From 2e7ffd64a4ffa916e7ee544cab18fb7b3ac06471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= Date: Wed, 16 Sep 2026 10:01:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20SDK=20=D0=B8=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .codex/README.md | 14 +- .gitignore | 63 +- AGENTS.md | 11 +- LICENSE | 8 +- Makefile | 18 +- app.mk | 17 +- applications/PoP/.gitignore | 29 - applications/PoP/.python-version | 1 - applications/PoP/CLAUDE.md | 91 - applications/PoP/LICENSE | 21 - applications/PoP/README.md | 42 - applications/PoP/bgtest/Makefile | 26 - applications/PoP/bgtest/bgtest.c | 112 - applications/PoP/coltest/Makefile | 5 - applications/PoP/coltest/coltest.c | 64 - .../PoP/docs/APPLEII_RESOURCE_FORMAT.md | 283 - applications/PoP/docs/KID_PLAN.md | 214 - .../PoP/docs/MSDOS_RESOURCE_FORMAT.md | 301 - .../PoP/docs/POP-DAT-FormatSpecifications.pdf | Bin 222037 -> 0 bytes .../PoP/docs/POP-DAT-FormatSpecifications.txt | 2345 -- applications/PoP/docs/PORT_PLAN.md | 555 - applications/PoP/docs/README.md | 143 - applications/PoP/docs/frame_pacing_plan.md | 603 - applications/PoP/docs/full_game_plan.md | 367 - applications/PoP/docs/gates_spikes_plan.md | 279 - applications/PoP/docs/host_tests_plan.md | 142 - applications/PoP/docs/ideas_backlog.md | 91 - applications/PoP/docs/impl_diff.md | 649 - applications/PoP/docs/keys.txt | 58 - applications/PoP/docs/l9_invert_plan.md | 428 - applications/PoP/docs/layout_plan_v2.md | 532 - applications/PoP/docs/levels_12_15_plan.md | 462 - applications/PoP/docs/levels_plan.md | 209 - applications/PoP/docs/menu_settings_plan.md | 529 - applications/PoP/docs/midtable_analysis.md | 275 - applications/PoP/docs/palette_plan.md | 297 - applications/PoP/docs/perf_backlog.md | 335 - applications/PoP/docs/perf_cyan_phase.md | 172 - applications/PoP/docs/perf_green_phase.md | 327 - applications/PoP/docs/perf_l11_room15.md | 238 - applications/PoP/docs/perf_l13_room23.md | 271 - applications/PoP/docs/perf_registry.md | 871 - applications/PoP/docs/prng_alternatives.md | 148 - applications/PoP/docs/quicksave_plan.md | 328 - applications/PoP/docs/resident_budget.md | 111 - applications/PoP/docs/room_model_plan.md | 86 - applications/PoP/docs/roomnav_skip.md | 65 - applications/PoP/docs/shadow_atlas_plan.md | 266 - applications/PoP/docs/shadow_render.md | 160 - applications/PoP/docs/sound_plan.md | 963 - applications/PoP/docs/status_line_text.md | 218 - applications/PoP/poc/Makefile | 52 - applications/PoP/poc/level.h | 153 - applications/PoP/poc/poc.c | 264 - applications/PoP/poc/res/bg/bg.arc | Bin 202240 -> 0 bytes applications/PoP/poc/res/bg/pal_env0.atl | Bin 13280 -> 0 bytes applications/PoP/poc/res/bg/pal_env1.atl | Bin 1398 -> 0 bytes applications/PoP/poc/res/bg/pal_env2.atl | Bin 11935 -> 0 bytes applications/PoP/poc/res/bg/pal_env3.atl | Bin 2643 -> 0 bytes applications/PoP/poc/res/bg/pal_env4.atl | Bin 6976 -> 0 bytes applications/PoP/poc/res/bg/pal_env5.atl | Bin 13634 -> 0 bytes applications/PoP/poc/res/bg/pal_env6.atl | Bin 11601 -> 0 bytes applications/PoP/poc/res/bg/pal_env7.atl | Bin 4286 -> 0 bytes applications/PoP/poc/res/bg/pal_env8.atl | Bin 7454 -> 0 bytes applications/PoP/poc/res/bg/pal_env9.atl | Bin 4490 -> 0 bytes applications/PoP/poc/res/bg/pal_fore.atl | Bin 11644 -> 0 bytes applications/PoP/poc/res/bg/pal_tile.pal | Bin 128 -> 0 bytes applications/PoP/poc/res/bg/pal_wall.atl | Bin 5267 -> 0 bytes applications/PoP/poc/res/bg/pop_bg.pal | Bin 1024 -> 0 bytes applications/PoP/poc/res/bg/pop_bg_atlas.h | 47 - applications/PoP/poc/res/bg/pop_env0.atl | Bin 13280 -> 0 bytes applications/PoP/poc/res/bg/pop_env1.atl | Bin 1398 -> 0 bytes applications/PoP/poc/res/bg/pop_env2.atl | Bin 11704 -> 0 bytes applications/PoP/poc/res/bg/pop_env3.atl | Bin 2653 -> 0 bytes applications/PoP/poc/res/bg/pop_env4.atl | Bin 6992 -> 0 bytes applications/PoP/poc/res/bg/pop_env5.atl | Bin 12800 -> 0 bytes applications/PoP/poc/res/bg/pop_env6.atl | Bin 8005 -> 0 bytes applications/PoP/poc/res/bg/pop_env7.atl | Bin 5040 -> 0 bytes applications/PoP/poc/res/bg/pop_env8.atl | Bin 7444 -> 0 bytes applications/PoP/poc/res/bg/pop_env9.atl | Bin 4175 -> 0 bytes applications/PoP/poc/res/bg/pop_fore.atl | Bin 11695 -> 0 bytes applications/PoP/poc/res/bg/pop_pot.atl | Bin 5374 -> 0 bytes applications/PoP/poc/res/bg/pop_tile.pal | Bin 128 -> 0 bytes applications/PoP/poc/res/bg/pop_wall.atl | Bin 11543 -> 0 bytes applications/PoP/poc/res/font/font.atl | Bin 10841 -> 0 bytes applications/PoP/poc/res/guard/g0.atl | Bin 9711 -> 0 bytes applications/PoP/poc/res/guard/g0_v.atl | Bin 9711 -> 0 bytes applications/PoP/poc/res/guard/g1.atl | Bin 10732 -> 0 bytes applications/PoP/poc/res/guard/g1_v.atl | Bin 10732 -> 0 bytes applications/PoP/poc/res/guard/g2.atl | Bin 10079 -> 0 bytes applications/PoP/poc/res/guard/g2_v.atl | Bin 10079 -> 0 bytes applications/PoP/poc/res/guard/g3.atl | Bin 5232 -> 0 bytes applications/PoP/poc/res/guard/g3_v.atl | Bin 5232 -> 0 bytes applications/PoP/poc/res/guard/g4.atl | Bin 1131 -> 0 bytes applications/PoP/poc/res/guard/g4_v.atl | Bin 1131 -> 0 bytes applications/PoP/poc/res/guard/guard.arc | Bin 76288 -> 0 bytes applications/PoP/poc/res/kid/kid.ani | Bin 4150 -> 0 bytes applications/PoP/poc/res/kid/kid.arc | Bin 398848 -> 0 bytes applications/PoP/poc/res/kid/kid.pal | Bin 1024 -> 0 bytes applications/PoP/poc/res/kid/kid0.atl | Bin 7263 -> 0 bytes applications/PoP/poc/res/kid/kid0_v.atl | Bin 7263 -> 0 bytes applications/PoP/poc/res/kid/kid1.atl | Bin 7891 -> 0 bytes applications/PoP/poc/res/kid/kid10.atl | Bin 5263 -> 0 bytes applications/PoP/poc/res/kid/kid10_v.atl | Bin 5263 -> 0 bytes applications/PoP/poc/res/kid/kid11.atl | Bin 5915 -> 0 bytes applications/PoP/poc/res/kid/kid11_v.atl | Bin 5915 -> 0 bytes applications/PoP/poc/res/kid/kid12.atl | Bin 6199 -> 0 bytes applications/PoP/poc/res/kid/kid12_v.atl | Bin 6199 -> 0 bytes applications/PoP/poc/res/kid/kid13.atl | Bin 9521 -> 0 bytes applications/PoP/poc/res/kid/kid13_v.atl | Bin 9521 -> 0 bytes applications/PoP/poc/res/kid/kid14.atl | Bin 5823 -> 0 bytes applications/PoP/poc/res/kid/kid14_v.atl | Bin 5823 -> 0 bytes applications/PoP/poc/res/kid/kid15.atl | Bin 5387 -> 0 bytes applications/PoP/poc/res/kid/kid15_v.atl | Bin 5387 -> 0 bytes applications/PoP/poc/res/kid/kid16.atl | Bin 3000 -> 0 bytes applications/PoP/poc/res/kid/kid16_v.atl | Bin 3000 -> 0 bytes applications/PoP/poc/res/kid/kid17.atl | Bin 7389 -> 0 bytes applications/PoP/poc/res/kid/kid17_v.atl | Bin 7389 -> 0 bytes applications/PoP/poc/res/kid/kid18.atl | Bin 5529 -> 0 bytes applications/PoP/poc/res/kid/kid18_v.atl | Bin 5529 -> 0 bytes applications/PoP/poc/res/kid/kid19.atl | Bin 5872 -> 0 bytes applications/PoP/poc/res/kid/kid19_v.atl | Bin 5872 -> 0 bytes applications/PoP/poc/res/kid/kid1_v.atl | Bin 7891 -> 0 bytes applications/PoP/poc/res/kid/kid2.atl | Bin 8145 -> 0 bytes applications/PoP/poc/res/kid/kid20.atl | Bin 6326 -> 0 bytes applications/PoP/poc/res/kid/kid20_v.atl | Bin 6326 -> 0 bytes applications/PoP/poc/res/kid/kid21.atl | Bin 7409 -> 0 bytes applications/PoP/poc/res/kid/kid21_v.atl | Bin 7409 -> 0 bytes applications/PoP/poc/res/kid/kid22.atl | Bin 10223 -> 0 bytes applications/PoP/poc/res/kid/kid22_v.atl | Bin 10223 -> 0 bytes applications/PoP/poc/res/kid/kid23.atl | Bin 9764 -> 0 bytes applications/PoP/poc/res/kid/kid23_v.atl | Bin 9764 -> 0 bytes applications/PoP/poc/res/kid/kid24.atl | Bin 5932 -> 0 bytes applications/PoP/poc/res/kid/kid24_v.atl | Bin 5932 -> 0 bytes applications/PoP/poc/res/kid/kid25.atl | Bin 6246 -> 0 bytes applications/PoP/poc/res/kid/kid25_v.atl | Bin 6246 -> 0 bytes applications/PoP/poc/res/kid/kid26.atl | Bin 5390 -> 0 bytes applications/PoP/poc/res/kid/kid26_v.atl | Bin 5390 -> 0 bytes applications/PoP/poc/res/kid/kid27.atl | Bin 932 -> 0 bytes applications/PoP/poc/res/kid/kid27_v.atl | Bin 932 -> 0 bytes applications/PoP/poc/res/kid/kid2_v.atl | Bin 8145 -> 0 bytes applications/PoP/poc/res/kid/kid3.atl | Bin 7043 -> 0 bytes applications/PoP/poc/res/kid/kid3_v.atl | Bin 7043 -> 0 bytes applications/PoP/poc/res/kid/kid4.atl | Bin 9758 -> 0 bytes applications/PoP/poc/res/kid/kid4_v.atl | Bin 9758 -> 0 bytes applications/PoP/poc/res/kid/kid5.atl | Bin 7809 -> 0 bytes applications/PoP/poc/res/kid/kid5_v.atl | Bin 7809 -> 0 bytes applications/PoP/poc/res/kid/kid6.atl | Bin 5426 -> 0 bytes applications/PoP/poc/res/kid/kid6_v.atl | Bin 5426 -> 0 bytes applications/PoP/poc/res/kid/kid7.atl | Bin 4085 -> 0 bytes applications/PoP/poc/res/kid/kid7_v.atl | Bin 4085 -> 0 bytes applications/PoP/poc/res/kid/kid8.atl | Bin 9085 -> 0 bytes applications/PoP/poc/res/kid/kid8_v.atl | Bin 9085 -> 0 bytes applications/PoP/poc/res/kid/kid9.atl | Bin 7885 -> 0 bytes applications/PoP/poc/res/kid/kid9_v.atl | Bin 7885 -> 0 bytes applications/PoP/poc/res/kid/kid_atlas.h | 41 - applications/PoP/poc/res/kid/sword.atl | Bin 5168 -> 0 bytes applications/PoP/poc/res/kid/sword_v.atl | Bin 5168 -> 0 bytes applications/PoP/poc/res/music/m24.bin | 1 - applications/PoP/poc/res/music/m25.bin | 1 - applications/PoP/poc/res/music/m26.bin | 3 - applications/PoP/poc/res/music/m27.bin | 1 - applications/PoP/poc/res/music/m28.bin | 1 - applications/PoP/poc/res/music/m29.bin | 5 - applications/PoP/poc/res/music/m30.bin | 1 - applications/PoP/poc/res/music/m32.bin | 1 - applications/PoP/poc/res/music/m33.bin | 1 - applications/PoP/poc/res/music/m35.bin | 1 - applications/PoP/poc/res/music/m36.bin | 1 - applications/PoP/poc/res/music/m37.bin | 1 - applications/PoP/poc/res/music/m39.bin | 1 - applications/PoP/poc/res/music/m40.bin | 1 - applications/PoP/poc/res/music/m41.bin | 2 - applications/PoP/poc/res/music/m43.bin | 1 - applications/PoP/poc/res/music/m50.bin | 1 - applications/PoP/poc/res/music/m52.bin | 1 - applications/PoP/poc/res/music/m53.bin | 14 - applications/PoP/poc/res/music/m54.bin | 1 - applications/PoP/poc/res/music/m55.bin | 3 - applications/PoP/poc/res/music/m56.bin | 1 - applications/PoP/poc/res/pv/a0.atl | Bin 15848 -> 0 bytes applications/PoP/poc/res/pv/a1.atl | Bin 16013 -> 0 bytes applications/PoP/poc/res/pv/a2.atl | Bin 11142 -> 0 bytes applications/PoP/poc/res/pv/b0_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/b0_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/b0_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/b0_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/b0_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/h0.atl | Bin 4776 -> 0 bytes applications/PoP/poc/res/pv/j0.atl | Bin 14453 -> 0 bytes applications/PoP/poc/res/pv/j1.atl | Bin 14718 -> 0 bytes applications/PoP/poc/res/pv/j2.atl | Bin 14081 -> 0 bytes applications/PoP/poc/res/pv/p0_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p0_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p0_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p0_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p0_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p1_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p1_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p1_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p1_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p1_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p2_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p2_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p2_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p2_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p2_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p3_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p3_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p3_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p3_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p3_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p4_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p4_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p4_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p4_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p4_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p5_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p5_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p5_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p5_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p5_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p6_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p6_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p6_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p6_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p6_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/p7_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p7_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p7_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p7_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/p7_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/pv.arc | Bin 1071616 -> 0 bytes applications/PoP/poc/res/pv/pv.pal | Bin 1024 -> 0 bytes applications/PoP/poc/res/pv/s0_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s0_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s0_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s0_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s0_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/s1_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s1_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s1_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s1_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s1_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/s2_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s2_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s2_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s2_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s2_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/s3_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s3_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s3_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s3_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s3_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/s4_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s4_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s4_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s4_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s4_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/s5_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s5_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s5_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s5_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/pv/s5_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/pv/story.pal | Bin 1024 -> 0 bytes applications/PoP/poc/res/pv/t0.atl | Bin 2804 -> 0 bytes applications/PoP/poc/res/room1.dat | Bin 63 -> 0 bytes applications/PoP/poc/res/shadow/sf0.atl | Bin 9467 -> 0 bytes applications/PoP/poc/res/shadow/sf1.atl | Bin 10462 -> 0 bytes applications/PoP/poc/res/shadow/sf2.atl | Bin 8837 -> 0 bytes applications/PoP/poc/res/shadow/sf3.atl | Bin 1969 -> 0 bytes applications/PoP/poc/res/shadow/shadow.arc | Bin 233472 -> 0 bytes applications/PoP/poc/res/shadow/sk0.atl | Bin 7586 -> 0 bytes applications/PoP/poc/res/shadow/sk1.atl | Bin 8209 -> 0 bytes applications/PoP/poc/res/shadow/sk10.atl | Bin 5580 -> 0 bytes applications/PoP/poc/res/shadow/sk11.atl | Bin 6277 -> 0 bytes applications/PoP/poc/res/shadow/sk12.atl | Bin 6587 -> 0 bytes applications/PoP/poc/res/shadow/sk13.atl | Bin 9936 -> 0 bytes applications/PoP/poc/res/shadow/sk14.atl | Bin 6074 -> 0 bytes applications/PoP/poc/res/shadow/sk15.atl | Bin 5606 -> 0 bytes applications/PoP/poc/res/shadow/sk16.atl | Bin 3213 -> 0 bytes applications/PoP/poc/res/shadow/sk17.atl | Bin 7696 -> 0 bytes applications/PoP/poc/res/shadow/sk18.atl | Bin 5856 -> 0 bytes applications/PoP/poc/res/shadow/sk19.atl | Bin 6077 -> 0 bytes applications/PoP/poc/res/shadow/sk2.atl | Bin 8421 -> 0 bytes applications/PoP/poc/res/shadow/sk20.atl | Bin 6636 -> 0 bytes applications/PoP/poc/res/shadow/sk21.atl | Bin 7708 -> 0 bytes applications/PoP/poc/res/shadow/sk22.atl | Bin 10504 -> 0 bytes applications/PoP/poc/res/shadow/sk23.atl | Bin 10055 -> 0 bytes applications/PoP/poc/res/shadow/sk24.atl | Bin 6198 -> 0 bytes applications/PoP/poc/res/shadow/sk25.atl | Bin 6587 -> 0 bytes applications/PoP/poc/res/shadow/sk26.atl | Bin 5649 -> 0 bytes applications/PoP/poc/res/shadow/sk27.atl | Bin 968 -> 0 bytes applications/PoP/poc/res/shadow/sk3.atl | Bin 7287 -> 0 bytes applications/PoP/poc/res/shadow/sk4.atl | Bin 10075 -> 0 bytes applications/PoP/poc/res/shadow/sk5.atl | Bin 8092 -> 0 bytes applications/PoP/poc/res/shadow/sk6.atl | Bin 5732 -> 0 bytes applications/PoP/poc/res/shadow/sk7.atl | Bin 4330 -> 0 bytes applications/PoP/poc/res/shadow/sk8.atl | Bin 9386 -> 0 bytes applications/PoP/poc/res/shadow/sk9.atl | Bin 8118 -> 0 bytes applications/PoP/poc/res/skel/g0.atl | Bin 8267 -> 0 bytes applications/PoP/poc/res/skel/g1.atl | Bin 9893 -> 0 bytes applications/PoP/poc/res/skel/g2.atl | Bin 9347 -> 0 bytes applications/PoP/poc/res/skel/g3.atl | Bin 2633 -> 0 bytes applications/PoP/poc/res/skel/skel.arc | Bin 32256 -> 0 bytes applications/PoP/poc/res/sound/s0.bin | 1 - applications/PoP/poc/res/sound/s1.bin | 1 - applications/PoP/poc/res/sound/s2.bin | Bin 16384 -> 0 bytes applications/PoP/poc/res/sound/s3.bin | Bin 16384 -> 0 bytes applications/PoP/poc/res/sound/s4.bin | 5 - applications/PoP/poc/res/sound/s5.bin | 1 - applications/PoP/poc/res/sound/s6.bin | 1 - applications/PoP/poc/res/sound/s7.bin | 1 - applications/PoP/poc/res/sound/s8.bin | 1 - applications/PoP/poc/res/sound/s9.bin | 1 - applications/PoP/poc/res/sound/snd.arc | Bin 164352 -> 0 bytes applications/PoP/poc/res/tiles/0-0.png | Bin 87 -> 0 bytes applications/PoP/poc/res/tiles/1-0.png | Bin 155 -> 0 bytes applications/PoP/poc/res/tiles/10-0.png | Bin 631 -> 0 bytes applications/PoP/poc/res/tiles/11-0.png | Bin 624 -> 0 bytes applications/PoP/poc/res/tiles/12-0.png | Bin 825 -> 0 bytes applications/PoP/poc/res/tiles/13-0.png | Bin 130 -> 0 bytes applications/PoP/poc/res/tiles/14-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/15-0.png | Bin 832 -> 0 bytes applications/PoP/poc/res/tiles/16-0.png | Bin 911 -> 0 bytes applications/PoP/poc/res/tiles/17-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/18-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/19-0.png | Bin 208 -> 0 bytes applications/PoP/poc/res/tiles/1A-0.png | Bin 206 -> 0 bytes applications/PoP/poc/res/tiles/1B-0.png | Bin 208 -> 0 bytes applications/PoP/poc/res/tiles/1C-0.png | Bin 199 -> 0 bytes applications/PoP/poc/res/tiles/1D-0.png | Bin 190 -> 0 bytes applications/PoP/poc/res/tiles/1E-0.png | Bin 698 -> 0 bytes applications/PoP/poc/res/tiles/1F-0.png | Bin 478 -> 0 bytes applications/PoP/poc/res/tiles/2-0.png | Bin 889 -> 0 bytes applications/PoP/poc/res/tiles/3-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/4-0.png | Bin 764 -> 0 bytes applications/PoP/poc/res/tiles/5-0.png | Bin 821 -> 0 bytes applications/PoP/poc/res/tiles/6-0.png | Bin 831 -> 0 bytes applications/PoP/poc/res/tiles/7-0.png | Bin 825 -> 0 bytes applications/PoP/poc/res/tiles/8-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/9-0.png | Bin 236 -> 0 bytes applications/PoP/poc/res/tiles/A-0.png | Bin 715 -> 0 bytes applications/PoP/poc/res/tiles/B-0.png | Bin 130 -> 0 bytes applications/PoP/poc/res/tiles/C-0.png | Bin 867 -> 0 bytes applications/PoP/poc/res/tiles/D-0.png | Bin 650 -> 0 bytes applications/PoP/poc/res/tiles/E-0.png | Bin 131 -> 0 bytes applications/PoP/poc/res/tiles/F-0.png | Bin 759 -> 0 bytes applications/PoP/poc/res/tiles/tile00.pal | Bin 64 -> 0 bytes applications/PoP/poc/res/tiles/tile01.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile01.pal | Bin 76 -> 0 bytes applications/PoP/poc/res/tiles/tile01.raw | 1 - .../PoP/poc/res/tiles/tile01_merged.pal | Bin 92 -> 0 bytes applications/PoP/poc/res/tiles/tile02.pal | Bin 460 -> 0 bytes applications/PoP/poc/res/tiles/tile03.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile03.raw | 1 - .../PoP/poc/res/tiles/tile03_merged.pal | Bin 100 -> 0 bytes applications/PoP/poc/res/tiles/tile04.pal | Bin 424 -> 0 bytes applications/PoP/poc/res/tiles/tile05.pal | Bin 444 -> 0 bytes applications/PoP/poc/res/tiles/tile06.pal | Bin 412 -> 0 bytes applications/PoP/poc/res/tiles/tile07.pal | Bin 460 -> 0 bytes applications/PoP/poc/res/tiles/tile08.pal | Bin 72 -> 0 bytes applications/PoP/poc/res/tiles/tile09.pal | Bin 72 -> 0 bytes applications/PoP/poc/res/tiles/tile0a.pal | Bin 364 -> 0 bytes applications/PoP/poc/res/tiles/tile0b.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile0b.raw | 1 - .../PoP/poc/res/tiles/tile0b_merged.pal | Bin 112 -> 0 bytes applications/PoP/poc/res/tiles/tile0c.pal | Bin 472 -> 0 bytes applications/PoP/poc/res/tiles/tile0d.pal | Bin 320 -> 0 bytes applications/PoP/poc/res/tiles/tile0e.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile0e.raw | 1 - .../PoP/poc/res/tiles/tile0e_merged.pal | Bin 108 -> 0 bytes applications/PoP/poc/res/tiles/tile0f.pal | Bin 432 -> 0 bytes applications/PoP/poc/res/tiles/tile10.pal | Bin 300 -> 0 bytes applications/PoP/poc/res/tiles/tile11.pal | Bin 292 -> 0 bytes applications/PoP/poc/res/tiles/tile12.pal | Bin 416 -> 0 bytes applications/PoP/poc/res/tiles/tile13.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile13.raw | 1 - .../PoP/poc/res/tiles/tile13_merged.pal | Bin 104 -> 0 bytes applications/PoP/poc/res/tiles/tile14.atl | Bin 2308 -> 0 bytes applications/PoP/poc/res/tiles/tile14.pal | Bin 72 -> 0 bytes applications/PoP/poc/res/tiles/tile14.raw | 1 - .../PoP/poc/res/tiles/tile14_merged.pal | Bin 100 -> 0 bytes applications/PoP/poc/res/tiles/tile15.pal | Bin 448 -> 0 bytes applications/PoP/poc/res/tiles/tile16.pal | Bin 532 -> 0 bytes applications/PoP/poc/res/tiles/tile17.pal | Bin 72 -> 0 bytes applications/PoP/poc/res/tiles/tile18.pal | Bin 72 -> 0 bytes applications/PoP/poc/res/tiles/tile19.pal | Bin 384 -> 0 bytes applications/PoP/poc/res/tiles/tile1a.pal | Bin 376 -> 0 bytes applications/PoP/poc/res/tiles/tile1b.pal | Bin 352 -> 0 bytes applications/PoP/poc/res/tiles/tile1c.pal | Bin 376 -> 0 bytes applications/PoP/poc/res/tiles/tile1d.pal | Bin 372 -> 0 bytes applications/PoP/poc/res/tiles/tile1e.pal | Bin 300 -> 0 bytes applications/PoP/poc/res/tiles/tile1f.pal | Bin 192 -> 0 bytes applications/PoP/poc/res/title/t0_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t0_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t0_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t0_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t0_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/title/t1_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t1_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t1_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t1_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t1_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/title/t2_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t2_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t2_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t2_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t2_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/title/t3_0.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t3_1.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t3_2.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t3_3.atl | Bin 15796 -> 0 bytes applications/PoP/poc/res/title/t3_4.atl | Bin 1396 -> 0 bytes applications/PoP/poc/res/title/title.arc | Bin 260608 -> 0 bytes applications/PoP/poc/res/title/title.pal | Bin 68 -> 0 bytes applications/PoP/poc/res/vizier/g0.atl | Bin 9711 -> 0 bytes applications/PoP/poc/res/vizier/g1.atl | Bin 10732 -> 0 bytes applications/PoP/poc/res/vizier/g2.atl | Bin 9865 -> 0 bytes applications/PoP/poc/res/vizier/g3.atl | Bin 3283 -> 0 bytes applications/PoP/poc/res/vizier/g4.atl | Bin 1194 -> 0 bytes applications/PoP/poc/res/vizier/vizier.arc | Bin 36352 -> 0 bytes applications/PoP/poc/room.c | 158 - applications/PoP/poc/room.h | 68 - .../PoP/poc/tools/build_room_palette.py | 76 - .../PoP/poc/tools/build_tile_atlases.py | 71 - applications/PoP/poc/tools/extract_room.py | 61 - .../PoP/poc/tools/gen_kid_placeholder.py | 67 - .../PoP/poc/tools/gen_tile_placeholders.py | 153 - applications/PoP/poc/tools/kid.atl | Bin 3332 -> 0 bytes applications/PoP/poc/tools/kid.pal | Bin 80 -> 0 bytes applications/PoP/poc/tools/kid.raw | 1 - applications/PoP/poc/tools/room.pal | Bin 112 -> 0 bytes applications/PoP/roomtest/BUGS_CLOSED.md | 3744 --- applications/PoP/roomtest/BUGS_OPEN.md | 1149 - applications/PoP/roomtest/CLAUDE.md | 104 - applications/PoP/roomtest/Makefile | 472 - applications/PoP/roomtest/README.md | 74 - applications/PoP/roomtest/TASKS_CLOSED.md | 1377 - applications/PoP/roomtest/TASKS_OPEN.md | 1511 - applications/PoP/roomtest/_pop_bg.h | 63 - applications/PoP/roomtest/_pop_config.h | 40 - applications/PoP/roomtest/_pop_draw.h | 47 - applications/PoP/roomtest/_pop_kdraw.h | 34 - applications/PoP/roomtest/_pop_kid.h | 26 - applications/PoP/roomtest/_pop_level.h | 79 - applications/PoP/roomtest/_pop_sfx.h | 22 - applications/PoP/roomtest/_pop_tile.h | 18 - applications/PoP/roomtest/bg_arc.h | 34 - applications/PoP/roomtest/guard_arc.h | 19 - applications/PoP/roomtest/guards.c | 1164 - applications/PoP/roomtest/kid_arc.h | 67 - applications/PoP/roomtest/kid_data.h | 77 - applications/PoP/roomtest/pop_app.c | 135 - applications/PoP/roomtest/pop_app.h | 63 - applications/PoP/roomtest/pop_arc.c | 112 - applications/PoP/roomtest/pop_arc.h | 90 - applications/PoP/roomtest/pop_bg.c | 1176 - applications/PoP/roomtest/pop_bg.h | 231 - applications/PoP/roomtest/pop_cdraw.c | 1058 - applications/PoP/roomtest/pop_cdraw.h | 188 - applications/PoP/roomtest/pop_cfg.h | 19 - applications/PoP/roomtest/pop_char.h | 32 - applications/PoP/roomtest/pop_cheat.h | 49 - applications/PoP/roomtest/pop_config.c | 200 - applications/PoP/roomtest/pop_ctrl.c | 863 - applications/PoP/roomtest/pop_ctrl.h | 77 - applications/PoP/roomtest/pop_cutscene.c | 55 - applications/PoP/roomtest/pop_cutscene.h | 56 - applications/PoP/roomtest/pop_demo.c | 73 - applications/PoP/roomtest/pop_demo.h | 17 - applications/PoP/roomtest/pop_draw.c | 32 - applications/PoP/roomtest/pop_flow.c | 48 - applications/PoP/roomtest/pop_flow.h | 40 - applications/PoP/roomtest/pop_font.h | 29 - applications/PoP/roomtest/pop_geom.c | 262 - applications/PoP/roomtest/pop_geom.h | 61 - applications/PoP/roomtest/pop_guard.c | 239 - applications/PoP/roomtest/pop_guard.h | 393 - applications/PoP/roomtest/pop_guard_cold.c | 183 - applications/PoP/roomtest/pop_guard_pal.h | 36 - applications/PoP/roomtest/pop_hof.c | 530 - applications/PoP/roomtest/pop_hof.h | 21 - applications/PoP/roomtest/pop_intro.c | 1817 -- applications/PoP/roomtest/pop_intro.h | 29 - applications/PoP/roomtest/pop_kboot.c | 123 - applications/PoP/roomtest/pop_kdraw.c | 147 - applications/PoP/roomtest/pop_kid.c | 470 - applications/PoP/roomtest/pop_kid.h | 133 - applications/PoP/roomtest/pop_level.c | 136 - applications/PoP/roomtest/pop_level.h | 160 - applications/PoP/roomtest/pop_level_cold.c | 326 - applications/PoP/roomtest/pop_level_qsave.c | 38 - applications/PoP/roomtest/pop_map.c | 3477 --- applications/PoP/roomtest/pop_map.h | 285 - applications/PoP/roomtest/pop_menu.c | 767 - applications/PoP/roomtest/pop_menu.h | 45 - applications/PoP/roomtest/pop_music.c | 362 - applications/PoP/roomtest/pop_music.h | 105 - applications/PoP/roomtest/pop_music_tbl.h | 84 - applications/PoP/roomtest/pop_pace.c | 100 - applications/PoP/roomtest/pop_pace.h | 102 - applications/PoP/roomtest/pop_pal.c | 123 - applications/PoP/roomtest/pop_pal.h | 46 - applications/PoP/roomtest/pop_qsave.c | 253 - applications/PoP/roomtest/pop_qsave.h | 48 - applications/PoP/roomtest/pop_qsave_coldio.c | 38 - applications/PoP/roomtest/pop_qsave_io.c | 34 - applications/PoP/roomtest/pop_redraw.c | 156 - applications/PoP/roomtest/pop_redraw.h | 68 - applications/PoP/roomtest/pop_room.c | 2009 -- applications/PoP/roomtest/pop_settings.h | 40 - applications/PoP/roomtest/pop_sfx.c | 310 - applications/PoP/roomtest/pop_sfx.h | 97 - applications/PoP/roomtest/pop_sfx_cold.c | 114 - applications/PoP/roomtest/pop_shadow.c | 105 - applications/PoP/roomtest/pop_shadow.h | 55 - applications/PoP/roomtest/pop_shadow_atlas.h | 71 - applications/PoP/roomtest/pop_sound_tbl.h | 113 - applications/PoP/roomtest/pop_state.c | 197 - applications/PoP/roomtest/pop_state.h | 133 - applications/PoP/roomtest/pop_status.c | 585 - applications/PoP/roomtest/pop_status.h | 87 - applications/PoP/roomtest/pop_tile.c | 624 - applications/PoP/roomtest/pop_tile.h | 188 - applications/PoP/roomtest/pop_tile_cold.c | 240 - applications/PoP/roomtest/pop_timer.c | 78 - applications/PoP/roomtest/pop_timer.h | 50 - applications/PoP/roomtest/pop_title.c | 193 - applications/PoP/roomtest/pop_title.h | 27 - applications/PoP/roomtest/pop_trob.c | 929 - applications/PoP/roomtest/pop_trob.h | 74 - applications/PoP/roomtest/pop_tune.h | 149 - applications/PoP/roomtest/pop_ui.c | 434 - applications/PoP/roomtest/pop_ui.h | 113 - applications/PoP/roomtest/pop_vflip.c | 67 - applications/PoP/roomtest/pop_vflip.h | 52 - applications/PoP/roomtest/pv_arc.h | 92 - applications/PoP/roomtest/roomtest.c | 967 - applications/PoP/roomtest/roomtest_cold.c | 1269 - applications/PoP/roomtest/roomtest_cold.h | 121 - applications/PoP/roomtest/shadow_arc.h | 41 - applications/PoP/roomtest/skel_arc.h | 13 - .../PoP/roomtest/tests-host/.gitignore | 1 - applications/PoP/roomtest/tests-host/Makefile | 122 - .../PoP/roomtest/tests-host/README.md | 121 - .../PoP/roomtest/tests-host/bank_stub.s | 25 - .../PoP/roomtest/tests-host/gen_kid_blob.py | 46 - .../PoP/roomtest/tests-host/golden/crouch.h | 22 - .../roomtest/tests-host/golden/fall_ledge.h | 36 - .../PoP/roomtest/tests-host/golden/jump_up.h | 22 - .../PoP/roomtest/tests-host/golden/loose.h | 36 - .../roomtest/tests-host/golden/rjump_gap3.h | 36 - .../roomtest/tests-host/golden/run_right.h | 26 - .../PoP/roomtest/tests-host/golden/stand.h | 14 - .../roomtest/tests-host/golden/step_shift.h | 22 - .../PoP/roomtest/tests-host/golden/turn.h | 18 - .../PoP/roomtest/tests-host/kidblob.h | 18 - .../PoP/roomtest/tests-host/record_golden.py | 72 - applications/PoP/roomtest/tests-host/scene.c | 213 - applications/PoP/roomtest/tests-host/scene.h | 102 - applications/PoP/roomtest/tests-host/stubs.c | 413 - applications/PoP/roomtest/tests-host/stubs.h | 61 - applications/PoP/roomtest/tests-host/t_app.c | 135 - applications/PoP/roomtest/tests-host/t_cfg.c | 197 - applications/PoP/roomtest/tests-host/t_char.c | 525 - .../PoP/roomtest/tests-host/t_cutscene.c | 46 - applications/PoP/roomtest/tests-host/t_demo.c | 89 - applications/PoP/roomtest/tests-host/t_flow.c | 52 - applications/PoP/roomtest/tests-host/t_gate.c | 202 - applications/PoP/roomtest/tests-host/t_geom.c | 184 - applications/PoP/roomtest/tests-host/t_grab.c | 283 - .../PoP/roomtest/tests-host/t_jaffar.c | 349 - .../PoP/roomtest/tests-host/t_mouse.c | 178 - applications/PoP/roomtest/tests-host/t_phys.c | 380 - .../PoP/roomtest/tests-host/t_shadow.c | 332 - .../PoP/roomtest/tests-host/t_timer.c | 116 - applications/PoP/roomtest/tests-host/t_wall.c | 95 - applications/PoP/roomtest/title_arc.h | 29 - applications/PoP/roomtest/vizier_arc.h | 14 - applications/PoP/sdk.mk | 11 - .../third_party/16x16-RPG-characters/LICENSE | 359 - .../16x16-RPG-characters/README.md | 27 - .../sprites/old-style/02-bard.png | Bin 7830 -> 0 bytes applications/PoP/toolchain/1.1 | Bin 36981 -> 0 bytes applications/PoP/toolchain/1.1-2.png | Bin 11117 -> 0 bytes .../PoP/toolchain/pop_extract_font.py | 208 - .../PoP/toolchain/pop_extract_kid_data.py | 170 - applications/PoP/toolchain/pop_pack_arc.py | 123 - applications/PoP/toolchain/pop_pack_bg.py | 628 - applications/PoP/toolchain/pop_pack_guard.py | 212 - applications/PoP/toolchain/pop_pack_intro.py | 349 - applications/PoP/toolchain/pop_pack_kid.py | 219 - applications/PoP/toolchain/pop_pack_music.py | 155 - applications/PoP/toolchain/pop_pack_shadow.py | 292 - applications/PoP/toolchain/pop_pack_sound.py | 208 - applications/PoP/toolchain/pop_pack_title.py | 137 - applications/PoP/toolchain/render_room.py | 850 - applications/PoP/toolchain/room12_debug.png | Bin 8160 -> 0 bytes applications/PoP/toolchain/room12_render.png | Bin 5514 -> 0 bytes applications/PoP/toolchain/room1_debug.png | Bin 9291 -> 0 bytes applications/PoP/toolchain/room1_render.png | Bin 6281 -> 0 bytes applications/PoP/toolchain/room6_debug.png | Bin 5708 -> 0 bytes applications/PoP/toolchain/room6_render.png | Bin 3869 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c0_00.png | Bin 543 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c1_00.png | Bin 89 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c2_00.png | Bin 130 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c3_01.png | Bin 216 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c4_01.png | Bin 239 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c5_01.png | Bin 301 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c6_01.png | Bin 239 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c7_01.png | Bin 475 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c8_14.png | Bin 595 -> 0 bytes .../PoP/toolchain/tiles_room1/r0c9_14.png | Bin 595 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c0_13.png | Bin 698 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c1_13.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c2_01.png | Bin 262 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c3_03.png | Bin 800 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c4_00.png | Bin 628 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c5_14.png | Bin 622 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c6_14.png | Bin 595 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c7_14.png | Bin 651 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c8_14.png | Bin 597 -> 0 bytes .../PoP/toolchain/tiles_room1/r1c9_14.png | Bin 563 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c0_14.png | Bin 588 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c1_14.png | Bin 607 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c2_14.png | Bin 646 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c3_14.png | Bin 712 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c4_0E.png | Bin 844 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c5_03.png | Bin 767 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c6_0B.png | Bin 458 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c7_01.png | Bin 313 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c8_01.png | Bin 521 -> 0 bytes .../PoP/toolchain/tiles_room1/r2c9_14.png | Bin 541 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c0_0B.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c1_0B.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c2_0B.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c3_03.png | Bin 718 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c4_03.png | Bin 788 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c5_00.png | Bin 526 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c6_00.png | Bin 509 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c7_00.png | Bin 489 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c8_00.png | Bin 307 -> 0 bytes .../PoP/toolchain/tiles_room12/r0c9_14.png | Bin 498 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c0_00.png | Bin 150 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c1_00.png | Bin 225 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c2_00.png | Bin 390 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c3_14.png | Bin 674 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c4_03.png | Bin 879 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c5_00.png | Bin 427 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c6_00.png | Bin 113 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c7_00.png | Bin 219 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c8_01.png | Bin 252 -> 0 bytes .../PoP/toolchain/tiles_room12/r1c9_03.png | Bin 717 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c0_00.png | Bin 89 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c1_00.png | Bin 89 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c2_00.png | Bin 312 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c3_14.png | Bin 552 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c4_14.png | Bin 700 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c5_00.png | Bin 640 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c6_00.png | Bin 113 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c7_00.png | Bin 422 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c8_14.png | Bin 578 -> 0 bytes .../PoP/toolchain/tiles_room12/r2c9_14.png | Bin 562 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c0_00.png | Bin 163 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c1_00.png | Bin 195 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c2_00.png | Bin 509 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c3_00.png | Bin 489 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c4_00.png | Bin 89 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c5_00.png | Bin 89 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c6_00.png | Bin 195 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c7_00.png | Bin 509 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c8_00.png | Bin 489 -> 0 bytes .../PoP/toolchain/tiles_room6/r0c9_0C.png | Bin 222 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c0_01.png | Bin 548 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c1_01.png | Bin 296 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c2_01.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c3_13.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c4_01.png | Bin 223 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c5_13.png | Bin 296 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c6_01.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c7_0B.png | Bin 208 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c8_01.png | Bin 223 -> 0 bytes .../PoP/toolchain/tiles_room6/r1c9_04.png | Bin 390 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c0_14.png | Bin 596 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c1_14.png | Bin 643 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c2_14.png | Bin 591 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c3_14.png | Bin 639 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c4_14.png | Bin 589 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c5_14.png | Bin 660 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c6_14.png | Bin 748 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c7_00.png | Bin 793 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c8_14.png | Bin 625 -> 0 bytes .../PoP/toolchain/tiles_room6/r2c9_14.png | Bin 585 -> 0 bytes applications/SprPoP/.gitignore | 79 - applications/SprPoP/CHANGELOG.md | 56 - applications/SprPoP/CLAUDE.md | 241 - applications/SprPoP/LICENSE | 21 - applications/SprPoP/Makefile | 624 - applications/SprPoP/README.md | 82 - applications/SprPoP/assets/orig/README.md | 82 - applications/SprPoP/assets/packed/BG/bg.arc | Bin 202240 -> 0 bytes .../SprPoP/assets/packed/BG/pal_tile.pal | Bin 128 -> 0 bytes .../SprPoP/assets/packed/BG/pop_tile.pal | Bin 128 -> 0 bytes .../SprPoP/assets/packed/FONT/font.atl | Bin 10841 -> 0 bytes .../SprPoP/assets/packed/GUARD/guard.arc | Bin 76288 -> 0 bytes applications/SprPoP/assets/packed/KID/kid.ani | Bin 4150 -> 0 bytes applications/SprPoP/assets/packed/KID/kid.arc | Bin 398848 -> 0 bytes applications/SprPoP/assets/packed/KID/kid.pal | Bin 1024 -> 0 bytes applications/SprPoP/assets/packed/MUS/m24.bin | 1 - applications/SprPoP/assets/packed/MUS/m25.bin | 1 - applications/SprPoP/assets/packed/MUS/m26.bin | 3 - applications/SprPoP/assets/packed/MUS/m27.bin | 1 - applications/SprPoP/assets/packed/MUS/m28.bin | 1 - applications/SprPoP/assets/packed/MUS/m29.bin | 5 - applications/SprPoP/assets/packed/MUS/m30.bin | 1 - applications/SprPoP/assets/packed/MUS/m32.bin | 1 - applications/SprPoP/assets/packed/MUS/m33.bin | 1 - applications/SprPoP/assets/packed/MUS/m35.bin | 1 - applications/SprPoP/assets/packed/MUS/m36.bin | 1 - applications/SprPoP/assets/packed/MUS/m37.bin | 1 - applications/SprPoP/assets/packed/MUS/m39.bin | 1 - applications/SprPoP/assets/packed/MUS/m40.bin | 1 - applications/SprPoP/assets/packed/MUS/m41.bin | 2 - applications/SprPoP/assets/packed/MUS/m43.bin | 1 - applications/SprPoP/assets/packed/MUS/m50.bin | 1 - applications/SprPoP/assets/packed/MUS/m52.bin | 1 - applications/SprPoP/assets/packed/MUS/m53.bin | 14 - applications/SprPoP/assets/packed/MUS/m54.bin | 1 - applications/SprPoP/assets/packed/MUS/m55.bin | 3 - applications/SprPoP/assets/packed/MUS/m56.bin | 1 - applications/SprPoP/assets/packed/MUS/mus.idx | Bin 512 -> 0 bytes applications/SprPoP/assets/packed/PV/pv.arc | Bin 1071616 -> 0 bytes applications/SprPoP/assets/packed/PV/pv.pal | Bin 1024 -> 0 bytes .../SprPoP/assets/packed/PV/story.pal | Bin 1024 -> 0 bytes .../SprPoP/assets/packed/README_E.TXT | 134 - .../SprPoP/assets/packed/README_R.TXT | 130 - .../SprPoP/assets/packed/SHADOW/shadow.arc | Bin 233472 -> 0 bytes .../SprPoP/assets/packed/SKEL/skel.arc | Bin 32256 -> 0 bytes applications/SprPoP/assets/packed/SND/snd.arc | Bin 164352 -> 0 bytes applications/SprPoP/assets/packed/SND/snd.idx | Bin 512 -> 0 bytes .../SprPoP/assets/packed/TITLE/title.arc | Bin 260608 -> 0 bytes .../SprPoP/assets/packed/TITLE/title.pal | Bin 68 -> 0 bytes .../SprPoP/assets/packed/VIZIER/vizier.arc | Bin 36352 -> 0 bytes applications/SprPoP/dist/MUS/m24.bin | 1 - applications/SprPoP/dist/MUS/m25.bin | 1 - applications/SprPoP/dist/MUS/m26.bin | 1 - applications/SprPoP/dist/MUS/m27.bin | 1 - applications/SprPoP/dist/MUS/m28.bin | 1 - applications/SprPoP/dist/MUS/m29.bin | 1 - applications/SprPoP/dist/MUS/m30.bin | 1 - applications/SprPoP/dist/MUS/m32.bin | 1 - applications/SprPoP/dist/MUS/m33.bin | 1 - applications/SprPoP/dist/MUS/m35.bin | 1 - applications/SprPoP/dist/MUS/m36.bin | 1 - applications/SprPoP/dist/MUS/m37.bin | 1 - applications/SprPoP/dist/MUS/m39.bin | 1 - applications/SprPoP/dist/MUS/m40.bin | 1 - applications/SprPoP/dist/MUS/m41.bin | 1 - applications/SprPoP/dist/MUS/m43.bin | 1 - applications/SprPoP/dist/MUS/m50.bin | 1 - applications/SprPoP/dist/MUS/m52.bin | 1 - applications/SprPoP/dist/MUS/m53.bin | 1 - applications/SprPoP/dist/MUS/m54.bin | 1 - applications/SprPoP/dist/MUS/m55.bin | 1 - applications/SprPoP/dist/MUS/m56.bin | 1 - applications/SprPoP/dist/MUS/mus.idx | Bin 512 -> 0 bytes applications/SprPoP/dist/README.ru.txt | 130 - applications/SprPoP/dist/README.txt | 134 - applications/SprPoP/dist/SND/snd.arc | Bin 164352 -> 0 bytes applications/SprPoP/dist/SND/snd.idx | Bin 512 -> 0 bytes applications/SprPoP/docs/BUGS_OPEN.md | 1484 - applications/SprPoP/docs/KID_PLAN.md | 214 - applications/SprPoP/docs/PORT_PLAN.md | 555 - .../docs/PoP/APPLEII_RESOURCE_FORMAT.md | 283 - .../SprPoP/docs/PoP/MSDOS_RESOURCE_FORMAT.md | 301 - .../docs/PoP/POP-DAT-FormatSpecifications.pdf | Bin 222037 -> 0 bytes .../docs/PoP/POP-DAT-FormatSpecifications.txt | 2345 -- applications/SprPoP/docs/README.md | 73 - applications/SprPoP/docs/TASKS_OPEN.md | 1678 -- applications/SprPoP/docs/full_game_plan.md | 367 - applications/SprPoP/docs/gates_spikes_plan.md | 279 - applications/SprPoP/docs/host_tests_plan.md | 142 - applications/SprPoP/docs/ideas_backlog.md | 183 - applications/SprPoP/docs/impl_diff.md | 686 - applications/SprPoP/docs/keys.txt | 77 - applications/SprPoP/docs/keys_plan.md | 170 - applications/SprPoP/docs/layout_plan_v2.md | 532 - applications/SprPoP/docs/levels_12_15_plan.md | 462 - applications/SprPoP/docs/levels_plan.md | 209 - .../SprPoP/docs/menu_settings_plan.md | 529 - applications/SprPoP/docs/midtable_analysis.md | 275 - .../SprPoP/docs/music_runtime_index_plan.md | 592 - applications/SprPoP/docs/palette_plan.md | 297 - applications/SprPoP/docs/perf_backlog.md | 335 - applications/SprPoP/docs/perf_cyan_phase.md | 172 - applications/SprPoP/docs/perf_green_phase.md | 327 - applications/SprPoP/docs/perf_l11_room15.md | 238 - applications/SprPoP/docs/perf_l13_room23.md | 271 - applications/SprPoP/docs/perf_registry.md | 871 - applications/SprPoP/docs/prng_alternatives.md | 148 - applications/SprPoP/docs/quicksave_plan.md | 328 - applications/SprPoP/docs/resident_budget.md | 111 - applications/SprPoP/docs/room_model_plan.md | 86 - applications/SprPoP/docs/roomnav_skip.md | 65 - applications/SprPoP/docs/sdlpop_audit.md | 755 - applications/SprPoP/docs/shadow_render.md | 160 - applications/SprPoP/docs/sound_plan.md | 1286 - applications/SprPoP/docs/status_line_text.md | 218 - .../SprPoP/docs/vanilla_vs_bugfixed.md | 275 - applications/SprPoP/gen/bg_arc.h | 34 - applications/SprPoP/gen/guard_arc.h | 19 - applications/SprPoP/gen/kid_arc.h | 67 - applications/SprPoP/gen/kid_data.h | 77 - applications/SprPoP/gen/pop_bg_atlas.h | 37 - applications/SprPoP/gen/pop_font.h | 29 - applications/SprPoP/gen/pop_guard_pal.h | 36 - applications/SprPoP/gen/pop_shadow_atlas.h | 33 - applications/SprPoP/gen/pv_arc.h | 92 - applications/SprPoP/gen/shadow_arc.h | 41 - applications/SprPoP/gen/skel_arc.h | 13 - applications/SprPoP/gen/title_arc.h | 29 - applications/SprPoP/gen/vizier_arc.h | 14 - applications/SprPoP/src/_pop_bg.h | 63 - applications/SprPoP/src/_pop_config.h | 40 - applications/SprPoP/src/_pop_draw.h | 47 - applications/SprPoP/src/_pop_file.h | 33 - applications/SprPoP/src/_pop_kdraw.h | 34 - applications/SprPoP/src/_pop_kid.h | 26 - applications/SprPoP/src/_pop_level.h | 79 - applications/SprPoP/src/_pop_sfx.h | 27 - applications/SprPoP/src/_pop_tile.h | 18 - applications/SprPoP/src/guards.c | 1219 - applications/SprPoP/src/pop_app.c | 135 - applications/SprPoP/src/pop_app.h | 63 - applications/SprPoP/src/pop_arc.c | 113 - applications/SprPoP/src/pop_arc.h | 90 - applications/SprPoP/src/pop_bg.c | 1187 - applications/SprPoP/src/pop_bg.h | 231 - applications/SprPoP/src/pop_cdraw.c | 1085 - applications/SprPoP/src/pop_cdraw.h | 188 - applications/SprPoP/src/pop_cfg.h | 19 - applications/SprPoP/src/pop_char.h | 32 - applications/SprPoP/src/pop_cheat.h | 62 - applications/SprPoP/src/pop_config.c | 201 - applications/SprPoP/src/pop_ctrl.c | 889 - applications/SprPoP/src/pop_ctrl.h | 77 - applications/SprPoP/src/pop_cutscene.c | 55 - applications/SprPoP/src/pop_cutscene.h | 56 - applications/SprPoP/src/pop_demo.c | 73 - applications/SprPoP/src/pop_demo.h | 17 - applications/SprPoP/src/pop_draw.c | 32 - applications/SprPoP/src/pop_flow.c | 48 - applications/SprPoP/src/pop_flow.h | 40 - applications/SprPoP/src/pop_geom.c | 262 - applications/SprPoP/src/pop_geom.h | 61 - applications/SprPoP/src/pop_guard.c | 239 - applications/SprPoP/src/pop_guard.h | 393 - applications/SprPoP/src/pop_guard_cold.c | 183 - applications/SprPoP/src/pop_hof.c | 559 - applications/SprPoP/src/pop_hof.h | 21 - applications/SprPoP/src/pop_intro.c | 1947 -- applications/SprPoP/src/pop_intro.h | 29 - applications/SprPoP/src/pop_kboot.c | 120 - applications/SprPoP/src/pop_kdraw.c | 147 - applications/SprPoP/src/pop_kid.c | 474 - applications/SprPoP/src/pop_kid.h | 139 - applications/SprPoP/src/pop_level.c | 136 - applications/SprPoP/src/pop_level.h | 160 - applications/SprPoP/src/pop_level_cold.c | 327 - applications/SprPoP/src/pop_level_qsave.c | 38 - applications/SprPoP/src/pop_map.c | 3556 --- applications/SprPoP/src/pop_map.h | 290 - applications/SprPoP/src/pop_menu.c | 803 - applications/SprPoP/src/pop_menu.h | 44 - applications/SprPoP/src/pop_music.c | 488 - applications/SprPoP/src/pop_music.h | 150 - applications/SprPoP/src/pop_pace.c | 105 - applications/SprPoP/src/pop_pace.h | 108 - applications/SprPoP/src/pop_pal.c | 135 - applications/SprPoP/src/pop_pal.h | 49 - applications/SprPoP/src/pop_path_bank.c | 52 - applications/SprPoP/src/pop_qsave.c | 262 - applications/SprPoP/src/pop_qsave.h | 48 - applications/SprPoP/src/pop_qsave_coldio.c | 38 - applications/SprPoP/src/pop_qsave_io.c | 34 - applications/SprPoP/src/pop_redraw.c | 156 - applications/SprPoP/src/pop_redraw.h | 68 - applications/SprPoP/src/pop_room.c | 2011 -- applications/SprPoP/src/pop_settings.h | 40 - applications/SprPoP/src/pop_sfx.c | 315 - applications/SprPoP/src/pop_sfx.h | 115 - applications/SprPoP/src/pop_sfx_cold.c | 303 - applications/SprPoP/src/pop_shadow.c | 105 - applications/SprPoP/src/pop_shadow.h | 55 - applications/SprPoP/src/pop_snd_data.c | 34 - applications/SprPoP/src/pop_snd_tbl.h | 50 - applications/SprPoP/src/pop_state.c | 203 - applications/SprPoP/src/pop_state.h | 141 - applications/SprPoP/src/pop_status.c | 619 - applications/SprPoP/src/pop_status.h | 89 - applications/SprPoP/src/pop_tile.c | 624 - applications/SprPoP/src/pop_tile.h | 188 - applications/SprPoP/src/pop_tile_cold.c | 240 - applications/SprPoP/src/pop_timer.c | 97 - applications/SprPoP/src/pop_timer.h | 54 - applications/SprPoP/src/pop_title.c | 227 - applications/SprPoP/src/pop_title.h | 27 - applications/SprPoP/src/pop_trob.c | 929 - applications/SprPoP/src/pop_trob.h | 74 - applications/SprPoP/src/pop_tune.h | 149 - applications/SprPoP/src/pop_ui.c | 503 - applications/SprPoP/src/pop_ui.h | 127 - applications/SprPoP/src/pop_vflip.c | 58 - applications/SprPoP/src/pop_vflip.h | 48 - applications/SprPoP/src/sprpop.c | 1084 - applications/SprPoP/src/sprpop_cold.c | 1504 - applications/SprPoP/src/sprpop_cold.h | 143 - applications/SprPoP/tests/host/Makefile | 132 - applications/SprPoP/tests/host/README.md | 121 - applications/SprPoP/tests/host/bank_stub.s | 25 - .../SprPoP/tests/host/gen_kid_blob.py | 46 - .../SprPoP/tests/host/golden/crouch.h | 22 - .../SprPoP/tests/host/golden/fall_ledge.h | 36 - .../SprPoP/tests/host/golden/jump_up.h | 22 - applications/SprPoP/tests/host/golden/loose.h | 36 - .../SprPoP/tests/host/golden/rjump_gap3.h | 36 - .../SprPoP/tests/host/golden/run_right.h | 26 - applications/SprPoP/tests/host/golden/stand.h | 14 - .../SprPoP/tests/host/golden/step_shift.h | 22 - applications/SprPoP/tests/host/golden/turn.h | 18 - applications/SprPoP/tests/host/kidblob.h | 18 - .../SprPoP/tests/host/record_golden.py | 72 - applications/SprPoP/tests/host/scene.c | 213 - applications/SprPoP/tests/host/scene.h | 102 - applications/SprPoP/tests/host/stubs.c | 423 - applications/SprPoP/tests/host/stubs.h | 61 - applications/SprPoP/tests/host/t_app.c | 135 - applications/SprPoP/tests/host/t_cfg.c | 197 - applications/SprPoP/tests/host/t_char.c | 525 - applications/SprPoP/tests/host/t_cutscene.c | 46 - applications/SprPoP/tests/host/t_death.c | 225 - applications/SprPoP/tests/host/t_demo.c | 89 - applications/SprPoP/tests/host/t_flow.c | 52 - applications/SprPoP/tests/host/t_gate.c | 202 - applications/SprPoP/tests/host/t_geom.c | 184 - applications/SprPoP/tests/host/t_grab.c | 283 - applications/SprPoP/tests/host/t_hang.c | 95 - applications/SprPoP/tests/host/t_jaffar.c | 349 - applications/SprPoP/tests/host/t_mouse.c | 178 - applications/SprPoP/tests/host/t_phys.c | 380 - applications/SprPoP/tests/host/t_shadow.c | 332 - applications/SprPoP/tests/host/t_timer.c | 169 - applications/SprPoP/tests/host/t_wall.c | 206 - applications/SprPoP/tools/fetch_orig.py | 411 - applications/SprPoP/tools/paths.py | 150 - applications/SprPoP/tools/pop_extract_font.py | 212 - .../SprPoP/tools/pop_extract_kid_data.py | 171 - applications/SprPoP/tools/pop_idx.py | 230 - applications/SprPoP/tools/pop_pack_arc.py | 123 - applications/SprPoP/tools/pop_pack_bg.py | 616 - applications/SprPoP/tools/pop_pack_guard.py | 216 - applications/SprPoP/tools/pop_pack_intro.py | 353 - applications/SprPoP/tools/pop_pack_kid.py | 209 - applications/SprPoP/tools/pop_pack_music.py | 144 - applications/SprPoP/tools/pop_pack_shadow.py | 284 - applications/SprPoP/tools/pop_pack_sound.py | 311 - applications/SprPoP/tools/pop_pack_title.py | 141 - applications/SprPoP/tools/pop_quiet.py | 163 - applications/SprPoP/tools/render_room.py | 853 - .../SprPoP/tools/tests/test_pop_idx.py | 244 - .../SprPoP/tools/tests/test_pop_quiet.py | 108 - applications/Volkov/.gitignore | 23 - applications/Volkov/.python-version | 1 - applications/Volkov/LICENSE | 21 - applications/Volkov/Makefile | 221 - applications/Volkov/README.md | 112 - .../Volkov/artifacts/mame-p1/README.md | 36 - .../artifacts/mame-p1/directory/menu.png | Bin 6662 -> 0 bytes .../mame-p1/directory/result-early.png | Bin 8002 -> 0 bytes .../artifacts/mame-p1/directory/result.png | Bin 7998 -> 0 bytes .../mame-p1/directory/strict-enoent.png | Bin 8001 -> 0 bytes .../mame-p1/directory/strict-menu.png | Bin 6662 -> 0 bytes .../mame-p1/directory/transition.png | Bin 7998 -> 0 bytes .../Volkov/artifacts/mame-p1/dskinfo/menu.png | Bin 6662 -> 0 bytes .../artifacts/mame-p1/dskinfo/result.png | Bin 6455 -> 0 bytes .../artifacts/mame-p1/dskinfo/transition.png | Bin 6455 -> 0 bytes .../Volkov/artifacts/mame-p1/emm/menu.png | Bin 6662 -> 0 bytes .../Volkov/artifacts/mame-p1/emm/result.png | Bin 6802 -> 0 bytes .../artifacts/mame-p1/emm/transition.png | Bin 6802 -> 0 bytes .../mame-p1/exec-then-emm/emm-result.png | Bin 6802 -> 0 bytes .../mame-p1/exec-then-emm/exec-result.png | Bin 6493 -> 0 bytes .../artifacts/mame-p1/exec-then-emm/menu.png | Bin 6662 -> 0 bytes .../artifacts/mame-p1/exec/case1-child.png | Bin 5065 -> 0 bytes .../artifacts/mame-p1/exec/case1-parent.png | Bin 6141 -> 0 bytes .../artifacts/mame-p1/exec/case2-child.png | Bin 5065 -> 0 bytes .../artifacts/mame-p1/exec/case2-parent.png | Bin 6127 -> 0 bytes .../Volkov/artifacts/mame-p1/exec/menu.png | Bin 6662 -> 0 bytes .../Volkov/artifacts/mame-p1/exec/result.png | Bin 6493 -> 0 bytes .../keyboard-commander/sprinter/0000.png | Bin 7068 -> 0 bytes .../keyboard-commander/sprinter/0001.png | Bin 8454 -> 0 bytes .../keyboard-commander/sprinter/0002.png | Bin 9588 -> 0 bytes .../keyboard-commander/sprinter/0003.png | Bin 10121 -> 0 bytes .../keyboard-commander/sprinter/0004.png | Bin 6662 -> 0 bytes .../mame-p1/keyboard/sprinter/0000.png | Bin 7068 -> 0 bytes .../mame-p1/keyboard/sprinter/0001.png | Bin 8454 -> 0 bytes .../mame-p1/keyboard/sprinter/0002.png | Bin 9591 -> 0 bytes .../mame-p1/keyboard/sprinter/0003.png | Bin 10142 -> 0 bytes .../mame-p1/keyboard/sprinter/0004.png | Bin 6662 -> 0 bytes .../mame-p1/winrest/full-contrast.png | Bin 6101 -> 0 bytes .../mame-p1/winrest/full-current.png | Bin 6120 -> 0 bytes .../Volkov/artifacts/mame-p1/winrest/full.png | Bin 6120 -> 0 bytes .../mame-p1/winrest/menu-current.png | Bin 6662 -> 0 bytes .../Volkov/artifacts/mame-p1/winrest/menu.png | Bin 6662 -> 0 bytes .../winrest/partial-contrast-stable.png | Bin 6645 -> 0 bytes .../mame-p1/winrest/partial-flash-phase.png | Bin 6645 -> 0 bytes .../mame-p1/winrest/partial-phase-hidden.png | Bin 6663 -> 0 bytes .../mame-p1/winrest/partial-stable.png | Bin 6663 -> 0 bytes .../artifacts/mame-p1/winrest/partial.png | Bin 6663 -> 0 bytes .../mame-p1/winrest/result-contrast.png | Bin 7043 -> 0 bytes .../mame-p1/winrest/result-current.png | Bin 7043 -> 0 bytes .../artifacts/mame-p1/winrest/result.png | Bin 7043 -> 0 bytes .../mame-p10/rename-final/sprinter/0000.png | Bin 8935 -> 0 bytes .../mame-p10/rename-final/sprinter/0001.png | Bin 10038 -> 0 bytes .../mame-p10/rename-final/sprinter/0002.png | Bin 8840 -> 0 bytes .../mame-p10/rename-final/sprinter/0003.png | Bin 8932 -> 0 bytes .../mame-p10/rename-final/sprinter/0004.png | Bin 8913 -> 0 bytes .../mame-p10/rename-final/sprinter/0005.png | Bin 8808 -> 0 bytes .../mame-p10/rename-final/sprinter/0006.png | Bin 9202 -> 0 bytes .../mame-p10/rename-final/sprinter/0007.png | Bin 2331 -> 0 bytes .../mame-p10/rename-pass/sprinter/0000.png | Bin 8935 -> 0 bytes .../mame-p10/rename-pass/sprinter/0001.png | Bin 10049 -> 0 bytes .../mame-p10/rename-pass/sprinter/0002.png | Bin 8983 -> 0 bytes .../mame-p10/rename-pass/sprinter/0003.png | Bin 8949 -> 0 bytes .../mame-p10/rename-pass/sprinter/0004.png | Bin 8931 -> 0 bytes .../mame-p10/rename-pass/sprinter/0005.png | Bin 8799 -> 0 bytes .../mame-p10/rename-pass/sprinter/0006.png | Bin 9193 -> 0 bytes .../mame-p10/rename-pass/sprinter/0007.png | Bin 2331 -> 0 bytes .../mame-p10/rename-run/sprinter/0000.png | Bin 8935 -> 0 bytes .../mame-p10/rename-run/sprinter/0001.png | Bin 10045 -> 0 bytes .../mame-p10/rename-run/sprinter/0002.png | Bin 8978 -> 0 bytes .../mame-p10/rename-run/sprinter/0003.png | Bin 8946 -> 0 bytes .../mame-p10/rename-run/sprinter/0004.png | Bin 8928 -> 0 bytes .../mame-p10/rename-run/sprinter/0005.png | Bin 8799 -> 0 bytes .../mame-p10/rename-run/sprinter/0006.png | Bin 9184 -> 0 bytes .../mame-p10/rename-run/sprinter/0007.png | Bin 2331 -> 0 bytes .../mame-p10/rename/clean-dss-return.png | Bin 2331 -> 0 bytes .../artifacts/mame-p10/rename/collision.png | Bin 8913 -> 0 bytes .../mame-p10/rename/dialog-default.png | Bin 10038 -> 0 bytes .../artifacts/mame-p10/rename/group-guard.png | Bin 9202 -> 0 bytes .../mame-p10/rename/renamed-focused.png | Bin 8840 -> 0 bytes .../mame-p10/rename/unchanged-name.png | Bin 8932 -> 0 bytes .../mame-p10/rename/virtual-guard.png | Bin 8808 -> 0 bytes .../mame-p11/delete-run/sprinter/0000.png | Bin 8995 -> 0 bytes .../mame-p11/delete-run/sprinter/0001.png | Bin 9914 -> 0 bytes .../mame-p11/delete-run/sprinter/0002.png | Bin 8991 -> 0 bytes .../mame-p11/delete-run/sprinter/0003.png | Bin 8412 -> 0 bytes .../mame-p11/delete-run/sprinter/0004.png | Bin 8385 -> 0 bytes .../mame-p11/delete-run/sprinter/0005.png | Bin 8662 -> 0 bytes .../mame-p11/delete-run/sprinter/0006.png | Bin 8470 -> 0 bytes .../mame-p11/delete-run/sprinter/0007.png | Bin 8800 -> 0 bytes .../mame-p11/delete-run/sprinter/0008.png | Bin 2331 -> 0 bytes .../mame-p11/delete/cancel-preserves.png | Bin 8991 -> 0 bytes .../mame-p11/delete/clean-dss-return.png | Bin 2331 -> 0 bytes .../mame-p11/delete/empty-dir-deleted.png | Bin 8385 -> 0 bytes .../mame-p11/delete/file-confirm.png | Bin 9914 -> 0 bytes .../mame-p11/delete/file-deleted.png | Bin 8412 -> 0 bytes .../artifacts/mame-p11/delete/group-guard.png | Bin 8800 -> 0 bytes .../mame-p11/delete/nonempty-preserved.png | Bin 8662 -> 0 bytes .../mame-p11/delete/virtual-guard.png | Bin 8470 -> 0 bytes .../sprinter/0000.png | Bin 8122 -> 0 bytes .../sprinter/0001.png | Bin 8482 -> 0 bytes .../sprinter/0002.png | Bin 8612 -> 0 bytes .../sprinter/0003.png | Bin 8884 -> 0 bytes .../sprinter/0004.png | Bin 8461 -> 0 bytes .../sprinter/0005.png | Bin 2314 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0000.png | Bin 8045 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0001.png | Bin 8428 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0002.png | Bin 8642 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0003.png | Bin 8833 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0004.png | Bin 8452 -> 0 bytes .../mame-p12/group-copy-run/sprinter/0005.png | Bin 2314 -> 0 bytes .../mame-p12/group-copy/clean-dss-return.png | Bin 2314 -> 0 bytes .../group-copy/copied-and-skipped-dir.png | Bin 8642 -> 0 bytes .../mame-p12/group-copy/passive-refreshed.png | Bin 8452 -> 0 bytes .../group-copy/repeat-stops-eexist.png | Bin 8833 -> 0 bytes .../group-copy/selected-files-and-dir.png | Bin 8428 -> 0 bytes .../single-copy-regression/sprinter/0000.png | Bin 8443 -> 0 bytes .../single-copy-regression/sprinter/0001.png | Bin 9539 -> 0 bytes .../single-copy-regression/sprinter/0002.png | Bin 9820 -> 0 bytes .../single-copy-regression/sprinter/0003.png | Bin 9851 -> 0 bytes .../single-copy-regression/sprinter/0004.png | Bin 9896 -> 0 bytes .../single-copy-regression/sprinter/0005.png | Bin 9869 -> 0 bytes .../single-copy-regression/sprinter/0006.png | Bin 10110 -> 0 bytes .../single-copy-regression/sprinter/0007.png | Bin 9912 -> 0 bytes .../single-copy-regression/sprinter/0008.png | Bin 10044 -> 0 bytes .../single-copy-regression/sprinter/0009.png | Bin 10982 -> 0 bytes .../single-copy-regression/sprinter/0010.png | Bin 2314 -> 0 bytes .../mame-p13/file-only-regression/before.png | Bin 8604 -> 0 bytes .../file-only-regression/cancel-preserves.png | Bin 8865 -> 0 bytes .../file-only-regression/clean-dss-return.png | Bin 2314 -> 0 bytes .../file-only-regression/files-deleted.png | Bin 8232 -> 0 bytes .../file-only-regression/group-confirm.png | Bin 9823 -> 0 bytes .../file-only-regression/selected-files.png | Bin 8932 -> 0 bytes .../group-delete-rerun/sprinter/0000.png | Bin 8512 -> 0 bytes .../group-delete-rerun/sprinter/0001.png | Bin 8869 -> 0 bytes .../group-delete-rerun/sprinter/0002.png | Bin 9876 -> 0 bytes .../group-delete-rerun/sprinter/0003.png | Bin 8803 -> 0 bytes .../group-delete-rerun/sprinter/0004.png | Bin 8380 -> 0 bytes .../group-delete-rerun/sprinter/0005.png | Bin 8636 -> 0 bytes .../group-delete-rerun/sprinter/0006.png | Bin 2331 -> 0 bytes .../group-delete-run/sprinter/0000.png | Bin 8512 -> 0 bytes .../group-delete-run/sprinter/0001.png | Bin 8863 -> 0 bytes .../group-delete-run/sprinter/0002.png | Bin 9873 -> 0 bytes .../group-delete-run/sprinter/0003.png | Bin 8797 -> 0 bytes .../group-delete-run/sprinter/0004.png | Bin 8381 -> 0 bytes .../group-delete-run/sprinter/0005.png | Bin 9468 -> 0 bytes .../group-delete-run/sprinter/0006.png | Bin 7737 -> 0 bytes .../group-delete/cancel-preserves.png | Bin 8803 -> 0 bytes .../group-delete/clean-dss-return.png | Bin 2331 -> 0 bytes .../group-delete/directory-only-refused.png | Bin 8636 -> 0 bytes .../files-deleted-dirs-preserved.png | Bin 8380 -> 0 bytes .../mame-p13/group-delete/group-confirm.png | Bin 9876 -> 0 bytes .../group-delete/selected-files-and-dirs.png | Bin 8869 -> 0 bytes .../default-colors-run/sprinter/0000.png | Bin 8769 -> 0 bytes .../default-colors-run/sprinter/0001.png | Bin 2314 -> 0 bytes .../default-colors/clean-dss-palette.png | Bin 2314 -> 0 bytes .../mame-p14/default-colors/file-types.png | Bin 8769 -> 0 bytes .../tree-cancel-run/sprinter/0000.png | Bin 7748 -> 0 bytes .../tree-cancel-run/sprinter/0001.png | Bin 7751 -> 0 bytes .../tree-cancel-run/sprinter/0002.png | Bin 2314 -> 0 bytes .../mame-p15/tree-copy-run/sprinter/0000.png | Bin 7729 -> 0 bytes .../mame-p15/tree-copy-run/sprinter/0001.png | Bin 7668 -> 0 bytes .../mame-p15/tree-copy-run/sprinter/0002.png | Bin 7819 -> 0 bytes .../mame-p15/tree-copy-run/sprinter/0003.png | Bin 7455 -> 0 bytes .../mame-p15/tree-copy-run/sprinter/0004.png | Bin 2314 -> 0 bytes .../artifacts/mame-p15/tree-copy/before.png | Bin 7729 -> 0 bytes .../mame-p15/tree-copy/cancel-clean.png | Bin 7751 -> 0 bytes .../mame-p15/tree-copy/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p15/tree-copy/passive-refreshed.png | Bin 7455 -> 0 bytes .../tree-copy/repeat-existing-target.png | Bin 7819 -> 0 bytes .../tree-copy/self-target-refused.png | Bin 7802 -> 0 bytes .../artifacts/mame-p15/tree-copy/success.png | Bin 7668 -> 0 bytes .../mame-p15/tree-self-run/sprinter/0000.png | Bin 7857 -> 0 bytes .../mame-p15/tree-self-run/sprinter/0001.png | Bin 7802 -> 0 bytes .../mame-p15/tree-self-run/sprinter/0002.png | Bin 2314 -> 0 bytes .../mame-p16/group-tree-run/sprinter/0000.png | Bin 8607 -> 0 bytes .../mame-p16/group-tree-run/sprinter/0001.png | Bin 8782 -> 0 bytes .../mame-p16/group-tree-run/sprinter/0002.png | Bin 8638 -> 0 bytes .../mame-p16/group-tree-run/sprinter/0003.png | Bin 2331 -> 0 bytes .../mame-p16/group-tree/clean-dss-return.png | Bin 2331 -> 0 bytes .../artifacts/mame-p16/group-tree/copied.png | Bin 8782 -> 0 bytes .../mame-p16/group-tree/passive-refreshed.png | Bin 8638 -> 0 bytes .../mame-p16/group-tree/selected-roots.png | Bin 8607 -> 0 bytes .../tree-delete-cancel/clean-dss-return.png | Bin 2314 -> 0 bytes .../tree-delete-cancel/group-confirm.png | Bin 9551 -> 0 bytes .../tree-delete-cancel/runtime-cancelled.png | Bin 8090 -> 0 bytes .../selected-before-cancel.png | Bin 8607 -> 0 bytes .../artifacts/mame-p17/tree-delete/before.png | Bin 8608 -> 0 bytes .../mame-p17/tree-delete/cancel-preserves.png | Bin 8870 -> 0 bytes .../mame-p17/tree-delete/clean-dss-return.png | Bin 2331 -> 0 bytes .../tree-delete/deleted-keep-preserved.png | Bin 8034 -> 0 bytes .../mame-p17/tree-delete/group-confirm.png | Bin 9877 -> 0 bytes .../tree-delete/selected-file-and-trees.png | Bin 8936 -> 0 bytes .../mame-p18/metadata/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p18/metadata/copied-metadata.png | Bin 8109 -> 0 bytes .../mame-p18/metadata/passive-metadata.png | Bin 7712 -> 0 bytes .../mame-p18/metadata/source-metadata.png | Bin 7984 -> 0 bytes .../mame-p19/overwrite-core/all-pass.png | Bin 6025 -> 0 bytes .../overwrite-core/clean-dss-return.png | Bin 6099 -> 0 bytes .../mame-p19/policy/cancel-choice.png | Bin 11290 -> 0 bytes .../mame-p19/policy/cancel-cleared.png | Bin 10109 -> 0 bytes .../mame-p19/policy/clean-dss-return.png | Bin 2331 -> 0 bytes .../mame-p19/policy/overwrite-choice.png | Bin 11196 -> 0 bytes .../mame-p19/policy/overwrite-complete.png | Bin 9820 -> 0 bytes .../mame-p19/policy/readonly-reprompt.png | Bin 11290 -> 0 bytes .../mame-p19/policy/rename-choice.png | Bin 10861 -> 0 bytes .../artifacts/mame-p19/policy/renamed.png | Bin 10066 -> 0 bytes .../mame-p19/policy/skip-all-choice.png | Bin 11103 -> 0 bytes .../mame-p19/policy/skip-complete.png | Bin 9803 -> 0 bytes .../mame-p19/policy/target-result.png | Bin 9822 -> 0 bytes .../Volkov/artifacts/mame-p2/README.md | 56 - .../artifacts/mame-p2/palette/phase-a.png | Bin 10225 -> 0 bytes .../artifacts/mame-p2/palette/phase-b.png | Bin 10221 -> 0 bytes .../artifacts/mame-p2/palette/phase-c.png | Bin 10221 -> 0 bytes .../artifacts/mame-p2/palette/phase-d.png | Bin 10221 -> 0 bytes .../artifacts/mame-p2/palette/phase-e.png | Bin 10221 -> 0 bytes .../mame-p2/palette/restored-dos.png | Bin 2310 -> 0 bytes .../mame-p2/screen/flash-before-hidden.png | Bin 12402 -> 0 bytes .../screen/flash-before-visible-again.png | Bin 12402 -> 0 bytes .../mame-p2/screen/flash-before-visible.png | Bin 12402 -> 0 bytes .../Volkov/artifacts/mame-p2/screen/full.png | Bin 12206 -> 0 bytes .../mame-p2/screen/left-scroll-up.png | Bin 12823 -> 0 bytes .../mame-p2/screen/partial-offset.png | Bin 12437 -> 0 bytes .../mame-p2/screen/right-scroll-down.png | Bin 13089 -> 0 bytes .../mame-p2/screen/stable-phase-a.png | Bin 13215 -> 0 bytes .../mame-p2/screen/stable-phase-b.png | Bin 13215 -> 0 bytes .../mame-p2/screen/stable-phase-c.png | Bin 13215 -> 0 bytes .../artifacts/mame-p2/screen/stress-final.png | Bin 13215 -> 0 bytes .../mame-p2/screen/stress-running.png | Bin 13153 -> 0 bytes .../mame-p2/skeleton-color/clean-exit-dos.png | Bin 2310 -> 0 bytes .../skeleton-color/initial-left-active.png | Bin 14447 -> 0 bytes .../message-closed-restored.png | Bin 15251 -> 0 bytes .../skeleton-color/navigation-scroll.png | Bin 15275 -> 0 bytes .../quit-cancelled-restored.png | Bin 15202 -> 0 bytes .../mame-p2/skeleton-color/quit-dialog.png | Bin 15102 -> 0 bytes .../repeat-second-clean-exit.png | Bin 2310 -> 0 bytes .../skeleton-color/repeat-second-launch.png | Bin 14447 -> 0 bytes .../repeat-second-quit-dialog.png | Bin 14521 -> 0 bytes .../reserved-command-dialog.png | Bin 15048 -> 0 bytes .../skeleton-color/second-quit-dialog.png | Bin 15082 -> 0 bytes .../skeleton-color/tab-right-active.png | Bin 14227 -> 0 bytes .../skeleton-repeat-run/sprinter/0000.png | Bin 22815 -> 0 bytes .../skeleton-repeat-run/sprinter/0001.png | Bin 22597 -> 0 bytes .../skeleton-repeat-run/sprinter/0002.png | Bin 22935 -> 0 bytes .../skeleton-repeat-run/sprinter/0003.png | Bin 21444 -> 0 bytes .../skeleton-repeat-run/sprinter/0004.png | Bin 22866 -> 0 bytes .../skeleton-repeat-run/sprinter/0005.png | Bin 21391 -> 0 bytes .../skeleton-repeat-run/sprinter/0006.png | Bin 22905 -> 0 bytes .../skeleton-repeat-run/sprinter/0007.png | Bin 21415 -> 0 bytes .../skeleton-repeat-run/sprinter/0008.png | Bin 2310 -> 0 bytes .../skeleton-repeat-run/sprinter/0009.png | Bin 22815 -> 0 bytes .../skeleton-repeat-run/sprinter/0010.png | Bin 21361 -> 0 bytes .../skeleton-repeat-run/sprinter/0011.png | Bin 2310 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0000.png | Bin 22815 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0001.png | Bin 22597 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0002.png | Bin 22935 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0003.png | Bin 21444 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0004.png | Bin 22866 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0005.png | Bin 21391 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0006.png | Bin 22905 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0007.png | Bin 21415 -> 0 bytes .../mame-p2/skeleton-ui-run/sprinter/0008.png | Bin 2310 -> 0 bytes .../mame-p2/skeleton/clean-exit-dos.png | Bin 2310 -> 0 bytes .../mame-p2/skeleton/cleanup-between-runs.png | Bin 2310 -> 0 bytes .../mame-p2/skeleton/initial-left-active.png | Bin 22815 -> 0 bytes .../skeleton/message-closed-restored.png | Bin 22905 -> 0 bytes .../mame-p2/skeleton/navigation-scroll.png | Bin 22935 -> 0 bytes .../skeleton/quit-cancelled-restored.png | Bin 22866 -> 0 bytes .../mame-p2/skeleton/quit-dialog.png | Bin 21444 -> 0 bytes .../skeleton/repeat-second-clean-exit.png | Bin 2310 -> 0 bytes .../mame-p2/skeleton/repeat-second-launch.png | Bin 22815 -> 0 bytes .../skeleton/reserved-command-dialog.png | Bin 21391 -> 0 bytes .../mame-p2/skeleton/tab-right-active.png | Bin 22597 -> 0 bytes .../mame-p3/panels/bigdir-partial.png | Bin 13022 -> 0 bytes .../mame-p3/panels/ctrl-pgup-left-only.png | Bin 8515 -> 0 bytes .../mame-p3/panels/dss-enum-limit.png | Bin 6437 -> 0 bytes .../mame-p3/panels/dss-limit-clean-exit.png | Bin 2310 -> 0 bytes .../mame-p3/panels/dss-limit-quit-dialog.png | Bin 13999 -> 0 bytes .../mame-p3/panels/dss-marker-message.png | Bin 13566 -> 0 bytes .../mame-p3/panels/dss-marker-selected.png | Bin 13547 -> 0 bytes .../artifacts/mame-p3/panels/empty-parent.png | Bin 8540 -> 0 bytes .../mame-p3/panels/enter-parent-return.png | Bin 8551 -> 0 bytes .../mame-p3/panels/first-clean-exit.png | Bin 2310 -> 0 bytes .../panels/independent-panel-state.png | Bin 8624 -> 0 bytes .../mame-p3/panels/left-testdir-parent.png | Bin 8447 -> 0 bytes .../mame-p3/panels/navigation-scroll.png | Bin 13410 -> 0 bytes .../artifacts/mame-p3/panels/quit-dialog.png | Bin 9466 -> 0 bytes .../panels/refresh-preserves-inner.png | Bin 8481 -> 0 bytes .../mame-p3/panels/root-both-panels.png | Bin 8553 -> 0 bytes .../artifacts/mame-p3/panels/scan-marker.png | Bin 6513 -> 0 bytes .../mame-p3/panels/second-clean-exit.png | Bin 2310 -> 0 bytes .../mame-p3/panels/second-launch.png | Bin 8553 -> 0 bytes .../mame-p3/panels/second-quit-dialog.png | Bin 9504 -> 0 bytes .../mame-p3/panels/store-boundary-640-641.png | Bin 6934 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0000.png | Bin 8349 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0001.png | Bin 9508 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0002.png | Bin 9813 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0003.png | Bin 9844 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0004.png | Bin 9738 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0005.png | Bin 9649 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0006.png | Bin 9886 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0007.png | Bin 9687 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0008.png | Bin 10623 -> 0 bytes .../mame-p4/copy-hdd-diag/sprinter/0009.png | Bin 2314 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0000.png | Bin 8345 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0001.png | Bin 9508 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0002.png | Bin 9816 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0003.png | Bin 9847 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0004.png | Bin 9885 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0005.png | Bin 9855 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0006.png | Bin 10099 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0007.png | Bin 9900 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0008.png | Bin 10015 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0009.png | Bin 10950 -> 0 bytes .../mame-p4/copy-hdd-final/sprinter/0010.png | Bin 2314 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0000.png | Bin 8356 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0001.png | Bin 9508 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0002.png | Bin 9823 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0003.png | Bin 9854 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0004.png | Bin 9892 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0005.png | Bin 9865 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0006.png | Bin 10111 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0007.png | Bin 9913 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0008.png | Bin 10850 -> 0 bytes .../mame-p4/copy-hdd-fixed/sprinter/0009.png | Bin 2314 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0000.png | Bin 8351 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0001.png | Bin 9508 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0002.png | Bin 9822 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0003.png | Bin 9854 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0004.png | Bin 9658 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0005.png | Bin 9894 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0006.png | Bin 9695 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0007.png | Bin 10631 -> 0 bytes .../mame-p4/copy-hdd-run/sprinter/0008.png | Bin 2314 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0000.png | Bin 8356 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0001.png | Bin 9508 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0002.png | Bin 9788 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0003.png | Bin 9817 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0004.png | Bin 9857 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0005.png | Bin 9829 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0006.png | Bin 10077 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0007.png | Bin 9879 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0008.png | Bin 9990 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0009.png | Bin 10926 -> 0 bytes .../mame-p4/copy-openfix/sprinter/0010.png | Bin 2314 -> 0 bytes .../sprinter/0000.png | Bin 8355 -> 0 bytes .../sprinter/0001.png | Bin 9508 -> 0 bytes .../sprinter/0002.png | Bin 9806 -> 0 bytes .../sprinter/0003.png | Bin 9837 -> 0 bytes .../sprinter/0004.png | Bin 9877 -> 0 bytes .../sprinter/0005.png | Bin 9844 -> 0 bytes .../sprinter/0006.png | Bin 10084 -> 0 bytes .../sprinter/0007.png | Bin 9885 -> 0 bytes .../sprinter/0008.png | Bin 10003 -> 0 bytes .../sprinter/0009.png | Bin 10940 -> 0 bytes .../sprinter/0010.png | Bin 2314 -> 0 bytes .../artifacts/mame-p4/copy/bank-page-io.png | Bin 6046 -> 0 bytes .../mame-p4/copy/hdd-cancel-cleanup.png | Bin 9900 -> 0 bytes .../mame-p4/copy/hdd-cancel-progress.png | Bin 10099 -> 0 bytes .../artifacts/mame-p4/copy/hdd-clean-exit.png | Bin 2314 -> 0 bytes .../mame-p4/copy/hdd-copy-success.png | Bin 9885 -> 0 bytes .../mame-p4/copy/hdd-existing-refused.png | Bin 9855 -> 0 bytes .../mame-p4/copy/hdd-zero-copy-success.png | Bin 10015 -> 0 bytes .../exec-hdd-83-pass/sprinter/0000.png | Bin 8399 -> 0 bytes .../exec-hdd-83-pass/sprinter/0001.png | Bin 8108 -> 0 bytes .../exec-hdd-83-pass/sprinter/0002.png | Bin 5408 -> 0 bytes .../exec-hdd-83-pass/sprinter/0003.png | Bin 8768 -> 0 bytes .../exec-hdd-83-pass/sprinter/0004.png | Bin 8645 -> 0 bytes .../exec-hdd-83-pass/sprinter/0005.png | Bin 8772 -> 0 bytes .../exec-hdd-83-pass/sprinter/0006.png | Bin 9720 -> 0 bytes .../exec-hdd-83-pass/sprinter/0007.png | Bin 2314 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0000.png | Bin 8417 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0001.png | Bin 8104 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0002.png | Bin 5425 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0003.png | Bin 8573 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0004.png | Bin 8448 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0005.png | Bin 8591 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0006.png | Bin 9541 -> 0 bytes .../mame-p4/exec-hdd-final/sprinter/0007.png | Bin 2314 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0000.png | Bin 8411 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0001.png | Bin 8102 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0002.png | Bin 5425 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0003.png | Bin 8576 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0004.png | Bin 8454 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0005.png | Bin 8593 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0006.png | Bin 9541 -> 0 bytes .../mame-p4/exec-hdd-pass/sprinter/0007.png | Bin 2314 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0000.png | Bin 8415 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0001.png | Bin 8096 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0002.png | Bin 5425 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0003.png | Bin 8565 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0004.png | Bin 8435 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0005.png | Bin 8580 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0006.png | Bin 9530 -> 0 bytes .../exec-hdd-run-20260908/sprinter/0007.png | Bin 2314 -> 0 bytes .../exec-regression-cwd/sprinter/0000.png | Bin 8399 -> 0 bytes .../exec-regression-cwd/sprinter/0001.png | Bin 8108 -> 0 bytes .../exec-regression-cwd/sprinter/0002.png | Bin 5408 -> 0 bytes .../exec-regression-cwd/sprinter/0003.png | Bin 8753 -> 0 bytes .../exec-regression-cwd/sprinter/0004.png | Bin 8629 -> 0 bytes .../exec-regression-cwd/sprinter/0005.png | Bin 8760 -> 0 bytes .../exec-regression-cwd/sprinter/0006.png | Bin 9707 -> 0 bytes .../exec-regression-cwd/sprinter/0007.png | Bin 2314 -> 0 bytes .../mame-p4/exec/broken-exe-error.png | Bin 8645 -> 0 bytes .../mame-p4/exec/child-mode-palette-cwd.png | Bin 5408 -> 0 bytes .../mame-p4/exec/clean-dss-return.png | Bin 2314 -> 0 bytes .../exec/commander-restored-both-panels.png | Bin 8768 -> 0 bytes .../mame-p4/exec/quit-after-exec.png | Bin 9720 -> 0 bytes .../mame-p4/exec/unsupported-file.png | Bin 8772 -> 0 bytes .../copy-faults-final/sprinter/0000.png | Bin 2232 -> 0 bytes .../copy-faults-final/sprinter/0001.png | Bin 2315 -> 0 bytes .../copy-faults-missing-exe/sprinter/0000.png | Bin 5851 -> 0 bytes .../copy-faults-missing-exe/sprinter/0001.png | Bin 5921 -> 0 bytes .../copy-faults-pass/sprinter/0000.png | Bin 2232 -> 0 bytes .../copy-faults-pass/sprinter/0001.png | Bin 2315 -> 0 bytes .../sprinter/0000.png | Bin 5574 -> 0 bytes .../sprinter/0001.png | Bin 5645 -> 0 bytes .../copy-faults-readonly/sprinter/0000.png | Bin 5476 -> 0 bytes .../copy-faults-readonly/sprinter/0001.png | Bin 5548 -> 0 bytes .../mame-p5/copy-faults-run/sprinter/0000.png | Bin 9078 -> 0 bytes .../mame-p5/copy-faults-run/sprinter/0001.png | Bin 9085 -> 0 bytes .../copy-faults-second/sprinter/0000.png | Bin 2315 -> 0 bytes .../copy-faults-second/sprinter/0001.png | Bin 2315 -> 0 bytes .../copy-faults-visible/sprinter/0000.png | Bin 5298 -> 0 bytes .../copy-faults-visible/sprinter/0001.png | Bin 5369 -> 0 bytes .../copy-faults/fault-matrix-all-pass.png | Bin 5851 -> 0 bytes .../mame-p5/copy-faults/return-to-dss.png | Bin 5921 -> 0 bytes .../enospc-precommit/sprinter/0000.png | Bin 7650 -> 0 bytes .../enospc-precommit/sprinter/0001.png | Bin 7916 -> 0 bytes .../enospc-precommit/sprinter/0002.png | Bin 7871 -> 0 bytes .../enospc-precommit/sprinter/0003.png | Bin 8833 -> 0 bytes .../enospc-precommit/sprinter/0004.png | Bin 2314 -> 0 bytes .../mame-p5/enospc-run/sprinter/0000.png | Bin 7650 -> 0 bytes .../mame-p5/enospc-run/sprinter/0001.png | Bin 7916 -> 0 bytes .../mame-p5/enospc-run/sprinter/0002.png | Bin 7877 -> 0 bytes .../mame-p5/enospc-run/sprinter/0003.png | Bin 8835 -> 0 bytes .../mame-p5/enospc-run/sprinter/0004.png | Bin 2314 -> 0 bytes .../mame-p5/enospc/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p5/enospc/copy-progress.png | Bin 7916 -> 0 bytes .../mame-p5/enospc/enospc-cleanup.png | Bin 7877 -> 0 bytes .../mame-p5/enospc/quit-after-error.png | Bin 8835 -> 0 bytes .../media-change-copy/sprinter/0000.png | Bin 7996 -> 0 bytes .../media-change-copy/sprinter/0001.png | Bin 8216 -> 0 bytes .../media-change-copy/sprinter/0002.png | Bin 8216 -> 0 bytes .../media-change-copy/sprinter/0003.png | Bin 8162 -> 0 bytes .../media-change-copy/sprinter/0004.png | Bin 8247 -> 0 bytes .../media-change-copy/sprinter/0005.png | Bin 9216 -> 0 bytes .../media-change-copy/sprinter/0006.png | Bin 2314 -> 0 bytes .../media-change-run/sprinter/0000.png | Bin 7910 -> 0 bytes .../media-change-run/sprinter/0001.png | Bin 7800 -> 0 bytes .../media-change-run/sprinter/0002.png | Bin 7800 -> 0 bytes .../media-change-run/sprinter/0003.png | Bin 7800 -> 0 bytes .../media-change-run/sprinter/0004.png | Bin 8766 -> 0 bytes .../media-change-run/sprinter/0005.png | Bin 2314 -> 0 bytes .../mame-p5/media-change/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p5/media-change/managed-error.png | Bin 8162 -> 0 bytes .../mame-p5/media-change/recovered-copy.png | Bin 9216 -> 0 bytes .../mame-p5/media-change/retry-progress.png | Bin 8247 -> 0 bytes .../mame-p5/panel-edges-run/sprinter/0000.png | Bin 13528 -> 0 bytes .../mame-p5/panel-edges-run/sprinter/0001.png | Bin 14135 -> 0 bytes .../mame-p5/panel-edges-run/sprinter/0002.png | Bin 14186 -> 0 bytes .../mame-p5/panel-edges-run/sprinter/0003.png | Bin 2314 -> 0 bytes .../mame-p5/panel-edges/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p5/panel-edges/count-27-fits.png | Bin 14186 -> 0 bytes .../mame-p5/panel-edges/count-28-scrolls.png | Bin 14135 -> 0 bytes .../mame-p5/panel-edges/counts-27-28.png | Bin 13528 -> 0 bytes .../mame-p5/stability-pass/sprinter/0000.png | Bin 8285 -> 0 bytes .../mame-p5/stability-pass/sprinter/0001.png | Bin 11208 -> 0 bytes .../mame-p5/stability-pass/sprinter/0002.png | Bin 12719 -> 0 bytes .../mame-p5/stability-pass/sprinter/0003.png | Bin 12703 -> 0 bytes .../mame-p5/stability-pass/sprinter/0004.png | Bin 12773 -> 0 bytes .../mame-p5/stability-pass/sprinter/0005.png | Bin 2314 -> 0 bytes .../mame-p5/stability-pass/sprinter/0006.png | Bin 2314 -> 0 bytes .../mame-p5/stability-pass/sprinter/0007.png | Bin 2314 -> 0 bytes .../stability-precommit/sprinter/0000.png | Bin 8299 -> 0 bytes .../stability-precommit/sprinter/0001.png | Bin 11208 -> 0 bytes .../stability-precommit/sprinter/0002.png | Bin 12720 -> 0 bytes .../stability-precommit/sprinter/0003.png | Bin 12704 -> 0 bytes .../stability-precommit/sprinter/0004.png | Bin 12774 -> 0 bytes .../stability-precommit/sprinter/0005.png | Bin 2314 -> 0 bytes .../stability-precommit/sprinter/0006.png | Bin 2314 -> 0 bytes .../stability-precommit/sprinter/0007.png | Bin 2314 -> 0 bytes .../mame-p5/stability-run/sprinter/0000.png | Bin 8318 -> 0 bytes .../mame-p5/stability-run/sprinter/0001.png | Bin 11208 -> 0 bytes .../mame-p5/stability-run/sprinter/0002.png | Bin 12498 -> 0 bytes .../mame-p5/stability-run/sprinter/0003.png | Bin 12569 -> 0 bytes .../mame-p5/stability-run/sprinter/0004.png | Bin 12637 -> 0 bytes .../mame-p5/stability-run/sprinter/0005.png | Bin 2314 -> 0 bytes .../mame-p5/stability-run/sprinter/0006.png | Bin 2314 -> 0 bytes .../mame-p5/stability-run/sprinter/0007.png | Bin 2314 -> 0 bytes .../mame-p5/stability/cleanup-cycle-1.png | Bin 2314 -> 0 bytes .../mame-p5/stability/cleanup-cycle-2.png | Bin 2314 -> 0 bytes .../mame-p5/stability/cleanup-cycle-3.png | Bin 2314 -> 0 bytes .../mame-p5/stability/copy-large-progress.png | Bin 12719 -> 0 bytes .../stability/twenty-copy-hundred-refresh.png | Bin 12773 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0000.png | Bin 8228 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0001.png | Bin 15833 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0002.png | Bin 18104 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0003.png | Bin 18075 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0004.png | Bin 8475 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0005.png | Bin 9424 -> 0 bytes .../mame-p5/viewer-openfix/sprinter/0006.png | Bin 2314 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0000.png | Bin 8232 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0001.png | Bin 15833 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0002.png | Bin 18104 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0003.png | Bin 18075 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0004.png | Bin 8475 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0005.png | Bin 9423 -> 0 bytes .../mame-p5/viewer-pass/sprinter/0006.png | Bin 2314 -> 0 bytes .../mame-p5/viewer-run/sprinter/0000.png | Bin 8226 -> 0 bytes .../mame-p5/viewer-run/sprinter/0001.png | Bin 15833 -> 0 bytes .../mame-p5/viewer-run/sprinter/0002.png | Bin 18104 -> 0 bytes .../mame-p5/viewer-run/sprinter/0003.png | Bin 18075 -> 0 bytes .../mame-p5/viewer-run/sprinter/0004.png | Bin 8464 -> 0 bytes .../mame-p5/viewer-run/sprinter/0005.png | Bin 9414 -> 0 bytes .../mame-p5/viewer-run/sprinter/0006.png | Bin 2875 -> 0 bytes .../mame-p5/viewer/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p5/viewer/commander-restored.png | Bin 9424 -> 0 bytes .../artifacts/mame-p5/viewer/mdview-main.png | Bin 15833 -> 0 bytes .../mame-p5/viewer/mdview-pagedown.png | Bin 18075 -> 0 bytes .../artifacts/mame-p5/viewer/mdview-raw.png | Bin 18104 -> 0 bytes .../mame-p6/sort-final/sprinter/0000.png | Bin 8658 -> 0 bytes .../mame-p6/sort-final/sprinter/0001.png | Bin 9087 -> 0 bytes .../mame-p6/sort-final/sprinter/0002.png | Bin 9170 -> 0 bytes .../mame-p6/sort-final/sprinter/0003.png | Bin 9132 -> 0 bytes .../mame-p6/sort-final/sprinter/0004.png | Bin 9108 -> 0 bytes .../mame-p6/sort-final/sprinter/0005.png | Bin 8940 -> 0 bytes .../mame-p6/sort-final/sprinter/0006.png | Bin 9289 -> 0 bytes .../mame-p6/sort-final/sprinter/0007.png | Bin 8934 -> 0 bytes .../mame-p6/sort-final/sprinter/0008.png | Bin 9291 -> 0 bytes .../mame-p6/sort-final/sprinter/0009.png | Bin 8955 -> 0 bytes .../mame-p6/sort-final/sprinter/0010.png | Bin 8805 -> 0 bytes .../mame-p6/sort-final/sprinter/0011.png | Bin 2314 -> 0 bytes .../mame-p6/sort-run/sprinter/0000.png | Bin 8658 -> 0 bytes .../mame-p6/sort-run/sprinter/0001.png | Bin 9087 -> 0 bytes .../mame-p6/sort-run/sprinter/0002.png | Bin 9170 -> 0 bytes .../mame-p6/sort-run/sprinter/0003.png | Bin 9132 -> 0 bytes .../mame-p6/sort-run/sprinter/0004.png | Bin 9108 -> 0 bytes .../mame-p6/sort-run/sprinter/0005.png | Bin 8940 -> 0 bytes .../mame-p6/sort-run/sprinter/0006.png | Bin 9289 -> 0 bytes .../mame-p6/sort-run/sprinter/0007.png | Bin 8934 -> 0 bytes .../mame-p6/sort-run/sprinter/0008.png | Bin 9291 -> 0 bytes .../mame-p6/sort-run/sprinter/0009.png | Bin 8955 -> 0 bytes .../mame-p6/sort-run/sprinter/0010.png | Bin 8805 -> 0 bytes .../mame-p6/sort-run/sprinter/0011.png | Bin 2314 -> 0 bytes .../mame-p6/sort/clean-dss-return.png | Bin 2314 -> 0 bytes .../artifacts/mame-p6/sort/date-ascending.png | Bin 8940 -> 0 bytes .../mame-p6/sort/date-descending.png | Bin 9289 -> 0 bytes .../mame-p6/sort/extension-ascending.png | Bin 9087 -> 0 bytes .../mame-p6/sort/extension-descending.png | Bin 9170 -> 0 bytes .../mame-p6/sort/independent-panels.png | Bin 8955 -> 0 bytes .../artifacts/mame-p6/sort/name-ascending.png | Bin 8658 -> 0 bytes .../mame-p6/sort/name-descending.png | Bin 9291 -> 0 bytes .../mame-p6/sort/name-reset-ascending.png | Bin 8934 -> 0 bytes .../mame-p6/sort/refresh-keeps-mode.png | Bin 8805 -> 0 bytes .../artifacts/mame-p6/sort/size-ascending.png | Bin 9132 -> 0 bytes .../mame-p6/sort/size-descending.png | Bin 9108 -> 0 bytes .../mame-p7/select-final/sprinter/0000.png | Bin 8829 -> 0 bytes .../mame-p7/select-final/sprinter/0001.png | Bin 8694 -> 0 bytes .../mame-p7/select-final/sprinter/0002.png | Bin 8921 -> 0 bytes .../mame-p7/select-final/sprinter/0003.png | Bin 9056 -> 0 bytes .../mame-p7/select-final/sprinter/0004.png | Bin 8919 -> 0 bytes .../mame-p7/select-final/sprinter/0005.png | Bin 8862 -> 0 bytes .../mame-p7/select-final/sprinter/0006.png | Bin 2314 -> 0 bytes .../sprinter/0000.png | Bin 8851 -> 0 bytes .../sprinter/0001.png | Bin 8715 -> 0 bytes .../sprinter/0002.png | Bin 8930 -> 0 bytes .../sprinter/0003.png | Bin 9069 -> 0 bytes .../sprinter/0004.png | Bin 8938 -> 0 bytes .../sprinter/0005.png | Bin 8862 -> 0 bytes .../sprinter/0006.png | Bin 9840 -> 0 bytes .../sprinter/0007.png | Bin 9886 -> 0 bytes .../sprinter/0008.png | Bin 8727 -> 0 bytes .../sprinter/0009.png | Bin 8740 -> 0 bytes .../sprinter/0010.png | Bin 8739 -> 0 bytes .../sprinter/0011.png | Bin 2314 -> 0 bytes .../mame-p7/select-run/sprinter/0000.png | Bin 8829 -> 0 bytes .../mame-p7/select-run/sprinter/0001.png | Bin 8694 -> 0 bytes .../mame-p7/select-run/sprinter/0002.png | Bin 8877 -> 0 bytes .../mame-p7/select-run/sprinter/0003.png | Bin 9029 -> 0 bytes .../mame-p7/select-run/sprinter/0004.png | Bin 8870 -> 0 bytes .../mame-p7/select-run/sprinter/0005.png | Bin 8853 -> 0 bytes .../mame-p7/select-run/sprinter/0006.png | Bin 2314 -> 0 bytes .../mame-p7/select/clean-dss-return.png | Bin 2314 -> 0 bytes .../artifacts/mame-p7/select/insert-three.png | Bin 8921 -> 0 bytes .../artifacts/mame-p7/select/inverted.png | Bin 8938 -> 0 bytes .../mame-p7/select/refresh-clears.png | Bin 8862 -> 0 bytes .../mame-p7/select/sort-keeps-selection.png | Bin 9056 -> 0 bytes .../mame-p7/select/virtual-entry-guard.png | Bin 8694 -> 0 bytes .../mame-p8/masks-run/sprinter/0000.png | Bin 8830 -> 0 bytes .../mame-p8/masks-run/sprinter/0001.png | Bin 8694 -> 0 bytes .../mame-p8/masks-run/sprinter/0002.png | Bin 8913 -> 0 bytes .../mame-p8/masks-run/sprinter/0003.png | Bin 9062 -> 0 bytes .../mame-p8/masks-run/sprinter/0004.png | Bin 8910 -> 0 bytes .../mame-p8/masks-run/sprinter/0005.png | Bin 8855 -> 0 bytes .../mame-p8/masks-run/sprinter/0006.png | Bin 9831 -> 0 bytes .../mame-p8/masks-run/sprinter/0007.png | Bin 9878 -> 0 bytes .../mame-p8/masks-run/sprinter/0008.png | Bin 8721 -> 0 bytes .../mame-p8/masks-run/sprinter/0009.png | Bin 8738 -> 0 bytes .../mame-p8/masks-run/sprinter/0010.png | Bin 8737 -> 0 bytes .../mame-p8/masks-run/sprinter/0011.png | Bin 2314 -> 0 bytes .../artifacts/mame-p8/masks/b-unselected.png | Bin 8738 -> 0 bytes .../artifacts/mame-p8/masks/bin-selected.png | Bin 8721 -> 0 bytes .../mame-p8/masks/cancel-preserves.png | Bin 8737 -> 0 bytes .../mame-p8/masks/clean-dss-return.png | Bin 2314 -> 0 bytes .../mame-p8/masks/default-dialog.png | Bin 9831 -> 0 bytes .../mame-p8/masks/edited-bin-mask.png | Bin 9878 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0000.png | Bin 8389 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0001.png | Bin 9308 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0002.png | Bin 8471 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0003.png | Bin 8461 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0004.png | Bin 8581 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0005.png | Bin 8329 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0006.png | Bin 8287 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0007.png | Bin 8536 -> 0 bytes .../mame-p9/mkdir-run/sprinter/0008.png | Bin 2314 -> 0 bytes .../mame-p9/mkdir/clean-dss-return.png | Bin 2314 -> 0 bytes .../artifacts/mame-p9/mkdir/created.png | Bin 8471 -> 0 bytes .../artifacts/mame-p9/mkdir/dialog-empty.png | Bin 9308 -> 0 bytes .../mame-p9/mkdir/duplicate-error.png | Bin 8461 -> 0 bytes .../mame-p9/mkdir/entered-newdir.png | Bin 8287 -> 0 bytes .../artifacts/mame-p9/mkdir/invalid-name.png | Bin 8581 -> 0 bytes .../mame-ui/selected-footer-clean.png | Bin 9202 -> 0 bytes .../mame-ui/vc-footer/sprinter/0000.png | Bin 8851 -> 0 bytes .../mame-ui/vc-footer/sprinter/0001.png | Bin 8715 -> 0 bytes .../mame-ui/vc-footer/sprinter/0002.png | Bin 9093 -> 0 bytes .../mame-ui/vc-footer/sprinter/0003.png | Bin 9234 -> 0 bytes .../mame-ui/vc-footer/sprinter/0004.png | Bin 9087 -> 0 bytes .../mame-ui/vc-footer/sprinter/0005.png | Bin 8861 -> 0 bytes .../mame-ui/vc-footer/sprinter/0006.png | Bin 9838 -> 0 bytes .../mame-ui/vc-footer/sprinter/0007.png | Bin 9886 -> 0 bytes .../mame-ui/vc-footer/sprinter/0008.png | Bin 8907 -> 0 bytes .../mame-ui/vc-footer/sprinter/0009.png | Bin 8907 -> 0 bytes .../mame-ui/vc-footer/sprinter/0010.png | Bin 8905 -> 0 bytes .../mame-ui/vc-footer/sprinter/0011.png | Bin 2314 -> 0 bytes .../Volkov/docs/commander-architecture.md | 678 - applications/Volkov/docs/commander-keymap.md | 324 - .../Volkov/docs/commander-requirements.md | 427 - applications/Volkov/docs/commander-roadmap.md | 751 - .../Volkov/docs/dss-large-directories.md | 100 - .../Volkov/docs/p1-platform-probes.md | 324 - .../Volkov/docs/p10-rename-results.md | 77 - .../Volkov/docs/p11-delete-results.md | 71 - .../Volkov/docs/p12-group-copy-results.md | 78 - .../Volkov/docs/p13-group-delete-results.md | 78 - .../Volkov/docs/p14-default-colors-results.md | 62 - .../Volkov/docs/p15-tree-copy-results.md | 117 - .../docs/p16-group-tree-copy-results.md | 72 - .../Volkov/docs/p17-tree-delete-results.md | 101 - .../Volkov/docs/p18-metadata-results.md | 89 - .../Volkov/docs/p19-copy-policy-results.md | 129 - .../Volkov/docs/p2-palette-results.md | 81 - applications/Volkov/docs/p2-screen-backend.md | 270 - .../Volkov/docs/p2-screen-probe-results.md | 81 - .../Volkov/docs/p2-skeleton-results.md | 98 - applications/Volkov/docs/p3-panel-results.md | 146 - applications/Volkov/docs/p4-copy-results.md | 98 - applications/Volkov/docs/p4-exec-results.md | 100 - .../Volkov/docs/p5-stability-results.md | 215 - applications/Volkov/docs/p6-sort-results.md | 98 - .../Volkov/docs/p7-selection-results.md | 73 - applications/Volkov/docs/p8-mask-results.md | 69 - applications/Volkov/docs/p9-mkdir-results.md | 71 - applications/Volkov/docs/poc-0.1-release.md | 85 - applications/Volkov/docs/test-media.md | 90 - applications/Volkov/docs/ui-reference.md | 53 - applications/Volkov/include/sc_app.h | 49 - applications/Volkov/include/sc_command.h | 43 - applications/Volkov/include/sc_copy.h | 59 - applications/Volkov/include/sc_copy_ui.h | 10 - applications/Volkov/include/sc_disk.h | 11 - applications/Volkov/include/sc_entry.h | 27 - applications/Volkov/include/sc_exec.h | 8 - applications/Volkov/include/sc_exec_ui.h | 10 - applications/Volkov/include/sc_file_ops.h | 17 - applications/Volkov/include/sc_file_ui.h | 12 - applications/Volkov/include/sc_glyphs.h | 40 - applications/Volkov/include/sc_input.h | 21 - applications/Volkov/include/sc_metadata.h | 13 - applications/Volkov/include/sc_panel.h | 41 - applications/Volkov/include/sc_path.h | 12 - applications/Volkov/include/sc_screen.h | 38 - applications/Volkov/include/sc_select.h | 16 - applications/Volkov/include/sc_sort.h | 11 - applications/Volkov/include/sc_source.h | 11 - applications/Volkov/include/sc_store.h | 14 - applications/Volkov/include/sc_theme.h | 31 - applications/Volkov/include/sc_tree.h | 43 - applications/Volkov/include/sc_video.h | 22 - applications/Volkov/sdk.mk | 11 - applications/Volkov/src/sc_app.c | 405 - applications/Volkov/src/sc_command.c | 49 - applications/Volkov/src/sc_copy_job.c | 533 - applications/Volkov/src/sc_copy_ui.c | 556 - applications/Volkov/src/sc_dialog.c | 169 - applications/Volkov/src/sc_disk.c | 82 - applications/Volkov/src/sc_draw.c | 358 - applications/Volkov/src/sc_exec_ui.c | 207 - applications/Volkov/src/sc_file_ui.c | 407 - applications/Volkov/src/sc_input.c | 35 - applications/Volkov/src/sc_metadata.c | 143 - applications/Volkov/src/sc_name.c | 53 - applications/Volkov/src/sc_panel.c | 63 - applications/Volkov/src/sc_path.c | 40 - applications/Volkov/src/sc_platform_exec.c | 30 - applications/Volkov/src/sc_platform_screen.c | 54 - applications/Volkov/src/sc_rename.c | 55 - applications/Volkov/src/sc_screen.c | 176 - applications/Volkov/src/sc_select.c | 130 - applications/Volkov/src/sc_sort.c | 164 - applications/Volkov/src/sc_source_fs.c | 246 - applications/Volkov/src/sc_store.c | 46 - applications/Volkov/src/sc_theme.c | 108 - applications/Volkov/src/sc_tree.c | 432 - applications/Volkov/src/sc_video_system.c | 58 - applications/Volkov/src/sprcmd.c | 23 - .../Volkov/tests/check_p10_rename_hdd.sh | 24 - .../Volkov/tests/check_p11_delete_hdd.sh | 24 - .../Volkov/tests/check_p12_group_copy_hdd.sh | 24 - .../tests/check_p13_group_delete_hdd.sh | 24 - .../tests/check_p14_default_colors_hdd.sh | 24 - .../Volkov/tests/check_p15_tree_cancel_hdd.sh | 24 - .../Volkov/tests/check_p15_tree_copy_hdd.sh | 24 - .../Volkov/tests/check_p15_tree_self_hdd.sh | 24 - .../tests/check_p16_group_tree_copy_hdd.sh | 24 - .../tests/check_p17_tree_delete_cancel_hdd.sh | 24 - .../Volkov/tests/check_p17_tree_delete_hdd.sh | 24 - .../Volkov/tests/check_p18_metadata_hdd.sh | 18 - .../Volkov/tests/check_p19_overwrite_hdd.sh | 23 - .../Volkov/tests/check_p19_policy_hdd.sh | 23 - .../Volkov/tests/check_p4_copy_hdd.sh | 24 - .../Volkov/tests/check_p4_exec_hdd.sh | 24 - .../Volkov/tests/check_p5_copy_faults_hdd.sh | 24 - .../Volkov/tests/check_p5_enospc_hdd.sh | 25 - applications/Volkov/tests/check_p5_hdd.sh | 24 - .../Volkov/tests/check_p5_media_hdd.sh | 24 - .../Volkov/tests/check_p6_sort_hdd.sh | 24 - .../Volkov/tests/check_p7_select_hdd.sh | 24 - .../Volkov/tests/check_p9_mkdir_hdd.sh | 24 - .../Volkov/tests/fixtures/mdview2/LICENSE | 41 - .../Volkov/tests/fixtures/mdview2/ORIGIN.md | 8 - .../Volkov/tests/fixtures/mdview2/README.md | 153 - .../Volkov/tests/fixtures/mdview2/mdview2.c | 1338 - .../Volkov/tests/fixtures/mdview2/mdview2.h | 304 - .../tests/fixtures/mdview2/mdview2_conf.h | 16 - .../tests/fixtures/mdview2/mdview2_enc.c | 319 - .../tests/fixtures/mdview2/mdview2_help.c | 106 - .../tests/fixtures/mdview2/mdview2_hex.c | 209 - .../tests/fixtures/mdview2/mdview2_index.c | 1031 - .../tests/fixtures/mdview2/mdview2_md.c | 227 - .../tests/fixtures/mdview2/mdview2_raw.c | 308 - .../tests/fixtures/mdview2/mdview2_status.c | 192 - .../tests/fixtures/mdview2/mdview2_table.c | 91 - .../Volkov/tests/make_p10_rename_hdd.sh | 22 - .../Volkov/tests/make_p11_delete_hdd.sh | 22 - .../Volkov/tests/make_p12_group_copy_hdd.sh | 21 - .../Volkov/tests/make_p13_group_delete_hdd.sh | 21 - .../tests/make_p14_default_colors_hdd.sh | 21 - .../Volkov/tests/make_p15_tree_cancel_hdd.sh | 21 - .../Volkov/tests/make_p15_tree_copy_hdd.sh | 21 - .../Volkov/tests/make_p15_tree_self_hdd.sh | 21 - .../tests/make_p16_group_tree_copy_hdd.sh | 21 - .../tests/make_p17_tree_delete_cancel_hdd.sh | 21 - .../Volkov/tests/make_p17_tree_delete_hdd.sh | 21 - .../Volkov/tests/make_p18_metadata_hdd.sh | 37 - .../Volkov/tests/make_p19_overwrite_hdd.sh | 31 - .../Volkov/tests/make_p19_policy_hdd.sh | 31 - .../Volkov/tests/make_p3_stress_floppy.sh | 47 - .../Volkov/tests/make_p3_stress_hdd.sh | 54 - applications/Volkov/tests/make_p4_copy_hdd.sh | 27 - applications/Volkov/tests/make_p4_exec_hdd.sh | 32 - .../Volkov/tests/make_p5_copy_faults_hdd.sh | 26 - .../Volkov/tests/make_p5_enospc_hdd.sh | 28 - applications/Volkov/tests/make_p5_hdd.sh | 27 - .../Volkov/tests/make_p5_media_hdd.sh | 25 - .../Volkov/tests/make_p5_panel_edges_hdd.sh | 39 - .../Volkov/tests/make_p5_viewer_hdd.sh | 29 - applications/Volkov/tests/make_p6_sort_hdd.sh | 26 - .../Volkov/tests/make_p7_select_hdd.sh | 24 - .../Volkov/tests/make_p9_mkdir_hdd.sh | 24 - .../Volkov/tests/mame_image_probe.lua | 15 - applications/Volkov/tests/mame_p10_rename.lua | 148 - applications/Volkov/tests/mame_p11_delete.lua | 140 - .../Volkov/tests/mame_p12_group_copy.lua | 125 - .../Volkov/tests/mame_p13_group_delete.lua | 121 - .../Volkov/tests/mame_p14_default_colors.lua | 106 - .../Volkov/tests/mame_p15_tree_cancel.lua | 105 - .../Volkov/tests/mame_p15_tree_copy.lua | 119 - .../Volkov/tests/mame_p15_tree_self.lua | 109 - .../Volkov/tests/mame_p16_group_tree_copy.lua | 109 - .../Volkov/tests/mame_p17_tree_delete.lua | 121 - .../tests/mame_p17_tree_delete_cancel.lua | 110 - .../Volkov/tests/mame_p18_metadata.lua | 109 - .../Volkov/tests/mame_p19_overwrite.lua | 88 - applications/Volkov/tests/mame_p19_policy.lua | 139 - .../Volkov/tests/mame_p2_skeleton.lua | 130 - .../Volkov/tests/mame_p3_dir_probe.lua | 104 - .../Volkov/tests/mame_p3_enum_matrix.lua | 98 - applications/Volkov/tests/mame_p3_panels.lua | 137 - .../Volkov/tests/mame_p3_scan_probe.lua | 107 - applications/Volkov/tests/mame_p3_stress.lua | 137 - .../Volkov/tests/mame_p4_copy_hdd.lua | 142 - .../Volkov/tests/mame_p4_exec_hdd.lua | 141 - .../Volkov/tests/mame_p5_copy_faults.lua | 108 - applications/Volkov/tests/mame_p5_enospc.lua | 125 - .../Volkov/tests/mame_p5_media_change.lua | 133 - .../Volkov/tests/mame_p5_panel_edges.lua | 124 - .../Volkov/tests/mame_p5_stability.lua | 166 - applications/Volkov/tests/mame_p5_viewer.lua | 127 - applications/Volkov/tests/mame_p6_sort.lua | 143 - applications/Volkov/tests/mame_p7_select.lua | 148 - applications/Volkov/tests/mame_p9_mkdir.lua | 136 - .../Volkov/tests/p10_rename_fixture.py | 75 - applications/Volkov/tests/p10_rename_probe.c | 110 - .../Volkov/tests/p11_delete_fixture.py | 76 - applications/Volkov/tests/p11_delete_probe.c | 85 - .../Volkov/tests/p12_group_copy_fixture.py | 74 - .../Volkov/tests/p13_group_delete_fixture.py | 58 - .../tests/p14_default_colors_fixture.py | 52 - .../Volkov/tests/p15_tree_cancel_fixture.py | 67 - .../Volkov/tests/p15_tree_copy_fixture.py | 72 - .../Volkov/tests/p15_tree_self_fixture.py | 49 - .../tests/p16_group_tree_copy_fixture.py | 76 - .../tests/p17_tree_delete_cancel_fixture.py | 73 - .../Volkov/tests/p17_tree_delete_fixture.py | 86 - .../Volkov/tests/p18_metadata_fixture.py | 175 - .../Volkov/tests/p19_overwrite_fixture.py | 86 - .../Volkov/tests/p19_overwrite_probe.c | 121 - .../Volkov/tests/p19_policy_fixture.py | 78 - .../Volkov/tests/p1_platform/Makefile | 31 - .../tests/p1_platform/mame_dump_keys.lua | 25 - .../tests/p1_platform/mame_p1_keyboard.lua | 147 - .../Volkov/tests/p1_platform/p1_dir.c | 173 - .../Volkov/tests/p1_platform/p1_emm.c | 96 - .../Volkov/tests/p1_platform/p1_exec_test.c | 116 - .../Volkov/tests/p1_platform/p1_keyboard.c | 45 - .../Volkov/tests/p1_platform/p1_platform.h | 43 - .../Volkov/tests/p1_platform/p1_screen.c | 120 - .../Volkov/tests/p1_platform/p1_sys.c | 143 - .../Volkov/tests/p1_platform/p1child.c | 35 - .../Volkov/tests/p1_platform/p1probe.c | 117 - applications/Volkov/tests/p2_palette/Makefile | 10 - .../Volkov/tests/p2_palette/p2palette.c | 171 - applications/Volkov/tests/p2_screen/Makefile | 14 - .../Volkov/tests/p2_screen/p2_platform.c | 54 - .../Volkov/tests/p2_screen/p2_screen.h | 26 - .../Volkov/tests/p2_screen/p2screen.c | 432 - .../Volkov/tests/p2_screen/sc_glyphs.h | 41 - applications/Volkov/tests/p3_data/INNER.TXT | 1 - applications/Volkov/tests/p3_data/P3ROOT.TXT | 1 - applications/Volkov/tests/p3_data/README.md | 12 - applications/Volkov/tests/p3_data/ZETA.BIN | 1 - .../Volkov/tests/p3_dir_probe/Makefile | 10 - .../Volkov/tests/p3_dir_probe/p3dir.c | 93 - .../Volkov/tests/p3_enum_matrix/Makefile | 10 - .../Volkov/tests/p3_enum_matrix/bank1_enum.c | 90 - .../Volkov/tests/p3_enum_matrix/p3map.c | 56 - .../Volkov/tests/p3_scan_probe/Makefile | 13 - .../Volkov/tests/p3_scan_probe/p3scan.c | 70 - .../Volkov/tests/p3_store_probe/Makefile | 12 - .../Volkov/tests/p3_store_probe/p3store.c | 128 - .../Volkov/tests/p4_bank_io_probe/Makefile | 10 - .../Volkov/tests/p4_bank_io_probe/p4bio.c | 136 - .../Volkov/tests/p4_exec_child/Makefile | 8 - .../Volkov/tests/p4_exec_child/p4child.c | 80 - applications/Volkov/tests/p4_exec_verify.py | 32 - applications/Volkov/tests/p4_fixture.py | 116 - applications/Volkov/tests/p5_copy_faults.c | 186 - .../Volkov/tests/p5_copy_faults_fixture.py | 98 - .../Volkov/tests/p5_enospc_fixture.py | 92 - applications/Volkov/tests/p5_fixture.py | 106 - applications/Volkov/tests/p5_media_fixture.py | 60 - applications/Volkov/tests/p6_sort_fixture.py | 77 - applications/Volkov/tests/p6_sort_probe.c | 201 - .../Volkov/tests/p7_select_fixture.py | 65 - applications/Volkov/tests/p7_select_probe.c | 162 - applications/Volkov/tests/p9_mkdir_fixture.py | 68 - applications/Volkov/tests/p9_mkdir_probe.c | 81 - applications/Volkov/tests/run_mame_hdd.sh | 28 - docs/TODO.md | 6 + docs/host-tests-plan.md | 2 +- docs/im2_isr_design.md | 2 +- docs/kbd-games.md | 4 +- docs/libc-reference.md | 10 +- docs/mame-autotest.md | 72 +- docs/mame-source-debug-status.md | 3 + docs/mame-source-debug.md | 8 +- docs/mdview_guide_and_test_patterns.md | 2 +- docs/project-reorganization.md | 102 +- docs/sprite-api-design.md | 10 +- docs/vscode-sprinter-debug.md | 56 +- examples/.gitignore | 22 - examples/.python-version | 1 - examples/LICENSE | 21 - examples/Makefile | 11 - examples/README.md | 22 - examples/balls/Makefile | 3 - examples/balls/balls.c | 185 - examples/balls/run.sh | 4 - examples/mdview/Makefile | 43 - examples/mdview/README.MD | 133 - examples/mdview/SAMPLE.MD | 5 - .../mdview-модель-документа-и-рендеринг.md | 103 - ...ванный рендеринг (Unified Wrap + Paragraph Model).md | 90 - examples/mdview/mdview.c | 2024 -- examples/mdview/todo2 | 180 - examples/mdview2/CHANGELOG.md | 79 - examples/mdview2/DEMO.MD | 840 - examples/mdview2/Makefile | 56 - examples/mdview2/README.md | 153 - examples/mdview2/READMEBG.MD | 799 - examples/mdview2/UTF8TEST.MD | 28 - examples/mdview2/docs/encoding-plan.md | 144 - examples/mdview2/docs/mdview2-plan.md | 164 - examples/mdview2/mdview2.c | 1338 - examples/mdview2/mdview2.h | 304 - examples/mdview2/mdview2_conf.h | 16 - examples/mdview2/mdview2_enc.c | 319 - examples/mdview2/mdview2_help.c | 106 - examples/mdview2/mdview2_hex.c | 209 - examples/mdview2/mdview2_index.c | 1031 - examples/mdview2/mdview2_md.c | 227 - examples/mdview2/mdview2_raw.c | 308 - examples/mdview2/mdview2_status.c | 192 - examples/mdview2/mdview2_table.c | 91 - examples/mdview2/testfiles/BIG.MD | 3278 -- examples/mdview2/testfiles/HUGE.MD | 6556 ---- examples/mdview2/testfiles/LINES.MD | 25004 ---------------- examples/mdview2/testfiles/TABLES.MD | 10502 ------- examples/mdview2/testfiles/gen_testfiles.py | 67 - examples/rpgwalk/.gitignore | 4 - examples/rpgwalk/Makefile | 36 - examples/rpgwalk/conv_sprites.py | 66 - examples/rpgwalk/rpgprof.c | 337 - examples/rpgwalk/rpgwalk.c | 230 - examples/scroll/Makefile | 3 - examples/scroll/run.sh | 4 - examples/scroll/scroll-impl-guide.md | 226 - examples/scroll/scroll.c | 87 - examples/sdk.mk | 8 - examples/space/.gitignore | 2 - examples/space/Makefile | 12 - examples/space/gen_sprites.py | 98 - examples/space/space.c | 189 - .../third_party/16x16-RPG-characters/LICENSE | 359 - .../16x16-RPG-characters/README.md | 27 - .../sprites/old-style/02-bard.png | Bin 7830 -> 0 bytes release_docs/en/examples.md | 84 +- release_docs/en/getting_started.md | 12 +- release_docs/ru/examples.md | 83 +- release_docs/ru/getting_started.md | 12 +- release_docs/ru/platform_reference.md | 4 +- tests/sdbg/run_mame_probe.py | 5 - tests/sdbg/run_vscode_dap_probe.py | 18 +- tests/sdbg/test_dap.py | 14 - tests/sdbg/test_sdbg.py | 16 + third_party/16x16-RPG-characters/LICENSE | 359 - third_party/16x16-RPG-characters/README.md | 27 - third_party/16x16-RPG-characters/preview.png | Bin 3387 -> 0 bytes .../sprites/new-style/chibi-layered.aseprite | Bin 3645 -> 0 bytes .../sprites/new-style/chibi-layered.png | Bin 1742 -> 0 bytes .../sprites/old-style/00-avatars.png | Bin 3276 -> 0 bytes .../sprites/old-style/00-guide.png | Bin 1607 -> 0 bytes .../sprites/old-style/01-generic.png | Bin 8196 -> 0 bytes .../sprites/old-style/02-bard.png | Bin 7830 -> 0 bytes .../sprites/old-style/03-soldier.png | Bin 8203 -> 0 bytes .../sprites/old-style/04-scout.png | Bin 7222 -> 0 bytes .../sprites/old-style/05-devout.png | Bin 8706 -> 0 bytes .../sprites/old-style/06-conjurer.png | Bin 8565 -> 0 bytes toolchain/apply-mame-sdbg-patch.sh | 18 - toolchain/make_hdd.sh | 2 +- toolchain/make_release.sh | 11 +- .../0001-sdbg-debugger-backend.patch | 129 - toolchain/mame_interactive.py | 2 - toolchain/png_strip.py | 2 +- toolchain/pop_extract_font.py | 208 - toolchain/pop_pack_intro.py | 349 - toolchain/pop_pack_title.py | 137 - toolchain/room_compose.py | 2 +- toolchain/run-mame-mcp.sh | 11 +- toolchain/sdbg/model.py | 18 +- toolchain/sdbg_dap.py | 4 + toolchain/sdbg_driver.py | 6 +- toolchain/sdbg_launcher.py | 27 +- toolchain/size_check.py | 4 +- toolchain/vscode-sprinter-debug/LICENSE | 21 - toolchain/vscode-sprinter-debug/README.md | 81 - toolchain/vscode-sprinter-debug/build.js | 53 - toolchain/vscode-sprinter-debug/build.test.js | 40 - toolchain/vscode-sprinter-debug/extension.js | 199 - .../vscode-sprinter-debug/extension.test.js | 134 - toolchain/vscode-sprinter-debug/package.json | 205 - toolchain/vscode-sprinter-debug/runtime.js | 97 - .../vscode-sprinter-debug/runtime.test.js | 67 - 1965 files changed, 373 insertions(+), 201393 deletions(-) delete mode 100644 applications/PoP/.gitignore delete mode 100644 applications/PoP/.python-version delete mode 100644 applications/PoP/CLAUDE.md delete mode 100644 applications/PoP/LICENSE delete mode 100644 applications/PoP/README.md delete mode 100644 applications/PoP/bgtest/Makefile delete mode 100644 applications/PoP/bgtest/bgtest.c delete mode 100644 applications/PoP/coltest/Makefile delete mode 100644 applications/PoP/coltest/coltest.c delete mode 100644 applications/PoP/docs/APPLEII_RESOURCE_FORMAT.md delete mode 100644 applications/PoP/docs/KID_PLAN.md delete mode 100644 applications/PoP/docs/MSDOS_RESOURCE_FORMAT.md delete mode 100644 applications/PoP/docs/POP-DAT-FormatSpecifications.pdf delete mode 100644 applications/PoP/docs/POP-DAT-FormatSpecifications.txt delete mode 100644 applications/PoP/docs/PORT_PLAN.md delete mode 100644 applications/PoP/docs/README.md delete mode 100644 applications/PoP/docs/frame_pacing_plan.md delete mode 100644 applications/PoP/docs/full_game_plan.md delete mode 100644 applications/PoP/docs/gates_spikes_plan.md delete mode 100644 applications/PoP/docs/host_tests_plan.md delete mode 100644 applications/PoP/docs/ideas_backlog.md delete mode 100644 applications/PoP/docs/impl_diff.md delete mode 100644 applications/PoP/docs/keys.txt delete mode 100644 applications/PoP/docs/l9_invert_plan.md delete mode 100644 applications/PoP/docs/layout_plan_v2.md delete mode 100644 applications/PoP/docs/levels_12_15_plan.md delete mode 100644 applications/PoP/docs/levels_plan.md delete mode 100644 applications/PoP/docs/menu_settings_plan.md delete mode 100644 applications/PoP/docs/midtable_analysis.md delete mode 100644 applications/PoP/docs/palette_plan.md delete mode 100644 applications/PoP/docs/perf_backlog.md delete mode 100644 applications/PoP/docs/perf_cyan_phase.md delete mode 100644 applications/PoP/docs/perf_green_phase.md delete mode 100644 applications/PoP/docs/perf_l11_room15.md delete mode 100644 applications/PoP/docs/perf_l13_room23.md delete mode 100644 applications/PoP/docs/perf_registry.md delete mode 100644 applications/PoP/docs/prng_alternatives.md delete mode 100644 applications/PoP/docs/quicksave_plan.md delete mode 100644 applications/PoP/docs/resident_budget.md delete mode 100644 applications/PoP/docs/room_model_plan.md delete mode 100644 applications/PoP/docs/roomnav_skip.md delete mode 100644 applications/PoP/docs/shadow_atlas_plan.md delete mode 100644 applications/PoP/docs/shadow_render.md delete mode 100644 applications/PoP/docs/sound_plan.md delete mode 100644 applications/PoP/docs/status_line_text.md delete mode 100644 applications/PoP/poc/Makefile delete mode 100644 applications/PoP/poc/level.h delete mode 100644 applications/PoP/poc/poc.c delete mode 100644 applications/PoP/poc/res/bg/bg.arc delete mode 100644 applications/PoP/poc/res/bg/pal_env0.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env1.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env2.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env3.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env4.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env5.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env6.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env7.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env8.atl delete mode 100644 applications/PoP/poc/res/bg/pal_env9.atl delete mode 100644 applications/PoP/poc/res/bg/pal_fore.atl delete mode 100644 applications/PoP/poc/res/bg/pal_tile.pal delete mode 100644 applications/PoP/poc/res/bg/pal_wall.atl delete mode 100644 applications/PoP/poc/res/bg/pop_bg.pal delete mode 100644 applications/PoP/poc/res/bg/pop_bg_atlas.h delete mode 100644 applications/PoP/poc/res/bg/pop_env0.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env1.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env2.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env3.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env4.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env5.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env6.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env7.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env8.atl delete mode 100644 applications/PoP/poc/res/bg/pop_env9.atl delete mode 100644 applications/PoP/poc/res/bg/pop_fore.atl delete mode 100644 applications/PoP/poc/res/bg/pop_pot.atl delete mode 100644 applications/PoP/poc/res/bg/pop_tile.pal delete mode 100644 applications/PoP/poc/res/bg/pop_wall.atl delete mode 100644 applications/PoP/poc/res/font/font.atl delete mode 100644 applications/PoP/poc/res/guard/g0.atl delete mode 100644 applications/PoP/poc/res/guard/g0_v.atl delete mode 100644 applications/PoP/poc/res/guard/g1.atl delete mode 100644 applications/PoP/poc/res/guard/g1_v.atl delete mode 100644 applications/PoP/poc/res/guard/g2.atl delete mode 100644 applications/PoP/poc/res/guard/g2_v.atl delete mode 100644 applications/PoP/poc/res/guard/g3.atl delete mode 100644 applications/PoP/poc/res/guard/g3_v.atl delete mode 100644 applications/PoP/poc/res/guard/g4.atl delete mode 100644 applications/PoP/poc/res/guard/g4_v.atl delete mode 100644 applications/PoP/poc/res/guard/guard.arc delete mode 100644 applications/PoP/poc/res/kid/kid.ani delete mode 100644 applications/PoP/poc/res/kid/kid.arc delete mode 100644 applications/PoP/poc/res/kid/kid.pal delete mode 100644 applications/PoP/poc/res/kid/kid0.atl delete mode 100644 applications/PoP/poc/res/kid/kid0_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid1.atl delete mode 100644 applications/PoP/poc/res/kid/kid10.atl delete mode 100644 applications/PoP/poc/res/kid/kid10_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid11.atl delete mode 100644 applications/PoP/poc/res/kid/kid11_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid12.atl delete mode 100644 applications/PoP/poc/res/kid/kid12_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid13.atl delete mode 100644 applications/PoP/poc/res/kid/kid13_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid14.atl delete mode 100644 applications/PoP/poc/res/kid/kid14_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid15.atl delete mode 100644 applications/PoP/poc/res/kid/kid15_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid16.atl delete mode 100644 applications/PoP/poc/res/kid/kid16_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid17.atl delete mode 100644 applications/PoP/poc/res/kid/kid17_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid18.atl delete mode 100644 applications/PoP/poc/res/kid/kid18_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid19.atl delete mode 100644 applications/PoP/poc/res/kid/kid19_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid1_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid2.atl delete mode 100644 applications/PoP/poc/res/kid/kid20.atl delete mode 100644 applications/PoP/poc/res/kid/kid20_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid21.atl delete mode 100644 applications/PoP/poc/res/kid/kid21_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid22.atl delete mode 100644 applications/PoP/poc/res/kid/kid22_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid23.atl delete mode 100644 applications/PoP/poc/res/kid/kid23_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid24.atl delete mode 100644 applications/PoP/poc/res/kid/kid24_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid25.atl delete mode 100644 applications/PoP/poc/res/kid/kid25_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid26.atl delete mode 100644 applications/PoP/poc/res/kid/kid26_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid27.atl delete mode 100644 applications/PoP/poc/res/kid/kid27_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid2_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid3.atl delete mode 100644 applications/PoP/poc/res/kid/kid3_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid4.atl delete mode 100644 applications/PoP/poc/res/kid/kid4_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid5.atl delete mode 100644 applications/PoP/poc/res/kid/kid5_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid6.atl delete mode 100644 applications/PoP/poc/res/kid/kid6_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid7.atl delete mode 100644 applications/PoP/poc/res/kid/kid7_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid8.atl delete mode 100644 applications/PoP/poc/res/kid/kid8_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid9.atl delete mode 100644 applications/PoP/poc/res/kid/kid9_v.atl delete mode 100644 applications/PoP/poc/res/kid/kid_atlas.h delete mode 100644 applications/PoP/poc/res/kid/sword.atl delete mode 100644 applications/PoP/poc/res/kid/sword_v.atl delete mode 100644 applications/PoP/poc/res/music/m24.bin delete mode 100644 applications/PoP/poc/res/music/m25.bin delete mode 100644 applications/PoP/poc/res/music/m26.bin delete mode 100644 applications/PoP/poc/res/music/m27.bin delete mode 100644 applications/PoP/poc/res/music/m28.bin delete mode 100644 applications/PoP/poc/res/music/m29.bin delete mode 100644 applications/PoP/poc/res/music/m30.bin delete mode 100644 applications/PoP/poc/res/music/m32.bin delete mode 100644 applications/PoP/poc/res/music/m33.bin delete mode 100644 applications/PoP/poc/res/music/m35.bin delete mode 100644 applications/PoP/poc/res/music/m36.bin delete mode 100644 applications/PoP/poc/res/music/m37.bin delete mode 100644 applications/PoP/poc/res/music/m39.bin delete mode 100644 applications/PoP/poc/res/music/m40.bin delete mode 100644 applications/PoP/poc/res/music/m41.bin delete mode 100644 applications/PoP/poc/res/music/m43.bin delete mode 100644 applications/PoP/poc/res/music/m50.bin delete mode 100644 applications/PoP/poc/res/music/m52.bin delete mode 100644 applications/PoP/poc/res/music/m53.bin delete mode 100644 applications/PoP/poc/res/music/m54.bin delete mode 100644 applications/PoP/poc/res/music/m55.bin delete mode 100644 applications/PoP/poc/res/music/m56.bin delete mode 100644 applications/PoP/poc/res/pv/a0.atl delete mode 100644 applications/PoP/poc/res/pv/a1.atl delete mode 100644 applications/PoP/poc/res/pv/a2.atl delete mode 100644 applications/PoP/poc/res/pv/b0_0.atl delete mode 100644 applications/PoP/poc/res/pv/b0_1.atl delete mode 100644 applications/PoP/poc/res/pv/b0_2.atl delete mode 100644 applications/PoP/poc/res/pv/b0_3.atl delete mode 100644 applications/PoP/poc/res/pv/b0_4.atl delete mode 100644 applications/PoP/poc/res/pv/h0.atl delete mode 100644 applications/PoP/poc/res/pv/j0.atl delete mode 100644 applications/PoP/poc/res/pv/j1.atl delete mode 100644 applications/PoP/poc/res/pv/j2.atl delete mode 100644 applications/PoP/poc/res/pv/p0_0.atl delete mode 100644 applications/PoP/poc/res/pv/p0_1.atl delete mode 100644 applications/PoP/poc/res/pv/p0_2.atl delete mode 100644 applications/PoP/poc/res/pv/p0_3.atl delete mode 100644 applications/PoP/poc/res/pv/p0_4.atl delete mode 100644 applications/PoP/poc/res/pv/p1_0.atl delete mode 100644 applications/PoP/poc/res/pv/p1_1.atl delete mode 100644 applications/PoP/poc/res/pv/p1_2.atl delete mode 100644 applications/PoP/poc/res/pv/p1_3.atl delete mode 100644 applications/PoP/poc/res/pv/p1_4.atl delete mode 100644 applications/PoP/poc/res/pv/p2_0.atl delete mode 100644 applications/PoP/poc/res/pv/p2_1.atl delete mode 100644 applications/PoP/poc/res/pv/p2_2.atl delete mode 100644 applications/PoP/poc/res/pv/p2_3.atl delete mode 100644 applications/PoP/poc/res/pv/p2_4.atl delete mode 100644 applications/PoP/poc/res/pv/p3_0.atl delete mode 100644 applications/PoP/poc/res/pv/p3_1.atl delete mode 100644 applications/PoP/poc/res/pv/p3_2.atl delete mode 100644 applications/PoP/poc/res/pv/p3_3.atl delete mode 100644 applications/PoP/poc/res/pv/p3_4.atl delete mode 100644 applications/PoP/poc/res/pv/p4_0.atl delete mode 100644 applications/PoP/poc/res/pv/p4_1.atl delete mode 100644 applications/PoP/poc/res/pv/p4_2.atl delete mode 100644 applications/PoP/poc/res/pv/p4_3.atl delete mode 100644 applications/PoP/poc/res/pv/p4_4.atl delete mode 100644 applications/PoP/poc/res/pv/p5_0.atl delete mode 100644 applications/PoP/poc/res/pv/p5_1.atl delete mode 100644 applications/PoP/poc/res/pv/p5_2.atl delete mode 100644 applications/PoP/poc/res/pv/p5_3.atl delete mode 100644 applications/PoP/poc/res/pv/p5_4.atl delete mode 100644 applications/PoP/poc/res/pv/p6_0.atl delete mode 100644 applications/PoP/poc/res/pv/p6_1.atl delete mode 100644 applications/PoP/poc/res/pv/p6_2.atl delete mode 100644 applications/PoP/poc/res/pv/p6_3.atl delete mode 100644 applications/PoP/poc/res/pv/p6_4.atl delete mode 100644 applications/PoP/poc/res/pv/p7_0.atl delete mode 100644 applications/PoP/poc/res/pv/p7_1.atl delete mode 100644 applications/PoP/poc/res/pv/p7_2.atl delete mode 100644 applications/PoP/poc/res/pv/p7_3.atl delete mode 100644 applications/PoP/poc/res/pv/p7_4.atl delete mode 100644 applications/PoP/poc/res/pv/pv.arc delete mode 100644 applications/PoP/poc/res/pv/pv.pal delete mode 100644 applications/PoP/poc/res/pv/s0_0.atl delete mode 100644 applications/PoP/poc/res/pv/s0_1.atl delete mode 100644 applications/PoP/poc/res/pv/s0_2.atl delete mode 100644 applications/PoP/poc/res/pv/s0_3.atl delete mode 100644 applications/PoP/poc/res/pv/s0_4.atl delete mode 100644 applications/PoP/poc/res/pv/s1_0.atl delete mode 100644 applications/PoP/poc/res/pv/s1_1.atl delete mode 100644 applications/PoP/poc/res/pv/s1_2.atl delete mode 100644 applications/PoP/poc/res/pv/s1_3.atl delete mode 100644 applications/PoP/poc/res/pv/s1_4.atl delete mode 100644 applications/PoP/poc/res/pv/s2_0.atl delete mode 100644 applications/PoP/poc/res/pv/s2_1.atl delete mode 100644 applications/PoP/poc/res/pv/s2_2.atl delete mode 100644 applications/PoP/poc/res/pv/s2_3.atl delete mode 100644 applications/PoP/poc/res/pv/s2_4.atl delete mode 100644 applications/PoP/poc/res/pv/s3_0.atl delete mode 100644 applications/PoP/poc/res/pv/s3_1.atl delete mode 100644 applications/PoP/poc/res/pv/s3_2.atl delete mode 100644 applications/PoP/poc/res/pv/s3_3.atl delete mode 100644 applications/PoP/poc/res/pv/s3_4.atl delete mode 100644 applications/PoP/poc/res/pv/s4_0.atl delete mode 100644 applications/PoP/poc/res/pv/s4_1.atl delete mode 100644 applications/PoP/poc/res/pv/s4_2.atl delete mode 100644 applications/PoP/poc/res/pv/s4_3.atl delete mode 100644 applications/PoP/poc/res/pv/s4_4.atl delete mode 100644 applications/PoP/poc/res/pv/s5_0.atl delete mode 100644 applications/PoP/poc/res/pv/s5_1.atl delete mode 100644 applications/PoP/poc/res/pv/s5_2.atl delete mode 100644 applications/PoP/poc/res/pv/s5_3.atl delete mode 100644 applications/PoP/poc/res/pv/s5_4.atl delete mode 100644 applications/PoP/poc/res/pv/story.pal delete mode 100644 applications/PoP/poc/res/pv/t0.atl delete mode 100644 applications/PoP/poc/res/room1.dat delete mode 100644 applications/PoP/poc/res/shadow/sf0.atl delete mode 100644 applications/PoP/poc/res/shadow/sf1.atl delete mode 100644 applications/PoP/poc/res/shadow/sf2.atl delete mode 100644 applications/PoP/poc/res/shadow/sf3.atl delete mode 100644 applications/PoP/poc/res/shadow/shadow.arc delete mode 100644 applications/PoP/poc/res/shadow/sk0.atl delete mode 100644 applications/PoP/poc/res/shadow/sk1.atl delete mode 100644 applications/PoP/poc/res/shadow/sk10.atl delete mode 100644 applications/PoP/poc/res/shadow/sk11.atl delete mode 100644 applications/PoP/poc/res/shadow/sk12.atl delete mode 100644 applications/PoP/poc/res/shadow/sk13.atl delete mode 100644 applications/PoP/poc/res/shadow/sk14.atl delete mode 100644 applications/PoP/poc/res/shadow/sk15.atl delete mode 100644 applications/PoP/poc/res/shadow/sk16.atl delete mode 100644 applications/PoP/poc/res/shadow/sk17.atl delete mode 100644 applications/PoP/poc/res/shadow/sk18.atl delete mode 100644 applications/PoP/poc/res/shadow/sk19.atl delete mode 100644 applications/PoP/poc/res/shadow/sk2.atl delete mode 100644 applications/PoP/poc/res/shadow/sk20.atl delete mode 100644 applications/PoP/poc/res/shadow/sk21.atl delete mode 100644 applications/PoP/poc/res/shadow/sk22.atl delete mode 100644 applications/PoP/poc/res/shadow/sk23.atl delete mode 100644 applications/PoP/poc/res/shadow/sk24.atl delete mode 100644 applications/PoP/poc/res/shadow/sk25.atl delete mode 100644 applications/PoP/poc/res/shadow/sk26.atl delete mode 100644 applications/PoP/poc/res/shadow/sk27.atl delete mode 100644 applications/PoP/poc/res/shadow/sk3.atl delete mode 100644 applications/PoP/poc/res/shadow/sk4.atl delete mode 100644 applications/PoP/poc/res/shadow/sk5.atl delete mode 100644 applications/PoP/poc/res/shadow/sk6.atl delete mode 100644 applications/PoP/poc/res/shadow/sk7.atl delete mode 100644 applications/PoP/poc/res/shadow/sk8.atl delete mode 100644 applications/PoP/poc/res/shadow/sk9.atl delete mode 100644 applications/PoP/poc/res/skel/g0.atl delete mode 100644 applications/PoP/poc/res/skel/g1.atl delete mode 100644 applications/PoP/poc/res/skel/g2.atl delete mode 100644 applications/PoP/poc/res/skel/g3.atl delete mode 100644 applications/PoP/poc/res/skel/skel.arc delete mode 100644 applications/PoP/poc/res/sound/s0.bin delete mode 100644 applications/PoP/poc/res/sound/s1.bin delete mode 100644 applications/PoP/poc/res/sound/s2.bin delete mode 100644 applications/PoP/poc/res/sound/s3.bin delete mode 100644 applications/PoP/poc/res/sound/s4.bin delete mode 100644 applications/PoP/poc/res/sound/s5.bin delete mode 100644 applications/PoP/poc/res/sound/s6.bin delete mode 100644 applications/PoP/poc/res/sound/s7.bin delete mode 100644 applications/PoP/poc/res/sound/s8.bin delete mode 100644 applications/PoP/poc/res/sound/s9.bin delete mode 100644 applications/PoP/poc/res/sound/snd.arc delete mode 100644 applications/PoP/poc/res/tiles/0-0.png delete mode 100644 applications/PoP/poc/res/tiles/1-0.png delete mode 100644 applications/PoP/poc/res/tiles/10-0.png delete mode 100644 applications/PoP/poc/res/tiles/11-0.png delete mode 100644 applications/PoP/poc/res/tiles/12-0.png delete mode 100644 applications/PoP/poc/res/tiles/13-0.png delete mode 100644 applications/PoP/poc/res/tiles/14-0.png delete mode 100644 applications/PoP/poc/res/tiles/15-0.png delete mode 100644 applications/PoP/poc/res/tiles/16-0.png delete mode 100644 applications/PoP/poc/res/tiles/17-0.png delete mode 100644 applications/PoP/poc/res/tiles/18-0.png delete mode 100644 applications/PoP/poc/res/tiles/19-0.png delete mode 100644 applications/PoP/poc/res/tiles/1A-0.png delete mode 100644 applications/PoP/poc/res/tiles/1B-0.png delete mode 100644 applications/PoP/poc/res/tiles/1C-0.png delete mode 100644 applications/PoP/poc/res/tiles/1D-0.png delete mode 100644 applications/PoP/poc/res/tiles/1E-0.png delete mode 100644 applications/PoP/poc/res/tiles/1F-0.png delete mode 100644 applications/PoP/poc/res/tiles/2-0.png delete mode 100644 applications/PoP/poc/res/tiles/3-0.png delete mode 100644 applications/PoP/poc/res/tiles/4-0.png delete mode 100644 applications/PoP/poc/res/tiles/5-0.png delete mode 100644 applications/PoP/poc/res/tiles/6-0.png delete mode 100644 applications/PoP/poc/res/tiles/7-0.png delete mode 100644 applications/PoP/poc/res/tiles/8-0.png delete mode 100644 applications/PoP/poc/res/tiles/9-0.png delete mode 100644 applications/PoP/poc/res/tiles/A-0.png delete mode 100644 applications/PoP/poc/res/tiles/B-0.png delete mode 100644 applications/PoP/poc/res/tiles/C-0.png delete mode 100644 applications/PoP/poc/res/tiles/D-0.png delete mode 100644 applications/PoP/poc/res/tiles/E-0.png delete mode 100644 applications/PoP/poc/res/tiles/F-0.png delete mode 100644 applications/PoP/poc/res/tiles/tile00.pal delete mode 100644 applications/PoP/poc/res/tiles/tile01.atl delete mode 100644 applications/PoP/poc/res/tiles/tile01.pal delete mode 100644 applications/PoP/poc/res/tiles/tile01.raw delete mode 100644 applications/PoP/poc/res/tiles/tile01_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile02.pal delete mode 100644 applications/PoP/poc/res/tiles/tile03.atl delete mode 100644 applications/PoP/poc/res/tiles/tile03.raw delete mode 100644 applications/PoP/poc/res/tiles/tile03_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile04.pal delete mode 100644 applications/PoP/poc/res/tiles/tile05.pal delete mode 100644 applications/PoP/poc/res/tiles/tile06.pal delete mode 100644 applications/PoP/poc/res/tiles/tile07.pal delete mode 100644 applications/PoP/poc/res/tiles/tile08.pal delete mode 100644 applications/PoP/poc/res/tiles/tile09.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0a.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0b.atl delete mode 100644 applications/PoP/poc/res/tiles/tile0b.raw delete mode 100644 applications/PoP/poc/res/tiles/tile0b_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0c.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0d.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0e.atl delete mode 100644 applications/PoP/poc/res/tiles/tile0e.raw delete mode 100644 applications/PoP/poc/res/tiles/tile0e_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile0f.pal delete mode 100644 applications/PoP/poc/res/tiles/tile10.pal delete mode 100644 applications/PoP/poc/res/tiles/tile11.pal delete mode 100644 applications/PoP/poc/res/tiles/tile12.pal delete mode 100644 applications/PoP/poc/res/tiles/tile13.atl delete mode 100644 applications/PoP/poc/res/tiles/tile13.raw delete mode 100644 applications/PoP/poc/res/tiles/tile13_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile14.atl delete mode 100644 applications/PoP/poc/res/tiles/tile14.pal delete mode 100644 applications/PoP/poc/res/tiles/tile14.raw delete mode 100644 applications/PoP/poc/res/tiles/tile14_merged.pal delete mode 100644 applications/PoP/poc/res/tiles/tile15.pal delete mode 100644 applications/PoP/poc/res/tiles/tile16.pal delete mode 100644 applications/PoP/poc/res/tiles/tile17.pal delete mode 100644 applications/PoP/poc/res/tiles/tile18.pal delete mode 100644 applications/PoP/poc/res/tiles/tile19.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1a.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1b.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1c.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1d.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1e.pal delete mode 100644 applications/PoP/poc/res/tiles/tile1f.pal delete mode 100644 applications/PoP/poc/res/title/t0_0.atl delete mode 100644 applications/PoP/poc/res/title/t0_1.atl delete mode 100644 applications/PoP/poc/res/title/t0_2.atl delete mode 100644 applications/PoP/poc/res/title/t0_3.atl delete mode 100644 applications/PoP/poc/res/title/t0_4.atl delete mode 100644 applications/PoP/poc/res/title/t1_0.atl delete mode 100644 applications/PoP/poc/res/title/t1_1.atl delete mode 100644 applications/PoP/poc/res/title/t1_2.atl delete mode 100644 applications/PoP/poc/res/title/t1_3.atl delete mode 100644 applications/PoP/poc/res/title/t1_4.atl delete mode 100644 applications/PoP/poc/res/title/t2_0.atl delete mode 100644 applications/PoP/poc/res/title/t2_1.atl delete mode 100644 applications/PoP/poc/res/title/t2_2.atl delete mode 100644 applications/PoP/poc/res/title/t2_3.atl delete mode 100644 applications/PoP/poc/res/title/t2_4.atl delete mode 100644 applications/PoP/poc/res/title/t3_0.atl delete mode 100644 applications/PoP/poc/res/title/t3_1.atl delete mode 100644 applications/PoP/poc/res/title/t3_2.atl delete mode 100644 applications/PoP/poc/res/title/t3_3.atl delete mode 100644 applications/PoP/poc/res/title/t3_4.atl delete mode 100644 applications/PoP/poc/res/title/title.arc delete mode 100644 applications/PoP/poc/res/title/title.pal delete mode 100644 applications/PoP/poc/res/vizier/g0.atl delete mode 100644 applications/PoP/poc/res/vizier/g1.atl delete mode 100644 applications/PoP/poc/res/vizier/g2.atl delete mode 100644 applications/PoP/poc/res/vizier/g3.atl delete mode 100644 applications/PoP/poc/res/vizier/g4.atl delete mode 100644 applications/PoP/poc/res/vizier/vizier.arc delete mode 100644 applications/PoP/poc/room.c delete mode 100644 applications/PoP/poc/room.h delete mode 100644 applications/PoP/poc/tools/build_room_palette.py delete mode 100644 applications/PoP/poc/tools/build_tile_atlases.py delete mode 100644 applications/PoP/poc/tools/extract_room.py delete mode 100644 applications/PoP/poc/tools/gen_kid_placeholder.py delete mode 100644 applications/PoP/poc/tools/gen_tile_placeholders.py delete mode 100644 applications/PoP/poc/tools/kid.atl delete mode 100644 applications/PoP/poc/tools/kid.pal delete mode 100644 applications/PoP/poc/tools/kid.raw delete mode 100644 applications/PoP/poc/tools/room.pal delete mode 100644 applications/PoP/roomtest/BUGS_CLOSED.md delete mode 100644 applications/PoP/roomtest/BUGS_OPEN.md delete mode 100644 applications/PoP/roomtest/CLAUDE.md delete mode 100644 applications/PoP/roomtest/Makefile delete mode 100644 applications/PoP/roomtest/README.md delete mode 100644 applications/PoP/roomtest/TASKS_CLOSED.md delete mode 100644 applications/PoP/roomtest/TASKS_OPEN.md delete mode 100644 applications/PoP/roomtest/_pop_bg.h delete mode 100644 applications/PoP/roomtest/_pop_config.h delete mode 100644 applications/PoP/roomtest/_pop_draw.h delete mode 100644 applications/PoP/roomtest/_pop_kdraw.h delete mode 100644 applications/PoP/roomtest/_pop_kid.h delete mode 100644 applications/PoP/roomtest/_pop_level.h delete mode 100644 applications/PoP/roomtest/_pop_sfx.h delete mode 100644 applications/PoP/roomtest/_pop_tile.h delete mode 100644 applications/PoP/roomtest/bg_arc.h delete mode 100644 applications/PoP/roomtest/guard_arc.h delete mode 100644 applications/PoP/roomtest/guards.c delete mode 100644 applications/PoP/roomtest/kid_arc.h delete mode 100644 applications/PoP/roomtest/kid_data.h delete mode 100644 applications/PoP/roomtest/pop_app.c delete mode 100644 applications/PoP/roomtest/pop_app.h delete mode 100644 applications/PoP/roomtest/pop_arc.c delete mode 100644 applications/PoP/roomtest/pop_arc.h delete mode 100644 applications/PoP/roomtest/pop_bg.c delete mode 100644 applications/PoP/roomtest/pop_bg.h delete mode 100644 applications/PoP/roomtest/pop_cdraw.c delete mode 100644 applications/PoP/roomtest/pop_cdraw.h delete mode 100644 applications/PoP/roomtest/pop_cfg.h delete mode 100644 applications/PoP/roomtest/pop_char.h delete mode 100644 applications/PoP/roomtest/pop_cheat.h delete mode 100644 applications/PoP/roomtest/pop_config.c delete mode 100644 applications/PoP/roomtest/pop_ctrl.c delete mode 100644 applications/PoP/roomtest/pop_ctrl.h delete mode 100644 applications/PoP/roomtest/pop_cutscene.c delete mode 100644 applications/PoP/roomtest/pop_cutscene.h delete mode 100644 applications/PoP/roomtest/pop_demo.c delete mode 100644 applications/PoP/roomtest/pop_demo.h delete mode 100644 applications/PoP/roomtest/pop_draw.c delete mode 100644 applications/PoP/roomtest/pop_flow.c delete mode 100644 applications/PoP/roomtest/pop_flow.h delete mode 100644 applications/PoP/roomtest/pop_font.h delete mode 100644 applications/PoP/roomtest/pop_geom.c delete mode 100644 applications/PoP/roomtest/pop_geom.h delete mode 100644 applications/PoP/roomtest/pop_guard.c delete mode 100644 applications/PoP/roomtest/pop_guard.h delete mode 100644 applications/PoP/roomtest/pop_guard_cold.c delete mode 100644 applications/PoP/roomtest/pop_guard_pal.h delete mode 100644 applications/PoP/roomtest/pop_hof.c delete mode 100644 applications/PoP/roomtest/pop_hof.h delete mode 100644 applications/PoP/roomtest/pop_intro.c delete mode 100644 applications/PoP/roomtest/pop_intro.h delete mode 100644 applications/PoP/roomtest/pop_kboot.c delete mode 100644 applications/PoP/roomtest/pop_kdraw.c delete mode 100644 applications/PoP/roomtest/pop_kid.c delete mode 100644 applications/PoP/roomtest/pop_kid.h delete mode 100644 applications/PoP/roomtest/pop_level.c delete mode 100644 applications/PoP/roomtest/pop_level.h delete mode 100644 applications/PoP/roomtest/pop_level_cold.c delete mode 100644 applications/PoP/roomtest/pop_level_qsave.c delete mode 100644 applications/PoP/roomtest/pop_map.c delete mode 100644 applications/PoP/roomtest/pop_map.h delete mode 100644 applications/PoP/roomtest/pop_menu.c delete mode 100644 applications/PoP/roomtest/pop_menu.h delete mode 100644 applications/PoP/roomtest/pop_music.c delete mode 100644 applications/PoP/roomtest/pop_music.h delete mode 100644 applications/PoP/roomtest/pop_music_tbl.h delete mode 100644 applications/PoP/roomtest/pop_pace.c delete mode 100644 applications/PoP/roomtest/pop_pace.h delete mode 100644 applications/PoP/roomtest/pop_pal.c delete mode 100644 applications/PoP/roomtest/pop_pal.h delete mode 100644 applications/PoP/roomtest/pop_qsave.c delete mode 100644 applications/PoP/roomtest/pop_qsave.h delete mode 100644 applications/PoP/roomtest/pop_qsave_coldio.c delete mode 100644 applications/PoP/roomtest/pop_qsave_io.c delete mode 100644 applications/PoP/roomtest/pop_redraw.c delete mode 100644 applications/PoP/roomtest/pop_redraw.h delete mode 100644 applications/PoP/roomtest/pop_room.c delete mode 100644 applications/PoP/roomtest/pop_settings.h delete mode 100644 applications/PoP/roomtest/pop_sfx.c delete mode 100644 applications/PoP/roomtest/pop_sfx.h delete mode 100644 applications/PoP/roomtest/pop_sfx_cold.c delete mode 100644 applications/PoP/roomtest/pop_shadow.c delete mode 100644 applications/PoP/roomtest/pop_shadow.h delete mode 100644 applications/PoP/roomtest/pop_shadow_atlas.h delete mode 100644 applications/PoP/roomtest/pop_sound_tbl.h delete mode 100644 applications/PoP/roomtest/pop_state.c delete mode 100644 applications/PoP/roomtest/pop_state.h delete mode 100644 applications/PoP/roomtest/pop_status.c delete mode 100644 applications/PoP/roomtest/pop_status.h delete mode 100644 applications/PoP/roomtest/pop_tile.c delete mode 100644 applications/PoP/roomtest/pop_tile.h delete mode 100644 applications/PoP/roomtest/pop_tile_cold.c delete mode 100644 applications/PoP/roomtest/pop_timer.c delete mode 100644 applications/PoP/roomtest/pop_timer.h delete mode 100644 applications/PoP/roomtest/pop_title.c delete mode 100644 applications/PoP/roomtest/pop_title.h delete mode 100644 applications/PoP/roomtest/pop_trob.c delete mode 100644 applications/PoP/roomtest/pop_trob.h delete mode 100644 applications/PoP/roomtest/pop_tune.h delete mode 100644 applications/PoP/roomtest/pop_ui.c delete mode 100644 applications/PoP/roomtest/pop_ui.h delete mode 100644 applications/PoP/roomtest/pop_vflip.c delete mode 100644 applications/PoP/roomtest/pop_vflip.h delete mode 100644 applications/PoP/roomtest/pv_arc.h delete mode 100644 applications/PoP/roomtest/roomtest.c delete mode 100644 applications/PoP/roomtest/roomtest_cold.c delete mode 100644 applications/PoP/roomtest/roomtest_cold.h delete mode 100644 applications/PoP/roomtest/shadow_arc.h delete mode 100644 applications/PoP/roomtest/skel_arc.h delete mode 100644 applications/PoP/roomtest/tests-host/.gitignore delete mode 100644 applications/PoP/roomtest/tests-host/Makefile delete mode 100644 applications/PoP/roomtest/tests-host/README.md delete mode 100644 applications/PoP/roomtest/tests-host/bank_stub.s delete mode 100644 applications/PoP/roomtest/tests-host/gen_kid_blob.py delete mode 100644 applications/PoP/roomtest/tests-host/golden/crouch.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/fall_ledge.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/jump_up.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/loose.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/rjump_gap3.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/run_right.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/stand.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/step_shift.h delete mode 100644 applications/PoP/roomtest/tests-host/golden/turn.h delete mode 100644 applications/PoP/roomtest/tests-host/kidblob.h delete mode 100644 applications/PoP/roomtest/tests-host/record_golden.py delete mode 100644 applications/PoP/roomtest/tests-host/scene.c delete mode 100644 applications/PoP/roomtest/tests-host/scene.h delete mode 100644 applications/PoP/roomtest/tests-host/stubs.c delete mode 100644 applications/PoP/roomtest/tests-host/stubs.h delete mode 100644 applications/PoP/roomtest/tests-host/t_app.c delete mode 100644 applications/PoP/roomtest/tests-host/t_cfg.c delete mode 100644 applications/PoP/roomtest/tests-host/t_char.c delete mode 100644 applications/PoP/roomtest/tests-host/t_cutscene.c delete mode 100644 applications/PoP/roomtest/tests-host/t_demo.c delete mode 100644 applications/PoP/roomtest/tests-host/t_flow.c delete mode 100644 applications/PoP/roomtest/tests-host/t_gate.c delete mode 100644 applications/PoP/roomtest/tests-host/t_geom.c delete mode 100644 applications/PoP/roomtest/tests-host/t_grab.c delete mode 100644 applications/PoP/roomtest/tests-host/t_jaffar.c delete mode 100644 applications/PoP/roomtest/tests-host/t_mouse.c delete mode 100644 applications/PoP/roomtest/tests-host/t_phys.c delete mode 100644 applications/PoP/roomtest/tests-host/t_shadow.c delete mode 100644 applications/PoP/roomtest/tests-host/t_timer.c delete mode 100644 applications/PoP/roomtest/tests-host/t_wall.c delete mode 100644 applications/PoP/roomtest/title_arc.h delete mode 100644 applications/PoP/roomtest/vizier_arc.h delete mode 100644 applications/PoP/sdk.mk delete mode 100644 applications/PoP/third_party/16x16-RPG-characters/LICENSE delete mode 100644 applications/PoP/third_party/16x16-RPG-characters/README.md delete mode 100644 applications/PoP/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png delete mode 100644 applications/PoP/toolchain/1.1 delete mode 100644 applications/PoP/toolchain/1.1-2.png delete mode 100644 applications/PoP/toolchain/pop_extract_font.py delete mode 100644 applications/PoP/toolchain/pop_extract_kid_data.py delete mode 100644 applications/PoP/toolchain/pop_pack_arc.py delete mode 100644 applications/PoP/toolchain/pop_pack_bg.py delete mode 100644 applications/PoP/toolchain/pop_pack_guard.py delete mode 100644 applications/PoP/toolchain/pop_pack_intro.py delete mode 100644 applications/PoP/toolchain/pop_pack_kid.py delete mode 100644 applications/PoP/toolchain/pop_pack_music.py delete mode 100644 applications/PoP/toolchain/pop_pack_shadow.py delete mode 100644 applications/PoP/toolchain/pop_pack_sound.py delete mode 100644 applications/PoP/toolchain/pop_pack_title.py delete mode 100755 applications/PoP/toolchain/render_room.py delete mode 100644 applications/PoP/toolchain/room12_debug.png delete mode 100644 applications/PoP/toolchain/room12_render.png delete mode 100644 applications/PoP/toolchain/room1_debug.png delete mode 100644 applications/PoP/toolchain/room1_render.png delete mode 100644 applications/PoP/toolchain/room6_debug.png delete mode 100644 applications/PoP/toolchain/room6_render.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c0_00.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c1_00.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c2_00.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c3_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c4_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c5_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c6_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c7_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c8_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r0c9_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c0_13.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c1_13.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c2_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c3_03.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c4_00.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c5_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c6_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c7_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c8_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r1c9_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c0_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c1_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c2_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c3_14.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c4_0E.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c5_03.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c6_0B.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c7_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c8_01.png delete mode 100644 applications/PoP/toolchain/tiles_room1/r2c9_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c0_0B.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c1_0B.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c2_0B.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c3_03.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c4_03.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c5_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c6_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c7_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c8_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r0c9_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c0_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c1_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c2_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c3_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c4_03.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c5_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c6_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c7_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c8_01.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r1c9_03.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c0_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c1_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c2_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c3_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c4_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c5_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c6_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c7_00.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c8_14.png delete mode 100644 applications/PoP/toolchain/tiles_room12/r2c9_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c0_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c1_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c2_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c3_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c4_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c5_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c6_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c7_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c8_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r0c9_0C.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c0_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c1_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c2_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c3_13.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c4_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c5_13.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c6_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c7_0B.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c8_01.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r1c9_04.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c0_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c1_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c2_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c3_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c4_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c5_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c6_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c7_00.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c8_14.png delete mode 100644 applications/PoP/toolchain/tiles_room6/r2c9_14.png delete mode 100644 applications/SprPoP/.gitignore delete mode 100644 applications/SprPoP/CHANGELOG.md delete mode 100644 applications/SprPoP/CLAUDE.md delete mode 100644 applications/SprPoP/LICENSE delete mode 100644 applications/SprPoP/Makefile delete mode 100644 applications/SprPoP/README.md delete mode 100644 applications/SprPoP/assets/orig/README.md delete mode 100644 applications/SprPoP/assets/packed/BG/bg.arc delete mode 100644 applications/SprPoP/assets/packed/BG/pal_tile.pal delete mode 100644 applications/SprPoP/assets/packed/BG/pop_tile.pal delete mode 100644 applications/SprPoP/assets/packed/FONT/font.atl delete mode 100644 applications/SprPoP/assets/packed/GUARD/guard.arc delete mode 100644 applications/SprPoP/assets/packed/KID/kid.ani delete mode 100644 applications/SprPoP/assets/packed/KID/kid.arc delete mode 100644 applications/SprPoP/assets/packed/KID/kid.pal delete mode 100644 applications/SprPoP/assets/packed/MUS/m24.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m25.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m26.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m27.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m28.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m29.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m30.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m32.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m33.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m35.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m36.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m37.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m39.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m40.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m41.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m43.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m50.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m52.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m53.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m54.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m55.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/m56.bin delete mode 100644 applications/SprPoP/assets/packed/MUS/mus.idx delete mode 100644 applications/SprPoP/assets/packed/PV/pv.arc delete mode 100644 applications/SprPoP/assets/packed/PV/pv.pal delete mode 100644 applications/SprPoP/assets/packed/PV/story.pal delete mode 100644 applications/SprPoP/assets/packed/README_E.TXT delete mode 100644 applications/SprPoP/assets/packed/README_R.TXT delete mode 100644 applications/SprPoP/assets/packed/SHADOW/shadow.arc delete mode 100644 applications/SprPoP/assets/packed/SKEL/skel.arc delete mode 100644 applications/SprPoP/assets/packed/SND/snd.arc delete mode 100644 applications/SprPoP/assets/packed/SND/snd.idx delete mode 100644 applications/SprPoP/assets/packed/TITLE/title.arc delete mode 100644 applications/SprPoP/assets/packed/TITLE/title.pal delete mode 100644 applications/SprPoP/assets/packed/VIZIER/vizier.arc delete mode 100644 applications/SprPoP/dist/MUS/m24.bin delete mode 100644 applications/SprPoP/dist/MUS/m25.bin delete mode 100644 applications/SprPoP/dist/MUS/m26.bin delete mode 100644 applications/SprPoP/dist/MUS/m27.bin delete mode 100644 applications/SprPoP/dist/MUS/m28.bin delete mode 100644 applications/SprPoP/dist/MUS/m29.bin delete mode 100644 applications/SprPoP/dist/MUS/m30.bin delete mode 100644 applications/SprPoP/dist/MUS/m32.bin delete mode 100644 applications/SprPoP/dist/MUS/m33.bin delete mode 100644 applications/SprPoP/dist/MUS/m35.bin delete mode 100644 applications/SprPoP/dist/MUS/m36.bin delete mode 100644 applications/SprPoP/dist/MUS/m37.bin delete mode 100644 applications/SprPoP/dist/MUS/m39.bin delete mode 100644 applications/SprPoP/dist/MUS/m40.bin delete mode 100644 applications/SprPoP/dist/MUS/m41.bin delete mode 100644 applications/SprPoP/dist/MUS/m43.bin delete mode 100644 applications/SprPoP/dist/MUS/m50.bin delete mode 100644 applications/SprPoP/dist/MUS/m52.bin delete mode 100644 applications/SprPoP/dist/MUS/m53.bin delete mode 100644 applications/SprPoP/dist/MUS/m54.bin delete mode 100644 applications/SprPoP/dist/MUS/m55.bin delete mode 100644 applications/SprPoP/dist/MUS/m56.bin delete mode 100644 applications/SprPoP/dist/MUS/mus.idx delete mode 100644 applications/SprPoP/dist/README.ru.txt delete mode 100644 applications/SprPoP/dist/README.txt delete mode 100644 applications/SprPoP/dist/SND/snd.arc delete mode 100644 applications/SprPoP/dist/SND/snd.idx delete mode 100644 applications/SprPoP/docs/BUGS_OPEN.md delete mode 100644 applications/SprPoP/docs/KID_PLAN.md delete mode 100644 applications/SprPoP/docs/PORT_PLAN.md delete mode 100644 applications/SprPoP/docs/PoP/APPLEII_RESOURCE_FORMAT.md delete mode 100644 applications/SprPoP/docs/PoP/MSDOS_RESOURCE_FORMAT.md delete mode 100644 applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.pdf delete mode 100644 applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.txt delete mode 100644 applications/SprPoP/docs/README.md delete mode 100644 applications/SprPoP/docs/TASKS_OPEN.md delete mode 100644 applications/SprPoP/docs/full_game_plan.md delete mode 100644 applications/SprPoP/docs/gates_spikes_plan.md delete mode 100644 applications/SprPoP/docs/host_tests_plan.md delete mode 100644 applications/SprPoP/docs/ideas_backlog.md delete mode 100644 applications/SprPoP/docs/impl_diff.md delete mode 100644 applications/SprPoP/docs/keys.txt delete mode 100644 applications/SprPoP/docs/keys_plan.md delete mode 100644 applications/SprPoP/docs/layout_plan_v2.md delete mode 100644 applications/SprPoP/docs/levels_12_15_plan.md delete mode 100644 applications/SprPoP/docs/levels_plan.md delete mode 100644 applications/SprPoP/docs/menu_settings_plan.md delete mode 100644 applications/SprPoP/docs/midtable_analysis.md delete mode 100644 applications/SprPoP/docs/music_runtime_index_plan.md delete mode 100644 applications/SprPoP/docs/palette_plan.md delete mode 100644 applications/SprPoP/docs/perf_backlog.md delete mode 100644 applications/SprPoP/docs/perf_cyan_phase.md delete mode 100644 applications/SprPoP/docs/perf_green_phase.md delete mode 100644 applications/SprPoP/docs/perf_l11_room15.md delete mode 100644 applications/SprPoP/docs/perf_l13_room23.md delete mode 100644 applications/SprPoP/docs/perf_registry.md delete mode 100644 applications/SprPoP/docs/prng_alternatives.md delete mode 100644 applications/SprPoP/docs/quicksave_plan.md delete mode 100644 applications/SprPoP/docs/resident_budget.md delete mode 100644 applications/SprPoP/docs/room_model_plan.md delete mode 100644 applications/SprPoP/docs/roomnav_skip.md delete mode 100644 applications/SprPoP/docs/sdlpop_audit.md delete mode 100644 applications/SprPoP/docs/shadow_render.md delete mode 100644 applications/SprPoP/docs/sound_plan.md delete mode 100644 applications/SprPoP/docs/status_line_text.md delete mode 100644 applications/SprPoP/docs/vanilla_vs_bugfixed.md delete mode 100644 applications/SprPoP/gen/bg_arc.h delete mode 100644 applications/SprPoP/gen/guard_arc.h delete mode 100644 applications/SprPoP/gen/kid_arc.h delete mode 100644 applications/SprPoP/gen/kid_data.h delete mode 100644 applications/SprPoP/gen/pop_bg_atlas.h delete mode 100644 applications/SprPoP/gen/pop_font.h delete mode 100644 applications/SprPoP/gen/pop_guard_pal.h delete mode 100644 applications/SprPoP/gen/pop_shadow_atlas.h delete mode 100644 applications/SprPoP/gen/pv_arc.h delete mode 100644 applications/SprPoP/gen/shadow_arc.h delete mode 100644 applications/SprPoP/gen/skel_arc.h delete mode 100644 applications/SprPoP/gen/title_arc.h delete mode 100644 applications/SprPoP/gen/vizier_arc.h delete mode 100644 applications/SprPoP/src/_pop_bg.h delete mode 100644 applications/SprPoP/src/_pop_config.h delete mode 100644 applications/SprPoP/src/_pop_draw.h delete mode 100644 applications/SprPoP/src/_pop_file.h delete mode 100644 applications/SprPoP/src/_pop_kdraw.h delete mode 100644 applications/SprPoP/src/_pop_kid.h delete mode 100644 applications/SprPoP/src/_pop_level.h delete mode 100644 applications/SprPoP/src/_pop_sfx.h delete mode 100644 applications/SprPoP/src/_pop_tile.h delete mode 100644 applications/SprPoP/src/guards.c delete mode 100644 applications/SprPoP/src/pop_app.c delete mode 100644 applications/SprPoP/src/pop_app.h delete mode 100644 applications/SprPoP/src/pop_arc.c delete mode 100644 applications/SprPoP/src/pop_arc.h delete mode 100644 applications/SprPoP/src/pop_bg.c delete mode 100644 applications/SprPoP/src/pop_bg.h delete mode 100644 applications/SprPoP/src/pop_cdraw.c delete mode 100644 applications/SprPoP/src/pop_cdraw.h delete mode 100644 applications/SprPoP/src/pop_cfg.h delete mode 100644 applications/SprPoP/src/pop_char.h delete mode 100644 applications/SprPoP/src/pop_cheat.h delete mode 100644 applications/SprPoP/src/pop_config.c delete mode 100644 applications/SprPoP/src/pop_ctrl.c delete mode 100644 applications/SprPoP/src/pop_ctrl.h delete mode 100644 applications/SprPoP/src/pop_cutscene.c delete mode 100644 applications/SprPoP/src/pop_cutscene.h delete mode 100644 applications/SprPoP/src/pop_demo.c delete mode 100644 applications/SprPoP/src/pop_demo.h delete mode 100644 applications/SprPoP/src/pop_draw.c delete mode 100644 applications/SprPoP/src/pop_flow.c delete mode 100644 applications/SprPoP/src/pop_flow.h delete mode 100644 applications/SprPoP/src/pop_geom.c delete mode 100644 applications/SprPoP/src/pop_geom.h delete mode 100644 applications/SprPoP/src/pop_guard.c delete mode 100644 applications/SprPoP/src/pop_guard.h delete mode 100644 applications/SprPoP/src/pop_guard_cold.c delete mode 100644 applications/SprPoP/src/pop_hof.c delete mode 100644 applications/SprPoP/src/pop_hof.h delete mode 100644 applications/SprPoP/src/pop_intro.c delete mode 100644 applications/SprPoP/src/pop_intro.h delete mode 100644 applications/SprPoP/src/pop_kboot.c delete mode 100644 applications/SprPoP/src/pop_kdraw.c delete mode 100644 applications/SprPoP/src/pop_kid.c delete mode 100644 applications/SprPoP/src/pop_kid.h delete mode 100644 applications/SprPoP/src/pop_level.c delete mode 100644 applications/SprPoP/src/pop_level.h delete mode 100644 applications/SprPoP/src/pop_level_cold.c delete mode 100644 applications/SprPoP/src/pop_level_qsave.c delete mode 100644 applications/SprPoP/src/pop_map.c delete mode 100644 applications/SprPoP/src/pop_map.h delete mode 100644 applications/SprPoP/src/pop_menu.c delete mode 100644 applications/SprPoP/src/pop_menu.h delete mode 100644 applications/SprPoP/src/pop_music.c delete mode 100644 applications/SprPoP/src/pop_music.h delete mode 100644 applications/SprPoP/src/pop_pace.c delete mode 100644 applications/SprPoP/src/pop_pace.h delete mode 100644 applications/SprPoP/src/pop_pal.c delete mode 100644 applications/SprPoP/src/pop_pal.h delete mode 100644 applications/SprPoP/src/pop_path_bank.c delete mode 100644 applications/SprPoP/src/pop_qsave.c delete mode 100644 applications/SprPoP/src/pop_qsave.h delete mode 100644 applications/SprPoP/src/pop_qsave_coldio.c delete mode 100644 applications/SprPoP/src/pop_qsave_io.c delete mode 100644 applications/SprPoP/src/pop_redraw.c delete mode 100644 applications/SprPoP/src/pop_redraw.h delete mode 100644 applications/SprPoP/src/pop_room.c delete mode 100644 applications/SprPoP/src/pop_settings.h delete mode 100644 applications/SprPoP/src/pop_sfx.c delete mode 100644 applications/SprPoP/src/pop_sfx.h delete mode 100644 applications/SprPoP/src/pop_sfx_cold.c delete mode 100644 applications/SprPoP/src/pop_shadow.c delete mode 100644 applications/SprPoP/src/pop_shadow.h delete mode 100644 applications/SprPoP/src/pop_snd_data.c delete mode 100644 applications/SprPoP/src/pop_snd_tbl.h delete mode 100644 applications/SprPoP/src/pop_state.c delete mode 100644 applications/SprPoP/src/pop_state.h delete mode 100644 applications/SprPoP/src/pop_status.c delete mode 100644 applications/SprPoP/src/pop_status.h delete mode 100644 applications/SprPoP/src/pop_tile.c delete mode 100644 applications/SprPoP/src/pop_tile.h delete mode 100644 applications/SprPoP/src/pop_tile_cold.c delete mode 100644 applications/SprPoP/src/pop_timer.c delete mode 100644 applications/SprPoP/src/pop_timer.h delete mode 100644 applications/SprPoP/src/pop_title.c delete mode 100644 applications/SprPoP/src/pop_title.h delete mode 100644 applications/SprPoP/src/pop_trob.c delete mode 100644 applications/SprPoP/src/pop_trob.h delete mode 100644 applications/SprPoP/src/pop_tune.h delete mode 100644 applications/SprPoP/src/pop_ui.c delete mode 100644 applications/SprPoP/src/pop_ui.h delete mode 100644 applications/SprPoP/src/pop_vflip.c delete mode 100644 applications/SprPoP/src/pop_vflip.h delete mode 100644 applications/SprPoP/src/sprpop.c delete mode 100644 applications/SprPoP/src/sprpop_cold.c delete mode 100644 applications/SprPoP/src/sprpop_cold.h delete mode 100644 applications/SprPoP/tests/host/Makefile delete mode 100644 applications/SprPoP/tests/host/README.md delete mode 100644 applications/SprPoP/tests/host/bank_stub.s delete mode 100644 applications/SprPoP/tests/host/gen_kid_blob.py delete mode 100644 applications/SprPoP/tests/host/golden/crouch.h delete mode 100644 applications/SprPoP/tests/host/golden/fall_ledge.h delete mode 100644 applications/SprPoP/tests/host/golden/jump_up.h delete mode 100644 applications/SprPoP/tests/host/golden/loose.h delete mode 100644 applications/SprPoP/tests/host/golden/rjump_gap3.h delete mode 100644 applications/SprPoP/tests/host/golden/run_right.h delete mode 100644 applications/SprPoP/tests/host/golden/stand.h delete mode 100644 applications/SprPoP/tests/host/golden/step_shift.h delete mode 100644 applications/SprPoP/tests/host/golden/turn.h delete mode 100644 applications/SprPoP/tests/host/kidblob.h delete mode 100644 applications/SprPoP/tests/host/record_golden.py delete mode 100644 applications/SprPoP/tests/host/scene.c delete mode 100644 applications/SprPoP/tests/host/scene.h delete mode 100644 applications/SprPoP/tests/host/stubs.c delete mode 100644 applications/SprPoP/tests/host/stubs.h delete mode 100644 applications/SprPoP/tests/host/t_app.c delete mode 100644 applications/SprPoP/tests/host/t_cfg.c delete mode 100644 applications/SprPoP/tests/host/t_char.c delete mode 100644 applications/SprPoP/tests/host/t_cutscene.c delete mode 100644 applications/SprPoP/tests/host/t_death.c delete mode 100644 applications/SprPoP/tests/host/t_demo.c delete mode 100644 applications/SprPoP/tests/host/t_flow.c delete mode 100644 applications/SprPoP/tests/host/t_gate.c delete mode 100644 applications/SprPoP/tests/host/t_geom.c delete mode 100644 applications/SprPoP/tests/host/t_grab.c delete mode 100644 applications/SprPoP/tests/host/t_hang.c delete mode 100644 applications/SprPoP/tests/host/t_jaffar.c delete mode 100644 applications/SprPoP/tests/host/t_mouse.c delete mode 100644 applications/SprPoP/tests/host/t_phys.c delete mode 100644 applications/SprPoP/tests/host/t_shadow.c delete mode 100644 applications/SprPoP/tests/host/t_timer.c delete mode 100644 applications/SprPoP/tests/host/t_wall.c delete mode 100755 applications/SprPoP/tools/fetch_orig.py delete mode 100644 applications/SprPoP/tools/paths.py delete mode 100644 applications/SprPoP/tools/pop_extract_font.py delete mode 100644 applications/SprPoP/tools/pop_extract_kid_data.py delete mode 100644 applications/SprPoP/tools/pop_idx.py delete mode 100644 applications/SprPoP/tools/pop_pack_arc.py delete mode 100644 applications/SprPoP/tools/pop_pack_bg.py delete mode 100644 applications/SprPoP/tools/pop_pack_guard.py delete mode 100644 applications/SprPoP/tools/pop_pack_intro.py delete mode 100644 applications/SprPoP/tools/pop_pack_kid.py delete mode 100644 applications/SprPoP/tools/pop_pack_music.py delete mode 100644 applications/SprPoP/tools/pop_pack_shadow.py delete mode 100644 applications/SprPoP/tools/pop_pack_sound.py delete mode 100644 applications/SprPoP/tools/pop_pack_title.py delete mode 100755 applications/SprPoP/tools/pop_quiet.py delete mode 100755 applications/SprPoP/tools/render_room.py delete mode 100644 applications/SprPoP/tools/tests/test_pop_idx.py delete mode 100644 applications/SprPoP/tools/tests/test_pop_quiet.py delete mode 100644 applications/Volkov/.gitignore delete mode 100644 applications/Volkov/.python-version delete mode 100644 applications/Volkov/LICENSE delete mode 100644 applications/Volkov/Makefile delete mode 100644 applications/Volkov/README.md delete mode 100644 applications/Volkov/artifacts/mame-p1/README.md delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/result-early.png delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/strict-enoent.png delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/strict-menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/directory/transition.png delete mode 100644 applications/Volkov/artifacts/mame-p1/dskinfo/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/dskinfo/result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/dskinfo/transition.png delete mode 100644 applications/Volkov/artifacts/mame-p1/emm/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/emm/result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/emm/transition.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec-then-emm/emm-result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec-then-emm/exec-result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec-then-emm/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/case1-child.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/case1-parent.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/case2-child.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/case2-parent.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/exec/result.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/full-contrast.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/full-current.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/full.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/menu-current.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/menu.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/partial-contrast-stable.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/partial-flash-phase.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/partial-phase-hidden.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/partial-stable.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/partial.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/result-contrast.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/result-current.png delete mode 100644 applications/Volkov/artifacts/mame-p1/winrest/result.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/collision.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/dialog-default.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/group-guard.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/renamed-focused.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/unchanged-name.png delete mode 100644 applications/Volkov/artifacts/mame-p10/rename/virtual-guard.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/cancel-preserves.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/empty-dir-deleted.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/file-confirm.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/file-deleted.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/group-guard.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/nonempty-preserved.png delete mode 100644 applications/Volkov/artifacts/mame-p11/delete/virtual-guard.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy/copied-and-skipped-dir.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy/passive-refreshed.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy/repeat-stops-eexist.png delete mode 100644 applications/Volkov/artifacts/mame-p12/group-copy/selected-files-and-dir.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/before.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/cancel-preserves.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/files-deleted.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/group-confirm.png delete mode 100644 applications/Volkov/artifacts/mame-p13/file-only-regression/selected-files.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/cancel-preserves.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/directory-only-refused.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/files-deleted-dirs-preserved.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/group-confirm.png delete mode 100644 applications/Volkov/artifacts/mame-p13/group-delete/selected-files-and-dirs.png delete mode 100644 applications/Volkov/artifacts/mame-p14/default-colors-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p14/default-colors-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p14/default-colors/clean-dss-palette.png delete mode 100644 applications/Volkov/artifacts/mame-p14/default-colors/file-types.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/before.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/cancel-clean.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/passive-refreshed.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/repeat-existing-target.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/self-target-refused.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-copy/success.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree/copied.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree/passive-refreshed.png delete mode 100644 applications/Volkov/artifacts/mame-p16/group-tree/selected-roots.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete-cancel/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete-cancel/group-confirm.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete-cancel/selected-before-cancel.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/before.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/cancel-preserves.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/deleted-keep-preserved.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/group-confirm.png delete mode 100644 applications/Volkov/artifacts/mame-p17/tree-delete/selected-file-and-trees.png delete mode 100644 applications/Volkov/artifacts/mame-p18/metadata/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p18/metadata/copied-metadata.png delete mode 100644 applications/Volkov/artifacts/mame-p18/metadata/passive-metadata.png delete mode 100644 applications/Volkov/artifacts/mame-p18/metadata/source-metadata.png delete mode 100644 applications/Volkov/artifacts/mame-p19/overwrite-core/all-pass.png delete mode 100644 applications/Volkov/artifacts/mame-p19/overwrite-core/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/cancel-choice.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/cancel-cleared.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/overwrite-choice.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/overwrite-complete.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/readonly-reprompt.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/rename-choice.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/renamed.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/skip-all-choice.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/skip-complete.png delete mode 100644 applications/Volkov/artifacts/mame-p19/policy/target-result.png delete mode 100644 applications/Volkov/artifacts/mame-p2/README.md delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/phase-a.png delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/phase-b.png delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/phase-c.png delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/phase-d.png delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/phase-e.png delete mode 100644 applications/Volkov/artifacts/mame-p2/palette/restored-dos.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/flash-before-hidden.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/flash-before-visible-again.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/flash-before-visible.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/full.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/left-scroll-up.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/partial-offset.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/right-scroll-down.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/stable-phase-a.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/stable-phase-b.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/stable-phase-c.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/stress-final.png delete mode 100644 applications/Volkov/artifacts/mame-p2/screen/stress-running.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/clean-exit-dos.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/initial-left-active.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/message-closed-restored.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/navigation-scroll.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/quit-cancelled-restored.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-launch.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/reserved-command-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/second-quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-color/tab-right-active.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0011.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/clean-exit-dos.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/cleanup-between-runs.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/initial-left-active.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/message-closed-restored.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/navigation-scroll.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/quit-cancelled-restored.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/repeat-second-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/repeat-second-launch.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/reserved-command-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p2/skeleton/tab-right-active.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/bigdir-partial.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/ctrl-pgup-left-only.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/dss-enum-limit.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/dss-limit-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/dss-limit-quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/dss-marker-message.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/dss-marker-selected.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/empty-parent.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/enter-parent-return.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/first-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/independent-panel-state.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/left-testdir-parent.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/navigation-scroll.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/refresh-preserves-inner.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/root-both-panels.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/scan-marker.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/second-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/second-launch.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/second-quit-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p3/panels/store-boundary-640-641.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/bank-page-io.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-cancel-cleanup.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-cancel-progress.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-clean-exit.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-copy-success.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-existing-refused.png delete mode 100644 applications/Volkov/artifacts/mame-p4/copy/hdd-zero-copy-success.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/broken-exe-error.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/child-mode-palette-cwd.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/commander-restored-both-panels.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/quit-after-exec.png delete mode 100644 applications/Volkov/artifacts/mame-p4/exec/unsupported-file.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-readonly-openfix/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-readonly-openfix/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-readonly/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-readonly/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-visible/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults-visible/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults/fault-matrix-all-pass.png delete mode 100644 applications/Volkov/artifacts/mame-p5/copy-faults/return-to-dss.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc/copy-progress.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc/enospc-cleanup.png delete mode 100644 applications/Volkov/artifacts/mame-p5/enospc/quit-after-error.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change/managed-error.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change/recovered-copy.png delete mode 100644 applications/Volkov/artifacts/mame-p5/media-change/retry-progress.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges/count-27-fits.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges/count-28-scrolls.png delete mode 100644 applications/Volkov/artifacts/mame-p5/panel-edges/counts-27-28.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability/cleanup-cycle-1.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability/cleanup-cycle-2.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability/cleanup-cycle-3.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability/copy-large-progress.png delete mode 100644 applications/Volkov/artifacts/mame-p5/stability/twenty-copy-hundred-refresh.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer/commander-restored.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer/mdview-main.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer/mdview-pagedown.png delete mode 100644 applications/Volkov/artifacts/mame-p5/viewer/mdview-raw.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0011.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0011.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/date-ascending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/date-descending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/extension-ascending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/extension-descending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/independent-panels.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/name-ascending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/name-descending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/name-reset-ascending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/refresh-keeps-mode.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/size-ascending.png delete mode 100644 applications/Volkov/artifacts/mame-p6/sort/size-descending.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-final/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0011.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/insert-three.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/inverted.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/refresh-clears.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/sort-keeps-selection.png delete mode 100644 applications/Volkov/artifacts/mame-p7/select/virtual-entry-guard.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0011.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/b-unselected.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/bin-selected.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/cancel-preserves.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/default-dialog.png delete mode 100644 applications/Volkov/artifacts/mame-p8/masks/edited-bin-mask.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/clean-dss-return.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/created.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/dialog-empty.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/duplicate-error.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/entered-newdir.png delete mode 100644 applications/Volkov/artifacts/mame-p9/mkdir/invalid-name.png delete mode 100644 applications/Volkov/artifacts/mame-ui/selected-footer-clean.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0000.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0001.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0002.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0003.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0004.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0005.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0006.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0007.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0008.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0009.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0010.png delete mode 100644 applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0011.png delete mode 100644 applications/Volkov/docs/commander-architecture.md delete mode 100644 applications/Volkov/docs/commander-keymap.md delete mode 100644 applications/Volkov/docs/commander-requirements.md delete mode 100644 applications/Volkov/docs/commander-roadmap.md delete mode 100644 applications/Volkov/docs/dss-large-directories.md delete mode 100644 applications/Volkov/docs/p1-platform-probes.md delete mode 100644 applications/Volkov/docs/p10-rename-results.md delete mode 100644 applications/Volkov/docs/p11-delete-results.md delete mode 100644 applications/Volkov/docs/p12-group-copy-results.md delete mode 100644 applications/Volkov/docs/p13-group-delete-results.md delete mode 100644 applications/Volkov/docs/p14-default-colors-results.md delete mode 100644 applications/Volkov/docs/p15-tree-copy-results.md delete mode 100644 applications/Volkov/docs/p16-group-tree-copy-results.md delete mode 100644 applications/Volkov/docs/p17-tree-delete-results.md delete mode 100644 applications/Volkov/docs/p18-metadata-results.md delete mode 100644 applications/Volkov/docs/p19-copy-policy-results.md delete mode 100644 applications/Volkov/docs/p2-palette-results.md delete mode 100644 applications/Volkov/docs/p2-screen-backend.md delete mode 100644 applications/Volkov/docs/p2-screen-probe-results.md delete mode 100644 applications/Volkov/docs/p2-skeleton-results.md delete mode 100644 applications/Volkov/docs/p3-panel-results.md delete mode 100644 applications/Volkov/docs/p4-copy-results.md delete mode 100644 applications/Volkov/docs/p4-exec-results.md delete mode 100644 applications/Volkov/docs/p5-stability-results.md delete mode 100644 applications/Volkov/docs/p6-sort-results.md delete mode 100644 applications/Volkov/docs/p7-selection-results.md delete mode 100644 applications/Volkov/docs/p8-mask-results.md delete mode 100644 applications/Volkov/docs/p9-mkdir-results.md delete mode 100644 applications/Volkov/docs/poc-0.1-release.md delete mode 100644 applications/Volkov/docs/test-media.md delete mode 100644 applications/Volkov/docs/ui-reference.md delete mode 100644 applications/Volkov/include/sc_app.h delete mode 100644 applications/Volkov/include/sc_command.h delete mode 100644 applications/Volkov/include/sc_copy.h delete mode 100644 applications/Volkov/include/sc_copy_ui.h delete mode 100644 applications/Volkov/include/sc_disk.h delete mode 100644 applications/Volkov/include/sc_entry.h delete mode 100644 applications/Volkov/include/sc_exec.h delete mode 100644 applications/Volkov/include/sc_exec_ui.h delete mode 100644 applications/Volkov/include/sc_file_ops.h delete mode 100644 applications/Volkov/include/sc_file_ui.h delete mode 100644 applications/Volkov/include/sc_glyphs.h delete mode 100644 applications/Volkov/include/sc_input.h delete mode 100644 applications/Volkov/include/sc_metadata.h delete mode 100644 applications/Volkov/include/sc_panel.h delete mode 100644 applications/Volkov/include/sc_path.h delete mode 100644 applications/Volkov/include/sc_screen.h delete mode 100644 applications/Volkov/include/sc_select.h delete mode 100644 applications/Volkov/include/sc_sort.h delete mode 100644 applications/Volkov/include/sc_source.h delete mode 100644 applications/Volkov/include/sc_store.h delete mode 100644 applications/Volkov/include/sc_theme.h delete mode 100644 applications/Volkov/include/sc_tree.h delete mode 100644 applications/Volkov/include/sc_video.h delete mode 100644 applications/Volkov/sdk.mk delete mode 100644 applications/Volkov/src/sc_app.c delete mode 100644 applications/Volkov/src/sc_command.c delete mode 100644 applications/Volkov/src/sc_copy_job.c delete mode 100644 applications/Volkov/src/sc_copy_ui.c delete mode 100644 applications/Volkov/src/sc_dialog.c delete mode 100644 applications/Volkov/src/sc_disk.c delete mode 100644 applications/Volkov/src/sc_draw.c delete mode 100644 applications/Volkov/src/sc_exec_ui.c delete mode 100644 applications/Volkov/src/sc_file_ui.c delete mode 100644 applications/Volkov/src/sc_input.c delete mode 100644 applications/Volkov/src/sc_metadata.c delete mode 100644 applications/Volkov/src/sc_name.c delete mode 100644 applications/Volkov/src/sc_panel.c delete mode 100644 applications/Volkov/src/sc_path.c delete mode 100644 applications/Volkov/src/sc_platform_exec.c delete mode 100644 applications/Volkov/src/sc_platform_screen.c delete mode 100644 applications/Volkov/src/sc_rename.c delete mode 100644 applications/Volkov/src/sc_screen.c delete mode 100644 applications/Volkov/src/sc_select.c delete mode 100644 applications/Volkov/src/sc_sort.c delete mode 100644 applications/Volkov/src/sc_source_fs.c delete mode 100644 applications/Volkov/src/sc_store.c delete mode 100644 applications/Volkov/src/sc_theme.c delete mode 100644 applications/Volkov/src/sc_tree.c delete mode 100644 applications/Volkov/src/sc_video_system.c delete mode 100644 applications/Volkov/src/sprcmd.c delete mode 100755 applications/Volkov/tests/check_p10_rename_hdd.sh delete mode 100755 applications/Volkov/tests/check_p11_delete_hdd.sh delete mode 100755 applications/Volkov/tests/check_p12_group_copy_hdd.sh delete mode 100755 applications/Volkov/tests/check_p13_group_delete_hdd.sh delete mode 100755 applications/Volkov/tests/check_p14_default_colors_hdd.sh delete mode 100755 applications/Volkov/tests/check_p15_tree_cancel_hdd.sh delete mode 100755 applications/Volkov/tests/check_p15_tree_copy_hdd.sh delete mode 100755 applications/Volkov/tests/check_p15_tree_self_hdd.sh delete mode 100755 applications/Volkov/tests/check_p16_group_tree_copy_hdd.sh delete mode 100755 applications/Volkov/tests/check_p17_tree_delete_cancel_hdd.sh delete mode 100755 applications/Volkov/tests/check_p17_tree_delete_hdd.sh delete mode 100755 applications/Volkov/tests/check_p18_metadata_hdd.sh delete mode 100755 applications/Volkov/tests/check_p19_overwrite_hdd.sh delete mode 100755 applications/Volkov/tests/check_p19_policy_hdd.sh delete mode 100755 applications/Volkov/tests/check_p4_copy_hdd.sh delete mode 100755 applications/Volkov/tests/check_p4_exec_hdd.sh delete mode 100755 applications/Volkov/tests/check_p5_copy_faults_hdd.sh delete mode 100755 applications/Volkov/tests/check_p5_enospc_hdd.sh delete mode 100755 applications/Volkov/tests/check_p5_hdd.sh delete mode 100755 applications/Volkov/tests/check_p5_media_hdd.sh delete mode 100755 applications/Volkov/tests/check_p6_sort_hdd.sh delete mode 100755 applications/Volkov/tests/check_p7_select_hdd.sh delete mode 100755 applications/Volkov/tests/check_p9_mkdir_hdd.sh delete mode 100644 applications/Volkov/tests/fixtures/mdview2/LICENSE delete mode 100644 applications/Volkov/tests/fixtures/mdview2/ORIGIN.md delete mode 100644 applications/Volkov/tests/fixtures/mdview2/README.md delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2.h delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_conf.h delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_enc.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_help.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_hex.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_index.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_md.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_raw.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_status.c delete mode 100644 applications/Volkov/tests/fixtures/mdview2/mdview2_table.c delete mode 100755 applications/Volkov/tests/make_p10_rename_hdd.sh delete mode 100755 applications/Volkov/tests/make_p11_delete_hdd.sh delete mode 100755 applications/Volkov/tests/make_p12_group_copy_hdd.sh delete mode 100755 applications/Volkov/tests/make_p13_group_delete_hdd.sh delete mode 100755 applications/Volkov/tests/make_p14_default_colors_hdd.sh delete mode 100755 applications/Volkov/tests/make_p15_tree_cancel_hdd.sh delete mode 100755 applications/Volkov/tests/make_p15_tree_copy_hdd.sh delete mode 100755 applications/Volkov/tests/make_p15_tree_self_hdd.sh delete mode 100755 applications/Volkov/tests/make_p16_group_tree_copy_hdd.sh delete mode 100755 applications/Volkov/tests/make_p17_tree_delete_cancel_hdd.sh delete mode 100755 applications/Volkov/tests/make_p17_tree_delete_hdd.sh delete mode 100755 applications/Volkov/tests/make_p18_metadata_hdd.sh delete mode 100755 applications/Volkov/tests/make_p19_overwrite_hdd.sh delete mode 100755 applications/Volkov/tests/make_p19_policy_hdd.sh delete mode 100644 applications/Volkov/tests/make_p3_stress_floppy.sh delete mode 100755 applications/Volkov/tests/make_p3_stress_hdd.sh delete mode 100755 applications/Volkov/tests/make_p4_copy_hdd.sh delete mode 100755 applications/Volkov/tests/make_p4_exec_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_copy_faults_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_enospc_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_media_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_panel_edges_hdd.sh delete mode 100755 applications/Volkov/tests/make_p5_viewer_hdd.sh delete mode 100755 applications/Volkov/tests/make_p6_sort_hdd.sh delete mode 100755 applications/Volkov/tests/make_p7_select_hdd.sh delete mode 100755 applications/Volkov/tests/make_p9_mkdir_hdd.sh delete mode 100644 applications/Volkov/tests/mame_image_probe.lua delete mode 100644 applications/Volkov/tests/mame_p10_rename.lua delete mode 100644 applications/Volkov/tests/mame_p11_delete.lua delete mode 100644 applications/Volkov/tests/mame_p12_group_copy.lua delete mode 100644 applications/Volkov/tests/mame_p13_group_delete.lua delete mode 100644 applications/Volkov/tests/mame_p14_default_colors.lua delete mode 100644 applications/Volkov/tests/mame_p15_tree_cancel.lua delete mode 100644 applications/Volkov/tests/mame_p15_tree_copy.lua delete mode 100644 applications/Volkov/tests/mame_p15_tree_self.lua delete mode 100644 applications/Volkov/tests/mame_p16_group_tree_copy.lua delete mode 100644 applications/Volkov/tests/mame_p17_tree_delete.lua delete mode 100644 applications/Volkov/tests/mame_p17_tree_delete_cancel.lua delete mode 100644 applications/Volkov/tests/mame_p18_metadata.lua delete mode 100644 applications/Volkov/tests/mame_p19_overwrite.lua delete mode 100644 applications/Volkov/tests/mame_p19_policy.lua delete mode 100644 applications/Volkov/tests/mame_p2_skeleton.lua delete mode 100644 applications/Volkov/tests/mame_p3_dir_probe.lua delete mode 100644 applications/Volkov/tests/mame_p3_enum_matrix.lua delete mode 100644 applications/Volkov/tests/mame_p3_panels.lua delete mode 100644 applications/Volkov/tests/mame_p3_scan_probe.lua delete mode 100644 applications/Volkov/tests/mame_p3_stress.lua delete mode 100644 applications/Volkov/tests/mame_p4_copy_hdd.lua delete mode 100644 applications/Volkov/tests/mame_p4_exec_hdd.lua delete mode 100644 applications/Volkov/tests/mame_p5_copy_faults.lua delete mode 100644 applications/Volkov/tests/mame_p5_enospc.lua delete mode 100644 applications/Volkov/tests/mame_p5_media_change.lua delete mode 100644 applications/Volkov/tests/mame_p5_panel_edges.lua delete mode 100644 applications/Volkov/tests/mame_p5_stability.lua delete mode 100644 applications/Volkov/tests/mame_p5_viewer.lua delete mode 100644 applications/Volkov/tests/mame_p6_sort.lua delete mode 100644 applications/Volkov/tests/mame_p7_select.lua delete mode 100644 applications/Volkov/tests/mame_p9_mkdir.lua delete mode 100755 applications/Volkov/tests/p10_rename_fixture.py delete mode 100644 applications/Volkov/tests/p10_rename_probe.c delete mode 100755 applications/Volkov/tests/p11_delete_fixture.py delete mode 100644 applications/Volkov/tests/p11_delete_probe.c delete mode 100755 applications/Volkov/tests/p12_group_copy_fixture.py delete mode 100755 applications/Volkov/tests/p13_group_delete_fixture.py delete mode 100755 applications/Volkov/tests/p14_default_colors_fixture.py delete mode 100755 applications/Volkov/tests/p15_tree_cancel_fixture.py delete mode 100755 applications/Volkov/tests/p15_tree_copy_fixture.py delete mode 100755 applications/Volkov/tests/p15_tree_self_fixture.py delete mode 100755 applications/Volkov/tests/p16_group_tree_copy_fixture.py delete mode 100644 applications/Volkov/tests/p17_tree_delete_cancel_fixture.py delete mode 100644 applications/Volkov/tests/p17_tree_delete_fixture.py delete mode 100644 applications/Volkov/tests/p18_metadata_fixture.py delete mode 100644 applications/Volkov/tests/p19_overwrite_fixture.py delete mode 100644 applications/Volkov/tests/p19_overwrite_probe.c delete mode 100644 applications/Volkov/tests/p19_policy_fixture.py delete mode 100644 applications/Volkov/tests/p1_platform/Makefile delete mode 100644 applications/Volkov/tests/p1_platform/mame_dump_keys.lua delete mode 100644 applications/Volkov/tests/p1_platform/mame_p1_keyboard.lua delete mode 100644 applications/Volkov/tests/p1_platform/p1_dir.c delete mode 100644 applications/Volkov/tests/p1_platform/p1_emm.c delete mode 100644 applications/Volkov/tests/p1_platform/p1_exec_test.c delete mode 100644 applications/Volkov/tests/p1_platform/p1_keyboard.c delete mode 100644 applications/Volkov/tests/p1_platform/p1_platform.h delete mode 100644 applications/Volkov/tests/p1_platform/p1_screen.c delete mode 100644 applications/Volkov/tests/p1_platform/p1_sys.c delete mode 100644 applications/Volkov/tests/p1_platform/p1child.c delete mode 100644 applications/Volkov/tests/p1_platform/p1probe.c delete mode 100644 applications/Volkov/tests/p2_palette/Makefile delete mode 100644 applications/Volkov/tests/p2_palette/p2palette.c delete mode 100644 applications/Volkov/tests/p2_screen/Makefile delete mode 100644 applications/Volkov/tests/p2_screen/p2_platform.c delete mode 100644 applications/Volkov/tests/p2_screen/p2_screen.h delete mode 100644 applications/Volkov/tests/p2_screen/p2screen.c delete mode 100644 applications/Volkov/tests/p2_screen/sc_glyphs.h delete mode 100644 applications/Volkov/tests/p3_data/INNER.TXT delete mode 100644 applications/Volkov/tests/p3_data/P3ROOT.TXT delete mode 100644 applications/Volkov/tests/p3_data/README.md delete mode 100644 applications/Volkov/tests/p3_data/ZETA.BIN delete mode 100644 applications/Volkov/tests/p3_dir_probe/Makefile delete mode 100644 applications/Volkov/tests/p3_dir_probe/p3dir.c delete mode 100644 applications/Volkov/tests/p3_enum_matrix/Makefile delete mode 100644 applications/Volkov/tests/p3_enum_matrix/bank1_enum.c delete mode 100644 applications/Volkov/tests/p3_enum_matrix/p3map.c delete mode 100644 applications/Volkov/tests/p3_scan_probe/Makefile delete mode 100644 applications/Volkov/tests/p3_scan_probe/p3scan.c delete mode 100644 applications/Volkov/tests/p3_store_probe/Makefile delete mode 100644 applications/Volkov/tests/p3_store_probe/p3store.c delete mode 100644 applications/Volkov/tests/p4_bank_io_probe/Makefile delete mode 100644 applications/Volkov/tests/p4_bank_io_probe/p4bio.c delete mode 100644 applications/Volkov/tests/p4_exec_child/Makefile delete mode 100644 applications/Volkov/tests/p4_exec_child/p4child.c delete mode 100755 applications/Volkov/tests/p4_exec_verify.py delete mode 100755 applications/Volkov/tests/p4_fixture.py delete mode 100644 applications/Volkov/tests/p5_copy_faults.c delete mode 100755 applications/Volkov/tests/p5_copy_faults_fixture.py delete mode 100755 applications/Volkov/tests/p5_enospc_fixture.py delete mode 100755 applications/Volkov/tests/p5_fixture.py delete mode 100755 applications/Volkov/tests/p5_media_fixture.py delete mode 100755 applications/Volkov/tests/p6_sort_fixture.py delete mode 100644 applications/Volkov/tests/p6_sort_probe.c delete mode 100755 applications/Volkov/tests/p7_select_fixture.py delete mode 100644 applications/Volkov/tests/p7_select_probe.c delete mode 100755 applications/Volkov/tests/p9_mkdir_fixture.py delete mode 100644 applications/Volkov/tests/p9_mkdir_probe.c delete mode 100755 applications/Volkov/tests/run_mame_hdd.sh delete mode 100644 examples/.gitignore delete mode 100644 examples/.python-version delete mode 100644 examples/LICENSE delete mode 100644 examples/Makefile delete mode 100644 examples/README.md delete mode 100644 examples/balls/Makefile delete mode 100644 examples/balls/balls.c delete mode 100755 examples/balls/run.sh delete mode 100644 examples/mdview/Makefile delete mode 100644 examples/mdview/README.MD delete mode 100644 examples/mdview/SAMPLE.MD delete mode 100644 examples/mdview/docs/mdview-модель-документа-и-рендеринг.md delete mode 100644 examples/mdview/mdview — унифицированный рендеринг (Unified Wrap + Paragraph Model).md delete mode 100644 examples/mdview/mdview.c delete mode 100644 examples/mdview/todo2 delete mode 100644 examples/mdview2/CHANGELOG.md delete mode 100644 examples/mdview2/DEMO.MD delete mode 100644 examples/mdview2/Makefile delete mode 100644 examples/mdview2/README.md delete mode 100644 examples/mdview2/READMEBG.MD delete mode 100644 examples/mdview2/UTF8TEST.MD delete mode 100644 examples/mdview2/docs/encoding-plan.md delete mode 100644 examples/mdview2/docs/mdview2-plan.md delete mode 100644 examples/mdview2/mdview2.c delete mode 100644 examples/mdview2/mdview2.h delete mode 100644 examples/mdview2/mdview2_conf.h delete mode 100644 examples/mdview2/mdview2_enc.c delete mode 100644 examples/mdview2/mdview2_help.c delete mode 100644 examples/mdview2/mdview2_hex.c delete mode 100644 examples/mdview2/mdview2_index.c delete mode 100644 examples/mdview2/mdview2_md.c delete mode 100644 examples/mdview2/mdview2_raw.c delete mode 100644 examples/mdview2/mdview2_status.c delete mode 100644 examples/mdview2/mdview2_table.c delete mode 100644 examples/mdview2/testfiles/BIG.MD delete mode 100644 examples/mdview2/testfiles/HUGE.MD delete mode 100644 examples/mdview2/testfiles/LINES.MD delete mode 100644 examples/mdview2/testfiles/TABLES.MD delete mode 100644 examples/mdview2/testfiles/gen_testfiles.py delete mode 100644 examples/rpgwalk/.gitignore delete mode 100644 examples/rpgwalk/Makefile delete mode 100644 examples/rpgwalk/conv_sprites.py delete mode 100644 examples/rpgwalk/rpgprof.c delete mode 100644 examples/rpgwalk/rpgwalk.c delete mode 100644 examples/scroll/Makefile delete mode 100755 examples/scroll/run.sh delete mode 100644 examples/scroll/scroll-impl-guide.md delete mode 100644 examples/scroll/scroll.c delete mode 100644 examples/sdk.mk delete mode 100644 examples/space/.gitignore delete mode 100644 examples/space/Makefile delete mode 100644 examples/space/gen_sprites.py delete mode 100644 examples/space/space.c delete mode 100644 examples/third_party/16x16-RPG-characters/LICENSE delete mode 100644 examples/third_party/16x16-RPG-characters/README.md delete mode 100644 examples/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png delete mode 100644 third_party/16x16-RPG-characters/LICENSE delete mode 100644 third_party/16x16-RPG-characters/README.md delete mode 100644 third_party/16x16-RPG-characters/preview.png delete mode 100644 third_party/16x16-RPG-characters/sprites/new-style/chibi-layered.aseprite delete mode 100644 third_party/16x16-RPG-characters/sprites/new-style/chibi-layered.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/00-avatars.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/00-guide.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/01-generic.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/02-bard.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/03-soldier.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/04-scout.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/05-devout.png delete mode 100644 third_party/16x16-RPG-characters/sprites/old-style/06-conjurer.png delete mode 100755 toolchain/apply-mame-sdbg-patch.sh delete mode 100644 toolchain/mame-patches/0001-sdbg-debugger-backend.patch delete mode 100644 toolchain/pop_extract_font.py delete mode 100644 toolchain/pop_pack_intro.py delete mode 100644 toolchain/pop_pack_title.py delete mode 100644 toolchain/vscode-sprinter-debug/LICENSE delete mode 100644 toolchain/vscode-sprinter-debug/README.md delete mode 100644 toolchain/vscode-sprinter-debug/build.js delete mode 100644 toolchain/vscode-sprinter-debug/build.test.js delete mode 100644 toolchain/vscode-sprinter-debug/extension.js delete mode 100644 toolchain/vscode-sprinter-debug/extension.test.js delete mode 100644 toolchain/vscode-sprinter-debug/package.json delete mode 100644 toolchain/vscode-sprinter-debug/runtime.js delete mode 100644 toolchain/vscode-sprinter-debug/runtime.test.js diff --git a/.codex/README.md b/.codex/README.md index 60f6af9..f23eeb8 100644 --- a/.codex/README.md +++ b/.codex/README.md @@ -4,20 +4,22 @@ Запускайте Codex из корня репозитория или любой вложенной папки. Корень определяется через `git rev-parse --show-toplevel`. -На каждом компьютере установите `uv` и добавьте его в PATH процесса Codex. -По умолчанию сервер расположен в `mame/sources/MAME/src/mame_mcp.py`. -Каталог `mame/` не хранится в Git и должен быть установлен отдельно. -Первый запуск uv может потребовать сеть для установки Python 3.12 и mcp<2. +На каждом компьютере установите `uv` и `pyenv`. Используется локальный +pyenv Python 3.12 из `.python-version`; uv ставит только пакет `mcp<2`, +не управляет версией Python. По умолчанию сервер расположен в соседнем +`../MAME/src/mame_mcp.py`. При иной раскладке задайте явный путь. Если расположение отличается, создайте `.codex/mame.local.env` (игнорируется Git): ```sh MAME_UV="/opt/homebrew/bin/uv" -MAME_MCP_SCRIPT="mame/sources/MAME/src/mame_mcp.py" +MAME_MCP_SCRIPT="/путь/к/MAME/src/mame_mcp.py" +MAME_PYTHON="/путь/к/pyenv/versions/3.12/bin/python" ``` Путь к серверу может быть абсолютным или относительно корня проекта. -Путь к uv может быть абсолютным, относительным к корню или именем из PATH. +Пути к uv/Python могут быть абсолютными или именами из PATH; если +`MAME_PYTHON` не задан, скрипт вызывает `pyenv which python`. Переменные можно также передать через окружение Codex; локальный файл имеет приоритет. Файл читается как shell-код запускным скриптом, а не самим Codex. Не храните в нём секреты и не добавляйте его в Git. diff --git a/.gitignore b/.gitignore index af4a29e..ecf26a2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,24 +10,7 @@ build/ .sprinter-cc-*/ .resource-stamps/ -# Per-program final/intermediate outputs landing alongside the source -# (real apps under examples/ and libc feature tests under tests/). -examples/*/*.exe -examples/*/*.asm -examples/*/*.lst -examples/*/*.lk -examples/*/*.ihx -examples/*/*.noi -examples/*/*.sym -examples/*/*.map -examples/*/*.rel -examples/*/*.cdb -examples/*/*.mem -examples/*/*.rst - -# Temporary build directory for floppy disk image preparation -examples/*/.disk_tmp/ - +# Per-program final/intermediate outputs landing alongside SDK tests. tests/*/*.exe tests/*/*.asm tests/*/*.lst @@ -41,30 +24,6 @@ tests/*/*.cdb tests/*/*.mem tests/*/*.rst -# applications/// — реальные приложения (та же схема, что -# examples/ и tests/, но на уровень глубже: applications/PoP/roomtest/...) -applications/*/*/*.exe -applications/*/*/*.asm -applications/*/*/*.lst -applications/*/*/*.lk -applications/*/*/*.ihx -applications/*/*/*.noi -applications/*/*/*.sym -applications/*/*/*.map -applications/*/*/*.rel -applications/*/*/*.cdb -applications/*/*/*.mem -applications/*/*/*.rst - -# PoP-порт: внешние референс-репозитории (собственные git-клоны — НЕ -# часть этого репозитория) + оригинальные game-данные (копирайт, только -# для реверса форматов на этой машине). -applications/PoP/SDLPoP/ -applications/PoP/mininim/ -applications/PoP/PR/ -applications/PoP/Prince-of-Persia-Apple-II/ -applications/PoP/MSDOS/ - # libc + libbgi archives (built by libc/Makefile + libbgi/Makefile) lib/*.lib @@ -93,9 +52,6 @@ third_party/sdcc-*/ third_party/*.tar.bz2 third_party/*.tar.gz -# MAME emulator install — ~1 GB binary + ROMs + CHDs -mame/ - # =========================================================================== # OS / editor / AI assistant # =========================================================================== @@ -126,22 +82,5 @@ mame/ docs/extra/ docs/sources/ -# Записи музыки DOS-версии PoP (43 МБ в четырёх форматах) — ИСТОЧНИК для -# toolchain/pop_pack_music.py, а не ресурс сборки: на диск игры уходят уже -# упакованные poc/res/music/*.bin, и они в репозитории есть. Если понадобится -# перегенерировать музыку — положить сюда PoP1_DOS_music (flac). -applications/PoP/PoP1_DOS_music/ - -# R1 — рабочая копия roomtest для экспериментов пользователя, в репозиторий -# не идёт (сама roomtest и есть версируемая ветка разработки). -applications/PoP/R1/ - -# SprPoP — автономное приложение, и правила игнора у него СВОИ: -# applications/SprPoP/.gitignore. Он написан так, чтобы стать корневым -# .gitignore, когда SprPoP выделят в отдельный репозиторий, — поэтому -# здесь его содержимое НЕ дублируется (иначе разъедется). Коротко: в -# репозиторий не идут assets/orig/ (чужие данные — их выкачивает -# `make fetch`) и assets/packed/LEVELS/ (уровни из оригинала как есть). - # Локальные пути MCP; общая конфигурация .codex остаётся в Git. /.codex/mame.local.env diff --git a/AGENTS.md b/AGENTS.md index a1f1a98..86894dc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,10 +6,10 @@ Target-слой SDCC 4.5 (z80) для компьютера Sprinter Sp2000: crt0 ## Сборка и проверка ``` -make # tools + lib + libbgi + все тесты (45) + examples +make # tools + lib + libbgi + все тесты SDK make -C libc # только libc → lib/sprinter.lib (fast) + sprinter_safe.lib make -C libbgi # только BGI → lib/bgi256.lib (fast) + bgi256_safe.lib -make floppy # упаковать все .exe в mame/v306/IMG/mc.img +make floppy # упаковать тесты в build/media/toolkit-tests.img make size-check # размерный регресс: _CODE vs docs/size_baseline.tsv make size-baseline # принять текущие размеры эталоном ``` @@ -26,8 +26,8 @@ make size-baseline # принять текущие размеры эталон дискету и запускает MAME автоматически через `toolchain/mame_interactive.py`, снимает скриншоты, выводит пути). Для сложных сценариев (диалог, несколько шагов ввода) — прямой вызов: -`python3 toolchain/mame_interactive.py tests/<имя>/<имя>.exe --snap T1,T2 --timeout T`. -Скриншоты лежат в `mame/v306/snap_auto/sprinter/` (читаются инструментом Read). +`pyenv exec python toolchain/mame_interactive.py tests/<имя>/<имя>.exe --snap T1,T2 --timeout T`. +Скриншоты лежат в `build/mame-autotest//sprinter/`. Подробности: `docs/mame-autotest.md`. После правок libc/libbgi: пересборка от чистого листа (`make -C libc clean` @@ -87,7 +87,8 @@ make size-baseline # принять текущие размеры эталон - `libbgi/` — графика BGI (отдельная библиотека): `common/` — mode-agnostic (один исходник, .rel в обеих driver-библиотеках), `bgi256/` + `bgi16/` — mode-specific leaf'ы (реальные реализации, без обёрток); `include/` — graphics.h + gfx.h; `_bgi.h` — внутренний заголовок. Собирает `lib/bgi256.lib` (и `bgi16.lib` в Фазе 2). Выбор режима линковкой: `--gfx 256` / `--gfx 16`. - `runtime/` — crt0-семейство, heap, bank (bank.s собирается per-build) - `bin/sprinter-cc` — обёртка компилятора; `toolchain/mkexe` — упаковщик -- `tests/` — по одному API/фиче; `examples/` — реальные приложения +- `tests/` — по одному API/фиче; примеры находятся в отдельном репозитории + `../Examples`, приложения — в независимых репозиториях `../Applications/*` - `docs/` — дизайн-доки; `docs/TODO.md` — roadmap - `third_party/solid-c/` — нативный Sprinter C (референс, CP866; их ABI несовместим — только как образец) diff --git a/LICENSE b/LICENSE index 217ff75..780e208 100644 --- a/LICENSE +++ b/LICENSE @@ -30,10 +30,10 @@ Vendored third-party components are under their own licenses: for compatibility. Licence not specified upstream; treat as reference material, do not redistribute original binaries. - mame/v306/ — MAME (https://www.mamedev.org), GPL v2+. - mame/v306/IMG/*.img *.chd *.iso — Sprinter ROM / DSS / sample disk images - from Peters Plus. Redistribution policy: see - Peters Plus documentation. + +MAME and its Sprinter ROM/DSS/CHD installation are held in a separate +project and are not distributed with this SDK. Their own licenses and +redistribution terms apply. Documentation in docs/converted/, docs/reference/, docs/samples/, and docs/memory management/ contains material originally published by Peters Plus diff --git a/Makefile b/Makefile index 9b76c42..f276792 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,11 @@ TESTS := hello hello2 simple banked bankedbg banktest strtest cat seek \ # ещё не собирается). Вернуть мигрированными на BGI --gfx 16. FLOPPY_IMG := build/media/toolkit-tests.img MAKE_DISK := toolchain/make_disk.py -MAME_HOME ?= $(if $(wildcard mame/v306/mame.arm),$(CURDIR)/mame/v306,) +MAME_HOME ?= +PYTHON ?= $(shell pyenv which python) +ifeq ($(strip $(PYTHON)),) +$(error pyenv Python 3.12 не найден; задайте PYTHON=/путь/к/python3.12) +endif TEST_EXES := $(foreach t,$(TESTS),tests/$(t)/$(t).exe) ALL_EXES := $(TEST_EXES) @@ -55,17 +59,17 @@ $(TESTS): tools lib # Generate big.txt if missing (gen_bigfile.py creates 100 KB marker file). tests/seek/big.txt: - cd tests/seek && python3 gen_bigfile.py big.txt 102400 + cd tests/seek && $(PYTHON) gen_bigfile.py big.txt 102400 # Собственный SDK-носитель: не изменяет диск MAME или приложения. floppy: tests tests/seek/big.txt - python3 $(MAKE_DISK) $(FLOPPY_IMG) $(ALL_EXES) $(DATA_FILES) + $(PYTHON) $(MAKE_DISK) $(FLOPPY_IMG) $(ALL_EXES) $(DATA_FILES) @echo @echo "Floppy ready: $(FLOPPY_IMG)" @echo "Run: make run MAME_HOME=/путь/к/MAME/runtime" run: floppy - python3 toolchain/run_sprinter_mame.py --mame-home "$(MAME_HOME)" --floppy "$(FLOPPY_IMG)" + $(PYTHON) toolchain/run_sprinter_mame.py --mame-home "$(MAME_HOME)" --floppy "$(FLOPPY_IMG)" # Модульные тесты под ucsim_z80. Обвязка — testkit/, сами наборы лежат # рядом с кодом, который проверяют. MAME не нужна, идут за секунды; @@ -79,15 +83,15 @@ host-tests: # Отладочная карта: реальные SDCC/linker и протокол транспорта без MAME. # Для local pyenv: pyenv exec make sdbg-tests. sdbg-tests: tools lib - python3 -m unittest discover -s tests/sdbg -v + $(PYTHON) -m unittest discover -s tests/sdbg -v # Размерный регресс: сверить _CODE всех программ с docs/size_baseline.tsv. size-check: - python3 toolchain/size_check.py + $(PYTHON) toolchain/size_check.py # Принять текущие размеры как эталон (после осознанных изменений). size-baseline: - python3 toolchain/size_check.py --update + $(PYTHON) toolchain/size_check.py --update clean: $(MAKE) -C toolchain/mkexe clean diff --git a/app.mk b/app.mk index 6cadeae..a9a3cda 100644 --- a/app.mk +++ b/app.mk @@ -40,14 +40,21 @@ ifeq ($(strip $(SPRINTER_ROOT)),) SPRINTER_ROOT := $(PROJ_ROOT) endif -PYTHON ?= python3 +# SPRINTER_PYTHON в sprinter-cc — один исполняемый файл, а не shell-команда. +# pyenv which выбирает local .python-version текущего приложения. +PYTHON ?= $(shell pyenv which python) +ifeq ($(strip $(PYTHON)),) +$(error pyenv Python не найден; задайте PYTHON=/путь/к/python3.12) +endif SPRINTER_CC := $(PROJ_ROOT)/bin/sprinter-cc MKEXE := $(PROJ_ROOT)/toolchain/mkexe/mkexe LIB := $(PROJ_ROOT)/lib/sprinter.lib -# Временный fallback для старого общего дерева. После переноса нет MAME -# внутри SDK, поэтому внешний проект задаёт MAME_HOME или отдельные пути. -MAME_HOME ?= $(if $(wildcard $(PROJ_ROOT)/mame/v306/mame.arm),$(PROJ_ROOT)/mame/v306,) +ifeq ($(wildcard $(SPRINTER_CC)),) +$(error SPRINTER_ROOT=$(SPRINTER_ROOT): bin/sprinter-cc не найден) +endif + +MAME_HOME ?= MAME_BIN ?= $(if $(strip $(MAME_HOME)),$(MAME_HOME)/mame.arm,) MAME_ROMPATH ?= $(if $(strip $(MAME_HOME)),$(MAME_HOME)/roms,) MAME_DSS_IMAGE ?= $(if $(strip $(MAME_HOME)),$(MAME_HOME)/IMG/dss171u.img,) @@ -69,7 +76,7 @@ MAME_PROFILE_ARGS = --mame-home "$(MAME_HOME)" --mame-bin "$(MAME_BIN)" \ MEMORY ?= tiny # SRC_DIR / BUILD_DIR — раскладка приложения, которое НЕ держит исходники и -# выхлоп в одной папке с Makefile (applications/SprPoP: src/ и build/). По +# выхлоп в одной папке с Makefile (например, SprPoP: src/ и build/). По # умолчанию обе пусты, то есть всё как было: ./$(EXAMPLE).c → ./$(EXAMPLE).exe. # Пустое значение обрабатывается отдельной веткой намеренно: "./prog.exe" и # "prog.exe" — разные имена целей, и склеивать префикс безусловно нельзя. diff --git a/applications/PoP/.gitignore b/applications/PoP/.gitignore deleted file mode 100644 index fad014b..0000000 --- a/applications/PoP/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# Референсные клоны и оригинальные игровые данные — не часть порта. -SDLPoP/ -PR/ -mininim/ -Prince-of-Persia-Apple-II/ -MSDOS/ -PoP1_DOS_music/ -R1/ -local.mk -build/ -.sprinter-cc-*/ -.resource-stamps/ -*.exe -*.asm -*.lst -*.lk -*.ihx -*.noi -*.sym -*.map -*.rel -*.cdb -*.mem -*.rst -__pycache__/ -*.py[cod] -.DS_Store -._* -.vscode/ diff --git a/applications/PoP/.python-version b/applications/PoP/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/applications/PoP/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/applications/PoP/CLAUDE.md b/applications/PoP/CLAUDE.md deleted file mode 100644 index d530f00..0000000 --- a/applications/PoP/CLAUDE.md +++ /dev/null @@ -1,91 +0,0 @@ -# Prince of Persia → ZX Sprinter — правила подпроекта - -Порт Prince of Persia (DOS/Apple II) на Sprinter Sp2000 поверх нашего -sprinter-cc / libc / libbgi. Действуют правила корневого -`CLAUDE.md` (сборка, libc, ABI, MAME-автотест); ниже — только специфика PoP. -Общение и комментарии — на русском. - -## Главное правило: SDLPoP — источник истины. Сначала читай, потом кодь - -**`SDLPoP/src/` (github.com/NagyD/SDLPoP, GPLv3) — ЕДИНСТВЕННЫЙ авторитетный -источник того, как оригинальный движок это делает.** Правило без исключений: - -1. **Перед реализацией ЛЮБОЙ функции** (движение, коллизия, окклюзия, - падение, loose-полы, стражники, отрисовка, тайминги, любые числовые - константы) — СНАЧАЛА найди и прочитай соответствующий код в `SDLPoP/src/`, - и портируй по нему. Не пиши по памяти, не выводи логику «из общих - соображений», не угадывай значения — это источник багов, которые потом - ловятся в MAME часами. -2. **По любому вопросу «как в оригинале должно быть»** (что окклюдит что, - в каком порядке слои, когда меняется тайл, какая скорость/задержка, - что делает такой-то кадр анимации) — ответ ищи в `SDLPoP/src/`, а не - строй гипотезу. Если в SDLPoP не нашёл — это повод копать дальше в - исходнике, а не додумывать. -3. Расхождение нашей реализации с SDLPoP — по умолчанию **баг у нас**, пока - не доказано обратное (наша платформа/ABI требует отличия — тогда явно - зафиксировать почему в комментарии **и записью в `docs/impl_diff.md`**: - что делает оригинал, что делаем мы, чем платим, что проверять при - регрессе). - -Карта сегментов: `seg005` control-диспетчер, `seg006` play_kid/коллизия/ -seqtbl, `seg007` mob/loose/падающие объекты, `seg008` отрисовка тайлов/ -слои/окклюзия, `seg009` чтение ресурсов. Слои окклюзии у нас = слои SDLPoP. -См. memory `pop_check_sdlpop_first`. - -Вторичные референсы (когда в SDLPoP непонятно/нужен другой ракурс): -- `Prince-of-Persia-Apple-II/` — оригинальный 6502-исходник 1989 (Мехнер). -- `PR/` (github.com/NagyD/PR, GPLv2) — Princed Resources. -- `mininim/` — независимая реализация. - -Все эти папки — **справочник логики/структур/констант и источник ассетов**, -но НЕ код для копирования (лицензии несовместимы, наш ABI другой): читаем -и переписываем под наш движок, а не вставляем куски. - -## Ассеты - -Готовые распакованные VGA-256 ассеты (то, что нужно под 320×256×256) — -`SDLPoP/data/` (`res.png`/`.pal`/`.bin`). Брать оттуда, а НЕ писать свой -декодер DOS `.DAT`. Локальные `.DAT` — в `MSDOS/`. - -**Каноническая спецификация форматов `.DAT` — `docs/POP-DAT-FormatSpecifications.pdf`** -(грепаемая копия — `docs/POP-DAT-FormatSpecifications.txt`): первоисточник -Princed для DAT v1.0 (контейнер/индекс/чек-сумма, кодеки RLE/LZG, палитры, -формат уровней, звук), на нём построены и SDLPoP, и Princed Resources. Наши -разборы (`docs/MSDOS_RESOURCE_FORMAT.md` / `docs/APPLEII_RESOURCE_FORMAT.md` / -`docs/README.md`) — практические заметки/сверки; при расхождении источник -истины — спецификация. Формат уровня почти идентичен в Apple II и DOS. - -Упаковка ассетов под Sprinter (атласы `.atl`, палитра) — python-скрипты в -`toolchain/` (`render_room.py`, `pop_pack_bg.py`, `pop_pack_kid.py`, -`pop_extract_kid_data.py`). Их дёргают Makefile'ы тестов. - -## Структура папки - -- `docs/` — планы и форматы; **индекс с отметками актуальности — - `docs/README.md`**, начинать чтение оттуда. Ключевое: - `levels_plan.md` (следующий этап), `layout_plan_v2.md` (раскладка кода по - окнам/банкам + скорость отрисовки), `PORT_PLAN.md` (карта фаз со - статусами). -- `roomtest/` — **активная разработка**: уровень 1 целиком (Kid, стражи, - ловушки, ворота, loose-полы). Свой `CLAUDE.md`; текущие задачи — - `roomtest/TASKS_OPEN.md` (закрытые с протоколами — - `roomtest/TASKS_CLOSED.md`), открытые баги — `roomtest/BUGS_OPEN.md`, - закрытые с разбором корней — `roomtest/BUGS_CLOSED.md`. -- `poc/` — ранний proof-of-concept (снег/атлас/kbd_raw); ассеты в `poc/res/`. -- `bgtest/`, `coltest/` — отдельные проверки фона/коллизии. -- `toolchain/` — python-упаковщики ассетов + эталонные PNG (`1.1-2.png`). -- `SDLPoP/`, `PR/`, `Prince-of-Persia-Apple-II/`, `mininim/`, `MSDOS/` — - референсы/оригинальные данные (см. выше). - -## Ключевые архитектурные решения (memory/) - -- `pop_port_project` — общий статус порта. -- `pop_banking_architecture` — будущее: big+BANK_W1, графику нельзя в W3, - один файл = один банк = прямые вызовы, main резидентен. -- `pop_background_strategy` — фон = композиция тайлов в рантайме (вариант 3). -- `pop_kid_plan` / `pop_hang_state` / `pop_fore_layer` / - `pop_fall_debug_baseline` — этапы Kid. -- `kbd_raw_fifo_drain` — held-state клавиатуры (единственный принципиальный - пробел движка, закрыт ``): вычерпывать FIFO SIO циклом. -- `png_strip_padding_tradeoff`, `pop_tile_atlas_palette_merge` — квирки - упаковки ассетов. diff --git a/applications/PoP/LICENSE b/applications/PoP/LICENSE deleted file mode 100644 index a738358..0000000 --- a/applications/PoP/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/PoP/README.md b/applications/PoP/README.md deleted file mode 100644 index 07ba5b8..0000000 --- a/applications/PoP/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Prince of Persia на ZX Sprinter - -Порт Prince of Persia на компьютер Sprinter Sp2000 поверх нашего -target-слоя SDCC (sprinter-cc / libc / libbgi). Цель — 320×256×256 (режим -0x81), VGA-256 ассеты оригинала переносятся почти впрямую. - -**Состояние (2026-08-01): играется весь уровень 1** — комнаты и переходы, -Kid со всем набором действий, ловушки, ворота, дверь уровня, меч и бой, -стражи с ИИ, HP и зелья. Нет: перехода на следующий уровень, звука, -таймера/HUD, сохранений. - -- Что в работе прямо сейчас — [`roomtest/TASKS_OPEN.md`](roomtest/TASKS_OPEN.md). -- Следующий этап (уровни 2+) — [`docs/levels_plan.md`](docs/levels_plan.md). -- Общий план и статус фаз — [`docs/PORT_PLAN.md`](docs/PORT_PLAN.md). -- Правила работы для ИИ-сессий — [`CLAUDE.md`](CLAUDE.md). - -## Что где - -| Папка | Назначение | -|-------|-----------| -| `roomtest/` | **Активная разработка.** Уровень 1 целиком: фон композицией тайлов, Kid (seqtbl-анимация, ввод, коллизия, падение, зацеп, окклюзия), ловушки, ворота, стражи, бой. Свой README/CLAUDE/TASKS. | -| `docs/` | Планы и разбор форматов ресурсов Apple II / DOS — см. индекс в [`docs/README.md`](docs/README.md). | -| `toolchain/` | Python-упаковщики ассетов под Sprinter (рендер комнат, атласы тайлов/Kid, извлечение данных анимации) + эталонные скриншоты. | -| `poc/` | Ранний proof-of-concept (снег, атлас, raw-клавиатура). Ассеты в `poc/res/`. | -| `bgtest/`, `coltest/` | Точечные проверки фона и коллизии. | -| `SDLPoP/`, `PR/`, `mininim/` | Референсные реализации движка (GPL) — читаем логику/константы, НЕ копируем код. `SDLPoP/data/` — источник распакованных VGA-ассетов. | -| `Prince-of-Persia-Apple-II/` | Оригинальный 6502-исходник 1989 г. | -| `MSDOS/` | Локальные `.DAT`-ресурсы DOS-версии. | - -## Референсы = только справочник - -`SDLPoP/`, `PR/`, `mininim/`, `Prince-of-Persia-Apple-II/` используются как -справочник структур/логики и как источник готовых ассетов — их код НЕ -копируется в наш порт (лицензии несовместимы, ABI другой). Любая механика -сверяется с `SDLPoP/src/` **до** реализации. - -## Форматы ресурсов - -Формат уровня почти идентичен в Apple II и DOS (2304 / 2305 байт, -`blueprnt`). Графика различается принципиально, но брать распакованные PNG -из `SDLPoP/data/` практичнее, чем декодировать сырой `.DAT`. Подробности — -[`docs/README.md`](docs/README.md). diff --git a/applications/PoP/bgtest/Makefile b/applications/PoP/bgtest/Makefile deleted file mode 100644 index 505393f..0000000 --- a/applications/PoP/bgtest/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# bgtest — мини-тест атласов статического фона PoP (Шаг 2, до порта room.c). -# Проверяет загрузку .atl + палитру + прямую адресацию + прозрачность. -# -# --memory huge (как poc): atlas_load/gfx_blit трогают W3; huge кладёт -# CODE в W1, DATA/BSS в W2 — без банков. --gfx 256 подлинкует bgi256. -# -# Данные фона генерит toolchain/pop_pack_bg.py в ../poc/res/bg/. - -EXAMPLE := bgtest -MEMORY ?= huge -EXTRA_FLAGS ?= --gfx 256 - -BG_DIR := $(CURDIR)/../poc/res/bg -BG_DATA := $(BG_DIR)/pop_env0.atl $(BG_DIR)/pop_env1.atl $(BG_DIR)/pop_env2.atl \ - $(BG_DIR)/pop_env3.atl $(BG_DIR)/pop_env4.atl \ - $(BG_DIR)/pop_wall.atl $(BG_DIR)/pop_fore.atl $(BG_DIR)/pop_bg.pal - -EXTRA_DATA := $(BG_DATA) -include $(CURDIR)/../sdk.mk - -# Ассеты фона: пересобрать пакером, если исходники поменялись. -$(BG_DATA): $(POP_ROOT)/toolchain/pop_pack_bg.py \ - $(POP_ROOT)/toolchain/render_room.py - cd $(POP_ROOT)/toolchain && python3 pop_pack_bg.py - -$(EXAMPLE).exe: $(BG_DATA) diff --git a/applications/PoP/bgtest/bgtest.c b/applications/PoP/bgtest/bgtest.c deleted file mode 100644 index 6d76751..0000000 --- a/applications/PoP/bgtest/bgtest.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * bgtest.c — мини-тест атласов статического фона PoP (Шаг 2 порта, ДО - * порта room.c). Проверяет на MAME: загрузку 7 .atl, палитру pop_bg.pal, - * ПРЯМУЮ адресацию (id -> страница/idx без remap-таблиц) и прозрачность - * (индекс 0xFF). Рисует сетку репрезентативных спрайтов на цветной - * заливке — прозрачные области должны показать фон. - * - * Раскладка из toolchain/pop_pack_bg.py (см. pop_bg_atlas.h): - * ENV фон id N -> env[N>>5], idx N&31 ; WALL/FORE idx = id. - */ -#include -#include -#include -#include -#include - -/* Имена файлов — плоская ФС диска (make_disk кладёт по basename). */ -static const char *const ENV_ATL[5] = { - "pop_env0.atl", "pop_env1.atl", "pop_env2.atl", - "pop_env3.atl", "pop_env4.atl" -}; - -static atlas_t env[5]; -static atlas_t wall_a; -static atlas_t fore_a; - -/* Блит одного спрайта ленты idx атласа a в (x,y): страница атласа в W0, - * gfx_blit читает w/h из getimage-заголовка ленты (в W0). */ -static void put(atlas_t *a, unsigned char idx, int x, int y) -{ - const void *img = atlas_image(a, idx); - gfx_w0_map(a->page); - gfx_blit(x, y, img); - gfx_w0_unmap(); -} - -static void put_env(unsigned char id, int x, int y) -{ - put(&env[id >> 5], (unsigned char)(id & 31), x, y); -} - -int main(void) -{ - int i; - - /* Загрузка всех 7 атласов (env0..4 + wall + fore). */ - for (i = 0; i < 5; i++) { - if (atlas_load(&env[i], ENV_ATL[i]) != 0) { - printf("atlas_load %s failed\n", ENV_ATL[i]); - return 1; - } - } - if (atlas_load(&wall_a, "pop_wall.atl") != 0) { puts("wall atl fail"); return 1; } - if (atlas_load(&fore_a, "pop_fore.atl") != 0) { puts("fore atl fail"); return 1; } - - initgraph(); - gfx_set_draw_page(0); - gfx_set_visible_page(0); - if (gfx_pal_fload(0, "pop_bg.pal") < 0) - gfx_pal_fload(0, "a:\\pop_bg.pal"); - /* Свой яркий фон-индекс (вне 0x50..0x6F, занятых графикой) — чтобы - * прозрачные (0xFF) области спрайтов были ЯВНО видны. */ -#define BG_IDX 0x20 - gfx_pal_set(0, BG_IDX, 120, 0, 90); /* r,g,b — тёмно-пурпурный */ - gfx_pal_sync(); - - setfillstyle(SOLID_FILL, BG_IDX); - bar(0, 0, 319, 255); - setcolor(WHITE); - outtextxy(2, 2, "PoP bg atlas test"); - - /* Прозрачный блит: банк не пишет 0xFF (фон проступает). */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - - /* --- Стены (chtab_7): нижние грани 7/9/5/3, основные 8/10/6/4 --- */ - put(&wall_a, 3, 4, 20); put(&wall_a, 5, 40, 20); - put(&wall_a, 7, 76, 20); put(&wall_a, 9, 112, 20); - put(&wall_a, 4, 4, 90); put(&wall_a, 6, 40, 90); - put(&wall_a, 8, 76, 90); put(&wall_a, 10, 112, 90); - /* декали-марки стен 14..17 */ - put(&wall_a, 14, 150, 20); put(&wall_a, 15, 168, 20); - put(&wall_a, 16, 186, 20); put(&wall_a, 17, 204, 20); - - /* --- Столб: база 92, боковая грань 93, фронт 95 (fore) --- */ - put_env(92, 4, 160); - put_env(93, 40, 160); - put(&fore_a, 95, 76, 160); - - /* --- Пол: база 41, правый треуг. 42, низ 43; силуэт 44/45 --- */ - put_env(41, 150, 120); - put_env(42, 190, 120); - put_env(44, 230, 120); - put_env(45, 260, 120); - - /* --- Решётка-окно 126, дебрис 97/98, слайсы ворот 52/53 --- */ - put_env(126, 150, 160); - put_env(97, 190, 160); - put_env(52, 230, 160); - put_env(53, 250, 160); - - gfx_set_bank(GFX_BANK_NORMAL); - /* Держим картинку на экране до нажатия (не полагаемся на блокирующий - * getch — в автотесте клавиш нет, крутимся до таймаута MAME). */ - while (!kbhit()) - gfx_wait_vsync(); - - closegraph(); - for (i = 0; i < 5; i++) atlas_free(&env[i]); - atlas_free(&wall_a); - atlas_free(&fore_a); - return 0; -} diff --git a/applications/PoP/coltest/Makefile b/applications/PoP/coltest/Makefile deleted file mode 100644 index eb55155..0000000 --- a/applications/PoP/coltest/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# coltest — прототип вертикального accel-copy (gfx_blit_cols) + флип. -EXAMPLE := coltest -MEMORY ?= huge -EXTRA_FLAGS ?= --gfx 256 -include $(CURDIR)/../sdk.mk diff --git a/applications/PoP/coltest/coltest.c b/applications/PoP/coltest/coltest.c deleted file mode 100644 index 87a6ce6..0000000 --- a/applications/PoP/coltest/coltest.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * coltest.c — прототип K2a: проверка вертикального accel-COPY - * (gfx_blit_cols) + прозрачности 0xFF + горизонтального флипа. - * - * Спрайт 16x24 column-major, АСИММЕТРИЧНЫЙ: - * левые 8 колонок: верх (row<12) = ПРОЗРАЧНО (0xFF), низ = БЕЛЫЙ (1) - * правые 8 колонок: КРАСНЫЙ (2) - * На синем фоне (3). Ожидаем на MAME: - * normal @ (50,100): слева бело-снизу+прозрачно-сверху, справа красный; - * flip @(120,100): ЗЕРКАЛО — слева красный, справа бело+прозрачно-сверху; - * в прозрачных местах виден СИНИЙ фон. - */ -#include -#include -#include - -#define W 16 -#define H 24 -static unsigned char spr[4 + W * H]; - -int main(void) -{ - int col, row; - - spr[0] = W; spr[1] = 0; - spr[2] = H; spr[3] = 0; - for (col = 0; col < W; col++) - for (row = 0; row < H; row++) { - /* ФИНАЛ: АСИММЕТРИЧНЫЙ — лево верх прозрачно / низ белый, - * право красное. normal: лево бело+прозрач-верх, право красн; - * flip: ЗЕРКАЛО (лево красн, право бело+прозрач-верх). */ - unsigned char v; - if (col < 8) - v = (row < 12) ? 0xFF : 1; - else - v = 2; - spr[4 + col * H + row] = v; - } - - initgraph(); - gfx_set_draw_page(0); - gfx_set_visible_page(0); - gfx_pal_set(0, 1, 255, 255, 255); /* белый */ - gfx_pal_set(0, 2, 224, 32, 32); /* красный */ - gfx_pal_set(0, 3, 32, 48, 200); /* синий фон */ - gfx_pal_set(0, 255, 0, 224, 0); /* ДИАГ: 0xFF как ЗЕЛЁНЫЙ цвет (bank NORMAL) */ - gfx_pal_sync(); - - setfillstyle(SOLID_FILL, 3); - bar(0, 0, 319, 255); - setcolor(1); - outtextxy(40, 80, "normal"); - outtextxy(110, 80, "flip"); - - gfx_set_bank(GFX_BANK_TRANSPARENT); /* ДИАГ: 0x58 подавление 0xFF (с тенью) */ - gfx_blit_cols(50, 100, spr, 0); /* обычный */ - gfx_blit_cols(120, 100, spr, 1); /* зеркало */ - gfx_set_bank(GFX_BANK_NORMAL); - - while (!kbhit()) - gfx_wait_vsync(); - closegraph(); - return 0; -} diff --git a/applications/PoP/docs/APPLEII_RESOURCE_FORMAT.md b/applications/PoP/docs/APPLEII_RESOURCE_FORMAT.md deleted file mode 100644 index a08fed1..0000000 --- a/applications/PoP/docs/APPLEII_RESOURCE_FORMAT.md +++ /dev/null @@ -1,283 +0,0 @@ -# Формат ресурсов Prince of Persia (Apple II, оригинальные исходники 1989) - -Источник — официально опубликованные Джорданом Мехнером исходники -(`Prince-of-Persia-Apple-II/`, 6502-ассемблер). В отличие от DOS-версии, здесь -формат восстановлен **напрямую по коду**, а не по догадкам о байтах — -уверенность высокая везде, где указана ссылка на конкретный файл/строки. - ---- - -## 1. Формат уровня (`01 POP Source/Levels/LEVEL0`…`LEVEL14`, 2304 байта) - -Файлы уровня — это побайтовый дамп структуры `blueprnt`, которая грузится по -фиксированному адресу `$b700` (`EQ.S:28`) и объявлена как `dum blueprnt` в -`EQ.S:258-266`. Никакого отдельного заголовка файла нет — это чистый образ -структуры в памяти: - -| Поле | Размер | Смещение в файле | Описание | -|---|---|---|---| -| `BLUETYPE` | 720 Б | 0–719 | 24 экрана × 30 тайлов: тип объекта/тайла | -| `BLUESPEC` | 720 Б | 720–1439 | 24 экрана × 30 тайлов: доп. байт состояния объекта | -| `LINKLOC` | 256 Б | 1440–1695 | Таблица связей нажимных плит/дверей, часть 1 | -| `LINKMAP` | 256 Б | 1696–1951 | Таблица связей, часть 2 | -| `MAP` | 96 Б | 1952–2047 | 24 экрана × 4 байта: граф соседних экранов | -| `INFO` | 256 Б | 2048–2303 | Метаданные уровня: старт Кида, стражников и т.д. | - -Сумма: 720+720+256+256+96+256 = **2304** — точно совпадает с размером файла, -что подтверждает: это чистый дамп структуры, без обёртки. - -### 1.1 Сетка тайлов (`BLUETYPE` / `BLUESPEC`) - -Каждый экран — ровно **30 тайлов** (10 столбцов × 3 ряда): подтверждено -таблицами `BlockTable`/`BlockEdge` (`TABLES.S:74-154`) и логикой перехода -между экранами в `CTRLSUBS.S:218-234` (при переходе через край экрана -`tempblockx` меняется на ±10, `tempblocky` — на ±3). - -Функция `CALCBLUE` (`GRAFIX.S:1757-1784`) вычисляет для экрана 1–24: -`BlueType = blueprnt + (screen-1)*30`, `BlueSpec = BlueType + 24*30`, -используя таблицу `Mult30` (`TABLES.S:131-140`). - -Байт `BLUETYPE` упакован битовыми полями (`EQ.S:484-486`): - -``` -бит 7-6: secmask (%11000000) — назначение не установлено по доступному коду - (возможно, служебное поле редактора) -бит 5: reqmask (%00100000) — флаг "необходимая опорная плитка" - (проверяется в BREAKLOOSE, MOVER.S:395-397) -бит 4-0: idmask (%00011111) — тип тайла/объекта, 0-29 -``` - -Перечень 30 типов объектов (`MOVEDATA.S:8-37`): - -``` -0 space 8 pillarbottom 16 exit 24 window2 -1 floor 9 pillartop 17 exit2 25 archbot -2 spikes 10 flask 18 slicer 26 archtop1 -3 posts 11 loose 19 torch 27 archtop2 -4 gate 12 panelwof 20 block 28 archtop3 -5 dpressplate 13 mirror 21 bones 29 archtop4 -6 pressplate 14 rubble 22 sword -7 panelwif 15 upressplate 23 window -``` - -Проверено вручную на дампе начала `LEVEL1` (`00 00 00 21 01 21 21 21 34 34 -33 33 21 23 00 34 14 14 14 34 14 34 34 2e 23 0b 01 21 34`) — например, -`0x33 → id=0x13=19 (torch)`+reqmask, `0x34 → id=20 (block)`+reqmask — -декодирование по таблице сходится чисто. - -`BLUESPEC` — доп. байт, чья семантика зависит от типа тайла (единой схемы -нет, разбирается объект-специфичным кодом): - -- **gate** (дверь, `FRAMEADV.S:2222-2234`): на диске — маленький enum (1 = - начинает открытой сверху, 2 = снизу, …), который через `initsettings` - (`FRAMEADV.S:22-23`, диапазон `gminval=0`..`gmaxval=188`, из - `MOVEDATA.S:56-57`) при инициализации уровня превращается в живой счётчик - "высоты двери" 0–188. -- **loose** (шаткая плитка, `FRAMEADV.S:2224-2237`): при инициализации всегда - принудительно обнуляется, независимо от значения на диске. -- **flask** (зелье, `FRAMEADV.S:2226,2239-2246`): значение×32 выбирает - цвет/тип зелья. -- **spikes** (шипы, `MOVER.S:365-382`, константы `spikeExt=5, spikeRet=9` в - `MOVEDATA.S:45-46`): 0 = безопасно/убраны, 1–8 — кадр анимации - выдвижения/втягивания, `$FF` = навсегда заклинило (тело наколото). -- **pressplate/upressplate** (нажимные плиты, `MOVER.S:425-464`, - `FRAMEADV.S:2059-2098`): значение — это **индекс в цепочке связей** - `LINKLOC`/`LINKMAP` (см. ниже); младшие 5 бит `LINKMAP` по этому индексу - одновременно служат счётчиком таймера плиты (0–31), определяющим - состояние "поднято/опущено". - -### 1.2 `LINKLOC` / `LINKMAP` — граф триггеров (нажимные плиты → двери и т.п.) - -Два параллельных массива по 256 байт кодируют цепочки "нажатие плиты X → -сработать объект на экране S, блок B". Восстановлено из `MOVER.S:506-537` -(цикл `trigger`) и `MOVER.S:1549-1581` (`gettimer/chgtimer/getloc/ -getlastflag/getscrn`): - -``` -LINKLOC[i]: бит 7 = флаг "последнее звено цепочки" - биты 6-5 = младшие 2 бита номера целевого экрана - биты 4-0 = номер целевого блока (0-29); $FF = "никуда не привязано" - -LINKMAP[i]: биты 7-5 = старшие 3 бита номера целевого экрана - (вместе с LINKLOC биты 6-5 → полный номер экрана 0-31) - биты 4-0 = таймер обратного отсчёта плиты (0-31, значим только - по индексу самой плиты) -``` - -`BLUESPEC` плиты хранит индекс `i` её *первого* звена; `getlastflag` идёт -вперёд (`inc linkindex`), пока не встретит бит 7 в `LINKLOC`. Сверено на -`LEVEL1`: байт по смещению 1440 (`0x89 = 10001001` → флаг конца цепочки, -целевой блок 9) и параллельно байт по смещению 1696 (`0x60 = 01100000` → -старшие биты номера экрана) — согласуется с этой раскладкой. Заполнены -реально используемые уровнем звенья, остальное — "мусорные" повторяющиеся -байты-заполнители. - -### 1.3 `MAP` — граф соседних экранов - -24 записи × 4 байта = 96 байт: для каждого экрана (1–24) -`MAP[(scrn-1)*4 + 0..3] = левый, правый, верхний, нижний соседние экраны`, -читается через `GETLEFT/GETRIGHT/GETUP/GETDOWN` (`CTRLSUBS.S:244-274`, -индексация `MAP-4..MAP-1,x` при `x = scrn*4`). Экран `0` зарезервирован как -"нет экрана" (проверка `beq ]rts` в этих же процедурах). - -### 1.4 `INFO` — метаданные уровня (256 байт, база = смещение файла 2048) - -Объявлено как `dum INFO` в `EQ.S:272-288`: - -| Смещение (от начала INFO) | Поле | Размер | -|---|---|---| -| 0 | "число экранов + 1" (используется в `SETINITIALS`, `SUBS.S:1441-1445`) | 1 | -| 1–63 | резерв/не используется | 63 | -| 64 | `KidStartScrn` | 1 | -| 65 | `KidStartBlock` | 1 | -| 66 | `KidStartFace` (направление; при загрузке инвертируется XOR `$ff`, `SUBS.S:1516-1518`) | 1 | -| 67 | заполнитель | 1 | -| 68 | `SwStartScrn` (стартовый экран меча) | 1 | -| 69 | `SwStartBlock` | 1 | -| 70 | заполнитель | 1 | -| 71–94 | `GdStartBlock[1..24]` — стартовый блок стражника на экране; **≥30 = "стражника нет"** (`AUTO.S:1832-1834`, `SUBS.S:1677-1679`) | 24 | -| 95–118 | `GdStartFace[1..24]` (86 = "стражника нет", см. `ShadFace cmp #86` по всему `AUTO.S`) | 24 | -| 119–142 | `GdStartX[1..24]` — пересчитывается заново из блока при старте уровня, значение на диске почти не используется (`SUBS.S:1674-1690`) | 24 | -| 143–166 | `GdStartSeqL[1..24]` | 24 | -| 167–190 | `GdStartProg[1..24]` — "программа"/поведение ИИ стражника | 24 | -| 191–214 | `GdStartSeqH[1..24]` — обнуляется при старте (`SUBS.S:1685-1686`) | 24 | -| 215–255 | резерв/не используется | 41 | - -Проверено на `LEVEL1`: байт по смещению файла 0x800 = `0x18`=24 (число -активных экранов = 23+1); по смещению 0x840 — `01 00 ff 00 00 00 ff 1e 1e -11 1e 1e ...` → `KidStartScrn=1, KidStartBlock=0, KidStartFace=$FF, -SwStartScrn=0, SwStartBlock=0`, далее 24 байта `GdStartBlock`, в основном -`0x1e`(30, "нет стражника"), с реальной расстановкой только на экране 3 -(`0x11`=17) и экране 23 (`0x06`) — согласуется с уровнем, где всего два -стражника. - -### 1.5 Как уровень попадает с диска (важно: имя файла — не игровой механизм) - -В рантайме нет чтения "по имени файла LEVELn" — это чисто утилита для -экспорта в этом репозитории. Реально `LOADLEVELX` (`MISC.S:795-809`) -использует фиксированные таблицы по номеру уровня `bluepTRKlst`/ -`bluepREGlst` (`MISC.S:776-787`), дающие физическую **дорожку (1-33)** и -**регион (0/1)**, затем `rdbluep` (`MASTER.S:598-616`) вызывает -низкоуровневое чтение `rw18` (`RdGrpErr`) 9 физических групп по 256 байт -(`$b7-$bf`) — 9×256=2304 байта — прямо в буфер blueprint; регион 0/1 выбирает -половину 18-секторной дорожки (два уровня делят одну дорожку). Файлы -`LEVELn` в этом репозитории — реконструкция этого сырого блока для удобства -работы с инструментами. - ---- - -## 2. Формат изображений/спрайтов (`IMG.CHTAB1-7`, `IMG.BGTAB1/2.DUN/.PAL`) - -Каждый такой файл грузится целиком по **фиксированному адресу**, заданному -константами `chtableN`/`bgtableN` (`GAMEEQ.S:9-18`): - -``` -chtable1=$6000 chtable2=$8400 chtable3=$0800 chtable4=$9600 -chtable5=$a800 chtable6=$6000 chtable7=$9f00 -bgtable1=$6000 bgtable2=$8400 -``` -— то есть смещения внутри файла один-в-один совпадают с адресами в памяти -после загрузки. - -### 2.1 Раскладка контейнера - -Восстановлено из заголовка-комментария "Image table format" в `HIRES.S:181-186`, -процедуры разрешения указателя `setimage` (`HIRES.S:263-277`) и -`GETWIDTH`/`PREPREP` (`HIRES.S:283-339`): - -``` -Смещение 0 : 1 байт — число изображений в таблице (максимум 127, - в образцах встречается 0x7f) -Смещение 1..254 : 127 × 2-байтных little-endian указателей - (указатель на изображение N — по смещению 1+(N-1)*2, - N=1..127) — АБСОЛЮТНЫЕ адреса в адресном пространстве - фиксированной загрузки этой таблицы, указывающие на - запись данных этого изображения -Смещение 255 : заполнитель (таблица указателей занимает ровно 256 байт) -Смещение 256 (база+0x100) и далее: - последовательно идущие записи данных изображений: - байт 0: ширина (в байтах на строку) - байт 1: высота (число строк) - байты 2..(2+ширина*высота-1): сырые байты пикселей, - слева направо, сверху вниз, БЕЗ сжатия -``` - -Проверено вручную на `IMG.BGTAB1.DUN`: с точной арифметикой индексов из -`setimage` (`Y = image*2 - 1`, `HIRES.S:264-267`) первые ~30 записей дают -строго возрастающую последовательность указателей `0x6101, 0x6133, 0x6159, -0x618b, 0x61c9, 0x61fb, 0x6221, 0x6313, 0x63c9, ...` — указатель -изображения #1 приходится ровно на `bgtable1 ($6000) + 0x100`, то есть точно -на конец 256-байтной таблицы указателей. Это независимо подтверждает и -размер таблицы, и семантику указателей. - -**Важно: сжатия в этом формате нет.** RLE/дельта-упаковка (`SngExpand`/ -`DblExpand`/`DeltaExpPop`/`DeltaExpWipe` в `01 POP Source/Source/UNPACK.S`) -применяется только к полноэкранным изображениям (титры/пролог/катсцены), но -не к CHTAB/BGTAB — спрайты и фоновые тайлы хранятся как чистые упакованные -байты hi-res/double-hi-res экрана Apple II, без какого-либо RLE или дельты. - -### 2.2 Параметры отрисовки (не часть файла ресурса) - -При выводе спрайта (`LAY`/`FASTLAY`/`PEEL` и т.д., `HIRES.S:658-1740`) -используются zero-page параметры `PAGE/XCO/YCO/OFFSET/IMAGE/OPACITY/TABLE/ -BANK` (описаны в `HIRES.S:155-178`): `OFFSET` (0–6) — горизontальный сдвиг на -под-байтовый пиксель, `OPACITY` выбирает режим совмещения (AND/OR/STA/XOR/ -маска-OR) плюс отдельный бит горизонтального зеркалирования (бит 7). Это -чисто рантайм-параметры отрисовки, не хранящиеся в файле ресурса. Точный -механизм барабанного сдвига для `OFFSET` (таблицы `HRTABLES.S`/`YLO`/`YHI`) -не прослежен до конца — при необходимости требует отдельного анализа. - -### 2.3 Инструмент DRAZ (авторская утилита создания спрайтов) - -В `04 Support/DRAZ` нет исходников самой утилиты DRAZ — только файлы данных -(`PAC.*` — позы персонажей, и уже скомпилированные `IMG.*`), поэтому -внутренний пайплайн DRAZ (как позы превращаются в CHTAB) напрямую не виден. -Формат контейнера выше выведен полностью из кода движка-потребителя, что -является надёжным, но косвенным источником. - -Отдельно: в игровой логике списков объектов (`ADDBACK`, `GRAFIX.S:191-214`) -встречается **рантайм-упаковка ссылки на фоновую картинку** в один байт: бит -7 выбирает `bgtable1` или `bgtable2`, биты 0-6 — номер картинки в таблице -(0-63). Это соглашение для внутриигровых списков объектов (`bgIMG` и т.п.), а -не свойство самих файлов CHTAB/BGTAB на диске. - ---- - -## 3. "Главного индекса ресурсов" не существует - -В отличие от DOS-версии (см. `docs/MSDOS_RESOURCE_FORMAT.md`), в рантайм-коде -Apple II **нет обобщённого справочника "имя ресурса → расположение на -диске"**. Расположение каждого ресурса зашито напрямую как таблицы -дорожка/группа-секторов прямо в коде загрузчика: - -- Уровни: `bluepTRKlst`/`bluepREGlst` (`MISC.S:776-787`), используются - `LOADLEVELX`/`LOADLEVEL` (`MISC.S:795-809`, `MASTER.S:467-481`). -- Альтернативные наборы фонов/персонажей: `bg1trk`/`bg2trk`/`ch4trk`/`ch4off` - (`MASTER.S:522-528`). -- Массовая загрузка при старте (chtable1-7, bgtable1-2, seqtable и т.д.): - прямые вызовы `rw18`/`RdGrp`/`RdSeq` с литеральными hex-списками - групп-секторов в `MASTER.S:1250-1360` и `BOOT.S:100-118`. - -Весь дисковый ввод-вывод идёт через нестандартный низкоуровневый драйвер -`rw18` (`rw18 = $d000`, `EQ.S:11-12`; папка `02 POP Disk Routines/RW1835`), -реализующий нестандартный формат **18 секторов/дорожку** (вместо 16 у -стандартного DOS 3.3) — этим объясняется, почему регионы уровня (9×256Б) -идут парами на одной физической дорожке. Символические имена -`chtableN`/`bgtableN` в `GAMEEQ.S` — ближайший аналог "индекса ресурсов", но -они связывают ресурс с **фиксированным адресом в ОЗУ**, а не с положением на -диске; связь с диском — отдельная, вручную сопровождаемая таблица, -сопоставленная с ресурсом лишь порядком вызовов загрузчика. - ---- - -## 4. Что ещё не восстановлено (открытые вопросы) - -- Точное назначение бит `secmask` (%11000000) в `BLUETYPE` — не встречено - использование в доступном игровом коде (возможно, поле только для - редактора уровней, не читается движком). -- Механизм барабанного сдвига `OFFSET` для суб-байтового позиционирования - спрайта по X (`HRTABLES.S`) — не прослежен в деталях. -- Внутренний формат авторских файлов `PAC.*` инструмента DRAZ (как позы - скелетной анимации превращаются в растровые кадры CHTAB) — исходники DRAZ - отсутствуют в репозитории, можно только косвенно восстановить по - результату (уже скомпилированным `IMG.*`). diff --git a/applications/PoP/docs/KID_PLAN.md b/applications/PoP/docs/KID_PLAN.md deleted file mode 100644 index 42771ac..0000000 --- a/applications/PoP/docs/KID_PLAN.md +++ /dev/null @@ -1,214 +0,0 @@ -# Prince of Persia — Kid (персонаж): анализ и план - -> **Статус: РЕАЛИЗОВАНО (2026-08-01).** Kid играется целиком: интерпретатор -> `seqtbl` + `frame_table` (`roomtest/pop_kid.c`), диспетчер `control()` -> (`pop_ctrl.c`), коллизия/физика/зацеп (`pop_map.c`), бой и HP. Модель -> персонажа стала общей: `Char`-окно (`pop_state.c`) обслуживает и Кида, и -> стражей. Таблицы кадров и `seqtbl` уехали из `_CODE` в EMM-страницу -> (`kid_data.bin`, см. `layout_plan_v2.md` шаг 1). -> -> Отступление от §2.1 плана: выбран ПАДДИНГ кадров (общий канвас), а не -> per-frame offset — компромисс зафиксирован в `PORT_PLAN.md §6.1`. -> -> **Документ оставлен как СПРАВОЧНИК по модели персонажа** (`char_type`, -> категории `actions_*`, устройство `play_seq`, объём спрайтов) — он нужен -> при портировании остальных акторов (скелет, тень, визирь). Текущие -> задачи — `../roomtest/TASKS_OPEN.md`. - -Составлен 2026-07-16. Опирается на разбор `SDLPoP/src/seg006.c` -(ядро физики/управления Kid), `seqtbl.c` (таблицы последовательностей), -`types.h` (char_type, seq_*, SEQ_*, actions_*), `SDLPoP/data/KID` (спрайты). -Фон уже готов и проверен на MAME (`applications/PoP/roomtest`, см. -`memory/pop_background_strategy`) — Kid развиваем в том же `roomtest` как -новый PoC (решение пользователя: старый `poc/` не трогаем). - -**Копирайт:** спрайты Kid (`SDLPoP/data/KID`) — Broderbund/Ubisoft. -Использование настоящей графики Kid — сознательное решение пользователя -(в отличие от плейсхолдера в старом `poc/`, см. PORT_PLAN §5.1). - ---- - -## 1. Как устроен персонаж в оригинале (что портируем) - -### 1.1 Состояние — `char_type` (14 полей, types.h) - -``` -frame текущий номер кадра (индекс во frame_table_kid) -x, y позиция (byte; x — с учётом direction) -direction -1 влево / 0 вправо -curr_col, логическая клетка (тайл), где персонаж -curr_row -action КАТЕГОРИЯ действия (actions_*, см. 1.2) -fall_x, скорость падения (fall_y<22 = 1 ряд, <33 = 2 ряда) -fall_y -room комната -repeat счётчик для удержания-ввода (напр. повторный прыжок) -sword есть ли меч (бой — вне Фазы 1) -alive жив/мёртв -curr_seq УКАЗАТЕЛЬ в seqtbl (байткод текущей последовательности) -``` - -Состояние крошечное — легко живёт в W2. - -### 1.2 Категории действия — `actions_*` (9 шт) - -`0 stand`, `1 run_jump`, `2 hang_climb`, `3 in_midair`, `4 in_freefall`, -`5 bumped`, `6 hang_straight`, `7 turn`, `99 hurt`. `action` определяет, -как `check_action()`/`play_kid()` реагируют на ввод и физику каждый тик. - -### 1.3 Движок анимации/движения — ГЛАВНОЕ - -**Движение НЕ физика, а байткод + per-frame смещения** (подтверждает -PORT_PLAN §6). Три уровня: - -1. **`seqtbl`** — байткод-программа на действие. Опкоды (types.h): - `SEQ_DX`(0xFB) сдвиг x на amount×direction, `SEQ_DY`(0xFA) сдвиг y, - `SEQ_FLIP`(0xFE) разворот, `SEQ_JMP`(0xFF)/`SEQ_JMP_IF_FEATHER`(0xF7), - `SEQ_UP`/`SEQ_DOWN`(0xFD/0xFC) смена ряда, `SEQ_ACTION`(0xF9) задать - `Char.action`, `SEQ_SET_FALL`(0xF8), `SEQ_KNOCK_UP/DOWN`, `SEQ_SOUND`, - `SEQ_DIE`/`SEQ_END_LEVEL`/`SEQ_GET_ITEM`. **Байт < 0xF0 = НОМЕР КАДРА** - → ставит `Char.frame` и play_seq возвращается (один кадр за тик). -2. **`play_seq()`** (seg006.c:570) — интерпретатор: крутит опкоды из - `seqtbl + Char.curr_seq`, пока не встретит кадр. ~15 case — портируется - 1-в-1. **Квирк:** seqtbl использует АБСОЛЮТНЫЕ DOS-адреса в JMP; - `SEQTBL_0 = seqtbl - SEQTBL_BASE(0x196E)` — при порте пересчитать - базу (JMP-адреса в наших данных). -3. **`frame_table_kid[]`** (seg006.c:127, ~180 кадров) — на КАЖДЫЙ кадр: - `{image, sword_flags, dx, dy, flags}`. `image` — индекс спрайта Kid; - `dx/dy` — смещение позиции ЭТОГО кадра; `flags`: 0x1F weight_x, 0x20 - thin, 0x40 needs_floor, 0x80 even/odd-pixel (влияет на x-рендер). - -**Тик персонажа:** `play_kid()` (диспетчер по action+вводу) → `play_seq()` -(двигает curr_seq, ставит кадр, применяет seq-dx/dy) → `frame_table[frame]` -даёт image+собственные dx/dy → позиция и спрайт. У нас это ложится на -`sprite_frame`+`sprite_move` (НЕ `sprite_anim`/`sprite_moveto` — см. -PORT_PLAN §6: авторские таблицы, не автопрогрессия). - -### 1.4 Управление — `control_kid()`/`read_user_control()` (seg006.c) - -Читает ввод (у нас — held-state `kbd_raw`, уже готово, §2 PORT_PLAN) и по -`Char.action` выбирает последовательность (`seqtbl_offset_char(seq_id)`). -Логика «что можно из какого состояния» — ядро ощущения PoP. - -### 1.5 Взаимодействие с картой — collision (seg006.c) - -`check_on_floor()`/`start_fall()` — пол под ногами / падение в яму; -`in_wall()` — упор в стену (сдвиг наружу); `check_grab()`/ -`can_grab_front_above()` — зацеп за уступ; `fell_out()` — вывалиться из -комнаты; `check_spiked()`/loose — ловушки; `fall_accel()`/`fall_speed()` — -ускорение падения. Всё читает ТИП тайла (`get_tile`) — у нас это уже -разобранные `fg[]/bg[]` (level.h/room1_data.h). - ---- - -## 2. Спрайты Kid (219 шт, 16 цветов, 177 КБ) - -- 219 PNG (`data/KID`), 16-цветные (палитра `res400.pal`, 16×RGB как env/ - wall), макс кадр **53×35** — влезает в лимит движка 64×64. 177 КБ в - 8bpp. -- `frame_table_kid` отображает кадр→`image` (индекс спрайта). Число - РАЗЛИЧНЫХ image — уточнить (≤219); паковать те, что реально используются - платформинг-последовательностями Фазы 1 (не все 219 — бой/катсцены - отдельно). -- **Палитра:** Kid 16 цветов → слоты Sprinter `0x70-0x7F` (env 0x50, wall - 0x60 уже заняты; Kid не пересекается). Пиксель i: 0→0xFF, i→0x70+i. - Тот же пайплайн, что `pop_pack_bg.py`. -- **Атлас:** прямая адресация по номеру image (как фон): `kid[img>>5]`, - idx `img&31`; ~7 EMM-страниц (или SHIFT=4). Свой пакер `pop_pack_kid.py` - (переиспользовать код `pop_pack_bg.py`). - -### 2.1 РЕШЕНИЕ ДО СТАРТА: per-frame offset vs padding - -Кадры Kid — РАЗНОГО размера, а `sprite_t` рисует от угла фикс. w/h. Два -пути (см. PORT_PLAN §6.1, `memory/png_strip_padding_tradeoff`): -- **Padding** (bottom-center) — просто, но 219×53×35 ≈ 406 КБ (раздув ×2.3). -- **Per-frame offset** — хранить XCO/YCO кадра (у оригинала он и есть, - `APPLEII_RESOURCE_FORMAT §2.2`), рисовать `blit(x+xco, y+yco)`; паддинг не - нужен, память по факту (177 КБ). Требует лёгкого расширения хранения - (offset рядом с кадром) ИЛИ ручного смещения в коде рендера Kid. -**Рекомендация:** per-frame offset — оригинал так и делает (frame_table dx/dy -+ image XCO/YCO), даёт точное позиционирование И экономию. Хранить xco/yco -в нашей копии frame_table (добавить 2 байта/кадр — ~360 Б). Не тянуть -расширение `sprite.h` — рисовать Kid прямым `gfx_blit(x+xco, y+yco, img)` -(как фон), НЕ через retained `sprite_t`, раз позиция и кадр всё равно -задаются вручную каждый тик. - ---- - -## 3. Данные для порта (объём) - -- `frame_table_kid` → C-массив ~180×(5+2 offset) ≈ 1.3 КБ (const, ROM). -- `seqtbl` (нужные последовательности) → C-массив байт. Весь seqtbl ~1-2 КБ; - для Фазы 1 можно взять только платформинг-последовательности (вырезать - бой/гардов 55-92) — оценить после разметки. JMP-адреса пересчитать под - свою базу. -- Спрайты — атласы (EMM, не W2). - ---- - -## 4. Фазы работы (по твоему списку, порядок по зависимостям) - -**Фаза K0 — конвейер спрайтов + отрисовка одного кадра** -- `pop_pack_kid.py`: 219 (или подмножество) → `kid*.atl` + `kid.pal` - (слоты 0x70), таблица кадр→image + xco/yco. -- Отрисовать Kid ОДНИМ кадром (stand) в roomtest поверх фона на верном - тайле — проверить палитру/позицию/прозрачность на MAME. -- Артефакт-цель: Kid стоит на уступе комнаты 1 как в `1.1-2.png`. - -**Фаза K1 — движок анимации (play_seq + frame_table)** -- Портировать `play_seq()` (интерпретатор) + `frame_table_kid` + минимальный - `seqtbl` (stand/run/turn). -- Прогнать несколько последовательностей вручную (stand→run→stop) — - проверить, что кадры и смещения совпадают с оригиналом (сверять с - SDLPoP/скриншотами, тайминг 50 Гц). - -**Фаза K2 — управление на месте + ходьба (твои а, б)** -- `control_kid` подмножество: stand (2), run (1/84/13), turn (5/6), - standing_jump (3), crouch (50/49), safe_step (29-44 — аккуратный шаг). -- Held-state через `kbd_raw` (готово). - -**Фаза K3 — коллизия с картой (твой п.3)** -- `check_on_floor`/`start_fall` — падение в ямы (тип тайла под ногами из - `fg[]`); `in_wall`/стоп у стены; `fell_out` (край экрана — пока без - перехода комнат). -- Падения/приземления (seq 7/17/19/20) + `fall_accel/fall_speed`. - -**Фаза K4 — прыжки и повисание (твои а-прыжок, в)** -- run_jump (4), jump_up (28/14), grab (8/16/24), climb_up (10)/down (68), - hang (25/6), release (11/23). Это самый «PoP-овый» кусок — сверять - дистанции/тайминг с оригиналом (не на глаз). - -**Фаза K5 — прочее (твой г)** -- drink (78), level_door (70), crouch_hop (79), spiked/loose/chomped - (ловушки, если тайлы есть в комнате), death (71). - -Бой (меч, seq 55-92, стражники — seg005) — ВНЕ этого плана (отдельная фаза -полного приложения, PORT_PLAN §7 Фаза 3). - ---- - -## 5. Риски/решения ДО кода (правило defer_unexplained_quirks) - -1. **Per-frame offset** (§2.1) — решить до K0 (влияет на формат данных). - Рекомендация: xco/yco в frame_table, прямой blit. -2. **seqtbl rebasing** — JMP-адреса абсолютные (SEQTBL_BASE 0x196E); при - порте пересчитать в оффсеты своего массива. Проверить на 1-2 seq. -3. **Тайминг** — оригинал (DOS) фиксированный тик; наш 50 Гц. Если - логическая частота кадров иная — пересчёт dx/dy (PORT_PLAN §8.4). - Сверять дистанцию бега/прыжка с эталоном. -4. **Число реально нужных кадров/последовательностей** для Фазы 1 — - разметить (вырезать бой/катсцены/гардов), чтобы не тянуть все 219 - спрайта и весь seqtbl. -5. **Копирайт графики Kid** — подтверждено решение пользователя (§вводная). - ---- - -## 6. Что переиспользуем (готово) - -- Фон комнаты (`pop_bg.c`) — Kid рисуется ПОВЕРХ (сейчас — прямым blit; - heal против фона — когда/если понадобится через RAM-копию, фон её уже - заполняет, `GFX_BANK_TRANSPARENT`). -- `kbd_raw` held-state (§2 PORT_PLAN) — готов и проверен. -- Пакер спрайтов/палитра (`pop_pack_bg.py`) — шаблон для `pop_pack_kid.py`. -- Разобранная карта комнаты (`fg[]/bg[]`, level.h) — для коллизий. -- `gfx_blit`/`gfx_w0_map` из W0-атласа — проверенный путь (bgtest/roomtest). diff --git a/applications/PoP/docs/MSDOS_RESOURCE_FORMAT.md b/applications/PoP/docs/MSDOS_RESOURCE_FORMAT.md deleted file mode 100644 index 580e92b..0000000 --- a/applications/PoP/docs/MSDOS_RESOURCE_FORMAT.md +++ /dev/null @@ -1,301 +0,0 @@ -# Формат ресурсов Prince of Persia (MS-DOS, каталог `MSDOS/`) - -Документ описывает бинарный формат `*.DAT`-файлов ресурсов DOS-версии PoP. -Исходников для этой версии нет, поэтому всё, что ниже — результат -структурного (эмпирического) анализа реальных файлов из `MSDOS/`, а не чтения -кода. Уровень уверенности указан для каждого раздела. Все находки проверены -скриптами (Python), которые разбирают файл и валидируют согласованность -(например: смещение+размер последней записи таблицы точно совпадает с -началом самой таблицы — то есть данные и каталог стыкуются без дыр). - -**Основной источник спецификации формата — `POP-DAT-FormatSpecifications.pdf`** -(и его текстовая конверсия `POP-DAT-FormatSpecifications.txt` в этой же папке, -для grep/цитирования): *«Prince of Persia — Specifications of File Formats»*, -Princed Development Team, 2008 — каноническая спецификация формата `DAT v1.0`, -на которой построен и SDLPoP, и Princed Resources. Разбирает контейнер, индекс, -чек-сумму, кодеки изображений (RLE / LZG), палитры, формат уровней (room -mapping, wall-drawing, room-linking, guards, start position, door events), -звук (digital waves / MIDI / PC speaker), бинарные файлы и Mac-варианты. При -любом расхождении между эмпирическими находками ниже и этим документом — -источником истины считать спецификацию (сверять §-номера: её §3.x). - -Дополнительно как справка при реализации (порт на ZX Sprinter): - -- **SDLPoP** (github.com/NagyD/SDLPoP, GPLv3) — open-source реализация - DOS-версии на основе дизассемблирования оригинального `PRINCE.EXE`. Содержит - рабочий код чтения `.DAT`-файлов и полный кодек изображений/уровней. Точные - структуры (`dat_table_type` и т.п.), процитированные ниже, получены через - автоматический пересказ содержимого файла третьей стороной, а не через - прямое чтение исходника — поэтому такие детали помечены как "требует сверки - при реализации", в отличие от эмпирически подтверждённых байтовых оффсетов. -- **Princed Resources / PR** (github.com/NagyD/PR, princed.org, GPLv2) — это - профильный инструмент именно для распаковки/запаковки `.DAT`-ресурсов PoP - (версии DAT 1 и 2), сделанный тем же автором. В его документации - (`doc/Dataformats.md`) официально описаны экспортные форматы ресурсов — - это подтверждает и уточняет часть находок ниже (см. §3–4), и является более - надёжным источником, чем самостоятельная догадка по байтам. - -**Важная находка:** репозиторий SDLPoP в папке `data/` содержит не только -код движка, но и **реальные ресурсы игры** — как сырые `.DAT`-контейнеры, так -и уже распакованные поштучно файлы (PNG-кадры спрайтов, `.pal`-палитры, -`.bin`-дампы уровней), см. §7. Это готовый источник ассетов и одновременно -независимая проверка формата, описанного в этом документе. - ---- - -## 1. Общий контейнер `.DAT` (уверенность: высокая, подтверждено на 28 файлах) - -Каждый `*.DAT`-файл (кроме служебных `config.dat`/`setup.dat`, см. §5) — это -простой архив-контейнер: блок данных + оглавление (каталог ресурсов) в конце -файла. - -### 1.1 Заголовок файла (6 байт, смещение 0x00) - -| Смещение | Размер | Поле | Значение | -|----------|--------|--------------|----------| -| 0x00 | 4 | `tableOffset`| LE u32. Абсолютное смещение в файле, с которого начинается таблица оглавления. Совпадает с "концом данных". | -| 0x04 | 2 | `tableSize` | LE u16. Размер таблицы оглавления в байтах. | - -Инвариант, подтверждённый на всех 28 `.dat`-файлах в каталоге: - -``` -tableOffset + tableSize == размер файла (без исключений) -``` - -Данные ресурсов идут сразу после заголовка, начиная с байта 0x06, и -заканчиваются на `tableOffset`. - -### 1.2 Таблица оглавления (по смещению `tableOffset`, длиной `tableSize`) - -Таблица — плоский массив записей по 8 байт. Количество записей: -`tableSize / 8` (округление вниз; в файле почти всегда остаётся 2 "лишних" -байта в хвосте таблицы — назначение не установлено, вероятно, служебное поле -инструмента-упаковщика или паддинг; на итоговый разбор не влияет). - -Запись (8 байт): - -| Смещение в записи | Размер | Поле | Описание | -|---|---|---|---| -| 0 | 2 | `size` | LE u16 — размер данных ресурса в байтах | -| 2 | 2 | `id` | LE u16 — идентификатор ресурса | -| 4 | 2 | `offset` | LE u16 — **абсолютное** смещение данных ресурса в файле (не относительное!) | -| 6 | 2 | `reserved` | во всех проверенных записях (сотни штук) всегда `0x0000` | - -Проверено на `levels.dat`: 16 записей, `id`=2000..2015, и `offset[i] + size[i] -== offset[i+1]` для всех соседних записей, а последняя запись заканчивается -ровно на `tableOffset` — то есть данные абсолютно плотно упакованы, без -пробелов, для этого файла. В других файлах (например `guard.dat`) между -записями изредка есть небольшие зазоры в несколько байт (вероятно, выравнивание -или "мёртвые" байты от инструмента-компоновщика) — не является нарушением -формата. - -### 1.3 Диапазоны `id` по типам файлов (собрано эмпирически) - -Похоже, что числовые ID образуют условные "пространства имён" по типу -контента — вероятно, глобальные константы в оригинальном коде: - -| Файл(ы) | Диапазон `id` | Кол-во записей | Предполагаемое содержимое | -|---|---|---|---| -| `levels.dat` | 2000–2015 | 16 | id=2000 — служебный блок (16 байт, см. §3); id=2001..2015 — 15 уровней | -| `guard.dat`, `fat.dat`, `skel.dat`, `shadow.dat` | 750–784 (варьируется) | ~30–35 | id=751(750) — служебный блок; остальные — кадры анимации спрайта | -| `vizier.dat` | аналогично guard | — | кадры анимации визиря | -| `kid.dat` | ~400+ | 220 | кадры анимации игрока (намного больше — герой умеет гораздо больше действий) | -| `guard1.dat`, `guard2.dat` | 750 (1 запись) | 1 | вероятно, дополнительные/альтернативные кадры/варианты | -| `title.dat` | 40–55 | 12 | картинки титульного экрана/логотипов | -| `cpalace.dat`,`epalace.dat`,`vpalace.dat`,`cdungeon.dat`,`edungeon.dat`,`vdungeon.dat` | 200–1343 | 205–238 | фоновые тайлы дворца/подземелья, отдельно для CGA(`c*`)/EGA(`e*`)/VGA(`v*`) | -| `pv.dat` | 800–981 | 103 | доп. графика (возможно, "Prince/Vizier" катсцены) | -| `digisnd1/2/3.dat` | 10000+ | 20–44 | оцифрованный звук (Covox/Disney Sound Source) | -| `midisnd1/2.dat` | 10024+ / аналог | 16 | General MIDI музыка | -| `mt32snd1/2.dat` | 10000+ | 24/7 | музыка для Roland MT-32 | -| `ibm_snd1/2.dat` | 10000+ | 44 | музыка/эффекты через PC-спикер | -| `prince.dat` | — (1 крупный ресурс) | — | MIDI-тема (вероятно, финальная тема "Принц"/титры — см. текстовые события "The Princess awaits") | - -Во всех файлах первая (наименьшая по `id`) запись — маленький "служебный" -ресурс (6–44 байта), стоящий перед основным контентом. Скорее всего это -локальная мини-таблица/палитра/список ссылок для данного набора ресурсов — -по аналогии с тем, что у уровней id=2000 отдельно от самих уровней (см. §3). - ---- - -## 2. Формат уровня (`levels.dat`, id=2001..2015) — уверенность: высокая - -Каждая запись уровня имеет размер **2305 байт** и по данным полностью -совпадает по объёму с уровнями из Apple II версии (`01 POP Source/Levels/LEVELn` -— ровно **2304 байта** каждый, см. `docs/APPLEII_RESOURCE_FORMAT.md`). - -Вывод: формат карты уровня в DOS-версии, судя по всему, **унаследован -практически без изменений от оригинального Apple II формата** (Джордан -Мехнер писал игру на 6502 и данные уровней переносились как есть), с добавлением -одного лишнего байта в DOS-упаковке (2304+1=2305 — вероятно, контрольный байт/ -маркер конца, добавленный DOS-упаковщиком ресурсов, а не часть игровых данных). - -**Практическое следствие:** байтовая структура самого уровня (тайлы 3×10 на -экран, 24 экрана, таблицы стражников, дверей и т.д.) должна документироваться -один раз — по исходникам Apple II (см. соответствующий раздел), и напрямую -применяться к DOS `levels.dat`, отбросив 1 лишний байт в конце каждой записи. -Байтовые значения тайлов в дампе (в основном 0x00–0x39) визуально согласуются -с диапазоном небольших целых кодов тайлов, что для формата карты и ожидается. - -Первая запись, id=2000, размер 16 байт — не уровень, а отдельный маленький -блок (возможно: количество уровней, начальный уровень, версия формата, -стартовые координаты игрока/охраны по умолчанию). Точное назначение не -установлено — требует сопоставления с диз­ассемблированным кодом загрузчика -уровней (в SDLPoP это, по всем признакам, отдельная процедура чтения -`level` ресурса). - -**Сверка с независимой распаковкой SDLPoP (`data/LEVELS/`):** там лежат файлы -`res2000.bin`…`res2015.bin` (16 штук — количество совпадает). Байты -`res2001.bin` содержательно совпадают с тайловыми данными нашей записи -id=2001 (та же последовательность значений тайлов) — это подтверждает, что -нумерация id верна. Но есть нестыковка по размеру: у SDLPoP `res2000.bin` — -**2305 байт** (как и все остальные), тогда как в нашем локальном -`levels.dat` запись id=2000 — всего **16 байт**. Скорее всего, это разные -релизы/сборки игры (см. §7 — размеры некоторых `.dat` у SDLPoP и у нас уже -отличались), и в версии SDLPoP маленький служебный блок либо отсутствует, -либо пронумерован иначе. Это не меняет сам формат контейнера, но означает, -что **точную семантику 16-байтного блока id=2000 в нашей копии игры пока -нельзя проверить через данные SDLPoP** — открытый вопрос. - ---- - -### 2.1 Кросс-подтверждение по исходникам Apple II - -Фоновый анализ исходников Apple II (см. `docs/APPLEII_RESOURCE_FORMAT.md`) -подтверждает и объясняет структуру уровня напрямую по коду. Уровень на Apple -II — дамп структуры `blueprnt` (`EQ.S`): `BLUETYPE`(720Б, 24 экрана×30 тайлов) -+ `BLUESPEC`(720Б) + `LINKLOC`(256Б) + `LINKMAP`(256Б) + `MAP`(96Б, граф -соседних экранов) + `INFO`(256Б, метаданные/старт Кида/стражников) = ровно -2304 байта. Учитывая, что DOS-запись уровня — это ровно 2304+1 байт с -байтовыми значениями тайлов, укладывающимися в диапазон 0–29 (id тайла) плюс -служебные биты (аналогично `idmask=%00011111`, `reqmask=%00100000` из -`EQ.S:484-486`), можно с высокой уверенностью считать, что **DOS-версия -использует ту же самую раскладку `blueprnt`**, лишь с добавлением одного -байта (вероятно, контрольной суммы) в конце DOS-упаковки. Это снимает -необходимость отдельно реверсить формат уровня для DOS — таблица тайлов, -enum id (0=space...29=archtop4), формат `LINKLOC`/`LINKMAP` и `INFO` из -Apple II документа применимы напрямую. - -## 3. Графика (спрайты и фоновые тайлы) — уверенность: средняя/низкая - -Файлы `kid.dat`, `guard.dat`, `fat.dat`, `shadow.dat`, `skel.dat`, -`vizier.dat`, `title.dat`, `c/e/v-palace.dat`, `c/e/v-dungeon.dat`, `pv.dat` -хранят по контейнерному формату (§1) множество мелких чанков (десятки—сотни -байт каждый). - -Что подтверждено: -- Наборы `shadow.dat`/`kid.dat` и `fat.dat`/`vizier.dat` содержат **побайтово - идентичные фрагменты** данных в начале файла — это ожидаемо: "Тень" (Shadow) - визуально копирует анимацию Кида, а "Толстый страж" (Fat guard, пасхалка) - переиспользует модель Визиря. Подтверждает, что персонажи одного "типа - тела" используют общий набор геометрии/анимации. -- Отдельные чанки *не* имеют очевидного унифицированного заголовка - (высота/ширина/палитра) фиксированного размера — попытка интерпретировать - первые байты чанка как `{height:u16, width:u16, flags:u16}` не подтвердилась - на реальных данных (получаются нереалистичные размеры для маленьких чанков). - Вероятно, как и в Apple II версии (см. `FRAMEDEF.S`/`SEQTABLE.S`), геометрия - кадра (ширина, высота, точка привязки) хранится **отдельно от самих - пиксельных данных** — в таблицах внутри `PRINCE.EXE`, а не в `.DAT`-чанке. - Сам чанк, вероятно, содержит только упакованные пиксельные данные - (RLE/дельта-упаковка, по аналогии с `UNPACK.S` в Apple II исходниках). -- Точный алгоритм упаковки пикселей **не восстановлен** в рамках этого - анализа по сырым байтам — байт-в-байт разбор распаковщика без - дизассемблирования `PRINCE.EXE` надёжно не сделать. **Но для практических - целей это не требуется**: см. §7 — в SDLPoP уже есть тот же самый набор - изображений в готовом, распакованном виде (PNG), которым можно пользоваться - напрямую как источником ассетов, не реализуя свой декодер `.DAT`-пикселей. - Писать собственный декодер имеет смысл только если понадобится читать - оригинальные `.DAT` "на лету" (например, для точной сверки контента именно - нашей копии игры) — тогда ориентир — исходник SDLPoP (`src/seg009.c`). - ---- - -## 4. Звук — уверенность: высокая (по структуре), низкая (по деталям кодека) - -Обнаружено 4 параллельных набора звуковых ресурсов под разные звуковые -устройства DOS-эпохи — типично для игр начала 1990-х с "звуковым меню": - -| Файл | Устройство | Формат чанка | -|---|---|---| -| `midisnd1.dat`, `midisnd2.dat` | General MIDI / MPU-401 | каждый чанк = 2-байтовый LE-префикс длины + встроенный Standard MIDI File (`MThd`...`MTrk`...) | -| `mt32snd1.dat`, `mt32snd2.dat` | Roland MT-32/CM-32L | тот же формат: префикс длины + `MThd`/`MTrk`, с MT-32-специфичными SysEx (видны строки `MT-32.mff`, текстовые мета-события вроде `"The Princess awaits"`) | -| `prince.dat` | (аналогично MIDI) | отдельный крупный музыкальный ресурс, тот же MIDI-контейнер — вероятно, финальная тема | -| `digisnd1/2/3.dat` | Covox / Disney Sound Source / Sound Blaster (оцифрованный звук) | чанк начинается с нескольких служебных байт, среди которых слово `0x2AF8` = 11000 — похоже на частоту дискретизации 11 кГц; далее — сырые 8-битные PCM-сэмплы (значения кластеризуются вокруг ~0x7A–0x90, типично для беззнакового 8-бит аудио, смещённого к середине шкалы) | -| `ibm_snd1.dat`, `ibm_snd2.dat` | PC Speaker | чанк — последовательность троек байт похожих на (длительность, делитель_частоты) — простой формат "бипера", отличный от MIDI | - -Подтверждено разбором первых чанков в каждом файле (см. байтовые дампы, -проверялись скриптом). Точная семантика полей внутри `digisnd`/`ibm_snd` -(разрядность, порядок байт служебного заголовка) не выведена до конца — при -реализации порта достаточно распознавания по типу файла и (для MIDI-семейства) -можно напрямую воспроизводить встроенный Standard MIDI File, пропустив -2-байтовый префикс длины. - ---- - -## 5. Готовые распакованные ассеты в SDLPoP (`data/`) — практический источник для порта - -Репозиторий github.com/NagyD/SDLPoP содержит папку `data/`, где, помимо -самих `.DAT`-контейнеров, каждый ресурс **продублирован в виде отдельно -распакованного файла**, названного по его `id` из таблицы оглавления (§1.2). -Проверено через GitHub API (`api.github.com/repos/NagyD/SDLPoP/contents/...`): - -| Подпапка/файл в `data/` | Содержимое | Соответствие нашему разбору | -|---|---|---| -| `GUARD.DAT`, `GUARD1.DAT`, `GUARD2.DAT` | сырые `.DAT` | размер **побайтово совпадает** с нашими локальными `guard.dat`/`guard1.dat`/`guard2.dat` (6950 / 117 / 117 байт) | -| `DIGISND1.DAT`, `MIDISND2.DAT` и др. | сырые `.DAT` | размер **не совпадает** с нашими локальными файлами (48545 vs 50101, 18408 vs 18958) — другой релиз/сборка игры | -| `GUARD/res751.png` … `res784.png` | готовые PNG, по одному на кадр анимации, имя = `res.png` | id-диапазон (751-784) точно совпадает с нашим разбором `guard.dat` | -| `VPALACE/res200.pal`, `res201.png`, `res202.png`, … | палитра (JASC `.pal`) + PNG-кадры фонов дворца, **VGA-вариант (256 цветов)** | id-диапазон (200+) совпадает с `vpalace.dat` | -| `LEVELS/res2000.bin` … `res2015.bin` | сырые дампы уровней по 2304-2305 байт | id совпадает с `levels.dat`; содержимое `res2001.bin` **сверено побайтово** с нашим id=2001 — тайловые данные совпадают | -| `KID/`, `PRINCE/`, `SHADOW/`, `SKEL/`, `VIZIER/`, `FAT/`, `TITLE/`, `VDUNGEON/`, `PV/`, `IBM_SND1/`, `IBM_SND2/`, `font/`, `music/` | аналогичные наборы для остальных ресурсов | не проверялись по отдельности, но структура (папка на каждый `.dat`, файлы `res.ext`) наблюдается одинаково | - -**Вывод:** это данные из немного **другого релиза DOS-версии**, чем те, что -лежат у нас в `MSDOS/` (см. расхождение в размере `digisnd`/`midisnd`), но -формат контейнера и нумерация `id` — те же самые. Практически это значит: - -1. Для получения играбельных PNG-спрайтов и VGA-фонов **не нужно - реализовывать декодер сжатия пикселей** — можно взять готовые файлы - `data/<ИМЯ>/res.png` напрямую как исходный материал для конвертации - под видеорежим ZX Sprinter (в т.ч. `VPALACE`/`VDUNGEON` — уже - 256-цветный VGA-арт, что прямо отвечает на вопрос про полноцветность). -2. Если в проекте важно использовать именно ту версию контента, что в наших - `MSDOS/*.dat` (а не версию из SDLPoP) — распаковку своих файлов всё же - придётся делать (кодек пикселей по-прежнему не восстановлен для сырых - `.DAT`, см. §3), либо принять решение работать с версией SDLPoP как - мастер-источником ассетов вместо своей. - ---- - -## 6. Служебные не-ресурсные файлы - -- `config.dat`, `setup.dat` — 28 байт, не являются ресурсными контейнерами - (не проходят проверку §1.1 — "размер" получается больше самого файла). - Скорее всего простые бинарные структуры настроек (звук/видеорежим, - выбранный на этапе `SETUP.EXE`/`INSTALL.EXE`), не связаны с игровым - контентом. -- `desktopd.cfg`, `setup.cfg` — текстовые/бинарные конфиги DOS-инсталлятора, - вне скоупа игровых ресурсов. -- `PRINCE.EXE` / `PRINCE.REM` — почти идентичны (отличие в единичных байтах - в районе смещения ~0x4ED0), похоже на кряк/патч одного байта проверки — - не относится к формату ресурсов. -- `old-games.nfo` — ASCII-арт NFO релиз-группы (old-games.ru), не игровые - данные. - ---- - -## 7. Итоговая таблица уверенности - -| Раздел | Уверенность | Как подтверждено | -|---|---|---| -| Контейнер `.DAT` (заголовок + таблица) | Высокая | Проверено скриптом на всех 28 файлах, инвариант offset+size выполняется без исключений; независимо подтверждено именованием `res.*` в SDLPoP `data/` | -| ID-пространства ресурсов | Средняя-высокая | Наблюдение по диапазонам + сверка с `res` именами файлов SDLPoP и побайтовым содержимым `res2001.bin` | -| Формат уровня = формату Apple II | Высокая (по размеру и содержимому), служебный блок id=2000 — открытый вопрос | Совпадение размера (2304 vs 2305), тайловые байты сходятся с `res2001.bin` из SDLPoP | -| Формат изображений/спрайтов (сырой `.DAT`) | Низкая-средняя | Контейнер подтверждён, кодек пикселей — нет; но практически закрыто наличием готовых PNG в SDLPoP `data/` (§5) | -| Формат звука (тип контейнера) | Высокая для MIDI-семейств, средняя для digisnd/ibm_snd | Явные MIDI-сигнатуры `MThd`/`MTrk` видны в байтах | - -**Рекомендация для дальнейшей работы:** для получения арт-ассетов (спрайты, -фоны, палитры) — использовать готовые распакованные файлы из -`github.com/NagyD/SDLPoP/tree/master/data` (§5), это быстрее и надёжнее -самостоятельной реализации декодера. Декодер сырого `.DAT`-формата -изображений и точную семантику служебных полей `digisnd`/`ibm_snd` -(§3, §4) стоит восстанавливать только если понадобится читать именно нашу -локальную копию `MSDOS/*.dat` "как есть" — тогда ориентир прежний: исходник -SDLPoP (`src/seg009.c`, `src/data.c`/`data.h`). diff --git a/applications/PoP/docs/POP-DAT-FormatSpecifications.pdf b/applications/PoP/docs/POP-DAT-FormatSpecifications.pdf deleted file mode 100644 index 0d5c21968bec960e887a93174ee264584eb6c3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222037 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 diff --git a/applications/PoP/docs/POP-DAT-FormatSpecifications.txt b/applications/PoP/docs/POP-DAT-FormatSpecifications.txt deleted file mode 100644 index c2aa09a..0000000 --- a/applications/PoP/docs/POP-DAT-FormatSpecifications.txt +++ /dev/null @@ -1,2345 +0,0 @@ -Prince of Persia -Specifications of -File Formats -Princed Development Team -January 5, 2008 - -Contents -1 Preamble - -3 - -2 Introduction - -3 - -3 DAT v1.0 Format Specifications -3.1 General file specifications . . . . . . . . . . . . . . . . . . . . . . -3.1.1 Some definitions . . . . . . . . . . . . . . . . . . . . . . . -3.1.2 Index structures . . . . . . . . . . . . . . . . . . . . . . . -3.1.3 Checksums byte . . . . . . . . . . . . . . . . . . . . . . . -3.2 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.1 Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.2 Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.3 Run length encoding (RLE) . . . . . . . . . . . . . . . . . -3.2.4 LZ variant (LZG) . . . . . . . . . . . . . . . . . . . . . . . -3.3 Palettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.4 Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.4.1 Unknown blocks . . . . . . . . . . . . . . . . . . . . . . . -3.4.2 Room mapping . . . . . . . . . . . . . . . . . . . . . . . . -3.4.3 Wall drawing algorithm . . . . . . . . . . . . . . . . . . . -3.4.4 Room linking . . . . . . . . . . . . . . . . . . . . . . . . -3.4.5 Guard handling . . . . . . . . . . . . . . . . . . . . . . . . -3.4.6 Start Position . . . . . . . . . . . . . . . . . . . . . . . . -3.4.7 Door events . . . . . . . . . . . . . . . . . . . . . . . . . . -3.5 Digital Waves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.6 Midi music . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.7 Internal PC Speaker . . . . . . . . . . . . . . . . . . . . . . . . . -3.8 Binary files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.9 Levels in POP1 for Mac . . . . . . . . . . . . . . . . . . . . . . . - -3 -3 -3 -4 -5 -5 -6 -6 -7 -7 -8 -10 -11 -11 -14 -15 -16 -16 -17 -17 -18 -18 -18 -18 - -1 - - 4 DAT v2.0 Format Specifications -19 -4.1 General file specifications . . . . . . . . . . . . . . . . . . . . . . 19 -4.1.1 The master index . . . . . . . . . . . . . . . . . . . . . . . 20 -4.1.2 The slave indexes . . . . . . . . . . . . . . . . . . . . . . 21 -4.2 Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 -4.2.1 Room mapping . . . . . . . . . . . . . . . . . . . . . . . 22 -4.2.2 Door events . . . . . . . . . . . . . . . . . . . . . . . . . 24 -4.2.3 Guard handling . . . . . . . . . . . . . . . . . . . . . . . . 24 -4.2.4 Static guards . . . . . . . . . . . . . . . . . . . . . . . . . 25 -4.2.5 Dynamic guards . . . . . . . . . . . . . . . . . . . . . . . 26 -5 PLV v1.0 Format Specifications -26 -5.1 User data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 -5.2 Allowed Date format . . . . . . . . . . . . . . . . . . . . . . . . . 27 -6 SAV v1.0 Format Specifications - -28 - -7 HOF v1.0 Format Specifications - -28 - -8 Credits - -29 - -9 License - -29 - -2 - - 1 - -Preamble - -This file was written thanks to the hard work on reverse engineering made by -several people, see the credits section. In case you find any mistake in the text -please report it. A copy of this document should be available in our official site -at http://www.princed.org. - -2 - -Introduction - -There are two versions of the DAT file format: DAT v1.0 used in POP 1.x and -DAT v2.0 used in POP 2. In this document we will specify DAT v1.0. -DAT files were made to store levels, images, palettes, wave, midi and internal -speaker sounds. Each type has its own format as described below in the following -sections. -As the format is very old and the original game was distributed in disks, it -is normal to think that the file format uses some kind of checksum validation -to detect file corruptions. -DAT files are indexed, this means that there is an index and you can access -each resource through an ID that is unique for the resource inside the file. -Images store their height and width but not their palette, so the palette is -another resource and must be shared by a group of images. -PLV files use the extension defined to support a format with only one level -inside. -Both versions of DAT are supported and may be manipulated by PR. This -program works like an archive manager (i.e. pkzip) and extracts the files in -known formats that may be handled by other programs. For more information -about PR check the Princed home page at http://www.princed.org. -In this document you will also find the SAV and HOF format specifications -and the algorithm used by POP1 to draw the dungeon walls. - -3 - -DAT v1.0 Format Specifications - -3.1 - -General file specifications - -All DAT files have an index, this index has one entry per item with information -on each one. -The index is stored at the very end of the file. But may be located reading -the first 6 bytes (as headers) of the file, that are reserved to locate the index -and know it’s size. The sum of the location and the index size should be the -size of the file. -3.1.1 - -Some definitions - -Let’s define the numbers as: - -3 - - SC Signed char: 8 bits, the first bit is for the sign and the 7 last for the number. -If the first bit is a 0, then the number is positive, if not the number is -negative, in that case invert all bits and add 1 to get the positive number. -i.e. -1 is FF (1111 1111), 1 is 01 (0000 0001) -Range: -128 to 127 -1 byte -UC Unsigned char: 8 bits that represent the number. -i.e. 32 is 20 (0010 0000) -Range: 0 to 255 -1 byte -US Unsigned Short: Little endian, 16 bits, storing two groups of 8 bits ordered -from the less representative to the most representative without sign. -i.e. 65534 is FFFE in hex and is stored FE FF (1111 1110 1111 1111) -Range: 0 to 65535 -2 bytes -SS Signed Short: Little endian, 16 bits, storing two groups of 8 bits ordered -from the less representative to the most representative with sign. If the -first byte is 0 then the number is positive, if not the number is negative, -in that case invert all bits and add 1 to get the positive number. -i.e. -2 is FFFE in hex and is stored FE FF (1111 1110 1111 1111) -Range: -32768 to 32767 -2 bytes -UL Unsigned long: Little endian, 32 bits, storing four groups of 8 bits each -ordered from the less representative to the most representative without -sign. -i.e. 65538 is 00010002 in hex and is stored 02 00 01 00 -(0000 0010 0000 0000 0000 0001 0000 0000) -Range: 0 to 232 − 1 -4 bytes -Sizes will always be expressed in bytes unless another unit is specified. - -3.1.2 - -Index structures - -Offset - -Size - -Type - -Name - -0 - -4 - -UL - -IndexOf f set - -4 - -2 - -US - -IndexSize1 - -1 IndexOf f set + IndexSize = f ilesize - -4 - -Description -The location where the index begins -The number of bytes the index has - - Offset - -Size - -Type - -Name - -IndexOf f set = α - -IndexSize - -↓ - -F ooter - -α - -2 - -US - -N umberOf Items - -α + 2 = β2 - -N umberOf Items ∗ 8 - -- - -Index - -β + 8i = γ - -8 - -↓ - -Entry - -γ+0 - -2 - -US - -Id(i)3 - -γ+2 - -4 - -UL - -Of f set(i)3 - -γ+6 - -2 - -US - -Size(i)3 - -Description -The DAT index -Resources count -A list of NumberOfItems -blocks of 8-bytes-length index record called Entry -The 8-bytes-length index -record (one per item) -Item ID -Absolute offset where the resource start -Size of the item not including the checksum byte - -Table 1: DAT file blocks -Note: POP1 doesn’t validate the DAT file checking IndexOf f set + -IndexSize = F ileSize, this means you can append data at the end of the -file. -PR validates that IndexOf f set + IndexSize ≤ F ileSize. It also compares -IndexSize with 8 ∗ numberOf Items + 2 to determine if a file is a valid POP1 -DAT file. -3.1.3 - -Checksums byte - -There is a checksum byte for each item (resource), this is the first byte of the -item, the rest of the bytes are the item data. The item type is not stored and may -only be determined by reading the data and applying some filters, unfortunately -this method may fail. When you extract an item you should know what kind -of item you are extracting. -If you add (sum) the whole item data including checksum and take the less -representative byte (modulus 256) you will get the sum of the file. This sum -must be FF in hex (255 in UC or -1 in SC). If the sum is not FF, then adjust -the checksum in order to set this value to the sum. The best way to do that -is adding all the bytes in the item data (excluding the checksum) and inverting -all the bits. The resulting byte will be the right checksum. -From now on the specification are special for each data type (that means we -won’t include the checksum byte anymore). - -3.2 - -Images - -Images are stored compressed and have a header and a compressed data area. -Each image only one header with 6 bytes in it as follows -2 so IndexSize = 8 ∗ numberOf Items + 2 -3 with 0 ≤ i < numberOf Items - -5 - - 3.2.1 - -Headers -Offset Size Type - -Name - -Description - -0 - -6 - -↓ - -ImageHeader - -0 - -2 - -US - -Height - -2 - -2 - -US - -W idth - -4 - -2 - -- - -ImageM ask - -The header of an image -The height of the image in -pixels -The width of the image in -pixels -Information on the compression algorithm and bitrate - -Table 2: Image headers - -ImageMask is a set of bits where: -⋄ the first 8 are zeros -⋄ the next 4 are the resolution -so if it is 1011 (B in hex) then the image has 16 colours; and if it is 0000 -(0 in hex) then the image has 2 colours. To calculate the bits per pixel -there are in the image, just take the last 2 bits and add 1. e. g. 11 is 4 -(24 = 16 colours) and 00 is 1 (21 = 2 colours). -⋄ the last 4 bits are the 5 compression types (from 0 to 4) as specified in -Table 3. -Dec -Bin -Algorithm -0 -0000 -RAW LR -1 -0001 -RLE LR -2 -0010 -RLE UD -3 -0011 -LZG LR -4 -0100 -LZG UD -Table 3: Algorithm codes - -The following data in the resource is the image compressed with the algorithm specified by those 4 bits. -3.2.2 - -Algorithms - -RAW LR means that the data has not been compressed in any way, it is used -for small images. The format is saved from left to right (LR) serialising a -line to the next integer byte if necessary. In case the image was 16 colours, -two pixels per byte (4bpp) will be used. In case the image was 2 colours, -8 pixels per byte (1bpp) will be used. - -6 - - RLE LR has a Run length encoding (RLE) algorithm, after uncompressed the -image can be read as a RAW LR. -RLE UD is the same as RLE LR except that after uncompressed the bytes in -the image must be drawn from up to down and then from left to right. -LZG LR has some kind of variant of the LZ77 algorithm (the sliding windows -algorithm), here we named it LZG in honour of Lance Groody, the original -coder. After decompressed it may be handled as RAW LR. -LZG UD Uses LZG compression but is drawn from top to bottom as RLE UD. -3.2.3 - -Run length encoding (RLE) - -The first byte is always a control byte, the format is SC. If the control byte is -negative, then the next byte must be repeated n times as the bit inverted control -byte says, after the next byte (the one that was repeated) another control byte -is stored. -If the control byte is positive or zero just copy textual the next n bytes where -n is the control byte plus one. After that, the next byte is the following control -byte. -If you reach a control byte but the image size is passed, then you have completed -the image. -3.2.4 - -LZ variant (LZG) - -This is a simplified algorithm explanation: -Definition: “print” means to commit a byte into the current location of the -output stream. -The output stream is a slide window initialised with zeros. -The first byte of the input stream is a maskbyte. -For each of the 8 bits in the maskbyte the next actions must be performed: -If the bit is 1 print the next unread byte to the slide window -If the bit is a zero read the next two bytes as control bytes with -the following format (RRRRRRSS SSSSSSSS): -· 6 bits for the copy size number (R). -Range: 2 to 26 + 2 = 66 - -Add 3 to this number. - -· 10 bits for the slide position (S). Add 66 to this number. -Range: 26 + 2 = 66 to 26 + 2 + 210 = 1090 -Then print in the slide window the next R bytes that are the same slide -window starting with the S th byte. -After all the maskbyte is read and processed, the following input byte is another -maskbyte. Use the same procedure to finish decompressing the file. Remaining -unused maskbits should be zeros to validate the file. -7 - - This is the modus operandi of the compression algorithm -For each input byte we take a window containing the 1023 previous bytes. -If the window goes out of bounds (ie, when the current input byte is before -position 210 = 1024), we consider it filled with zeros. - -Figure 1: Distribution of the sindow size. -The algorithm works as follows: -While there is unread input data: -Create a maskbyte. -For each bit in the maskbyte (and there is still unread input data): -Compare the following input bytes with the bytes in the window, -and search the longest pattern that is equal to the next bytes. -If we found a pattern of length n > 2: -Assign 0 to the current bit of the maskbyte. -In the next 2 bytes of the output, specify the relative -position and length of the pattern. -Advance output pointer by 2. -Advance input pointer by n. -Else: -Assign 1 to the current bit of the maskbyte. -Copy the current input byte in the next output byte. -Advance output pointer by 1. -Advance input pointer by 1. - -For a better understanding of the algorithm we strongly recommend to read -the PR source files lzg uncompress.c and lzg compress.c that may be located at -https://gforge.lug.fi.uba.ar/plugins/scmcvs/cvsweb.php/PR/src/lib/compression/?cvsroot=freeprince in the PR -repository module. - -3.3 - -Palettes - -Palette resources store a palette for the VGA and patterns for the CGA and -EGA. Each palette resource is sized 100 bytes distributed as explained in Table 25: -Length - -Offset - -Block Name - -8 - - 4 -0 -unknown (TGA?) -48 -4 -vga palette -16 -52 -cga patterns -32 -68 -ega patterns -Table 4: DAT 1.0 Palette blocks - -The vga palette block stores 16 records of three bytes each that is the palette -in the RGB-18-bits format (6 bits for each colour). Each colour is a number -from 0 to 63. Remember to shift the colour bytes by two to get the colour -number from 0 to 256. The format is 00rrrrrr 00gggggg 00bbbbbb where rrrrrr -is the 6 bit red, gggggg the 6 bits green and bbbbbb the 6 bits blue. -In the case of EGA and CGA, palettes are not stored. The palettes are -the standard ones defined by the adapter. In Table 5 the standard palettes are -shown. -EGA CGA1 CGA2 Color name -HTML -0 -0 -0 -black -#000000 -1 -blue -#0000aa -2 -1 -green -#00aa00 -3 -1 -cyan -#00aaaa -4 -2 -red -#aa0000 -5 -2 -magenta -#aa00aa -6 -3 -brown -#aa5500 -7 -3 -light gray -#aaaaaa -8 -dark gray -#555555 -9 -bright blue -#5555ff -10 -bright green -#55ff55 -11 -bright cyan -#55ffff -12 -bright red -#ff5555 -13 -bright magenta #ff55ff -14 -bright yellow -#ffff55 -15 -bright white -#ffffff -Table 5: EGA and CGA palettes - -rgbRGB -000000 -000001 -000010 -000011 -000100 -000101 -010100 -000111 -111000 -111001 -111010 -111011 -111100 -111101 -111110 -111111 - -Where EGA is the only one palette used in EGA mode of the game and -CGA1 and CGA2 are the two palettes used in the CGA mode. As the palettes -are always the same, but the graphics are in 16 colours, some patterns are used -instead of colours. Remember EGA has 16 colours, so is represented in 4 bits -and CGA has 4 simultaneous colours represented in 2 bits. -The cga patterns block stores 16 records of one byte each, separated in four -parts, so the format is a0 a1 b0 b1 c0 c1 d0 d1 where aa is a two bit colour in one of -the two CGA palettes (palette 1 is normally used in the dungeon environment -and 2 in the palace environment). -9 - - The pattern is arranged in a 2x2 box and each pixel is denoted: -a0 a1 -c0 c1 - -b0 b1 -d0 d1 - -So for example if the entry 1 is 00101000 (0x28) in mode CGA2, the pattern -will be a checkerboard of black and green like the following: -Bin -00 01 -01 00 - -Dec -Colour -0 1 black green -1 0 green black - -The ega patterns block stores 16 records of two bytes each, this time separated in two parts. So we have again, four parts per record in the format -aaaabbbb ccccdddd. -Now, using the EGA entries 0-15 (the four bits are represented) the same -patterns as the CGA may be used. -For example, with 00101111 11110010 (0x2ff2) you can create the following -pattern: -Bin -0010 1111 -1111 0010 - -3.4 - -Dec -2 15 -15 2 - -Hex -Colour -2 f brown white -f 2 white brown - -Levels - -This table has a summary of the blocks to be used in this section, you can refer -it from the text below. -Length -Offset -Block Name -720 -0 -pop1 foretable -720 -720 -pop1 backtable -256 -1440 -door I -256 -1696 -door II -96 -1952 -links -64 -2048 -unknown I -3 -2112 -start position -3 -2115 -unknown II -1 -2116 -unknown III -24 -2119 -guard location -24 -2143 -guard direction -24 -2167 -unknown IV (a) -24 -2191 -unknown IV (b) -24 -2215 -guard skill -24 -2239 -unknown IV (c) -24 -2263 -guard colour -16 -2287 -unknown IV (d) -2 -2303 -0F 09 (2319) -Table 6: DAT 1.0 Level blocks -10 - - All levels have a size of 2305, except in the original game, that the potion -level has a size of 2304 (may be it was wrong trimmed). -3.4.1 - -Unknown blocks - -Blocks described in this section are: Unknown from I to IV. -Unknown III and IV blocks does not affect the level if changed, if you find -out what they are used to we will welcome your specification text. -Unknown I may corrupt the level if edited. -We believe unknown II has something to do with the start position, but we -do not know about it. -As unknown II were all zeros for each level in the original set, it was a team -decision to use those bytes for format extension. If one of them is not the default -00 00 00 hex then the level was extended by the team. Those extensions are -only supported by RoomShaker at this moment. To see how those extensions -were defined read the appendix I will write some day. For the moment you may -contact us if you need to know that. -3.4.2 - -Room mapping - -This section explains how the main walls and objects are stored. The blocks -involved here are “pop1 foretable” and “pop1 backtable” -In a level you can store a maximum of 24 rooms (also called screens) of 30 -tiles each, having three stages of 10 tiles each. Screens are numbered from 1 to -24 (not 0 to 23) because the 0 was reserved for special cases. -The pop1 foretable and pop1 backtable blocks have 24 sub-blocks inside. -Those sub-blocks have a size of 30 bytes each and has a room associated. So, -for example, the sub-block staring in 0 corresponds to the room 1 and the -sub-block starting in 690 corresponds to the room 24. It is reserved 1 byte -from the pop1 foretable block and one from the pop1 backtable block for each -tile. To locate the appropriate tile you have to do the following calculation: -tile = (room − 1) ∗ 30 + tileOf f set where tileOffset is a number from 0 to 29 -that means a tile from 0 to 9 if in the upper stage, from 10 to 19 if in the middle -stage and 20 to 29 if in the bottom stage. We define this as the location format -and will be used also in the start position. Always looking from the left to the -right. So there is a pop1 foretable and pop1 backtable byte for each tile in the -level and this is stored this way. -The pop1 foretable part of the tile stores the main tile form according to the -table below. Note that those are just a limited number of tiles, each code has a -tile in the game. The tiles listed are all the ones needed to make a level so the -missing tiles have an equivalent in this list. -Each tile has a code id, as some codes are repeated this is how you have to -calculate the codes. A tile in the pop1 foretable part has 8 bits in this format -rrmccccc, where rr are random bits and can be ignored. m is a modifier of the -tile. For example modified loose floors do not fall down. The rest ccccc is the - -11 - - code of the tile tabled below. Tile names are the same as the ones used by -RoomShaker to keep compatibility. -Hex -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x08 -0x09 -0x0A -0x0B -0x0C -0x0D -0x0E -0x0F -0x10 -0x11 -0x12 -0x13 -0x14 -0x15 -0x16 -0x17 -0x18 -0x19 -0x1A -0x1B -0x1C -0x1D -0x1E -0x1F - -Binary -Group -Description -00000 -free -Empty -00001 -free -Floor -00010 -spike -Spikes -00011 -none -Pillar -00100 -gate -Gate -00101 -none -Stuck Button -00110 -event -Drop Button -00111 -tapest -Tapestry -01000 -none -Bottom Big-pillar -01001 -none -Top Big-pillar -01010 -potion -Potion -01011 -none -Loose Board -01100 -ttop -Tapestry Top -01101 -none -Mirror -01110 -none -Debris -01111 -event -Raise Button -10000 -none -Exit Left -10001 -none -Exit Right -10010 -chomp -Chopper -10011 -none -Torch -10100 -wall -Wall -10101 -none -Skeleton -10110 -none -Sword -10111 -none -Balcony Left -11000 -none -Balcony Right -11001 -none -Lattice Pillar -11010 -none -Lattice Support -11011 -none -Small Lattice -11100 -none -Lattice Left -11101 -none -Lattice Right -11110 -none -Torch with Debris -11111 -none -Null -Table 7: POP1 Foretable codes - -The pop1 backtable part of the tile stores a modifier or attribute of the -pop1 foretable part of the tile. This works independently of the modifier bit -in the code. The tile modifier depends on the group the tile belongs which are -wall, chomp, event, ttop, potion, tapp, gate, spike and free. The group event -allows the 256 modifiers and will be described in Section 4.2.2. -In the original game all elements are allowed in all levels, but it is possible -to set it up Hex-editing the uncompressed version. To do that, read the Hex -12 - - editing documentation. -Group -none -free -free -free -free -spike -spike -spike -spike -spike -spike -spike -spike -spike -spike -gate -gate -tapest -tapest -tapest -tapest -potion -potion -potion -potion -potion -potion -potion -ttop -ttop -ttop -ttop -ttop -ttop -ttop -ttop -chomp -chomp -chomp -chomp -chomp - -Code -0x00 -0x00 -0x01 -0x03 -0xFF -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x08 -0x09 -0x00 -0x01 -0x00 -0x01 -0x02 -0x03 -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x00 -0x01 -0x02 -0x03 -0x04 - -Description -This value is used always for this group -Nothing1 , Blue line2 -Spot11 , No blue line2 -Window -Spot31 , Blue line?2 -Normal (allows animation) -Barely Out -Half Out -Fully Out -Fully Out -Out? -Out? -Half Out? -Barely Out? -Disabled -Closed -Open -With Lattice2 -Alternative Design2 -Normal2 -Black2 -Empty -Health point -Life -Feather Fall -Invert -Poison -Open -With lattice2 -Alternative design2 -Normal2 -Black2 -Black2 -With alternative design and bottom2 -With bottom2 -With window2 -Normal -Half Open -Closed -Partially Open -Extra Open - -1 Dungeon environment -2 Dungeon environment - -13 - - Group -chomp - -Code -Description -0x05 -Stuck Open -Table 8: Background modifiers by group - -Note: Some modifiers have not been tested, there -may be any other unknown tile type we have not -still discover. - -3.4.3 - -Wall drawing algorithm - -This section does not have a direct relation with the format because it describes -how the walls must be drawn on the room. However, as this information should -be useful to recreate a cloned room read from the format we decided to include -this section to the document. -Wall drawing depends on what is in the right panel. If the right panel is not -a wall (binary code ends in 10100) a base wall will be drawn and other random -seed will be used. If the right panel is a wall then the main base wall will be -drawn and the described seed will be used. -When the base wall is drawn, the modifiers should be blitted over it. There -are 53 different types of walls using the same base image. We will call the seed -array to the one having the modifier information of those 53 panels. This array -has indexes from 1 to 53 included. -To calculate what value take from the array this calculation must be performed: panelInf o = seedArray[roomN umber + wallP osition] where panelInfo is the result modifier information that will be applied to the base image; -seedArray is this array that will be described above as a table; roomNumber -is the number of the room the wall is (from 1 to 24) and wallPosition is the -position the wall is (from 0 to 29), using the location format specified in section -3.4.2. This means the first value is 1 (roomNumber=1 and wallPosition=0) and -the last is 53 (roomNumber=24 and wallPosition=29). -Modifiers affects the corners of a stone. There are three stone rows per wall. -If the modifier is activated this corner will appear different (seems to be darker). -Another modifier is the grey stone. -Modifier -Grey stone -Left, bottom -Left, top -Right, bottom -Right, up - -Seed Positions -(First row) -2, 5, 14, 17, 26, 32, 35, 50 -2, 11, 36, 45 -37 -27, 33 -4, 10, 31, 37 - -Grey stone -Left, bottom - -(Second row) -none -34, 47 -14 - - Modifier -Left, top -Right, bottom -Right, top - -Seed Positions -9, 10 -2, 8, 25, 35 -6, 12, 23, 29, 39 - -(Third row) -Grey stone -none -Left, bottom -none -Left, top -16 -Right, bottom -none -Right, top -none -Table 9: Stone modifiers on seed position - -Another modifiers are saved in the seed too. Those modifiers are not boolean -values, they are offsets and sizes. As each stone has a different size the stone -separation offset is saved in the seed. -For the first row, the stones are all the same size and the seed is not needed. -For the second row we have got the first 20 values, ordered from 1 to 20. -Field -Values -position -1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -offsets -543315421 1 5 3 2 1 5 4 3 2 5 4 -separator size -011000110 0 1 1 1 0 0 1 1 1 0 0 -Table 10: First 20 seed values of the second row separator - -We will be adding the next values as soon as we count the pixels ;) This -information can be found in walls.conf file from FreePrince. -3.4.4 - -Room linking - -This section describes the links block. -Each room is linked to another by each of the four sides. Each link is stored. -There is no room mapping, just room linking. -The links block has 24 sub-blocks of 4 bytes each. All those sub-blocks has -its own correspondence with a room (the block starting at 0 is related to the -room 1 and the block starting at with 92 is related to room 24). Each block of -4 bytes stores the links this room links to reserving one byte per each side in -the order left (0), right (1), up (2), down (3). The number 0 is used when there -is no room there. Cross links should be made to allow the kid passing from a -room to another and then coming back to the same room but it is not a must. - -15 - - 3.4.5 - -Guard handling - -This section specifies the blocks: guard location, guard direction, guard skill -and guard colour. -Each guard section has 24 bytes, each byte of them corresponds to a room -so byte 0 is related to room 1 and byte 23 is related to room 24. This room is -where the guard is located. The format only allows one guard per room. Each -block describes a property or attribute of the guard. -The guard location part of a guard describes where in the room the guard -is located, this is a number from 0 to 29 if the guard is in the room or 30 if -there is no guard in this room. Other values are allowed but are equivalent to -30. The number from 0 to 29 is in the location format specified in Section 3.4.2. -The guard direction part describes where the guard looks at. If the value is -0, then the guard looks to the right, if the value is the hex FF (-1 or 255) then -he looks left. This is the direction format, and will be used in the start position -too. -The guard skill is how the guard fights, style and hit points. Note that the -hit points also depends on the level you are. Allowed numbers are from 0 to 9. -The guard colour is the palette the guard has (see Section 3.8). The default -colours are in this table: -Code -Pants -Cape -0x00 -Light -Blue Pink -0x01 -Red -Purple -0x02 -Orange -Yellow -0x03 -Green -Yellow -0x04 -Dark Blue -Beige -0x05 -Purple -Beige -0x06 -Yellow -Orange -Table 11: Default Guard colours - -Other codes may generate random colours because the game is reading the -palette from trashed memory. This may also cause a game crash. It is possible -to add new colours in the guard palette resource (see Section 3.8) avoiding the -crash. -3.4.6 - -Start Position - -This section describes the start position block. -This block stores where and how the kid starts in the level. Note that all -level doors that are on the starting room will be closed in the moment the level -starts. - -16 - - This block has 3 bytes. The first byte is the room, allowed values are from -1 to 24. The second byte is the location, see the section 3.4.2 for the location -format specifications. The third byte is the direction, see 3.4.5 for the direction -format specifications. -3.4.7 - -Door events - -This section explains how the doors are handled and specifies the blocks door I -and II. -First of all he have to define what an event line is in this file. An event line -is a link to a door that will be activated. If the event was triggered with the -action close, then the event will close the door, if the action was open then the -event will open the door. An event line has also a flag to trigger the next event -line or not. An event is defined as a list of event lines, from the first to the -last. The last must have the trigger-next-event-line flag off. This is like a list of -doors that performs an action. An event performs the action that it was called -to do: open those doors or close them. This action is defined by the type of tile -pressed. Each event line has an ID from 0 to 255. An event has the ID of the -first event line in it. -In section 3.4.2 it is explained how a door trigger is associated to an event -ID. Those are the tiles that starts the event depending on what are them: closers -or openers. -How events are stored: Each door block has 256 bytes, one per event line. -Each event line is located in an offset that is the event line ID, so event line 30 -is located in the byte 30 of each block. There is a door I part of an event line -and a door II part of it. We will define them as byte I and byte II. You can find -there: the door room, the door location, and the trigger-next flag. The format -is the following: -Let’s define Screen S = s1 s2 s3 s4 s5 as a 5-bit-number from 1 to 24 (5 bits) -where sn is the bit n of the binary representation and whose value represents -the screen number; Location L = l1 l2 l3 l4 l5 as another 5-bit-number from 0 to -29 where ln is the bit n of the binary representation whose value is according -to the location format specifications (See Section 3.4.5) ; Trigger-next T = t1 -as one bit having 1 for “off” or a 0 for “on”. -Byte I has the form: t1 s4 s5 l1 l2 l3 l4 l5 -Byte II has the form: s1 s2 s3 00000 - -3.5 - -Digital Waves - -Read them as raw digital wave sound using the following specifications: -Field -Size of Format -Format - -Value -16 -PCM - -17 - - Field Value -Attributes 8 bit, mono, unsigned -Channels 1 -Sample rate 11025 -Bytes/Second 11025 -Block Align 1 -Table 12: Wave Specifications - -GNU/Linux users can play the raw waves just dropping them inside /dev/dsp -As DAT headers are very small it is valid to type in a shell console with dsp -write access: cat digisnd?.dat>/dev/dsp to play the whole wave files. - -3.6 - -Midi music - -Standard MIDI files. There have been reports that some versions of MIDI did -not work, but we believe this can bi fixed saving in other MIDI format variant -(like type 0). - -3.7 - -Internal PC Speaker -Offset -Size -Type Name Description -0 -3 -↓ Header The file header -0 -2 -UC Junk 0x00 (or 0x80 sometimes) -2 -1 -US -bps -Beats per two seconds -0 -3numberOf N otes ↓ -Body The file body -3i -2 -US -F req frequency in hertz (0 if no -sound, 1 or 2 if marker) -3i + 2 -1 -US length length in beats -0 -2 -↓ -F ooter The file footer -0 -2 -Junk 0x12 0x00 -Table 13: DAT file blocks - -3.8 - -Binary files - -Some binary files contains relevant information The resource number 10 in -prince.dat has the VGA guard palettes in it saving n records of a 16-colourpalette of 3 bytes in the specified palette format. - -3.9 - -Levels in POP1 for Mac - -In the case of Mac, executable and resource data are embedded in the one runtime file. Level data is a part of resources, for examples graphics, icons and -sounds. Level blocks are very similar to PC but not exactly identical. Following -18 - - table has a summary of the blocks of DAT 1.0 for Mac. -Length -Offset -Block Name -720 -0 -pop1 foretable -720 -720 -pop1 backtable -256 -1440 -door I -256 -1696 -door II -96 -1952 -links -64 -2048 -unknown I -3 -2112 -start position -21 -2115 -unknown II+III -24 -2136 -guard location -24 -2160 -guard direction -24 -2184 -unknown IV (a) -24 -2208 -unknown IV (b) -24 -2232 -guard skill -24 -2256 -unknown IV (c) -24 -2280 -guard colour -4 -2304 -unknown IV (d) -Table 14: DAT 1.0 Level blocks for Mac - -All levels have a size of 2308. Also there are two different things in comparison with DAT 1.0 for PC. DAT 1.0 for Mac does not have any index and -checksums. 16 levels including demo and potion level are only chained in sequence. See 3.4 for reference on each block. - -4 - -DAT v2.0 Format Specifications - -4.1 - -General file specifications - -POP2 DAT files are not much different from their POP1 predecessors. The -format is similar in almost each way. The main difference is in the index. As -DAT v1.0 used an index in the high data, the DAT v2.0 indexes are two level -encapsulated inside a high data. So there is an index of indexes. -We will use the same conventions than in the prior chapter. The checksum -validations are still the same. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 15: High data structures - -19 - - This is similar to DAT v1.0 format, except that the index area is now called -high data. -The high data part of the file contains multiple encapsulated indexes. Each -of those index is indexed in a high data index of indexes. We will call this index -the master index and the sub index the slave indexes. Slave indexes are the real -file contents index. -4.1.1 - -The master index - -Offset - -Size - -Type - -Name - -0 - -4 - -UL - -IndexOf f set - -4 - -2 - -US - -IndexSize1 - -IndexOf f set = α - -IndexSize - -↓ - -F ooter - -α - -2 - -US - -N umberOf Items - -α + 2 = β2 - -N umberOf Items ∗ 8 - -- - -Index - -β + 8i = γ - -8 - -↓ - -Entry - -γ+0 - -2 - -US - -Id(i)3 - -γ+2 - -4 - -UL - -Of f set(i)3 - -γ+6 - -2 - -US - -Size(i)3 - -Description -The location where the index begins -The number of bytes the index has -The DAT index -Resources count -A list of NumberOfItems -blocks of 8-bytes-length index record called Entry -The 8-bytes-length index -record (one per item) -Item ID -Absolute offset where the resource start -Size of the item not including the checksum byte - -Table 16: DAT 2.0 Master index -Note: POP1 doesn’t validate the DAT file checking IndexOf f set + -IndexSize = F ileSize, this means you can append data at the end of the -file. -The master index is made with: - Offset HighDataOf f set, size 2, type US: -NumberOfSlaveIndexes (the number of the high data sections) - Offset HighDataOf f set+ -2, size N umberOf SlaveIndexes ∗ 6: The master index record (a list of NumberOfSlaveIndexes blocks of 6-bytes-length index record each corresponding to -one slave index) -The 6-bytes-length index record (one per item): Size = 6 bytes - Relative offset 0, size 4, type sting: 4 ASCII bytes string denoting the Slave Index ID. The character order is inverted. - Relative offset 4, size 2, type US: -SlaveIndexOf f set (slave index offset relative to HighDataOffset) -1 IndexOf f set + IndexSize = f ilesize -2 so IndexSize = 8 ∗ numberOf Items + 2 -3 with 0 ≤ i < numberOf Items - -20 - - From the end of the DAT High Data Master Index to the end of the file -we will find the High Data section contents (where the HighDataOffset relative -offsets points to). This content has a set of second indexes each called Slave -Index. So, to find a Slave Index offset you have to add the file HighDataOffset -to the SlaveIndexOffset for the desired index. -There are different 4-byte-length ASCII strings called Slave Index IDs. When -the string is less than 4 bytes, a tailing byte 0x00 is used. We will denote it -with the null-space symbol “ ”. The character order is inverted, so for example -the text SLAP becomes PALS, MARF becomes FRAM, -becomes empty or -RCS becomes SCR. They must be in upper case. -ID -“cust” -“font” -“fram” -“palc” -“pals” -“palt” -“piec” -“psl” -“scr” -“shap” -“shpl” -“strl” -“snd” -“seqs” -“txt4” -“” - -4.1.2 - -Stored -TSUC -TNOF -MARF -CLAP -SLAP -TLAP -CEIP -LSP -RCS -PAHS -LPHS -LRTS -DNS -SQES -4TXT - -Description -Custom -Fonts -Frames -CGA Palette -SVGA Palette -TGA Palette -Pieces -? -Screens (images that have the full room) -Shapes (normal graphics) -Shape palettes -Text -Sound -Midi sequences -Text -Levels -Table 17: Slave Index ID strings - -The slave indexes - -All encapsulated sections pointed by the Master Index are Slave Indexes. The -slave index is specified with: - Offset SlaveIndexOffset, size 2, type US: NumberOfItems (the number of the records referring to the file data) - Offset SlaveIndexOffset+2, size NumberOfItems*11: The slave index record (a list of NumberOfItems blocks of 11-byte-length index record each corresponding to one -slave index) -The 11-byte-length slave index record (one per item): Size = 11 bytes Relative offset 0, size 2, type US: Item ID - Relative offset 2, size 4, type UL: -Resource start (absolute offset in file) - Relative offset 6, size 2, type US: Size -of the item (not including the checksum byte) - Relative offset 8, size 3, type -binary: A flags mask (in “shap” indexes it is always 0x40 0x00 0x00; in others -0x00 0x00 0x00) -Finally, we can locate whatever item we want if we have the - Slave Index -21 - - ID - Item ID this is not a unique key, unfortunately we have found repeated -pairs of IDs for different items, so we have to use the “order” as a third key. -So, the way to find an item is: first read the High Data Offset, go there, read -the number of slave items, iterate the master index to find the desired slave item -comparing it with the Slave Index ID. Then go to the found Slave Index offset -(remember to add the High Data Offset) and read the number of items for this -index. Finally iterate the slave index to find the desired item comparing the -Item ID and read the offset and size. Now you will have the offset of the desired -item’s checksum, increasing the offset by one will give you the beginning of the -item content. - -4.2 - -Levels - -This table has a summary of the blocks to be used in this section. -Length -960 -3840 -1280 -128 -32 -3 -4 -3712 -1088 -978 - -Offset -0 -960 -4800 -6080 -6208 -6240 -6243 -6247 -9959 -11047 - -Block Name -pop2 foretable -pop2 backtable -pop2 doors -links (as explained in Section 3.4.4 but having 32 rooms) -unknown I -start position (as explained in Section 3.4.6) -unknown II (00 01 00 02) (check pop1) -pop2 static guard -pop2 dynamic guard -unknown III -Table 18: DAT 2.0 Level blocks - -All levels have a size of 12025. -4.2.1 - -Room mapping - -You should read section 3.4.2 before reading this one. A POP2 level can store -a maximum of 32 rooms of 30 tiles each, having three stages of 10 tiles each. -Rooms are numbered from 1 to 32 (not 0 to 31) because the 0 is be reserved to -the null-room. -The pop2 foretable block has 32 sub-blocks inside. Each sub-block has a size -of 30 bytes and has a room associated. For each byte in this room there is a -tile in the game. Each byte has a code to represent a tile. There are additional -attributes to this tile also. -To locate the 7th tile in the bottom floor of the room 27 you have to do the -same calculation as in 3.4.2: tile = (room − 1) ∗ 30 + tileOf f set = (27 − 1) ∗ -30 + 2 ∗ 10 + 7 = 807 -Dec Hex Bin -Caverns -00 0x00 000000 Empty - -Ruins -Empty -22 - -Temple -Empty - - Dec Hex Bin -Caverns -Ruins -Temple -01 0x01 000001 Floor -Floor -Floor -02 0x02 000010 Spikes -(?) -Spikes -03 0x03 000011 Pillar -Pillar -Pillar -04 0x04 000100 Door -Gate -Gate -05 0x05 000101 (?) -Raised Button -Raised Button -06 0x06 000110 (?) -Drop Button -Drop Button -07 0x07 000111 (?) -Tunnel -(?) -08 0x08 001000 Bottom Big Pillar -Bottom Big Pillar Bottom Big Pillar -09 0x09 001001 Top Big Pillar -Top Big Pillar -Top Big Pillar -10 0x0A 001010 Potion -Potion -Potion -11 0x0B 001011 Loose Floor -Loose Floor -Loose Floor -12 0x0C 001100 (?) -Slicer Left Half -Slicer Left Half -13 0x0D 001101 (?) -Slicer Right Half Slicer Right Half -14 0x0E 001110 Debris -Debris -Debris -15 0x0F 001111 (?) -Drop Floor -(?) -16 0x10 010000 Exit Half Left -Exit Half Left -Exit Half Left -17 0x11 010001 Exit Half Right -Exit Half Right Exit Half Right -18 0x12 010010 Magic Carpet -(?) -(?) -19 0x13 010011 Torch -(?) -Torch -20 0x14 010100 Wall -Wall -Wall -21 0x15 010101 (?) -Skeleton -(?) -22 0x16 010110 (?) -Sword -(?) -23 0x17 010111 Lava Pit Left -(?) -(?) -24 0x18 011000 Lava Pit Right -(?) -(?) -25 0x19 011001 (?) -(?) -Squash Wall -26 0x1A 011010 (?) -(?) -Flip Tile -27 0x1B 011011 (?) -(?) -(?) -28 0x1C 011100 (?) -(?) -(?) -29 0x1D 011101 (?) -(?) -(?) -30 0x1E 011110 (?) -(?) -(?) -31 0x1F 011111 (?) -(?) -(?) -32 0x20 100000 Torch w/Debris -(?) -Torch w/Debris -33 0x21 100001 Exit Door Top Left (?) -(?) -34 0x22 100010 Pressure Plate -(?) -(?) -35 0x23 100011 Exit Door Top Right (?) -(?) -36 0x24 100100 Dart Gun -(?) -(?) -37 0x25 100101 (?) -(?) -(?) -38 0x26 100110 (?) -(?) -(?) -39 0x27 100111 (?) -(?) -(?) -40 0x28 101000 (?) -(?) -(?) -41 0x29 101001 (?) -(?) -(?) -42 0x2A 101010 (?) -(?) -(?) -43 0x2B 101011 (?) -(?) -Blue Flame -44 0x2C 101100 Rope Bridge -(?) -(?) -45 0x2D 101101 (?) -(?) -(?) -23 - - Dec Hex Bin -Caverns -Ruins -46 0x2E 101110 (?) -(?) -47 0x2F 101111 (?) -(?) -Table 19: POP2 Foretable Codes - -Temple -(?) -(?) - -The pop2 backtable is an expansion if the pop1 backtable and it is sized 4 -times bigger. For each tile there are 4 additional bytes in the pop2 backtable -tiles -block to specify further actions or attributes. This block is sized 4 bytes -tile ∗10 f loor ∗ -loors -∗ 32rooms that is 3840bytes. We call background mask to each block of -3 froom -4 bytes associated to a tile. To locate a background mask you have to do the -following operation: 960 + (room − 1) ∗ 30 ∗ 4 + tileOf f set ∗ 4 Background masks -are stored consecutively each after another until the 960 tiles are specified. -The first byte is an unsigned char (UC) association to one of the 256 door -event registers (see Section 4.2.2) if the tile is an activator. In any other case -this byte is an extra attribute information byte. For example in wall (0x14) -having this byte in 0x04 means the wall is curved. -The second byte in a background mask is the attribute byte. For example -0x18 modifies the tile 0x01 and adds two small stalactites. -We believe the special images uses the 3rd or 4th byte. - -4.2.2 - -Door events - -This section explains how doors are handled and specifies the block pop2 door. -The pop2 door block has 1280 bytes. It is divided in 256 registers of 5 bytes -called door events. Like POP1 events have associations to doors and activate -them. In POP2 events can also activate a floor shooter. -An event is triggered when an activator button (0x22) is pressed. As it is -specified in the Section 4.2.1, the first byte of the attribute mask belonging to a -button tile points it to a door event that is triggered when the button is pressed. -There is a maximum of 256 events because of the unsigned char of the first byte -if the attribute mask in the pop2 backtable block and the 256 registers in the -pop2 door block. -Each event register is of the form “LL SS TT FD FD” which activates the -normal door (0x04), right exit door (0x11) or shooter (0x24) located in the tile -LL of the screen SS. TT is 00 for normal activation and FF for exit doors. -4.2.3 - -Guard handling - -This section explains how guards are handled. In POP2 there are two different -types of guards. We will call them static and dynamic guards. Static guards are -the normal guards that are waiting in a room like in POP1. In the other hand, -dynamic guards are the ones who appear in the room running from one of the -sides. Each type of guard is attached to a room and is handled in a different -way, so a room can have both types of guards, one or none depending on the -specifications. There is a block for each type of guard, pop2 static guard is the -24 - - specification of the static guards and pop2 dynamic guard is the specification -of the dynamic ones. Each block has different specifications and sizes as it is -mentioned bellow. -4.2.4 - -Static guards - -In this item static guards are explained and the pop2 static guard is specified. -For each screen there is reserved memory space for a maximum of 5 guards. -The pop2 static guard block has a size of 3712 divided in 32 sub-blocks of -116 bytes each. As there is a correspondence between each sub-block and the -room with this number, we will call them “room guard blocks”. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 20: High data structures -A room guard block has a size of 116 divided this way: -⋄ 1 byte for the number of guards present in this room. This byte may take -values from 0 to 5. -⋄ 5 block divisions of 23 bytes for each guard. The first divisions have the -guard information, if the number is less than 5, then the latest divisions -corresponding to the missing guards will be filled with zeros or garbage. -If there is a static guard corresponding to this division of 23 bytes, the -following bytes from 0 to 22 will specify the guard: -Byte 0 is a UC showing the location in this room (same as explained in -3.4.5) of the current guard. Bytes 1 and 2 are a SS with an offset in pixels -to reallocate the guard in the floor. Byte 3 is the facing direction as specified -in 3.4.5. Byte 4 is the skill Byte 5 is unknown Bytes 6,7 and 8 are always 0, -probably because 5 is a long from 0 to 255. Byte 9 is the guard colour in levels -where it is needed (0-3), ie. 1 white+blue, 2 white+black, 3 red. Byte 10 is the -guard number (0 for the first one, 1 for the second, etc). Bytes 11,12,13 and 14 -are unknown, mostly 0, but in 10 guards it is 0x52756e2d. Byte 15 is the type -(0-8 and 84), but does not apply in all levels, ie. 5 head, 8 snake. Byte 16 is -the hit points of the guard (0 to 8). Bytes 17 and 18 are the activate triggers -for skeletons, byte 17 is (0,1,-1) and 18 is (0,-1). Normal value is 0x0000 for a -sleeping skeleton. When set to -1 (0xffff) a trigger will be waiting to wake the -skeleton up, for example the exit door open. Other possible values are 0x0100 -that is the skeleton already awake and 0xff00 that seems to be similar than -0x0000. Bytes 19,20,21 are always 0. Byte 22 is unknown (mostly 0, but 1 and -3 where found for some guards). -25 - - 4.2.5 - -Dynamic guards - -The dynamic guards are the ones who appear running throw a room’s corner -and they are defined in the pop2 dynamic guard block. This block has 34 bytes -for each of the 32 rooms, so it is sized 1088 bytes. Each room has a specification -about those guards. There is only one different type of dynamic guard per room, -but it is possible to set the number of guards that will appear running. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 21: High data structures - -A room guard block has a size of 116 divided this way: -The bytes are from 0 to 33: Bytes from 8 to 17 may take the value 0x5a and -0. Bytes 8,9,10,15,16 are always 0. Byte 18 activates dynamic guard. 1 is true -and 0 is false. Byte 19 is the skill (0-7, 8 to make it passive) Bytes 20, 21 and -22 are always 0. Byte 23 is the dynamic guard mode: 0 or 1 to make the guard -wait until all guards are dead to spawn and 2 to spawn even when the prior -guard is still alive. Byte 24 is the floor the guard will appear on. 0 is the upper -one and 2 is the lower. Another number will kill the guard playing the sound. -Byte 25 is the initial location of the guard. ie. 0 is the left side of the screen, 9 -is the right side, it is possible to locate them in the middle of the screen, they -will magically spawn in a position between 1 and 8. As they will run to the -center of the screen, this byte also sets the facing direction up (0 to 5 is right, 6 -to 9 is left). Byte 26 is the time in ticks the first guard will wait to spawn. Byte -27 is the time in ticks between guards spawn. Bytes 28 and 29 are unknown. -Byte 30 is the number of guards that will appear, there is a maximum of 5 per -room, including static guards. Byte 31 is the hit points the guards will have. - -5 - -PLV v1.0 Format Specifications - -PLV v1.0 files are defined in this table: -Size -7 -1 -1 -1 -4 -4 -B1 - -Offset -0 -7 -8 -9 -10 -14 -18 - -Description -Magic identifier -POP version -PLV version -Level Number -Number of fields -Block 1: Level size (B1 ) -Block 1: Level code -26 - -Type -Content -text “POP LVL” -UC -0x01 -UC -0x01 -UC -UL -UL 2306/2305 -- - - Size Offset Description -Type -4 18 + B1 Block 2: User data size (B2 ) UL -B2 22 + B1 Block 2: User data -Table 22: PLV blocks - -Content - -Level code is the exact level as described in Section 3.4 including the checksum byte. Note that Level size (B1 ) also includes the checksum byte in the -count. POP version is 1 for POP1 and 2 for POP2. PLV version is 1 for PLV -v1.0. Only one level may be saved in a PLV, the level number is saved inside. - -5.1 - -User data - -User data is a block of extensible information, Number of fields is the count of -each field/value information pair. A pair is saved in the following format: -field\_name\\0value\\0 -where \0 is the null byte (0x00) and field name and value are strings. -There are mandatory pairs that must be included in all PLV files. Those -are: -Field name -Description -Editor Name -The name of the editor used to save the file -Editor Version -The version of the editor used to save the file -Level Author -The author of the file -Level Title -A title for the level -Level Description -A description -Time Created -The time when the file was created -Time Last Modified -The time of the last modification to the file -Original Filename -The name of the original file name (levels.dat) -Original Level Number Optional. The level number it has when it was -first exported -Table 23: PLV Mandatory Fields - -The content values may be empty. There is no need to keep an order within -the fields. - -5.2 - -Allowed Date format - -To make easy time parsing the time format must be very strict. There are only -two allowed formats: with seconds and without. With seconds the format is -“YYYY-MM-DD HH:II:SS” Without seconds the format is “YYYY-MM-DD -HH:II” Where YYYY is the year in 4 digits, MM is the month in numbers, MM -the months, DD the days, HH the hour, II the minute and SS the second in the -military time: HH is a number from 00 to 23. -27 - - If the month, day, hour or second have only one digit, the other digit must -be completed with 0. -i.e. 2002-11-26 22:16:39 - -6 - -SAV v1.0 Format Specifications - -SAV v1.0 saves kid level, hit points and remaining time information in order to -restart the game from this position. -SAV files are 8 bytes length in the following format: -Offset Size Type Name Description -0 -2 -US -i -Remaining minutes -2 -2 -US -ii -Remaining ticks -4 -2 -US -iii Current level -6 -2 -US -iv Current hit points -Table 24: SAV blocks - -Remaining minutes (i) Range values: 0 to 32766 for minutes 32767 to 65534 -for NO TIME (but the time is stored) 65535 for game over -1 -Remaining ticks (ii) Seconds are stored in ticks, a tick is 12 -seconds. To get -the time in seconds you have to divide the integer “Remaining ticks” by 12. -Range values: 0.000 to 59.916 seconds (rounded by units of ≈ 83ms or -1 -seconds) -0 to 719 ticks -12 -Level (iii) Range values: 1 to 12 for normal levels 13 for 12bis 14 for princess -level 15 for potion level -Hit points (iv) Range values: 0 for an immediate death 1 to 65535 hit points - -7 - -HOF v1.0 Format Specifications - -HOF files are used to save the Hall of Fame information. -All HOF v1.0 files have a size of 176 bytes. The first 2 bytes belongs to the -record count. The format is US. The maximum number of records allowed is -6, so the second byte is always 0x00. Following those bytes there is an array -of records. This array has a full size of 29 bytes distributed according to the -following table. -Offset Size Type Name Description -0 -25 text -Player name -25 -2 US 1 -Remaining minutes -27 -2 US 1 -Remaining ticks -Table 25: HOF blocks -1 similar to SAV format - -28 - - In case there is no record, the 29 bytes spaces must be filled with zeros in -order to complete the whole file and give it the size of 2 + 29 ∗ 6 = 176. - -8 - -Credits - -This document -Writing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Patrik Jakobsson -Hubai Tamas -Reverse Engineering -Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Brendon James -MAC Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dongsoo Lim -Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tammo Jan Dijkema -RLE Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tammo Jan Dijkema -LZG Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anke Balderer -Diego Essaya -Sounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Christian Lundheim -Palettes and Speaker Sounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . David -PLV v1.0 -Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Brendon James -Enrique Calot - -9 - -License - -c 2004 – 2008 The Princed Project Team Permission is granted to -Copyright ° -copy, distribute and/or modify this document under the terms of the GNU Free -Documentation License, Version 1.2 or any later version published by the Free -Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no -Back-Cover Texts. - -Indexes -List of Tables -1 -2 -3 -4 - -DAT file blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . -Image headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -Algorithm codes . . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Palette blocks . . . . . . . . . . . . . . . . . . . . . . . - -29 - -5 -6 -6 -9 - - 5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 - -EGA and CGA palettes . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Level blocks . . . . . . . . . . . . . . . . . . . . . . . . . -POP1 Foretable codes . . . . . . . . . . . . . . . . . . . . . . . . -Background modifiers by group . . . . . . . . . . . . . . . . . . . -Stone modifiers on seed position . . . . . . . . . . . . . . . . . . -First 20 seed values of the second row separator . . . . . . . . . . -Default Guard colours . . . . . . . . . . . . . . . . . . . . . . . . -Wave Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT file blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Level blocks for Mac . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 2.0 Master index . . . . . . . . . . . . . . . . . . . . . . . . -Slave Index ID strings . . . . . . . . . . . . . . . . . . . . . . . . -DAT 2.0 Level blocks . . . . . . . . . . . . . . . . . . . . . . . . . -POP2 Foretable Codes . . . . . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -PLV blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -PLV Mandatory Fields . . . . . . . . . . . . . . . . . . . . . . . . -SAV blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -HOF blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - -9 -10 -12 -14 -15 -15 -16 -18 -18 -19 -19 -20 -21 -22 -24 -25 -26 -27 -27 -28 -28 - -List of Figures -1 - -Distribution of the sindow size. . . . . . . . . . . . . . . . . . . . - -30 - -8 - - \ No newline at end of file diff --git a/applications/PoP/docs/PORT_PLAN.md b/applications/PoP/docs/PORT_PLAN.md deleted file mode 100644 index 525f333..0000000 --- a/applications/PoP/docs/PORT_PLAN.md +++ /dev/null @@ -1,555 +0,0 @@ -# Prince of Persia на ZX Sprinter — план порта - -## СТАТУС (обновлено 2026-08-01) - -Документ составлен 2026-07-15 как план «с нуля» и с тех пор во многом -исполнен. Читать его надо так: - -| Раздел | Что с ним сейчас | -|--------|------------------| -| §1 возможности библиотек | актуально как обзор, но **спрайтовый движок `sprite.h` для персонажей НЕ используется**: Kid/страж рисуются прямыми блитами атласов (`gfx_blit_cols_part*`) с ручным heal — так требует модель оригинала (§6) | -| §2 held-state клавиатуры | **сделано** (`kbd_mod_state`, ``). Открытая проблема — потеря байт при аккордах Shift+стрелка; диагноз и план в `../roomtest/TASKS_CLOSED.md` (KBD-1) | -| §3 форматы данных | актуально; уровень читается живьём (`roomtest/pop_level.c`) | -| §4 стратегия фона | **сделано** — тайловый рендерер в рантайме (`roomtest/pop_bg.c`) | -| §5 PoC | **закрыт и превзойдён.** `poc/` (плейсхолдер-персонаж) — история; активная разработка ушла в `roomtest/` с настоящей графикой | -| §6 модель движения | **сделано**: `play_seq` + `frame_table` оригинала, не физика с нуля | -| §7 фазы | см. отметки статуса прямо в разделе | -| §8 риски | п.1 закрыт, п.3 закрыт (28 страниц-атласов Кида), п.2/п.4 — см. отметки в разделе | -| §10 режим памяти | **сделано и переросло план**: `huge` + четыре банка кода; актуальная раскладка — `layout_plan_v2.md` | - -**Где смотреть текущее состояние, а не план:** `../roomtest/README.md` -(что играется), `../roomtest/TASKS_OPEN.md` (что в работе), `levels_plan.md` -(следующие уровни), `layout_plan_v2.md` (раскладка кода по окнам и банкам). - ---- - -Опирается на -`APPLEII_RESOURCE_FORMAT.md` / `MSDOS_RESOURCE_FORMAT.md` / `README.md` в -этой папке, на текущий sprinter-cc/libc/libbgi (см. §1) и на локальные копии -`applications/PoP/SDLPoP` (github.com/NagyD/SDLPoP, GPLv3) и -`applications/PoP/PR` (github.com/NagyD/PR, GPLv2) — используются только как -справочник по структурам/константам оригинального движка и как источник -готовых распакованных ассетов (`SDLPoP/data/`), не как код для копирования. - ---- - -## 1. Что уже есть в sprinter-cc и библиотеках (используем как есть) - -Собрано из `docs/TODO.md`, `docs/libc-reference.md`, `docs/sprite-api-design.md`, -`libbgi/include/{gfx.h,sprite.h,graphics.h}`, `examples/rpgwalk`. - -- **Графика 320×256×256** (`GFX_MODE_320x256x256`, режим 0x81) — разрешение и - глубина цвета совпадают почти впрямую с VGA-ассетами оригинала - (`SDLPoP/data/VPALACE`, `VDUNGEON` — уже 256-цветные PNG). Не нужно ужимать - в EGA/CGA палитру. -- **BGI-слой** (`graphics.h`) — примитивы, палитра, текст, `getimage/putimage` - — Фазы 1-2d готовы и проверены в MAME. -- **Спрайтовый движок v2** (`sprite.h`, ветка `sprite-engine-v2`) — ровно то, - что нужно персонажам PoP: - - retained-модель (`sprite_update`/`sprite_flip`, double-buffer, dirty-биты, - heal+blit за один проход); - - кадровая анимация по ленте (`sprite_anim`, LOOP/PINGPONG/ONCE, - горизонтальная/вертикальная лента) и tween-перемещение - (`sprite_moveto`, DDA без knowledge-heavy арифметики); - - Y-сортировка слоями (`gfx_sprite_ysort`, `layer`) — то, что нужно для - «Кид перед/за стражником» без ручной пересортировки; - - атласы в EMM-страницах (`atlas_t`/`atlas_load`) — на восьмерых - персонажей в `rpgwalk` уже работает: прямой прецедент для Кида/стражника; - - ограничение кадра ≤ 64×64 — с запасом (см. §3: кадры Кида в оригинале - ~12-30 × 39-42 px). -- **Frame pacing** (`gfx_set_fps_div`) + цепочка кадровых IRQ — стабильный - логический тик независимо от рендер-нагрузки экрана (проверено MAME). -- **EMM-бюджет**: ~3.3 МБ свободно на старте (`memory/sprinter_emm_budget`) — - с большим запасом на все спрайт-атласы и предрендеренные фоны комнат (см. - §4) даже без выгрузки неиспользуемых уровней. -- **Файловый ввод-вывод** (FILE* v2, `fopen/fread/...`) — для загрузки - уровней/атласов/палитр с дискеты, по образцу `rpgwalk` (`atlas_load`, - `gfx_pal_fload`). -- **Клавиатура (событийная)** — `kbhit/getch/getkey` (ASCII + `KEY_*` скан-код - для стрелок), см. §2 — это НЕ то, что нужно для управления Кидом один в - один (см. ниже). -- **Звук** — `cbl.h` (потоковый CBL/COVOX, callback-модель, verified MAME) — - подходит для оцифрованных эффектов (`digisnd*.dat` — PC-звук - ~11 кГц 8-бит, см. `MSDOS_RESOURCE_FORMAT.md` §4). - -Вывод: **движок отрисовки и анимации почти не требует нового кода** — -самый близкий по духу пример (`rpgwalk`: атласы, анимация, tween, дабл-буфер, -FPS-делитель) переносится на PoP почти без изменений архитектуры. - ---- - -## 2. Единственный принципиальный пробел: удержание клавиш - -**Спайк проведён (2026-07-15), вопрос закрыт артефактами — не догадкой.** - -`getch`/`getkey` — это события ESTEX WAITKEY/SCANKEY (по нажатию), без чёткой -информации о СОСТОЯНИИ (что зажато прямо сейчас, несколько клавиш -одновременно). Prince of Persia на управлении требует именно состояния: -держать направление (бег) + одновременно нажать вверх (прыжок вперёд), держать -Shift (модификатор) + направление и т.д. - -### 2.1 Находки - -1. **`docs/converted/ProgrammerManual.txt` документирует функцию, которую мы - раньше пропустили: `CTRLKEY` (ESTEX $33h)** — «Получить состояние - клавиатуры». Дословно: «данные берутся не из буфера клавиатуры (как в - остальных функциях), а непосредственно из результатов ПОСЛЕДНЕГО - сканирования» — то есть это НАСТОЯЩЕЕ live-state, не событие. Но - покрывает только модификаторы: Left/Right Shift, Ctrl, Alt, - Rus/Lat, Num/Scroll/Caps Lock, Insert (не обычные клавиши вроде стрелок). - Готовое решение для «держать Shift = бежать» — тривиальная обёртка, - без архитектурных рисков. -2. Для ОБЫЧНЫХ клавиш (стрелки, буквы) такого live-state нет нигде в ESTEX — - `WAITKEY`/`SCANKEY`/`TESTKEY` ($30/$31/$37h) — все три отдают ОДИНАКОВЫЙ - формат «очередное нажатие», без release. `TESTKEY` не удаляет событие из - буфера (полезно для «подсмотреть, не потребляя»), но это тоже разовое - нажатие, не состояние. -3. Автоповтор клавиатуры (typematic) не годится как замена held-state: - `MAME_MCP_GUIDE.md` фиксирует задержку до первого повтора ~1 секунда - (типично для PS/2) — на порядок медленнее кадра (20 мс), не подходит для - платформера. -4. **Решающий артефакт — `libc/irq/_irq_tramp.c` (сам трамплин прерывания, - не гипотеза):** вектор 0xFF общий для кадра/клавиатуры/CBL. Ветка - клавиатуры (бит 0 порта 0x19 = SIO-A RR0 «байт принят») делает буквально - `jp 0x0038` (прямиком в DSS) **до какого-либо чтения порта данных 0x18 И - до нашей кадровой цепочки (`_irq_chain`)** — наш `irq_chain_add` - вообще не видит клавиатурные прерывания, они физически не доходят до - цепочки (см. `tr_notkbd`/`tr_frame` разбор в файле). Значит текущая - инфраструктура (тот же механизм, что несёт FPS-делитель) НЕ дает - зацепки для клавиатуры без правки самого трамплина. -5. Регистр данных SIO (порт 0x18) — аппаратный приёмный буфer, чтение - деструктивно (дёргает байт из очереди); кто прочитал первым, тот и - владеет байтом. Значит «подглядеть, не мешая DSS» технически - невозможно — необходимо либо совсем не трогать этот путь (статус-кво), - либо взять его СЕБЕ полностью на время геймплея. - -### 2.2 Рекомендация (конкретная, не три равнозначных варианта) - -**A. Тривиально, почти без риска — обернуть `CTRLKEY` ($33h)** отдельной -функцией (например `kbd_mod_state()` в ``) — даёт настоящий -held-state для Shift/Ctrl/Alt. Можно делать хоть сейчас, не архитектурное -решение. - -**B. Для обычных клавиш (стрелки и т.д.) — по прецеденту CBL.** В -`_irq_tramp.c` уже есть пример «приватного» пути на том же векторе 0xFF, -который сознательно НЕ чейнится к DSS (CBL: бит 7 порта 0xFE, свой -хук `_irq_cbl_hook`, полный сейв, свой `reti`). Предлагаемый новый -компонент `` — симметричный: ветка по биту 0 порта 0x19 читает -порт 0x18 САМА (декодирует PS/2 make/break, `0xF0`-префикс — протокол -уже задокументирован в `docs/samples/sprinterKeybLib.asm`), ведёт битовую -карту «клавиша N зажата», и НЕ прыгает в DSS, пока путь активен — -жизненный цикл `kbd_raw_open()`/`kbd_raw_close()` один в один как у -`cbl_open`/`cbl_close`. - - **Важное следствие (сообщить пользователю явно, не прятать):** пока - `kbd_raw_open()` активен, DSS вообще не получает клавиатурных байт — - `kbhit/getch/getkey/CTRLKEY` заведомо не будут работать, ESC для выхода - в DSS-смысле тоже (нужно проверять raw-битовую карту самим). Это - нормально для активной фазы геймплея (у самой игры и так свой цикл - ввода), но означает: экраны/паузы, которым нужен ESTEX-ввод (например, - диалог сохранения через `fopen`, если тот когда-либо потребует ввода - с консоли), должны на это время `kbd_raw_close()`. - -**Не рекомендую вариант «таймаут-эвристика поверх SCANKEY»** — after -находки о typematic-задержке ~1с он не даёт нужной задержки для игры; -рекомендация A+B закрывает потребность без компромиссов. - -**Статус: A+B РЕАЛИЗОВАНЫ (2026-07-15, по согласованию с пользователем).** - -- A: `kbd_mod_state()` — `libc/conio/kbd_mod_state.c` + `` - (`KBD_MOD_*`). -- B: `` (`libc/kbd/`) + правка `libc/irq/_irq_tramp.c` - (новая ветка на бите 0 порта 0x19: raw активен → сама читает порт - 0x18, декодирует make/break, НЕ чейнится к DSS; raw выключен — - поведение как раньше, без изменений). Трамплин вырос со 150 до - 220 байт — `_IRQ_TRAMP_BUF_SIZE` поднят с 224 до 288 (было 4 байта - запаса, стало ≥60). `make -C libc` (fast+safe) — чисто. -- **Верификация в MAME** (`tests/kbdraw`, полный цикл open→держать→ - отпустить→ESC-выход→close): `KBD_LEFT` (0x16B, расширенный код - E0 6B) — down на нажатие, up на отпускание, ТОЧНО совпало с - константой из ``; `KBD_ESC` (0x76, обычный код) — - корректно закрыл raw-канал и вернул DSS (`IM` вернулся в 1). - Побочно найдено и задокументировано в `docs/libc-reference.md` - (``): MAME-мостовой `press_key` дёргает ОБЕ клавиатуры - (PC+ZX) одновременно и через ZX-путь давал паразitный незатухающий - бит — не относится к реальному сценарию (пользователь подтвердил: - матрица на Sprinter давно не используется), но означает, что - будущие MAME-тесты этой функции надо гонять через `:kbd:ms_naturl:*` - напрямую, не через удобный `press_key`. UP/DOWN/RIGHT/SPACE/SHIFT - константы — НЕ перепроверены поштучно (тот же общеизвестный - стандарт PS/2 Set 2, что и подтверждённые LEFT/ESC — проверить перед - использованием в PoC, если управление будет ощущаться неверно). -- На реальном железе — не проверено (только MAME). - ---- - -## 3. Формат данных — что напрямую переносим из docs/*RESOURCE_FORMAT.md - -- **Уровень** (`BLUETYPE`/`BLUESPEC`/`LINKLOC`/`LINKMAP`/`MAP`/`INFO`, - 2304 байта, 24 экрана × 30 тайлов) — читаем один раз при загрузке уровня - в свою C-структуру (прямой memcpy дампа файла, поля читаем по офсетам - из `APPLEII_RESOURCE_FORMAT.md` §1). DOS `levels.dat` даёт то же самое - +1 байт в конце записи — отбросить. -- **Графика фона/спрайтов** — кодек сжатия DOS `.DAT` не восстановлен и - восстанавливать не будем: используем уже распакованные PNG из - `SDLPoP/data/{KID,GUARD,VPALACE,VDUNGEON,...}` (см. - `MSDOS_RESOURCE_FORMAT.md` §5, §7 — тот же контейнерный формат/нумерация, - просто другой релиз сборки данных). Измерено локально: кадры Кида — - ~12×39 .. 30×42 px (P-режим, 4-бит палитра), фоновые тайлы подземелья — - 32 px по ширине (10 колонок × 32 = 320 — сходится с шириной экрана), высота - тайла 20/60/62 px (неоднородные ряды пола/потолка/арок) — укладывается в - лимит спрайтового движка (кадр ≤ 64×64) без всяких изменений движка. -- **Звук** — `digisnd*.dat` (PC-звук 8-бит ~11 кГц) — конвертация в сырой - PCM и проигрывание через `cbl_open`/`cbl_push_*`; `ibm_snd*.dat` (PC-спикер - тройки «частота×2Б + длительность») — тривиальный бипер, не требует CBL. - MIDI-семейство (`midisnd`, `mt32snd`, `prince.dat`) — вне скоупа (нет - синтеза MIDI на платформе; не блокирует геймплей). - ---- - -## 4. Стратегия фона — ПЕРЕСМОТРЕНО 2026-07-15: тайловый рендерер В РАНТАЙМЕ - -**Было** (первая версия плана): офлайн-склейка каждой комнаты в готовую -растровую картинку 320×~193, `gfx_blit` целиком при входе — обоснование -было «ноль нового кода в libbgi». Пересчёт по факту наличия структурных -данных комнаты (§3.4 формата, `level.h`) показал: 16 уровней × 24 комнаты × -~60-80 КБ/картинка — это **30+ МБ**, при том что одна и та же картинка -тайла (пол/стена/колонна) переиспользуется в десятках комнат — офлайн- -склейка печёт её заново в каждую копию. - -**Стало**: тайлы — переиспользуемый набор картинок ОДИН на визуальный -стиль (не на комнату), структурные данные комнаты — компактные (60 байт: -30×foretable+30×backtable, все 16 уровней ≈ 37 КБ, см. `level.h`). -`room_draw()` (applications/PoP/poc/room.c) проходит 30 тайлов комнаты и -зовёт `gfx_blit` для каждого, читая картинку из таблицы по типу тайла -(`tile_images[TILE_TYPE]`). Итог: десятки-сотни КБ переиспользуемых -тайл-картинок на весь визуальный стиль + ~37 КБ структуры уровней — -вместо 30+ МБ. - -**Почему это НЕ бьёт по бюджету кадра**: `room_draw()` зовётся ОДИН РАЗ -при входе в комнату (смена комнаты — не every-frame событие), не в -игровом цикле — это не `sprite_update`, тактовый бюджет кадра не -затронут. - -Анимированные тайлы (факел, шипы, дверь-плита) по-прежнему рисуются как -отдельные `sprite_t` поверх фона — движок это уже умеет (Y-order/layers, -dirty-биты, heal против фона через ОЗУ-копию); `room_draw()` кладёт в -ОЗУ-копию именно статичную геометрию (пол/стены/колонны Фазы 1 — §5.2), -поверх неё heal спрайтов работает как обычно. - -`toolchain/room_compose.py` (генерик-компоновщик тайлов в одну картинку, -§6.1) остаётся полезным ИНСТРУМЕНТОМ конвертации отдельных тайл-картинок -(PNG → getimage raw), просто теперь его выход — 32 маленьких файла -`tileNN.raw` (по одному на тип тайла), а не один большой файл на комнату; -сама раскладка/повторное использование по комнатам — в C-коде -(`room_draw`), не в офлайн-склейке. - ---- - -## 5. Proof-of-Concept — цель: доказать, что порт вообще ощущается как PoP - -> **Закрыт (исторический раздел).** PoC в `poc/` свою задачу выполнил и -> дальше не развивается: управление ощущается как PoP, held-state работает. -> Всё, что ниже про плейсхолдер-персонажа и приблизительную дугу прыжка, -> — уже неправда для активной ветки: в `roomtest/` стоит настоящая графика -> Кида и авторские таблицы кадров (§6). Раздел оставлен ради истории -> решений (в частности §5.1 — почему сначала был плейсхолдер). - -**Объём**: одна комната (например Level 1, экран старта Кида), без -переходов между экранами, без стражников (стретч-цель, не обязательна). - -**Что показываем**: -1. Кид на экране, с закреплённым офлайн-конвертированным набором кадров - (подмножество: idle, walk L/R, jump-начало/дуга/приземление, стоп-на-краю, - возможно повисание на краю) — атлас в W0-странице, по образцу `rpgwalk`. -2. Управление: держать влево/вправо — идёт; отпустил — тормозит/стоит; - нажатие вверх во время бега — прыжок вперёд (дуга по авторским таблицам - смещений, не по gravity-физике «с нуля» — см. §6). Здесь же проверяется - решение по §2 (реальный held-state). -3. Столкновения: пол/край экрана/провал — по факту чтения тайла из - `BLUETYPE` под ногами (без LINKLOC-триггеров пока). -4. Стабильный кадр 50 Гц через уже готовый `gfx_wait_vsync`/дабл-буфер - (без FPS-делителя — Кид анимируется каждый видеокадр, как в оригинале). - -**Критерий успеха**: субъективно «прыжок ощущается как в PoP» (дистанция и -тайминг прыжка сверены с оригинальными таблицами, не подобраны на глаз — -см. §6), управление отзывчивое (не событийное с задержкой), сцена не мерцает -на стыке спрайт/фон. - -**Не входит в PoC**: стражники/бой, звук, HUD/таймер, переходы между -комнатами, ловушки/триггеры, титры/меню, сохранения. - -**Расположение**: `applications/PoP/poc/` (свой sprinter-cc проект + Python -конвертер ассетов, по структуре `examples/rpgwalk`). - -### 5.1 Статус (2026-07-15) — первая итерация: управление + коллизия края - -Сделано и проверено в MAME (`applications/PoP/poc/`, `make run`): -держать LEFT/RIGHT (`kbd_raw_down`, raw-канал из §2) — идёт непрерывно, -отпустил — стоит на месте (не событийно, реальный held-state); -столкновение с краями экрана (клип по `MINX`/`MAXX`); анимация -ходьбы/разворота лицом по направлению (`sprite_anim` пинг-понг); -дабл-буфер + `gfx_wait_vsync` — без видимого мерцания. Сборка — -`--memory huge` без `--bank` (§10, подтверждено рабочим). - -**Важное отступление от плана (осознанно, не молча):** персонаж — -ВРЕМЕННАЯ заглушка (лицензированный спрайт-пак -`third_party/16x16-RPG-characters` через `tools/gen_kid_placeholder.py`, -тот же источник, что уже использует `examples/rpgwalk`), а НЕ -конвертированная графика оригинальной Prince of Persia. Причина: -исходный набор кадров Кида (`SDLPoP/data/KID`) — копирайт -Broderbund/Ubisoft; автоматический конвейер, который систематически -извлекает и переупаковывает его в новый формат, — это на практике -внутрипроектное решение, которое стоит принимать пользователю явно -для каждого шага, а не проводить асинхронно агентом без лишнего -подтверждения. Сама графика — не то, что проверяет PoC (§5 явно: -цель — ощущение управления/коллизий, не визуальная точность). Замена -на настоящую графику Кида — отдельный шаг, на усмотрение пользователя. - -**Ещё не сделано** (следующие итерации §5): авторские таблицы -смещений кадров (§6 — движение при ходьбе линейное, px/кадр), -реальный уровень/фон по `BLUETYPE`/`LEVEL1` (сейчас — плейсхолдер: -плоский пол на весь экран, без ямы/выступа), `kbd_mod_state`/ -Shift-бег не подключены к игровому циклу (обёртка готова с Фазы A). - -**Прыжок/присед добавлены и ПРОВЕРЕНЫ (2026-07-15)**: состояние -`jumping`/`jump_t`/`crouching`, своя приблизительная дуга прыжка -(`jump_height[]`, 40 кадров) — не авторская таблица, см. §6.1. -HUD-текст статуса (нет отдельной позы). - -Живое тестирование пользователем нашло реальный баг: держа UP чуть -дольше 0.8 с (длительность дуги), получали ДВА прыжка подряд — код -проверял `kbd_raw_down(KBD_UP)` как уровень (держится, пока клавиша -физически зажата), а не как фронт нажатия, поэтому в момент -приземления «UP всё ещё зажат» тут же триггерил новый прыжок. -Исправлено edge-detect'ом (`up_prev` — предыдущее состояние UP, -триггер только на переход 0→1). Проверено брейкпоинтом в отладчике -MAME на адресе входа в код прыжка: за одно длинное удержание UP -брейкпоинт срабатывает РОВНО ОДИН РАЗ — фикс подтверждён на уровне -кода, не только «на глаз». - -Побочный урок (см. `docs/libc-reference.md` ``): моя -более ранняя попытка проверить UP/DOWN/RIGHT по скриншотам после -`press_key` ошибочно решила, что скрипт их не нажимает вообще — -на самом деле нажимает исправно, просто скриншот ловил случайный -момент дуги. Брейкпоинт/watchpoint на конкретный адрес кода — -надёжнее скриншота для таких проверок. - ---- - -## 6. Модель движения: авторские таблицы кадров, не физика с нуля - -Оригинальный движок PoP не считает прыжок как непрерывную физику -(gravity/velocity каждый тик) — движение персонажа задано таблицами кадров -анимации, где у части кадров зашито фиксированное смещение (dx, dy) для -ЭТОГО конкретного кадра последовательности (структура видна и в -исходниках Apple II — `SEQTABLE.S`/`MOVER.S`, и в SDLPoP `seg003.c`/`seq*` -таблицах). Практическое следствие для нашего движка: -- **Не использовать** `sprite_anim`/`sprite_moveto` для основного - персонажа как есть (они лианейно тянут по таймеру/тянут к линейной - цели) — вместо этого приложение само на каждый логический тик: - переключает кадр (`sprite_frame`, атлас как лента поз, не «прогрессия - первый..последний» автоматом) и одновременно применяет dx,dy ЭТОГО - кадра к позиции (`sprite_move`). -- Готовая автоматика движка (`sprite_anim`/`sprite_moveto`/tween, - Y-сортировка) остаётся полезной для декоративных/фоновых элементов - (факелы, патрулирующий стражник вне боя — почти один в один паттерн - `rpgwalk`). -- Источник таблиц смещений: переснять из `Prince-of-Persia-Apple-II/01 POP - Source/Source/{MOVER.S,SEQTABLE.S,FRAMEADV.S}` и/или - `SDLPoP/src/seq*.c` — задача Фазы 1 полной реализации (§7), не PoC - (для PoC можно взять урезанный набор смещений вручную по количеству - пикселей на кадр, посчитанному по видео/скриншотам оригинала, и уточнить - позже). - -### 6.1 Инструмент конвертации кадров разного размера (`toolchain/png_strip.py`) - -Кадры персонажа в оригинале — РАЗНОГО размера каждый (bbox зависит от -позы; `sprite_t` нашего движка (`libbgi/include/sprite.h`) хранит ОДИН -фиксированный w/h на весь спрайт и рисует от угла, без per-frame -смещения — в отличие от оригинала, где на каждый кадр было своё XCO/YCO -(`APPLEII_RESOURCE_FORMAT.md` §2.2). `toolchain/png_strip.py` (генерик, -не завязан на PoP — принимает произвольный список PNG) закрывает это -ПАДДИНГОМ: канвас = макс. w/h среди кадров ленты, якорь по умолчанию -bottom-center («ноги на месте»), остальное — прозрачность. - -**Компромисс, не полноценное решение**: один сильно выбивающийся по -размеру кадр в ленте раздувает канвас (и память) ВСЕХ кадров этой же -ленты. Смягчается группировкой по похожим размерам в отдельные атласы -(не одна лента на все позы актора — так уже сделано для ходьбы отдельно -от прыжка). - -**Полноценное решение (кандидат в будущее расширение библиотеки, НЕ -делать без предложения и подтверждения пользователя)**: per-frame -смещение в `sprite_t` (аналог XCO/YCO оригинала) — тогда паддинг -не нужен вообще, экономия памяти по полной. Делать только если память -станет РЕАЛЬНОЙ проблемой (не гипотетической) — тогда предложить как -отдельную правку `sprite.h`/движка. Подробности компромисса — -memory/png_strip_padding_tradeoff. - ---- - -## 7. Полноценное приложение — фазы (после PoC) - -Порядок — по риску и зависимостям, не по геймплейной важности. -**Отметки статуса — на 2026-08-01.** - -**Фаза 0 — инфраструктура порта** — **СДЕЛАНА**, но иначе, чем задумано: -- Хелд-стейт клавиатуры по §2 — сделан. -- Конвертер уровней не понадобился: `res200N.bin` из `SDLPoP/data/LEVELS` - кладётся на образ как есть и читается по офсетам в рантайме - (`roomtest/pop_level.c`), уровень живёт в EMM-странице. -- Конвертер фона в растры **отменён осознанно** (§4): фон собирается - тайлами в рантайме. Спрайты — `toolchain/pop_pack_bg.py` / - `pop_pack_kid.py` / `pop_pack_guard.py` → атласы `.atl` (Kid — 28 - страниц, риск §8 п.3 закрыт). - -**Фаза 1 — Кид, полный набор действий** — **СДЕЛАНА**: стоять/идти/бежать/ -тормозить/разворот/прыжки/повисание/подтягивание/спуск/приседание/ -осторожный шаг/питьё зелья/смерть от провала и от пик; переходы между -комнатами во все четыре стороны. Осталось: **старт по данным уровня** -(`pop_level_start_*` реализованы, но не подключены) — задача L1-START в -`../roomtest/TASKS_OPEN.md`. - -**Фаза 2 — мир и ловушки** — **СДЕЛАНА**: кнопки/ворота через -`LINKLOC`/`LINKMAP`, шипы, loose-полы (тряска, обрушение, щебень, пробой -потолка), зелья, дверь уровня (открывается), факелы. Подробности и -справочник — `gates_spikes_plan.md`. - -**Фаза 3 — бой** — **СДЕЛАНА в объёме обычного стражника**: подбор и -выхватывание меча, стойка, удар/парирование, коллизия клинков, HP обеих -сторон, смерть; ИИ стража (замечает Кида, подходит, боевые ветки), -персистентность трупа между комнатами. - -**Фаза 4 — разнообразие противников** — **НЕ НАЧАТА**. Скелет нужен на -уровне 3, толстый — на 6, тень — на 12, визирь — на 13; привязка -«уровень → тип стража» (`tbl_guard_type`) описана в `levels_plan.md` §1. - -**Фаза 5 — звук** — **НЕ НАЧАТА**: CBL-эффекты (шаги, удары, двери, -падение) из `digisnd*.dat`→PCM; PC-спикер тройки (`ibm_snd*.dat`) как -опциональный дешёвый бипер без CBL, если формат подтвердится простым -парсингом. Опкод `SOUND` в `play_seq` пока просто съедает свой аргумент — -точки вызова уже на месте. - -**Фаза 6 — оболочка** — **НЕ НАЧАТА**: титры, меню/выбор уровня, HUD -(таймер/жизни), сохранение прогресса (FILE*), финальные катсцены — по -минимуму, геймплейно не критично. Полоса HP — единственное, что уже есть. - -**Между Фазами 4 и 5 вклинивается то, чего в этом плане не было: -переход между УРОВНЯМИ** (загрузка следующего уровня, второй тайлсет -palace, потабличные различия уровней). Отдельный документ — -`levels_plan.md`. - -**Фаза 7 — стабилизация**: полный прогон всех 14 уровней в MAME -(`mame_interactive.py`), затем на реальном железе; профилирование бюджета -кадра по методике `sprite_engine_perf`/`sprite-api-design.md` §9д на самых -насыщенных экранах (несколько стражников + ловушки одновременно — -проверить лимит ~21 спрайт/кадр и Y-sort лимит 32); при необходимости — -банкинг (`--memory big/huge`) для кода/уровня, если размер вылезет за -tiny/small. - ---- - -## 8. Риски, требующие спайка/артефакта до架构 решений - -(по правилу `defer_unexplained_quirks` — не гадать, проверять) - -1. ~~**Held-state клавиатуры** (§2)~~ — **закрыт** (``). Открытый - остаток — не «есть ли held-state», а потеря байт при аккордах - Shift+стрелка: `../roomtest/TASKS_CLOSED.md`, KBD-1. -2. **Бюджет кадра** — риск подтвердился, но не в том виде, в каком ожидался: - спрайтовый движок для персонажей не используется, поэтому лимит - «~21 спрайт/кадр» неприменим. Реальный бюджет упирается в heal+блиты и - перерисовку тайлов; замер 2026-07-30 — типичный кадр ~371 К тактов - (~86 % периода). Инструмент замера уже в коде: полосы бордюра `PROF()` - в `roomtest.c`. План выжимания — `../roomtest/TASKS_CLOSED.md` (CLIP-1) и - `../roomtest/BUGS_OPEN.md` (T-1/T-2). -3. ~~**Ёмкость атласа на актора**~~ — **закрыт**: Kid разложен на 28 - атласов-страниц по 8 спрайтов (`pop_pack_kid.py`), страж — на 5; - мульти-страничного формата `.atl` не потребовалось. Побочно - подтвердился компромисс паддинга (§6.1). -4. **Тайминг оригинала** — **ОТКРЫТ, и сверка 2026-08-01 показывает - расхождение.** Цифры оригинала (SDLPoP): базовый таймер `BASE_FPS = 60` - (`types.h:1373`), логический кадр игры — `base_speed = 5` тиков - (`data.h:869`), то есть **83.3 мс (12 лог. кадров/с)**; в бою - `fight_speed = 6` → **100 мс (10/с)**. У нас (`roomtest.c`) — три - ожидания `gfx_wait_vsync()` на итерацию, то есть **60 мс (16.7/с)** и - без отдельной скорости боя. Значит **игра идёт примерно на 39 % - быстрее эталона**. Точное соответствие даёт 4 ожидания vsync (80 мс - против 83.3) и 5 в бою (100 мс — совпадает точно). - Проверять не «на глаз», а секундомером по одинаковому отрезку - (SDLPoP рядом на том же экране), и только после того, как кадр - перестанет иногда вылезать за период (см. п.2) — иначе замедление - спрячет проблему бюджета вместо того, чтобы её показать. - ---- - -## 10. Режим памяти сборки - -Пользователь предложил `huge` (горячий код в W1, данные в W2, редко -вызываемая логика — банками в W3) как целевой режим. Согласен, с уточнением -по срокам принятия решения. - -**`huge` — правильная цель для ПОЛНОГО приложения**, но не то, с чего надо -стартовать: - -- Layout `huge` (см. `memory_modes_implemented`): CODE_LOC=0x4100 (W1), - DATA_LOC=0x8000 (W2), банки — W3 (порт 0xE2), `crt0_banked` + - автодетект W2 (как `small`). Состояние приложения (структуры Кида, - уровня, массив `sprite_t`) остаётся в обычном W2-heap ДАЖЕ если код, - который его трогает, забанкован — `malloc` из банка возвращает - W2-указатель (`bank_local_data_pattern`), так что данные не привязаны к - конкретному банку. -- Оверхед `__banked`-вызова (trampoline: +3 байта на стеке между ret и - аргументами, виртуальный 24-битный адрес, см. `sdcc_banking`) — фиксированная - небольшая цена ЗА ВЫЗОВ, не за такт. Это не страшно для функций, которые - вызываются РЕДКО за кадр (AI одного стражника, диалог, переход между - комнатами) — страшно было бы забанковать что-то, что дёргается ВНУТРИ - горячего цикла отрисовки (там уже и так основной бюджет уходит на - `sprite_update`/блиты — см. `sprite_engine_perf`, ~19.5К тактов/спрайт). - Правило простое: **не банковать код на пути "раз в кадр на объект", - банковать код на пути "раз в кадр на комнату/раз в переход/раз в - редкое событие"**: логика ИИ стражника целиком, диалоги/катсцены, меню/ - титры/выбор уровня, парсинг уровня при входе в комнату, сериализация - сохранений — хорошие кандидаты в банки; тик Кида, чтение столкновений, - вызов `sprite_update`/`gfx_wait_vsync`, обработка ввода — должны остаться - небанкованными (W1/W2). -- Гранулярность банкования — целый файл (`--bank N=FILE.c`), это уже - системный паттерн проекта (тот же принцип, что и «1 файл = 1 юнит DCE» в - libc) — значит выгодно с САМОГО начала Фазы 1 (не задним числом) резать - исходники приложения по границе «горячее/холодное» файл-в-файл: например - `kid_tick.c`/`collision.c`/`room.c`/`input.c` — неизменно вне банков; - `guard_ai_*.c`/`dialogue.c`/`menu.c`/`levelload.c`/`combat.c` — кандидаты - под `--bank`. Тогда переход на `huge` позже — это правка Makefile/ - sprinter-cc-вызова (`--memory huge --bank N=file.c ...`), а не рефакторинг - логики. - -**Уточнение (проверено в `bin/sprinter-cc`, строки ~342-350): можно сразу -собирать PoC на `--memory huge` без единого `--bank`.** Скрипт сам -подставляет стаб `const unsigned char n_banks = 0;`, когда `--bank` не -передан ни один раз — `crt0_banked` линкуется и корректно пропускает цикл -загрузки банков при старте. Layout при этом byte-в-byte совпадает с тем, -что делает `crt0_small` для режима `small` (CODE 0x4100/W1, DATA 0x8000/W2, -автодетект W2) — разница только в том, что попутно линкуется сам -`bank.s` (таблица `_bank_pages` + trampoline-инфраструктура), это -незначительный довесок к размеру, не к рантайм-цене. Значит **PoC можно -сразу собирать вызовом `sprinter-cc --memory huge` без `--bank`-флагов** — -и когда в полном приложении появятся первые «холодные» файлы, переход на -банкование — это просто добавление `--bank N=file.c`, без смены -`--memory`/адресов/crt0. Сборочная конфигурация не потребует миграции -между PoC и полным приложением. - -Единственное, что стоит сделать уже в Фазе 1 полного приложения (не в -PoC) — планировать структуру исходников с расчётом на будущий файл-в-файл -сплит под банки (см. выше), раз гранулярность банкования — целый файл. - ---- - -## 9. Что нужно от пользователя, прежде чем двигаться дальше - -- Подтверждение направления по §2 (какой из трёх вариантов held-state - клавиатуры пробовать первым, или сначала спайк-эксперимент в MAME). -- Подтверждение объёма PoC (§5) — устраивает ли «одна комната без - стражников», или сразу закладывать хотя бы одного патрулирующего - стражника (это не архитектурно сложнее — Y-order и tween уже есть, - просто больше конвертации ассетов). diff --git a/applications/PoP/docs/README.md b/applications/PoP/docs/README.md deleted file mode 100644 index 2d9d46d..0000000 --- a/applications/PoP/docs/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# `applications/PoP/docs` — индекс + сводка по форматам ресурсов - -## Индекс документов (актуальность на 2026-08-22) - -**Живые планы — читать перед работой:** - -| Документ | О чём | -|----------|-------| -| [`../roomtest/TASKS_OPEN.md`](../roomtest/TASKS_OPEN.md) | **Что берётся в работу сейчас** (не в этой папке, но входная точка) | -| [`../roomtest/BUGS_OPEN.md`](../roomtest/BUGS_OPEN.md) | Открытые баги roomtest (закрытые — в `BUGS_CLOSED.md` рядом) | -| [`impl_diff.md`](impl_diff.md) | **Осознанные расхождения с SDLPoP**: где мы сделали не дословно и почему | -| [`perf_l13_room23.md`](perf_l13_room23.md) | **Сцена и метод замера кадра** (каскад плит, ур.13 к.23): как воспроизвести, зонды, канал `clog`, сводка по кадрам, габариты спрайтов и ответ про `uint8_t`. 2026-08-17 | -| [`perf_green_phase.md`](perf_green_phase.md) | **ЗЕЛЁНАЯ фаза (слой фона)**: раскладка тактов, способы ускорения (G1..G6), журнал правок — рабочий документ между сессиями. 2026-08-17 | -| [`perf_cyan_phase.md`](perf_cyan_phase.md) | **ЦИАН фаза (персонажи + передний слой)**: раскладка тактов, способы ускорения (C1..C7), журнал правок — рабочий документ между сессиями. 2026-08-17 | -| [`perf_backlog.md`](perf_backlog.md) | Отложенная оптимизация отрисовки с замерами 2026-08-10 + **как мерить** (wait-state'ы, границы кадра). Позиции 1–7 переехали в фазовые документы выше | -| [`quicksave_plan.md`](quicksave_plan.md) | **QuickSave/QuickLoad** (✅ реализовано, F6/F9, POP.SAV+BAK): разбор (это enhancement SDLPoP, в оригинале 1989 его НЕТ), инвентаризация нашего состояния, формат снимка 'POPQ' v3, шаги QS1..QS6. Справочник. 2026-08-22 | -| [`full_game_plan.md`](full_game_plan.md) | **Полноценная игра**: app state machine, title/intro, demo level 0, таймер, cutscenes, уровни 1..14, ending и Hall of Fame. Уровень 15 исключён. 2026-08-21 | -| [`menu_settings_plan.md`](menu_settings_plan.md) | **Pause menu и Settings**: QuickSave/QuickLoad в основном menu, `POP.CFG`, один `POP.SAV` + `POP.BAK`, текущий VANILLA и задел под ENHANCED; §10 — выбор UI-рендера (текстовые строки + свой растровый рендерер, референс SDLPoP: два шрифта), restart без подтверждения. 2026-08-22 | -| [`palette_plan.md`](palette_plan.md) | **Палитры и fade**: карта всех 256 слотов (kid.pal/title/story, тайлсеты dungeon/palace, стражи), механика fade (4 ступени vs ~64 у SDLPoP), план модуля `pop_pal.c` (API load/apply/black) + переход уровня через fade. 2026-08-23 | -| [`status_line_text.md`](status_line_text.md) | **Строка HP как статус-строка**: полная инвентаризация ВСЕХ текстов SDLPoP в `rect_bottom_text` (геометрия, семантика `text_time_total`, мигание, рестарт по истечении) + что из этого уже есть у нас. 2026-08-25 | -| [`levels_plan.md`](levels_plan.md) | Следующий этап: уровни 2+, второй тайлсет, читы SDLPoP | -| [`levels_12_15_plan.md`](levels_12_15_plan.md) | **Уровни 12/13** (тень, Джафар, падающие плиты) + что такое 14/15 и 0. 2026-08-13 | -| [`midtable_analysis.md`](midtable_analysis.md) | **Слои отрисовки**: как устроены back/mid/fore и objtable в оригинале, чего стоит порт, развилки. 2026-08-13 | -| [`roomnav_skip.md`](roomnav_skip.md) | **Комнаты для отладочного телепорта**: какие пропускать и почему (посчитано по данным уровней). 2026-08-13 | -| [`layout_plan_v2.md`](layout_plan_v2.md) | Раскладка кода по окнам/банкам/страницам + замеры скорости отрисовки | -| [`room_model_plan.md`](room_model_plan.md) | `kid_room ≠ drawn_room` (straddle): сделан S1, остальное впереди | -| [`host_tests_plan.md`](host_tests_plan.md) | Модульные тесты движка под ucsim_z80: два шва, регрессии из `BUGS_CLOSED.md`, дифф против SDLPoP | -| [`shadow_render.md`](shadow_render.md) | **Вид Тени (OR+XOR)** — отложено: почему XOR несовместим с прозрачностью `#FF`, замер подготовки источника, четыре варианта | -| [`ideas_backlog.md`](ideas_backlog.md) | Осознанно отложенные гипотезы (мышь, PRNG) | -| [`prng_alternatives.md`](prng_alternatives.md) | Запасные генераторы, если упрёмся в бюджет кадра | - -**Исполненные планы, оставленные как справочники:** - -| Документ | Чем ещё полезен | -|----------|-----------------| -| [`PORT_PLAN.md`](PORT_PLAN.md) | Общая карта фаз со статусами; §6 (модель движения), §10 (режим памяти) | -| [`KID_PLAN.md`](KID_PLAN.md) | Модель персонажа: `char_type`, `actions_*`, устройство `play_seq` — нужна для скелета/тени/визиря | -| [`gates_spikes_plan.md`](gates_spikes_plan.md) | Раскладка объектов уровня 1 по комнатам, декод `LINKLOC`/`LINKMAP`, точные ссылки на seg-код | - -**Форматы ресурсов** (ниже по этому файлу): `POP-DAT-FormatSpecifications.pdf` -/ `.txt` (первоисточник), `APPLEII_RESOURCE_FORMAT.md`, -`MSDOS_RESOURCE_FORMAT.md`. - -Удалены 2026-08-01 как полностью исполненные и перекрытые кодом: -`clip_char_plan.md`, `double_buffer_plan.md`, `loose_floors_plan.md`, -`size_optimization_plan.md` (его §8 про скорость отрисовки перенесён в -`layout_plan_v2.md` §9). Ищутся в истории git, если понадобятся. - ---- - -## Форматы ресурсов — сводка - -**Каноническая спецификация форматов** — `POP-DAT-FormatSpecifications.pdf` -(+ текстовая конверсия `POP-DAT-FormatSpecifications.txt` для grep/цитирования): -*«Prince of Persia — Specifications of File Formats»*, Princed Development Team, -2008. Это первоисточник формата `DAT v1.0` (контейнер, индекс, чек-сумма, -кодеки RLE/LZG, палитры, уровни, звук), на котором построены и SDLPoP, и -Princed Resources. Документы ниже — наши практические заметки/сверки; при -расхождении источником истины считать спецификацию. - -Цель этих документов — подготовить почву для будущего порта Prince of Persia -на ZX Sprinter, разобрав, как устроены ресурсы игры в двух доступных нам -версиях: - -- [`APPLEII_RESOURCE_FORMAT.md`](./APPLEII_RESOURCE_FORMAT.md) — формат - уровней и графики по официально опубликованным исходникам 1989 года - (6502-ассемблер). Уверенность высокая везде — восстановлено прямым чтением - кода движка, а не догадками. -- [`MSDOS_RESOURCE_FORMAT.md`](./MSDOS_RESOURCE_FORMAT.md) — формат `.DAT` - ресурсов DOS-версии (исходников нет). Восстановлено эмпирически (разбор - байтов + перепроверка скриптами) и сверено с документацией открытых - сторонних инструментов (SDLPoP, Princed Resources). - -## Главный вывод - -**Формат уровня практически идентичен в обеих версиях**: Apple II `LEVELn` -занимает ровно 2304 байта (структура `blueprnt` — тайлы, связи -плит/дверей, граф экранов, метаданные старта Кида/стражников), а запись -уровня в DOS `levels.dat` занимает 2305 байт с байтовыми значениями тайлов -того же диапазона. То есть Джордан Мехнер перенёс формат карты уровня в -DOS-порт практически без изменений (+1 байт, вероятно контрольная сумма от -DOS-упаковщика). Это значит: раскладку `BLUETYPE`/`BLUESPEC`/`LINKLOC`/ -`LINKMAP`/`MAP`/`INFO`, задокументированную по Apple II исходникам, можно -применять напрямую и к DOS `levels.dat`. - -Формат же **графики отличается принципиально**: на Apple II это простой -несжатый rowbyte-формат hi-res экрана с плоской таблицей указателей; в DOS — -контейнер с оглавлением ресурсов (id/size/offset), с отдельными вариантами -под CGA/EGA/VGA — точный кодек пикселей внутри сырого `.DAT`-чанка не -восстановлен ни для той, ни для другой версии до конца. **Но для DOS-графики -это не блокирует работу**: в репозитории github.com/NagyD/SDLPoP (папка -`data/`) уже лежат готовые распакованные PNG для каждого спрайта/фона -(включая VGA-256-цветный вариант `VPALACE`/`VDUNGEON` — то, что нужно под -320×256×256 Sprinter), см. §5 `MSDOS_RESOURCE_FORMAT.md`. Это другой -релиз/сборка данных, чем наш локальный `MSDOS/` (некоторые звуковые `.dat` -отличаются по размеру), но нумерация ресурсов и формат контейнера — те же, -что подтверждено побайтовой сверкой уровня `res2001.bin`. - -## Общий контейнерный формат DOS `.DAT` (кратко) - -``` -[0x00] u32 LE tableOffset — смещение начала таблицы оглавления -[0x04] u16 LE tableSize — размер таблицы оглавления -[0x06..tableOffset) — данные ресурсов (конкатенация чанков) -[tableOffset..tableOffset+tableSize) - — массив записей по 8 байт: - u16 size, u16 id, u16 offset(абсолютный), u16 reserved(=0) -``` - -Инвариант `tableOffset + tableSize == размер файла` подтверждён на всех 28 -`.dat`-файлах в `MSDOS/`, и независимо — именованием файлов `res.*` в -`data/` репозитория SDLPoP. - -## Готовые ассеты для порта (важно для практической работы) - -`github.com/NagyD/SDLPoP/tree/master/data` содержит не только код движка, но -и сами ресурсы игры — как сырые `.DAT`, так и распакованные поштучно файлы -(`res.png` для спрайтов/фонов, `res.pal` для палитр, `res.bin` -для уровней). Для арт-ассетов (в т.ч. нужного полноцветного VGA-варианта -дворца/подземелий) практичнее взять их оттуда напрямую, чем писать свой -декодер сжатия пикселей DOS `.DAT`. - -## Что дальше по форматам (не сделано и пока не нужно) - -Порт читает уровень напрямую из `res200N.bin` (`roomtest/pop_level.c`), а -графику берёт из распакованных PNG `SDLPoP/data/` — поэтому ни один пункт -ниже сейчас не блокирует работу. - -1. Точный кодек сжатия пикселей спрайтов в сыром DOS `.DAT` (нужен только - если понадобится читать именно нашу локальную копию `MSDOS/*.dat` - "как есть", а не ассеты из SDLPoP `data/`) — сверка с исходником SDLPoP, - `src/seg009.c`. -2. Семантика служебных полей `digisnd*.dat`/`ibm_snd*.dat` перед сырыми - сэмплами/нотами (частично прояснено документацией Princed Resources — - PC speaker: 1 байт заголовка + повторяющиеся тройки байт "2 байта частоты - + 1 байт длительности"; WAV: 8 бит, моно, unsigned, 11025 Гц). -3. Назначение бит `secmask` в `BLUETYPE` (Apple II) и служебного блока - `id=2000` в начале DOS `levels.dat` (16 байт в нашей копии, но 2305 байт - в версии SDLPoP — расхождение между релизами, не разобрано). -4. Оценка, какие видеорежимы/цветовые палитры ZX Sprinter реалистично - покрывают исходную графику (CGA/EGA/VGA варианты в DOS-ресурсах против - hi-res Apple II) — отдельная архитектурная задача порта, не формат - ресурсов как таковой. diff --git a/applications/PoP/docs/frame_pacing_plan.md b/applications/PoP/docs/frame_pacing_plan.md deleted file mode 100644 index 38a1669..0000000 --- a/applications/PoP/docs/frame_pacing_plan.md +++ /dev/null @@ -1,603 +0,0 @@ -# Фиксированный логический кадр — разбор перед реализацией - -Дата разбора: 2026-08-19. Отправная точка — тег `0.0.1-prealpha`. -Статус: **АНАЛИЗ, кода не трогали.** - -Задача пользователя: перевести логический кадр на фиксированный размер, -не зависящий от длительности синей/зелёной/циан фаз. Инструмент — -`gfx_set_fps_div`, режимы FASTEST / FAST / NORMAL. - - -## 1. Что на самом деле меняется - -Сейчас главный цикл (`roomtest.c`) после отрисовки ждёт **три** -`gfx_wait_vsync()` подряд. Каждый ждёт ближайший фронт луча, поэтому -период логического кадра равен - - период = ceil(W) + 2 растровых кадра, W = работа в растрах - -Первое ожидание доедает хвост текущего растра, два следующих — целые -растры. Отсюда наблюдаемое: `W <= 1` → период 3; `W = 1.1` → период -уже 4. То есть **реальный бюджет логического кадра сегодня — один -растр (430 080 тактов)**, всё сверх него стоит целого лишнего растра. - -Нужное поведение: - - период = max(n, ceil(W)) - -При `n = 3` бюджет становится **1 290 240 тактов** — втрое больше. -Замеренный максимум работы на 13/23 (911 862) укладывается туда с -запасом, а 11/15 (437 484 лёгкая / ~603 000 тяжёлая позиция) — вдвойне. - -Это главный выигрыш, и он не про скорость игры, а про **исчезновение -скачков**: сегодня превышение растра на один такт стоит +33 % к периоду. - - -## 2. Три режима и их привязка к оригиналу - -Растровый кадр Sprinter: 320 строк × 896 пикселей при 14 МГц = -**20,48 мс** (48,83 Гц). В тактах CPU (21 МГц) — **430 080**; -замерено на холостом DSS: 430 131 на прерывание. - -Оригинал (`SDLPoP/src/seg003.c:363`): `BASE_FPS = 60`, -`base_speed = 5` тика = **83,3 мс**, `fight_speed = 6` = **100 мс**. - -| режим | обычно | в бою | мс обычно | мс в бою | к оригиналу | -|---|---:|---:|---:|---:|---| -| FASTEST | 3 | 3 | 61,4 | 61,4 | +36 % скорости | -| FAST | 3 | 4 | 61,4 | 81,9 | +36 % / точно | -| NORMAL | 4 | 5 | 81,9 | 102,4 | точно (83,3 / 100) | - -NORMAL воспроизводит оригинал с точностью 1,7 % и 2,4 % — расхождение -только из-за 48,83 Гц против 60 Гц, целыми делителями точнее не выйдет. - -**Условие «бой» берём у оригинала буквально** — оно проще, чем кажется: - -```c -if (Kid.sword == sword_2_drawn) set_timer_length(timer_1, fight_speed); -else set_timer_length(timer_1, base_speed); -``` - -Это не «идёт бой» и не «есть страж рядом», а **только «у Кида вынут -меч»**, и проверяется в самом верху главного цикла, до `play_frame()`. -У нас поле есть (`Kid.sword`, `SWORD_2_DRAWN` — `guards.c`), так что -переключение — одна строка в том же месте цикла. - -Это закрывает и давнюю задачу **L1-SPEED** (`TASKS_OPEN.md`): сейчас мы -идём на 60 мс вместо 83,3 — примерно на 39 % быстрее эталона. - - -## 3. Как устроен темп сейчас и что мешает - -`gfx_wait_vsync()` имеет две ветки (`libbgi/common/gfx_wait_vsync.c`): - -- **`_gfx_fps_div <= 1`** — лучевой поллинг бита 5 порта `0xFE` в тесном - цикле, и в этом цикле зовётся **idle-хук** (`gfx_set_idle_hook`). - roomtest вешает туда `kbd_raw_poll` — это единственное, что делает - клавиатуру работоспособной (задача KBD-1: приёмный FIFO SIO 3 байта, - импульс запроса прерывания живёт 32 такта и теряется в DI-окнах - акселератора; лечится только плотным опросом раз в ~0,5 мс). -- **`_gfx_fps_div >= 2`** — счётчиковый путь: ждёт, пока фоновый ISR - (`_gfx_frame_isr`, слот кадровой цепочки) насчитает `n` фронтов, а - ожидание реализовано через **`ei; halt`**. - -**И вот здесь блокер.** На счётчиковом пути idle-хук не зовётся вообще. -Включив `gfx_set_fps_div(3)` как есть, мы немедленно возвращаем KBD-1: -теряются нажатия при зажатом Shift, залипают клавиши. Это не мелочь и -не «потом поправим» — это единственная причина, по которой клавиатура -сейчас вообще работает. - - -## 4. Что измерено (MAME, 2026-08-19) - -### Метод и его границы - -Прерывания считались брейкпоинтами на резидентных адресах трамплина -(`_irq_tramp` = 0x88B4, ветка кадрового пути `tr_frame` = 0x8995). - -**Счёт попаданий брейкпоинтом на этом драйвере недостоверен**: sprinter -дёргает `Z80_INPUT_LINE_WAIT` (`do_mem_wait`), инструкция пересчитывается, -и один и тот же PC срабатывает по нескольку раз. Наблюдалось -«попаданий больше, чем растровых кадров» и «попаданий в `tr_frame` -больше, чем входов в трамплин» — логически невозможные результаты. - -Достоверен только **детектор разрыва**: брейкпоинт на следующей -инструкции пишет `temp3 = totalcycles`, брейкпоинт с условием -`(totalcycles - temp3) > 0x9D800` (1,5 растра) останавливает машину. -Дубли попаданий его не портят. Все числа ниже — этим методом. - -Отдельная грабля: **литералы в отладчике MAME шестнадцатеричные**. -Первый прогон с порогом «700000» на деле проверял 0x700000 = 17 растров -и не срабатывал никогда. - -### Факты - -1. **Холостой DSS** — 799 прерываний на 343 674 880 тактов = 430 131 на - прерывание. Подтверждает константу растра и что потерь нет, когда - нечего рисовать. - -2. **11/15, покой (чомпер + два факела + страж)** — потери ЕСТЬ: - разрыв ровно 860 129 тактов = два растра = одно потерянное - прерывание. Частота в «плохой» фазе: 12 потерь на 427 растровых - кадров = **2,8 %**; повтор — 12 на 495 (2,4 %) при бегущем Киде. - -3. **Та же сцена после сдвига Кида** (`]`/`[`, попиксельно) — - **0 потерь на 3919 кадров**, и после возврата обратно **0 на 4010**. - -4. **Полная перерисовка комнаты** (переход/`+`) — разрыв 1 720 289 = - ровно четыре растра = **три потерянных прерывания подряд**. - -5. **13/23** — ни в покое, ни при беге потерь не поймано; на смене - комнаты — поймано. - -6. **Клавиатура ни при чём**: с удержанной клавишей 3,1 %, без неё - 2,8 % — в пределах разброса. - -### Как это читать - -Пункты 2 и 3 вместе — самое важное. Одна и та же сцена даёт то 2,8 %, -то ноль. Значит потеря определяется **не нагрузкой, а фазой**: попадает -ли момент кадрового прерывания внутрь DI-окна блита. - -Механизм подтверждён исходником MAME (`sprinter.cpp`): - -- `irq_on` поднимает линию и заводит `irq_off_timer` на **32 такта - неразогнанного клока (3,5 МГц) = 9,14 мкс**; `irq_off` гасит. Ядро - z80 в MAME уровневое (`m_irq_state` без защёлки) — импульс, пришедший - под `di`, теряется НАСОВСЕМ. Это же поведение у настоящего Spectrum - (INT 32 такта), так что это не эмуляторный артефакт. -- DI-окно у нас — один вызов `_bgi_blit_rows_raw`, а он по контракту - режется вызывающим на **чанки ≤16 строк** (≈6 200 тактов ≈ 0,29 мс). - То есть DI-окна короткие и с промежутками, отсюда и «то теряем, то - нет»: всё решает, куда попал 9-микросекундный импульс. -- `irqack_cb` гасит **все три** входа мержера (экран/клавиатура/CBL) - одним подтверждением. Плюс трамплин обслуживает за вход ровно один - источник и делает приватный RETI. Значит кадровое прерывание может - быть съедено клавиатурной веткой или (в будущем) CBL-веткой. - -**Вывод по фазе.** Наш период сейчас 3 растра, но иногда 4 — и каждый -такой случай сдвигает фазу рендера относительно луча. Отсюда «полосы»: -десятки секунд без потерь, потом полоса с потерями. При жёстком -пейсинге период станет РОВНО n, фаза перестанет плавать — и сцена может -**залипнуть в плохой фазе надолго**. Это хуже случайных 3 %: систематическая -потеря по прерыванию на кадр превратит логический кадр из 3 растров в 4, -то есть даст ровные −25 % скорости, которые никак не проявятся в -профиле тактов. - - -## 5. Проблемы по убыванию риска - -| # | проблема | риск | -|---|---|---| -| P1 | счётчиковый путь ждёт через `halt` → idle-хук не зовётся → возврат KBD-1 (потеря нажатий, залипание клавиш) | блокер | -| P2 | счётчик кадров теряет тики (фазозависимо, 0…3 %), при жёстком пейсинге может залипнуть в плохой фазе → ровный минус скорости | высокий | -| P3 | полноэкранная перерисовка (вход в комнату, старт уровня) теряет 3+ тика подряд → счётчик недосчитает, ожидание растянется сильнее самой работы | средний | -| P4 | звук через CBL (`_irq_cbl_hook`, реальный ISR в трамплине): (а) ещё один источник, крадущий кадровые тики приватным RETI; (б) обратно — любое подтверждение гасит ожидающий запрос CBL → underrun (счётчик `cbl_underruns()` уже есть); (в) ISR длинный (полный сейв обоих наборов + вызов в приложение) | средний, растёт | -| P5 | второй call-site `gfx_wait_vsync()` — ветка `frozen` (`roomtest.c:320`) ждёт один фронт; под делителем её смысл меняется | низкий | -| P6 | `IRQ_CHAIN_MAX = 4`; делитель занимает слот, звук — свой; запас есть, но конечный | низкий | -| P7 | бит 5 порта `0xFE` доступен только при включённом `cbl_mode`; сейчас его лениво занимает сам `gfx_wait_vsync` через `_cbl_port_ref`, при открытии реального звука владение переходит к CBL — переход уже спроектирован, но его надо проверить в связке | низкий | - -Отдельно, не проблема а рычаг: по сообщению разработчиков -(IvanMak.txt:846–848) **новая прошивка позволяет акселератору работать с -EI** — по приходу прерывания он отключается, по `RETI` включается. -Если это подтвердится на железе и моделируется в MAME, P2 исчезает -полностью. Проверять отдельно; строить на этом нельзя (неизвестно, какая -прошивка у пользователя). - - -## 6. Варианты реализации - -### A. Включить `gfx_set_fps_div(3)` как есть -Отвергается: P1 (убивает клавиатуру) — сразу, без вариантов. - -### B. Свой `wait` в приложении: счётчик только на рендер, ожидание — лучом -Счётчик кадровых прерываний отвечает на один вопрос — «сколько фронтов -съел рендер», а само ожидание идёт **существующим лучевым поллингом с -idle-хуком**, то есть клавиатура работает ровно как сегодня. - -``` -k = tick - tick_at_frame_start; /* фронтов съел рендер */ -if (k >= n) k = n - 1; /* опоздали — ждём хотя бы один */ -повторить (n - k) раз: ждать фронт луча (поллинг + idle-хук) -tick_at_frame_start = tick; /* якорь на фактическом фронте */ -``` - -Плюсы: минимальная правка, клавиатура нетронута, фаза переякоривается -каждый кадр (ошибка не копится). Минус: остаётся P2 — при залипании в -плохой фазе `k` систематически занижен на 1, и кадр ровно на растр -длиннее. Профилем это не видно. - -### C. Программный счётчик кадров по лучу (без прерываний вообще) -Считать фронты **выборкой бита 5 в точках, которые мы и так проходим**. -Окно бланка (строки 272…319) длится **3,07 мс**, максимальное DI-окно — -0,29 мс, значит достаточно опрашивать чаще, чем раз в 3 мс. - -Точки выборки: `pop_blit_b` (наша обёртка, зовётся на каждый блит — -в фазах рисования это плотнее 0,3 мс) плюс несколько точек в синей фазе -(она 149 106 тактов ≈ 6,9 мс без единого блита, нужно 3-4 точки). - -Цена: `in a,(0xFE)` + проверка бита + дедуп фронта ≈ 40-50 тактов; при -~50 выборках это 2 500 тактов = 0,6 % растра. - -Плюсы: **точно, и точность не зависит ни от DI, ни от звука, ни от -клавиатуры** — снимает P2, P3, P4(а) разом. Минус: заводит инвариант -«между выборками не больше 3 мс», который легко нарушить будущей правкой. -Инвариант проверяем в MAME тем же детектором разрыва. - -### D. CTC как источник кадра -`irq_ctc_install` уже есть (каналы 2+3, вектор 0x06, отдельный от 0xFF). -Запрос CTC **защёлкивается** (daisy chain — в `_irq.h` прямо записано, -что без `RETI` следующего прерывания не будет), поэтому под `di` он не -теряется, а откладывается. Пресет 112 × 160 даёт ровно период кадра -без дрейфа (обе частоты — от одного X_SP). - -Блокер: `irq_ctc_install` вектрится напрямую и требует кода в W2 → -сейчас только tiny/big, а roomtest — **huge**. Нужна W2-копия -CTC-трамплина (в дизайн-доке помечена как follow-up). Плюс защёлка -хранит только ОДИН отложенный запрос — на полноэкранной перерисовке -(P3) всё равно недосчитает. - -### Рекомендация - -**B как первый шаг, C — как способ закрыть P2**, и оба под одним -интерфейсом: приложение зовёт свой `pop_wait_logical_frame(n)`, а чем -внутри считаются кадры — деталь реализации. Тогда B→C не трогает ни -главный цикл, ни режимы. - -D не нужен, пока C справляется, и требует работы в libc (W2-копия -CTC-трамплина) ради того же результата. - - -## 7. Порядок работ с критериями приёмки - -**Ш0. Инструмент.** Скрипт замера потерь кадровых прерываний (детектор -разрыва) — зафиксировать как повторяемую процедуру, он понадобится на -каждом шаге. Критерий: воспроизводит числа §4 на 11/15 и на смене комнаты. - -**Ш1. Свой `wait` (вариант B), делитель ещё не включён.** Вынести -хвост главного цикла в `pop_wait_logical_frame(n)`, поведение при n=3 -должно быть **бит-в-бит прежним** (три фронта после работы). Критерий: -такты по фазам и распределение периода не изменились, клавиатура -работает. - -**Ш2. Счётчик кадров.** Слот кадровой цепочки + `k = tick - anchor`. -Критерий: в 11/15 период стал ровно 3 растра ВСЕГДА (сейчас 3/4/5), а -на 13/23 — 3 вместо нынешних 3/4/5; клавиатура не деградировала -(проверка Shift+стрелки по методике KBD-1, не «на глаз»). - -**Ш3. Режимы.** `POP_SPEED_FASTEST/FAST/NORMAL` + условие боя -`Kid.sword == SWORD_2_DRAWN` в верху цикла, как у оригинала. Критерий: -NORMAL секундомером совпадает с живым SDLPoP на одинаковом отрезке -(методика из L1-SPEED — секундомер, не глазомер). - -**Ш4. Закрыть P2 (вариант C).** Выборка луча в `pop_blit_b` и в синей -фазе. Критерий: детектор разрыва не ловит ни одного расхождения между -программным счётчиком и лучом за 10 000 кадров, включая смену комнаты. - -**Ш5. Звук.** Только после Ш4: открыть CBL и перемерить P4 — -`cbl_underruns()` и потери кадровых тиков. - -## 8. Что проверить артефактом до начала - -1. Сколько именно фронтов съедает вход в комнату — от этого зависит, - нужен ли отдельный «resync» на тяжёлых переходах или хватит того, - что якорь переставляется каждый кадр. -2. Ветка `frozen` (`roomtest.c:320`) — какой темп ей нужен под делителем. -3. Проверить, что при n=4/5 бит 5 всё ещё единственный источник фронта - (то есть `_cbl_port_ref` держится всё это время). - - ---- - -# 9. Предлагаемый вариант подробно: программный счётчик кадров по лучу - -Дополнение от 2026-08-19 по запросу: как именно получается **точное** -число пройденных кадровых интервалов. Акселератор рассматриваем только -в нынешнем виде — с DI/EI (режим «акселератор с EI» из новой прошивки -из рассмотрения снят). - -## 9.1. Сигнал и его геометрия - -Единственный источник — **бит 5 порта `0xFE`**. Точная семантика по -исходнику MAME (`sprinter.cpp`, `kbd_fe_r`): - -```c -data |= 0xe0; -data ^= 0x40; -if (cbl_mode()) { - data &= ~0xa0; /* гасит биты 5 и 7 */ - data |= (vpos >= BORDER_TOP + SCREEN_YSIZE) << 5; - data |= ... & 0x80; /* бит 7 — CBL */ -} -``` - -То есть **бит 5 = 1 ровно тогда, когда луч ниже картинки** -(`vpos >= 16 + 256 = 272`), и это ЧТЕНИЕ ПОЛОЖЕНИЯ ЛУЧА, а не событие: -ни прерывания, ни защёлки, ни очереди — его невозможно «потерять», -можно только не посмотреть. - -Важное следствие из той же строки: вне `cbl_mode` бит читается как 1 -всегда (его выставляет `data |= 0xe0` и уже ничто не гасит). Поэтому -счётчик обязан работать только при взведённом `_cbl_port_ref()` — том -самом, который сейчас лениво взводит `gfx_wait_vsync`. - -Геометрия кадра (320 строк × 896 пикселей при 14 МГц): - -| | строк | мс | тактов CPU (21 МГц) | -|---|---:|---:|---:| -| бит 5 = 1 (нижний бланк) | 48 | 3,07 | **64 512** | -| бит 5 = 0 (картинка + верхний бордер) | 272 | 17,41 | 365 568 | -| кадр целиком | 320 | 20,48 | 430 080 | - -Границей кадра берём **фронт 1→0** — это `vpos = 0`, ровно то же -событие, которого ждёт сегодняшний `gfx_wait_vsync`. Значит момент -свопа страниц не меняется: до начала картинки остаётся верхний бордер, -16 строк ≈ 1 мс запаса, как и сейчас. - -## 9.2. Счётчик - -```c -static uint8_t beam_prev; /* бит 5 на прошлой выборке */ -static uint8_t frame_tick; /* счётчик кадров, разностная арифметика */ - -/* ~20 T-состояний тела + вызов; в тактах MAME ≈ 120 на выборку */ -void pop_beam_sample(void) -{ - uint8_t b = in_fe() & 0x20; - if (beam_prev && !b) frame_tick++; /* фронт 1→0 = начало кадра */ - beam_prev = b; -} -``` - -Вся арифметика ожидания — разностная по модулю 256, wrap безопасен -(тот же приём, что в существующем `_gfx_fps_state`). - -## 9.3. Почему счёт ТОЧНЫЙ (условие и запас) - -Утверждение: **если между соседними выборками проходит меньше 64 512 -тактов, то каждый фронт 1→0 будет засчитан ровно один раз.** - -Доказательство прямое. Пусть максимальный зазор между выборками -Δ < 64 512. Окно «бит 5 = 1» длится 64 512 тактов, то есть длиннее Δ, -значит в него попадает хотя бы одна выборка → `beam_prev` обязательно -станет 1 внутри каждого бланка. Окно «бит 5 = 0» длится 365 568 — тем -более содержит выборку → сразу после бланка `beam_prev` перейдёт в 0 и -даст ровно один инкремент. Двойной счёт невозможен: инкремент -происходит только на переходе 1→0, а `beam_prev` тут же обновляется. - -Условие ОДНО и оно про зазор, а не про нагрузку, не про DI, не про -прерывания. Отсюда все свойства варианта. - -**Какой запас по факту.** Самый длинный неделимый кусок кода без -возможности выборки — одно DI-окно акселератора, то есть один вызов -`_bgi_blit_rows_raw`. Он по контракту режется вызывающим на чанки -**≤16 строк**; при ширине 32 это ≈ 6 200 тактов, при полной высоте -спрайта 63 строки самый дорогой замеренный блит целиком — 32 073. -Даже если мерить самым грубым образом (одна выборка на целый блит, -а не на чанк), зазор вдвое меньше окна бланка. - -## 9.4. Где ставить выборки - -Правило простое: **выборка обязана стоять так, чтобы ни один путь -исполнения не давал зазора длиннее 64 512 тактов.** По фазам: - -- **Зелёная и циан** (436 494 и 382 770 тактов на 13/23) состоят из - блитов и хилов. Достаточно одной выборки на вызов наших обёрток - `pop_blit_b`, `pop_heal_off`, `pop_heal_fast` — но НЕ только их: - прямые вызовы `gfx_blit_*` / `gfx_heal*` разбросаны по шести файлам - (`pop_cdraw.c`, `pop_draw.c`, `pop_kdraw.c`, `pop_room.c`, - `pop_state.c`, `pop_tile.c`). Точный набор точек определяем НЕ - рассуждением, а замером (см. 9.7): ставим в обёртки, меряем худший - зазор, добавляем точки только там, где замер их требует. -- **Синяя** (149 106 тактов) — блитов нет вообще, это 2,3 окна бланка. - Нужны явные точки: после ввода, после физики, после `pop_process_trobs`, - после mob-тика. Ставятся на границах, которые и так размечены - зондами `pop_dbg_m*`. - -Чего заведомо НЕ хватит: выборок только в главном цикле. Один -`pop_floor_bake` — 179 914 тактов, почти три окна бланка. - -## 9.5. Ожидание — тот же примитив - -Ожидание фронта и есть плотная выборка, поэтому оно сливается со -счётчиком, а опрос клавиатуры остаётся ровно таким же плотным, как -сегодня: - -```c -static void wait_edge(void) -{ - uint8_t t = frame_tick; - do { - pop_beam_sample(); - kbd_raw_poll(); /* то, что сейчас висит idle-хуком */ - } while (frame_tick == t); -} -``` - -`gfx_set_idle_hook` при этом больше не нужен — опрос зовётся прямо. -Обязателен аварийный выход по счётчику попыток (как в нынешнем -`gfx_wait_vsync`): на железе, где бит ведёт себя иначе, цикл не должен -виснуть насмерть. - -## 9.6. Пейсинг целиком - -```c -uint8_t k = (uint8_t)(frame_tick - anchor); /* фронтов съел рендер */ -if (k >= n) { - wait_edge(); /* опоздали — выравниваемся на ближайший */ -} else { - do { wait_edge(); } while ((uint8_t)(frame_tick - anchor) < n); -} -anchor = frame_tick; /* якорь по ФАКТУ, фаза не копится */ -flip_page(); -``` - -`anchor = frame_tick`, а не `anchor += n` — сознательно: догонять -пропущенное время нельзя, иначе после тяжёлого кадра игра рванёт -вперёд. Это же правило заложено в исходном дизайне делителя -(«выравнивание на ближайший фронт, без накопления фазовой ошибки»). - -Поведение по случаям: - -| работа W (растров) | период | комментарий | -|---|---|---| -| W ≤ n | ровно n | цель задачи | -| n < W ≤ n+1 | ceil(W) | подтормаживает ровно настолько, насколько не успели | -| вход в комнату, W ≫ n | ceil(W) + 1 | ветка «опоздали»: один фронт, без растягивания | -| загрузка уровня, файловые операции | ceil(W) + 1…n | выборок нет вовсе → k занижен; худшее — n лишних растров ОДИН раз | - -Последняя строка — единственный случай, где счёт неточен, и он -безобиден: во время `ESTEX`-вызова выбирать нечего, а ошибка живёт один -кадр, потому что якорь переставляется по факту. - -## 9.7. Как это доказывается, а не декларируется - -Инструмент уже построен и проверен на нынешнем коде (§4): брейкпоинт на -следующей инструкции пишет `temp3 = totalcycles`, второй с условием -`(totalcycles - temp3) > 0x9D800` останавливает машину. - -Для приёмки он ставится **на инструкцию инкремента `frame_tick`**. -Если хоть один фронт пропущен, зазор между инкрементами станет два -растра и детектор остановит машину. Критерий: **10 000 кадров без -единого срабатывания**, включая смену комнаты и смерть Кида. - -Дополнительно, в отладочной сборке — перекрёстная проверка со счётчиком -кадровых прерываний (слот цепочки, один INC): прерывания теряются, луч -не должен, значит `frame_tick` обязан идти НЕ МЕДЛЕННЕЕ `irq_tick`. -Расхождение в другую сторону = пропущенная выборка. - -Напоминание о методике: **счёт попаданий брейкпоинтом на этом драйвере -недостоверен** (WAIT-линия, инструкция пересчитывается) — только -детектор разрыва. И литералы в отладчике MAME шестнадцатеричные. - -## 9.8. Цена - -| статья | тактов | -|---|---:| -| одна выборка (с вызовом) | ≈ 120 | -| ~60 выборок за логический кадр | ≈ 7 200 | -| доля от бюджета при n=3 (1 290 240) | **0,6 %** | - -В горячих местах (`pop_blit_b`) выборку можно заинлайнить и снять цену -вызова. - -## 9.9. Чем это лучше счётчика прерываний - -| | счётчик кадровых IRQ | счётчик по лучу | -|---|---|---| -| теряет тик под `di` акселератора | да, фазозависимо 0…3 % | нет — читается положение луча | -| теряет тик, если IRQ съела клавиатурная/CBL-ветка трамплина | да (приватный RETI) | нет | -| ломается от добавления звука | да (ещё один источник, `irqack` гасит все входы мержера) | нет | -| поведение на полной перерисовке | 3 тика подряд мимо | считает все | -| условие корректности | никакого — не в нашей власти | зазор выборок < 64 512 тактов, проверяется артефактом | -| риск залипнуть в плохой фазе и ровно потерять 25 % скорости | есть | нет | - -## 9.10. Что осталось проверить зондами до кодирования - -1. **Худший зазор между выборками** при размещении «только в обёртках» - — сколько точек реально нужно добавить. Это же число решает, нужна - ли выборка в синей фазе в четырёх местах или в двух. -2. **Владение `cbl_mode`**: сейчас бит 5 доступен потому, что - `gfx_wait_vsync` взвёл `_cbl_port_ref()` при первом вызове. Свой - ожидатель обязан взвести его сам — значит примитив логичнее держать - в libbgi (там доступен `_cbl_port_ref`), а не в приложении. -3. **Ветка `frozen`** (`roomtest.c:320`) — какой темп ей нужен. -4. Совпадает ли момент возврата `wait_edge()` с нынешним возвратом - `gfx_wait_vsync()` с точностью до микросекунд (иначе поедет момент - свопа и появятся разрывы картинки). - - ---- - -# 10. РЕЗУЛЬТАТ (2026-08-19, реализовано и проверено в MAME) - -Реализовано в приложении (`roomtest/pop_pace.c/.h`), в libbgi пока НИЧЕГО не -переносили — по решению пользователя: сначала обкатать у себя. - -## 10.1. Что сделано - -- `pop_beam_sample()` — выборка бита 5 порта `0xFE`, 10 инструкций, - быстрый путь 46 T + вызов. Модуль НЕ банковый, поэтому из банков - зовётся прямым `call` (проверено: банки так зовут `_pop_cd_hit_slot`). -- `pop_wait_edge()` — ожидание одного фронта; внутри тот же - `kbd_raw_poll()`, что раньше висел idle-хуком. -- `pop_pace_end(n)` — добрать до n фронтов от якоря; якорь ставится ПО - ФАКТУ. Главный цикл: `pop_wait_edge()` → строб вспышки → - `pop_pace_end(n)` → своп страниц. -- `pop_pace_arm()` — взводит `cbl_mode` через `gfx_wait_vsync()` и - ПРОВЕРЯЕТ, что фронты идут; если нет — `pace_ok = 0` и всё молча - откатывается на прежние `gfx_wait_vsync`. -- Режимы FASTEST/FAST/NORMAL, клавиша **P** по кругу, дефолт FASTEST. - Условие боя — `Kid.sword == SWORD_2_DRAWN`, буквально как у оригинала. - -## 10.2. Где стоят выборки и как они выбраны - -Точки ставились **не на глаз, а по замеру**: детектор зазора между -выборками (порог 64 512) останавливает машину, адрес возврата со стека -называет виновника. Пять итераций «замерил → закрыл дыру → перемерил»: - -| итерация | найденная дыра | тактов | -|---|---|---:| -| 1 | `kid_tick` + `pop_phys_tick` без выборок | 68 340 | -| 1 | весь циан, когда оба персонажа «тихие» | 100 044 | -| 2 | отрисовка персонажей идёт мимо `pop_blit_b` | 82 242 | -| 2 | полоса HP: `pop_kid_img_blit` в цикле | 86 586 | -| 3 | между двумя `pop_blit_b` — работа `pop_bg` | 75 000 | -| 4 | сам блит и сам heal (выборка была только НА ВХОДЕ) | 71 900 | -| 5 | `pop_loose_tick` | 73 990 | - -Итог: выборки в `pop_blit_b` (вход и перед каждым `gfx_w0_unmap`), -`pop_heal_fast` (вход и выход), после каждого `gfx_set_bank(SPRITE)` в -`pop_cdraw/pop_kdraw/pop_room`, в 16 потайловых функциях `pop_bg`, после -зондов `pop_dbg_p1..p8` в физике и в 21 точке главного цикла. - -## 10.3. Замеры - -Метод точности счётчика — **атомарный снимок одной командой отладчика**: -`printf "%d %d", totalcycles, b@<адрес pop_frame_tick>`. Раздельные -`lmem` и `print totalcycles` НЕ ГОДЯТСЯ: между двумя обращениями к мосту -проходят десятки кадров, и «недосчёт» получается на ровном месте (на этом -я сначала и обжёгся). - -| проверка | результат | -|---|---| -| счётчик, 11/15 покой, 5 окон | недосчёт **0** (270 растровых кадров) | -| счётчик, 11/15 тяжёлая позиция Кида | недосчёт **0** | -| счётчик, 13/23 | недосчёт **0** | -| период кадра, 11/15 | **ровно 3 растра**: ни длиннее 3,1, ни короче 2,9 на 302 логических кадрах | -| период кадра, 13/23 | **ровно 3 растра** на 308 логических (эталон был 3/4/5) | -| режим NORMAL | ровно 4 растра | -| NORMAL + `Kid.sword = 2` | ровно 5 растров | -| клавиша P | 0 → 1 → 2 → 0 | -| клавиатура | Кид отвечает на удержание и отпускание | - -**Цена выборок** — A/B прямо в памяти (заглушить `pop_beam_sample` -байтом `C9` и снять `pace_ok`, чтобы игра не зависла в ожидании фронта): -работа за кадр 543 860 с выборками против 539 832 без — **≈4 000 тактов, -0,9 %**. На фоне бюджета, который вырос втрое, это ничто. - -## 10.4. Грабли, стоившие времени - -1. **Литералы в отладчике MAME шестнадцатеричные.** Порог «700000» на - деле проверял 0x700000 = 17 растров и не срабатывал никогда. -2. **Счёт попаданий брейкпоинтом на этом драйвере недостоверен** (WAIT- - линия, инструкция пересчитывается): наблюдались «попаданий больше, чем - растровых кадров». Достоверны только сравнения ВРЕМЁН. -3. **Раздельные чтения через мост не атомарны** (см. 10.3). -4. **Мёртвый Кид перезапускает уровень** раз в `RESPAWN_DELAY` тиков, а - рестарт уровня — это 3-5 растров без единой выборки. Полдня я гонялся - за «дырой в статике», которой не было: Кид успел убежать в соседнюю - комнату и погибнуть, пока я мерил. **Проверяй, что на экране, прежде - чем объяснять числа.** -5. **`make LEVEL=13` без `make clean` не пересобирает** — флаги в - зависимостях не участвуют, на диск уезжает старый уровень. - -## 10.5. Что осталось - -- Перенос примитива в libbgi — по решению пользователя ПОСЛЕ обкатки. - Там же уместнее взводить `_cbl_port_ref` напрямую, без обходного - `gfx_wait_vsync()` в `pop_pace_arm`. -- Загрузка уровня/комнаты остаётся без выборок (ESTEX-вызовы) — счётчик - там недосчитывает. Это безобидно: якорь переставляется по факту, и - ошибка живёт один кадр. Отдельного «resync» не потребовалось. -- Проверить на реальном железе, что `pace_ok` взводится (в MAME — да). diff --git a/applications/PoP/docs/full_game_plan.md b/applications/PoP/docs/full_game_plan.md deleted file mode 100644 index 6c0a643..0000000 --- a/applications/PoP/docs/full_game_plan.md +++ /dev/null @@ -1,367 +0,0 @@ -# От roomtest к полноценной игре — сценарий и оболочка - -Статус: **частично реализовано; аудит обновлён 2026-08-24**. Ранее пометка -«завершены FG0–FG12» была неверной: для многих этапов уже есть код и -host-тесты, но их критерии приёмки на Sprinter ещё не выполнены. Фактический -статус каждого FG приведён в [§14](#14-этапы-реализации). - -Этот документ описывает превращение текущего игрового цикла -`roomtest` в законченную игру: заставка, интро, демонстрационный уровень, -сцены между уровнями, таймер, финал и Hall of Fame. План меню и постоянных -настроек вынесен в [`menu_settings_plan.md`](menu_settings_plan.md), -детальный план QuickSave — в [`quicksave_plan.md`](quicksave_plan.md). - -## 1. Зафиксированный scope - -- Целевая последовательность — оригинальная SDLPoP/DOS PoP с уровнями - **1..14**. Уровень 14 — скрытая финальная часть после Джаффара: его номер - игроку не показывается, победа наступает в комнате 5. -- Уровень **15 удаляется полностью**: не пакуется на HDD, не загружается, - отсутствует в переходах, читах и UI; специальная логика potions/copy - protection level удаляется. -- Уровень **0** остаётся только демонстрационным (attract mode), а не частью - новой игры. -- Title sequence повторяет SDLPoP. Перед ней допускается отдельный - пропускаемый экран с информацией о Sprinter-сборке. -- Первая версия использует текущий профиль поведения `VANILLA`. Сейчас это - означает **существующую реализацию roomtest**, включая уже встроенные - исправления. Аудит и разведение `VANILLA/ENHANCED` — будущая задача. -- Программа работает **только с HDD**. Варианты без сохранения для floppy не - проектируются. -- Моды и выбор levelset в этот план не входят. - -## 2. Что делает SDLPoP - -Источники истины в локальном SDLPoP: - -- `src/seg000.c`: `start_game()`, `show_title()`, demo mode, общий кадр, - проверка финала; -- `src/seg003.c`: `init_game()`, `play_level()`, `play_level_2()`; -- `src/seg001.c`: cutscene engine, `pv_scene()`, сцены 2/4/6/8/9/12, - `time_expired()`, `end_sequence()` и Hall of Fame; -- `src/data.h`: `tbl_cutscenes`, параметры уровня 0, win level/room; -- `data/TITLE`, `data/PV`, `data/LEVELS/res2000.bin`: ресурсы оболочки. - -Штатный маршрут: - -```text -boot - -> title / story screens - -> Princess + Jaffar intro - -> credits / Hall of Fame - -> demo level 0 - -> title или новая игра - -> levels 1..14 - before 2 -> princess cutscene - before 4 -> princess cutscene - before 6 -> princess cutscene - before 8 -> princess + mouse - before 9 -> princess + mouse - before 12 -> scene selected by remaining time - -> level 14, room 5 - -> embrace + mouse - -> ending text/music - -> Hall of Fame - -> title -``` - -Кроме уровней, здесь есть глобальный 60-минутный таймер, сцена истечения -времени, пропуск сцен клавишей, fade/flash, ожидание музыки и возврат в -attract loop после демо или финала. - -## 3. Текущее состояние roomtest - -Уже реализованы игровой кадр, комнаты, уровни, тайлсеты, Kid/Guard/Shadow, -Джаффар, специальные события, checkpoint, переходы уровней, бесшовный -выход 12-го уровня, перенос максимального HP и звуковые эффекты. - -Поверх игрового цикла уже добавлены автомат оболочки, title/story, demo -уровень 0, global timer, сценарный интерпретатор, level-flow, ending и Hall -of Fame. Полный маршрут также собирается в HDD-образ. - -Однако это **не означает готовность оболочки**. На момент аудита остаются -существенные незакрытые места: - -- lifecycle палитр: gameplay-переходы используют чёрный барьер без fade; - cold start и полный набор dungeon/palace переходов ещё не прошли приёмку; -- PV intro Princess/Jaffar уже покадровый (актёры, факелы, звёзды, часы, - молния и foreground-колонна); сцены перед 2/4/6 и длинной веткой 12 - анимируют факелы, звёзды и песок, а сцены 8/9 и короткая ветка 12 пока - используют статические позы с исходной длительностью; -- demo отображается с игровой палитрой, проходит второй разворот/зацеп и - доходит до боя; после смерти Кида корректно завершает цикл; -- time-expired, ending и Hall of Fame имеют маршрут и реализацию UI, но не - прошли сквозную MAME-проверку вместе с ресурсами и возвратом к title; -- нет полного регресса EMM/FD для каждого перехода состояния. - -## 4. Архитектура: автомат состояний приложения - -Нельзя наращивать все режимы условиями внутри кадрового цикла. Текущий -цикл должен стать реализацией одного состояния `PLAYING`: - -```text -BOOT -> BUILD_INFO -> TITLE -> INTRO -> DEMO - | | - +---- NEW_GAME <-+ - -NEW_GAME -> LEVEL_LOAD -> PLAYING <-> PAUSE_MENU - | - +-> CUTSCENE -> LEVEL_LOAD - +-> TIME_EXPIRED -> TITLE - +-> ENDING -> HALL_OF_FAME -> TITLE -``` - -Минимальный контекст оболочки: - -```c -typedef enum { - POP_APP_BOOT, - POP_APP_BUILD_INFO, - POP_APP_TITLE, - POP_APP_INTRO, - POP_APP_DEMO, - POP_APP_LEVEL_LOAD, - POP_APP_PLAYING, - POP_APP_PAUSE_MENU, - POP_APP_CUTSCENE, - POP_APP_TIME_EXPIRED, - POP_APP_ENDING, - POP_APP_HALL_OF_FAME, - POP_APP_QUIT -} pop_app_state_t; -``` - -Переходы задаются результатом состояния, а не прямыми рекурсивными -вызовами наподобие SDLPoP `start_game()`/`longjmp()`. На Z80 это проще для -стека и позволяет освобождать ресурсы каждого режима в одном месте. - -## 5. Ресурсная модель - -Title и cutscene-ресурсы нельзя постоянно держать рядом с игровыми -атласами. Для каждого состояния нужен явный lifecycle: - -```text -enter: pause sound -> unload incompatible set -> load set -> apply palette -run: process input/timer/animation -leave: stop sound -> release EMM pages -> clear transient state -``` - -Новые группы HDD: - -```text -TITLE\ title/story images, palette, optional build-screen assets -PV\ princess room, Princess/Jaffar/mouse frames, palettes -MUSIC\ intro, cutscene and ending tracks/samples -LEVELS\ res2000..res2014.bin -``` - -Конкретный формат атласов выбирает упаковщик. Runtime не должен разбирать -PNG/DAT: как и игровые спрайты, он получает подготовленные `.atl`/`.bin`. - -## 6. Экран Sprinter build - -Отдельное состояние перед оригинальной заставкой: - -```text -PRINCE OF PERSIA -SPRINTER SP2000 BUILD -version / date / build id -``` - -Требования: - -- пропускается любой клавишей; -- выключается в Settings; -- не запускает музыку оригинального title и не меняет её тайминги; -- данные версии генерируются сборкой, а не правятся вручную в C; -- отсутствие экрана приводит прямо к `TITLE`. - -## 7. Title и текстовая подсистема - -Порядок переносится из `show_title()`: - -1. основной титульный экран; -2. Presents; -3. название игры и Jordan Mechner; -4. story frame / “In the absence…”; -5. intro Princess + Jaffar; -6. story “Marry Jaffar…”; -7. credits; -8. Hall of Fame, если таблица непуста; -9. demo level 0. - -Нужны общие примитивы: загрузить full-screen image, вывести строку, -показать экран заданное время, transition left-to-right, fade in/out, -прервать ожидание клавишей. Текст и меню должны использовать один renderer. - -Критерий: последовательность и музыкальные точки совпадают с SDLPoP; -Sprinter build screen не сдвигает оригинальный soundtrack. - -## 8. Demo level 0 - -- Добавить на HDD `res2000.bin`. -- Загружать уровень обычным loader, но выставлять demo HP и demo mode. -- Воспроизводить `demo_moves` как синтетический источник `control_*`. -- Пользовательский ввод прерывает демо и начинает новую игру. -- Достижение demo end room (у SDLPoP — 24), смерть или конец скрипта - возвращают в `TITLE`. -- Pause menu, QuickSave и cheats в demo недоступны. -- RNG демо и начальное состояние должны быть детерминированы. - -Критерий: без ввода attract loop не требует перезапуска процесса; -title -> demo -> title повторяется неограниченно. - -## 9. Глобальный таймер - -Состояние: минуты, тики и флаг показа. Таймер создаётся при New Game, -переносится между уровнями и входит в QuickSave. - -Правила `VANILLA`: - -- на pause menu, загрузке HDD, QuickSave/QuickLoad время не идёт; -- игровые тики следуют темпу логического кадра, а не частоте render loop; -- поведение во время level-end sound и cutscenes сверяется буквально с - SDLPoP; -- после Джаффара/на финальном уровне время не должно вызвать поражение; -- ноль времени переводит приложение в `TIME_EXPIRED`. - -Критерий: одинаковый игровой отрезок в NORMAL даёт то же уменьшение времени, -что SDLPoP; сохранение/загрузка не добавляет и не отнимает тики. - -Реализация FG4 живёт одним модулем `roomtest/pop_timer.c` в bank 9: -`60:719`, 720 тиков на минуту, счёт только в живом игровом кадре. Settings -хранит `TIME LIMIT: 60 MIN / UNLIMITED` в `POP.CFG`; старый семибайтный v1 -payload по-прежнему читается как `60 MIN`. Читы таймера повторяют SDLPoP, -но из-за занятого `+/-` используют F7 (−1 минута, не ниже одной) и F8 -(+1 минута). Состояние входит в QuickSave v4. - -## 10. Cutscene engine - -Сцены SDLPoP состоят из небольшого набора повторяемых команд. Вместо набора -крупных C-функций нужен компактный интерпретатор: - -```text -SET_ACTOR actor -SET_POS x,y,dir -START_SEQ seq -WAIT_FRAMES n -PLAY_SOUND id -WAIT_SOUND -SET_HOURGLASS frame -SET_SAND state -FLASH color,frames -FADE_IN / FADE_OUT -CLEAR_ACTOR actor -END -``` - -Скрипты — `const` в холодном банке или подготовленный бинарный ресурс. -Interpreter обязан: - -- исполнять один шаг/кадр без блокирующих длинных циклов; -- поддерживать пропуск сцены; -- при пропуске выполнять cleanup и выходить в заранее заданное состояние; -- освобождать PV-ресурсы перед загрузкой игрового тайлсета; -- не разрешать pause menu/QuickSave внутри сцены. - -Порядок переноса: intro, 2/6, 4, 8, 9, 12, time expired, ending. Сцена 12 -выбирает короткий или обычный вариант по остатку времени. - -## 11. Переходы между уровнями - -Таблица сценария должна быть отдельна от таблиц механики уровня: - -```c -typedef struct { - uint8_t level; - uint8_t pre_cutscene; - uint8_t show_level_number; - uint8_t ending_rule; -} pop_level_flow_t; -``` - -Особые правила: - -- New Game начинает уровень 1; -- перед 2/4/6/8/9/12 запускается сцена; -- 12 -> 13 остаётся бесшовным; -- после победы над Джаффаром переход идёт в 14; -- номер 14 не показывается; -- вход в комнату 5 уровня 14 переводит в `ENDING`; -- значения больше 14 недопустимы и дают диагностическую ошибку, а не - попытку открыть файл. - -## 12. Ending и Hall of Fame - -Ending: - -1. загрузить PV-набор; -2. встреча Kid и Princess; -3. объятие; -4. появление мыши; -5. ending music; -6. финальные story/title экраны; -7. переход в Hall of Fame. - -Hall of Fame хранится на HDD в отдельном версионированном `POP.HOF`. -Сохраняются имя и результат; ввод имени использует тот же текстовый/UI слой. -Повреждённый или неизвестный формат означает пустую таблицу, но не мешает -запуску игры. После показа — возврат в `TITLE`. - -## 13. Удаление уровня 15 - -Отдельный ранний этап, чтобы новый flow не наследовал лишний маршрут: - -- убрать `res2015.bin` из `LVL_NUMS` и HDD image; -- заменить последний игровой уровень на 14; -- остановить Shift+L и прочую навигацию на 14; -- удалить `POP_POTIONS_LEVEL` и специальный половинный урон синих зелий; -- исключить copy protection из конфигурации и меню; -- добавить тест: после уровня 14 приложение входит в ending и никогда не - запрашивает `res2015.bin`. - -## 14. Этапы реализации - -Легенда аудита: **✓** — критерий этапа закрыт; **~** — код существует, но -критерий приёмки ещё не закрыт; **○** — не начат. Статус отражает состояние -исходников и последней MAME-проверки на 2026-08-24, а не только наличие -модуля в bank 9. - -| этап | статус | результат и фактическое состояние | критерий приёмки | -|---|---|---|---| -| **FG0** | ✓ | `POP_LEVEL_LAST=14`, HDD содержит `res2000..res2014`; `t_flow` отвергает 15 | HDD не содержит res2015; переход выше 14 невозможен | -| **FG1** | ~ | автомат `pop_app` и `t_app` реализованы; сквозной ресурсный lifecycle и контроль EMM/FD ещё не измерены | старт/рестарт/выход проходят без рекурсии и утечки EMM | -| **FG2** | ✓ | QuickSave/QuickLoad с `POP.SAV` и `POP.BAK`; отдельно проверен в MAME 2026-08-22 | критерии `quicksave_plan.md`, включая POP.BAK | -| **FG3** | ✓ | pause menu, Settings, подтверждения и двойной буфер реализованы; меню проверялось в MAME; добавлены SDLPoP-звуки навигации и защита CBL вокруг полного redraw/файловых операций | Resume/Save/Load/Restart/Settings/Quit работают | -| **FG4** | ~ | `pop_timer`, настройка unlimited, F7/F8 и состояние QuickSave реализованы; есть host-тест, но нет буквального сравнения темпа со SDLPoP на всех переходах | совпадение с SDLPoP и корректный save/load | -| **FG5** | ~ | text/full-screen/fade примитивы есть; для входа в первый уровень и границ уровней выбран мгновенный чёрный барьер без fade: CBL и яркая новая палитра включаются только после подготовки обеих страниц; Level 1 проверен в MAME | тестовые экраны и переходы на Sprinter | -| **FG6** | ~ | title-ресурсы и порядок кадров реализованы; Enter на title и Esc на первом story в MAME переводят прямо в `FIRST_LEVEL`, минуя demo; полная cold-boot приёмка fade остаётся в FG5 | основной титул/Presents/название/Mechner идут в точном порядке `show_title()`; Enter/Space/Esc/стрелки прерывают ожидание; story/intro продолжит FG8 | -| **FG7** | ✓ | level 0, исходная таблица `demo_moves`, demo HP=4 и блокировка игрового UI реализованы; исправлены зеркалирование auto-control, боевой AI Кида и завершение после смерти; в MAME demo проходит разворот/зацеп, доходит до боя и возвращается в attract-цикл без повторного убийства | `res2000.bin`, исходная `demo_moves`, demo HP=4; бесконечный attract loop, любой ввод начинает чистую новую игру; Pause/QuickSave/читы/таймер отключены | -| **FG8** | ~ | data-driven interpreter и покадровый PV intro работают; в MAME проверены актёры, факелы, звёзды 1x1, часы/песок, palette-0 lightning и foreground-колонна; Enter/Esc переводят прямо в `FIRST_LEVEL`; временный темп 12,5 FPS и TODO точного pacing записаны в `impl_diff.md` | story/PV intro проходит, любой raw-ввод пропускает его без удержания EMM-страниц | -| **FG9** | ~ | `pop_flow` корректно маршрутизирует 2/4/6/8/9/12 и ветку <=5 минут (`t_flow`); 2/4/6 и длинная 12 уже обновляют часы, песок, факелы и звёзды каждые 5 кадров Sprinter; длительности всех веток сверены с SDLPoP: 2/4/6/12 — 2,6 с, 8 — 6,0 с, 9 — 7,2 с; входная клавиша gameplay/Shift+L поглощается до сцены, а новое нажатие делает skip; анимации мыши/Princess в 8/9 и разворот Princess в короткой 12 ещё статичны | таблица flow переводит в CUTSCENE ровно перед 2/4/6/8/9/12; scene 12 выбирает короткий вариант при <=5 минутах | -| **FG10** | ~ | переход TIME_EXPIRED и экран существуют, но это ещё статическая PV-стадия; сквозной MAME-маршрут не принят | PV-сцена истечения с пропуском, затем возврат на title/attract; новая игра сбрасывает таймер | -| **FG11** | ~ | room 5 уровня 14 переводит в ENDING (`t_flow`); объятие/мышь заменены статической стадией, полный маршрут не принят | room 5 уровня 14 переводит в ENDING; PV-финал и Hail-экран возвращают управление оболочке | -| **FG12** | ~ | версионированный `POP.HOF`, ввод имени и восстановление после повреждённого файла реализованы; нужна сквозная MAME-проверка ending → HOF → title | версионированный `POP.HOF`, ввод имени raw-клавиатурой, повреждённый файл = пустая таблица, затем title/attract | - -## 15. Проверки - -- Host-тест автомата: все допустимые переходы и отсутствие уровня 15. -- Host-тест cutscene interpreter на синтетическом скрипте и skip в каждой - ожидающей команде. -- Host-тест demo input: одинаковый seed даёт одинаковый поток управления. -- MAME: cold boot -> build info -> title -> demo -> title. -- MAME: новая игра -> принудительный переход по всем pre-level scenes. -- MAME: time expired и пропуск сцены. -- MAME: 13 -> 14 -> room 5 -> ending -> HOF -> title. -- Проверка EMM/FD до и после каждого состояния: число страниц и открытых - файлов возвращается к базовому. -- `make size-check`; крупный cold-код размещать в банках и отдельно следить - за лимитом 16 КБ каждого банка. - -## 16. Не входит в план - -- уровень 15 и copy protection; -- моды и выбор levelset; -- replay/recording; -- точная эмуляция SDL video/controller options; -- профиль ENHANCED и индивидуальные switches fixes. diff --git a/applications/PoP/docs/gates_spikes_plan.md b/applications/PoP/docs/gates_spikes_plan.md deleted file mode 100644 index 2a2abd1..0000000 --- a/applications/PoP/docs/gates_spikes_plan.md +++ /dev/null @@ -1,279 +0,0 @@ -# Интерактивные объекты (кнопки/гейты/пики) + HP/смерть — ПОДРОБНЫЙ план - -> **Статус: РЕАЛИЗОВАНО (2026-08-01).** Все фазы плана (P0 персистентный -> per-room `room_modif`, S пики, B кнопки+ворота) сделаны и играются: -> `roomtest/pop_trob.c` (trob-диспетчер, `LINKLOC`/`LINKMAP`, ворота, дверь -> уровня, факелы, зелья), `pop_map.c` (HP, смерть на пиках, урон падения), -> `pop_redraw.c` (пометки перерисовки вместо прямых блитов). Ограничения -> из §0 закрыты: тайлы персистентны, HP/смерть есть, loose обобщён в trob; -> L3-вверх (climb-up в комнату сверху) тоже сделан (`pop_leave_dir = 3`). -> Из §5 остаётся открытым только **переход на следующий уровень через дверь -> уровня** — он вынесен в `levels_plan.md`. -> -> **Документ оставлен как СПРАВОЧНИК**, а не как план: §1 (раскладка -> объектов уровня 1 по комнатам, декод связей кнопка→цель) и §2 (точные -> ссылки на механику SDLPoP) продолжают экономить время при отладке. -> Текущие задачи — `../roomtest/TASKS_OPEN.md`. - -Составлен 2026-07-20. Документ самодостаточный: рассчитан на старт -«с чистого листа» (пустой контекст). Всё сверено с -`applications/PoP/SDLPoP/src/` и данными `res2001.bin`. - -Правило проекта (см. `applications/PoP/CLAUDE.md`): **SDLPoP — источник истины**, -перед кодингом читать соответствующий код seg*.c, не гадать. - ---- - -## 0. КОНТЕКСТ: текущее состояние `applications/PoP/roomtest` (что уже готово) - -roomtest — живой прототип порта PoP: комната 1 уровня 1 живой композицией -тайлов + Kid (анимация/управление/коллизия/падение/зацеп/переходы). Собрать: -`cd applications/PoP/roomtest && make`. Тест в MAME: см. memory -`mame_mcp_bridge`/`mame_hdd_test_disk` (канонический цикл: `make` → пересобрать -`mame/v306/IMG/test_hdd.chd` через `toolchain/make_hdd.sh` со всеми ассетами → -рестарт `run_bridge.sh` → `resume` → ~13с бут → `type_string("d:{ENTER}roomtest.exe{ENTER}")`). -Отладка: клавиши `1`=freeze / `2`=resume в roomtest; MCP-мост `mame-z80` -(read_logical_memory, set_breakpoint, disassemble); адреса символов — -`.sprinter-cc-roomtest/roomtest.map` (сдвигаются при пересборке!). - -### Модули (все в `applications/PoP/roomtest/`) -- `roomtest.c` — главный цикл (дабл-буфер 2 стр.), `enter_room(room)`, - обработчики переходов. File-static рабочие массивы (W2): - `room_fg[30]`, `room_bg[30]`, `lcol_fg/lcol_bg[3]`, `rcol_fg/rcol_bg[3]`, - `below_fg[10]`, `cur_room`. -- `pop_level.c/.h` — **уровень из файла** (Фаза L1): - - `pop_level_load("res2001.bin")` — читает сырой blueprnt в EMM-страницу - (данные с offset `0x100`, ISR-стаб как атлас). - - `pop_room_load(room, fg,bg, lcol_fg,lcol_bg, rcol_fg,rcol_bg, below_fg)` — - извлекает комнату (fg маскирован `&0x1F`, bg raw) + срезы соседей: - leftcol=col9 левого соседа, rightcol=col0 правого, belowrow=row0 нижнего. - - `pop_room_link(room, side)` — связь (side 0=L,1=R,2=U,3=D; 0=нет). - - `pop_level_start_room/pos/dir()`. -- `pop_bg.c/.h` — отрисовка тайлов (порт seg008 draw_tile), fore-окклюзия над - Kid (`pop_fore_over_char`, порт set_char_collision+redraw_at_char/char2), - **loose-полы** (shake/bake/mob). `draw_tile` — статическая, знает - `draw_gate_back` (грань гейта из левой комнаты). -- `pop_kid.c/.h` — анимация Kid (интерпретатор seqtbl `play_seq`, порт seg006), - `Kid` struct (frame,x,y,dir,curr_col,curr_row,action,fall_x,fall_y,repeat, - curr_seq); `knock`-флаг; `kid_cur_dx/flags`, `kid_fp_*` (футпринт). -- `pop_ctrl.c/.h` — ввод (порт seg005 control) через ``. -- `pop_map.c/.h` — коллизия/физика (порт seg005/006). Ключевое: - - `pop_map_set(fg)` — карта текущей комнаты. - - `pop_map_set_edges(l,r,u,d, lcol_fg, rcol_fg)` — связи + кромки швов для - коллизии (`get_tile(col=-1)`=lcol, `get_tile(col=10)`=rcol; порт - find_room_of_tile). - - `pop_phys_tick()` — кадр физики (fall/land/wall/knock/leave). - - Переходы: `pop_fell_out` (вниз, y>=211), `pop_leave_dir` (1=left,2=right, - x∓140). - - **loose-состояние**: `pop_loose_modif[30]` (публично, читает pop_bg), - `loose_bake[30]`, `loose_rest[30]` (static); `pop_loose_tick()`, - `pop_loose_reset()` (сброс при смене комнаты). - -### Что сделано по фазам -- **L1** — данные уровня из файла (room1_data.h удалён). Коммит `21f978d`. -- **L2** — переход в комнату снизу (провал/спуск), фиксы окклюзии. Коммит `7f3e32d`. -- **L3** — переходы вбок (право+лево) через швы. **Не закоммичено** на момент - написания (вместе с этим планом). **L3-вверх (climb-up в комнату сверху) — - НЕ сделано.** -- **Loose-полы** (тряска knock / падение mob+окклюзия) — коммит `8b30dc2`. - -### Известные ОГРАНИЧЕНИЯ (важно для этого плана) -1. **Нет персистентности тайлов**: `enter_room`→`pop_room_load` каждый раз - перезагружает ИСХОДНЫЕ тайлы из level-страницы. Изменения (упавший loose, - открытый гейт) при повторном входе ТЕРЯЮТСЯ. Для кнопок/гейтов это - блокер (см. P0). -2. **Нет HP/смерти** Кида (нужно для пик). -3. Loose-механика — частный случай trob (нужно обобщить). - ---- - -## 1. ДАННЫЕ УРОВНЯ (формат, offsets, объекты) - -Сырой `res2001.bin` (2305 Б) = blueprnt DAT 1.0 (Table 6 в -`POP-DAT-FormatSpecifications.txt`). Читается в EMM-страницу с offset `0x100`. -Тайл-код = байт `& 0x1F`; верхние биты (модификатор BLUETYPE) сейчас отброшены. - -| Блок | Offset | Размер | -|------|--------|--------| -| foretable (fg) | 0 | 720 (24 комн × 30) | -| backtable (bg=modifier) | 720 | 720 | -| **LINKLOC** (doorlink1) | **1440** | 256 | -| **LINKMAP** (doorlink2) | **1696** | 256 | -| links (roomlinks) | 1952 | 96 (24×{L,R,U,D}) | -| start_position | 2112 | 3 (room,pos,dir) | - -Тайл-коды: `0x00`empty `0x01`floor `0x02`**SPIKE** `0x03`pillar `0x04`**GATE** -`0x06`**DROP-кнопка(closer)** `0x0B`loose `0x0F`**RAISE-кнопка(opener)** -`0x10`lvldoor-L `0x11`lvldoor-R `0x13`torch `0x14`wall. - -### Объекты уровня 1 (по комнатам) -``` -room 5: DROP(0,2)m11 RAISE(0,4)m9 GATE(0,5)m2 RAISE(0,6)m8 GATE(0,9)m1 -room 6: RAISE(0,2)m7 SPIKE(2,3) SPIKE(2,4) <-- тестовая -room 7: RAISE(0,2)m6 GATE(0,9)m2 -room 8: RAISE(0,6)m5 GATE(0,9)m2 RAISE(1,7)m4 -room 9: RAISE(0,0)m3 (+ lvldoor(1,3)/(1,4) — выход на level2, отложено) -room12: RAISE(0,3)m2 GATE(0,9)m2 SPIKE(2,4) -room10/13/14/16/19/24: только SPIKE -room20: DROP(1,4)m1 RAISE(1,7)m0 -``` -(m = modifier тайла = ИНДЕКС в LINKLOC/LINKMAP.) - -### Room6 (тестовая) — раскладка -``` -fg row0: 13 01 0F 00 03 01 01 13 01 03 (0,2)=RAISE-кнопка, (0,0)/(0,7)=torch -fg row1: 14 14 14 00 14 14 14 14 14 14 (1,3)=empty -fg row2: 14 14 14 02 02 14 14 14 14 14 (2,3)(2,4)=SPIKE -links: L=8 R=2 U=5 D=0 -``` -- **Шахта пик**: col3 (row0=empty, row1=empty, row2=spike) + col4 (spike). -- **Гейт, видимый у ЛЕВОЙ кромки room6, — это гейт room8 (0,9)**, отрисованный - в col0 room6 через левый шов (L=8, leftcol=col9 room8). В room6 гейта НЕТ. - -### Связь кнопка→цель (декод LINKLOC/LINKMAP), проверено: -- `get_doorlink_tile(i) = d1[i] & 0x1F` -- `get_doorlink_next(i) = !(d1[i] & 0x80)` (0 = конец цепочки) -- `get_doorlink_room(i) = ((d1[i]&0x60)>>5) + ((d2[i]&0xE0)>>3)` -- `get_doorlink_timer(i) = d2[i] & 0x1F` -- где `d1`=LINKLOC@1440, `d2`=LINKMAP@1696. Цепочка: idx++ пока next. - -**Кнопка room6 (0,2) mod=7 → цель: room8 tile(0,9) = ГЕЙТ.** Подтверждено -в SDLPoP-скринах: нажатие кнопки поднимает решётку у левой кромки room6. -Связь КРОСС-КОМНАТНАЯ (кнопка в room6, гейт в room8) и задаётся таблицей, -а НЕ позицией. Кнопка может открывать НЕСКОЛЬКО гейтов в разных комнатах. - ---- - -## 2. МЕХАНИКА SDLPoP (точные ссылки) - -### 2.1 Trob-система (анимируемые тайлы) -- `add_trob(room,tilepos,type)` seg007:0A5A — в список анимируемых. -- Каждый кадр `redraw_needed_tiles`/`process_trobs` продвигает; диспетч по - типу тайла → `animate_button/animate_door/animate_spike/animate_loose` - (seg007:0033+ таблица `animate_*`). -- Состояние тайла хранится в `curr_room_modif[tilepos]` (per-room modifier). -- У нас есть частный случай для loose (`pop_loose_tick`+`pop_loose_modif[30]`). - -### 2.2 Пики (spike) -- **Триггер выдвижения** — `check_spike_below()` seg006:1199 (зовётся в - физике Кида каждый кадр): для каждой колонки футпринта Кида - (`get_tile_div_mod_m7(char_x_left)`..`char_x_right`) идёт ВНИЗ от - `Char.curr_row` через НЕ-floor тайлы; если встретил `tiles_2_spike` → - `start_anim_spike(room,tilepos)`. → Кид у края (0,2) правым краём задевает - col3 → скан вниз col3 (empty/empty/spike) → пики вылезают. -- `start_anim_spike` seg007:596: если `modif<=0`: `modif==0` → add_trob(type1) - + звук; `modif<0` (кроме 0xFF disabled) → `modif=0x8F`. -- `animate_spike` seg007:317: автомат по modif — выдвиг `++modif` (1..4; на 5 → - `0x8F`; на 9 → 0, trob кончился); убирание `& 0x80` → `--modif` (на 0 → `=6`). - `0xFF` = disabled (не двигать). -- `is_spike_harmful` seg007:1178: modif `0/-1`→0 (безопасно); `<0`→1; - `1..4`→2; `>=5`→0. -- **Смерть**: `check_spiked` seg006:0968 — если тайл под Кидом = spike И harmful - И кадр бега (7..14) / старта прыжка (34..39) с harmful>=2, ИЛИ кадр приземления - (43/26) с harmful!=0 → `spiked()`. Падение на пики — отдельный путь (см. - `is_dead` seg006:1907, frame_177_spiked). Осторожный ШАГ по невыдвинутым — ок. - -### 2.3 Кнопки -- `trigger_button(playsound, button_type, modifier)` seg007:0C53: modifier = - индекс LINKLOC. `link_timer = get_doorlink_timer(mod)`; если `!=0x1F` - (не заклинено): `set_doorlink_timer(mod,5)`; если был `<2` → `add_trob` - (кнопка нажимается) + звук; затем `do_trigger_list(mod, button_type)`. -- `do_trigger_list` seg007:09E5: идёт по цепочке LINKLOC от idx, для каждой - цели `trigger_1(target_type,room,tilepos,button_type)` → если >=0 - `add_trob(room,tilepos,result)`. -- `animate_button` seg007:0D3A: `timer=get_doorlink_timer(mod)-1`; - `set_doorlink_timer(mod,timer)`; `timer<2` → кнопка отжимается. -- Когда Кид ВСТАЁТ на кнопку: `check_press`-путь seg006 (opener → trigger_button, - closer → тоже; если Кид мёртв — `died_on_button`). RAISE=`tiles_15_opener` - (0x0F), DROP=`tiles_6_closer` (0x06). - -### 2.4 Гейты -- `trigger_1` seg007:0999 → для `tiles_4_gate` → `trigger_gate`. -- `trigger_gate(room,tilepos,button_type)` seg007:092C: modif = высота открытия. - opener: `0xFF`→игнор; `>=188`(открыт)→держать `238`; иначе `modif=(modif+3)&0xFC`, - return 1 (открывать). closer/иначе: `modif!=0` → return 3 (закрыть быстро). -- `animate_door` seg007:0522: анимация открытия/закрытия; `door_delta[]={-1,4,4}`, - `gate_close_speeds[]={0,0,0,20,40,60,80,100,120}`. Гейт медленно закрывается - после истечения таймера кнопки. -- Отрисовка: кадры гейта; у нас `draw_gate_back` в pop_bg (грань из левой комн.). -- **Проходимость**: Кид блокируется недостаточно открытым гейтом (коллизия - как стена, порог по высоте открытия); проходит при `modif` открытом. - ---- - -## 3. Поправки к описанию пользователя (что важно) - -1. Гейт НЕ в room6 (0,0) — он в **room8 (0,9)**, виден через левый шов; связь - кросс-комнатная (по таблице LINKLOC, не по позиции). -2. Кнопка может открывать несколько гейтов в разных комнатах. -3. Пики выдвигаются по `check_spike_below` (Кид над колонкой с пиками), - имеют состояния (не всегда смертельны), убираются со временем. -4. **Кросс-комнатное состояние тайлов ДОЛЖНО ПЕРСИСТИТЬ** — блокер (см. P0). -5. HP/смерть — новая подсистема. -6. Кнопка сама анимируется (нажата/отжата). - ---- - -## 4. ПЛАН РЕАЛИЗАЦИИ (фазы) - -### P0 — Персистентное per-room modifier-состояние + trob-каркас (ПРЕРЕКВИЗИТ) -**Проблема:** нажатие кнопки в room6 меняет modif гейта room8 (не текущей -комнаты); при входе в room8 нужно отрисовать гейт в текущем состоянии. Плюс -это чинит «re-entry восстанавливает тайлы» (loose/гейты). - -Дизайн (предложение — уточнить в реализации): -- Массив `room_modif[24][30]` (или lazy per-visited-room) — modifier каждого - тайла каждой комнаты. Инициализируется из bg уровня при первой загрузке - комнаты; далее ЖИВЁТ (не перезагружается). ~720 Б — влезает в W2 (или в - EMM-страницу уровня рядом с данными: остаётся >10КБ). -- `enter_room` берёт modif из `room_modif[room]`, а fg — из level-страницы - (fg почти не меняется; исключения — loose→empty, надо тоже персистить: либо - отдельный `room_fg_override`, либо флаг «loose упал»). -- Обобщить loose-trob: единый список trob (room,tilepos,type) + диспетчер - `animate_*` по коду тайла. Loose (`pop_loose_*`) — перевести на него. -- Кросс-комнатный trigger: `add_trob` в НЕ текущую комнату меняет - `room_modif[room][tilepos]`; анимация продвигается даже для невидимой комнаты - (в оригинале — да; можно упростить: для невидимой комнаты гейт сразу в - финальном состоянии, анимировать только при видимости — решить при реализации). - -### Фаза S — Пики (самодостаточно; отладит HP/смерть) -Порядок: -1. `room_modif` для пик (из P0 или временно локально). -2. `check_spike_below` (порт seg006:1199) — в `pop_phys_tick`. -3. `start_anim_spike` + `animate_spike` (порт seg007) — состояние в modif. -4. `is_spike_harmful` + `check_spiked` (порт seg006:0968). -5. **HP/смерть**: ввести `hitp_curr` (старт напр. 3); `take_hp`; при пиках — - мгновенная смерть; seq смерти (`seq_22_crushed`/`frame_177_spiked`..185); - анимация смерти; респавн (kid_init на старте или чек-поинт). -6. Отрисовка: кадры выдвижения пик. В pop_bg есть `SPIKES_FRAM_RIGHT` — нужны - pop-out кадры (spikes_fram по modif) + fore над Кидом. - -### Фаза B — Кнопки + гейты (нужен P0) -Порядок: -1. Доступ к LINKLOC/LINKMAP из pop_level (добавить геттеры doorlink1/2[i] с - маппингом W0 или скопировать таблицы в W2 при load — 512 Б). -2. `pop_map` детект «Кид встал на кнопку» (check_press-путь) → `trigger_button`. -3. `trigger_button` → таймер + `do_trigger_list` (обход цепочки) → - `trigger_gate` для целей → изменить `room_modif[целевой]`. -4. `animate_button` (кнопка отжимается) + `animate_door` (гейт откр/закр + - авто-закрытие). -5. Отрисовка гейта (кадры по modif) через ЛЕВЫЙ шов (гейт room8 в room6) + - при входе в room8. Расширить `draw_gate_back`/добавить `draw_gate`. -6. Коллизия: закрытый гейт = стена (порог по высоте открытия); открытый — - проход. Учесть кросс-комнатный гейт на шве (проход влево room6→room8). - -**Порядок фаз:** P0 → S → B. S в основном независим (кроме HP/trob-каркаса), -но проще и отладит смерть/анимацию; B требует P0 (кросс-комнатное состояние). - ---- - -## 5. Открытые вопросы / грабли -- Персистентность `fg` для loose (тайл→empty): решить в P0 (override-массив или - флаг), иначе упавший loose «вернётся». -- Анимация trob в НЕВИДИМОЙ комнате: упростить (финальное состояние сразу) или - портировать честно. -- Двоебуфер: любой транзиент (пики/гейт/кнопка) финализировать перерисовкой - «покоя» на ОБЕИХ страницах (урок из loose — см. memory `pop_loose_floors`). -- Дверь уровня (lvldoor room9) + переход на level 2 — ОТДЕЛЬНО, отложено. -- L3-**вверх** (climb-up в комнату сверху) — ещё не сделан; можно закрыть до - объектов или параллельно. diff --git a/applications/PoP/docs/host_tests_plan.md b/applications/PoP/docs/host_tests_plan.md deleted file mode 100644 index f356e6c..0000000 --- a/applications/PoP/docs/host_tests_plan.md +++ /dev/null @@ -1,142 +0,0 @@ -# План: модульные тесты движка roomtest под ucsim_z80 - -Обвязка общая — `testkit/` в корне репозитория (там же объяснение, почему -прогон именно под z80, а не хостовым gcc). Наборы лежат в -`../roomtest/tests-host/`. - -Задача плана: **перестать чинить одно и то же дважды**. За два прогона -уровня 1 (2026-08-03) закрыто восемь корней, и часть из них — регрессии -соседней механики, внесённые предыдущим фиксом. Такие вещи ловятся тестом -за миллисекунды, а в MAME — часами ручного вождения Кида. - -## Что уже есть - -| набор | модуль | статус | -|-------|--------|--------| -| `t_geom` | `pop_geom.c` | 39 проверок, включая побитовую сверку asm-LCG с 32-битной формулой на 128 шагах | - -`pop_geom.c` выбран первым, потому что не тянет ничего за собой. Дальше -начинаются швы. - -## Фаза 1. Два шва (блокирует всё остальное) - -### 1.1 Доступ к странице уровня - -`pop_level.c` ходит по абсолютным адресам: `gfx_w0_map(lvl_page)`, затем -разыменование `(uint8_t *)(LVL_DATA_OFF + …)`. В тестовом бинаре это -обращение в никуда. - -Нужен макрос `W0PTR(off)`: - -- на таргете — `((uint8_t *)(off))`, то есть ровно как сейчас; -- в тестах — смещение в обычном массиве-подложке. - -Правка механическая и компайл-таймовая, на размер продукта не влияет. -Заодно снимает магию абсолютных констант из тела функций. - -Тестовая подложка должна уметь: загрузить синтетическую комнату (10×3 -байта fg + mod) и целый синтетический уровень на 24 комнаты, чтобы -проверять межкомнатные вещи. - -### 1.2 Журналирующий рендерер - -Вместо `pop_bg.c`/`pop_cdraw.c` в тестовый бинарь линкуется модуль с теми -же прототипами, который **не рисует, а записывает вызовы**: какой тайл -помечен к перерисовке, каким кодом, с каким счётчиком страниц. - -Это не обход проблемы, а самостоятельная ценность: `BUG-GATE-ANIM-1` был -ровно такой формы — ворота меняли состояние, но пометка на перерисовку не -ставилась. Проверяется утверждением, а не глазами. - -Минимум, который надо перехватывать: `pop_set_redraw`, -`pop_set_redraw_above`, `pop_loose_mob_spawn`, `pop_gate_redraw`. - -## Фаза 2. Регрессионные кейсы из `BUGS_CLOSED.md` - -После швов `BUGS_CLOSED.md` превращается в готовую спецификацию: у каждой -записи есть симптом и ожидаемое поведение. Кандидаты, которые ловятся -логикой (без отрисовки и без железа): - -| баг | что закрепить тестом | -|-----|----------------------| -| `BUG-LVLSTATE-1` | запись тайла переживает выход из комнаты | -| `BUG-RESPAWN-1` | рестарт уровня возвращает ВСЕ тайлы из эталонной копии | -| `BUG-RESPAWN-2` | рестарт возвращает таблицу стражей; убитый снова жив | -| `BUG-GATE-ANIM-1` | смена состояния ворот ставит пометку `POP_RD_GATE`; закрывающиеся — на обе страницы, открывающиеся — на одну | -| `BUG-COLL-1` | `check_collisions` сканирует ряд справа налево и выбирает НАИМЕНЬШУЮ занятую колонку | -| `BUG-STANDUP-1` | `bumped_floor` у трупа (`alive >= 0`) только выравнивает и не трогает последовательность | -| `BUG-DEATH-1` | `hitp_curr == 0` при живом Киде переводит его в «умирает» ровно один раз | -| `BUG-LOOSE-2` | кусок, начавший падать, долетает и кладёт щебень ПОСЛЕ смены комнаты | -| `BUG-CEIL-2` | loose-плита ряда 2 верхнего соседа живёт как «ряд −1» | - -`BUG-LOOSE-2` стоит взять первым: он до сих пор помечен в `BUGS_OPEN.md` -как непроверенный именно потому, что гонку «уйти из комнаты раньше, чем -долетит плита» через мост MAME воспроизвести не удалось. На уровне логики -это несколько строк — заспавнить кусок, сменить комнату, тикать до -приземления, проверить щебень в данных уровня. - -Не берутся (нужна картинка либо железо): `BUG-DOOR-CLIP`, `BUG-CEIL-1`, -`BUG-CEIL-3`, `BUG-OCCL-1`, `BUG-KBD-4`, `BUG-3`. - -## Фаза 3. Сценарные тесты - -Сейчас шаг кадра размазан по `main()` в `roomtest.c`. Вынести его в -`pop_frame_tick()` — тогда появляются тесты вида «поставить Кида в -известное состояние, скормить N тиков ввода, проверить итог»: - -``` -дано: комната 5, Кид на кнопке (0,6) -когда: 40 тиков без ввода -тогда: комната по-прежнему 5, Кид на полу ряда 2 -``` - -Это тот самый BUG-STANDUP-1, который ловили потиковой трассой в MAME. - -Ввод подаётся не через `kbd_raw_down()`, а через подменяемый источник — -это же даст возможность проигрывать записанные сценарии. - -## Фаза 4. Дифф против SDLPoP - -`SDLPoP/src/` лежит в дереве, собирается на хосте, и там **уже стоят -отладочные трассы** (`DBG kidobj tilepos=…` в seg008, `DBG make_loose_fall` -в seg007). Значит эталон можно заставить печатать потиковую трассу -автоматически. - -Схема: общий формат скрипта ввода и общий формат трассы (тик, frame, x, y, -room, col, row, action, alive, hp). Гоняем обе реализации, диффим, первое -расхождение — номер тика и есть баг. Это ровно то, что делалось руками -через MAME, только бесплатно и повторяемо: `BUG-COLL-1` и `BUG-STANDUP-1` -такой дифф нашёл бы за секунды. - -**Лицензия.** SDLPoP — GPLv3, правило подпроекта — читать и переписывать, -не линковать. Оракул обязан быть **отдельным исполняемым файлом**, -общающимся через файлы трасс, а не слинкованным с нашим кодом в один -бинарь. - -Требование к детерминизму: сиды PRNG должны совпадать. У нас -`POP_PRANDOM_EXACT` даёт ту же последовательность, что в оригинале, и это -уже закреплено тестом `geom_lcg_matches_reference`. - -## Чего эти тесты не поймают - -Отрисовку, банки и W-окна, тайминги, клавиатуру — за этим остаётся MAME. - -И отдельный класс: **баги порядка вызовов**. Свежий пример — окно -fore-клипа (`pop_fore_set_clip`) одно на всех, и его ставит каждый, кто -рисует персонажа; когда порядок «Кид/страж» стал переменным, окно осталось -стражьим, и Кид нарисовался поверх передних столбов. Это не «функция -вернула не то», unit-тест такое не видит. Ловится инвариантом, -вкомпилированным в safe-сборку: «в момент `pop_fore_over_char` окно клипа -принадлежит Киду». Отдельный инструмент, дополняющий тесты. - -## Порядок работ - -1. Шов `W0PTR` + подложка уровня. -2. Журналирующий рендерер. -3. `BUG-LOOSE-2` — закрыть висящий вопрос. -4. Остальные кейсы из таблицы фазы 2. -5. `pop_frame_tick()` + сценарные тесты. -6. Дифф против SDLPoP. - -Правило приёмки: тест не считается написанным, пока не проверен мутацией — -сломать проверяемое место и убедиться, что набор краснеет. diff --git a/applications/PoP/docs/ideas_backlog.md b/applications/PoP/docs/ideas_backlog.md deleted file mode 100644 index 87a0878..0000000 --- a/applications/PoP/docs/ideas_backlog.md +++ /dev/null @@ -1,91 +0,0 @@ -# Идеи и вопросы «на подумать» (PoP) - -Не план работ, а список того, что осознанно отложено: каждая запись — -гипотеза с причиной, по которой её стоит проверить, и с тем, что мешает -сделать это прямо сейчас. - -## Зелье «переворот экрана» (upside-down) - -**Вопрос пользователя (2026-08-01).** Тайлы фона у нас лежат строками, а -кадры Кида/стражей — КОЛОНКАМИ (`transpose_cols` в `pop_pack_kid.py`, ради -бесплатного горизонтального зеркала). Значит вертикальный переворот для -персонажей заметно сложнее, чем для фона. Верно; но прежде чем это чинить, -надо знать три факта. - -**Факт 1 — когда оно вообще нужно.** Зелье переворота — тип 4 -(`proc_get_object`, `seg006.c:1885` → `toggle_upside()`). Скан всех уровней -по данным (`res200N.bin`, тайл 10 = зелье, тип в backtable): тип 4 -встречается **впервые на уровне 9** (две склянки), и больше нигде. Тип 3 -(перо, медленное падение) — уровень 7. То есть **до уровня 9 механика не -нужна вообще**, и «на первом этапе просто не реализовывать» — не компромисс, -а точное соответствие данным уровней 1..8. - -**Факт 2 — что именно делает оригинал.** НЕ переворачивает спрайты. -`flip_screen` (`seg009.c:1042`) → `flip_not_ega` (`seg009.c:1023`) меняет -местами СТРОКИ готового offscreen-буфера (top↔bottom, порядок пикселей -внутри строки не трогает — это вертикальное зеркало, не поворот на 180°). -Вызывается вокруг отрисовки кадра целиком (`seg003.c:296..301`): перевернул -буфер → дорисовал → перевернул обратно. Так что в оригинале это -post-process всего экрана, и вопрос «как перевернуть колоночный спрайт» -там просто не возникает. - -**Факт 3 — почему нам этот приём не подходит как есть.** У нас нет шага -«готовый offscreen → экран»: рисуем прямо в видеостраницу, а heal берёт фон -из ОЗУ-копии этой же страницы. Переворот всей страницы построчно — это -320×192 Б копирования КАЖДЫЙ кадр, что мимо бюджета на порядок. - -**Варианты, которые надо будет взвесить (не сейчас):** -1. **Предпечённые перевёрнутые атласы.** Второй набор кадров - Кида/стража, перевёрнутый по вертикали ещё в `pop_pack_kid.py` (там уже - есть транспонирование — добавляется одной строкой). Рантайм: выбор - набора + зеркальная арифметика Y. Память: ещё ~28 страниц EMM при - бюджете ~3.3 МБ — не проблема. Похоже, самый дешёвый по тактам путь. -2. **Фон рисовать с обратным Y** — для row-major тайлов строка остаётся - непрерывным accel-прогоном, меняется только адрес назначения; цена — - вызов на строку вместо вызова на тайл. Померить, прежде чем закладывать. -3. **Аппаратная помощь** — до проектирования проверить, есть ли у - акселератора направление копирования «вниз» (обратный инкремент адреса); - если есть, вариант 1 может и не понадобиться. Смотреть - `docs/new/06-accel.md` и `docs/reference/accel_r.txt`. - -**Почему не сейчас.** Уровни 1..8 этого не требуют, а к уровню 9 у нас уже -будет ответ на вопрос «сколько стоит кадр» (задачи CLIP-1/T-2) — без него -выбирать между вариантами выше бессмысленно. - -## Заменить генератор псевдослучайных чисел - -Сейчас стоит LCG оригинала, шаг на ассемблере (~1 020 тактов), бит-в-бит -совместимый с SDLPoP. Есть более дешёвые Z80-генераторы (86–148 тактов), -но потолок выигрыша — 2 814 тактов за кадр, 0.65 %, и он растворяется в -обёртках вызова. Тексты процедур, разбор качества и порядок действий — -`prng_alternatives.md`. Первый шаг там не про генератор: слить приведение -к диапазону в ту же asm-процедуру, чтобы на вызов был один `call`, а не три. - -## Отключать мышь на время игры - -**Гипотеза.** Мышь на Sprinter — источник прерываний (обёртки RST 30h, -см. memory `mouse_api`). Игре она не нужна вообще: управление — -raw-клавиатура (``), которую мы и так забираем у DSS целиком. -Значит каждое мышиное прерывание за кадр — украденные такты в бюджете, -который у нас и без того занят на 86 %. - -**Откуда взялось (2026-07-30).** При замере бюджета по 100 кадрам три -кадра выбились до 552–647 К тактов (1.28–1.51 кадра) при типичных 371 К. -Причиной оказалось движение мыши на ХОСТЕ: при неподвижной мыши 225 -кадров подряд прошли без единого превышения. То есть эффект реальный и -измеримый, просто в тесте он был наведён извне. - -**Что проверить.** -1. Есть ли у драйвера мыши (RST 30h) функция «выключить/включить» — - разобрать список из 14 обёрток; если нет явной, посмотреть, что делает - «hide cursor» и снимает ли она обработчик. -2. Сколько тактов реально стоит одно мышиное прерывание на нашем железе - (замер: breakpoint на входе ISR + totalcycles, при движении мыши). -3. Не ломает ли отключение выход в DSS: состояние обязано - восстанавливаться при `exit`, включая аварийный (atexit). - -**Почему не сейчас.** Выигрыш проявляется только когда игрок реально -двигает мышью, то есть в норме его нет; а риск оставить систему без мыши -после выхода — заметный. Делать после того, как закроем стражей и -займёмся бюджетом всерьёз (там же, где батчинг кроссбанковых вызовов и -возможный возврат `pop_bg` в резидент `--w3`). diff --git a/applications/PoP/docs/impl_diff.md b/applications/PoP/docs/impl_diff.md deleted file mode 100644 index 09099c6..0000000 --- a/applications/PoP/docs/impl_diff.md +++ /dev/null @@ -1,649 +0,0 @@ -# Осознанные расхождения с SDLPoP - -Правило подпроекта (`../CLAUDE.md`): расхождение нашей реализации с -`SDLPoP/src/` — по умолчанию **баг у нас**. Этот файл — список исключений: -мест, где мы сознательно сделали иначе, потому что платформа/ABI/бюджет -кадра требуют другого, а НАБЛЮДАЕМОЕ поведение обязано совпадать. - -Формат записи: что делает оригинал → что делаем мы → почему → чем платим и -что проверять при регрессе. Если запись перестала быть верной (портировали -дословно, отказались от обхода) — удалять, а не оставлять «для истории»: -история в git. - ---- - -## D-1. История флагов перекрытия у бокового шва: сдвиг вместо тега комнаты - -**Файлы:** `roomtest/pop_map.c` (`pop_coll_shift`, `pop_coll_invalidate`, -`check_collisions`), `roomtest/roomtest.c` (`enter_room_side`). -**Связанный баг:** BUG-GATE-PASS-1 (`roomtest/BUGS_CLOSED.md`). -**Дата:** 2026-08-09. - -### Как в оригинале - -`check_collisions` (seg004:0004) вместе с `get_row_collision_data` -(seg004:0185) держит **10 слотов** флагов перекрытия и рядом — -**параллельный массив номера комнаты**: - -```c -row_coll_flags_ptr[tile_col] = curr_flags; /* tile_col — колонка ВНУТРИ разрешённой комнаты (0..9) */ -row_coll_room_ptr [tile_col] = curr_room; /* и номер этой комнаты */ -... -for (short column = 9; column >= 0; --column) { - if (curr_row_coll_room[column] >= 0 && - prev_coll_room[column] == curr_row_coll_room[column]) { - if ((prev_coll_flags[column] & 0x0F) == 0 && - (curr_row_coll_flags[column] & 0x0F) != 0) - bump_col_left_of_wall = column; - ... -``` - -Ключ слота — пара **(колонка в своей комнате, номер комнаты)**. Решётка -комнаты 8 и до перехода 8→6, и после лежит в слоте 9 с `room = 8`: история -переживает смену комнаты, переход флага 0→1 виден, `bumped()` срабатывает. -Комнату оригинал резолвит на лету через `find_room_of_tile` (seg006:005D), -никакого кэша всех комнат у него нет. - -### Что делаем мы - -Индекс — **колонка ОТРИСОВАННОЙ комнаты**, диапазон −2…11 (14 слотов, -`COLL_C0`/`COLL_N`/`COLL_IDX`), номер комнаты рядом не хранится. При смене -комнаты тот же физический тайл менял бы слот на ±10, поэтому раньше история -просто выбрасывалась (`pop_coll_invalidate` → `prev = 3` = «уже -перекрывал» → бампа нет). Именно это и был BUG-GATE-PASS-1. - -Теперь при **боковом** переходе история не выбрасывается, а -**перенумеровывается**: `pop_coll_shift(∓10)` сдвигает `coll_curr`, -`coll_above`, `coll_below` на 10 слотов и заполняет освободившиеся -тройками. `enter_room_side` зовёт её сразу после `pop_map_set_edges`. - -Корректность держится на том, что `check_leave` двигает `Char.x` ровно на -∓140 = 10 тайлов по 14 px, и координата грани (`pop_x_bump[col + …]`) -сдвигается на те же 140 вместе с габаритом Кида, — **сами флаги -инвариантны**, меняется только номер слота. Сдвигаются `curr/above/below`, -а не `prev`: `prev` на следующем кадре всё равно перезапишет -`move_coll_to_prev`, выбирая источник как раз из этих трёх. - -Переходы **вверх/вниз** и все прочие входы в комнату (старт уровня, -респавн, чит-навигация) остаются на полной инвалидации: там колонки не -сдвигаются, но тайлы под ними принадлежат другой комнате — история -действительно недействительна. - -### Почему не дословно (вариант A) - -Дословный порт — 10 слотов + параллельный массив номера комнаты, индекс по -колонке разрешённой комнаты, бамп только при совпадении номеров; тогда -`pop_coll_invalidate` не нужен вовсе, история сама «не совпадает» там, где -колонка сменила комнату. - -Не взяли по одной причине: **десяти слотов нам не хватит**. Оригинал -перебирает узкое окно вокруг Кида (от `col(char_x_left_coll) − 1` до -`col(char_x_right_coll) + 2`), поэтому коллизии слотов у него практически -не случаются. Мы держим четырнадцать колонок (−2…11) — при узком окне это -не мешает, а вот в десять слотов колонки −2/−1 и 8/9 сядут поверх 8/9. - -**Окно перебора с 2026-08-09 у нас такое же, как в оригинале** (было: все -четырнадцать колонок каждый кадр). Признак годности слота при этом не -массив номеров комнат, как у оригинала, а ГРАНИЦЫ окна — четыре байта, -которые `move_coll_to_prev` переносит в `prev` вместе с флагами; сравнение -идёт по пересечению двух окон. Очистки массивов нет вовсе, то есть это -дешевле оригинала, а смысл тот же (у него слот вне окна помечен -`row_coll_room = −1` и в цикл бампа не попадает). `check_chomped_flags` -тоже ограничен окном — иначе протухшие слоты дали бы фантомный перемол. - -### Чем платим - -- Расхождение структур: если в будущем понадобится знать, из какой комнаты - пришёл тайл конкретного слота, этого у нас нет — придётся идти в вариант A. -- Границы окна надо переносить везде, где переносятся флаги: `pop_coll_shift` - двигает и их, `move_coll_to_prev` снимает их в `prev`. Забыть один из - переносов = молча потерять или, наоборот, разрешить лишний бамп. -- Сдвиг работает только для чисто горизонтальных переходов на ровно 10 - колонок. Любая будущая диагональ/иная ширина комнаты его сломает молча. -- `coll_last_row`: `pop_coll_invalidate` прячет прошлый ряд, чтобы - `pop_coll_shift` мог отменить инвалидацию. Порядок вызовов в - `enter_room_side` (сначала `pop_map_set_edges`, потом `pop_coll_shift`) - стал значимым. - -### Что проверять при регрессе - -Это сердце коллизии, вокруг которого разбирался BUG-SEAM-PINGPONG. После -любой правки здесь — прогон швов: - -1. Уровень 1, комнаты 6 ↔ 8, закрытая решётка, **обе** стороны. -2. Оба режима подхода: мелким шагом (упереться) и с разбега (не пройти - насквозь). -3. Проверить, что пинг-понг у шва не вернулся (экран не перескакивает - туда-сюда на кадре бампа о ворота). -4. `make -C roomtest/tests-host` — наборы `t_wall`/`t_char` ходят по этой же - геометрии. - ---- - -## D-2. Кнопка в шве: перерисовываем, хотя оригинал не перерисовывает - -### Что делает оригинал - -Тайл-«трансформер» (кнопка, ворота, пика) перерисовывается только если он в -ОТРИСОВАННОЙ комнате: `redraw_11h` → `redraw_tile_height` → -`get_trob_pos_in_drawn_room` (seg007:0258), а та для `trob.room != drawn_room` -возвращает 30 — заведомо несуществующий tilepos, то есть «не рисовать». -Исключение сделано ровно одно — факелы (`animate_torch`, seg007:03CF, ветка -`trob.room == room_L && tilepos % 10 == 9`). - -Кнопка соседа слева при этом ВЛИЯЕТ на картинку: `get_tile_to_draw` -(seg008:253) подменяет нажатый `tiles_15_opener` на `tiles_1_floor`, а -`load_leftroom` (seg008:360) кладёт результат в `leftroom_[row]`, откуда он -приходит в `draw_tile` как `tile_left`. У пола правая грань есть, у кнопки -нет — значит в оригинале нажатие кнопки, видимой через левый шов, меняет -картинку только при следующей ПОЛНОЙ отрисовке комнаты. - -### Что делаем мы - -Перерисовываем шов сразу: `seam_row_sig` (roomtest.c) подмешивает в сигнатуру -ряда бит «кнопка нажата» (`pop_doorlink2(mod) & 0x1F > 1`) для тайлов -`0x0F`/`0x06`, и change-driven редрой `pop_room_redraw_seam_left` срабатывает -на нём так же, как на openness ворот. - -### Почему - -Голый порт давал видимый залип (SEAM-BUTTON-STALE, roomtest/BUGS_CLOSED.md): кнопка -(1,9) комнаты 11 — она же (1,−1) комнаты 24 — оставалась нарисованной в том -состоянии, в каком была на входе в комнату, хотя связь срабатывала. Сигнатура -шва следила только за `room_modif`, а у кнопки `modif` — это ИНДЕКС LINKLOC, -константа уровня: нажатие живёт в `doorlinks2` и в сигнатуру не приходило -никогда. Добавить кнопку в сигнатуру — те же три сравнения на кадр, что уже -делались для ворот; воспроизводить артефакт оригинала смысла нет. - -### Чем платим - -- Резидент +200 Б (`_CODE` 24 739 → 24 939), куча W2 1795 → 1595 Б. Если - станет тесно — `seam_row_sig` переносится в банк 7 к - `pop_room_redraw_seam_left`, ценой одного трамплина на кадр. -- Сигнатура ряда стала разнотипной: для кнопки это булев бит, для остальных - тайлов — modif. Значения между собой не сравниваются (сравнивается только - ряд сам с собой), но при добавлении нового типа тайла в шов про это надо - помнить. - -### Что проверять при регрессе - -Уровень 5, кнопка нижних ворот комнаты 24 (она же (1,9) комнаты 11), оба -направления: нажать её из комнаты 11 и войти в 24; и наоборот — войти в 24 -поверху и наступить на неё, стоя в шве. Картинка кнопки обязана совпадать -со статусом ворот в обоих случаях. - ---- - -## Перо (медленное падение) ловит ТОЛЬКО Кида - -**Оригинал** (`fall_accel`, seg006:057C): `is_feather_fall` — глобальный флаг, -и медленное падение достаётся ЛЮБОМУ персонажу, который окажется в `Char`, -пока эффект жив. То есть страж, сошедший с уступа в те же секунды, парит -вместе с Кидом, хотя зелье пил не он. SDLPoP считает это багом и чинит -опцией `fix_feather_fall_affects_guards`. - -**Мы** берём поведение С ФИКСОМ: `pop_feather` проверяется вместе с -`Char.charid == CHARID_0_KID` — и в `fall_accel` (`pop_map.c`), и в опкоде -`JMP_IF_FEATHER` интерпретатора seqtbl (`pop_kid.c`), чтобы физика и анимация -не разъехались. - -**Чем платим.** Сцена, где страж падает при живом пере, будет выглядеть иначе, -чем в DOS-оригинале (у нас он падает нормально, там — парит). На уровне 7, -единственном с этим зельем, такой сцены нет: зелье в комнате 1, стражи — в -других комнатах. - -**Что проверять при регрессе.** Уровень 7: выпить зелье в комнате 1, тут же -столкнуть стража в провал — он обязан падать БЫСТРО, а Кид рядом — медленно. - ---- - -## Синее зелье («−HP») не ставит свою вспышку - -**Оригинал** (`proc_get_object`, seg006:1892): ветка `case 5` только глушит -звуки, играет `sound_13_kid_hurt` и ставит `hitp_delta`. Экран краснеет не -здесь, а общим механизмом «Кид ранен» (`flash_if_hurt`, seg003:0AFC). - -**Мы** раньше ставили в этой ветке ещё и `pop_flash_*` (красную вспышку на 2 -кадра) — то есть красили экран дважды: своей вспышкой и кадром урона. -Приведено к оригиналу: ветка правит только `hitp_delta`, краснеет `pop_kid_hurt`. - -**Что проверять при регрессе.** Уровень 2, комната 13, зелье `(1,3)`: выпить — -HP убавляется на единицу, экран краснеет РОВНО один раз (без двойного строба). - ---- - -## Переворот (зелье инверсии) применяется НА ГРАНИЦЕ КАДРА, а не мгновенно - -**Оригинал** (`toggle_upside`, seg000:15E9): `upside_down = ~upside_down` и -`need_redraw_because_flipped = 1` — флаг переключается прямо в момент глотка, -то есть в середине кадра. Оригиналу это ничего не стоит: он ВСЕГДА рисует в -offscreen неперевёрнутым, а зеркалит только при выводе на экран -(`flip_screen` вокруг `copy_screen_rect`, seg000:939/946). Внутренние -координаты у него от переворота не зависят вообще. - -**Мы** offscreen-буфера не имеем (две видеостраницы + теневая ОЗУ-копия на -каждую), поэтому рисуем зеркально сразу — переворот «зашит» в координаты -каждого слоя. Из-за этого момент переключения важен: зелье выпивается из -`play_seq`, то есть в СЕРЕДИНЕ кадра, и остаток кадра рисовался бы уже -зеркально поверх ещё неперевёрнутого фона. Хуже всего пламя факела — оно -ЗАПЕКАЕТСЯ в ОЗУ-копию (`pop_torch_draw`, у него нет heal: каждый следующий -кадр непрозрачно накрывает предыдущий). Кадр пламени, положенный в -зеркальную позицию на старом фоне, оставался там навсегда — по комнате -рассыпались лишние языки огня. - -Поэтому у нас два флага: `pop_upside_want` (пишут зелье, смерть Кида, чит U) -и `pop_upside` (читают все слои отрисовки). Переключение — ровно одно место, -начало кадра, вместе с перерисовкой: главный цикл делает -`pop_upside = pop_upside_want` и зовёт `pop_flip_screen`. - -Сама перерисовка при этом СОВПАДАЕТ с оригиналом: там на -`need_redraw_because_flipped` вызывается `redraw_screen(0)` — полная -отрисовка, а не отражение уже нарисованного. У нас то же самое — -`pop_flip_screen` рисует комнату заново (и получает чистый фон по -построению), а вторую страницу дабл-буфера отдаёт копией акселератора. - -**Что проверять при регрессе.** Уровень 9: выпить зелёное зелье — картинка -переворачивается ровно один раз, лишних языков пламени по комнате нет. Чит -U даёт тот же результат (он идёт тем же путём). - ---- - -## Окклюзия воротами: спрашиваем про рисуемого персонажа, а не жёстко про Кида - -**Оригинал** (`draw_tile_fore`, seg008:0D15) первой строкой: - -```c -if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - Kid.curr_col == drawn_col - 1 && Kid.room != room_R) - draw_gate_fore(); -``` - -То есть бары ворот попадают в foretable — поверх всего нарисованного — когда -на тайле ворот стоит **именно Кид**. Это следствие устройства оригинала: -foretable ОДНА на весь проход тайлов, персонажи в неё уже добавлены, и -отдельного «переднего слоя на персонажа» там нет. - -**Мы** ради скорости не рисуем foretable целиком, а возвращаем куски тайлов -поверх ТОЛЬКО в прямоугольнике персонажа (`pop_fore_over_char`, см. memory -`pop_fore_layer_cost`: полный проход стоил 78 % кадра). Проход идёт по -персонажу, значит и вопрос естественно задавать про него — -`pop_gate_over_char(ch)`, а не про глобального `Kid`. - -**Чем платим.** Наш вариант — надмножество оригинального: страж (или тень), -стоящий в проёме ворот, у нас уходит ЗА решётку, а в оригинале остался бы -нарисованным поверх неё, пока на том же тайле нет Кида. Визуально это -правильнее, но формально расхождение. Обратной разницы нет: во всех случаях, -где оригинал рисует бары поверх, рисуем и мы. - -**Что проверять при регрессе.** Уровень 10, комната 7, тайл (2,6): Кид, -стоящий в проёме ворот, виден ЗА прутьями. Решение покрыто хост-тестами -(`tests-host/t_char.c`, набор `char_gate_*`) — отрисовка в харнесс не -линкуется, поэтому проверяется предикат. - ---- - -## Тень рисуется спрайтами КИДА, а не XOR-силуэтом - -**Файлы:** `roomtest/pop_cdraw.c` (выбор набора атласов по `charid`/`frame`). -**Дата:** 2026-08-18 (решение принималось раньше, записано здесь). - -**Оригинал** рисует тень тем же кадром Кида, но ДВАЖДЫ — вторым проходом со -сдвигом на один пиксель и через XOR. Получается тёмный силуэт с контуром, -а не «второй Кид». - -**Мы** рисуем тень обычными спрайтами Кида, обычным блиттером — она выглядит -как Кид. - -**Почему.** Приём оригинала — read-modify-write по уже нарисованному, а -читать данные из ВИДЕО-ОЗУ (там, где спрайты) на Sprinter нельзя: читается -только ОЗУ-копия. Блочный XOR у акселератора есть и работает как раз по -ОЗУ-копии, но с нашей прозрачностью он несовместим: прозрачность сделана -подавлением записи 0xFF, а XOR прозрачные пиксели тоже смешает — под него -нужен набор с прозрачным 0x00 (замер: memory `accel_block_ops`, -`sprinter_vram_transparency`). То есть «сделать как в оригинале» всё равно -упирается в отдельный набор спрайтов. - -**Чем платим.** Тень визуально неотличима от Кида (уровни 4/5/6/12). На -механику не влияет: слот, окна `Char`, ИИ и коллизия у тени свои и от -картинки не зависят. - -**План.** Отдельный АТЛАС ТЕНИ (готовый силуэт), а не воспроизведение -XOR-прохода: один набор спрайтов вместо второго пути блита. До тех пор -расхождение сознательное — багом не заводить. - -**Что проверять при регрессе.** Уровень 6 комната 1: тень стоит слева -через провал, поза совпадает с позой Кида-в-стойке. Родственная запись — -«Слияние с тенью» ниже. - ---- - -## Слияние с тенью: мигания Кида спрайтами тени нет - -**Файлы:** `roomtest/guards.c` (`autocontrol_shadow_level12`), -`roomtest/pop_cdraw.c`. -**Дата:** 2026-08-13. - -**Оригинал** (`draw_objtable_item`, seg008:20CA) во время вспышки слияния -(`united_with_shadow` считает 42 → 0) рисует КИДА как тень на чётных -значениях счётчика: тот же кадр уходит не обычным прозрачным блиттером, а -парой OR+XOR со сдвигом на пиксель. Получается мерцание «Кид/тень» -примерно полторы секунды. - -**Мы** рисуем всё это время обычного Кида, а само событие обозначаем белой -вспышкой фона (`pop_flash_color = POP_FLASH_WHITE`, 18 кадров) — она в -оригинале тоже есть и ставится тем же кодом. - -**Почему.** У нас Кид и соперник рисуются из РАЗНЫХ атласов своими -палитрами (`pop_cdraw.c`), а «тень» — это персонаж слота Guard с палитрой -комнаты; блиттеров OR/XOR в libbgi нет вовсе, прозрачность сделана -0xFF-подавлением записи. Воспроизвести эффект — значит завести Киду второй -набор спрайтов и второй путь блита ради 42 кадров за всю игру. - -**Чем платим.** Момент слияния читается только по вспышке и по тому, что -тень исчезла, — без «двоящегося» силуэта. На механику не влияет: счётчик -`pop_united_shadow` тикает и уходит в −1 независимо от отрисовки, а от него -зависят и повторный подъём тени, и появление плит в комнатах 2/13. - -**Что проверять при регрессе.** Уровень 12: после слияния экран белеет, -соперник пропал, HP-потолок вырос на единицу, тень в комнате 15 больше не -появляется. Логика покрыта `tests-host/t_shadow.c`. - ---- - -## Отложенный старт падающих плит (уровень 13): фаза 0 у нас «не анимируется» - -**Файлы:** `roomtest/pop_map.c` (`pop_check_fall_flo`, `pop_loose_tick`), -`roomtest/pop_trob.c` (`animate_loose`). -**Дата:** 2026-08-13. - -**Оригинал** (`check_fall_flo`, seg000:1317) раздаёт шести плитам ряда 2 -верхней комнаты модификатор `−(prandom(0xFF) & 0x0F)`, то есть 0..−15, и -заводит на каждую trob. Фаза считает вверх, проходит ноль и дальше идёт -обычным отсчётом до провала — плита падает через `n + 11` кадров. Ноль там -безопасен: плиту держит в игре СПИСОК trob, а не значение модификатора. - -**Мы** списка trob для loose текущей комнаты не держим — плита анимируется -ровно тогда, когда её фаза не ноль (`pop_loose_modif[pos] != 0`). Значит -счёт, дойдя до нуля, оборвался бы навсегда. Компенсируем двумя правками, -которые работают только в паре: - -* тик перескакивает ноль (`if (m == 0) m = 1`); -* стартовое значение берётся на единицу «отрицательнее» (`−n−1`). - -**Чем платим.** Ничем в наблюдаемом поведении: суммарная задержка остаётся -`n + 11` кадров, проверено арифметикой на обоих концах диапазона (n = 0 и -n = 15). Платим связностью — две правки в разных функциях, и убрать любую -одну нельзя. - -**Что проверять при регрессе.** Уровень 13, вход в комнату 23 (она же -стартовая): плиты сверху сыплются ВРАЗНОБОЙ, а не разом и не «никогда». -Логика покрыта `tests-host/t_jaffar.c` -(`jaffar_negative_phase_counts_through_to_fall` и парный контроль на другом -уровне). - ---- - -## Чит навигации по комнатам не запускает бесшовный переход уровня - -**Файлы:** `roomtest/roomtest_cold.c` (`pop_dbg_roomnav`), `roomtest/roomtest.c`, -`roomtest/pop_state.c` (`pop_nav_hold`). -**Дата:** 2026-08-13. - -**Оригинал** (`play_level_2`, seg000:0900) проверяет `Kid.room == 23` КАЖДЫЙ -кадр: уровень 12 кончается самим фактом присутствия Кида в комнате 23, двери -у него нет. Никакого «как он туда попал» там нет и быть не может — -телепорта между комнатами в игре 1989 года не существует. - -**Мы** держим этот триггер, пока Кид попал в комнату ЧИТОМ навигации -(`+`/`−`), и отпускаем на первой же смене комнаты обычным ходом. - -**Почему.** Чит перебирает комнаты ПО НОМЕРУ (1..24 с обёрткой), то есть -любой обход уровня 12 неизбежно наступает на 23-ю — и уровень молча -становится 13-м. Поймано на первом же прогоне 2026-08-13: проверяющий час -смотрел «комнату 20 уровня 12», которая на самом деле была комнатой 20 -уровня 13, и сравнивал её с картой не того уровня. Комнату 23 уровня 12 -читом не посмотреть в принципе. Это ровно та же болезнь чит-телепорта, что -BUG-CHEAT-FIGHT-1 (выход из боя), и лечится там же. - -**Чем платим.** Ничем в игре: в обычном прохождении Кид входит в комнату 23 -ногами, флаг снят, переход срабатывает как в оригинале. Расхождение видно -ТОЛЬКО при включённых читах. - -**Что проверять при регрессе.** Уровень 12: пройти в комнату 23 ногами — -уровень меняется на 13-й без заставки и без сброса HP. Обойти уровень -читом `+` через 23-ю — уровень НЕ меняется. - ---- - -## Чит «убить стража» (K) идёт через штатный путь смерти - -**Файлы:** `roomtest/pop_guard.c` (`pop_guard_kill`). -**Дата:** 2026-08-13. Решение пользователя. - -**Оригинал** (seg000:786) ставит `guardhp_delta = -guardhp_curr` И -`Guard.alive = 0`. А гейт события смерти в `play_guard` (seg006:1490) -требует `Char.alive < 0` — то есть у оригинала чит убивает стража В ОБХОД -`on_guard_killed`. На 13-м уровне это заметно: победа над Джафаром по читу -не ставит `leveldoor_open = 2`, и выход на 14-й не открывается. - -**Мы** `Guard.alive` в чите не трогаем: применённая дельта обнуляет HP, и -`play_guard` сам переводит стража в «умирает», вызвав `on_guard_killed` — -брызги, вспышка, флаг выхода. То есть чит даёт ровно «как будто убил Кид». - -**Почему.** Отладочный прогон 13-го уровня иначе требует каждый раз честно -выигрывать бой с Джафаром (skill 9, 6 HP) — это дорого по времени, а -проверять надо совсем другое. - -**Чем платим.** Ничем в игре: читы включаются флагом `pop_cheats`, в -релизной сборке они выключены. Расхождение наблюдаемо только с читами. - -**Что проверять при регрессе.** Уровень 13: `K` на Джафаре → белая вспышка, -уход ВЛЕВО открывает дверь уровня. Честная победа в бою даёт то же самое. - ---- - -## Страж, вытесненный за правый край комнаты и там убитый, не виден нигде - -**Не расхождение, а особенность оригинала.** Записано, чтобы вопрос не -возникал повторно (спросил пользователь 2026-08-19: бой шёл в комнате 15, -Кид вытеснил стража вправо — из-за края торчал только меч, — убил его, и -труп не появился ни в комнате 15, ни в соседней справа). - -**Почему так.** Три механизма складываются: - -1. **комнату страж не менял.** Его физика работает только в полосе - `x ∈ [44, 211)` (`seg000:1254`, у нас то же условие в - `pop_guard_phys_tick`), поэтому своим ходом за край он не уходит — - Кид вытолкнул его туда толчком, а `Guard.room` остался прежним; -2. **мёртвый за Кидом не идёт.** Единственный способ сменить комнату — - `follow_guard` при переходе Кида, и первое же условие там - (`seg002:0346`) — `Guard.alive < 0 && Guard.sword == sword_2_drawn`, - то есть ЖИВОЙ и с вынутым мечом. Мёртвый уходит веткой `leave_guard`, - которая сохраняет его в **`Guard.room`** — в старую комнату. У нас - ровно это же условие, `pop_guard_cold.c` (`pop_guard_follow`); -3. **из соседней комнаты страж не рисуется.** Оригинал при - `Guard.room != drawn_room` просто ГАСИТ слот (`seg000:422`: - `Guard.direction = dir_56_none`). Механизм «видно из-за шва» - (`xpos_in_drawn_room`) работает для коллизий и для Кида, но стража из - чужой комнаты на экран не выводит. - -Итог: труп приписан комнате, где страж стоял, а его `guards_x` — за -правым краем. При возврате в ту комнату он честно восстанавливается там -же, то есть за пределами видимого поля; в соседней комнате его нет, -потому что в её данных стража и не было. - -**Живой страж в этой ситуации ведёт себя иначе** — при уходе Кида вправо -он идёт следом, если стоит достаточно близко к краю (`Guard.x >= 165`). -Это портировано и работает. - -**Чего я НЕ проверял:** живьём в SDLPoP этот сценарий не воспроизводил — -вывод сделан чтением трёх мест кода. Если понадобится подтверждение, -сценарий короткий: любой бой у правого края комнаты, вытеснить стража за -край и добить. - -## ГСЧ разведён по доменам (у оригинала он ОДИН) - -**Оригинал.** `random_seed` один на всё: кладка стены, анимация тайлов, -броски боя, модификаторы падающих плит — всё тянет из одной -последовательности (`seg009` PRNG, 32-битный LCG). Поэтому в оригинале -бой воспроизводим вместе со всем остальным: тот же сид — тот же бой. - -**У нас.** Сидов несколько: `pop_t_seed` (кладка, `pop_tile.h`), -`pop_fight_seed` (броски боя, `pop_guard.h`), отдельные у trob и loose. -Сам генератор тот же (`pop_prandom`), таблицы вероятностей — -побайтно те же, что в `data.h`. - -**Чем платим.** Конкретный бой у нас и в SDLPoP разойдётся: порядок -бросков другой, значит блоки/удары лягут иначе. Статистически поведение -то же (те же вероятности, тот же генератор), но «сверить бой кадр в кадр -с SDLPoP» нельзя, и QuickSave обязан сохранять ВСЕ сиды, а не один. - -**Что проверять при регрессе.** Если страж кажется сильнее/слабее -оригинала — сначала проверить не таблицы (они сверены), а **режим -скорости**: `fight_speed` у оригинала 100 мс, а в нашем FASTEST бой идёт -61,4 мс, то есть в реальном времени на 63 % быстрее, и на глаз это ровно -«страж давит сильнее». Режим NORMAL (дефолт) даёт 102,4 мс — см. -`frame_pacing_plan.md`. - -## PV intro: единые 12,5 FPS вместо переменных 10/7,5/8,57 FPS - -**Оригинал.** `proc_cutscene_frame()` двигает последовательности через -`cutscene_frame_time`: 6 тиков 60 Гц в начале, 8 после первой речи и 7 во -время заклинания. Это соответственно 10, 7,5 и примерно 8,57 FPS. - -**У нас (осознанное временное отличие).** Один логический кадр PV держится -четыре физических кадра Sprinter: номинально 50/4 = 12,5 FPS. Молния живёт -на отдельной физической шкале и не растягивается этим делителем. Если полная -отрисовка пересечёт дополнительный фронт, реальная частота может упасть до -10 FPS — это допустимо на текущем этапе, но должно быть измерено. - -**TODO.** Перевести PV-сцену на тот же anchor-based механизм точного темпа, -который gameplay использует через `pop_beam_sample/pop_pace_end`: измерять -число реально прошедших фронтов во время сборки кадра, держать период ровно -четыре фронта при укладывании в бюджет и явно учитывать overrun. После замера -можно вернуть точные переменные интервалы SDLPoP без накопления фазы. - -## Межуровневые PV-сцены: сохранён реальный период 100 мс - -Это правило не относится к временному темпу основного Princess/Jaffar intro -выше. `reset_cutscene()` SDLPoP задаёт для сцен перед уровнями период -6 кадров при 60 Гц, то есть 100 мс. На Sprinter тот же период получается -ровно как 5 кадров при 50 Гц. - -Суммы вызовов `proc_cutscene_frame()` перенесены без изменения реального -времени: сцены 2/4/6 и обе ветки 12 содержат 26 логических кадров (130 -физических, 2,6 с), сцена 8 — 60 (300, 6,0 с), сцена 9 — 72 (360, 7,2 с). -Fade in/out в эти числа не входят, как и в оригинале. - -## Gameplay: загрузка уровней через чёрный cut, без fade - -**Оригинал.** На границах игровых уровней использует fade out/in. - -**У нас (решение пользователя 2026-08-24).** Вход в первый уровень и -переход между уровнями выполняются как `старый кадр -> чёрная палитра -> -подготовка -> новый кадр с новой палитрой`. Fade на этих двух маршрутах -отсутствует. Сюжетные title/story/PV переходы сохраняют собственные fade и -left-to-right эффекты. - -Чёрная палитра устанавливается до любого HDD I/O. Загрузчики guard и -tileset сами физически правят отдельные цветовые слоты, поэтому после них -чёрный экран подтверждается повторно. Зеркальные атласы уровня 9 готовятся -до финального источника палитры. CBL открывается последним: старый порядок -`level_switch -> CBL open -> BIOS fade` давал скрежет повторяющейся половины -аппаратного буфера на входе в Level 1; после перестановки баг исчез в MAME. - -## Тень: кайма силуэта не подкрашивается фоном - -**Оригинал.** Спрайт Тени не хранится — он кладётся ДВАЖДЫ: обычным -прозрачным блитом в x и «блиттером XOR» в x+1 (`draw_objtable_item`, -seg008.c:1600). XOR идёт по 24-битному RGB того, что УЖЕ на экране -(`blit_xor`, seg009.c:3190), поэтому там, где спрайт прозрачен в x, но -непрозрачен в x−1, цвет получается как `фон XOR цвет спрайта`. - -**У нас.** Пакетный блит наложения на себя не умеет, поэтому результат -запечён в отдельный атлас (`toolchain/pop_pack_shadow.py`, -`docs/shadow_atlas_plan.md`). Запекать пришлось для КОНКРЕТНОГО фона, и -выбран чёрный: на нём `фон XOR цвет == цвет`, то есть запечка точна. - -**Чем платим.** Ровно одним: **кайма в один пиксель по ЛЕВЫМ кромкам -силуэта** на НЕчёрном фоне. У оригинала она принимает оттенок фона, у нас -всегда «свой» цвет. Внутренность силуэта и правые кромки совпадают точно — -там первый проход уже закрасил пиксель, и от фона результат не зависит. - -**Почему это приемлемо.** Тень бывает на четырёх уровнях, и почти всегда -на чёрном: у зеркала (ур. 4), в проёме (5), над пропастью (6), в бою (12). - -**Что проверять при регрессе.** Если Тень окажется на светлом фоне и -кайма станет резать глаз — вариантов два: запечь второй набор под светлый -фон (ещё 32 страницы EMM) или считать эту кайму прозрачной (силуэт станет -на пиксель уже). Оба хуже нынешнего; трогать только по факту жалобы. - - -## QuickSave/QuickLoad: лейбл печатается ДО дисковой операции, а не после - -**Как в оригинале.** SDLPoP печатает `QUICKSAVE` / `NO QUICKSAVE` (и пару -для загрузки) уже ПО РЕЗУЛЬТАТУ операции — `process_quicksave` (seg000:497) -сначала делает save/load, потом зовёт `display_text_bottom` и ставит -`text_time_total = 24`. На PC это незаметно: файл пишется мгновенно. - -**У нас.** `pop_qsave_process` заявляет строку ПЕРВЫМ действием, ещё до -`mem_alloc_pages`/ESTEX, через `pop_status_show_now()` — та печатает её -немедленно в ВИДИМУЮ страницу, не дожидаясь конца кадра. Отказ уже потом -переписывает строку на `NO QUICKSAVE`/`NO QUICKLOAD` обычной заявкой. - -**Зачем.** Запись снимка на диск занимает доли секунды, и всё это время -игра стоит. При порядке оригинала игрок видел сначала необъяснённый фриз, -и только по его окончании — надпись, объясняющую то, что уже прошло. -Решение пользователя, 2026-08-25. - -**Чем платим.** Строка успевает мигнуть даже там, где операция потом не -удалась: сначала `QUICKSAVE`, следом `NO QUICKSAVE`. На практике отказ — -редкость (нет места/диска), и «заявка → отказ» читается не хуже. - -**Что проверять при регрессе.** Что после неудачной операции на экране -остаётся именно `NO QUICKSAVE`/`NO QUICKLOAD`, а не первая строка: отказ -идёт обычной заявкой и печатается кадровым проходом, то есть на кадр позже. - - -## Смерть Кида: ждём кнопку и перезапускаем УРОВЕНЬ, а не игру - -**Как в оригинале.** `play_kid` (seg006:1383) печатает «Press Button to -Continue» с `text_time_total = 288`. Тик — это логический игровой кадр, -720 тиков = минута, то есть 12 тиков в секунду: 288 тиков = **24 секунды**. -Последние 72 тика (6 секунд) строка мигает с периодом 12 тиков, и на каждом -появлении играет звук 38. Дальше развилок ровно две: - -* игрок молчит все 24 секунды — `draw_game_frame` (seg000:958) зовёт - `start_game()`, и игра начинается ЗАНОВО, с title, а не с уровня; -* игрок нажимает **Enter или Shift** (не любую клавишу!) — seg000:584 - подменяет их на Ctrl+A: `if (rem_min != 0 && Kid.alive > 6 && (control_shift - || key == SDL_SCANCODE_RETURN)) key = SDL_SCANCODE_A | WITH_CTRL;` — и - уровень перезапускается. Условия важны: время не должно быть исчерпано - (иначе отработал `expired()`), а `Kid.alive > 6` даёт трупу улечься. - -**У нас.** Обе развилки сведены к одной: 24-секундного выхода в начало -игры нет вовсе, строка висит бессрочно (`MSG_HOLD`), а перезапускает уровень -ЛЮБАЯ кнопка, а не только Enter/Shift (решение пользователя). -`pop_start_level()` возвращает игрока на уровень. Место возрождения выбирает сам `pop_start_level` — на части -уровней это не старт, а пройденный чекпойнт. Esc за кнопку продолжения не -считается: он открывает pause menu. Логика ожидания живёт в банке -(`pop_dead_prompt`, pop_status.c) — резидент W1 переполнен. - -**Зачем.** Решение пользователя, 2026-08-25: возврат к title после каждой -смерти в отладочной сборке съедает всё время прохода, а прежний вариант -(авто-респавн через 400 кадров либо стрелка вверх) не объяснял игроку, чего -от него ждут. - -**Чем платим.** Двумя вещами. Первое: смерть больше не заканчивает -партию — счёт попыток фактически бесконечен, тогда как оригинал через 24 -секунды бездействия отправляет в title. Второе: любая клавиша вместо -Enter/Shift означает, что случайное нажатие (например, ещё не отпущенная -после боя клавиша) перезапустит уровень — отсюда требование сперва отпустить -всё. Когда дойдёт до «настоящей» игры, обе развилки придётся выбирать -заново: вернуть таймер на 288 тиков со start_game и сузить клавиши до -Enter/Shift — либо оставить как есть уже осознанно. - -**Что проверять при регрессе.** Нажатие принимается только после того, как -отпущено ВСЁ, что игрок держал в момент смерти (иначе зажатая при падении -стрелка перезапускает уровень мгновенно), и не раньше `RESPAWN_SETTLE` -кадров — труп должен успеть лечь. diff --git a/applications/PoP/docs/keys.txt b/applications/PoP/docs/keys.txt deleted file mode 100644 index 5c4966b..0000000 --- a/applications/PoP/docs/keys.txt +++ /dev/null @@ -1,58 +0,0 @@ -* Left: turn or run left -* Right: turn or run right -* Up: jump or climb up -* Down: crouch or climb down -* Down+Left/Right: hop -* Shift: pick up things -* Shift+Left/Right: careful step -* Home or Up+Left: jump left -* Page Up or Up+Right: jump right -* Up while running: running jump -* Shift while falling: grab onto ledge - -* Left/Right: walk (advance or retreat) -* Shift: strike (attack) -* Up: block (defend) -* Down: put sword away; press Shift to draw your sword again. - -=== - -* Esc: Pause game. -* Space: Show how much time is left. -* Ctrl+A: Restart level. - -* Ctrl+R: Return to intro. -* Ctrl+S: Sound on/off. -* Ctrl+M: Music on/off. -* Ctrl+V: Show version of SprPoP. -* Ctrl+Q: Quit game. - -* F6: Quicksave: Save the exact state of the game. -* F9: Quickload: Load what the last quicksave saved. -* F12: Save a screenshot to the screenshots folder. -* Backspace: Display the in-game menu. (Esc will also display the menu by default, but you can turn that off.) - -* Shift+L: Go to next level. -* -: Decrease remaining time by one minute. -* +: Increase remaining time by one minute. -* R: Resurrect kid. -* K: Kill guard. -* Shift+I: Flip the screen upside down. -* Shift+W: Slow falling. -* Shift+S: Restore a lost hit-point. (Like a small red potion.) -* Shift+T: Give more hit-points. (Like a big red potion.) - -=== - -* H: Look at the room to the left. -* J: Look at the room to the right. -* U: Look at the room above. -* N: Look at the room below. -* Ctrl+B: Go back to the room where the prince is. (Undo H,J,U,N.) - -=== - -* [: Shift kid 1 pixel to the left. -* ]: Shift kid 1 pixel to the right. -* T: Toggle display of timer (remaining minutes:seconds:ticks). Also shows the total elapsed ticks during playback. - diff --git a/applications/PoP/docs/l9_invert_plan.md b/applications/PoP/docs/l9_invert_plan.md deleted file mode 100644 index 82e7be0..0000000 --- a/applications/PoP/docs/l9_invert_plan.md +++ /dev/null @@ -1,428 +0,0 @@ -# L9-INVERT — план реализации зелья переворота (уровень 9) - -Рабочий план, по которому задача делается с чистого контекста. Доска — -[`../roomtest/TASKS_OPEN.md#l9-invert`](../roomtest/TASKS_OPEN.md); правила -подпроекта — `../CLAUDE.md` (SDLPoP = источник истины, диагноз железа — -только артефактом). - -## 0. Что и зачем - -Зелья типа 4 на уровне 9 (комната 7 тайл `(1,7)`, комната 10 тайл `(0,4)`) -переворачивают картинку вверх ногами. В оригинале это `toggle_upside()` -(seg000:15E9): `upside_down = ~upside_down`, `need_redraw_because_flipped = 1`. -Больше зелье не делает НИЧЕГО — ни вспышки, ни урона (seg006:1885, ветка -`case 4`). Снимается: смертью Кида (seg000:1224, при `alive >= 0`) и стартом -уровня (seg003:38/188). Управление НЕ инвертируется. Второе зелье -переворачивает обратно. - -Оригинал переворачивает готовый offscreen на выводе (`flip_screen` перед -копированием прямоугольников на экран, seg000:939/946). Нам этот путь -закрыт: страниц ровно две (`gfx_set_visible_page` → ESTEX $54 SELPAGE, бит 0), -рабочей третьей нет. Поэтому: - -- **уже нарисованное** переворачиваем ОДИН РАЗ построчной копией - акселератора (решение пользователя 2026-08-12); -- **всё, что рисуется дальше**, рисуем зеркально: фон (row-major) — новыми - vflip-блитами, персонажи (column-major) — заранее подготовленными - зеркальными кадрами. - -Полоса HP и лейбл комнаты живут в борту (`y = 194 + POP_YOFF`, поле — -`POP_PLAYFIELD_H = 192`) и не переворачиваются, как и в оригинале. - ---- - -# Часть I — libbgi - -## I.0 РАЗВЕДКА ЖЕЛЕЗА — ЗАКРЫТА 2026-08-12 - -**Оба факта подтверждены, ядро и обёртка написаны и проверены в MAME** -(`tests/pageflip`, 5/5 PASS — прямая копия, vflip, целость рамки, широкая -копия 320 = два прохода, неприкосновенность источника). - -- **Р1 подтверждён**: Port_Y можно менять между read- и write-триггером, - если ПЕРЕД вторым OUT стоит STOP (`LD B,B`) — он разоружает accel, и fetch - immediate-операнда OUT уже безопасен. Приём не новый: ровно так работает - `_bgi_scroll_cols_raw` (ядро `gfx_scroll_v`), то есть он был в проде - задолго до этой задачи — указал пользователь. Значит и обходной путь - через ОЗУ-буфер не нужен; -- **Р2 подтверждён**: обе страницы адресуемы одновременно, копия между ними - идёт по разнице баз (`_gfx_addr_shadow_base` / `_gfx_addr_base`), строку - выбирает Port_Y. - -Сделано: `libbgi/bgi256/_bgi_flip_rows_raw.c` (ядро) + -`libbgi/common/gfx_copy_page.c` (обёртка, режимы `GFX_COPY_DIRECT` / -`GFX_COPY_VFLIP`) + `tests/pageflip`. Пункты I.1 и I.3 ниже — ЗАКРЫТЫ этим -же коммитом; описание оставлено как контракт. - -### Исходный текст разведки (для истории) - -Два факта, на которых стоит вся схема, сейчас НЕ подтверждены артефактом. -Пока их нет, остальные пункты не начинать (memory `defer_unexplained_quirks`). - -**Р1. Смена Port_Y между burst-чтением и burst-записью.** Схема требует: -армировать копию, `LD A,(HL)` (burst-чтение строки src), сменить Y, -`LD (DE),A` (burst-запись в другую строку). Между триггерами НЕЛЬЗЯ -выполнять инструкции, читающие ОПЕРАНД из памяти — fetch операнда -перезабивает буфер акселератора кодом (memory `accel_operand_fetch_retrigger`). -Значит: - -- смена порта — только `out (c),a` (ED 79, регистровая форма); `out (#89),a` - (D3 89) читает immediate байт и УБЬЁТ буфер; -- новое значение Y — только из регистра (`ld a,d`), не `ld a,#n` и не из - памяти; -- `C` = 0x89 и оба значения Y должны лежать в регистрах ДО триггера чтения. - -Проверка: `tests/accflip` по образцу `tests/accop` — заполнить строку -источника известным паттерном, скопировать в другую строку со сменой Y, -прочитать VRAM побайтно и сравнить. Отрицательный результат — стоп-сигнал: -переворот придётся делать через промежуточный ОЗУ-буфер (строка 320 Б), и -бюджет вырастет примерно вдвое. - -**Р2. Адресация двух страниц в одном окне W3.** `gfx.h` утверждает, что -страница 1 «начинается на 320 байт дальше (0xC140)», но это комментарий, а не -замер. Нужно снять дампом: как адрес строки складывается из Port_Y и -смещения в окне, и видны ли обе страницы одновременно. От ответа зависит, -делается ли копия A→B одним проходом или через смену видеобанка. - -Итог разведки записать в `libbgi/docs` (или `docs/new/06-accel.md` -дополнением) и в memory — это знание переиспользуется во всех будущих -экранных эффектах. - -## I.1 Ядро копии с реверсом Y - -`libbgi/bgi256/_bgi_copy_rows_raw.c` умеет только ИНКРЕМЕНТ Port_Y на строку -(`y0` + шаг вперёд; страйды патчатся SMC при входе). Нужен вариант, где -одна сторона идёт вниз, другая вверх. - -- предпочтительно: новый leaf `_bgi_flip_rows_raw.c` (правило «1 функция = - 1 модуль»), а не флаг в существующем — горячий путь блиттера трогать не - надо, и DCE не потащит лишнего в программы без переворота; -- вход тот же (`__sdcccall(1)`: src→HL, dst→DE, дальше стек), плюс - `y0_src` / `y0_dst` и признак направления; -- DI-окно — одна строка, как в остальных ядрах (арминг в каждой скобке: - в окне EI между чанками CBL-ISR армирует акселератор своим размером, - см. `docs/accel-fill-budget.md`). - -## I.2 Публичные vflip-блиты для row-major — СДЕЛАНО 2026-08-12 - -Ассемблера не потребовалось вовсе: у row-major картинки вертикальное -зеркало — это порядок строк, а он задаётся ЗНАКОМ src-страйда, который -`_bgi_blit_rows_raw` и так принимает знаковым (`int sstride`) и патчит SMC -в adc-цепочку. Обёртки просто дают адрес ПОСЛЕДНЕЙ строки и `-stride`, -цена кадра та же, что у обычного блита. - -Написаны `gfx_blit_noclip_vflip`, `gfx_blit_part_noclip_vflip`, -`gfx_blit_part_vflip`; `tests/pageflip` расширен до 8 проверок, все PASS. - -Грабли, которые поймал тест: у клипающего варианта первая строка источника -обязана считаться от высоты ДО клипа (`h0`), иначе обрезка сверху экрана -сдвигает картинку — сначала формула брала уже укороченную `h`. - -### Контракт (исходное описание) - -Все row-major блиты приложения идут ровно через три функции (`pop_tile.c:281`, -`:283`, `:286`, `:325`, `:327`): - -| есть | нужен vflip-двойник | -|---|---| -| `gfx_blit_noclip` | `gfx_blit_noclip_vflip` | -| `gfx_blit_part_noclip` | `gfx_blit_part_noclip_vflip` | -| `gfx_blit_part` (с клипом) | `gfx_blit_part_vflip` | - -Семантика: `(x,y)` — левый ВЕРХНИЙ угол результата на экране (как у обычных -блитов), строки источника выводятся снизу вверх. Это позволяет вызывающему -не менять арифметику позиции, а только пересчитать `y` под поле. - -`gfx_blit_cols*` (column-major) vflip-двойников НЕ получают: реверс идёт -внутри колонки, а accel копирует блок только вперёд. Для персонажей — -часть II.4. - -`gfx_heal*` не трогаем: heal симметричен, он восстанавливает прямоугольник из -ОЗУ-копии по экранным координатам, а координаты вызывающий уже даёт -перевёрнутые. - -Тест: `tests/blitvflip` — эталонный спрайт, побайтная сверка VRAM. - -## I.3 Копия прямоугольника экран→экран - -```c -#define GFX_COPY_DIRECT 0 -#define GFX_COPY_VFLIP 1 -void gfx_copy_rect(uint8_t src_page, int sx, int sy, - uint8_t dst_page, int dx, int dy, - uint16_t w, uint16_t h, uint8_t mode); -``` - -- `w > 256` режется на burst'ы вызывающим ядром (320 = 160+160 либо 256+64 — - выбрать по замеру, разницы в тактах на строку почти нет); -- **горизонтального флипа не будет**: accel копирует блок только вперёд, - побайтовый реверс дал бы 320 burst'ов на строку вместо двух. Если он - когда-нибудь понадобится — только через ОЗУ-буфер с CPU-реверсом; -- клип не нужен (вызывающий гарантирует границы), но проверка «прямоугольник - в пределах экрана» в safe-варианте библиотеки — обязательна. - -Тест: `tests/pagecopy` — прямой режим и VFLIP, побайтная сверка. - -## I.4 Чего в списке пользователя не хватало - -1. **Размерный регресс**: после каждого шага `make size-check`; новые модули - не должны утянуть за собой рост в программах, которые их не зовут (проверка - на `examples/` и `tests/`). -2. **Обе сборки библиотеки** — fast и safe (`sprinter-cc --safe`): гарды - параметров в safe, критичные — в обеих. -3. **Документация**: `docs/sprite-api-design.md` (раздел про блиттер), - `docs/TODO.md`, справочник API; факты разведки I.0 — в `docs/new/06-accel.md`. -4. **IM2/CBL**: длинные серии коротких DI-окон не должны ломать кадровые - прерывания и клавиатуру — проверить `tests/kbdpoll`-сценарием после - внедрения (клавиатура вычерпывается idle-хуком, а переворот идёт вне - ожидания кадра). -5. **Порядок «страница ↔ ОЗУ-копия»**: копия должна идти банком - `GFX_BANK_NORMAL`, иначе перевёрнутый фон не попадёт в ОЗУ-копию и heal - начнёт восстанавливать старую картинку. Это ключевой инвариант всей - схемы — вынести отдельным утверждением в тест. - ---- - -# Часть II — приложение (roomtest) - -## II.1 Состояние и момент переключения — СДЕЛАНО 2026-08-12 - -Проверено в MAME (уровень 9, комната 7): нажатие чита переворачивает всю -комнату целиком за один кадр, повторное — возвращает. Персонажи и -анимируемые тайлы (факелы) пока рисуются НЕ зеркально — это шаги II.3/II.4. - -Что появилось: - -- `pop_upside` + `pop_upside_dirty` (порт `upside_down` и - `need_redraw_because_flipped`) в `pop_map.c`; -- ветка `case 4` в `pop_proc_get_object`: только тоггл, без вспышки и урона - (как seg006:1885); -- сброс в `pop_start_level` (seg003:38/188) и по смерти Кида (seg000:1224); -- `pop_flip_screen()` в банке 8: `gfx_copy_page(VFLIP)` в скрытую страницу → - показать её → `gfx_copy_page(DIRECT)` во вторую → инвалидация слотов - персонажей, метки «фон трогали» и полосы HP; -- **чит-клавиша U** — это ПОРТ, а не костыль: в оригинале переворот тоже - висит на чит-клавише (seg000:0793). Без неё эффект проверяется только - честным проходом уровня 9 до комнаты 7 — чит-телепорт до зелья не - дотягивается (оно на `(1,7)`, а навигация ставит Кида на нижний ряд). - -Цена: резидент +602 Б (новые функции libbgi линкуются в него), куча -1707 → 1050 Б. Это аргумент за [MEM-COLD2](../roomtest/TASKS_OPEN.md#mem-cold2) -до начала II.4. - -### Контракт (исходное описание шага) - -- `pop_upside` (uint8_t) — рядом с `pop_feather` в `pop_map.c`, экспорт в - `pop_map.h`; -- тоггл — в `pop_proc_get_object`, ветка `potion_type == 4` (сейчас там TODO, - как было у пера). Ничего кроме тоггла: ни вспышки, ни звука — так в - оригинале; -- сброс: `pop_start_level` (уже переехал в `roomtest_cold.c`) и смерть Кида — - по образцу seg000:1224 (в `kid_phys`/там, где ловится `alive >= 0`); -- переключение (функция `pop_flip_screen()`, банк 8 — холодный код): - 1. `gfx_copy_rect(front, …, back, …, GFX_COPY_VFLIP)` — скрытая страница - получает перевёрнутый чистый фон (accel читает ОЗУ-копию, персонажей в - ней нет); - 2. флип страниц, чтобы игрок сразу увидел результат; - 3. `gfx_copy_rect(new_front, …, new_back, …, GFX_COPY_DIRECT)` — вторая - страница дабл-буфера получает то же; - 4. инвалидация: `pop_cd[].valid = 0` для обоих слотов, `pop_mirror_heal` - -состояние, `pop_hp_invalidate()`, метки «фон трогали» (`pop_cd_touch`) - на обе страницы, `seam_sig` — чтобы шов перерисовался. - -## II.2 Геометрия — единая точка пересчёта - -```c -/* pop_bg.h рядом с POP_YOFF/POP_PLAYFIELD_H */ -#define POP_FLIP_Y(y, h) (2 * POP_YOFF + POP_PLAYFIELD_H - (y) - (h)) -``` - -Применяется ТОЛЬКО к тому, что внутри поля. Правило: любая функция, -получающая экранный `y`, либо сама зеркалит его по флагу, либо принимает уже -зеркальный — смешивать нельзя, иначе получим двойной переворот (это самый -вероятный класс багов здесь). Решение: зеркалит ВЫЗЫВАЮЩИЙ, у примитивов -семантика не меняется. - -## II.3 Фон — СДЕЛАНО 2026-08-12 - -Флаг проведён в ЕДИНСТВЕННУЮ точку — `pop_blit_b`/`blit_b_clip` -(`pop_tile.c`): позиция пересчитывается макросом `FLIP_TOP` (он один на весь -слой — дублировать нельзя, иначе двойной переворот), а блит выбирает -vflip-двойник. Тем самым зеркалятся и полная отрисовка комнаты, и точечные -редрои, и анимации trob, и fore-слой, и кладка — все они ходят через эту -функцию. - -Тонкость клипованного пути: при зеркале обрезка СВЕРХУ экрана съедает -НИЖНИЕ строки источника, поэтому кусок пересчитывается как -`sy' = h - sy - dh`. - -Проверено в MAME (уровень 9, чит U): комната перевёрнута целиком — пол -вверху, дверь уровня и кладка вверх ногами. Персонажи пока обычные (II.4). - -Цена: три функции libbgi ушли в резидент, куча 1574 → 450 Б, поэтому тем же -заходом сделан **MEM-COLD2 п.1** — `enter_room_side`/`enter_room` уехали в -банк 8 (куча вернулась к **1231 Б**, банк занят на 14.6%). Рабочие массивы -комнаты остались в `_DATA` и видны обеим половинам; `enter_room` обязана быть -`__banked` — её зовёт главный цикл. - -### Контракт (исходное описание) - -Одна точка: `pop_tile.c` (блит куска атласа) выбирает vflip-двойник по -`pop_upside` и пересчитывает `y`. Тогда автоматически попадают: - -- полная отрисовка комнаты (`pop_room.c`); -- точечные редрои (`pop_redraw.c`: ворота, пики, кнопки, дверь уровня, - дрожащие плиты); -- анимации `pop_trob` (факелы, пузырьки зелий); -- fore-слой и оверлеи кромки, кладка стены (`pop_bg.c`); -- падающие куски loose (`pop_room.c`, `pop_loose_mob_*`). - -Проверить отдельно: `wall_pattern` (кладка рисуется своей геометрией) и -оверлеи кромки — у них позиция считается от ряда, а не от `y` спрайта. - -## II.4 Персонажи (column-major) - -Нужны зеркальные кадры: 34 атласа, 228 563 Б (kid0..27 + sword, guard g0..g4). - -- реверс колонки — через стек (`pop`/`push`), ~10 тактов номинала на байт; -- источник маппится в W0, приёмник — новая EMM-страница; на спрайт: прочитать - колонки в буфер W2 (максимальный кадр — 40×16 ≈ 640 Б), развернуть, писать - в приёмник (перемаппинг W0 на спрайт — один OUT); -- `pop_cdraw.c` выбирает набор атласов (оригинал/зеркальный) по `pop_upside`; -- **кэш ключуется по СТРАНИЦЕ атласа**, а не по кадру: страница = 8 кадров, - 3-10 КБ, ~0.2-0.4 растрового кадра на переворот. - -**Стратегия наполнения — ЛЕНИВЫЙ ПОСТРАНИЧНЫЙ** (решение пользователя -2026-08-12): страница переворачивается при первом обращении к ней в -перевёрнутом режиме. Реально в ходу 5-10 страниц из 34, и если игрок зелье не -трогал, не тратится ни такта, ни страницы. - -**Время жизни кэша — ДО КОНЦА УРОВНЯ**: освобождаем страницы при смене -уровня, а не при снятии эффекта. На уровне 9 переворот случается минимум -дважды (второе зелье возвращает всё назад), плюс его снимает смерть Кида — -готовить пачку заново каждый раз было бы обидно. - -После [UI-SPRITES](../roomtest/TASKS_OPEN.md#ui-sprites) страницы `kid27` и -`g0` станут чисто «полевыми» (деления HP уедут в константы резидента), и -исключений в кэше не останется — эту задачу логично сделать ДО II.4. - -## II.5 Клип — ЧАСТЬ СДЕЛАНА 2026-08-12 (поле), остаётся clip_char - -**Клип ПОЛЯ сделан.** Симптом (нашёл пользователь): после телепорта в -перевёрнутом виде ниже поля — мусор. Причина: спрайты, которые в обычном -виде торчат ВЫШЕ поля (полоса кладки у потолка, её режет `pop_t_clip_top`), -после отражения торчат НИЖЕ и лезут в борт, где живёт полоса HP. - -Фикс в `blit_b_clip`: при перевороте режем по ОБЕИМ границам поля всегда, а -не по `pop_t_clip_top` — зеркальный спрайт может вылезти и там, где в -обычном виде клип не ставили. Плюс в `pop_blit_b` быстрый путь (без клипа) -теперь пропускает в клипующий всё, что выходит за поле. - -Проверено в MAME: телепорт по комнатам в перевёрнутом виде — борта чистые, -комнаты рисуются зеркально (факелы, чомперы, пол). То есть **переходы -между комнатами в перевёрнутом виде работают**. - -Осталось из этого пункта: `clip_char` (верх поля ↔ низ) и клип падающей -плиты — они про ПЕРСОНАЖЕЙ и падающие объекты, то есть идут вместе с II.4. - -### Контракт (исходное описание) - -- `clip_char` (`pop_map.c:2287`, таблица `y_clip[5] = {-60,3,66,129,192}`) — - режет верх спрайта по линии ряда; при перевороте линия становится нижней. - Симметрия сама не сойдётся: нужен зеркальный расчёт `y_clip` и обмен - «сверху/снизу» местами; -- то же для зеркала уровня 4 (`pop_map.c:2732`) — на уровне 9 зеркал нет, но - код общий, поэтому ветку надо хотя бы не сломать; -- `pop_clip_sprite` (`pop_room.c:1069`) — клип падающей плиты; -- `pop_room_clip_borders` — борта симметричны (28 сверху и снизу), но - проверить, что чистится именно поле. - -## II.6 Проверка - -- **хост-тест** (`tests-host`): арифметика `POP_FLIP_Y` и зеркальный `y_clip` - — сцена «Кид у верхней кромки» в обычном и перевёрнутом режиме даёт - симметричные значения клипа. Логику отрисовки хост-тесты не видят, поэтому - здесь проверяем только счёт; -- **MAME**: уровень 9, комната 7 — выпить зелье `(1,7)`, проверить: картинка - перевернулась целиком, Кид ходит и цепляется корректно, факелы анимируются - перевёрнуто, ворота/пики перерисовываются перевёрнуто, полоса HP осталась - внизу и не зеркальная; второе зелье (комната 10) возвращает как было; - смерть Кида снимает эффект; -- **регресс**: обычные уровни (1-8) не должны измениться ни на пиксель — - прогнать пару комнат и сверить скриншоты с прежними. - ---- - -# Часть III — ENTER-ROOM-FAST — СДЕЛАНО 2026-08-12 - -Комната теперь рисуется ОДИН раз — в скрытую страницу, — тут же -показывается флипом, а вторая страница получает её `gfx_copy_page(DIRECT)`. -Процесс рисования тайлов больше не виден: игрок получает готовый кадр. -Проверено в MAME: старт уровня и чит-переход между комнатами, два -последовательных снимка идентичны (обе страницы синхронны, мерцания нет). - -Побочно понадобилось: видимую страницу главный цикл больше не ведёт сам, а -перечитывает у железа в начале кадра (`front = gfx_get_visible_page()`) — -её меняют и вход в комнату, и переворот, причём оба из банка, где локальные -переменные `main` недоступны. - -# Часть III (исходное описание) - -Идея пользователя, самостоятельная ценность (сейчас при входе в комнату видно, -как рисуются тайлы): рисовать комнату ОДИН раз в скрытую страницу, показать её -флипом, а во вторую страницу залить `gfx_copy_rect(…, GFX_COPY_DIRECT)`. - -- сейчас `enter_room_side` рисует комнату дважды (цикл `for (pg = 0; pg < 2)`) - — вторая отрисовка (~полмиллиона тактов) меняется на копию (~115-200 К); -- процесс рисования перестаёт быть виден: игрок видит только готовый кадр; -- делается тем же `gfx_copy_rect`, что и I.3, то есть ничего дополнительно - писать не надо. - -Проверять отдельно: состояние ОЗУ-копии второй страницы после копии -(инвариант из I.4 п.5), метки «фон трогали», и что heal на второй странице -работает. - ---- - -# Порядок работ - -1. I.0 разведка (`tests/accflip`) → факты в docs + memory. -2. I.1 ядро + I.3 `gfx_copy_rect` (+ `tests/pagecopy`). -3. II.1 состояние и `pop_flip_screen` — уже можно посмотреть в MAME: - картинка обязана перевернуться целиком, дальше она «поедет» по мере - перерисовок (это ожидаемо на этом шаге). -4. Часть III (ENTER-ROOM-FAST) — дешёвый выигрыш на том же кирпиче, - заодно обкатывает копию в бою. -5. I.2 vflip-блиты (+ `tests/blitvflip`) → II.3 фон. После этого сцена - должна выглядеть правильно во всём, кроме персонажей. -6. UI-SPRITES (деления HP в резидент) → II.4 зеркальные кадры персонажей. -7. II.5 клип → II.6 проверка и регресс. - -Критерий готовности каждого шага — артефакт (побайтный тест в MAME либо -скриншот сцены), а не «код написан». - -# Риски - -- **Р1 не подтвердится** (нельзя менять Y между триггерами) — переворот - пойдёт через ОЗУ-буфер строки, бюджет вырастет вдвое (всё ещё ≈0.5 - логического кадра), схема в целом выживает; -- **двойной переворот координат** — самый вероятный баг: часть кода зеркалит - `y` сама, часть получает уже зеркальный. Лечится правилом из II.2 и тем, - что зеркалит только вызывающий; -- **кэш зеркальных кадров и память**: 34 страницы EMM в худшем случае; по - `sprinter_emm_budget` на старте свободно 215 — влезает, но проверить - фактический остаток на уровне 9 (там уже загружены атласы фона, Кида, - стража и уровень); -- **fore-слой поверх персонажа**: он рисуется по футпринту спрайта, а - футпринт после переворота другой — проверить именно на сцене с колоннами. - -# Решения пользователя (2026-08-12) - -1. **Кэш зеркальных кадров — ленивый постраничный**, наполняется по первому - обращению (см. II.4). -2. **Живёт до конца уровня**, освобождается при смене уровня. -3. **ENTER-ROOM-FAST делается сразу**, шагом 4 — на готовом `gfx_copy_rect`, - до того как на копию завяжется переворот. - -Открытых вопросов не осталось: план исполняется как есть, новые развилки — -только если разведка I.0 даст отрицательный результат по Р1. diff --git a/applications/PoP/docs/layout_plan_v2.md b/applications/PoP/docs/layout_plan_v2.md deleted file mode 100644 index 4c5f91d..0000000 --- a/applications/PoP/docs/layout_plan_v2.md +++ /dev/null @@ -1,532 +0,0 @@ -# roomtest — план v2: размер кода и раскладка по окнам/банкам/страницам - -> **Замер 2026-08-08, после MEM-BANK2 (актуальная сборка, ALLOCS=3000).** -> `_CODE` 22 556 Б, данные 4 375, куча 4 301. Банки: 1 (`guards.c`) 2 289, -> 2 (`pop_bg.c`, ГОРЯЧАЯ половина фона) 5 872, 3 (`pop_map.c`) 8 483, -> 4 (`pop_cdraw.c`) 5 664, 5 (`pop_ctrl.c`) 2 040, 6 (`pop_trob.c`) 2 889, -> 7 (`pop_room.c`, ХОЛОДНАЯ половина фона) 6 035 — все из 16 384. -> -> Слой фона разрезан надвое по ЧАСТОТЕ ВЫЗОВА (`TASKS_CLOSED.md#mem-bank2`): -> общие листья — в резидент `pop_tile.c` (W1 замаплен всегда, таблицы видны -> обеим половинам), горячий fore-проход остался в банке 2, холодная отрисовка -> комнаты и точечные перерисовки уехали в банк 7. Стык — три тонкие -> `__banked`-обёртки, чтобы трамплин платил только холодный путь. -> **Банк 2: 90.4 % -> 35.8 %.** Резидент вырос на 2 КБ (листья) — куча -> 6 333 -> 4 301 Б, это плата за то, что таблицы должны быть видны из двух -> банков. -> -> Число банков дублируется: `--bank N=` в Makefile И `const uint8_t n_banks` -> в `roomtest.c`. Расхождение — не ошибка сборки, а зависание до первого -> кадра. -> -> **Замер 2026-08-01 (историческая отметка).** `_CODE` 25 119 Б, `_DATA` 3 709, -> куча ~2.4 КБ. Банки: 1 (`guards.c`) 1 896, 2 (`pop_bg.c`) 13 792, -> 3 (`pop_map.c`) 6 331, 4 (отрисовка стража) 2 236 — все из 16 384. -> **Резидента `--w3` больше нет**: отрисовка уехала в банк 2, и это сняло -> главное ограничение резидента (из банка его было не достать) — банк→банк -> работает, трамплин сохраняет страницу окна на стеке. Отрисовка стража -> вынесена из банка 2 в собственный банк 4, потому что банк 2 подошёл к -> потолку (16 021 из 16 384) — коммит `2f3e854`. -> -> **Свободного места в банке 2 теперь 10.5 КБ**, в банке 7 — 10.3 КБ; туда -> просятся чомперы, зеркало и второй тайлсет (palace). Прежде чем начинать -> `levels_plan.md` §3 — всё равно посчитать, куда это ляжет. Следующий -> свободный номер банка — 8, гранулярность — файл. -> -> Из плана ниже **не сделаны шаги 5 (данные: `room_modif`, `dl1/dl2`, -> `_kbdraw_down`; потенциал ~1.5 КБ) и 7 (дедуп `draw_tile`, отложен по -> решению пользователя)**. - -Статус: **план для отдельной сессии**, составлен 2026-07-29 по свежему замеру. -Заменял `size_optimization_plan.md` (v1, 2026-07-21) — тот удалён 2026-08-01 -как полностью перекрытый этим документом. Документ самодостаточный -— рассчитан на старт с пустого контекста. - -Повод: перед стражами и боёвкой (новый код ~5–8 КБ) надо понять, куда он -поместится, и заранее развести код так, чтобы банкованные модули не упёрлись в -ограничения окна W3. - ---- - -## СТАТУС ВЫПОЛНЕНИЯ (обновлено 2026-07-29, коммит ecf5ecf) - -| Шаг | Статус | Факт | -|-----|--------|------| -| 1. `kid_data.h` → EMM-страница + `load_frame`/`cur_frame` | **сделан** | `_CODE` −3 247 Б; попутно найден и обойдён баг кодогенерации SDCC (см. ниже) | -| 2. `pop_geom.c` (дедуп геометрии + PRNG) | **сделан** | −41 Б `_CODE`, −11 Б W3; ценность — не байты, а bank-safe слой | -| 3. `pop_map` без вызовов графики | **сделан** (фазы 1a/1b) | через пометки перерисовки, см. ниже | -| 4. Разгрузка/перебалансировка W3 | **сделан** | резидент = `pop_bg` + `pop_gdraw` (отрисовка стража, 2026-07-29); W3 14 376 → 12 819 (свободно 3 565 Б) | -| 5. Данные (`room_modif`, `dl1/dl2`, `_kbdraw_down`) | не начат | потенциал ~1.5 КБ | -| 6. Контракт банка стражей + пробник | **пробник сделан** | `tests/w3bankgfx` — модель подтверждена в MAME, см. ниже | -| 7. Дедуп семейства `draw_tile` | отложен по решению пользователя | «мороки много, выгода не так велика» | - -**Замер сейчас против замера §1:** `_CODE` 24 881 → 24 421, куча W2 2 076 → 2 592 Б, -W3-резидент 14 376 → 11 632 (свободно 2 008 → 4 752 Б). Сумма кода упала -на ~3.2 КБ (данные Kid уехали в EMM), остальное — перераспределение. - -**Замер 2026-07-29 (после стража).** Появление стража съело кучу до 805 Б; -разгрузка — вынос ОТРИСОВКИ стража в резидент (`pop_gdraw.c`, `--w3`), логика -и состояние остались в W1/W2, чтобы банк `guards.c` их видел (R2). Итог: -`_CODE` 26 149 → 25 703, куча **805 → 1 245 Б**, W3-резидент 11 656 → 12 819 -(свободно 4 728 → 3 565 Б), банк 1 — 236 / 16 384 Б. Граница «что резидент» -теперь формулируется одним правилом: **резидент = только то, что рисует и -зовётся исключительно из главного цикла**; всё, что может понадобиться банку, -остаётся в W1/W2. - -### Что сделано вместо §5.3 (вынос loose в W3) - -Вместо переноса кода между окнами выбран (по обсуждению с пользователем) -**порт архитектуры оригинала**: логика ставит пометку, отрисовка идёт -отдельным проходом — `set_redraw_*` (seg007) + `redraw_needed` (seg008:0178). -Появился `pop_redraw.c/.h`; `pop_trob` и `pop_map` больше не рисуют тайлы. -Наши самодельные счётчики (`spike_rest`, `button_rest`, `ldoor_rest`, -`loose_bake`, `loose_rest`, `ceil_rest`, `ceil_bake`, `land_bake`) удалены — -их роль (вторая страница дабл-буфера) взял счётчик страниц в пометке. - -**Два исключения остались** (обе — функции ТОЛЬКО главного цикла, звать из -банка нельзя): -- `pop_process_trobs` — пламя факела и пузырёк зелья (покадровый оверлей); -- `pop_loose_tick` — падающий кусок (mob): spawn/tick/pos. В оригинале это - отдельная подсистема (`mobs` + `draw_moving`), разделение на логику и - отрисовку — задел следующей фазы. - -### Пробник банка (2026-07-29): модель ПОДТВЕРЖДЕНА - -`tests/w3bankgfx` (huge + `--w3 res.c` + `--bank 1=bank1.c`, графика 256): - -- банк рисует примитивом libbgi НАПРЯМУЮ — работает; страница W3 внутри - банка до блита, после блита и после возврата из вызванной им W1/W2-функции - одна и та же (0xF0), резидент — 0xF3. То есть `_bgi_begin`/`_bgi_end` - корректно возвращают ИМЕННО банковую страницу (правило R4); -- вызов W1/W2-функции из банка работает, и она тоже может рисовать; -- резидент W3 жив и вызывается после возврата из банка (R3). - -**Дополнительно выяснено (важно для стражей):** писучие статики -`__banked`-модуля линкуются В СТРАНИЦУ БАНКА (0x1C000+) — снаружи их не -прочитать, из W1/W2 по 0xC000 видна резидентная страница. Значит всё -состояние банкованного кода (позиции стражей, таймеры боя) обязано жить в -W1/W2 как обычные глобалы, а банк — только код. - -Ещё одна мина, найденная там же: инлайновый `in a,(#0xE2)` посреди тела -функции затирает A, куда SDCC уже положил параметр (у нас из-за этого цвет -заливки стал номером страницы, и «резидент не рисовал»). Читать порт -отдельной `__naked`-функцией. - -### Найденная по дороге ловушка компилятора - -`(const T *)КОНСТАНТА + var*K` SDCC 4.5 может собрать неверно: умножение -делает в 16 битах, а потом берёт только младший байт (`ld c,l` / `inc b`). -Кадры Kid с индексом ≥ 52 читались из чужой строки таблицы, у бега/шага -пропадал `FRAME_NEEDS_FLOOR` и персонаж проваливался сквозь пол. Лечение — -считать адрес в `uint16_t` и кастовать один раз. Тот же паттерн в -`pop_level.c` компилируется ПРАВИЛЬНО, т.е. полагаться на «у соседа -работает» нельзя. Подробности: memory `sdcc_z80_const_ptr_index_bug`. - ---- - -## 0. Что уже сделано из v1 (не повторять) - -- `--opt-code-size` и `--max-allocs 100000` **уже включены по умолчанию** в - `bin/sprinter-cc` (v1 §2.1 закрыт, выигрыш получен). -- Лишние блиты переднего слоя убраны (v1 §7 п.0): `fore_tile` больше не рисует - `bottom_id`, `_CODE` −388 Б. -- `gfx_blit_noclip` в libbgi (v1 §8 шаг 1): фоновые блиты в 2.9× дешевле. -- `--w3` как резидент окна 3 реализован и обкатан (memory `w3_resident_code`). - ---- - -## 1. ЗАМЕР (сборка 2026-07-29, коммит 1214785) - -Команда: `--memory small --gfx 256 --w3 pop_trob.c pop_map.c --w3 pop_bg.c`. - -### 1.1 Окна - -| Область | Занято | Свободно | Примечание | -|---|---|---|---| -| W1+W2 `_CODE` | 24 881 Б | — | 0x4100…0xA231 | -| W1+W2 `_HOME`+`_GSINIT`+`_DATA`+`_BSS` | ~4 240 Б | — | до 0xB2E4 | -| **W1+W2 куча** | 0 (никто не malloc'ит) | **2 076 Б** | 0xB2E4…0xBB00 | -| W1+W2 стек | — | 1 279 Б | 0xBB00…0xBFFE | -| **W3 резидент** | 14 376 Б | **2 008 Б** | 0xC000…0xF828 | -| EMM-страницы | 37 атласов + 1 уровень | ~215 страниц свободно | `sprinter_emm_budget` | - -**Итого запаса до стены: ≈ 4 КБ** (2 КБ в W1/W2 + 2 КБ в W3). Стражи туда -не влезут. - -### 1.2 Код по модулям (точно, из `.rel`) - -``` -W1/W2 (_CODE 24 881): W3 резидент (_W3CODE 14 376): - pop_kid 6 963 pop_bg 11 643 - pop_map 6 157 pop_trob 2 733 - roomtest 2 583 - pop_level 1 425 - pop_ctrl 1 145 - crt0 333 - libc+libbgi ~6 275 -``` - -### 1.3 Крупнейшие функции/данные (из `.lst`) - -``` -pop_bg : draw_tile 3080, other_overlay_tile 1146, wall_pattern 944, - mob_render 720, mob_tick_one 661, overlay_mid_tile 498, - fore_only_tile 409, climb_overlay_tile 391, tile_table 371 -pop_map : check_loose_fall_on_kid 674, check_bumped 567, jump_up_or_grab 413, - get_tile 266, do_knock 243, check_press 238, check_leave 212 -pop_kid : kid_seqtbl 2310 + kid_frames 1205 + kid_seq_off 230 = 3745 Б ДАННЫХ - (в _CODE!), собственно кода ~3.2 КБ -roomtest : enter_room+main ~2.1 КБ -pop_level: room_bg_ptr 1084 (+ 515 Б таблиц LINKLOC/LINKMAP в _DATA) -``` - -### 1.4 `_DATA` (3 710 Б) - -``` -pop_trob 963 (room_modif[24][30] = 720 + trobs + rest-массивы) -pop_level 515 (копии LINKLOC/LINKMAP уровня) -pop_map 163, roomtest 141, pop_kid 130, pop_bg 115, pop_ctrl 13 -libc: _irq_state 818, _kbdraw_state 515, _gfx_pal_buf 256, прочее ~200 -``` - -### 1.5 Находки замера (мелкие, но чинить) - -1. **`--w3` берёт ОДИН файл на флаг.** В `Makefile` написано - `--w3 pop_trob.c pop_map.c --w3 pop_bg.c`, и это значит «W3 = pop_trob и - pop_bg», а `pop_map.c` компилируется как обычный исходник в W1/W2. Судя по - `.sprinter-cc-roomtest/w3_pop_map.rel` (устаревший артефакт), когда-то - pop_map был в W3. **Решить осознанно** (см. §4) и записать явно: - `--w3 pop_trob.c --w3 pop_bg.c`. -2. `libc` тянет `_irq_state` 818 Б + `_kbdraw_state` 515 Б в `_DATA`. - `__irq_vec_buf` (513 Б) — таблица векторов IM2; `__kbdraw_down` (512 Б) — - битмап клавиш на 512 скан-кодов. Оба можно ужать (см. §5.4), это ~0.7 КБ - в самом дефицитном окне. - ---- - -## 2. ПРАВИЛА ПЛАТФОРМЫ, ОТ КОТОРЫХ ПЛЯШЕТ РАСКЛАДКА - -Это главное, что изменилось по сравнению с v1: модель банкинга уточнена по -`bin/sprinter-cc` (справка `--w3`/`--bank`) и по коду libbgi. - -**(R1) Резидент W3 (`--w3`) и банки W3 (`--bank`) делят одно окно.** -Резидент лежит на своей странице 0xC000…0xFFFF; трамплин на время вызова -`__banked` подменяет страницу W3 на банковую и возвращает резидентную назад. - -**(R2) Из банка резидент W3 НЕДОСТИЖИМ — и транзитивно тоже.** -Пока исполняется банк, резидентной страницы в адресном пространстве нет. -Значит нельзя не только `bank → pop_bg()`, но и `bank → pop_map() → pop_bg()`. -**Это ключевое ограничение при выборе, что делать банком.** - -**(R3) Резидент → банк работает** (через трамплин в W1), резидент → W1/W2 — -тоже. - -**(R4) Графические примитивы libbgi звать можно откуда угодно.** -`_bgi_begin` читает текущую страницу W3 из порта 0xE2, а `_bgi_end` её -возвращает — то есть скобка корректна и из банка, и из резидента. Нельзя -только одно: **звать `_bgi_begin`/`_bgi_end` ИЗ кода, который сам лежит в W3** -(после подмены страницы исчезнет исполняемый код — проверено, белый экран). -Поэтому `pop_bg` (резидент W3) обязан пользоваться готовыми примитивами -(`gfx_blit*`, `bar`, …), а батчинг скобки на весь `draw_tile` (v1 §8 шаг 1) -для него **невозможен** без переноса самого `draw_tile` в W1/W2. - -**(R5) `--w3` кладёт в W3 код И rodata модуля** (`--codeseg/--constseg -W3CODE`), а писучие статики оставляет в `_DATA` (W2). То есть `const`-таблицы -переносятся в W3 бесплатно вместе с модулем (так уже лежит `tile_table` 371 Б). - -**(R6) Данные в EMM-странице читаются, только пока страница в окне.** -`gfx_w0_map(page)` / `gfx_w0_unmap()` — окно W0 (0x0000…0x3FFF), первые 0x100 -занимает ISR-стаб. Так уже работает `pop_level`. Цена — пара `OUT` на -маппинг, поэтому годится для «пачками», а не для чтения по байту в горячем -цикле. - ---- - -## 3. ЧТО ДЕЛАТЬ НЕЛЬЗЯ (анти-паттерны, чтобы не потерять время) - -- **Нельзя банковать `pop_bg`.** Он вызывается из pop_map, pop_trob, roomtest, - pop_kid — то есть из главного цикла на каждом кадре; плюс он сам держит - `tile_table` и всю отрисовку. Банк дал бы трамплин на каждый блит. -- **Нельзя банковать `pop_map`, пока `pop_map` зовёт `pop_bg`** (R2). Сейчас - зовёт: `pop_loose_tick` и компания (~30 вызовов графики). -- **Нельзя тащить `kid_frames` в EMM «в лоб»**: он читается несколько раз за - кадр из коллизии (`kid_cur_dx`/`kid_cur_flags` → `dx_weight`, - `char_x_forward_edge`, …). Нужен кэш кадра (см. §5.1) — иначе маппинг - страницы окажется в горячем пути. -- **Нельзя «причёсывать» семейство `draw_tile` ради экономии, не имея - пиксельного теста.** Мы неделю выравнивали слои по SDLPoP; любой рефактор - этой зоны проверять диффом страниц (заморозка кадра клавишей `1` + сравнение - VRAM обеих страниц, приём из memory `mame_mcp_bridge`). - ---- - -## 4. ЦЕЛЕВАЯ РАСКЛАДКА - -Принцип: **W3-резидент = «толстая графика, которую зовёт только главный цикл»; -W1/W2 = ядро, которое должно быть достижимо ОТОВСЮДУ (включая банки); банки = -новая холодная логика (стражи, боёвка, будущие уровни)**. - -``` -W1/W2 (всегда отображено) W3 резидент (стр. 0xC000) Банки W3 -────────────────────────── ───────────────────────── ───────── -libc + libbgi pop_bg (отрисовка тайлов) guards.c -pop_kid (интерпретатор+рисование) pop_trob (анимации тайлов) fight.c -pop_map (коллизия/физика/предметы) pop_loose.c (loose+потолок) debug/roomnav -pop_geom (общая геометрия/тайлы) enter_room-часть roomtest? -pop_ctrl (ввод/диспетчер) -roomtest (главный цикл) -``` - -Почему так: - -- **`pop_map` остаётся в W1/W2** — его зовут и главный цикл, и (в будущем) - банк стражей; в W3 его класть нельзя именно из-за R2. Для этого из него надо - вынести графическую часть (loose/потолок) — она уезжает в W3 к `pop_bg` - (§5.3). После выноса `pop_map` становится **чистой логикой без единого - вызова графики** — тот самый bank-safe API. -- **`pop_kid` остаётся в W1/W2**: `play_seq`/`kid_set_seq`/`Kid` нужны и - стражам (у стражей ТА ЖЕ seqtbl), а `kid_draw` зовёт только libbgi (R4). -- **`pop_trob` остаётся резидентом**: его зовёт только главный цикл, и он сам - зовёт `pop_bg` — идеальный житель W3. -- **Банк стражей не зовёт ничего из W3.** Рисование стражей — либо через - libbgi напрямую (R4), либо (лучше) резидентный `guard_draw()` в W1/W2 рядом - с `kid_draw`, а банк только считает состояние. Тот же приём мы уже - используем для `pop_item_taken`/`pop_loose_fell`/`pop_ceil_fell`: банк - выставляет флаг — резидент рисует. - ---- - -## 5. ПЛАН РАБОТ - -Порядок выбран так, чтобы каждый шаг был проверяем отдельно и давал место -следующему. - -### Шаг 1. `kid_data.h` (3 745 Б) → EMM-страница + порт `load_frame` — **самый большой выигрыш** - -Сейчас `kid_seqtbl` (2310) + `kid_frames` (1205) + `kid_seq_off` (230) лежат в -`_CODE` окна W1/W2 — это 15 % всего дефицитного пространства. - -Как переносить: - -1. `pop_extract_kid_data.py` дополнительно пишет `kid_data.bin` (те же три - таблицы подряд, фиксированные смещения). -2. Грузим её в отдельную EMM-страницу тем же способом, что уровень - (`pop_level_load` — готовый образец), хэндл держим в `pop_kid`. -3. **Порт `load_frame` (seg006) и глобала `cur_frame`** — в оригинале ровно - так и сделано: раз за тик кадр копируется в структуру, а весь остальной код - читает `cur_frame`, а не таблицу. У нас `kid_cur_dx()/kid_cur_flags()` - станут чтением из `cur_frame` (5 байт в `_DATA`). -4. `play_seq` оборачивается в один `gfx_w0_map(kid_data_page)` … `unmap` на - вызов (в тике, не в отрисовке — конфликта с атласом в W0 нет). - -Выигрыш: **−3 745 Б из W1/W2**, цена — один маппинг страницы за тик и 5 байт -`_DATA`. Дополнительный бонус: `load_frame`/`cur_frame` — шаг К СХОДСТВУ с -оригиналом, а не отход от него. - -Риск: сломать `play_seq` (сердце анимации). Проверка: прогон по комнатам с -эталонными позами (вис, подтягивание, прыжки, подъём меча). - -### Шаг 2. Модуль `pop_geom.c` — дедуп + bank-safe фундамент - -Сейчас продублировано между модулями: - -| что | где | сколько | -|---|---|---| -| `y_to_row`/`y_to_row_mod4` | pop_bg + pop_map | 2 копии | -| `char_dx_forward` | pop_kid + pop_map | 2 копии | -| `x_bump[20]` | pop_kid (uint8) + pop_map (int16) | 20 + 40 Б, РАЗНЫЕ типы | -| `y_land[5]` | pop_kid + pop_map | 10 + 10 Б | -| `tile_is_floor` | pop_map (+ проверка кодов в roomtest) | 2 места | -| 32-битный LCG `prandom` | pop_bg (`prandom`) + pop_trob (`trob_prandom`) | 2 копии по ~60 Б + 2 сида | - -Собрать в один W1/W2-модуль `pop_geom.c`: таблицы `x_bump/y_land/dir_front/ -dir_behind`, `y_to_row`, `char_dx_forward`, `get_tile_div_mod(_m7)`, -`tile_is_floor`, `prandom`. Выигрыш прямой — сотни байт (оценка 250–400 Б), -но главное — **это и есть тот «чистый» API, который потом сможет звать банк** -(R2): вся геометрия оказывается в W1/W2 по определению. - -Осторожно: `prandom` у pop_bg и pop_trob — РАЗНЫЕ последовательности с разными -сидами (стены vs фазы факелов). Объединять функцию можно, **сиды — нет**: -передавать сид указателем/по индексу, иначе поедет раскладка кладки. - -### Шаг 3. Вынести loose/потолок из `pop_map` в W3 - -`pop_map` — единственный модуль W1/W2, который зовёт графику, и делает это -ровно в одном логическом блоке: `pop_loose_tick` + `check_press` + `do_knock` + -`fell_on_your_head` + `check_loose_fall_on_kid` + плита-потолок (~1.4–2 КБ). - -Вынести их в `pop_loose.c`, собираемый `--w3` рядом с `pop_bg`/`pop_trob`. -Тогда: - -- `pop_map` = чистая логика (bank-safe, R2 соблюдён); -- W1/W2 худеет ещё на ~1.5–2 КБ; -- W3 растёт на столько же — а место там появится после шага 4. - -### Шаг 4. Перебалансировка резидента W3 - -После шага 3 в W3 будет тесно (14.4 + 2 ≈ 16.4 КБ > 16 КБ). Разгружаем: - -1. **`wall_pattern` (944 Б) + `mob_render`/`mob_tick_one` (1381 Б)** — кандидаты - на переезд в W1/W2: их зовёт только `pop_bg`/`pop_loose`, но сами они уже - пользуются только libbgi (R4), значит из W1/W2 работают и остаются - достижимыми из банка. -2. `tile_table` и мелкие const-таблицы pop_bg (371 + ~300 Б) можно унести в - EMM-страницу **уровня** (там ~13.8 КБ свободно) — но только если чтение - происходит под уже замапленной страницей. Сейчас `draw_tile` читает - `tile_table` ВНЕ W0-контекста → потребуется явный маппинг на тайл. **Не - делать раньше замера**: 30 тайлов на входе в комнату × map/unmap — терпимо, - а вот в покадровых редроях (пики/loose/кнопка) — уже горячий путь. -3. Если и этого мало — `enter_room` (~2.1 КБ, зовётся только при смене комнаты) - переносится в резидент W3 или в БАНК (он вызывается из главного цикла = - резидента, значит банк допустим по R3). - -### Шаг 5. Данные - -1. **`room_modif[24][30]` = 720 Б** (pop_trob, `_DATA`). Нужен произвольный - доступ каждый кадр (анимации, ворота) — в EMM не годится. Но 24 комнаты × - 30 байт хранятся ЦЕЛИКОМ, хотя одновременно живут modif'ы только текущей - комнаты и соседей по швам. Вариант: хранить полный массив в EMM-странице - уровня, а в `_DATA` держать кэш на 2–3 комнаты (свою + левого/правого - соседа) с записью обратно при смене комнаты. Выигрыш ~600 Б, цена — - аккуратность на швах (кнопка в одной комнате открывает ворота в другой). - **Делать последним** — это самая «тонкая» правка по семантике. -2. **`dl1[256]`+`dl2[256]` = 512 Б** (pop_level, `_DATA` — копии LINKLOC/ - LINKMAP уровня) — читаются при нажатии кнопки - и при отрисовке нажатой кнопки. Кандидат на чтение прямо из страницы - уровня (она и так маппится) — но проверить, что `pop_doorlink2` не зовётся - из отрисовки в тот момент, когда в W0 атлас. Выигрыш ~500 Б. -3. **`_kbdraw_down[512]` 512 Б** (libc): проверено — это **байт на скан-код** - (`libc/kbd/_kbdraw_state.c`), хотя комментарий называет его битовой картой. - Упаковка в биты даёт −448 Б, но добавляет сдвиг/маску в ISR-трамплин и в - `kbd_raw_down`. Трогать осторожно: raw-клавиатура уже дважды была - источником залипаний (memory `kbd_raw_fifo_drain`, - `kbd_overrun_wipe_modifiers`) — правку сопровождать прогоном docs/kbd-games. -4. **`__irq_vec_buf` 513 Б** (libc IM2): таблица векторов обязана быть - выровнена и полна — не трогать. - -### Шаг 6. Контракт банка стражей (проектируется ДО написания кода) - -Когда дойдём до стражей: - -- `guards.c` собирается `--bank 1=guards.c`, режим `huge` (или `big` с - `BANKED=W1`, если W3 окажется тесен для трамплинов). -- **Банк зовёт только:** `pop_map` (чистая логика после шага 3), `pop_kid` - (`play_seq`, `kid_set_seq`, `cur_frame`), `pop_geom`, libc/libbgi. -- **Банк НЕ зовёт:** `pop_bg`, `pop_trob`, `pop_loose` (резидент W3) — ни - прямо, ни через промежуточные функции. Нужна отрисовка — выставляет флаг, - рисует резидент (идиома `pop_item_taken`). -- Первым делом — **пробник** (`tests/` или `--bank` на пустышке): банк зовёт - `pop_map`-функцию, та зовёт libbgi-примитив; убедиться в MAME, что скобка - W3 корректно возвращает банковую страницу (R4) — это проверка модели, а не - веры в неё. - -### Шаг 7. Мелкий дедуп в `pop_bg` (после того, как появится тест страниц) - -- Пять функций-редроев (`pop_spike_redraw`, `pop_loose_shake_draw`, - `pop_floor_bake`, `pop_button_redraw`, `pop_leveldoor_redraw`) отличаются - только прямоугольником heal, банком и набором тайлов — свести к одному - параметризованному хелперу (оценка −150…250 Б). -- `env_b/wall_b/fore_b/pot_b` — четыре одинаковых обёртки над `blit_b` - (оставить: экономия единицы байт, читаемость дороже). -- `overlay_mid_tile` / `fore_only_tile` / `climb_overlay_tile` / `draw_tile` - — общая структура «взять code/lcode, посчитать x/dmy/dby, разобрать слои». - Тут экономия потенциально сотни байт, но это **та самая зона риска из §3** — - только с пиксельным диффом до/после и по одному слою за раз. - ---- - -## 6. Ожидаемый итог - -| Шаг | W1/W2 | W3 | Риск | -|---|---|---|---| -| 1. kid_data → EMM + load_frame | **−3 745** | — | средний (сердце анимации) | -| 2. pop_geom (дедуп) | −250…400 | — | низкий | -| 3. loose → W3 | −1 500…2 000 | +1 500…2 000 | низкий (перенос как есть) | -| 4. разгрузка W3 (wall_pattern, mob) | +2 300 | −2 300 | низкий | -| 5. данные (room_modif, LINKLOC, kbd) | −1 000…1 600 | — | средний/высокий | -| 7. дедуп редроев pop_bg | — | −150…250 | средний | - -Суммарно: **W1/W2 освобождается ~4.5–6 КБ**, W3 остаётся примерно в нынешнем -объёме, но становится «правильно заполненным» — в нём только то, что банк -никогда не позовёт. Плюс открывается путь к банкам: стражи и боёвка получают -до 16 КБ на банк, не трогая резидент. - ---- - -## 7. Как мерить и проверять (обязательно к каждому шагу) - -1. **До/после по `.rel`** — точные размеры на модуль: - `for f in .sprinter-cc-roomtest/*.rel; do grep '^A ' $f; done` - (области `_CODE`/`_W3CODE`/`_DATA`). Итоги окон печатает сам `sprinter-cc`. -2. **Функции** — из `.lst` (метки `_name:` и адреса), скрипт в истории этой - сессии; полезно ловить «функция распухла после рефактора». -3. **MAME**: любой перенос кода между окнами/страницами — это класс «молча - ломается» (`sprinter_memory_modes`). Минимум: комната 1 (loose), 12 - (вис/подтягивание), 15 (меч), 9 (дверь уровня), 6 (кнопка/ворота). -4. **Пиксельный дифф** для правок отрисовки: заморозить кадр (`1`), сравнить - обе страницы дабл-буфера через `vram` (см. memory `mame_mcp_bridge`) и/или - сверить с эталонным рендером `render_room.py`. -5. **Скорость** — после шагов 1 и 4 замерить кадр маркерами в порт 0xFE - (приём из v1 §8), чтобы маппинг страницы за тик не съел бюджет. - -## 8. Ссылки - -- `bin/sprinter-cc` — справка по `--w3`, `--bank`, `--memory`, `--memory-manual`. -- `runtime/crt0_banked.s`, `runtime/bank.s` — трамплины и захват резидентной - страницы W3. -- `libbgi/common/_bgi_begin.c` / `_bgi_end.c` — механика скобки W3 (R4). -- memory: `w3_resident_code`, `pop_banking_architecture`, `sdcc_banking`, - `bank_local_data_pattern`, `sprinter_memory_modes`, `memory_modes_implemented`, - `sprinter_emm_budget`, `mame_mcp_bridge`, `avoid_32bit_arith_z80`, - `libc_one_function_per_module`. -- `applications/PoP/roomtest/TASKS_OPEN.md` — что из этого берётся в работу сейчас. - ---- - -## 9. Скорость отрисовки: замеры и запас - -Перенесено из удалённого `size_optimization_plan.md` §8 (замер 2026-07-27) — -единственная его часть, которая не была перекрыта этим документом. -Профилирование в MAME: маркеры в порт 0xFE + `wpiset … totalcycles` (приём из -memory `mame_mcp_bridge`); в самом `roomtest.c` для этого уже стоят полосы -бордюра `PROF()`. Кадр Sprinter = **430 080 тактов**. - -**Стоимость блита почти НЕ зависит от размера** — платим за проход по цепочке -`gfx_blit → gfx_blit_part → _gfx_blit_full` (16-битная арифметика, клип, -пересчёт src, нарезка полос >256), а не за пиксели: - -| путь (спрайт 32×3) | тактов | -|---|---| -| `gfx_blit` (общее ядро, с клипом) | 13 288 | -| линейное ядро без клипа | 4 617 | - -Отсюда `draw_tile(0,0)` тайла шва (9 блитов) стоил **183 690 тактов = 43 % -кадра**; сам `bar` — только 13 308. - -**Сделано:** `gfx_blit_noclip()` в libbgi, фоновые блиты `pop_bg` уходят на -него, когда спрайт целиком на экране (~2.9×, подтверждено в MAME). Позже -тем же приёмом закрыты спрайты персонажей (`gfx_blit_cols_part_noclip`). -**Не закрыт heal** — задача CLIP-1 в `../roomtest/TASKS_CLOSED.md`. - -**ВАЖНО:** W3-скобку (`_bgi_begin`/`_bgi_end`) ставит САМА libbgi — вызывать -её из модуля, собранного с `--w3`, нельзя: после `_bgi_begin` окно W3 занято -видеобанком и код вызывающего исчезает из адресного пространства (проверено: -белый экран). - -**Запас, когда перестанет хватать бюджета кадра:** - -1. **Батчинг W3-скобки** — одна `_bgi_begin`/`_bgi_end` на весь `draw_tile` - вместо скобки на блит; нужен публичный batch-API в libbgi. - **Осторожно, и это стало важнее, чем было:** между begin/end стоит `DI`, - длинная серия задержит кадровое прерывание — а по разбору KBD-1 - (`../roomtest/TASKS_CLOSED.md`) длинные DI-окна и есть причина потери байт - клавиатуры. Батчинг эту проблему УХУДШИТ, если делать его вслепую. -2. **Решётка ворот одним спрайтом** — `draw_gate_back` рисует бары по одному - (до 7 блитов). Сгенерировать в атласе «столб решётки» и выводить одним - `gfx_blit_part` с обрезкой по фазе `gate_bot_y & 7`: 7 блитов → 1. -3. **Не перерисовывать статичные части шва** — грань ворот, пол и кромка при - анимации решётки не меняются (см. OPT-1 в `../roomtest/BUGS_CLOSED.md` — - решено не делать, стоимость транзиентная). -4. **T-1 / T-2** (`../roomtest/BUGS_OPEN.md`) — перерисовка пик по причине и - idle-skip Кида: самый большой оставшийся резерв, потому что убирает работу - целиком, а не удешевляет её. diff --git a/applications/PoP/docs/levels_12_15_plan.md b/applications/PoP/docs/levels_12_15_plan.md deleted file mode 100644 index 533555b..0000000 --- a/applications/PoP/docs/levels_12_15_plan.md +++ /dev/null @@ -1,462 +0,0 @@ -# Что осталось на уровнях 12, 13, 14, 15 и 0 - -Статус: разбор по `../SDLPoP/src/`, 2026-08-13. Продолжает -[`levels_plan.md`](levels_plan.md) (машинерия уровней и тайлсеты — уже -сделаны). Здесь только СПЕЦСОБЫТИЯ, которых у нас ещё нет. - -Правило проекта: источник истины — SDLPoP; все ссылки ниже даны на функцию и -строку, чтобы порт начинался с чтения, а не с гипотезы. - ---- - -## 0. Что из этой области УЖЕ есть - -Проверено грепом по `roomtest/`: - -| механика | где у нас | статус | -|---|---|---| -| слот соперника, общий на всех Char | `pop_guard.c`, `pop_cdraw.c` | готово | -| `check_shadow` (спецвход тени) | `guards.c:310` | готово для уровней 4/5/6 | -| `do_init_shad` + таблицы `init_shad_5/6` | `guards.c:284` | готово | -| ИИ тени 4/5/6 | `guards.c:599/658/680` | готово | -| диспетчер `autocontrol_shadow` | `guards.c:711` | ветки 12 НЕТ | -| боёвка (удар/блок/парирование/HP соперника) | `guards.c`, `pop_ctrl.c` | готово | -| `flash_color` / `flash_time` | `pop_map.c`, `roomtest.c` | готово | -| `add_life` | `pop_map.c` | готово | -| таблицы уровней (`guard_type`, `guard_hp`, `entry_pose`, `level_type`) | `pop_level_cold.c:41..52` | готово, включая 12=SHADOW, 13=VIZIER | -| loose-полы, `make_loose_fall`, mob | `pop_map.c`, `pop_room.c` | готово (без спецкейсов ур. 13) | - -То есть каркас есть весь; ниже — недостающие спецсобытия. - ---- - -## 1. Уровень 12 — тень: встреча, бой, слияние - -### 1.1 Подъём тени в комнате 15 (`check_shadow`, seg002:0070) - -```c -if (current_level == 12) { - if (!united_with_shadow && drawn_room == 15) { - Char.room = drawn_room; - if (get_tile(15, 1, 0) == tiles_22_sword) return; // меч ещё лежит - shadow_initialized = 0; - do_init_shad(init_shad_12, 7 /* fall */); - return; - } -} -``` - -Отличия от наших веток 5/6: тень поднимается **в падении** (seq 7), условием -служит содержимое тайла (меч уже подобран) и флаг `united_with_shadow`. -Таблица `init_shad_12 = {0x0F, 0x51, 0xE8, 0, 0, 0, 0, 0}` — то есть -x=81, y=232, вправо, колонка 0, ряд 0. - -**Что добавить:** ветку в `pop_check_shadow` + константу `init_shad_12` + -глобалы `united_with_shadow`, `shadow_initialized`. - -### 1.2 ИИ тени (`autocontrol_shadow_level12`, seg002:1184) - -Самая содержательная функция уровня. Три режима: - -1. **Первый кадр в комнате 15**: пока Кид не подошёл (`Opp.x < 150`) — - `shadow_initialized = 1`; иначе тень ещё раз падает (`do_init_shad`). -2. **Кид с мечом** (`Char.sword >= sword_2_drawn`) → тень дерётся обычным - `autocontrol_guard_active` (у нас есть, `guards.c:535`). Особый случай: - если тень уже ранена (`offguard != 0 && guard_refrac != 0`) — она убирает - меч (`move_4_down`). -3. **Кид убрал меч** → тень тоже убирает и идёт навстречу; на дистанции - `< 10` — **СЛИЯНИЕ**: - -```c -flash_color = color_15_brightwhite; flash_time = 18; -add_life(); // +1 к максимуму HP -united_with_shadow = 42; // время вспышки Кид-тень -Char.charid = charid_0_kid; savekid(); // Кид ПЕРЕЕЗЖАЕТ на место тени -clear_char(); // тень со сцены -``` - -Плюс «если Кид бежит к тени — тень бежит к Киду» (кадры бега 3..14 и -шага 127..132). - -**Что добавить:** `autocontrol_shadow_level12` в `guards.c` + ветку в -диспетчере `autocontrol_shadow` (там уже три ветки, будет четвёртая). - -### 1.3 Общий урон (`do_delta_hp`, seg000:1518) - -```c -if (Opp.charid == charid_1_shadow && current_level == 12 && guardhp_delta != 0) - hitp_delta = guardhp_delta; // ранил тень — ранил себя -``` - -Три строки, но без них бой с тенью теряет смысл. У нас `do_delta_hp` -портирован — добавить условие. - -### 1.4 Таймер вспышки (`do_timers`, seg003:503) - -```c -if (united_with_shadow > 0) { - --united_with_shadow; - if (united_with_shadow == 0) { --united_with_shadow; /* → -1 */ ... } -} -``` - -`united_with_shadow` живёт как счётчик, потом как «уже слились» (−1). -На него смотрят `check_shadow` и `check_can_guard_see_kid`. - -### 1.5 Луч видимости (`check_can_guard_see_kid`, seg003:702) - -```c -if ((Guard.charid != charid_1_shadow || current_level == 12) && ... -``` - -У нас (`guards.c:103`) условие про тень **нужно сверить**: на уровне 12 тень -ОБЯЗАНА быть видимой (иначе Кид не достанет меч и бой не начнётся). - -### 1.6 Меч исчезает (`sword_disappears`, seg002:0536) - -```c -if (current_level == 12 && Char.room == 18) { - get_tile(15, 1, 0); - curr_room_tiles[curr_tilepos] = tiles_1_floor; - curr_room_modif[curr_tilepos] = 0; -} -``` - -Срабатывает при уходе Кида ВПРАВО из комнаты 18 (`leave_room`, ветка 1). -У нас есть `pop_level_set_tile` — порт на пять строк. - -### 1.7 Переход 12 → 13: НЕТ двери уровня, есть «бесшовный выход» - -Проверено по данным (`res2012.bin` / `res2013.bin`) — портала действительно -нет, уровень кончается **фактом попадания в комнату**: - -```c -// play_level_2, seg000:900 -} else if (custom->tbl_seamless_exit[current_level] >= 0) { - if (Kid.room == /*23*/ custom->tbl_seamless_exit[current_level]) { - ++next_level; - stop_sounds(); - seamless = 1; - } -} -``` - -`tbl_seamless_exit[12] = 23` (пара «уровень, комната» читается из оригинального -`PRINCE.EXE`, options.c:724). Дальше геометрия складывается так: - -| | комната | ряд 1 | что происходит | -|---|---|---|---| -| ур. 12 | 13 | `floor bigpil empty empty wall wall …` | Кид бежит ВЛЕВО с колонки 0 | -| ур. 12 | 23 | `empty ×6, floor floor floor floor` | попал сюда → **уровень сменился** | -| ур. 13 | 23 | `floor bigpil floor ×6 bigpil floor` | старт: ряд 1, кол 9, `seq_84_run` | - -Связи: `комната 13.left = 23`, и в комнату 23 больше ниоткуда не войти. -Номер комнаты у обоих уровней **один и тот же (23)**, стартовая позиция -уровня 13 — `BP_START = 23, поз 19 (ряд 1, кол 9), dir 0`, а -`tbl_entry_pose[13] = 2` даёт «вбегающий» вход (`seq_84_run`, seg003:172). -То есть Кид вбегает в комнату слева-направо… нет, `Char.direction = -~level.start_dir` — влево, тем же ходом, каким выбежал из уровня 12. Швов не -видно. - -Что делает флаг `seamless` (всего два места, оба косметические): - -* `start_level`, seg003:158 — **НЕ сбрасывает HP**: Кид уносит на уровень 13 - то здоровье, с которым добежал; -* `show_level`, seg008:1861/1870 — не показывает заставку «LEVEL 13» и тут же - гасит флаг. - -Двери уровня при этом на карте есть, но не при делах: у уровня 12 она одна -(комната 3, tilepos 23) — это ВХОД (стартовая комната 12-го — 3), а у уровня -13 их две (комната 3 tilepos 13 и комната 5 tilepos 24) — это выходы, -открываемые кнопкой из `Jaffar_exit`. - -**Что это значит для нас.** Наш переход уровня сейчас идёт только через -`SEQ_END_LEVEL` в двери. Для 12-го нужен второй триггер — проверка в главном -цикле «`pop_current_level == 12 && cur_room == 23` → `pop_next_level++`» плюс -флаг `seamless`, который пропустит сброс HP в `pop_start_level`. Обе правки -маленькие и локальные. - ---- - -## 2. Уровень 13 — Джафар - -### 2.1 Кто такой Джафар - -`tbl_guard_type[13] = 3` → `VIZIER.DAT` (у нас в `pop_level_cold.c` уже 3). -`tbl_guard_hp[13] = 6`. Отдельного ИИ у него нет: - -```c -void autocontrol_Jaffar() { autocontrol_guard(); } // seg002:0697 -``` - -То есть **бой с Джафаром — обычный бой стражи**, отличаются только спрайты, -HP и три спецсобытия ниже. Это хорошая новость: боёвка у нас есть. - -### 2.2 Встреча (`meet_Jaffar`, seg002:0544) - -```c -if (current_level == 13 && leveldoor_open == 0 && Char.room == 3) { - play_sound(sound_29_meet_Jaffar); - guard_notice_timer = 28; // Джафар ждёт 28/12 ≈ 2.33 с -} -``` - -Срабатывает при уходе Кида ВПРАВО (`leave_room`, ветка 1). -Пара к нему — в `autocontrol_guard_inactive` (seg002:0734), она у нас уже -портирована (`guards.c:401`), но **без условия по уровню**: - -```c -if (can_guard_see_kid) { - if (current_level != 13 || guard_notice_timer == 0) move_down_forw(); -} -``` - -**Что добавить:** глобал `guard_notice_timer` + его тик в `do_timers` -(seg003:509) + оба условия. - -### 2.3 Победа (`on_guard_killed`, seg006:1929) - -```c -} else if (current_level == 13) { - flash_color = color_15_brightwhite; flash_time = 18; - is_show_time = 1; - leveldoor_open = 2; // ← ключ к выходу - play_sound(sound_43_victory_Jaffar); -} -``` - -и парная `Jaffar_exit` (seg002:0517), срабатывающая при уходе Кида ВЛЕВО: - -```c -if (leveldoor_open == 2) { get_tile(24, 0, 0); trigger_button(0, 0, -1); } -``` - -То есть смерть Джафара не открывает дверь сама — она ставит флаг, а дверь -открывается кнопкой, «нажатой» при уходе влево. `trigger_button` у нас есть. - -### 2.4 Падающие плиты (`check_fall_flo`, seg000:1319) - -```c -if (current_level == 13 && (drawn_room == 23 || drawn_room == 16)) { - curr_room = room_A; // комната СВЕРХУ - for (curr_tilepos = 22; curr_tilepos <= 27; ++curr_tilepos) - make_loose_fall(-(prandom(0xFF) & 0x0F)); // ОТРИЦАТЕЛЬНЫЙ модификатор -} -``` - -Вот это и есть «плиты появляются»: при входе в комнаты 23/16 шесть плит ряда 2 -комнаты СВЕРХУ получают отрицательную фазу — то есть отложенный старт, и -сыплются на Кида вразнобой. Зовётся из `check_the_end` при смене комнаты. - -**Три спецкейса уровня 13 в loose-механике**, без них это не работает: - -| место | что | зачем | -|---|---|---| -| `animate_loose`, seg007:823 | при `modif & 0x80` НЕ останавливать тряску | иначе отрицательная фаза не досчитает до нуля и плита не упадёт | -| `loose_make_shake`, seg007:949 | на уровне 13 сотрясение НЕ трясёт плиты | иначе отложенные плиты сбрасываются в 0x80 | -| `fell_on_your_head`, seg007:1218 | плита бьёт и в БЕГЕ (кадры 5..14) | на прочих уровнях бегущего не задевает | - -У нас первый пункт критичен: `pop_loose_tick` трактует бит 7 как «тряска» и -на `>= 0x84` гасит фазу — отрицательный старт умрёт, не начавшись. Заодно -это ровно та же ветка, что мы правили сегодня в -[`LOOSE-ROOM-CHANGE`](../roomtest/BUGS_OPEN.md#loose-room-change), так что -код на виду. - -### 2.5 Поза входа - -`tbl_entry_pose[13] = 2` — у нас в таблице уже есть; проверить, что режим 2 -(`seg003:172`) реализован. - ---- - -## 3. Уровень 14 — принцесса и конец игры - -Боя нет вовсе (`tbl_guard_type[14] = -1`). Всё сводится к одному событию: - -```c -// check_the_end, seg000:1299 -if (current_level == 14 && drawn_room == 5) end_sequence(); -``` - -`end_sequence` (seg001:573) → `end_sequence_anim` (seg001:332): катсцена -«Кид добежал до принцессы» — обнимаются, появляется мышь, затухание, Hall of -Fame. Персонажи там играются ТЕМ ЖЕ интерпретатором `seqtbl` -(`seq_108_princess_turn_and_hug`, `seq_101_mouse_stands_up`), то есть движок -у нас уже подходит — нужны спрайты принцессы (`PRINCESS.DAT`) и раскадровка. - -**Оценка:** это не игровая механика, а ролик. Логично делать вместе с интро -и межуровневыми вставками — отдельным банком, как и договаривались -(см. memory `pop_banking_architecture`). На проходимость игры не влияет: -достаточно довести Кида до комнаты 5 и показать заглушку. - ---- - -## 4. Уровень 15 — «уровень зелий» (защита от копирования) - -Не часть сюжета. Это экран проверки подлинности из оригинала: после -уровня `copyprot_level` игра подменяет номер на 15, показывает комнату с -**14 зельями, на которых нарисованы буквы**, и требует выпить нужное. - -Механика (всё под `USE_COPYPROT` в SDLPoP): - -| место | что делает | -|---|---| -| `play_level`, seg003:53 | `level_number == copyprot_level` → грузим 15 | -| `redraw_screen`, seg003:273 | поверх зелий рисуются БУКВЫ (`copyprot_letter`) | -| `load_alter_mod`, seg008:1204 | одно зелье в комнате делается «открытым» (тип 6) | -| `animate_potion`, seg007:259 | на уровне 15 своя ветка перерисовки | -| `up_pressed`/`do_pickup`, seg005:657 | выпитое зелье убирает букву из таблицы | -| `seq` эффект зелья, seg006:1896 | синие зелья на уровне 15 отнимают ПОЛОВИНУ HP | -| выход, seg000:700 | из 15 возвращаемся в `copyprot_level` | - -**Рекомендация: не портировать.** Это анти-пиратский экран 1989 года, -требующий книжки-манускрипта; SDLPoP держит его выключенным по умолчанию -(`enable_copyprot`). Единственное, что стоит взять — **половинный урон -синего зелья**, если вдруг захочется полной совместимости; остальное только -съест банк. Если решим делать — это отдельная фича «уровень 15», а не часть -основного прохождения. - ---- - -## 5. Уровень 0 — демо-уровень (аттракт) - -`res2000.bin` у нас распакован. Это тот самый ролик, который крутится на -титульном экране: Кид сам бежит, дерётся со стражем и убегает. - -Как устроено: - -| место | что | -|---|---| -| `do_demo`, seg006:1409 | на уровне 0 вместо чтения клавиатуры зовётся `do_demo()` + `control()` | -| `autocontrol_kid`, seg002:702 | Кид управляется тем же `autocontrol_guard` | -| `do_auto_moves`, seg002:1089 | проигрыватель ЗАПИСИ ходов: таблица `(time, move)` | -| `on_guard_killed`, seg006:1928 | на уровне 0 после убийства стража Кид убегает (`checkpoint = 1`, сброс демо) | -| `demo_index` / `demo_time` | позиция в записи; у нас уже объявлены в `guards.c:267` | - -**Хорошая новость:** движок автодвижений (`do_auto_moves`) у нас уже есть — -он нужен был тени на уровнях 4/5/6, и `demo_time`/`demo_index` объявлены там -же. То есть демо-уровень — это в основном таблица ходов + ветка «Кидом -управляет ИИ» в `pop_ctrl`. - -**Когда делать:** вместе с интро/титульным экраном, не раньше. На -прохождение не влияет. - ---- - -## 6. Порядок работ - -Порядок задан пользователем 2026-08-13: **строго по номерам уровней**, а не -по дешевизне кода — уровень 13 не имеет смысла раньше, чем на него можно -попасть. - -1. ✅ **Уровень 12** — тень: `init_shad_12`, `autocontrol_shadow_level12`, - `united_with_shadow`, общий урон, «убил тень — убил себя», - `sword_disappears`, появление плит. Сделано 2026-08-13, хост-набор - `roomtest/tests-host/t_shadow.c` (45 проверок); живой проверки в MAME - ещё не было — доска [`L12-SHADOW`](../roomtest/TASKS_OPEN.md#l12-shadow). -2. ✅ **Переход 12 → 13** (§1.7) — room-триггер вместо двери и флаг - `pop_seamless` (не сбрасывать HP). Сделано там же. -3. ✅ **Уровень 13** — Джафар: `guard_notice_timer`, - `on_guard_killed`/`Jaffar_exit`, три спецкейса loose (§2.4) и - `check_fall_flo`. Плюс СПРАЙТЫ визиря (VIZIER.DAT) — без них он - рисовался обычным стражем. Сделано 2026-08-13, хост-набор - `roomtest/tests-host/t_jaffar.c` (44 проверки); живой проверки в MAME ещё - не было — доска [`L13-JAFFAR`](../roomtest/TASKS_OPEN.md#l13-jaffar). -4. **Уровень 14** — довести до комнаты 5 и поставить заглушку вместо ролика; - сам ролик — в общую задачу «катсцены». -5. **Уровень 0 и 15** — отложить: аттракт и защита от копирования на - прохождение не влияют. - ---- - -## 7. Сверка констант с ОРИГИНАЛЬНЫМИ данными (сделана 2026-08-13) - -Всё ниже снято скриптом прямо с `../SDLPoP/data/LEVELS/res2013.bin` и -`res2012.bin` — не из головы и не из констант SDLPoP. - -### 7.1 Падающие плиты уровня 13 — константы сходятся ТОЧНО - -Комнаты, у которых в ряду 2 вообще есть loose: - -| комната | loose в колонках | комната снизу | -|---|---|---| -| 17 | 2, 3, 4, 5, 6, 7 | **23** | -| 1 | 2, 3,    5, 6, 7 | **16** | -| 14 | 2 | 24 | - -Связи: `комната 23: up = 17`, `комната 16: up = 1`. То есть -`loose_tiles_room_1 = 23` и `room_2 = 16` — это ровно те две комнаты, над -которыми лежит ПОЛНАЯ гряда плит, а `first_tile = 22, last_tile = 27` — ровно -ряд 2, колонки 2..7: - -``` -комната 23 → сверху 17: 22:LOOSE 23:LOOSE 24:LOOSE 25:LOOSE 26:LOOSE 27:LOOSE [6/6] -комната 16 → сверху 1: 22:LOOSE 23:LOOSE 24:empty 25:LOOSE 26:LOOSE 27:LOOSE [5/6] -``` - -Два вывода: - -* диапазон 22..27 — **надмножество**: в комнате 1 тайл 24 пустой, и - `make_loose_fall` его молча пропустит (проверяет тип тайла). Копировать - константы можно как есть; -* пара «комната 14 → 24» НЕ входит в спецсобытие намеренно — одна плита, это - обычный loose. - -**Важное следствие, которого не было в плане:** стартовая комната уровня 13 — -**23** (`BP_START = 23`, поз 19, dir 0), а `check_fall_flo` зовётся из -`draw_level_first` → `check_the_end` (seg003:217). Значит плиты начинают -сыпаться СРАЗУ при входе на уровень, это его первый кадр, а не событие -где-то в середине. - -### 7.2 Джафар — один страж со skill 9 - -В `res2013.bin` заполнен ровно один слот стража: - -| комната | тайл | ряд, кол | направление | skill | -|---|---|---|---|---| -| 1 | 7 | 0, 7 | 255 (влево) | **9** | - -И это сходится с `meet_Jaffar`: событие срабатывает, когда Кид уходит ВПРАВО -из комнаты 3, а `комната 3: right = 1` — то есть ровно туда, где стоит -Джафар. Skill 9 у нас поддержан: `NUM_GUARD_SKILLS = 12`, все шесть таблиц -вероятностей (`guards.c:411..415`) имеют индекс 9. HP = `tbl_guard_hp[13] = 6` -(в `pop_level_cold.c` уже стоит). - -`Jaffar_exit` тоже проверен: **комната 24, tilepos 0 = `opener`** (кнопка), -модификатор 0 — то есть `trigger_button(0,0,-1)` жмёт реальную кнопку, а не -пустой тайл. - -### 7.3 Уровень 12 — меч на месте - -`комната 15, tilepos 1 = SWORD` — условие подъёма тени -(`get_tile(15,1,0) == tiles_22_sword`) на наших данных выполняется. -`комната 18: right = 19` — `sword_disappears` срабатывает при уходе вправо. - -Комната 15 целиком (по ней видно всю сцену встречи с тенью): - -``` -ряд 0: floor SWORD floor torch torch LOOSE LOOSE floor empty empty -ряд 1: wall wall wall empty empty empty empty wall floor floor -ряд 2: wall opener pillar empty empty empty empty wall pillar empty -``` - -### 7.4 `pop_loose_tick` действительно убьёт отрицательную фазу - -Подтверждено чтением кода: `m = ++pop_loose_modif[pos]; if (m & 0x80) { if (m ->= 0x84) → сброс в 0 }`. Для стартового `0xF0..0xFF` первый же тик даёт -`m >= 0x84` → фаза обнуляется, плита не падает. **Это и есть та правка №1 из -таблицы §2.4**, и она обязательна. - -### 7.5 `init_shad_12` и байтовое переполнение `y` - -`init_shad_12 = {0x0F, 0x51, 0xE8, 0, 0, 0, 0, 0}` → frame 15, x 81, -**y 232**, вправо, колонка 0, ряд 0, action 0 + `seq 7 (fall)`. Поле `y` в -`char_type` — `byte` (беззнаковое), то есть 232 лежит НИЖЕ поля (192), и -падение уводит его дальше с переполнением байта: тень «падает» из-под экрана и -появляется сверху. У нас `pop_char_t.y` тоже `uint8_t` — поведение -переносится без правок; при портировании просто не «чинить» это как ошибку. - -Отдельно про ряд: `curr_row` берётся ИЗ ТАБЛИЦЫ и равен **0**, хотя -`pop_y_to_row(232)` дал бы −1. `do_init_shad` копирует семь полей как есть и -ряд не пересчитывает, так что «согласовать» их — значит разойтись с -оригиналом. Закреплено тестом `shadow12_rises_when_sword_gone`. diff --git a/applications/PoP/docs/levels_plan.md b/applications/PoP/docs/levels_plan.md deleted file mode 100644 index 5872360..0000000 --- a/applications/PoP/docs/levels_plan.md +++ /dev/null @@ -1,209 +0,0 @@ -# План: от одного уровня к нескольким (загрузка, переходы, тайлсеты) - -Статус: план, 2026-08-01. Продолжает `PORT_PLAN.md` §7 (Фаза 1: «переходы -между экранами» → теперь между УРОВНЯМИ). Текущая точка: `roomtest` играет -уровень 1 целиком в одной комнате-за-комнатой модели, но уровень нельзя -ни выбрать, ни закончить. - -Источник истины — `../SDLPoP/src/` (правило `../CLAUDE.md`). Ключевые -места: `seg000.c: load_lev_spr/play_level_2/init_game`, `seg005.c: -up_pressed/go_up_leveldoor`, `seg006.c: play_seq → SEQ_END_LEVEL`, -`seg002.c` (спецсобытия уровней), `data.h:835..850` (потабличные различия -уровней). - ---- - -## 0. Что уже готово (не проектировать заново) - -- **Формат и загрузчик уровня.** `pop_level.c/.h` читает сырой - `res200N.bin` (2305 Б) в отдельную EMM-страницу; путь — параметр - `pop_level_load(const char *)`. Мультиуровневость здесь стоит одной - функции формирования имени. -- **Стартовая позиция уровня** уже разобрана: `pop_level_start_room()`, - `pop_level_start_pos()`, `pop_level_start_dir()` — реализованы и пока - НЕ вызываются (см. `../roomtest/TASKS_CLOSED.md` L1-START). -- **Страж по данным уровня**: `pop_level_guard()` (порт `enter_guard`), - сохранение состояния между комнатами (`pop_guard_state_save`). -- **Палитра разложена по слотам ровно как в оригинале** (`pop_pack_kid.py` - `build_palette`): env 0x50, wall 0x60, pot 0x40, kid 0x70, меч 0x80, - страж 0x90. Это тот же раскрой, что `set_pal_arr(0x50/0x60)` в - `seg000.c:1140..1148`, — значит смена тайлсета не требует переиндексации - спрайтов Кида (см. §3). -- **Все 16 файлов уровней распакованы**: `../SDLPoP/data/LEVELS/res2000.. - res2015.bin` (0 — демо-уровень). - ---- - -## 1. Что реально различается между уровнями (замер по данным, не по памяти) - -Таблицы из `../SDLPoP/src/data.h:840..847` + инвентарь тайлов, снятый прямо -с `res200N.bin` (маска `fg & 0x1F`): - -| Ур. | Тайлсет | Страж | Новое против предыдущих | -|-----|---------|-------|--------------------------| -| 1 | dungeon | обычный | — (текущая база) | -| **2** | **dungeon** | **обычный** | **ничего нового: тот же набор объектов минус меч** | -| 3 | dungeon | СКЕЛЕТ | чомперы | -| 4 | palace | обычный | **тайлсет palace**, зеркало (спецсобытие `mirror_level`) — **СДЕЛАНО** | -| 5 | palace | обычный | новых ТАЙЛОВ нет; спецсобытие **тень крадёт зелье** (комната 24) — [L5-SHADOW](../roomtest/TASKS_OPEN.md#l5-shadow) | -| 6 | palace | ТОЛСТЫЙ | падение на входе (спецсобытие) | -| 7 | dungeon | обычный | — | -| 8, 9 | dungeon | обычный | — | -| 10, 11 | palace | обычный | — | -| 12 | dungeon | ТЕНЬ | seamless-выход (комната 23), исчезающий меч | -| 13 | dungeon | ВИЗИРЬ | мышь, особый выход | -| 14 | palace | нет | — | -| 15 | dungeon | нет | финал | - -Прямое следствие для порядка работ: **уровень 2 не требует ни одного нового -ассета и ни одной новой механики** — он проверяет ровно машинерию перехода. -Это и есть первый шаг. - -Прочие потабличные различия, которые придётся завести массивами по 16: -`tbl_level_type` (тайлсет), `tbl_guard_type` (−1 = стражей нет), -`tbl_guard_hp`, `tbl_level_color` (вариантные палитры, 1.3), `tbl_entry_pose`. - ---- - -## 2. Шаг 1 — машинерия перехода (цель: уровни 1 → 2 → 3) — **СДЕЛАН 2026-08-04** - -> **Итог.** Всё в этом разделе портировано и проверено в MAME: уровень 1 → -> Shift+L → уровень 2 (комната 5, дверь захлопывается за спиной, большие -> колонны рисуются) → уровень 3. Разбор что именно сделано и что по -> уровню 2 осталось — `../roomtest/TASKS_CLOSED.md`, запись **L2**. -> -> Сверх плана пришлось доделать две вещи, без которых уровень 2 не играется: -> **`find_start_level_door`** (стартовый тайл уровня 2 — это правая половина -> двери уровня) и **большую склянку** `add_life` (тип зелья 2, комната 20). - -Порядок именно такой; каждый пункт проверяем в MAME отдельно. - -**2.1 Выход с уровня.** Портировать `up_pressed()` ветку двери -(`seg005.c:410..423`) + `go_up_leveldoor()` (`seg005.c:497`): дверь рядом -(при/за/перед персонажем) И `drawn_room != level.start_room` И створка -открыта полностью (`curr_room_modif >= 42` — вариант `fix_exit_door`) → -`Char.x = x_bump[...] + 10`, направление влево, `seq_70_go_up_on_level_door`. -Затем оживить опкод `0xF1 END_LEVEL` в `play_seq` (`../roomtest/pop_kid.c:418` -— сейчас пустой `break`): `++pop_next_level`, как `seg006.c:662`. - -**2.2 Цикл уровня.** В `main()` после тика: `if (pop_next_level != -pop_current_level) → load_level(pop_next_level)`. Порядок сноса/подъёма -состояния (порт `load_lev_spr` + `play_level_2`): -`pop_level_free` → `pop_level_load("LEVELS\\res200%d.bin")` → -`pop_trob_reset` → `pop_guard_reset` → сброс tile-override'ов -(`ovr_*` в `roomtest.c`) → `enter_room(pop_level_start_room())` → -`kid_init(поза/позиция/направление из данных уровня)`. -**HP через уровень переносится** (в оригинале `hitp_beg_lev`), не сбрасывать -в максимум — сверить с `seg000.c` `init_game`/`play_level_2`. - -**2.3 Стражи по уровню.** Завести `tbl_guard_type[16]`/`tbl_guard_hp[16]`; -`-1` = стражей на уровне нет (уровни 14, 15) — `pop_guard_enter` обязан это -понимать, иначе на 14-м полезут стражи из мусора. Для шага 1 (уровни 2, 3) -достаточно обычного стража, но проверку `-1` заложить сразу. - -**2.4 Чит «следующий уровень» (Shift+L).** Реализуется ровно тем же -`pop_next_level` — и без него отладка уровней превращается в прохождение -игры руками. Делать в этом же шаге, не позже (см. §4). - -**Приёмка шага 1:** дверь уровня 1 → уровень 2 играется целиком → его дверь -→ уровень 3 стартует (чомперы могут быть ещё не портированы — тогда -фиксируем как известное ограничение, а не «баг»). - ---- - -## 3. Шаг 2 — второй тайлсет (palace, уровни 4+) — **СДЕЛАН** - -> **Закрыт (ревизия 2026-08-11 по коду).** В дереве есть всё, что -> проектировалось ниже: `pop_pack_bg.py` печёт ДВА набора атласов -> (`pop_*` из VDUNGEON, `pal_*` из VPALACE, каскад с обменом приоритетов), -> `pop_bg_load` принимает тип набора и ставит флаг `pop_palace`, по которому -> `pop_room.c` выбирает дворцовую ветку (`wall_pattern` дворца — сплошная -> заливка + пять mono-полос, `PALACE_WALL_MONO_IDS`), решётчатые тайлы -> 25-29 есть и в `tile_table` (`pop_tile.c`), и в коллизии — `tile_is_floor` -> совпадает с `seg006:0628` тайл в тайл. Уровень 4 проходится smoke-тестом. -> -> Текст ниже оставлен как справочник по раскрою палитры и по тому, почему -> смена тайлсета — это перезапись 32 записей, а не переиндексация спрайтов. - -**Ассеты.** `toolchain/pop_pack_bg.py` уже читает PNG каскадом -VDUNGEON→VPALACE (та же логика, что в игре), но печёт ОДИН набор атласов -(`pop_env0..4.atl`, `pop_wall.atl`, `pop_fore.atl` ≈ 75 КБ). Нужен второй -набор из VPALACE (`pal_env*.atl` / `pal_wall.atl`), плюс `torch_debris` — -тайл, который встречается только на palace-уровнях. По EMM это ещё ~6 -страниц при бюджете ~3.3 МБ — не проблема. - -**Палитра — главный технический вопрос, и он уже решён раскроем.** -Тайлсет живёт в слотах `0x50..0x5F` (env) и `0x60..0x6F` (wall); Кид, меч, -страж, склянки — в других слотах. Значит смена тайлсета = перезапись 32 -записей палитры (`gfx_pal_set` на обе страницы, как `flash_bg` в -`roomtest.c`), а НЕ перезагрузка `kid.pal` и не переиндексация спрайтов. -Сделать `pal_dungeon.bin` / `pal_palace.bin` (по 32 записи) и грузить при -смене типа уровня. Проверить артефактом: скриншот palace-комнаты против -рендера `render_room.py` для того же уровня. - -**Вариантные цвета уровней** (`tbl_level_color`, `level_var_palettes` — это -уже 1.3, в 1.0 их нет): по той же механике, тот же диапазон слотов. Решение -на будущее — сначала базовые два тайлсета, потом при желании цвета. - -**Выбор набора в коде.** `pop_bg_load()` сейчас грузит фиксированные имена; -превратить в `pop_bg_load(type)` с двумя таблицами имён + выгрузка старых -атласов при смене типа (`atlas_free`). Переключение — только на границе -уровня, не в кадре. - ---- - -## 4. Читы SDLPoP: что взять на следующем этапе - -Из `../SDLPoP/README.md` (раздел Cheats). У нас уже есть: **K** — убить -стража, **I** — бессмертие (наш, в оригинале нет), **S** — выдать меч (наш), -**+/−** — обход комнат (`ROOMNAV`, наш). - -**Брать сразу вместе с переходами уровней** (без них отладка дороже самой -работы): - -| Чит | Что даёт | Цена | -|-----|----------|------| -| **Shift+L — следующий уровень** | единственный вменяемый способ тестировать уровни 2..15 | тривиально: `++pop_next_level` из §2.2 | -| **R — воскресить Кида** | у нас респавн по ↑ + таймаут; порт `resurrect` ближе к оригиналу и не мешает управлению | низкая | -| **Shift+S / Shift+T — +1 HP / +максимум** | отладка боёвки без «ровно трёх попыток»; честная замена нашему читу бессмертия | низкая, HP-машинерия уже есть | -| **[ и ] — сдвинуть Кида на пиксель** (debug-чит SDLPoP) | прямо бьёт в наш класс багов «окклюзия/шов на один пиксель» — воспроизведение позы без ловли момента | тривиально | - -**Брать во вторую очередь:** - -| Чит | Почему позже | -|-----|--------------| -| **H / J / U / N + Ctrl+B — смотреть соседние комнаты** | требует честной модели `drawn_room ≠ Kid.room` (наш S3-straddle, каркас есть: `update_kid_render_dx`). Зато потом заменяет самодельный `ROOMNAV` и попутно закрывает straddle-задачу | -| **Shift+W — медленное падение (feather)** | ветка `JMP_IF_FEATHER` (опкод `0xF7`) в `play_seq` уже есть, но не проверена ничем — чит станет её единственным тестом | -| **C / Shift+C — номера комнат** | у нас номер рисуется палочками именно потому, что текст тянет 2 КБ знакогенератора в W2 (`roomtest.c`). Ждёт своего шрифта | - -**Не брать:** `Shift+I` (переворот экрана), `Shift+B` (blind mode) — -развлекательные, к отладке порта отношения не имеют. `−/+` (время) — нужен -таймер уровня, которого у нас нет (Фаза 6). - -**Отдельно, дорого, но очень ценно — `F6`/`F9` (quicksave/quickload точного -состояния).** Это сериализация `Char` + `room_modif` всех комнат + trob'ов + -состояния стражей. Даёт то, чего нам сейчас сильно не хватает: -воспроизводимый регресс в MAME («вот кадр, где баг») вместо ручного подхода -к позиции. Кандидат сразу после того, как заработают уровни. - ---- - -## 5. Риски и что проверить артефактом до кодинга - -1. **Размер кода.** Замер сборки 2026-08-01: `_CODE` 25 119 Б, - куча ~2.4 КБ, банк 2 (`pop_bg`) 13 792 / 16 384, банк 3 (`pop_map`) - 6 331, банк 1 (`guards`) 1 896, банк 4 (`pop_gdraw`) 2 236. Чомперы, - зеркало, скелет и второй тайлсет пойдут в банк 2 — там осталось 2.6 КБ. - **Прежде чем начинать §3, посчитать, куда лягут новые тайлы**, иначе - повторится история «банк 2 упёрся в потолок» (коммит 2f3e854). Свободные - номера банков есть (5+), гранулярность — файл. -2. **Спецсобытия уровней** (`seg002.c`: `level3_set_chkp`, `sword_disappears`, - `Jaffar_exit`, зеркало, мышь) — их НЕ надо портировать заранее. Для - уровней 2 и 3 нужен только чекпойнт уровня 3. Остальное — по мере - подхода к уровню. -3. **Чомперы** (уровень 3 и почти все дальше) — отдельная механика - (`animate_chomper` + коллизия + смерть); шаблон работы тот же, что у - пик/ворот, см. `gates_spikes_plan.md`. -4. **`tbl_guard_type = -1`** на уровнях 14/15: без проверки страж - «появится» из неинициализированных данных. -5. **Уровень 0 (демо)** существует в данных, но в скоуп не входит. diff --git a/applications/PoP/docs/menu_settings_plan.md b/applications/PoP/docs/menu_settings_plan.md deleted file mode 100644 index bb1a52b..0000000 --- a/applications/PoP/docs/menu_settings_plan.md +++ /dev/null @@ -1,529 +0,0 @@ -# Pause menu и Settings для Sprinter PoP - -Статус: **MS0, MS2 и MS4–MS8 выполнены** (2026-08-23). Pause menu, CFG, -Settings, диалоги, Controls и build screen находятся в bank 9. Решение о -рендеринге и затемнении — §10. - -Связанные документы: - -- [`full_game_plan.md`](full_game_plan.md) — автомат состояний, title, - demo, cutscenes и ending; -- [`quicksave_plan.md`](quicksave_plan.md) — состав и восстановление снимка. - -## 1. Решения - -- Программа работает только с HDD; настройки, QuickSave и Hall of Fame - всегда могут быть постоянными файлами. -- Основной pause menu обязательно содержит QuickSave и QuickLoad. -- QuickSave имеет один слот `POP.SAV`; предыдущая корректная запись хранится - как `POP.BAK`. -- Первая версия имеет один профиль `VANILLA`. Под этим именем пока понимается - **текущее поведение roomtest**, включая уже встроенные исправления. -- Дизайн файла и API предусматривает будущий `ENHANCED`, но аудит и - переключение fixes сейчас не выполняются. -- Уровень 15/copy protection отсутствует. -- Моды, levelsets и меню Mods отложены. - -## 2. Что есть в SDLPoP - -`src/menu.c` содержит: - -- Resume, QuickSave, QuickLoad, Restart Level, Settings, Restart Game, Quit; -- General, Gameplay, Visuals, Mods, Controls; -- toggle/number/key controls, пояснения, scroll и confirmation dialogs; -- большой список fixes/enhancements и custom level options. - -На Sprinter не переносятся SDL-специфичные параметры: fullscreen, hardware -acceleration, scaling, aspect ratio, rumble. UI берёт структуру SDLPoP, но -набор настроек соответствует платформе. - -## 3. Pause menu первой версии - -```text -RESUME -QUICKSAVE (F6) -QUICKLOAD (F9) -RESTART LEVEL -SETTINGS -RESTART GAME -QUIT GAME -``` - -Поведение: - -- `Esc` в `PLAYING` открывает меню; повторный Esc или Resume возвращает игру; -- игра, логический таймер и звуковой насос ставятся на паузу согласованно; -- QuickSave/QuickLoad только взводят запрос, фактическая операция идёт на - безопасной границе кадра; -- QuickLoad disabled/показывает `NO QUICKLOAD`, если нет валидных SAV/BAK; -- перед QuickLoad из меню лёгкий probe проверяет заголовок и checksum обоих - файлов: валидный `POP.BAK` при отсутствующем/битом `POP.SAV` требует - отдельного `LOAD BACKUP?`, а не загружается молча; -- Restart Level и Restart Game выполняются сразу, БЕЗ подтверждения - (2026-08-22): Restart Level перечитывает уровень, Restart Game завершает - gameplay и возвращает к первому экрану title/intro; новая игра создаётся - общим LEVEL_LOAD только после skip/attract; -- Quit требует подтверждения и закрывает файлы/каналы штатным путём; -- меню недоступно в demo, cutscene, time-expired и ending; -- отдельная debug-комбинация немедленного выхода может остаться только в - отладочной сборке. - -## 4. Settings первой версии - -```text -GENERAL - Sound ON / OFF - Show Sprinter screen ON / OFF - Restore defaults... - -GAMEPLAY - Speed NORMAL / FAST / FASTEST - Gameplay profile VANILLA - Cheats ON / OFF - -CONTROLS - Show key bindings - -BACK -``` - -`Gameplay profile: VANILLA` показывается read-only: место в модели уже есть, -но пользователь не может выбрать ещё не реализованный ENHANCED. - -Изменения применяются немедленно к скорости, читам и звуку, но `POP.CFG` -записывается один раз при Back/Esc. На экране есть итог `SETTINGS SAVED` или -`SAVE ERROR`; во втором случае runtime-значения остаются рабочими. - -Отладочные параметры `ROOMNAV`, border profiling, stop-frame и переключение -double buffering не являются пользовательскими Settings. Они остаются -compile-time/debug функциями и скрываются из release UI. - -## 5. Модель настроек - -Игровой код не должен читать UI-структуры. Единственный runtime-контракт: - -```c -typedef enum { - POP_PROFILE_VANILLA = 0, - POP_PROFILE_ENHANCED = 1 -} pop_gameplay_profile_t; - -typedef struct { - uint8_t sound_enabled; - uint8_t speed_mode; - uint8_t gameplay_profile; - uint8_t cheats_enabled; - uint8_t show_build_info; - uint16_t enhancement_flags; -} pop_settings_t; -``` - -В первой версии загрузчик принимает только `POP_PROFILE_VANILLA`. Значение -ENHANCED из более нового/ручного файла заменяется на VANILLA с диагностикой, -а не включает частично реализованный режим. - -Будущий профиль задаёт маску возможностей централизованно: - -```text -VANILLA -> текущий согласованный набор -ENHANCED -> будущий рекомендуемый набор fixes -CUSTOM -> только если позже действительно понадобится -``` - -До отдельного аудита существующие `fix_exit_door`, feather guard behavior, -jump grab и sound priorities не переключаются и считаются частью текущего -VANILLA. - -## 6. Файл POP.CFG - -Бинарный, компактный, версионированный формат: - -```text -+0 "PCFG" magic, 4 Б -+4 format_version 1 Б -+5 payload_size 2 Б -+7 payload фиксированные поля little-endian -.. checksum 2 Б -``` - -Требования: - -- путь рядом с exe/в выделенном каталоге игры на HDD; -- неизвестная версия, неверная длина или checksum -> defaults; -- неизвестные будущие хвостовые поля можно пропустить по `payload_size`; -- запись только после Apply/выхода из Settings, не на каждый шаг курсора; -- ошибка записи не завершает игру: показать сообщение и оставить runtime - значения; -- Restore defaults меняет RAM только после подтверждения и затем сохраняет. - -CFG не содержит состояние уровня, QuickSave или Hall of Fame. - -## 7. QuickSave / QuickLoad в меню - -Детальный состав снимка и порядок восстановления — в -[`quicksave_plan.md`](quicksave_plan.md). Здесь фиксируется UI и файловая -транзакция. - -### Один слот и backup - -Файлы: - -```text -POP.SAV текущий слот -POP.BAK предыдущий валидный слот -POP.NEW временный файл во время записи -``` - -Безопасная запись: - -1. записать полный снимок в `POP.NEW`; -2. закрыть файл; -3. повторно открыть/прочитать заголовок и checksum; -4. старый валидный `POP.SAV` перенести/скопировать в `POP.BAK`; -5. `POP.NEW` сделать новым `POP.SAV`; -6. при любой ошибке сохранить прежний `POP.SAV`. - -Точную последовательность rename/copy выбрать после характеризации DSS. -Если атомарный rename не гарантирован, использовать copy + fsync/close и -никогда не удалять единственную валидную копию до проверки новой. - -### Загрузка - -1. проверить `POP.SAV`; -2. если он отсутствует/повреждён/несовместим — проверить `POP.BAK`; -3. при валидном BAK показать `LOAD BACKUP?`; -4. несовместимая версия — `INCOMPATIBLE SAVE`, без частичной загрузки; -5. после успеха закрыть menu, перерисовать обе страницы, перезапустить звук. - -### Сообщения - -Минимальный набор: - -```text -QUICKSAVED -QUICKLOADED -NO QUICKLOAD -SAVE ERROR -INCOMPATIBLE SAVE -LOAD BACKUP? -``` - -Сообщение показывается UI-слоем, но операция завершается до возврата в -игровой кадр. - -## 8. Restart Level / Restart Game - -Restart Level: - -- использует существующий штатный reset текущего уровня; -- не перечитывает CFG; -- не меняет `POP.SAV`; -- сбрасывает состояние, которое сбрасывает текущая реализация roomtest. - -Restart Game: - -- выполняется сразу, без подтверждения; -- завершить текущий gameplay session и вернуть автомат в TITLE; -- начать title/intro с самого первого экрана; -- создать новую игру с `FIRST_LEVEL` и новым глобальным таймером только - после пользовательского skip либо ввода в attract-demo; -- настройки оставить; -- QuickSave не удалять. - -## 9. Controls - -Первая версия только показывает активную раскладку. Переназначение клавиш -откладывается: raw PS/2 канал имеет особенности Shift и расширенных кодов, -поэтому generic key-binding UI требует отдельного проекта. - -Экран должен перечислить минимум: - -- движение и Shift/action; -- Esc/menu; -- F6/F9 QuickSave/QuickLoad; -- Ctrl+S sound; -- P speed; -- доступные cheats, только если они включены: K/Kill Guard, I/Immortal, - Shift+L/Next Level, U/Flip Screen и F7/F8/Time −/+ на отдельных понятных - строках. Нижней подсказки `Esc or Enter: Back` нет. - -## 10. UI renderer и ввод - -### 10.1. Выбор способа отрисовки: текст против спрайт-атласов - -Ограничение платформы: стандартный текстовый вывод libbgi (`outtextxy`) -не годится — он тянет системный знакогенератор в `_gfx_font_buf` (2 КБ -статики в W2) плюс жирный резидентный код, а W1/W2 забиты игрой -(тот же вывод зафиксирован комментарием в `roomtest_cold.c`, где отладочный -борд рисуется палочками именно поэтому). Значит, любой вариант требует -СВОЕЙ реализации вывода меню, живущей в отдельном банке (память на банк -есть; скорость не критична — меню работает на паузе). - -Рассматривались два подхода. - -**Вариант A — текстовые строки + собственный растровый рендерер.** - -Плюсы: -- минимальные данные: шрифт 2–4 КБ + таблицы строк по сотни байт на язык; -- весь динамический текст бесплатно: значения опций (ON/OFF, - NORMAL/FAST/FASTEST), сообщения (`QUICKSAVED`, `INCOMPATIBLE SAVE`), - диалоги (`LOAD BACKUP?`), экран Controls, будущий ввод инициалов - Hall of Fame — без текстового движка HoF вообще не сделать; -- правка формулировки = правка C-строки, мгновенные итерации; -- локализация = вторая таблица строк (+ вторая половина глифов); -- **решающий аргумент: так сделано в самом SDLPoP** — см. §10.2. - -Минусы: -- надо написать рендерер (блиттер глифа + строка + центрирование + - подсветка) — небольшой, но свой; -- вид определяется качеством шрифта-ассета. - -**Вариант B — готовые спрайт-атласы** (атлас главного меню с активными/ -неактивными пунктами, атлас вложенного меню, атлас каждой опции -On/Off и т.д.). - -Плюсы: -- аутентичный вид: любая типографика/декор запекаются при упаковке; -- вывод = существующий блит атласов, текстовый движок не нужен; -- язык = другой файл атласа с диска, ноль логики. - -Минусы: -- комбинаторика ассетов: 7 пунктов × состояния + вложенные меню + значения - всех опций + все сообщения + все диалоги ≈ десятки КБ raw на язык до RLE; - второй язык удваивает; -- любая правка текста = перегенерация ассетов + перекладка ресурсов; -- динамический текст (HoF initials) всё равно потребует шрифтового движка — - получили бы ОБЕ системы сразу. - -**Решение (2026-08-22): Вариант A**, шрифт — ассет. Спрайты остаются только -для нетекстового декора (рамка/фон меню, маркер выделения — как arrowheads -в SDLPoP). Титульный экран — полноэкранная картинка, тема `full_game_plan.md`. - -### 10.2. Референс: как устроено меню в SDLPoP - -`SDLPoP/src/menu.c` + текстовый движок `seg009` — источник структуры: - -- **Текстовые строки + встроенный пропорциональный bitmap-шрифт** - `hc_small_font_data[]` (menu.c:2488): символы 32..126, каждый глиф — - монохромное изображение переменной ширины; `font_type` - {first_char, last_char, space_between_chars, height_above_baseline, chtab}. - Никаких per-item атласов, хотя SDL_ttf доступен. -- Вывод — портированный движок оригинального DOS PoP (seg009): - `draw_text_character` → `method_3_blit_mono(image, x, y, textblit, - textcolor)`; `get_line_width` для центрирования; перенос по словам. - Тем же движком рисуются in-game тексты и copy protection. -- Пункты меню — data-driven C-структуры `{id, previous, next, required, - char text[32]}` + таблицы `pause_menu_items[]` / `settings_menu_items[]`; - `required` — указатель на флаг disabled, такие пункты пропускаются при - навигации (prev/next пересчитываются). -- Выделенный пункт = смена цвета текста (bright-white против обычного) + - рамка-контур `draw_rect_contours(selection_box, lightgray)`; НЕ отдельный - спрайт «активного пункта». -- Фон меню — затемнение замороженного игрового кадра: - `draw_rect_with_alpha(black, alpha=120)`, внизу просвечивает «GAME PAUSED». -- Settings — декларативная таблица `setting_type` со стилями TOGGLE / NUMBER / - TEXT_ONLY / KEY, геттером/сеттером/increase/decrease значения, строкой- - explanation внизу экрана, скроллом длинных списков и фокусом «левая половина - (список) / правая половина (значения)». -- Диалоги — один общий `draw_confirmation_dialog(text)` + обработчик - результата; диалог возвращает решение автомату меню. -- Мини-спрайты только для декора значений (arrowheads up/down/left/right). -- Навигация озвучена (menu tick), ввод клавиатура+мышь, hover по прямоугольникам. - -### 10.3. Наша реализация - -- Банк 9: код рендерера, - шрифт, таблицы строк, автомат меню. Резидентно — только request-flag и - вызов процесса на границе кадра (паттерн pop_qsave_io). -- Рендерер повторяет минимальный контракт seg009: пропорциональные глифы, - baseline, `draw_string` и центрирование по сумме advance. Блит идёт через - W0-атлас, в `GFX_BANK_SPRITE`: `0xFF` в атласе пропускается, а UI временный - и не портит теневую копию игрового фона. Перед каждым кадром UI `gfx_copy_page` переносит чистый - shadow видимой страницы в скрытую, затем готовый кадр показывается только - на следующем фронте. При выходе чистый фон тем же способом возвращается на - обе страницы и восстанавливается исходная visible-страница. Поэтому - перемещение выделения не показывает поэтапную перерисовку и не оставляет - следов на back buffer. -- Шрифт — АССЕТ из **оригинальных** `hc_small_font_data[]` и - `hc_font_data[]` SDLPoP, не системный ZG и не TTF. Паковщик - `toolchain/pop_extract_font.py` делает `FONT\\font.atl`: 95 ASCII-глифов - малого и 95 крупного шрифта (7667 Б). Номер ленты вычисляется из ASCII, - поэтому это один текстовый движок, а не атлас готовых надписей. -- Двуязычность (eng/rus): строки храним в CP866 — латиница и кириллица одним - байтовым порядком, одна кодировка на оба алфавита. Локаль = пара - (указатель на таблицу строк, файл шрифта); переключатель — одна настройка. - Русские строки длиннее английских ~10–15% — раскладку экранов и ширину - колонок закладывать по русской. Второй язык можно добавить позже без - переделки: сначала eng. -- Визуальная композиция MS4 следует SDLPoP: замороженная сцена остаётся - открытой, поверх неё компактный центрированный список без чёрной карточки, - выбранная строка обведена тонким светло-серым контуром, а крупное - `GAME PAUSED` лежит в нижнем борту. Цвета текста и контура берутся из - стабильного диапазона палитры 0x37..0x3F. -- Фон открытого меню: снимок текущей палитры, затемнение всех слотов кроме - UI 0x37..0x3F и точное восстановление при выходе. Снимок хранится в - свободном хвосте EMM-страницы шрифта, не в W2. -- Навигация MS4: вверх/вниз, Enter/Esc, edge-triggered поверх `kbd_raw`. - Left/right и menu tick добавляются вместе с настройками на MS5. - -Первый UI может быть визуально простым. Критично отсутствие потери клавиш, -предсказуемая пауза и отсутствие повреждения игрового back buffer. - -### 10.4. Затенение экрана под меню — решение MS4 - -Режим меню виден сразу: bank 9 делает динамический снимок palette 0, -затемняет RGB-каналы вдвое и пишет одинаковый результат в обе экранные -палитры. Девять стабильных UI-слотов 0x37..0x3F не гасятся. При Resume/Enter -палитра восстанавливается из EMM-снимка. Это выбранный вариант Б ниже; -ступенчатый fade для роликов пока не нужен и остаётся отдельной будущей -задачей, а не причиной раздувать MS4. - -**Как сделано в SDLPoP** (`seg009.c`): - -- Меню: `draw_rect_with_alpha(&screen_rect, color_0_black, pause_menu_alpha)` - (menu.c:1364) — альфа-заливка чёрным поверх замороженного кадра средствами - SDL; нижняя полоса рисуется с alpha=0, чтобы сквозь неё просвечивало - «GAME PAUSED». Прямого аналога на Sprinter НЕТ (альфа-блендинг в железе - отсутствует) — это SDL-специфика, переносить нечего. -- Ролики/переходы: `fade_in_2/fade_out_2(rows)` (seg009.c:3947+, вызовы из - seg000.c) — ПОШАГОВОЕ затухание ПАЛИТРЫ к чёрному и обратно: палитра - копируется, каждая строка по 16 цветов гасится за несколько кадров - (`which_rows` маской выбирает, какие строки участвуют: 0x800/0x1000/...). - Вот этот механизм на Sprinter воспроизводим один в один. - -Отсюда рабочая гипотеза: наш примитив = «снимок текущей палитры → ступенчатое -приближение к затемнённой копии (кроме резервного блока для UI)», статично для -меню и анимированно для роликов/переходов. Варианты: - -**Вариант А — единая основная палитра (глобальный рефакторинг палитры).** - -1. Собрать ВСЕ палитры игры (уровневые наборы `pal_env*`, kid.pal, палитра - Тени и пр.) в одну общую 256-цветную; использовать её целиком всегда. - Сейчас переиспользования цветов НЕТ — каждая загрузка ассетов перезаписывает - слоты (см. pop_boot: kid.pal затирает тайловые цвета, приходится - восстанавливать `pop_bg_pal_apply`/`pop_shadow_pal_apply`). -2. Для затенения — затемнённая копия основной палитры, КРОМЕ зарезервированного - блока из 16 цветов для самого меню (кандидат — стандартные 16 цветов VGA). -3. Выход из меню — возврат к полной основной палитре. - -Плюс: решает попутно существующую боль с перезаписью палитр при загрузках. -Минус: большой разовый рефакторинг упаковщиков и всех загрузчиков атласов; -нужен аудит, что все цвета всех уровней влезают в 256. **Против говорит -план перевода камней подземелья на цвета VGA-версии PoP: там ряд уровней -несёт ДРУГУЮ палитру, отличную от SDLPoP (VDUNGEON/VPALACE каскад, -levels_plan.md), — единая палитра этому прямо противоречит.** - -**Вариант Б — динамический снимок текущей палитры (сейчас выглядит -предпочтительным).** - -1. При открытии меню прочитать всю текущую палитру, сохранить. -2. Записать затемнённую копию (кроме зарезервированного блока для меню). -3. При выходе — восстановить сохранённую. - -Плюс: локальная правка внутри меню, ничего в пайплайне ассетов не меняется; -работает при любой текущей палитре автоматически — включая будущие -уровне-специфичные палитры VGA-камней; тот же примитив ступенями даёт -fade-out/fade-in для роликов и переходов между уровнями (как fade_*_2 в -SDLPoP). Минус: чтение/запись 256 записей палитры при входе/выходе (раз на -открытие — дёшево); затемнение «на глаз» может по-разному выглядеть на разных -уровнях. - -Резервный блок 16 цветов нужен в ОБОИХ вариантах; текущий диапазон 0x37..0x3F -(стабильный, проверен) даёт 9 цветов — этого может не хватить на -текст+подсветку+рамку, тогда резервировать отдельный блок. - -**Следствие для архитектуры:** работа с цветом/палитрой должна собраться в -ОДИН модуль (сейчас она разбросана: gfx_pal_* вызовы в boot, pop_bg_pal_apply, -pop_shadow_pal_apply, вспышки урона в roomtest.c и т.д.). Модуль палитры — -единственный владелец записи в палитру и предоставляет примитивы, которые -понадобятся и меню, и роликам: - -```text -pal_snapshot()/pal_restore() — снимок/восстановление всей палитры -pal_dim(step) / pal_undim(step) — ступени затемнения (кроме резервного блока) -pal_fade_out(rows)/pal_fade_in(rows) — анимированное затухание по строкам - (порт fade_out_2/fade_in_2, seg009) -``` - -Меню уже использует snapshot+dim локально в bank 9. Когда появятся ролики, -выделить из него общий palette/fade-модуль; вспышка урона сможет переехать -туда же после отдельного аудита. - -## 11. Диалоги - -Общий диалог подтверждения: - -```text -QUIT GAME? -RESTORE DEFAULTS? -LOAD BACKUP? - -YES / NO -``` - -Диалог не выполняет действие напрямую: он возвращает решение автомату меню, -который формирует команду приложению. Так UI не зависит от gameplay-модулей. -По умолчанию выбран `NO`; Up/Down/Left/Right меняют ответ, Enter подтверждает, -Esc отменяет. Реализованы все три вопроса: Quit, Restore defaults и backup -QuickLoad. В Quit-dialog вопрос и `YES / [NO]` заключены в общую рамку; -отдельная строка `Enter: Select Esc: Cancel` не выводится. - -## 12. Будущий ENHANCED - -Не реализуется сейчас, но дизайн обязан позволять: - -- добавить второй профиль без смены всего UI; -- хранить `enhancement_flags` в CFG; -- отличать технические исправления порта (всегда включены) от изменений - оригинальной механики; -- провести аудит уже встроенных исправлений; -- покрыть каждый переключаемый fix host/MAME тестом; -- при необходимости добавить Advanced screen, не раздувая основной menu. - -До этого момента нельзя рассыпать проверки `if (enhanced)` по горячему коду. -Сначала составляется реестр и выбирается минимальная битовая модель. - -## 13. Этапы реализации - -| этап | результат | критерий приёмки | -|---|---|---| -| **MS0** ✓ | определить команды app/menu и структуру settings | UI возвращает команду главному циклу; прямых gameplay-вызовов нет | -| **MS1** | проверить запись/rename/copy на HDD DSS | crash/power-loss сценарий не теряет обе копии save | -| **MS2** ✓ | `POP.CFG`: defaults, load, validate, save | v1 codec, будущий хвост, checksum; повреждённый CFG даёт defaults | -| **MS3** | QuickSave hotkeys + POP.SAV/BAK | полный критерий `quicksave_plan.md` | -| **MS4** ✓ | текстовый рендерер + два шрифта (малый для пунктов, крупный для сообщений) + минимальный pause menu | SDLPoP fonts в одном W0-atlas, центрирование, dim/restore palette и tear-free page flip; все семь пунктов видимы, навигация и Resume/QuickSave работают в MAME | -| **MS5** ✓ | General/Gameplay Settings | значения применяются сразу и после Back/Esc записываются в POP.CFG | -| **MS6** ✓ | dialogs + backup recovery | подтверждения default-NO; QuickLoad спрашивает перед валидным POP.BAK | -| **MS7** ✓ | Controls help | показаны движение, action, menu, save/load, звук, speed и conditional cheats; MAME проверил отдельные K/I и Shift+L/U и возврат Esc ровно на один уровень | -| **MS8** ✓ | build info | CFG читается до первого показа; включаемый build screen получает ID и дату из Make/git | - -QuickSave (`MS1/MS3`) можно реализовать раньше визуального menu: сначала -F6/F9 и сообщения, затем подключить те же команды к пунктам UI. - -## 14. Тесты - -- Host: CFG round-trip, defaults, bad magic/version/size/checksum. -- Host: меню navigation, disabled items, confirmations, команды приложению. -- Host: рендерер строк — вывод глифов обеих локалей, центрирование, - ширина строки для малого и крупного шрифта. -- Host: SAV invalid -> BAK valid; оба invalid -> NO QUICKLOAD. -- MAME: F6, изменение сцены, F9; затем рестарт программы и повторный F9. -- MAME: прервать запись/испортить SAV — BAK остаётся загружаемым. -- MAME: pause на бое/падении, Resume не меняет состояние и таймер; смена - выбранного пункта не показывает промежуточный кадр и после закрытия не - оставляет меню на второй странице. -- MAME: Settings сохраняются после полного выхода и запуска с HDD. -- MAME: включить Show Sprinter screen, перезапустить `roomtest`, увидеть - build ID/date до первого игрового кадра и пропустить экран Esc/Enter/Space. -- Проверка лимита 8 DSS handles на каждом error path. -- `make size-check`; menu/text строки не должны съесть резидентный бюджет. - -## 15. Не входит в план - -- Mods и выбор levelset; -- уровень 15/copy protection; -- несколько save slots; -- replay/recording; -- key rebinding; -- SDL visual/controller options; -- фактическая реализация ENHANCED и individual fix switches. diff --git a/applications/PoP/docs/midtable_analysis.md b/applications/PoP/docs/midtable_analysis.md deleted file mode 100644 index 635e98d..0000000 --- a/applications/PoP/docs/midtable_analysis.md +++ /dev/null @@ -1,275 +0,0 @@ -# Слои отрисовки: как устроен оригинал и чего стоит порт - -Разбор 2026-08-13, по `../SDLPoP/src/seg008.c`. Повод — семь дефектов -падающих плит на уровне 13, из которых три оказались не багами кода, а -следствием того, что у нас нет слоя, в котором объекты и куски тайлов -сортируются между собой. Решение по этому документу ещё не принято. - ---- - -## 1. Как это работает в оригинале - -### 1.1 Три таблицы, а не «слои» - -`draw_tables` (seg008:1373) рисует ровно в таком порядке: - -``` -restore_peels(); -draw_wipes(0); -draw_table(0); // BACKTABLE -draw_table(3); // MIDTABLE -draw_wipes(1); -draw_table(1); // FORETABLE -``` - -Это грубое разделение на три уровня глубины. Куда попадёт кусок тайла, -решает переменная `ptr_add_table`, которую вызывающий переставляет перед -`draw_tile*`: по умолчанию `add_backtable`, в оверлее кромки — -`add_midtable` (`draw_other_overlay`, seg008:1499), а `add_foretable` -вызывается явно и точечно. - -### 1.2 Объекты живут НЕ в таблицах, а в objtable — и привязаны к ТАЙЛУ - -Персонажи, падающие куски, мечи, брызги попадают в `objtable`, и у каждой -записи есть поле `tilepos` — тайл, которому объект принадлежит. - -Ключевое: объекты рисуются **не отдельным проходом после фона**, а ВНУТРИ -обхода тайлов. В `redraw_needed_tile` (seg008:207) стоит: - -```c -if (tile_object_redraw[tilepos]) { - if (tile_object_redraw[tilepos] == 0xFF) - draw_objtable_items_at_tile(tilepos - 1); - draw_objtable_items_at_tile(tilepos); - tile_object_redraw[tilepos] = 0; -} -if (redraw_frames_fore[tilepos]) draw_tile_fore(); -``` - -То есть на каждом тайле: сначала его фоновые куски, потом объекты ЭТОГО -тайла, потом его передние куски. - -### 1.3 Порядок глубины складывается из ТРЁХ независимых механизмов - -| механизм | что даёт | -|---|---| -| порядок обхода тайлов: ряды **2, 1, 0**, колонки 0..9 (seg008:129) | тайл, обойдённый позже, рисуется поверх | -| сортировка объектов ВНУТРИ одного тайла (`sort_curr_objs`, seg008:1553) | кто из объектов одного тайла поверх кого | -| три таблицы back/mid/fore | грубая глубина для кусков тайлов | - -Сортировка внутри тайла (`compare_curr_objs`, seg008:1572) — пузырьком, и -правил в ней три: - -``` -объект типа 1 (ТЕНЬ) — всегда первым; -оба объекта — падающие плиты (0x80): y1 < y2 → по УБЫВАНИЮ y; -любая другая пара: y1 > y2 → по ВОЗРАСТАНИЮ y. -``` - -Обратный порядок для пары плит — не описка: две плиты из `loose_fall` летят -в 6 пикселях друг от друга, и верхняя обязана лечь поверх нижней. - -### 1.4 Что из этого следует - -**«Сортируемый midtable» — неточное имя.** Глобальной сортировки среднего -слоя в оригинале нет. Есть привязка объекта к тайлу и сортировка внутри -тайла; всё остальное решает порядок обхода. Это принципиально дешевле -общей сортировки: объектов на один тайл обычно 1-2. - ---- - -## 2. Что делаем мы - -Наш кадр — жёсткая последовательность проходов, без привязки объектов к -тайлам: - -``` -фон: pop_loose_tick (физика кусков) -> pop_process_trobs -> pop_redraw_needed - -> редрой шва -объекты: pop_loose_mob_draw (куски ПОД Kid, отсортированы по y между собой) - pop_char_draw(OPP/KID) (порядок задаёт guard_over_kid) - pop_loose_mob_draw_over (куски ПОВЕРХ Kid) -перед: pop_fore_over_char — ТОЛЬКО в окне вокруг персонажа -``` - -Отличия, из которых растут все три оставшихся дефекта: - -1. **Объект не знает своего тайла.** Глубина «кусок против Кида» считается - отдельной формулой (`pop_room.c`, поле `defer`), а «кусок против КУСКА - ТАЙЛА» не считается вовсе — куски тайлов рисуются раньше всех объектов. -2. **Передний слой считается только вокруг персонажа.** Это наша - оптимизация (memory `pop_fore_layer_cost`: полный проход стоил 78 % - кадра). Падающая плита в чужом углу комнаты передних частей тайлов - поверх себя не получает — отсюда «плита перед колонной». -3. **Оверлей кромки идёт после персонажей** и потому безусловно поверх - всех, тогда как у оригинала он в midtable и сортируется. - ---- - -## 3. Что затрагивает порт - -| участок | объём правки | -|---|---| -| `pop_room.c` — куски | привязать к тайлу, убрать `defer`, убрать собственную сортировку | -| `pop_cdraw.c` — персонажи | то же: объект вместо слота, привязка к тайлу | -| `pop_bg.c` — `overlay_mid_tile`, `fore_only_tile`, `ceil_over_kid_tile` | вызов из обхода тайлов, а не из отдельного прохода | -| `pop_redraw.c` — пометки | добавить «на этом тайле есть объект» (порт `tile_object_redraw`) | -| `roomtest.c` — главный цикл | вместо трёх проходов один: обход тайлов с объектами внутри | -| окно fore-клипа (`pop_t_fclip_*`) | смысл меняется: клип по тайлу, а не по персонажу | - -Плюс новая структура objtable и её сортировка — но маленькая, на тайл. - ---- - -## 4. Плюсы - -* **Уходят разом** MOB-CLIP-RIGHT, MID-OVERLAY-LAYER и «плита перед - колонной»: все три — следствие отсутствия привязки к тайлу, а не - самостоятельные баги. -* **Уходят подпорки.** Перерисовка соседнего тайла поверх куска, - `defer`, ручная сортировка кусков, отдельный проход `draw_over` — - всё это заменяется одним механизмом. -* **Совпадение с оригиналом по построению.** Дальше любой вопрос «что - поверх чего» решается чтением seg008, а не экспериментом в MAME. -* **Возможный выигрыш по кадру.** Сейчас fore-проход считает окно вокруг - персонажа и всё равно перебирает до девяти тайлов; при привязке к тайлу - передние части рисуются только там, где реально есть помеченный объект. - Но это НАДО ЗАМЕРИТЬ, а не обещать. - ---- - -## 5. Минусы и риски - -* **Риск регресса широкий.** Трогается порядок отрисовки ВСЕГО: Кид, - соперник, меч, брызги, зеркало, куски, оверлеи, полоса потолка. - Уровни 1-11 приняты и держатся на текущем порядке. -* **Наша оптимизация fore-окна может не пережить порт в прежнем виде.** - Она даёт 3.2x на самом дорогом проходе (memory `pop_fore_layer_cost`). - Если привязка к тайлу заставит рисовать передние части шире — можно - потерять больше, чем выиграть. -* **Дабл-буфер.** У оригинала один экран с dirty-rect, у нас две страницы - со своими копиями фона и heal. Пометка «на тайле есть объект» обязана - быть счётчиком страниц, как остальные наши пометки, — иначе объект - перерисуется на одной странице и не перерисуется на другой. -* **Банки.** Отрисовка размазана по трём банкам (`pop_bg` 2, `pop_cdraw` 4, - `pop_room` 7) плюс резидент. Единый обход тайлов с объектами внутри - означает, что цикл обхода зовёт код из всех трёх — надо проверить, что не - упрёмся в границы банков и трамплины. -* **Объём.** Это не правка, а этап: сопоставимо с тем, что делалось для - fore-слоя. - ---- - -## 6. Развилки - -**A. Полный порт** — objtable с привязкой к тайлу, сортировка внутри тайла, -объекты внутри обхода. Максимально близко к оригиналу, максимальный риск и -объём. - -**B. Частичный: только привязать КУСКИ к тайлам.** Персонажей оставить как -есть. Закрывает MOB-CLIP-RIGHT и «плиту перед колонной», не трогает -проверенный порядок персонажей. Дешевле и безопаснее; MID-OVERLAY-LAYER -остаётся. - -**C. Отложить** до этапа BG-ONCE и делать вместе — там всё равно -пересматриваются слои, и два пересмотра подряд дороже одного. - -Рекомендация: **B или C**. Вариант A целиком оправдан только если мы -одновременно берёмся за BG-ONCE — тогда это один пересмотр слоёв вместо -двух, и замер кадра делается один раз. - ---- - -## 7. ЗАМЕРЫ (сделаны 2026-08-13, уровень 13) - -Метод — маркеры-пустышки в РЕЗИДЕНТЕ вокруг измеряемого вызова плюс -брейкпоинты с `printf totalcycles` (memory `z80_profiling_method`). В -банковый код брейкпоинт ставить нельзя: 0xC000 — общее окно всех банков. - -| что | такты | доля логического кадра | -|---|---|---| -| логический кадр целиком | **1 289 526** | 100 % | -| `pop_redraw_needed` | **978** | 0,08 % | -| **fore-проход, ОДИН персонаж** | **128 778** | **10 %** | - -Плюс два счётчика за прогон ~229 логических кадров: - -* fore-проход вызван **10 раз** — на 96 % кадров он не выполняется вовсе - (пропуск неизменившегося персонажа, `pop_char_skip_mask`). Средняя цена - по кадру выходит ~0,4 %, но КАК ТОЛЬКО персонаж движется — платим все 10 % - каждый кадр, и при двух персонажах это ~20 %; -* **максимум объектов на одном тайле = 2** (комната 16, пара из - `loose_fall`: плита сбивает плиту, дальше летят обе). В комнате 23, где - гряда падает в пустоту, максимум 1. - -### 7.1 Что эти числа меняют в оценке - -**Сортировка внутри тайла — бесплатна.** Два объекта, пузырёк на два -элемента. Возражение против варианта A, которое закладывалось в §5, снято. - -**`pop_redraw_needed` можно не считать вовсе.** 978 тактов против 128 778 у -fore-прохода — соотношение 131 к 1. - -**Единственный настоящий риск порта — окно клипа fore-прохода.** Если -привязка объектов к тайлам заставит рисовать передние части шире нынешнего -окна вокруг персонажа, мы потеряем 10 % кадра, и потеряем их НА ДВИЖЕНИИ, -когда бюджет и так самый напряжённый. - -### 7.2 Насколько узко оригинал помечает передний слой — ВЫЯСНЕНО - -Пометки `redraw_frames_fore[]` ставит ровно одна функция — `set_redraw_fore` -(seg007:0550), и зовут её из трёх мест. Ни в одном нет «пометить всё». - -**Персонаж — `redraw_at_char` (seg003:0576).** Помечается ПРЯМОУГОЛЬНИК -футпринта: - -```c -for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row) - for (tile_col = x_col_left; tile_col <= x_col_right; ++tile_col) - set_redraw_fore(get_tilepos(tile_col, tile_row), 1); -``` - -с двумя уточнениями: при вынутом мече прямоугольник расширяется на колонку в -сторону клинка, а для КИДА берётся объединение с футпринтом ПРОШЛОГО кадра -(`prev_char_*`) — чтобы освободившиеся тайлы тоже вернули свои передние -части. - -**Падающий кусок — `draw_mob` (seg007:~1147).** Каждый кадр помечается -СОСЕД СПРАВА (`++tile_col`), и второй тайл, если кусок висит на границе -рядов: - -```c -++tile_col; -tilepos = get_tilepos(tile_col, tile_row); -set_redraw2(tilepos, 1); -set_redraw_fore(tilepos, 1); -top_row = y_to_row_mod4(ypos - 18); -if (top_row != tile_row) { ... то же для top_row ... } -add_mob_to_objtable(ypos); -``` - -**Анимация тайла — `draw_trob` (seg007:01E6):** один тайл. - -**Вывод: пометка переднего слоя в оригинале НЕ ШИРЕ нашего окна.** Она -пообъектная — футпринт персонажа и 1-2 тайла на кусок. Значит полный порт -objtable **не отнимает** нашу оптимизацию fore-окна, а формализует её: -вместо «окно вокруг персонажа» будет «тайлы, помеченные объектами», что -как минимум не шире, а для одиночного куска заметно уже. - -Риск, вокруг которого крутилась вся оценка, снят. - -### 7.3 Побочный результат: готовый рецепт для MOB-CLIP-RIGHT - -`draw_mob` даёт точный ответ на вопрос, как оригинал прячет правую часть -куска за соседним полом: он НЕ рисует сосед поверх куска (наша подпорка) и -НЕ полагается только на `clip.right`. Он помечает соседний тайл СРАЗУ -двумя пометками — `set_redraw2` (фон) и `set_redraw_fore` (передний слой). -Дальше порядок делает всё сам: фон соседа рисуется ДО куска, его передние -части — ПОСЛЕ. - -Это же закрывает и «плиту перед колонной»: передние части соседнего тайла -(колонна) ложатся поверх куска, потому что тайл помечен. - -**Рекомендация после разбора: вариант A (полный порт).** Оба возражения -против него сняты замерами и этим разбором — сортировка внутри тайла -бесплатна (максимум 2 объекта), окно переднего слоя не теряется. diff --git a/applications/PoP/docs/palette_plan.md b/applications/PoP/docs/palette_plan.md deleted file mode 100644 index 8aeed34..0000000 --- a/applications/PoP/docs/palette_plan.md +++ /dev/null @@ -1,297 +0,0 @@ -# План: консолидация работы с палитрами + переход уровня через fade - -Статус: **этапы A и B реализованы; визуальная приёмка полного маршрута ещё -идёт** (2026-08-24). Палитры выделены в bank 10, а renderer cutscene/intro — -в bank 11, чтобы не переполнять bank 9 оболочки. -Обсуждение велось вокруг `roomtest/` (банк 9 — оболочка, fade из `pop_ui.c`). - ---- - -## 1. Текущее состояние: карта палитры - -Палитра Sprinter — 256 записей по 4 байта (B, G, R, 0) = 1 КБ на страницу. -У страниц дабл-буфера ДВЕ раздельные палитры (`gfx_pal_load(0,…)` и -`gfx_pal_load(1,…)` — почти всегда парой). BIOS читает буферы только из -#4000–#BFFF: банковую rodata напрямую отдавать нельзя (копия в стек/W2), -см. грабли `pop_guard_set_palette` и `bg_load_tile_pal`. - -### 1.1 Игровая палитра `KID\kid.pal` — раскладка слотов - -Собирается `toolchain/pop_pack_kid.py build_palette()`, грузится одним -`gfx_pal_fload` (перезаписывает все 256 записей). Атласы запекались под эти -индексы — менять раскладку нельзя без перепаковки ассетов. - -| Слоты | Назначение | Источник | Динамика | -|---|---|---|---| -| 0x00 | Цвет фона + **вспышка молнии** (подмена записи 0, `flash_bg` ← do_flash/set_bg_attr SDLPoP) | — | меняется в игре | -| 0x01–0x2F | Не закреплены (нули) | — | свободно | -| 0x30–0x3F | VGA16 — базовые 16 цветов для mono-блитов: пламя факелов, пузырьки зелья (+12 красный «лечение», +10 зелёный, +9 синий), кровь чомпера (12), дворцовая кладка mono (+6) | `VGA16[]` | статично | -| ↳ 0x37–0x3F | Поддиапазон **UI**: текст/рамка меню; единственное, что `keep_ui` не затемняет (`MENU_BORDER`=0x37) | — | — | -| 0x40–0x4F | chtab_1 пламя/зелья (`POT_PAL_BASE`) | VDUNGEON res150.pal | статично | -| 0x50–0x5F | **ENV фон тайлсета** (`POP_PAL_ENV`) | res200.pal набора | **меняется при смене тайлсета** | -| 0x60–0x6F | **WALL тайлсета** (`POP_PAL_WALL`) | res360.pal набора | **меняется при смене тайлсета** | -| 0x70–0x7F | Kid (`PAL_BASE`) | KID res400.pal | статично | -| 0x80–0x8F | Меч chtab_0 (`SWORD_PAL_BASE`) | POT res700.pal | статично | -| 0x90–0x9F | Страж chtab_5 (`GUARD_PAL_BASE`) | res10.bin guard_palettes | **меняется по КОМНАТАМ** | -| 0xA0–0xAF | Тень (`POP_SHADOW_PAL_BASE`) | RGB-сетка pop_pack_shadow.py | статично | -| 0xB0–0xFF | Свободны (5 слотов) | — | — | - -Итого динамических зон три: запись 0 (молния), env+wall (тип здания), -стражи (per-room). Всё остальное одинаково всю игру. - -### 1.2 Полноэкранные палитры заставок - -Каждая перезаписывает ВСЕ 256 записей: - -| Файл | Где используется | -|---|---| -| `KID\kid.pal` (+ fallback `a:\kid.pal`) | BOOT и возврат в игру после заставок | -| `TITLE\title.pal` | экран TITLE | -| `PV\story.pal` | INTRO и HALL_OF_FAME (одна палитра на обе фазы) | - -### 1.3 Тайлсеты: подземелье ↔ дворец - -Оба набора используют ОДНИ И ТЕ ЖЕ слоты 0x50–0x5F/0x60–0x6F, заполняя их -разными цветами (атласы обоих наборов запекались под эти индексы). -Переключение = загрузка 64 байт (32 записи env+wall) в обе страницы -(`bg_load_tile_pal`); остальные 224 записи не трогаются. - -Какие уровни дворец — `tbl_level_type` (`pop_level_cold.c:44`): -**4, 5, 6, 10, 11, 14**; остальные подземелье. - -Палитра дворца `pal_tile.pal` (расшифровка, формат записи B,G,R): - -ENV 0x50–0x5F (пол, ковры, факелы, ворота, пики, арки): - -| Слот | RGB | | Слот | RGB | -|---|---|---|---|---| -| 50 | 0,0,0 чёрный | | 58 | 202,190,178 серо-бежевый | -| 51 | 121,89,60 коричневый | | 59 | 153,133,129 серо-лиловый | -| 52 | 161,121,76 светло-коричневый | | 5A | 76,64,56 тёмный серо-бурый | -| 53 | 194,149,89 песочный | | 5B | 153,97,89 кирпично-красный | -| 54 | 230,178,113 яркий песок | | 5C | 137,80,72 тёмный кирпич | -| 55 | 246,202,125 кремовый | | 5D | 48,125,125 бирюзовый | -| 56 | 255,234,170 бледно-кремовый | | 5E | 12,56,89 тёмно-синий | -| 57 | 255,255,255 белый | | 5F | 202,56,28 красно-оранжевый | - -WALL 0x60–0x6F (вся палитра песочная): 61=(218,170,89), 62=(226,165,93), -63=(226,170,97), 64=(218,161,85), 65=белый, 66=(226,165,93), 67=(218,165,89), -68=(226,170,89), 69=(218,170,97), 6A=(255,210,137), 6B=(255,218,149), -6C=(255,210,137), 6D=(255,218,145), 6E=(194,153,80 тёмный песок), -6F=(238,186,117). - -Чем рисуется во дворце: -- **Тело стены — НЕ спрайты**, а сплошные заливки; цвет разыгрывается на - комнату prandom'ом (`gen_palace_wall_colors`, `pop_bg.c:140`, порт - seg000:1942): подряды 1 и 3 берут случайный из 0x61–0x64, подряды 0 и 2 — - из 0x66–0x69; соседи по горизонтали не повторяются. -- Декор стен id 3–17 — mono-силуэт цветом VGA16+6 (0x36). -- Верх дверных проёмов дворца — спец-id 78–84 + полоса 145 («полоса под - окнами», pop_room.c:478). -- Остальное (пол, ковры, порталы-факелы, ворота, пики) — env-куски - pal_env*.atl с ENV-таблицей выше. - -### 1.4 Стражи (0x90–0x9F) - -Цвет задаётся на КОМНАТУ (`level.guards_color[room-1]`), при входе в -комнату зовётся `pop_guard_set_palette(color)` ДО отрисовки (слоты общие -на экран — смена посреди кадра дала бы стража в новой палитре с полосой HP -в старой). Только для обычных стражей (`tbl_guard_type == 0`): скелет и -Джафар имеют собственную палитру, зашитую в kid.pal; им зовётся с color=0 -(не трогать — иначе Джафар на ур.13 покрасился бы в цвет стража своей -комнаты). Внутри одного уровня слоты могут перезаписываться многократно. - -## 2. Текущее состояние: механика fade - -### 2.1 Наша реализация (`pop_ui.c`, банк 9) - -- `pop_ui_palette_snapshot()` — снимок всех 256 записей через - `gfx_pal_get` по 4 чанкам × 64; хранится в хвосте страницы шрифта - FONT.ATL ([0x3C00,0x4000)), map/unmap W0. Требует `font_ready`. -- `pop_ui_palette_dim(step, keep_ui)` — готовит ОБЕ экранные палитры из - снимка. Шкала без умножений (только сдвиги): - -| Шаг | Формула на канал | Яркость | -|---|---|---| -| 0 | x | оригинал | -| 1 | `(x>>1)+(x>>2)` | ≈3/4 | -| 2 | `x>>1` | 1/2 | -| 3 | `x>>2` | 1/4 | -| 4 | 0 | чёрный | - - `keep_ui` пропускает 0x37–0x3F (меню остаётся ярким). -- `pop_ui_fade_out/in(steps)` — проигрывание ступеней за `steps` кадров - vsync (`step = i*4/steps`, целочисленно): steps=4 — канонический (по кадру - на ступень), steps<4 — перескакивает ступени, steps>4 — повторяет (плавнее), - steps=0 у fade_in — мгновенный restore. -- Контракт map/unmap: обращения к EMM/W0 и BIOS-палитре строго после unmap. - -Стоимость одного dim ≈ 15–25 тыс. тактов (~4–7 мс при 3.5 МГц) — -укладывается в кадр vsync, на практике лагов нет. - -### 2.2 Как сделано в SDLPoP (seg009.c, USE_FADE/gmMcgaVga) - -- fade_out: каждый кадр КАЖДЫЙ ненулевой канал каждой записи −1; до нуля. -- fade_in: `fade_pos` от 0x40 вниз; канал +1, пока меньше оригинала. -- Уровней затемнения до 63–64 (VGA-канал 6 бит), полный фейд ~63 кадра × - wait_time=2 тика — медленно и кинематографично. -- `which_rows` — битовая маска групп по 16 записей: можно фейдить часть - палитры (в оригинале используется). -- По завершении принудительно восстанавливается оригинал; после out экран - заливается чёрным. - -Это осознанное расхождение (скорость/такты vs плавность) — ЗАПИСАТЬ в -`docs/impl_diff.md` (сейчас записи нет). - -## 3. Зафиксированные решения - -1. **Ступени затемнения: остаются 4.** Вариант 8 ступеней той же сдвиговой - техникой — рассмотреть отдельно, сейчас не внедрять. -2. **Предрасчёт fade-вариантов палитры отклонён.** Аргументы: чтение файла - с диска на порядок дороже вычисления; 3–7 КБ постоянной RAM при - MEMORY=small непозволительны; предрасчёт привязан к конкретным палитрам, - а снимок работает с любой текущей автоматически; keep_ui удвоил бы набор. -3. **Считать на лету**, хранить один снимок (уже есть, бесплатно в хвосте - страницы шрифта). -4. **Буферы на стеке**, не статика (W1/W2 мало) и не 1 КБ: обнулить 64/256 - байт дешевле, чем держать килобайт резидентно. -5. **Контракт `gfx_pal_load(pal, start, count, data)`**: count — число - СЛОТОВ, буфер обязан быть `count*4` байт; count=0 означает «все 256». -6. **Leaf-applеры остаются на месте** (`pop_bg_pal_apply` — банк 7 со своими - таблицами, `pop_shadow_pal_apply`, `pop_guard_set_palette`): банковая - rodata чужого банка не видна, перенос сломал бы доступ к данным. -7. **Молния (`flash_bg` в roomtest.c) не переносится** — игровой эффект - записи 0; после вспышки восстановление записи 0 из снимка ложится на API. -8. Модель состояния: разделены «какая палитра логически загружена» (load_*) - и «с какой яркостью показана» (apply/fade). Любой load_* обновляет снимок; - apply/fade показывает его с нужной глубиной. Это позволяет грузить новую - палитру «в темноте» (экран остаётся чёрным, пока не позвали apply/fade_in). - -## 4. Целевой API `pop_pal.c/.h` (банк 9) - -```c -/* сброс */ -void pop_pal_black(void) __banked; -/* все 256 записей ОБЕИХ страниц = 0. Стековый buf[256], обнуление циклом, - * 8 вызовов gfx_pal_load (4 чанка × 2 страницы, паттерн как в dim). - * Зовётся СРАЗУ ПОСЛЕ initgraph в pop_boot (раньше нельзя — нет гарантий - * состояния графического режима): закрывает кейс «мусор/палитра предыдущей - * программы при включении графики». СНИМОК НЕ ТРОГАЕТ (контракт: - * чёрный экран без изменения логической палитры). */ - -/* загрузка (пишет полную палитру в обе страницы + refresh снимка; - * видимую яркость НЕ трогают — экран меняется только по apply/fade) */ -void pop_pal_file_load(const char *name) __banked; -/* gfx_pal_fload + fallback "a:\" + gfx_pal_sync (fallback сегодня - * скопирован в каждом из ~6 мест вызова) */ - -void pop_pal_game_load(void) __banked; -/* file_load("KID\kid.pal") + pop_bg_pal_apply + pop_shadow_pal_apply. - * Сегодня тройка скопирована 3 раза (roomtest_cold ~958, pop_title ~88, - * pop_intro ~183). Единое место инварианта «kid.pal затирает слоты - * тайлсета 0x50..0x6F и тени 0xA0..0xAF». */ - -void pop_pal_level_load(uint8_t full) __banked; -/* палитра уровня: kid.pal/shadow + tileset 0x50..0x6F если набор сменился - * (сравнение через pop_level_type()). full=1 — ПРИНУДИТЕЛЬНО перечитать - * kid.pal/shadow (один экспорт с флагом, не две функции — меньше банковых - * точек входа). СТРАЖЕЙ (0x90..0x9F) НЕ включает: это компетенция входа - * в комнату (pop_guard_set_palette до первого draw). */ - -void pop_pal_story_load(void) __banked; /* PV\story.pal (INTRO и HOF — файл один, функция одна) */ -void pop_pal_title_load(void) __banked; /* TITLE\title.pal */ - -/* отображение */ -void pop_pal_snapshot(void) __banked; /* переезд из pop_ui, тело то же */ -void pop_pal_apply(uint8_t fade) __banked; /* = dim(fade, 0), 0..4 */ -void pop_pal_fade_in(uint8_t steps) __banked; /* переезд из pop_ui */ -void pop_pal_fade_out(uint8_t steps) __banked; - -/* меню продолжает звать низкоуровневый dim(step, keep_ui=1) — отдельный - * тонкий экспорт, чтобы не тащить флаг в горячий apply. Старые имена - * pop_ui_palette_* / pop_ui_fade_* УДАЛЯЮТСЯ (без алиасов — меньше - * экспорта банка). */ -``` - -Соответствие старое→новое: snapshot→snapshot, restore→apply(0), -fade_out/in→fade_out/in, тройка kid.pal×3→game_load, fload+fallback+sync×6→file_load. - -## 5. Этап A: рефакторинг — выполнен (2026-08-24) - -1. Создан `roomtest/pop_pal.c/.h` в **bank 10**, добавлен в Makefile. - Он владеет политикой `load logical palette → snapshot → apply brightness`. - Низкоуровневые snapshot/dim/fade остаются физически в `pop_ui.c`: там - владелец страницы FONT.ATL, где лежит снимок; наружу они доступны только - через `pop_pal`. -2. Заменены call-sites: - - `roomtest_cold.c` ~958: black → game_load вместо тройки; - - `pop_title.c` title_restore_game_palette → game_load; загрузка title.pal → title_load; - - `pop_intro.c` intro_load/intro_restore → story_load/game_load; - - `pop_hof.c` (2 × story.pal) → story_load; - - `pop_menu.c`: fade/dim → новые имена (dim с keep_ui — низкоуровневый экспорт); - - `roomtest.c` demo-start (snapshot+dim(4,0)+fade_in(4)) → новый API. -3. Старые вызовы не остаются в коде приложения; внутренние функции `pop_ui` - сохранены как реализации одного владельца памяти снимка. -4. Сборка и host-тесты пройдены. `make size-check` неприменим: меняется - приложение, а не libc/libbgi. -5. MAME smoke-тест полного цикла смен палитр: boot → title (title.pal + - fade) → intro (story/kid) → demo fade-in → игра → HOF (story.pal). - Проверить: отсутствие мусора при включении графики (эффект black), - меню с keep_ui остаётся ярким при затемнении, молния (запись 0) - восстанавливается. - -## 6. Этап B: переход уровня через fade — реализован, ждёт визуальной приёмки - -Сценарий (обсуждён, детали уточнить по SDLPoP перед реализацией — как -оригинал делает смену уровня, есть ли там fade в DOS-версии): - -``` -fade_out // последний кадр уровня N темнеет -рисуем комнату 1 уровня N+1 // во ВТОРУЮ страницу, в темноте -pop_pal_level_load(full=0) // новая палитра: железо+снимок обновлены, - // экран всё ещё чёрный -флип + копия второй страницы обратно в первую -fade_in // = анимированный apply 3→2→1→0 -``` - -Экономия: реально переезжают только 32 записи (env/wall) при смене набора -dungeon↔palace; guards_color обновит вход в комнату. Kid/shadow не меняются -— потому full=0. - -Реализация находится в `roomtest.c` / `roomtest_cold.c`: последний кадр -уровня N темнеет, `pop_level_switch()` подготавливает первый кадр N+1 и -обновляет логический источник через `pop_pal_level_load(1)`, затем главный -цикл показывает кадр только через fade-in. Восемь ступеней и отдельная -анимация смерти не входят в этот этап. - -**Этап B закрывает два открытых бага** (разборы — `roomtest/BUGS_OPEN.md`): -- [PAL-L1-AFTER-INTRO] — вход в игру на уровень 1 после интро с чёрным - экраном (маршрут demo_new_game; корень не установлен, воспроизведение - нестабильно); -- [PAL-DUNGEON-STALE] — переход 3→4 оставляет подземную палитру (корень - ясен: fade_in восстанавливает из снимка, снятого ДО загрузки тайлсета - дворца; быстрый фикс `fade_in_pending` 2026-08-23 сам же и проявляет этот - дефект модели). - -Быстрый фикс 2026-08-23 (маршрут CUTSCENE → LEVEL_LOAD → PLAYING, -`fade_in_pending` + `pop_ui_fade_in(4)` после `pop_level_switch`) закрыл -чёрный экран на переходах с pre-cutscene внутри подземелья (1→2), но модель -«кто и когда меняет яркость» остаётся разношёрстной — её и приводит в -порядок этап B. - -## 7. Этап C: документирование - -- Запись в `docs/impl_diff.md`: наши 4 ступени vs SDLPoP ~64 (что делает - оригинал, что делаем мы — сдвиговая шкала ради тактов, чем платим — - грубее градации, что проверять при регрессе). -- После этапа B — дополнить запись про сам переход. - -## 8. Не трогаем - -- Молнию (`flash_bg`, roomtest.c) — включая обход SDCC-бага - `gfx_pal_set(0,0,0,0,0)` → ручные `gfx_pal_set(0/1, 0, r,g,b)`; -- leaf-applеры: `pop_bg_pal_apply` (банк 7), `pop_shadow_pal_apply`, - `pop_guard_set_palette` (данные своих модулей); -- хранилище снимка в хвосте страницы шрифта FONT.ATL (бесплатное место, - guard `font_ready`); -- раскладку слотов 0x00–0xAF (зафиксирована атласами). diff --git a/applications/PoP/docs/perf_backlog.md b/applications/PoP/docs/perf_backlog.md deleted file mode 100644 index 0789b7a..0000000 --- a/applications/PoP/docs/perf_backlog.md +++ /dev/null @@ -1,335 +0,0 @@ -# Оптимизация отрисовки — что НЕ сделано (замеры на 2026-08-10) - -Список отложенных идей с измеренной ценой. Всё измерено брейкпоинтами в -MAME (`z80_profiling_method`) на роомтесте, уровень 1 комната 1. - -Прежде чем брать что-то отсюда — перечитать «Как мерить» ниже: половина -прошлых гипотез не подтвердилась, и подтвердились не те, что казались -очевидными. - -## Как мерить (иначе цифры не сходятся) - -- **Такт `totalcycles` ≠ номинальный T-такт Z80.** У ОЗУ Sprinter - wait-state'ы, замеренная стоимость ≈ **2,4× справочной** (`get_tile`: 574 - против 1 422). Считать по таблице тактов нельзя. Подробности — - memory `sprinter_wait_states_2x`. -- **Растровый кадр = 430 000 тактов.** Главный цикл спейсится тремя - `gfx_wait_vsync`, поэтому работа сверх 430 000 стоит СРАЗУ целый лишний - кадр. Граница дискретная: 3 растровых кадра на логический или 4. -- **Адреса символов меняются после КАЖДОЙ пересборки** (`roomtest.map`, - `bank*_*.sym`). Маркер со старым адресом молча не срабатывает, и разбивка - выглядит правдоподобно, но врёт. -- **Сцена между сессиями не воспроизводится точно**: позиция Кида до - пикселя, состояние плиты (2,6), фаза факелов. Сравнивать «до/после» можно - только по ОДНОЙ функции с одинаковыми входами, а не по общей работе за - кадр. -- Кто делит: брейкпоинт на `__divsint`/`__divuint`/`__divuchar` с печатью - адреса возврата — `bpset ,1,{printf "ret=%04X\n",w@(sp); g}`. Если - адрес возврата в банке (>= 0xC000), поставить тот же брейкпоинт с условием - `w@(sp)==<адрес>` и БЕЗ `g`: машина встанет с нужным банком в окне, и - `dasm` покажет вызывающего. -- **Брейкпоинт по адресу в банке ловит ВСЕ банки.** 0xC000..0xFFFF — общее - окно, и один и тот же адрес есть у семи модулей сразу. Либо ловить через - трамплин (`hl==<адрес>&&(de&0xff)==<банк>`), либо перепроверять, что - срабатывания идут из нужной фазы: иначе в интервал попадает чужой код и - цифры врут (так я намерил несуществующие 134 730 тактов в прологе - `pop_char_fore`). -- Трасса вызовов графики с параметрами: скрипт в истории сессии, ставит - маркеры фаз на трамплин `___sdcc_bcall_ehl` (условие `hl==<адрес>&&(de&0xff)==<банк>`) - и брейкпоинты на листья libbgi с печатью аргументов - (`__sdcccall(1)`: arg1 = HL, arg2 = DE, дальше стек с sp+2). - -## Профиль на 2026-08-10 - -Сцена: комната 1, два факела, стража нет. - -| сцена | работа за кадр | период | -|---|---|---| -| Кид в покое, факел не задет (пропуск работает) | 244 026 (57 %) | 3 кадра | -| Кид стоит на факеле (перерисовывается каждый кадр) | 366 240 (85 %) | 3 кадра | -| Кид в щебне (2,4), движется | ~357 000 (83 %) | 3 кадра | -| Кид (0,5) в движении | 421 254 (98 %) | **4 кадра** | - -Одна перерисовка персонажа = **~137 000 тактов = 32 % растрового кадра**, -из них полезной работы (heal 20×19 + спрайт 12×41) — меньше трети. - -## Профиль дворца (уровень 4) на 2026-08-10 - -Сцена: уровень 4, Кид НЕПОДВИЖНО стоит на (1,7) (комната с решёткой), -стража нет. Разбивка одного логического кадра брейкпоинтами на границах -фаз (адреса `PROF()` из `roomtest.lst` + базы `_CODE = 0x42AD`): - -| фаза | тактов | доля работы | -|---|---:|---:| -| ввод + читы + heal | 59 340 | 11 % | -| логика (kid_tick, phys_tick, страж, боёвка) | 85 356 | 16 % | -| `pop_loose_tick` | 27 396 | 5 % | -| `pop_process_trobs` | 106 107 | 21 % | -| `pop_redraw_needed` | 447 | — | -| шов / смена уровня / вспышка | 5 448 | 1 % | -| `guard_over_kid` + `pop_char_skip_mask` | 4 788 | 1 % | -| `pop_char_draw(KID)` | 52 206 | 10 % | -| соперник + `loose_mob_draw_over` + `hp_draw` | 4 086 | 1 % | -| **`pop_char_fore(KID)`** | **171 693** | **33 %** | -| `pop_room_clip_borders` + прочее | 742 | — | -| **ИТОГО работа** | **517 609** | 120 % растрового кадра → период **4 кадра** | - -По цветам бордюра: синий (`PROF(2)`) 144 696 (28 %), зелёный (`PROF(4)`) -139 398 (27 %), циан (`PROF(6)`) 233 515 (45 % работы = 54 % растрового -кадра, начинается на 74 % первого кадра и кончается на 123 %). - -## СДЕЛАНО 2026-08-10: метка «фон трогали» стала маской ТАЙЛОВ - -Было: один union-прямоугольник на страницу. Три факела трогают по пятну -16x18 в колонках 1, 6 и 8, а их объединение — полоса `x 40..280` на всю -комнату; Кид, стоящий где угодно между крайними факелами, в неё попадал и -перерисовывался каждый кадр со всем fore-проходом. - -Стало: `uint16_t pop_cd_dmask[2][3]` — бит на колонку, слово на ряд, набор на -страницу. Колонка берётся сдвигом (`x >> 5`), ряд — цепочкой сравнений; -проверка в `cd_quiet` — три `AND` через резидентный `pop_cd_hit`. - -Гранулярность тайла — это гранулярность ОРИГИНАЛА: пометки там тоже по -тайлам (`redraw_frames_anim[tilepos]`, `set_wipe`), персонажи привязаны к -тайлу через `tile_object_redraw[tilepos]`, а единственное подтайловое -уточнение (`wipe_heights`) — по высоте, не по ширине. Полутайл (16 px) не дал -бы ничего: пламя рисуется с отступом 8 px и шириной 16, то есть занимает -середину тайла и задевает обе половины. - -Замер на той же сцене, где снимался профиль ниже (Кид неподвижно на (1,7)): - -| | было | стало | -|---|---:|---:| -| циан (спрайты + fore) | 233 515 | **24 781** | -| работа за кадр | 517 609 | **306 553** | -| период | 4 растровых кадра | **3** | - ---- - -## СДЕЛАНО 2026-08-10: деление в луче видимости стража (Кид у шва) - -`tile_at_kid` (`guards.c`) считала колонку честным `/` и `%`, тогда как везде -уже стоит резидентная таблица `POP_TILE_DIV` (это и есть `tile_div_tbl` -оригинала). У SDCC z80 это `__divsint` плюс `__modsint`, а тот внутри снова -зовёт `__divsint` — ~5 400 тактов на вызов. - -Зовут её В ЦИКЛЕ по колонкам между стражем и Кидом -(`check_can_guard_see_kid`, seg003:761). Когда Кид стоит У ШВА, его -`curr_col = −1`, луч тянется через всю комнату, и за кадр набегало ВОСЕМЬ пар -делений — около 43 000 тактов, 10 % растрового кадра, в фазе ЛОГИКИ. - -Замер: брейкпоинт на `__divsint` с печатью адреса возврата дал `ret=C033` -восемь раз за кадр; остановка на нём и дизассемблирование с правильным банком -показали `HL−65`, `ld de,#14`, `call __divsint` по смещению 0x24 банка 1 — -`tile_at_kid`. После фикса пар `C033` не остаётся ни одной. - -**Заодно снята ложная тревога.** В прошлом замере я записал, что на шве -пролог `pop_char_fore` разбухает до 134 730 тактов. Это была ошибка зонда: -брейкпоинт на `fore_tile` стоял по адресу, который совпадает с кодом ДРУГИХ -банков, и в интервал попадали чужие срабатывания. Чистый замер (Кид в -колонке 0, спрайт свисает за левый край, окно `x −8..5`): пролог **16 950** — -ровно как в середине комнаты, весь fore-проход 41 803, `pop_room_clip_borders` -14 364. Урок в «Как мерить» выше: адрес в банке нужно либо проверять на -уникальность, либо ловить через трамплин с условием на банк. - ---- - -## 0. Дворцовая кладка в fore-проходе — **СДЕЛАНО 2026-08-10** - -Все три шага выполнены; замер после — в конце пункта. Ниже сохранён исходный -разбор: он объясняет, почему предфильтра `fore_tile` мало и откуда взялись -габариты кусков. - -**Было: 139 863 такта за кадр (32 % растрового кадра), полезных пикселей — -ровно ноль.** - -Замер (уровень 4, Кид на (1,7)). Окно fore-клипа в этот момент — -`x 229..241, y 106..147` (прочитано из `pop_t_fclip_*` брейкпоинтом). -`pop_fore_over_char` обходит 6 тайлов: - -| тайл | тактов | -|---|---:| -| (0,6) (0,7) (1,6) (1,7) | 2 800 – 4 600 каждый | -| **(2,6) — стена** | **74 310** | -| **(2,7) — стена** | **65 553** | - -Ряд 2 этой комнаты — стена, и он лежит ПОД ногами Кида, то есть попадает в -его fore-окно всегда. Внутри одного тайла стены `wall_pattern_palace` -делает 6 × `wpp_fill` (≈ 3 100 каждый) + 5 × `pop_wall_b` (≈ 9 760 каждый) -≈ 60 000 тактов. - -Ни один кусок в окно не попадает: -- верхняя заливка стоит на `dmy - 59 = 157`, окно кончается на `y = 147`; - все остальные куски ещё ниже; -- тайл (2,6) занимает `x 192..223`, окно начинается с `x = 229` — он - промахивается и по горизонтали тоже. - -Тайл всё равно проходит, потому что предфильтр в `fore_tile` (pop_bg.c, -`x0 < fclip_x1 && x0 + 40 > fclip_x0 && y0 - 8 < fclip_y1 && y0 + 70 > -fclip_y0`) намеренно грубый — габарит 40×78 на тайл. Дальше `wpp_fill` -честно режет по окну и выходит с пустым прямоугольником, но 3 100 тактов на -арифметику клипа уже потрачены, а `pop_wall_b` о существовании окна не знает -вовсе: он идёт в `atlas_image` + `gfx_w0_map`, читает `w`/`h` и только там -обнаруживает, что рисовать нечего. - -Что делать (по возрастанию объёма): -1. **Ранний выход из `wall_pattern_palace`**: самый верхний пиксель узора — - `dmy - 59`, самый нижний — `dby + высота нижнего декаля`. Один - `if (pop_t_fclip_on && (fclip_y1 <= dmy - 59 || fclip_y0 > dby + h)) - return;` плюс такая же проверка по `x` убивает оба тайла целиком почти - даром. -2. Прогнать `pop_wall_b` в этом узоре через ту же проверку окна, что уже - есть у `wpp_fill` (нужны размеры кусков — см. п. 2 ниже, «размеры из - каталога атласа»). -3. Сузить сам предфильтр `fore_tile` до реального габарита узора вместо - 40×78 — тогда лечится не только дворец. - -Порядок в подземелье тот же, но дешевле: `wall_pattern` в подземелье делает -до 3 блитов и ни одной заливки (~29 000 на тайл против ~60 000). Это же -объясняет, почему после перехода на дворцовый тайлсет период вырос. - -Сверено с SDLPoP (`seg008.c:1943 wall_pattern`, ветка -`!is_dungeon && GRAPHICS_VGA`): состав узора у нас дословный — 5 -`add_wipetable` + 4 декаля + нижняя заливка + нижний декаль. Расходимся не -составом, а тем, что оригинал складывает всё в `foretable` и рисует одним -`draw_table()`, у которого «посетить тайл» стоит копейки (см. п. 6). - -### Что сделано и сколько дало - -1. **Ранний выход** из `wall_pattern_palace` по окну fore-клипа (узор целиком - в `x [xh*8, xh*8+32)`, `y [dmy−59, dby]`). -2. **Отсев каждого декаля** (`wp_blit`) по реальному габариту вместо - заведомо большего 64×64 в `pop_blit_b`. Размеры сняты из каталогов - атласов: `pal_wall.atl` — группы 3..5 = 8×7, 6..8 и 9..11 = 32×12, - 12..14 = 30×5, 15..17 = 32×3. -3. **То же для ПОДЗЕМЕЛЬЯ**: ранний выход `wall_pattern` (габарит там выше — - левая марка уходит на `dby+POP_YOFF−67`) плюс `wp_blit` на RNDBLOCK - (32×21), обоих разделителях (9×21) и обеих марках (`pop_wall.atl`: - 16/17 = 7×10, 14/15 = 14×5). - -Замер: уровень 4, комната 18, Кид сдвигается читом `]` по пикселю (skip -выключен, идёт полный путь), в fore-окне ШЕСТЬ тайлов, ТРИ из них — -дворцовая стена. - -| участок | тактов | -|---|---:| -| пролог `pop_char_fore` до первого `fore_tile` | 17 208 | -| обычный тайл | 4 000 – 4 600 | -| **тайл стены (было 60 000 – 74 000)** | **~12 700** | -| хвост + чистка бортов | 6 055 | -| **fore-проход целиком (было 171 693)** | **70 681** | - -Кадр целиком в этой сцене: работа **419 839**, период **3** растровых кадра -(было 517 609 и 4). - -Остаток в проходе — пролог 17 208, это уже пункт 1 ниже (футпринт из физики). -Отдельная находка: когда Кид стоит НА ШВЕ (окно `x −8..5`), пролог разбухает -до **134 730** — 86 % прохода; причина не разобрана, см. пункт 1. - ---- - -## 1. Футпринт персонажа — брать из физики, а не считать заново - -**Цена: 11 574 такта на каждый fore-проход** (от входа в `char_footprint` до -первого `fore_tile`). - -`redraw_at_char` (seg003:0430) берёт ГОТОВЫЕ `char_col_left/right`, -`char_top_row`, `char_bottom_row` — их в этом же кадре посчитала физика -(`set_char_collision`, seg006:0723). У нас `char_footprint` (pop_bg.c) -считает их заново внутри fore-прохода. - -Мешает то, что физика (банк 3) держит их в статиках, а слой фона — банк 2. -Надо опубликовать их так же, как уже опубликованы `pop_cd[who].fpx/fpy/fpw/fph`. - -**Заодно:** оригинал расширяет футпринт ТОЛЬКО на одну колонку при вынутом -мече и объединяет с футпринтом ПРОШЛОГО кадра (`prev_char_col_left/right`). -Мы вместо этого расширяем окном fore-клипа и посещаем 6 тайлов там, где -оригинал посетил бы 4. Разница видна в замере: fore-проход стоит 58 764 -там, где реально рисует, и **112 758 там, где не рисует ничего** — вся -разница в числе посещённых тайлов. - -Осторожно: окно клипа заводилось под клинок и брызги (они уходят -вперёд-вверх за габарит кадра). Менять — с прогоном боя и падений. - -## 2. Размеры ленты — из каталога атласа, а не через окно 0 - -**Цена: ~750 тактов на `atlas_image` + часть из 6 396 на «чтение w/h и -арифметика клипа», на КАЖДЫЙ блит фона.** - -Сейчас `pop_blit_b`, чтобы узнать размер куска, зовёт `atlas_image` (тот -мапит страницу в W3, читает запись каталога, возвращает W3 назад), потом -`gfx_w0_map` и читает `w`/`h` из шапки ленты. - -А размеры **уже лежат в каталоге**: запись 8 байт — `offset u16, fw u8, -fh u8, nx u8, ny u8, резерв u16`, и у всех фоновых лент `nx = ny = 1`, то -есть `fw`/`fh` в точности равны `w`/`h` из шапки (проверено по -`pop_env0.atl`). `atlas_image` их читает и выбрасывает. - -Вариант A (0 байт памяти): `atlas_image_wh()` рядом с `atlas_image` — -вернуть заодно размер. -Вариант B (без маппинга вовсе): снять каталоги при загрузке в резидентную -таблицу. Объём: фон (env0-4 + wall + fore + pot) = **313 лент**, по 2 байта -= **626 Б**; всё вместе с Кидом и стражем = 600 лент = 1200 Б. Свободной -кучи на 2026-08-10 — 2873 Б. - -Ожидаемый выигрыш скромный: ~2 000–3 000 из ~16 000 накладных на блит. - -## 3. Один `gfx_w0_map`/`unmap` на группу блитов - -**Цена: ~5 500 тактов на блит** (unmap плюс возвраты по цепочке -`pop_pot_b` → `pop_blit_b` → трамплин). - -Куски одного прохода часто лежат на одной странице атласа, а мапим и -размапливаем на каждый. Мешает то, что `pop_blit_b` — общий лист для всех -вызывающих; нужна форма «открыть страницу, N блитов, закрыть». - -## 4. Единый проход по тайлам вместо трёх - -У оригинала за кадр ОДИН обход тайлов — `redraw_needed_tiles` (seg008): -контекст тайла (`curr_tile`, `curr_modifier`, `draw_xh`, `draw_main_y`) -ставится по разу на тайл в `load_curr_and_left_tile`, а `redraw_needed` -смотрит **семь** независимых счётчиков (`wipe_frames`, `redraw_frames_full`, -`redraw_frames_anim`, `redraw_frames2`, `redraw_frames_floor_overlay`, -`redraw_frames_fore`, `tile_object_redraw`) и делает только помеченное. - -У нас **три** обхода: `pop_redraw_needed`, `pop_process_trobs` и -`pop_fore_over_char`. Плюс один `kind` на тайл вместо семи счётчиков — две -разные причины перерисовки одного тайла конфликтуют. - -Это большой рефакторинг всего слоя фона; браться только если понадобится -ещё заметный запас. - -## 5. objtable: персонажи, привязанные к тайлу - -Оригинал кладёт персонажей в `objtable` и рисует их в -`draw_objtable_items_at_tile(tilepos)` во время обхода тайлов — порядок -окклюзии получается сам. У нас отдельный fore-проход НА КАЖДОГО персонажа. -Со вторым персонажем (страж) цена удваивается. - -## 6. Отложенные таблицы back/mid/fore - -`add_backtable`/`add_midtable`/`add_foretable` только КЛАДУТ запись в массив, -рисование — один `draw_table()` в конце. Поэтому «посетить тайл» у -оригинала стоит копейки. У нас блит идёт сразу из обхода. - -## 7. Мелочи с известной ценой - -| что | цена | где | -|---|---|---| -| `pop_clip_char_top` — трамплин банк 4 → банк 3 ради одной проверки тайла над головой | 8 892 | `pop_cdraw.c` / `pop_map.c` | -| `pop_loose_tick` при полном отсутствии падающих плит в комнате | 27 438 | `pop_map.c` | -| `obj_x * 8 / 7` — единственное оставшееся `__divsint` в горячем пути | ~2 400 | `pop_char_draw` | -| `cd_sig_make` + возврат из `pop_char_draw` | 7 944 | `pop_cdraw.c` | -| `pop_loadkid` + расчёт координат кадра | 7 410 | `pop_cdraw.c` | - -## Что уже проверено и НЕ сработало - -- **Маска «у тайла есть передний слой» (`FORE_ANY`) + контекст тайла один - раз.** Сделано (коммит `a9f4521`), эффект **нулевой**: в футпринте Кида - тайлы почти всегда С передним слоем, а снятое второе чтение кода съедено - проверкой маски. Оставлено как сближение с оригиналом. -- **«Быстрый путь для окна коллизии целиком внутри комнаты».** Не - срабатывал почти никогда: Кид в колонке 0 даёт окно с −1. Заменён на - разбиение окна на непрерывные пробеги. -- **Флаг «фон трогали» вместо позиционной метки** — нулевой выигрыш, - факелы гасили пропуск для всех сразу (см. `pop_cdraw.h`). diff --git a/applications/PoP/docs/perf_cyan_phase.md b/applications/PoP/docs/perf_cyan_phase.md deleted file mode 100644 index c99f125..0000000 --- a/applications/PoP/docs/perf_cyan_phase.md +++ /dev/null @@ -1,172 +0,0 @@ -# ЦИАН фаза (персонажи + передний слой) — анализ и оптимизация - -Рабочий документ: живёт между сессиями. Внизу **журнал правок** — каждая -запись с замером до/после. Сцена, рецепт воспроизведения и зонды — -[`perf_l13_room23.md`](perf_l13_room23.md); там же ответ про 8-битные -габариты. Парная фаза — [`perf_green_phase.md`](perf_green_phase.md). - -Границы фазы в `roomtest.c`: от `PROF(6)` (строка 620) до `PROF(0)` -(строка 677). Содержимое: `pop_check_mirror`, `pop_loose_mob_draw`, -соперник, `pop_char_draw(KID)`, `pop_loose_mob_draw_over`, `pop_fore_needed`, -`pop_hp_draw`, `pop_char_fore(KID)`, `pop_cd_clear`, -`pop_room_clip_borders`. - -**Бюджет: ≤ 400 000 тактов (растровый кадр = 430 000).** - -| состояние | было (2026-08-17, `c312e4a`) | стало (`af189a1`) | -|---|---:|---:| -| покой, Кид пропущен | 20 550 | 20 550 | -| Кид перерисовывается, кусков нет | 193 000 | 192 000 | -| **пик каскада (6 кусков + Кид)** | **631 800** | **270 510 ✔** | - -**ЦЕЛЬ ФАЗЫ ВЫПОЛНЕНА** (270 510 при бюджете 400 000, запас 32 %). - ---- - -## 1. Что решило дело - -### C1. Пометки «фон трогали» в `mob_render` подавлены — −55 000 - -`pop_loose_mob_tick` помечает **весь коридор** куска одним вызовом, а три -блита внутри `mob_render` метили подмножества того же прямоугольника по -**4 502 такта** каждый. Механизм — `pop_cd_mute()`/`pop_cd_unmute()` -(в `pop_tile.c`; отдельное значение того же флага `pop_cd_batch`, чтобы у -`pop_cd_touch` на общем пути осталась ОДНА проверка). - -Добавлена пометка в `mob_spawn_copy`: кусок, рождённый ВНУТРИ тика -(`loose_fall` сбил плиту), получает слот с начала таблицы, то есть уже -пройденный циклом, — своей пометки в этом кадре он бы не получил, а нарисован -был бы. Без этого пропущенная пометка = стёртый и не перерисованный -персонаж. - -### C4. Кусок клипуется САМ, вместо чистки бортов после — −138 000 - -Самая крупная и самая неожиданная статья. В `mob_render` стоял -`pop_clip_sprite`, то есть кусок рисовался в борт целиком и взводил -`border_dirty`; `pop_room_clip_borders` потом стирал ДВЕ полосы во всю ширину -экрана (320×28 и 320×28) — **150 978 тактов в КАЖДОМ кадре**, пока хоть один -кусок торчит выше поля. А гряда 13-го уровня рождается ровно у потолка -(`y = 2`), то есть почти весь каскад. Стало 1 722. - -Теперь окно клипа (`pop_t_win_set(0, POP_YOFF, 320, POP_PLAYFIELD_H)`) -ставится ТОЛЬКО когда кусок реально задевает борт: внутри поля блиты идут -быстрым путём. - -### Композит куска: три блита → один — −163 000 - -Части `env 70 / 74 / 72` складываются в ОДИН getimage-блоб при загрузке -тайлсета (`mob_spr_build` в `pop_room.c`). Мотив прямо из -[[blit_cost_model]]: у блита ~8 800 такта постоянных накладных против ~5 000 -на пиксели, а шесть кусков в воздухе давали 18 вызовов = **258 708 такта**, -больше половины фазы. - -Тонкости, которые пришлось соблюсти: - -- части **перекрываются** (74 и 70 обе идут от `mob_x`), поэтому композит - собирается попиксельно с пропуском `0xFF` — ровно как три прозрачных блита - друг поверх друга; -- габариты частей **читаются**, а не берутся константами: у тайлсетов правая - часть разная (26 px в подземелье, 25 во дворце); -- блоб лежит в обычной памяти (W2), поэтому блит идёт мимо `atlas_image` и - `gfx_w0_map/unmap` — ещё ~1 350 такта на вызов. Новый резидентный лист - `pop_mem_b` (`pop_tile.c`); -- страйд блоба = его ширина; сначала считается точный габарит, потом - копирование. Промежуточная версия объявляла блоб шириной 63 при - фактических 58 и переносила пять прозрачных колонок на каждом кадре; -- собирается на КАЖДУЮ смену тайлсета; резервный путь на три блита остался - (`mob_spr_ok`). - -### Общие правки, попавшие и в эту фазу - -- `blit_b_clip`: байтовый габарит + file-scope вместо локалей (кадр 22 → 12 Б, - обращений `(ix)` 211 → 51). Подробности — в - [`perf_green_phase.md`](perf_green_phase.md) §G3. -- `pop_blit_b`: аргументы в file-scope (76 → 11 обращений `(ix)`). - ---- - -## 2. Раскладка на 2026-08-17 (до правок) — для истории - -Подфазы (три готовых `PROF(6)`: 0x4BCE / 0x4C26 / 0x4C93), пик: - -| участок | покой | пик | -|---|---:|---:| -| `pop_check_mirror` + `pop_loose_mob_draw` + соперник | 23 250 | 154 512 | -| `pop_char_draw(KID)` + `pop_loose_mob_draw_over` + `pop_fore_needed` + HP | 3 726 | 445 284 | -| `pop_char_fore(KID)` + `pop_cd_clear` + **чистка бортов** | 1 722 | 150 978 | - -Разбор одного `pop_blit_b` (157 замеров быстрого пути, зонды b1..b5): - -| участок | такты | доля | -|---|---:|---:| -| `atlas_image` + `gfx_w0_map` + чтение габарита | 1 086 | 7 % | -| ядро блита (libbgi, `gfx_blit_noclip`) | 10 422 | 64 % | -| `pop_cd_touch` — пометка «фон тронут» | 4 502 | 28 % | -| `gfx_w0_unmap` + возврат | 264 | 2 % | -| ИТОГО | 16 273 | | - -Клипованный путь тогда же: ядро `blit_b_clip` 14 088, итого 16 409. -После правок: клипованный блит 11 848, быстрый ~13 900 (у него больше -пикселей). - ---- - -## 3. Что осталось в запасе (если понадобится ещё) - -Фаза в бюджете, поэтому это задел, а не план. - -### C5. Один `gfx_w0_map`/`unmap` на группу блитов - -1 086 + 264 на вызов. Для композита куска уже не нужно (он в обычной -памяти), но остаётся для тайлов фона: куски одного тайла часто лежат в одной -странице атласа. Мешает то, что `pop_blit_b` — общий лист для всех -вызывающих; нужна форма «открыть страницу, N блитов, закрыть». - -### C6. Размеры ленты — из каталога атласа - -`fw`/`fh` уже лежат в записи каталога (8 байт: `offset u16, fw u8, fh u8, -nx u8, ny u8, резерв u16`), и у всех фоновых лент `nx = ny = 1`, то есть они -равны `w`/`h` из шапки. `atlas_image` их читает и выбрасывает. - -### C7. objtable вместо отдельного fore-прохода на персонажа - -Позиции 5 и 6 старого `perf_backlog.md` — большой рефакторинг. Оригинал -кладёт персонажей и куски в `objtable` и рисует их при обходе тайлов -(`draw_objtable_items_at_tile`), порядок окклюзии получается сам; у нас -отдельный fore-проход НА КАЖДОГО персонажа. - -### Снять временную оснастку - -Шесть вызовов `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит -(`call` + `ret` × 6), плюс `pop_dbg_kind`/`m16` в `pop_redraw_needed`. -Снимать ПОСЛЕ того, как оптимизация закончена: без них не мерить. - ---- - -## 4. Что НЕ делать - -- **Не ставить W3-скобку из кода с `--w3`** — белый экран - (memory `gfx_blit_noclip_fast`). -- **Не ускорять передачу пикселей** — предел железа - (memory `blit_cost_model`). -- **Не возвращать клип куска по `clip.right = 40`** оригинала - (`add_mob_to_objtable`, seg007:1161): единицы этого поля не выяснены, - буквальные 40 экранных пикселей срезают правый задний угол плиты - (прогон 2026-08-13). -- **Не сужать коридор heal «по палаццовому следу»** — габариты частей у - тайлсетов разные; брать высоту СОБРАННОГО композита (так и сделано). - ---- - -## 5. Журнал правок - -| дата | что сделано | циан: покой / Кид / пик | коммит | -|---|---|---|---| -| 2026-08-17 | базовый замер | 20 550 / 193 000 / **631 800** | `c312e4a` | -| 2026-08-17 | C1 подавление пометок в `mob_render` + пометка в `mob_spawn_copy` | — / — / **577 050** | `a3c473d` | -| 2026-08-17 | C4 кусок клипуется сам вместо чистки бортов; `blit_b_clip` байты+file-scope | — / — / **438 546** | `a3c473d` | -| 2026-08-17 | `pop_blit_b` аргументы в file-scope | — / — / **435 180** | `b2da0b8` | -| 2026-08-17 | **композит куска: один блит вместо трёх** | — / — / **273 078** | `b2da0b8` | -| 2026-08-17 | точный габарит композита (было 63 при 58) | 20 550 / 192 000 / **270 510 ✔** | `af189a1` | -| 2026-08-17 | замер после фиксов уровня 1 | — / — / **379 482** | `40f0d46` | -| 2026-08-17 | **регресс после фиксов уровня 2** — без изменений | — / — / **379 488 ✔** | `ec1f384` | diff --git a/applications/PoP/docs/perf_green_phase.md b/applications/PoP/docs/perf_green_phase.md deleted file mode 100644 index ff58d1f..0000000 --- a/applications/PoP/docs/perf_green_phase.md +++ /dev/null @@ -1,327 +0,0 @@ -# ЗЕЛЁНАЯ фаза (слой фона) — анализ и оптимизация - -Рабочий документ: живёт между сессиями. Внизу **журнал правок** — каждая -запись с замером до/после. Сцена, рецепт воспроизведения и зонды — -[`perf_l13_room23.md`](perf_l13_room23.md); там же ответ про 8-битные -габариты. Парная фаза — [`perf_cyan_phase.md`](perf_cyan_phase.md) (её цель -достигнута). - -Границы фазы в `roomtest.c`: от `PROF(4)` (строка 450) до `PROF(6)` -(строка 620). Содержимое: `pop_loose_tick`, `pop_process_trobs`, -`pop_redraw_needed`, шов, смена уровня, сигналы провалов, вспышка. - -**Бюджет: ≤ 400 000 тактов (растровый кадр = 430 000).** - -| состояние | было (`c312e4a`) | стало (`af189a1`) | -|---|---:|---:| -| покой в комнате 23 | 35 760 | 35 760 | -| дрожат 6 плит-потолков | 366 000 | 335 400 | -| **пик каскада** | **805 000** | **546 900** | - -**ЦЕЛЬ ФАЗЫ НЕ ДОСТИГНУТА: 546 900 против 400 000 (1,37×).** Что осталось -сделать и почему это именно раскол `draw_tile` — §3. - ---- - -## 1. Раскладка ПОСЛЕ правок (замер `af189a1`) - -Пик — кадры 24-28 (посадки плит), больше не кадры провалов. - -| участок | покой | дрожь | пик | -|---|---:|---:|---:| -| `pop_loose_tick` | 36 234 | 36 234 | **156 762** | -| `pop_process_trobs` | 1 050 | 1 050 | 1 050 | -| **`pop_redraw_needed`** | 924 | 288 800 | **380 568** | -| хвост (шов, смена уровня, сигналы, вспышка) | 9 336 | 9 336 | 10 776 | - -`pop_loose_tick` изнутри на пике: два цикла по тайлам 9 852, -**`pop_loose_mob_tick` 154 074** (heal шести летящих кусков), остальное мелочь. - -### Цена одной перерисовки: было → стало - -| вид | было | стало | чем | -|---|---:|---:|---| -| `RDA_CEIL` — дрожащая плита-потолок | 48 785 | **43 536** | G2 + G3 | -| `RDA_CEIL_GONE` — запечь колодец | 251 335 | **138 318** | **G1** (клип полосы) + G2 + G3 | -| `RD_FLOOR` — щебень на месте посадки | 198 805 | **179 914** | G2 + G3 + снятая двойная пометка | - -Штук за кадр: `RDA_CEIL` до 6, `RDA_CEIL_GONE` до 2, `RD_FLOOR` до 2. - -### Детальный профиль `RD_FLOOR` (179 914) — главная оставшаяся статья - -Снят зондами по каждому блиту (`pop_dbg_b1/b5`) и по рамкам -(`pop_bar_black`, `pop_cd_batch_begin/end`): - -| участок | такты | -|---|---:| -| вход `pop_floor_bake` + `gfx_set_bank` | 2 382 | -| `pop_bar_black` 60×39 (включая `pop_cd_touch` 4 502) | ~15 500 | -| **контекст `draw_tile` #1** (5 чтений тайлов, `63*row`, индексация таблицы) | **13 584** | -| 4 блита тайла #1 | 50 718 | -| **диспетчер между блитами #1** (все `if (code == …)`) | **11 388** | -| **контекст `draw_tile` #2** | **13 584** | -| 4 блита тайла #2 | ~54 000 | -| **диспетчер между блитами #2** | **11 388** | -| хвост | 6 474 | - -Итого: **105 500 — сами блиты (реальные пиксели), 74 400 — накладные**, из -которых 27 168 контекст двух `draw_tile` и 22 776 их диспетчер. - ---- - -## 2. Что сделано (с чем сравнивать) - -### G1. Окно клипа для точечной перерисовки — −90 000 - -`pop_t_win_set(x, ytop, w, h)` / `pop_t_win_clear()` в `pop_tile.c`: ставит -уже существующее окно `pop_t_fclip_*` на прямоугольник, который перерисовка -восстанавливает. Работает в обе стороны — и предфильтр `pop_blit_b` -отсеивает куски мимо окна ДО `atlas_image`/`gfx_w0_map`, и `blit_b_clip` -режет остальные по нему. - -Где сработало: `pop_ceil_bake_empty` — куски ряда 0 высотой 63 px рисовались -целиком, хотя восстановить надо девять строк полосы. **Блит 21 447 → 7 619**, -вся перерисовка 251 335 → 138 318. - -Где НЕ сработало — см. §4, отрицательные результаты. - -Побочно: пока окно стоит, `pop_blit_b` не ставит пометку «фон трогали» -(признак fore-прохода), поэтому вызывающий обязан пометить прямоугольник сам. -В `pop_ceil_shake_draw` добавлен явный `pop_cd_touch` на область heal'а; в -`pop_ceil_bake_empty` и `pop_floor_bake` метит `pop_bar_black`, а лишний -второй вызов на ту же область снят. - -### G2. Контекст тайла — file-scope, а не локали `draw_tile` — −55 000 - -Порт `load_curr_and_left_tile` (seg008:0339): у оригинала это -`curr_tile`/`curr_modifier`/`draw_xh`/`draw_main_y`/`draw_bottom_y` — -переменные модуля, а не локали. - -Причина в кодогене: в `draw_tile` **57 вызовов**, и каждое живое через вызов -значение SDCC спиливал в стековый кадр — 26 байт кадра и **513 обращений -`-N(ix)`** (при ~46 замеренных тактах на обращение это ~23 600, что и -намерено). Стало **33 обращения**, кадра нет, банк 7 −703 Б. - -### G3. `blit_b_clip` — байтовый габарит + file-scope - -Два шага, и важен порядок наблюдений: - -1. **Байтового габарита ОДНОГО НЕ ХВАТИЛО.** `sx/sy/dw/dh` → `uint8_t` - (корректно: кадры атласов ≤ 56×63) дало 211 → 173 обращения, а - 22-байтовый кадр остался: значений, живых через шесть вызовов ядер libbgi, - всё равно больше, чем регистров у Z80. -2. **Решило вынесение из локалей** (`bc_*`): 51 обращение, кадр 22 → 12 Б. - -Клипованный блит 14 088 → 11 848. Заодно `blit_b_oversize` больше не ходит -через `blit_b_clip` (там теперь байтовый габарит) — рисует напрямую -`gfx_blit_part`; это путь под полноэкранные подложки интро/финала. - -### G4. Мелочи - -- `pop_blit_b`: аргументы в file-scope (третий и дальше SDCC передаёт стеком, - каждое чтение шло через `-N(ix)`) — 76 → 11 обращений. -- `pop_loose_mob_tick`: пометки всех кусков ОДНИМ пакетом - (`pop_cd_batch_begin/end`) — было по 4 502 такта на кусок. - 176 772 → 168 600. -- Коридор heal куска — по фактической высоте СОБРАННОГО композита (было 24 - строки константой, стало 20). 168 600 → 156 762. - ---- - -## 3. Что осталось: раскол `draw_tile` (позиция G5) - -**Оставшийся разрыв: −147 000.** Он весь в двух местах. - -### G5. Расколоть `draw_tile` на узкие части, как в оригинале - -**Ожидание: −50 000 … −60 000.** - -У оригинала `draw_tile` (seg008:01C7) — это девять независимых вызовов: -`draw_tile_floorright`, `draw_tile_anim_topright`, `draw_tile_right`, -`draw_tile_anim_right`, `draw_tile_bottom`, `draw_loose`, `draw_tile_base`, -`draw_tile_anim`, `draw_tile_fore`. Для ряда −1 он зовёт шесть из них -(`draw_tile_aboveroom`, seg008:01F2), для полосы у потолка — те же шесть плюс -`draw_tile_wipe(3)` (`redraw_needed_above`, seg008:02C1). - -У нас всё это — ветки `if (row >= 0)` ВНУТРИ одной функции, то есть контекст -(13 584) и диспетчер (11 388) оплачиваются целиком всегда. Расколов, каждая -точечная перерисовка сможет звать только нужные части: - -- `pop_floor_bake`: вместо второго полного `draw_tile(row, col+1)` — только - его правую грань и базу; -- `pop_ceil_shake_draw` / `pop_ceil_bake_empty`: дословный - `draw_tile_aboveroom`; -- `pop_loose_shake_draw`, `pop_spike_redraw`, `pop_gate_redraw` — то же. - -Риск средний: у `draw_tile` собрано много инвариантов (BUG-LOOSE-3, -BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1), проверять придётся прогонами всех -уровней. Поэтому делать отдельным заходом, а не хвостом другой правки. - -### G6. Меньше блитов в `RD_FLOOR` - -**Ожидание: неизвестно, надо мерить.** 105 500 из 179 914 — это 7,6 блита, -и они рисуют настоящие пиксели. Сократить можно только сократив то, что -восстанавливается: бар сейчас 60×39 от `yb+26`, а плита занимает по вертикали -меньше (её куски: левая грань `POP_LOOSE_FRAM_LEFT` 32×13 на `dmy = yb+62`, -низ `POP_LOOSE_FRAM_BOTTOM` 32×3 на `dby = yb+65`, правая грань в соседе -26×16 на `dby−1`). То есть плита живёт в `yb+47 .. yb+65`, а бар начинается с -`yb+26` — **21 лишняя строка сверху**. - -Проверять осторожно: бар заодно стирает и то, что рисует ДРУГИЕ куски тайла -(орнаментная лента `stripe_id` на `dmy−27 = yb+35` попадает как раз в -«лишнюю» часть). Сузишь бар — надо убедиться, что ничего не осталось. - -### G7. heal летящих кусков — 154 074 (28 % фазы) - -Шесть кусков × ~25 700: сам heal 64×20 (по модели ~19 700) + пакетная -пометка + накладные `mob_tick_one` (16-байтовый кадр, 99 обращений `(ix)`). -**Сам heal у предела железа** — это 1 280 пикселей на кусок, оптимизировать -нечего, кроме площади. Площадь уже подрезана до габарита композита. - -Остаётся `mob_tick_one` (~4 500 на кусок = 27 000 на кадр) — то же лечение -file-scope, что у `draw_tile`. - -### G8. Пометка соседа — узкой полосой, а не полным тайлом (идея пользователя) - -**Ожидание: заметное, но не мерено. Взять ПОСЛЕ обхода всех уровней** -(решение пользователя 2026-08-17: пока идёт отлов багов слоёв, каждая правка -добавляет переменных в картину). - -Когда плита (1,8) падает, помечаются ДВА тайла: - -| пометка | что делает | -|---|---| -| `(1,8)` → `RD_LOOSE_GONE` | бар 40 на своём x, бар 32 на соседе, `draw_tile(1,8)` + `draw_tile(1,9)` | -| `(1,9)` → `RD_FLOOR` | бар **60** на x соседа, `draw_tile(1,9)` ЕЩЁ РАЗ | - -То есть сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО, хотя потревожили у него -только левые 28 пикселей — там, куда свисает правая грань упавшего тайла. -`draw_tile(1,9)` при этом вызывается дважды на одну пометку. - -Что такое эти числа (чтобы не сузить лишнего): - -- **60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес.** Правая грань пола (кадр 42, - 26 px) рисуется в клетке соседа с `x+32`, занимая `x+32..x+57`. Для запечки - САМОГО тайла 60 уже минимальны — сужать их нельзя; -- сузить можно только тот случай, когда тайл помечен ПОТОМУ ЧТО ИЗМЕНИЛСЯ ЕГО - ЛЕВЫЙ СОСЕД: тогда нужна полоса 28 px у левого края, а не весь тайл. - -Почему выигрыш не символический: `pop_floor_bake` стоит **179 914** тактов, -из них 105 500 — сами блиты. Узкая полоса срезала бы и площадь бара -(60×39 → 28×39), и часть блитов — окно клипа там теперь стоит обязательным -(см. §4), так что отсев достаётся даром. - -**Условия, из-за которых это не «просто уменьшить число»:** - -1. `pop_floor_bake` — ОБЩАЯ функция: её же зовут кнопка (`pop_button_redraw`), - зеркало, подобранный предмет и щебень на месте посадки. Там меняется сам - тайл и 60 нужны целиком. Значит нужен отдельный вход (напр. - `pop_floor_bake_edge(row, col)`) или параметр-прямоугольник — именно под - пометку «изменился мой левый сосед». -2. Прежде чем выкидывать вторую пометку целиком, сверить ВЕРТИКАЛЬНЫЕ - диапазоны: `pop_loose_bake_empty` кроет `63*row+46 .. +65` (20 строк), а - `pop_floor_bake` — `yb+26 .. yb+64` (39 строк). То есть сосед покрыт - ВТОРЫМ баром не полностью, и просто снять пометку нельзя. -3. Ширина полосы = свес ЛЕВОГО тайла, а он зависит от типа тайла (у loose это - 8 px по комментарию в `pop_loose_bake_empty`, у пола 26). Брать по - максимуму (28) — безопасно. - -### G9. Снять временную оснастку - -Шесть `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит; при 15 -блитах зелёной это 6 000 на кадр. Плюс `pop_dbg_kind`/`m16` (2 вызова на -перерисовку) и `pop_dbg_m5..m15`. Снимать ПОСЛЕ окончания оптимизации: без -них не мерить. - ---- - -## 4. Копия второй страницы — и почему она ТРЕБУЕТ окна клипа - -Точечные запечки ставятся с `pages = 2`, срабатывают два кадра подряд (по разу -на страницу дабл-буфера) и оба раза считают одно и то же. После первого раза -нужный прямоугольник уже лежит в ОЗУ-копии первой страницы, и его можно -скопировать: `gfx_copy_page` берёт источником ОЗУ-копию НЕактивной страницы -(то есть ЧИСТЫЙ фон — спрайты рисуются банком без тени и в копию не попадают), -а приёмник обновляет и в видео-ОЗУ, и в ОЗУ-копии. Идея пользователя: тот же -приём, что при перевороте экрана (зелёное зелье), только без зеркала. - -| | полная запечка | копия | -|---|---:|---:| -| щебень / кнопка (60×39) | 179 914 | ~35 000 | -| колодец полосы потолка (64×9) | 138 318 | ~17 500 | - -**ДВА УСЛОВИЯ КОРРЕКТНОСТИ.** Оба нарушались и оба дали видимые баги. - -1. **Запечка обязана быть ОГРАНИЧЕНА копируемым прямоугольником.** - `draw_tile` рисует тайлы ЦЕЛИКОМ, то есть пишет ШИРЕ бара; копия переносит - ровно бар, и всё, что легло вне него, на второй странице остаётся прежним — - страницы расходятся, это видно как МЕРЦАНИЕ через кадр. У полосы потолка - окно стояло с самого начала (G1), у `pop_floor_bake` — нет, и он мерцал - торцами полов, плит и кнопок (найдено пользователем 2026-08-17: уровень 1, - комната 6, Кид на кнопке (0,2)). Поэтому в `pop_floor_bake` окно теперь - стоит КАК УСЛОВИЕ КОРРЕКТНОСТИ, хотя по скорости само по себе убыточно - (см. §5) — снимать его нельзя. -2. **Копия годится только если содержимое тайла между двумя кадрами не - изменилось.** У анимированного тайла (кнопка с идущим таймером связи) - пометка обновляется КАЖДЫЙ кадр и картинка каждый раз другая. Поэтому - `pop_set_redraw`/`pop_set_redraw_above` гасят слот копии при ПЕРЕпометке - (`pop_bake_slot_reset*`). - -Плюс слот `bake_pg`/`bake_pg_above` помнит, НА КАКОЙ странице сделана первая -запечка: копируем только если первая была на ДРУГОЙ странице и дабл-буфер -включён. Это покрывает переплетение двух запечек в одном кадре, однобуфер -(чит SPACE) и смену комнаты (`pop_bake_forget`). - ---- - -## 5. Отрицательные результаты — НЕ повторять - -### Окно клипа в `pop_floor_bake` — по СКОРОСТИ проверено ТРИ раза, каждый раз хуже - -**Но оно всё равно стоит на месте: без него ломается копия второй страницы -(§4).** Ниже — только про скорость самого окна. - -| попытка | было | стало | -|---|---:|---:| -| до G3 | 187 266 | 198 279 | -| после G3 | 182 124 | 188 460 | -| после `pop_blit_b` file-scope, с детальным зондом | 179 914 | 188 417 | - -Третья попытка объяснила причину: клипованный путь стоит **+1 500 такта на -КАЖДОМ** из 7,6 блитов (+11 400), а режет он только редкие высокие куски — в -трассе такие нашлись (34 878 → 25 872 и 28 818 → 24 090, всего −13 700), но в -среднем по 12 перерисовкам их нет. Запись стоит в коде. - -### Прочее (проверено раньше) - -- **Не откладывать запекание на другой кадр** — запечка пишет ОЗУ-копию, из - которой восстанавливает heal; отложенная даёт призрак плиты на месте дыры. -- **Не батчить смежные колонки в `pop_ceil_shake_draw`** — плиты стартуют со - случайными задержками, в кадре дрожат разрозненные колонки, пробег почти - всегда длиной в одну. -- **Не ускорять передачу пикселей** — предел железа (3+3 такта на байт, - memory `blit_cost_model`). В пиковом кадре «железный» минимум всех блитов - ≈150 000 из 916 458. -- **`LOOSE-SHAKE-RUNS`** (пометки по сменам кадра): наивный вариант выигрыша - НЕ даёт — пять смен × две страницы = те же десять перерисовок. Работает - только версия «пары и тройки», ~20 % и только на дрожащих плитах; оценка - 2026-08-13, не перемерена. Подробности — - `roomtest/TASKS_OPEN.md#loose-shake-runs`. - ---- - -## 6. Журнал правок - -| дата | что сделано | зелёная: покой / дрожь / пик | коммит | -|---|---|---|---| -| 2026-08-17 | базовый замер | 35 760 / 366 000 / **805 000** | `c312e4a` | -| 2026-08-17 | G2 контекст тайла в file-scope | — / — / **747 954** | `a3c473d` | -| 2026-08-17 | G1 окно клипа в `pop_ceil_bake_empty` | — / — / **663 250** | `a3c473d` | -| 2026-08-17 | G3 `blit_b_clip` байты + file-scope | — / 335 400 / **575 730** | `a3c473d` | -| 2026-08-17 | `pop_blit_b` file-scope; пакетная пометка кусков | — / — / **557 706** | `b2da0b8` | -| 2026-08-17 | коридор heal по высоте композита | 35 760 / 335 400 / **546 900** | `9a50ab2` | -| 2026-08-17 | **копия второй страницы вместо второй запечки** | — / — / **423 558** | `5ef721e` | -| 2026-08-17 | `mob_tick_one` в file-scope; снята оснастка из горячих путей | 35 760 / 326 130 / **414 456** | `18ee60e` | -| 2026-08-17 | фикс мерцания: окно клипа в `pop_floor_bake` как условие корректности копии | замер после фикса — ниже | `35b7cd5` | -| 2026-08-17 | замер после фиксов уровня 1 (мерцание торцов, потолочный fore, сосед под плитой, блеск меча) | 35 760 / — / **417 630** | `40f0d46` | -| 2026-08-17 | **регресс после фиксов уровня 2** (чёрные бары, чит бессмертия) — в пределах шума | — / — / **419 526** | `ec1f384` | diff --git a/applications/PoP/docs/perf_l11_room15.md b/applications/PoP/docs/perf_l11_room15.md deleted file mode 100644 index 062a3db..0000000 --- a/applications/PoP/docs/perf_l11_room15.md +++ /dev/null @@ -1,238 +0,0 @@ -# Сцена и замер: факел + чомпер + страж, уровень 11 комната 15 - -Вторая целевая сцена для оптимизации (первая — [`perf_l13_room23.md`](perf_l13_room23.md), -каскад плит). Здесь узкое место другое: не разовый пик на каскаде, а -**постоянная** цена статичной комнаты, в которой одновременно живут два -факела, чомпер и страж. - -Такты — `totalcycles` MAME (не такты Z80, ≈2,4× номинала, memory -`sprinter_wait_states_2x`). **Растровый кадр = 430 000.** Хвост кадра — три -`gfx_wait_vsync`, поэтому логический кадр занимает 3 растра, пока работа -укладывается в один; при работе 1..2 растра период становится 4. - -## 1. Сцена - -Уровень 11, комната 15. Проверено чтением состояния машины: -`pop_current_level` = 0x0B, `cur_room` = 15. - -| кто | где | кадр | -|---|---|---| -| Кид | (0,2), x=98 | 15 (стойка с мечом) | -| чомпер | (0,3) | застывший (trob мёртв) | -| факел | (0,2) — пламя рисуется в ячейке (0,3) | анимируется каждый кадр | -| факел | (0,7) — пламя в ячейке (0,8) | анимируется каждый кадр | -| страж | (0,8), x=170 | 171 (боевая стойка) | - -Ни Кид, ни страж не двигаются: сцена статична, разброс замера — сотни тактов -на 800 000. - -## 2. Замер (`09f32ce`, база модуля `roomtest.c` = 0x42AD) - -867 кадров, зонды A/C/D/E; детализация — тремя отдельными прогонами -(m1, m5..m7, M/F). **Период кадра: 4 растра во всех 866 интервалах.** - -| участок | зонды | медиана | доля работы | -|---|---|---:|---:| -| **синяя: ввод + heal** | A→m1 | 141 048 | 17,6 % | -| **синяя: логика** | m1→C | 152 190 | 19,0 % | -| синяя, всего | A→C | **293 238** | 36,6 % | -| зелёная: `pop_loose_tick` | C→m5 | 28 872 | 3,6 % | -| **зелёная: `pop_process_trobs`** | m5→m6 | 92 448 | 11,5 % | -| **зелёная: `pop_redraw_needed`** | m6→m7 | 190 260 | 23,7 % | -| зелёная: шов/ворота соседа | m7→D | 9 336 | 1,2 % | -| зелёная, всего | C→D | **320 916** | 40,0 % | -| циан: `check_mirror` + `loose_mob_draw` | D→M | 37 458 | 4,7 % | -| **циан: Кид + страж + fore + HP** | M→F | 148 566 | 18,5 % | -| циан: `char_fore(KID)` + борта | F→E | 1 740 | 0,2 % | -| циан, всего | D→E | **187 758** | 23,4 % | -| **работа** | A→E | **801 768** | 1,86 растра | - -Циан здесь **не** выделяется: 187 758 — это 0,44 растрового кадра, а разброс -за 867 кадров всего 174 такта (187 674..187 848). Впечатление «циан ~150 % -кадра» на глаз не подтвердилось — при периоде 4 растра полосы бордюра -размазаны по кадрам и на глаз не читаются. - -## 3. Главная находка: чомпер справа от факела — 190 260 тактов/кадр - -`pop_dbg_rdmax_tot` = **1**: за кадр перерисовывается РОВНО ОДИН тайл, и -стоит он все 190 260 тактов зелёной фазы. - -> **ПОПРАВКА 2026-08-19 (после реализации P1).** Механизм ниже описан -> верно, но ГЛАВНЫМ источником 190 260 тактов он НЕ был. Зонд -> `pop_dbg_kind` показал, что все 312 перерисовок в прогоне — вид -> `POP_RD_CHOMP` (полная), и ни одной от факела: собственная пометка -> чомпера просто перебивала пометку соседа. Настоящая причина — в §6. -> Урок ровно тот, что уже записан в `defer_unexplained_quirks`: механизм, -> который правдоподобно объясняет цифру, ещё не доказан цифрой. - -Цепочка: - -1. `TORCH_ANIM_DIV = 1` — факел меняет кадр пламени КАЖДЫЙ логический кадр; -2. пламя запекается в фон (`pop_torch_draw`, `GFX_BANK_NORMAL`), а канвас - пламени 16×18 лежит **в ячейке правого соседа** (seg008:560) — то есть - поверх чомпера; -3. поэтому `pop_process_trobs` метит соседа: `if (trob_rcode[i] == TILE_CHOMP) - pop_set_redraw(tp + 1, POP_RD_CHOMP, 1)` (порт `set_redraw_anim_right`); -4. `pop_chomp_redraw` отвечает на пометку **heal 32×64 + полный `draw_tile`**. - -Расхождение с оригиналом именно в шаге 4. `set_redraw_anim_right` метит -слой **anim**, и оригинал возвращает только его (`draw_tile_anim_topright` → -`draw_tile_anim_right` → `draw_tile_anim`) — одну графику чомпера поверх -огня. Мы вместо этого стираем и пересобираем тайл целиком, со всеми слоями -(`draw_tile_right`, `base`, `bottom`, `loose`), которые пламя вообще не -трогало. - -Цена по модели блита (`blit_cost_model`, 8791 + 198·h + 5,96·w·h): -heal 32×64 ≈ 33 700, значит на один `draw_tile` уходит ≈ 156 000 — сходится -с известным замером «полная запечка щебня 179 914». - -Чомпер при этом **застывший**: своей анимации у него нет, поза не меняется, -возвращать нужно ровно ту же графику поверх свежего пламени. - -## 4. Что это даёт и куда смотреть дальше - -Ранжирование по цене (доля от 801 768): - -| # | участок | такты | что делать | -|---|---|---:|---| -| 1 | `redraw_needed`: чомпер под факелом | 190 260 | вернуть только слой anim, как в оригинале — без heal и без остальных слоёв | -| 2 | синяя: логика двух Char | 152 190 | графики нет вообще; разобрать `pop_check_can_guard_see_kid` и два `play_seq` | -| 3 | циан: Кид + страж | 148 566 | оба будятся каждый кадр — метки фона от чомпера/факела накрывают обоих | -| 4 | синяя: heal двух Char | 141 048 | следствие того же: skip не срабатывает ни разу | -| 5 | `process_trobs`: два факела | 92 448 | ≈46 000 на факел при блите пламени 16×18 ≈ 14 000 — разобрать накладные | -| 6 | `loose_tick` | 28 872 | в комнате нет ни одной loose-плиты | - -Пункты 3 и 4 — одна тема: пока фон трогают каждый кадр, `pop_char_skip_mask` -не может пропустить ни Кида, ни стража. Пламя метит узко (16×18), а вот -`pop_chomp_redraw` метит весь тайл со свесом — то есть пункт 1 чинит и часть -пунктов 3/4. - -Связанные задачи: `HEAL-WIDTH` и G8 в [`perf_green_phase.md`](perf_green_phase.md) -— та же болезнь (полный тайл там, где хватает полосы), но на другом -материале. - -## 6. Настоящая причина 190 260 тактов: перерисовка неизменной позы - -Найдено при реализации P1, сверкой с `animate_chomper` (seg007:0448). -Функция оригинала заканчивается так: - -```c -if ((curr_modifier & 0x7F) < 6) { - redraw_at_trob(); -} -``` - -То есть чомпер перерисовывается **только пока фаза меньше 6** — пять кадров -из пятнадцати (`POP_CHOMPER_SPEED = 15`). Это не оптимизация оригинала, а -следствие таблицы поз: `chomper_fram1 = {3,2,0,1,4,3,3}`, и начиная с фазы 5 -и до конца круга поза одна и та же — 3. Рисовать её десять кадров подряд -значит рисовать ровно ту же картинку. - -Мы же метили тайл БЕЗУСЛОВНО, каждый кадр, пока trob жив — то есть платили -полный `draw_tile` плюс heal 32×64 за неизменную картинку в двух третях -кадров. А trob у чомпера живёт, пока Кид в том же РЯДУ (`animate_chomper` -снимает его только при фазе ≥ 6 и ушедшем Киде) — в 11/15 Кид стоит в (0,2), -чомпер в (0,3), ряд один. - -**Что сделано:** - -1. пометка только при фазе < 6, и на фазе 5 — на ОБЕ страницы дабл-буфера - (она последняя рисуемая, её поза обязана лечь на обе; вторую страницу - пометка догоняет в кадре фазы 6, где поза та же самая); -2. пометка от факела (`set_redraw_anim_right`) переведена на новый вид - `POP_RD_CHOMP_ANIM` → `pop_chomp_anim_draw`: три блита графики чомпера - поверх свежего пламени, без heal и без остальных слоёв — порт ветки - `redraw_frames_anim` (seg008:0211); -3. приоритет полной перерисовки над anim в `pop_set_redraw` — у оригинала - это два независимых счётчика, и `full` побеждает. - -**Результат** (замер, 552 кадра): полная перерисовка теперь в **40 %** -кадров, лёгкий возврат челюстей — в 60 %. Зелёная фаза: 291 888 в дорогом -кадре против 183 414 в дешёвом. - -| | работа | зелёная | -|---|---:|---:| -| до P1 | 768 684 | 294 510 | -| после P1, медиана | **657 882** | **183 420** | -| после P1, дорогой кадр (40 %) | 765 936 | 291 888 | - -**−110 802 на медиане** при ожидании −160 000. Разница в том, что 40 % -кадров по-прежнему платят полную цену: там поза реально меняется, и это уже -не лишняя работа, а честная. Дальше её можно резать только раскладом -`draw_tile` на части (P7) или сужением heal (P8). - -## 5. Журнал правок по этой сцене - -| дата | правка | работа | синяя | зелёная | циан | -|---|---|---:|---:|---:|---:| -| 2026-08-19 | базовый замер (`09f32ce`) | 801 768 | 293 238 | 320 916 | 187 758 | -| 2026-08-19 | **P5**: гейты холостого хода в `pop_loose_tick` | **767 928** | 285 864 | 294 384 | 187 764 | -| | | −33 840 | −7 374 | −26 532 | +6 | -| 2026-08-19 | зонды для замера P2/P6 (временные) | 768 684 | 286 518 | 294 510 | 187 761 | -| 2026-08-19 | **P1**: чомпер — перерисовка только при фазе < 6 (медиана) | **657 882** | 286 503 | 183 420 | 187 761 | -| | | −110 802 | −15 | −111 090 | 0 | - -Оснастка P2/P6 стоит 756 тактов на кадр — замеры до и после сопоставимы. - -Циан не изменился (+6 тактов — шум), и это ожидаемо: `loose_tick` целиком -лежит в зелёной. Синяя просела на 7 374 без прямой причины в правке — -скорее всего перераскладка кода банка 3 компилятором; проверять отдельно -не стали, знак верный. - -## 7. ТЯЖЁЛАЯ позиция: Кид на шаг правее [замер 2026-08-19] - -Поставлена пользователем: один осторожный шаг вправо (x = 106 вместо 99, -колонка та же). Спрайт Кида начинает пересекаться с тайлом (0,3), где -одновременно чомпер и пламя факела — и `skip_mask` перестаёт его -пропускать. - -| фаза | лёгкая | **тяжёлая** | разница | -|---|---:|---:|---:| -| синяя | 259 500 | 257 520 | −1 980 | -| зелёная (медиана) | 181 068 | 180 870 | −198 | -| **циан** | 187 761 | **319 842** | **+132 081** | -| **работа (медиана)** | 628 542 | **758 358** | **+129 816** | -| работа (максимум) | 744 384 | **876 612** | | - -**Период кадра: 4 растра в 335 кадрах, 5 растров в 123 (27 %).** Это уже -не «стабильно медленно», а рывки: каждый четвёртый кадр длиннее соседних. - -Разбор циана показывает, куда ушли 132 тысячи: - -| участок | лёгкая | тяжёлая | -|---|---:|---:| -| `check_mirror` | 3 198 | 3 198 | -| `mob_draw` + `guard_over_kid` + `skip_mask` | 34 374 | 18 672 | -| **`pop_char_draw(KID)`** | **204** | **54 738** | -| соперник: `char_draw` + `char_fore` | 145 896 | 149 748 | -| **`fore_needed` + `char_fore(KID)` + борта** | **4 356** | **93 486** | - -То есть Кид из «пропущен за 204 такта» превращается в полноценного -персонажа за ~144 000 — ровно столько же, сколько стоит страж. - -**Главный вывод замера: самая дорогая единичная статья кадра — это -fore-проход персонажа.** 62 778 у стража и ~89 000 у Кида, вместе около -**152 000, то есть 20 % работы кадра**. У Кида он дороже потому, что в его -футпринте лежит чомпер, а у чомпера есть собственный передний слой -(`POP_CHOMP_FRAM_FOR`), который перерисовывается поверх персонажа каждый -кадр. - -## 8. После P15 (точная метка «фон трогали») - -| фаза | лёгкая до | лёгкая после | тяжёлая до | тяжёлая после | -|---|---:|---:|---:|---:| -| синяя | 259 050 | **223 902** | 257 520 | **245 808** | -| зелёная | 181 494 | 181 494 | 180 870 | 181 761 | -| циан | 194 262 | **59 406** | 319 842 | **192 090** | -| **работа** | 628 542 | **464 796** | 758 358 | **617 487** | - -В лёгкой позиции не рисуется НИ ОДИН персонаж (циан 59 406 — это уже только -`check_mirror`, проверки и передний слой по пометкам). В тяжёлой рисуется -один Кид: он действительно стоит под пламенем, а страж — нет. - -**Пятирастровые кадры в тяжёлой позиции исчезли** (было 27 %), период стал -ровно 4. - -**Полная очередь оптимизаций с оценками — [`perf_registry.md`](perf_registry.md).** -Там же разложена цена одного блита фона по этапам (замер 2026-08-19, 1603 -блита) и модель зелёной фазы этой сцены. diff --git a/applications/PoP/docs/perf_l13_room23.md b/applications/PoP/docs/perf_l13_room23.md deleted file mode 100644 index 6c1042e..0000000 --- a/applications/PoP/docs/perf_l13_room23.md +++ /dev/null @@ -1,271 +0,0 @@ -# Сцена и метод замера: каскад плит, уровень 13 комната 23 - -Общий документ для двух фазовых: [`perf_green_phase.md`](perf_green_phase.md) -(слой фона) и [`perf_cyan_phase.md`](perf_cyan_phase.md) (персонажи + передний -слой). Здесь — как воспроизвести сцену, чем мерить, сводка по кадрам и -разбор габаритов спрайтов (он общий для обеих фаз). - -Сцена: старт уровня 13. Комната 23 стартовая, ряд 2 комнаты СВЕРХУ (17) — -шесть loose-плит в колонках 2..7 (`res2013.bin`: коды `11` в позициях 22..27), -`check_fall_flo` раздаёт им отложенный старт `0xF0..0xFF`, и они сыплются -вразнобой. Кид стоит у правого края и не двигается. - -Все числа — такты `totalcycles` MAME (системный клок ~21,5 МГц, **НЕ** такты -Z80: у ОЗУ Sprinter wait-state'ы, ≈2,4× номинала — memory -`sprinter_wait_states_2x`). **Растровый кадр = 430 000.** Логический кадр -спейсится тремя `gfx_wait_vsync`, поэтому работа сверх 430 000 стоит сразу -целый лишний растровый кадр. - -Сборка: `make LEVEL=13` на `c312e4a`, `_CODE = 0x4100`, база модуля -`roomtest.c` = **0x42AD**. **Адреса зондов меняются после КАЖДОЙ -пересборки** — брать заново из `.sprinter-cc-roomtest/roomtest.map` и -`roomtest.lst`. - ---- - -## 1. Как воспроизвести сцену - -**Только перезапуском программы.** Проверено и отвергнуто: - -- **выход из комнаты и возврат** (чит `+`/`-`) — не работает: провалившаяся - плита-потолок уходит в страницу уровня насовсем (`pop_level_set_tile` в - `roomtest.c` по сигналу `pop_ceil_fell`, плюс `animate_loose` в - `pop_trob.c`), и при повторном входе `check_fall_flo` не находит ни одной - `TILE_LOOSE`; -- **рестарт уровня** (`pop_kid_dead = 1` + чит навигации) — не работает по - другой причине: `pop_start_level()` сам заходит в стартовую комнату 23, - взводит гряду, и она доваливается ЗАОЧНО (через `trob` комнаты 17), пока - телепорт уносит Кида в комнату 24; -- **поставить сцену руками** (записать `pop_ceil_modif[2..7]` и копию ряда - сверху `pop_t_above[2..7]` отладчиком) — записи ложатся, но пока машина - БЕЖИТ, их успевает обнулить тот же доваливающийся `trob`. - -Рабочий рецепт (идея пользователя, самый чистый): **`ESC` → зонды → -`roomtest`**. `ESC` выходит в DSS, запуск заново стартует уровень 13 с нуля, -Кид сразу в комнате 23, каскад начинается через ~5 логических кадров после -отрисовки комнаты. Зонды обязаны стоять **ДО** набора `roomtest` — за время -набора (9 клавиш ≈ 1,8 с) и загрузки атласов каскад успевает пройти целиком. - -## 2. Канал вывода замеров - -`printf` из действия брейкпоинта в `error.log` **не** попадает. Читается -verb'ом **`clog N`** плагина `mamebridge` — а его нет в MCP-обёртке -(`mame_mcp.py` знает только `cmd`). Годится прямой файловый IPC: -положить `/tmp/mame_mcp/req_<ЧИСЛО>.txt` с телом команды и прочитать -`resp_<ЧИСЛО>.txt`. **Имя обязано содержать ЧИСЛО** (`init.lua`: -`entry:match("^req_(%d+)%.txt$")`) — с буквенным id запрос молча не -обслуживается. - -Скрипты сессии (в scratchpad, при необходимости пересоздать): `mrpc.py` — -клиент IPC; `run.sh` — цикл «`bpclear` → `ESC` → зонды → `roomtest` → `clog`»; -`parse*.py` — разбор трассы по кадрам. - -Форма зонда: `bpset ,1,{printf "<метка> %d",totalcycles; g}`. -Для `pop_dbg_kind` — `printf "K %d %d",a,totalcycles` (аргумент `uint8_t` -приходит в `A`, `__sdcccall(1)`). - -## 3. Зонды - -Адреса `out (_io_border), a` (полосы бордюра) из `roomtest.lst` плюс -однобайтовые пустышки `pop_dbg_*` из резидентного `pop_state.c`. Резидент -важен принципиально: у банковых функций один адрес 0xC000+ есть у восьми -модулей сразу, и брейкпоинт ловит все банки (так в прошлой сессии намерили -несуществующие 134 730 тактов). - -| зонд | адрес | что | -|---|---|---| -| A | 0x43E8 | `PROF(2)` — начало кадра (ввод + heal) | -| — | 0x46AF | `PROF(2)` — начало логики | -| C | 0x47D1 | `PROF(4)` — начало слоя фона (**зелёная**) | -| D | 0x4BCE | `PROF(6)` — начало спрайтов (**циан**) | -| M | 0x4C26 | `PROF(6)` — кадр Кида | -| F | 0x4C93 | `PROF(6)` — fore поверх Кида | -| E | 0x4CB7 | `PROF(0)` — конец работы, ждём vsync | -| m5/m6/m7 | 0x4DC6 / C7 / C8 | границы внутри зелёной | -| m9..m12 | 0x4DCA..CD | внутренности `pop_loose_tick` | -| m13/m14/m15 | 0x4DCE / CF / D0 | `pop_ceil_shake_draw`: вход / heal / draw_tile | -| kind / m16 | 0x4DD1 / D2 | вид и цена одной перерисовки в `pop_redraw_needed` | -| b1..b5 | 0x4DD3..D7 | участки одного `pop_blit_b` | - -Полезные адреса состояния (из `roomtest.map`): `pop_t_room` 0x95F2, -`pop_current_level` 0x9945, `pop_ceil_modif` 0x9C9E, `pop_t_above` 0x95EE -(указатель), `pop_kid_dead` 0x9C4E, `pop_dbg_rdmax` 0x95B1. -Запись в память через MCP — по адресу `0x10000 | addr` (логический вид Z80); -присваивание выражением дебаггера (`print b@... = 1`) **не работает**. - -**Грабли:** проверять, что запущен РОВНО ОДИН MAME (`pgrep -f mame.arm | wc -l`). -Мост говорит с одним, замеры собираются с другого, и точки «не срабатывают». - ---- - -## 4. Сводка по кадрам - -**Базовый замер (`c312e4a`, ДО оптимизации):** - -| фаза каскада | работа | синяя | зелёная | циан | период (растр.) | -|---|---:|---:|---:|---:|---:| -| покой в комнате 23 | 190 860 | 134 550 | 35 760 | 20 550 | **3** | -| дрожат 6 плит | 537 400 | 142 700 | 366 000 | 28 700 | **4** | -| провалы + полёт, ПИК | **1 437 150** | 142 700 | **663 250** | **631 200** | **5–6** | -| максимум по секции | | 142 830 | **805 000** | **631 800** | | - -**После оптимизации (`af189a1`, 2026-08-17):** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| было | 1 437 150 | 142 830 | 805 000 | 631 800 | -| стало | **916 458** | 142 830 | **546 900** | **270 510** | -| | −36 % | — | −32 % | −57 % | - -**Регресс после обхода уровней 1-2 (`ec1f384`, 2026-08-17), 418 кадров:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после оптимизации (`af189a1`) | 916 458 | 142 830 | 546 900 | 270 510 | -| после фиксов ур. 1 (`40f0d46`) | 873 930 | 158 874 | 417 630 | 379 482 | -| **после фиксов ур. 2 (`ec1f384`)** | **878 550** | **158 880** | **419 526** | **379 488** | - -Фиксы второго уровня (чёрные бары, чит бессмертия) на бюджет не повлияли: -разница с предыдущим замером +4 620 работы и +1 896 зелёной — шум прогона. - -**Регресс после обхода уровней 3-7 (`3bcaf51`, 2026-08-18), 2435 кадров:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после фиксов ур. 2 (`ec1f384`) | 878 550 | 158 880 | 419 526 | 379 488 | -| **после фиксов ур. 3-7 (`3bcaf51`)** | **880 170** | **159 774** | **419 520** | **380 244** | -| разница | +1 620 | +894 | −6 | +756 | -| | +0,2 % | +0,6 % | 0,0 % | +0,2 % | - -Все четыре секции — в пределах шума прогона (сравнить с +4 620 / +1 896 -выше, которые уже признаны шумом). Зелёная совпала с точностью до 6 тактов. - -Что за это время добавилось в горячий путь: `pop_spike_frame` и -`pop_chomp_pose` (SPIKE-BAKED) — один резидентный `call` на слой и ТОЛЬКО на -тайлах-ловушках, в этой комнате их нет; и снятие раннего выхода для трупа -(DIED-ON-BUTTON) — цепочка физики на мёртвом Киде, а он тут жив. Замер это -подтверждает: цена не сдвинулась. - -Распределение периода тоже совпало с эталоном кадр в кадр: **3 растра в -2408 кадрах, 4 в 24, 5 в одном** — против «3 в 392, 4 в 24, 5 в одном» -у `ec1f384` (кадров в этом прогоне больше просто потому, что дольше стояли в -покое после каскада). То есть за бюджет вылезает ровно тот же кусок сцены и -ровно на столько же кадров. - -**Регресс после обхода уровней 8-9 (`0dd2f6a`, 2026-08-18), 2701 кадр:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после фиксов ур. 3-7 (`3bcaf51`) | 880 170 | 159 774 | 419 520 | 380 244 | -| **после фиксов ур. 8-9** | **880 272** | **159 822** | **419 562** | **380 202** | -| разница | +102 | +48 | +42 | −42 | - -Разброс ±100 тактов на 880 000 — это 0,01 %, то есть чистый шум прогона -(циан вообще ушёл в минус). Период снова совпал кадр в кадр: 4 растра в -24 кадрах, 5 в одном. - -Что добавилось за это время и почему не подорожало: фиксы стража -(`c40ae3f`) правят только вход в комнату — кода в кадре не прибавилось; фикс -боя у шва (`a498255`) добавил два сравнения в `check_leave`, а в этой сцене -Кид неподвижен и до порогов не доходит. Отладочная трасса `DBG_KIDOBJ` -выключена дефайном и в сборку не попадает. -Скачок циан на фиксах ПЕРВОГО уровня (270 510 → 379 482) объяснён там же: -восстановлены потерянные половины слоёв (`set_redraw2`, ряд −1 foretable), то -есть это плата за корректность, а не регрессия. - -Период кадра по прогону: **3 растра в 392 кадрах, 4 в 24, 5 в одном** — то -есть за бюджет вылезает только сам каскад. - -Цель — каждая секция ≤ 400 000. **Синяя и циан в бюджете**; зелёная 419 526, -то есть 1,05× цели (и ниже растрового кадра 430 000), остаток разобран в -[`perf_green_phase.md`](perf_green_phase.md) §3 (нужен раскол `draw_tile` на -узкие части, как в оригинале) и в идее G8 (сузить инвалидацию соседнего тайла -до 28-пиксельной полосы). - -Где что расходуется и как это чинить — в фазовых документах: -[зелёная](perf_green_phase.md), [циан](perf_cyan_phase.md). - -### Общий вывод по пиковому кадру базового замера (1 437 150) - -| | такты | доля | -|---|---:|---:| -| блиты (все 27–28 вызовов `pop_blit_b`) | 488 100 | 34 % | -| из них «железный» минимум пикселей (модель `198*h + 5,96*w*h`) | ~150 000 | 10 % | -| синяя (ввод + heal + логика) | 142 700 | 10 % | -| **наши накладные: `draw_tile`, IX-кадры, диспетчер, пометки** | **~1 150 000** | **~80 %** | - -Узкое место — НЕ передача пикселей (она на пределе железа, 3+3 такта на байт, -memory `blit_cost_model`), а 16-битная арифметика в стековых кадрах. - ---- - -## 5. Габариты спрайтов: можно ли всё перевести на `uint8_t` - -Просканированы каталоги ВСЕХ `.atl` (109 файлов) и исходные PNG наборов -`TITLE`/`PV` — тех, что понадобятся для интро, финала и роликов между -уровнями. - -**Игровой кадр — весь укладывается в байт:** - -| набор | максимум | -|---|---| -| фон подземелья/дворца (`*_env*`, `*_wall`, `*_fore`, `pop_pot`) | **48 × 63** | -| Кид (`kid0..27`, `sword`) | **56 × 63** (kid3, idx 0) | -| страж / скелет / Джафар | **53 × 42** | -| спрайты комнаты принцессы (`PV.DAT`: персонажи, песочные часы, факел, звёзды) | **49 × 60** | - -**Больше 255 — только полноэкранные подложки титров и сюжетных экранов.** -Их восемь, и все рисуются ОДИН раз при показе экрана: - -| ресурс | размер | где (`data.h`, `full_image[]`) | -|---|---|---| -| `TITLE/res51` | 320 × 200 | `TITLE_MAIN`, xpos 0 ypos 0 | -| `TITLE/res41` | 320 × 200 | `STORY_FRAME`, xpos 0 ypos 0 | -| `PV/res951` | 320 × 200 | фон комнаты принцессы (`chtab_9_princessbed`) | -| `TITLE/res42..res45` | 272 / 267 / 264 / **256** × 134..142 | «presents», «Prince of Persia», «Mechner» | -| `TITLE/res54` | 272 × 65 | заголовок Hall of Fame | - -Высота нигде не превышает 200 — в байт лезет. По ширине не лезут ровно эти -восемь, и ни одна из них не участвует в игровом кадре. - -**Вывод: горячий путь можно переводить на 8-битные габариты целиком.** -Для подложек — решение пользователя (2026-08-17): работу с роликами вынести в -отдельный банк с версиями блита под большие спрайты либо звать libbgi напрямую -— клип и проверка выхода за экран им не нужны (рисуются в x = 0/24/48/96, -заведомо внутри 320×200). Ширина 320 всё равно потребует ДВУХ burst-скобок -акселератора на строку — как уже сделано в `pop_vflip`. - -Существующая страховка уже есть и остаётся: `pop_blit_b` уводит кадр с -`img[1] | img[3] != 0` на общий путь `blit_b_oversize`. - -**Регресс после дня оптимизации 11/15 (`d0ac4b1`, 2026-08-19), 2367 кадров:** - -| максимум по секции | эталон `mob-order-B-done` | сейчас | разница | -|---|---:|---:|---:| -| работа | 913 848 | **911 862** | −1 986 | -| синяя | 159 810 | **149 106** | −10 704 | -| зелёная | 440 418 | **436 494** | −3 924 | -| циан | 393 000 | **382 770** | −10 230 | - -Период: **3 растра в 2341 кадре, 4 в 23, 5 в 2** — как в эталоне. - -Почему сумма минусов по фазам не равна минусу по работе: максимумы разных -фаз достигаются В РАЗНЫХ КАДРАХ (пик синей — не тот кадр, где пик зелёной), -а «работа» здесь — максимум СУММЫ, а не сумма максимумов. - -Что из правок 11/15 сюда дошло: P16 и P2b дали синюю и циан (они про -проверки и луч видимости, а те работают в любой сцене), HEAL-WIDTH дал -зелёную (плита 64 → 58 на шести heal'ах кадра). - -**Зелёная по-прежнему выше растрового кадра** (436 494 против 430 000). -Главный оставшийся кандидат именно для этой сцены — **P9 (G8)**: при -падении плиты помечаются ДВА тайла, и соседний перезапекается целиком и -повторно (`draw_tile` соседа дважды на одну пометку), хотя потревожены у -него только левые 28 пикселей. При шести падающих плитах это умножается -на шесть. - -**ВАЖНО ДЛЯ ПРОЦЕССА.** Этот прогон вскрыл регрессию, которую не поймали -ни хост-тесты, ни сцена 11/15: гейт `loose_any` (позиция P5) не взводился -в `check_fall_flo`, и плиты уровня 13 дрожали, не падая. Сцену 13/23 надо -прогонять после КАЖДОЙ правки loose-механики, а не только когда меняешь её -сознательно. diff --git a/applications/PoP/docs/perf_registry.md b/applications/PoP/docs/perf_registry.md deleted file mode 100644 index e9116bb..0000000 --- a/applications/PoP/docs/perf_registry.md +++ /dev/null @@ -1,871 +0,0 @@ -# Реестр оптимизаций: всё отложенное, в одном списке - -Собрано 2026-08-19 из [`perf_green_phase.md`](perf_green_phase.md) (G1-G9), -[`perf_cyan_phase.md`](perf_cyan_phase.md) (C1-C7), -[`perf_backlog.md`](perf_backlog.md) (позиции 1-7), -[`../roomtest/TASKS_OPEN.md`](../roomtest/TASKS_OPEN.md) (HEAL-WIDTH) и из -свежего разбора сцены [`perf_l11_room15.md`](perf_l11_room15.md). - -**База для процентов — работа кадра в 11/15: 801 768 тактов** (замер -`09f32ce`). Где эффект относится к другой сцене, это сказано явно. - -Оценки помечены: **[замер]** — измерено; **[модель]** — посчитано по -измеренным составляющим; **[гипотеза]** — не мерено, нужен прогон. - ---- - -## 1. Цена одного блита фона — разложена [замер 2026-08-19] - -Метод: брейкпоинты на резидентных адресах внутри `pop_blit_b` (0x5C50), -`temp0` на входе, разница `totalcycles` на каждом вызове. 1603 блита. - -| этап | такты | постоянство | -|---|---:|---| -| пролог + аргументы + грубый отсев | **810** | ровно, всегда | -| `atlas_image` | **672** | ровно, всегда | -| `gfx_w0_map` + чтение шапки ленты + арифметика клипа | **2 400** | ровно, всегда | -| ядро блита (пиксели) | 4 380 … 26 592 | по размеру кадра | -| `pop_cd_touch` | **2 069** (пакетный путь) / 4 115 (настоящая пометка) | почти ровно | -| `gfx_w0_unmap` + эпилог | **175** | ровно, всегда | -| **весь блит** | 10 458 … 32 718, медиана **16 674** | | - -**Фиксированная накладная = 6 126 тактов на любой блит, хоть 8×8.** -У самого дешёвого блита (10 458) это **59 % цены**; у пламени факела 16×18 -пиксели тянут ~1 700 из ~14 000, то есть **12 %**. - -Это и есть ответ на вопрос «почему маленький блит стоит 14 000». Причины -ровно те, о которых спрашивал пользователь: - -- **810 на пролог** — `call ___sdcc_enter_ix`, IX-фрейм и шесть чтений - `N(ix)`: третий и четвёртый аргументы (`int x`, `int ybottom`) идут - СТЕКОМ, каждое обращение 19 тактов Z80; -- **2 069 на `pop_cd_touch`** даже по пакетному пути, где вся работа — четыре - сравнения. Сигнатура `(int x, int y, int w, int h)` = 8 байт аргументов, - два из них через стек; `w`/`h` никогда не больше 64, `y` не больше 255, - то есть три из четырёх могли быть `uint8_t`; -- **2 400 на map + шапку** — `gfx_w0_map` (1 086) + `unmap` (264, платится в - конце) + ~1 000 на чтение четырёх байт заголовка и арифметику; -- **672 на `atlas_image`** — маппинг W3, чтение записи каталога, возврат W3; - размеры при этом читаются и выбрасываются (см. §3, C6). - -**Блитов за кадр в 11/15: 8** [замер] — все в зелёной фазе (6 на `draw_tile` -чомпера, 2 на пламя факелов). Синяя и циан через `pop_blit_b` не ходят -вовсе: heal и персонажи идут своими путями. Значит фиксированные накладные -блита стоят сцене **8 × 6 126 = 49 000 тактов/кадр (6,1 % работы)**. - ---- - -## 2. Модель зелёной фазы 11/15 [модель, сходится с 320 916 замера] - -| статья | такты | доля фазы | -|---|---:|---:| -| 8 блитов фона (из них 6 126×8 = 49 000 накладных) | 133 400 | 41 % | -| диспетчер `draw_tile` (один тайл чомпера) | 56 200 | 18 % | -| цикл `pop_process_trobs` без блитов пламени | 59 100 | 18 % | -| `pop_loose_tick` (плит в комнате НЕТ) | 28 872 | 9 % | -| heal 32×64 в `pop_chomp_redraw` | 34 000 | 11 % | -| шов / ворота соседа | 9 336 | 3 % | - -Больше половины фазы — не пиксели, а обвязка вокруг них. - ---- - -## 3. Список приёмов, отсортированный по эффекту - -### P1. Чомпер: перерисовка неизменной позы ✅ СДЕЛАНО 2026-08-19 — −110 802 - -**Диагноз, с которым позиция заводилась, оказался неполным.** Я приписал -190 260 тактов пометке от факела; зонд `pop_dbg_kind` показал, что все 312 -перерисовок прогона — вид `POP_RD_CHOMP` (полная), а пометку соседа она -просто перебивала. Настоящая причина нашлась сверкой с `animate_chomper` -(seg007:0448): оригинал перерисовывает чомпер **только при фазе < 6**, пять -кадров из пятнадцати, потому что с фазы 5 поза не меняется -(`chomper_fram1 = {3,2,0,1,4,3,3}`). Мы метили тайл каждый кадр. - -Сделано три вещи: условие фазы (с пометкой обеих страниц на фазе 5), новый -вид `POP_RD_CHOMP_ANIM` → `pop_chomp_anim_draw` (три блита поверх огня, порт -ветки `redraw_frames_anim`) и приоритет полной перерисовки над anim в -`pop_set_redraw`. Обе половины работают: замер даёт 40 % полных -перерисовок и 60 % лёгких. - -Работа 768 684 → **657 882** (медиана), зелёная 294 510 → **183 420**. -В 40 % кадров цена осталась прежней — там поза действительно меняется, и это -уже честная работа; резать её дальше только через P7 (раскол `draw_tile`) -или P8 (ширина heal). - -Полный разбор — [`perf_l11_room15.md`](perf_l11_room15.md) §6. - -
Исходная (неполная) постановка - -Разбор в [`perf_l11_room15.md`](perf_l11_room15.md) §3. Сейчас пометка от -факела обрабатывается как `heal 32×64 + полный draw_tile` (190 260 тактов на -единственный перерисованный тайл кадра); оригинал в этом случае рисует -ТОЛЬКО `draw_tile_anim` — графику чомпера поверх свежего пламени. - -Останется 1-2 блита челюстей ≈ 20 000-33 000. **Риск низкий**: это -сближение с оригиналом, а не отход от него. Побочно снимает широкую пометку -«фон трогали» вокруг тайла чомпера — см. P3. - -
- -### P2. Синяя фаза разложена [ЗАМЕР 2026-08-19] — гипотеза не подтвердилась - -Замер зондами внутрь обеих половин синей (286 518 тактов): - -| участок | такты | доля работы | -|---|---:|---:| -| ввод + читы | 14 154 | 1,8 % | -| три спецсобытия уровней (skel / mouse / killed_shadow) | **1 650** | 0,2 % | -| `pop_frame_timers` + **луч видимости стража** | **37 032** | 4,8 % | -| `pop_ctrl_tick` | 18 648 | 2,4 % | -| `skip_mask` + **heal двух Char** | **67 734** | 8,8 % | -| `mirror_heal` + `fore_heal` | 2 040 | 0,3 % | -| `kid_tick` (play_seq) | 10 098 | 1,3 % | -| **`pop_phys_tick`** (физика Кида) | **61 266** | 8,0 % | -| `pop_guard_tick` (логика стража) | 19 932 | 2,6 % | -| **`pop_guard_phys_tick`** (физика стража) | **43 980** | 5,7 % | -| боёвка (`sword_hurting` / `sword_hurt` / `delta_hp`) | 9 558 | 1,2 % | -| `guard_fallout` + уход из комнаты | 366 | — | - -**Что оказалось не так, как ждали.** Я предполагал, что дорогие тут -банковые трамплины на спецсобытиях (по аналогии с `pop_clip_char_top`, -8 892 такта за трамплин ради одной проверки). Замер это отверг: три -спецсобытия уровней вместе стоят **1 650** — они гейтятся внутри и на -уровне 11 честно выходят сразу. - -**Настоящие статьи — три:** - -1. **Физика двух Char — 105 246** (61 266 + 43 980), при том что оба - персонажа СТОЯТ и кадр позы не меняется. Это 13,7 % работы кадра и - самая крупная статья синей. Нужен ещё один уровень разбора — внутрь - `pop_phys_tick` (позиция **P2a**, отдельным заходом). -2. **Луч видимости стража — до 37 032** (вместе с `pop_frame_timers`, но тот - заведомо копеечный: три счётчика). Считается КАЖДЫЙ кадр, хотя ни Кид, - ни страж не сдвинулись. Кандидат на гейт «пересчитывать только при - смене позиции или комнаты любого из двоих» — позиция **P2b**, - ожидание −30 000, риск низкий. -3. **heal двух Char — 67 734.** Отдельной правки не требует: он платится - ровно потому, что `skip_mask` никого не пропускает, и уйдёт вместе с - P1/P3. - -Новое, найдено 2026-08-19. - -### P15. Точность метки «фон трогали» ✅ СДЕЛАНО 2026-08-19 — −163 746 / −140 871 - -Постановка пользователя: не перерисовывать стража, пока он не двигается. - -**Две правки, и вторая оказалась решающей:** - -1. **метка**: вместо «маска колонок × три ряда по 63 px» — диапазон y на - каждую колонку (`ymin`/`ymax`, 40 байт на обе страницы). Прежняя - гранулярность склеивала пламя факела (y 33..50) с клинком стоящего - стража (y 59..65), между которыми девять пикселей зазора; -2. **проверка**: `cd_quiet` сверяет спрайт и накладной (клинок, брызги) - ДВУМЯ отдельными прямоугольниками вместо объединённого bbox. - Объединение включает пустой угол: спрайт стража в колонке 8, клинок - уходит в колонку 7 на y 59..65, пламя метит колонку 7 на y 33..50 — - и прямоугольник «спрайт + клинок» цеплял метку углом. - -**Без второй правки первая дала почти ноль** (632 676 против 628 542 до -неё) — это стоит помнить: точность структуры бесполезна, пока запрос к ней -остаётся грубым. - -| | лёгкая позиция | тяжёлая позиция | -|---|---:|---:| -| синяя | 259 050 → **223 902** | 257 520 → **245 808** | -| зелёная | 181 494 → 181 494 | 180 870 → 181 761 | -| циан | 194 262 → **59 406** | 319 842 → **192 090** | -| **работа** | 628 542 → **464 796** | 758 358 → **617 487** | - -В тяжёлой позиции вдобавок исчезли пятирастровые кадры (было 27 %). - -Проверено в MAME: статика чистая, динамика (пробежка, бой, переход в -соседнюю комнату) без хвостов и просвечивания; хост-тесты зелёные. - -Побочно исправлены два собственных дефекта первой редакции: обе страницы -обновлялись по условию, проверяющему только страницу 0 (после -`pop_cd_clear(0)` метка второй переставала расти), и отсутствовала явная -инициализация — пустая колонка обозначается `ymin = 255`, а нули от crt0 -читались бы как «затронута строка 0». - -### P16. Цианные проверки ✅ СДЕЛАНО 2026-08-19 — −25 818 - -Раскладка остатка цианной фазы (59 406) показала, что 47 883 из них — три -вызова, а не отрисовка: - -| вызов | было | стало | -|---|---:|---:| -| `pop_loose_mob_draw` | 978 | 978 (гейт `mobs_live` работает) | -| `guard_over_kid` | 14 424 | **0** | -| `pop_char_skip_mask` | 28 605 | ~21 000 | - -Три правки: - -1. **`cd_sig_same`** — сравнение снимка БЕЗ построения структуры. - `cd_sig_make` записывал тринадцать полей в стековый кадр (через - `-n(ix)`), и лишь потом шёл побайтовый цикл; теперь сравнение идёт прямо - с источником и выходит на первом расхождении. **−8 016**; -2. **`guard_over_kid` по условию** — вопрос «кто поверх кого» не имеет - смысла, когда не рисуется никто. Вызов перенесён ПОСЛЕ `skip_mask` и - идёт только при `skip != 3`. **−14 118**; -3. **`pop_cd_hit_slot`** — проверка «задет ли слот» брала пять аргументов, - три из них стеком (45 % тактов на IX). Теперь координаты берутся из - `pop_cd`, а сравнение вынесено в `hit_rect` с file-scope аргументами. - **−3 684**. - -**Отрицательный результат внутри третьей правки** (не повторять): первая -версия была обёрткой, которая внутри всё равно звала `pop_cd_hit` с пятью -аргументами — стало ХУЖЕ (1799 тактов Z80 вместо 1318). Снимать аргументы -со стека надо у того, кто их читает, а не этажом выше. - -### Отрицательные результаты 2026-08-19 — НЕ ПОВТОРЯТЬ - -Три попытки подряд сделали ХУЖЕ. Общая ошибка в двух из них — я оценивал -правку по СУММЕ ТАКТОВ ИНСТРУКЦИЙ в листинге, а не по реально исполняемому -пути. - -**1. `cd_sig_same` блоком вместо тринадцати сравнений.** Снимок был -переложен так, чтобы сравнивать непрерывные 10 байт начала `pop_char_t` -циклом `do { if (*a++ != *b++) return 0; } while (--i)`. По листингу -функция стала короче (1939 → 1290 тактов), а на машине **стало хуже: -438 978 → 450 426 (+11 448)**. - -Причина: сумма по листингу считает каждую инструкцию ОДИН раз, а тело -цикла исполняется ДЕСЯТЬ раз. Тринадцать линейных сравнений выполняются по -разу каждое и выходят раньше на первом же расхождении. **Урок: короткий -листинг ≠ быстрый код; цикл надо разворачивать в уме.** - -**2. `cd_touch_pb` — пометка «для блита» из file-scope.** `pop_cd_touch` -зовётся из `pop_blit_b` с четырьмя аргументами, хотя тот держит те же -значения в `pb_x`/`pb_top`/`pb_w`/`pb_h`. Специализированный вход без -аргументов дал **438 978 → 442 242 (+3 264)**. - -Причина: в зелёной фазе блиты идут ПАКЕТНЫМ путём (`draw_tile` открывает -`pop_cd_batch`), а там нужны все четыре значения сразу — и в регистрах -(`x`, `y` приходят в HL/DE) они дешевле, чем чтение из статиков. -**Снятие аргументов со стека помогает не всегда: если значение и так живёт -в регистре, статик его туда ещё и загружать заставит.** - -**3. Обёртка `pop_cd_hit_slot` поверх `pop_cd_hit`** (описана в P16): -внутри всё равно звала функцию с пятью аргументами и добавила свои — стало -1799 тактов вместо 1318. Помогло только когда сравнение переехало внутрь. - -### P14. Fore-проход персонажа — от 4 122 до 117 570 [замеры 2026-08-19] - -**Самая НЕСТАБИЛЬНАЯ статья кадра.** Замеры на одной и той же сцене: - -| ситуация | fore-проход | -|---|---:| -| персонаж пропущен (`skip`) | 4 122 | -| стоящий страж | 62 778 | -| живой Кид у чомпера | ~89 000 | -| **труп Кида в челюстях** | **117 570** | - -Растёт от двух вещей: ширины футпринта (широкий кадр смерти, вынутый меч -добавляет колонку) и числа тайлов с передним слоем внутри футпринта (здесь -чомпер со своими зубьями). Отсюда практический вывод: **в бою проход будет -ближе к сотне тысяч, чем к шестидесяти** — кадры выпадов и ударов широкие. - -Замер трупа сделан по просьбе пользователя. Сама по себе эта ситуация не -игровая («когда Кид — труп, игры нет»), но именно она показала верхнюю -границу цены. - -**РАЗБОР 2026-08-19: P14 сводится к P4.** Fore-проход Кида в тяжёлой -позиции (89 268) разложен зондами: - -| участок | такты | -|---|---:| -| вход + `pop_fore_set_clip` + `char_footprint` | 10 872 | -| арифметика границ окна | 3 786 | -| шов ворот + overlay-цикл | 3 294 | -| **цикл `fore_tile` по тайлам** | **67 854** (76 %) | -| `pop_gate_over_char` + хвост | 3 462 | - -А счётчик показал, что цикл обходит **всего 4 тайла**, и 3 из них реально -рисуют (`FORE_ANY != 0`). То есть 67 854 — это НЕ перебор лишних тайлов -(их четыре) и не проверки, а **цена самих блитов переднего слоя**: около -четырёх блитов по ~16 000, из которых 6 765 на каждом — фиксированная -накладная (см. §1). - -**Отсюда вывод для плана:** отдельной «оптимизации fore-прохода» почти нет. -Срезать там можно ровно три вещи, и только первая крупная: - -1. **цену блита (P4)** — 4 блита × 6 765 накладных = ~27 000 из 67 854; -2. `char_footprint` из физики (**P10**) — часть от 10 872; -3. слияние двух трамплинов в банк 2 — ~4 000. - -Иначе говоря, **P4 ускоряет и зелёную фазу (8 блитов), и fore-проход -(4 блита), то есть работает и в статике, и в динамике** — в отличие от -P14, который я считал самостоятельной позицией. - -`pop_char_fore` = два трамплина в банк 2 (`pop_fore_set_clip` + -`pop_fore_over_char`) плюс обход тайлов футпринта, в каждом `fore_tile`. -У Кида дороже, чем у стража, потому что в его футпринте лежит чомпер, а у -чомпера есть собственный передний слой (`POP_CHOMP_FRAM_FOR`), который -перерисовывается поверх персонажа каждый кадр. - -Что можно пробовать, по возрастанию радикальности: - -1. слить два трамплина в один вызов (мелочь, ~4 000); -2. **P10** — брать футпринт из физики, а не считать заново (−11 574 на - проход, то есть до −23 000 на двоих); -3. гейт по сигнатуре: пропускать проход, если не изменились ни кадр - персонажа, ни тайлы его футпринта. **Это расхождение с оригиналом** — - он рисует foretable безусловно; -4. **P13** — objtable и отложенные таблицы: у оригинала «посетить тайл» - стоит копейки именно потому, что таблицы только копят записи. - -### P3. Персонажи будятся каждый кадр ✅ ЧАСТИЧНО СБЫЛОСЬ - -**В лёгкой позиции — да:** после P1 `pop_char_draw(KID)` стоит 204 такта, -метка от чомпера до Кида больше не дотягивается. - -**В тяжёлой позиции — нет:** стоит Киду шагнуть на 7 пикселей вправо, и его -спрайт пересекается с тайлом чомпера и пламени, `skip_mask` перестаёт -пропускать, и он снова стоит ~144 000 (54 738 draw + ~89 000 fore). То -есть выигрыш P3 держится только пока персонаж не подошёл к анимированному -тайлу — а в игре он к нему подходит постоянно. - -Исходная оценка (−70 000) была: - -heal 141 048 + отрисовка 148 566 = 290 000 тактов (36 % работы) уходят на то, -что `pop_char_skip_mask` не может пропустить ни Кида, ни стража: фон трогают -каждый кадр. - -- **Кида** спасает P1: широкая пометка вокруг чомпера исчезнет; -- **стража спасти нельзя** — пламя правого факела (0,7) рисуется в ячейке - (0,8), где он и стоит. Там фон честно меняется, и оригинал персонажа тоже - перерисовывает. - -### P17. 16 бит там, где хватает 8 ✅ 2026-08-19 (замечание пользователя) - -**1. Границы экрана — беззнаковыми сравнениями.** Проверка «спрайт целиком -на экране» стояла как четыре ЗНАКОВЫХ 16-битных сравнения, а знаковое у -SDCC z80 разворачивается в `sbc` плюс `jp PO / xor 0x80 / jp P`. -Беззнаковая форма делает то же двумя: отрицательная координата становится -очень большой и проваливает условие так же, как `>= 0`. **−378.** - -**2. Габариты спрайтов в байтах.** `w`/`h`, `ow`/`oh`, `fpw`/`fph`, -`cw`/`ch` в `pop_cdraw_t`, параметры `cd_overlay_add`/`cd_clip_add`, локали -в `pop_char_draw`/`cd_splash` и чтение габарита из шапки ленты были -`uint16_t`, хотя спрайты атласов не крупнее 64×64 (memory -`pop_sprite_size_limits`). **−276 в статике, −1 134 в циане динамики**, -плюс 24 байта `_DATA`. - -### P6a. Кэш указателя модификаторов ✅ 2026-08-19 — −840 (ждали −20 000) - -`pop_trob_modif` объявлен `__banked`, а звался на КАЖДЫЙ trob внутри цикла -`pop_process_trobs`, хотя комната у них в подавляющем большинстве кадров -одна. Указатель теперь кэшируется между итерациями. - -Цикл trobs 78 726 → **74 964**, работа кадра 438 324 → **437 484**. - -**Оценка в реестре была завышена в двадцать раз**, и стоит понять почему: -я перенёс её по аналогии с лучом видимости (P2b), где трамплин звался -ДЕВЯТЬ раз за кадр. Здесь trob'ов в комнате всего несколько, и кэш -экономит два-три вызова. **Урок: «тот же паттерн» не означает «тот же -порядок величины» — считать надо число вызовов, а не узнавать шаблон.** - -### P6b. Кэш префетча кодов тайлов — НЕ ДЕЛАЛОСЬ - -Префетч (`pop_level_access_begin/end` плюс чтение кода на каждый trob) -стоит **11 058** за кадр. Кэшировать мешает инвалидация: код тайла меняет -`pop_level_set_tile` (кнопка → пол, loose → empty), вход в комнату и -добавление trob'а — пропустить хоть один источник значит получить -застывшую анимацию. С учётом того, что P6a дал 840 вместо 20 000, -ожидаемый выигрыш тут тоже стоит считать скромным, а риск он несёт -несоразмерный. - -### P10. Футпринт из физики — РАЗБОР 2026-08-19 (без реализации) - -Идея из `perf_backlog.md` §1: `redraw_at_char` (seg003:0430) берёт ГОТОВЫЕ -`char_col_left/right`, `char_top_row`, `char_bottom_row`, посчитанные в том -же кадре физикой (`set_char_collision`, seg006:0723), а наш -`char_footprint` (pop_bg.c) считает их заново внутри fore-прохода. - -**Разбор показал, что «просто передать» не получится: величины разные.** - -| | `char_footprint` (банк 2, fore) | `set_char_collision` (банк 3, физика) | -|---|---|---| -| ширина | габарит КАДРА `w` из атласа, `wh = (w+1)/2` | то же `fpw`, но затем **`FRAME_THIN` сдвигает края на ±4** | -| меч | расширяет диапазон на колонку (`sword >= DRAWN`) | не расширяет | -| колонки | `cLraw` до клампа (нужен для шва), затем кламп 0..9 | `coll_xl`/`coll_xr` в пикселях, колонки считает уже `calc_coll_window` | -| ряды | `rT`/`rB` от ВЕРХА и НИЗА спрайта, с форсом `rT = rB-1` | `Char.curr_row` — опорный ряд, это другое | - -То есть у оригинала обе задачи пользуются ОДНИМИ величинами, потому что он -считает их один раз в `set_char_collision`. У нас они исторически -разошлись: коллизии считают своё окно (с поправкой `FRAME_THIN`), fore — -своё (габарит кадра плюс колонка под меч). - -**Значит P10 — это не «передать готовое», а сперва СВЕСТИ обе величины к -одной, как в оригинале.** Работа не механическая: `FRAME_THIN` влияет на -коллизии осознанно (узкие кадры не должны цеплять стену), а fore-проходу -нужен полный габарит, иначе передние грани в крайней колонке не -перерисуются. - -**Чего не хватает для решения:** отдельного замера самого -`char_footprint`. Сейчас известно только «вход + `pop_fore_set_clip` + -`char_footprint` = 10 872», а оценка −11 574 в backlog взята из старого -замера другой сборки. Первым шагом нужен зонд между `set_clip` и -`char_footprint`. - -**Оценка приоритета:** низкая. Даже если `char_footprint` окажется всеми -10 872, он платится только когда персонаж рисуется (в статике fore-прохода -нет), а сведение двух геометрий к одной — это риск для коллизий, то есть -для физики, которая сейчас работает правильно. - -### P18. Метка «фон трогали» огрублена по X — ОТЛОЖЕНО (решение пользователя) - -**Найдено 2026-08-19 пользователем:** Кид перерисовывается, хотя с пламенем -не пересекается; на пиксель левее — перестаёт. - -Разбор по памяти машины. Кид `x = 156`, спрайт занимает **x 213..224**, -экранные y 43..83. Метка колонки 7 — y 33..50 (пламя правого факела). -Колонка считается как `x >> 5`, то есть по 32 пикселя, и спрайт достаёт до -224 — ровно первый пиксель колонки 7. По вертикали пересечение с меткой -настоящее (43..50), поэтому слот считается задетым. - -А по горизонтали пересечения НЕТ: пламя лежит в колонке 7 на x 232..247, -между ним и Кидом восемь пикселей зазора. На пиксель левее спрайт -кончается на 223, `223 >> 5 = 6`, колонка 7 не задета — и перерисовка -пропадает. - -То есть P15 исправил огрубление по Y и оставил его по X. - -**Почему отложено (аргументы пользователя):** - -- x лежит в 0..319 и в байт не влезает — нужен `uint16_t` на границу, то - есть 4 байта на колонку (80 байт на две страницы), и **16-битные - сравнения в горячем пути**. А они у SDCC z80 дороги ровно настолько, - что могут съесть весь выигрыш (см. отрицательные результаты выше); -- огрубить x вдвое (`x >> 1`, диапазон 0..159 влезает в байт) — это лишний - сдвиг и при записи, и при проверке, плюс точность падает до 2 пикселей. - -**Непроверенная идея на будущее:** хранить границы НЕ в экранных x, а как -смещение ВНУТРИ колонки (0..31, пять бит). Тогда байта хватает и сравнение -8-битное, но запись усложняется: прямоугольник, пересекающий несколько -колонок, даёт частичные диапазоны у крайних и полные у средних. - -**Когда браться:** если после других позиций бюджет всё ещё не сойдётся. -Выигрыш будет именно в пограничных положениях, а их в игре много — -персонаж почти всегда стоит рядом с чем-то анимированным. - -### P4. Накладные блита — ОТКАЧЕНО - -**Правка сделана и отменена по решению пользователя.** Критерий: если -выигрыш получен ценой сильно усложнённого кода — откатывать. - -Что было: `atlas_image_w0` в libbgi читал каталог из уже подключённой в W0 -страницы. **−408 на кадре** при ожидании −5 400. - -Почему откачено: цена — вторая публичная функция в API libbgi с НЕЯВНЫМ -контрактом («страница обязана быть подключена до вызова»), которую легко -вызвать неправильно и молча получить мусор, плюс дублирование чтения -каталога. 408 тактов — 0,09 % кадра, меньше разброса между прогонами. - -**Что осталось знанием:** сам `gfx_w0_map` стоит всего **324** такта, а 672 -у `atlas_image` — это почти целиком вызов функции и арифметика `idx * 8`. -Значит непробованная часть P4 («один map на группу блитов») имеет потолок -~2 600 за кадр, а не 10 000, как считалось. - -Ожидание было −5 400 (672 такта × 8 блитов зелёной фазы), и оно НЕ -оправдалось: цена блита 16 107 → 16 005, то есть −102. Причина в том, что -эти 672 — почти целиком вызов функции и арифметика `idx * 8`, а не само -переключение окна. Замер после правки показывает, что работа просто -переехала между статьями: - -| этап | до | после | -|---|---:|---:| -| пролог + отсев | 810 | 762 | -| `gfx_w0_map` | (в составе 2 400) | **324** | -| каталог + шапка ленты + клип | | **2 694** | -| ядро | 8 508 | 8 508 | -| `cd_touch` + `unmap` + эпилог | 2 883 | 2 883 | -| **фиксированная накладная** | **6 765** | **6 663** | - -Правка оставлена: не вредит, убирает лишнее переключение W3 и делает -контракт честнее (страница мапится один раз). Но как способ снять -накладные она не работает. - -**Что осталось непробованным** (и во что я теперь верю меньше): один -`gfx_w0_map` на ГРУППУ блитов — судя по замеру, сам map стоит 324, так что -потолок этой правки ~2 600 за кадр, а не 10 000, как считалось. - -
Исходная постановка (модель −28 000) - -| правка | на блит | источник | -|---|---:|---| -| `pop_cd_touch`: `uint8_t` вместо `int` для `y`/`w`/`h`, ранний выход пакетного пути | ~−1 300 | новое | -| один `gfx_w0_map`/`unmap` на ГРУППУ блитов | ~−1 350 | C5 / backlog §3 | -| размеры ленты из каталога, без `atlas_image` и чтения шапки | ~−670 | C6 / backlog §2 | -| `pop_blit_b`: аргументы в 8 бит, где хватает | ~−400 | новое | - -Все четыре — низкий риск, механическая работа. Вместе снимают ~3 700 из -6 126 фиксированных. - -
- -### P5. `pop_loose_tick` при пустой комнате — 28 872 → 2 760 ✅ СДЕЛАНО 2026-08-19 - -**Получено −26 112 внутри функции, −33 840 на кадре** (замер до/после в -11/15). Оценка была −28 000. - -Раскладка холостого хода (замер зондами m9..m12) и что с ней стало: - -| участок | было | стало | -|---|---:|---:| -| два цикла по тайлам (30 + 10 позиций) | 9 852 | **132** | -| `pop_loose_mob_tick` (обход 14 слотов) | 12 090 | **996** | -| `check_loose_fall_on_kid` (трамплин + обход) | 5 868 | **546** | -| вход + хвост | 1 062 | 1 086 | -| **итого** | **28 872** | **2 760** | - -Сделано двумя гейтами: - -- `loose_any` (статик `pop_map.c`) — «идёт ли анимация плит». Ставится в - пяти местах записи ненулевой фазы, снимается САМИМ циклом по факту - прохода, где не осталось ни одной живой фазы; -- `pop_mob_busy` (резидент `pop_state.c`) — «занят ли хоть один слот - падающего куска» (`active` или дочистка `clean`). Ставит `mob_alloc`, - снимает обход по факту пустой таблицы. В резиденте, а не в `pop_room.c`, - потому что читает его `pop_map` из банка 3. - -**Важно про границу:** гейт отвечает не на «есть ли в комнате плиты», а на -«идёт ли анимация». У лежащей плиты-потолка фаза 0, и крутить нечего — -вопрос пользователя 2026-08-19. Асимметрия намеренная: ложная единица -стоит одного холостого прохода, ложный ноль — застывшей навсегда плиты, -поэтому взвод стоит рядом с КАЖДОЙ записью, а снятие только по факту. - -Покрытие: `phys_loose_floor_breaks` (взвод от шага и сотрясения) и новый -`phys_loose_gate_survives_room_change` — на пятое место взвода -(фаза восстановлена входом в комнату), которое не покрывал никто. -Мутационная проверка: со снятым взводом тест падает. - -### P6. `pop_process_trobs` разложен [ЗАМЕР 2026-08-19] — 89 784 - -| участок | такты | -|---|---:| -| вход + префетч кодов тайлов (маппинг окна 0) | **11 058** | -| цикл: два `pop_torch_draw` | ~36 000 | -| цикл: обход самих trob'ов | ~43 000 | - -Цена одного `pop_pot_b` (пламя факела) измерена отдельно, брейкпоинтами на -резидентных адресах: **17 346 тактов**, и это ЕДИНСТВЕННАЯ группа в -распределении — то есть `pop_pot_b` в кадре зовут только два факела. При -канвасе пламени 16×18 сами пиксели там 1 716, то есть **10 % цены**; всё -остальное — накладные (см. §1) плюс ~6 900 сверх `pop_blit_b` на самом -`pop_pot_b`. - -Направления: - -- **P6a**: `pop_trob_modif(room)` зовётся банковым вызовом на КАЖДЫЙ trob - внутри цикла, хотя комната у них одна и та же — вынести наружу; -- **P6b**: префетч 11 058 маппит окно 0 каждый кадр, а коды тайлов trob'ов - меняются редко — кэшировать с инвалидацией по смене тайла/комнаты; -- **P6c**: цена факела — это цена блита, то есть позиция P4. - -Новое, найдено 2026-08-19. - -### P7. G5. Раскол `draw_tile` на узкие части [оценка дока: −50 000 … −60 000] - -Диспетчер + контекст оплачиваются целиком всегда; у оригинала это девять -независимых функций. В 11/15 это те самые 56 200 на один тайл — но если -сделан P1, `draw_tile` чомпера вообще не вызывается, и здесь эффект пропадёт. -Ценность приёма — в ДРУГИХ сценах (13/23, любая комната с плитами). - -**Риск средний**: в `draw_tile` собрано много инвариантов (BUG-LOOSE-3, -BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным заходом с прогоном -всех уровней. - -### P8. HEAL-WIDTH — ширина heal'ов по фактическому следу [оценка: 5-6 % цены heal'ов] - -ОБЯЗАТЕЛЬНАЯ по решению пользователя (2026-08-18). След плиты 58 px в -подземелье / 57 во дворце против используемых 60 и 64. -Постановка — `TASKS_OPEN.md`, якорь `heal-width`. - -### P9. G8 — пометку СОСЕДА ставить узкой полосой (28 px), а не тайлом [гипотеза] - -Парная к HEAL-WIDTH. Относится к сценам с падающими плитами (13/23), в 11/15 -не играет. Разбор — `perf_green_phase.md` §G8, там же три условия, из-за -которых это не «просто уменьшить число». - -### P10. Футпринт персонажа — из физики, а не считать заново [замер: −11 574 на fore-проход] - -`backlog` §1. С двумя персонажами — ~23 000 за кадр. Мешает то, что физика -(банк 3) держит `char_col_left/right` в статиках, а слой фона — банк 2. -**Риск средний**: окно fore-клипа заводилось под клинок и брызги. - -### P11. Мелочи с известной ценой [замер, `backlog` §7] - -| что | цена | где | -|---|---:|---| -| `pop_clip_char_top` — трамплин банк 4 → банк 3 ради одной проверки | 8 892 | `pop_cdraw.c` | -| `cd_sig_make` + возврат из `pop_char_draw` | 7 944 | `pop_cdraw.c` | -| `pop_loadkid` + расчёт координат кадра | 7 410 | `pop_cdraw.c` | -| `obj_x * 8 / 7` — последнее `__divsint` в горячем пути | ~2 400 | `pop_char_draw` | - -### P12. G9 — снять временную оснастку [замер: −6 000] - -`pop_dbg_b1..b6` в `pop_blit_b` (~400 на блит), `pop_dbg_kind`/`m16`, -`pop_dbg_m5..m15`, счётчик `rd_cnt` в `pop_redraw_needed`. -**Только ПОСЛЕ окончания оптимизации** — без них не мерить. - -### P13. Крупные рефакторинги — брать, только если понадобится ещё запас - -**Чем P13 НЕ является (вопрос пользователя 2026-08-19).** Это не «рисовать -комнату заново каждый кадр в скрытый буфер». Такой вариант исключён -арифметикой: 30 тайлов по 5-6 спрайтов при цене блита 16 674 (и 179 914 за -полную запечку одного тайла) дают порядка **3 000 000 тактов — семь -растровых кадров**. Оригинал так тоже не делает: у него та же -инкрементальная схема с пометками (`redraw_frames_full` / `_anim` / -`_fore`), перерисовываются только помеченные тайлы. - -Разница не в объёме отрисовки, а в цене ПОСЕЩЕНИЯ тайла: у нас -`fore_tile(r, c)` сразу блитит (со всеми 6 126 фиксированных накладных), а -у оригинала `add_backtable`/`add_midtable`/`add_foretable` только кладут -запись в массив, и рисует один `draw_table()` в конце. Плюс у него ОДИН -обход тайлов за кадр против наших трёх. - -- **C7 / backlog §5-6: objtable + отложенные таблицы back/mid/fore.** У - оригинала «посетить тайл» стоит копейки, потому что таблицы только копят - записи, а рисует один `draw_table()` в конце. У нас блит идёт сразу из - обхода, и fore-проход отдельный НА КАЖДОГО персонажа. -- **backlog §4: единый проход по тайлам вместо трёх** (`pop_redraw_needed`, - `pop_process_trobs`, `pop_fore_over_char`) и семь счётчиков причин - перерисовки вместо одного `kind`. -- **G6: меньше блитов в `RD_FLOOR`**, **G7: `mob_tick_one` в file-scope**. - ---- - -## 4. ПЛАН РАБОТ — состояние между сессиями - -Рабочий чеклист. Правило: одна позиция = один заход = один коммит с замером -до/после на сцене 11/15. Замер обязателен даже когда «очевидно» — из семи -закрытых позиций ТРИ дали не то, что ожидалось (P1 — вдвое меньше, P2a — -почти ничего, таблицы порогов — регресс). - -### Закрыто - -| # | что | факт | -|---|---|---| -| P15 | точность метки «фон трогали» + раздельная проверка клинка | **−163 746** лёгкая / **−140 871** тяжёлая | -| P16 | цианные проверки: снимок без структуры, `guard_over_kid` по условию, `hit_slot` без пяти аргументов | **−25 818** | -| P5 | `loose_tick`: гейты холостого хода | **−33 840** (ждали −28 000) | -| P1 | чомпер: перерисовка только при фазе < 6 | **−110 802** (ждали −160 000) | -| P2b | луч видимости: колонки + один банковый вызов | **−26 448** (ждали −30 000) | -| P2a | `coll_scan` в 8 бит + снят с IX | **−2 892** (крупной статьи в физике нет) | -| P3 | Кид перестал будиться каждый кадр | сбылось само после P1 — но только в ЛЁГКОЙ позиции | -| P2/P6 | замеры синей фазы и `process_trobs` | гипотеза «трамплины на спецсобытиях» отвергнута | -| — | замер цианной фазы | крупного лишнего в отрисовке персонажа нет | - -### Осталось, по убыванию ожидаемого эффекта - -| # | что | ожидание | риск | комментарий | -|---|---|---:|---|---| - -| P4 | накладные блита — 6 663 на КАЖДЫЙ блит | частично сделано: **−408** | низкий | из четырёх правок сработала слабо; разбор ниже | -| P14 | fore-проход персонажа | сводится к P4 + P10 | — | разбор ниже: цикл обходит всего 4 тайла | -| P11 | мелочи с известной ценой | −26 000 | низкий | `clip_char_top` 8 658 подтверждён замером | -| P10 | футпринт персонажа из физики | ? (нужен замер) | **высокий** | разбор ниже: величины физики и fore РАЗНЫЕ | -| P6a/P6b | `trob_modif` из цикла, кэш префетча | −20 000 | низкий | тот же паттерн трамплина в цикле | -| P7 | раскол `draw_tile` (G5) | −50 000 в 13/23 | средний | в 11/15 не играет | -| ~~P8~~ | HEAL-WIDTH | ✅ сделано: плита 64→58, чомпер 64→61 | — | эффект ждёт прогона 13/23 | -| P9 | G8 — пометка соседа полосой | не оценено | средний | для сцен с плитами | -| P13 | objtable + отложенные таблицы, единый проход по тайлам | не оценено | очень высокий | большой рефакторинг слоя фона | -| P12 | снять оснастку | −6 000 | нулевой | **последней**: без неё не мерить | - -### Текущее состояние бюджета - -| | работа | синяя | зелёная | циан | период | -|---|---:|---:|---:|---:|---:| -| до оптимизации | 801 768 | 293 238 | 320 916 | 187 758 | 4 растра | -| после P5 | 767 928 | 285 864 | 294 384 | 187 764 | 4 | -| после P1 (медиана) | 657 882 | 286 503 | 183 420 | 187 761 | 4 | -| после P2a | 654 990 | 283 215 | 183 798 | 187 812 | 4 | -| **после P2b (лёгкая позиция)** | **628 542** | 259 500 | 181 068 | 187 761 | 4 | -| ТЯЖЁЛАЯ позиция (Кид на шаг правее) | 758 358 | 257 520 | 180 870 | 319 842 | **4 и 5** | -| **после P15, лёгкая** | **464 796** | 223 902 | 181 494 | **59 406** | 4 | -| после P15, тяжёлая | 617 487 | 245 808 | 181 761 | 192 090 | **4 везде** | -| после P16, лёгкая | 438 978 | 218 052 | 181 494 | 39 438 | 4 | -| ~~после P4~~ | ~~438 570~~ | | | | правка **ОТКАЧЕНА** | -| после P17, лёгкая | 438 324 | 217 590 | 181 098 | 39 192 | 4 | -| **после P6a, лёгкая** | **437 484** | 217 704 | 180 252 | 39 306 | 4 | -| **после P17, тяжёлая** | **603 684** | 241 956 | 181 464 | 180 270 | 4 | - -Итог восьми позиций: **801 768 → 464 796 в лёгкой позиции (−42 %)** и -**758 358 → 617 487 в тяжёлой (−19 %)**. Отдельно важно: в тяжёлой позиции -исчезли пятирастровые кадры (было 27 %), период стал ровно 4 — рывки ушли. - -### Достижима ли цель — арифметика на 2026-08-19 - -Цель: работа ≤ 430 000, тогда период станет 3 растра (хвост кадра — три -`gfx_wait_vsync`). - -- в ЛЁГКОЙ позиции снять надо **7 484**; -- в ТЯЖЁЛОЙ — **173 684**. - -**Лёгких путей больше не осталось.** За 2026-08-19 отвергнуто ЧЕТЫРЕ -правки подряд (три с регрессом, одна почти без эффекта), и все они целили -в накладные проверок и блита. Фиксированная часть блита 6 663 держится -ядром `gfx_w0_map`/`cd_touch`/чтения шапки, а не «лишними» вызовами. - -Всё оставшееся в списке, кроме P13, даёт по оценкам **порядка 100 000** — и -это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами, -чомпером и двумя факелами в три растра не укладывается без одного из трёх -решений: - -1. **P13** — переход на objtable и отложенные таблицы, как в оригинале - (единственный резерв нужного размера, но это переписывание слоя фона); -2. **осознанное расхождение с оригиналом** — например, не перерисовывать - передний слой персонажа, пока не изменились ни персонаж, ни тайлы под - ним (гейт по сигнатуре футпринта); -3. **принять 4 растра** как рабочий режим для сцен такой плотности и - выравнивать период, чтобы не было рывков 4/5. - -Решение за пользователем — это выбор между точностью порта и скоростью. - -### Как воспроизвести сцену (важно для следующей сессии) - -Сборка стартует прямо в ней: `make` (дефолты `LEVEL=11 ROOM=15 POS=2`) → -`make hdd` → **полный рестарт MAME** (`chdman -f` даёт новый inode, memory -`mame_hdd_rebuild_restart`) → в DSS набрать `d:` и `roomtest`. Кид встаёт в -(0,2) лицом к чомперу, справа факел и страж — та самая сцена замеров. -Штатный старт уровня возвращается через `make ROOM=`. - -Проверка, что программа ЖИВА, обязательна перед любым чтением памяти: -`cur_room` (0x97AA) должен лежать в 1..24 — на этом уже был сорван один -замер (прочитаны два случайных байта остановленной машины). - -### Метод замера - -Зонды — `out (_io_border)` в `roomtest.c` (база модуля 0x42AD) плюс -резидентные пустышки `pop_dbg_m*` из `pop_state.c`. Адреса брать ЗАНОВО из -`.sprinter-cc-roomtest/roomtest.map` после каждой пересборки. Скрипты -сессии: `perfrun.py <сек> tag=addr ...` и `parseseq.py <файл> ПОСЛЕД`. - -Цену отдельной РЕЗИДЕНТНОЙ функции можно снять вообще без пересборки: -`bpset <вход>,1,{temp0=totalcycles; g}` плюс `bpset <точка>,1,{printf "… -%d",totalcycles-temp0; g}`. Так разложен блит в §1. - ---- - -## 5. Сводка: что сколько даёт в 11/15 - -| # | приём | эффект | тип оценки | риск | -|---|---|---:|---|---| -| P1 | чомпер: только anim-слой | −160 000 | модель | низкий | -| P3 | Кид перестанет будиться | −70 000 | модель | следствие P1 | -| P2 | логика двух Char | −40 000 … −70 000 | гипотеза | ? | -| P4 | накладные блита (4 правки) | −28 000 | модель | низкий | -| P5 | `loose_tick` без плит | ✅ −33 840 | ФАКТ | сделано | -| P6 | цикл `process_trobs` | −20 000 … −40 000 | гипотеза | ? | -| P10 | футпринт из физики | −23 000 | замер | средний | -| P11 | мелочи (4 штуки) | −26 000 | замер | низкий | -| P12 | снять оснастку | −6 000 | замер | нулевой | -| P7 | раскол `draw_tile` | 0 здесь (−50 000 в 13/23) | оценка | средний | -| P8/P9 | HEAL-WIDTH / G8 | 0 здесь (сцены с плитами) | оценка | низкий/средний | - -Верхняя часть списка (P1 + P3 + P4 + P5) — **около −286 000 из 801 768, то -есть 36 % работы кадра**, и вся она низкого риска. Этого хватит, чтобы -сцена ушла с 1,86 растрового кадра до ~1,2 — но НЕ хватит, чтобы период -кадра упал с 4 растров до 3: для этого работа должна уложиться в 430 000, -то есть нужны ещё ~90 000 сверху (P2 или P6). - ---- - -## 5б. Цианная фаза разложена [ЗАМЕР 2026-08-19] - -Фаза 188 004 тактов, и она НЕ менялась ни от P1, ни от P5, ни от P2b. - -| участок | такты | -|---|---:| -| `check_mirror` | 3 198 | -| `loose_mob_draw` + `guard_over_kid` + `skip_mask` | **34 374** | -| **`pop_char_draw(KID)`** | **204** | -| **соперник: `char_draw` + `char_fore`** | **145 896** | -| `fore_needed` + `hp_draw` | 2 598 | -| `char_fore(KID)` + борта | 1 758 | - -**Кид уже пропускается** — 204 такта, то есть надежда P3 всё-таки сбылась -после P1: метка от чомпера до него больше не дотягивается. А страж -перерисовывается каждый кадр, и это ЧЕСТНО: пламя правого факела (0,7) -рисуется в ячейке (0,8), где он стоит, и реально накрывает ему голову -(пламя занимает y 5..22, страж 12..62). - -Отрисовка стража (148 302) по частям: - -| участок | такты | доля | -|---|---:|---:| -| **`pop_char_fore`** (два трамплина в банк 2 + обход тайлов) | **62 778** | 42 % | -| клинок: `pop_sword_draw` + `cd_overlay_add` + `cd_clip_add` | 27 522 | 19 % | -| блит спрайта + `clip_char_right` | 20 982 | 14 % | -| загрузка кадра и геометрия | 12 696 | 9 % | -| **`pop_clip_char_top`** (трамплин банк 4 → банк 3) | 8 658 | 6 % | -| снимок прямоугольника + `cd_clip_add` | 7 890 | 5 % | -| `gfx_w0_unmap` + `cd_sig_make` | 4 968 | 3 % | -| вход + `cd_heal` | 2 946 | 2 % | - -**Вывод: крупного лишнего здесь нет.** Единственная явно лишняя статья — -трамплин `clip_char_top` (8 658), и убрать его непросто: функции нужны -`get_tile` и таблицы деления из банка 3, а перенос в резидент вернёт тот же -трамплин внутрь. Всё остальное — работа, которую персонаж действительно -делает: рисует себя, клинок и передний слой поверх себя. - -## 6. Иерархия референсов (уточнена 2026-08-19) - -Сравнение трёх реализаций луча видимости показало, что источники не -равноценны, и это важно для ЛЮБОЙ будущей оптимизации: - -| источник | что берём | чего НЕ берём | -|---|---|---| -| **Apple II** (`Prince-of-Persia-Apple-II`) | как это делается на 8 битах: таблицы вместо делений, борьба за такты | ничего — но код на 6502, читать сложнее | -| **SDLPoP** | эталон ПОВЕДЕНИЯ (декомпиляция DOS-версии) | реализацию: она нарочно «расслаблена» под 32 бита | -| **mininim** | разбор краевых случаев, второе мнение о замысле | алгоритмы — переписан с нуля, механика местами своя | - -Доказательство на конкретном месте: `get_tile_div_mod` в SDLPoP содержит -комментарий - -```c -// DOS PoP does this: -// obj_xl = tile_mod_tbl[xpos]; -// return tile_div_tbl[xpos]; -``` - -а вместо этого делает `x % TILE_SIZEX` и `x / TILE_SIZEX`. Таблицы в файле -лежат, но нужны только для эмуляции чтения DOS-версии ЗА ГРАНИЦЕЙ массива. -Apple II (`CTRLSUBS.S`, `GETBLOCKX`) читает ровно `BlockTable[x]`. - -**Правило:** сверять поведение по SDLPoP, а реализацию под 8 бит — по -Apple II и по комментариям вида «DOS PoP does this» в самом SDLPoP. - -## 7. Повторяющийся источник цены: банковый трамплин в цикле - -Уже трижды крупнейшей статьёй оказывался не алгоритм, а вызов `__banked`- -функции ИЗ ЦИКЛА, идущего в другом банке: - -| место | цена | лечение | -|---|---:|---| -| луч видимости: `pop_tile_at` по колонке (P2b) | 36 786 → 13 002 | один вызов на весь отрезок | -| `pop_clip_char_top` — банк 4 → банк 3 ради одной проверки | 8 892 | не сделано (P11) | -| `pop_trob_modif(room)` на каждый trob в цикле | не мерено | не сделано (P6a) | - -**Что проверять в первую очередь при новом «дорогом» месте:** не сколько -там арифметики, а сколько раз за кадр пересекается граница банка. - -## Фиксированный логический кадр (2026-08-19) — МЕНЯЕТ ВСЕ ЦЕЛЕВЫЕ ЧИСЛА - -Период логического кадра больше не `ceil(W) + 2`, а `max(n, ceil(W))` -(`roomtest/pop_pace.c`, разбор — `frame_pacing_plan.md`). Поэтому: - -- **Бюджет кадра вырос с 430 080 до 1 290 240 тактов** (n = 3, режим - FASTEST по умолчанию). Все записи этого реестра, где «работа сверх - 430 000 стоит сразу целого растра», СЧИТАТЬ УСТАРЕВШИМИ. -- 13/23 (максимум работы 911 862) теперь укладывается в период 3 растра — - проверено, ни одного кадра длиннее. Прежний профиль был 3/4/5. -- Оптимизация из спешной стала плановой: смысл резать такты остался - (режим NORMAL при n=4 и бой при n=5 дают ещё больше запаса, а FASTEST — - верхнюю планку скорости), но «свалиться за растр» больше не обрыв. -- Цена самого пейсинга — ≈4 000 тактов на кадр (0,9 %), замерено A/B. - -Приоритет P9 (G8) и остальных позиций от этого не меняется, но их -СРОЧНОСТЬ падает: они больше не спасают от скачка периода. diff --git a/applications/PoP/docs/prng_alternatives.md b/applications/PoP/docs/prng_alternatives.md deleted file mode 100644 index b5ed432..0000000 --- a/applications/PoP/docs/prng_alternatives.md +++ /dev/null @@ -1,148 +0,0 @@ -# Генераторы псевдослучайных чисел: запасные варианты - -Что сейчас стоит в порте, какие есть альтернативы и сколько на них реально -можно выиграть. Заготовка на случай, если упрёмся в бюджет кадра — -**сейчас менять ничего не нужно**. - -## Что стоит сейчас - -`pop_geom.c`, ветка `POP_PRANDOM_EXACT=1` (по умолчанию) — LCG оригинала -`s = s*214013 + 2531011`, шаг написан на Z80-ассемблере (единственное такое -место в порте). Схема Горнера по разреженной записи константы: - -``` -214013 = ((((1<<1)+1)<<2 + 1)<<4 + 1)<<10 - 3 -``` - -17 удвоений, три сложения, одно вычитание; величина `3*s`, нужная в конце, -попадается по дороге на втором шаге. Тело — **≈1 020 тактов** по статическому -подсчёту. Бит-в-бит совместим с SDLPoP, поэтому по картинке можно сверяться -с эталоном. - -Вторая ветка, `POP_PRANDOM_EXACT=0` — xorshift16 + шаг Вейля на C. -Совместимость теряется. - -Замер в MAME, комната 3, 175 кадров (медиана кадра): - -| вариант | кадр | prandom → torch_draw | -|---|---|---| -| C, бит-в-бит (16-битные половины) | 403 632 | 10 933 | -| C, xorshift16 + Вейль | 397 986 | 7 927 | -| **asm, бит-в-бит (сейчас)** | **400 800** | **9 331** | - -## Вариант A — комбинированный LFSR + LCG, ~148 тактов - -Период > 4 млрд (lcm(65536, 65535) ≈ 4.29e9), младшие биты не вырождены. - -```z80 -prng16: - seed1=$+1 - ld hl, 9999 - ld b, h - ld c, l - add hl, hl - add hl, hl - inc l - add hl, bc - ld (seed1), hl - seed2=$+1 - ld hl, 987 - add hl, hl - sbc a, a - and 101101b - xor l - ld l, a - ld (seed2), hl - add hl, bc - ret -``` - -Устройство: `seed1` — LCG `x = 5x + 1` (по модулю 2^16; `inc l` вместо -`inc hl` — экономия байта, на период не влияет). `seed2` — 16-битный -LFSR Галуа: сдвиг влево, и если выехала единица, XOR младшего байта с маской -`0x2D` (примитивный многочлен `x^16 + x^5 + x^3 + x^2 + 1`). На выходе -сумма обоих состояний — она и разрушает регулярность младших бит LCG. - -**Что мешает взять как есть:** сиды зашиты в код (SMC), а нам нужны ДВЕ -независимые последовательности — раскладка кладки и анимация тайлов. -Пришлось бы передавать состояние через указатель, как сейчас у `pop_prandom` -(это +20…40 тактов, не принципиально). - -## Вариант B — xorshift(7,9,8), ~86 тактов - -Самый быстрый, период 65535. - -```z80 -xrnd: - ld hl, 1 ; seed must not be 0 - ld a, h - rra - ld a, l - rra - xor h - ld h, a - ld a, l - rra - ld a, h - rra - xor l - ld l, a - xor h - ld h, a - ld (xrnd+1), hl - ret -``` - -**Две оговорки.** Ноль — неподвижная точка, а сид раскладки кладки у нас -считается как `номер комнаты + смещение ряда + колонка` и вполне может -оказаться нулём: нужен либо guard, либо шаг Вейля поверх. И тот же SMC-сид, -что в варианте A. - -## Чего НЕ брать: RND из Apple II - -Оригинальный `Prince-of-Persia-Apple-II`: - -``` -RNDseed := (5 * RNDseed + 23) mod 256 -``` - -```asm -RND - lda RNDseed - asl - asl - clc - adc RNDseed - clc - adc #23 - sta RNDseed - rts -``` - -Полный период 256 (`a ≡ 1 mod 4`, `c` нечётное), и для своего движка он -работал. Нам не годится: у LCG по модулю 256 младшие биты вырождены — бит 0 -просто чередуется. Наши вызовы это увидят: раскладка кладки берёт -`prandom(1)` (ОДИН бит) и `prandom(4)`, то есть вместо шума получилась бы -аккуратная шахматка. - -## Сколько реально можно выиграть - -Меньше, чем кажется по числам 86/148 против 1 020. Тело генератора — уже не -весь расход: остаются обёртка `pop_prandom`, приведение к диапазону -`pop_rnd_fit` и ABI вызова. Верхняя граница выигрыша видна из замера выше: -между нынешним asm-LCG и самым дешёвым из проверенных вариантов разница -**2 814 тактов за кадр (0.65 %)** при двух вызовах за кадр, и это ПОТОЛОК — -любой из вариантов A/B ниже него не опустится. - -Порядок действий, если понадобится: - -1. Сначала убрать обёртки: слить `pop_rnd_fit` в ту же asm-процедуру, чтобы - на вызов приходился один `call`, а не три. Это ничего не ломает и не - трогает совместимость с эталоном. -2. И только если этого мало — менять генератор, начиная с варианта A - (качество последовательности у него не хуже LCG, в отличие от B). - -Важно помнить: число вызовов вырастет с боёвкой. Сейчас их два за кадр -(факелы), а `guard_advance` / `guard_block` / `guard_strike` дёргают -`prandom(255)` каждый по разу за кадр боя — то есть при драке станет 5–6, и -цена вопроса вырастет во столько же раз. diff --git a/applications/PoP/docs/quicksave_plan.md b/applications/PoP/docs/quicksave_plan.md deleted file mode 100644 index fa73d4c..0000000 --- a/applications/PoP/docs/quicksave_plan.md +++ /dev/null @@ -1,328 +0,0 @@ -# QuickSave / QuickLoad — разбор оригинала и план реализации - -Статус: **РЕАЛИЗОВАНО и проверено в MAME** (2026-08-22; F6/F9, POP.SAV + -POP.BAK — см. коммит `v0.6-pop-quicksave`). Документ оставлен как -справочник по формату снимка и разбору. Задача на доске — -[`../roomtest/TASKS_OPEN.md#qsave`](../roomtest/TASKS_OPEN.md#qsave). - ---- - -## 0. Важная оговорка об «оригинале» - -**В оригинальном PoP 1989 года (DOS/Apple II) QuickSave/QuickLoad НЕТ.** -Там вообще нет сохранения посреди уровня: игра рассчитана на один заход в -60 минут, а «продолжение» — это только пароль/чекпоинт уровня 7. Поэтому -`Prince-of-Persia-Apple-II/` и `MSDOS/` тут не источники — искать в них -нечего. - -Источник истины — **SDLPoP**, где быстрое сохранение добавлено как -enhancement: `seg000.c`, блок `#ifdef USE_QUICKSAVE`, клавиши **F6** (save) -и **F9** (load). Ниже разобран именно он. Это значит, что правило -«расхождение с SDLPoP = баг у нас» здесь работает мягче: мы не обязаны -повторять его байт-в-байт, но обязаны повторить его **устройство**, потому -что оно решает ровно те проблемы, которые возникнут и у нас. - ---- - -## 1. Как это устроено в SDLPoP - -### 1.1 Точка вызова — отдельная фаза кадра, не обработчик клавиши - -Клавиша только взводит флаг (`need_quick_save` / `need_quick_load`, -`seg000.c:558`), а вся работа делается в `check_quick_op()` — она вызывается -из главного цикла **между кадрами**, когда движок в согласованном состоянии. -Это принципиально: загрузка посреди тика переписала бы `Char` под ногами у -`play_seq`. - -Отказ штатный, не фатальный: `quick_save()`/`quick_load()` возвращают -успех/неуспех, и игра печатает `QUICKSAVE` / `NO QUICKLOAD` внизу экрана и -продолжается. - -### 1.2 Формат — плоская последовательность переменных, без структуры - -```c -#define process(x) ok = ok && process_func(&(x), sizeof(x)) -``` - -Один макрос и один и тот же список обходится **и на запись, и на чтение** -(`quick_process(process_save)` / `quick_process(process_load)`). Поля -пишутся встык, без имён и тегов; совместимость держится ровно одним -средством — **строкой версии в начале файла**: - -```c -const char quick_version[] = "V1.16b4 "; -``` - -При загрузке она сравнивается, и при несовпадении файл просто отвергается -(`quick_load`, возврат 0). То есть формат нарочно хрупкий и нарочно -одноразовый — это снимок конкретной сборки, а не сейв-формат. - -**Это стоит перенять целиком.** Мы платим за версионирование одним байтом -и получаем право менять состав снимка при каждой правке движка. - -### 1.3 Что именно сохраняется - -Полный список — `quick_process`, `seg000.c:257-366`. По смыслу он делится -на пять групп: - -| группа | поля | -|---|---| -| уровень | `level` (2305 Б целиком), `checkpoint`, `upside_down`, `drawn_room`, `current_level`, `next_level`, `leveldoor_open` | -| анимируемые объекты | `mobs_count`, `mobs[14]`, `trobs_count`, `trobs[30]` | -| Кид | `Kid`, `hitp_curr/max/beg_lev`, `grab_timer`, `holding_sword`, `united_with_shadow`, `have_sword`, `kid_sword_strike`, `pickup_obj_type`, `offguard` | -| соперник | `Guard`, `Char`, `Opp`, `guardhp_curr/max`, `demo_index`, `demo_time`, `curr_guard_color`, `guard_notice_timer`, `guard_skill`, `shadow_initialized`, `guard_refrac`, `justblocked`, `droppedout`, `is_guard_notice`, `can_guard_see_kid` | -| прочее | кэш коллизии (`*_row_coll_room/flags`, `prev_collision_row`), вспышка (`flash_color/time`), звук (`is_screaming`, `is_feather_fall`, …), **`random_seed`**, время (`rem_min`, `rem_tick`), весь блок управления (`control_*`, `ctrl1_*`) | - -Два наблюдения, важные для нас: - -1. **Состояние ОТРИСОВКИ не сохраняется вообще.** Ни экранных буферов, ни - пометок перерисовки, ни того, что уже нарисовано. Вместо этого при - загрузке комната перерисовывается с нуля. Это резко упрощает задачу и - ровно то, что нам нужно при дабл-буфере. -2. **`random_seed` сохраняется.** Без него загрузка не воспроизводима: - после неё факелы, чомперы и `prandom` в боёвке пойдут иначе. - -### 1.4 Что делается при загрузке - -`restore_room_after_quick_load()` (`seg000.c:395`) — это и есть вся -«сложность» операции: - -- `load_lev_spr(current_level)` — **перезагрузка графики уровня** (тайлсет - мог смениться: подземелье/дворец); -- `different_room = 1`, `next_room = drawn_room = Kid.room` — принудительно - «мы в другой комнате», чтобы движок перерисовал всё; -- `load_room_links()` — связи комнат заново; -- `draw_game_frame()` — отрисовать кадр (важно для состояния падения); -- `hitp_delta = guardhp_delta = 1` — принудительный редрой полос HP; -- если `Guard.room != drawn_room` — стража «выключить» (`direction = - dir_56_none`, `guardhp_curr = 0`), как в `clear_char()`; -- `loadkid_and_opp()` — восстановить окно `Char`/`Opp`; -- сбросить таймеры текста и `exit_room_timer`. - -Плюс визуальный приём: перед загрузкой экран заливается чёрным на 5 тиков — -чтобы переход читался глазом и не выглядел «дёрганием». - -### 1.5 Чего в SDLPoP решили НЕ восстанавливать - -- звуки — просто `stop_sounds()`; -- перо (`is_feather_fall`) — без фикса `fix_quicksave_during_feather` - сохранение под пером запрещено вовсе, а при загрузке эффект гасится; -- есть опциональный **штраф**: `USE_QUICKLOAD_PENALTY` отнимает минуту - игрового времени за квиклоад. Нам не нужен (у нас пока нет игрового - таймера). - ---- - -## 2. Чем наша архитектура отличается - -| | SDLPoP | у нас | следствие для задачи | -|---|---|---|---| -| уровень в памяти | `level_type` в ОЗУ, 2305 Б, мутабельный | EMM-страница (`pop_lvl_page`), плюс рабочая копия комнаты в W2 | снимок читает страницу через W0-маппинг, а не `memcpy` | -| модификаторы тайлов | внутри `level.bg` | отдельный `room_modif[24][30]` в `pop_trob.c` (**static**) | нужен экспортируемый сериализатор из банка 6 | -| код | один бинарник | 8 банков + резидент | сериализатор обязан жить там же, где данные, и зваться через трамплин | -| экран | один буфер | **дабл-буфер**, у каждой страницы своя теневая копия | после загрузки перерисовать ОБЕ страницы, иначе через кадр мелькнёт старое | -| ОЗУ | сколько угодно | куча 2969 Б, стек 1279 Б | буфер снимка целиком в ОЗУ не положить — писать потоком | -| диск | `fopen` | DSS: 8 манипуляторов, 9-й ВЕШАЕТ систему ([[dss_fd_limit]]) | закрывать файл гарантированно, гард уже есть в libc | -| ГСЧ | один `random_seed` | **три** независимых: `pop_t_seed`, `trob_seed`, `pop_fight_seed` | сохранять все три, иначе загрузка невоспроизводима | - ---- - -## 3. Инвентаризация нашего состояния - -Собрано по `.sprinter-cc-roomtest/roomtest.map` (данные всех модулей, включая -банковые, лежат в W2 — банк влияет только на код). Отмечено, что глобально -(видно снаружи), а что `static` и требует аксессора. - -### 3.1 Мутабельные данные уровня - -| что | где | размер | доступ | -|---|---|---|---| -| тайлы `fg` (провалившиеся плиты, открытые двери, съеденные предметы) | EMM-страница уровня | 720 Б | `pop_level_set_tile` пишет; чтения наружу нет — **нужен аксессор** | -| `room_modif[24][30]` | `pop_trob.c`, static | 720 Б | **нужен сериализатор** (банк 6) | -| `room_seen[24]` | `pop_trob.c`, static | 24 Б | там же | -| `trobs[30]` + `trobs_count` | `pop_trob.c`, static | 91 Б | там же | -| `trob_seed` | `pop_trob.c`, static | 4 Б | там же | -| `mobs[14]` | `pop_room.c`, **глобален** | 210 Б | напрямую | -| `mobs_live` | `pop_room.c`, static | 1 Б | аксессор | - -### 3.2 Персонажи и бой - -`Kid`, `Char`, `Opp` (`pop_kid.c`), `Guard` (`pop_guard.c`) — по 16 Б, -все глобальные. Рядом: `hitp_curr/max/beg_lev/delta`, `guardhp_curr/max/delta`, -`guard_skill`, `guard_refrac`, `justblocked`, `kid_sword_strike`, `offguard`, -`holding_sword`, `can_guard_see_kid`, `is_guard_notice`, -`pop_guard_notice_timer`, `pop_guard_hurt`, `pop_united_shadow`, -`pop_shadow_init`, `pop_fight_seed`, `knock`. - -### 3.3 Прогресс и физика - -`pop_current_level`, `pop_next_level`, `pop_checkpoint`, `pop_have_sword`, -`pop_item_taken`, `pop_leveldoor_open`, `pop_leveldoor_right`, -`pop_leveldoor_ybottom`, `pop_kid_dead`, `pop_kid_hurt`, `pop_feather`, -`pop_upside` / `pop_upside_want`, `pop_flash_time` / `pop_flash_color`, -`pop_droppedout`, `pop_fell_out`, `pop_leave_dir`, `pop_leave_timer`, -`pop_loose_*`, `pop_ceil_modif`, `pop_ceil_fell`, `pop_debris_at`, -`pop_seamless`, `pop_jumped_mirror`. - -### 3.4 Ввод - -`control_x/y/shift/forward/backward/up/down/shift2` (`pop_state.c`) — как в -SDLPoP, сохраняются. - -### 3.5 Что НЕ сохранять (восстанавливается перерисовкой) - -`room_fg/room_bg`, `lcol_*`/`rcol_*`/`below_fg`/`above_*`, `seam_*`, -`cur_room`, `pop_t_*` (весь кэш слоя фона, окна клипа, `pop_cd_*`), -`trob_drawn`, `mob_spr`, слоты `pop_cd`, метки `pop_redraw`, запечки -(`bake_pg`). Всё это — производное; после загрузки оно обязано быть -сброшено и пересчитано, а не восстановлено. - -**Оценка объёма снимка: ≈ 1,9 КБ** (720 + 720 + 210 + 91 + 64 + ~60 -скаляров + запас). - ---- - -## 4. Куда писать снимок: HDD-файл, а не EMM-страница - -Решение: **один основной слот `POP.SAV` на HDD; предыдущая -валидная запись хранится в `POP.BAK`.** EMM-слота нет: программа -работает только с HDD, а главный сценарий QuickSave обязан переживать -перезапуск игры. - -> Пересмотрено 2026-08-21 по вопросу пользователя «почему EMM, а не файл». -> Первая редакция плана рекомендовала EMM — это была ошибка: она взвешивала -> скорость и недооценивала главный сценарий использования. Разбор оставлен -> целиком, потому что довод переносится и на другие «положить в память -> вместо диска» решения. - -**Решающий довод: EMM-страница не переживает рестарт программы,** а именно -рестарт — тот случай, ради которого QuickSave и нужен. Пример из этого же -проекта: сцену каскада плит на 13/23 воспроизводит ТОЛЬКО `ESC` → запуск -заново ([`perf_l13_room23.md`](perf_l13_room23.md) §1, где перечислено, -почему не годятся ни возврат в комнату, ни рестарт уровня, ни запись -состояния отладчиком). Тем более снимок в ОЗУ не переживает перезапуск -MAME, обязательный после каждой пересборки образа. - -| сценарий | EMM | файл | -|---|---|---| -| «переиграть это место ещё раз» | работает, мгновенно | работает, на HDD быстро | -| «вернуться к багу после рестарта» | **не работает** | **работает** | - -Второй сценарий не закрывается ничем другим; первый закрывается обоими, и -разница в скорости там некритична — 1,9 КБ на HDD ([[mame_hdd_test_disk]] — -быстрый путь против дискеты) не заметны на фоне полной перерисовки комнаты, -которая при загрузке делается в любом случае и стоит дороже. - -Доводы за EMM, которые при перепроверке оказались слабыми: лимит -манипуляторов DSS ни при чём (открываем и закрываем ровно один файл, гард -`_fd_guard` в libc и так стоит), а «не нужен путь и права» — экономия одной -строки. - -Обход состояния всё равно писать с абстракцией чтения/записи, как у SDLPoP -через `process_func`, но второй EMM-слот в scope не входит. - -**Проверить ДО кодинга:** пишется ли `test_hdd.chd` из-под MAME. Если образ -только на чтение, файловый путь упрётся в это на первом же шаге и порядок -работ придётся менять. Проверка дешёвая — записать пробный файл на `D:` из -roomtest. - ---- - -## 5. Формат снимка - -``` -+0 "PQS1" 4 Б магия -+4 версия сборки 1 Б (инкремент при ЛЮБОМ изменении состава) -+5 pop_current_level 1 Б -+6 длина полезной части 2 Б (контроль, что обход совпал) -+8 ... поля встык, ОДИН порядок на запись и на чтение ... -.. checksum 2 Б (заголовок + payload) -``` - -Версия проверяется первой; несовпадение — отказ, как в SDLPoP. Никаких -тегов и выравнивания: снимок одноразовый и живёт ровно одну сборку. - -Обход — один список и один макрос, как `process(x)`: - -```c -static void qs_walk(qs_io_t io) /* io = запись или чтение */ -{ - QS(pop_current_level); QS(pop_checkpoint); ... -} -``` - -Так состав нельзя рассинхронизировать между сохранением и загрузкой — -единственная реальная опасность плоского формата. - ---- - -## 6. Что делать при загрузке (наш аналог `restore_room_after_quick_load`) - -Порядок важен, каждый пункт закрывает конкретный отказ: - -1. **Сменился уровень?** → `pop_level_load_num()`, `pop_bg_load(tileset)`, - атласы стража по типу. Это дорого, но ровно тот же путь, что при - переходе уровня (`pop_level_switch`), — переиспользовать его, а не писать - заново. -2. Залить экран чёрным (приём SDLPoP: переход должен читаться глазом). -3. Восстановить состояние обходом `qs_walk`. -4. **Сбросить всё производное:** `pop_trob_reset` (но НЕ трогая - восстановленные `room_modif`/`trobs` — нужен отдельный «мягкий» сброс, - только `trob_drawn` + метки), `pop_redraw_reset`, слоты `pop_cd`, - `pop_bake_forget`, `pop_cd_clear`, сигнатуры пропуска перерисовки. -5. `pop_room_load(Kid.room)` — рабочая копия комнаты и срезы соседей. -6. **Полная отрисовка комнаты в ОБЕ страницы дабл-буфера.** Это наше - главное отличие от SDLPoP: одной перерисовки мало, вторая страница - останется со старой картинкой и мигнёт через кадр. -7. Принудительный редрой полос HP (`hitp_delta = guardhp_delta = 1`). -8. Если `Guard.room != Kid.room` — выключить стража - (`Guard.direction = DIR_56_NONE`, `guardhp_curr = 0`), как `clear_char`. -9. `pop_loadkid_and_opp()` — согласовать окно `Char`/`Opp`. - ---- - -## 7. Разбиение на шаги - -| шаг | что | критерий готовности | -|---|---|---| -| **QS0** | Проверить, что `D:` пишется из-под MAME (пробный файл из roomtest) | файл создался и читается обратно после рестарта программы | -| **QS1** | Аксессоры/сериализаторы для `static`-состояния банковых модулей: `pop_trob.c` (`room_modif`, `room_seen`, `trobs`, `trob_seed`), `pop_room.c` (`mobs_live`), страница уровня (чтение `fg`) | хост-тест `tests-host/t_qsave.c`: обход туда-обратно на синтетическом состоянии даёт байт-в-байт исходное | -| **QS2** | Ядро: `qs_walk` + `POP.SAV`, магия/версия/checksum, безопасная замена с предыдущей валидной копией в `POP.BAK` | сохранение и загрузка **в той же комнате, без движения**; порча SAV не портит BAK | -| **QS3** | Восстановление отрисовки (§6), включая обе страницы дабл-буфера | загрузка после перехода в другую комнату; нет мерцания через кадр | -| **QS4** | Клавиши **F6/F9** (или свободные из `pop_cheat.h`) через ``, флаги `need_quick_save/load`, обработка **между кадрами** | загрузка посреди боя/падения не ломает `play_seq` | -| **QS5** | Загрузка с **другого уровня** (перезагрузка уровня и атласов) | сохранить на ур. 2, уйти на ур. 12, загрузить — тайлсет и стражи верные | - -Порядок не переставлять: QS0 первым (он может изменить весь план), QS3 без -QS2 нечего проверять, а QS5 обязан идти после QS3 — иначе смена тайлсета -замаскирует ошибки восстановления. - -**Главный критерий приёмки всей задачи:** сохранить состояние, выйти по -`ESC`, запустить roomtest заново, загрузить — и оказаться там же. Именно -этого сценария сейчас нет ничем, и ради него задача и делается. - ---- - -## 8. Риски и открытые вопросы - -1. **`static` в банковых модулях.** Их нет в карте символов, то есть - отладчиком снимок не проверить. Возможно, стоит сделать `room_modif` и - `trobs` НЕ-static — так же, как уже сделано с `mobs` в `pop_room.c` и - ровно по той же мотивации (там это записано прямым комментарием). -2. **Место в банке 6.** `pop_trob` занимает 3802/16384 — запас есть, но - сериализатор лучше писать компактным обходом, а не 30 отдельными - вызовами. -3. **Три ГСЧ.** Проверить, что сохранены ВСЕ: пропуск любого даст - «загрузилось, но играется иначе» — самый неприятный класс бага, потому - что выглядит как случайность. -4. **Согласованность `Char` и `Kid`.** У нас окно `Char` — отдельная копия; - если сохранить их рассогласованными (снимок посреди тика), загрузка - воскресит рассогласование. Отсюда требование QS4: только между кадрами. - Урок свежий — ровно на этом стыке жил - [BUG-CHEAT-IMM-1](../roomtest/BUGS_CLOSED.md#bug-cheat-imm-1). -5. **Дабл-буфер.** Самый вероятный источник «почти работает»: забыть вторую - страницу. Симптом — мерцание через кадр - (см. `roomtest/CLAUDE.md`, раздел про дабл-буфер). -6. **Транзакция SAV/BAK.** До кодинга проверить на DSS семантику - rename/replace. Если атомарная замена не гарантирована, писать через - `POP.NEW`, проверять его после close и не удалять единственную валидную копию - до завершения новой. diff --git a/applications/PoP/docs/resident_budget.md b/applications/PoP/docs/resident_budget.md deleted file mode 100644 index ccc43e3..0000000 --- a/applications/PoP/docs/resident_budget.md +++ /dev/null @@ -1,111 +0,0 @@ -# Бюджет резидента W1/W2: как мерить и как освобождать - -Резидент huge-режима — окно `0x4100..0xBB00` (стек с 0xBB00): код в W1, -данные в W2, между концом данных и стеком остаётся куча. Всё, что туда не -влезло, живёт в банках. - -## Как СМОТРЕТЬ, а не гадать - -**Карта линкера врёт.** File-static SDCC в неё не попадает, и «дырка» между -двумя именованными символами приписывается предыдущему целиком. По карте -выходило, что у `pop_bg` 1529 Б данных (на деле 289), а у `pop_t_win_clear` -1282 Б кода — при том, что это однострочник, а 1282 Б это два статических -помощника соседнего `pop_blit_b`. - -Точный источник — объектные файлы: строки `A size flags ` в -`.rel` дают ровный размер каждой области модуля, а `S Def/Ref` — кто -символ определяет и кто на него ссылается. - -**Частоту вызовов мерить в MAME счётчиком**, а не оценивать по смыслу: - -``` -bpset ,1,{printf "F %d ...",temp0,...; temp0=0;...; g} -bpset ,1,{temp0=temp0+1; g} -``` - -Обязательна **канарейка** — счётчик заведомо горячей функции в том же -прогоне. Дважды спасала: один раз показала, что перехода комнаты в окне -замера не было (все нули), другой — что зонды вообще не встали (в zsh -`set -- $pair` НЕ разбивает строку на слова, и адрес уезжал в мусор). -Полную перерисовку комнаты форсировать читом `+`/`-`, ходьбой ненадёжно. - -## Сделано - -### 1. malloc вон из резидента (−613 Б) - -`cbl_open` держал `malloc`/`free` в мёртвой ветке `CBL_UNDERRUN_SILENCE`, а -линкер тянет `.rel` целиком — и куча приезжала каждому приложению. Разведены -две публичные точки входа (`cbl_open` / `cbl_open_silence`) поверх общего -`_cbl_open_raw`; `cbl_close` больше не зовёт `free`. - -### 2. Разрез pop_tile: холодная половина в банк 5 (−1788 Б) - -`pop_tile.c` был крупнейшим жильцом резидента (5 972 Б кода). Целиком он не -уедет: его const-таблицы (`POP_TILE_DIV/MOD`, `pop_tile_table`, таблицы -кадров) читают банки 2, 3, 7 и 8, а таблица в чужом банке не видна. - -Отбирали ЗАМЕРОМ, на двух тайлсетах (подземелье ур. 1 и дворец ур. 4 — -`pop_mem_b` рисует композитный кусок и мог оказаться дворцовым). Порог — -пик не больше 3 вызовов на кадр. - -| уехало в банк 5 | пик/кадр | | осталось в резиденте | пик/кадр | -|---|---:|---|---|---:| -| `pop_mem_b` | 0 | | `pop_tile_code` | 296 | -| `pop_cd_hit` (+`hit_rect`) | 0 | | `pop_cd_touch` | 198 | -| `pop_t_win_set/clear` | 0..1 | | `pop_blit_b` (+2 статика) | 184 | -| `pop_heal_off` | 0..1 | | `pop_wall_modifier` | 101 | -| `pop_potion_flask` | 0..1 | | `pop_env_b` | 73 | -| `pop_room_set_above/below` | 1 | | `pop_tile_mod` | 70 | -| `pop_cd_init/clear` | 1 | | `pop_cd_batch_end` | 40 | -| `pop_bar_black` | 3 | | `pop_fore_set_clip` | 2 | -| `pop_cd_hit_slot` | 2..3 | | все const-таблицы | — | - -`pop_fore_set_clip` (88 Б) оставлен намеренно: не стоит отказа от прямого -вызова из банка 4, ради которого он и заводился. - -**Цена трамплина замерена**: 252 такта пролог + 84 эпилог + ~50 на стороне -вызывающего = **~410 тактов** на вызов. Итого ~1 000 тактов на кадр покоя -(0,2 % работы) и ~3 700 на кадр редрава (0,009 растра). - -**Ключ, почему это безопасно:** вызов банк → резидент ПРЯМОЙ, трамплин не -нужен (W1/W2 замаплены всегда). Поэтому `blit_b_clip` просто перестал быть -`static` и объявлен в `_pop_tile.h`, а не переехал следом за `pop_mem_b`. - -### Итог - -| | было | стало | -|---|---:|---:| -| `_CODE` резидента | 24 329 | **21 928** | -| свободно до стека | **129 Б** | **2 535 Б** | -| BANK5 | 2 080 (13 %) | 3 954 (24 %) | - -Проверено в MAME: уровень 1 (подземелье) и уровень 4 (дворец), переходы -комнат читом `+`, ходьба — фон, факелы, решётки, гобелены, колонны без -искажений. - -## ЛОВУШКА: данные банка в его страницу — НЕ ДЕЛАТЬ без разбора - -Отдельная попытка (`--bank-data=SRC`, коммиты 3545826/9025573) **откачена**: -перенос писучих данных банкового модуля в его 16-КБ страницу давал цветной -мусор блоками и ронял DSS. - -У `pop_trob` причина найдена: `pop_trob_modif()` ВОЗВРАЩАЕТ УКАЗАТЕЛЬ на -`room_modif[24][30]`, а зовут её из банков 2, 3, 7 и резидента — после -переноса они пишут по 0xC000+ в СВОЮ страницу, поверх чужого кода. -Def/Ref-анализ такого не видит: снаружи ссылки на символ нет, есть ссылка на -функцию, отдающую его адрес. Но и `pop_room`, у которого утечки указателя -найти не удалось, ломался так же — механизм понят не до конца. - -Нулевая инициализация при этом ни при чём: `mkexe -p 0` был проверен по -образу (прогон нулей 14 304 Б, самый длинный прогон 0xFF — 14). - -**Перенос КОДА в банк — штатный путь, на нём стоят все наши банки. Ломался -именно перенос ДАННЫХ.** - -## Что осталось - -- `roomtest.c` 2 508 Б и `pop_kid.c` 2 418 Б — следующие по величине, но оба - горячие (главный цикл и `play_seq`). -- `pop_level.c` 956 Б кода + 660 Б данных (из них `pop_dl1`/`pop_dl2` по - 256 Б — таблицы дверных связей). -- BANK7 на 77 %: если понадобится место в нём — выносить `pop_redraw.c`. diff --git a/applications/PoP/docs/room_model_plan.md b/applications/PoP/docs/room_model_plan.md deleted file mode 100644 index 2b685e2..0000000 --- a/applications/PoP/docs/room_model_plan.md +++ /dev/null @@ -1,86 +0,0 @@ -# PoP roomtest — модель `kid_room ≠ drawn_room` (баг #4) - -> **Статус: ЖИВОЙ ПЛАН, сделан частично (сверено 2026-08-01).** -> - **S1 — сделан:** `kid_room` заведён отдельно от `cur_room`, -> `update_kid_render_dx()` (`roomtest.c`) даёт рендер-смещение ∓140, а -> `pop_kid_set_render_dx` применяет его в отрисовке. Фактически это пока -> каркас: `enter_room` держит `kid_room == cur_room`, так что смещение -> всегда 0. -> - **S2/S3/S4 — не сделаны и не срочны.** Исходный повод (баг #4, -> пинг-понг у шва) закрыт иначе — поправкой odd-pixel в -> `char_x_forward_edge` + `pop_leave_timer` (разбор корня — -> `../roomtest/BUGS_CLOSED.md`, BUG-SEAM-PINGPONG). -> -> **Зачем документ остаётся.** Полная straddle-модель понадобится для: -> (а) читов осмотра соседних комнат `H/J/U/N` (`levels_plan.md` §4), -> (б) сцен, где Кид и страж в разных комнатах кадра, (в) остатков окклюзии у -> шва (S4). Брать из `../roomtest/TASKS_OPEN.md`, когда дойдёт очередь. - -Порт straddle-модели SDLPoP: персонаж может находиться в СОСЕДНЕЙ комнате, -пока на экране ещё ТЕКУЩАЯ (drawn_room). Источник истины — SDLPoP. - -## Факты из SDLPoP (подтверждено чтением исходника) - -- `Char.room` (реальная комната персонажа) ≠ `drawn_room` (отрисованная) — - штатное состояние. -- **Коллизия через ±140:** `xpos_in_drawn_room()` (seg004:0405) сдвигает - xpos на `±TILE_SIZEX*SCREEN_TILECOUNTX = ±140`, когда `curr_room` колонки - (`curr_row_coll_room[col]`) ≠ `drawn_room` (room_L/room_BL → −140, - room_R/room_BR → +140). Т.е. коллизия строится по РЕАЛЬНЫМ тайлам соседей. -- **Смена экрана:** `check_the_end()` (seg000:0FBD): `if (next_room!=0 && - next_room!=drawn_room) { drawn_room=next_room; load_room_links; redraw }`. - `next_room` ставится в `exit_room()` (= `Char.room` ПОСЛЕ успешного - `leave_room`). Значит drawn_room следует за Char.room, но Char.room меняется - ТОЛЬКО при реальном пересечении шва (leave_room, seg002:0504) на «легальном» - кадре/действии (не turn/climb/standup). -- **Отрисовка левого соседа:** только `load_leftroom()` (col9 левого соседа в - левую кромку); правый сосед НЕ рисуется (изометрия). Окклюзия ворот на шве — - только левая (seg008:696). -- **Ceiling-полоса:** `draw_room` рисует доп. ряд из `room_A` (row2, draw_main_y - =-1). (Уже реализовано, баг #3.) - -## Текущее состояние нашего движка (до #4) - -`cur_room` (=drawn_room) ВСЕГДА == комната Kid. Шов подделан: Kid остаётся в -drawn_room с `curr_col=-1/10` + снапшоты соседей `g_lcol/g_rcol` (коллизия ±1 -кол) / `lcol_bg` (openness ворот). Уход из комнаты — `pop_leave_dir`/`enter_room` -МГНОВЕННО при пересечении порога `char_x`. Отсюда #4: экран переключается -раньше, чем в оригинале (Kid должен «отступить» за кромку, оставив старую -комнату). - -## План (инкременты, каждый проверяется в MAME) - -### S1. Данные + рендер-смещение Kid -- Ввести `kid_room` (реальная комната Kid) отдельно от `cur_room`(=drawn_room). -- `kid_x_offset()` = разница комнат: kid_room == left(drawn) → лог. x Kid −140 - (рисуется за левой кромкой); right → +140; равны → 0. (порт - xpos_in_drawn_room). -- `kid_draw`/heal/fore используют смещение (Kid рисуется частично за кромкой). -- Проверка: Kid у шва рисуется со сдвигом, экран не дёргается. - -### S2. Коллизия по kid_room -- Коллизионный контекст (`g_fg`/edges/`g_room`/modif в pop_map) следует за - `kid_room`, а не за drawn_room. Когда kid_room≠drawn_room — грузим - соседа как коллизионную комнату (curr_col 0..9 в кадре kid_room). -- Отрисовка (room_fg и т.п.) остаётся по drawn_room. -- Порт `curr_row_coll_room[]`/`xpos_in_drawn_room` можно упростить: держим - ОДИН коллизионный room (kid_room) + существующие снапшоты кромок для ±1 кол. - -### S3. Отложенная смена drawn_room -- Уход (`check_leave`/`check_leave_below`): ставит `kid_room=сосед`, - репроецирует Kid (x∓140, col∓10) — но drawn_room НЕ меняет сразу. -- `check_the_end`-эквивалент в главном цикле: `if (kid_room != drawn_room && - <условие коммита>) enter_room(kid_room)`. Условие коммита — по SDLPoP: - как только Char.room сменилась легальным leave (не bumped/turn). Для - «bumped назад за кромку» drawn_room остаётся (симптом #4). -- Проверка сценариев #4/#5 в MAME. - -### S4. Полировка -- Окклюзия/ceiling у шва при straddle, BUG-OCCL-1 (глубина), правый край. - -## Связанные баги — все ЗАКРЫТЫ (`../roomtest/BUGS_CLOSED.md`) -BUG-CEIL-1 (руки при прыжке вверх), BUG-CEIL-2 (loose в потолке), -BUG-CEIL-3 (потолок над анимируемыми воротами), BUG-OCCL-1 (тень дальней -колонны) — починены без полной straddle-модели. То есть S4 «полировка -окклюзии» осталась актуальной только для окклюзии У ШВА при straddle. -Memory: `pop_seam_room_model`. diff --git a/applications/PoP/docs/roomnav_skip.md b/applications/PoP/docs/roomnav_skip.md deleted file mode 100644 index 1278924..0000000 --- a/applications/PoP/docs/roomnav_skip.md +++ /dev/null @@ -1,65 +0,0 @@ -# Комнаты для отладочного телепорта (`+` / `-`) - -Считано скриптом прямо по `../SDLPoP/data/LEVELS/res20NN.bin`, 2026-08-13. -Задача: обход комнат читом идёт последовательно, и в КАЖДОЙ комнате Киду -должно найтись место для материализации без падения и смерти. - -## Критерии пропуска - -| причина | как определяется | -|---|---| -| **недостижима** | до комнаты нельзя дойти от стартовой обходом связей (BFS по left/right/up/down) | -| **нет пола** | ни одного тайла, на котором можно стоять (`tile_is_floor`, seg004) | -| **пол опасный** | стоять есть на чём, но обычного пола (код 1) нет — только пики, расшатанные плиты и прочее | - -Про достижимость важно: считать «сколько комнат на неё ссылаются» НЕ -годится. На уровне 1 комнаты **13** и **18** ссылаются только друг на -друга (13.down = 18, 18.up = 13), то есть входящая связь у каждой есть, а -из остального уровня в них не попасть. Ловит это только обход от старта. - -Чит ищет место снизу вверх: сперва обычный пол (код 1), потом любой -проходимый тайл (`pop_dbg_roomnav`, `roomtest_cold.c`). Поэтому «пол -опасный» — это комнаты, где он свалится на fallback и Кид может погибнуть. - -## Таблица по уровням - -| ур. | старт | достижимо | пропускать | -|---|---|---|---| -| 1 | 1 | 21/24 | **13** (недостижима), **18** (недостижима), **24** (недостижима) | -| 2 | 5 | 24/24 | **14** (пол опасный), **17** (пол опасный) | -| 3 | 9 | 22/24 | **17** (пол опасный), **19** (пол опасный), **20** (нет пола), **21** (пол опасный), **23** (недостижима/нет пола), **24** (недостижима/нет пола) | -| 4 | 1 | 24/24 | **19** (нет пола), **20** (нет пола) | -| 5 | 7 | 19/24 | **1** (недостижима), **3** (недостижима), **5** (недостижима), **6** (недостижима), **19** (недостижима/нет пола), **21** (пол опасный), **22** (нет пола) | -| 6 | 24 | 14/24 | **2** (пол опасный), **3** (нет пола), **4** (недостижима), **7** (нет пола), **8** (недостижима/нет пола), **11** (пол опасный), **13** (недостижима), **14** (недостижима), **16** (недостижима), **17** (недостижима), **19** (недостижима/нет пола), **20** (недостижима), **21** (недостижима/пол опасный), **22** (недостижима), **23** (нет пола) | -| 7 | 17 | 24/24 | **3** (пол опасный), **17** (нет пола), **21** (пол опасный) | -| 8 | 1 | 21/24 | **9** (нет пола), **10** (пол опасный), **11** (недостижима), **15** (недостижима), **17** (пол опасный), **19** (недостижима), **20** (пол опасный), **21** (нет пола) | -| 9 | 11 | 24/24 | **8** (нет пола), **18** (пол опасный) | -| 10 | 1 | 19/24 | **3** (нет пола), **4** (пол опасный), **6** (недостижима), **9** (нет пола), **11** (пол опасный), **13** (нет пола), **18** (нет пола), **20** (нет пола), **21** (недостижима), **22** (недостижима), **23** (недостижима), **24** (недостижима) | -| 11 | 6 | 23/24 | **3** (нет пола), **5** (нет пола), **9** (нет пола), **10** (нет пола), **11** (нет пола), **12** (нет пола), **17** (нет пола), **18** (недостижима), **23** (нет пола) | -| 12 | 3 | 24/24 | **5** (нет пола), **6** (пол опасный), **8** (пол опасный), **10** (нет пола), **11** (нет пола), **17** (нет пола), **18** (пол опасный), **19** (пол опасный), **22** (нет пола) | -| 13 | 23 | 11/24 | **2** (нет пола), **4** (пол опасный), **5** (недостижима), **6** (недостижима/пол опасный), **7** (недостижима), **8** (недостижима/пол опасный), **9** (недостижима), **12** (недостижима), **14** (недостижима), **15** (недостижима), **18** (недостижима/пол опасный), **19** (недостижима/пол опасный), **20** (недостижима), **21** (недостижима), **22** (недостижима/нет пола) | -| 14 | 4 | 6/24 | **7** (недостижима/нет пола), **8** (недостижима), **9** (недостижима), **10** (недостижима), **11** (недостижима), **12** (недостижима), **13** (недостижима), **14** (недостижима/пол опасный), **15** (недостижима), **16** (недостижима), **17** (недостижима/пол опасный), **18** (недостижима), **19** (недостижима), **20** (недостижима), **21** (недостижима), **22** (недостижима), **23** (недостижима), **24** (недостижима) | -| 15 | 6 | 6/24 | **1** (недостижима), **2** (недостижима), **7** (нет пола), **9** (недостижима/пол опасный), **10** (недостижима/пол опасный), **11** (недостижима/пол опасный), **12** (недостижима/пол опасный), **13** (недостижима/пол опасный), **14** (недостижима/пол опасный), **15** (недостижима/пол опасный), **16** (недостижима/пол опасный), **17** (недостижима/пол опасный), **18** (недостижима/пол опасный), **19** (недостижима/пол опасный), **20** (недостижима/пол опасный), **21** (недостижима/пол опасный), **22** (недостижима/пол опасный), **23** (недостижима/пол опасный), **24** (недостижима/пол опасный) | - -## Спецкомнаты — пропускать независимо от таблицы - -| ур. | комн. | почему | -|---|---|---| -| 12 | 23 | **seamless exit**: попадание МЕНЯЕТ УРОВЕНЬ на 13-й. Чит-триггер придержан (`pop_nav_hold`), но в обходе комнате делать нечего | -| 6 | 1 | **falling exit**: Кид проваливается вниз и уходит на 7-й уровень | -| 7 | 17 | **falling entry**: экран сразу переводится на комнату НИЖЕ (в таблице уже «нет пола») | -| 7 | 14 | проходится СВЕРХУ ВНИЗ; чит для неё уже особый — ставит Кида в ряд 0 | -| 5 | 24 | тень ждёт в колонке −1 ряда 0; посадка рядом начинает схватку, которой там быть не должно | -| 13 | 23, 16 | вход роняет гряду плит (`check_fall_flo`) — материализация под падающей плитой | - -## Уровень 15 - -Экран защиты от копирования, не часть сюжета (см. -[`levels_12_15_plan.md`](levels_12_15_plan.md) §4). Портировать не -планируем — **пропускать целиком**. - -## Как применять - -Список — данные, а не логика: держать таблицей в отладочном коде рядом с -`pop_dbg_roomnav` и пропускать помеченные комнаты, чтобы `+` всегда попадал -в пригодную. Пересчитывать скриптом, если поменяются данные уровней. diff --git a/applications/PoP/docs/shadow_atlas_plan.md b/applications/PoP/docs/shadow_atlas_plan.md deleted file mode 100644 index 3c838c6..0000000 --- a/applications/PoP/docs/shadow_atlas_plan.md +++ /dev/null @@ -1,266 +0,0 @@ -# Атлас Тени — разбор и план - -Дата: 2026-08-20. Статус: **ЗАКРЫТО.** Ш0-Ш4 сделаны, прогон -пользователем на уровнях **4, 5, 6 и 12** — всё корректно. - -Задача: сейчас Тень рисуется спрайтами Кида (вне боя) и спрайтами стража -(в бою) как есть, поэтому от Кида она не отличается. В оригинале её вид -даёт наложение спрайта на себя со сдвигом; наш пакетный блит такого не -умеет, поэтому запекаем результат в отдельный атлас заранее. - -## 1. Что делает оригинал (проверено по SDLPoP, не по памяти) - -`draw_objtable_item`, `seg008.c:1600`: - -```c -case 1: // shadow - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl, obj_y, blitters_2_or, 1); - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl + 1, obj_y, blitters_3_xor, 1); -``` - -Тот же самый спрайт кладётся ДВАЖДЫ: первый проход в x, второй в x+1. -Два уточнения, которые меняют алгоритм запекания: - -1. **`blitters_2_or` — это НЕ побитовое ИЛИ.** В SDLPoP он реализован - обычным блитом с colour key = индекс 0 (`method_6_blit_img_to_scr`, - `seg009.c:3306`: `SDL_SetColorKey(image, SDL_TRUE, 0)`). То есть - первый проход — наш обычный прозрачный блит, один в один. -2. **`blitters_3_xor` работает по 24-битному RGB, а не по индексам - палитры** (`blit_xor`, `seg009.c:3190`: конвертация в 24 бита, затем - `*p_dest ^= *p_src` побайтно). Прозрачности у него нет вообще — - XOR'ится весь прямоугольник, но прозрачные пиксели спрайта это - чёрный 0x000000, а XOR с нулём ничего не меняет. - -Отсюда и берётся необходимость СВОЕЙ палитры: XOR двух цветов игровой -палитры даёт цвет, которого в ней нет. - -### Каким набором спрайтов рисуется Тень (проверено 2026-08-20) - -Сначала я решил, что в боевых кадрах Тень рисуется спрайтами СТРАЖА, и -записал это в план. **Это было неверно, поправка ниже.** - -Набор выбирает НЕ charid. `load_frame_to_obj` (`seg008.c:1752`): - -```c -word chtab_base = id_chtab_2_kid; // жёстко Кид -obj_chtab = chtab_base + (cur_frame.sword >> 6); // старшие 2 бита кадра -``` - -то есть набор берётся из САМИХ ДАННЫХ КАДРА, поле `sword`: младшие 6 бит — -картинка меча, старшие два — смещение chtab относительно Кида -(`types.h:361`). Проверил обе таблицы: - -- `frame_table_kid` — **все 241 кадра** имеют `sword & 0xC0 == 0` → chtab_2. - Значит **Кид всегда рисуется своими спрайтами**, боевые кадры 150..189 не - исключение; -- `frame_tbl_guard` — все кадры имеют `0xC0` → chtab_5. - -Тень берёт `frame_tbl_guard` для кадров 150..189 (`seg006.c:533`), значит в -бою она идёт через chtab_5. **Но chtab_5 — это не «страж», это «соперник -уровня»**: он грузится из `tbl_guard_dat[tbl_guard_type[уровень]]` -(`seg000.c:1117`), а `tbl_guard_type[12] == 4` → **SHADOW.DAT**. - -Открыл SHADOW.DAT: его палитра **побайтно равна палитре Кида** (у GUARD.DAT -там серая рампа под перекраску), а спрайты — Кид в боевых позах, не страж. -Отрендерил тройками «Кид / SHADOW.DAT / GUARD.DAT» для кадров -151/153/158/161/167: первые две колонки — один и тот же персонаж, третья — -серый страж в тюрбане. - -**Вывод: Тень ВСЕГДА выглядит Кидом, и ощущение пользователя верно.** -Спрайты при этом лежат в двух файлах: не-боевые кадры в chtab_2 (KID), -боевые — в chtab_5, заполненном SHADOW.DAT. - -### Можно ли взять для боя собственные кадры Кида - -Механически да: `frame_table_kid` покрывает 150..189 со своей геометрией, -и хватило бы снять спецветку для `charid_1_shadow` в `load_frame`. Но -кадры НЕ совпадают: из 34 боевых у 31 отличается габарит (на 1-6 px), у 3 -отличаются пиксели. Это разная графика, а не одна и та же в двух файлах. -Поэтому берём SHADOW.DAT — он и есть «кадры Кида для Тени», подготовленные -авторами. - -## 2. Единственное место, где запечка отличается от оригинала - -XOR идёт по тому, что УЖЕ на экране, то есть результат зависит от фона. -Разбор по пикселям показывает, что зависимость узкая: - -| пиксель | первый проход | второй проход | зависит от фона? | -|---|---|---|---| -| спрайт непрозрачен в x | закрашен цветом спрайта | XOR с цветом из x−1 | **нет** | -| прозрачен в x, непрозрачен в x−1 | фон | фон XOR цвет | **да** | -| прозрачен в обоих | фон | фон | нет (не рисуем) | - -То есть от фона зависит только **кайма в один пиксель по левым кромкам -силуэта**. На чёрном фоне (а Тень почти всегда на нём — уровень 4 у -зеркала, уровень 6, бой на 12-м) `фон XOR цвет == цвет`, и запечка точна. -На светлом фоне оригинал подкрасит эту кайму, мы — нет. - -**Это осознанное расхождение, в `impl_diff.md` при реализации.** - -## 3. Замеры на реальных ассетах - -Прогон алгоритма по правильным наборам (`SDLPoP/data/KID` + -`SDLPoP/data/SHADOW`): - -| набор | кадров | макс. габарит | разных цветов | -|---|---:|---|---:| -| Кид (chtab_2) | 219 | 56×57 | 44 | -| SHADOW.DAT (chtab_5 на ур. 12) | 32 | 49×38 | 22 | -| **вместе** | **251** | 57×57 (с учётом +1 px сдвига) | **45** | - -Цветов вместе почти столько же, сколько у одного Кида: SHADOW.DAT сидит на -той же палитре, новых сочетаний XOR почти не даёт. Всего пикселей во всех -кадрах Тени — 91 045. - -### Насколько заметна подмена - -«Затронуто» само по себе ничего не говорит — важно, НА СКОЛЬКО сместился -цвет. Порог различимости на плоской заливке ~30-40 единиц евклида в RGB -(максимум возможного — 441). Пробовал три стратегии подбора: - -- **A** — оставить N самых частых цветов ТОЧНО, остальные в ближайший; -- **B** — взвешенный k-means по всем цветам (двигает вообще все); -- **C** — гибрид: часть слотов под точные частые, остаток — кластеры хвоста. - -| палитра | стратегия | изменено px | заметно (40..90) | сильно (>90) | худшая | -|---|---|---:|---:|---:|---:| -| 16 | A самые частые | 959 (1,05 %) | 569 | 381 | 128 | -| **16** | **C гибрид 5+11** | 6 984 (7,67 %) | 1 078 | **76** | 114 | -| 32 | A самые частые | 50 (0,05 %) | 40 | 4 | 113 | -| 32 | C гибрид 28+4 | 73 (0,08 %) | 58 | **0** | 90 | - -Читается так. При 32 цветах всё практически идеально: 73 пикселя на 251 -кадр, грубых промахов нет вовсе. При 16 цветах выбор стратегии виден: -«самые частые» трогает меньше пикселей (959), но 381 из них уезжает СИЛЬНО; -гибрид размазывает ошибку — грубых остаётся 76, то есть примерно **0,3 -пикселя на кадр**. - -### Решение: **16 цветов, стратегия C (гибрид 5 + 11)** - -Числа выше — про пиксели, а решает глаз. Отрендерил одни и те же кадры в -трёх видах (точный цвет / 32 / 16) и сравнил в увеличении ×3: **отличий -не видно**. Объяснение в самих числах: перцептивно значимых пикселей при -16 цветах гибридом — 1 154 на 251 кадр, это ~4,6 пикселя на кадр при -~1 000 видимых, и они РАССЫПАНЫ по контуру, а не собраны в пятно. - -Поэтому берём 16, а не 32: экономим блок палитры (пригодится под будущие -наборы — принцесса, визирь, мышь), а разница неразличима. - -**Но стратегия обязана быть гибридной.** При 16 цветах «взять самые -частые» впятеро хуже по грубым промахам (381 пиксель против 76), и это -единственное место, где выбор стратегии виден. Гибрид: 5 самых частых -берём ТОЧНО, оставшиеся 11 слотов отдаём под взвешенные кластеры хвоста. - -Если в реальной игре кайма всё же будет резать глаз — переход на 32 цвета -это одна константа в упаковщике и один блок палитры, данные не меняются. - -## 4. Палитра: что занято и куда класть - -| блок | кто | примечание | -|---|---|---| -| 0x30..0x3F | VGA-16 | общая; из неё цвет вспышки, пузырьки зелий, отладочная метка | -| 0x40..0x4F | chtab_1 | зелья, пламя | -| 0x50..0x5F | env тайлсета | **меняется** подземелье/дворец | -| 0x60..0x6F | wall тайлсета | **меняется** подземелье/дворец | -| 0x70..0x7F | chtab_2 | Кид | -| 0x80..0x8F | chtab_0 | меч в руке | -| 0x90..0x9F | chtab_5 | страж, перезаливается цветом стража | - -Занято 112 слотов из 256, **свободно 144** — девять выровненных блоков по -16. Оговорки: 0xFF в наших атласах это маркер прозрачности, а запись 0 -правит `flash_bg`, так что блоки 0x00 и 0xF0 лучше не трогать. - -**Берём 0xA0..0xAF** (16 слотов) — сразу за стражем, персонажи остаются -сгруппированы, а блок 0xB0 остаётся свободным (под 32 цвета Тени, если -понадобится, или под будущие наборы). - -Важно: в наших атласах прозрачность кодируется байтом 0xFF, а исходный -индекс 0 в них означает «прозрачно». У Тени **чёрный — настоящий цвет** -(это XOR-погашенная середина силуэта, 51 % всех её пикселей), поэтому у -неё маппинг свой: «нет пикселя» → 0xFF, цвет k → 0xA0 + k, и слот 0xA0 = -чёрный НЕПРОЗРАЧНЫЙ. - -## 5. Объём - -251 кадр против 219 у Кида — по страницам EMM примерно как нынешний -набор Кида (28 страниц), плюс пара на кадры из SHADOW.DAT. При 215 свободных -страницах на старте (memory `sprinter_emm_budget`) это не проблема. - -Кадры смерти («убитый Кид») пока НЕ вырезаем — экономия несколько -страниц, а риск промахнуться мимо нужного кадра реальный: Тень на 12-м -уровне умирает. - -## 6. План работ - -**Ш0. Довезти SHADOW.DAT.** Его у нас нет вовсе (см. BUG-SHADOW-SET) — -добавить каталог ассетов и правило в Makefile рядом с GUARD/SKEL/VIZIER. - -**Ш1. Упаковщик** `toolchain/pop_pack_shadow.py`: прогнать оба набора -через алгоритм §1, собрать 16-цветную палитру гибридом (10 точных + 6 -кластеров хвоста), выдать -`poc/res/shadow/shadow0..N.atl` + `shadow.pal` + `pop_shadow_atlas.h`. -Критерий: предпросмотр PNG совпадает с видом Тени в SDLPoP. - -**Ш2. Загрузка**: `pop_shadow_load()` рядом с `pop_kid_load`, палитра в -0xA0..0xAF, и обе страницы дабл-буфера (как `bg_load_tile_pal`). -Грузить ЛЕНИВО — только когда на уровне есть Тень (4, 5, 6, 12), иначе -28 страниц EMM висят зря. - -**Ш3. Отрисовка**: одно место — `pop_cdraw.c:551..568`, где выбирается -`pages`. Сейчас там для соперника берётся `gp`, а для не-боевых кадров -Тени подменяется на `kidp`; станет «charid == CHARID_1_SHADOW → shadowp» -БЕЗ подмены: обе половины (кадры Кида и кадры SHADOW.DAT) лежат в ОДНОМ -атласе Тени, так что ветка становится проще нынешней. - -**Ш4. Проверка в MAME**: уровень 4 (Тень у зеркала), уровень 6 (Тень -крадёт зелье), уровень 12 (бой с Тенью — там она в боевых кадрах, то -есть проверяется вторая половина набора). - -## 7. Что проверить артефактом до Ш3 - -1. Индекс кадра для Тени в боевых кадрах: `frame_tbl_guard` адресуется - как `frame + add_frame - 149` (`seg006.c:535`), то есть у нашего - атласа Тени нумерация двух половин должна совпадать с тем, что уже - делает `pop_frame_tbl_is_guard`. -2. Перекраска Тени НЕ нужна: SHADOW.DAT приходит уже в палитре Кида, а - `curr_guard_color` у не-стражей равен 0 (`seg002:183`). Ветку - `pop_guard_set_palette` для типа 4 звать нельзя — она затрёт палитру - Тени палитрой стража. - ---- - -# 8. Как сделали (2026-08-20) - -- `toolchain/pop_pack_shadow.py` — запекает обе половины, собирает - 16-цветную палитру гибридом (получилось 5 частых точно + 11 кластеров - хвоста), пишет `poc/res/shadow/sk0..27.atl`, `sf0..3.atl` и - `roomtest/pop_shadow_atlas.h`. Итог: **251 спрайт, 32 EMM-страницы, - 225 178 Б**. -- `roomtest/pop_shadow.c/.h` (банк 8) — загрузка. **Грузим один раз при - старте**, а не по уровням: страниц EMM с запасом, а забыть перезагрузку - на границе легко — ровно так и появился BUG-SHADOW-SET. -- `pop_cdraw.c` — одна ветка выбора атласа; заодно брызги урона теперь - берут атлас отдельным указателем (`spl`), потому что у оригинала они - всегда из «своего» chtab, а у Тени кадр может прийти из другой - половины набора. - -## Грабля, стоившая одного прогона - -Набор загрузился, силуэт нарисовался правильной формы — и **целиком -чёрный**. Причина: `gfx_pal_fload("KID\\kid.pal")` заливает ВСЕ 256 -записей палитры и затирает любые слоты, выставленные до него. Ровно та -же беда уже была с тайлсетом — сразу за этим вызовом стоит -`pop_bg_pal_apply`. Поэтому палитра Тени вынесена в отдельный -`pop_shadow_pal_apply()` и зовётся там же, а не внутри загрузки атласов. - -**Правило на будущее: любой новый набор палитровых слотов красится ПОСЛЕ -kid.pal, рядом с pop_bg_pal_apply.** - -## Проверено - -Уровни 4 (рождение из зеркала), 5 (кража зелья), 6 (прыжок через -пропасть) и 12 (бой — там работает вторая половина набора, `sf*`) — -прогон пользователя 2026-08-20, расхождений не найдено. - -Расхождение из §2 (кайма в один пиксель по левым кромкам на НЕчёрном -фоне) записано в `impl_diff.md`. diff --git a/applications/PoP/docs/shadow_render.md b/applications/PoP/docs/shadow_render.md deleted file mode 100644 index af0a39b..0000000 --- a/applications/PoP/docs/shadow_render.md +++ /dev/null @@ -1,160 +0,0 @@ -# Отрисовка Тени (charid_1_shadow) — изыскания, отложено - -Статус на 2026-08-11: **отложено по решению пользователя.** Тень пока -рисуется как обычный персонаж — простой копией из атласов Кида -(`pop_cdraw.c`, банк 0x5C, аппаратная прозрачность `#FF`). Вернуться к -«правильному» виду, когда будут сделаны все уровни: тогда будет известно, -какими именно кадрами тень вообще пользуется. - -Этот файл собирает всё, что уже выяснено, чтобы не переоткрывать. - ---- - -## 1. Как тень выглядит в оригинале - -Тень рисуется **двумя блитами ОДНОГО И ТОГО ЖЕ спрайта Кида** -(`seg008:1602`, `add_objtable`): - -```c -case 1: // shadow - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl, obj_y, blitters_2_or, 1); - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl + 1, obj_y, blitters_3_xor, 1); -``` - -OR на месте, XOR со сдвигом на пиксель вправо. XOR гасит совпавшее, -остаются края — отсюда «контурный» вид. Это ЗАМЫСЕЛ оригинала, а не -артефакт SDLPoP: подтверждено печатью из живого SDLPoP (метка `DBGMIRROR` -в `add_objtable`) — и тень, и отражение идут из `chtab=2` (собственные -спрайты Кида), `swordbits=0`, обычными кадрами: - -``` -type=4 chtab=2 img=40 dir=0 clipL=137 clipT=3 charid=0 frame=41 <- отражение -type=1 chtab=2 img=41 dir=0 clipL=137 clipT=3 charid=1 frame=42 <- тень -``` - -Единственное различие между отражением и тенью — блиттер. - -## 2. Чем мы располагаем - -Блочные AND/OR/XOR/NOT акселератора подняты в libbgi 2026-08-11 (полный -набор строками и колонками, `gfx_blit_op` / `gfx_blit_part_op` / -`gfx_blit_cols_op` / `gfx_blit_cols_part_wx_op`; регресс — `tests/accop`, -10/10 PASS). Механика и ловушки — memory `accel_block_ops` и шапка -`libbgi/common/_gfx_blit_full_op.c`. То есть примитивов достаточно, дело -не в них. - -## 3. Две причины, по которым «в лоб» не получается - -### 3.1 XOR несовместим с нашей прозрачностью `#FF` - -Аппаратная прозрачность (бит 3 видеобанка) подавляет запись байта `#FF`, -то есть смотрит на **результат** операции: - -| операция | прозрачный пиксель источника | итог | -|---|---|---| -| AND | `#FF & bg = bg` | работает даром | -| OR | `#FF \| bg = #FF`, запись подавляется | работает даром | -| XOR | `#FF ^ bg = ~bg`, подавления нет | **инверсия фона по всему футпринту** | - -Совпадение с «ничего не делать» у XOR получается только там, где фон равен -0 (`#FF ^ 0 = #FF` → подавляется). В DOS-оригинале прозрачный индекс = 0 — -нейтральный и для OR, и для XOR, поэтому там оба блиттера работают на одном -наборе спрайтов. У нас прозрачный `0xFF` (`pop_pack_kid.py`: `0 -> 0xFF`, -`i -> 0x70 + i`). - -Замаскировать `#FF` внутри операции нельзя в принципе: побитовые AND/OR/XOR -не умеют «выбрать по условию», а `#FF` — нейтраль только для AND. Значит -источнику XOR-прохода нужен **прозрачный `0x00`**, то есть отдельный набор -спрайтов. - -### 3.2 Операция читает ОЗУ-копию экрана, а не видео-ОЗУ - -Чтение страниц `#50..#5F` всегда отдаёт ОЗУ-копию (memory -`sprinter_vram_transparency`), а персонажи рисуются банком `0x5C` («не -писать в копию» — на этом держится даровой heal). Поэтому второй проход -**не увидит результат первого**: два блита оригинала выродились бы в -«просто XOR», контурного эффекта не будет. - -Лечится не банком `0x50` (он ломает heal — копия перестанет быть чистым -фоном), а **однопроходным композитом**: всё складывается в буфере -акселератора за один проход по колонке j футпринта - -``` -буфер := s[j] ; спрайт -буфер |= bg[j] ; вертикальное чтение экрана -буфер ^= s[j-1] ; тот же спрайт, предыдущая колонка = сдвиг на +1 px -запись ; вертикальная запись колонки -``` - -что **точно эквивалентно** двум блитам оригинала (крайние колонки: `x` — -только OR, `x+w` — только XOR) и вдобавок дешевле их: 4 burst'а на колонку -против 6. Такому композиту тоже нужен источник с прозрачным `0x00` — уже -на обоих шагах. - -## 4. Сколько стоит подготовить источник с прозрачным `0x00` - -Замер 2026-08-11 (`tests/convbench`, watchpoint по IO-записи в MAME, кадр = -430 080 тактов). Цикл безветвочный (`ADD A,A / SBC A,A / CPL / AND` — -маска из бита 7: прозрачный `#FF` отличается от цветов Кида `0x70..0x7F` -именно им), 59 номинальных T-states на байт, по факту **145.3 такта/байт** -(2.5× wait-state'ов ОЗУ): - -| объём | кадров | секунд | -|---|---|---| -| 1 страница атласа, 16 КБ | 5.5 | 0.11 | -| весь атлас Кида, 28 страниц × 16 КБ = 448 КБ | 155 | 3.2 | -| он же **по реальному размеру данных (186 КБ)** | 64 | **1.3** | - -Последняя строка — замечание пользователя: 28 атласов занимают 186 КБ, а не -448 КБ; обрабатывать по фактическому размеру ленты вместо целой страницы -даёт 2.4× (ценой проверки границы в цикле). Потолок разгона самого цикла — -ещё примерно вдвое (раскрутка убирает `djnz`, чтение через SP парами + -таблица 256 Б вместо арифметики), то есть **~0.7 с** на 186 КБ. Порядок -величины при этом не меняется. - -**Окна:** источник и приёмник — разные EMM-страницы, а окно под атласы одно -(W0), поэтому конвертация гоняется «страница-источник в W0 → -страница-приёмник в W3» целыми страницами; побайтно переключать окно нельзя. -EMM-бюджет: +28 страниц (448 КБ) из ~3440 КБ свободных — не проблема -(memory `sprinter_emm_budget`), и он одинаков в любом из вариантов. - -## 5. Варианты (когда вернёмся) - -1. **Конвертация в рантайме при загрузке уровня с тенью** (4, 5, 6, 12): - диск и упаковщик не трогаем, цена — 1.3 с (или 0.7 с после разгона) на - загрузку такого уровня. -2. **Лениво, постранично** — 0.11 с (5.5 кадра) при первом обращении тени к - странице; рывок один раз на страницу, суммарно меньше, чем вариант 1. -3. **Второй набор `.atl` от упаковщика** (`pop_pack_kid.py`, прозрачный - `0x00`): 0 с рантайма, +186 КБ на образе и вторая ветка в загрузчике - атласов. -4. **Только OR-проход** (то, чем можно обойтись бесплатно): OR с нашим - `#FF`-атласом работает как есть, тень получается сплошным силуэтом в - палитре Кида, без контурного эффекта. Расхождение с оригиналом — тогда - записью в `docs/impl_diff.md`. - -**Ключ к выбору — какие кадры тень вообще использует.** Предположение -пользователя: только бег, длинный прыжок (из зеркала), питьё зелья и -боёвка; прыжки с места и подтягивания — нет. Если так, конвертировать -(или паковать) нужно единицы страниц, а не 28, и разница между вариантами -почти исчезает. Список снимать по факту — когда уровни 5/6/12 будут -проходиться. - -## 6. Что ещё придётся проверить глазами - -Палитра. У нас индексы разложены группами по 16 (`pop_pack_bg.py`): -`0x30` VGA16, `0x40` chtab_1, `0x50` env, `0x60` wall, `0x70` kid, `0x80` -sword, `0x90` guard. Отсюда ожидания (аналитические, в MAME НЕ -проверялись): - -- OR-проход ложится удачно: `0x7X | 0x5Y = 0x7Z` — результат остаётся в - палитре Кида, а младший ниббл получается ровно тот же, что дал бы DOS - (там OR шёл по 4-битным индексам внутри одной палитры); -- XOR-проход уводит результат в группы `0x0Z` (поверх OR-результата) и - `0x2Z` (по чистому фону) — **обе группы палитры у нас не заполнены**, то - есть контур рискует оказаться просто чёрным. - -Значит к «посмотреть глазами» добавляется вопрос, чем заполнять `0x00..0x0F` -и `0x20..0x2F` — по сути это и будет выбор цветов тени. В DOS такого -вопроса не было: XOR двух 4-битных индексов всегда оставался внутри той же -16-цветной палитры. diff --git a/applications/PoP/docs/sound_plan.md b/applications/PoP/docs/sound_plan.md deleted file mode 100644 index f7c5234..0000000 --- a/applications/PoP/docs/sound_plan.md +++ /dev/null @@ -1,963 +0,0 @@ -# Звук в порте PoP — разбор и план - -Дата: 2026-08-20, музыка дописана 2026-08-25. Статус: **PCM-эффекты -реализованы; музыка — путь C (PCM через CBL), первый трек играет.** - -Задача пользователя: добавить звук. Приоритет — эффекты; музыку, если -найдётся способ. Эффекты — **обязательно WAV, а не PC-спикер** -(уточнение 2026-08-20; см. §1а — оказалось, что они и так все в WAV). Ниже — что реально лежит в ассетах, что умеет железо, и -почему получившийся план вышел проще, чем ожидалось. - -## 1. Главный вывод - -**Ни MIDI разбирать, ни ноты сочинять не придётся, и ресэмплировать тоже.** - -- Эффекты уже лежат **8-битным беззнаковым PCM на 11 000 Гц**, а у CBL есть - режим **10 937,5 Гц** — расхождение 0,6 %, на слух неразличимо. Формат - сэмпла совпадает с нашим CBL байт в байт (`cbl.h`: 8 бит, беззнаковый, - центр 0x80). То есть данные играются **как есть**, без конверсии. -- Музыка есть в виде **списков нот PC-спикера — 7 КБ на всю игру**, а нота - там задана прямо в ГЕРЦАХ. Пересчёт в делитель AY — одно деление. -- AY и COVOX на Sp2000 сведены в **один ЦАП TDA1543** (док Ивана Мака, - §5), значит музыка на AY и эффекты через CBL звучат ОДНОВРЕМЕННО, и - смешивать их программно не надо. - -## 1а. Уточнение после разбора ВСЕХ наборов MS-DOS версии (2026-08-20) - -Пользователь попросил, чтобы эффекты были не PC-спикером, а WAV, и заодно -посмотреть `mt32snd[1-2].dat`. Разобрал все восемь `.dat` из `MSDOS/`. -Ответ короткий: **эффекты И ТАК все до одного есть в WAV, а вот у музыки -WAV нет ни в одном наборе.** - -| набор | формат | какие звуки | сколько | -|---|---|---|---| -| `digisnd1..3` | **WAV**, 8 бит PCM | эффекты 0..23, 44..49, 51 | **31** | -| `mt32snd1..2` | MIDI для Roland MT-32 | ТЕ ЖЕ эффекты 0..23, 44..51 | 31 | -| `midisnd1..2` | MIDI (AdLib/GM) | **музыка** 24..43, 50, 52..56 | 22 | -| `ibm_snd1..2` | ноты PC-спикера | **всё подряд, 0..56** | 57 | - -Здесь пряталась ловушка: `mt32snd` по имени похож на «музыку получше», а -на деле это набор ЭФФЕКТОВ для владельцев MT-32 — те же id, что у -`digisnd`. Музыки в нём нет вовсе. - -Частоты WAV: 28 звуков на 11 000 Гц, по одному на 8 200, 14 000 и 2 750. -Итого 112 922 сэмпла = **11,4 с, ~110 КБ ≈ 6,7 EMM-страниц**. - -Только PC-спикером, без альтернатив, остаются четыре id: 31, 34, 42 -(пустые) и **38 `blink`** — четыре ноты. То есть на весь звук игры -спикер нужен ровно для одного писка. - -### Музыка: WAV нет, есть три пути - -| путь | данные | что получится | цена | -|---|---|---|---| -| **A. Ноты PC-спикера на AY** | 7 КБ | один квадратный голос — ровно то, что слышали на IBM PC 1989 | секвенсор на полсотни строк | -| **B. MIDI -> AY, три голоса** | 27 КБ исходника | богаче: бас + мелодия + арпеджио | разбор MIDI + раскладка по каналам | -| **C. MIDI -> WAV на хосте, стрим через CBL** | см. ниже | настоящее звучание, любое | нужен синтезатор на хосте + место | - -Про объём для пути C (замерено по длительностям треков): - -| группа | треков | длительность | WAV 11 кГц | -|---|---:|---:|---| -| звучат ПО ХОДУ игры (гимн уровня, смерть, зелья, перо, победа) | 12 | 74,7 с | **803 КБ = 50 EMM-страниц** | -| заставки и титры | 10 | 248,1 с | 2 665 КБ = 167 страниц | - -Игровая половина в EMM **влезает** (при ~215 свободных страницах), а -заставочная — нет, её пришлось бы стримить с диска. Но заставки идут -тогда, когда игра ничего не рисует, так что стрим там как раз уместен. - -**Предложение:** начинать с A (7 КБ, работает сразу, ноль рисков), а C -держать как отдельную фазу — она ортогональна: проигрыватель WAV для -музыки это тот же `cbl_push`, что и для эффектов, только длиннее буфер. -B имеет смысл только если C окажется неподъёмным по месту. - -## 1б. РЕШЕНИЯ (пользователь, 2026-08-20) - -1. **Эффекты — WAV через CBL, 8 бит, МОНО, единая частота.** Проверено по - `convert_digi_sound` (`seg009.c:2358`): один байт на кадр, то есть - моно, и байт беззнаковый (`(b | b<<8) - 32768`), центр 0x80 — ровно - формат нашего CBL. Стерео в данных нет вовсе: каналы у оригинала - размножаются уже на выходе (`digi_audiospec->channels`). -2. **Музыка, первый заход — путь A** (ноты спикера на AY). -3. **Заставки и титры — потом WAV.** Конфликта с эффектами там нет: - одновременно они не звучат. -4. **Музыка ПО ХОДУ игры** (она может совпасть с эффектом) — открыто, два - варианта: либо тоже WAV с ГАШЕНИЕМ эффектов на время музыки (музыка - важнее — **проверить на слух**), либо путь B (MIDI -> три голоса AY). -5. **Все эффекты привести к одной частоте.** -6. Синтезатор для MIDI -> WAV — решать ближе к делу; годятся и онлайн- - конвертеры, хоть вручную, если fluidsynth/timidity не поставится. - -### Про единую частоту (замер) - -Приводим не к 11 000, а ровно к **10 937,5 Гц — частоте CBL** -(`CBL_FREQ_10K9`). Тогда тон точен, а не «на 0,6 % ниже»: проигрывание -11 000 Гц данных на 10 937,5 даёт сдвиг **−9,9 цента**, что на коротком -эффекте не слышно, но бесплатно избавиться от него всё равно приятно — -пересчитывать три файла всё равно придётся. - -| id | звук | было | станет | дельта | -|---|---|---|---|---:| -| 15 | `leveldoor_sliding` | 2 750 Гц, 4 436 сэмплов | 17 643 | **+13 207 Б** | -| 23 | `footstep` | 8 200 Гц, 996 | 1 329 | +333 Б | -| 51 | `princess_door_opening` | 14 000 Гц, 6 188 | 4 834 | −1 354 Б | -| — | остальные 28 (11 000 Гц) | — | ×0,9943 | −588 Б | - -Итог: **112 922 -> 124 531 Б, 6,9 -> 7,6 EMM-страниц.** Рост целиком от -`leveldoor_sliding`: источник у него 2 750 Гц, вчетверо реже целевой, и -апсэмплинг не улучшит звучание — только уравняет формат. Платим 0,8 -страницы за то, что **CBL открывается ОДИН раз и частоту менять не надо -никогда** — ни между эффектами, ни при переходе на музыку-WAV. - -(Альтернатива для него — хранить как есть и повторять каждый сэмпл -четырежды в рантайме: 2 750 × 4 = 11 000 ровно. Это код в `fill()` ради -13 КБ; не стоит того, но если место когда-нибудь прижмёт — вариант есть.) - -## 1в. Бюджет памяти EMM (живой замер 2026-08-20) - -Замерено `mem_info` из работающей программы (уровень 1), а не посчитано на -бумаге: инструментовка ставилась временно и откатана. - -| | страниц | КБ | -|---|---:|---:| -| всего в машине | 256 | 4 096 | -| система (DSS) + сам exe: база + 8 банков кода | **43** | 688 | -| наши ассеты | **81** | 1 296 | -| **занято** | **124** | 1 984 | -| **свободно** | **132** | **2 112 (2,06 МБ)** | - -Разбивка 81 страницы ассетов (сходится точно): - -| набор | страниц | -|---|---:| -| **Тень** (`sk*` 28 + `sf*` 4) | **32** | -| Кид (`kid0..27`) | 28 | -| фон тайлсета (env 10 + wall 1 + fore 1) | 12 | -| страж | 5 | -| зелья (chtab_1), меч, `kid_data.bin`, страница уровня | по 1 | - -Самый крупный потребитель теперь — **набор Тени, 32 страницы**, больше -самого Кида. Если место когда-нибудь прижмёт, там есть очевидный резерв -(кадры смерти и позы, в которых Тень не бывает), но при 132 свободных -страницах трогать незачем. - -### Что из этого следует для звука - -| статья | страниц | останется свободно | -|---|---:|---:| -| эффекты WAV, все 31, 10 937,5 Гц | **8** | 124 | -| музыка ПО ХОДУ игры в WAV (путь C, 12 треков) | 50 | 74 | -| заставки и титры в WAV (10 треков, 248 с) | 167 | **не влезает** | - -То есть эффекты — капля, игровая музыка в WAV тоже поместится, а -заставочную придётся стримить с диска в любом случае (что и планировалось: -во время заставок игра ничего не рисует). - -Оговорка: 132 свободных страницы — это на уровне 1. На уровне 9 добавятся -зеркальные наборы (`pop_vflip_load_all`: 28 Кид + 5 страж + меч = 34 -страницы), останется ~98. Проверять запас надо ИМЕННО ТАМ. - -## 1г. MSDOS против SDLPoP: чем отличаются наборы (сверено 2026-08-20) - -У нас лежат ДВЕ копии звука — оригинальные `.dat` в `MSDOS/` (версия -1.3/1.4) и распакованные ассеты `SDLPoP/data/` (версия 1.0/1.1). Разница -есть, и она влияет на выбор источника. - -### Оцифровка: берём MSDOS - -Заголовок разный (`digi_new_type` против `digi_type`), но **28 звуков из -31 совпадают побайтно**. Различаются три, и все не в пользу SDLPoP: - -| id | звук | MSDOS | SDLPoP | -|---|---|---:|---:| -| 10 | `sword_vs_sword` | 5 020 сэмплов | 3 504 | -| 11 | `sword_moving` | 1 172 | 1 172, но **другие байты** | -| 48 | `spiked` | 5 069 | **7** — то есть звука нет | - -`spiked` в наборе SDLPoP фактически пустой. Поэтому упаковщик читает -`MSDOS/digisnd*.dat`, а не распакованные ассеты — в отличие от графики, -где источник наоборот SDLPoP. - -### MIDI: если дойдём до музыки — брать SDLPoP - -Здесь всё наоборот. Содержимое музыкально то же (деление 480, те же -каналы 0..7 плюс ударные), но: - -| | MSDOS | SDLPoP | -|---|---|---| -| формат MIDI | **0** — всё слито в ОДНУ дорожку | **1** — 8-9 дорожек | -| размер (звук 24) | 327 Б | 448 Б | -| размер (звук 56) | 13 587 Б | 12 773 Б | - -Формат 1 с отдельной дорожкой на инструмент — это готовое разделение -голосов. Для пути B (MIDI -> три канала AY) оно решает половину задачи: -дорожки можно выбирать напрямую (бас / мелодия / гармония), а не -разбирать слитый поток и догадываться, что чем было. - -**Итог: эффекты из MSDOS, музыка (когда дойдёт) из SDLPoP.** - -## 2. Что лежит в ассетах (замерено, а не по памяти) - -Звук в PoP адресуется как ресурс `10000 + N`, N = 0..56 — 57 звуков -(`load_sound`, `seg009.c:2289`). Наборов три, и они ПАРАЛЛЕЛЬНЫЕ: один и -тот же звук есть в нескольких видах. - -| набор | что это | объём | покрытие | -|---|---|---:|---| -| `DIGISND1..3.DAT` | оцифровка, 8 бит PCM | 103 941 Б | **31 звук** (эффекты) | -| `MIDISND1..2.DAT` | MIDI-музыка | 27 776 Б | музыка | -| `IBM_SND1..2` (распакованы) | ноты PC-спикера | **7 КБ** | **все 57** | - -### 2.1 Оцифровка (эффекты) - -Разбор контейнера: индекс по 8 байт на запись (id, offset, size), **первый -байт ресурса — контрольная сумма**, тело за ней (спецификация -`POP-DAT-FormatSpecifications`, §3.1.2 — на этом я сначала споткнулся и -читал мусор). Тело — `digi_type`: `word rate, word count, word unk, -byte size`, дальше сэмплы. - -- 31 звук, все 8-битные; -- частоты: **28 звуков на 11 000 Гц**, по одному на 8 200 и 14 000; -- 103 701 сэмпл = **9,4 секунды**, **103 941 Б ≈ 6,3 EMM-страницы**. - -### 2.2 Ноты PC-спикера (и эффекты, и музыка) - -Формат: `byte type(=0), word tempo`, дальше тройки `word frequency, -byte length`; `frequency <= 1` — пауза, `0x12` — конец. Ключевое, что -пришлось смотреть в `play_speaker_sound`/`speaker_callback` (`seg009.c`): - -- **`frequency` — это ГЕРЦЫ напрямую** (`generate_square_wave(stream, - (float)note->frequency, ...)`), а не делитель PIT, как кажется по - маленьким числам; -- длительность ноты = `length / tempo` СЕКУНД. - -Замеры по всем 57 звукам: **2212 нот**, частоты 16..65507 Гц, -длительности 1,74..2571 мс. - -Из них 23 звука — те, у которых оцифровки НЕТ, то есть вся музыка: -заставки, гимны уровней, смерть, победа, титры (id 24..43, 50..56). -**1469 нот**, и вот их длительности: - -| длительность ноты | нот | доля | -|---|---:|---:| -| < 3 мс | 0 | 0 % | -| 3..12 мс | 2 | 0,1 % | -| 12..25 мс | 140 | 9,5 % | -| > 25 мс | 1327 | 90,3 % | - -Это число решает вопрос про таймер — см. §4. - -## 3. Что умеет железо (док Ивана Мака §5 + MAME) - -- **AY-3-8910/8912** в ПЛМ, «программируется по стандартным описаниям» — - то есть ZX-порты; в MAME он заведён как `AY8910(config, "ay8912", - X_SP/24)`, то есть **тактовая 1,75 МГц**. Период канала = 109375 / - частота(Гц), 12 бит (макс 4095) → снизу берутся частоты от ~27 Гц. - Точные Z80-адреса портов идут через таблицу DCP, а не напрямую — - **проверить артефактом до кодинга** (ожидаем ZX-стандарт 0xFFFD/0xBFFD). -- **CBL** — COVOX с буфером 256 Б, две половины по 128; бит 7 порта 0xFE - показывает играющую половину, порт управления 0x4E. Прерывание — - когда половина сменилась. -- **Бипер** (бит 5 порта 0xFE) — туда же в ЦАП. Нам не нужен. -- Всё это **сведено в один ЦАП**, поэтому AY и CBL звучат вместе. - -У нас уже есть готовая обвязка CBL (`libc/include/cbl.h`): callback -`fill(n)`, выдача блока через `cbl_push_otir()` (порт 0x4F) или через -акселератор, коды частот, счётчик недоливов. Своего кольца библиотека не -держит — данные пропихиваются прямо из наших EMM-страниц. - -## 4. Предлагаемая архитектура - -``` - эффекты (31 шт, 8 бит 11 кГц) музыка (23 шт, ноты) - │ │ - EMM-страницы (6,3) 7 КБ нот в банке - │ │ - cbl_push_otir из fill() запись 3 регистров AY - │ │ - CBL (10,9 кГц) ──────┐ ┌────────── AY (1,75 МГц) - ▼ ▼ - TDA1543 (аппаратное смешивание) -``` - -**Один источник прерываний — CBL.** Его callback приходит каждые 128 -сэмплов = **11,7 мс** при 10,9 кГц, и он же двигает секвенсор музыки. -Отдельный таймер (CTC) НЕ нужен: по таблице из §2.2 короче 12 мс всего -2 ноты из 1469 — они растянутся на один тик, чего не слышно. - -Почему это важно: `irq_ctc_install` сейчас требует кода в W2 (tiny/big), -а roomtest — huge, и попадёт ли туда CTC-трамплин, зависит от раскладки. -Обойтись без него — значит не открывать этот фронт вовсе. - -**Пейсинг кадра при этом не страдает.** Наш темп считается ПО ЛУЧУ -(`pop_pace.h`), а не по кадровым прерываниям, поэтому то, что CBL-ветка -трамплина делает приватный RETI и съедает кадровые прерывания, нам -безразлично. Если бы пейсинг остался на прерываниях — звук бы его сломал. - -## 5. Объём работ - -| фаза | что | оценка | -|---|---|---| -| **З1** | распаковщик `pop_pack_sound.py`: DAT → `.snd`-страницы EMM (эффекты) + `.not` (ноты музыки) | формат уже разобран | -| **З2** | `pop_sfx.c`: `cbl_open` + `fill()`, таблица «звук → страница/смещение/длина», `pop_sfx_play(id)` | ядро | -| **З3** | развесить вызовы: 66 мест `play_sound` в оригинале; у нас часть уже помечена TODO (`pop_ctrl.c:408`, `guards.c:992`, `pop_map.c:3035/3107`, …). **Плюс бесплатный кусок**: опкод `SEQ_SOUND` в seqtbl уже разбирается нашим `play_seq` (`pop_kid.c:326`) — шаги, приземления и прочее поедут сами | механическая | -| **З4** | `pop_music.c`: секвенсор нот на AY (путь A), тик из CBL-callback | небольшая | -| **З6** | заставки и титры — WAV-музыка потоком (эффекты в это время не звучат) | после З1-З4 | -| **З7** | музыка по ходу игры: WAV с гашением эффектов ЛИБО путь B — решать по итогам З6 | открыто | -| **З5** | приоритеты и вытеснение: у оригинала `play_sound` глушит предыдущий (`stop_sounds`), музыка и эффект — разные каналы | правила из seg009 | - -## 6. Что проверить артефактом ДО кодинга - -1. **Порты AY на Sprinter** — записать в 0xFFFD/0xBFFD и убедиться, что - MAME отдаёт звук (порты идут через DCP-таблицу, «стандартные ZX» — - это ожидание, а не факт). -2. **CBL в режиме huge.** Шапка `cbl.h` говорит «код/данные в W2 - (tiny/big)», но это скорее всего устаревшая оговорка: IM2-трамплин - давно переделан на all-modes, и наш кадровый путь в huge работает. - Проверить `cbl_open` из roomtest. -3. **Совместное владение портом 0xFE.** Бит 5 (луч) у нас держится через - `_cbl_port_ref` «немым» кодом частоты; когда откроется НАСТОЯЩИЙ CBL, - владение переходит к нему. Убедиться, что пейсинг переживает - `cbl_open`/`cbl_close`. -4. **Цена fill() в кадре.** 128 байт через `cbl_push_otir` раз в 11,7 мс - — замерить тем же способом, что и остальное (брейкпоинт + totalcycles). - -## 7. Про MIDI — почему не он - -Музыка в MIDISND — настоящие MThd/MTrk чанки, 27 КБ. Чтобы играть их на -AY, нужен разбор MIDI, раскладка каналов на три голоса и таблица -инструментов — это отдельный проект, и звучать он будет НЕ так, как -оригинал на PC. А набор PC-спикера — это ровно то, что слышал игрок на -IBM PC 1989 года: один квадратный голос. Он у нас есть целиком, весит -7 КБ и ложится на AY напрямую. - -Если позже захочется богаче — материал уже будет разобран, и можно -разложить те же мелодии на три канала AY (бас/мелодия/арпеджио), не трогая -ни данные, ни секвенсор. - ---- - -## 8. Разводка вызовов по коду (сделано 2026-08-20) - -Портированы ВСЕ места `play_sound()` SDLPoP, у которых есть оцифровка -(id 0..23, 44..49, 51 — остальные id это музыка, у них в -`pop_sound_tbl.h` длина 0, и вызов просто глушит текущий эффект). - -| id | что | где у нас | оригинал | -|----|-----|-----------|----------| -| 0 | разбился насмерть | `pop_map.c` land | seg005 | -| 1 | крик падения | `pop_map.c` do_fall | seg005:39 | -| 2 | плита рухнула | `pop_room.c` (обе ветки посадки) | seg007 | -| 3 | кнопка нажата | `pop_trob.c` | seg007 | -| 4/5/6/7 | ворота: закрываются / открываются / рухнули / стоп | `pop_trob.c` | seg007 | -| 8 | удар о стену | `pop_map.c` bumped_fall/bumped_floor + seqtbl | seg004/seg006 | -| 9 | зацеп за карниз | `pop_map.c` check_grab | seg006 | -| 10 | клинок о клинок | `roomtest.c` после `check_sword_hurt`, если один из бойцов в кадре 167 | seg000:1353 | -| 11 | свист клинка мимо | `guards.c` check_hurting | seg002:0DAE | -| 12/13 | ранен соперник / Кид | `guards.c` hurt_by_sword | seg002:0C1F | -| 13 | Кид ранен зельем | `pop_map.c` ветка «злого» зелья | seg006:1894 | -| 14/15 | дверь уровня: закрывается / едет | `pop_trob.c` | seg007 | -| 16 | средняя посадка; толчок о стража | `pop_map.c` land / bump_into_opponent | seg005/seg003:0654 | -| 17 | мягкая посадка | `pop_map.c` land | seg005 | -| 18 | пьёт | seqtbl (SEQ_SOUND) | seg006 | -| 19 | вынул меч | `pop_ctrl.c` | seg005:945 | -| 20/21/22 | дрожит плита | `pop_map.c` loose_shake | seg007:0E55 | -| 23 | шаг | seqtbl (SEQ_SOUND) | seg006 | -| 44 | скелет оживает | `guards.c` pop_check_skel | seg002:106D | -| 45 | прыжок в зеркало | `pop_map.c` jump_through_mirror | seg003:0617 | -| 46 | сожрал чомпер | `pop_map.c` | seg004 | -| 47 | чомпер щёлкнул | `pop_trob.c` (кадр 2) | seg007 | -| 48 | напоролся на пики | `pop_map.c` | seg005 | -| 49 | пики пошли | `pop_map.c` start_anim_spike | seg007:08F6 | - -Что осталось не разведено — только МУЗЫКА (24/28 смерть, 25 презентация, -26 объятия, -27/35/40 заставки, 29 встреча Джафара, 30/33 зелья, 32/41 конец уровня, -36 время вышло, 37 победа, 43 смерть Джафара, 50/52/53 сюжетные вставки) -и 51 (дверь принцессы, тоже из заставки). Их черёд — фаза «музыка». - -**Квирк, за которым следить.** Звук ворот у оригинала звучит не всегда, а -по условию видимости (`play_door_sound_if_visible`, seg007:1250): либо -ворота в комнате слева и стоят в 9-й колонке, либо ворота в НАРИСОВАННОЙ -комнате и колонка не 9-я. У нас это параметр `audible` у `animate_door`. - -**Тряска плиты — свой домен prandom.** Оригинал берёт номер сэмпла (20/21/22) -из общего генератора и вдобавок «сжигает» один бросок ради совместимости с -DOS-версией; у нас последовательности разведены по доменам -(`impl_diff.md`), поэтому у тряски свой сид, а холостой бросок не делаем — -на розыгрыши физики и кладки это не влияет. - -## 9. Цена звука в тактах (замер 2026-08-20, MAME) - -Вопрос был поставлен так: звук идёт по прерываниям, значит размазан по всем -фазам кадра — и если фазы укладываются, всё хорошо? Да, но проверять это -надо не по фазам, а по двум числам, потому что **нагрузка от звука -постоянная и от сцены не зависит вовсе**. - -### 9.1 Одно прерывание CBL - -Зонды: `bpset` на входе трамплина (`_irq_tramp`) и на `reti` ветки CBL, -разница `totalcycles`. 398 замеров в сцене 11/15. - -| величина | значение | -|---|---:| -| цена одного прерывания | **7 825 тактов ровно**, с разбросом до 8 299 (среднее 8 001) | -| период между прерываниями | 245 759 тактов (= 128 сэмплов на 10 937,5 Гц) | -| **доля процессорного времени** | **8 001 / 245 759 = 3,26 %** | - -Цена постоянная, потому что работа фиксированная: OTIR ровно 128 байт плюс -скобка сохранения контекста. Ветвлений по данным в насосе нет. - -### 9.2 Дрожание обслуживания — риск для ЗВУКА, не для кадра - -Период плавает 228 804 … 262 734, то есть прерывание опаздывает максимум на -**~17 000 тактов = 0,8 мс**. Это самая длинная DI-скобка в коде -(акселератор режется по 16 строк, memory `sprinter_wait_states_2x`). -Буфер CBL — 128 сэмплов = **11,7 мс**, запас **14×**. Недолива быть не -может; счётчик `cbl_underruns()` это подтверждает косвенно (наш `fill` -всегда возвращает 1, поэтому он ловит только отсутствие данных, не -опоздание). - -### 9.3 A/B в одном прогоне (Ctrl+S), сцена 11/15 - -Один и тот же кадр, звук выключается на ходу — сравнение чистое. - -| | работа min | работа max | работа avg | прерываний CBL на кадр | -|---|---:|---:|---:|---:| -| звук ВКЛ | 453 132 | 572 532 | **498 064** | 1,40 | -| звук ВЫКЛ | 444 348 | 559 434 | **487 372** | 0,00 | -| разница | +8 784 | +13 098 | **+10 692 (+2,2 %)** | | - -Разница на лёгком кадре (+8 784) — ровно одно прерывание, сходится с §9.1. -`CBL/кадр = 0` при выключенном звуке подтверждает, что Ctrl+S реально -ЗАКРЫВАЕТ CBL, а не глушит сэмпл: иначе насос продолжал бы отдавать блоки -тишины и платить те же 3,26 %. - -### 9.4 Укладываемся ли - -Логический кадр (`pop_pace.h`): NORMAL = 4 растра вне боя = **1 720 000 -тактов**, FASTEST = 3 растра = **1 290 000**. - -| | работа | доля NORMAL | доля FASTEST | -|---|---:|---:|---:| -| 11/15, обычная позиция | 498 064 | 29 % | 39 % | -| 11/15, тяжёлая позиция (Кид на 7 px правее) | 750 066 макс | 44 % | 58 % | - -Период кадра за все прогоны: 1 719 936 … 1 720 752 — ровно 4 растра, ни -одного проскока. **Звук занимает 1,1 % бюджета NORMAL и 1,5 % FASTEST.** - -### 9.5 Где 3,26 % МОГЛИ БЫ стоить дорого - -Ответ «всё размазано, если фазы влезли — ок» верен с одной оговоркой. -Пейсинг квантован растром: работа 1,00 растра и 1,02 растра дают РАЗНЫЙ -период кадра (3 против 4 интервалов), то есть скачок сразу на 20 мс. -Значит звук опасен ровно в одной ситуации — когда сцена стоит в пределах -~8 000 тактов НИЖЕ кратного растру порога. Сейчас ближайший запас — 540 000 -тактов до порога FASTEST, то есть в 60 раз больше цены звука. Проверять -эту оговорку заново стоит только если работа кадра подберётся к 430 000 или -860 000 вплотную. - -## 10. Мусор при включении и щелчок на выходе (разбор 2026-08-20) - -Жалоба: «при старте, когда разрешается звук, проходит кусок мусора». -Разобрано записью выхода MAME в WAV (`-wavwrite`) — по огибающей и -автокорреляции, а не на слух. - -### 10.1 На старте мусора НЕТ; это настоящие звуки - -От `cbl_open` до первого эффекта в записи **точная цифровая тишина** -(размах 1 при разрешении 16 бит). Дальше — два штатных звука: - -| что | когда | длительность | -|---|---|---| -| `gate_closing_fast` (6) — решётка в комнате СЛЕВА | +0,30 с после `cbl_open` | обрывается на 80 мс | -| `soft_land` (17) — Кид приземляется | +0,38 с | 383 мс | - -Опознаны корреляцией огибающих с оригинальными сэмплами `digisnd`: -звук 6 даёт +0,72 с начала записи, звук 17 — +0,32 со сдвигом 80 мс. -Приземление на старте КОРРЕКТНО: `start_pos` уровня 1 — тайл (0,0), а он -`space`, то есть Кид падает на ряд ниже, на площадку с факелами. - -Обрыв первого звука вторым — тоже поведение оригинала, а не наш дефект: -`play_digi_sound` (seg009.c:2402) начинается с `stop_digi()`, голос ОДИН. -Ощущение «мусора» даёт именно 80-мс огрызок скрежещущей решётки. - -Звук кнопки (3) при этом не слышен: `pop_sfx_play(3)` случается ДО -`cbl_open` и глохнет. С SDLPoP совпадает (там на старте тоже только -решётка), но держится это на порядке вызовов — если поднимать звук раньше -`pop_start_level`, щелчок кнопки станет слышен. - -### 10.2 Незалитый буфер CBL — дефект есть, но в MAME он немой - -Буфер CBL (256 слотов) железо не чистит ни сбросом, ни записью в порт -управления, а эта запись сразу пускает воспроизведение с нулевого слота. -Значит первые 256 сэмплов (23,4 мс) — то, что лежало раньше. Разбор по -`sprinter.cpp`: `case 0x89` делает `m_cbl_cnt = 0; m_cbl_wa = 0`, а -прерывание «долей половину» приходит только на 128-м слоте и ставит -указатель на ПРОТИВОПОЛОЖНУЮ половину — своими данными звук идёт лишь с -третьей половины. - -В MAME это не слышно: эмулируемый буфер стартует нулями, а ЦАП -двухдополнительный, то есть 0 = середина шкалы. На ЖЕЛЕЗЕ там -неинициализированное ОЗУ — ровно тот мусор, который ловился ещё на -тестовых примерах CBL. Лечение — `_cbl_prime` в `cbl_open`: сразу после -включения 256 записей байта тишины в порт данных (заранее нельзя, запись -проходит только при поднятом bit7). Стоит 6 400 тактов один раз за -открытие; за это время таймер уходит на два-три слота. - -### 10.3 Щелчок на выходе — ГОЛОДАНИЕ насоса, вылечено - -На выходе по ESC в записи было **ровно 11 мс шума на полной громкости** -(размах 33 671 — громче всего в прогоне), потом мгновенная тишина. 11 мс -= один блок CBL (128 сэмплов = 11,7 мс), то есть один пропущенный долив: -`pop_shutdown` звал `closegraph`/`pop_bg_free`/`pop_kid_free` (а это -ESTEX на каждый атлас) ПРИ ОТКРЫТОМ звуке, насос не успевал, и железо -доигрывало несвежую половину. - -Лечение: `pop_sfx_close()` первым действием `pop_shutdown`. Проверено -второй записью — всплеска на выходе больше нет. Механизм тот же, из-за -которого звук глушится на время загрузки уровня. - -## 11. Приоритеты и перебиваемость: звук у оригинала НЕ «всегда перебивать» - -Пользователь услышал расхождение: у нас решётка обрывалась приземлением -Кида, в SDLPoP — доигрывала до звонкого конца, а приземления не было -слышно вовсе. Разбор исходника показал, что мы упустили ЦЕЛЫЙ МЕХАНИЗМ. - -### 11.1 Модель оригинала - -``` -play_sound(id) seg000:12C5 — только НОМИНИРУЕТ кандидата на кадр: - if next < 0 || prio[id] <= prio[next]: next = id - -play_next_sound() seg000:1304 — раз в кадр решает, запускать ли: - if next >= 0: - if !играет_что_то || - (перебиваем[текущий] && prio[next] <= prio[текущий]): - текущий = next; запустить - next = -1 // НЕ запустили -> номинант ВЫБРОШЕН, очереди нет -``` - -Три следствия, каждое слышно: - -- **Неперебиваемый звук доигрывает целиком.** У `gate_closing_fast` (6) - `interruptible = 0`, поэтому приземление Кида (17) в этот момент - пропадает совсем — не откладывается, а именно теряется. -- **Внутри кадра выживает важнейший.** Меньше `prio` — важнее; при - равенстве побеждает ПОСЛЕДНИЙ (сравнение `<=`). -- **Два источника не «чередуются как получится».** Челюсти (47, prio - 0x10) всегда важнее решётки (4, prio 0x32): решётка не может перебить - укус, а укус решётку — может. Отсюда и картина на ур. 9 к. 9, где - решётка звучит только в паузах между укусами. - -### 11.2 Что сделано у нас - -`pop_sfx_play` теперь только номинирует; запуск — в `pop_sfx_tick`, -который зовётся раз в кадр в конце отрисовки (там же, где оригинал зовёт -`play_next_sound`, seg000:954). Таблицы `snd_prio` (57 байт) и битовая -карта `snd_intr` (8 байт) — в резиденте, значения из SDLPoP С УЧЁТОМ -`fix_sound_priorities()`: в `config.h` SDLPoP `FIX_SOUND_PRIORITIES` -определён безусловно, значит сравниваемся мы с исправленным вариантом -(звук 10 → 0x0D, 48 → 0x15, 49 перебиваем). - -Створка двери уровня (15) — единственная запись, которую оригинал правит -на ходу: перебиваема при закрытии, нет при открытии (seg007:442/464). -Держим отдельным байтом `pop_sfx_slide_intr`, чтобы таблица осталась в -ПЗУ. Там же добавлен пропущенный `stop_sounds()` на завершении открытия -двери (seg007:455) — без него неперебиваемый съезд (1,6 с) блокировал бы -очередь. - -Звуки без оцифровки (музыка, длина 0) не номинируются вовсе — порт -проверки `if (NULL == sound_pointers[id]) return;`. Раньше такой id -глушил живой эффект. - -### 11.3 Проверка - -Записью MAME, старт уровня 1: - -| | всплески | что это | -|---|---|---| -| до | 135 мс + 210 мс | решётка, обрезанная приземлением на 80 мс | -| после | **один, 455 мс** | решётка целиком, корреляция огибающей со звуком 6 **+0,889** | - -Цена: резидент +~250 Б (таблицы + логика), куча ужалась с 347 до 134 Б — -довод в пользу давно назревшей реорганизации базовой памяти. - -## 12. Ворота: гейт слышимости и «решётка встала» (2026-08-20) - -Проверка на сцене, которую предложил пользователь — уровень 9, комната 9: -кнопка (1,8), челюсти (1,2), а ворота **в комнате 4, тайл (1,9)**, то есть -в комнате СЛЕВА. Нашлись три расхождения сразу. - -### 12.1 Гейт слышимости был неверный - -У нас стояло `audible = (room == cur_room)`. У оригинала -(`play_door_sound_if_visible`, seg007:1239) правило другое: - -- ворота в комнате СЛЕВА и в колонке 9 — СЛЫШНЫ (створка видна в шве); -- ворота в отрисованной комнате и НЕ в колонке 9 — слышны; -- особый случай: уровень 3, комната 2 — слышны всегда. - -Сцена 9/9 попадает ровно в первый пункт, поэтому спуск решётки у нас -молчал. Подъём при этом совпадал с оригиналом — потому что звук открытия -(5) идёт БЕЗ гейта (seg007:386, прямой `play_sound`). Эта асимметрия и была -подсказкой. - -Взят вариант под `FIX_GATE_SOUNDS` (условия через ИЛИ): в config.h SDLPoP -он определён безусловно. - -### 12.2 Потерян звук «решётка встала» (7) - -`gate_stop()` (seg007:05E3) зовётся из ТРЁХ мест `animate_door` и каждый раз -играет звук 7 через гейт слышимости: конец закрытия, открытие насовсем и -ветка «уже 0xFF». У нас во всех трёх стояло только `*type = -1` без звука. -Добавлено. Лязг после ОБЫЧНОГО открытия (seg007:395) остаётся без гейта — -там оригинал зовёт `play_sound` напрямую. - -### 12.3 Кнопка: у оригинала есть параметр playsound - -`trigger_button(playsound, ...)` — в трёх местах он нулевой: вход на уровень -(seg003:170), выход Джаффара (seg002:520) и зелье «открыть» (seg006:1890, у -нас не портировано). Мы играли щелчок всегда. Добавлен параметр `snd`. - -### 12.4 Почему щелчок кнопки слышно через раз — это НЕ баг - -Бюджет сцены 9/9 (длительности после пересчёта на 10 937,5 Гц): - -| звук | длительность | prio | -|---|---:|---:| -| челюсти (47) | 465 мс | 0x10 | -| решётка вниз (4) | 97 мс | 0x32 | -| решётка вверх (5) | 123 мс | 0x37 | -| решётка встала (7) | 75 мс | 0x30 | -| кнопка (3) | 106 мс | 0x66 | - -Цикл челюстей — 15 кадров = 1229 мс (замерено брейкпоинтом на номинации: -25 805 000 тактов между укусами). Значит укус занимает 465 мс, пауза 764 мс. -Кнопка (prio 0x66) перебить челюсти не может (0x66 > 0x10), поэтому слышна -только если нажатие попало в паузу — примерно в 6 случаях из 10. -Подтверждено пользователем на живой сцене. - -### 12.5 Грабли сцены - -Если игра стартует ПРЯМО в комнате с челюстями, они не заводятся сами: -нужно сходить Кидом на левую кнопку и вернуться. Это поведение оригинала -(trob челюстей создаётся событием), а не наш дефект — учитывать при -постановке автотестов. - -## 13. Повторный аудит игрового звука (2026-08-24) - -Проверены три независимых слоя: содержимое атласов, места вызова и живой -тракт `play -> tick -> CBL`. - -- В восьми `SND*.ATL` есть все 31 оцифрованных ресурса: `0..23`, `44..49` - и `51`; ненулевая страница/длина есть у каждой записи таблицы. -- Для всех 30 PCM-эффектов, которые могут возникать непосредственно в игре, - есть место вызова. Последним пропуском был звук 10 при столкновении - клинков; условие перенесено буквально из `check_sword_vs_sword` SDLPoP. - Звук 51 относится к сцене с принцессой, а не к игровому циклу. -- Звук 19 «Кид достал меч» проверен в MAME брейкпоинтами. В момент вызова - предыдущий PCM уже закончился (`sfx_left=0`), номинация дошла до - `pop_sfx_tick`, после чего курсор получил id 19, страницу 5, смещение - `0x1500` и длину 2816 байт. В этом прогоне его не подавляли решётка, - плиты, шаги или приоритеты. Если он всё ещё субъективно не слышен, искать - надо после выбора эффекта — в непрерывности CBL/громкости самого сэмпла. -- После продолжительного прогона title/intro/demo/menu CBL обслужил 3303 - блока и сообщил 0 программных недоливов (`cbl_requests=0x0CE7`, - `cbl_underruns=0`). Это исключает возврат `fill=0`, но само по себе не - измеряет запоздание прерывания внутри слишком длинной секции `DI`. -- Регрессия full-game на входе в Level 1 оказалась именно запозданием CBL: - `pop_level_switch` открывал его ДО блокирующего BIOS fade-in. Demo был - чистым, потому что включал палитру без fade. Теперь загрузчик оставляет - CBL закрытым, а caller открывает его после окончательной палитры/QuickLoad; - скрежет на Level 1 исчез в MAME. Однократный щелчок самого первого - `cbl_open` за всю MAME-сессию остаётся отдельной низкоприоритетной задачей. -- Открытие pause menu у SDLPoP беззвучно; движение играет 21, вход/выход - из подменю — 22, изменение настройки — 10. Эти вызовы перенесены. На - время полного копирования страницы и файловых операций CBL закрывается, - после flip открывается снова: аппаратная половина не должна повторять - старые данные и давать «скрежет». - -Отдельно остаётся игровая музыка и сигнальные мелодии без PCM: смерть -(`24/28`), начало/появление Shadow (`25`), встреча Jaffar (`29`), большое -и малое зелья (`30/33`), Shadow (`32`), победа/меч (`37`), перо (`39`), -конец уровня (`41`) и победа над Jaffar (`43`). Вызовы и AY-проигрыватель -для них ещё не реализованы; наличие всех PCM-эффектов эту задачу не закрывает. - - -## 4. МУЗЫКА: решение пересмотрено (2026-08-25) — путь C вместо A - -В §1б первым заходом был выбран **путь A** (ноты PC-спикера на AY), а путь -C (запись -> WAV -> CBL) стоил дорого из-за строки «нужен синтезатор на -хосте». Это обстоятельство отпало: у пользователя есть **готовые записи -DOS-версии** — `applications/PoP/PoP1_DOS_music` (flac/mp3/ogg/ogg_MT-32, -22 трека). Синтезировать нечего, остаётся `ffmpeg -ac 1 -ar 10937 -f u8`. - -### Что померено по этим записям - -| группа | длительность | PCM 10 937,5 Гц | -|---|---:|---:| -| всё вместе (22 трека) | 339 с | **3 625 КБ = 227 EMM-страниц** | -| игровые джинглы (10) | 57 с | 608 КБ | -| заставки и титры | 282 с | 3 017 КБ | -| финальный `won` один | 115 с | 1 233 КБ | - -Свободной EMM на старте ~3 440 КБ, так что вся музыка разом в память не -влезает и не должна: трек грузится под сцену и освобождается после. - -### Что сделано - -`toolchain/pop_pack_music.py` -> один файл `MUS\m.bin` на трек -(читается порциями по 16 КБ из одного открытого fd) + каталог -`pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**, -а не байтами: 169 КБ в uint16 не влезает, 1350 блоков — легко. - -`pop_music.c` (банк 9) грузит трек в EMM и ставит курсор; насос -`pop_sfx_fill` (резидент) получил **третий источник**: эффект важнее -музыки, музыка важнее тишины. Эффект музыку не сбрасывает — её курсор -стоит, пока эффект доигрывает, и она продолжается с места. - -Проверено в MAME записью звука: трек `story_1_absence` на первом экране -истории, корреляция огибающих с эталоном **0,836**, RMS 22,6 против 18,3 -(разница — 8-битное квантование). Эффекты двери в PV-сцене после него -звучат как прежде, то есть освобождение страниц и возврат к набору -эффектов работают. - -### Цена и что осталось - -* CBL один: пока играет музыка, эффектов нет. Для заставок это не важно - (их там не бывает), для игровых джинглов — открытый вопрос §1б.4. -* Резидент вырос на 83 байта (третий источник в насосе) плюс 25 байт - данных под курсор и таблицу страниц; запас W2 — 151 байт. Кучи в - приложении нет (`malloc` не слинкован), так что это чистый запас роста. -* Банк 9 занят на 88 %. Следующий модуль туда уже не влезет — либо - переносить, либо заводить банк 12. -* `won` (77 страниц) в POP_MUS_PAGES=20 не помещается: финал придётся либо - резать, либо стримить кусками по ходу. - - -## 5. СКРЕЖЕТ ПРИ BIOS-ВЫЗОВАХ: причина и решение (2026-08-25) - -Симптом: во время затемнения (fade) звук хрипел — одинаково с играющей -музыкой и в тишине. Пользователь заметил ключевое: **повтор тишины обязан -звучать тишиной**, значит дело не в недоливе буфера. - -### Как искали - -Отладочные клавиши, каждая делает ровно один кусок fade: - -| клавиша | что делала | результат | -|---|---|---| -| H | только ожидание 8 кадров | чисто | -| V | только чтение палитры | скрежет | -| G | затемнение целиком | скрежет | -| J | только запись палитры | скрежет | -| L | 512 раз `bios_get_place()` — видео не трогает | **скрежет** | - -`L` и решил вопрос: виновата не палитра, а **любой вызов BIOS**. - -### Причина - -Вход в BIOS — это `rst 8`, то есть `out ($7C),a`. В драйвере MAME он -правит `m_rom_sys` и вызывает `update_memory()`, которая перестраивает -**окно 0**: `m_pages[0]` + `m_bank_view0.select(1)`. ПЗУ ложится ПОВЕРХ -страничного регистра. - -Насос CBL брал окно взаймы именно у W0 (`_io_page_w0 = phys` + `OTIR` по -адресу < 0x4000). Пока BIOS работает, запись в порт `0x82` ничего не -меняет, и `OTIR` вычитывает ПЗУ, отдавая его в звук. - -Побочно выяснилось, почему `DI` вокруг BIOS помогал лишь иногда: он не -даёт войти в ISR (тогда блок просто пропускается, что неслышно), но в -обработчиках BIOS есть `EI`, так что защита негарантированная. - -### Решение - -Насос переведён на **W3** (идея пользователя): это окно управляется только -портом `0xE2`, подмену из прерывания никто не перекрывает, а BIOS во время -нашего ISR не исполняется — окно возвращается до выхода. - -```c -saved = _io_page_w3; -_io_page_w3 = phys; -cbl_push_otir((const void *)(0xC000u + ptr), n); -_io_page_w3 = saved; -``` - -После этого BIOS безопасен везде: и палитра, и любые другие функции. -Временный обход палитры мимо BIOS (`gfx_pal_write`) стал не нужен — он -остался в libbgi как более быстрый примитив (2,5 тыс. тактов на 64 цвета -против 10,8 тыс. у BIOS), но игра его не зовёт. - -Бонус: в W3 нет стаба восстановления окна, который в W0 занимал начало -страницы, — звуковые страницы можно использовать целиком. - -## 6. ВСЯ ЗАСТАВКА ОЗВУЧЕНА (2026-08-25) - -К `story_1_absence` добавлены остальные четыре трека заставки: -**54** intro_theme (титры), **50** story_2_princess, **53** -story_3_Jaffar_enters, **52** story_4_Jaffar_leaves (сцена с принцессой). -`MUS_IDS` в Makefile — 50 52 53 54 55, всего 1056 КБ на образе. - -### Два слота вместо одного - -Реплики оригинала идут ВСТЫК: следующая начинается там, где кончилась -предыдущая, паузы под загрузку нет. Поэтому `pop_music` держит два слота -EMM: `pop_music_load*` всегда пишет в НЕ играющий, `pop_music_play` -подменяет резидентную таблицу страниц и отпускает прошлый слот. Своей -копии таблицы слот не хранит — её и так держит блок EMM, `mem_get_page` -отдаёт номер по индексу (иначе −40 байт W2 у игры, а там их нет). - -Плюс **постраничная загрузка**: `pop_music_load_begin` / `_load_step` -читают по одной странице за вызов. Страница стоит 33 мс — четверть -логического кадра заставки (133 мс), поэтому подкачка следующей реплики -прямо посреди анимации не видна. Кто может позволить себе паузу (титры, -чёрный экран между сценами) — зовёт прежний `pop_music_load`. - -### Тайминги приведены к шкале оригинала - -Все длительности сцен взяты из SDLPoP в его тиках (60 Гц), а ждём мы -кадрами луча (~50 Гц). Пока сцены были немыми, разбег в 20 % не был -виден; с музыкой он слышен сразу — реплика кончается раньше картинки. -Введён `POP_T60(t)` (pop_cutscene.h), и на него переведены титры, -`intro_before_pv`, хвост после PV и пейсинг самой PV-сцены (счётчик -потраченных кадров луча против `POP_T60(tick)`, вместо прежних жёстких -четырёх кадров на логический). - -**Паузы-реплики.** Там, где оригинал ждёт конца сэмпла, у нас теперь -стоит реальная длина нашей записи: m50 — 831 тик, m53 — 985. Отсюда -новая шкала PV: конец m50 на 846, вход Джафара (m53) на 1046, уход -(m52) на 2073, конец сцены 2500 тиков (было 1959). - -**Fade перед PV** (вопрос пользователя: наш fade короче, 4 ступени против -64). Совпасть должен момент полной темноты, считая от пуска m55: -у SDLPoP это 80 (transition) + 600 (wait) + 128 (fade_out_2: 0x40 шагов -по 2 тика); у нас переход занимает 80 кадров луча = 96 тиков, а fade — -5 тиков. Отсюда `WAIT = 80 + 600 + 128 − 96 − 5 = 707` тиков. Дальше и -там и там экран уже чёрный, а трек доигрывает: этой паузой заставка и -стыкуется с PV. - -**Музыка переживает смену сцен.** m54 звучит с титров и до первого -экрана истории (`pop_intro_show` больше не глушит CBL на входе), m52 -начинается в PV и доигрывает уже на экране «свадьбы» — как seg000:2051. - -Проверено в MAME: цепочка 54 → 55 → 50 → 53 → 52 отыгрывается целиком, -курсор `pop_mus_id` меняется ровно на своих кадрах, интро доходит до -демо-режима. Слуховая проверка (нет ли хрипа от диска при играющей -музыке) — за пользователем. - -## 7. МУЗЫКА ПО ХОДУ ИГРЫ (2026-08-26) - -Звуки 24..43 в наборе оцифровки ПУСТЫЕ — в оригинале это Adlib-музыка, и -в digisnd её нет вовсе. На этом и построено подключение: `pop_sfx_play` -для звука с нулевой длиной не пытается его играть, а кладёт НОМЕР в -`pop_mus_req` (один байт). Заявку разбирает `pop_music_service()` — один -вызов на кадр из любого цикла (игрового, интро, катсцены); всё чтение с -диска живёт там. - -**Стриминг вместо загрузки.** Ждать полной загрузки джингла нельзя — это -фриз на треть секунды посреди игры. `pop_music_stream` читает ПЕРВУЮ -страницу (33 мс) и сразу пускает трек: она звучит 1,5 с, а следующая -читается те же 33 мс — запас сорокакратный. Остальные доливаются по -одной за кадр, пока `pop_music_loading()`. Номера страниц известны сразу -после `mem_alloc_pages`, поэтому таблица для насоса заполняется целиком — -данные появятся раньше, чем насос до них дойдёт. - -**Что и где играет** (номера и места — из SDLPoP): - -| трек | событие | место у нас | -|------|---------|-------------| -| 24 / 28 / 32 | смерть: обычная / в бою / от руки тени | `ctrl_kid_death` | -| 25 | вступление 1-го уровня (Кид сидит), тень 6-го | `control_crouched`, `guards.c` | -| — | НА ДЕМО-УРОВНЕ музыки нет вовсе: там одни эффекты | гейт в `pop_music_service` | -| 27 / 35 / 40 | сцены перед 2/4/6/12, 8/9, «времени мало» | `pop_pre_cutscene_show` | -| 29 | встреча с Джафаром | `pop_meet_jaffar` | -| 30 / 33 | большая склянка / малая | `pop_proc_get_object` | -| 36 | время вышло | `pop_time_expired_show` | -| 37 / 43 | меч найден, страж убит / смерть Джафара | `pop_proc_get_object`, `on_guard_killed` | -| 39 | перо (медленное падение) | `pop_proc_get_object` | -| 41 / 32 | конец уровня / конец 4-го (тень) | опкод SND_LEVEL в `play_seq` | -| 26 | встреча с принцессой | `cut_ending` | - -**Вступление первого уровня — автомат, а не «звук при приседе»** (seg005:02EB). -Пока `need_level1_music` не ноль, `control_crouched` НЕ ЧИТАЕТ управление: -Кид сидит, тема играет, и лишь когда она смолкла, он может встать. Наша -первая версия просто играла трек при первом приседе — и тема догоняла -игрока посреди уровня (пробежал, спрыгнул, присел — заиграла). Признак -«ещё звучит» берём у курсора насоса `pop_mus_left`: он резидентный, и если -музыка выключена, курсор остаётся нулём — Кид просто встаёт. - -Темы, которые звучат один раз за заход на уровень (вступление 1-го, тень -6-го), сбрасывает `pop_music_level_start()` из `pop_start_level`. Оригинал -для этого портит переменную двери (`leveldoor_open = 0x4D`) — у нас на это -есть свои два байта. - -**ГДЕ КОНЧАЕТСЯ МУЗЫКА СЦЕНЫ** (уточнено 2026-08-26). Сначала мы отдали -трек «доигрывать в игре»: у оригинала load_intro после сцены просто гасит -экран и возвращает управление. На слух оказалось хуже, чем в оригинале — -музыка спотыкается: загрузка уровня (ESTEX плюс сборка комнаты) не даёт -насосу долить блок вовремя. У DOS-версии этой проблемы нет, там звук -живёт своей жизнью на аппаратуре. - -Поэтому дослушиваем ПОД ЧЁРНЫМ ЭКРАНОМ, до отрисовки уровня: следующий -load_intro у оригинала и так начинается с ожидания тишины (seg001:681), то -есть к новому уровню трек в любом случае смолкает. Пропуск сцены обрывает -и музыку — игрок нажал клавишу, чтобы идти дальше. - -**ДЛИТЕЛЬНОСТЬ FADE.** fade_in_1/fade_out_1 — это 64 шага палитры по два -тика, 128 тиков = 2,13 с; сцена перед уровнем 2 занимает с ними около семи -секунд. Наши четыре ступени укладывались в восемь сотых секунды, и сцена -выходила втрое короче. Теперь `INTRO_FADE = POP_T60(128)`, а ступеней в -`pop_ui_palette_dim` тридцать две вместо четырёх: на четырёх растянутых -ступенях затемнение выглядело бы скачками. Половина от оригинальных 64 — -на глаз от них не отличается (ступень каждые 66 мс), а вот шестнадцать уже -видно. Сумма «fade in + сцена + fade out» при этом совпадает с оригиналом -сама собой: длительность каждого fade та же, что у fade_*_1. - -**Цена ступени** (замеры в MAME 2026-08-26, такты 21 МГц; кадр 430 000): - -| версия | такты | что изменилось | -|--------|-------|----------------| -| исходная | 2 440 000 | снимок копировался побайтовым циклом на C | -| + таблица яркости на стеке | 1 250 000 | 768 умножений uint16 заменены 256 сложениями | -| + memcpy для снимка | 487 000 | LDIR вместо цикла — главный выигрыш | - -Из оставшихся 487 тысяч 136 тысяч — заливка палитры через BIOS (8 вызовов -`gfx_pal_load` по 17 000). Дальше можно было бы хранить готовые таблицы -яркости файлом, но при 1,2 мс на построение это уже незаметно. - -ВАЖНО: ступень пересчитывается только когда она СМЕНИЛАСЬ. Наивный цикл -«ступень на каждый кадр» звал пересчёт сто раз и растягивал fade до -десяти с лишним секунд. - -## 8. ПОТОКОВЫЙ ТРЕК: ФИНАЛЬНАЯ ТЕМА (2026-08-26) - -`won` (56) — 115 с, 1,2 МБ, 78 страниц EMM. В память он не влезает ни при -каком бюджете, поэтому играется КОЛЬЦОМ из шести страниц (96 КБ = 9 с): насос -идёт по кругу, а `pop_music_service` дочитывает файл в те страницы, которые -насос уже прошёл. - -**Кто кого догоняет.** Страница звучит 1,5 с, а читается 33 мс — запас -сорокакратный. Дистанция считается без отдельных счётчиков: страница ровно -128 блоков насоса, поэтому проигранных страниц = (всего блоков − осталось) -/ 128. Пока прочитано меньше, чем проиграно плюс размер кольца, в кольце -есть свободный слот. Файл читается ПОСЛЕДОВАТЕЛЬНО, без `lseek`. - -**Что пришлось учесть.** - -* Насос заворачивает страницу только при `pop_mus_ring != 0`; конец трека - по-прежнему определяет `left`. Обычный трек этой ветки не касается. -* Кольцо обязано сниматься при любом обычном запуске (`pop_music_play`, - `_stream`, `_load_begin`): иначе следующий трек играет по кругу первых - шести страниц — поймано на титрах сразу после победы. -* Живые сцены комнаты принцессы открывают CBL сами (`cut_begin`): - `pop_ending_show` глушит звук первым действием, и «arrived to princess» - (26) не звучал вовсе. -* Тема дослушивается до конца (прерывается клавишей), как `while - (check_sound_playing() && !key_test_quit())` в seg001:637. У оригинала - между титрами и этим ожиданием стоит ввод имени в таблицу рекордов — - когда он появится у нас, ожидание переедет за него (задача HOF-ENTRY). - -Проверено в MAME на сборке `LEVEL=14`: после встречи с принцессой звучит -тема победы (`pop_mus_id` = 56, `pop_mus_ring` = 6), курсор уходит далеко -за размер кольца — то есть подкачка успевает. diff --git a/applications/PoP/docs/status_line_text.md b/applications/PoP/docs/status_line_text.md deleted file mode 100644 index 75cd199..0000000 --- a/applications/PoP/docs/status_line_text.md +++ /dev/null @@ -1,218 +0,0 @@ -# Текст в нижней статус-строке (строке HP) — полная инвентаризация SDLPoP - -Разбор `SDLPoP/src/` на 2026-08-25. Цель — знать ВЕСЬ набор сообщений, -которые оригинал печатает в ту же полосу, где нарисованы деления HP, -и правила их появления/исчезновения. Это входные данные для порта: -у нас пока туда пишется только `GAME PAUSED`. - ---- - -## 1. Геометрия: одна полоса на HP и на текст - -``` -rect_bottom_text = { top 193, left 70, bottom 202, right 250 } // data.h:217 -display_text_bottom: draw_rect(чёрным) + show_text(halign_center, valign_bottom) -``` - -* Деления HP **Кида** — от `x = 0` вправо, шаг 7, максимум 10 → занимают `x 0..69`. -* Деления HP **стража** — от `x = 314` влево, шаг 7, максимум 10 → занимают `x 245..320`. -* Текст живёт РОВНО в промежутке `x 70..250` и по X с делениями не пересекается. -* По Y деления на `y = 194..200`, текст (`valign_bottom` к 202) — на `y = 195..201`, - то есть на строку ниже. Именно поэтому в оригинале текст выглядит «сидящим» - чуть ниже стрелок HP. - -**У нас**: `POP_HP_Y = 194` (`pop_cdraw.h`), экран сдвинут на `POP_YOFF = 28`, -базовая линия крупного шрифта `POP_YOFF + POP_HP_Y + 8 = 230` — силуэт -ложится на `223..229`, то есть та же картинка. - -## 2. Два примитива и два таймера - -| Имя | Что делает | -|-----|------------| -| `display_text_bottom(text)` (seg008:2644) | стереть прямоугольник цветом 0 и напечатать текст по центру | -| `erase_bottom_text(arg)` (seg008:266D) | стереть прямоугольник; при `arg != 0` ещё и обнулить оба таймера | -| `text_time_remaining` | сколько игровых тиков сообщение ещё висит; 0 — ничего не висит | -| `text_time_total` | **идентификатор сообщения**, а не только его длительность | - -Обработка тика — в `draw_game_frame`/`idle` (seg000:956). Комментарий в -оригинале прямой: *«Note: texts are identified by their total time!»* Значения -`text_time_total`, у которых есть особое поведение: - -| `total` | Смысл | Что происходит по истечении | -|---------|-------|------------------------------| -| 12 | «1 SECOND LEFT» | обычное стирание | -| 24 | обычное короткое сообщение | обычное стирание | -| 36 | смерть на демо-уровне (0) или на уровне зелий (15) — **текста нет** | `start_game()` — рестарт игры | -| 288 | «Press Button to Continue» | `start_game()` — рестарт игры | -| 1188 | защита от копирования (уровень 15) | **не убывает и не исчезает** | - -Мигание: при `total == 288` и `remaining < 72` сообщение мигает с периодом 12 -тиков — 4 тика видно (`blink_frame <= 3`), 8 нет; в кадре `blink_frame == 3` -заново печатается текст и играет звук 38 (`sound_38_blink`). - -Сброс: `init_game()` (seg003:32) обнуляет оба таймера и `is_show_time` — то есть -любое сообщение умирает на старте уровня. - ---- - -## 3. Полный список сообщений - -### 3.1. Состояние программы - -| Текст | Где | Таймер | -|-------|-----|--------| -| `GAME PAUSED` | seg000:1769, пока `is_paused` | **без таймера**: печатается на входе в паузу, `erase_bottom_text(1)` на выходе (seg000:1784) | - -### 3.2. Уровень и оставшееся время (`show_level` / `show_time`, seg008) - -| Текст | Условие | `total` | -|-------|---------|---------| -| `LEVEL %d` | `show_level()` при старте уровня; только `1..12` (`hide_level_number_from_level = 14`), не при `seamless`; уровень 13 показывается как **12** (`level_13_level_number`) | 24, дальше сразу `is_show_time = 1` | -| `%d MINUTES LEFT` | каждая минута, кратная 5, и каждая из последних 5 | 24 | -| `%d SECONDS LEFT` | последняя минута, раз в 12 тиков | 24 | -| `1 SECOND LEFT` | остался 1 с | **12** | -| `TIME HAS EXPIRED!` | `rem_min == 0` | 24 | -| `%d MINUTES PASSED` / `1 MINUTE PASSED` | только SDLPoP (`ALLOW_INFINITE_TIME`), при отрицательном таймере | 24 | - -Что взводит `is_show_time` (все → следующий кадр печатает время): - -* **Space** — seg000:612, штатная клавиша оригинала «сколько осталось»; -* читы **`-`/`+` numpad** (изменение времени) — seg000:762 / 777, при этом - таймеры сообщения обнуляются, чтобы новое напечаталось немедленно; -* **смерть Джафара** — `on_guard_killed()` seg006:1936, уровень 13 - (`jaffar_victory_level`): вспышка + показать время; -* истечение очередной минуты — seg008:1796; -* сразу после `show_level()`. - -Обнуляет `is_show_time`: `play_kid()` при смерти (seg006:1365) и -`show_copyprot(1)` (seg000:2385). - -### 3.3. Смерть Кида - -| Текст | Где | `total` | -|-------|-----|---------| -| `Press Button to Continue` | `play_kid()` seg006:1383 — умер на обычном уровне | **288** (мигает, затем рестарт игры) | -| *(без текста)* | тот же код, но уровень 0 (демо) или 15 (зелья) | **36** (тихая пауза, затем рестарт игры) | - -Стирается: `fell_out()` (seg006:1342, упал из комнаты 0) и чит **R** -(воскрешение, seg000:783) — оба зовут `erase_bottom_text(1)`. - -### 3.4. Сохранение и загрузка - -| Текст | Клавиша | `total` | -|-------|---------|---------| -| `GAME SAVED` / `UNABLE TO SAVE GAME` | Ctrl+G (`save_game`, seg000:2211) | `total` не ставится, `remaining = 24` | -| `QUICKSAVE` / `NO QUICKSAVE` | F6 (расширение SDLPoP, seg000:497) | 24 | -| `QUICKLOAD` / `NO QUICKLOAD` | F9 (расширение SDLPoP, seg000:514) | 24 | - -### 3.5. Ответы на клавиши (`answer_text` → `need_show_text`, все `total = 24`) - -| Текст | Клавиша | -|-------|---------| -| `SOUND ON` / `SOUND OFF` | Ctrl+S | -| `KEYBOARD MODE` | Ctrl+K | -| `JOYSTICK MODE` / `JOYSTICK NOT FOUND` / `JOYSTICK UNAVAILABLE` | Ctrl+J | -| `PRINCE OF PERSIA V1.0` (в SDLPoP заменено на `SDLPoP v%s`) | Ctrl+V | -| `SDL COMP v… LINK v…` | Ctrl+C — только SDLPoP | - -### 3.6. Отладочные читы (`cheats_enabled`, `total = 24`) - -| Текст | Клавиша | Смысл | -|-------|---------|-------| -| `S%d L%d R%d A%d B%d` | `C` | номер отрисованной комнаты и её соседей L/R/A/B | -| `AL%d AR%d BL%d BR%d` | Shift+`C` | диагональные соседи | - -### 3.7. Защита от копирования (только уровень 15) - -| Текст | Где | `total` | -|-------|-----|---------| -| `WORD %d LINE %d PAGE %d` | `show_copyprot(1)` seg000:2389 | **1188** — висит, пока не сменится уровень | - -### 3.8. Только SDLPoP, в оригинале 1989 отсутствует - -| Текст | Где | -|-------|-----| -| `RECORDING`, `REPLAY SAVED`, `REPLAY CANCELED` | replay.c:599/626/628 | -| имя файла скриншота | screenshot.c:62 | - ---- - -## 4. Что из этого касается нашего порта - -Реализовано (`pop_status.c`, таймер 24 тика как у оригинала): - -* `GAME PAUSED` — без таймера, рисует само меню (`pop_menu.c`); -* `QUICKSAVE` / `NO QUICKSAVE`, `QUICKLOAD` / `NO QUICKLOAD` — заявка стоит - в `pop_qsave_process`, то есть в единственном месте, где известно, что - именно делали. Лейбл печатается ДО дисковой операции — осознанное - расхождение, см. `impl_diff.md`; -* `SOUND ON` / `SOUND OFF` — Ctrl+S; -* `LEVEL %d` — порт `show_level()` целиком: демо-уровень 0 и номера от 14 - молчат, тринадцатый показывается двенадцатым, бесшовный переход 12→13 - пропускается и гасит флаг за собой. - -* вся группа времени — `N MINUTES LEFT`, `N SECONDS LEFT`, `1 SECOND LEFT`, - `TIME HAS EXPIRED!`. Флаг `pop_show_time` (порт `is_show_time`) взводит - само ядро таймера на круглых пятёрках и каждую секунду последней минуты, - а также старт уровня и читы времени; значение 2 означает «перебить - текущую строку», как оригинал делает в последнюю минуту; -* `Press Button to Continue` — висит бессрочно (`MSG_HOLD`), уровень - перезапускает кнопка. Расхождение с оригиналом, см. `impl_diff.md`. - -Пока НЕ печатается: - -* номера комнат (`C`/Shift+`C`) — у нас отдельная отладочная строка; -* copy protection и SDLPoP-расширения (replay, скриншоты) — не нужны. - -Отладочная строка вдобавок показывает оставшееся время `##:##` у правого -края. На табло уходит `minutes-1`: у оригинала `rem_min` — это НОМЕР идущей -минуты, а не остаток целых (старт 60 при `rem_tick` 719 = «почти 60:00»). -Секунды считаются делением раз в 12 кадров, а не каждый кадр. - -Нам не нужно: copy protection (уровень 15 исключён из порта — см. -`full_game_plan.md`), joystick-режимы, replay, скриншоты. - -Механика, которую придётся портировать целиком, если брать группу времени: -пара таймеров `text_time_total`/`text_time_remaining` с семантикой -«идентификатор сообщения» — иначе не воспроизвести ни мигание, ни рестарт по -истечении 36/288. - ---- - -## 5. Цена вывода и что делать, если упрёмся - -Блит одного глифа стоит ~4,6 тыс. тактов почти независимо от размера — это -цена вызова, а не пикселей (memory `blit_cost_model`). Полсотни символов = -полкадра. Что уже сделано в `pop_status.c` / `pop_ui.c`: - -* **change-driven**: пока показанное не изменилось, не рисуем вовсе; -* **по полям**: смена комнаты — две цифры (~9 тыс. тактов, 2% кадра), а не - вся строка; подписи рисуются только при полной инвалидации; -* **пробелы не блитятся**: их глиф целиком прозрачен, а стоит как буква — - на полной отладочной строке это девять сэкономленных блитов; -* **заливка только поля** при входе в комнату (`pop_screen_fill_field`): - борта от комнаты к комнате не меняются, это и четверть заливки, и то, что - обе полосы вход переживают. - -Запас, если бюджета всё же не хватит (идеи пользователя, 2026-08-25): - -1. **Растянуть вывод на несколько кадров, не показывая полуготовую строку.** - Печатать по нескольку букв за кадр, держа цвет шрифта чёрным (отдельный - индекс палитры), а по готовности подменить этот индекс на белый — строка - появится целиком и мгновенно. Стоит ноль байт памяти и укладывается в - нашу же технику «два разных чёрных» (`POP_COL_OUTSIDE`). -2. **Собирать строку в один спрайт** в свободном хвосте страницы шрифта и - блитить одним вызовом. Дороже по подготовке (~35 тыс. тактов на - копирование), но выгодно там, где строка ЦЕЛИКОМ меняется каждый раз. - Для меню этот путь уже рассматривался и был отвергнут; для статус-строк - он имеет смысл только вместе с п.1. - -Про QuickSave/QuickLoad оптимизация не нужна вовсе: там игра и так стоит на -время дисковой операции. - -## 6. Ловушка: свисающие глифы - -Зона стирания текста обязана захватывать строку НИЖЕ базовой линии. В малом -шрифте `'p'` имеет высоту 7 при ascent 5, `','` — 6: они свисают под базовую -линию. Стирание ровно до неё оставляло от хвоста «p» в «Speed:» одинокую -точку (поймано в MAME 2026-08-25). diff --git a/applications/PoP/poc/Makefile b/applications/PoP/poc/Makefile deleted file mode 100644 index 5a3a809..0000000 --- a/applications/PoP/poc/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -# PoC порта Prince of Persia (applications/PoP/docs/PORT_PLAN.md §5). -# --memory huge, БЕЗ --bank. -# -# ПОЧЕМУ huge, а НЕ small (исправлено 2026-07-16): poc использует -# raw-клавиатуру (kbd_raw_open → IM2-таблица). Буферы IM2 (_irq_vec_buf, -# BSS) ОБЯЗАНЫ жить в W2 (0x8000-0xBFFF) — во время прерывания W1/W3 -# могут быть перемаплены DSS (см. libc/irq/_irq_table.c, memory/ -# fps_divider: «verified tiny/big/huge, small=EINVAL»). --memory small -# пулит W1+W2 в плоские ~32КБ и чейнит DATA за CODE — при небольшом CODE -# BSS уезжает в W1 (<0x8000), и _irq_table_ref отдаёт EINVAL → -# kbd_raw_open молча возвращал -1, poc печатал ошибку УЖЕ в графическом -# режиме (невидимо) и выходил в prompt. huge кладёт CODE в W1, а -# DATA/BSS/STACK/HEAP жёстко в W2 → IM2 работает. Цена: раздел 16КБ -# CODE / 16КБ DATA вместо общего 32КБ-пула small — сейчас влезает с -# запасом; при росте настоящего PoP CODE>16КБ понадобится банк под код. -# -# --bank НЕ нужен: gfx_blit_part()/atlas_load() сами временно трогают W3 -# (видеобанк / чтение атласа) — банк room.c в W3 давал вероятностный -# «снег»; банк в W1 несовместим с CODE=W1 (трамплин переключения W1 сам -# бы уехал). sprintf() заменён на ручное hex-форматирование пути в -# tile_atlas_load() (единственный потребитель printf, ~2.9КБ). - -EXAMPLE := poc -MEMORY ?= huge -EXTRA_FLAGS ?= --gfx 256 -EXTRA_SRCS := room.c -TILE_ATLASES := res/tiles/tile01.atl res/tiles/tile14.atl res/tiles/tile03.atl \ - res/tiles/tile13.atl res/tiles/tile0e.atl res/tiles/tile0b.atl -EXTRA_DATA := tools/kid.atl tools/room.pal res/room1.dat $(TILE_ATLASES) -include $(CURDIR)/../sdk.mk - -LEVEL1_BIN := $(POP_ROOT)/SDLPoP/data/LEVELS/res2001.bin - -tools/kid.raw tools/kid.pal: tools/gen_kid_placeholder.py - cd tools && python3 gen_kid_placeholder.py - -tools/kid.atl: tools/kid.raw - python3 $(PROJ_ROOT)/toolchain/mkatlas.py $@ tools/kid.raw:16x16:1x12 - -res/room1.dat: tools/extract_room.py $(LEVEL1_BIN) - python3 tools/extract_room.py $(LEVEL1_BIN) 1 res/room1.dat - -res/tiles/1F-0.png: tools/gen_tile_placeholders.py - cd tools && python3 gen_tile_placeholders.py - -tools/room.pal $(TILE_ATLASES): tools/kid.pal res/tiles/1F-0.png tools/build_room_palette.py - cd tools && python3 build_room_palette.py - -# make_disk.py упаковывает EXTRA_DATA на диск ПОД БАЗОВЫМ ИМЕНЕМ -# (плоская ФС) — tileNN.atl/room1.dat оказываются в корне рядом с -# kid.atl/room.pal, room.c/poc.c грузят их без пути. -$(EXAMPLE).exe: room.c tools/kid.atl tools/room.pal res/room1.dat $(TILE_ATLASES) diff --git a/applications/PoP/poc/level.h b/applications/PoP/poc/level.h deleted file mode 100644 index fe119df..0000000 --- a/applications/PoP/poc/level.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * level.h — структуры уровня PoP под наш движок. - * - * Формат — POP-DAT-FormatSpecifications.pdf §3.4 (DAT 1.0): комната = - * 30 тайлов (10 колонок x 3 ряда), foretable даёт тип тайла, - * backtable — модификатор/состояние (семантика зависит от типа). - * Адресация тайла: tile = (room-1)*30 + tileOffset, tileOffset 0-9 = - * верхний ряд, 10-19 = средний, 20-29 = нижний, слева направо. - * - * Фаза 1 (applications/PoP/docs/PORT_PLAN.md §5, сузили объём): - * только геометрия (пол/стены/провалы) для коллизий — двери, факелы, - * ловушки, гарды НЕ используются (структуры под них здесь тоже - * упрощены/оставлены как заготовка на потом, см. §7 плана Фаза 2). - */ -#ifndef LEVEL_H -#define LEVEL_H - -#include - -/* 1 (не 24) — PoC грузит и рисует только комнату 1; расширить, когда - * появится настоящий level_load() на несколько комнат. */ -#define LEVEL_ROOMS 1 /* комнаты нумеруются 1..24 в файле, - * здесь индекс 0..23 = комната N+1 */ -#define ROOM_COLS 10 -#define ROOM_ROWS 3 -#define ROOM_TILES (ROOM_COLS * ROOM_ROWS) /* 30 */ - -/* --- Типы тайлов (Table 7 спецификации) --- */ -#define TILE_TYPE(byte) ((uint8_t)((byte) & 0x1F)) -#define TILE_MODIFIER(byte) ((uint8_t)(((byte) >> 5) & 1)) - -enum { - TILE_EMPTY = 0x00, - TILE_FLOOR = 0x01, - TILE_SPIKES = 0x02, - TILE_PILLAR = 0x03, - TILE_GATE = 0x04, - TILE_STUCK_BUTTON = 0x05, - TILE_DROP_BUTTON = 0x06, - TILE_TAPESTRY = 0x07, - TILE_PILLAR_BOTTOM = 0x08, - TILE_PILLAR_TOP = 0x09, - TILE_POTION = 0x0A, - TILE_LOOSE = 0x0B, - TILE_TAPESTRY_TOP = 0x0C, - TILE_MIRROR = 0x0D, - TILE_DEBRIS = 0x0E, - TILE_RAISE_BUTTON = 0x0F, - TILE_EXIT_LEFT = 0x10, - TILE_EXIT_RIGHT = 0x11, - TILE_CHOPPER = 0x12, - TILE_TORCH = 0x13, - TILE_WALL = 0x14, - TILE_SKELETON = 0x15, - TILE_SWORD = 0x16, - TILE_BALCONY_LEFT = 0x17, - TILE_BALCONY_RIGHT = 0x18, - TILE_LATTICE_PILLAR = 0x19, - TILE_LATTICE_SUPPORT= 0x1A, - TILE_LATTICE_SMALL = 0x1B, - TILE_LATTICE_LEFT = 0x1C, - TILE_LATTICE_RIGHT = 0x1D, - TILE_TORCH_DEBRIS = 0x1E, - TILE_NULL = 0x1F -}; - -/* Твёрдые тайлы — Фаза 1 (только геометрия); классификация наша, для - * коллизий движка, не часть исходного формата. Двери/шипы/дробилки и - * т.п. сознательно исключены из объёма Фазы 1 (см. §5 плана) — при - * встрече в реальных данных трактовать как проходимые до Фазы 2. - * - * tile_is_solid() — "есть опора сверху" (вертикальный смысл: можно - * стоять НА этом тайле) — Floor ТОЖЕ solid в этом смысле! Для - * горизонтальной коллизии (можно ли ВОЙТИ в эту клетку сбоку) нужен - * ОТДЕЛЬНЫЙ предикат — см. tile_blocks_side ниже. Баг 2026-07-16: - * col_blocked() в poc.c ошибочно звал tile_is_solid() для бокового - * упора — Floor блокировал сам себя, Кид не мог сдвинуться с места - * стоя на полу. */ -static inline uint8_t tile_is_solid(uint8_t byte) -{ - switch (TILE_TYPE(byte)) { - case TILE_FLOOR: - case TILE_PILLAR: - case TILE_PILLAR_BOTTOM: - case TILE_PILLAR_TOP: - case TILE_WALL: - case TILE_BALCONY_LEFT: - case TILE_BALCONY_RIGHT: - return 1; - default: - return 0; - } -} - -/* tile_blocks_side() — настоящая преграда СБОКУ (нельзя войти в - * клетку по горизонтали): Wall/Pillar-семейство. Floor/Balcony НЕ - * блокируют — по ним идёшь (тайл под ногами, не впереди). Lattice- - * колонны (0x19-0x1D) — узкие, Кид физически проходит мимо (см. - * gen_tile_placeholders.py draw_lattice_like) — тоже НЕ блокируют. */ -static inline uint8_t tile_blocks_side(uint8_t byte) -{ - switch (TILE_TYPE(byte)) { - case TILE_PILLAR: - case TILE_PILLAR_BOTTOM: - case TILE_PILLAR_TOP: - case TILE_WALL: - return 1; - default: - return 0; - } -} - -/* --- Тайл и комната --- */ -typedef struct { - uint8_t type; /* foretable byte (rrmccccc — см. TILE_TYPE/MODIFIER) */ - uint8_t state; /* backtable byte — модификатор/состояние */ -} tile_t; - -typedef struct { - tile_t tiles[ROOM_TILES]; /* индекс = tileOffset 0..29 */ - uint8_t link_left, link_right; /* links-блок: 0 = нет соседа */ - uint8_t link_up, link_down; - uint8_t guard_location; /* 0..29; 30 (и выше) = нет гарда */ - int8_t guard_direction; /* 0 = вправо, -1 = влево */ - uint8_t guard_skill; /* 0..9 */ - uint8_t guard_colour; /* индекс палитры, Table 11 */ - /* door I/II (событийные цепочки) — Фаза 2, не здесь */ -} room_t; - -typedef struct { - room_t rooms[LEVEL_ROOMS]; /* индекс 0 = комната 1 (файл 1-based) */ - uint8_t start_room; /* 1..24 */ - uint8_t start_location; /* 0..29 */ - int8_t start_direction; /* 0 = вправо, -1 = влево */ -} level_t; - -/* Тайл по (room 1-based, col 0-9, row 0-2). */ -static inline tile_t *level_tile(level_t *lv, uint8_t room, uint8_t col, uint8_t row) -{ - return &lv->rooms[room - 1].tiles[row * ROOM_COLS + col]; -} - -/* Загружает ОДНУ комнату + стартовую позицию уровня из файла в формате - * tools/extract_room.py (63 Б: foretable[30]+backtable[30] той комнаты - * + start_room+start_pos+start_dir, вырезанные из res20NN.bin — layout - * подтверждён декодом байт 2026-07-15/16: файл начинается СРАЗУ с - * foretable[720], потом backtable[720], без заголовка; start_position - * — смещение 2112, сверено со структурой level_type в SDLPoP/src/ - * types.h). Заполняет lv->start_room/start_location/start_direction. - * 0 — OK, -1 — файл не найден/короче 63 Б. */ -int level_load_room(level_t *lv, uint8_t room, const char *path); - -#endif diff --git a/applications/PoP/poc/poc.c b/applications/PoP/poc/poc.c deleted file mode 100644 index 5c03ad5..0000000 --- a/applications/PoP/poc/poc.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * poc.c — PoC порта Prince of Persia (applications/PoP/docs/PORT_PLAN.md - * §5): проверяем управление (raw-клавиатура, held-state) + коллизию - * по краям экрана + анимацию ходьбы + прыжок/присед поверх готового - * спрайтового движка (sprite.h). - * - * ВАЖНО: персонаж — ВРЕМЕННАЯ ЗАГЛУШКА (лицензированный спрайт-пак - * third_party/16x16-RPG-characters через tools/gen_kid_placeholder.py, - * тот же источник, что уже использует examples/rpgwalk), НЕ графика - * оригинальной Prince of Persia — см. §5 и §8.5 плана. У заглушки нет - * отдельных поз прыжка/приседа — механика (тайминг дуги, состояние, - * коллизия с полом) проверяется на том же спрайте без смены позы; - * визуально это упрощение, не финальный вид. - * - * Дуга прыжка (jump_height[]) — СВОЯ, приблизительная (не таблица - * смещений оригинала — см. §6 плана: авторские таблицы кадров решено - * не переносить, только код/структуры). - * - * Нет ещё (следующие итерации): реальный уровень/фон по BLUETYPE, - * рывок вбок при прыжке с разбега, зацепление за уступ. - */ -#include -#include -#include -#include -#include -#include -#include "level.h" -#include "room.h" - -/* Комната 1 уровня 1 — РЕАЛЬНАЯ геометрия (foretable/backtable), - * вырезана tools/extract_room.py из applications/PoP/SDLPoP/data/ - * LEVELS/res2001.bin (level_load_room(), см. level.h/room.c) — не - * плейсхолдер. Верхний ряд (row0) — floor-уступ на cols 3-7 (там - * реально стоит персонаж в оригинале), стены по cols 8-9; ряды 1-2 — - * ниже уступа (торч/колонны/пол — Фаза 1 просто их отрисовывает по - * тем же типам, без многоуровневой физики падения). */ -static level_t test_level; - -#define CHAR_ROW 0 /* ряд, где стоит персонаж (floor-уступ room1) */ -#define ROW_Y(r) ((r) * 64) /* room_row_h все по 64 */ -#define GROUND_Y ROW_Y(CHAR_ROW + 1) /* низ ряда CHAR_ROW = верх пола */ -#define KIDY (GROUND_Y - 16) /* y спрайта (16 px высотой) */ -#define SPEED 2 /* px/кадр — заглушка, не авторский темп */ - -/* Настоящая преграда (Wall/Pillar) слева/справа от кандидата x в - * CHAR_ROW — блокирует движение (грубая проверка по краям хитбокса - * 16px, без под-тайловой подгонки — для PoC достаточно, см. - * PORT_PLAN.md §6). tile_blocks_side(), НЕ tile_is_solid(): Floor — - * тайл, на котором Кид СТОИТ (тот же CHAR_ROW), tile_is_solid() его - * тоже считает "твёрдым" (можно стоять сверху) — если проверять им же - * боковую преграду, Кид не мог сдвинуться с собственного пола (баг, - * найден 2026-07-16). */ -static uint8_t col_blocked(int x) -{ - uint8_t c0, c1; - - if (x < 0 || x + 15 >= ROOM_COLS * ROOM_TILE_W) - return 1; - c0 = (uint8_t)(x / ROOM_TILE_W); - c1 = (uint8_t)((x + 15) / ROOM_TILE_W); - if (tile_blocks_side(level_tile(&test_level, 1, c0, CHAR_ROW)->type)) - return 1; - if (tile_blocks_side(level_tile(&test_level, 1, c1, CHAR_ROW)->type)) - return 1; - return 0; -} - -/* Ленты атласа: dir*3+frame, dir 0=вниз/1=влево/2=вправо/3=вверх, - * 3 кадра маятника на направление (см. tools/gen_kid_placeholder.py). */ -#define DIR_DOWN 0 -#define DIR_LEFT 1 -#define DIR_RIGHT 2 - -/* Дуга прыжка: своя, приблизительная (не авторская таблица, см. шапку - * файла) — высота над полом (px) по кадрам 0..19, УЖЕ ПОЛНЫЙ горб - * (подъём 2→22 к элементу 10, спуск обратно к 2 к элементу 19) — БЕЗ - * зеркалирования в коде, массив читается один раз целиком. БАГ, - * найденный пользователем 2026-07-15: раньше код ЕЩЁ РАЗ зеркалил - * этот уже полный горб на 40 кадров — получалось два полных прыжка - * подряд от одного триггера (не проблема клавиатуры/декодера, чистая - * рассинхронизация данных и комментария). 20 кадров @ 50 Гц ~= 0.4 с. */ -static const uint8_t jump_height[20] = { - 2, 4, 7, 10, 13, 16, 18, 20, 21, 22, - 22, 21, 20, 18, 16, 13, 10, 7, 4, 2 -}; -#define JUMP_FRAMES 20 - -static atlas_t at; -static sprite_t kid; -static uint8_t facing = DIR_DOWN; /* текущее направление анимации */ -static uint8_t jumping = 0; /* 0 = на земле */ -static uint8_t jump_t = 0; /* кадр дуги, 0..JUMP_FRAMES-1 */ -static uint8_t crouching = 0; -/* Прыжок — level-triggered НАМЕРЕННО (не edge-detect): если UP всё ещё - * зажат к моменту приземления — следующий прыжок стартует СРАЗУ (цепочка - * прыжков, пока держишь); отпустил раньше — второй прыжок не начнётся - * сам, только по следующему нажатию. Раньше здесь были up_prev/ - * jump_cooldown — попытка "починить" ровно ЭТО поведение, приняв его - * за баг; убрано 2026-07-15 после уточнения желаемого поведения. */ - -static void draw_room(void) -{ - setfillstyle(SOLID_FILL, BLACK); - bar(0, 0, 319, 255); - room_draw(&test_level, 1); - setcolor(LIGHTGRAY); - outtextxy(60, 4, "PoP PoC: hold LEFT/RIGHT to walk, ESC to quit"); - outtextxy(4, 14, "(placeholder tiles -- not original PoP art)"); -} - -/* HUD-плашка состояния (нет отдельной позы прыжка/приседа — статус - * текстом, рисуется банком 0x50, heal спрайтового движка её не - * трогает — как fps-плашка в examples/rpgwalk). */ -static void show_state(uint8_t jump, uint8_t crouch) -{ - setfillstyle(SOLID_FILL, BLACK); - bar(0, 24, 60, 32); - setcolor(YELLOW); - if (jump) - outtextxy(0, 24, "JUMP"); - else if (crouch) - outtextxy(0, 24, "CROUCH"); -} - -static void set_facing(uint8_t dir) -{ - if (facing == dir) - return; - facing = dir; - sprite_anim(&kid, (uint8_t)(dir * 3), (uint8_t)(dir * 3 + 2), - 6, ANIM_PINGPONG); -} - -int main(void) -{ - uint8_t page, hidden; - int x; - - if (level_load_room(&test_level, 1, "room1.dat") != 0 && - level_load_room(&test_level, 1, "a:\\room1.dat") != 0) { - puts("room1.dat not found"); - return 1; - } - /* Стартовая позиция. В данных room1 start_location = tileOffset 0 - * (row0/col0) — а там EMPTY (провал, без пола); в Фазе 1 нет физики - * падения, поэтому для PoC ставим Кида на floor-уступ (col 3, где он - * реально стоит в оригинале). Когда появится многоуровневая физика — - * брать col из start_location. start_direction: -1 = влево, 0 = - * вправо (level.h). */ - x = 3 * ROOM_TILE_W; - facing = (test_level.start_direction < 0) ? DIR_LEFT : DIR_RIGHT; - - if (atlas_load(&at, "kid.atl") != 0 && - atlas_load(&at, "a:\\kid.atl") != 0) { - puts("kid.atl not found"); - return 1; - } - if (tile_atlas_load("") == 0 && tile_atlas_load("a:\\") == 0) { - puts("tile atlases not found"); - atlas_free(&at); - return 1; - } - - initgraph(); - /* room.pal = EGA16 + Kid + Floor + Wall — ОДНА палитра на всё, - * собрана tools/build_room_palette.py (см. --seed-pal в - * toolchain/png_strip.py) — Kid и тайлы на экране одновременно, - * их "свои" цвета обязаны жить в одной таблице. */ - if (gfx_pal_fload(0, "room.pal") < 0) - gfx_pal_fload(0, "a:\\room.pal"); - gfx_pal_sync(); - gfx_sprite_clip(0); /* коллизия по краям гарантирует границы */ - - /* kid.atl — ОДНА лента (12 кадров вертикально: dir*3+кадр, см. шапку - * файла и examples/rpgwalk); индекс atlas_sprite_init — это НОМЕР - * ЛЕНТЫ (персонажа), а не кадра. Лента одна → всегда 0. Стартовый - * кадр направления выставляем sprite_frame (вертикальная лента, fh=16: - * кадр N на sy=N*16). Баг Соннета (найден 2026-07-16): здесь стоял - * facing*3 как индекс ЛЕНТЫ — при старте лицом влево (idx 3) читался - * мусор за каталогом атласа → мусорные w/h/src → блит спрайта заливал - * пол-экрана «снегом». */ - atlas_sprite_init(&kid, &at, 0); - sprite_frame(&kid, 0, (int)(facing * 3) * 16); - kid.x = x; - kid.y = KIDY; - sprite_show(&kid); - - for (page = 0; page < 2; page++) { /* фон + спрайт на обе страницы */ - gfx_set_draw_page(page); - draw_room(); - sprite_update(&kid, 1); - } - gfx_set_visible_page(0); - - /* kbd_raw требует BSS в W2 (IM2-таблица) — недоступно в --memory small - * (там BSS может уехать в W1 → EINVAL); poc собирается --memory huge - * (CODE в W1, DATA/BSS в W2). closegraph ДО puts — иначе сообщение - * ушло бы в графический режим (невидимо), а программа молча вышла бы - * в prompt (баг Соннета, найден 2026-07-16). */ - if (kbd_raw_open() != 0) { - closegraph(); - puts("kbd_raw_open failed (need memory mode with BSS in W2)"); - atlas_free(&at); - return 1; - } - - for (;;) { - uint8_t moving = 0; - int y = KIDY; - - if (jumping) { - /* дуга идёт сама; направлением можно скользить вбок, - * поза не меняется (нет отдельного кадра прыжка) */ - if (kbd_raw_down(KBD_LEFT)) { - if (!col_blocked(x - SPEED)) x -= SPEED; - } else if (kbd_raw_down(KBD_RIGHT)) { - if (!col_blocked(x + SPEED)) x += SPEED; - } - y = KIDY - jump_height[jump_t]; - jump_t++; - if (jump_t >= JUMP_FRAMES) { - jumping = 0; - y = KIDY; - } - } else if (crouching) { - if (!kbd_raw_down(KBD_DOWN)) - crouching = 0; - } else if (kbd_raw_down(KBD_UP)) { - jumping = 1; - jump_t = 0; - } else if (kbd_raw_down(KBD_DOWN)) { - crouching = 1; - } else if (kbd_raw_down(KBD_LEFT)) { - if (!col_blocked(x - SPEED)) x -= SPEED; - set_facing(DIR_LEFT); - moving = 1; - } else if (kbd_raw_down(KBD_RIGHT)) { - if (!col_blocked(x + SPEED)) x += SPEED; - set_facing(DIR_RIGHT); - moving = 1; - } - if (!moving && !jumping && (sprite_anim_status(&kid) & SPR_ANIM_ON)) - sprite_anim_stop(&kid, (int8_t)(facing * 3)); - - sprite_move(&kid, x, y); - - if (kbd_raw_down(KBD_ESC)) - break; - - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden); - show_state(jumping, crouching); - sprite_update(&kid, 1); - gfx_wait_vsync(); - gfx_set_visible_page(hidden); - } - - kbd_raw_close(); - closegraph(); - tile_atlas_free(); - atlas_free(&at); - return 0; -} diff --git a/applications/PoP/poc/res/bg/bg.arc b/applications/PoP/poc/res/bg/bg.arc deleted file mode 100644 index cc36258656df33d318ddc95b77a37a15b7b4ff5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202240 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 diff --git a/applications/PoP/poc/res/bg/pal_env1.atl b/applications/PoP/poc/res/bg/pal_env1.atl deleted file mode 100644 index 634d3987005977dd566b5581f88713ce58d4f193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmcgqOKw6j3=HA|l@J?NT%kwk4N!=bAaQ?n(L010fASG|bWu?+Vn2^(9LMi^`TG0_ z@3(KX*zH32FaHzH2ll({Pe*#%IUGWLX*vG_{|V2qSNZ@q@J76C@F|_*7QNOOBMR!e zKgp!W_^h5Yh(K`C&HW*#X`Wg(Dj-`(gs!NgN1E_bfQvMclu+O22bUmjMR6P`z_;?L z4Ae*ra*+zt7Yb1r$QB^0xPGU*`Q{W)1`IGm{j9Bc9h|~3@N(mvJ;n|48WLm)5m}S? zzpOi9O{L7c@=JhmTMdC1MtgbZ`}i{U=G=@=EH8mPwj%rGYV`FHNS;5OZ4FL%mWPT% zx|f#6Ff631?b^2uL<~sN_i;!E_>^zA9rT?u-^a7`+Q0Yhn9tQS9>%XhWKeOd+D&(qQI~VWNqpsaGV}tSJ)ADhylCG-gbap zp?B~^Ql_mRQb~sbT_GX1M1G_w)09LjH`7laUYW-)_vZ9qXUCXtI~V&<|9C<5uidj_ zpg-?byHNk!t1h8_e^?zt{rhNg1@-Og3DWm(i2wbJ^j@Bm-q-W$2;@G#txlkxPpF?i z?<&-XCpe1@x$Nqc$}!%)VLI%VoXcwXD}u zE8i?PzEFO11Ju7AjkU1Jh4S?l#g1pYG6f&a7glL8pFdW;xLd64HQ%&uw=7#Y2t}t` zmNRo~qTmV`E>M|U*Vv5N4q!oS;IQHVCU!Rf)LqYJAY?NDoe$D5i`cHu?z$CD&p?_r zLTLx2*w#jx-F3hR&8P_MuB*(hAy4waqsB}xwGPkf%3PYdwNs!?4-Q6Kw>E@T{BCil z;x_zM+)h6g&*^9FXU3m<{v2NXQ{qRPKP7(j_$dC-{gYW=aLbY7FWNNHjBva5X`kZc zG~Lw$xw;J~)S~V?m?V{g%~MGpFpx)pfhLC3sgv z7Pl0)j69GHhs+#PQ-f!`w&>4I`;52^lm8tY<`w<-IKnaL!M+8w>fWu7SZWN8jv~l_ z4>Ftv83r4nCYWd2DNs4>7`Y{_={lD|Yg+@AQxLMJ&M{F`hsM012!#ygnEOoaa{(XLNK@J_vG{Lt|jOmWM_-9r%Ha zv*GDSsHY$FOeE_kQPu}^^i(K}H0q1!YGrX0mTo%QH02yOxiVRIrWY)Mt*l_;+6Cvh zxpUZm#Vd1Ur{H=GKdH8e#o;E@pbE-T4WM$Vx=ztn${0{cegi;Jaqr}`mkDQ=% z*&*4tJ<~4~=c;`?) xWGN3FoduGO0A*Z283!|wE<6I;PomlX5J+Fpb^R--wXdSeDV*~^JKE7<^%s*NH3$Fz diff --git a/applications/PoP/poc/res/bg/pal_env3.atl b/applications/PoP/poc/res/bg/pal_env3.atl deleted file mode 100644 index 6a86a5a2b9aaef0a7ad174ef9735167c4e2fc3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcmd^AJ8r`;43+KplORDlWKiagojUXYy+NI%h&}fRJx&kOqx1k>I&|yMG366YiILqD zK@cE74a5|mNb%`Wa@G&`w^!!;&!<_=lEjz~Dg}F&+9_OwhQxdXm8WOGDLb;ZHyn907^zeq_9nNnbuOl%p>m0!S3Q;_}{>^-tn+Iv|7p`M5 zmiXiFxtYWoMbh*X2~xUJvAe%*Cvu>4*bQ+svZe~md{5d2XE&xuehu7nNFDqvDEU_g+IyTfsuC7ggsR=`3Q=eEr-@0jCmheBLO-uzt<4_3Yj0gE|OjQ<}I z-uf0XCRxH!X91&K)Wf`Ej$k5ngq7CpAm+YHIwI)ED0dfc9syN1fb{Ajx?2Gahk3^w bu~Lj-tsb_=5n0D`3|ZidBA&O~8Ta`ImMqeU diff --git a/applications/PoP/poc/res/bg/pal_env4.atl b/applications/PoP/poc/res/bg/pal_env4.atl deleted file mode 100644 index bb17cdf0b75ee4b31b2738d911746e43a01eb40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6976 zcmeHKO>*8u5S1}S#T61#MHb2KI|A%esp1Am8jbAwVtpHq!7*5};4mD71&3fK-s_&8 zKaG@_gi013+nQ0oe%-Hor0*M#KmYXOcisO#{_bAhTwQhD?^imzuXO(QTIWBnUkU!l z*Qe+7`{kR{GtN(*ynZ3P8=Zf6db;NQZ(;uD>FEvc|3V4*{Ok9px4h?g+1+&OX7t0x zwAQw}dHpck?YiFKPX}4Nzq`HdgK0GzoRUpgw|APuJiwAz{qTu(7aD`o2Wre%K_lu6 z)v|o{;G=ZESEDIlB3)}%bS?DJJW?N%U(%Sfw1$W1PJ5kYi+aqKYozVr8WYPjGKy7Z zwpY#PyK6l2>&o{*_2pMuw|2GGcC(iDWXMf6sr;y6&W6>y3ha-uTZ-UIBzAMBsCDT;BD0MXWrQ| zL|ZdcYw60daXEF*zU)0jow3KdsCMaK4@0#Xe^WmV5#OS=2XrACx*i;D587yq7P#@g zUQ~Nn?wE7_b@!qR9A+v<9jv}D6`#-Ei^tX+fRgVyDt+)!v$iA)XXXfKmSm0qNx3-# zN;6(c-S65Q7+bRdEi-_&d0lBQ+Zyh6%9G3H-KRA8E;HQ~YCuSPex z)e`3{KJ`btEixSOW3LR(^`TXAMHK?sGeI)GQ@uhF#_((g74>aPVn_PJ?fVO#>rf}F`{QMsRL+4q~q~!CopfM8a zo#NzM`~nSU+JslA;*OthysLIka7##cdhJ|>Rz^7)Q>6*aAx z6W&4vhdl2C+FKJq6$RikI)`@~RQ_iGo1@x+pn+#v{o)OVYC3gqJ8ab97{>`8@cVz$ zG=hKd2kzm|5tqb++{Cp0{VSd>?BD){2zGe);=;*gZ|)t=55wU0=Aq|t45yc!*%9z~ zpZ8`0fW@IXJ1?P;q&;tP_l1_D+;BY3J@oCINlTHd(TCl-NtEPRH0w5d%GK7gslVKd z53WCd#w>TLp9j=5=*vAr1r#M<{+hv49FQCipyr^i=|OD~EsoIikr;t1;Ib?izxexM z#M2r)Br?&(1NMgV`%OG>5fm7H?|tACU&Mp(y>M9wRuUihq7HyBFgpO33)Dtj9RS1b z9TLNVQ_f#j3JY+B3xDYuH_~(c%nyFR85r5K_{yhX%A>NfKIIdqeyN`hQD5RiKYPdD ztiGHNSaG_r|JpyeXnf^|Yrr$UkS`LU#aG@14nSl4#3#O7OyxGe;i}T`#HV;{(r$j{ zMVF{Dub<(hKGjDbSxJ5T?&Dznj89M&*o`6khk-c3z=hNOy)yMG8v<+KR;b3`M*~g) k7-i%b{{R*KE|(GT#_UA4`0c!klHXEgDDa{i$!@EE0TXq&kpKVy diff --git a/applications/PoP/poc/res/bg/pal_env5.atl b/applications/PoP/poc/res/bg/pal_env5.atl deleted file mode 100644 index cf17816e927b25b0be2f8ec06383cf801a4b8063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13634 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 diff --git a/applications/PoP/poc/res/bg/pal_tile.pal b/applications/PoP/poc/res/bg/pal_tile.pal deleted file mode 100644 index df429b204b053213dc0762b38a13ed9ffda63c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmZQzU|_I`tYq-1T*weP^$Z?u}dE@B(8eI5W4UdSRaTVx%3uL4kUhyq4Uyz VhN-vygXxJtI$-7@hSFW{7y#UHH%0&e diff --git a/applications/PoP/poc/res/bg/pal_wall.atl b/applications/PoP/poc/res/bg/pal_wall.atl deleted file mode 100644 index f3a72c27fa694f940a7a2ef14f4b507fec5f12b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5267 zcmdT_OKuZE5bY?5Y+{>_lZ{1W%?%KnSw`XpAQl_}$sf%TI06e69EC%$;2>Op1ya-X zo$l%$&)A9M(3YmE-m9vve)I9i_wU}$-SO9-u*KP#bAR394(#*MVg~lpcsv68jqNYC zlV{Zw@UK^7ucu_c&&a-hQB8pV^70n#k5|h}h(FB9{+=%{ApU$^orC?!_RS5&aN>o# zbDMarqZQ+u2w&fiX!dT^SrHRWJXJ)*@Mfb#k{)uHXe>@d4r4{L-DdfL*uu&Q!ZU(l zTY*jZqGxC{nHVN4EPI%2sG$n(8=DgoAXhvN`7Gkz#Hv`)tX3rg-~!PQo>eexD-=!% z>@63aDoRF<2@6XrsgEpFL}BZ8z-_|+?a5uSrwEU_g)r{W2?h5_1&B|uPl*;bgk<}$ z+E(<^0ftM7I2#xuOg0nzLSuvWvMR&g7n)EN?Ag{wUI*;`!p&Tim$>UB(ja^~)sLJ8 zKB-a6E`Mk(p??Y~p>W!Yn-JSp=x017;L}#9pf6rV5S&#A9BedH_kZEojYP<`=>CTj5Ww+13!U# zkj-RI!h!>gnui!_=xUQsANQWej`#@opl_xDJjgAQhje)U!w-?XI!ElGcgK%jU$_Uy zo?-9)BzX`HbcdG$#Rnm=)zE%J^LF2%Zua2*m7CcAgM)i@kJrcO6Riq|A;71{y|0}3 zzPbDOVY?iVb$e=!QAm^%p4uTg49O`eacEtsmtVR|c{X?VJq{ZL3Gs}=`N0{nJNMss_y92l{=TcWgKg@!V(;V%J7}V6)?$%!{T~~J#a6&pV(G+ Ugbl-bh&`Z>PEQ*`bL5E>fF@E?dn{{v|tHeh%JKA}7<>$5z-ECIgTz2`AT_nMwP5`=3OrynkuC-d zg|RLSQ(G$;&K=taHVfv4#==;znph75hT6En atlas env_bg[N>>4], idx N&15 - * WALL id N -> atlas wall, idx N - * FORE id N -> atlas fore, idx N - * - * ДВА ТАЙЛСЕТА (порт tbl_envir_ki[tbl_level_type], seg000:1108): - * 0 = подземелье (pop_*), 1 = дворец (pal_*). Набор id и раскладка - * у них ОДНИ И ТЕ ЖЕ — меняются только файлы и 32 записи палитры - * (env 0x50..0x5F, wall 0x60..0x6F), см. *tile.pal. - */ -#ifndef POP_BG_ATLAS_H -#define POP_BG_ATLAS_H - -#define POP_ENV_SHIFT 4 -#define POP_ENV_MASK 15 -#define POP_ENV_PAGES 10 -#define POP_TILESETS 2 - -/* Палитра: env-слоты, wall-слоты (спрайт-пиксель i -> база+i). */ -#define POP_PAL_ENV 0x50 -#define POP_PAL_WALL 0x60 - -/* Имена файлов атласов по тайлсету (грузятся atlas_load). Таблицы - * видны только тому, кто попросил POP_BG_ATLAS_NAMES: иначе копия - * строк уедет в каждый включивший заголовок модуль. */ -#ifdef POP_BG_ATLAS_NAMES -static const char *const pop_env_atl[POP_TILESETS][POP_ENV_PAGES] = { - { "pop_env0.atl", "pop_env1.atl", "pop_env2.atl", "pop_env3.atl", "pop_env4.atl", "pop_env5.atl", "pop_env6.atl", "pop_env7.atl", "pop_env8.atl", "pop_env9.atl" }, - { "pal_env0.atl", "pal_env1.atl", "pal_env2.atl", "pal_env3.atl", "pal_env4.atl", "pal_env5.atl", "pal_env6.atl", "pal_env7.atl", "pal_env8.atl", "pal_env9.atl" }, -}; -static const char *const pop_wall_atl[POP_TILESETS] = { "pop_wall.atl", "pal_wall.atl" }; -static const char *const pop_fore_atl[POP_TILESETS] = { "pop_fore.atl", "pal_fore.atl" }; -static const char *const pop_tile_pal[POP_TILESETS] = { "pop_tile.pal", "pal_tile.pal" }; -#endif /* POP_BG_ATLAS_NAMES */ -#define POP_POT_ATL "pop_pot.atl" /* chtab_1: зелья, от набора не зависит */ -#define POP_PAL_POT 0x40 -/* Пузырёк зелья: красный набор = id 16..22 (кадры оригинала), - зелёный (перо/переворот) и синий (вред/открыть) = те же кадры - под id 30..36 и 40..46 (draw_tile_anim, seg008:652). */ -#define POP_POT_BUBB_GREEN 30 -#define POP_POT_BUBB_BLUE 40 -#define POP_BG_PAL "pop_bg.pal" - -#endif diff --git a/applications/PoP/poc/res/bg/pop_env0.atl b/applications/PoP/poc/res/bg/pop_env0.atl deleted file mode 100644 index 70c510c2a7db3089804fea831c681cd3fb5d6193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13280 zcmeHOzwR4F5Oze73WQJ!q!hSAC{>DdQ6f4@&OV=I5<9O!$pi5aJO%|Nk3flZeBaE@ z?Cjp|U5Md_BC(Ed|9tazZ*OL7|8o5P+vlI{{{8kVR6KgL+x@oNzhM8<e}BAx z#{Rocwg34G?LYr=|C;N@SNDH>wSP(c$FKKK*#G&>{uTRQoxTi_#_4bvjv}2JrW5D7 zK5{S}#_>?{`#J}JN64o|q8~PbA+3*-h${3Gw{_E1=qIc;h;G^t^_xw@q`Ijq>Nnko zL3LACHZ}Q)6X@?5^iGQ{> z)cSE_Vq5B0?MA~5%8m9d@F_OIjamB4U2+;xOD{$1nmg3$5aT^f1nZ6F)65=f@LKf@j(_uMnVP5Cm$n{fI@iFBg2@Q zUrGTgMKfR{l|dNdY_aT>y91I`xJ#aLCYhvMDrOqVi={#xZ0mzW?t|~&M zv9#A)Eba8CMvTcdBp+}R@ImhNjksp@_5n)clD=oZ*dc@RLM~Ol)?W9|WX;A02+O2|0V#B}<_~Va}8xC&3?-65P@AR2zT=^Z?bUq!A_}6+T{B$~kx$!m}yv>*4 zEncp@r+$W%W=s6t3}X6wg}U*lAhpOL3Gd{NaY%R_GktFItC*Q{iSB<WlHT#Kcx}HY7x&9?q~sm)bR!{B^ge* z=H)!$J=pj=+?l^AJnQe)=}CX(b(Us$%l2UZz5G4#=6^P*8YTPwbN*fyvHdF!U6}lj zOa2TyQVt(zfA+hVJ66p2zJHQ0El#BwoJ~OaQ+S1+jZ*lDANgaAt>#|%DZh`isITR_ zfR6rvC;Pkd`Ppz)KOI#4E;SFJKiij=eIy@`l7GG!2JZhfh1EPX{`qjoi(!=gZ)`5; zgkScrly5i4GE-0fH8uQIL(rOsR~2v_#!|jfTqg#BX$3#uZs&XO+xfgM|8nWc$0l5- za~D5f&cHA4-d&pZf$?%KaBixMCVt-F-_)P?w=I7I5BuNbzZVbpzbStU-}FD9@3#C6+@BwwkHy=cKYS!_ zHGh8J+|}M{a~b8loV|Hd&zy7GtJmwhBR9(OEcVw2Mkpr8J8O(BU{vhHb$j>=Y{(kI;pIQ0QUR#j^HJt)YAUfxl z91K~G>WOvx6Fw=gA7{^z$YTfCDX^nbgXA2na6mN&N{vGK!d<{p!?^#%OIUNL)c{La zYoK*p?GyiM>B&CZf75OW8n(#(nta29jk14^2Otf7|3rTar+NJvXuo@v|MrCJ`~q^s zr&pe~R^B&UkIhmc@Y9i>e*64_^9ZfVmt)(MFZONeU)ry`?)K5ZR$b%%x9yt~j@@b6 zk6Wt#$+j=;#|r*#$8K8_M>#0RqHP~;5${jWf65oUub=W$YwCx5OD#aZPP~ zTuZ|b$2B#t@Js3O;kcF_!jIA})PAzRR{E*@qV_v;{|(2-bbKEkDnI6V!L{_@$M~Y= zV_g?;%D=^$(DCFy*_*hQcDM^2TuVc$Z_8JHs&C_Q|Et=kvcF?rxIZoau>Vc}?!|Tg zxqBaG-=_ak`mM;%cwPI+{;fPe_~Nd3{+3lo`TQ>Nw4&C{X;#-j{;5^)C0gR85(zI! zyvffL1v+P3byTS19n^8kU+~ffSKLJBIaP8UH1T&)!B4Qn(XXTP{1kQM zqI5(KNR6qYd^3GWdN2~}Q|4yo^9oT1F{$Bq9TcWhsupv;M81;3P(Y@~GF1u&R{5_L zsY+lGpjlWsC;U)v1w=?-1W^iG?ZIiz-HMgEZ2tr^fmKC9k!A+BC>8_2%&%aENDWY7 n20{LOt9wZIT_E#^L-aU9#-%k^!9^&SW3?Fq^(v`g26X)eHf)H4 diff --git a/applications/PoP/poc/res/bg/pop_env1.atl b/applications/PoP/poc/res/bg/pop_env1.atl deleted file mode 100644 index 634d3987005977dd566b5581f88713ce58d4f193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmcgqOKw6j3=HA|l@J?NT%kwk4N!=bAaQ?n(L010fASG|bWu?+Vn2^(9LMi^`TG0_ z@3(KX*zH32FaHzH2ll({Pe*#%IUGWLX*vG_{|V2qSNZ@q@J76C@F|_*7QNOOBMR!e zKgp!W_^h5Yh(K`C&HW*#X`Wg(Dj-`(gs!NgN1E_bfQvMclu+O22bUmjMR6P`z_;?L z4Ae*ra*+zt7Yb1r$QB^0xPGU*`Q{W)1`IGm{j9Bc9h|~3@N(mvJ;n|48WLm)5m}S? zzpOi9O{L7c@=JhmTMdC1MtgbZ`}i{U=G=@=EH8mPwj%rGYV`FHNS;5OZ4FL%mWPT% zx|f#6Ff631?b^2uL<~sN_i;!E_>^zA9rT?u-^a7`+Q0Yhn9tQS9AenI&&ogY^#l;5A!$C!UV zsc$fUc~%p?If;PA z#Hmnz>blMYK=u%l9Yo6(v9d-SnGh}C>s)y}3fJO=7-Tavjg&Lb&`7K)o7q2GbGA`a z6FQgqN7oz{BpPS4C`p`uFZ*`c)AntW8hlxU1viz-V(1aibICBg5gy@VHVboR;Ac|JCAH zG~9wa*e0KvJiTdZaU+x*$Yuwb7`z;MFvWfkey)A;u1x#nry0Hn|HzGRPJh0C@abIt zWqr!}Wb9+k{)>MV|H|zzd)be3Ts%V2#FW(3y*YCqq2b+{aEIZRcWY&)cD7+=?%Ddu zzG{rcW&%7oqqE7J;i=dY`CJ4``k8nbcsgV8oaLSc`t$u~;%4lh&e+5%Q2(@t@C%7N z&Of_H!~8S+L1TEIxaJ-5l3t}Cbf&C*9J$xuZp$@X1#JcsdrFjs;q^VcgjWb zISa{IRk7aGzI7l!O&)WpPg%II@pbemN*6gkLlWWUo8I9y9x)aV7zYPtI=VgF(Ft(N zM7U-coER1dCV?x31pj58!j;1N9sVRlG;xRy1AIjD_g8~VMGv5ph#Lm%ij5X>I+=cw zV`Ju{zo>8seoEeTfIlQ6gq)}B;a#;ji_d)XqP1ZgG03gi2lyzCEXAh`Z*{Q{@g5uT z0UPj!oqWk{->_b8`}fdE(EJ40(%1>{7PAE#n**;wXHd2pjNd79#Y&tD4ks+ww`@J| zS6iln?wdT^XGkL44s@!Z@rbc_z&JQC(}X?T(Ft(NM7U-coER1dCV@X}N5k9Dx!cS+ zep*_#)Le;m=#dY-?9J)z&b4sqOnJ_h=VAJ#d@U|Ry9Ycoq(f7%V!lO?WXJ4x?@6BEPvO9n9UT_@ zzKBA|T6xYE7+q?BZ}v%1lcmF4>9-{_yfEMP{dSZ5iA|}(m-Q+3k=_c5e-!`tfBmED za`ubCd72+X_Y`jed!9Ee-@ak-%PH13?3jnV&xZOT>+>;t@AR+P>2r<%(|@e15jtNx z_ICxi^;J zZb3rsn}$SdS}3=tAMd_x7zs{;H;0xZkz{aNf$qCHbl*iHL+Yb1R_MqV_Z1{KgQJg2 zw5g*|FJ3EffYeFC<9<_A>aX1VNTXDnV@*^|)*{s)-8-wGj8zrpm98}se($C!M+#`S znBs(ML+gMioIx;5efJzuAOJd!W^CW^EK}*@-(hpIOKmn%x^WBVT&8+arYL zxsQdjx3(BFsthI_71I-2u>L+!PqO44gB8^nYq!I^Q;wuGoeh?wXm2q&6BLtf!jZG+ zpB#eOw}>&x5{@@025$NFQN^Z&!-(97zOQ%aOF~zId8z-n8zSnm2$j&5GLB f!+L8?<&a|MIdU$}V$D6zQL}`j=#5G|RaN~1{x8~6 diff --git a/applications/PoP/poc/res/bg/pop_env4.atl b/applications/PoP/poc/res/bg/pop_env4.atl deleted file mode 100644 index 54e5ab801e8dce2cd9fdce257bb42e39153c31a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6992 zcmeH~OOo3*5QaIKRBEPTJFbcswpY4B_AXa)1B(PnO-Z6QIZlp{MHV?q4w6Og!Tf(W z9t{xCj323NjEn`azkd8^kP^nrg9+!Pf3$@IYsy#$ZbtRkwB@x&emq>AF8&BNe2x4tgHbn4*G4e`c~X z-NP`xuHN5W<(^+xJ`Y;me$u+NtF^QTYi>_gYq!>9&#l2;TGhVmUR3mY?SqqHcVgC_ zy5io+Vo&Z=9bi)f;@IX;F43j_5fMkxmN@M;8^}I?|1oC@oL^*WEUj~|q zG8bb$4AJGTd)_|7brq+$$8zDbm1ciU+B!p@Srb&^edY$wXzX!Fqtvu30GW$eUK(D| zcn0c{({u(kYJ5{&BP!?S%H=0Ej{TeNWhV|sXk6MzyRP0-&JBHUy?8<#Fqa^jd%X+9 zPd~)FhXiB8GMaN>%mA?knK?xi<^VQk1r;+v)r=>JyQJ=NG|cN-^=9;2oQY(~TcB4( zi=zw5#I-DZGg!VLg2f&>U?RPJL!!MP#tsrsz-4w5Q`jTf*gdJ(g;ebz4LjT2YIw_D zo}|6rb+=vlFcsHj*9$!MAM#-iK~Lx@HHxI09EBmTh^t-qPVP1Jn>hM@o}8QKaUT0Q zytE40(vs(~^O(K>tFgm8ho#R+tAgfeP25e>hT3@L*l&zw z;S|4$zMN(p`bxUtVJ~qu`T3n1?O|a!^2c5UZ1tg4u~#)tebF8kdH%0F^d-z+`xEbp z|K}qf2Hnw&pMv92 zAq0~{o_xP!zesE-MbpP#7++8@o_6G@0xcT90(qlr&2Ey^C{mv{wf8I)HC?L>$LqEGeZ6MVlGUp8p}B7cN^vZ{ z?Edq!c=G=3J(e_u{qyxT4f>+RY%(1L+Bar+iUW$n0ihP^njX{^slO3*qL1Y8v0`18 zg;e1X{kTrN-> zxjF#DJ~3i-uw>(IiZh*)A_8C`Y8tjtB)R)R|zS95z diff --git a/applications/PoP/poc/res/bg/pop_env5.atl b/applications/PoP/poc/res/bg/pop_env5.atl deleted file mode 100644 index c55cb875d720a9242ea8d7363baa9647d4aeb468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 zcmeHNyN=vO5TpP>k^u>a3r~p;Q0PdxAi;lN?vlF~h}^(m=FE}*#JS2QK#OGTkH4GSw~rn*&9BdHp7Z#}cQ?BJ=gO{M zUO#(E`QiHZF^_*<-@f5-ym_g4f5Amw|MvaWJ05?2b^V0LkpKS5=C?oC{9j(bkUmCs z+q`YYVYs`yJ8`sacj``e!?@dbeK*+{0TVlQ_&ZhcnX4IVK3K+Wsi%U|E@yNnoKCggTY#qlR;u=e0cA|1S8O`Eh<7 zM}7jY>!;`PZ!;l@o%_eUDx6VI0>)j2N=dkKC06B zWqvq?_(uJVFz@<OWl4{EELA0==*KZLjQBh>I}elq-l z_SZ15%T@Y=>Sq|X`m=Q}@3A#LdnZ=bW>oY$q8?l2r~bU*A2qN)19ttM9?Ng^cEZ8~ zwfwR-kSlax)u!S5$5h`93v^zeDwkTcKQ>Xv>D5ZJ`2hYIRQye@+27I}`pbAtn!eAY z({$53Z_@1IY`%vV(kZ*S=Rk4SPXL-o{x}c-`a=1fU;xF70wW-CR7N~m%;Hta&Ceu- zDp!IsDQ;p(TmVUo-I;Bxo9vlKO@m)yhl`C%YbHEofXj!|$O$=c;LM>XQUbVyNWf`M ziwe>JqvWbwZj>4zWDOkqCE%LIO<=4u#^VZ5#61dO$vBM+uf|Z^Ak-Os4PXlUV?WaI zJV4sO{53!u1Yo0FC}ThyAL$BJvOxfx0$?1NE@e5uMem0Zz_Bk^@PyfD83=y?NC^QT zg(^q}Ye^Q7-^h2~EI@ zY&}l0!BvF3$gcZa1FYiIR5Df2AoJ3ctIB~x4zR~C6q+upo!3w%AbPLe4vB(1Pxb9#T+?RM)42Mjzh zB6<70Pz7nUm%1Tn&xF^FYzm!Dx{KSF*|H07vz#1R>GwY?v(>{sCj1< z4S9$C>j-*b4smm0Z=-#*{L1#Dbb0^w2J7gKR-_KSz2NXAqX2fpTp7aQcBgTU%nVzG z`ZQop$RHtVUZU0zIZ$%kGq;yWo*O8Ya~a7Z1t28%!J{##@Xk^|AV|7_AeppJrxT)c z1eYNs;oUq2qc%v>B$(yXq^#H+tS*Mm85K0xkT}U_WF>c`A{SDX1KE(XLNR84Ql^De zVuqhqpQE;67z*1v10o4)x<@ zl}5oA5MP03d_sDK&Xd41`#C)03qGkDb$+1GzxF?YIQt+U6Lw|%8Go4hkvtqT+;8U} z!7t-aD#E`k{yBG?75FB9Gk#O^K|Us^F>kIvE2vn16;6CbeP#ah@hXO@?_B-SzeWC| z`WgN`>o29S8h?V3Una1qf0#`Z?M>Im$-&KeC2o;2pk(aDzMb={B!sYcbPLd@^=6KKwV` zm_+yZ1RFSxfMyu+JNiDo@(C`Ec!(EQd_S|4`1g!(kJ}>mYAw*tL VT-j+{q?)s3p#x=Q#e%Jne*si$KcoNv diff --git a/applications/PoP/poc/res/bg/pop_env6.atl b/applications/PoP/poc/res/bg/pop_env6.atl deleted file mode 100644 index ead77d9ce0f92ebed558dfd439b74ac927cd8ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8005 zcmeI1!EW3(5QgQ(y(NGHG)UnT!CrIhJ%{$zqoK;!6<{Q<)yL>V^bz_HJ@nYSI{*LA zkVA>uHHtXs!34Y{=lf?kqDV@+{`KzXA8&@IFMkh*7gtxqaCdchh5DawZf{WkcKzWR z^Yu(nd_?`nOVz)8cX*Hf%kK|wQ2%~=c#S&rm+C)%c=r~1l*901xIbUU^Z0(e zyHF0pt6}MviDew89u}OYaU37ET=ao>TKgkqcUStwe>C&5luNSMXphc8RRUOUDCCtQ zr`mg%;E%qg!$08Yn`s~%BKK;PPor#y z$83d1gc0Ho1O5KL}gmS$=Q zBJC217rQWy7^VleN@Ii`wGjZ%ry*TEeY$#*P8`Jq$kA(i&%P`lhU?+eXKgklbGAr$ zRw4-DBV^O`>GPvx({va<4)bYKjz^hzsk3*o$_3)5U4ipmL5aT;!MV}CAo!l3@Et+r zeS!Gth|JL_|7R| z4r>kpyzzkumaX!0Pcmsj&~SNTcoQjta|EC_BN+>UUw;#s%mvO%WSChz!iopAT7uvh zy;mN`8EflqX8Ffyw3ZwT-;3bmbFSCk=tq8gg5a3#bN;*?9YOKm5hUInBJ-Z0a-_FS zvU1+AwLlMvv}hVZJVN5$wnLEeg&}wzB79L7?t;@P)6BK1TH0{CNT+-yP`k!2vD+u=-1`-9gLex>&OZ9bl#!8{}CJn$*<{0!zZHlF?e^%?xW{-(kemp-&a zlVR2LJ+!jc?x}M|h%&OR?5b^B&UX{o=Rs`O#U5@#=l$M2;}9VBV3S{p9Gs>IpCgBW z?2%^_(ha|;<*&$g3S8jZb0qxfS@%zbSN?d$G4fVW{Bnc%g8-2&J{` xNT(l=Ruevb4g)n`RS^tY`-C)kF+BP?6f`JEf;D^X$63@$bFUdXgH=`){R;w2(I5Z- diff --git a/applications/PoP/poc/res/bg/pop_env7.atl b/applications/PoP/poc/res/bg/pop_env7.atl deleted file mode 100644 index c8ac6659168afc040191175c7cc7b9de944a1d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5040 zcmeHL%}yIJ5H=-Q0RpMY1rS79q#k;$#4(q?L9?5L`2Ov)d;Rs-U0oaB~vh}Z|ebZ7bO zRB;$xY%K~7lZ$ZDD}&SUB%kJnwmPc9RitorXUC3r5uV)RA-COdVkAr*Y1(~y>Z zIeTlk$L=Z-^>}?Qudx49`evGUNne-4Z_~W4_K(vcaQPkP`rblgso*6@--M^`zVrKB z@>=y3B4+Nl^Z9C3(4c4$yDjMDl458z^Ig+4d2q-`_^xD;k}?w4#MmTD>QM}Gg58VFmdeIZRuk)qP2_Tk{!%@zoAOdtVpBb?Ye`~(1+8Q=a_c!V^qG^G4_K}TYa+pM ze}s!wlIN=RkV8pyg4u~;wo0Otk3L^?pJuMO8Z%q^4ZNfK{OI%0?o(dT`5s?kIU1i< zHT{1iz5olmkX7IU1a`6L8@7jMwrQeMC%?dr_q{xU8Yvzo9)OAL@baj8NEG4` Xnl!;FCSu+KIGaVhc`A>?>|*f`O1v~} diff --git a/applications/PoP/poc/res/bg/pop_env8.atl b/applications/PoP/poc/res/bg/pop_env8.atl deleted file mode 100644 index 6e34d750c244c8aaf1b138600f2585cbb318be79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7444 zcmeHLOKuZE5bY>fNKvebu%kqdWs4(3;sV?N86Qz-&*C?O&@7_M%q(A@sNcUG47b!hmEa$M!U#uTs{rGadfc5j$3fC{w zMF;llZgL6hn{JBs&#uGu>83;d&8uz({NwC;0_&&QatiDB`T8E#Z+GiESide-x3I!< zpRQ8hdbTYvV}tmvE!ghbgvSSCwnO&YcF2ski2`4y`Eh54GKOmW54ccTFp9E^z6IAN z#~vkzT^{A=9ts`zkWji4D?w1~C*EVt>Fv6}q8sKQB0Wx4&B_>;)$8A!7g|p`$_7$GYpzk23Uj`iQL%oJy7Xb_*$fbyO`FNMXLOHv-{)uq zZEz1(exR1TWe77W?m<+uKWVf&=O35?*Ju^aOan)ziDza2?|UGilKL6K`+kxx@n<*; z_b$J7yX`bz4usHoKf9sx11XvYg2H%%_cT-9kgr9jt!o{lIMs-Wr?(bFlPXh|NXg8k zn$SKyC6NQBlJ0mQMN_^jSut$KfB$MJh{mfMIV5@?qvZ-Ii=8Ul5XG_4M8a6is3w!4 zUwTOL8ZbG8u+cPBBIgRbG^=O(oDC{k&m}>>Vn+%S{mi-1AZsp@d@2&jVcAPej@UL0 zbq%^s6Z@SWGePb73414yDCo1>Ez?x>UV<^)>ol&d=2o~Ywv{#+;&v2{n}xU~sD(AB z?QkJPH_TZ9P9|Twl4D$UTIYZJv9HyoV!!#Pw06N)qNSv(jj>jLIF&!mSk0+ zNn6207svB-rp(0X&ZLjW0Z^$0YtWA6QSpcuLnKUY@fx&;LL^f2yQ~|_gt+$g+m4-G zT69EMUVFWxnq=#A_dM&+3LQ>qr>=N~6|KNQbkTa73R0J}%MFyd1K}*Xat8nnKJ+wb z?<=&+?r9!G2f1xdP|3$>a+lIrt)@Q}fP1}N(HdlxZVww~*CQ3%<|MXNmxhiVQdl;a zcrg1O76(Nll`AGLvumaU*y4UHluUuosDb$!%{zNJL$t1ECY2Eg{w_-;c8)SXHbsGy P&>C%&wIJwUm=xm|6@ZOw diff --git a/applications/PoP/poc/res/bg/pop_env9.atl b/applications/PoP/poc/res/bg/pop_env9.atl deleted file mode 100644 index 3b57c9b6fb5c841328922a94fe38f37c00d8ae54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4175 zcmeHKOHKko5N*N&Ld>v&^=w(NaNz;G0Wd?DNeG_7rAOfodJqrdIk2n0Ro&G!EF^@) zj#}04z52G2*lb>(r|S0SQ?1scky1aCdII))TF=3L&FTv5`;)aVRXv9LxmwP^e#{rf zLWe80R;Rbkb?09w?&*H(*D4-Hk-O2ONB)l6$&ye+{-5pBkT5$CB*N= z__dm-%jI-}uaeb_=HW-dLMQ~6ERe#t80!MH5qdD9;taK#>lx$eyTjqo^?gJVPYWbE zQ8U-R>&n@+{@%Q9KTs>mA?y0M=S1dA8PwrzxvXW3(WWcd&a z6;PCQ37hc=oA931b^Ss4J?klB1JAM{Kf~H0CO&7)>`*}SjzvwO4m^t>;tqVS?!-5A znZk_J33Vv!Zk8>*VTc7MizjTxCv3ud7Oe~A_bjo2CuqEoi6X2$^o9gC7yO2fMNJ|7 z1^Jvi{DxySq~Y=+Y$yJAqRFM2aewPNMcAHqOj>`TyCbMCe?+Lqa9)IkY6Np=f*I6d pc<=nS7p3`7bJm5F323Vj&=tl?525e~1rS3Hq>up}gyv$$`UQzn_lW=i diff --git a/applications/PoP/poc/res/bg/pop_fore.atl b/applications/PoP/poc/res/bg/pop_fore.atl deleted file mode 100644 index 7d6fe9383663f3ac341d580de8be5bded304037d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11695 zcmeHN-HIJW5S|>eBtZ$7m<>UL3xXiHp!W;WJ1+!1^K)hnWUqV#Z+!!wLcH-Ud<-AM zM;O1azN+q?$?Vy)CV_06UUs^_udAx7tE+k@OPZg)`{vi`?YHmmR@I$5RrR|44|mV* zy$L(7>&I=?|N7+q#rqt;kMEtnmHmDD;nPLCe}44j#i4lqefoG&Z=OFtescEUke#{w zFP}a%yMKMA{)5le_g|?0<4g5(y_@2HzS=yeU+3qWXY7AI-#lXf+xf=){r!A%Ld+h~<_p6I)-1YsgYn!!y&*CuJe#TRtF0}!B2EX@dx880u4fp&qv5D}I zUgwDvCO58F$5smM zDoTw77CXzFSuaDlylpdf%yE=Qi&esj>56i~ z&6QH3=$(1`U;Se2V~dw~wcs$2!bR{!G{?mLsJus5UkT16<%&pT!4#b2Y>rnURg{8n zDk~<qpBv@?qP)Y$;3p(toYYe2fmZvNU06oBu?`M!Jqf!2py6u6Z%AO>@@e z2jzv#5~gKRh)>f}FTsbnoA*Q6_WcA6C4^)FDVgEEFCkC?i83^l;C|p_K(3G>J-%DVMh)F2_{6i&j_$YdCo-kgG; z++oSiQ8CXUnoA1|vy4mQAISf6)q-QXY zol2jO!Hn#XAfH4x=KaS_=iM2`fq0$@f&_At>b&zLaA8e;xT zkXV08Bd93~_Llb3%`78hJ!~GoE2@>@MkKvjy)F~7Is`Hqz0(5eHASQ&JXQV_inZ4)H%3EK7!d^4>+AF$9*X zcpzIB5$9PGCWv0OB*Z%59GhxJNMp@ud_*l-g}{(Jidu4njX@O`K(9Y)U^Hpq8|NAyx<>5;opThEgp79aBr2>UlL@@W)yj q2u>S(UhfDnc diff --git a/applications/PoP/poc/res/bg/pop_pot.atl b/applications/PoP/poc/res/bg/pop_pot.atl deleted file mode 100644 index 09fe972c8534d08fdf28a84951ef5d34bfcc0808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5374 zcmdT^J#Q015WR>5Vh6A>>4~TiLLf>a8vE|-18gf2B|ia5L{HBTprEHk)S;)Lr;G$O zJ=HN^yE`*`X9ppWSQO^#y*IPtwV$3$@82u_{yEzziXHg-zB8Vn-M_&0&Mw=NJ+?0| zvVD7r?dd+-vjN-P1Gcv=9}Q9G#TB+6t_}|{zBw9>(4LMszB}gl^LTH7`JZBMU*q_h z*f(N7iTxq=#)NTU{`1-s;k_37QS3Ldhu2xR7W+zUpZN$E4|wK2=$TE-ve@H`!ZJ*ZC8dCB@D~Z_HwOH^(opk4?gS1b~F^nyZI*rFLWxc0nkCM>VB5ODF&`bm(KJ=Nou^ zdR9u1>Pp|ozFpVO6diY@)S;4opVW>Fg91x}t`-7gr3AP(ri7{kSi{|&C^U8aDx?J0 zeVpW>xxHgooajL8ct=X^+&eOy&4IoTAu*xuhzrD%RJO!h%CwWsa@&7z)HJjcAIq@k zen)iWB*Itdk9j9)BNV$(ugvRZd`u|5d$mwO1r2a9eOFc8zq1YBwWDHKwEydw@!*ep z&J$b{oJV~}Dt~(Yf4Rdd3>%%05L;1!|92%0D>|{1?-1*8qxlY*A6M#kxTSv_J32hc zusFbXSXc9fj24}?4yowXfNL56mU7ys3RWU8Rx$vvC*YvRqU9b+cTpX&uUIIY|`qfhxOLt~YdSnkDy%d~jG^sjH6VO4iXf z;=+tP8jjmQH*S}_7VpAWZ9p5my<(7lpB{3lZF7ezm^K8=25hi|OleCHP#>1WLI(yp zsA?EH2SQB92nwrIz>S0iRM;dFSs5W#I>0E3gx@-*!*Q4^cc_ACL%?jn22044wgdt7 zVM#1>V332VhOu)X#Dt8Xuu28oNJv11O)`;{5n`nSjG~6{AhgLHs$kj>FdMMJ5;CPN pK|p<25(^y|>LO&AtNZPQUNy-5>R22Ok`z*Sm^+x=r4c0Z&m;R diff --git a/applications/PoP/poc/res/bg/pop_tile.pal b/applications/PoP/poc/res/bg/pop_tile.pal deleted file mode 100644 index e62c5734387a36849126ad4260bb9ae47cbd292b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmZQzU|_IO;9>AFkYR{)F<>Z+bzzv=TFG$k*gl5;|Nk?rTD6KHG&Gc14jExygz~EWst>Tz?lV!jRWSvbQJMX%m-ezDnxk7figu(am6>^2_ zLKcBeeO0A@sq`j2j%Vx<%#&1KeWg-$N$T$DUw;1a`>&>tU;d^c9z2+)f2Q*b)MqE> zPf=f-?jE9kf4X~v`kQCc|NWWt&t6FX*B8?N>uc%1-AVtCmye%=_wL(Mu77&9xq$}98V1l z(v*-W#WTExP^SzpWNQh-TNgYqC?1}{wE}zzYCxjLj9`x#KBz$^re=R-@|oj8W-Fa@xkv$E7ld491t`!t7rpTqXf|%l$06~mMM<5j=RLUsD z3h=Hg5e>h@fOfqebo~WDuP2$>O%JET#^MHLH@%tI18hE>GVl9F=ro}f*mu&Af&m{6 z?k?k3w*Lg%^BeFHRx>`w^WjRfMEh-(fL|R*q1Fj_(>nWa=Lf9{E5ER42Bn{!f^aGLBPz)3Z=7hb8IE?aZkejS|Tbe z#CbRG_02@L8;l5kxh*pR0aDx$x+Bhc^9ZF)c2E|&m)LgBJKQ;%UN{?ulXfa}aZNA5 zTe&8(E?cHJKOHyXb- znMua>Gxe&|=S$#9JcLsl4(EKSRE#n>L@5i+J@hV|^VLRNgkak_MaJrdl#lRP;32v4 zxnYSU^J{8FJlugsBUePTyOdV3T8 z8RjKEh62VnU^BkNbMc&qmBt>6dD_oPhl9O`VvKFi^T=_-2i)yi@9nY6D_$nCTt!-C zg7+fnaZ#^-zYM$=9ZDk~-#Rp$o`SdekSf2cVA>bHksp-6_IrDWGu}Ms3AWGq!M!j| zu@#y`whgB{p~P0Jd5^cE0-0o87N0y3xtHM$QzP8WPqH`KLqA=9>OtR_b1E9mA9xjt<3W=4n9C;ApqSUeNTx%>k$(Y{2Y>JY diff --git a/applications/PoP/poc/res/font/font.atl b/applications/PoP/poc/res/font/font.atl deleted file mode 100644 index a8a98e1c06f85eace22ae6b938281b877111bb1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10841 zcmcIqU8rSc8Q$mYefBwLX3or+adMn-bmr*H=mY$WRFeMqb4z zRuo>z7?o%gmR*S%^rwVBK{rMhT3AV0M0QpFKo^4;t)9Pc{hfVg^rCO?^}T=3`@HY^ z*02-*X^O;e!em<`>DkL5cz82^V`k8FY>bO=KtXK$s(`k@%T?{ z_qu;|`@H=3#s8!DAK&it|9$+gL{4{@=Sbv-c9{Q$9j<#@?61WBcH~cXnD4p7UrPRD z)p`3P-?i$#E{}a}At@c`Q%RL{cGn``MYvoyv-d$7iJ{|c=hlzv?X4zccnD zk$;L@-fi5wBaiR)e!qRU>z>@bApXa8dp(|weJc3FZ*%@Nk#|Kt8u?=6*0arXS>z38 zJMU|eKRw&)@OJyEbJ9oTU6GGQz8JZ6uW|3)YrflK ze?RiM_*eG1pSSNb?z6G)-Z$0t{qDZ0uFLQCO=SOlpLutlYgt9!8u>uvGw1qzUORWX z%R|TWLD%_3 z>ZbQ-ygoj`yN++RM+*~Xkk=URb7p#)YRbhSbz&Ay%+;+ zJen$~P|cZ$DN{6HGJ{TxqE(ei=|l{NA_P&J8_lB|wgL}*`a;B2JPa<3CN4z-pDJ=3 ze{s#T(J}xUkH$@lDCmBxNz*vE+HWntsM(+o&hx;_t*S(^0Swr5LBSaM<2EZ%!ZHO4 z?BHq8hnd2DXf-{wAu+Xhy33bZx9j9J_>K*vd9(~<$YL=7E9*`SK5+2J`c{>!oFf8? za`Ly|gM$K1v~eoIFjqbp>YXPn1~DMZI>uKQne!xuJ{>hudU*2iz#KnqIf|U=2d2+Y zhPq;+@T3ThBy`fZ)?kw0sV=i5#@v ztOa85D4&ti554#>&SvN1F#` zuO|H zh@T0)l$sV@ocRdXqc9J86kvoQeA=n>?hqqBir-lKIF}Qs#9@E*8o5mzk%o&pLOODV z*aMs3w^PbM#t;>>3v4eU6UzauDip<6sP#9l#-IZkOOLRr7x}j=gJ}!+i%A$pnHD>LROMB`0H_0N z(c4dTfJp)i+M)urYt{9V`Y0e_X%M%GAelqVB{C*7`-?y+`RMl{1uEY@@O~f-ldp`d zUV;ovj3a86F2X7G#&sez#fsu|c&GhU4J}|n!cjAMJX*>t3_Ttyh-p$@iyD9K-U0+e zRe6EvBHvpQ=#tL@4CP9JMxOp`Q)sBF(O^nlS1-9$HRMKC$sK5{b$WE$4=7Ng?84HE znn8$P3!oIF#R0(*^cp3X0`zcL5P&gQnqIUfQXpzl8g4{_6`dxcidXvZWEsa%VNhD3 zR$&Y}kqZHQF+eMYvlYMgArzjn!4xMPqhJ?wZ_(@>w%WNo8=XotV|A;t=2wqkAu zx-nwxAs$U-epB2gLdF@mQvsFK)huomb_3vRh@mvx$^{Pb&1a*DF~?@J0O|X5=nz57 zcz-BCOF*jbFl~Ar_T>~pa4yV}CI#9MO;qRw$0WRGzt=EVY$a5m-V!{o8_rA>lmhnXgRpUj!JPlF~${IpQRDOIbN)lRwr zL`v(4njuiZ(J)Uf&3`xPY7o)}({!}l zf44(Mo68 zd$Ohm8gYlPq|-|UL$3?95;@ToY~z!6xJU);ly)}5nbE?j4L^g~Qg^6&0a>cCDg!PS z)ixXE1qe4mnB<@`yabFZJeXxN7m7n0yMK&WP-zx#u*PIXEhnA+`57f0_WVj)fj z#iITh2^ztinqT4T&8X}3b^Z!pUx(68-CvjTDrx}KftBAs>o_$>1Zge0n=H98@n!`R zW8|fvaT*aE5Wdl!#)O8)1oX&9zYi(&uj^O1G)!J}S-k`qm>5SiT~W*7l-{rKxPVBp zqBtGi?yqoy3Y$-?^^_k;M3jN3V8dVGbaHDH968GZ(P!4TAbfj}L`hP_Y36pe)0*~e7zAki!yXi0lrC~zOgf6v^N^toVPPG?8RP7Li(Ug>v4cXm|G(hE=jj8?i zMUYzk#d1RpcUx0M`jtvQeQtKpbe%KkdQO8*wJzGf!V4$w0sk`(FobDH$K-4F!*Mzf>={P)J&4%Rp@q< zY6CQDmdB!UMXA~jiB7e9D`HqXcfh)FX}c40`5U{nlpbWW&tjKqT@$_c|H`O&oslO~ zE2R|c$c<}~4d*rS9Q?+I6piTcjCjoy1drAJr2>1 z^>Sdia(S;QMb!>NL2M?B_v;3A{nmbk`z-zk Dt%BLi diff --git a/applications/PoP/poc/res/guard/g0.atl b/applications/PoP/poc/res/guard/g0.atl deleted file mode 100644 index 4041d2cfd38b884f5599070529bd6f64d1f5aa9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9711 zcmdU!O>W#q5QWDGY-p8LR)Q8WWE+NdIzny`AnTkWC*d$7Yof6Z5acYm67$}xs{Uj1 z$1$uRgw3DsuU}Pj*sq(^FF*fue|7lw+h2z_uV1}79R5DsT=V$ncen3&{Nw7wdmeAT zzti>A5BG0*{pu)PH zUNt8WiklzoTzh37}Nom&3E(Dp8|u)g3}DD|8<^HKE&7 znUE@HHHyuux+X>F)CAjB71x2dXi=jlH^*wgT!GtAT=4Yv@UD8co9h3`; z!R;K5J(;JZOoa9@-)g3hB&Jr8sCLuS)0Z&k^SMYS%M1f`o=0Z6&Wt0V2QcT9aVaw) zp=U6s-^HAx+nKQvAmjMp%vqQr(Evv=r^H+?F(g}NJTV_`m&@5BkuhD<=`hyBQXHA| z`0PcHsW(M5W?W^SpC!bbh^?riGwGa0hPWqHOowzrKXZ2P>u2TSJqovZE zv7!4A5C)<%WyWr#5AZa|V{nAI4b$V}qerAqz)1-`nw_{3kQzG4Z$Eu1ZE^;Ur!Z49 zFNle$!Yx8hxtrEXNY0chXbjUTys}8D_S42tbN6_s?0z6h<%0-X-Y7rU!HhEYnJO7O z4<=1#bA%<1^(%9!uzb02Mr!WiE&K&g8g{LQUvqlMV{-w*Q&wuRMW%pe3vG{8-pU;eMrB-Tjl#VSF$5?R|OhzVmNZms0WTR3_?g-dcoE3wgZaC6uLra}cCKh%)90dgjh`f{n z(c)8{owTG$C^N8^4l~hpA}<_qMJjTNW4*ZTGtP#XplClkI)z}fs$5_YgmO{mOw7Ph9_ln{3~9n?vEP1L2U&%aCzr1TF4aJC?ue3( zEi|LppBXeA<*%W#;A`2&IqzVb>!2h%^$L_*8q}9+seIi%+ZB&DWFhlHbPto~&Z1%G zbUPXvZCI1Z(swq&{Sg0<`El2)#%56O_I7p&^plOlUcp@)Y-I;0ciQZ*sM&hH?Tu4g zT*74aTeDB7!45kUP<*q8rj7H3IVk3Z#K~PT7u3^G!svPGo;c1#njE~xXr@k>H)f8L zkxwElJUdrl?Rto*Zn{3Ww7VM|BD|a(%NfE>9fG9_HCts{EML7mU8e@r%G{w08U^ ef@=X&ojSZ@$*Ax6J2))~_i*r*P1|6Wj{O6Bxsr+i diff --git a/applications/PoP/poc/res/guard/g0_v.atl b/applications/PoP/poc/res/guard/g0_v.atl deleted file mode 100644 index f2e09a14b532a0afdbb158b604a3af5c04b447ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9711 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 diff --git a/applications/PoP/poc/res/guard/g2_v.atl b/applications/PoP/poc/res/guard/g2_v.atl deleted file mode 100644 index 27c83b109a535e7ba4f620bf1b0e4d5906fd6884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10079 zcmeI2O>P@U5QXVg0%Vnq7nTqhjtv9a?LO`jaKMhB!rc&C9v+TIIvZj8gL@;UlrK)a>9r!D1zo^Z z7#3oSQ9Svq3R4Eb!{%<5fWayPbO&(C&4+>Q0_jW;yKyo@nY#Qc6V)a7tE!6a1v zt}@2S!yzDJr7Kvrc4Najdt*?nG4_Z52J6pmE#j>;_Qwab-r8BVW8JBZf$Fd!ree*x zgF|uyb7$I!T{bwo!Lz3G|HUx41KrJp)D1A0jHHf9gDRpQvGR2r#qJ=ah;vS5sBZIs zA#3MZZiJ3=bJ&!12SYU{mymL9w;^fZLR4g_Bbh=xHIb^pU38K}3z@~*#k|a)&yS8) zvM$>1Gtz@}v{H6zW!=s$$GE9-J@yRf$?~*N()Ilsi7ysT{jmZKZkt7ad{mMuk1ayA zt{Y5;!y}vQ6@46tz*HP3jTFv5D$tQhSGS?9Ji3G2G;AjH_BxH+YX^kV;ip7v@!X$TZ zVWO_hrjBtcL6QXN7(3qEqSD+=Xz02dsL z3Z5*oFq|#2RB2*BYm7%IesYBiHx5WFuY-#MrfD6zBT-4yz7`55sosRaB}*{5^p;tQ z1gX-IsvsPX>bb&*-{FTb!#Ovq{`%3dSB)M{g%MI*Z||5X12W}kJOVSGa4U6Vl|jZ| z(--<8vc?GHfv5edn|Hept6D$xzHMSwgjHvMW@vb~p%m2`hd1*-LW6+4r&1=yI;dW8 zfB`lNP1<~dM?Pj>K|Vt$Z+UJx+N|06Quf){CEF47I-|8A-YulxzMY$CRfiN&-dzoCFBIU{9I)@?Ppt9?=T9X8T*)b!QT6E2f<8_4z908ayE+xrVw3tV#PR7S1FM`-)tC zxMpX@#Tu($t&Knki(LX3p3~dM6cty2Bi|*!s<)2}qj1KS>g}WEe`KxTx;3k}kA^vS zCTCdwnR*RN89u-)9W3Yc*Q8@73*{Nkd&1PTEEmkqXBQZ+pP0V!1eT!088&(Q2zN*{ zFL5H*J3(N|%2!5rrPU!9zO@}ttvCC=iW`h%lhYl>;(a2XSW+xj zFdf`}5s2pAd>Vn!ypf$Y7YI+T9;*bxG0%L#byH`7Xt9YvT*Zn&j4+L9nQu9*oXwz% z%&!Ha06Gec-$oIL77KTVnLrG%kwA19i-A7%J4|kHvrYPHXCe@lx6X+gkobX35Sm3s zT=wQ1AC~jknAwOiY@9P4yxs5$ZF=&?iT+{UpZHQtzbpD!8yM^yJI{YhjNI%mQFO#~ zIg=(H;nGsYA+`!KCYKv9X>+&SWl?L$_v!?Cg>)nOpEllEQ%yd#GP_SG_C^BeQ-6(RM;oewrbGiM$uXct% zD%z#L926pjDFk9F=*sBBMalkj$9urt zOGqe*6R%M)!zEc0$QDvu`K4Mo!ap1yC-ndT diff --git a/applications/PoP/poc/res/guard/g3.atl b/applications/PoP/poc/res/guard/g3.atl deleted file mode 100644 index 3f8bc1579bb22628b0fb440d8b6768ded9a7dd0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5232 zcmcgwyRO_e5Y@tsfgm?PjC&h52JFIdm%??BKM0UIA0^4sO4eQN59CAA>wkWDe8+nJ@$rc@%Tx8CN~_YgE7Psv|DyE$&REI->b}1nowi#PeXH+s zYLx9LiDB9=T^jFk`hFZqDsf_Ck~keG<5(DpK~cmqO*2VCDI6u}GfkVENU3XZS_aZM z8feKNC&|Q&Gd@4d^cFPZq`;B+38`rs)(9iTI0z%fDPT1TgN`KUkeCt~O@krFNY8;o zSLbLLJjGRd(kR9WVT@{=?8pRqPsNyns7WcO>Qtpq)!U5?QaoSmZTh+!YC6Kc?)n|L z?L%CO&4FM=v65SbYrSPpslHwhq2dO$dI&^=SBAJD9Ai%i=}Z9gtPLV40Rg6NOGJ0G zLPSD1h1#}56hW@_um}hULR4sQXp{jubVVtUVd^DF_EPA49){t9LBPo%N|7PY#4eW$ zkpPV&fbmS^av`Lc$s83Y#j=LfehhK^I%kjQUL&C!jGYNjFwMUEahNQC7{U?>D~pmm zv|;H0B1N6@4Be~LJS9S31@KeGM-h=}qFc21J2uG(A*-si;gi@FsmHv^W^TWDS>5`z7?>w9Tk zRSMn$jK!Ch$WWC4rpU|cq%FZ9RQ<@}No{i2T6S9SN`;9QCT@NzIBN-ltSIJMylt_o zQKU%fy%xT1OncrV)}$K>(iJe{Dnu|krk82)@XLddqtKn#Jd5xh<9-+MDk# z!H4Q&mF$%E8SU24M@oI-;e1qh@9Dnuyb@9gyHwF4XuZ(<)O31Dfbbwoy|+0};!B!5 zQNnAxHP2Wc(Rke|-hwwJxxlrv^Kd`gxS-)2QXW#n*`nyhDFovyl0DCIwZsG?Pv0|} ziy{Ff4+4gZSRo6KGqHS0o)wPIfjk}wp4Lo{EIRMpIeb#|gA1!S)%$PKjP$xC7fhCM z5`-6&q9%PxI^-1$oJuB=V%80!afIUf$cgNGe?=UjxHR03A0)QxF&zDA(001o8x*YI zN)STxqXP}6L@nSFpbYIR$Us*>@7WefI8gz@DT3m`O)4oYk|J_UBY>Jl7HMPMwZCx~ z_(IRkB{!B)q=WS%lh#nQ2rU}6-j90{4;}87bGFHZ(0Z)i-T!p24!mx8rb%Xla-oXc z5niHf#eRd!(onNFVPs*0JKDN*CRo9JKbWe;-_&Y2E7yE&xJWhN>`|IGI(5no9z`nS zbUfvQ%9h#0HCP~QCuV>%S3*9Z2BFw?lgyBiVZ0**f7_V5Mu<3;aqG8__QR({T|b<# zM$~c-x2f#8!+y|t?&83m0UUnBe?I=ctb`{H7;!UTZe_K z?tK+2)#-CCRvwSK=2$bFMH->)TKzQv;s|qZ`YYC&H!-#1N0qDvxHV5Z)0+Jp@sGPH y%vX(M6g%_Ws$^tUrfgb-+`ufkHnX0xK2O$&Vt;W&Yf5I!i>0Xbxuj|o+WrNRMT^7$ diff --git a/applications/PoP/poc/res/guard/g3_v.atl b/applications/PoP/poc/res/guard/g3_v.atl deleted file mode 100644 index 0cc147a78a6932d836f2b51e20fe51b624c97d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5232 zcmcgw%Z?j25FEi513@-GjNOYb2JD05TMj-4`GWvC=c6?8j6}&h`hk2%F8QHcn5uq| zO==_=&Vz^HbXRqg!!Aihe|$Oo_wD!L>D^{C41c`Xpbf*HFFw3x|I^El5A1*V z=HWg2-@bkImi=GfJ-%VTeE;~wp6zLPH{`DEcAaC*{J%-_yf%y0H_uylT%8^`M%tk{ zz3;bZ^xfm6JbfZ(cPbeyQf(M1rFmA4l9(H<1mp}#N|SL;S#f<9mT(d|%jtBAl$t7V za?dfAQkZAit#G#K^Jk;TSQuW$8pqLx1Y9{>Af(9|1U4aQf_QU0Q!r<=Y8k6K^sV8@cpYOiY=-<{czv-!I^I{B$1ue<#WBvl zfsS7jl&|N*N{wSPLNr*;XvcR}I@;lVyFH)RF~r=0LQ3k&8)GU2Bw|E-Cd(2b+eeZG zYH!18$__eUG!BO_-H~;$!$BeFcojlefRauBU||(X9rO&!elHV@(Bb_23}~+qMJyRX zJ{*7m+b4jk?gGhj;9;VVQ4Up1qVQ3&z5%YHG##13n$n+awotI@iLx+*{+Z=Taz0|(ja7|&Jo>EYZ1+X;%i8`HH_*fI z{>zlUTf)ezuT#eT5DHoa#YyGlJkRqd3eOU6QnDOC(jUe z2=91G!)@s{&$h)5=Tk_huYMQ81gA-U(H8K!%b=X1ezC$A%j{a7e4;#@hsl$-EPlDH zl*p6CAdi>6)1f251VJ7o%D~`-yPO3`n)(1y4NZUy(kdaoy&B%$)r?n{D;Q(ty;X`V zY~);s#HyeiF*wbr4`ZO_{w6gj(x??5FDRypTEq)V6-3Ey_iVqZ2Q3IiZsFsIYl4?I z%77FcDZ<2;*!7y9&4P&ni1GAh&r(<#E&(Z0d>Tn8WEh3cPI0D|h z$^d*c-o_A02Zr!*v8_ul3BZ z=6By6nBU;kwtvL`d|J;fO9j+3R=v=!l+MXTu_6`sqVlTK-m5>i=GCt+nw)VMl~brF z4c_|q$9`AzIm(|bOp*3_Rb6(NSvk&dyA&yims1uh$!JiRd`0ml)0O@mWK=A!q`)eJ i?FTVe9Bw>83kR!zJA>8j9`=$F?&x#(N)bWtn12H$ri;V? diff --git a/applications/PoP/poc/res/guard/g4.atl b/applications/PoP/poc/res/guard/g4.atl deleted file mode 100644 index 25e914abe507e4d1a1be84bf58c480066c1c11cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmcJNL2kn!6huju+2#OQXW1k429l4d?W*j&DtGOCWyDt+hgYv z!XmVz#``Uu_5WD?14M0#JjY{3LhxE5PZQTbK9U{Lbd;|iuBfJl5ASOwQ4ik2eBHh& z=o;W|F1v;r{4nR7I~!_U2U_z}7oBs@EPaL=_Ky2jlBISb!~da(lx<3cFh$&fQ(Xv9 zm{o}Y>xhRCvGzliBI+3%EVl9v} Za#6+1wHT7VuCfkdtDfO1l$c?~+86EG`mg{1 diff --git a/applications/PoP/poc/res/guard/g4_v.atl b/applications/PoP/poc/res/guard/g4_v.atl deleted file mode 100644 index a3850147eeb0aee25be2cad324b047b9a39fd289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 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 aBV}ovh~G1$(xjwr**&Ptw?(||75IOZ@WC(u diff --git a/applications/PoP/poc/res/kid/kid.ani b/applications/PoP/poc/res/kid/kid.ani deleted file mode 100644 index ec368af73fe7dc31aaddb6db645f5562eed2cd6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4150 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

Hm;7HFA-Qm41p(Pg&a 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 BiS_^h diff --git a/applications/PoP/poc/res/kid/kid0.atl b/applications/PoP/poc/res/kid/kid0.atl deleted file mode 100644 index 865a068645e53d35d5738b12020db319a404989f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7263 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 diff --git a/applications/PoP/poc/res/kid/kid10.atl b/applications/PoP/poc/res/kid/kid10.atl deleted file mode 100644 index fa9575268b2c95100894f72515cbac67c1a70790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5263 zcmdUyO>WyT5QUYZC;|it(7?Gtk!0EKy6p`LblYVY-MWaxm90bc8oi_X-u#e5Q?g~$ zS(FG&iu^SEnKwh_+t)9juDjPSf4ZCJtE;a2`9|vxZ*S%K7{rP4i_4m7n zC-T4FZys5*+;q>~w7v}e(7*$_QX0oGB^ldI+h4;l^mssLDZ`N40`9h3U_;;IUDULI zlF-x^e_>+>t|y0XR47RxGzyodJvo3qIU4a|c8%SkfMb#6IayQVNNy7B#r8omP_pAO z?J@5}5R{a%CboDa31yo0dna<8Q9HOiFw-zw)yM^WSJ{(?>^nShf$CH2-F&QXMBkCp zB8QnDNCw|w(2kFui6^N(cHeQ7!(O{Rh(UcUzDuSBp`tb5mG1(W=TzS*SA2&zWdn|h z@7M_+>#qH`EJ;0#{v{tzYOV3`?RjzMGrvxa{mdBVrY+v<4ch^!GT=Oq_k`n%WNr(| zxTClFp*rOZv4I)I#}@CEb1U0)G2@u=p3{Nivz%yVG6x5avB`<|633*rjCb_uA}z|X z0g?$)kT?bgN{VR-Hr&VLX5*a$4*Bb>?=G(e5o}J@+~HVe3=hm*maGNJKjvfXitkA- zq7MxVYpFx<(z; z=4zRn)6My>oGb#y$k?~g7II;%?gm+ROw;|Dn#o!?G*q607EIK6tlBv5MXp^gZg&?@ zZ${0S7EWr$l0U3w;T3aeQ3`e+Lkl8>YTO@`D_U4E$S~%;owdOIxDBaAGu;1y77h$b zbP#Jw0FP@1pni!g+fw5KHuKDM{2ySu@Xh5ljY&MeNm6eo)t(tmn>*^DC#RZDL8%an ziN{>6T9wNQ&Zvat4otwqWLR5=ELFHCBzNEX;o z5tC&z@a*HxZShiYYkC6cfJ5T-#!Y4{Luw)X^6uxOolzKxO;2c*Y((Ki5|j z2`^$h`8>8~&N#`J&!0YAcmKZp?rxs0uDb5~t60B#eJlO8bWdGqETeG4FwgTagwXekas7$+gd-J8-&;#+0H?n1e>{hgV19<1I%q%> zbDYTa&(GsHg=}u-O`@bw<{7j0{fXQ-W^-sMAs7twFbHhPWs=i`0EPwgPBO1-SuNA1 z+{D^{3KqgNg)pG-S}XvzVgYDPtsPlCsk=hfH`%`=c5CCydoFg^2fa5S#4*OUVT`cY zad6r!J)Ao9fQy~O)X&jHa3qH0*i9kcPfuaf0<#l4ALD)=a_m$K+0U5-mSU$d_OTO? z+uyQt{VE+-I&LvnYDcwr;&xgxm_z9ubQb6-U!wR z@{lxxJoX8nx#)4xg5-Od$aa8e0G(!Pjykl010v=7G)9Wh42OR-Ew zhb%@hgv)%V6S7-)0>rY+ce!uI4U6^R0xeifN(;+g;;`TRlupoY3|%~fb0QZJCaUQU zj%S>VuP=0u9o68fGdR)oV+!3iM~qxNsyVO4E?HtDVkzC3pB6j6O2bmw7|j zw-!2vI4WWJ&dc6qOQ~}hPu7+9XK9PQE$Z$iHDg+^>1Dgt3F3E3J8OZ@oSV@TD3VSK zyPA=7$NN~cP`w;Qjjz!+h1zIgES}D z>LuCS$1qmN?NC?NcPGv4|BOM^d7-&=yg<`=)JCh;bd52iaW84wo{RSNC`iFhpEJ;w zfH}CS1$+JAG%eqRg{-WD(AcYKNBeRr4NxGKz2 zGX!;8TD&X<4Y$a+4Wp$7YmFE^h($ diff --git a/applications/PoP/poc/res/kid/kid11.atl b/applications/PoP/poc/res/kid/kid11.atl deleted file mode 100644 index f9ad6444bf75f1184392bb5b502d6ada5765fc43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5915 zcmcIoOO6yf5G;hAKpF`cV8j7HZ22tMa|0w!QfRt7o9?<0mv{$w=XpyLksnvuEKUfL4&Z z;eDku52bYw=E!cC^@oSYf$V8EXNavIL0%NU0a3v#yALtF3#23|XNaTtG`UYH#~g`# z90UDP?V{x3#{^~=(eXIW6teHf5XF~joi#(PGm!-mF{VeZRn;(quqf22q8o=oRZ+x_ z(LSMqX6UoldBiXzD3~f=993Z!^)-lPD+LjQg$*{3LudV8?kCs~(3|07CGkG<@t=wy zJewQl6|*G04>L{d!Hj%CeWEsYjoJI4=uxek^gK?h5ExsI-DT$(-oWxsfN~$0L@YQa zX3OdXHSnOaba9eXlIo?B9v&7WL`bV)_tAm@q+@8JQCMR%x>kNumZ7MfP;Ujm0bQ{Z z!8=0wU{2!!sx1lv4Oe1j`Bjx;R*4HB4gJ;d>3UU5+MA4;lXXXlSkuLnswf%;pmOO8 zrEHF&Z?X;tRR$=)Rc*~VpfULtQiYaDqzG6)4{XmNDTP`Xu#DZ9w8TLVUMIov88?3y zU2bJRDB9Pq9P*u0LdoP zxem?B0PS}8+SR;;ye+gQh>(Eunl@g*%h_)@GG$J%=_y+JmgC^k?{WOUOpQCR$P z{esnt3lWwwFt`;O3&-ML5trSt(%8Is7?iHIBzL2D_!0{GDhJi!ImH4KN*PxJKZ_-> zYPmb{&2<+y9tvlt>KZC2$Kzh5Hk^z~y^^wi54AQ|bFJAI!?$i#`9+1JUFBhAsywhm zz4UA$2LG}P%(Gb>ML^wKbc^Q|qkVAXVb&Y0;Wk^d@FenjESF_N?#5{q%Vz zacX}o^|kEM2|m zS4~_=Dwf65&G5N%--j>@yd9X7mV2oM)N_gmDay;XU4%ggfnpgA_=Sm4Bx&mTdrod3 znR&xQGJ-#&84@fZCKfV0@G2mg5We6cuRPEE7j>(}e^68)TS$G*i_tdW9Tza}`dEq3 ON$i#3PsBbZwEqXAI&eJz diff --git a/applications/PoP/poc/res/kid/kid11_v.atl b/applications/PoP/poc/res/kid/kid11_v.atl deleted file mode 100644 index 5622703fe66ca25de3aeb9f843206d598f5f70ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5915 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 diff --git a/applications/PoP/poc/res/kid/kid13.atl b/applications/PoP/poc/res/kid/kid13.atl deleted file mode 100644 index 8d3440d19e9d10aba88b5a0d578706db07d4679a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9521 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 diff --git a/applications/PoP/poc/res/kid/kid14.atl b/applications/PoP/poc/res/kid/kid14.atl deleted file mode 100644 index a63711b27fbf1ed104f2efa4302287f8ac854f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5823 zcmcJTOKub~5QZCx1ribx8AvwC3dEihAZ~!fNd~2-*-UzaI1NYR4$c49!>;nUXF4LW zly1A~bNNx_YEQm@`}+CS@ciY^aQorKi(&Zn^7bR&KVMx-`{DJ?C$|5-xl;Mtt2?%T z?{+tQe|i6I$2ZIE@L^c291dPveQ!XP4a~D6`(+uqh&<3V&yz20e}DLKfSP}$06=jD z2unhgD9m1%F(OXPvzirT9BB!*DXWAukISBnATs_OiTUA(LIlt_i4mpbxlFJ|1a^f< zeTi^2)1m~bQi1_TAg7H`BE(UGs#YsRq|Yn{39-fqG@VBlw*-TA3Z0tma7PnF0)=+B z%Bg!ibOCke1%ys{Sm|EGaAT>jRU{VHlqx53Jl+l;%eiikLBD@I2Ymu|))YbhM9ik? zY#8f_>@W|k7Rxpb1D{VNF1qQ)&ZNSu*>jGta}EEO#14TtD(#-m%n(&cwWt=Z?iAkY?P| z=B07=`{rBUnn0ZLOWuk@n~{7!o+FM*v`7e`BN2YdQ>0mhO8CK@L~wp%7&(FOnmSyN zU^t!&3kjGhw*fAL0q(_+1w=LNN_q22V2e+3ZSYvtU{=MF6G%3}hR$1|N?1a=89s$CpDl6ybv7hQx2L2weMK*SYc&enSS&NPicWk3 zb@2ef-~l0b{tWRBNec1Z&Lp(Om1`6uO};J?R!Zf>U7}<5$O0v2p@wW_<`YWohbWVn zF9Akdb|es7Iq<`&X;sz*bB`g3RlB0Rd33^VXf=-$b3;NK?9@)j+8UI0U>$-*+szJh zmF}5os;O}<92{)!PcF{yEf8Yi!g#y@0Xn5Tr!nDZ>@|=F7WRVCM@D|z)mb_Lf0K~A z)+pbE;`Zo8LFBjFI7*0c3W%Z-E~s!U`+XP1p0pSebH(HGAX?m7@nS)&7hGE9;dt^#olN1pBD^=2cf)R*;|{H7;F|0e@fA-BirUv| z>kTN?6QWjzBJqODxEk)X9S^x9&?rUR2us;Ijvi$dm2D78_6#E3+>WU1UUf_o*#Ke( Y4_>fM6fmE~VpwUTqF9-gs3GQ~CSdN8bP1 z?+?6w{&2VFmB+DpXok6?ZRa#DUq{x7;nk3??>l!D1D)tR3@4L(v=YA8j!`- z;wT}qXk!=<#T8;eq@&S#j3}lc)jE+7SV4}><7{1TD7P&oiE^6pFN$A`*b- z6B^w2V6^A3S)ev~WUY>J)1jAC*G%X-so_+H%zs^~&Qd}pVcj6QG$yqD(JQl55$aBu zbb=5@k%jZ7YQ9_-EKs#t&+`0A&ENm$yL?MMS4m$lY(w>IKsGtE?hR&=H)HLlOIUz> zeJ=IfR?|HNK+<%aF?gG^XtXg~xfBq}?|hb-2zfze22Y`k1(A$!#M+8ZEC}3Z(qyFX zxuSI6%8G=kJ_Zs3Z}L|VE5&>so79aFqPCT~6kWMo^rp0v+n6Bq5l3J$067@ZN2UPC zIFam>z@d4Xee;DU*N0n@)IKTKtZlTlW=8buNl#3vHCFU%&Owjzz&Y-G<*HC87z`n- zAXs5~b6R4Ob2s$gY^&%4yygR7_7i0CSeF zR#rN}bj`>E=7E83Av;ha>CPrH%$HKoBWfDTUW>6gC}Mf%is=g9N@ln4ojGM=LAI8w zthH5!$YPp`6*T(e7l-pg}VMM{vVW^Ub_-zTu5?*#G4qRuPw zlFo@p5bM^X;QKSEtNf~)fg+;Io&as4yf0&@>$A>BB~HOK`Xaw)We5F!WMv*6J{_sz$&PwEl|A!$ft!XoJo=?osq?32M=6?FdXJ&fj z;S(oiF3JBBn7FR&CF5byzUoz*9>)ZnEq&ie&STmN!!+B^(Cvn%syY Ik$C|A0%}{UZvX%Q diff --git a/applications/PoP/poc/res/kid/kid15.atl b/applications/PoP/poc/res/kid/kid15.atl deleted file mode 100644 index 2365673f330636663ed9d34de9e25ec865f35831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5387 zcmcInOK#La5Ookjk&sxROfs^RNKqujmLqTjBsc{-BQjo1d?8N2niZEa^oNYh?(Z@Fe%n7_ z{QItd#Q5?3;Rz$ILwD27wQHE?=M_HuJpDMGP772pTqSlI6f}%>!zO*O-vPv_z{Eqa zVVb6q6pyNypre?k(O}#==AdCZOiFBHMzeqnPDt)-j@c+O52iR1c1)Htp3jQ8^9V$t z*`49&&}_sA#)t%M89pD4dJ>iX$#VeGzkjMcKt@ zOs5^YW2>T0sf^WPx60ipxP)D{XwF0Yc_k3?rR>i|tD1^XcX;$vhxrWl4r z6#}=$m^qei%;r?|jk=fuLJ01n^eOPkW-vU52JUe(fW|VquS4RD+>RWdJ+iR73*{WOFLljl9SO zeGET!n|I;ZzCqJcQn{lrIqsmL^q1+>{O~qyd}K!TZVHn$*Yztl~8nt~5?{tJ<<( z$nv_%Q2}lXuIMd4R zDXdXN$Iw5@)bkTl$)!;AkBT{p?9Pau0#eVynLz^en{XDhH;LO8&JcTH&|6;^JE3Kk zL#OII`;=yF30lm1YA^qWY!-<8x8joQ#=d*J)DM;58))yS0D1SgFakud2^_%gvB3y9 zb*kSe76YFnLRjrvF+uUgG8N$BHa=Vm29#tHu%xOW&C$Dw6eqAD7$X}BLA+)X64?+& zsnaR?hAyUxLs;54%Gk`dn@aB=$^X$^Mo^8><%^%iqKe)MnMBqx5DtU zGe*i*%_Df)B_h8zM^777c|FdVM~?n&EaFgt>fsrdr4(xpxk!_SQ~~nEim!MIPZ(ZE zJcDCerx`!VP#Gzwq>bfwa?Ed$YH|w>;-~T=$GAyO^AKD1^KR>&<;r#9SyEEtSFV62d z|M&9zf%A`7=Z~EKczycBnd3CP8J6qgepzmNt8pCv8Sie#76mpE({REd$BY>Z=DS-4 zbO2K+gklllQz-?IFy5C*S7Hoq4~`Wg%R(y*ql%zK$O>}uv=n6ZEM?^obsL`|OFbF^xJ)cnEG){f;C79oWOIXh z09F^bVeBaC+n@nj*~7S^e#aPodo$cTwxXLb71%3wmb;qyohoz}O;%~*){qtB-FTn4 z7uTk8pUv9i>eqFA7QgDDuE1nW+48^zgf`NSC@mLFC2)tcv>OeCfjgLYb9Fq-l8FTf zG-SkI2xqf%U+QXZ8*n8UhRT^|;CMF=WnqL9PQq}B%5NhbGzwYSJyx-scfNN<62CZ{AfpAJAl1qs#`qmfmFxk{$YfJ&j)BI=%9%o5>Vv`)7?@@eHCU^hYy>fgSx|HDKYq8?bAF^x6D#OOy#1TZSBl zENun5QfHGQSH5|tFiPJ|09sJWzK31jwVpPc1+p0|%9f{r_M#YTp6L#Q2qo*d%n#SP z0=!o>d{*-{-jB$Ymp`6{PglC@N_RY>KV)*)A;=x;c+exv?s1nWhW{ztPnfMzunLAJ zRr1KHxrP7iVq&fAyk?cLQ9N4ySe$AiE7NQ`=*;X)T+_t72 FKLHK?y}ked diff --git a/applications/PoP/poc/res/kid/kid16.atl b/applications/PoP/poc/res/kid/kid16.atl deleted file mode 100644 index d7c351b02c851e23dba237b7f6ac52d3d39b6f56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 zcmcJRO>WyT5QQ1kMw`S29OMp3wmm{`P@ts^Dvwt_lgY@+euKULod)tY}^wA1*^3j zv@2m!;3iToXu4(5IA+1{reG~Ug3<;H#KiJxDsz*<;h`H2!$pgViZuv#5f;O4DA=Id zsWNz)(16Bw*2Q!T2rSp%r{|Qfs*8MGVGv`3BXrtKF6s%160Q!zfMvSTa8$9V4N(kA zSZ-;I;+Uwx_!liz#1mQ2>VQq5^bzwmV6uesObOOfR4buf%=!!Z78nP!{pzP>Qf!4} ztet&GE58&vdf0VpD^D74x6D4{4>rK%`k#`+W6`0xg%;FsjHcS(vwE9!=YCOcf^X>2 zSlRl4YN(151dQB!_kb&;b@W(UJ@RmLosaU6x9O#_?aThNzwS`frvmvx#L!TDi?im( zB1c4}RF$t>)pJoQUMOD^=OWv|IOvQ(vunpmI~fP{N=n(q#59~`ApK~-J3kr?23j~j z8;wcdx`^Uzl&U8PEs;~Nf}L?y3}R>zt>t2_8St?1)s`39ySK$f1&gzSk?msV7GyaC z;#GBvT7)agvO%%*|g?C#1ZMC$Na#gWd+QKjQZ-UKIE0B?9vrL#e3#-dgQOYV# zlBE~+wb)><8pn`S! zsess6kq3ySW1D`Bpd-?2CRirrvMBWyDDqXMUtZ6|)VgE>`NA(OTorO;TMD2iOus~{ jn<8vsi=@b56P|tuNi)m>2I@G=t1Lv6nlj15@d&Yh=YsA< diff --git a/applications/PoP/poc/res/kid/kid16_v.atl b/applications/PoP/poc/res/kid/kid16_v.atl deleted file mode 100644 index 06cbd36cddd9194b8900991c590950feb8a943e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 zcmchYTTUA>6ov;iQ41te5PJY#yM*qbQlGkvbjbKA@rKw$7twcEiTnTO;yE#fM3tze z*c1En@wwVRzJL4rW%&5^G;HoJE{0+A>H41I@5Rl6))=V?b#k-`ejU{eNi zNCDdJMVN1uW31z0Ig=r^k4ssWIHOP&sB|cTWFW~jctxpM%2WuH=^D-z`*RjULf28= z&k9sY^fNqwrZRg_vq87S$?M_%j2t^BF&J}ZMjOp(lJitcC_v8y%(cg4G`!{p#l?k& z^WIx?k2Vq7GyuftW! z&9IPwji8x3Igg_#kn)jm&S9~P$U(CH3x<-@O|Hy5~o6gFtQuL;XFrjH@*QOLu-L5i?6ck*&IPJuFaBxBv z)!K+PRL}Rr=i;a(=@%8nLJ^V-w>7(E&09X(9l?Z+U8Jnfy3qQ2Pt3ZlcB8#PS69PK zvAA*}UtAOc_Fve1aPabo? zg5jWXHB$tO5fg#zKyt6%qJ`Yau)>M@v{!HTKUV(`ej3}C7G}*#0pCmjcZK?6{0NBd|bREWB4gb~%Y1 zk7%$olXmi@T(;|#?R@(9;r+wm-mqi zbGiTP*;C=aUq61!`z%+(n_;q0engQaCT9~+yd^ZCdznW%GNd0Wx& z*xrwKl&NbuaM3gu&iB(g$ zqy z)E%I?V#02#r7q~e^DduMXLU z<=qGR7aYsEf*td{0L2t`DJfTI=SwPWQY=^a2F58dMGv)A%N1%VwMeHlA_7%rf#kHj zids5{_yMEbR}gcGdlU?mm153_$?n5)Me#6K5YYz#E$noMJ<9d)s_UfEjDGj92WlM% zY_wYGM8+MXMW)uAGcu+XC^M2Jya&ZKGiln3=d2ttVG*qx!5V6I3MR`!noY;*=tNS5 zy5jL(s?bE?-e#x}p-`KByLgt|65-%%ju~JvONDA=!P~B$#<&94=W?;+@`Gh-vAT9j z^G?M9DSoS;#jTx+P?U1Bfa*9Q=%Uj!#D`rvZiIMj0DeEe>`CKbB&_iUm4l`(caI^) zV26|&sn0DjCaMD)p}mO|p&C>y0^vg$)3+-%Z%;8CL4`6nzWgALv5)o1s>#q6I>T&j zauZ3cO3jhl2$AhcAF_O0i5wia2zpVsm zc{QHWAz)?FIbDrXMx-I+p9LYND*!72HflrY&5lWnCFPOyJB0~9qIkup1kGfce z=pLq=fWApvVNeF!U@DVXmLTOYFc$bkiUb!u7XJw1h+|(mf^!ywHhvO*SRxR|Qc@pE PEPd>dCSlDqv8I+k@_OgX diff --git a/applications/PoP/poc/res/kid/kid17_v.atl b/applications/PoP/poc/res/kid/kid17_v.atl deleted file mode 100644 index 6801a59c1f06ce7788190d9bb429125d61e5493e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7389 zcmcJUJB}PT5QbZDUJMu zBeW=^7&ABWj8-OeTi1TG3pc{Ht>TLBhkgI-#(`vRU0K1G>$?82elboAB@S*`1rXRu zj6*6E&FKvQypuj!AA}OjDEi18fNgsK_vJG%9a0}B=fJRBfq^2%F?EUtQ7k5y+X(>! zw`Gd1r4R>i6uq98H_Q8ZJ)D~(G2?bFIBMa%JU(8|A%u0gjPlw|TsXpM47~nul{`4b zY^2XPF?Q~C5}S1TH0*k4|MAgcyMh}?-7_CppDKET;*y^morh16rF1gn6f#$5#hQs1 zoXAcm1Mh{vjDqVVa_@QQOK*cJ8sB%mvY{4?(~7v-lEj%`B_AkQLHH30M@C-?qg@cx z69qmc$G6Wv3#5S?-OdPncCr}xv3Jirqf}$rb)WL0%h>919Q7OClKQ6pP%()yvYd_w zEB-i%O*(xNcJ&xKS2ZSW=+7u=X&&q_LfmL>cizFu>vI721KxX3XPI{-rUPXWf}5Uq z&|>R&xU_cm=N-))#TxU@e!;8AF53Ig^A0pLvEa@stuwB+WJL7Ue z=Hynj?sZdt%GuWcjI*36!`^aPcC9DTc@CanuC+<*+Kj1GdK*ej^R8f1vjB3xX$F-= zYxOLUd8*O7BhLc+p7tmb(t+|>pv)DaaJ>nA>vC@g7B}VAg4)s^MIjFpPt`1-=MWv7 zYG`6#!JUj9L+U*WO$N35DTIkX$gFe-soZ&d^>s#R_shFwhMU^(;51N2(0tP42RnAq z2ASw|^!k|emO)*L+dgN8E{kTnw%8uY2r)PaKY^h7x(IXIU_(_CZ58b~0C28naQAY(x<5ix?nwYv>{N?0~Gl z)iFK;DqD8zpW%2Q$;DIHY29e94DIlT0iw zwTqAk-9fo~KJ~k;l5!WTsUB7yh&M`Z^lELbiXpEAMf~te9Ay<}^96*?skt-^8m(dk=G}bn!|ip6JpiS0rTD zDdmfyveE+&%4CYSECyCgg3Ef6Z*d<1hp>_K)RrAY!ucg}(4ACD-sR=5I%Rf+r;a1O z&{VBFQW77pD1p_|+xd1>`PZW=q*8pjd1r>gL X$=of72>oxA3RDt(VipmP9%23k)HUbJ diff --git a/applications/PoP/poc/res/kid/kid18.atl b/applications/PoP/poc/res/kid/kid18.atl deleted file mode 100644 index d964cdc6727e1943b2614768eceb4f1e46efea02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5529 zcmd6rO-|h~5XVDRRUo~ms&oNJY*^zWP^l7L5XbZLWIP|XAK$)y`Fz^_|MsKX-<_Ov-LE%ik9dB6ySvBp=es>W|D2vb z;QiC?@)pnE@2_s~{P6MO8c(!+ch~vX-;Pxi$8nmbaU2CW`rdnIbdU}M0fccA^w=MU zr(qa?s*GNh64v`8K(vTWfQ! znX+^e`nKeyPBs%SeJ}HuXd5GtoMw%D=iKVID8#c#G;2g0>kZ+y&rpZsbckuYG&8pi zvw0SUG;OL%lm_Sa?YV5mmIEJ6=n-$x2w6MHbZ6a+M>T6b}?|$#O8%+z|N?ai3@{VitWVfe!H8r4dVe z$ce<2sYv^K&50KUTW7C7t+>}wznMjxdB=wv;E;wpQ1ni@;Joy2>K^iNNX-<;`bJ~> zU17!bltRREViqNu=?=NZQSLLr!V6d_{eD3!maD_Gnei?|iYWv-8gv5VxQG{NcS*wp zF*UHZ@KlcedH3+5J!L-s6})dwJF=BxzSUw*k5xF_T{g0Of8oQ3!lJ4*M0u3t4udlv zhY%n%#L^lDphfR76YaAmTpX0-3}ZXg!P+yhdIHuc8P_wAOJ$bPv#HTb z;;oqnfQu89{oFR^SS#SUWxQ{hYsV1t6c44L#~Jz&ao|VN}whwV_T*c@5;vK_Gg}3e9Z8FP%uu z!Qk*^r;En*nAC`??q|#DyW@GMZ`j_0NzTp3RrPw z;YwblBI`?GpjEb`{DQ67;3;halYBPoO5Qe#Pl+mGslR~;Xf|Yg8aCgTr8}}!vD*>kE)X17*2zjk0ISS`7|Mekdn=8M^}=Ogo(fi G@Bac~-w7N5 diff --git a/applications/PoP/poc/res/kid/kid18_v.atl b/applications/PoP/poc/res/kid/kid18_v.atl deleted file mode 100644 index b33360798048cf4373d67a4440d9cbe6b6bad17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5529 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 B^~L}I diff --git a/applications/PoP/poc/res/kid/kid19_v.atl b/applications/PoP/poc/res/kid/kid19_v.atl deleted file mode 100644 index 25a2f726dd12b459c67f8459a4958d7c339543e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5872 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 diff --git a/applications/PoP/poc/res/kid/kid2.atl b/applications/PoP/poc/res/kid/kid2.atl deleted file mode 100644 index 8e2f3a1a27eb04d7946c904a14f3a6e9e929093f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8145 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 R!cK#BqUV73u&{Td{TGDd2VDRF diff --git a/applications/PoP/poc/res/kid/kid20_v.atl b/applications/PoP/poc/res/kid/kid20_v.atl deleted file mode 100644 index 5f9c5f203d8ce3827a8f295d5507d0955b98859e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6326 zcmcJTU5?~56oqSqgg`<<>gnFX%ri@12S}`>TAkEWbvA@};{_pBz*5*lIOqP@_ue>3 z4boVxaw`6O?D(GRxcb*$e*WpZ%hxZzU7kOG_;9)W^^Mm5eEU(p|MC5c)c^kQB=zq< zYWv?$&!5Qu`Jy#v_ZbR6q6%;Wc zH)skS2xrh1fKMy7nMwJCrRJT#*|HDG?jR^-U;-6i)!9 zO+4k<@BwaJAIOL167M*!zZ5$*dQ&^Zuy{5ZSaX$S8!btrg3-A$WodRWmF*85v6K%2 zE{l;J(;EXbp`ky4bwedlGcl`1n59GniEWI&bttf8bR9AZ$+b8WtQx(fYNri@h4~11 zG~93yQ*)z-yJ*EXD@1{*&tpE6Kq=mhu6x%IA}U6=eAtC-3Lj734>hjVu~r>BajS}WA{9SWwqk2U+Vu@y$`9vu@>)=c0joye z*sjt4ABKEDAc7-pdPNQS@9Uq~eT;ZRE0*&?Q8+zg zoXN-}j28aZ6)yI}hWj$|^NjaC$oX}CYaBJRhvymN6Pq(u#zyl34+|C4;(&Y(0yr|E zg75eQD0w_m#sQ-{1=8D_Psq828Tr!Ao_dRzB!ur>jch^SL}cA$yt9LlKx;n;?Vp5< zgM2TBkph_JWc2j99+F57@kY8=wKdtyDBuq5aP^W&0@}m@l+kKpd>P;CPr@#u8=(g zJG|K@j7RQs5+#0MRF>P~4hGg5;VJ8)6gV`q#NSiFc#bI~4n8^ID9MBfGTyz^rziek zrqVTi4cLK!-7M_-D0aX_Ycd~D(xmK5!qmboc)Mu@+F zKOO%^D2Z;>Tr{iha9!)bsjoiFLr1E6w=PShaw5d_(?l5Of$woQ{K|VI z4Y)m@XMwnTlLWy^ddbL_90>kycuj#3gM&@T6Mw2EAs29-?DV$MV;N4}7q9r=MR=Nt zRI@(Y*3&ul=~tsm^=_?;rU!JVKm9xsFc6$sVNu@- z)fdf{K5BNq#`m$uNNOHWl3&Lmx7|4Sb%$d#l3&L@D}F^dYvEQL{W^S?&}GrDSk-FZRzoO}HrsJ{nY diff --git a/applications/PoP/poc/res/kid/kid21.atl b/applications/PoP/poc/res/kid/kid21.atl deleted file mode 100644 index 22cbda0785f07809f81e00e248e5f10927749c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7409 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 diff --git a/applications/PoP/poc/res/kid/kid23.atl b/applications/PoP/poc/res/kid/kid23.atl deleted file mode 100644 index b61dd25965a0bc26d10da60fa0033bd50380a119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9764 zcmds-zmnWU5XRS41P~BGK(IyOvwc_PjGTmwkSd17Cc5FUZI5&iYQ>F#Ms zYjd~^3N$m_KYiWO%=AiU|MK&X-+zAk_m4kL=ld5gPN%;yQ5aY#tLg8UOHG{yAkP9QbWM=>0zT* zd6j8N`c6TLebCtq{9P8f?TCKrpD7sfF`Duq|})S5>LDJ?T24c)H?SOQ*yl}|^ zLJDXk*vltgCt5zKUb)6hV2>>qCkC)^6fK?0axslTh-DN`B`V-$lN^FDp)@yAG^t7{ zG6A_{(lsq1R(8oL#*ls~N=rxV)-A3#iD)I{m&BEk=Up@0bqsR)4QpPx(+aU?&yPGk{8 z-z=$|SXpxotw8o-*}ODbjT-Nji>io7czRkJr5M1jVJhNpj7vj!bu5)Bh}b)&%3BkO zTpx`vRA{EL$8)YFpTzGQUiMbIW8P&2#IcIWS17UZNLal%_6?U-HyzFc}I8&A# z>15s2K1GT-4RzTiTOD9!o=y& zQPGb&x})V!aF*J{gnjS%HxPu$3`Fjc1~_s+K#U}2#%3KBD{3{CFkMXZq;^g%xn(dx exP|E;<5+d|5~t&;tB}iLLG2x^b_A_Nf%zK)ReVbT diff --git a/applications/PoP/poc/res/kid/kid23_v.atl b/applications/PoP/poc/res/kid/kid23_v.atl deleted file mode 100644 index f9326aa6be12260a3057f53233b113d1e392b1d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9764 zcmdU#&yE~55XL(a2RLwo1BVeJn`BqYjXM`^9FcgEpzP$d>X+e|2gxJwHs-6pu5#Ja z4GM^DDeLO0pFdZ-?HbR(Z@>Qh;4!fMKZPb?

21+V9`U)BQlrqN9Z3rbRrV=m#9yGL+zv6G zZmfTTj7By9!<0sIikt6dp;=HGHQz8y34qY_*)p^W>1WR!OdA3=Z=eb9#>W>mUmpm2br#RKcufh*YPcK{s%W*NroW>-Y~5;rz~NE_-hShdoR} zTHq9G$=2Y?To%fzu(kDY;3er`d5FJmGOx#)#nd--FD-A8Yxp(DwC~1c!p{DC ze}4dIjx98ZzYa2;|02=(<&xj1_zq>^{8FEn z`aHip-=7@>Dqbk}+>6G0b%H>T*lT^BUpzFwefx&ex39>ohzcostSzhAl5}fQU&_GG z@`2DGW`R7Vl0u9g>`O_PuNNC;!e5>%VtqOBdw6_)czk_A`t%HW^tOmC-p@1?T9s4C zECzy+n*wQBVnt%IEyT>LYkHTG=e-+sB4>)<*RKLH@OyZCczD*@|N8KN@5#`ChsQ@; z{J%Us;0-iVN zt)Ly%Ytb^Z-|>U-E%xX$YmOhfJv}`j@Brcy{?q6KKO#zJUSD!wg~MRwLm5EJwkHOR z;G-NALJpbuxEtu8=MiWYna}~Xc=#PBBrG1&8`5R}Tl5M)$Dx-q!4KF$ap3n2fB`&U z@$|wJ|8e#_JS!LwBM%Qbq3G8m@g*j3S`WDuu}uzGe@#KlX%PWE@ypK^%(x;vs%0AlfWtW;LI`)bjWM zArL?(pFpRyN8kvNzz1R#Xv9_C!@vhFi^32b6v@TVs0V0xQbpmM@|B{&O419p7~HCt_`xg)nA$(Xk82-dkn10C zg1cCaU>+1aGNOPQ4SnKD#z6so{(u18)QDE>BAjoui|S``7^vWV2(T!I0BWLQQbVyx z76%a`ehmDBdROdEy=JhK5J2vFTuho?!s&V^I6%&TpTM&O_&q#QprM8+!R+N0@_^}# zpu=H?p5%iTpvwUSq@cb$KR%L!@%RV?CvspfrY+hyMi1Q7xl|ETj8{IyS1Tmgwg0kP zdt5JUDta*v5tAB zN0DOH2+n7W+Nc*aggrL2iTzr7rI#ziL@&jsUKkA?$#MGwhspk7hZo0BLqa)#hU1GE zLXBuK!q7_9nr1kw*(wIn+(T$RdKg4Dv?fP!5^{(E!;a=cC>Ki%xnh9>uM;43V1Miy|8)1`PTUj}kpj;!j)GOow06p(<_%@5b4nLgz{4@rbO!^Dt z&>02>P0ni?)BzOWp#Aj39-g6bM1pX~k3e^N(WmGo zHk3q(jK8V<)Jy!R*SI;OM!n=y`I4zu-dfghF#?6t5Slb5ovFK{Z`Ifn4*{3m-1 zVw?=kKddd-gkh-skQ^9IIh-*jM+VXng!aoTL?Lw8n=7XUiB?6iamcv;;&HviiXt_% z&sbxHtLY^&Hh*D1dUSdz1Kg>X?M<(C|4y&wZ3QhsplS_)`qp{_#XGo^Y7s{>w7vD^I|Bf729D4CvL3 zv7sQ)x(L(ZFWg{Mp#xf;UJ-hfL)$3_{F03E;OdG|p=Tf=rWmNi55h2b$T3!U|3F!h z!?-39n~#=HP^p%3z-%Me^n$b4FZ^^K?DWDo(+jgWM@%oqZB5R~`Uk^2{&;MAOG!Q?>LCyyb)AI|AZt1(lwKN1B~)p&ZU=IU;~d`vLTLei3#Ne+~;W zo+)$!!kYz@VKk&tItU~cLW3qD!DGbGeJFk6xrP&z{dq-`PAyMF8=tckbFvJ-YFdBwY9EbDZGOAh(MK5E31%_~P8j!5|nvx%nt3KP~0Pp7PNT!Zi$> zY*yvAK?SZigs|VB7jC5eu9w>Eqn=GK1%zL&mzs$K98Wpi{FeAp$fcg&{q{G%{B$W{ z8*={a;g63$LD8T7^vH8_4nM~q$Y3-u9$d$<24h{YbqB+$`N)L=F%4KSvpD$ZfB

  • 7#)(z*l6ONd$2cC!#VW9_ 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 E12e8Lxc~qF diff --git a/applications/PoP/poc/res/pv/pv.pal b/applications/PoP/poc/res/pv/pv.pal deleted file mode 100644 index ec99c2b3576d76a4da8fb78b842526ccbcbfb97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeH@5tqY26oo(NPgp4I4+s>3fk2^92owT=LNHJmSO^RR3c!eQHZT)o_J^D6H|g4c>M9BIu7KU*s7Bz>u}u;}FA z^`dRbX4g~H6XV-RqZ_}MR2|A(xvmD!NyS^cc=DKeCy!Xdw4xq9h#zJYv79aJE3ubG z1harNP^d*kyy{rzNAmi1=l{~b7#AVYPqhETAUU+}mcrbK%7G+&r0;vL<$7-BcE0nw qyZHGn{*$!EoGdQCTn+51Go6{xjnlpOxyuiXpShjM`Tnmzoxm5clc+HO diff --git a/applications/PoP/poc/res/pv/s0_0.atl b/applications/PoP/poc/res/pv/s0_0.atl deleted file mode 100644 index 66083f221988dccd42de8858fae46c80eb8bf8ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2ZF1Zo42Cy9ypCr*lUyY?Xm8M&UZnT`)9QUCVPPAyyOWe`0-0bC0>oqSVP=2- z`uX;B`uOnY^!M#aI{NYSc6yHCJkHa+glQhy<|nacLX<*tljiXpiREeVqqP?pEJ@+l zG(Qgm?GS4|i%EO@#5{r|KY!hL@#paR|9^fS&Jz3`@{P7OX>$K_WaQ=<<);7zml@kC z4}9Yo0Jb+tkeL5DvORt>XXYUo+bAFTH8LT&(9-{gpOR#({x^)nEdR;>n&p@I+sp); zf}wx#3&^qz_+5r^9Ql7?<)(R=!Ls}{H9@w3tp6InX$r8pe>BTKhX2V5sQ&o;Z2QMD z*~xEelz))*Z_7_`^4$6v_TPAb30qn_6F2+Eh97OygMUB&ZH~Zu{CJ3wi1QctKFeYM zLB2mCKl463ntyD{@hf})eF~HO{G5>C6Db8by7W*XkYF*9DWBzQsfP-IjMx~a>pY*w zkH0*7^d81@h74zd6v*%O)c?u^PUAV@LIUgaG+h|e|H@T+$*W8r@xO>n56XJmqVu<7 zIwAmm1Zc=`Ou-i~jtbrXs!JFBFCxQY$lDeq`ubM~sQX7k25h+P;}iUjoVS;m|1HS$ zQ;qm8-T&$ig7uGIw}!0y-%T@a>wlcSa^nn;ef_J#F)W16|{G1k_*fvrq z`5&wc;ka{x6YZiF%hu&0B=BSG#Wr8Pep%yPO49!8%m)6(g!g`u#QoL2--vxF>}!}* z!H8~2ON!9Ps@$bz?1HFZ8+x+(2O1@NZj+1uDKg#?;^$2vl>86F4dKX0QL7BcG*)J- zbid5{JHpq@|FX$^yZ_06U-0hTn~;Q`NJQiuy2%_n%8-WGWAz^@noPB*gUE0rx%i>x z(hEb@+NBPQtp_X9oYz=da@(rU&H6`x_4_~CVo~e_A{w;}5Gja#QY|Ud@ySLV^PD`5 z9+D)qZ?e?ao?g;P{fZ>Dp@kMqAYWbuZCK?ievtV2x*;!DcX z>T$bzB3!p}BfvZF|D@v-0*uUuAQvSZP2?dtk16+BO9^zLvv@Gl=9e2eTelvxE!IqW zcrjXEpVG4ROTA<%?LxnqRc>A7na+QHWtv@P-R^&|eu03_Q(lK-81qSoN~UYOHzXOx zTyCX=O+6hZ#P$LfDi!UFLi^~C=^^#1QbFx>kRH~yDR z=DXKF%L=p6l|^%c@=Q%aHv8 DcorH{ diff --git a/applications/PoP/poc/res/pv/s0_1.atl b/applications/PoP/poc/res/pv/s0_1.atl deleted file mode 100644 index 46fd21bc7aa68cde33cf6a75d30ae7eaa0905a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHNTW%vq4Ag$eLa+jytLzPu8wAKj_WnN!tH>hR(>>DI(r)5~$3QomZ&q`j*57~q z`R&W;#~#$?%gX@Sm8&!GyAr>Jk+}vyd0?G?4v)!_ zQ!*weFf=dqHa5~Rw;|Ci$-Ox(Ujpja+7S;leC zSP#@F=Sn^nbM#+9cKu2KF?@YT|7mYk3`!tGgvJwX2~*~28R@Gw8rjOBUPv3Q&7p)A zMVWQ{xgFtS7T|;D04J4jhTH_X1?fvZF{A%FWB~3t{TB(w2^PVTkB1+jVVW*$Be~j= z@}RDAP06{kfwMr(Qj1Fsf)YH_Ny>#bBAPEEZh9KlbN>;(cVGX8V%kZlph(GS&RY3A zjmGH3u>|mP3*gJGVs;BeD2nl1D`JO@ESnF{t;tJg2SD6^$Lrt2_g^b7(hZPUj;Ce< zFJgekn6xRl#PKeOvJ$}bm5~HkMpT?AoBjlRfa^T?5)~WMP zxbgn+|Ln58tbS1U<@GNSyS|)X?6_b!pMRnLduGpdU)Fzyla8~$cL>g3rvLW(@?m~H z{|U0;Wd7{Gy8utuKLW__e>cCs+;!ZW{MV(Y`)_^BvX1=hzq@U+ef~4l{QUzb^yl^O z-kGy_|7b6BZ|%Q$V!s#E<^FV^w7-W;`wf@7{%*-up6U%_l5S!g_RRikkfH64e1BOd za5$``D_z24i`nD8By^WnvmbJN8@3jUsL){DUegESrXtC@h@KODT6;3|Raf$@bCO>ttE)84AM*%C1lE5hZSqWIwHyYT16JA5w zy~#p(QJWWuS*xOiEFl}$tLq>C|Ay<}t@|&6TS5-Tc1(yYm=dHuQV(8V7ZjDI%Lhro zl{%&ppj9U1*^rsJwlPq6<0JdF8C^E=N5IC_>i%m_(D?or_+_%AVF00&B9%%{RPCcD z730QEuzHam$u+w~J~I8VS!5u7S2gXo38vd8<$2Nk}qfW9}v?| zHb`r@b^ncobP}|LQi23pD&X@f=cjbDP6 zw}8<4PiS$*WiO9A*FSg1U^di_M=ueko=Vs0keQ{4RFsm0_C^vhq_MH0j~>J6mZh$7 z0vi_D&(sD-+1v)srFs7qX8tkj{`Wr%#895f_`eIBEGU%|V2wXpS8^1(b!ZaOEGGb_ zT1sM7{r~_Da*`t9UL$tngaz}GCAC5)vxz9memz_NeSZI2Lvw^X_1|zZ-@5)C+MOdQ zd~BWR`bPlo|Nie2J|ZyPf9w0-?ce`>?5=rU_Ve@KvEToF_Fwg%KAGZ`1ILly|2=O9 zKei|KUxO?Fy!-pV&;INESD#FWk6Aze{+rKWAEhhNf6x2=_h480%-KsUXpd*)9VNH#&A?;oODwh>+rmX)4$oTxH;lTI5NGL*C zKnodxi-F4JY%h_YXP7%%DavgwOZKDzc|+G(2uf4BwEbKEWsg~ZRIZtG6iv(F2TdXw%fZRw_lh(Fm{^IR`INg8$1s6s&1ONa4 diff --git a/applications/PoP/poc/res/pv/s0_2.atl b/applications/PoP/poc/res/pv/s0_2.atl deleted file mode 100644 index 36bfcbe814fd1c30a63ebc18c57799997878f834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHNTXG{e43s})mCLGCYi-tANws|7jV46SaQ*jR ze}2B4?*IAc^zY}3IQrw|^K`ww$>*%i_4;}d=N~KI+wBGpd+BaB$m-yPnKnXe#-|U^ z*#`S6X;ziD)P<#SQ-gKNL~l?}SkJZ&`P%Iz`y9;-zW|w_c0FG%m$MFr^;gUug5n?$hkTVt?*Js~ zFF>ZS34nlauKo_C^f2%dzXI9y9ROtG~KL7pNiT$kT zP=5h3JU+j@E9GtO{C%jO<6hWNe*lY+VeHM^^WPMJ_N2cSo<8oc@ea}b{UOF?J`Q_Q zlWidFc8XS}Jk%Vl3ycLv}vD`bUPN z_uo0ElTvNE5_WIBC++DwZb=+E=Ar9n(q>mz>Mud&IHLc;`pd~QvnE}@w}7D08YJE% zYaV)j23C^Co^Dfr>Bl^%KQVUG+X->5Lwz^URvWwDP}e$>4@WjPIfKV|lr&w}GJCXW z)}dedlvr35KE7hQ_$VWfOoNgSZ7G#n%ZMpuF`I@s;h?&P=;JFqcB0OS7{h9S-S9Pfe8TUomuy`JA@gmoI z^8OYfOP5)L`lFMQN=YE5YpK=1m#KKzv;v#Zuc0$#*9`uu3`Ugj)Qkpg89Jab>YkR# zMGnT%0vFu&Aoq^lMtY%xP&V@k7EZ70hu*z<)3^sJn0G#bW|(Y1cVYM zZ>^^nXeQOPLBheH&&a_z>Q-4DasR83>A5j=|7T7j2t&6q1RINcx8Wn5FKNazdaa`X zuLE7I7SL(SEQZ!3W9y(qS{TbPMeB>C0BZdO$aFGw|6=B07Rlr^z=d0Bs`D_`+L9?l zQQ*qz2YcWLt?ZAp%r}dm!M-%rms8-Y#>FTMa8)R9VeDESt#J8u{0e00GHbB^sS}#R z&;k+)=pcnLsCGIVOdOYh)D|=?a3oOR6^4Xs?Sk)mZnY#_&ihiTf zPpZD|`KwQZGynhljo`dv5j4+#@nQPg*54fg%VmT8FG7Z~H{W>w%W2+kCiUlNp~v%| zH_!Up0=}HT4q3X)de-0OMj-WKYJ&uDBRIfY!sU^TVQ;!cUWDG3#?$KCG9$DaWIS9E%PB7i)bYGtT9I|woHQN7bTH=i9=d@Z0 zPm_Js^6H9~JS9klv^`q3**O+47miF2h)+wF+uO23&_YZ`dSD6*!&bks-U&3Nd#FUGEN=RiJ zY4HJR_@bWgYNC+qk9FD5bpfhmSq_hXrth4;`T#w1|0m%9K0?7j5IRF?Bs2q+D|!IY z?Nq8unH|hjlm3LtS@mOFvjDEvYle}}38a&2mMkV(n}My$G|zwY?;q93?>j>MMaVGr zW_11@TCK+eTI$cyLXYP^Z$|sy<3VvGqjLT_Wa%>NS$~_qGO51=nd6B5S$|tK+05ti-^*2?20FYOv^Y?#SrhgCq^7-#SJl`Y8 diff --git a/applications/PoP/poc/res/pv/s0_3.atl b/applications/PoP/poc/res/pv/s0_3.atl deleted file mode 100644 index 076e4daa29de0f66516bddc7f5e2a14c571b82a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/s1_0.atl b/applications/PoP/poc/res/pv/s1_0.atl deleted file mode 100644 index 21a35c8a9752ea90cc4b0fd7df78544ad3e9a9d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHNTW;Ji4BUKp9b*kNSIG_98x-h8djFr69E#M)lI=~KRyJS-ktvEVjj4x~{P_Ou z{pI%W%g@`d_ZM;W_2vEc%H=-J)11pR4}IH{L^Ej>rF%&8cxS{)TJb})4-HsI!LMt3 z9tOlA(HteD7Jd>QfCPU2y7k51>Gl8r_B`CB_&dZK?H$tO`R9-UH*Xkz2B5%|g6-8- z_{Na{>>rXqlJd_XYvCtzW*#WmPHo1oQwWhl*?)zfA&J`ZZy1MJek1?7we$S#7DAeW zX^6~XG?H_rv z1HY+L`y}gMji11YbL$cIUp~Olmew!CYX7M4Lu_{Nzs`Tv5x9jP4lz<;{wjP&IqaY0 z`-AaI*{6^0ADeRgq7R@$gyiSvfJ{G;qR7$ZDmw@SSRe}FyL>HOWe0%*v5}_hJm1HE ze|dIx597UnOwR;SfZyBg`dLTdHr@j+C3JnBrUz=|-@5A6^Cpu=@{b|2gRmQQ}(v_5rm0BOp`Q^tKOA#cwNlufCLj z88Z7+1ALDw|Mn9^*FSvSCdjV*`_PQ5^AFQkZk!d!YyH~=6ZQ$u)i$rS@0R`Q{Ktpso&8rlcy=f$ zrFdJ$DtWCCHh5y9>@^=tPo>OXw<@pe7Lk7p8ECJz)<1EgMNJ!(>I7knw;sk?k60;Q zNt#r`Ueovte&w}{p=e3|Ia+w?wh?75{|KB|CxWNu(*T3V!%a++`l3@&IrccFk0oF_2&0}3BeFyLj zmcp7EBg^iiZBz2kAj2)8{(BRZwfuugb)zMRXKmEs%z0VL;Gz&IK#>;B7*2w@(hxD& zGvlgZV1`%rR@2D~Am{kq&a!{QdX<00WM0odpFD+o@skP-#91*6VU&S-OC_X};LF+N zGTL9zu$JV=Yj|t%NXP7jH1(KGVHmGvM|suy2LSi)|IDz|Y&e(^P|j4Bvv9bk{6o-X zMtd)7fR;*Za!p>{Tk}aeu$1+v$1E@Uvt**G{kOQx`e6R4OB8mqY_urYRwc-TAb;6Q*bLbm6;WyZ%b#qzd&Fhd6Zyx^ zpUOXSUg$cX;gdl$WnA_EPvjp#hTZpx`#-#v^cG_n&g4P2c-+6FBahVT@!?DO#g%Ds znbjfx7{23YANJn@vab0j;2l2W%J~xKKcBLF*S|Al+ycP*?;m+H(fM17N6VMBqTiVz zCA}>k_n(_??7w<|-oO8A!s1K@wZ-H9lhf7t?}OhT#qb>~&Z!oU`_D~R-yeX_s}B3` z+2EA?bF}cp{_EAX{_VZa*nb_eC-48-+k($kp42TK_p7C7t8j$ObVx)mBFHVK3M&mw zmaS>gPC901+nVIxpWOd7Kh>I`s(USUpo!yskdQ_UnCXRfC0q7yXomGtgIXSsNSd83 mYgPUgllgzHfAK+2Ls=W_o-9G|gtgKO{~^HaY+75cf4>3z;2xX+ diff --git a/applications/PoP/poc/res/pv/s1_1.atl b/applications/PoP/poc/res/pv/s1_1.atl deleted file mode 100644 index 425b3d0e3dd27e80cb846f169c56398a2131e3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHOZI0tM49)(?1d9!@bCtb8dxHYKNbmor<$I5$C`)oYnI@eM#)HZ-6`pZx-mcZ@*60?>K&NyuMscr`P%4Pd_?oFssdsSLIHd8Ynw;9w(Zo z*PFVBye#7UEIG)}p10HK^3p+e<<%MZU5Vc+jCsY;6)08@!IsBs2MYGMCM0oo4$3g^ z95J*!aOF0kE4|b)ag&e=PaCgY_KW}@^o}d|iLu4+DBxEiyW;A6F#wHvNdMKOT6*HP z^0EvQsQ8xlRJW8pdMQ4Ply7)#K7(o*Nh`+@YH-+p6*5EZdcIsPXArqYVK;;kxY>jOa*d_IZrD;CTNv$gV#K zAch~0=|6S{*QZyMR$=Hmr*@Ik4v?2OK$9g75?T~)?=S80hNga>O-@eJ28I5skO8;{ z_g@E0P14|0;;Ye92M~j<$+82BJ#?#AyKWsGl7xg4N>8ME-P9^jj{QgY9=ZNS(n=0s zcDESH0}DmxC{7k&0(wc^ykcpxbQ@mC5@hw=fO5}}!-L!KAw!L zvYEBJ|8mput(p5A^5Oa0HnXr8uJ>P_Rla=#eCVm#zW*6&`u@NTeRKW87tXvqe*0jk zKrglDKEU00fVZvJ8sXXWQo*Mbb}ze4Cr1@odQYcssb?ssChP^Z6TFrrl=NPX9SD>ry0H%imF`$9{*0 ze-D22-yQpZR)QVsKT(#F^OW314sEc?<`nh7i%#ZkNrpVT#5bo}&w&p$0SGGfo$EYh zls7xLW%Z;|W(^ti-v;g2f4qGU?f)Tt+2Bsf)M|R2&pDX zS}M-{$u@m46WIrkaka}$OBj|c+_P&Dx;Mh7{pSi9mOuXc8;G6fuYyLonHCc)MMv6M zc!MKtAZvvg#UkSD(ps1_INH!zvxAz%C{4i-pE~L{>G;UprF~?aJ%86M z)~BH>SrpoJyP2=4TcW12(F*OsTlQm{05h#z`f|Y2EBsKeMwS$#I=+H^1U~OSe1Z6u zsotOY`-6M>uLUiMD{U*FrCU1=HbpziZ0A-wsNmCU@yKg}BTBlR=c%^*aYZe+x?8t; z<`nx6@WoFyNXKyF`P;80mbwMi&6h~3_QS?Vc*{2suskMO zlKnr!Z(Zi2Bt!poH}lT=_o#&K_xqpqUk6#)|NFl8{cEi zzy06;y|>)YV$b~-bYQ;!9sB*?6X*CNL+$IIwoLKKf#b;U|2}e2&&-YeS0Hl$Z~p%8 ztN(~VK7Zf3|M$!}{>ZV=e|PNvedLm!ncLWZPhS7<)-f-5Et%`Ti3{iRC1@>~>QC0c z_AuG|{@qD;0mxuMy=5W#!k#8QczTl-fwQm+FKfvp%H;W5US{t5{#ecIHoWxK>8>SP zPj9*waOQkrwU*2PAKw4?HFEp^KUxI05J$^)y>+^4$*hp0JooC+Csu38q-OSCg^Y9z z>;AJK`EL}YeM3n9uv6z2QoB_+Vu&O_#d;0wi%wO`DT}jeMNCivU8Ih7kc}`mh^Z6T)9o_#^xKabtr@^;SS@3lG4$x8PABNCgdAzow=(EP>%Y79|2!Dd zwL>nA$N~nAv{E+;t%aDd$Tt!dK)DSb$IsP@0EXP7NM6T)S&%t6&2O_4uY=6B$s78w zyP4PPU(TG8stHt%XpS~`(VmR!6~1#K*@;9NZN$WFta#n{l-iK7Mc2uRcn!4h>be!M zEj_G%1n~CrH(h&b{fdKh@kcEiBB5F=WTw|kX(L;cq?~?=Kl+y?JXEXjIK(#f$ivR^ SsFCqP)=AvL{4f57=kGs92`=dX diff --git a/applications/PoP/poc/res/pv/s1_2.atl b/applications/PoP/poc/res/pv/s1_2.atl deleted file mode 100644 index 1a73f95bd444f3c58ef8f286510da5f9e6a345de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHNZEoZ?44wQ)20;eMUL`kZZ&08Y>HYt-eD9GIWy`WBodlUpCV(V4Zfo~Q6@kO4NM2;ZI7->1Uo_$6eQ z7XpapL=0Q<7no2CL2bC!Nyi|wXdO{JbweS$H%Am*>LmwS6`7sm&1uv z%`&N&o==i*ZowP*naM`_-M4tn!NynnTG%U|?SCC)fg}6v`kN&-oJa}2PTb$wR4XRl z^e~f^2+e*SD`i*vO3M;yRe#;X{9*Oir{a_J2~DPaea%cjn#Jk!n^9JO9b`w(-%QK~ z?LtUgvMeb3_5MSBt|1ioAfX50o{+Fpxz?bw>M5*RWR$uM+Io5-1ZfqNKg8fSt%&T} zkY(J=h8~Psoxj~>)_(n&_m+e?#S|hSWrMF#@tF#fL&Bh(A3XQ#DU)jrG-HgBDCfIw zSZd-q{m83$guNmct;LL}Bfa!bD^jcXzk~OGmT^v*qIa+-#XSJ`%G6<$b9LHBnMhH=;DYjtqn!F&q9mO)*8*hTRzyE@Yw^5`{x1~h$Hte zC8VbgPOHh5q>tLT(HqMUbx+jkIF19m$=y(h?u7_S}AHS`6)f z6|(L!Yj^)+UG@mrNP zU#rEDRm>=;0$W>H)ZaVq|IDYuq#h1)1et(fUnEF@QZ}#%FD{{O@YqMHP^GPV5FcDY z%08w@cJSphB3FNY>QXzjNVp&QR2z1EAJ1<-vZ}?O`@bHhZECRpwZmlc{Shnu&HKUm zi`VJhfB*gFu(f(zz5nrRhzi zFzYU}e(G=cF}C{aAPXGX|J2{r_18VjKlOK{{yNBx-v8}7-dnlfL%uqHkKX@j`uNz{ z17fN(wVzs+1w5)Z$aETipkJa&x_bXRc>iZ#p>SaFS1#$ez`Ch3v!~aYWu4qny=tTJ z`z>WZ`2HxDS+o65z*+otQpTyUZt0AHuiT@SNA;@j8;x0i1u~wy2mb$`r)=FQk#0g8 zIwQLU@2KTbz2QA{2iM_98wafVDY4|!yuhE^z~_R3LVAo5nADR$ zwCnn_2l)8Ee>jW`h7|bA>3bMS*;+%bOdw^(&p%@(UtTFA&l>1Kq4~05>S5%6)M<3l zqOJRJZ$^pBcBxBR^6;*Hu>T#p|5Jb(GFMg!wJ-|H)*AM8iX0cN4ZEp$4Du**=}M1_ zxqz$qt+~3Nh*LePBxJ|d8utCd`wRx>FJ7nj@BccNMno#&yHr6at!XuA#RZ)fMcbv~ zl=P*`wrbNy)^R6c#KNI1vJ=nai_2Dgw&HdmIZSh6->g)2{1o zV@fjtCKnduio>?E3_Ha2<%;-53%2MHm*bQ;r&xd!S~fDx^c(z)Pk8}bwrE*@6*7*a z**<^W8S=B#ON*hW!vvXP(?Lo;S%eqG7FPTNC67fa85#2K|MWu-9)B^x=Eps!U+Obn ziQri?`^XaF%(7WUrs%Ey0xkCUegBe+P^TDUff3Yg`aFLFx9&1)R)4C9FV^PnH_FTK zyA5d7i`8ETS>VVX_*LbvKAysdhw|pLS=C?nFyB@E893AWGWb3Mz~%l&0Qb+|o3G^m aukDX`JomC%oxj)J|LwW|{pHK|zyAOzcO+{7 diff --git a/applications/PoP/poc/res/pv/s1_3.atl b/applications/PoP/poc/res/pv/s1_3.atl deleted file mode 100644 index 0d7d6f45183f0547cc340950a2bee16146c7c69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/s2_0.atl b/applications/PoP/poc/res/pv/s2_0.atl deleted file mode 100644 index 91fb4bf0c6101678a0e01927991ac6ffe5d6589b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/s2_2.atl b/applications/PoP/poc/res/pv/s2_2.atl deleted file mode 100644 index 43556e825a91b62e924a7484285e8405be7125b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHNTW;ex5KKN2V=xA?SIG@_Z?M2#WbXg7+g07wY>JdD+p;$U#76k&XLXUXB+mTv z_g|l{FOUEHdinSB)e`;r`uTD`|FF*+n)CVnWXb<{@b}{b8N3~Ht;t8r-I9+FROId5 zwY{9)JIc7D(B+?^u$_TTSKp#A<;%0S%r{@cBz zE!;q{`?oIrwIjbJKbfi;;5f{P&+PSPiRkYppF`lkM{UyAEMT zqB#+RRK=*DN8Z*>eS)~Cq2}FQs%klox&JC<9IIJ8|9$Y$Gg>RbA+dE>*2YB@BXoGT zpidp+`JcAgVmCpSml@s=q+J3xt1d3G!q&Y#ihP9#@yttEm5*;C^fL$7T1(rUPZz{7 z+5Qt-?0NrHvv~jT@Cm_Rx*W2D13<#{^ehK@!0|rE#UkT`jKHE8c`XR^0vR`~3xV=c z@4kVc;Bd@|h|Aa20Sp_|L6`SmQTF!su8$4-_g~UOI?OeT1vyDUq>IF|ne-}--k>Am z3UZk8j6rO(~ZZ2xtXiAVOs{__{6LLT^HOZ2p9HtfId zVjlM&U?gm55IpTaC-kGU49t^5J>DVWj^)-2^#{gJMCagdtZd+2ijs`Y(SVvWz4%>0CTfK z=VW5e86_O$JmSGaSej?`gBvthp4QGtYqH_~+Z|>t_Fr?mW5klL@W0l+Bl?OwH~J0F ze~&)@!^&Rq{p$3QzbBsm`K7U!K(oGv?Ek^m`TIWqyOH|5|LVxJJIs2-@869;_wLwd z+hPBGpa0#wsN?>#2j?gM`^U}TpS{;+`6j=AYv+G6_f;A06ZRSPCfp!QTJ@tpC8oxw zXxE~;VLnZ!NAJCXC_Sb&vHu!nhduwXpsvIKFq1Wq(yDKoZZt$+wRg*S!zeM<2%pka z{1$rdKfH6qKbiBN&sWa>7Ov|-p-~2v$W%@O3?wcT8{;}MJ9Lt1&f{N&7up(G*=R3s^!h_h z%kgb>4*RdWnD5+w4v7Usc{bKgQ;$Lx+O9m`QH452CGi=#(c#u26JBoF7Du{ezs#_6 zKK%ZX!0Gv))3LL)Lj1DBfMs|g1A#Lw?49V`n|(P5YM&YxGy8)SDjUaTi&>Rn3Obi< zpJC^0xc?sZ{I?Up#pQ4sj*518oZhzJnC!YUZM;|Y;p3pBgbNHuNQaRi4Su|*5`5E|+zEBCAcJIU8Tuk3N<`yA zcszI`PDh|0r$$@y7pusZ7<@4{h;ux7{}pfDVb-0`e<(7_kCIp%p}8)#DXa1ziM|du zTgd94mIYGAN-YU>qC%Frh$iWFEOZy@i}cxlpnTN%Uw|v{2%m+fu4;WOvI;q(G|7wd zf?khU>{}jr`VWN&Vw}jM7)f`{zlXkfe$n>xe?HO`eZ>BAKx|nKM)oJ**5`$bF>MM# zO;YLW%2jObD~}O*oGfc`El8&PO;YjXxXZXg=J5MR?(RSTBL%n^yZ{>*EY8q{7P?-R zbS0G{v@fQ3Wjyya4f0UxnL-Y-oWPbptuP2XjD&TCw1#E4{~r1L*V5cEVzGn2FU!U9 P2EW5Sc>Q9}#q-~P3sEJ~ diff --git a/applications/PoP/poc/res/pv/s2_3.atl b/applications/PoP/poc/res/pv/s2_3.atl deleted file mode 100644 index bb082375d9917c0120df9edc7130fc785b09d116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2ZF1W>5=EIRQc@~*dA5=r%-g|K%|>Sbe`e0P4UnKjCCYPLcBV|nBnUL_?Y?My zNb$e__1E_=)7xMFng09z3q=3?@_l-GdiwfxIWJ$oQaYWd=^yX=^YU`Q|MK$AUadY& z)A_WMjF+e7d_FH0)NeI?50_sK<$DiL?s1lWn`FwyTjcu)`S-5FcTcpfzUAL0+0(ZO z=9d*$;NX2bTNWEkT@K zd;Q!Ty)HHOBQKIYG9***ZtuNA5$wTTQcXGH7cbes~7k9PV{v zE*5X_W1&s##Lmz9Cg`;vYh6bev45pZ{<T%>LVNKl=O;rxYn}*IP-n)ivju`^_zy zV^_6Zp8n?3pJuhnQnl-SleJs4XYXGK`nE?F*S76Ez7B26o2^n zV|1dqec&7pZ^7zX3v_)ZnDs3Pd#i@M3rp0h_nw!+-oyZjdil5-V$bExhc%BMl56Kf zdXRrR$-0ht{wV)|!mZ7bK(CJW`VyyX8+iphj{i+YH2Y>L*40nd?AT%v!J2JaDes^4 z<~=2_Z_%&We(-*if4j+iKmS51d2^)PikxHJjlj6lrA=>fdLXu}0(7gbrpc0ED$BGP z*(|57Y??3~i6=GH-s?m!tP%ZJ$~Ws@1bkrsm3f^U&5hKh%xx8>+cmdVk*LS4LP*b1 zz|rbv{DY2l@7-ir2STPo9804gYwK&}^ZYVO=GRvbod0@AucUuqq~D&Q$MUzH>NiTp zy7$oMk4EO0zUj|LmoNGalDTg@{{7!N4c!w@H?L_w)O|N9A4j-!9qi z%dGqR?+4F{N5g-;o%#3q{omhChui%7rS*b@~^9vXU>297X9A-?;rkX20y2qLXQ;N=73|L<2+OrrR<34OFvqX=c(0L#BbHIcHS}y-AjGM*BcsqLhe+_T+YdY+44)jAih`WBz2!?oQv7Ej0 z&)GAbk__a?G_4cLxMuZL6N1jAbuxCtQQ3xLh|0%LPga-~va!Y-N-Rk~DHm>+C_wcoT`OR-ABE(`76sjkxn>ikPG#W#*B^#gg!Wt zL{ry9kAsuTVl>1;$aotZYFC`rU=ByPGXm)}`hn$|S2=uQ_3&MSMVpZ~$)TlVam5R4 z{7?2A@j4LpqJZvtE+!kV zayH%r9l*KKFXGh={ia#KQjIKO_PT{kOlOjg!;F!v7cHpk0M@)XpXON$^KnMO104Ki z+S2A2O>XKgRcgw3t(W>{g~UAjuidt*@#53K%Qyu1*#F|CZR2&QuX*J&)d}ek=W?+A zRqm-^^n=2bP%##76rE0&iAR*={LE=`p`Y*+C8j;9ofx%SUh2Y&&o};O=?$+d!vU}GD=$uC6P)IM*WqCQ zsKZOsFGC^@(m1~45N|+d#iv#3Of$}EwTc1lTCVr>D2Zxl3#Ua~IBHXU?g%>@F7mY^V!GGA4Exfg|I+Y;L$X)YBIRwz-y$;Vu`M1-L zvtK)n)tOAM!7&)eUYFOeX?RCU7GWl0WzS?XN0~b~t&w@|N~1N&p#MfvmuF~>NPsu} z6ne)?pMh6xL=w^bJM>>(^^>=(ol&>E+9mT)??{KE_3uhQmI(G*yl3)?#lGNFu5*m? z<@^_aN@7li6(4I0n=p9?E@v4=O zSv*gyvC*}7Ri@@I{?lW}D+bmpuk9OecK;o3=I@5H>Tp*-&oHik1WI3|7oD{m?aXuN z+B!6ohI%8U$6mY4Q4sMwwv~RmcZ5@28C(Qp37qJYY3FAUyYicCCN+o_dHed8jFtJA zmxk(l%xgyl9C=f5%!?11zqdLZ?7!w;a6894TJL?H2T#WQ0JAJWBhjT6-Vo)J1u)OXSrR3Q+INAvnx0^AH!l=90*V1gV%ircC@g%5ZNh9Pdfh6Iq#ON(vdhPULs z=EbqjtCJXQyoErubn-U`w7Awm+XMZ&e5D^igd|Lkm!@&_bKQ|Rr`)hQ#}%&vXmLbA zXD)M#kajo>LfIRISDrW;Pu?YT diff --git a/applications/PoP/poc/res/pv/s2_4.atl b/applications/PoP/poc/res/pv/s2_4.atl deleted file mode 100644 index 76b82fede907332d0bf79e16cb4b913aa92081e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcIiL2kq_2qcp2^x!)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/s3_0.atl b/applications/PoP/poc/res/pv/s3_0.atl deleted file mode 100644 index 4a016ecf076ba1ef5f7a262107654610f1935006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2TXNel3`Ly}S7WV=mLF?(*F6{}GvBU=mf`{O<{r&6b z=iA}&&!5BJ&o`;)$J^)OJwC^N9LD?%V^=pmh&2OV>8Wng*dHUYG7NsS_5_0^DEz9% z$F8FtV$HLdG{;ZOBS`Y|?ncKSL-+sx_}Crg@jhga);4Ky|8r#I<`Lzm00oyBTPqHH zeIEeUH%X9~|2eWbelljpE*M)W9{E)=A-Pblf5J~m@~!^Y_1!4HU{ zAN&HcA_9J=uJ3#PPAptCE+bf`zp5t45>V8?#cvn_Y_1>G;;-Rw zfFA)GGHg?D;>A{>`QPT$MgNP)Fd6c;1%WpIZ3EQxBOwDe-1hMcerwL#^34A-GCish z->LcEwu4~)(ZIIdl>A6)C1)YnsbJ=>XTac=8Eqi{oQ?ImNpOC6LdzYIhwFwv>=hO=^=N338I6Ws25BbQ+%Q|E@iMuuelWRZk<3 z>pwP+#@S$#@@gW#h$)Dq%km9?m-laOq?HFg{;XW63n@X{MLni5)sxGseY5YG^G7($ zZTg?VTdB&8q@ItCT zGAp0Dat0y&FCgPOvitszt)MZ5>fEU0cNajihlFMuAaAajEhSS*f>@?dvdGi2)UBO? zTuNvsczKgB>pe9}uEDc^{{S;bR$ON7_P>it%uuAdN&b~I$u%#4*_4%B_nFjO$e0F{ zaJihHQ(P|P830OHSLvXJJ+95aw2^f|o@HRI{4vas*)k2o|Gs|zH|u{$^okf}Jfx~w z{&s^Q1tCSHx!wp%r4GtC1g021FRxncZFz_RBrOYdNJ7ShY}SrIEbpzEe$)Oh`5%38 z{r(T?*Pm%c(-bykv0t;i`(aMGdnk4H^_pkqzs>u62?a VL5f`XQtH^f+V;v_)B}D6vVXEp65s#; diff --git a/applications/PoP/poc/res/pv/s3_1.atl b/applications/PoP/poc/res/pv/s3_1.atl deleted file mode 100644 index 749cf431a5b571210c3839d1b233b94902f6b2c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHOS#s+(5R^Y;Rm!T;yNYj++#prCNbdiWO!q7pY~mtXj$=zD5E#tT(;NaMpWk19 z{_*~D`uNY^r+?mGB+&0K@2Bf;_`I>bzFtnJU-!N@``pvnJa@Y_F*&~7^K)xwWek~E zcHSm_*6P*RPN&OjMcI|3Gx)obzezZCNWP@FH?5K z=zI|ZrT2LK3Bg(cU>Y@H<1&JbwIaYMg}x>u!(u}^LP8B4!AkY()J*2H(18z(H4-G= z!_iS}IsL4^OqsBDJzp-DGdkd}2GxuJ2A_FInRIA?>%UX#hrRj1n5l`^qK_CpQVScw zYJ?!XsU3(TU8?O?eiYv&YLn$WyI;m%p$xRii1Zy$f1YxJ$wchTM@kB@P7x_(JJw3F z;B+CiO`4j8EFvk|n9V<)0*!`t?brDW%C2uD5Y5{$^~V$(Dqw;XuOvPO}bCmXmC&JA<-1n7H{UU_cfPb{mYbrxFGZK_0P|7NwV$%m?g?{?z49E`s1bL z>z7-Ej(G4(GbL(dxJM%&Qv1?bb^;v2$=M8O;94fF z_2Ot%nl!>5bcnpJV~k2%>H0Vw-3qfBo4xhqL6iG$+A@T`BllkjW$o{(*+EeWG^geKs+xtI0cpUir@c^`E5Qt0H*V8@mSbyZq9@&&XYj@V4f+8GQ zQU2Q(FaRdJn-?3Yzlt(!zwz0*{{qowAbZaK=iB)HQ7AjV%IAXSeBNDukDSrZCuIu) zsXyV#KWBaJa5fj~kK2BC0et8Bt1jln`s3YHOIJJoUth}I`bPq}nXGvKqPM9HVKQ7v z*+5f7vS~|CwMXc?|qi+8#_kVH`FW2AT0v4bX3IHLfo!vN0$q%nH%Y~B` z_KjX3YUE?WT4{U#C#>nsG}gf7^-mvsK$*ipw+&LpF{k=rHPC3&aowq9@iFYVed9L} zHS(d4PG|7^ksjt&)L$ad>Y@gubb?;{DY*~}7}0e)JUx@sizub}WlPhBb4ecuw(29v zNP}u=yN;}p7V9rjhO%4#{zcCRFvO=00?_S`8bKSA(?l&T_2B8Y^Gb%aN>;LTnZ@&& zR#PKasA|kxMsfe=uS~0#S*z;L=uiTc(9)J9Pzm}=G!<&aT&;MdGZ~k8?IRXsc_u7f zo5ooq_e0y!cwCLXxkdf$fB&}_t|dT|7XlRaAc<@dl)E0{O)Xv9Vz^CvG|W|;#XNAz zM&G{vc=@h<|2J}3$r5;;c^PY+3HKa!kmeI}0LDIu#64{4ff zjMhK?`y1B5HT&<}HD@Gk5(eTNG9hYuAR~H^tG;Pt;PZNfPt&I^Mi@sd^dX`iXE5Ta zDs5O9>DH|I5~(Wt-wTm1V2 zCO1o_m1GTz7d%dGMJACpBey`-dNP2q^AQE`h2C&Ff3J2Z6O zG{s6SbS$l2K=cMp&Qgn-^bf6Um7aSQ0~2%{^-<%%g4h+EVUD@l`_NnLzfM{8GHX_U zB+5wBMA0&UCX_DF0?~Aw3MWwMQ7SO!KPKm(;l*YchtWhB+Ai8CG0cwk zDTl^;XRr8Ce;eQb5h~L`h=9rz6@+v-qtuuNg@jyeoc5A}XmvWOpJu|N+FL9Jpsu1K z(J~%=i>~@YR7Qrj`fD)_{q*%G7x2R0KO5XQUp~&YP=hH@1VkYSi79A@?136WRe2O0#{{(fcd-7I&E(GdXQ_DNbezD*`L$rKA;(lf0ZQ~lGg(Hz zoC1p#F?`%ud8B+&Mt$*vsIX=Xvr}|HjoBU(X1ecS|HTdTz5o9qad3&rS9>Vic1l`Xz_Fw1i=l$P(!rED> lzn}MiEh+2AUHw%T^UwOXxYl>;9|`<<|F=k-)@Zl?{tGPJC6xdG diff --git a/applications/PoP/poc/res/pv/s3_2.atl b/applications/PoP/poc/res/pv/s3_2.atl deleted file mode 100644 index d39f273ec9f784b81bcf69b745527413487e8847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHOTXNhu40JwhS1MCwUnMu#y}?%PMRNb2U33EtkRmB*?C~a(wO!@|#G}!KL`jwW z{nwx0zdU^W&yR z$*#Pt>urx80bYpYvCgfi|0wzIpxG{;a7vv*PwEFDv=3=cH}NI(2qD zxy~8Qpf>8SD7$klwd=GI$h^~APDfXEri#-j9L!zA6BFenKx=7~1c&y6w- z_vn5YH8o%^&5bqeVhu{fi3o+-eII~|c2F!gbR8lf@;6615sT6<;z8dK_$fi_V()*tCR zy#G~D3noaU5YtSigCQGV*NnOZY@oZ;l(K2KPq_9Np=r~GQh1VAs>Zy~&=XQ`?KGCW zUG;caS^ZA#e+TDp7d!z&s`M4ik`cIVUmyvLnx;KTEr2(^5L24AYBT;ZY8wZZn3spp zE*sgR$FKKWsXR>j$@zQu{MWfRfUE*RRRRG=l!guW)5ei9r2Z?PV``znI7SC8s(n`YwW}M+kMRX ztiQus5YG?PTzoRM>-gyXIhKRCJFa7OY z@{j1_`6WM@@*LU!{>S&+A(;bkeCn4Dp8dDKGuc*WI~P&g2c@_8+WI~>&+}K5bsw|l z_rIo+&IK{8-lm^9l{48u@+O|~N9wlQ@fKf4u@>v7zw5sL1!#15U*rosdL)6)0(r}1 zT@vz?Y;@gI*qLt79ah%$J~NegpN_9FM8LHMOXrP#-D}Ac^=5N2%AS0zKf8eQV&190 zE@iyJ;}3}jp%FABK?op8qOr&>JEazyB!dx#L}CMRLlGY8D2DfmD`QJu6hZQ)-^u;& z==^0uEkq~9!eeXuT2Wd~0w79a$=Huc0y?KmK^l@+@4mU(rYX7g!n5&E@kX!diGgx9 zMA=)JoWIS(%&Gc=dlHdUm?TKav^1|oGvUV8wY1XPl+Q{K^mEgSCMMf@XvT~ruj&g? z`MqK^JpUcPeXV(sj52+x=J)KIf4T3AvxP71`-q z9uompS__V?acNxeF>^1?R??fK=X$F@vBh5B5!i#jb8dcpEp8y|`<7Vq{1tEA$E<1n z-7@@t=Zo~kjo_A1t^PX7#N+Q)e_nYXUw_@j{2SFD@7Fh{&;9|?_Wnl#KfnK-yzdX^ z@8|cw>+X)j^WW$9ziSAL^S55vaBdvD|DG)EYhc{3F6*zMjOVUCW_`r-pFPViH(*%P zgKt{+W5^l0%hzB-uPYyew#Q!B>po`fp1*4vR?u9&07#g_8p$r{$(VRQs%O1% z!$wJMP>w1KMqSvT{;vD}7Xd1%3Uq3;07BbgjZsp1GN$XN)re~CXSU+9*-HNVXI#Mk zPj*k-|8!CLTO{_`B-kUg3f6vBEjd!5J~kn&JUw}cH(afS-_)s?h*mR>T}ytkE>w=K zyo5aLt5#uRT5gFkGYVPc7Ez*%CilNOOs4lgf>KC};f@ljC*|uk4y~Y#B*8+~f)X>KtF5la=xen>N4c*eYUxRTa{l50diVc-AW5Yzs3j9@ z?@Jy4yTsj^D}YyPmO^8huwB1ejM~4Jgd|ub!hhhV2Zr#N?oq308F778aokI`!}H&n z_YXLB=WNrpqs~DOxn~4nV`38uMPi6Nk)E!0>Uq z)_L>ZKGwRh}On%n|%HgW!=ZDRsAX4sz+ii zEY~ZTE4!Z~C)%X&N(@$i9cAK?{j~m$12~{9tlyKqcz#LRx{LXZ_2(Bvb6Ffy{?jzZ qOY*u(9PWQ4@SWfPaPPSf`mQ5u)E>^?&+mUDNqZ7rzo@x*Wd0ZLNGJLL diff --git a/applications/PoP/poc/res/pv/s3_3.atl b/applications/PoP/poc/res/pv/s3_3.atl deleted file mode 100644 index 7cc68622532e4575400e271cfa496dc492b5b2bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2TXGz`5ky-N(=($G8PZnn4(uH`!W;4af9!Lz0Q6%pBz>>-;UJr0HyS8pRwW9L z8S$V0`1>EG}=HUVcPCZ$IYw_w(n^Gb~lVD;I(GT7K12 zp1h|HKiV^`JDcXA)vZUBb~xz*a({NaU{*Yjk)9)uetXFjZiqQw|0ZI6fauQ(+ypT2 z$dxcR;g(Trscd?XJ_UCioAM-Ery}ACCTiwY#-zR$R!aFUe zaEDx`jobvkv2P_?N-*p8^(oud+P8rjR=ww;-`vmIKMw2Pd;2dmAuxglTJFSACxo@t zntN~6zPXluHb#PhlfgJTnzlj+Dy`|2iD%6wL`o%EdC*vn_0_vXZJrLyybrmL-cEdD z`*_@czjJYX@c=X5f13;j)&u8RQYc$$duxB1C)fLd#OLo%NAxI_3nm2B#_?s(Y+p!EggkT^LWR}VShwyyXnXzEt@|T zI3YKQEseTeImpeUUM{}vt$Ge09_4HMM_24+U9bJ3IQ{%l6H-UITPb;~y40u6ag)3p z=oWo6%YMV@R=rm}tF~DkIW~EV%{y1eAIMhr&_~$<7rxn}msnsNT?x*aC-JpaCA+bQs{{zbqy_utQ(ZI6*Z?7x0}_0IWkr~V`0XRFEn zv6GB>{NCq}&nD4Z@lHN}e0~4-mSE?$c77ROnPwmP`u^`M)3f)n|8~jV|Nie8)aR@> z|NhJG|30Ts^Qa&5j|n^`^Vj+B-LuAI{rlQ~=eahko$SB6!^~IyeJuZWl6~O&zu7o^ z*1F`M^7XGwQ|`B~{QF4$b+z*B-y`H1{eJ)7Km1=aG@$bIIg=6OW(qXRG+x-scz@&ofg2@e=zr?#2?W4SvEi?a{emKA7 zo?-dc^rPFlE+ifzuKdgBqo0Zz%-#QHs*8Xz^%4WMYI`zaBA+-EI*vwOEety3x}fF` z6Aoy({If7_7C*+@(c}ML;f;Pxha=8JKeU6m>-UOah=&&I%{%{`JcX?Z8(OgeEjreg=r-lYs{g%~iaWSbN@Tlvl># ze<45P9hk+NNc1K;6i)Xa(?|W3uLP|86GrNrDjHfAKZ7BT`b$AQkBEB7?9v6}rYDio z8vTMpAEOBlwYD+MVZhpMV)B+gk)0cvcPsrct|V-Kq1g7KjP8s#fM@?(CzqE8-ZpCS zgb?7}^gH_>BlV*|w$K%;>IwBDI;6xHlT@yVHE-s7F5DOvW zZE&a^IIY1Pj&L^w(rNSq%QdfZ_{!?xy9BE?d)_36mX5`V7ufip?3wX8A|$`#EwB0= zdDRcM0BAZK{h#UQ+D8t${-G1$vKrwY1Q#<3?{#!_B{Rj)uU%9Svy8N|i#Xr(OZpj( ziHhyg#S%sVGf|n;5EpVRR7m|y{15Uz@qh4^!y!>XcRd%AjaNAv??eZ19`uWNbwj`9 zB4DXTmN0wWLKdboNylNvNXA7A>NMm7k%6N@S zeX~Mhp8eNu+tqmSX~)Yr1bFU$@zS>OI@D)g`Al^}n&R9i>tE%b3PwLDObHcZ@kY_* zdS7@%NzN~Q?Tczx*D!K3lQ#ZjM&QP!z#g$pr^KCqOw^A)ze&YG59C z=@ee{C|)$$^X~kIP1(X*E2~op@{HV>H_9P^9v^jho#o#_KhA#bG*)Lay#~i%9D7|J zU(@i8lq|wb#LAwRA#?xbYP@PCWERgWYix8aUX`i&i~saE z@QQ);;I)0@&F+8T&HUYPh7M2l^9fF3%(?$sX1;m?&gZvGf#g6wx|thEf~A_@70Yz8h}@ zB`aJ=cf1ZD4C>c(Nbp^U>G=hxxBSbw*EvkKTrOmc#~C*((#hmdE5j@S$$nK;ph^>` zBr?M8zatJ98Dq~!bs<%)T843lrSOx%(T`iLfAY!O1PrfE3|`Hj^Tw%dkCK<(B_AKJ zQf_e(OqL@BJo}H(kLQrCCBV%vMJd001SZI#lp^BqcIs6h7c77>2m@8WKP{FDEv$? zXmQp-+lhW%zS0jMLJ}s&OVc>|x$a1uQ*KzDNlYajJ D+@sze diff --git a/applications/PoP/poc/res/pv/s3_4.atl b/applications/PoP/poc/res/pv/s3_4.atl deleted file mode 100644 index 76b82fede907332d0bf79e16cb4b913aa92081e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcIiL2kq_2qcp2^x!)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/s4_0.atl b/applications/PoP/poc/res/pv/s4_0.atl deleted file mode 100644 index 1f80462835b5b503cb76095de64581ec68ca90dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2Np8b13`L!VtO(X3SIG_98x-h8djCyJehsE7$8;8{5|k=pOR!TD&!2;ce15!N zPt)Va*Ytfo(SzPj*Xb|==Q2+@sQ2eKycp^o7uML$bo?VS0++Jz0KDe)V+j?Tdj zvgTP#+Tus%0VMd9*Uc|}7O(&B*U`;1$~(jx9c@x5`YXu5tt=A11dwoLV@ItSpZ5ab zc#{Z8)?Y!k#gBX@I$`Xfwd6O*gesx+`5nJR633)J=Ut>v)!(r7>c7KG$Sx?J&-?_k zX2JXx=e@^g!Iy`w$%85U4K;yMK=XW!UkCy=^2f0CYv_+6VAA9Hob$)(?BEv$tzRVm z_527Y>egq-zp{W4DQ%pIUH<6!!M0TRTm9FSz+3!K#Lxl$%lMw9*ng4zhvb*l$EV?& zO)9^{2IwhFD)nOirw`4;h&=B*&U1Oa6OWabTmDt?F+Yh6 z^K!8GcO?E5S~zpssKfMkNPm?VO&oq>g1#S3xqqeoi~oI{{5K&(mymznB!=lv6GyH8 z3bn?WO@FHQk^UNFO)@e49nv2F=9X#G%rgBQ(O-j%{Mhy%n(Ef;8~YEjnKS(z)1N?w zJYxO7Rbl(HntuzjrkQ2>JETAB|EZX6sj$}{IdE;}oBmX==)VYLmVZ@bQi~h;m#abR z|4B%DbLdYXv;D{Y`jh()%*(;zp9-_v|DpiQ2j;gYUb|NFZ^35$zxzZ%`m_GueaPh9 Ro&HMb!`b4W8oqwVzaMKl{XYNz diff --git a/applications/PoP/poc/res/pv/s4_1.atl b/applications/PoP/poc/res/pv/s4_1.atl deleted file mode 100644 index d76e76459cc42d516119fb595f417c7b0d4eedcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2O-{ow5QWo)YoU74tMmqN10*iO{WmZ(&iDsAehm@}q!%RHi9wYt@Fz3Wc(I?Otg37*CI;_Fhl_; zE9wtPB=c*K3AGerj6oO5kNR5@(DU0O(;ES3_^7`nI@RW`zlto~44@7->JJ^?9RFHm z3Xb}Nx^u9j{tO@Ep94bkB>pk~B4~Agl7F@IWBpeVtyiYM2AM9|f1HbdEizmC!1@n@ z6#Y3Zn=SwP!2V->c$@mKAPZNyq7ETYf6wSoIQbQF-%()Fe*pkX{pZNK!%Y1FeAa(- z$jpn${vZ7p6#e%2X8?E0wEBOdNb2ty{Z(Y@`MLk6E9PIMz)Al>{|`ZH_b2@?{g)Qd zdR_9bTc-5?*1&%5s{ZKz!8Gv`o8OQ6leEF_KO7I9XYtRze`Ef|@Jjz%EmOfJ<)He1 zd;RijX+QJv|NnPPe_BBAmT4{qt(a#0hyT46{}i9UvSDi<*nhy&C;D?*Hfz``7yA#S zz>U`FZ!eZ=P=ICgZ{e1%=mXc{uw~N{|CWktq%FOGqb2ah;gj{nwQy_ ze^Er-<6qZ*u>Xast5{8cjb&hUjGI~1Uj;Q^mHg|-Ix~y$4=PdhNB<9Enyat)FV(Ww z^GpBl2-o<068~y4Vf-6`^-m`GR|{yq|JP$Wz8mU4_8-Tv#+{-6Fnm5R|H8x~`g2+~ zyN_iv6Gl2B}Ah@i_A^&~@n%eIu diff --git a/applications/PoP/poc/res/pv/s4_2.atl b/applications/PoP/poc/res/pv/s4_2.atl deleted file mode 100644 index 7c687e365131c5b76106bfc1e5fc4ef6cced52cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2L2kq_2t|`cVnyRcuQE4iZ&0Zh>HRk?kYGbiLT1t3pGr2dM;htrn~zDqK0luG z^#7ml>E}7q553RNsn(4?3lFufg?{`Ee-{L%vN~jypO!)ZDPn%WcST?leg+v)t4k?m z;Q;ze<+Jna$QTliH zaJnDlKlrc0$>+d-QUB%G`Zq*>2AP!4+k;m&`0qXc6<7x{iFH8zmjf)T(vn&HR|oiS zKd5ok{8y1J%c>s=asQ36^;OD$4w-V48T#v>;%LyHJIv7E>-kRr!hch6yBv+I{$GlzE6zuw z{-|)q`wtK4>M6*7=>J^-^Lv5+ay5wezaG>1(@_7}VjBK?4sPEO{aIuZ>j3{vjfM25 zv}8vAB}Ha6+5A_zxn>shm%=3dIb_OFX5>GswJ09+=MFRUcSnB?8Q#C8$gBqKo{zLySht|JwNUs zxfWon|MbWr|5-eF9OS=lCdhvoz`%dGoJRjI1E>3ga4xc LXYu6m-}>(tdSvem diff --git a/applications/PoP/poc/res/pv/s4_3.atl b/applications/PoP/poc/res/pv/s4_3.atl deleted file mode 100644 index 53f2c40856306d94361d093cf699b0b32d681828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2TaF_)5=FCte5lY>fVa{+uyub>EnaiybQxH_s?G_FbvClkc^wpX<3%Z ziu(P<;9J^Xntq#P%En#fyW{U|@O1rF$v(eFKwrM!@%Mg(xqkPODcmaNo&Vkm_#A(c z@6LbkgzN3Ke;o4Pz5jM`-d`{F-wz7M7Y{J^{`-Cd@%*xrEcK7?KKZ!!-}mylej`?s zEcO0!$KQJam$|EzYxdv%a__(IGT^%ZcFCq`?uF|8{^PBH%Y2Zm>zL~ue{bb$=a*Hs z!(zVU?|;vK5%AuB-wIcenf$kx>~NU54&Ubfz2J^%HOOb;Js-TCjQ^56aW-&>h_yq&Ml@y7;o|NrAG)9d?-{CDra zujM+oTSLb^Rd0O7#2p zzyI)m&5-XOY^w3qgRRU<|19vnzEWUQE45>{Q{#Pmp}d3# zG=rzNJJ_A~R}8yndz{^4t6jlKqeWkk&#CLGXG{8|_5L zuHP4eAs$*xi?95;dWJc{K#UB-x}fxHR9`j0=@fe>VmBO>Z8*B9eEjrag=r!hYtEsh zC*ddM#LHv)Ld5VoHl=tgu=c#wD6fpG{e}FBcf~B;c%n7Yp>VqWbbZ!O`AWcwKVhU^ zR8iNG{B#CC>YIXE9uc*Y)ujpg%}6|@HTngIF?tgmp4!GThk@P>6O+4)iR`=(c}wX> z=L*914aK$>Wp=N419-N-4Klqv@wQouCAa|Zrr+8AbW%SmL|eUjsk^p*Wf=#;2_toK z;<>Xiq9X#K4@M-=)HU8?;9y#ehV&3J)&_^CD^6=Lh9lg9KpKsHV43qOhG(*e_YzF@ z+4Cki?CD&bc!7=miJmK7XN2H)zU5WFBd_{l7646$qy1Or|h4 z+ zRwPaeZ3H2`TJm%xTG*CE2tC#elA)jQR3)Z8s?E&WGcV7=i_K5=C-sKc%y7Xg{K|{b z^a)P0zw26a-H2WgyNVu(ASlksVlI?If+T4gby&E;Cph?1zLws4xqg`)7afO3!_p)CDsVxD*z6khZwUNqYC?(Bz6*}_|y)ujY^X70=zjxsNBS|jV+Ok;0?LHqTj zif3q!NPsu}6#Br+m>sX$h$N!%cWJ-8>L+jYc11n&+AooZdRIDJ<-e1DqzLv}tY`6x z#lGNDu5*m?<@^_WN@7li~ zImWdQ*?f{dc`B_qbgr4(c9f2NbxdnuW(-EKMZT}=do>c6GsU% zEIN4AskmOA;D<^=sPigFyy;6N7*m^bEsmb8IHbFDC#TZYx6~0OE0V=8n7BUGAKx-Q zYW;@K+_mGyhyyR9Hr|8%Ny?1fcq1rLVItk}I)N~#U(+GZcO5RzFBrYWU(UU*VWMRm zi5QPFZdQbo!J$^VSppLMs;WR0CN4>2gx%jG4j7qZ&qq~|sX_9ActzG zXVok#Sum6}8A?TB0Yp5*$ZmRvp;cKPM;xVb3H1$JSV~jeR^=&tz*Er;aqBiDfOKA3 zY!f%UCGVLR!#b}<(rM!@1RhH#e>1=yXC3T&p)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/s5_0.atl b/applications/PoP/poc/res/pv/s5_0.atl deleted file mode 100644 index fbdbcca7c545c98164596cb88cc686160841ff5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 bpYu2J>|BCO`=1hb;s5_VXYBdfr}OuJzIh(M diff --git a/applications/PoP/poc/res/pv/s5_2.atl b/applications/PoP/poc/res/pv/s5_2.atl deleted file mode 100644 index 7c687e365131c5b76106bfc1e5fc4ef6cced52cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2L2kq_2t|`cVnyRcuQE4iZ&0Zh>HRk?kYGbiLT1t3pGr2dM;htrn~zDqK0luG z^#7ml>E}7q553RNsn(4?3lFufg?{`Ee-{L%vN~jypO!)ZDPn%WcST?leg+v)t4k?m z;Q;ze<+Jna$QTliH zaJnDlKlrc0$>+d-QUB%G`Zq*>2AP!4+k;m&`0qXc6<7x{iFH8zmjf)T(vn&HR|oiS zKd5ok{8y1J%c>s=asQ36^;OD$4w-V48T#v>;%LyHJIv7E>-kRr!hch6yBv+I{$GlzE6zuw z{-|)q`wtK4>M6*7=>J^-^Lv5+ay5wezaG>1(@_7}VjBK?4sPEO{aIuZ>j3{vjfM25 zv}8vAB}Ha6+5A_zxn>shm%=3dIb_OFX5>GswJ09+=MFRUcSnB?8Q#C8$gBqKo{zLySht|JwNUs zxfWon|MbWr|5-eF9OS=lCdhvoz`%dGoJRjI1E>3ga4xc LXYu6m-}>(tdSvem diff --git a/applications/PoP/poc/res/pv/s5_3.atl b/applications/PoP/poc/res/pv/s5_3.atl deleted file mode 100644 index 53f2c40856306d94361d093cf699b0b32d681828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeI2TaF_)5=FCte5lY>fVa{+uyub>EnaiybQxH_s?G_FbvClkc^wpX<3%Z ziu(P<;9J^Xntq#P%En#fyW{U|@O1rF$v(eFKwrM!@%Mg(xqkPODcmaNo&Vkm_#A(c z@6LbkgzN3Ke;o4Pz5jM`-d`{F-wz7M7Y{J^{`-Cd@%*xrEcK7?KKZ!!-}mylej`?s zEcO0!$KQJam$|EzYxdv%a__(IGT^%ZcFCq`?uF|8{^PBH%Y2Zm>zL~ue{bb$=a*Hs z!(zVU?|;vK5%AuB-wIcenf$kx>~NU54&Ubfz2J^%HOOb;Js-TCjQ^56aW-&>h_yq&Ml@y7;o|NrAG)9d?-{CDra zujM+oTSLb^Rd0O7#2p zzyI)m&5-XOY^w3qgRRU<|19vnzEWUQE45>{Q{#Pmp}d3# zG=rzNJJ_A~R}8yndz{^4t6jlKqeWkk&#CLGXG{8|_5L zuHP4eAs$*xi?95;dWJc{K#UB-x}fxHR9`j0=@fe>VmBO>Z8*B9eEjrag=r!hYtEsh zC*ddM#LHv)Ld5VoHl=tgu=c#wD6fpG{e}FBcf~B;c%n7Yp>VqWbbZ!O`AWcwKVhU^ zR8iNG{B#CC>YIXE9uc*Y)ujpg%}6|@HTngIF?tgmp4!GThk@P>6O+4)iR`=(c}wX> z=L*914aK$>Wp=N419-N-4Klqv@wQouCAa|Zrr+8AbW%SmL|eUjsk^p*Wf=#;2_toK z;<>Xiq9X#K4@M-=)HU8?;9y#ehV&3J)&_^CD^6=Lh9lg9KpKsHV43qOhG(*e_YzF@ z+4Cki?CD&bc!7=miJmK7XN2H)zU5WFBd_{l7646$qy1Or|h4 z+ zRwPaeZ3H2`TJm%xTG*CE2tC#elA)jQR3)Z8s?E&WGcV7=i_K5=C-sKc%y7Xg{K|{b z^a)P0zw26a-H2WgyNVu(ASlksVlI?If+T4gby&E;Cph?1zLws4xqg`)7afO3!_p)CDsVxD*z6khZwUNqYC?(Bz6*}_|y)ujY^X70=zjxsNBS|jV+Ok;0?LHqTj zif3q!NPsu}6#Br+m>sX$h$N!%cWJ-8>L+jYc11n&+AooZdRIDJ<-e1DqzLv}tY`6x z#lGNDu5*m?<@^_WN@7li~ zImWdQ*?f{dc`B_qbgr4(c9f2NbxdnuW(-EKMZT}=do>c6GsU% zEIN4AskmOA;D<^=sPigFyy;6N7*m^bEsmb8IHbFDC#TZYx6~0OE0V=8n7BUGAKx-Q zYW;@K+_mGyhyyR9Hr|8%Ny?1fcq1rLVItk}I)N~#U(+GZcO5RzFBrYWU(UU*VWMRm zi5QPFZdQbo!J$^VSppLMs;WR0CN4>2gx%jG4j7qZ&qq~|sX_9ActzG zXVok#Sum6}8A?TB0Yp5*$ZmRvp;cKPM;xVb3H1$JSV~jeR^=&tz*Er;aqBiDfOKA3 zY!f%UCGVLR!#b}<(rM!@1RhH#e>1=yXC3T&p)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/pv/story.pal b/applications/PoP/poc/res/pv/story.pal deleted file mode 100644 index 1cb8dc0fcaa50cb344fd9401ff29b7c1119cf165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmZQzU|?`yP+({f2w+H1C}0pU0OEiN3<3oQ7#J2jU?@27fFXfFfT6*Ffnh>|08n)U f5N}|(FhPOg!-o%GIiSGM1VI0dg3%Bd$sqs$(kv1& diff --git a/applications/PoP/poc/res/pv/t0.atl b/applications/PoP/poc/res/pv/t0.atl deleted file mode 100644 index d541c08cedbc5577ad633dd7357888bc5a8f2fcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2804 zcmcIk%T>cb477Rta?8t^Cg=bG=PXT z)bx}+dW#8-ij`*wM2ip@PN|Zuizu8Bfsd`l1Ej~N2CVeP(6XiI}?SX zB{hv9&xPpNR|fi+Dq4bhRPyRsgO~0Vc|?Nf4TolrjVqmWDL{U$UR@SGAP?bb5)4fJ zd0-23Ly%WY^>nYuBPN(723fa~161Fy6$yHt^cCxIJa1Wv0@KU-pEXsnH-ipUWE)qUUACX;dRCy&T=d4+#`~^*rQUj4tO4CB0w|3 zK&({Rz#D1zWL<9i|AxA8PZXb;z4#va$SD#dEaUJb9dRs>EmOUw9s#PCTWc98FhQ`t MtCZJ!w(_q10mQdta{vGU diff --git a/applications/PoP/poc/res/room1.dat b/applications/PoP/poc/res/room1.dat deleted file mode 100644 index 71beaa2cb31c2920bd69936a2e52c94cee429dc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63 zcmXYkxeWj?3<9A}>jhByG-m(R9OnTYIsk~0>`YBKA{u+mLAk2H?#bJ${}QzU1*Zpp diff --git a/applications/PoP/poc/res/shadow/sf0.atl b/applications/PoP/poc/res/shadow/sf0.atl deleted file mode 100644 index 313de95f48f0d08f8924b15af4aa6f56bb13e937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9467 zcmdT|OO6{i5N#tc>`hi##eiYJ8Q6>>Bra8moLZZ)yo$zrs?nL?HfM-`sVIEpTEBT_yeE+ ze0wkLr|&+!WBbqV@1_5@cXuDyW_dNeoGzEc1?7bQhZ)t=d_rZO4=4Pb&Ma@IH-Oc0 zuGOYCH|^S-&1va7tJ6978fX@$vjK!_K8p>hT`n*LHnz~D1=T<%eXz}^nTBLR2Zzam zXU!Hh?Ls#UA&gk0Q@oOk1SXz#PMlj&ErB$i7^U0dknM!RC($U@k~$itpBC*j3f`yt0%@MjGP-uI$LNp53;ct3VC!!6CDubI_qQvJgPqbd}fQfC?p4B5XHhP zIR%oqcz`J`By4)8?Bepn0>$kM@@eo3w=@2xg&B{8kEuT^^};^ZZZ{($6eV80GPK zdw61}C$AKa$27zC2LX~i`?c-}c0B(seQMZP76IUiKN!r?%m|P?IKXhbjF_KgW7k-y z?LBWmACsjv%8LO6rJ1Ci00Rw}8pu2o)Ig5M8o_HZU(Wo|K^kO1A}{B7l$Wtbk+_*e zKUB4kkemqu9pwAwAZFwB{!>YkQws!ScNo)bII7k!xA&N&+_Pw5eJ=W%j+H!!K3qOd zKTM6^7i!imdo{r7kg#jkY1U^3JL_r=ZipJ=ef5d8CtF&3T1Di_l*LkIrin;vEy|K1 z0RcI&QD;ac2uoWb=21w(W@g?D2ygrvLdK(M$ghqb=~qOsQXkEqWF93VD3CsSY&}mk zK+vTM$;ql37KUOHDMIT6d)XGCRL$M zwsI;OnDW7tqIe$V*Sj!*c&s9ui$>7L!n9_v!?diMxg<2RuyS zf?qmHzX;C)v$@p%-iyLsamj&ii?F@K!;&%A8avXKR77AS0C+7M%BzcDnHdQw099K# zBz7rWjR95()NuR_{?c^mau>}a>^yN$0W^&CR7OyeA(M2to9a_$%QRt$j)|luSU5D*}&9 z#D^TG|3bB^LaXss2D@UeO54wVxW1r4eJ}4_If7r!O@;ER zS)*Pv+mNo9`CWh>^RX-&YB0sPvxKm5xw2TO#KD!wuPIyc`}cWc6gQ^adwkFBj3PG{*Jkh#ik>ZUz$U6Ny}g! z+@6i|1^OBht+|ot){K0^JBn{lk=*Z||85sAJ;aX4{xOs!n%qU%i$4&JU6%{_?RcK; zCN_9eru*4n*(DFRr{M*y>Yd0XcXtp1Z^$#Sqs<(1a-Vhe0q^D9)^JPqYGdsN_w0~c z{5a%vlU;OwkRGECRDW!>JEHsl?UE!7t>0Mra?ok`x|DT%y#b7DEXDSJ`*KjQlqk+U ziXN4V#VW-N#8%JB;V4az`zr~48;MQ`oXP#Zz$5XLUN}rKh3l!T7c^D$Q1KmN_XQ+m zp+&rm!TRjJKrsBkND&A9vHJpc6SJN5Z0tbNQ!#56NN!Gg<>}ww}pFIpz?C39$)08I9as%ez81nQm z=&lQ)e~u@O@aXI4@&E&#ux>lkLkJ3PrBSm+1FLGbUp?%D=?Y6Ey#c~0iY~o6Aidd( z(El#dK++|kERQirrGGpuCOp!A#KQYvoV)466o=Zc-=My5Tvb;gM`ryXsrP17qn?RG z8n|X%C9~B%%-*)(ra>`s<)11|) zWmTF6r%7{Idfp J=RW<|{RKdNSTtV z)ez>V2zTl8^fHwty~^tL58r?H&8LUIzdRjozJB%UaQOX`n>W0E``O#qydFQlyW{oO zFK%yn{prg)x&C-_C-~pKdMD%b@aFLKVSBN%?lB!%d~g}Vj>m>1Vtc0w7BmQH1xu0dfFE`)_EDBQahz@}7~ zEWY0y-W+y`{_H?Ju)A}wSOCswH(k}B9CaMDK`5k4gDFTJ`j$!NDTd+H(#jGgp~WnX zDv>B*AQ4icD51kJ;tKpwtfRBS1xcbJmBUKD3=(-0EI&p>S&#}e6K$?X zYOWZJ#!y!|O3Mb}{ZMC$EEJOinW21?aS@MZh2j9jqo|CFOp1e}EZoFs8KO=i{Ztr3 zHLFB3o@|5lRC$`+&h`P9LAGTehfRNOdW3Ut+cH$!-L#KKM!4zhn|xsPy=@OA@9p9B zq3!<{+bL0qez+d(uFKcU<31`yhxS5Kn0EjoHo{zM#Sj%C%qv_1utAKwlQ_m@syz!h zisIdI8NPwghxl056|iMo&ZJ9Q0FanPcRebQwFfF(wZ>6D(kf}_DFCrh&x{N)!zzGS z2dO1j>{V8E(al+2Rm4JrSJ{9Q2~)uoZu_VVB42Sx>eWX@c7Q-2)e<{LwgAc3d=S_7 zB}|TtqDLSE%Ok0fkuH|d3q&;0jJV$ArSL?TFllC%DWGzeZXw??D)+FzLN2-TejxVH zWNdeJn&~=Y#}sgt6Opm6&wSXBBTsZ3N!DczXY^+)jZc~0OMM949qtZ;v8HP*U>UTd zatSnXnb?7pB?>lXOUDB^YDqVr9dgWe#a$4D%n_G&q?ow|GQOE+URic%G^l21d^}dU zIh`-*by;Z4P>q;txAc(4Ud^K~2otkXhykpF#z-Q>UX&$)B*O@zy7r+>N%M+C$BRr4 z6H@Y=pYf5(`}-t;LCs74D>@g&l=-N8n#kIH>_HI_X_TslQEEt)P#VGp!`zS|M5!5M z4uQ-FXB!J6XGhd_05c%UC@vuP^sQ@+LHsYjDKd4O$Q-QGrI}B2HB_R@{s1G7tlPuw zp4%5CO zkBu5p9l-&xaR^~rn4C{hK58QpMlqgO)=aP+F~N*XHAG@+qG-g-1nsK#W$IaDziaX_ zF)N7G-Ajqt%+^0S?gDbb<}^4Ex$$&8z}&%mccJY0kx&Y0LHN!pn&&n%g0A2!rEMAz zrp{E42r`5?EMNVRWaX)FCP%ncTtR|Q0rBEi0-~&2h-C$0xPh!EjZ^_N8#46QYFgpO zEKT3q_Ym}jFWq$Gje4N^)7wgF2sq3jgSkXHKJ*zIL)PWh!~9ToDn4y%;on~)BeVR zw)vuZ_maP2wvPU1+Pey|s7LbIpx9?37^t#aSdis?IcvMmQV6E{Op+1+x@8{c*VBOcFbt(oh;sK=P4Sx@~;_MUi{#UkMIGPk7{Klx>4H8f{BP z(Fh7=>0nrZPUwF|C0|R{x5df6yY0D>?6}On@)P3YG=CJ>bw=~EqjkKrCj#y`g!WB*;SV?IHOYbF-46o+K)tcNL@^4L{J`aU#$# zN)vOa!jdpMh=d6komzEocbR?m4?Y`yc;8lmoQ!yc&5D6 z_v{q|g8*|6V@&iP*TDu-4*+vz?}#EX^`B$|q5!kU#AVQAA2}V2UG#`JE^%f|?)MBN iTe3;v-H~!72x?y1!wMcT>4CTdn$cj|)D)@l*6|0Qqx%T} diff --git a/applications/PoP/poc/res/shadow/sf2.atl b/applications/PoP/poc/res/shadow/sf2.atl deleted file mode 100644 index 1f0b6d41538f81225c2ed8af0233b46f9b72fb28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8837 zcmeHMOOE735UrlY2qZQv*dR3;sb^Nbnj>%nB+kK^aM`YQbyEX(LEM2AXE5)@CmoT_ zDtpn4SWHS?&dMbOA3uI|`0vx@@c7~G?r`|~?VCG(|9SiP!0(^mJjnOg zZ||l3ukZBx_4n_j{+A!_-xJ65c=&Lb|97e1qfxg5)py+{6)@W%U~YqsNH;)iRzL&P z>qw+On>AI6n|yD@w_lG=L4^n+=h@g7It3XK5v?R3C5n)zd7c)yfL7W*z4X($NEIcG zXz4kl*YEh7XJKc~v<{fLd-)A5=lLsfu_-;@5`q@ zCZSj$GRTGNiOnz2{}dq=XntbiAajaS>6AXEfJ|B`?s&Oe0)p8FN_Ag0+BMYWg3e(> zw)Qr-Otfq08prQcwu8|%w2F9$rS7?^Q6lISsTvY;6}8%wCkvYUHA?%ah?6=aA5GDaK6f^1>(nKHCIVAm}t z&p@`Mu@tyYQ<*sw8lueA0Ywu0H86#F97lj!q6!2V!Q7(RiIJI##Em>L8=~Z3YjjOj zn9USHrA93rFE|$(vmBv2W`~fCGXd+ifqT=P5ZebQ z$hLPL(y1nKzi1SH){Zr{dOi%B@?1-67T;U@An#hfL}i|IaZnOq;?U)wjVFP6-%KNi z@kRI2Fpj1kFwukPfxRrS454ynbb=gs85p%EVMvt0INpzvh#N+s8^$tk_fw zUuGYBlOG$o&*MTrpz6zA&cX@AjrgD`p$l5ggDo=4t z224ZxPvsnx=>J`(`j&8YDKEDMj}<^y13tIynFR)(`UOf^(FFOPk`5KPAFpm2Vec( zfcQTfG6W|t!cR>epGbt`l_Q@R2FGCCB|3@gKdNmw#$ppjE``IbXV4lnF*0FHV!Pcq zSWifg-X51Qkbp@9L^m-6q5wVtJ+l*&yoJcu#P#+BG$8~Mg#QflI1WdIMhrMLBGD%j z2jGjA5s_64N&W7pD0eIofle9Jaw`#ZEnWe}n0)G3(?}FI3<_#AYZU_#g{&P@=p;+M ztXgOZS#e9to(U}>E5bs#k>z^g_2y<8yUY0|0F7A2O*`g-ZGd>m?)&@0`@85wP4Fk;PV_&Y-SZ&(+spxdnD{0FSwb|NPE?^-6|@ly zeni*C%QS-w*y%8dOVPU$&%P?rl%b*c6m?96S&>>SgV$-xno^R0%bc!Ih148!Kspy8 zSPK&Ql&w(Em2CnFjU|iz<#-{eG+fJcm*;CurT#*Lubggaw2aK`1_q0{MZ>$cF#Zc= Cvtzsf diff --git a/applications/PoP/poc/res/shadow/sf3.atl b/applications/PoP/poc/res/shadow/sf3.atl deleted file mode 100644 index 5c54e5a33d1d145261f854128ff1b40186944ac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1969 zcmcJP%WcCj42EU&P;Zdj1LWQjxflMNxvrjmh>TMX1Fms(L7yQ&rHSvw( zyyIjfL{2c%9zs3>WLgWtG8d8a0O|;=VhIHk`Nldq*U*Osp{;@`oS9CdFv&Eeaty<5 z!5(t(e%Vn3xsZUsD8%_V!9|6xKe{=A_0U?);YElJ-|S_pa;9o%r8jycT_Z8 z;z~x(AG`BF5FCPy9zGk30nu3@{+9p% diff --git a/applications/PoP/poc/res/shadow/shadow.arc b/applications/PoP/poc/res/shadow/shadow.arc deleted file mode 100644 index 1c0f9b1f375f9c247d91e831a452069dfdf31b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233472 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 Q?CW|0>GQ{5@lxRb15et$M*si- diff --git a/applications/PoP/poc/res/shadow/sk0.atl b/applications/PoP/poc/res/shadow/sk0.atl deleted file mode 100644 index 00d2e3526d6588b0e7b143fe4fe4c6fed2dec426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7586 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 diff --git a/applications/PoP/poc/res/shadow/sk11.atl b/applications/PoP/poc/res/shadow/sk11.atl deleted file mode 100644 index c573db602d38b2ead23872b96e092b9b92b12d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6277 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 R1#Vy zvgM))0b3OLI2_KK8ItD-F^RZ?zZnY?_Ym>`+@KO{Irqw z-+ta~`TqCQ(=(sH{_M-?PmTDtEwW z5d*|dP!W+1!!U>rry-Li-U5au8Wu=sjQ`%yOl*rxh%Nt32!iRG0yT#1u9erVuOTQ z9chH>GqoeuMCsUYT_@w`>*l6qOy^_MuaMd;;j-7f{;Mf_*KLD$s!}4 zgK`Ny9vU3v2=qce3?>;xVkFCkX(tP+zyirwv!6WZ<=P?tnbUCc{lGLaE7+`&E$ZG< zQ-=Ywo<%4@$-`l#m4oGu08QMo%w#P{69hph)dd2`Q%G4er_*8}M?jAt!$2XnrAcOa z+kNPYm`5J#0Z1wL-OuKE4CVH+Vardm>T<6UvxZWut)kL}F;-bxoODR=+!a$m1o=kx zTNI&X>-Y>TRT*2O9s98hhu}bL;nZGDsR3Ym@R@Nv7^|u(FGx@&8DQEK{zIZriJ>o4 zTUdyqfI&5`?Is8?!+E}H#n>BpA$j&*pPS}TTifTgYPES!eScufq;su{dRYbGBt_7* zD6m&nDKWu=Sqp+Gm}F@S`Y6i`6#gg|0G@0mz9!ijd9sC?eKXITDaT47|qk+gz zXa4gjhud9%a4+Fo`IqVAwCR4Wqd1eW_iBJ*ALbBtRUf4vg zAks-+EPU|Y?jBmle>p11Q1wo|!7?vW8UzQf-pav$i z=V~KK!jdF*B!9X3bNO7mlH(be^rFLw0cBjbWb%wankIpA=0FHWxOFJkujOi7Y0^JP u=hzF4D!(1h_SzIs#)>hRc?ObkIEb diff --git a/applications/PoP/poc/res/shadow/sk15.atl b/applications/PoP/poc/res/shadow/sk15.atl deleted file mode 100644 index 80217bb469876e404242527ff9177da6572c0d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5606 zcmcInTdpHD5bZ$-frNyFM$w/V#fLH-L7>O0|$FjQ9-N{YJg)Om@=A2Ux+evpW zKUhlJu9wTMQ)TD3FTei$ZTJ7TYqxv*=1tfA@zrj}{>#_zp4eZ%d3w+Or|+iYsY0d-O!Jh!|C~OXsCVP|Ak*oJM@=7K?>S|jdQeF zlblj;Hjcg~cme4gbFOwYk#Rns=Xn?=Ep|NCnxhdHH#Vvt%`2yQSJOvy$6j7*o!O{Vr-w39io?~G_UQ;{$u$>UHn;CL+ik+GcTv%4M9wA1l`fakhK9%7G9 z^)9F;6uc15AQ&TrLyWNw0OWEY4T6A$17mMXKQ9sS^le&(z63ag&H0R{3@Drh3JVk? z#!Xrcb(ELoUH7yV=h)6lzY2jZ5NyDJn`n}`tfLJ*N0QfcDg;C<-^qpi<>e}^{E+T| zIG;^aU((5VVJd1;e~vF6GbDo-17jNiEStu{aRgYB#d$-c#Y;hfyI0u0c)A?|PA`H2 zQPgksuyAS3^62`e4i(KxA8O@v@nlxZBZa!l|e zQ8<~fc_PR?b?>`yY^C1-(Kd{>fwT=J>Gb^yn8*?SYQNo0Z1?i=_qhR1RbwtySag6= zJ0AO&xzr>TsyH3N$|$;L%5g|vCu$&y+TxD0Ob5D><%BU9C@Eo3=9B9_p5d%yOd`#gJ*sWgnOH*oIP)I!a|p)`h184#icJcK({shBZ>woJ6%D#y-&r!X z?>;=j98@-8N8ai!#)Z(}?d@~K7-DXeGD&cw>kyP#Lt(L1ji4tW<}p<~D{sVNaGR2K zJRSi@G~?nrsOlEXK#yz{MP8S4&1UH8HxTXQ(wy|O*iytu0M$i3#>Zp)Tf4gK8WT>|mpF3XZZ&EC&7=j}j>`|e}clJ91Z za^i7PJkE;E8{RxnI95wD`CgtkHV<89#>Uy`=D#8WcUu(!xdC(*Wq^%Mx1H95btr2% z;l`7rd^y^2a|(U1gNOK%8M?;itr-o`H($&aljH0OGNLp@jH9ZO#UJk4Ayvz>!ZiJQ zPN0V}auWjDOuc>gXwqM|hEz|aT@%`IRGF5VvsiTBeR?fhQs=?oVMamk;Y~xkIEwAtMgos+9JjE2 z>zIH{3~fOq#~XZLj^U4SP;Ppq8E>FkqIx=}*2TLU-LM5YIG7Y4HClgT|GWJRufu;e;;$gI8z>5wQw@C;F z%9d9;(4q6;HeoW9WLQ2hX)v)i;y7Xt!XmlBmM6n>s)~3ZTA8C~RA`qzWpL2SiGTi?HD3q9Uj86gy3A>QB<|kk& zxU#61j>q15f^D*Id7Fa69uM`V-;33!iWa zyeA3cX_=a+)OB|^^TM(JyBya|^L9c7Mf+G%S~Mxr;PaS`jw^5+w8egJK3401U1}5) z%EuMT-=eZE*m(zlxom}@)s1t+kT}(d#~lZuT^fu|7*gsmm$w*_)>M-+peR{H^2uD= zRBOsCBtyo;cF}A`S>;&oA;TJ)XJ&t@GLn{X)0#xym*Sa%+Wo$2S!gS=%`St6cJk!P zHsj4TC+3?=O3sL}aCLu7D_kq4ay;T@W11<$O-!Y6FwN^b(n{H%qf}nSc*v@K6fM*6 zj8rxYXBMR#IKZ%VPBpH$Uo5QE7O)wm{8>YhaVWD$Fn}q^#xxj3rfBM8Z2^uPK;9@I z6p6x@3o|>W3&*tba{Vh`Pe;|AWLmujOBn7m7LBxc|4&f^y%<0A8rfi!t!sgr{tIgO zAh>}k6Uu!y-P;5^^c;F^)dC z17ec~j|PRD@gHzNJKRWhWXT+Xz5Ztk_@KHrmJB9IshIwZLgQ{u5{?7N;@w=f{3HGs DJ%3bj diff --git a/applications/PoP/poc/res/shadow/sk17.atl b/applications/PoP/poc/res/shadow/sk17.atl deleted file mode 100644 index 86e63a6f439926bc96952166a7bc755ed0a4004e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7696 zcmd5>OOD(&5S5XQ7Xc=VF%Vlz*Xs`tA9(-Y z`?qpG{&+9=zaH*B^FHm(@M&0I&Zcv&!T~JCag6I4y6)mQ&mqj~6gutz3SuKZTdl@u zAcfXp0A5(S{)!t-xqI2 z(q8~f+@ZPBv@Hz{CzalwfB$pwHbzYMoO><~IrWcp^1Q|;8b{35Y8$J%3n_vB+o^H3z_8H@7iHBb_kC)?k#JC*#V)|W=`lacS^19k5 zO$`vfXX+>vOsJq8G*+IaTLzj>fod6*JedSJnbLhfVM2}6CtA}JX2UU?7?gT|1qFbo4#Jr#hDw1b#uq%4=OP&3J6}-2 zP$f`j_=L)OZ%FVE7U+cw0pAj%5_pU$a97+-IsgGzO9(xQ%jGCp1&9XE7^e39@U6At zOvfPCXY5ogkaefL9cqR2=va5KIzW~mG--L!AEbc#iXtV1`EJB0Y`W8W?h}MhmsS%P)X_}uZcR@I?q-;vQA0rG@>^aPg(cO3l=?lbs7tK z5_O`a*eb=v={Cn>IA#ZihpK##t`gJk%2^N!o6fFxZo8X(lxIiGRqUw|U?NYnc^nRG zI0)(nO*Q~mREJKBX_L^wfV-AseUKzuzfVT+Tnx)F`?;$?B9cESk4GvX*h3YNm5lbg zEhw0?ypk#VuszQ!8SHCZ0|3d2!ZMInGL#C}0Dye^lT^v0iKCN~DnLciZA}Ky6|Zav zrYJWn86s>RrQh=U1-H2O;YtRNv9%KuEQY`xQn~ek%VPJZ^Hi*Nupu!kBSY9+taq>< zF)L9l5XjZ6D4U1*BF@Jvc%UOUWM>R1{V;qOPC}1iXIfo4Am)f9&!q{{6k#cC>!HpK zWxoD zVA_RYhS@BWFvfZ@E~(n6#jMu3+mhnDQf%Y%061?7c1hm_<|BlsZ6U@D>pRcX*RBpT zgfQEHIZD4QaAswpHl1YjI;No~;d@5Zl}zrMO=B0snQG=-`Q~vYB>LQP9)o*3yy(`Z zA1)t9CtjRJ&8)U2fbL8RsTEC8u%H7*scp2FKyXL%4sMQH&|VjW%?8qXGK(;5nJRSF zTt+p-Aa#@lRoUp|6^XssFwD8iH&e+JayWU`23hF}=H!=)9b55S{#-{2y2=aop##8$ zMhGX)S1*|YBpd0kMp&!DrXK=VXL;c)H&IxVG%~v0e+4sEV(Ahme6PH&pVL|W$>wgQ z#m#fQh*$9cIO~_osqZ9Ct%c?5%XPhf+3)=;W2@il3|6>ng5M0WRyC_1E$K|Fa8086 zgcTr6e2wN>Xgz8D2yZ)X`qmfx)5ZNVT|z-lWHiaCnTf_oXMTr;of_Hb?BusvnVm#~ z1AG_Oq$ixApn9~Wi5fq3G3nnI)CtOkvEs}fyzLpPt89@hgKcXnSGBpo(;r|m@3$Pq z*u3A|5rC05^S&qPI`UVAP8PXC#PI}*Iv{V{4W9>p^?!84yC zDJHqh;ZgZho78`i^+mSrx~YOI7-0Mt(-OjwaiVccve}=f&M7Q~*VEZrd$NcWYgU6= PK1WScQnjc$$=&)Nll2r? diff --git a/applications/PoP/poc/res/shadow/sk18.atl b/applications/PoP/poc/res/shadow/sk18.atl deleted file mode 100644 index 07498bab3e16679765b75245eeeae844628a008c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5856 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 Kb+ty}2fP7GXg(GQJGvit35AthDRX4l& zkSGlt`(Oe);-gq>l3h(o``4ep{qn5)`svy|fB)o3*FF30#XXY z*mW#f1o5ln9BzEdB)1xL$5T_D0~@^x`#R``=Zz_!ITiNXoiYJpF8LIQGaME>bu#JL zj@lNE+&g#V*{k7lgbE#05xWgg01_NICe(|c(?LWOvQiL$pd2=micNH&Ji$j$G`4xw zg8{(O=P-J4;pvg~gp{#~L=rBFRxK#E9OQ-@g19#_bSXzkg9%$onP`E>s|S6YimbYnD~~ic2p%h($-WwtbCeP2E8wjpPF(J zHHE7?X4RWodW07@+u^CN3!4ne$|QaM8W0OhvRoORbHa zVO#2+AA^y>yHjbvrgKsNtO6w6Ov`YDCW#`%Xe!$2-Dt9VAra|N20tr!U*$6Jt&@?(5w)b4%9F#1vv+92T}d6*0Ta{N=gW7wxijxNUkDuB;b0 zeS47`drcU!XeR@2o7~`-%Jx}rn^$g=q`*2GQW z9vT4X3yyUPv49A1m4%$e7lFY`9Dk7-6!2p@qCm|ceTqLy1Aioy0BX5Rh1dx8wK7~G zHvoJP11zGRBY3&DVoC+!~1x;#`l>IOnhOz|fW^3E>K^R2A58b=YE54D;er$)@cIUFcKDR_nV77Kjt+>IOFGTad zMoJTD(%7;-;5wS%GE05a)dWf_lvCu*9*6@Z5Qi2#F3_Jy- z9?uJmadoE%)#J`<5YqS?BnwQeh_B|f1uud2jgS`b6Grhmg`hA01=C|g##xD7aeO-! z*20dmGa_j&%`fF5jeVX>4Jqe~A;zwl0%(EpHA)=JWtepmV$#`AcFs$-^s9%90)4D6 zhRF>m^FCH%-b5RwIdNj*xxPVTpp99{XxynCj4bpHrsaDaBPR8%O_TM8vo&)}OMJ^n z*Pmj|dXv?XW_uvM{9HG_b_x@{u)O!!0NHa2r(Fy#kb4*en7#ks%i65phs_>&d7l0Q DlqCo^ diff --git a/applications/PoP/poc/res/shadow/sk20.atl b/applications/PoP/poc/res/shadow/sk20.atl deleted file mode 100644 index 6b1e0f7bacffc45e74c6881f2519336419258458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6636 zcmc&&+l}Nl5S)WQY#1B6Sz zcsveEIO~|3fEmZ4&5YnjHb*O?W0q{qS0{cPA*SXz!jHujc%hNvj?~?F%xEVRl;`Ct zvW&1dz|!;6^YhdB%$d^QwK~T5Fbw4+9xo?G&DMeFNfz>2u!mAk9fD}Axet0=*VE|~ zA>2H`D0cv_E}O3;oR)H%Rboxng8=QuQit;v`%b;~C@ei5*O1L#)eM%e|{O+9d{Xn^oQXpkZs(*sy)5Zf7kd6+4iSM{*2IOEg@t~d06L&{`h zUi!DmWb@vt4N!67^=Ei*u*5t1_v^4w!F54|3c7+Y$4L*!L}xW3oUDgEtWian$cqyr zk%g=WreCHsMkHTZ4=cDyL`tRQG|C9|Kx=0kkemA?mDp4diJA)b6WQby^`Vr9Yz-AD z%jSw6TG?oQ=*de&?PWytuv?oi0Nlg|2G@gcltI}XCRq=hO@!O$u#p2SJA@Gy7fU%mKr}7c?M+G20GOB?iF%Yd^^!^)IxkNzGX=Osp^NJibE1a} zeXCSScKk?yE)ndF%~K59R2XW115`qMTQ(vumCfEv?tw}D zdG}UzHAK&*+UJII?NIvVpBd;1`lex)SE@ga+4o4+D*}$Nj7J=9G1nfwhe`3Ifjl^v zl<14j5ExuJgm(yHb)s`zEU2plqaa8RA$oaiO&HDvVML!FC5cKXg-{W3_)Ay!ou6_H zNf^=3VhnRydqFUafaoudQh#v`uS)c}j1O!v9uELYY?bI^QwBl$YF^5Sr2(gdHin;y zpDGY>i)=v~(jt4J37Ohd^B7MLq8=`|@-mI)$7!OIwSJBKukTfLdCtkaws?-1tgn1{ z3$lhTOCyYEg>7Y14GWAVnCTcnV9|qq$C(}gVG4LKu`v^x2!we?fl$2=Q4=cZ0*tc3 z^V0%dKo2_vad4`#5v!^PogY`8qe?k+QC&mjm=RQ}NNk!jKQBw@Aq3&_QzX}RdC66a z6Sd_+asu!odXO;`r=*Jf_W}=o>Vd-vq84onwn()^LqiR$bc#Wz$mHr8Kha`=!JmuL!3Mb zzb`I$1(nn^ddebEjquN};Vj@>gn|?#b@e050FECw>`rT=6s%bO8}bKmHi4&q=nh?w~*wC>^B^eO!@*H$5gWXF9B(tMsueWz(Y Hz2Er{GL={t diff --git a/applications/PoP/poc/res/shadow/sk21.atl b/applications/PoP/poc/res/shadow/sk21.atl deleted file mode 100644 index d446b37db76abc39e80a553000cac3ffdcaddf46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7708 zcmcIoOO6~j3~d8mco86g;n;yOE5r6aN5~BVB#RtR_35te_Bh^VnPcQOmG?+WA|>_A z*l+|)>-R)b6d$FU-+%k{mlucszuX`0K0bSPIQ;wkt<-9H5NAmbvo^PN}CGhZ`taKGOhbY87a-Ei%LZcU_nXCe8%Jn zh|lM9+BjilngoCuD-e}{N$H*wR`R6OoF(cn{GFFDWu0Z2rfr*NqSB}H`PhK~nAX)c zMZ2zFI!sDSMhNf(+;vOGW2+OwOp@VFJ0O={AiNa{5l6VEDN7KyuQTT1YI-UlquL!X zo;@6k&3P;aEhwnnU~DSZgw8XMyA;CQs(qb`@`6Ewwlz3t=cq^R6drM$#%MsvP_wcH zSifJn?{B{{SKJW&EyE*odO7I{=>&W_KL}Ho5%drY?mwMC$&K{yEzuDkxI`4X9ZbRq z95H^MKg)@F7%40vxp;nyXoFeQmdIgP;13L*5hX}qNKK4YF(UtXe)r5Js^#~HYCXTB z7SUEx0F5?&H`a){1_yp$F1@%V=8JuYT?5mav?3Hj7Es1I-Zs+6sS8~WkLj;kAlahw zNC+usU_W|9WS{4^@G-#FvLQd*(U$5*{1yd%CE7i|sWxVYW{GwCm6&+*mHhr5q%_C! za=S?*kVwo1b7#+wW@~zz3MV_Z*||<*w&huik>qYu(J}ElYcEn*+_0@2uuSD2cbj%M z8!=Fd19!J+8~L1PMA~-kHf@!G92p@%V_UYO)R5NTPJ3DgmNmE?oCMp%T1O(-ALWsd zYORqd8yarimPKG)&I_=8NwILvHQw@&L7wG_{sgeH457I62kpR80 zCf;iL9;IuQwM{_ao+<>w!+c%kwhFOjQJY_*bI!Foo+Aq(Xp;CCZRjHbOZwubg%5AD zr#h-!Ri?gH&6RP2tA_8@z%U4grI(Ik4RLsz0YRk)vS6Qb^rwigSVMxCIQZjHKD zB1S@;e88B5tHFc`c1p`8N+4p}7!CJijudw~vN$t>`qKSz^!CbcGuHPdzKM5b$=_c5 zLQ5@*eFl-nAQ2$NJ!@YCQNq+%;Q`u?m&)xgv=*mdXsv0mtEkk|V9a0OtPt_toswfq z5{UQe;B987TvCzj1I(|-&7g3{9g()26=B2`ED5sUO`Y`L2nOY8B3hk%q%!6j_f1bJ za_U~Ot#2v`{i3o=z6`NnhPy_;vV&m28{5ollIEvx*pfr3!}M%5_LU*ZS{e{tYO#+b zPKKnlS5E663eFr@OzkN_)^ za3cWa{)bUSVVEzkEU#fm;5ck^xElNXAwmmMemQPN*M$YPusD|Z*wi4D zfMsmggW_@4GtMyT(NRSrjriEtSe4(pc3m0!cZYX}I`*xty1mkZC??k|u^62Vl?mFN zK|=&t%tBC&bND68)$eu%!5ev)?+hzhgkms^YXX!5kQC#WtdD8*~qwl{?c9= z)$7WKbj^!v?J#&9ouGq^3Owjk)zzitt>HI*6d*7MnMjfW$Zv`HSNs zv5T*PbY+6|4*^;j#PKz7Y9J!C!*LH$l;VQ8eIG!Gi(1tmJl_&DBCLT)Iu!X0GU%*F z&0&WOI%{y}#aVfP_l#E$(fAGzSi5;t<{YuwBGU G4)_n~nLpJ4 diff --git a/applications/PoP/poc/res/shadow/sk22.atl b/applications/PoP/poc/res/shadow/sk22.atl deleted file mode 100644 index ae853daa24a2d5f1f970890c18c1a07ae277065f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10504 zcmeHNv637$5FIBJ0TBrSc3qWyjxNG~z#mXW%m)z?kk2l)dsoL9zJPCA-h16Gsio1Z zvCoc}a?MEHPp?}ob!%qNKmYXO4__~z|9V>P-n@9REWdsA?uO4lzPWqN=P%#hzUA}x z?_TP8`u^1|`~TeBO8@KajpX$3Zh5m@%5^-J=B%-+wkO`SE!Fz-EO=TW%Wu7rPG+v7m>db(ZzWYrZ=VTEy?AK$X%SHVq_rQs?J)8L`a417T`+fB%I{s1QG24l4aH{Og)$1AMd@W_Toi+B?d1WbosIIBjTlECz z`nal$mr>eJyj@rsqJ)oXR-&S zH3$0lND%zvXqh%1zoVM3D%Kp%!8HbkkPJ8I)l8#ZMupd^PTijaomz~|?Z2v(`epnu zIu+13JOibf*0qQLCbbttv)~aofXAsFA0zRs=S6X@HD4=D<6)&wYf#RB&>y=p6#zG% z21{l>PSt5sY?U;Q597{~9-LwlL9C z!wN}SGtI$OEP~|JPHBS%HtMpXGeSVpto#&`z9lwUU?>VMtqzw9xmVEKLU0fIB}jC( zpX3-FX|W$j(heEhBpIbiavgE4RDo9!FHm1G#Nu$g+%9jIG{=wblqKC` z=nn2}=+$-Luq(4O<|{!0$Tq2=CwJe*d-Ds(E=EhTzmqLtV*d8~OYc=+EG0Hih^Pcn zOJI38Bnl?@WsU+G3@txvf`19aywM6*L-Tt+BqsPZ_`Wzj~DHlLAd!$KC(E85%37k#RoFy$*%*&~(>j6H>Q6lV!Q^=Qhf z+S4k$e73r|69ukvEXyHylP)Oz1)aLH*MDZ?x|7!@mzs=PgG@* zr(Tk)UWtV7cl&+!sO+?F8QbL=r4&&;z>mZjYdOqt8&L$FbBXs*&p3`3D1sy`B;{4q zC^C^iQCV65+hNU~-3w`yp|U6y&9UY=TXqdFIjf2h5I&RhU}RmfqEZXX1`04z8CpYd zs}6Zf>ipg}7?eq-qShmVI#B6{_(n>bz3+|MnsRKAb^^tPvfX+>6d=PU&tyQ^{>|d9 zXZvQ?97oXmZsgcSJvd%oEw@Xfx?V*{-VB&DCz#~;1e4h3m|6;2jCO*2Lb&TY26j_% zREuVRUV#*W@w(6@1Fm_OTci&46dDN4wCM}n8U{k??BuB{ zP`ibb);sRhma35*c(gVBN%MHTO}~uk)nS4)F`~COPkK8J>dgon^{SPEo7cRkTGd;1xqGpHZSDo& z*&SaYq>#url1;_^#*4y}50v+8Q{|Uc2nUcxO@^Xed_~A9mMH|R0SK-#-Wz=y`Xm}y zZzOpkTyU3XovQI5-dz#{nk=c0VTHmP)fOl$+&v^bEr7_}LKP$s1h}cng1J0wsGFTB zh(f^zJhlrgZYIh|!l6Suy)5@Rvn&~U&w+p$@LDhj113NmkT4Ua#I~G!2+ntZJ_79e z!Hfgo<{7_v_FVp7S0k{yE&=PeNZtF)3PTP1sB8*lvVh246nIqlxFlewX1nFL{+8^h z$kvLn9aj$mo*d?5i;)b_^3#+PwHUq2#c`k%Z@(Y4b0gu^vH#nHCT3lDY7mh9`WB5^ zT53x~NmIh`=3Fo%yeCk1G*ncA#RnwS-HTRYQ(b~r;aH`MswvMnrLlrTC{*kfA3Oqq vD%-%`)vyM`m0oSM+z6mhT7Zi8^~b|Eob={s34R4_w8R^GV?*yE@WRBuxA)DT diff --git a/applications/PoP/poc/res/shadow/sk23.atl b/applications/PoP/poc/res/shadow/sk23.atl deleted file mode 100644 index 450828b1871ef8b57b166024c64bcc424e096e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10055 zcmds+O^zfr5QTFj7O-If3&f&?)brCL&59*UZh*v^BXFmzWU{7d8aNSGA$c$U9N~0! zwMGNdkeaSchd)1u?Qo>4=Eont|Mt`A-@hKF)2nCCrs?lbPPe@O{MpS5-oN|&wcP*u z@>cFYef{Q!_OHGaZ)D{&31}4Gi?zq~m#5AnjGQ7h>#NBq9Zl_`W z*4AfSZ&ul7j}ojD->)m$q5O*LXOX%$ey&)0ORLbhNJ0RUlH5532fhmN^lF z<#5B&UPdkCm1!b)f(aX0&mLOM&zNLkbr<8#54pj2z01+q2TVFluAN2bsxQH3lLd~Eu{LkV*o)7?#`F0r=|l3HOn zcpy_e8gR0{1A8$MlI&5eUEyp&-cF(*+%fG)0%k3)NRe%s?3~Jz?0kd+VYvpB=0pdMDITNBRcA8# zteuV_d2cqc1E^9*5OZ%xxfg?bV1v43QnAC%jFb*jtI?x)buCAm>!bF~rmna0!P9=z z55Q%){a@zj!BF4ZRPuc!*D6;w?rs|^d&pox<>E0k%O;(O>6YS5G+G3LlYq3`C0EO5 zX?x_ut@YewOb2)zZj}iHULPE8H7oLP6$6rP?YpX2O{Nj_PqMV8F;sX@A%X|!q{D6O z_AIlF54SN@DpwA-X;N}$e2%JkNTV{?54VBfp{IN>kDP580Wx^czXC8G(3KsE+ zLPYq(T=Qxqq~Bl@Wn;3NBzoTiAyyf>{$!15+JP0y#?@Mvg>Ihvn_L_{?co{BeP z=gPDU`>8XR5w5d@Z8o;wL>UMY1_+hvUvfnO&K&-l^NBYN1LMb6nvG9{%&;F%nUWMq zgh!m7PMI(iQGFi~Z0(oVd6h;cVx96PZT$CA%!CoPGX#wMskzG?Ng`C?$uxc^HBT~P z2UD$yPn~?{crFz#>P;xS1GuX;$W`Qi_H${;xK(E;<13=nDT#p@6_yV8 zy~d%QnYk-?n!=@<-J?uxc&oBIO9>K;vVN{3X@iphtF-W>fWZXgo%3#K!S~mYp^}`e z=#=?^o6WVW+2N`(G0>op8@S7;6IwNYD5^+f*spCV*YXq+I%IHln2f1sh&3HNaa&01 z?xPcH?~=+DEfz4QN}wbQ(~-Jj{B)czsSawz;I3@RP-{&GPoyw2ZBGpt849z+KX!5L A=Kufz diff --git a/applications/PoP/poc/res/shadow/sk24.atl b/applications/PoP/poc/res/shadow/sk24.atl deleted file mode 100644 index 258ba9322a9c1ae84007c202ba520df978c376ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6198 zcmcIo+lm}F5N!tnhCmF#yVzz8e(=L${E|<|9|ZC%`ItNf^>rpQy*n@Yw7gHwIaQ^W zdU|%(goxdiy6RM^B%PAf^V_e#{QSE4|I6HbeEaHE)BN+@-8-(Q>zOerD=FL~uEFYV<&H3rlLf!I#GEEb!Ar0p?B?_l0r2}Ps>LE%A zB0LW#%G!1uO-9l2p`-9jN$OP})8n3^4$k_1kZixF6E?f^0FnHqJ!D-6k(ZPnQ#wIn zU`f&OJRc$HGVFXF$G)d13|Zqnjp?sJ?oFZCAw*%HDoN4La|r1}mguLaR|ak}NQg>( z-y$T+ zWma66M=Pm>zSsebrOxk$tWbB&yQbE^=*{^AY%q*w!722Bcyd3PSBXPi)*VgbRx-Lp z&yX9xTFodJX9aTS82BXCnVkNOXYgH61J=Q{ibaSMa`7!(M?H%)9SBxUFT)JyQ;YOb~V^xiM!U8R5{#&o~$CgPeb& zT0ubINpy5WPo*CxyD8|;mWD0#tnsRIE@h^u_v|1>Xf!ngiu0OFiHA)QeXfcW7jS^s zTaEqD+%>i2;%(vMS{0mJ%kiFhS&`U)7>jWeajwGQ^oySw!pbjn&hIVW`rN}WoEPLpq%kyTLhA&Uk{xiLHZ2#Q5(zjb zHb!ZO!6G2>F><#uB%U;LyVS*YNG&=p2(3BGMyW@}LG4G8n>n9^l2h9=`QDN`VGbSJ z3I{a<5VO#>)Cyp+x-c+Y=*oq+i7~Ixmns>VCHve~S^o>vTko4s&4uvW1q zNpBh~3BXR=o_K{=E4`u~OD`Axv@N~R3t$LH zHB;oW3hj;fo=!fIbOO@&-V^)%rh$} z9JTBS)MVgRF-?U%;cKMlXv71ErH?!<88CXD5@)^2ksgeHLB`Hdh^$j*|ANe`)OOY< zz4^3J=g2aVkb9UBmTYXuydhQct(We6(|l>RH2+<;3hTNkzWkvSavAkivx-Fx+a!|VB*+jol9W= zWj~*=Ub+SnxhgOcoO@K;4g+~m{Z3Qk3AX)l5@GGLDr0IQ0Bi|ulzozj;yokb&tjrt zJ{xMM(U-7?hvNyy982b*!8sWY1;?0SV(!6&=9|mUnWL)!+aWB=3FL7X{KSZvD!_I| gk-c;wcm8$HcP}{(z8jJ)qB-fSVsT$6o}lIVUq(p&{=?U=B>(l>r+2LX@!jhW%>RD= z<~{R2pEUpR`Ch##!&_x)v~~I-+Q_Wh;d^fGHUz2V*VmmBvM%4(~__#AHOuxS2y)RycML ziA44%OO*sTHqbiA?N)dH9Tfz)NUrtL9C%_nCR8BtlL+=E9LLy0(r3%fl1QE{s zNS4~H`<%vn1QQ;4O1s{yop+!6&{tJX!^OMy%FZ?guI$*>xN`2Eq-}T6;(Ndt*{GsF ztGHSeYER6OL1M8qn~fk^B5mWkuG_`J9}oirxE@Lir&nfbQ^c_ZFqDpXA6@NGSjs9|FBT9AF>d z%f
    исходная постановка (путь A на AY) - -Полный разбор с замерами — [`../docs/sound_plan.md`](../docs/sound_plan.md). -Коротко, почему это оказалось дешевле, чем выглядело: - -- эффекты уже лежат **8-битным PCM на 11 000 Гц**, а у CBL есть режим - 10 937,5 Гц (расхождение 0,6 %) и ровно тот же формат сэмпла — - **играются как есть, без конверсии**; 31 звук, 103 941 Б ≈ 6,3 - EMM-страницы; -- музыка есть **нотами PC-спикера, 7 КБ на всю игру**, причём нота задана - прямо в ГЕРЦАХ — пересчёт в период AY это одно деление; MIDI разбирать - не нужно; -- AY и COVOX сведены в один ЦАП, поэтому играют одновременно; -- отдельный таймер не нужен: секвенсор музыки двигает CBL-callback - (11,7 мс), а короче 12 мс во всей музыке всего 2 ноты из 1469. - -Фазы З1..З5 и список «проверить артефактом до кодинга» — в доке. - -
    - -### MOB-SPR-EMM. Композит падающего куска — в EMM (1284 Б W2) - -`mob_spr` (`pop_room.c`) — самый крупный буфер в W2: 4 + 64*20 байт под -композит падающей плиты. Это половина нынешнего дефицита W2. - -**В БАНК ЕГО ПЕРЕНЕСТИ НЕЛЬЗЯ** (разобрано 2026-08-26). Цепочка рисования -— `pop_room` (банк 7) -> `pop_mem_b` (банк 5) -> `blit_b_clip` (резидент), и -трамплин на `pop_mem_b` переключает W3. Указатель на данные банка 7 после -этого показывает на страницу банка 5: блит нарисует мусор, причём молча. -`--bank-data` вдобавок действует на весь модуль, а `mobs` из того же файла -читают снаружи. - -**ЧТО РАБОТАЕТ — EMM-страница с маппингом в W0.** W0 не переключают ни -трамплин (он трогает только W3), ни звуковой ISR (насос живёт в W3), значит -адрес `0x0000+off` валиден и в банке 7, и в банке 5, и в резиденте — ровно -как у атласных спрайтов, которые тем же блитом и рисуются. `blit_b_clip` -окно не трогает, маппингом занимается вызывающий. - -**Цена.** `mob_spr_build` читает три части через `gfx_w0_map(a->page)`, а -приёмник должен быть в том же окне — держать оба нельзя. Сборку придётся -вести построчно: строка части в 64-байтовый буфер на стеке, перемаппить -окно, записать. Вызывается это лишь на смену тайлсета. Плюс -`gfx_w0_map`/`unmap` вокруг каждого куска — около 1350 тактов, при шести -кусках меньше 2 % кадра. - -**Чем подтверждать.** Падающие плиты в комнате 1.2 и каскад уровня 13: -ошибка проявится не крашем, а мусором на месте куска. - -**Дешёвая половинчатая мера** (если 1284 Б не нужны целиком): буфер объявлен -с запасом 64x20, фактический композит около 58x19 — точные константы дают -~180 байт без единого риска. - -### PAL-ARC. Палитры — в архив своей группы (полишинг) - -Файлов палитр в игре шесть: `KID\kid.pal` (1024 Б), `PV\story.pal`, -`PV\pv.pal` (по 1024), `BG\pop_tile.pal`, `BG\pal_tile.pal` (по 128), -`TITLE\title.pal` (64). Всё, что лежит в `poc/res/tiles/` (36 файлов) и -`bg/pop_bg.pal`, на образ не попадает и кодом не читается — осадок ранних -экспериментов, его стоит просто убрать. - -**Что предлагается.** Класть палитру в архив ТОЙ ЖЕ группы, где её -графика: `kid.pal` → `kid.arc`, оба `*_tile.pal` → `bg.arc`, `title.pal` → -`title.arc`, `story`/`pv.pal` → `pv.arc`. Тогда правило одно на все -ресурсы («файл лежит в архиве своей группы»), и уходят последние шесть -открытий: `pop_bg_load` берёт тайлсет и палитру за одно открытие, заставка -так же. Отдельно ценно, что `kid.pal` перестанет читаться своим `open` на -КАЖДОЙ загрузке уровня (её перезаливает `pop_pal_game_load`). - -**Чего это стоит.** Элемент архива читается только в EMM-страницу, -поэтому нужна маленькая функция «палитра из страницы»: `bank_read` по 256 -байт в буфер и четыре `gfx_pal_load`. Буфер уже есть — `pop_pal_buf` по -0x4000. - -**Что теряется.** Возможность подменить палитру файлом рядом с игрой -(`pal_file_load` сейчас откатывается на `a:\kid.pal`). Решить явно: -либо файл остаётся приоритетным и архив — запасным путём, либо fallback -выбрасывается. - -**Почему НЕ отдельная папка `PAL\` и не один общий атлас палитр.** Папка -не уменьшает числа файлов и рвёт связь «палитра ↔ её графика». Общий -атлас экономил бы открытия только при загрузке всех палитр разом, а они -нужны в разное время: `kid.pal` — каждому уровню, заставочные — только -заставке. - -### HOF-ENTRY. Таблица рекордов — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Оба показа оригинала: между credits и attract-demo и хвостом -> `end_sequence` (с вводом имени, паузой 120 тиков и возвратом на титульную -> картинку). Экран — рамка story с логотипом, время в формате `59:43`, -> строки с тенью, мигающий курсор. Ожидание конца победной темы переехало -> за таблицу, как в оригинале. Протокол и грабли — -> [`TASKS_CLOSED.md`](TASKS_CLOSED.md#hof-entry). - -### MUS-WON. Финальная тема — кольцевой стриминг — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Кольцо из шести страниц (96 КБ = 9 с), насос заворачивается -> по `pop_mus_ring`, подкачка в `pop_music_service` по дистанции -> «проиграно / прочитано». Разбор и грабли — `../docs/sound_plan.md` §8. -> Проверено в MAME на сборке `LEVEL=14`. - -
    исходная постановка - -Трек 56 (`won`, 115 с) — это 1,2 МБ, 78 страниц EMM. Ни в `POP_MUS_PAGES` -(20), ни в разумный бюджет памяти он не влезает, поэтому единственный -оставшийся неозвученным кусок игры — экран победы. - -**Что нужно.** Кольцевой буфер: держать в EMM несколько страниц (8 = 128 -КБ хватит с запасом — это 12 с звучания), а загрузчик дочитывает в те, что -насос уже прошёл. Курсор насоса (`pop_mus_pg`) при этом обязан -заворачиваться, а загрузчик — держать дистанцию от него и не обгонять на -круг. Чтение страницы 33 мс против 1,5 с её звучания — запаса вдоволь, -вся сложность в аккуратности индексов, а не в скорости. - -**Заодно.** Тот же механизм снимает ограничение `POP_MUS_PAGES` со всех -треков: сейчас каждый должен помещаться в память целиком. - -
    - -### ARC-ATLASES. Атласы — в архивы PBA1 — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Восемь архивов: kid (58 атласов), pv (78), shadow (32), bg -> (25), title (20), guard (10), vizier (5), skel (4). На образе было 232 -> файла, стало 8 архивов плюс шесть палитр, `kid.ani` и таблицы уровней. -> Индексы печатает упаковщик (`ARC_<ГРУППА>_<ФАЙЛ>`), серии код проверяет -> статически. `atlas_load` разделён: `atlas_attach` принимает уже -> прочитанную страницу, поэтому чтение из архива не дублирует проверку -> магии. Грабля, стоившая отладки: имя архива обязано лежать в том же -> банке, что и код, который его читает, — строковый литерал из чужого банка -> после переключения W3 показывает на другие данные; поэтому наружу отдаётся -> НОМЕР архива (`pop_arc_open_id`). -> -> Остаток на будущее — палитры, см. [PAL-ARC](#pal-arc). - -
    исходная постановка - -**Что сделано.** Формат PBA1 и читатель готовы и работают на звуке: -`toolchain/pop_pack_arc.py` собирает архив (заголовок 512 Б, записи по 4 -байта — offset в секторах, size в байтах), `pop_arc.c` открывает его ОДИН -раз на группу и читает элементы прямо в EMM-страницы. Набор эффектов -уехал в `SND\snd.arc` целиком. - -**Что осталось.** Перевести остальные группы: `BG\` (25 файлов), `KID\` -(60), `GUARD/SKEL/VIZIER/SHADOW` (~50), `TITLE\` (21), `PV\` (75), -`LEVELS\` (15). Каждая группа — свой архив, потому что таблицу держит -вызывающий на стеке (4 байта на запись, у PV это 300 Б). - -**Зачем.** Замер 2026-08-25: `open` 51,4 мс против 32,6 мс на чтение 16 КБ. -Стартовая пачка ресурсов — около 142 файлов, то есть **7,3 с чистого -`open`**, который архивы убирают почти целиком. Второй мотив назван -пользователем прямо: «не нравится огромное кол-во файлов» в корне диска. - -**Чем подтверждать.** Время от запуска до первого кадра уровня (сейчас -меряется по MAME), число файлов на образе, и что каждая сцена по-прежнему -собирается при неполном диске (пути ошибок в `atlas_load`). - -
    - -### MEM. Следующий шаг разгрузки W1/W2 - -`pop_ctrl.c` уехал в банк 5 ([MEM-BANK5](TASKS_CLOSED.md#mem-bank5), куча -180 Б → 2298 Б; после снижения `--max-allocs` — 2751 Б). Следующий кандидат -по тому же критерию (**не размер, а частота вызова и отсутствие горячих -банк→банк переходов**) — **расщепление `pop_kid.c`**: холодная половина -(загрузка страниц спрайтов, `pop_kid_load`) в банк, движок кадров -(`load_frame`/`play_seq`, 2×/кадр) оставить в резиденте. - -Брать по факту нехватки места, не заранее. Таблица резидентного кода по -модулям и разбор, почему `pop_level.c` в банк НЕЛЬЗЯ, — в -[`TASKS_CLOSED.md`](TASKS_CLOSED.md#mem-bank5). - ---- - -## Отложено осознанно (не брать, пока не появится причина) - -- **KBD-1, остаток** — «иногда при зажатом Shift стрелка всё-таки - пропускается» (ощущение пользователя, не замер: счётчики на 35 нажатиях - подряд потерь не показывают). Решение пользователя 2026-08-01: отложено до - финальной полировки. Где именно осталась дыра и что делать, если вернёмся, - — в [`TASKS_CLOSED.md`](TASKS_CLOSED.md#kbd-1) (там же весь протокол - замеров и список того, что делать НЕЛЬЗЯ). -- **Quickload (Shift+F9) и остальные читы SDLPoP** — оценка сделана - ([DBG-CHEATS](TASKS_CLOSED.md#dbg-cheats)), код не написан. Самое ценное и - самое дорогое: сериализация `Char` + `room_modif` всех комнат + trob'ов + - стражей (`levels_plan.md` §4), зато даёт воспроизводимый регресс «вот кадр, - где баг» вместо ручной подгонки позы. -- **Звук** (CBL-эффекты, Фаза 5 `PORT_PLAN.md`) — геймплей не блокирует. -- **Таймер уровня / HUD времени / меню / сохранения** — Фаза 6. -- **[T-1](BUGS_OPEN.md#t-1)** (пики: перерисовка по причине) — отдаётся почти - бесплатно после [T-2](BUGS_OPEN.md#t-2), отдельно не окупается. -- **Отключение мыши на время игры** и **замена PRNG** — - `../docs/ideas_backlog.md` (оба дают доли процента кадра). -- **OPT-1** (хирургический редрой шва) — решено НЕ делать, стоимость - транзиентная; разбор в [`BUGS_CLOSED.md`](BUGS_CLOSED.md). - ---- - -## OPT-BLIT — цена отрисовки: чистка кодогена (СЛЕДУЮЩАЯ СЕССИЯ) - -> **2026-08-17: контрольный замер снят, задача разложена по фазам.** -> Работа теперь ведётся в трёх документах, которые живут между сессиями — -> туда же писать результаты каждой правки: -> -> - [`../docs/perf_l13_room23.md`](../docs/perf_l13_room23.md) — сцена -> (каскад 6 плит, ур. 13 комната 23), рецепт воспроизведения, зонды, канал -> `clog`, сводка по кадрам, разбор габаритов спрайтов; -> - [`../docs/perf_green_phase.md`](../docs/perf_green_phase.md) — ЗЕЛЁНАЯ -> фаза: пик **805 000** при бюджете 400 000; позиции G1..G6; -> - [`../docs/perf_cyan_phase.md`](../docs/perf_cyan_phase.md) — ЦИАН фаза: -> пик **632 000** при бюджете 400 000; позиции C1..C7. -> -> Порядок работ: **G1** (окно клипа для запечки, −250..400 тыс.) → **G2** -> (расколоть `draw_tile` + лист для ряда −1) → **C1** (убрать избыточный -> `pop_cd_touch` в `mob_render`, −81 тыс.) → **G3/C3** (`blit_b_clip` на -> байтовые габариты) → **C4** (разобрать `pop_char_fore(KID)`: 1 722 → 150 978). -> -> Синяя секция (**142 830**) в бюджет укладывается — не трогаем. -> Ответ на вопрос про `uint8_t`: горячий путь можно переводить целиком, -> максимум по всем игровым атласам **56×63**; шире 255 только восемь -> полноэкранных подложек титров/сюжета (320×200 и т. п.), и они рисуются раз -> на экран — им отдельный банк / прямой libbgi. - -Открыто 2026-08-13 по итогам разбора зелёного блока. Контекст и все замеры -— в memory `blit_cost_model` и `sdcc_z80_stack_locals_hot_loop`, протокол -разбора — в коммитах `f89b7dd` / `b27b313` / этом. - -**Что уже сделано и чем это подтверждено.** Цена блита разложена регрессией -по 339 замерам: `такты = 8791 + 198,2*h + 5,96*(w*h)` (такты MAME = системный -клок ~21,5 МГц, НЕ такты Z80 — растровый кадр 430 000). Байт на пределе -железа (через акселератор дважды по 3 такта), строка ~198, а вот 8 791 на -ВЫЗОВ оказались нашим кодогеном: `pop_blit_b` держал `w`/`h` как `uint16_t`, -из-за чего вся функция уезжала в 14-байтовый стековый кадр и `w = img[0] | -(img[1] << 8)` разворачивалось в два десятка IX-относительных пересылок. -После перехода на байтовый габарит: noclip 13 679 -> 11 530 (-16%), -клипованный 18 853 -> 15 340 (-19%), `_CODE` -42 Б. - -### а) Где ещё `uint16_t` можно сделать `uint8_t` - -Габариты спрайтов и всё, что из них считается. Признак: значение заведомо -<= 255, но объявлено 16-битным «на всякий случай», и живёт в горячем пути. -Начинать с: -- `blit_b_clip` (`pop_tile.c`) — `dw`/`dh`/`sx`/`sy` объявлены `int`, хотя - ядра принимают `uint8_t`; это ВТОРОЙ по частоте путь (33% блитов). -- `pop_cd_touch` / `cd_cols_of` — четыре `int`-аргумента на вызов. -- `_gfx_blit_sprite_noclip` и обёртки libbgi: `stride` уже `uint16_t`, а - `w`/`h` — `uint8_t`; проверить, не расширяются ли они обратно у вызывающих. -- Кандидаты в `pop_room.c`/`pop_bg.c`: локальные `int x, dby, dmy` в - `draw_tile` — часть из них помещается в байт, но осторожно: координаты - бывают отрицательными. - -**Как проверять:** после каждой правки смотреть пролог функции в -`.sprinter-cc-roomtest/*.asm` — исчез ли `ld iy,#-N / add iy,sp / ld sp,iy` -и сколько осталось `-N (ix)` в теле. - -### б) Проход по asm за неоптимальным IX-доступом - -Механическая проверка, даёт больше всего за единицу усилий: - -``` -grep -c "(ix)" .sprinter-cc-roomtest/*.asm # где сгущается -grep -n "ld iy, #-" .sprinter-cc-roomtest/*.asm # крупные стековые кадры -grep -n "pop.*\n.*pop.*\n.*push" ... # чтение спилла через стек -``` - -Признаки беды (все три встречались сегодня): пролог с `iy`-кадром больше -~6 байт; пары `pop bc / pop hl / push hl / push bc` в теле цикла (SDCC -читает спиленный указатель через стек вместо `ld l,-N(ix)`); повторный -пересчёт адреса `arr[i]` под каждое поле структуры. - -Приоритет по частоте вызова: `pop_blit_b` (сделан) -> `blit_b_clip` -> -`pop_cd_touch` -> `draw_tile` -> `pop_redraw_needed`. - -### Что НЕ делать (проверено сегодня, отрицательный результат) - -- **Не откладывать запекание на другой кадр.** Запекание пишет ОЗУ-копию - фона, из которой восстанавливает `heal`; отложенное даёт призрак плиты на - месте дыры. Идея «бюджет одного запекания на кадр» снята. -- **Не ускорять передачу пикселей** — она на пределе железа (3+3 такта на - байт), см. модель выше. -- **Не искать проблему в W3-скобке** (`_bgi_begin`/`_bgi_end` — по пять - инструкций) и не списывать разброс на прерывания (внутри размерной - группы разброс 3 такта, код прямолинейный). - -### Хвосты этой сессии - -- Пакетная пометка `pop_cd_touch` (`pop_cd_batch_begin/end`, скобка в - `draw_tile`) — сделана, но выигрыш замером НЕ подтверждён: в захваченных - кадрах скобка не срабатывала (блиты шли из холодной отрисовки комнаты). - Переснять на кадрах ЗАПЕКАНИЯ. **2026-08-17: цена НЕпакетного вызова - замерена — 4 502 такта, 28 % всей цены блита; в `mob_render` он к тому же - избыточен (см. C1).** -- Снять временную оснастку: `pop_dbg_m9..m16`, `pop_dbg_b1..b6`, - `pop_dbg_wh`, `pop_dbg_kind`, `pop_dbg_rdmax*`, `mame/v306/run_bridge_log.sh`. -- Цель по кадру не достигнута: зелёный пик был 792 012 при цели 400 000. - После сегодняшних правок не перемерян — начать сессию с контрольного - замера, а не с новых правок. - -**ГРАБЛИ (стоили сегодня часа):** проверять, что запущен РОВНО ОДИН MAME -(`pgrep -f mame.arm | wc -l`) — несколько экземпляров пишут в один -`error.log`, мост говорит с одним, замеры собираются с другого, и точки -«не срабатывают». И не обрезать `error.log`, пока MAME его держит: она -пишет по старому смещению, в начале остаётся дыра из нулей. diff --git a/applications/PoP/roomtest/_pop_bg.h b/applications/PoP/roomtest/_pop_bg.h deleted file mode 100644 index 5ff9578..0000000 --- a/applications/PoP/roomtest/_pop_bg.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * _pop_bg.h — ВНУТРЕННИЙ контракт между двумя половинами слоя фона. - * Публичный API слоя — pop_bg.h; общие листья (резидент) — pop_tile.h. - * - * Слой фона разрезан на два банка: - * pop_bg.c (банк 2) — ГОРЯЧАЯ половина: fore-проход поверх персонажей, - * оверлеи, клип. Работает каждый кадр. - * pop_room.c (банк 7) — ХОЛОДНАЯ: полная отрисовка комнаты (draw_tile), - * точечные перерисовки тайлов, падающие плиты, - * загрузка атласов. Раз на комнату/событие. - * - * Резать пришлось потому, что банк 2 упирался в 16 КБ страницы (90.4 % до - * разгрузки), а чомперам и остальным ловушкам уровня 3 место нужно. Граница - * проведена по частоте вызова: холодная половина платит трамплин (~654 такта) - * за каждый вызов сюда, и на входе в комнату таких вызовов ~40 — 26 000 - * тактов, шестая часть кадрового бюджета РАЗОВО. Для горячего пути цена - * нулевая: он зовёт свои функции прямо, а общие листья — из резидента. - * - * Что осталось в банке 2 и вынесено сюда обёртками: кладка стены - * (wall_pattern — её зовёт и fore-проход каждый кадр) и решётка ворот - * соседней комнаты (draw_gate_back — её зовёт шовная окклюзия). Обратных - * зависимостей (горячая половина → холодная) нет вовсе. - */ -#ifndef _POP_BG_H -#define _POP_BG_H - -#include - -/* Состояние дрожащих плит — живёт в pop_map, читают обе половины. */ -extern uint8_t pop_loose_modif[30]; -extern uint8_t pop_ceil_modif[10]; /* плита-потолок: loose ряда 2 комнаты сверху */ - -/* Видимая высота полосы кладки у потолка (room-space y 0..7): её печёт - * холодная половина, а поверх персонажа кладёт горячая. */ -#define CEIL_BAND_H 8 - -/* Тайл ОБЪЕКТА активного персонажа (set_objtile_at_char, seg006:1833) — в - * момент обработки этого тайла спрайт попадает в midtable. Задаёт горячая - * половина (pop_fore_over_char), читают other_overlay_tile (там же) и - * порядок «плита vs Kid» в mob_tick_one (холодная). Писучие данные банка - * лежат в _DATA/W2 и видны из любого банка — см. sdcc_banked_call_rules. */ -extern int8_t pop_bg_obj_col, pop_bg_obj_row; - -/* ---- Точки входа ГОРЯЧЕЙ половины для холодной (через трамплин) ------- */ -void pop_wall_pattern_b(int row, int col, int which_part) __banked; -void pop_wall_pattern_reset_b(void) __banked; -void pop_gate_back_b(uint8_t modl, int xh, int dby, int dmy) __banked; - -#endif - -/* ---- Слоты «первая запечка была на странице N» ----------------------- * - * bake_copy (pop_room.c) копирует готовый прямоугольник со второй страницы - * дабл-буфера вместо повторного пересчёта. Это верно ТОЛЬКО пока содержимое - * тайла между двумя кадрами не изменилось. У анимированных тайлов (кнопка с - * идущим таймером связи, ворота) пометка ОБНОВЛЯЕТСЯ каждый кадр, и картинка - * при этом другая — такой тайл обязан пересчитываться честно. - * - * Поэтому pop_set_redraw / pop_set_redraw_above гасят слот на ПЕРЕпометке - * (пометка пришла, когда счётчик ещё не отработал). Объявления БЕЗ __banked: - * pop_redraw.c и pop_room.c живут в одном банке, и трамплин тут не нужен. */ -void pop_bake_slot_reset(uint8_t tilepos); -void pop_bake_slot_reset_above(uint8_t col); - diff --git a/applications/PoP/roomtest/_pop_config.h b/applications/PoP/roomtest/_pop_config.h deleted file mode 100644 index cbd7e74..0000000 --- a/applications/PoP/roomtest/_pop_config.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * _pop_config.h — внутренний бинарный контракт POP.CFG. - * - * Владелец формата ровно один — pop_config.c (банк 9). Внешний игровой - * код видит только pop_settings.h и публичные pop_cfg_load/save. Формат - * допускает добавление полей в конец payload той же версии: декодер знает - * первые девять байтов, но контрольную сумму считает по ВСЕМУ payload. - */ -#ifndef _POP_CONFIG_H -#define _POP_CONFIG_H - -#include - -#define POP_CFG_VERSION 1 -#define POP_CFG_HEADER_SIZE 7 -/* Ранний MS0-файл имел семь полей. Его продолжаем принимать: отсутствующие - * поля берут исторический дефолт (лимит времени ON, отладочная полоса ON, - * музыка ON), а новая запись содержит все десять. */ -#define POP_CFG_LEGACY_PAYLOAD_SIZE 7 -#define POP_CFG_TIMELIMIT_PAYLOAD_SIZE 8 -#define POP_CFG_DEBUGBAR_PAYLOAD_SIZE 9 -#define POP_CFG_PAYLOAD_SIZE 10 -#define POP_CFG_TAIL_SIZE 2 -/* CFG остаётся маленьким. Верхняя граница не даёт ручному мусору занять - * стек W2, но оставляет запас для будущих полей версии 1. */ -#define POP_CFG_MAX_PAYLOAD 64 -#define POP_CFG_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + \ - POP_CFG_TAIL_SIZE) -#define POP_CFG_MIN_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE + \ - POP_CFG_TAIL_SIZE) -#define POP_CFG_MAX_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_MAX_PAYLOAD + \ - POP_CFG_TAIL_SIZE) - -/* Чистое ядро формата: доступно host-тесту без DSS/EMM. encode пишет - * текущий v1 размер, decode принимает прежние семи-/восьмибайтные и более - * длинный v1 payload, игнорируя неизвестный хвост. */ -void pop_cfg_encode(uint8_t *buf); -uint8_t pop_cfg_decode(const uint8_t *buf, uint16_t size); - -#endif diff --git a/applications/PoP/roomtest/_pop_draw.h b/applications/PoP/roomtest/_pop_draw.h deleted file mode 100644 index 1cbe465..0000000 --- a/applications/PoP/roomtest/_pop_draw.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * _pop_draw.h — внутренний заголовок слоя отрисовки: выбор ядра libbgi - * (клипающее / линейное «noclip») по одному и тому же тесту для блита и - * для heal. - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ ФАЙЛ, А НЕ pop_bg.h. Обе функции — `static inline`, а - * SDCC 4.5 оставляет тело такой функции в КАЖДОМ TU, который видит - * объявление, даже если тот её не зовёт (memory - * `sdcc_inline_codegen_findings`). pop_bg.h включают почти все модули PoP, - * то есть из общего заголовка эти ~100 Б размножились бы десятком мёртвых - * копий (замер CLIP-1, 2026-08-01: +1091 Б в _CODE и +636 Б в банке - * стража — за код, который там никто не вызывает). Здесь их видят ровно - * три файла, которые реально рисуют: pop_bg.c, pop_kid.c, pop_cdraw.c. - */ -#ifndef POP_DRAW_H -#define POP_DRAW_H - -#include -#include - -/* Спрайт целиком на экране И укладывается в 8-битные параметры noclip- - * примитивов libbgi? Условие входа в gfx_blit_cols_part_noclip: клипающий - * вариант платит ~5.6 К тактов подготовки на КАЖДЫЙ вызов, независимо от - * того, вылезает край или нет. */ -static inline uint8_t pop_onscreen_cols(int x, int y, uint16_t w, uint16_t h) -{ - return (uint8_t)(x >= 0 && y >= 0 && w < 256 && h < 256 && - x + (int)w <= 320 && y + (int)h <= 256); -} - -/* Стереть прямоугольник (heal из ОЗУ-копии) тем же приёмом, что и блит: - * целиком на экране → линейное ядро без клипа. Условие входа у - * gfx_heal_noclip ровно то же, что у gfx_blit_cols_part_noclip, поэтому - * тест один — общее ядро gfx_heal платит за клип и 16-бит, а не за пиксели - * (замер: 11 658 тактов на heal 22×22). - * - * НЕ inline (тело — pop_draw.c, резидент W1): SDCC 4.5 встраивал бы его в - * каждое место вызова по 181 Б И оставлял мёртвую копию в каждом TU — см. - * шапку pop_draw.c с замером. Зовётся 5 раз за кадр, цена вызова тонет в - * стоимости самого heal. - * - * w/h тут int, а не uint16_t: вызывающие считают их вычитанием (h − skip), и - * отрицательный результат обязан быть no-op, а не превратиться в огромный - * unsigned. */ -void pop_heal_fast(int x, int y, int w, int h); - -#endif diff --git a/applications/PoP/roomtest/_pop_kdraw.h b/applications/PoP/roomtest/_pop_kdraw.h deleted file mode 100644 index f3988d2..0000000 --- a/applications/PoP/roomtest/_pop_kdraw.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * _pop_kdraw.h — ВНУТРЕННИЙ контракт слоя персонажей: pop_cdraw.c (банк 4) - * ↔ pop_kdraw.c (тот же банк 4). - * - * ВАЖНО: объявления здесь НЕ помечены __banked, то есть вызовы идут прямым - * `call` — это корректно РОВНО ПОКА оба модуля лежат в ОДНОЙ странице: - * - * --bank 4=pop_cdraw.c --bank 4=pop_kdraw.c - * - * Линкер этого НЕ проверяет: если один из них переедет в другой банк, - * сборка пройдёт молча, а на устройстве получится прыжок в чужую страницу. - * Меняешь раскладку банков в Makefile — проверь эту пару. - * - * Публичные (из резидента/других банков) входы того же модуля объявлены с - * __banked в pop_kid.h — там pop_sword_load. - */ -#ifndef _POP_KDRAW_H -#define _POP_KDRAW_H - -#include -#include "pop_char.h" -#include "pop_kid.h" - -/* Клинок в руке персонажа (add_sword_to_objtable). Возврат 1 — нарисован, - * и в (*rx,*ry,*rw,*rh) лежит его прямоугольник для heal. Страницу W0 - * оставляет замапленной: размаппит вызывающий. */ -uint8_t pop_sword_draw(const pop_char_t *ch, const kframe *fr, - int obj_x, int obj_y, - int *rx, int *ry, uint16_t *rw, uint16_t *rh); - -/* Спрайт из атласов Кида по его id (полоса HP: деления 216/217). */ -void pop_kid_img_blit(uint8_t image, int x, int y); - -#endif /* _POP_KDRAW_H */ diff --git a/applications/PoP/roomtest/_pop_kid.h b/applications/PoP/roomtest/_pop_kid.h deleted file mode 100644 index ceb017e..0000000 --- a/applications/PoP/roomtest/_pop_kid.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * _pop_kid.h — ВНУТРЕННИЙ контракт движка Kid: pop_kid.c (резидент W1, - * интерпретатор seqtbl) ↔ pop_kboot.c (банк 8, загрузка ресурсов). - * - * Загрузка атласов Кида и страницы анимации отрабатывает РАЗ ЗА ИГРУ, и - * держать её в дефицитном W1 незачем; интерпретатор же зовут из четырёх - * банков каждый тик — он остался в резиденте. Общее между ними — только - * дескриптор страницы данных: он объявлен здесь и определён в pop_kid.c - * (данные банковых модулей всё равно линкуются в общий _DATA). - */ -#ifndef _POP_KID_H -#define _POP_KID_H - -#include - -/* Смещение данных в странице анимации; ниже 0x100 — ISR-стаб W0. */ -#define KD_DATA_OFF 0x100u - -extern uint8_t kdat_blk; /* EMM-блок страницы kid.ani */ -extern uint8_t kdat_page; /* её номер (маппится в W0 на время play_seq) */ -extern uint8_t kdat_ok; /* данные загружены */ - -/* Файловый обмен с W3 делает общий резидентный bank_load_file(), поэтому - * оркестратор загрузки kid.ani целиком живёт в холодном банке 8. */ - -#endif /* _POP_KID_H */ diff --git a/applications/PoP/roomtest/_pop_level.h b/applications/PoP/roomtest/_pop_level.h deleted file mode 100644 index 8bfabae..0000000 --- a/applications/PoP/roomtest/_pop_level.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * _pop_level.h — ВНУТРЕННИЙ контракт между двумя половинами уровня: - * - * pop_level.c — ГОРЯЧАЯ (резидент W1): чтение тайлов/связей/дверных - * таблиц, живое состояние стражей. Её зовут все банки - * и кадровый путь главного цикла, местами на каждый тайл. - * pop_level_cold.c — ХОЛОДНАЯ (банк 8): чтение файла уровня, разбор комнаты, - * рестарт, потабличные различия уровней. Всё это - * отрабатывает раз на уровень или раз на комнату, и - * держать ~1.9 КБ в дефицитном W1 незачем. - * - * Общее состояние (страница уровня, копии дверных таблиц, живые стражи) - * живёт в ГОРЯЧЕЙ половине и объявлено здесь: данные банковых модулей - * линкуются в общий _DATA (--bank-data мы не включаем), поэтому обе - * половины видят их как обычные глобалы — в банк уехал только КОД. - * - * Заголовок НЕ публичный: снаружи уровень виден только через pop_level.h. - */ -#ifndef _POP_LEVEL_H -#define _POP_LEVEL_H - -#include - -/* Раскладка страницы уровня (Table 6 POP-DAT); подробности — в pop_level.c. */ -#define LVL_DATA_OFF 0x100u /* данные с 0x100; 0x00..0xFF — ISR-стаб */ -#define LVL_PRISTINE_OFF 0x1000u /* эталон foretable для рестарта уровня */ - -#define BP_FG 0u -#define BP_BG 720u -#define BP_LINKLOC 1440u -#define BP_LINKMAP 1696u -#define BP_LINKS 1952u -#define BP_GTILE 2119u -#define BP_GDIR 2143u -#define BP_GX 2167u -#define BP_GSEQLO 2191u -#define BP_GSKILL 2215u -#define BP_GSEQHI 2239u -#define BP_GCOLOR 2263u -#define BP_START 2112u -#define ROOM_TILES 30u -#define MIN_SIZE (BP_START + 3u) - -/* Живое состояние стражей: 6 байт на комнату (порт level.guards_*). */ -#define GS_TILE 0 -#define GS_DIR 1 -#define GS_X 2 -#define GS_SKILL 3 -#define GS_SEQL 4 -#define GS_SEQH 5 - -/* ---- общее состояние (определено в pop_level.c) ---------------------- */ -extern uint8_t pop_lvl_blk; /* EMM-блок страницы уровня */ -extern uint8_t pop_lvl_page; /* её номер (маппится в W0/W3) */ -extern uint8_t pop_lvl_ok; /* уровень загружен */ -extern uint8_t pop_dl1[256]; /* LINKLOC как в файле */ -extern uint8_t pop_dl2[256]; /* LINKMAP, МУТАБЕЛЬНА (таймеры кнопок) */ -extern uint8_t pop_gstate[24 * 6]; - -/* Указатели на тайлы комнаты r (1..24) в W0-пространстве — страницу мапит - * вызывающий. static-инлайн в обеих половинах: две команды сложения, звать - * их через границу банка было бы дороже самого вычисления. */ -static const uint8_t *room_fg_ptr(uint8_t r) -{ - return (const uint8_t *)(LVL_DATA_OFF + BP_FG) + (uint16_t)(r - 1) * ROOM_TILES; -} -static const uint8_t *room_bg_ptr(uint8_t r) -{ - return (const uint8_t *)(LVL_DATA_OFF + BP_BG) + (uint16_t)(r - 1) * ROOM_TILES; -} - -/* ПРАВИЛО ОКНА W3. Банковый модуль исполняется ИЗ W3 и сам менять окно - * не может. Файлы в EMM читает резидентный bank_load_file(), после его - * возврата холодный код продолжает подготовку страницы через W0. */ - -/* Живая копия стражей из данных уровня (загрузка/рестарт) — в холодной. */ -void pop_gstate_init(void) __banked; - -#endif /* _POP_LEVEL_H */ diff --git a/applications/PoP/roomtest/_pop_sfx.h b/applications/PoP/roomtest/_pop_sfx.h deleted file mode 100644 index b765214..0000000 --- a/applications/PoP/roomtest/_pop_sfx.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * _pop_sfx.h — внутренний контракт между половинами звука (НЕ публичный, - * публичный — pop_sfx.h). Горячая половина живёт в резиденте - * (pop_sfx.c), холодная в банке (pop_sfx_cold.c); делят они таблицу - * звуков, массив физических страниц и насос. - */ -#ifndef _POP_SFX_INTERNAL_H -#define _POP_SFX_INTERNAL_H - -#include -#include "pop_sound_tbl.h" /* pop_snd_tbl, POP_SND_* — генерит упаковщик */ - -/* Физические страницы набора, по индексу из pop_snd_tbl[].page. */ -extern uint8_t pop_snd_page[POP_SND_PAGES]; -/* 1 — набор поднят и CBL открыт; 0 — играем молча. */ -extern uint8_t pop_snd_ok; - -/* Насос: отдать n байт в CBL. Резидентный — его адрес отдаётся в - * cbl_open() холодной половиной. */ -int pop_sfx_fill(uint16_t n); - -#endif diff --git a/applications/PoP/roomtest/_pop_tile.h b/applications/PoP/roomtest/_pop_tile.h deleted file mode 100644 index 2069088..0000000 --- a/applications/PoP/roomtest/_pop_tile.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * _pop_tile.h — внутренний контракт между половинами общих листьев слоя - * фона (НЕ публичный, публичный — pop_tile.h). Горячая половина живёт в - * резиденте (pop_tile.c), холодная — в банке 5 (pop_tile_cold.c); - * критерий разреза и замеры — в шапке pop_tile_cold.c. - */ -#ifndef _POP_TILE_INTERNAL_H -#define _POP_TILE_INTERNAL_H - -#include - -/* Клипованный путь блита — статик горячей половины, ставший общим: его - * зовёт pop_mem_b из холодной. Переносить его следом НЕЛЬЗЯ (его основной - * вызывающий pop_blit_b делает 184 вызова на кадр редрава), а вызов - * банк -> резидент и так прямой: W1/W2 замаплены всегда. */ -void blit_b_clip(const uint8_t *img, int x, int top, uint8_t w, uint8_t h); - -#endif diff --git a/applications/PoP/roomtest/bg_arc.h b/applications/PoP/roomtest/bg_arc.h deleted file mode 100644 index 581908e..0000000 --- a/applications/PoP/roomtest/bg_arc.h +++ /dev/null @@ -1,34 +0,0 @@ -/* bg_arc.h — индексы в архиве BG. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef BG_ARC_H -#define BG_ARC_H - -#define ARC_BG_COUNT 25 - -#define ARC_BG_POP_ENV0 0 -#define ARC_BG_POP_ENV1 1 -#define ARC_BG_POP_ENV2 2 -#define ARC_BG_POP_ENV3 3 -#define ARC_BG_POP_ENV4 4 -#define ARC_BG_POP_ENV5 5 -#define ARC_BG_POP_ENV6 6 -#define ARC_BG_POP_ENV7 7 -#define ARC_BG_POP_ENV8 8 -#define ARC_BG_POP_ENV9 9 -#define ARC_BG_POP_WALL 10 -#define ARC_BG_POP_FORE 11 -#define ARC_BG_PAL_ENV0 12 -#define ARC_BG_PAL_ENV1 13 -#define ARC_BG_PAL_ENV2 14 -#define ARC_BG_PAL_ENV3 15 -#define ARC_BG_PAL_ENV4 16 -#define ARC_BG_PAL_ENV5 17 -#define ARC_BG_PAL_ENV6 18 -#define ARC_BG_PAL_ENV7 19 -#define ARC_BG_PAL_ENV8 20 -#define ARC_BG_PAL_ENV9 21 -#define ARC_BG_PAL_WALL 22 -#define ARC_BG_PAL_FORE 23 -#define ARC_BG_POP_POT 24 - -#endif diff --git a/applications/PoP/roomtest/guard_arc.h b/applications/PoP/roomtest/guard_arc.h deleted file mode 100644 index f930261..0000000 --- a/applications/PoP/roomtest/guard_arc.h +++ /dev/null @@ -1,19 +0,0 @@ -/* guard_arc.h — индексы в архиве GUARD. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef GUARD_ARC_H -#define GUARD_ARC_H - -#define ARC_GUARD_COUNT 10 - -#define ARC_GUARD_G0 0 -#define ARC_GUARD_G1 1 -#define ARC_GUARD_G2 2 -#define ARC_GUARD_G3 3 -#define ARC_GUARD_G4 4 -#define ARC_GUARD_G0_V 5 -#define ARC_GUARD_G1_V 6 -#define ARC_GUARD_G2_V 7 -#define ARC_GUARD_G3_V 8 -#define ARC_GUARD_G4_V 9 - -#endif diff --git a/applications/PoP/roomtest/guards.c b/applications/PoP/roomtest/guards.c deleted file mode 100644 index 8126101..0000000 --- a/applications/PoP/roomtest/guards.c +++ /dev/null @@ -1,1164 +0,0 @@ -/* - * guards.c — ЛОГИКА стража, собирается в БАНК (--bank 1=guards.c, окно W3). - * - * Правила банка (проверено пробником tests/w3bankgfx): - * - состояние держим в W1/W2 (pop_guard.c): статики банка линкуются в - * страницу банка и снаружи не читаются; - * - звать можно W1/W2-код (pop_map, pop_kid, pop_geom, libc, примитивы - * libbgi) — скобка _bgi_begin/_bgi_end возвращает страницу БАНКА; - * - звать НЕЛЬЗЯ резидент W3 (pop_bg) — ни напрямую, ни транзитивно: - * пока исполняется банк, резидентной страницы в адресном пространстве - * нет. Поэтому фон/окклюзию за стража рисует главный цикл. - * - * Порт: seg003 check_can_guard_see_kid, seg002 autocontrol_*, seg000 - * play_guard_frame, seg006 char_opp_dist. ДИСПЕТЧЕР у соперника не свой: - * ИИ выставляет те же глобалы control_* (pop_ctrl.h), что и ввод игрока, а - * дальше работает общий pop_control(). - */ -#include "pop_guard.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_kid.h" -#include "pop_ctrl.h" -#include "pop_map.h" -#include "pop_geom.h" -#include "pop_trob.h" -#include "pop_level.h" /* pop_current_level — спецсобытие уровня 3 */ -#include "pop_state.h" /* pop_immortal, pop_droppedout */ -#include "pop_tile.h" /* POP_TILE_DIV — таблица колонок (tile_div_tbl) */ -#include "pop_tune.h" /* POP_DBG_SHADOW_NOWAIT — отладка сцены тени */ - -#define TILE_MIDX 7 /* середина тайла в координатах персонажа */ -#define SCREENSPACE_X 58 /* = pop_x_bump[FIRST_ONSCREEN_COLUMN] */ - -#define TILE_FLOOR 1 -#define TILE_SPIKE 2 -#define TILE_GATE 4 -#define TILE_DOORTOP_FLOOR 7 -#define TILE_LOOSE 11 -#define TILE_DOORTOP 12 -#define TILE_CHOMPER 18 -#define TILE_WALL 20 - -/* actions (types.h:334) — нужны ветке «идти ли за упавшим Кидом». */ -#define ACT_HANGCLIMB 2 -#define ACT_HANGSTRAIGHT 6 - -/* tile_is_floor (seg004): не-пол — пустота, ковёр, верх двери, стена и - * «половинки» 26..29. Дубликат крошечного switch'а из pop_map: тянуть его - * через границу банка дороже, чем повторить. */ -/* Темы, которые звучат ОДИН раз за заход на уровень: тень шестого уровня - * (seg002:0090) и вступление первого. Оригинал отмечает «уже играли» - * через leveldoor_open = 0x4D, то есть портит переменную двери; у нас на - * это есть свои байты, а сбрасывает их старт уровня. */ -static uint8_t shadow6_music; - -void pop_music_level_start(void) __banked -{ - shadow6_music = 0; - pop_ctrl_level_start(); -} - -static uint8_t tile_is_floor(uint8_t t) -{ - switch (t) { - case 0: case 9: case 12: case 20: - case 26: case 27: case 28: case 29: - return 0; - default: - return 1; - } -} - -/* get_tile_at_kid (seg003:761) СНЯТ вместе с переходом луча на колонки: - * единственным его вызывающим был этот луч, а он больше не работает с - * X-координатами (разбор — в теле pop_check_can_guard_see_kid ниже). - * Таблица POP_TILE_DIV осталась в резиденте, ею пользуется физика. */ - -/* Буфер тайлов луча — file-scope, а не локальный массив: локальный уезжает - * в стековый кадр, и каждое чтение из него стоит `-n(ix)` (19 тактов - * номинала, ~46 с wait-state'ами). Тот же приём, что у draw_tile и - * pop_blit_b. Размер — колонки −1..10 плюс запас. */ -static uint8_t row_t[12]; - -/* check_can_guard_see_kid (seg003:688) — луч видимости по ряду. - * Результат в can_guard_see_kid: 0 не видит / 1 видит, но не пойдёт / - * 2 видит и пойдёт. */ -void pop_check_can_guard_see_kid(void) __banked -{ - uint8_t kid_frame = Kid.frame; - uint8_t tile; - - /* МЫШЬ Кида «не видит» (seg003:0965): иначе он выхватит меч на зверька, - * пробегающего мимо. */ - if (Guard.charid == CHARID_24_MOUSE) { can_guard_see_kid = 0; return; } - - /* Первый множитель — порт seg003:702. ТЕНЬ боевая только на 12-м - * уровне; на 4/5/6 она Кида «не видит», и это не косметика: увидев её, - * Кид достаёт меч (control_standing, seg005:352), а сама тень идёт той - * же веткой control_standing — встаёт в боевую стойку и с кадра 150 - * рисуется спрайтами СТРАЖА. Пустой слот (charid 0) — наша добавка: - * оригинал гасит его через direction = dir_56_none. */ - if (!(Guard.charid != 0 && - (Guard.charid != CHARID_1_SHADOW || - pop_current_level == SHADOW_FIGHT_LEVEL) && - /* кадры 219..228 — подъём по лестнице: там страж Кида не видит */ - kid_frame != 0 && (kid_frame < 219 || kid_frame >= 229) && - Guard.direction != DIR_56_NONE && - Kid.alive < 0 && Guard.alive < 0 && - Kid.room == Guard.room && Kid.curr_row == Guard.curr_row)) { - can_guard_see_kid = 0; - return; - } - - can_guard_see_kid = 2; - /* ПО КОЛОНКАМ, а не по X-координатам. - * - * Оригинал (и SDLPoP, seg003:688) идёт по x с шагом TILE_SIZEX и на - * каждом шаге переводит x в колонку — потому что x у него уже под рукой. - * Но начальные x — это РОВНО центры тайлов персонажей - * (x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX), а перевод обратно - * даёт ту же колонку: floor((58 + col*14 - 58) / 14) == col. Значит - * весь проход эквивалентен обходу колонок, и ни одна x-координата тут не - * нужна: уходят 16-битный шаг, 16-битное сравнение и индексация таблицы - * POP_TILE_DIV на каждой итерации. - * - * Тайлы отрезка забираем ОДНИМ банковым вызовом. Раньше на каждую - * колонку шёл свой pop_tile_at (__banked, банк 1 -> банк 3): на сцене - * 11/15 это девять трамплинов и 36 786 тактов на весь луч (замер - * 2026-08-19). */ - { - int8_t lcol = Kid.curr_col, rcol = Guard.curr_col, col, lcol0; - - if (lcol > rcol) { int8_t t = lcol; lcol = rcol; rcol = t; } - lcol0 = lcol; /* БАЗА индексации буфера — фиксируем - * ДО сдвигов ниже: row_t[0] это - * тайл lcol0, и сдвиг lcol/rcol на - * чомпере и воротах её менять не - * должен. */ - pop_row_tiles(Kid.curr_row, lcol, rcol, row_t); - - /* Чомпер стоит у ЛЕВОГО края тайла — свой тайл он не перекрывает. */ - if (row_t[0] == TILE_CHOMPER) lcol++; - /* Ворота — у ПРАВОГО края, поэтому крайний правый тайл не считается. */ - if (row_t[rcol - lcol0] == TILE_GATE) rcol--; - - for (col = lcol; col <= rcol; col++) { - tile = row_t[col - lcol0]; - /* Сквозь это не видно вовсе. */ - if (tile == TILE_WALL || tile == TILE_DOORTOP_FLOOR || tile == TILE_DOORTOP) { - can_guard_see_kid = 0; - return; - } - /* Видно, но страж не пойдёт: провалится / попадёт под чомпер / - * упрётся в неоткрытые ворота / шагнёт в дыру. */ - if (tile == TILE_LOOSE || tile == TILE_CHOMPER || !tile_is_floor(tile)) { - can_guard_see_kid = 1; - } else if (tile == TILE_GATE && - pop_gate_modif(col, Kid.curr_row) < 112) { - can_guard_see_kid = 1; /* ворота подняты не до конца */ - } - } - } -} - - -/* ---- Скелет: спецсобытие подъёма (check_skel, seg002:1042) ---------- * - * На уровне 3 стражей в данных НЕТ ВООБЩЕ (guards_tile пуст во всех 24 - * комнатах) — единственный противник поднимается сам: когда Кид в комнате 1 - * доходит до колонки 2 или 3 при открытой двери уровня, тайл 21 (скелет) - * стирается в пол, а на его месте встаёт персонаж слота Guard с уже вынутым - * мечом. Отсюда и место здесь, рядом с ИИ, а не в enter_guard. */ -#define SKEL_LEVEL 3 -#define SKEL_ROOM 1 -#define SKEL_COL 5 -#define SKEL_ROW 1 -#define SKEL_TRIG_COL1 2 -#define SKEL_TRIG_COL2 3 -#define SKEL_SKILL 2 -#define SKEL_HP 3 -#define TILE_SKELETON 21 - -void pop_check_skel(void) __banked -{ - if (pop_current_level != SKEL_LEVEL) return; - if (Guard.charid != 0) return; /* слот занят (dir_56_none) */ - if (Kid.room != SKEL_ROOM) return; - if (!pop_leveldoor_open) return; - if (Kid.curr_col != SKEL_TRIG_COL1 && Kid.curr_col != SKEL_TRIG_COL2) return; - if (pop_tile_at(SKEL_COL, SKEL_ROW) != TILE_SKELETON) return; - - pop_skel_wake_tile((uint8_t)(SKEL_ROW * 10 + SKEL_COL)); - - /* Поднимаем В ОКНЕ Char — как оригинал (он же и saveshad'ит). */ - pop_loadshad(); - Char.room = Kid.room; - Char.curr_row = SKEL_ROW; - Char.y = (uint8_t)pop_y_land[SKEL_ROW + 1]; - Char.curr_col = SKEL_COL; - Char.x = (uint8_t)(pop_x_bump[SKEL_COL + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Char.direction = -1; /* dir_FF_left */ - Char.alive = -1; - Char.sword = SWORD_2_DRAWN; - Char.charid = CHARID_4_SKELETON; - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(SEQ_88_SKEL_WAKE_UP); - pop_sfx_play(44); /* seg002:106D — скелет оживает */ - play_seq(); - pop_saveshad(); - - guard_skill = SKEL_SKILL; - guardhp_max = guardhp_curr = SKEL_HP; - guardhp_delta = 0; - is_guard_notice = guard_refrac = 0; -} - -/* ---- Мышь: спецсобытие уровня 8 (do_timers seg003:0545 + do_mouse) --- * - * - * Кнопка (0,7) комнаты 16 открывает решётку (0,3), но с левой площадки - * верхнего ряда до кнопки не дойти — между ними провал в три колонки. - * Поэтому, когда дверь уровня уже открыта, а Кид всё ещё в комнате 16, - * оригинал через POP_MOUSE_DELAY кадров присылает мышь: она пробегает - * справа налево, наступает на кнопку (кнопку жмёт ОБЩИЙ check_press из - * физики соперника, как и любой персонаж) и убегает обратно. - * - * Счётчик — сам pop_leveldoor_open, как в оригинале: он растёт ТОЛЬКО пока - * Кид в комнате 16, поэтому «12,5 секунды» отсчитываются с момента, когда - * игрок туда вернулся, а не с открытия двери. Ради этого он и word - * (см. pop_state.c). - * - * Слот соперника занимаем БЕЗ проверки «свободен ли» — так в оригинале, и - * на уровне 8 конфликта нет: в данных комнаты 16 стража нет - * (guards_tile[15] = 30 = «пусто»). */ -#define SEQ_105_MOUSE_FORWARD 105 -#define SEQ_107_MOUSE_STAND_UP_GO 107 - -void pop_check_mouse(void) __banked -{ - if (pop_current_level != POP_MOUSE_LEVEL) return; - if (Kid.room != POP_MOUSE_ROOM) return; - if (!pop_leveldoor_open) return; - if (++pop_leveldoor_open != POP_MOUSE_DELAY) return; - - /* do_mouse (seg003:0ABA) поднимает мышь В ОКНЕ Char, начиная с КИДА - * (loadkid): поля, которых нет в списке ниже — frame/action/room/ - * fall_x/fall_y — наследуются от него. Комната как раз оттуда и - * берётся, отдельного присваивания в оригинале нет. */ - pop_loadkid(); - Char.charid = CHARID_24_MOUSE; - Char.x = POP_MOUSE_START_X; - Char.curr_row = 0; - Char.y = (uint8_t)pop_y_land[1]; - Char.alive = -1; - Char.direction = -1; /* dir_FF_left */ - guardhp_curr = 1; - pop_char_set_seq(SEQ_105_MOUSE_FORWARD); - play_seq(); - pop_saveshad(); -} - -/* ---- Тень: спецсобытие входа в комнату (check_shadow, seg002:0064) -- * - * - * На «шадоу»-уровнях слот соперника занимает ТЕНЬ, и занимает его ВМЕСТО - * стража: оригинал вызывает check_shadow при смене комнаты и уходит в - * return, не доходя до enter_guard. Важно, что на уровне 5 в комнате 24 - * страж в данных ЕСТЬ (`guards_tile[23] = 8`) — если позвать enter_guard, - * он поднимется там, где его быть не должно. Поэтому вызывающий обязан - * звать pop_check_shadow ВМЕСТО pop_guard_enter и уважать её ответ. - * - * do_init_shad (seg002:0000): первые 7 полей персонажа берутся из таблицы - * init_shad_N, остальные наследуются от того, что уже лежит в окне Char. У - * оригинала там КИД (check_shadow идёт сразу после loadkid(), seg000:1312), - * поэтому наследование сделано явным — alive/sword берём у Кида, а не у - * прошлого обитателя слота. Поднимаем в окне Char и saveshad'им, как - * pop_check_skel и как сам do_init_shad. */ -/* Состояние проигрывателя автодвижений (seg002: demo_time/demo_index) — - * объявлено здесь, потому что do_init_shad его сбрасывает, а движок - * do_auto_moves живёт ниже, рядом с остальным ИИ. */ -static uint8_t demo_time; /* кадров с начала записи (0xFE = стоп) */ -static uint8_t demo_index; /* текущая запись */ - -void pop_guard_ai_qsave(pop_qs_io_t *io) __banked -{ - pop_qs_u8(io, &demo_time); - pop_qs_u8(io, &demo_index); -} - -#define SHADOW_SKILL 3 -#define SHADOW_HP 4 -#define SEQ_2_STAND 2 -#define SEQ_7_FALL 7 -#define TILE_POTION 10 -#define TILE_SWORD 22 - -/* Таблицы init_shad_N (data:0EEA/0EF2) — ПЕРВЫЕ СЕМЬ полей Char в том же - * порядке, в каком их копирует оригинал (`memcpy(&Char, source, 7)`): - * frame, x, y, direction, curr_col, curr_row, action. - * 5: x 55, y 55, вправо, колонка −1 (ещё за левым краем экрана), ряд 0; - * 6: x 81, y 118, вправо, колонка 0, ряд 1 — тень стоит на границе - * (1,0)-(1,1), одного осторожного шага хватает, чтобы встать на плиту; - * 12: x 81, y 232, вправо, колонка 0, ряд 0 — и это НЕ ошибка данных: 232 - * лежит НИЖЕ поля (192), поле y беззнаковое, и тень с seq_7 «падает» - * из-под комнаты, переполняя байт, то есть влетает в кадр сверху. - * Ряд при этом берётся ИЗ ТАБЛИЦЫ (0), а не пересчитывается из y - * (иначе был бы −1): семь полей копируются как есть, и «поправить» - * их согласованность нельзя (см. ../docs/levels_12_15_plan.md §7.5). */ -static const uint8_t init_shad_5[7] = { 0x0F, 0x37, 0x37, 0, 0xFF, 0, 0 }; -static const uint8_t init_shad_6[7] = { 0x0F, 0x51, 0x76, 0, 0x00, 1, 0 }; -static const uint8_t init_shad_12[7] = { 0x0F, 0x51, 0xE8, 0, 0x00, 0, 0 }; - -/* seq — поза, с которой тень входит в сцену: 5/6 встают в стойку, 12 падает. */ -static void do_init_shad(const uint8_t *tbl, uint8_t room, uint8_t seq) -{ - pop_loadshad(); - Char.frame = tbl[0]; - Char.x = tbl[1]; - Char.y = tbl[2]; - Char.direction = (int8_t)tbl[3]; - Char.curr_col = (int8_t)tbl[4]; - Char.curr_row = (int8_t)tbl[5]; - Char.action = tbl[6]; - Char.room = room; - Char.charid = CHARID_1_SHADOW; - Char.alive = Kid.alive; /* наследование от Кида, см. шапку */ - Char.sword = Kid.sword; - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(seq); - pop_saveshad(); - - demo_time = 0; - demo_index = 0; - guard_skill = SHADOW_SKILL; - guardhp_delta = 0; - guardhp_curr = guardhp_max = SHADOW_HP; - is_guard_notice = guard_refrac = 0; -} - -uint8_t pop_check_shadow(uint8_t room) __banked -{ - /* Уровень 12 (seg002:0070) — встреча с тенью в комнате 15. Три отличия - * от 5/6, и все три существенные: - * — событие одноразовое: после слияния (pop_united_shadow != 0) тень - * больше не поднимается ни при каком входе в комнату; - * — условие на тайл ОБРАТНОЕ уровню 5: там тень поднимается, ПОКА - * зелье на месте, здесь — только когда меча (15,1,0) уже НЕТ, то - * есть Кид его подобрал. Меч на месте — return 0, и это не «ничего - * не делать»: стража в комнате 15 в данных нет, так что вызывающий - * спокойно идёт в pop_guard_enter и убирает слот; - * — поза входа не стойка, а ПАДЕНИЕ (seq 7). - * pop_shadow_init сбрасываем здесь же: тень начинает «ждать Кида» - * заново при каждом подъёме (см. autocontrol_shadow_level12). */ - if (pop_current_level == SHADOW_FIGHT_LEVEL) { - if (pop_united_shadow || room != SHADOW_FIGHT_ROOM) return 0; - if (pop_level_tile(room, SHADOW_SWORD_TILEPOS) == TILE_SWORD) return 0; - pop_shadow_init = 0; - do_init_shad(init_shad_12, room, SEQ_7_FALL); - return 1; - } - /* Уровень 6 (seg002:0090): условий на содержимое комнаты нет вовсе — - * тень встаёт при КАЖДОМ входе в комнату 1. Оригинал играет здесь - * sound_25_presentation, помечая «уже играли» через leveldoor_open = - * 0x4D (переменную двери он использует как флаг). Чужую переменную не - * трогаем: у нас для этого свой однобайтовый флаг. */ - if (pop_current_level == SHADOW_STEP_LEVEL) { - if (room != SHADOW_STEP_ROOM) return 0; - if (!shadow6_music) { - shadow6_music = 1; - pop_sfx_play(25); - } - do_init_shad(init_shad_6, room, SEQ_2_STAND); - return 1; - } - if (pop_current_level != SHADOW_STEAL_LEVEL) return 0; - if (room != SHADOW_STEAL_ROOM) return 0; - /* Зелья уже нет — тень своё дело сделала. Возвращаем 1 и здесь: стража - * комнаты 24 оригинал не поднимает НИКОГДА (return до enter_guard). */ - if (pop_level_tile(room, SHADOW_POTION_TILEPOS) != TILE_POTION) return 1; - do_init_shad(init_shad_5, room, SEQ_2_STAND); - return 1; -} - -/* sword_disappears (seg002:0536) — спецсобытие уровня 12: меч, лежащий в - * комнате 15, пропадает с карты, как только Кид ушёл ВПРАВО из комнаты 18. - * Смысл событийный: дальше по уровню возврата за мечом уже нет, и сцена с - * тенью обязана быть однозначной — либо Кид пришёл к ней вооружённым, либо - * нет. Модификатор гасим вместе с тайлом (как SDLPoP): ненулевой modif на - * полу рисует «фальшивые» узоры. - * - * Звать при уходе ВПРАВО, ДО смены комнаты, — там же, где level3_set_chkp - * (оригинал держит оба в leave_room). */ -void pop_sword_disappears(void) __banked -{ - uint8_t *m; - if (pop_current_level != SHADOW_FIGHT_LEVEL) return; - if (Kid.room != SWORD_GONE_ROOM) return; - pop_level_set_tile(SHADOW_FIGHT_ROOM, SHADOW_SWORD_TILEPOS, TILE_FLOOR); - m = pop_trob_modif(SHADOW_FIGHT_ROOM); - if (m) m[SHADOW_SWORD_TILEPOS] = 0; -} - -/* meet_Jaffar (seg002:0544) — спецсобытие уровня 13: Кид уходит ВПРАВО из - * комнаты 3 и попадает прямо к Джафару. Всё событие — фора: пока - * pop_guard_notice_timer идёт, Джафар не встаёт в боевую стойку - * (autocontrol_guard_inactive), то есть у Кида есть ~2 секунды достать меч. - * - * `pop_leveldoor_open == 0` в условии не косметика: вернувшись к Джафару - * после его смерти (дверь уже открыта), форы быть не должно. - * - * Звать при уходе ВПРАВО, ДО смены комнаты, — рядом с pop_sword_disappears - * (оригинал держит оба в одной ветке leave_room). */ -void pop_meet_jaffar(void) __banked -{ - if (pop_current_level != JAFFAR_LEVEL) return; - if (pop_leveldoor_open != 0) return; - if (Kid.room != JAFFAR_MEET_ROOM) return; - pop_sfx_play(29); /* тема встречи с Джафаром */ - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; -} - -/* Jaffar_exit (seg002:0517) — парная половина победы: смерть Джафара сама - * дверь НЕ открывает, она лишь ставит pop_leveldoor_open = 2. Дверь - * открывает КНОПКА комнаты 24 (tilepos 0 — настоящий opener, проверено по - * res2013.bin), «нажимаемая» в момент ухода Кида ВЛЕВО. - * - * Звать при уходе ВЛЕВО, ДО смены комнаты, — рядом с чекпойнтом уровня 3. */ -void pop_jaffar_exit(void) __banked -{ - uint8_t *m; - if (pop_leveldoor_open != 2) return; - m = pop_trob_modif(JAFFAR_EXIT_ROOM); - pop_trigger_button(JAFFAR_EXIT_ROOM, JAFFAR_EXIT_TILEPOS, - pop_level_tile(JAFFAR_EXIT_ROOM, JAFFAR_EXIT_TILEPOS), - m ? m[JAFFAR_EXIT_TILEPOS] : 0, - 0 /* seg002:520 — playsound=0 */); -} - -/* on_guard_killed (seg006:1927) — соперник только что потерял последнее HP. - * Уровень 13 — единственный, где у этого есть последствия помимо звука: - * белая вспышка и pop_leveldoor_open = 2, то есть «выход разрешён» (сама - * дверь откроется кнопкой из pop_jaffar_exit). - * - * Ветку `is_show_time = 1` не портируем: это показ ОСТАВШЕГОСЯ ВРЕМЕНИ, а - * часов на 60 минут у нас пока нет вовсе — появятся вместе с таймером игры. - * Демо-уровень (0) сюда тоже не входит: его ветка — часть аттракта. */ -static void on_guard_killed(void) -{ - /* Демо-уровень (0) у оригинала уходит в свою ветку — «беги из комнаты», - * без единого звука (seg006:1929). Заставочная демка озвучена только - * эффектами, музыки в ней нет вовсе. */ - if (pop_current_level == 0) return; - if (pop_current_level != JAFFAR_LEVEL) { - /* seg006:1940 — победный трек за стража; за тень его нет: она не - * «убита», а слилась с Кидом. */ - if (Char.charid != CHARID_1_SHADOW) pop_sfx_play(37); - return; - } - pop_sfx_play(43); /* смерть Джафара — свой трек */ - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = JAFFAR_FLASH_TIME; - pop_leveldoor_open = 2; -} - -/* check_killed_shadow (seg006:2033) — «убил тень = убил себя». На уровне 12 - * Кид и тень связаны насмерть: как только один из них перестал быть живым - * (alive >= 0), второму отсчитывается 100 урона, то есть гарантированная - * смерть, и обоих накрывает белая вспышка. - * - * Условие оригинала `(Char.charid | Opp.charid) == charid_1_shadow` читается - * так: в паре ровно Кид (0) и тень (1) — со стражем или скелетом связи нет. - * Оригинал зовёт это ДВАЖДЫ за кадр (из тика Кида и из тика соперника, с - * уже переставленными окнами); нам хватает одного вызова на кадр с явным - * разбором обеих сторон — окна Char/Opp здесь не нужны, кроме как для - * маршрутизации урона внутри pop_take_hp. */ -void pop_check_killed_shadow(void) __banked -{ - if (pop_current_level != SHADOW_FIGHT_LEVEL) return; - if ((uint8_t)(Kid.charid | Guard.charid) != CHARID_1_SHADOW) return; - if (Kid.alive < 0 && Guard.alive >= 0) { - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 5; - pop_loadkid(); - pop_take_hp(100); - } else if (Guard.alive < 0 && Kid.alive >= 0) { - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 5; - pop_loadshad(); - pop_take_hp(100); - } -} - -/* ---- Синтетический ввод (seg002:0706..) --------------------------- */ -static void move_0_nothing(void) -{ - control_shift = control_y = control_x = control_shift2 = 0; - control_down = control_up = control_backward = control_forward = 0; -} -static void move_1_forward(void) -{ - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; -} -static void move_2_backward(void) -{ - control_backward = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_BACKWARD; -} -static void move_3_up(void) -{ - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; -} -static void move_4_down(void) -{ - control_down = POP_CONTROL_HELD; - control_y = POP_CONTROL_HELD_DOWN; -} -static void move_6_shift(void) -{ - control_shift = POP_CONTROL_HELD; - control_shift2 = POP_CONTROL_HELD; -} -/* move_7 (seg002:0770): ОТПУСТИТЬ shift — отдельный ход, потому что - * move_0_nothing сбрасывает всё, а здесь нужно снять только его. */ -static void move_7(void) -{ - control_shift = POP_CONTROL_RELEASED; -} -static void move_down_back(void) -{ - control_down = POP_CONTROL_HELD; - move_2_backward(); -} -static void move_down_forw(void) -{ - control_down = POP_CONTROL_HELD; - move_1_forward(); -} - -/* autocontrol_guard_inactive (seg002:710): страж с убранным мечом. - * Пока Кид за спиной — страж не реагирует; исключение — «шум» Кида - * (is_guard_notice), от которого страж оборачивается. */ -static void autocontrol_guard_inactive(void) -{ - int16_t distance; - if (Kid.alive >= 0) return; - distance = pop_char_opp_dist(); - /* В оригинале условие записано как (word)distance < (word)-8 — - * беззнаковое сравнение, истинное для ВСЕГО, кроме диапазона −8..−1. - * То есть: Кид не «вплотную за спиной». */ - if (Opp.curr_row != Char.curr_row || distance >= 0 || distance < -8) { - if (is_guard_notice) { - is_guard_notice = 0; - if (distance < 0) { - if (distance < -4) move_4_down(); /* обернуться на шум */ - return; - } - } else if (distance < 0) { - return; - } - } - if (can_guard_see_kid) { - /* Увидел — переходит в боевую стойку (вниз+вперёд = достать меч). - * Уровень 13: пока идёт фора после встречи (pop_meet_jaffar), Джафар - * стоит и ждёт — это его единственное отличие от прочих стражей. */ - if (pop_current_level != JAFFAR_LEVEL || pop_guard_notice_timer == 0) - move_down_forw(); - } -} - -/* ---- Активный страж (меч обнажён), seg002:737.. -------------------- * - * Таблицы вероятностей по 12 градациям мастерства (seg002:26..38). Бросок - * — prandom(255) с СОБСТВЕННЫМ сидом: у нас последовательности разведены - * по доменам (кладка / анимация тайлов / бой), см. pop_geom.h. */ -static const uint8_t STRIKEPROB[NUM_GUARD_SKILLS] = { 61,100, 61, 61, 61, 40,100,220, 0, 48, 32, 48}; -static const uint8_t RESTRIKEPROB[NUM_GUARD_SKILLS] = { 0, 0, 0, 5, 5,175, 16, 8, 0,255,255,150}; -static const uint8_t BLOCKPROB[NUM_GUARD_SKILLS] = { 0,150,150,200,200,255,200,250, 0,255,255,255}; -static const uint8_t IMPBLOCKPROB[NUM_GUARD_SKILLS] = { 0, 61, 61,100,100,145,100,250, 0,145,255,175}; -static const uint8_t ADVPROB[NUM_GUARD_SKILLS] = {255,200,200,200,255,255,200, 0, 0,255,100,100}; - -/* Бросок «сработало ли»: в оригинале prob > prandom(255). */ -static uint8_t roll(uint8_t prob) -{ - return (uint8_t)(prob > (uint8_t)pop_prandom(&pop_fight_seed, 255)); -} - -/* guard_advance (seg002:0AF5): наступать. Мастерство 0 наступает всегда, - * остальные — только пока Кид не замахнулся. */ -static void guard_advance(void) -{ - if (guard_skill == 0 || kid_sword_strike == 0) { - if (roll(ADVPROB[guard_skill])) move_1_forward(); - } -} - -/* guard_block (seg002:0B1D): блокировать замах Кида. Если Кид только что - * пробил блок (justblocked) — своя, «импровизационная» вероятность. */ -static void guard_block(void) -{ - uint8_t of = Opp.frame; - if (of == FRAME_152_STRIKE_2 || of == FRAME_153_STRIKE_3 || - of == FRAME_162_BLOCK_TO_STRIKE) { - if (roll(justblocked ? IMPBLOCKPROB[guard_skill] - : BLOCKPROB[guard_skill])) - move_3_up(); - } -} - -/* guard_strike (seg002:0B73): бить. По замаху Кида не бьём (кадры 169/151); - * из своего парирования — по отдельной вероятности «добить». */ -static void guard_strike(void) -{ - uint8_t of = Opp.frame, cf = Char.frame; - if (of == FRAME_169_BEGIN_BLOCK || of == FRAME_151_STRIKE_1) return; - if (cf == FRAME_161_PARRY || cf == FRAME_150_PARRY) { - if (roll(RESTRIKEPROB[guard_skill])) move_6_shift(); - } else { - if (roll(STRIKEPROB[guard_skill])) move_6_shift(); - } -} - -/* autocontrol_guard_kid_armed (seg002:0AC1): Кид с мечом. Вплотную и - * далеко — наступаем; в «рабочей» дистанции 10..28 сначала пробуем блок, и - * только отдышавшись бьём. */ -static void autocontrol_guard_kid_armed(int16_t distance) -{ - if (distance < 10 || distance >= 29) { - guard_advance(); - } else { - guard_block(); - if (guard_refrac == 0) { - if (distance < 12 || distance >= 29) guard_advance(); - else guard_strike(); - } - } -} - -/* autocontrol_guard_kid_in_sight (seg002:0A93). */ -static void autocontrol_guard_kid_in_sight(int16_t distance) -{ - if (Opp.sword == SWORD_2_DRAWN) { - autocontrol_guard_kid_armed(distance); - } else if (guard_refrac == 0) { - /* Кид безоружен: подойти и рубить. */ - if (distance < 29) move_6_shift(); - else move_1_forward(); - } -} - -/* Тайл перед стражем / через один (порт get_tile_infrontof_char и - * get_tile_infrontof2_char, seg004) — но для Char, а не для Kid. */ -static uint8_t tile_infront(int8_t step) -{ - int8_t d = (int8_t)(Char.direction < 0 ? -step : step); - return pop_tile_at((int8_t)(Char.curr_col + d), Char.curr_row); -} - -/* autocontrol_guard_kid_far (seg002:09CB): идём, если впереди есть пол хотя - * бы через тайл; иначе пятимся (не шагать в пропасть). */ -static void autocontrol_guard_kid_far(void) -{ - if (tile_is_floor(tile_infront(1)) || tile_is_floor(tile_infront(2))) - move_1_forward(); - else - move_2_backward(); -} - -/* guard_follows_kid_down (seg002:09F8): Кида спихнули с уступа (droppedout), - * страж его больше не видит — идти ли следом вниз? Условия оригинала, все - * «не идти»: впереди стена; ИЛИ впереди не пол и при этом внизу пика, - * loose-плита, стена или пустота; ИЛИ Кид не ровно на ряд ниже. - * - * Тайлы читаются через pop_tile_at — это банк 1 → банк 3, то есть трамплин. - * Здесь это не жаль: ветка срабатывает только в кадре, когда Кид сорвался - * из боя, а не каждый кадр (её гейтят can_guard_see_kid == 0 и droppedout). - * - * Не идём — сбросить droppedout и попятиться; идём — шаг вперёд, дальше - * персонажа уводит вниз обычная физика (та же, что у Кида). */ -static void guard_follows_kid_down(void) -{ - uint8_t below, front; - if (Opp.action == ACT_HANGCLIMB || Opp.action == ACT_HANGSTRAIGHT) return; - front = tile_infront(1); - below = pop_tile_at((int8_t)(Char.curr_col + (Char.direction < 0 ? -1 : 1)), - (int8_t)(Char.curr_row + 1)); - if (front == TILE_WALL || - (!tile_is_floor(front) && - (below == TILE_SPIKE || below == TILE_LOOSE || below == TILE_WALL || - !tile_is_floor(below) || Char.curr_row + 1 != Opp.curr_row))) { - pop_droppedout = 0; - move_2_backward(); - } else { - move_1_forward(); - } -} - -/* autocontrol_guard_active (seg002:737). */ -static void autocontrol_guard_active(void) -{ - uint8_t cf = Char.frame; - uint8_t of; - int16_t distance; - - /* Кадр 166 (неактивная стойка) и всё, что ниже 150, — не боевые позы. */ - if (cf == FRAME_166_STAND_INACTIVE || cf < 150 || can_guard_see_kid == 1) - return; - - if (can_guard_see_kid == 0) { - /* seg002:740: Кид пропал из виду. Если его СПИХНУЛИ (droppedout) — - * решаем, идти ли за ним вниз; иначе просто отступаем. Скелет не - * отступает никогда (у него нет этой ветки в оригинале). */ - if (pop_droppedout) guard_follows_kid_down(); - else if (Char.charid != CHARID_4_SKELETON) move_down_back(); - return; - } - - /* can_guard_see_kid == 2 */ - of = Opp.frame; - distance = pop_char_opp_dist(); - /* Кид падает/приземляется в отскоке — не мешаем ему, ждём. */ - if (distance >= 12 && of >= 102 && of < 118 && Opp.action == 5) - return; - - if (distance < 35) { - if ((Char.sword < SWORD_2_DRAWN && distance < 8) || distance < 12) { - /* Слишком близко: если смотрим в одну сторону — развернуться. */ - if (Char.direction == Opp.direction) move_2_backward(); - else move_1_forward(); - } else { - autocontrol_guard_kid_in_sight(distance); - } - return; - } - - if (guard_refrac != 0) return; - if (Char.direction != Opp.direction) { - /* Кид разбежался — встречаем ударом, а не шагом. */ - if (of >= 7 && of < 15) { /* бег */ - if (distance < 40) move_6_shift(); - return; - } else if (of >= 34 && of < 44) { /* разбег в прыжок */ - if (distance < 50) move_6_shift(); - return; - } - } - autocontrol_guard_kid_far(); -} - -/* clear_char (seg006:1945): персонажа со сцены — направление «никуда», - * не жив, действие 0, HP обнулены. Полосу перерисует pop_hp_draw сам. */ -static void clear_char(void) -{ - Char.direction = DIR_56_NONE; - Char.alive = 0; - Char.action = 0; - guardhp_curr = 0; -} - -/* autocontrol_shadow_level4 (seg002:1131). Вся «логика» тени на уровне 4: - * в комнате зеркала она бежит вперёд (то есть ВЛЕВО — её направление - * зеркально Киду) и при x < 80 исчезает. Ни боя, ни преследования: она - * просто убегает за левый край и растворяется. */ -static void autocontrol_shadow_level4(void) -{ - if (Char.room != MIRROR_ROOM) return; - if (Char.x < 80) clear_char(); - else move_1_forward(); -} - -/* ---- Автодвижения: «демо-запись» вместо ИИ (seg002:1089) ----------- * - * - * Тень уровня 5 не принимает решений — она проигрывает ЗАПИСЬ нажатий: - * пара {time, move}, где time — момент по счётчику кадров demo_time, а - * move — номер синтетического хода (те же move_*, что заполняет - * autocontrol_*). Оригинал использует этот же движок для демо-режима - * заставки, поэтому имена сохранены. - * - * Тонкость выбора записи, которую легко «упростить» и сломать: когда время - * текущей записи ДОСТИГНУТО, индекс сдвигается вперёд, но ход берётся всё - * равно из ТЕКУЩЕЙ (ещё не сдвинутой) записи; пока не достигнуто — из - * ПРЕДЫДУЩЕЙ. То есть запись задаёт «с какого кадра действует её ход». */ -typedef struct { uint8_t time; int8_t move; } auto_move_t; - -/* shad_drink_move (data.h:866): подойти, взять зелье, выпить, уйти. */ -static const auto_move_t shad_drink_move[8] = { - {0x00, 0}, {0x01, 1}, {0x0E, 0}, {0x12, 6}, - {0x1D, 7}, {0x2D, 2}, {0x31, 1}, {0xFF, -2} -}; - -static void do_auto_moves(const auto_move_t *moves) -{ - uint8_t idx; - int8_t mv; - - if (demo_time >= 0xFE) return; - ++demo_time; - idx = demo_index; - if (moves[idx].time <= demo_time) ++demo_index; - else idx = (uint8_t)(demo_index - 1); - - mv = moves[idx].move; - switch (mv) { - case 0: move_0_nothing(); break; - case 1: move_1_forward(); break; - case 2: move_2_backward(); break; - case 3: move_3_up(); break; - case 4: move_4_down(); break; - case 5: move_3_up(); move_1_forward(); break; - case 6: move_6_shift(); break; - case 7: move_7(); break; - default: break; /* −1 «ничего», −2 «конец» */ - } -} - -/* autocontrol_shadow_level5 (seg002:1157). Тень стоит, пока не откроются - * ворота комнаты (openness >= 80), и только тогда запускает запись ходов: - * идёт к зелью, выпивает и уходит за левый край, где растворяется. - * - * Почему проверка ворот — именно через модификатор, а не через «дверь - * открыта»: `pop_leveldoor_open` тут ни при чём, речь о ВОРОТАХ (тайл 4) в - * колонке 1 верхнего ряда, и оригинал читает их openness напрямую. */ -static void autocontrol_shadow_level5(void) -{ - if (Char.room != SHADOW_STEAL_ROOM) return; - if (demo_time == 0) { -#if !POP_DBG_SHADOW_NOWAIT - uint8_t *m = pop_trob_modif(SHADOW_STEAL_ROOM); - if (m[SHADOW_DOOR_TILEPOS] < SHADOW_DOOR_OPEN_MIN) return; -#endif - demo_index = 0; - } - do_auto_moves(shad_drink_move); - if (Char.x < 15) clear_char(); -} - -/* autocontrol_shadow_level6 (seg002:1064). Вся логика — один осторожный шаг - * (Shift + вперёд) в тот кадр, когда Кид прыгает к решётке: тень встаёт на - * closer (1,1) и роняет решётку (1,2), за порожек которой Кид в этот момент - * цепляется. Условие смотрит на КИДА: кадр 43 — четвёртый кадр бег-прыжка, - * x < 128 отсекает прыжки в правой половине комнаты (там Кид ещё разбегается - * и до решётки ему далеко). */ -#define FRAME_43_RUNJUMP 43 - -static void autocontrol_shadow_level6(void) -{ - if (Char.room != SHADOW_STEP_ROOM) return; - if (Kid.frame != FRAME_43_RUNJUMP) return; - if (Kid.x >= 128) return; - move_6_shift(); - move_1_forward(); -} - -/* autocontrol_shadow_level12 (seg002:1184) — единственная тень, с которой - * можно и драться, и слиться. Четыре режима подряд, порядок важен. - * - * 1. «Ждать Кида» (Char.room 15, pop_shadow_init == 0). Пока Кид не дошёл - * до x >= 150, тень КАЖДЫЙ КАДР роняется заново — то есть висит в первом - * кадре падения у потолка. Дошёл — флаг поднят, падение пущено. Смысл: - * Кид обязан УВИДЕТЬ, как она сваливается сверху, а не застать готовую. - * 2. У тени вынут меч → обычный боевой ИИ стража. Исключение: если Кид - * намеренно убрал клинок (offguard) и тень ещё не отдышалась после - * попадания (guard_refrac) — она тоже убирает меч (move_4_down). - * 3. У тени меч в ножнах, но Кид ПРИ мече (или не убирал его намеренно): - * близко и видно (< 90) — выхватить клинок из стойки (кадр 15); далеко - * или не видно — стоять, а если Кид зашёл за спину, попятиться. - * 4. Оба без мечей — СЛИЯНИЕ: сойтись ближе 10 и объединиться. - * - * xdiff инициализируется заведомо большим числом (как в SDLPoP): при - * can_guard_see_kid < 2 расстояние не считается вовсе, и ветка «попятиться» - * не должна срабатывать на мусоре. */ -#define FRAME_15_STAND 15 -#define FRAME_3_START_RUN 3 -#define FRAME_127_STEPPING_7 127 -#define FRAME_133_AFTER_STEP 133 -#define SHADOW_WAIT_KID_X 150 -#define SHADOW_SWORD_DIST 90 - -static void autocontrol_shadow_level12(void) -{ - int16_t distance; - - if (Char.room == SHADOW_FIGHT_ROOM && pop_shadow_init == 0) { - if (Opp.x >= SHADOW_WAIT_KID_X) { - do_init_shad(init_shad_12, Char.room, SEQ_7_FALL); - return; - } - pop_shadow_init = 1; - } - if (Char.sword >= SWORD_2_DRAWN) { - if (offguard == 0 || guard_refrac == 0) autocontrol_guard_active(); - else move_4_down(); - return; - } - if (Opp.sword >= SWORD_2_DRAWN || offguard == 0) { - distance = 0x7000; - if (can_guard_see_kid < 2 || - (distance = pop_char_opp_dist()) >= SHADOW_SWORD_DIST) { - if (distance < 0) move_2_backward(); - return; - } - if (Char.frame == FRAME_15_STAND) move_down_forw(); - return; - } - if (pop_char_opp_dist() < SHADOW_UNITE_DIST) { - /* Слияние. Кид ПЕРЕЕЗЖАЕТ на место тени: оригинал переписывает - * charid активного персонажа (а это тень) в Кида и savekid'ит его - * целиком — с позицией, кадром и последовательностью тени. Отсюда - * и «дёрганый» шаг в оригинале: Кид оказывается там, где стояла - * тень. Слот соперника после этого гасится clear_char. */ - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 18; - pop_add_life(); /* +1 к потолку HP */ - pop_united_shadow = SHADOW_UNITE_TIME; - Char.charid = CHARID_0_KID; - pop_savekid(); - clear_char(); - return; - } - if (can_guard_see_kid == 2) { - /* Кид бежит к тени — тень бежит навстречу (кадры бега 3..14 и - * шага 127..132). */ - uint8_t of = Opp.frame; - if ((of >= FRAME_3_START_RUN && of < FRAME_15_STAND) || - (of >= FRAME_127_STEPPING_7 && of < FRAME_133_AFTER_STEP)) - move_1_forward(); - } -} - -/* autocontrol_mouse (seg002:07EB). Весь «ИИ» мыши — два порога по X: - * добежала влево до POP_MOUSE_TURN_X → seq_107 (встать, поднять голову, - * развернуться и уйти), вернулась вправо до POP_MOUSE_LEAVE_X → исчезнуть. - * - * Почему проверка на исчезновение висит на action == 0 (стойка), хотя мышь - * при этом БЕЖИТ: seq_107 заканчивается прыжком на метку `Mscurry1`, которая - * стоит ПОСЛЕ опкода act(actions_1_run_jump) в seq_105 — то есть на обратном - * пути кадры бега проигрываются, а action остаётся стоечным. Именно этим - * оригинал и различает «бежит туда» и «бежит обратно». */ -static void autocontrol_mouse(void) -{ - if (Char.direction == DIR_56_NONE) return; - if (Char.action == 0) { - if (Char.x >= POP_MOUSE_LEAVE_X) clear_char(); - } else if (Char.x < POP_MOUSE_TURN_X) { - pop_char_set_seq(SEQ_107_MOUSE_STAND_UP_GO); - play_seq(); - } -} - -/* autocontrol_shadow (seg002:081D) — по уровням. */ -static void autocontrol_shadow(void) -{ - if (pop_current_level == MIRROR_LEVEL) autocontrol_shadow_level4(); - if (pop_current_level == SHADOW_STEAL_LEVEL) autocontrol_shadow_level5(); - if (pop_current_level == SHADOW_STEP_LEVEL) autocontrol_shadow_level6(); - if (pop_current_level == SHADOW_FIGHT_LEVEL) autocontrol_shadow_level12(); -} - -/* autocontrol_guard (seg002:701) + autocontrol_opponent (seg002:628). */ -static void autocontrol_opponent(void) -{ - move_0_nothing(); - /* В оригинале эти таймеры убывают только в ветке НЕ-Кида. Demo Kid - * использует тот же AI, но skill 10 и таймеры стража не расходует. */ - if (Char.charid != CHARID_0_KID) { - if (justblocked) --justblocked; - if (kid_sword_strike) --kid_sword_strike; - if (guard_refrac) --guard_refrac; - } - /* autocontrol_skeleton (seg002:685): у скелета меч вынут ВСЕГДА — он не - * бывает «неактивным», поэтому ветка inactive ему недоступна. */ - if (Char.charid == CHARID_4_SKELETON) Char.sword = SWORD_2_DRAWN; - /* МЫШЬ — своей веткой (seg002:0643), первой в цепочке charid'ов. */ - if (Char.charid == CHARID_24_MOUSE) { autocontrol_mouse(); return; } - /* ТЕНЬ идёт своей веткой ЦЕЛИКОМ (seg002:0647): к стражьему ИИ она не - * сводится — на уровне 4 не дерётся вовсе. */ - if (Char.charid == CHARID_1_SHADOW) { autocontrol_shadow(); return; } - if (Char.sword < SWORD_2_DRAWN) autocontrol_guard_inactive(); - else autocontrol_guard_active(); -} - -/* do_demo() (seg006:0D49): пока меч не вынут, управление даёт demo_moves; - * в бою Кид становится AI-персонажем skill 10, а страж затем получает - * skill 11. Команды AI уже actor-relative, поэтому pop_control вызывается - * напрямую — без user_control(), как и исправленная таблица demo_moves. */ -uint8_t pop_demo_kid_ai(void) __banked -{ - if (Kid.sword != SWORD_2_DRAWN) return 0; - - pop_loadkid_and_opp(); - pop_load_fram_det_col(); - guard_skill = 10; - autocontrol_opponent(); - guard_skill = 11; - pop_control(); - pop_savekid_state(); - return 1; -} - -/* ---- Урон мечом (seg002:0CD4..0E1F) -------------------------------- */ -#define ACTION_99_HURT 99 -#define ACTION_1_RUN 1 -#define FRAME_154_POKING 154 -#define SEQ_69_ATTACK_WAS_PARRIED 69 -#define SEQ_74_HIT_BY_SWORD 74 -#define SEQ_85_STABBED_TO_DEATH 85 - -/* refractimer (seg002:36) — «отдышка» стража после того, как его ранили. */ -static const uint8_t REFRACTIMER[NUM_GUARD_SKILLS] = - { 16, 16, 16, 16, 8, 8, 8, 8, 0, 8, 0, 0}; - -/* hurt_by_sword (seg002): применить попадание к АКТИВНОМУ персонажу. - * Без меча в руке любое попадание смертельно; с мечом — минус 1 HP и кадр - * «получил удар». - * УПРОЩЕНИЕ: ветку «сбит с уступа» (seq_81, когда сзади пусто и до кромки - * меньше 4) не портируем — ей нужны тайловые запросы ОТ Char, а pop_map - * пока умеет только от Kid. На ровном полу (тайл сзади не пустой) оригинал - * идёт ровно нашей веткой. */ -static void hurt_by_sword(void) -{ - if (Char.alive >= 0) return; - if (Char.sword != SWORD_2_DRAWN) { - /* Удар мимо боевой стойки в оригинале СМЕРТЕЛЕН (seg002: «Being - * hurt when not in fighting pose means death», take_hp(100)), и - * чит бессмертия сюда НЕ распространяется — он работает только в - * бою, то есть с мечом в руке. - * - * Раньше чит перехватывал hurt_by_sword целиком и безусловно ставил - * SEQ_74_HIT_BY_SWORD. Но это анимация «получил удар В БОЕВОЙ - * СТОЙКЕ»: её кадры (150..179) все с мечом, и Кид оказывался в них - * при sword == 0. Диспетчер control() при sword != 2 в - * control_with_sword не идёт, а среди обычных веток кадра 158/170/171 - * нет ни одной — управление зависало намертво: Кид стоял в боевой - * стойке без меча и не разворачивался к сопернику (BUG-CHEAT-IMM-1). - * - * Костыля «снять бессмертие на время вызова» здесь БОЛЬШЕ НЕТ: - * pop_take_hp гасит только урон меньше 100, а тут ровно 100. */ - pop_take_hp(100); - pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); - } else if (Char.charid == CHARID_0_KID && pop_immortal) { - /* ЧИТ, уровень 1 и выше: в боевой стойке удары не отнимают HP. - * Кадр «получил удар» оставляем — иначе бой перестаёт читаться, - * да и оригинал на выживший удар ставит ровно его. */ - pop_char_set_seq(SEQ_74_HIT_BY_SWORD); - } else if (Char.charid != CHARID_4_SKELETON && pop_take_hp(1)) { - pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); /* HP кончились */ - } else { - pop_char_set_seq(SEQ_74_HIT_BY_SWORD); - } - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; - /* seg002:0C1F: у Кида свой звук боли, у соперника свой. */ - pop_sfx_play((uint8_t)(Char.charid == CHARID_0_KID ? 13 : 12)); - play_seq(); -} - -/* check_hurting (seg002:0D56): достал ли АКТИВНЫЙ персонаж соперника. - * Бьют кадры 153/154; если соперник в этот момент парирует — удар отбит. */ -static void check_hurting(void) -{ - int16_t distance; - uint8_t cf, of, min_range; - - if (Char.sword != SWORD_2_DRAWN) return; - if (Char.curr_row != Opp.curr_row) return; - cf = Char.frame; - if (cf != FRAME_153_STRIKE_3 && cf != FRAME_154_POKING) return; - - distance = pop_char_opp_dist(); - of = Opp.frame; - if (distance < 0 || distance >= 29 || - (of != FRAME_161_PARRY && of != FRAME_150_PARRY)) { - /* Соперник НЕ парирует. */ - if (cf == FRAME_154_POKING) { - /* seg002:0DAE — свист клинка мимо цели. */ - pop_sfx_play(11); - min_range = (uint8_t)(Opp.sword < SWORD_2_DRAWN ? 8 : 12); - distance = pop_char_opp_dist(); - if (distance >= (int16_t)min_range && distance < 29) - Opp.action = ACTION_99_HURT; - } - } else { - /* Парировано. */ - Opp.frame = FRAME_161_PARRY; - if (Char.charid != CHARID_0_KID) justblocked = 4; - pop_char_set_seq(SEQ_69_ATTACK_WAS_PARRIED); - play_seq(); - } -} - -/* check_sword_hurting (seg002:0D1A): прогнать проверку с ОБЕИХ сторон. */ -void pop_check_sword_hurting(void) __banked -{ - uint8_t kf = Kid.frame; - if (kf == 0 || (kf >= 219 && kf < 229)) return; /* подъём по лестнице */ - pop_loadshad_and_opp(); - check_hurting(); - pop_saveshad_and_opp(); - pop_loadkid_and_opp(); - check_hurting(); - pop_savekid_and_opp(); -} - -/* check_sword_hurt (seg002:0CD4): применить помеченные попадания. Если - * ранен страж — Киду в этом кадре урон уже не проходит (в оригинале так же: - * его action сбрасывается ДО проверки). */ -void pop_check_sword_hurt(void) __banked -{ - if (Guard.action == ACTION_99_HURT) { - if (Kid.action == ACTION_99_HURT) Kid.action = ACTION_1_RUN; - pop_loadshad(); - hurt_by_sword(); - pop_saveshad(); - guard_refrac = (int8_t)REFRACTIMER[guard_skill]; - } else if (Kid.action == ACTION_99_HURT) { - pop_loadkid(); - hurt_by_sword(); - pop_savekid(); - } -} - -/* play_guard (seg006): ИИ + общий диспетчер. Отдельная ветка «HP кончились»: - * пока страж жив (alive < 0) и HP есть — обычный ход; как только HP дошли до - * нуля, он переводится в «умирает» (alive = 0), и дальше тот же control() - * ставит ему seq_71_dying. Уже умирающий сюда попадает с alive >= 0 и просто - * доигрывает последовательность. */ -static void play_guard(void) -{ - /* МЫШЬ (seg006:0D85, первая ветка): ей положен ТОЛЬКО автоконтроль. - * Диспетчер control() ей не нужен и вреден — он бы гонял её по - * стоечным веткам управления, а вся её «жизнь» уже описана - * последовательностями seq_105/107. */ - if (Char.charid == CHARID_24_MOUSE) { autocontrol_opponent(); return; } - if (Char.alive < 0 && guardhp_curr == 0) { - Char.alive = 0; - on_guard_killed(); /* уровень 13: вспышка + «выход открыт» */ - } - autocontrol_opponent(); - pop_control(); -} - -/* pop_guard_tick — порт play_guard_frame (seg000:1246) в объёме, который у - * нас уже есть: окно Char/Opp вокруг ИИ, диспетчера и интерпретатора - * последовательностей. Физика стража (fall_accel/коллизия/бамп/пики) — - * отдельным шагом. */ -void pop_guard_tick(void) __banked -{ - /* Гейт play_guard_frame (seg000:1248) — `if (Guard.direction != - * dir_56_none)`. Именно им ОТКЛЮЧАЕТСЯ персонаж: clear_char (seg006) - * не трогает charid, он ставит direction = dir_56_none, и вся логика - * соперника перестаёт вызываться. - * - * Проверять только charid НЕЛЬЗЯ (кусало 2026-08-11 на тени уровня 5): - * тень уходила за левый край, clear_char её «выключал», но тик - * продолжал крутиться — do_auto_moves за концом таблицы отдаёт - * последнюю запись `{0x31, 1}` («вперёд»), и тень разворачивалась, - * вбегала обратно, пробегала верхний ряд и падала в проём. */ - if (Guard.charid == 0 || Guard.direction == DIR_56_NONE) return; - pop_loadshad_and_opp(); /* Char = Guard, Opp = Kid */ - /* Симметрично Киду (play_guard_frame, seg000:1248): cur_frame один на - * всех, и до этой строки в нём лежит кадр КИДА — он тикал раньше. */ - pop_load_fram_det_col(); - play_guard(); - /* Анимация: та же seqtbl, что у Кида, но своя таблица кадров — - * выбирается по Char.charid внутри load_frame (seg006:0293). */ - play_seq(); - pop_saveshad(); -} diff --git a/applications/PoP/roomtest/kid_arc.h b/applications/PoP/roomtest/kid_arc.h deleted file mode 100644 index db3d846..0000000 --- a/applications/PoP/roomtest/kid_arc.h +++ /dev/null @@ -1,67 +0,0 @@ -/* kid_arc.h — индексы в архиве KID. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef KID_ARC_H -#define KID_ARC_H - -#define ARC_KID_COUNT 58 - -#define ARC_KID_KID0 0 -#define ARC_KID_KID1 1 -#define ARC_KID_KID2 2 -#define ARC_KID_KID3 3 -#define ARC_KID_KID4 4 -#define ARC_KID_KID5 5 -#define ARC_KID_KID6 6 -#define ARC_KID_KID7 7 -#define ARC_KID_KID8 8 -#define ARC_KID_KID9 9 -#define ARC_KID_KID10 10 -#define ARC_KID_KID11 11 -#define ARC_KID_KID12 12 -#define ARC_KID_KID13 13 -#define ARC_KID_KID14 14 -#define ARC_KID_KID15 15 -#define ARC_KID_KID16 16 -#define ARC_KID_KID17 17 -#define ARC_KID_KID18 18 -#define ARC_KID_KID19 19 -#define ARC_KID_KID20 20 -#define ARC_KID_KID21 21 -#define ARC_KID_KID22 22 -#define ARC_KID_KID23 23 -#define ARC_KID_KID24 24 -#define ARC_KID_KID25 25 -#define ARC_KID_KID26 26 -#define ARC_KID_KID27 27 -#define ARC_KID_KID0_V 28 -#define ARC_KID_KID1_V 29 -#define ARC_KID_KID2_V 30 -#define ARC_KID_KID3_V 31 -#define ARC_KID_KID4_V 32 -#define ARC_KID_KID5_V 33 -#define ARC_KID_KID6_V 34 -#define ARC_KID_KID7_V 35 -#define ARC_KID_KID8_V 36 -#define ARC_KID_KID9_V 37 -#define ARC_KID_KID10_V 38 -#define ARC_KID_KID11_V 39 -#define ARC_KID_KID12_V 40 -#define ARC_KID_KID13_V 41 -#define ARC_KID_KID14_V 42 -#define ARC_KID_KID15_V 43 -#define ARC_KID_KID16_V 44 -#define ARC_KID_KID17_V 45 -#define ARC_KID_KID18_V 46 -#define ARC_KID_KID19_V 47 -#define ARC_KID_KID20_V 48 -#define ARC_KID_KID21_V 49 -#define ARC_KID_KID22_V 50 -#define ARC_KID_KID23_V 51 -#define ARC_KID_KID24_V 52 -#define ARC_KID_KID25_V 53 -#define ARC_KID_KID26_V 54 -#define ARC_KID_KID27_V 55 -#define ARC_KID_SWORD 56 -#define ARC_KID_SWORD_V 57 - -#endif diff --git a/applications/PoP/roomtest/kid_data.h b/applications/PoP/roomtest/kid_data.h deleted file mode 100644 index 09debc0..0000000 --- a/applications/PoP/roomtest/kid_data.h +++ /dev/null @@ -1,77 +0,0 @@ -/* kid_data.h — данные анимации Kid (frame_table + seqtbl + - * offsets), извлечено toolchain/pop_extract_kid_data.py из - * SDLPoP. НЕ править вручную. seqtbl адресуется базой - * SEQTBL_BASE: kid_seqtbl[addr - SEQTBL_BASE]. */ -#ifndef KID_DATA_H -#define KID_DATA_H -#include - -#define SEQTBL_BASE 0x196Eu - -/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid). - * САМА таблица кадров и seqtbl лежат в kid.ani (EMM- - * страница); здесь только тип и размеры. */ -typedef struct { uint8_t image; int8_t dx, dy; uint8_t flags, sword; } kframe; -#define KID_NFRAMES 241 -#define KID_SEQTBL_LEN 2310 - -/* Раскладка kid.ani: кадры (KID_NFRAMES*5), затем seqtbl. */ -#define KID_BIN_FRAMES_OFF 0 -#define KID_BIN_SEQTBL_OFF 1205 -/* Таблица кадров СТРАЖА (frame_tbl_guard, seg006:372): индекс - * frame + add_frame - 149 (add_frame=70 для кадров 102..106). */ -#define KID_NGFRAMES 41 -#define KID_BIN_GFRAMES_OFF 3515 -/* Таблица кадров КАТСЦЕН (frame_tbl_cuts, seg006:417): - * Princess/Vizier, индекс — номер кадра как есть. Набор - * спрайтов выбирает sword>>6 (1 = PV1 res800, 2 = PV2 res900). */ -#define KID_NCFRAMES 86 -#define KID_BIN_CFRAMES_OFF 3720 - -#define KID_NSEQ 115 -#define KID_SEQ_OFF_INIT { \ - 0x0000,0x1973,0x19A0,0x1A93,0x1ACD,0x1B39,0x1B5A,0x1BDB, \ - 0x1C54,0x1CA1,0x1D04,0x1D25,0x1D49,0x1D4F,0x1D68,0x1DF6, \ - 0x1C84,0x202B,0x1C1C,0x1C01,0x205A,0x1C38,0x209C,0x1D36, \ - 0x1C69,0x1CD1,0x1B04,0x1B1A,0x1D7D,0x1F9E,0x1F92,0x1F82, \ - 0x1F72,0x1F5D,0x1F48,0x1F33,0x1F19,0x1F13,0x1EF7,0x1EDA, \ - 0x1EBB,0x1E9C,0x1E7D,0x1B53,0x1E59,0x1E06,0x1E3B,0x1DFC, \ - 0x1D9B,0x1FB3,0x1FA7,0x20BE,0x20D1,0x20D4,0x20C9,0x19C4, \ - 0x1A13,0x1A2E,0x1A3C,0x1A7C,0x1A83,0x1A63,0x1A5E,0x1A68, \ - 0x1A6E,0x1A75,0x1A5A,0x19F9,0x1CEC,0x1A54,0x20DD,0x20AE, \ - 0x1E78,0x1CDC,0x19DC,0x1A42,0x1A07,0x19A8,0x2009,0x1B1B, \ - 0x1A8B,0x1B85,0x1BA1,0x1BBF,0x196E,0x20A9,0x1A22,0x19A6, \ - 0x19AC,0x1B2D,0x19C1,0x1FCA,0x1FDA,0x1FFB,0x2195,0x2132, \ - 0x214F,0x2166,0x2199,0x21A8,0x216D,0x226E,0x2136,0x21BC, \ - 0x1BFA,0x2245,0x2253,0x225B,0x21C4,0x21C0,0x21E6,0x21EA, \ - 0x21FC,0x2240,0x2257, \ -} - -/* sword_tbl (seg006:2047): клинок отдельным спрайтом chtab_0. - * Индекс — sword_frame (кадр.sword & 0x3F), id 255 = клинка нет. - * Смещения x/y — ЭКРАННЫЕ (применяются после calc_screen_x_coord), - * x — «вперёд» по направлению персонажа. */ -#define KID_NSWORD 51 -#define KID_SWORD_ID_INIT { \ - 0xFF,0x00,0x05,0x01,0x02,0x06,0x07,0x03,0x04,0x1E,0x08,0x09, \ - 0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x13,0x11, \ - 0x11,0x07,0x01,0x1C,0x08,0x04,0x04,0x0A,0x0D,0x0D,0x0D,0x14, \ - 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0xFF,0xFF,0x1D,0x08,0x1F, \ - 0x20,0x21,0x08, \ -} -#define KID_SWORD_DX_INIT { \ - 0,0,-9,7,17,7,0,17,16,12,13,7, \ - 10,10,22,28,13,0,0,21,14,21,22,7, \ - 15,0,7,14,7,6,9,11,24,19,21,7, \ - 14,14,14,28,28,21,14,14,21,0,8,14, \ - 14,7,8, \ -} -#define KID_SWORD_DY_INIT { \ - 0,-9,-29,-25,-26,-14,-5,-16,-19,-9,-34,-25, \ - -16,-11,-21,-23,-35,-38,-29,-19,-23,-22,-23,-13, \ - -18,-8,-27,-28,-27,-23,-21,-18,-23,-23,-23,-32, \ - -32,-31,-29,-28,-28,-25,-22,-25,-25,-16,-37,-24, \ - -24,-14,-37, \ -} - -#endif diff --git a/applications/PoP/roomtest/pop_app.c b/applications/PoP/roomtest/pop_app.c deleted file mode 100644 index 3dcaf14..0000000 --- a/applications/PoP/roomtest/pop_app.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * pop_app.c — таблица переходов оболочки, БАНК 9 (FG1). - * - * Модуль не рисует и не выделяет память. Это чистая политика переходов, - * поэтому её можно проверять host-тестом без DSS/MAME. Жизненный цикл - * ресурсов остаётся у enter/leave соответствующих состояний. - */ -#include "pop_app.h" - -pop_app_state_t pop_app_state; - -void pop_app_reset(void) __banked -{ - pop_app_state = POP_APP_BOOT; -} - -uint8_t pop_app_dispatch(pop_app_event_t event) __banked -{ - pop_app_state_t next = pop_app_state; - uint8_t accepted = 0; - - switch (pop_app_state) { - case POP_APP_BOOT: - if (event == POP_APP_EV_BOOT_READY) { - next = POP_APP_BUILD_INFO; accepted = 1; - } - break; - - case POP_APP_BUILD_INFO: - if (event == POP_APP_EV_BUILD_DONE) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_TITLE: - if (event == POP_APP_EV_INTRO_STARTED) { - next = POP_APP_INTRO; accepted = 1; - } else if (event == POP_APP_EV_DEMO_STARTED) { - next = POP_APP_DEMO; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_INTRO: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_DEMO; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_DEMO: - if (event == POP_APP_EV_DEMO_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_LEVEL_LOAD: - if (event == POP_APP_EV_LEVEL_READY) { - next = POP_APP_PLAYING; accepted = 1; - } - break; - - case POP_APP_PLAYING: - if (event == POP_APP_EV_PAUSE) { - next = POP_APP_PAUSE_MENU; accepted = 1; - } else if (event == POP_APP_EV_CUTSCENE_STARTED) { - next = POP_APP_CUTSCENE; accepted = 1; - } else if (event == POP_APP_EV_LEVEL_FINISHED) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } else if (event == POP_APP_EV_TIME_EXPIRED) { - next = POP_APP_TIME_EXPIRED; accepted = 1; - } else if (event == POP_APP_EV_ENDING_STARTED) { - next = POP_APP_ENDING; accepted = 1; - } else if (event == POP_APP_EV_RESTART_INTRO) { - /* start_game() прямо из геймплея: так оригинал уходит в title, - * когда игрок не нажал кнопку за 288 тиков после смерти - * (seg000:958). Раньше это событие принимал только pause menu. */ - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_PAUSE_MENU: - if (event == POP_APP_EV_RESUME) { - next = POP_APP_PLAYING; accepted = 1; - } else if (event == POP_APP_EV_RESTART_INTRO) { - /* Restart Game начинает заново именно title/intro. Сброс новой - * игры произойдёт позже общим LEVEL_LOAD после skip/attract. */ - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_CUTSCENE: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_TIME_EXPIRED: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_ENDING: - if (event == POP_APP_EV_ENDING_FINISHED) { - /* Таблица рекордов — ХВОСТ end_sequence, а не отдельный экран - * по желанию: она же дослушивает победную тему и гасит экран - * перед возвратом в начало (seg001:5F1). */ - next = POP_APP_HALL_OF_FAME; accepted = 1; - } - break; - - case POP_APP_HALL_OF_FAME: - if (event == POP_APP_EV_HOF_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_QUIT: - default: - break; - } - - if (event == POP_APP_EV_QUIT && pop_app_state != POP_APP_QUIT) { - next = POP_APP_QUIT; - accepted = 1; - } - if (!accepted) return 0; - pop_app_state = next; - return 1; -} diff --git a/applications/PoP/roomtest/pop_app.h b/applications/PoP/roomtest/pop_app.h deleted file mode 100644 index 87c3dbb..0000000 --- a/applications/PoP/roomtest/pop_app.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * pop_app.h — автомат верхнего уровня Prince of Persia (FG1). - * - * Игровой цикл — лишь состояние PLAYING, а не «вся программа». Каждый - * режим возвращает результат через pop_app_dispatch(), поэтому будущие - * TITLE/demo/cutscene не будут вызывать друг друга рекурсивно и копить - * стек или EMM-ресурсы. - */ -#ifndef POP_APP_H -#define POP_APP_H - -#include - -typedef enum { - POP_APP_BOOT = 0, - POP_APP_BUILD_INFO, - POP_APP_TITLE, - POP_APP_INTRO, - POP_APP_DEMO, - POP_APP_LEVEL_LOAD, - POP_APP_PLAYING, - POP_APP_PAUSE_MENU, - POP_APP_CUTSCENE, - POP_APP_TIME_EXPIRED, - POP_APP_ENDING, - POP_APP_HALL_OF_FAME, - POP_APP_QUIT -} pop_app_state_t; - -/* События не содержат деталей конкретного режима: режим завершился, а - * переход выбирает центральная таблица. Это намеренно делает недопустимый - * переход явным no-op вместо случайного прыжка в код другого экрана. */ -typedef enum { - POP_APP_EV_BOOT_READY = 0, - POP_APP_EV_BUILD_DONE, - POP_APP_EV_INTRO_STARTED, - POP_APP_EV_DEMO_STARTED, - POP_APP_EV_CUTSCENE_STARTED, - POP_APP_EV_NEW_GAME, - POP_APP_EV_PAUSE, - POP_APP_EV_RESUME, - POP_APP_EV_LEVEL_READY, - POP_APP_EV_LEVEL_FINISHED, - POP_APP_EV_DEMO_FINISHED, - POP_APP_EV_CUTSCENE_FINISHED, - POP_APP_EV_TIME_EXPIRED, - POP_APP_EV_ENDING_STARTED, - POP_APP_EV_ENDING_FINISHED, - POP_APP_EV_HOF_FINISHED, - POP_APP_EV_RESTART_INTRO, - POP_APP_EV_QUIT -} pop_app_event_t; - -extern pop_app_state_t pop_app_state; - -/* Начать новый маршрут с BOOT. */ -void pop_app_reset(void) __banked; - -/* Выполнить допустимый переход. Возвращает 1 при успехе, 0 при ошибке - * протокола; в ошибочном случае состояние не меняется. */ -uint8_t pop_app_dispatch(pop_app_event_t event) __banked; - -#endif /* POP_APP_H */ diff --git a/applications/PoP/roomtest/pop_arc.c b/applications/PoP/roomtest/pop_arc.c deleted file mode 100644 index 12ad845..0000000 --- a/applications/PoP/roomtest/pop_arc.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * pop_arc.c — чтение архива ресурсов PBA1, БАНК 8. - * - * Контракт и мотивация — в pop_arc.h. Здесь всё сводится к трём вызовам - * libc: open один раз на группу, lseek к элементу и bank_read_page прямо в - * EMM-страницу (тот резидентен и потому безопасен из банка huge — он же - * переключает W3, где живёт наш код). - */ -#include -#include -#include -#include -#include -#include "pop_arc.h" - -/* Пути 8.3, как требует DSS. Держим их ЗДЕСЬ: строка обязана лежать в том - * же банке, что и код, который её читает (см. pop_arc.h). */ -static const char *const arc_path[POP_ARC_IDS] = { - "BG\\bg.arc", - "KID\\kid.arc", - "GUARD\\guard.arc", - "SKEL\\skel.arc", - "VIZIER\\vizier.arc", - "SHADOW\\shadow.arc", - "TITLE\\title.arc", - "PV\\pv.arc", - "SND\\snd.arc" -}; - -int8_t pop_arc_open_id(pop_arc_t *a, uint8_t id, - uint8_t *tbl, uint8_t tbl_max) __banked -{ - if (id >= POP_ARC_IDS) return -1; - return pop_arc_open(a, arc_path[id], tbl, tbl_max); -} - -int8_t pop_arc_open(pop_arc_t *a, const char *path, - uint8_t *tbl, uint8_t tbl_max) __banked -{ - uint8_t head[8]; - int fd; - - a->fd = -1; - a->count = 0; - fd = open(path, O_RDONLY); - if (fd < 0) return -1; - if (read(fd, head, sizeof(head)) != (int)sizeof(head) || - memcmp(head, "PBA1", 4) != 0 || - head[4] == 0 || head[4] > tbl_max || head[4] > POP_ARC_MAX) { - close(fd); - return -1; - } - if (read(fd, tbl, (uint16_t)head[4] * POP_ARC_REC) != - (int)((uint16_t)head[4] * POP_ARC_REC)) { - close(fd); - return -1; - } - a->fd = fd; - a->count = head[4]; - return (int8_t)head[4]; -} - -uint16_t pop_arc_size(const uint8_t *tbl, uint8_t idx) -{ - const uint8_t *rec = tbl + (uint16_t)idx * POP_ARC_REC; - return (uint16_t)(rec[2] | ((uint16_t)rec[3] << 8)); -} - -int pop_arc_read(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, uint16_t skip, - uint8_t page, uint16_t off, uint16_t size) __banked -{ - const uint8_t *rec; - uint16_t sec, len; - long pos; - - if (a->fd < 0 || idx >= a->count) return -1; - rec = tbl + (uint16_t)idx * POP_ARC_REC; - sec = (uint16_t)(rec[0] | ((uint16_t)rec[1] << 8)); - len = (uint16_t)(rec[2] | ((uint16_t)rec[3] << 8)); - if (skip >= len) return 0; - len = (uint16_t)(len - skip); - if (size && size < len) len = size; - - /* Сектора в байты — единственное место, где нужна 32-битная величина: - * архив может быть больше 64 КБ, и lseek принимает long. Путь холодный - * (загрузка ресурсов), в кадре этого нет. */ - pos = ((long)sec << 9) + (long)skip; - if (lseek(a->fd, pos, SEEK_SET) < 0) return -1; - return bank_read_page(a->fd, page, off, len); -} - -int8_t pop_arc_atlas(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, - atlas_t *at) __banked -{ - uint8_t blk, page; - int n; - - blk = mem_alloc_pages(1); - if (!blk) return -1; - page = mem_get_page(blk, 0); - n = pop_arc_read(a, tbl, idx, 0, page, 0, 0); - /* Дальше всё общее с atlas_load: магия 'SPA1', разбор заголовка и - * gfx_w0_page_prepare. При ошибке atlas_attach сам отпускает блок. */ - return (int8_t)atlas_attach(at, blk, page, n); -} - -void pop_arc_close(pop_arc_t *a) __banked -{ - if (a->fd >= 0) close(a->fd); - a->fd = -1; - a->count = 0; -} diff --git a/applications/PoP/roomtest/pop_arc.h b/applications/PoP/roomtest/pop_arc.h deleted file mode 100644 index 20cd249..0000000 --- a/applications/PoP/roomtest/pop_arc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * pop_arc.h — архив ресурсов PBA1: много файлов в одном, один open на всех. - * - * ЗАЧЕМ. Замер в MAME (2026-08-25): `open` стоит 51,4 мс, а чтение 16 КБ из - * уже открытого файла — 32,6 мс. То есть 61 % времени загрузки уходит на - * открытие, а не на данные, и одна только стартовая пачка ресурсов (~142 - * файла) — это 7,3 секунды чистого `open`. Архив открывается ОДИН раз на - * группу, и эта цена платится один раз вместо сотни. - * - * ФОРМАТ (генерирует toolchain/pop_pack_arc.py): - * 0..3 'PBA1' магия и версия - * 4 count число записей, 1..126 - * 8.. записи по 4 байта: offset в СЕКТОРАХ по 512 (uint16), - * size в байтах (uint16) - * данные с 512, каждый элемент выровнен на 512. - * Оффсет в секторах, потому что архив может быть больше 64 КБ (pv — мегабайт); - * размер в байтах, потому что ни один ресурс не крупнее 16 КБ — он обязан - * помещаться в EMM-страницу. - * - * ТАБЛИЦУ ДЕРЖИТ ВЫЗЫВАЮЩИЙ, на своём стеке: 4 байта на запись, у самой - * большой группы 320 байт. В W2 её класть нельзя — там осталось около сотни - * байт, — а стека в точке загрузки ресурсов израсходовано 75 байт из 1279 - * (замер там же). Так модуль не занимает постоянной памяти вовсе. - */ -#ifndef POP_ARC_H -#define POP_ARC_H - -#include -#include /* atlas_t */ - -#define POP_ARC_HEADER 512 -#define POP_ARC_SECTOR 512 -#define POP_ARC_MAX 126 /* (512-8)/4 */ -#define POP_ARC_REC 4 /* байт на запись таблицы */ - -/* Имя у структуры есть намеренно: так на неё можно сослаться из заголовков, - * которым незачем тянуть весь pop_arc.h (pop_ui.h). */ -typedef struct pop_arc_s { - int fd; - uint8_t count; -} pop_arc_t; - -/* ИМЕНА АРХИВОВ ЗНАЕТ САМ МОДУЛЬ, и это не вкусовщина: строковый литерал - * лежит в rodata СВОЕГО банка, а pop_arc.c живёт в банке 8. Указатель на - * литерал из другого банка после переключения W3 показывает на чужие - * данные — ровно так «BG\bg.arc» превращался в мусор и загрузка фона - * падала (поймано 2026-08-26). Поэтому наружу отдаём НОМЕР архива. */ -typedef enum { - POP_ARC_BG = 0, - POP_ARC_KID, - POP_ARC_GUARD, - POP_ARC_SKEL, - POP_ARC_VIZIER, - POP_ARC_SHADOW, - POP_ARC_TITLE, - POP_ARC_PV, - POP_ARC_SND, - POP_ARC_IDS -} pop_arc_id_t; - -/* Открыть архив по номеру: то же, что pop_arc_open, но имя берётся из - * таблицы внутри модуля. */ -int8_t pop_arc_open_id(pop_arc_t *a, uint8_t id, - uint8_t *tbl, uint8_t tbl_max) __banked; - -/* Открыть архив и вычитать таблицу в буфер вызывающего (count*4 байт). - * tbl_max — сколько записей помещается в буфер. - * Возврат: число записей; -1 — не открылся, не PBA1 либо таблица не влезла. */ -int8_t pop_arc_open(pop_arc_t *a, const char *path, - uint8_t *tbl, uint8_t tbl_max) __banked; - -/* Размер элемента idx по таблице (0, если индекс за пределами). */ -uint16_t pop_arc_size(const uint8_t *tbl, uint8_t idx); - -/* Прочитать кусок элемента idx в EMM-страницу: skip байт от его начала, - * size байт, в страницу page со смещением off. size == 0 — весь элемент. - * Возврат: сколько прочитано, -1 — ошибка. */ -int pop_arc_read(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, uint16_t skip, - uint8_t page, uint16_t off, uint16_t size) __banked; - -void pop_arc_close(pop_arc_t *a) __banked; - -/* Атлас ПРЯМО ИЗ АРХИВА: выделить страницу, вычитать в неё элемент idx и - * отдать libbgi (atlas_attach — проверка магии + подготовка страницы к - * маппингу в W0). Полный эквивалент atlas_load, только источник другой. - * 0 — OK, -1 — ошибка (страница освобождена). */ -int8_t pop_arc_atlas(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, - atlas_t *at) __banked; - -#endif /* POP_ARC_H */ diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c deleted file mode 100644 index d7b1bca..0000000 --- a/applications/PoP/roomtest/pop_bg.c +++ /dev/null @@ -1,1176 +0,0 @@ -/* - * pop_bg.c — ГОРЯЧАЯ половина слоя фона PoP: то, что работает КАЖДЫЙ кадр — - * передний слой поверх персонажей (порт seg003 redraw_at_char + seg008 - * set_char_collision), оверлеи кромки, кладка стены и клип. Полная - * отрисовка комнаты и точечные перерисовки уехали в pop_room.c (банк 7); - * граница реза и её цена расписаны в _pop_bg.h. - * - * Подробности алгоритма кладки — в toolchain/render_room.py и - * memory/pop_background_strategy. Только DUNGEON-стиль (Фаза 1). - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "_pop_bg.h" /* контракт с холодной половиной (pop_room.c, банк 7) */ -#include "pop_tile.h" -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ /* общие листья слоя фона (резидент): блит, тайлы, таблица */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_state.h" -#include "pop_geom.h" -#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */ -#include "pop_kid.h" /* Kid.curr_col/curr_row — порядок оверлеев (см. ниже) */ -#include "pop_cdraw.h" /* pop_cd — габарит кадра Кида (y-порядок плиты) */ -#include "pop_guard.h" /* SWORD_2_DRAWN — расширение футпринта под клинок */ - - -/* Область, куда в этом кадре рисовался ОВЕРЛЕЙ (не футпринт fore, а - * draw_other_overlay/floor_overlay/полоса потолка). Оверлей включается - * только в позах виса/полёта/подъёма и рисует НЕ по прямоугольнику Kid, - * поэтому heal персонажа его следы не убирает: на второй странице дабл-буфера - * остаётся кадр «с оверлеем», и он мерцает через кадр. Копим bbox и - * восстанавливаем фон на ОБЕИХ страницах (pop_fore_heal). */ -static int ov_x0, ov_y0, ov_x1, ov_y1; -static uint8_t ov_pending; /* биты страниц, где надо восстановить фон */ -/* Подавить ov_mark на время серии — для вызывающего, который САМ чистит эту - * область каждый кадр. Так работает падающий кусок: его heal-коридор - * прочёсывается всегда, а оверлей соседа и кромка потолка рисуются ВНУТРИ - * коридора (окно клипа = прямоугольник куска). Без этого объединение ov_mark - * по шести кускам растягивалось на полкомнаты, и pop_fore_heal стоил 187 500 - * такта в фазе «ввод+heal» против 55 000 (замер 2026-08-17). */ -static uint8_t ov_suppress; - -static void ov_mark(int x, int y, int w, int h) -{ - if (ov_suppress) return; - if (!ov_pending) { ov_x0 = x; ov_y0 = y; ov_x1 = x + w; ov_y1 = y + h; } - else { - if (x < ov_x0) ov_x0 = x; - if (y < ov_y0) ov_y0 = y; - if (x + w > ov_x1) ov_x1 = x + w; - if (y + h > ov_y1) ov_y1 = y + h; - } - ov_pending = 3; /* обе страницы */ -} - -void pop_fore_heal(void) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t pg = gfx_get_draw_page() & 1; - if (!(ov_pending & (1 << pg))) return; - pop_heal_off(ov_x0, ov_y0, ov_x1 - ov_x0, ov_y1 - ov_y0); - ov_pending = (uint8_t)(ov_pending & ~(1 << pg)); - /* Восстановленный прямоугольник шире персонажа и запросто накрывает - * СОСЕДА — пометить область (DRAW-COST): heal идёт мимо pop_blit_b. */ - pop_cd_touch(ov_x0, ov_y0 + POP_YOFF, ov_x1 - ov_x0, ov_y1 - ov_y0); -} - - -/* ---- Константные таблицы (render_room.py) -------------------------- */ -static const uint8_t TBL_LINE[3] = {0, 10, 20}; -static const uint8_t DOOR_FRAM_SLICE[9] = {67, 59, 58, 57, 56, 55, 54, 53, 52}; -static const uint8_t SPIKES_FRAM_FORE[10] = {0, 139, 140, 141, 142, 143, 142, 140, 139, 0}; -static const uint8_t LPOS[5] = {58, 41, 37, 20, 16}; -static const uint8_t RPOS[4] = {52, 42, 31, 21}; - -/* Wall (chtab_7) id: делители/блок/марки. */ -#define RES_WALL_RNDBLOCK 13 -#define RES_WALL_DIVIDER1 11 -#define RES_WALL_MARK_TL 14 -#define RES_WALL_MARK_BL 15 -#define RES_WALL_MARK_TR 16 -#define RES_WALL_MARK_BR 17 - -/* ---- PRNG (seg009.c:321, 32-бит LCG) — только на ВХОД в комнату ---- * - * Сид (pop_t_seed) живёт в резиденте: его ставит полная отрисовка комнаты, а - * читает кэш раскладки кладки. */ -#define prandom(maxv) pop_prandom(&pop_t_seed, (maxv)) - -/* Отсев кусков кладки по окну fore-клипа — тела ниже, у wpp_fill. */ -static uint8_t wp_vis(int x, int w, int ytop, int ybot); -static void wp_blit(uint8_t id, int x, int ybot, uint8_t w, uint8_t h); - -/* ---- Декали-марки стен (seg008.c:2041/2056) ------------------------ */ -static void draw_left_mark(uint16_t dv, int arg2, int arg1, int row, int col) -{ - uint8_t image_id = (dv & 1) ? RES_WALL_MARK_BL : RES_WALL_MARK_TL; - int lv2 = 0; - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - if (dv > 3) lv2 = arg1 + 6; - else if (dv > 1) lv2 = arg2 + 6; - wp_blit(image_id, (xh + ((dv == 2 || dv == 3) ? 1 : 0)) * 8 + lv2, - dby - LPOS[dv], 7, 10); /* pop_wall.atl: 16/17 = 7x10 */ -} - -static void draw_right_mark(uint16_t dv, int arg1, int row, int col) -{ - uint8_t image_id = (dv & 1) ? RES_WALL_MARK_BR : RES_WALL_MARK_TR; - int a = (dv < 2) ? 24 : arg1 - 3; - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - wp_blit(image_id, (xh + ((dv > 1) ? 1 : 0)) * 8 + a, - dby - RPOS[dv], 14, 5); /* pop_wall.atl: 14/15 = 14x5 */ -} - -/* ---- wall_pattern (seg008.c:1928, dungeon-ветка) ------------------- */ -/* КЭШ РАСКЛАДКИ КЛАДКИ. Серия prandom для тайла зависит только от - * (комната, ряд, колонка) — пока мы в комнате, это КОНСТАНТА. А - * wall_pattern зовётся из fore-слоя КАЖДЫЙ кадр, и на Z80 это самая - * дорогая вещь в кадре: замер в MAME 2026-07-29 (комната 3) — 18 вызовов - * pop_prandom за один fore-проход, ~10 700 тактов каждый (32-битный LCG: - * __mullong ~8 000 + __moduint), то есть 193 К из 341 К всего прохода при - * бюджете кадра ~430 К. Кэшируем не сид, а ГОТОВЫЕ РЕШЕНИЯ (что рисовать - * и с каким смещением) — тогда в кадре не остаётся ни одного prandom. - * - * Порядок вызовов prandom воспроизведён один в один, включая то, что - * значение метки берётся ТОЛЬКО когда сработало её условие: иначе - * последовательность разъедется и кладка станет другой. which_part=0 - * использует префикс той же серии, поэтому кэш общий. - * - * Упаковка: wp_a = mid_div | mid_off<<1 | bot_div<<4 | bot_off<<5; - * wp_b = rndblk | right<<1 | right_val<<2 | left<<4 | left_val<<5. - * Индекс — (row+1)*10+col, ряды −1..2. */ -#define WP_N 40 -static uint8_t wp_a[WP_N], wp_b[WP_N], wp_ok[WP_N]; - -/* ---- Цвета дворцовой кладки (gen_palace_wall_colors, seg000:1942) ---- * - * Тело стены во дворце — не кирпичи-спрайты, а СПЛОШНЫЕ ЗАЛИВКИ; их цвета - * разыгрываются на КОМНАТУ: сид = номер комнаты, 3 ряда × 4 подряда × 11 - * колонок. Подряды 1 и 3 берут 0x61..0x64, подряды 0 и 2 — 0x66..0x69 - * (это слоты wall-палитры, во дворце они песочные); соседние по горизонтали - * не повторяются. Одиннадцать колонок, а не десять: заливки 3 и 5 берут - * цвет СЛЕДУЮЩЕЙ колонки. - * - * Не static: таблицу читает и холодная половина слоя (pop_room.c, банк 7). - * Writable-данные банка живут в _DATA/W2 и видны отовсюду — в отличие от - * const-таблиц, которые из чужого банка не прочитать. */ -uint8_t pop_pal_wall_col[3 * 44]; - -static void gen_palace_wall_colors(uint8_t room) -{ - pop_rnd_t saved = pop_t_seed; - uint8_t row, sub, col; - uint8_t *p = pop_pal_wall_col; - pop_prandom_set(pop_t_seed, room); - prandom(1); /* сброс, как в оригинале */ - for (row = 0; row < 3; row++) - for (sub = 0; sub < 4; sub++) { - uint8_t base = (uint8_t)((sub & 1) ? 0x61 : 0x66); - uint8_t prev = 0; /* 0 — «цвета ещё не было» */ - for (col = 0; col < 11; col++) { - uint8_t c; - do { c = (uint8_t)(base + prandom(3)); } while (c == prev); - *p++ = c; - prev = c; - } - } - pop_t_seed = saved; -} - -static void wall_pattern_reset(void) /* смена комнаты — сид другой */ -{ - uint8_t i; - for (i = 0; i < WP_N; i++) wp_ok[i] = 0; - if (pop_palace) gen_palace_wall_colors(pop_t_room); -} - -/* Выходы wall_rnd — в файловых статиках: возвращать девять значений - * через указатели на Z80 дороже самой функции. */ -static uint8_t wr_mid_div, wr_mid_off, wr_bot_div, wr_bot_off; -static uint8_t wr_rndblk, wr_right, wr_rightv, wr_left, wr_leftv; - -/* Правила серии prandom по модификатору стены (bg): что вообще есть у этого - * вида кладки и с какими порогами. Столбцы: - * [0] есть «случайный блок» (тогда prandom(4)==0) - * [1] порог условия метки СПРАВА (0 = метки справа нет, prandom не зовётся) - * [2] порог значения метки справа, [3] прибавка к нему - * [4] порог условия метки СЛЕВА (есть у всех четырёх), [5] порог значения - * Порядок строк — по bg: 0 SWS, 1 SWW, 2 WWS, 3 WWW (seg008:1928). */ -static const uint8_t WR_RULE[4][6] = { - {0, 0, 0, 0, 6, 1}, /* SWS: только метка слева */ - {1, 4, 3, 0, 4, 3}, /* SWW */ - {0, 4, 1, 2, 4, 4}, /* WWS: значение справа со сдвигом 2 */ - {1, 4, 3, 0, 4, 4}, /* WWW: полный набор */ -}; - -static void wall_rnd(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Кэшируем только штатную сетку: колонка вне 0..9 дала бы индекс - * соседнего РЯДА и чужую раскладку (тихий баг вместо промаха). */ - int idx = (col >= 0 && col < 10) ? (row + 1) * 10 + col : -1; - uint8_t a, b, bg; - pop_rnd_t saved; - if (idx >= 0 && idx < WP_N && wp_ok[idx]) { - a = wp_a[idx]; b = wp_b[idx]; - wr_mid_div = (uint8_t)(a & 1); wr_mid_off = (uint8_t)((a >> 1) & 7); - wr_bot_div = (uint8_t)((a >> 4) & 1); wr_bot_off = (uint8_t)((a >> 5) & 7); - wr_rndblk = (uint8_t)(b & 1); - wr_right = (uint8_t)((b >> 1) & 1); wr_rightv = (uint8_t)((b >> 2) & 3); - wr_left = (uint8_t)((b >> 4) & 1); wr_leftv = (uint8_t)((b >> 5) & 7); - return; - } - saved = pop_t_seed; - /* Верхняя полоса (row<0): SDLPoP рисует её как ряд 2 комнаты сверху - * (drawn_row=2 для seed, draw_main_y=-1 для позиции) — seed по row 2. */ - pop_prandom_set(pop_t_seed, pop_t_room + TBL_LINE[row < 0 ? 2 : row] + col); - prandom(1); /* сброс */ - wr_mid_div = (uint8_t)prandom(1); - wr_mid_off = (uint8_t)prandom(4); - wr_bot_div = (uint8_t)prandom(1); - wr_bot_off = (uint8_t)prandom(4); - wr_rndblk = wr_right = wr_left = 0; - wr_rightv = wr_leftv = 0; - bg = pop_wall_modifier(row, col); - { /* Четыре ветки bg отличались ТОЛЬКО числами в одной и той же серии - * prandom, поэтому они сведены к правилу (WR_RULE). ПОРЯДОК вызовов - * prandom обязан совпадать с оригиналом дословно, включая то, что - * значение метки берётся ТОЛЬКО когда сработало её условие: иначе - * последовательность разъедется и кладка станет другой. «Нет метки - * справа» = нулевой порог условия — тогда prandom не зовётся вовсе, - * ровно как в ветке SWS. */ - const uint8_t *r = WR_RULE[bg]; - if (r[0]) wr_rndblk = (uint8_t)(prandom(4) == 0); - if (r[1] && prandom(r[1]) == 0) { - wr_right = 1; wr_rightv = (uint8_t)(prandom(r[2]) + r[3]); - } - if (prandom(r[4]) == 0) { wr_left = 1; wr_leftv = (uint8_t)prandom(r[5]); } - } - pop_t_seed = saved; - if (idx >= 0 && idx < WP_N) { - wp_a[idx] = (uint8_t)(wr_mid_div | (wr_mid_off << 1) | - (wr_bot_div << 4) | (wr_bot_off << 5)); - wp_b[idx] = (uint8_t)(wr_rndblk | (wr_right << 1) | (wr_rightv << 2) | - (wr_left << 4) | (wr_leftv << 5)); - wp_ok[idx] = 1; - } -} - -/* ---- wall_pattern (seg008.c:1928, dungeon-ветка) ------------------- * - * Куски кладки одни и те же для всех четырёх видов стены, различается ровно - * НАБОР присутствующих (WP_PARTS) — раньше это были четыре ветки с - * повторяющимся телом. Порядок кусков внутри вызова сохранён: случайный - * блок, средний делитель, нижний делитель, метка справа, метка слева. - * - * which_part == 0 — только нижний делитель (слой draw_tile_bottom), 1 — всё - * остальное (draw_tile_fore). У SWW нижнего делителя нет вовсе, у SWS — - * ничего, кроме метки слева. */ -#define WP_RND 1 -#define WP_MID 2 -#define WP_BOT 4 -#define WP_RIGHT 8 -#define WP_LEFT 16 - -static const uint8_t WP_PARTS[4] = { - WP_LEFT, /* 0 SWS */ - WP_RND | WP_MID | WP_RIGHT | WP_LEFT, /* 1 SWW */ - WP_MID | WP_BOT | WP_RIGHT | WP_LEFT, /* 2 WWS */ - WP_RND | WP_MID | WP_BOT | WP_RIGHT | WP_LEFT, /* 3 WWW */ -}; - -/* ---- Кладка ДВОРЦА (seg008:1946) ------------------------------------ * - * Тело стены — не кирпичи-спрайты, а шесть СПЛОШНЫХ ЗАЛИВОК цветами из - * pop_pal_wall_col, поверх — пять разделителей chtab_7 (mono, цвет 6). - * Геометрия дословно из add_wipetable(layer, left, bottom, height, width): - * прямоугольник = x..x+width-1, (bottom-height+1)..bottom. - * - * Порядок prandom важен так же, как в подземелье: при which_part == 0 - * разыгрывается ОДНО значение, и нижний разделитель берёт ПЕРВОЕ из серии, - * а не пятое. */ -static uint8_t wpp_d[5]; /* пять prandom(2), 0..2 */ - -static void wall_rnd_palace(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int idx = (col >= 0 && col < 10) ? (row + 1) * 10 + col : -1; - pop_rnd_t saved; - uint8_t i; - if (idx >= 0 && idx < WP_N && wp_ok[idx]) { - uint8_t a = wp_a[idx]; - wpp_d[0] = (uint8_t)(a & 3); wpp_d[1] = (uint8_t)((a >> 2) & 3); - wpp_d[2] = (uint8_t)((a >> 4) & 3); wpp_d[3] = (uint8_t)((a >> 6) & 3); - wpp_d[4] = wp_b[idx]; - return; - } - saved = pop_t_seed; - pop_prandom_set(pop_t_seed, pop_t_room + TBL_LINE[row < 0 ? 2 : row] + col); - prandom(1); /* сброс */ - for (i = 0; i < 5; i++) wpp_d[i] = (uint8_t)prandom(2); - pop_t_seed = saved; - if (idx >= 0 && idx < WP_N) { - wp_a[idx] = (uint8_t)(wpp_d[0] | (wpp_d[1] << 2) | - (wpp_d[2] << 4) | (wpp_d[3] << 6)); - wp_b[idx] = wpp_d[4]; - wp_ok[idx] = 1; - } -} - -/* Прямоугольник [x, x+w) x [ytop, ybot] задевает окно fore-клипа? Клипа - * нет — задевает всегда. Координаты сюда приходят посчитанными ИЗ РЯДА - * (63*row + …), то есть логические — значит и рамка нужна логическая - * (pop_tile.h, пара fclip_l*): переворот применяется позже, при блите. */ -static uint8_t wp_vis(int x, int w, int ytop, int ybot) -{ - if (!pop_t_fclip_on) return 1; - return (uint8_t)(x < pop_t_fclip_x1 && x + w > pop_t_fclip_x0 && - ytop < pop_t_fclip_ly1 && ybot >= pop_t_fclip_ly0); -} - -/* Декаль кладки: ybot — БЕЗ POP_YOFF (как ждёт pop_wall_b), w/h — реальный - * габарит куска. Размеры взяты из каталогов атласов (pal_wall.atl / - * pop_wall.atl) и заданы верхней границей по группе, поэтому промахнуться в - * меньшую сторону нельзя: хуже отсева не будет, лишнего не сотрём. - * - * Зачем: pop_blit_b тоже отсеивает до маппинга страницы, но по ЗАВЕДОМО - * большему габариту 64x64 — куски кладки высотой 3..12 px он пропускает и - * платит полный atlas_image + gfx_w0_map + чтение w/h (~9 760 тактов на - * блит), чтобы там обнаружить, что рисовать нечего. Пять таких блитов на - * тайл — 48 500 тактов в никуда (docs/perf_backlog.md, пункт 0 шаг 2). */ -static void wp_blit(uint8_t id, int x, int ybot, uint8_t w, uint8_t h) -{ - int yb = ybot + POP_YOFF; - if (!wp_vis(x, (int)w, yb - (int)h + 1, yb)) return; - pop_wall_b(id, x, ybot); -} - -/* Заливка куска стены. x/ytop — уже ЭКРАННЫЕ (с POP_YOFF). В fore-проходе - * режем по окну клипа: без этого заливка легла бы поверх областей, которые - * в этом кадре никто не восстанавливает. */ -static void wpp_fill(int x, int ytop, int w, int h, uint8_t colour) -{ - int x2 = x + w - 1, y2 = ytop + h - 1; - if (pop_t_fclip_on) { - if (x < pop_t_fclip_x0) x = pop_t_fclip_x0; - if (ytop < pop_t_fclip_ly0) ytop = pop_t_fclip_ly0; - if (x2 >= pop_t_fclip_x1) x2 = pop_t_fclip_x1 - 1; - if (y2 >= pop_t_fclip_ly1) y2 = pop_t_fclip_ly1 - 1; /* клип ДО переворота */ - } - if (pop_t_clip_top && ytop < pop_t_clip_top) ytop = pop_t_clip_top; - if (x < 0) x = 0; - if (ytop < 0) ytop = 0; - if (x2 > 319) x2 = 319; - if (y2 > 255) y2 = 255; - if (x2 < x || y2 < ytop) return; - /* ПЕРЕВОРОТ: заливка — такой же кусок фона, как блит тайла, и обязана - * отражаться той же формулой (иначе полоса ложится в неотражённое - * место — так ломались решётка и чомперы). */ - if (pop_upside) { - int h = y2 - ytop + 1; - ytop = POP_FLIP_TOP(ytop, h); - y2 = ytop + h - 1; - } - setfillstyle(SOLID_FILL, colour); - bar(x, ytop, x2, y2); - if (!pop_t_fclip_on) pop_cd_touch(x, ytop, x2 - x + 1, y2 - ytop + 1); -} - -static void wall_pattern_palace(int row, int col, int which_part) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int xh = POP_COL_XH[col]; - int dbys = 63 * row + 65; /* база БЕЗ POP_YOFF — для блитов */ - int dmys = dbys - 3; - int dby = dbys + POP_YOFF, dmy = dmys + POP_YOFF; /* экранные — для заливок */ - /* РАННИЙ ВЫХОД по окну fore-клипа. Весь узор лежит в прямоугольнике - * x [xh*8, xh*8+32), y [dmy-59, dby]: сверху — первая заливка, снизу — - * нижний декаль, чей низ ровно на dby. - * - * Без этой проверки тайл стены под ногами Кида стоил ~60 000 тактов НА - * НОЛЬ ПИКСЕЛЕЙ: предфильтр fore_tile грубый (габарит 40x78), wpp_fill - * честно режет по окну, но платит ~3 100 тактов за арифметику клипа, а - * pop_wall_b об окне не знает вовсе и идёт в atlas_image + gfx_w0_map, - * чтобы там обнаружить, что рисовать нечего. Два таких тайла (ряд 2 под - * Кидом попадает в fore-окно всегда) = 139 863 такта за кадр, 32 % - * растрового кадра. См. docs/perf_backlog.md, пункт 0. */ - if (pop_t_fclip_on) { - int x0 = xh * 8; - if (x0 >= pop_t_fclip_x1 || x0 + 32 <= pop_t_fclip_x0 || - dmy - 59 >= pop_t_fclip_ly1 || dby + 1 <= pop_t_fclip_ly0) - return; - } - /* Цвета лежат по рядам 0..2; полоса у потолка (row −1) — это ряд 2 - * комнаты сверху, оригинал и сид для неё берёт по ряду 2. */ - const uint8_t *cl = pop_pal_wall_col + 44 * (row < 0 ? 2 : row) + col; - wall_rnd_palace(row, col); - if (which_part) { - wpp_fill(xh * 8, dmy - 59, 32, 20, cl[0]); - wpp_fill(xh * 8, dmy - 39, 16, 21, cl[11]); - wpp_fill((xh + 2) * 8, dmy - 39, 16, 21, cl[12]); - wpp_fill(xh * 8, dmy - 18, 8, 19, cl[22]); - wpp_fill((xh + 1) * 8, dmy - 18, 24, 19, cl[23]); - /* Габариты групп из pal_wall.atl: 3..5 = 8x7, 6..8 = 32x12, - * 9..11 = 32x12 (11-й 28x11), 12..14 = 30x5 (14-й 30x4), - * 15..17 = 32x3. Берём максимум по группе. */ - wp_blit((uint8_t)(wpp_d[0] + 3), (xh + 3) * 8, dmys - 53, 8, 7); - wp_blit((uint8_t)(wpp_d[1] + 6), xh * 8, dmys - 34, 32, 12); - wp_blit((uint8_t)(wpp_d[2] + 9), xh * 8, dmys - 13, 32, 12); - wp_blit((uint8_t)(wpp_d[3] + 12), xh * 8, dmys, 30, 5); - } - wpp_fill(xh * 8, dby - 2, 32, 3, cl[33]); - wp_blit((uint8_t)((which_part ? wpp_d[4] : wpp_d[0]) + 15), xh * 8, dbys, 32, 3); -} - -static void wall_pattern(int row, int col, int which_part) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - uint8_t parts; - if (pop_palace) { wall_pattern_palace(row, col, which_part); return; } - /* Ранний выход по окну fore-клипа — то же, что у паласной ветки, но свой - * габарит. Самый верхний кусок здесь — ЛЕВАЯ марка: LPOS[4] = 58 плюс её - * высота 10, то есть dby+POP_YOFF−67; самый нижний — нижний разделитель, - * низ ровно на dby+POP_YOFF. По x правая марка уходит до xh*8+46 - * (a = 24 при dv<2, ширина 14), берём 48. */ - { - int x0 = xh * 8, dbs = dby + POP_YOFF; - if (!wp_vis(x0, 48, dbs - 67, dbs)) return; - } - parts = WP_PARTS[pop_wall_modifier(row, col)]; - - wall_rnd(row, col); - if (which_part) { - /* Габариты из pop_wall.atl: 13 = 32x21, 11/12 = 9x21. */ - if ((parts & WP_RND) && wr_rndblk) - wp_blit(RES_WALL_RNDBLOCK, xh * 8, dby - 42, 32, 21); - if (parts & WP_MID) - wp_blit((uint8_t)(RES_WALL_DIVIDER1 + wr_mid_div), - (xh + 1) * 8 + wr_mid_off, dby - 21, 9, 21); - } - if (parts & WP_BOT) - wp_blit((uint8_t)(RES_WALL_DIVIDER1 + wr_bot_div), - xh * 8 + wr_bot_off, dby, 9, 21); - if (which_part) { - if ((parts & WP_RIGHT) && wr_right) - draw_right_mark(wr_rightv, wr_mid_off, row, col); - if ((parts & WP_LEFT) && wr_left) - draw_left_mark(wr_leftv, wr_mid_off - wr_mid_div, - wr_bot_off - wr_bot_div, row, col); - } -} - -/* Решётка ворот (portcullis) из ЛЕВОЙ комнаты (seg008.c:1110). */ -static void draw_gate_back(uint8_t modl, int xh, int dby, int dmy) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = xh * 8; - int gate_top_y = dby - 62; - int openness = (((modl > 188) ? 188 : modl) >> 2) + 1; - int gate_bot_y = dmy - openness; - int yb, gate_frame; - - if (gate_bot_y + 12 < dmy) - pop_env_b(50, x, gate_bot_y); - else - pop_env_b(51, x, gate_bot_y - 2); - yb = gate_bot_y - 12; - if (yb < 192) { - while (yb >= 0 && yb > 7 && (yb - 7) > gate_top_y) { - pop_env_b(52, x, yb); - yb -= 8; - } - } - gate_frame = yb - gate_top_y + 1; - if (gate_frame > 0 && gate_frame < 9) - pop_env_b(DOOR_FRAM_SLICE[gate_frame], x, yb); -} - -/* Та же решётка, но в ПЕРЕДНИЙ слой — поверх персонажа, стоящего в проёме - * (draw_gate_fore, seg008:1153). От back-варианта отличается ровно тем, что - * есть в оригинале: только ПРОЗРАЧНЫЕ куски (51 низ + 52 восьмипиксельные - * ломти), без непрозрачного 50 и без хвостового DOOR_FRAM_SLICE — фон под - * баррами уже нарисован, здесь возвращаются только сами прутья. - * Клип по прямоугольнику персонажа делает pop_t_fclip (см. pop_tile.h). */ -static void draw_gate_fore(uint8_t modl, int xh, int dby, int dmy) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = xh * 8; - int gate_top_y = dby - 62; - int openness = (((modl > 188) ? 188 : modl) >> 2) + 1; - int gate_bot_y = dmy - openness; - int yb; - - pop_env_b(51, x, gate_bot_y - 2); - yb = gate_bot_y - 12; - if (yb < 192) - while (yb >= 0 && yb > 7 && (yb - 7) > gate_top_y) { - pop_env_b(52, x, yb); - yb -= 8; - } -} - - - - -/* ---- Точки входа для ХОЛОДНОЙ половины (pop_room.c, банк 7) ---------- * - * Тонкие обёртки, а не пометка самих тел `__banked`: трамплин выбирается - * ОБЪЯВЛЕНИЕМ, поэтому пометка тела заставила бы платить 654 такта и - * ГОРЯЧИХ вызывающих — fore-проход зовёт wall_pattern до девяти раз за кадр. - * С обёрткой горячий путь идёт прямым call, а трамплин достаётся только - * холодному (полная отрисовка комнаты: ~40 вызовов, 26 000 тактов РАЗОВО на - * вход в комнату). См. _pop_bg.h и memory/sdcc_banked_call_rules. */ -void pop_wall_pattern_b(int row, int col, int which_part) __banked -{ - wall_pattern(row, col, which_part); -} - -void pop_wall_pattern_reset_b(void) __banked -{ - wall_pattern_reset(); -} - -void pop_gate_back_b(uint8_t modl, int xh, int dby, int dmy) __banked -{ - draw_gate_back(modl, xh, dby, dmy); -} - -/* ---- fore-over-Kid (порт seg003 redraw_at_char + seg008 set_char_collision) -- - * Передний слой (fore_id = foretable-кусок) тайлов ФУТПРИНТА спрайта Kid - * — рядов top..bottom × колонок left..right (<= 2×2 = 4 тайла) — рисуется - * ПОВЕРХ Kid: то, что по изометрии перед ним (передние грани колонн/ворот/ - * большой колонны/щебня). Стены и факелы имеют fore_id=0 → остаются сзади. - * Рисуем в GFX_BANK_SPRITE (видео-ОЗУ, 0xFF прозрачен); heal персонажа восстановит - * из теневого фона (fore в нём уже запечён pop_room_draw). obj_x — ЛОГИЧЕСКАЯ - * X кадра Kid (до ×8/7), obj_y — низ спрайта, w/h — размер, dir — направление. */ -static int8_t col_from_x(int xpos) /* get_tile_div_mod: колонка (58/14) */ -{ - /* Таблицей (резидентная POP_TILE_DIV, см. pop_tile.h) — как в оригинале. - * Было `/14` и `%14`: два полноценных 16-битных деления SDCC на вызов, - * а зовётся это дважды на каждый футпринт персонажа. */ - if ((unsigned int)xpos < 256u) return POP_TILE_DIV[xpos]; - { - int x = xpos - 58; - int xh = x / 14; - if (x % 14 < 0) xh--; /* округление вниз для отрицательных */ - return (int8_t)xh; - } -} - -#define y_to_row(y) pop_y_to_row((int16_t)(y)) /* общий (pop_geom) */ - -/* Контекст ТЕКУЩЕГО тайла прохода: код, левый край, база Y. Порт глобалов - * оригинала (curr_tile / draw_xh / draw_main_y, которые load_curr_and_left_tile - * ставит ОДИН раз на тайл, seg008 redraw_needed_tiles) — все рисовальщики - * читают их, а не считают заново. У нас код тайла читался дважды за тайл - * (в fore_tile и снова тут), а координаты — в каждом листе. */ -static uint8_t ft_code; -static int ft_x, ft_dmy; - -/* Есть ли у кода тайла ХОТЬ ЧТО-ТО в переднем слое. Порт ранней проверки - * оригинала — `id = tile_table[curr_tile].fore_id; if (id == 0) return;` - * в начале ветки default у draw_tile_fore (seg008:0D15), — расширенной - * нашими спецслучаями: стена (20), пики (2), чомпер (0x12) и нижняя грань - * loose (11) рисуются мимо fore_id. - * - * Была в самом КОНЦЕ цепочки: до неё успевали отработать чтение кода тайла - * и все сравнения спецслучаев. Замер в MAME: fore-проход стоил 58 764 такта - * ради одного блита 10×2, а в позиции без переднего слоя — 112 758 тактов - * и ноль блитов. */ -static const uint8_t FORE_ANY[32] = { -/* 00 empty */ 0, /* 01 floor */ 0, /* 02 spike */ 1, /* 03 pillar */ 1, -/* 04 gate */ 1, /* 05 stuck */ 0, /* 06 closebtn */ 0, /* 07 doortopf */ 1, -/* 08 bpbot */ 1, /* 09 bptop */ 1, /* 0A potion */ 1, /* 0B loose */ 1, -/* 0C dtop */ 1, /* 0D mirror */ 1, /* 0E debris */ 1, /* 0F openbtn */ 0, -/* 10 ldL */ 0, /* 11 ldR */ 0, /* 12 chomper */ 1, /* 13 torch */ 0, -/* 14 wall */ 1, /* 15 skeleton */ 0, /* 16 sword */ 0, /* 17 balcL */ 0, -/* 18 balcR */ 0, /* 19 lattpil */ 1, /* 1A lattdown */ 1, /* 1B lattsm */ 1, -/* 1C lattl */ 1, /* 1D lattr */ 1, /* 1E debristo */ 1, /* 1F — */ 0 -}; - -/* Контекст ft_* обязан быть проставлен вызывающим. */ -static void fore_only_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Нажатая кнопка → пол/stuck (get_tile_to_draw) — это уже учтено в ft_code - * (его ставит pop_tile_code_drawn), иначе поверх Kid лезет передняя грань - * КНОПКИ. */ - uint8_t code = ft_code; - const piece *t; - int x = ft_x, dmy = ft_dmy; - if (!FORE_ANY[code]) return; /* ранний выход, как в оригинале */ - t = &pop_tile_table[code]; - if (code == 20) { - /* Во дворце тело стены даёт wall_pattern заливками, а спрайтовая - * грань не рисуется вовсе (seg008:711). */ - if (!pop_palace) - pop_wall_b(POP_WALL_FRAM_MAIN[pop_wall_modifier(row, col)], x, dmy); - wall_pattern(row, col, 1); - return; - } - if (code == 2) { /* пики: fore-кадр */ - uint8_t sf = pop_spike_frame(pop_tile_mod(row, col)); - if (sf > 0 && sf < 10 && SPIKES_FRAM_FORE[sf]) - pop_env_b(SPIKES_FRAM_FORE[sf], x, dmy - 2); - } - if (code == 0x12) { /* чомпер: передний слой челюстей */ - uint8_t cm = pop_tile_mod(row, col); - uint8_t pose = pop_chomp_pose(cm); - /* Передние куски чомпера и его кровь лежат в pop_fore.atl - * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит - * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ - pop_fore_b(POP_CHOMP_FRAM_FOR[pose], x, dmy); - if (cm & 0x80) /* кровь поверх переднего слоя */ - pop_fore_b((uint8_t)(pose + 119), x + 8, dmy - 6); - } - if (code == 10) { /* зелье: склянка (пузырёк — динамика) */ - pop_potion_flask(row, col, pop_tile_mod(row, col)); - } else if (t->fore_id) { - pop_fore_b(t->fore_id, t->fore_x * 8 + x, t->fore_y + dmy); - } -} - -/* Полоса кладки У ПОТОЛКА поверх Kid — порт redraw_needed_above (seg008:0221). - * Там draw_tile_bottom(1) и draw_loose(1): аргумент 1 = «добавить ещё и в - * FOREtable», т.е. нижняя грань потолка и кадр плиты-потолка рисуются ПОВЕРХ - * персонажа (иначе руки прыгающего Kid лезут на кромку потолка). Всё - * остальное из этой функции (floorright, anim_topright, right) идёт в - * backtable — под персонажем. */ -static void ceil_over_kid_tile(int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code = pop_tile_code(-1, col); - const piece *t = &pop_tile_table[code]; - int x = POP_COL_XH[col] * 8; - int dby = 63 * (-1) + 65; /* = 2 */ - if (code == 20) { /* draw_tile_bottom: стена */ - if (!pop_palace) /* seg008:576 */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[pop_wall_modifier(-1, col)], x, dby); - /* wall_pattern ЗДЕСЬ НЕТ — и это не упущение. draw_tile_bottom - * (seg008:588) кладёт в foretable ТОЛЬКО кадр грани `id`, под своим - * `arg_0`; узор вызывается строкой ниже, вне этой ветки, и уходит в - * текущую таблицу, то есть в ФОН. Мы же звали его прямо в переднем - * проходе — узор задней стены штамповался поверх всего, что уже - * нарисовано, включая падающие плиты (найдено прогоном 2026-08-13). - * В фон он попадает там, где и положено, — при отрисовке тайла. - * - * Не путать с fore_only_tile: там узор в переднем слое ЗАКОННЫЙ, - * это порт draw_tile_fore (seg008:715), где он стоит явно рядом с - * главной гранью стены, обязанной перекрывать персонажа. */ - } else if (t->bottom_id) { - pop_env_b(t->bottom_id, x, dby); - } - if (code == 11) /* draw_loose(1): плита-потолок */ - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(pop_ceil_modif[col])], x, dby); - ft_code = pop_tile_code_drawn(-1, col); /* контекст тайла для листа */ - ft_x = x; ft_dmy = 63 * (-1) + 62; - fore_only_tile(-1, col); /* draw_tile_fore */ -} - -/* Пересекается ли габарит тайла с окном fore-слоя. Шаг тайла — 32 px - * (POP_COL_XH[col]*8 = col*32), куски выходят вправо максимум на +8 (дивайдеры - * и метки рисуются в ячейке правого соседа) и вверх на 42+высота кадра. - * Даёт отсев ЦЕЛОГО тайла ДО обращения к атласу: спрайт 27..40 px шириной - * задевает не все тайлы футпринта, а платили за каждый (atlas_image + - * gfx_w0_map + разбор заголовка на КАЖДЫЙ кусок). */ -static uint8_t tile_in_fclip(int row, int col) -{ - int x0, y0; - if (!pop_t_fclip_on) return 1; - x0 = POP_COL_XH[col] * 8; - y0 = POP_YOFF + 63 * row; - /* По ЛОГИЧЕСКОЙ рамке: y0 тайла считается из его ряда и переворотом не - * меняется (см. pop_tile.h про пару fclip_l*). */ - return (uint8_t)(x0 < pop_t_fclip_x1 && x0 + 40 > pop_t_fclip_x0 && - y0 - 8 < pop_t_fclip_ly1 && y0 + 70 > pop_t_fclip_ly0); -} - -static void fore_tile(int row, int col) /* передний слой одного тайла */ -{ - pop_dbg_rdmax[1]++; /* ВРЕМЕННО: сколько тайлов обошли */ - if (!tile_in_fclip(row, col)) return; - pop_dbg_rdmax[2]++; /* ВРЕМЕННО: прошли окно клипа */ - /* draw_loose (seg008:0A38) — единственный кусок ТАЙЛА, который оригинал - * кладёт В ОБЕ таблицы БЕЗУСЛОВНО: нижняя грань loose-плиты идёт и в - * backtable, и в foretable. Значит передняя грань плиты рисуется ПОВЕРХ - * персонажа ВСЕГДА, а не только у потолка (ceil_over_kid_tile). Верх - * плиты (draw_tile_base) остаётся в backtable — поэтому голова и руки - * висящего/подтягивающегося Kid видны НАД плитой, а тело уходит ЗА неё. - * Без этого Kid лез на плиту «с переднего края» (комната 12: вис на - * кромке loose над дырой от соседней упавшей плиты). */ - ft_code = pop_tile_code_drawn(row, col); /* код тайла — ОДИН раз на тайл */ - if (!FORE_ANY[ft_code]) return; /* нечего класть в передний слой */ - pop_dbg_rdmax[3]++; /* ВРЕМЕННО: реально рисуем */ - ft_x = POP_COL_XH[col] * 8; - ft_dmy = 63 * row + 62; - if (row >= 0 && ft_code == 11) - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(pop_loose_modif[row * 10 + col])], - ft_x, ft_dmy + 3); - /* draw_tile_fore (seg008:690) — ТОЛЬКО add_foretable-часть. Раньше здесь - * рисовалась ещё и передняя кромка пола (bottom_id) «чтобы перекрывала - * Kid», но в оригинале bottom идёт через draw_tile_bottom в backtable - * (под персонажем), а поверх него попадает лишь при draw_other_overlay. - * Из-за лишнего bottom у основания колонны проскакивала «тень». */ - fore_only_tile(row, col); -} - -/* Определение общих с pop_room.c obj-координат (объявление — _pop_bg.h). */ -int8_t pop_bg_obj_col, pop_bg_obj_row; - -/* Пол-оверлей при подъёме (draw_floor_overlay, seg008:1457): когда Kid - * подтягивается на floor-подобный тайл назначения (floor/pillar/stuck/torch), - * а тайл СЛЕВА пуст (т.е. кромка), передний край пола перекрывает нижнюю - * часть Kid — иначе видна часть, что должна быть за полом. Кадр подъёма - * 137..144 индексирует floor_left_overlay. */ -static const uint8_t FLOOR_LEFT_OVERLAY[8] = {32, 151, 151, 150, 150, 151, 32, 32}; - -static void other_overlay_tile(int row, int col); /* fwd (draw_floor_overlay -> else) */ - -static void climb_overlay_tile(int row, int col, uint8_t fidx) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* тип — ПОДСТАВЛЕННЫЙ (нажатая кнопка = пол): иначе кромка, за которую - * Kid спускается/подтягивается, закрашивается целым тайлом */ - uint8_t code; - if (!tile_in_fclip(row, col)) return; - code = pop_tile_code_drawn(row, col); - int x, dmy, dby; - const piece *t; - if (pop_tile_code(row, col - 1) != 0) return; /* слева не пусто → не кромка */ - if (code != 1 && code != 3 && code != 5 && code != 19) { - /* seg008:1E3A draw_floor_overlay: floor-оверлей рисуется только для - * floor/pillar/stuck/torch, а для ОСТАЛЬНЫХ тайлов вызывается - * draw_other_overlay() — иначе кнопка (opener/closer), за кромку - * которой Kid спускается, не перекрывает его. */ - other_overlay_tile(row, col); - return; - } - x = POP_COL_XH[col] * 8; - dmy = 63 * row + 62; - dby = dmy + 3; - t = &pop_tile_table[code]; - ov_mark(x, 63 * row + 2, 64, 64); - pop_env_b(FLOOR_LEFT_OVERLAY[fidx], x, dmy + (code == 5 ? 1 : 0)); - if (t->bottom_id) pop_env_b(t->bottom_id, x, dby); /* draw_tile_bottom */ -} - - -/* draw_tile2 (seg008:1F48) — но ТОЛЬКО та его часть, что реально может лечь - * ПОВЕРХ персонажа. Ключ (подтверждено трассой оригинала): draw_tile_right, - * draw_tile_anim_right и draw_loose добавляют спрайты через add_backtable - * НАПРЯМУЮ, игнорируя ptr_add_table — значит правая грань левого соседа - * («шахматка» столба 93, blueline, грани пик/loose соседа, кадр loose) - * ВСЕГДА рисуется ПОД персонажем. Через ptr_add_table (→ midtable при - * draw_other_overlay) идут только: «floor B» 42 при левом соседе-поле, - * draw_tile_base, draw_tile_anim (свои пики) и draw_tile_bottom. */ -static void overlay_mid_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code = pop_tile_code_drawn(row, col); - uint8_t lcode = pop_tile_code_drawn(row, col - 1); - const piece *t; - int x = POP_COL_XH[col] * 8; - int dby = 63 * row + 65; - int dmy = dby - 3; - t = &pop_tile_table[code]; - ov_mark(x, 63 * row + 2, 64, 64); /* тайл + правый сосед (грани) */ - if (code != 20 && lcode == 1) /* draw_tile_right: только 42 */ - pop_env_b(42, x, pop_tile_table[1].right_y + dmy); - { /* draw_tile_base (seg008:0A8E) — ЦЕЛИКОМ, вместе с подстановками id: - * у loose верх плиты берётся из loose_fram_left (в pop_tile_table base_id=0), - * у opener'а без пола слева — 148. Раньше здесь стоял голый base_id, и - * верх loose-плиты в оверлей не попадал: передняя грань ложилась поверх - * Kid (foretable), а сама плита — нет, и подтягивающийся Kid рисовался - * поверх её верхней плоскости (комната 12). */ - uint8_t base_id = t->base_id; - if (code == 11 && row >= 0) - base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[row * 10 + col])]; - else if (code == 0x0F && lcode == 0) - base_id = 148; - if (base_id) - pop_env_b(base_id, x, t->base_y + dmy); - } - if (code == 2) { /* draw_tile_anim: свои пики */ - uint8_t sf = pop_spike_frame(pop_tile_mod(row, col)); - if (sf > 0 && sf < 10 && POP_SPIKES_FRAM_LEFT[sf]) - pop_env_b(POP_SPIKES_FRAM_LEFT[sf], x, dmy - 2); - } - if (code == 20) { /* draw_tile_bottom */ - uint8_t wmod = pop_wall_modifier(row, col); - if (!pop_palace) /* seg008:576 */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[wmod], x, dby); - wall_pattern(row, col, 0); - } else if (t->bottom_id) { - pop_env_b(t->bottom_id, x, dby); - } - /* draw_loose тут НЕТ, и это не забывчивость: в оригинале (seg008 - * draw_loose) нижняя грань плиты идёт в add_backtable + add_foretable, - * мимо ptr_add_table — то есть в midtable не попадает никогда. Перекрыть - * ею падающий кусок должен ПЕРЕДНИЙ слой (fore_only_tile), а не оверлей. */ -} - -/* draw_tile_fore (seg008:690) — ТОЛЬКО передний слой (add_foretable): он - * рисуется после всего и поверх персонажа. Нужен для полосы кладки у - * потолка: в redraw_needed_above всё остальное идёт в backtable (под Kid). */ - -/* draw_other_overlay (seg008:1492): для поз виса/прыжка/падения/захвата на - * КРОМКЕ (сосед слева пуст, либо тайл через один слева пуст) — перерисовать - * ВЕСЬ тайл поверх Kid. Тело пола перекрывает висящего/прыгающего/падающего - * ПОД ним. Срабатывает только в этих позах (см. redraw_at_char2 ниже) — - * поэтому при стоянии/залезании ложной окклюзии нет. - * - * ПОРЯДОК (redraw_needed_tiles, seg008:1B06 + redraw_needed, seg008:0211): - * тайлы обходятся ряды 2,1,0, внутри ряда колонки 0..9; в тайле сначала - * оверлей (redraw_frames2 -> midtable), потом ОБЪЕКТЫ этого тайла. Kid — тоже - * запись midtable, вставляемая при обработке СВОЕГО тайла (obj_row/obj_col). - * Значит оверлей ложится ПОВЕРХ Kid только у тайлов, идущих в обходе ПОЗЖЕ - * его собственного; всё, что раньше, — под ним. У нас списков нет (рисуем - * сразу), поэтому порядок эмулируется явной проверкой. */ -static void other_overlay_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code, left; - if (!tile_in_fclip(row, col)) return; - code = pop_tile_code(row, col); - /* Пустой тайл НЕ окклюдирует: у него нет тела пола/стены, а draw_tile для - * него рисует лишь ФОНОВУЮ сетку (BLUELINE «силуэт кладки» — правая грань - * пустого соседа). В оригинале она уходит в y-сортируемый midtable и - * ложится ПОЗАДИ Kid; у нас draw_tile кладёт её прямо поверх → сетка на - * висящем/падающем Kid. Фон запечён один раз в pop_room_draw — над - * спрайтом его перерисовывать не нужно. */ - if (code == 0) return; - /* Тайл идёт в обходе РАНЬШЕ тайла Kid → его оверлей лёг бы ПОД спрайт. */ - if (row > pop_bg_obj_row || (row == pop_bg_obj_row && col <= pop_bg_obj_col)) return; - left = pop_tile_code(row, col - 1); - if (left == 0) { overlay_mid_tile(row, col); return; } /* ветка 1: сосед слева пуст */ - if (col > 0 && pop_tile_code(row, col - 2) == 0) { - /* Ветка 2 (тайл ЧЕРЕЗ ОДИН слева пуст): в оригинале она ставит - * tile_object_redraw[tilepos]=0xFF, т.е. объекты тайлов tilepos−1 и - * tilepos рисуются СРАЗУ ПОСЛЕ оверлея — Kid возвращается наверх. - * Без этого правая грань соседнего столба (кадр 93) остаётся поверх - * прыгающего Kid (баг «тень на дальнем столбе поверх Кида»). */ - if (row == pop_bg_obj_row && (col == pop_bg_obj_col + 1)) return; - overlay_mid_tile(row, col); - } -} - -/* Оверлей тайла ПОВЕРХ ПАДАЮЩЕГО КУСКА — вторая половина draw_mob - * (seg007:1149: set_redraw2 рядом с set_redraw_fore). set_redraw2 ведёт в - * draw_other_overlay, а тот кладёт части соседа в MIDtable - * (ptr_add_table = &add_midtable, seg008:1507/1512), тогда как кусок сидит в - * objtable, который вливается в midtable при обходе СВОЕГО тайла. Обход идёт - * ряды 2,1,0, колонки 0..9 — значит сосед перекрывает кусок, если его тайл - * идёт в обходе ПОЗЖЕ, и весь порядок уже проверяется внутри - * other_overlay_tile; ему нужен лишь ориентир «тайл объекта». - * - * Именно этой половины и не хватало: плита, отвалившаяся от (0,2), накрывала - * собой переднюю кромку пола (0,3) — а вернуть её через ПЕРЕДНИЙ слой нельзя, - * у кнопки fore_id = 0 (сверено с tile_table оригинала, там то же самое). - * Найдено пользователем 2026-08-17, уровень 1 комната 12. - * - * Ориентир сохраняем и возвращаем: pop_bg_obj_* принадлежит текущему - * персонажу, и его читает ещё и mob_tick_one (решение defer). */ -void pop_mob_overlay_tile(int row, int col, int8_t oref_row, int8_t oref_col, - int mx, int my, uint8_t mh) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int8_t saved_row = pop_bg_obj_row, saved_col = pop_bg_obj_col; - pop_bg_obj_row = oref_row; - pop_bg_obj_col = oref_col; - /* ОКНО = прямоугольник самого КУСКА. Смысл оверлея — перекрыть кусок, а - * то, что лежит вне него, и так нарисовано правильным фоном. Даёт сразу - * три вещи: - * - рисуем в разы меньше пикселей (тайл соседа шириной 32 обрезается до - * перекрытия с куском); - * - куски тайла, вовсе не задевающие кусок, отсеиваются предфильтром - * pop_blit_b даром — это и есть вертикальный гейт, отдельного не надо; - * - ov_mark становится НЕ НУЖЕН: всё нарисованное внутри heal-коридора - * куска, а он чистится каждый кадр. - * Замер 2026-08-17: без окна оверлеи шести кусков давали +210 000 в циане - * и +130 000 в «ввод+heal» (объединение ov_mark на полкомнаты). */ - ov_suppress = 1; - pop_t_win_set(mx, my - (int)mh + 1 + POP_YOFF, 64, (uint8_t)(mh + 1)); - gfx_set_bank(GFX_BANK_SPRITE); - other_overlay_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); - pop_t_win_clear(); - ov_suppress = 0; - pop_bg_obj_row = saved_row; - pop_bg_obj_col = saved_col; -} - -/* Футпринт персонажа в тайлах (порт set_char_collision, seg006:0723). - * Общий счёт для любого Char (Кид, страж, скелет) — в оригинале это один - * код на всех. Результат — в файловых статиках, а не через 6 указателей: на Z80 такой - * возврат стоил бы дороже самой функции. */ -static int8_t fp_cL, fp_cR, fp_cLraw, fp_rT, fp_rB, fp_rTraw; - -static void char_footprint(int obj_x, int obj_y, uint16_t w, uint16_t h, - int8_t dir, uint8_t sword) -{ - int wh = (int)((w + 1) >> 1); /* char_width_half */ - int xl = obj_x / 2 + 58; /* char_x_left (58-база) */ - int xr; - int8_t cL, cR, cLraw, rT, rB, rTraw; - if (dir >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; - cLraw = col_from_x(xl); /* до клампа: <0 = футпринт за левым швом */ - cL = cLraw; if (cL < 0) cL = 0; else if (cL > 9) cL = 9; - cR = col_from_x(xr); if (cR < 0) cR = 0; else if (cR > 9) cR = 9; - /* redraw_at_char (seg003:0430): «If char is holding sword, it makes - * redraw-area bigger» — КЛИНОК торчит на колонку дальше габарита кадра, - * и без этого расширения передние грани в той колонке не - * перерисовываются: меч остаётся поверх столба, а его след — на фоне. */ - if (sword >= SWORD_2_DRAWN) { - if (dir >= 0) { if (++cR > 9) cR = 9; } - else { if (--cL < 0) cL = 0; } - } - /* Порт set_char_collision (seg006:0723): нижний ряд = y_to_row_mod4(obj_y), - * причём обёртка -1 (Kid НИЖЕ комнаты — climbdown/провал, obj_y в полосе - * «ряд 3») трактуется как ряд 3, НЕ ряд 0. Верхний ряд считается от - * char_top_y с ресетом в 0, если весь спрайт ниже комнаты (>=192). */ - { - int top_y = obj_y - (int)h + 1; - if (top_y >= 192) top_y = 0; - rT = y_to_row(top_y); - rB = y_to_row(obj_y); - if (rB == -1) rB = 3; /* обёртка → ряд 3 (ниже комнаты) */ - rTraw = rT; /* −1 = верх спрайта в полосе у потолка */ - } - /* single-room roomtest: ряд 3 (комната снизу) в этом виде не рисуется → - * окклюдер спереди = ряд 2 (передняя грань пола, за которой нога). */ - if (rB < 0) rB = 0; else if (rB > 2) rB = 2; - if (rT < 0) rT = 0; else if (rT > 2) rT = 2; - /* Голова/руки почти всегда торчат в ряд НАД опорным (Kid выше тайла). - * y_to_row(верх спрайта) из-за +60-сдвига может схлопнуться в опорный - * ряд (rT==rB) — тогда ряд над ним не попадёт в перебор и его окклюдер - * (нижняя грань стены / кромка пола) не перерисуется поверх Kid. Форсим - * включение ряда rB-1. */ - if (rB > 0 && rT >= rB) rT = rB - 1; - fp_cL = cL; fp_cR = cR; fp_cLraw = cLraw; - fp_rT = rT; fp_rB = rB; fp_rTraw = rTraw; -} - -/* Передние грани тайлов и оверлеи ПОВЕРХ персонажа — ОДИН проход на всех - * Char. В оригинале add_kid_to_objtable (seg008:22F0) и - * add_guard_to_objtable (seg008:2324) имеют ИДЕНТИЧНОЕ тело и различаются - * только окном (loadkid/loadshad), типом объекта и спецкейсом тени у - * зеркала; redraw_at_char / redraw_at_char2 (seg003:0576/0645) гейтов по - * charid не имеют вовсе. - * - * До DRAW-CHAR тут стояли ДВА прохода — свой у Кида, свой у соперника, — и - * расхождение уже стоило бага: падающий скелет рисовался поверх верхней - * грани пола соседней колонки, потому что порт redraw_at_char2 был только у - * Кида. Тем же путём пошли бы тень (ур. 4/5/6/12), визирь (13) и толстяк - * (12) — поэтому проход сведён к одному. - * - * obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ спрайта, w/h — размер - * кадра; всё остальное берётся из самого персонажа (ch). Окно fore-клипа к - * этому моменту уже стоит: его задаёт тот, кто нарисовал спрайт. */ -/* Передний слой ОДНОГО тайла — вход для прохода по пометкам - * (pop_fore_needed). Без окна fore-клипа: пометка уже сузила работу до - * нужных тайлов, а кусок тайла обязан лечь целиком — у оригинала foretable - * ничем не режется. */ -void pop_fore_tile_b(int row, int col) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t saved = pop_t_fclip_on; - pop_t_fclip_on = 0; - fore_tile(row, col); - pop_t_fclip_on = saved; -} - -/* Передний слой полосы кладки У ПОТОЛКА (ряд −1) для ОДНОГО столбца — вход для - * прохода по пометкам (pop_fore_needed, ряд −1 идёт там последним). - * - * Тот же redraw_needed_above (seg008:0221), что и над персонажем: обход ряда −1 - * стоит в redraw_needed_tiles ПОСЛЕДНИМ, а его draw_tile_fore кладёт куски в - * foretable, то есть поверх midtable (там лежат падающие плиты) и поверх - * объектов. Без этого кусок, пролетающий у потолка, накрывает собой кромку - * потолка — физически невозможная картинка (найдено пользователем 2026-08-17, - * уровень 1 комната 6: плита (−1,5) перекрывала потолок (−1,6)). - * - * Окно — ровно полоса этого столбца: передние куски потолка живут в трёх - * верхних строках (dby = 2 при клипе по POP_YOFF), рисовать шире незачем. - * ov_mark — как у персонажа: полоса рисуется банком без тени, и на второй - * странице её надо будет восстановить (pop_fore_heal). */ -void pop_ceil_fore_tile_b(int col) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = POP_COL_XH[col] * 8; - /* ov_mark ЗДЕСЬ НЕ НУЖЕН, и это важно для бюджета. Передние куски потолка - * рисуются от dby = 2, то есть занимают строки 0..2 поля, а пометку ставит - * ТОЛЬКО падающий кусок, и только пока он до этих строк достаёт - * (mob_y <= 18) — значит нарисованное целиком лежит в его heal-коридоре - * (mob_y−18 .. mob_y+1), который чистится каждый кадр на своей странице. - * Пока ov_mark тут стоял, его объединение с оверлеями соседей - * растягивалось на полкомнаты и pop_fore_heal стоил 187 500 такта вместо - * 55 000 (замер 2026-08-17). */ - pop_t_clip_top = POP_YOFF; - pop_t_win_set(x, POP_YOFF, 64, CEIL_BAND_H); - ceil_over_kid_tile(col); - pop_t_win_clear(); - pop_t_clip_top = 0; -} - -/* Банк на ВЕСЬ проход пометок, а не на каждый тайл: помеченных тайлов за - * кадр бывает больше десятка, и две смены банка на каждый — заметная доля - * прохода, который сам по себе дешёвый. */ -void pop_fore_pass_begin(void) __banked { gfx_set_bank(GFX_BANK_SPRITE); } -void pop_fore_pass_end(void) __banked { gfx_set_bank(GFX_BANK_NORMAL); } - -void pop_fore_over_char(const pop_char_t *ch, int obj_x, int obj_y, - uint16_t w, uint16_t h) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int8_t cL, cR, cLraw, rT, rB, rTraw, r, c; - uint8_t frame = ch->frame, action = ch->action; - pop_t_fclip_on = 1; /* окно = прямоугольник спрайта */ - char_footprint(obj_x, obj_y, w, h, ch->direction, ch->sword); - pop_dbg_b1(); /* ЗАМЕР: char_footprint */ - pop_dbg_rdmax[1] = pop_dbg_rdmax[2] = pop_dbg_rdmax[3] = 0; /* ВРЕМЕННО */ - /* Футпринт считается по КАДРУ персонажа (char_x_left/right, seg006:1021) - * и потому УЖЕ спрайта, а рядом с ним рисуются ещё клинок и «брызги» - * удара — они уходят ВПЕРЁД-ВВЕРХ и запросто попадают в соседнюю - * колонку или ряд выше. Оригинал этим не страдает: он помечает тайлы - * на перерисовку и рисует foretable целиком, а у нас проход сужен окном - * ради скорости (см. pop_fore_layer_cost). Поэтому перебор расширяется - * САМИМ ОКНОМ fore-клипа — оно и есть объединение «персонаж + клинок + - * брызги», считать его второй раз не надо. */ - /* Границы считаются АРИФМЕТИКОЙ, а не перебором всех колонок и рядов. - * Условие монотонно по номеру (x0 растёт), значит принятые номера идут - * подряд — хватает первого и последнего. Перебор стоил 38 970 тактов на - * кадр (замер MAME): тринадцать итераций, в каждой пара 16-битных - * ЗНАКОВЫХ сверок, а SDCC пишет их через `jp PO / xor 0x80 / jp P`. */ - if (pop_t_fclip_x1 > pop_t_fclip_x0 && pop_t_fclip_y1 > pop_t_fclip_y0) { - int8_t lo, hi; - /* Колонки: x0 = POP_COL_XH[c]*8 = 32*c (таблица линейна, шаг 4). - * 32c + 40 > x0 -> c >= floor((x0−40)/32) + 1 - * 32c < x1 -> c <= ceil(x1/32) − 1 - * Сдвиг вправо у SDCC z80 для int — арифметический, то есть floor и - * для отрицательных; на это здесь и рассчитано. */ - lo = (int8_t)(((pop_t_fclip_x0 - 40) >> 5) + 1); - hi = (int8_t)((((pop_t_fclip_x1 + 31) >> 5)) - 1); - if (lo < 0) lo = 0; - if (hi > 9) hi = 9; - if (lo <= hi) { - if (lo < fp_cL) fp_cL = lo; - if (hi > fp_cR) fp_cR = hi; - } - /* Ряды: y0 = POP_YOFF + 63*r, r только 0..2 — деления на 63 не надо, - * достаточно сравнить с границами полос. - * 63r > y0 − POP_YOFF − 70 и 63r < y1 − POP_YOFF + 8 */ - { - /* Ряды — величина ЛОГИЧЕСКАЯ, поэтому по логической рамке. */ - int a = pop_t_fclip_ly0 - POP_YOFF - 70; - int b = pop_t_fclip_ly1 - POP_YOFF + 8; - lo = a < 0 ? 0 : (a < 63 ? 1 : 2); - hi = b > 126 ? 2 : (b > 63 ? 1 : 0); - if (a < 126 && b > 0 && lo <= hi) { - if (lo < fp_rT) fp_rT = lo; - if (hi > fp_rB) fp_rB = hi; - } - } - } - pop_dbg_b2(); /* ЗАМЕР: границы окна */ - cL = fp_cL; cR = fp_cR; cLraw = fp_cLraw; - rT = fp_rT; rB = fp_rB; rTraw = fp_rTraw; - /* set_objtile_at_char (seg006:1833): тайл, при обработке которого спрайт - * попадает в midtable — база порядка окклюзии в other_overlay_tile. - * run_jump (action 1) — нижний ряд/левая колонка габарита; вис/полёт/ - * подъём — колонка на одну ЛЕВЕЕ curr_col. */ - pop_bg_obj_row = ch->curr_row; - pop_bg_obj_col = ch->curr_col; - if (action == 1) { pop_bg_obj_row = rB; pop_bg_obj_col = cL; } - if ((frame >= 135 && frame < 149) || - action == 2 || action == 3 || action == 4 || action == 6) - pop_bg_obj_col--; - gfx_set_bank(GFX_BANK_SPRITE); /* видео-ОЗУ, heal восстановит */ - /* Шовная окклюзия ворот (порт redraw_at_char для шва): футпринт зашёл за - * ЛЕВЫЙ шов (cLraw<0) и у соседа слева в этом ряду решётка ворот (код 4) — - * перерисовать её бары ПОВЕРХ персонажа. Иначе он, стоя за закрытыми - * воротами (col-1), рисуется поверх решётки. Бары = draw_gate_back по - * живому modif соседа (pop_t_lbg = lcol_bg, openness). */ - if (cLraw < 0 && pop_t_lfg) - for (r = rT; r <= rB; r++) - if ((pop_t_lfg[r] & 0x1F) == 4) { - int dby = 63 * r + 65; - draw_gate_back(pop_t_lbg ? pop_t_lbg[r] : 0, POP_COL_XH[0], dby, dby - 3); - } - if (frame >= 137 && frame <= 144) { /* подъём: пол назначения поверх него */ - uint8_t fidx = (uint8_t)(frame - 137); - for (r = rT; r <= rB; r++) - for (c = cL; c <= cR; c++) - climb_overlay_tile(r, c, fidx); - } else { - /* redraw_at_char2 (seg003:449) — путь set_redraw2/draw_other_overlay: - * тело пола на кромке перекрывает Kid в позах захвата (78-79), виса - * (action 2/6), полёта (3/4) и старта падения (bumped 102-106). - * Верхний ряд — всегда; опорный — кроме action 2 (hang_climb). */ - uint8_t do_ov = 0; - if (frame >= 78 && frame < 80) do_ov = 1; /* захват */ - else if (action == 2 || action == 3 || action == 4 || action == 6) do_ov = 1; - else if (action == 5 && frame >= 102 && frame <= 106) do_ov = 1; - else if (frame == 135 || frame == 136) do_ov = 1; /* начало подъёма (SEQ_UP */ - /* на 141 — до него Kid ещё */ - /* в ряду 1 ПОД полом [0,3]) */ - if (do_ov) { - /* ВЕСЬ диапазон рядов, а не только два крайних. В оригинале - * (redraw_at_char2, seg003:0645) стоит ровно два вызова — - * char_bottom_row и char_top_row, — и этого хватает, потому что - * там они ВСЕГДА соседние. У нас между ними бывает пропуск: - * char_footprint форсит rT = rB−1 (голова торчит в ряд выше), а - * потом окно fore-клипа расширяет rB ещё на ряд вниз — rT=0, - * rB=2 давали обход рядов 0 и 2 МИМО ряда 1. - * - * Ровно так терялась передняя грань пола у Кида, спрыгнувшего с - * кромки: кадр 103, action 3, ряд по y = 1, а обход шёл по 0 и 2 - * (трасса MAME 2026-08-13: rT=0 rB=2 cL=0 cR=1, ни одного вызова - * overlay_mid_tile). Глубже в падении y_to_row давал уже 2, ряд - * 1 попадал в пару крайних — и плита вдруг начинала рисоваться - * правильно, что и было видно глазом (JUMP-FLOOR-LEGS). */ - for (c = cR; c >= cL; c--) { - int8_t r2; - for (r2 = rB; r2 >= rT; r2--) { - /* seg003:0645: при hang_climb опорный ряд НЕ трогаем. */ - if (r2 == rB && action == 2) continue; - other_overlay_tile(r2, c); - } - } - } - } - pop_dbg_b3(); /* ЗАМЕР: оверлеи сделаны */ - /* draw_tile_fore (seg008:690) — foretable, рисуется ПОСЛЕ midtable, т.е. - * ПОСЛЕ оверлеев выше: передняя грань колонны перекрывает скос пола - * (floor_left_overlay), а не наоборот. Раньше fore шёл первым, и тёмный - * скос ложился поверх колонны — «тень у её основания». */ - for (r = rT; r <= rB; r++) - for (c = cL; c <= cR; c++) - fore_tile(r, c); - /* Первое условие draw_tile_fore (seg008:0D15): персонаж СТОИТ на тайле - * ворот — их решётка возвращается поверх него. Решение приняла карта - * (pop_gate_over_char, разбор там же); здесь остаётся отрисовка. Бары - * рисуются в колонке curr_col+1: графика ворот принадлежит ПРАВОМУ краю - * своего тайла и в оригинале кладётся в проходе следующей колонки. - * - * Один вызов через трамплин на персонажа за кадр — не в тайловом цикле: - * тайл-кандидат всегда ровно один, а fore-проход и так самый горячий - * кусок кадра (memory pop_fore_layer_cost). */ - pop_dbg_b4(); /* ЗАМЕР: цикл fore_tile */ - if (pop_gate_over_char(ch)) { - int8_t gr = ch->curr_row, gc = (int8_t)(ch->curr_col + 1); - if (tile_in_fclip(gr, gc)) { - int dby = 63 * gr + 65; - draw_gate_fore(pop_t_bg ? pop_t_bg[gr * 10 + ch->curr_col] : 0, - POP_COL_XH[gc], dby, dby - 3); - } - } - /* redraw_needed_above (seg008:0221): полоса кладки У ПОТОЛКА (ряд −1 = - * ряд 2 комнаты сверху). В оригинале она рисуется в самом конце обхода - * тайлов — ПОСЛЕ объектов, т.е. поверх персонажа (redraw_frames_above, - * куда set_redraw* уводит отрицательные tilepos). Без этого руки Kid, - * прыгающего в ряду 0, лезли поверх потолка. */ - if (rTraw < 0) { - pop_t_clip_top = POP_YOFF; - for (c = cL; c <= cR; c++) { - ov_mark(POP_COL_XH[c] * 8, 0, 64, CEIL_BAND_H); - ceil_over_kid_tile(c); - } - pop_t_clip_top = 0; - } - gfx_set_bank(GFX_BANK_NORMAL); - pop_t_fclip_on = 0; -} diff --git a/applications/PoP/roomtest/pop_bg.h b/applications/PoP/roomtest/pop_bg.h deleted file mode 100644 index c35bb14..0000000 --- a/applications/PoP/roomtest/pop_bg.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * pop_bg.h — отрисовка СТАТИЧЕСКОГО фона комнаты PoP композицией слоёв - * (порт seg008.c draw_tile/wall_pattern, Шаг 3). Рисует прямо в текущую - * страницу (banked GFX_BANK_TRANSPARENT — в видео-ОЗУ + теневую копию, - * 0xFF прозрачен), ОДИН раз при входе в комнату. - * - * Данные: getimage-спрайты в атласах pop_env0..4/pop_wall/pop_fore - * (toolchain/pop_pack_bg.py), палитра pop_bg.pal. Прямая адресация - * id: env[id>>5] idx id&31, wall idx=id, fore idx=id — ноль remap-таблиц. - */ -#ifndef POP_BG_H -#define POP_BG_H - -#include -#include "pop_char.h" /* pop_char_t — общий проход отрисовки поверх Char */ -#include "pop_qsave.h" - -/* ---- Вертикальный layout (PoP-экран 320×200 в нашем 320×256) --------- * - * Игровой экран 200px центрируем по высоте: сдвиг всего рисунка вниз на - * POP_YOFF = (256-200)/2 = 28px (чёрные борта сверху/снизу). Внутри 200px - * верхние POP_PLAYFIELD_H = 192 — поле тайлов/спрайтов (комната = 3 ряда), - * нижние 8 — статус-полоса (жизни/сообщения): тайлы/спрайты туда НЕ лезут. - * Сдвиг применяется на границе примитивов (blit/heal) — логика рисования - * остаётся в «room-space» y=0..191. */ -#define POP_YOFF 28 -#define POP_PLAYFIELD_H 192 -/* Экранный y нижней границы поля (ниже — статус-полоса + борт → клип). */ -#define POP_CLIP_BOTTOM (POP_YOFF + POP_PLAYFIELD_H) - -/* Экранный верх прямоугольника при ПЕРЕВОРОТЕ (зелье инверсии): поле - * отражается внутри себя, борта не трогаются. ОДНА формула на весь порт — - * блит тайла, heal точечных перерисовок и чёрные плиты обязаны считать - * одинаково, иначе стираем в одном месте, а рисуем в другом (именно так - * ломались чомперы и решётка). Зеркалит ВЫЗЫВАЮЩИЙ; у примитивов libbgi - * семантика координат не меняется. */ -#define POP_FLIP_TOP(top, h) (2 * POP_YOFF + POP_PLAYFIELD_H - (top) - (int)(h)) - -/* Выбор ядра libbgi (pop_onscreen_cols / pop_heal_fast) переехал в - * `_pop_draw.h` — его включают только три рисующих модуля. Из общего - * заголовка SDCC размножал мёртвые копии этих inline'ов по всем TU: см. - * шапку `_pop_draw.h`. */ - -/* Загрузить 7 атласов фона. Звать ДО initgraph (как poc.c — atlas_load - * трогает W3; проверенный порядок). Палитру pop_bg.pal грузит ПРИЛОЖЕНИЕ - * после initgraph (gfx_pal_fload). 0 — OK, -1 — ошибка. */ -int pop_bg_load(uint8_t set) __banked; /* 0 подземелье, 1 дворец */ -/* Пере-применить 32 записи палитры текущего тайлсета (env 0x50, wall 0x60). - * Звать после gfx_pal_fload(kid.pal): та собрана из VDUNGEON и затирает их. */ -int pop_bg_pal_apply(void) __banked; - -/* Освободить EMM-страницы атласов. */ -void pop_bg_free(void) __banked; - -/* Нарисовать комнату: fg[30]/bg[30] — foretable-коды/backtable-модификаторы - * (по строкам, row*10+col). lcol_fg/lcol_bg — 3 тайла правого столбца - * ЛЕВОЙ соседней комнаты (для границы, напр. решётки ворот), или 0 — - * тогда левая кромка = стена. room_num — номер комнаты (зерно стен). */ -void pop_room_draw(uint8_t room_num, - const uint8_t *fg, const uint8_t *bg, - const uint8_t *lcol_fg, const uint8_t *lcol_bg) __banked; - -/* Задать ряд 0 комнаты СНИЗУ — для draw_tile_topright, когда тайл нижнего - * ряда стал empty (после падения loose): «стена вниз» рисуется по коду - * room_B(0, col-1). ОДИННАДЦАТЬ байт: [0..9] — колонки комнаты снизу, - * [10] — тайл (0,9) комнаты СНИЗУ-СЛЕВА (сосед угла (2,0); см. - * load_rowbelow, seg008:368). 0 — нет комнаты снизу. */ -/* НЕ __banked: тело в резиденте (pop_tile.c) — из банка зовётся прямым call. */ -void pop_room_set_below(const uint8_t *below_row0_fg) __banked; - -/* Задать ряд 2 (fg-коды + модификаторы, 10 шт.) комнаты СВЕРХУ — для полосы - * кладки у потолка (seg008 draw_room доп. верхний ряд из room_A). 0 — нет - * комнаты сверху (кромка уровня → пол). */ -void pop_room_set_above(const uint8_t *above_row2_fg, const uint8_t *above_row2_mod) __banked; - -/* Перерисовать передний слой (fore) и оверлеи тайлов ПОВЕРХ персонажа — - * ОДИН проход на всех Char (Кид, страж, скелет, дальше тень/визирь): в - * оригинале add_kid_to_objtable и add_guard_to_objtable имеют одинаковое - * тело, а redraw_at_char/redraw_at_char2 гейтов по charid не имеют. - * Звать ПОСЛЕ отрисовки спрайта, когда окно fore-клипа уже стоит - * (pop_fore_set_clip) — перебор тайлов расширяется по нему. - * - * ch — персонаж (Kid/Guard): из него берутся direction/sword/frame/action и - * curr_col/curr_row. obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ - * спрайта, w/h — размер кадра. См. redraw_at_char/set_char_collision. */ -void pop_fore_over_char(const pop_char_t *ch, int obj_x, int obj_y, - uint16_t w, uint16_t h) __banked; - -/* Окно fore-слоя: прямоугольник СПРАЙТА (экранные координаты, y уже с - * POP_YOFF), поверх которого fore-проход возвращает куски тайлов. Ставит - * тот, кто нарисовал спрайт (pop_char_draw) — он один знает - * итоговый габарит (у Kid — с учётом клинка и обрезки clip_char). Вне - * fore-проходов окно игнорируется: фон рисуется целиком. Мотивация и - * замер — в pop_bg.c у fclip_on. */ -void pop_fore_set_clip(int x, int y, int w, int h); - -/* Восстановить фон там, где в прошлых кадрах рисовался ОВЕРЛЕЙ - * (draw_other_overlay/floor_overlay/полоса потолка): он выходит за - * прямоугольник персонажа, поэтому его heal этого не убирает — на второй - * странице дабл-буфера остаётся след и мерцает. Звать рядом с - * pop_char_heal. */ -void pop_fore_heal(void) __banked; - -/* Loose floors — динамическая отрисовка (состояние pop_loose_modif в - * pop_map). Звать на ТЕКУЩЕЙ (back) странице из pop_loose_tick. - * shake_draw — дрожащий кадр (heal+SPRITE); bake_empty — запечь пустоту - * после падения (NORMAL, в ОЗУ-копию). */ -void pop_loose_shake_draw(int row, int col) __banked; -void pop_loose_bake_empty(int row, int col) __banked; - -/* Плита-ПОТОЛОК (loose ряда 2 комнаты СВЕРХУ, наш ряд −1): дрожащий кадр в - * полосе у потолка / «запечь» пустоту (колодец наверх) после провала. - * Состояние — pop_ceil_modif[10] в pop_map. */ -void pop_ceil_shake_draw(int col) __banked; -void pop_ceil_bake_empty(int col) __banked; - -/* Кусок приземлился (loose_land) — переехал в pop_state.h: переменную - * читают по обе стороны банковой границы. */ -#include "pop_state.h" - -/* Пики (spike) — перерисовка тайла (row,col) на back-странице по живому - * modif (pop_trob). Звать из pop_process_trobs. См. pop_bg.c. */ -void pop_spike_redraw(int row, int col) __banked; - -/* Чомпер — то же самое для его кадра анимации (все куски в СВОЕЙ ячейке, - * поэтому соседа перерисовывать не надо). */ -void pop_chomp_redraw(int row, int col) __banked; - -/* Вернуть ТОЛЬКО слой anim чомпера — его собственную графику поверх свежего - * пламени соседнего факела. Порт ветки redraw_frames_anim в redraw_needed - * (seg008:0211): оригинал на такую пометку делает ровно три вызова — - * draw_tile_anim_topright / draw_tile_anim_right / draw_tile_anim — и НЕ - * делает ни wipe, ни полного draw_tile (wipe у него отдельный счётчик). - * - * Из этих трёх нам нужен один: topright — про верх ВОРОТ под пустой - * клеткой, к чомперу не относится, а anim_right (пламя левого соседа) у нас - * уже нарисован — pop_torch_draw запекает его в фон ДО redraw_needed. */ -void pop_chomp_anim_draw(int row, int col) __banked; - -/* Анимация факела/зелья (динамика каждый кадр; фон запечён без них): - * modif — живой room_modif тайла. Для факела col — колонка САМОГО факела - * (пламя рисуется в ячейке правого соседа). */ -void pop_torch_draw(int row, int col, uint8_t modif) __banked; - -/* Стереть запечённое пламя факела с текущей draw-страницы (фон покоя). - * Нужно перевороту экрана: иначе отражение растаскивает языки огня по - * комнате — подробности в pop_room.c. */ -void pop_torch_wipe(int row, int col) __banked; -void pop_potion_draw(int row, int col, uint8_t modif) __banked; - -/* Ворота на ЛЕВОМ шве (col0) — перерисовать по живому modif соседа слева. - * g_lbg (lcol_bg) должен быть обновлён вызывающим. Звать из основного цикла - * на back-странице, когда сосед слева анимируется. См. pop_bg.c. */ -void pop_room_redraw_seam_left(uint8_t rows) __banked; /* rows = маска рядов 0..2 */ - -/* Перерисовать ПОЛ тайла (row,col) + правую грань в соседе на back-странице - * (wipe по площади пола, БЕЗ стены ряда ниже). Для смены тайла на месте: - * кнопка нажата/отжата, floor → debris от упавшей плиты. */ -void pop_floor_bake(int row, int col) __banked; -void pop_button_redraw(int row, int col) __banked; /* = pop_floor_bake (кнопка) */ - -/* Дверь уровня: перерисовать её ПРАВУЮ половину (row, col = правая) с - * запечкой — створка анимируется (pop_trob animate_leveldoor). */ -void pop_leveldoor_redraw(int row, int col) __banked; - -/* Ворота ВНУТРИ отрисованной комнаты: перерисовать по живому modif. - * (row,col) — координаты САМИХ ворот; бары рисует ячейка правого соседа - * (draw_tile, ветка lcode==4), туда и идёт wipe+redraw. Порт draw_trob - * (seg007:01E6), которым заканчивается animate_door. */ -void pop_gate_redraw(int row, int col) __banked; - -/* Падающий кусок loose (mob, seg007 move_loose): спавн при падении тайла - * (row,col) и покадровое продвижение+отрисовка на back-странице. tick - * зовётся каждый кадр (внутри pop_loose_tick); клип низа делает clip. */ -void pop_loose_mob_spawn(int row, int col) __banked; -/* То же, но в ЯВНО заданной комнате: плита, расшатанная Кидом и брошенная - * (он ушёл в соседнюю комнату), доваливается сама — см. animate_loose в - * pop_trob.c. Дальше кусок летит обычным путём: mob_tick_one умеет чужую - * комнату (mob_tile_at читает уровень, посадку сигналит pop_loose_exit). */ -void pop_loose_mob_spawn_at(uint8_t room, int row, int col) __banked; -void pop_loose_mob_tick(void) __banked; -void pop_loose_mob_reset(void) __banked; /* убрать все куски (СТАРТ УРОВНЯ, mobs_count=0) */ -void pop_loose_mob_qsave(pop_qs_io_t *io) __banked; - -/* Забыть, на какой странице сделана первая запечка тайлов (см. bake_copy в - * pop_room.c). Звать при смене комнаты/уровня: номера тайлов повторяются, и - * первый же тайл с тем же номером получил бы копию вместо честной запечки. */ -void pop_bake_forget(void) __banked; - -/* Передний слой полосы кладки у потолка (ряд −1) для одного столбца — зовёт - * проход по пометкам, ряд −1 в нём последний (порт redraw_needed_above + - * порядка redraw_needed_tiles, seg008:1B06). */ -void pop_ceil_fore_tile_b(int col) __banked; - -/* Оверлей тайла (row,col) ПОВЕРХ падающего куска, чей тайл — (oref_row, - * oref_col): порт set_redraw2 из draw_mob (seg007:1149). Порядок обхода - * проверяется внутри. */ -void pop_mob_overlay_tile(int row, int col, int8_t oref_row, int8_t oref_col, - int mx, int my, uint8_t mh) __banked; - -/* Смена комнаты: куски продолжают падать в СВОИХ комнатах (do_mobs крутит - * mobs[] независимо от drawn_room), сбрасывается только heal-история. */ -void pop_loose_mob_room_changed(void) __banked; - -/* Кусок НИЖЕ Kid по obj_y → рисуется ПОВЕРХ него (порт sort_curr_objs, - * seg008:1561). Звать после отрисовки персонажей, перед fore-слоем. */ -/* Отрисовка падающих кусков, идущих ПОД Kid. Звать ПОСЛЕ pop_redraw_needed() - * — фон кадра обязан быть готов до любого спрайта. */ -/* Передний слой ОДНОГО тайла — зовёт pop_fore_needed (pop_redraw.c). */ -void pop_fore_tile_b(int row, int col) __banked; -void pop_fore_pass_begin(void) __banked; -void pop_fore_pass_end(void) __banked; - -void pop_loose_mob_draw(void) __banked; -void pop_loose_mob_draw_over(void) __banked; - -/* Позиция куска (колонка, y низа) для check_loose_fall_on_kid. 0 — нет. */ -uint8_t pop_loose_mob_pos(int *col, int *y) __banked; - -/* Детектор выхода спрайта за поле: если спрайт [x,w] с ЭКРАННЫМ верхом - * sy_top и высотой h заходит ниже поля (статус-полоса/борт) или выше - * верхнего борта — взводит внутренний флаг «борта грязные» на 2 кадра. - * Звать СРАЗУ после блита падающего объекта (Kid/кусок). */ -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked; - -/* Почистить борта (верхний + статус-полоса/нижний) — но ТОЛЬКО в кадрах, - * где кто-то реально вышел за поле (гейт по флагу от pop_clip_sprite): - * даром в покое, O(1) при падении (не зависит от числа спрайтов). Звать - * КАЖДЫЙ кадр ПОСЛЕ персонажей и fore на back-странице. */ -void pop_room_clip_borders(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_cdraw.c b/applications/PoP/roomtest/pop_cdraw.c deleted file mode 100644 index 9f9ec6f..0000000 --- a/applications/PoP/roomtest/pop_cdraw.c +++ /dev/null @@ -1,1058 +0,0 @@ -/* - * pop_cdraw.c — ОТРИСОВКА ПЕРСОНАЖЕЙ (Кид, страж, скелет; дальше тень, - * визирь, толстяк) + полоса HP. Банк 4. - * - * Одно тело на всех Char — порт add_kid_to_objtable/add_guard_to_objtable - * (seg008:22F0/2324), различия сведены к слоту; мотивация и порядок вызовов - * в кадре — в шапке pop_cdraw.h. До DRAW-CHAR это были kid_draw в - * резиденте и pop_guard_draw здесь же, каждый со своей математикой кадра, - * своими heal-прямоугольниками и своим проходом окклюзии. - * - * Почему банк, а не резидент: зовёт только главный цикл (раз в кадр на - * персонажа), горячих банк→банк переходов отсюда нет, а резидентное - * пространство W1+W2 делят код и данные — килобайт кода, уехавший в банк, - * это килобайт для кучи. Писучие статики банкового модуля (--dataseg не - * задаём) остаются в обычном _DATA, то есть в W2: pop_cd читают и физика, и - * фон из СВОИХ банков — без трамплина, обычной адресацией. - */ -#include -#include -#include -#include "pop_arc.h" -#include "guard_arc.h" -#include "skel_arc.h" -#include "vizier_arc.h" -#include "pop_guard.h" -#include "pop_kid.h" -#include "_pop_kdraw.h" -#include "pop_vflip.h" /* зеркальные страницы атласов (зелье инверсии) */ /* меч + блит по id — сосед по банку 4 */ /* атласы/кадр Кида, pop_sword_draw, окна Char */ -#include "pop_cdraw.h" -#include "pop_status.h" -#include "pop_ui.h" /* POP_COL_OUTSIDE — фон вне игрового поля */ -#include "pop_shadow.h" /* запечённый набор Тени */ -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_state.h" /* ВРЕМЕННО: зонды pop_dbg_b* */ -#include "pop_bg.h" /* POP_YOFF, pop_fore_over_char, pop_fore_set_clip */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_map.h" /* hitp_curr/hitp_max — HP Кида; clip_char */ -#include "pop_level.h" /* тип соперника уровня (набор спрайтов) */ -#include "pop_tile.h" /* pop_heal_off — клип тени/отражения через фон */ -#include "kid_data.h" -#include "pop_guard_pal.h" /* таблица палитр стражей (сгенерена упаковщиком) */ - -/* Последний curr_guard_color обычного стража (0 — цвет ещё не выбирали). - * Нужен pop_guard_pal_apply, чтобы восстановить слоты после kid.pal. */ -static uint8_t guard_pal_cur; - -/* 16 слотов POP_GUARD_PAL_BASE в ОБЕ палитры дабл-буфера. - * Таблицы — rodata ЭТОГО модуля, то есть страница банка (0xC000+), а - * gfx_pal_load отдаёт указатель в BIOS ($A4 через rst #0x08). BIOS читает - * только #4000-#BFFF (см. корневой CLAUDE.md), поэтому копируем запись в - * локальный буфер — стек гарантированно в W2. Без копии BIOS забирал - * мусор с чужой страницы и страж становился невидимым. */ -static void pal_load16(const uint8_t *src) -{ - uint8_t buf[64]; - uint8_t i; - for (i = 0; i < 64; i++) buf[i] = src[i]; - gfx_pal_load(0, POP_GUARD_PAL_BASE, 16, buf); - gfx_pal_load(1, POP_GUARD_PAL_BASE, 16, buf); -} - -/* Цвет стража (set_chtab_palette, seg003:257). Оригинал держит ОДИН набор - * спрайтов и подменяет 16 цветов палитры chtab_5 по level.guards_color — - * так на уровне 2 стражи комнат 4/7/11/15/24 разного цвета (1/3/1/1/6). - * Полоса HP стража рисуется тем же атласом, поэтому меняется заодно. - * color = 0 — палитру не трогаем (оригинал в этом случае set_chtab_palette - * не зовёт: тип уровня не «обычный страж»). - * Грузим В ОБЕ палитры: у страниц дабл-буфера они раздельные. */ -void pop_guard_set_palette(uint8_t color) __banked -{ - if (color == 0 || color > POP_GUARD_NPAL) return; - guard_pal_cur = color; /* curr_guard_color, для re-apply */ - pal_load16(pop_guard_pal[color - 1]); -} - -/* Пере-применить палитру ТЕКУЩЕГО набора соперника — пара к - * pop_bg_pal_apply/pop_shadow_pal_apply. Слоты 0x90..0x9F динамические: - * общий kid.pal содержит все 256 записей и затирает их палитрой обычного - * стража (цвет 2, тот что запёк упаковщик). Поэтому КАЖДЫЙ file-load - * логической палитры обязан доплатить этот диапазон, иначе скелет (и - * Джафар) остаются в цвете стража: у скелета все пиксели индекса 3, а это - * слот 0x93 = розовый цвет стража — ровно то, что было видно на уровне 3. - * Звать из pop_pal_* ДО snapshot. */ -void pop_guard_pal_apply(void) __banked -{ - int8_t type = pop_level_guard_type(pop_current_level); - if (type == 2 || type == 3) { /* свой цвет — из файла набора */ - pal_load16((type == 2) ? pop_skel_pal : pop_vizier_pal); - } else if (type == 0 && guard_pal_cur != 0) { - pal_load16(pop_guard_pal[guard_pal_cur - 1]); - } -} - -/* ---- Атласы стража (chtab_5, база 750): g[id>>3], idx id&7 ---------- */ -#define GUARD_PAGES 5 -static atlas_t gp[GUARD_PAGES]; -static uint8_t g_ok; - -/* Состояние отрисовки по слотам (см. pop_cdraw.h): heal-прямоугольники по - * страницам дабл-буфера, габарит кадра и окно fore-клипа. */ -pop_cdraw_t pop_cd[POP_CH_N]; - -/* «Брызги» урона Кида — спрайт chtab_2 id 218 (res619.png, в наших атласах - * страница 27). У соперника это image 1 его собственного набора. */ -#define KID_SPLASH_IMAGE 218 - -/* Набор спрайтов соперника выбирает ТИП УРОВНЯ (load_lev_spr, seg000:1092): - * tbl_guard_type = {0 guard, 1 fat, 2 skeleton, 3 vizier, 4 shadow, −1 нет}. - * У нас пока два набора: обычный страж (уровни 1-2) и скелет (уровень 3); - * у скелета и кадров меньше (28 против 34), поэтому пятую страницу он не - * грузит. Уровень БЕЗ соперников (type < 0) не грузит ничего. */ -int pop_guard_load(void) __banked -{ - uint8_t tbl[ARC_GUARD_COUNT * POP_ARC_REC]; /* самый крупный из трёх */ - pop_arc_t arc; - int8_t type = pop_level_guard_type(pop_current_level); - uint8_t i, pages, count, id; - - if (type < 0) return 0; /* соперников на уровне нет */ - /* Наборы разложены по своим архивам, а не в один: имена внутри у них - * совпадают (g0.atl у всех троих), да и грузится всегда ровно один. */ - if (type == 2) { id = POP_ARC_SKEL; count = ARC_SKEL_COUNT; - pages = ARC_SKEL_COUNT; } - else if (type == 3) { id = POP_ARC_VIZIER; count = ARC_VIZIER_COUNT; - pages = ARC_VIZIER_COUNT; } - else { id = POP_ARC_GUARD; count = ARC_GUARD_COUNT; - pages = GUARD_PAGES; } - if (pages > GUARD_PAGES) pages = GUARD_PAGES; - if (pop_arc_open_id(&arc, id, tbl, count) < 0) return -1; - for (i = 0; i < pages; i++) - if (pop_arc_atlas(&arc, tbl, i, &gp[i]) != 0) { - pop_arc_close(&arc); - return -1; - } - pop_arc_close(&arc); - g_ok = 1; -/* Цвет: у скелета он СВОЙ (палитра из его набора), у стража подменяется - * из res10.bin по guards_color — это делает pop_guard_set_palette при - * входе в комнату (seg002:186: у не-guard curr_guard_color = 0). */ - pop_guard_pal_apply(); - return 0; -} - -/* Зеркальный набор соперника — пара к pop_guard_load: те же страницы, но - * файлы *_v.atl (см. pop_vflip.h). Здесь, а не в загрузчике набора, - * потому что gp[] и выбор GUARD/SKEL живут именно тут. */ -int pop_guard_vflip_load(void) __banked -{ - uint8_t tbl[ARC_GUARD_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t type = pop_level_guard_type(pop_current_level); - uint8_t i; - int res = 0; - - if (type < 0 || !g_ok) return 0; /* соперников на уровне нет */ - /* Зеркала есть ТОЛЬКО у обычного стража: зелье инверсии — уровень 9, а - * там tbl_guard_type = 0 (у скелета и Джафара своих *_v нет вовсе). */ - if (type != 0 && type != 1) return 0; - if (pop_arc_open_id(&arc, POP_ARC_GUARD, tbl, ARC_GUARD_COUNT) < 0) - return -1; - for (i = 0; i < GUARD_PAGES; i++) { - atlas_t m; - - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_GUARD_G0_V + i), &m) != 0 || - pop_vflip_take(&gp[i], &m) != 0) { - res = -1; - break; - } - } - pop_arc_close(&arc); - return res; -} - -void pop_guard_free(void) __banked -{ - uint8_t i; - if (!g_ok) return; - for (i = 0; i < GUARD_PAGES; i++) atlas_free(&gp[i]); - g_ok = 0; -} - -/* ---- calc_screen_x_coord (seg008:2602) БЕЗ деления ------------------- * - * - * Логическая X (280 шир = 28px/тайл) -> экранная (320 = 32px/тайл): ×8/7. - * SDLPoP пишет это как `logical_x*320/280`, у нас SDCC разворачивал в - * `__divsint` — 2 400 тактов на вызов, и зовётся оно на КАЖДОГО персонажа - * КАЖДЫЙ кадр (последнее деление, остававшееся в горячем пути). - * - * ХРАНИМ x/7 БАЙТОМ, а не готовое x*8/7 словом. Тождество: 8x/7 == x + x/7 - * (7x делится нацело, поэтому усечение обеих частей совпадает — и для - * отрицательных с трункейтом к нулю тоже). Оба варианта собраны и - * посчитаны по сгенерированному asm: - * - * int16_t готовое: ... add hl,hl / add hl,de / ld e,(hl) / inc hl / - * ld d,(hl) = 132 такта, 2 304 байта - * int8_t x/7: ... add hl,bc / ld a,(hl) / ld l,a / rlca / sbc a,a / - * ld h,a / add hl,de = 131 такт, 1 152 байта - * - * Расширение знака и 16-битное сложение стоят РОВНО столько же, сколько - * лишний `add hl,hl` при двухбайтном индексе, а чтение из памяти на одно - * меньше — под wait-state'ами Sprinter (такт ≈ 2,4× номинала на обращениях - * к ОЗУ) байтовый вариант даже чуть выгоднее номинала. Плюс килобайт - * банка, который в pop_cdraw ещё понадобится. - * - * ДИАПАЗОН — весь, а не «обычный случай». Отрицательные X реальны: - * obj_x = 2*fwd − 116 уходит в минус, как только fwd < 58 (левее - * x_bump[5]), то есть у левой кромки комнаты — это не экзотика. По - * фактическим данным кадров (kid.ani: dx Кида −5..+10, стража - * −2..+10) при x типа uint8_t и render_dx ∈ {−140, 0, +140} полный - * диапазон obj_x = −416..695; таблица кроет −448..703 с запасом. - * Деление ниже поэтому недостижимо и оставлено страховкой на случай - * третьего персонажа или другого render_dx. - * - * SCRX7[x + SCRX_BIAS] == x/7 (усечение к нулю, как в C и как у 8086 idiv - * в оригинале); экранная X = x + SCRX7[...]. */ -#define SCRX_BIAS 448 -#define SCRX_N 1152 -static const int8_t SCRX7[SCRX_N] = { - -64, -63, -63, -63, -63, -63, -63, -63, -62, -62, -62, -62, -62, -62, -62, -61, -61, -61, -61, -61, - -61, -61, -60, -60, -60, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -58, -58, -58, -58, - -58, -58, -58, -57, -57, -57, -57, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -55, -55, -55, - -55, -55, -55, -55, -54, -54, -54, -54, -54, -54, -54, -53, -53, -53, -53, -53, -53, -53, -52, -52, - -52, -52, -52, -52, -52, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -50, -50, -49, - -49, -49, -49, -49, -49, -49, -48, -48, -48, -48, -48, -48, -48, -47, -47, -47, -47, -47, -47, -47, - -46, -46, -46, -46, -46, -46, -46, -45, -45, -45, -45, -45, -45, -45, -44, -44, -44, -44, -44, -44, - -44, -43, -43, -43, -43, -43, -43, -43, -42, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, - -41, -41, -40, -40, -40, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -39, -38, -38, -38, -38, - -38, -38, -38, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, - -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -34, -33, -33, -33, -33, -33, -33, -33, -32, -32, - -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, -29, - -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -27, - -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, - -24, -23, -23, -23, -23, -23, -23, -23, -22, -22, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, - -21, -21, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, - -18, -18, -18, -17, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, - -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -13, -12, -12, - -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -9, - -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, - -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, - -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, - -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, - 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, - 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, - 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, - 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, - 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, - 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, - 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, - 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, - 38, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, - 41, 41, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, - 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 50, 50, - 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 53, - 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, - 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, - 61, 61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, - 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, - 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 70, 70, - 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, - 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, - 78, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, - 81, 81, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, - 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, - 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 90, 90, - 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 93, - 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, - 98, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, -}; - -static int scr_x(int x) -{ - /* Индекс считаем в uint16_t ОТДЕЛЬНОЙ переменной, а не выражением внутри - * скобок: на `(const T*)КОНСТ + var*K` SDCC z80 умеет терять старший байт - * индекса (memory sdcc_z80_const_ptr_index_bug), а тут индекс как раз - * больше 255. */ - uint16_t i = (uint16_t)(x + SCRX_BIAS); - if (i < SCRX_N) return x + SCRX7[i]; - return x * 8 / 7; /* по данным кадров недостижимо */ -} - -/* Добавить накладной спрайт (клинок / брызги) в overlay-прямоугольник - * страницы. Оба мелкие и в одном кадре встречаются редко — их объединение - * дешевле третьего heal-слота. */ -static void cd_overlay_add(pop_cdraw_t *s, uint8_t dp, int x, int y, - uint8_t w, uint8_t h) -{ - if (!s->ovalid[dp]) { - s->ox[dp] = x; s->oy[dp] = y; s->ow[dp] = w; s->oh[dp] = h; - s->ovalid[dp] = 1; - return; - } - { - int x0 = s->ox[dp], y0 = s->oy[dp]; - int x1 = x0 + (int)s->ow[dp], y1 = y0 + (int)s->oh[dp]; - if (x < x0) x0 = x; - if (y < y0) y0 = y; - if (x + (int)w > x1) x1 = x + (int)w; - if (y + (int)h > y1) y1 = y + (int)h; - s->ox[dp] = x0; s->oy[dp] = y0; - s->ow[dp] = (uint8_t)(x1 - x0); s->oh[dp] = (uint8_t)(y1 - y0); - } -} - -/* Добавить прямоугольник в окно fore-клипа слота (объединение «спрайт + - * накладные»): по нему fore-проход возвращает куски тайлов и по нему же - * расширяет перебор колонок/рядов. */ -static void cd_clip_add(pop_cdraw_t *s, int x, int y, uint8_t w, uint8_t h) -{ - if (!s->cw) { - s->cx = x; s->cy = y; s->cw = w; s->ch = h; - return; - } - { - int x1 = s->cx + (int)s->cw, y1 = s->cy + (int)s->ch; - if (x < s->cx) s->cx = x; - if (y < s->cy) s->cy = y; - if (x + (int)w > x1) x1 = x + (int)w; - if (y + (int)h > y1) y1 = y + (int)h; - s->cw = (uint8_t)(x1 - s->cx); - s->ch = (uint8_t)(y1 - s->cy); - } -} - -/* Стирание прошлого кадра персонажа и его накладных. pop_heal_fast, а не - * голый gfx_heal: стираем ровно то, что рисовали, а рисовали в подавляющем - * большинстве кадров noclip-ядром; клипающий путь остаётся для straddle и - * выхода за поле. - * - * Тело — static: pop_char_draw зовёт его же «страховкой» (см. ниже), а - * трамплин выбирается ОБЪЯВЛЕНИЕМ, и вызов через `__banked`-имя стоил бы - * 654 такта внутри собственного банка (memory sdcc_banked_call_rules). */ -static void cd_heal(uint8_t who) -{ - pop_cdraw_t *s = &pop_cd[who]; - uint8_t p = gfx_get_draw_page() & 1; - if (s->valid[p]) pop_heal_fast(s->x[p], s->y[p] + POP_YOFF, s->w[p], s->h[p]); - if (s->ovalid[p]) pop_heal_fast(s->ox[p], s->oy[p] + POP_YOFF, s->ow[p], s->oh[p]); - s->valid[p] = s->ovalid[p] = 0; -} - -void pop_char_heal(uint8_t who) __banked { cd_heal(who); } - -/* ---- Пропуск неизменившегося кадра (DRAW-COST; контракт — pop_cdraw.h) -- */ - -/* Снимок ВХОДОВ отрисовки слота. Картинки (image) в снимке нет: её - * однозначно определяет пара (charid, frame), и это ГАРАНТИРУЕТ pop_load_frame - * в самой отрисовке — без него кадр приходил из кэша, который мог отстать, и - * снимок описывал не то, что нарисовано (BUG-SHADOW-STALE-FRAME, разбор в - * pop_char_draw). Тайлы вокруг персонажа (clip_char, fore-проход) в снимок - * тоже не входят — их изменение ловит pop_cd_dirty. */ -typedef struct { - uint8_t frame, x, y, action, sword, charid, room, hurt; - int8_t dir, ccol, crow; - int dx; /* render_dx: straddle-смещение */ -} cd_sig_t; - -static cd_sig_t cd_sig[POP_CH_N][2]; - -static void cd_sig_make(uint8_t who, cd_sig_t *g) -{ - const pop_char_t *ch = (who == POP_CH_KID) ? &Kid : &Guard; - g->frame = ch->frame; g->x = ch->x; g->y = ch->y; - g->action = ch->action; g->sword = ch->sword; g->charid = ch->charid; - g->room = ch->room; - g->hurt = (uint8_t)((who == POP_CH_KID) ? pop_kid_hurt : pop_guard_hurt); - g->dir = ch->direction; - g->ccol = ch->curr_col; g->crow = ch->curr_row; - g->dx = pop_cd[who].render_dx; -} - -/* Совпадает ли снимок страницы с ТЕКУЩИМ состоянием персонажа. - * - * Отдельно от cd_sig_make намеренно: тот СТРОИТ структуру, и для проверки - * это лишняя работа — тринадцать записей в стековый кадр (а значит через - * `-n(ix)`), после которых идёт побайтовый цикл сравнения. А зовут проверку - * четыре раза за кадр: pop_char_skip_mask дважды, и в ней по два слота. - * Здесь сравниваем поля прямо с источником, и первое же расхождение - * заканчивает работу — у ДВИГАЮЩЕГОСЯ персонажа это обычно первое поле. */ -static uint8_t cd_sig_same(uint8_t who, uint8_t p) -{ - const pop_char_t *ch = (who == POP_CH_KID) ? &Kid : &Guard; - const cd_sig_t *g = &cd_sig[who][p]; - if (g->frame != ch->frame) return 0; - if (g->x != ch->x) return 0; - if (g->y != ch->y) return 0; - if (g->dir != ch->direction) return 0; - if (g->action != ch->action) return 0; - if (g->ccol != ch->curr_col) return 0; - if (g->crow != ch->curr_row) return 0; - if (g->sword != ch->sword) return 0; - if (g->charid != ch->charid) return 0; - if (g->room != ch->room) return 0; - if (g->hurt != (uint8_t)((who == POP_CH_KID) ? pop_kid_hurt : pop_guard_hurt)) - return 0; - if (g->dx != pop_cd[who].render_dx) return 0; - return 1; -} - -/* Габарит слота на странице: спрайт + накладные (клинок/брызги). y — - * КОМНАТНЫЙ (как в pop_cd), перевод в экранный делает вызывающий. */ -static void cd_bbox(uint8_t who, uint8_t p, int *x0, int *y0, int *x1, int *y1) -{ - const pop_cdraw_t *s = &pop_cd[who]; - *x0 = s->x[p]; *y0 = s->y[p]; - *x1 = *x0 + (int)s->w[p]; *y1 = *y0 + (int)s->h[p]; - if (s->ovalid[p]) { - if (s->ox[p] < *x0) *x0 = s->ox[p]; - if (s->oy[p] < *y0) *y0 = s->oy[p]; - if (s->ox[p] + (int)s->ow[p] > *x1) *x1 = s->ox[p] + (int)s->ow[p]; - if (s->oy[p] + (int)s->oh[p] > *y1) *y1 = s->oy[p] + (int)s->oh[p]; - } -} - -/* ЗАБЫТЬ, ЧТО НАРИСОВАНО, на ОБЕИХ страницах. - * - * Звать после всего, что переписало экран мимо кадрового конвейера: меню, - * QuickLoad, переворот картинки. Иначе снимок слота продолжает утверждать, - * что нужный кадр персонажа на странице уже есть, и cd_quiet честно - * пропускает отрисовку — персонаж исчезает до первого своего движения - * (поймано пользователем на выходе из меню; рядом с факелом бага не видно - * ровно потому, что анимация фона метит прямоугольник Кида и пропуск - * снимается сама собой). */ -void pop_cd_forget(void) __banked -{ - uint8_t i; - - for (i = 0; i < POP_CH_N; i++) { - pop_cd[i].valid[0] = pop_cd[i].valid[1] = 0; - pop_cd[i].ovalid[0] = pop_cd[i].ovalid[1] = 0; - } -} - -/* «Тихий» слот: спрайт этой страницы цел (heal его не трогал), фон в его - * прямоугольнике не трогали, и все входы отрисовки те же, что в момент, - * когда этот кадр на эту страницу и рисовали. valid[p] здесь ключевой: он - * снимается heal'ом, поэтому решение остаётся согласованным, сколько раз его - * ни перепроверяй за кадр. */ -static uint8_t cd_quiet(uint8_t who, uint8_t p) -{ - /* Соперника на сцене нет и на ЭТОЙ странице от него ничего не осталось — - * стирать и рисовать нечего, слот «тихий». Без этого пустой слот каждый - * кадр честно проходил heal + вход в pop_char_draw + fore-проход и стоил - * ~8 200 тактов из ничего (замер MAME, комната без стража). */ - if (who == POP_CH_OPP && Guard.charid == 0 && - !pop_cd[who].valid[p] && !pop_cd[who].ovalid[p]) - return 1; - if (!pop_cd[who].valid[p]) return 0; - if (pop_cd_dirty & (1 << p)) { /* фон правили — но задели ли нас? */ - /* СПРАЙТ И НАКЛАДНОЙ (клинок, брызги) — ДВУМЯ ОТДЕЛЬНЫМИ проверками, - * а не объединённым bbox. Объединение включает пустой угол между - * ними, и он ловит касания, которых на самом деле нет: у стоящего - * стража спрайт лежит в колонке 8, клинок уходит влево в колонку 7 на - * y 59..65, а пламя факела метит колонку 7 на y 33..50. Прямоугольник - * «спрайт + клинок» (x 241..284, y 46..84) пересекается с этой меткой - * углом — и персонаж перерисовывался целиком за 148 302 такта - * (замер 2026-08-19, сцена 11/15). - * - * Для skip_mask объединение по-прежнему годится: там вопрос «рядом ли - * два слота», и загрубление в бОльшую сторону безопасно. */ - if (pop_cd_hit_slot(who, p)) return 0; - } - return cd_sig_same(who, p); -} - -/* Запас вокруг габарита соседа: за кадр персонаж проходит заметно меньше - * (бег — ~11 экранных px), а прыжок с падением укладывается сюда же. */ -#define CD_MARGIN 32 - -uint8_t pop_char_skip_mask(void) __banked -{ - uint8_t p = gfx_get_draw_page() & 1; - uint8_t q0 = cd_quiet(POP_CH_KID, p); - uint8_t q1 = cd_quiet(POP_CH_OPP, p); - if (q0 && q1) return 3; /* оба стоят — пересечься нечему */ - if (q0 || q1) { - /* Один перерисовывается: его heal (и fore-проход по его окну) может - * задеть «тихого» соседа и выесть из него кусок. Прямоугольники - * рядом — перерисовываем ОБОИХ. */ - uint8_t st = (uint8_t)(q0 ? POP_CH_KID : POP_CH_OPP); - uint8_t mv = (uint8_t)(st ^ 1); - /* valid[st] тоже: «тихий» слот, в котором на этой странице НИЧЕГО не - * нарисовано (соперника на сцене нет), выесть невозможно, а bbox у - * него мусорный — правило соседства к нему неприменимо. */ - if (pop_cd[st].valid[p] && pop_cd[mv].valid[p]) { - int ax0, ay0, ax1, ay1, bx0, by0, bx1, by1; - cd_bbox(st, p, &ax0, &ay0, &ax1, &ay1); - cd_bbox(mv, p, &bx0, &by0, &bx1, &by1); - if (ax0 < bx1 + CD_MARGIN && bx0 < ax1 + CD_MARGIN && - ay0 < by1 + CD_MARGIN && by0 < ay1 + CD_MARGIN) return 0; - } - } - return (uint8_t)((q0 ? 1 : 0) | (q1 ? 2 : 0)); -} - -void pop_char_set_render_dx(uint8_t who, int dx) __banked -{ - pop_cd[who].render_dx = dx; -} - -/* Брызги урона (draw_hurt_splash, seg006:2003) — ОДИН порт на всех: у Кида - * это image 218 своего chtab_2, у соперника image 1 его chtab_5 (у - * add_midtable аргумент `obj_id + 1`, а get_image вычитает единицу обратно - * — тот же off-by-one, что расписан в шапке pop_pack_guard.py). Подъём: - * `((charid == kid) << 2) + 11`, то есть 15 у Кида и 11 у остальных. - * - * Рисуются МЕЖДУ персонажем и клинком: draw_kid/draw_guard кладут их в - * objtable сразу после персонажа и до клинка (seg008:22A2/22C9), а порядок - * записей и есть порядок рисования. */ -static void cd_splash(pop_cdraw_t *s, uint8_t who, const atlas_t *pages, - int fp_x, int obj_y) -{ - const atlas_t *ap; - uint8_t aidx; - const uint8_t *img; - uint8_t w, h; - int qx = fp_x, qy = obj_y; - int fw = (Char.direction < 0) ? -5 : 5; /* obj_dx_forward(5) */ - - if (Char.frame == 178) return; /* chomped: брызг нет */ - if (who == POP_CH_KID) { - if ((KID_SPLASH_IMAGE >> 3) >= kid_npages) return; /* страница не загружена */ - ap = &pages[KID_SPLASH_IMAGE >> 3]; aidx = KID_SPLASH_IMAGE & 7; - } else { - ap = &pages[0]; aidx = 1; - } - if (Char.frame == 185 || /* мёртв */ - (Char.frame >= 106 && Char.frame < 111)) { /* падение+посадка */ - qy += 4; - } else if (Char.frame == 177) { /* напоролся на пики */ - fw = -fw; /* obj_dx_forward(-5) */ - } else { - qy -= (who == POP_CH_KID) ? 15 : 11; - } - qx = scr_x(qx + fw); /* calc_screen_x_coord */ - img = (const uint8_t *)atlas_image(ap, aidx); - gfx_w0_map(ap->page); - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - if (w && h) { - int top = qy - (int)h + 1; - uint8_t flip = (uint8_t)(Char.direction >= 0); - int skip = 0, rows = (int)h; /* поле комнаты 0..192 */ - uint8_t dp; - if (flip) qx -= (int)w; - if (top < 0) { skip = -top; rows -= skip; top = 0; } - if (top + rows > 192) rows = 192 - top; - if (rows <= 0) return; - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (pop_onscreen_cols(qx, top + POP_YOFF, w, (uint8_t)rows)) - gfx_blit_cols_part_noclip(qx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part(qx, top + POP_YOFF, img, flip, skip, rows); - gfx_set_bank(GFX_BANK_NORMAL); - dp = gfx_get_draw_page() & 1; - cd_overlay_add(s, dp, qx, top, w, (uint8_t)rows); - cd_clip_add(s, qx, top, w, (uint8_t)rows); - } -} - -void pop_char_draw(uint8_t who) __banked -{ - pop_cdraw_t *s = &pop_cd[who]; - const pop_char_t *ch; - const kframe *fr; - const atlas_t *pages; - /* Атлас БРЫЗГ отдельно от кадра: у оригинала они всегда из «своего» - * chtab (Кид — chtab_2 image 218, прочие — chtab_5 image 1, - * seg006:2019), а у Тени кадр может прийти из другой половины набора. */ - const atlas_t *spl; - const uint8_t *img; - uint8_t npages, page, idx, dp, flip, hurt, lskip; - uint8_t w, h, vis_w; - int obj_x, obj_y, fp_x, fwd, top, bx, skip, rows, ct, cr; - int bcut; /* срез СНИЗУ (clip_char в перевёрнутом виде) */ - - /* Страховка пропуска (DRAW-COST): главный цикл мог решить, что слот - * «тихий», и heal не звать — а тик после этого персонажа всё-таки - * сдвинул. Здесь прошлый кадр уже точно надо стереть. Если heal в этом - * кадре был, вызов бесплатен: valid/ovalid уже сняты. */ - cd_heal(who); - - s->cw = 0; /* окно fore-клипа: пусто, пока не нарисовали */ - s->fpw = 0; /* габарит кадра: нечего перекрывать */ - - /* Окно Char (loadkid/loadshad) — как в оригинале: clip_char, футпринт и - * брызги работают с АКТИВНЫМ персонажем, а к этому моменту в Char лежит - * тот, кто тикал последним. Выгружать назад нечего: отрисовка только - * читает. */ - if (who == POP_CH_KID) { - pop_loadkid(); - ch = &Kid; fr = &kid_frame; pages = kidp; npages = kid_npages; - spl = kidp; - hurt = pop_kid_hurt; - } else { - pop_loadshad(); - ch = &Guard; fr = &pop_gframe; pages = gp; - npages = g_ok ? GUARD_PAGES : 0; - spl = gp; - hurt = pop_guard_hurt; - if (Guard.charid == 0) return; /* соперника на сцене нет */ - /* Набор атласов обязан идти за ТАБЛИЦЕЙ КАДРОВ — условие берём из - * того же места, что load_frame (seg006:0532), чтобы они не - * разъехались: вне боевых кадров 150..189 Тень ходит по таблице - * КИДА, и `image` из неё индексирует спрайты Кида. */ - if (Guard.charid == CHARID_1_SHADOW && pop_shadow_kid_n) { - /* У Тени СВОЙ запечённый набор (pop_shadow.h): её вид даёт - * наложение спрайта на себя со сдвигом, а пакетный блит так не - * умеет. Обе половины лежат в нём же, поэтому подмены на kidp - * здесь уже не нужно. */ - if (pop_frame_tbl_is_guard(Guard.charid, Guard.frame)) { - pages = pop_shadow_fgt; npages = pop_shadow_fgt_n; - } else { - pages = pop_shadow_kid; npages = pop_shadow_kid_n; - } - spl = pop_shadow_fgt; /* брызги — из половины chtab_5 */ - } else if (!pop_frame_tbl_is_guard(Guard.charid, Guard.frame)) { - pages = kidp; npages = kid_npages; - } - } - /* load_fram_det_col (seg008:22F5 / 2329) — кадр грузит САМА отрисовка, - * сразу после loadkid/loadshad. У нас его не было: kid_frame/pop_gframe - * считались кэшем, который наполняет тик (play_seq -> load_frame), а - * отрисовка берёт готовое. Кэш лагает — тот, кто пишет Char.frame МИМО - * play_seq, кадр не перезагружает, и рисуется прошлая картинка: - * - * do_init_shad (guards.c) кладёт тени frame = 15 (стойка) прямой - * записью, а pop_gframe в этот момент держит кадр 185 УБИТОГО СТРАЖА - * с прошлого уровня (после его смерти pop_guard_tick выходит по - * `charid == 0` РАНЬШЕ pop_load_fram_det_col, и кэш не трогается - * вообще). В кадре входа в комнату тень рисуется картинкой 33 - * (34x38, dx 3, dy 4) вместо 12x41 — да ещё из атласа КИДА, потому что - * набор выбирается по Guard.frame, а image приходит из кэша. - * - * Само по себе это моргнуло бы один кадр. Смертельным его делает - * пропуск неизменившегося кадра: снимок пишется по Guard.frame, то есть - * страница запоминает «нарисован кадр 15», хотя на ней чужой спрайт. - * Тень дальше стоит, снимок совпадает — страница НИКОГДА не - * перерисовывается, и дабл-буфер вечно мигает двумя разными позами - * (BUG-SHADOW-STALE-FRAME, уровень 6 комната 1). - * - * Лечим корень, а не симптом: после этой строки image ОДНОЗНАЧНО - * определяется парой (charid, frame), и снимок cd_sig снова описывает - * ровно то, что нарисовано. determine_col из связки НЕ берём: он пишет - * Char.curr_col, которую тут же читает clip_char, а физика колонку ведёт - * сама (расхождение с оригиналом — ../docs/impl_diff.md). */ - pop_load_frame(); - if (fr->image == 255) return; /* пустой кадр */ - - /* load_frame_to_obj (seg008:1728): НИЗ спрайта на obj_y, левый край на - * obj_x. +render_dx — straddle-смещение (∓140), когда комната персонажа - * не совпадает с отрисованной: спрайт за кромкой. Коллизия НЕ смещается - * — она в кадре своей комнаты, смещение чисто рендерное. */ - fwd = (int)ch->x + ((ch->direction < 0) ? -fr->dx : fr->dx) + s->render_dx; - obj_x = (fwd << 1) - 116; - obj_y = (int)ch->y + fr->dy; - if ((int8_t)(fr->flags ^ ch->direction) >= 0) - obj_x++; /* even/odd pixel (в ЛОГИЧЕСКОЙ X) */ - fp_x = obj_x; /* ЛОГИЧЕСКАЯ X — для футпринта */ - /* Позицию кадра публикуем СРАЗУ: её читает физика (check_spike_below — - * char_x_left активного персонажа), и она обязана обновиться даже в - * кадре, который рисовать нечем. Размер (fpw) — ниже, по факту кадра: - * он же служит признаком «есть что перекрывать» для fore-прохода. */ - s->fpx = fp_x; s->fpy = obj_y; - /* seg008 calc_screen_x_coord: логическая X (280 шир = 28px/тайл) -> - * экран (320 шир = 32px/тайл), ×320/280 = ×8/7. БЕЗ этого персонаж - * уезжает влево от тайлов тем сильнее, чем правее. Через scr_x — - * таблицей, без __divsint (см. шапку DIV7). */ - obj_x = scr_x(obj_x); - - page = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (page >= npages) return; /* страница набора не загружена */ - img = (const uint8_t *)atlas_image(&pages[page], idx); - /* ПЕРЕВОРОТ (зелье инверсии): тот же атлас, но страница с вертикально - * зеркальными пикселями — смещения лент и размеры кадров у копии те же, - * поэтому меняется ровно номер страницы (pop_vflip.h). Если EMM не - * дала страницу — рисуем обычной: неперевёрнутый кадр лучше дыры. */ - { - uint8_t vpg = pages[page].page; - if (pop_upside) { - uint8_t f = pop_vflip_page(vpg); - if (f) vpg = f; - } - gfx_w0_map(vpg); - } - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - dp = gfx_get_draw_page() & 1; - if (w && h) { - /* Спрайты нарисованы ЛИЦОМ ВЛЕВО (как в оригинале); seg008:864 — - * флип, когда персонаж смотрит ВПРАВО, и тогда xpos -= image->w - * (draw_mid). Флип column-major бесплатен, но зеркалит ВНУТРИ - * [x,x+w), поэтому при флипе подаём x−w. */ - flip = (uint8_t)(ch->direction >= 0); - bx = obj_x; - if (flip) bx -= (int)w; - top = obj_y - (int)h + 1; - /* Поле переворачивается вокруг своей середины: строка t уходит в - * (POP_PLAYFIELD_H - 1 - t), значит верх кадра [top, top+h) — - * в 192 - top - h, что при top = obj_y-h+1 даёт ровно 191 - obj_y. - * Пиксели уже зеркальны (страница выше), поэтому дальше всё - * считается как обычно: «пропустить skip строк сверху» у зеркальной - * ленты означает «срезать снизу» у оригинала — ровно то, что нужно. */ - if (pop_upside) top = (POP_PLAYFIELD_H - 1) - obj_y; - vis_w = w; - lskip = 0; - skip = 0; - bcut = 0; - /* clip_char (seg006:1231/1749): тайл над головой — стена/пол → всё - * выше линии полосы своего ряда НЕ рисуется, иначе персонаж - * просвечивает сквозь щели кладки при спуске/висе. */ - /* clip_char (seg006:1231/1749): тайл над головой — стена/пол → всё - * выше линии полосы своего ряда НЕ рисуется. Граница приходит в - * ЛОГИЧЕСКИХ координатах поля (y_clip), и при перевороте её нельзя - * сравнивать с уже отражённым top: то, что логически «выше линии», - * на экране оказывается НИЖЕ неё. Поэтому в перевороте тот же - * срез применяется с другого конца — укорачивает кадр снизу - * (bcut), а верх (top) остаётся на месте. Строки ленты при этом - * не сдвигаются: зеркальная лента отдаёт их в обратном порядке, - * так что «убрать последние bcut строк вывода» = «не рисовать - * первые bcut строк оригинала», а это ровно то, что просит - * clip_char. */ - ct = pop_clip_char_top(fp_x, obj_y, w, h); - if (!pop_upside) { - if (ct > top) { - skip = ct - top; - if (skip > (int)h) skip = (int)h; /* обрезан целиком */ - top = ct; - } - } else { - int top_log = obj_y - (int)h + 1; /* верх кадра ДО отражения */ - if (ct > top_log) { - bcut = ct - top_log; - if (bcut > (int)h) bcut = (int)h; - } - } - /* Вторая половина clip_char: правый косяк двери уровня. Дверь - * рисуется ПОД персонажем (вся в backtable), поэтому спрятать - * поднимающегося по лестнице можно только срезав спрайт. */ - cr = pop_clip_char_right(); - if (cr) { - int avail = cr - bx; - if (avail <= 0) vis_w = 0; /* весь спрайт за косяком */ - else if (avail < (int)w) vis_w = (uint8_t)avail; - } - /* КЛИП ТЕНИ СЛЕВА (seg008:1699): на уровне зеркала она может - * показываться ТОЛЬКО СПРАВА от него — - * obj_clip_left = 137 + (mirror_column-4)*32. */ - if (ch->charid == CHARID_1_SHADOW && - pop_current_level == MIRROR_LEVEL && ch->room == MIRROR_ROOM) { - int cl = 137 + (MIRROR_COL - 4) * 32; - if (bx < cl) { - int d = cl - bx; - if (d >= (int)vis_w) vis_w = 0; /* вся тень левее линии */ - else lskip = (uint8_t)d; - } - } - /* Поле комнаты — 192 строки (reset_obj_clip, seg006:0507: - * obj_clip_top = 0, obj_clip_bottom = 192). Персонаж, вышедший за - * него (скелет, падающий в пропасть), обязан обрезаться: ниже поля - * идёт полоса HP, и без клипа спрайт лез прямо на неё. */ - rows = (int)h - skip - bcut; - if (top < 0) { skip += -top; rows += top; top = 0; } - if (top + rows > 192) rows = 192 - top; - gfx_set_bank(GFX_BANK_SPRITE); /* видео-ОЗУ, без теневой копии */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (rows > 0 && vis_w) { /* +YOFF: центрирование */ - /* noclip-ядро ширину не ограничивает, поэтому при обрезке справа - * идём общим путём: это редкие кадры (подъём в двери уровня раз - * за уровень), цена подготовки там не видна. */ - if (lskip) /* тень у зеркала: срез слева */ - gfx_blit_cols_part_wx(bx, top + POP_YOFF, img, flip, skip, rows, - lskip, (uint8_t)(vis_w - lskip)); - else if (vis_w == w && pop_onscreen_cols(bx, top + POP_YOFF, w, (uint8_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part_w(bx, top + POP_YOFF, img, flip, skip, rows, - (uint8_t)(vis_w == w ? 0 : vis_w)); - } else rows = 0; - gfx_set_bank(GFX_BANK_NORMAL); - /* heal чистит ТОЛЬКО нарисованное: иначе стирается кромка пола над - * срезом (мусор/дыра в кладке на второй странице дабл-буфера). */ - s->x[dp] = bx + lskip; s->y[dp] = top; - s->w[dp] = (uint8_t)(vis_w - lskip); s->h[dp] = (uint8_t)rows; - s->valid[dp] = (uint8_t)(rows != 0); - if (rows) cd_clip_add(s, bx, top, vis_w, (uint8_t)rows); - s->fpw = w; s->fph = h; /* габарит КАДРА (не обрезанный): */ - /* по нему считается футпринт */ - } - pop_dbg_m15(); /* ЗАМЕР: снимок прямоугольника сделан */ - if (hurt) cd_splash(s, who, spl, fp_x, obj_y); - /* add_sword_to_objtable (seg006:1798): клинок отдельным спрайтом поверх - * персонажа — со своим прямоугольником heal. */ - { - int sx, sy; uint16_t sw, sh; - if (pop_sword_draw(ch, fr, obj_x, obj_y, &sx, &sy, &sw, &sh)) { - cd_overlay_add(s, dp, sx, sy, sw, sh); - cd_clip_add(s, sx, sy, sw, sh); - } - } - pop_dbg_m16(); /* ЗАМЕР: splash + клинок сделаны */ - gfx_w0_unmap(); - /* Что именно нарисовано на ЭТОЙ странице — снимок для пропуска - * следующих кадров (DRAW-COST). Только если кадр РЕАЛЬНО рисовали: - * при нулевом спрайте (`w && h` ложно — пустая запись атласа) блок выше - * не выполняется, и x/y/w/h/valid остаются от ПРОШЛОГО кадра этой - * страницы. Снимок же брался всегда — и слот залипал: cd_quiet видел - * valid = 1 и совпавшую сигнатуру, то есть считал «на странице - * нарисовано ровно то, что нужно», а на ней стоял старый спрайт. Так - * тень оставалась на двух страницах дабл-буфера в РАЗНЫХ позах и мигала - * между ними (BUG-CHAR-STALE-PAGE). Без снимка слот просто не будет - * «тихим», и следующий кадр начнётся с heal — старое сотрётся. */ - if (w && h) cd_sig_make(who, &cd_sig[who][dp]); -} - -void pop_char_fore(uint8_t who) __banked -{ - pop_cdraw_t *s = &pop_cd[who]; - /* Окно fore-клипа — одно на всех, и ставит его КАЖДЫЙ, кто рисует - * персонажа. Пока соперник рисовался строго ДО Кида, к моменту прохода - * в окне оказывался Кид и всё сходилось само; как только порядок стал - * переменным (кто ниже — тот поверх), при «соперник поверх» окно - * оставалось ЕГО, и fore-проход Кида отсекался целиком — Кид рисовался - * поверх передних столбов. Поэтому окно ставится здесь, а не держится - * «по счастливому порядку вызовов». */ - pop_fore_set_clip(s->cx, s->cy + POP_YOFF, (int)s->cw, (int)s->ch); - if (s->fpw) - pop_fore_over_char(who == POP_CH_KID ? &Kid : &Guard, - s->fpx, s->fpy, s->fpw, s->fph); - pop_dbg_b6(); /* ЗАМЕР: pop_char_fore целиком */ -} - -/* ---- ОТРАЖЕНИЕ В ЗЕРКАЛЕ (check_mirror, seg003:0798) ---------------- * - * - * Пока Кид стоит на тайле зеркала, оригинал каждый кадр рисует его - * зеркальную копию. ОТДЕЛЬНОЙ функцией, а не третьим слотом pop_cd — и это - * не экономия, а структура САМОГО оригинала: отражение идёт сокращённым - * путём `load_frame_to_obj(); reset_obj_clip(); add_objtable(4)`, а НЕ через - * add_kid_to_objtable. У него нет ни клинка, ни брызг, ни fore-прохода, ни - * пропуска неизменившегося кадра — гейтить всё это в общем теле значило бы - * добавить ветки в самый горячий путь ради двух секунд за игру. - * - * Char к моменту вызова уже ОТРАЖЁН вызывающим (pop_check_mirror -> - * mirror_image), поэтому здесь никакого «зеркалим» нет — обычная математика - * кадра, та же, что в pop_char_draw (см. там load_frame_to_obj, seg008:1728; - * шесть строк намеренно продублированы, а не вынесены: трогать горячее тело - * ради холодного вызова дороже, чем держать их синхронными по комментарию). - */ -static int mi_x[2], mi_y[2]; -static uint16_t mi_w[2], mi_h[2]; -static uint8_t mi_valid[2]; - -void pop_mirror_heal(void) __banked -{ - uint8_t p = gfx_get_draw_page() & 1; - if (!mi_valid[p]) return; - pop_heal_fast(mi_x[p], mi_y[p] + POP_YOFF, mi_w[p], mi_h[p]); - mi_valid[p] = 0; -} - -void pop_mirror_draw(int clip_top) __banked -{ - uint8_t dp = gfx_get_draw_page() & 1; - const kframe *fr = &kid_frame; - const uint8_t *img; - uint8_t page, idx, flip; - uint8_t w, h, vis_w; - int fwd, obj_x, obj_y, fp_x, bx, top, skip = 0, rows, cl; - uint8_t lskip = 0; - - if (fr->image == 255) return; - page = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (page >= kid_npages) return; - - fwd = (int)Char.x + ((Char.direction < 0) ? -fr->dx : fr->dx); - obj_x = (fwd << 1) - 116; - obj_y = (int)Char.y + fr->dy; - if ((int8_t)(fr->flags ^ Char.direction) >= 0) obj_x++; - fp_x = obj_x; /* ЛОГИЧЕСКАЯ X — её ждёт fore-проход */ - obj_x = scr_x(obj_x); - - img = (const uint8_t *)atlas_image(&kidp[page], idx); - gfx_w0_map(kidp[page].page); - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - if (!w || !h) { gfx_w0_unmap(); return; } - flip = (uint8_t)(Char.direction >= 0); - bx = flip ? obj_x - (int)w : obj_x; - top = obj_y - (int)h + 1; - - /* Клип СВЕРХУ — y_clip[curr_row+1] оригинала: отражение не должно - * вылезать из проёма зеркала вверх. Значение считает вызывающий - * (таблица y_clip живёт в pop_map). */ - if (clip_top > top) { skip = clip_top - top; top = clip_top; } - rows = (int)h - skip; - if (top < 0) { skip += -top; rows += top; top = 0; } - if (top + rows > 192) rows = 192 - top; - vis_w = w; - if (rows <= 0) { gfx_w0_unmap(); return; } - - /* Клип СЛЕВА — obj_clip_left = (curr_col<<5)+9: отражение видно только - * внутри проёма зеркала. Настоящей обрезкой колонок - * (gfx_blit_cols_part_wx), а не «нарисовать и вернуть фон»: для - * column-major левая обрезка стоит столько же, сколько правая. */ - cl = ((int)Char.curr_col << 5) + 9; - if (bx < cl) { - int d = cl - bx; - if (d >= (int)vis_w) { gfx_w0_unmap(); return; } /* целиком за краем */ - lskip = (uint8_t)d; - } - - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (lskip) - gfx_blit_cols_part_wx(bx, top + POP_YOFF, img, flip, skip, rows, - lskip, (uint8_t)(vis_w - lskip)); - else if (pop_onscreen_cols(bx, top + POP_YOFF, vis_w, (uint16_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part_w(bx, top + POP_YOFF, img, flip, skip, rows, 0); - gfx_set_bank(GFX_BANK_NORMAL); - gfx_w0_unmap(); - - mi_x[dp] = bx + lskip; mi_y[dp] = top; - mi_w[dp] = (uint16_t)(vis_w - lskip); mi_h[dp] = (uint16_t)rows; - mi_valid[dp] = 1; - - /* FORE-ПРОХОД ПОВЕРХ ОТРАЖЕНИЯ — обязателен, и без него картинка неверна. - * В оригинале отражение уходит в objtable (add_objtable(4)), а дальше его - * накрывает передний слой тайлов на общих основаниях; у зеркала это - * fore_id 77 — ПЕРЕДНЯЯ ЧАСТЬ АРКИ. Именно она прячет то, что вылезло из - * проёма: ноги ниже нижней кромки и голову с руками выше верхней (видно - * на прыжке). Клип obj_clip_top этого НЕ делает — при curr_row = 0 он - * равен y_clip[1] = 3, то есть почти не режет; работу выполняет фон. - * - * Мы рисуем отражение мимо конвейера персонажей, поэтому проход надо - * позвать руками — ровно как это делает pop_char_fore для слотов. */ - pop_fore_set_clip(bx + lskip, top + POP_YOFF, - (int)(vis_w - lskip), rows); - pop_fore_over_char(&Char, fp_x, obj_y, w, h); -} - -/* ---- Индикаторы HP (порт draw_kid_hp / draw_guard_hp, seg000:1416) --- * - * Оригинал рисует их в статус-полосе на y = 194 (ниже поля тайлов, внутри - * тех же 200 строк экрана PoP): HP Кида слева направо шагом 7, HP стража - * справа налево от x = 314. Пустые деления у Кида — свой спрайт (chtab_2 - * id 217); у стража оригинал печатает тот же спрайт ЧЁРНЫМ силуэтом, а мы - * просто не печатаем — полоса и так на чёрном фоне. - * - * Спрайты Кида (216/217) лежат в его же атласах, поэтому блитим через - * pop_kid_img_blit; спрайт стража — image 0 его chtab (наша страница 0). */ -#define HP_Y POP_HP_Y /* полосу делит UI: см. pop_cdraw.h */ -#define HP_STEP 7 -#define HP_KID_FULL 216 -#define HP_KID_EMPTY 217 -#define HP_MAXDRAW 10 /* больше в полосу всё равно не влезает */ - -/* Полоса перерисовывается ТОЛЬКО когда числа изменились — и тогда на ОБЕИХ - * страницах дабл-буфера (иначе на второй останется старое значение и его - * будет видно как мерцание через кадр). Отсюда счётчик страниц, а не флаг. - * - * Снимки прошлых значений пишем ДО сравнения: `if (n != s) s = n;` SDCC z80 - * собирает неверно — SUB затирает A, и в s уезжает разность (memory - * sdcc_z80_cmp_store_a_bug). */ -static uint8_t hp_todo; /* сколько страниц ещё обновить */ -static uint8_t hp_kid_prev, hp_kidmax_prev, hp_gd_prev, hp_gdmax_prev; - -/* Заставить перерисовать полосу на обеих страницах: звать при входе в - * комнату (фон перерисован целиком и стёр её) и при старте. */ -void pop_hp_invalidate(void) __banked { hp_todo = 2; } - -void pop_hp_draw(void) __banked -{ - uint8_t i, n; - uint8_t gd = (uint8_t)(Guard.charid ? guardhp_curr : 0); - uint8_t gm = (uint8_t)(Guard.charid ? guardhp_max : 0); - - { /* Изменилось хоть одно число — обновить обе страницы. */ - uint8_t k = hitp_curr, km = hitp_max; - uint8_t changed = (uint8_t)(k != hp_kid_prev || km != hp_kidmax_prev || - gd != hp_gd_prev || gm != hp_gdmax_prev); - hp_kid_prev = k; hp_kidmax_prev = km; - hp_gd_prev = gd; hp_gdmax_prev = gm; - if (changed) hp_todo = 2; - } - if (hp_todo == 0) return; - hp_todo--; - - /* Стереть прошлую полосу. Фон под ней — НЕ цвет 0, а POP_COL_OUTSIDE - * (в палитре тоже чёрный): вспышки подменяют нулевой цвет, и полоса HP - * не должна мигать вместе с игровым полем (pop_ui.h). */ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - /* Полосу мы делим со статус-строкой (pop_status.h): пока в ней висит - * текст, его зону не трогаем — иначе он мигал бы при каждом изменении - * жизней. Деления Кида левее POP_STATUS_L, стража — правее POP_STATUS_R, - * так что чистить края по отдельности достаточно. */ - if (pop_status_ticks) { - bar(0, HP_Y + POP_YOFF, POP_STATUS_L - 1, HP_Y + POP_YOFF + 6); - bar(POP_STATUS_R + 1, HP_Y + POP_YOFF, 319, HP_Y + POP_YOFF + 6); - } else { - bar(0, HP_Y + POP_YOFF, 319, HP_Y + POP_YOFF + 6); - } - - /* Кид: сначала пустые деления, поверх — полные (порядок оригинала). */ - n = (uint8_t)(hitp_max > HP_MAXDRAW ? HP_MAXDRAW : hitp_max); - for (i = hitp_curr; i < n; i++) - pop_kid_img_blit(HP_KID_EMPTY, (int)i * HP_STEP, HP_Y + POP_YOFF); - for (i = 0; i < hitp_curr && i < HP_MAXDRAW; i++) - pop_kid_img_blit(HP_KID_FULL, (int)i * HP_STEP, HP_Y + POP_YOFF); - - /* Страж: только полные деления, справа налево. Скелет полосы не имеет, - * мышь (спецсобытие уровня 8) — тоже: draw_guard_hp, seg000:1159. */ - if (g_ok && Guard.charid != 0 && Guard.charid != CHARID_4_SKELETON && - Guard.charid != CHARID_24_MOUSE && gd) { - const uint8_t *img = (const uint8_t *)atlas_image(&gp[0], 0); - uint8_t w, h; - gfx_w0_map(gp[0].page); - w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - if (w && h) { - /* Атлас стража тоже column-major — блит колоночный. */ - n = (uint8_t)(gd > HP_MAXDRAW ? HP_MAXDRAW : gd); - for (i = 0; i < n; i++) { - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_blit_cols_part_noclip(314 - (int)i * HP_STEP, - HP_Y + POP_YOFF, img, 0, 0, 0); - } - } - gfx_w0_unmap(); - } -} diff --git a/applications/PoP/roomtest/pop_cdraw.h b/applications/PoP/roomtest/pop_cdraw.h deleted file mode 100644 index 8049dc7..0000000 --- a/applications/PoP/roomtest/pop_cdraw.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * pop_cdraw.h — ОТРИСОВКА ПЕРСОНАЖА, одна на всех Char. - * - * В оригинале это два входа с ИДЕНТИЧНЫМ телом (seg008:22F0/2324): - * - * add_kid_to_objtable add_guard_to_objtable - * loadkid() loadshad() - * load_fram_det_col() load_fram_det_col() - * load_frame_to_obj() load_frame_to_obj() - * stuck_lower() stuck_lower() - * set_char_collision() set_char_collision() - * set_objtile_at_char() set_objtile_at_char() - * redraw_at_char() redraw_at_char() - * redraw_at_char2() redraw_at_char2() - * clip_char() clip_char() - * add_objtable(0) add_objtable(1 тень / 2 страж) - * - * — различаются ТОЛЬКО окном (loadkid/loadshad), набором спрайтов и типом - * объекта. У нас до DRAW-CHAR это были два независимых куска кода - * (kid_draw в резиденте и pop_guard_draw в банке), и расхождение уже стоило - * бага: падающий скелет рисовался поверх верхней грани пола соседней - * колонки, потому что порт redraw_at_char2 был только у Кида. Тем же путём - * пошли бы тень (ур. 4/5/6/12), визирь (13) и толстяк (12). - * - * Поэтому здесь ОДИН набор функций, а различия сведены к слоту: - * POP_CH_KID — Кид: окно loadkid, атласы chtab_2 (kidp), кадр kid_frame; - * POP_CH_OPP — соперник: окно loadshad, атласы chtab_5 (страж/скелет), - * кадр pop_gframe. - * - * Порядок в кадре (задаёт главный цикл, как draw_people): - * pop_char_heal(who) — стереть прошлый кадр ЭТОЙ страницы дабл-буфера; - * pop_char_draw(who) — спрайт + брызги урона + клинок; - * pop_char_fore(who) — передние грани и оверлеи тайлов ПОВЕРХ него. - */ -#ifndef POP_CDRAW_H -#define POP_CDRAW_H - -#include - -/* Нижняя статус-полоса: строка делений HP. Живёт здесь, а не в pop_cdraw.c, - * потому что её делит UI — «GAME PAUSED» в оригинале пишется в ту же полосу - * (SDLPoP rect_bottom_text = {193,70,202,250}), между делениями Кида слева и - * стража справа. */ -#define POP_HP_Y 194 - -#define POP_CH_KID 0 -#define POP_CH_OPP 1 -#define POP_CH_N 2 - -/* Состояние отрисовки одного слота. Публичное, потому что метрики кадра - * (fp*) читает физика из ДРУГОГО банка (char_width_half в - * set_char_collision, порядок «кто поверх кого» в pop_bg): данные лежат в - * _DATA (W2) и видны всем без трамплина, а вызов аксессора из банка стоил - * бы дороже самого чтения. */ -typedef struct { - /* прямоугольник спрайта по СТРАНИЦАМ дабл-буфера: у каждой своя - * видео-ОЗУ и своя ОЗУ-копия, поэтому heal обязан стирать спрайт именно - * той страницы, в которую сейчас рисуем */ - int x[2], y[2]; - uint8_t w[2], h[2]; /* габарит: спрайты игры не крупнее 64x64 */ - uint8_t valid[2]; - /* НАКЛАДНЫЕ спрайты (клинок + брызги урона) — свой прямоугольник, не - * объединение с персонажем: объединение сильно больше суммы двух - * (клинок уходит вперёд-вверх), а heal стоит ровно по площади */ - int ox[2], oy[2]; - uint8_t ow[2], oh[2]; - uint8_t ovalid[2]; - /* габарит кадра для fore-прохода: fpx — ЛОГИЧЕСКАЯ X (до ×8/7), - * fpy — низ спрайта; fpw == 0 — в этом кадре рисовать было нечего */ - int fpx, fpy; - uint8_t fpw, fph; - /* окно fore-клипа слота (объединение «спрайт + накладные»), КОМНАТНЫЙ y */ - int cx, cy; - uint8_t cw, ch; - /* straddle: рендерное смещение по ЛОГИЧЕСКОЙ X, когда комната персонажа - * не совпадает с отрисованной (порт xpos_in_drawn_room) */ - int render_dx; -} pop_cdraw_t; - -extern pop_cdraw_t pop_cd[POP_CH_N]; - -/* Забыть, что нарисовано на обеих страницах: после меню, QuickLoad и любой - * другой перерисовки экрана мимо кадрового конвейера. Без этого пропуск - * перерисовки «тихого» персонажа оставляет его невидимым. */ -void pop_cd_forget(void) __banked; - -/* Стереть прошлый кадр персонажа (спрайт + накладные) на ТЕКУЩЕЙ странице. */ -void pop_char_heal(uint8_t who) __banked; - -/* Нарисовать текущий кадр: спрайт, брызги урона (по флагу pop_kid_hurt / - * pop_guard_hurt) и клинок. Загружает окно Char сам — clip_char и футпринт - * работают с АКТИВНЫМ персонажем, как в оригинале. */ -void pop_char_draw(uint8_t who) __banked; - -/* Передние грани и оверлеи тайлов ПОВЕРХ персонажа: ставит окно fore-клипа - * слота и зовёт общий проход pop_fore_over_char. Отдельным вызовом, а не - * хвостом pop_char_draw, потому что порядок в кадре задаёт главный цикл: - * между спрайтом и его fore-слоем успевает нарисоваться падающая плита. */ -void pop_char_fore(uint8_t who) __banked; - -/* Straddle-смещение спрайта (см. render_dx). */ -void pop_char_set_render_dx(uint8_t who, int dx) __banked; - -/* ---- Пропуск НЕИЗМЕНИВШЕГОСЯ кадра (DRAW-COST) ---------------------- * - * heal + спрайт + fore-проход стоят ~50 % кадрового периода НА ПЕРСОНАЖА - * (замер пользователя 2026-08-08: комната 1.3 с телом убитого стража — 210 % - * кадра, соседняя 1.2 без тела — 140 %). Платили мы это и за то, что не - * менялось: труп лежит неподвижно до выхода из комнаты, стоящий Кид — пока - * игрок не нажал клавишу, а перерисовывались они каждый кадр. - * - * Оптимизация: у каждой страницы дабл-буфера свой снимок ВХОДОВ отрисовки - * слота (поза, координаты, направление, меч, брызги, straddle). Если снимок - * совпал, спрайт этой страницы не стёрт и фона под ним никто не трогал — - * нужный кадр на странице УЖЕ нарисован, и heal/draw/fore пропускаются - * целиком. - * - * `pop_cd_touch` — «фон трогали ВОТ ЗДЕСЬ»: слой фона копит ПРЯМОУГОЛЬНИК - * своих правок по страницам дабл-буфера, и слот перерисовывается, только - * если тот задел его самого. Флага «трогали хоть что-то» не хватило: - * факелы анимируются КАЖДЫЙ кадр, и один факел в комнате обнулял пропуск - * для всех персонажей сразу (замер 2026-08-08: комната 1.1, Кид стоит — - * 597 684 такта, то есть ровно как без оптимизации). - * - * Метку ставит сам блит фона (`pop_blit_b`, по признаку «идёт не - * fore-проход») плюс те немногие места, что стирают фон голым `bar` или - * своим heal (падающий кусок, оверлей fore-heal). Координаты — ЭКРАННЫЕ - * (с POP_YOFF). Прямоугольник копится сразу для ОБЕИХ страниц: правку фона - * почти всегда повторяют на второй, а лишняя перерисовка персонажа дешевле - * лишнего состояния. Снимает метку главный цикл — после того, как - * персонажи на этой странице отрисованы. - * - * Резидент (pop_tile.c): зовёт и банковый слой фона, и резидентные листья, - * а трамплин на КАЖДЫЙ кусок фона стоил бы дороже самой метки. */ -extern uint8_t pop_cd_dirty; /* биты страниц: метка взведена */ -/* [страница][колонка] = диапазон затронутых ЭКРАННЫХ y; пусто = ymin 255, - * ymax 0. Раньше тут была маска колонок на три ряда по 63 px — она - * склеивала касания внутри ряда и заставляла перерисовывать нетронутого - * персонажа (разбор в шапке pop_cd_touch, pop_tile.c). */ -extern uint8_t pop_cd_ymin[2][10], pop_cd_ymax[2][10]; -/* Задели ли прямоугольник (ЭКРАННЫЕ координаты, x1/y1 включительно) то, - * что трогали на странице p. Резидент (pop_tile.c). */ -uint8_t pop_cd_hit(uint8_t p, int x0, int y0, int x1, int y1) __banked; -/* То же для СЛОТА персонажа: спрайт и накладной, координаты изнутри pop_cd - * (см. тело — там про цену пяти аргументов). */ -uint8_t pop_cd_hit_slot(uint8_t who, uint8_t p) __banked; -void pop_cd_clear(uint8_t p) __banked; /* снять метку страницы целиком */ -void pop_cd_init(void) __banked; /* пустые диапазоны на обеих страницах */ -void pop_cd_touch(int x, int y, int w, int h); -#define POP_CD_TOUCH_ALL() pop_cd_touch(0, 0, 320, 256) - -/* Пакетная пометка: между begin и end блиты КОПЯТ общий прямоугольник, и - * настоящая пометка ставится одна (на весь тайл), а не на каждый кусок. - * Скобку ставит draw_tile — выигрыш ~15% цены блита фона. Вкладывать - * скобки нельзя: аккумулятор один. */ -extern uint8_t pop_cd_batch; -void pop_cd_batch_begin(void); -void pop_cd_batch_end(void); - -/* ПОДАВИТЬ пометки на время серии блитов — для того, кто пометил область САМ - * и заведомо шире, чем нарисует (падающий кусок: pop_loose_mob_tick помечает - * весь коридор heal'а одним вызовом, а спрайт куска — три блита внутри него). - * Дешевле пакета: pop_cd_touch выходит второй проверкой, не считая ни колонок, - * ни рядов. Замер 2026-08-17: настоящий вызов pop_cd_touch = 4 502 такта, - * 28% всей цены блита. - * - * ОПАСНО применять без разбора: пропущенная пометка = персонаж, которого - * стёрли, но не попросили перерисоваться, то есть исчезнувший со экрана - * персонаж (ровно этот баг ловили 2026-08-13 в комнате 23). Ставить только - * там, где покрытие доказано. */ -void pop_cd_mute(void); -void pop_cd_unmute(void); - -/* Кого в этом кадре можно НЕ перерисовывать: бит 0 — Кид, бит 1 — соперник. - * Звать ДВАЖДЫ: перед heal (стирать нечего) и перед отрисовкой (тик мог - * персонажа всё-таки сдвинуть — тогда бит снимется сам, а pop_char_draw - * сотрёт прошлый кадр за нас). */ -uint8_t pop_char_skip_mask(void) __banked; - -/* ОТРАЖЕНИЕ В ЗЕРКАЛЕ (уровень 4, seg003:0798). Char к моменту вызова уже - * отражён (pop_check_mirror); clip_top — линия y_clip[curr_row+1], выше - * которой отражение не рисуется. Отдельно от pop_char_draw, потому что и в - * оригинале это сокращённый путь add_objtable(4): без клинка, брызг, - * fore-прохода и пропуска кадра. heal — парный вызов, рядом с - * pop_char_heal. */ -void pop_mirror_draw(int clip_top) __banked; -void pop_mirror_heal(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_cfg.h b/applications/PoP/roomtest/pop_cfg.h deleted file mode 100644 index 78eefe9..0000000 --- a/applications/PoP/roomtest/pop_cfg.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * pop_cfg.h — файл настроек POP.CFG (план docs/menu_settings_plan.md §6). - * Единственный владелец формата — модули pop_cfg_*; gameplay читает - * только pop_settings (pop_settings.h). - */ -#ifndef POP_CFG_H -#define POP_CFG_H - -#include - -/* Читает POP.CFG в pop_settings; файла нет / битый — остаются дефолты. - * 1 — прочитано из файла, 0 — дефолты (штатно), -1 — нет памяти. */ -int8_t pop_cfg_load(void) __banked; - -/* Записывает текущие pop_settings в POP.CFG. Звать после Apply/выхода - * из Settings. 1 — записано, 0 — ошибка записи, -1 — нет памяти. */ -int8_t pop_cfg_save(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_char.h b/applications/PoP/roomtest/pop_char.h deleted file mode 100644 index b12e3a7..0000000 --- a/applications/PoP/roomtest/pop_char.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * pop_char.h — состояние ПЕРСОНАЖА, общее для Кида, стража и активной - * копии Char. Порт char_type (types.h:302). - * - * Зачем отдельным заголовком: интерпретатор последовательностей в - * оригинале один на всех (работает с Char, а вокруг стоят - * loadkid/savekid и loadshad/saveshad, seg006:809). Пока у Кида был свой - * усечённый тип, а у стража свой, общий интерпретатор был невозможен. - * Поля и их порядок — как в char_type, чтобы порт seg005/seg006 ложился - * один в один. - */ -#ifndef POP_CHAR_H -#define POP_CHAR_H - -#include - -typedef struct { - uint8_t frame; - uint8_t x, y; - int8_t direction; /* -1 влево, 0 вправо */ - int8_t curr_col, curr_row; - uint8_t action; - int8_t fall_x, fall_y; - uint8_t room; - uint8_t repeat; - uint8_t charid; /* 0 = Kid, 2 = страж (см. CHARID_* в pop_guard.h) */ - uint8_t sword; - int8_t alive; /* -1 = жив (как в оригинале), 0 = убит */ - uint16_t curr_seq; /* адрес в seqtbl (база SEQTBL_BASE) */ -} pop_char_t; - -#endif diff --git a/applications/PoP/roomtest/pop_cheat.h b/applications/PoP/roomtest/pop_cheat.h deleted file mode 100644 index 4b24108..0000000 --- a/applications/PoP/roomtest/pop_cheat.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * pop_cheat.h — режим читов (порт cheats_enabled, seg000:111). - * - * В оригинале включается ключом командной строки megahit/debug и меняет - * набор доступных клавиш. У нас конфигурации/UI пока нет, поэтому это - * просто глобальный флаг: main ставит его при старте (на время разработки — - * ВКЛЮЧЁН). Клавиши читов обрабатывает главный цикл. - * - * Реализовано: K — убить стража (seg000:786), I/S/Shift+L (наши отладочные), - * [ / ] — подгонка Кида по X (seg000:1828), U — переворот экрана - * (seg000:793), F7/F8 — минута −/+ (аналог оригинальных keypad −/+). - * Остальные читы оригинала (перо, воскрешение, переход по комнатам) пока - * не портированы. - */ -#ifndef POP_CHEAT_H -#define POP_CHEAT_H - -#include -#include "pop_level.h" - -extern uint8_t pop_cheats; /* 0 = выключены, иначе включены */ - -#define KBD_CHEAT_KILL 0x42 /* K (PS/2 set 2) — kill guard */ -#define KBD_CHEAT_IMMO 0x43 /* I (PS/2 set 2) — бессмертие Кида по кругу - * 0 -> 1 (только бой) -> 2 (и мелкий урон) -> 0; - * уровни расписаны в pop_state.h */ -/* Ctrl+S (PS/2 set 2: S = 0x1B) — вкл/выкл звук; порт Ctrl+S из SDLPoP - * (seg000:657). С Ctrl, а не голая S: у оригинала клавиша именно такая. */ -#define KBD_SOUND_TOGGLE 0x1B -/* Ctrl+M — тумблер МУЗЫКИ, парный к Ctrl+S. Отдельный потому, что музыка - * у нас поток с диска: её выключают по другим причинам, чем эффекты. */ -#define KBD_MUSIC_TOGGLE 0x3A /* M (PS/2 set 2) */ -#define KBD_CHEAT_NEXTLVL 0x4B /* Shift+L (PS/2 set 2) — следующий уровень */ -#define KBD_CHEAT_XDEC 0x54 /* [ (PS/2 set 2) — сдвинуть Кида на 1 px влево */ -#define KBD_CHEAT_XINC 0x5B /* ] (PS/2 set 2) — сдвинуть Кида на 1 px вправо */ -#define KBD_CHEAT_UPSIDE 0x3C /* U (PS/2 set 2) — переворот экрана (toggle_upside, - * seg000:0793: в оригинале это тоже ЧИТ-клавиша). - * Без него зелье инверсии проверяется только - * честным проходом уровня 9 до комнаты 7. */ -/* F7/F8 свободны в игровой раскладке. Numpad +/- уже принадлежат ROOMNAV, - * поэтому буквально оригинальные клавиши здесь были бы опасным конфликтом. */ -#define KBD_CHEAT_TIME_SUB 0x83 /* F7 (PS/2 set 2) — отнять минуту */ -#define KBD_CHEAT_TIME_ADD 0x0A /* F8 (PS/2 set 2) — добавить минуту */ - - -/* Старое имя оставлено для обработчика Shift+L; граница одна — pop_level.h. */ -#define POP_LAST_LEVEL POP_LEVEL_LAST - -#endif diff --git a/applications/PoP/roomtest/pop_config.c b/applications/PoP/roomtest/pop_config.c deleted file mode 100644 index e5a2d3f..0000000 --- a/applications/PoP/roomtest/pop_config.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * pop_config.c — ВСЯ модель пользовательских настроек и POP.CFG (банк 9). - * - * Здесь вместе живут state, дефолты, бинарный codec и DSS I/O: это один - * модуль приложения, не библиотека. Данные остаются в общем W2 (для - * --bank-data нет ключа), код уезжает в банк 9. Игра читает только - * pop_settings либо свои runtime-флаги, которые синхронизирует - * pop_settings_apply(). - * - * POP.CFG v1: - * 0..3 "PCFG", 4 version, 5..6 payload size LE, payload, XOR, ~XOR. - * Неверный файл не меняет уже установленные дефолты. Расширенный payload - * v1 допустим: известны первые девять байтов, неизвестный хвост пропускается. - */ -#include -#include - -#ifndef POP_CONFIG_HOST_TEST -#include -#include -#include -#include -#include -#endif - -#include "pop_settings.h" -#include "pop_cfg.h" -#include "pop_pace.h" -#include "pop_cheat.h" -#include "pop_sfx.h" -#include "_pop_config.h" - -#define CFG_BASE 0x100 - -pop_settings_t pop_settings; - -static uint8_t cfg_checksum(const uint8_t *data, uint16_t size) -{ - uint8_t sum = 0; - while (size--) sum ^= *data++; - return sum; -} - -void pop_settings_defaults(void) __banked -{ - pop_settings.sound_enabled = 1; - pop_settings.music_enabled = 1; - pop_settings.speed_mode = POP_SPEED_NORMAL; - pop_settings.gameplay_profile = POP_PROFILE_VANILLA; - pop_settings.cheats_enabled = 1; /* пока roomtest — dev-сборка */ - pop_settings.show_build_info = 0; - pop_settings.enhancement_flags = 0; - pop_settings.time_limit_enabled = 1; - pop_settings.show_debug_bar = 0; /* по умолчанию чистый экран */ -} - -/* Применить модель к настоящим владельцам runtime-состояния. Sound нельзя - * применять до pop_sfx_init(): тот поднимает набор и только затем знает, - * можно ли честно включить CBL. */ -void pop_settings_apply(uint8_t sound_ready) __banked -{ - pop_speed_mode = pop_settings.speed_mode; - pop_cheats = pop_settings.cheats_enabled; - if (sound_ready && pop_snd_want != pop_settings.sound_enabled) { - pop_sfx_toggle(); - /* Если звуковой набор не поднялся, toggle возвращает want в 0. - * Файл должен отражать фактически применимое состояние. */ - pop_settings.sound_enabled = pop_snd_want; - } - /* Музыке набор эффектов не нужен: она читается с диска отдельно, - * поэтому применяется всегда, а не по sound_ready. */ - pop_mus_want = pop_settings.music_enabled; -} - -void pop_cfg_encode(uint8_t *buf) -{ - uint8_t sum; - memcpy(buf, "PCFG", 4); - buf[4] = POP_CFG_VERSION; - buf[5] = POP_CFG_PAYLOAD_SIZE; - buf[6] = 0; - buf[7] = pop_settings.sound_enabled; - buf[8] = pop_settings.speed_mode; - buf[9] = pop_settings.gameplay_profile; - buf[10] = pop_settings.cheats_enabled; - buf[11] = pop_settings.show_build_info; - buf[12] = (uint8_t)pop_settings.enhancement_flags; - buf[13] = (uint8_t)(pop_settings.enhancement_flags >> 8); - buf[14] = pop_settings.time_limit_enabled; - buf[15] = pop_settings.show_debug_bar; - buf[16] = pop_settings.music_enabled; - sum = cfg_checksum(buf + POP_CFG_HEADER_SIZE, POP_CFG_PAYLOAD_SIZE); - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = (uint8_t)~sum; -} - -uint8_t pop_cfg_decode(const uint8_t *buf, uint16_t size) -{ - uint16_t payload_size, flags; - uint8_t sum; - - if (size < POP_CFG_MIN_SIZE || - memcmp(buf, "PCFG", 4) != 0 || buf[4] != POP_CFG_VERSION) - return 0; - payload_size = (uint16_t)(buf[5] | ((uint16_t)buf[6] << 8)); - if (payload_size < POP_CFG_LEGACY_PAYLOAD_SIZE || - payload_size > POP_CFG_MAX_PAYLOAD || - size != (uint16_t)(POP_CFG_HEADER_SIZE + payload_size + - POP_CFG_TAIL_SIZE)) - return 0; - sum = cfg_checksum(buf + POP_CFG_HEADER_SIZE, payload_size); - if (buf[POP_CFG_HEADER_SIZE + payload_size] != sum || - buf[POP_CFG_HEADER_SIZE + payload_size + 1] != (uint8_t)~sum) - return 0; - - /* Сначала проверить ВСЕ известные поля, только затем менять state. */ - if (buf[7] > 1 || buf[8] >= POP_SPEED_MODES || - buf[9] > POP_PROFILE_ENHANCED || buf[10] > 1 || buf[11] > 1) - return 0; - if (payload_size >= POP_CFG_TIMELIMIT_PAYLOAD_SIZE && buf[14] > 1) return 0; - if (payload_size >= POP_CFG_DEBUGBAR_PAYLOAD_SIZE && buf[15] > 1) return 0; - if (payload_size >= POP_CFG_PAYLOAD_SIZE && buf[16] > 1) return 0; - flags = (uint16_t)(buf[12] | ((uint16_t)buf[13] << 8)); - pop_settings.sound_enabled = buf[7]; - pop_settings.speed_mode = buf[8]; - /* ENHANCED пока не имеет аудита: безопасно понижаем до VANILLA. */ - pop_settings.gameplay_profile = POP_PROFILE_VANILLA; - pop_settings.cheats_enabled = buf[10]; - pop_settings.show_build_info = buf[11]; - pop_settings.enhancement_flags = flags; - /* Старый POP.CFG создавался до настройки таймера (и до тумблера - * отладочной полосы): отсутствующее поле означает исторический дефолт — - * ограничение 60 минут, включённую полосу и музыку, а не случайное - * значение в памяти. */ - pop_settings.time_limit_enabled = - (payload_size >= POP_CFG_TIMELIMIT_PAYLOAD_SIZE) ? buf[14] : 1; - pop_settings.show_debug_bar = - (payload_size >= POP_CFG_DEBUGBAR_PAYLOAD_SIZE) ? buf[15] : 1; - pop_settings.music_enabled = - (payload_size >= POP_CFG_PAYLOAD_SIZE) ? buf[16] : 1; - return 1; -} - -#ifndef POP_CONFIG_HOST_TEST - -/* В отличие от bank_load_file здесь нужен точный размер файла: только так - * отличаем валидный будущий payload от короткого/дописанного мусора. Буфер - * на стеке лежит в W2, то есть разрешён ESTEX; файл мал, EMM ему не нужен. */ -static uint8_t cfg_read_file(uint8_t *buf, uint16_t *size) -{ - int fd, got; - long n; - - fd = open("POP.CFG", O_RDONLY); - if (fd < 0) return 0; - n = lseek(fd, 0, SEEK_END); - if (n < POP_CFG_MIN_SIZE || n > POP_CFG_MAX_SIZE || - lseek(fd, 0, SEEK_SET) < 0) { - close(fd); - return 0; - } - got = read(fd, buf, (uint16_t)n); - if (close(fd) != 0 || got != (int)n) return 0; - *size = (uint16_t)n; - return 1; -} - -int8_t pop_cfg_load(void) __banked -{ - uint8_t buf[POP_CFG_MAX_SIZE]; - uint16_t size; - - if (!cfg_read_file(buf, &size) || !pop_cfg_decode(buf, size)) return 0; - if (buf[9] != POP_PROFILE_VANILLA) - printf("POP.CFG: ENHANCED profile -> VANILLA\n"); - return 1; -} - -int8_t pop_cfg_save(void) __banked -{ - uint8_t blk, page; - uint8_t buf[POP_CFG_SIZE]; - int rc; - - blk = mem_alloc_pages(1); - if (!blk) return -1; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - pop_cfg_encode(buf); - gfx_w0_map(page); - memcpy((uint8_t *)CFG_BASE, buf, sizeof(buf)); - gfx_w0_unmap(); - /* Не unlink: bank_save_file сам делает O_TRUNC и не создаёт лишнего - * окна, когда POP.CFG вообще отсутствует после ошибки unlink. */ - rc = bank_save_file(page, CFG_BASE, "POP.CFG", sizeof(buf)); - mem_free_block(blk); - return (rc == sizeof(buf)) ? 1 : 0; -} - -#endif diff --git a/applications/PoP/roomtest/pop_ctrl.c b/applications/PoP/roomtest/pop_ctrl.c deleted file mode 100644 index a3dc5dd..0000000 --- a/applications/PoP/roomtest/pop_ctrl.c +++ /dev/null @@ -1,863 +0,0 @@ -/* - * pop_ctrl.c — управление Kid (Фаза K2b). Порт SDLPoP: - * вход — read_user_control/user_control/rest_ctrl_1/save_ctrl_1 - * (seg006.c) поверх held-state ; - * диспетчер — control() + control_standing/turning/startrun/running/ - * crouched (seg005.c), Kid-only ветки (без меча/стражи); - * действия — forward/back/up/down_pressed, crouch, standing_jump, - * run_jump, safe_step (seg005.c). - * - * Map-запросы (стена/край/захват) ЗАСТАБЛЕНЫ «открытый пол» (map_* ниже) — - * реальная коллизия в K3/K4. Поэтому: forward -> всегда бег, down -> присед, - * back -> разворот, up+forward -> прыжок с места; osторожный шаг и climb - * помечены TODO(K3/K4). - * - * Значения CONTROL_* (types.h): RELEASED=0, IGNORE=1, HELD=-1; - * X: LEFT/FORWARD=-1, RIGHT/BACKWARD=+1; Y: UP=-1, DOWN=+1. - */ -#include -#include -#include "pop_state.h" -#include "pop_ctrl.h" /* свой API (__banked) + объявления шины control_* */ -#include "pop_kid.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_music.h" /* pop_mus_left — «тема ещё звучит» */ -#include "pop_map.h" -#include "pop_level.h" /* pop_current_level — вступительная тема 1-го */ -#include "pop_guard.h" /* charid, состояние меча, seq стража */ - -/* ---- CONTROL_* и seq/frame id (подмножество types.h) --------------- */ -#define CONTROL_RELEASED 0 -#define CONTROL_IGNORE 1 -#define CONTROL_HELD (-1) -#define CONTROL_HELD_LEFT (-1) -#define CONTROL_HELD_RIGHT 1 -#define CONTROL_HELD_FORWARD (-1) -#define CONTROL_HELD_BACKWARD 1 -#define CONTROL_HELD_UP (-1) -#define CONTROL_HELD_DOWN 1 - -#define DIR_RIGHT 0 /* dir_0_right */ - -#define SEQ_1_START_RUN 1 -#define SEQ_2_STAND 2 -#define SEQ_3_STANDING_JUMP 3 -#define SEQ_4_RUN_JUMP 4 -#define SEQ_5_TURN 5 -#define SEQ_6_RUN_TURN 6 -#define SEQ_13_STOP_RUN 13 -#define SEQ_26_CROUCH_WHILE_RUNNING 26 -#define SEQ_43_START_RUN_AFTER_TURN 43 -#define SEQ_49_STAND_UP_FROM_CROUCH 49 -#define SEQ_50_CROUCH 50 -#define SEQ_79_CROUCH_HOP 79 -#define SEQ_78_DRINK 78 /* выпить зелье */ -#define SEQ_91_PICKUP_SWORD 91 /* поднять меч (pickupsword) */ -#define SEQ_STEP_BASE 28 /* +distance(1..14) = seq 29..42 шаг-N */ -#define SEQ_39_UNSAFE_STEP 39 /* шаг за кромку (distance 11) */ -#define SEQ_44_STEP_ON_EDGE 44 -#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */ -#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */ -#define SEQ_25_HANG_AGAINST_WALL 25 /* вис у стены (Shift в висе) */ -#define SEQ_GO_UP_LEVELDOOR 70 /* seq_70_go_up_on_level_door */ - -#define FRAME_7_RUN 7 -#define FRAME_11_RUN 11 -#define FRAME_15_STAND 15 -#define FRAME_48_TURN 48 -#define FRAME_50_TURN 50 -#define FRAME_67_JUMPUP1 67 -#define FRAME_70_JUMPHANG 70 -#define FRAME_87_HANG1 87 -#define FRAME_109_CROUCH 109 - -/* ---- Состояние управления (seg006 globals) ------------------------ * - * Сами control_* ЖИВУТ В pop_state.c, а не здесь. Модуль уехал в БАНК 5, - * а шину пишут с трёх сторон (этот банк, guards.c из банка 1) и читают из - * банка 3 (pop_map) — это ровно тот случай, для которого pop_state и - * заведён. Сегодня оно работало бы и отсюда: банки собираются БЕЗ - * --bank-data, поэтому их писучие данные остаются в общем _DATA. Но это - * флаг сборки, а не свойство кода: включат --bank-data ради экономии - * W1/W2 — и шина молча уедет в страницу банка. - * - * ctrl1_* остаются здесь: их трогает только этот модуль. */ -static int8_t ctrl1_forward, ctrl1_backward, ctrl1_up, ctrl1_down, ctrl1_shift2; - -/* ---- seqtbl_offset_char: сменить последовательность Kid ------------ * - * Обёртка над kid_set_seq (единая точка в pop_kid — kid_seq_off/kid_seqtbl - * не дублируются в этот TU). */ -/* В оригинале seqtbl_offset_char работает с АКТИВНЫМ персонажем, и - * control() вызывается внутри окна Char. Раньше макрос вёл на - * kid_set_seq (пишет прямо в Kid) — после введения окна это ломало ввод: - * savekid затирал Kid копией Char со старой curr_seq. */ -#define seqtbl_offset_char(seq) pop_char_set_seq(seq) - -static int8_t release_arrows(void) -{ - control_backward = control_forward = control_up = control_down = CONTROL_RELEASED; - return CONTROL_IGNORE; /* seg006: return 1 */ -} - -#define TILE_CHOMPER 18 /* tiles_18_chomper (исключение в forward_pressed) */ - -/* Край/стена впереди — из pop_map (get_edge_distance): pop_edge_distance() - * возвращает дистанцию и ставит pop_edge_type() = EDGE_WALL/FLOOR/CLOSER. */ - -/* ---- Действия (seg005) -------------------------------------------- */ -static void crouch(void) -{ - seqtbl_offset_char(SEQ_50_CROUCH); - control_down = release_arrows(); -} - -static void standing_jump(void) -{ - control_up = control_forward = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_3_STANDING_JUMP); -} - -/* check_get_item (seg005:061F): решение по тайлам принимает pop_map, здесь - * только исполнение. Триггер в оригинале — Shift (control_shift2) в стойке - * или в приседе: первый раз Kid приседает к предмету, второй — поднимает. - * Возврат 1 = управление обработано (caller делает return). */ -static uint8_t get_item_action(void) -{ - uint8_t a = pop_get_item_action(); - if (a == 1) { crouch(); return 1; } - if (a == 2) { - control_shift2 = CONTROL_IGNORE; /* do_pickup: без авто-повтора */ - seqtbl_offset_char(SEQ_91_PICKUP_SWORD); - return 1; - } - if (a == 3) { /* зелье — выпить (get_item) */ - control_shift2 = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_78_DRINK); - return 1; - } - return 0; -} - -/* run_jump (seg005:0AA8). Выравнивание по кромке пола живёт в pop_map - * (там тайловые запросы) — pop_run_jump_align; здесь только диспетчерская - * часть. Отказ выравнивателя = прыжка в этом кадре НЕТ, и control_up - * гасить нельзя: Кид бежит дальше с зажатой «вверх» и попробует снова на - * следующем кадре. Ровно так игрок и «ловит» фазу перед провалом. */ -static void run_jump(void) -{ - if (Char.frame >= FRAME_7_RUN) { - if (!pop_run_jump_align()) return; - control_up = release_arrows(); - seqtbl_offset_char(SEQ_4_RUN_JUMP); - } -} - -static void safe_step(void); /* fwd */ -static void draw_sword(void); /* fwd: нужен в control_standing */ - -static void forward_pressed(void) -{ - int distance = pop_edge_distance(); - /* seg005:0577 — «у стены шагаем, а не бежим», НО чомпер из этого правила - * ЯВНО исключён (`curr_tile2 != tiles_18_chomper`). Он проходим в - * разомкнутой фазе, и оригинал даёт разбежаться сразу: без исключения - * Кид перед чомпером делает лишний осторожный шаг, а это кадры — и он - * не успевает проскочить между челюстями (поймано на приёмке - * 2026-08-08, комната 3.22). */ - if (pop_edge_type() == EDGE_WALL && pop_edge_tile() != TILE_CHOMPER && - distance < 8) { - if (control_forward == CONTROL_HELD) - safe_step(); - } else { - seqtbl_offset_char(SEQ_1_START_RUN); - } -} - -static void back_pressed(void) -{ - control_backward = release_arrows(); - /* Kid без меча -> просто разворот. */ - seqtbl_offset_char(SEQ_5_TURN); -} - -static void down_pressed(void) -{ - control_down = CONTROL_IGNORE; /* без авто-повтора */ - /* У края пола (край сзади) со зацепом снизу — спуск на этаж (seq_68); - * у передней кромки — отступ; иначе присед. Решает pop_down_action. */ - if (!pop_down_action()) - crouch(); -} - -/* Прыжок вверх в стойке (seg005 check_jump_up): чистый вертикальный прыжок - * ЛИБО прыжок-с-зацепом за уступ выше (запрыгнуть на этаж вверх). Выбор seq - * + выравнивание Kid.x — в pop_jump_up_seq (pop_map). */ -static void jump_up(void) -{ - control_up = release_arrows(); - seqtbl_offset_char(pop_jump_up_seq()); -} - -static void up_pressed(void) -{ - /* Дверь уровня рядом и открыта → войти в неё: постановку в проём - * (go_up_leveldoor) делает pop_leveldoor_enter, здесь остаётся только - * последовательность подъёма по лестнице. Телепортов у нас нет — это - * модификация SDLPoP, а не оригинал. - * Иначе: ↑+forward = прыжок с места, иначе вертикальный прыжок вверх. */ - if (pop_leveldoor_enter()) { - seqtbl_offset_char(SEQ_GO_UP_LEVELDOOR); - return; - } - if (control_x == CONTROL_HELD_FORWARD) - standing_jump(); - else - jump_up(); -} - -/* Осторожный шаг (Shift+forward): шаг РОВНО до кромки/стены. distance>0 — - * шаг длины distance (seq 29..42 = step1..step14); ==0 у края — шаг на - * кромку (seq_44) либо неосторожный шаг за край (seq_39). Порт seg005. */ -static void safe_step(void) -{ - int distance; - control_shift2 = CONTROL_IGNORE; /* без авто-повтора */ - control_forward = CONTROL_IGNORE; - distance = pop_edge_distance(); - if (distance) { - Char.repeat = 1; - seqtbl_offset_char((uint8_t)(distance + SEQ_STEP_BASE)); - } else if (pop_edge_type() == EDGE_WALL) { - /* ВПЛОТНУЮ К ПРЕПЯТСТВИЮ. Оригинал (seg005:0604) уходит здесь в - * seq_39 — а это шаг на ОДИННАДЦАТЬ пикселей, который останавливает - * только бамп. - * - * ЧОМПЕР: бампа нет по определению (в разомкнутой фазе он не - * препятствие, is_obstacle требует modif == 2), и шаг обязан пройти - * целиком — иначе Кид топчется на 1 px и не успевает между - * челюстями. Здесь играем оригинальный seq_39. - * - * СТЕНА И ВОРОТА: держим «шаг-1» — осознанное приближение. Наш бамп - * ловит не тот же кадр, что у оригинала (см. BUG-SEAM-PINGPONG, там - * трасса живого SDLPoP: `safe_step(d=0) -> step, на первом dx(1) - * x=62 -> bump`), и с полным seq_39 Кид ПРОБЕГАЕТ сквозь закрытые - * ворота шва комнаты 6 — поймано приёмкой 2026-08-08. Пока бамп не - * сойдётся с оригиналом покадрово, этот шаг остаётся коротким. */ - if (pop_edge_tile() == TILE_CHOMPER) { - seqtbl_offset_char(SEQ_39_UNSAFE_STEP); - } else { - Char.repeat = 1; - seqtbl_offset_char((uint8_t)(1 + SEQ_STEP_BASE)); - } - } else if (Char.repeat != 0) { - Char.repeat = 0; - seqtbl_offset_char(SEQ_44_STEP_ON_EDGE); - } else { - seqtbl_offset_char(SEQ_39_UNSAFE_STEP); /* реальный обрыв (edge=CLOSER) */ - } -} - -/* Автомат вступительной темы уровня 1 (порт need_level1_music): - * 0 — не нужна, 1 — пора пустить, 2 — играет, ждём конца. */ -static uint8_t lvl1_music; - -/* seg003:45 — need_level1_music = (level == 1). Ставит старт уровня. */ -void pop_ctrl_level_start(void) __banked -{ - lvl1_music = (uint8_t)(pop_current_level == 1); -} - -/* ---- control_* обработчики состояний ------------------------------ */ -static void control_crouched(void) -{ - /* ВСТУПЛЕНИЕ ПЕРВОГО УРОВНЯ (seg005:02EB) — это не «звук при приседе», а - * маленький автомат, и Кид на его время ОБЕЗДВИЖЕН: - * 1 — ничего не звучит: пустить тему, перейти в 2; - * 2 — ждать, пока она доиграет, и только тогда отпустить управление. - * Оттого Кид и сидит в начале игры, пока не смолкнет музыка. - * - * Я сперва сделал проще — «сыграть при первом приседе», — и тема - * догоняла игрока посреди уровня: пробежал, спрыгнул, присел — заиграла - * (поймано пользователем). - * - * Ждём по pop_mus_left: это курсор насоса, он резидентный и правдиво - * отвечает «трек ещё звучит». Если музыка выключена или заявку никто - * не обработал, курсор так и останется нулём — Кид просто встанет, а - * не сядет навсегда. */ - if (lvl1_music && pop_current_level == 1) { - if (!pop_mus_left) { - if (lvl1_music == 1) { - pop_sfx_play(25); - lvl1_music = 2; - } else { - lvl1_music = 0; - } - } - return; /* управление на это время не читаем */ - } - lvl1_music = 0; - /* Shift в приседе — поднять предмет (seg005 control_crouched). */ - if (control_shift2 == CONTROL_HELD && get_item_action()) return; - if (control_y != CONTROL_HELD_DOWN) { - seqtbl_offset_char(SEQ_49_STAND_UP_FROM_CROUCH); - } else if (control_forward == CONTROL_HELD) { - control_forward = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_79_CROUCH_HOP); - } -} - -static void control_standing(void) -{ - /* Shift в стойке над предметом — присесть к нему (seg005:0358, первая - * строка control_standing). Идёт ДО остальных shift-веток. */ - if (control_shift2 == CONTROL_HELD && control_shift == CONTROL_HELD && - get_item_action()) - return; - /* Ветку «charid != kid && вниз+вперёд -> draw_sword» не портируем: у нас - * соперник до control_standing не доходит, его перехватывает - * control_guard_inactive в самом диспетчере (порядок как в seg005). */ - - /* seg005:352 — Кид с мечом ВИДИТ активного стража: достаёт клинок сам. - * Без этого игрок стоит с мечом в ножнах, пока его рубят. */ - if (pop_have_sword) { - if (offguard != 0 && control_shift >= CONTROL_RELEASED) { - /* Меч убран намеренно (down в бою) — не доставать, пока не - * отпустят Shift; в оригинале это переход на loc_6213. */ - } else if (can_guard_see_kid >= 2) { - int16_t d = pop_char_opp_dist(); - if (d >= -10 && d < 90) { - holding_sword = 1; - /* (word)d < (word)-6 — беззнаковое: истинно для ВСЕГО, кроме - * −6..−1. То есть «страж вплотную за спиной» -> отступить, - * иначе достать меч. */ - if (d >= -6 && d < 0) { back_pressed(); return; } - draw_sword(); - return; - } - } else { - offguard = 0; - } - } - - if (control_shift == CONTROL_HELD) { - if (control_backward == CONTROL_HELD) back_pressed(); - else if (control_up == CONTROL_HELD) up_pressed(); - else if (control_down == CONTROL_HELD) down_pressed(); - else if (control_x == CONTROL_HELD_FORWARD && control_forward == CONTROL_HELD) - safe_step(); - } else if (control_forward == CONTROL_HELD) { - if (control_up == CONTROL_HELD) standing_jump(); /* keyboard mode */ - else forward_pressed(); - } else if (control_backward == CONTROL_HELD) { - back_pressed(); - } else if (control_up == CONTROL_HELD) { - if (control_forward == CONTROL_HELD) standing_jump(); - else up_pressed(); - } else if (control_down == CONTROL_HELD) { - down_pressed(); - } else if (control_x == CONTROL_HELD_FORWARD) { - forward_pressed(); - } -} - -static void control_turning(void) -{ - if (control_shift >= CONTROL_RELEASED && - control_x == CONTROL_HELD_FORWARD && control_y >= CONTROL_RELEASED) { - seqtbl_offset_char(SEQ_43_START_RUN_AFTER_TURN); - } -} - -static void control_startrun(void) -{ - if (control_y == CONTROL_HELD_UP && control_x == CONTROL_HELD_FORWARD) - standing_jump(); -} - -static void control_running(void) -{ - /* Стену НЕ обрабатываем тут — check_bumped (pop_phys_tick) даёт отскок - * seq_47 при беге в стену (как оригинал), с корректной позицией. */ - if (control_x == CONTROL_RELEASED && - (Char.frame == FRAME_7_RUN || Char.frame == FRAME_11_RUN)) { - control_forward = release_arrows(); - seqtbl_offset_char(SEQ_13_STOP_RUN); - } else if (control_x == CONTROL_HELD_BACKWARD) { - control_backward = release_arrows(); - seqtbl_offset_char(SEQ_6_RUN_TURN); - } else if (control_y == CONTROL_HELD_UP && control_up == CONTROL_HELD) { - run_jump(); - } else if (control_down == CONTROL_HELD) { - control_down = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_26_CROUCH_WHILE_RUNNING); - } -} - -/* ---- Вис (seg005 control_hanging/can_climb_up/hang_fall) ---------- * - * Тайловые решения (можно ли подтянуться, куда сорваться) — в pop_map; - * здесь управление осями control_*. */ -static void hang_fall(void) -{ - control_down = release_arrows(); - seqtbl_offset_char(pop_hang_fall_seq()); /* seq_23/seq_11 (+ выравнивание x) */ -} - -static void can_climb_up(void) -{ - control_up = control_shift2 = release_arrows(); - seqtbl_offset_char(pop_hang_climb_up_seq()); /* seq_10 / seq_73 */ -} - -static void control_hanging(void) -{ - if (control_y == CONTROL_HELD && pop_hang_grab_ready()) { - can_climb_up(); /* ↑ — подтянуться */ - } else if (control_shift == CONTROL_HELD) { - int8_t w = pop_hang_wall(); - if (w > 0) seqtbl_offset_char(SEQ_25_HANG_AGAINST_WALL); /* у стены */ - else if (w < 0) hang_fall(); /* сорваться */ - /* w==0: сверху пол — держимся (ничего) */ - } else { - hang_fall(); /* отпустил Shift — сорваться */ - } -} - -/* control_jumpup (seg005): в старте прыжка вверх ←/→ или forward → перевести - * в прыжок с места. */ -static void control_jumpup(void) -{ - if (control_x == CONTROL_HELD_FORWARD || control_forward == CONTROL_HELD) - standing_jump(); -} - -/* draw_sword (seg005:945): достать меч. Кид переходит в seq_55 (подъём - * клинка со звуком), соперник — сразу в стойку en garde (seq_90). Стрелки - * гасятся, чтобы «вперёд», которым меч достали, не сработало второй раз - * уже как выпад. */ -static void draw_sword(void) -{ - uint8_t seq_id = SEQ_55_DRAW_SWORD; - control_forward = control_shift2 = release_arrows(); - if (Char.charid == CHARID_0_KID) { - offguard = 0; - pop_sfx_play(19); /* seg005:945 — меч из ножен */ - } else if (Char.charid != CHARID_1_SHADOW) { - seq_id = SEQ_90_EN_GARDE; /* соперник встаёт сразу в стойку */ - } - Char.sword = SWORD_2_DRAWN; - seqtbl_offset_char(seq_id); -} - -/* control_guard_inactive (seg006:2123): неактивный страж реагирует ТОЛЬКО в - * кадре 166 (стойка) и только на «вниз»: вниз+вперёд — достать меч, - * вниз без «вперёд» — развернуться (stand flipped). */ -static void control_guard_inactive(void) -{ - if (Char.frame == FRAME_166_STAND_INACTIVE && control_down == CONTROL_HELD) { - if (control_forward == CONTROL_HELD) { - draw_sword(); - } else { - control_down = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_80_STAND_FLIPPED); - } - } -} - -/* ---- Боёвка (seg005:964..) ---------------------------------------- * - * Всё это ветки ОБЩЕГО диспетчера: у стража тот же control(), просто - * control_* ему выставляет ИИ (autocontrol_*, guards.c), а не клавиатура. */ - -/* back_with_sword (seg005): шаг назад — только из стоек. */ -static void back_with_sword(void) -{ - uint8_t f = Char.frame; - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_backward = CONTROL_IGNORE; /* без авто-повтора */ - seqtbl_offset_char(SEQ_57_BACK_WITH_SWORD); - } -} - -/* forward_with_sword (seg005): шаг вперёд; у стража своя последовательность. */ -static void forward_with_sword(void) -{ - uint8_t f = Char.frame; - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_forward = CONTROL_IGNORE; - seqtbl_offset_char(Char.charid != CHARID_0_KID ? SEQ_56_GUARD_FORWARD - : SEQ_86_FORWARD_WITH_SWORD); - } -} - -/* sword_strike (seg005): выпад из стойки/шага либо добивание после парирования. */ -static void sword_strike(void) -{ - uint8_t f = Char.frame; - uint8_t seq_id; - if (f == FRAME_157_WALK_WITH_SWORD || f == FRAME_158_STAND_WITH_SWORD || - f == FRAME_170_STAND_WITH_SWORD || f == FRAME_171_STAND_WITH_SWORD || - f == FRAME_165_WALK_WITH_SWORD) { - seq_id = (Char.charid == CHARID_0_KID) ? SEQ_75_STRIKE : SEQ_58_GUARD_STRIKE; - } else if (f == FRAME_150_PARRY || f == FRAME_161_PARRY) { - seq_id = SEQ_66_STRIKE_AFTER_PARRY; - } else { - return; - } - control_shift2 = CONTROL_IGNORE; - seqtbl_offset_char(seq_id); -} - -/* parry (seg005): блок. Условие сильно разное у Кида и у соперника — - * соперник блокирует ТОЛЬКО на кадре 152 (второй кадр удара), а Кид ещё и - * по 153 (и тогда последовательность прокручивается сразу). */ -static void parry(void) -{ - uint8_t cf = Char.frame, of = Opp.frame; - uint8_t seq_id = SEQ_62_PARRY; - uint8_t do_play_seq = 0; - - if (cf == FRAME_158_STAND_WITH_SWORD || cf == FRAME_170_STAND_WITH_SWORD || - cf == FRAME_171_STAND_WITH_SWORD || cf == FRAME_168_BACK || - cf == FRAME_165_WALK_WITH_SWORD) { - if (pop_char_opp_dist() >= 32 && Char.charid != CHARID_0_KID) { - back_with_sword(); - return; - } else if (Char.charid == CHARID_0_KID) { - if (of == FRAME_168_BACK) return; - if (of != FRAME_151_STRIKE_1 && of != FRAME_152_STRIKE_2 && - of != FRAME_162_BLOCK_TO_STRIKE) { - if (of == FRAME_153_STRIKE_3) do_play_seq = 1; - } - } else { - if (of != FRAME_152_STRIKE_2) return; - } - } else { - if (cf != FRAME_167_BLOCKED) return; - seq_id = SEQ_61_PARRY_AFTER_STRIKE; - } - control_up = CONTROL_IGNORE; - seqtbl_offset_char(seq_id); - if (do_play_seq) play_seq(); -} - -/* swordfight (seg005:0CDB) — разбор ввода в бою. Порядок веток важен: - * удар старше «убрать меч», тот старше блока, блок старше шагов. */ -static void swordfight(void) -{ - uint8_t f = Char.frame; - uint8_t seq_id; - - if (f == FRAME_161_PARRY && control_shift2 >= CONTROL_RELEASED) { - seqtbl_offset_char(SEQ_57_BACK_WITH_SWORD); /* отскок после парирования */ - return; - } else if (control_shift2 == CONTROL_HELD) { - if (Char.charid == CHARID_0_KID) kid_sword_strike = 15; - sword_strike(); - if (control_shift2 == CONTROL_IGNORE) return; - } - - if (control_down == CONTROL_HELD) { - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_down = CONTROL_IGNORE; - Char.sword = SWORD_0_SHEATHED; - if (Char.charid == CHARID_0_KID) { - offguard = 1; /* убрал намеренно — сразу не доставать */ - guard_refrac = 9; /* и страж на это время придержан */ - holding_sword = 0; - seq_id = SEQ_93_PUT_SWORD_AWAY_FAST; - } else if (Char.charid == CHARID_1_SHADOW) { - seq_id = SEQ_92_PUT_SWORD_AWAY; - } else { - seq_id = SEQ_87_GUARD_BECOME_INACT; /* Кид ушёл из виду */ - } - seqtbl_offset_char(seq_id); - } - } else if (control_up == CONTROL_HELD) { - parry(); - } else if (control_forward == CONTROL_HELD) { - forward_with_sword(); - } else if (control_backward == CONTROL_HELD) { - back_with_sword(); - } -} - -/* control_with_sword (seg005:964): пока соперник виден и близко — бой; - * иначе страж убирает меч, а Кид просто стоит. */ -static void control_with_sword(void) -{ - if (Char.action >= 2) return; /* actions_2_hang_climb и выше */ - if (pop_tile_at(Char.curr_col, Char.curr_row) == 11 /* loose */ || - can_guard_see_kid >= 2) { - int16_t d = pop_char_opp_dist(); - if (d < 90) { - if (d >= 0) { swordfight(); return; } - /* Соперник за спиной: далеко — развернуться, вплотную — драться. */ - if (d < -4) { seqtbl_offset_char(SEQ_60_TURN_WITH_SWORD); return; } - swordfight(); - return; - } - } - /* Не видит / далеко. */ - if (Char.charid == CHARID_0_KID && Char.alive < 0) - holding_sword = 0; /* seg005:980 — индикатор HP стража */ - if (Char.charid < CHARID_2_GUARD) { - if (Char.frame == FRAME_171_STAND_WITH_SWORD) { - Char.sword = SWORD_0_SHEATHED; - seqtbl_offset_char(SEQ_92_PUT_SWORD_AWAY); /* страж убит */ - } - } else { - swordfight(); - } -} - -/* control() — диспетчер по кадру (seg005.c:252) для АКТИВНОГО персонажа. */ -void pop_control(void) __banked -{ - uint8_t f = Char.frame; - /* seg005 control(), самая первая ветка: персонаж УМИРАЕТ (alive >= 0). - * Из любой стойки он валится в seq_71_dying; остальное управление в - * этом состоянии не обрабатывается. Через это же место проходит чит K - * (pop_guard_kill ставит Guard.alive = 0). */ - if (Char.alive >= 0) { - if (f == FRAME_15_STAND || f == FRAME_166_STAND_INACTIVE || - f == FRAME_158_STAND_WITH_SWORD || f == FRAME_171_STAND_WITH_SWORD) - seqtbl_offset_char(SEQ_71_DYING); - return; - } - /* seg005 control(): в отскоке (bumped) и в свободном падении управление - * НЕ обрабатывается вовсе — только гасятся стрелки. Без этого игрок - * прерывает присед после удара (medland/плита по голове) нажатием ↑, и - * последовательность не доигрывает свои dy(1)+dy(1), компенсирующие - * стартовый dy(-2) → Kid навсегда остаётся на 2px выше пола (баг «Y на - * пару пикселей меньше, чем должен»). */ - if (Char.action == 5 || Char.action == 4) { /* bumped / in_freefall */ - release_arrows(); - return; - } - /* Порядок веток — как в seg005: меч старше charid, charid старше кадров. - * Пока Kid безоружен, обе ветки — про стража. */ - if (Char.sword == SWORD_2_DRAWN) - control_with_sword(); - else if (Char.charid >= CHARID_2_GUARD) - control_guard_inactive(); - else if (f == FRAME_15_STAND || (f >= FRAME_50_TURN && f < 53)) - control_standing(); - else if (f == FRAME_48_TURN) - control_turning(); - else if (f < 4) - control_startrun(); - else if (f >= FRAME_67_JUMPUP1 && f < FRAME_70_JUMPHANG) - control_jumpup(); - else if (f < FRAME_15_STAND) - control_running(); - else if (f >= FRAME_87_HANG1 && f < 100) - control_hanging(); - else if (f == FRAME_109_CROUCH) - control_crouched(); -} - -/* ---- Модель ввода (seg006) ---------------------------------------- */ -static void read_input(void) -{ - uint8_t l = kbd_raw_down(KBD_LEFT); - uint8_t r = kbd_raw_down(KBD_RIGHT); - uint8_t u = kbd_raw_down(KBD_UP); - uint8_t d = kbd_raw_down(KBD_DOWN); - control_x = r ? CONTROL_HELD_RIGHT : (l ? CONTROL_HELD_LEFT : CONTROL_RELEASED); - control_y = d ? CONTROL_HELD_DOWN : (u ? CONTROL_HELD_UP : CONTROL_RELEASED); - control_shift = (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT)) - ? CONTROL_HELD : CONTROL_RELEASED; -} - -/* read_user_control (seg006:1557): «свежее нажатие» (RELEASED->HELD) с - * подавлением авто-повтора (IGNORE держится, пока клавишу не отпустят). */ -static void read_user_control(void) -{ - if (control_forward >= CONTROL_RELEASED) { - if (control_x == CONTROL_HELD_FORWARD) { - if (control_forward == CONTROL_RELEASED) control_forward = CONTROL_HELD; - } else control_forward = CONTROL_RELEASED; - } - if (control_backward >= CONTROL_RELEASED) { - if (control_x == CONTROL_HELD_BACKWARD) { - if (control_backward == CONTROL_RELEASED) control_backward = CONTROL_HELD; - } else control_backward = CONTROL_RELEASED; - } - if (control_up >= CONTROL_RELEASED) { - if (control_y == CONTROL_HELD_UP) { - if (control_up == CONTROL_RELEASED) control_up = CONTROL_HELD; - } else control_up = CONTROL_RELEASED; - } - if (control_down >= CONTROL_RELEASED) { - if (control_y == CONTROL_HELD_DOWN) { - if (control_down == CONTROL_RELEASED) control_down = CONTROL_HELD; - } else control_down = CONTROL_RELEASED; - } - if (control_shift2 >= CONTROL_RELEASED) { - if (control_shift == CONTROL_HELD) { - if (control_shift2 == CONTROL_RELEASED) control_shift2 = CONTROL_HELD; - } else control_shift2 = CONTROL_RELEASED; - } -} - -static void flip_control_x(void) -{ - int8_t t; - control_x = (int8_t)-control_x; - t = control_forward; control_forward = control_backward; control_backward = t; -} - -/* user_control (seg006:0DC0): «вперёд» относительно направления Kid. */ -static void user_control(void) -{ - if (Char.direction >= DIR_RIGHT) { - flip_control_x(); - pop_control(); - flip_control_x(); - } else { - pop_control(); - } -} - -static void rest_ctrl_1(void) -{ - control_forward = ctrl1_forward; control_backward = ctrl1_backward; - control_up = ctrl1_up; control_down = ctrl1_down; control_shift2 = ctrl1_shift2; -} -static void save_ctrl_1(void) -{ - ctrl1_forward = control_forward; ctrl1_backward = control_backward; - ctrl1_up = control_up; ctrl1_down = control_down; ctrl1_shift2 = control_shift2; -} - -/* Общий хвост control_kid: raw-ввод и attract-demo различаются только тем, - * кто до него заполнил control_*. Окно Char и ctrl1_* обязаны быть теми же, - * иначе запись demo_moves перестаёт совпадать с логикой обычного игрока. */ -static void ctrl_kid_dispatch(void) -{ - pop_loadkid(); - pop_load_fram_det_col(); - user_control(); - pop_savekid_state(); - save_ctrl_1(); -} - -static void ctrl_kid_death(void) -{ - /* control_kid (seg006:0CD1): HP кончились — персонаж мёртв. */ - if (Kid.alive < 0 && hitp_curr == 0) { - Kid.alive = 0; - pop_kid_dead = 1; - /* play_death_music (seg006:15B5): траурный трек зависит от того, - * КАК умер Кид — в бою, от руки тени или просто так. Оригинал ждёт - * шести тиков, чтобы доиграл звук удара; у нас ждать не нужно — - * насос держит курсор музыки, пока звучит эффект. - * - * НА ДЕМО-УРОВНЕ МУЗЫКИ НЕТ — и это буквальное условие оригинала - * (seg006:1366: `current_level != 0 && current_level != 15`). - * Заставочная демка озвучена одними эффектами. */ - if (pop_current_level != 0 && pop_current_level != 15) { - if (Guard.charid == CHARID_1_SHADOW) pop_sfx_play(32); - else if (holding_sword) pop_sfx_play(28); - else pop_sfx_play(24); - } - } -} - -/* ---- Публичный API ------------------------------------------------ */ -int pop_ctrl_init(void) __banked -{ - control_forward = control_backward = control_up = control_down = CONTROL_RELEASED; - control_shift2 = CONTROL_RELEASED; - ctrl1_forward = ctrl1_backward = ctrl1_up = ctrl1_down = ctrl1_shift2 = CONTROL_RELEASED; - return kbd_raw_open(); -} - -void pop_ctrl_close(void) __banked -{ - kbd_raw_close(); -} - -int8_t pop_ctrl_shift_held(void) __banked -{ - return (int8_t)(control_shift == CONTROL_HELD); -} - -void pop_ctrl_tick(void) __banked -{ - kbd_raw_sync(); /* снять залипшее после Rx-overrun SIO */ - /* control_kid (seg006:0CD1), ПЕРВАЯ строка: HP кончились — персонаж - * мёртв. Без этой ветки смерть от меча стража не доводилась до конца: - * hurt_by_sword играл seq_85, hitp_curr падал в 0, но Kid.alive - * оставался −1 и pop_kid_dead не взводился — Кид досматривал сиквенс, - * возвращался в стойку с нулём HP, и страж убивал его снова по кругу - * (BUG-DEATH-1). pop_kid_dead — наш сигнал главному циклу на респавн - * (в оригинале это счётчик Char.alive в play_kid, seg006:0BEE). */ - ctrl_kid_death(); - rest_ctrl_1(); - read_input(); - read_user_control(); - /* Окно Char вокруг диспетчера: control() работает с АКТИВНЫМ - * персонажем (как в оригинале), поэтому ввод игрока применяется к - * Киду только внутри loadkid/savekid. - * - * load_fram_det_col ОБЯЗАТЕЛЕН здесь — порт play_kid_frame - * (seg000:1209), где он стоит ровно между loadkid_and_opp() и - * play_kid(). cur_frame один на всех персонажей, и в кадре последним - * его перезаписывает страж; без перезагрузки диспетчер считает - * геометрию Кида (dx_weight -> determine_col -> distance_to_edge_weight - * -> get_edge_distance) по кадру СТРАЖА. Замерено: BUG-CTRL-FRAME-1. */ - ctrl_kid_dispatch(); /* -> pop_control(): может сменить Char.curr_seq */ -} - -void pop_ctrl_auto_move(int8_t move) __banked -{ - ctrl_kid_death(); - /* control_kid() оригинала в demo-ветке делает do_demo(); control(); - * БЕЗ rest_ctrl_1/read_user_control/user_control/save_ctrl_1. Команды - * auto_move уже относительны к направлению Char. Если пропустить их - * через user_control(), то при Kid.direction=RIGHT backward зеркалится - * во forward: во второй комнате Кид вместо разворота бежит в пропасть. */ - switch (move) { - case 0: - control_shift = control_y = control_x = control_shift2 = 0; - control_down = control_up = control_backward = control_forward = 0; - break; - case 1: - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; - break; - case 2: - control_backward = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_BACKWARD; - break; - case 3: - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; - break; - case 4: - control_down = POP_CONTROL_HELD; - control_y = POP_CONTROL_HELD_DOWN; - break; - case 5: - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; - break; - case 6: - control_shift = POP_CONTROL_HELD; - control_shift2 = POP_CONTROL_HELD; - break; - case 7: - control_shift = POP_CONTROL_RELEASED; - break; - default: - break; - } - pop_loadkid(); - pop_load_fram_det_col(); - pop_control(); - pop_savekid_state(); -} diff --git a/applications/PoP/roomtest/pop_ctrl.h b/applications/PoP/roomtest/pop_ctrl.h deleted file mode 100644 index 8964ae0..0000000 --- a/applications/PoP/roomtest/pop_ctrl.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * pop_ctrl.h — управление Kid (Фаза K2b): порт диспетчера control() - * (SDLPoP seg005.c) + модель ввода read_user_control/user_control - * (seg006.c) поверх held-state клавиатуры . - * - * Kid-only подмножество: без меча и стражи. Map-запросы (стена/край/ - * захват) ЗАСТАБЛЕНЫ «открытый пол» — реальная коллизия (стоп у стены, - * падение в ямы, повисание) приходит в K3/K4. Даёт отклик на клавиши: - * бег влево/вправо, разворот, стоп, присед, прыжок с места, прыжок в - * беге, присед-прыжок. - * - * Раскладка (kbd_raw, PS/2 Set 2): ←/→ = движение, ↓ = присед, ↑ = - * прыжок вверх (с →), Shift = осторожный шаг (K3). ESC — выход (проверяет - * приложение сам, канал raw забирает весь ввод у DSS). - */ -#ifndef POP_CTRL_H -#define POP_CTRL_H - -#include - -/* МОДУЛЬ ЖИВЁТ В БАНКЕ 5 (--bank 5=pop_ctrl.c), поэтому всё, что зовут - * снаружи, помечено __banked. Зовут с трёх сторон: главный цикл - * (резидент), guards.c (банк 1) и pop_map.c (банк 3) — банк→банк - * работает, трамплин сохраняет страницу окна на стеке. Диспетчер - * дёргается один раз за кадр на персонажа, так что цена перехода - * незаметна. Сама шина control_* лежит в pop_state.c (см. ниже). */ - -/* Открыть raw-канал клавиатуры и обнулить память авто-повтора. - * 0 — OK, -1 — ошибка (EBUSY и пр., см. kbd_raw_open). */ -int pop_ctrl_init(void) __banked; -void pop_ctrl_close(void) __banked; - -/* Один кадр ввода: прочитать клавиши -> обновить control_* -> прогнать - * диспетчер control() (может сменить Kid.curr_seq). Звать ПЕРЕД - * kid_tick() (play_seq продолжит с новой последовательности). */ -void pop_ctrl_tick(void) __banked; - -/* Один кадр синтетического управления attract-demo. move — код SDLPoP: - * 0 nothing, 1 forward, 2 backward, 3 up, 4 down, 5 up+forward, - * 6 shift, 7 отпустить shift, -1 ничего не менять. Raw-клавиатуру не - * читает: это важно, чтобы ввод мог сперва прервать demo. */ -void pop_ctrl_auto_move(int8_t move) __banked; - -/* control_shift зажат ПРЯМО СЕЙЧАС? — для check_grab в физике (pop_map): - * зацеп за уступ в падении по Shift. Валидно после pop_ctrl_tick. */ -int8_t pop_ctrl_shift_held(void) __banked; - -/* ---- Шина синтетического ввода (порт глобалов control_* из seg005) ---- - * В оригинале ИИ соперника (autocontrol_*, seg002) не имеет своего - * диспетчера: он ВЫСТАВЛЯЕТ эти переменные, а дальше исполняется тот же - * control(), что и для игрока. Значения — CONTROL_RELEASED/IGNORE/HELD. */ -#define POP_CONTROL_RELEASED 0 -#define POP_CONTROL_IGNORE 1 -#define POP_CONTROL_HELD (-1) -/* Оси ЭТОГО кадра (абсолютные): X = -1 влево / +1 вправо, Y = -1 вверх / - * +1 вниз. Для ИИ «вперёд/назад» уже в системе персонажа, поэтому оси он - * заполняет как есть, без flip_control_x. */ -/* Определены в pop_state.c (резидент W1/W2), а не в pop_ctrl.c: шину - * трогают три банка сразу, а данные банкового модуля живут в _DATA лишь - * пока сборка идёт без --bank-data. */ -extern int8_t control_x, control_y, control_shift; -#define POP_CONTROL_HELD_FORWARD (-1) -#define POP_CONTROL_HELD_BACKWARD 1 -#define POP_CONTROL_HELD_UP (-1) -#define POP_CONTROL_HELD_DOWN 1 -extern int8_t control_forward, control_backward, control_up, control_down, - control_shift2; - -/* Диспетчер (seg005:252) для АКТИВНОГО персонажа Char. Игрок идёт через - * pop_ctrl_tick (тот делает user_control с зеркалом «вперёд»), страж — из - * своего тика напрямую. */ -void pop_control(void) __banked; - -/* Снять флаг «вступительная тема уровня 1 уже играла». */ -void pop_ctrl_level_start(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_cutscene.c b/applications/PoP/roomtest/pop_cutscene.c deleted file mode 100644 index 7c61cca..0000000 --- a/applications/PoP/roomtest/pop_cutscene.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * pop_cutscene.c — общий data-driven шагатель кат-сцен, банк 9 (FG8). - * - * Один вызов = один логический кадр. WAIT съедает текущий шаг сразу, поэтому - * WAIT(1) откладывает следующую видимую команду ровно на один тик. Команды - * без ожидания выдаются по одной: runtime успевает переключить палитру, - * собрать hidden page или сделать fade до следующего шага. - */ -#include -#include "pop_cutscene.h" - -void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked -{ - cs->script = script; - cs->pc = 0; - cs->waiting = 0; - cs->ended = 0; -} - -void pop_cutscene_abort(pop_cutscene_t *cs) __banked -{ - cs->waiting = 0; - cs->ended = 1; -} - -pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked -{ - const pop_cs_cmd_t *cmd; - - *arg = 0; - if (cs->ended) return POP_CS_EVENT_END; - if (cs->waiting) { - --cs->waiting; - return POP_CS_EVENT_NONE; - } - - cmd = &cs->script[cs->pc++]; - *arg = cmd->arg; - switch (cmd->op) { - case POP_CS_SHOW: return POP_CS_EVENT_SHOW; - case POP_CS_PALETTE: return POP_CS_EVENT_PALETTE; - case POP_CS_FADE_IN: return POP_CS_EVENT_FADE_IN; - case POP_CS_FADE_OUT: return POP_CS_EVENT_FADE_OUT; - case POP_CS_FLASH: return POP_CS_EVENT_FLASH; - case POP_CS_WAIT: - /* Текущий tick — первый из N: это исключает скрытый +1 кадр. */ - cs->waiting = cmd->arg; - if (cs->waiting) --cs->waiting; - return POP_CS_EVENT_NONE; - case POP_CS_END: - default: - cs->ended = 1; - return POP_CS_EVENT_END; - } -} diff --git a/applications/PoP/roomtest/pop_cutscene.h b/applications/PoP/roomtest/pop_cutscene.h deleted file mode 100644 index d49303b..0000000 --- a/applications/PoP/roomtest/pop_cutscene.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * pop_cutscene.h — маленький интерпретатор сценариев экранных сцен (FG8). - * - * Данные сценария статичны, состояние — только pc и счётчик ожидания. Это - * пригодится и PV intro, и сценам перед уровнями FG9: графика/звук остаются - * у вызывающего режима, а не тащатся в общий механизм. - */ -#ifndef POP_CUTSCENE_H -#define POP_CUTSCENE_H - -#include - -/* ТИК ОРИГИНАЛА -> НАШ КАДР. Все длительности сцен взяты из SDLPoP в его - * тиках (BASE_FPS = 60), а ждём мы кадрами луча (50 Гц). Без пересчёта - * сцена идёт на 20 % дольше — незаметно, пока она немая, и сразу слышно, - * когда под неё играет музыка: реплика кончается раньше картинки. - * Аргумент — константа сценария, до 2500, так что 32-бит не возникает. */ -#define POP_T60(t) ((uint16_t)((uint16_t)(t) * 5u / 6u)) - -typedef enum { - POP_CS_SHOW = 1, /* arg: номер готового кадра */ - POP_CS_WAIT, /* arg: число логических кадров */ - POP_CS_PALETTE, /* arg: номер палитрового набора */ - POP_CS_FADE_IN, - POP_CS_FADE_OUT, - POP_CS_FLASH, /* arg: длительность белой вспышки */ - POP_CS_END -} pop_cs_opcode_t; - -typedef struct { - uint8_t op; - uint16_t arg; -} pop_cs_cmd_t; - -typedef struct { - const pop_cs_cmd_t *script; - uint8_t pc; - uint16_t waiting; - uint8_t ended; -} pop_cutscene_t; - -typedef enum { - POP_CS_EVENT_NONE = 0, - POP_CS_EVENT_SHOW, - POP_CS_EVENT_PALETTE, - POP_CS_EVENT_FADE_IN, - POP_CS_EVENT_FADE_OUT, - POP_CS_EVENT_FLASH, - POP_CS_EVENT_END -} pop_cs_event_t; - -void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked; -void pop_cutscene_abort(pop_cutscene_t *cs) __banked; -pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked; - -#endif /* POP_CUTSCENE_H */ diff --git a/applications/PoP/roomtest/pop_demo.c b/applications/PoP/roomtest/pop_demo.c deleted file mode 100644 index 4aaa18c..0000000 --- a/applications/PoP/roomtest/pop_demo.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * pop_demo.c — воспроизведение attract-demo SDLPoP, банк 9 (FG7). - * - * Это не отдельная физика и не сценарные телепорты. Таблица custom->demo_moves - * подаёт ровно те же control_* в pop_ctrl_auto_move(), через которые идут - * игрок и автоконтроль персонажей. Поэтому демо проверяет настоящий маршрут - * level 0, а не его нарисованную имитацию. - */ -#include -#include -#include "pop_ctrl.h" -#include "pop_guard.h" -#include "pop_map.h" /* hitp_curr — смерть demo имеет приоритет над AI */ -#include "pop_demo.h" - -typedef struct { - uint8_t time; - int8_t move; -} demo_move_t; - -/* data.h SDLPoP: демо пробегает уровень 0 до комнаты 24. Последний -1 - * означает «больше не менять уже поданный control_*», а не ввод. */ -static const demo_move_t demo_moves[] = { - {0x00, 0}, {0x01, 1}, {0x0D, 0}, {0x1E, 1}, {0x25, 5}, - {0x2F, 0}, {0x30, 1}, {0x41, 0}, {0x49, 2}, {0x4B, 0}, - {0x63, 2}, {0x64, 0}, {0x73, 5}, {0x80, 6}, {0x88, 3}, - {0x9D, 7}, {0x9E, 0}, {0x9F, 1}, {0xAB, 4}, {0xB1, 0}, - {0xB2, 1}, {0xBC, 0}, {0xC1, 1}, {0xCD, 0}, {0xE9, -1}, - /* do_auto_moves читает moves[demo_index] ещё после сдвига индекса. - * Это недостижимая метка из data.h, не команда: она держит индекс в - * границах, пока demo_time доходит до 0xFE. */ - {0xFF, -2} -}; - -static uint8_t demo_time; -static uint8_t demo_index; - -void pop_demo_begin(void) __banked -{ - demo_time = 0; - demo_index = 0; -} - -uint8_t pop_demo_tick(void) __banked -{ - uint8_t index; - int8_t move; - - /* Урон мечом сводится ПОСЛЕ этого вызова в предыдущем игровом кадре. - * На следующем тике HP уже ноль, но pop_kid_dead ещё не поднят: обычный - * pop_ctrl_tick делает это в ctrl_kid_death(), а demo обходит его своим - * AI. Без этого гарда AI снова управлял мёртвым Кидом, возвращал его в - * стойку и страж убивал его по кругу. Attract-demo при смерти кончается; - * текущий главный цикл ещё дорисует один последний кадр и уйдёт в title. */ - if (hitp_curr == 0) return 1; - - /* do_demo(): в бою запись времени/кнопок стоит, Кидом управляет тот же - * combat AI, что стражами, но с отдельным skill 10. */ - if (pop_demo_kid_ai()) return 0; - if (demo_time >= 0xFE) return 1; - ++demo_time; - index = demo_index; - if (demo_moves[index].time <= demo_time) ++demo_index; - else index = (uint8_t)(demo_index - 1); - move = demo_moves[index].move; - pop_ctrl_auto_move(move); - return (uint8_t)(demo_time >= 0xFE); -} - -uint8_t pop_demo_user_input(void) __banked -{ - return kbd_raw_any_down(); -} diff --git a/applications/PoP/roomtest/pop_demo.h b/applications/PoP/roomtest/pop_demo.h deleted file mode 100644 index e4c0002..0000000 --- a/applications/PoP/roomtest/pop_demo.h +++ /dev/null @@ -1,17 +0,0 @@ -/* pop_demo.h — attract-mode уровня 0, банк 9 (FG7). */ -#ifndef POP_DEMO_H -#define POP_DEMO_H - -#include - -/* Начать неизменяемую запись demo_moves SDLPoP с кадра ноль. */ -void pop_demo_begin(void) __banked; - -/* Один логический кадр записи: подать синтетический control_*. - * Возвращает 1, когда запись исчерпана. */ -uint8_t pop_demo_tick(void) __banked; - -/* «Любой ввод» без покадрового перебора 512 scan-кодов. */ -uint8_t pop_demo_user_input(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_draw.c b/applications/PoP/roomtest/pop_draw.c deleted file mode 100644 index 6be995e..0000000 --- a/applications/PoP/roomtest/pop_draw.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * pop_draw.c — выбор ядра libbgi для heal: линейное «noclip», если - * прямоугольник целиком на экране, иначе общее клипающее. Объявление и - * мотивация — `_pop_draw.h`. - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ РЕЗИДЕНТНЫЙ МОДУЛЬ, а не inline в заголовке. Замер - * CLIP-1 (2026-08-01), SDCC 4.5: `static inline` тут обходится втридорога — - * компилятор И встраивает тело в каждый вызов (181 Б на место), И оставляет - * отдельную мёртвую копию в каждом TU. У стража это раздуло - * тогдашний `pop_guard_heal` с ~60 до 663 Б. Пяти местам вызова это стоило бы ~1.4 КБ - * ради экономии ~50 тактов на вызов — при том что BANK2 занят на 86 %. - * - * Резидент W1 (_CODE), а не банк: сюда зовут из ДВУХ разных банков - * (pop_bg.c → BANK2, pop_cdraw.c → BANK4). W1 замаплено всегда, поэтому из - * банка это обычный `call` без трамплина — тот же приём, что у - * pop_sword_draw. - */ -#include -#include -#include "_pop_draw.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ - -void pop_heal_fast(int x, int y, int w, int h) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча, см. pop_pace.h */ - if (w <= 0 || h <= 0) return; - if (pop_onscreen_cols(x, y, (uint16_t)w, (uint16_t)h)) - gfx_heal_noclip(x, y, (uint8_t)w, (uint8_t)h); - else - gfx_heal(x, y, w, h); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ /* и ПОСЛЕ: широкий heal сам по себе ~70 000 тактов */ -} diff --git a/applications/PoP/roomtest/pop_flow.c b/applications/PoP/roomtest/pop_flow.c deleted file mode 100644 index b96fa98..0000000 --- a/applications/PoP/roomtest/pop_flow.c +++ /dev/null @@ -1,48 +0,0 @@ -/* pop_flow.c — таблица level-flow SDLPoP, банк 9 (FG9). */ -#include -#include "pop_level.h" -#include "pop_flow.h" - -/* Индекс равен номеру следующего уровня. pre_cutscene повторяет - * tbl_cutscenes[] SDLPoP, но тип значения — компактный экранный сценарий, - * а не указатель на игровую функцию. Уровень 14 намеренно скрывает номер. */ -static const pop_level_flow_t level_flow[POP_LEVEL_LAST + 1] = { - { 0, POP_PRE_NONE, 0, 0 }, { 1, POP_PRE_NONE, 1, 0 }, - { 2, POP_PRE_2_6, 1, 0 }, { 3, POP_PRE_NONE, 1, 0 }, - { 4, POP_PRE_4, 1, 0 }, { 5, POP_PRE_NONE, 1, 0 }, - { 6, POP_PRE_2_6, 1, 0 }, { 7, POP_PRE_NONE, 1, 0 }, - { 8, POP_PRE_8, 1, 0 }, { 9, POP_PRE_9, 1, 0 }, - { 10, POP_PRE_NONE, 1, 0 }, { 11, POP_PRE_NONE, 1, 0 }, - { 12, POP_PRE_12, 1, 0 }, { 13, POP_PRE_NONE, 1, 0 }, - { 14, POP_PRE_NONE, 0, 1 } -}; - -const pop_level_flow_t *pop_flow_level(uint8_t level) __banked -{ - if (level > POP_LEVEL_LAST) return 0; - return &level_flow[level]; -} - -pop_pre_cutscene_t pop_flow_pre_cutscene(uint8_t level, - uint8_t remaining_minutes) __banked -{ - pop_pre_cutscene_t scene; - const pop_level_flow_t *flow = pop_flow_level(level); - - if (!flow) return POP_PRE_NONE; - scene = (pop_pre_cutscene_t)flow->pre_cutscene; - /* hourglass_frame(): frame 6 iff `time_bound[0] (6) > rem_min`. */ - if (scene == POP_PRE_12 && remaining_minutes < 6) - return POP_PRE_12_SHORT; - return scene; -} - -uint8_t pop_flow_is_ending(uint8_t level, uint8_t room) __banked -{ - const pop_level_flow_t *flow = pop_flow_level(level); - - /* WIN_LEVEL/WIN_ROOM в SDLPoP: level 14, room 5. Номер комнаты держим - * здесь, а не в горячем игровом цикле, чтобы таблица оставалась - * единственным владельцем специальных переходов. */ - return (uint8_t)(flow && flow->ending_rule && room == 5); -} diff --git a/applications/PoP/roomtest/pop_flow.h b/applications/PoP/roomtest/pop_flow.h deleted file mode 100644 index 47022cc..0000000 --- a/applications/PoP/roomtest/pop_flow.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * pop_flow.h — таблица маршрута уровней и pre-level cutscene (FG9). - * - * Здесь нет механики rooms/guards: номер назначения превращается в правило - * оболочки один раз на границе уровня. Поэтому добавить особый маршрут не - * означает разбрасывать условия по горячему игровому кадру. - */ -#ifndef POP_FLOW_H -#define POP_FLOW_H - -#include - -typedef enum { - POP_PRE_NONE = 0, - POP_PRE_2_6, - POP_PRE_4, - POP_PRE_8, - POP_PRE_9, - POP_PRE_12, - POP_PRE_12_SHORT -} pop_pre_cutscene_t; - -typedef struct { - uint8_t level; - uint8_t pre_cutscene; - uint8_t show_level_number; - uint8_t ending_rule; -} pop_level_flow_t; - -/* Нулевой указатель означает некорректный номер назначения. Сцена 12 - * выбирается по тем же границам SDLPoP: при <=5 оставшихся минутах короткая. */ -const pop_level_flow_t *pop_flow_level(uint8_t level) __banked; -pop_pre_cutscene_t pop_flow_pre_cutscene(uint8_t level, - uint8_t remaining_minutes) __banked; - -/* Победная комната не принадлежит механике movement: это правило маршрута - * оболочки. Сейчас оно есть только у скрытого уровня 14. */ -uint8_t pop_flow_is_ending(uint8_t level, uint8_t room) __banked; - -#endif /* POP_FLOW_H */ diff --git a/applications/PoP/roomtest/pop_font.h b/applications/PoP/roomtest/pop_font.h deleted file mode 100644 index 1ef09fc..0000000 --- a/applications/PoP/roomtest/pop_font.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * pop_font.h — контракт FONT\FONT.ATL, СГЕНЕРИРОВАН. - * Источник: SDLPoP hc_small_font_data[] и hc_font_data[]. - * Генератор: toolchain/pop_extract_font.py. Руками не править. - */ -#ifndef POP_FONT_H -#define POP_FONT_H - -#include - -#define POP_FONT_COLOR 0x3F -#define POP_FONT_DARK_COLOR 0x3E -#define POP_FONT_FIRST 32 -#define POP_FONT_LAST 126 -#define POP_FONT_SMALL_BASE 0 -#define POP_FONT_SMALL_ASCENT 5 -#define POP_FONT_SMALL_SPACE 1 -#define POP_FONT_BIG_BASE 95 -#define POP_FONT_BIG_ASCENT 7 -#define POP_FONT_BIG_SPACE 1 -/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом. - * Набор обрезан по '_' — им пишется только таблица рекордов. */ -#define POP_FONT_DARK_BASE 190 -#define POP_FONT_DARK_FIRST 32 -#define POP_FONT_DARK_LAST 95 -#define POP_FONT_SNAPSHOT_OFF 0x3C00 -#define POP_FONT_ATLAS_SIZE 10841 - -#endif diff --git a/applications/PoP/roomtest/pop_geom.c b/applications/PoP/roomtest/pop_geom.c deleted file mode 100644 index 318e24a..0000000 --- a/applications/PoP/roomtest/pop_geom.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * pop_geom.c — общая геометрия + PRNG оригинала. См. pop_geom.h. - */ -#include "pop_geom.h" - -/* data.h: шаг 14 (ширина тайла в координатах персонажа), [5] = col 0. */ -const int16_t pop_x_bump[20] = { - -12, 2, 16, 30, 44, 58, 72, 86, 100, 114, - 128, 142, 156, 170, 184, 198, 212, 226, 240, 254 -}; -const int16_t pop_y_land[5] = {-8, 55, 118, 181, 244}; - -#define TILE_SIZEY_OFF 60 /* сдвиг «ряд 0 начинается выше нуля» */ - -/* Медленный хвост — ОТДЕЛЬНОЙ функцией. Иначе SDCC видит одно и то же - * выражение в двух ветках и поднимает деление в вершину функции: быстрые - * возвраты уже не спасают, __divsint зовётся всё равно (проверено — - * 5 вызовов за кадр остались после первой переписи). */ -static int8_t y_row_div(int16_t t) -{ - return (int8_t)(t / TILE_SIZEY % 4 - 1); -} - -int8_t pop_y_to_row(int16_t y) -{ - /* Было `(y + 60) / 63 % 4 - 1` — SDCC разворачивает это в __divsint плюс - * __modsint (а тот внутри снова зовёт __divsint): ~5 400 тактов на вызов - * по замеру в MAME, при том что полос всего четыре. Цепочка сравнений - * повторяет ИМЕННО прежнюю арифметику, включая усечение деления К НУЛЮ - * для отрицательных (t в −62..−1 даёт 0, а не −1). */ - int16_t t = (int16_t)(y + TILE_SIZEY_OFF); - if (t >= 0) { - if (t < TILE_SIZEY) return -1; /* 0 % 4 - 1 */ - if (t < 2*TILE_SIZEY) return 0; - if (t < 3*TILE_SIZEY) return 1; - if (t < 4*TILE_SIZEY) return 2; - if (t < 5*TILE_SIZEY) return -1; /* 4 % 4 = 0 */ - } else if (t > -TILE_SIZEY) { - return -1; /* t/63 == 0 -> 0 % 4 - 1 */ - } - return y_row_div(t); -} - -/* Уложить значение в диапазон 0..maxv. Вызовы оригинала — prandom(1), - * prandom(255), prandom(0xFF): делитель степень двойки, то есть маска, а не - * деление. __moduint на Z80 стоит заметно дороже проверки n & (n-1). */ -static uint16_t pop_rnd_fit(uint16_t v, uint16_t maxv) -{ - uint16_t n = (uint16_t)(maxv + 1); - if ((uint16_t)(n & (uint16_t)(n - 1)) == 0) - return (uint16_t)(v & (uint16_t)(n - 1)); - return (uint16_t)(v % n); -} - -#if POP_PRANDOM_EXACT -/* ---- LCG оригинала: s = s*214013 + 2531011 (seg009:321) ------------ * - * - * ЕДИНСТВЕННОЕ место в порте на ассемблере, и вот почему. На Z80 нет - * умножения, а SDCC для 32-битного `s * 214013` зовёт __mullong — 8 430 - * тактов на вызов (замер в MAME). Написанное на C через 16-битные - * половины это ~3 500. Здесь ~1 000, при полностью той же - * последовательности, что в SDLPoP. Альтернатива «взять генератор - * попроще» (8-битный RND Apple II, xorshift) экономит меньше и ломает - * совместимость с эталоном, по которому сверяем картинку. - * - * Приём: 214013 = ((((1<<1)+1)<<2 + 1)<<4 + 1)<<10 - 3 — схема Горнера по - * РАЗРЕЖЕННОЙ записи константы. Вместо 12 сложений (по числу единиц в - * 0x343FD) — 17 удвоений, ТРИ сложения и одно вычитание. Величина 3*s, - * нужная в конце, попадается по дороге на втором шаге — её и сохраняем. - * - * ABI __sdcccall(1): arg1 (указатель на сид) -> HL, возврат -> DE. IX не - * используется, сохранять нечего. Клоббер AF/BC/DE/HL. Аккумулятор — - * DE:HL (DE старшее слово); s.lo живёт в BC, s.hi и 3*s — в статиках - * (регистров на всё не хватает). - */ -uint16_t pop_pr_ptr; /* адрес сида */ -uint16_t pop_pr_sh; /* старшее слово исходного сида */ -uint16_t pop_pr_3s_lo, pop_pr_3s_hi; /* 3*s, нужное в конце */ - -static uint16_t pop_lcg_step(pop_rnd_t *seed) __naked -{ - (void)seed; - __asm - ld (_pop_pr_ptr), hl - ld c, (hl) - inc hl - ld b, (hl) ; BC = s.lo - inc hl - ld a, (hl) - ld (_pop_pr_sh), a - inc hl - ld a, (hl) - ld (_pop_pr_sh + 1), a ; (pop_pr_sh) = s.hi - - ld h, b - ld l, c - ld de, (_pop_pr_sh) ; акк = s - - ;; акк = акк*2 + s => 3s - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) ; LD A,(nn) флаги НЕ трогает - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - ld (_pop_pr_3s_lo), hl - ld (_pop_pr_3s_hi), de - - ;; акк = акк*4 + s => 13s - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - - ;; акк = акк*16 + s => 209s - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - - ;; акк *= 1024 => 214016s (10 удвоений) - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - - ;; акк -= 3s => 214013s - ld bc, (_pop_pr_3s_lo) - or a ; CY = 0 - sbc hl, bc - ld bc, (_pop_pr_3s_hi) ; LD BC,(nn) флаги НЕ трогает - ex de, hl - sbc hl, bc - ex de, hl - - ;; акк += 2531011 = 0x0026_9EC3 - ld bc, #0x9EC3 - add hl, bc - ld bc, #0x0026 - ex de, hl - adc hl, bc - ex de, hl - - ;; сохранить сид, вернуть СТАРШЕЕ слово в DE - push de - ex de, hl ; DE = младшее слово - ld hl, (_pop_pr_ptr) - ld (hl), e - inc hl - ld (hl), d - inc hl - pop de ; DE = старшее слово - ld (hl), e - inc hl - ld (hl), d - ret - __endasm; -} - -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv) -{ - return pop_rnd_fit(pop_lcg_step(seed), maxv); -} - -#else /* !POP_PRANDOM_EXACT — генератор попроще, НЕ совместимый с эталоном */ - -/* xorshift16 + шаг Вейля. Зачем не LCG оригинала: тот 32-битный, и даже - * без __mullong (см. ветку выше) стоит ~7 000 тактов на вызов — при двух - * вызовах за кадр это 3 % бюджета на генератор случайных чисел. Здесь - * умножений нет вовсе, только сдвиги и xor. - * - * Почему НЕ 8-битный RND Apple II (RNDseed := 5*RNDseed + 23 mod 256, - * Prince-of-Persia-Apple-II): он ещё быстрее, но у LCG по модулю 256 - * младшие биты вырождены — бит 0 просто чередуется. Наши вызовы это - * видят: раскладка кладки берёт prandom(1) (один бит) и prandom(4), и - * вместо шума получилась бы правильная шахматка. У xorshift такой - * структуры нет, а стоит он примерно столько же. - * - * Шаг Вейля (+0x9E37, нечётный) нужен ещё и потому, что у чистого - * xorshift ноль — неподвижная точка, а сид кладки (номер комнаты + ряд + - * колонка) вполне может оказаться нулём. - * - * ПОСЛЕДСТВИЕ: последовательность отличается от SDLPoP — другая (но - * статистически такая же) раскладка кладки и другие броски в боёвке. - * Поэтому по умолчанию собирается НЕ эта ветка: после переписывания LCG - * на ассемблер выигрыш от смены генератора почти исчез, а сверять - * картинку с эталоном стало важнее. Ветка оставлена как запасной ход. */ -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv) -{ - uint16_t s = seed->lo; - s ^= (uint16_t)(s << 7); - s ^= (uint16_t)(s >> 9); - s ^= (uint16_t)(s << 8); - s = (uint16_t)(s + 0x9E37u); - seed->lo = s; - seed->hi = 0; /* старшая половина не используется */ - /* Отдаём СТАРШИЙ байт: у него нет короткопериодической структуры - * младших бит, а вызывающие берут от результата именно младшие. */ - return pop_rnd_fit((uint16_t)(s >> 8), maxv); -} - -#endif diff --git a/applications/PoP/roomtest/pop_geom.h b/applications/PoP/roomtest/pop_geom.h deleted file mode 100644 index 67ef250..0000000 --- a/applications/PoP/roomtest/pop_geom.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * pop_geom.h — общая геометрия PoP и PRNG оригинала. - * - * Сюда сведено то, что раньше дублировалось по модулям (x_bump/y_land в - * pop_kid и pop_map, y_to_row в pop_bg и pop_map, 32-битный LCG в pop_bg и - * pop_trob). Кроме экономии это ФУНДАМЕНТ bank-safe API: модуль живёт в - * W1/W2 и не трогает графику, поэтому его может звать и главный цикл, и - * резидент W3, и будущий __banked-код стражей (docs/layout_plan_v2.md §4). - */ -#ifndef POP_GEOM_H -#define POP_GEOM_H - -#include - -#define FIRST_ONSCREEN_COLUMN 5 /* индекс col 0 комнаты в x_bump */ -#define TILE_SIZEX 14 /* ширина тайла в координатах персонажа */ -#define TILE_SIZEY 63 /* высота ряда */ - -/* x_bump (data.h): левая граница колонки в координатах персонажа; колонка - * комнаты col = x_bump[col + FIRST_ONSCREEN_COLUMN]. y_land: пол ряда - * (индекс row+1; [0] — ряд «над комнатой»). */ -extern const int16_t pop_x_bump[20]; -extern const int16_t pop_y_land[5]; - -/* y_to_row_mod4 (seg006): ряд по координате y с оборотом mod 4 (−1 = полоса - * над комнатой, 3 = под комнатой). */ -int8_t pop_y_to_row(int16_t y); - -/* prandom (порт seg009:321). Сид ВНЕШНИЙ: у стен (раскладка кладки) и у - * анимаций тайлов (фаза факелов) свои последовательности, смешивать их - * нельзя. - * - * ДВА генератора, выбор через POP_PRANDOM_EXACT (см. pop_geom.c): - * 1 (по умолчанию) — LCG оригинала (s*214013+2531011) БИТ-В-БИТ: та же - * раскладка кладки и те же броски, что в SDLPoP, поэтому по картинке - * можно сверяться с эталоном; - * 0 — xorshift16 + шаг Вейля, без единого умножения. Дешевле ровно на - * 5 646 тактов за кадр, 1.3 % бюджета (замер A/B в MAME, комната 3, - * 175 кадров: 403 632 против 397 986). Последовательность другая — - * статистически эквивалентная, но не та же. - * - * Обе версии считают 16-битными половинами, а не unsigned long: на 32-бит - * умножении SDCC зовёт __mullong, и это 8 430 тактов на вызов (замер в - * MAME, breakpoint на __mullong). - * - * ЗАДЕЛ: разрыв между версиями определяется не алгоритмом, а кодогенерацией - * SDCC — те же генераторы на Z80-ассемблере укладываются в 86..148 тактов. - * Если процент понадобится, сначала переписать в asm ОРИГИНАЛЬНЫЙ LCG (там - * умножение на константу), а менять генератор — только если и этого мало. */ -typedef struct { uint16_t lo, hi; } pop_rnd_t; - -#ifndef POP_PRANDOM_EXACT -#define POP_PRANDOM_EXACT 1 -#endif - -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv); - -/* Сид из 16-битного числа (старшая половина = 0). */ -#define pop_prandom_set(s, v) do { (s).lo = (uint16_t)(v); (s).hi = 0; } while (0) - -#endif diff --git a/applications/PoP/roomtest/pop_guard.c b/applications/PoP/roomtest/pop_guard.c deleted file mode 100644 index 099e852..0000000 --- a/applications/PoP/roomtest/pop_guard.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * pop_guard.c — СОСТОЯНИЕ и ЛОГИКА стража (W1/W2). См. pop_guard.h. - * - * Здесь только то, что должно оставаться достижимым из банка (guards.c): - * поля Guard, HP, вход в комнату, чит-убийство, чтение кадра из таблицы. - * ОТРИСОВКА — в pop_cdraw.c (банк 4), общая на всех Char. - */ -#include -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_level.h" -#include "pop_kid.h" /* Char/play_seq — интерпретатор общий */ -#include "pop_map.h" /* hitp_* — HP Кида */ -#include "pop_state.h" /* pop_immortal — чит бессмертия */ -#include "pop_tile.h" /* POP_TILE_DIV — колонка по X без деления */ -#include "kid_data.h" - -pop_char_t Guard; -uint8_t guardhp_curr, guardhp_max; -int8_t guardhp_delta; -uint8_t pop_guard_hurt; -int8_t can_guard_see_kid; -int8_t is_guard_notice; -uint8_t guard_skill; -int8_t guard_refrac, justblocked, kid_sword_strike; -int8_t offguard, holding_sword; -int8_t pop_united_shadow; /* см. pop_guard.h: 0 / счётчик / −1 */ -uint8_t pop_shadow_init; -int8_t pop_guard_notice_timer; /* фора Джафара (уровень 13) */ - -/* Сид бросков боёвки. В оригинале генератор один на всё, у нас - * последовательности разведены по доменам (кладка / анимация тайлов / бой), - * см. pop_geom.h — иначе перерисовка стены сбивала бы броски стража. */ -pop_rnd_t pop_fight_seed; - -/* Кадр стража (порт cur_frame для Char). Глобальный, а не статик: его - * заполняет логика (W1/W2), а читает отрисовка из резидента W3. */ -kframe pop_gframe; - -uint8_t pop_guard_present(void) -{ - return (uint8_t)(Guard.charid != 0 && Guard.alive < 0 && guardhp_curr != 0); -} - -void pop_guard_reset(void) -{ - Guard.charid = 0; - Guard.alive = 0; - Guard.direction = 0; - guardhp_curr = 0; - guardhp_delta = 0; - can_guard_see_kid = 0; - is_guard_notice = 0; - guard_refrac = justblocked = kid_sword_strike = 0; - offguard = holding_sword = 0; -} - -/* kill guard cheat (seg000:786): - * if (Guard.charid != charid_4_skeleton) { - * guardhp_delta = -guardhp_curr; - * Guard.alive = 0; - * } - * Скелета чит не убивает — он и в оригинале бессмертен. */ -void pop_guard_kill(void) -{ - if (Guard.charid == CHARID_4_SKELETON) return; - if (!pop_guard_present()) return; - /* HP не обнуляем — ставим дельту, её применит pop_do_delta_hp. Дальше - * play_guard увидит «жив, но HP ноль», сам переведёт в alive = 0 и - * вызовет on_guard_killed: брызги, вспышка, а на 13-м уровне — флаг - * «выход разрешён». - * - * ОСОЗНАННОЕ РАСХОЖДЕНИЕ (решение пользователя 2026-08-13, ради скорости - * прогонов): оригинал (seg000:786) ставит здесь ещё и `Guard.alive = 0`, - * а гейт в play_guard (seg006:1490) требует `alive < 0` — то есть у него - * чит убивает стража В ОБХОД события смерти, и победа над Джафаром по - * читу выхода на 14-й уровень НЕ открывает. Для отладки это дорого: - * каждый прогон приходится честно выигрывать бой. Убрав одну строку, - * получаем ровно «как будто убил Кид». На игру не влияет — читы в - * релизной сборке выключены (pop_cheats). */ - guardhp_delta = (int8_t)-guardhp_curr; -} - -/* take_hp (seg006:06BD) — общий для боёвки и физики; см. pop_guard.h. */ -uint8_t pop_take_hp(uint8_t count) -{ - if (Char.charid == CHARID_0_KID) { - /* ЧИТ БЕССМЕРТИЯ, уровень 2 (pop_state.h): гасим ТОЛЬКО мелкий урон - * — падение с двух этажей, придавливание плитой. Мгновенная смерть - * (пики, чомпер, падение с трёх этажей, удар вне боевой стойки) - * приходит с count = 100 и проходит всегда: у читa нет задачи - * отменять смерть, у него задача отменить «минус одно деление». - * Уровень 1 сюда не вмешивается вовсе — он живёт в hurt_by_sword и - * гасит только удары мечом. */ - if (pop_immortal >= 2 && count < 100) return 0; - if (count >= hitp_curr) { hitp_delta = (int8_t)-hitp_curr; return 1; } - hitp_delta = (int8_t)-(int8_t)count; - } else { - if (count >= guardhp_curr) { guardhp_delta = (int8_t)-guardhp_curr; return 1; } - guardhp_delta = (int8_t)-(int8_t)count; - } - return 0; -} - -/* timers (seg003:0735) — кадровые счётчики спецсобытий. - * - * Вспышка слияния с тенью досчитывает до нуля и УХОДИТ В −1: это «уже - * слились», состояние до конца уровня. Именно на −1 смотрят check_shadow - * (больше не поднимать) и «появление плит» в комнатах 2/13 (pop_map). - * Ноль как конечное значение не годится — он неотличим от «не было». */ -void pop_frame_timers(void) -{ - if (pop_united_shadow > 0) { - --pop_united_shadow; - if (pop_united_shadow == 0) pop_united_shadow = -1; - } - if (pop_guard_notice_timer > 0) --pop_guard_notice_timer; -} - -/* do_delta_hp (seg003): применить накопленную за кадр дельту HP и обнулить - * её. Звать раз в кадр ПОСЛЕ тиков персонажей, как в play_frame. */ -void pop_do_delta_hp(void) -{ - int16_t hp; - /* Спецсобытие уровня 12 (seg000:1518): ранил ТЕНЬ — ранил себя. Урон - * не делится, а КОПИРУЕТСЯ: тень теряет 1 HP и Кид теряет 1 HP. Без - * этого бой с тенью теряет смысл — её можно было бы просто зарубить. - * Проверка идёт по слоту соперника (у оригинала — по Opp, но в момент - * do_delta_hp там всегда пара Кид/соперник). */ - if (pop_current_level == SHADOW_FIGHT_LEVEL && - Guard.charid == CHARID_1_SHADOW && guardhp_delta != 0) - hitp_delta = guardhp_delta; - if (hitp_delta) { - hp = (int16_t)hitp_curr + hitp_delta; - if (hp < 0) hp = 0; - if (hp > (int16_t)hitp_max) hp = (int16_t)hitp_max; - hitp_curr = (uint8_t)hp; - /* Брызги и красная вспышка — только на УРОН: и draw_kid (seg008:1643), - * и flash_if_hurt (seg003:785) смотрят именно `hitp_delta < 0`. С - * условием «дельта не ноль» их получало и зелье здоровья (+1). */ - if (hitp_delta < 0) pop_kid_hurt = 1; - hitp_delta = 0; - } - if (guardhp_delta) { - hp = (int16_t)guardhp_curr + guardhp_delta; - if (hp < 0) hp = 0; - if (hp > (int16_t)guardhp_max) hp = (int16_t)guardhp_max; - guardhp_curr = (uint8_t)hp; - if (guardhp_delta < 0) pop_guard_hurt = 1; /* -> брызги поверх стража */ - guardhp_delta = 0; - } -} - -/* check_guard_fallout (seg002:0241): персонаж слота Guard провалился НИЖЕ - * комнаты. Уйти в комнату снизу он не может (у стража нет перехода), и - * оригинал его просто убирает: guards_tile комнаты становится −1, то есть - * стража там больше нет и после возврата. У нас тот же смысл — запомнить - * состояние с tile = 30 («стража в комнате больше нет»). - * - * Ветка ТЕНИ (seg002:0241): она исчезает, только если РЕАЛЬНО падает - * (`action == actions_4_in_freefall`) — иначе тень, зашедшую низко по - * своим делам (уровень 5 идёт по нижнему ряду за зельем), убрало бы с - * экрана на ровном месте. Ветка скелета — ниже, он не гибнет, а - * возрождается. - * - * Полосу HP перерисовывать отдельно не надо: pop_hp_draw сравнивает числа - * и сам увидит, что стража не стало. */ -/* Куда и как возрождается упавший СКЕЛЕТ (seg002:252): если под комнатой, - * из которой он выпал, лежит комната 3 — он появляется там снова. Убить - * его нельзя вовсе, падение лишь переносит. */ -#define SKEL_REAPPEAR_ROOM 3 -#define SKEL_REAPPEAR_X 133 -#define SKEL_REAPPEAR_ROW 1 - -/* actions_4_in_freefall (seg005) — тот же номер, что ACT_FREEFALL в - * pop_map.c; здесь свой define, потому что тот приватный для карты. */ -#define ACT_4_IN_FREEFALL 4 - -void pop_guard_fallout(void) -{ - if (Guard.charid == 0 || Guard.y < 211) return; - if (Guard.charid == CHARID_1_SHADOW) { - /* Тень исчезает только в свободном падении; иначе — не наше дело. */ - if (Guard.action != ACT_4_IN_FREEFALL) return; - Guard.direction = DIR_56_NONE; - Guard.alive = 0; - Guard.action = 0; - Guard.charid = 0; - guardhp_curr = 0; - return; - } - if (Guard.charid == CHARID_4_SKELETON) { - uint8_t down = pop_room_link(Guard.room, 3 /* вниз */); - if (down == SKEL_REAPPEAR_ROOM) { - Guard.room = down; - Guard.x = SKEL_REAPPEAR_X; - Guard.curr_row = SKEL_REAPPEAR_ROW; - Guard.direction = 0; /* dir_0_right */ - Guard.alive = -1; - pop_guard_leave(); /* запомнить его в новой комнате */ - return; - } - } - pop_guard_state_save(Guard.room, 30, 0, 0, 0, 0, 0); - Guard.charid = 0; - Guard.direction = 0; - Guard.alive = 0; - guardhp_curr = 0; -} - -/* load_frame для стража (seg006:0293 ветка charid_2_guard): таблица у - * стражей СВОЯ (frame_tbl_guard), индекс = frame + add_frame − 149, где - * add_frame = 70 для кадров 102..106 (seg006:535). */ -void pop_guard_load_frame(void) -{ - int16_t idx = (int16_t)Guard.frame; - if (idx >= 102 && idx < 107) idx += 70; /* add_frame */ - idx -= 149; - if (idx < 0 || idx >= KID_NGFRAMES) { pop_gframe.image = 255; return; } - pop_kid_data_frame(KID_BIN_GFRAMES_OFF, (uint8_t)idx, (uint8_t *)&pop_gframe); -} - -/* leave_guard (seg002:02F5): вызывать ПЕРЕД сменой комнаты, пока Guard ещё - * держит стража уходящей комнаты. Мёртвого запоминаем вместе с - * последовательностью — тогда при возврате он лежит там же, а не встаёт - * живым. */ -void pop_guard_leave(void) -{ - if (Guard.charid == 0) return; /* стража не было */ - /* Тень и МЫШЬ в данные уровня не записываются (seg002:02F5): они не - * «стражи комнаты», а спецсобытия — вернувшись, их надо получить заново - * от check_shadow / check_mouse, а не поднять из guards_tile. */ - if (Guard.charid == CHARID_1_SHADOW || Guard.charid == CHARID_24_MOUSE) return; - pop_guard_state_save(Guard.room, - (uint8_t)(Guard.curr_row * 10), /* get_tilepos(0,row) */ - Guard.direction, Guard.x, guard_skill, - Guard.curr_seq, - (uint8_t)(Guard.alive >= 0)); -} diff --git a/applications/PoP/roomtest/pop_guard.h b/applications/PoP/roomtest/pop_guard.h deleted file mode 100644 index b0f8aa9..0000000 --- a/applications/PoP/roomtest/pop_guard.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * pop_guard.h — СОСТОЯНИЕ стража и точки входа в его логику. - * - * Разделение по окнам (docs/layout_plan_v2.md §4, подтверждено пробником - * tests/w3bankgfx): - * - СОСТОЯНИЕ живёт здесь, в W1/W2. Писучие статики __banked-модуля - * линкуются В СТРАНИЦУ БАНКА и снаружи не читаются, поэтому банк — - * только код; - * - ЛОГИКА (ИИ, боёвка) — в guards.c, собираемом как --bank 1=guards.c; - * - ОТРИСОВКА стража — в pop_cdraw.c (банк 4), общая на всех Char: её зовёт - * только главный цикл, а из банка резидент недостижим. Так код - * отрисовки не занимает дефицитные W1/W2 (куча). - * - * Поля char_type — как в оригинале (types.h:302), чтобы порт seg005/seg006 - * ложился один в один. - */ -#ifndef POP_GUARD_H -#define POP_GUARD_H - -#include -#include "kid_data.h" /* kframe */ -#include "pop_char.h" -#include "pop_geom.h" /* pop_rnd_t — сид бросков боёвки */ -#include "pop_qsave.h" - -/* seqids (types.h:1052+) — последовательности боя и стойки. */ -#define SEQ_55_DRAW_SWORD 55 -#define SEQ_56_GUARD_FORWARD 56 /* шаг вперёд с мечом (страж) */ -#define SEQ_57_BACK_WITH_SWORD 57 -#define SEQ_58_GUARD_STRIKE 58 -#define SEQ_60_TURN_WITH_SWORD 60 -#define SEQ_61_PARRY_AFTER_STRIKE 61 -#define SEQ_62_PARRY 62 -#define SEQ_66_STRIKE_AFTER_PARRY 66 -#define SEQ_71_DYING 71 -#define SEQ_75_STRIKE 75 /* удар (Кид) */ -#define SEQ_63_GUARD_ACTIVE_AFTER_FALL 63 /* стойка АКТИВНОГО (скелет) */ -#define SEQ_77_GUARD_STAND_INACTIVE 77 -#define SEQ_88_SKEL_WAKE_UP 88 /* скелет встаёт (спецсобытие) */ -#define SEQ_80_STAND_FLIPPED 80 -#define SEQ_86_FORWARD_WITH_SWORD 86 /* шаг вперёд с мечом (Кид) */ -#define SEQ_87_GUARD_BECOME_INACT 87 -#define SEQ_90_EN_GARDE 90 -#define SEQ_92_PUT_SWORD_AWAY 92 -#define SEQ_93_PUT_SWORD_AWAY_FAST 93 - -/* frameids (types.h:911+) и состояния меча (types.h:332). */ -#define FRAME_150_PARRY 150 -#define FRAME_151_STRIKE_1 151 -#define FRAME_152_STRIKE_2 152 -#define FRAME_153_STRIKE_3 153 -#define FRAME_157_WALK_WITH_SWORD 157 -#define FRAME_158_STAND_WITH_SWORD 158 -#define FRAME_161_PARRY 161 -#define FRAME_162_BLOCK_TO_STRIKE 162 -#define FRAME_165_WALK_WITH_SWORD 165 -#define FRAME_166_STAND_INACTIVE 166 -#define FRAME_167_BLOCKED 167 -#define FRAME_168_BACK 168 -#define FRAME_169_BEGIN_BLOCK 169 -#define FRAME_170_STAND_WITH_SWORD 170 -#define FRAME_171_STAND_WITH_SWORD 171 -#define SWORD_0_SHEATHED 0 -#define SWORD_2_DRAWN 2 - -/* charids (types.h:320) — нужны хотя бы для «скелет не убивается читом». */ -#define CHARID_0_KID 0 -#define CHARID_1_SHADOW 1 -#define CHARID_2_GUARD 2 -/* charid_3 не используется: Джафар (уровень 13) — обычный charid_2_guard, - * своим charid оригинал помечает ТОЛЬКО скелета (enter_guard, seg002:196). - * Отличают Джафара набор спрайтов (VIZIER.DAT), skill 9 и три события. */ -#define CHARID_4_SKELETON 4 -#define CHARID_5_PRINCESS 5 -/* Джафар КАТСЦЕН (не игровой Джафар уровня 13!): в сценах intro он ходит - * по той же таблице кадров, что и Princess (frame_tbl_cuts), только свой - * набор спрайтов. */ -#define CHARID_6_VIZIER 6 -/* МЫШЬ (спецсобытие уровня 8) — тоже персонаж слота Guard: своей таблицы - * кадров у неё нет, кадры 186..188 лежат в таблице КИДА (load_frame, - * seg006:0293 — общий case с charid_0_kid), а спрайты (images 130..132) — - * в атласах Кида, страница kid16.atl. Поэтому отрисовка её подхватывает - * без единой правки: pop_frame_tbl_is_guard(24,…) отдаёт 0. */ -#define CHARID_24_MOUSE 24 - -/* dir_56_none (types.h:402): «направления нет» — им clear_char убирает - * персонажа со сцены. Значение 0x56 в int8_t = 86, то есть заведомо не - * dir_0_right (0) и не dir_FF_left (-1). */ -#define DIR_56_NONE 0x56 - -/* Спецсобытие «зеркало» (custom->mirror_*, дефолты SDLPoP): уровень 4, - * комната 4, колонка 4, верхний ряд. Здесь, а не в pop_trob.c: константы - * нужны и постановке тайла (банк 6), и ИИ тени (банк 1). */ -#define MIRROR_LEVEL 4 -#define MIRROR_ROOM 4 -#define MIRROR_COL 4 -#define MIRROR_ROW 0 -#define MIRROR_TILEPOS (MIRROR_ROW * 10 + MIRROR_COL) - -/* Спецсобытие «тень крадёт зелье» (custom->shadow_steal_*, дефолты SDLPoP): - * уровень 5, комната 24. Тень появляется при ВХОДЕ в комнату, если зелье - * (колонка 3, верхний ряд) ещё на месте; ждёт, пока откроются ворота - * (колонка 1, верхний ряд), идёт к зелью, выпивает его и уходит за левый - * край. Боя нет. Как и MIRROR_*, константы нужны в двух банках. */ -#define SHADOW_STEAL_LEVEL 5 -#define SHADOW_STEAL_ROOM 24 -#define SHADOW_POTION_TILEPOS 3 /* (кол 3, ряд 0) — зелье */ -#define SHADOW_DOOR_TILEPOS 1 /* (кол 1, ряд 0) — ворота */ -#define SHADOW_DOOR_OPEN_MIN 80 /* openness, при которой тень идёт */ - -/* Спецсобытие «тень захлопывает решётку» (custom->shadow_step_*, дефолты - * SDLPoP): уровень 6, комната 1. Кид жмёт opener (1,7), решётка (1,2) - * поднимается, он прыгает через пропасть и цепляется за её порожек — и - * ровно в этот момент тень делает ОДИН осторожный шаг с границы (1,0)-(1,1) - * на closer (1,1), роняя решётку. Обе плиты комнаты ведут на тот же тайл - * 12 (проверено по LINKLOC/LINKMAP уровня). */ -#define SHADOW_STEP_LEVEL 6 -#define SHADOW_STEP_ROOM 1 - -/* Спецсобытие «выход/вход падением» (custom->falling_*, дефолты SDLPoP). - * Уровень 6 не заканчивается дверью: Кид проваливается вниз из комнаты 1 и - * этим переходит на уровень 7, где появляется в комнате 17 — но экран сразу - * переводится на комнату ПОД ней, так что он влетает сверху. Комната 3 - * (шахта под комнатой 1) в переходе не участвует: leave_room перехватывает - * уход раньше, чем сработала бы связь вниз. */ -#define FALLING_EXIT_LEVEL 6 -#define FALLING_EXIT_ROOM 1 -#define FALLING_ENTRY_LEVEL 7 -#define FALLING_ENTRY_ROOM 17 - -/* Комната, которую проходят СВЕРХУ ВНИЗ спуском через зацеп: Кид висит на - * кромке кнопки (0,2), отпускает и цепляется за кромку (2,2). Нужна ЧИТУ - * навигации (`+`/`−` в roomtest.c): он ставит Кида на нижний пол, а отсюда - * этот спуск не проверить — для этой комнаты старт в ряду 0. */ -#define GRAB_DOWN_LEVEL 7 -#define GRAB_DOWN_ROOM 14 - -/* Единственный уровень, где тень — БОЕВОЙ персонаж (seg003:702). На всех - * остальных (4 зеркало, 5 зелье, 6 плита) она Кида «не видит»: см. - * pop_check_can_guard_see_kid. - * - * Сцена целиком (seg002:0070 + seg002:1184): в комнате 15 лежит МЕЧ (0,1); - * пока он на месте, тень не появляется. Кид его берёт — тень падает в ту - * же комнату, и дальше либо бой (у обоих клинки), либо, если Кид уберёт - * меч, — слияние. Комната 18 при уходе ВПРАВО «съедает» меч с карты - * (sword_disappears), чтобы вернуться и подобрать его второй раз было - * нельзя. Проверено по res2012.bin, ../docs/levels_12_15_plan.md §7.3. */ -#define SHADOW_FIGHT_LEVEL 12 -#define SHADOW_FIGHT_ROOM 15 -#define SHADOW_SWORD_TILEPOS 1 /* (кол 1, ряд 0) — меч уровня 12 */ -#define SWORD_GONE_ROOM 18 /* уход ВПРАВО отсюда убирает меч */ -/* Слияние (autocontrol_shadow_level12): дистанция, вспышка, её длительность. */ -#define SHADOW_UNITE_DIST 10 -#define SHADOW_UNITE_TIME 42 - -/* Уровень 13 — ДЖАФАР (custom->jaffar_*, дефолты SDLPoP). Своего ИИ у него - * нет вовсе: `autocontrol_Jaffar` (seg002:085A) — это `autocontrol_guard`, - * то есть обычный бой стражи. Отличают его только данные (VIZIER.DAT, - * skill 9, 6 HP — всё уже в pop_level_cold.c) и три события ниже. - * - * Встреча: Кид уходит ВПРАВО из комнаты 3 — а `комната 3.right = 1`, где - * Джафар и стоит (проверено по res2013.bin, ../docs/levels_12_15_plan.md - * §7.2). Ему даётся фора JAFFAR_NOTICE_TIME кадров: пока таймер идёт, он не - * встаёт в боевую стойку, и это единственная пауза во всей сцене. - * - * Выход: смерть Джафара сама дверь НЕ открывает — она ставит - * pop_leveldoor_open = 2, а дверь открывает КНОПКА комнаты 24 (tilepos 0, - * реальный opener), «нажимаемая» при уходе Кида ВЛЕВО. */ -#define JAFFAR_LEVEL 13 -#define JAFFAR_MEET_ROOM 3 /* уход ВПРАВО отсюда будит Джафара */ -#define JAFFAR_NOTICE_TIME 28 /* ≈2,3 с форы (28/12) */ -#define JAFFAR_EXIT_ROOM 24 -#define JAFFAR_EXIT_TILEPOS 0 -#define JAFFAR_FLASH_TIME 18 - -/* Градаций мастерства стража (seg002: таблицы вероятностей по 12 записей). */ -#define NUM_GUARD_SKILLS 12 - -/* Тип персонажа — в pop_char.h (общий с Кидом и Char). */ - -extern pop_char_t Guard; /* страж ТЕКУЩЕЙ комнаты (как в оригинале) */ -extern uint8_t guardhp_curr, guardhp_max; -extern int8_t guardhp_delta; /* <0 = в этом кадре отняли HP */ - -/* take_hp (seg006:06BD): отнять count HP у АКТИВНОГО персонажа (Char) — - * Киду из `hitp_*`, любому другому из `guardhp_*`. Возврат 1 = HP кончились - * (для вызывающего это «умер»); саму дельту применяет pop_do_delta_hp раз в - * кадр, как в оригинале. - * - * Живёт в резиденте W1/W2, потому что зовут ОБА банка: боёвка (guards.c, - * банк 1) и физика (pop_map.c, банк 3) — раньше у каждого была своя копия, - * причём у pop_map неверная (правила hitp_curr напрямую, мимо дельты, и не - * знала про не-Кидов). Чит бессмертия ловится здесь же. */ -uint8_t pop_take_hp(uint8_t count); - -/* Взводится в кадре, когда СТРАЖУ убавили HP (guardhp_delta < 0 оригинала): - * по нему pop_char_draw рисует «брызги» удара, как draw_guard в seg008:1654. - * Снимает главный цикл после отрисовки — стража могло не оказаться в - * отрисованной комнате, и тогда флаг обязан просто пропасть. */ -extern uint8_t pop_guard_hurt; - -/* Видит ли страж Кида (порт can_guard_see_kid, seg003:688): - * 0 — не видит, 1 — видит, но не пойдёт (между ними loose/чомпер/дыра), - * 2 — видит и пойдёт. Считает pop_check_can_guard_see_kid (банк) раз в - * кадр ДО логики персонажей; читают ИИ (autocontrol_*) и боёвка. */ -extern int8_t can_guard_see_kid; - -/* Кид «нашумел» (порт is_guard_notice, seg000:364): заставляет неактивного - * стража обернуться, даже если Кид у него за спиной. Ставит источник шума, - * снимает сам ИИ. */ -extern int8_t is_guard_notice; - -/* Боевые таймеры/уровень мастерства (seg000:295..311). Все убывают раз в - * кадр в autocontrol_opponent — как в оригинале. - * guard_skill — 0..11, из данных уровня; индекс в таблицы вероятностей; - * guard_refrac — «отдышка» стража: пока >0, он не атакует и не наступает; - * justblocked — Кид только что парировал (влияет на вероятность блока); - * kid_sword_strike — Кид только что бил (стража это придерживает). */ -extern uint8_t guard_skill; -extern int8_t guard_refrac, justblocked, kid_sword_strike; - -/* Состояние меча КИДА (seg005/seg006): - * offguard — меч убран НАМЕРЕННО (вниз в бою): пока стоит, Кид не - * достаёт клинок автоматически, даже видя стража; - * holding_sword — клинок в руке (для индикатора HP стража). */ -extern int8_t offguard, holding_sword; - -/* do_demo() SDLPoP: когда у Кида вынут меч, scripted demo_moves временно - * заменяются боевым AI skill 10, после чего skill 11 остаётся стражу. - * Возврат 1 — AI применён; 0 — меч ещё не вынут, продолжать таблицу. */ -uint8_t pop_demo_kid_ai(void) __banked; - -/* Спецсобытие уровня 12 — СЛИЯНИЕ С ТЕНЬЮ (united_with_shadow, seg000:288). - * Значение читается как три разных состояния, и это НЕ флаг: - * 0 — тень ещё отдельный персонаж (или уровень не 12); - * >0 — идёт вспышка слияния, счётчик кадров (42 → 1), убывает в - * pop_shadow_timer; пока он идёт, Кид мигает спрайтами тени; - * −1 — «уже слились», навсегда до конца уровня. Именно по нему - * check_shadow больше не поднимает тень, а в комнатах 2/13 - * появляются недостающие плиты пола. - * Переход 0 → −1 идёт ЧЕРЕЗ счётчик: таймер, досчитав до нуля, уводит его - * ещё на единицу вниз (seg003:503) — отсюда и знаковый тип. - * - * pop_shadow_init (shadow_initialized, seg000:309) — «тень уже дождалась - * Кида в комнате 15»: до этого autocontrol_shadow_level12 роняет её заново - * каждый кадр, чтобы Кид застал падение, а не готовую стойку. */ -extern int8_t pop_united_shadow; -extern uint8_t pop_shadow_init; - -/* Сид бросков боёвки (свой домен последовательности, см. pop_geom.h). */ -extern pop_rnd_t pop_fight_seed; - -/* Луч видимости стража — раз в кадр, ДО тиков персонажей (в оригинале - * check_can_guard_see_kid стоит в play_frame перед play_kid_frame). */ -void pop_check_can_guard_see_kid(void) __banked; - -/* check_skel (seg002:1042) — СПЕЦСОБЫТИЕ уровня 3: скелета нет в данных - * уровня (guards_tile пуст во всех комнатах), он поднимается сам, когда Кид - * доходит до нужной колонки комнаты 1 при открытой двери уровня. Звать раз - * в кадр, ДО логики персонажей (порядок play_frame, seg000:868). */ -void pop_check_skel(void) __banked; - -/* Спецсобытие уровня 8 — МЫШЬ (do_timers seg003:0545 + do_mouse seg003:0ABA). - * Условие запуска: дверь уровня открыта И Кид в комнате 16; тогда счётчик - * pop_leveldoor_open растёт кадрами, и на 150-м мышь появляется у правого - * края верхнего ряда. Звать раз в кадр рядом с pop_check_skel. */ -void pop_check_mouse(void) __banked; - -/* check_shadow (seg002:0064) — СПЕЦСОБЫТИЕ входа в комнату: на «шадоу»- - * уровнях слот соперника занимает ТЕНЬ, а не страж из данных. Звать ВМЕСТО - * pop_guard_enter при входе в комнату; вернула 1 — событие обработано и - * стража поднимать НЕ надо. - * - * Тонкость оригинала, которую легко потерять: на уровне 5 в комнате 24 - * страж В ДАННЫХ ЕСТЬ (`guards_tile[23] = 8`), но enter_guard там не - * вызывается НИКОГДА — ни когда тень поднимается, ни когда зелье уже - * выпито (в обоих случаях seg002:0064 делает return). Поэтому 1 - * возвращается и во втором случае тоже. */ -uint8_t pop_check_shadow(uint8_t room) __banked; - -/* sword_disappears (seg002:0536) — спецсобытие уровня 12: уход ВПРАВО из - * комнаты 18 убирает меч из комнаты 15. Звать при уходе вбок ДО смены - * комнаты, рядом с чекпойнтом уровня 3. */ -void pop_sword_disappears(void) __banked; - -/* meet_Jaffar (seg002:0544) — уход ВПРАВО из комнаты 3 уровня 13 даёт - * Джафару фору; звать рядом с pop_sword_disappears (та же ветка leave_room). - * Jaffar_exit (seg002:0517) — уход ВЛЕВО при pop_leveldoor_open == 2 жмёт - * кнопку комнаты 24 и открывает дверь уровня. */ -void pop_meet_jaffar(void) __banked; -void pop_jaffar_exit(void) __banked; - -/* check_killed_shadow (seg006:2033) — спецсобытие уровня 12: смерть тени - * убивает Кида и наоборот. Звать раз в кадр ДО тиков персонажей, рядом с - * pop_check_skel; на прочих уровнях выходит первой строкой. */ -void pop_check_killed_shadow(void) __banked; - -/* timers (seg003:0735) — кадровые счётчики спецсобытий: вспышка слияния с - * тенью и фора Джафара. Звать раз в кадр из главного цикла. Резидент: два - * вычитания, банк ради них не разворачиваем. */ -void pop_frame_timers(void); - -/* guard_notice_timer (seg000:307) — фора Джафара после встречи: пока >0, он - * не встаёт в боевую стойку. Ставит pop_meet_jaffar, убавляет - * pop_frame_timers, читает autocontrol_guard_inactive. */ -extern int8_t pop_guard_notice_timer; - -/* Боёвка: пометить попадания (обе стороны) и применить их. Порядок в - * кадре как в play_frame: hurting -> hurt -> do_delta_hp. */ -void pop_check_sword_hurting(void) __banked; -void pop_check_sword_hurt(void) __banked; - -/* Текущий кадр стража (порт cur_frame для Char): заполняет логика в W1/W2, - * читает отрисовка в резиденте W3. image == 255 — рисовать нечего. */ -extern kframe pop_gframe; -void pop_guard_ai_qsave(pop_qs_io_t *io) __banked; -void pop_guard_load_frame(void); - -/* check_guard_fallout (seg002:0241): убрать персонажа слота Guard, если он - * провалился ниже комнаты. Звать раз в кадр после физики и HP — как - * play_frame (seg000:884). */ -void pop_guard_fallout(void); - -/* Есть ли живой страж в отрисованной комнате (для главного цикла). */ -uint8_t pop_guard_present(void); - -/* Атласы стража (GUARD\\g0..g4.atl) — грузить ДО initgraph, как Kid. - * 0 — OK, -1 — ошибка (тогда страж просто не рисуется). */ -int pop_guard_load(void) __banked; - -/* Зеркальный ПО ВЕРТИКАЛИ набор соперника (файлы *_v.atl) — для зелья - * инверсии; зовётся из pop_vflip_load_all (pop_vflip.h). Живёт рядом с - * pop_guard_load: там же gp[] и выбор GUARD/SKEL. */ -int pop_guard_vflip_load(void) __banked; - -/* Сброс «одноразовых» музыкальных тем уровня (вступление 1-го, тень 6-го). - * Зовёт pop_start_level. */ -void pop_music_level_start(void) __banked; -void pop_guard_free(void) __banked; - -/* Вход в комнату: поднять стража из данных уровня (порт enter_guard, - * seg002:0112) либо убрать его, если в комнате стража нет. */ -void pop_guard_enter(uint8_t room); - -/* Запомнить стража УХОДЯЩЕЙ комнаты (порт leave_guard). Звать в начале - * enter_room, пока Guard ещё держит прежнего. */ -void pop_guard_leave(void); - -/* Страж идёт ЗА КИДОМ в соседнюю комнату — порт ветки стража из exit_room - * (seg002:0340) + follow_guard (seg002:039E). Звать ВМЕСТО пары - * leave/enter при смене комнаты: 1 = страж уже перенесён в new_room (ни - * leave, ни enter звать нельзя), 0 = остаётся в старой (всё как раньше). - * side — куда ушёл КИД: 0 left, 1 right, 2 up, 3 down. */ -uint8_t pop_guard_follow(uint8_t new_room, uint8_t side); - -/* Полоса HP (Кид слева, страж справа) в статус-полосе. Рисует главный цикл - * ПОСЛЕ персонажей — она ничего не перекрывает. */ -void pop_hp_draw(void) __banked; -/* Полоса стёрта перерисовкой фона (вход в комнату) — обновить обе страницы. */ -void pop_hp_invalidate(void) __banked; - -/* Цвет стража — подменой 16 слотов палитры (порт set_chtab_palette, - * seg003:257): спрайты лежат в индексах POP_GUARD_PAL_BASE + v, а цвет - * задаёт level.guards_color[room-1] (1..7; 0 = не менять). Звать ДО - * отрисовки комнаты, как это делает redraw_screen. */ -void pop_guard_set_palette(uint8_t color) __banked; - -/* Пере-применить палитру ТЕКУЩЕГО набора соперника (скелет/Джафар — своя из - * файла набора, обычный страж — последний curr_guard_color). Диапазон - * 0x90..0x9F динамический: kid.pal затирает его палитрой стража, поэтому - * каждый file-load логической палитры доплачивает его заново — так же, как - * pop_bg_pal_apply/pop_shadow_pal_apply. Звать ДО snapshot. */ -void pop_guard_pal_apply(void) __banked; - -/* Отрисовка соперника — общая на всех Char: pop_char_draw(POP_CH_OPP) и - * компания, см. pop_cdraw.h. Метрики его последнего кадра (в т.ч. ширина - * спрайта для char_width_half) — pop_cd[POP_CH_OPP]. */ - -/* Убрать стража со сцены (смена комнаты / инициализация). */ -void pop_guard_reset(void); - -/* Чит «убить стража» (seg000:786, K): скелета не берёт. Вызывать только - * при включённых читах — проверку делает вызывающий. */ -void pop_guard_kill(void); - -/* do_delta_hp (seg003): применить дельту HP, накопленную за кадр. Звать - * раз в кадр ПОСЛЕ тиков персонажей (в оригинале — в play_frame). */ -void pop_do_delta_hp(void); - -/* Тик логики стража — В БАНКЕ (guards.c). Состояние берёт отсюда. */ -void pop_guard_tick(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_guard_cold.c b/applications/PoP/roomtest/pop_guard_cold.c deleted file mode 100644 index 9b74cbb..0000000 --- a/applications/PoP/roomtest/pop_guard_cold.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * pop_guard_cold.c — переходы стража МЕЖДУ КОМНАТАМИ (банк 8): страж идёт - * за Кидом (follow_guard, seg002:039E) и вход стража в комнату - * (enter_guard, seg002:0112 + pos_guards, seg003). - * - * Обе зовутся РАЗ НА КОМНАТУ и обе — из roomtest_cold.c, который лежит в - * том же банке 8: значит в резиденте им делать нечего, а трамплин на - * вызове не появляется (объявления в pop_guard.h без __banked; условие - * корректности — оба модуля в одном банке, см. _pop_kdraw.h про ту же - * связку). Состояние стража (Guard, guard_skill, …) живёт в pop_guard.c - * и видно отсюда как обычные глобалы: данные банков — в общем _DATA. - */ -#include -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_level.h" -#include "pop_kid.h" /* Char/play_seq — интерпретатор общий */ -#include "pop_map.h" -#include "pop_state.h" -#include "pop_tile.h" /* POP_TILE_DIV — колонка по X без деления */ -#include "kid_data.h" - -static int8_t guard_col_from_x(uint8_t xpos); /* определена ниже */ - -/* ---- Страж ИДЁТ ЗА КИДОМ в соседнюю комнату ------------------------- * - * Порт ветки стража из exit_room (seg002:0340..0382) + follow_guard - * (seg002:039E). Своим ходом персонаж слота Guard из комнаты не уходит - * (его физика гейтится x ∈ [44,211), см. pop_guard_phys_tick), но когда - * комнату меняет КИД, движок может перенести стража следом — именно так в - * оригинале страж из комнаты 3 оказывается в комнате 2 за отступающим - * Кидом. - * - * Условия оригинала, все обязательные: - * - страж есть, ЖИВ и с ВЫНУТЫМ МЕЧОМ (то есть идёт бой); - * - переход ВБОК: вверх и вниз оригинал не пускает никогда (там условия - * `curr_row >= 0` и `curr_row < 3` истинны всегда → leave_guard); - * - в целевой комнате НЕТ своего ЖИВОГО стража (иначе их стало бы два: - * проверка `guards_tile >= 30 || guards_seq_hi != 0` — «пусто или - * труп»); - * - страж прижат к тому краю, в который ушёл Кид: x < 91 при уходе - * влево, x >= 165 при уходе вправо. - * - * side — куда ушёл КИД (0 = left, 1 = right, 2 = up, 3 = down), то есть - * roomleave_result оригинала. Возврат: 1 — страж перенесён в new_room - * (вызывающий НЕ должен звать ни pop_guard_leave, ни pop_guard_enter), - * 0 — остаётся, всё как раньше. */ -uint8_t pop_guard_follow(uint8_t new_room, uint8_t side) -{ - uint8_t tile, color, skill; - int8_t dir; - - if (Guard.charid == 0) return 0; /* dir_56_none */ - if (Guard.alive >= 0 || Guard.sword != SWORD_2_DRAWN) return 0; - if (side > 1) return 0; /* только вбок */ - /* «В целевой комнате уже есть живой страж» = страж по данным есть И это - * не запомненный труп (у трупа сохранена последовательность). */ - if (pop_level_guard(new_room, &tile, &dir, &color, &skill) && - pop_guard_state_seq(new_room) == 0) return 0; - if (side == 0) { if (Guard.x >= 91) return 0; } /* Кид ушёл влево */ - else { if (Guard.x < 165) return 0; } /* Кид ушёл вправо */ - - /* follow_guard: сначала «стража нет» в ОБЕИХ комнатах (в оригинале - * guards_tile = 0xFF). Без этого он раздвоится: в старой комнате его - * поднимут из данных при возврате, а в новой — при следующем входе. */ - pop_guard_state_save(Guard.room, 30, 0, 0, 0, 0, 0); - pop_guard_state_save(new_room, 30, 0, 0, 0, 0, 0); - - /* goto_other_room (seg002:0486) для стража: комната + перенос X через - * шов (влево +140, вправо −140). Ряд при боковом переходе не меняется; - * колонку пересчитываем из новой X, как enter_guard. */ - Guard.room = new_room; - Guard.x = (uint8_t)(side == 0 ? Guard.x + 140 : Guard.x - 140); - Guard.curr_col = guard_col_from_x(Guard.x); - return 1; -} - -/* get_tile_div_mod_m7 (seg006:697): колонка комнаты по X персонажа — - * floor((xpos − 7 − 58) / 14), где 58 = pop_x_bump[FIRST_ONSCREEN_COLUMN]. */ -static int8_t guard_col_from_x(uint8_t xpos) -{ - /* Таблицей (резидентная POP_TILE_DIV: −58 уже внутри значений) — тот же - * приём, что в tile_at_kid/get_tile_div_mod. Здесь он кроет ПОЧТИ всё: - * xpos — байт, так что медленный хвост остаётся только для xpos < 7. */ - if (xpos >= 7) return POP_TILE_DIV[xpos - 7]; - { - int16_t x = (int16_t)xpos - 7 - pop_x_bump[FIRST_ONSCREEN_COLUMN]; - int16_t col = x / TILE_SIZEX; - if (x % TILE_SIZEX < 0) --col; - return (int8_t)col; - } -} - -void pop_guard_enter(uint8_t room) -{ - uint8_t tile, color, skill; - int8_t dir; - pop_guard_reset(); - /* load_lev_spr (seg000:1112): tbl_guard_type == −1 — стражей на уровне - * НЕТ вообще (14), их графика даже не грузится. Без этой проверки - * на таком уровне полезли бы стражи из данных комнат. */ - if (pop_level_guard_type(pop_current_level) < 0) return; - if (!pop_level_guard(room, &tile, &dir, &color, &skill)) return; - /* Цвет — ДО отрисовки комнаты (как redraw_screen, seg003:255): слоты - * палитры общие на экран, и смена посреди кадра дала бы стража в новой - * палитре с полосой HP в старой. - * - * Цвет из данных комнаты берётся ТОЛЬКО у обычного стража (enter_guard, - * seg002:183: `curr_guard_color = 0`, если tbl_guard_type != 0). У - * скелета и Джафара палитра своя, из файла набора, и подменять её - * нельзя — иначе визирь на уровне 13 покрасился бы в цвет стража, - * записанный в его комнате. */ - pop_guard_set_palette(pop_level_guard_type(pop_current_level) == 0 - ? color : 0); - /* enter_guard (seg002:0112). Из ТАЙЛА берётся только РЯД — колонки в нём - * нет: leave_guard кладёт туда get_tilepos(0, row), то есть обнуляет её - * намеренно. Носитель колонки — guards_x, её пишет тот же leave_guard, а - * при загрузке уровня заполняет pos_guards (см. pop_gstate_init). - * - * Считать X из `tile % 10`, как мы делали, значит после ПЕРВОГО же выхода - * из комнаты телепортировать живого стража в КОЛОНКУ 0 — потому что там - * с этого момента ноль. Уровень 8, комната 24: страж стоит в (0,6), ряд 0 - * в колонках 1..3 ПУСТОЙ, и после возврата Кида страж оказывался над - * дырой (x = 72 — это колонка 1 по таблице деления), падал с ряда 0 на - * ряд 2 и разбивался. Наблюдения пользователя — «страж был на 0,0», - * «страж падает на 2,1 и разбивается» — это ровно оно. - * - * Y всегда по ряду: enter_guard ставит стража НА ПОЛ (y_land[row+1]), а не - * туда, где он был по вертикали. Поэтому «дорисовать падение» при - * возврате в комнату оригинал не умеет — и не должен. */ - Guard.room = room; - Guard.curr_row = (int8_t)(tile / 10); - Guard.y = (uint8_t)pop_y_land[Guard.curr_row + 1]; - Guard.direction = dir; - /* seg002:196: на уровне со скелетами слот поднимает СКЕЛЕТА, и он - * встаёт сразу активным — с вынутым мечом (seq_63), а не в стойке - * покоя (seq_77). Стойку ставит ветка ниже, вместе с seq трупа. */ - Guard.charid = (pop_level_guard_type(pop_current_level) == 2) - ? CHARID_4_SKELETON : CHARID_2_GUARD; - Guard.sword = (Guard.charid == CHARID_4_SKELETON) - ? SWORD_2_DRAWN : 0; /* sword_0_sheathed */ - Guard.alive = -1; - Guard.action = 1; /* actions_1_run_jump */ - Guard.fall_x = Guard.fall_y = 0; - /* enter_guard (seg002:214): мастерство из данных уровня, 12 градаций; - * всё, что вне диапазона, оригинал сводит к 3. */ - guard_skill = (uint8_t)(skill < NUM_GUARD_SKILLS ? skill : 3); - /* get_guard_hp (seg002:54): extrastrength[skill] + tbl_guard_hp[уровень]. - * extrastrength (seg002:38) ненулевой только у skill 4 (=1). */ - guardhp_max = guardhp_curr = - (uint8_t)(pop_level_guard_hp(pop_current_level) + (guard_skill == 4 ? 1 : 0)); - guardhp_delta = 0; - /* enter_guard (seg002:0208). Живого поднимаем стандартной стойкой; у - * ЗАПОМНЕННОГО МЁРТВОГО берём сохранённую последовательность — он лежит - * ровно там, где лёг (порт ветки guards_seq_hi != 0). */ - { - uint16_t saved_seq = pop_guard_state_seq(room); - /* X — ВСЕГДА из запомненной (enter_guard, seg002:179: - * `Char.x = level.guards_x[room_minus_1]`), и живого стража это - * касается ровно так же, как трупа: страж, с которым Кид не стал - * драться, обязан остаться СТОЯТЬ ТАМ ЖЕ. Иначе он не просто - * «дёргается» — он может встретить Кида прямо на входе в комнату, - * не дав тому достать меч. */ - Guard.x = pop_guard_state_x(room); - /* КОЛОНКА — из X (enter_guard, seg002:180: - * `Char.curr_col = get_tile_div_mod_m7(Char.x)`). Из тайла её брать - * нельзя, там всегда 0 (см. выше). Колонка нужна не только - * отрисовке: на неё смотрят коллизия и check_can_guard_see_kid, а у - * ЗАПОМНЕННОГО ТРУПА ещё и порядок обхода тайлов — иначе Кид - * рисовался поверх тела вместо того, чтобы пройти за ним - * (BUG-DRAWORDER-1). */ - Guard.curr_col = guard_col_from_x(Guard.x); - pop_loadshad(); - if (saved_seq) Char.curr_seq = saved_seq; - else pop_char_set_seq(SEQ_77_GUARD_STAND_INACTIVE); - pop_saveshad(); - pop_guard_play(); /* до первого кадра */ - /* enter_guard (seg002:218): кадр смерти -> страж поднят ТРУПОМ. */ - if (Guard.frame == 185 || Guard.frame == 177 || Guard.frame == 178) { - Guard.alive = 1; - guardhp_curr = 0; - } - } -} diff --git a/applications/PoP/roomtest/pop_guard_pal.h b/applications/PoP/roomtest/pop_guard_pal.h deleted file mode 100644 index 8e394f4..0000000 --- a/applications/PoP/roomtest/pop_guard_pal.h +++ /dev/null @@ -1,36 +0,0 @@ -/* pop_guard_pal.h — палитры стражей (guard_palettes из res10.bin). - * СГЕНЕРЕНО toolchain/pop_pack_guard.py — НЕ править вручную. - * - * Индексация как в оригинале: цвет из level.guards_color[room-1] - * (младшие 4 бита), 1..7 -> строка [color-1]; 0 = палитру НЕ менять - * (seg003:255 при curr_guard_color == 0 set_chtab_palette не зовёт). - * Запись — 4 байта (B, G, R, 0), формат gfx_pal_load. */ -#ifndef POP_GUARD_PAL_H -#define POP_GUARD_PAL_H - -#include - -#define POP_GUARD_PAL_BASE 0x90 /* слоты Sprinter под chtab_5 */ -#define POP_GUARD_NPAL 7 - -static const uint8_t pop_guard_pal[POP_GUARD_NPAL][64] = { - { 0x00,0x00,0x00,0x00,0xFF,0x91,0x48,0x00,0xB2,0x81,0x69,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x79,0x28,0x81,0x00,0xB2,0x81,0x69,0x00,0xC2,0xC2,0xC2,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x30,0xAA,0x00,0x00,0x24,0x81,0x00,0x79,0x79,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xC2,0x69,0x85,0x00,0xAA,0x5D,0x75,0x00,0xFF,0x89,0xB2,0x00,0x50,0x50,0x79,0x00,0x71,0x71,0xAA,0x00,0xBE,0x28,0xBA,0x00,0x00,0x24,0x81,0x00,0x61,0x61,0xCA,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x00,0x00,0x38,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x99,0xD2,0x00,0x00,0x7D,0xAA,0x00,0x00,0xBA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x99,0x28,0x6D,0x00,0x00,0x38,0xBE,0x00,0xD2,0xCA,0xCA,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x91,0x0C,0x00,0x00,0x71,0x0C,0x00,0xFF,0xD2,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x4C,0xAE,0xCA,0x00,0x38,0x7D,0x91,0x00,0x61,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x20,0x00,0x99,0x00,0x00,0x71,0x0C,0x00,0xB2,0x91,0xB2,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0xFF,0x00,0x61,0x00,0xAA,0x00,0x61,0x00,0xB2,0x3C,0xBE,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x8D,0xBA,0xCA,0x00,0x6D,0x8D,0x99,0x00,0xB2,0xEA,0xFF,0x00,0x34,0x6D,0x91,0x00,0x40,0x89,0xBA,0x00,0x79,0x28,0x81,0x00,0xAA,0x00,0x61,0x00,0x81,0x2C,0x89,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0xFF,0x59,0xCA,0x00,0xC2,0x44,0x99,0x00,0xFF,0xAA,0x91,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x99,0xB2,0xB2,0x00,0xDA,0xFF,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xA1,0x6D,0x5D,0x00,0xC2,0x44,0x99,0x00,0xD2,0x8D,0x79,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xDA,0xDE,0x00,0xE2,0x30,0xB2,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x9D,0xD2,0x00,0x00,0x9D,0xF2,0x00,0x00,0xC2,0xFF,0x00,0xA1,0x4C,0x75,0x00,0xFF,0x79,0xBA,0x00,0xB2,0x00,0x61,0x00,0x00,0xDA,0xDE,0x00,0xAA,0x24,0x85,0x00,0x38,0x00,0xF6,0x00 }, -}; - -/* Скелет (SKEL/res750.pal): свой набор — свой цвет. */ -static const uint8_t pop_skel_pal[64] = { - 0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x00,0x89,0x79,0xBA,0x00,0xF2,0xFF,0xFF,0x00,0x00,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x00,0x55,0xAA,0x00,0xDA,0xE6,0xE6,0x00,0x55,0x55,0x55,0x00,0xFF,0x55,0x55,0x00,0x55,0xFF,0x55,0x00,0xFF,0xFF,0x55,0x00,0x55,0x55,0xFF,0x00,0x00,0x00,0x00,0x00,0x55,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00, -}; - -/* Джафар (VIZIER/res750.pal): свой набор — свой цвет. */ -static const uint8_t pop_vizier_pal[64] = { - 0x00,0x00,0x00,0x00,0x79,0x69,0xFF,0x00,0x7D,0x4C,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xEA,0x44,0xB2,0x00,0xEA,0x44,0xB2,0x00,0x55,0xFF,0xFF,0x00,0x99,0x2C,0x75,0x00, -}; - -#endif diff --git a/applications/PoP/roomtest/pop_hof.c b/applications/PoP/roomtest/pop_hof.c deleted file mode 100644 index 778838a..0000000 --- a/applications/PoP/roomtest/pop_hof.c +++ /dev/null @@ -1,530 +0,0 @@ -/* - * pop_hof.c — persistent Hall of Fame, банк 9 (FG12). - * - * Порт двух показов оригинала: между credits и attract-demo (seg000:2060) - * и после победы, с вводом имени (end_sequence, seg001:5F1). Экран тот - * же самый — рамка story с логотипом PRINCE OF PERSIA (STORY_FRAME + - * HOF_POP), поэтому фон приходит готовой композицией из архива PV, а - * палитру выбирает вызывающая сцена: обе фазы идут на story.pal, и - * отличаются только цветом фона рамки (см. pop_pal_story_load). - * - * POP.HOF — небольшой самодостаточный формат: magic, version, fixed records - * и XOR+инверсия. Поэтому обрыв/мусор на HDD не может поломать старт игры: - * decode просто начинает с пустой таблицы. Ввод — raw-клавиатура, как весь - * PoP; он не открывает DSS-console и не конфликтует с активным raw hook. - */ -#include -#include -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_settings.h" -#include "pop_sfx.h" -#include "pop_timer.h" -#include "pop_pal.h" -#include "pop_ui.h" -#include "pop_cutscene.h" /* POP_T60 — тики оригинала в кадры луча */ -#include "pop_intro.h" /* фон экрана: рамка story + логотип */ -#include "pop_title.h" /* титульная картинка после ввода имени */ -#include "pop_music.h" /* подкачка потоковой темы победы */ -#include "pop_hof.h" - -/* MAX_HOF_COUNT оригинала — шесть строк. */ -#define HOF_COUNT 6 -#define HOF_NAME_SIZE 16 /* пятнадцать букв + '\0' */ -#define HOF_REC_SIZE 20 -#define HOF_HEADER_SIZE 6 -#define HOF_SIZE (HOF_HEADER_SIZE + HOF_COUNT * HOF_REC_SIZE + 2) -#define HOF_BASE 0x100 -#define HOF_VERSION 2 -#define HOF_FADE POP_FADE_FRAMES -#define HOF_NO_ROW 0xFF - -/* Геометрия hof_rects[] (seg001:0D92) в координатах 320x200: строка i - * занимает y = 84 + 14*i .. +12, имя от x=72, время по правому краю 248. - * Полоса ввода — та же строка, сдвинутая offset4_rect_add(-4,-1,-40,-1). */ -#define HOF_ROW_TOP 84 -#define HOF_ROW_STEP 14 -#define HOF_ROW_H 12 -#define HOF_LEFT 72 -#define HOF_RIGHT 248 -#define HOF_EDIT_LEFT (HOF_LEFT - 4) -#define HOF_EDIT_RIGHT (HOF_RIGHT - 40) -/* Крупный шрифт: глиф 7 строк, строка 12 — текст центрируется по вертикали. - * baseline = верх строки + 2 + POP_FONT_BIG_ASCENT. */ -#define HOF_BASELINE(i) (POP_YOFF + HOF_ROW_TOP + (int)(i) * HOF_ROW_STEP + 9) -/* Золотой цвет полосы ввода: 0xB7 оригинала = седьмой цвет палитры title, - * а у нас story.pal сделана из неё же. */ -#define HOF_GOLD 7 -/* Паузы оригинала в тиках 60 Гц: показ таблицы на титрах и пауза после - * ввода имени (seg000:2065, seg001:628). */ -#define HOF_TITLE_TICKS POP_T60(0xF0) -#define HOF_AFTER_TICKS POP_T60(120) - -typedef struct { - char name[HOF_NAME_SIZE]; - uint8_t minutes; - uint16_t ticks; - uint8_t limited; -} hof_entry_t; - -static hof_entry_t hof_table[HOF_COUNT]; -static uint8_t hof_buf[HOF_SIZE]; - -static uint8_t hof_xor(const uint8_t *p, uint8_t n) -{ - uint8_t sum = 0; - while (n--) sum ^= *p++; - return sum; -} - -static void hof_clear_entry(hof_entry_t *entry) -{ - uint8_t i; - for (i = 0; i < HOF_NAME_SIZE; i++) entry->name[i] = 0; - entry->minutes = 0; - entry->ticks = 0; - entry->limited = 0; -} - -static void hof_clear(void) -{ - uint8_t i; - for (i = 0; i < HOF_COUNT; i++) hof_clear_entry(&hof_table[i]); -} - -static uint8_t hof_decode(const uint8_t *src, uint8_t size) -{ - uint8_t i, j, off, sum; - - if (size != HOF_SIZE || src[0] != 'P' || src[1] != 'H' || - src[2] != 'O' || src[3] != 'F' || src[4] != HOF_VERSION || - src[5] != HOF_COUNT) - return 0; - sum = hof_xor(src, (uint8_t)(HOF_SIZE - 2)); - if (src[HOF_SIZE - 2] != sum || src[HOF_SIZE - 1] != (uint8_t)~sum) - return 0; - - off = HOF_HEADER_SIZE; - for (i = 0; i < HOF_COUNT; i++) { - hof_entry_t *entry = &hof_table[i]; - for (j = 0; j < HOF_NAME_SIZE - 1; j++) { - uint8_t ch = src[off++]; - /* Имя намеренно ASCII: это также отбрасывает мусор из чужого - * формата, не позволяя строке уйти за свою границу. */ - if (ch && (ch < ' ' || ch > 'Z')) return 0; - entry->name[j] = (char)ch; - } - entry->name[HOF_NAME_SIZE - 1] = 0; - entry->minutes = src[off++]; - entry->ticks = (uint16_t)(src[off] | ((uint16_t)src[off + 1] << 8)); - off += 2; - entry->limited = src[off++]; - if (entry->limited > 1 || - (entry->limited && (entry->ticks == 0 || - entry->ticks > POP_TIMER_START_TICKS))) - return 0; - } - return 1; -} - -static void hof_encode(uint8_t *dst) -{ - uint8_t i, j, off, sum; - - dst[0] = 'P'; dst[1] = 'H'; dst[2] = 'O'; dst[3] = 'F'; - dst[4] = HOF_VERSION; - dst[5] = HOF_COUNT; - off = HOF_HEADER_SIZE; - for (i = 0; i < HOF_COUNT; i++) { - const hof_entry_t *entry = &hof_table[i]; - for (j = 0; j < HOF_NAME_SIZE - 1; j++) dst[off++] = entry->name[j]; - dst[off++] = entry->minutes; - dst[off++] = (uint8_t)entry->ticks; - dst[off++] = (uint8_t)(entry->ticks >> 8); - dst[off++] = entry->limited; - } - sum = hof_xor(dst, (uint8_t)(HOF_SIZE - 2)); - dst[HOF_SIZE - 2] = sum; - dst[HOF_SIZE - 1] = (uint8_t)~sum; -} - -static void hof_load(void) -{ - uint8_t blk, page, i; - int got; - - hof_clear(); - blk = mem_alloc_pages(1); - if (!blk) return; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - got = bank_load_file(page, HOF_BASE, "POP.HOF", HOF_SIZE); - if (got == HOF_SIZE) { - gfx_w0_map(page); - for (i = 0; i < HOF_SIZE; i++) - hof_buf[i] = ((const uint8_t *)HOF_BASE)[i]; - gfx_w0_unmap(); - if (!hof_decode(hof_buf, (uint8_t)HOF_SIZE)) hof_clear(); - } - mem_free_block(blk); -} - -static void hof_save(void) -{ - uint8_t blk, page, i; - - blk = mem_alloc_pages(1); - if (!blk) return; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - hof_encode(hof_buf); - gfx_w0_map(page); - for (i = 0; i < HOF_SIZE; i++) ((uint8_t *)HOF_BASE)[i] = hof_buf[i]; - gfx_w0_unmap(); - /* Неудача записи не меняет только что показанную таблицу: следующее - * открытие разумно начнёт с прежнего файла или с пустого списка. */ - bank_save_file(page, HOF_BASE, "POP.HOF", HOF_SIZE); - mem_free_block(blk); -} - -static uint8_t hof_better(const hof_entry_t *entry) -{ - uint8_t limited = pop_settings.time_limit_enabled; - - if (!entry->name[0]) return 1; - /* Unlimited сохраняется и выводится, но не может вытеснить ограниченный - * таймером результат: у него нет сравнимого времени. */ - if (limited != entry->limited) return limited; - if (pop_timer_minutes != entry->minutes) - return (uint8_t)(pop_timer_minutes > entry->minutes); - return (uint8_t)(pop_timer_ticks > entry->ticks); -} - -static uint8_t hof_insert_current(void) -{ - uint8_t i, j; - - for (i = 0; i < HOF_COUNT; i++) { - if (!hof_better(&hof_table[i])) continue; - for (j = HOF_COUNT - 1; j > i; j--) hof_table[j] = hof_table[j - 1]; - hof_clear_entry(&hof_table[i]); - hof_table[i].minutes = pop_timer_minutes; - hof_table[i].ticks = pop_timer_ticks; - hof_table[i].limited = pop_settings.time_limit_enabled; - return i; - } - return HOF_NO_ROW; -} - -static uint8_t hof_has_entries(void) -{ - uint8_t i; - for (i = 0; i < HOF_COUNT; i++) - if (hof_table[i].name[0]) return 1; - return 0; -} - -static void hof_dec(uint8_t value, char *out) -{ - if (value >= 100) { - *out++ = (char)('0' + value / 100); - value %= 100; - *out++ = (char)('0' + value / 10); - } else if (value >= 10) { - *out++ = (char)('0' + value / 10); - } - *out++ = (char)('0' + value % 10); - *out = 0; -} - -/* «59:43» — те же min-1 : tick/12, что печатает show_hof (seg001:0E94). */ -static void hof_result_text(const hof_entry_t *entry, char *out) -{ - uint8_t seconds; - - if (!entry->limited) { - strcpy(out, "UNLIMITED"); - return; - } - /* min == 0 у оригинала означает истёкшее время и печатается как 0:00. */ - hof_dec(entry->minutes ? (uint8_t)(entry->minutes - 1) : 0, out); - while (*out) out++; - seconds = entry->minutes ? (uint8_t)(entry->ticks / 12) : 0; - *out++ = ':'; - *out++ = (char)('0' + seconds / 10); - *out++ = (char)('0' + seconds % 10); - *out = 0; -} - -/* show_hof_text(): сначала тень со сдвигом (1,1), затем сам текст. У нас - * цвет запечён в глифы, поэтому «другой цвет» — это второй набор - * (POP_TEXT_BIG_DARK), а не параметр рисования. */ -static void hof_text_left(int x, int baseline, const char *s) -{ - pop_text_draw_mapped(POP_TEXT_BIG_DARK, x + 1, baseline + 1, s); - pop_text_draw_mapped(POP_TEXT_BIG, x, baseline, s); -} - -static void hof_text_right(int right, int baseline, const char *s) -{ - pop_text_right_mapped(POP_TEXT_BIG_DARK, right + 1, baseline + 1, s); - pop_text_right_mapped(POP_TEXT_BIG, right, baseline, s); -} - -/* Золотая полоса под ввод — draw_rect(&rect, bgcolor) оригинала. */ -static void hof_edit_bar(uint8_t row) -{ - int top = HOF_BASELINE(row) - 10; - - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, HOF_GOLD); - bar(HOF_EDIT_LEFT, top, HOF_EDIT_RIGHT, top + HOF_ROW_H - 1); -} - -/* Строки таблицы в ТЕКУЩУЮ draw-страницу. - * - * БАНК ЗДЕСЬ TRANSPARENT, А НЕ SPRITE. Полосовой переход копирует страницу - * акселератором, а тот читает ОЗУ-копию (gfx_copy_page); SPRITE — это - * NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах - * переезжал бы один фон без строк. TRANSPARENT даёт ту же прозрачность - * 0xFF, но обновляет и копию, поэтому таблица проявляется уже собранной. */ -static void hof_draw_rows(uint8_t edit_row) -{ - uint8_t i; - - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - for (i = 0; i < HOF_COUNT; i++) { - char value[12]; - const hof_entry_t *entry = &hof_table[i]; - int baseline = HOF_BASELINE(i); - - /* Строка, которую сейчас вписывают, уже содержит результат: имени - * ещё нет, а время справа оригинал показывает сразу (show_hof - * рисует все hof_count строк, включая только что вставленную). */ - if (!entry->name[0] && i != edit_row) continue; - if (entry->name[0]) hof_text_left(HOF_LEFT, baseline, entry->name); - hof_result_text(entry, value); - hof_text_right(HOF_RIGHT, baseline, value); - } - pop_text_unmap(); -} - -/* Готовая страница: фон из архива, полоса ввода и строки. -1 — фон не - * прочитан, и тогда таблица просто не показывается: ни игра, ни title от - * этого не зависят. */ -static int hof_page_build(uint8_t page, uint8_t edit_row) -{ - if (pop_intro_hof_bg(page) != 0) return -1; - gfx_set_draw_page(page); - if (edit_row != HOF_NO_ROW) hof_edit_bar(edit_row); - hof_draw_rows(edit_row); - return 0; -} - -/* Имя пишется ПРЯМО НА ЭКРАН, как input_str оригинала - * (current_target_surface = onscreen_surface_): страницы при вводе не - * меняются местами, поэтому дорисовывать фон второй страницы не нужно. */ -static void hof_edit_draw(uint8_t row, const char *name, uint8_t cursor) -{ - int x = HOF_LEFT, baseline = HOF_BASELINE(row); - - gfx_set_draw_page(gfx_get_visible_page()); - hof_edit_bar(row); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - /* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */ - if (name[0]) { - pop_text_draw_mapped(POP_TEXT_BIG_DARK, x, baseline, name); - x += pop_text_width_mapped(POP_TEXT_BIG_DARK, name) + 1; - } - /* draw_text_cursor(): подчерк той же гарнитуры сразу за текстом, - * мигающий сменой цвета на фоновый — у нас проще перерисовать. */ - if (cursor) pop_text_draw_mapped(POP_TEXT_BIG_DARK, x, baseline, "_"); - pop_text_unmap(); -} - -/* ---- ожидания -------------------------------------------------------- * - * - * Любое ожидание этого экрана держит ПОТОКОВУЮ музыку: победная тема - * (1,2 МБ) играет кольцом страниц, и дочитывать её надо всё время, пока - * игрок смотрит таблицу и печатает имя — иначе насос догонит загрузчика и - * пойдёт по кругу старыми данными. - * - * Прерывание — по НОВОМУ нажатию (детектор фронта, как в сценах intro): - * клавиша, которой закончили предыдущий экран, в момент входа ещё зажата, - * и считать её за «пропустить» нельзя. */ -typedef struct { uint8_t armed; } hof_skip_t; - -static void hof_skip_begin(hof_skip_t *sk) -{ - kbd_raw_sync(); - sk->armed = (uint8_t)!kbd_raw_any_down(); -} - -static uint8_t hof_skip_requested(hof_skip_t *sk) -{ - kbd_raw_sync(); - if (!kbd_raw_any_down()) { sk->armed = 1; return 0; } - return sk->armed; -} - -/* Возврат 1 — ожидание прервано нажатием. */ -static uint8_t hof_wait_frames(uint16_t frames) -{ - hof_skip_t skip; - - hof_skip_begin(&skip); - while (frames--) { - if (hof_skip_requested(&skip)) return 1; - pop_music_service(); - gfx_wait_vsync(); - } - return 0; -} - -/* `while (check_sound_playing() && !key_test_quit())` (seg001:637): финал - * дослушивает победную тему и прерывается любой клавишей. */ -static void hof_wait_music(void) -{ - hof_skip_t skip; - - hof_skip_begin(&skip); - while (pop_music_busy() && !hof_skip_requested(&skip)) { - pop_music_service(); - gfx_wait_vsync(); - } -} - -/* Set 2 make-коды A..Z, затем space/backspace/enter/esc. Храним edge для - * каждой клавиши, поэтому зажатая буква не заполняет имя автоповтором. */ -static const uint8_t hof_key_code[30] = { - 0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33, 0x43, - 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D, 0x15, 0x2D, - 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22, 0x35, 0x1A, - KBD_SPACE, 0x66, KBD_ENTER, KBD_ESC -}; - -/* Возвращает 1, когда ввод закончен (Enter/Esc); *changed — надо ли - * перерисовать строку. */ -static uint8_t hof_name_tick(hof_entry_t *entry, uint8_t *length, - uint8_t *previous, uint8_t *changed) -{ - uint8_t i; - - for (i = 0; i < 30; i++) { - uint8_t down = kbd_raw_down(hof_key_code[i]); - if (down && !previous[i]) { - if (i < 26 && *length < HOF_NAME_SIZE - 1) { - entry->name[(*length)++] = (char)('A' + i); - entry->name[*length] = 0; - *changed = 1; - } else if (i == 26 && *length && *length < HOF_NAME_SIZE - 1) { - entry->name[(*length)++] = ' '; - entry->name[*length] = 0; - *changed = 1; - } else if (i == 27 && *length) { - entry->name[--(*length)] = 0; - *changed = 1; - } else if (i == 28 || i == 29) { - previous[i] = down; - return 1; - } - } - previous[i] = down; - } - return 0; -} - -/* Ввод имени в строку row. Пустое имя оригинал не отвергает, но пустая - * строка в таблице выглядела бы как свободное место — подставляем PLAYER. */ -/* Курсор мигает каждые шесть тиков 60 Гц (start_timer(timer_0, 6) в - * input_str) — в кадрах луча это HOF_BLINK. */ -#define HOF_BLINK POP_T60(6) - -static void hof_edit(uint8_t row) -{ - uint8_t length = 0, previous[30], i, changed = 1; - uint8_t cursor = 1, phase = 0; - hof_entry_t *entry = &hof_table[row]; - - for (i = 0; i < sizeof(previous); i++) previous[i] = 0; - /* Стартовое состояние клавиш: зажатое с прошлого экрана не считается - * нажатием, поэтому первый sync только заполняет previous[]. */ - kbd_raw_sync(); - for (i = 0; i < sizeof(previous); i++) - previous[i] = kbd_raw_down(hof_key_code[i]); - for (;;) { - kbd_raw_sync(); - if (hof_name_tick(entry, &length, previous, &changed)) { - if (!length) strcpy(entry->name, "PLAYER"); - return; - } - if (changed) { cursor = 1; phase = 0; } - if (++phase >= HOF_BLINK) { - phase = 0; - cursor = (uint8_t)!cursor; - changed = 1; - } - if (changed) { - hof_edit_draw(row, entry->name, cursor); - changed = 0; - } - pop_music_service(); - gfx_wait_vsync(); - } -} - -void pop_hof_show(void) __banked -{ - uint8_t row; - - hof_load(); - row = hof_insert_current(); - if (row != HOF_NO_ROW) { - uint8_t page; - - /* fade_out_2 гасит титульную картинку перед таблицей (seg001:601). - * Палитру не меняем: story.pal с красным фоном рамки уже стоит от - * финального HAIL, и снимок для fade сделан ею же. */ - pop_pal_fade_out(HOF_FADE); - page = pop_screen_begin(); - if (hof_page_build(page, row) == 0) { - pop_screen_present(page); - pop_pal_fade_in(HOF_FADE); - hof_edit(row); - hof_save(); - /* Имя вписано: строку показываем уже обычным золотым текстом, - * без полосы (restore_peel + show_hof_text оригинала). */ - page = pop_screen_begin(); - if (hof_page_build(page, HOF_NO_ROW) == 0) - pop_screen_present(page); - hof_wait_frames(HOF_AFTER_TICKS); - (void)pop_title_main_ltr(); - } - } - hof_wait_music(); - pop_pal_fade_out(HOF_FADE); - pop_music_free(); - pop_sfx_pause(); -} - -uint8_t pop_hof_show_title(void) __banked -{ - uint8_t page; - - hof_load(); - if (!hof_has_entries()) return 0; - page = pop_screen_begin(); - /* Страница собирается ЦЕЛИКОМ до показа — как offscreen оригинала: - * draw_full_image + show_hof, и только потом transition_ltr - * (seg000:2063). Ни fade, ни смены палитры: экран проявляется прямо - * поверх credits, на той же story.pal. */ - if (hof_page_build(page, HOF_NO_ROW) != 0) return 0; - pop_screen_present_ltr(); - return hof_wait_frames(HOF_TITLE_TICKS); -} diff --git a/applications/PoP/roomtest/pop_hof.h b/applications/PoP/roomtest/pop_hof.h deleted file mode 100644 index dbe34be..0000000 --- a/applications/PoP/roomtest/pop_hof.h +++ /dev/null @@ -1,21 +0,0 @@ -/* pop_hof.h — таблица результатов после финала, банк 9 (FG12). */ -#ifndef POP_HOF_H -#define POP_HOF_H - -#include - -/* Хвост end_sequence: при подходящем результате — запрос имени, сохранение - * POP.HOF и возврат к титульной картинке; затем в любом случае - * дослушивается победная тема и гаснет экран. Ошибка или повреждение - * файла означают пустую таблицу; gameplay и последующий title от этого не - * зависят. Победная тема на входе ещё звучит — освобождает её эта - * функция. */ -void pop_hof_show(void) __banked; - -/* Показать уже существующую непустую таблицу между credits и demo - * (seg000:2060): полосовой переход, 240 тиков, ни fade, ни смены палитры. - * Возврат 1 — игрок нажал клавишу, то есть всю цепочку title/intro надо - * прервать. */ -uint8_t pop_hof_show_title(void) __banked; - -#endif /* POP_HOF_H */ diff --git a/applications/PoP/roomtest/pop_intro.c b/applications/PoP/roomtest/pop_intro.c deleted file mode 100644 index 1a17e39..0000000 --- a/applications/PoP/roomtest/pop_intro.c +++ /dev/null @@ -1,1817 +0,0 @@ -/* - * pop_intro.c — вторая половина show_title(): story + Princess/Jaffar (FG8). - * - * Готовые сцены создаёт pop_pack_intro.py из TITLE/PV SDLPoP. Каждая сцена - * хранится пятью полосами <=49 строк, поэтому EMM удерживает лишь текущую - * полосу. pop_cutscene_t остаётся независимым от графики: этот модуль только - * исполняет его события и позднее будет образцом для pre-level сцен FG9. - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_shadow.h" -#include "pop_sfx.h" -#include "pop_music.h" -#include "pop_arc.h" -#include "pv_arc.h" -#include "pop_cutscene.h" -#include "pop_intro.h" -#include "pop_hof.h" /* таблица рекордов между credits и demo */ -#include "pop_title.h" /* титульная картинка в финале */ -#include "pop_pace.h" /* pop_wait_edge */ -#include "pop_pal.h" -#include "pop_timer.h" -#include "pop_ui.h" -#include "pop_kid.h" /* Char/окна, play_seq — движок персонажей катсцен */ -#include "pop_guard.h" /* Guard, CHARID_*, pop_gframe */ - -#define INTRO_PARTS 5 -/* ДЛИТЕЛЬНОСТЬ FADE. У оригинала это 64 шага палитры по два тика — - * 128 тиков, то есть 2,13 с (fade_in_1/fade_out_1 -> fade_*_frame -> - * do_simple_wait(1) при wait_time = 2). Наши четыре кадра укладывались в - * восемь сотых секунды, и вся сцена выходила втрое короче оригинальной. - * Точное число кадров считает POP_FADE_FRAMES (pop_ui.h): из - * заказанных 2,13 с вычитается то, что съедает сам пересчёт палитры. */ -#define INTRO_FADE POP_FADE_FRAMES - -/* Оцифрованные эффекты pv_scene() (SDLPoP seg001:422): створка ворот - * закрывается, затем открывается дверь покоев, из которой входит Джафар. */ -#define PV_SND_GATE_CLOSING 4 -#define PV_SND_DOOR_OPENING 51 - -/* Шкала ниже повторяет порядок pv_scene() SDLPoP и живёт в ЕГО тиках - * (60 Гц): обычный кадр cutscene длится 8 тиков, до первой смены темпа 6, - * после начала заклинания 7. В кадры луча переводит POP_T60. - * - * ДЛИННЫЕ ПАУЗЫ ЗДЕСЬ — ЭТО РЕПЛИКИ. Оригинал их не отмеряет, а ждёт - * окончания сэмпла (`do { frame(1) } while (check_sound_playing())`), и - * пока музыки у нас не было, паузы стояли укороченными «на глаз». Теперь - * они равны реальной длине наших записей (pop_music_tbl.h, тики = блоки * - * 128 / 10937,5 * 60): m50 — 831, m53 — 985 тиков. */ -enum { - PV_MUS_2_START = 12, /* frame(2), затем «принцесса ждёт» (m50) */ - PV_MUS_3_LOAD = 60, /* подкачка следующей реплики, m50 звучит */ - PV_M50_END = 846, /* 12 + 834: конец m50, кадр становится 8 */ - PV_WAIT_END = 886, /* +frame(5) -> створка ворот */ - PV_GATE_END = 934, - PV_DOOR_END = 958, - PV_TURN_START = PV_DOOR_END, - PV_WALK1_START = 998, - PV_DIALOG1_START = 1046, /* Джафар входит — реплика m53 */ - PV_MUS_4_LOAD = 1100, /* подкачка m52, Джафар стоит на месте */ - PV_WALK2_START = 1222, - PV_DIALOG2_START = 1462, - PV_RAISE_START = 1742, - PV_STEPBACK_START = 1749, - PV_MAGIC_START = 1868, - PV_EXIT_START = 2031, /* 1046 + 985: конец m53 */ - PV_MUS_4_START = 2073, /* +frame(6) -> «Джафар уходит» (m52) */ - PV_GLASS_DONE = 2241, - PV_SLUMP_START = 2304, - PV_ANIM_TICKS = 2500 -}; - -enum { - INTRO_STORY_ABSENCE = 0, - INTRO_STORY_MARRY, - INTRO_STORY_CREDITS, - INTRO_STORY_HAIL, - INTRO_STORY_FRAME, - INTRO_STORY_HOF, /* рамка + логотип: фон таблицы рекордов */ - INTRO_PV_WAITING, - INTRO_PV_JAFFAR, - INTRO_PV_MAGIC, - INTRO_PV_ALONE, - INTRO_PV_STAND, - INTRO_PV_LYING, - INTRO_PV_MOUSE, - INTRO_PV_SHORT -}; - -enum { - INTRO_PAL_STORY = 0, - INTRO_PAL_PV = 1, - /* Та же story.pal, но фон текстовой рамки красный: - * load_title_images(0) в end_sequence (seg001:586). */ - INTRO_PAL_STORY_END = 2 -}; - -/* Экраны PV лежат в одном архиве по пять полос подряд, ровно в том же - * порядке, в каком идут номера сцен: сначала пять текстовых (story - * res41 + тексты 42/43/45/44 и чистая рамка), затем восемь стадий комнаты - * принцессы (res951 + персонажи) и чистый фон b0. Поэтому имён здесь нет - * — индекс первой полосы экрана считается умножением. */ -#if (ARC_PV_P0_0 - ARC_PV_S0_0) != 6 * INTRO_PARTS -#error "экраны PV в архиве лежат не по пять полос подряд" -#endif -#define INTRO_SCENES 14 - -/* Две текстовые половины show_title(). Между ними PV теперь идёт отдельным - * покадровым renderer-ом, а не четырьмя полными статичными композициями. */ -/* ПОЧЕМУ НЕ 0x258, КАК В ОРИГИНАЛЕ. Точка отсчёта у обоих — пуск m55; - * совпасть должен МОМЕНТ ПОЛНОЙ ТЕМНОТЫ, а дороги к нему разные: - * SDLPoP: transition_ltr 80 тиков + pop_wait 0x258 + fade_out_2, а тот - * гасит палитру за 0x40 шагов по 2 тика = 128 тиков; - * у нас: полосовой переход 80 кадров луча (= 96 тиков) + WAIT + fade - * той же длины (INTRO_FADE = 128 тиков). - * Теперь, когда наш fade идёт те же 128 тиков, остаётся поправка на один - * лишь переход: 80 + 600 + 128 - 96 - 128 = 584. Дальше и там и там экран - * уже чёрный, а трек доигрывает — этой паузой сцена и стыкуется с PV. */ -static const pop_cs_cmd_t intro_before_pv[] = { - /* absence собирается прямо поверх последнего title-кадра полосовым - * transition_ltr(), как в SDLPoP; оба экрана используют title.pal. */ - { POP_CS_WAIT, POP_T60(584) }, /* story 1: In the absence */ - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Файловый fallback сохраняет возможность пройти title на неполном HDD. - * Нормальная ветка его не вызывает: p0..p3 оставлены также для диагностики - * точек сюжета и не являются анимационным ресурсом. */ -static const pop_cs_cmd_t intro_pv_fallback[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, - { POP_CS_SHOW, INTRO_PV_WAITING }, - { POP_CS_FADE_IN, 0 }, - { POP_CS_WAIT, 0x1A }, /* princess, gate and door */ - { POP_CS_SHOW, INTRO_PV_JAFFAR }, - { POP_CS_WAIT, 0x6D }, /* Jaffar comes/walks */ - { POP_CS_SHOW, INTRO_PV_MAGIC }, - { POP_CS_FLASH, 5 }, /* hourglass appears */ - { POP_CS_WAIT, 0x2F }, - { POP_CS_SHOW, INTRO_PV_ALONE }, - { POP_CS_WAIT, 0x3D }, /* Jaffar leaves, princess looks */ - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Хвост show_title() разрезан надвое: между «свадьбой» и титрами оригинал - * ЖДЁТ окончания последней реплики Джафара (seg000:2051), которая начала - * звучать ещё в PV и продолжается поверх смены картинки. */ -static const pop_cs_cmd_t intro_marry[] = { - { POP_CS_PALETTE, INTRO_PAL_STORY }, - { POP_CS_SHOW, INTRO_STORY_MARRY }, - { POP_CS_FADE_IN, 0 }, - { POP_CS_END, 0 } -}; - -/* Гашение — отдельным шагом: между credits и ним оригинал показывает - * таблицу рекордов, если файл с ней есть (seg000:2060). */ -static const pop_cs_cmd_t intro_tail[] = { - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Статические fallback-сценарии хранят уже физические кадры Sprinter. - * Один логический кадр cutscene SDLPoP длится 6/60 с; на 50 Гц это ровно - * 5/50 с. Поэтому суммы proc_cutscene_frame() здесь умножены на пять. */ -static const pop_cs_cmd_t pre_2_6[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_STAND }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_4[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_LYING }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_8[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - /* 20 + 20 + 20 логических кадров = 6,0 с. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 300 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_9[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - /* 5 + 9 + 58 логических кадров = 7,2 с. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 360 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_12_short[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_SHORT }, - /* 2 + 24 логических кадра = те же 2,6 с, что и длинная ветка. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -/* time_expired() SDLPoP: hourglass_state=7, fade in, 2+100 кадров, fade - * out. P7 — готовая стадия комнаты с часами; звук намеренно не стартует, - * так как CBL на lifecycle screen погашен до дисковых чтений. */ -static const pop_cs_cmd_t time_expired_script[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_SHORT }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 102 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -/* end_sequence_anim() — объятие/мышь — здесь сведён к отдельной PV-стадии; - * затем end_sequence() SDLPoP показывает HAIL ровно 900 тиков. */ -/* Хвост финала после живой сцены встречи: только исходный story-экран. */ -/* FADE_OUT в конце НЕТ намеренно: оригинал не гасит HAIL, а проявляет - * поверх него титульную картинку полосами (draw_full_image(TITLE_MAIN) + - * transition_ltr, seg001:590). Гасит экран уже таблица рекордов. */ -static const pop_cs_cmd_t ending_hail_script[] = { - { POP_CS_PALETTE, INTRO_PAL_STORY_END }, { POP_CS_SHOW, INTRO_STORY_HAIL }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 900 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t ending_script[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 54 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_PALETTE, INTRO_PAL_STORY_END }, { POP_CS_SHOW, INTRO_STORY_HAIL }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 900 }, - { POP_CS_END, 0 } -}; - -static uint8_t intro_scene; -static uint8_t intro_pending_pal; -static uint8_t intro_pal_pending; - -/* Полосовой загрузчик рядом со своими вызовами: общий из банка 9 звать - * можно (индексы и таблица — числа на стеке W2, а не указатели на W3), но - * лишний банк→банк на каждую полосу тут ни к чему. - * pop_arc_atlas сам временно занимает W3 только на время чтения. */ -static int intro_blit_arc(pop_arc_t *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, int x, int y) -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - const uint8_t *img; - - if (pop_arc_atlas(arc, tbl, (uint8_t)(base + part), &at) != 0) - return -1; - gfx_w0_map(at.page); - img = (const uint8_t *)atlas_image(&at, 0); - gfx_blit(x, y, img); - y += img[2]; - gfx_w0_unmap(); - atlas_free(&at); - } - return 0; -} - -/* Экран целиком: открыть архив, вылить пять полос, закрыть. Один `open` - * на экран вместо пяти — при 51,4 мс за открытие это больше половины - * времени показа. */ -static int intro_blit_screen(uint8_t base, int y) -{ - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int res; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - res = intro_blit_arc(&arc, tbl, base, INTRO_PARTS, 0, y); - pop_arc_close(&arc); - return res; -} - -/* Один актёрский атлас PV из архива. Открытие на каждый — всё равно - * дешевле, чем прежние отдельные файлы (тот же `open`, но без поиска имени - * в каталоге); там, где их несколько подряд, архив открывается один раз. */ -static int pv_atlas(pop_arc_t *arc, const uint8_t *tbl, uint8_t idx, - atlas_t *at) -{ - return pop_arc_atlas(arc, tbl, idx, at) != 0 ? -1 : 0; -} - -/* ---- «Пропустить сцену» — по НОВОМУ нажатию, а не по удержанию -------- * - * - * Клавиша, которой закончили уровень (движение Кида в дверь, чит Shift+L, - * skip предыдущего экрана), в момент старта сцены ЕЩЁ ЗАЖАТА. Считать это - * за skip нельзя: сцена схлопывается в один кадр, и её никто не видит. - * Ждать отпускания безусловно тоже нельзя — потерянный break-код вешает - * игру намертво (BUGS_OPEN.md#kbd-stuck-wait). - * - * Поэтому детектор ФРОНТА: пока хоть что-то зажато со старта, skip не - * взводится; как только всё отпущено, детектор «взводится» и следующее - * нажатие сцену прерывает. Залипший бит в худшем случае делает сцену - * непропускаемой — она доиграет сама, а игра не встанет. */ -typedef struct { uint8_t armed; } intro_skip_t; - -static void intro_skip_begin(intro_skip_t *sk) -{ - kbd_raw_sync(); - sk->armed = (uint8_t)!kbd_raw_any_down(); -} - -static uint8_t intro_skip_requested(intro_skip_t *sk) -{ - kbd_raw_sync(); - if (!kbd_raw_any_down()) { sk->armed = 1; return 0; } - return sk->armed; -} - -static int intro_draw_page(uint8_t scene, uint8_t page) -{ - if (scene >= INTRO_SCENES) return -1; - gfx_set_draw_page(page); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - return intro_blit_screen((uint8_t)(ARC_PV_S0_0 + scene * INTRO_PARTS), - POP_YOFF); -} - -static int intro_draw(uint8_t scene) -{ - uint8_t page = pop_screen_begin(); - - if (intro_draw_page(scene, page) != 0) return -1; - pop_screen_present(page); - return 0; -} - -/* У gfx_pal_fload/sync палитра меняется по 64 цвета за вызов BIOS. Если в - * этот момент хоть одна страница содержит следующую сцену, один VSync может - * показать её уже яркой, ещё до штатного fade-in. Поэтому перед сменой - * источника палитры уничтожаем растр на ОБЕИХ страницах, а не только гасим - * их палитры. */ -static void intro_black_pages(void) -{ - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - gfx_set_draw_page(1); - pop_screen_fill(BLACK); - pop_screen_present(1); -} - -/* Для смены полного источника палитры сначала гасим старую сцену и - * оставляем на видимой странице настоящий чёрный растр. */ -static void intro_prepare_palette(uint8_t pal) -{ - intro_pending_pal = pal; - intro_pal_pending = 1; - pop_pal_apply(POP_PAL_DIM_BLACK); - intro_black_pages(); -} - -static void intro_commit_palette(void) -{ - if (intro_pending_pal == INTRO_PAL_PV) pop_pal_pv_load(); - else pop_pal_story_load((uint8_t)(intro_pending_pal == INTRO_PAL_STORY_END)); - pop_pal_apply(POP_PAL_DIM_BLACK); - intro_pal_pending = 0; -} - -static int intro_draw_new_palette(uint8_t scene) -{ - uint8_t page; - - /* Палитра загружается, пока обе страницы содержат только чёрный растр. - * После повторного затемнения можно собрать новую сцену в скрытую - * страницу и показать её исключительно чёрной перед fade-in. */ - intro_commit_palette(); - page = pop_screen_begin(); - if (intro_draw_page(scene, page) != 0) return -1; - pop_screen_present(page); - return 0; -} - -/* В отличие от intro_draw_page() здесь base собирается в shadow ОБЕИХ - * страниц. После show page 1 palette 0 не видна и в неё безопасно загрузить - * PV\pv.pal; первый animated frame соберётся в page 0. */ -static int intro_pv_draw_base(void) -{ - gfx_rect_t full; - - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - if (intro_blit_screen(ARC_PV_B0_0, POP_YOFF) != 0) return -1; - gfx_set_draw_page(1); - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - gfx_copy_page(&full, GFX_COPY_DIRECT); - pop_screen_present(1); - return 0; -} - -static void pv_blit_floor(const atlas_t *at, uint8_t frame, int x, int floor) -{ - const uint8_t *img; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, frame); - /* add_*table() оригинала задаёт нижнюю строку спрайта включительно. */ - gfx_blit(x, POP_YOFF + floor - img[2] + 1, img); - gfx_w0_unmap(); -} - -static void pv_blit_actor(const atlas_t *at, uint8_t frame, int anchor_x, - int floor, uint8_t flip) -{ - const uint8_t *img; - int x = anchor_x; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, frame); - /* draw_mid SDLPoP зеркалит правое направление относительно hot-point: - * экранный x сначала масштабирован, затем из него вычитается width. */ - if (flip) x -= img[0]; - gfx_blit_cols(x, POP_YOFF + floor - img[2] + 1, img, flip); - gfx_w0_unmap(); -} - -static void pv_draw_stars(const uint8_t *phase) -{ - static const uint8_t star_x[] = { 20, 16, 23, 17, 24, 18 }; - static const uint8_t star_y[] = { 97, 104, 110, 116, 120, 128 }; - static const uint8_t star_color[] = { 8, 7, 15, 15, 7 }; - uint8_t i; - - for (i = 0; i < sizeof(star_x); i++) { - /* draw_rect SDLPoP получает полуинтервал [x,x+1)×[y,y+1). - * BGI bar() включает правую/нижнюю границу и давал звезду 2x2. */ - putpixel(star_x[i], POP_YOFF + star_y[i], star_color[phase[i]]); - } -} - -/* У Princess/Jaffar номер frame — это индекс frame_tbl_cuts, а картинка - * лежит в отдельном chtab. Эти таблицы — компактная нужная часть таблицы - * SDLPoP: не приходится тащить в банк весь interpreter SEQTBL. */ -typedef struct { - int16_t x; /* Char.x оригинала: полу-пиксели */ - uint8_t frame; - uint8_t left; - uint8_t visible; - uint8_t step; -} pv_actor_t; - -/* frame_tbl_cuts[1..18].image; 10 — служебная пустая запись. */ -static const uint8_t pv_princess_image[19] = { - 0, 15, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 9, 10, 11, 12, 13, 14, 16 -}; -static const int8_t pv_princess_dx[19] = { - 0, 0, 0, 0, 0, -1, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const uint8_t pv_princess_parity[19] = { - 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0 -}; - -/* frame_tbl_cuts[48..85].dx. image равен frame - 48. */ -static const int8_t pv_jaffar_dx[38] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 2, 3, 5, 5, 1, 2, 2, 1, 1, 2, 3, 3, 0, 2, 2, 1 -}; -static const uint8_t pv_jaffar_parity[38] = { - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0 -}; -static const uint8_t pv_walk_frame[6] = { 48, 49, 50, 51, 52, 53 }; -static const int8_t pv_walk_dx[6] = { 1, 2, 6, 1, -1, 1 }; -static const uint8_t pv_raise_frame[] = { - 85, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 83, 84, 76 -}; - -static int pv_actor_x(const pv_actor_t *actor, int frame_dx, uint8_t parity) -{ - int x = actor->x; - int logical; - - if (actor->left) x -= frame_dx; - else x += frame_dx; - logical = x * 2 - 116; - /* load_frame_to_obj: нечётная фаза зависит от flags кадра и direction. - * chtab Princess/Jaffar затем проходит calc_screen_x_coord(320/280). */ - if (actor->left == parity) ++logical; - return logical * 8 / 7; -} - -static void pv_walk_step(pv_actor_t *jaffar) -{ - uint8_t step = (uint8_t)(jaffar->step % 6); - int dx = pv_walk_dx[step]; - - if (jaffar->left) jaffar->x -= dx; - else jaffar->x += dx; - jaffar->frame = pv_walk_frame[step]; - ++jaffar->step; -} - -static void pv_princess_step(pv_actor_t *princess, uint16_t tick) -{ - uint16_t pos; - - /* Palert: 2..9, flip, dx(8), 11. Она продолжается и во время входа - * Jaffar, как последовательность Palert оригинала. */ - if (tick >= PV_TURN_START && tick < PV_TURN_START + 72 && - ((tick - PV_TURN_START) & 7) == 0) { - pos = (uint16_t)((tick - PV_TURN_START) >> 3); - if (pos < 8) princess->frame = (uint8_t)(2 + pos); - else { - princess->left = 0; - princess->x += 8; - princess->frame = 11; - } - } - - /* Pstepback: flip, dx(11), 12; затем 13..16 и вечный кадр 17. */ - if (tick >= PV_STEPBACK_START && tick < PV_STEPBACK_START + 42 && - ((tick - PV_STEPBACK_START) % 7) == 0) { - pos = (uint16_t)((tick - PV_STEPBACK_START) / 7); - if (pos == 0) { - princess->left = 1; - princess->x -= 11; - princess->frame = 12; - } else if (pos == 1) { - princess->x -= 1; - princess->frame = 13; - } else if (pos == 2) { - princess->x -= 1; - princess->frame = 14; - } else if (pos == 3) { - princess->x -= 3; - princess->frame = 15; - } else if (pos == 4) { - princess->x -= 1; - princess->frame = 16; - } else { - princess->frame = 17; - } - } - - /* Pslump: один переходный frame 1, затем frame 18 до fade-out. */ - if (tick == PV_SLUMP_START) princess->frame = 1; - else if (tick == PV_SLUMP_START + 7) princess->frame = 18; -} - -static void pv_jaffar_exit_step(pv_actor_t *jaffar) -{ - uint8_t pos = jaffar->step++; - - if (pos < 6) { - jaffar->frame = (uint8_t)(77 + pos); - } else if (pos < 12) { - if (pos == 6) --jaffar->x; - jaffar->frame = 54; - } else if (pos < 22) { - uint8_t frame = (uint8_t)(57 + pos - 12); - - if (frame == 62) jaffar->x -= 2; - else if (frame == 63) ++jaffar->x; - else if (frame == 64) jaffar->x += 3; - else if (frame == 66) ++jaffar->x; - jaffar->frame = frame; - } else if (pos == 22) { - /* Vexit заканчивается flip, dx(16), dx(3), затем Vwalk2. */ - jaffar->left = 0; - jaffar->x += 19; - jaffar->frame = 49; - } else { - /* Vexit прыгает на метку Vwalk2: кадр 49 уже выведен в ветке - * flip, следующий шаг обязан начинаться с dx(6), frame 50. */ - uint8_t walk = (uint8_t)(pos - 23 + 2); - int dx = pv_walk_dx[walk % 6]; - - jaffar->x += dx; - jaffar->frame = pv_walk_frame[walk % 6]; - } -} - -static void pv_jaffar_step(pv_actor_t *jaffar, uint16_t tick) -{ - uint16_t pos; - - if (tick == PV_WALK1_START || tick == PV_WALK2_START) jaffar->step = 0; - if (((tick >= PV_WALK1_START && tick < PV_DIALOG1_START) || - (tick >= PV_WALK2_START && tick < PV_DIALOG2_START)) && - ((tick - ((tick < PV_DIALOG1_START) ? PV_WALK1_START : - PV_WALK2_START)) & 7) == 0) { - jaffar->visible = 1; - pv_walk_step(jaffar); - } - - /* Vstop: dx(1), 55, 56, Vstand. */ - if (tick == PV_DIALOG1_START || tick == PV_DIALOG2_START) { - --jaffar->x; - jaffar->frame = 55; - } else if (tick == PV_DIALOG1_START + 8 || tick == PV_DIALOG2_START + 8) { - jaffar->frame = 56; - } else if ((tick >= PV_DIALOG1_START + 16 && tick < PV_WALK2_START) || - (tick >= PV_DIALOG2_START + 16 && tick < PV_RAISE_START)) { - jaffar->frame = 54; - } - - if (tick >= PV_RAISE_START && tick < PV_EXIT_START && - ((tick - PV_RAISE_START) % 7) == 0) { - pos = (uint16_t)((tick - PV_RAISE_START) / 7); - if (pos < sizeof(pv_raise_frame)) jaffar->frame = pv_raise_frame[pos]; - else jaffar->frame = 76; - } - - if (tick == PV_EXIT_START) jaffar->step = 0; - if (tick >= PV_EXIT_START && ((tick - PV_EXIT_START) % 7) == 0) { - pv_jaffar_exit_step(jaffar); - if (!jaffar->left && jaffar->x > 205) jaffar->visible = 0; - } -} - -static void pv_blit_jaffar(const atlas_t *j0, const atlas_t *j1, - const atlas_t *j2, const pv_actor_t *jaffar) -{ - uint8_t image; - int x; - - if (!jaffar->visible || jaffar->frame < 48 || jaffar->frame > 85) return; - image = (uint8_t)(jaffar->frame - 48); - x = pv_actor_x(jaffar, pv_jaffar_dx[image], pv_jaffar_parity[image]); - if (image < 13) - pv_blit_actor(j0, image, x, 166, (uint8_t)!jaffar->left); - else if (image < 24) - pv_blit_actor(j1, (uint8_t)(image - 13), x, 166, - (uint8_t)!jaffar->left); - else - pv_blit_actor(j2, (uint8_t)(image - 24), x, 166, - (uint8_t)!jaffar->left); -} - -static void pv_blit_princess(const atlas_t *princess, const pv_actor_t *actor) -{ - uint8_t frame = actor->frame; - - if (frame == 0 || frame > 18) return; - pv_blit_actor(princess, pv_princess_image[frame], - pv_actor_x(actor, pv_princess_dx[frame], - pv_princess_parity[frame]), - 166, (uint8_t)!actor->left); -} - -/* Длина логического кадра в тиках 60 Гц — cutscene_frame_time оригинала. - * Сколько это кадров луча, решает пейсинг в intro_pv_animated. */ -static uint8_t pv_seq_period(uint16_t tick) -{ - if (tick < PV_M50_END) return 6; - if (tick < PV_RAISE_START) return 8; - return 7; -} - -/* Рисует кадр и меняет страницу; возвращает, сколько кадров луча на это - * ушло (вспышка живёт на физической шкале и стоит одиннадцать). */ -static uint8_t intro_pv_draw_frame(const atlas_t *princess, const atlas_t *j0, - const atlas_t *j1, const atlas_t *j2, - const atlas_t *hourglass, const atlas_t *torch, - const pv_actor_t *p, const pv_actor_t *j, - const uint8_t *star_phase, - uint8_t torch_left, uint8_t torch_right, - uint8_t sand_frame, uint8_t flash, - uint16_t tick) -{ - gfx_rect_t full; - uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1); - - gfx_set_draw_page(back); - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - gfx_copy_page(&full, GFX_COPY_DIRECT); - gfx_set_bank(GFX_BANK_SPRITE); - /* y=116 в princess_room_torch — нижняя строка, не верх спрайта. */ - pv_blit_floor(torch, torch_left, 93, 116); - pv_blit_floor(torch, torch_right, 211, 116); - pv_draw_stars(star_phase); - pv_blit_princess(princess, p); - pv_blit_jaffar(j0, j1, j2, j); - if (tick >= PV_MAGIC_START) { - /* В SDLPoP hourglass_sandflow=0 означает первый кадр потока, - * а -1 — отсутствие песка. Корпус появляется ещё при молнии. */ - pv_blit_floor(hourglass, - (uint8_t)(tick < PV_GLASS_DONE ? 1 : 2), 152, 168); - } - if (tick >= PV_EXIT_START) { - /* hourglass_sandflow=0 оригинал ставит лишь после окончания - * conjuring — когда Jaffar опускает руки и начинает уходить. */ - pv_blit_floor(hourglass, (uint8_t)(8 + sand_frame), 160, 164); - } - /* draw_princess_room_bg() SDLPoP помещает image 2 chtab PV в - * foretable с x=30*8, ybottom=167. В нашем h0 это кадр 0 (res952): - * его надо повторить ПОСЛЕ актёров, иначе Jaffar проходит перед - * правой передней колонной. */ - pv_blit_floor(hourglass, 0, 240, 167); - gfx_wait_vsync(); - gfx_set_visible_page(back); - if (flash) { - uint8_t pulse; - - /* Молния намеренно живёт на физической, а не cutscene-шкале: - * пять быстрых white/black импульсов, актёры на это время стоят. */ - for (pulse = 0; pulse < 5; pulse++) { - pop_pal_flash_white(1); - gfx_wait_vsync(); - pop_pal_flash_white(0); - gfx_wait_vsync(); - } - return 11; - } - return 1; -} - -/* Сцена pv_scene() SDLPoP: ожидание Princess с факелами/звёздами, поворот, - * вход и речь Jaffar, заклинание+молния, часы с песком, уход. Тайминг - * воспроизводится на кадровой шкале; пропуск проверяется каждый кадр. */ -static int intro_pv_animated(void) -{ - atlas_t princess, jaffar0, jaffar1, jaffar2, hourglass, torch; - pv_actor_t princess_actor; - pv_actor_t jaffar_actor; - uint16_t tick; - uint16_t frame_end; - uint16_t render_tick; - uint16_t beam = 0; /* запасной путь: кадров луча ждали */ - uint16_t snd_done = 0; /* тиков насоса прошло с начала сцены */ - uint16_t snd_want = 0; /* сколько их должно было пройти */ - uint16_t snd_acc = 0; /* дробный остаток пересчёта 57/40 */ - uint8_t snd_prev = 0; - uint8_t snd_pace = 0; - uint8_t period; - uint8_t anim_step = 0; - uint8_t torch_left = 1; - uint8_t torch_right = 6; - uint8_t star_phase[6] = { 1, 1, 1, 1, 1, 1 }; - uint8_t sand_frame = 0; - uint8_t flash_done = 0; - uint8_t faded_in = 0; - uint8_t flash; - intro_skip_t skip; - int result = -1; - - intro_prepare_palette(INTRO_PAL_PV); - /* commit обязан быть до сборки base: gfx_pal_sync обновляет и видимую - * страницу, поэтому там в этот момент должен оставаться только чёрный - * растр из intro_prepare_palette(). */ - intro_commit_palette(); - if (intro_pv_draw_base() != 0) return -1; - - /* b0_* собирается полосами: на время очередной полосы ей тоже нужна - * временная EMM-страница. Поэтому фон готовится до постоянных - * actor-атласов: порядок сохраняет независимость загрузчика полос от - * числа одновременно живущих анимационных ресурсов. */ - /* Шесть атласов сцены — из ОДНОГО открытого архива. */ - { - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t bad; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_A0, &princess) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J0, &jaffar0) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J1, &jaffar1) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J2, &jaffar2) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_H0, &hourglass) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_T0, &torch) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - - /* Проявление — ПОСЛЕ первого нарисованного кадра (см. ниже в цикле): - * иначе две секунды fade идут по пустой комнате, а принцесса возникает - * уже на свету. */ - /* Актёрские атласы в EMM; дальше по сцене диск трогает только подкачка - * следующей реплики — по одной странице за кадр (pop_music_load_step). - * Полноэкранная accel-копия кадра насосу не мешает: leaf режет DI - * бандами по 16 строк. */ - (void)pop_sfx_start(); - /* ЧЕМ МЕРИТЬ ВРЕМЯ. Пока сцена была немой, кадры просто считали - * ожидания vsync — и этого хватало. С музыкой выяснилось, что так - * считаются НАШИ ожидания, а не прошедшее время: полноэкранная копия - * страницы (~0,55 млн тактов) съедает больше кадра луча, и сцена - * незаметно отстаёт — в MAME молния била уже ПОСЛЕ конца реплики. - * Часы берём у насоса CBL: он идёт от расхода буфера железом, 85,4 Гц, - * и ему безразлично, чем занят главный цикл. Если звук выключен, - * часы стоят — тогда работает прежний путь по кадрам луча. */ - snd_prev = pop_snd_tick; - gfx_wait_vsync(); - snd_pace = (uint8_t)(pop_snd_tick != snd_prev); /* часы реально идут? */ - snd_prev = pop_snd_tick; - result = 0; - princess_actor.x = 120; - princess_actor.frame = 11; /* Pstand, facing left */ - princess_actor.left = 1; - princess_actor.visible = 1; - princess_actor.step = 0; - jaffar_actor.x = 198; - jaffar_actor.frame = 54; /* Vstand, behind the closed door */ - jaffar_actor.left = 1; - jaffar_actor.visible = 0; - jaffar_actor.step = 0; - tick = 0; - intro_skip_begin(&skip); - while (tick < PV_ANIM_TICKS) { - if (intro_skip_requested(&skip)) { - result = 1; - break; - } - - /* Один проход = один логический кадр cutscene. Внутри проходим все - * его исходные 6/8/7 тиков, снаружи draw_frame держит результат - * четыре физических кадра — единые номинальные 12,5 FPS. */ - flash = 0; - period = pv_seq_period(tick); - frame_end = (uint16_t)(tick + period); - if (frame_end > PV_ANIM_TICKS) frame_end = PV_ANIM_TICKS; - do { - pv_princess_step(&princess_actor, tick); - pv_jaffar_step(&jaffar_actor, tick); - if (tick == PV_MAGIC_START && !flash_done) { - flash = 1; - flash_done = 1; - } - /* Границы шкалы уже стоят там, где оригинал ЖДЁТ окончания - * очередного сэмпла, — заявляем эффект ровно на них. */ - if (tick == PV_WAIT_END) pop_sfx_play(PV_SND_GATE_CLOSING); - else if (tick == PV_GATE_END) pop_sfx_play(PV_SND_DOOR_OPENING); - /* Три реплики сцены. Каждая следующая читается с диска, пока - * звучит предыдущая (второй слот pop_music), поэтому здесь - * остаётся только пуск — мгновенный. */ - else if (tick == PV_MUS_2_START) pop_music_play(); - else if (tick == PV_MUS_3_LOAD) - (void)pop_music_load_begin(POP_MUS_STORY_3); - else if (tick == PV_DIALOG1_START) pop_music_play(); - else if (tick == PV_MUS_4_LOAD) - (void)pop_music_load_begin(POP_MUS_STORY_4); - else if (tick == PV_MUS_4_START) pop_music_play(); - ++tick; - } while (tick < frame_end); - - { - uint8_t star = (uint8_t)(anim_step % 6); - - torch_left = (uint8_t)((torch_left + 1) % 9); - torch_right = (uint8_t)((torch_right + 1) % 9); - star_phase[star] = (uint8_t)((star_phase[star] + 1) % 5); - if (tick > PV_EXIT_START) - sand_frame = (uint8_t)((sand_frame + 1) % 3); - ++anim_step; - } - render_tick = (uint16_t)(tick - 1); - beam += intro_pv_draw_frame(&princess, &jaffar0, &jaffar1, &jaffar2, - &hourglass, &torch, &princess_actor, - &jaffar_actor, star_phase, torch_left, - torch_right, sand_frame, flash, - render_tick); - pop_sfx_tick(); /* как в оригинале — в конце отрисовки кадра */ - /* ГАРАНТИРОВАННЫЙ ШАГ ПОДКАЧКИ, а не «если останется время». - * - * Ниже страница следующей реплики читается в ПАУЗЕ кадра, и это - * верно ровно до тех пор, пока пауза есть. В этой сцене её почти - * нет: кадр дорогой, шкала работает по принципу «долг не догоняем» - * (snd_want подтягивается к snd_done), и цикл ожидания выходит - * сразу. Замер в MAME 2026-08-26: ОДНА страница за семь секунд, - * то есть одиннадцать страниц m53 не успевали за всю сцену — - * pop_music_play() на своём тике не находил готового трека, и - * реплики Джафара пропадали совсем. - * - * Страница стоит 33 мс против кадра сцены в 100-133 мс, поэтому - * один безусловный шаг в кадр сцену не ломает: он лишь тратит - * часть той же паузы, а если паузы не было — добавляет к кадру - * четверть его длины, и шкала это учтёт сама. */ - if (pop_music_loading()) (void)pop_music_load_step(); - /* Первый кадр собран под чёрной палитрой — теперь проявляем его - * целиком, вместе с принцессой и факелами. */ - if (!faded_in) { faded_in = 1; pop_pal_fade_in(INTRO_FADE); } - /* ПЕЙСИНГ ПО ОРИГИНАЛЬНОЙ ШКАЛЕ. Кадр cutscene — 6/8/7 тиков по - * 1/60 с; один тик = 85,4/60 = 1,424 тика насоса, и 57/40 = 1,425 - * повторяет это с точностью 0,07 % (30 мс на всю сцену) без - * деления в кадре и без 32-битной арифметики. */ - if (snd_pace) { - snd_acc += (uint16_t)period * 57u; - while (snd_acc >= 40u) { snd_acc -= 40u; snd_want++; } - for (;;) { - uint8_t now = pop_snd_tick; - - /* Разность в uint8_t: счётчик переполняется каждые 3 с, а - * заглядываем мы в него не реже раза в кадр. */ - snd_done += (uint8_t)(now - snd_prev); - snd_prev = now; - if (snd_done >= snd_want) break; - /* Страницу следующей реплики читаем ЗДЕСЬ, в паузе кадра: - * 33 мс диска укладываются в ожидание (кадр сцены — 133 мс), - * и подкачка не добавляется к длительности кадра, а - * растворяется в ней. */ - if (pop_music_loading()) (void)pop_music_load_step(); - else gfx_wait_vsync(); - } - /* ДОЛГ НЕ ДОГОНЯЕМ. Подкачка следующей реплики (страница — 33 мс) - * и любой тяжёлый кадр оставляют snd_done впереди snd_want, и - * дальше цикл гнал кадры без единого ожидания: пламя факелов - * мелькало, а события соседних тиков (створка ворот и дверь - * покоев) слипались в один кадр — заявка перезаписывала заявку, и - * один из звуков пропадал. Тот же принцип, что у pop_pace_end: - * якорь ставится ПО ФАКТУ, пропущенное время не наверстывается. */ - if (snd_done > snd_want) snd_want = snd_done; - } else { - uint16_t target = POP_T60(tick); - - while (beam < target) { gfx_wait_vsync(); beam++; } - } - } - /* CBL НЕ ГЛУШИМ: последняя реплика Джафара звучит поверх смены сцены — - * ровно как в оригинале, где show_title ждёт её окончания уже на - * экране «свадьбы» (seg000:2051). Глушит вызывающий, когда музыка - * действительно доиграла. */ - if (result) { pop_music_free(); pop_sfx_pause(); } - if (!result) pop_pal_fade_out(INTRO_FADE); - - atlas_free(&torch); - atlas_free(&hourglass); - atlas_free(&jaffar2); - atlas_free(&jaffar1); - atlas_free(&jaffar0); - atlas_free(&princess); - return result; -} - -/* hourglass_frame() SDLPoP: четыре границы оставшегося времени выбирают - * один из кадров 6..2. В h0.atl номер кадра совпадает с hourglass_state. */ -static uint8_t pre_hourglass_state(void) -{ - static const uint8_t bound[] = { 6, 17, 33, 65 }; - uint8_t i; - - for (i = 0; i < sizeof(bound); i++) - if (bound[i] > pop_timer_minutes) break; - return (uint8_t)(6 - i); -} - -/* cutscene_2_6()/cutscene_4(): 26 логических кадров по 100 мс. У SDLPoP - * это 6/60 секунды, у Sprinter — 5/50, то есть 130 физических кадров. - * Статична только поза Princess; draw_princess_room_bg оригинала - * каждый логический кадр заново обновляет факелы, звёзды, корпус часов и - * одну из трёх фаз сыплющегося песка. */ -/* Живая комната принцессы БЕЗ актёрской механики: готовая композиция (или - * чистый фон, если picture == PV_ROOM_BARE), поверх неё пламя факелов, - * звёзды в окне и песочные часы заданного состояния. На этом держатся и - * сцены перед уровнями, и экран «время вышло» — разница только в картинке, - * состоянии часов и длине. - * - * hg_state: 0 — часов нет, 7 — время вышло (пустые, без струйки песка). */ -#define PV_ROOM_BARE 0xFF - -static int pre_room_animated(uint8_t picture, uint8_t state, uint8_t frames) -{ - atlas_t hourglass, torch; - gfx_rect_t full; - uint8_t torch_left = 1, torch_right = 6, sand = 0, frame; - uint8_t star_phase[6] = { 1, 1, 1, 1, 1, 1 }; - intro_skip_t skip; - int result = -1; - - intro_prepare_palette(INTRO_PAL_PV); - intro_commit_palette(); - /* Обе shadow-страницы содержат чистую статическую сцену. Динамика ниже - * рисуется GFX_BANK_SPRITE и потому не оседает в этом источнике. */ - if (picture == PV_ROOM_BARE) { - if (intro_pv_draw_base() != 0) return -1; - } else if (intro_draw_page(picture, 0) != 0 || - intro_draw_page(picture, 1) != 0) { - return -1; - } - { - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t bad; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_H0, &hourglass) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_T0, &torch) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - - pop_screen_present(1); - result = 0; - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - intro_skip_begin(&skip); - for (frame = 0; frame < frames; frame++) { - uint8_t back, hold, star; - - if (intro_skip_requested(&skip)) { result = 1; break; } - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - gfx_copy_page(&full, GFX_COPY_DIRECT); - gfx_set_bank(GFX_BANK_SPRITE); - pv_blit_floor(&torch, torch_left, 93, 116); - pv_blit_floor(&torch, torch_right, 211, 116); - pv_draw_stars(star_phase); - if (state) { - pv_blit_floor(&hourglass, state, 152, 168); - /* Струйка песка есть, пока часы идут: при state 7 время уже - * вышло (draw_hourglass, sandflow = -1). */ - if (state < 7) - pv_blit_floor(&hourglass, (uint8_t)(8 + sand), 160, 164); - } - pv_blit_floor(&hourglass, 0, 240, 167); /* передняя колонна */ - gfx_wait_vsync(); - gfx_set_visible_page(back); - /* Первый тик уже потрачен на commit: ещё четыре = 5/50 с. */ - for (hold = 1; hold < 5; hold++) gfx_wait_vsync(); - - /* Проявляем ПОСЛЕ первого кадра: иначе две секунды fade идут по - * пустой комнате, а часы и пламя возникают уже на свету. */ - if (frame == 0) pop_pal_fade_in(INTRO_FADE); - torch_left = (uint8_t)((torch_left + 1) % 9); - torch_right = (uint8_t)((torch_right + 1) % 9); - sand = (uint8_t)((sand + 1) % 3); - star = (uint8_t)(frame % 6); - star_phase[star] = (uint8_t)((star_phase[star] + 1) % 5); - } - if (!result) pop_pal_fade_out(INTRO_FADE); - - atlas_free(&torch); - atlas_free(&hourglass); - return result; -} - -/* SDLPoP transition_ltr(): подготовленная story-страница копируется на - * видимый title узкими вертикальными полосами слева направо. У оригинала - * 2px/120 FPS; здесь 4px/60 FPS даёт ту же длительность (~1.3 с), не - * удваивая число полных копий 320x256 в ограниченном bank 9. */ -/* Собрать «In the absence» в СКРЫТУЮ страницу. Отделено от показа: между - * ними успевает загрузиться трек, а на экране всё это время держится - * последний кадр титров — ровно как у оригинала, который рисует историю в - * offscreen и лишь потом пускает transition_ltr. */ -static int intro_story_prepare(void) -{ - uint8_t target = (uint8_t)(gfx_get_visible_page() ^ 1); - - return intro_draw_page(INTRO_STORY_ABSENCE, target); -} - -/* Полосовой показ подготовленной страницы живёт в pop_ui: тем же приёмом - * появляются титульная картинка финала и таблица рекордов. */ - -static void intro_flash(uint16_t ticks) -{ - uint8_t page; - - page = pop_screen_begin(); - pop_screen_fill(WHITE); - pop_screen_present(page); - while (ticks--) gfx_wait_vsync(); - /* Вспышка ничего не меняет в сценарии: вернуть ту же собранную стадию. */ - intro_draw(intro_scene); -} - -static void intro_restore_game_palette(void) -{ - /* Обе страницы — именно чёрный растр до gfx_pal_fload/sync. Иначе - * синхронизация palette 1 способна на один кадр высветить credits перед - * переходом в demo. */ - intro_black_pages(); - pop_pal_game_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); -} - -/* ================= ПЕРСОНАЖИ КАТСЦЕН ================================= * - * - * Порт cutscene_8 / cutscene_9 (seg001:034D/03B7) и end_sequence_anim - * (seg001:041C). Все три идут через load_intro(1, …): фон — комната - * принцессы (та же b0_*, что у intro), а поверх играют ДВА персонажа. - * - * Движок общий с игрой, и это главное: последовательности крутит наш - * play_seq (pop_kid_play/pop_guard_play), кадры принцессы берутся из - * таблицы КАТСЦЕН (kid.ani, KID_BIN_CFRAMES_OFF), мышь и Кид — из - * таблицы Кида, как в оригинале (frame_table_kid общая для kid и mouse). - * Отличается только ОТРИСОВКА: спрайты принцессы лежат в PV-атласах, а - * Кид/мышь — в игровых kid-атласах, поэтому в pv.pal под них отведена - * своя палитровая строка 0x70. - * - * Слоты — как в оригинале: Kid-окно занимает мышь (или Кид в финале), - * Guard-окно — принцесса. - */ - -/* Набор PV2 (res901..930) не влезает в одну EMM: image 0..16 в a1, - * 17..29 в a2. Номер кадра при этом остаётся исходным image-id. */ -#define CUT_PV2_SPLIT 17 -/* Один логический кадр катсцены = 5 vsync, как у остальных PV-сцен - * (cutscene_frame_time SDLPoP; см. pre_room_animated). */ -#define CUT_FRAME_VSYNC 5 - -static atlas_t cut_pv1, cut_pv2a, cut_pv2b, cut_hg, cut_torch; -static uint8_t cut_atlases; /* сколько успели загрузить — столько и вернём */ -/* Детектор фронта живёт на ВСЮ сцену: она склеена из нескольких cut_run, и - * взводить его заново на каждом отрезке значило бы ловить одно удержание - * несколько раз. */ -static intro_skip_t cut_skip; -/* Фазы «живого» фона: пламя двух факелов, песок и мерцание звёзд. Счётчики - * общие на всю сцену — она склеена из нескольких cut_run. */ -static uint8_t cut_torch_l, cut_torch_r, cut_sand, cut_star_phase[6]; -static uint8_t cut_hg_state; - -static void cut_free(void) -{ - if (cut_atlases > 4) atlas_free(&cut_torch); - if (cut_atlases > 3) atlas_free(&cut_hg); - if (cut_atlases > 2) atlas_free(&cut_pv2b); - if (cut_atlases > 1) atlas_free(&cut_pv2a); - if (cut_atlases > 0) atlas_free(&cut_pv1); - cut_atlases = 0; -} - -static int cut_load(void) -{ - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - - cut_atlases = 0; - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - if (pv_atlas(&arc, tbl, ARC_PV_A0, &cut_pv1) != 0) { - pop_arc_close(&arc); return -1; - } - cut_atlases = 1; - if (pv_atlas(&arc, tbl, ARC_PV_A1, &cut_pv2a) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 2; - if (pv_atlas(&arc, tbl, ARC_PV_A2, &cut_pv2b) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 3; - /* Комната принцессы живёт и в катсценах: пламя факелов, звёзды в окне, - * песок в часах — и ПЕРЕДНЯЯ КОЛОННА, которая по оригиналу закрывает - * персонажей (draw_princess_room_bg + foretable). */ - if (pv_atlas(&arc, tbl, ARC_PV_H0, &cut_hg) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 4; - if (pv_atlas(&arc, tbl, ARC_PV_T0, &cut_torch) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 5; - pop_arc_close(&arc); - return 0; -} - -/* Экранная X кадра: та же математика, что у актёров intro — logical - * координата (x*2 − 116) с нечётной фазой по flags кадра, затем - * calc_screen_x_coord (×8/7). */ -static int cut_screen_x(const pop_char_t *ch, const kframe *fr) -{ - int x = ch->x; - int logical; - uint8_t left = (uint8_t)(ch->direction < 0); - - if (left) x -= fr->dx; - else x += fr->dx; - logical = x * 2 - 116; - if (left == (uint8_t)((fr->flags & 0x80) != 0)) ++logical; - return logical * 8 / 7; -} - -/* Принцесса: набор выбирает поле sword кадра (>>6: 1 = PV1 res800, - * 2 = PV2 res900) — ровно как chtab_base + (cur_frame.sword >> 6) - * в seg008:1759. */ -static void cut_blit_princess(const pop_char_t *ch, const kframe *fr) -{ - const atlas_t *at; - uint8_t idx; - - if (fr->image == 255 || cut_atlases < 3) return; - if ((uint8_t)(fr->sword >> 6) >= 2) { - if (fr->image < CUT_PV2_SPLIT) { at = &cut_pv2a; idx = fr->image; } - else { at = &cut_pv2b; idx = (uint8_t)(fr->image - CUT_PV2_SPLIT); } - } else { - at = &cut_pv1; idx = fr->image; - } - pv_blit_actor(at, idx, cut_screen_x(ch, fr), - (int)ch->y + fr->dy, (uint8_t)(ch->direction >= 0)); -} - -/* Кид и мышь — спрайты chtab_2 из игровых атласов (kidp[]). Атласы Кида - * хранятся column-major (ради бесплатного флипа), поэтому блит колоночный. */ -static void cut_blit_kid(const pop_char_t *ch, const kframe *fr) -{ - const uint8_t *img; - uint8_t pg, idx, flip; - int x; - - if (fr->image == 255) return; - pg = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (pg >= kid_npages) return; - flip = (uint8_t)(ch->direction >= 0); - x = cut_screen_x(ch, fr); - gfx_w0_map(kidp[pg].page); - img = (const uint8_t *)atlas_image(&kidp[pg], idx); - if (flip) x -= img[0]; - gfx_blit_cols(x, POP_YOFF + (int)ch->y + fr->dy - img[2] + 1, img, flip); - gfx_w0_unmap(); -} - -/* Сменить последовательность персонажа в его окне (seqtbl_offset_kid_char / - * seqtbl_offset_shad_char оригинала). */ -static void cut_kid_seq(uint8_t seq) -{ - pop_loadkid(); pop_char_set_seq(seq); pop_savekid(); -} - -static void cut_shad_seq(uint8_t seq) -{ - pop_loadshad(); pop_char_set_seq(seq); pop_saveshad(); -} - -/* Поставить персонажа так, как это делают init_* оригинала: позиция, - * направление и стартовая последовательность, затем первый play_seq. */ -static void cut_kid_init(uint8_t charid, uint8_t x, uint8_t y, uint8_t seq) -{ - Kid.charid = charid; - Kid.x = x; - Kid.y = y; - Kid.direction = -1; /* dir_FF_left */ - Kid.alive = -1; - Kid.frame = 0; - Kid.fall_x = Kid.fall_y = 0; - Kid.repeat = 0; - cut_kid_seq(seq); - pop_kid_play(); -} - -static void cut_shad_init(uint8_t x, uint8_t y, uint8_t seq) -{ - Guard.charid = CHARID_5_PRINCESS; - Guard.x = x; - Guard.y = y; - Guard.direction = -1; - Guard.alive = -1; - Guard.frame = 0; - Guard.fall_x = Guard.fall_y = 0; - Guard.repeat = 0; - cut_shad_seq(seq); - pop_guard_play(); -} - -/* proc_cutscene_frame(n): прокрутить n логических кадров, каждый — шаг - * последовательности обоих персонажей плюс отрисовка. Возврат 1 — игрок - * прервал сцену (любое НОВОЕ нажатие). */ -static uint8_t cut_run(uint16_t frames, uint8_t kid_visible) -{ - gfx_rect_t full; - uint16_t i; - uint8_t hold; - - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - for (i = 0; i < frames; i++) { - uint8_t back; - kframe kid_fr, pr_fr; - - if (intro_skip_requested(&cut_skip)) return 1; - - /* Кадр забираем СРАЗУ после play каждого слота. load_frame кладёт - * его в кэш ПО charid активного персонажа: у Кида это kid_frame, у - * всех прочих — общий pop_gframe. В Kid-окне здесь сидит МЫШЬ - * (charid 24), то есть её кадр уходит в pop_gframe и затирается - * следом кадром принцессы, а kid_frame держит позу игрового Кида. - * Читать кэши в конце кадра значило рисовать мышь спрайтом Кида и - * терять принцессу — ровно это и было видно в сценах 8/9. */ - pop_kid_play(); /* мышь либо Кид */ - kid_fr = (Kid.charid == CHARID_0_KID) ? kid_frame : pop_gframe; - pop_guard_play(); /* принцесса */ - pr_fr = pop_gframe; - - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - /* Чистый фон обеих страниц лежит в shadow-копии; персонажи рисуются - * банком спрайтов и потому в неё не оседают. */ - gfx_copy_page(&full, GFX_COPY_DIRECT); - gfx_set_bank(GFX_BANK_SPRITE); - pv_blit_floor(&cut_torch, cut_torch_l, 93, 116); - pv_blit_floor(&cut_torch, cut_torch_r, 211, 116); - pv_draw_stars(cut_star_phase); - /* hourglass_state == 0 — часов в комнате нет вовсе (reset_cutscene - * SDLPoP ставит state=0 и sandflow=-1). Так идёт финальная встреча - * с принцессой: время уже не считается, это победа. - * state 7 — время ВЫШЛО: часы стоят пустыми, и струйки песка в них - * тоже нет (draw_hourglass: `if (hourglass_state >= 7) return;`). */ - if (cut_hg_state) { - pv_blit_floor(&cut_hg, cut_hg_state, 152, 168); - if (cut_hg_state < 7) - pv_blit_floor(&cut_hg, (uint8_t)(8 + cut_sand), 160, 164); - } - cut_blit_princess(&Guard, &pr_fr); - if (kid_visible) cut_blit_kid(&Kid, &kid_fr); - /* ПОСЛЕ персонажей: передняя колонна — передний слой комнаты, она - * обязана закрывать и принцессу, и мышь (иначе мышь «просвечивает» - * сквозь неё — поймано пользователем 2026-08-25). */ - pv_blit_floor(&cut_hg, 0, 240, 167); - gfx_set_bank(GFX_BANK_NORMAL); - gfx_wait_vsync(); - gfx_set_visible_page(back); - for (hold = 1; hold < CUT_FRAME_VSYNC; hold++) gfx_wait_vsync(); - - pop_sfx_tick(); - pop_music_service(); /* «встреча с принцессой» — трек, а не эффект */ - cut_torch_l = (uint8_t)((cut_torch_l + 1) % 9); - cut_torch_r = (uint8_t)((cut_torch_r + 1) % 9); - cut_sand = (uint8_t)((cut_sand + 1) % 3); - { - uint8_t star = (uint8_t)(i % 6); - cut_star_phase[star] = (uint8_t)((cut_star_phase[star] + 1) % 5); - } - } - return 0; -} - -/* Общая обвязка всех трёх сцен: чистый фон комнаты принцессы в обе - * страницы, PV-палитра, актёрские атласы. hg_state — кадр песочных часов - * (0 = часов нет). Возврат -1 — ресурсов нет - * (неполный HDD), и caller откатывается на статический сценарий. */ -static int cut_begin(uint8_t hg_state) -{ - uint8_t i; - - intro_skip_begin(&cut_skip); - cut_torch_l = 1; cut_torch_r = 6; cut_sand = 0; - for (i = 0; i < 6; i++) cut_star_phase[i] = 1; - cut_hg_state = hg_state; - intro_prepare_palette(INTRO_PAL_PV); - intro_commit_palette(); - if (intro_pv_draw_base() != 0) return -1; - if (cut_load() != 0) return -1; - /* Атласы сцены прочитаны — можно открывать вывод. Без этого сцена шла - * молча: pop_ending_show глушит CBL первым действием, а включить его - * обратно было некому, и «arrived to princess» (26) не звучал вовсе. */ - (void)pop_sfx_start(); - return 0; -} - -/* Прервали ли последнюю живую сцену клавишей — нужно вызывающему: по - * пропуску музыку обрываем, а не дослушиваем. */ -static uint8_t cut_aborted; - -static void cut_end(uint8_t aborted) -{ - cut_aborted = aborted; - if (!aborted) pop_pal_fade_out(INTRO_FADE); - cut_free(); -} - -/* cutscene_8 (seg001:034D): мышь сидит рядом с принцессой, встаёт и - * убегает; принцесса поднимается ей вслед. */ -static int cut_scene_8(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* init_mouse_cu8 (seg001:0212) = init_mouse_go + x=144 + seq_106. */ - cut_kid_init(CHARID_24_MOUSE, 144, 167, 106); - /* princess_crouching (seg001:024D): сидит и гладит мышь. */ - cut_shad_init(131, 169, 110); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 1); - if (!aborted) pop_pal_fade_in(INTRO_FADE); - if (!aborted) aborted = cut_run(19, 1); - if (!aborted) { - cut_kid_seq(107); /* мышь встаёт и уходит */ - aborted = cut_run(20, 1); - } - if (!aborted) { - cut_shad_seq(111); /* принцесса встаёт */ - aborted = cut_run(20, 1); - } - cut_end(aborted); - return 0; -} - -/* cutscene_9 (seg001:03B7): принцесса стоит, мышь прибегает, принцесса - * приседает к ней. */ -static int cut_scene_9(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* princess_stand (seg001:026A) — поза PV1, лицом вправо. */ - cut_shad_init(144, 169, 94); - Guard.direction = 0; - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 0); /* мышь ещё за кадром */ - if (!aborted) pop_pal_fade_in(INTRO_FADE); - /* init_mouse_go (seg001:022A): мышь вбегает справа. */ - cut_kid_init(CHARID_24_MOUSE, 199, 167, 105); - if (!aborted) aborted = cut_run(5, 1); - if (!aborted) { - cut_shad_seq(112); /* принцесса приседает */ - aborted = cut_run(9, 1); - } - if (!aborted) { - cut_kid_seq(114); /* мышь останавливается */ - aborted = cut_run(58, 1); - } - cut_end(aborted); - return 0; -} - -/* cutscene_12 (seg001:0525), ветка «времени мало»: принцесса стоит правее - * обычного, через два кадра оборачивается — и всё. Живой её делает та же - * машинка, что сцены 8/9: часы здесь обязаны показывать ОСТАВШЕЕСЯ время, - * а не запечённую в композицию картинку. */ -static int cut_scene_12_short(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* init_princess_x156 (seg001:0230) = init_princess + x = 156. */ - cut_shad_init(156, 166, 94); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 0); - if (!aborted) pop_pal_fade_in(INTRO_FADE); - if (!aborted) aborted = cut_run(1, 0); - if (!aborted) { - cut_shad_seq(98); /* princess turn around [PV1] */ - aborted = cut_run(24, 0); - } - cut_end(aborted); - return 0; -} - -/* end_sequence_anim (seg001:041C): Кид вбегает к принцессе, она - * поворачивается и обнимает его; следом появляется мышь. */ -static int cut_ending(void) -{ - uint8_t aborted; - - /* end_sequence_anim (seg001:041C) НЕ трогает hourglass_state, а - * reset_cutscene перед сценой обнулил его: песочных часов в финале нет. - * Это и логично — уровень пройден, время больше не идёт. */ - if (cut_begin(0) != 0) return -1; - /* init_ending_princess (seg001:0251) + init_ending_kid (seg001:0287). */ - cut_shad_init(136, 164, 109); - cut_kid_init(CHARID_0_KID, 198, 164, 1); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 1); - if (!aborted) pop_pal_fade_in(INTRO_FADE); - pop_sfx_play(26); /* «arrived to princess» */ - if (!aborted) aborted = cut_run(7, 1); - if (!aborted) { - cut_shad_seq(108); /* поворот и объятие */ - aborted = cut_run(5, 1); - } - if (!aborted) { - cut_kid_seq(13); /* Кид останавливается */ - aborted = cut_run(2, 1); - } - /* Kid.frame = 0 (seg001:0348): дальше Кида не видно — он в объятиях, - * и рисуется только принцесса. */ - if (!aborted) aborted = cut_run(39, 0); - if (!aborted) { - /* init_mouse_1 (seg001:02D5): мышь приходит к паре. */ - cut_kid_init(CHARID_24_MOUSE, 197, 164, 105); - aborted = cut_run(9, 1); - } - if (!aborted) { - cut_kid_seq(101); /* мышь встаёт на задние лапы */ - aborted = cut_run(41, 1); - } - cut_end(aborted); - return 0; -} - -static uint8_t intro_run(const pop_cs_cmd_t *script) -{ - pop_cutscene_t cs; - intro_skip_t skip; - uint16_t arg; - uint8_t aborted = 0; - - pop_cutscene_begin(&cs, script); - intro_skip_begin(&skip); - for (;;) { - pop_cs_event_t ev; - - if (intro_skip_requested(&skip)) { - pop_cutscene_abort(&cs); - aborted = 1; - break; - } - ev = pop_cutscene_tick(&cs, &arg); - if (ev == POP_CS_EVENT_END) break; - if (ev == POP_CS_EVENT_PALETTE) intro_prepare_palette((uint8_t)arg); - else if (ev == POP_CS_EVENT_SHOW) { - intro_scene = (uint8_t)arg; - if ((intro_pal_pending ? intro_draw_new_palette(intro_scene) : - intro_draw(intro_scene)) != 0) { - pop_cutscene_abort(&cs); - aborted = 1; - break; - } - } else if (ev == POP_CS_EVENT_FADE_IN) pop_pal_fade_in(INTRO_FADE); - else if (ev == POP_CS_EVENT_FADE_OUT) pop_pal_fade_out(INTRO_FADE); - else if (ev == POP_CS_EVENT_FLASH) intro_flash(arg); - pop_music_service(); /* подкачка потокового трека (финал) */ - gfx_wait_vsync(); - } - - return aborted; -} - - -/* Ожидание кадров у шагов, которые показываются НЕ сценарием, а напрямую. - * Оно не глушит поток: победная тема играет кольцом страниц, и дочитывать - * её надо каждый кадр, иначе насос догонит загрузчика. Прерывается новым - * нажатием (детектор фронта); 1 — прервано. */ -static uint8_t intro_wait_frames(uint16_t frames) -{ - intro_skip_t skip; - - intro_skip_begin(&skip); - while (frames--) { - if (intro_skip_requested(&skip)) return 1; - pop_music_service(); - pop_wait_edge(); - } - return 0; -} - -/* Титры проявляются полосами, как и всё остальное в show_title() - * (draw_full_image(STORY_CREDITS) + transition_ltr, seg000:2055). */ -static uint8_t intro_credits_ltr(void) -{ - uint8_t page = pop_screen_begin(); - - if (intro_draw_page(INTRO_STORY_CREDITS, page) == 0) - pop_screen_present_ltr(); - return intro_wait_frames(POP_T60(0x168)); -} - -uint8_t pop_intro_show(void) __banked -{ - int pv_result; - - /* МУЗЫКА ПРИХОДИТ СЮДА ЗВУЧАЩЕЙ. На титрах играет тема (m54), и - * обрывать её нельзя: у оригинала заставка и история — одна звуковая - * дорожка, где следующая реплика начинается там, где кончилась - * предыдущая. Поэтому здесь ни pop_sfx_pause, ни pop_sfx_start: - * CBL уже открыт титрами. */ - if (intro_story_prepare() != 0) { - /* Ошибка файла не должна оставить старый title без выхода: менее - * эффектный, но корректный fallback остаётся обычным fade-in. */ - pop_music_free(); - pop_sfx_pause(); - intro_prepare_palette(INTRO_PAL_STORY); - if (intro_draw_new_palette(INTRO_STORY_ABSENCE) == 0) - pop_pal_fade_in(INTRO_FADE); - } else { - /* Картинка собрана и ждёт в скрытой странице; читаем следующую - * реплику во ВТОРОЙ слот — тема титров при этом продолжает - * звучать из первого. */ - (void)pop_music_load(POP_MUS_STORY_1); - /* Тему дослушиваем до конца, как seg000:2027, и только потом - * пускаем историю: пуск и полосовой переход идут встык. */ - { - intro_skip_t head; - intro_skip_begin(&head); - while (pop_music_busy() && !intro_skip_requested(&head)) - pop_wait_edge(); - } - (void)pop_sfx_start(); /* идемпотентно: титры его уже открыли */ - pop_music_play(); - pop_screen_present_ltr(); - } - if (intro_run(intro_before_pv)) { - /* Пропуск по клавише. ГЛУШИМ ВЫВОД: сразу за возвратом пойдёт - * загрузка уровня, а при открытом CBL ESTEX уходит в диск дольше, - * чем играет буфер, и железо начинает крутить свои 256 байт по - * кругу — на слух ровно тот скрежет, что ловится нажатием клавиши - * на первом экране истории. */ - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - /* ДОИГРАТЬ ПОД ЧЁРНЫМ ЭКРАНОМ. Оригинал не обрывает story-трек на - * переходе к PV: fade уводит картинку, а музыка продолжается, и лишь - * когда она смолкла, начинается сцена с принцессой (у SDLPoP это - * общий приём — `while (check_sound_playing())`, seg000:2027). */ - { - intro_skip_t tail; - intro_skip_begin(&tail); - while (pop_music_busy() && !intro_skip_requested(&tail)) pop_wait_edge(); - } - /* Первая реплика PV читается ЗДЕСЬ, под чёрным экраном и в тишине: - * дальше внутри сцены остаётся только пуск, а следующие две реплики - * подкачиваются по странице за кадр. */ - pop_sfx_pause(); - (void)pop_music_load(POP_MUS_STORY_2); - pv_result = intro_pv_animated(); - if (pv_result > 0) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - if (pv_result < 0 && intro_run(intro_pv_fallback)) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - /* «Свадьба» показывается ПОВЕРХ звучащей реплики Джафара: она началась - * в PV и переживает и fade-out сцены, и fade-in этого экрана. */ - if (intro_run(intro_marry)) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - { - intro_skip_t marry; - intro_skip_begin(&marry); - while (pop_music_busy() && !intro_skip_requested(&marry)) - pop_wait_edge(); - } - pop_music_free(); - pop_sfx_pause(); - /* ТИТУЛЬНЫЙ ЭКРАН МЕЖДУ «СВАДЬБОЙ» И ТИТРАМИ. show_title() рисует - * TITLE_MAIN + логотип + Jordan Mechner и проявляет их полосами - * (seg000:2045), и только через 0x78 тиков показывает credits — тоже - * полосами. Раньше обе картинки возникали мгновенно. */ - if (pop_title_logo_ltr() == 0 && intro_wait_frames(POP_T60(0x78))) { - intro_restore_game_palette(); - return 1; - } - if (intro_credits_ltr()) { - intro_restore_game_palette(); - return 1; - } - /* ТАБЛИЦА РЕКОРДОВ между credits и attract-demo — ровно там же, где её - * показывает show_title(): та же story-палитра, тот же полосовой - * переход, никакого fade (seg000:2060). Пустой таблицы это не - * касается: она просто не показывается. */ - if (pop_hof_show_title()) { - intro_restore_game_palette(); - return 1; - } - if (intro_run(intro_tail)) { - intro_restore_game_palette(); - return 1; - } - /* Abort возможен в любой WAIT и не оставляет загруженных атласов: каждая - * полоса освобождена внутри intro_draw. */ - intro_restore_game_palette(); - return 0; -} - -/* Хвост любой сцены перед уровнем. - * - * ДОСЛУШИВАЕМ ПОД ЧЁРНЫМ ЭКРАНОМ, а не «пусть играет в игре». Оригинал - * так и делает: следующий load_intro начинается с ожидания тишины - * (seg001:681), и к отрисовке уровня трек уже смолк. Мы сначала отдали - * музыку в игру — и она там спотыкалась: загрузка уровня (ESTEX + сборка - * комнаты) не даёт насосу долить блок вовремя. Ждать здесь дешевле, чем - * слушать заикание. - * - * Пропуск сцены обрывает и музыку: игрок нажал клавишу, чтобы идти - * дальше, а не чтобы досидеть до конца трека. */ -static void pre_cut_finish(uint8_t aborted) -{ - if (!aborted) { - intro_skip_t tail; - - intro_skip_begin(&tail); - while (pop_music_busy() && !intro_skip_requested(&tail)) - pop_wait_edge(); - } - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); -} - -void pop_pre_cutscene_show(pop_pre_cutscene_t scene) __banked -{ - const pop_cs_cmd_t *script = 0; - - pop_sfx_pause(); - /* МУЗЫКА ПЕРЕЖИВАЕТ СЦЕНУ. Треки заставок между уровнями длиннее самих - * сцен (27 — 10,7 с против 2,6 с картинки), и оригинал их не обрывает: - * load_intro просто гасит экран и возвращает управление, а звук - * продолжает играть уже поверх загрузки уровня и первых секунд игры - * (seg001:690). Мы глушили CBL на выходе — музыка обрывалась на - * полуслове. Теперь не глушим: доиграет сама, а следующая загрузка - * трека всё равно освободит слот. - * - * Какой именно трек — как в оригинале: 27 для 2/4/6/12 (seg001:401), - * 35 для 8/9 (seg001:298), 40 для короткой «времени мало» (seg001:388). - * Экран в этот момент чёрный, поэтому читаем трек целиком: пауза на - * диск здесь никому не мешает. */ - { - uint8_t track = 27; - - if (scene == POP_PRE_8 || scene == POP_PRE_9) track = 35; - else if (scene == POP_PRE_12_SHORT) track = 40; - if (pop_music_load(track) == 0) { - (void)pop_sfx_start(); - pop_music_play(); - } - } - if (scene == POP_PRE_2_6 || scene == POP_PRE_4 || scene == POP_PRE_12) { - int r = pre_room_animated((uint8_t)(scene == POP_PRE_4 ? INTRO_PV_LYING - : INTRO_PV_STAND), - pre_hourglass_state(), 26); - if (r >= 0) { - pre_cut_finish((uint8_t)(r > 0)); - return; - } - /* Неполный HDD: статический fallback сохраняет корректные 130 тиков. */ - } - if (scene == POP_PRE_12_SHORT && cut_scene_12_short() == 0) { - pre_cut_finish(cut_aborted); - return; - } - /* Сцены 8/9 — живая анимация мыши и принцессы (cutscene_8/cutscene_9). */ - if (scene == POP_PRE_8 || scene == POP_PRE_9) { - int done = (scene == POP_PRE_8) ? cut_scene_8() : cut_scene_9(); - if (done == 0) { - pre_cut_finish(cut_aborted); - return; - } - } - if (scene == POP_PRE_2_6 || scene == POP_PRE_12) script = pre_2_6; - else if (scene == POP_PRE_4) script = pre_4; - else if (scene == POP_PRE_8) script = pre_8; - else if (scene == POP_PRE_9) script = pre_9; - else if (scene == POP_PRE_12_SHORT) script = pre_12_short; - if (!script) { - pre_cut_finish(1); - return; - } - - pre_cut_finish(intro_run(script)); -} - -/* Фон таблицы рекордов — та же рамка story плюс логотип PRINCE OF PERSIA - * (STORY_FRAME + HOF_POP оригинала). Рисуем в ЗАДАННУЮ страницу и её не - * показываем: палитрой, строками и переходом распоряжается pop_hof. */ -int pop_intro_hof_bg(uint8_t page) __banked -{ - return intro_draw_page(INTRO_STORY_HOF, page); -} - -void pop_time_expired_show(void) __banked -{ - pop_sfx_pause(); - /* time_expired (seg001:04D3) начинается с play_sound(sound_36). */ - if (pop_music_load(36) == 0) { - (void)pop_sfx_start(); - pop_music_play(); - } - /* ПРИНЦЕССЫ ЗДЕСЬ НЕТ. Оригинал не зовёт ни одного init_*: экран — - * это пустая комната и ОСТАНОВИВШИЕСЯ часы (state 7, струйки песка - * нет). Мы показывали готовую композицию с принцессой и полными - * часами — то есть ровно противоположное по смыслу. - * Длина — 2 + 100 кадров cutscene, как в оригинале. */ - if (pre_room_animated(PV_ROOM_BARE, 7, 102) < 0) - intro_run(time_expired_script); /* нет ресурсов — старый путь */ - /* Оригинал ждёт КОНЦА ТРЕКА уже под чёрным экраном (seg001:374). */ - { - intro_skip_t tail; - - intro_skip_begin(&tail); - while (pop_music_busy() && !intro_skip_requested(&tail)) - pop_wait_edge(); - } - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); -} - - -void pop_ending_show(void) __banked -{ - pop_sfx_pause(); - /* Экран гасим ПЕРВЫМ действием — как load_intro оригинала, который - * начинается с draw_rect(&screen_rect, color_0_black). Иначе загрузка - * ресурсов сцены идёт поверх ЖИВОЙ комнаты уровня 14, и она «мелькает» - * перед встречей. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - /* Встреча с принцессой — живая сцена (end_sequence_anim). Дальше по - * скрипту идёт только текст HAIL, поэтому статический сценарий ниже - * начинается с него; при нехватке ресурсов отыгрывается целиком. */ - if (cut_ending() == 0) { - /* ПОБЕДНАЯ ТЕМА (56) — потоком с диска: 115 секунд и 1,2 МБ в память - * не влезают никак. Оригинал пускает её здесь же, сразу после - * встречи с принцессой и до экрана HAIL (seg001:583). Дальше - * страницы дочитывает pop_music_service из циклов сцен. */ - (void)pop_sfx_start(); - (void)pop_music_ring_start(POP_MUS_WON); - intro_run(ending_hail_script); - } else { - intro_run(ending_script); - } - /* ТИТУЛЬНАЯ КАРТИНКА ПОВЕРХ ТЕКСТА. end_sequence заводит таймер на 240 - * тиков, проявляет TITLE_MAIN полосами и ждёт его (seg001:590). Экран - * при этом не гаснет: рамка HAIL просто переползает в рисунок дворца. - * Дальше — состояние HALL_OF_FAME; тема продолжает звучать, и - * освобождает её уже таблица рекордов, как в оригинале. */ - if (pop_title_main_ltr() == 0) - (void)intro_wait_frames(POP_T60(240)); -} diff --git a/applications/PoP/roomtest/pop_intro.h b/applications/PoP/roomtest/pop_intro.h deleted file mode 100644 index 105d960..0000000 --- a/applications/PoP/roomtest/pop_intro.h +++ /dev/null @@ -1,29 +0,0 @@ -/* pop_intro.h — story/PV intro после оригинальной заставки (FG8). */ -#ifndef POP_INTRO_H -#define POP_INTRO_H - -#include "pop_flow.h" - -/* Показать absence -> Princess/Jaffar -> marry -> credits. Возврат 1 — - * пользователь прервал цепочку и надо сразу начать FIRST_LEVEL; 0 — intro - * завершилось штатно и далее запускается attract-demo. */ -uint8_t pop_intro_show(void) __banked; - -/* Показать одну pre-level сцену 2/4/6/8/9/12. NONE — no-op. После любого - * skip возвращается затемнённая игровая палитра, далее caller грузит уровень. */ -void pop_pre_cutscene_show(pop_pre_cutscene_t scene) __banked; - -/* Отдельная сцена истёкшего времени (PV hourglass), после которой автомат - * возвращается в TITLE. Любой raw-ввод сокращает ожидание. */ -void pop_time_expired_show(void) __banked; - -/* Финал level 14: Princess room, story-screen HAIL и титульная картинка. - * Победная тема при выходе ЕЩЁ ЗВУЧИТ: её дослушивает таблица рекордов, - * как в end_sequence оригинала. */ -void pop_ending_show(void) __banked; - -/* Фон таблицы рекордов (рамка story + логотип) в заданную СКРЫТУЮ - * страницу; -1 — ресурс не прочитан. Ни палитры, ни показа. */ -int pop_intro_hof_bg(uint8_t page) __banked; - -#endif /* POP_INTRO_H */ diff --git a/applications/PoP/roomtest/pop_kboot.c b/applications/PoP/roomtest/pop_kboot.c deleted file mode 100644 index 9405989..0000000 --- a/applications/PoP/roomtest/pop_kboot.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * pop_kboot.c — ЗАГРУЗКА ресурсов Кида: атласы chtab_2 (kid0..27.atl) и - * страница таблиц анимации (kid.ani). БАНК 8. - * - * Отрабатывает раз за игру (и на выходе — освобождение), поэтому места в - * резиденте W1 не занимает: контракт с интерпретатором — _pop_kid.h, там - * же дескриптор страницы данных. - */ -#include -#include -#include -#include -#include -#include "pop_kid.h" -#include "_pop_kid.h" -#include "kid_data.h" -#include "pop_vflip.h" -#include "pop_guard.h" /* pop_guard_vflip_load — зеркала соперника */ -#include "pop_arc.h" -#include "kid_arc.h" - -/* Серии в архиве обязаны лежать подряд — так их кладёт список в Makefile, - * и только поэтому индекс считается сложением. Если порядок собьётся, - * сборка встанет здесь, а не рассыплется картинкой на экране. */ -#if (ARC_KID_KID27 - ARC_KID_KID0) != 27 -#error "kid0..kid27 в архиве не подряд" -#endif -#if (ARC_KID_KID27_V - ARC_KID_KID0_V) != 27 -#error "kid0_v..kid27_v в архиве не подряд" -#endif - -#define KID_MAXPAGES 28 - -/* Таблица архива живёт на стеке вызывающего (4 байта на запись, здесь 232) - * — держать её постоянно незачем, а W2 у игры и без того тесный. */ -int pop_kid_load(uint8_t npages) __banked -{ - uint8_t tbl[ARC_KID_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t i; - - if (npages > KID_MAXPAGES) npages = KID_MAXPAGES; - if (pop_arc_open_id(&arc, POP_ARC_KID, tbl, ARC_KID_COUNT) < 0) return -1; - for (i = 0; i < npages; i++) - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_KID_KID0 + i), - &kidp[i]) != 0) { - pop_arc_close(&arc); - return -1; - } - /* Меч — из того же открытого архива: без него кадры 229+ идут без - * клинка, а второй open стоил бы дороже самого чтения. */ - { - atlas_t sword; - - if (pop_arc_atlas(&arc, tbl, ARC_KID_SWORD, &sword) == 0) - (void)pop_sword_take(&sword); - } - pop_arc_close(&arc); - kid_npages = npages; - return 0; -} - -void pop_kid_free(void) __banked -{ - uint8_t i; - for (i = 0; i < kid_npages; i++) - atlas_free(&kidp[i]); - kid_npages = 0; -} - -int pop_kid_data_load(const char *path) __banked -{ - uint8_t blk, page; - int n; - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - n=bank_load_file(page,KD_DATA_OFF,path,16384-KD_DATA_OFF); - if (n < (int)(KID_BIN_SEQTBL_OFF + KID_SEQTBL_LEN)) { - mem_free_block(blk); return -1; - } - gfx_w0_page_prepare(page); - kdat_blk=blk; kdat_page=page; kdat_ok=1; - return 0; -} - -void pop_kid_data_free(void) __banked -{ - if (kdat_ok) { mem_free_block(kdat_blk); kdat_ok = 0; } -} - -/* ---- Зеркальный набор (зелье инверсии, уровень 9) -------------------- * - * Грузится ОДНИМ вызовом и откуда угодно: со старта игры, из показа интро - * или при входе на уровень с зельем — см. pop_vflip.h. Внутри обычный - * atlas_load (он резидентный и сам мапит W3, банку это разрешено делать - * только через него). Идемпотентна. */ -int pop_vflip_load_all(void) __banked -{ - uint8_t tbl[ARC_KID_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t i; - int res = 0; - - if (pop_vflip_ready()) return 0; - if (pop_arc_open_id(&arc, POP_ARC_KID, tbl, ARC_KID_COUNT) < 0) return -1; - for (i = 0; i < kid_npages; i++) { - atlas_t m; - - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_KID_KID0_V + i), &m) != 0 || - pop_vflip_take(&kidp[i], &m) != 0) - res = -1; - } - { - atlas_t sword_v; - - if (pop_arc_atlas(&arc, tbl, ARC_KID_SWORD_V, &sword_v) != 0 || - pop_sword_vflip_take(&sword_v) != 0) - res = -1; - } - pop_arc_close(&arc); - if (pop_guard_vflip_load() != 0) res = -1; - return res; -} diff --git a/applications/PoP/roomtest/pop_kdraw.c b/applications/PoP/roomtest/pop_kdraw.c deleted file mode 100644 index dcc6fdc..0000000 --- a/applications/PoP/roomtest/pop_kdraw.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * pop_kdraw.c — отрисовка ИЗ АТЛАСОВ КИДА, которая нужна только слою - * персонажей: клинок в руке (add_sword_to_objtable, seg006:1798) и блит - * спрайта chtab_2 по его id (полоса HP). БАНК 4, вместе с pop_cdraw.c. - * - * Почему здесь. Оба вызова приходят РОВНО из pop_cdraw.c и больше ниоткуда - * (проверено грепом), а лежали они в pop_kid.c — то есть в резиденте W1, - * съедая ~1.2 КБ дефицитного окна ради кода, который зовёт сосед по банку. - * Раз модуль в том же банке 4 — вызовы прямые, без трамплина: объявления в - * _pop_kdraw.h НЕ помечены __banked (см. там же условие корректности). - * - * Загрузка атласа меча (pop_sword_load) осталась публичной и __banked: её - * зовёт инициализация, один раз за игру. - */ -#include -#include -#include -#include "pop_kid.h" -#include "_pop_kdraw.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_guard.h" /* CHARID_* — клинок есть и у стража */ -#include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */ -#include "_pop_draw.h" /* pop_onscreen_cols */ -#include "pop_map.h" /* pop_upside — зелье инверсии */ -#include "pop_vflip.h" /* зеркальные страницы атласов */ -#include "kid_data.h" - -/* chtab_0 «меч в руке» (add_sword_to_objtable, seg006:1798): клинок — - * ОТДЕЛЬНЫЙ спрайт поверх персонажа, один и тот же атлас у Кида и у стража. - * Таблица sword_tbl (kid_data.h, генерится из seg006) индексируется - * sword_frame = кадр.sword & 0x3F; id 255 = клинка в этом кадре нет. - * Смещения — в ЭКРАННЫХ пикселях: оригинал применяет их ПОСЛЕ - * calc_screen_x_coord, x — «вперёд» по направлению персонажа. */ -static const uint8_t SWORD_ID[KID_NSWORD] = KID_SWORD_ID_INIT; -static const int8_t SWORD_DX[KID_NSWORD] = KID_SWORD_DX_INIT; -static const int8_t SWORD_DY[KID_NSWORD] = KID_SWORD_DY_INIT; -static atlas_t swordp; -static uint8_t sword_ok; - -/* Меч приходит УЖЕ ЗАГРУЖЕННЫМ: его читает pop_kid_load из того же архива, - * что и остальные страницы Кида, — открывать архив второй раз ради одного - * элемента незачем (`open` дороже самого чтения). */ -int pop_sword_take(const atlas_t *a) __banked -{ - if (!a) return -1; - swordp = *a; - sword_ok = 1; - return 0; -} - -/* Зеркальная страница меча (зелье инверсии) — пара к pop_sword_take. */ -int pop_sword_vflip_take(const atlas_t *m) __banked -{ - if (!sword_ok) return 0; - return pop_vflip_take(&swordp, m); -} - -/* add_sword_to_objtable (seg006:1798). Клинок рисуется, если персонаж в - * кадрах подъёма/ножен, ИЛИ держит меч, ИЛИ это ЖИВОЙ страж (у стража меч - * в руке всегда, даже пока sword ещё sheathed). Страницу W0 оставляем - * замапленной — вызывающий делает gfx_w0_unmap сам. */ -uint8_t pop_sword_draw(const pop_char_t *ch, const kframe *fr, - int obj_x, int obj_y, - int *rx, int *ry, uint16_t *rw, uint16_t *rh) -{ - uint8_t sf, id, flip; - const uint8_t *simg; - uint16_t w, h; - int bx, top; - - if (!sword_ok) return 0; - if (!((ch->frame >= 229 && ch->frame < 238) || - ch->sword != 0 || - ((ch->charid == CHARID_2_GUARD || ch->charid == CHARID_4_SKELETON) && - ch->alive < 0))) - return 0; - sf = (uint8_t)(fr->sword & 0x3F); - if (sf == 0 || sf >= KID_NSWORD) return 0; - id = SWORD_ID[sf]; - if (id == 0xFF) return 0; - - simg = (const uint8_t *)atlas_image(&swordp, id); - { /* ПЕРЕВОРОТ: зеркальная копия страницы меча (см. pop_vflip.h) */ - uint8_t vpg = swordp.page; - if (pop_upside) { - uint8_t f = pop_vflip_page(vpg); - if (f) vpg = f; - } - gfx_w0_map(vpg); - } - w = (uint16_t)(simg[0] | ((uint16_t)simg[1] << 8)); - h = (uint16_t)(simg[2] | ((uint16_t)simg[3] << 8)); - if (!w || !h) return 0; - - flip = (uint8_t)(ch->direction >= 0); - bx = obj_x + ((ch->direction < 0) ? -(int)SWORD_DX[sf] : (int)SWORD_DX[sf]); - top = obj_y + (int)SWORD_DY[sf] - (int)h + 1; - /* Та же формула, что у самого персонажа (pop_cdraw.c): верх кадра - * [top, top+h) уезжает в 192 - top - h. */ - if (pop_upside) top = POP_PLAYFIELD_H - top - (int)h; - if (flip) bx -= (int)w; - /* Поле комнаты — 192 строки (reset_obj_clip, seg006:0507): клинок - * обрезается по нему так же, как сам персонаж. Без этого у падающего - * в пропасть скелета меч оставался виден НИЖЕ поля, на полосе HP. */ - { - int skip = 0, rows = (int)h; - if (top < 0) { skip = -top; rows -= skip; top = 0; } - if (top + rows > 192) rows = 192 - top; - if (rows <= 0) return 0; - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Клинок почти всегда целиком на экране — noclip-путь (см. gfx.h: - * подготовка клипающего варианта стоит ~5.6 К тактов на вызов). */ - if (pop_onscreen_cols(bx, top + POP_YOFF, w, (uint16_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, simg, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part(bx, top + POP_YOFF, simg, flip, skip, rows); - gfx_set_bank(GFX_BANK_NORMAL); - *rx = bx; *ry = top; *rw = w; *rh = (uint16_t)rows; - } - return 1; -} - -/* Блит спрайта chtab_2 (атласы Kid) по ЕГО id, левым верхним углом в (x,y). - * Нужен полосе HP: она рисует id 216/217 из тех же атласов, что и кадры - * Кида, а держать вторую копию раскладки в pop_cdraw ни к чему. */ -void pop_kid_img_blit(uint8_t image, int x, int y) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t pg = (uint8_t)(image >> 3); /* раскладка атласов: 8 спрайтов/стр. */ - uint8_t idx = (uint8_t)(image & 7); - const uint8_t *img; - uint16_t w, h; - if (pg >= kid_npages) return; - img = (const uint8_t *)atlas_image(&kidp[pg], idx); - gfx_w0_map(kidp[pg].page); - w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - /* Атласы Кида хранятся COLUMN-MAJOR (transpose_cols в pop_pack_kid — - * ради бесплатного горизонтального флипа), поэтому блит обязан быть - * колоночным. Row-major gfx_blit_noclip выдал бы марку транспонированной. - * noclip БЕЗ проверки (CLIP-1): единственный вызывающий — полоса HP - * (pop_cdraw.c), у неё координаты фиксированные и заведомо на экране. */ - if (w && h) gfx_blit_cols_part_noclip(x, y, img, 0, 0, 0); - gfx_w0_unmap(); -} diff --git a/applications/PoP/roomtest/pop_kid.c b/applications/PoP/roomtest/pop_kid.c deleted file mode 100644 index e2d8d71..0000000 --- a/applications/PoP/roomtest/pop_kid.c +++ /dev/null @@ -1,470 +0,0 @@ -/* - * pop_kid.c — движок Kid (Фаза K1): порт seg006.c play_seq/load_frame + - * seqtbl-интерпретатор. Данные — kid_data.h. - */ -#include -#include -#include -#include -#include -#include -#include -#include "pop_kid.h" -#include "pop_sfx.h" /* звуковые эффекты: опкод SOUND в play_seq */ -#include "pop_trob.h" /* pop_start_chompers — смена ряда будит чомперы */ -#include "pop_guard.h" /* Guard/pop_gframe/CHARID_* — интерпретатор общий */ -#include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_map.h" /* pop_clip_char_top (clip_char) */ -#include "pop_geom.h" -#include "pop_level.h" /* POP_LEVEL_LAST — level 15 исключён */ -#include -#include -#include -#include "kid_data.h" -#include "_pop_kid.h" /* дескриптор страницы данных (её грузит банк 8) */ - -pop_char_t Kid; - -/* Флаг сотрясения (seg006 knock): ставится seqtbl-командой KNOCK_UP/DOWN - * в play_seq, потребляется pop_check_knock (pop_map) — трясёт loose-полы. */ -int8_t knock; - -/* Порт глобала next_level: seqtbl-команда END_LEVEL инкрементит его в конце - * seq_70 (подъём по лестнице за дверью уровня), а главный цикл сравнивает с - * текущим уровнем и грузит следующий. Счётчик, а не флаг — ровно как в - * оригинале, чтобы читы «следующий/предыдущий уровень» (levels_plan.md §4) - * легли сюда же без переделки. */ -uint8_t pop_next_level; - - -/* ---- Атласы Kid (прямая адресация image>>3) ------------------------ * - * НЕ static: набор спрайтов слота POP_CH_KID общей отрисовки персонажей - * (pop_cdraw.c, банк 4). Отдан как есть, а не через аксессор: читается раз - * в кадр из другого банка, и вызов стоил бы дороже самого чтения. */ -#define KID_MAXPAGES 28 -atlas_t kidp[KID_MAXPAGES]; -uint8_t kid_npages; - -/* Таблица «seq_id -> адрес в seqtbl» (original_seqtbl_offsets). Определена - * ЗДЕСЬ, а не в kid_data.h: заголовок включают почти все модули PoP, и - * `static const` в нём размножал таблицу мёртвой копией по каждому TU — - * 230 Б × 9 модулей, из них 460 Б в дефицитном резиденте W1/W2 (замер - * 2026-08-08). Наружу таблица не нужна: смену последовательности делают - * kid_set_seq / pop_char_set_seq. */ -static const uint16_t kid_seq_off[KID_NSEQ] = KID_SEQ_OFF_INIT; - -/* ---- Данные анимации в EMM-странице (kid.ani) ----------------------- * - * Таблица кадров (241*5 Б) и seqtbl (2310 Б) занимали 3.5 КБ в _CODE окна - * W1/W2 — самый дефицитный ресурс. Теперь они лежат в отдельной EMM- - * странице, которая маппится в W0 РОВНО на время play_seq (раз за тик), а - * весь остальной код читает cur_frame — 5-байтовую копию текущего кадра. - * Это ровно устройство оригинала: load_frame (seg006) заполняет cur_frame, - * и коллизия/отрисовка работают с ним, а не с таблицей. - * Страница адресуется как у pop_level: данные с 0x100, ниже — ISR-стаб. */ -/* Адрес кадра i в замапленной странице. Считаем В uint16_t и кастуем ОДИН - * раз: запись `(const uint8_t *)CONST + (uint16_t)i * 5u` SDCC 4.5 собирает - * НЕВЕРНО — умножение делает в 16 битах (add hl,hl / add hl,bc), а потом - * берёт только МЛАДШИЙ байт результата и подставляет старший байт константы - * (`ld c,l` / `inc b`). Для кадров i >= 52 (i*5 >= 256) адрес уезжает на - * −256*k, и cur_frame наполняется чужой строкой таблицы: у бега/шага/подъёма - * пропадал бит FRAME_NEEDS_FLOOR, и Kid проваливался сквозь пол. - * Артефакт: .sprinter-cc-roomtest/pop_kid.asm, функция load_frame. */ -static const uint8_t *kd_frame_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); /* i*5 = i + i*4, без умножения */ - off += (uint16_t)(KD_DATA_OFF + KID_BIN_FRAMES_OFF); - return (const uint8_t *)off; -} - -/* То же для таблицы кадров СТРАЖА (frame_tbl_guard дописана в ту же - * страницу данных, см. pop_extract_kid_data.py). */ -static const uint8_t *kd_gframe_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); - off += (uint16_t)(KD_DATA_OFF + KID_BIN_GFRAMES_OFF); - return (const uint8_t *)off; -} - -/* ...и для таблицы кадров КАТСЦЕН (frame_tbl_cuts): по ней ходят Princess и - * Vizier в сценах 8/9, финале и intro. Индекс — номер кадра как есть; какой - * набор спрайтов рисовать, говорит поле sword (>>6: 1 = PV1, 2 = PV2). */ -static const uint8_t *kd_cframe_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); - off += (uint16_t)(KD_DATA_OFF + KID_BIN_CFRAMES_OFF); - return (const uint8_t *)off; -} -#define KD_SEQ(cs) (*((const uint8_t *)(KD_DATA_OFF + KID_BIN_SEQTBL_OFF) + \ - (uint16_t)((cs) - SEQTBL_BASE))) -/* Байт seqtbl по адресу оригинала (база SEQTBL_BASE); ТОЛЬКО под замапленной - * страницей данных — то есть внутри play_seq. */ -#define SEQ(cs) KD_SEQ(cs) - -/* Страница данных анимации: заполняет ЗАГРУЗЧИК (pop_kboot.c, банк 8), - * читает интерпретатор здесь. Не static — контракт в _pop_kid.h. */ -uint8_t kdat_blk, kdat_page, kdat_ok; - -/* Текущий кадр (порт глобала cur_frame, seg006): 5 байт вместо таблицы. - * Заполняется load_frame для АКТИВНОГО персонажа (Char), поэтому на - * выходе из play_seq его надо сохранить в кэш своего персонажа: страж - * тикает ПОСЛЕ Кида, и без разделения отрисовка Кида взяла бы кадр стража. */ -static kframe cur_frame; -/* Кадр Кида для отрисовки — пара к pop_gframe соперника; читает общая - * отрисовка (pop_cdraw.c), поэтому не static. */ -kframe kid_frame; - -/* Char (seg006): АКТИВНЫЙ персонаж. Интерпретатор последовательностей в - * оригинале работает не с Kid и не с Guard, а с этой копией, а вокруг - * стоят loadkid/savekid и loadshad/saveshad (seg006:809..825). Копия, а - * не указатель, — и так же, как в оригинале, и быстрее на Z80: обращения - * в горячем цикле идут абсолютной адресацией глобала, а 16-байтовое - * копирование платится один раз на переключение персонажа. */ -pop_char_t Char; - -/* Opp (seg006): СОПЕРНИК активного персонажа — вторая копия, которую ставят - * рядом с Char (loadkid_and_opp / loadshad_and_opp, seg006:809). Через неё - * ИИ и боёвка меряют дистанцию (char_opp_dist), не зная, кто именно перед - * ними: для стража Opp = Kid, для Кида Opp = Guard. */ -pop_char_t Opp; - -void pop_loadkid(void) { Char = Kid; } -void pop_savekid(void) { Kid = Char; } -/* Выгрузка после control() — теперь ПОЛНАЯ, как savekid оригинала. - * - * Была выборочной (только curr_seq и sword) ровно потому, что pop_map правил - * геометрию ПРЯМО в Kid, мимо окна Char: полное копирование затирало его - * правки — Kid терял выравнивание x и ряд, и спуск с уступа через вис не - * срабатывал (персонаж просто приседал). Приходилось ещё и сравнивать - * последовательность со снимком на входе в окно, чтобы понять, чья правка - * свежее. С переводом физики на Char (GUARD-PHYS) диспетчер и pop_map - * пишут в одно и то же место, и разбирать это больше не нужно. */ -void pop_savekid_state(void) { Kid = Char; } -void pop_loadshad(void) { Char = Guard; } -void pop_saveshad(void) { Guard = Char; } -void pop_loadshad_and_opp(void) { Char = Guard; Opp = Kid; } -void pop_saveshad_and_opp(void) { Guard = Char; Kid = Opp; } -void pop_loadkid_and_opp(void) { Char = Kid; Opp = Guard; } -void pop_savekid_and_opp(void) { Kid = Char; Guard = Opp; } - -/* char_opp_dist (seg006:2135): >0 — соперник ПЕРЕД Char, <0 — за спиной. - * +13 при встречных направлениях: у стоящих лицом друг к другу «ноль» - * приходится на ширину тайла между ними. Живёт здесь, а не в guards.c, - * потому что нужен по обе стороны банковой границы — и ИИ, и диспетчеру - * боёвки (pop_ctrl). */ -int16_t pop_char_opp_dist(void) -{ - int16_t distance; - if (Char.room != Opp.room) return 999; - distance = (int16_t)Opp.x - (int16_t)Char.x; - if (Char.direction < 0) distance = -distance; - if (distance >= 0 && Char.direction != Opp.direction) distance += 13; - return distance; -} - -/* Прочитать кадр из ЛЮБОЙ таблицы страницы данных (у Kid и у стража они - * разные: KID_BIN_FRAMES_OFF / KID_BIN_GFRAMES_OFF). Сама маппит страницу, - * поэтому годится для вызова извне (pop_guard) — но НЕ в горячем цикле. */ -void pop_kid_data_frame(uint16_t tbl_off, uint8_t idx, uint8_t *out5) -{ - const uint8_t *f; - uint16_t off = (uint16_t)idx; - if (!kdat_ok) { out5[0] = 255; return; } - off += (uint16_t)(off << 2); /* idx*5, без умножения */ - off += (uint16_t)(KD_DATA_OFF + tbl_off); - gfx_w0_map(kdat_page); - f = (const uint8_t *)off; - out5[0] = f[0]; out5[1] = f[1]; out5[2] = f[2]; - out5[3] = f[3]; out5[4] = f[4]; - gfx_w0_unmap(); -} - -/* load_frame (seg006:0293): скопировать кадр Kid.frame из таблицы в - * cur_frame. Звать ТОЛЬКО когда страница данных замаплена в W0. */ -/* Какая ТАБЛИЦА КАДРОВ у персонажа (seg006:0293). Вынесено из load_frame - * отдельной функцией, потому что тот же вопрос решает ОТРИСОВКА: набор - * атласов обязан совпадать с таблицей, иначе image из таблицы Кида ищется - * среди спрайтов стража. Для тени это не теория — она ходит кадрами Кида - * (и рисуется его спрайтами), а дерётся кадрами стража. */ -uint8_t pop_frame_tbl_is_guard(int8_t charid, uint8_t frame) -{ - return (uint8_t)(charid == CHARID_2_GUARD || charid == CHARID_4_SKELETON || - (charid == CHARID_1_SHADOW && frame >= 150 && frame < 190)); -} - -static void load_frame(void) -{ - /* Таблица кадров зависит от персонажа (seg006:0293): у Kid своя, у - * стража frame_tbl_guard с индексом frame + add_frame − 149, где - * add_frame = 70 для кадров 102..106 (seg006:535). - * - * СКЕЛЕТ идёт по той же ветке, что страж (seg006:529 — общий case): у - * него свой атлас, но НУМЕРАЦИЯ кадров та же. Пока здесь стоял только - * charid_2_guard, скелет попадал в таблицу Кида, получал несуществующий - * image (180 при 28 спрайтах в наборе) и не рисовался вовсе. - * ТЕНЬ (charid_1_shadow) — по таблице стража ТОЛЬКО в кадрах 150..189, - * в остальных она ходит кадрами Кида (seg006:532). */ - const uint8_t *f; - uint8_t use_guard_tbl = pop_frame_tbl_is_guard(Char.charid, Char.frame); - f = 0; - if (Char.charid == CHARID_5_PRINCESS || Char.charid == CHARID_6_VIZIER) { - /* seg006:538 — у персонажей КАТСЦЕН своя таблица. */ - if (Char.frame < KID_NCFRAMES) f = kd_cframe_ptr(Char.frame); - } else if (use_guard_tbl) { - int16_t idx = (int16_t)Char.frame; - if (idx >= 102 && idx < 107) idx += 70; - idx -= 149; - if (idx >= 0 && idx < KID_NGFRAMES) f = kd_gframe_ptr((uint8_t)idx); - } else { - f = kd_frame_ptr(Char.frame); - } - if (f) { - cur_frame.image = f[0]; - cur_frame.dx = (int8_t)f[1]; - cur_frame.dy = (int8_t)f[2]; - cur_frame.flags = f[3]; - cur_frame.sword = f[4]; - } else { - /* Кадра нет в таблице — оригинал кладёт blank_frame {255,0,0,0,0} - * (get_frame_internal, seg006:507) и этим ГАСИТ отрисовку. Выход - * ОДИН на обе ветки: «пусто» обязано доехать и до кэша владельца - * (ниже), иначе kid_frame/pop_gframe держат ПРОШЛУЮ картинку и - * вместо «не рисовать» рисуется она — тот же класс, что - * BUG-SHADOW-STALE-FRAME (разбор в pop_char_draw). */ - cur_frame.image = 255; - cur_frame.dx = cur_frame.dy = 0; - cur_frame.flags = cur_frame.sword = 0; - } - /* Кэш кадра для ОТРИСОВКИ раскладываем ЗДЕСЬ, по charid активного - * персонажа, а не в save*-функциях. Раньше кэш писали pop_savekid/ - * pop_saveshad, и любое окно Char БЕЗ play_seq (окна боёвки - * check_sword_hurting / check_sword_hurt) записывало Киду кадр, который - * на самом деле принадлежал СТРАЖУ: отрисовка брала его image из атласа - * Кида и рисовал произвольную позу. Теперь владелец один — тот, для - * кого кадр реально загружен. */ - if (Char.charid == CHARID_0_KID) kid_frame = cur_frame; - else pop_gframe = cur_frame; -} - -static uint8_t char_dx_forward(int8_t dx) -{ - if (Char.direction < 0) dx = (int8_t)-dx; - return (uint8_t)(Char.x + dx); -} - -/* Аксессоры к текущему кадру (для pop_map): читают cur_frame, НЕ таблицу — - * их дёргают несколько раз за кадр, маппинг страницы тут недопустим. */ -int8_t kid_cur_dx(void) { return cur_frame.dx; } -int8_t kid_cur_dy(void) { return cur_frame.dy; } -uint8_t kid_cur_flags(void) { return cur_frame.flags; } - -/* seqtbl_offset_char: сменить последовательность Kid (единая точка — - * pop_ctrl/pop_map зовут ЕЁ, а не дублируют kid_seq_off/kid_seqtbl). */ -void kid_set_seq(uint8_t seq_id) { Kid.curr_seq = kid_seq_off[seq_id]; } - -/* То же для АКТИВНОГО персонажа — внутри окна Char (порт - * seqtbl_offset_char, seg006). Нужен стражу: его последовательность - * ставится, когда Char уже загружен из Guard. */ -void pop_char_set_seq(uint8_t seq_id) { Char.curr_seq = kid_seq_off[seq_id]; } - -/* play_seq (seg006.c:570): крутит опкоды до КАДРА (байт < 0xF0). - * Страница данных маппится в W0 на ВЕСЬ разбор — один map/unmap за вызов - * (в тике, до отрисовки: конфликта с атласом в W0 нет). В конце — - * load_frame: пока страница ещё замаплена, копируем кадр в cur_frame. */ -/* Отложенный start_chompers: взводится байткодом SEQ_UP/SEQ_DOWN, а - * исполняется после выхода из цикла (окно W0 уже свободно). */ -static uint8_t chomp_pending; - -void play_seq(void) -{ - if (!kdat_ok) return; - gfx_w0_map(kdat_page); - for (;;) { - uint8_t cmd = SEQ(Char.curr_seq); - Char.curr_seq++; - switch (cmd) { - case 0xFB: /* DX */ - Char.x = char_dx_forward((int8_t)SEQ(Char.curr_seq)); - Char.curr_seq++; - break; - case 0xFA: /* DY */ - Char.y = (uint8_t)(Char.y + (int8_t)SEQ(Char.curr_seq)); - Char.curr_seq++; - break; - case 0xFE: /* FLIP */ - Char.direction = (int8_t)~Char.direction; - break; - case 0xF7: /* JMP_IF_FEATHER (seg006:586): под зельем медленного - * падения — перейти по адресу (в seqtbl это ветки - * stepfloat/bumpfloat: «парящие» кадры падения и удара, - * без урона), иначе пропустить адрес и идти дальше. - * Эффект достаётся только Киду — как и сама физика пера - * (fall_accel, pop_map.c). */ - if (!pop_feather || Char.charid != CHARID_0_KID) { - Char.curr_seq += 2; - break; - } - /* иначе — ПРОВАЛ в JMP ниже: адрес лежит ровно там же */ - /* fallthrough */ - case 0xFF: { /* JMP */ - uint16_t a = (uint16_t)(SEQ(Char.curr_seq) | - ((uint16_t)SEQ((uint16_t)(Char.curr_seq + 1)) << 8)); - Char.curr_seq = a; - break; - } - case 0xFD: /* UP */ - Char.curr_row--; - chomp_pending = 1; /* start_chompers — ПОСЛЕ цикла, см. ниже */ - break; - case 0xFC: /* DOWN */ - Char.curr_row++; - chomp_pending = 1; - break; - case 0xF9: /* ACTION */ - Char.action = SEQ(Char.curr_seq); - Char.curr_seq++; - break; - case 0xF8: /* SET_FALL */ - Char.fall_x = (int8_t)SEQ(Char.curr_seq); Char.curr_seq++; - Char.fall_y = (int8_t)SEQ(Char.curr_seq); Char.curr_seq++; - break; - case 0xF5: /* KNOCK_UP: сотрясение трясёт loose РЯДОМ ВЫШЕ (check_knock) */ - knock = 1; - break; - case 0xF4: /* KNOCK_DOWN: приземление трясёт loose В СВОЁМ РЯДУ */ - knock = -1; - break; - case 0xF2: /* SOUND (seg006:0627). Аргумент — НЕ номер звука игры, а - * одно из пяти событий; отображение взято оттуда же: - * 0 SILENT — не звучит, но стражи Кида ЗАМЕЧАЮТ - * (стоит, например, в seq доставания меча); - * 1 FOOTSTEP — звук 23, и шум; - * 2 BUMP — звук 8, и шум; - * 3 DRINK — звук 18, не шум; - * 4 LEVEL — МУЗЫКА конца уровня (32 на 4-м, иначе 41, - * на 13/15 молчок). - * Второй смысл опкода («Кид нашумел») терять нельзя даже - * без звука, см. BUG-GUARD-DEAF-1. */ - { - uint8_t ev = SEQ(Char.curr_seq); - Char.curr_seq++; - if (ev < 3) is_guard_notice = 1; - if (ev == 1) pop_sfx_play(23); - else if (ev == 2) pop_sfx_play(8); - else if (ev == 3) pop_sfx_play(18); - else if (ev == 4) { - /* seg006:646. На четвёртом уровне уход за дверь — это - * встреча с тенью, и трек там свой; на 13-м (Джафар) и - * 15-м оригинал молчит. */ - if (pop_current_level == 4) pop_sfx_play(32); - else if (pop_current_level != 13) pop_sfx_play(41); - } - } - break; - case 0xF1: /* END_LEVEL: seq_70 доиграл — уровень пройден. - * До 13-го это тот же `++next_level`, что в оригинале. - * Level 15/copy protection вырезан: 14-й позже передаст - * управление ENDING (FG11), но уже сейчас не может - * породить запрос res2015.bin. */ - if (pop_next_level < POP_LEVEL_LAST) pop_next_level++; - break; - case 0xF3: /* GET_ITEM: аргумент 1 — применить эффект предмета - * (порт play_seq -> proc_get_object, seg006) */ - if (SEQ(Char.curr_seq) == 1) - pop_proc_get_object(); - Char.curr_seq++; - break; - case 0xF6: /* DIE nop */ - break; - default: /* КАДР */ - Char.frame = cmd; - load_frame(); /* cur_frame := таблица[frame] (страница ещё в W0) */ - gfx_w0_unmap(); - /* start_chompers (seg006:0603/0607) — ТОЛЬКО здесь, после - * размаппинга. В оригинале он зовётся прямо из SEQ_UP/SEQ_DOWN, - * но у нас seqtbl читается ЧЕРЕЗ ОКНО W0, а start_chompers лезет - * за тайлами уровня и это окно перемапливает и закрывает — цикл - * дальше исполнял бы мусор вместо байткода. Наступили на это - * 2026-08-08: после спуска Кид проваливался сквозь пол. */ - if (chomp_pending) { - chomp_pending = 0; - pop_start_chompers(Char.room, Char.curr_row); - } - return; - } - } -} - -/* load_fram_det_col (seg006:0144) = load_frame() + determine_col(). - * - * Зачем это отдельной публичной точкой. cur_frame — ОДИН глобал на всех - * персонажей (так и в оригинале), и его владелец — тот, кто последним - * прошёл load_frame. В кадре последним тикает страж, поэтому к моменту - * управления Кидом в cur_frame лежит кадр СТРАЖА. А через cur_frame - * считается вся геометрия: dx_weight -> determine_col -> - * distance_to_edge_weight -> get_edge_distance, то есть буквально выбор - * ветки в check_jump_up. - * - * Оригинал от этого страхуется явно: play_kid_frame (seg000:1209) и - * play_guard_frame (seg000:1246) сразу после loadkid/loadshad зовут - * load_fram_det_col() — ДО control(). У нас этого не было, и Кид считал - * свой прыжок по кадру стража (BUG-CTRL-FRAME-1): при distance 2 вместо 10 - * check_jump_up уходил в «пустой прыжок вверх» вместо «шаг назад и - * зацеп». Результат менялся от кадра к кадру — вместе с анимацией стража. - * - * determine_col теперь общий: pop_map работает с Char, поэтому колонка - * пересчитывается ЛЮБОМУ активному персонажу — ровно как load_fram_det_col - * в оригинале. Раньше вторая половина связки работала только на ветке Кида - * (стражу колонку вёл pop_guard_enter/leave) — прямое следствие того, что - * физика знала один Kid. */ -void pop_load_frame(void) -{ - if (!kdat_ok) return; - gfx_w0_map(kdat_page); - load_frame(); - gfx_w0_unmap(); -} - -void pop_load_fram_det_col(void) -{ - pop_load_frame(); - pop_determine_col(); -} - -/* Прокрутить последовательность КОНКРЕТНОГО персонажа (порт связки - * loadkid/play_seq/savekid, seg006). Звать вместо голого play_seq: тот - * работает с Char и сам по себе не знает, чей это персонаж. */ -void pop_kid_play(void) { pop_loadkid(); play_seq(); pop_savekid(); } -void pop_guard_play(void) { pop_loadshad(); play_seq(); pop_saveshad(); } - -void kid_init(uint8_t seq_id, int8_t col, int8_t row, int8_t dir) -{ - Kid.curr_col = col; - Kid.curr_row = row; - Kid.direction = dir; - Kid.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Kid.y = (uint8_t)pop_y_land[row + 1]; - Kid.fall_x = Kid.fall_y = 0; - Kid.repeat = 0; - Kid.charid = 0; /* charid_0_kid: своя таблица кадров */ - Kid.alive = -1; /* в оригинале ЖИВОЙ = alive < 0 */ - Kid.curr_seq = kid_seq_off[seq_id]; - pop_kid_play(); /* до первого кадра */ -} - -void kid_tick(void) -{ - pop_kid_play(); -} - -/* Отрисовка кадра (load_frame_to_obj, heal, клип, брызги, клинок) живёт в - * pop_cdraw.c — ОДНА на всех Char, см. DRAW-CHAR. Отсюда она получает - * атласы Кида (kidp/kid_npages) и его кадр (kid_frame). */ - -/* Таблица кадров (241*5 Б) и seqtbl (2310 Б) занимали 3.5 КБ в _CODE окна - * W1/W2 — самый дефицитный ресурс. Теперь они лежат в отдельной EMM- - * странице, которая маппится в W0 РОВНО на время play_seq (раз за тик). - * Страница адресуется как у pop_level: данные с 0x100, ниже — ISR-стаб. */ diff --git a/applications/PoP/roomtest/pop_kid.h b/applications/PoP/roomtest/pop_kid.h deleted file mode 100644 index 0578d87..0000000 --- a/applications/PoP/roomtest/pop_kid.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * pop_kid.h — движок анимации/движения Kid (Фаза K1): интерпретатор - * seqtbl (play_seq) + frame_table. Порт SDLPoP seg006.c. Данные — - * kid_data.h (pop_extract_kid_data.py). - * - * K1: только проигрывание последовательностей кадров с авторскими - * смещениями (движение = SEQ_DX/DY + frame.dx/dy). Управление (K2) и - * коллизия карты (K3) — отдельно. - */ -#ifndef POP_KID_H -#define POP_KID_H - -#include -#include "pop_char.h" -#include "kid_data.h" /* kframe — тип кадра для pop_sword_draw */ -#include /* atlas_t — набор спрайтов Кида (см. kidp ниже) */ - -/* Состояние персонажа — общий тип для Кида, стража и Char (pop_char.h). */ -extern pop_char_t Kid; - -/* Флаг сотрясения (seg006 knock): +1 = KNOCK_UP (ряд выше), -1 = KNOCK_DOWN - * (свой ряд). Ставит play_seq, читает/сбрасывает pop_check_knock. */ -extern int8_t knock; - -/* Порт next_level (seg000): END_LEVEL в play_seq инкрементит — «уровень - * пройден». Читает и обнуляет главный цикл. Пока уровень один, поэтому - * там рестарт того же уровня; загрузка следующего — levels_plan.md. */ -extern uint8_t pop_next_level; - -/* Загрузить npages атласов Kid (kid0..kid{npages-1}.atl). ДО initgraph. - * 0 — OK, -1 — ошибка. */ -int pop_kid_load(uint8_t npages) __banked; - -/* Данные анимации (таблица кадров + seqtbl) — отдельная EMM-страница - * (kid.ani): в _CODE окна W1/W2 они занимали 3.5 КБ. Грузить ДО - * первого kid_init/play_seq. 0 — OK, -1 — ошибка (без них Kid не оживёт). - * Страница маппится в W0 внутри play_seq, раз за тик. */ -int pop_kid_data_load(const char *path) __banked; - -/* Прочитать кадр из таблицы страницы данных: tbl_off — KID_BIN_FRAMES_OFF - * (Kid) или KID_BIN_GFRAMES_OFF (страж, своя таблица frame_tbl_guard). - * Маппит страницу сама; для горячего цикла есть cur_frame. */ -void pop_kid_data_frame(uint16_t tbl_off, uint8_t idx, uint8_t *out5); -void pop_kid_data_free(void) __banked; - -/* Атлас chtab_0 «меч в руке» (sword.atl) — спрайт клинка поверх Kid в кадрах - * подъёма меча/убирания в ножны (add_sword_to_objtable, seg006:1798). - * Грузить ДО initgraph, как и страницы Kid. 0 — OK, -1 — ошибка (тогда - * кадры рисуются без клинка). */ -/* Зеркальная (вертикально) страница меча — для зелья инверсии. */ -int pop_sword_take(const atlas_t *a) __banked; -int pop_sword_vflip_take(const atlas_t *m) __banked; -void pop_kid_free(void) __banked; - -/* Сама отрисовка клинка (pop_sword_draw) и блит спрайта chtab_2 по id - * (pop_kid_img_blit) переехали в pop_kdraw.c — БАНК 4, к единственному - * вызывающему (pop_cdraw.c). Их объявления — в _pop_kdraw.h. */ - -/* Инициализировать Kid: последовательность seq_id, клетка col/row, - * направление dir (-1/0). Ставит x/y по x_bump/y_land. */ -void kid_init(uint8_t seq_id, int8_t col, int8_t row, int8_t dir); - -/* Один логический тик: play_seq() — продвинуть последовательность до - * следующего кадра (применить SEQ_DX/DY/ACTION/...). */ -void kid_tick(void); - -/* play_seq напрямую (для pop_map start_fall — переход в fall-seq в тот же - * physics-шаг, как оригинал). */ -void play_seq(void); /* работает с Char — см. pop_kid_play ниже */ - -/* Активный персонаж (порт Char, seg006) и его загрузка/выгрузка. - * Интерпретатор последовательностей общий для Kid и стража: у них общая - * seqtbl, но РАЗНЫЕ таблицы кадров (load_frame выбирает по Char.charid). */ -extern pop_char_t Char; -/* Соперник активного персонажа (порт Opp): ставится вместе с Char через - * pop_loadshad_and_opp. Читают ИИ стража и боёвка (char_opp_dist). */ -extern pop_char_t Opp; -void pop_loadkid(void); -void pop_savekid(void); -void pop_savekid_state(void); /* Kid = Char, кадр не трогаем */ -void pop_loadshad(void); -void pop_saveshad(void); -void pop_loadshad_and_opp(void); /* Char = Guard, Opp = Kid (seg006:841) */ -void pop_saveshad_and_opp(void); /* Guard = Char, Kid = Opp */ -void pop_loadkid_and_opp(void); /* Char = Kid, Opp = Guard */ -void pop_savekid_and_opp(void); /* Kid = Char, Guard = Opp */ - -/* Дистанция до соперника в системе Char: >0 впереди, <0 за спиной, - * 999 — разные комнаты (порт char_opp_dist, seg006:2135). */ -int16_t pop_char_opp_dist(void); - -/* Прокрутить последовательность персонажа целиком (load + play_seq + - * save). Звать вместо голого play_seq. */ -void pop_char_set_seq(uint8_t seq_id); /* seq активного персонажа */ -void pop_kid_play(void); -void pop_guard_play(void); - -/* load_fram_det_col (seg006:0144) — перезагрузить cur_frame под АКТИВНОГО - * персонажа (Char) и пересчитать его колонку. Звать сразу после pop_loadkid/ - * pop_loadshad и ДО диспетчера control(), как это делают play_kid_frame / - * play_guard_frame (seg000:1209/1246): cur_frame один на всех, и без этого - * геометрия одного персонажа считается по кадру другого. */ -void pop_load_fram_det_col(void); -/* Только load_frame (seg006:0293), БЕЗ determine_col. Нужен там, где - * оригинал зовёт голый load_frame и пересчёт колонки по x был бы вреден — - * например в jump_through_mirror, где ось отражения берётся из curr_col. */ -void pop_load_frame(void); - -/* Какая таблица кадров у персонажа (seg006:0293): 1 — стража, 0 — Кида. - * Нужна не только load_frame, но и отрисовке — набор атласов обязан - * совпадать с таблицей (тень ходит кадрами и спрайтами КИДА, а дерётся - * кадрами стража). */ -uint8_t pop_frame_tbl_is_guard(int8_t charid, uint8_t frame); - -/* Поля текущего кадра kid_frames[Kid.frame] (pop_map, без дублирования - * таблицы во втором TU). */ -int8_t kid_cur_dx(void); -int8_t kid_cur_dy(void); -uint8_t kid_cur_flags(void); - -/* Сменить последовательность (Kid.curr_seq = kid_seq_off[seq_id]) — единая - * точка для pop_ctrl/pop_map (иначе каждый дублировал бы kid_seqtbl ~2.3КБ). */ -void kid_set_seq(uint8_t seq_id); - -/* Атласы Кида (chtab_2) и его текущий кадр — набор слота POP_CH_KID общей - * отрисовки персонажей (pop_cdraw.c). Наружу отданы как данные, а не через - * аксессоры: читаются раз в кадр из другого банка, где вызов стоил бы - * дороже самого чтения (данные в _DATA видны всем без трамплина). */ -extern atlas_t kidp[]; -extern uint8_t kid_npages; -extern kframe kid_frame; - -#endif diff --git a/applications/PoP/roomtest/pop_level.c b/applications/PoP/roomtest/pop_level.c deleted file mode 100644 index 4edd4f4..0000000 --- a/applications/PoP/roomtest/pop_level.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * pop_level.c — ГОРЯЧАЯ половина уровня: доступ к уже загруженным данным. - * См. pop_level.h (публичный API) и _pop_level.h (деление половин). - * - * Здесь живёт то, что зовут на каждый тайл и из любого банка: чтение - * foretable/backtable, дверные связи, живое состояние стражей. Загрузка - * файла, разбор комнаты и рестарт уровня — в pop_level_cold.c (банк 8): - * они отрабатывают раз на уровень/комнату, и в дефицитном W1 им не место. - * - * Общее состояние (страница, дверные таблицы, стражи) определено ЗДЕСЬ и - * объявлено в _pop_level.h — данные банковых модулей всё равно линкуются в - * общий _DATA, так что холодная половина видит их напрямую. - */ -#include -#include -#include -#include -#include /* gfx_w0_map / gfx_w0_unmap */ - -#include "pop_level.h" -#include "_pop_level.h" - -uint8_t pop_lvl_blk, pop_lvl_page, pop_lvl_ok; -/* Копии таблиц дверных связей в W2 (LINKMAP мутабельна — таймеры кнопок). */ -uint8_t pop_dl1[256], pop_dl2[256]; -/* Живое состояние стражей: в оригинале массивы стражей — часть структуры - * уровня в ОЗУ, и движок их ПЕРЕПИСЫВАЕТ (leave_guard кладёт туда позицию/ - * направление/мастерство, а у мёртвого ещё и curr_seq), благодаря чему, - * вернувшись, находишь труп там же. У нас уровень лежит в EMM-странице - * только на чтение, поэтому держим мутабельную копию в W2: 6 байт/комнату. */ -uint8_t pop_gstate[24 * 6]; - -uint8_t pop_current_level; - -/* set_tile-запись в ЖИВУЮ foretable уровня (порт curr_room_tiles[…] = …). - * В оригинале уровень — обычная структура в ОЗУ, и do_pickup (seg006:1671), - * remove_loose (seg007:0EB8), loose_land (seg007:11E8) правят её насовсем. - * У нас уровень в EMM-странице — пишем прямо туда, поэтому изменение - * переживает выход из комнаты (BUG-LVLSTATE-1). Пишем БАЙТ ЦЕЛИКОМ: - * старшие биты старого тайла (напр. 0x20 «solid loose») к новому типу - * отношения не имеют. */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile) -{ - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return; - gfx_w0_map(pop_lvl_page); - ((uint8_t *)(LVL_DATA_OFF + BP_FG))[(uint16_t)(room - 1) * ROOM_TILES + tilepos] - = tile; - gfx_w0_unmap(); -} - -uint8_t pop_doorlink1(uint8_t i) { return pop_dl1[i]; } -uint8_t pop_doorlink2(uint8_t i) { return pop_dl2[i]; } -void pop_doorlink2_set(uint8_t i, uint8_t v) { pop_dl2[i] = v; } - -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos) -{ - uint8_t v; - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return 0; - gfx_w0_map(pop_lvl_page); - v = (uint8_t)(room_fg_ptr(room)[tilepos] & 0x1F); - gfx_w0_unmap(); - return v; -} - -/* Батч-доступ: смаппить страницу уровня в W0 ОДИН раз, прочитать много - * тайлов через pop_level_tile_raw, размаппить один раз. Экономит N свапов - * окна 0 в горячих циклах (pop_process_trobs звал pop_level_tile на каждый - * trob каждый кадр). Между begin/end НЕЛЬЗЯ рисовать/звать код, которому - * нужно окно 0 в исходном состоянии — только сырые чтения уровня. */ -void pop_level_access_begin(void) { if (pop_lvl_ok) gfx_w0_map(pop_lvl_page); } -void pop_level_access_end(void) { if (pop_lvl_ok) gfx_w0_unmap(); } - -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos) -{ - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return 0; - return (uint8_t)(room_fg_ptr(room)[tilepos] & 0x1F); -} - -void pop_level_room_bg(uint8_t room, uint8_t *out30) -{ - const uint8_t *rbg; - uint8_t i; - if (!out30) return; - if (!pop_lvl_ok || room < 1 || room > 24) { - for (i = 0; i < ROOM_TILES; i++) out30[i] = 0; - return; - } - gfx_w0_map(pop_lvl_page); - rbg = room_bg_ptr(room); - for (i = 0; i < ROOM_TILES; i++) out30[i] = rbg[i]; - gfx_w0_unmap(); -} - -uint8_t pop_room_link(uint8_t room, uint8_t side) -{ - uint8_t v; - if (!pop_lvl_ok || room < 1 || room > 24 || side > 3) return 0; - gfx_w0_map(pop_lvl_page); - v = ((const uint8_t *)(LVL_DATA_OFF + BP_LINKS))[(uint16_t)(room - 1) * 4 + side]; - gfx_w0_unmap(); - return v; -} - -/* leave_guard (seg002:02F5): запомнить состояние стража комнаты. seq - * сохраняем ТОЛЬКО у мёртвого — у живого seq_hi = 0 означает «поднять - * стандартной стойкой», как в оригинале. */ -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead) -{ - uint8_t *g; - if (room < 1 || room > 24) return; - g = pop_gstate + (uint16_t)(room - 1) * 6; - g[GS_TILE] = tile; - g[GS_DIR] = (uint8_t)dir; - g[GS_X] = x; - g[GS_SKILL] = skill; - if (dead) { g[GS_SEQL] = (uint8_t)seq; g[GS_SEQH] = (uint8_t)(seq >> 8); } - else { g[GS_SEQH] = 0; } -} - -uint16_t pop_guard_state_seq(uint8_t room) -{ - const uint8_t *g; - if (room < 1 || room > 24) return 0; - g = pop_gstate + (uint16_t)(room - 1) * 6; - if (g[GS_SEQH] == 0) return 0; /* живой — стандартная стойка */ - return (uint16_t)(g[GS_SEQL] | ((uint16_t)g[GS_SEQH] << 8)); -} - -/* Запомненная X стража комнаты (для трупа: он лежит там, где лёг, а не в - * центре тайла). */ -uint8_t pop_guard_state_x(uint8_t room) -{ - if (room < 1 || room > 24) return 0; - return pop_gstate[(uint16_t)(room - 1) * 6 + GS_X]; -} diff --git a/applications/PoP/roomtest/pop_level.h b/applications/PoP/roomtest/pop_level.h deleted file mode 100644 index 5c359c9..0000000 --- a/applications/PoP/roomtest/pop_level.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * pop_level.h — данные уровня PoP из сырого файла res200N.bin (Фаза L1). - * - * Уровень загружается ОДИН раз в отдельную EMM-страницу (как атласы: - * данные с offset 0x100, ISR-стаб в первых байтах — страница безопасна - * для маппинга в W0). Файл — сырой blueprnt DAT 1.0 (2305 байт, БЕЗ - * checksum-байта; Table 6 спецификации POP-DAT): - * foretable(fg) @0 backtable(bg) @720 door I/II @1440/1696 - * links @1952 (24×{L,R,U,D}) start @2112 ... - * Тайл-код = байт fg & 0x1F (верхние биты — модификатор, пока не нужны); - * bg передаётся как есть. См. applications/PoP/docs/POP-DAT-* . - * - * Рабочая копия ТЕКУЩЕЙ комнаты живёт в обычной памяти (W2) у приложения - * (мутабельная — loose→empty); pop_room_load извлекает её из страницы + - * тонкие срезы соседей для кромок (правый столбец left-комнаты, верхний - * ряд down-комнаты). Страница маппится в W0 только на время извлечения. - */ -#ifndef POP_LEVEL_H -#define POP_LEVEL_H - -#include "pop_qsave.h" - -#include - -/* Загрузить уровень из файла в EMM-страницу. 0 — OK, -1 — ошибка - * (open/alloc/размер). Звать ПОСЛЕ первого atlas_load (pop_bg_load) — - * он снимает страницу ядра DSS для W0-unmap. */ -/* pop_level_load — внутренняя для pop_level_cold.c (грузим по НОМЕРУ) */ -void pop_level_free(void) __banked; - -/* ---- Номер уровня и потабличные различия (levels_plan.md §1) -------- */ - -/* Единый допустимый диапазон ресурсов. 0 зарезервирован под demo (FG7), - * 1..14 — настоящая игра; level 15/copy protection намеренно отсутствует. - * Эти границы используют загрузчик, QuickLoad и отладочная навигация, чтобы - * ни один путь не мог запросить несуществующий res2015.bin. */ -#define POP_LEVEL_DEMO 0 -#define POP_LEVEL_FIRST 1 -#define POP_LEVEL_LAST 14 - -/* Порт current_level (seg000 load_lev_spr: current_level = next_level = - * level). Читают потабличные функции ниже, стражи (HP/тип) и стартовая - * логика. */ -extern uint8_t pop_current_level; -void pop_level_qsave(pop_qs_io_t *io); - -/* Загрузить уровень НОМЕРОМ: освободить страницу прошлого, взять - * `LEVELS\res20NN.bin` (fallback `a:\res20NN.bin`) и выставить - * pop_current_level. 0 — OK, -1 — файла нет / не влез (тогда - * pop_current_level и страница НЕ тронуты — играем дальше на старом). - * Порт связки load_lev_spr + load_level (seg000:1098/1169). */ -int pop_level_load_num(uint8_t n) __banked; - -/* tbl_entry_pose (data.h:848): 1 — падение внутрь (ур. 1), 2 — вбегание - * (ур. 13), 0 — разворот на месте. Индекс — номер уровня. */ -uint8_t pop_level_entry_pose(uint8_t n) __banked; - -/* tbl_guard_hp (data.h:846) — база HP стража на уровне (get_guard_hp, - * seg002:0044: extrastrength[skill] + tbl_guard_hp[level]). */ -uint8_t pop_level_guard_hp(uint8_t n) __banked; - -/* tbl_guard_type (data.h:844): 0 обычный, 1 толстый, 2 скелет, 3 визирь, - * 4 тень, −1 — стражей на уровне НЕТ (уровень 14). */ -int8_t pop_level_guard_type(uint8_t n) __banked; - -/* tbl_level_type (data.h:840): 0 = dungeon, 1 = palace. Пока читается - * только для контроля — второй тайлсет это levels_plan.md §3. */ -uint8_t pop_level_tileset(uint8_t n) __banked; - -/* Извлечь комнату room (1..24) в массивы приложения (W2): - * fg[30], bg[30] — тайлы комнаты (fg маскирован &0x1F, bg raw); - * lcol_fg[6], lcol_bg[3] — [0..2] правый столбец (col9) комнаты СЛЕВА - * (кромка col0), [3..5] предпоследний (col8) — - * для коллизии на колонке −2 (Kid стоит В шве); - * rcol_fg[6] симметрично (col0 / col1); - * нет комнаты → стена/0; - * below_fg[11] — [0..9] верхний ряд (row0) комнаты СНИЗУ, - * [10] тайл (0,9) комнаты СНИЗУ-СЛЕВА («стена - * вниз»); нет комнаты → стена. - * 0 — OK, -1 — уровень не загружен / room вне диапазона. */ -int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg, - uint8_t *lcol_fg, uint8_t *lcol_bg, - uint8_t *rcol_fg, uint8_t *rcol_bg, uint8_t *below_fg) __banked; - -/* Связь комнаты по стороне (0=L,1=R,2=U,3=D) → номер соседней (1..24) или - * 0, если стороны нет. Для переходов между комнатами (L2/L3). */ -uint8_t pop_room_link(uint8_t room, uint8_t side); - -/* Тайл-код (fg & 0x1F) по комнате (1..24) и позиции tilepos (0..29, - * row*10+col); вне диапазона → 0 (empty). Для trob-диспетчера (pop_trob): - * тип анимируемого тайла в ЛЮБОЙ комнате, не только текущей. */ -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos); - -/* Записать тайл в ЖИВУЮ foretable уровня (порт curr_room_tiles[tp] = tile: - * do_pickup / remove_loose / loose_land). Изменение персистентно — уровень - * лежит в ОЗУ-странице, а не в ПЗУ, — то есть переживает выход из комнаты, - * как в оригинале. Отменяется только pop_level_reset_tiles. */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile); - -/* Рестарт уровня: вернуть ВСЕ тайлы в исходное (порт load_level, который - * play_level зовёт на каждой итерации — в т.ч. после смерти Кида). */ -void pop_level_reset_tiles(void) __banked; - -/* Рестарт уровня: вернуть ВСЕХ стражей (тот же load_level + pos_guards). - * Убитый страж после respawn снова жив — как в оригинале. */ -void pop_level_reset_guards(void) __banked; - -/* Батч-доступ к странице уровня (один map/unmap окна 0 на много чтений). - * Между begin/end — только pop_level_tile_raw, без рисования. */ -void pop_level_access_begin(void); -void pop_level_access_end(void); -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos); - -/* Скопировать backtable (модификаторы) комнаты room в out[30]. Исходное - * состояние per-room modifier (openness ворот, состояние пик и т.п.) для - * ленивой инициализации room_modif в pop_trob. Вне диапазона → нули. */ -void pop_level_room_bg(uint8_t room, uint8_t *out30); - -/* Таблицы связей дверей (LINKLOC@1440 / LINKMAP@1696, по 256 Б). Копируются - * в W2-RAM при загрузке (LINKMAP мутабельна — таймеры кнопок). i — индекс - * цепочки (модификатор кнопки). Декод — в pop_trob (get_doorlink_*). */ -uint8_t pop_doorlink1(uint8_t i); -uint8_t pop_doorlink2(uint8_t i); -void pop_doorlink2_set(uint8_t i, uint8_t v); - -/* Ряд приземления падающего loose-куска в колонке col комнаты room: первый - * НЕ-пустой тайл сверху вниз; возвращает его ряд, если это floor (→ debris), - * иначе -1 (пролетел/крушение о стену). */ -int8_t pop_room_col_landing(uint8_t room, uint8_t col) __banked; - -/* Стартовая позиция уровня (блок @2112): комната / поза / направление. */ -/* Страж комнаты: 1 = есть (заполнит tile/dir/color/skill), 0 = нет. - * Порт enter_guard (seg002:0112). */ -/* leave_guard (seg002:02F5): запомнить состояние стража комнаты в ЖИВОЙ - * копии массивов уровня. dead != 0 — сохранить и последовательность, тогда - * при возврате в комнату страж поднимется трупом там же, где лёг. - * tile == 30 (или больше) — «стража в комнате больше нет». */ -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead); - -/* Последовательность запомненного стража (0 — поднимать стандартной - * стойкой, как у живого). */ -uint16_t pop_guard_state_seq(uint8_t room); -uint8_t pop_guard_state_x(uint8_t room); - -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked; - -/* tbl_level_type (SDLPoP data.h:840) — какой тайлсет у уровня: - * 0 подземелье, 1 дворец. Дворцовые: 4, 5, 6, 10, 11, 14. Индекс — - * НОМЕР уровня; элемент 0 — демо-уровень. Оригинал по нему выбирает и - * .DAT окружения (tbl_envir_ki, seg000:1108), и десяток веток отрисовки - * в seg008, и графику стража (GUARD1/GUARD2). */ -uint8_t pop_level_type(void) __banked; - -uint8_t pop_level_start_room(void) __banked; -uint8_t pop_level_start_pos(void) __banked; -int8_t pop_level_start_dir(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_level_cold.c b/applications/PoP/roomtest/pop_level_cold.c deleted file mode 100644 index 5ba3b67..0000000 --- a/applications/PoP/roomtest/pop_level_cold.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * pop_level_cold.c — ХОЛОДНАЯ половина уровня (БАНК 8). Контракт и деление - * половин — в _pop_level.h. - * - * Здесь всё, что отрабатывает раз на уровень (чтение файла res200N.bin, - * рестарт тайлов/стражей, потабличные различия) или раз на комнату (разбор - * комнаты в рабочие массивы, посадочный ряд колонки, страж комнаты). Цена - * выноса — один трамплин на вызов; в кадре этих вызовов ноль. - * - * Формат — порт blueprnt DAT 1.0 (Table 6 POP-DAT). - */ -#include -#include -#include -#include -#include /* gfx_w0_map / gfx_w0_unmap */ -#include "pop_level.h" -#include "_pop_level.h" -#include "pop_geom.h" /* pop_x_bump / FIRST_ONSCREEN_COLUMN — pos_guards */ - -/* Низкоуровневое чтение через W3 выполняет резидентный bank_load_file(); - * остальная одноразовая подготовка уровня безопасно остаётся в банке 8. */ - -void pop_level_free(void) __banked -{ - if (pop_lvl_ok) { mem_free_block(pop_lvl_blk); pop_lvl_ok = 0; } -} - -/* ---- Потабличные различия уровней ------------------------------------ */ - -/* Таблицы из SDLPoP data.h:840..848, индекс = номер уровня (0 = demo). - * Хвоста level 15 здесь намеренно нет: настоящий маршрут заканчивается 14. - * Так диапазон данных и диапазон загрузчика не могут разъехаться. */ -static const uint8_t tbl_entry_pose[POP_LEVEL_LAST + 1] = - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }; -static const uint8_t tbl_guard_hp[POP_LEVEL_LAST + 1] = - { 4, 3, 3, 3, 3, 4, 5, 4, 4, 5, 5, 5, 4, 6, 0 }; -static const int8_t tbl_guard_type[POP_LEVEL_LAST + 1] = - { 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 4, 3, -1 }; -/* tbl_level_type (SDLPoP data.h:840): 0 — подземелье, 1 — дворец. По нему - * расходятся не только атласы, но и ветки отрисовки (seg008), кладка стены - * (wall_pattern) и модификатор пустой клетки от упавшей плиты - * (remove_loose, seg007:0EB8). */ -static const uint8_t tbl_level_type[POP_LEVEL_LAST + 1] = - { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1 }; - -uint8_t pop_level_entry_pose(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_entry_pose[n] : 0; } -uint8_t pop_level_guard_hp(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_guard_hp[n] : 3; } -int8_t pop_level_guard_type(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_guard_type[n] : -1; } -uint8_t pop_level_tileset(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_level_type[n] : 0; } -uint8_t pop_level_type(void) __banked { return pop_level_tileset(pop_current_level); } - -static int level_read_file(const char *path) -{ - uint8_t blk, page; - uint16_t i; - int n; - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - n=bank_load_file(page,LVL_DATA_OFF,path,16384-LVL_DATA_OFF); - if (n < (int)MIN_SIZE) { mem_free_block(blk); return -1; } - gfx_w0_page_prepare(page); - gfx_w0_map(page); - for (i=0; i<256; i++) { - pop_dl1[i]=((const uint8_t *)LVL_DATA_OFF)[BP_LINKLOC+i]; - pop_dl2[i]=((const uint8_t *)LVL_DATA_OFF)[BP_LINKMAP+i]; - } - for (i=0; i<24u*ROOM_TILES; i++) - ((uint8_t *)LVL_PRISTINE_OFF)[i]= - ((const uint8_t *)(LVL_DATA_OFF+BP_FG))[i]; - gfx_w0_unmap(); - pop_lvl_blk=blk; pop_lvl_page=page; pop_lvl_ok=1; - pop_gstate_init(); - return 0; -} - -int pop_level_load_num(uint8_t n) __banked -{ - /* Имена патчим на месте, а не через sprintf: printf-семейство тянет в - * резидент W1 форматтер, которого здесь больше негде применить. */ - static char pri[] = "LEVELS\\res2000.bin"; /* цифры — [12],[13] */ - static char alt[] = "a:\\res2000.bin"; /* цифры — [8],[9] */ - uint8_t saved_blk = pop_lvl_blk, saved_page = pop_lvl_page, saved_ok = pop_lvl_ok; - - if (n > POP_LEVEL_LAST) return -1; - pri[12] = alt[8] = (char)('0' + n / 10); - pri[13] = alt[9] = (char)('0' + n % 10); - - /* Старую страницу отпускаем ТОЛЬКО после успешной загрузки новой: - * level_read_file сам аллоцирует страницу, и если файла нет — остаёмся - * на текущем уровне вместо падения в пустой уровень. */ - pop_lvl_ok = 0; /* чтобы level_load_path не мешался */ - if (level_read_file(pri) != 0 && level_read_file(alt) != 0) { - pop_lvl_blk = saved_blk; pop_lvl_page = saved_page; pop_lvl_ok = saved_ok; - return -1; - } - if (saved_ok) mem_free_block(saved_blk); - pop_current_level = n; - return 0; -} - -int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg, - uint8_t *lcol_fg, uint8_t *lcol_bg, - uint8_t *rcol_fg, uint8_t *rcol_bg, uint8_t *below_fg) __banked -{ - const uint8_t *rfg, *rbg, *lnk; - uint8_t left, right, down, i; - - if (!pop_lvl_ok || room < 1 || room > 24) return -1; - - gfx_w0_map(pop_lvl_page); - rfg = room_fg_ptr(room); - rbg = room_bg_ptr(room); - lnk = (const uint8_t *)(LVL_DATA_OFF + BP_LINKS) + (uint16_t)(room - 1) * 4; - - for (i = 0; i < ROOM_TILES; i++) { - fg[i] = (uint8_t)(rfg[i] & 0x1F); /* тип тайла (верх. биты — модиф., пока не нужны) */ - bg[i] = rbg[i]; /* backtable как есть */ - } - - left = lnk[0]; /* L */ - right = lnk[1]; /* R */ - down = lnk[3]; /* D */ - - /* leftcol: правый столбец (col9) комнаты СЛЕВА, строки 0..2 (кромка col0), - * а в [3..5] — ПРЕДпоследний (col8). Вторая колонка нужна коллизии: Kid, - * стоящий В шве (curr_col = −1), смотрит вперёд на колонку −2, и без неё - * там оказывалась мнимая стена (get_tile → TILE_WALL), которая выпихивала - * его сквозь решётку. Оригинал резолвит любую колонку через - * find_room_of_tile (seg006:005D). */ - if (left >= 1 && left <= 24) { - const uint8_t *lf = room_fg_ptr(left); - const uint8_t *lb = room_bg_ptr(left); - for (i = 0; i < 3; i++) { - lcol_fg[i] = (uint8_t)(lf[i * 10 + 9] & 0x1F); - lcol_fg[3 + i] = (uint8_t)(lf[i * 10 + 8] & 0x1F); - lcol_bg[i] = lb[i * 10 + 9]; - } - } else { - for (i = 0; i < 3; i++) { lcol_fg[i] = 20; lcol_fg[3 + i] = 20; lcol_bg[i] = 0; } - } - - /* rightcol: левый столбец (col0) комнаты СПРАВА, строки 0..2 (кромка col9: - * коллизия на правом шве + переход вправо) */ - if (right >= 1 && right <= 24) { - const uint8_t *rf = room_fg_ptr(right); - const uint8_t *rb = room_bg_ptr(right); - for (i = 0; i < 3; i++) { - rcol_fg[i] = (uint8_t)(rf[i * 10 + 0] & 0x1F); - rcol_fg[3 + i] = (uint8_t)(rf[i * 10 + 1] & 0x1F); /* колонка 11 (см. выше) */ - rcol_bg[i] = rb[i * 10 + 0]; - } - } else { - for (i = 0; i < 3; i++) { rcol_fg[i] = 20; rcol_fg[3 + i] = 20; rcol_bg[i] = 0; } - } - - /* belowrow: верхний ряд (row0) комнаты снизу — ОДИННАДЦАТЬ байт. - * [0..9] — колонки 0..9 комнаты снизу; [10] — тайл (0,9) комнаты - * ПО ДИАГОНАЛИ СНИЗУ-СЛЕВА (room_BL у оригинала). Одиннадцатый нужен - * тайлу (2,0): его «сосед снизу-слева» — это колонка −1 ряда 3, то есть - * чужая комната, и load_rowbelow (seg008:368) резолвит её именно так, - * с дефолтом «стена» только когда такой комнаты НЕТ. Раньше мы клали - * туда стену БЕЗУСЛОВНО, и в пустом углу рисовался клин кладки - * (BUG-SEAM-WEDGE-1, ур. 3 комн. 18). */ - if (down >= 1 && down <= 24) { - const uint8_t *df = room_fg_ptr(down); - uint8_t dl = ((const uint8_t *)(LVL_DATA_OFF + BP_LINKS))[(down - 1) * 4]; - for (i = 0; i < 10; i++) below_fg[i] = (uint8_t)(df[i] & 0x1F); - below_fg[10] = (dl >= 1 && dl <= 24) - ? (uint8_t)(room_fg_ptr(dl)[9] & 0x1F) - : 20; /* кромка уровня */ - } else { - /* Комнаты снизу НЕТ. Оригинал (load_rowbelow, seg008:368) в этом - * случае подставляет РАЗНЫЕ кромки: колонкам 1..9 — `tiles_0_empty`, - * и только левому краю (колонка 0, тайл из room_BL) — `tiles_20_wall`. - * У нас тут стояла стена на всё, и её грань (topright стены) лезла - * жёлтыми треугольниками под пустые тайлы нижнего ряда — видно в - * шахте падения, уровень 6 комната 3 (BUG-BELOWROW-WALL). */ - for (i = 0; i < 10; i++) below_fg[i] = 0; /* tiles_0_empty */ - below_fg[10] = 20; /* левая кромка уровня */ - } - - gfx_w0_unmap(); - return 0; -} - -int8_t pop_room_col_landing(uint8_t room, uint8_t col) __banked -{ - const uint8_t *rf; - int8_t row, res = -1; - if (!pop_lvl_ok || room < 1 || room > 24 || col > 9) return -1; - gfx_w0_map(pop_lvl_page); - rf = room_fg_ptr(room); - for (row = 0; row < 3; row++) { /* кусок пролетает пустые ряды */ - uint8_t t = (uint8_t)(rf[row * 10 + col] & 0x1F); - if (t == 0) continue; /* empty — дальше вниз */ - /* Набор площадок — дословно switch из loose_land (seg007:11E8): - * пол, пика, обе кнопки, зелье и оба факела. На всём остальном - * (стена, ворота, колонна) кусок просто исчезает. Раньше здесь - * стоял только пол, и плита, падавшая на КНОПКУ в комнате снизу, - * пропадала бесследно: ни щебня, ни нажатия (уровень 4, плита - * 16(1,1) -> кнопка 17(0,1), открывающая ворота 23(0,9)). */ - if (t == 1 || t == 2 || t == 6 || t == 10 || - t == 15 || t == 19 || t == 30) res = row; - break; /* первый не-пустой тайл — стоп */ - } - gfx_w0_unmap(); - return res; -} - -/* Рестарт уровня (порт load_level из цикла play_level, seg003:57): вернуть - * в исходное состояние ВСЁ, что игра правит в данных уровня. - * - * Это foretable (из эталонной копии — сами данные мы правим на месте) И - * ТАБЛИЦА СВЯЗЕЙ. Про вторую легко забыть, потому что мутирует в ней ровно - * одно поле — таймер нажатия кнопки в младших битах LINKMAP, — но забыть - * дорого: `pop_tile_code_drawn` рисует кнопку НАЖАТОЙ, пока таймер > 1, и - * ненулевой остаток показывает её нажатой с первого кадра уровня. - * - * Оставить такой остаток особенно легко из died_on_button: он ставит таймер - * в 5 и заводит trob кнопки, но тайл к этому моменту УЖЕ пол — trob умирает - * в первом же обходе (`default: type = -1`), не успев ни разу уменьшить - * таймер. У оригинала ровно то же самое, просто там load_level перечитывает - * весь файл целиком, и вопроса не возникает (найдено пользователем - * 2026-08-18: уровень 7, комната 3, кнопка (2,1) после первого же респавна). - * - * LINKMAP в странице уровня остаётся ЭТАЛОННЫМ: игра правит только - * ОЗУ-копию pop_dl2 (pop_doorlink2_set), обратно в страницу не пишет никто — - * поэтому отдельная pristine-копия, как у foretable, тут не нужна. */ -void pop_level_reset_tiles(void) __banked -{ - uint16_t i; - uint8_t *dst; - const uint8_t *src; - if (!pop_lvl_ok) return; - gfx_w0_map(pop_lvl_page); - dst = (uint8_t *)(LVL_DATA_OFF + BP_FG); - src = (const uint8_t *)LVL_PRISTINE_OFF; - for (i = 0; i < 24u * ROOM_TILES; i++) dst[i] = src[i]; - src = (const uint8_t *)(LVL_DATA_OFF + BP_LINKMAP); - for (i = 0; i < 256; i++) pop_dl2[i] = src[i]; - gfx_w0_unmap(); -} - -/* Рестарт уровня, часть вторая (тот же load_level + pos_guards, seg003:83): - * стражи — такая же часть данных уровня, как тайлы, и перезагрузка файла - * возвращает их всех. Убитый до смерти Кида страж после respawn снова жив - * и стоит на исходном тайле; забывается и запомненная поза трупа - * (guards_seq_hi = 0 -> «поднять стандартной стойкой»). */ -void pop_level_reset_guards(void) __banked -{ - if (!pop_lvl_ok) return; - pop_gstate_init(); -} - -void pop_gstate_init(void) __banked -{ - const uint8_t *p = (const uint8_t *)LVL_DATA_OFF; - uint8_t r; - gfx_w0_map(pop_lvl_page); - for (r = 0; r < 24; r++) { - uint8_t *g = pop_gstate + (uint16_t)r * 6; - g[GS_TILE] = p[BP_GTILE + r]; - g[GS_DIR] = p[BP_GDIR + r]; - g[GS_X] = p[BP_GX + r]; - g[GS_SKILL] = p[BP_GSKILL + r]; - /* pos_guards (seg003:0913), сразу после load_level: X стража - * ПЕРЕСЧИТЫВАЕТСЯ из колонки тайла, а то, что лежит в файле, оригинал - * выбрасывает (в комнате 24 уровня 8 там, например, 255). Дальше X - * владеет leave_guard, и именно она — единственный носитель КОЛОНКИ: - * в guards_tile leave_guard кладёт get_tilepos(0, row), то есть - * колонку обнуляет намеренно. */ - if (g[GS_TILE] < 30) - g[GS_X] = (uint8_t)(pop_x_bump[(g[GS_TILE] % 10) + FIRST_ONSCREEN_COLUMN] - + TILE_SIZEX); - /* guards_seq_lo/hi в ФАЙЛЕ не используются — там 0xFF во всех - * комнатах (оригинал чистит их в reset_level_unused_fields). - * Осмысленное значение туда кладёт только leave_guard, поэтому - * стартуем нулями: 0 = «поднимать стандартной стойкой». - * Без этого в интерпретатор уходил curr_seq = 0xFFFF и он вис. */ - g[GS_SEQL] = 0; - g[GS_SEQH] = 0; - } - gfx_w0_unmap(); -} - -/* Страж комнаты (enter_guard, seg002:0112 + pos_guards, seg003). Возврат - * 0 = стража в комнате нет (tile >= 30). X оригинал пересчитывает из - * колонки (pos_guards), поэтому guards_x из файла не читаем. */ -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked -{ - const uint8_t *g; - uint8_t t; - if (!pop_lvl_ok || room < 1 || room > 24) return 0; - /* Тайл/направление/мастерство — из ЖИВОЙ копии (её правит - * pop_guard_state_save); цвет статичен, его читаем со страницы. */ - g = pop_gstate + (uint16_t)(room - 1) * 6; - t = g[GS_TILE]; - if (t < 30) { - *tile = t; - *dir = (int8_t)g[GS_DIR]; - *skill = g[GS_SKILL]; - gfx_w0_map(pop_lvl_page); - *color = (uint8_t)(((const uint8_t *)LVL_DATA_OFF)[BP_GCOLOR + room - 1] & 0x0F); - gfx_w0_unmap(); - } - return (uint8_t)(t < 30); -} - -/* ---- Стартовая позиция уровня ---------------------------------------- */ - -static uint8_t start_byte(uint16_t off) -{ - uint8_t v; - if (!pop_lvl_ok) return 0; - gfx_w0_map(pop_lvl_page); - v = ((const uint8_t *)(LVL_DATA_OFF))[off]; - gfx_w0_unmap(); - return v; -} - -uint8_t pop_level_start_room(void) __banked { return start_byte(BP_START + 0); } -uint8_t pop_level_start_pos(void) __banked { return start_byte(BP_START + 1); } -int8_t pop_level_start_dir(void) __banked { return (int8_t)start_byte(BP_START + 2); } diff --git a/applications/PoP/roomtest/pop_level_qsave.c b/applications/PoP/roomtest/pop_level_qsave.c deleted file mode 100644 index 02c5e6b..0000000 --- a/applications/PoP/roomtest/pop_level_qsave.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Сериализация уровня для QuickSave (банк 8). - * - * Код выполняется только по F6/F9 и вынесен из горячего резидентного - * pop_level.c. Данные уровня и снимка используют одно окно W0, поэтому - * foretable переносится небольшими блоками через стековый буфер W2. - */ -#include -#include "pop_level.h" -#include "_pop_level.h" - -void pop_level_qsave(pop_qs_io_t *io) -{ - uint8_t tmp[30]; - uint16_t off; - pop_qs_bytes(io, pop_dl1, sizeof(pop_dl1)); - pop_qs_bytes(io, pop_dl2, sizeof(pop_dl2)); - pop_qs_bytes(io, pop_gstate, sizeof(pop_gstate)); - if (!pop_lvl_ok) { io->failed = 1; return; } - /* W0 одновременно не может держать страницу уровня и страницу снимка. */ - for (off = 0; off < 24u * ROOM_TILES; off += sizeof(tmp)) { - uint8_t i; - if (!io->reading || io->apply) { - gfx_w0_map(pop_lvl_page); - if (!io->reading) - for (i=0; ireading && io->apply && !io->failed) { - gfx_w0_map(pop_lvl_page); - for (i=0; i check_on_floor(): кадр с флагом - * FRAME_NEEDS_FLOOR (0x40), под персонажем не floor -> start_fall(); - * стена -> in_wall(); - * freefall (action 4) -> do_fall(): fall_y-ускорение (в fall_accel/speed), - * достиг pop_y_land[curr_row+1] -> land()/inc_curr_row. - * - * Координатная система PoP: экран.left = 58, тайл = 14 ед. (TILE_SIZEX); - * col = (xpos-58)/14 (округл. вниз), xl = остаток; get_tile_div_mod_m7 = - * div_mod(xpos-7). Карта: fg[row*10+col] & 0x1F; col<0/>9,row<0/>2 = стена. - * - * MVP: без spike/HP/grab/gate — падение + мягкое/среднее приземление. - * Бег В стену (check_bumped) и осторожный шаг у края (get_edge_distance) — - * следующим шагом. - */ -#include -#include /* memcpy = LDIR: цикл на C тут стоил ~390 тактов на байт */ -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_ctrl.h" /* pop_ctrl_shift_held() — для check_grab */ -#include "pop_sfx.h" /* звуковые эффекты (sound_plan.md) */ -#include "pop_geom.h" /* общая геометрия (x_bump/y_land/y_to_row) */ -#include "pop_tile.h" /* POP_TILE_DIV/MOD — деление на ширину тайла таблицей */ -#include "pop_redraw.h" /* пометки перерисовки (порт set_redraw_*) */ -/* pop_bg нужен ТОЛЬКО падающему куску (mob): spawn/tick/pos — это движущийся - * ОБЪЕКТ, а не перерисовка тайла (в оригинале он и живёт отдельно: mobs + - * draw_moving). Из-за него pop_loose_tick — единственная функция модуля, - * которую нельзя звать из __banked-кода; вся коллизия/физика/предметы, то - * есть то, что понадобится стражам, чиста от графики. Разделение mob на - * логику и отрисовку — задел следующей фазы. */ -#include "pop_bg.h" -#include "pop_state.h" -#include "pop_trob.h" /* room_modif + trob-список (пики/ворота) */ -#include "pop_level.h" /* pop_level_start_room — вход в дверь уровня */ -#include "pop_guard.h" /* SWORD_2_DRAWN — ветка приземления с мечом */ -#include "pop_tune.h" /* POP_ENABLE_JUMP_GRAB и прочие настройки */ -#include "pop_cdraw.h" /* габарит кадра персонажа (pop_cd) */ - -/* Габарит последнего нарисованного кадра АКТИВНОГО персонажа (char_width_half - * и char_top_y в set_char_collision, seg006:0723). У каждого слота он свой: - * до DRAW-CHAR отрисовка была продублирована, метрики Кида лежали отдельно, и - * коллизия СТРАЖА считалась по ширине спрайта КИДА. Отставание на кадр — - * как в оригинале (cur_frame берётся тем же кадром, что рисуется). */ -#define CD_ACT (&pop_cd[Char.charid == CHARID_0_KID ? POP_CH_KID : POP_CH_OPP]) - -/* ---- Тайлы / действия / seq id (подмножество PoP) ------------------ */ -#define TILE_EMPTY 0 -#define TILE_GATE 4 -#define TILE_DOORTOP_FLOOR 7 /* tapestry (пол сверху) */ -#define TILE_DOORTOP 12 /* tapestry top */ -#define TILE_MIRROR 13 -#define TILE_CHOMPER 18 -#define TILE_WALL 20 -#define TILE_LOOSE 11 /* проваливающийся пол */ -#define TILE_DEBRIS 14 /* щебень (упавший loose) */ -#define TILE_TORCH 19 /* факел */ -#define TILE_TORCH_DEBRIS 30 /* факел + щебень (loose_land) */ -#define TILE_SPIKE 2 /* пики */ -#define TILE_CLOSER 6 /* кнопка-закрывалка (DROP) */ -#define TILE_STUCK 5 /* заклиненная кнопка (died_on_button) */ -#define TILE_POTION 10 /* зелье */ -#define TILE_SWORD 22 /* меч на полу */ -#define TILE_OPENER 15 /* кнопка-открывалка (RAISE, 0x0F) */ -#define TILE_LEVELDOOR_LEFT 16 /* ЛЕВАЯ половина двери уровня (на ней modif) */ -#define ACT_STAND 0 -#define ACT_RUNJUMP 1 -#define ACT_HANGCLIMB 2 -#define ACT_MIDAIR 3 -#define ACT_FREEFALL 4 -#define ACT_BUMPED 5 -#define ACT_HANGSTRAIGHT 6 -#define ACT_TURN 7 - -#define SEQ_7_FALL 7 /* stepfall (stand/run/step/crouch) */ -#define SEQ_17_SOFT_LAND 17 -#define SEQ_18_FALL_STANDJUMP 18 -#define SEQ_19_FALL 19 /* stepfall2 (run frames 9/13) */ -#define SEQ_20_MEDIUM_LAND 20 -#define SEQ_21_FALL_RUNJUMP 21 -#define SEQ_45_BUMPFALL 45 /* удар В ВОЗДУХЕ: отскок и падение */ -#define SEQ_46_HARDBUMP 46 /* удар после прыжка: отскок + ПРИСЕДАНИЕ */ -#define SEQ_47_BUMP 47 /* удар в стену: dx(-4) отскок + 50-52 + stand */ -/* K4 — зацеп/вис/подтягивание/спуск */ -#define SEQ_8_GRAB_STRAIGHT 8 /* прыжок вверх и зацеп (прямо) */ -#define SEQ_9_GRAB_WHILE_JUMPING 9 /* зацеп ПРЯМО В ПРЫЖКЕ (улучшение SDLPoP) */ -#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */ -#define SEQ_16_JUMP_UP_AND_GRAB 16 /* прыжок вверх и зацеп (нет пола сзади)*/ -#define SEQ_24_GRAB_FORWARD 24 /* прыжок вверх и зацеп (пол сзади) */ -#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */ -#define SEQ_10_CLIMB_UP 10 /* подтягивание из виса */ -#define SEQ_11_RELEASE_LEDGE_LAND 11 /* сорваться и встать (конец спуска) */ -#define SEQ_15_GRAB_LEDGE_MIDAIR 15 /* зацеп за уступ в падении */ -#define SEQ_23_RELEASE_LEDGE_FALL 23 /* отпустить уступ и падать */ -#define SEQ_68_CLIMB_DOWN 68 /* спуск через зацеп (не приседание) */ -#define SEQ_73_CLIMB_UP_TO_GATE 73 /* подъём к закрытой калитке */ -#define SEQ_51_SPIKED 51 /* напороться на пики (смерть) */ -#define SEQ_54_CHOMPED 54 /* попасть в челюсти чомпера (смерть) */ -#define SEQ_22_CRUSHED 22 /* разбиться при падении (смерть) */ -#define SEQ_63_ACTIVE_AFTER_FALL 63 /* стойка С МЕЧОМ после приземления */ -#define SEQ_65_BUMP_FWD_SWORD 65 /* стража прижали к стене (с мечом) */ -#define SEQ_81_FIGHTFALL 81 /* fightfall: падение из боевой стойки */ -#define SEQ_82_GUARD_PUSHED_OFF 82 /* стража спихнули с уступа */ -#define SEQ_83_GUARD_FALL 83 /* страж сам шагнул в провал с мечом */ - -#define TILE_FLOOR 1 -#define FRAME_109_CROUCH 109 -#define FRAME_178_CHOMPED 178 - -/* Кадры анимации для check_spiked (seg006:0658). */ -#define FRAME_7_RUN 7 -#define FRAME_26_STANDJUMP_LAND 26 -#define FRAME_34_RUNJUMP_START 34 -#define FRAME_43_RUNJUMP_LAND 43 - -#define FRAME_NEEDS_FLOOR 0x40 -#define FRAME_WEIGHT_X 0x1F -#define TILE_RIGHTX 13 -#define SCREENSPACE_X 58 -#define FALL_ACCEL 3 -#define FALL_MAX 33 -/* Перо (seg006:057C, types.h:1435): ускорение и потолок скорости падения - * под зельем медленного падения. */ -#define FALL_ACCEL_FEATHER 1 -#define FALL_MAX_FEATHER 4 - -#define TILE_MIDX 7 -#define FRAME_THIN 0x20 - - -static const int8_t dir_front[2] = {-1, 1}; /* [dir+1]: dir=-1->-1, 0->+1 */ -static const int8_t dir_behind[2] = {1, -1}; /* [dir+1]: назад по направлению */ -/* wall_type(tile): gate/doortop=1, mirror=2, chomper=3, wall=4, иначе 0. */ -static const int8_t wall_dl[6] = {0, 10, 0, -1, 0, 0}; /* wall_dist_from_left */ -static const int8_t wall_dr[6] = {0, 0, 10, 13, 0, 0}; /* wall_dist_from_right */ -static int8_t g_infrontx; /* колонка «перед персонажем» (set в get_tile_infrontof) */ - -/* ---- Карта комнаты ------------------------------------------------- */ -uint8_t pop_fell_out; /* 1 = Kid пересёк НИЖНЮЮ границу (см. pop_map.h) */ -uint8_t pop_leave_dir; /* уход вбок/вверх: 0=нет; 1=left,2=right,3=up (side+1) */ -uint8_t pop_leave_timer; /* exit_room_timer (seg002): >0 = leave заблокирован N кадров после входа в комнату */ -uint8_t pop_loose_fell; /* 0=нет; иначе tilepos+1 упавшего loose (кусок улетел вниз) */ -uint8_t pop_kid_dead; /* 1 = Kid мёртв (напоролся на пики и т.п.) */ -uint8_t pop_kid_hurt; /* 1 = в этом кадре убавилось HP → «брызги» */ - -/* is_screaming (seg005:38): крик падения звучит ОДИН раз за полёт, а не - * каждый кадр. Сбрасывается там же, где у оригинала: приземление (land), - * зацеп за карниз (check_grab) и постановка на старт (set_start_pos). */ -static uint8_t is_screaming; -uint8_t hitp_curr; /* текущее HP (0 = мёртв); pop_kid_hp_reset ставит старт */ -uint8_t hitp_max; /* стартовое HP Кида (для индикатора) */ -/* hitp_beg_lev (seg003 init_game/play_level_2): HP, с которым НАЧАТ уровень. - * Смерть/рестарт уровня возвращают ровно его (do_startpos: hitp_max = - * hitp_curr = hitp_beg_lev), а по ПРОХОЖДЕНИИ уровня он подтягивается к - * достигнутому максимуму (hitp_beg_lev = hitp_max) — так «жизнь» из большой - * склянки переносится на следующий уровень, а из мёртвых прогонов — нет. - * Стартовое значение (custom->start_hitp = 3) ставит main через - * pop_kid_hp_newgame — инициализатором нельзя: модуль банкованный. */ -uint8_t hitp_beg_lev; -/* Дельта HP Кида за кадр (порт hitp_delta). Её ставят боёвка (guards.c) и - * физика (пики/падение/плита на голову — через общий pop_take_hp), а - * применяет pop_do_delta_hp раз в кадр, как в оригинале. Раньше путь - * пик/падения правил hitp_curr напрямую; с переходом физики на Char это - * стало невозможно — урон должен уметь уходить и стражу. */ -int8_t hitp_delta; -static uint8_t g_room; /* номер ТЕКУЩЕЙ комнаты (для room_modif пик/ворот) */ -static uint8_t *g_fg; /* fg[30], row*10+col (МУТАБЕЛЬНАЯ — loose→empty) */ -static uint8_t g_curr_tile; /* = curr_tile2: тайл последнего get_tile */ -static uint8_t g_obj_xl; /* позиция внутри тайла (get_tile_div_mod) */ -static uint8_t grab_timer; /* после зацепа (12): блокирует climb-up */ -/* is_feather_fall (seg000:15F8): кадров, пока действует зелье медленного - * падения. У оригинала это флаг + счётчик тиков со сроком по звуку; у нас - * просто обратный отсчёт кадров (POP_FEATHER_FRAMES, pop_tune.h). Публичный: - * его читают play_seq (опкод JMP_IF_FEATHER, pop_kid.c) и приложение. */ -uint8_t pop_feather; -/* upside_down (seg000:15E9 toggle_upside): 1 — картинка перевёрнута вверх - * ногами (зелье типа 4, уровень 9). Держим ЗДЕСЬ, рядом с пером: оба - * ставятся из одной ветки proc_get_object и оба сбрасываются стартом - * уровня. Читает отрисовка (банки 2/4/7) и главный цикл — отсюда - * публичность. Смерть Кида снимает эффект (seg000:1224). */ -uint8_t pop_upside; -/* ЖЕЛАЕМОЕ состояние переворота. Зелье и смерть Кида пишут только сюда, а - * pop_upside переключает главный цикл — ОДИН раз, в начале кадра, вместе с - * перерисовкой (pop_flip_screen). - * - * Зачем разделение. Зелье выпивается из play_seq, то есть В СЕРЕДИНЕ кадра: - * переключи флаг сразу — и остаток кадра рисуется уже зеркально поверх ещё - * неперевёрнутого фона. Хуже всего пламя факела: оно ЗАПЕКАЕТСЯ в ОЗУ-копию - * (pop_torch_draw), поэтому кадр, положенный в зеркальную позицию на старом - * фоне, оставался там навсегда — по комнате рассыпались лишние языки огня - * (нашёл пользователь на глотке зелья; чит U этим не страдал, потому что - * стоит в начале кадра). */ -uint8_t pop_upside_want; -/* need_redraw_because_flipped (seg000:15E9/1226): состояние ОТЛИЧАЕТСЯ от - * желаемого — главный цикл применит его и снимет флаг. */ -uint8_t pop_upside_dirty; -/* Состояние edge-триггера бампа — массивы флагов перекрытия по колонкам - * (порт prev_coll_flags/curr_row_coll_flags, seg004); объявлены ниже, рядом - * с check_collisions. Сброс при смене комнаты — coll_prev_row. */ -static void pop_coll_invalidate(void); -/* Связи комнаты (0 = нет соседа) + ЦЕЛИКОМ fg соседей слева и справа - * (g_lcol/g_rcol, раскладка комнаты [row*10 + col]). Оригинал резолвит - * любую колонку через find_room_of_tile (seg006:005D), гуляя по roomlinks; - * у нас уровень лежит в EMM-странице, маппить её на каждый get_tile (горячий - * путь физики) дорого — поэтому соседи кэшируются на входе в комнату. - * - * Почему именно ВСЯ комната, а не кромочные колонки: col считается из x - * персонажа (floor((x − 7 − 58)/14)), и на всём диапазоне x 0..255 даёт - * col от −5 до 13. Кромок не хватало, а «за кэшем» get_tile отдавал стену — - * мнимую. Так пропадала видимость стража (BUG-SWORD-GHOST-1: страж после - * follow_guard оказывался в col 12, луч упирался в мнимую стену, Кид прятал - * меч и не мог достать обратно) и так же ломались коллизия/разворот у швов. - * Задаются pop_map_set_edges. */ -static uint8_t g_link_l, g_link_r, g_link_u, g_link_d; -static uint8_t g_lcol[30], g_rcol[30]; - -/* ---- Плита-ПОТОЛОК: loose ряда 2 комнаты СВЕРХУ ------------------- * - * В оригинале это тот же loose, просто get_tile ушёл в комнату сверху - * (find_room_of_tile) и tilepos получился отрицательным (set_redraw* уводит - * такие в redraw_frames_above). У нас ряд 2 верхнего соседа живёт отдельной - * копией (above_fg в приложении, наш «ряд −1»), поэтому и состояние - * отдельное — pop_ceil_modif[col] с той же семантикой (0 покой, 0x80.. — - * тряска, 1..11 — отсчёт до падения). */ -uint8_t pop_ceil_modif[10]; /* публично: читает pop_bg при отрисовке */ -static uint8_t *g_above; /* ряд 2 комнаты сверху (fg), мутабельный */ -uint8_t pop_ceil_fell; /* 0 = нет; иначе col+1 провалившейся плиты-потолка */ - -uint8_t pop_debris_at; /* 0 = нет; иначе tilepos+1 нового щебня в ЭТОЙ комнате */ - -void pop_map_set_above(uint8_t *above_row2_fg) __banked { g_above = above_row2_fg; } - -void pop_map_set(uint8_t *fg) __banked { g_fg = fg; } - -void pop_map_set_room(uint8_t room) __banked { g_room = room; } - -/* do_startpos (seg003:0160): HP уровня = hitp_beg_lev, а не константа — - * иначе большая склянка теряется на границе уровня. */ -void pop_kid_hp_reset(void) __banked -{ - hitp_curr = hitp_max = hitp_beg_lev; - hitp_delta = 0; - pop_kid_dead = 0; -} - -/* Бесшовный переход (seamless, seg003:158): уровень стартует, НЕ трогая HP — - * Кид уносит на следующий и потолок, и полученный урон, потому что для него - * это не «новый уровень», а продолжение того же бега. Всё остальное, что - * делает pop_kid_hp_reset, нужно и здесь: дельта кадра и признак смерти. */ -void pop_kid_hp_carry(void) __banked -{ - hitp_delta = 0; - pop_kid_dead = 0; -} - -/* init_game (seg003:0043): начало ИГРЫ, а не уровня — стартовое HP. */ -void pop_kid_hp_newgame(void) __banked { hitp_beg_lev = POP_START_HITP; } - -/* add_life (seg000:11EC) + set_health_life (seg000:1200): большая склянка - * поднимает ПОТОЛОК HP (до max_hitp_allowed = 10) и доливает до него. */ -static void pop_kid_add_life(void) -{ - uint8_t hpmax = (uint8_t)(hitp_max + 1); - if (hpmax > POP_MAX_HITP) hpmax = POP_MAX_HITP; - hitp_max = hpmax; - hitp_delta = (int8_t)(hitp_max - hitp_curr); -} - -/* Тот же add_life наружу: слияние с тенью (уровень 12) даёт ровно ту же - * прибавку, что большая склянка, а живёт ИИ тени в другом банке. */ -void pop_add_life(void) __banked { pop_kid_add_life(); } - -/* Урон — через общий pop_take_hp (резидент pop_guard.c): физика работает - * над Char, значит и HP обязаны убавляться у ТОГО, кто сейчас в Char. Своя - * копия take_hp здесь была Kid-only и правила hitp_curr мимо дельты. */ - -/* Перечитать fg соседей из уровня, НЕ трогая историю коллизий. Отдельно от - * pop_map_set_edges, потому что нужен и посреди жизни в комнате: тайл соседа - * может измениться, пока тот не отрисован (плита, брошенная Кидом на - * полпути, доваливается заочно — animate_loose в pop_trob.c). g_lcol/g_rcol - * до этого были снимком НА МОМЕНТ ВХОДА, и коллизия у шва продолжала считать - * провалившуюся плиту полом. */ -void pop_map_refresh_edges(void) __banked -{ - uint8_t i; - if (!g_link_l && !g_link_r) return; - pop_level_access_begin(); - for (i = 0; i < 30; i++) { - if (g_link_l) g_lcol[i] = pop_level_tile_raw(g_link_l, i); - if (g_link_r) g_rcol[i] = pop_level_tile_raw(g_link_r, i); - } - pop_level_access_end(); -} - -void pop_map_set_edges(uint8_t left, uint8_t right, uint8_t up, uint8_t down) __banked -{ - g_link_l = left; g_link_r = right; g_link_u = up; g_link_d = down; - /* fg соседей — прямо из уровня, одной скобкой доступа на обе комнаты. - * Держать ещё одну копию в приложении незачем: карта — единственный её - * потребитель (отрисовке швов хватает кромочных колонок pop_room_load). */ - pop_map_refresh_edges(); - /* смена комнаты — колонки перепроецированы, прошлые флаги перекрытия - * недействительны (в оригинале prev_coll_room != curr_row_coll_room и - * бампа на кадре входа нет). БОКОВОЙ переход это отменяет: вызывающий - * сразу зовёт pop_coll_shift(∓10) и историю не теряет. */ - pop_coll_invalidate(); -} - -static uint8_t get_tile(int8_t col, int8_t row) -{ - /* Ряд −1 — ряд 2 комнаты СВЕРХУ (порт find_room_of_tile, seg006:005D: - * отрицательный row уходит по links.up). Нужен для зацепа за край - * провалившейся плиты-потолка (колодец наверх) и выбора seq прыжка. */ - if (row == -1 && g_above && g_link_u && col >= 0 && col <= 9) - g_curr_tile = (uint8_t)(g_above[col] & 0x1F); - else if (row < 0 || row > 2) - g_curr_tile = TILE_WALL; - else if (col < 0 && col >= -10 && g_link_l) /* уходим в комнату СЛЕВА */ - g_curr_tile = g_lcol[row * 10 + col + 10] & 0x1F; - else if (col > 9 && col <= 19 && g_link_r) /* и в комнату СПРАВА */ - g_curr_tile = g_rcol[row * 10 + col - 10] & 0x1F; - else if (col < 0 || col > 9) - g_curr_tile = TILE_WALL; /* край уровня / нет соседа = стена */ - else - g_curr_tile = g_fg[row * 10 + col] & 0x1F; - return g_curr_tile; -} - -/* Тайл ТЕКУЩЕЙ комнаты по клетке — наружу (порт get_tile(room,col,row) для - * случая room == текущая). Нужен лучу видимости стража - * (check_can_guard_see_kid, seg003:688): тот идёт по ряду между Кидом и - * стражем, а оба по условию в одной (= отрисованной) комнате. Колонки за - * пределами 0..9 get_tile разрешает через швы — здесь не используются. */ -uint8_t pop_tile_at(int8_t col, int8_t row) __banked -{ - return get_tile(col, row); -} - -/* Тайлы ОТРЕЗКА ряда одним вызовом — для луча видимости стража. - * - * Зачем: pop_tile_at объявлен __banked, а луч живёт в guards.c (банк 1) и - * звал его ПО ОДНОЙ КОЛОНКЕ. На сцене 11/15 (Кид в колонке 2, страж в 8) - * это девять трамплинов банк 1 -> банк 3 за кадр, и весь луч стоил 36 786 - * тактов — 5,6 % работы кадра при том, что делает он девять чтений байта - * (замер 2026-08-19). Цена трамплина здесь та же, что уже измерена у - * pop_clip_char_top (8 892 такта ради одной проверки тайла). - * - * Колонки за пределами 0..9 разрешает сам get_tile (шов с соседней - * комнатой), поэтому диапазон отдаём как есть, без клипа. - * - * out обязан вмещать c1 - c0 + 1 байт; вызывающий даёт буфер на 12 - * (колонки −1..10 плюс запас). */ -void pop_row_tiles(int8_t row, int8_t c0, int8_t c1, uint8_t *out) __banked -{ - int8_t col; - /* БЫСТРЫЙ ПУТЬ — отрезок целиком внутри комнаты. get_tile для ряда - * 0..2 и колонки 0..9 сводится ровно к `g_fg[row*10+col] & 0x1F` - * (см. его тело выше), а всё остальное там — разбор швов и краёв - * уровня. Идём указателем: иначе на каждую колонку заново считается - * row*10 + col. */ - if (row >= 0 && row <= 2 && c0 >= 0 && c1 <= 9 && g_fg) { - const uint8_t *p = g_fg + (int)row * 10 + c0; - for (col = c0; col <= c1; col++) - *out++ = (uint8_t)(*p++ & 0x1F); - return; - } - for (col = c0; col <= c1; col++) - *out++ = get_tile(col, row); -} - -/* can_bump_into_gate (seg004:373): ОТКРЫТЫЕ ворота проходимы — Kid не бампит и - * идёт сквозь них (на шве — уходит в соседнюю комнату; внутри комнаты — просто - * проходит по полу под поднятыми барами). ВАЖНО: ворота остаются тайлом 4 (в - * tile_is_floor это ПОЛ), поэтому Kid НЕ падает на них. Раньше get_tile ради - * проходимости подменял ворота шва на empty — но подмену видел и check_on_floor - * → start_fall (Kid проваливался при проходе через ОТКРЫТЫЕ ворота шва). Теперь - * проходимость живёт ТОЛЬКО в bump-логике (как в SDLPoP), не трогая проверку пола. - * Модификатор: шов слева (col=-1) — сосед g_link_l col9; шов справа (col=10) — - * g_link_r col0; ВНУТРИ комнаты (0..9) — текущая комната g_room (иначе после - * перехода Kid встаёт на ту же створку уже как на внутрикомнатную и его отбивает - * обратно). Открыто ⇔ (modif>>2)+6 >= char_height (бары выше головы). */ -/* Комната и tilepos клетки (col,row) С УЧЁТОМ ШВА — порт того, что в - * оригинале делает сам get_tile: он зовёт find_room_of_tile (seg006:005D) и - * ПЕРЕСТАВЛЯЕТ curr_room/curr_tilepos, а дальше trigger_button работает уже - * с ними, а не с комнатой персонажа. Возвращает 0, если клетки нет. - * - * Кусало 2026-08-11 (нашёл пользователь на уровне 5): Кид стоит на кнопке, - * которая физически в СОСЕДНЕЙ комнате (col = −1, то есть колонка 9 левого - * соседа). Мы читали модификатор как (своя комната, tilepos 9) — там стена - * с bg = 0, то есть индекс связи 0. Цепочка от нуля в комнате 24 уровня 5 - * открывает И нижние ворота, И верхние, хотя настоящая кнопка (индекс 9) - * открывает только нижние. */ -static uint8_t tile_room_of(int8_t col, int8_t row, uint8_t *tp) -{ - if (row < 0 || row > 2) return 0; - if (col >= 0 && col <= 9) { *tp = (uint8_t)(row * 10 + col); return g_room; } - if (col < 0 && col >= -10 && g_link_l) { *tp = (uint8_t)(row * 10 + col + 10); return g_link_l; } - if (col > 9 && col <= 19 && g_link_r) { *tp = (uint8_t)(row * 10 + col - 10); return g_link_r; } - return 0; -} - -/* Живой модификатор (openness) ворот в (col,row): своя комната или соседняя - * через шов. 0xFF — тайла нет (за краем уровня). */ -static uint8_t gate_modif(int8_t col, int8_t row) -{ - if (row < 0 || row > 2) return 0xFF; - if (col >= 0 && col <= 9) return pop_trob_modif(g_room)[row * 10 + col]; - if (col < 0 && col >= -10 && g_link_l) - return pop_trob_modif(g_link_l)[row * 10 + col + 10]; - if (col > 9 && col <= 19 && g_link_r) - return pop_trob_modif(g_link_r)[row * 10 + col - 10]; - return 0xFF; -} - -/* check_skel (seg002:1053): скелет ВСТАЁТ — его тайл стирается в пол. - * Перерисовать надо две клетки (сам тайл и соседа справа, как в оригинале: - * set_redraw_full + set_wipe на curr_tilepos и curr_tilepos+1) и на ОБЕИХ - * страницах дабл-буфера — иначе через кадр проступает старый скелет. */ -void pop_skel_wake_tile(uint8_t tilepos) __banked -{ - g_fg[tilepos] = TILE_FLOOR; - pop_set_redraw(tilepos, POP_RD_FLOOR, 2); - if ((tilepos % 10) < 9) - pop_set_redraw((uint8_t)(tilepos + 1), POP_RD_FLOOR, 2); -} - -/* Тот же модификатор наружу (луч видимости стража, guards.c): ему нужна - * openness ворот в ЛЮБОЙ колонке луча, включая ушедшие за край комнаты. */ -uint8_t pop_gate_modif(int8_t col, int8_t row) __banked -{ - return gate_modif(col, row); -} - -static uint8_t gate_passable(int8_t col, int8_t row) -{ - uint8_t gm = gate_modif(col, row); - /* Ветки `if (gm == 0xFF) return 0;` здесь БЫТЬ НЕ ДОЛЖНО: 0xFF — это не - * только сторожевое «тайла нет» из gate_modif, но и живой модификатор - * «ворота открыты НАСОВСЕМ» (trigger_gate по button_type = щебень, - * seg007:623). Значение это появилось только когда заработал порт - * loose_land, и ворота выходили нарисованными открытыми (отрисовка - * клампит modl>188 -> 188), но непроходимыми. Сторож сюда не приходит: - * зовут нас только там, где тайл ТОЧНО ворота, а (0xFF>>2)+6 = 69 и так - * больше любого fph. */ - return (uint8_t)((gm >> 2) + 6) >= (uint8_t)CD_ACT->fph; -} - -static uint8_t tile_is_floor(uint8_t t) -{ - switch (t) { - case 0: case 9: case 12: case 20: - case 26: case 27: case 28: case 29: - return 0; - default: - return 1; - } -} - -static uint8_t get_tile_at_char(void) -{ - return get_tile(Char.curr_col, Char.curr_row); -} - -static uint8_t get_tile_infrontof_char(void) -{ - g_infrontx = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - return get_tile(g_infrontx, Char.curr_row); -} - -/* ---- Тайлы НАД/ЗА персонажем (для зацепа/спуска, seg006) ----------- */ -static uint8_t get_tile_above_char(void) -{ - return get_tile(Char.curr_col, (int8_t)(Char.curr_row - 1)); -} - -static uint8_t get_tile_behind_char(void) -{ - return get_tile((int8_t)(dir_behind[Char.direction + 1] + Char.curr_col), - Char.curr_row); -} - -static uint8_t get_tile_front_above_char(void) -{ - g_infrontx = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - return get_tile(g_infrontx, (int8_t)(Char.curr_row - 1)); -} - -static uint8_t get_tile_behind_above_char(void) -{ - return get_tile((int8_t)(dir_behind[Char.direction + 1] + Char.curr_col), - (int8_t)(Char.curr_row - 1)); -} - -/* Таблицей, а не switch: тайл уже маскирован &0x1F, значит 32 байта покрывают - * весь домен, и вместо шести cp+jr выходит одно чтение по индексу. Зовётся - * на каждую колонку перебора коллизии — там это заметно. */ -static const uint8_t wall_type_tbl[32] = { - 0,0,0,0,1,0,0,1, /* 4,7 — стена справа (gate/doortop) */ - 0,0,0,0,1,2,0,0, /* 12 — то же; 13 — стена слева (mirror) */ - 0,0,3,0,4,0,0,0, /* 18 — chomper; 20 — стена с обеих сторон */ - 0,0,0,0,0,0,0,0 -}; -static uint8_t wall_type(uint8_t t) { return wall_type_tbl[t & 0x1F]; } - -/* ---- Координаты ---------------------------------------------------- */ -static int char_dx_forward(int8_t dx) -{ - int d = dx; - if (Char.direction < 0) d = -d; - return (int)Char.x + d; -} - -/* Деление на ширину тайла — таблицами POP_TILE_DIV/POP_TILE_MOD (резидент, - * pop_tile.c: их же читает слой фона). Вне 0..255 (у нас xpos — int, у - * DOS-оригинала байт) остаётся честная арифметика: путь редкий. */ -/* col = (xpos-58)/14 округл. вниз; g_obj_xl = позиция в тайле (0..13). */ -static int8_t get_tile_div_mod(int xpos) -{ - if ((unsigned int)xpos < 256u) { - g_obj_xl = POP_TILE_MOD[xpos]; - return POP_TILE_DIV[xpos]; - } else { - int x = xpos - SCREENSPACE_X; - int xh = x / TILE_SIZEX; - int xl = x % TILE_SIZEX; - if (xl < 0) { --xh; xl += TILE_SIZEX; } /* округление вниз */ - g_obj_xl = (uint8_t)xl; - return (int8_t)xh; - } -} - -static int8_t get_tile_div_mod_m7(int xpos) { return get_tile_div_mod(xpos - 7); } - -/* «весовая» точка кадра (dx с вычетом weight-битов флагов), в направлении. */ -static int dx_weight(void) -{ - int8_t offset = (int8_t)(kid_cur_dx() - (kid_cur_flags() & FRAME_WEIGHT_X)); - return char_dx_forward(offset); -} - -static void determine_col(void) -{ - Char.curr_col = get_tile_div_mod_m7(dx_weight()); -} - -/* determine_col наружу — для pop_load_fram_det_col (pop_kid): порт связки - * load_frame + determine_col (seg006:0144), которую оригинал зовёт перед - * control(). См. разбор там. */ -void pop_determine_col(void) __banked { determine_col(); } - -/* расстояние до края тайла (для in_wall). */ -static int distance_to_edge(int xpos) -{ - int d; - get_tile_div_mod_m7(xpos); /* -> g_obj_xl */ - d = g_obj_xl; - if (Char.direction == 0) d = TILE_RIGHTX - d; /* dir_0_right */ - return d; -} -static int distance_to_edge_weight(void) { return distance_to_edge(dx_weight()); } - -/* ---- ТОЧНАЯ коллизия со стеной (seg004) --------------------------- * - * Передний край персонажа = char_x_right (взгляд вправо) / char_x_left - * (влево) из set_char_collision (seg006:0723): obj_x/2 + 58, где obj_x = - * 2*char_dx_forward(cur_frame.dx) - 116 и load_frame_to_obj (seg008:1728) - * добавляет +1 для кадров «чётного пикселя» (бит 0x80 флагов XOR знак - * направления). Деление obj_x/2 в C усечено К НУЛЮ, поэтому в зоне левого - * шва (e<=57, obj_x<0) поправка +1 сдвигает край на пиксель ВПРАВО: e -> e+1. - * Это НЕ мелочь: Kid, осевший после отскока от ворот шва на x=57, имеет - * char_x_right=58 и НЕ пересекает порог leave-left (<=57) — иначе пинг-понг - * drawn_room у закрытых ворот (BUG-SEAM-PINGPONG; подтверждено потиковой - * трассой живого SDLPoP 1.23). При e>=58 формула сокращается к чистому - * char_dx_forward. ∓4 для THIN-кадров поверх. dist_from_wall_forward — - * расстояние переднего края до грани стены tiletype в колонке tcol: >0 - * зазор, <=0 достал/зашёл (насколько). */ -static int char_x_forward_edge(void) -{ - int e = char_dx_forward(kid_cur_dx()); - uint8_t fl = kid_cur_flags(); - if (Char.direction < 0) fl ^= 0x80; - if (!(fl & 0x80) && e <= 57) e++; /* odd pixel + C-трунк к нулю */ - return e; -} - -static int char_front_coll(void) -{ - int cx = char_x_forward_edge(); - if (kid_cur_flags() & FRAME_THIN) - cx += (Char.direction < 0) ? 4 : -4; /* THIN: край внутрь */ - return cx; -} - -static int dist_from_wall_forward(uint8_t tiletype, int8_t tcol) -{ - uint8_t type = wall_type(tiletype); - int coll_left, cx; - /* ОТКРЫТЫЕ ворота стеной НЕ являются (seg004:0A18: `if (tiletype == - * tiles_4_gate && !can_bump_into_gate()) return -1`). Без этой ветки - * get_edge_distance считал расстояние до створки как до стены и отдавал - * маленькое d с типом EDGE_WALL: осторожный шаг играл короткую - * последовательность (safe_step берёт seq по самому d), и к краю - * приходилось шагать ДВАЖДЫ. Возврат −1 уводит разбор на тайл впереди, - * где открытые ворота опознаются как обычный пол (d = 11, полный шаг). - * Поймано пользователем 2026-08-24 (подход слева направо). */ - if (tiletype == TILE_GATE && gate_passable(tcol, Char.curr_row)) return -1; - if (type == 0) return 127; - coll_left = pop_x_bump[tcol + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - cx = char_front_coll(); - if (Char.direction < 0) /* лицом влево */ - return cx - (coll_left + TILE_RIGHTX - wall_dr[type]); - else /* лицом вправо */ - return wall_dl[type] + coll_left - cx; -} - -/* in_wall (seg006:1292): персонаж оказался ВНУТРИ стены (тайл под ним = - * стена) — вытолкнуть. Аутентично SDLPoP: если он глубоко (delta>=8) ИЛИ - * перед ним тоже стена — двигаем НАЗАД к грани (6-delta), иначе ВПЕРЁД из - * стены на соседний тайл (delta+4). Вызывать ТОЛЬКО когда - * get_tile_at_char()==стена (проверяет вызывающий). */ -static void in_wall(void) -{ - int d = distance_to_edge_weight(); - if (d >= 8 || get_tile_infrontof_char() == TILE_WALL) - d = 6 - d; - else - d += 4; - Char.x = (uint8_t)char_dx_forward((int8_t)d); - determine_col(); - get_tile_at_char(); -} - -/* ---- Падение ------------------------------------------------------- */ -static void inc_curr_row(void) { Char.curr_row++; } - -/* Пики (определены ниже, перед pop_phys_tick) — нужны в land() для смерти - * при ПАДЕНИИ на выдвинутые пики (seg005 loc_5EE6). */ -static int is_spike_harmful(uint8_t tilepos); -static void spiked(uint8_t tilepos); - -/* fell_on_spikes (seg005 loc_5EE6): при приземлении тайл ПОД персонажем = - * пика (или пика СЗАДИ у самой кромки) и вредна → напороться (смерть). - * Возвращает 1, если умер (land прерывается). */ -static uint8_t fell_on_spikes(void) -{ - uint8_t tp; - if (get_tile_at_char() == TILE_SPIKE) { - tp = (uint8_t)(Char.curr_row * 10 + Char.curr_col); - } else if (distance_to_edge_weight() >= 12 && - get_tile_behind_char() == TILE_SPIKE) { - int8_t bcol = (int8_t)(dir_behind[Char.direction + 1] + Char.curr_col); - if (bcol < 0 || bcol > 9) return 0; - tp = (uint8_t)(Char.curr_row * 10 + bcol); - } else { - return 0; - } - if (is_spike_harmful(tp)) { spiked(tp); return 1; } - return 0; -} - -static void land(void) -{ - uint8_t seq; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - if (fell_on_spikes()) return; /* упал на вредные пики — смерть */ - /* к краю пола — чуть назад (как оригинал) */ - if (!tile_is_floor(get_tile_infrontof_char()) && distance_to_edge_weight() < 3) - Char.x = (uint8_t)char_dx_forward(-3); - pop_start_chompers(Char.room, Char.curr_row); /* seg005:0148 */ - /* Урон от падения (seg005:173) — ветвление по ПЕРСОНАЖУ, а не только по - * высоте. Порт построчно: - * 1 этаж (fall_y < 22): не-Кид (charid >= guard) ИЛИ меч вынут → - * меч в руку + seq_63; иначе присед seq_17. Звук/«нашумел» — только - * у Кида (у стража своё падение никого не будит). - * 2 этажа (< 33): тень падает как с одного этажа, СТРАЖ гибнет сразу, - * Кид (и скелет — баг оригинала, сохраняем) теряет 1 HP; - * 3+ этажа: гибнут все. - * - * Ветка «с мечом» на одном этаже — не косметика: seq_17_soft_land - * заканчивается ВЕЧНЫМ циклом на кадре 109, из которого выводит только - * control_crouched(), а при `sword == sword_2_drawn` управление уходит в - * control_with_sword и до него не доходит — Кид садится в присед - * НАВСЕГДА (BUG-LAND-SWORD-1). */ - is_screaming = 0; /* seg005:116 */ - if (Char.fall_y < 22) { - soft_land: - if (Char.charid >= CHARID_2_GUARD || Char.sword == SWORD_2_DRAWN) { - Char.sword = SWORD_2_DRAWN; - seq = SEQ_63_ACTIVE_AFTER_FALL; - } else { - seq = SEQ_17_SOFT_LAND; - } - /* seg005:185 — мягкое приземление слышно И стражам, и игроку. */ - if (Char.charid == CHARID_0_KID) { pop_sfx_play(17); is_guard_notice = 1; } - } else { - uint8_t deadly = (uint8_t)(Char.fall_y >= 33); /* СНЯТЬ до обнуления */ - if (!deadly && Char.charid == CHARID_1_SHADOW) goto soft_land; /* seg005:189 */ - if (!deadly && Char.charid == CHARID_2_GUARD) deadly = 1; /* seg005:190 */ - Char.fall_x = Char.fall_y = 0; - if (deadly || pop_take_hp(1)) { /* 3+ этажа или последнее HP */ - pop_take_hp(100); - if (Char.charid == CHARID_0_KID) pop_sfx_play(0); /* разбился */ - pop_char_set_seq(SEQ_22_CRUSHED); - play_seq(); - determine_col(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; - return; - } - if (Char.charid == CHARID_0_KID) { pop_sfx_play(16); is_guard_notice = 1; } /* seg005:195 */ - seq = SEQ_20_MEDIUM_LAND; - } - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(seq); - play_seq(); - determine_col(); -} - -static void start_fall(void) -{ - uint8_t frame = Char.frame, seq, tile; - /* seg006:1044 первым делом убирает меч в ножны: дальше падением рулит - * не боевой диспетчер, а обычный. Без этого Kid летит «с клинком», и - * control_with_sword разбирает кадры падения как боевые. */ - Char.sword = SWORD_0_SHEATHED; - inc_curr_row(); - pop_start_chompers(Char.room, Char.curr_row); /* seg006:08C1 */ - /* seg006:1044 start_fall: frame 9 -> seq_7, 13 -> seq_19 (лишний dx(1)) */ - if (frame == 13) seq = SEQ_19_FALL; - else if (frame == 26) seq = SEQ_18_FALL_STANDJUMP; - else if (frame == 44) seq = SEQ_21_FALL_RUNJUMP; - else if (frame >= 81 && frame < 86) { - /* сорвался, приземляясь после прыжка вверх: сдвиг ВПЕРЁД на 5 */ - seq = SEQ_19_FALL; - Char.x = (uint8_t)char_dx_forward(5); - pop_load_fram_det_col(); - } - else if (frame >= 150 && frame < 180) { - /* Кадры С МЕЧОМ (150..179) — ушёл в провал из боевой стойки - * (seg006:1123). Отдельная последовательность, а не seq_7: у той - * дрейф fall_x=1, и персонаж уезжал на ~тайл в сторону за полёт. - * Ветвление по персонажу — как в оригинале: - * СТРАЖ: спихнули (fall_x < 0) → seq_82, сам шагнул → seq_83; - * ПРОЧИЕ (Кид): seq_81 + взвести droppedout — по нему страж - * решает, идти ли следом вниз (guard_follows_kid_down). */ - if (Char.charid == CHARID_2_GUARD) { - if (Char.fall_x < 0) { - if (Char.direction < 0 && distance_to_edge_weight() <= 7) - Char.x = (uint8_t)char_dx_forward(-5); - seq = SEQ_82_GUARD_PUSHED_OFF; - } else { - pop_droppedout = 0; - seq = SEQ_83_GUARD_FALL; - } - } else { - pop_droppedout = 1; - if (Char.direction < 0 && distance_to_edge_weight() <= 7) - Char.x = (uint8_t)char_dx_forward(-5); - seq = SEQ_81_FIGHTFALL; - } - } - else seq = SEQ_7_FALL; /* frame 9 + stand/step/crouch */ - pop_char_set_seq(seq); - play_seq(); - determine_col(); - /* Проверки «упал в стену» — ТОЛЬКО пока персонаж В комнате (curr_row<=2). - * Ниже нижнего ряда (curr_row=3 после inc — падение сквозь дыру loose) - * наш get_tile отдаёт WALL как СЕНТИНЕЛ кромки уровня, но в оригинале там - * КОМНАТА СНИЗУ (у дыры — пол/пусто, не стена). Без гарда in_wall() ложно - * срабатывал и откатывал X назад (6−d) → дайв падения смещался на тайл - * влево (Кид «клевал» рано над колонной вместо дыры). */ - if (Char.curr_row <= 2) { - if (get_tile_at_char() == TILE_WALL) { - in_wall(); - return; - } - /* Хвост seg006:1099: тайл ПЕРЕД персонажем — стена → отодвинуть на 1 - * назад (иначе передний край зайдёт в грань). (seq_104 для frame 44 с - * малым зазором не портирован — в этом тесте не встречается.) */ - tile = get_tile_infrontof_char(); - if (tile == TILE_WALL) { - if (frame != 44 || distance_to_edge_weight() >= 6) - Char.x = (uint8_t)char_dx_forward(-1); - determine_col(); - } - } -} - -/* ---- Зацеп (seg006 can_grab/check_grab) --------------------------- * - * can_grab: можно ли зацепиться за g_curr_tile (curr_tile2) СКВОЗЬ through- - * тайл? Kid-only (без loose/opener-модификаторов). */ -static uint8_t can_grab(uint8_t through) -{ - if (through == TILE_WALL) return 0; /* сквозь стену нельзя */ - if (through == TILE_DOORTOP && Char.direction >= 0) return 0; /* верх двери, лицом вправо */ - if (tile_is_floor(through)) return 0; /* сквозь пол нельзя */ - if (g_curr_tile == TILE_DOORTOP_FLOOR && Char.direction < 0) return 0; - if (!tile_is_floor(g_curr_tile)) return 0; /* не за что цепляться */ - return 1; -} - -static uint8_t can_grab_front_above(void) -{ - uint8_t through = get_tile_above_char(); - get_tile_front_above_char(); /* g_curr_tile = спереди-сверху */ - return can_grab(through); -} - -/* check_grab (seg006:0A28): в падении при зажатом Shift — зацепиться за - * уступ спереди-сверху (seq_15), если скорость падения ещё мала и высота - * подходящая. Выравнивает передний край по кромке, гасит fall_y, взводит - * grab_timer (блок climb-up на несколько кадров). */ -static void check_grab(void) -{ - uint8_t old_x; - if (!pop_ctrl_shift_held()) return; /* Shift не зажат */ - if ((uint8_t)Char.fall_y >= 32) return; /* падает слишком быстро */ - if ((uint16_t)pop_y_land[Char.curr_row + 1] > (uint16_t)(Char.y + 25)) return; - old_x = Char.x; - Char.x = (uint8_t)char_dx_forward(-8); - determine_col(); - if (!can_grab_front_above()) { - Char.x = old_x; /* не за что — назад */ - determine_col(); - } else { - Char.x = (uint8_t)char_dx_forward((int8_t)distance_to_edge_weight()); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; - pop_char_set_seq(SEQ_15_GRAB_LEDGE_MIDAIR); - play_seq(); - determine_col(); - grab_timer = 12; - pop_sfx_play(9); /* seg006 check_grab */ - is_screaming = 0; /* seg006:1219 */ - } -} - -static void make_loose_fall(int pos, uint8_t modifier); - -/* check_grab_run_jump — ЗАЦЕП ПРЯМО В ПРЫЖКЕ, при Shift, зажатом ЗАРАНЕЕ. - * - * ВАЖНО: в оригинальной игре этого НЕТ. Это улучшение SDLPoP - * (`USE_JUMP_GRAB` + `fixes->enable_jump_grab`, seg006:1228), и там оно - * выключено, пока не включены fixes-and-enhancements. Ванильное поведение: - * зацепиться можно только в НАЧАЛЕ ПАДЕНИЯ (check_grab, кадры 102..105) — - * то есть Shift надо успеть нажать уже в полёте. Пользователь ловил ровно - * это и просил «чтобы работало и при заранее зажатом Shift», поэтому - * улучшение портировано, но за выключателем POP_ENABLE_JUMP_GRAB - * (pop_tune.h): игровая сборка сможет вернуться к оригиналу. - * - * Условия оригинала: действие — прыжок, кадр 22..23 (прыжок с места) или - * 39..41 (разбег-прыжок), «вперёд» ОТПУЩЕНО, «вверх» зажато. Дальше — та - * же проба, что у check_grab, но персонаж не падает, а сразу ставится на - * кромку и играет seq_9. - * - * Упрощение против SDLPoP: там колонка захвата правится, когда тайл - * оказался в ЧУЖОЙ комнате (curr_room != Char.room) — у нас модель - * однокомнатная, get_tile сам резолвит колонки за швом в координатах - * ТЕКУЩЕЙ комнаты, поэтому правка не нужна. Зато кнопка/плита за швом - * (grab_col вне 0..9) не сработают — тайл принадлежит соседу, а - * pop_trob_modif/g_fg у нас про свою комнату; такие случаи пропускаем. */ -static uint8_t check_grab_run_jump(void) -{ - uint8_t frame = Char.frame; - uint8_t grab_tile; - int8_t grab_col, grab_row; - - /* Сам выключатель проверяют ТОЧКИ ВЫЗОВА (иначе SDCC ругается на - * недостижимый код при POP_ENABLE_JUMP_GRAB = 1). */ - if (Char.action != ACT_RUNJUMP) return 0; - if (!((frame >= 22 && frame <= 23) || (frame >= 39 && frame <= 41))) return 0; - if (control_x != POP_CONTROL_RELEASED || control_y != POP_CONTROL_HELD_UP) return 0; - if (!can_grab_front_above()) return 0; - - grab_tile = g_curr_tile; /* тайл, за который взялись */ - grab_col = g_infrontx; - grab_row = (int8_t)(Char.curr_row - 1); /* СНЯТЬ до play_seq: он двигает ряд */ - - Char.x = (uint8_t)(pop_x_bump[grab_col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - Char.x = (uint8_t)char_dx_forward(Char.direction < 0 ? -12 : 2); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - pop_char_set_seq(SEQ_9_GRAB_WHILE_JUMPING); - play_seq(); - determine_col(); - grab_timer = 12; - - /* Хвост оригинала: за что схватились — то и сработает. Нужен потому, - * что check_press на следующем кадре уже не поможет: кадр сменится на - * 81 (hangdrop), если Shift отпустят сразу. */ - if (grab_col >= 0 && grab_col <= 9 && grab_row >= 0 && grab_row <= 2) { - uint8_t tp = (uint8_t)(grab_row * 10 + grab_col); - if (grab_tile == TILE_OPENER || grab_tile == TILE_CLOSER) - pop_trigger_button(g_room, tp, grab_tile, pop_trob_modif(g_room)[tp], 1); - else if (grab_tile == TILE_LOOSE) { - is_guard_notice = 1; - make_loose_fall(tp, 1); - } - } - return 1; -} - -static void do_fall(void) -{ - uint8_t nrow = (uint8_t)(Char.curr_row + 1); - if (!is_screaming && Char.fall_y >= 31) { - pop_sfx_play(1); /* seg005:39 — крик падения */ - is_screaming = 1; - } - if (nrow > 4) nrow = 4; /* защита pop_y_land[] от выхода */ - if ((uint16_t)pop_y_land[nrow] > (uint16_t)Char.y) { - check_grab(); /* ещё летит — попытка зацепа */ - } else if (Char.curr_row <= 2) { - if (get_tile_at_char() == TILE_WALL) - in_wall(); - if (tile_is_floor(g_curr_tile)) - land(); - else - inc_curr_row(); /* следующий ряд, ВКЛЮЧАЯ 2 -> 3 */ - /* Ряд 3 — «за нижней кромкой комнаты» (в оригинале get_tile уходит по - * links.down и это ряд 0 комнаты снизу, seg006:005D). Нам он нужен - * ровно за тем, за чем нужен оригиналу: пока Kid летит вдоль ряда 3, - * check_grab пробует зацеп за тайл ряда 2 СВОЕЙ комнаты — иначе - * спуск «повис на кромке, отпустил, зацепился этажом ниже» через - * нижнюю границу комнаты невозможен в принципе (BUG-GRAB-SEAM-DOWN). - * Раньше ряд залипал на 2, check_grab не звался ни разу, и Kid - * пролетал мимо кромки, набирая fall_y > 32 — после чего окно - * зацепа закрыто уже по скорости. */ - } - /* curr_row == 3: тайлов своей комнаты там нет (get_tile отдаёт WALL как - * сентинел), поэтому ни in_wall, ни land здесь звать нельзя — до y_land[4] - * дело всё равно не доходит: check_leave_below переводит в комнату снизу - * на y >= 211 (порт leave_room). */ -} - -static void fall_accel(void) -{ - if (Char.action == ACT_FREEFALL) { - int fy; - /* Перо (seg006:057C). Оригинал ловит эффектом ЛЮБОГО персонажа в - * Char — зелье пьёт только Кид, но флаг глобальный, и страж, упавший - * в ту же минуту, тоже парит; SDLPoP чинит это опцией - * fix_feather_fall_affects_guards. Берём поведение С ФИКСОМ (только - * Кид): расхождение осознанное, запись в ../docs/impl_diff.md. */ - if (pop_feather && Char.charid == CHARID_0_KID) { - fy = (uint8_t)Char.fall_y + FALL_ACCEL_FEATHER; - if (fy > FALL_MAX_FEATHER) fy = FALL_MAX_FEATHER; - } else { - fy = (uint8_t)Char.fall_y + FALL_ACCEL; - if (fy > FALL_MAX) fy = FALL_MAX; - } - Char.fall_y = (int8_t)fy; - } -} - -static void fall_speed(void) -{ - Char.y = (uint8_t)(Char.y + (uint8_t)Char.fall_y); - if (Char.action == ACT_FREEFALL) { - Char.x = (uint8_t)char_dx_forward(Char.fall_x); - determine_col(); - } -} - -/* ---- get_edge_distance (seg004:067C) — ТОЧНО ---------------------- * - * Расстояние переднего края до стены/края впереди + тип g_edge_type: WALL - * (стена в пределах тайла), FLOOR (пол — далеко, 11), CLOSER (край уступа - * над ямой — distance_to_edge_weight). Стена сперва под персонажем, потом - * перед ним; dist<=TILE_RIGHTX -> WALL, иначе FLOOR. */ -static uint8_t g_edge_type; - -static int edge_classify(int d) -{ - if (d <= TILE_RIGHTX) g_edge_type = EDGE_WALL; - else { g_edge_type = EDGE_FLOOR; d = 11; } - return d; -} - -int pop_edge_distance(void) __banked -{ - uint8_t t; int d; - determine_col(); - t = get_tile_at_char(); - if (wall_type(t)) { - d = dist_from_wall_forward(t, Char.curr_col); - if (d >= 0) return edge_classify(d); - } - t = get_tile_infrontof_char(); - /* Верх двери лицом ВПРАВО — кромка (в оригинале ПЕРВОЙ проверкой, до - * wall_type: у doortop wall_type != 0). */ - if (t == TILE_DOORTOP && Char.direction >= 0) { - g_edge_type = EDGE_CLOSER; - return distance_to_edge_weight(); - } - if (wall_type(t)) { - d = dist_from_wall_forward(t, g_infrontx); - if (d >= 0) return edge_classify(d); - } - /* ПРОВАЛИВАЮЩИЙСЯ пол впереди — КРОМКА, хотя tile_is_floor считает его - * полом. Это и есть механизм «проверки ногой»: осторожный шаг доводит - * Kid ровно до границы плиты (distance -> 0), там safe_step играет - * seq_44 (testfoot) — Kid щупает плиту ногой, та трясётся (SEQ_KNOCK_DOWN), - * и он остаётся на месте; шаг НА плиту — только со второго нажатия - * (Char.repeat). Без этой ветки плита читалась как обычный пол, и Kid - * заходил на неё первым же осторожным шагом и падал вместе с ней. */ - if (t == TILE_LOOSE) { - g_edge_type = EDGE_CLOSER; - return distance_to_edge_weight(); - } - /* Кнопка-закрывалка/меч/зелье: кромка, пока до границы есть зазор. */ - if (t == TILE_CLOSER || t == TILE_SWORD || t == TILE_POTION) { - d = distance_to_edge_weight(); - if (d) { g_edge_type = EDGE_CLOSER; return d; } - g_edge_type = EDGE_FLOOR; return 11; - } - if (tile_is_floor(t)) { g_edge_type = EDGE_FLOOR; return 11; } - g_edge_type = EDGE_CLOSER; /* яма впереди — до кромки уступа */ - return distance_to_edge_weight(); -} - -uint8_t pop_edge_type(void) __banked { return g_edge_type; } - -/* Тайл, на котором закончился разбор края (порт curr_tile2 после - * get_edge_distance). Нужен control'у: правило «у стены шагаем, а не - * бежим» в оригинале ЯВНО исключает чомпер (seg005:0577). */ -uint8_t pop_edge_tile(void) __banked { return g_curr_tile; } - -/* ---- Прыжок вверх с зацепом (seg005 check_jump_up и производные) --- * - * pop_jump_up_seq выбирает seq для ↑ в стойке: чистый прыжок (seq_28 в - * пустоту / seq_14 в потолок) ЛИБО прыжок-и-зацеп за уступ выше (seq_8/ - * 24 — с полом сзади, seq_16 — без), и выравнивает Char.x. control_up - * гасит caller (pop_ctrl). Порт: check_jump_up/grab_up_with_floor_behind/ - * jump_up_or_grab/grab_up_no_floor_behind/jump_up (без super-high-jump). */ -static uint8_t grab_up_with_floor_behind(void) -{ - int distance = distance_to_edge_weight(); - int edge_distance = pop_edge_distance(); /* побочно ставит g_edge_type */ - if (distance < 4 && edge_distance < 4 && g_edge_type != EDGE_WALL) { - Char.x = (uint8_t)char_dx_forward((int8_t)distance); - return SEQ_8_GRAB_STRAIGHT; - } - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - 4)); - return SEQ_24_GRAB_FORWARD; -} - -static uint8_t jump_up_plain(void) /* seg005 jump_up (без super) */ -{ - int distance = pop_edge_distance(); /* ставит g_edge_type */ - int8_t col; - uint8_t t; - if (distance < 4 && g_edge_type == EDGE_WALL) - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - 3)); - col = get_tile_div_mod(dx_weight() - 6); - t = get_tile(col, (int8_t)(Char.curr_row - 1)); - if (t != TILE_WALL && !tile_is_floor(t)) - return SEQ_28_JUMP_NOTHING_ABOVE; - return SEQ_14_JUMP_INTO_CEILING; -} - -static uint8_t grab_up_no_floor_behind(void) -{ - get_tile_above_char(); - Char.x = (uint8_t)char_dx_forward((int8_t)(distance_to_edge_weight() - 10)); - return SEQ_16_JUMP_UP_AND_GRAB; -} - -static uint8_t jump_up_or_grab(void) -{ - int distance = distance_to_edge_weight(); - if (distance < 6) - return jump_up_plain(); - if (!tile_is_floor(get_tile_behind_char())) - return grab_up_no_floor_behind(); - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - TILE_SIZEX)); - determine_col(); /* load_fram_det_col */ - return grab_up_with_floor_behind(); -} - -uint8_t pop_jump_up_seq(void) __banked -{ - uint8_t through = get_tile_above_char(); - get_tile_front_above_char(); /* g_curr_tile = спереди-сверху */ - if (can_grab(through)) - return grab_up_with_floor_behind(); - through = get_tile_behind_above_char(); - get_tile_above_char(); /* g_curr_tile = сверху */ - if (can_grab(through)) - return jump_up_or_grab(); - return jump_up_plain(); -} - -/* run_jump (seg005:0AA8), часть «выровнять по кромке» ------------------ * - * Оригинал НЕ отталкивается откуда попало: перед разбег-прыжком он смотрит - * на 1–2 тайла вперёд и, если там провал (или пика), подгоняет X так, чтобы - * толчок пришёлся ровно на кромку пола. Иначе прыжок стартует в случайной - * фазе бегового цикла — а запаса у seq_4 почти нет: суммарный dx кадров - * 34..44 равен 62 px при ширине тайла 14, то есть ровно 4 колонки и меньше - * половины тайла сверху. Поэтому без выравнивания провал в ТРИ пустых - * тайла (перелёт с колонки 5 на колонку 1) становится непроходимым — - * BUG-RJUMP-1, уровень 2, комнаты 1 и 9. - * - * Возврат: 1 — прыгать (Char.x уже подогнан), 0 — прыжок ОТМЕНИТЬ. Отмена - * в оригинале НЕ гасит control_up: Кид бежит дальше с зажатой «вверх», и на - * следующем кадре попытка повторяется — так игрок ловит нужную фазу, просто - * удерживая клавишу. */ -uint8_t pop_run_jump_align(void) __banked -{ - int xpos = char_dx_forward(4); - int8_t col = get_tile_div_mod_m7(xpos); - uint8_t tf; - - for (tf = 0; tf < 2; tf++) { - uint8_t t; - col = (int8_t)(col + dir_front[Char.direction + 1]); - t = get_tile(col, Char.curr_row); - if (t != TILE_SPIKE && tile_is_floor(t)) continue; /* тут пол — дальше */ - - { - int adj = distance_to_edge(xpos) + TILE_SIZEX * (int)tf - TILE_SIZEX; - /* Оригинал сравнивает БЕЗЗНАКОВО: - * if ((word)adj < (word)-8 || adj >= 2) { if (adj < 128) return; adj = -3; } - * что означает ровно «adj НЕ попал в [-8,-1] → прыжка нет». - * Ветка с adj = -3 недостижима: distance_to_edge ∈ [0,13] и - * tf ∈ {0,1} дают adj ∈ [-14,13], а туда нужно adj >= 128. */ - if (adj < -8 || adj > -1) return 0; - Char.x = (uint8_t)char_dx_forward((int8_t)(adj + 4)); - } - break; - } - return 1; -} - -/* Стена впереди достаточно близко для стопа бега? Детект (без сдвига — - * позицию держит check_bumped=in_wall). d<=2: передний край почти у грани. */ -int pop_wall_ahead(void) __banked -{ - int d = pop_edge_distance(); - return (g_edge_type == EDGE_WALL && d <= 2); -} - -/* ---- Вис (control_hanging из seg005) — тайловые решения ------------ * - * Управление держится в pop_ctrl (control_*), сюда вынесены только - * тайловые предикаты + выбор seq (+ выравнивание Char.x). */ - -/* grab_timer истёк — можно подтягиваться? */ -uint8_t pop_hang_grab_ready(void) __banked { return grab_timer == 0; } - -/* can_climb_up (seg005:09DF): тайл над персонажем — обычный подъём (seq_10) - * либо подъём к ЗАКРЫТОЙ калитке/зеркалу/чомперу (seq_73 = «влез и съехал - * обратно»). Для ворот условие включает ОТКРЫТОСТЬ: - * curr_tile2 == tiles_4_gate && direction != right && modif >> 2 < 6 - * — под поднятой решёткой (modif >> 2 >= 6) подъём обычный. Без проверки - * модификатора Kid срывался и с открытых ворот. */ -uint8_t pop_hang_climb_up_seq(void) __banked -{ - uint8_t t = get_tile_above_char(); - if (((t == TILE_MIRROR || t == TILE_CHOMPER) && Char.direction == 0) || - (t == TILE_GATE && Char.direction != 0 && - (uint8_t)(gate_modif(Char.curr_col, (int8_t)(Char.curr_row - 1)) >> 2) < 6)) - return SEQ_73_CLIMB_UP_TO_GATE; - return SEQ_10_CLIMB_UP; -} - -/* Shift в висе: 1 = висит у стены/двери (caller играет seq_25); -1 = - * сорваться (hang_fall); 0 = сверху пол, остаётся висеть (ничего). */ -int8_t pop_hang_wall(void) __banked -{ - uint8_t t = get_tile_at_char(); - if (Char.action != ACT_HANGSTRAIGHT && - (t == TILE_WALL || - (Char.direction < 0 && (t == TILE_DOORTOP_FLOOR || t == TILE_DOORTOP)))) - return 1; - if (!tile_is_floor(get_tile_above_char())) - return -1; - return 0; -} - -/* hang_fall (seg005:0A46): сорваться. Нет пола ни сзади, ни под - * персонажем — seq_23 (отпустить и падать); иначе прижать к стене (-7) - * и seq_11 (встать, конец спуска). Меняет Char.x, возвращает seq. */ -uint8_t pop_hang_fall_seq(void) __banked -{ - uint8_t behind = get_tile_behind_char(); - uint8_t at; - if (!tile_is_floor(behind) && !tile_is_floor(get_tile_at_char())) - return SEQ_23_RELEASE_LEDGE_FALL; - at = get_tile_at_char(); - if (at == TILE_WALL || - (Char.direction < 0 && (at == TILE_DOORTOP_FLOOR || at == TILE_DOORTOP))) - Char.x = (uint8_t)char_dx_forward(-7); - return SEQ_11_RELEASE_LEDGE_LAND; -} - -/* down_pressed (seg005:04C7) tile-часть: 1 = обработано (НЕ приседать — - * либо спуск seq_68 через зацеп, либо отступ от передней кромки), 0 = - * приседать. Меняет Char.x. Kid развёрнут от края (край сзади) у кромки - * пола + под соседним тайлом есть за что зацепиться → спуск на этаж вниз. */ -/* Ветка «войти в дверь уровня» из up_pressed (seg005:0482) вместе с - * go_up_leveldoor (seg005:0574). Дверь рядом и открыта → поставить Кида в - * проём, вернуть 1 (последовательность seq_70 ставит вызывающий — это его - * слой); иначе 0 и Кид не тронут. - * - * Геометрию персонажа меняем в Kid, а НЕ в Char: окно Char вокруг - * диспетчера возвращает назад ТОЛЬКО curr_seq и sword - * (pop_savekid_state), поэтому во всём порте позицию правит pop_map — как - * в pop_down_action и pop_jump_up_seq. Запись в Char.x/Char.direction - * отсюда молча теряется (проверено: Кид уходил из проёма влево). - * - * Порядок проб как в оригинале и с той же семантикой `else if`: берём - * ПЕРВУЮ клетку, в которой стоит дверь (под персонажем → за спиной → перед - * лицом), и уже её проверяем на открытость — а не ищем «первую открытую». - * - * Открытость: `modifier >= 42`, то есть створка доехала до верха. Это - * ветка fix_exit_door, а не ванильный глобал leveldoor_open: с ванильным - * условием в дверь можно войти, пока она ещё ползёт вверх, и персонаж - * проходит сквозь опущенную створку. - * - * Стартовая комната исключена (`level.start_room != drawn_room`): в первой - * комнате уровня дверь — та, через которую вошли, и обратно в неё нельзя. */ -uint8_t pop_leveldoor_enter(void) __banked -{ - int8_t cols[3]; - uint8_t i; - - if (pop_level_start_room() == g_room) return 0; - - cols[0] = Char.curr_col; - cols[1] = (int8_t)(dir_behind[Char.direction + 1] + Char.curr_col); - cols[2] = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - for (i = 0; i < 3; i++) { - if (get_tile(cols[i], Char.curr_row) != TILE_LEVELDOOR_LEFT) - continue; - /* дверь найдена — дальше решает только её modif (см. выше) */ - if (cols[i] < 0 || cols[i] > 9) return 0; /* дверь в шве: не наша */ - if (pop_trob_modif(g_room)[Char.curr_row * 10 + cols[i]] < 42) - return 0; - /* go_up_leveldoor (seg005:0574): встать РОВНО в проём и развернуться - * ВЛЕВО. Направление тут не косметика: все DX последовательности - * seq_70 ОТРИЦАТЕЛЬНЫЕ (−5,−4,−4,−2,−3,−1,−3,−1,−2), а - * char_dx_forward при взгляде влево меняет им знак — то есть именно - * dir_FF_left и гонит персонажа ВПРАВО-ВВЕРХ по лестнице. При - * взгляде вправо тот же seq уводит его влево, ИЗ проёма. */ - Char.x = (uint8_t)(pop_x_bump[cols[i] + FIRST_ONSCREEN_COLUMN] + 10); - Char.direction = -1; - return 1; - } - return 0; -} - -uint8_t pop_down_action(void) __banked -{ - if (!tile_is_floor(get_tile_infrontof_char()) && distance_to_edge_weight() < 3) { - Char.x = (uint8_t)char_dx_forward(5); /* у передней кромки — отступ */ - determine_col(); - return 1; - } - if (!tile_is_floor(get_tile_behind_char()) && distance_to_edge_weight() >= 8) { - uint8_t through = get_tile_behind_char(); - get_tile_at_char(); /* g_curr_tile = под персонажем */ - /* seg005:482: спуск с тайла-ворот лицом ВЛЕВО запрещён только пока они - * ЗАКРЫТЫ (modif >> 2 < 6); под поднятой решёткой спуск обычный. */ - if (can_grab(through) && - (Char.direction >= 0 || get_tile_at_char() != TILE_GATE || - (uint8_t)(gate_modif(Char.curr_col, Char.curr_row) >> 2) >= 6)) { - Char.x = (uint8_t)char_dx_forward((int8_t)(distance_to_edge_weight() - 9)); - pop_char_set_seq(SEQ_68_CLIMB_DOWN); - return 1; - } - } - return 0; -} - -/* ---- Предметы: меч (seg005 check_get_item/get_item + seg006 do_pickup/ - * proc_get_object) --------------------------------------------------- * - * pop_have_sword — порт глобала have_sword: «меч у Кида». Боевой режим - * (стойка с мечом, бой) НЕ реализован и здесь не нужен: сиквенс подъёма - * seq_91 сам заканчивается убиранием меча в ножны (кадры 230..240 sheathe) - * и возвратом в обычную стойку — как в оригинале до встречи со стражем. */ -uint8_t pop_have_sword; -uint8_t pop_item_taken; /* 0 = нет; иначе tilepos+1 поднятого */ -uint8_t pop_flash_time; /* кадров вспышки фона (flash_time) */ -/* Цвет вспышки: 0 = ярко-жёлтая (меч), 1 = красная (зелье). В оригинале это - * flash_color; нам хватает двух значений, которые реально встречаются. */ -uint8_t pop_flash_color; -static int8_t pickup_obj_type; /* -1 = меч (порт pickup_obj_type) */ - -/* do_pickup (seg006:1671): стереть предмет с карты (тайл → пол) и запомнить - * тип; сам эффект применяет опкод GET_ITEM внутри сиквенса. */ -static void do_pickup(int8_t obj_type, uint8_t tilepos) -{ - pickup_obj_type = obj_type; - g_fg[tilepos] = TILE_FLOOR; - /* ...и В ДАННЫХ УРОВНЯ тоже, ПРЯМО СЕЙЧАС. У оригинала curr_room_tiles — - * это сама таблица уровня, так что `= tiles_1_floor` (seg006:1671) виден - * всем в тот же миг; у нас fg живёт в двух местах (буфер отрисовки g_fg - * и EMM-страница уровня), и раньше страницу правил главный цикл — ПОЗЖЕ - * в кадре, уже после pop_process_trobs. - * - * Из-за этого зазора trob поднятого зелья успевал проснуться: код тайла - * он читает из страницы уровня, там ещё зелье — и animate_potion крутил - * фазу пузырька поверх только что обнулённого модификатора, - * bubble_next_frame(0) = 1. Модификатор оставался ЕДИНИЦЕЙ навсегда - * (room_modif персистентен), а для ПОЛА в паласе modif 1 означает «узор - * не рисовать» (seg008:499, `if (num == !!level_type) return`) — синяя - * лента пропадала на месте выпитого зелья и не возвращалась даже после - * полной перерисовки комнаты (BUG-POTION-STRIPE). Теперь тайл в - * странице — пол сразу, trob того же кадра уходит в default и снимается - * (type = −1), модификатор остаётся нулём. То же лечит и меч: там - * animate_sword делал `--mod[tp]` из нуля и получал 255. */ - pop_level_set_tile(g_room, tilepos, TILE_FLOOR); - /* curr_room_modif[curr_tilepos] = 0 (seg006:1676): у зелья в модификаторе - * лежал тип+фаза пузырька, у меча — счётчик блеска. Тайл стал полом — - * мусор в модификаторе не нужен (в исходное его вернёт только рестарт). */ - { - uint8_t *m = pop_trob_modif(g_room); - if (m) m[tilepos] = 0; - } - pop_item_taken = (uint8_t)(tilepos + 1); -} - -/* proc_get_object (seg006:16CB): эффект поднятого предмета. Зовётся из - * play_seq по опкоду SEQ_GET_ITEM с аргументом 1 (pop_kid). - * - * ПЕРВАЯ СТРОКА ОРИГИНАЛА — `if (Char.charid != charid_0_kid || ...) return`: - * предмет ЗАБИРАЕТ любой персонаж (тайл стирает do_pickup), а ЭФФЕКТ - * достаётся только Киду. На этом стоит всё спецсобытие уровня 5: тень - * выпивает зелье, оно исчезает — и не достаётся никому. Без проверки - * hitp_delta уходил бы Киду, то есть тень его лечила бы (найдено при - * портировании L5-SHADOW 2026-08-11, до живого прогона). */ -void pop_proc_get_object(void) __banked -{ - if (Char.charid != CHARID_0_KID) return; - if (pickup_obj_type == -1) { - pop_have_sword = 1; /* в оригинале have_sword = -1 */ - pop_sfx_play(37); /* победный трек «меч найден» */ - /* Вспышка фона: flash_color = color_14_brightyellow, flash_time = 8 - * (seg006 proc_get_object). do_flash = set_bg_attr(0, color) — - * оригинал подменяет НУЛЕВУЮ запись палитры, т.е. вспыхивает всё - * чёрное поле экрана. У нас так же (gfx_pal_set 0), см. roomtest. */ - pop_flash_time = 8; - } - else { - /* proc_get_object (seg006:1927), ветка зелий. Типы 3/4/6 - * (перо/переворот/открыть все ворота) — свойства поздних уровней, - * их портируем вместе с этими уровнями. */ - switch (pickup_obj_type) { - case 1: /* здоровье: +1 HP, красная вспышка */ - if (hitp_curr != hitp_max) { - pop_sfx_stop(); /* seg006:1871 — stop_sounds */ - pop_sfx_play(33); - hitp_delta = 1; - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 2; - } - break; - case 2: /* большая склянка: +1 к ПОТОЛКУ HP */ - pop_sfx_stop(); /* seg006:1878 — stop_sounds */ - pop_sfx_play(30); - pop_kid_add_life(); - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 4; /* seg006:1878 — вспышка длиннее */ - break; - case 3: /* ПЕРО: медленное падение */ - /* feather_fall (seg000:15F8): взвести эффект + ЗЕЛЁНАЯ вспышка - * на 3 кадра (flash_color = 2). Оригинал здесь же глушит звуки - * и играет sound_39_low_weight — по нему же меряет срок; у нас - * срок задан кадрами (POP_FEATHER_FRAMES). */ - pop_feather = POP_FEATHER_FRAMES; - pop_sfx_stop(); - pop_sfx_play(39); /* «низкий вес» — весь эффект */ - pop_flash_color = POP_FLASH_GREEN; - pop_flash_time = 3; - break; - case 4: /* ПЕРЕВОРОТ: картинка вверх ногами */ - /* toggle_upside (seg000:15E9): ВЕСЬ эффект — инверсия флага и - * пометка «перерисовать, потому что перевернулись». Ни вспышки, - * ни звука, ни урона у этой ветки нет (seg006:1885). Сам - * переворот уже нарисованного делает приложение - * (pop_flip_screen, roomtest_cold.c). */ - pop_upside_want = (uint8_t)!pop_upside_want; - pop_upside_dirty = 1; - break; - case 5: /* «злое» зелье (синее): −1 HP */ - /* seg006:1892. Своей вспышки у этой ветки НЕТ (в отличие от - * лечебных): красный кадр даёт общий механизм «Кид ранен» - * (flash_if_hurt, seg003:0AFC) — у нас pop_kid_hurt. Раньше мы - * ставили вспышку руками, то есть красили экран дважды. - * Level 15/copy protection отсутствует, поэтому синие склянки - * всегда забирают ровно одну единицу здоровья. */ - pop_sfx_stop(); /* seg006:1893 — stop_sounds */ - pop_sfx_play(13); - hitp_delta = -1; - break; - default: /* 6 «открыть все ворота» — TODO - * вместе с его уровнем (13) */ - break; - } - } - pickup_obj_type = 0; -} - -/* check_get_item + get_item (seg005:061F/073E). Возврат: 0 — предмета нет - * (управление идёт обычной веткой); 1 — присесть (caller зовёт crouch()); - * 2 — поднять меч (caller ставит seq_91). */ -uint8_t pop_get_item_action(void) __banked -{ - uint8_t t; - int8_t icol; - t = get_tile_at_char(); - if (t == TILE_POTION || t == TILE_SWORD) { /* стоим НА предмете */ - if (!tile_is_floor(get_tile_behind_char())) return 0; - Char.x = (uint8_t)char_dx_forward(-TILE_SIZEX); /* отступить на тайл */ - determine_col(); - } - t = get_tile_infrontof_char(); /* заодно ставит g_infrontx */ - if (t != TILE_POTION && t != TILE_SWORD) return 0; - icol = g_infrontx; - if (icol < 0 || icol > 9) return 0; /* предмет за швом — не наш */ - if (Char.frame != FRAME_109_CROUCH) { - /* Ещё стоим: подровняться к предмету и присесть. */ - int d = pop_edge_distance(); /* ставит g_edge_type */ - if (g_edge_type != EDGE_FLOOR) - Char.x = (uint8_t)char_dx_forward((int8_t)d); - if (Char.direction >= 0) - Char.x = (uint8_t)char_dx_forward((int8_t)((t == TILE_POTION) - 2)); - return 1; - } - { - uint8_t tp = (uint8_t)(Char.curr_row * 10 + icol); - if (t == TILE_SWORD) { - do_pickup(-1, tp); - return 2; /* поднять меч (seq_91) */ - } - /* Зелье: тип лежит в СТАРШИХ битах модификатора (get_item, - * seg005: do_pickup(curr_room_modif[curr_tilepos] >> 3)). */ - do_pickup((int8_t)(pop_trob_modif(g_room)[tp] >> 3), tp); - return 3; /* пить (seq_78) */ - } -} - -/* Спецсобытие уровня 12 «появление плит» (seg006:1063, ветка внутри - * check_on_floor). После слияния с тенью (pop_united_shadow == −1) в - * верхнем ряду комнат 2 и 13 пропасти становятся проходимыми: персонаж, - * который ДОЛЖЕН БЫЛ провалиться, вместо этого достраивает под собой пол. - * Плита появляется ровно под ним, шаг за шагом — это не «включили этаж», а - * дорожка, возникающая под ногами. - * - * Возврат 1 = «пол появился, падать не надо». Перерисовываем сам тайл и - * соседа справа на ОБЕИХ страницах — тем же приёмом, что pop_skel_wake_tile - * (у оригинала это пара set_redraw_full/set_wipe на curr_tilepos и +1). - * - * Комната берётся РЕЗОЛВНУТОЙ (tile_room_of): персонаж может стоять в шве, - * и тогда пол обязан появиться в соседней комнате, как и у оригинала — - * там get_tile переставляет curr_room/curr_tilepos до присваивания. */ -#define HIDDEN_FLOOR_ROOM_A 2 -#define HIDDEN_FLOOR_ROOM_B 13 -#define HIDDEN_FLOOR_COL_B 6 /* в комнате 13 — только правая половина */ - -static uint8_t floors_appear(void) -{ - uint8_t room, tp; - if (pop_current_level != SHADOW_FIGHT_LEVEL) return 0; - if (pop_united_shadow >= 0) return 0; /* только ПОСЛЕ слияния */ - if (Char.curr_row != 0) return 0; - if (Char.room != HIDDEN_FLOOR_ROOM_A && - !(Char.room == HIDDEN_FLOOR_ROOM_B && Char.curr_col >= HIDDEN_FLOOR_COL_B)) - return 0; - room = tile_room_of(Char.curr_col, Char.curr_row, &tp); - if (!room) return 0; - pop_level_set_tile(room, tp, TILE_FLOOR); - if (room == g_room) { - g_fg[tp] = TILE_FLOOR; - pop_set_redraw(tp, POP_RD_FLOOR, 2); - if ((tp % 10) < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_FLOOR, 2); - } - return 1; -} - -/* ---- Диспетчер ----------------------------------------------------- */ -static void check_on_floor(void) -{ - if (kid_cur_flags() & FRAME_NEEDS_FLOOR) { - if (get_tile_at_char() == TILE_WALL) - in_wall(); /* забежал в стену -> выровнять */ - if (!tile_is_floor(g_curr_tile) && !floors_appear()) - start_fall(); - } -} - -static void check_action(void) -{ - uint8_t action = Char.action, frame = Char.frame; - /* Зацеп прямо в прыжке (улучшение SDLPoP, seg006:0914) — ДО всего - * остального: если получилось, кадр уже сменён на вис. */ - if (POP_ENABLE_JUMP_GRAB && action == ACT_RUNJUMP && - pop_ctrl_shift_held() && check_grab_run_jump()) - return; - if (action == ACT_BUMPED || action == ACT_HANGSTRAIGHT) { - /* ТОЛЬКО кадр 109 (присед) — как в ванильном seg006:909. Кадры - * вставания 110..119 сюда добавляет ОПЦИОНАЛЬНЫЙ FIX_STAND_ON_THIN_AIR, - * и он состоит из ТРЁХ частей: (1) эта ветка, (2) отмена падения, - * если в 2 px позади ещё пол (seg006:1079), (3) ПРАВКА seqtbl — - * dx(1)→dx(0) и dx(−4)→dx(−3) в standup. У нас seqtbl извлечён из - * данных оригинала, третью часть не применить, а без неё вставание - * уносит весовую точку на 4 px вперёд — в стену. Именно половинчатый - * порт этого фикса ронял Кида сквозь пол: комната 5, приземление с - * уроном на щебень (2,7) у стены (2,8), вставание → колонка 8 = стена - * → start_fall → выпадение в комнату 6 (BUG-STANDUP-1). Ванильное - * поведение (кадр 109) от этого свободно; цена — «встать на воздухе» - * у самой кромки, ровно как в оригинале 1989 года. */ - if (frame == 109) - check_on_floor(); - } else if (action == ACT_FREEFALL) { - do_fall(); - } else if (action == ACT_MIDAIR) { - /* Кадры 102..105 — НАЧАЛО падения (seg006:0619). Здесь fall_y ещё - * не разгоняется (fall_accel работает только в ACT_FREEFALL), то есть - * это САМОЕ ШИРОКОЕ окно зацепа: ветка стояла заглушкой, и первые - * четыре кадра падения зацеп не работал вовсе — отсюда «иногда - * цепляется, иногда нет» на входе в уровень 7. */ - if (frame >= 102 && frame < 106) - check_grab(); - } else if (action != ACT_HANGCLIMB) { - check_on_floor(); - } -} - -/* bumped_fall (seg004:0522): удар, когда под персонажем НЕ пол ИЛИ он высоко - * над полом — отскок назад и падение (seq_45). В свободном падении сиквенс - * не меняем, только гасим горизонтальную составляющую. */ -static void bumped_fall(void) -{ - Char.x = (uint8_t)char_dx_forward(-4); - if (Char.action == ACT_FREEFALL) { - Char.fall_x = 0; - } else { - pop_char_set_seq(SEQ_45_BUMPFALL); - play_seq(); - } - /* bumped_sound (seg004:05F1) — ВНЕ ветвления, как в оригинале: удар о - * стену слышен и в свободном падении. Флаг «Кид нашумел» взводится - * вместе со звуком — см. BUG-GUARD-DEAF-1. */ - pop_sfx_play(8); - is_guard_notice = 1; -} - -/* bumped_floor (seg004:053B): удар о стену, когда под персонажем ПОЛ. - * Портируется целиком — раньше у нас был только хвост (seq_47), из-за чего - * терялись ДВЕ вещи: прижатие Y к полу и «жёсткий» вариант удара. Симптом - * (комната 5, прыжок в решётку): standjump бампится на кадре 25 — том самом, - * где сиквенс уже сделал dy(−6), а парного dy(+6) ещё не было, — и Kid - * оставался стоять на 6 пикселей ВЫШЕ пола, без приземления-приседания. */ -static void bumped_floor(void) -{ - uint8_t frame; - /* Оригинал сравнивает БЕЗЗНАКОВО: если персонаж НИЖЕ уровня пола, - * разность заворачивается в большое число и тоже даёт «падать». */ - if ((uint16_t)(pop_y_land[Char.curr_row + 1] - (int16_t)Char.y) >= 15) { - bumped_fall(); /* высоко над полом — в воздухе */ - return; - } - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; /* ПРИЖАТЬ к полу */ - if (Char.fall_y >= 22) { /* влетел быстро — только отжать */ - Char.x = (uint8_t)char_dx_forward(-5); - return; - } - Char.fall_y = 0; - /* `if (Char.alive)` (seg004:0520) — у ЖИВОГО (alive = −1) сиквенс удара - * ставится ВСЕГДА, даже если персонаж уже в отскоке. Раньше здесь стоял - * наш guard `if (Char.action == ACT_BUMPED) return;` («не рестартить») — и - * он был корнем BUG-STANDUP-1: - * 1) вставание из приседа (medland) двигает Кида на 1 px в стену — - * срабатывает бамп; - * 2) bumped_floor ПРИЖИМАЕТ y к полу (181), отменяя dy(−2), который - * medland сделал в начале; - * 3) наш guard возвращает управление, medland продолжается и делает - * свои dy(+1), dy(+1) — теперь уже ОТ уровня пола, то есть Кид - * оказывается НИЖЕ пола (y = 182); - * 4) следующий бамп видит «персонаж ниже пола» (беззнаковая разность - * заворачивается) и уводит его в bumped_fall → seq_45 → выпадение - * в комнату снизу. - * У оригинала шага (3) нет: seq_47 обрывает medland, и лишних dy не - * случается. */ - if (!Char.alive) return; /* труп — только выравнивание */ - frame = Char.frame; - /* Кадры прыжков и начала падения — «жёсткий» удар с приседанием - * (24/25 = standjump, 40..42 = runjump, 102..106 = start_fall). */ - if (frame == 24 || frame == 25 || (frame >= 40 && frame < 43) || - (frame >= 102 && frame < 107)) - pop_char_set_seq(SEQ_46_HARDBUMP); - else - pop_char_set_seq(SEQ_47_BUMP); - play_seq(); - pop_sfx_play(8); /* bumped_sound (seg004:05F1) */ - is_guard_notice = 1; -} - -/* bump_into_opponent (seg003:08AA). Зовётся из play_kid_frame (seg000:1238) - * между set_char_collision и check_collisions, и ТОЛЬКО у Кида — у стража - * этой ветки нет (см. комментарий к guard_phys ниже). - * - * ЗАЧЕМ. Это единственная защита оригинала от «вошёл в комнату — сразу - * труп». Стража при входе никуда не отбрасывает: enter_guard (seg002:0112) - * ставит его ровно в его тайл из данных уровня, и Кид вполне может войти - * вплотную. Спасает то, что БЕЗОРУЖНЫЙ Кид, столкнувшись с вооружённым - * соперником лицом к лицу, не получает укол, а ОТСКАКИВАЕТ (seq_47). - * Остальные три страховки у нас уже есть: Кид сам достаёт меч - * (control_standing, pop_ctrl.c), страж поднимается в стойке покоя с мечом - * в ножнах (pop_guard_cold.c) и не колет ближе 12 (guards.c). - * - * Расхождений с оригиналом нет. Опциональные фиксы SDLPoP - * (fix_painless_fall_on_guard — падение на стража с высоты перестаёт быть - * безболезненным; fix_jumping_over_guard — нельзя перепрыгнуть) намеренно НЕ - * портированы: базовое поведение движка 1989 года. */ -static void bump_into_opponent(void) -{ - int16_t distance; - if (can_guard_see_kid < 2) return; - if (Char.sword != 0) return; /* Кид уже в боевой стойке */ - if (Opp.sword == 0) return; /* у соперника меч в ножнах */ - if (Opp.action >= 2) return; /* только stand / run_jump */ - if (Char.direction == Opp.direction) return; /* должны быть лицом к лицу */ - distance = pop_char_opp_dist(); - if (distance < 0) distance = -distance; - if (distance > 15) return; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; - pop_sfx_play(16); /* seg003:0654 — толчок о стража */ - pop_char_set_seq(SEQ_47_BUMP); - play_seq(); -} - -/* ---- check_collisions (seg004:0004) -------------------------------- * - * ПОЛНЫЙ порт: флаги перекрытия считаются для ВСЕХ колонок ряда, а колонка - * удара выбирается обходом 9→0 по переходу флага 0→1. - * - * ПОЧЕМУ НЕ «колонка переднего края» (как было до 2026-08-03, BUG-COLL-1): - * колонка края попадает на стену лишь пока край внутри её габаритного окна, - * а окно узкое. Для решётки в col9 (x_bump[14]=184, coll_left=191, левая - * грань 191+10=201) это ровно 201..204 — четыре пикселя. Беговой кадр - * сдвигает край больше чем на четыре, край перескакивает с ≤200 сразу на - * ≥205 (это уже колонка 10, соседняя комната, не стена) — бампа нет, а - * check_leave тут же видит char_x_right ≥ 201 и уводит Кида СКВОЗЬ - * ЗАКРЫТУЮ РЕШЁТКУ. Флаг колонки 9 в оригинале взводится при любом - * перелёте, потому что сравнивается не колонка края, а КООРДИНАТЫ: - * 0x0F = left_wall_xpos < char_x_right_coll («в левую грань стены») - * 0xF0 = right_wall_xpos > char_x_left_coll («в правую грань») - * Тем же корнем лечится влёт в стену на длинном прыжке (комн. 6) и провал - * сквозь пол после приземления у стены (комн. 5). - * - * ТРИ РЯДА — как в оригинале (было: один, и это оказалось BUG-JUMPWALL-1). - * Оригинал каждый кадр считает флаги для рядов row−1, row, row+1, а - * move_coll_to_prev (seg004:00DF) в начале СЛЕДУЮЩЕГО кадра выбирает из них - * тот, что соответствует ряду прошлого кадра. Так «прошлые» флаги остаются - * настоящими и на кадре смены ряда. - * - * Наш прежний упрощённый вариант (prev = 3 = «уже перекрывал») подавлял бамп - * ровно на этом кадре — а в падении ряд меняется чуть ли не каждый кадр, и - * переход 0→1 на стене приходится как раз на него. Симптом: недолетевший - * прыжок уходит СКВОЗЬ кладку по свободной траектории (ур. 3 комн. 14). - * Цена трёх рядов — 3×14 get_tile на кадр вместо 14; замерено, что это - * дешевле любого из обходных вариантов, а поведение совпадает с оригиналом. - * - * Ряды вне комнаты (−1 и 3) считаются штатно: get_tile сам резолвит ряд −1 - * через комнату сверху (g_above), а ряд 3 отдаёт WALL — то же «через край - * не бампим», что и раньше. */ -/* Колонки считаем от −2 до 11, а не 0..9: колонки за швом — это тайлы - * СОСЕДНЕЙ комнаты (get_tile резолвит их через g_lcol/g_rcol), и решётка - * соседа обязана бампить так же, как своя (иначе Kid уходит сквозь - * закрытые ворота шва — старый BUG-SEAM-PINGPONG). Оригинал делает то же - * самое: get_row_collision_data идёт от col(char_x_left)−1 до - * col(char_x_right)+2 и резолвит комнату через find_room_of_tile, а - * координата грани (coll_tile_left_xpos) остаётся в системе ОТРИСОВАННОЙ - * комнаты — как у нас pop_x_bump[col + FIRST_ONSCREEN_COLUMN]. */ -#define COLL_C0 (-2) /* первая считаемая колонка */ -#define COLL_N 14 /* колонки −2..11 */ -#define COLL_IDX(c) ((c) - COLL_C0) -#define COLL_ROW_NONE ((int8_t)-128) -static uint8_t coll_prev[COLL_N], coll_curr[COLL_N]; -static uint8_t coll_above[COLL_N], coll_below[COLL_N]; -static int8_t coll_prev_row = COLL_ROW_NONE; /* ряд, к которому относится coll_prev */ -/* ОКНО перебора: какие слоты реально посчитаны. Оригинал (seg004:0047) тоже - * считает не всю комнату, а полосу вокруг персонажа — left_checked_col / - * right_checked_col; прочие слоты у него помечены «комнаты нет» - * (row_coll_room_ptr = −1) и в цикл бампа не попадают. - * - * Раньше мы считали все четырнадцать колонок, чтобы не заводить признак - * годности слота. Замер по сгенерированному асму показал, чего это стоит: - * ~940 тактов на колонку (из них 574 — get_tile), 3 ряда × 14 = ~39 600 за - * кадр у Кида плюс ~13 200 у стража (check_chomped_guard) — вместе ~12 % - * кадрового периода. Окно из 4–5 колонок режет это втрое. - * - * Признак годности у нас дешевле оригинального: не массив номеров комнат, - * который надо чистить каждый кадр, а ГРАНИЦЫ окна — четыре байта. Слот - * годен, если лежит в окне; сравнивать prev с curr можно только на - * ПЕРЕСЕЧЕНИИ двух окон. Очистки массивов нет вовсе. */ -static int8_t coll_lo, coll_hi; /* окно coll_curr/above/below */ -static int8_t coll_prev_lo, coll_prev_hi; /* окно coll_prev */ -static int8_t win_lo, win_hi; /* результат calc_coll_window */ -/* «нет колонки»: НЕ −1, потому что −1/−2 — законные колонки шва. */ -#define BUMP_NONE ((int8_t)-128) -static int8_t bump_col_l; /* bump_col_left_of_wall (Kid лицом ВПРАВО) */ -static int8_t bump_col_r; /* bump_col_right_of_wall (Kid лицом ВЛЕВО) */ -static int coll_xl, coll_xr; /* char_x_left_coll / char_x_right_coll */ - -/* Ряд, к которому относилась история ДО последней инвалидации — чтобы - * pop_coll_shift мог её восстановить (см. ниже). */ -static int8_t coll_last_row = COLL_ROW_NONE; - -/* Смена комнаты: колонки перепроецированы, прошлые флаги недействительны. - * В оригинале это несовпадение prev_coll_room и curr_row_coll_room — - * на кадре входа бампа нет. Безопасный дефолт для ЛЮБОГО входа в комнату - * (старт уровня, респавн, чит-навигация, переход вверх/вниз); боковой - * переход тут же отменяет его через pop_coll_shift. */ -static void pop_coll_invalidate(void) -{ - coll_last_row = coll_prev_row; - coll_prev_row = COLL_ROW_NONE; -} - -/* БОКОВОЙ переход: историю не выбрасываем, а СДВИГАЕМ (BUG-GATE-PASS-1). - * - * Оригинал (seg004:0004) индексирует флаги колонкой ВНУТРИ разрешённой - * комнаты и хранит рядом номер этой комнаты (row_coll_room_ptr), сравнивая - * prev/curr только при совпадении номеров. Решётка комнаты 8 и до перехода - * 8->6, и после лежит в слоте 9 с room = 8 — история переживает переход, - * переход флага 0->1 виден, bumped() срабатывает. У нас индекс — колонка - * ОТРИСОВАННОЙ комнаты, поэтому тот же тайл менял слот, история терялась, и - * Кид с разбега проходил сквозь закрытые ворота шва. - * - * Физически колонки сдвигаются ровно на 10 (check_leave двигает x на ∓140 = - * 10 тайлов по 14 px), и координата грани (pop_x_bump) сдвигается на те же - * 140 вместе с габаритом Кида — значит САМИ ФЛАГИ инвариантны, меняется - * только их номер слота. Отсюда весь фикс — перенумерация. - * - * Сдвигаем curr/above/below, а не prev: prev на следующем кадре всё равно - * перезапишет move_coll_to_prev, выбирая источник как раз из этих трёх. - * Освободившиеся слоты — 3 («уже перекрывал»), то есть бампа по ним нет: - * ровно то, что в оригинале даёт несовпадение номера комнаты. - * - * dcol — насколько изменились НОМЕРА колонок: уход вправо −10, влево +10. - * Отличия от дословного порта варианта A — applications/PoP/docs/impl_diff.md. */ -static void coll_shift_one(uint8_t *a, int8_t dcol) -{ - int8_t i, j; - if (dcol < 0) { /* источник правее — идём вперёд */ - for (i = 0; i < COLL_N; i++) { - j = (int8_t)(i - dcol); - a[i] = (j < COLL_N) ? a[j] : 3; - } - } else { /* источник левее — идём назад */ - for (i = COLL_N - 1; i >= 0; --i) { - j = (int8_t)(i - dcol); - a[i] = (j >= 0) ? a[j] : 3; - } - } -} - -void pop_coll_shift(int8_t dcol) __banked -{ - if (coll_last_row == COLL_ROW_NONE) return; /* истории и не было */ - coll_prev_row = coll_last_row; /* отменить инвалидацию */ - coll_shift_one(coll_curr, dcol); - coll_shift_one(coll_above, dcol); - coll_shift_one(coll_below, dcol); - /* окно посчитанных слотов едет вместе с ними; выйти за [COLL_C0..] оно - * может свободно — пересечение с окном следующего кадра само обрежет. */ - coll_lo = (int8_t)(coll_lo + dcol); - coll_hi = (int8_t)(coll_hi + dcol); -} - -/* set_char_collision (seg006:0723), горизонтальная часть: габарит персонажа - * в комнатных координатах. char_x_left = obj_x/2 + 58 (минус полуширина при - * взгляде вправо) — это ровно наш char_x_forward_edge для переднего края. */ -static void set_char_collision(void) -{ - int e = char_x_forward_edge(); - int wh = ((int)CD_ACT->fpw + 1) >> 1; /* char_width_half */ - if (Char.direction < 0) { coll_xl = e; coll_xr = e + wh; } - else { coll_xr = e; coll_xl = e - wh; } - if (kid_cur_flags() & FRAME_THIN) { coll_xl += 4; coll_xr -= 4; } -} - -/* move_coll_to_prev (seg004:00DF): в prev кладём флаги ряда, в котором - * персонаж был НА ПРОШЛОМ кадре. Массивы curr/above/below в этот момент - * ещё хранят прошлый кадр, поэтому нужный ряд просто выбирается из них по - * разнице рядов. Условия — дословно оригинальные, включая ±3: ряд может - * «завернуться» при смене комнаты (2 -> 0 вниз, 0 -> 2 вверх), и тогда - * геометрия колонок та же, что у текущего ряда. - * - * Первый кадр (и кадр после смены комнаты, pop_coll_invalidate) прошлого - * ряда не имеет: prev = «уже перекрывал всё», бампа на нём нет. */ -static void move_coll_to_prev(int8_t row) -{ - const uint8_t *src; - /* Окно prev — то, по которому считались curr/above/below (у всех трёх оно - * одно). Забираем ДО того, как check_collisions пересчитает своё. */ - coll_prev_lo = coll_lo; coll_prev_hi = coll_hi; - if (coll_prev_row == COLL_ROW_NONE) { - memset(coll_prev, 3, COLL_N); - coll_prev_lo = COLL_C0; coll_prev_hi = COLL_C0 + COLL_N - 1; - return; - } - if (row == coll_prev_row || row + 3 == coll_prev_row || row - 3 == coll_prev_row) - src = coll_curr; /* ряд не менялся */ - else if (row + 1 == coll_prev_row || row - 2 == coll_prev_row) - src = coll_above; /* поднялся на ряд */ - else - src = coll_below; /* опустился на ряд */ - /* memcpy, а не цикл: SDCC пересчитывал адрес назначения на КАЖДОЙ - * итерации через слот кадра IX — 14 байт обходились в 5 514 тактов. */ - memcpy(coll_prev, src, COLL_N); -} - - -/* Окно перебора (seg004:0047). Считать ПОСЛЕ set_char_collision — берётся из - * coll_xl/coll_xr. Клампы: справа как в оригинале (не дальше последней - * колонки), слева — по нашему COLL_C0 (оригиналу клампить нечего, у него - * индекс приходит уже разрешённым внутрь комнаты). */ -static void calc_coll_window(void) -{ - int8_t hi = (int8_t)(get_tile_div_mod_m7(coll_xr) + 2); - int8_t lo = (int8_t)(get_tile_div_mod_m7(coll_xl) - 1); - if (hi > COLL_C0 + COLL_N - 1) hi = COLL_C0 + COLL_N - 1; - if (lo < COLL_C0) lo = COLL_C0; - if (hi < lo) hi = lo; - win_lo = lo; win_hi = hi; -} - -/* Тело перебора: src — тайлы ряда ПОДРЯД, dst — куда класть флаги. Всё - * остальное вынесено в статики намеренно: у SDCC z80 каждый лишний - * параметр/локал уезжает в кадр IX, а `ld -n(ix)` стоит 19 тактов номинала - * (у нас с wait-state'ами ~46). - * - * Замер одной итерации в MAME: пустая колонка 750 тактов, колонка-стена - * ~1 700 (там две 16-битные знаковые сверки граней). */ -static uint8_t scan_n; /* сколько колонок осталось */ -static uint8_t scan_left; /* левая грань текущей колонки */ - -/* ПОРОГИ СРАВНЕНИЯ, предпосчитанные на кадр (по типу стены 1..5). - * - * В теле цикла стояло `wall_dl[wt] + scan_left < coll_xr` и - * `scan_left - wall_dr[wt] + TILE_RIGHTX > coll_xl` — четыре 16-битных - * операции на КАЖДУЮ колонку, при том что от колонки зависит ровно один - * операнд (scan_left). Переносим всё остальное в порог: - * - * scan_left < coll_xr - wall_dl[wt] = thr_l[wt] - * scan_left > coll_xl + wall_dr[wt] - TILE_RIGHTX = thr_r[wt] - * - * Оригинал считает это в лоб (get_left_wall_xpos / get_right_wall_xpos, - * seg004:0226) — он писался под 386, где 16-битная арифметика бесплатна. - * - * ПОЧЕМУ 8 БИТ КОРРЕКТНЫ (доказательство относится и к границам, и к - * слагаемым в самом цикле). scan_left = x_bump[col + 5] + TILE_MIDX, а - * колонка окна лежит в COLL_C0 .. COLL_C0+COLL_N-1, то есть −2..11: - * значит scan_left ∈ [x_bump[3]+7, x_bump[16]+7] = [37, 219], и после - * последней колонки максимум 233. Ни одного выхода за uint8_t. - * Сами пороги считаются в int и КЛИПУЮТСЯ к 0..255 — это не приближение, - * а точное сохранение результата: при пороге ниже 37 условие «меньше» не - * выполнится никогда (клип к 0 даёт то же), при пороге выше 219 оно - * выполнится всегда (клип к 255 даёт то же), и симметрично для «больше». */ -static uint8_t coll_xr8, coll_xl8; - -static uint8_t clip_thr(int v) -{ - if (v < 0) return 0; - if (v > 255) return 255; - return (uint8_t)v; -} - -/* Две границы персонажа, приведённые к 8 битам. ТАБЛИЦЫ ПОРОГОВ ПО ТИПУ - * СТЕНЫ ЗДЕСЬ БЫЛА И ОКАЗАЛАСЬ ХУЖЕ: предпосчёт пяти пар порогов стоил - * дороже, чем экономил, потому что колонок в окне всего четыре-пять, а - * типов стен пять (замер 2026-08-19: check_collisions 33 846 -> 36 570, - * синяя фаза +10 269). Классическая ошибка — кэшировать больше, чем - * потребляешь. */ -static void coll_thresholds(void) -{ - coll_xr8 = clip_thr(coll_xr); - coll_xl8 = clip_thr(coll_xl); -} - -static uint8_t *scan_dst; - -static void coll_scan(const uint8_t *src) -{ - do { - uint8_t wt = wall_type_tbl[*src++ & 0x1F]; - uint8_t f = 0; - if (wt) { - /* ВСЯ арифметика в 8 битах — см. доказательство диапазонов - * над coll_thresholds: scan_left ∈ [37, 233], wall_dl ∈ [−1, 10], - * wall_dr ∈ [0, 13], значит обе суммы лежат в [36, 246] и - * переполниться не могут. */ - if ((uint8_t)(scan_left + wall_dl[wt]) < coll_xr8) f = 1; - if ((uint8_t)(scan_left - wall_dr[wt] + TILE_RIGHTX) > coll_xl8) f |= 2; - } - *scan_dst++ = f; - scan_left += TILE_SIZEX; - } while (--scan_n); -} - -/* Всё, что НЕ зависит от ряда, считается один раз на кадр. Раньше это жило - * в теле ряда, и пролог одного ряда стоил тысячи тактов при том, что сам - * цикл по четырём-пяти колонкам — около трёх. */ -static uint8_t scan_n0; -static uint8_t scan_left0; -static uint8_t scan_off; /* индекс первого слота в flags[] */ - -static void coll_scan_prepare(void) -{ - scan_left0 = (uint8_t)(pop_x_bump[win_lo + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - scan_n0 = (uint8_t)(win_hi - win_lo + 1); - scan_off = (uint8_t)COLL_IDX(win_lo); - coll_thresholds(); /* здесь же, чтобы порог и окно всегда были от - * ОДНОГО персонажа — та же причина, по которой - * тут считается scan_left0 (см. BUG-GUARD-IX-1 - * в шапке get_row_collision_data). */ -} - -/* Базы ряда: указатели, которые индексируются НОМЕРОМ КОЛОНКИ (в том числе - * отрицательным). Ноль = «этой стороны нет» → стена. Ряд разрешается один - * раз на ряд, а не в каждом get_tile: тот на каждый вызов заново решал «ряд - * −1? за комнатой? слева/справа?» и считал row*10+col сдвигами (1 422 такта - * на вызов при 12-15 вызовах за кадр). */ -static const uint8_t *rb_own, *rb_lft, *rb_rgt; - -/* Ряд, целиком состоящий из стены — для стороны, которой нет (край уровня, - * ряд вне комнаты). Дешевле, чем ветка «а тут стена» внутри цикла. */ -static const uint8_t wall_row[COLL_N] = { - TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL, - TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL -}; - -/* get_row_collision_data (seg004:0185) для одного ряда: бит0 = «персонаж - * достал левую грань стены колонки», бит1 = «правую». Считаем ОКНО - * win_lo..win_hi (см. calc_coll_window), слоты вне окна не трогаем — их - * годность определяют границы окна, а не содержимое. - * - * Окно режется на НЕПРЕРЫВНЫЕ пробеги: комната слева (колонки < 0), своя - * (0..9), справа (> 9). По каждому идёт тот же coll_scan с шагающим - * указателем, поэтому вопрос «а эта колонка чья?» решается по одному разу - * на пробег, а не на колонку. Первая версия собирала тайлы окна во - * временный буфер тернарником на колонку — 1 340 тактов на колонку, вдвое - * дороже самого перебора; у Кида, стоящего в колонке 0, окно начинается с - * −1, так что это был не редкий, а ОБЫЧНЫЙ путь. - * - * scan_left между пробегами не сбрасывается: coll_scan сам двигает его на - * тайл за колонку — ровно как оригинал (coll_tile_left_xpos += TILE_SIZEX). */ -static void coll_row(uint8_t *flags) -{ - int8_t lo = win_lo, last; - uint8_t n; - uint8_t *dst = flags + scan_off; - scan_left = scan_left0; /* coll_scan сам двигает его дальше */ - if (lo < 0) { /* комната СЛЕВА */ - last = win_hi < -1 ? win_hi : -1; - n = (uint8_t)(last - lo + 1); - scan_n = n; /* coll_scan обнулит */ - scan_dst = dst; coll_scan(rb_lft ? rb_lft + lo : wall_row); - dst += n; - lo = (int8_t)(last + 1); - } - if (lo <= win_hi && lo <= 9) { /* СВОЯ комната */ - last = win_hi < 9 ? win_hi : 9; - n = (uint8_t)(last - lo + 1); - scan_n = n; - scan_dst = dst; coll_scan(rb_own ? rb_own + lo : wall_row); - dst += n; - lo = (int8_t)(last + 1); - } - if (lo <= win_hi) { /* комната СПРАВА */ - scan_n = (uint8_t)(win_hi - lo + 1); - scan_dst = dst; coll_scan(rb_rgt ? rb_rgt + lo : wall_row); - } -} - -/* Разрешить ряд «с нуля» — для одиночного вызова (страж, check_chomped_guard). - * В check_collisions три ряда получаются сдвигом баз на ±10 без пересчёта. */ -static void coll_row_bases(int8_t row) -{ - rb_own = rb_lft = rb_rgt = 0; - if (row >= 0 && row <= 2) { - int ro = (int)row * 10; - rb_own = g_fg + ro; - if (g_link_l) rb_lft = g_lcol + ro + 10; - if (g_link_r) rb_rgt = g_rcol + ro - 10; - } else if (row == -1 && g_above && g_link_u) { - rb_own = g_above; /* ряд 2 комнаты сверху */ - } -} - -/* Одиночный ряд во ВНЕШНИЙ массив (единственный вызывающий — - * check_chomped_guard). - * - * coll_scan_prepare() тут ОБЯЗАТЕЛЕН, и это не перестраховка: coll_row - * пишет по `flags + scan_off`, а число байт берёт из win_lo/win_hi. Без - * prepare scan_off/scan_left0 остаются от ПРОШЛОГО окна (его считает - * check_collisions для Кида), а окно тут уже своё, стражево. Когда - * стражево окно шире или правее кидова, запись уезжает за границу - * flags[COLL_N] — а сразу за ней в кадре check_chomped_guard лежит - * СОХРАНЁННЫЙ IX. Затёртый младший байт превращал кадровый указатель - * main (0xBFFA) в 0xBF00, и дальше main читал свои локали из чужого - * стекового мусора: игра «зависала», потому что отладочный `frozen` - * становился ненулевым (BUG-GUARD-IX-1). Заодно чинится и сам расчёт: - * scan_left0 задаёт x колонок, и страж считался по координатам Кида. */ -static void get_row_collision_data(int8_t row, uint8_t *flags) -{ - coll_scan_prepare(); - coll_row_bases(row); - coll_row(flags); -} - -static void check_collisions(void) -{ - int8_t col; - bump_col_l = bump_col_r = BUMP_NONE; - /* seg004:0044 — на кадрах разворота коллизии не считаются вовсе. */ - if (Char.action == ACT_TURN) return; - /* Вне рядов комнаты (падение мимо пола) get_tile отдаёт WALL во всех - * колонках — считать по нему нечего. Стену в падении держит - * do_fall/in_wall, выход из комнаты — check_leave_below. */ - if (Char.curr_row < 0 || Char.curr_row > 2) { - /* И coll_last_row тоже: curr/above/below остались от старого кадра, - * сдвигать их при боковом переходе нечего (поведение как раньше). */ - coll_prev_row = coll_last_row = COLL_ROW_NONE; - return; - } - - pop_dbg_p2(); /* ЗАМЕР: вход в тело */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - set_char_collision(); - pop_dbg_p3(); /* ЗАМЕР: set_char_collision */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - move_coll_to_prev(Char.curr_row); /* заодно снимет окно prev */ - coll_prev_row = Char.curr_row; - calc_coll_window(); - coll_lo = win_lo; coll_hi = win_hi; - coll_scan_prepare(); - pop_dbg_p4(); /* ЗАМЕР: окно посчитано */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Порядок важен: prev уже забран, теперь три ряда пересчитываются - * НА ЭТОТ кадр (в оригинале ровно так же, seg004:0004). Ряд здесь - * гарантированно 0..2, поэтому соседние ряды — это те же базы ±10, без - * повторного разрешения. */ - { - int ro = (int)Char.curr_row * 10; - const uint8_t *own = g_fg + ro; - const uint8_t *lft = g_link_l ? g_lcol + ro + 10 : 0; - const uint8_t *rgt = g_link_r ? g_rcol + ro - 10 : 0; - - rb_own = own; rb_lft = lft; rb_rgt = rgt; - coll_row(coll_curr); - - if (Char.curr_row < 2) { /* ряд ниже */ - rb_own = own + 10; - rb_lft = lft ? lft + 10 : 0; - rb_rgt = rgt ? rgt + 10 : 0; - } else { - rb_own = rb_lft = rb_rgt = 0; /* ряд 3 — стена везде */ - } - coll_row(coll_below); - - if (Char.curr_row > 0) { /* ряд выше */ - rb_own = own - 10; - rb_lft = lft ? lft - 10 : 0; - rb_rgt = rgt ? rgt - 10 : 0; - } else if (g_above && g_link_u) { /* ряд −1 = ряд 2 сверху */ - rb_own = g_above; rb_lft = rb_rgt = 0; - } else { - rb_own = rb_lft = rb_rgt = 0; - } - coll_row(coll_above); - } - pop_dbg_p5(); /* ЗАМЕР: три ряда просканированы */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Обход СВЕРХУ ВНИЗ, как в оригинале (9→0): побеждает МЛАДШАЯ колонка, - * в которой флаг перешёл 0→1. Только по ПЕРЕСЕЧЕНИЮ окон: вне его - * сравнивать нечего (у оригинала там prev_coll_room != curr_row_coll_room - * или curr_row_coll_room < 0 — тот же смысл). */ - { - int8_t lo = coll_lo > coll_prev_lo ? coll_lo : coll_prev_lo; - int8_t hi = coll_hi < coll_prev_hi ? coll_hi : coll_prev_hi; - for (col = hi; col >= lo; --col) { - uint8_t p = coll_prev[COLL_IDX(col)], c = coll_curr[COLL_IDX(col)]; - if (!(p & 1) && (c & 1)) bump_col_l = col; - if (!(p & 2) && (c & 2)) bump_col_r = col; - } - } -} - -/* is_obstacle (seg004:037E): препятствие ли тайл колонки на самом деле. - * Побочно оставляет тайл в g_curr_tile (как curr_tile2 у оригинала). */ -static uint8_t is_obstacle_at_col(int8_t col) -{ - uint8_t t = get_tile(col, Char.curr_row); - if (t == TILE_POTION) return 0; /* зелье не бампит */ - if (t == TILE_GATE) return (uint8_t)!gate_passable(col, Char.curr_row); - if (t == TILE_CHOMPER) /* закрыт только при modif==2 */ - return (uint8_t)(col >= 0 && col <= 9 && - pop_trob_modif(g_room)[Char.curr_row * 10 + col] == 2); - /* Прыжок СКВОЗЬ ЗЕРКАЛО (seg004:0239). Зеркало вообще-то «стена слева» - * (wall_type = 2), но для Кида в БЕГОВОМ ПРЫЖКЕ справа налево оно - * перестаёт быть препятствием: он пролетает насквозь, зеркало «бьётся» - * (modif 0x56) и взводится флаг рождения тени. Условия — все четыре, как - * в оригинале: только Кид, только кадры бегового прыжка 39..43, только - * направление влево. */ - if (t == TILE_MIRROR && Char.charid == CHARID_0_KID && - Char.frame >= 39 && Char.frame < 44 && Char.direction < 0 && - col >= 0 && col <= 9) { - pop_trob_modif(g_room)[Char.curr_row * 10 + col] = 0x56; - pop_jumped_mirror = -1; - return 0; - } - return 1; -} - -/* bumped (seg004:0448). delta_x — сдвиг персонажа В КООРДИНАТАХ (не - * «вперёд»), push_dir — куда толкает: <0 влево, >=0 вправо. Чем кончится - * удар, решает тайл, на котором персонаж оказался после отжатия: сквозь - * стену/верх двери он стоит на СОСЕДНЕЙ клетке (в сторону толчка), для - * прочих препятствий (ворота, зеркало, кусаки) — на клетке препятствия. */ -static void bumped(int delta_x, int8_t push_dir, int8_t tcol) -{ - uint8_t ct; - if (Char.alive >= 0) return; /* труп не бампит */ - Char.x = (uint8_t)((int)Char.x + delta_x); - determine_col(); - ct = g_curr_tile; /* тайл препятствия */ - if (push_dir < 0) { /* толчок ВЛЕВО */ - if (ct == TILE_WALL) - ct = get_tile((int8_t)(tcol - 1), Char.curr_row); - } else { /* толчок ВПРАВО */ - if (ct == TILE_DOORTOP || ct == TILE_DOORTOP_FLOOR || ct == TILE_WALL) - ct = get_tile((int8_t)(tcol + 1), Char.curr_row); - } - if (tile_is_floor(ct)) bumped_floor(); - else bumped_fall(); - determine_col(); -} - -/* check_bumped_look_right (seg004:030A): Kid смотрит ВПРАВО и достал ЛЕВУЮ - * грань стены — отжать влево. */ -static void check_bumped_look_right(void) -{ - int8_t col = bump_col_l; - uint8_t wt; - int coll_left; - if (Char.direction != 0) return; /* (меча в руке у нас нет) */ - if (!is_obstacle_at_col(col)) return; - /* Прежде чем удариться о стену — попытка зацепиться за её верх - * (seg004:0205, то же улучшение). Не вышло — тайл препятствия надо - * перечитать: проба зацепа сбила g_curr_tile. */ - if (POP_ENABLE_JUMP_GRAB && pop_ctrl_shift_held()) { - if (check_grab_run_jump()) return; - if (!is_obstacle_at_col(col)) return; - } - wt = wall_type(g_curr_tile); - if (!wt) return; - coll_left = pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - bumped(wall_dl[wt] + coll_left - coll_xr, -1, col); -} - -/* check_bumped_look_left (seg004:02D2): Kid смотрит ВЛЕВО и достал ПРАВУЮ - * грань стены — отжать вправо. */ -static void check_bumped_look_left(void) -{ - int8_t col = bump_col_r; - uint8_t wt; - int coll_left; - if (Char.direction >= 0) return; - if (!is_obstacle_at_col(col)) return; - if (POP_ENABLE_JUMP_GRAB && pop_ctrl_shift_held()) { /* seg004:0186 */ - if (check_grab_run_jump()) return; - if (!is_obstacle_at_col(col)) return; - } - wt = wall_type(g_curr_tile); - if (!wt) return; - coll_left = pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - bumped(coll_left - wall_dr[wt] + TILE_RIGHTX - coll_xl, 0, col); -} - -/* dist_from_wall_behind (seg004:0607) — зеркало dist_from_wall_forward: та - * же арифметика, но от ЗАДНЕЙ грани габарита (лицом вправо задняя грань — - * левая, и наоборот). Нужна только check_guard_bumped. */ -static int dist_from_wall_behind(uint8_t tiletype, int8_t tcol) -{ - uint8_t type = wall_type(tiletype); - int coll_left; - if (type == 0) return 99; - coll_left = pop_x_bump[tcol + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - if (Char.direction >= 0) /* лицом вправо */ - return coll_xl - (coll_left + TILE_RIGHTX - wall_dr[type]); - return wall_dl[type] + coll_left - coll_xr; /* лицом влево */ -} - -/* check_guard_bumped (seg004:0522) — стражья замена check_bumped, и она - * НЕ про «упереться на бегу»: срабатывает, только когда персонажа с - * ВЫНУТЫМ МЕЧОМ теснят спиной в стену (его собственный шаг назад в бою или - * наступающий Кид). Отсюда и проверки: action = run_jump, жив, меч в руке, - * а расстояние меряется от ЗАДНЕЙ грани. - * - * Порядок проб как в оригинале, включая побочный эффект: если тайл под - * персонажем не подошёл и он смотрит вправо, оригинал перечитывает тайл - * СЛЕВА (`--tile_col`), и дальше is_obstacle/dist_from_wall_behind считают - * уже по нему. */ -static void check_guard_bumped(void) -{ - int8_t col = Char.curr_col, row = Char.curr_row; - uint8_t t, hit; - int delta_x; - - if (Char.action != ACT_RUNJUMP || Char.alive >= 0 || - Char.sword < SWORD_2_DRAWN) return; - - t = get_tile_at_char(); - hit = (uint8_t)(t == TILE_WALL || t == TILE_DOORTOP_FLOOR || - (t == TILE_GATE && !gate_passable(col, row))); - if (!hit && Char.direction >= 0) { - col--; - t = get_tile(col, row); - hit = (uint8_t)(t == TILE_DOORTOP_FLOOR || - (t == TILE_GATE && !gate_passable(col, row))); - } - if (!hit) return; - - set_char_collision(); - if (!is_obstacle_at_col(col)) return; - delta_x = dist_from_wall_behind(g_curr_tile, col); - if (delta_x < 0 && delta_x > -13) { - Char.x = (uint8_t)char_dx_forward(-delta_x); - pop_char_set_seq(SEQ_65_BUMP_FWD_SWORD); - play_seq(); - pop_load_fram_det_col(); - } -} - -/* check_bumped (seg004:029D). */ -static void check_bumped(void) -{ - /* Гарды РОВНО как в оригинале: вис и подтягивание. ПАДЕНИЕ И ПОЛЁТ НЕ - * ИСКЛЮЧЕНЫ — bumped_fall (seg004:04E4) специально разбирает случай - * actions_4_in_freefall (гасит fall_x и отжимает на 4). Наш прежний - * guard `action == FREEFALL || MIDAIR -> return` и был вторым корнем - * BUG-COLL-1: длинный прыжок в стену (комната 6, между (0,6) и (0,7)) - * ничем не останавливался, и Кид оказывался ВНУТРИ кладки. */ - if (Char.action == ACT_HANGCLIMB || Char.action == ACT_HANGSTRAIGHT) return; - if (Char.frame >= 135 && Char.frame < 149) return; /* кадры подъёма/спуска */ - /* Кадры виса 87..99: в спуске (seq_68) кадр frame_91 идёт ДО act(hang_climb), - * т.е. action ещё midair — без этого guard'а bump у стены рвёт цепочку - * hang->hang_fall->seq_11 (правильное приземление). */ - if (Char.frame >= 87 && Char.frame < 100) return; - if (bump_col_l != BUMP_NONE) check_bumped_look_right(); - else if (bump_col_r != BUMP_NONE) check_bumped_look_left(); -} - -/* ---- Loose floors (seg007) ---------------------------------------- * - * Состояние на тайл: 0 = покой; 0x80..0x83 = тряска (do_knock); 1..11 = - * отсчёт до падения (на тайле стоят/пробили). Порт animate_loose/ - * make_loose_fall/check_press. Перерисовка — в pop_bg (shake/bake). */ -uint8_t pop_loose_modif[30]; /* публично: читает pop_bg при отрисовке */ - -/* Гейт холостого хода pop_loose_tick. В подавляющем большинстве кадров - * (и в целых комнатах) НИ ОДНА плита не анимируется, а два цикла по 30 и 10 - * позициям всё равно отрабатывают: замер 11/15 — 9 852 такта на комнату, - * где loose-плит нет вовсе. - * - * Ставится ПРИ ВЗВОДЕ фазы — все ШЕСТЬ мест записи ненулевого значения лежат - * в этом файле (make_loose_fall, ветка потолка в check_press, do_knock для - * обоих рядов, восстановление из room_modif в pop_loose_reset и раздача - * отложенного старта в check_fall_flo — уровень 13). - * - * ИМЕННО ЗДЕСЬ УЖЕ ОШИБЛИСЬ ОДИН РАЗ: check_fall_flo забыли, и каскад - * уровня 13 перестал падать — плиты дрожали и застывали. Добавляя новое - * место записи фазы, добавляй и взвод. Снимает его - * САМ цикл, когда прошёл оба массива и не встретил ни одной ненулевой фазы. - * - * Асимметрия намеренная: ложная единица стоит одного холостого прохода, - * ложный ноль — застывшей навсегда плиты. Поэтому взвод обязан стоять - * рядом с КАЖДОЙ записью, а снятие — только по факту пустого прохода. */ -static uint8_t loose_any; - -/* Плита-ПОТОЛОК: состояние/сигналы — см. объявления перед get_tile. */ - -/* make_loose_fall (seg007:0EF6): взвести отсчёт падения, если ещё не идёт. */ -static void make_loose_fall(int pos, uint8_t modifier) -{ - if (pos < 0 || pos >= 30) return; - if ((g_fg[pos] & 0x1F) != TILE_LOOSE) return; - if ((g_fg[pos] & 0x20)) return; /* «solid» loose — не от шага */ - if ((int8_t)pop_loose_modif[pos] <= 0) { /* покой/тряска, не отсчёт */ - pop_loose_modif[pos] = modifier; - loose_any = 1; - } -} - -/* died_on_button (seg007:0776): на кнопке КТО-ТО УМЕР — эффект становится - * ПОСТОЯННЫМ, а сама кнопка с тайла снимается. - * - * Открывалка превращается в обычный пол с нулевым модификатором, а связь - * дёргается типом «щебень» (TILE_DEBRIS) — у trigger_gate это отдельная - * ветка «открыть насовсем»: недооткрытые ворота получают trob-тип 2, уже - * открытые — modif 0xFF (открыты навсегда). Любая другая кнопка становится - * заклиненной (TILE_STUCK): нажатой она и останется. - * - * ЗАЧЕМ ЭТО ВООБЩЕ НУЖНО. Труп не «держит» кнопку — он её ЛОМАЕТ. Разница - * видна сразу: держал бы — ворота закрылись бы, как только тело убрали или - * уровень перезапустили. У Кида перезапуск всё равно перечитывает тайлы, а - * вот когда на кнопке гибнет СТРАЖ, перезапуска нет и кнопка заклинена до - * конца уровня. - * - * Тайл пишем и в страницу уровня (переживёт выход из комнаты, как do_pickup), - * и в живую g_fg отрисованной комнаты — вместе с пометкой на перерисовку - * своей ячейки и правой (у кнопки и пола разные правые грани). */ -static void died_on_button(uint8_t room, uint8_t tp, uint8_t code) -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t modifier = mod[tp]; /* индекс связи — ДО затирания */ - uint8_t button_type = code; - uint8_t newtile; - if (code == TILE_OPENER) { - newtile = TILE_FLOOR; - mod[tp] = 0; - button_type = TILE_DEBRIS; /* trigger_gate: «открыть насовсем» */ - } else { - newtile = TILE_STUCK; - } - pop_level_set_tile(room, tp, newtile); - if (room == g_room) { - g_fg[tp] = newtile; - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - if (tp % 10 < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_FLOOR, 2); - } - pop_trigger_button(room, tp, button_type, modifier, 1); -} - -/* check_press (seg006:0EC8, упрощ.): Kid стоит на loose → make_loose_fall; - * frame 79 (прыжок вверх) с loose СВЕРХУ → пробить сверху. */ -static void check_press(void) -{ - uint8_t frame = Char.frame, action = Char.action; - uint8_t above_press = 0; /* «нажимается» тайл СВЕРХУ */ - /* Кадры виса (87..99) и начала подъёма (135..140): нажимается тайл, за - * КОТОРЫЙ ПЕРСОНАЖ ДЕРЖИТСЯ, т.е. верхний (seg006:1688). Отсюда падение - * плиты, за край которой Kid зацепился, — а не только той, по которой он - * ударил снизу прыжком (кадр 79). */ - if ((frame >= 87 && frame < 100) || (frame >= 135 && frame < 141)) { - above_press = 1; - } else if (action == ACT_BUMPED || action == ACT_TURN || action < ACT_HANGCLIMB) { - if (frame == 79) above_press = 1; /* прыжок вверх — удар снизу */ - } else { - return; /* seg006:1704 — прочее не жмёт */ - } - if (above_press) { - if (Char.curr_row == 0) { - /* Ряд 0: «сверху» — ряд 2 комнаты СВЕРХУ (в оригинале get_tile с - * row=−1 уходит по links.up, find_room_of_tile seg006:005D). - * Плита-ПОТОЛОК; кнопок на потолке в этом тесте нет. */ - int8_t c = Char.curr_col; - if (g_above && g_link_u && c >= 0 && c <= 9 && - (g_above[c] & 0x1F) == TILE_LOOSE && !(g_above[c] & 0x20) && - (int8_t)pop_ceil_modif[c] <= 0) { - pop_ceil_modif[c] = 1; /* make_loose_fall(1) */ - loose_any = 1; - is_guard_notice = 1; /* seg006:1734 */ - } - } else if (get_tile_above_char() == TILE_LOOSE) { - make_loose_fall((Char.curr_row - 1) * 10 + Char.curr_col, 1); - is_guard_notice = 1; /* seg006:1734 */ - } - return; - } - /* Стояние: кадр обязан требовать пол; нажимается тайл ПОД персонажем. - * ACT_TURN обязателен (seg006:1691): при развороте на кнопке иначе - * trigger_button не зовётся кадр-два → таймер связи падает <2 → кнопка - * ложно отжимается и жмётся снова. */ - if (!(kid_cur_flags() & FRAME_NEEDS_FLOOR)) return; - { - uint8_t t = get_tile_at_char(); - uint8_t tp = 0; - /* Кнопка может лежать в СОСЕДНЕЙ комнате — Кид стоит в шве - * (curr_col = −1 или 10). Комнату и tilepos берём резолвнутые, - * иначе индекс связи читается из чужого тайла (см. tile_room_of). */ - uint8_t btn_room = tile_room_of(Char.curr_col, Char.curr_row, &tp); - if ((t == TILE_OPENER || t == TILE_CLOSER) && btn_room) { - /* seg006:1707 — ЖИВОЙ жмёт кнопку на 5 кадров, МЁРТВЫЙ ломает её - * насовсем. `alive < 0` = жив (соглашение оригинала). */ - if (Char.alive < 0) - pop_trigger_button(btn_room, tp, t, pop_trob_modif(btn_room)[tp], 1); - else - died_on_button(btn_room, tp, t); - } - else if (t == TILE_LOOSE) { - /* loose живёт в СВОЕЙ комнате (make_loose_fall работает с g_fg), - * поэтому здесь по-прежнему координаты персонажа. */ - make_loose_fall((uint8_t)(Char.curr_row * 10 + Char.curr_col), 1); - is_guard_notice = 1; /* seg006:1734 */ - } - } -} - -/* ---- Звук дрожащей плиты (loose_shake, seg007:0E55) ------------------ * - * Три сэмпла 20/21/22 вперемешку, но НЕ на каждый кадр фазы: гейт-таблица - * loose_sound (data:2734) даёт звук на фазах 1,2,3,5,8, а на остальных - * молчит — иначе тряска трещит без пауз. Повтор подряд одного и того же - * сэмпла оригинал запрещает (цикл do/while), иначе слышно «заедание». - * - * Сид СВОЙ, а не общий с trob/боёвкой: домены prandom у нас разведены - * (../docs/impl_diff.md), и звук не должен сдвигать чужие розыгрыши. */ -static const uint8_t loose_sound[12] = { 0,1,1,1,0,1,0,0,1,0,0,0 }; -static pop_rnd_t loose_seed; -static uint8_t last_loose_snd; - -static void loose_shake(uint8_t force, uint8_t modif) -{ - uint8_t id, prev; - - if (!force && !loose_sound[modif & 0x7F]) return; - /* ЗАПИСЬ ДО СРАВНЕНИЯ — обход sdcc_z80_cmp_store_a_bug. - * - * Прежняя запись (`do { id = ... } while (id == last_loose_snd); - * last_loose_snd = id; pop_sfx_play(id);`) собиралась так: - * ld a, e / add a, #0x14 ; A = 20..22, номер сэмпла - * ld hl, #_last_loose_snd - * sub a, (hl) ; A = РАЗНОСТЬ, номер потерян - * ld (_last_loose_snd), a ; сохраняем разность - * jp _pop_sfx_play ; играем разность - * то есть в звук уходил не сэмпл тряски, а id минус предыдущий id. - * Пока такие «номера» попадали в пустые слоты набора, это молчало; - * с приходом музыки мусор вида 22-251 = 27 стал запускать ТРЕК — - * пользователь слышал музыку на прыжке и на падающей плите. */ - prev = last_loose_snd; - for (;;) { - id = (uint8_t)(pop_prandom(&loose_seed, 2) + 20); - last_loose_snd = id; /* store раньше любого сравнения */ - if (id != prev) break; - } - pop_sfx_play(last_loose_snd); /* читаем из памяти, не из A */ -} - -/* do_knock (seg007:0FE0) + loose_make_shake (seg007:0FB4): сотрясение от - * приземления/удара трясёт ВСЕ loose-полы в ряду tile_row (не роняя их — - * modif 0x80..0x83 = чистая тряска, сбрасывается в pop_loose_tick). Трясём - * только из ПОКОЯ (modif==0): если тайл уже дрожит/падает — не перебиваем. */ -static void do_knock(int tile_row) -{ - int col, pos; - /* СПЕЦКЕЙС УРОВНЯ 13 (loose_make_shake, seg007:949): сотрясение НЕ - * трясёт плиты вовсе. Причина та же, что у первого спецкейса: тряска - * ставит фазу 0x80, а на этом уровне у плит уже лежит СВОЙ отложенный - * старт (0xF0..0xFF), и приземление Кида сбросило бы его на 0x80 — - * гряда посыпалась бы разом вместо вразнобой. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) return; - if (tile_row == -1) { /* ряд 2 комнаты сверху — плиты-потолки */ - if (!g_above || !g_link_u) return; - for (col = 0; col < 10; col++) - if ((g_above[col] & 0x1F) == TILE_LOOSE && pop_ceil_modif[col] == 0) { - pop_ceil_modif[col] = 0x80; - loose_any = 1; - } - return; - } - if (tile_row < 0 || tile_row > 2) return; - for (col = 0; col < 10; col++) { - pos = tile_row * 10 + col; - if ((g_fg[pos] & 0x1F) != TILE_LOOSE) continue; - if (pop_loose_modif[pos] == 0) { - pop_loose_modif[pos] = 0x80; - loose_any = 1; - } - } -} - -/* check_knock (seg003:0706): по флагу knock (ставит play_seq на seqtbl- - * командах KNOCK_UP/DOWN) тряхнуть ряд. KNOCK_DOWN (knock=-1, приземление) → - * ряд curr_row; KNOCK_UP (knock=+1) → ряд curr_row-1. */ -void pop_check_knock(void) __banked -{ - if (knock) { - do_knock(Char.curr_row - (knock > 0)); - knock = 0; - } -} - -/* Сдать НЕЗАКОНЧЕННЫЕ loose уходящей комнаты в персистентное хранилище — - * звать ПЕРЕД сменой комнаты, пока g_room/g_fg/g_link_u ещё старые. - * - * pop_loose_modif[30] — фаза тайлов ТЕКУЩЕЙ комнаты, и раньше смена комнаты - * её просто теряла: плита, по которой Кид пробежал и ушёл вправо, оставалась - * целой (уровень 10, комната 2, тайл 2,9). В оригинале терять нечего — - * там loose это trob в общем списке, а фаза лежит в curr_room_modif, то есть - * в самой таблице уровня. Порт того же: фаза уезжает в room_modif (он - * персистентен per-room), а досчитывает её animate_loose в pop_trob.c. - * - * Пишем фазу ВСЕМ loose-тайлам, включая нулевые: room_modif — источник - * истины, а pop_loose_modif лишь его копия на время пребывания в комнате, - * и оставить там прошлое значение значило бы «оживить» уже отдрожавшую - * плиту при следующем входе. trob заводим только на незаконченные. */ -void pop_loose_leave_room(void) __banked -{ - uint8_t *mod; - int i; - if (!g_fg || !g_room) return; - mod = pop_trob_modif(g_room); - if (mod) { - for (i = 0; i < 30; i++) { - if ((g_fg[i] & 0x1F) != TILE_LOOSE) continue; - mod[i] = pop_loose_modif[i]; - if (pop_loose_modif[i]) pop_add_trob(g_room, (uint8_t)i, 0); - } - } - /* Плиты-ПОТОЛКИ — ряд 2 комнаты сверху, tilepos 20+col. */ - if (g_above && g_link_u) { - mod = pop_trob_modif(g_link_u); - if (mod) { - for (i = 0; i < 10; i++) { - if ((g_above[i] & 0x1F) != TILE_LOOSE) continue; - mod[20 + i] = pop_ceil_modif[i]; - if (pop_ceil_modif[i]) - pop_add_trob(g_link_u, (uint8_t)(20 + i), 0); - } - } - } -} - -/* Решётка ворот должна идти ПОВЕРХ персонажа? Порт первого условия - * draw_tile_fore (seg008:0D15): - * - * if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - * Kid.curr_col == drawn_col - 1 && Kid.room != room_R) - * draw_gate_fore(); - * - * То есть: рисуя тайл (row, col), оригинал кладёт бары ворот в FOREtable — - * поверх всего, что уже нарисовано, — если тайл СЛЕВА это ворота и персонаж - * стоит ИМЕННО НА НИХ. Графика ворот принадлежит правому краю своего тайла - * и рисуется в проходе СЛЕДУЮЩЕЙ колонки, отсюда сдвиг на единицу. - * - * Живёт в карте, а не в слое фона, по двум причинам: спрашивает она про - * ТАЙЛ и позицию персонажа (это знание карты), и её линкует хост-харнесс — - * решение проверяется тестом без эмулятора (t_char: gate_fore_over_char). - * Слою фона остаётся только рисование (draw_gate_fore в pop_bg.c). - * - * РАСХОЖДЕНИЕ С ОРИГИНАЛОМ (осознанное, см. docs/impl_diff.md): оригинал - * жёстко спрашивает про Kid, потому что foretable у него ОДНА на проход - * тайлов; у нас fore-проход идёт по персонажу, поэтому спрашиваем про того, - * кого рисуем. Наш вариант — надмножество: страж, стоящий в проёме ворот, - * у нас тоже уходит ЗА решётку, а в оригинале остался бы перед ней. */ -uint8_t pop_gate_over_char(const pop_char_t *ch) __banked -{ - if (!ch || ch->room != g_room) return 0; - if (ch->curr_row < 0 || ch->curr_row > 2) return 0; - /* Колонка 9: бары легли бы в колонку 10, то есть в СОСЕДНЮЮ комнату — - * у оригинала это отсекает `Kid.room != room_R`. */ - if (ch->curr_col < 0 || ch->curr_col > 8) return 0; - return (uint8_t)(get_tile(ch->curr_col, ch->curr_row) == TILE_GATE); -} - -/* СТАРТ/РЕСТАРТ уровня: забыть фазы, НЕ сдавая их в room_modif — в - * оригинале всё состояние сносит сам load_level (seg003:57). Без этого - * pop_loose_leave_room у первого же enter_room занесла бы в только что - * восстановленный уровень дрожь из прошлой жизни: pop_trob_reset уже - * отработал, room_modif свежий, а pop_loose_modif — ещё старый. */ -void pop_loose_forget(void) __banked -{ - int i; - for (i = 0; i < 30; i++) pop_loose_modif[i] = 0; - for (i = 0; i < 10; i++) pop_ceil_modif[i] = 0; -} - -/* Сброс состояния loose (при смене комнаты): pop_loose_modif/bake/rest - * индексируются позицией тайла и не должны утечь из старой комнаты в новую. - * Уже ПАДАЮЩИЕ куски при этом не трогаем — они привязаны к своей комнате и - * должны долететь (do_mobs, seg007:1063; см. pop_loose_mob_room_changed). - * - * Вместо нулей забираем фазу НОВОЙ комнаты из room_modif — обратная - * половина pop_loose_leave_room: расшатанная и брошенная плита, к которой - * Кид вернулся, продолжает дрожать с той же фазы, а не с покоя. trob, - * который крутил её заочно, снимет сам animate_loose (room == cur_room). */ -void pop_loose_reset(void) __banked -{ - uint8_t *mod; - int i; - - mod = g_room ? pop_trob_modif(g_room) : 0; - for (i = 0; i < 30; i++) { - pop_loose_modif[i] = (mod && g_fg && (g_fg[i] & 0x1F) == TILE_LOOSE) - ? mod[i] : 0; - if (pop_loose_modif[i]) loose_any = 1; /* взвод гейта — см. loose_any */ - } - mod = (g_above && g_link_u) ? pop_trob_modif(g_link_u) : 0; - for (i = 0; i < 10; i++) { - pop_ceil_modif[i] = (mod && (g_above[i] & 0x1F) == TILE_LOOSE) - ? mod[20 + i] : 0; - if (pop_ceil_modif[i]) loose_any = 1; /* взвод гейта — см. loose_any */ - /* ...и СНЯТЬ заочный trob: плиту-потолок отсюда снова ведёт - * pop_loose_tick. Без этого её крутили бы ДВОЕ — trob по - * room_modif и мы по pop_ceil_modif, — и она проваливалась бы - * дважды (animate_loose снимает сам только trob'ы cur_room, а - * комната сверху — не cur_room). */ - if (pop_ceil_modif[i]) pop_add_trob(g_link_u, (uint8_t)(20 + i), -1); - } - pop_ceil_fell = 0; - pop_debris_at = 0; - pop_loose_landed = 0; - pop_loose_mob_room_changed(); -} - -/* remove_loose (seg007:0EB8) для ОДНОГО тайла, наружу — ради честного - * loose_fall: падающий кусок сбивает плиту НЕМЕДЛЕННО, в том же кадре - * (pop_room.c, mob_break_loose). Здесь, а не в pop_room, потому что тут - * живут и рабочая копия тайлов комнаты (g_fg), и фазы плит. - * - * Перерисовываем ДВЕ клетки — саму и соседа справа. Передний торец пола - * заезжает в соседний тайл (правая грань соседа всегда в backtable), и без - * второй пометки от исчезнувшей плиты оставался висеть торец: тайл пустой, - * а его передняя грань нарисована. Тем же приёмом, что pop_skel_wake_tile - * и что set_redraw_full+set_wipe на curr_tilepos и curr_tilepos+1 в - * оригинале. */ -void pop_loose_remove(uint8_t room, uint8_t tilepos) __banked -{ - uint8_t *mod = pop_trob_modif(room); - if (tilepos >= 30) return; - if (room == g_room) { - g_fg[tilepos] = TILE_EMPTY; - pop_loose_modif[tilepos] = 0; - pop_set_redraw(tilepos, POP_RD_LOOSE_GONE, 2); - if ((tilepos % 10) < 9) - pop_set_redraw((uint8_t)(tilepos + 1), POP_RD_FLOOR, 2); - } else { - /* Комната не на экране, но её кромочная колонка видна в шве — те же - * снимки, что обновляет animate_loose. */ - pop_neigh_dirty = 1; - } - /* Модификатор пустой клетки = ТИП УРОВНЯ (по нему draw_tile_right - * выбирает blueline у дыры), тайл в странице уровня — сразу. */ - if (mod) mod[tilepos] = pop_palace; - pop_level_set_tile(room, tilepos, TILE_EMPTY); -} - -/* check_fall_flo (seg000:1317) — СПЕЦСОБЫТИЕ уровня 13: гряда плит над - * комнатой сыплется на Кида сама, вразнобой. - * - * Как это устроено в оригинале: при входе в комнату 23 или 16 шести плитам - * ряда 2 комнаты СВЕРХУ раздаётся ОТРИЦАТЕЛЬНЫЙ модификатор −(rnd & 15). - * Отрицательное значение — это старший бит, то есть для animate_loose оно - * выглядит как «тряска», а на уровне 13 тряска намеренно не гасится - * (спецкейс в pop_loose_tick). Фаза считает вверх, доходит до нуля и - * дальше идёт обычным отсчётом до провала — получается разная задержка у - * каждой плиты. - * - * Плиты ряда 2 верхней комнаты у нас — это pop_ceil_modif (плиты-потолки), - * так что раздаём фазу именно туда. - * - * ОДНО отличие от оригинала, вынужденное представлением: у нас фаза 0 = «не - * анимируется», плита с такой фазой в цикле пропускается вовсе. Значит - * счёт, дойдя до нуля, оборвался бы — поэтому, во-первых, тик перескакивает - * ноль (см. pop_loose_tick), а во-вторых, стартовое значение берётся на - * единицу «отрицательнее» (−n−1): вместе это даёт ровно ту же суммарную - * задержку n + 11 кадров, что и у оригинала. - * - * Звать при входе в комнату, после pop_loose_reset (тот забирает фазы из - * room_modif) — как check_the_end зовёт его после start_chompers. */ -static pop_rnd_t loose_seed; /* свой домен последовательности, см. pop_geom.h */ - -void pop_check_fall_flo(void) __banked -{ - uint8_t col; - if (pop_current_level != POP_LOOSE_TILES_LEVEL) return; - if (g_room != POP_LOOSE_TILES_ROOM1 && g_room != POP_LOOSE_TILES_ROOM2) return; - if (!g_above || !g_link_u) return; - for (col = POP_LOOSE_TILES_FIRST - 20; col <= POP_LOOSE_TILES_LAST - 20; col++) { - uint8_t t = g_above[col]; - /* Те же отсевы, что в make_loose_fall: не loose и «solid» loose - * пропускаются молча (в комнате 1 тайл 24 пустой — диапазон 22..27 - * намеренно надмножество), уже идущий отсчёт не перебиваем. */ - if ((t & 0x1F) != TILE_LOOSE || (t & 0x20)) continue; - if ((int8_t)pop_ceil_modif[col] > 0) continue; - pop_ceil_modif[col] = - (uint8_t)(-(int8_t)(pop_prandom(&loose_seed, 255) & 0x0F) - 1); - loose_any = 1; /* ШЕСТОЕ место взвода гейта — см. loose_any. - * Пропуск именно здесь стоил каскада на - * уровне 13: плиты получали отложенный - * старт, но цикл их не досчитывал, и они - * дрожали, не падая (нашёл пользователь - * 2026-08-19). */ - pop_set_redraw_above(col, POP_RDA_CEIL, 1); - } -} - -/* fell_on_your_head (seg007:1205): плита прилетела Киду по голове. В беге - * (кадры 5..14) не бьёт (кроме уровня 13 — его тут нет); в висе/подъёме тоже - * (action >= hang_climb, кроме turn). Иначе −1 HP: смерть → seq_22 (crushed), - * живой → seq_52 (плита придавила: Kid приседает), с отступом на 2 назад, - * если сзади пусто. Кадр 109 (присед) последовательность не меняет. */ -#define SEQ_52_LOOSE_FELL_ON_KID 52 -#define FRAME_109_CROUCH 109 - -static void fell_on_your_head(void) -{ - uint8_t frame = Char.frame, action = Char.action; - /* СПЕЦКЕЙС УРОВНЯ 13 (seg007:1218): там плита бьёт и В БЕГЕ. На прочих - * уровнях бегущего она пропускает — иначе гряда падающих плит, сквозь - * которую и надо пробегать, не представляла бы никакой угрозы. */ - if ((pop_current_level == POP_LOOSE_TILES_LEVEL || frame < 5 || frame >= 15) && - (action < ACT_HANGCLIMB || action == ACT_TURN)) { - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - if (pop_take_hp(1)) { /* «брызги» даст pop_do_delta_hp */ - pop_char_set_seq(SEQ_22_CRUSHED); - play_seq(); - determine_col(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; - } else if (frame != FRAME_109_CROUCH) { - if (get_tile_behind_char() == TILE_EMPTY) - Char.x = (uint8_t)char_dx_forward(-2); - pop_char_set_seq(SEQ_52_LOOSE_FELL_ON_KID); - play_seq(); - determine_col(); - } - } -} - -/* check_loose_fall_on_kid (seg007:1192): падающий кусок в той же колонке и - * его низ уже в полосе 30px над ногами Kid → удар. */ -static void check_loose_fall_on_kid(void) -{ - int mcol, my; - if (pop_kid_dead) return; - /* Ни одного куска в воздухе — не платим за банковый трамплин в - * pop_loose_mob_pos с обходом 14 слотов (замер 11/15: 5 868 тактов на - * комнату, где не падает ничего). */ - if (!pop_mob_busy) return; - if (!pop_loose_mob_pos(&mcol, &my)) return; - /* Своё окно Char, как в оригинале (seg007:1199 — loadkid/savekid внутри - * самой функции): зовут нас из pop_loose_tick, а тот идёт в главном - * цикле вне окон, и в Char к этому моменту лежит СТРАЖ (он тикает - * последним). Плита на голову — про Кида. */ - pop_loadkid(); - if (Char.curr_col == (int8_t)mcol && - my < (int)Char.y && (int)Char.y - 30 < my) { - fell_on_your_head(); - pop_savekid(); - } -} - -/* animate_loose (seg007:0CBA) + перерисовка изменившихся тайлов на ТЕКУЩЕЙ - * (back) странице. Звать из основного цикла ПОСЛЕ set_draw_page(back). */ -void pop_loose_tick(void) __banked -{ - uint8_t pos; - /* Массивы обходим УКАЗАТЕЛЕМ, а не индексом. С `int pos` SDCC держал - * счётчик в IX-фрейме, каждую итерацию заново складывал 16-битный адрес - * элемента, клал его в локал и тут же вычитывал обратно парами pop/push: - * 40 холостых итераций стоили 27 936 тактов (замер 2026-08-13). Ходьба - * указателем убирает и адресную арифметику, и IX-фрейм. */ - uint8_t *lm = pop_loose_modif; - /* row/col ведём бегущими счётчиками, а НЕ через pos/10 и pos%10: у Z80 - * нет аппаратного деления, и SDCC выносил оба деления (__divuchar/ - * __moduchar) в начало КАЖДОЙ итерации (общее подвыражение аргументов - * вызовов), т.е. 30*2=60 вызовов деления за кадр — даже в покое и в - * комнатах без loose-плит (условия if к тому моменту ещё не проверены). - * Инкремент+сравнение считают row/col без деления. */ - uint8_t row = 0, col = 0; - pop_dbg_m9(); /* ЗАМЕР: вход pop_loose_tick */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Гейт холостого хода: если ни одна фаза не взведена, оба цикла (30 + 10 - * позиций) пропускаем целиком — замер 11/15 дал 9 852 такта на комнату, - * где loose-плит нет вовсе. Флаг ставят места записи фазы, снимаем его - * здесь и только по факту прохода, в котором не осталось ни одной живой - * фазы (см. объявление loose_any). */ - if (loose_any) { - uint8_t found = 0; - for (pos = 0; pos < 30; pos++, lm++) { - if (*lm != 0) { - uint8_t m = ++*lm; - /* Отложенный старт уровня 13 досчитал до нуля. Ноль у нас - * означает «не анимируется», и плита застряла бы навсегда — - * перескакиваем на 1. Стартовое значение выбрано с учётом - * этого перескока (см. pop_check_fall_flo). */ - if (m == 0) m = *lm = 1; - if (m & 0x80) { /* тряска (do_knock) */ - /* СПЕЦКЕЙС УРОВНЯ 13 (seg007:823): фазу со старшим битом НЕ - * гасим и не трясём. На нём check_fall_flo раздаёт плитам - * ОТРИЦАТЕЛЬНЫЙ старт (0xF0..0xFF) как отложенный таймер, и - * обычная ветка «тряска кончилась на 0x84» убила бы его в - * первом же кадре — плита не упала бы никогда. Пропущенная - * инкрементом фаза сама дойдёт до 0x00, там старший бит - * снимется, и дальше пойдёт обычный отсчёт до провала. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { - /* ждём молча */ - } else if (m >= 0x84) { /* конец тряски: сброс + покой */ - *lm = 0; - loose_shake(1, 0); /* последний удар — без гейта */ - /* modif уже 0 → кадр покоя обоих тайлов (col и col+1: - * правая грань loose живёт в соседе). ОБЕ страницы — - * иначе на одной застывает дрожащий кадр → мерцание. */ - pop_set_redraw(pos, POP_RD_LOOSE, 2); - } else { - loose_shake(0, m); - pop_set_redraw(pos, POP_RD_LOOSE, 1); /* дрожащий кадр */ - } - } else if (m >= 11 && pop_loose_fell) { - /* Сигнал прошлого провала ещё не разобран главным циклом (он - * ОДИН на кадр) — придержим плиту кадр, откатив фазу к 10. - * Иначе из двух плит, провалившихся в одном кадре, дыру - * запекала бы только вторая, а первая оставалась нарисованной - * целой (уровень 13: check_fall_flo роняет гряду разом). */ - *lm = 10; - } else if (m >= 11) { /* loose_floor_delay — падение */ - /* remove_loose (seg007:0EB8): тайл → EMPTY (не debris!). - * Debris появляется ТОЛЬКО там, где приземлился падающий - * кусок (mob), т.е. рядом ниже. Loose в нижнем ряду (2,6) - * — кусок улетает из комнаты вниз, на месте остаётся пусто - * (стена-вниз от тайла снизу + чёрный фон). */ - g_fg[pos] = TILE_EMPTY; - /* remove_loose возвращает ТИП УРОВНЯ, и вызывающий кладёт - * его модификатором пустой клетки (seg007:846/1083): по нему - * draw_tile_right выбирает blueline_fram1 у дыры. */ - pop_trob_modif(g_room)[pos] = pop_palace; - *lm = 0; - pop_set_redraw(pos, POP_RD_LOOSE_GONE, 2); /* запечь пусто, обе стр. */ - /* ...и СОСЕДА СПРАВА: передний торец пола заезжает в его - * клетку, и без этой пометки он оставался висеть над пустым - * тайлом. То же, что делает pop_skel_wake_tile. */ - if ((pos % 10) < 9) - pop_set_redraw((uint8_t)(pos + 1), POP_RD_FLOOR, 2); - pop_loose_mob_spawn(row, col); /* отрыв падающего куска */ - pop_loose_fell = (uint8_t)(pos + 1); /* сигнал приложению */ - } else { /* отсчёт 1..10 — дрожащий кадр */ - loose_shake(0, m); - pop_set_redraw(pos, POP_RD_LOOSE, 1); - } - if (*lm) found = 1; /* фаза ещё жива — гейт держим */ - } - if (++col == 10) { col = 0; row++; } /* row/col без деления */ - } - /* Плиты-ПОТОЛКИ (ряд 2 комнаты сверху): тот же animate_loose, но кадры - * рисуются в полосе у потолка, а провалившаяся плита становится EMPTY в - * НАШЕЙ копии ряда (g_above) — сверху открывается колодец. */ - lm = pop_ceil_modif; /* тот же указательный обход */ - for (col = 0; col < 10; col++, lm++) { - if (*lm != 0) { - uint8_t m = ++*lm; - if (m == 0) m = *lm = 1; /* см. pop_loose_tick выше */ - if (m & 0x80) { /* тряска от сотрясения (do_knock) */ - /* Тот же спецкейс уровня 13, и здесь он ГЛАВНЫЙ: плиты, - * которым check_fall_flo раздал отложенный старт, лежат - * именно в ряду 2 комнаты СВЕРХУ, то есть ведёт их этот - * цикл, а не соседний. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { - /* ждём молча */ - } else if (m >= 0x84) { *lm = 0; loose_shake(1, 0); - pop_set_redraw_above(col, POP_RDA_CEIL, 2); } - else { loose_shake(0, m); - pop_set_redraw_above(col, POP_RDA_CEIL, 1); } - } else if (m >= 11 && pop_ceil_fell) { - *lm = 10; /* сигнал занят — кадр подождём */ - } else if (m >= 11) { /* loose_floor_delay — плита рушится */ - *lm = 0; - if (g_above) g_above[col] = TILE_EMPTY; /* remove_loose */ - pop_set_redraw_above(col, POP_RDA_CEIL_GONE, 2); /* колодец, обе стр. */ - pop_loose_mob_spawn(-1, col); /* кусок отрывается от потолка */ - pop_ceil_fell = (uint8_t)(col + 1); /* сигнал приложению */ - } else { - loose_shake(0, m); - pop_set_redraw_above(col, POP_RDA_CEIL, 1); /* отсчёт 1..10 */ - } - if (*lm) found = 1; /* фаза ещё жива — гейт держим */ - } - } - loose_any = found; - } - pop_loose_mob_tick(); /* продвинуть+нарисовать падающий кусок (после тайлов) */ - check_loose_fall_on_kid(); /* seg007:1192 — плита падает Киду на голову */ - /* Отложенная допечка ПРОШЛОГО приземления на вторую страницу — ПЕРЕД - * разбором нового: иначе при двух плитах, севших подряд, land_bake - * затирался новым и на одной странице оставался старый пол. */ - if (pop_loose_landed) { /* loose_land (seg007:11E8): на месте куска — щебень */ - uint8_t pos = (uint8_t)(pop_loose_landed - 1); - uint8_t r = 0, c = pos; - uint8_t tt = (uint8_t)(g_fg[pos] & 0x1F); /* тайл, НА который села плита */ - pop_loose_landed = 0; - while (c >= 10) { c -= 10; r++; } - /* Плита, севшая на КНОПКУ, её нажимает (seg007:11E8, ветки - * tiles_15_opener / tiles_6_closer). Тонкость: на opener оригинал - * подставляет button_type = tiles_14_debris, а это у trigger_gate - * отдельная ветка «открыть НАСОВСЕМ» (возврат 2 -> animate_door - * доводит створку и ставит modifier 0xFF, после чего ворота - * заморожены и обычный opener их больше не трогает). Сама кнопка - * съедается: тайл станет щебнем ниже, нажаться второй раз нечему. - * Модификатор (индекс LINKLOC) тайл не меняет, берём его как есть. */ - if (tt == TILE_OPENER || tt == TILE_CLOSER) - pop_trigger_button(g_room, pos, - (uint8_t)(tt == TILE_OPENER ? TILE_DEBRIS : tt), - pop_trob_modif(g_room)[pos], 1); - /* На факеле — отдельный тайл «факел с щебнем» (seg007:1067). */ - g_fg[pos] = (uint8_t)((tt == TILE_TORCH || tt == TILE_TORCH_DEBRIS) - ? TILE_TORCH_DEBRIS : TILE_DEBRIS); - /* Перерисовка ПО ПЛОЩАДИ ПОЛА (не LOOSE_GONE: та стирает и верх стены - * ряда ниже — оставался чёрный прямоугольник под тайлом). Обе - * страницы дабл-буфера. */ - pop_set_redraw(pos, POP_RD_FLOOR, 2); - do_knock(r); /* удар плиты трясёт loose этого ряда */ - pop_debris_at = (uint8_t)(pos + 1); /* сигнал приложению (персистентность) */ - } -} - - - -/* ---- clip_char (seg006:1749), первый блок: обрезка спрайта СВЕРХУ ----- * - * Оригинал перед add_objtable кладёт в objtable прямоугольник клипа; блиттер - * рисует персонажа только внутри него. Верхняя граница: если тайл НАД - * головой (ряд char_top_row) — стена или пол, всё выше линии своей полосы - * (y_clip[curr_row+1]) не рисуется. Без этого Kid, ушедший головой под пол - * (спуск с кромки/кнопки, вис), просвечивает сквозь щели кладки. - * - * Хитрость исходника: `X == wall || tile_is_floor(curr_tile2)` — curr_tile2 - * ставит сам get_tile, т.е. это просто «тайл X = стена ИЛИ пол». - * - * Метрики габарита — порт set_char_collision (seg006:0723); в отличие от - * check_spike_below колонки берутся get_tile_div_mod БЕЗ −7. - * - * Возврат: КОМНАТНЫЙ y верхней границы (0 = клипа нет). */ -/* Вторая половина ветки двери уровня из clip_char (seg006:1231): - * obj_clip_right = leveldoor_right — ЭКРАННЫЙ X, правее которого спрайт не - * рисуется. 0 = обрезки нет. - * - * Почему обрезка, а не fore-слой: створка и косяк уходят в оригинале - * ЦЕЛИКОМ в backtable (draw_leveldoor, все add_backtable), то есть рисуются - * ПОД персонажем и перекрыть его не могут. Единственный способ спрятать - * поднимающегося по лестнице — срезать сам спрайт. */ -int pop_clip_char_right(void) __banked -{ - if (Char.frame >= 224 && Char.frame < 229) - return pop_leveldoor_right; - return 0; -} - -int pop_clip_char_top(int obj_x, int obj_y, uint16_t w, uint16_t h) __banked -{ - static const int16_t y_clip[5] = { -60, 3, 66, 129, 192 }; - int wh = ((int)w + 1) >> 1; /* char_width_half */ - int xl = obj_x / 2 + 58; /* char_x_left */ - int xr, top_y, clip_y; - int8_t cL, cR, trow, clip_row; - uint8_t t; - - /* Кадры подъёма по лестнице двери уровня (clip_char, seg006:1231): - * персонаж режется по низу поднятой створки. ВНИМАНИЕ: комментарий в - * SDLPoP говорит «frames 217..228», а КОД проверяет - * `>= frame_224_exit_stairs_8`, то есть 224..228 — портируем по коду. - * Правую кромку отдаёт pop_clip_char_right (парная половина ветки). */ - if (Char.frame >= 224 && Char.frame < 229) - return pop_leveldoor_ybottom + 1; - - if (Char.direction >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; /* char_x_right */ - top_y = obj_y - (int)h + 1; /* char_top_y */ - if (top_y >= 192) top_y = 0; /* весь спрайт ниже комнаты */ - trow = pop_y_to_row((int16_t)top_y); /* char_top_row */ - cL = get_tile_div_mod(xl); if (cL < 0) cL = 0; - cR = get_tile_div_mod(xr); if (cR > 9) cR = 9; - - t = get_tile(cL, trow); - if (t != TILE_WALL && !tile_is_floor(t)) return 0; - /* кадр 79 (прыжок вверх) / 81 (зацеп) в стойке клипятся и по одной грани */ - if (!(Char.action == 0 && (Char.frame == 79 || Char.frame == 81))) { - t = get_tile(cR, trow); - if (t != TILE_WALL && !tile_is_floor(t)) return 0; - } - - clip_row = (int8_t)(Char.curr_row + 1); - if (clip_row < 0 || clip_row > 4) return 0; - clip_y = y_clip[clip_row]; - /* ряд 0 — клип безусловный; иначе только когда линия реально режет спрайт */ - if (clip_row == 1 || (clip_y < obj_y && clip_y - 15 < top_y)) - return clip_y; - return 0; -} - -/* check_leave_below (порт leave_room, seg002: leave_dir=3 при chary>=211): - * Kid пересёк нижнюю границу комнаты (провал в дыру ИЛИ спуск-зацеп/climbdown - * — единый триггер по y). Репроекция в кадр комнаты снизу (goto_other_room - * down: y-=189, curr_row=y_to_row_mod4) + сигнал pop_fell_out — приложение - * решит: переход (links.down) или выпал из уровня (нет комнаты снизу). */ -static void check_leave_below(void) -{ - /* leave_room (seg002:0504) проверяет ВВЕРХ ПЕРВЫМ: персонаж не в отскоке/ - * полёте и его y (как signed) в полосе −16..10 у верха комнаты — он вылез - * в комнату сверху (через колодец от упавшей плиты). Порядок важен: при - * подтягивании y ≈ 248, и проверка «ниже комнаты» (y>=211) иначе - * перехватывает подъём и роняет Kid из уровня. - * goto_other_room(up): y += 189, curr_row = y_to_row_mod4. */ - if (g_link_u && Char.action != ACT_BUMPED && Char.action != ACT_FREEFALL && - Char.action != ACT_MIDAIR && - (int8_t)Char.y < 10 && (int8_t)Char.y > -16) { - Char.y = (uint8_t)(Char.y + 189); - Char.curr_row = pop_y_to_row((int16_t)Char.y); - pop_leave_dir = 3; - return; - } - if (Char.y >= 211) { - Char.y = (uint8_t)(Char.y - 189); - Char.curr_row = pop_y_to_row((int16_t)Char.y); - pop_fell_out = 1; - } -} - -/* check_leave вбок (порт leave_room, seg002): передний край персонажа - * (char_dx_forward(cur_frame.dx) = char_x_left при взгляде влево / char_x_right - * вправо) сравнивается с кромками комнаты. Взгляд вправо: >=201 → right, - * <=57 → left; взгляд влево: <=54 → left, >=198 → right. goto_other_room: - * x∓140 (ширина комнаты), пересчёт колонки; сигнал pop_leave_dir (2=right, - * 1=left). Уход только если сосед есть (иначе кромка = стена, check_bumped - * удержит у шва). */ -static void check_leave(void) -{ - int fx; - uint8_t f = Char.frame; - /* seg002 leave_room: комнату НЕ покидаем во время разворота (action turn), - * подъёма-с-зацепа (climb, кадры 135..149), вставания из приседа - * (110..119) и — ОТДЕЛЬНО ВАЖНОЕ — БОЯ МЕЧОМ (150..162 и 166..168). - * - * Без первых трёх разворот у правого шва (взгляд флипается право→лево, - * char_x_left проскакивает >=198) телепортирует Kid сквозь закрытые - * ворота в соседнюю комнату (leave_room возвращает −1). - * - * Без кадров МЕЧА бой у шва превращается в мельтешение: отступая и - * наступая, Kid пересекает границу почти каждый кадр, и комната - * перерисовывается туда-обратно — драться невозможно (найдено - * пользователем 2026-08-18, уровень 8, шов комнат 24/18). Оригинал - * пускает смену комнаты только на «легальном» кадре вроде 170 (стойка - * с мечом), а вся боевая анимация уход запрещает. Побочный эффект в - * оригинале известен и даже эксплуатируется: Trick 35 «retreat without - * leaving the room» — определённым ритмом «назад» из комнаты можно - * пятиться, не переключая её вовсе (в SDLPoP это чинит опциональный - * FIX_RETREAT_WITHOUT_LEAVING_ROOM, по умолчанию ВЫКЛЮЧЕННЫЙ; мы, как - * обычно, портируем оригинал, а не его исправления). - * - * NB: 135..149 и 150..162 смежны, поэтому слиты в один диапазон — - * условие то же, а сравнений на одно меньше. */ - if (Char.action == ACT_TURN || - (f >= 110 && f < 120) || - (f >= 135 && f < 163) || /* подъём-с-зацепа + вся боевая анимация */ - (f >= 166 && f < 169)) /* стойка «замер, меч наготове» */ - return; - /* Передний край — ТОЛЬКО через char_x_forward_edge (obj_x-арифметика - * set_char_collision): в зоне шва (<=57) он на пиксель правее чистого - * Char.x+dx, и Kid, осевший у ворот на x=57, порога leave-left НЕ достигает - * (эталон SDLPoP: экран не переключается, BUG-SEAM-PINGPONG). */ - fx = char_x_forward_edge(); - if (Char.direction >= 0) { /* взгляд вправо: fx = char_x_right */ - uint8_t t9 = get_tile(9, Char.curr_row); - if (g_link_r && fx >= 201 && - t9 != TILE_DOORTOP_FLOOR && t9 != TILE_DOORTOP) { - /* leave_room (seg002): под doortop у правой кромки выхода нет */ - Char.x = (uint8_t)(Char.x - 140); determine_col(); pop_leave_dir = 2; - } else if (g_link_l && fx <= 57) { - Char.x = (uint8_t)(Char.x + 140); determine_col(); pop_leave_dir = 1; - } - } else { /* взгляд влево: fx = char_x_left */ - if (g_link_l && fx <= 54) { - Char.x = (uint8_t)(Char.x + 140); determine_col(); pop_leave_dir = 1; - } else if (g_link_r && fx >= 198) { - Char.x = (uint8_t)(Char.x - 140); determine_col(); pop_leave_dir = 2; - } - } -} - -/* ---- Пики (spike, seg006/seg007) ---------------------------------- * - * Состояние пики в room_modif[g_room][tilepos] (pop_trob), автомат — - * animate_spike (pop_trob). Здесь: триггер выдвижения (check_spike_below), - * решение о смерти (check_spiked) + spiked(). */ - -/* start_anim_spike (seg007:08E3): взвести выдвижение, если пика в покое - * (modif 0 → trob type1) или ушла не полностью (modif<0, кроме 0xFF disabled - * → мгновенно 0x8F «вышли»). */ -static void start_anim_spike(uint8_t tilepos) -{ - uint8_t *mod = pop_trob_modif(g_room); - int8_t old; - if (!mod) return; - old = (int8_t)mod[tilepos]; - if (old <= 0) { - if (old == 0) { - pop_add_trob(g_room, tilepos, 1); - pop_sfx_play(49); /* seg007:08F6 — пики пошли */ - } else if ((uint8_t)old != 0xFF) - mod[tilepos] = 0x8F; - } -} - -/* is_spike_harmful (seg007:1178): 0/-1 → 0 (безопасно); <0 → 1; 1..4 → 2; - * >=5 → 0. */ -static int is_spike_harmful(uint8_t tilepos) -{ - int8_t m = (int8_t)pop_trob_modif(g_room)[tilepos]; - if (m == 0 || m == -1) return 0; - if (m < 0) return 1; - if (m < 5) return 2; - return 0; -} - -/* spiked (seg005:0888): напоролся — пика становится безвредной (0xFF), - * выровнять по колонке, pop_take_hp(100) = смерть, seq_51 (импейл). */ -static void spiked(uint8_t tilepos) -{ - pop_trob_modif(g_room)[tilepos] = 0xFF; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.x = (uint8_t)(pop_x_bump[Char.curr_col + FIRST_ONSCREEN_COLUMN] + 10); - Char.x = (uint8_t)char_dx_forward(8); - Char.fall_y = 0; - pop_sfx_play(48); - pop_take_hp(100); - pop_char_set_seq(SEQ_51_SPIKED); - play_seq(); - determine_col(); - /* pop_kid_dead — НАШ флаг респавна, он про Кида. У прочих персонажей - * смерть видна по обнулившимся HP: play_guard ставит alive = 0, а - * дальше их доигрывает общий control() (seq_71_dying). */ - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; -} - -/* check_spiked (seg006:0658): под персонажем пика И вредна И кадр - * бега(7..14)/старта прыжка(34..39) при harmful>=2, ЛИБО кадр приземления - * (43/26) при harmful!=0 → smert'. */ -static void check_spiked(void) -{ - uint8_t frame = Char.frame, tp; - int h; - if (Char.curr_col < 0 || Char.curr_col > 9 || Char.curr_row < 0 || Char.curr_row > 2) - return; - if (get_tile_at_char() != TILE_SPIKE) return; - tp = (uint8_t)(Char.curr_row * 10 + Char.curr_col); - h = is_spike_harmful(tp); - if ((h >= 2 && ((frame >= FRAME_7_RUN && frame < 15) || - (frame >= FRAME_34_RUNJUMP_START && frame < 40))) || - ((frame == FRAME_43_RUNJUMP_LAND || frame == FRAME_26_STANDJUMP_LAND) && h != 0)) - spiked(tp); -} - -/* check_spike_below (seg006:1199): для каждой колонки РЕАЛЬНОГО габарита - * спрайта (char_x_left..char_x_right, порт set_char_collision) скан ВНИЗ от - * curr_row через НЕ-floor тайлы; встретил пику → start_anim_spike. Габарит, - * а не «curr_col + колонка спереди»: иначе пики выдвигаются на тайл раньше - * (когда тело Кида ещё не над шахтой). Метрики кадра — pop_cd (габарит - * последнего нарисованного кадра; отставание в 1 кадр несущественно, ошибка - * в позднюю сторону). */ -static void check_spike_below(void) -{ - const pop_cdraw_t *cd = CD_ACT; - int wh = ((int)cd->fpw + 1) >> 1; /* char_width_half */ - int xl = cd->fpx / 2 + 58; /* char_x_left */ - int xr; - int8_t c0, c1, col; - if (Char.direction >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; /* char_x_right */ - c0 = get_tile_div_mod_m7(xl); - c1 = get_tile_div_mod_m7(xr); - for (col = c0; col <= c1; col++) { - int8_t row = Char.curr_row; - if (col < 0 || col > 9) continue; - for (;;) { - uint8_t t = get_tile(col, row); - if (t == TILE_SPIKE) { start_anim_spike((uint8_t)(row * 10 + col)); break; } - if (!tile_is_floor(t) && row <= 2) { row++; continue; } - break; - } - } -} - -/* chomped (seg004:07BF): персонажа перемололо. Тайл помечается кровью - * (0x80 в modif), персонаж выравнивается по колонке чомпера, теряет все HP - * и уходит в seq_54. Условие «кадр ещё не 178» — чтобы не перезапускать - * последовательность каждый кадр, пока труп лежит в челюстях. - * - * Кровь пишется ДАЖЕ у скелета: SDLPoP чинит это опцией - * fix_skeleton_chomper_blood, но в ВАНИЛИ она есть, и мы держим ваниль. */ -static void chomped(uint8_t tilepos, int8_t col) -{ - pop_trob_modif(g_room)[tilepos] |= 0x80; - if (Char.frame == FRAME_178_CHOMPED) return; - Char.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - Char.x = (uint8_t)char_dx_forward(7 - !Char.direction); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - pop_sfx_play(46); - pop_take_hp(100); - pop_char_set_seq(SEQ_54_CHOMPED); - play_seq(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; -} - -/* check_gate_push (seg004:0833): ОПУСКАЮЩАЯСЯ решётка выталкивает персонажа - * из своего тайла. Без неё Кид, зашедший в тайл ворот при поднятой решётке, - * так и остаётся в нём после опускания — «в суперпозиции»: створка рисуется - * то перед ним, то за ним (слой выбирается по направлению взгляда), и уйти - * он может в обе стороны. Поймано пользователем 2026-08-24; то же и для - * попытки проползти под опускающейся решёткой в присяде. - * - * Условия оригинала — только позы, где персонаж стоит на месте и его можно - * сдвинуть, не ломая анимацию: РАЗВОРОТ (action 7), СТОЙКА (кадр 15) и - * кадры приседа 108..110. Решётка ищется в своём тайле И в тайле СЛЕВА: - * створка нарисована у ПРАВОЙ грани тайла, поэтому левый сосед давит так - * же. Перекрытие обязано быть обеими гранями и в этом кадре, и в прошлом - * (у оригинала `curr_row_coll_flags & prev_coll_flags == 0xFF`) — иначе - * толчок срабатывал бы на пролёте мимо. Сам толчок — 5 пикселей: ВЛЕВО, - * если решётка в тайле персонажа, ВПРАВО — если в левом соседе. */ -static void check_gate_push(void) -{ - int8_t orig_col = Char.curr_col, col, row = Char.curr_row; - uint8_t frame = Char.frame; - - if (Char.action != ACT_TURN && frame != 15 && - !(frame >= 108 && frame < 111)) return; - col = orig_col; - if (get_tile(col, row) != TILE_GATE) { - col--; - if (get_tile(col, row) != TILE_GATE) return; - } - /* Слот флагов годен только внутри ОКОН обоих кадров: вне их лежат - * значения прошлых кадров (та же оговорка, что в check_chomped_flags). */ - if (col < coll_lo || col > coll_hi || - col < coll_prev_lo || col > coll_prev_hi) return; - if ((coll_curr[COLL_IDX(col)] & coll_prev[COLL_IDX(col)]) != 3) return; - if (gate_passable(col, row)) return; /* can_bump_into_gate */ - pop_sfx_play(8); /* bumped_sound (seg004:05F1) */ - Char.x = (uint8_t)((int)Char.x + (orig_col <= col ? -5 : 5)); -} - -/* check_chomped_kid (seg004:076B): по колонкам ряда — там, где персонаж - * перекрывает тайл ОБЕИМИ гранями (у оригинала curr_row_coll_flags == 0xFF, - * у нас оба бита) и этот тайл — СОМКНУТЫЙ чомпер (modif & 0x7F == 2), - * персонажа перемалывает. */ -/* lo..hi — ОКНО, по которому посчитан flags: вне него слоты протухшие (там - * лежат значения прошлых кадров), и «== 3» дал бы фантомный перемол. */ -static void check_chomped_flags(const uint8_t *flags, int8_t lo, int8_t hi) -{ - int8_t row = Char.curr_row, col; - uint8_t tp; - if (row < 0 || row > 2) return; - if (lo < 0) lo = 0; - if (hi > 9) hi = 9; - for (col = lo; col <= hi; col++) { - if (flags[COLL_IDX(col)] != 3) continue; - if (get_tile(col, row) != TILE_CHOMPER) continue; - tp = (uint8_t)(row * 10 + col); - if ((pop_trob_modif(g_room)[tp] & 0x7F) == 2) chomped(tp, col); - } -} - -static void check_chomped_kid(void) { check_chomped_flags(coll_curr, coll_lo, coll_hi); } - -/* check_chomped_guard (seg004:0989) — у оригинала ОТДЕЛЬНОЕ тело: страж не - * проходит через check_collisions, поэтому там перекрытие считается прямо по - * координатам граней (check_chomped_here). У нас та же формула уже живёт в - * get_row_collision_data, поэтому считаем флаги ряда во ВРЕМЕННЫЙ массив и - * идём общим телом. Именно во временный: coll_curr/above/below — это кадр - * КИДА, из них move_coll_to_prev берёт «прошлые» флаги на следующем кадре, и - * затирание сломало бы ему бамп. */ -static void check_chomped_guard(void) -{ - uint8_t flags[COLL_N]; - if (Char.curr_row < 0 || Char.curr_row > 2) return; - set_char_collision(); - calc_coll_window(); /* своё окно; coll_lo/hi Кида не трогаем */ - get_row_collision_data(Char.curr_row, flags); - check_chomped_flags(flags, win_lo, win_hi); -} - -/* ---- Кадровая физика: одна и та же над Char, два входа --------------- * - * Оригинал держит физику ОДНИМ набором функций над Char, а кто именно в - * Char — решают окна loadkid/savekid и loadshad/saveshad (seg006:809). - * Мы теперь так же: kid_phys/guard_phys — это списки вызовов из - * play_kid_frame (seg000:1209) и play_guard_frame (seg000:1246), а сами - * проверки общие. Списки отличаются ровно тем, чем в оригинале. */ - -static void kid_phys(void) -{ - if (grab_timer) grab_timer--; - /* do_timers (seg003:0517): срок действия пера тикает раз в игровой кадр. - * Место — у Кида, а не у стража: эффект в оригинале снимается общим - * таймером главного цикла, а у нас единственный кадровый тик Кида. */ - if (pop_feather) pop_feather--; - fall_accel(); - fall_speed(); - determine_col(); - bump_into_opponent(); /* seg003: безоружный Кид отскакивает от стража */ - check_collisions(); /* seg004: флаги перекрытия по колонкам ряда */ - pop_dbg_p6(); /* ЗАМЕР: check_collisions целиком */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_bumped(); /* удержать у стены до check_action (порядок PoP) */ - check_gate_push(); /* seg004: опустившаяся решётка выталкивает из тайла */ - check_action(); - pop_dbg_p7(); /* ЗАМЕР */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_press(); /* seg006: стойка/пробой loose → make_loose_fall */ - pop_dbg_p8(); /* ЗАМЕР */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_spike_below(); /* seg006: над колонкой с пиками → выдвинуть пики */ - check_spiked(); /* seg006: напоролся на вредные пики → смерть */ - check_chomped_kid(); /* seg004: перемололо в сомкнутых челюстях → смерть */ - /* upside_down снимается смертью (seg000:1224: `if (upside_down && - * Char.alive >= 0)`). У нас признак смерти — pop_kid_dead, ставится - * там же, где оригинал переводит alive в >= 0. */ - if (pop_kid_dead && pop_upside_want) { pop_upside_want = 0; pop_upside_dirty = 1; } - if (pop_kid_dead) return; /* только что умер — без leave/knock в этот кадр */ - pop_check_knock(); /* seg003: сотрясение приземления → тряска loose в ряду */ - /* exit_room_timer (seg002 exit_room): 2 кадра ПОСЛЕ входа в комнату любой - * leave заблокирован. Без него транзиент отскока о ворота шва (seq_47 - * роняет char_x за порог) сразу же выкидывает Kid в соседнюю комнату - * (ping-pong / баг #4). С таймером первый бамп попадает в окно блокировки, - * Kid оседает у грани (char_x стабильно > порога) — экран не перескакивает. */ - if (pop_leave_timer) { - pop_leave_timer--; - } else { - check_leave_below(); /* seg002: y>=211 → переход в комнату снизу */ - check_leave(); /* seg002: уход вбок → переход в соседнюю комнату */ - } -} - -/* play_guard_frame (seg000:1252..1266). Чего у стража НЕТ по сравнению с - * Кидом: bump_into_opponent, check_collisions/check_bumped (у него свой - * check_guard_bumped), check_gate_push, check_knock и весь уход из комнаты. - * check_chomped_guard — то же тело, что у Кида (у нас check_chomped). */ -static void guard_phys(void) -{ - fall_accel(); - fall_speed(); - determine_col(); - check_guard_bumped(); - check_action(); - check_press(); /* страж тоже давит кнопки и проваливает loose */ - check_spike_below(); - check_spiked(); - check_chomped_guard();/* seg000:1265 */ -} - -/* Физика КИДА — своё окно Char: главный цикл зовёт нас вне окон, а физика - * работает с активным персонажем. Сохраняем ПОЛНОСТЬЮ (pop_savekid_and_opp): - * физика меняет персонажу всё — координаты, ряд/колонку, кадр, seq. */ -void pop_phys_tick(void) __banked -{ - /* РАННЕГО ВЫХОДА ПО pop_kid_dead ЗДЕСЬ НЕТ — и это принципиально. - * У оригинала play_kid_frame (seg000:1231) гейт ровно один, `Char.room - * != 0`: вся цепочка крутится и на ТРУПЕ. Стоял `if (pop_kid_dead) - * return;` — дёшево и почти незаметно, но вместе с физикой он выключал - * check_press, а тот на мёртвом персонаже делает совсем не то, что на - * живом (died_on_button — кнопка ломается насовсем). Наблюдалось как - * «Кид разбился на кнопке открытия решётки, а решётка закрылась» - * (уровень 7, комната 3, тайл 2,1): кнопка получала РОВНО ОДНО нажатие — - * в кадре самой смерти, потому что pop_kid_dead ставит land() уже внутри - * цепочки. Разбор — BUGS_CLOSED.md#died-on-button. - * - * «Труп не шевелится» держится не этим выходом, а тем же, чем в - * оригинале: кадр смерти не двигается сам (dx/dy нулевые, sequence - * кончился), а уход из комнаты и сотрясение отсечены внутри kid_phys. */ - pop_loadkid_and_opp(); - pop_dbg_p1(); /* ЗАМЕР: окно Char загружено */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - kid_phys(); - pop_savekid_and_opp(); -} - -/* Физика СТРАЖА. Зовётся из главного цикла (резидент), а не из guards.c: - * цена та же — один трамплин на кадр, — но банк 1 не зовёт банк 3, а окно - * Char стоит копию 16 байт. */ -void pop_guard_phys_tick(void) __banked -{ - /* Тот же гейт, что в pop_guard_tick: dir_56_none = персонаж выключен - * (clear_char), физику ему тоже не крутим. */ - if (Guard.charid == 0 || Guard.direction == DIR_56_NONE || - Guard.room != g_room) return; - pop_loadshad_and_opp(); - /* seg000:1254 — физика работает, ТОЛЬКО пока страж внутри комнаты: за - * пределами полосы персонаж просто перестаёт двигаться, а - * провалившегося ниже убирает check_guard_fallout (seg002:0241). - * - * Это значит «своим ходом из комнаты не уйдёт», но НЕ «остаётся в ней - * всегда»: когда комнату меняет КИД, exit_room (seg002:03C7) может - * перенести стража следом — follow_guard, если тот жив, с вынутым - * мечом, стоит у нужного края (x < 91 при уходе влево, x >= 165 при - * уходе вправо) и в целевой комнате нет своего живого стража. У нас - * follow_guard пока не портирован (GUARD-PHYS в TASKS_OPEN.md). */ - if (Char.x >= 44 && Char.x < 211) { - pop_load_fram_det_col(); /* load_frame_to_obj + load_fram_det_col */ - guard_phys(); - } - pop_saveshad_and_opp(); -} - -/* ---- Зеркало уровня 4 (порт seg003:0798..08A9) ---------------------- * - * - * Тайл зеркала ставится в рантайме (pop_trob.c place_mirror), а «стеной - * слева» он уже был — wall_type = 2 портирован давно. Здесь вторая часть: - * что происходит ПОСЛЕ того, как Кид пролетел сквозь него беговым прыжком - * (флаг pop_jumped_mirror взводит is_obstacle выше по файлу). */ - -/* check_mirror_image (seg003:085B). МУТИРУЕТ Char НА МЕСТЕ: x отражается - * относительно оси зеркала, direction инвертируется. Возвращает - * distance_mirror — насколько персонаж вошёл в тайл (оригинал по нему - * решает, рисовать ли отражение; нам это понадобится на шаге «отражение»). - * - * Мутация Char здесь ЗАДУМАНА, а не побочный эффект: оригинал зовёт эту - * функцию из двух мест, и оба на неё рассчитывают — при рисовании отражения - * (в Char временная копия Кида, обратно она не сохраняется) и при рождении - * тени (мутированный Char уходит в слот Guard). */ -static int8_t mirror_image(void) -{ - /* +10 — смещение оси зеркала внутри тайла; в оригинале так и написано - * комментарием («I think 10 is the offset for mirror collision»). */ - int xpos = pop_x_bump[Char.curr_col + FIRST_ONSCREEN_COLUMN] + 10; - int distance = distance_to_edge_weight(); - if (Char.direction >= 0) distance = ~distance + TILE_SIZEX; - Char.x = (uint8_t)((xpos << 1) - (int)Char.x); - Char.direction = (int8_t)~Char.direction; - return (int8_t)(distance - 2); -} - -/* jump_through_mirror (seg003:080A): рождение ТЕНИ. Кид копируется в слот - * Guard уже отражённым; HP меняются местами — у тени полное здоровье Кида, у - * самого Кида остаётся 1. Полосы HP отдельно перерисовывать не надо: - * pop_hp_draw сравнивает числа и смену увидит сам. - * - * savekid здесь НЕТ и в оригинале: собственные x/direction Кида остаются - * прежними, отражается только копия, уходящая в слот Guard. */ -static void jump_through_mirror(void) -{ - pop_loadkid(); - pop_load_frame(); /* mirror_image смотрит на dx/flags КАДРА */ - (void)mirror_image(); - pop_jumped_mirror = 0; - Char.charid = CHARID_1_SHADOW; - pop_sfx_play(45); /* seg003:0617 — прыжок в зеркало */ - pop_saveshad(); - guardhp_max = guardhp_curr = hitp_max; - hitp_curr = 1; -} - -/* Линия клипа отражения СВЕРХУ — y_clip[curr_row+1] оригинала. Таблица та - * же, что в pop_clip_char_top; держим её здесь копией из четырёх значений, - * а не тащим наружу: ряд у отражения всегда 0..2. */ -static int mirror_clip_top(int8_t row) -{ - static const int16_t y_clip[5] = { -60, 3, 66, 129, 192 }; - int8_t r = (int8_t)(row + 1); - if (r < 0 || r > 4) return 0; - return (int)y_clip[r]; -} - -void pop_check_mirror(void) __banked -{ - if (pop_jumped_mirror == -1) { jump_through_mirror(); return; } - /* Отражение: пока Кид СТОИТ на тайле зеркала, рисуем его зеркальную - * копию (в оригинале — add_objtable(4)). Условия оригинала: тайл под - * персонажем — зеркало, distance_mirror >= 0 (вошёл в тайл достаточно - * глубоко) и его комната = отрисованная. */ - if (Kid.room != g_room) return; - pop_loadkid(); - if (get_tile_at_char() != TILE_MIRROR) return; - pop_load_frame(); - if (mirror_image() >= 0) - pop_mirror_draw(mirror_clip_top(Char.curr_row)); - /* Char остался ОТРАЖЁННЫМ — как в оригинале: обратно он не сохраняется, - * а следующий тик перезагружает окно из Kid. */ -} - -/* Закрытое состояние физики, которое влияет на следующие кадры. Таблицы - * коллизии и кэши соседей намеренно не входят: их пересчитает вход в комнату. */ -void pop_map_qsave(pop_qs_io_t *io) __banked -{ - pop_qs_u8(io, &is_screaming); - pop_qs_u8(io, &grab_timer); - pop_qs_i8(io, &pickup_obj_type); - pop_qs_u16(io, &loose_seed.lo); - pop_qs_u16(io, &loose_seed.hi); - pop_qs_u8(io, &last_loose_snd); - if (io->reading && io->apply) pop_coll_invalidate(); -} diff --git a/applications/PoP/roomtest/pop_map.h b/applications/PoP/roomtest/pop_map.h deleted file mode 100644 index e34c3d9..0000000 --- a/applications/PoP/roomtest/pop_map.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - * pop_map.h — коллизия Kid с картой комнаты (Фаза K3): тайловые запросы - * + физика падения + приземление. Порт SDLPoP seg005/seg006 - * (check_on_floor/start_fall/do_fall/fall_accel/fall_speed/land/in_wall). - * - * K3.2 (падение): Kid, сойдя/сбежав с края пола (тайл под ним не floor), - * начинает падать (fall_y-ускорение, Char.y растёт), приземляется на пол - * ниже (soft/medium land) или продолжает вниз. Стена под персонажем — - * in_wall (выталкивание). Бег В стену (check_bumped) — отдельным шагом. - */ -#ifndef POP_MAP_H -#define POP_MAP_H - -#include -#include "pop_char.h" /* pop_char_t — окклюзия ворот спрашивает про персонажа */ -#include "pop_qsave.h" - -/* Задать карту текущей комнаты: fg[30] = коды тайлов (row*10+col, 3×10). - * col<0/>9 или row<0/>2 трактуются как стена (край уровня). Массив - * МУТАБЕЛЬНЫЙ (loose-пол при падении → empty) — передавать ту же копию, - * что и в pop_room_draw, чтобы отрисовка видела изменения. */ -void pop_map_set(uint8_t *fg) __banked; - -/* Связи комнаты (0=нет соседа; иначе номер). Заодно кэширует fg соседей - * слева и справа ЦЕЛИКОМ (читает уровень сам). Оригинал добирается до любой - * колонки через find_room_of_tile, у нас уровень в EMM-странице и маппить её - * на каждый get_tile (горячий путь физики) дорого — поэтому копия соседей. - * Колонка персонажа считается из x и на диапазоне x 0..255 лежит в −5..13, - * то есть заведомо выходит за комнату; кромочных колонок не хватало, и - * get_tile отдавал мнимую стену (BUG-SWORD-GHOST-1). Звать в enter_room. */ -void pop_map_set_edges(uint8_t left, uint8_t right, uint8_t up, uint8_t down) __banked; -/* Перечитать fg соседей (кромочные колонки коллизии) из уровня, не сбрасывая - * историю перекрытий. Нужен, когда тайл соседа изменился, пока тот не - * отрисован — см. pop_neigh_dirty в pop_state.h. */ -void pop_map_refresh_edges(void) __banked; - -/* БОКОВОЙ переход в соседнюю комнату: перенумеровать историю флагов - * перекрытия вместо того, чтобы её выбросить (иначе Кид с разбега проходит - * сквозь закрытые ворота шва — BUG-GATE-PASS-1). dcol — на сколько - * изменились номера колонок: ушли ВПРАВО −10, ВЛЕВО +10. Звать СРАЗУ после - * pop_map_set_edges и только для боковых переходов; вверх/вниз и все прочие - * входы в комнату остаются на полной инвалидации. Разбор — BUGS_CLOSED.md, - * расхождение с дословным портом — ../docs/impl_diff.md. */ -void pop_coll_shift(int8_t dcol) __banked; - -/* check_skel: тайл скелета -> пол + пометка перерисовки (обе страницы). */ -void pop_skel_wake_tile(uint8_t tilepos) __banked; - -/* Openness ворот в (col,row) с резолвом за край комнаты (соседи слева/справа). - * 0xFF — тайла нет. Нужен лучу видимости стража (guards.c). */ -uint8_t pop_gate_modif(int8_t col, int8_t row) __banked; - -/* Номер ТЕКУЩЕЙ комнаты (для доступа к room_modif пик/ворот в pop_trob). - * Звать в enter_room. */ -void pop_map_set_room(uint8_t room) __banked; - -/* Тайл-код текущей комнаты по клетке (col 0..9, row 0..2) — порт - * get_tile(room,col,row) для текущей комнаты. Нужен лучу видимости стража - * (guards.c): он идёт по ряду между Кидом и стражем. */ -uint8_t pop_tile_at(int8_t col, int8_t row) __banked; - -/* Тайлы отрезка ряда c0..c1 одним банковым вызовом (см. тело в pop_map.c): - * луч видимости стража иначе платит по трамплину за КАЖДУЮ колонку. */ -void pop_row_tiles(int8_t row, int8_t c0, int8_t c1, uint8_t *out) __banked; - -/* determine_col (seg006:014D): Kid.curr_col = m7(dx_weight()). Наружу — для - * pop_load_fram_det_col (pop_kid.c), порт load_fram_det_col. */ -void pop_determine_col(void) __banked; - -/* HP/смерть. pop_kid_dead=1 когда Kid убит (пики); hitp_curr — текущее HP. - * pop_kid_hp_reset() ставит старт HP и снимает смерть (звать в kid_init/ - * респавн). */ -extern uint8_t pop_kid_dead; -extern uint8_t hitp_curr; -extern uint8_t hitp_max; /* стартовое HP (для индикатора) */ -extern int8_t hitp_delta; /* урон за кадр от меча; применяет pop_do_delta_hp */ -/* check_fall_flo (seg000:1317) — спецсобытие уровня 13: вход в комнату 23 - * или 16 роняет на Кида гряду плит из комнаты СВЕРХУ, каждую со своей - * задержкой. Звать при входе в комнату ПОСЛЕ pop_loose_reset (порядок - * check_the_end: start_chompers → check_fall_flo → check_shadow). */ -void pop_check_fall_flo(void) __banked; - -void pop_kid_hp_reset(void) __banked; -/* То же для БЕСШОВНОГО старта уровня (pop_seamless): HP не трогаем вовсе. */ -void pop_kid_hp_carry(void) __banked; - -/* hitp_beg_lev (seg003): HP, с которым НАЧАТ текущий уровень. Рестарт - * уровня (смерть/выпадение) откатывает HP ровно к нему; пройденный уровень - * подтягивает его к hitp_max (play_level_2, seg003:410) — так «жизнь» из - * большой склянки переезжает на следующий уровень. Правит главный цикл. */ -extern uint8_t hitp_beg_lev; -#define POP_START_HITP 3 /* custom->start_hitp */ -#define POP_MAX_HITP 10 /* custom->max_hitp_allowed */ -void pop_kid_hp_newgame(void) __banked; /* начало ИГРЫ: hitp_beg_lev = 3 */ - -/* Предметы (seg005 check_get_item/get_item, seg006 do_pickup/proc_get_object). - * pop_have_sword — «меч у Кида» (порт have_sword). pop_item_taken — 0 или - * tilepos+1 только что поднятого предмета: вызывающий обязан запечь тайл - * (он стал полом) на ОБЕИХ страницах и записать override комнаты. */ -extern uint8_t pop_have_sword; -extern uint8_t pop_item_taken; -/* Вспышка фона (do_flash/set_bg_attr, seg001:0908): счётчик кадров, пока - * НУЛЕВАЯ запись палитры подменена ярко-жёлтым. Тикает вызывающий. */ -extern uint8_t pop_flash_time; -/* Цвет вспышки (порт flash_color, seg006 proc_get_object / seg000 feather_fall): - * жёлтая — подобран меч, красная — зелья HP, зелёная — перо. */ -#define POP_FLASH_YELLOW 0 -#define POP_FLASH_RED 1 -#define POP_FLASH_GREEN 2 -#define POP_FLASH_WHITE 3 /* тень: слияние и её смерть (уровень 12) */ -extern uint8_t pop_flash_color; - -/* add_life (seg000:11EC): +1 к ПОТОЛКУ HP и долив до него. Наружу — ради - * слияния с тенью (уровень 12, guards.c в другом банке): большая склянка - * зовёт ту же ветку изнутри модуля. */ -void pop_add_life(void) __banked; - -/* is_feather_fall: кадров, пока действует зелье медленного падения. Читают - * play_seq (опкод JMP_IF_FEATHER — ветки stepfloat/bumpfloat в seqtbl) и - * приложение (сброс на старте уровня, seg003:189). */ -extern uint8_t pop_feather; - -/* upside_down (seg000:15E9): 1 — картинка перевёрнута вверх ногами (зелье - * типа 4 на уровне 9). Читают все слои отрисовки; сбрасывается стартом - * уровня и смертью Кида (seg000:1224). - * pop_upside_dirty — порт need_redraw_because_flipped: флаг «состояние - * переворота ИЗМЕНИЛОСЬ», по нему главный цикл один раз переворачивает уже - * нарисованное (pop_flip_screen) и снимает флаг. */ -extern uint8_t pop_upside; /* ТЕКУЩЕЕ — его читают все слои отрисовки */ -extern uint8_t pop_upside_want; /* ЖЕЛАЕМОЕ — сюда пишут зелье и смерть */ -extern uint8_t pop_upside_dirty; -uint8_t pop_get_item_action(void) __banked; /* 0 нет / 1 присесть / 2 поднять меч / 3 пить */ -void pop_proc_get_object(void) __banked; /* эффект — из play_seq (опкод GET_ITEM) */ - -/* Уход из комнаты ВБОК/ВВЕРХ: 0=нет; 1=left,2=right,3=up (= side+1 для - * pop_room_link). Координаты Kid уже репроецированы (x∓140 / y+189). - * Приложение переключает комнату по соответствующей связи и снимает флаг. */ -extern uint8_t pop_leave_dir; - -/* exit_room_timer (порт seg002 exit_room): пока >0, боковой/нижний leave - * заблокирован (декремент в pop_phys_tick). Приложение ставит =2 при входе - * в комнату (enter_room) — 2 кадра защиты от повторного/транзиентного leave - * (ping-pong у шва, транзиент отскока о ворота, баг #4/BUG-2). */ -extern uint8_t pop_leave_timer; - -/* Loose floors (проваливающиеся полы). pop_loose_modif[30] — состояние на - * тайл (0 покой / 0x80.. тряска / 1..11 отсчёт падения); читает pop_bg при - * отрисовке. pop_loose_tick() — анимация + перерисовка изменившихся тайлов - * на ТЕКУЩЕЙ странице; звать в основном цикле ПОСЛЕ set_draw_page(back), - * рядом с kid-отрисовкой. */ -extern uint8_t pop_loose_modif[30]; -void pop_loose_tick(void) __banked; -void pop_loose_reset(void) __banked; /* сброс loose-состояния при смене комнаты */ -/* Отдать НЕЗАКОНЧЕННЫЕ loose уходящей комнаты в персистентный room_modif + - * список trob, чтобы они досчитались заочно (в оригинале loose и есть trob, - * а do_trobs крутит список независимо от drawn_room). Звать ПЕРЕД любой - * перезагрузкой комнаты, пока карта ещё описывает СТАРУЮ. */ -void pop_loose_leave_room(void) __banked; -/* СТАРТ/РЕСТАРТ уровня: забыть фазы БЕЗ сдачи (load_level сносит всё сам). - * Звать рядом с pop_trob_reset, до первого enter_room. */ -void pop_loose_forget(void) __banked; - -/* Персонаж стоит НА тайле ворот, значит их решётку надо вернуть ПОВЕРХ него - * (порт условия draw_tile_fore, seg008:0D15 — разбор в pop_map.c). Бары - * рисуются в колонке ch->curr_col + 1: графика ворот принадлежит правому - * краю своего тайла. Рисование — pop_fore_over_char (pop_bg.c). */ -uint8_t pop_gate_over_char(const pop_char_t *ch) __banked; - -/* Установлен в tilepos+1 в кадре, когда loose-пол упал (кусок улетел ВНИЗ). - * Приложение: определить debris-приземление в комнате снизу. Снять (=0). */ -extern uint8_t pop_loose_fell; - -/* Плита-ПОТОЛОК: loose ряда 2 комнаты СВЕРХУ (в оригинале — тот же loose с - * отрицательным tilepos, seg006 check_press frame 79 / seg007 animate_loose). - * pop_map_set_above даёт МУТАБЕЛЬНУЮ копию ряда 2 верхнего соседа (ту же, что - * ушла в pop_room_set_above): провалившаяся плита становится в ней EMPTY — - * сверху открывается колодец. pop_ceil_modif[col] — состояние (как - * pop_loose_modif), читает pop_bg. Сигналы приложению (для персистентности - * между входами в комнату): pop_ceil_fell = col+1 провалившейся плиты, - * pop_debris_at = tilepos+1 щебня, оставшегося в ЭТОЙ комнате. Снимать (=0). */ -void pop_map_set_above(uint8_t *above_row2_fg) __banked; -extern uint8_t pop_ceil_modif[10]; -extern uint8_t pop_ceil_fell; -extern uint8_t pop_debris_at; - -/* Взводится в кадре, когда Kid получил урон (hitp_delta<0 оригинала) — - * отрисовка персонажа рисует «брызги» поверх Kid, а главный цикл снимает - * флаг. */ -extern uint8_t pop_kid_hurt; - -/* check_knock (seg003): по флагу knock (play_seq) тряхнуть loose-полы ряда - * приземления/удара. Зовётся из pop_phys_tick. */ -void pop_check_knock(void) __banked; - -/* Установлен в 1, когда Kid пересёк НИЖНЮЮ границу комнаты (провал в дыру - * или спуск-зацеп с кромки). Координаты Kid УЖЕ репроецированы в кадр - * комнаты снизу (y -= 189, curr_row = 0). Приложение решает: если есть - * links.down — сменить комнату (pop_room_load+перерисовка) и продолжить; - * иначе — выпал из уровня (респавн). Снять флаг после обработки. */ -extern uint8_t pop_fell_out; -void pop_map_qsave(pop_qs_io_t *io) __banked; - -/* Пер-кадровая физика ПОСЛЕ kid_tick(play_seq): fall_accel + fall_speed + - * determine_col + check_action (триггер падения / do_fall / приземление). - * Порядок как в оригинале (seg000 play_kid_frame). - * - * Физика внутри работает с АКТИВНЫМ персонажем (Char), как в оригинале, и - * сама открывает окно loadkid/savekid — звать вне окон Char. */ -void pop_phys_tick(void) __banked; - -/* То же для стража — порт хвоста play_guard_frame (seg000:1246). Звать из - * главного цикла СРАЗУ после pop_guard_tick() (тот прокручивает ИИ и - * последовательность), тоже вне окон Char: функция открывает своё. - * - * Физика у стража та же самая (одни функции над Char), отличается только - * список вызовов: нет ухода из комнаты, нет check_knock, вместо check_bumped - * — check_guard_bumped. Тот же вход обслужит скелета/тень/визиря, когда - * они появятся: в оригинале все они живут в слоте Guard. - * - * «Нет ухода из комнаты» — про СВОЙ ход. Следом за Кидом стража переносит - * exit_room/follow_guard (seg002:03C7/039E) — отдельная механика, у нас не - * портирована (GUARD-PHYS). */ -void pop_guard_phys_tick(void) __banked; - -/* clip_char (seg006:1749), верхняя граница клипа спрайта персонажа: если тайл - * над головой — стена/пол, всё выше линии своей полосы не рисуется (Kid, - * ушедший головой под пол при спуске/висе, не просвечивает сквозь щели). - * obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ спрайта, w/h — размер. - * Возврат: КОМНАТНЫЙ y границы, 0 = клипа нет. Зовёт pop_char_draw. */ -int pop_clip_char_top(int obj_x, int obj_y, uint16_t w, uint16_t h) __banked; - -/* Парная половина clip_char: ЭКРАННЫЙ X, правее которого спрайт не рисуется - * (правый косяк двери уровня в кадрах подъёма 224..228). 0 = обрезки нет. */ -int pop_clip_char_right(void) __banked; - -/* Тип препятствия/края ВПЕРЕДИ по направлению (pop_edge_type после - * pop_edge_distance): для control (бежать / осторожный шаг / стоп у стены). */ -#define EDGE_CLOSER 0 /* край уступа над ямой (дистанция = до кромки) */ -#define EDGE_WALL 1 /* стена впереди/под персонажем */ -#define EDGE_FLOOR 2 /* пол (нет препятствия рядом, дистанция = 11) */ - -/* Расстояние до края/стены впереди + побочно g_edge_type (pop_edge_type). */ -int pop_edge_distance(void) __banked; -uint8_t pop_edge_type(void) __banked; -/* Тайл, на котором остановился разбор края (curr_tile2 оригинала). */ -uint8_t pop_edge_tile(void) __banked; - -/* Стена впереди в пределах стопа? Если да — прижимает Kid.x к корректной - * позиции (передний край у стены, симметрично) и возвращает 1. Для - * control_running (чистый стоп у стены). */ -int pop_wall_ahead(void) __banked; - -/* Разбег-прыжок: выравнивание по кромке пола (run_jump, seg005:0AA8). - * Смотрит на 1–2 тайла вперёд; если там провал/пика — подгоняет Kid.x под - * толчок ровно с кромки. 1 = прыгать, 0 = ОТМЕНИТЬ прыжок (Кид не в той - * фазе относительно кромки; control_up гасить НЕЛЬЗЯ — попытка повторится - * на следующем кадре). Без этого провал в три тайла непроходим. */ -uint8_t pop_run_jump_align(void) __banked; - -/* Прыжок вверх в стойке (↑): seq чистого прыжка (seq_28/seq_14) ЛИБО - * прыжка-с-зацепом за уступ выше (seq_8/24/16) + выравнивание Kid.x. - * check_jump_up/grab_up (K4.4). control_up гасит caller. */ -uint8_t pop_jump_up_seq(void) __banked; - -/* ---- Вис/зацеп/спуск (K4.2/K4.3) — тайловые решения для pop_ctrl --- * - * Управление (control_hanging/can_climb_up/hang_fall/down_pressed) в - * pop_ctrl; здесь — предикаты + выбор seq (+ выравнивание Kid.x). */ -uint8_t pop_hang_grab_ready(void) __banked; /* grab_timer истёк — можно climb-up */ -uint8_t pop_hang_climb_up_seq(void) __banked; /* seq_10 / seq_73 (подтягивание) */ -int8_t pop_hang_wall(void) __banked; /* Shift в висе: 1=у стены,-1=fall,0=держ.*/ -uint8_t pop_hang_fall_seq(void) __banked; /* seq_23 / seq_11 (сорваться), +Kid.x */ -uint8_t pop_down_action(void) __banked; /* 1=обработано(спуск/отступ), 0=присед */ - -/* Дверь уровня рядом и ОТКРЫТА ПОЛНОСТЬЮ? → поставить Кида в проём (x + - * разворот влево, go_up_leveldoor) и вернуть 1; иначе 0, Кид не тронут. - * Ветка двери уровня из up_pressed (seg005:0482). Последовательность - * seq_70 ставит вызывающий (pop_ctrl) — тайлы наши, управление его. */ -uint8_t pop_leveldoor_enter(void) __banked; - -/* Зеркало уровня 4 (check_mirror, seg003:0798). Звать раз в кадр ПЕРЕД - * отрисовкой персонажей — в оригинале это первая строка draw_people - * (seg008:228A). Родит тень, если Кид только что пролетел сквозь зеркало. */ -void pop_check_mirror(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_menu.c b/applications/PoP/roomtest/pop_menu.c deleted file mode 100644 index 3bfae66..0000000 --- a/applications/PoP/roomtest/pop_menu.c +++ /dev/null @@ -1,767 +0,0 @@ -/* - * pop_menu.c — pause menu, шрифты и временный UI-слой, БАНК 9. - * - * Отрисовка принципиально идёт GFX_BANK_SPRITE: прозрачный цвет 0xFF - * пропускается, а пауза не становится частью фоновой ОЗУ-копии игры. - * Каждый кадр UI собирается на скрытой - * видеостранице, флипается целиком и затем стирается копией чистого фона. - * Поэтому при переходе между пунктами нет видимой построчной перерисовки. - * - * Шрифты — исходные hc_small_font_data/hc_font_data из SDLPoP, заранее - * переведённые toolchain/pop_extract_font.py в FONT\\FONT.ATL. Атлас в W0 - * нужен ещё и как временное хранилище снимка палитры: затемнение не тратит - * 1 КБ дефицитной W2 и всегда восстанавливает точные цвета уровня. - */ -#include -#include -#include -#include -#include -#include "pop_menu.h" -#include "pop_pal.h" -#include "pop_ui.h" -#include "pop_font.h" /* POP_FONT_*_ASCENT — раскладка считается по шрифту */ -#include "pop_bg.h" /* POP_YOFF/POP_PLAYFIELD_H — границы игровой области */ -#include "pop_cdraw.h" /* POP_HP_Y — нижнюю статус-полосу делим с HP */ -#include "pop_pace.h" -#include "pop_settings.h" -#include "pop_cfg.h" -#include "pop_qsave.h" -#include "pop_status.h" -#include "pop_sfx.h" - -/* --- ОБЩАЯ ВЕРТИКАЛЬНАЯ РАСКЛАДКА ------------------------------------- * - * - * Экран у нас 320x256, но ИГРА занимает только 200 строк: 192 поля тайлов - * плюс 8 строк полосы HP, начиная с POP_YOFF. Всё, что выше и ниже, — - * борта, и на реальном ТВ/мониторе они могут быть срезаны. Поэтому каждый - * экран UI центрируется в этой самой полосе, а не в 256 строках кадра, и - * обязан в неё помещаться целиком. - * - * Блок считается «сверху вниз»: UI_CENTER_TOP отдаёт строку, с которой - * начинается силуэт содержимого (не базовая линия!). Первая базовая линия - * = верх + ascent шрифта, дальше — шаги. */ -#define UI_AREA_TOP POP_YOFF -#define UI_AREA_H (POP_PLAYFIELD_H + 8) /* поле + полоса HP = 200 */ -#define UI_CENTER_TOP(h) (UI_AREA_TOP + (UI_AREA_H - (h)) / 2) -/* Отдельный вариант для экранов, у которых нижняя статус-полоса занята - * своим содержимым: центрируем только по полю тайлов. */ -#define UI_CENTER_FIELD(h) (UI_AREA_TOP + (POP_PLAYFIELD_H - (h)) / 2) - -/* Рамка выделения строки. Заглавные малого шрифта занимают РОВНО пять - * строк [base-ascent .. base-1], поэтому симметричный отступ считается от - * них, а не от базовой линии: SEL_PAD строк воздуха сверху и снизу плюс - * сама линия рамки. Раньше низ рамки брался «на глаз» (base+5), и она - * визуально сидела ниже текста. */ -#define SEL_PAD 3 -#define SEL_TOP_DY (POP_FONT_SMALL_ASCENT + SEL_PAD + 1) /* 9 */ -#define SEL_BOT_DY (SEL_PAD) /* 3 */ - -#define MENU_N_ITEMS 7 -#define MENU_STEP 14 -#define MENU_LIST_H (SEL_TOP_DY + (MENU_N_ITEMS - 1) * MENU_STEP + \ - SEL_BOT_DY + 1) -/* Центрируем СПИСОК по полю тайлов: GAME PAUSED — не пункт меню, а строка - * состояния программы, и в блок центрирования не входит. */ -#define MENU_FIRST_BASE (UI_CENTER_FIELD(MENU_LIST_H) + SEL_TOP_DY) -/* Оригинал пишет её в нижнюю статус-полосу, между делениями HP Кида слева и - * стража справа (SDLPoP rect_bottom_text = {193,70,202,250}, valign_bottom): - * базовая линия на строку ниже полосы, силуэт крупного шрифта ложится ровно - * на неё. */ -#define MENU_PAUSED_BASE (POP_YOFF + POP_HP_Y + 8) -#define MENU_SEL_L 115 -#define MENU_SEL_R 205 -#define MENU_BORDER 0x37 /* светло-серый VGA16, не затемняем */ - -#define UI_LEFT 45 -#define UI_RIGHT 274 -#define UI_VALUE_RIGHT 257 - -#define SETTINGS_N_ITEMS 9 -/* Три секции по одному заголовку: T -> GENERAL, i2 -> GAMEPLAY, - * i6 -> CONTROLS. Между заголовком и строками, как и между строками, — - * фиксированные шаги, поэтому вся высота выражается через них. */ -#define SET_STEP 14 -#define SET_HEAD_GAP 17 -#define SET_BLOCK_H (POP_FONT_BIG_ASCENT + 3 * SET_HEAD_GAP + \ - 9 * SET_STEP + SEL_BOT_DY + 1) -#define SET_TITLE_BASE (UI_CENTER_TOP(SET_BLOCK_H) + POP_FONT_BIG_ASCENT) -#define SET_HEAD1 (SET_TITLE_BASE + SET_HEAD_GAP) -#define SET_HEAD2 (SET_HEAD1 + 4 * SET_STEP + SET_HEAD_GAP) -#define SET_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP) - -/* CONTROLS: число строк зависит от того, включены ли читы, поэтому верх - * блока считается в рантайме. */ -#define CTRL_TITLE_GAP 20 -#define CTRL_N_BASE 7 /* общие клавиши */ -#define CTRL_N_CHEAT 5 /* дополнительные строки читов */ -#define CTRL_COL_KEY 45 -#define CTRL_COL_DESC 145 - -/* ABOUT = ровно тот же текст, что на стартовом Sprinter screen, минус - * строка про клавиши. ABOUT_H — и высота блока, и смещение ПОСЛЕДНЕЙ - * базовой линии от его верха (совпадают, т.к. последняя строка малая). */ -#define ABOUT_GAP1 30 -#define ABOUT_GAP2 15 -#define ABOUT_H (POP_FONT_BIG_ASCENT + 2 * ABOUT_GAP1 + ABOUT_GAP2) -#define BUILD_KEYS_GAP 48 - -/* Подтверждение: рамка карточки, вопрос крупным, две кнопки. */ -#define CONF_BOX_H 66 -#define CONF_TOP UI_CENTER_TOP(CONF_BOX_H) -#define CONF_Q_BASE (CONF_TOP + 20) -#define CONF_BTN_BASE (CONF_TOP + 50) - -/* Уведомление: крупное сообщение + строка про клавиши. */ -#define NOTICE_GAP 44 -#define NOTICE_H (POP_FONT_BIG_ASCENT + NOTICE_GAP) -#define NOTICE_BASE (UI_CENTER_TOP(NOTICE_H) + POP_FONT_BIG_ASCENT) - -#define UI_KEYS_TEXT "ESC, ENTER OR SPACE: CONTINUE" - -/* SDLPoP menu.c: движение = loose_shake_2, подтверждение/Back = - * loose_shake_3, изменение значения = sword_vs_sword. Открытие pause menu - * намеренно без звука. */ -#define MENU_SND_CHANGE 10 -#define MENU_SND_MOVE 21 -#define MENU_SND_SELECT 22 -#define MENU_SND_NONE 0xFF - -/* Значения приходят из Makefile: ID — короткий git commit, DATE — дата - * этого коммита. Fallback оставляет исходник самостоятельным для host/IDE. */ -#ifndef POP_BUILD_ID -#define POP_BUILD_ID "DEV" -#endif -#ifndef POP_BUILD_DATE -#define POP_BUILD_DATE "UNKNOWN" -#endif - -/* Порядок = план §3. SETTINGS — вложенный экран в этом же bank 9. */ -static const uint8_t menu_cmds[MENU_N_ITEMS] = { - POP_MENU_RESUME, - POP_MENU_QUICKSAVE, - POP_MENU_QUICKLOAD, - POP_MENU_RESTART_LEVEL, - POP_MENU_SETTINGS, - POP_MENU_RESTART_GAME, - POP_MENU_QUIT -}; - -static const char * const menu_text[MENU_N_ITEMS] = { - "RESUME", - "QUICKSAVE (F6)", - "QUICKLOAD (F9)", - "RESTART LEVEL", - "SETTINGS", - "RESTART GAME", - "QUIT GAME" -}; - -/* Через bar, а не rectangle: у игры уже есть быстрый rectfill, тогда как - * rectangle тянет тяжёлый универсальный line-движок в и без того тесный W1. */ -static void menu_box(int left, int top, int right, int bottom, uint8_t color) -{ - setfillstyle(SOLID_FILL, color); - bar(left, top, right, top); - bar(left, bottom, right, bottom); - bar(left, top, left, bottom); - bar(right, top, right, bottom); -} - -/* Рамка выделения СТРОКИ: её вертикаль задаёт только базовая линия текста, - * поэтому ни один экран не считает отступы сам. */ -static void menu_sel_box(int left, int right, int baseline) -{ - menu_box(left, baseline - SEL_TOP_DY, right, baseline + SEL_BOT_DY, - MENU_BORDER); -} - -/* Весь UI собирается на скрытой странице. Источник gfx_copy_page — shadow - * видимой страницы, где оверлей отсутствует: все строки ниже идут через - * GFX_BANK_SPRITE. Один ui_end() = один готовый, tear-free кадр. */ -static uint8_t ui_begin(void) -{ - gfx_rect_t full; - uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1); - - /* Полностраничная accel-копия держит DI дольше половины CBL-буфера. - * Закрываем вывод, иначе железо повторяет старые 128 байт (скрежет). - * ui_end откроет его уже с заново заполненной тишиной. */ - pop_sfx_pause(); - gfx_set_draw_page(back); - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - gfx_copy_page(&full, GFX_COPY_DIRECT); - gfx_set_bank(GFX_BANK_SPRITE); - return back; -} - -static void ui_end(uint8_t back) -{ - pop_wait_edge(); /* готовый кадр показать только на фронте */ - gfx_set_visible_page(back); - (void)pop_sfx_start(); -} - -static void menu_sound(uint8_t id) -{ - if (id == MENU_SND_NONE) return; - pop_sfx_play(id); - pop_sfx_tick(); /* play_menu_sound: запуск немедленно */ -} - -static void ui_wait_release(void) -{ - while (kbd_raw_down(KBD_ENTER) || kbd_raw_down(KBD_ESC) || - kbd_raw_down(KBD_SPACE) || - kbd_raw_down(KBD_UP) || kbd_raw_down(KBD_DOWN) || - kbd_raw_down(KBD_LEFT) || kbd_raw_down(KBD_RIGHT)) - pop_wait_edge(); -} - -/* Действие = Enter ИЛИ Space: в оригинале выбор подтверждается обеими, и - * держать их врозь незачем — обе читаются одним фронтом. */ -static uint8_t ui_action_down(void) -{ - return (uint8_t)(kbd_raw_down(KBD_ENTER) || kbd_raw_down(KBD_SPACE)); -} - -/* Информационный экран уже нарисован — ждём Esc/Enter/Space по фронту. */ -static void ui_wait_ack(void) -{ - uint8_t esc_prev = 0, act_prev = 0; - - for (;;) { - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t act = ui_action_down(); - if ((esc && !esc_prev) || (act && !act_prev)) { - ui_wait_release(); - return; - } - esc_prev = esc; act_prev = act; - pop_wait_edge(); - } -} - -static void menu_draw(uint8_t sel) -{ - uint8_t back = ui_begin(); - uint8_t i; - - /* Как в SDLPoP: только затемнённая замороженная сцена, компактный - * список и тонкий серый контур выбора, без непрозрачной карточки. */ - menu_sel_box(MENU_SEL_L, MENU_SEL_R, - MENU_FIRST_BASE + (int)sel * MENU_STEP); - - pop_text_map(); - for (i = 0; i < MENU_N_ITEMS; i++) - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, - MENU_FIRST_BASE + (int)i * MENU_STEP, menu_text[i]); - /* Полосу сначала чистим: там могло висеть сообщение игры («60 MINUTES - * LEFT», «QUICKSAVE»), и две надписи ложились друг на друга. */ - pop_text_unmap(); - pop_status_wipe(); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, MENU_PAUSED_BASE, - "GAME PAUSED"); - pop_text_unmap(); - ui_end(back); -} - -/* Явные (uint8_t) — не «на всякий случай»: SDCC 4.5 на константном - * ВЫРАЖЕНИИ больше 127 в инициализаторе uint8_t даёт warning 158, хотя - * значение помещается (на голом литерале 218 — молчит). */ -static const uint8_t settings_y[SETTINGS_N_ITEMS] = { - (uint8_t)(SET_HEAD1 + 1 * SET_STEP), (uint8_t)(SET_HEAD1 + 2 * SET_STEP), - (uint8_t)(SET_HEAD1 + 3 * SET_STEP), (uint8_t)(SET_HEAD1 + 4 * SET_STEP), - (uint8_t)(SET_HEAD2 + 1 * SET_STEP), (uint8_t)(SET_HEAD2 + 2 * SET_STEP), - (uint8_t)(SET_HEAD2 + 3 * SET_STEP), - (uint8_t)(SET_HEAD3 + 1 * SET_STEP), (uint8_t)(SET_HEAD3 + 2 * SET_STEP) -}; - -static const char * const speed_text[] = { "NORMAL", "FAST", "FASTEST" }; - -static void settings_line(uint8_t item, const char *name, const char *value, - uint8_t selected) -{ - int y = settings_y[item]; - if (selected) menu_sel_box(UI_LEFT, UI_RIGHT, y); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, y, name); - if (value) pop_text_right_mapped(POP_TEXT_SMALL, UI_VALUE_RIGHT, y, value); -} - -static void settings_draw(uint8_t sel) -{ - uint8_t back = ui_begin(); - - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, SET_TITLE_BASE, - "SETTINGS"); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD1, "GENERAL"); - settings_line(0, "SOUND", pop_settings.sound_enabled ? "ON" : "OFF", sel == 0); - settings_line(1, "MUSIC", pop_settings.music_enabled ? "ON" : "OFF", sel == 1); - settings_line(2, "DEBUG BAR", - pop_settings.show_debug_bar ? "ON" : "OFF", sel == 2); - settings_line(3, "RESTORE DEFAULTS...", 0, sel == 3); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD2, "GAMEPLAY"); - settings_line(4, "TIME LIMIT", - pop_settings.time_limit_enabled ? "60 MIN" : "UNLIMITED", - sel == 4); - settings_line(5, "SPEED", speed_text[pop_settings.speed_mode], sel == 5); - settings_line(6, "CHEATS", pop_settings.cheats_enabled ? "ON" : "OFF", sel == 6); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD3, "CONTROLS"); - settings_line(7, "SHOW KEY BINDINGS", 0, sel == 7); - settings_line(8, "ABOUT...", 0, sel == 8); - pop_text_unmap(); - ui_end(back); -} - -/* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за - * ними идут читовые: их показываем, только когда читы включены. */ -static const char * const ctrl_key[CTRL_N_BASE + CTRL_N_CHEAT] = { - "ARROWS", "SHIFT", "ESC", "F6 / F9", "CTRL+S", "CTRL+M", "P", - "K", "I", "SHIFT+L", "U", "F7 / F8" -}; - -static const char * const ctrl_desc[CTRL_N_BASE + CTRL_N_CHEAT] = { - "MOVE / JUMP", "ACTION", "PAUSE MENU", "SAVE / LOAD", "SOUND", "MUSIC", - "SPEED", - "KILL GUARD", "IMMORTAL", "NEXT LEVEL", "FLIP SCREEN", "TIME - / +" -}; - -static void controls_draw(void) -{ - uint8_t back = ui_begin(); - /* С выключенными читами вместо пяти строк идёт одна пояснительная — - * список короче, и блок обязан центрироваться по ФАКТИЧЕСКОЙ высоте. */ - uint8_t cheats = pop_settings.cheats_enabled; - uint8_t rows = (uint8_t)(cheats ? CTRL_N_BASE + CTRL_N_CHEAT - : CTRL_N_BASE + 1); - uint8_t i; - int top = UI_CENTER_TOP(POP_FONT_BIG_ASCENT + CTRL_TITLE_GAP + - (int)(rows - 1) * SET_STEP); - int y = top + POP_FONT_BIG_ASCENT; - - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y, "CONTROLS"); - y += CTRL_TITLE_GAP; - for (i = 0; i < rows; i++) { - const char *key = ctrl_key[i], *desc = ctrl_desc[i]; - if (!cheats && i == CTRL_N_BASE) { key = "CHEATS"; desc = "DISABLED"; } - pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_KEY, y, key); - pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_DESC, y, desc); - y += SET_STEP; - } - pop_text_unmap(); - ui_end(back); -} - -/* Текст экрана About — он же текст стартового Sprinter screen. Общий код - * ровно затем, чтобы эти два экрана не разъехались: пункт меню обязан - * показывать то же самое, только без строки про клавиши. */ -static void about_text(int top) -{ - int y = top + POP_FONT_BIG_ASCENT; - - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y, "PRINCE OF PERSIA"); - y += ABOUT_GAP1; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, - "SPRINTER SP2000 BUILD"); - y += ABOUT_GAP1; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, - "BUILD " POP_BUILD_ID); - y += ABOUT_GAP2; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, POP_BUILD_DATE); -} - -static void about_draw(void) -{ - uint8_t back = ui_begin(); - - pop_text_map(); - about_text(UI_CENTER_TOP(ABOUT_H)); - pop_text_unmap(); - ui_end(back); -} - -static void confirm_draw(const char *question, uint8_t sel) -{ - uint8_t back = ui_begin(); - - menu_box(82, CONF_TOP, 238, CONF_TOP + CONF_BOX_H - 1, MENU_BORDER); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, CONF_Q_BASE, question); - if (sel == 0) menu_sel_box(104, 151, CONF_BTN_BASE); - else menu_sel_box(169, 216, CONF_BTN_BASE); - pop_text_center_mapped(POP_TEXT_SMALL, 128, CONF_BTN_BASE, "YES"); - pop_text_center_mapped(POP_TEXT_SMALL, 192, CONF_BTN_BASE, "NO"); - pop_text_unmap(); - ui_end(back); -} - -static uint8_t ui_confirm(const char *question) -{ - uint8_t sel = 1; /* разрушительные действия по умолчанию NO */ - uint8_t up_prev = 0, down_prev = 0, left_prev = 0, right_prev = 0; - uint8_t esc_prev = 0, ent_prev = 0; - - ui_wait_release(); - confirm_draw(question, sel); - menu_sound(MENU_SND_SELECT); - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t left = kbd_raw_down(KBD_LEFT); - uint8_t right = kbd_raw_down(KBD_RIGHT); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - - if ((up && !up_prev) || (down && !down_prev) || - (left && !left_prev) || (right && !right_prev)) { - sel ^= 1; - redraw = 1; - } - if (esc && !esc_prev) { - ui_wait_release(); - return 0; - } - if (ent && !ent_prev) { - uint8_t yes = (uint8_t)(sel == 0); - ui_wait_release(); - return yes; - } - up_prev = up; down_prev = down; left_prev = left; right_prev = right; - esc_prev = esc; ent_prev = ent; - if (redraw) { - confirm_draw(question, sel); - menu_sound(MENU_SND_MOVE); - } - pop_wait_edge(); - } -} - -static void notice_draw(const char *message) -{ - uint8_t back = ui_begin(); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, NOTICE_BASE, message); - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, - NOTICE_BASE + NOTICE_GAP, UI_KEYS_TEXT); - pop_text_unmap(); - ui_end(back); -} - -static void ui_notice(const char *message) -{ - ui_wait_release(); - notice_draw(message); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static void controls_process(void) -{ - ui_wait_release(); - controls_draw(); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static void about_process(void) -{ - ui_wait_release(); - about_draw(); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static uint8_t settings_finish(uint8_t changed) -{ - int8_t rc; - if (!changed) return 0; - pop_settings_apply(1); - /* ESTEX может уйти в диск на много CBL-периодов. */ - pop_sfx_pause(); - rc = pop_cfg_save(); - (void)pop_sfx_start(); - ui_notice(rc > 0 ? "SETTINGS SAVED" : "SAVE ERROR"); - return 1; -} - -static uint8_t settings_process(void) -{ - uint8_t sel = 0, changed = 0; - uint8_t up_prev = 0, down_prev = 0, left_prev = 0, right_prev = 0; - uint8_t esc_prev = 0, ent_prev = 0; - - ui_wait_release(); - settings_draw(sel); - menu_sound(MENU_SND_SELECT); /* вход во вложенное меню */ - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t left = kbd_raw_down(KBD_LEFT); - uint8_t right = kbd_raw_down(KBD_RIGHT); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - uint8_t change = 0; - uint8_t sound = MENU_SND_NONE; - int8_t delta = 0; - - if (up && !up_prev) { - sel = (uint8_t)(sel ? sel - 1 : SETTINGS_N_ITEMS - 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (down && !down_prev) { - sel = (uint8_t)(sel == SETTINGS_N_ITEMS - 1 ? 0 : sel + 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (esc && !esc_prev) { - uint8_t saved = settings_finish(changed); - ui_wait_release(); - return saved; - } - if ((left && !left_prev) || (right && !right_prev)) - delta = (right && !right_prev) ? 1 : -1; - /* Left/right принадлежат только числовой настройке скорости; - * остальные строки меняются Enter либо Space, чтобы стрелкой не - * открыть случайно Controls и не сбросить параметры. */ - if ((ent && !ent_prev) || (sel == 5 && delta)) { - if (sel == 0) { - pop_settings.sound_enabled ^= 1; change = 1; - } else if (sel == 1) { - pop_settings.music_enabled ^= 1; change = 1; - } else if (sel == 2) { - pop_settings.show_debug_bar ^= 1; change = 1; - } else if (sel == 3) { - if (ui_confirm("RESTORE DEFAULTS?")) { - pop_settings_defaults(); change = 1; - } - redraw = 1; sound = MENU_SND_SELECT; - } else if (sel == 4) { - pop_settings.time_limit_enabled ^= 1; change = 1; - } else if (sel == 5) { - uint8_t speed = pop_settings.speed_mode; - if (delta < 0) speed = (uint8_t)(speed ? speed - 1 : POP_SPEED_FASTEST); - else speed = (uint8_t)(speed == POP_SPEED_FASTEST ? POP_SPEED_NORMAL : speed + 1); - pop_settings.speed_mode = speed; change = 1; - } else if (sel == 6) { - pop_settings.cheats_enabled ^= 1; change = 1; - } else if (sel == 7) { - controls_process(); redraw = 1; sound = MENU_SND_SELECT; - } else if (sel == 8) { - about_process(); redraw = 1; sound = MENU_SND_SELECT; - } - } - if (change) { - /* Настройки работают сразу, а запись откладывается до выхода. */ - pop_settings_apply(1); - changed = 1; - redraw = 1; - sound = MENU_SND_CHANGE; - } - up_prev = up; down_prev = down; left_prev = left; right_prev = right; - esc_prev = esc; ent_prev = ent; - if (redraw) { - settings_draw(sel); - menu_sound(sound); - } - pop_wait_edge(); - } -} - -static int8_t menu_quickload(void) -{ - uint8_t slots; - /* probe делает open/close на D:, поэтому насос в это время выключен. */ - pop_sfx_pause(); - slots = pop_qsave_probe(); - (void)pop_sfx_start(); - if (slots & POP_QS_SLOT_SAVE) return POP_MENU_QUICKLOAD; - if ((slots & POP_QS_SLOT_BACKUP) && ui_confirm("LOAD BACKUP?")) - return POP_MENU_QUICKLOAD_BACKUP; - if (!(slots & POP_QS_SLOT_BACKUP)) ui_notice("NO QUICKLOAD"); - return POP_MENU_NONE; -} - -/* Вернуть чистую сцену на ОБЕ страницы и показать ту, которая была до - * меню. Это важно и для отладочного single-buffer: главный цикл там - * ожидает страницу 0, а не ту, в которую меню сделало последний флип. */ -static void menu_erase(uint8_t entry_page) -{ - gfx_rect_t full; - uint8_t visible = gfx_get_visible_page(); - uint8_t hidden = (uint8_t)(visible ^ 1); - - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - - /* Из shadow видимой страницы берём кадр без текстов. */ - gfx_set_draw_page(hidden); - gfx_copy_page(&full, GFX_COPY_DIRECT); - pop_wait_edge(); - gfx_set_visible_page(hidden); - - /* Теперь чистая hidden — источник для второй страницы. */ - gfx_set_draw_page(visible); - gfx_copy_page(&full, GFX_COPY_DIRECT); - if (entry_page != hidden) { - pop_wait_edge(); - gfx_set_visible_page(entry_page); - } -} - -static void build_info_draw(void) -{ - uint8_t back = pop_screen_begin(); - int top = UI_CENTER_TOP(ABOUT_H + BUILD_KEYS_GAP); - - pop_screen_fill(BLACK); - gfx_set_bank(GFX_BANK_SPRITE); - pop_text_map(); - about_text(top); - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, - top + ABOUT_H + BUILD_KEYS_GAP, UI_KEYS_TEXT); - pop_text_unmap(); - pop_screen_present(back); -} - -/* В roomtest ещё нет автомата TITLE (это FG1/FG6), поэтому build screen - * показывается перед первым игровым кадром и после выхода возвращает ровно - * ту же сцену. Настройка уже прочитана в pop_boot до initgraph. */ -void pop_build_info_show(void) __banked -{ - uint8_t entry_page, saved_page, saved_bank, frames; - struct fillsettingstype saved_fill; - - if (!pop_ui_ready() || !pop_settings.show_build_info) return; - entry_page = gfx_get_visible_page(); - saved_page = gfx_get_draw_page(); - saved_bank = gfx_get_bank(); - getfillsettings(&saved_fill); - /* Первый реальный пользователь FG5 fade: старая игровая палитра - * запоминается в pop_ui, затем full-screen появляется из чёрного. */ - pop_pal_fade_out(4); - build_info_draw(); - pop_pal_fade_in(4); - for (frames = 0; frames < 150; frames++) { /* около трёх секунд */ - if (kbd_raw_down(KBD_ESC) || kbd_raw_down(KBD_ENTER) || - kbd_raw_down(KBD_SPACE)) - break; - pop_wait_edge(); - } - ui_wait_release(); - pop_pal_fade_out(4); - menu_erase(entry_page); - pop_pal_fade_in(4); - setfillstyle(saved_fill.pattern, saved_fill.color); - gfx_set_bank(saved_bank); - gfx_set_draw_page(saved_page); -} - -int pop_menu_init(void) __banked -{ - return pop_ui_init(); -} - -void pop_menu_free(void) __banked -{ - pop_ui_free(); -} - -int8_t pop_menu_process(void) __banked -{ - uint8_t sel = 0; - uint8_t up_prev = 0, down_prev = 0, esc_prev = 0, ent_prev = 0; - uint8_t entry_page, saved_page, saved_bank; - uint8_t exit_sound = MENU_SND_NONE; - struct fillsettingstype saved_fill; - int8_t result = POP_MENU_NONE; - - if (!pop_menu_request) return POP_MENU_NONE; - pop_menu_request = 0; - if (!pop_ui_ready()) return POP_MENU_RESUME; - - /* Открыли по НАЖАТИЮ Esc: дождаться отпускания, иначе то же нажатие - * закроет меню раньше первого кадра. pop_wait_edge опрашивает FIFO. */ - while (kbd_raw_down(KBD_ESC)) pop_wait_edge(); - - entry_page = gfx_get_visible_page(); - saved_page = gfx_get_draw_page(); - saved_bank = gfx_get_bank(); - getfillsettings(&saved_fill); - pop_sfx_pause(); /* snapshot/dim + первый full redraw */ - pop_pal_snapshot(); - /* 50 % яркости; диапазон UI остаётся ярким. Долю берём от шкалы, а не - * числом: ступеней стало 32 вместо четырёх, и прежняя «2» означала бы - * теперь затемнение на одну шестнадцатую — фон под меню почти не гас - * (поймано пользователем 2026-08-26). */ - pop_pal_menu_dim(POP_PAL_DIM_BLACK / 2); - menu_draw(sel); - - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - uint8_t sound = MENU_SND_NONE; - - if (up && !up_prev) { - sel = (uint8_t)(sel ? sel - 1 : MENU_N_ITEMS - 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (down && !down_prev) { - sel = (uint8_t)(sel == MENU_N_ITEMS - 1 ? 0 : sel + 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (esc && !esc_prev) { - result = POP_MENU_RESUME; - break; - } - if (ent && !ent_prev && menu_cmds[sel] != POP_MENU_NONE) { - uint8_t cmd = menu_cmds[sel]; - if (cmd == POP_MENU_SETTINGS) { - (void)settings_process(); - redraw = 1; sound = MENU_SND_SELECT; /* Back -> pause menu */ - } else if (cmd == POP_MENU_QUICKLOAD) { - result = menu_quickload(); - if (result != POP_MENU_NONE) { exit_sound = MENU_SND_SELECT; break; } - redraw = 1; sound = MENU_SND_SELECT; - } else if (cmd == POP_MENU_QUIT) { - if (ui_confirm("QUIT GAME?")) { - result = POP_MENU_QUIT; - exit_sound = MENU_SND_SELECT; - break; - } - redraw = 1; sound = MENU_SND_SELECT; - } else { - result = (int8_t)cmd; - exit_sound = MENU_SND_SELECT; - break; - } - } - up_prev = up; down_prev = down; esc_prev = esc; ent_prev = ent; - - if (redraw) { - menu_draw(sel); - menu_sound(sound); - } - pop_wait_edge(); - pop_pace_end(pop_pace_n(0)); /* игра стоит — обычный темп */ - } - - pop_sfx_pause(); /* две full-page копии menu_erase */ - menu_erase(entry_page); - /* menu_erase вернул обе страницы из тени, снятой ДО меню: всё, что - * статус-полосы нарисовали за это время (или сообщение, дотикавшее в - * паузе), надо выложить заново. */ - pop_status_invalidate(); - pop_pal_apply(0); - setfillstyle(saved_fill.pattern, saved_fill.color); - gfx_set_bank(saved_bank); - gfx_set_draw_page(saved_page); - (void)pop_sfx_start(); - menu_sound(exit_sound); /* Esc main menu остаётся бесшумным */ - return result; -} diff --git a/applications/PoP/roomtest/pop_menu.h b/applications/PoP/roomtest/pop_menu.h deleted file mode 100644 index ef12301..0000000 --- a/applications/PoP/roomtest/pop_menu.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * pop_menu.h — контракт pause menu (план docs/menu_settings_plan.md §10.3, - * этап MS0). - * - * UI НЕ вызывает gameplay-модули напрямую: меню формирует КОМАНДУ, а - * исполнение остаётся в главном цикле (roomtest.c). Вся работа с меню — - * код, шрифты и таблицы строк — живёт в БАНКЕ 9. Флаг запроса принадлежит - * главному циклу (W2): это единственная резидентная граница UI. - */ -#ifndef POP_MENU_H -#define POP_MENU_H - -#include - -typedef enum { - POP_MENU_NONE = 0, /* меню не открывалось / пункт-заглушка */ - POP_MENU_RESUME, /* закрыть меню, продолжить игру */ - POP_MENU_QUICKSAVE, /* то же, что F6 */ - POP_MENU_QUICKLOAD, /* то же, что F9 */ - POP_MENU_RESTART_LEVEL, /* штатный reset текущего уровня (без CFG) */ - POP_MENU_RESTART_GAME, /* новая игра с уровня 1, настройки и SAV */ - POP_MENU_QUIT, /* выход из программы (после подтверждения) */ - POP_MENU_QUICKLOAD_BACKUP, /* загрузить подтверждённый POP.BAK */ - POP_MENU_SETTINGS /* внутренний экран Settings (не возвращается) */ -} pop_menu_cmd_t; - -/* Флаг запроса в roomtest.c (W2); банк читает напрямую. */ -extern uint8_t pop_menu_request; - -/* Загрузить/освободить EMM-атлас исходных шрифтов SDLPoP. Вызывается из - * холодного boot/shutdown, не из кадрового пути. */ -int pop_menu_init(void) __banked; -void pop_menu_free(void) __banked; - -/* Граница кадра. Запроса нет — мгновенный POP_MENU_NONE. Меню МОДАЛЬНО: - * пока открыто, не возвращается (игра стоит — логика, таймер и звуковой - * насос главного цикла просто не выполняются); по выбору пользователя - * отдаёт pop_menu_cmd_t. */ -int8_t pop_menu_process(void) __banked; - -/* Экран Sprinter build, если он включён в POP.CFG. Вызывается после - * открытия raw-клавиатуры и до первого игрового кадра. */ -void pop_build_info_show(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_music.c b/applications/PoP/roomtest/pop_music.c deleted file mode 100644 index b6848df..0000000 --- a/applications/PoP/roomtest/pop_music.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * pop_music.c — загрузка и запуск музыкального трека, БАНК 9. - * - * Здесь только холодная часть: выделить страницы EMM, вычитать в них куски - * m_.bin и выставить курсор. Сам вывод делает насос CBL в - * резиденте (pop_sfx.c): когда эффект не звучит, он берёт байты отсюда, а - * не из блока тишины. Контракт и мотивация — в pop_music.h. - * - * Имя файла собираем вручную, без sprintf: printf-семейство в резидент не - * тянем, а тут и формат-то из двух чисел. - */ -#include -#include -#include -#include -#include "pop_music.h" -#include "pop_music_tbl.h" -#include "pop_sfx.h" -#include "pop_app.h" /* POP_APP_DEMO — в демке музыки нет */ - -uint8_t pop_mus_page[POP_MUS_PAGES]; - -/* Два слота: играющий и подгружаемый. Своей таблицы страниц слот НЕ - * держит — её и так хранит блок EMM, и mem_get_page отдаёт номер по - * индексу. Резидентный pop_mus_page[] заполняется на pop_music_play, для - * одного слота: 40 байт W2 у игры лишних нет. */ -#define MUS_SLOTS 2 -static uint8_t slot_blk[MUS_SLOTS]; /* блок EMM, 0 — слот пуст */ -static uint8_t slot_pages[MUS_SLOTS]; -static uint16_t slot_blocks[MUS_SLOTS]; -static uint8_t slot_id[MUS_SLOTS]; -static uint8_t mus_cur; /* слот, что играет/играл */ -static uint8_t mus_ready; /* слот+1, готовый к запуску */ - -/* "MUS\mNN.bin" — ровно 8.3, как требует DSS. */ -static void mus_name(char *buf, uint8_t id) -{ - buf[0] = 'M'; buf[1] = 'U'; buf[2] = 'S'; buf[3] = '\\'; - buf[4] = 'm'; - buf[5] = (char)('0' + id / 10); - buf[6] = (char)('0' + id % 10); - buf[7] = '.'; buf[8] = 'b'; buf[9] = 'i'; buf[10] = 'n'; - buf[11] = 0; -} - -/* ld_busy отдельно от ld_fd: инициализаторов у статиков в банке нет - * (crt0 зануляет _DATA), а «нет открытого файла» — это не ноль. */ -static uint8_t ld_busy; -static int ld_fd; -static uint8_t ld_slot; -static uint8_t ld_next; /* следующая страница к чтению */ -static uint8_t ld_pages; -static uint8_t ld_id; - -static void slot_release(uint8_t n) -{ - if (slot_blk[n]) { - mem_free_block(slot_blk[n]); - slot_blk[n] = 0; - } - slot_pages[n] = 0; - slot_blocks[n] = 0; -} - -/* --- ПОТОКОВЫЙ ТРЕК: КОЛЬЦО СТРАНИЦ ---------------------------------- * - * - * Финальная тема (`won`, 115 с) — это 1,2 МБ и 78 страниц EMM. Держать её - * в памяти нельзя ни при каком бюджете, поэтому она играется из НЕСКОЛЬКИХ - * страниц по кругу: насос идёт по кольцу (pop_mus_ring), а загрузчик - * дочитывает файл в те страницы, которые насос уже прошёл. - * - * Кто кого догоняет. Страница звучит 1,5 с, а читается 33 мс — запас - * сорокакратный, так что «не успеть» можно только застряв на секунду. - * Дистанцию считаем без отдельных счётчиков: страница ровно 128 блоков - * насоса, поэтому проигранных страниц = (всего блоков - осталось) / 128. - * Пока прочитано меньше, чем проиграно плюс размер кольца, — в кольце есть - * свободный слот, и следующую страницу можно читать. - * - * Файл читаем ПОСЛЕДОВАТЕЛЬНО, без lseek: страницы идут по порядку, и fd - * сам стоит там, где надо. */ -#define RING_PAGES 6 /* 96 КБ = 9 с звучания, запас с лихвой */ - -static uint8_t ring_on; /* идёт потоковый трек */ -static uint8_t ring_blk; /* EMM-блок кольца */ -static uint8_t ring_fd_open; -static int ring_fd; -static uint8_t ring_file_pages; /* страниц в файле */ -static uint8_t ring_loaded; /* сколько уже прочитано */ -static uint16_t ring_total; /* длина трека в блоках насоса */ - -void pop_music_ring_stop(void) __banked; - -void pop_music_stop(void) __banked -{ - pop_mus_left = 0; -} - -void pop_music_free(void) __banked -{ - if (ring_on) pop_music_ring_stop(); - if (ld_busy) { close(ld_fd); ld_busy = 0; } - pop_mus_left = 0; - slot_release(0); - slot_release(1); - mus_ready = 0; -} - -/* --- загрузка --------------------------------------------------------- - * - * ПОСТРАНИЧНО, А НЕ ЦЕЛИКОМ. Реплики сцены с принцессой идут встык, и - * следующую надо читать, пока звучит текущая. Трек — до 320 КБ, целиком - * это 0,7 с диска: на 7,5 кадрах в секунду сцена встала бы на пять кадров. - * Одна страница стоит 33 мс — меньше четверти кадра, и подкачка растворя- - * ется в анимации. Кто может позволить себе паузу (титры, чёрный экран - * между сценами), зовёт pop_music_load — тот же цикл, но целиком. */ -static void load_abort(void) -{ - if (ld_busy) close(ld_fd); - ld_busy = 0; - slot_release(ld_slot); -} - -int8_t pop_music_load_begin(uint8_t id) __banked -{ - char name[12]; - uint8_t pages, n; - - if (ring_on) pop_music_ring_stop(); /* потоковый трек и слоты не дружат */ - if (ld_busy) load_abort(); - if (id >= POP_MUS_COUNT) return -1; - pages = pop_mus_tbl[id].pages; - if (!pages || pages > POP_MUS_PAGES) return -1; - - /* Грузим ВСЕГДА в не текущий слот: играющий трек читает свои страницы - * из прерывания, и отобрать их у него нельзя. */ - n = (uint8_t)(mus_cur ^ 1); - slot_release(n); - mus_name(name, id); - /* Трек лежит ОДНИМ файлом, и fd остаётся открытым до последней - * страницы: `open` стоит дороже самого чтения (51,4 мс против 32,6 мс - * на 16 КБ), и платить его на каждую страницу — чистые потери. */ - ld_fd = open(name, O_RDONLY); - if (ld_fd < 0) return -1; - slot_blk[n] = mem_alloc_pages(pages); - if (!slot_blk[n]) { close(ld_fd); return -1; } - ld_busy = 1; - ld_slot = n; - ld_next = 0; - ld_pages = pages; - ld_id = id; - return 0; -} - -int8_t pop_music_load_step(void) __banked -{ - uint8_t p; - - if (!ld_busy) return 1; /* нечего грузить */ - p = mem_get_page(slot_blk[ld_slot], ld_next); - /* Последняя страница короче — читаем сколько есть; ошибку ловим по - * отрицательному коду, а не по «не 16384». */ - if (!p || bank_read_page(ld_fd, p, 0, 16384) < 0) { - load_abort(); - return -1; - } - if (++ld_next < ld_pages) return 0; - - close(ld_fd); - ld_busy = 0; - slot_pages[ld_slot] = ld_pages; - slot_blocks[ld_slot] = pop_mus_tbl[ld_id].blocks; - slot_id[ld_slot] = ld_id; - mus_ready = (uint8_t)(ld_slot + 1); - return 1; -} - -uint8_t pop_music_loading(void) __banked -{ - return ld_busy; -} - -int8_t pop_music_load(uint8_t id) __banked -{ - int8_t r; - - if (pop_music_load_begin(id) != 0) return -1; - do { - r = pop_music_load_step(); - } while (r == 0); - return (r < 0) ? -1 : 0; -} - -/* ЗАПУСК С ПОДКАЧКОЙ НА ХОДУ — для игровых джинглов (смерть, зелья, меч). - * Ждать полной загрузки нельзя: это фриз на треть секунды посреди игры. - * Зато можно начать сразу после ПЕРВОЙ страницы: она звучит 1,5 с, а - * следующая читается 33 мс — запас сорокакратный. Дальше вызывающий - * доливает по странице за кадр (pop_music_load_step, pop_music_loading). - * - * Номера страниц известны сразу после mem_alloc_pages, поэтому таблицу для - * насоса заполняем целиком: данные в этих страницах появятся раньше, чем - * он до них доберётся. - * 0 — играет, -1 — трека нет или память кончилась. */ -int8_t pop_music_stream(uint8_t id) __banked -{ - uint8_t i, n; - - if (ring_on) pop_music_ring_stop(); /* см. pop_music_play */ - if (pop_music_load_begin(id) != 0) return -1; - if (pop_music_load_step() < 0) return -1; /* первая страница */ - n = ld_slot; - pop_mus_left = 0; /* насос — на тишину */ - for (i = 0; i < ld_pages; i++) - pop_mus_page[i] = mem_get_page(slot_blk[n], i); - if (n != mus_cur) slot_release(mus_cur); - mus_cur = n; - slot_pages[n] = ld_pages; - slot_blocks[n] = pop_mus_tbl[id].blocks; - slot_id[n] = id; - pop_mus_id = id; - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_left = slot_blocks[n]; - return 0; -} - -void pop_music_play(void) __banked -{ - uint8_t n, i; - - if (!mus_ready) return; - /* СНЯТЬ КОЛЬЦО. Если до этого играл потоковый трек (финал), насос всё - * ещё заворачивал бы страницы по кругу шести — обычный трек звучал бы - * своей первой третью без конца (поймано на титрах после победы). */ - if (ring_on) pop_music_ring_stop(); - n = (uint8_t)(mus_ready - 1); - /* Насос обязан замолчать ДО подмены таблицы страниц: иначе он успеет - * взять порцию по новому индексу из старого курсора. */ - pop_mus_left = 0; - for (i = 0; i < slot_pages[n]; i++) - pop_mus_page[i] = mem_get_page(slot_blk[n], i); - if (n != mus_cur) slot_release(mus_cur); - mus_cur = n; - mus_ready = 0; - /* Порядок важен: сначала позиция, потом длина. Насос стартует ровно - * с той порции, где left стал ненулевым, и промежуточное состояние - * «играем, но курсор от прошлого трека» не возникает. */ - pop_mus_id = slot_id[n]; /* до left: менеджер спросит готовое */ - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_left = slot_blocks[n]; -} - - -static void ring_close_file(void) -{ - if (ring_fd_open) { close(ring_fd); ring_fd_open = 0; } -} - -void pop_music_ring_stop(void) __banked -{ - pop_mus_left = 0; - pop_mus_ring = 0; - ring_close_file(); - if (ring_blk) { mem_free_block(ring_blk); ring_blk = 0; } - ring_on = 0; -} - -int8_t pop_music_ring_start(uint8_t id) __banked -{ - char name[12]; - uint8_t i, page; - - if (id >= POP_MUS_COUNT || !pop_mus_tbl[id].pages) return -1; - pop_music_free(); /* обычные слоты кольцу не нужны */ - pop_music_ring_stop(); - mus_name(name, id); - ring_fd = open(name, O_RDONLY); - if (ring_fd < 0) return -1; - ring_fd_open = 1; - ring_blk = mem_alloc_pages(RING_PAGES); - if (!ring_blk) { ring_close_file(); return -1; } - ring_file_pages = pop_mus_tbl[id].pages; - ring_total = pop_mus_tbl[id].blocks; - /* Заполняем кольцо целиком: старт с полным буфером даёт девять секунд - * форы, и первая же тяжёлая сцена финала не догонит насос. */ - for (i = 0; i < RING_PAGES; i++) { - page = mem_get_page(ring_blk, i); - pop_mus_page[i] = page; - if (!page || - (i < ring_file_pages && bank_read_page(ring_fd, page, 0, 16384) < 0)) { - pop_music_ring_stop(); - return -1; - } - } - ring_loaded = (uint8_t)(ring_file_pages < RING_PAGES ? ring_file_pages - : RING_PAGES); - if (ring_loaded >= ring_file_pages) ring_close_file(); - ring_on = 1; - pop_mus_id = id; - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_ring = RING_PAGES; /* насос пойдёт по кругу */ - pop_mus_left = ring_total; - return 0; -} - -/* Один шаг подкачки: страница файла в слот, который насос уже прошёл. */ -static void ring_step(void) -{ - uint16_t played; - uint8_t played_pg, page; - - if (!ring_on) return; - if (!pop_mus_left) { /* трек доиграл — отпустить память */ - pop_music_ring_stop(); - return; - } - if (ring_loaded >= ring_file_pages) return; /* файл прочитан весь */ - played = (uint16_t)(ring_total - pop_mus_left); - played_pg = (uint8_t)(played >> 7); /* 128 блоков на страницу */ - if ((uint8_t)(ring_loaded - played_pg) >= RING_PAGES) return; /* полно */ - page = pop_mus_page[ring_loaded % RING_PAGES]; - if (!page || bank_read_page(ring_fd, page, 0, 16384) < 0) { - pop_music_ring_stop(); - return; - } - ring_loaded++; - if (ring_loaded >= ring_file_pages) ring_close_file(); -} - -void pop_music_service(void) __banked -{ - /* Один вызов на кадр из ЛЮБОГО цикла — игрового, интро, катсцены. - * Заявку кладёт pop_sfx_play (звук без оцифровки = музыка оригинала), - * а диск трогаем только здесь. */ - /* В ЗАСТАВОЧНОЙ ДЕМКЕ МУЗЫКИ НЕТ. Точечные условия оригинала (смерть, - * убитый страж) расставлены по своим местам, но гейт нужен и общий: - * демо проигрывает записанные нажатия, и любой музыкальный повод — - * подобранный меч, зелье — зазвучал бы там, где оригинал играет одни - * эффекты. */ - if (ring_on) { ring_step(); return; } /* потоковый трек — свой путь */ - if (!pop_mus_want || pop_app_state == POP_APP_DEMO) { - /* Выключили на ходу: оборвать поток и замолчать. Эффекты при этом - * продолжают звучать — у них свой тумблер. */ - if (pop_mus_req) pop_mus_req = 0; - if (ld_busy || pop_mus_left) pop_music_free(); - return; - } - if (pop_mus_req) { - uint8_t id = pop_mus_req; - - pop_mus_req = 0; - (void)pop_music_stream(id); - } else if (ld_busy) { - (void)pop_music_load_step(); - } -} - -uint8_t pop_music_busy(void) __banked -{ - return (uint8_t)(pop_mus_left != 0); -} diff --git a/applications/PoP/roomtest/pop_music.h b/applications/PoP/roomtest/pop_music.h deleted file mode 100644 index 9182d4a..0000000 --- a/applications/PoP/roomtest/pop_music.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * pop_music.h — музыкальный трек через тот же CBL, что и эффекты. - * - * ПОЧЕМУ PCM, А НЕ AY. Оцифровки музыки в игре нет вовсе: digisnd*.dat - * содержит только эффекты, музыка лежит MIDI под Adlib. Зато есть готовые - * записи DOS-версии, и путь «запись -> сырой поток CBL» не требует ни - * синтезатора на хосте, ни аранжировки под три канала AY (разбор вариантов - * — ../docs/sound_plan.md §1). Плата известна: CBL один, поэтому пока - * играет музыка, эффектов нет. Оригинал ведёт себя так же — play_sound - * там глушит предыдущий звук. - * - * ГДЕ УМЕСТНО. Заставки и титры: эффектов там не бывает, картинка - * статична, и загрузка сотни-другой килобайт с диска никому не мешает. - * Музыка ПО ХОДУ игры (джинглы смерти, зелья) — отдельный вопрос, её - * придётся либо гасить эффектами, либо уводить на AY. - * - * ФОРМАТ на диске — один файл MUS\m.bin на трек, читается порциями по - * 16 КБ из одного открытого fd (bank_read_page). Каталог с длинами - * генерирует toolchain/pop_pack_music.py в pop_music_tbl.h. - */ -#ifndef POP_MUSIC_H -#define POP_MUSIC_H - -#include - -/* Сколько страниц EMM держим под трек. Двадцать = 320 КБ, это все - * заставочные треки, кроме финального «won» (115 с, 1,2 МБ): тот придётся - * либо резать, либо стримить, и это отдельная задача. */ -#define POP_MUS_PAGES 20 - -/* Номера треков — нумерация оригинала (SDLPoP data/music/names.txt). */ -#define POP_MUS_INTRO 54 /* тема заставки, звучит на титрах */ -#define POP_MUS_STORY_1 55 /* «In the absence of the Sultan...» */ -#define POP_MUS_STORY_2 50 /* принцесса ждёт */ -#define POP_MUS_STORY_3 53 /* входит Джафар */ -#define POP_MUS_STORY_4 52 /* Джафар уходит */ -#define POP_MUS_WON 56 /* победа: 115 с, только потоком */ - -/* Курсор проигрывания — читает НАСОС (pop_sfx.c, резидент), пишет - * загрузчик. Отдельный от эффектов: они звучат поверх музыки, а не - * вместо неё, и у каждого свой источник. */ -extern uint8_t pop_mus_page[POP_MUS_PAGES]; /* физические страницы EMM */ -extern volatile uint8_t pop_mus_pg; /* индекс текущей страницы */ -extern volatile uint16_t pop_mus_ptr; /* адрес в окне W0 */ -extern volatile uint16_t pop_mus_left; /* порций до конца, 0 — молчим */ -/* Номер играющего трека (нумерация оригинала). Нужен менеджеру звука: - * музыка участвует в таблицах приоритета наравне с эффектами. */ -extern uint8_t pop_mus_id; -/* Размер кольца страниц для потокового трека; 0 — обычный режим. */ -extern uint8_t pop_mus_ring; - -/* ДВА СЛОТА. Заставочные сцены идут цепочкой треков (титры -> история -> - * PV из трёх реплик), и загрузка каждого — это полсекунды-секунда диска. - * Прятать её в паузу между репликами негде: пауз в оригинале нет, там - * следующая реплика начинается сразу. Поэтому слотов два: пока звучит - * один, следующий читается во второй, и переключение стоит копирования - * двадцати байт таблицы страниц. - * - * Загрузить трек в свободный слот (НЕ запускает; играющий трек не трогает). - * 0 — готово, -1 — нет трека/памяти/файла. */ -int8_t pop_music_load(uint8_t id) __banked; - -/* ТА ЖЕ ЗАГРУЗКА ПО ОДНОЙ СТРАНИЦЕ ЗА ВЫЗОВ — для тех, кому нельзя - * замереть на секунду: страница стоит 33 мс, то есть четверть кадра - * заставочной сцены, и подкачка следующей реплики не видна. - * begin — открыть файл и занять страницы (0 / -1); - * step — прочитать очередную: 0 — ещё есть, 1 — трек готов к play, - * -1 — ошибка (слот освобождён); - * loading — идёт ли чтение (звать step имеет смысл, пока 1). - * Оборвать начатое чтение можно pop_music_free. */ -int8_t pop_music_load_begin(uint8_t id) __banked; -int8_t pop_music_load_step(void) __banked; -uint8_t pop_music_loading(void) __banked; - -/* Отпустить ОБА слота. Останавливает проигрывание, если оно шло. */ -void pop_music_free(void) __banked; - -/* Пустить трек СРАЗУ, дочитывая его по ходу звучания: первая страница - * читается здесь (33 мс), остальные — вызывающим, по одной за кадр, пока - * pop_music_loading(). Для игровых джинглов, где паузы на диск быть не - * может. 0 — играет, -1 — трека нет либо не хватило памяти. */ -int8_t pop_music_stream(uint8_t id) __banked; - -/* Пустить последний загруженный трек с начала; слот предыдущего при этом - * освобождается. Без парного load ничего не делает. */ -void pop_music_play(void) __banked; -void pop_music_stop(void) __banked; - -/* ОБСЛУЖИВАНИЕ МУЗЫКИ — один вызов на кадр из любого цикла (игра, интро, - * катсцена): разбирает заявку pop_mus_req и доливает страницы начатого - * стрима. Всё чтение с диска живёт здесь. */ -void pop_music_service(void) __banked; - -/* ПОТОКОВЫЙ ТРЕК ИЗ КОЛЬЦА СТРАНИЦ — для того, что в память не влезает. - * Финал `won` весит 1,2 МБ (78 страниц); играется из шести по кругу, а - * дочитывает его pop_music_service, пока трек звучит. - * 0 — играет, -1 — нет файла/памяти. Останавливает pop_music_ring_stop - * (её же зовёт pop_music_free). */ -int8_t pop_music_ring_start(uint8_t id) __banked; -void pop_music_ring_stop(void) __banked; - -/* Трек ещё звучит? 0 — доиграл или не запускался. */ -uint8_t pop_music_busy(void) __banked; - -#endif /* POP_MUSIC_H */ diff --git a/applications/PoP/roomtest/pop_music_tbl.h b/applications/PoP/roomtest/pop_music_tbl.h deleted file mode 100644 index 94c7e00..0000000 --- a/applications/PoP/roomtest/pop_music_tbl.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * pop_music_tbl.h — каталог музыкальных треков, СГЕНЕРИРОВАН. - * Источник: applications/PoP/PoP1_DOS_music/flac (записи DOS-версии). - * Генератор: toolchain/pop_pack_music.py. Руками не править. - * - * Нумерация id — оригинала (SDLPoP data/music/names.txt). pages — - * сколько кусков m_.bin лежит на диске, blocks — длина трека - * в порциях насоса по 128 байт (в байтах не влезло бы в uint16). - */ -#ifndef POP_MUSIC_TBL_H -#define POP_MUSIC_TBL_H - -#include - -#define POP_MUS_COUNT 57 -#define POP_MUS_BLOCK 128 -#define POP_MUS_MAX_PAGES 78 - -typedef struct { - uint8_t pages; /* 0 — трека нет */ - uint16_t blocks; /* длина в порциях по 128 байт */ -} pop_mus_ent_t; - -static const pop_mus_ent_t pop_mus_tbl[POP_MUS_COUNT] = { - { 0, 0 }, /* 0 */ - { 0, 0 }, /* 1 */ - { 0, 0 }, /* 2 */ - { 0, 0 }, /* 3 */ - { 0, 0 }, /* 4 */ - { 0, 0 }, /* 5 */ - { 0, 0 }, /* 6 */ - { 0, 0 }, /* 7 */ - { 0, 0 }, /* 8 */ - { 0, 0 }, /* 9 */ - { 0, 0 }, /* 10 */ - { 0, 0 }, /* 11 */ - { 0, 0 }, /* 12 */ - { 0, 0 }, /* 13 */ - { 0, 0 }, /* 14 */ - { 0, 0 }, /* 15 */ - { 0, 0 }, /* 16 */ - { 0, 0 }, /* 17 */ - { 0, 0 }, /* 18 */ - { 0, 0 }, /* 19 */ - { 0, 0 }, /* 20 */ - { 0, 0 }, /* 21 */ - { 0, 0 }, /* 22 */ - { 0, 0 }, /* 23 */ - { 3, 305 }, /* 24 regular_death */ - { 2, 196 }, /* 25 find_mirror_and_find_shadow */ - { 9, 1132 }, /* 26 embrace */ - { 8, 915 }, /* 27 cutscene_before_2_4_6_12 */ - { 6, 656 }, /* 28 fight_death */ - { 4, 428 }, /* 29 meet_Jaffar */ - { 3, 299 }, /* 30 life_potion */ - { 0, 0 }, /* 31 */ - { 5, 624 }, /* 32 end_level_4_and_killed_by_shadow */ - { 2, 205 }, /* 33 potion */ - { 0, 0 }, /* 34 */ - { 7, 888 }, /* 35 cutscene_before_8_9 */ - { 10, 1256 }, /* 36 out_of_time */ - { 3, 280 }, /* 37 guard_death_and_obtaining_the_sword */ - { 0, 0 }, /* 38 */ - { 13, 1591 }, /* 39 floating */ - { 5, 596 }, /* 40 cutscene_not_much_time_left */ - { 9, 1043 }, /* 41 story_5_level_end_and_merge_with_shadow */ - { 0, 0 }, /* 42 */ - { 3, 285 }, /* 43 killed_Jaffar */ - { 0, 0 }, /* 44 */ - { 0, 0 }, /* 45 */ - { 0, 0 }, /* 46 */ - { 0, 0 }, /* 47 */ - { 0, 0 }, /* 48 */ - { 0, 0 }, /* 49 */ - { 10, 1184 }, /* 50 story_2_princess */ - { 0, 0 }, /* 51 */ - { 20, 2443 }, /* 52 story_4_Jaffar_leaves */ - { 11, 1403 }, /* 53 story_3_Jaffar_enters */ - { 17, 2064 }, /* 54 intro_theme */ - { 11, 1350 }, /* 55 story_1_absence */ - { 78, 9865 }, /* 56 won */ -}; - -#endif /* POP_MUSIC_TBL_H */ diff --git a/applications/PoP/roomtest/pop_pace.c b/applications/PoP/roomtest/pop_pace.c deleted file mode 100644 index 0377422..0000000 --- a/applications/PoP/roomtest/pop_pace.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * pop_pace.c — фиксированный логический кадр по лучу. Зачем именно так, - * а не по счётчику кадровых прерываний — в шапке pop_pace.h (там же - * условие точности и замеры). - * - * Модуль НЕ банковый (EXTRA_SRCS): pop_beam_sample зовётся из банков - * рисования, а базовый код в W1 доступен им прямым call — трамплин на - * каждую выборку съел бы весь смысл. - */ - -#include -#include -#include -#include "pop_pace.h" - -uint8_t pop_speed_mode; /* crt0 зануляет _DATA → NORMAL */ -volatile uint8_t pop_frame_tick; - -/* Бит 5 порта 0xFE на прошлой выборке: 0 или 0x20. На виду у asm-тела. */ -uint8_t pop_beam_prev; - -static uint8_t pace_anchor; /* тик на начало текущего логического кадра */ -static uint8_t pace_ok; /* 0 — луч не работает, откат на gfx_wait_vsync */ - -/* ---- выборка луча --------------------------------------------------- * - * in a,(0xFE) кладёт A на старший байт адреса (выбор ряда клавиатуры) — - * биты 5/7 от него не зависят, так же читает и gfx_wait_vsync. - * Быстрый путь (состояние не изменилось) — 40 T + вызов. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e) __naked -{ - __asm - in a, (#0xFE) - and a, #0x20 - ld hl, #_pop_beam_prev - cp a, (hl) - ret Z ; состояние то же — выходим сразу - ld (hl), a - or a, a - ret NZ ; 0→1: вошли в бланк, это не граница - ld hl, #_pop_frame_tick - inc (hl) ; 1→0: vpos = 0, начало кадра - ret - __endasm; -} - -uint8_t pop_pace_arm(void) -{ - uint16_t tries; - uint8_t t0; - - /* Взводит cbl_mode (_cbl_port_ref) и заодно ставит нас на фронт. */ - gfx_wait_vsync(); - - /* Затравка beam_prev без ложного фронта: что бы луч ни показал сейчас, - * первая выборка либо совпадёт (ранний выход), либо запишет 0x20 и - * уйдёт по ветке «вошли в бланк». */ - pop_beam_prev = 0; - pop_beam_sample(); - - t0 = pop_frame_tick; - for (tries = 0; tries < 20000; tries++) { - pop_beam_sample(); - if ((uint8_t)(pop_frame_tick - t0) >= 2) { - pace_anchor = pop_frame_tick; - pace_ok = 1; - return 1; - } - } - pace_ok = 0; /* бит не шевелится — прежнее поведение */ - return 0; -} - -void pop_wait_edge(void) -{ - uint8_t t; - if (!pace_ok) { gfx_wait_vsync(); return; } - t = pop_frame_tick; - do { - pop_beam_sample(); - kbd_raw_poll(); /* KBD-1: опрос обязан быть плотным */ - } while (pop_frame_tick == t); -} - -void pop_pace_end(uint8_t n) -{ - if (!pace_ok) { /* откат: как было — добрать ожиданиями */ - while (--n) gfx_wait_vsync(); - return; - } - while ((uint8_t)(pop_frame_tick - pace_anchor) < n) - pop_wait_edge(); - pace_anchor = pop_frame_tick; /* якорь ПО ФАКТУ — фаза не копится */ -} - -uint8_t pop_pace_n(uint8_t fight) -{ - if (pop_speed_mode == POP_SPEED_NORMAL) return fight ? 5 : 4; - if (pop_speed_mode == POP_SPEED_FAST) return fight ? 4 : 3; - return 3; /* FASTEST: и вне боя, и в бою */ -} diff --git a/applications/PoP/roomtest/pop_pace.h b/applications/PoP/roomtest/pop_pace.h deleted file mode 100644 index be70a04..0000000 --- a/applications/PoP/roomtest/pop_pace.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * pop_pace.h — фиксированный логический кадр (frame pacing) по ЛУЧУ. - * - * Задача: период логического кадра = max(n, ceil(W)) вместо нынешнего - * ceil(W) + 2, где W — работа в растровых кадрах. Сегодня главный цикл - * ждёт три gfx_wait_vsync ПОСЛЕ отрисовки, поэтому реальный бюджет кадра - * — один растр (430 080 тактов), и превышение его на такт стоит целого - * лишнего растра. При n=3 бюджет становится 1 290 240. - * - * ПОЧЕМУ НЕ СЧЁТЧИК КАДРОВЫХ ПРЕРЫВАНИЙ (замеры 2026-08-19, MAME, полный - * разбор в docs/frame_pacing_plan.md). Импульс запроса кадрового - * прерывания живёт 32 такта неразогнанного клока = 9,14 мкс, а ядра - * акселератора держат di на весь чанк блита (~0,29 мс). Импульс, - * попавший в такое окно, теряется насовсем — ядро z80 уровневое, защёлки - * нет (то же и на настоящем Spectrum). Замерено: в сцене 11/15 теряется - * от 0 до 2,8 % прерываний в зависимости от ФАЗЫ рендера относительно - * луча, а на полной перерисовке комнаты — три подряд. Сейчас фаза - * плавает (период то 3 растра, то 4) и потери размазаны; при жёстком - * пейсинге фаза застынет, и сцена может залипнуть в плохой — это ровные - * −25 % скорости, невидимые в профиле тактов. - * - * ЧТО ВМЕСТО. Бит 5 порта 0xFE — это ЧТЕНИЕ ПОЛОЖЕНИЯ ЛУЧА (1, когда - * vpos >= 272; MAME sprinter.cpp kbd_fe_r), а не событие: ни импульса, - * ни очереди, ни защёлки. Такой сигнал невозможно потерять — можно - * только не посмотреть. Считаем фронты 1→0 (это vpos = 0, ровно тот же - * момент, которого ждёт gfx_wait_vsync) программно, выборкой из точек, - * которые код и так проходит. - * - * УСЛОВИЕ ТОЧНОСТИ — ОДНО: между соседними выборками должно проходить - * меньше 64 512 тактов (длина окна «бит 5 = 1»: 48 строк из 320). Тогда - * в каждый бланк попадает хотя бы одна выборка, а в промежуток между - * бланками (365 568 тактов) — тем более; значит каждый фронт засчитан - * ровно один раз. Двойной счёт невозможен: инкремент только на переходе, - * и beam_prev тут же обновляется. Условие не про нагрузку, не про di, - * не про прерывания и не про звук — только про зазор. - * - * Запас: самый длинный неделимый кусок без выборки — одно di-окно, то - * есть один вызов _bgi_blit_rows_raw, а он по контракту режется на чанки - * ≤16 строк. Даже если считать грубо — одна выборка на целый блит, а - * самый дорогой замеренный блит 32 073 такта — зазор вдвое меньше окна. - * - * ВАЖНО: бит 5 читается осмысленно ТОЛЬКО при включённом cbl_mode (в - * MAME `data &= ~0xa0` стоит внутри `if (cbl_mode())`, иначе бит выставлен - * в 1 намертво). Его лениво взводит сам gfx_wait_vsync через - * _cbl_port_ref, поэтому pop_pace_arm обязан один раз позвать - * gfx_wait_vsync и ПРОВЕРИТЬ, что фронты реально идут. - */ -#ifndef POP_PACE_H -#define POP_PACE_H - -#include - -/* Режимы скорости. Растровый кадр Sprinter — 20,48 мс (48,83 Гц). - * Оригинал (SDLPoP/src/seg003.c:363): base_speed 5 тиков при 60 Гц = - * 83,3 мс, fight_speed 6 = 100 мс. Условие боя у оригинала одно и - * буквальное — «у Кида ВЫНУТ МЕЧ» (Kid.sword == sword_2_drawn), не - * «идёт бой» и не «рядом страж»; проверяется в верху главного цикла. */ -/* Нумерация НЕ произвольная: 0 обязан быть дефолтом (crt0 зануляет _DATA), - * а обход по кругу инкрементом даёт ровно NORMAL -> FAST -> FASTEST. - * Заодно номер режима = число палочек в отладочной метке минус один. */ -#define POP_SPEED_NORMAL 0 /* 4/5 — 81,9 / 102,4 мс; повтор оригинала */ -#define POP_SPEED_FAST 1 /* 3/4 — 61,4 / 81,9 мс; бой как в оригинале */ -#define POP_SPEED_FASTEST 2 /* 3/3 — 61,4 мс; не успели — подтормаживаем */ -#define POP_SPEED_MODES 3 - -extern uint8_t pop_speed_mode; /* POP_SPEED_*; дефолт — NORMAL */ - -/* Клавиша смены режима по кругу (PS/2 set 2). P — свободна: заняты - * K/I/S/L/U/[/] (читы, pop_cheat.h) и +/- (обход комнат). */ -#define KBD_SPEED_MODE 0x4D /* P */ - -/* Делитель для текущего режима. fight = «у Кида вынут меч». */ -uint8_t pop_pace_n(uint8_t fight); - -/* Счётчик кадров. volatile: его правит pop_beam_sample, а читают циклы - * ожидания — перечитывать обязаны каждый оборот. */ -extern volatile uint8_t pop_frame_tick; - -/* ВЫБОРКА ЛУЧА. Дёшево (~57 T с вызовом), не трогает bc/de/ix. - * Звать отовсюду, где иначе получился бы зазор длиннее 64 512 тактов: - * из обёрток рисования и с границ фаз. Модуль НЕ банковый, поэтому из - * банков зовётся прямым call, без трамплина. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e); - -/* Однократная подготовка: взвести cbl_mode, снять первое состояние бита - * и убедиться, что фронты идут. 0 — луч не работает (тогда пейсинг - * молча откатывается на прежнее поведение: n ожиданий gfx_wait_vsync). */ -uint8_t pop_pace_arm(void); - -/* Ждать ОДИН фронт луча. Внутри — тот же плотный опрос клавиатуры, что - * сейчас висит idle-хуком на gfx_wait_vsync (KBD-1: без опроса раз в - * ~0,5 мс теряются нажатия и залипают клавиши). */ -void pop_wait_edge(void); - -/* Добрать до n фронтов ОТ ЯКОРЯ и переставить якорь ПО ФАКТУ. - * Вызывающий обязан перед этим сделать хотя бы один pop_wait_edge() — - * на нём же и происходит своп страниц (tear-free). Якорь ставится - * по факту, а не anchor += n: догонять пропущенное время нельзя, иначе - * после тяжёлого кадра игра рванёт вперёд. */ -void pop_pace_end(uint8_t n); - -#endif diff --git a/applications/PoP/roomtest/pop_pal.c b/applications/PoP/roomtest/pop_pal.c deleted file mode 100644 index ef1924d..0000000 --- a/applications/PoP/roomtest/pop_pal.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * pop_pal.c — владелец порядка «load logical palette -> apply brightness». - * - * Снимок физически хранит pop_ui (в хвосте FONT.ATL), потому что только тот - * модуль владеет страницей шрифта. Здесь остаётся политика: kid.pal всегда - * дополняют живые слоты тайлсета и Тени, а file-load никогда не считается - * показом яркого кадра сам по себе. - */ -#include -#include -#include -#include "pop_bg.h" -#include "pop_shadow.h" -#include "pop_guard.h" -#include "pop_pal.h" -#include "pop_ui.h" /* POP_COL_OUTSIDE */ - -static void pal_file_load(const char *path, const char *fallback) -{ - if (gfx_pal_fload(0, path) < 0) gfx_pal_fload(0, fallback); - gfx_pal_sync(); - pop_ui_palette_snapshot(); -} - -void pop_pal_black(void) __banked -{ - pop_ui_palette_black(); -} - -void pop_pal_snapshot(void) __banked -{ - pop_ui_palette_snapshot(); -} - -void pop_pal_apply(uint8_t fade) __banked -{ - pop_ui_palette_dim(fade, 0); -} - -void pop_pal_fade_out(uint8_t steps) __banked -{ - pop_ui_fade_out(steps); -} - -void pop_pal_fade_in(uint8_t steps) __banked -{ - pop_ui_fade_in(steps); -} - -/* Слот «вне игрового поля» (POP_COL_OUTSIDE) — всегда ЧЁРНЫЙ. - * - * Это ещё один ДИНАМИЧЕСКИЙ слот поверх файловой палитры: kid.pal содержит - * все 256 записей и кладёт в единицу свой цвет, а нам она нужна чёрной — - * иначе борта и полоса HP станут цветными. Ставим после каждого - * file-load, рядом с тайлсетом/Тенью/соперником (см. pop_pal_game_load). */ -void pop_pal_outside_apply(void) __banked -{ - gfx_pal_set(0, POP_COL_OUTSIDE, 0, 0, 0); - gfx_pal_set(1, POP_COL_OUTSIDE, 0, 0, 0); -} - -void pop_pal_flash_white(uint8_t on) __banked -{ - uint8_t color = on ? 255 : 0; - - gfx_pal_set(0, 0, color, color, color); - gfx_pal_set(1, 0, color, color, color); -} - -void pop_pal_menu_dim(uint8_t fade) __banked -{ - pop_ui_palette_dim(fade, 1); -} - -void pop_pal_game_load(void) __banked -{ - pal_file_load("KID\\kid.pal", "a:\\kid.pal"); - /* kid.pal содержит все 256 записей и намеренно затирает эти три - * динамических диапазона (тайлсет, Тень, набор соперника). - * Восстановить их надо ДО snapshot. */ - pop_bg_pal_apply(); - pop_shadow_pal_apply(); - pop_guard_pal_apply(); - pop_pal_outside_apply(); - pop_ui_palette_snapshot(); -} - -void pop_pal_level_load(uint8_t full) __banked -{ - if (full) { - pop_pal_game_load(); - return; - } - /* При обычной границе уровня меняются только env/wall и набор соперника. */ - pop_bg_pal_apply(); - pop_guard_pal_apply(); - pop_pal_outside_apply(); - pop_ui_palette_snapshot(); -} - -void pop_pal_title_load(void) __banked -{ - pal_file_load("TITLE\\title.pal", "a:\\title.pal"); -} - -/* ЕДИНСТВЕННОЕ ОТЛИЧИЕ ФИНАЛА ОТ ИНТРО — цвет фона текстовой рамки. - * load_title_images(bgcolor) SDLPoP красит его в #100060 на титрах и в - * #800000 в end_sequence (seg001:586); у нас фон запечён отдельным - * индексом POP_PAL_STORY_BG именно ради этой подмены. Она делается ПОСЛЕ - * файла и до нового снимка — как тайлсет/Тень в pop_pal_game_load. */ -void pop_pal_story_load(uint8_t ending) __banked -{ - pal_file_load("PV\\story.pal", "a:\\story.pal"); - if (!ending) return; - gfx_pal_set(0, POP_PAL_STORY_BG, 0x80, 0, 0); - gfx_pal_set(1, POP_PAL_STORY_BG, 0x80, 0, 0); - pop_ui_palette_snapshot(); -} - -void pop_pal_pv_load(void) __banked -{ - pal_file_load("PV\\pv.pal", "a:\\pv.pal"); -} diff --git a/applications/PoP/roomtest/pop_pal.h b/applications/PoP/roomtest/pop_pal.h deleted file mode 100644 index fe2f00e..0000000 --- a/applications/PoP/roomtest/pop_pal.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * pop_pal.h — единый lifecycle палитры PoP, банк 10. - * - * Атласы запечены под фиксированные диапазоны: env/wall 0x50..0x6F, - * Kid 0x70..0x8F, страж 0x90..0x9F, Тень 0xA0..0xAF. Поэтому palette - * уровня нельзя «восстановить fade-ом» из старого снимка: сначала надо - * загрузить логический источник, затем только выбрать яркость apply/fade. - */ -#ifndef POP_PAL_H -#define POP_PAL_H - -#include - -/* Все 256 записей обеих графических страниц = чёрный; снимок не меняет. */ -void pop_pal_black(void) __banked; - -/* Логические источники палитры. Они обновляют снимок, но сами не выбирают - * яркость: caller обязан явно вызвать apply()/fade_in(). */ -void pop_pal_game_load(void) __banked; -void pop_pal_level_load(uint8_t full) __banked; -void pop_pal_title_load(void) __banked; -/* Фон текстовой рамки story лежит в отдельном индексе палитры: ending=1 - * красит его тёмно-красным (финал), 0 оставляет файловый тёмно-синий. */ -#define POP_PAL_STORY_BG 16 -void pop_pal_story_load(uint8_t ending) __banked; -void pop_pal_pv_load(void) __banked; - -/* Показ текущего снимка: 0 — исходная яркость, 4 — чёрный. */ -void pop_pal_snapshot(void) __banked; -void pop_pal_apply(uint8_t fade) __banked; -void pop_pal_fade_out(uint8_t steps) __banked; -void pop_pal_fade_in(uint8_t steps) __banked; - -/* Слот POP_COL_OUTSIDE (всё вне игрового поля) — чёрным. Динамический - * слот: file-load палитры кладёт в него своё, поэтому доплачивается после - * каждого источника, как тайлсет/Тень/соперник. */ -void pop_pal_outside_apply(void) __banked; - -/* do_flash/remove_flash SDLPoP: меняется только нулевая запись обеих - * page-палитр, сама картинка и снимок логической палитры не затрагиваются. */ -void pop_pal_flash_white(uint8_t on) __banked; - -/* Меню — единственный пользователь keep_ui (0x37..0x3F не темнеют). */ -void pop_pal_menu_dim(uint8_t fade) __banked; - -#endif /* POP_PAL_H */ diff --git a/applications/PoP/roomtest/pop_qsave.c b/applications/PoP/roomtest/pop_qsave.c deleted file mode 100644 index 5a48df4..0000000 --- a/applications/PoP/roomtest/pop_qsave.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * pop_qsave.c — файловая транзакция и схема игрового снимка. - * Живёт в холодном банке: в обычном кадре исполняется только проверка - * резидентного флага запроса, вся тяжёлая работа бывает по F6/F9. - */ -#include -#include -#include /* rename */ -#include -#include -#include "pop_qsave.h" -#include "pop_status.h" -#include "pop_kid.h" -#include "pop_guard.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_bg.h" -#include "pop_state.h" -#include "pop_tile.h" -#include "pop_sfx.h" -#include "pop_pace.h" -#include "pop_timer.h" -#include "roomtest_cold.h" - -#define QS_VERSION 4 -#define QS_SAVE 1 -#define QS_LOAD 2 -#define QS_LOAD_BACKUP 3 -#define QS_LIMIT 4096 -#define QS_BASE 0x100 - -extern uint8_t pop_qsave_request; - -static void qs_char(pop_qs_io_t *io, pop_char_t *c) -{ - pop_qs_u8(io, &c->frame); pop_qs_u8(io, &c->x); pop_qs_u8(io, &c->y); - pop_qs_i8(io, &c->direction); pop_qs_i8(io, &c->curr_col); - pop_qs_i8(io, &c->curr_row); pop_qs_u8(io, &c->action); - pop_qs_i8(io, &c->fall_x); pop_qs_i8(io, &c->fall_y); - pop_qs_u8(io, &c->room); pop_qs_u8(io, &c->repeat); - pop_qs_u8(io, &c->charid); pop_qs_u8(io, &c->sword); - pop_qs_i8(io, &c->alive); pop_qs_u16(io, &c->curr_seq); -} - -static void qs_payload(pop_qs_io_t *io) -{ - uint8_t speed=pop_speed_mode, immortal=pop_immortal, sound=pop_snd_want; - - /* Пользовательские параметры входят в снимок, а не остаются свойством - * текущего запуска. Читаем сначала во временные байты: повреждённые - * значения не должны частично применить остальное игровое состояние. */ - pop_qs_u8(io, &speed); pop_qs_u8(io, &immortal); pop_qs_u8(io, &sound); - if (io->reading && io->apply) { - if (speed >= POP_SPEED_MODES || immortal > 2 || sound > 1) { - io->failed=1; return; - } - pop_speed_mode=speed; pop_immortal=immortal; pop_snd_want=sound; - } - /* Глобальный timer сохраняется до состояния уровня: QuickLoad на том же - * уровне вернёт ровно тот логический кадр, без «бесплатной» минуты. */ - pop_timer_qsave(io); - - qs_char(io, &Kid); qs_char(io, &Guard); - pop_qs_u8(io, &cur_room); pop_qs_u8(io, &kid_room); - pop_qs_u8(io, &pop_checkpoint); pop_qs_u8(io, &pop_next_level); - pop_qs_i8(io, &knock); - - pop_qs_u8(io, &hitp_curr); pop_qs_u8(io, &hitp_max); - pop_qs_u8(io, &hitp_beg_lev); pop_qs_i8(io, &hitp_delta); - pop_qs_u8(io, &guardhp_curr); pop_qs_u8(io, &guardhp_max); - pop_qs_i8(io, &guardhp_delta); pop_qs_u8(io, &guard_skill); - pop_qs_i8(io, &guard_refrac); pop_qs_i8(io, &justblocked); - pop_qs_i8(io, &kid_sword_strike); pop_qs_i8(io, &offguard); - pop_qs_i8(io, &holding_sword); pop_qs_u8(io, &pop_guard_hurt); - pop_qs_i8(io, &can_guard_see_kid); pop_qs_i8(io, &is_guard_notice); - pop_qs_i8(io, &pop_united_shadow); pop_qs_u8(io, &pop_shadow_init); - pop_qs_i8(io, &pop_guard_notice_timer); - pop_qs_u16(io, &pop_fight_seed.lo); pop_qs_u16(io, &pop_fight_seed.hi); - - pop_qs_u8(io, &pop_kid_dead); pop_qs_u8(io, &pop_kid_hurt); - pop_qs_u8(io, &pop_have_sword); pop_qs_u8(io, &pop_item_taken); - pop_qs_u8(io, &pop_flash_time); pop_qs_u8(io, &pop_flash_color); - pop_qs_u8(io, &pop_feather); pop_qs_u8(io, &pop_upside); - pop_qs_u8(io, &pop_upside_want); pop_qs_u8(io, &pop_upside_dirty); - pop_qs_u8(io, &pop_leave_dir); pop_qs_u8(io, &pop_leave_timer); - pop_qs_u8(io, &pop_loose_fell); pop_qs_u8(io, &pop_ceil_fell); - pop_qs_u8(io, &pop_debris_at); pop_qs_u8(io, &pop_fell_out); - pop_qs_bytes(io, pop_loose_modif, sizeof(pop_loose_modif)); - pop_qs_bytes(io, pop_ceil_modif, sizeof(pop_ceil_modif)); - - pop_qs_u8(io, &pop_loose_landed); pop_qs_u8(io, &pop_loose_exit); - pop_qs_u8(io, &pop_loose_exit_room); pop_qs_u8(io, &pop_droppedout); - pop_qs_u16(io, &pop_leveldoor_open); pop_qs_i8(io, &pop_jumped_mirror); - pop_qs_u8(io, &pop_seamless); pop_qs_u8(io, &pop_nav_hold); - - pop_level_qsave(io); - pop_trob_qsave(io); - pop_loose_mob_qsave(io); - pop_map_qsave(io); - pop_guard_ai_qsave(io); -} - -static void qs_init(pop_qs_io_t *io, uint8_t page, uint16_t limit, - uint8_t reading, uint8_t apply) -{ - io->page=page; io->pos=QS_BASE; io->limit=(uint16_t)(QS_BASE+limit); - io->checksum=0; - io->count=0; io->reading=reading; io->apply=apply; io->failed=0; -} - -static uint8_t qs_header_read(pop_qs_io_t *io, uint8_t *level) -{ - uint8_t h[7]; - if (!pop_qs_raw_get(io,h,sizeof(h))) return 0; - if (h[0]!='P' || h[1]!='O' || h[2]!='P' || h[3]!='Q' || - h[4] != QS_VERSION || h[5] < POP_LEVEL_FIRST || - h[5] > POP_LEVEL_LAST || h[6] != 0) return 0; - *level = h[5]; return 1; -} - -static uint8_t qs_validate_page(uint8_t page, uint16_t size, - uint8_t *level, uint16_t *payload_size) -{ - pop_qs_io_t io; - uint8_t tail[4]; - uint16_t n, sum; - if (size < 11) return 0; - qs_init(&io,page,size,1,0); - if (!qs_header_read(&io,level)) return 0; - io.pos=(uint16_t)(QS_BASE+size-4); - if (!pop_qs_raw_get(&io,tail,4)) return 0; - n = (uint16_t)(tail[0] | ((uint16_t)tail[1] << 8)); - sum = (uint16_t)(tail[2] | ((uint16_t)tail[3] << 8)); - if (n != (uint16_t)(size-11) || - sum != pop_qs_checksum_page(page,QS_BASE+7,n)) return 0; - *payload_size=n; return 1; -} - -static uint8_t qs_apply(uint8_t page, uint16_t size, uint16_t payload_size, - uint8_t *level) -{ - pop_qs_io_t io; - qs_init(&io,page,size,1,1); - if (!qs_header_read(&io,level)) return 0; - qs_payload(&io); - return (uint8_t)(!io.failed && io.count == payload_size && - io.pos == (uint16_t)(QS_BASE+7+payload_size)); -} - -static int8_t qs_save(uint8_t page) -{ - pop_qs_io_t io; - uint8_t tail[4]; - const uint8_t h[7]={'P','O','P','Q',QS_VERSION,pop_current_level,0}; - uint16_t size; - qs_init(&io,page,QS_LIMIT,0,0); - pop_qs_raw_put(&io,h,sizeof(h)); - qs_payload(&io); - tail[0]=(uint8_t)io.count; tail[1]=(uint8_t)(io.count >> 8); - io.checksum=pop_qs_checksum_page(page,QS_BASE+7,io.count); - tail[2]=(uint8_t)io.checksum; tail[3]=(uint8_t)(io.checksum >> 8); - pop_qs_raw_put(&io,tail,4); size=(uint16_t)(io.pos-QS_BASE); - if (io.failed) return -1; - unlink("POP.NEW"); - if (bank_save_file(page,QS_BASE,"POP.NEW",size) != size) { - unlink("POP.NEW"); return -1; - } - unlink("POP.BAK"); - (void)rename("POP.SAV", "POP.BAK"); - if (rename("POP.NEW", "POP.SAV") != 0) { - (void)rename("POP.BAK", "POP.SAV"); return -1; - } - return 1; -} - -static int8_t qs_load_one(const char *name, uint8_t page) -{ - uint8_t level; - uint16_t payload_size; - int size=bank_load_file(page,QS_BASE,name,QS_LIMIT); - if (size <= 0 || !qs_validate_page(page,(uint16_t)size,&level, - &payload_size)) return -1; - if (level != pop_current_level) { - pop_next_level = level; - if (pop_level_switch() != 0 || pop_current_level != level) return -1; - } - if (!qs_apply(page,(uint16_t)size,payload_size,&level)) return -1; - Char = Kid; Opp = Guard; - pop_qsave_restore_room(cur_room); - return 1; -} - -/* Проверка слотов для меню. Это именно probe: не вызывает pop_level_switch, - * не применяет payload и не трогает звук. Отдельная EMM-страница делает - * проверку независимой от живой страницы уровня. */ -uint8_t pop_qsave_probe(void) __banked -{ - uint8_t blk, page, level, slots = 0; - uint16_t payload_size; - int size; - - blk = mem_alloc_pages(1); - if (!blk) return 0; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - - size = bank_load_file(page, QS_BASE, "POP.SAV", QS_LIMIT); - if (size > 0 && qs_validate_page(page, (uint16_t)size, &level, - &payload_size)) - slots |= POP_QS_SLOT_SAVE; - size = bank_load_file(page, QS_BASE, "POP.BAK", QS_LIMIT); - if (size > 0 && qs_validate_page(page, (uint16_t)size, &level, - &payload_size)) - slots |= POP_QS_SLOT_BACKUP; - - mem_free_block(blk); - return slots; -} - -int8_t pop_qsave_process(void) __banked -{ - uint8_t request = pop_qsave_request; - uint8_t blk,page; - int8_t rc=-1; - pop_qsave_request = 0; - if (!request) return 0; - /* Лейбл — ДО дисковой работы: она длится доли секунды, игра на это - * время замирает, и строка обязана объяснить фриз, а не подводить под - * ним итог. Не удалось — ниже перепишем на NO QUICKSAVE/QUICKLOAD. */ - pop_status_show_now((uint8_t)(request == QS_SAVE ? POP_MSG_QUICKSAVE - : POP_MSG_QUICKLOAD)); - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - gfx_w0_page_prepare(page); - pop_sfx_pause(); - if (request == QS_SAVE) rc = qs_save(page); - else if (request == QS_LOAD_BACKUP) rc = qs_load_one("POP.BAK", page); - else { - rc = qs_load_one("POP.SAV",page); - if (rc < 0) rc = qs_load_one("POP.BAK",page); - } - pop_sfx_start(); - mem_free_block(blk); - /* Успех ничего не меняет: нужная строка висит с начала операции. - * Отказ переписывает её на NO QUICKSAVE/NO QUICKLOAD — обычной - * заявкой, кадр её подхватит (порт seg000:497/514). */ - if (rc <= 0) - pop_status_msg = (uint8_t)(request == QS_SAVE ? POP_MSG_NO_QUICKSAVE - : POP_MSG_NO_QUICKLOAD); - return rc; -} diff --git a/applications/PoP/roomtest/pop_qsave.h b/applications/PoP/roomtest/pop_qsave.h deleted file mode 100644 index 564c296..0000000 --- a/applications/PoP/roomtest/pop_qsave.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * pop_qsave.h — потоковый QuickSave/QuickLoad одного игрового слота. - * - * На диске используются POP.NEW, POP.SAV и POP.BAK. Формат не содержит - * указателей, файловых дескрипторов и графических кэшей; многобайтные поля - * записываются явно little-endian. Внутренние функции pop_qs_* нужны - * модулям-владельцам закрытого состояния. - */ -#ifndef POP_QSAVE_H -#define POP_QSAVE_H - -#include - -typedef struct { - uint8_t page; - uint16_t pos; - uint16_t limit; - uint16_t checksum; - uint16_t count; - uint8_t reading; - uint8_t apply; - uint8_t failed; -} pop_qs_io_t; - -void pop_qs_bytes(pop_qs_io_t *io, void *data, uint16_t size); -void pop_qs_u8(pop_qs_io_t *io, uint8_t *value); -void pop_qs_i8(pop_qs_io_t *io, int8_t *value); -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value); -void pop_qs_i16(pop_qs_io_t *io, int *value); -void pop_qs_raw_put(pop_qs_io_t *io, const uint8_t *data, uint8_t size); -uint8_t pop_qs_raw_get(pop_qs_io_t *io, uint8_t *data, uint8_t size); -uint16_t pop_qs_checksum_page(uint8_t page, uint16_t pos, uint16_t size); - -/* Вызывается в безопасной границе кадра. Возвращает: 0 — запроса нет, - * 1 — сохранено/загружено, -1 — ошибка. */ -int8_t pop_qsave_process(void) __banked; -void pop_qsave_request_save(void); -void pop_qsave_request_load(void); -void pop_qsave_request_load_backup(void); - -/* Валидность слотов без изменения состояния игры. Нужна menu для вопроса - * LOAD BACKUP?: основной SAV уже пригоден, backup спрашиваем только если - * основной отсутствует или повреждён. */ -#define POP_QS_SLOT_SAVE 0x01 -#define POP_QS_SLOT_BACKUP 0x02 -uint8_t pop_qsave_probe(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_qsave_coldio.c b/applications/PoP/roomtest/pop_qsave_coldio.c deleted file mode 100644 index 511db08..0000000 --- a/applications/PoP/roomtest/pop_qsave_coldio.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Холодная часть ввода-вывода QuickSave (банк 8). - * - * Эти функции вызываются только банковым оркестратором pop_qsave.c, поэтому - * им не место в дефицитном резидентном _CODE. Здесь только доступ через W0: - * переключающие W3 DSS-операции обязаны оставаться в pop_qsave_io.c. - */ -#include "pop_qsave.h" -#include - -void pop_qs_raw_put(pop_qs_io_t *io, const uint8_t *data, uint8_t size) -{ - uint8_t *q, i; - if (io->pos + size > io->limit) { io->failed=1; return; } - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - for (i=0; ipos += size; -} - -uint8_t pop_qs_raw_get(pop_qs_io_t *io, uint8_t *data, uint8_t size) -{ - uint8_t *q, i; - if (io->pos + size > io->limit) return 0; - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - for (i=0; ipos += size; return 1; -} - -/* XOR8 достаточно для обнаружения случайной порчи транзакционного файла; - * размер payload проверяется отдельно, старший байт содержит инверсию XOR. */ -uint16_t pop_qs_checksum_page(uint8_t page, uint16_t pos, uint16_t size) -{ - uint8_t *p, sum=0; - gfx_w0_map(page); p=(uint8_t *)pos; - while(size--) sum ^= *p++; - gfx_w0_unmap(); - return (uint16_t)(sum | ((uint16_t)(uint8_t)~sum << 8)); -} diff --git a/applications/PoP/roomtest/pop_qsave_io.c b/applications/PoP/roomtest/pop_qsave_io.c deleted file mode 100644 index cc4fc28..0000000 --- a/applications/PoP/roomtest/pop_qsave_io.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Резидентная часть QuickSave: часто вызываемые межбанковые примитивы - * потока и флаг запроса. Файловый обмен с W3 теперь общий в libc. */ -#include "pop_qsave.h" -#include -#include - -uint8_t pop_qsave_request; -void pop_qsave_request_save(void) { pop_qsave_request=1; } -void pop_qsave_request_load(void) { pop_qsave_request=2; } -void pop_qsave_request_load_backup(void) { pop_qsave_request=3; } - -void pop_qs_bytes(pop_qs_io_t *io, void *data, uint16_t size) -{ - uint8_t *p=(uint8_t *)data, *q; - if (io->failed || io->pos + size > io->limit) { io->failed=1; return; } - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - if (!io->reading) memcpy(q,p,size); - else if (io->apply) memcpy(p,q,size); - gfx_w0_unmap(); io->pos += size; io->count += size; -} -void pop_qs_u8(pop_qs_io_t *io, uint8_t *v) { pop_qs_bytes(io,v,1); } -void pop_qs_i8(pop_qs_io_t *io, int8_t *v) { pop_qs_bytes(io,v,1); } -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value) -{ - uint8_t b[2]; b[0]=(uint8_t)*value; b[1]=(uint8_t)(*value >> 8); - pop_qs_bytes(io,b,2); - if (io->reading && io->apply && !io->failed) - *value=(uint16_t)(b[0] | ((uint16_t)b[1] << 8)); -} -void pop_qs_i16(pop_qs_io_t *io, int *value) -{ - uint16_t v=(uint16_t)*value; pop_qs_u16(io,&v); - if (io->reading && io->apply && !io->failed) *value=(int)v; -} diff --git a/applications/PoP/roomtest/pop_redraw.c b/applications/PoP/roomtest/pop_redraw.c deleted file mode 100644 index d8e3018..0000000 --- a/applications/PoP/roomtest/pop_redraw.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * pop_redraw.c — пометки перерисовки тайлов и их разбор. См. pop_redraw.h. - * - * Живёт в W1/W2 (НЕ в резиденте W3): пометки ставит логика, которая должна - * оставаться достижимой из будущих __banked-модулей. Сам разбор зовёт - * pop_bg (резидент W3) — это законно, потому что разбор дёргает только - * главный цикл. - */ -#include -#include "pop_redraw.h" -#include "pop_bg.h" -#include "_pop_bg.h" /* pop_bake_slot_reset — тот же банк, без трамплина */ - -#define NTILES 30 -#define NCOLS 10 - -static uint8_t rd_kind[NTILES], rd_cnt[NTILES]; -static uint8_t rda_kind[NCOLS], rda_cnt[NCOLS]; -/* Сколько всего непустых пометок: без него проход по 40 ячейкам крутился бы - * КАЖДЫЙ кадр впустую (замер 2026-07-27 на прежнем rest-цикле: ~12 % кадра). */ -static uint8_t rd_pending; -/* Пометки ПЕРЕДНЕГО слоя — однокадровые, отдельно от rd_*: те живут по - * страницам дабл-буфера (запекают фон), а эти транзиентны. */ -static uint8_t rdf[NTILES]; -static uint8_t rdf_pending; -/* Передний слой РЯДА −1 (полоса кладки у потолка). Отдельным набором, как и - * сами перерисовки ряда −1 (rda_*): у оригинала это вообще другой проход — - * redraw_needed_tiles сначала обходит ряды 2,1,0, а ПОТОМ ряд 2 комнаты сверху - * (seg008:1B06), и его draw_tile_fore кладёт куски в foretable, то есть поверх - * midtable, где лежат падающие плиты, и поверх объектов. */ -static uint8_t rdfa[NCOLS]; -static uint8_t rdfa_pending; - -void pop_redraw_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < NTILES; i++) { rd_kind[i] = 0; rd_cnt[i] = 0; } - for (i = 0; i < NCOLS; i++) { rda_kind[i] = 0; rda_cnt[i] = 0; } - rd_pending = 0; - for (i = 0; i < NTILES; i++) rdf[i] = 0; - for (i = 0; i < NCOLS; i++) rdfa[i] = 0; - pop_fore_pass_end(); - rdf_pending = 0; - rdfa_pending = 0; -} - -void pop_set_redraw_fore(uint8_t tilepos) __banked -{ - if (tilepos >= NTILES) return; - if (!rdf[tilepos]) rdf_pending++; - rdf[tilepos] = 1; -} - -/* То же для полосы кладки У ПОТОЛКА (ряд −1). Ставит падающий кусок, когда - * его спрайт достаёт до кромки потолка: иначе кусок накрывает эту кромку - * собой, чего быть не может (найдено пользователем 2026-08-17, ур.1 к.6 — - * плита (−1,5) перекрывала потолок (−1,6)). */ -void pop_set_redraw_fore_above(uint8_t col) __banked -{ - if (col >= NCOLS) return; - if (!rdfa[col]) rdfa_pending++; - rdfa[col] = 1; -} - -/* Разбор пометок переднего слоя: тайлы обходятся в том же порядке, что и - * фон, и рисуются ПОСЛЕ всех объектов кадра — как foretable у оригинала - * (draw_tables, seg008:1373: back -> mid -> fore). */ -void pop_fore_needed(void) __banked -{ - uint8_t i, row = 0, col = 0; - if (!rdf_pending && !rdfa_pending) return; - pop_fore_pass_begin(); - for (i = 0; i < NTILES; i++) { - if (rdf[i]) { rdf[i] = 0; pop_fore_tile_b(row, col); } - if (++col == 10) { col = 0; row++; } - } - rdf_pending = 0; - /* Ряд −1 — ПОСЛЕДНИМ, как в redraw_needed_tiles (seg008:1B06). */ - if (rdfa_pending) { - for (i = 0; i < NCOLS; i++) - if (rdfa[i]) { rdfa[i] = 0; pop_ceil_fore_tile_b(i); } - rdfa_pending = 0; - } -} - -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked -{ - if (tilepos >= NTILES) return; - if (!rd_cnt[tilepos]) rd_pending++; - else pop_bake_slot_reset(tilepos); /* перепометка — копия запечки не годится */ - /* ПРИОРИТЕТ ПОЛНОЙ ПЕРЕРИСОВКИ НАД слоем anim. У оригинала это не - * конфликт видов, а два независимых счётчика, и полная побеждает - * (redraw_needed, seg008:0211: `if (redraw_frames_full) draw_tile(); - * else if (redraw_frames_anim) {...}`). У нас вид ОДИН на тайл, и без - * этой проверки исход решал бы порядок trob'ов в списке: чомпер, который - * СЕЙЧАС смыкает челюсти, ставит POP_RD_CHOMP (ему нужен heal — поза - * меняется), а факел слева тут же метил бы тот же тайл как - * POP_RD_CHOMP_ANIM, и heal пропал бы — новая поза легла бы поверх - * старой. */ - if (!(kind == POP_RD_CHOMP_ANIM && rd_kind[tilepos] == POP_RD_CHOMP && - rd_cnt[tilepos])) - rd_kind[tilepos] = kind; - if (pages > rd_cnt[tilepos]) rd_cnt[tilepos] = pages; -} - -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked -{ - if (col >= NCOLS) return; - if (!rda_cnt[col]) rd_pending++; - else pop_bake_slot_reset_above(col); /* перепометка — копия запечки не годится */ - rda_kind[col] = kind; - if (pages > rda_cnt[col]) rda_cnt[col] = pages; -} - -/* redraw_needed (seg008:0178): пройти пометки и нарисовать. row/col ведём - * бегущими счётчиками, а не через i/10 и i%10 — у Z80 нет деления, и SDCC - * выносит __divuchar/__moduchar в вершину цикла как общее подвыражение - * аргументов (30*2 делений за кадр даже когда рисовать нечего). */ -void pop_redraw_needed(void) __banked -{ - uint8_t i, row = 0, col = 0, left = 0, cnt = 0; /* cnt — ВРЕМЕННО, замер */ - pop_dbg_rdmax_tot = 0; - if (!rd_pending) return; - for (i = 0; i < NTILES; i++) { - if (rd_cnt[i]) { - pop_dbg_kind(rd_kind[i]); /* ВРЕМЕННО: какой вид перерисовки */ - switch (rd_kind[i]) { - case POP_RD_SPIKE: pop_spike_redraw(row, col); break; - case POP_RD_LOOSE: pop_loose_shake_draw(row, col); break; - case POP_RD_LOOSE_GONE: pop_loose_bake_empty(row, col); break; - case POP_RD_FLOOR: pop_floor_bake(row, col); break; - case POP_RD_LEVELDOOR: pop_leveldoor_redraw(row, col); break; - case POP_RD_GATE: pop_gate_redraw(row, col); break; - case POP_RD_CHOMP: pop_chomp_redraw(row, col); break; - case POP_RD_CHOMP_ANIM: pop_chomp_anim_draw(row, col); break; - default: break; - } - cnt++; /* ВРЕМЕННО: замер */ - if (--rd_cnt[i]) left++; - else rd_kind[i] = 0; - } - if (++col == 10) { col = 0; row++; } - } - for (i = 0; i < NCOLS; i++) { - if (rda_cnt[i]) { - if (rda_kind[i] == POP_RDA_CEIL) pop_ceil_shake_draw(i); - else pop_ceil_bake_empty(i); - cnt++; /* ВРЕМЕННО: замер */ - if (--rda_cnt[i]) left++; - else rda_kind[i] = 0; - } - } - rd_pending = left; - pop_dbg_rdmax_tot = cnt; /* ВРЕМЕННО: замер */ - if (cnt > pop_dbg_rdmax[0]) pop_dbg_rdmax[0] = cnt; -} diff --git a/applications/PoP/roomtest/pop_redraw.h b/applications/PoP/roomtest/pop_redraw.h deleted file mode 100644 index 7ab303f..0000000 --- a/applications/PoP/roomtest/pop_redraw.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * pop_redraw.h — пометки «перерисовать тайл» и их разбор. - * - * Порт архитектуры оригинала: логика анимации НИЧЕГО не рисует, она ставит - * флаг (`set_redraw_full`/`set_wipe`/`redraw_20h`/`redraw_21h`, seg007), а - * отрисовка идёт отдельным проходом (`redraw_needed`, seg008:0178). У нас - * так же: pop_map/pop_trob зовут pop_set_redraw*, а pop_redraw_needed() - * (главный цикл) разбирает пометки и дёргает pop_bg. - * - * ЗАЧЕМ (кроме сходства с SDLPoP): из __banked-кода резидентная страница W3 - * недостижима — ни напрямую, ни транзитивно (docs/layout_plan_v2.md §2 R2). - * Пока pop_map звал pop_bg, его нельзя было использовать из банка стражей. - * Пометки живут в W1/W2 и зовутся откуда угодно. - * - * ОТЛИЧИЕ ОТ ОРИГИНАЛА: у нас не один экран с dirty-rect, а две страницы - * дабл-буфера со своей ОЗУ-копией фона, поэтому счётчик пометки — это ЧИСЛО - * СТРАНИЦ (обычно 2), а вид перерисовки хранится явно: heal+рисовать поверх - * (транзиент) или запечь новый фон. В оригинале вид кодируется тем, в какой - * из таблиц redraw_frames_* стоит флаг. - */ -#ifndef POP_REDRAW_H -#define POP_REDRAW_H - -#include - -/* Виды перерисовки тайла (row*10+col). */ -#define POP_RD_SPIKE 1 /* пики: heal + оба тайла (redraw_21h) */ -#define POP_RD_LOOSE 2 /* loose: дрожащий кадр / кадр покоя */ -#define POP_RD_LOOSE_GONE 3 /* loose провалился: запечь пусто */ -#define POP_RD_FLOOR 4 /* пол изменился: кнопка/щебень/поднятый меч */ -#define POP_RD_LEVELDOOR 5 /* створка двери уровня (ПРАВАЯ половина) */ -#define POP_RD_GATE 6 /* решётка ворот (tilepos = САМИ ворота) */ -#define POP_RD_CHOMP 7 /* чомпер: кадр смыкания челюстей */ -#define POP_RD_CHOMP_ANIM 8 /* чомпер: вернуть ТОЛЬКО слой anim поверх огня */ - -/* Виды перерисовки полосы у потолка (по колонке). */ -#define POP_RDA_CEIL 1 /* плита-потолок: дрожащий кадр / покой */ -#define POP_RDA_CEIL_GONE 2 /* плита-потолок провалилась: колодец */ - -/* Пометить тайл/колонку: kind — вид, pages — на скольких страницах - * дабл-буфера перерисовать (1 = только текущая, 2 = обе). Повторная - * пометка перекрывает вид и берёт максимум счётчика. */ -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked; - -/* ПЕРЕДНИЙ СЛОЙ по пометкам — порт redraw_frames_fore/set_redraw_fore - * (seg007:0550). В оригинале эти пометки ставят ОБЪЕКТЫ, каждый вокруг - * себя: персонаж — прямоугольник футпринта (redraw_at_char, seg003:0576), - * падающий кусок — соседа справа и второй тайл на границе рядов (draw_mob, - * seg007:1147), анимация тайла — свой тайл (draw_trob). Пометка - * ОДНОКАДРОВАЯ: передний слой транзиентен, его снимает heal. - * - * Разбор (pop_fore_needed) звать ПОСЛЕ отрисовки всех объектов кадра. */ -void pop_set_redraw_fore(uint8_t tilepos) __banked; - -/* Пометить передний слой полосы у потолка (ряд −1), столбец col. Ставит - * падающий кусок, достающий до кромки потолка. */ -void pop_set_redraw_fore_above(uint8_t col) __banked; -void pop_fore_needed(void) __banked; -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked; - -/* Разобрать пометки: нарисовать всё помеченное на ТЕКУЩЕЙ (back) странице и - * уменьшить счётчики. Звать из главного цикла в слое ФОНА — до персонажей. */ -void pop_redraw_needed(void) __banked; - -/* Сбросить все пометки (смена комнаты/уровня). */ -void pop_redraw_reset(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_room.c b/applications/PoP/roomtest/pop_room.c deleted file mode 100644 index 23e4f7a..0000000 --- a/applications/PoP/roomtest/pop_room.c +++ /dev/null @@ -1,2009 +0,0 @@ -/* - * pop_room.c — ХОЛОДНАЯ половина слоя фона PoP: полная отрисовка комнаты - * (порт seg008.c draw_tile / render_room.py), точечные перерисовки тайлов - * при событиях (пики, ворота, кнопки, дверь уровня, дрожащие плиты) и - * падающие куски loose (mob, seg007 move_loose). Всё это работает раз на - * комнату или раз на событие, поэтому живёт в ОТДЕЛЬНОМ банке и платит - * трамплин за вызовы горячей половины — см. _pop_bg.h, там же граница реза. - * - * Только DUNGEON-стиль (Фаза 1). - */ -/* Имена файлов атласов обоих тайлсетов нужны только здесь; макрос обязан - * стоять ДО первого включения pop_bg_atlas.h (его тянет pop_tile.h). */ -#define POP_BG_ATLAS_NAMES -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "_pop_bg.h" /* контракт с горячей половиной (pop_bg.c, банк 2) */ -#include "pop_tile.h" /* общие листья слоя фона (резидент): блит, тайлы, таблица */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_arc.h" -#include "bg_arc.h" -#include "pop_state.h" -#include "pop_redraw.h" /* пометки тайлов: сосед падающего куска (draw_mob) */ -#include "pop_geom.h" -#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */ -#include "pop_kid.h" /* Kid.curr_col/curr_row — порядок оверлеев */ -#include "pop_cdraw.h" /* pop_cd — габарит кадра Кида (y-порядок плиты) */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include -#include - -/* Фазы loose-плит: массив ТЕКУЩЕЙ комнаты (pop_map) и персистентный per-room - * (pop_trob) плюс постановка trob. Объявлены здесь, а не включением обоих - * заголовков: нужна ровно одна ячейка каждому — падающий кусок срывает - * плиту, в которую врезался (loose_fall, см. mob_break_loose). */ -extern uint8_t pop_loose_modif[30]; -uint8_t *pop_trob_modif(uint8_t room) __banked; -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked; -/* remove_loose для ОДНОГО тайла — снять плиту с карты немедленно (честный - * loose_fall, см. mob_break_loose). Живёт в pop_map: там рабочая копия - * тайлов комнаты и фазы плит. */ -void pop_loose_remove(uint8_t room, uint8_t tilepos) __banked; - -/* ---- Тайлсет: подземелье / дворец ----------------------------------- * - * Порт tbl_envir_ki[tbl_level_type[level]] (seg000:1108): оригинал под один - * и тот же набор id грузит РАЗНЫЙ .DAT — VDUNGEON или VPALACE. У нас так - * же: раскладка id -> (страница, idx) общая (упаковщик печёт оба набора по - * одному объединению id), меняются только файлы атласов и 32 записи - * палитры — env 0x50..0x5F и wall 0x60..0x6F. Кид, страж, меч и зелья - * живут в других слотах, поэтому общая kid.pal не трогается. */ -static uint8_t bg_set = 0xFF; /* какой набор сейчас загружен */ - -/* Ресурсы разложены по каталогам образа (8.3, как в DSS): BG — фон, KID — - * персонаж, GUARD — стражи, LEVELS — уровни. Иначе корень диска зарастает - * десятками .atl. Путь склеиваем на месте: держать по строке на каждый из - * двадцати атласов — лишние полкилобайта в банке. */ -/* Шаг набора в архиве: десять env + wall + fore. */ -#define BG_SET_STRIDE (POP_ENV_PAGES + 2) -#if (ARC_BG_PAL_ENV0 - ARC_BG_POP_ENV0) != BG_SET_STRIDE -#error "тайлсеты в архиве фона лежат не по двенадцать атласов" -#endif - -static char bg_path_buf[20]; - -static const char *bg_path(const char *name) -{ - char *d = bg_path_buf; - *d++ = 'B'; *d++ = 'G'; *d++ = '\\'; - while (*name) *d++ = *name++; - *d = 0; - return bg_path_buf; -} - -/* 32 записи (env, затем wall) в ОБЕ палитры: у страниц дабл-буфера они - * раздельные. Буфер — на стеке: gfx_pal_load отдаёт указатель BIOS ($A4), - * а тот читает только #4000-#BFFF, то есть банковую rodata бы не увидел - * (те же грабли, что в pop_guard_set_palette). */ -static int bg_load_tile_pal(const char *name) -{ - uint8_t buf[64]; - int fd = open(bg_path(name), O_RDONLY); - if (fd < 0) return -1; - if (read(fd, buf, 64) != 64) { close(fd); return -1; } - gfx_pal_load(0, POP_PAL_ENV, 16, buf); - gfx_pal_load(1, POP_PAL_ENV, 16, buf); - if (read(fd, buf, 64) != 64) { close(fd); return -1; } - gfx_pal_load(0, POP_PAL_WALL, 16, buf); - gfx_pal_load(1, POP_PAL_WALL, 16, buf); - close(fd); - return 0; -} - -/* ---- Композитный спрайт ПАДАЮЩЕГО КУСКА ------------------------------ * - * Три части (env 70 / 74 / 72, см. блок MOB_X0 ниже) складываются в ОДИН - * getimage-блоб в обычной памяти, и кусок рисуется одним блитом вместо трёх. - * - * Зачем: у блита ~8 800 такта постоянных накладных против ~5 000 на пиксели - * (memory blit_cost_model). Шесть кусков в воздухе давали 18 вызовов и - * 258 708 такта — БОЛЬШЕ ПОЛОВИНЫ цианового блока (замер 2026-08-17, - * docs/perf_cyan_phase.md). Плюс блоб в обычной памяти не требует - * atlas_image и gfx_w0_map/unmap — ещё ~1 350 такта на вызов. - * - * Прозрачность соблюдена: части ПЕРЕКРЫВАЮТСЯ (74 и 70 обе идут от mob_x), - * поэтому копируются попиксельно с пропуском 0xFF — ровно как три блита с - * прозрачностью друг поверх друга. - * - * Размер буфера — по худшему из тайлсетов (дворец даёт 63 в ширину, - * подземелье 19 в высоту), 1 201 Б статики W2. Куча roomtest не - * используется (malloc'ов в приложении нет), так что это её и не задевает. - * - * Собирается на КАЖДУЮ смену тайлсета: размеры частей у наборов разные. */ -/* Коридор heal падающего куска — по фактической высоте СОБРАННОГО композита - * (у дворца он 16 строк, у подземелья 19). Держать константные 24 «на всякий - * случай» значило платить лишними строками на самой дорогой операции кадра, - * помноженными на число падающих плит. Ставит mob_spr_build; стартовые - * значения — безопасный максимум (см. MOB_HEAL_UP/MOB_HEAL_H ниже). */ -static uint8_t mob_heal_up = 20; -static uint8_t mob_heal_h = 24; - -/* Размер буфера — верхняя граница по обоим тайлсетам с запасом; фактические - * w/h композита считаются при сборке и кладутся в его шапку. */ -#define MOBS_MAXW 64 -#define MOBS_MAXH 20 -static uint8_t mob_spr[4 + MOBS_MAXW * MOBS_MAXH]; -static uint8_t mob_spr_ok; /* 0 — не собрался, рисуем тремя блитами */ - -/* Части композита: id, смещение по x, смещение НИЗА части относительно mob_y. - * Порядок — как в mob_render (низ, левая часть, правая), он важен: части - * перекрываются. */ -static const uint8_t MOBS_ID[3] = {74, 70, 72}; -static const uint8_t MOBS_XO[3] = {0, 0, 32}; -static const int8_t MOBS_YBO[3] = {0, -3, -1}; - -static void mob_spr_build(void) -{ - uint8_t w[3], h[3], k, r, c, v, cw, ch; - const uint8_t *src; - int top = 0, row0; - - mob_spr_ok = 0; - /* Проход 1 — габариты частей. Считать их обязательно, а не брать - * константами: у тайлсетов они РАЗНЫЕ (напр. правая часть 72 — 26 px в - * подземелье и 25 во дворце). */ - for (k = 0; k < 3; k++) { - atlas_t *a = &pop_env[MOBS_ID[k] >> POP_ENV_SHIFT]; - uint8_t idx = (uint8_t)(MOBS_ID[k] & POP_ENV_MASK); - if (idx >= a->count) return; - src = (const uint8_t *)atlas_image(a, idx); - gfx_w0_map(a->page); - w[k] = src[0]; h[k] = src[2]; - v = (uint8_t)(src[1] | src[3]); - gfx_w0_unmap(); - if (v || !w[k] || !h[k]) return; /* кадр >255 или пустой */ - row0 = (int)MOBS_YBO[k] - (int)h[k] + 1; - if (row0 < top) top = row0; - } - /* Габарит композита: низ = mob_y, верх = самая высокая часть. */ - ch = (uint8_t)(1 - top); - cw = 0; - for (k = 0; k < 3; k++) - if ((uint8_t)(MOBS_XO[k] + w[k]) > cw) cw = (uint8_t)(MOBS_XO[k] + w[k]); - if (cw > MOBS_MAXW || ch > MOBS_MAXH) return; - mob_spr[0] = cw; mob_spr[1] = 0; - mob_spr[2] = ch; mob_spr[3] = 0; - /* Пустое место — ПРОЗРАЧНОЕ (0xFF), иначе композит закрасил бы фон вокруг - * частей. Страйд блоба = его ширина, поэтому чистим ровно cw*ch. */ - for (r = 0; r < ch; r++) - for (c = 0; c < cw; c++) mob_spr[4 + (uint16_t)r * cw + c] = 0xFF; - /* Проход 2 — копирование ПОПИКСЕЛЬНО с пропуском 0xFF: части - * ПЕРЕКРЫВАЮТСЯ (74 и 70 обе идут от mob_x), и прозрачные пиксели верхней - * не должны стирать нижнюю — ровно как три прозрачных блита друг поверх - * друга. */ - for (k = 0; k < 3; k++) { - atlas_t *a = &pop_env[MOBS_ID[k] >> POP_ENV_SHIFT]; - src = (const uint8_t *)atlas_image(a, (uint8_t)(MOBS_ID[k] & POP_ENV_MASK)); - gfx_w0_map(a->page); - row0 = (int)MOBS_YBO[k] - (int)h[k] + 1 - top; - for (r = 0; r < h[k]; r++) { - const uint8_t *sp = src + 4 + (uint16_t)r * w[k]; - uint8_t *dp = mob_spr + 4 + (uint16_t)(row0 + r) * cw + MOBS_XO[k]; - for (c = 0; c < w[k]; c++) { v = sp[c]; if (v != 0xFF) dp[c] = v; } - } - gfx_w0_unmap(); - } - /* Коридор heal — по композиту: две строки запаса сверху, одна снизу. */ - mob_heal_up = (uint8_t)(ch + 1); - mob_heal_h = (uint8_t)(ch + 3); - mob_spr_ok = 1; -} - -/* Загрузить набор set (0 подземелье, 1 дворец). Повторный вызов с тем же - * набором ничего не делает; со сменой — сначала выгружает старый, иначе - * EMM-страницы утекут (их по 12 на набор). */ -int pop_bg_load(uint8_t set) __banked -{ - int i; - if (set >= POP_TILESETS) return -1; - if (set == bg_set) return 0; - if (bg_set != 0xFF) { /* смена набора — освободить старый */ - for (i = 0; i < POP_ENV_PAGES; i++) atlas_free(&pop_env[i]); - atlas_free(&pop_wall_at); - atlas_free(&pop_fore_at); - } - /* Двадцать пять атласов фона лежат в одном архиве: двенадцать на - * тайлсет подряд плюс общий chtab_1. Открываем его ОДИН раз на смену - * набора — при цене `open` 51,4 мс это и есть основная экономия. */ - { - uint8_t tbl[ARC_BG_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t base = (uint8_t)(set * BG_SET_STRIDE); - int8_t bad = 0; - - if (pop_arc_open_id(&arc, POP_ARC_BG, tbl, ARC_BG_COUNT) < 0) return -1; - for (i = 0; i < POP_ENV_PAGES && !bad; i++) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, (uint8_t)(base + i), - &pop_env[i]) != 0); - if (!bad) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, - (uint8_t)(base + POP_ENV_PAGES), - &pop_wall_at) != 0); - if (!bad) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, - (uint8_t)(base + POP_ENV_PAGES + 1), - &pop_fore_at) != 0); - if (!bad && bg_set == 0xFF) /* chtab_1 от набора не зависит */ - bad = (int8_t)(pop_arc_atlas(&arc, tbl, ARC_BG_POP_POT, - &pop_pot_at) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - bg_set = set; - pop_palace = (uint8_t)(set == 1); - mob_spr_build(); /* композит падающего куска — свой на набор */ - /* Палитра — ПОСЛЕ атласов: если атлас не загрузился, цвета остаются от - * прежнего набора и картинка хотя бы не разъезжается. */ - return bg_load_tile_pal(pop_tile_pal[set]); -} - -/* Пере-применить палитру ТЕКУЩЕГО набора. Нужна отдельно от pop_bg_load - * из-за порядка старта: атласы грузятся ДО initgraph (тот снимает - * DSS-страницу W0), а общая игровая палитра kid.pal читается ПОСЛЕ него и - * затирает слоты 0x50..0x6F — она собрана из VDUNGEON - * (pop_pack_kid.py build_palette). Звать сразу за gfx_pal_fload. */ -int pop_bg_pal_apply(void) __banked -{ - if (bg_set == 0xFF) return -1; - return bg_load_tile_pal(pop_tile_pal[bg_set]); -} - -void pop_bg_free(void) __banked -{ - int i; - if (bg_set == 0xFF) return; - for (i = 0; i < POP_ENV_PAGES; i++) - atlas_free(&pop_env[i]); - atlas_free(&pop_wall_at); - atlas_free(&pop_fore_at); - atlas_free(&pop_pot_at); - bg_set = 0xFF; -} - -static const uint8_t SPIKES_FRAM_RIGHT[10] = {0, 134, 135, 136, 137, 138, 137, 135, 134, 0}; - -/* ---- Чомпер (seg008.c:0B2B draw_tile_anim, ветка tiles_18_chomper) ---- * - * Кадр берётся НЕ прямо из modif: chomper_fram1[min(modif & 0x7F, 6)] даёт - * номер позы 0..4, и уже он индексирует три набора кусков — нижнюю челюсть - * (backtable), верхнюю (backtable, со своим подъёмом) и передний слой - * (foretable, поверх персонажа). Кровь — тот же номер позы + 114 (back) / - * +119 (fore), рисуется mono-силуэтом цветом 12; в атласе она уже такой - * (pop_pack_bg.py, 2026-08-07). - * Старший бит modif (0x80) = «в этом чомпере кого-то перемололо». - * - * Номер позы (pop_chomp_pose) и передние куски живут в РЕЗИДЕНТЕ - * (pop_tile.c): их читает ещё и fore-проход из горячей половины, а - * const-таблицы банка из чужого банка не видны. */ -static const uint8_t CHOMP_FRAM_BOT[5] = {101, 102, 103, 104, 105}; -static const uint8_t CHOMP_FRAM_TOP[5] = {0, 0, 111, 112, 113}; -static const uint8_t CHOMP_FRAM_Y[5] = {0, 0, 0x25, 0x2F, 0x32}; - -static const uint8_t BLUELINE_FRAM1[4] = {0, 124, 125, 126}; -static const int8_t BLUELINE_FRAM_Y[4] = {0, -20, -20, 0}; -static const uint8_t BLUELINE_FRAM3[4] = {44, 44, 45, 45}; - -/* ---- Зелье (tiles_10_potion, seg008 draw_tile_anim/draw_tile_fore) ---- - * Тип = (modif & 0xF8) >> 3: 0 = пусто (ничего не рисуем), 2..4 — «большая» - * склянка (id 13) и pot_size=1, остальные — маленькая (id 12). Спрайты — из - * chtab_1 (атлас pop_pot), поэтому НЕ из env: раньше мы рисовали chtab_6 id 12 - * (res212), которого в VDUNGEON нет — оттуда и «мусорный объект». - * Позиции оригинала: склянка xh = fore_x + draw_xh, xl = 6, ybottom = fore_y + - * draw_main_y; пузырёк/маска xh = draw_xh + 3, xl = 1, - * ybottom = draw_main_y − (pot_size << 2) − 14. */ -#define POT_MASK_ID 23 -static const uint8_t POTION_FRAM_BUBB[8] = {0, 16, 17, 18, 19, 20, 21, 22}; - -static uint8_t potion_type(uint8_t modif) { return (uint8_t)((modif & 0xF8) >> 3); } - - - -/* Дворец? — по ЗАГРУЖЕННОМУ набору (pop_palace ставит pop_bg_load), а не по - * номеру уровня: так ветки отрисовки и картинки заведомо согласованы даже в - * момент смены. */ -#define PALACE (pop_palace) - -/* Декоративная панель над воротами — ТОЛЬКО в паласе (в подземелье над - * воротами не рисуется ничего). Индекс — модификатор тайла doortop. - * seg008:407 doortop_fram_top / seg008:453 doortop_fram_bot. */ -static const uint8_t DOORTOP_FRAM_TOP[4] = {0, 81, 83, 0}; -static const uint8_t DOORTOP_FRAM_BOT[4] = {78, 80, 82, 0}; - -/* Верх ворот: его рисует тайл НАД воротами (draw_tile_anim_topright, - * seg008:0568). Кадр — по открытости соседа снизу-слева; 68 — маска, - * mono-блит чёрным «продавливает» фон под створкой. - * Без этого над воротами оставался чёрный клин — виден у шва во дворце, - * где сверху идёт декоративная панель doortop. */ -static const uint8_t DOOR_FRAM_TOP[8] = {60, 61, 62, 63, 64, 65, 66, 67}; -#define GATE_TOP_MASK 68 - -/* topright тайла снизу-слева (seg008.c:410). */ -static void draw_topright(uint8_t tt, uint8_t tmod, int x, int dby) -{ - if (tt == 7 || tt == 12) { /* верх ворот */ - if (!PALACE) return; /* подземелье: ничего (seg008:413) */ - if (DOORTOP_FRAM_TOP[tmod & 3]) - pop_env_b(DOORTOP_FRAM_TOP[tmod & 3], x, dby); - return; - } - if (tt == 20) { pop_wall_b(2, x, dby); return; } - if (pop_tile_table[tt].topright_id) - pop_env_b(pop_tile_table[tt].topright_id, x, dby); -} - - -/* ---- Loose floors: кадры дрожащей плиты (seg008 loose_fram_*) ------- * - * Состояние pop_loose_modif[] живёт в pop_map. draw_tile рисует грани - * loose АНИМИРОВАННО по modif (как SDLPoP: сам тайл — лево/низ, ПРАВЫЙ - * СОСЕД — правую грань через draw_tile_anim_right). При modif==0 (покой/ - * статич. запекание) get_loose_frame=0 → базовые кадры 41/42/43. */ -static const uint8_t LOOSE_FRAM_RIGHT[12] = {42,71,42,72,72,42,42,42,72,72,72,0}; - -/* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора, - * из которой потом восстанавливает heal). В этом режиме дрожащие кадры - * ЧУЖИХ плит рисовать НЕЛЬЗЯ: транзиентный кадр законсервируется в копии, а - * так как запечка идёт двумя кадрами (по одному на страницу дабл-буфера), - * на страницах застынут РАЗНЫЕ кадры — вечное мерцание. Пример: упала плита - * (0,6); её запечка перерисовывает и соседа, а правый угол СОСЕДНЕЙ плиты - * (0,5), который рисуется в ячейке (0,6), был в этот момент в тряске. - * Фон обязан быть состоянием ПОКОЯ — анимация каждый кадр кладётся поверх - * (банк SPRITE, только видео-ОЗУ). */ -/* draw_leveldoor (seg008:1D29) — дверь уровня. Рисуется при обработке - * ПРАВОЙ половины (tile_left = 0x10), все куски со сдвигом +8px (xh+1): - * 99 низ лестницы (всегда), - * 144 марш лестницы за створкой (когда створка приподнята, modif != 0), - * 33 слайс створки — повторяется вниз с шагом 4px, пока не дойдёт до - * y = ybottom − modif: modif 0 = закрыто (створка на всю высоту), - * 43 = открыто (остаётся только верхняя кромка), - * 34 верх коробки двери. - * Куски непрозрачные (blitters_0_no_transp) — как в оригинале. */ -static void draw_leveldoor(uint8_t modif, int xh, int dmy) -{ - int x = (xh + 1) * 8; - int ybottom = dmy - 13; - int ylo = ybottom - (int)(modif & 3) - 48; /* leveldoor_ybottom */ - int y = ybottom - (int)modif; - /* leveldoor_right (seg008:1D29): правая кромка проёма — от xh ТЕКУЩЕГО - * тайла, то есть ПРАВОЙ половины двери (сюда мы попадаем из - * draw_tile_anim_right, разбирая левого соседа). - * - * +8 у дворцовых уровней — дословно seg008:1429 - * (`if (tbl_level_type[current_level]) leveldoor_right += 8;`): проём - * во дворце шире, чем в подземелье. Без этой строки Кид в анимации - * ухода на следующий уровень скрывался за кромкой РАНЬШЕ, чем нужно, - * потому что клип брался по ширине подземного проёма (найдено на - * уровне 4, обход 2026-08-17). pop_palace ставит pop_bg_load из того - * же tbl_level_type, что читает оригинал. */ - pop_leveldoor_right = xh * 8 + 48; - if (pop_palace) pop_leveldoor_right += 8; - pop_env_b(99, x, ybottom); - if (modif) - pop_env_b(144, x, ybottom - 4); /* лестница (комната ≠ стартовой) */ - for (;;) { - pop_env_b(33, x, ylo); - if (y > ylo) ylo += 4; - else break; - } - /* ИМЕННО после цикла: в оригинале clip_char читает уже доведённое - * значение (низ поднятой створки), а не стартовое. */ - pop_leveldoor_ybottom = ylo; - pop_env_b(34, x, dmy - 64); -} - -/* ---- draw_tile (seg008.c:155) — одна клетка ------------------------ */ -/* ---- КОНТЕКСТ ТАЙЛА (порт load_curr_and_left_tile, seg008:0339) ------- - * Не локали draw_tile, а file-scope переменные — ровно как curr_tile / - * curr_modifier / draw_xh / draw_main_y / draw_bottom_y у оригинала. - * - * Зачем: в draw_tile 57 вызовов, и КАЖДОЕ значение, живое через вызов, SDCC - * спиливал в стековый кадр — получались 26 байт кадра и 513 обращений - * `-N(ix)` (замер 2026-08-17: 23 700 тактов накладных на вызов при одном - * блите на тайл, docs/perf_green_phase.md §1.6). У file-scope переменных - * абсолютная адресация (`ld a,(nn)` — 13 тактов против 19) и спиливать - * нечего. Функция от этого не становится реентерабельной, но и не была: - * draw_tile ниоткуда себя не зовёт. */ -static int dt_row, dt_col; -static uint8_t dt_code, dt_lcode, dt_lmod; -static int dt_xh, dt_x, dt_dby, dt_dmy; -static const piece *dt_t, *dt_lt; -static uint8_t dt_rbl, dt_rblm, dt_wmod, dt_base_id; -static int dt_base_yb; - -static void draw_tile(int row, int col) -{ - dt_row = row; dt_col = col; - dt_code = pop_tile_code(dt_row, dt_col); - dt_lcode = pop_tile_code(dt_row, dt_col - 1); - dt_lmod = pop_tile_mod(dt_row, dt_col - 1); - /* Нажатая кнопка (seg008 get_tile_to_draw): при таймере связи >1 opener - * (0x0F) рисуется как ПОЛ (modif 0), closer (0x06) — как stuck (0x05). - * Модификатор кнопки = индекс LINKLOC. И для самого тайла, и для левого - * соседа (его правая грань). */ - if (dt_code == 0x0F) { if ((pop_doorlink2(pop_tile_mod(dt_row, dt_col)) & 0x1F) > 1) dt_code = 1; } - else if (dt_code == 0x06) { if ((pop_doorlink2(pop_tile_mod(dt_row, dt_col)) & 0x1F) > 1) dt_code = 5; } - if (dt_lcode == 0x0F) { if ((pop_doorlink2(dt_lmod) & 0x1F) > 1) { dt_lcode = 1; dt_lmod = 0; } } - else if (dt_lcode == 0x06) { if ((pop_doorlink2(dt_lmod) & 0x1F) > 1) dt_lcode = 5; } - dt_xh = POP_COL_XH[dt_col]; - dt_x = dt_xh * 8; - dt_dby = 63 * dt_row + 65; - dt_dmy = dt_dby - 3; - dt_t = &pop_tile_table[dt_code]; - dt_lt = &pop_tile_table[dt_lcode]; - - /* тайл снизу-слева (для topright). Ниже нижнего ряда — берём ряд 0 - * комнаты снизу (load_rowbelow, seg008:368): row_below_left_[dt_col] = - * room_B(0, dt_col-1); dt_col-1<0 → левая комната снизу = стена уровня. */ - if (dt_row + 1 > 2) { - int lc = dt_col - 1; - /* lc < 0 — угол (2,0): сосед снизу-слева лежит в ЧУЖОЙ комнате - * (room_BL). Её тайл (0,9) приходит одиннадцатым байтом below-ряда; - * «стена» там стоит, только если такой комнаты нет — как в - * load_rowbelow (seg008:368). См. BUG-SEAM-WEDGE-1. */ - if (lc < 0) dt_rbl = pop_t_below ? (uint8_t)(pop_t_below[10] & 0x1F) : 20; - else dt_rbl = pop_t_below ? (uint8_t)(pop_t_below[lc] & 0x1F) : 0; - /* Модификатора ряда снизу у нас нет (pop_t_below — только fg), а он - * нужен паласной панели над воротами. Ставим 0 = «панели нет»: - * случай узкий (ворота в комнате СНИЗУ, по диагонали от пустого - * тайла нижнего ряда), но расхождение с оригиналом честное. */ - dt_rblm = 0; - } else { - dt_rbl = pop_tile_code(dt_row + 1, dt_col - 1); - dt_rblm = pop_tile_mod(dt_row + 1, dt_col - 1); - } - - /* Пометка «фон трогали» — ОДНА на весь тайл, а не на каждый его кусок - * (pop_cd_batch_begin/end). Досрочных выходов у draw_tile нет, так что - * скобка гарантированно закрывается. */ - pop_cd_batch_begin(); - - /* --- draw_tile_anim_topright (seg008:0568): верх ВОРОТ снизу-слева. - * Условие дословно: свой тайл пуст / верх большой колонны / верх двери, - * а снизу-слева — ворота. --- */ - if ((dt_code == 0 || dt_code == 9 || dt_code == 12) && dt_rbl == 4) { - uint8_t om = (dt_rblm > 188) ? 188 : dt_rblm; - pop_env_b(GATE_TOP_MASK, dt_x, dt_dby); /* маска (mono, чёрным) */ - pop_env_b(DOOR_FRAM_TOP[(om >> 2) & 7], dt_x, dt_dby); - } - - /* --- floorright (seg008.c:392) — только can_see_bottomleft --- */ - if (dt_code == 0 || dt_code == 9 || dt_code == 12 || dt_code == 26) { - draw_topright(dt_rbl, dt_rblm, dt_x, dt_dby); - /* floor-right тень (blitters_9_black) на ЧЁРНОМ фоне = no-op - * (чёрный силуэт по чёрному) — не рисуем. Если tile_left имеет - * floor_right: dt_lt->floor_right. */ - } - - /* --- draw_tile_right (seg008.c:456) --- */ - if (dt_code != 20) { - if (dt_lcode == 20) { - /* Полоска на стене (seg008:510) — только палас и только если у - * стены не взведён старший бит модификатора. */ - if (PALACE && (dt_lmod & 0x80) == 0) - pop_env_b(84, dt_x + 3 * 8, dt_dmy - 27); - pop_wall_b(1, dt_x, pop_tile_table[20].right_y + dt_dmy); /* грань стены */ - } else if (dt_lcode == 0) { - if (dt_lmod <= 3 && BLUELINE_FRAM1[dt_lmod]) - pop_env_b(BLUELINE_FRAM1[dt_lmod], dt_x, BLUELINE_FRAM_Y[dt_lmod] + dt_dmy); - } else if (dt_lcode == 1) { - uint8_t num; - pop_env_b(42, dt_x, pop_tile_table[1].right_y + dt_dmy); /* правый треуг. пола */ - num = (dt_lmod <= 3) ? dt_lmod : 0; - /* seg008:501 — `if (num == !!level_type) return;`: в подземелье - * пропускается num==0, в паласе num==1. */ - if (num != (PALACE ? 1 : 0)) - pop_env_b(BLUELINE_FRAM3[num], dt_x, dt_dmy - 20); /* силуэт кладки */ - } else if (dt_lcode == 7 || dt_lcode == 12) { - /* Низ декоративной панели над воротами (seg008:506) — только - * палас; в подземелье у doortop right_id нулевой и ветка пустая. */ - if (PALACE && DOORTOP_FRAM_BOT[dt_lmod & 3]) - pop_env_b(DOORTOP_FRAM_BOT[dt_lmod & 3], dt_x, dt_lt->right_y + dt_dmy); - } else { - if (dt_lt->right_id) - pop_env_b(dt_lt->right_id, dt_x, dt_lt->right_y + dt_dmy); - /* Орнаментная лента соседа (seg008:486) — только палас. Она и - * даёт непрерывную полосу под окнами: stripe_id = 145 у пола, - * кнопок, зелья, loose, чомпера и меча. */ - if (PALACE && dt_lt->stripe_id) - pop_env_b(dt_lt->stripe_id, dt_x, dt_dmy - 27); - /* Основание факела (seg008:489): рисует ПРАВЫЙ сосед. */ - if (dt_lcode == 19 || dt_lcode == 30) - pop_env_b(146, dt_x, dt_dby - 28); - } - } - - /* --- draw_tile_anim_right (seg008.c:530) — статичные части. Для - * верхней полосы (dt_row<0, draw_tile_aboveroom) НЕ рисуется + защита от - * отрицательного индекса в pop_loose_modif. --- */ - if (dt_row >= 0) { - if (dt_lcode == 4) { /* gate: решётка */ - pop_gate_back_b(dt_lmod, dt_xh, dt_dby, dt_dmy); - } else if (dt_lcode == 11) { /* loose: правая грань (анимир. по modif соседа-loose) */ - pop_env_b(LOOSE_FRAM_RIGHT[pop_loose_frame(pop_loose_modif[dt_row * 10 + (dt_col - 1)])], dt_x, dt_dby - 1); - } else if (dt_lcode == 2) { /* spike: статич. кадр */ - uint8_t sf = pop_spike_frame(dt_lmod); - if (sf < 10 && SPIKES_FRAM_RIGHT[sf]) - pop_env_b(SPIKES_FRAM_RIGHT[sf], dt_x, dt_dmy - 7); - } else if (dt_lcode == 16) { /* дверь уровня */ - draw_leveldoor(dt_lmod, dt_xh, dt_dmy); - } - /* Пламя факела (seg008:560, chtab_1 id modifier+1) здесь, в статичной - * отрисовке тайла, не рисуем — его ведёт pop_torch_draw из - * pop_process_trobs каждый кадр. Но ЗАПЕКАЕТСЯ оно всё равно (там - * GFX_BANK_NORMAL): факел — чистый задний план, а самонакрытие кадров - * делает запекание безопасным. Подробности — в шапке pop_torch_draw. */ - } - - /* --- draw_tile_bottom (seg008.c:570) --- */ - if (dt_code == 20) { - dt_wmod = pop_wall_modifier(dt_row, dt_col); - if (!PALACE) /* во дворце тело стены даёт */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[dt_wmod], dt_x, dt_dby); /* wall_pattern */ - /* заливками (seg008:576) */ - pop_wall_pattern_b(dt_row, dt_col, 0); - } else if (dt_t->bottom_id) { - pop_env_b(dt_t->bottom_id, dt_x, dt_dby); - } - - /* --- draw_loose (seg008.c:600) — нижняя грань (анимир. по modif). В - * верхней полосе (dt_row<0) это ПЛИТА-ПОТОЛОК (loose ряда 2 комнаты сверху): - * её состояние живёт отдельно, в pop_ceil_modif[dt_col] (pop_map). --- */ - if (dt_code == 11) - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(dt_row >= 0 ? pop_loose_modif[dt_row * 10 + dt_col] - : pop_ceil_modif[dt_col])], dt_x, dt_dby); - - /* --- draw_tile_base (seg008.c:611). Верхняя полоса (dt_row<0) базу НЕ - * рисует (draw_tile_aboveroom) — только нижние/правые грани. --- */ - if (dt_row >= 0) { - dt_base_id = dt_t->base_id; - dt_base_yb = dt_dmy; - if (dt_lcode == 26 && dt_code == 12) { - /* «Lattice + door A» (seg008:622): у doortop своей базы нет - * (dt_base_id 0), и когда слева от него стоит арка (lattice_down), - * пара рисуется ОДНИМ спрайтом 6, опущенным на 3 px. Без этой - * ветки на месте тайла оставалась чёрная дыра — уровень 5, - * комната 12, тайл (0,9) (BUG-LATTICE-DOORTOP). */ - dt_base_id = 6; - dt_base_yb += 3; - } - else if (dt_code == 11) /* loose: левая грань (анимир.) */ - dt_base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[dt_row * 10 + dt_col])]; - else if (dt_code == 0x0F && dt_lcode == 0 && !PALACE) /* opener, слева пусто */ - dt_base_id = 148; /* левая половина без пола — только */ - /* подземелье (seg008:628) */ - if (dt_base_id) - pop_env_b(dt_base_id, dt_x, dt_t->base_y + dt_base_yb); - } - - /* --- draw_tile_anim (seg008.c:0B2B) — левый кадр выдвинутых пик в - * СВОЕЙ ячейке (анимир. по своему modif). Без него остриё пики - * рисуется только правым соседом со сдвигом → шахта над самой пикой - * пустая. */ - if (dt_row >= 0 && dt_code == 2) { - uint8_t sf = pop_spike_frame(pop_tile_mod(dt_row, dt_col)); - if (sf > 0 && sf < 10 && POP_SPIKES_FRAM_LEFT[sf]) - pop_env_b(POP_SPIKES_FRAM_LEFT[sf], dt_x, dt_dmy - 2); - } - /* Чомпер (тот же draw_tile_anim, case tiles_18_chomper): нижняя челюсть - * на draw_main_y, поверх неё кровь (если кого-то перемололо), затем - * верхняя челюсть со своим подъёмом. Всё это BACKtable — то есть ПОД - * персонажем; передний слой рисует fore-проход. */ - if (dt_row >= 0 && dt_code == 0x12) { - uint8_t cm = pop_tile_mod(dt_row, dt_col); - uint8_t pose = pop_chomp_pose(cm); - pop_env_b(CHOMP_FRAM_BOT[pose], dt_x, dt_dmy); - if (cm & 0x80) - pop_env_b((uint8_t)(pose + 114), dt_x + 8, dt_dmy - 6); - if (CHOMP_FRAM_TOP[pose]) - pop_env_b(CHOMP_FRAM_TOP[pose], dt_x, dt_dmy - CHOMP_FRAM_Y[pose]); - } - /* Меч-предмет на полу (тот же draw_tile_anim, case tiles_22_sword): - * chtab_1 (наш pot-атлас), id = (modif==1)+10, низ на draw_main_y-3. - * В оригинале это midtable (рисуется вместе с объектами) — у нас статикой - * в фоне: пока меч лежит, он не анимируется, а Kid и так поверх фона. */ - if (dt_row >= 0 && dt_code == 22) - pop_pot_b((uint8_t)((pop_tile_mod(dt_row, dt_col) == 1) + 10), dt_x, dt_dmy - 3); - - /* --- draw_tile_fore (seg008.c:690) --- */ - if (dt_code == 20) { - dt_wmod = pop_wall_modifier(dt_row, dt_col); - if (!PALACE) /* seg008:711 */ - pop_wall_b(POP_WALL_FRAM_MAIN[dt_wmod], dt_x, dt_dmy); /* основная грань */ - pop_wall_pattern_b(dt_row, dt_col, 1); - } - if (dt_code == 0x12) { /* чомпер: передние зубья + кровь. - * Отдельной веткой, как в оригинале: - * у записи 0x12 fore_id == 0, и через - * таблицу этот слой не идёт. */ - uint8_t cm = pop_tile_mod(dt_row, dt_col); - uint8_t pose = pop_chomp_pose(cm); - /* Передние куски чомпера и его кровь лежат в pop_fore.atl - * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит - * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ - pop_fore_b(POP_CHOMP_FRAM_FOR[pose], dt_x, dt_dmy); - if (cm & 0x80) - pop_fore_b((uint8_t)(pose + 119), dt_x + 8, dt_dmy - 6); - } - if (dt_code == 10) { /* зелье: chtab_1, не env fore_id. - * Пузырёк — динамика (pop_potion_draw). */ - pop_potion_flask(dt_row, dt_col, pop_tile_mod(dt_row, dt_col)); - } else if (dt_t->fore_id) { - pop_fore_b(dt_t->fore_id, dt_t->fore_x * 8 + dt_x, dt_t->fore_y + dt_dmy); - } - pop_cd_batch_end(); /* одна пометка на весь тайл */ -} - - -/* ---- Loose floors — динамическая перерисовка (seg008 draw_loose) ---- * - * Порт SDLPoP redraw_tile_height: каждый кадр анимации перерисовать - * ПОЛНОСТЬЮ и loose-тайл, и ПРАВЫЙ СОСЕД (грани loose анимируются по modif - * внутри draw_tile). */ -void pop_loose_shake_draw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* heal возвращает печёный фон обоих тайлов из ОЗУ-копии, поверх — - * перерисовка обоих тайлов с дрожащим кадром (draw_tile берёт кадр из - * pop_loose_modif). Порт redraw_tile_height (loose + правый сосед). - * NB: печёный кадр-0 может слегка просвечивать по кромкам — чистое - * решение (bake тайла как empty + рисовать loose всегда динамически) - * отложено; wipe-в-чёрный делал плиту невидимой — не годится. */ - /* Ширина 58, а не 64 = «две клетки»: реальный след дрожащей плиты — - * свой тайл (верх/левая грань 32 px) плюс правая грань, которая уходит - * в соседнюю клетку на 26 px (25 во дворце). Габариты сняты из - * каталогов атласов: 41/69/70 = 32x13-14, 43/73/74 = 32x3, - * 42/71/72 = 26x15-16. Задача HEAL-WIDTH. */ - pop_heal_off(x, 63 * row + 46, 58, 24); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); /* loose: лево+низ (анимир.) */ - if (col + 1 < 10) - draw_tile(row, col + 1); /* сосед: правая грань loose (анимир.) + его пол */ - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Вернуть ТОЛЬКО слой anim чомпера — порт ветки redraw_frames_anim в - * redraw_needed (seg008:0211). Контракт и разбор — в шапке объявления - * (pop_bg.h). - * - * Чем это отличается от pop_chomp_redraw и почему нужна отдельная функция. - * Пометку ставит АНИМАЦИЯ ФАКЕЛА: пламя лежит в ячейке ПРАВОГО соседа - * (seg008:560), то есть поверх чомпера, и запекается в фон каждый кадр. - * Возвращать после него надо ровно графику чомпера — а pop_chomp_redraw - * делал heal 32x64 плюс ПОЛНЫЙ draw_tile, то есть пересобирал тайл со всеми - * слоями (правая грань, база, низ, loose), которых пламя не касалось. - * Замер 11/15 (2026-08-19): 190 260 тактов на этот единственный тайл, 24 % - * работы кадра. - * - * heal не нужен: поза чомпера здесь НЕ меняется (свою анимацию ведёт - * pop_chomp_redraw по своей пометке), стирать нечего — рисуем ту же - * графику поверх свежего пламени. Оригинал на пометку anim wipe тоже не - * делает: у него это отдельный счётчик wipe_frames. - * - * Передний слой (зубья, POP_CHOMP_FRAM_FOR) сюда НЕ входит — как и в - * оригинале, где fore идёт по своему счётчику redraw_frames_fore. Геометрия - * это подтверждает: пламя занимает 18 строк с низом на 63*row+22, передние - * зубья — на dmy = 63*row+62, то есть на 40 строк ниже; пересекается с огнём - * только ВЕРХНЯЯ челюсть (подъём до 0x32 = 50 px), а она в back-слое. */ -void pop_chomp_anim_draw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - int dmy = 63 * row + 62; /* dby - 3, как в draw_tile */ - uint8_t cm = pop_tile_mod(row, col); - uint8_t pose = pop_chomp_pose(cm); - - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_cd_batch_begin(); /* одна пометка на все куски */ - pop_env_b(CHOMP_FRAM_BOT[pose], x, dmy); - if (cm & 0x80) /* кого-то перемололо */ - pop_env_b((uint8_t)(pose + 114), x + 8, dmy - 6); - if (CHOMP_FRAM_TOP[pose]) - pop_env_b(CHOMP_FRAM_TOP[pose], x, dmy - CHOMP_FRAM_Y[pose]); - pop_cd_batch_end(); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать пики тайла (row,col) на back-странице по ЖИВОМУ modif - * (pop_trob). Кадр выдвижения рисует ПРАВЫЙ сосед (draw_tile ветка lcode==2 - * читает lmod = pop_t_bg[row*10+col] = живой modif пики). pop_t_bg должен указывать - * на room_modif (enter_room передаёт его как bg). Порт redraw_21h/draw_tile. - * heal берёт печёный статич. фон, поверх — динамич. кадр (шипы над полом). */ -void pop_spike_redraw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* Порт redraw_21h -> redraw_tile_height (seg007:0218): wipe + ПОЛНЫЙ - * redraw ДВУХ тайлов — своего и правого соседа (остриё рисуется в его - * ячейке). Именно ПОЛНЫЙ: рисовать только два спрайта остриёв нельзя — - * порядок слоёв внутри тайла (draw_tile_anim_right идёт ПЕРВЫМ, база и - * fore соседа ложатся ПОВЕРХ) тогда теряется, и остриё лезет на колонну - * справа. Заодно draw_tile сам восстанавливает вклад соседних пик: - * в ячейке col — правое остриё пики col-1 (ветка lcode==2). - * Шипы выдвигаются выше линии пола (dmy-7), поэтому heal с запасом вверх - * (63*row+34 .. +74); ширина 64 = обе ячейки. */ - pop_heal_off(x, 63 * row + 34, 64, 40); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); - if (col + 1 < 10) - draw_tile(row, col + 1); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Чомпер: перерисовка кадра анимации (порт redraw_20h/draw_trob). Челюсти - * поднимаются высоко над линией пола (верхний кусок уходит на 0x32 = 50 px - * вверх от dmy), поэтому heal берём на всю высоту тайла. Правый сосед НЕ - * нужен: в отличие от пик, все куски чомпера рисуются в СВОЕЙ ячейке. */ -void pop_chomp_redraw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* РОВНО 32x60 — весь чомпер помещается в свой тайл, и это его точный - * след (замечание пользователя, проверено по каталогу атласа): - * нижняя челюсть 101/102 = 32x60 низом на dmy = 63*row+62, то есть - * занимает 63*row+3 .. +62; - * верхние челюсти дают ТОТ ЖЕ верх — подъём 0x25 при высоте 23, - * 0x2F при 13 и 0x32 при 10 все три дают 63*row+3; - * кровь 114..118 шириной 6 рисуется на x+8, то есть внутри 32. - * Было 64 «на всю высоту тайла» — четыре лишние строки. */ - pop_heal_off(x, 63 * row + 3, 32, 60); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать ЛЕВЫЙ шов (col0) на back-странице по живому modif соседа — - * ворота соседней комнаты слева (portcullis room8) видны в col0 текущей - * комнаты через draw_gate_back (draw_tile ветка lcode==4, lmod = pop_t_lbg[0]). - * pop_t_lbg (lcol_bg) должен указывать на живой modif (roomtest обновляет из - * room_modif соседа перед вызовом). Bar-в-чёрный + redraw (как loose bake): - * heal вернул бы ЗАПЕЧЁННОЕ состояние ворот → при открытии нижние бары - * оставались бы; чёрная плита стирает старые бары в VRAM+ОЗУ-копию. */ -void pop_room_redraw_seam_left(uint8_t rows) __banked -{ - int8_t r; - /* rows — битовая маска рядов 0..2: перерисовываем ТОЛЬКО те, где openness - * реально изменился. Раньше ряд был жёстко нулевым, потому что на уровне 1 - * решётка соседа стояла в (0,9); на уровне 4 она в (1,9), и открытые ворота - * оставались нарисованными закрытыми (BUG-GATE-SEAM-ROW1). */ - for (r = 0; r < 3; r++) { - int yt = POP_YOFF + 63 * r; - if (!(rows & (1 << r))) continue; - gfx_set_bank(GFX_BANK_NORMAL); - /* Полосу кладки НАД рядом НЕ трогаем: её низ на room-space 63*r+2, а - * бары ворот начинаются с 63*r+3 (gate_top_y = dby−62). Раньше bar шёл - * от POP_YOFF и стирал потолок, из-за чего приходилось перерисовывать - * ещё и draw_tile(-1,0) — вдвое дороже на КАЖДОМ кадре анимации. */ - pop_bar_black(0, yt + 3, 32, 62); /* col0 этого ряда (бары ворот) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(r, 0); /* фон col0 + бары ворот (живой modif) */ - gfx_set_bank(GFX_BANK_NORMAL); - } -} - -/* Ширина прямоугольника запечки, ОБРЕЗАННАЯ по правому краю экрана. - * - * Точечные запечки берут ширину «свой тайл + свес соседа» (40, 60 или 64 при - * шаге тайла 32) — для последней колонки это уезжает за 320. А заливка и - * копия по контракту НЕ КЛИПУЮТ (см. шапку _gfx_recthfill256: «Клиппинга НЕТ, - * координаты обязаны быть валидны») — и правильно, что не клипуют: проверка - * координат стоила бы дороже самой заливки. Значит обрезать обязан - * вызывающий. - * - * Чем это было: падение плиты (1,8) помечает соседа (1,9), pop_floor_bake - * заливал x=288 шириной 60, то есть 28 пикселей за экраном, и эти 28 всплывали - * ЧЁРНОЙ ПОЛОСОЙ у левого края — поверх стража в (1,0), причём только на одной - * странице дабл-буфера, то есть с мерцанием (найдено пользователем - * 2026-08-17, уровень 2 комната 4; трасса заливок: - * BAR x=288 y=117 w=60 h=39, а расхождение страниц — ровно x 0..27, y 117..155). - * - * Обрезка ничего не теряет: правее 320 восстанавливать нечего. */ -static uint8_t bake_w(int x, uint8_t w) -{ - if (x >= 320) return 0; /* весь прямоугольник за экраном */ - return (x + (int)w > 320) ? (uint8_t)(320 - x) : w; -} - -/* ---- ЗАПЕЧКА НА ВТОРУЮ СТРАНИЦУ — копией, а не пересчётом ----------- * - * Точечные запечки ставятся с pages = 2, то есть срабатывают ДВА кадра подряд - * — по разу на каждую страницу дабл-буфера, — и оба раза считают одно и то же. - * А после первого раза нужный прямоугольник уже лежит в ОЗУ-копии первой - * страницы, и его можно просто скопировать: gfx_copy_page берёт источником - * ОЗУ-копию НЕактивной страницы (то есть ЧИСТЫЙ фон — спрайты рисуются банком - * без тени и в копию не попадают), а приёмник обновляет и в видео-ОЗУ, и в - * ОЗУ-копии. - * - * Замер 2026-08-17: полная запечка щебня — 179 914 такта, колодца — 138 318; - * копия прямоугольника 60x39 стоит ~30 000, а 64x9 — ~14 000. - * - * Слот на тайл помнит, НА КАКОЙ странице сделана первая запечка (+1; 0 = не - * было). Копируем только если первая была на ДРУГОЙ странице и дабл-буфер - * включён; иначе честно пересчитываем. Такая проверка выдерживает и - * переплетение двух запечек в одном кадре, и отключённый дабл-буфер (чит - * SPACE), и смену комнаты между кадрами. */ -static uint8_t bake_pg[30], bake_pg_above[10]; - -static uint8_t bake_copy(uint8_t *slot, int x, int ytop, int w, int h) -{ - uint8_t pg = (uint8_t)(gfx_get_draw_page() & 1); - gfx_rect_t r; -#ifdef POP_DBG_NO_BAKE_COPY - (void)x; (void)ytop; (void)w; (void)h; /* A/B: копия выключена целиком */ - *slot = (uint8_t)(pg + 1); - return 0; -#endif - if (!*slot || (uint8_t)(*slot - 1) == pg || - gfx_get_draw_page() == gfx_get_visible_page()) { - *slot = (uint8_t)(pg + 1); /* это ПЕРВАЯ запечка */ - return 0; - } - *slot = 0; - if (pop_upside) ytop = POP_FLIP_TOP(ytop, h); /* копируем ЭКРАННЫЙ прямоугольник */ - r.x = (int16_t)x; r.y = (int16_t)ytop; - r.w = (uint16_t)w; r.h = (uint16_t)h; - gfx_copy_page(&r, GFX_COPY_DIRECT); - pop_cd_touch(x, ytop, w, h); /* область изменилась и на этой странице */ - return 1; -} - -/* Перепометка тайла: содержимое могло измениться (кнопка с идущим таймером - * перерисовывается каждый кадр РАЗНОЙ), поэтому копия со второй страницы - * больше не годится — гасим слот, следующая запечка пойдёт честно. - * Контракт и мотив — в _pop_bg.h. */ -void pop_bake_slot_reset(uint8_t tilepos) -{ - if (tilepos < 30) bake_pg[tilepos] = 0; -} - -void pop_bake_slot_reset_above(uint8_t col) -{ - if (col < 10) bake_pg_above[col] = 0; -} - -/* Смена комнаты/уровня: запечки прошлой комнаты недоделанными не остаются - * (pop_trob_room_changed сбрасывает пометки), но слоты обнулить надо — иначе - * первый же тайл с тем же номером в новой комнате получит копию вместо - * честной запечки. */ -void pop_bake_forget(void) __banked -{ - uint8_t i; - for (i = 0; i < 30; i++) bake_pg[i] = 0; - for (i = 0; i < 10; i++) bake_pg_above[i] = 0; -} - -/* ---- Плита-потолок (loose ряда 2 комнаты СВЕРХУ) ------------------- * - * В полосе кладки у потолка (наш ряд −1) виден только НИЗ плиты - * (draw_tile_aboveroom: bottom+loose, всё выше отрезано клипом POP_YOFF). - * Дрожащий кадр берётся из pop_ceil_modif[col] (см. draw_loose выше). - * shake — на текущей (back) странице поверх фона; bake — «запечь» пустоту - * после провала (NORMAL, в ОЗУ-копию, чтобы heal её сохранял). */ - -/* Полоса кладки у потолка: дрожащая плита ряда −1 — порт redraw_needed_above - * (seg008:0221). - * - * Оригинал рисует ТОЛЬКО СВОЮ колонку: кусок, свисающий вправо, кладёт её же - * draw_tile_right. Здесь дополнительно звался `draw_tile(-1, col + 1)` — - * целый соседний тайл, — и это удваивало работу. Замер 2026-08-13: пик - * зелёного блока 887 000 тактов при кадровом интервале 430 000 состоял ровно - * из шести вызовов этой функции, то есть двенадцати отрисовок тайла. - * - * Батчинг смежных колонок (один heal на диапазон) пробовался и убран: плиты - * стартуют со случайными задержками (check_fall_flo), в кадре дрожат - * разрозненные колонки, пробег почти всегда длиной в одну — механика не - * окупалась, но крутилась каждый кадр. */ -void pop_ceil_shake_draw(int col) __banked -{ - int x = POP_COL_XH[col] * 8; - pop_heal_off(x, 0, 64, CEIL_BAND_H); - /* Пометка «фон трогали» — ОДНА на восстановленный прямоугольник: пока - * стоит окно (ниже), pop_blit_b пометок не ставит. Область та же, что у - * heal'а, — он её и стирает. */ - pop_cd_touch(x, POP_YOFF, 64, CEIL_BAND_H); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_t_clip_top = POP_YOFF; - pop_t_win_set(x, POP_YOFF, 64, CEIL_BAND_H); /* восстанавливаем ровно полосу */ - draw_tile(-1, col); - pop_t_win_clear(); - pop_t_clip_top = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_ceil_bake_empty(int col) __banked -{ - int x = POP_COL_XH[col] * 8; - uint8_t bw = bake_w(x, 64); /* обрезка по краю экрана — см. bake_w */ - /* Вторая страница — копией с первой (см. bake_copy). */ - if (bake_copy(&bake_pg_above[col], x, POP_YOFF, bw, CEIL_BAND_H + 1)) return; - gfx_set_bank(GFX_BANK_NORMAL); - /* Отдельного pop_cd_touch тут не надо: pop_bar_black метит сам, и ровно - * этот же прямоугольник (было два вызова на одну область). */ - if (bw) pop_bar_black(x, POP_YOFF, bw, CEIL_BAND_H + 1); /* стереть плиту в ОЗУ-копии */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_clip_top = POP_YOFF; - /* Окно = ровно стёртая полоса. Главный выигрыш здесь не в отсеве, а в - * КЛИПЕ: куски ряда 0 высотой 63 px рисовались целиком (клип был только - * сверху, по pop_t_clip_top), хотя восстановить надо девять строк — - * отсюда 21 447 такта на блит против 14 384 в pop_floor_bake. */ - pop_t_win_set(x, POP_YOFF, bw, CEIL_BAND_H + 1); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - /* Восстанавливаем ВСЁ, чья графика попадает в стёртую полосу, а не только - * два тайла ряда −1 (BUG-LOOSE-3). Куски тайла рисуются ВВЕРХ от своей - * нижней грани и свисают ВПРАВО, поэтому в полосу над тайлом col лезут: - * • ряд −1, колонки col−1..col+1 — сама полоса кладки у потолка; - * • ряд 0, колонки col−1..col+1 — их верхушки заходят в те же 8 px. - * Раньше перерисовывались только (−1,col) и (−1,col+1), и в полосе - * оставался чёрный прямоугольник ~13×3 px (замер: экранные y 47..52 при - * полосе 44..52), который heal возвращал каждый кадр. Признак, что дело - * именно в запечке: после выхода из комнаты и возврата бара нет. */ - { - int c0 = (col > 0) ? col - 1 : 0; - int c1 = (col + 1 < 9) ? col + 1 : 9; - int c; - for (c = c0; c <= c1; c++) draw_tile(-1, c); - for (c = c0; c <= c1; c++) draw_tile(0, c); - } - pop_t_bake_rest = 0; - pop_t_win_clear(); - pop_t_clip_top = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* ---- Анимация факела и зелья (динамика, каждый кадр) ---------------- * - * Оба кадра рисуются ПОВЕРХ статического фона и стираются heal'ом своей - * области (фон запечён БЕЗ них). Факел: пламя chtab_1 id modifier+1 в - * ячейке ПРАВОГО соседа (seg008:560: xh = draw_xh + 1, ybottom = - * draw_main_y − 40). Зелье: маска (23, «прорезает» фон) + кадр пузырька - * potion_fram_bubb[modif & 7] на xh+3/xl=1, ybottom = draw_main_y − - * (pot_size<<2) − 14 (seg008:668). */ -void pop_torch_draw(int row, int col, uint8_t modif) __banked -{ - /* Пламя рисует ПРАВЫЙ сосед со своим draw_xh: xh = POP_COL_XH[col+1] + 1 - * (seg008:560), т.е. x = (col+1)*32 + 8 — как и основание факела (env - * 146), которое тоже лежит в ячейке соседа. */ - int x = (col + 1 < 10 ? POP_COL_XH[col + 1] : POP_COL_XH[col] + 4) * 8 + 8; - int yb = 63 * row + 62 - 40; - if (modif >= 9) return; - /* heal НЕ нужен: оригинал рисует пламя blitters_0_no_transp (seg008 - * draw_tile_anim_right), и все 9 кадров лежат на общем канвасе 16x18 — - * непрозрачный блит сам полностью накрывает предыдущий кадр. Кадры - * упакованы с opaque=True (pop_pack_bg POT_FLAME_IDS). - * - * И ровно поэтому пламя ЗАПЕКАЕТСЯ (GFX_BANK_NORMAL: видео-ОЗУ + ОЗУ-копия), - * а не рисуется в SPRITE поверх фона. Запечь его безопасно именно из-за - * самонакрытия — следующий кадр сотрёт предыдущий сам, «протухнуть» в - * копии нечему. А выигрыш принципиальный: точечные перерисовки соседних - * тайлов начинаются с heal из ОЗУ-копии, и незапечённое пламя они стирали - * — чомпер (0,7) комнаты 23 уровня 4 healит x 224..255 / y 30..93 и - * съедал факел (0,6), который рисуется в ячейке правого соседа. С - * запеканием heal возвращает огонь сам, а челюсти ложатся ПОВЕРХ него — - * тот же z-порядок, что у оригинала, где draw_tile_anim_right (пламя - * левого соседа) идёт до draw_tile_anim (сам чомпер). - * - * Пузырёк ЗЕЛЬЯ так нельзя: он ползёт вверх и себя не накрывает, ему - * нужен heal — pop_potion_draw остаётся в SPRITE. */ - gfx_set_bank(GFX_BANK_NORMAL); - pop_pot_b((uint8_t)(modif + 1), x, yb); - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_potion_draw(int row, int col, uint8_t modif) __banked -{ - uint8_t type = potion_type(modif); - int pot_size = (type >= 2 && type < 5) ? 1 : 0; - int x = (POP_COL_XH[col] + 3) * 8 + 1; - int yb = 63 * row + 62 - (pot_size << 2) - 14; - uint8_t bubb; - if (type == 0) return; - bubb = POTION_FRAM_BUBB[modif & 7]; - /* Цвет пузырька по ТИПУ зелья (draw_tile_anim, seg008:652): 3/4 (перо / - * переворот) — зелёный, 5/6 (вред / открыть ворота) — синий, остальные - * (1 лечение, 2 склянка жизни) — красный. У нас цвет запечён в спрайт - * при упаковке (mono-блиттера с параметром цвета нет), поэтому «цвет» = - * другой набор кадров: id 30..36 / 40..46 вместо 16..22 (pop_pack_bg.py). - * Кадр 0 («пузырька нет») общий — его подменять нечем и не нужно. */ - if (bubb) { - if (type == 3 || type == 4) - bubb = (uint8_t)(POP_POT_BUBB_GREEN + (bubb - POTION_FRAM_BUBB[1])); - else if (type == 5 || type == 6) - bubb = (uint8_t)(POP_POT_BUBB_BLUE + (bubb - POTION_FRAM_BUBB[1])); - } - pop_heal_off(x - 1, yb - 10, 8, 12); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_pot_b(POT_MASK_ID, x, yb); /* маска (под пузырьком) */ - pop_pot_b(bubb, x, yb); /* кадр пузырька */ - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Стереть ЗАПЕЧЁННОЕ пламя факела (row,col) с ТЕКУЩЕЙ draw-страницы и - * вернуть на его место фон покоя. - * - * Нужно ровно одному месту — перевороту экрана (pop_flip_screen). Пламя - * рисуется банком 0x50, то есть запекается и в ОЗУ-копию (см. шапку - * pop_torch_draw: heal'а у него нет, каждый следующий кадр непрозрачно - * накрывает предыдущий). Отражение страницы утаскивает его в зеркальную - * позицию, где накрывать уже нечем — и языки огня остаются по комнате - * навсегда. Стерев их ДО отражения, мы отражаем чистый фон и не платим за - * полную перерисовку комнаты (14.5 кадра против 2.1 у копии, замер MAME). - * - * Прямоугольник — канвас пламени 16x18 в ячейке ПРАВОГО соседа (seg008:560, - * те же координаты, что у pop_torch_draw). */ -void pop_torch_wipe(int row, int col) __banked -{ - int x = (col + 1 < 10 ? POP_COL_XH[col + 1] : POP_COL_XH[col] + 4) * 8 + 8; - int yb = POP_YOFF + 63 * row + 62 - 40; - /* У факела в колонке 9 канвас пламени лежит на x = 328, то есть ЦЕЛИКОМ за - * правым краем — заливать нечего, а bar не клипует (см. bake_w). */ - uint8_t tw = bake_w(x, 16); - pop_cd_touch(x, yb - 17, 16, 18); /* bar мимо pop_blit_b */ - gfx_set_bank(GFX_BANK_NORMAL); - if (tw) pop_bar_black(x, yb - 17, tw, 18); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой */ - draw_tile(row, col); - if (col + 1 < 10) draw_tile(row, col + 1); - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать тайл КНОПКИ (row,col) на back-странице: нажатая/отжатая - * (draw_tile подставляет пол/stuck по таймеру связи). Bar-в-чёрный + - * redraw — иначе «шишка» отжатой кнопки (base 147) осталась бы при переходе - * в пол. Звать из pop_process_trobs для кнопок текущей комнаты. */ -void pop_floor_bake(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - int yb = POP_YOFF + 63 * row; - uint8_t bw = bake_w(x, 60); /* обрезка по краю экрана — см. bake_w */ - /* Вторая страница — копией с первой (см. bake_copy). */ - if (bake_copy(&bake_pg[row * 10 + col], x, yb + 26, bw, 39)) return; - /* Пометку ставит сам pop_bar_black — по тому же прямоугольнику; отдельный - * pop_cd_touch тут был вторым вызовом на одну область (4 502 такта). */ - /* Wipe СВОЕЙ ячейки + правой грани (заходит в соседа) + перерисовка пола. - * НИЗ строго yb+64 (≈ низ передней грани пола): ниже — СТЕНА ряда ниже - * (высокий спрайт), которую тут не перерисовываем → иначе чёрный бар. */ - gfx_set_bank(GFX_BANK_NORMAL); - if (bw) pop_bar_black(x, yb + 26, bw, 39); - gfx_set_bank(GFX_BANK_TRANSPARENT); - /* ОКНО КЛИПА ЗДЕСЬ ОБЯЗАТЕЛЬНО — и не ради скорости. - * - * Без него draw_tile рисует тайлы ЦЕЛИКОМ, то есть пишет ШИРЕ бара, а - * bake_copy переносит на вторую страницу ровно бар — и всё, что легло вне - * него, на второй странице остаётся прежним. Страницы расходятся, и это - * видно как МЕРЦАНИЕ через кадр (найдено пользователем 2026-08-17: - * уровень 1, комната 6, Кид на кнопке (0,2) — дрожала нижняя грань - * переднего торца кнопки). С окном запечка и копия совпадают по - * построению. - * - * По скорости окно САМО ПО СЕБЕ убыточно, и это проверено трижды - * (179 914 -> 188 417): клипованный путь дороже быстрого на ~1 500 такта - * на каждом из 7,6 блитов, а режет он только редкие высокие куски. Но - * оно открывает копию второй страницы, а та экономит ~145 000 — так что - * пара «запечка + копия» всё равно вдвое дешевле двух запечек. - * - * Что бар покрывает ВСЁ изменившееся — это инвариант самого бара (иначе - * запечка не работала бы и без копии). */ - pop_t_win_set(x, yb + 26, bw, 39); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - draw_tile(row, col); - if (col + 1 < 10) draw_tile(row, col + 1); - pop_t_bake_rest = 0; - pop_t_win_clear(); - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_button_redraw(int row, int col) __banked { pop_floor_bake(row, col); } - -/* Перерисовать ПРАВУЮ половину двери уровня (в её ячейке рисуется створка, - * см. draw_leveldoor) на back-странице С ЗАПЕЧКОЙ в ОЗУ-копию: створка едет, - * а heal обязан возвращать её ТЕКУЩЕЕ положение, а не запечённое закрытое. - * Куски двери непрозрачные — wipe не нужен. */ -void pop_leveldoor_redraw(int row, int col) __banked -{ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Ворота ВНУТРИ комнаты: перерисовать бары по живому modif (порт draw_trob, - * seg007:01E6 — им заканчивается animate_door). (row,col) — сами ворота; - * решётку рисует ячейка ПРАВОГО соседа (draw_tile, ветка lcode==4), поэтому - * wipe и redraw идут по ней. Логика ровно как у левого шва - * (pop_room_redraw_seam_left), только колонка произвольная. - * - * Bar-в-чёрный обязателен: бары висят в видео-ОЗУ и ОЗУ-копии, и при - * ПОДЪЁМЕ решётки heal вернул бы запечённые нижние бары. Полоса — ровно - * зона решётки: от gate_top_y (dby−62 = 63*row+3) до низа (63*row+64); - * выше начинается ряд −1, ниже — стена ряда ниже. - * - * Ворота в col9: их бары рисуются уже в СОСЕДНЕЙ комнате, в отрисованной их - * не видно — оригинал такой trob тоже пропускает - * (get_trob_right_pos_in_drawn_room → 30). Для взгляда из комнаты справа - * работает pop_room_redraw_seam_left. */ -void pop_gate_redraw(int row, int col) __banked -{ - int x, yt; - if (col + 1 > 9 || row < 0 || row > 2) return; - x = POP_COL_XH[col + 1] * 8; - yt = POP_YOFF + 63 * row; - pop_bar_black(x, yt + 3, 32, 62); /* зеркалится сама (переворот) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(row, col + 1); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Запечь ПУСТОТУ на месте упавшего loose (текущая страница). Порт - * redraw_at_cur_mob (seg007:132C): перерисовать сам тайл (теперь empty) И - * тайл СПРАВА (его левая грань зависит от нашего кода: пока был loose — - * рисовал loose-правый-край pop_env_b(42); теперь пусто → чистая грань). - * pop_t_fg[pos] уже = 0 (pop_map). Чёрная плита (NORMAL) стирает старые - * пиксели пола в видео-ОЗУ + ОЗУ-копию, поверх — новый статич. фон. */ -void pop_loose_bake_empty(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* col+1 читаем ТОЛЬКО в границах массива: у последней колонки соседа нет, - * а POP_COL_XH[10] — чтение за концом (10 элементов). */ - int xr = (col + 1 < 10) ? POP_COL_XH[col + 1] * 8 : 0; - int yb = 63 * row + 46; - /* Чёрная плита (opaque NORMAL — пишет в VRAM И ОЗУ-копию акселератора): - * стирает ЗАПЕЧЁННЫЙ пиксель-в-пиксель loose-пол с обоих тайлов, иначе - * heal вернул бы старый пол из ОЗУ-копии. Ширина 40 — кусок пола - * заходит на x+32..+40. */ - /* НИЗ строго 63*row+65 = низ собственной графики плиты (bottom_id 43/73/74 - * стоит ровно на dby; base 41/69/70 — до dmy=62; правая грань 42/66/67 — - * до dby-1). Ниже начинается СТЕНА ряда ниже (высокий спрайт), которую - * здесь не перерисовываем: заливка на 9 строк глубже оставляла ЧЁРНЫЙ БОКС - * под соседним столбом, причём в ОЗУ-копии — то есть heal возвращал его - * снова, и на второй странице дабл-буфера его не было → мерцание. - * Тот же урок уже учтён в pop_floor_bake. */ - yb += POP_YOFF; - /* bar идёт мимо pop_blit_b — пометить область самим (DRAW-COST). */ - pop_cd_touch(x, yb, 72, POP_YOFF + 63 * row + 66 - yb); - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - if (bake_w(x, 40)) pop_bar_black(x, yb, bake_w(x, 40), POP_YOFF + 63 * row + 65 - yb + 1); /* сам тайл: +40 (кусок пола заходит вправо; сосед перерисуется) */ - if (col + 1 < 10) - if (bake_w(xr, 32)) pop_bar_black(xr, yb, bake_w(xr, 32), POP_YOFF + 63 * row + 65 - yb + 1); /* сосед: РОВНО 32 — не залезть в col+2 */ - /* Новый статич. фон: сам тайл (empty → «стена вниз» topright комнаты - * снизу) + правый сосед (его левая грань: был loose-край pop_env_b(42), - * теперь пусто). TRANSPARENT — 0xFF не забивает чёрный, пишет и в - * ОЗУ-копию → heal сохранит. */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - draw_tile(row, col); - if (col + 1 < 10) - draw_tile(row, col + 1); - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* ---- Падающий кусок loose (mob, seg007 move_loose) ------------------ * - * Упрощ. одиночный кусок (в комнате 1 — один loose). Модель fixed- - * corridor: коридор падения (колонка тайла) heal'ится каждый кадр (стирает - * прошлый кусок, возвращает печёный фон — empty+«стена вниз»), поверх — - * кадр 0 loose (41/42/43) на текущей y. Гравитация: speed 0→+3/кадр - * (cap 29), y+=speed. Двоебуфер: коридор фиксирован → heal чистит любой - * прошлый кадр ЭТОЙ страницы. Ниже поля кусок прячет clip_borders. */ -/* Падающие куски — ТАБЛИЦА (порт mobs[14]/mobs_count, seg007:965). Одного - * куска не хватает: в комнате 7 плиты (0,5) и (0,6) соседние, Kid роняет обе - * подряд, и второй спавн затирал состояние первого — его пиксели оставались - * висеть в воздухе (на каждой странице на своей y → мерцание), а щебень - * появлялся только под одной плитой. - * - * Слотов СТОЛЬКО ЖЕ, СКОЛЬКО В ОРИГИНАЛЕ (14). Было 4 с обоснованием - * «больше одновременно падающих плит в одной комнате практически не - * бывает» — неверным ровно с уровня 13: check_fall_flo роняет ШЕСТЬ разом - * (комнаты 23 и 16), а с учётом плит, которые эти куски сбивают по дороге - * (loose_fall), в воздухе бывает и больше. Лишний кусок молча терялся - * (`if (!m) return`), то есть тайл исчезал, а щебня на месте посадки не - * появлялось — найдено прогоном 2026-08-13, комната 16, тайл (1,5). - * Цена — 150 байт W2. */ -#define MOB_MAX 14 -typedef struct { - uint8_t active; /* 0 нет; 1 падает */ - uint8_t clean; /* кадров дочистки после конца полёта (2 = обе стр.) */ - uint8_t defer; /* кусок ниже Kid → рисуем ПОСЛЕ него (y-порядок) */ - int x; /* левый край (POP_COL_XH*8) */ - int y; /* = curmob.y оригинала (низ куска, dby), растёт вниз */ - /* Где кусок рисуется НА ЭКРАНЕ в этом кадре, MOB_Y_NONE = не рисуется. - * Отдельно от y, потому что кусок виден и из СОСЕДНЕЙ комнаты: порт - * draw_mob (seg007:13E5) сдвигает его на +192 (комната снизу) или на - * −189 (комната сверху). См. mob_tick_one. */ - int draw_y; - int prev_y[2]; /* последняя нарисованная y на КАЖДОЙ странице (heal) */ - int8_t speed; - int8_t row, col; /* тайл-позиция куска (для окклюзии соседа) */ - uint8_t room; /* curmob.room: кусок падает В СВОЕЙ комнате, не в текущей */ -} mob_t; -/* НЕ static намеренно: статики банкового модуля в карту символов не - * попадают, и разобрать зависший кадр по слотам (y каждого куска, порядок, - * defer) в отладчике нечем — адреса просто нет. Снято 2026-08-13 для - * разбора артефактов множественного падения; наружу таблица не объявлена и - * никем не читается. */ -mob_t mobs[MOB_MAX]; -/* Сколько кусков сейчас летит (active). Считает pop_loose_mob_tick. */ -static uint8_t mobs_live; - -/* Кусок «приземлился» (порт loose_land): 0 = нет, иначе tilepos+1 тайла, на - * который он лёг → приложение/pop_map ставит debris + do_knock. */ -/* pop_loose_landed переехал в pop_state.c: его читает pop_map (W1/W2), а - * писучие данные банкового модуля недоступны снаружи (см. pop_state.h). */ - -/* y_loose_land / y_something (seg007): [row+1], row = −1..3. Ряд −1 — - * плита-потолок (ряд 2 комнаты сверху): в оригинале это отрицательный - * tilepos, у нас — свой ряд полосы у потолка. */ -static const int16_t MOB_Y_LAND[5] = {2, 65, 128, 191, 254}; -static const int16_t MOB_Y_BOUND[5] = {-1, 62, 125, 188, 25}; -#define MOB_Y_NONE 0x7FFF - -/* Габарит падающего куска. Части и их места (порт draw_mob, seg007:13E5; - * индексы loose_fram_*[10], seg008:518/596/608): - * - * env 70 левая часть при (mob_x, mob_y-3) - * env 74 низ при (mob_x, mob_y) - * env 72 правая часть при (mob_x+32, mob_y-1) - * - * Размеры (сняты из каталогов атласов; РАСКЛАДКА env: page = id>>4, - * idx = id&15 — POP_ENV_SHIFT равен 4, не 5): - * - * оба тайлсета 70 = 32x13 74 = 32x3 - * 72 = 26x16 в подземелье, 25x16 во дворце - * - * Отсюда след: по x mob_x .. mob_x+57 (32+26−1), по y mob_y-16 .. mob_y - * (правая часть выше всех: 1+16−1). Именно эти числа и стоят в шапке - * mob_render — composite их пересчитывает сам и кладёт в шапку блоба. - * - * Коридор: MOB_X0 = mob_x при MOB_W = 64 даёт mob_x .. mob_x+63, то есть - * шесть пикселей запаса справа. Раньше было mob_x-4 при той же ширине - * (mob_x-4 .. mob_x+59): четыре пикселя слева, где кусок не рисует ничего, - * и всего два справа. Площадь та же, запас переехал туда, где он нужен. */ -#define MOB_X0(mx) (mx) -#define MOB_W 64 /* mob_x .. mob_x+63 */ -/* Коридор heal по высоте: mob_y-20 .. mob_y+3 при следе mob_y-18 .. mob_y. - * Уже НЕ сужать: 24 строки — это след подземелья (19) плюс две строки поля с - * каждой стороны. Сужение до 18 «по палаццовому следу» сломало бы - * подземелье. */ -/* Сами величины коридора — в mob_heal_up / mob_heal_h у начала файла: они - * считаются из высоты собранного композита, а не константами. */ - -/* Свободный слот = не летит И дочистка завершена (иначе затрём хвост, - * который ещё не стёрт со второй страницы). Общий для обычного отрыва и - * для копии из loose_fall — раньше цикл был написан дважды. */ -static mob_t *mob_alloc(void) -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) - if (!mobs[i].active && !mobs[i].clean) { - pop_mob_busy = 1; /* гейт холостого хода — см. pop_state.h */ - return &mobs[i]; - } - return 0; -} - -static void mob_spawn(uint8_t room, int row, int col) -{ - mob_t *m = mob_alloc(); - if (!m) return; /* таблица полна — кусок без спрайта (тайл всё равно пуст) */ - m->x = POP_COL_XH[col] * 8; - m->y = MOB_Y_LAND[row + 1]; /* y_loose_land: низ куска в момент отрыва */ - m->row = (int8_t)row; - m->col = (int8_t)col; - m->room = room; /* curmob.room (add_mob, seg007:1010) */ - m->speed = 0; - m->active = 1; - m->clean = 0; - m->defer = 0; - m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - m->draw_y = MOB_Y_NONE; -} - -/* Отрыв куска в ТЕКУЩЕЙ комнате (обычный случай — pop_loose_tick). */ -void pop_loose_mob_spawn(int row, int col) __banked -{ - mob_spawn(pop_t_room, row, col); -} - -/* Копия куска ОТ ПОЗИЦИИ УДАРА — порт хвоста loose_fall (seg007:1085): - * curmob.y += 6; mob_down_a_row(); add_mob(); - * то есть новый кусок заводится не из тайла, а из места, где его сбили: - * на 6 пикселей ниже и рядом ниже, со скоростью УЖЕ ПОДЕЛЁННОЙ пополам. - * Через границу комнаты — как mob_down_a_row: y −= 192, ряд 0, комната снизу. */ -static void mob_spawn_copy(const mob_t *src) -{ - mob_t *m; - int16_t y = (int16_t)(src->y + 6); - int8_t row = (int8_t)(src->row + 1); - uint8_t room = src->room; - - if (row >= 3) { - y = (int16_t)(y - 192); - row = 0; - room = pop_room_link(room, 3 /* вниз */); - if (!room) return; /* ушло из уровня — куску негде лететь */ - } - m = mob_alloc(); - if (!m) return; - m->x = src->x; - m->y = y; - m->row = row; - m->col = src->col; - m->room = room; - m->speed = src->speed; /* уже half (loose_fall делит ДО add_mob) */ - m->active = 1; - m->clean = 0; - m->defer = 0; - m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - m->draw_y = MOB_Y_NONE; - /* Кусок рождается ВНУТРИ mob_tick_one (loose_fall сбил плиту), и слот ему - * mob_alloc выдаёт с начала таблицы — то есть, скорее всего, УЖЕ - * пройденный циклом pop_loose_mob_tick. Своей пометки «фон трогали» этот - * кусок в текущем кадре не получит, а нарисован будет; помечаем коридор - * здесь — иначе персонаж под ним стирается и не просит перерисовки - * (см. pop_cd_mute в mob_render). */ - pop_cd_touch(MOB_X0(m->x), m->y - 27 + POP_YOFF, MOB_W, 64); -} - -/* Отрыв куска в ЧУЖОЙ комнате: плита, которую Кид расшатал и убежал, всё - * равно проваливается (animate_loose в pop_trob крутит её trob по своей - * комнате, как do_trobs оригинала). Летит и садится кусок дальше сам — - * mob_tick_one давно умеет чужую комнату (mob_tile_at / pop_loose_exit). */ -void pop_loose_mob_spawn_at(uint8_t room, int row, int col) __banked -{ - mob_spawn(room, row, col); -} - - -/* Остановить падающий кусок (при смене комнаты — состояние per-tile не - * должно утечь в новую комнату). */ -static void mob_render(mob_t *m, uint8_t pg); - -void pop_loose_mob_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) { - mobs[i].active = 0; mobs[i].clean = 0; mobs[i].defer = 0; - mobs[i].prev_y[0] = mobs[i].prev_y[1] = MOB_Y_NONE; - } -} - -/* Смена комнаты. Куски НЕ останавливаем: в оригинале mobs[] чистится только - * в start_level (seg003:88), а do_mobs (seg007:1063) крутит их все независимо - * от drawn_room — move_loose работает по curmob.room, и плита, за которой Кид - * не досмотрел, всё равно долетает и кладёт щебень (BUG-LOOSE-2: в комнате 12 - * плита 0,1 не успевала упасть до ухода в комнату 15). Сбросить надо только - * heal-историю: новая комната перерисована целиком, старых пикселей нет. */ -/* Соседи ОТРИСОВАННОЙ комнаты сверху/снизу — для draw_mob (см. mob_tick_one). - * Кэш, а не вызов каждый кадр: pop_room_link лезет в страницу уровня, то есть - * мапит и размапливает W0. Инвалидируется сменой комнаты. */ -static uint8_t mob_link_room, mob_link_up, mob_link_dn; - -void pop_loose_mob_qsave(pop_qs_io_t *io) __banked -{ - uint8_t i, live = 0; - for (i = 0; i < MOB_MAX; i++) { - mob_t *m = &mobs[i]; - pop_qs_u8(io, &m->active); - pop_qs_i16(io, &m->x); pop_qs_i16(io, &m->y); - pop_qs_i8(io, &m->speed); pop_qs_i8(io, &m->row); - pop_qs_i8(io, &m->col); pop_qs_u8(io, &m->room); - if (io->reading && io->apply) { - m->clean = m->defer = 0; - m->draw_y = m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - if (m->active) live++; - } - } - if (io->reading && io->apply) { - mobs_live = live; - pop_mob_busy = (uint8_t)(live != 0); - mob_link_room = 0; - } -} - -static void mob_links(void) -{ - if (mob_link_room == pop_t_room) return; - mob_link_room = pop_t_room; - mob_link_up = pop_room_link(pop_t_room, 2); - mob_link_dn = pop_room_link(pop_t_room, 3); -} - -void pop_loose_mob_room_changed(void) __banked -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) { - mobs[i].defer = 0; - mobs[i].prev_y[0] = mobs[i].prev_y[1] = MOB_Y_NONE; - mobs[i].draw_y = MOB_Y_NONE; - /* дочистка хвоста относилась к покинутой комнате — она уже не нужна */ - if (!mobs[i].active) mobs[i].clean = 0; - } - mob_link_room = 0; /* кэш соседей — под новую комнату */ -} - -/* Тайл под куском. В своей комнате — обычный tile_code (он знает про кромки - * и соседей), в чужой — прямо из данных уровня. */ -static uint8_t mob_tile_at(mob_t *m) -{ - if (m->room == pop_t_room) return (uint8_t)(pop_tile_code(m->row, m->col) & 0x1F); - if (m->row < 0 || m->row > 2 || m->col < 0 || m->col > 9) return 1; /* кромка = пол */ - return (uint8_t)(pop_level_tile(m->room, (uint8_t)(m->row * 10 + m->col)) & 0x1F); -} - -/* loose_fall (seg007:1082) — падающий кусок пробил ЕЩЁ ОДНУ расшатанную - * плиту. Порт дословный, три действия В ОДНОМ КАДРЕ: - * 1. налетевший кусок тормозится вдвое (`curmob.speed >>= 1`); - * 2. сбитый тайл снимается с карты немедленно (`remove_loose`); - * 3. на месте удара заводится ВТОРОЙ кусок — копия налетевшего, сдвинутая - * на 6 пикселей и ряд вниз (`curmob.y += 6; mob_down_a_row; add_mob`). - * То есть в столбце дальше летят ДВА куска, и это правильное поведение - * оригинала, а не дефект. - * - * Здесь стоял обходной путь: плите ставилась фаза «падает следующим кадром», - * а всю работу делал pop_loose_tick. Цена оценивалась как «один кадр - * задержки» и оказалась выше: защита «один сигнал pop_loose_fell на кадр» - * придерживает провал, пока главный цикл не разберёт предыдущий, и на 13-м - * уровне (плиты сыплются пачкой) вторая плита появлялась через несколько - * кадров — уже после того, как первая улетела с экрана, — да ещё и с высоты - * покоя тайла, а не от места удара (найдено прогоном 2026-08-13). */ -static void mob_break_loose(mob_t *m) -{ - m->speed >>= 1; - pop_loose_remove(m->room, (uint8_t)(m->row * 10 + m->col)); - mob_spawn_copy(m); -} - -static mob_t *mt_m; -static uint8_t mt_pg, mt_here; - -static void mob_tick_one(mob_t *m, uint8_t pg) -{ - /* Рабочие переменные — file-scope, не локали: у функции пять вызовов, и - * живой через них указатель на слот SDCC спиливал в кадр (16 байт, 99 - * обращений `-N(ix)`). То же лечение, что у draw_tile и blit_b_clip. - * Реентерабельности нет и не требуется: единственный вызывающий — - * pop_loose_mob_tick, и слоты он обходит последовательно. */ - mt_m = m; mt_pg = pg; - if (!mt_m->active && !mt_m->clean) return; - mt_m->draw_y = MOB_Y_NONE; /* по умолчанию не рисуемся; решим в конце */ - mt_here = (uint8_t)(mt_m->room == pop_t_room); - /* Стереть кусок, нарисованный на ЭТОЙ странице в прошлый раз (у каждой - * страницы своя копия фона). Раньше коридор был фиксирован под ряд 2; - * плита-потолок падает через весь ряд 0, поэтому чистим по фактической - * прошлой позиции. */ - /* Гейта по `mt_here` здесь БЫТЬ НЕ ДОЛЖНО: prev_y[mt_pg] — это след, который - * кусок оставил ИМЕННО НА ЭТОЙ странице, и стереть его надо независимо - * от того, где кусок сейчас. Пока чистка была под `mt_here`, кусок, - * улетевший в комнату снизу (mob_down_a_row), навсегда оставлял себя - * на одной из двух страниц дабл-буфера — «застрявшая плита», видимая - * через кадр (BUG-MOB-STALE-PAGE). */ - if (mt_m->prev_y[mt_pg] != MOB_Y_NONE) { - /* Ширина/высота — по СЛЕДУ, а не по спрайту. Спрайт куска целиком - * влезает в 64x32 (41: 32x13 с y-3, 42: 26x15 с x+32,y-1, 43: 32x3), - * но mob_render рисует ещё и ЦЕЛЫЙ соседний тайл поверх правой части - * (окклюзия грани пола), причём в GFX_BANK_SPRITE — то есть мимо - * теневой копии фона. Всё, что тот тайл нарисовал вне коридора - * heal'а, не стиралось никогда: кусок улетал, а в соседнем столбце - * оставался обрезок пола (найдено прогоном 2026-08-13). Коридор - * расширен до площади, которую реально может тронуть эта - * перерисовка: столбец соседа по ширине и ряд по высоте. - * - * ЗАДЕЛ: правильнее не перерисовывать соседа вовсе, а КЛИПОВАТЬ - * правую часть куска — оригинал так и делает (add_mob_to_objtable, - * seg007:1161: clip.right = 40). Тогда коридор вернётся к 64x32. */ - pop_heal_off(MOB_X0(mt_m->x), mt_m->prev_y[mt_pg] - mob_heal_up, MOB_W, mob_heal_h); - mt_m->prev_y[mt_pg] = MOB_Y_NONE; - } - if (!mt_m->active) { mt_m->clean--; return; } - /* гравитация (move_loose): ускорение до 29 */ - if (mt_m->speed < 29) mt_m->speed += 3; - mt_m->y += mt_m->speed; - /* move_loose (seg007:1126): низ куска пересёк границу своего ряда — - * смотрим тайл этого ряда. Пусто/loose — валится дальше, пол — - * приземление (loose_land: debris + do_knock). Через LOOSE кусок именно - * ПРОЛЕТАЕТ, как через пустоту, — но по дороге СРЫВАЕТ её (loose_fall, - * seg007:1082). - * - * Здесь раньше стояло «порт loose_fall не нужен: в ряду ниже её нет» — - * допущение, верное для уровней 1-11 и сломавшееся на 13-м: комната 16, - * плиты (1,6) и (1,7), на которые сверху сыплется гряда из комнаты 1. - * Куски пролетали сквозь них правильно, а сами плиты оставались целыми и - * нарисованными (найдено прогоном 2026-08-13). */ - if (mt_m->row < 3 && mt_m->y < 226 && MOB_Y_BOUND[mt_m->row + 1] <= mt_m->y) { - uint8_t t = mob_tile_at(mt_m); - if (t == 11) mob_break_loose(mt_m); - if (t == 0 || t == 11) { - /* mob_down_a_row (seg007:1387): ряд ниже, а из НИЖНЕГО ряда — - * в комнату СНИЗУ (y -= 192, ряд 0). Именно так кусок пролетает - * несколько комнат подряд: уровень 6, плита (1,7) комнаты 6 - * проваливается сквозь пустую шахту комнаты 7 и приземляется на - * кнопку (2,7) комнаты 11. Раньше мы кусок на границе комнаты - * ГАСИЛИ и подменяли одним «переходом вниз» из главного цикла — - * дальше первой комнаты он не летел (BUG-MOB-MULTIROOM). */ - mt_m->row++; - if (mt_m->row >= 3) { - mt_m->y = (int16_t)(mt_m->y - 192); - mt_m->row = 0; - mt_m->room = pop_room_link(mt_m->room, 3 /* вниз */); - if (!mt_m->room) { /* улетел из уровня — просто гаснет */ - mt_m->active = 0; mt_m->clean = 2; /* дочистить ОБЕ страницы */ - return; - } - mt_here = (uint8_t)(mt_m->room == pop_t_room); - } - } else if (!mt_here && pop_loose_exit) { - /* Сигнал прошлой посадки в чужой комнате ещё не разобран (он - * ОДИН на кадр) — держим кусок на границе ряда и садим следующим - * кадром, как это уже сделано для pop_loose_landed ниже. Без - * этого второй кусок затирал первый, и из нескольких плит, - * улетевших в одну дыру, щебень оставляла только одна (найдено - * прогоном 2026-08-13, уровень 13). */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - } else if (!mt_here) { - /* Приземление в ПОКИНУТОЙ комнате: рисовать нечего, но щебень и - * КНОПКА под куском обязаны сработать — сигналим главному циклу - * комнатой и тайлом (loose_land, seg007:11E8, работает с - * curmob.room, а не с отрисованной). */ - pop_sfx_play(2); /* tile crashing, seg007:1041 */ - pop_loose_exit_room = mt_m->room; - pop_loose_exit = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); - /* clean = 2 даже для чужой комнаты: пока кусок летел, он мог - * рисоваться в ЭТОЙ, и след остался на обеих страницах. */ - mt_m->active = 0; mt_m->clean = 2; - return; - } else if (pop_loose_landed) { - /* сигнал прошлого приземления ещё не разобран (один за кадр) — - * подержим кусок на границе и приземлим следующим кадром */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - } else { - pop_sfx_play(2); /* tile crashing, seg007:1041 */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - pop_loose_landed = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); - mt_m->active = 0; mt_m->clean = 2; /* кусок исчез — на его месте debris */ - return; - } - } - /* Страховка: кусок ушёл ниже поля, не поймав границу ряда (в норме этого - * не бывает — mob_down_a_row уводит его в комнату снизу). Просто гаснет, - * как у оригинала кусок в комнате 0 (move_loose: `speed = -2`). */ - if (mt_m->y - 27 >= POP_PLAYFIELD_H) { - mt_m->active = 0; mt_m->clean = 2; - return; - } - /* Порт ГОЛОВЫ draw_mob (seg007:13E5). Кусок виден НЕ ТОЛЬКО в своей - * комнате: оригинал рисует его ещё и когда он только что провалился в - * комнату СНИЗУ (пока |y| < 18 — со сдвигом +192, то есть выглядывает из - * нижней кромки) или летит в комнате СВЕРХУ и уже подошёл к её низу - * (y >= 174 — со сдвигом −189, вываливается из верхней кромки). - * - * Без этого плита, падающая из НИЖНЕГО ряда, исчезала мгновенно: она - * уходит в комнату снизу на ПЕРВОМ же move_loose (спавн y = 191 при - * границе ряда 188), и у нас после этого не рисовалась вовсе. Ряды 0 и 1 - * летят внутри комнаты, поэтому баг был виден только на ряду 2 — ровно - * как заметил пользователь (уровень 11, комната 14). */ - if (mt_here) { - if (mt_m->y >= 210) return; /* ниже поля — оригинал не рисует */ - mt_m->draw_y = mt_m->y; - } else { - mob_links(); - if (mt_m->room == mob_link_dn) { - int8_t yb = (int8_t)mt_m->y; /* ABS((sbyte)ypos) < 18 */ - if (yb >= 18 || yb <= -18) return; - mt_m->draw_y = mt_m->y + 192; - } else if (mt_m->room == mob_link_up) { - if (mt_m->y < 174) return; - mt_m->draw_y = mt_m->y - 189; - } else { - return; /* дальше соседей не рисуем */ - } - } - /* Порядок «плита vs Kid». В оригинале объекты рисуются при обходе СВОИХ - * тайлов (redraw_needed_tiles: ряды 2,1,0; колонки 0..9), и только внутри - * ОДНОГО тайла сортируются по obj_y (sort_curr_objs, seg008:1561: кто - * ниже — тот позже, т.е. поверх). Тайл падающего куска — draw_mob - * (seg007:13E5): row = y_to_row_mod4(y), col = xh>>2. Значит кусок - * поверх Kid, если его тайл идёт в обходе ПОЗЖЕ тайла Kid, а при - * совпадении тайлов — если он ниже по y. */ - { - int8_t mrow = pop_y_to_row((int16_t)mt_m->draw_y); /* y_to_row_mod4 */ - uint8_t over; - if (mrow < 0 || mrow > 2) { - /* КОРЗИНА 30 (get_tilepos_nominus, seg006:110). Ряд объекта вне - * комнаты: y_to_row_mod4 берёт остаток по 4, поэтому «выше - * потолка» и «ниже пола» дают одно и то же −1, а оригинал сводит - * оба в тайл 30. Объекты этого тайла рисуются ПЕРВЫМИ — - * draw_objtable_items_at_tile(30) стоит в redraw_needed_tiles до - * всего обхода тайлов. Значит кусок под ВСЕМ, включая Кида; до - * сих пор сравнение рядов давало обратное («−1 обходится - * последним» = поверх). */ - over = 0; - } - else if (mrow != pop_bg_obj_row) over = (mrow < pop_bg_obj_row); /* ряды идут 2,1,0 */ - else if (mt_m->col != pop_bg_obj_col) over = (mt_m->col > pop_bg_obj_col); - else over = (mt_m->draw_y > pop_cd[POP_CH_KID].fpy); - /* РИСОВАНИЯ ЗДЕСЬ БОЛЬШЕ НЕТ — только решение, в какой проход кусок - * пойдёт. Пока heal и вывод шли в одной итерации, heal СЛЕДУЮЩЕГО - * куска срезал верхнюю кромку уже нарисованного предыдущего: на 13-м - * уровне куски идут лесенкой в соседних столбцах с разницей ~20 px - * по y, и перекрытие гарантировано (артефакт «чёрный бар», найден - * прогоном 2026-08-13, комната 23). Теперь сперва тикают ВСЕ куски - * (то есть heal'ятся все), и только потом рисуются. */ - mt_m->defer = over; - } -} - -/* Один проход отрисовки кусков. want_defer: 0 — те, что под Kid (идут сразу - * после фона), 1 — те, что поверх него (после персонажей). - * - * Порядок внутри прохода — ПО y, но ПО УБЫВАНИЮ: сперва нижние, последним - * верхний. Это НЕ описка и не общее правило «ниже = поверх»: сравнение двух - * объектов в оригинале (compare_curr_objs, seg008:1572) разводит два случая, - * - * оба объекта — падающие плиты (тип 0x80): y1 < y2 → по УБЫВАНИЮ - * любая другая пара: y1 > y2 → по возрастанию - * - * то есть между СОБОЙ куски укладываются наоборот, чем всё остальное: верхний - * ложится поверх нижнего. Видно на паре из loose_fall (сбитая плита летит в - * 6 пикселях под налетевшей): при общем правиле нижняя перекрывала верхнюю, - * и это поймал прогон 2026-08-13. - * - * Порядок «кусок против Кида» здесь ни при чём — его решает defer выше, и там - * действует обычное правило. */ -/* Пометки СОСЕДА СПРАВА — порт draw_mob (seg007:1147). Оригинал каждый - * кадр помечает тайл col+1 в ряду куска сразу двумя пометками: - * - * set_redraw2(tilepos, 1); // фон соседа — рисуется ДО куска - * set_redraw_fore(tilepos, 1); // его передние части — ПОСЛЕ куска - * - * и повторяет их для второго ряда, если кусок висит на границе (ypos-18). - * Так правая часть куска (спрайт 72 лежит в столбце col+1) прячется за - * передней гранью соседнего пола, а передние части чужого тайла — колонна, - * например, — ложатся поверх куска. - * - * Здесь была подпорка: целый соседний тайл рисовался ПОВЕРХ куска прямо в - * mob_render. Она тащила на плиту чужой узор и окно и стоила по полной - * отрисовке тайла на кусок за кадр (MOB-CLIP-RIGHT). */ -static void mob_mark_neighbour(const mob_t *m) -{ - int8_t r = pop_y_to_row((int16_t)m->draw_y); - int8_t rt = pop_y_to_row((int16_t)(m->draw_y - 18)); - int8_t c = (int8_t)(m->col + 1); - /* ПОЛОСА У ПОТОЛКА (ряд −1). Её передние куски (нижняя кромка потолка и - * кадр плиты-потолка) живут в трёх верхних строках поля — dby = 2 при - * клипе по POP_YOFF, — а спрайт куска занимает mob_y−16 .. mob_y. Значит - * кусок закрывает кромку, пока mob_y − 16 <= 2, то есть mob_y <= 18: три - * кадра после отрыва (y = 2, 5, 11 при ускорении 3). Помечаем ОБА - * столбца, которые кусок накрывает по x (mob_x .. mob_x+62 — это col и - * col+1). - * - * Без этого кусок оказывался ПОВЕРХ кромки потолка соседней колонки — - * физически невозможно (найдено пользователем 2026-08-17, ур.1 к.6: - * плита (−1,5) перекрывала потолок (−1,6)). В оригинале порядок даёт - * сама структура таблиц: кусок идёт в midtable (draw_mobs), а полоса - * потолка — в foretable, и та рисуется позже (draw_tables, seg008:1373). */ - if (m->draw_y <= 18) { - /* Пустой тайл полосы потолка не рисует В ПЕРЕДНЕМ СЛОЕ ничего - * (bottom_id = 0, FORE_ANY = 0), а пометка стоит потом двух трамплинов - * — в банк 7 за разбором пометок и в банк 2 за самой отрисовкой, - * ~8 900 такта каждый. А пустой он тут как раз чаще всего: кусок - * существует ровно потому, что плита из своей клетки уже выпала. - * Проверяем pop_tile_code — он резидентный, ~1 100 такта. */ - if (pop_tile_code(-1, m->col)) - pop_set_redraw_fore_above((uint8_t)m->col); - if (m->col + 1 <= 9 && pop_tile_code(-1, m->col + 1)) - pop_set_redraw_fore_above((uint8_t)(m->col + 1)); - } - if (c > 9) return; - if (r >= 0 && r <= 2) pop_set_redraw_fore((uint8_t)(r * 10 + c)); - if (rt != r && rt >= 0 && rt <= 2) pop_set_redraw_fore((uint8_t)(rt * 10 + c)); -} - -/* Вторая половина draw_mob (seg007:1149): рядом с set_redraw_fore там стоит - * set_redraw2, то есть draw_other_overlay соседнего тайла — его части уходят в - * midtable и ложатся ПОВЕРХ куска (порядок разобран в pop_mob_overlay_tile). - * Звать СРАЗУ после mob_render: списков у нас нет, порядок эмулируется - * последовательностью вызовов. */ -static void mob_overlay_neighbour(const mob_t *m) -{ - int8_t r = pop_y_to_row((int16_t)m->draw_y); - int8_t rt = pop_y_to_row((int16_t)(m->draw_y - 18)); - /* КОРЗИНА 30 оригинала (get_tilepos_nominus, seg006:110): ряд объекта вне - * комнаты. y_to_row_mod4 берёт остаток по 4, поэтому «выше потолка» и - * «ниже пола» дают одно и то же −1 — оригинал сводит оба случая в тайл 30 - * и рисует такие объекты ПЕРВЫМИ, до всего обхода тайлов - * (draw_objtable_items_at_tile(30) в redraw_needed_tiles). - * - * Отсюда два отличия от обычного куска: - * - ориентир «тайл объекта» = 3, то есть РАНЬШЕ любого ряда обхода - * (2,1,0). Сюда уходил сырой −1, и гейт other_overlay_tile - * `row > pop_bg_obj_row` читал его наоборот — «объект поверх всего» — - * и соседа не возвращал вовсе (тело плиты пропадало, оставался - * только её торец из переднего слоя); - * - перекрыть кусок должна и СВОЯ клетка, а не только сосед справа: - * после объекта у оригинала рисуются ВСЕ тайлы. У куска в обычном - * ряду своя клетка не перерисовывается — там объект вливается в - * midtable уже ПОСЛЕ частей своего тайла. */ - uint8_t b30 = (uint8_t)(r < 0 || r > 2); - int8_t oref = b30 ? (int8_t)3 : r; - int8_t c, cend = (int8_t)(m->col + 1); - int ytop, ybot; - if (cend > 9) cend = 9; - /* Габарит куска — по ЭКРАННОЙ координате: у куска, видимого из соседней - * комнаты, draw_y отличается от y на 192. */ - ytop = m->draw_y - (int)mob_spr[2] + 1; - ybot = m->draw_y; - /* ПРЕДУСЛОВИЯ ПРОВЕРЯЕМ ЗДЕСЬ, до вызова в банк 2. pop_mob_overlay_tile - * живёт в банке 2, то есть каждый вызов из банка 7 платит межбанковый - * трамплин (~8 900 такта); а условий всего два — тайл не пуст и габарит - * тайла пересекается с габаритом куска. Оба дешёвые: pop_tile_code — - * резидент (~1 100). Замер 2026-08-17: без этого гейта двенадцать - * вызовов на шесть кусков стоили ~130 000 в циане, причём большинство - * ничего не рисовало. - * - * Габарит тайла берём ПОЛНЫМ (63*row+2 .. +66) — какая именно часть - * соседа окажется поверх куска, решит уже окно клипа внутри. */ - for (c = b30 ? (int8_t)m->col : cend; c <= cend; c++) { - if (c < 0) continue; - if (r >= 0 && r <= 2 && pop_tile_code(r, c) && - ybot >= 63 * r + 2 && ytop <= 63 * r + 66) - pop_mob_overlay_tile(r, c, oref, (int8_t)m->col, m->x, m->draw_y, mob_spr[2]); - if (rt != r && rt >= 0 && rt <= 2 && pop_tile_code(rt, c) && - ybot >= 63 * rt + 2 && ytop <= 63 * rt + 66) - pop_mob_overlay_tile(rt, c, oref, (int8_t)m->col, m->x, m->draw_y, mob_spr[2]); - } -} - -static void mob_draw_pass(uint8_t pg, uint8_t want_defer) -{ - uint8_t order[MOB_MAX], n = 0, i, j; - /* Ранний выход: проход зовётся ДВАЖДЫ за кадр (под Kid и поверх него), и - * без него мы перебирали бы все MOB_MAX слотов 28 раз в кадре даже - * когда в воздухе пусто. Счётчик ведёт тик, которому проход по слотам - * нужен и так. */ - if (!mobs_live) return; - for (i = 0; i < MOB_MAX; i++) { - mob_t *m = &mobs[i]; - /* Отбор по draw_y, а НЕ по комнате: кусок, только что провалившийся - * в комнату снизу, ещё виден из нашей (см. mob_tick_one). */ - if (!m->active || m->draw_y == MOB_Y_NONE) continue; - if ((uint8_t)(m->defer != 0) != want_defer) continue; - for (j = n; j > 0 && mobs[order[j - 1]].draw_y < m->draw_y; j--) - order[j] = order[j - 1]; - order[j] = i; - n++; - } - for (i = 0; i < n; i++) { - /* Пометки соседа ставятся ЗДЕСЬ, а не в тике: у оригинала draw_mob - * (seg007:1147) считает ряд от той же координаты, по которой кусок - * рисуется. Стояли они в цикле тика — то есть по позиции ДО - * mob_tick_one, а рисовался кусок уже по новой. Пока он летит - * внутри ряда, старый и новый тайл совпадают и разницы не видно; но - * в кадр пересечения границы пометка указывала на прежний тайл, и - * передняя часть колонны кусок не перекрывала — ровно ОДИН кадр, - * как и наблюдалось (прогон 2026-08-13, комната 23, колонка 8). */ - mob_mark_neighbour(&mobs[order[i]]); - mob_render(&mobs[order[i]], pg); - mob_overlay_neighbour(&mobs[order[i]]); - } -} - -void pop_loose_mob_tick(void) __banked -{ - uint8_t pg = gfx_get_draw_page() & 1, i, live = 0, busy = 0; - /* Слоты обходим УКАЗАТЕЛЕМ и пустые отсеиваем ЗДЕСЬ, а не внутри - * mob_tick_one. Индексная запись mobs[i] заставляла SDCC умножать i на - * sizeof(mob_t)=15 заново под каждое поле (.active/.clean/.x/.y), и 14 - * пустых слотов стоили 35 790 тактов в кадре, где не падает НИЧЕГО - * (замер 2026-08-13). Гард в самом mob_tick_one оставлен: функция - * зовётся и из других мест. */ - mob_t *m = mobs; - /* Ни одного занятого слота — обходить 14 штук незачем (замер 11/15: - * 12 090 тактов холостого хода). Гейт снимается ниже, по факту прохода, - * в котором не осталось ни active, ни дочистки. */ - if (!pop_mob_busy) return; - /* Пометки всех кусков — ОДНИМ пакетом: настоящий pop_cd_touch стоит 4 502 - * такта (замер 2026-08-17), а кусков в кадре каскада шесть. В пакете они - * копят общий прямоугольник четырьмя сравнениями, и настоящая пометка одна. - * - * Загрубление осознанное: объединение шести коридоров накрывает и ряды - * между ними. Безопасно в одну сторону — лишняя пометка стоит лишней - * перерисовки персонажа, пропущенная стоит ИСЧЕЗНУВШЕГО персонажа. - * Практически гряда идёт по колонкам 2..7, а Кид от неё убегает — на - * замерах разницы в числе перерисовок нет. */ - pop_cd_batch_begin(); - for (i = 0; i < MOB_MAX; i++, m++) { - /* Летящий кусок и его дочистка ходят по чужим пикселям СВОИМ heal'ом, - * мимо pop_blit_b — пока он в кадре, персонажей пропускать нельзя - * (DRAW-COST). Взводим ДО тика: кусок может исчезнуть прямо в нём, а - * стереть себя ему всё равно надо будет. */ - if (!m->active && !m->clean) continue; /* пустой слот — ни адреса, ни вызова */ - /* Метка «фон трогали вот здесь» обязана покрывать ВЕСЬ коридор - * heal'а, а не габарит спрайта. Иначе персонаж, попавший в - * расширенную часть коридора, стирается heal'ом, но перерисовать - * себя не просит (pop_char_skip_mask его пропускает) — и просто - * исчезает с экрана. Ровно это и случилось, когда коридор - * расширили под транзитную перерисовку соседа (прогон - * 2026-08-13: в комнате 23 после падения гряды пропадал Кид). - * Запас сверху — на путь, пройденный за кадр (speed до 29): heal - * стирает ПРОШЛУЮ позицию, она выше текущей. */ - pop_cd_touch(MOB_X0(m->x), m->y - 27 + POP_YOFF, MOB_W, 64); - /* ...и по ПРОШЛОЙ нарисованной позиции: у куска, видимого из соседней - * комнаты, экранная координата отличается от y на 192 — коридор heal'а - * лежит совсем не там, где коридор по y. В пакете это четыре - * сравнения, настоящая пометка всё равно одна. */ - if (m->room != pop_t_room && m->prev_y[pg] != MOB_Y_NONE) - pop_cd_touch(MOB_X0(m->x), m->prev_y[pg] - 27 + POP_YOFF, MOB_W, 64); - mob_tick_one(m, pg); - if (m->active) live++; - if (m->active || m->clean) busy++; /* слот ещё занят — гейт держим */ - } - pop_cd_batch_end(); - mobs_live = live; - pop_mob_busy = busy; -} - -static void mob_render(mob_t *m, uint8_t pg) -{ - /* Падающий кусок (SDLPoP draw_mobs/add_midtable, case 0x80): ТРИ куска — - * left(41) на obj_y-3, bottom(43) на obj_y, right(42) на obj_x+4 (=col+1, - * заходит в тайл СПРАВА) на obj_y-1. */ - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* КЛИПА ОБЪЕКТА ЗДЕСЬ НЕТ. У оригинала он есть — add_mob_to_objtable - * (seg007:1161) ставит куску clip.right = 40, — но единицы этого поля я - * НЕ выяснил: буквальные 40 экранных пикселей срезают правый задний угол - * плиты (прогон 2026-08-13). У оригинала obj_x живёт в удвоенных - * единицах (char_x_left = obj_x / 2 + 58), так что 40 может означать и - * не пиксели. До выяснения рисуем кусок целиком. - * - * Подпорки «перерисовать соседний тайл поверх куска» тоже нет: она тащила - * на плиту чужой узор и окно (MOB-CLIP-RIGHT). Цена отказа — правая - * грань куска не прячется за передней гранью соседнего пола; артефакт - * мельче прежнего и уйдёт вместе с сортируемым midtable. */ - /* Спрайты ПАДАЮЩЕГО куска, а не лежащей плиты. У объекта в objtable - * obj_id = 10 (add_mob_to_objtable, seg007:1170), и три части берутся из - * таблиц по этому индексу (seg008:518/596/608): - * loose_fram_left[10] = 70 при (x, y-3) - * loose_fram_bottom[10] = 74 при (x, y) - * loose_fram_right[10] = 72 при (x+32, y-1) - * Здесь стояли 41/43/42 — это индекс 0, то есть плита В ПОКОЕ. Отсюда и - * «цельная ровная плита» вместо двух частей со сдвигом правой половины - * на пиксель (замечено пользователем 2026-08-13 сравнением с оригиналом). - * Габариты частей — в блоке MOB_X0 выше (правая часть у тайлсетов - * РАЗНАЯ: 26 px в подземелье, 25 во дворце). - * - * Рисуем ОДНИМ блитом по композиту (mob_spr_build): три вызова блита - * стоили 258 708 такта в кадре при шести кусках — больше половины - * цианового блока. Три отдельных блита остались резервным путём на - * случай, если композит не собрался. */ - /* Пометки «фон трогали» на время блитов ПОДАВЛЕНЫ: коридор куска - * (MOB_X0 .. +MOB_W, y−27 .. +37) уже помечен ОДНИМ вызовом — из - * pop_loose_mob_tick для летящих кусков и из mob_spawn_copy для куска, - * рождённого внутри тика. Спрайт целиком внутри коридора: по x он - * занимает m->x .. m->x+57, по y m->y−16 .. m->y, коридор — m->x .. - * m->x+63 и m->y−27 .. m->y+37 (запас на ускорение, speed ≤ 31 за кадр). - * Замер 2026-08-17: три настоящих pop_cd_touch стоили 13 506 тактов на - * кусок, то есть 81 000 в кадре при шести кусках. */ - pop_cd_mute(); - /* ВЫХОД ЗА ПОЛЕ РЕЖЕМ САМИ, а не чистим борта после. Раньше здесь стоял - * pop_clip_sprite, то есть кусок рисовался в борт целиком, взводил - * border_dirty, и pop_room_clip_borders потом стирал ДВЕ полосы во всю - * ширину экрана — 320x28 и 320x28. Замер 2026-08-17: 150 978 тактов в - * КАЖДОМ кадре, пока хоть один кусок торчит выше поля, то есть почти весь - * каскад (гряда на 13-м рождается ровно у потолка, y = 2). Это была - * четверть цианового блока. - * - * Окно ставим только когда кусок реально задевает борт: внутри поля блиты - * идут быстрым путём (10 422 против 14 088). */ - { - int ytop = m->draw_y - 16 + POP_YOFF, ybot = m->draw_y + POP_YOFF; - uint8_t clipped = (uint8_t)(ytop < POP_YOFF || ybot >= POP_CLIP_BOTTOM); - if (clipped) pop_t_win_set(0, POP_YOFF, 320, POP_PLAYFIELD_H); - if (mob_spr_ok) { - pop_mem_b(mob_spr, m->x, m->draw_y); - } else { - pop_env_b(74, m->x, m->draw_y); - pop_env_b(70, m->x, m->draw_y - 3); - pop_env_b(72, m->x + 32, m->draw_y - 1); - } - if (clipped) pop_t_win_clear(); - } - pop_cd_unmute(); - m->prev_y[pg] = m->draw_y; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Отрисовка кусков, идущих ПОД Kid. Звать ПОСЛЕ pop_redraw_needed(): фон - * кадра обязан быть полностью готов до любого спрайта. - * - * Раньше куски рисовались внутри pop_loose_mob_tick, то есть ДО разбора - * пометок перерисовки, и перепечатка тайла ложилась поверх уже нарисованного - * куска — окно задней стены, передняя грань пола (найдено прогоном - * 2026-08-13, комнаты 16 и 23). */ -void pop_loose_mob_draw(void) __banked -{ - mob_draw_pass(gfx_get_draw_page() & 1, 0); -} - -/* Отложенная отрисовка куска ПОВЕРХ Kid (он ниже Kid по obj_y). Звать - * после отрисовки персонажей, до fore-слоя. */ -void pop_loose_mob_draw_over(void) __banked -{ - mob_draw_pass(gfx_get_draw_page() & 1, 1); -} - -/* Позиция падающего куска для check_loose_fall_on_kid (pop_map): колонка и - * y (низ куска). 0 — куска нет. */ -uint8_t pop_loose_mob_pos(int *col, int *y) __banked -{ - uint8_t i; - /* check_loose_fall_on_kid (seg007:1192) начинается с Char.room == - * curmob.room: кусок, падающий в покинутой комнате, Киду по голове не - * бьёт. */ - for (i = 0; i < MOB_MAX; i++) - if (mobs[i].active && mobs[i].room == pop_t_room) { - *col = mobs[i].col; *y = mobs[i].y; return 1; - } - return 0; -} - -/* Спрайт вышел за поле? → взвести флаг на 2 кадра (обе страницы дабл- - * буфера). Узкий per-спрайт heal НЕ используем: accel-выравнивание блока - * оставляет 1–2px слайверы правой грани → на одной странице мерцает. - * Вместо этого борта чистит pop_room_clip_borders (полоса, но ТОЛЬКО в - * кадрах падения — гейт по флагу). */ -static uint8_t border_dirty; - -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked -{ - int sy_bot = sy_top + h; - (void)x; (void)w; - if (sy_bot > POP_CLIP_BOTTOM || sy_top < POP_YOFF) - border_dirty = 2; /* 2 кадра = обе страницы */ -} - -/* Клип бортов (см. pop_bg.h): работает ТОЛЬКО пока border_dirty (кто-то - * вышел за поле в последние 2 кадра) — иначе ноль стоимости. Возвращает - * чёрный из ОЗУ-копии (вне поля она чёрная) в верхний борт и статус-полосу - * + нижний борт. Звать КАЖДЫЙ кадр ПОСЛЕ всей отрисовки спрайтов. */ -void pop_room_clip_borders(void) __banked -{ - if (!border_dirty) return; - border_dirty--; - /* ОСТАЁТСЯ клипающим осознанно (CLIP-1, 2026-08-01): полоса шириной 320 - * не лезет в 8-битный параметр noclip-ядра, а разбивать её на два куска - * по 160 нет смысла — гейт border_dirty пускает сюда только в кадрах - * падения/выхода за поле, и выигрыш (~2×5.6 К тактов подготовки) там - * тонет в цене самих 320×28 пикселей. Не «оптимизировать» повторно. */ - gfx_heal(0, 0, 320, POP_YOFF); /* верхний борт */ - gfx_heal(0, POP_CLIP_BOTTOM, 320, 256 - POP_CLIP_BOTTOM);/* статус-полоса + нижний борт */ -} - -void pop_room_draw(uint8_t room_num, - const uint8_t *fg, const uint8_t *bg, - const uint8_t *lcol_fg, const uint8_t *lcol_bg) __banked -{ - int row, col; - pop_t_room = room_num; - pop_wall_pattern_reset_b(); /* кэш кладки привязан к номеру комнаты */ - pop_t_fg = fg; pop_t_bg = bg; - pop_t_lfg = lcol_fg; pop_t_lbg = lcol_bg; - - /* прозрачный блит: 0xFF не пишется (чёрный фон/нижние слои проступают) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - for (row = 2; row >= 0; row--) /* снизу вверх (2,1,0) */ - for (col = 0; col < 10; col++) - draw_tile(row, col); - /* Полоса кладки у потолка (seg008 draw_room: доп. ряд из room_A, row2 - * при draw_main_y=-1): нижние/правые грани ряда 2 комнаты сверху. Кадры - * высокие — верх ушёл бы в борт (за поле); клип по верхней границе поля - * (POP_YOFF) рисует ТОЛЬКО срез у потолка, без зачернения борта. */ - pop_t_clip_top = POP_YOFF; - for (col = 0; col < 10; col++) - draw_tile(-1, col); - pop_t_clip_top = 0; - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} diff --git a/applications/PoP/roomtest/pop_settings.h b/applications/PoP/roomtest/pop_settings.h deleted file mode 100644 index bd2889e..0000000 --- a/applications/PoP/roomtest/pop_settings.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * pop_settings.h — рантайм-настройки игры (план docs/menu_settings_plan.md - * §5, этап MS0). Единственный контракт между UI/файлом настроек и игрой: - * gameplay-код читает значения, но не знает про UI-структуры и POP.CFG. - * - * Экран Settings и загрузчик POP.CFG уже используют эти поля; начальные - * значения ставит pop_settings_defaults() из pop_boot() (crt0 зануляет - * _DATA, поэтому ненулевые дефолты литералами в данных запрещены). - */ -#ifndef POP_SETTINGS_H -#define POP_SETTINGS_H - -#include - -typedef enum { - POP_PROFILE_VANILLA = 0, /* текущее поведение roomtest (план §1) */ - POP_PROFILE_ENHANCED = 1 /* будущий набор fixes (план §12) */ -} pop_gameplay_profile_t; - -typedef struct { - uint8_t sound_enabled; /* 0/1 — зеркало звука (Ctrl+S / pop_sfx) */ - uint8_t music_enabled; /* 0/1 — зеркало музыки (Ctrl+M / pop_mus_want) */ - uint8_t speed_mode; /* POP_SPEED_* (pop_pace.h), 0..2 */ - uint8_t gameplay_profile; /* pop_gameplay_profile_t */ - uint8_t cheats_enabled; /* 0/1 — активны ли чит-клавиши */ - uint8_t show_build_info; /* 0/1 — build info на title (этап MS8) */ - uint16_t enhancement_flags; /* маска будущего ENHANCED (план §12) */ - uint8_t time_limit_enabled;/* 0/1 — 60-минутный лимит / unlimited */ - uint8_t show_debug_bar; /* 0/1 — отладочная полоса в верхнем борте */ -} pop_settings_t; - -extern pop_settings_t pop_settings; -void pop_settings_defaults(void) __banked; - -/* Применить модель к runtime-владельцам (темп, читы, звук). До окончания - * pop_sfx_init() sound_ready=0: звук применится отдельным вызовом после - * инициализации набора. */ -void pop_settings_apply(uint8_t sound_ready) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_sfx.c b/applications/PoP/roomtest/pop_sfx.c deleted file mode 100644 index 0afa57c..0000000 --- a/applications/PoP/roomtest/pop_sfx.c +++ /dev/null @@ -1,310 +0,0 @@ -/* - * pop_sfx.c — ГОРЯЧАЯ часть звуковых эффектов: насос в прерывании CBL, - * запуск/останов и таблица звуков. Зачем всё это и в каком виде лежат - * данные — в шапке pop_sfx.h и ../docs/sound_plan.md. - * - * ПОЧЕМУ МОДУЛЬ РЕЗИДЕНТНЫЙ (в EXTRA_SRCS, а не в банке). Три причины, - * и каждой хватило бы одной: - * - callback насоса зовётся ИЗ ПРЕРЫВАНИЯ; трамплин перед вызовом - * ставит базовую страницу W1, значит хендлер обязан быть в базе; - * - pop_sfx_play дёргается из горячих мест (play_seq на каждый шаг - * Кида, физика, боёвка) — трамплин там был бы чистой потерей; - * Файловое чтение страниц выполняет общий резидентный bank_load_file(). - * Холодная половина (аллокация страниц, cbl_open) — в pop_sfx_cold.c. - */ - -#include -#include -#include -#include -#include -#include /* IRQ_DISABLE/IRQ_ENABLE вокруг курсора */ -#include "pop_sfx.h" -#include "pop_music.h" -#include "_pop_sfx.h" - -/* Физические страницы набора; заполняет холодная половина. */ -uint8_t pop_snd_page[POP_SND_PAGES]; -uint8_t pop_snd_ok; - -/* ХОЧЕТ ЛИ ЗВУКА ПОЛЬЗОВАТЕЛЬ (Ctrl+S) — отдельно от pop_snd_ok. - * - * Разделять обязательно: pop_snd_ok значит «CBL сейчас открыт», и его - * гасит служебная пауза на время загрузки уровня. Если бы Ctrl+S правил - * только его, то первая же смена уровня позвала бы pop_sfx_start() и - * вернула звук, который пользователь выключил. Поэтому start уважает - * этот флаг, а pause его не трогает. - * - * Живёт в резиденте, а не в банке: метку в борте рисует отладочный ярлык - * каждый кадр, и тащить ради одного байта трамплин незачем. */ -uint8_t pop_snd_want; - -/* Курсор проигрывания. volatile: пишет главный цикл, читает прерывание. - * Всё в 8/16 бит — 32-битной арифметики на Z80 избегаем (см. memory - * avoid_32bit_arith_z80); поэтому и в таблице смещение уже разобрано на - * страницу и адрес в окне. */ -/* Курсор МУЗЫКИ. Лежит здесь, а не в pop_music.c, по той же причине, что - * и курсор эффектов: его читает насос из прерывания, то есть резидент. */ -volatile uint8_t pop_mus_pg; -volatile uint16_t pop_mus_ptr; -volatile uint16_t pop_mus_left; -/* Номер играющего трека в нумерации ОРИГИНАЛА: музыка участвует в тех же - * таблицах приоритета и перебиваемости, что и эффекты (см. pop_sfx_tick). */ -uint8_t pop_mus_id; - -/* Тик насоса: +1 на каждый отданный CBL блок, то есть 85,4 Гц. */ -volatile uint8_t pop_snd_tick; - -/* Размер КОЛЬЦА страниц для потоковой музыки, 0 — обычный трек целиком в - * памяти. Читает насос, ставит загрузчик (pop_music.c). */ -uint8_t pop_mus_ring; - -/* Заявка на музыкальный трек: номер в нумерации оригинала, 0 — нет заявки - * (нулевого трека не бывает). Ставит pop_sfx_play, снимает главный цикл. */ -uint8_t pop_mus_req; - -/* ХОЧЕТ ЛИ ПОЛЬЗОВАТЕЛЬ МУЗЫКУ (Settings / Ctrl+M) — отдельно от звука. - * Оригинал такого разделения не знал (там один тумблер на всё), но у нас - * музыка это ПОТОК С ДИСКА: кому мешает подкачка или просто не нужен - * саундтрек, гасит её, не теряя эффектов. */ -uint8_t pop_mus_want; - -static volatile uint8_t sfx_pg; /* индекс в pop_snd_page[] */ -static volatile uint16_t sfx_ptr; /* адрес в окне W0: 0x0000..0x3FFF */ -static volatile uint16_t sfx_left; /* сколько байт осталось (кратно 128) */ - -/* ---- насос ---------------------------------------------------------- * - * Зовётся из ISR CBL раз в ~11,7 мс за очередными 128 байтами. - * - * ОКНО БЕРЁМ ВЗАЙМЫ У W3, А НЕ У W0 — и это принципиально. - * - * Раньше насос занимал W0. Оказалось, что так звук рвёт ЛЮБОЙ вызов - * BIOS: `rst 8` — это `out ($7C),a`, который включает системное ПЗУ и - * перестраивает окно 0 (в MAME это update_memory: m_pages[0] + - * m_bank_view0.select). ПЗУ ложится ПОВЕРХ страничного регистра, поэтому - * запись в порт 0x82 из прерывания ничего не даёт — OTIR честно - * вычитывает ПЗУ и отдаёт его в CBL. На слух это скрежет; поймано на - * затемнении в PoP (2026-08-25), причём одинаково при чтении палитры, - * записи палитры и вообще любой функции BIOS. - * - * W3 таким свойством не обладает: он управляется ТОЛЬКО портом 0xE2, и - * подмену из прерывания никто не перекрывает. BIOS тоже двигает W3 - * (LP_OPEN_PG, PIC_SET_PAL), но во время нашего ISR он не исполняется — - * мы возвращаем окно до выхода, и для него подмена невидима. Ровно так - * же незаметна она и для фона с accel-блитом: их DI-банды прерывание не - * рвёт, а между бандами W3 всегда восстановлен. - * - * Идея пользователя, 2026-08-25. Тот же приём заимствования окна, что у - * трамплина с W1 (_irq_tramp.c). - * - * Заплатки ISR-стаба в 0x38/0x66 нашим страницам НЕ нужны (в отличие от - * страницы уровня, pop_level_read_file): пока страница замаплена, мы - * внутри прерывания и IFF сброшен — прерваться некому. - * - * ТИШИНУ ЛЬЁМ СВОЮ. Когда эффект кончился, отдавать в CBL всё равно надо: - * иначе железо крутит по кругу хвост своего буфера и это слышно как - * жужжание. Готовый блок 0x80 лежит первым в наборе (упаковщик), поэтому - * libc-шный CBL_UNDERRUN_SILENCE с его malloc нам не нужен — а куча в - * тесном резиденте W2 отказала бы и уронила весь звук. */ -int pop_sfx_fill(uint16_t n) -{ - uint8_t saved, phys; - uint16_t ptr; - - /* ЧАСЫ СЦЕН. Насос зовётся строго по расходу буфера CBL — 85,4 раза в - * секунду, что бы ни делал главный цикл. Это единственный источник времени, - * которому не мешают ни долгие блиты, ни чтение с диска: кадровые - * прерывания теряются в di-окнах акселератора (pop_pace.h), а счёт - * ожиданий vsync считает НАШИ ожидания, а не прошедшее время. - * Катсцены пейсятся по нему — иначе картинка уезжает от музыки. */ - pop_snd_tick++; - - /* Три источника по убыванию важности: эффект, музыка, тишина. Эффект - * перебивает музыку — как у оригинала, где play_sound глушит всё, что - * звучало; голос-то один. Музыка при этом НЕ теряет позицию: её - * курсор стоит, пока эффект доигрывает, и она продолжается с места. */ - if (sfx_left) { - phys = pop_snd_page[sfx_pg]; ptr = sfx_ptr; - } else if (pop_mus_left) { - phys = pop_mus_page[pop_mus_pg]; ptr = pop_mus_ptr; - } else { - phys = pop_snd_page[POP_SND_SILENCE_PAGE]; - ptr = POP_SND_SILENCE_OFF; - } - /* ОКНО БЕРЁМ ВЗАЙМЫ У W3, А НЕ У W0 — см. шапку файла. */ - saved = _io_page_w3; - _io_page_w3 = phys; - cbl_push_otir((const void *)(0xC000u + ptr), n); - _io_page_w3 = saved; - if (!sfx_left) { - if (!pop_mus_left) return 1; /* тишина — курсор не двигаем */ - /* Длину трека считаем ПОРЦИЯМИ насоса, а не байтами: 169 КБ в - * uint16 не влезает, а 1350 блоков — легко (32-бит арифметики на - * Z80 избегаем, тем более в прерывании). */ - pop_mus_left--; - pop_mus_ptr += n; - if (pop_mus_ptr >= 0x4000) { - pop_mus_ptr = 0; - /* КОЛЬЦО. Финальная тема — 1,2 МБ, в память целиком не влезает - * никак, поэтому она играется из нескольких страниц по кругу, а - * загрузчик дочитывает в те, что мы уже прошли (pop_music.c). - * Конец трека определяет left, а не номер страницы. */ - if (pop_mus_ring) { - if ((uint8_t)(pop_mus_pg + 1) < pop_mus_ring) pop_mus_pg++; - else pop_mus_pg = 0; - } else if ((uint8_t)(pop_mus_pg + 1) < POP_MUS_PAGES) { - pop_mus_pg++; - } else { - pop_mus_left = 0; - } - } - return 1; - } - - sfx_ptr += n; - if (sfx_ptr >= 0x4000) { /* граница страницы — ровно по блоку */ - sfx_ptr = 0; - /* Переход на следующую страницу нужен ровно одному эффекту — тому, - * что сам ДЛИННЕЕ страницы (упаковщик с 2026-08-25 кладёт остальные - * целиком в одну). Гард обязателен: без него ошибка в длине увела - * бы насос за pop_snd_page[] и он читал бы чужую память — на слух - * это «играет не тот звук», причём каждый раз другой. */ - if ((uint8_t)(sfx_pg + 1) < POP_SND_PAGES) sfx_pg++; - else sfx_left = n; /* обрываем */ - } - sfx_left -= n; - return 1; -} - -/* ---- ОЧЕРЕДЬ И ПРИОРИТЕТЫ (порт seg000:12C5 + seg000:1304) ------------ * - * - * Оригинал НЕ перебивает играющий звук чем попало, и это слышно. Модель - * ровно такая: - * - * play_sound(id) — только НОМИНИРУЕТ кандидата на кадр; из нескольких - * за кадр остаётся ВАЖНЕЙШИЙ (меньше prio = важнее, - * при равенстве побеждает последний — сравнение <=); - * play_next_sound() — раз в кадр решает, запускать ли: можно, если ничего - * не играет, ЛИБО текущий звук помечен «перебиваемым» - * И новый не менее важен. Иначе номинант ВЫБРАСЫВАЕТСЯ - * (next_sound = -1 безусловно), а не встаёт в очередь. - * - * Отсюда то, что слышно в игре: `gate_closing_fast` (6) неперебиваем и - * доигрывает до звонкого конца, а приземление Кида в этот момент пропадает - * совсем; челюсти (47, prio 0x10) всегда важнее решётки (4, prio 0x32), и - * решётка звучит только в паузах между укусами. - * - * Таблицы — из SDLPoP (sound_prio_table seg000:1528, sound_interruptible - * data.h:433) с правками fix_sound_priorities(): в config.h SDLPoP - * FIX_SOUND_PRIORITIES определён безусловно, то есть сравниваем мы себя - * именно с исправленным вариантом (10 -> 0x0D, 48 -> 0x15, 49 перебиваем). - */ - -/* Приоритет: МЕНЬШЕ значит ВАЖНЕЕ. Музыкальные id тут тоже есть — они - * никогда не номинируются (нет оцифровки), но индексация должна совпадать - * с оригиналом, иначе таблицу не сверить глазами. */ -static const uint8_t snd_prio[POP_SND_COUNT] = { - 0x14, 0x1E, 0x23, 0x66, 0x32, 0x37, 0x30, 0x30, 0x4B, 0x50, /* 0.. 9 */ - 0x0D, 0x12, 0x0C, 0x0B, 0x69, 0x6E, 0x73, 0x78, 0x7D, 0x82, /* 10..19 */ - 0x91, 0x96, 0x9B, 0xA0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x13, /* 20..29 */ - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* 30..39 */ - 0x01, 0x01, 0x01, 0x01, 0x87, 0x8C, 0x0F, 0x10, 0x15, 0x16, /* 40..49 */ - 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01 /* 50..56 */ -}; - -/* «Играющий звук можно перебить» — битовая карта (бит id&7 байта id>>3): - * 57 флагов уложены в 8 байт, потому что в резиденте W1/W2 каждая сотня - * байт на счету, а читаем мы их раз в кадр. */ -static const uint8_t snd_intr[8] = { - /* 0.. 7 */ (uint8_t)(0<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 0<<6 | 1<<7), - /* 8..15 */ (uint8_t)(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 0<<6 | 0<<7), - /*16..23 */ (uint8_t)(1<<0 | 1<<1 | 0<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7), - /*24..31 */ (uint8_t)(0<<0 | 0<<1 | 0<<2 | 0<<3 | 0<<4 | 1<<5 | 0<<6 | 0<<7), - /*32..39 */ 0, - /*40..47 */ (uint8_t)(0<<0 | 0<<1 | 0<<2 | 0<<3 | 0<<4 | 0<<5 | 0<<6 | 1<<7), - /*48..55 */ 0, - /*56.. */ 0 -}; - -/* Створка двери уровня (15) — единственная запись, которую оригинал правит - * НА ХОДУ (seg007:442/464): при закрытии её перебивать можно, при открытии - * нельзя (иначе съезд створки обрывается и «конца» не слышно). Держим - * отдельным байтом, чтобы таблица осталась в ПЗУ. */ -uint8_t pop_sfx_slide_intr; - -/* Номинант кадра, ЗАПИСАННЫЙ КАК id+1: ноль значит «никого». Так сделано - * ради crt0 — он зануляет _DATA, а «нет номинанта» у оригинала это -1; - * со смещением на единицу начальное состояние получается даром. */ -static uint8_t snd_next1; -static uint8_t snd_curr; /* что играет — для prio/intr */ - -static uint8_t snd_interruptible(uint8_t id) -{ - if (id == 15) return pop_sfx_slide_intr; - return (uint8_t)(snd_intr[id >> 3] & (uint8_t)(1 << (id & 7))); -} - -/* ---- запуск / останов ------------------------------------------------ */ - -void pop_sfx_play(uint8_t id) -{ - if (!pop_snd_ok || id >= POP_SND_COUNT) return; - /* НЕТ ОЦИФРОВКИ — ЗНАЧИТ ЭТО МУЗЫКА. В оригинале звуки 24..43 играет - * Adlib по MIDI, и в digisnd их нет вовсе; у нас на их месте записи - * DOS-версии, которые надо читать с диска. В прерывании и в горячем - * коде этого делать нельзя, поэтому здесь только ЗАЯВКА одним байтом — - * её разбирает главный цикл (pop_music_stream, банк 9). - * В конкурсе эффектов такой id не участвует: он не глушит живой звук - * (порт проверки `if (NULL == sound_pointers[id]) return;`). */ - if (pop_snd_tbl[id].len == 0) { - /* Заявку принимаем ТОЛЬКО в музыкальном диапазоне оригинала - * (24..43 — Adlib-треки игры). Пустых слотов в наборе больше нет, - * но случайный мусорный id обязан молчать, а не запускать трек на - * минуту: ровно так проявился sdcc_z80_cmp_store_a_bug в звуке - * тряски — разность двух номеров попала в 27 и заиграла музыка. */ - if (pop_mus_want && id >= 24 && id <= 43) pop_mus_req = id; - return; - } - if (!snd_next1 || snd_prio[id] <= snd_prio[snd_next1 - 1]) - snd_next1 = (uint8_t)(id + 1); -} - -void pop_sfx_tick(void) -{ - uint8_t id, pg; - uint16_t off, len; - if (!snd_next1) return; - id = (uint8_t)(snd_next1 - 1); - snd_next1 = 0; /* номинант живёт ровно кадр */ - /* ЧТО СЕЙЧАС ЗВУЧИТ — эффект либо музыка. У оригинала это один и тот - * же вопрос: check_sound_playing() отвечает «играет хоть что-то», без - * различия типа, а музыкальные id лежат в тех же таблицах приоритета и - * перебиваемости (seg000:1672 + data.h:433). Почти вся музыка помечена - * НЕперебиваемой, поэтому пока она играет, эффект просто не стартует — - * ровно это слышно в оригинале. Исключение одно: 29 meet_Jaffar. */ - { - uint8_t cur = sfx_left ? snd_curr : pop_mus_id; - if ((sfx_left != 0 || pop_mus_left != 0) && - (!snd_interruptible(cur) || snd_prio[id] > snd_prio[cur])) - return; /* ...и уступать не обязано */ - } - snd_curr = id; - pg = pop_snd_tbl[id].page; - off = pop_snd_tbl[id].off; - len = pop_snd_tbl[id].len; - /* Курсор из трёх полей, а читает его прерывание — обновляем под DI, - * иначе насос может застать наполовину обновлённое состояние и уехать - * в чужие данные. */ - IRQ_DISABLE(); - sfx_pg = pg; - sfx_ptr = off; - sfx_left = len; - IRQ_ENABLE(); -} - -void pop_sfx_stop(void) -{ - IRQ_DISABLE(); - sfx_left = 0; - IRQ_ENABLE(); -} diff --git a/applications/PoP/roomtest/pop_sfx.h b/applications/PoP/roomtest/pop_sfx.h deleted file mode 100644 index 42adc10..0000000 --- a/applications/PoP/roomtest/pop_sfx.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * pop_sfx.h — звуковые ЭФФЕКТЫ PoP через COVOX-Blaster. - * - * Данные — оригинальная оцифровка игры (`digisnd1..3.dat`), приведённая - * упаковщиком к 10 937,5 Гц. Конвертировать в рантайме нечего: у PoP - * сэмплы 8 бит БЕЗЗНАКОВЫЕ МОНО, и это ровно формат CBL (см. и - * ../docs/sound_plan.md). - * - * ОДИН ГОЛОС. Оригинал тоже одноголосый: `play_sound` глушит - * предыдущий звук (`stop_sounds`, seg009.c), поэтому новый эффект просто - * перебивает играющий, и никакого микшера не нужно. - * - * ПОЧЕМУ ЭТО НЕ ЛОМАЕТ КАДР. Насос живёт в прерывании CBL и отдаёт 128 - * байт раз в ~11,7 мс. Кадровые прерывания при этом теряются (ветка CBL - * в трамплине делает приватный RETI), но нам всё равно: темп кадра - * считается ПО ЛУЧУ (pop_pace.h), а не по прерываниям. Если бы пейсинг - * остался на них — звук сломал бы игру. - */ -#ifndef POP_SFX_H -#define POP_SFX_H - -#include - -/* Поднять набор: занять 8 EMM-страниц и вычитать в них данные. ВЫВОД НЕ - * ВКЛЮЧАЕТ — см. pop_sfx_start. 0 — OK, -1 — не получилось (тогда всё - * дальнейшее молча ничего не делает, игра идёт без звука). */ -int pop_sfx_init(void) __banked; - -/* Включить вывод (открыть CBL). Звать ПОСЛЕ всей загрузки: пока идёт - * чтение файлов, ESTEX уходит в диск надолго, насос не успевает долить - * блок, и железо крутит хвост своего буфера — на слух сплошной скрежет. - * Идемпотентно. */ -int pop_sfx_start(void) __banked; - -/* Заглушить вывод на время загрузки (закрывает CBL). Парная к start. */ -void pop_sfx_pause(void) __banked; - -/* Закрыть CBL и отпустить страницы; звать на выходе. */ -void pop_sfx_close(void) __banked; - -/* Вкл/выкл звук по воле пользователя (Ctrl+S, порт SDLPoP seg000:657). - * Правит pop_snd_want и приводит вывод в соответствие. */ -void pop_sfx_toggle(void) __banked; - -/* ХОЧЕТ ЛИ ЗВУКА ПОЛЬЗОВАТЕЛЬ. Не то же самое, что «CBL открыт»: вывод - * ещё гасит служебная пауза на время загрузки уровня. Читать для - * индикации; писать — только через pop_sfx_toggle. 0 и в случае, когда - * набор вообще не поднялся (нет файлов, нет страниц) — то есть флаг - * честно means «звука не будет». */ -extern uint8_t pop_snd_want; - -/* ЧАСЫ ДЛЯ СЦЕН: +1 на каждый блок, отданный CBL, то есть ровно 85,4 Гц - * (10 937,5 / 128), пока звук открыт. Идут от расхода буфера железом, а - * не от нашего кода, поэтому не врут ни на долгих блитах, ни на чтении с - * диска — в отличие от счёта ожиданий vsync (тот считает НАШИ ожидания) и - * от кадровых прерываний (те теряются в di-окнах акселератора, pop_pace.h). - * Переполняется каждые 3 с — разности брать в uint8_t и накапливать. - * Когда CBL закрыт (звук выключён), НЕ ИДУТ: у пейсинга обязан быть - * запасной путь по кадрам луча. */ -extern volatile uint8_t pop_snd_tick; - -/* ЗАЯВКА НА МУЗЫКУ. pop_sfx_play(id) для звука без оцифровки (24..43 — - * в оригинале это Adlib-музыка) кладёт сюда номер трека, а разбирает - * заявку главный цикл: чтение с диска ни в прерывании, ни в горячем коде - * недопустимо. 0 — заявки нет. Снимать обязан тот, кто обработал. */ -extern uint8_t pop_mus_req; - -/* Тумблер МУЗЫКИ (Settings / Ctrl+M), независимый от тумблера эффектов: - * музыка у нас — поток с диска, и выключают её по другим причинам. - * 0 — заявки не принимаются, играющий трек глушится (pop_music_service). */ -extern uint8_t pop_mus_want; - -/* Заявить эффект с номером id (0..56 — нумерация оригинала, см. - * sound_plan.md). НЕ запускает его немедленно и НЕ перебивает играющий: - * это порт play_sound (seg000:12C5), который лишь НОМИНИРУЕТ кандидата на - * текущий кадр. Из нескольких заявок за кадр выживает важнейшая, а решение - * «запускать или нет» принимает pop_sfx_tick. Звуки без оцифровки (музыка) - * игнорируются. - * - * НЕ банковая и НЕ __banked: зовётся из горячих мест (play_seq в - * pop_kid.c, физика, боёвка), и трамплин на каждый шаг Кида не нужен. */ -void pop_sfx_play(uint8_t id); - -/* Раз в кадр: запустить номинанта, если можно (порт play_next_sound, - * seg000:1304). Оригинал зовёт его в конце отрисовки кадра — зовём там же. - * Не запустили — номинант ВЫБРАСЫВАЕТСЯ, очереди у оригинала нет. */ -void pop_sfx_tick(void); - -/* Перебиваемость съезжающей створки двери уровня (звук 15) — единственная - * запись таблицы, которую оригинал правит на ходу (seg007:442/464): - * 1 при закрытии двери, 0 при открытии. */ -extern uint8_t pop_sfx_slide_intr; - -/* Оборвать текущий эффект (порт stop_sounds). */ -void pop_sfx_stop(void); - -#endif diff --git a/applications/PoP/roomtest/pop_sfx_cold.c b/applications/PoP/roomtest/pop_sfx_cold.c deleted file mode 100644 index 425a8e4..0000000 --- a/applications/PoP/roomtest/pop_sfx_cold.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * pop_sfx_cold.c — ХОЛОДНАЯ половина звука: поднять набор и открыть CBL. - * Отрабатывает один раз за запуск, поэтому живёт в банке 8; горячая - * половина (насос, запуск эффекта) — в резиденте, см. pop_sfx.c. - */ - -#include -#include -#include -#include "pop_sfx.h" -#include "pop_arc.h" -#define POP_SND_FILES /* имена файлов нужны ТОЛЬКО здесь, см. pop_sound_tbl.h */ -#include "_pop_sfx.h" - -static uint8_t snd_blk; /* блок EMM под весь набор */ - -int pop_sfx_init(void) __banked -{ - uint8_t i, blk; - - if (pop_snd_ok) return 0; - - /* Одним блоком: страницы блока идут подряд по логическому индексу, и - * таблица звуков адресует их именно так (page = смещение >> 14). - * - * Из АРХИВА, а не десятью файлами: `open` стоит 51,4 мс против 32,6 мс - * на чтение 16 КБ (замер 2026-08-25), то есть девять лишних открытий — - * это почти полсекунды на ровном месте. Таблица живёт на стеке, см. - * pop_arc.h. */ - { - pop_arc_t arc; - uint8_t tbl[POP_SND_PAGES * POP_ARC_REC]; - - if (pop_arc_open_id(&arc, POP_ARC_SND, tbl, POP_SND_PAGES) != - POP_SND_PAGES) - return -1; - blk = mem_alloc_pages(POP_SND_PAGES); - if (!blk) { pop_arc_close(&arc); return -1; } - for (i = 0; i < POP_SND_PAGES; i++) { - pop_snd_page[i] = mem_get_page(blk, i); - if (!pop_snd_page[i] || - pop_arc_read(&arc, tbl, i, 0, pop_snd_page[i], 0, 0) != 16384) { - pop_arc_close(&arc); - mem_free_block(blk); - return -1; - } - } - pop_arc_close(&arc); - } - snd_blk = blk; - pop_snd_want = 1; /* набор есть — звук по умолчанию включён */ - return 0; -} - -/* ЗАПУСТИТЬ ВЫВОД — ОТДЕЛЬНО ОТ ЗАГРУЗКИ, и это не косметика. - * - * Пока идёт чтение файлов, CBL держать открытым НЕЛЬЗЯ: ESTEX уходит в - * диск надолго, насос не успевает долить очередные 128 байт, и железо - * крутит по кругу хвост своего 256-байтового буфера. На слух это - * сплошной скрежет (поймано пользователем на старте, 2026-08-20). - * Поэтому загрузка страниц и открытие CBL разведены: грузим молча, - * включаем звук последним действием, а на время загрузки уровня глушим - * (pop_sfx_pause). - * - * Параметры: 10 937,5 Гц, 8 бит моно — формат данных один в один - * (sound_plan.md). OTIR, а не акселератор: тот нужен только для 16 бит. - * cbl_open, а не cbl_open_silence: тишину насос льёт СВОЮ (первый блок - * набора), и просить у libc буфер через malloc не надо — куча в резиденте - * W2 тесная, и её отказ ронял бы весь звук. Заодно так malloc вообще не - * приезжает в резидент (275 Б, см. libc/cbl/_cbl_open_raw.c). */ -int pop_sfx_start(void) __banked -{ - if (pop_snd_ok) return 0; - if (!pop_snd_want) return 0; /* выключено пользователем (Ctrl+S) */ - if (!snd_blk) return -1; /* набор не загружен */ - if (cbl_open(CBL_FREQ_10K9, CBL_FMT_MONO8, CBL_PUMP_OTIR, - pop_sfx_fill) != 0) - return -1; - pop_snd_ok = 1; - return 0; -} - -void pop_sfx_pause(void) __banked -{ - if (!pop_snd_ok) return; - pop_sfx_stop(); - cbl_close(); - pop_snd_ok = 0; -} - -void pop_sfx_close(void) __banked -{ - pop_sfx_pause(); - if (snd_blk) { mem_free_block(snd_blk); snd_blk = 0; } -} - -/* Ctrl+S — порт `turn_sound_on_off((!is_sound_on) * 15)` из SDLPoP - * (seg000:657). Выключение реально ЗАКРЫВАЕТ CBL, а не глушит сэмпл: - * иначе насос продолжал бы отдавать блоки тишины 85 раз в секунду, а это - * 3,3 % процессорного времени ни за что (замер: 8 001 такт на прерывание - * при периоде 245 759). Открытие обратно дешёвое — cbl_open только - * настраивает железо, страницы набора никуда не девались. */ -void pop_sfx_toggle(void) __banked -{ - if (pop_snd_want) { - pop_sfx_pause(); /* pause сам не трогает want... */ - pop_snd_want = 0; /* ...поэтому гасим его следом */ - } else { - pop_snd_want = 1; - /* Набора может не быть вовсе (файлы не прочитались, страницы не - * дались) — тогда откатываем флаг, чтобы индикация не врала. */ - if (pop_sfx_start() != 0) pop_snd_want = 0; - } -} diff --git a/applications/PoP/roomtest/pop_shadow.c b/applications/PoP/roomtest/pop_shadow.c deleted file mode 100644 index 721dcb2..0000000 --- a/applications/PoP/roomtest/pop_shadow.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * pop_shadow.c — загрузка запечённого набора спрайтов Тени. Зачем набор - * отдельный и почему половин две — в шапке pop_shadow.h. - * - * Код ХОЛОДНЫЙ (раз на уровень), поэтому живёт в банке 8 вместе с прочей - * загрузкой. Сами atlas_t — в W2: их читает отрисовка из банка 4, а - * данные видны из любого банка. - */ - -#include -#include -#include -#include "pop_arc.h" -#include "shadow_arc.h" -#include "pop_shadow.h" -#include "pop_shadow_atlas.h" - -atlas_t pop_shadow_kid[POP_SHADOW_KID_PAGES]; -atlas_t pop_shadow_fgt[POP_SHADOW_FGT_PAGES]; -uint8_t pop_shadow_kid_n, pop_shadow_fgt_n; - -/* ГРУЗИМ ОДИН РАЗ НА ЗАПУСК, а не по уровням. - * - * Тень бывает на ЧЕТЫРЁХ уровнях: 4 — рождается прыжком сквозь зеркало - * (jump_through_mirror, seg003:0811, ставит Char.charid = charid_1_shadow - * прямо из Кида), 5 — крадёт зелье, 6 — прыгает через пропасть, 12 — - * дерётся. Читается как три, потому что таблиц init_shad_N всего три - * (5/6/12): четвёртой нет — на 4-м Тень копируется с Кида, а не поднимается - * из таблицы. Так вот, напрашивается - * грузить набор только там, как это сделано с перевёрнутыми наборами - * (pop_vflip_load_all зовётся лишь на POP_UPSIDE_LEVEL). Решение - * пользователя — грузить сразу, и оно правильное по двум причинам: - * страниц EMM с запасом (32 из ~215 свободных), а вот забыть перезагрузку - * на границе уровня легко — ровно так и появился BUG-SHADOW-SET. Разовая - * загрузка убирает целый класс ошибок и заодно не тормозит переход между - * уровнями на 32 файла. */ -int pop_shadow_load(void) __banked -{ - uint8_t i; - if (pop_shadow_kid_n || pop_shadow_fgt_n) return 0; /* уже загружен */ - - { - uint8_t tbl[ARC_SHADOW_COUNT * POP_ARC_REC]; - pop_arc_t arc; - - /* Тридцать два атласа — из одного архива: раньше это были тридцать - * два `open` по 51,4 мс, то есть полторы секунды на ровном месте. */ - if (pop_arc_open_id(&arc, POP_ARC_SHADOW, tbl, - ARC_SHADOW_COUNT) < 0) - return -1; - for (i = 0; i < POP_SHADOW_KID_PAGES; i++) { - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_SHADOW_SK0 + i), - &pop_shadow_kid[i]) != 0) { - pop_arc_close(&arc); - pop_shadow_free(); - return -1; - } - pop_shadow_kid_n = (uint8_t)(i + 1); - } - for (i = 0; i < POP_SHADOW_FGT_PAGES; i++) { - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_SHADOW_SF0 + i), - &pop_shadow_fgt[i]) != 0) { - pop_arc_close(&arc); - pop_shadow_free(); - return -1; - } - pop_shadow_fgt_n = (uint8_t)(i + 1); - } - pop_arc_close(&arc); - } - - pop_shadow_pal_apply(); - return 0; -} - -/* ПАЛИТРА ОТДЕЛЬНО ОТ ЗАГРУЗКИ, и это не косметика. - * - * `gfx_pal_fload("KID\\kid.pal")` заливает ВСЕ 256 записей — это единая - * игровая палитра, — и затирает любые слоты, выставленные до него. Ровно - * та же беда уже была с тайлсетом: сразу за ним стоит pop_bg_pal_apply, - * который возвращает цвета env/wall. Наши 0xA0..0xAF из той же оперы, и - * в первом заходе я на это наступил: набор грузился, силуэт рисовался - * правильной формы, но ЦЕЛИКОМ ЧЁРНЫЙ (поймано пользователем на 6-м - * уровне). Поэтому вызов живёт рядом с pop_bg_pal_apply, а не внутри - * загрузки атласов. - * - * Обе страницы дабл-буфера: у них свои палитры. Через буфер в W2 — - * gfx_pal_load отдаёт указатель BIOS ($A4), а тот читает только - * #4000-#BFFF и банковую rodata не увидит. */ -void pop_shadow_pal_apply(void) __banked -{ - uint8_t buf[64], k; - if (!pop_shadow_kid_n) return; /* набора нет — нечего красить */ - for (k = 0; k < 64; k++) buf[k] = pop_shadow_pal[k]; - gfx_pal_load(0, POP_SHADOW_PAL_BASE, 16, buf); - gfx_pal_load(1, POP_SHADOW_PAL_BASE, 16, buf); -} - -void pop_shadow_free(void) __banked -{ - uint8_t i; - for (i = 0; i < pop_shadow_kid_n; i++) atlas_free(&pop_shadow_kid[i]); - for (i = 0; i < pop_shadow_fgt_n; i++) atlas_free(&pop_shadow_fgt[i]); - pop_shadow_kid_n = pop_shadow_fgt_n = 0; -} diff --git a/applications/PoP/roomtest/pop_shadow.h b/applications/PoP/roomtest/pop_shadow.h deleted file mode 100644 index 7463e2f..0000000 --- a/applications/PoP/roomtest/pop_shadow.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * pop_shadow.h — запечённый набор спрайтов ТЕНИ. - * - * Оригинал спрайтов Тени не хранит: он кладёт обычный спрайт дважды — в x - * прозрачным блитом и в x+1 «блиттером XOR» (draw_objtable_item, - * seg008.c:1600). Пакетный блит так не умеет, поэтому результат запечён - * заранее (toolchain/pop_pack_shadow.py); разбор и замеры — - * ../docs/shadow_atlas_plan.md. - * - * ПОЛОВИН ДВЕ, и это не наша выдумка. Набор спрайтов у оригинала выбирает - * не персонаж, а поле `sword` САМОГО КАДРА (load_frame_to_obj, - * seg008.c:1752: chtab_base жёстко = chtab_2, плюс `sword >> 6`). У всех - * кадров таблицы Кида эти биты нулевые, у всех кадров таблицы стража — - * 0xC0. Тень берёт таблицу стража для кадров 150..189 (seg006.c:533), - * значит идёт через chtab_5 — а chtab_5 на 12-м уровне грузится из - * SHADOW.DAT (tbl_guard_type[12] == 4), и это графика КИДА в боевых позах. - * Отсюда: - * - * pop_shadow_kid[] — кадры вне боя (запечены из спрайтов Кида); - * pop_shadow_fgt[] — кадры 150..189 (запечены из SHADOW.DAT). - * - * Какая половина нужна, отрисовка уже знает — тем же условием, что - * выбирает таблицу кадров (pop_frame_tbl_is_guard). - * - * СПРАЙТ ТЕНИ НА ПИКСЕЛЬ ШИРЕ исходного: второй проход оригинала кладётся - * в x+1, суммарный след занимает [x, x+w]. Рисовать по тем же - * координатам, что и Кида — сдвиг уже внутри спрайта. - */ -#ifndef POP_SHADOW_H -#define POP_SHADOW_H - -#include -#include - -extern atlas_t pop_shadow_kid[]; /* половина «вне боя» */ -extern atlas_t pop_shadow_fgt[]; /* половина «в бою» (SHADOW.DAT) */ -/* Сколько страниц реально загружено; 0 = набора нет (уровень без Тени - * или загрузка не удалась) — отрисовка тогда идёт прежним путём. */ -extern uint8_t pop_shadow_kid_n, pop_shadow_fgt_n; - -/* Загрузить набор. Звать ОДИН РАЗ при старте: набор не зависит от - * уровня, а перезагрузка на границе — лишний повод её забыть (почему - * именно так — в шапке pop_shadow.c). Повторный вызов — no-op. - * Возврат: 0 — OK, -1 — ошибка загрузки. */ -int pop_shadow_load(void) __banked; - -/* Залить 16 слотов палитры Тени. ЗВАТЬ ПОСЛЕ ЛЮБОЙ заливки общей - * палитры (gfx_pal_fload kid.pal): та кладёт все 256 записей и затирает - * наши — см. развёрнуто в pop_shadow.c. Рядом с pop_bg_pal_apply. */ -void pop_shadow_pal_apply(void) __banked; - -/* Освободить страницы; звать на выходе из программы. */ -void pop_shadow_free(void) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_shadow_atlas.h b/applications/PoP/roomtest/pop_shadow_atlas.h deleted file mode 100644 index 7c46fe7..0000000 --- a/applications/PoP/roomtest/pop_shadow_atlas.h +++ /dev/null @@ -1,71 +0,0 @@ -/* pop_shadow_atlas.h — раскладка атласа ТЕНИ. - * СГЕНЕРЕНО toolchain/pop_pack_shadow.py — НЕ править вручную. - * - * Две половины, потому что и у оригинала их две (см. шапку - * упаковщика): кадры вне боя адресуют chtab_2 (спрайты Кида), - * кадры 150..189 — chtab_5, а он на 12-м уровне это SHADOW.DAT. - * Какая половина нужна, приложение уже знает — тем же условием, - * что выбирает таблицу кадров (pop_frame_tbl_is_guard). - * - * Спрайт Тени НА ОДИН ПИКСЕЛЬ ШИРЕ исходного: второй проход - * оригинала кладётся в x+1, и суммарный след занимает [x, x+w]. - * Рисовать по тем же координатам, что и Кида — сдвиг уже внутри. - */ -#ifndef POP_SHADOW_ATLAS_H -#define POP_SHADOW_ATLAS_H - -#include - -#define POP_SHADOW_SHIFT 3 -#define POP_SHADOW_MASK 7 -#define POP_SHADOW_PAL_BASE 0xA0 /* слоты Sprinter под Тень */ - -/* Половина «вне боя» — кадры Кида (chtab_2). */ -#define POP_SHADOW_KID_PAGES 28 -/* Половина «в бою» — SHADOW.DAT (chtab_5, кадры 150..189). */ -#define POP_SHADOW_FGT_PAGES 4 - -static const char *const pop_shadow_kid_atl[POP_SHADOW_KID_PAGES] = { - "SHADOW\\sk0.atl", - "SHADOW\\sk1.atl", - "SHADOW\\sk2.atl", - "SHADOW\\sk3.atl", - "SHADOW\\sk4.atl", - "SHADOW\\sk5.atl", - "SHADOW\\sk6.atl", - "SHADOW\\sk7.atl", - "SHADOW\\sk8.atl", - "SHADOW\\sk9.atl", - "SHADOW\\sk10.atl", - "SHADOW\\sk11.atl", - "SHADOW\\sk12.atl", - "SHADOW\\sk13.atl", - "SHADOW\\sk14.atl", - "SHADOW\\sk15.atl", - "SHADOW\\sk16.atl", - "SHADOW\\sk17.atl", - "SHADOW\\sk18.atl", - "SHADOW\\sk19.atl", - "SHADOW\\sk20.atl", - "SHADOW\\sk21.atl", - "SHADOW\\sk22.atl", - "SHADOW\\sk23.atl", - "SHADOW\\sk24.atl", - "SHADOW\\sk25.atl", - "SHADOW\\sk26.atl", - "SHADOW\\sk27.atl", -}; - -static const char *const pop_shadow_fgt_atl[POP_SHADOW_FGT_PAGES] = { - "SHADOW\\sf0.atl", - "SHADOW\\sf1.atl", - "SHADOW\\sf2.atl", - "SHADOW\\sf3.atl", -}; - -/* 16 цветов, запись 4 байта (B, G, R, 0) — формат gfx_pal_load. */ -static const uint8_t pop_shadow_pal[64] = { - 0x00,0x00,0x00,0x00,0xD8,0xFC,0xFC,0x00,0x6C,0x80,0xDC,0x00,0x78,0x44,0x24,0x00,0xA0,0xB8,0xD8,0x00,0xB5,0x7C,0x21,0x00,0x00,0x90,0xB8,0x00,0x5D,0x6D,0xAB,0x00,0x0C,0xF0,0x6C,0x00,0xCC,0x38,0x05,0x00,0x38,0xCC,0xC0,0x00,0x58,0xDB,0xA7,0x00,0xBB,0x9F,0x54,0x00,0x5D,0x18,0x60,0x00,0x37,0xD7,0x37,0x00,0x2F,0x17,0xD2,0x00, -}; - -#endif diff --git a/applications/PoP/roomtest/pop_sound_tbl.h b/applications/PoP/roomtest/pop_sound_tbl.h deleted file mode 100644 index c6d9fb7..0000000 --- a/applications/PoP/roomtest/pop_sound_tbl.h +++ /dev/null @@ -1,113 +0,0 @@ -/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP. - * СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную. - * - * Данные: 8 бит беззнаковые, МОНО, 10937.5 Гц (CBL_FREQ_10K9) — формат - * CBL один в один, конвертировать в рантайме нечего. - * - * Начало каждого звука кратно 128 — размеру блока запроса CBL, а - * страница (16384) кратна ему же. Поэтому НИ ОДИН блок не пересекает - * границу страницы. Больше того: с 2026-08-25 каждый звук лежит - * ЦЕЛИКОМ в одной странице — не влезает в остаток, значит начинаем - * новую (страницы EMM у нас с запасом). Единственное исключение — - * эффект, который сам ДЛИННЕЕ страницы: для него насос переключает - * страницу на ходу, и эта ветка в pop_sfx_fill остаётся ради него. - * - * Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80 - * 32-битная арифметика дорога, а так всё влезает в 8/16 бит. - * Длина округлена вверх до блока — неполных блоков не бывает. - */ -#ifndef POP_SOUND_TBL_H -#define POP_SOUND_TBL_H - -#include - -#define POP_SND_PAGES 10 -#define POP_SND_COUNT 57 -#define POP_SND_BLOCK 128 -/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */ -#define POP_SND_SILENCE_PAGE 0 -#define POP_SND_SILENCE_OFF 0x0000 - -typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t; - -/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */ -static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { - { 0, 0x0080, 1664 }, /* 0 */ - { 0, 0x0700, 12032 }, /* 1 */ - { 1, 0x0000, 6272 }, /* 2 */ - { 1, 0x1880, 1280 }, /* 3 */ - { 1, 0x1D80, 1152 }, /* 4 */ - { 1, 0x2200, 1408 }, /* 5 */ - { 1, 0x2780, 5504 }, /* 6 */ - { 2, 0x0000, 896 }, /* 7 */ - { 2, 0x0380, 1664 }, /* 8 */ - { 2, 0x0A00, 2816 }, /* 9 */ - { 2, 0x1500, 4992 }, /* 10 */ - { 2, 0x2880, 1280 }, /* 11 */ - { 2, 0x2D80, 1280 }, /* 12 */ - { 3, 0x0000, 3840 }, /* 13 */ - { 3, 0x0F00, 7552 }, /* 14 */ - { 4, 0x0000, 17664 }, /* 15 */ - { 5, 0x0500, 4736 }, /* 16 */ - { 5, 0x1780, 4224 }, /* 17 */ - { 6, 0x0000, 6912 }, /* 18 */ - { 6, 0x1B00, 2816 }, /* 19 */ - { 6, 0x2600, 1408 }, /* 20 */ - { 6, 0x2B80, 1152 }, /* 21 */ - { 6, 0x3000, 1280 }, /* 22 */ - { 6, 0x3500, 1408 }, /* 23 */ - { 0, 0x0000, 0 }, /* 24 */ - { 0, 0x0000, 0 }, /* 25 */ - { 0, 0x0000, 0 }, /* 26 */ - { 0, 0x0000, 0 }, /* 27 */ - { 0, 0x0000, 0 }, /* 28 */ - { 0, 0x0000, 0 }, /* 29 */ - { 0, 0x0000, 0 }, /* 30 */ - { 0, 0x0000, 0 }, /* 31 */ - { 0, 0x0000, 0 }, /* 32 */ - { 0, 0x0000, 0 }, /* 33 */ - { 0, 0x0000, 0 }, /* 34 */ - { 0, 0x0000, 0 }, /* 35 */ - { 0, 0x0000, 0 }, /* 36 */ - { 0, 0x0000, 0 }, /* 37 */ - { 0, 0x0000, 0 }, /* 38 */ - { 0, 0x0000, 0 }, /* 39 */ - { 0, 0x0000, 0 }, /* 40 */ - { 0, 0x0000, 0 }, /* 41 */ - { 0, 0x0000, 0 }, /* 42 */ - { 0, 0x0000, 0 }, /* 43 */ - { 7, 0x0000, 2688 }, /* 44 */ - { 7, 0x0A80, 4224 }, /* 45 */ - { 7, 0x1B00, 4608 }, /* 46 */ - { 8, 0x0000, 5120 }, /* 47 */ - { 8, 0x1400, 5120 }, /* 48 */ - { 8, 0x2800, 4480 }, /* 49 */ - { 0, 0x0000, 0 }, /* 50 */ - { 9, 0x0000, 4864 }, /* 51 */ - { 0, 0x0000, 0 }, /* 52 */ - { 0, 0x0000, 0 }, /* 53 */ - { 0, 0x0000, 0 }, /* 54 */ - { 0, 0x0000, 0 }, /* 55 */ - { 0, 0x0000, 0 }, /* 56 */ -}; - -/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная - * половина): иначе копия строк уезжает в каждый включивший заголовок - * модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же - * приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */ -#ifdef POP_SND_FILES -static const char *const pop_snd_files[POP_SND_PAGES] = { - "SND\\s0.bin", - "SND\\s1.bin", - "SND\\s2.bin", - "SND\\s3.bin", - "SND\\s4.bin", - "SND\\s5.bin", - "SND\\s6.bin", - "SND\\s7.bin", - "SND\\s8.bin", - "SND\\s9.bin", -}; -#endif - -#endif diff --git a/applications/PoP/roomtest/pop_state.c b/applications/PoP/roomtest/pop_state.c deleted file mode 100644 index 4304f34..0000000 --- a/applications/PoP/roomtest/pop_state.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * pop_state.c — данные, которые читают ОБЕ стороны банковой границы. - * - * Зачем отдельный модуль: sprinter-cc собирает банковый модуль с - * --dataseg BANKn, поэтому ВСЯ его писучая память (глобалы, file-static, - * статики внутри функций) линкуется В СТРАНИЦУ БАНКА и снаружи не читается - * — проверено на .map (2026-07-30: глобал банкового модуля лёг по - * 0x0001C000, а не в _DATA). Значит любую переменную, к которой нужен - * доступ и из банка, и снаружи, надо держать в НЕбанковом модуле — здесь. - * - * Модуль обязан оставаться в W1/W2: его читают и главный цикл, и банки. - */ -#include "pop_state.h" -#include "pop_ctrl.h" /* объявления шины control_* (живёт здесь) */ - -uint8_t pop_mob_busy; -uint8_t pop_loose_landed; -/* Кусок loose УШЁЛ ВНИЗ из комнаты (порт хвоста move_loose, seg007:1126: - * mob_down_a_row переносит его в комнату снизу; у нас симуляция там не - * продолжается, и приземление разбирает главный цикл). 0 = нет, иначе - * col+1; комната, ИЗ которой он ушёл, — в pop_loose_exit_room. - * Сигнал отдельный от pop_loose_fell: тот взводится в момент ОТРЫВА плиты - * (там верен только remove_loose), и по нему кнопка внизу нажималась, - * пока кусок ещё летел. */ -uint8_t pop_loose_exit; -uint8_t pop_loose_exit_room; -uint8_t pop_droppedout; -/* leveldoor_open (seg007:456): дверь уровня доехала до верха. Ставит - * анимация двери (pop_trob, банк 6), читает спецсобытие подъёма скелета - * (guards.c, банк 1) — снова случай «данные через границу банков». - * Сбрасывается стартом уровня (seg003:97). - * - * ШИРИНА — word, как в оригинале (data.h:361), а не byte: на уровне 8 - * do_timers СЧИТАЕТ этой же переменной время до появления мыши - * (`++leveldoor_open` каждый кадр, пока Кид в комнате 16), и байт - * переполнился бы через 255 кадров, обнулив признак «дверь открыта». */ -uint16_t pop_leveldoor_open; - -/* ---- Шина управления (seg006 globals) ------------------------------ * - * Объявлены в pop_ctrl.h, а ЛЕЖАТ здесь: к ним обращаются ТРИ банка — - * pop_ctrl (банк 5) пишет с клавиатуры, guards.c (банк 1) подаёт - * синтетический ввод ИИ (autocontrol_*, seg002), pop_map (банк 3) читает - * через pop_ctrl_shift_held. Сегодня оно уцелело бы и в pop_ctrl.c - * (собираем без --bank-data, данные банков остаются в _DATA), но это - * флаг сборки: включат его — и шина уедет в страницу банка 5. - * - * control_x/y/shift — «сырое» состояние осей ЭТОГО кадра (абсолютно: - * X LEFT/-1..RIGHT/+1); *_forward/backward/up/down/shift2 — конечный - * автомат held/released/ignore (авто-повтор). */ -int8_t control_x, control_y, control_shift; -int8_t control_forward, control_backward, control_up, control_down, control_shift2; - -/* Чит «бессмертие» (клавиша I). Отладочный: Кид получает анимацию удара, - * но HP не теряет — иначе проверять боёвку приходится с трёх попаданий. */ -uint8_t pop_immortal; - -/* Габариты последней нарисованной двери уровня (порт leveldoor_right / - * leveldoor_ybottom): пишет draw_leveldoor из банка pop_bg, читает - * clip_char из pop_map. См. pop_state.h. */ -int pop_leveldoor_right; -int pop_leveldoor_ybottom; - -/* ---- Отладочная «пустышка» для брейкпоинтов из БАНКОВ ---------------- * - * Зачем. PC-брейкпоинт видит только логический адрес, а 0xC000+ — это - * окно, куда мапятся ВСЕ банки: точка на адресе банковой функции ловит - * заодно чужой код, случайно легший по тому же смещению (проверено: - * точка на start_fall из банка 3 срабатывала на каждом кадре — попадала - * в pop_bg из банка 2). Условные брейкпоинты этот отладчик MAME не - * поддерживает («error in assignment expression» на `==`). - * - * Приём (идея пользователя, 2026-08-04): позвать ЭТУ функцию ровно из - * того места банкового кода, которое отлаживаем, и поставить брейкпоинт - * на неё — она резидентна в W1, её адрес однозначен. По возврату из неё - * читаем что нужно. Условие «когда именно ловить» пишется обычным `if` - * в C — это гибче любых выражений отладчика. - * - * Счётчик нужен, чтобы вызов не выкинул оптимизатор; заодно видно, сколько - * раз точка прошла, если ловим не останавливаясь. */ -uint8_t pop_dbg_hits; - -void pop_dbg_trap(void) { pop_dbg_hits++; } - -/* ВРЕМЕННО: трасса kidobj — порт вывода, который пользователь добавил в - * SDLPoP add_kid_to_objtable (seg008:1679), чтобы сверить поведение у шва - * кадр в кадр. Буфер РЕЗИДЕНТНЫЙ, потому что читает его брейкпоинт MAME: - * printf из действия точки берёт байты по фиксированному адресу. Поля — - * ровно те же и в том же порядке, плюс наша комната девятым (у оригинала - * смена комнаты видна по скачку tilepos, а нам удобнее явно). */ -int8_t pop_dbg_obj[9]; - -/* ВРЕМЕННО (разбор оверлея падающего куска): по слоту mob. - * pop_dbg_pass[i] — что было в проходе отрисовки: - * bit0 рассмотрен, bit1 active, bit2 draw_y задан, bit3 defer совпал, - * bit4 нарисован, bit5 позван mob_overlay_neighbour. - * pop_dbg_ovl[i*4 + 0..3] — что решил mob_overlay_neighbour: - * [0] r+128, [1] rt+128, [2] флаги, [3] col. - * Флаги: bit0 вошли, bit1 c<=9, bit2 tile(r,c), bit3 габарит r, - * bit4 ВЫЗОВ по r, bit5 tile(rt,c), bit6 габарит rt, bit7 ВЫЗОВ по rt. */ -uint8_t pop_dbg_pass[14]; -uint8_t pop_dbg_ovl[14 * 4]; -/* ВРЕМЕННО: какие тайлы РЕАЛЬНО перекрывают спрайт куска. Бит - * (ряд+1)*2 + (0 своя колонка / 1 соседняя), ряды −1..2. */ -uint8_t pop_dbg_tiles[14]; - -/* Зеркало уровня 4 — см. pop_state.h. */ -int8_t pop_jumped_mirror; - -/* Тайл СОСЕДНЕЙ комнаты изменился, пока она не отрисована (плита, которую - * Кид расшатал и бросил, провалилась заочно — animate_loose в pop_trob). - * Кромочные колонки и у отрисовки (lcol_fg), и у коллизии (g_lcol/g_rcol) — - * СНИМКИ на момент входа в комнату, поэтому их надо перечитать. Ставит - * банк 6, разбирает главный цикл. */ -uint8_t pop_neigh_dirty; - -/* seamless (seg000:900 + seg003:158): переход 12 → 13 идёт БЕЗ двери - * уровня — уровень кончается фактом попадания в комнату 23, и следующий - * начинается в комнате с тем же номером и тем же рядом. Флаг говорит - * старту уровня «не сбрасывай HP» (и, когда появятся заставки, «не - * показывай „LEVEL 13“»): Кид продолжает бежать, не заметив границы. - * Ставит главный цикл, гасит pop_start_level. */ -uint8_t pop_seamless; - -/* «Кид попал в комнату ЧИТОМ навигации» — держит бесшовный переход уровня. - * Отладочная добавка, у оригинала телепорта между комнатами нет вовсе; см. - * pop_dbg_roomnav и ../docs/impl_diff.md. Снимается первой же СМЕНОЙ - * КОМНАТЫ ОБЫЧНЫМ ХОДОМ и стартом уровня. */ -uint8_t pop_nav_hold; - - - -/* ВРЕМЕННО (замер фаз кадра 2026-08-13): четыре маркера-пустышки в - * РЕЗИДЕНТЕ. Брейкпоинт на каждом + printf totalcycles даёт длительность - * блоков: m1..m2 — логика (синий), m2..m3 — фон (зелёный), m3..m4 — - * спрайты (циан). В банк брейкпоинт ставить нельзя: 0xC000 общее окно. */ -void pop_dbg_m1(void) { } -void pop_dbg_m2(void) { } -void pop_dbg_m3(void) { } -void pop_dbg_m4(void) { } - -/* ВРЕМЕННО (разбор зелёного блока 2026-08-13): состав перерисовок в САМОМ - * тяжёлом кадре. pop_redraw_needed считает вызовы по видам, и если кадр - * оказался тяжелее прежнего максимума — сохраняет расклад сюда. - * Индексы 0..7 — POP_RD_*, 8..9 — POP_RDA_* (полоса у потолка). */ -uint8_t pop_dbg_rdmax[10]; -uint8_t pop_dbg_rdmax_tot; - -/* ВРЕМЕННО (замер внутренностей 2026-08-13): m5..m8 — границы внутри - * pop_ceil_shake_draw (heal / draw_tile) и mob_render (heal / блиты). */ -void pop_dbg_m5(void) { } -void pop_dbg_m6(void) { } -void pop_dbg_m7(void) { } -void pop_dbg_m8(void) { } - -/* ВРЕМЕННО (разбор pop_loose_tick 2026-08-13): m9..m12 — границы ВНУТРИ - * самого pop_loose_tick. Он банковый, но зовёт резидент W1 напрямую, - * так что брейкпоинты по этим адресам однозначны. */ -void pop_dbg_m9(void) { } -void pop_dbg_m10(void) { } -void pop_dbg_m11(void) { } -void pop_dbg_m12(void) { } - -/* ВРЕМЕННО (разбор pop_ceil_shake_draw 2026-08-13): heal / draw_tile. */ -void pop_dbg_m13(void) { } -void pop_dbg_m14(void) { } -void pop_dbg_m15(void) { } - -/* ВРЕМЕННО (разбор pop_redraw_needed по ВИДАМ 2026-08-13): вид приезжает в - * A (__sdcccall(1), uint8 arg1), брейкпоинт на первой инструкции логирует - * его вместе с тактами — так видно цену КАЖДОГО вида, а не число пометок. */ -void pop_dbg_kind(uint8_t k) { (void)k; } -void pop_dbg_m16(void) { } - -/* ВРЕМЕННО (разбор pop_blit_b 2026-08-13): сколько в одном блите занимают - * САМИ пиксели, а сколько пооспрайтовые накладные (map/unmap страницы - * атласа, чтение заголовка, пометка грязного прямоугольника). */ -void pop_dbg_b1(void) { } /* вход (спрайт прошёл отсев) */ -void pop_dbg_b2(void) { } /* atlas_image + gfx_w0_map */ -void pop_dbg_b3(void) { } /* сам блит */ -void pop_dbg_b4(void) { } /* pop_cd_touch */ -void pop_dbg_b5(void) { } /* gfx_w0_unmap (конец) */ -void pop_dbg_b6(void) { } /* взведён = пошли в gfx_blit_noclip, а не в _part */ - -/* ВРЕМЕННО (разбор pop_phys_tick 2026-08-19): звенья цепочки kid_phys. */ -void pop_dbg_p1(void) { } /* loadkid_and_opp сделан */ -void pop_dbg_p2(void) { } /* fall_accel + fall_speed */ -void pop_dbg_p3(void) { } /* determine_col */ -void pop_dbg_p4(void) { } /* bump_into_opponent */ -void pop_dbg_p5(void) { } /* check_collisions */ -void pop_dbg_p6(void) { } /* check_bumped */ -void pop_dbg_p7(void) { } /* check_action */ -void pop_dbg_p8(void) { } /* check_press */ - -/* ВРЕМЕННО (регрессия цены блита 2026-08-13): w и h упакованы в один - * 16-битный аргумент (arg1 -> HL при __sdcccall(1)), брейкпоинт логирует - * HL — дальше цена раскладывается как a + b*h + c*w*h, где b и есть - * построчные накладные ядра. */ -void pop_dbg_wh(uint16_t wh) { (void)wh; } diff --git a/applications/PoP/roomtest/pop_state.h b/applications/PoP/roomtest/pop_state.h deleted file mode 100644 index ae167a6..0000000 --- a/applications/PoP/roomtest/pop_state.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * pop_state.h — состояние, общее для банков и W1/W2. См. pop_state.c. - * - * Правило: если переменную читают/пишут по обе стороны банковой границы — - * её место здесь, а НЕ в банковом модуле (там она уедет в страницу банка). - */ -#ifndef POP_STATE_H -#define POP_STATE_H - -#include - -/* Есть ли хоть один ЗАНЯТЫЙ слот падающего куска (active или дочистка - * clean). Гейт холостого хода: пока кусков нет, ни обход 14 слотов в - * pop_loose_mob_tick, ни поиск куска над головой Кида делать не нужно - * (замер 11/15: 12 090 + 5 868 тактов на комнату, где не падает ничего). - * - * Живёт в резиденте, а не в pop_room.c, потому что читает его pop_map - * (банк 3), а писучие статики банкового модуля наружу не видны. Ставит - * отрыв куска, снимает сам обход по факту пустой таблицы. */ -extern uint8_t pop_mob_busy; - -/* Кусок loose приземлился (loose_land, seg007:11E8): 0 = нет, иначе - * tilepos+1 тайла, на который он лёг. Ставит отрисовка mob (банк), - * разбирает логика loose-полов (pop_map, W1/W2). */ -extern uint8_t pop_loose_landed; - -/* Кусок loose ушёл ниже поля своей комнаты: 0 = нет, иначе col+1; комната - * отправления — pop_loose_exit_room. Ставит отрисовка mob (банк 7), - * разбирает главный цикл (посадка в комнате снизу). */ -extern uint8_t pop_loose_exit; -extern uint8_t pop_loose_exit_room; - -/* Тайл СОСЕДНЕЙ (не отрисованной) комнаты изменился — перечитать кромки. - * Подробности — в pop_state.c. */ -extern uint8_t pop_neigh_dirty; - -/* Бесшовный переход между уровнями (seamless): подробности в pop_state.c. - * Ставится главным циклом при попадании в комнату-выход, гасится стартом - * уровня — он же единственный, кто на флаг смотрит. */ -extern uint8_t pop_seamless; - -/* Держатель бесшовного перехода после ЧИТ-телепорта (см. pop_state.c). - * Ставит pop_dbg_roomnav, снимает первая смена комнаты обычным ходом. */ -extern uint8_t pop_nav_hold; - -/* Чит «бессмертие» (I): Кида бьют, но HP не убавляется. Читают пути урона - * (боёвка в банке, пики в pop_map), переключает главный цикл. */ -/* ЧИТ БЕССМЕРТИЯ, три состояния (клавиша I по кругу): - * 0 — выключено; - * 1 — только БОЙ: удары мечом не отнимают HP (pop_take_hp тут ни при - * чём, ветка живёт в hurt_by_sword, guards.c); - * 2 — бой И мелкий урон: не проходят «минус одно деление» от падения с - * двух этажей и от падающей плиты (pop_take_hp гасит count < 100). - * МГНОВЕННАЯ СМЕРТЬ остаётся на любом уровне: пики, чомпер, падение с - * трёх этажей, удар мечом вне боевой стойки — все они приходят с - * count = 100. Чит отменяет потерю HP, а не смерть. */ -extern uint8_t pop_immortal; - -/* Габариты ПОСЛЕДНЕЙ нарисованной двери уровня — порт глобалов - * leveldoor_right / leveldoor_ybottom (seg008 draw_leveldoor). Их ставит - * отрисовка (банк pop_bg), а читает clip_char (pop_map, W1/W2): кадры - * подъёма по лестнице (224..228) обрезаются по правому косяку проёма и по - * низу поднятой створки. Дверь рисуется ПОД персонажем, поэтому перекрыть - * его не может — оригинал именно режет спрайт. - * right — экранный X правой кромки; ybottom — room-space Y (без POP_YOFF). - * 0 = двери в отрисованной комнате нет. */ -extern int pop_leveldoor_right; -extern int pop_leveldoor_ybottom; - -/* droppedout (seg006:1140): Кида СПИХНУЛИ с уступа в бою — он падает из - * боевой стойки. Ставит start_fall (pop_map, банк 3), читает ИИ стража - * (guards.c, банк 1): по этому флагу страж решает, идти ли за упавшим вниз - * (guard_follows_kid_down, seg002:09F8). Отсюда и место в общем модуле — - * банки друг другу данные не отдают. */ -extern uint8_t pop_droppedout; - -/* leveldoor_open (seg007:456): 1 — дверь уровня открыта полностью. Пишет - * анимация двери (банк 6), читает подъём скелета (банк 1). Word, как в - * оригинале: на уровне 8 в него же СЧИТАЕТСЯ задержка до мыши (см. - * pop_state.c и pop_check_mouse в guards.c). */ -extern uint16_t pop_leveldoor_open; - -/* Отладочная «пустышка» для брейкпоинтов из банков — см. pop_state.c. - * Звать из отлаживаемого места под нужным `if`, брейкпоинт ставить на - * _pop_dbg_trap (резидент W1, адрес однозначен). */ -extern uint8_t pop_dbg_hits; -void pop_dbg_trap(void); - -#endif - -/* Зеркало уровня 4 (jumped_through_mirror, seg003). −1 — Кид ТОЛЬКО ЧТО - * пролетел сквозь зеркало (ставит is_obstacle в pop_map, банк 3), и - * следующий pop_check_mirror родит тень; 0 — обычное состояние. - * Межбанковый: пишет pop_map, читает pop_map же, но через главный цикл. */ -extern int8_t pop_jumped_mirror; - - - -/* ВРЕМЕННО: маркеры фаз кадра (замер). */ -void pop_dbg_m1(void); void pop_dbg_m2(void); -void pop_dbg_m3(void); void pop_dbg_m4(void); - -/* ВРЕМЕННО: состав перерисовок в самом тяжёлом кадре (замер). */ -extern uint8_t pop_dbg_rdmax[10]; -extern uint8_t pop_dbg_rdmax_tot; - -/* ВРЕМЕННО: маркеры внутренних замеров. */ -void pop_dbg_m5(void); void pop_dbg_m6(void); -void pop_dbg_m7(void); void pop_dbg_m8(void); -void pop_dbg_m9(void); void pop_dbg_m10(void); -void pop_dbg_m11(void); void pop_dbg_m12(void); -void pop_dbg_m13(void); void pop_dbg_m14(void); -void pop_dbg_m15(void); -void pop_dbg_kind(uint8_t k); void pop_dbg_m16(void); -void pop_dbg_b1(void); void pop_dbg_b2(void); void pop_dbg_b3(void); -void pop_dbg_b4(void); void pop_dbg_b5(void); void pop_dbg_b6(void); -/* ВРЕМЕННО (разбор pop_phys_tick 2026-08-19, позиция P2a): физика Кида — - * 61 266 тактов на НЕПОДВИЖНОМ персонаже. По одному зонду на звено - * цепочки kid_phys. */ -void pop_dbg_p1(void); void pop_dbg_p2(void); void pop_dbg_p3(void); -void pop_dbg_p4(void); void pop_dbg_p5(void); void pop_dbg_p6(void); -void pop_dbg_p7(void); void pop_dbg_p8(void); -void pop_dbg_wh(uint16_t wh); - -/* ВРЕМЕННО: трасса kidobj (см. pop_state.c). Порядок байт: - * 0 obj_tilepos, 1 frame, 2 action, 3 curr_col, 4 char_col_left, - * 5 char_col_right, 6 char_top_row, 7 char_bottom_row, 8 комната. */ -extern int8_t pop_dbg_obj[9]; -/* ВРЕМЕННО: разбор оверлея падающего куска (см. pop_state.c). */ -extern uint8_t pop_dbg_pass[14]; -extern uint8_t pop_dbg_ovl[14 * 4]; -extern uint8_t pop_dbg_tiles[14]; -void pop_dbg_kidobj(void) __banked; diff --git a/applications/PoP/roomtest/pop_status.c b/applications/PoP/roomtest/pop_status.c deleted file mode 100644 index 98daa86..0000000 --- a/applications/PoP/roomtest/pop_status.c +++ /dev/null @@ -1,585 +0,0 @@ -/* - * pop_status.c — текст в двух служебных полосах экрана, БАНК 9. - * - * Нижняя полоса (та же, где деления HP) — статус-строка оригинала; - * верхняя — наша отладочная. Обе живут ВНЕ игрового поля, поэтому фон у - * них POP_COL_OUTSIDE, а не цвет 0: вспышки (урон, зелья, молния) сделаны - * подменой нулевого цвета палитры, и полосы не должны мигать вместе с - * игрой (pop_ui.h). - * - * ЦЕНА ВЫВОДА — главное ограничение. Блит одного глифа стоит ~4,6 тыс. - * тактов почти независимо от размера (см. memory blit_cost_model): цена - * вызова, а не пикселей. Полная отладочная строка — это полсотни глифов, - * то есть ПОЛКАДРА. Отсюда три правила, на которых держится модуль: - * - * 1. Всё change-driven. Пока показанное не изменилось, не рисуем вовсе - * — за кадр остаётся только сравнение нескольких байт. - * 2. Отладочная строка перерисовывается ПО ПОЛЯМ. Смена комнаты — это - * две цифры (~9 тыс. тактов, 2% кадра), а не вся строка; подписи - * («Level», «, Room», …) не меняются никогда и рисуются лишь при - * полной инвалидации, которая случается на старте уровня, где кадр и - * так тяжёлый. - * 3. Пробелы не блитятся (pop_ui.c): их глиф целиком прозрачен, и на - * строке из полусотни символов это девять сэкономленных блитов. - * - * ГРЯЗЬ СЧИТАЕТСЯ ПО СТРАНИЦАМ, а не счётчиком «осталось два кадра». У - * каждой страницы дабл-буфера своя видео-ОЗУ, и если поля меняются в - * разных кадрах вперемешку, общий счётчик их путает: маска на страницу - * всегда описывает, что именно этой странице ещё должны. - * - * Рисуем прозрачным банком GFX_BANK_TRANSPARENT (не SPRITE): 0xFF шрифта - * не пишется, но ОЗУ-копия обновляется — и текст переживает полностраничные - * копии (вход в комнату, выход из меню), которые берут картинку из тени. - * - * Данных в W2 — 11 байт, и семь из них просто переехали сюда из прежнего - * ярлыка комнаты в roomtest_cold.c. Кода в резиденте не появляется вовсе: - * заявка сообщения — присваивание одного байта, всё остальное здесь. - */ -#include -#include -#include -#include -#include "pop_status.h" -#include "pop_ui.h" -#include "pop_font.h" -#include "pop_bg.h" /* POP_YOFF */ -#include "pop_cdraw.h" /* POP_HP_Y — полосу делим с делениями жизней */ -#include "pop_settings.h" -#include "pop_app.h" /* start_game после 288 тиков молчания */ -#include "pop_state.h" /* pop_immortal */ -#include "pop_level.h" /* pop_current_level */ -#include "pop_pace.h" /* pop_speed_mode */ -#include "pop_timer.h" /* оставшееся время и флаг «пора показать» */ -#include "pop_sfx.h" /* pop_snd_want */ - -/* ---- нижняя полоса: статус-строка -------------------------------------- */ - -/* Как у оригинала: 24 тика (text_time_total = 24) — около двух секунд. */ -#define MSG_TICKS 24 -/* «Висит, пока не снимут»: у оригинала эту роль играет особое значение - * text_time_total (288 у «Press Button», 1188 у copy protection). */ -#define MSG_HOLD 0xFF -/* Базовая линия та же, что у GAME PAUSED (pop_menu.c): строка ниже делений. */ -#define MSG_BASE (POP_YOFF + POP_HP_Y + 8) -#define MSG_TOP (MSG_BASE - POP_FONT_BIG_ASCENT - 2) -#define MSG_BOTTOM (MSG_BASE) - -/* POP_MSG_LEVEL здесь пустой: его строка собирается с номером уровня. */ -static const char * const status_text[POP_MSG_N] = { - "", - "QUICKSAVE", - "NO QUICKSAVE", - "QUICKLOAD", - "NO QUICKLOAD", - "SOUND ON", - "SOUND OFF", - "MUSIC ON", - "MUSIC OFF", - "", /* LEVEL N — собирается с номером */ - "", /* N MINUTES LEFT */ - "", /* N SECONDS LEFT */ - "TIME HAS EXPIRED!", - "Press Button to Continue" -}; - -uint8_t pop_status_msg; /* заявка (пишут откуда угодно) */ -uint8_t pop_status_ticks; /* сколько кадров ещё висит; читает HP */ -static uint8_t st_shown; /* что реально нарисовано */ -static uint8_t st_dirty; /* бит на страницу дабл-буфера */ -static uint8_t st_arg; /* номер уровня для POP_MSG_LEVEL */ - -/* ---- верхняя полоса: отладочная строка --------------------------------- * - * - * Level ##, Room ##, Speed: ..., Sound: ..., Immortal # - * - * Раскладка фиксированная: у каждого поля свой левый край и своя зона - * стирания, поэтому изменение одного значения не трогает соседей. Ширины - * посчитаны по самому длинному значению (FASTEST, OFF, две цифры). */ -#define DBG_BASE 6 /* базовая линия малого шрифта */ -#define DBG_TOP 0 -/* На строку НИЖЕ базовой линии: у малого шрифта 'p' высотой 7 (и ',' — 6) - * свисает под неё, и при стирании ровно до базовой линии от хвоста «p» в - * «Speed:» оставалась одинокая точка. */ -#define DBG_BOTTOM 7 -#define DBG_LEFT 8 -#define DBG_RIGHT 310 - -/* Значения ПРИЖАТЫ ВПРАВО к границе своей зоны, а подпись следующего поля - * начинается сразу за ней. Так запятая всегда стоит вплотную к значению — - * при выравнивании влево она отрывалась бы на всю ширину зоны («Level 1 , - * Room»). Дырка слева от значения при этом крошечная: варианты близки по - * ширине (NORMAL 30 против FASTEST 32, ON 9 против OFF 14). */ -#define X_LBL_LEVEL 10 /* "Level" 10..30 */ -#define R_VAL_LEVEL 44 /* зона 31..43 */ -#define X_LBL_ROOM 44 /* ", Room" 44..70 */ -#define R_VAL_ROOM 84 /* зона 71..83 */ -#define X_LBL_SPEED 84 /* ", Speed:" 84..116 */ -#define R_VAL_SPEED 152 /* зона 117..151 */ -/* Три тумблера подряд — звук, музыка, бессмертие. Подписи сокращены до - * буквы с двоеточием: полные слова («Sound», «Immortal») занимали столько, - * что на музыку места уже не оставалось, а смысл и так читается. */ -#define X_LBL_SOUND 152 /* ", S:" 152..168 */ -#define R_VAL_SOUND 185 /* зона 169..184 */ -#define X_LBL_MUS 185 /* ", M:" 185..201 */ -#define R_VAL_MUS 218 /* зона 202..217 */ -#define X_LBL_IMM 218 /* ", I:" 218..234 */ -#define R_VAL_IMM 245 /* зона 235..244: цифре нужен зазор в пробел */ -/* Оставшееся время ##:## — отдельным полем у правого края, подписи не - * требует: формат читается сам. */ -#define R_VAL_TIME 310 /* зона 284..309 */ -#define W_VAL_TIME 26 - -/* Ширина зоны значения — под самый длинный вариант плюс воздух. */ -#define W_VAL_NUM 13 /* две цифры */ -#define W_VAL_SPEED 35 /* FASTEST */ -#define W_VAL_SOUND 16 /* OFF */ -#define W_VAL_IMM 9 /* одна цифра */ - -enum { /* биты маски «что перерисовать» */ - DBG_F_LEVEL = 0x01, - DBG_F_ROOM = 0x02, - DBG_F_SPEED = 0x04, - DBG_F_SOUND = 0x08, - DBG_F_IMM = 0x10, - DBG_F_TIME = 0x20, - DBG_F_MUS = 0x40, - DBG_F_ALL = 0x7F /* + подписи: см. dbg_labels */ -}; - -static const char * const speed_text[] = { "NORMAL", "FAST", "FASTEST" }; - -static uint8_t dbg_lvl, dbg_room, dbg_spd, dbg_snd, dbg_mus, dbg_imm; -static uint8_t dbg_tmin, dbg_tsec; /* показанное время ##:## */ -static uint8_t dbg_phase; /* кадры до пересчёта секунд */ -static uint8_t dbg_dirty[2]; /* маска по странице; DBG_F_ALL => и подписи */ -static uint8_t dbg_on; /* показанное состояние тумблера Settings */ - -/* ---- общее ------------------------------------------------------------- */ - -static void wipe(int left, int top, int right, int bottom) -{ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - bar(left, top, right, bottom); -} - -/* Число 0..99 БЕЗ ведущего нуля и без ведущего пробела: значение - * выравнивается вправо, а пробел в шрифте имеет ненулевую ширину и сдвинул - * бы цифру влево от границы зоны. Деления нет намеренно: у SDCC z80 один - * «/» стоит ~5,4 тыс. тактов (memory sdcc_z80_division_hoisting), здесь же - * максимум девять вычитаний. */ -static void dec2(uint8_t v, char *buf) -{ - uint8_t t = 0; - while (v >= 10) { v = (uint8_t)(v - 10); t++; } - if (t) { *buf++ = (char)('0' + t); } - buf[0] = (char)('0' + v); - buf[1] = 0; -} - -/* То же, но ВСЕГДА две цифры: часы-минуты без ведущего нуля не читаются. */ -static void dec2z(uint8_t v, char *buf) -{ - uint8_t t = 0; - while (v >= 10) { v = (uint8_t)(v - 10); t++; } - buf[0] = (char)('0' + t); - buf[1] = (char)('0' + v); - buf[2] = 0; -} - -/* ---- нижняя полоса ----------------------------------------------------- */ - -/* Строки с числом собираются вручную: printf сюда не тянем, а число — - * единственное переменное место во всём наборе сообщений. */ -static char *put(char *buf, const char *s) -{ - while (*s) *buf++ = *s++; - return buf; -} - -/* Число ВПЕРЕДИ («12 MINUTES LEFT»), как у оригинала. */ -static void num_text(char *buf, const char *suffix) -{ - dec2(st_arg, buf); - while (*buf) buf++; - *put(buf, suffix) = 0; -} - -static void build_text(char *buf) -{ - if (st_shown == POP_MSG_LEVEL) { - *put(put(buf, "LEVEL "), "") = 0; - dec2(st_arg, buf + 6); - } else if (st_shown == POP_MSG_MINUTES) { - num_text(buf, " MINUTES LEFT"); - } else if (st_arg == 1) { - *put(buf, "1 SECOND LEFT") = 0; - } else { - num_text(buf, " SECONDS LEFT"); - } -} - -/* Стереть полосу сообщения на ТЕКУЩЕЙ странице. Нужна меню: оно пишет в ту - * же полосу своё «GAME PAUSED», а под ним могло остаться сообщение игры - * («60 MINUTES LEFT», «QUICKSAVE») — две надписи ложились друг на друга. */ -void pop_status_wipe(void) __banked -{ - uint8_t saved; - - if (!pop_ui_ready()) return; - saved = gfx_get_bank(); - wipe(POP_STATUS_L, MSG_TOP, POP_STATUS_R, MSG_BOTTOM); - gfx_set_bank(saved); -} - -static void status_draw(void) -{ - char buf[18]; - const char *text; - - wipe(POP_STATUS_L, MSG_TOP, POP_STATUS_R, MSG_BOTTOM); - if (!st_shown) return; - if (st_shown >= POP_MSG_LEVEL && st_shown <= POP_MSG_SECONDS) { - build_text(buf); - text = buf; - } else { - text = status_text[st_shown]; - } - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, (POP_STATUS_L + POP_STATUS_R) / 2, - MSG_BASE, text); - pop_text_unmap(); -} - -/* Заявка сообщения С ЧИСЛОМ. Обычная (байтовая) заявка сравнивает только - * номер сообщения, а здесь меняться может одно лишь число — «12 SECONDS - * LEFT» и «11 SECONDS LEFT» это один и тот же POP_MSG_SECONDS, и по номеру - * их не различить. Поэтому ставим состояние сразу и сами взводим грязь. */ -static void msg_set(uint8_t msg, uint8_t arg, uint8_t ticks) -{ - pop_status_msg = msg; - st_shown = msg; - st_arg = arg; - pop_status_ticks = ticks; - st_dirty = 3; -} - -/* Порт show_level (seg008:25A8). Демо-уровень 0 и номера от 14 не - * показываются вовсе, тринадцатый представляется двенадцатым, а бесшовный - * переход 12->13 молчит — и, как в оригинале, гасит флаг за собой. - * Следом оригинал просит показать и время: за «LEVEL 1» идёт «60 MINUTES - * LEFT», когда первая строка отвисит своё. */ -void pop_status_level(void) __banked -{ - uint8_t n = pop_current_level; - uint8_t quiet = pop_seamless; - - pop_seamless = 0; - if (quiet || n == 0 || n >= POP_LEVEL_LAST) return; - if (n == 13) n = 12; - msg_set(POP_MSG_LEVEL, n, MSG_TICKS); - pop_show_time = 1; -} - -/* Вторая половина show_time (seg008:1812): собственно печать. Флаг - * pop_show_time == 2 означает «перебить текущую строку немедленно» — - * так оригинал ведёт себя в последнюю минуту и после читов времени. */ -static void time_msg(void) -{ - if (!pop_show_time) return; - if (pop_show_time == 2) pop_status_ticks = 0; - else if (pop_status_ticks) return; /* ждём, пока освободится строка */ - pop_show_time = 0; - - if (pop_timer_minutes == 0) { - msg_set(POP_MSG_EXPIRED, 0, MSG_TICKS); - } else if (pop_timer_minutes == 1) { - /* Секунда — 12 тиков; +1 потому, что ticks уже уменьшен. */ - uint8_t sec = (uint8_t)((pop_timer_ticks + 1) / 12); - msg_set(POP_MSG_SECONDS, sec, (uint8_t)(sec == 1 ? 12 : MSG_TICKS)); - } else { - msg_set(POP_MSG_MINUTES, pop_timer_minutes, MSG_TICKS); - } -} - -/* Показать сообщение НЕМЕДЛЕННО, не дожидаясь конца кадра. - * - * Обычный путь (заявка в pop_status_msg + pop_status_frame) печатает строку - * там же, где рисуется кадр, — то есть уже ПОСЛЕ длинной операции. На - * QuickSave это выглядело так: игра замирает на полсекунды, и только потом - * появляется «QUICKSAVE», когда объяснять фриз уже поздно. Здесь строка - * выкладывается сразу, до дисковой работы. - * - * Рисуем в ВИДИМУЮ страницу: игрок смотрит именно на неё, а до следующего - * флипа кадра ещё вся операция. Скрытой странице сообщение остаётся - * должным — её закроет обычный кадровый проход. */ -void pop_status_show_now(uint8_t msg) __banked -{ - uint8_t visible, saved_page, saved_bank; - - pop_status_msg = msg; - if (!pop_ui_ready()) return; /* шрифта нет — останется заявкой */ - st_shown = msg; - pop_status_ticks = (uint8_t)(msg ? MSG_TICKS : 0); - st_dirty = 3; - - visible = (uint8_t)(gfx_get_visible_page() & 1); - saved_page = gfx_get_draw_page(); - saved_bank = gfx_get_bank(); - gfx_set_draw_page(visible); - status_draw(); - /* Бит видимой страницы НЕ снимаем. За время дисковой операции ту же - * страницу успевает переписать восстановление комнаты, и снятый бит - * означал бы «здесь уже нарисовано» — надпись оставалась ровно на одной - * странице и мигала через кадр (поймано на QUICKLOAD). Лишняя - * перерисовка строки стоит дешевле мигания. */ - gfx_set_draw_page(saved_page); - gfx_set_bank(saved_bank); -} - -/* ---- верхняя полоса ---------------------------------------------------- */ - -/* right — граница зоны (первый столбец СЛЕДУЮЩЕЙ подписи), w — её ширина. */ -static void dbg_value(int right, uint8_t w, const char *s) -{ - wipe(right - w, DBG_TOP, right - 1, DBG_BOTTOM); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_right_mapped(POP_TEXT_SMALL, right - 1, DBG_BASE, s); - pop_text_unmap(); -} - -/* Подписи неизменны — рисуем их только при полной перерисовке полосы. */ -static void dbg_labels(void) -{ - wipe(DBG_LEFT, DBG_TOP, DBG_RIGHT, DBG_BOTTOM); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_LEVEL, DBG_BASE, "Level"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_ROOM, DBG_BASE, ", Room"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SPEED, DBG_BASE, ", Speed:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SOUND, DBG_BASE, ", S:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_MUS, DBG_BASE, ", M:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_IMM, DBG_BASE, ", I:"); - pop_text_unmap(); -} - -static void dbg_draw(uint8_t mask) -{ - char buf[6]; - - /* Полная перерисовка стирает всю полосу разом — значит зоны значений - * стирать по второму разу не надо, но нарисовать их всё равно нужно. */ - if (mask == DBG_F_ALL) dbg_labels(); - if (mask & DBG_F_LEVEL) { - dec2(dbg_lvl, buf); - dbg_value(R_VAL_LEVEL, W_VAL_NUM, buf); - } - if (mask & DBG_F_ROOM) { - dec2(dbg_room, buf); - dbg_value(R_VAL_ROOM, W_VAL_NUM, buf); - } - if (mask & DBG_F_SPEED) - dbg_value(R_VAL_SPEED, W_VAL_SPEED, - speed_text[dbg_spd < 3 ? dbg_spd : 0]); - if (mask & DBG_F_SOUND) - dbg_value(R_VAL_SOUND, W_VAL_SOUND, dbg_snd ? "ON" : "OFF"); - if (mask & DBG_F_MUS) - dbg_value(R_VAL_MUS, W_VAL_SOUND, dbg_mus ? "ON" : "OFF"); - if (mask & DBG_F_IMM) { - buf[0] = (char)('0' + (dbg_imm < 10 ? dbg_imm : 9)); - buf[1] = 0; - dbg_value(R_VAL_IMM, W_VAL_IMM, buf); - } - if (mask & DBG_F_TIME) { - dec2z(dbg_tmin, buf); - buf[2] = ':'; - dec2z(dbg_tsec, buf + 3); - dbg_value(R_VAL_TIME, W_VAL_TIME, buf); - } -} - -/* Снимок ДО сравнения — обход sdcc_z80_cmp_store_a_bug: `if (n != s) s = n;` - * SDCC z80 собирает неверно (SUB затирает A, в снимок уезжает разность). */ -static void dbg_scan(uint8_t room) -{ - uint8_t prev_lvl = dbg_lvl, prev_room = dbg_room, prev_spd = dbg_spd; - uint8_t prev_snd = dbg_snd, prev_mus = dbg_mus, prev_imm = dbg_imm; - uint8_t prev_tmin = dbg_tmin, prev_tsec = dbg_tsec; - uint8_t mask = 0; - - /* Часы-минуты: у оригинала rem_min — это НОМЕР идущей минуты, а не - * остаток целых минут (старт 60 при rem_tick 719 = «почти 60:00»), - * поэтому на табло уходит minutes-1 и секунды из тиков. - * - * Секунды — единственное деление на этом пути, поэтому считаем их не - * каждый кадр, а раз в двенадцать (тик секунды у SDLPoP) и вдобавок - * сразу, если минуты изменились (чит времени, загрузка снимка). */ - { - uint8_t mm = (uint8_t)(pop_timer_minutes ? pop_timer_minutes - 1 : 0); - if (dbg_phase) dbg_phase--; - if (!dbg_phase || dbg_tmin != mm) { - dbg_phase = 12; - dbg_tsec = (uint8_t)(pop_timer_minutes ? pop_timer_ticks / 12 : 0); - } - dbg_tmin = mm; - } - - dbg_lvl = pop_current_level; - dbg_room = room; - dbg_spd = pop_speed_mode; - dbg_snd = pop_snd_want; - dbg_mus = pop_mus_want; - dbg_imm = pop_immortal; - if (dbg_lvl != prev_lvl) mask |= DBG_F_LEVEL; - if (dbg_room != prev_room) mask |= DBG_F_ROOM; - if (dbg_spd != prev_spd) mask |= DBG_F_SPEED; - if (dbg_snd != prev_snd) mask |= DBG_F_SOUND; - if (dbg_mus != prev_mus) mask |= DBG_F_MUS; - if (dbg_imm != prev_imm) mask |= DBG_F_IMM; - if (dbg_tmin != prev_tmin || dbg_tsec != prev_tsec) mask |= DBG_F_TIME; - if (mask) { - dbg_dirty[0] |= mask; - dbg_dirty[1] |= mask; - } -} - -/* ---- смерть Кида ------------------------------------------------------- * - * - * Порт play_kid (seg006:1383): вместо авто-респавна по таймеру уровень - * перезапускает сам игрок кнопкой, а строка висит, пока он этого не сделал - * (MSG_HOLD). Авто-рестарт оригинала по истечении 288 тиков нам не нужен: - * он там начинает игру заново, а мы возвращаем на чекпойнт. */ -#define DEAD_SETTLE 7 /* Kid.alive > 6: труп успел лечь */ -#define DEAD_TICKS 288 /* text_time_total у «Press Button» */ -#define DEAD_BLINK 72 /* последние 72 тика строка мигает */ -#define SND_BLINK 38 /* sound_38_blink на каждом появлении */ - -static uint8_t dead_armed; /* всё отпущено — можно принимать нажатие */ - -uint8_t pop_dead_prompt(uint16_t frames) __banked -{ - uint16_t rem; - - if (frames < DEAD_SETTLE) return 0; - if (frames == DEAD_SETTLE) { - msg_set(POP_MSG_PRESS_BUTTON, 0, MSG_HOLD); - pop_show_time = 0; /* иначе поверх ляжет время (seg006:1365) */ - dead_armed = 0; - return 0; - } - - /* Свой отсчёт, а не pop_status_ticks: тот 8-битный, а здесь нужно 288. - * Кадры смерти считает вызывающий, так что хватает вычитания. */ - rem = (uint16_t)(frames - DEAD_SETTLE); - rem = (uint16_t)(rem >= DEAD_TICKS ? 0 : DEAD_TICKS - rem); - if (rem == 0) { - /* Игрок промолчал все 24 секунды — оригинал зовёт start_game(), - * то есть уходит в title, а НЕ перезапускает уровень. Событие - * шлём отсюда: pop_app живёт в этом же банке, и резиденту остаётся - * один break вместо вызова с проверкой. */ - msg_set(POP_MSG_NONE, 0, 0); - (void)pop_app_dispatch(POP_APP_EV_RESTART_INTRO); - return 2; - } - - /* Мигание последних шести секунд: 4 тика видно, 8 нет; на кадре - * появления оригинал перепечатывает строку и играет звук 38. */ - if (rem < DEAD_BLINK) { - uint8_t phase = (uint8_t)(rem % 12); - if (phase > 3) { - if (st_shown) msg_set(POP_MSG_NONE, 0, 0); - } else if (phase == 3 && !st_shown) { - msg_set(POP_MSG_PRESS_BUTTON, 0, MSG_HOLD); - pop_sfx_play(SND_BLINK); - } - } - - /* Рестарт уровня — Enter или Shift (seg000:584 подменяет их на Ctrl+A), - * а не любая клавиша. Esc сюда не попадает: он открывает меню и - * разобран раньше в этом же кадре. - * - * Отпускания оригинал не ждёт, а мы ждём: Shift у нас — клавиша - * действия, и зажатый в момент смерти он перезапустил бы уровень - * мгновенно, не дав прочитать строку. */ - { - uint8_t any = (uint8_t)(kbd_raw_down(KBD_ENTER) || - kbd_raw_down(KBD_LSHIFT) || - kbd_raw_down(KBD_RSHIFT)); - if (!dead_armed) { - dead_armed = (uint8_t)!any; - return 0; - } - if (!any) return 0; - } - dead_armed = 0; - msg_set(POP_MSG_NONE, 0, 0); - return 1; -} - -/* ---- кадровая точка ---------------------------------------------------- */ - -void pop_status_invalidate(void) __banked -{ - st_dirty = 3; - dbg_dirty[0] = DBG_F_ALL; - dbg_dirty[1] = DBG_F_ALL; -} - -void pop_status_frame(uint8_t room) __banked -{ - uint8_t page, bit, saved; - uint8_t want = pop_settings.show_debug_bar; - - if (!pop_ui_ready()) return; - page = (uint8_t)(gfx_get_draw_page() & 1); - bit = (uint8_t)(1 << page); - saved = gfx_get_bank(); - - /* --- нижняя полоса: заявка, таймер, перерисовка --- */ - time_msg(); - if (pop_status_msg != st_shown) { - st_shown = pop_status_msg; - pop_status_ticks = (uint8_t)(!st_shown ? 0 : - (st_shown == POP_MSG_PRESS_BUTTON ? MSG_HOLD - : MSG_TICKS)); - st_dirty = 3; - } else if (pop_status_ticks && pop_status_ticks != MSG_HOLD) { - pop_status_ticks--; - if (!pop_status_ticks) { - /* Оригинал по истечении зовёт erase_bottom_text(1) — снимаем и - * заявку, иначе то же сообщение никогда не покажется снова. */ - pop_status_msg = 0; - st_shown = 0; - st_dirty = 3; - } - } - if (st_dirty & bit) { - status_draw(); - st_dirty = (uint8_t)(st_dirty & ~bit); - } - - /* --- верхняя полоса --- */ - if (want != dbg_on) { - dbg_on = want; - /* Выключили — полосу надо стереть на ОБЕИХ страницах, иначе её - * остаток висел бы до следующей смены комнаты. */ - dbg_dirty[0] = DBG_F_ALL; - dbg_dirty[1] = DBG_F_ALL; - } - if (!want) { - if (dbg_dirty[page]) { - wipe(DBG_LEFT, DBG_TOP, DBG_RIGHT, DBG_BOTTOM); - dbg_dirty[page] = 0; - } - } else { - dbg_scan(room); - if (dbg_dirty[page]) { - dbg_draw(dbg_dirty[page]); - dbg_dirty[page] = 0; - } - } - - gfx_set_bank(saved); -} diff --git a/applications/PoP/roomtest/pop_status.h b/applications/PoP/roomtest/pop_status.h deleted file mode 100644 index f75fef0..0000000 --- a/applications/PoP/roomtest/pop_status.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * pop_status.h — ТЕКСТ в двух служебных полосах экрана (банк 9). - * - * Нижняя (полоса HP) — статус-строка оригинала: порт display_text_bottom - * (seg008:2644) и пары text_time_total/text_time_remaining. Полный - * разбор всех сообщений SDLPoP — ../docs/status_line_text.md. - * Верхняя — наша отладочная строка (была палочками, теперь текст). - * - * ЗАЯВКА — ОДИН БАЙТ. `pop_status_msg` лежит в W2 и пишется откуда - * угодно простым присваиванием: ни трамплина, ни функции. Всё остальное - * (таймер, перерисовка на обеих страницах, шрифт) делает pop_status_frame() - * из банка 9 — один банковый вызов на кадр, рядом с прежним ярлыком - * комнаты. Так в резиденте W1/W2 не появляется ни кода, ни таблиц строк. - */ -#ifndef POP_STATUS_H -#define POP_STATUS_H - -#include - -/* Сообщения нижней полосы. Порядок = таблица строк в pop_status.c. */ -enum { - POP_MSG_NONE = 0, - POP_MSG_QUICKSAVE, /* F6 успешно */ - POP_MSG_NO_QUICKSAVE, /* F6 не удалось */ - POP_MSG_QUICKLOAD, /* F9 успешно */ - POP_MSG_NO_QUICKLOAD, /* F9 нечего грузить / битый слот */ - POP_MSG_SOUND_ON, /* Ctrl+S */ - POP_MSG_SOUND_OFF, - POP_MSG_MUSIC_ON, /* Ctrl+M */ - POP_MSG_MUSIC_OFF, - POP_MSG_LEVEL, /* «LEVEL N» — строка собирается с номером */ - POP_MSG_MINUTES, /* «N MINUTES LEFT» */ - POP_MSG_SECONDS, /* «N SECONDS LEFT» / «1 SECOND LEFT» */ - POP_MSG_EXPIRED, /* «TIME HAS EXPIRED!» */ - POP_MSG_PRESS_BUTTON, /* Кид мёртв — ждём кнопку (висит бессрочно)*/ - POP_MSG_N -}; - -/* Заявка/текущее сообщение. Пишется откуда угодно: 0 — снять строку, - * POP_MSG_* — показать. Повторная заявка того же номера продлевает показ - * только если строка уже погасла (как у оригинала: он тоже сравнивает). */ -extern uint8_t pop_status_msg; - -/* Показать сообщение НЕМЕДЛЕННО, до конца кадра: строка выкладывается в - * видимую страницу прямо сейчас. Нужна там, где сразу за вызовом идёт - * длинная операция (QuickSave/QuickLoad): обычная заявка напечаталась бы - * уже ПОСЛЕ фриза, когда объяснять его поздно. */ -void pop_status_show_now(uint8_t msg) __banked; - -/* Порт show_level (seg008:25A8): заявить «LEVEL N» на старте уровня. - * Сама решает, показывать ли (демо-уровень и финальные номера молчат) — - * вызывающему условий знать не нужно. */ -void pop_status_level(void) __banked; - -/* Сколько логических кадров сообщение ещё висит; 0 — не висит. Читает - * pop_hp_draw (банк 4), чтобы не затирать чужой текст своим фоном. */ -extern uint8_t pop_status_ticks; - -/* Горизонтальные границы ТЕКСТА в полосе HP. Ровно промежуток между - * делениями Кида (слева) и стража (справа) — как rect_bottom_text - * {193,70,202,250} у оригинала. */ -#define POP_STATUS_L 70 -#define POP_STATUS_R 250 - -/* Раз в логический кадр, ПОСЛЕ pop_hp_draw: тик таймера, перерисовка - * нижней строки и обновление верхней отладочной. Всё change-driven — - * пока ничего не менялось, не рисует вовсе. */ -void pop_status_frame(uint8_t room) __banked; - -/* Кид мёртв: показать «Press Button to Continue» и ждать кнопку. frames — - * сколько кадров прошло со смерти (труп должен успеть лечь). Возвращает 1 - * ОДИН раз, когда игрок нажал — вызывающему остаётся перезапустить уровень. - * Логика живёт в банке, потому что резидент W1 переполнен, а зовут её лишь - * в кадрах смерти. - * - * Возвращает: 0 — ждём дальше; 1 — игрок нажал Enter/Shift, перезапустить - * УРОВЕНЬ; 2 — 288 тиков истекли, уйти в title (порт start_game). */ -uint8_t pop_dead_prompt(uint16_t frames) __banked; - -/* Заставить перерисовать ОБЕ страницы: звать после того, как полосы - * затёрли чужим содержимым (вход в комнату, выход из меню). */ -void pop_status_invalidate(void) __banked; - -/* Стереть полосу сообщения на текущей странице (меню пишет туда своё). */ -void pop_status_wipe(void) __banked; - -#endif /* POP_STATUS_H */ diff --git a/applications/PoP/roomtest/pop_tile.c b/applications/PoP/roomtest/pop_tile.c deleted file mode 100644 index da9fdab..0000000 --- a/applications/PoP/roomtest/pop_tile.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * pop_tile.c — общие ЛИСТЬЯ слоя фона: блит куска атласа, чтение тайла - * комнаты, таблица тайлов. РЕЗИДЕНТ W1 (_CODE). - * - * Мотивация раскладки (почему резидент, а не банк) — в шапке pop_tile.h: - * коротко, эти функции и таблицы нужны ОБЕИМ половинам слоя фона (горячей — - * fore-проход каждый кадр, холодной — полная отрисовка комнаты), а код и - * rodata банка видны только пока банк замаплен. W1 замаплено всегда. - */ -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF, POP_PLAYFIELD_H */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include "pop_cdraw.h" /* POP_CD_TOUCH — фон тронут, персонажей перерисовать */ -#include "pop_tile.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_level.h" /* pop_doorlink2 — подстановка нажатой кнопки */ -#include "_pop_draw.h" /* pop_heal_fast */ -#include "_pop_tile.h" /* контракт с холодной половиной (pop_tile_cold.c) */ - -/* ---- Состояние (писучее, _DATA/W2 — видно из любого банка) ---------- */ -atlas_t pop_env[POP_ENV_PAGES], pop_wall_at, pop_fore_at, pop_pot_at; - -/* Загруженный тайлсет: 0 подземелье, 1 дворец (порт tbl_level_type в той - * части, что касается ОТРИСОВКИ). Ставит pop_bg_load; резидент — потому - * что по нему расходятся ветки и в банке 7 (полная отрисовка тайла), и в - * банке 2 (fore-проход), и в банке 3 (модификатор пустой клетки от упавшей - * плиты, remove_loose seg007:0EB8). Читать напрямую, без трамплина. */ -uint8_t pop_palace; - -const uint8_t *pop_t_fg, *pop_t_bg, *pop_t_lfg, *pop_t_lbg; -const uint8_t *pop_t_below, *pop_t_above, *pop_t_abovemod; -uint8_t pop_t_room; -pop_rnd_t pop_t_seed; - -int pop_t_clip_top; -int pop_t_fclip_x0, pop_t_fclip_y0, pop_t_fclip_x1, pop_t_fclip_y1; -/* ТО ЖЕ ОКНО В ЛОГИЧЕСКИХ (неперевёрнутых) координатах. Экранная пара нужна - * для клипа самого блита — он режет уже перевёрнутый прямоугольник; а вот - * ОТСЕВ ТАЙЛОВ идёт по позиции тайла в комнате (63*row + …), и она от - * переворота не зависит. Пока пара была одна, при pop_upside отсев сравнивал - * логический y тайла с зеркальным окном и выбрасывал именно те тайлы, что - * должны лечь ПОВЕРХ персонажа: передняя грань колонны переставала рисоваться - * и Кид оказывался перед ней (найдено пользователем на уровне 9). */ -int pop_t_fclip_ly0, pop_t_fclip_ly1; -uint8_t pop_t_fclip_on; -uint8_t pop_t_bake_rest; - -/* Позиция склянки внутри тайла зелья — поля fore_x/fore_y записи 0x0A той же - * таблицы. Вынесены МАКРОСАМИ (одно место правки, дублирования данных нет): - * пока таблица была `static const`, SDCC сворачивала `tile_table[10].fore_x` - * в константу, но глобальную (её читают оба банка) уже не сворачивает — - * чтение полей в рантайме стоило +150 Б и IX-кадр на 13 локалов. */ -#define POT_FORE_X 2 -#define POT_FORE_Y (-3) - -/* ---- Таблица тайлов (piece, seg008.c:27) --------------------------- */ -const piece pop_tile_table[31] = { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 00 empty */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 01 floor */ - {127, 1, 0, 133, 1, 2, 145, 0, 43, 0, 0, 0}, /* 02 spike */ - { 92, 1, 0, 93, 1, 2, 0, 94, 43, 95, 1, 0}, /* 03 pillar */ - { 46, 1, 0, 47, 1, 2, 0, 48, 43, 49, 3, 0}, /* 04 gate */ - { 41, 1, 1, 35, 1, 3, 145, 0, 36, 0, 0, 0}, /* 05 stuck floor */ - { 41, 1, 0, 42, 1, 2, 145, 0, 96, 0, 0, 0}, /* 06 close button */ - { 46, 1, 0, 0, 0, 2, 0, 0, 43, 49, 3, 0}, /* 07 door top w/floor */ - { 86, 1, 0, 87, 1, 2, 0, 0, 43, 88, 1, 0}, /* 08 big pillar bottom */ - { 0, 0, 0, 89, 0, 3, 0, 90, 0, 91, 1, 3}, /* 09 big pillar top */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 12, POT_FORE_X, POT_FORE_Y}, /* 0A potion */ - { 0, 1, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0}, /* 0B loose floor */ - { 0, 0, 0, 0, 0, 2, 0, 0, 85, 49, 3, 0}, /* 0C door top */ - { 75, 1, 0, 42, 1, 2, 0, 0, 43, 77, 0, 0}, /* 0D mirror */ - { 97, 1, 0, 98, 1, 2, 145, 0, 43,100, 0, 0}, /* 0E debris */ - {147, 1, 0, 42, 1, 1, 145, 0,149, 0, 0, 0}, /* 0F open button */ - { 41, 1, 0, 37, 0, 0, 0, 38, 43, 0, 0, 0}, /* 10 leveldoor left */ - { 0, 0, 0, 39, 1, 2, 0, 40, 43, 0, 0, 0}, /* 11 leveldoor right */ - { 0, 0, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 12 chomper */ - { 41, 1, 0, 42, 1, 2, 0, 0, 43, 0, 0, 0}, /* 13 torch */ - { 0, 0, 0, 1, 1, 2, 0, 2, 0, 0, 0, 0}, /* 14 wall */ - { 30, 1, 0, 31, 1, 2, 0, 0, 43, 0, 0, 0}, /* 15 skeleton */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 16 sword */ - { 41, 1, 0, 10, 0, 0, 0, 11, 43, 0, 0, 0}, /* 17 balcony left */ - { 0, 0, 0, 12, 1, 2, 0, 13, 43, 0, 0, 0}, /* 18 balcony right */ - { 92, 1, 0, 42, 1, 2, 145, 0, 43, 95, 1, 0}, /* 19 lattice pillar */ - { 1, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0,-53}, /* 1A lattice down */ - { 3, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1B lattice small */ - { 4, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1C lattice left */ - { 5, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1D lattice right */ - { 97, 1, 0, 98, 1, 2, 0, 0, 43,100, 0, 0}, /* 1E debris w/torch */ -}; - -/* Деление координаты на ширину тайла ТАБЛИЦЕЙ (tile_div_tbl/tile_mod_tbl, - * seg006:702/23A6) — как в оригинале. Живут в резиденте, потому что нужны - * и карте (банк 3, колонка персонажа), и слою фона (банк 2, футпринт), а - * const-таблицу чужого банка не прочитать. - * - * Почему не деление: SDCC разворачивает / и % в __divsint + __modsint, - * причём __modsint внутри снова зовёт __divsint — замер в MAME дал 5 400 - * тактов на один вызов при 13+ вызовах за кадр. Индекс — координата как - * есть (0..255), смещение -58 уже внутри значений: POP_TILE_DIV[x] = - * floor((x - 58) / 14), POP_TILE_MOD[x] — остаток. Сверено с SDLPoP - * побайтно. */ -const int8_t POP_TILE_DIV[256] = { - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, -}; -const uint8_t POP_TILE_MOD[256] = { - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, -}; - -const uint8_t POP_COL_XH[10] = {0, 4, 8, 12, 16, 20, 24, 28, 32, 36}; -const uint8_t POP_WALL_FRAM_BOTTOM[4] = {7, 9, 5, 3}; -const uint8_t POP_WALL_FRAM_MAIN[4] = {8, 10, 6, 4}; -const uint8_t POP_SPIKES_FRAM_LEFT[10] = {0, 128, 129, 130, 131, 132, 131, 129, 128, 0}; -const uint8_t POP_LOOSE_FRAM_LEFT[12] = {41,69,41,70,70,41,41,41,70,70,70,0}; -const uint8_t POP_LOOSE_FRAM_BOTTOM[12] = {43,73,43,74,74,43,43,43,74,74,74,0}; - -/* ---- Чомпер: номер позы и передние куски (seg008 chomper_fram1/for) --- - * Резидент, а не банк: позу считает и полная отрисовка тайла (холодная - * половина, pop_room.c), и fore-проход поверх персонажа (горячая, - * pop_bg.c) — а const-таблица банка из чужого банка не читается вовсе. */ -static const uint8_t CHOMP_FRAM1[7] = {3, 2, 0, 1, 4, 3, 3}; -const uint8_t POP_CHOMP_FRAM_FOR[5] = {106, 107, 108, 109, 110}; - -uint8_t pop_chomp_pose(uint8_t modif) -{ - uint8_t m = (uint8_t)(modif & 0x7F); - /* В ЗАПЕЧКЕ — поза ПОКОЯ, по той же причине, что у плиты и пик: фаза - * челюстей транзиентна. Покой и есть фаза 0 (она же 6, на которой - * animate_chomper снимает trob): CHOMP_FRAM1[0] == CHOMP_FRAM1[6]. */ - if (pop_t_bake_rest) m = 0; - else if (m > 6) m = 6; - return CHOMP_FRAM1[m]; -} - -/* get_loose_frame (seg008:761): индекс дрожащего кадра по модификатору. - * В режиме ЗАПЕЧКИ фона отдаёт кадр ПОКОЯ — транзиентный кадр нельзя - * консервировать в ОЗУ-копию (см. pop_t_bake_rest в pop_bg.c). */ -uint8_t pop_loose_frame(uint8_t m) -{ - if (pop_t_bake_rest) return 0; - if (m & 0x80) { m &= 0x7F; if (m > 10) return 1; } - return m; -} - -/* Кадр пик по их модификатору: 1..4 — выдвижение, 0x80|n — «вышли целиком» - * (один кадр 5), 6..8 — уход. Как и у плиты, в режиме ЗАПЕЧКИ отдаёт кадр - * ПОКОЯ (0 = пик не видно): выдвинутая пика — транзиент, её место в ОЗУ-копии - * фона делает heal вечным (BUG-SPIKE-BAKED, см. BUGS_CLOSED.md). - * - * Отдельная функция, а не `(m & 0x80) ? 5 : m` по месту: считают кадр ЧЕТЫРЕ - * слоя (draw_tile_anim, draw_tile_anim_right соседа, fore-проход и - * mid-оверлей), и одного забытого хватило, чтобы пики законсервировались. */ -uint8_t pop_spike_frame(uint8_t m) -{ - if (pop_t_bake_rest) return 0; - return (uint8_t)((m & 0x80) ? 5 : m); -} - -/* ---- «Фон трогали ВОТ ЗДЕСЬ» (DRAW-COST; контракт — pop_cdraw.h) ----- * - * - * Метка — БИТОВАЯ МАСКА ТАЙЛОВ, по слову на ряд и по набору на страницу. - * Раньше здесь лежал ОДИН union-прямоугольник на страницу, и это убивало - * пропуск перерисовки персонажа: три факела комнаты трогают по пятнышку - * 16x18 в колонках 1, 6 и 8, а их объединение — полоса x 40..280 на всю - * комнату. Кид, стоящий где угодно между крайними факелами, попадал в неё - * и перерисовывался каждый кадр со всем fore-проходом (замер: циан 231 829 - * тактов против 20 071, период 4 растровых кадра против 3). - * - * ГРАНУЛЯРНОСТЬ: колонка 32 px по горизонтали, ТОЧНЫЙ диапазон y по - * вертикали. Раньше по вертикали стоял номер ряда (три полосы по 63 px), и - * это склеивало касания, разнесённые внутри ряда. Найдено пользователем на - * сцене 11/15 (2026-08-19): пламя факела занимает y 5..22, клинок стоящего - * стража — y 31..37, между ними девять пикселей чистого зазора, а метка - * считала слот задетым, потому что оба попадают в ряд 0 и колонку 7. - * Стоило это 148 302 такта в кадр — 23 % работы — на перерисовку персонажа, - * которого никто не трогал. - * - * Почему диапазон, а не более мелкие полосы: полосы по 16 px эту пару всё - * равно склеивают (пламя кончается в полосе 1, клинок в ней же начинается), - * а 8-пиксельные потребовали бы 24 маски на страницу. Пара ymin/ymax на - * колонку — 40 байт на обе страницы, точнее любых полос и без битовой возни. - * - * У ОРИГИНАЛА такой метки нет вовсе: и Apple II (FRAMEADV.S RedBlockFast с - * шестью буферами wipebuf/redbuf/movebuf/floorbuf/halfbuf/objbuf), и SDLPoP - * (set_redraw_fore в redraw_at_char) метят ЦЕЛЫМИ тайлами, но им это не - * мешает — персонаж у них рисуется каждый кадр безусловно, а пометки нужны - * только фону. Пропуск неизменившегося персонажа — наша добавка, поэтому и - * точность метки нужна выше оригинальной. См. docs/impl_diff.md. */ -uint8_t pop_cd_dirty; -/* [страница][колонка] — диапазон затронутых экранных y. Пусто = ymin > ymax - * (заполняется как ymin = 255, ymax = 0). */ -uint8_t pop_cd_ymin[2][10], pop_cd_ymax[2][10]; - -/* CD_LOW, cd_row_of и cd_cols_of СНЯТЫ вместе с переходом на диапазон y: - * колонка теперь считается прямым сдвигом (x >> 5), а вертикаль сравнением - * отрезков — битовые маски больше не нужны. */ - -/* Обе страницы помечаются сразу (персонаж чинится на каждой в свой кадр), - * поэтому цикл развёрнут: индекс-переменная заставляла SDCC считать адрес - * каждой ячейки сложением. Зовётся с КАЖДОГО блита фона. */ -/* Пакетная пометка (pop_cd_batch_begin/end). Один тайл рисуется пятью-шестью - * спрайтами, и каждый звал pop_cd_touch со своими четырьмя 16-битными - * аргументами — 2 866 тактов на спрайт, 15% всей цены блита (замер - * 2026-08-13). В пакете спрайты копят ОБЩИЙ прямоугольник, а настоящая - * пометка ставится одна на тайл. - * - * Объединение ЗАГРУБЛЯЕТ прямоугольник (накрывает и то, чего между кусками - * не касались), и это безопасно ровно в одну сторону: лишняя пометка стоит - * лишней перерисовки персонажа, пропущенная — стёртого и не восстановленного - * персонажа. Практически загрубление почти нулевое: все куски одного тайла - * и так лежат в тех же 1-2 колонках сетки 32px и том же ряду. */ -uint8_t pop_cd_batch; -static int cdb_x0, cdb_y0, cdb_x1, cdb_y1; - -void pop_cd_batch_begin(void) -{ - pop_cd_batch = 1; - cdb_x0 = cdb_y0 = 32767; - cdb_x1 = cdb_y1 = -32768; -} - -void pop_cd_batch_end(void) -{ - pop_cd_batch = 0; /* СНАЧАЛА снять: ниже настоящий вызов */ - if (cdb_x1 >= cdb_x0 && cdb_y1 >= cdb_y0) - pop_cd_touch(cdb_x0, cdb_y0, cdb_x1 - cdb_x0 + 1, cdb_y1 - cdb_y0 + 1); -} - -/* Подавление на серию блитов — см. шапку в pop_cdraw.h. Отдельным значением - * того же флага, а не вторым флагом: у pop_cd_touch тогда остаётся ОДНА - * проверка на общем пути. */ -#define CD_BATCH_MUTE 2 - -void pop_cd_mute(void) { pop_cd_batch = CD_BATCH_MUTE; } -void pop_cd_unmute(void) { pop_cd_batch = 0; } - -void pop_cd_touch(int x, int y, int w, int h) -{ - if (pop_cd_batch) { /* копим, не разбирая на колонки/ряды */ - if (pop_cd_batch == CD_BATCH_MUTE) return; /* область помечена вызывающим */ - int x1 = x + w - 1, y1 = y + h - 1; - if (x < cdb_x0) cdb_x0 = x; - if (y < cdb_y0) cdb_y0 = y; - if (x1 > cdb_x1) cdb_x1 = x1; - if (y1 > cdb_y1) cdb_y1 = y1; - return; - } - { - int8_t c0, c1, c; - uint8_t y0, y1; - int xr = x + w - 1; - if (xr < 0 || x > 319) return; /* весь прямоугольник вне поля */ - if (x < 0) x = 0; - if (xr > 319) xr = 319; - c0 = (int8_t)(x >> 5); - c1 = (int8_t)(xr >> 5); - /* Клип по вертикали: экранные y не выходят за байт, а всё, что выше - * поля или ниже его, персонажам всё равно не принадлежит. */ - if (y < 0) y = 0; - if (y > 255) return; - y0 = (uint8_t)y; - y1 = (y + (int)h - 1 > 255) ? 255 : (uint8_t)(y + h - 1); - /* Страницы обновляются НЕЗАВИСИМО. Общее условие по странице 0 - * («если ей стало теснее — записать в обе») ломается сразу после - * pop_cd_clear(0): страница 1 хранит свои старые границы, условие по - * нулевой уже не выполняется, и её метка перестаёт расти. */ - for (c = c0; c <= c1; c++) { - if (y0 < pop_cd_ymin[0][c]) pop_cd_ymin[0][c] = y0; - if (y1 > pop_cd_ymax[0][c]) pop_cd_ymax[0][c] = y1; - if (y0 < pop_cd_ymin[1][c]) pop_cd_ymin[1][c] = y0; - if (y1 > pop_cd_ymax[1][c]) pop_cd_ymax[1][c] = y1; - } - } - pop_cd_dirty = 3; -} - -/* Задел ли прямоугольник (ЭКРАННЫЕ координаты, x1/y1 ВКЛЮЧИТЕЛЬНО) то, что - * трогали на странице p. Резидент: зовёт pop_cdraw.c из банка 4 прямым - * вызовом, без трамплина. */ - -/* ---- Блит куска атласа ---------------------------------------------- */ -/* Клипованный путь — ОТДЕЛЬНОЙ функцией. У него девять 16-битных локалей, - * и SDCC заводит под них кадр IX; пока он жил в общем теле, за этот кадр - * платили и блиты БЕЗ клипа (`ld -n(ix)` = 19 тактов номинала, у нас ~46). - * А блитов без клипа большинство: весь фон вне fore-прохода — факелы, зелья, - * перерисовка тайлов — идёт с pop_t_fclip_on == 0. */ -#define FLIP_TOP(top, h) POP_FLIP_TOP(top, h) /* формула — в pop_bg.h */ - - -/* Клипованный путь блита. Габарит и смещения внутри куска — БАЙТЫ, а вся - * рабочая переменная — file-scope, НЕ локали. - * - * Корректность байтового габарита по построению: кадры наших атласов не - * крупнее 56x63 (просканированы все 109 .atl, docs/perf_l13_room23.md §5), а - * кадр больше 255 в pop_blit_b уходит в blit_b_oversize и сюда не попадает. - * - * Зачем file-scope: с локалями SDCC заводил 22-байтовый стековый кадр и 211 - * обращений `-N(ix)` — при ~46 замеренных тактах на обращение это ~9 700 - * такта из 14 088 цены клипованного блита (замер 2026-08-17, - * docs/perf_green_phase.md §1.6). Одного байтового габарита НЕ ХВАТИЛО: - * кадр остался, обращений стало 173 — значений, живых через шесть вызовов - * ядер libbgi, всё равно больше, чем регистров у Z80. С file-scope - * спиливать нечего, а адресация абсолютная (13 тактов против 19). - * Тот же приём и по той же причине применён к draw_tile (pop_room.c). - * - * Реентерабельности не было и не требуется: единственный вызывающий — - * pop_blit_b, и он себя не зовёт. - * - * Арифметика клипа считается в int16 (bc_d), в байт уходит только результат — - * иначе вычитание ушло бы в перенос по модулю 256. */ -static const uint8_t *bc_img; -static int bc_dx, bc_dy; -static int16_t bc_d; -static uint8_t bc_w, bc_h, bc_dw, bc_dh, bc_sx, bc_sy; - -void blit_b_clip(const uint8_t *img, int x, int top, uint8_t w, uint8_t h) -{ - bc_img = img; bc_w = w; bc_h = h; - bc_dx = x; bc_dy = top; - bc_dw = w; bc_dh = h; bc_sx = 0; bc_sy = 0; - if (!pop_upside) { - if (pop_t_clip_top && bc_dy < pop_t_clip_top) { /* полоса у потолка */ - bc_d = (int16_t)(pop_t_clip_top - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)bc_d; bc_dy = pop_t_clip_top; - bc_dh = (uint8_t)(bc_dh - bc_sy); - } - } else { - /* ПЕРЕВОРОТ: то, что в обычном виде торчало ВЫШЕ поля (полоса кладки - * у потолка), теперь торчит НИЖЕ него — и без обрезки лезет в борт, - * где живёт полоса HP (баг «мусор ниже 192», найден пользователем). - * Режем по границам поля ВСЕГДА, а не по pop_t_clip_top: зеркальный - * спрайт может вылезти и там, где в обычном виде клип не ставили. */ - if (bc_dy < POP_YOFF) { - bc_d = (int16_t)(POP_YOFF - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)bc_d; bc_dy = POP_YOFF; - bc_dh = (uint8_t)(bc_dh - bc_sy); - } - if (bc_dy + bc_dh > POP_CLIP_BOTTOM) { - bc_d = (int16_t)(POP_CLIP_BOTTOM - bc_dy); - if (bc_d <= 0) return; - bc_dh = (uint8_t)bc_d; - } - } - if (pop_t_fclip_on) { /* окно fore-слоя / перерисовки */ - if (bc_dx < pop_t_fclip_x0) { - bc_d = (int16_t)(pop_t_fclip_x0 - bc_dx); - if (bc_d >= (int16_t)bc_dw) return; - bc_sx = (uint8_t)(bc_sx + (uint8_t)bc_d); - bc_dx += bc_d; bc_dw = (uint8_t)(bc_dw - (uint8_t)bc_d); - } - if (bc_dy < pop_t_fclip_y0) { - bc_d = (int16_t)(pop_t_fclip_y0 - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)(bc_sy + (uint8_t)bc_d); - bc_dy += bc_d; bc_dh = (uint8_t)(bc_dh - (uint8_t)bc_d); - } - if (bc_dx + bc_dw > pop_t_fclip_x1) { - bc_d = (int16_t)(pop_t_fclip_x1 - bc_dx); - if (bc_d <= 0) return; - bc_dw = (uint8_t)bc_d; - } - if (bc_dy + bc_dh > pop_t_fclip_y1) { - bc_d = (int16_t)(pop_t_fclip_y1 - bc_dy); - if (bc_d <= 0) return; - bc_dh = (uint8_t)bc_d; - } - } - if (!bc_dw || !bc_dh) return; - /* ПЕРЕВОРОТ: экранная строка (dy+i) берёт источник (h-1-i), поэтому - * обрезка СВЕРХУ экрана съедает НИЖНИЕ строки источника. В терминах - * куска источника это sy' = h - sy - dh (при обрезке только сверху даёт - * 0, при обрезке только снизу — верхний край). */ - /* Проверки `dw < 256 && dh < 256 && w < 256` убраны как тождественные: - * это уже байты. */ - if (pop_upside) { - bc_d = (int16_t)bc_h - (int16_t)bc_sy - (int16_t)bc_dh; - if (bc_d < 0) bc_d = 0; - if (bc_dx >= 0 && bc_dy >= 0 && - bc_dx + bc_dw <= 320 && bc_dy + bc_dh <= 256) - gfx_blit_part_noclip_vflip(bc_dx, bc_dy, bc_img, bc_sx, - (uint8_t)bc_d, bc_dw, bc_dh); - else - gfx_blit_part_vflip(bc_dx, bc_dy, bc_img, bc_sx, - (uint8_t)bc_d, bc_dw, bc_dh); - } else - if (bc_dx >= 0 && bc_dy >= 0 && - bc_dx + bc_dw <= 320 && bc_dy + bc_dh <= 256) { - if (bc_sx == 0 && bc_sy == 0 && bc_dw == bc_w && bc_dh == bc_h) - gfx_blit_noclip(bc_dx, bc_dy, bc_img); - else - gfx_blit_part_noclip(bc_dx, bc_dy, bc_img, bc_sx, bc_sy, - bc_dw, bc_dh); - } else { - gfx_blit_part(bc_dx, bc_dy, bc_img, bc_sx, bc_sy, bc_dw, bc_dh); - } - /* Кусок ФОНА лёг туда, где может лежать уже нарисованный персонаж — - * пометить область (DRAW-COST, pop_cdraw.h). Признак «это не fore-проход - * поверх персонажа» — окно клипа: его ставит только он. */ - if (!pop_t_fclip_on) pop_cd_touch(bc_dx, bc_dy, bc_dw, bc_dh); -} - -/* Кадр шире или выше 255 — общий (медленный) путь. Вынесен отдельно, чтобы - * 16-битная арифметика габарита не жила ни в горячем pop_blit_b, ни в - * blit_b_clip (у того габарит теперь БАЙТОВЫЙ, см. его шапку). У нас таких - * кадров в игровом кадре нет вовсе (максимум 56x63), но контракт формата - * .atl их допускает, а интро/финал такие подложки принесут (320x200) — - * см. docs/perf_l13_room23.md §5. - * - * Клипа полосы у потолка и окна перерисовки здесь нет намеренно: такой кадр - * — полноэкранная подложка, ей ни то, ни другое не адресовано; за клип по - * экрану отвечает само ядро gfx_blit_part. */ -static void blit_b_oversize(const uint8_t *img, int x, int ybottom) -{ - uint16_t w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - uint16_t h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - int top = ybottom - (int)h + 1 + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - if (!w || !h) return; - gfx_blit_part(x, top, img, 0, 0, (int)w, (int)h); - if (!pop_t_fclip_on) pop_cd_touch(x, top, (int)w, (int)h); -} - -/* Рабочие переменные pop_blit_b — file-scope, не локали и не стековые - * аргументы (см. пролог функции). Реентерабельности нет и не требуется: - * pop_blit_b себя не зовёт, а blit_b_clip держит СВОЙ набор (bc_*). */ -static atlas_t *pb_a; -static uint8_t pb_idx, pb_w, pb_h; -static int pb_x, pb_yb, pb_top; -static const uint8_t *pb_img; - -void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча, см. pop_pace.h */ - /* Аргументы сразу в file-scope: третий и дальше SDCC передаёт СТЕКОМ, и - * дальше каждое их чтение — `-N(ix)` (замер 2026-08-17: 76 таких - * обращений в теле, ~3 500 такта из 14 500 цены блита). То же лечение, - * что у draw_tile и blit_b_clip. */ - pb_a = a; pb_idx = idx; pb_x = x; pb_yb = ybottom; - if (pb_idx >= pb_a->count) - return; - /* Грубый отсев ДО маппинга страницы: реальные pb_w/pb_h лежат в заголовке - * ленты, то есть в EMM-странице, и чтобы их прочитать, надо сделать - * gfx_w0_map. Берём заведомо больший габарит (кадры фона не крупнее - * 64×64) и, если он не задевает окно, уходим не заплатив ни за - * atlas_image, ни за map/unmap. */ - if (pop_t_fclip_on && - (pb_x >= pop_t_fclip_x1 || pb_x + 64 <= pop_t_fclip_x0 || - pb_yb + POP_YOFF + 1 <= pop_t_fclip_ly0 || - pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1)) - return; - pb_img = (const uint8_t *)atlas_image(pb_a, pb_idx); - gfx_w0_map(pb_a->page); - /* Габарит читаем БАЙТАМИ. С `uint16_t pb_w = pb_img[0] | (pb_img[1] << 8)` SDCC - * разворачивал каждую такую строку в два десятка IX-относительных - * пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком - * уезжала в стековый кадр (пролог `ld iy,#-14 / add iy,sp / ld sp,iy`, - * дальше всё через -N(ix) по 19 тактов). Замер 2026-08-13: до вызова - * ядра блита уходило ~6 700 тактов при том, что работы там — прочитать - * четыре байта заголовка и сравнить границы. - * Байтовый габарит корректен по построению: обе ветки ниже И ТАК требуют - * pb_w < 256 && pb_h < 256 (иначе ядро не примет), а кадры наших атласов не - * крупнее 32x63. Формат .atl допускает больше — такой кадр уходит на - * общий путь выше. */ - if (pb_img[1] | pb_img[3]) { /* кадр больше 255 — редкий путь */ - blit_b_oversize(pb_img, pb_x, pb_yb); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); - return; - } - pb_w = pb_img[0]; - pb_h = pb_img[2]; - pb_top = pb_yb - (int)pb_h + 1 + POP_YOFF; /* +YOFF: центрирование */ - /* Переворот применяем ЗДЕСЬ, до клипа: дальше вся геометрия (окно - * fore-слоя, полоса у потолка, отсев по экрану) считается уже в - * экранных координатах результата. */ - if (pop_upside) pb_top = FLIP_TOP(pb_top, pb_h); - if (pb_w && pb_h) { - if (!pop_t_fclip_on && !pop_t_clip_top) { - /* БЫСТРЫЙ путь: клипа нет вовсе. Так идут все блиты фона вне - * fore-прохода. Линейное ядро без клипа — ~2.9× быстрее общего - * (замер: 4617 против 13288 тактов на спрайт 32×3; gfx_blit - * платит за клип/16-бит/split, а не за пиксели). W3-скобку - * ставит сама libbgi: из кода с --w3 её вызывать нельзя. */ - /* В перевёрнутом виде быстрый путь годится, только если спрайт - * целиком внутри поля: иначе он залезет в борт (см. blit_b_clip). */ - if (pop_upside && (pb_top < POP_YOFF || pb_top + (int)pb_h > POP_CLIP_BOTTOM)) { - blit_b_clip(pb_img, pb_x, pb_top, pb_w, pb_h); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); - return; - } - /* pb_w<256 && pb_h<256 больше не проверяем — гарантировано типом. */ - /* «Целиком на экране?» — ДВУМЯ беззнаковыми сравнениями вместо - * четырёх знаковых. Отрицательная координата в беззнаковом виде - * становится очень большой и проваливает то же условие, что - * проверка `>= 0`, а верхняя граница переносится в правую часть, - * так что сложение уходит вместе с ней. Знаковое сравнение у - * SDCC z80 стоит дорого: пара `sbc` плюс `jp PO / xor 0x80 / jp P` - * на каждое (видно в листинге). - * - * Границы правой части неотрицательны по построению: pb_w и pb_h - * не больше 255, значит 320-pb_w >= 65 и 256-pb_h >= 1. */ - if ((unsigned int)pb_x <= (unsigned int)(320 - (int)pb_w) && - (unsigned int)pb_top <= (unsigned int)(256 - (int)pb_h)) { - if (pop_upside) gfx_blit_noclip_vflip(pb_x, pb_top, pb_img); - else gfx_blit_noclip(pb_x, pb_top, pb_img); - } else { - if (pop_upside) gfx_blit_part_vflip(pb_x, pb_top, pb_img, 0, 0, (int)pb_w, (int)pb_h); - else gfx_blit_part(pb_x, pb_top, pb_img, 0, 0, (int)pb_w, (int)pb_h); - } - pop_cd_touch(pb_x, pb_top, (int)pb_w, (int)pb_h); - } else { - blit_b_clip(pb_img, pb_x, pb_top, pb_w, pb_h); - } - } - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); -} - -void pop_env_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_env[id >> POP_ENV_SHIFT], (uint8_t)(id & POP_ENV_MASK), x, yb); } -void pop_wall_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_wall_at, id, x, yb); } -void pop_fore_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_fore_at, id, x, yb); } -void pop_pot_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_pot_at, id, x, yb); } - - - -/* ---- Чтение тайла отрисованной комнаты ------------------------------ */ -uint8_t pop_tile_code(int row, int col) -{ - if (col < 0) { - if (pop_t_lfg && row >= 0 && row < 3) return pop_t_lfg[row]; - return 20; /* уровневая кромка = стена */ - } - if (row < 0) { /* верхняя полоса: ряд 2 комнаты сверху */ - if (row == -1 && pop_t_above && col < 10) return pop_t_above[col]; - return 1; /* нет комнаты сверху → пол (кромка) */ - } - if (row > 2 || col > 9) return 20; - return pop_t_fg[row * 10 + col]; -} - -uint8_t pop_tile_mod(int row, int col) -{ - if (col < 0) { - if (pop_t_lbg && row >= 0 && row < 3) return pop_t_lbg[row]; - return 0; - } - if (row == -1 && pop_t_abovemod && col < 10) return pop_t_abovemod[col]; - if (row < 0 || row > 2 || col > 9) return 0; - return pop_t_bg[row * 10 + col]; -} - -/* Порт подстановки нажатой кнопки из get_tile_to_draw (seg008:240): opener → - * floor, closer → stuck, когда таймер связи > 1. Любой слой, который - * выбирает ветку отрисовки по типу тайла, обязан смотреть на ПОДСТАВЛЕННЫЙ - * тип (иначе кнопка, на которой стоит Kid, ведёт себя как «не пол» — напр. - * climb-оверлей уходил в draw_other_overlay и закрашивал Kid целым тайлом - * вместо узкой кромки floor_left_overlay). */ -uint8_t pop_tile_code_drawn(int row, int col) -{ - uint8_t code = pop_tile_code(row, col); - if (code == 0x0F) { if ((pop_doorlink2(pop_tile_mod(row, col)) & 0x1F) > 1) code = 1; } - else if (code == 0x06) { if ((pop_doorlink2(pop_tile_mod(row, col)) & 0x1F) > 1) code = 5; } - return code; -} - -uint8_t pop_wall_modifier(int row, int col) -{ - uint8_t lw = (col > 0) ? (pop_tile_code(row, col - 1) == 20) : 1; - uint8_t rw = (col < 9) ? (pop_tile_code(row, col + 1) == 20) : 1; - if (lw && rw) return 3; /* WWW */ - if (lw) return 2; /* WWS */ - if (rw) return 1; /* SWW */ - return 0; /* SWS */ -} - - -/* Окно fore-клипа: ставит тот, кто нарисовал персонажа (pop_cdraw, банк 4), - * читает blit_b. Резидент — чтобы вызов из банка шёл без трамплина. */ -void pop_fore_set_clip(int x, int y, int w, int h) -{ - pop_t_fclip_x0 = x; pop_t_fclip_y0 = y; - pop_t_fclip_x1 = x + w; pop_t_fclip_y1 = y + h; - if (pop_upside) { /* вернуть окно в неперевёрнутый вид */ - pop_t_fclip_ly0 = 2 * POP_YOFF + POP_PLAYFIELD_H - (y + h); - pop_t_fclip_ly1 = 2 * POP_YOFF + POP_PLAYFIELD_H - y; - } else { - pop_t_fclip_ly0 = y; pop_t_fclip_ly1 = y + h; - } -} - diff --git a/applications/PoP/roomtest/pop_tile.h b/applications/PoP/roomtest/pop_tile.h deleted file mode 100644 index 8de2a70..0000000 --- a/applications/PoP/roomtest/pop_tile.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * pop_tile.h — ОБЩИЕ ЛИСТЬЯ отрисовки фона: блит куска атласа, чтение тайла - * комнаты, таблица тайлов. Внутренний заголовок слоя фона, НЕ публичный - * API (публичный — pop_bg.h). - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ РЕЗИДЕНТНЫЙ МОДУЛЬ (pop_tile.c в _CODE / W1), а не часть - * банка 2. Слой фона режется надвое: горячая половина (fore-проход поверх - * персонажей, каждый кадр) и холодная (полная отрисовка комнаты и точечные - * перерисовки тайлов, раз на комнату/событие). Обе половины зовут одни и те - * же листья — blit_b, tile_code, tile_table. Разложить их по банкам нельзя: - * - * - код в чужом банке зовётся ТОЛЬКО через трамплин (по `__banked` в - * объявлении), и пометка бьёт по ВСЕМ вызывающим, включая горячих; - * - `const`-таблицы банка лежат в его СТРАНИЦЕ (0xC000+) и видны, лишь - * пока банк замаплен — из другого банка их не прочитать вовсе; - * - дублировать листья в оба банка — лишние килобайты и два места правки. - * - * Резидент W1 замаплен ВСЕГДА, поэтому и горячая, и холодная половина зовут - * их обычным `call` без трамплина, а таблицы читают напрямую. Тот же приём, - * что у pop_heal_fast (pop_draw.c) и pop_sword_draw (pop_kid.c). - * - * ПИСУЧИЕ глобалы (атласы, указатели на комнату, окно клипа) лежат в _DATA - * (W2) и видны отовсюду независимо от банка — они здесь ради одного места - * определения, а не ради доступности. - */ -#ifndef POP_TILE_H -#define POP_TILE_H - -#include -#include -#include "pop_geom.h" /* pop_rnd_t — сид кладки комнаты */ - -/* ---- Атласы фона (прямая адресация id) ------------------------------ * - * env[id>>POP_ENV_SHIFT] idx id&POP_ENV_MASK — chtab_6 environment; - * wall — chtab_7; fore — передний слой; pot — chtab_1 (зелья, меч). - * Раскладка и число страниц — из pop_bg_atlas.h (генерит упаковщик). - * Тайлсетов ДВА (подземелье/дворец), но раскладка id у них общая: - * подменяются только файлы и 32 записи палитры (см. pop_bg_set_tileset). */ -#include "pop_bg_atlas.h" -extern atlas_t pop_env[POP_ENV_PAGES], pop_wall_at, pop_fore_at, pop_pot_at; - -/* Загруженный тайлсет: 0 подземелье, 1 дворец. Ставит pop_bg_load. По нему - * расходится с десяток веток отрисовки (seg008) и модификатор пустой клетки - * от упавшей плиты (seg007:0EB8). */ -extern uint8_t pop_palace; - -/* ---- Текущая отрисованная комната ----------------------------------- * - * fg — foretable-коды, bg — модификаторы; lfg/lbg — правый столбец ЛЕВОГО - * соседа (кромка); below — ряд 0 комнаты снизу (11 байт, см. pop_bg.h); - * above/abovemod — ряд 2 комнаты сверху (полоса кладки у потолка). */ -extern const uint8_t *pop_t_fg, *pop_t_bg, *pop_t_lfg, *pop_t_lbg; -extern const uint8_t *pop_t_below, *pop_t_above, *pop_t_abovemod; -extern uint8_t pop_t_room; /* номер комнаты — зерно раскладки стен */ -extern pop_rnd_t pop_t_seed; /* сид кладки (seg009 PRNG) */ - -/* Верхний клип блитов фона (ЭКРАННАЯ y): !=0 — строки кадра выше границы не - * рисуются. Нужен полосе кладки у потолка (ряд −1): высокие куски не должны - * лезть в верхний борт. 0 — без клипа. */ -extern int pop_t_clip_top; - -/* ОКНО FORE-СЛОЯ (экранные координаты, полуинтервал). Пока включено, - * blit_b рисует только ту часть куска, что попадает в окно. - * - * Зачем: fore-слой существует РОВНО для того, чтобы вернуть куски тайлов - * поверх нарисованного персонажа — за пределами его прямоугольника в - * видеопамяти и так лежит правильный фон. А рисовал он тайлы ЦЕЛИКОМ: - * стена (код 20) — блок 64×63 = 4032 пикселя, и таких кусков за проход до - * девяти. Замер в MAME 2026-07-29 (комната 3, Kid + страж): проход поверх - * Kid — 402 816 тактов, поверх стража — 431 964, вместе 78 % всей работы - * кадра при бюджете 430 000. С окном большинство кусков отсекается целиком, - * остальные режутся до пересечения. */ -extern int pop_t_fclip_x0, pop_t_fclip_y0, pop_t_fclip_x1, pop_t_fclip_y1; -/* Та же рамка в ЛОГИЧЕСКИХ координатах (без переворота). Всё, что решает - * «задевает ли ТАЙЛ окно», обязано сравнивать по ней: позиция тайла в - * комнате от переворота не зависит. Экранная пара — только для клипа - * блита, который режет уже перевёрнутый прямоугольник. */ -extern int pop_t_fclip_ly0, pop_t_fclip_ly1; -extern uint8_t pop_t_fclip_on; - -/* Поставить то же окно под ТОЧЕЧНУЮ ПЕРЕРИСОВКУ / ЗАПЕЧКУ. Прямоугольник — - * тот, который восстанавливаем (heal или бар-в-чёрный), в ЛОГИЧЕСКИХ - * экранных координатах (с POP_YOFF, но до переворота); экранную пару - * функция считает сама. - * - * Зачем: точечная перерисовка зовёт draw_tile, а тот честно рисует ВЕСЬ тайл. - * У полосы кладки у потолка это особенно дорого: куски ряда 0 высотой 63 px - * рисуются целиком, хотя восстановить надо девять верхних строк (замер - * 2026-08-17: блит в pop_ceil_bake_empty стоит 21 447 против 14 384 в - * pop_floor_bake — ровно разница в высоте). Окно и отсеивает куски, вовсе не - * попавшие в прямоугольник (предфильтр pop_blit_b — ДО atlas_image и - * gfx_w0_map), и режет остальные по нему. - * - * ВАЖНО: пока окно стоит, pop_blit_b НЕ ставит пометку «фон трогали» (признак - * fore-прохода) — вызывающий обязан пометить прямоугольник САМ (pop_cd_touch - * или pop_bar_black, который метит сам). */ -void pop_t_win_set(int x, int ytop, int w, int h) __banked; -void pop_t_win_clear(void) __banked; - -/* ---- Таблица тайлов (piece, seg008.c:27) ---------------------------- */ -typedef struct { - uint8_t base_id, floor_left; int8_t base_y; - uint8_t right_id, floor_right; int8_t right_y; - uint8_t stripe_id, topright_id, bottom_id, fore_id, fore_x; int8_t fore_y; -} piece; - -extern const piece pop_tile_table[31]; - -/* Таблицы, нужные ОБЕИМ половинам слоя фона (односторонние живут по месту). */ -extern const uint8_t POP_COL_XH[10]; /* x тайла = COL_XH[col]*8 */ -/* Деление координаты на ширину тайла таблицей (оригинал: tile_div_tbl / - * tile_mod_tbl, seg006:702). Индекс — координата 0..255 как есть, смещение - * -58 уже внутри: POP_TILE_DIV[x] = floor((x-58)/14), POP_TILE_MOD[x] — - * остаток. Резидент: нужны и карте (банк 3), и слою фона (банк 2). */ -extern const int8_t POP_TILE_DIV[256]; -extern const uint8_t POP_TILE_MOD[256]; -extern const uint8_t POP_WALL_FRAM_BOTTOM[4]; /* нижняя грань стены по bg */ -extern const uint8_t POP_WALL_FRAM_MAIN[4]; /* основная грань стены */ -extern const uint8_t POP_SPIKES_FRAM_LEFT[10]; /* кадр пик в своей ячейке */ -extern const uint8_t POP_LOOSE_FRAM_LEFT[12]; /* верх дрожащей плиты */ -extern const uint8_t POP_LOOSE_FRAM_BOTTOM[12]; /* низ дрожащей плиты */ -extern const uint8_t POP_CHOMP_FRAM_FOR[5]; /* чомпер: перед (pop_fore!) */ - -/* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора, - * из которой потом восстанавливает heal). В этом режиме ТРАНЗИЕНТНЫЕ кадры - * рисовать НЕЛЬЗЯ — ни свои, ни соседские: кадр законсервируется в копии, и - * heal будет возвращать его вечно, даже когда ловушка давно вернулась в - * покой (пики: BUG-SPIKE-BAKED). А так как запечка идёт двумя кадрами (по - * одному на страницу дабл-буфера), на страницах могут застыть ещё и РАЗНЫЕ - * кадры — вечное мерцание. Фон обязан быть состоянием ПОКОЯ; анимация - * каждый кадр кладётся поверх (банк SPRITE). - * - * Флаг читают ВСЕ функции «кадр по модификатору»: pop_loose_frame, - * pop_spike_frame, pop_chomp_pose. Появится новая анимированная ловушка — - * её кадр обязан спрашивать флаг ТАМ ЖЕ, а не в вызывающем слое: слоёв - * отрисовки у тайла четыре, и забыть один слишком легко. */ -extern uint8_t pop_t_bake_rest; - -/* Кадр дрожащей/падающей плиты по её room_modif (seg007 loose_fram_*). */ -uint8_t pop_loose_frame(uint8_t modif); - -/* Кадр пик по их modif (индекс в spikes_fram_*): 0 = не видно, 5 = вышли - * целиком. В режиме запечки — всегда 0 (см. pop_t_bake_rest). */ -uint8_t pop_spike_frame(uint8_t modif); - -/* Номер позы чомпера по его модификатору (seg008 chomper_fram1): 0..4 — - * индекс во ВСЕ три набора кусков (низ/верх/перед) и в кровь (+114/+119). */ -uint8_t pop_chomp_pose(uint8_t modif); - -/* ---- Блит куска атласа ---------------------------------------------- * - * НИЗ спрайта на ybottom (room-space, POP_YOFF добавляется внутри), левый - * край на x, прозрачно (0xFF). w/h читаются из getimage-заголовка ленты (в - * W0). Режется окном fore-клипа и pop_t_clip_top. */ -void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom); -/* Блит getimage-блоба из обычной памяти (W2) — без atlas_image и без - * маппинга страницы; клип полосы у потолка и окно перерисовки те же, что у - * pop_blit_b. Для композитных спрайтов, собранных в рантайме. */ -void pop_mem_b(const uint8_t *img, int x, int ybottom) __banked; - -void pop_env_b(uint8_t id, int x, int yb); -void pop_wall_b(uint8_t id, int x, int yb); -void pop_fore_b(uint8_t id, int x, int yb); -void pop_pot_b(uint8_t id, int x, int yb); - -/* heal в room-space (со сдвигом POP_YOFF) — все heal слоя фона/loose. */ -void pop_heal_off(int x, int y, int w, int h) __banked; - -/* Чёрная плита по ЭКРАННЫМ координатам, с учётом переворота (POP_FLIP_TOP). - * Пишет банком 0x50 — и в видео-ОЗУ, и в ОЗУ-копию, иначе heal вернёт - * стёртое. ВСЕ стирания слоя фона обязаны идти через неё, а не через голый - * bar: иначе при перевороте плита ложится в неотражённое место (так - * ломались решётка и плита-потолок). */ -void pop_bar_black(int x, int top, int w, int h) __banked; - -/* ---- Чтение тайла отрисованной комнаты ------------------------------ */ -uint8_t pop_tile_code(int row, int col); -uint8_t pop_tile_mod(int row, int col); -/* Тип «как он РИСУЕТСЯ» — подстановка нажатой кнопки (get_tile_to_draw, - * seg008:240): opener → floor, closer → stuck при таймере связи > 1. */ -uint8_t pop_tile_code_drawn(int row, int col); -/* seg008.c:1255: сосед — стена, если его тип == 20. 0 SWS / 1 SWW / 2 WWS - * / 3 WWW. На кромке col0 сосед по умолчанию = стена (как render_room). */ -uint8_t pop_wall_modifier(int row, int col); - -/* Склянка зелья (draw_tile_fore, chtab_1): нужна и полной отрисовке тайла, и - * fore-проходу поверх персонажа. */ -void pop_potion_flask(int row, int col, uint8_t modif) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_tile_cold.c b/applications/PoP/roomtest/pop_tile_cold.c deleted file mode 100644 index f4daa3f..0000000 --- a/applications/PoP/roomtest/pop_tile_cold.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * pop_tile_cold.c — ХОЛОДНАЯ половина общих листьев слоя фона (банк 5). - * - * ЗАЧЕМ РАЗРЕЗ. pop_tile.c был самым крупным жильцом резидента (5 972 Б - * кода), а резидент huge-режима — это всё окно 0x4100..0xBB00, и место в нём - * нужно под музыку, заставки и UI. Но целиком pop_tile не уедет: его - * const-таблицы (POP_TILE_DIV/MOD, pop_tile_table, таблицы кадров) читают - * банки 2, 3, 7 и 8, а таблица в чужом банке не видна. - * - * КРИТЕРИЙ ОТБОРА — ЗАМЕР, а не догадка. Каждая функция pop_tile была - * посчитана брейкпоинтом-счётчиком в MAME: сколько вызовов в кадре покоя и - * сколько в кадре ПОЛНОЙ перерисовки комнаты (её форсирует чит +/-). Сюда - * переехало только то, у чего пик <= 3 вызовов на кадр — и проверено это - * на ДВУХ тайлсетах: подземелье (уровень 1) и дворец (уровень 4), потому - * что pop_mem_b рисует композитный кусок и мог оказаться дворцовым. - * Замер: pop_mem_b 0, pop_cd_hit 0, pop_t_win_set 0..1, pop_heal_off 0..1, - * pop_room_set_above 1, pop_bar_black 3, pop_potion_flask 0..1, - * pop_cd_hit_slot 2..3 — при канарейке pop_blit_b 184..214 в том же кадре. - * - * ЦЕНА. Трамплин замерен: 252 такта пролог + 84 эпилог + ~50 на стороне - * вызывающего = ~410 тактов на вызов. На кадр покоя выходит ~1 000 тактов - * (0,2 % работы кадра), на кадр редрава ~3 700 (0,009 растра). - * - * ЧТО ОСТАЛОСЬ В РЕЗИДЕНТЕ и почему: pop_blit_b (184 вызова на редрав) со - * своими статиками blit_b_clip/blit_b_oversize, pop_cd_touch (198), - * pop_tile_code (296), pop_wall_modifier (101), pop_env_b (73), - * pop_tile_mod (70), pop_cd_batch_end (40) — и все const-таблицы. - * pop_fore_set_clip оставлен намеренно: 88 Б не стоят отказа от прямого - * вызова из банка 4, ради которого он и заводился. - * - * ВЫЗОВЫ ОТСЮДА В РЕЗИДЕНТ — прямые, без трамплина: W1/W2 замаплены всегда. - * Поэтому blit_b_clip (статик горячей половины) просто перестал быть static - * и объявлен в _pop_tile.h, а не переехал следом. - */ - -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF, POP_PLAYFIELD_H */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include "pop_cdraw.h" /* pop_cd, pop_cd_dirty, pop_cd_ymin/ymax */ -#include "pop_tile.h" -#include "_pop_draw.h" /* pop_heal_fast */ -#include "_pop_tile.h" /* blit_b_clip — из горячей половины */ - -#define FLIP_TOP(top, h) POP_FLIP_TOP(top, h) /* формула — в pop_bg.h */ - -/* Смещение склянки внутри тайла (seg008 draw_tile_fore): те же числа, что в - * tile_table горячей половины — дублируем, потому что там они локальные - * define'ы, а тащить их в публичный заголовок ради одной функции незачем. */ -#define POT_FORE_X 2 -#define POT_FORE_Y (-3) - -/* Прямоугольник слота против метки — БЕЗ передачи пяти аргументов. - * - * pop_cd_hit принимает (p, x0, y0, x1, y1): три последних идут стеком, и - * функция целиком уезжает в IX-фрейм — 45 % её тактов уходит на `-n(ix)` - * (замер asm 2026-08-19). А зовут её из cd_quiet дважды на слот, то есть - * до восьми раз за кадр. Здесь координаты берутся прямо из pop_cd, и - * аргументов остаётся два. - * - * Спрайт и накладной проверяются РАЗДЕЛЬНО — объединённый bbox ловит - * касания углом, которых нет (разбор в cd_quiet, pop_cdraw.c). */ -static int hit_x, hit_y; /* аргументы hit_rect — file-scope, не стек */ -static uint16_t hit_w, hit_h; -static uint8_t hit_p; - -static uint8_t hit_rect(void) -{ - int8_t c0, c1, c; - uint8_t ya, yb; - int x1 = hit_x + (int)hit_w - 1; - int y1 = hit_y + (int)hit_h - 1; - if (!hit_w || !hit_h) return 0; - if (x1 < 0 || hit_x > 319) return 0; - if (y1 < 0 || hit_y > 255) return 0; - ya = (uint8_t)(hit_y < 0 ? 0 : hit_y); - yb = (uint8_t)(y1 > 255 ? 255 : y1); - c0 = (int8_t)((hit_x < 0 ? 0 : hit_x) >> 5); - c1 = (int8_t)((x1 > 319 ? 319 : x1) >> 5); - for (c = c0; c <= c1; c++) - if (ya <= pop_cd_ymax[hit_p][c] && yb >= pop_cd_ymin[hit_p][c]) return 1; - return 0; -} - -uint8_t pop_cd_hit_slot(uint8_t who, uint8_t p) __banked -{ - const pop_cdraw_t *s = &pop_cd[who]; - if (!(pop_cd_dirty & (1 << p))) return 0; - hit_p = p; - hit_x = s->x[p]; hit_y = s->y[p] + POP_YOFF; - hit_w = s->w[p]; hit_h = s->h[p]; - if (hit_rect()) return 1; - if (!s->ovalid[p]) return 0; - hit_x = s->ox[p]; hit_y = s->oy[p] + POP_YOFF; - hit_w = s->ow[p]; hit_h = s->oh[p]; - return hit_rect(); -} - -uint8_t pop_cd_hit(uint8_t p, int x0, int y0, int x1, int y1) __banked -{ - int8_t c0, c1, c; - uint8_t ya, yb; - if (!(pop_cd_dirty & (1 << p))) return 0; - if (x1 < 0 || x0 > 319) return 0; - if (x0 < 0) x0 = 0; - if (x1 > 319) x1 = 319; - if (y1 < 0 || y0 > 255) return 0; - ya = (uint8_t)(y0 < 0 ? 0 : y0); - yb = (uint8_t)(y1 > 255 ? 255 : y1); - c0 = (int8_t)(x0 >> 5); - c1 = (int8_t)(x1 >> 5); - /* Пересечение отрезков [ya,yb] и [ymin,ymax] хотя бы в одной колонке. - * Пустая колонка держит ymin = 255, ymax = 0 — условие ниже её отсеет - * само, отдельной проверки «пусто» не нужно. */ - for (c = c0; c <= c1; c++) - if (ya <= pop_cd_ymax[p][c] && yb >= pop_cd_ymin[p][c]) return 1; - return 0; -} - -/* Страница приведена в порядок — снять с неё метку целиком. */ -/* Начальное состояние обеих страниц — «ничего не трогали». ЯВНО, а не - * расчётом на обнуление _DATA: пустая колонка обозначается ymin = 255, - * ymax = 0, а нули от crt0 читались бы как «затронута строка 0». */ -void pop_cd_init(void) __banked -{ - pop_cd_clear(0); - pop_cd_clear(1); -} - -void pop_cd_clear(uint8_t p) __banked -{ - uint8_t c; - for (c = 0; c < 10; c++) { pop_cd_ymin[p][c] = 255; pop_cd_ymax[p][c] = 0; } - pop_cd_dirty = (uint8_t)(pop_cd_dirty & ~(1 << p)); -} - -/* Окно под точечную перерисовку/запечку — контракт в шапке pop_tile.h. - * Логическая пара нужна для отсева тайлов (он считается из ряда комнаты), - * экранная — для клипа самого блита; при перевороте они разные. */ -void pop_t_win_set(int x, int ytop, int w, int h) __banked -{ - pop_t_fclip_x0 = x; - pop_t_fclip_x1 = x + w; - pop_t_fclip_ly0 = ytop; - pop_t_fclip_ly1 = ytop + h; - if (pop_upside) { - int t = FLIP_TOP(ytop, h); - pop_t_fclip_y0 = t; - pop_t_fclip_y1 = t + h; - } else { - pop_t_fclip_y0 = ytop; - pop_t_fclip_y1 = ytop + h; - } - pop_t_fclip_on = 1; -} - -void pop_t_win_clear(void) __banked -{ pop_t_fclip_on = 0; } - -/* Блит getimage-блоба из ОБЫЧНОЙ памяти (W2), а не из EMM-страницы атласа: - * те же клип полосы у потолка и окно перерисовки, что у pop_blit_b, но без - * atlas_image и без gfx_w0_map/unmap (это ещё ~1 350 такта). Заведено под - * композитный спрайт падающего куска (pop_room.c: три части сложены в один - * блоб, один вызов блита вместо трёх). */ -void pop_mem_b(const uint8_t *img, int x, int ybottom) __banked -{ - uint8_t w = img[0], h = img[2]; - int top; - if (pop_t_fclip_on && - (x >= pop_t_fclip_x1 || x + 64 <= pop_t_fclip_x0 || - ybottom + POP_YOFF + 1 <= pop_t_fclip_ly0 || - ybottom + POP_YOFF - 64 >= pop_t_fclip_ly1)) - return; - if (!w || !h) return; - top = ybottom - (int)h + 1 + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - if (!pop_t_fclip_on && !pop_t_clip_top && - !(pop_upside && (top < POP_YOFF || top + (int)h > POP_CLIP_BOTTOM)) && - x >= 0 && top >= 0 && x + (int)w <= 320 && top + (int)h <= 256) { - if (pop_upside) gfx_blit_noclip_vflip(x, top, img); - else gfx_blit_noclip(x, top, img); - pop_cd_touch(x, top, (int)w, (int)h); - } else { - blit_b_clip(img, x, top, w, h); - } -} - -/* Heal по КОМНАТНОЙ координате (её и знают точечные перерисовки: чомпер, - * пики, loose, ворота, полоса потолка). При перевороте прямоугольник - * обязан отразиться ровно так же, как сам тайл, — иначе heal чистит одно - * место, а рисует в другое: именно так «ломалась анимация чомперов» - * (найдено пользователем на первом же прогоне зеркального фона). */ -void pop_bar_black(int x, int top, int w, int h) __banked -{ - if (pop_upside) top = FLIP_TOP(top, h); - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - bar(x, top, x + w - 1, top + h - 1); - pop_cd_touch(x, top, w, h); /* bar идёт мимо pop_blit_b (DRAW-COST) */ -} - -void pop_heal_off(int x, int y, int w, int h) __banked -{ - int top = y + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - pop_heal_fast(x, top, w, h); -} - -/* ---- Зелье: склянка (tiles_10_potion, seg008 draw_tile_fore) --------- * - * Тип = (modif & 0xF8) >> 3: 0 = пусто (ничего не рисуем), 2..4 — «большая» - * склянка (id 13), остальные — маленькая (id 12). Спрайты из chtab_1 (атлас - * pop_pot), поэтому НЕ из env: раньше рисовали chtab_6 id 12 (res212), - * которого в VDUNGEON нет — оттуда и «мусорный объект». Позиция оригинала: - * xh = fore_x + draw_xh, xl = 6, ybottom = fore_y + draw_main_y. - * - * Здесь, а не в банке: склянку рисует и полная отрисовка тайла (холодная - * половина), и fore-проход поверх персонажа (горячая). */ -void pop_potion_flask(int row, int col, uint8_t modif) __banked -{ - uint8_t type = (uint8_t)((modif & 0xF8) >> 3); - uint8_t id = 12; - if (type == 0) return; - if (type >= 2 && type < 5) id = 13; /* большая склянка */ - if (pop_palace) id += 2; /* seg008:747: во дворце склянки другие */ - pop_pot_b(id, (POT_FORE_X + POP_COL_XH[col]) * 8 + 6, - POT_FORE_Y + 63 * row + 62); -} - -/* Ряд 0 комнаты СНИЗУ (fg-коды) — нужен draw_tile_topright/floorright, когда - * тайл нижнего ряда стал видимым (empty после падения loose): «стена вниз» = - * топрайт тайла room_B(0, col-1). 0 — нет комнаты снизу (кромка = стена). */ -void pop_room_set_below(const uint8_t *below_row0_fg) __banked -{ pop_t_below = below_row0_fg; } - -/* Ряд 2 (fg-коды + модификаторы) комнаты СВЕРХУ — для полосы кладки у - * потолка (seg008 draw_room: доп. верхний ряд из room_A, draw_tile_aboveroom - * при draw_main_y=-1). 0 — нет комнаты сверху (кромка уровня → пол). */ -void pop_room_set_above(const uint8_t *above_row2_fg, const uint8_t *above_row2_mod) __banked -{ pop_t_above = above_row2_fg; pop_t_abovemod = above_row2_mod; } diff --git a/applications/PoP/roomtest/pop_timer.c b/applications/PoP/roomtest/pop_timer.c deleted file mode 100644 index 58ed531..0000000 --- a/applications/PoP/roomtest/pop_timer.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * pop_timer.c — единый владелец глобального таймера (FG4, банк 9). - * - * SDLPoP хранит rem_min/rem_tick и уменьшает rem_tick на каждом логическом - * игровом кадре. Здесь та же схема: после нуля tick возвращается к 719, - * поэтому 720 тиков образуют минуту. Настройки, экранные сообщения и - * переход TIME_EXPIRED остаются снаружи: это делает ядро таймера чистым и - * не привязывает его к ещё не реализованным title/cutscene режимам. - */ -#include -#include "pop_timer.h" - -uint8_t pop_timer_minutes; -uint16_t pop_timer_ticks; -uint8_t pop_show_time; - -void pop_timer_new_game(void) __banked -{ - pop_timer_minutes = POP_TIMER_START_MINUTES; - pop_timer_ticks = POP_TIMER_START_TICKS; - pop_show_time = 0; -} - -uint8_t pop_timer_tick(uint8_t enabled, uint8_t may_run) __banked -{ - if (!enabled || !may_run || pop_timer_minutes == 0) return 0; - - --pop_timer_ticks; - if (pop_timer_ticks != 0) { - /* Последняя минута: оригинал напоминает о времени КАЖДУЮ секунду - * (rem_tick % 12 == 0) и специально гасит текущую строку, чтобы - * новая встала немедленно, не дожидаясь её 24 тиков. */ - if (pop_timer_minutes == 1 && pop_timer_ticks % 12 == 0) - pop_show_time = 2; /* 2 = «показать, перебив текущую» */ - return 0; - } - - pop_timer_ticks = POP_TIMER_START_TICKS; - --pop_timer_minutes; - /* Круглые пятёрки и весь финальный отсчёт: seg008:1795. */ - if (pop_timer_minutes != 0 && - (pop_timer_minutes <= 5 || pop_timer_minutes % 5 == 0)) - pop_show_time = 1; - return (uint8_t)(pop_timer_minutes == 0); -} - -void pop_timer_cheat_subtract(void) __banked -{ - /* Это буквально правило SDLK_KP_MINUS: последнюю минуту читом не - * отнимаем, иначе не получится отличить чит от настоящего expiry. */ - if (pop_timer_minutes > 1) --pop_timer_minutes; - pop_show_time = 2; /* оригинал показывает результат сразу */ -} - -void pop_timer_cheat_add(void) __banked -{ - /* SDLPoP хранит signed short, у нас достаточно byte: 255 минут — - * практический максимум и насыщение не даёт тихо свернуться в нуль. */ - if (pop_timer_minutes != 0xFF) ++pop_timer_minutes; - pop_show_time = 2; -} - -void pop_timer_qsave(pop_qs_io_t *io) __banked -{ - uint8_t minutes = pop_timer_minutes; - uint16_t ticks = pop_timer_ticks; - - pop_qs_u8(io, &minutes); - pop_qs_u16(io, &ticks); - if (io->reading && io->apply) { - if (ticks == 0 || ticks > POP_TIMER_START_TICKS) { - io->failed = 1; - return; - } - pop_timer_minutes = minutes; - pop_timer_ticks = ticks; - } -} diff --git a/applications/PoP/roomtest/pop_timer.h b/applications/PoP/roomtest/pop_timer.h deleted file mode 100644 index b17c97b..0000000 --- a/applications/PoP/roomtest/pop_timer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * pop_timer.h — глобальный игровой таймер (FG4, банк 9). - * - * Время измеряется логическими кадрами SDLPoP: 720 тиков = одна минута. - * Модуль намеренно не знает ни о клавиатуре, ни о графике, ни о состоянии - * Settings: вызывающий передаёт, разрешён ли лимит и можно ли времени идти. - * Благодаря этому тот же код проверяется host-тестом без DSS/MAME. - */ -#ifndef POP_TIMER_H -#define POP_TIMER_H - -#include -#include "pop_qsave.h" - -#define POP_TIMER_START_MINUTES 60 -#define POP_TIMER_TICKS_PER_MINUTE 720 -#define POP_TIMER_START_TICKS (POP_TIMER_TICKS_PER_MINUTE - 1) - -/* Оставшееся время. ticks всегда 1..719 вне короткого участка timer_tick. - * Нуль minutes означает естественное истечение; выключенный в Settings - * лимит состояние не меняет, а просто останавливает отсчёт. */ -extern uint8_t pop_timer_minutes; -extern uint16_t pop_timer_ticks; - -/* «Пора показать оставшееся время» — порт is_show_time (seg008). Взводит - * и сам таймер на круглых минутах, и внешние события: старт уровня, клавиша - * Space, читы +/-, смерть Джафара. Гасит его тот, кто напечатал строку - * (pop_status.c) — ядро таймера про экран по-прежнему ничего не знает. */ -extern uint8_t pop_show_time; - -/* Начать новую игру: ровно исходные 60:00 SDLPoP (60 минут, tick 719). */ -void pop_timer_new_game(void) __banked; - -/* Один логический игровой кадр. enabled — переключатель Settings, - * may_run — правила текущей сцены/уровня. Возвращает 1 ОДИН раз, когда - * отсчёт дошёл до нуля; на паузе, HDD/QuickSave и при выключенном лимите - * вызывать можно — состояние останется неизменным. */ -uint8_t pop_timer_tick(uint8_t enabled, uint8_t may_run) __banked; - -/* Читы, повторяющие +/- SDLPoP: минус не даёт искусственно поставить 0, - * плюс добавляет минуту. Они меняют счётчик и при выключенном лимите — - * после включения пользователь продолжит именно это подготовленное время. */ -void pop_timer_cheat_subtract(void) __banked; -void pop_timer_cheat_add(void) __banked; - -/* Состояние входит в payload QuickSave. Неверный tick помечает поток - * ошибочным, не подменяя живой таймер частично. */ -void pop_timer_qsave(pop_qs_io_t *io) __banked; - -#endif /* POP_TIMER_H */ diff --git a/applications/PoP/roomtest/pop_title.c b/applications/PoP/roomtest/pop_title.c deleted file mode 100644 index c9a474f..0000000 --- a/applications/PoP/roomtest/pop_title.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * pop_title.c — оригинальная графическая часть show_title(), банк 9 (FG6). - * - * Готовые композиции создаёт toolchain/pop_pack_title.py непосредственно из - * TITLE/res51..55.png SDLPoP. Каждый 320x200 экран режется на пять лент: - * загружаем одну в EMM, блитим непрозрачно в normal bank, освобождаем. Это - * сознательно не держит title-ресурсы рядом с игровыми атласами. - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF: title занимает 200px по центру 256px */ -#include "pop_sfx.h" -#include "pop_music.h" -#include "pop_arc.h" -#include "title_arc.h" -#include "pop_cutscene.h" /* POP_T60 */ -#include "pop_settings.h" -#include "pop_pal.h" -#include "pop_title.h" -#include "pop_ui.h" - -#define TITLE_W 320 -#define TITLE_H 200 -#define TITLE_Y POP_YOFF -#define TITLE_PARTS 5 -#define TITLE_FADE POP_FADE_FRAMES /* 2,13 с, как fade_*_1 оригинала */ - -enum { - TITLE_MAIN = 0, - TITLE_PRESENTS, - TITLE_GAME, - TITLE_LOGO -}; - -/* Композиции лежат в одном архиве подряд по пять полос 49/49/49/49/4, - * поэтому имён здесь больше нет: индекс = сцена * TITLE_PARTS. */ -#if (ARC_TITLE_T1_0 - ARC_TITLE_T0_0) != TITLE_PARTS -#error "полосы титров в архиве лежат не по пять подряд" -#endif - -/* Последовательность и интервалы буквально из show_title(): - * main --0x82--> presents --0xCD--> main --0x41--> game - * --0x10E--> main --0xEB--> logo+Mechner. - * Счёт — в тиках SDLPoP (60 Гц), в кадры луча переводит POP_T60: под - * заставку играет тема, и разбегание на 20 % было бы слышно. - * - * Последний интервал у оригинала не фиксирован: показав логотип, он ждёт - * ОКОНЧАНИЯ ТЕМЫ (`while (check_sound_playing())`, seg000:2027) и лишь - * потом уходит в историю. 0xEB здесь — нижняя граница на случай, когда - * музыки нет (нет файла, выключен звук). */ -static const uint8_t title_scene[] = { - TITLE_MAIN, TITLE_PRESENTS, TITLE_MAIN, TITLE_GAME, TITLE_MAIN, TITLE_LOGO -}; -static const uint16_t title_wait_ticks[] = { - POP_T60(0x82), POP_T60(0xCD), POP_T60(0x41), - POP_T60(0x10E), POP_T60(0xEB), POP_T60(0xEB) -}; - -static uint8_t title_shown; - -static uint8_t title_skip_pressed(void) -{ - /* Как и в attract-demo, любой удерживаемый raw-код означает «не ждать». - * Это заодно не дублирует список клавиш у title, intro и cutscene. */ - return kbd_raw_any_down(); -} - -/* Нарисовать одну из готовых 320x200 композиций в скрытую страницу. - * Сопоставление W0 охватывает ТОЛЬКО atlas_image/blit: BIOS/vsync сюда - * не попадает, значит не конфликтует с EMM и CBL. Возвращает номер - * подготовленной страницы; show=0 оставляет её скрытой для palette commit. */ -static int title_draw(uint8_t scene, uint8_t show) -{ - uint8_t tbl[ARC_TITLE_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t page = pop_screen_begin(); - int res; - - pop_screen_fill(BLACK); - if (pop_arc_open_id(&arc, POP_ARC_TITLE, tbl, ARC_TITLE_COUNT) < 0) - return -1; - res = pop_screen_blit_atlas_arc(&arc, tbl, - (uint8_t)(ARC_TITLE_T0_0 + - scene * TITLE_PARTS), - TITLE_PARTS, 0, TITLE_Y); - pop_arc_close(&arc); - if (res != 0) return -1; - if (show) pop_screen_present(page); - return page; -} - -/* draw_full_image(TITLE_MAIN) + transition_ltr() финала (seg001:590 и - * :629): титульный рисунок проявляется полосами поверх текущего экрана. - * Палитру не трогаем — story.pal и title.pal это одни и те же цвета - * (обе сделаны из res51). -1 — архив не прочитан. */ -int pop_title_main_ltr(void) __banked -{ - if (title_draw(TITLE_MAIN, 0) < 0) return -1; - pop_screen_present_ltr(); - return 0; -} - -/* Тот же приём для композиции с логотипом и подписью Jordan Mechner: её - * show_title() показывает МЕЖДУ «свадьбой» и титрами (seg000:2045). */ -int pop_title_logo_ltr(void) __banked -{ - if (title_draw(TITLE_LOGO, 0) < 0) return -1; - pop_screen_present_ltr(); - return 0; -} - -static uint8_t title_wait(uint16_t ticks) -{ - while (ticks--) { - if (title_skip_pressed()) return 1; - gfx_wait_vsync(); - } - return 0; -} - -/* Новый источник не становится видимым сам: cold boot уже чёрный, а - * последующий fade_in выбирает яркость только после сборки t0. */ -static void title_load_palette_dimmed(void) -{ - pop_pal_title_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); -} - -uint8_t pop_title_show(void) __banked -{ - uint8_t step; - uint8_t skipped = 0, music_ok = 0; - int prepared; - uint8_t cold_start = (uint8_t)(!title_shown && - !pop_settings.show_build_info); - - /* Игровые SFX не должны тянуться сюда из прерванной партии: заставка - * начинается с тишины, а через несколько строк её займёт тема титров. */ - pop_sfx_pause(); - if (!cold_start) pop_pal_fade_out(TITLE_FADE); - - /* Видимая VRAM могла сохраниться от предыдущей программы. Обнулить её - * при чёрной палитре, затем собрать t0 СКРЫТО: загрузка title.pal тогда - * освещает только индекс 0, а не старый экран или недорисованный title. */ - gfx_set_draw_page(gfx_get_visible_page()); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - prepared = title_draw(TITLE_MAIN, 0); - if (prepared < 0) return 0; - title_load_palette_dimmed(); - pop_screen_present((uint8_t)prepared); - title_shown = 1; - - /* Тему читаем с диска ЗАРАНЕЕ (пока экран ещё тёмный), а пускаем ниже — - * после fade_in, ровно как show_title: fade_in_2, затем - * play_sound(sound_54). */ - music_ok = (uint8_t)(pop_music_load(POP_MUS_INTRO) == 0); - - for (step = 0; step < sizeof(title_scene); step++) { - if (step && title_draw(title_scene[step], 1) < 0) - break; - if (step == 0) { - pop_pal_fade_in(TITLE_FADE); - if (music_ok) { - (void)pop_sfx_start(); - pop_music_play(); - } - } - if (title_wait(title_wait_ticks[step])) { - skipped = 1; - break; - } - /* Логотип держим до конца темы — так оригинал стыкует заставку с - * историей: музыка не обрывается, а сменяется следующей репликой. */ - if (step + 1 == sizeof(title_scene)) { - while (pop_music_busy()) { - if (title_skip_pressed()) { skipped = 1; break; } - gfx_wait_vsync(); - } - } - } - /* Уходим В ИГРУ — заставочная музыка не должна тянуться в уровень. - * Дальше по сценарию (intro) трек, наоборот, ОСТАЁТСЯ звучать: там - * следующая реплика подгружается во второй слот, пока играет эта. */ - if (skipped) { - pop_music_free(); - pop_sfx_pause(); - } - return skipped; -} diff --git a/applications/PoP/roomtest/pop_title.h b/applications/PoP/roomtest/pop_title.h deleted file mode 100644 index 0f15dd9..0000000 --- a/applications/PoP/roomtest/pop_title.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * pop_title.h — первая часть оригинальной title sequence, банк 9 (FG6). - * - * Экран живёт отдельно от игрового кадра: он загружает одну ленту TITLE - * за раз, рисует готовую страницу и не оставляет EMM-страниц после выхода. - */ -#ifndef POP_TITLE_H -#define POP_TITLE_H - -#include - -/* Показать TITLE_MAIN/PRESENTS/GAME/POP+MECHNER в порядке show_title(). - * Возврат 1 — пользователь прервал ожидание и надо начать FIRST_LEVEL - * напрямую; 0 — последовательность завершилась штатно, продолжать intro. */ -uint8_t pop_title_show(void) __banked; - -/* Одна титульная картинка (TITLE_MAIN) полосами слева направо — так финал - * возвращается к ней после HAIL и после ввода имени в таблицу рекордов. - * Палитру не меняет: story.pal и title.pal сделаны из одного res51. - * -1 — архив титров не прочитан. */ -int pop_title_main_ltr(void) __banked; - -/* Композиция с логотипом PRINCE OF PERSIA и Jordan Mechner тем же - * переходом — шаг show_title() между «свадьбой» и титрами. */ -int pop_title_logo_ltr(void) __banked; - -#endif /* POP_TITLE_H */ diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c deleted file mode 100644 index 948a2d2..0000000 --- a/applications/PoP/roomtest/pop_trob.c +++ /dev/null @@ -1,929 +0,0 @@ -/* - * pop_trob.c — P0-каркас: room_modif + список trob + диспетчер анимаций. - * Порт SDLPoP seg007 (process_trobs/animate_tile/add_trob/animate_spike). - * См. pop_trob.h. - */ -#include "pop_trob.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_state.h" /* pop_leveldoor_open */ -#include "pop_level.h" -#include "pop_geom.h" -#include "pop_redraw.h" /* пометки перерисовки тайлов (вместо прямых вызовов) */ -/* pop_bg нужен ТОЛЬКО для пламени факела и пузырька зелья: это не тайловая - * перерисовка, а покадровый оверлей поверх фона (в оригинале — свои - * add_backtable/add_foretable внутри draw_tile). Всё остальное идёт через - * пометки, поэтому pop_process_trobs — единственная функция модуля, которую - * нельзя звать из __banked-кода. */ -#include "pop_bg.h" -#include "pop_tile.h" /* pop_palace — тип уровня как модификатор дыры */ -#include "pop_guard.h" /* is_guard_notice — нажатая кнопка слышна стражу */ -#include "pop_kid.h" /* Kid.curr_row/alive — условие остановки чомпера */ -#include "pop_tune.h" /* POP_DBG_GATE_HOLD — отладочное растягивание окна */ - -/* Коды тайлов (fg & 0x1F), которые анимируются. */ -#define TILE_SPIKE 0x02 -#define TILE_GATE 0x04 -#define TILE_CLOSER 0x06 -#define TILE_DEBRIS 0x0E /* button_type для «насовсем открыть» (died_on_button) */ -#define TILE_OPENER 0x0F -#define TILE_POTION 0x0A -#define TILE_LOOSE 0x0B /* проваливающийся пол (фаза тряски в modif) */ -#define TILE_SWORD 0x16 /* меч-предмет на полу */ -#define TILE_LEVELDOOR 0x10 /* левая половина двери уровня (на ней modif) */ -#define TILE_CHOMP 0x12 /* чомпер (челюсти) */ -#define TILE_WALL 0x14 /* стена (в модификаторе — флаг «без полоски») */ -#define TILE_TORCH 0x13 -#define TILE_TORCH_DEBRIS 0x1E -#define TILE_EMPTY 0x00 /* remove_loose: на месте провалившейся плиты */ - -/* ---- Персистентное per-room modifier-состояние -------------------- */ -static uint8_t room_modif[POP_NROOMS][POP_ROOMTILES]; -static uint8_t room_seen[POP_NROOMS]; /* modif проинициализирован из уровня */ - -/* ---- Список анимируемых тайлов ------------------------------------ */ -typedef struct { uint8_t room, tilepos; int8_t type; } trob_t; -#define TROBS_MAX 30 /* как в оригинале (types.h) */ -static trob_t trobs[TROBS_MAX]; -static uint8_t trobs_count; -static uint8_t trob_code[TROBS_MAX]; /* префетч кодов тайлов на кадр (1 map W0) */ -/* Код ПРАВОГО соседа — заполняется только у факелов (0 у остальных). Нужен - * потому, что пламя рисуется в ячейке соседа и запекается в фон: если у - * соседа своя anim-графика, её надо вернуть ПОВЕРХ огня. Читается в том же - * префетче, чтобы не свапать W0 второй раз за кадр. */ -static uint8_t trob_rcode[TROBS_MAX]; - -/* Последняя НАРИСОВАННАЯ draw-сигнатура тайла (spike: modifier; button: - * признак «нажата» = таймер связи >1). Редрой пики/кнопки — ТОЛЬКО при её - * изменении (порт redraw_11h-on-change из SDLPoP). Без этого кнопка под - * стоящим Кидом перерисовывалась КАЖДЫЙ кадр (2×draw_tile ≈ 50% кадра в - * статике), т.к. её trob висит, пока Кид стоит (это верно, как в SDLPoP — - * расхождение было именно в безусловном редрое). */ -static uint8_t trob_drawn[POP_ROOMTILES]; - -/* prandom (seg009.c:321, 32-бит LCG) — нужен для стартовой фазы факела и - * выбора следующего кадра пламени. */ -static pop_rnd_t trob_seed; - -#define trob_prandom(maxv) pop_prandom(&trob_seed, (maxv)) - - -void pop_trob_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < POP_NROOMS; i++) room_seen[i] = 0; - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); - trobs_count = 0; -} - -uint8_t *pop_trob_modif(uint8_t room) __banked -{ - if (room < 1 || room > POP_NROOMS) return 0; - if (!room_seen[room - 1]) { - uint8_t i; - pop_level_room_bg(room, room_modif[room - 1]); - /* load_alter_mod (seg008:198E): модификатор В ФАЙЛЕ уровня и - * модификатор В РАНТАЙМЕ — разные величины, оригинал переводит их - * при загрузке. Порт того, что нас касается: - * - * ворота 1 = «открыты» (Table 8 спецификации DAT) -> 188, то есть - * рабочая высота подъёма; ЛЮБОЕ другое значение -> 0 - * (закрыты). Без этого перевода ворота, которые в - * уровне открыты, стартуют закрытыми, и кнопка-closer - * рядом с ними теряет смысл (ур. 2, комн. 13). - * loose -> 0: фаза тряски всегда начинается с нуля. - * зелье -> <<3: старшие биты = тип, младшие 3 = фаза пузырька. - * стена -> <<7: единственный бит уровня («без полоски», см. ниже) - * переезжает в СТАРШИЙ, где его и ищет отрисовка. - * - * СВЯЗИ кладки (какая грань у стены слева/справа) из этого перевода - * намеренно выкинуты: у нас их считает pop_wall_modifier по типам - * СОСЕДЕЙ прямо при отрисовке. Но второй смысл модификатора стены — - * авторский флаг «не рисовать синюю полоску на моей правой кромке» - * (noblue) — из соседей не выводится, он проставлен вручную в данных - * уровня. Без перевода отрисовка видела сырую единицу вместо 0x80, - * проверка `(mod & 0x80) == 0` проходила, и во дворце вылезал кусок - * узора на стене (BUG BLUELINE-NOBLUE, ур. 6 к. 1 тайл (2,3)). */ - pop_level_access_begin(); - for (i = 0; i < POP_ROOMTILES; i++) { - uint8_t *m = &room_modif[room - 1][i]; - switch (pop_level_tile_raw(room, i) & 0x1F) { - case TILE_GATE: *m = (uint8_t)((*m == 1) ? 188 : 0); break; - case TILE_LOOSE: *m = 0; break; - case TILE_POTION: *m = (uint8_t)(*m << 3); break; - case TILE_WALL: *m = (uint8_t)(*m << 7); break; - default: break; - } - } - pop_level_access_end(); - room_seen[room - 1] = 1; - } - return room_modif[room - 1]; -} - -static int find_trob(uint8_t room, uint8_t tilepos) -{ - uint8_t i; - for (i = 0; i < trobs_count; i++) - if (trobs[i].room == room && trobs[i].tilepos == tilepos) return i; - return -1; -} - -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked -{ - int f = find_trob(room, tilepos); - if (f >= 0) { trobs[f].type = type; return; } - if (trobs_count >= TROBS_MAX) return; - trobs[trobs_count].room = room; - trobs[trobs_count].tilepos = tilepos; - trobs[trobs_count].type = type; - trobs_count++; -} - -void pop_trob_room_changed(void) __banked -{ - uint8_t i; - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); -} - -/* anim_tile_modif (seg000:0B12) — при входе в комнату завести анимации её - * тайлов: факелам — случайная стартовая фаза пламени (start_anim_torch, - * seg007:0847: modif = prandom(8)), зельям — случайная фаза пузырька - * (start_anim_potion: младшие 3 бита = prandom(6)+1, старшие = тип). */ -void pop_trob_anim_room(uint8_t room) __banked -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t i, code; - if (!mod) return; - pop_level_access_begin(); - /* Освободить список от «декоративных» trob ДРУГИХ комнат: факел, зелье и - * блеск меча анимируются только в ОТРИСОВАННОЙ комнате, а место в списке - * занимают. Оригинал их копит и на 30-й выдаёт «Trobs Overflow»; у нас - * отладочный обход всех 24 комнат упирается в лимит за пару минут, после - * чего новые анимации молча не заводятся. Механику (ворота/пики/кнопки, - * в т.ч. кросс-комнатные) чистка не трогает. */ - { - uint8_t k, wr = 0; - for (k = 0; k < trobs_count; k++) { - uint8_t c = (uint8_t)(pop_level_tile_raw(trobs[k].room, - trobs[k].tilepos) & 0x1F); - if (trobs[k].room != room && - (c == TILE_TORCH || c == TILE_TORCH_DEBRIS || - c == TILE_POTION || c == TILE_SWORD)) - continue; - trobs[wr++] = trobs[k]; - } - trobs_count = wr; - } - for (i = 0; i < POP_ROOMTILES; i++) { - code = (uint8_t)(pop_level_tile_raw(room, i) & 0x1F); - if (code == TILE_TORCH || code == TILE_TORCH_DEBRIS) { - mod[i] = (uint8_t)trob_prandom(8); - pop_add_trob(room, i, 1); - } else if (code == TILE_POTION) { - mod[i] = (uint8_t)((mod[i] & 0xF8) | (trob_prandom(6) + 1)); - pop_add_trob(room, i, 1); - } else if (code == TILE_SWORD) { - /* start_anim_sword (seg007:087C): случайная фаза счётчика блеска. */ - mod[i] = (uint8_t)(trob_prandom(0xFF) & 0x1F); - /* trob_drawn обязан описывать то, что НАРИСУЕТ полная отрисовка - * комнаты, а она идёт ПОСЛЕ этой функции и берёт ЖИВОЙ modif. - * Обнулять его (как делает pop_trob_room_changed для всех тайлов) - * тут нельзя: если случайная фаза попала ровно на 1, комната - * рисуется С БЛЕСКОМ, а trob_drawn говорит «блеска нет» — и на - * следующем кадре счётчик уходит с 1, sig снова 0, СОВПАДАЕТ со - * стоячим trob_drawn, и перерисовка НЕ помечается. Блеск остаётся - * запечённым в фон до конца периода: animate_sword считает вниз и - * выдаёт новый период 0x28..0x67, то есть до 103 логических кадров - * ≈ 6 секунд. Вероятность ровно 1/32 на вход в комнату — отсюда - * «редко воспроизводится» (найдено пользователем 2026-08-17, - * уровень 1 комната 15). Проверено ПРИНУДИТЕЛЬНО: со временной - * подменой фазы на mod[i] = 1 баг ловится на КАЖДОМ входе в - * комнату, а с этой строкой не ловится ни на одном. - * - * У КНОПКИ той же дыры нет, хотя механизм общий: её признак — - * ДЛИТЕЛЬНОЕ состояние (нажата/нет), и рассогласование само - * исправляется на первой же смене. У блеска признак — одиночная - * вспышка в ОДНОМ кадре из 40..103, и пропущенная смена стоит - * целого периода. */ - trob_drawn[i] = (uint8_t)(mod[i] == 1); - pop_add_trob(room, i, 1); - } - } - pop_level_access_end(); -} - -/* animate_spike (seg007:04D3): автомат по modifier. *m — modifier тайла, - * *type — тип trob (>=0 активен, <0 = удалить). Выдвиг: ++modif (1..4), - * на 5 → 0x8F (полностью вышли, безвредны), на 9 → 0 + конец. Убирание - * (флаг 0x80): --modif; когда 0x7F-часть обнулилась → modif=6 (начать - * визуальный уход 6..8). 0xFF = disabled. */ -/* get_torch_frame (seg007:06CD): случайный кадр 0..8, иначе следующий. */ -static uint8_t get_torch_frame(uint8_t curr) -{ - uint8_t next = (uint8_t)trob_prandom(255); - if (next != curr && next < 9) return next; - next = (uint8_t)(curr + 1); - if (next >= 9) next = 0; - return next; -} - -/* bubble_next_frame (seg007:0759): фазы пузырька 1..7 по кругу. */ -static uint8_t bubble_next_frame(uint8_t curr) -{ - uint8_t next = (uint8_t)(curr + 1); - return (next >= 8) ? 1 : next; -} - -/* Разбор номера тайла 0..29 на ряд/колонку без деления (`tp / 10`, `tp % 10` - * — это __divuchar/__moduchar, а в animate_chomper они звались на каждого - * чомпера каждый кадр). Определены ЗДЕСЬ, а не перед pop_process_trobs, где - * лежали раньше: чомперы выше по файлу и оригинала не видели. */ -static const uint8_t TP_ROW[30] = { - 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2 -}; -static const uint8_t TP_COL[30] = { - 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9 -}; - -/* animate_chomper (seg007:0448). Модификатор: младшие 7 бит — фаза 1..N, - * старший — «перемололо кого-то» (кровь). Фаза крутится по кругу до - * POP_CHOMPER_SPEED (у оригинала 15), то есть челюсти смыкаются раз в N - * кадров; фаза 2 — момент удара (в оригинале там звук sound_47). - * - * Остановка (иначе чомперы щёлкали бы всю игру): если Кид ушёл из этой - * комнаты, или ушёл из этого РЯДА, или умер не в этом чомпере — trob - * снимается, но только после фазы 6, чтобы челюсти успели разомкнуться. - * Запускает их обратно start_chompers на смене ряда. Аргументы room/tp - * нужны ровно для этой проверки. */ -static void animate_chomper(uint8_t *m, int8_t *type, - uint8_t room, uint8_t tp, uint8_t drawn_room) -{ - uint8_t blood, frame; - if (*type >= 0) { - blood = (uint8_t)(*m & 0x80); - frame = (uint8_t)((*m & 0x7F) + 1); - if (frame > POP_CHOMPER_SPEED) frame = 1; - *m = (uint8_t)(blood | frame); - if (frame == 2) pop_sfx_play(47); /* щелчок челюстей, seg007:297 */ - if ((room != drawn_room || (int8_t)TP_ROW[tp] != Kid.curr_row || - (Kid.alive >= 0 && blood == 0)) && frame >= 6) - *type = -1; - } -} - -/* next_chomper_timing (seg007:0F9A): 15,12,9,6,13,10,7,14,11,8 по кругу — - * чомперы одного ряда стартуют вразнобой, а не хлопают в унисон. */ -static uint8_t next_chomper_timing(uint8_t timing) -{ - timing -= 3; - if (timing < 6) timing += 10; - return timing; -} - -/* start_anim_chomper (seg007:08C7): запустить, только если стоит (0) или - * уже прошёл фазу размыкания (>=6). */ -static void start_anim_chomper(uint8_t *mod, uint8_t room, uint8_t tp, - uint8_t modifier) -{ - uint8_t old = (uint8_t)(mod[tp] & 0x7F); - if (old == 0 || old >= 6) { - mod[tp] = modifier; - pop_add_trob(room, tp, 1); - } -} - -/* start_chompers (seg007:0F13): все чомперы РЯДА активного персонажа. - * Зовётся отовсюду, где персонаж сменил ряд (SEQ_UP/SEQ_DOWN, start_fall, - * приземление) и на входе в комнату. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked -{ - uint8_t timing = 15, col, tp; - uint8_t *mod; - if ((uint8_t)row >= 3) return; /* вне комнаты — нечего */ - /* pop_trob_modif ДО открытия окна: при первом обращении к комнате он - * сам лезет за её bg в страницу уровня, то есть перемапит W0 и закроет - * его — а мы внутри окна читаем тайлы. */ - mod = pop_trob_modif(room); - pop_level_access_begin(); - for (col = 0; col < 10; col++) { - tp = (uint8_t)(row * 10 + col); - if ((pop_level_tile_raw(room, tp) & 0x1F) == TILE_CHOMP) { - uint8_t m = (uint8_t)(mod[tp] & 0x7F); - if (m == 0 || m >= 6) { - start_anim_chomper(mod, room, tp, - (uint8_t)(timing | (mod[tp] & 0x80))); - timing = next_chomper_timing(timing); - } - } - } - pop_level_access_end(); -} - -static void animate_spike(uint8_t *m, int8_t *type) -{ - uint8_t mod = *m; - if (*type >= 0) { - if (mod == 0xFF) return; /* disabled — не двигать */ - if (mod & 0x80) { - --mod; - if (mod & 0x7F) { *m = mod; return; } - mod = 6; - } else { - ++mod; - if (mod == 5) mod = 0x8F; - else if (mod == 9) { mod = 0; *type = -1; } - } - } - *m = mod; -} - -/* animate_loose (seg007:0CBA) — для плиты в НЕ отрисованной комнате. - * - * ЗАЧЕМ. В оригинале loose-пол — обычный trob, а do_trobs крутит весь - * список независимо от drawn_room: расшатанная плита доваливается, даже если - * Кид уже убежал в соседнюю комнату. У нас фаза живёт в pop_loose_modif[30] - * — массиве ТЕКУЩЕЙ комнаты, — и смена комнаты её обнуляла: плита, - * пробежав по которой Кид уходил вправо, оставалась целой (уровень 10, - * комната 2, тайл 2,9). - * - * Разделение обязанностей: пока комната отрисована, фазой владеет - * pop_loose_tick (ему нужны перерисовка, звук, mob-порядок), и trob здесь - * сразу снимается. На выходе из комнаты pop_loose_leave_room (pop_map.c) - * сбрасывает фазу в ПЕРСИСТЕНТНЫЙ room_modif и заводит trob — дальше плита - * досчитывает здесь, а на входе обратно pop_loose_reset забирает фазу - * назад. Персистентный модификатор и есть curr_room_modif оригинала, так - * что расхождения с SDLPoP нет — только двухуровневое хранение. - * - * Рисовать тут нечего (комната не на экране), поэтому от оригинала остаётся - * ровно счёт фазы и провал: тайл в EMPTY + отрыв падающего куска. */ -static void animate_loose(uint8_t *m, int8_t *type, uint8_t room, uint8_t tp, - uint8_t cur_room) -{ - uint8_t ph; - if (room == cur_room) { *type = -1; return; } /* хозяин — pop_loose_tick */ - ph = (uint8_t)(*m + 1); - if (ph == 0) ph = 1; /* перескок нуля, см. pop_loose_tick */ - if (ph & 0x80) { /* тряска (do_knock): 0x80..0x83 */ - /* Спецкейс уровня 13 (seg007:823) — тот же, что в pop_loose_tick: - * отложенный старт от check_fall_flo живёт в старшем бите, и гасить - * его нельзя. Здесь он тоже нужен: гряда лежит в комнате СВЕРХУ, и - * пока Кид не вошёл в комнату под ней, счёт идёт заочно. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { /* ждём молча */ } - else if (ph >= 0x84) { ph = 0; *type = -1; } - } else if (ph >= 11) { /* loose_floor_delay — провал */ - /* remove_loose (seg007:0EB8): тайл → EMPTY, модификатором пустой - * клетки становится ТИП УРОВНЯ (по нему draw_tile_right выбирает - * blueline у дыры). Тот же порядок, что в pop_loose_tick. */ - pop_level_set_tile(room, tp, TILE_EMPTY); - /* Комната не на экране, но её колонка 9 ВИДНА в шве текущей и лежит - * в кромочных снимках — попросить главный цикл их перечитать. */ - pop_neigh_dirty = 1; - pop_loose_mob_spawn_at(room, TP_ROW[tp], TP_COL[tp]); - ph = pop_palace; - *type = -1; - } - *m = ph; -} - -/* ---- Кнопки/ворота (seg007) --------------------------------------- * - * Таблицы связей LINKLOC/LINKMAP — в pop_level (мутабельная копия в W2). - * doorlink1 (d1) = LINKLOC, doorlink2 (d2) = LINKMAP. */ -static uint8_t get_doorlink_timer(uint8_t i) { return (uint8_t)(pop_doorlink2(i) & 0x1F); } -static void set_doorlink_timer(uint8_t i, uint8_t v) -{ - pop_doorlink2_set(i, (uint8_t)((pop_doorlink2(i) & 0xE0) | (v & 0x1F))); -} -static uint8_t get_doorlink_tile(uint8_t i) { return (uint8_t)(pop_doorlink1(i) & 0x1F); } -static uint8_t get_doorlink_next(uint8_t i) { return (uint8_t)(!(pop_doorlink1(i) & 0x80)); } -static uint8_t get_doorlink_room(uint8_t i) -{ - return (uint8_t)(((pop_doorlink1(i) & 0x60) >> 5) + ((pop_doorlink2(i) & 0xE0) >> 3)); -} - -/* trigger_gate (seg007:092C): изменить openness ворот по типу кнопки. - * Возвращает тип анимации для add_trob (или -1 = ничего). */ -static int8_t trigger_gate(uint8_t room, uint8_t tilepos, uint8_t button_type) -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t modifier = mod[tilepos]; - if (button_type == TILE_OPENER) { - if (modifier == 0xFF) return -1; /* уже насовсем открыт */ - if (modifier >= 188) { mod[tilepos] = 238; return -1; } /* открыт → держать */ - mod[tilepos] = (uint8_t)((modifier + 3) & 0xFC); - return 1; /* обычное открытие */ - } else if (button_type == TILE_DEBRIS) { /* насовсем (died_on_button) */ - if (modifier < 188) return 2; - mod[tilepos] = 0xFF; - return -1; - } else { /* closer */ - if (modifier != 0) return 3; /* быстро закрыть */ - return -1; - } -} - -/* trigger_1 (seg007:0999): цель = ворота → trigger_gate; иначе -1 (leveldoor - * и прочее — отложено). */ -static int8_t trigger_1(uint8_t target_type, uint8_t room, uint8_t tilepos, uint8_t button_type) -{ - if (target_type == TILE_GATE) - return trigger_gate(room, tilepos, button_type); - if (target_type == TILE_LEVELDOOR) { - /* trigger_1 (seg007:0999): дверь уровня открывается ОДИН раз — если - * створка уже тронулась (modif != 0), кнопка ничего не делает. */ - uint8_t *m = pop_trob_modif(room); - if (m && m[tilepos] == 0) return 1; - return -1; - } - return -1; -} - -/* do_trigger_list (seg007:09E5): обойти цепочку LINKLOC от index, для каждой - * цели добавить trob (если trigger_1 >= 0). */ -static void do_trigger_list(uint8_t index, uint8_t button_type) -{ - for (;;) { - uint8_t room = get_doorlink_room(index); - uint8_t tilepos = get_doorlink_tile(index); - uint8_t target_type = pop_level_tile(room, tilepos); - int8_t result = trigger_1(target_type, room, tilepos, button_type); - if (result >= 0) pop_add_trob(room, tilepos, result); - if (get_doorlink_next(index) == 0) break; - index++; - } -} - -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked -{ - uint8_t link_timer = get_doorlink_timer(modifier); - if (link_timer != 0x1F) { /* не заклинено */ - /* Оригинал ставит 5; вынесено в pop_tune.h, потому что проверять - * руками проход в закрывающуюся решётку при таком окне почти - * невозможно (см. BUG-GATE-PASS-1). */ - set_doorlink_timer(modifier, POP_DBG_GATE_HOLD); - if (link_timer < 2) { - pop_add_trob(room, tilepos, 1); /* кнопка нажимается */ - /* seg007:766: щелчок кнопки — шум, и страж оборачивается - * (флаг обязателен даже без звука, BUG-GUARD-DEAF-1). - * - * Звук НЕ у всех вызовов: у оригинала первый параметр playsound, - * и в трёх местах он нулевой — вход на уровень (seg003:170), - * выход Джаффара (seg002:520) и зелье «открыть» (seg006:1890, - * у нас пока не портировано). Там кнопка нажимается служебно, - * щёлкать нечему. */ - if (snd) pop_sfx_play(3); - is_guard_notice = 1; - } - do_trigger_list(modifier, button_type); - } -} - -/* animate_button (seg007:0D3A): отсчитать таймер связи; <2 → кнопка - * отжимается (trob кончился). idx = модификатор кнопки (индекс LINKLOC). */ -static void animate_button(uint8_t idx, int8_t *type) -{ - if (*type >= 0) { - uint8_t timer = get_doorlink_timer(idx); - timer = (uint8_t)(timer ? timer - 1 : 0); - set_doorlink_timer(idx, timer); - if (timer < 2) *type = -1; - } -} - -/* animate_leveldoor (seg007:05F1): створка двери уровня. type 0..2 — - * открытие (modif 0 -> 43, по пикселю за кадр), type >= 3 — быстрое - * закрытие со скоростями {0,5,17,99} (после выхода из уровня). Готово -> - * type = -1. */ -static const uint8_t leveldoor_close_speeds[5] = {0, 5, 17, 99, 0}; - -/* ---- Спецсобытие уровня 4: ПОЯВЛЕНИЕ ЗЕРКАЛА ------------------------ * - * - * seg007:0457, хвост animate_leveldoor: когда дверь выхода ДОРИСОВАЛА - * открытие и leveldoor_open переходит 0/2 -> 1, оригинал ставит тайл - * зеркала прямо в данные комнаты: - * - * get_tile(mirror_room, mirror_column, mirror_row); - * curr_room_tiles[curr_tilepos] = tiles_13_mirror; - * - * Ставится он в ЧУЖУЮ комнату (4), а не в ту, где дверь. В статике уровня - * зеркала НЕТ НИ В ОДНОМ файле (проверено перебором всех 15 res200N.bin), - * поэтому его спрайты 75/77 пришлось добавить в атлас явным списком — - * MIRROR_ENV_IDS в pop_pack_bg.py (грабли memory pop_atlas_dynamic_ids). */ -#define TILE_MIRROR 0x0D /* MIRROR_* — в pop_guard.h (нужны и ИИ тени) */ - -static void place_mirror(uint8_t cur_room) -{ - if (pop_current_level != MIRROR_LEVEL) return; - pop_level_set_tile(MIRROR_ROOM, MIRROR_TILEPOS, TILE_MIRROR); - /* Комната зеркала обычно НЕ та, где дверь выхода, — игрок войдёт в неё - * позже и она отрисуется целиком. Но если она уже на экране, тайл надо - * вернуть: зеркало ДОБАВЛЯЕТ графику поверх пустого места, поэтому - * хватает обычной пометки (wipe пола + полный draw_tile). */ - if (cur_room == MIRROR_ROOM) - pop_set_redraw(MIRROR_TILEPOS, POP_RD_FLOOR, 2); -} - -static void animate_leveldoor(uint8_t *m, int8_t *type, uint8_t cur_room) -{ - if (*type < 0) return; - if (*type >= 3) { - uint8_t sp; - if (*type < 7) (*type)++; - sp = leveldoor_close_speeds[*type - 3]; - if (sp >= *m) { *m = 0; *type = -1; pop_sfx_play(14); } /* seg007:437 */ - else { - *m = (uint8_t)(*m - sp); - /* seg007:442: створку НА ЗАКРЫТИИ перебивать можно. */ - if (*type == 4) { pop_sfx_slide_intr = 1; pop_sfx_play(15); } - } - } else { - /* seg007:464: на ОТКРЫТИИ створка неперебиваема — иначе съезд - * обрывается посреди и «конца» не слышно. */ - if (*m < 43) { (*m)++; pop_sfx_slide_intr = 0; pop_sfx_play(15); } - if (*m >= 43) { - *m = 43; *type = -1; - /* seg007:455: дверь открылась — оригинал глушит всё. Без этого - * неперебиваемый съезд (1,6 с) продолжал бы блокировать очередь. */ - pop_sfx_stop(); - /* Условие оригинала — переход ИЗ 0 или 2, то есть ровно один раз - * за открытие; иначе зеркало ставилось бы заново каждый кадр, - * пока дверь стоит открытой. */ - if (pop_leveldoor_open == 0 || pop_leveldoor_open == 2) { - pop_leveldoor_open = 1; - place_mirror(cur_room); - } - pop_leveldoor_open = 1; - } - } -} - -/* animate_door (seg007:0522): openness по типу анимации. *m — modif ворот, - * *type — 0 закрытие / 1 открытие / 2 насовсем / 3..8 быстрое закрытие. */ -static const uint8_t gate_close_speeds[9] = {0, 0, 0, 20, 40, 60, 80, 100, 120}; -static const int8_t door_delta[3] = {-1, 4, 4}; - -/* play_door_sound_if_visible (seg007:1239): СЛЫШНА ли решётка. - * - * Правило не «решётка в текущей комнате», как можно подумать, а такое: - * - решётка в комнате СЛЕВА и стоит в колонке 9 — слышна (это тайл вплотную - * к левому краю экрана, игрок фактически видит её створку в шве); - * - решётка в ОТРИСОВАННОЙ комнате и НЕ в колонке 9 — слышна (колонка 9 - * уезжает за правый край); - * - особый случай оригинала: уровень 3, комната 2 — слышна всегда. - * Всё остальное молчит, иначе на 13-м уровне скрипели бы решётки со всей - * карты. - * - * Берём вариант ПОД FIX_GATE_SOUNDS (условия через ИЛИ, а не тернарником): - * в SDLPoP этот фикс включён по умолчанию, а сравниваемся мы именно с ним. - * Отличие только в вырожденном случае room_L == cur_room. */ -static uint8_t door_audible(uint8_t room, uint8_t tp, - uint8_t room_L, uint8_t cur_room) -{ - uint8_t col = TP_COL[tp]; - if (pop_current_level == 3 && room == 2) return 1; - if (room == room_L && col == 9) return 1; - if (room == cur_room && col != 9) return 1; - return 0; -} - -static void animate_door(uint8_t *m, int8_t *type, uint8_t audible) -{ - int8_t anim_type = *type; - uint8_t mod = *m; - if (anim_type >= 0) { - if (anim_type >= 3) { /* быстрое закрытие */ - if (anim_type < 8) { anim_type++; *type = anim_type; } - { - int new_mod = (int)mod - gate_close_speeds[anim_type]; - if (new_mod < 0) { mod = 0; *type = -1; pop_sfx_play(6); } - else mod = (uint8_t)new_mod; - } - } else if (mod != 0xFF) { - mod = (uint8_t)(mod + door_delta[anim_type]); - if (anim_type == 0) { /* закрытие */ - /* seg007:376: скрип закрывающейся решётки — раз в четыре шага - * модификатора; лязг «встала» (7) — в конце. Оба через - * гейт слышимости (gate_stop, seg007:05E3, тоже через него). */ - if (mod != 0) { - if (mod < 188 && (mod & 3) == 3 && audible) pop_sfx_play(4); - } else { - *type = -1; - if (audible) pop_sfx_play(7); /* gate_stop */ - } - } else { /* открытие */ - if (mod >= 188) { - /* Лязг после ОБЫЧНОГО открытия оригинал даёт без гейта - * (seg007:395 — прямой play_sound), а после открытия - * насовсем — через gate_stop, то есть с гейтом. */ - if (anim_type < 2) { mod = 238; *type = 0; pop_sfx_play(7); } - else { - mod = 0xFF; *type = -1; - if (audible) pop_sfx_play(7); - } - } else if ((mod & 7) == 0) pop_sfx_play(5); /* seg007:386 */ - } - } else { - *type = -1; - if (audible) pop_sfx_play(7); /* gate_stop, seg007:404 */ - } - } - *m = mod; -} - -uint8_t pop_trob_room_active(uint8_t room) __banked -{ - uint8_t i; - for (i = 0; i < trobs_count; i++) - if (trobs[i].room == room) return 1; - return 0; -} - - -/* Темп анимации пламени в ЛОГИЧЕСКИХ кадрах (один логический кадр = 3 - * vsync и соответствует игровому тику оригинала): - * 1 — кадр пламени каждый тик, как в оригинале; кадры при этом ровные по - * тактам, что нужно для счёта бюджета; - * 2 — вдвое реже (так было до 2026-07-30; пламя шло на половинной - * скорости, а бюджет кадра «прыгал» на 6.2 % от того, попал кадр на - * анимацию или нет). */ -#define TORCH_ANIM_DIV 1 - -static uint8_t torch_tick; -#if TORCH_ANIM_DIV > 1 -#define TORCH_ANIM_NOW ((uint8_t)(torch_tick % TORCH_ANIM_DIV) == 0) -#else -#define TORCH_ANIM_NOW 1 -#endif - -void pop_trob_qsave(pop_qs_io_t *io) __banked -{ - uint8_t i; - pop_qs_bytes(io, room_modif, sizeof(room_modif)); - pop_qs_bytes(io, room_seen, sizeof(room_seen)); - pop_qs_u8(io, &trobs_count); - for (i = 0; i < TROBS_MAX; i++) { - pop_qs_u8(io, &trobs[i].room); - pop_qs_u8(io, &trobs[i].tilepos); - pop_qs_i8(io, &trobs[i].type); - } - pop_qs_u16(io, &trob_seed.lo); - pop_qs_u16(io, &trob_seed.hi); - pop_qs_u8(io, &torch_tick); - if (io->reading && io->apply) { - if (trobs_count > TROBS_MAX) { io->failed = 1; return; } - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); - } -} - -void pop_process_trobs(uint8_t cur_room) __banked -{ - uint8_t i, w = 0; -#if TORCH_ANIM_DIV > 1 - torch_tick++; -#endif - - /* Перерисовка «покоя» законченных пик/кнопок (обе страницы). - * row/col ведём бегущими счётчиками, а НЕ через i/10, i%10: иначе SDCC - * выносит оба деления (__divuchar/__moduchar) в вершину цикла как общее - * подвыражение аргументов redraw — 30*2=60 делений/кадр даже когда нет - * активных пик/кнопок (тот же случай, что был в pop_loose_tick). */ - if (trobs_count == 0) return; - - /* Префетч кодов тайлов всех trob'ов за ОДИН map/unmap окна 0, а не - * pop_level_tile() на каждый trob (тот свапал W0 каждый вызов = N свапов - * за кадр даже без анимации). Дальше цикл (с редроями) идёт с - * размапленным W0 — как раньше. */ - { - uint8_t k; - pop_level_access_begin(); - for (k = 0; k < trobs_count; k++) { - uint8_t tp = trobs[k].tilepos; - uint8_t c = pop_level_tile_raw(trobs[k].room, tp); - trob_code[k] = c; - trob_rcode[k] = 0; - if ((c == TILE_TORCH || c == TILE_TORCH_DEBRIS) && TP_COL[tp] < 9) - trob_rcode[k] = (uint8_t)(pop_level_tile_raw(trobs[k].room, - (uint8_t)(tp + 1)) & 0x1F); - } - pop_level_access_end(); - } - - pop_dbg_m8(); /* ЗАМЕР: префетч кодов тайлов сделан */ - - /* Указатель на модификаторы КОМНАТЫ кэшируется между итерациями. - * - * pop_trob_modif объявлен __banked, и вызов его на КАЖДЫЙ trob — это - * трамплин из банка 6 в банк 6 же... нет: из горячего цикла в банковую - * функцию, то есть полный переход через резидент. А комната у trob'ов - * в подавляющем большинстве кадров ОДНА (все они из cur_room, чужие - * появляются лишь у брошенных плит соседней комнаты). Тот же паттерн - * «трамплин в цикле», что дал −23 784 на луче видимости стража - * (P2b) и −14 118 на guard_over_kid (P16). - * - * Сбрасывается на каждом кадре: room_seen внутри pop_trob_modif живёт - * дольше, но указатель на строку room_modif может смениться при - * перезагрузке комнаты, поэтому кэш локальный для одного прохода. */ - { - uint8_t mod_room = 0; /* 0 = «ещё не брали» (комнаты 1..24) */ - uint8_t *mod = 0; - /* Сосед СЛЕВА нужен гейту слышимости решёток (door_audible). Берём один - * раз на проход: pop_room_link маппит страницу уровня, а решёток в - * списке может быть несколько. */ - uint8_t room_L = pop_room_link(cur_room, 0 /* L */); - - for (i = 0; i < trobs_count; i++) { - uint8_t room = trobs[i].room; - uint8_t tp = trobs[i].tilepos; - uint8_t code = trob_code[i]; - int8_t type = trobs[i].type; - - if (room != mod_room) { mod = pop_trob_modif(room); mod_room = room; } - - switch (code) { - case TILE_SPIKE: - animate_spike(&mod[tp], &type); - break; - case TILE_CHOMP: - animate_chomper(&mod[tp], &type, room, tp, cur_room); - break; - case TILE_OPENER: - case TILE_CLOSER: - animate_button(mod[tp], &type); /* mod[tp] = индекс LINKLOC кнопки */ - break; - case TILE_GATE: - animate_door(&mod[tp], &type, door_audible(room, tp, room_L, cur_room)); - break; - case TILE_LOOSE: - animate_loose(&mod[tp], &type, room, tp, cur_room); - break; - case TILE_LEVELDOOR: - animate_leveldoor(&mod[tp], &type, cur_room); - break; - case TILE_TORCH: - case TILE_TORCH_DEBRIS: - /* animate_torch (seg007:03C1): анимация вечная — type остаётся - * 1, пока комната отрисована. Темп — TORCH_ANIM_DIV. */ - if (room == cur_room && TORCH_ANIM_NOW) - mod[tp] = get_torch_frame(mod[tp]); - break; - case TILE_POTION: - /* animate_potion (seg007:03E9): крутим младшие 3 бита (фаза - * пузырька), старшие 5 — тип зелья. */ - if (room == cur_room) - mod[tp] = (uint8_t)((mod[tp] & 0xF8) | bubble_next_frame(mod[tp] & 7)); - break; - case TILE_SWORD: - /* animate_sword (seg007:0425): счётчик вниз; на 0 — новый период - * 0x28..0x67. Блеск рисуется РОВНО на modif==1 (draw_tile берёт - * кадр (modif==1)+10), т.е. одиночная вспышка раз в 40..103 тика. */ - if (room == cur_room) { - if (--mod[tp] == 0) - mod[tp] = (uint8_t)((trob_prandom(255) & 0x3F) + 0x28); - } - break; - default: - type = -1; - break; - } - trobs[i].type = type; - - if (room == cur_room && - (code == TILE_TORCH || code == TILE_TORCH_DEBRIS || code == TILE_POTION)) { - /* Пламя ЗАПЕКАЕТСЯ в фон (GFX_BANK_NORMAL внутри pop_torch_draw), - * пузырёк зелья — нет, ему нужен heal. Порядок «пламя раньше - * перерисовок тайлов» обязателен: heal чомпера-соседа вернёт - * запечённый огонь из ОЗУ-копии, а его собственная графика ляжет - * ПОВЕРХ — ровно как в оригинале, где draw_tile_anim_right (пламя - * левого соседа) идёт до draw_tile_anim (сам чомпер). Выносить - * отрисовку ПОСЛЕ pop_redraw_needed нельзя: пламя окажется поверх - * челюстей. */ - /* Таблицей, а не tp/10 и tp%10: у Z80 деления нет, SDCC зовёт - * __divuchar + __moduchar — на два факела это четыре вызова за - * кадр (замер MAME). Тайл всегда 0..29. */ - uint8_t trow = TP_ROW[tp], tcol = TP_COL[tp]; - if (code == TILE_POTION) { - pop_potion_draw(trow, tcol, mod[tp]); - } else { - pop_torch_draw(trow, tcol, mod[tp]); - /* Порт set_redraw_anim_right (seg007:0101): animate_torch метит - * ПРАВОГО СОСЕДА, и redraw_needed рисует его слой anim в - * порядке draw_tile_anim_topright -> draw_tile_anim_right - * (пламя) -> draw_tile_anim (СВОЯ графика тайла). То есть в - * оригинале челюсти чомпера возвращаются поверх огня КАЖДЫЙ - * кадр факела, а не только пока жива их собственная анимация. - * - * У нас пламя запекается напрямую (pop_torch_draw), минуя - * механизм пометок, поэтому у ЗАСТЫВШЕГО чомпера возвращать - * его было нечем — огонь накрывал челюсти (баг найден на - * уровне 4). Метим сосед-тайл сами, ОДНУ страницу: факел - * анимируется каждый кадр, значит обе страницы получат свою - * перерисовку по очереди. Порядок сходится: этот блок идёт - * ДО pop_redraw_needed. - * - * РАСХОЖДЕНИЕ С ОРИГИНАЛОМ (осознанное): он метит соседа - * безусловно, мы — только когда там чомпер. Безусловная - * пометка = перерисовка тайла каждый кадр на каждый факел, - * а слой anim рисует ещё пики/зелье/меч (seg008:644). Их - * случай «застыл справа от факела» в BUGS_OPEN.md как открытый: - * пики и меч рядом с факелом на уровнях 1-4 не встретились. */ - if (trob_rcode[i] == TILE_CHOMP) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_CHOMP_ANIM, 1); - } - } - if (room == cur_room && code == TILE_SPIKE) { - /* ПИКИ — редрой КАЖДЫЙ кадр, пока trob жив: animate_spike - * (seg007:0353) зовёт redraw_21h БЕЗУСЛОВНО, а не по смене кадра. - * Это не «лишняя работа оригинала»: выдвинутая пика живёт только в - * видео-ОЗУ (банк SPRITE, в фон не запечена), а heal персонажа каждый кадр - * возвращает под спрайтом Кида ПЕЧЁНЫЙ фон — то есть стирает те - * части остриёв, что попали под его прямоугольник. При редрое - * по смене кадра пика держится 15 кадров (modif 0x8F..0x81) с - * неизменной сигнатурой, и стёртое уже не возвращается: рядом с - * Кидом остриё пропадало, а нижний кусок мерцал (стёрт на одной - * странице дабл-буфера из двух). */ - /* Последний кадр (пика убралась, trob умирает) — пометить ОБЕ - * страницы: живой trob метит каждый кадр по одной. */ - pop_set_redraw(tp, POP_RD_SPIKE, (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_CHOMP) { - /* ТОЛЬКО ПОКА ФАЗА < 6 — как в оригинале (animate_chomper, - * seg007:0448 заканчивается `if ((curr_modifier & 0x7F) < 6) - * redraw_at_trob();`). - * - * Это не оптимизация оригинала, а точное следствие таблицы поз: - * CHOMP_FRAM1 = {3,2,0,1,4,3,3}, то есть с фазы 5 и до конца - * круга (POP_CHOMPER_SPEED = 15) поза одна и та же — 3. - * Перерисовывать её десять кадров подряд значит рисовать ровно - * ту же картинку, а стоит это 190 260 тактов НА КАДР: полный - * draw_tile плюс heal 32x64, 24 % работы кадра в 11/15 - * (замер 2026-08-19). - * - * На фазе 5 метим ОБЕ страницы дабл-буфера: она последняя - * рисуемая, и её поза обязана лечь на обе, иначе на второй - * останется поза фазы 4 и чомпер будет дрожать через кадр. - * Сходится и по кадрам: вторую страницу эта пометка догоняет в - * кадре фазы 6, где поза та же самая (CHOMP_FRAM1[6] == 3). - * - * Про type < 0 отдельной ветки больше нет: trob снимается сам - * только при frame >= 6 (см. animate_chomper выше), то есть - * когда перерисовки уже не идут, а на экране с фазы 5 лежит - * финальная поза на обеих страницах. */ - uint8_t ph = (uint8_t)(mod[tp] & 0x7F); - if (ph < 6) - pop_set_redraw(tp, POP_RD_CHOMP, (uint8_t)(ph == 5 ? 2 : 1)); - } - if (room == cur_room && code == TILE_GATE) { - /* draw_trob (seg007:01E6), которым заканчивается animate_door: - * пока trob жив — решётка едет каждый кадр, помечаем ТЕКУЩУЮ - * страницу; последний кадр (type<0, ворота встали) — ОБЕ, иначе - * на второй странице дабл-буфера застынет предыдущее положение - * и решётка дрожит через кадр. Тайлпос — САМИ ворота, соседа - * справа выбирает pop_gate_redraw. */ - pop_set_redraw(tp, POP_RD_GATE, (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_LEVELDOOR) { - /* Створка едет каждый кадр — перерисовываем ПРАВУЮ половину (там - * её рисует draw_tile_anim_right) С ЗАПЕЧКОЙ в ОЗУ-копию: иначе - * heal персонажа вернул бы из фона закрытую створку. Куски двери - * непрозрачны, поэтому wipe не нужен. */ - /* Створку рисует ПРАВАЯ половина двери; последний кадр анимации - * помечаем на обе страницы, иначе дверь дрожит через кадр. */ - if (TP_COL[tp] < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_LEVELDOOR, - (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_SWORD) { - /* МЕЧ — редрой только на смене видимого кадра (блеск = modif==1): - * спрайт запечён в фон (draw_tile), поэтому перерисовываем тайл - * той же схемой, что и кнопку — текущая страница сразу, вторая - * следующим кадром через rest-цикл. */ - uint8_t sig = (uint8_t)(mod[tp] == 1); - if (sig != trob_drawn[tp]) { - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - trob_drawn[tp] = sig; - } - } - if (room == cur_room && (code == TILE_OPENER || code == TILE_CLOSER)) { - /* КНОПКА — редрой только при смене видимого состояния (нажата = - * таймер связи >1): пока Кид её держит, картинка стабильна. - * Рисуем ТЕКУЩУЮ страницу сразу + =1 (вторая страница - * дабл-буфера следующим кадром через rest-цикл). tp/10,tp%10 - * считаем только в момент редроя (редко), а не каждый кадр. */ - uint8_t sig = (uint8_t)(get_doorlink_timer(mod[tp]) > 1); - if (sig != trob_drawn[tp]) { - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - trob_drawn[tp] = sig; - } - } - } - } /* конец блока с кэшем mod/mod_room */ - - /* compact: удалить завершённые (type < 0). */ - for (i = 0; i < trobs_count; i++) - if (trobs[i].type >= 0) trobs[w++] = trobs[i]; - trobs_count = w; -} diff --git a/applications/PoP/roomtest/pop_trob.h b/applications/PoP/roomtest/pop_trob.h deleted file mode 100644 index eb7d998..0000000 --- a/applications/PoP/roomtest/pop_trob.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * pop_trob.h — P0-каркас: персистентное per-room modifier-состояние + - * список анимируемых тайлов (trob). Порт SDLPoP seg007 (process_trobs/ - * add_trob/animate_tile) + curr_room_modif. - * - * ЗАЧЕМ: тайлы-объекты (пики, ворота, кнопки) имеют состояние (modifier), - * которое живёт МЕЖДУ входами в комнату и может меняться КРОСС-КОМНАТНО - * (кнопка в одной комнате открывает ворота в другой). room_modif[room] - * — единственный источник модификаторов для отрисовки (pop_bg draw_tile - * читает его как bg), как curr_room_modif в оригинале. - * - * Список trob хранит (room, tilepos, type) активных анимаций; каждый кадр - * pop_process_trobs продвигает их (animate_spike/door/button по коду тайла), - * пишет результат в room_modif и перерисовывает изменившиеся тайлы ТЕКУЩЕЙ - * комнаты на back-странице (2-page, как loose). Невидимые комнаты - * анимируются в состоянии (без отрисовки) — при входе рисуются статически. - */ -#ifndef POP_TROB_H -#define POP_TROB_H - -#include "pop_qsave.h" - -#include - -#define POP_NROOMS 24 -#define POP_ROOMTILES 30 - -/* Сброс всего состояния (новый уровень / рестарт): забыть все комнаты и - * очистить список trob. */ -void pop_trob_reset(void) __banked; -void pop_trob_qsave(pop_qs_io_t *io) __banked; - -/* Указатель на persistent modifier-массив комнаты room (1..24), 30 байт. - * При ПЕРВОМ обращении лениво инициализируется из backtable уровня - * (pop_level_room_bg). Далее ЖИВЁТ (не перезагружается). room вне - * диапазона → 0. */ -uint8_t *pop_trob_modif(uint8_t room) __banked; - -/* Добавить/обновить trob (room, tilepos, type). Если уже есть — сменить - * type (как SDLPoP add_trob/find_trob). type<0 = будет удалён. */ -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked; - -/* Продвинуть все trob на кадр (animate_* по коду тайла из уровня), записать - * modif, перерисовать тайлы ТЕКУЩЕЙ (cur_room) комнаты на back-странице. - * Звать в основном цикле ПОСЛЕ set_draw_page(back), рядом с loose. */ -void pop_process_trobs(uint8_t cur_room) __banked; - -/* Кид встал на кнопку (opener/closer): взвести таймер связи + обойти цепочку - * LINKLOC, добавив trob целям (ворота). Порт seg007 trigger_button. - * room/tilepos — кнопка; button_type — её тайл-код; modifier — её modif - * (= индекс в LINKLOC). Звать из check_press (pop_map). */ -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked; - -/* Есть ли активные trob в комнате room? Для перерисовки ворот соседа через - * шов (roomtest не дёргает шов, пока сосед не анимируется). */ -uint8_t pop_trob_room_active(uint8_t room) __banked; - -/* Смена комнаты: сбросить отложенные перерисовки «покоя» текущей комнаты - * (trob-состояние в room_modif персистентно и НЕ трогается). Звать в - * enter_room. */ -void pop_trob_room_changed(void) __banked; - -/* anim_tile_modif (seg000:0B12): завести анимации тайлов комнаты (факелы, - * зелья) со случайной стартовой фазой. Звать в enter_room. */ -void pop_trob_anim_room(uint8_t room) __banked; - -/* start_chompers (seg007:0F13): запустить чомперы РЯДА персонажа. Звать - * там же, где оригинал: смена ряда в play_seq (SEQ_UP/SEQ_DOWN), start_fall, - * приземление и вход в комнату. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked; - -#endif diff --git a/applications/PoP/roomtest/pop_tune.h b/applications/PoP/roomtest/pop_tune.h deleted file mode 100644 index 3b92b65..0000000 --- a/applications/PoP/roomtest/pop_tune.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * pop_tune.h — НАСТРАИВАЕМЫЕ КОНСТАНТЫ движка (аналог custom_options - * SDLPoP) в одном месте. - * - * Зачем отдельный заголовок. У оригинала «особые события» уровней зашиты - * магическими числами прямо в код (`current_level == 3 && Char.room == 7`), - * и SDLPoP вынес их в структуру `custom_options_type` (types.h) с - * загрузкой из SDLPoP.ini и правкой через меню Settings/Mods. Нам нужно - * то же самое по двум причинам: - * - * 1. ОТЛАДКА. Некоторые сцены руками почти не проверить (успеть в - * закрывающуюся решётку), и единственный вменяемый способ — временно - * растянуть тайминг. Такие крутилки обязаны жить в одном месте, а не - * прятаться числами по трём модулям. - * 2. МОДЫ. Тот, кто захочет свой набор уровней, меняет ровно эти числа. - * - * Пока это только `#define` — ни INI, ни меню нет (см. TASKS_OPEN.md, запись - * TUNE-1). Но правило уже действует: НОВОЕ «особое событие» или тайминг - * заводится ЗДЕСЬ, а не константой по месту. Имена — как у SDLPoP - * (custom->имя), чтобы сверка с оригиналом оставалась механической. - */ -#ifndef POP_TUNE_H -#define POP_TUNE_H - -/* ---- Чекпойнт уровня 3 (SDLPoP: checkpoint_*) ----------------------- * - * Оригинал: level3_set_chkp (seg002:0665) взводит флаг, когда Кид уходит - * ВЛЕВО ИЗ комнаты 7 (вызов стоит до goto_other_room, поэтому Char.room там - * ещё старая); do_startpos (seg003:0141) подменяет по - * нему стартовую позицию и убирает loose-плиту, через которую туда - * попадают (иначе после респавна дорога назад была бы уже провалена). */ -#define POP_CHKP_LEVEL 3 /* checkpoint_level */ -#define POP_CHKP_ROOM 7 /* комната, ИЗ КОТОРОЙ уходят влево (у - * SDLPoP хардкод; это НЕ комната - * назначения — см. roomtest.c) */ -#define POP_CHKP_RESPAWN_ROOM 2 /* checkpoint_respawn_room */ -#define POP_CHKP_RESPAWN_TILEPOS 6 /* checkpoint_respawn_tilepos */ -#define POP_CHKP_RESPAWN_DIR (-1) /* checkpoint_respawn_dir: влево */ -#define POP_CHKP_CLEAR_ROOM 7 /* checkpoint_clear_tile_room */ -#define POP_CHKP_CLEAR_COL 4 /* checkpoint_clear_tile_col */ -#define POP_CHKP_CLEAR_ROW 0 /* checkpoint_clear_tile_row */ - -/* ---- Отладочные крутилки (в оригинале и в SDLPoP их НЕТ) ------------ * - * POP_DBG_GATE_HOLD — сколько кадров решётка держится поднятой после - * нажатия кнопки, ПРЕЖДЕ чем пойдёт вниз. В оригинале это таймер связи - * дверей: trigger_button ставит 5, animate_button вычитает по единице, и - * решётка стоит, пока таймер > 1 (то есть ~4 кадра после того, как Кид - * сошёл с кнопки). Проверять руками проход в закрывающуюся решётку при - * таком окне почти невозможно, поэтому значение вынесено сюда: поставь - * 30 — и успеешь дойти спокойно. ОБЯЗАН быть 5 в игровой сборке. - * - * ПОТОЛОК 30. Таймер связи — пять бит модификатора кнопки (маска 0x1F), а - * значение 31 у оригинала означает «событие заклинено» (`link_timer != 0x1F` - * в trigger_button). Больше 30 ставить нельзя — кнопка перестанет - * срабатывать вовсе. */ -#define POP_DBG_GATE_HOLD 5 - -/* ---- Улучшения SDLPoP (в ОРИГИНАЛЕ их нет) -------------------------- * - * POP_ENABLE_JUMP_GRAB — зацепиться за кромку можно ПРЯМО В ПРЫЖКЕ, если - * Shift зажат заранее (SDLPoP `enable_jump_grab`, seg006:1228). Ваниль - * разрешает зацеп только в начале падения (`check_grab`, кадры 102..105), - * то есть Shift приходится нажимать уже в полёте — это и раздражало на - * приёмке. 0 — как в оригинале, 1 — как в SDLPoP с включёнными - * enhancements. */ -#define POP_ENABLE_JUMP_GRAB 1 - -/* ---- Чомперы (SDLPoP: custom->chomper_speed) ------------------------ * - * Период смыкания челюстей в кадрах: фаза крутится 1..N и сбрасывается в 1. - * В оригинале 15; SDLPoP выносит это в настройку, потому что на разных - * уровнях моды любят делать чомперы быстрее. Меньше — злее. */ -#define POP_CHOMPER_SPEED 15 - -/* ---- Отладка сцены «тень крадёт зелье» (уровень 5) ------------------ * - * Тень появляется в комнате 24 сразу при входе, но СТОИТ, пока не откроют - * ворота (кол 1, ряд 0, openness >= 80) — так в оригинале - * (autocontrol_shadow_level5, seg002:1157). Чтобы посмотреть саму сцену - * (подход, питьё, уход), не проходя уровень до кнопки, поставь 1: тень - * стартует запись ходов сразу. ОБЯЗАН быть 0 в игровой сборке. */ -#ifndef POP_DBG_SHADOW_NOWAIT -#define POP_DBG_SHADOW_NOWAIT 0 -#endif - -/* ---- Зелье МЕДЛЕННОГО ПАДЕНИЯ (SDLPoP: FEATHER_FALL_LENGTH) ---------- * - * В оригинале длительность эффекта задана НЕ таймером, а звуком: эффект - * держится, пока играет sound_39_low_weight, и снимается принудительно на - * 225-м тике (do_timers, seg003:0517). Звука у нас нет, поэтому берём тот - * же порог напрямую — 225 ИГРОВЫХ КАДРОВ (у оригинала тик do_timers = кадр - * игрового цикла; 225 кадров при его 12 fps и есть FEATHER_FALL_LENGTH = - * 18,75 с из фикса SDLPoP). По ВРЕМЕНИ у нас выйдет короче ровно настолько, - * насколько наша игра быстрее оригинала — это общий вопрос темпа - * (TASKS_OPEN.md, L1-SPEED), а не свойство зелья. */ -#define POP_FEATHER_FRAMES 225 - -/* ---- Спецсобытие «МЫШЬ» (уровень 8, комната 16) ---------------------- * - * Кнопка (0,7) комнаты 16 открывает решётку (0,3) — ту, за которой лежит - * путь через комнату 4 (два чомпера) к кнопке выхода в комнате 3. Сам Кид - * до кнопки с левой площадки не дотягивается (провал в колонках 4..6), - * поэтому, когда дверь уровня уже открыта, а он всё ещё в комнате 16, - * оригинал через 150 тиков присылает мышь: она пробегает справа налево по - * верхнему ряду, наступает на кнопку и убегает обратно (do_timers - * seg003:0545, do_mouse seg003:0ABA, autocontrol_mouse seg002:07EB). - * - * Числа — custom-константы SDLPoP (data.h:821): уровень/комната/задержка/ - * стартовая X. Пороги разворота (166) и исчезновения (200) — литералы - * autocontrol_mouse. Задержка в ИГРОВЫХ КАДРАХ, как POP_FEATHER_FRAMES. */ -#define POP_MOUSE_LEVEL 8 -#define POP_MOUSE_ROOM 16 -#define POP_MOUSE_DELAY 150 -#define POP_MOUSE_START_X 200 -#define POP_MOUSE_TURN_X 166 /* x < этого — развернуться и уйти */ -#define POP_MOUSE_LEAVE_X 200 /* x >= этого в стойке — исчезнуть */ - -/* С какого уровня начинается игра (-DFIRST_LEVEL=N при сборке). Живёт - * здесь, а не в roomtest.c: старт уровня уехал в холодную половину цикла - * (roomtest_cold.c, банк 8), и константа нужна обеим. */ -#ifndef FIRST_LEVEL -#define FIRST_LEVEL 1 -#endif - -/* Уровень с зельем инверсии (переворот экрана). По нему делается - * ПРЕДзагрузка зеркального набора спрайтов персонажей — чтобы пауза на - * чтение 34 страниц пришлась на загрузку уровня, а не на глоток зелья. */ -#define POP_UPSIDE_LEVEL 9 - -/* Уровень ПАДАЮЩИХ ПЛИТ (custom->loose_tiles_*, seg000:1317 check_fall_flo). - * При входе в комнату 23 или 16 тринадцатого уровня вся гряда loose ряда 2 - * комнаты СВЕРХУ получает ОТРИЦАТЕЛЬНУЮ фазу — отложенный старт, — и плиты - * сыплются на Кида вразнобой. Комнаты сверху — 17 и 1 соответственно, и в - * них ряд 2 колонок 2..7 действительно loose (сверено по res2013.bin, - * ../docs/levels_12_15_plan.md §7.1). Диапазон 22..27 — надмножество: в - * комнате 1 тайл 24 пустой, и он молча пропускается. - * - * Комната 23 у этого уровня ещё и СТАРТОВАЯ, то есть плиты сыплются с - * первого кадра уровня — это его открывающая сцена, а не событие в - * середине. */ -#define POP_LOOSE_TILES_LEVEL 13 -#define POP_LOOSE_TILES_ROOM1 23 -#define POP_LOOSE_TILES_ROOM2 16 -#define POP_LOOSE_TILES_FIRST 22 /* ряд 2, колонка 2 */ -#define POP_LOOSE_TILES_LAST 27 /* ряд 2, колонка 7 */ - -/* Бесшовный выход уровня (tbl_seamless_exit, play_level_2 seg000:900). У - * оригинала это таблица по уровням, но заполнена она ровно одной парой: - * уровень 12 кончается, как только Кид попал в комнату 23 — двери уровня у - * него нет. Комната 23 у 13-го уровня СТАРТОВАЯ и совпадает геометрией - * ряда, поэтому шва не видно (../docs/levels_12_15_plan.md §1.7). */ -#define POP_SEAMLESS_LEVEL 12 -#define POP_SEAMLESS_ROOM 23 - -#endif /* POP_TUNE_H */ diff --git a/applications/PoP/roomtest/pop_ui.c b/applications/PoP/roomtest/pop_ui.c deleted file mode 100644 index d747212..0000000 --- a/applications/PoP/roomtest/pop_ui.c +++ /dev/null @@ -1,434 +0,0 @@ -/* - * pop_ui.c — текст, палитровый fade и full-screen примитивы (FG5, банк 9). - * - * Шрифты извлечены из SDLPoP в FONT\FONT.ATL. Внутри map/unmap разрешены - * лишь обращения к EMM/W0: всё, что ждёт кадр или трогает BIOS-палитру, - * выполняется строго после unmap. Это общий контракт для menu/title/PV. - */ -#include -#include -#include -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF/POP_PLAYFIELD_H — граница игрового поля */ -#include "pop_font.h" -#include "pop_arc.h" -#include "pop_ui.h" -#include "pop_status.h" - -typedef struct { - uint8_t base; - uint8_t ascent; - uint8_t space; - uint8_t first; /* первый код, который есть в наборе */ - uint8_t last; -} pop_font_desc_t; - -/* Тёмный набор — тот же мелкий шрифт другим цветом; глифов в нём меньше - * (см. pop_font.h), поэтому диапазон кодов хранится у каждого набора. */ -static const pop_font_desc_t font_desc[] = { - { POP_FONT_SMALL_BASE, POP_FONT_SMALL_ASCENT, POP_FONT_SMALL_SPACE, - POP_FONT_FIRST, POP_FONT_LAST }, - { POP_FONT_BIG_BASE, POP_FONT_BIG_ASCENT, POP_FONT_BIG_SPACE, - POP_FONT_FIRST, POP_FONT_LAST }, - { POP_FONT_DARK_BASE, POP_FONT_BIG_ASCENT, POP_FONT_BIG_SPACE, - POP_FONT_DARK_FIRST, POP_FONT_DARK_LAST } -}; - -static atlas_t font_at; -static uint8_t font_ready; - -/* БУФЕР ПАЛИТРЫ ПО ФИКСИРОВАННОМУ АДРЕСУ 0x4000. DSS занимает эти 256 - * байт только при загрузке программы, дальше они наши (код начинается с - * 0x4100), и держать буфер здесь дешевле, чем класть 256 байт на стек в - * каждом вызове — идея пользователя, 2026-08-25. */ -__at (0x4000) uint8_t pop_pal_buf[256]; - -static uint8_t text_index(const pop_font_desc_t *font, uint8_t ch) -{ - if (ch < font->first || ch > font->last) ch = '?'; - return (uint8_t)(font->base + ch - font->first); -} - -int pop_ui_init(void) __banked -{ - if (font_ready) return 0; - if (atlas_load(&font_at, "FONT\\font.atl") != 0) return -1; - font_ready = 1; - return 0; -} - -void pop_ui_free(void) __banked -{ - if (!font_ready) return; - atlas_free(&font_at); - font_ready = 0; -} - -uint8_t pop_ui_ready(void) -{ - return font_ready; -} - -void pop_text_map(void) -{ - gfx_w0_map(font_at.page); -} - -void pop_text_unmap(void) -{ - gfx_w0_unmap(); -} - -uint8_t pop_text_width_mapped(pop_text_font_t font, const char *s) -{ - const pop_font_desc_t *desc = &font_desc[font]; - uint8_t width = 0; - - while (*s) { - const uint8_t *img = (const uint8_t *)atlas_image(&font_at, - text_index(desc, (uint8_t)*s++)); - width = (uint8_t)(width + img[0] + desc->space); - } - return width ? (uint8_t)(width - desc->space) : 0; -} - -void pop_text_draw_mapped(pop_text_font_t font, int x, int baseline, - const char *s) -{ - const pop_font_desc_t *desc = &font_desc[font]; - - while (*s) { - const uint8_t *img = (const uint8_t *)atlas_image(&font_at, - text_index(desc, (uint8_t)*s++)); - /* Пробел не рисует НИ ОДНОГО пикселя: его глиф целиком 0xFF, а - * текст всегда идёт прозрачным банком. Блит при этом стоит те же - * ~4,6 тыс. тактов, что и буква, поэтому в строке из полусотни - * символов пропуск пробелов — самая дешёвая экономия, какая тут - * есть (важно для статус-строк, они рисуются в игровом кадре). - * У крупного пробела вдобавок высота 0: для accel это 256 строк, - * и нулевой блит нельзя отдавать ядру даже noclip-вариантом. */ - if (img[2] && s[-1] != ' ') gfx_blit_noclip(x, baseline - desc->ascent, img); - x += img[0] + desc->space; - } -} - -void pop_text_center_mapped(pop_text_font_t font, int center, int baseline, - const char *s) -{ - pop_text_draw_mapped(font, center - pop_text_width_mapped(font, s) / 2, - baseline, s); -} - -void pop_text_right_mapped(pop_text_font_t font, int right, int baseline, - const char *s) -{ - pop_text_draw_mapped(font, right - pop_text_width_mapped(font, s), - baseline, s); -} - -/* W0 свободно: snapshot кладём в зарезервированный хвост страницы шрифта. - * 4 × 256 Б = ровно 1024 Б, [0x3C00,0x4000), и не пересекаются с атласом. */ -/* Снимок палитры лежит в странице шрифта (в W2 килобайта нет). Копируем - * memcpy, а не циклом: у SDCC это LDIR — 256 байт за ~5 400 тактов против - * примерно ста тысяч у побайтового цикла на C. Именно этот цикл и делал - * пересчёт палитры шестикадровым (замер 2026-08-26). */ -static void snapshot_chunk(uint8_t chunk, uint8_t *buf, uint8_t store) -{ - uint8_t *slot; - - gfx_w0_map(font_at.page); - slot = (uint8_t *)(POP_FONT_SNAPSHOT_OFF + (uint16_t)chunk * 256u); - if (store) memcpy(slot, buf, 256); - else memcpy(buf, slot, 256); - gfx_w0_unmap(); -} - -/* Снимок палитры целиком: дробить на мелкие порции больше не нужно — - * причина скрежета была не в длительности BIOS-вызова, а в том, какое окно - * он под себя забирал (см. pop_pal_buf выше). */ - -void pop_ui_palette_snapshot(void) __banked -{ - uint8_t chunk; - - if (!font_ready) return; - for (chunk = 0; chunk < 4; chunk++) { - gfx_pal_get(0, (uint8_t)(chunk << 6), 64, pop_pal_buf); - snapshot_chunk(chunk, pop_pal_buf, 1); - } -} - -/* Из одного исходного снимка приготовить обе экранные палитры. Умножения - * нет: шкала 1/4, 1/2, 3/4 на 8-битном значении не должна тащить делитель - * в постоянно вызываемый (во время fade) путь. */ -/* ВОСЕМЬ СТУПЕНЕЙ, а не четыре. Fade у оригинала идёт 64 шагами по два - * тика — 2,13 с плавного затухания; наши четыре ступени укладывались в - * доли секунды и выглядели как моргание, а растянуть их по времени значило - * получить четыре заметных скачка яркости. - * - * Яркость ступени — простое умножение: (v * (8 - step)) >> 3. Через - * switch с парами сдвигов выходило дороже: 768 каналов на вызов, и цепочка - * сравнений SDCC съедала больше, чем стоит само умножение. - * - * dim_step: 0 — исходная, 8 — чёрная. */ -void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked -{ - /* ТАБЛИЦА ЯРКОСТИ — НА СТЕКЕ, и это главное здесь по времени. - * - * Замер в MAME (2026-08-26): вызов стоил 2,44 млн тактов, то есть почти - * шесть кадров, из которых на BIOS-заливку палитры уходило всего 136 - * тысяч (8 x 17 000). Остальное съедал пересчёт: 768 умножений - * uint16 в кадровом цикле — на Z80 это вызов библиотечной функции на - * каждый канал. Со ста вызовами подряд (fade кадр за кадром) набегало - * больше десяти секунд — ровно то «очень долгое затемнение», которое - * поймал пользователь. - * - * Теперь таблица строится один раз на ступень (256 сложений, без - * единого умножения), а каналы её просто читают. 256 байт стека — - * дешёвая плата: в этой точке израсходована едва сотня байт из 1279. - * - * Вместе с memcpy для снимка это дало 487 тысяч тактов на вызов против - * 2,44 млн (замер в MAME 2026-08-26). */ - uint8_t lut[256]; - uint8_t chunk, i, start; - uint8_t *buf = pop_pal_buf; - - if (!font_ready) return; - if (dim_step > POP_PAL_DIM_BLACK) dim_step = POP_PAL_DIM_BLACK; - if (dim_step) { - uint8_t mul = (uint8_t)(POP_PAL_DIM_BLACK - dim_step); - uint16_t v = 0; - - /* Без умножения вовсе: значение растёт на mul/32 с каждым шагом, - * дробная часть копится в младших пяти битах аккумулятора. */ - for (i = 0; ; i++) { - lut[i] = (uint8_t)(v >> 5); - v += mul; - if (i == 255) break; - } - } - for (chunk = 0; chunk < 4; chunk++) { - start = (uint8_t)(chunk << 6); - snapshot_chunk(chunk, buf, 0); - if (dim_step) { - uint8_t *p = buf; - - for (i = 0; i < 64; i++, p += 4) { - uint8_t idx = (uint8_t)(start + i); - - if (keep_ui && idx >= 0x37 && idx <= 0x3F) continue; - p[0] = lut[p[0]]; - p[1] = lut[p[1]]; - p[2] = lut[p[2]]; - } - } - gfx_pal_load(0, start, 64, buf); - gfx_pal_load(1, start, 64, buf); - } -} - -void pop_ui_palette_restore(void) __banked -{ - pop_ui_palette_dim(0, 0); -} - -void pop_ui_palette_black(void) __banked -{ - uint8_t chunk; - uint16_t i; - uint8_t *black = pop_pal_buf; - - /* BIOS принимает максимум 64 записи за вызов; одним буфером покрываем - * все четыре четверти палитры, не занимая постоянную память. */ - for (i = 0; i < sizeof(black); i++) black[i] = 0; - for (chunk = 0; chunk < 4; chunk++) { - uint8_t start = (uint8_t)(chunk << 6); - gfx_pal_load(0, start, 64, black); - gfx_pal_load(1, start, 64, black); - } -} - -/* ДЛИТЕЛЬНОСТЬ ЗАДАЁТСЯ КАДРАМИ, А ПАЛИТРА ТРОГАЕТСЯ ВОСЕМЬ РАЗ. - * - * frames — сколько кадров луча длится затухание целиком (у оригинала это - * 2,13 с). Наивный цикл «ступень на каждый кадр» звал pop_ui_palette_dim - * сотню раз, а он не бесплатный: 4 чтения снимка по 256 байт, 768 каналов - * арифметики и 8 вызовов BIOS на палитру — около 9 мс, то есть половина - * кадра сверху на каждой итерации. Fade растягивался втрое против - * заказанного (поймано пользователем: «один fade in секунд восемь»). - * Теперь ступень пересчитывается только когда она СМЕНИЛАСЬ. */ -static void fade_run(uint8_t frames, uint8_t up) -{ - uint8_t i, shown = 0xFF; - - if (!frames) { - pop_ui_palette_dim(up ? 0 : POP_PAL_DIM_BLACK, 0); - return; - } - for (i = 1; i <= frames; i++) { - uint8_t step = (uint8_t)((uint16_t)i * POP_PAL_DIM_BLACK / frames); - - if (up) step = (uint8_t)(POP_PAL_DIM_BLACK - step); - if (step != shown) { - pop_ui_palette_dim(step, 0); - shown = step; - } - gfx_wait_vsync(); - } - /* Довести до края: целочисленное деление могло не дойти до 8 (или 0). */ - if (shown != (up ? 0 : POP_PAL_DIM_BLACK)) - pop_ui_palette_dim(up ? 0 : POP_PAL_DIM_BLACK, 0); -} - -void pop_ui_fade_out(uint8_t steps) __banked -{ - pop_ui_palette_snapshot(); - fade_run(steps, 0); -} - -void pop_ui_fade_in(uint8_t steps) __banked -{ - if (!steps) { pop_ui_palette_restore(); return; } - fade_run(steps, 1); -} - -uint8_t pop_screen_begin(void) __banked -{ - uint8_t page = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(page); - gfx_set_bank(GFX_BANK_NORMAL); - return page; -} - -void pop_screen_fill(uint8_t color) __banked -{ - setfillstyle(SOLID_FILL, color); - bar(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); -} - -/* Экран под ИГРУ: вне поля — цвет POP_COL_OUTSIDE, внутри — цвет 0. - * - * Зачем два разных чёрных. Вспышки (молния Джафара, урон, зелья) сделаны - * подменой ЦВЕТА 0 всей палитры — как в оригинале. Пока борта и полоса HP - * тоже были нулём, мигал весь экран целиком, вместе с рамкой и жизнями. - * Красим всё, что вне поля 320x192, отдельным индексом, а в палитре держим - * его чёрным (pop_pal_outside_apply): картинка та же, но вспышка достаёт - * только игровую область. Идея пользователя, 2026-08-25. - * - * Индексы 1..15 у нас свободны: атласы кладут либо 0xFF (прозрачность), - * либо PAL_BASE+v (0x40 и выше), шрифт — 0x3F. */ -void pop_screen_fill_game(void) __banked -{ - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - bar(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); - setfillstyle(SOLID_FILL, BLACK); - bar(0, POP_YOFF, GFX_WIDTH - 1, POP_CLIP_BOTTOM - 1); - /* Заливка съела и обе служебные полосы — они ВНЕ игрового поля. - * Инвалидируем здесь, а не у вызывающих: точек заливки несколько - * (старт игры, смена уровня), и пропустить одну из них — ровно тот - * баг, из-за которого строка исчезала при переходе между комнатами. */ - pop_status_invalidate(); -} - -/* Только ИГРОВОЕ ПОЛЕ, без бортов. Вход в комнату перерисовывает лишь - * его: борта от комнаты к комнате не меняются, а всё, что на них живёт — - * полоса HP, статус-строка, отладочная строка — обязано вход пережить. - * Заодно это на четверть меньше заливки (192 строки вместо 256). */ -void pop_screen_fill_field(void) __banked -{ - setfillstyle(SOLID_FILL, BLACK); - bar(0, POP_YOFF, GFX_WIDTH - 1, POP_CLIP_BOTTOM - 1); -} - -void pop_screen_present(uint8_t page) __banked -{ - gfx_wait_vsync(); - gfx_set_visible_page(page); -} - -/* transition_ltr() SDLPoP: подготовленная СКРЫТАЯ страница переползает на - * видимую узкими вертикальными полосами слева направо. У оригинала - * 2px/120 FPS; здесь 4px/60 FPS даёт ту же длительность (~1,3 с), не - * удваивая число полных копий 320x256. - * - * Страницы при этом НЕ меняются местами: копируем в видимую, как оригинал - * копирует offscreen в onscreen. Поэтому у вызывающего после перехода на - * ЭКРАНЕ и в скрытой странице лежит одно и то же. */ -void pop_screen_present_ltr(void) __banked -{ - gfx_rect_t stripe; - uint8_t visible = gfx_get_visible_page(); - int x; - - gfx_set_draw_page(visible); /* source gfx_copy_page = target */ - stripe.y = 0; - stripe.h = GFX_HEIGHT; - for (x = 0; x < GFX_WIDTH; x += 4) { - if (kbd_raw_any_down()) { - /* Прервали — дорисовать остаток разом, а не бросить полукадр. */ - stripe.x = 0; stripe.w = GFX_WIDTH; - gfx_copy_page(&stripe, GFX_COPY_DIRECT); - return; - } - stripe.x = x; - stripe.w = (uint16_t)((GFX_WIDTH - x < 4) ? GFX_WIDTH - x : 4); - gfx_copy_page(&stripe, GFX_COPY_DIRECT); - gfx_wait_vsync(); - } -} - -/* Нарисовать одну полосу и отпустить её страницу. Общая часть обоих - * загрузчиков ниже: они отличаются только тем, откуда взялся атлас. */ -static int strip_blit(atlas_t *at, int x, int *y) -{ - const uint8_t *img; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, 0); - /* gfx_blit_noclip ограничен шириной uint8 и обрезает 320px. */ - gfx_blit(x, *y, img); - *y += img[2]; - gfx_w0_unmap(); - atlas_free(at); - return 0; -} - -/* Полноэкранные изображения не помещаются одним getimage в EMM-страницу. - * Общий загрузчик полос держит лишь одну страницу и не трогает page flip: - * caller уже собрал скрытую страницу и сам решает, когда её показать. */ -int pop_screen_blit_atlas_strips(const char * const *parts, - uint8_t count, int x, int y) __banked -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - - if (atlas_load(&at, parts[part]) != 0) return -1; - strip_blit(&at, x, &y); - } - return 0; -} - -/* То же самое, но полосы лежат подряд в АРХИВЕ (заставка, story, PV): один - * `open` на весь экран вместо пяти — при цене открытия 51,4 мс против - * 32,6 мс на чтение это больше половины времени показа. */ -int pop_screen_blit_atlas_arc(pop_arc_t *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, - int x, int y) __banked -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - - if (pop_arc_atlas(arc, tbl, (uint8_t)(base + part), &at) != 0) - return -1; - strip_blit(&at, x, &y); - } - return 0; -} diff --git a/applications/PoP/roomtest/pop_ui.h b/applications/PoP/roomtest/pop_ui.h deleted file mode 100644 index 6cd40a4..0000000 --- a/applications/PoP/roomtest/pop_ui.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * pop_ui.h — общий экранный слой PoP (FG5, банк 9). - * - * Здесь только примитивы: исходный SDLPoP-шрифт, палитровый fade и сборка - * полной страницы. Menu, title и cutscene держат собственные автоматы и - * строки, но не дублируют формат FONT.ATL или опасную работу с W0. - */ -#ifndef POP_UI_H -#define POP_UI_H - -#include - -typedef enum { - POP_TEXT_SMALL = 0, - POP_TEXT_BIG = 1, - /* Крупный шрифт вторым цветом (POP_FONT_DARK_COLOR): тень строки и - * текст на светлом фоне — так show_hof_text() SDLPoP рисует таблицу - * рекордов дважды (тень со сдвигом (1,1), затем сам текст). Набор - * обрезан по 'Z', см. pop_font.h. */ - POP_TEXT_BIG_DARK = 2 -} pop_text_font_t; - -/* Жизненный цикл единственного FONT\FONT.ATL. Загрузка — в холодном boot, - * освобождение — после закрытия графики; повторные вызовы безопасны. */ -int pop_ui_init(void) __banked; -void pop_ui_free(void) __banked; -uint8_t pop_ui_ready(void); - -/* Группа text_*_mapped требует активного pop_text_map() и не вызывает - * BIOS/ESTEX. Для прозрачных букв установить GFX_BANK_SPRITE до рисования. */ -void pop_text_map(void); -void pop_text_unmap(void); -uint8_t pop_text_width_mapped(pop_text_font_t font, const char *s); -void pop_text_draw_mapped(pop_text_font_t font, int x, int baseline, - const char *s); -void pop_text_center_mapped(pop_text_font_t font, int center, int baseline, - const char *s); -void pop_text_right_mapped(pop_text_font_t font, int right, int baseline, - const char *s); - -/* Снимок обеих (идентичных по контракту) палитр хранится в свободном хвосте - * FONT.ATL. dim_step: 0 — исходная, POP_PAL_DIM_BLACK — чёрная; между ними - * равные ступени яркости (step/32). Тридцать две, а не четыре: fade - * оригинала длится 2,13 с, и на четырёх ступенях это четыре заметных - * скачка вместо затухания. Половина от оригинальных 64 — на глаз разницы - * с ними нет, а вот шестнадцать уже видно. - * keep_ui сохраняет диапазон 0x37..0x3F ярким для текста/рамки меню. */ -void pop_ui_palette_snapshot(void) __banked; -#define POP_PAL_DIM_BLACK 32 - -/* СКОЛЬКО КАДРОВ ЖДАТЬ, чтобы fade длился столько же, сколько у оригинала - * (fade_in_1/fade_out_1 — 64 шага по 2 тика = 128 тиков = 2,13 с, то есть - * 106 кадров луча). - * - * Ждать все 106 нельзя: пересчёт палитры не бесплатен — 487 тысяч тактов - * на ступень, то есть чуть больше кадра (замер в MAME 2026-08-26; из них - * 136 тысяч уходит на заливку через BIOS). Тридцать три ступени съедают - * около сорока кадров, и без вычитания fade растянулся бы в полтора раза - * длиннее заказанного. Ступень при этом меняется каждые 66 мс — на глаз - * это уже слитное затухание, а не лесенка. */ -#define POP_FADE_STEP_FRAMES 1 /* цена одного пересчёта, кадров луча */ -#define POP_FADE_FRAMES (106 - (POP_PAL_DIM_BLACK + 1) * POP_FADE_STEP_FRAMES) - -void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked; -void pop_ui_palette_restore(void) __banked; - -/* Немедленно погасить все 256 цветов обеих страниц. В отличие от dim(), - * не требует загруженного FONT.ATL: это ранний экран запуска, когда в VRAM - * ещё может лежать картинка предыдущей программы. */ -void pop_ui_palette_black(void) __banked; - -/* Пошаговый fade к снимку: fade_out сначала делает снимок, fade_in требует - * его сохранить. Каждый шаг показывается на следующем фронте. */ -void pop_ui_fade_out(uint8_t steps) __banked; -void pop_ui_fade_in(uint8_t steps) __banked; - -/* Полная экранная страница: begin выбирает скрытую страницу, fill рисует - * непрозрачный фон и present делает ГОТОВУЮ страницу видимой на фронте. - * Текст на второй странице надо нарисовать заново — GFX_BANK_SPRITE не - * меняет shadow-копию, и это сознательный контракт временного UI. */ -uint8_t pop_screen_begin(void) __banked; -void pop_screen_fill(uint8_t color) __banked; -/* Индекс палитры для всего, что ВНЕ игрового поля 320x192 (борта, полоса - * HP). В палитре он чёрный, но НЕ нулевой — поэтому вспышки, которые - * подменяют цвет 0, не задевают рамку и жизни. */ -#define POP_COL_OUTSIDE 1 -/* Подготовить экран под игру: вне поля POP_COL_OUTSIDE, внутри — цвет 0. - * Звать на СТАРТЕ и смене уровня; заодно сбрасывает служебные полосы. */ -void pop_screen_fill_game(void) __banked; -/* Только игровое поле (борта и всё, что на них, не трогает) — это путь - * входа в комнату. */ -void pop_screen_fill_field(void) __banked; -void pop_screen_present(uint8_t page) __banked; -/* Показать подготовленную скрытую страницу полосами слева направо - * (transition_ltr оригинала). Любая зажатая клавиша достраивает переход - * мгновенно. Страницы местами не меняются: содержимое копируется в - * видимую, поэтому после возврата обе страницы одинаковы. */ -void pop_screen_present_ltr(void) __banked; - -/* Нарисовать в уже выбранную draw-страницу набор вертикальных полос SPA1. - * Полоса загружается, блитится и тут же освобождается; функция не вызывает - * BIOS/vsync, поэтому её можно безопасно применять в title и cutscene. - * Возвращает -1 при ошибке чтения очередной полосы. */ -int pop_screen_blit_atlas_strips(const char * const *parts, - uint8_t count, int x, int y) __banked; - -/* Те же полосы, но из архива ресурсов: элементы base..base+count-1. - * Один `open` на экран вместо одного на полосу. */ -int pop_screen_blit_atlas_arc(struct pop_arc_s *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, - int x, int y) __banked; - -#endif /* POP_UI_H */ diff --git a/applications/PoP/roomtest/pop_vflip.c b/applications/PoP/roomtest/pop_vflip.c deleted file mode 100644 index 4b8e138..0000000 --- a/applications/PoP/roomtest/pop_vflip.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * pop_vflip.c — таблица «страница атласа -> её ВЕРТИКАЛЬНО ЗЕРКАЛЬНАЯ пара» - * (зелье инверсии, уровень 9). См. pop_vflip.h. - * - * Сами зеркальные ленты делает упаковщик (`vflip_cols` в pop_pack_kid.py) и - * кладёт рядом с обычными: kid0_v.atl, sword_v.atl, g0_v.atl… Здесь остаётся - * только связать пары: зеркальный файл грузится обычным atlas_load, а его - * раскладка байт-в-байт совпадает с оригиналом — значит движку достаточно - * подменить НОМЕР СТРАНИЦЫ, которую он мапит в W0. - * - * Почему не считаем в рантайме (замеры MAME 2026-08-12, такты Z80): - * загрузка одной 16-КБ страницы с HDD — 970 003 такта (0.045 с); - * разворот той же страницы на месте — 12 645 582 такта (0.59 с). - * Даже идеальная конвертация (accel-копия + asm-реверс) даёт ~1.05 млн — - * то есть в лучшем случае сравнивается с чтением готового файла, а стоит - * asm-модуля. На все 34 страницы: 1.5 с загрузки против 20 с разворота. - * - * РЕЗИДЕНТ: pop_vflip_page зовёт отрисовка персонажей (банк 4) на каждый - * спрайт — трамплин тут ни к чему, а кода всего ничего. - */ -#include -#include -#include "pop_vflip.h" - -/* Персонажных страниц: 28 (Кид) + 5 (страж) + 1 (меч) = 34; с запасом. */ -#define VF_MAX 40 -static uint8_t vf_src[VF_MAX]; /* страница оригинала */ -static atlas_t vf_atl[VF_MAX]; /* зеркальный атлас (его page) */ -static uint8_t vf_n; - -/* Взять УЖЕ ЗАГРУЖЕННЫЙ зеркальный атлас под своё управление (дальше его - * освобождает pop_vflip_reset). Нужен тем, кто читает зеркала не файлом, а - * куском архива ресурсов: загрузку делает вызывающий, связывание — мы. */ -int pop_vflip_take(const atlas_t *orig, const atlas_t *mirror) -{ - if (!orig || !mirror || vf_n >= VF_MAX) return -1; - vf_atl[vf_n] = *mirror; - vf_src[vf_n] = orig->page; - vf_n++; - return 0; -} - -int pop_vflip_add(const atlas_t *orig, const char *path) -{ - atlas_t m; - - if (!orig || vf_n >= VF_MAX) return -1; - if (atlas_load(&m, path) != 0) return -1; - return pop_vflip_take(orig, &m); -} - -uint8_t pop_vflip_page(uint8_t src) -{ - uint8_t i; - for (i = 0; i < vf_n; i++) - if (vf_src[i] == src) return vf_atl[i].page; - return 0; /* пары нет — рисуем обычным атласом */ -} - -uint8_t pop_vflip_ready(void) { return vf_n != 0; } - -void pop_vflip_reset(void) -{ - uint8_t i; - for (i = 0; i < vf_n; i++) atlas_free(&vf_atl[i]); - vf_n = 0; -} diff --git a/applications/PoP/roomtest/pop_vflip.h b/applications/PoP/roomtest/pop_vflip.h deleted file mode 100644 index 81fefec..0000000 --- a/applications/PoP/roomtest/pop_vflip.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * pop_vflip.h — ВЕРТИКАЛЬНО ЗЕРКАЛЬНЫЕ наборы спрайтов персонажей - * (зелье инверсии, уровень 9). Реализация и замеры — в pop_vflip.c. - * - * Кому нужно. Фон и все row-major спрайты переворачиваются даром (порядок - * строк = знак страйда, gfx_blit_*_vflip), а персонажи лежат КОЛОНКАМИ — - * у них даром получается горизонтальное зеркало, а вертикальное требует - * развернуть байты внутри колонки. Такой набор готовит упаковщик - * (kid0_v.atl, sword_v.atl, g0_v.atl…), а здесь он только грузится и - * связывается с оригиналом. Правило вызывающего: - * - * страница = pop_upside ? pop_vflip_page(a->page) : a->page; - * if (!страница) страница = a->page; // набор не загружен - * - * Ни смещения лент, ни размеры кадров, ни горизонтальный флип при этом не - * меняются: зеркальный файл имеет ТУ ЖЕ раскладку, отличаются только пиксели. - * - * КОГДА ГРУЗИТЬ — на усмотрение приложения: pop_vflip_load_all можно звать - * где угодно (старт игры, показ интро, вход на уровень с зельем). До - * загрузки движок просто рисует неперевёрнутыми кадрами — это заметно, но - * не ломает ни кадр, ни физику. - */ -#ifndef POP_VFLIP_H -#define POP_VFLIP_H - -#include -#include - -/* Загрузить зеркальный файл path и связать его с атласом orig. - * 0 — OK, -1 — файла нет / не хватило EMM / таблица полна. */ -int pop_vflip_add(const atlas_t *orig, const char *path); - -/* То же, но зеркало УЖЕ загружено (например, прочитано из архива): таблица - * забирает его себе, и дальше он освобождается вместе с остальными. */ -int pop_vflip_take(const atlas_t *orig, const atlas_t *mirror); - -/* Страница-зеркало для страницы src; 0 — пары нет (набор не загружен). */ -uint8_t pop_vflip_page(uint8_t src); - -/* Загружен ли хоть один зеркальный атлас (чтобы не грузить дважды). */ -uint8_t pop_vflip_ready(void); - -/* Освободить весь набор (смена набора спрайтов соперника / уровня). */ -void pop_vflip_reset(void); - -/* Загрузить ВЕСЬ зеркальный набор: страницы Кида, меч и текущий набор - * соперника. Идемпотентна — повторный вызов ничего не делает. 0 — OK, - * -1 — что-то не загрузилось (движок останется на обычных кадрах). - * Живёт в банке 8 (pop_kboot.c): зовётся раз за игру/уровень. */ -int pop_vflip_load_all(void) __banked; - -#endif /* POP_VFLIP_H */ diff --git a/applications/PoP/roomtest/pv_arc.h b/applications/PoP/roomtest/pv_arc.h deleted file mode 100644 index d7b9dae..0000000 --- a/applications/PoP/roomtest/pv_arc.h +++ /dev/null @@ -1,92 +0,0 @@ -/* pv_arc.h — индексы в архиве PV. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef PV_ARC_H -#define PV_ARC_H - -#define ARC_PV_COUNT 83 - -#define ARC_PV_S0_0 0 -#define ARC_PV_S0_1 1 -#define ARC_PV_S0_2 2 -#define ARC_PV_S0_3 3 -#define ARC_PV_S0_4 4 -#define ARC_PV_S1_0 5 -#define ARC_PV_S1_1 6 -#define ARC_PV_S1_2 7 -#define ARC_PV_S1_3 8 -#define ARC_PV_S1_4 9 -#define ARC_PV_S2_0 10 -#define ARC_PV_S2_1 11 -#define ARC_PV_S2_2 12 -#define ARC_PV_S2_3 13 -#define ARC_PV_S2_4 14 -#define ARC_PV_S3_0 15 -#define ARC_PV_S3_1 16 -#define ARC_PV_S3_2 17 -#define ARC_PV_S3_3 18 -#define ARC_PV_S3_4 19 -#define ARC_PV_S4_0 20 -#define ARC_PV_S4_1 21 -#define ARC_PV_S4_2 22 -#define ARC_PV_S4_3 23 -#define ARC_PV_S4_4 24 -#define ARC_PV_S5_0 25 -#define ARC_PV_S5_1 26 -#define ARC_PV_S5_2 27 -#define ARC_PV_S5_3 28 -#define ARC_PV_S5_4 29 -#define ARC_PV_P0_0 30 -#define ARC_PV_P0_1 31 -#define ARC_PV_P0_2 32 -#define ARC_PV_P0_3 33 -#define ARC_PV_P0_4 34 -#define ARC_PV_P1_0 35 -#define ARC_PV_P1_1 36 -#define ARC_PV_P1_2 37 -#define ARC_PV_P1_3 38 -#define ARC_PV_P1_4 39 -#define ARC_PV_P2_0 40 -#define ARC_PV_P2_1 41 -#define ARC_PV_P2_2 42 -#define ARC_PV_P2_3 43 -#define ARC_PV_P2_4 44 -#define ARC_PV_P3_0 45 -#define ARC_PV_P3_1 46 -#define ARC_PV_P3_2 47 -#define ARC_PV_P3_3 48 -#define ARC_PV_P3_4 49 -#define ARC_PV_P4_0 50 -#define ARC_PV_P4_1 51 -#define ARC_PV_P4_2 52 -#define ARC_PV_P4_3 53 -#define ARC_PV_P4_4 54 -#define ARC_PV_P5_0 55 -#define ARC_PV_P5_1 56 -#define ARC_PV_P5_2 57 -#define ARC_PV_P5_3 58 -#define ARC_PV_P5_4 59 -#define ARC_PV_P6_0 60 -#define ARC_PV_P6_1 61 -#define ARC_PV_P6_2 62 -#define ARC_PV_P6_3 63 -#define ARC_PV_P6_4 64 -#define ARC_PV_P7_0 65 -#define ARC_PV_P7_1 66 -#define ARC_PV_P7_2 67 -#define ARC_PV_P7_3 68 -#define ARC_PV_P7_4 69 -#define ARC_PV_B0_0 70 -#define ARC_PV_B0_1 71 -#define ARC_PV_B0_2 72 -#define ARC_PV_B0_3 73 -#define ARC_PV_B0_4 74 -#define ARC_PV_A0 75 -#define ARC_PV_A1 76 -#define ARC_PV_A2 77 -#define ARC_PV_J0 78 -#define ARC_PV_J1 79 -#define ARC_PV_J2 80 -#define ARC_PV_H0 81 -#define ARC_PV_T0 82 - -#endif diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c deleted file mode 100644 index 7048a9c..0000000 --- a/applications/PoP/roomtest/roomtest.c +++ /dev/null @@ -1,967 +0,0 @@ -/* - * roomtest.c — проверка порта статического фона (Шаг 3): рисует комнату 1 - * уровня 1 реальной композицией слоёв (pop_bg.c) и держит на экране. - * Сверять на MAME с эталоном applications/PoP/toolchain/1.1-2.png. - */ -#include -#include -#include -#include -#include -#include -#include /* gfx_copy_page — вход в комнату и переворот */ -#include "pop_bg.h" -#include "pop_kid.h" -#include "pop_ctrl.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_redraw.h" -#include "pop_geom.h" /* pop_y_to_row, TILE_SIZEX — тайл объекта */ -#include "pop_sfx.h" -#include "pop_music.h" /* pop_sfx_tick — решение о запуске звука за кадр */ -#include "pop_guard.h" -#include "pop_cdraw.h" /* общая отрисовка персонажей (слоты Кид/соперник) */ -#include "pop_cheat.h" -#include "pop_tune.h" -#include "pop_vflip.h" /* зеркальный набор персонажей (зелье инверсии) */ -#include "pop_pace.h" /* фиксированный логический кадр по лучу */ -#include "roomtest_cold.h" /* холодная половина цикла — в банке */ -#include "pop_qsave.h" -#include "pop_status.h" -#include "pop_timer.h" -#include "pop_menu.h" /* pause menu — банк 9, команды наружу */ -#include "pop_settings.h" /* единая модель скорости/звука/читов */ -#include "pop_app.h" /* автомат приложения: игровой цикл = PLAYING */ -#include "pop_timer.h" /* global 60-minute timer — bank 9 */ -#include "pop_title.h" /* исходная графическая title sequence — bank 9 */ -#include "pop_intro.h" /* story + Princess/Jaffar после title — bank 11 */ -#include "pop_flow.h" /* таблица pre-level cutscene — bank 9 */ -#include "pop_demo.h" /* attract mode level 0 — bank 9 */ -#include "pop_pal.h" /* lifecycle палитры title/intro/level */ -#include "pop_hof.h" /* persistent Hall of Fame — bank 9 */ -#include "pop_ui.h" /* чёрные обе страницы перед сменой палитры */ - -__sfr __at (0xFE) io_border; - -/* ПРОФИЛИРОВАНИЕ ПОЛОСАМИ БОРДЮРА (включено по умолчанию; make PROF=0 — - * выключить). Цвет бордюра держится, пока фаза считает, поэтому высота - * полосы на скриншоте = время фазы в растровых строках. Это единственный - * способ смотреть профиль без дебаггера: выборка PC вырождается (мост MAME - * отвечает из фреймового колбэка, все сэмплы падают в обработчик - * прерывания); точные такты — breakpoint'ы с {printf totalcycles; g}. - * - * ЦВЕТА: у бордюра Sprinter бит 0 (красный) ИГНОРИРУЕТСЯ, работают только - * бит 1 (синий) и бит 2 (зелёный) — значит различимых состояний ровно - * ЧЕТЫРЕ, и значения обязаны быть чётными. Отсюда фазы сгруппированы по - * четыре, а не по семь (нечётные номера раньше сливались с соседями и - * полосы не читались): - * 0 чёрный — ожидание vsync (запас кадра) - * 2 синий — ввод, heal и ЛОГИКА (kid_tick/физика/страж) - * 4 зелёный — слой ФОНА (loose/trobs/redraw_needed/шов) - * 6 циан — СПРАЙТЫ (страж, Kid, fore поверх них) */ -#ifndef PROF_BORDER -#define PROF_BORDER 1 -#endif -/* ВРЕМЕННО: покадровая трасса kidobj для сверки с SDLPoP (см. - * pop_dbg_kidobj в roomtest_cold.c). 0 — выключить. - * СВОЙ #ifndef, а не общий с PROF_BORDER: тот задаётся ключом сборки - * (-DPROF_BORDER=1), и всё, что лежало внутри его блока, не определялось - * вовсе — трасса молча не включалась. */ -#ifndef DBG_KIDOBJ -#define DBG_KIDOBJ 0 -#endif -#if PROF_BORDER -#define PROF(n) io_border = (n) -#else -#define PROF(n) ((void)0) -#endif - -/* Раскладка банков; их число crt0_banked получает автоматически из - * --bank флагов: 1 = guards (ИИ/боёвка), 2 = pop_bg (ГОРЯЧАЯ половина фона: fore-проход, - * оверлеи, кладка), 3 = pop_map (коллизия/физика), 4 = pop_cdraw - * (отрисовка персонажей + полоса HP), 5 = pop_ctrl (диспетчер управления), - * 6 = pop_trob (ловушки/анимация тайлов), 7 = pop_room (ХОЛОДНАЯ половина - * фона: полная отрисовка комнаты, точечные перерисовки, падающие плиты), - * 8 = roomtest_cold (ХОЛОДНАЯ половина главного цикла: старт уровня и - * отладочная навигация — см. roomtest_cold.h), 9 = pop_menu (ВСЯ работа - * с меню: автомат, рендерер, Settings и build screen; наружу только - * команды gameplay). - * Отрисовка персонажей и холодная половина фона вынесены из банка 2 - * отдельно: тот дважды подходил к 16 КБ вплотную, а расти ему ещё есть - * куда — тайлы поздних уровней, чомперы, зеркало. */ - -/* Режим читов (pop_cheat.h): на время разработки включаем в main. */ -uint8_t pop_cheats; -/* Единственная резидентная часть UI: банк 9 вызывается только по запросу, - * поэтому обычный кадр не платит трамплин. */ -uint8_t pop_menu_request; - -/* ПОТЕРЯ НАЖАТИЙ ПРИ ЗАЖАТОМ Shift — лечится ПЛОТНЫМ опросом клавиатуры. - * - * При зажатом Shift PS/2 обрамляет расширенный код «фиктивным шифтом», и - * одно нажатие стрелки превращается в 5 байт вместо 2 (отпускание — тоже - * 5). Приёмный FIFO SIO — 3 байта, а импульс запроса прерывания здесь - * теряется примерно в 44 % случаев, поэтому байты копятся и один из - * полусотни пропадает ДО чтения порта: нажатие «не срабатывает». - * - * Что НЕ помогает (замерено, TASKS_CLOSED.md/KBD-1): редкий опрос (несколько - * вызовов за кадр — они попадают туда, где прерывания и так разрешены, и - * лишь дублируют трамплин) и укорачивание DI-окон графики (в кадре вообще - * без блитов потерь БОЛЬШЕ). Снимать `di` в accel-ядрах нельзя — машина - * уходит в перезагрузку. - * - * Что помогает: опрос раз в ~0.5 мс. Столько времени берётся из ожидания - * кадра — процессор всё равно крутит там ~42 мс из 60, ничего не делая. - * Поэтому kbd_raw_poll вешается idle-хуком на gfx_wait_vsync (см. - * kbd_idle ниже); полезной работы это не отнимает. Потолок приёма - * подтверждён отдельно (tests/kbdpoll: 25 нажатий → 25, 250 байт из 250). */ - -/* Обёртка ради типа: хук — void(*)(void), а kbd_raw_poll возвращает - * «было ли что вычерпано». Приводить указатель кастом не хочется. */ -static void kbd_idle(void) -{ - kbd_raw_poll(); -} - -/* seq_2_stand (types.h seqids) — Kid стоит, ждёт ввода. */ -#define SEQ_STAND 2 -#define ROOM_1 1 -#define LINK_DOWN 3 /* сторона links: 0=L,1=R,2=U,3=D */ - - -/* ОТЛАДОЧНЫЙ ОБХОД КОМНАТ: '+'/'-' (цифровой блок либо '='/'-' основного - * ряда) — следующая/предыдущая комната уровня ПО НОМЕРУ (1..24, с обёрткой), - * Kid ставится на первый попавшийся пол. Нужен, чтобы пройти все комнаты и - * собрать список багов отрисовки, включая недостижимые обычным путём. - * Убирается закомментированием ОДНОЙ строки ниже. */ -#define ROOMNAV 1 - - -/* Рабочая копия ТЕКУЩЕЙ комнаты (W2, мутабельная: loose→empty) + срезы - * соседей для кромок. Заполняются pop_room_load из уровня. File-scope, - * чтобы enter_room переключал комнату без длинного списка параметров. */ -uint8_t room_fg[30]; -uint8_t room_bg[30]; -/* lcol_fg/rcol_fg — ШЕСТЬ записей: [0..2] кромочная колонка соседа (col9/col0), - * [3..5] следующая за ней (col8/col1) для коллизии, когда Kid стоит В шве и - * смотрит наружу (колонка −2 / 11). См. pop_level.h. */ -uint8_t lcol_fg[6], lcol_bg[3], rcol_fg[6], rcol_bg[3], below_fg[11]; -uint8_t above_fg[10], above_mod[10]; /* ряд 2 верхнего соседа (полоса кладки у потолка) */ -uint8_t cur_room; /* номер ОТРИСОВАННОЙ комнаты (drawn_room) */ -uint8_t kid_room; /* РЕАЛЬНАЯ комната Kid (S1: == cur_room; расходятся в S3 straddle) */ - -/* Рендер-смещение Kid по логической X (порт xpos_in_drawn_room): комната Kid - * слева от отрисованной → −140 (спрайт за левой кромкой), справа → +140, та - * же → 0. Звать каждый кадр перед отрисовкой персонажей. */ -static void update_kid_render_dx(void) -{ - int dx = 0; - if (kid_room != cur_room) { - if (kid_room == pop_room_link(cur_room, 0)) dx = -140; /* left neighbour */ - else if (kid_room == pop_room_link(cur_room, 1)) dx = 140; /* right neighbour */ - } - pop_char_set_render_dx(POP_CH_KID, dx); -} - -/* Change-driven редрой ЛЕВОГО шва (ворота соседа room8 видны в col0): тяжёлый - * draw_tile(0,0) в pop_room_redraw_seam_left зовём ТОЛЬКО когда openness гейта - * реально изменился. Пока Кид держит кнопку и гейт открыт — modifier стабилен - * → 0 редроёв (раньше шов рисовался безусловно КАЖДЫЙ кадр, пока сосед активен - * — тот же класс, что был у кнопки). seam_redraw=2 = обе страницы дабл-буфера. - * - * Сигнатура — ВСЕ ТРИ ряда колонки 9 соседа, а не только ряд 0: ворота в шве - * бывают в любом ряду. На уровне 1 решётка соседа стояла в (0,9), и одного - * байта хватало; на уровне 4 плита комнаты 1 открывает ворота (1,9) комнаты 8 - * — изменение приходило в m[19], сигнатура его не видела, редрой не - * заказывался, и открытые ворота оставались нарисованными закрытыми - * (BUG-GATE-SEAM-ROW1). */ -/* Кнопка в шве (SEAM-BUTTON-STALE). Сигнатурой служил ТОЛЬКО modif, а у - * кнопки modif — это индекс LINKLOC, то есть константа уровня: нажатие живёт - * в doorlinks2 (get_doorlink_timer, seg007:0BB6). Изменение в сигнатуру не - * приходило, редрой не заказывался — и шов оставался нарисованным в том - * состоянии, в каком был на входе в комнату: кнопка (1,9) комнаты 11, она же - * (1,−1) комнаты 24, залипала нажатой (или отжатой), хотя связь срабатывала. - * Видимой её делает draw_tile: нажатый opener рисуется как ПОЛ (seg008 - * get_tile_to_draw), а у пола есть правая грань, у кнопки — нет. - * Поэтому в сигнатуру ряда подмешиваем бит «кнопка нажата». */ -uint8_t seam_row_sig(const uint8_t *m, const uint8_t *lfg, uint8_t r) -{ - uint8_t code = (uint8_t)(lfg[r] & 0x1F); - uint8_t mod = m[9 + r * 10]; - if (code == 0x0F || code == 0x06) /* opener / closer */ - return (uint8_t)((pop_doorlink2(mod) & 0x1F) > 1); - return mod; -} - -uint8_t seam_sig[3]; /* последняя нарисованная openness гейта в шве */ -uint8_t seam_rows; /* маска рядов, ждущих редроя (переживает 2 кадра) */ -uint8_t seam_redraw; /* оставшиеся кадры редроя (обе страницы) */ - -/* checkpoint (seg000:270): взводится, когда Кид уходит ВЛЕВО в комнату 7 - * уровня 3 (level3_set_chkp, seg002:0665); по нему do_startpos подменяет - * стартовую позицию. Сбрасывается началом игры и прохождением уровня — - * ровно как в оригинале (seg003:37 и seg003:413). */ -uint8_t pop_checkpoint; - -/* Изменения тайлов (упавшая плита → пусто, щебень на месте приземления - * куска, поднятый предмет → пол) пишутся ПРЯМО В УРОВЕНЬ — - * pop_level_set_tile, как в оригинале (curr_room_tiles[…] = …). Раньше тут - * жила таблица переопределений на 8 записей, и девятая правка молча - * терялась: разбитые плиты и выпитые зелья «возвращались» при возврате в - * комнату (BUG-LVLSTATE-1). */ -#define TILE_DEBRIS 0x0E -#define TILE_CLOSER 0x06 -#define TILE_OPENER 0x0F -#define TILE_TORCH 0x13 -#define TILE_TORCH_DEBRIS 0x1E -#define TILE_EMPTY 0x00 -#define TILE_FLOOR 0x01 - -/* Поднятый предмет (меч): tilepos и счётчик «запечь пол» по страницам. - * flash_on — вспышка фона активна (нулевая запись палитры подменена). */ -static uint8_t item_pos, item_bake, flash_on; - -/* Подмена НУЛЕВОЙ записи палитры на обеих страницах (do_flash/set_bg_attr). - * Через функцию с параметрами, а не пятью литералами в месте вызова: на - * gfx_pal_set(0,0,0,0,0) SDCC 4.5 выдаёт невалидный `ld hl, a` - * (см. .sprinter-cc-roomtest/roomtest.asm) и ассемблер падает. */ -static void flash_bg(uint8_t r, uint8_t g, uint8_t b) -{ - gfx_pal_set(0, 0, r, g, b); - gfx_pal_set(1, 0, r, g, b); -} - -int main(void) -{ - /* Дабл-буфер: front — видимая страница, back — куда рисуем. Отладочный - * тумблер «однобуфер по SPACE» убран (решение пользователя 2026-08-25): - * дабл-буфер теперь безусловный, а SPACE свободен под игру. */ - uint8_t front = 0, back, frozen = 0; - uint8_t pace_prev = 0; /* edge клавиши смены режима скорости */ - uint8_t skip = 0; /* маска «слот перерисовывать не надо» */ - uint16_t dead_frames = 0; -#ifdef ROOMNAV - uint8_t nav_prev = 0; -#endif - uint8_t cheat_prev = 0, immo_prev = 0, sword_prev = 0, nlvl_prev = 0; - uint8_t xdec_prev = 0, xinc_prev = 0, upsd_prev = 0; - uint8_t failed = 0; - - /* Загрузка ресурсов, палитра, первый экран — В БАНКЕ (roomtest_cold.c): - * отрабатывает ровно один раз за игру, а кода там на полкилобайта. */ - pop_app_reset(); - if (pop_boot() != 0) return 1; - - if (pop_ctrl_init() != 0) { /* raw-канал клавиатуры (забирает ввод у DSS) */ - closegraph(); - puts("kbd_raw open failed"); - return 1; - } - gfx_set_idle_hook(kbd_idle); /* вычерпывать FIFO, пока ждём кадр */ - if (!pop_app_dispatch(POP_APP_EV_BOOT_READY)) { - pop_shutdown(); - return 1; - } - /* MS8: CFG уже применён в pop_boot до первого показа. Экран build - * показывается только по явной пользовательской настройке. */ - pop_build_info_show(); - if (!pop_app_dispatch(POP_APP_EV_BUILD_DONE)) { - pop_shutdown(); - return 1; - } - /* Темп кадра по лучу. Если бит 5 порта 0xFE не шевелится (иное - * железо), pop_pace_* молча откатываются на прежние gfx_wait_vsync. */ - pop_pace_arm(); - - { - uint8_t qs_save_prev = 0, qs_load_prev = 0; - uint8_t quit = 0, esc_prev = 0, menu_restart = 0; - uint8_t demo_new_game, demo_finished; - uint8_t reveal_pending = 0; /* уровень готовится за чёрной палитрой */ - for (;;) { - uint8_t is_demo; - - /* Title -> intro -> demo — три самостоятельных состояния. Сцены не - * вызывают gameplay рекурсивно: после каждого return следующий маршрут - * выбирается только pop_app_dispatch(). */ - if (pop_app_state == POP_APP_TITLE) { - pop_app_event_t ev = pop_title_show() ? POP_APP_EV_NEW_GAME : - POP_APP_EV_INTRO_STARTED; - if (!pop_app_dispatch(ev)) { - failed = 1; - break; - } - } - if (pop_app_state == POP_APP_INTRO) { - /* Таблица рекордов между credits и demo показывается ВНУТРИ - * pop_intro_show — там же, где её показывает show_title(). */ - uint8_t skipped = pop_intro_show(); - pop_app_event_t ev = skipped ? POP_APP_EV_NEW_GAME - : POP_APP_EV_CUTSCENE_FINISHED; - if (!pop_app_dispatch(ev)) { - failed = 1; - break; - } - } - if (pop_app_state == POP_APP_ENDING) { - pop_ending_show(); - if (!pop_app_dispatch(POP_APP_EV_ENDING_FINISHED)) { - failed = 1; - break; - } - continue; - } - if (pop_app_state == POP_APP_HALL_OF_FAME) { - pop_hof_show(); - if (!pop_app_dispatch(POP_APP_EV_HOF_FINISHED)) { - failed = 1; - break; - } - continue; - } - - /* Enter/Esc на title/story/PV/credits и клавиша в attract-demo сходятся - * в ОДИН маршрут LEVEL_LOAD. Начальные уровень/комната берутся из - * FIRST_LEVEL и данных уровня — то есть из параметров текущей сборки. */ - if (pop_app_state == POP_APP_LEVEL_LOAD) { - if (pop_new_game_load() != 0 || - !pop_app_dispatch(POP_APP_EV_LEVEL_READY)) { - failed = 1; - break; - } - } - - /* После intro всегда запускается настоящий level 0. pop_level_switch() - * даёт тот же lifecycle, что и обычной границе уровней: новый tileset, - * актёры, палитра, обе страницы room background. Это важно, поскольку - * девелоперская сборка может до title держать дворец LEVEL=11. */ - if (pop_app_state == POP_APP_DEMO) { - pop_next_level = 0; - pop_seamless = 0; - pop_checkpoint = 0; - if (pop_level_switch() != 0) { - failed = 1; - break; - } - /* custom->demo_hitp = 4. level_switch переносит HP предыдущего - * уровня по обычному правилу, поэтому demo-вариант задаём после - * него и просим полосу HP перепечатать новое число. */ - hitp_beg_lev = 4; - pop_kid_hp_reset(); - pop_hp_invalidate(); - pop_demo_begin(); - /* show_title() SDLPoP начинает attract-demo сразу, без fade-in. - * Credits уже ушли в чёрный, intro_restore_game_palette оставил - * обе страницы чёрным растром, а level_switch успел собрать на них - * level 0. Поэтому яркую game palette можно включить одним commit: - * старый credits-кадр физически уже негде высветить. */ - pop_pal_apply(0); - (void)pop_sfx_start(); - } - is_demo = (uint8_t)(pop_app_state == POP_APP_DEMO); - if (!is_demo && pop_app_state != POP_APP_PLAYING) break; - demo_new_game = 0; - demo_finished = 0; - - while (!quit && (pop_app_state == POP_APP_PLAYING || - pop_app_state == POP_APP_DEMO)) { - PROF(2); /* ввод + heal */ - - /* Demo читает raw-карту первым: любая клавиша начинает новую игру, - * не попадая в Pause/QuickSave/чит. pop_ctrl_auto_move() ниже raw - * вообще не трогает, поэтому карта не будет сброшена между проверкой - * и решением оболочки. */ - if (is_demo) { - kbd_raw_sync(); - if (pop_demo_user_input()) { - demo_new_game = 1; - break; - } - } - /* P — переключить режим скорости по кругу (FASTEST -> FAST -> - * NORMAL). Edge, чтоб одно нажатие = один шаг. Дефолт FASTEST - * (crt0 зануляет _DATA). Что означают режимы — pop_pace.h. */ - if (!is_demo) { - uint8_t pk = kbd_raw_down(KBD_SPEED_MODE); - if (pk && !pace_prev) { - uint8_t m = (uint8_t)(pop_speed_mode + 1); - pop_speed_mode = (uint8_t)(m >= POP_SPEED_MODES ? 0 : m); - pop_settings.speed_mode = pop_speed_mode; - } - pace_prev = pk; - } - - /* Отладочный стоп-кадр: '1' (PS/2 0x16) — заморозить, '2' (0x1E) — - * продолжить. В заморозке пропускаем весь tick/draw/flip: картинка - * стоит, можно спокойно разбирать позу Kid и окклюзию. */ - if (!is_demo) { - if (kbd_raw_down(0x16)) frozen = 1; - if (kbd_raw_down(0x1E)) frozen = 0; - } - /* Читы — В БАНКЕ (roomtest_cold.c): они дёргаются раз в кадр, а места - * в резиденте W1/W2 нет (см. TASKS_OPEN, MEM). */ - if (!is_demo) pop_cheat_tick(); - /* Esc — открыть меню (edge). Меню МОДАЛЬНО: пока пользователь не - * выбрал пункт, pop_menu_process не возвращается и игра стоит. - * Команды исполняет ГЛАВНЫЙ ЦИКЛ — UI не зовёт gameplay internals: - * QuickSave/QuickLoad идут тем же механизмом, что F6/F9 (запрос - * подхватит блок ниже в этой же границе кадра), рестарты исполняются - * после вычисления back-страницы (как респавн), QUIT рвёт цикл. */ - /* Меню, F10 и QuickSave/Load — целиком в банке 8 (pop_frame_ui). - * Всё это события «раз в партию», а кода на них было полсотни строк - * в резиденте; наружу остаются флаги, которые нужны самому циклу. */ - if (!is_demo) { - uint8_t want_restart = 0, dead_reset = 0; - int8_t urc = pop_frame_ui(&want_restart, &dead_reset); - - if (want_restart) menu_restart = 1; - if (dead_reset) dead_frames = 0; - if (urc) { - if (urc < 0) failed = 1; - if (urc != 1) quit = 1; /* 1 — restart game, без quit */ - break; - } - } - if (frozen) { - PROF(0); /* чёрный: ждём vsync */ - /* Заморозка — тоже полноценный логический кадр: иначе якорь - * пейсинга уедет и первый кадр после разморозки будет рваным. */ - pop_wait_edge(); - pop_pace_end(pop_pace_n((uint8_t)(Kid.sword == SWORD_2_DRAWN))); - continue; - } - -#ifdef ROOMNAV - /* Обход комнат по номеру: '+' (0x79 numpad / 0x55 '=') — вперёд, - * '-' (0x7B / 0x4E) — назад. Edge по nav_prev: одно нажатие = одна - * комната. Сама навигация — в банке (roomtest_cold.c): она нужна - * только по клавише, а место в резиденте дефицитно. */ - if (!is_demo) { - uint8_t nav = (uint8_t)((kbd_raw_down(0x79) || kbd_raw_down(0x55)) | - ((kbd_raw_down(0x7B) || kbd_raw_down(0x4E)) << 1)); - if (nav && !nav_prev && pop_dbg_roomnav((uint8_t)(nav & 1 ? 1 : 2))) - dead_frames = 0; - nav_prev = nav; - } -#endif - - /* Рисуем в СКРЫТУЮ страницу дабл-буфера. - * Видимую перечитываем У ЖЕЛЕЗА, а не ведём свой счёт: её меняют и - * вход в комнату (ENTER-ROOM-FAST), и переворот экрана - * (pop_flip_screen), причём оба — из банка, где front недоступен. */ - front = gfx_get_visible_page(); - back = (uint8_t)(front ^ 1); - gfx_set_draw_page(back); - - /* Рестарты из меню — ЗДЕСЬ, с известной back-страницей (тот же - * контракт, что у респавна ниже). */ - if (menu_restart == 1) { /* Restart Level — штатный reset уровня */ - pop_start_level(); - dead_frames = 0; - menu_restart = 0; - } - - /* Переворот только что переключился (зелье инверсии, ур. 9) — - * привести уже нарисованное в новый вид ОДИН раз, до кадра - * (порт need_redraw_because_flipped, seg000:939). Дальше слои - * рисуют зеркально сами. */ - if (pop_upside_dirty) { - pop_upside_dirty = 0; - /* Само переключение — ЗДЕСЬ и только здесь: весь кадр обязан - * рисоваться в одной системе координат (см. pop_upside_want). */ - pop_upside = pop_upside_want; - /* Страховка для ЧИТА U на «неподготовленном» уровне и для - * случая, когда зелье выпито раньше предзагрузки: набор - * поднимается здесь же. На уровне 9 он уже загружен, и вызов - * не стоит ничего (pop_vflip_ready). */ - if (pop_upside && !pop_vflip_ready()) pop_vflip_load_all(); - pop_flip_screen(); - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - } - pop_dbg_m13(); /* ЗАМЕР: ввод и читы разобраны */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_check_skel(); /* спецсобытие ур.3: скелет встаёт */ - pop_check_mouse(); /* спецсобытие ур.8: мышь жмёт кнопку */ - pop_check_killed_shadow(); /* спецсобытие ур.12: смерть тени = смерть Кида */ - pop_frame_timers(); /* timers (seg003:0735): вспышка слияния */ - pop_dbg_m9(); /* ЗАМЕР: pop_frame_timers сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_check_can_guard_see_kid(); /* луч видимости — ДО логики персонажей */ - pop_dbg_m14(); /* ЗАМЕР: спецсобытия + луч видимости */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (is_demo) demo_finished = pop_demo_tick(); - else pop_ctrl_tick(); /* ввод -> control(): смена seq */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Кто в этом кадре не изменился с прошлой отрисовки ЭТОЙ страницы — - * тот на ней уже нарисован правильно: ни стирать, ни рисовать заново - * не надо (DRAW-COST, контракт в pop_cdraw.h). Решение - * перепроверяется перед самой отрисовкой — тик ещё впереди. */ - skip = pop_char_skip_mask(); - if (!(skip & 1)) pop_char_heal(POP_CH_KID); /* стереть прошлый кадр ЭТОЙ страницы */ - if (!(skip & 2)) pop_char_heal(POP_CH_OPP); /* и прошлый кадр соперника */ - /* Отражение в зеркале — свой heal: у него нет слота pop_cd и в - * skip-маске он не участвует (рисуется/стирается безусловно, живёт - * только пока Кид стоит на тайле зеркала). */ - pop_mirror_heal(); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_fore_heal(); /* + следы оверлея (шире прямоугольника Kid) */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - PROF(2); /* логика (тот же синий) */ - pop_dbg_m1(); /* ЗАМЕР: начало логики */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - kid_tick(); /* play_seq: следующий кадр */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_phys_tick(); /* K3: падение/приземление/стена */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_tick(); /* логика стража — В БАНКЕ (guards.c) */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_phys_tick(); /* и его физика — та же, что у Кида (play_guard_frame) */ - /* Боёвка, порядок как в play_frame (seg000:872): сначала пометить - * попадания с обеих сторон, потом применить, потом свести HP. */ - pop_check_sword_hurting(); - pop_check_sword_hurt(); - /* check_sword_vs_sword (seg000:1353): кадр 167 — клинки уже - * столкнулись. Раньше сам parry работал, но эта отдельная строка - * оригинального play_frame была потеряна, поэтому звон sound 10 - * не номинировался ни в обычном бою, ни в attract-demo. */ - if (Kid.frame == FRAME_167_BLOCKED || Guard.frame == FRAME_167_BLOCKED) - pop_sfx_play(10); - pop_do_delta_hp(); - /* Порт show_time(): счётчик уменьшается только в живом игровом - * кадре. Пауза, frozen, HDD и QuickSave проходят через continue - * выше, поэтому не создают бесплатных/лишних тиков. На уровне - * Джафара время идёт до открытия двери, но истечение уже не может - * перевести игру в TIME_EXPIRED — буквально правило SDLPoP. */ - if (!is_demo && pop_timer_tick(pop_settings.time_limit_enabled, - (uint8_t)(Kid.alive < 0 && - (pop_current_level < 13 || - (pop_current_level == 13 && pop_leveldoor_open == 0)))) && - pop_current_level < 13) { - /* Время ИДЁТ и на уровне Джафара (до открытия двери), но - * КОНЧИТЬСЯ игра там уже не может: expired() у оригинала стоит - * под отдельным `current_level < 13` (seg000:910). На 13-м - * истечение оставляет только строку «TIME HAS EXPIRED!». */ - if (!pop_app_dispatch(POP_APP_EV_TIME_EXPIRED)) failed = 1; - break; - } - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_fallout(); /* страж провалился ниже комнаты — убрать (seg002:241) */ - if (pop_fell_out) { /* Kid пересёк нижнюю границу комнаты */ - uint8_t down = pop_room_link(cur_room, LINK_DOWN); - pop_fell_out = 0; - /* Спецсобытие «выход падением» (leave_room, seg002:0504 — - * направление вниз даёт особый результат −2; разбор в главном - * цикле, seg000:0893). Уровень 6 не заканчивается дверью: Кид - * проваливается вниз из комнаты 1 и этим переходит на 7-й. - * Проверка ОБЯЗАНА идти раньше связи вниз: у комнаты 1 сосед - * снизу есть (шахта, комната 3), и без спецсобытия Кид улетал - * туда, а оттуда — в рестарт уровня. */ - if (pop_current_level == FALLING_EXIT_LEVEL && - cur_room == FALLING_EXIT_ROOM) { - Kid.y = 0xFF; /* seg000:0896 — Kid.y = −1 */ - pop_next_level = (uint8_t)(pop_current_level + 1); - } - else if (down) { /* L2: переход в комнату снизу — продолжает падать */ - pop_nav_hold = 0; /* сменил комнату НОГАМИ — чит забыт */ - enter_room(down); /* координаты Kid уже репроецированы pop_map */ - gfx_set_draw_page(back); /* вернуть текущую back для отрисовки */ - } else { /* выпал из уровня (нет комнаты снизу) — рестарт */ - pop_start_level(); - gfx_set_draw_page(back); - } - } else if (pop_leave_dir) { /* L3: уход вбок/вверх (координаты уже репроецированы) */ - uint8_t nb = pop_room_link(cur_room, (uint8_t)(pop_leave_dir - 1)); - uint8_t left = (uint8_t)(pop_leave_dir == 1); - uint8_t pop_leave_dir_prev = pop_leave_dir; - pop_leave_dir = 0; - /* level3_set_chkp (seg002:0665). ВНИМАНИЕ на комнату: оригинал - * зовёт его из leave_room ДО goto_other_room, то есть Char.room - * там ещё СТАРАЯ. Значит условие `Char.room == 7` читается как - * «Кид УХОДИТ ИЗ комнаты 7 влево» (в комнату 2), а не «входит в - * неё». Смысл: чекпойнт даётся за то, что комната 7 пройдена - * НАСКВОЗЬ, и респавн ставится туда, куда Кид только что попал. - * - * Сначала я поставил проверку на комнату НАЗНАЧЕНИЯ — и это - * поймал пользователь прогоном в SDLPoP: он умер В комнате 7, но - * влево из неё не выходил, и оригинал вернул его в стартовую - * комнату 9, а плита осталась цела. Заодно тут запоминается - * достигнутый потолок HP: смерть после чекпойнта его не отбирает. */ - if (left && pop_current_level == POP_CHKP_LEVEL && - cur_room == POP_CHKP_ROOM) { - pop_checkpoint = 1; - hitp_beg_lev = hitp_max; - } - /* Соседи чекпойнта по leave_room (seg002:0490): в ветке ухода - * ВПРАВО (pop_leave_dir == 2) — sword_disappears + meet_Jaffar, - * в ветке ВЛЕВО — Jaffar_exit. Комната во всех трёх ещё СТАРАЯ, - * как и в оригинале (goto_other_room идёт после). */ - if (pop_leave_dir_prev == 2) { - pop_sword_disappears(); - pop_meet_jaffar(); - } else if (left) { - pop_jaffar_exit(); - } - if (nb) { - /* side для pop_guard_follow — то же направление, по которому - * ищем соседа (roomleave_result оригинала). */ - pop_nav_hold = 0; /* сменил комнату НОГАМИ — чит забыт */ - enter_room_side(nb, (uint8_t)(pop_leave_dir_prev - 1)); - gfx_set_draw_page(back); - } - } - - PROF(4); /* слой фона */ - pop_dbg_m2(); /* ЗАМЕР: конец логики / начало фона */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - - pop_loose_tick(); /* loose-полы: анимация + перерисовка (СЛОЙ ФОНА */ - /* — ДО Kid, чтобы Kid всегда был поверх плиты) */ - pop_dbg_m5(); /* ЗАМЕР: pop_loose_tick сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_process_trobs(cur_room); /* пики/ворота/дверь: продвинуть СОСТОЯНИЕ (порт */ - /* process_trobs — рисования внутри нет) */ - if (pop_neigh_dirty) { - /* Тайл СОСЕДА изменился заочно (провалилась брошенная плита — - * animate_loose). Обе кромочные копии — снимки на момент входа - * в комнату, обновляем обе: g_lcol/g_rcol (коллизия у шва) и - * lcol_fg (отрисовка: колонка 9 левого соседа видна в col0 - * через draw_tile_anim_right, pop_room.c). Без второй шов - * продолжал рисовать плиту, которой уже нет — LOOSE-ROOM-CHANGE. - * Событие редкое, поэтому по сигналу, а не опросом каждый кадр. */ - uint8_t lft = pop_room_link(cur_room, 0); - pop_neigh_dirty = 0; - pop_map_refresh_edges(); - if (lft) { - uint8_t i; - pop_level_access_begin(); - for (i = 0; i < 3; i++) { - uint8_t c = pop_level_tile_raw(lft, (uint8_t)(9 + i * 10)); - if (c == (uint8_t)(lcol_fg[i] & 0x1F)) continue; - lcol_fg[i] = c; - seam_rows |= (uint8_t)(1 << i); - seam_redraw = 2; /* обе страницы дабл-буфера */ - } - pop_level_access_end(); - } - } - pop_dbg_m6(); /* ЗАМЕР: pop_process_trobs сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_redraw_needed(); - pop_dbg_m7(); /* ЗАМЕР: pop_redraw_needed сделан */ /* и разобрать пометки перерисовки тайлов (порт */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* redraw_needed, seg008:0178) — СЛОЙ ФОНА, до Kid */ - { /* ворота соседа слева (room8) видны в col0 — */ - uint8_t lft = pop_room_link(cur_room, 0); /* редрой шва ТОЛЬКО при изменении openness */ - if (lft) { - uint8_t *m = pop_trob_modif(lft); - uint8_t i, changed = 0; - /* Все ТРИ ряда колонки 9: ворота в шве бывают в любом из них - * (BUG-GATE-SEAM-ROW1, см. объявление seam_sig). */ - for (i = 0; i < 3; i++) { - uint8_t g = seam_row_sig(m, lcol_fg, i), prev = seam_sig[i]; - seam_sig[i] = g; /* СНАЧАЛА сохранить (обход SDCC z80 sub-store */ - /* бага: `if(g!=s)s=g` эмитит store РАЗНОСТИ g-s, */ - /* не g — sdcc_z80_cmp_store_a_bug) */ - if (g != prev) changed |= (uint8_t)(1 << i); - } - if (changed) { /* openness изменился → обе страницы дабл-буфера */ - /* Плюс ряд ВЫШЕ: верх решётки (draw_tile_anim_topright, - * seg008:0568 — маска 68 + кадр DOOR_FRAM_TOP) рисует не - * сам тайл ворот, а тайл над-справа от него, то есть у - * нас (r−1, 0). Он тоже анимируется вместе с openness; - * без этого чёрный треугольник над воротами оставался - * статичным, пока бары ездили (BUG-GATE-SEAM-ROW1). */ - seam_rows |= (uint8_t)(changed | (changed >> 1)); - seam_redraw = 2; - } - if (seam_redraw) { - lcol_bg[0] = m[9]; lcol_bg[1] = m[19]; lcol_bg[2] = m[29]; - pop_room_redraw_seam_left(seam_rows); - if (--seam_redraw == 0) seam_rows = 0; - } - } - } - /* Бесшовный выход уровня 12 (play_level_2, seg000:900): двери уровня - * у него нет — уровень кончается ФАКТОМ попадания в комнату 23. - * Условие «уровень ещё не сменён» обязательно: комната 23 есть и у - * 13-го, причём она там СТАРТОВАЯ, и без гарда переход зациклился бы - * (12 → 13 → 14 в первом же кадре нового уровня). */ - if (pop_current_level == POP_SEAMLESS_LEVEL && - pop_next_level == pop_current_level && - !pop_nav_hold && /* не по чит-телепорту, см. pop_state.c */ - kid_room == POP_SEAMLESS_ROOM) { - pop_next_level = (uint8_t)(pop_current_level + 1); - pop_seamless = 1; - } - /* WIN_LEVEL/WIN_ROOM SDLPoP: скрытый 14-й уровень заканчивается - * входом в room 5. Не подменяем это `next_level=15`: уровня 15 в - * сборке принципиально нет, а ending — самостоятельное состояние. */ - if (!is_demo && pop_flow_is_ending(pop_current_level, kid_room)) { - if (!pop_app_dispatch(POP_APP_EV_ENDING_STARTED)) { - failed = 1; - quit = 1; - } - break; - } - /* В level 0 нет обычной победы: достигли последней комнаты, умерли - * или доиграли запись — показать текущий кадр и затем вернуться в - * title. В частности, не вызываем level_switch(0->1). */ - if (is_demo && (kid_room == 24 || pop_kid_dead)) demo_finished = 1; - /* Смена уровня целиком уехала в банк 8 (pop_level_change): это - * событие раз в несколько минут, а кода на нём было под сотню строк - * в самом горячем месте программы — резидент W1 у нас в дефиците. */ - if (!is_demo && pop_next_level != pop_current_level && - pop_level_change(back) != 0) { - failed = 1; quit = 1; break; - } - if (!is_demo && pop_kid_dead) { /* demo после смерти завершается, без respawn */ - dead_frames++; - /* Просьба нажать кнопку, мигание и таймаут — в банке - * (pop_status.h). Место возрождения выбирает pop_start_level: - * на части уровней это НЕ старт, а уже пройденный чекпойнт. */ - uint8_t dr = pop_dead_prompt(dead_frames); - if (dr == 2) break; /* 288 тиков молчания -> title */ - if (dr) { - dead_frames = 0; - pop_start_level(); - gfx_set_draw_page(back); - } - } - if (pop_loose_fell) { /* remove_loose: сама плита исчезла */ - uint8_t fpos = (uint8_t)(pop_loose_fell - 1); - pop_loose_fell = 0; - pop_level_set_tile(cur_room, fpos, TILE_EMPTY); - } - if (pop_loose_exit) { /* кусок приземлился в НЕ отрисованной комнате */ - /* Комнату и тайл посадки считает сам кусок (pop_room.c): он летит - * через комнаты честным mob_down_a_row, а не «одним переходом - * вниз», как было раньше. Здесь остаётся то, что положено - * loose_land (seg007:11E8): щебень на месте посадки и КНОПКА - * под ним. */ - uint8_t lroom = pop_loose_exit_room; - uint8_t lpos = (uint8_t)(pop_loose_exit - 1); - uint8_t tt = pop_level_tile(lroom, lpos); - pop_loose_exit = 0; - /* На opener подставляется button_type = щебень, то есть «открыть - * НАСОВСЕМ» (modifier 0xFF). Второе место того же порта: своя - * комната — в pop_map.c. */ - if (tt == TILE_OPENER || tt == TILE_CLOSER) - pop_trigger_button(lroom, lpos, - (uint8_t)(tt == TILE_OPENER ? TILE_DEBRIS : tt), - pop_trob_modif(lroom)[lpos], 1); - /* На факеле остаётся отдельный тайл «факел с щебнем» - * (seg007:1067), а не обычный щебень. */ - pop_level_set_tile(lroom, lpos, - (uint8_t)((tt == TILE_TORCH || tt == TILE_TORCH_DEBRIS) - ? TILE_TORCH_DEBRIS : TILE_DEBRIS)); - } - if (pop_ceil_fell) { /* провалилась плита-ПОТОЛОК (ряд 2 комнаты сверху) */ - uint8_t ccol = (uint8_t)(pop_ceil_fell - 1); - uint8_t up = pop_room_link(cur_room, 2); - pop_ceil_fell = 0; - if (up) pop_level_set_tile(up, (uint8_t)(20 + ccol), TILE_EMPTY); /* колодец */ - } - if (pop_debris_at) { /* кусок лёг в ЭТОЙ комнате → щебень */ - pop_level_set_tile(cur_room, (uint8_t)(pop_debris_at - 1), TILE_DEBRIS); - pop_debris_at = 0; - } - if (pop_item_taken) { /* предмет поднят → тайл стал полом */ - item_pos = (uint8_t)(pop_item_taken - 1); - item_bake = 2; /* запечь на ОБЕИХ страницах */ - /* Тайл в странице уровня ставит САМА do_pickup (pop_map.c): здесь - * это было бы слишком поздно — между подбором и этим местом - * успевает пройти pop_process_trobs (BUG-POTION-STRIPE). */ - pop_add_trob(cur_room, item_pos, -1); /* меч убран — блеска больше нет */ - pop_item_taken = 0; - } - if (item_bake) { /* стереть спрайт меча из фона страницы */ - pop_floor_bake(item_pos / 10, item_pos % 10); - item_bake--; - } - /* Вспышка фона — порт flash_if_hurt/remove_flash_if_hurt (seg003:0AFC): - * do_flash(color) = set_bg_attr(0, color), т.е. подмена НУЛЕВОЙ записи - * палитры (вспыхивает всё чёрное поле). Оригинал ставит цвет и СНИМАЕТ - * его В ТОМ ЖЕ кадре, поэтому пока идёт flash_time видно СТРОБ - * «жёлтый/чёрный», а не одну длинную заливку. Снятие — после первого - * gfx_wait_vsync (ниже): цвет держится ~1 растровый кадр из трёх. - * Приоритет как в оригинале: активный flash_time > кадр урона - * (hitp_delta<0 -> ярко-красный, ровно на один кадр). */ - if (pop_flash_time) { - /* Цвет вспышки (flash_color оригинала): меч — ярко-жёлтый, зелья - * HP — красный, перо (медленное падение) — зелёный. */ - if (pop_flash_color == POP_FLASH_RED) flash_bg(255, 0, 0); - else if (pop_flash_color == POP_FLASH_GREEN) flash_bg(85, 255, 85); - else if (pop_flash_color == POP_FLASH_WHITE) flash_bg(255, 255, 255); - else flash_bg(255, 255, 85); - pop_flash_time--; - if (!pop_flash_time) pop_flash_color = POP_FLASH_YELLOW; - flash_on = 1; - } else if (pop_kid_hurt) { - flash_bg(224, 0, 48); /* color_12: игра правит его на */ - /* #E00030 (seg000:164), это не */ - /* стандартный VGA brightred */ - flash_on = 1; - } - update_kid_render_dx(); /* straddle: смещение спрайта, если kid_room≠cur_room */ - PROF(6); /* спрайты: страж, Kid, fore поверх */ - pop_dbg_m3(); /* ЗАМЕР: конец фона / начало спрайтов */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* check_mirror (seg003:0798) — ПЕРВАЯ строка draw_people - * (seg008:228A), до отрисовки кого бы то ни было: если Кид только что - * пролетел сквозь зеркало, тень должна родиться ДО того, как слот - * соперника пойдёт рисоваться, иначе кадр её проглотит. */ - pop_check_mirror(); - /* Падающие плиты, идущие ПОД Kid. Здесь, а не внутри pop_loose_tick: - * фон кадра (перепечатки тайлов, шов) обязан быть готов ДО любого - * спрайта, иначе перепечатка ложится поверх уже нарисованного куска — - * так окно задней стены и передняя грань пола оказывались на плите. */ - pop_dbg_m10(); /* ЗАМЕР: check_mirror сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_loose_mob_draw(); - pop_dbg_m11(); /* ЗАМЕР: pop_loose_mob_draw сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - { /* Кто позже — тот поверх; порядок задаёт обход тайлов, а не роль - * персонажа (см. guard_over_kid). Отрисовка одна на всех Char - * (pop_cdraw.c), различает их только слот. */ - /* Пересчёт после тика: слот, за который heal не платили, мог - * всё-таки сдвинуться — тогда бит снимется, а прошлый кадр - * сотрёт сам pop_char_draw (страховка cd_heal). */ - uint8_t g_after; - skip = pop_char_skip_mask(); - pop_dbg_m12(); /* ЗАМЕР: skip_mask сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Порядок «кто поверх кого» нужен, только если кого-то РИСУЕМ. - * При skip == 3 оба слота тихие, рисовать некого — а вызов стоит - * трамплина в банк 8 и двух objtile_at_char, 14 424 такта - * (замер 11/15, 2026-08-19). Перестановка безопасна: обе - * функции только читают, и читают разное — skip_mask снимок - * cd_sig, guard_over_kid габариты pop_cd прошлого кадра. */ - g_after = (skip == 3) ? 0 : guard_over_kid(); - if (!g_after && !(skip & 2)) { pop_char_draw(POP_CH_OPP); pop_char_fore(POP_CH_OPP); } - PROF(6); /* кадр Кида (тот же циан) */ - if (!(skip & 1)) pop_char_draw(POP_CH_KID); /* спрайт + брызги + клинок */ -#if DBG_KIDOBJ - /* ВРЕМЕННО: трасса для сверки с SDLPoP кадр в кадр. Место — то - * же, что у оригинала (конец add_kid_to_objtable), и ВНЕ skip: - * пропуск перерисовки не должен рвать трассу. */ - pop_dbg_kidobj(); -#endif - if (g_after && !(skip & 2)) { pop_char_draw(POP_CH_OPP); pop_char_fore(POP_CH_OPP); } - /* Брызги урона рисует сама отрисовка персонажа (порядок objtable: - * сразу после него и до клинка), а флаги снимаем здесь: соперника - * могло не оказаться в отрисованной комнате — тогда брызги просто - * пропадают, как в оригинале. Снимаем ПО ФАКТУ, а не безусловно: - * запись в кадре удара — готовая точка останова для отладки в - * MAME (watchpoint), и лишней записи каждый кадр нет. */ - if (pop_guard_hurt) pop_guard_hurt = 0; - if (pop_kid_hurt) pop_kid_hurt = 0; - } - pop_loose_mob_draw_over(); /* падающая плита НИЖЕ Kid → поверх него (y-порядок) */ - /* ПЕРЕДНИЙ СЛОЙ по пометкам — последним в кадре, как foretable у - * оригинала (draw_tables, seg008:1373). Пометки ставят сами - * объекты вокруг себя (pop_redraw.h). */ - pop_fore_needed(); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_hp_draw(); /* полоса HP — только при изменении */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - PROF(6); /* fore поверх Kid + борта */ - /* Fore-слой Кида — В КОНЦЕ, после плиты и полосы HP: окно fore-клипа - * одно на всех, и его ставит каждый, кто рисовал персонажа, поэтому - * pop_char_fore(KID) заодно возвращает окно Кида (при «соперник - * поверх» в нём остался бы соперник, и передние грани у Кида - * отсеклись бы целиком — он рисовался бы поверх столбов). */ - if (!(skip & 1)) pop_char_fore(POP_CH_KID); - /* Персонажи на этой странице приведены в порядок — след «фон трогали» - * для неё снят. ПОСЛЕ отрисовки, а не до: слой фона этого же кадра - * взводит бит и обязан быть учтён. Всё, что рисуется ниже - * (mob поверх Кида, борта), взводит его заново само. */ - pop_cd_clear(back); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_room_clip_borders(); /* почистить борта — только в кадрах падения (гейт) */ - - /* ФИКСИРОВАННЫЙ ЛОГИЧЕСКИЙ КАДР (pop_pace.h): период = max(n, - * ceil(W)) вместо прежнего ceil(W) + 2. Раньше здесь стояли три - * gfx_wait_vsync ПОДРЯД — они отсчитывались от КОНЦА работы, из-за - * чего бюджет кадра был один растр, а превышение его на такт стоило - * целого лишнего. Теперь ждём от ЯКОРЯ начала кадра. - * - * Первый фронт — всегда: на нём и происходит tear-free своп (до - * начала картинки остаётся верхний бордер, 16 строк). Строб вспышки - * снимается ровно между первым фронтом и остальными, как и было. */ - - PROF(0); /* чёрный: ждём vsync */ - - /* Звук: решить, запускать ли заявленный за кадр эффект (порт - * play_next_sound). Место то же, что у оригинала — конец отрисовки - * кадра, seg000:954: все заявки кадра уже поданы, и из них выбирается - * важнейшая. Раньше по кадру нельзя — потеряются поздние заявки. */ - pop_sfx_tick(); - /* МУЗЫКА ПО ХОДУ ИГРЫ. Заявку положил pop_sfx_play (звук без - * оцифровки — это Adlib-трек оригинала), а диск трогаем здесь: - * первая страница читается сразу и трек уже звучит, остальные - * доливаются по одной за кадр — 33 мс на кадр, пока догоняем. */ - pop_music_service(); - - /* Обе служебные полосы — нижняя статус-строка (сообщения оригинала) - * и верхняя отладочная. Всё change-driven и целиком в банке 9, - * поэтому звать можно каждый кадр: пока показанное не изменилось, - * работы там нет. Место — ПОСЛЕ pop_hp_draw: тот делит нижнюю - * полосу с текстом. */ - pop_status_frame(cur_room); - - pop_dbg_m4(); /* ЗАМЕР: конец спрайтов */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_wait_edge(); - if (flash_on) { /* строб: цвет держался один кадр растра */ - flash_bg(0, 0, 0); - flash_on = 0; - } - /* Условие боя — буквально как у оригинала (SDLPoP seg003.c:363): - * не «идёт бой» и не «рядом страж», а «у Кида ВЫНУТ МЕЧ». */ - pop_pace_end(pop_pace_n((uint8_t)(Kid.sword == SWORD_2_DRAWN))); - gfx_set_visible_page(back); - front = back; - if (is_demo && demo_finished) break; - } - - if (quit) break; - /* Restart Game завершает только игровой цикл. Следующая итерация - * верхнего автомата начинает title/intro с самого первого экрана. */ - if (pop_app_state == POP_APP_TITLE) continue; - if (pop_app_state == POP_APP_TIME_EXPIRED) { - pop_time_expired_show(); - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)) { - failed = 1; - break; - } - continue; /* TITLE -> intro -> новый demo */ - } - /* ENDING/HOF тоже завершили внутренний игровой цикл, но это не ошибка - * протокола и не demo-result: следующая итерация верхнего автомата - * вызовет соответствующий экран. */ - if (pop_app_state == POP_APP_ENDING || - pop_app_state == POP_APP_HALL_OF_FAME) - continue; - if (pop_app_state != POP_APP_DEMO) break; - if (demo_new_game) { - /* Чистую инициализацию выполняет общий LEVEL_LOAD в начале следующей - * итерации — тот же маршрут теперь используют skip title/intro. */ - if (!pop_app_dispatch(POP_APP_EV_NEW_GAME)) { - failed = 1; - break; - } - continue; - } else if (!pop_app_dispatch(POP_APP_EV_DEMO_FINISHED)) { - failed = 1; - break; - } - } - } - - PROF(0); /* выйти с ЧЁРНЫМ бордюром (иначе цвет */ - /* последней фазы остаётся в DOS) */ - pop_shutdown(); /* снять хук, закрыть ввод/графику, отдать ресурсы */ - return failed ? 1 : 0; -} diff --git a/applications/PoP/roomtest/roomtest_cold.c b/applications/PoP/roomtest/roomtest_cold.c deleted file mode 100644 index e48fbeb..0000000 --- a/applications/PoP/roomtest/roomtest_cold.c +++ /dev/null @@ -1,1269 +0,0 @@ -/* - * roomtest_cold.c — ХОЛОДНАЯ половина главного цикла, собирается в БАНК - * (--bank 8=roomtest_cold.c, окно W3). Здесь всё, что отрабатывает раз на - * уровень или только по отладочной клавише; кадровый путь остался в - * roomtest.c. Зачем разделили и что осталось снаружи — см. roomtest_cold.h. - * - * Правила банка те же, что у guards.c: состояние — в W1/W2 (данные этого - * модуля тоже, --bank-data не включён), звать можно резидент W1/W2 и другие - * __banked-модули через трамплины. - */ -#include -#include -#include "roomtest_cold.h" -#include "pop_bg.h" /* pop_loose_mob_reset — банк 7, зовём через трамплин */ -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_guard.h" -#include "pop_state.h" -#include "pop_geom.h" -#include "pop_cdraw.h" /* pop_cd — инвалидация слотов после переворота */ -#include /* gfx_copy_page */ -#include "pop_tune.h" -#include "pop_ctrl.h" /* pop_ctrl_init/close — ввод поднимает и закрывает boot */ -#include "pop_shadow.h" /* запечённый набор Тени */ -#include "pop_sfx.h" /* звуковые эффекты через CBL */ -#include "pop_vflip.h" /* сброс зеркальных страниц на смене уровня */ -#include "pop_cheat.h" /* pop_cheats — режим разработки включает pop_boot */ -#include "pop_pace.h" /* pop_speed_mode — режим скорости в отладочной метке */ -#include "pop_settings.h" /* pop_settings_defaults — стартовый профиль VANILLA */ -#include "pop_cfg.h" /* pop_cfg_load — POP.CFG поверх дефолтов */ -#include "pop_flow.h" /* таблица level-flow: какая сцена перед уровнем */ -#include "pop_intro.h" /* pop_pre_cutscene_show — сцена перед уровнем */ -#include "pop_app.h" /* pop_app_dispatch — состояния приложения */ -#include "pop_pal.h" /* pop_pal_apply — гашение перед загрузкой */ -#include "pop_timer.h" /* pop_timer_minutes — выбор сцены «времени мало» */ -#include "pop_ui.h" /* POP_PAL_DIM_BLACK */ -#include "pop_menu.h" /* пауза-меню: коды выбора */ -#include "pop_qsave.h" /* QuickSave/QuickLoad по F6/F9 */ -#include "pop_status.h" /* pop_status_invalidate после меню */ -#include -#include "pop_status.h" /* статус-строка и отладочная полоса — банк 9 */ -#include "pop_menu.h" /* pop_menu_init/free — атлас UI в bank 9 */ -#include "pop_ui.h" /* ранняя чёрная палитра + snapshot стартового экрана */ -#include "pop_pal.h" /* единый lifecycle game/title/level палитр */ -#include "pop_timer.h" /* global 60-minute timer — core in bank 9 */ -#include /* puts/printf — сообщения об ошибках загрузки */ -#include - -#define SEQ_STAND 2 -#define SEQ_TURN 5 -#define SEQ_FALL 7 -#define SEQ_RUN 84 -#define ENTRY_POSE_FALL 1 /* tbl_entry_pose[1] */ -#define ENTRY_POSE_RUN 2 /* tbl_entry_pose[13] */ -#define TILE_LEVELDOOR_LEFT 16 /* tiles_16_level_door_left */ -#define TILE_EMPTY 0 -#define LINK_DOWN 3 /* сторона links: 0=L,1=R,2=U,3=D */ - -/* Во время смены уровня enter_room должен только СОБРАТЬ новую страницу. - * Физический flip делает pop_level_switch после окончательной палитры. */ -static uint8_t level_prepare; -static uint8_t level_prepared_page; - -/* find_start_level_door (seg003:02E6): дверь уровня В СТАРТОВОЙ КОМНАТЕ — - * это дверь, через которую Кид ВОШЁЛ, поэтому она открыта полностью - * (modif = 43) и заводится trob'ом типа 3 (start_level_door, seg007:0D72). - * Без этого на уровне 2 Кид материализуется внутри глухой закрытой створки: - * его стартовый тайл (комната 5, ряд 1, колонка 3) — правая половина - * той самой двери. */ -static void find_start_level_door(uint8_t room) -{ - uint8_t *m = pop_trob_modif(room); - uint8_t tp; - if (!m) return; - /* Батч-доступ к странице уровня тут не нужен: функция отрабатывает раз - * за уровень, а pop_add_trob сам лезет в W0. */ - for (tp = 0; tp < 30; tp++) { - if (pop_level_tile(room, tp) != TILE_LEVELDOOR_LEFT) continue; - m[tp] = 43; /* створка поднята полностью */ - pop_add_trob(room, tp, 3); /* ...и тут же поедет ВНИЗ (type>=3) */ - } -} - - - -/* МЕНЮ, F10 И QUICKSAVE/LOAD — граница кадра, но не горячий путь. - * - * Всё это события «раз в партию», а в главном цикле они занимали полсотни - * строк резидента W1. Здесь же держим и edge-состояния клавиш: снаружи они - * никому не нужны. - * - * restart_level — «пользователь выбрал Restart Level» (главный цикл сделает - * это сам, после вычисления back-страницы, как респавн); - * dead_reset — «QuickLoad удался, счётчик кадров смерти сбросить». - * Возврат: 0 — продолжаем кадр, 1 — выйти из игрового цикла (Restart Game), - * 2 — выйти и завершить работу (Quit), -1 — сбой диспетчера. */ -int8_t pop_frame_ui(uint8_t *restart_level, uint8_t *dead_reset) __banked -{ - static uint8_t esc_prev, qs_save_prev, qs_load_prev; - uint8_t e = kbd_raw_down(KBD_MENU); - uint8_t menu_opened; - int8_t mrc = POP_MENU_NONE; - - if (e && !esc_prev) pop_menu_request = 1; - esc_prev = e; - menu_opened = pop_menu_request; - if (menu_opened) { - if (!pop_app_dispatch(POP_APP_EV_PAUSE)) return -1; - mrc = pop_menu_process(); - } - if (mrc == POP_MENU_QUICKSAVE) pop_qsave_request_save(); - else if (mrc == POP_MENU_QUICKLOAD) pop_qsave_request_load(); - else if (mrc == POP_MENU_QUICKLOAD_BACKUP) - pop_qsave_request_load_backup(); - else if (mrc == POP_MENU_RESTART_LEVEL) *restart_level = 1; - else if (mrc == POP_MENU_RESTART_GAME) - return (int8_t)(pop_app_dispatch(POP_APP_EV_RESTART_INTRO) ? 1 : -1); - else if (mrc == POP_MENU_QUIT) - return (int8_t)(pop_app_dispatch(POP_APP_EV_QUIT) ? 2 : -1); - if (menu_opened) { - /* Меню переписало обе страницы целиком. Снимки слотов об этом не - * знают и продолжают считать, что персонаж на странице уже - * нарисован, — стоящий Кид оставался бы невидимым до первого своего - * движения. */ - pop_cd_forget(); - pop_status_invalidate(); - if (!pop_app_dispatch(POP_APP_EV_RESUME)) return -1; - } - /* F10 — отладочный немедленный выход (раньше был на Esc, но Esc теперь - * открывает меню; уйдёт вместе с отладкой). */ - if (kbd_raw_down(KBD_QUIT)) - return (int8_t)(pop_app_dispatch(POP_APP_EV_QUIT) ? 2 : -1); - /* F6/F9 только ставят запрос; файловая операция выполняется здесь, на - * границе кадров — вне окон Char и до heal/tick/draw. */ - { - uint8_t s = kbd_raw_down(KBD_QUICKSAVE); - uint8_t l = kbd_raw_down(KBD_QUICKLOAD); - - if (s && !qs_save_prev) pop_qsave_request_save(); - if (l && !qs_load_prev) pop_qsave_request_load(); - qs_save_prev = s; qs_load_prev = l; - if (pop_qsave_process() > 0) *dead_reset = 1; - } - return 0; -} - -/* СМЕНА УРОВНЯ — целиком здесь, а не в главном цикле. - * - * Событие редкое (раз в несколько минут игры), а кода на нём была без - * малого сотня строк — и все они лежали в _main, то есть в резиденте W1, - * где у нас счёт на десятки байт. Наружу остаётся одно условие и один - * вызов. - * - * back — страница, в которую главный цикл рисует кадр: после загрузки - * уровня её надо вернуть себе (level_switch показывает свою). - * Возврат: 0 — уровень сменён, -1 — сбой, главный цикл завершает работу. */ -int8_t pop_level_change(uint8_t back) __banked -{ - uint8_t reveal_pending = 0; - pop_pre_cutscene_t pre = pop_flow_pre_cutscene(pop_next_level, - pop_timer_minutes); - - /* Загрузка файла уровня, спрайтов соперника и тайлсета — в - * pop_level_switch ниже. До 2/4/6/8/9/12 таблица - * flow запускает отдельное состояние CUTSCENE, как play_level() - * SDLPoP: следующий уровень не трогаем до завершения/skip. */ - if (pre != POP_PRE_NONE) { - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_STARTED)) - return -1; - pop_pre_cutscene_show(pre); - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)) - return -1; - /* Катсцена оставляет экран чёрным. Новый уровень будет - * открыт одним применением его готовой палитры. */ - reveal_pending = 1; - } else { - /* CBL глушим ДО первой же операции с палитрой. Палитра идёт - * через BIOS ($A4) с запрещёнными прерываниями: насос не - * успевает долить блок, железо крутит хвост своего буфера — - * на слух скрежет. Раньше pop_sfx_pause() звался только - * внутри pop_level_switch, то есть УЖЕ ПОСЛЕ гашения, и - * переход без катсцены (в т.ч. телепорт Shift+L) скрежетал - * почти всегда — поймано пользователем 2026-08-25. Ветка с - * катсценой свободна от этого: pop_pre_cutscene_show глушит - * звук первым действием. */ - pop_sfx_pause(); - /* Без fade: старый кадр гасим сразу и обязательно даём - * показать один чёрный растр ДО диска/перерисовки. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - pop_wait_edge(); - reveal_pending = 1; - if (!pop_app_dispatch(POP_APP_EV_LEVEL_FINISHED)) - return -1; - } - if (pop_level_switch() != 0 || - !pop_app_dispatch(POP_APP_EV_LEVEL_READY)) - return -1; - if (reveal_pending) { - /* Обе страницы и snapshot уже принадлежат новому уровню: - * включить его корректную палитру одним переходом. */ - pop_pal_apply(0); - reveal_pending = 0; - } - /* level_switch оставляет CBL закрытым: palette/fade идут через - * BIOS и при открытом буфере давали скрежет на первом кадре. */ - (void)pop_sfx_start(); - gfx_set_draw_page(back); - - return 0; -} - -/* start_level (seg003:0055) + do_startpos (seg003:01A3) + set_start_pos - * (seg003:028A). - * - * Позиция берётся ИЗ ДАННЫХ уровня (pop_level_start_*), а не из #define: - * start_pos — тайл 0..29 (row*10+col), start_dir — направление, в котором - * персонаж должен ОКАЗАТЬСЯ. - * - * Направление ИНВЕРТИРУЕТСЯ (`Char.direction = ~level.start_dir`): персонаж - * ставится спиной и доворачивается кадрами позы входа. Сама поза — из - * tbl_entry_pose (data.h:848 = {0,1,0,…,2,…}): - * 1 (уровень 1) — падение внутрь (seq_7_fall) + нажатие кнопки room5(0,2); - * это оно захлопывает решётку за спиной в первой комнате; - * 2 (уровень 13) — вбегание (seq_84_run); - * иначе — разворот на месте (seq_5_turn). - * Таблица индексируется НОМЕРОМ УРОВНЯ — pop_level_entry_pose(). */ -void pop_start_level(void) __banked -{ - uint8_t entry_pose, start_room, pos, seq = SEQ_TURN, chkp; - int8_t dir; - - pop_leveldoor_open = 0; /* seg003:97 — дверь прошлого уровня не в счёт */ - pop_music_level_start(); /* одноразовые темы уровня — заново */ - pop_feather = 0; /* seg003:189 — перо не переживает старт уровня */ - /* upside_down тоже сбрасывается стартом уровня (seg003:38/188). Если - * картинка была перевёрнута, отрисовка комнаты ниже уже пойдёт обычной - * стороной, поэтому переворачивать ничего не надо — только снять флаги. */ - pop_upside = 0; - pop_upside_want = 0; - pop_upside_dirty = 0; - entry_pose = pop_level_entry_pose(pop_current_level); - start_room = pop_level_start_room(); - pos = pop_level_start_pos(); - dir = (int8_t)~pop_level_start_dir(); - /* Особое событие: старт с чекпойнта (do_startpos, seg003:0141). - * Числа — в pop_tune.h. Плиту снимаем ПОСЛЕ pop_level_reset_tiles() - * ниже, иначе рестарт её вернёт. */ - chkp = (uint8_t)(pop_current_level == POP_CHKP_LEVEL && pop_checkpoint); - if (chkp) { - start_room = POP_CHKP_RESPAWN_ROOM; - pos = POP_CHKP_RESPAWN_TILEPOS; - dir = (int8_t)~POP_CHKP_RESPAWN_DIR; /* стартует в ПРОТИВОположную - * и разворачивается seq_5 */ - } - -#ifdef DBG_START_ROOM - /* ОТЛАДОЧНЫЙ СТАРТ: сразу в целевую комнату оптимизации, минуя проход - * уровня. Задаётся сборкой (make ROOM=15 POS=2), по умолчанию — сцена - * 11/15 из docs/perf_l11_room15.md: Кид в (0,2), справа чомпер под - * факелом, дальше второй факел и страж. - * - * Ставится ПОСЛЕ чекпойнта намеренно: отладочная позиция должна - * перебивать и его тоже, иначе рестарт уровня уводил бы Кида из - * измеряемой комнаты. Направление и позу входа не трогаем — они из - * данных уровня, как у обычного старта. */ - /* ...НО ТОЛЬКО НА СВОЁМ УРОВНЕ. pop_start_level зовётся ещё и на - * СМЕНЕ уровня, и без этой проверки отладочная позиция перехватывала - * переход: на 6-м Кид проваливается в комнате 1, а на 7-м обязан - * появиться в комнате 17 и продолжить падение вниз (спецсобытие - * «вход падением», см. ниже). Вместо этого он оказывался в - * DBG_START_ROOM/POS, спецсобытие не срабатывало вовсе, и переход 6->7 - * выглядел сломанным (поймано пользователем 2026-08-20 на сборке - * make LEVEL=6 ROOM=1 POS=18). - * - * Рестарт ТОГО ЖЕ уровня (смерть, чекпойнт) отладочную позицию - * сохраняет — ради этого она и перебивает чекпойнт выше. */ - if (pop_current_level == FIRST_LEVEL) { - start_room = DBG_START_ROOM; - pos = DBG_START_POS; - } -#endif - - /* Рестарт уровня = load_level() заново (play_level, seg003:57): в - * исходное возвращаются И модификаторы (пики/ворота), И сами тайлы — - * разбитые плиты целы, выпитые зелья на месте (BUG-RESPAWN-1), и - * убитые стражи снова живы на своих тайлах (BUG-RESPAWN-2). */ - pop_trob_reset(); - pop_level_reset_tiles(); - pop_level_reset_guards(); - pop_guard_reset(); /* start_level: Guard.direction = none */ - /* united_with_shadow = 0 (seg003:95) — состояние ПЕРСОНАЖА уровня, а не - * комнаты: pop_guard_reset зовётся и при каждом входе в комнату (из - * pop_guard_enter), поэтому гасить слияние надо здесь. */ - pop_united_shadow = 0; - pop_shadow_init = 0; - pop_guard_notice_timer = 0; /* фора Джафара — не переживает рестарт */ - pop_nav_hold = 0; /* старт уровня снимает и держатель чита */ - pop_loose_mob_reset(); /* start_level: mobs_count = 0 (seg003:88) */ - pop_loose_forget(); /* ...и фазы плит — уровень восстановлен целиком */ - /* «Особое событие: убрать loose-плиту» (do_startpos): без этого путь в - * комнату-чекпойнт после респавна остался бы непройденным. */ - if (chkp) - pop_level_set_tile(POP_CHKP_CLEAR_ROOM, - (uint8_t)(POP_CHKP_CLEAR_ROW * 10 + POP_CHKP_CLEAR_COL), - TILE_EMPTY); - - /* Кнопку жмём ДО отрисовки комнаты — как в оригинале (do_startpos - * отрабатывает раньше первого draw_room), иначе шов кадр показывал бы - * ещё не тронутое состояние решётки. */ - if (entry_pose == ENTRY_POSE_FALL) { - /* get_tile(5,2,0) + trigger_button(0,0,-1) — «нажать» кнопку room5, - * col2, row0 её же типом и модификатором (в оригинале и то и другое - * берётся из curr_* после get_tile). */ - uint8_t tp = 2; /* row0*10 + col2 */ - pop_trigger_button(5, tp, pop_level_tile(5, tp), pop_trob_modif(5)[tp], - 0 /* seg003:170 — playsound=0 */); - seq = SEQ_FALL; - } else if (entry_pose == ENTRY_POSE_RUN) { - seq = SEQ_RUN; - } - - /* Тоже ДО отрисовки комнаты: дверь, через которую вошли, обязана быть - * открыта уже в первом кадре (в оригинале find_start_level_door стоит - * между do_startpos и draw_level_first). */ - find_start_level_door(start_room); - - enter_room(start_room); - kid_init(seq, (int8_t)(pos % 10), (int8_t)(pos / 10), dir); -#ifdef DBG_START_ROOM - /* ...и поправить x: kid_init ставит `x_bump[col] + TILE_SIZEX`, а это - * ЛЕВАЯ ГРАНИЦА СЛЕДУЮЩЕЙ колонки (порт set_start_pos — в данных уровня - * стартовые позиции подобраны под такую договорённость). Отладочный - * старт называет тайл, В КОТОРОМ Кид должен оказаться, поэтому сдвигаем - * его внутрь названного: с границы физика относит Кида к колонке правее, - * и в 11/15 он стартовал прямо в челюстях (найдено пользователем - * 2026-08-19). - * - * Отступ ровно 2, а не «половина тайла»: колонку определяет не сам x, а - * ВЕСОВАЯ ТОЧКА кадра (determine_col -> dx_weight: dx позы минус - * weight-биты, с учётом направления), поэтому геометрически ровной - * середины тут нет. Число снято замером живой сцены: x = 98 при позе - * стойки даёт curr_col = 2, x = 94 — уже 1. */ - if (pop_current_level == FIRST_LEVEL) { /* см. условие выше */ - Kid.x = (uint8_t)(pop_x_bump[(pos % 10) + FIRST_ONSCREEN_COLUMN] + - TILE_SIZEX - 2); - Kid.curr_col = (int8_t)(pos % 10); - } -#endif - /* Спецсобытие «вход падением» (set_start_pos, seg003:0196): на 7-м - * уровне Кид ставится в комнату 17, а экран тут же переводится на - * комнату ПОД ней (`goto_other_room(3)`: y −= 189, ряд пересчитать) — - * он влетает в неё сверху, продолжая падение с шестого уровня. */ - if (pop_current_level == FALLING_ENTRY_LEVEL && - start_room == FALLING_ENTRY_ROOM) { - uint8_t below = pop_room_link(start_room, LINK_DOWN); - if (below) { - Kid.y = (uint8_t)(Kid.y - 189); - Kid.curr_row = pop_y_to_row((int16_t)Kid.y); - enter_room(below); - } - } - Kid.sword = 0; /* set_start_pos: sword_0_sheathed */ - /* Остальные одноразовые флаги того же set_start_pos (seg003:028A). Они - * НЕ косметика: droppedout переживал границу уровня и на следующем - * уровне заставлял стража идти «за упавшим Кидом» вниз - * (guard_follows_kid_down) — на 4-м уровне в комнате 22 страж по этому - * флагу шёл прямо в челюсти, хотя Кида он даже не видел. Взводится он - * на ПРОШЛОМ уровне: Кид сорвался с уступа в боевой позе (кадры - * 150..179, pop_map.c start_fall) — обычная концовка боя со скелетом на - * 3-м. Поймано пользователем 2026-08-24 (переход 3 -> 4 ногами, через - * дверь уровня; читом Shift+L старт чистый, и баг не воспроизводился). */ - pop_droppedout = 0; - offguard = 0; - knock = 0; - /* play_level (seg003:106): have_sword = level >= have_sword_from_level - * (=2); исключение — demo level 0, где меч уже выдан. */ - pop_have_sword = (uint8_t)(pop_current_level == 0 || pop_current_level >= 2); - /* seamless (seg003:158): пришли БЕЗ двери уровня, прямо на бегу — HP не - * трогаем, оно переезжает как есть. Флаг одноразовый: у оригинала его - * гасит заставка «LEVEL N», которую этот же переход и пропускает. */ - if (pop_seamless) { pop_seamless = 0; pop_kid_hp_carry(); } - else pop_kid_hp_reset(); -} - -/* ---- ОТЛАДКА: обход комнат по номеру -------------------------------- * - * - * Нужен, чтобы пройти все комнаты уровня и собрать список багов отрисовки, - * включая недостижимые обычным путём. - * - * Здесь БЫЛ pop_trob_reset() перед enter_room — «чтобы каждая комната - * смотрелась в исходном состоянии». Убран: reset обнуляет room_seen, и - * модификаторы перечитываются из уровня заново, то есть чит ОТМАТЫВАЕТ МИР - * — открытые/закрытые ворота, выдвинутые пики, нажатые кнопки. Навигация - * обязана только телепортировать; исходное состояние даёт перезапуск. */ -uint8_t pop_dbg_roomnav(uint8_t dir) __banked -{ - uint8_t r, i, c, pos = 20, any = 0xFF; - - /* Кид МЁРТВ: сначала честный рестарт уровня, потом телепорт. Навигация - * только переставляет Кида (kid_init + сброс HP), то есть «оживляет» его - * мимо start_level — а тот обязан вернуть тайлы, модификаторы и ОЧИСТИТЬ - * слот соперника (seg003:100: Guard.direction = dir_56_none). Без этого - * после смерти оставался живой скелет рядом с вернувшейся кучей костей. */ - if (pop_kid_dead) pop_start_level(); - - r = cur_room; - r = (dir == 1) ? (uint8_t)(r == 24 ? 1 : r + 1) - : (uint8_t)(r == 1 ? 24 : r - 1); - enter_room(r); - - /* Куда поставить Кида в новой комнате: пол С МАКСИМАЛЬНЫМ Y — сначала - * НИЖНИЙ ряд (2), потом 1, и только потом 0 (пользователь 2026-08-11). - * Раньше брался первый пол подряд, то есть почти всегда (0,0) — верхний - * левый угол: это и «прилёт» в проём/ворота, и, на уровне 5, посадка - * вплотную к тени спецсобытия, которая ждёт в колонке −1 ряда 0. Вместо - * сцены кражи зелья начиналась схватка, которой в этой комнате быть не - * должно. Снизу вверх нужно и самой навигации: в верхнем ряду пола чаще - * нет, и Кид проваливается из комнаты сразу после телепорта. - * - * ИСКЛЮЧЕНИЕ — комната 14 уровня 7 (пользователь 2026-08-12): её проходят - * СВЕРХУ ВНИЗ (с ряда 0 на ряд 2 через зацеп за кромки), и с нижнего ряда - * этот спуск не проверить вовсе. Пол в ряду 0 там есть, так что Кид не - * проваливается. - * - * В каждом ряду сначала ищем ОБЫЧНЫЙ пол, и только если его там нет — - * любой проходимый tile_is_floor (seg001: всё, кроме пустоты, верха - * колонны, верха двери, стены и «половинок» 26..29). */ - { - int8_t row, step = -1, first = 2; - if (pop_current_level == GRAB_DOWN_LEVEL && - r == GRAB_DOWN_ROOM) { first = 0; step = 1; } - for (row = first; row >= 0 && row <= 2 && any == 0xFF; - row = (int8_t)(row + step)) { - uint8_t fallback = 0xFF; - for (i = (uint8_t)(row * 10); i < (uint8_t)(row * 10 + 10); i++) { - c = (uint8_t)(room_fg[i] & 0x1F); - if (c == 1) { any = i; break; } - if (fallback == 0xFF && c && c != 9 && c != 12 && - c != 20 && !(c >= 26 && c <= 29)) fallback = i; - } - if (any == 0xFF) any = fallback; - } - } - if (any != 0xFF) pos = any; - kid_init(SEQ_STAND, (int8_t)(pos % 10), (int8_t)(pos / 10), 0); - pop_kid_hp_reset(); - - /* ВЫХОД ИЗ БОЯ (BUG-CHEAT-FIGHT-1). Телепорт с вынутым мечом заклинивал - * управление намертво: pop_control при Kid.sword == SWORD_2_DRAWN уходит - * в control_with_sword, а там единственный выход — ветка «убрать меч» на - * кадре FRAME_171_STAND_WITH_SWORD. После kid_init(SEQ_STAND) кадр - * обычный, стража в новой комнате нет, swordfight не запускается — и - * диспетчер каждый кадр не делает НИЧЕГО. Это болезнь ЧИТА: в оригинале - * телепорта между комнатами нет, попасть в режим боя без соперника - * нечем. Меч в инвентаре (pop_have_sword) НЕ теряем — только состояние - * схватки. */ - Kid.sword = SWORD_0_SHEATHED; - holding_sword = 0; - offguard = 0; - guard_refrac = 0; - - /* ПРОВАЛ НА СЛЕДУЮЩИЙ УРОВЕНЬ ПО ЧИТУ (та же болезнь, что выше). - * Уровень 12 кончается ФАКТОМ попадания в комнату 23 — двери у него нет - * (pop_seamless, seg000:0900). А навигация перебирает комнаты ПО - * НОМЕРУ, то есть любой обход рано или поздно наступает на 23-ю, и - * уровень молча меняется на 13-й: комнату 23 двенадцатого уровня читом - * не посмотреть в принципе, а прогон «съезжает» на соседний уровень - * незаметно для проверяющего (поймано 2026-08-13 на первом же прогоне). - * Держим триггер, пока Кид не сменит комнату НОГАМИ. */ - pop_nav_hold = 1; - return 1; -} - - -/* ---- ЧИТЫ (seg000: switch под if (cheats_enabled)) -------------------- * - * Переехали из главного цикла в банк 8: дёргаются раз в кадр, то есть - * один трамплин на кадр, а места в резиденте W1/W2 не осталось (звук, - * атлас Тени и пейсинг съели остаток; см. TASKS_OPEN, MEM). - * - * Флаги «фронта» стали статиками модуля — раньше они были локалями main. - * Смысл прежний: одно нажатие = одно срабатывание. - */ -static uint8_t cheat_prev, immo_prev, sound_prev, music_prev, nlvl_prev; -static uint8_t upsd_prev, xdec_prev, xinc_prev, cfg_prev; -static uint8_t time_sub_prev, time_add_prev; - -void pop_cheat_tick(void) __banked -{ - /* Читы (seg000: switch под if (cheats_enabled)). Все — по - * ФРОНТУ нажатия, иначе срабатывали бы каждый кадр. - * K — убить стража; - * I — бессмертие Кида (наш отладочный, в оригинале его нет: - * иначе боёвку проверять получается ровно три раза); - * Ctrl+S — вкл/выкл звук (порт Ctrl+S из SDLPoP, seg000:657). - * НЕ чит: работает и без pop_cheats, как в оригинале. - * Ctrl обязателен — голая S у нас свободна, но менять - * пользовательскую раскладку оригинала незачем; - * Shift+L — следующий уровень (seg000:698, ветка next_level = - * current_level + 1). Единственный вменяемый способ - * тестировать уровни 2..14. NB: L без Shift — отладочный - * «осторожный шаг вправо» (pop_ctrl KBD_DBG_STEPR); с - * Shift шаг тоже пройдёт, но уровень тут же сменится, так - * что конфликта на практике нет; - * F7 / F8 — отнять / добавить минуту. Это точный аналог - * keypad −/+ SDLPoP, но +/- заняты обходом комнат; - * [ / ] — подвинуть Кида на ПИКСЕЛЬ влево/вправо (seg000:1828, - * `--Char.x` / `++Char.x`). Нужен потому, что мост MAME - * теряет нажатия при быстрой отправке, и подогнать Кида в - * нужную позу скриптом нельзя (на это упёрлись BUG-LOOSE-2 - * и BUG-GATE-PASS-1). Пишем прямо в Kid.x: геометрию - * персонажа в этом порте задаёт не диспетчер (грабли - * L1-EXIT). Колонку не трогаем — её пересчитает физика - * следующего кадра. */ - uint8_t k = kbd_raw_down(KBD_CHEAT_KILL); - uint8_t i = kbd_raw_down(KBD_CHEAT_IMMO); - uint8_t s = (uint8_t)(kbd_raw_down(KBD_SOUND_TOGGLE) && - (kbd_raw_down(KBD_LCTRL) || kbd_raw_down(KBD_RCTRL))); - uint8_t m = (uint8_t)(kbd_raw_down(KBD_MUSIC_TOGGLE) && - (kbd_raw_down(KBD_LCTRL) || kbd_raw_down(KBD_RCTRL))); - uint8_t nl = (uint8_t)(kbd_raw_down(KBD_CHEAT_NEXTLVL) && - (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT))); - uint8_t up = kbd_raw_down(KBD_CHEAT_UPSIDE); - uint8_t xd = kbd_raw_down(KBD_CHEAT_XDEC); - uint8_t xi = kbd_raw_down(KBD_CHEAT_XINC); - uint8_t ts = kbd_raw_down(KBD_CHEAT_TIME_SUB); - uint8_t ta = kbd_raw_down(KBD_CHEAT_TIME_ADD); - /* C — записать POP.CFG сейчас (отладка MS2, до экрана Settings: - * там сохранять будет Apply/выход). */ - uint8_t cf = kbd_raw_down(0x21); /* C (PS/2 set 2) */ - if (pop_cheats && k && !cheat_prev) pop_guard_kill(); - /* Бессмертие по кругу: 0 выкл -> 1 «только бой» -> 2 «бой и - * мелкий урон» -> 0. Что означают уровни — pop_state.h. */ - if (pop_cheats && i && !immo_prev) - pop_immortal = (uint8_t)(pop_immortal >= 2 ? 0 : pop_immortal + 1); - if (s && !sound_prev) { - pop_sfx_toggle(); /* не под pop_cheats */ - pop_settings.sound_enabled = pop_snd_want; - /* Порт seg000:657: оригинал отвечает строкой в статус-полосе. */ - pop_status_msg = (uint8_t)(pop_snd_want ? POP_MSG_SOUND_ON - : POP_MSG_SOUND_OFF); - } - if (m && !music_prev) { - pop_mus_want ^= 1; /* не под pop_cheats */ - pop_settings.music_enabled = pop_mus_want; - pop_status_msg = (uint8_t)(pop_mus_want ? POP_MSG_MUSIC_ON - : POP_MSG_MUSIC_OFF); - } - if (pop_cheats && nl && !nlvl_prev && pop_current_level < POP_LAST_LEVEL) - pop_next_level = (uint8_t)(pop_current_level + 1); - /* U — переворот экрана (seg000:0793 — чит и в оригинале). - * Тот же путь, что у зелья типа 4: флаг + пометка «перевернулись». */ - if (pop_cheats && up && !upsd_prev) { /* тот же путь, что у зелья */ - pop_upside_want = (uint8_t)!pop_upside_want; - pop_upside_dirty = 1; - } - if (pop_cheats && xd && !xdec_prev) Kid.x = (uint8_t)(Kid.x - 1); - if (pop_cheats && xi && !xinc_prev) Kid.x = (uint8_t)(Kid.x + 1); - if (pop_cheats && ts && !time_sub_prev) pop_timer_cheat_subtract(); - if (pop_cheats && ta && !time_add_prev) pop_timer_cheat_add(); - if (pop_cheats && cf && !cfg_prev) (void)pop_cfg_save(); - cheat_prev = k; - immo_prev = i; - sound_prev = s; - music_prev = m; - nlvl_prev = nl; - upsd_prev = up; - xdec_prev = xd; - xinc_prev = xi; - time_sub_prev = ts; - time_add_prev = ta; - cfg_prev = cf; -} - -/* Отладочная строка в верхнем борте переехала в pop_status.c (банк 9): - * она теперь ТЕКСТОВАЯ, а шрифт живёт там же. Здесь не осталось ничего — - * см. заголовок pop_status.h про то, почему заявка сообщения стоит один - * байт, а весь рендер сидит в банке. */ - -/* Загрузить комнату room в рабочие массивы и отрисовать её фон в ОБЕ - * страницы дабл-буфера (у каждой своя видео-ОЗУ/теневая копия). Оставляет - * активной страницу 1 — вызывающий восстанавливает нужную draw-страницу. */ -/* side — куда ушёл КИД (0 left, 1 right, 2 up, 3 down); 0xFF = «не переход - * за Кидом» (старт уровня, респавн, чит-навигация). От него зависит ровно - * одно: пойдёт ли страж следом (pop_guard_follow, порт exit_room+ - * follow_guard) или останется в прежней комнате. */ -void enter_room_side(uint8_t room, uint8_t side) __banked -{ - uint8_t pg; - /* Страж идёт за Кидом? — решаем ДО того, как что-либо загрузим: функции - * нужны и старая комната (Guard.room), и целевая. Пошёл — ни leave, ни - * enter звать нельзя: он уже перенесён и живёт дальше как есть. */ - uint8_t follow = (uint8_t)(side <= 3 ? pop_guard_follow(room, side) : 0); - if (!follow) pop_guard_leave(); /* запомнить стража уходящей комнаты */ - /* ...и так же запомнить НЕДОСЧИТАННЫЕ loose: пока карта ещё описывает - * СТАРУЮ комнату, фаза уезжает в персистентный room_modif + trob, и - * плита доваливается заочно (см. pop_loose_leave_room / animate_loose). */ - pop_loose_leave_room(); - uint8_t *room_mod; - pop_room_load(room, room_fg, room_bg, lcol_fg, lcol_bg, rcol_fg, rcol_bg, below_fg); - pop_map_set(room_fg); - /* Соседей слева/справа карта забирает из уровня САМА (целиком, см. - * pop_map_set_edges) — отдельной копии в приложении нет. */ - pop_map_set_edges(pop_room_link(room, 0), pop_room_link(room, 1), - pop_room_link(room, 2), pop_room_link(room, 3)); - /* Боковой переход: колонки сдвинулись ровно на 10 (x ∓140), флаги - * перекрытия при этом инвариантны — историю перенумеровываем, а не - * теряем. Без этого решётка шва не бампит на кадре входа и Кид с - * разбега проходит сквозь закрытые ворота (BUG-GATE-PASS-1). */ - if (side == 0) pop_coll_shift(+10); /* ушёл ВЛЕВО: col += 10 */ - else if (side == 1) pop_coll_shift(-10); /* ушёл ВПРАВО: col −= 10 */ - pop_room_set_below(below_fg); - /* Ряд 2 верхнего соседа → полоса кладки у потолка (row0). fg — статика - * уровня, mod — живой room_modif (ленивая инициализация). */ - { - uint8_t up = pop_room_link(room, 2), c; - if (up) { - uint8_t *um = pop_trob_modif(up); - pop_level_access_begin(); - for (c = 0; c < 10; c++) above_fg[c] = pop_level_tile_raw(up, (uint8_t)(20 + c)); - pop_level_access_end(); - for (c = 0; c < 10; c++) above_mod[c] = um[20 + c]; - pop_room_set_above(above_fg, above_mod); - pop_map_set_above(above_fg); /* плита-потолок: пробой снизу + провал */ - } else { - pop_room_set_above(0, 0); /* нет комнаты сверху → пол (кромка) */ - pop_map_set_above(0); - } - } - pop_map_set_room(room); - /* Kid.room — как в оригинале: «комната персонажа». Полная модель - * (Kid.room ≠ отрисованной у шва) ещё не портирована, но сравнение - * Kid.room == Guard.room нужно уже сейчас: без него луч видимости - * стража никогда не срабатывает. */ - Kid.room = room; - pop_loose_reset(); /* loose-состояние не тянем из старой комнаты */ - pop_trob_room_changed(); /* отложенные перерисовки пик — не из старой комнаты */ - pop_bake_forget(); /* и слоты «первая запечка была на странице N» */ - pop_trob_anim_room(room); /* факелы/зелья: стартовая фаза + trob */ - pop_start_chompers(room, Kid.curr_row); /* seg000:1288: чомперы РЯДА Кида */ - pop_check_fall_flo(); /* спецсобытие ур.13: гряда плит сверху */ - /* check_shadow (seg002:0064) стоит ПЕРЕД enter_guard и на «шадоу»- - * уровнях забирает слот соперника себе: вернула 1 — стража поднимать - * НЕЛЬЗЯ (в комнате 24 уровня 5 он есть в данных, но оригинал его туда - * не пускает). Порядок ровно как в оригинале, не «сначала страж, потом - * заменим». */ - if (!follow && !pop_check_shadow(room)) - pop_guard_enter(room); /* страж комнаты (порт enter_guard) */ - pop_hp_invalidate(); /* фон перерисован — полоса HP тоже */ - /* Модификаторы тайлов (openness ворот, состояние пик) — ПЕРСИСТЕНТНЫЕ - * per-room (room_modif живёт между входами); рисуем и коллидируем по ним, - * а не по свежему backtable. Фаза P0. */ - room_mod = pop_trob_modif(room); - /* Модификаторы швов — из ЖИВОГО room_modif соседей (openness ворот, - * видимых через шов, персистентен: ворота room8(0,9) видны в col0 room6). - * pop_room_load заполнил lcol_bg/rcol_bg статикой уровня — перекрываем. */ - { - uint8_t lft = pop_room_link(room, 0), rgt = pop_room_link(room, 1); - if (lft) { uint8_t *m = pop_trob_modif(lft), i; - for (i = 0; i < 3; i++) { - lcol_bg[i] = m[9 + i * 10]; - /* шов рисуется в обе страницы ниже — синхр. сигнатуру */ - seam_sig[i] = seam_row_sig(m, lcol_fg, i); - } } - if (rgt) { uint8_t *m = pop_trob_modif(rgt); - rcol_bg[0] = m[0]; rcol_bg[1] = m[10]; rcol_bg[2] = m[20]; } - } - seam_redraw = 0; seam_rows = 0; /* шов свежий на обеих страницах — редрой не нужен */ - /* ENTER-ROOM-FAST: комната рисуется ОДИН раз — в скрытую страницу, — и - * обычно тут же показывается флипом; вторая страница дабл-буфера получает её - * КОПИЕЙ акселератора (gfx_copy_page, ~384 burst-строки против почти - * полумиллиона тактов на вторую отрисовку). Побочный эффект важнее - * тактов: игрок больше не видит, КАК рисуются тайлы — только готовый - * кадр. - * - * Копия идёт банком 0x50, то есть обновляет и VRAM, и ОЗУ-копию - * страницы-приёмника — иначе heal на ней восстанавливал бы фон прошлой - * комнаты (инвариант gfx_copy_page, регресс tests/pageflip). - * - * Видимая страница здесь МЕНЯЕТСЯ, поэтому главный цикл перечитывает её - * в начале каждого кадра (front = gfx_get_visible_page()), а не ведёт - * свой счёт. */ - { - gfx_rect_t full; - pg = (uint8_t)(gfx_get_visible_page() ^ 1); /* скрытая */ - gfx_set_draw_page(pg); - pop_screen_fill_field(); - pop_room_draw(room, room_fg, room_mod, lcol_fg, lcol_bg); - if (level_prepare) { - /* Межуровневый staging: пока pop_pal_level_load последовательно - * пишет KID.PAL и env/wall, видима нулевая чёрная страница. - * Показывать эту комнату разрешено только после финальной - * палитры — иначе level 4 успевает мелькнуть цветами level 3. */ - level_prepared_page = pg; - } else { - gfx_set_visible_page(pg); /* показать готовое */ - gfx_set_draw_page((uint8_t)(pg ^ 1)); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); /* вторую — копией */ - } - } - cur_room = room; - kid_room = room; /* S1: комната Kid синхронна отрисованной (S3 разведёт) */ - pop_leave_timer = 2; /* exit_room_timer: 2 кадра блокировки leave (анти-ping-pong/#4) */ -} - -/* Вход в комнату БЕЗ перехода за Кидом: старт уровня, респавн, чит-обход. - * Страж такой смены не «видит» — он остаётся в своей комнате. */ -void enter_room(uint8_t room) __banked { enter_room_side(room, 0xFF); } - -void pop_qsave_restore_room(uint8_t room) __banked -{ - uint8_t i, pg, *room_mod; - gfx_rect_t full; - uint8_t lft, rgt, up; - - pop_room_load(room, room_fg, room_bg, lcol_fg, lcol_bg, - rcol_fg, rcol_bg, below_fg); - pop_map_set(room_fg); - lft = pop_room_link(room, 0); rgt = pop_room_link(room, 1); - up = pop_room_link(room, 2); - pop_map_set_edges(lft, rgt, up, pop_room_link(room, 3)); - pop_room_set_below(below_fg); - if (up) { - uint8_t *um = pop_trob_modif(up); - pop_level_access_begin(); - for (i = 0; i < 10; i++) - above_fg[i] = pop_level_tile_raw(up, (uint8_t)(20 + i)); - pop_level_access_end(); - for (i = 0; i < 10; i++) above_mod[i] = um[20 + i]; - pop_room_set_above(above_fg, above_mod); - pop_map_set_above(above_fg); - } else { - pop_room_set_above(0, 0); pop_map_set_above(0); - } - pop_map_set_room(room); - pop_loose_reset(); - pop_trob_room_changed(); - pop_bake_forget(); - pop_loose_mob_room_changed(); - room_mod = pop_trob_modif(room); - if (lft) { - uint8_t *m = pop_trob_modif(lft); - for (i = 0; i < 3; i++) { - lcol_bg[i] = m[9 + i * 10]; - seam_sig[i] = seam_row_sig(m, lcol_fg, i); - } - } - if (rgt) { - uint8_t *m = pop_trob_modif(rgt); - rcol_bg[0] = m[0]; rcol_bg[1] = m[10]; rcol_bg[2] = m[20]; - } - seam_redraw = seam_rows = 0; - pg = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(pg); - pop_screen_fill_field(); - pop_room_draw(room, room_fg, room_mod, lcol_fg, lcol_bg); - gfx_set_visible_page(pg); - gfx_set_draw_page((uint8_t)(pg ^ 1)); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); - cur_room = room; kid_room = Kid.room; - /* Обе страницы теперь содержат только свежий фон. Старые габариты - * персонажей относятся к кадру до QuickLoad и не должны запускать heal - * поверх восстановленной комнаты. */ - pop_cd_forget(); - pop_cd_init(); - pop_hp_invalidate(); - /* Полоса состояния тоже переписана заново — «QUICKLOAD» обязан лечь - * поверх свежего фона на ОБЕИХ страницах, иначе он виден через кадр и - * мигает. */ - pop_status_invalidate(); -} - -/* start_level (seg003:0055) + do_startpos (seg003:01A3) + set_start_pos - * (seg003:028A) — поставить Кида в стартовую позицию УРОВНЯ. Один вход и - * для запуска, и для рестарта после смерти / выпадения из уровня: в - * оригинале это буквально один и тот же путь (play_level_2 зовёт - * start_level заново), поэтому и у нас не три копии четырёх строк. - * - * Позиция берётся ИЗ ДАННЫХ уровня (pop_level_start_*), а не из #define: - * start_pos — тайл 0..29 (row*10+col), start_dir — направление, в котором - * персонаж должен ОКАЗАТЬСЯ. - * - * Направление ИНВЕРТИРУЕТСЯ (`Char.direction = ~level.start_dir`): персонаж - * ставится спиной и доворачивается кадрами позы входа. Сама поза — из - * tbl_entry_pose (data.h:848 = {0,1,0,…,2,…}): - * 1 (уровень 1) — падение внутрь (seq_7_fall) + нажатие кнопки room5(0,2); - * это оно захлопывает решётку за спиной в первой комнате; - * 2 (уровень 13) — вбегание (seq_84_run); - * иначе — разворот на месте (seq_5_turn). - * Таблица индексируется НОМЕРОМ УРОВНЯ — pop_level_entry_pose(). */ -#define SEQ_TURN 5 -#define SEQ_FALL 7 -#define SEQ_RUN 84 -#define ENTRY_POSE_FALL 1 /* tbl_entry_pose[1] */ -#define ENTRY_POSE_RUN 2 /* tbl_entry_pose[13] */ -#define TILE_LEVELDOOR_LEFT 16 /* tiles_16_level_door_left */ - - -/* ---- Порядок «Kid vs страж» (BUG-DRAWORDER-1) ----------------------- - * - * В оригинале никто не «поверх» по определению: и Кид, и страж попадают в - * midtable при обработке СВОЕГО тайла (set_objtile_at_char, seg006:13F3), а - * тайлы обходятся в фиксированном порядке — redraw_needed_tiles (seg008:1B06) - * идёт рядами 2,1,0 и внутри ряда колонками 0..9. Кто нарисован ПОЗЖЕ — тот - * поверх. Отсюда «Кид проходит ЗА телом стража»: тело лежит правее и/или - * выше, его тайл в обходе позже. Совпали тайлы — решает sort_curr_objs - * (seg008:203C): у обычных объектов (не тень, не плита) ниже по obj_y = позже. - * - * Мы рисовали страж→Кид всегда, то есть Кид был поверх безусловно. - * - * Ключ обхода: чем больше, тем позже. Ряды идут 2,1,0 → (2 - row). */ -#define OBJ_ORDER_KEY(row, col) ((int)(2 - (row)) * 10 + (int)(col)) - -/* get_tile_div_mod (seg006:750): колонка комнаты по X (БЕЗ поправки −7). */ -static int8_t tile_div_mod(int x) -{ - int v = x - 58; /* pop_x_bump[FIRST_ONSCREEN_COLUMN] */ - int c = v / TILE_SIZEX; - if (v % TILE_SIZEX < 0) --c; - return (int8_t)c; -} - -/* char_x_left из set_char_collision (seg006:0723) — левая граница габарита. - * ВАЖНО: величина НЕ утоньшённая; поправку THIN оригинал применяет только к - * *_coll, а колонки char_col_left/right считает по этой. */ -static int char_x_left_of(uint8_t x, int8_t dir, int8_t dx, - uint8_t flags, uint16_t w) -{ - int e = (int)x + ((dir < 0) ? -dx : dx); /* char_dx_forward */ - uint8_t fl = flags; - if (dir < 0) fl ^= 0x80; - /* odd-pixel + усечение деления к нулю — та же поправка, что в pop_map */ - if (!(fl & 0x80) && e <= 57) e++; - if (dir >= 0) e -= (int)((w + 1) >> 1); /* char_width_half */ - return e; -} - -/* set_objtile_at_char (seg006:13F3) — ТАЙЛ ОБЪЕКТА персонажа. - * - * Ветка actions_1_run_jump обязательна, а не «упрощаемая» (как я решил - * сначала): в беге оригинал берёт НЕ curr_row/curr_col, а нижний ряд и ЛЕВУЮ - * колонку ГАБАРИТА. При беге вправо левая колонка меньше curr_col, поэтому - * бегущий Кид уходит ЗА объекты справа от себя. Без этой ветки часть кадров - * бега рисовала Кида поверх лежащего стража. Считаем одинаково для обоих: - * enter_guard (seg002) тоже ставит стражу action = 1, и односторонний учёт - * дал бы перекос в другую сторону. */ -static void objtile_at_char(int8_t *row, int8_t *col, - const pop_char_t *ch, int8_t dx, int8_t dy, - uint8_t flags, uint16_t w) -{ - int8_t r = ch->curr_row, c = ch->curr_col; - if (ch->action == 1) { /* actions_1_run_jump */ - int8_t br = pop_y_to_row((int16_t)((int)ch->y + dy)); - if (br == -1) br = 3; /* char_bottom_row */ - r = br; - c = tile_div_mod(char_x_left_of(ch->x, ch->direction, dx, flags, w)); - if (c < 0) c = 0; /* MAX(char_col_left, 0) */ - } - if ((ch->frame >= 135 && ch->frame < 149) || - ch->action == 2 || ch->action == 3 || - ch->action == 4 || ch->action == 6) c--; - *row = r; *col = c; -} - -/* ВРЕМЕННО: трасса kidobj — порт отладочного вывода, добавленного - * пользователем в SDLPoP add_kid_to_objtable (seg008:1679): - * - * DBG kidobj tilepos=%d frame=%d act=%d col=%d cols=%d..%d rows=%d..%d - * - * Считаем ровно то же, что set_char_collision (seg006:0723) + - * set_objtile_at_char (seg006:13F3): габарит НЕутоньшённый (THIN правит - * только *_coll, а колонки берутся по «толстой» границе), колонки - * клампятся в 0..9, нижний ряд −1 читается как 3. Звать ПОСЛЕ отрисовки - * Кида: ширину/высоту кадра (fpw/fph) заполняет она. - * - * Вывод забирает брейкпоинт MAME на резидентном pop_dbg_trap — сама - * функция банковая, её адрес в W3 неоднозначен. */ -void pop_dbg_kidobj(void) __banked -{ - int8_t dx = kid_cur_dx(), dy = kid_cur_dy(); - uint8_t fl = kid_cur_flags(); - uint16_t w = pop_cd[POP_CH_KID].fpw; - uint16_t h = pop_cd[POP_CH_KID].fph; - int xl = char_x_left_of(Kid.x, Kid.direction, dx, fl, w); - int xr = xl + (int)((w + 1) >> 1); /* + char_width_half */ - int oy = (int)Kid.y + dy; - int ty = oy - (int)h + 1; - int8_t r, c, tr, br, cl, cr; - objtile_at_char(&r, &c, &Kid, dx, dy, fl, w); - br = pop_y_to_row((int16_t)oy); - if (br == -1) br = 3; - if (ty >= 192) ty = 0; - tr = pop_y_to_row((int16_t)ty); - cl = tile_div_mod(xl); if (cl < 0) cl = 0; - cr = tile_div_mod(xr); if (cr > 9) cr = 9; - pop_dbg_obj[0] = (int8_t)(r * 10 + c); - pop_dbg_obj[1] = (int8_t)Kid.frame; - pop_dbg_obj[2] = (int8_t)Kid.action; - pop_dbg_obj[3] = Kid.curr_col; - pop_dbg_obj[4] = cl; - pop_dbg_obj[5] = cr; - pop_dbg_obj[6] = tr; - pop_dbg_obj[7] = br; - pop_dbg_obj[8] = (int8_t)cur_room; - pop_dbg_trap(); -} - -/* 1 = страж рисуется ПОСЛЕ Кида (поверх). __banked: зовётся раз в кадр, - * то есть один трамплин — а 500 Б кода в резиденте дороже. */ -uint8_t guard_over_kid(void) __banked -{ - int8_t kr, kc, gr, gc; - int kk, gk; - if (Guard.charid == 0 || Guard.room != cur_room) return 0; - objtile_at_char(&kr, &kc, &Kid, kid_cur_dx(), kid_cur_dy(), - kid_cur_flags(), pop_cd[POP_CH_KID].fpw); - objtile_at_char(&gr, &gc, &Guard, pop_gframe.dx, pop_gframe.dy, - pop_gframe.flags, pop_cd[POP_CH_OPP].fpw); - kk = OBJ_ORDER_KEY(kr, kc); - gk = OBJ_ORDER_KEY(gr, gc); - if (gk != kk) return (uint8_t)(gk > kk); - /* один тайл — ниже по obj_y рисуется позже (sort_curr_objs) */ - return (uint8_t)((int)Guard.y + pop_gframe.dy > pop_cd[POP_CH_KID].fpy); -} - - -/* ---- Переворот уже нарисованного (зелье инверсии, уровень 9) --------- * - * - * Порт need_redraw_because_flipped (seg000:15E9 + 939/946). Оригинал - * держит готовый offscreen и переворачивает его на выводе; у нас страниц - * ровно две, рабочей третьей нет, поэтому переворачиваем то, что уже - * нарисовано, — построчной копией акселератора (gfx_copy_page). - * - * Почему это законно и почему heal после не ломается: accel ЧИТАЕТ - * ОЗУ-копию, значит копируется ЧИСТЫЙ ФОН без персонажей, а пишет банком - * 0x50 — и в видео, и в копию приёмника. После двух проходов обе страницы - * дабл-буфера содержат перевёрнутый фон в обеих плоскостях, и heal - * восстанавливает уже его (memory accel_port_y_between_triggers, - * регресс — tests/pageflip). - * - * Порядок: перевернуть в СКРЫТУЮ, показать её, скопировать оттуда во - * вторую (теперь скрытую) — прямой копией. Так игрок видит результат - * сразу, а не после второго прохода. - * - * Переворачиваем ТОЛЬКО игровое поле (POP_PLAYFIELD_H): полоса HP лежит - * ниже него и в оригинале тоже не переворачивается. */ -void pop_flip_screen(void) __banked -{ - gfx_rect_t area; - uint8_t front = gfx_get_visible_page(); - uint8_t back = (uint8_t)(front ^ 1); - uint8_t i; - - area.x = 0; area.y = POP_YOFF; - area.w = 320; area.h = POP_PLAYFIELD_H; - - /* СНАЧАЛА убрать из фона то, что в нём запечено, но фоном не является: - * пламя факелов (pop_torch_wipe объясняет, почему оно вообще там). - * Отражённое вместе с фоном, оно оседало в зеркальных позициях, где его - * никто не перерисовывает — по комнате оставались лишние языки огня - * (нашёл пользователь на глотке зелья). - * - * Чистим ОБЕ страницы: источник отражения — видимая, а вторая получит - * прямую копию уже чистой картинки. Дешевле полной перерисовки комнаты - * на порядок: 0..4 тайла против 6.2 млн тактов (14.5 кадра, замер MAME - * 2026-08-12) — а копия отражения стоит всего 2.1 кадра. */ - /* ВНИМАНИЕ на систему координат: pop_upside к этому моменту УЖЕ - * переключён (главный цикл делает это перед вызовом), а картинка на - * экране нарисована ещё в СТАРОЙ. Чистить её надо по старым - * координатам, иначе чёрный бар ложится в зеркальное место — на экране - * оставался чёрный квадрат, а пламя так и не стиралось. */ - pop_upside = (uint8_t)!pop_upside; /* временно: система ЭКРАНА */ - gfx_set_draw_page(front); - for (i = 0; i < 30; i++) { - uint8_t t = room_fg[i]; - if (t == 19 || t == 30) /* факел / факел с щебнем */ - pop_torch_wipe(i / 10, i % 10); - } - pop_upside = (uint8_t)!pop_upside; /* вернуть новое состояние */ - - gfx_set_draw_page(back); - gfx_copy_page(&area, GFX_COPY_VFLIP); /* источник — видимая страница */ - gfx_set_visible_page(back); - - gfx_set_draw_page(front); - gfx_copy_page(&area, GFX_COPY_DIRECT); /* вторую страницу — прямой копией */ - - /* Всё, что рисуется поверх фона, надо положить заново: прошлые - * прямоугольники персонажей относятся к СТАРОЙ (неперевёрнутой) - * картинке, и heal по ним стёр бы не то место. */ - pop_cd_forget(); - POP_CD_TOUCH_ALL(); /* фон трогали целиком */ - pop_hp_invalidate(); /* полосу HP перерисовать */ -} - -/* ---- Запуск, смена уровня, завершение ------------------------------- * - * Три куска главного цикла, которые отрабатывают раз за игру (или раз на - * уровень). В резиденте от них оставались только вызовы — сам код здесь. - */ - -int pop_boot(void) __banked -{ - /* Настройки: дефолты, затем POP.CFG, если он есть и корректен. */ - pop_settings_defaults(); - pop_cfg_load(); - pop_timer_new_game(); /* default 60:00, Settings may freeze it */ - - /* Экран Sprinter хранит VRAM и палитры между программами. Перейти в - * графику надо ДО долгих чтений, но первой же операцией погасить ОБЕ - * палитры: тогда ни старый экран, ни частично собранный первый уровень - * не могут мелькнуть перед первым title fade-in. */ - /* PIC-палитры графики живут и в text mode. Предзапись чёрного сокращает - * окно между аппаратным SETVMOD и первой строкой нашего кода, в котором - * иначе успевает мелькнуть VRAM предыдущей программы. */ - pop_pal_black(); - initgraph_black(); - /* initgraph_black уже обнулил VRAM до SETVMOD. Повторная заливка после - * него фиксирует и shadow-копии, откуда затем работают heal/page-copy. */ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - gfx_set_draw_page(0); - bar(0, 0, 319, 255); - gfx_set_draw_page(1); - bar(0, 0, 319, 255); - gfx_set_visible_page(0); - pop_pal_black(); - - /* Набор фона — по типу СТАРТОВОГО уровня; atlas_load безопасен и после - * initgraph: при первом вызове он сохраняет страницу DSS W0. Уровень к - * этому моменту ещё не прочитан, поэтому тип берём напрямую от номера. */ - pop_current_level = FIRST_LEVEL; - if (pop_bg_load(pop_level_type()) != 0) { - puts("pop_bg_load failed"); - return -1; - } - /* pop_bg_load установил только свои слоты палитры. До конца загрузки - * всё равно держим экран чёрным. */ - pop_pal_black(); - pop_cd_init(); /* метка «фон трогали» — пустые диапазоны */ - /* pop_cheats/speed применит pop_settings_apply после pop_sfx_init. */ - pop_guard_reset(); - if (pop_kid_data_load("KID\\kid.ani") != 0) { /* кадры+seqtbl в EMM-странице */ - printf("kid.ani load failed\n"); - return -1; - } - pop_guard_load(); /* атласы стража (GUARD\\g0..g4) */ - pop_shadow_load(); /* запечённый набор Тени — один раз на запуск */ - pop_sfx_init(); /* звук: 8 страниц оцифровки (вывод пока молчит) */ - pop_settings_apply(1); /* CFG -> speed/cheats/CBL */ - if (pop_kid_load(28) != 0) { /* ВСЕ страницы: бег+стоп+разворот+присед+прыжок */ - puts("kid atlas load failed"); - return -1; - } - if (pop_level_load_num(FIRST_LEVEL) != 0) { /* сырой уровень в EMM-страницу */ - puts("level load failed"); - return -1; - } - pop_next_level = pop_current_level; /* current_level = next_level (load_lev_spr) */ - pop_kid_hp_newgame(); /* init_game: hitp_beg_lev = start_hitp */ - pop_checkpoint = 0; /* init_game (seg003:37) */ - - /* FONT.ATL нужен palette snapshot/dim; загрузка идёт ещё на чёрной - * палитре и поэтому не открывает игроку старое содержимое VRAM. */ - if (pop_menu_init() != 0) { - puts("menu font atlas load failed"); - return -1; - } - /* kid.pal + динамические slots tileset/Shadow — один логический - * источник. pop_pal_game_load делает снимок ПОСЛЕ всех доплат. */ - pop_pal_game_load(); - /* Сохраняем ИМЕННО игровую палитру: после стартового title/intro она - * понадобится как источник обычного fade-in. Для build-info экран - * остаётся штатный яркий игровой фон. */ - if (!pop_settings.show_build_info) { - pop_pal_apply(POP_PAL_DIM_BLACK); - } - - /* Стартовая комната до title НЕ НУЖНА: LEVEL_LOAD всё равно заново - * выполняет pop_level_switch. Если нарисовать её сейчас в обе страницы, - * она становится сохранённой VRAM и может мелькнуть перед первым title - * при следующем запуске приложения. Единственное исключение — явно - * включённый build-info: его фон по контракту является игровой сценой. */ - if (pop_settings.show_build_info) { - pop_start_level(); - if (pop_current_level == POP_UPSIDE_LEVEL) pop_vflip_load_all(); - gfx_set_draw_page(0); - pop_char_draw(POP_CH_KID); - pop_char_fore(POP_CH_KID); - } - /* Звук включаем ПОСЛЕДНИМ действием инициализации — когда все атласы, - * уровень и палитры уже прочитаны. Раньше нельзя: ESTEX уходит в диск - * надолго, насос не успевает долить блок, и на слух это скрежет - * (pop_sfx.h). Парная к pop_sfx_pause в pop_level_switch. */ - pop_sfx_start(); - return 0; -} - -/* Порт play_level_2 (seg003:0386..0410) + play_level (seg003:81): цикл - * уровня кончается, когда next_level разошёлся с current_level (END_LEVEL - * после seq_70 в двери уровня либо чит Shift+L), и play_level грузит - * следующий. Возврат -1 — фатально (не удалось сменить набор фона). */ -int pop_level_switch(void) __banked -{ - uint8_t old_page; - gfx_rect_t full; - - /* Граница FG0: повреждённый snapshot или старый внешний вызов не должен - * даже пытаться открыть res2015.bin. Финальный маршрут 14 -> ENDING - * добавит автомат приложения (FG11); пока просто оставляем уровень. */ - if (pop_next_level > POP_LEVEL_LAST) { - pop_next_level = pop_current_level; - return 0; - } - - /* Порт play_level_2 (seg003:0386..0410) + play_level (seg003:81): - * цикл уровня кончается, когда next_level разошёлся с - * current_level (END_LEVEL после seq_70 в двери уровня либо чит - * Shift+L), и play_level грузит следующий. - * - * HP переносится: hitp_beg_lev = hitp_max ДО загрузки — так - * поднятая на уровне «жизнь» (большая склянка) переезжает - * дальше, а урон — нет (do_startpos дольёт до потолка). */ - hitp_beg_lev = hitp_max; - pop_checkpoint = 0; /* уровень пройден (seg003:413) */ - pop_sfx_pause(); /* загрузка уровня — ESTEX надолго, звук глушим */ - if (pop_level_load_num(pop_next_level) != 0) { - pop_next_level = pop_current_level; /* файла нет — остаёмся */ - } else { - /* С этого места видим только индекс 0. Это одновременно - * скрывает дисковую подготовку и даёт безопасный экран, - * пока loaders физически меняют отдельные диапазоны palette. */ - pop_pal_black(); - old_page = gfx_get_visible_page(); - gfx_set_bank(GFX_BANK_NORMAL); - /* Обнуляем ОБЕ страницы, а не только software-visible: - * аппаратный SCREEN_SWITCH и сохранённое BGI-состояние не - * должны оставлять старые sprites на соседней странице. */ - gfx_set_draw_page(0); - pop_screen_fill_game(); - gfx_set_draw_page(1); - pop_screen_fill_game(); - pop_wait_edge(); - /* Набор спрайтов соперника у каждого уровня СВОЙ - * (load_lev_spr, seg000:1092): уровень 3 — скелет, у него и - * кадров меньше, чем у стража. Без перезагрузки соперник - * рисуется чужим атласом: часть индексов уходит за его - * пределы, и персонаж просто не виден. */ - pop_guard_free(); - pop_guard_load(); - /* guard loader применяет свои цветовые слоты физически; - * пока остальной уровень читается, экран обязан быть чёрным. */ - pop_pal_black(); - /* Зеркальные копии атласов сделаны из СТАРЫХ страниц — - * после перезагрузки спрайтов они мусор (pop_vflip.h). */ - pop_vflip_reset(); - /* Тайлсет: подземелье <-> дворец (порт tbl_envir_ki, - * seg000:1108). Внутри — no-op, если тип не менялся; - * при смене выгружает старые атласы и правит 32 записи - * палитры. Только на границе уровня, не в кадре. */ - if (pop_bg_load(pop_level_type()) != 0) { - puts("bg set load failed"); - return -1; - } - /* Смена tileset тоже пишет env/wall slots. Не открывать их - * до готовности обеих страниц нового уровня. */ - pop_pal_black(); - /* Всё состояние прошлого уровня сносит сам pop_start_level: - * pop_trob_reset обнуляет room_seen (модификаторы комнат - * перечитаются из НОВОЙ страницы), тайлы/стражи приезжают - * из неё же, loose чистит enter_room. */ - level_prepare = 1; - pop_start_level(); - level_prepare = 0; - /* pop_bg_load мог заменить только env/wall, а до этого - * экран жил после fade на чёрной палитре заставки. Полный - * game source обязателен даже для dungeon->dungeon: иначе - * fade_in восстановит старый (либо уже чёрный) snapshot. - * Яркость caller выберет сам: gameplay может показать кадр - * сразу, lifecycle title/demo — сначала apply(4)+fade_in. */ - /* Уровень с зельем инверсии — заранее поднять зеркальный - * набор персонажей (pop_vflip.h): 34 страницы читаются ~1.5 с, - * и делать это после открытия палитры либо в момент глотка - * нельзя. Звать можно откуда угодно — функция идемпотентна. */ - if (pop_current_level == POP_UPSIDE_LEVEL) pop_vflip_load_all(); - /* Последнее действие подготовки: собрать полный logical - * source новой палитры. Пока он собирается физическими - * записями, видимая old_page заполнена нулём. */ - pop_pal_level_load(1); - /* Атомарный commit на границе растра: впервые показать - * готовую комнату уже с окончательной палитрой уровня. - * Вторую страницу синхронизировать аппаратной копией. */ - pop_wait_edge(); - gfx_set_visible_page(level_prepared_page); - gfx_set_draw_page(old_page); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); - /* Уровень готов и показан — заявить «LEVEL N» (порт - * show_level из draw_level_first, seg003:222). */ - pop_status_level(); - } - /* CBL намеренно НЕ открываем здесь. После загрузки caller ещё - * может делать BIOS fade/palette либо восстанавливать QuickSave; - * открытый буфер за это время успевает повторить старую половину - * и даёт скрежет. Caller запускает звук последним действием. */ - return 0; -} - -/* Общий холодный маршрут title/intro/credits/demo -> настоящая игра. - * Держим его в банке 8: это разовый lifecycle-код, а не часть кадрового - * пути, и перенос возвращает резиденту W1 место под стек/heap. */ -int pop_new_game_load(void) __banked -{ - /* Клавиша, которой пропустили заставку/demo, не должна стать первым - * движением Кида или тут же открыть pause menu на уровне. */ - while (kbd_raw_any_down()) { - kbd_raw_sync(); - gfx_wait_vsync(); - } - - pop_kid_hp_newgame(); - hitp_max = POP_START_HITP; - pop_timer_new_game(); - pop_checkpoint = 0; - pop_next_level = FIRST_LEVEL; - - /* Title мог завершиться на яркой title-палитре. Сначала погасить её, - * затем восстановить полный game snapshot; level_switch собирает обе - * страницы уже невидимо, и первый игровой кадр проявляется. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill_game(); - gfx_set_draw_page(1); - pop_screen_fill_game(); - gfx_set_visible_page(1); - pop_pal_game_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); - if (pop_level_switch() != 0) return -1; - /* Первый уровень появляется сразу, без fade, но только после того как - * обе страницы и его собственная палитра полностью готовы. */ - pop_pal_apply(0); - (void)pop_sfx_start(); - return 0; -} - -void pop_shutdown(void) __banked -{ - gfx_set_idle_hook(0); /* снять хук ДО закрытия raw-канала */ - /* ЗВУК ГАСИМ ПЕРВЫМ, до closegraph и освобождения страниц. Дальше идут - * ESTEX-вызовы (mem_free_block на каждый атлас), а они уходят надолго — - * насос не успевает долить очередной блок, и железо доигрывает по кругу - * несвежую половину буфера. Замер записи MAME: на выходе по ESC ровно - * 11 мс шума на полной громкости, то есть ОДИН пропущенный блок (128 - * сэмплов = 11,7 мс). Та же причина, по которой звук глушится на время - * загрузки уровня (pop_sfx.h). */ - pop_sfx_close(); - pop_ctrl_close(); - closegraph(); - pop_bg_free(); - pop_kid_free(); - pop_shadow_free(); - pop_menu_free(); - pop_guard_free(); - pop_kid_data_free(); - pop_level_free(); -} diff --git a/applications/PoP/roomtest/roomtest_cold.h b/applications/PoP/roomtest/roomtest_cold.h deleted file mode 100644 index d1fe99b..0000000 --- a/applications/PoP/roomtest/roomtest_cold.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * roomtest_cold.h — контракт между главным циклом (резидент W1/W2) и его - * ХОЛОДНОЙ половиной, вынесенной в банк (roomtest_cold.c). - * - * Зачем. В режиме huge под кучу остаётся то, что не занял _CODE+_DATA, и к - * уровню 8 запас упал ниже килобайта. Главный цикл при этом наполовину - * состоит из кода, который отрабатывает РАЗ НА УРОВЕНЬ (старт/рестарт) или - * вообще только по отладочной клавише (обход комнат, лейбл номера) — держать - * его в дефицитном окне незачем. Кадровый путь (tick/draw/флип) остался в - * резиденте целиком: цена выноса — один трамплин на вызов, а он тут ноль раз - * за обычный кадр. - * - * Что ОСТАЛОСЬ в roomtest.c и почему: enter_room_side (её зовут и холодная - * половина, и переходы между комнатами в кадре падения) и рабочие массивы - * комнаты — они же и есть то состояние, ради которого функция вообще - * существует; банковый модуль читает их как обычные глобалы (данные банков - * линкуются в общий _DATA, --bank-data мы не включаем). - */ -#ifndef ROOMTEST_COLD_H -#define ROOMTEST_COLD_H - -#include - -/* ---- то, что холодная половина берёт у главного цикла ---------------- */ - -/* Рабочие массивы комнаты: заполняет вход в комнату (банк), читают и он, и - * главный цикл (шов, straddle, чит-навигация). Данные банковых модулей - * линкуются в общий _DATA, поэтому обе половины видят их как обычные - * глобалы — в банк уехал только КОД. */ -extern uint8_t room_fg[30], room_bg[30]; -extern uint8_t lcol_fg[6], lcol_bg[3], rcol_fg[6], rcol_bg[3], below_fg[11]; -extern uint8_t above_fg[10], above_mod[10]; -extern uint8_t kid_room; /* РЕАЛЬНАЯ комната Kid (straddle) */ -extern uint8_t seam_sig[3]; /* последняя нарисованная openness в шве */ -extern uint8_t seam_rows, seam_redraw; - -/* Сигнатура ряда шва: openness ворот соседа либо «кнопка нажата». Живёт в - * резиденте — её зовёт и кадровый путь главного цикла, и вход в комнату. */ -uint8_t seam_row_sig(const uint8_t *m, const uint8_t *lfg, uint8_t r); -extern uint8_t cur_room; /* её номер (drawn_room) */ -extern uint8_t pop_checkpoint; /* checkpoint (seg000:270) — ставит уход */ - /* влево из комнаты 7 уровня 3 */ - -/* Вход в комнату. side — куда ушёл КИД (0 L, 1 R, 2 U, 3 D); 0xFF = «не - * переход за Кидом» (старт уровня, респавн, чит-навигация): от этого - * зависит, пойдёт ли страж следом. enter_room — обёртка с 0xFF. - * Обе в банке 8: зовутся раз на комнату, а кода там на полтора килобайта. */ -void enter_room_side(uint8_t room, uint8_t side) __banked; -void enter_room(uint8_t room) __banked; -/* Пересобрать только производные кэши и обе страницы после QuickLoad. - * Игровые таймеры, trobs, mobs и персонажей не изменяет. */ -void pop_qsave_restore_room(uint8_t room) __banked; - -/* ---- холодная половина ----------------------------------------------- */ - -/* start_level (seg003:0055) + do_startpos + set_start_pos: поставить Кида в - * стартовую позицию уровня. Один вход и для запуска, и для рестарта после - * смерти / выпадения из уровня — в оригинале это буквально один путь. */ -void pop_start_level(void) __banked; - -/* ОТЛАДОЧНЫЙ обход комнат по номеру ('+' / '−'). dir: 1 — следующая, - * 2 — предыдущая. Ставит Кида на подходящий пол новой комнаты и выводит - * его из боя. Возвращает 1, если комната сменилась (вызывающий обязан - * вернуть себе draw-страницу и обнулить счётчик кадров смерти). */ -uint8_t pop_dbg_roomnav(uint8_t dir) __banked; - -/* Читы по фронту нажатия (K/I/S/Shift+L/U/[/]/F7/F8). В банке: раз в кадр, - * а резидент W1/W2 переполнен — см. шапку функции. */ -void pop_cheat_tick(void) __banked; - -/* Кто рисуется ПОЗЖЕ — Кид или соперник (порядок обхода тайлов оригинала, - * set_objtile_at_char + sort_curr_objs). 1 = соперник поверх. Зовётся раз - * в кадр, поэтому живёт в банке: трамплин на кадр дешевле полукилобайта - * резидента. */ -uint8_t guard_over_kid(void) __banked; - -/* Перевернуть уже нарисованное (зелье инверсии, уровень 9): две копии - * акселератором + инвалидация слотов персонажей и полосы HP. Звать РАЗ на - * переключение, по флагу pop_upside_dirty. */ -void pop_flip_screen(void) __banked; - -/* ---- Запуск / смена уровня / завершение ------------------------------ * - * Три куска главного цикла с частотой «раз за игру» или «раз на уровень». - * В резиденте от них остались только вызовы. */ - -/* Загрузить ресурсы, поднять графику и палитру, поставить Кида на старт и - * нарисовать первый экран. 0 — OK, -1 — фатально (сообщение уже выведено). */ -int pop_boot(void) __banked; - -/* Перейти на pop_next_level: файл уровня, спрайты соперника, тайлсет, - * старт. На время I/O закрывает CBL и оставляет его закрытым: caller обязан - * вызвать pop_sfx_start ПОСЛЕ palette/fade/восстановления snapshot. Если - * файла нет — молча остаться на текущем. -1 — фатально. */ -int pop_level_switch(void) __banked; - -/* Смена уровня целиком (катсцена, гашение, загрузка, палитра, звук). - * back — страница кадра главного цикла. 0 — ок, -1 — сбой. */ -int8_t pop_level_change(uint8_t back) __banked; - -/* Клавиши служебного слоя. Живут здесь, а не в roomtest.c: сам обработчик - * (pop_frame_ui) переехал в банк, а главный цикл о них больше не знает. */ -#define KBD_QUICKSAVE 0x0B /* F6, PS/2 set 2 */ -#define KBD_QUICKLOAD 0x01 /* F9, PS/2 set 2 */ -#define KBD_MENU 0x76 /* Esc — открыть pause menu (edge) */ -#define KBD_QUIT 0x09 /* F10 — отладочный немедленный выход (был на Esc, - * пока меню не готово рисовать — см. план MS4) */ - -/* Меню, F10 и QuickSave/Load на границе кадра. restart_level/dead_reset — - * флаги для главного цикла. 0 — продолжаем, 1 — Restart Game, 2 — Quit, - * -1 — сбой. */ -int8_t pop_frame_ui(uint8_t *restart_level, uint8_t *dead_reset) __banked; - -/* Чистый старт настоящей игры после Enter/Esc на title/intro/credits либо - * клавиши в attract-demo. Ждёт отпускания клавиши, сбрасывает состояние - * новой игры, загружает FIRST_LEVEL и проявляет его первый кадр. */ -int pop_new_game_load(void) __banked; - -/* Снять idle-хук, закрыть ввод и графику, отдать все ресурсы. */ -void pop_shutdown(void) __banked; - -#endif /* ROOMTEST_COLD_H */ diff --git a/applications/PoP/roomtest/shadow_arc.h b/applications/PoP/roomtest/shadow_arc.h deleted file mode 100644 index 09a719a..0000000 --- a/applications/PoP/roomtest/shadow_arc.h +++ /dev/null @@ -1,41 +0,0 @@ -/* shadow_arc.h — индексы в архиве SHADOW. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef SHADOW_ARC_H -#define SHADOW_ARC_H - -#define ARC_SHADOW_COUNT 32 - -#define ARC_SHADOW_SK0 0 -#define ARC_SHADOW_SK1 1 -#define ARC_SHADOW_SK2 2 -#define ARC_SHADOW_SK3 3 -#define ARC_SHADOW_SK4 4 -#define ARC_SHADOW_SK5 5 -#define ARC_SHADOW_SK6 6 -#define ARC_SHADOW_SK7 7 -#define ARC_SHADOW_SK8 8 -#define ARC_SHADOW_SK9 9 -#define ARC_SHADOW_SK10 10 -#define ARC_SHADOW_SK11 11 -#define ARC_SHADOW_SK12 12 -#define ARC_SHADOW_SK13 13 -#define ARC_SHADOW_SK14 14 -#define ARC_SHADOW_SK15 15 -#define ARC_SHADOW_SK16 16 -#define ARC_SHADOW_SK17 17 -#define ARC_SHADOW_SK18 18 -#define ARC_SHADOW_SK19 19 -#define ARC_SHADOW_SK20 20 -#define ARC_SHADOW_SK21 21 -#define ARC_SHADOW_SK22 22 -#define ARC_SHADOW_SK23 23 -#define ARC_SHADOW_SK24 24 -#define ARC_SHADOW_SK25 25 -#define ARC_SHADOW_SK26 26 -#define ARC_SHADOW_SK27 27 -#define ARC_SHADOW_SF0 28 -#define ARC_SHADOW_SF1 29 -#define ARC_SHADOW_SF2 30 -#define ARC_SHADOW_SF3 31 - -#endif diff --git a/applications/PoP/roomtest/skel_arc.h b/applications/PoP/roomtest/skel_arc.h deleted file mode 100644 index eca2b21..0000000 --- a/applications/PoP/roomtest/skel_arc.h +++ /dev/null @@ -1,13 +0,0 @@ -/* skel_arc.h — индексы в архиве SKEL. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef SKEL_ARC_H -#define SKEL_ARC_H - -#define ARC_SKEL_COUNT 4 - -#define ARC_SKEL_G0 0 -#define ARC_SKEL_G1 1 -#define ARC_SKEL_G2 2 -#define ARC_SKEL_G3 3 - -#endif diff --git a/applications/PoP/roomtest/tests-host/.gitignore b/applications/PoP/roomtest/tests-host/.gitignore deleted file mode 100644 index 567609b..0000000 --- a/applications/PoP/roomtest/tests-host/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build/ diff --git a/applications/PoP/roomtest/tests-host/Makefile b/applications/PoP/roomtest/tests-host/Makefile deleted file mode 100644 index 039ee15..0000000 --- a/applications/PoP/roomtest/tests-host/Makefile +++ /dev/null @@ -1,122 +0,0 @@ -# Модульные тесты движка roomtest под ucsim_z80. Обвязка общая (testkit/), -# здесь — только сами наборы и список модулей, которые в них линкуются. -POP_ROOT := $(abspath $(CURDIR)/../..) --include $(POP_ROOT)/local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(POP_ROOT)/../../bin/sprinter-cc),$(abspath $(POP_ROOT)/../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT — путь к установленному Sprinter-CC) -endif -TESTKIT := $(SPRINTER_ROOT)/testkit -ENGINE_DIR := $(abspath $(CURDIR)/..) - -# t_phys гоняет НАСТОЯЩУЮ физику, а она ходит по таблицам анимации -# абсолютными адресами от KD_DATA_OFF (0x100) — там, куда на устройстве -# мапится страница W0. Значит блоб kid_data.bin лежит по 0x100, и код -# набора обязан начинаться выше его конца. С добавлением таблицы кадров -# КАТСЦЕН блоб вырос до 4150 Б (0x100 + 4150 = 0x1136), и прежние 0x1000 -# уже резали его хвост — набор падал как «main() не позвал ни одной -# проверки». Держим запас: следующая таблица снова сдвинет границу. -CODE_LOC := 0x1400 -# Данные — выше 0x8000: набор t_phys линкует уже полдвижка (геометрия, Kid, -# карта/физика, управление, страж) и его код перевалил за 0x8000. Раньше -# это проявлялось как «тест зациклился»: хвост кода ложился поверх _DATA. -# 0x9000 оставляет ~24 КБ под код и ~28 КБ до стека (0xFEF0). -DATA_LOC := 0xA000 - -# Заголовки libc/libbgi нужны потому, что pop_kid.c включает gfx/sprite/ -# sprinter: под тестом эти функции заглушены (stubs.c), но объявления -# берутся настоящие — иначе разъедутся сигнатуры. -PROJ_ROOT := $(abspath $(TESTKIT)/..) -EXTRA_INC := -I$(PROJ_ROOT)/libc/include -I$(PROJ_ROOT)/libbgi/include -I$(CURDIR) \ - -I$(ENGINE_DIR)/../poc/res/bg # pop_bg_atlas.h (генерит pop_pack_bg.py) - -OBJS_geom := build/eng_pop_geom.rel - -# pop_guard.c линкуется НАСТОЯЩИЙ, а не заглушкой: после перевода физики на -# Char урон идёт через pop_take_hp, и кому именно он достанется (hitp_* или -# guardhp_*) решает charid — то есть ровно та логика, которую тесты обязаны -# проверять, а не имитировать. -# eng_pop_kboot — загрузчик таблиц анимации: с 2026-08-12 он живёт отдельным -# модулем (в продукте — банк 8), а сцене он нужен: sc_init зовёт -# pop_kid_data_load, и стабы open/read отдают ему настоящий блоб. -OBJS_phys := build/eng_pop_geom.rel build/eng_pop_kid.rel \ - build/eng_pop_kboot.rel \ - build/eng_pop_map.rel build/eng_pop_ctrl.rel \ - build/eng_pop_state.rel build/eng_pop_guard.rel \ - build/eng_pop_guard_cold.rel \ - build/stubs.rel build/scene.rel build/kid_blob.rel \ - build/bank_stub.rel - -# Пробный набор (разведка, без эталонов) линкуется тем же составом. -OBJS_grab := $(OBJS_phys) -# t_wall — удар о стену в воздухе (BUG-JUMPWALL-1), состав тот же. -OBJS_wall := $(OBJS_phys) -# t_gate — открытая решётка не должна считаться стеной у осторожного шага -# (нужны pop_map + физика, то есть тот же состав). -OBJS_gate := $(OBJS_phys) -# t_char — физика над Char для РАЗНЫХ персонажей (Кид / страж / тень). -OBJS_char := $(OBJS_phys) -# t_mouse — спецсобытие уровня 8 (мышь). ЕДИНСТВЕННЫЙ набор, куда линкуется -# guards.c: здесь проверяется сам ИИ (autocontrol_mouse) вместе с рождением -# (pop_check_mouse) и общей физикой соперника — то есть ровно то, что в -# остальных наборах заменено ручным прогоном play_guard_frame. -OBJS_mouse := $(OBJS_phys) build/eng_guards.rel -# t_shadow — спецсобытия уровня 12 (встреча с тенью, общий урон, слияние). -# guards.c нужен по той же причине, что и мыши: check_shadow/ -# check_killed_shadow/sword_disappears живут в нём. -OBJS_shadow := $(OBJS_phys) build/eng_guards.rel -# t_jaffar — спецсобытия уровня 13 (встреча, победа, выход, падающая гряда). -OBJS_jaffar := $(OBJS_phys) build/eng_guards.rel -# t_cfg — весь codec POP.CFG из единственного прикладного модуля. -OBJS_cfg := build/eng_pop_config.rel build/bank_stub.rel -# pop_app — чистая таблица переходов, без DSS/графики. -OBJS_app := build/eng_pop_app.rel build/bank_stub.rel -# pop_demo — запись управления; t_demo подменяет выход control и raw input. -OBJS_demo := build/eng_pop_demo.rel build/bank_stub.rel -# pop_timer — чистое ядро логического времени; поток QuickSave заглушен -# memory-stream'ом в t_timer.c. -OBJS_timer := build/eng_pop_timer.rel build/bank_stub.rel -# pop_cutscene — общий интерпретатор статических сценариев. Он не знает -# графики, поэтому проверяется отдельно от PV/title-ресурсов. -OBJS_cutscene := build/eng_pop_cutscene.rel build/bank_stub.rel -# pop_flow — чистая таблица маршрута перед загрузкой следующего уровня. -OBJS_flow := build/eng_pop_flow.rel build/bank_stub.rel - -include $(TESTKIT)/host-tests.mk - -# У host-теста нет DSS/EMM: ему нужен тот же codec/state, но не target-I/O. -build/eng_pop_config.rel: $(ENGINE_DIR)/pop_config.c | $(BUILD) - @$(SDCC) $(CFLAGS) -DPOP_CONFIG_HOST_TEST -c -o $@ $< - -build/eng_pop_timer.rel: $(ENGINE_DIR)/pop_timer.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_demo.rel: $(ENGINE_DIR)/pop_demo.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_cutscene.rel: $(ENGINE_DIR)/pop_cutscene.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_flow.rel: $(ENGINE_DIR)/pop_flow.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -# --- t_phys: блоб таблиц анимации ------------------------------------ -KID_BIN := $(abspath $(CURDIR)/../../poc/res/kid/kid_data.bin) - -build/kid_blob.c: gen_kid_blob.py $(KID_BIN) | $(BUILD) - @python3 gen_kid_blob.py $(KID_BIN) $@ - -build/kid_blob.rel: build/kid_blob.c kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/stubs.rel: stubs.c stubs.h kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/scene.rel: scene.c scene.h stubs.h kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/bank_stub.rel: bank_stub.s | $(BUILD) - @$(SDASZ80) -plosgff $@ $< - -# Эталоны трасс: пересобрать набор, если их правили (см. шапку t_phys.c). -build/phys.rel: $(wildcard golden/*.h) diff --git a/applications/PoP/roomtest/tests-host/README.md b/applications/PoP/roomtest/tests-host/README.md deleted file mode 100644 index 838f8ba..0000000 --- a/applications/PoP/roomtest/tests-host/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# tests-host — модульные тесты движка roomtest - -Прогоняются под `ucsim_z80`, обвязка общая — `testkit/` (там же объяснение, -почему под z80, а не хостовым gcc, и грабли). - -``` -make host-tests # из корня, вместе с остальными -make -C applications/PoP/roomtest/tests-host # только эти -make -C applications/PoP/roomtest/tests-host t_geom -``` - -## Что покрыто - -| набор | модуль | что проверяет | -|-------|--------|---------------| -| `t_geom` | `pop_geom.c` | геометрия комнаты (`x_bump`, `y_land`, `y_to_row`) и PRNG оригинала | -| `t_phys` | `pop_map.c` + `pop_kid.c` + `pop_ctrl.c` | покадровые трассы физики Кида: стойка, бег, шаг с Shift, разворот, присед, прыжок вверх, падение с кромки, loose-плита, разбег-прыжок через провал | -| `t_char` | те же + `pop_guard.c` | физика над `Char` для РАЗНЫХ персонажей: кому достаётся урон (`take_hp` по charid), ветки `land()` (Кид −1 HP с двух рядов, страж гибнет, тень цела), падение и гард по X у слота Guard, `check_guard_fallout`, «окна Char не путают персонажей» | - -Главный тест в `t_geom` — `geom_lcg_matches_reference`. LCG оригинала -(`s = s*214013 + 2531011`) написан в `pop_geom.c` на ассемблере по схеме -Горнера ради обхода `__mullong`, и заявка «бит-в-бит как в SDLPoP» до -появления теста держалась только на комментарии. Тест сверяет рукописный -asm с наивной 32-битной формулой на 128 шагах — и по возвращаемому -значению, и по обеим половинам сида. - -## t_phys: характеризация, а не проверка правильности - -Набор существует ради **страховки под рефакторинг**. Эталоны сняты с -текущего билда, то есть консервируют и текущие баги — правильность -по-прежнему проверяется сверкой с `SDLPoP/src/`. Ценность в другом: -ближайший крупный шаг (перенос физики с `Kid.` на `Char.`, чтобы её мог -переиспользовать страж) обязан быть **поведение-сохраняющим**, и «трасса до -== трасса после» ловит ровно тот класс ошибок, который там возможен. - -Поэтому эталон **переснимается только осознанно**, и в коммите должно быть -написано, что и почему поменялось. Молча обновлённый эталон обесценивает -весь набор. - -Своё дело набор сделал: перенос физики на `Char` (GUARD-PHYS, 2026-08-07) -прошёл при **неизменных трассах** — 1723 проверки без единого расхождения. - -## Грабли раскладки: `DATA_LOC` - -Набор линкует уже полдвижка, и его код перевалил за `--data-loc 0x8000`. -Линкер `sdld` это НЕ ошибка: хвост кода (`_HOME`, деления из libsdcc) он -молча кладёт ПОВЕРХ `_DATA`, после чего тест ведёт себя как «зациклился» -— хотя логика ни при чём. Час на поиск стоило именно это. - -Поэтому: `DATA_LOC` в Makefile набора (сейчас `0x9000`), а `host-tests.mk` -перед каждым прогоном проверяет `CODE_LOC + l__CODE <= DATA_LOC` и падает -с внятным сообщением. Упёрлись снова — поднять `DATA_LOC` (стек в -`crt0_ucsim` начинается с 0xFEF0). - -``` -python3 record_golden.py # переснять все трассы -python3 record_golden.py 7 9 # только сценарии 7 и 9 -``` - -Трасса — по одной записи на кадр: `frame, x, y, dir, col, row, action` и -смещение `curr_seq` от `SEQTBL_BASE`. Кадр гоняется ровно в том порядке, -что и в главном цикле `roomtest.c`: - -``` -pop_ctrl_tick(); // ввод -> control(): смена последовательности -kid_tick(); // play_seq: следующий кадр -pop_phys_tick(); // падение/приземление/стена -pop_loose_tick(); // досчёт тряски и снятие провалившейся плиты -``` - -Покадровость здесь принципиальна: порт seg005/seg006 — конечный автомат, и -ошибка почти всегда проявляется не в одной функции, а в расхождении -траектории через несколько кадров. Плюс главный риск переноса на `Char` — -не арифметика, а то, **кто владеет окном `Char` внутри кадра**; поймать это -можно только прогоном полного кадра. - -Проверка, что харнесс воспроизводит устройство: сценарий `stand` даёт -`frame=15, x=114, y=118, curr_seq=0x19A3` — те же значения, что читаются из -`_Kid` в живом MAME. - -### Как это заработало под ucsim - -Три шва, каждый закрыт без правок продуктового кода: - -1. **Таблицы анимации.** `pop_kid.c` ходит по ним абсолютными адресами от - `KD_DATA_OFF` (0x100) — там, куда на устройстве их приводит маппинг W0. - В тесте `kid_data.bin` просто кладётся по 0x100 (`gen_kid_blob.py`), а - `gfx_w0_map` заглушен. Следствие: код набора линкуется с - `--code-loc 0x1000` (`CODE_LOC` в Makefile), чтобы не налезть на блоб. -2. **Окружение.** `stubs.c` — libc/libbgi (графика, память, файлы), соседние - модули (`pop_bg`/`pop_trob`/`pop_level`/`pop_redraw`) и состояние стража. - Заглушки не пустые там, где это меняет смысл: файловое чтение реально - отдаёт `kid_data.bin` (иначе `pop_kid_data_load` тихо сдаётся, `kdat_ok` - остаётся нулём и `play_seq` не делает ничего — трасса выходит из одного - застывшего кадра), клавиатура отвечает по набору «нажатых» скан-кодов - (так под тест попадают `read_input` и `read_user_control`, а не только - диспетчер), а обращения к соседям **журналируются** (`tk_log`) — можно - проверять «плита отвалилась и попросила перерисовку», а не только - координаты. -3. **`__banked`.** Модули физики помечены как банковые, SDCC генерирует на - них трамплин `___sdcc_bcall_ehl`, которому нужны `set_bank`/`get_bank`. - В тесте память плоская — `bank_stub.s` отдаёт нулевой банк и пустое - переключение, соблюдая контракт по регистрам. - -Что харнесс НЕ покрывает и остаётся за MAME: отрисовка и окклюзия, реальные -переключения банков, тайминги кадра, настоящая клавиатура. - -## Что нужно, чтобы двинуться дальше - -- **Доступ к странице уровня.** `pop_level.c` ходит по абсолютным адресам - (`(uint8_t *)(LVL_DATA_OFF + …)` после `gfx_w0_map`). Для `pop_map` это не - потребовалось — карту комнаты в него ИНЪЕКТИРУЮТ через `pop_map_set`, — - но набор на сам `pop_level`/`pop_trob` в это упрётся. Решение то же, что - для `kid_data`: положить страницу по нужному адресу и поднять `CODE_LOC`. -- **Сценарии из `BUGS_CLOSED.md`.** У каждой закрытой записи есть симптом и - ожидаемое поведение — готовый список регрессионных кейсов, который стоит - переносить в `t_phys` по мере надобности. -- **BUG-LOOSE-2** (гонка «уйти из комнаты раньше, чем долетит плита») — - через мост MAME воспроизвести не удалось, а на уровне логики это - несколько строк: заспавнить кусок, сменить комнату, тикать до - приземления, проверить щебень. diff --git a/applications/PoP/roomtest/tests-host/bank_stub.s b/applications/PoP/roomtest/tests-host/bank_stub.s deleted file mode 100644 index 5e7921a..0000000 --- a/applications/PoP/roomtest/tests-host/bank_stub.s +++ /dev/null @@ -1,25 +0,0 @@ -;-------------------------------------------------------------------------- -; bank_stub.s — set_bank/get_bank для прогона под ucsim. -; -; Модули движка помечены __banked (в продукте они лежат в страницах W3), и -; SDCC генерирует на такие вызовы трамплин ___sdcc_bcall_ehl из своей -; библиотеки. Трамплин обязан найти две пользовательские подпрограммы: -; -; get_bank — вернуть в A номер текущего банка, прочие регистры не трогать -; set_bank — переключить банк на A, прочие регистры не трогать -; -; В тесте банков нет: вся память плоская, все модули слинкованы вместе. -; Поэтому «банк» всегда нулевой, а переключение — пустое. Важно только -; соблюсти контракт по регистрам, иначе трамплин испортит аргументы вызова. -;-------------------------------------------------------------------------- - .area _CODE - - .globl set_bank - .globl get_bank - -get_bank:: - ld a, #0x00 - ret - -set_bank:: - ret diff --git a/applications/PoP/roomtest/tests-host/gen_kid_blob.py b/applications/PoP/roomtest/tests-host/gen_kid_blob.py deleted file mode 100644 index 1974d6b..0000000 --- a/applications/PoP/roomtest/tests-host/gen_kid_blob.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 -""" -gen_kid_blob.py — kid_data.bin как C-массив для тестов под ucsim. - -Зачем. Таблицы кадров и seqtbl живут в EMM-странице, замапленной в W0, и -pop_kid ходит по ним АБСОЛЮТНЫМИ адресами от KD_DATA_OFF (0x100). В ucsim -никакого W0 нет, зато есть ровная 64-КБ память, поэтому тест просто кладёт -файл по 0x100 и глушит gfx_w0_map. Единственное следствие для сборки — -код набора линкуется с --code-loc выше конца блоба (см. Makefile). - -Файл берётся ровно тот, что уходит на устройство, — pop_extract_kid_data.py -делает его из оригинального PRINCE.EXE, так что тест проверяет порт против -НАСТОЯЩИХ данных игры, а не против переписанной от руки таблицы. -""" -import sys -from pathlib import Path - -src, dst = Path(sys.argv[1]), Path(sys.argv[2]) -data = src.read_bytes() - -out = [ - "/* Сгенерировано gen_kid_blob.py — не править руками. */", - '#include "kidblob.h"', - "", - f"const unsigned char kid_blob[{len(data)}] = {{", -] -for i in range(0, len(data), 16): - out.append(" " + ",".join(str(b) for b in data[i:i + 16]) + ",") -out += [ - "};", - "", - f"const unsigned int kid_blob_size = {len(data)};", - "", - "/* Разложить блоб по KD_DATA_OFF. Без memcpy: тестовый бинарь не", - " * линкуется с libc, а тянуть ради этого z80-рантайм незачем. */", - "void kid_blob_install(void)", - "{", - " unsigned char *d = (unsigned char *)KID_BLOB_ADDR;", - " const unsigned char *s = kid_blob;", - f" unsigned int n = {len(data)};", - " while (n--) *d++ = *s++;", - "}", - "", -] -dst.write_text("\n".join(out)) -print(f"gen_kid_blob: {src.name} -> {dst.name} ({len(data)} Б)") diff --git a/applications/PoP/roomtest/tests-host/golden/crouch.h b/applications/PoP/roomtest/tests-host/golden/crouch.h deleted file mode 100644 index 62fdebf..0000000 --- a/applications/PoP/roomtest/tests-host/golden/crouch.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: crouch. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x6B, 0x81, 0x76, 0x00, 0x04, 0x01, 0x01, 0x3E, 0x06, - 0x6C, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x41, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6E, 0x84, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4A, 0x06, - 0x6F, 0x84, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4B, 0x06, - 0x70, 0x86, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4E, 0x06, - 0x71, 0x86, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4F, 0x06, - 0x72, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x52, 0x06, - 0x73, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x53, 0x06, - 0x74, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x54, 0x06, - 0x75, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x57, 0x06, - 0x76, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x58, 0x06, - 0x77, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x59, 0x06, - 0x0F, 0x83, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x83, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/PoP/roomtest/tests-host/golden/fall_ledge.h b/applications/PoP/roomtest/tests-host/golden/fall_ledge.h deleted file mode 100644 index 450567d..0000000 --- a/applications/PoP/roomtest/tests-host/golden/fall_ledge.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: fall_ledge. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x66, 0x9E, 0x79, 0x00, 0x06, 0x02, 0x03, 0x77, 0x02, - 0x67, 0xA0, 0x7F, 0x00, 0x06, 0x02, 0x03, 0x7C, 0x02, - 0x68, 0x9F, 0x88, 0x00, 0x06, 0x02, 0x03, 0x81, 0x02, - 0x69, 0x9F, 0x94, 0x00, 0x06, 0x02, 0x03, 0x84, 0x02, - 0x6A, 0x9E, 0xA6, 0x00, 0x06, 0x02, 0x04, 0xDE, 0x03, - 0x6B, 0xA0, 0xB5, 0x00, 0x06, 0x02, 0x05, 0xC3, 0x06, - 0x6C, 0xA2, 0xB5, 0x00, 0x06, 0x02, 0x05, 0xC6, 0x06, - 0x6D, 0xA2, 0xB5, 0x00, 0x06, 0x02, 0x01, 0xC9, 0x06, - 0x6E, 0xA3, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4A, 0x06, - 0x6F, 0xA3, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4B, 0x06, - 0x70, 0xA5, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4E, 0x06, diff --git a/applications/PoP/roomtest/tests-host/golden/jump_up.h b/applications/PoP/roomtest/tests-host/golden/jump_up.h deleted file mode 100644 index 98ddae4..0000000 --- a/applications/PoP/roomtest/tests-host/golden/jump_up.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: jump_up. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x43, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x12, 0x04, - 0x44, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x13, 0x04, - 0x45, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x14, 0x04, - 0x46, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x15, 0x04, - 0x47, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x16, 0x04, - 0x48, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x17, 0x04, - 0x49, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x18, 0x04, - 0x4A, 0x80, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x19, 0x04, - 0x4B, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1A, 0x04, - 0x4C, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1B, 0x04, - 0x4D, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1C, 0x04, - 0x4E, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1D, 0x04, - 0x4F, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1E, 0x04, - 0x4F, 0x80, 0x72, 0xFF, 0x04, 0x01, 0x01, 0x21, 0x04, - 0x4F, 0x80, 0x70, 0xFF, 0x04, 0x01, 0x01, 0x24, 0x04, - 0x4F, 0x80, 0x70, 0xFF, 0x04, 0x01, 0x01, 0x25, 0x04, - 0x4F, 0x80, 0x72, 0xFF, 0x04, 0x01, 0x01, 0x28, 0x04, - 0x51, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0xB8, 0x03, - 0x52, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0xB9, 0x03, - 0x53, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x05, 0xBC, 0x03, diff --git a/applications/PoP/roomtest/tests-host/golden/loose.h b/applications/PoP/roomtest/tests-host/golden/loose.h deleted file mode 100644 index d1df6d1..0000000 --- a/applications/PoP/roomtest/tests-host/golden/loose.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: loose. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x9D, 0x76, 0x00, 0x06, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x9E, 0x76, 0x00, 0x06, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xA0, 0x76, 0x00, 0x06, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0xA4, 0x76, 0x00, 0x06, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0xA9, 0x76, 0x00, 0x07, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0xAB, 0x76, 0x00, 0x07, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0xAE, 0x76, 0x00, 0x07, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0xB2, 0x76, 0x00, 0x07, 0x01, 0x01, 0x14, 0x00, - 0x08, 0xB7, 0x76, 0x00, 0x08, 0x01, 0x01, 0x17, 0x00, - 0x09, 0xB8, 0x76, 0x00, 0x08, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xBA, 0x76, 0x00, 0x08, 0x01, 0x01, 0x1F, 0x00, diff --git a/applications/PoP/roomtest/tests-host/golden/rjump_gap3.h b/applications/PoP/roomtest/tests-host/golden/rjump_gap3.h deleted file mode 100644 index d2c141c..0000000 --- a/applications/PoP/roomtest/tests-host/golden/rjump_gap3.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: rjump_gap3. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x08, 0x00, - 0x02, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x09, 0x00, - 0x03, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0xB0, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0xAD, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x11, 0x00, - 0x07, 0xAA, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x14, 0x00, - 0x08, 0xA5, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x17, 0x00, - 0x09, 0xA4, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xA2, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x9E, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x99, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x97, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x2A, 0x00, - 0x22, 0x95, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x64, 0x01, - 0x23, 0x90, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x67, 0x01, - 0x24, 0x8A, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x6A, 0x01, - 0x25, 0x87, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x6D, 0x01, - 0x26, 0x82, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x72, 0x01, - 0x27, 0x7B, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x75, 0x01, - 0x28, 0x6F, 0x73, 0xFF, 0x04, 0x01, 0x01, 0x7A, 0x01, - 0x29, 0x67, 0x6A, 0xFF, 0x03, 0x01, 0x01, 0x7F, 0x01, - 0x2A, 0x5F, 0x68, 0xFF, 0x02, 0x01, 0x01, 0x84, 0x01, - 0x2B, 0x5B, 0x73, 0xFF, 0x01, 0x01, 0x01, 0x89, 0x01, - 0x2C, 0x57, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x8E, 0x01, - 0x07, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x32, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x93, 0x04, - 0x33, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x94, 0x04, - 0x34, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x95, 0x04, - 0x0F, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x00, 0x35, 0x00, - 0x10, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x28, 0x01, - 0x11, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x29, 0x01, - 0x12, 0x50, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x2C, 0x01, - 0x13, 0x4E, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x2F, 0x01, - 0x32, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x93, 0x04, diff --git a/applications/PoP/roomtest/tests-host/golden/run_right.h b/applications/PoP/roomtest/tests-host/golden/run_right.h deleted file mode 100644 index 96c4fd6..0000000 --- a/applications/PoP/roomtest/tests-host/golden/run_right.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Эталон трассы: run_right. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x9D, 0x76, 0x00, 0x06, 0x01, 0x01, 0x17, 0x00, diff --git a/applications/PoP/roomtest/tests-host/golden/stand.h b/applications/PoP/roomtest/tests-host/golden/stand.h deleted file mode 100644 index 8610c7c..0000000 --- a/applications/PoP/roomtest/tests-host/golden/stand.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Эталон трассы: stand. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/PoP/roomtest/tests-host/golden/step_shift.h b/applications/PoP/roomtest/tests-host/golden/step_shift.h deleted file mode 100644 index c6c0891..0000000 --- a/applications/PoP/roomtest/tests-host/golden/step_shift.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: step_shift. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x79, 0x72, 0x76, 0x00, 0x03, 0x01, 0x01, 0x6F, 0x05, - 0x7A, 0x73, 0x76, 0x00, 0x03, 0x01, 0x01, 0x72, 0x05, - 0x7B, 0x74, 0x76, 0x00, 0x03, 0x01, 0x01, 0x75, 0x05, - 0x7C, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x78, 0x05, - 0x7D, 0x7B, 0x76, 0x00, 0x03, 0x01, 0x01, 0x7B, 0x05, - 0x7E, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x7E, 0x05, - 0x7F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x81, 0x05, - 0x80, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x82, 0x05, - 0x81, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x83, 0x05, - 0x82, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x84, 0x05, - 0x83, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x85, 0x05, - 0x84, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x86, 0x05, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/PoP/roomtest/tests-host/golden/turn.h b/applications/PoP/roomtest/tests-host/golden/turn.h deleted file mode 100644 index 66f5dbd..0000000 --- a/applications/PoP/roomtest/tests-host/golden/turn.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Эталон трассы: turn. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x2D, 0x7A, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD1, 0x01, - 0x2E, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD4, 0x01, - 0x2F, 0x77, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD7, 0x01, - 0x30, 0x78, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xDA, 0x01, - 0x01, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x71, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x6E, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x6B, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x66, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x65, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x63, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x5F, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x5A, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x25, 0x00, diff --git a/applications/PoP/roomtest/tests-host/kidblob.h b/applications/PoP/roomtest/tests-host/kidblob.h deleted file mode 100644 index 11f58aa..0000000 --- a/applications/PoP/roomtest/tests-host/kidblob.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * kidblob.h — таблицы анимации Кида в памяти теста. - * - * KID_BLOB_ADDR обязан совпадать с KD_DATA_OFF из pop_kid.c: продукт - * адресует таблицы именно так, и в этом весь смысл — под тестом работает - * тот же код доступа, что на устройстве, просто без маппинга W0. - */ -#ifndef POP_TESTS_KIDBLOB_H -#define POP_TESTS_KIDBLOB_H - -#define KID_BLOB_ADDR 0x0100 - -extern const unsigned char kid_blob[]; -extern const unsigned int kid_blob_size; - -void kid_blob_install(void); - -#endif diff --git a/applications/PoP/roomtest/tests-host/record_golden.py b/applications/PoP/roomtest/tests-host/record_golden.py deleted file mode 100644 index b21db80..0000000 --- a/applications/PoP/roomtest/tests-host/record_golden.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -""" -record_golden.py — снять эталонные трассы для t_phys. - -Зачем скрипт, а не один прогон. Отчёт tcheck ограничен 768 байтами лога, а -трасс на все сценарии сильно больше. Поэтому набор умеет снимать РОВНО -ОДИН сценарий за прогон (-DSC_RECORD=), а перебор делает этот скрипт: -собирает набор N раз, каждый раз забирает из отчёта имя сценария и его -трассу и пишет golden/<имя>.h. - -Эталон фиксирует ТЕКУЩЕЕ поведение. Это осознанно: набор страхует -поведение-сохраняющие правки (перенос физики Kid -> Char), а не доказывает -правильность. Правильность — сверка с SDLPoP. Поэтому переснимать эталоны -можно только вместе с внятным объяснением, что и почему поменялось. - -Использование: - python3 record_golden.py # снять все сценарии - python3 record_golden.py 7 9 # только эти номера -""" -import re -import subprocess -import sys -from pathlib import Path - -HERE = Path(__file__).resolve().parent -GOLDEN = HERE / "golden" -# Число сценариев = число TC_RUN в t_phys.c: список ведётся там, здесь его -# дублировать незачем. -NSCEN = len(re.findall(r"^\s*TC_RUN\(", (HERE / "t_phys.c").read_text(), re.M)) - - -def record(n: int) -> str: - # make не видит смены -DSC_RECORD (в зависимостях только файлы), поэтому - # объектник набора сносим руками — иначе следующий прогон молча снимет - # трассу предыдущего сценария под новым именем. - for f in ("phys.rel", "phys.ihx"): - (HERE / "build" / f).unlink(missing_ok=True) - subprocess.run(["make", "-s", "build/phys.ihx", f"EXTRA_CFLAGS=-DSC_RECORD={n}"], - cwd=HERE, check=True) - p = subprocess.run(["make", "-s", "run-phys", f"EXTRA_CFLAGS=-DSC_RECORD={n}"], - cwd=HERE, capture_output=True, text=True) - out = p.stdout - m = re.search(r"^\s*### (\S+)\s*$", out, re.M) - if not m: - raise SystemExit(f"сценарий {n}: в отчёте нет строки '### имя'\n{out}") - name = m.group(1) - rows = re.findall(r"^\s*([0-9A-F]{18})\s*$", out, re.M) - if not rows: - raise SystemExit(f"сценарий {n} ({name}): трасса пустая\n{out}") - - lines = [f"/* Эталон трассы: {name}. Снят record_golden.py — не править руками.", - " * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */"] - for r in rows: - lines.append(" " + ", ".join(f"0x{r[i:i+2]}" for i in range(0, 18, 2)) + ",") - GOLDEN.mkdir(exist_ok=True) - (GOLDEN / f"{name}.h").write_text("\n".join(lines) + "\n") - return f"{name}: {len(rows)} кадров" - - -def main() -> int: - nums = [int(a) for a in sys.argv[1:]] or list(range(1, NSCEN + 1)) - for n in nums: - print(f"[{n}/{NSCEN}] " + record(n)) - # Итоговая пересборка в обычном режиме, чтобы каталог не остался с - # объектниками, собранными под SC_RECORD. - subprocess.run(["make", "-s", "clean"], cwd=HERE, check=True) - print("эталоны сняты; проверить: make -C", HERE.name, "t_phys") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/applications/PoP/roomtest/tests-host/scene.c b/applications/PoP/roomtest/tests-host/scene.c deleted file mode 100644 index f1aaeab..0000000 --- a/applications/PoP/roomtest/tests-host/scene.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * scene.c — реализация покадрового раннера (см. scene.h). - */ -#include -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_ctrl.h" -#include "pop_geom.h" -#include "pop_guard.h" -#include "kid_data.h" -#include "scene.h" -#include "stubs.h" -#include "kidblob.h" - -sc_rec sc_trace[SC_TRACE_MAX]; -uint8_t sc_len; - -static uint8_t sc_fg[30]; -/* Соседей у сцены нет (links = 0) — по краям комнаты стена: карта сама - * решает так, когда соседняя комната не задана. */ - -void sc_init(void) -{ - kid_blob_install(); /* таблицы туда, куда смотрит pop_kid */ - pop_kid_data_load("KID\\KID.ANI"); - pop_kid_hp_newgame(); -} - -void sc_room(const uint8_t *fg, uint8_t room) -{ - uint8_t i; - for (i = 0; i < 30; i++) { sc_fg[i] = fg[i]; tk_modif[i] = 0; } - pop_map_set(sc_fg); - pop_map_set_room(room); - /* Изолированная сцена: соседей нет. Тип TILE_WALL (20) с обеих сторон - * и сверху/снизу — тогда решения физики зависят только от sc_fg, и - * трасса не поедет, если когда-нибудь поменяется загрузка кромок. */ - pop_map_set_edges(0, 0, 0, 0); - tk_start_room = room; - tk_log_clear(); -} - -void sc_kid_at(uint8_t col, uint8_t row, int8_t dir) -{ - kid_init(2 /* seq_2_stand */, (int8_t)col, (int8_t)row, dir); - /* kid_init комнату не трогает (в продукте её ставит enter_room_side), а - * сцена обязана быть согласованной: логика, спрашивающая «персонаж в - * ОТРИСОВАННОЙ комнате?» (pop_gate_over_char), иначе всегда отвечает - * «нет». Тест, которому нужна другая комната, задаёт её сам. */ - Kid.room = tk_start_room; - pop_kid_hp_reset(); -} - -void sc_kid_at_x(uint8_t col, uint8_t row, uint8_t x, int8_t dir) -{ - kid_init(2 /* seq_2_stand */, (int8_t)col, (int8_t)row, dir); - Kid.room = tk_start_room; - Kid.x = x; /* тайл задаёт ряд, X — фазу внутри тайла */ - /* Колонку пересчитываем В ОКНЕ Char: determine_col — часть физики, а та - * работает с активным персонажем (порт load_fram_det_col). */ - pop_loadkid(); - pop_determine_col(); - pop_savekid(); - pop_kid_hp_reset(); -} - -/* ---- слот Guard ------------------------------------------------------ */ - -void sc_guard_at(uint8_t charid, uint8_t col, uint8_t row, int8_t dir, uint8_t hp) -{ - /* Поля — как в enter_guard (seg002:0112): X из колонки, Y с пола ряда. */ - Guard.charid = charid; - Guard.curr_col = (int8_t)col; - Guard.curr_row = (int8_t)row; - Guard.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Guard.y = (uint8_t)pop_y_land[row + 1]; - Guard.direction = dir; - Guard.alive = -1; - Guard.action = 1; /* actions_1_run_jump */ - Guard.sword = 2; /* у живого стража меч в руке */ - Guard.fall_x = Guard.fall_y = 0; - Guard.repeat = 0; - Guard.room = 1; - guardhp_max = guardhp_curr = hp; - guardhp_delta = 0; - /* Стойка с мечом (seq_77 у неактивного стража — но нам нужна поза, из - * которой персонаж просто стоит и может упасть). */ - pop_loadshad(); - pop_char_set_seq(77 /* seq_77_guard_stand_inactive */); - play_seq(); - pop_saveshad(); -} - -void sc_guard_run(uint8_t n) -{ - uint8_t i; - for (i = 0; i < n; i++) { - /* play_guard_frame (seg000:1246) без ИИ: окно, кадр, seq, физика. */ - pop_loadshad_and_opp(); - pop_load_fram_det_col(); - play_seq(); - pop_saveshad_and_opp(); - pop_guard_phys_tick(); - } -} - -void sc_trace_clear(void) { sc_len = 0; } - -static void sc_record(void) -{ - sc_rec *r; - if (sc_len >= SC_TRACE_MAX) return; - r = &sc_trace[sc_len++]; - r->frame = Kid.frame; - r->x = Kid.x; - r->y = Kid.y; - r->dir = Kid.direction; - r->col = Kid.curr_col; - r->row = Kid.curr_row; - r->action = Kid.action; - r->seq = (uint16_t)(Kid.curr_seq - SEQTBL_BASE); -} - -uint8_t sc_run(uint8_t keys, uint8_t n) -{ - uint8_t i, done = 0; - for (i = 0; i < n; i++) { - tk_keys_clear(); - if (keys & SC_L) tk_key_down(KBD_LEFT); - if (keys & SC_R) tk_key_down(KBD_RIGHT); - if (keys & SC_U) tk_key_down(KBD_UP); - if (keys & SC_D) tk_key_down(KBD_DOWN); - if (keys & SC_SHIFT) tk_key_down(KBD_LSHIFT); - - /* Порядок ровно как в главном цикле roomtest.c (kid_heal и - * отрисовка выпадают — они ничего не решают). pop_loose_tick - * оставлен: он не рисование, а МЕХАНИКА — досчитывает тряску и - * убирает провалившуюся плиту из карты, то есть меняет то, по чему - * физика в следующем кадре принимает решения. */ - pop_ctrl_tick(); - kid_tick(); - pop_phys_tick(); - pop_loose_tick(); - - sc_record(); - done++; - if (sc_len >= SC_TRACE_MAX) break; - } - return done; -} - -/* ---- сверка с эталоном ---------------------------------------------- */ - -void sc_expect(const uint8_t *golden, uint8_t nrec) -{ - uint8_t i; - const uint8_t *g = golden; - tc_check((int16_t)sc_len, (int16_t)nrec, "sc_len", __LINE__); - for (i = 0; i < nrec && i < sc_len; i++, g += SC_REC_BYTES) { - const sc_rec *r = &sc_trace[i]; - /* Номер кадра идёт первым полем каждой проверки: в отчёте видно, - * на каком именно кадре трасса разошлась. */ - tc_check((int16_t)r->frame, (int16_t)g[0], "frame", i); - tc_check((int16_t)r->x, (int16_t)g[1], "x", i); - tc_check((int16_t)r->y, (int16_t)g[2], "y", i); - tc_check((int16_t)r->dir, (int16_t)(int8_t)g[3], "dir", i); - tc_check((int16_t)r->col, (int16_t)(int8_t)g[4], "col", i); - tc_check((int16_t)r->row, (int16_t)(int8_t)g[5], "row", i); - tc_check((int16_t)r->action, (int16_t)g[6], "action", i); - tc_check((int16_t)r->seq, - (int16_t)((uint16_t)g[7] | ((uint16_t)g[8] << 8)), "seq", i); - } -} - -/* ---- снятие эталона -------------------------------------------------- */ - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} - -static void put_byte(uint8_t v) -{ - static const char hex[] = "0123456789ABCDEF"; - put(hex[v >> 4]); put(hex[v & 15]); -} - -void sc_dump(const char *name) -{ - uint8_t i; - tc_result.magic = TC_MAGIC; - tc_result.total = 1; - tc_result.failed = 1; /* иначе раннер лог не напечатает */ - put('#'); put('#'); put('#'); put(' '); - while (*name) put(*name++); - put('\n'); - for (i = 0; i < sc_len; i++) { - const sc_rec *r = &sc_trace[i]; - put_byte(r->frame); - put_byte(r->x); - put_byte(r->y); - put_byte((uint8_t)r->dir); - put_byte((uint8_t)r->col); - put_byte((uint8_t)r->row); - put_byte(r->action); - put_byte((uint8_t)r->seq); - put_byte((uint8_t)(r->seq >> 8)); - put('\n'); - } -} diff --git a/applications/PoP/roomtest/tests-host/scene.h b/applications/PoP/roomtest/tests-host/scene.h deleted file mode 100644 index ba2dafd..0000000 --- a/applications/PoP/roomtest/tests-host/scene.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * scene.h — покадровый сценарный раннер для тестов физики Кида. - * - * Почему покадровый, а не «вызвать функцию и сверить возврат». Порт - * seg005/seg006 — это конечный автомат: диспетчер выбирает - * последовательность, интерпретатор проигрывает её кадр за кадром, физика - * между кадрами двигает персонажа и решает, не пора ли падать. Ошибка - * почти всегда проявляется не в одной функции, а в РАСХОЖДЕНИИ ТРАЕКТОРИИ - * через несколько кадров. Плюс главный риск ближайшего рефакторинга - * (Kid -> Char) — не арифметика, а то, КТО владеет окном Char внутри кадра; - * поймать это можно только прогоном полного кадра, как в главном цикле: - * - * pop_ctrl_tick(); // ввод -> control(): смена последовательности - * kid_tick(); // play_seq: следующий кадр - * pop_phys_tick(); // падение/приземление/стена - * - * Отсюда формат: сцена (комната + стартовая поза) + скрипт ввода, на - * выходе — трасса состояния Кида по кадрам. Сравнение трассы с эталоном - * и есть тест. - */ -#ifndef POP_TESTS_SCENE_H -#define POP_TESTS_SCENE_H - -#include - -/* Одна запись трассы: то, чем оперируют решения движка. curr_seq — - * СМЕЩЕНИЕ от SEQTBL_BASE (адрес зависит от базы, смещение — нет). */ -typedef struct { - uint8_t frame; - uint8_t x, y; - int8_t dir; - int8_t col, row; - uint8_t action; - uint16_t seq; -} sc_rec; - -#define SC_TRACE_MAX 48 -extern sc_rec sc_trace[SC_TRACE_MAX]; -extern uint8_t sc_len; - -/* Кнопки скрипта ввода — битовая маска на кадр. */ -#define SC_L 0x01 -#define SC_R 0x02 -#define SC_U 0x04 -#define SC_D 0x08 -#define SC_SHIFT 0x10 - -/* Инициализация окружения набора: таблицы анимации, обнуление состояния. - * Звать один раз в начале прогона. */ -void sc_init(void); - -/* Задать комнату: fg[30] — коды тайлов по рядам (row*10+col), room — - * номер (нужен trob'ам). Модификаторы обнуляются; ставить их тест может - * сам через tk_modif. Соседи комнаты — стены (изолированная сцена). */ -void sc_room(const uint8_t *fg, uint8_t room); - -/* Поставить Кида: колонка/ряд задают позицию по центру тайла, как это - * делает do_startpos (seg003) — так сцена описывается в терминах карты, а - * не в пикселях. */ -void sc_kid_at(uint8_t col, uint8_t row, int8_t dir); - -/* То же, но с точным X: тайл задаёт ряд и пол под ногами, X — фазу внутри - * тайла (нужно, когда исход зависит от того, где именно Кид стоит). */ -void sc_kid_at_x(uint8_t col, uint8_t row, uint8_t x, int8_t dir); - -/* ---- Персонажи слота Guard (страж/скелет/тень/визирь) ---------------- * - * Физика у них ОБЩАЯ с Кидом (одни функции над Char, разные окна), поэтому - * тестировать её надо на обоих слотах. Поднимаем персонажа руками, как - * enter_guard (seg002:0112): данных уровня под тестом нет. - * charid — CHARID_2_GUARD / CHARID_1_SHADOW / CHARID_4_SKELETON; - * hp — сколько HP выдать (guardhp_max = guardhp_curr = hp). */ -void sc_guard_at(uint8_t charid, uint8_t col, uint8_t row, int8_t dir, uint8_t hp); - -/* Прогнать n кадров ПЕРСОНАЖА СЛОТА GUARD — порт play_guard_frame без ИИ: - * окно loadshad → load_fram_det_col → play_seq → saveshad, затем - * pop_guard_phys_tick(). ИИ (guards.c, банк 1) в набор не линкуется: он - * решает «куда идти», а тут проверяется «что с ним делает физика». */ -void sc_guard_run(uint8_t n); - -/* Прогнать n кадров с ЗАЖАТОЙ маской keys, записывая трассу. - * Возвращает число записанных кадров (обрезается по SC_TRACE_MAX). */ -uint8_t sc_run(uint8_t keys, uint8_t n); - -/* Сбросить трассу (перед новым сценарием). */ -void sc_trace_clear(void); - -/* Сверить трассу с эталоном: golden — плоский массив по 8 байт на кадр - * (frame,x,y,dir,col,row,action,seq_lo,seq_hi — 9), nrec записей. - * Расхождения уходят в отчёт tcheck с номером кадра и поля. */ -void sc_expect(const uint8_t *golden, uint8_t nrec); - -#define SC_REC_BYTES 9 - -/* Снятие эталона. Лог tcheck всего 768 байт — на все сценарии сразу трасс - * не хватит, поэтому за прогон снимается РОВНО ОДИН сценарий (его номер - * задаёт -DSC_RECORD=), а перебором занимается record_golden.py. - * Формат: строка «### имя», дальше по строке на кадр, по два хекс-символа - * на байт. Раннер печатает лог только при провале — sc_dump ставит - * failed=1 намеренно. */ -void sc_dump(const char *name); - -#endif diff --git a/applications/PoP/roomtest/tests-host/stubs.c b/applications/PoP/roomtest/tests-host/stubs.c deleted file mode 100644 index 338cabb..0000000 --- a/applications/PoP/roomtest/tests-host/stubs.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - * stubs.c — окружение движка для прогона под ucsim_z80. - * - * Под тестом крутится НАСТОЯЩАЯ физика (pop_map) с настоящим - * интерпретатором последовательностей (pop_kid): это единственный способ - * проверить порт seg005/seg006, потому что вся его суть — в точных - * величинах кадров и seqtbl. А вот всё, что вокруг, в ucsim не существует: - * видеопамять, EMM-страницы, файлы, клавиатура. Здесь они заглушены. - * - * Три категории: - * 1. libc/libbgi (графика, память, файлы, клавиатура) — пустышки. Код - * отрисовки из pop_kid.c линкуется, но не вызывается. - * 2. Соседние модули движка (pop_bg/pop_trob/pop_level/pop_redraw) — - * минимальные модели: room_modif живёт здесь массивом, пометки - * перерисовки и падающие куски ЖУРНАЛИРУЮТСЯ (тест может проверить, - * что физика их дёрнула), уровень отдаёт стартовую комнату. - * 3. Состояние стража — просто данные: страж в тестах физики не тикает, - * но pop_map/pop_ctrl на его поля смотрят. - * - * Клавиатура сделана НЕ пустышкой: `tk_keys` — набор «нажатых» скан-кодов, - * и `kbd_raw_down` отвечает по нему. Так под тест попадают и read_input, и - * read_user_control, то есть весь путь ввода, а не только диспетчер. - */ -#include -#include -#include -#include -#include -#include -#include "../pop_qsave.h" - -/* Сериализаторы приватного состояния входят в те же крупные модули, что и - * физика/ИИ. Сами QuickSave-тесты работают на target с EMM; обычным - * ucsim-сценам нужны только символы, и вызывать их они не должны. */ -void pop_qs_bytes(pop_qs_io_t *io, void *p, uint16_t n) -{ (void)io; (void)p; (void)n; } -void pop_qs_u8(pop_qs_io_t *io, uint8_t *p) { (void)io; (void)p; } -void pop_qs_i8(pop_qs_io_t *io, int8_t *p) { (void)io; (void)p; } -void pop_qs_u16(pop_qs_io_t *io, uint16_t *p) { (void)io; (void)p; } -void pop_qs_i16(pop_qs_io_t *io, int *p) { (void)io; (void)p; } - -#include "pop_kid.h" -#include "pop_guard.h" -#include "pop_bg.h" -#include "pop_map.h" -#include "pop_trob.h" -#include "pop_level.h" -#include "pop_redraw.h" -#include "pop_pace.h" -#include "pop_sfx.h" -#include "_pop_draw.h" -#include "pop_cdraw.h" -#include "stubs.h" -#include "kidblob.h" - -/* ---- 1. libc / libbgi ---------------------------------------------- */ - -uint8_t _gfx_visible_page, _gfx_draw_page, _gfx_bank; -/* ISR-стаб W0-страницы: продукт берёт его АДРЕС и вписывает в страницу. - * Здесь достаточно, чтобы символ существовал. */ -void _gfx_w0_isr(void) { } - -void gfx_w0_map(uint8_t page) { (void)page; } -void gfx_w0_unmap(void) { } -void gfx_w0_page_prepare(uint8_t page) { (void)page; } - -void gfx_blit_cols(int x, int y, const void *img, uint8_t flip) -{ (void)x; (void)y; (void)img; (void)flip; } -void gfx_blit_cols_part(int x, int y, const void *img, uint8_t flip, - int skip, int rows) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; } -void gfx_blit_cols_part_w(int x, int y, const void *img, uint8_t flip, - int skip, int rows, uint8_t maxw) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; (void)maxw; } -void gfx_blit_cols_part_noclip(int x, int y, const void *img, uint8_t flip, - uint8_t skip, uint8_t rows) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; } - -int atlas_load(atlas_t *a, const char *path) { (void)a; (void)path; return -1; } -void atlas_free(atlas_t *a) { (void)a; } -const void *atlas_image(const atlas_t *a, uint8_t idx) -{ (void)a; (void)idx; return 0; } - -/* EMM: страниц нет, но блок обязан выделиться — иначе pop_kid_data_load - * сдастся на первом же шаге и молча оставит kdat_ok = 0, а play_seq тогда - * просто ничего не делает (и трасса выходит из одного застывшего кадра). */ -uint8_t mem_alloc_pages_bios(uint8_t n) { (void)n; return 1; } -void mem_free_block_bios(uint8_t blk) { (void)blk; } -uint8_t mem_get_page_bios(uint8_t blk, uint8_t idx) { (void)blk; (void)idx; return 1; } - -/* Файловая система: единственный «файл» — таблицы анимации. Сделано не - * пустышкой, а рабочим чтением, чтобы pop_kid_data_load отработал целиком - * (включая правку ISR-стаба страницы) и сам взвёл свой kdat_ok — тест не - * лезет во внутренние статики продукта. Данные, по которым потом ходят - * аксессоры, кладёт kid_blob_install по KID_BLOB_ADDR: на устройстве туда - * же их приводит маппинг W0. */ -int open(const char *p, int f) { (void)p; (void)f; return 3; } - -int read(int fd, void *b, int n) -{ - unsigned char *d = (unsigned char *)b; - const unsigned char *s = kid_blob; - unsigned int i, cnt = kid_blob_size; - if (fd != 3) return -1; - if ((unsigned int)n < cnt) cnt = (unsigned int)n; - for (i = 0; i < cnt; i++) d[i] = s[i]; - return (int)cnt; -} - -int close(int fd) { (void)fd; return 0; } - -int bank_load_file(uint8_t page, uint16_t off, const char *path, uint16_t max) -{ - (void)page; (void)off; (void)path; - return kid_blob_size <= max ? (int)kid_blob_size : (int)max; -} - -/* ---- клавиатура: управляемая тестом --------------------------------- */ - -uint16_t tk_keys[TK_KEYS_MAX]; - -int kbd_raw_open(void) { return 0; } -void kbd_raw_close(void) { } -void kbd_raw_sync(void) { } - -uint8_t kbd_raw_down(uint16_t code) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) - if (tk_keys[i] == code) return 1; - return 0; -} - -uint8_t kbd_raw_any_down(void) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) if (tk_keys[i]) return 1; - return 0; -} - -void tk_keys_clear(void) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) tk_keys[i] = 0; -} - -void tk_key_down(uint16_t code) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) - if (tk_keys[i] == 0) { tk_keys[i] = code; return; } -} - -/* Темп кадра и звук относятся к окружению реальной машины. Физика и - * управление только оставляют выборки луча и заявки эффектов; host-тесты - * проверяют их игровую логику, поэтому здесь достаточно no-op контрактов. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e) { } -void pop_sfx_play(uint8_t id) { (void)id; } -/* Курсор насоса: в тестах звука нет вовсе, значит «ничего не звучит» — и - * автомат вступительной темы первого уровня сразу отпускает управление. */ -volatile uint16_t pop_mus_left; -void pop_sfx_stop(void) { } - -/* ---- 2. соседние модули движка -------------------------------------- */ - -/* room_modif текущей комнаты: пики (счётчик фазы), ворота (высота), - * зелья (тип). Физика читает и пишет его напрямую через pop_trob_modif. */ -uint8_t tk_modif[30]; -uint8_t tk_start_room; - -uint8_t *pop_trob_modif(uint8_t room) __banked { (void)room; return tk_modif; } -uint8_t pop_level_start_room(void) __banked { return tk_start_room; } - -/* Журнал: что физика попросила у соседей. Тест сверяет ФАКТ и параметры - * (какой тайл помечен, где заспавнен кусок) — заглушка-пустышка этого не - * дала бы, а именно такие баги (BUG-GATE-ANIM-1) мы и ловим. */ -tk_log_t tk_log; - -static void log_put(uint8_t kind, uint8_t a, uint8_t b, uint8_t c) -{ - if (tk_log.n >= TK_LOG_MAX) { tk_log.overflow = 1; return; } - tk_log.e[tk_log.n].kind = kind; - tk_log.e[tk_log.n].a = a; - tk_log.e[tk_log.n].b = b; - tk_log.e[tk_log.n].c = c; - tk_log.n++; -} - -void tk_log_clear(void) { tk_log.n = 0; tk_log.overflow = 0; } - -uint8_t tk_log_count(uint8_t kind) -{ - uint8_t i, c = 0; - for (i = 0; i < tk_log.n; i++) if (tk_log.e[i].kind == kind) c++; - return c; -} - -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked -{ log_put(TK_TROB, room, tilepos, (uint8_t)type); } - -/* Чомперы будит смена ряда (SEQ_UP/SEQ_DOWN, падение, приземление) — в - * хост-тестах физики их состояние не проверяется, достаточно не падать. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked -{ (void)room; (void)row; } - -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked -{ (void)modifier; (void)snd; log_put(TK_BUTTON, room, tilepos, button_type); } - -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked -{ log_put(TK_REDRAW, tilepos, kind, pages); } - -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked -{ log_put(TK_REDRAW_ABOVE, col, kind, pages); } - -void pop_loose_mob_spawn(int row, int col) __banked -{ log_put(TK_MOB_SPAWN, (uint8_t)row, (uint8_t)col, 0); } - -void pop_loose_mob_tick(void) __banked { } -void pop_loose_mob_room_changed(void) __banked { } - -uint8_t pop_loose_mob_pos(int *col, int *y) __banked -{ (void)col; (void)y; return 0; } - -/* Отрисовочные хвосты, которые физика дёргает напрямую. */ -void pop_fore_set_clip(int x, int y, int w, int h) -{ (void)x; (void)y; (void)w; (void)h; } -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked -{ (void)x; (void)w; (void)sy_top; (void)h; } -void pop_heal_fast(int x, int y, int w, int h) -{ (void)x; (void)y; (void)w; (void)h; } - -/* ---- 3. страж ------------------------------------------------------- * - * Само состояние (Guard, guardhp_*, can_guard_see_kid, is_guard_notice…) и - * pop_take_hp даёт НАСТОЯЩИЙ pop_guard.c — он линкуется в набор. Здесь - * только то, что он тянет из уровня: данных уровня под тестом нет, страж - * поднимается вручную (tk_guard_spawn в scene.c). */ - -uint8_t pop_current_level; /* pop_level.c под тест не линкуется; sc_init ставит 1 */ - -/* Цвет стража — подмена палитры, живёт в pop_cdraw (отрисовка, в набор не - * линкуется). Здесь важен только факт вызова из pop_guard_enter. */ -void pop_guard_set_palette(uint8_t color) __banked { (void)color; } - -/* Габарит последнего нарисованного кадра по слотам (pop_cdraw.c): физика - * читает из него char_width_half. Под тестом никто не рисует, поэтому все - * поля остаются нулями — ровно как было до DRAW-CHAR, когда kid_fp_width() - * возвращал 0. Тест, которому ширина важна, выставляет её сам. */ -pop_cdraw_t pop_cd[POP_CH_N]; - -/* Связи комнат: нужны check_guard_fallout (возрождение скелета в комнате - * снизу). Тест задаёт их через tk_link_down. */ -uint8_t tk_link_down; -uint8_t pop_room_link(uint8_t room, uint8_t side) -{ (void)room; return side == 3 ? tk_link_down : 0; } - -int8_t pop_level_guard_type(uint8_t level) __banked { (void)level; return 0; } -uint8_t pop_level_guard_hp(uint8_t level) __banked { (void)level; return 3; } - -/* Тайлы «уровня» для соседних комнат: pop_map_set_edges забирает fg соседей - * слева/справа сам (кэш на входе в комнату), значит тесту нужен источник. - * Заполняет сам тест — по умолчанию комнат нет и всё стена. */ -uint8_t tk_room_fg[TK_ROOMS + 1][30]; /* индекс = НОМЕР комнаты (1..TK_ROOMS) */ -void pop_level_access_begin(void) { } -void pop_level_access_end(void) { } -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos) -{ - if (room == 0 || room > TK_ROOMS || tilepos >= 30) return 20; /* стена */ - return tk_room_fg[room][tilepos]; -} - -/* pop_level_tile (то же самое, но с маппингом окна W0 внутри) — её зовёт - * спецсобытие подъёма скелета из guards.c; тому единственному набору, где - * guards.c линкуется (t_mouse), достаточно чтения из tk_room_fg. */ -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos) -{ - return pop_level_tile_raw(room, tilepos); -} - -/* Запись в «данные уровня» — у теста это тот же tk_room_fg. Нужна с тех - * пор, как do_pickup правит страницу уровня сразу (BUG-POTION-STRIPE). */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile) -{ - if (room == 0 || room > TK_ROOMS || tilepos >= 30) return; - tk_room_fg[room][tilepos] = tile; -} - -/* Живое состояние стражей по комнатам — как gstate в pop_level.c, только на - * 8 комнат и без данных уровня: тесту нужно ровно то, на что смотрит - * follow_guard (есть ли в целевой комнате свой страж и не труп ли он). - * tk_guard_room != 0 — комната, в которой «по данным уровня» страж есть. */ -uint8_t tk_guard_room; -uint8_t tk_gs_tile[TK_ROOMS]; /* 30 = стража нет (как в pop_level) */ -uint16_t tk_gs_seq[TK_ROOMS]; /* != 0 — запомнен ТРУП */ - -void tk_guard_state_clear(void) -{ - uint8_t i; - for (i = 0; i < TK_ROOMS; i++) { tk_gs_tile[i] = 30; tk_gs_seq[i] = 0; } - tk_guard_room = 0; -} - -/* ВНИМАНИЕ на форму возврата: результат собирается в res и отдаётся ОДНИМ - * выходом. С `return 1;` прямо в ветке SDCC 4.5 не кладёт единицу в A — - * функция возвращает мусор (docs/bugs/sdcc-z80-ret-const-lost). Без - * __banked баг маскировался: в A случайно оставался ненулевой байт от - * `*tile = 11`, и проверка «истина» проходила. */ -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked -{ - uint8_t res = 0; - if (room < 1 || room > TK_ROOMS) return 0; - if (tk_gs_tile[room - 1] < 30) { /* запомненный (в т.ч. труп) */ - *tile = tk_gs_tile[room - 1]; *dir = 0; *color = 0; *skill = 1; - res = 1; - } else if (room == tk_guard_room) { /* страж из данных уровня */ - *tile = 11; *dir = 0; *color = 0; *skill = 1; - res = 1; - } - return res; -} -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead) -{ - (void)dir; (void)x; (void)skill; - if (room < 1 || room > TK_ROOMS) return; - tk_gs_tile[room - 1] = tile; - tk_gs_seq[room - 1] = dead ? seq : 0; - if (tile >= 30) tk_guard_room = (tk_guard_room == room) ? 0 : tk_guard_room; -} -uint16_t pop_guard_state_seq(uint8_t room) -{ return (room >= 1 && room <= TK_ROOMS) ? tk_gs_seq[room - 1] : 0; } -uint8_t pop_guard_state_x(uint8_t room) { (void)room; return 0; } - -/* Таблицы деления на ширину тайла — настоящие (резидент pop_tile.c в тест - * не линкуется). Не заглушка: физика считает по ним колонку, подменять - * нельзя. Значения сгенерированы той же формулой, что в pop_tile.c. */ -const int8_t POP_TILE_DIV[256] = { - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, -}; -const uint8_t POP_TILE_MOD[256] = { - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, -}; - -/* Тайлсет (0 подземелье, 1 дворец) — в приложении его ставит pop_bg_load; - * тесты гоняют физику подземелья, поэтому 0. Не заглушка-функция, а та же - * переменная, что и в резиденте: карта читает её напрямую. */ -uint8_t pop_palace; - -/* Отражение в зеркале (уровень 4) — чистая графика, в тестах физики её нет. - * pop_map зовёт pop_mirror_draw из pop_check_mirror, поэтому символ нужен. */ -void pop_mirror_draw(int clip_top) __banked { (void)clip_top; } -void pop_mirror_heal(void) __banked { } - -/* ---- Зеркальный набор персонажей (зелье инверсии) -------------------- * - * В host-тестах графики нет: pop_kboot линкуется ради pop_kid_data_load, а - * его хвост (загрузка *_v.atl) заглушен — проверять там нечего, атласов в - * тесте не существует вовсе. */ -uint8_t pop_vflip_ready(void) { return 1; } /* «уже загружено» — грузить не станет */ -int pop_vflip_add(const void *orig, const char *path) -{ (void)orig; (void)path; return 0; } -int pop_vflip_take(const void *orig, const void *mirror) -{ (void)orig; (void)mirror; return 0; } - -/* Архив ресурсов: на устройстве из него читаются атласы Кида, в тестах - * графики нет вовсе — pop_kboot линкуется только ради pop_kid_data_load, - * а тот по-прежнему ходит в файл (заглушка open/read выше). */ -signed char pop_arc_open(void *a, const char *path, unsigned char *tbl, - unsigned char max) __banked -{ (void)a; (void)path; (void)tbl; (void)max; return -1; } -signed char pop_arc_open_id(void *a, unsigned char id, unsigned char *tbl, - unsigned char max) __banked -{ (void)a; (void)id; (void)tbl; (void)max; return -1; } -signed char pop_arc_atlas(void *a, const unsigned char *tbl, - unsigned char idx, void *at) __banked -{ (void)a; (void)tbl; (void)idx; (void)at; return -1; } -void pop_arc_close(void *a) __banked { (void)a; } -uint8_t pop_vflip_page(uint8_t src) { return src; } -void pop_vflip_reset(void) { } -int pop_sword_take(const atlas_t *a) __banked { (void)a; return 0; } -int pop_sword_vflip_take(const atlas_t *m) __banked { (void)m; return 0; } -int pop_guard_vflip_load(void) __banked { return 0; } diff --git a/applications/PoP/roomtest/tests-host/stubs.h b/applications/PoP/roomtest/tests-host/stubs.h deleted file mode 100644 index ed71b8e..0000000 --- a/applications/PoP/roomtest/tests-host/stubs.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * stubs.h — интерфейс тестового окружения (см. stubs.c). - * - * Что тест может задавать: «нажатые» клавиши (tk_key_down) и модификаторы - * тайлов комнаты (tk_modif). Что может проверять: журнал обращений - * физики к соседним модулям (tk_log). - */ -#ifndef POP_TESTS_STUBS_H -#define POP_TESTS_STUBS_H - -#include - -/* ---- клавиатура ------------------------------------------------------ */ -#define TK_KEYS_MAX 6 -extern uint16_t tk_keys[TK_KEYS_MAX]; -void tk_keys_clear(void); -void tk_key_down(uint16_t code); - -/* ---- комната --------------------------------------------------------- */ -extern uint8_t tk_modif[30]; /* room_modif текущей комнаты */ -extern uint8_t tk_start_room; /* что вернёт pop_level_start_room */ - -/* ---- журнал обращений ------------------------------------------------ */ -#define TK_LOG_MAX 24 - -enum { - TK_TROB = 1, /* a=room b=tilepos c=type */ - TK_BUTTON, /* a=room b=tilepos c=type */ - TK_REDRAW, /* a=tilepos b=kind c=pages */ - TK_REDRAW_ABOVE, /* a=col b=kind c=pages */ - TK_MOB_SPAWN /* a=row b=col */ -}; - -typedef struct { uint8_t kind, a, b, c; } tk_log_e; -typedef struct { uint8_t n, overflow; tk_log_e e[TK_LOG_MAX]; } tk_log_t; - -extern tk_log_t tk_log; -void tk_log_clear(void); - -/* Сколько записей данного вида в журнале (0 = не было). */ -uint8_t tk_log_count(uint8_t kind); - - -/* Состояние стражей по комнатам для follow_guard (см. stubs.c). */ -/* Комнат в таблице «уровня». 24 = столько же, сколько в настоящем уровне - * PoP: спецсобытия поздних уровней адресуют комнаты по их РЕАЛЬНЫМ номерам - * (меч тени лежит в 15-й, уход за ним — из 18-й), и обрезать их до восьми - * значило бы тестировать не тот адрес. Цена — 720 байт тестового ОЗУ. */ -#define TK_ROOMS 24 -extern uint8_t tk_guard_room; /* комната, где страж есть «по данным уровня» */ -extern uint8_t tk_gs_tile[TK_ROOMS]; -extern uint16_t tk_gs_seq[TK_ROOMS]; -void tk_guard_state_clear(void); - -/* Связь «вниз» для check_guard_fallout (скелет возрождается в комнате 3). */ -extern uint8_t tk_link_down; - -/* fg комнат «уровня» — источник для кэша соседей в pop_map_set_edges. */ -extern uint8_t tk_room_fg[TK_ROOMS + 1][30]; /* индекс = номер комнаты */ - -#endif diff --git a/applications/PoP/roomtest/tests-host/t_app.c b/applications/PoP/roomtest/tests-host/t_app.c deleted file mode 100644 index 997ac99..0000000 --- a/applications/PoP/roomtest/tests-host/t_app.c +++ /dev/null @@ -1,135 +0,0 @@ -/* pop_app — протокол верхнего автомата: допустимые и запрещённые переходы. */ -#include "tcheck.h" -#include "pop_app.h" - -TC_TEST(boot_to_title) -{ - pop_app_reset(); - TC_EQ(pop_app_state, POP_APP_BOOT); - TC_TRUE(pop_app_dispatch(POP_APP_EV_BOOT_READY)); - TC_EQ(pop_app_state, POP_APP_BUILD_INFO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_BUILD_DONE)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(level_load_roundtrip) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_PAUSE)); - TC_EQ(pop_app_state, POP_APP_PAUSE_MENU); - TC_TRUE(pop_app_dispatch(POP_APP_EV_RESUME)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_FINISHED)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); -} - -TC_TEST(rejects_wrong_event) -{ - pop_app_reset(); - TC_FALSE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_BOOT); - TC_TRUE(pop_app_dispatch(POP_APP_EV_QUIT)); - TC_EQ(pop_app_state, POP_APP_QUIT); - TC_FALSE(pop_app_dispatch(POP_APP_EV_BOOT_READY)); -} - -TC_TEST(future_routes_are_declared) -{ - pop_app_reset(); - pop_app_state = POP_APP_TITLE; - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_TIME_EXPIRED)); - TC_EQ(pop_app_state, POP_APP_TIME_EXPIRED); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(prelevel_cutscene_route) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_STARTED)); - TC_EQ(pop_app_state, POP_APP_CUTSCENE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(demo_routes) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_INTRO_STARTED)); - TC_EQ(pop_app_state, POP_APP_INTRO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_DEMO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_DEMO_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_DEMO_STARTED)); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(intro_skip_starts_new_game) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - pop_app_dispatch(POP_APP_EV_INTRO_STARTED); - TC_EQ(pop_app_state, POP_APP_INTRO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(restart_game_returns_to_intro) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_PAUSE)); - TC_EQ(pop_app_state, POP_APP_PAUSE_MENU); - TC_TRUE(pop_app_dispatch(POP_APP_EV_RESTART_INTRO)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -/* Финал уходит в таблицу рекордов: она же дослушивает победную тему и - * гасит экран, как хвост end_sequence (seg001:5F1). */ -TC_TEST(ending_to_title_route) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_ENDING_STARTED)); - TC_EQ(pop_app_state, POP_APP_ENDING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_ENDING_FINISHED)); - TC_EQ(pop_app_state, POP_APP_HALL_OF_FAME); - TC_TRUE(pop_app_dispatch(POP_APP_EV_HOF_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(hof_route_still_exits_to_title) -{ - pop_app_state = POP_APP_HALL_OF_FAME; - TC_TRUE(pop_app_dispatch(POP_APP_EV_HOF_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -void main(void) -{ - TC_RUN(boot_to_title); - TC_RUN(level_load_roundtrip); - TC_RUN(rejects_wrong_event); - TC_RUN(future_routes_are_declared); - TC_RUN(prelevel_cutscene_route); - TC_RUN(demo_routes); - TC_RUN(intro_skip_starts_new_game); - TC_RUN(restart_game_returns_to_intro); - TC_RUN(ending_to_title_route); - TC_RUN(hof_route_still_exits_to_title); -} diff --git a/applications/PoP/roomtest/tests-host/t_cfg.c b/applications/PoP/roomtest/tests-host/t_cfg.c deleted file mode 100644 index 761648b..0000000 --- a/applications/PoP/roomtest/tests-host/t_cfg.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * t_cfg — полный codec POP.CFG: заголовок, размер, checksum и payload. - * - * DSS/EMM под host не живут, но pure codec лежит в том же pop_config.c, что - * и target-I/O. Поэтому проверяем весь формат, а не только payload. - */ -#include -#include - -#include "tcheck.h" -#include "pop_settings.h" -#include "pop_pace.h" /* POP_SPEED_MODES */ -#include "_pop_config.h" - -/* Runtime-владельцы нужны только для линковки pop_settings_apply(); codec - * их не вызывает. */ -uint8_t pop_speed_mode, pop_cheats, pop_snd_want, pop_mus_want; -void pop_sfx_toggle(void) __banked { pop_snd_want = (uint8_t)!pop_snd_want; } - -static void set_all(uint8_t snd, uint8_t spd, uint8_t prof, uint8_t cheats, - uint8_t info, uint16_t flags, uint8_t time_limit, - uint8_t debug_bar) -{ - pop_settings.sound_enabled = snd; - pop_settings.speed_mode = spd; - pop_settings.gameplay_profile = prof; - pop_settings.cheats_enabled = cheats; - pop_settings.show_build_info = info; - pop_settings.enhancement_flags = flags; - pop_settings.time_limit_enabled = time_limit; - pop_settings.show_debug_bar = debug_bar; -} - -/* ser→parse должен возвращать ровно те же значения (кроме профиля: - * ENHANCED осознанно садится в VANILLA). */ -TC_TEST(cfg_roundtrip) -{ - uint8_t buf[POP_CFG_SIZE]; - set_all(1, POP_SPEED_FAST, POP_PROFILE_VANILLA, 1, 1, 0xBEEF, 0, 0); - pop_cfg_encode(buf); - memset(&pop_settings, 0, sizeof(pop_settings)); /* стереть */ - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - TC_EQ(pop_settings.sound_enabled, 1); - TC_EQ(pop_settings.speed_mode, POP_SPEED_FAST); - TC_EQ(pop_settings.cheats_enabled, 1); - TC_EQ(pop_settings.show_build_info, 1); - TC_EQ(pop_settings.enhancement_flags, 0xBEEF); - TC_EQ(pop_settings.time_limit_enabled, 0); - TC_EQ(pop_settings.show_debug_bar, 0); -} - -/* ENHANCED из файла применяется как VANILLA (режим ещё не реализован). */ -TC_TEST(cfg_enhanced_downgrades_to_vanilla) -{ - uint8_t buf[POP_CFG_SIZE]; - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_ENHANCED, 0, 0, 0x0003, 1, 1); - pop_cfg_encode(buf); - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - TC_EQ(pop_settings.gameplay_profile, POP_PROFILE_VANILLA); - /* Остальные поля при этом применяются. */ - TC_EQ(pop_settings.enhancement_flags, 0x0003); -} - -/* Мусор в ЛЮБОМ поле => отказ без частичного применения. */ -TC_TEST(cfg_garbage_rejected_whole) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t i; - - for (i = 0; i < POP_CFG_PAYLOAD_SIZE; i++) { - set_all(1, POP_SPEED_FASTEST, POP_PROFILE_VANILLA, 1, 0, 0x0001, 1, 1); - pop_cfg_encode(buf); - switch (i) { - case 0: buf[7 + i] = 2; break; /* sound > 1 */ - case 1: buf[7 + i] = (uint8_t)POP_SPEED_MODES; break; - case 2: buf[7 + i] = 2; break; /* profile > ENHANCED */ - case 3: buf[7 + i] = 2; break; /* cheats > 1 */ - case 4: buf[7 + i] = 2; break; /* buildinfo > 1 */ - case 7: buf[7 + i] = 2; break; /* timer > 1 */ - case 8: buf[7 + i] = 2; break; /* debug bar > 1 */ - default: buf[7 + i] = 0xFF; break; /* флаги — любые */ - } - /* Изменённый payload обязан иметь корректную checksum: иначе мы - * тестируем checksum, а не диапазон поля. */ - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = 0; - { - uint8_t j; - for (j = 0; j < POP_CFG_PAYLOAD_SIZE; j++) - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] ^= buf[7 + j]; - } - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = - (uint8_t)~buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE]; - if (i == 5 || i == 6) { /* flags не валидируются */ - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - continue; - } - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_FALSE(pop_cfg_decode(buf, sizeof(buf))); - /* Настройки не тронуты — нули после memset остались нулями. */ - TC_EQ(pop_settings.sound_enabled, 0); - TC_EQ(pop_settings.speed_mode, 0); - } -} - -TC_TEST(cfg_header_checksum_and_future_tail) -{ - uint8_t buf[POP_CFG_MAX_SIZE]; - uint8_t i, sum; - set_all(1, POP_SPEED_FAST, POP_PROFILE_VANILLA, 0, 1, 0xA55A, 1, 1); - pop_cfg_encode(buf); - - buf[0] = 'X'; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - buf[4] = 2; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] ^= 1; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - TC_FALSE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_SIZE - 1))); - - /* Будущий v1: два незнакомых байта перед checksum должны пропуститься. */ - pop_cfg_encode(buf); - buf[5] = POP_CFG_PAYLOAD_SIZE + 2; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = 0x12; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = 0x34; - sum = 0; - for (i = 0; i < POP_CFG_PAYLOAD_SIZE + 2; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 2] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 3] = (uint8_t)~sum; - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_SIZE + 2))); - TC_EQ(pop_settings.enhancement_flags, 0xA55A); -} - -/* Созданный до FG4 файл (семь payload-байтов) остаётся валиден и обязан - * включить лимит: это исторический дефолт 60 минут, не значение в _DATA. */ -TC_TEST(cfg_legacy_enables_time_limit) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t sum = 0, i; - - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_VANILLA, 1, 0, 0, 0, 0); - pop_cfg_encode(buf); - buf[5] = POP_CFG_LEGACY_PAYLOAD_SIZE; - for (i = 0; i < POP_CFG_LEGACY_PAYLOAD_SIZE; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE + 1] = (uint8_t)~sum; - pop_settings.time_limit_enabled = 0; - TC_TRUE(pop_cfg_decode(buf, POP_CFG_MIN_SIZE)); - TC_EQ(pop_settings.time_limit_enabled, 1); -} - -/* Файл, записанный ДО тумблера отладочной полосы (восемь payload-байтов), - * обязан остаться валидным и включить полосу: это её исторический дефолт. */ -TC_TEST(cfg_legacy_enables_debug_bar) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t sum = 0, i; - - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_VANILLA, 1, 0, 0, 1, 0); - pop_cfg_encode(buf); - buf[5] = POP_CFG_TIMELIMIT_PAYLOAD_SIZE; - for (i = 0; i < POP_CFG_TIMELIMIT_PAYLOAD_SIZE; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_TIMELIMIT_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_TIMELIMIT_PAYLOAD_SIZE + 1] = (uint8_t)~sum; - pop_settings.show_debug_bar = 0; - TC_TRUE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_HEADER_SIZE + - POP_CFG_TIMELIMIT_PAYLOAD_SIZE + - POP_CFG_TAIL_SIZE))); - TC_EQ(pop_settings.show_debug_bar, 1); - TC_EQ(pop_settings.time_limit_enabled, 1); -} - -TC_TEST(settings_apply_syncs_runtime) -{ - set_all(0, POP_SPEED_FASTEST, POP_PROFILE_VANILLA, 0, 0, 0, 1, 1); - pop_snd_want = 1; - pop_settings_apply(1); - TC_EQ(pop_speed_mode, POP_SPEED_FASTEST); - TC_EQ(pop_cheats, 0); - TC_EQ(pop_snd_want, 0); -} - -void main(void) -{ - TC_RUN(cfg_roundtrip); - TC_RUN(cfg_enhanced_downgrades_to_vanilla); - TC_RUN(cfg_garbage_rejected_whole); - TC_RUN(cfg_header_checksum_and_future_tail); - TC_RUN(cfg_legacy_enables_time_limit); - TC_RUN(cfg_legacy_enables_debug_bar); - TC_RUN(settings_apply_syncs_runtime); -} diff --git a/applications/PoP/roomtest/tests-host/t_char.c b/applications/PoP/roomtest/tests-host/t_char.c deleted file mode 100644 index f213c60..0000000 --- a/applications/PoP/roomtest/tests-host/t_char.c +++ /dev/null @@ -1,525 +0,0 @@ -/* - * t_char — физика над Char для РАЗНЫХ ПЕРСОНАЖЕЙ. - * - * Зачем отдельный набор. После GUARD-PHYS физика — один набор функций над - * глобалом `Char`, а кто именно в Char, решают окна loadkid/savekid и - * loadshad/saveshad (как в оригинале, seg006:809). В слоте Guard живёт не - * только страж: тем же кодом ходят скелет (ур. 3), тень (4/5/6/12), визирь - * (13) и мышь (8) — `autocontrol_opponent` (seg002:628) разводит их только - * по ИИ, а play_guard_frame у всех общий. Значит расхождения «у Кида так, - * у прочих иначе» — это ВЕТКИ ПО charid внутри общих функций, и проверять - * их надо именно так: одна сцена, разные персонажи. - * - * t_phys страхует, что перенос ничего не сломал КИДУ (характеризационные - * трассы). Здесь — противоположное: что не-Кид получает СВОЮ ветку. - * - * Проверки точечные (значение поля после N кадров), а не трассы: ветки - * различаются исходом, а не траекторией, и эталон тут только запутал бы. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define G 4 /* gate (portcullis) */ -#define W 20 /* wall */ - -/* Ровный пол на ряду 1 (как room_flat в t_phys). */ -static const uint8_t room_flat[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Пол ряда 0 обрывается после колонки 3; ряд 2 — пол. Персонаж, сошедший - * с кромки (0,3), падает ДВА ряда: ровно та высота, на которой ветки - * land() по charid расходятся (seg005:189). */ -static const uint8_t room_drop2[30] = { - W, F, F, F, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, -}; - -/* Решётка ворот в (2,6) — сцена под окклюзию персонажа, стоящего в проёме. */ -static const uint8_t room_gate[30] = { - W, E, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, G, F, F, F, -}; - -/* ---- take_hp: кому достаётся урон ----------------------------------- */ - -TC_TEST(char_take_hp_goes_to_active) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - - /* Окно Кида: урон обязан уйти в hitp_delta и не тронуть стража. */ - pop_loadkid(); - hitp_delta = 0; guardhp_delta = 0; - tc_check(pop_take_hp(1), 0, "kid: не последнее HP", __LINE__); - tc_check(hitp_delta, -1, "kid: hitp_delta", __LINE__); - tc_check(guardhp_delta, 0, "kid: страж не тронут", __LINE__); - pop_savekid(); - - /* Окно стража: тот же вызов — уже в guardhp_delta. */ - pop_loadshad(); - hitp_delta = 0; guardhp_delta = 0; - tc_check(pop_take_hp(1), 0, "guard: не последнее HP", __LINE__); - tc_check(guardhp_delta, -1, "guard: guardhp_delta", __LINE__); - tc_check(hitp_delta, 0, "guard: Кид не тронут", __LINE__); - /* Смертельный удар: возврат 1 и дельта на всё оставшееся. */ - guardhp_delta = 0; - tc_check(pop_take_hp(100), 1, "guard: смертельный удар", __LINE__); - tc_check(guardhp_delta, -3, "guard: дельта на все HP", __LINE__); - pop_saveshad(); -} - -/* Уровень 2 чита гасит только мелкий урон Киду. Мгновенная смерть - * (count=100) проходит всегда, а на стража чит не действует вовсе. */ -TC_TEST(char_immortal_level2_covers_kid_only) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - pop_immortal = 2; - - pop_loadkid(); - hitp_delta = 0; - tc_check(pop_take_hp(1), 0, "kid: мелкий урон погашен", __LINE__); - tc_check(hitp_delta, 0, "kid: HP не тронуто", __LINE__); - tc_check(pop_take_hp(100), 1, "kid: мгновенная смерть проходит", __LINE__); - tc_check(hitp_delta, -3, "kid: смертельная дельта", __LINE__); - pop_savekid(); - - pop_loadshad(); - guardhp_delta = 0; - tc_check(pop_take_hp(100), 1, "guard: чит на него не действует", __LINE__); - pop_saveshad(); - - pop_immortal = 0; -} - -/* ---- do_delta_hp: дельты применяются каждому своему счётчику --------- */ - -TC_TEST(char_delta_hp_applies_per_character) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - - hitp_delta = -1; - guardhp_delta = -2; - pop_kid_hurt = 0; - pop_guard_hurt = 0; - pop_do_delta_hp(); - - tc_check(hitp_curr, 2, "kid: HP 3-1", __LINE__); - tc_check(guardhp_curr, 1, "guard: HP 3-2", __LINE__); - /* Флаги «брызг» — по одному на персонажа, и только на УРОН. */ - tc_check(pop_kid_hurt, 1, "kid: брызги", __LINE__); - tc_check(pop_guard_hurt, 1, "guard: брызги", __LINE__); - - /* Плюсовая дельта (зелье) брызг и вспышки давать НЕ должна. */ - pop_kid_hurt = 0; - hitp_delta = 1; - pop_do_delta_hp(); - tc_check(hitp_curr, 3, "kid: зелье вернуло HP", __LINE__); - tc_check(pop_kid_hurt, 0, "kid: зелье — не урон", __LINE__); -} - -/* ---- land(): ветки по charid (seg005:173) --------------------------- */ - -/* Кид с двух рядов теряет 1 HP и остаётся жив. */ -TC_TEST(char_kid_survives_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(3, 0, 0); - sc_trace_clear(); - sc_run(SC_R, 30); /* шагнуть с кромки и упасть */ - - pop_do_delta_hp(); - tc_check(Kid.curr_row, 2, "kid: приземлился на ряд 2", __LINE__); - tc_check(hitp_curr, 2, "kid: −1 HP за два ряда", __LINE__); - tc_check(pop_kid_dead, 0, "kid: жив", __LINE__); -} - -/* СТРАЖ с той же высоты гибнет: seg005:190 уводит charid_2_guard прямо в - * take_hp(100). Это не «баланс», а буквальная ветка оригинала. */ -TC_TEST(char_guard_dies_from_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); /* Кид в стороне, не мешает */ - /* Ставим сразу НАД ПУСТОТОЙ: ИИ в наборе нет, сам с кромки страж не - * сойдёт, а физике довольно того, что под ним не пол. Колонка 5, а не - * 4: решение принимается по ВЕСОВОЙ ТОЧКЕ кадра (dx_weight, seg006), - * а она у стойки стража уходит на 9 px назад — с колонки 4 точка - * попадала бы ещё на пол колонки 3. */ - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - sc_guard_run(30); - - pop_do_delta_hp(); - tc_check(Guard.curr_row, 2, "guard: приземлился на ряд 2", __LINE__); - tc_check(guardhp_curr, 0, "guard: два ряда = смерть", __LINE__); -} - -/* ТЕНЬ (charid_1_shadow) с тех же двух рядов не теряет ничего: seg005:189 - * уводит её в ветку «упал с одного ряда». */ -TC_TEST(char_shadow_survives_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_1_SHADOW, 5, 0, 0, 3); - sc_guard_run(30); - - pop_do_delta_hp(); - tc_check(Guard.curr_row, 2, "shadow: приземлилась на ряд 2", __LINE__); - tc_check(guardhp_curr, 3, "shadow: HP не тронуто", __LINE__); -} - -/* ---- физика слота Guard вообще работает ----------------------------- */ - -/* До GUARD-PHYS у стража не было ни fall_accel, ни check_action: сойдя с - * кромки, он просто висел в воздухе. Тест ловит именно это. */ -TC_TEST(char_guard_falls_at_all) -{ - uint8_t y0; - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - y0 = Guard.y; - - sc_guard_run(6); - tc_check(Guard.y > y0, 1, "guard: пошёл вниз", __LINE__); -} - -/* Гард по X (seg000:1254): за пределами комнаты физика молчит — именно так - * оригинал не выпускает стража из комнаты. */ -TC_TEST(char_guard_physics_gated_by_x) -{ - uint8_t y0; - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - Guard.x = 220; /* правее 211 — вне комнаты */ - y0 = Guard.y; - - sc_guard_run(6); - tc_check(Guard.y, y0, "guard вне комнаты: физика не трогает", __LINE__); -} - -/* check_guard_fallout (seg002:0241): провалившегося ниже комнаты убирают - * совсем — в комнату снизу он не переходит. */ -TC_TEST(char_guard_fallout_removes_him) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - - Guard.y = 211; - pop_guard_fallout(); - tc_check(Guard.charid, 0, "guard: убран из комнаты", __LINE__); - tc_check(guardhp_curr, 0, "guard: HP обнулены", __LINE__); -} - -/* ---- окна Char не путают персонажей ---------------------------------- */ - -/* Регресс на класс ошибок, ради которого затевался перенос: физика Кида не - * должна трогать стража, и наоборот. Гоняем оба слота в одной сцене. */ -TC_TEST(char_windows_do_not_leak) -{ - uint8_t gx, gy; - sc_room(room_flat, 1); - sc_kid_at(3, 1, 0); - sc_guard_at(CHARID_2_GUARD, 7, 1, -1, 3); - gx = Guard.x; gy = Guard.y; - - sc_run(SC_R, 10); /* Кид бежит вправо */ - - tc_check(Guard.x, gx, "страж не поехал за Кидом", __LINE__); - tc_check(Guard.y, gy, "страж остался на своей высоте", __LINE__); - tc_check(Guard.charid, CHARID_2_GUARD, "страж не подменён Кидом", __LINE__); - tc_check(Kid.charid, CHARID_0_KID, "Кид не подменён стражем", __LINE__); -} - - -/* ---- follow_guard: страж идёт ЗА КИДОМ вбок (seg002:0340/039E) ------- * - * Своим ходом персонаж слота Guard комнату не меняет, но когда её меняет - * КИД, exit_room может перенести стража следом. Здесь проверяются все - * условия отбора — они и есть механика. Порт зовётся из enter_room, а - * тестируем прямо pop_guard_follow: сцена комнат в наборе одна. */ - -/* Базовый случай: бой, Кид ушёл ВЛЕВО, страж прижат к левому краю (x < 91), - * в комнате 2 своего стража нет → идёт следом, X переносится через шов. */ -TC_TEST(char_follow_guard_left) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; /* < 91: у левого края */ - Guard.room = 3; - - tc_check(pop_guard_follow(2, 0), 1, "страж пошёл следом", __LINE__); - tc_check(Guard.room, 2, "страж в новой комнате", __LINE__); - tc_check(Guard.x, 80 + 140, "X перенесён через шов (+140)", __LINE__); - /* follow_guard стирает guards_tile ОБЕИХ комнат — иначе страж - * раздвоится: старую поднимут при возврате, новую при входе. */ - tc_check(tk_gs_tile[3 - 1], 30, "в старой комнате стража нет", __LINE__); - tc_check(tk_gs_tile[2 - 1], 30, "в новой комнате нет второго", __LINE__); -} - -/* Тот же бой, но страж ДАЛЕКО от края (x >= 91) — остаётся. */ -TC_TEST(char_follow_guard_needs_edge) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 5, 1, -1, 3); - Guard.x = 120; /* >= 91 */ - Guard.room = 3; - - tc_check(pop_guard_follow(2, 0), 0, "далеко от края — остаётся", __LINE__); - tc_check(Guard.room, 3, "комната не менялась", __LINE__); -} - -/* Порог для ухода ВПРАВО — свой (x >= 165). */ -TC_TEST(char_follow_guard_right_threshold) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(8, 1, 0); - sc_guard_at(CHARID_2_GUARD, 7, 1, 0, 3); - Guard.room = 3; - - Guard.x = 160; /* < 165 — не идёт */ - tc_check(pop_guard_follow(4, 1), 0, "x=160: остаётся", __LINE__); - Guard.x = 170; /* >= 165 — идёт */ - tc_check(pop_guard_follow(4, 1), 1, "x=170: идёт следом", __LINE__); - tc_check(Guard.x, 170 - 140, "X перенесён через шов (−140)", __LINE__); -} - -/* Не бой — не идёт. Меч в ножнах = страж Кида не преследует. */ -TC_TEST(char_follow_guard_needs_sword_drawn) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - Guard.sword = 0; /* sword_0_sheathed */ - - tc_check(pop_guard_follow(2, 0), 0, "без меча — остаётся", __LINE__); -} - -/* Мёртвый (и умирающий) не идёт никуда. */ -TC_TEST(char_follow_guard_dead_stays) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - Guard.alive = 0; /* alive >= 0 — умирает/мёртв */ - - tc_check(pop_guard_follow(2, 0), 0, "мёртвый остаётся", __LINE__); -} - -/* Вверх и вниз оригинал не пускает никогда (условия leave всегда истинны). */ -TC_TEST(char_follow_guard_never_vertical) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - - tc_check(pop_guard_follow(2, 2), 0, "вверх — не идёт", __LINE__); - tc_check(pop_guard_follow(2, 3), 0, "вниз — не идёт", __LINE__); - tc_check(Guard.room, 3, "комната не менялась", __LINE__); -} - -/* В целевой комнате СВОЙ живой страж — перехода нет (иначе их станет два). */ -TC_TEST(char_follow_guard_blocked_by_own_guard) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - tk_guard_room = 2; /* в комнате 2 есть свой страж */ - - tc_check(pop_guard_follow(2, 0), 0, "чужая комната занята", __LINE__); - tc_check(Guard.room, 3, "остался у себя", __LINE__); - - /* А если там ТРУП (запомнена последовательность) — идти можно. */ - tk_gs_tile[2 - 1] = 11; - tk_gs_seq[2 - 1] = 0x1234; - tc_check(pop_guard_follow(2, 0), 1, "к трупу — можно", __LINE__); -} - -/* Тайлы СОСЕДНИХ комнат: колонка персонажа считается из x и на диапазоне - * x 0..255 лежит в −5..13, то есть регулярно уходит за комнату глубже кромки. - * Там get_tile обязан отдавать настоящий тайл соседа — мнимая стена стоила - * BUG-SWORD-GHOST-1 (страж после follow_guard оказывался в col 12, луч - * видимости упирался в неё, и Кид посреди боя прятал меч, а достать обратно - * уже не мог: draw_sword требует can_guard_see_kid >= 2). */ -static void char_tiles_resolve_across_rooms(void) -{ - static const uint8_t floor30[30] = { - E,E,E,E,E,E,E,E,E,E, - E,E,E,E,E,E,E,E,E,E, - F,F,F,F,F,F,F,F,F,F, - }; - uint8_t i; - /* Комнаты-соседи «уровня»: карта заберёт их fg сама (pop_map_set_edges). */ - for (i = 0; i < 30; i++) { tk_room_fg[4][i] = F; tk_room_fg[6][i] = F; } - tk_room_fg[4][10 + 5] = W; /* сосед слева: ряд 1, col 5 */ - tk_room_fg[6][10 + 2] = W; /* сосед справа: ряд 1, col 2 */ - - sc_room(floor30, 5); - pop_map_set_edges(4, 6, 0, 0); - tc_check(pop_tile_at(-1, 1), F, "col -1 = col9 соседа слева", __LINE__); - tc_check(pop_tile_at(-5, 1), W, "col -5 = col5 соседа слева", __LINE__); - tc_check(pop_tile_at(10, 1), F, "col 10 = col0 соседа справа", __LINE__); - tc_check(pop_tile_at(12, 1), W, "col 12 = col2 соседа справа", __LINE__); - tc_check(pop_tile_at(13, 1), F, "col 13 = col3 соседа справа", __LINE__); - /* Дальше комнаты соседа оригинал ушёл бы ещё через roomlink; у нас - * кэш на одну комнату в каждую сторону, и это край — стена. */ - tc_check(pop_tile_at(20, 1), W, "за комнатой соседа — стена", __LINE__); - tc_check(pop_tile_at(-11, 1), W, "и слева тоже", __LINE__); - - /* Соседа нет (край уровня) — стена в обе стороны, как раньше. */ - pop_map_set_edges(0, 0, 0, 0); - tc_check(pop_tile_at(12, 1), W, "без соседа справа — стена", __LINE__); - tc_check(pop_tile_at(-1, 1), W, "без соседа слева — стена", __LINE__); -} - -/* ---- скелет: падение его не убивает (check_guard_fallout, seg002:252) --- */ - -/* Если под комнатой лежит комната 3, упавший скелет ВОЗРОЖДАЕТСЯ там же — - * это единственный способ «убрать» его с экрана, убить его нельзя. */ -TC_TEST(char_skeleton_reappears_below) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_4_SKELETON, 5, 1, -1, 3); - Guard.room = 5; - Guard.y = 220; /* ниже нижней границы комнаты (211) */ - tk_link_down = 3; /* под комнатой 5 — комната 3 */ - - pop_guard_fallout(); - - tc_check(Guard.charid, CHARID_4_SKELETON, "скелет остался в слоте", __LINE__); - tc_check(Guard.room, 3, "перенесён в комнату 3", __LINE__); - tc_check(Guard.x, 133, "и на свою позицию", __LINE__); - tc_check(Guard.curr_row, 1, "ряд 1", __LINE__); - tc_check(Guard.alive, -1, "жив", __LINE__); -} - -/* А если снизу НЕ комната 3 — обычная судьба выпавшего: слот освобождается. */ -TC_TEST(char_skeleton_falls_out_elsewhere) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_4_SKELETON, 5, 1, -1, 3); - Guard.room = 5; - Guard.y = 220; - tk_link_down = 7; /* снизу другая комната */ - - pop_guard_fallout(); - tc_check(Guard.charid, 0, "скелет убран, как обычный выпавший", __LINE__); -} - -/* ---- Окклюзия воротами (GATE-FORE-KID) ------------------------------ * - * Персонаж, стоящий В ПРОЁМЕ ворот, обязан уходить ЗА решётку: оригинал - * кладёт её бары в foretable (draw_tile_fore, seg008:0D15). Решение — - * pop_gate_over_char; сама отрисовка живёт в слое фона и в харнесс не - * линкуется, поэтому проверяем именно РЕШЕНИЕ. */ - -TC_TEST(char_gate_covers_char_standing_in_it) -{ - sc_room(room_gate, 1); - sc_kid_at(6, 2, 0); /* ровно на тайле ворот */ - pop_loadkid(); - TC_TRUE(pop_gate_over_char(&Char)); -} - -TC_TEST(char_gate_ignores_neighbour_tiles) -{ - sc_room(room_gate, 1); - sc_kid_at(5, 2, 0); /* колонка слева от ворот */ - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); - sc_kid_at(7, 2, 0); /* и справа */ - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); -} - -TC_TEST(char_gate_ignores_other_room) -{ - /* Персонаж той же клетки, но ДРУГОЙ комнаты (страж, оставшийся в - * соседней): его решётка текущей комнаты не касается. */ - sc_room(room_gate, 1); - sc_kid_at(6, 2, 0); - pop_loadkid(); - Char.room = 5; - TC_EQ(pop_gate_over_char(&Char), 0); -} - -TC_TEST(char_gate_never_in_last_column) -{ - /* Колонка 9: бары легли бы в колонку 10, то есть в СОСЕДНЮЮ комнату — - * у оригинала это отсекает `Kid.room != room_R`. */ - static const uint8_t room_gate9[30] = { - W, E, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, G, - }; - sc_room(room_gate9, 1); - sc_kid_at(9, 2, 0); - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); -} - -void main(void) -{ - sc_init(); - TC_RUN(char_take_hp_goes_to_active); - TC_RUN(char_immortal_level2_covers_kid_only); - TC_RUN(char_delta_hp_applies_per_character); - TC_RUN(char_kid_survives_two_row_fall); - TC_RUN(char_guard_dies_from_two_row_fall); - TC_RUN(char_shadow_survives_two_row_fall); - TC_RUN(char_guard_falls_at_all); - TC_RUN(char_guard_physics_gated_by_x); - TC_RUN(char_guard_fallout_removes_him); - TC_RUN(char_windows_do_not_leak); - TC_RUN(char_follow_guard_left); - TC_RUN(char_follow_guard_needs_edge); - TC_RUN(char_follow_guard_right_threshold); - TC_RUN(char_follow_guard_needs_sword_drawn); - TC_RUN(char_follow_guard_dead_stays); - TC_RUN(char_follow_guard_never_vertical); - TC_RUN(char_follow_guard_blocked_by_own_guard); - TC_RUN(char_tiles_resolve_across_rooms); - TC_RUN(char_skeleton_reappears_below); - TC_RUN(char_skeleton_falls_out_elsewhere); - TC_RUN(char_gate_covers_char_standing_in_it); - TC_RUN(char_gate_ignores_neighbour_tiles); - TC_RUN(char_gate_ignores_other_room); - TC_RUN(char_gate_never_in_last_column); -} diff --git a/applications/PoP/roomtest/tests-host/t_cutscene.c b/applications/PoP/roomtest/tests-host/t_cutscene.c deleted file mode 100644 index e36ede6..0000000 --- a/applications/PoP/roomtest/tests-host/t_cutscene.c +++ /dev/null @@ -1,46 +0,0 @@ -/* pop_cutscene — порядок событий, точная семантика WAIT и прерывание. */ -#include -#include "tcheck.h" -#include "pop_cutscene.h" - -static const pop_cs_cmd_t script[] = { - { POP_CS_PALETTE, 1 }, { POP_CS_SHOW, 7 }, { POP_CS_WAIT, 2 }, - { POP_CS_FLASH, 3 }, { POP_CS_WAIT, 1 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -TC_TEST(script_events_and_waits) -{ - pop_cutscene_t cs; - uint16_t arg; - - pop_cutscene_begin(&cs, script); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_PALETTE); TC_EQ(arg, 1); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_SHOW); TC_EQ(arg, 7); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_FLASH); TC_EQ(arg, 3); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_FADE_OUT); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_END); -} - -TC_TEST(skip_aborts_at_any_wait) -{ - pop_cutscene_t cs; - uint16_t arg; - - pop_cutscene_begin(&cs, script); - pop_cutscene_tick(&cs, &arg); - pop_cutscene_tick(&cs, &arg); - pop_cutscene_tick(&cs, &arg); /* WAIT(2), ещё есть один кадр */ - pop_cutscene_abort(&cs); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_END); - TC_EQ(cs.ended, 1); -} - -void main(void) -{ - TC_RUN(script_events_and_waits); - TC_RUN(skip_aborts_at_any_wait); -} diff --git a/applications/PoP/roomtest/tests-host/t_demo.c b/applications/PoP/roomtest/tests-host/t_demo.c deleted file mode 100644 index 85d28c3..0000000 --- a/applications/PoP/roomtest/tests-host/t_demo.c +++ /dev/null @@ -1,89 +0,0 @@ -/* pop_demo — запись level 0: смена команд и прерывание любым вводом. */ -#include -#include "tcheck.h" -#include "pop_demo.h" - -static int8_t moves[255]; -static uint8_t moves_n; -static uint8_t any_key; -static uint8_t fight_ai; -uint8_t hitp_curr; - -uint8_t pop_demo_kid_ai(void) __banked -{ - return fight_ai; -} - -void pop_ctrl_auto_move(int8_t move) __banked -{ - moves[moves_n++] = move; -} - -uint8_t kbd_raw_any_down(void) -{ - return any_key; -} - -TC_TEST(replays_sdlpop_move_table) -{ - uint8_t done = 0; - - moves_n = 0; - fight_ai = 0; - hitp_curr = 4; - pop_demo_begin(); - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 1); - TC_EQ(moves[0], 0); /* t=1, запись {0, nothing} */ - while (moves_n < 14) { - TC_FALSE(pop_demo_tick()); - } - TC_EQ(moves[1], 1); /* t=2, запись {1, forward} */ - TC_EQ(moves[11], 1); /* t=12 всё ещё forward */ - TC_EQ(moves[12], 0); /* t=13, запись {0x0D, nothing} */ - - while (!done) done = pop_demo_tick(); - TC_EQ(moves_n, 254); /* SDLPoP останавливает demo_time на FE */ - TC_EQ(moves[253], -1); /* хвост после записи {0xE9, -1} */ -} - -TC_TEST(fight_ai_pauses_scripted_moves) -{ - moves_n = 0; - fight_ai = 1; - hitp_curr = 4; - pop_demo_begin(); - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 0); /* во время боя demo_time не идёт */ - - fight_ai = 0; - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 1); - TC_EQ(moves[0], 0); /* первый scripted тик не потерян */ -} - -TC_TEST(death_stops_demo_before_combat_ai) -{ - moves_n = 0; - fight_ai = 1; - hitp_curr = 0; - pop_demo_begin(); - TC_TRUE(pop_demo_tick()); - TC_EQ(moves_n, 0); -} - -TC_TEST(any_raw_key_interrupts_demo) -{ - any_key = 0; - TC_FALSE(pop_demo_user_input()); - any_key = 1; - TC_TRUE(pop_demo_user_input()); -} - -void main(void) -{ - TC_RUN(replays_sdlpop_move_table); - TC_RUN(fight_ai_pauses_scripted_moves); - TC_RUN(death_stops_demo_before_combat_ai); - TC_RUN(any_raw_key_interrupts_demo); -} diff --git a/applications/PoP/roomtest/tests-host/t_flow.c b/applications/PoP/roomtest/tests-host/t_flow.c deleted file mode 100644 index 36a9aad..0000000 --- a/applications/PoP/roomtest/tests-host/t_flow.c +++ /dev/null @@ -1,52 +0,0 @@ -/* pop_flow — только канонические pre-level маршруты и ветка scene 12. */ -#include -#include "tcheck.h" -#include "pop_flow.h" - -TC_TEST(only_original_levels_have_pre_scenes) -{ - uint8_t level; - - for (level = 0; level <= 14; level++) { - pop_pre_cutscene_t scene = pop_flow_pre_cutscene(level, 60); - if (level == 2 || level == 6) TC_EQ(scene, POP_PRE_2_6); - else if (level == 4) TC_EQ(scene, POP_PRE_4); - else if (level == 8) TC_EQ(scene, POP_PRE_8); - else if (level == 9) TC_EQ(scene, POP_PRE_9); - else if (level == 12) TC_EQ(scene, POP_PRE_12); - else TC_EQ(scene, POP_PRE_NONE); - } - TC_EQ(pop_flow_pre_cutscene(15, 60), POP_PRE_NONE); -} - -TC_TEST(scene_12_short_time_boundary) -{ - TC_EQ(pop_flow_pre_cutscene(12, 6), POP_PRE_12); - TC_EQ(pop_flow_pre_cutscene(12, 5), POP_PRE_12_SHORT); - TC_EQ(pop_flow_pre_cutscene(12, 0), POP_PRE_12_SHORT); -} - -TC_TEST(level_14_is_ending_without_number) -{ - const pop_level_flow_t *flow = pop_flow_level(14); - TC_TRUE(flow != 0); - TC_FALSE(flow->show_level_number); - TC_TRUE(flow->ending_rule); - TC_TRUE(pop_flow_level(15) == 0); -} - -TC_TEST(ending_room_is_exact) -{ - TC_TRUE(pop_flow_is_ending(14, 5)); - TC_FALSE(pop_flow_is_ending(14, 4)); - TC_FALSE(pop_flow_is_ending(13, 5)); - TC_FALSE(pop_flow_is_ending(15, 5)); -} - -void main(void) -{ - TC_RUN(only_original_levels_have_pre_scenes); - TC_RUN(scene_12_short_time_boundary); - TC_RUN(level_14_is_ending_without_number); - TC_RUN(ending_room_is_exact); -} diff --git a/applications/PoP/roomtest/tests-host/t_gate.c b/applications/PoP/roomtest/tests-host/t_gate.c deleted file mode 100644 index 0340fdf..0000000 --- a/applications/PoP/roomtest/tests-host/t_gate.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * t_gate.c — ОТКРЫТЫЕ ворота не должны быть «стеной» для осторожного шага. - * - * Наблюдение (пользователь, 2026-08-24): перед ОТКРЫТОЙ решёткой Кид, - * идущий слева направо, делает лишний мелкий шаг — чтобы подойти к краю, - * Shift+вперёд надо нажимать дважды. - * - * Механика: длину осторожного шага выбирает сам safe_step (seg005:0604) по - * числу, которое вернул get_edge_distance — seq 29..42 это «шаг ровно на - * distance пикселей». А get_edge_distance для тайла-стены зовёт - * dist_from_wall_forward, и та у ОРИГИНАЛА первой строкой отвечает −1, если - * тайл — ворота, сквозь которые можно пройти (seg004:0A18: - * `if (tiletype == tiles_4_gate && !can_bump_into_gate()) return -1`). - * Минус единица уводит разбор дальше, где открытые ворота опознаются как - * обычный ПОЛ: distance = 11, полный шаг. Без этой ветки расстояние - * считается до створки, тип края — EDGE_WALL, и шаг выходит коротким. - * - * Проверяем не поведение через кадры, а сам ответ get_edge_distance: он и - * есть источник длины шага, и утверждение «открытая решётка == обычный - * пол» переживёт любую перенастройку последовательностей. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_cdraw.h" /* pop_cd[].fph — высоту кадра ставит отрисовка */ - -#define F 1 /* floor */ -#define G 4 /* gate */ -#define W 20 /* wall */ - -/* Ряд 0: пол до колонки 4, решётка в колонке 5, пол дальше — «коридор с - * решёткой» уровня 1 (комната 5) в чистом виде. */ -static const uint8_t room_gate[30] = { - F, F, F, F, F, G, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Тот же ряд, но вместо решётки обычный пол — эталон «свободного» края. */ -static const uint8_t room_floor[30] = { - F, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Кид на колонке 4 лицом вправо, решётка (или пол) — следующим тайлом. - * modif — «открытость» ворот: 188 = подняты (проход открыт), 0 = опущены. - * Возврат — distance, тип края остаётся в pop_edge_type(). */ -static int edge_at_gate_x(const uint8_t *fg, uint8_t modif, uint8_t x) -{ - int d; - sc_room(fg, 1); - tk_modif[5] = modif; - if (x) sc_kid_at_x(4, 0, x, 0 /* лицом вправо */); - else sc_kid_at(4, 0, 0); - /* «Открыты ли ворота» решается сравнением подъёма створки с ВЫСОТОЙ - * КАДРА персонажа (can_bump_into_gate, seg004:0373). В продукте её - * пишет отрисовка (pop_cdraw), которой в наборе нет, — значит задаём - * сами. Порог важен только тем, что 6 (опущенная створка) под - * высотой кадра, а 53 (поднятая) над ней. */ - pop_cd[POP_CH_KID].fpw = 12; - pop_cd[POP_CH_KID].fph = 41; /* габарит стойки, снят в MAME */ - pop_loadkid(); - d = pop_edge_distance(); - pop_savekid(); - return d; -} - -static int edge_at_gate(const uint8_t *fg, uint8_t modif) -{ - return edge_at_gate_x(fg, modif, 0); -} - -/* ОТКРЫТАЯ решётка — не препятствие: и расстояние, и тип края обязаны - * совпасть с обычным полом, иначе осторожный шаг окажется коротким. */ -TC_TEST(open_gate_is_not_a_wall) -{ - int d_floor, d_gate; - uint8_t t_floor, t_gate; - - d_floor = edge_at_gate(room_floor, 0); - t_floor = pop_edge_type(); - d_gate = edge_at_gate(room_gate, 188); - t_gate = pop_edge_type(); - - TC_EQ(d_gate, d_floor); - TC_EQ(t_gate, t_floor); -} - -/* ЗАКРЫТАЯ решётка обязана остаться стеной — иначе фикс выше открыл бы - * проход сквозь опущенные ворота. */ -/* ЗАКРЫТАЯ решётка обязана остаться стеной: фикс выше не должен открывать - * проход сквозь опущенные ворота. X берём у самой створки — в центре тайла - * она ещё «далеко» и честно классифицируется как пол. */ -TC_TEST(closed_gate_is_a_wall) -{ - int d = edge_at_gate_x(room_gate, 0, 136); - TC_EQ(pop_edge_type(), EDGE_WALL); - TC_EQ(d < 11, 1); -} - -/* ...а ОТКРЫТАЯ на том же X ведёт себя как чистый пол — это и есть длина - * осторожного шага: 11, а не обрезок до створки. */ -TC_TEST(open_gate_steps_like_floor) -{ - int d_gate, d_floor; - uint8_t t_gate, t_floor; - - d_gate = edge_at_gate_x(room_gate, 188, 136); - t_gate = pop_edge_type(); - d_floor = edge_at_gate_x(room_floor, 0, 136); - t_floor = pop_edge_type(); - - TC_EQ(d_gate, d_floor); - TC_EQ(t_gate, t_floor); -} - -/* ---- check_gate_push (seg004:0833) --------------------------------- * - * Кид стоит в тайле решётки, решётка опускается — оригинал ВЫТАЛКИВАЕТ его - * из тайла (иначе Кид «в суперпозиции»: створка рисуется то перед ним, то - * за ним, и уйти он может в обе стороны). Прогоняем кадр физики и смотрим, - * сдвинулся ли X. */ -static int8_t push_col; /* curr_col, с которым сработал толчок */ - -static int push_from_dir(uint8_t x, uint8_t modif, int8_t dir) -{ - sc_room(room_gate, 1); - tk_modif[5] = modif; - /* Габарит ПОСЛЕДНЕГО НАРИСОВАННОГО кадра — его в продукте пишет - * отрисовка (pop_cdraw), которой в наборе нет. Значения сняты с живой - * сцены в MAME для стойки Кида: ширина 12, высота 41. */ - pop_cd[POP_CH_KID].fpw = 12; - pop_cd[POP_CH_KID].fph = 41; - sc_kid_at_x(5, 0, x, dir); - sc_run(0, 1); /* кадр «стоим» — флаги перекрытия за прошлый */ - push_col = Kid.curr_col; - sc_run(0, 1); /* ...и за этот: check_gate_push смотрит оба */ - return (int)Kid.x - (int)x; -} - -static int push_from(uint8_t x, uint8_t modif) -{ - return push_from_dir(x, modif, 0); -} - -/* СТОРОНА толчка — формула оригинала `Char.x += 5 - (orig_col <= tile_col) * 10`: - * пока тайл ПЕРСОНАЖА и есть решётка, его выталкивает ВЛЕВО (−5); как только - * персонаж отнесён к следующей колонке (решётка стала левым соседом) — ВПРАВО - * (+5). Граница между сторонами, стало быть, ровно там, где меняется - * curr_col, и проверяется здесь на обоих направлениях взгляда. - * - * Решётка — колонка 5, значит push_col == 5 обязан давать −5, push_col == 6 - * (+5), а вне зоны касания створки толчка нет вовсе. */ -static uint8_t check_side(int8_t dir, uint8_t *nleft, uint8_t *nright) -{ - uint8_t x, bad = 0; - for (x = 130; x <= 162; x++) { - int dx = push_from_dir(x, 0, dir); - if (dx == 0) continue; - /* Величина — кратная 5: пока персонаж остаётся в зоне створки, - * толчок повторяется каждый кадр (так же и в оригинале), поэтому - * проверяем СТОРОНУ и шаг, а не одно конкретное число. */ - if (push_col == 5) { if (dx >= 0 || dx % 5) bad++; else (*nleft)++; } - else if (push_col == 6) { if (dx <= 0 || dx % 5) bad++; else (*nright)++; } - else bad++; /* толчок вне тайлов решётки — ошибка */ - } - return bad; -} - -TC_TEST(closing_gate_pushes_kid) -{ - uint8_t nleft = 0, nright = 0, bad; - - bad = check_side(0, &nleft, &nright); /* лицом вправо */ - bad += check_side(-1, &nleft, &nright); /* лицом влево */ - - TC_EQ(bad, 0); - TC_EQ(nleft > 0, 1); /* обе стороны реально есть */ - TC_EQ(nright > 0, 1); -} - -/* ОТКРЫТУЮ решётку выталкивание не трогает вовсе (can_bump_into_gate). */ -TC_TEST(open_gate_does_not_push) -{ - uint8_t x, moved = 0; - for (x = 130; x <= 162; x++) - if (push_from_dir(x, 188, 0) != 0) moved++; - TC_EQ(moved, 0); -} - -int main(void) -{ - sc_init(); - TC_RUN(open_gate_is_not_a_wall); - TC_RUN(closed_gate_is_a_wall); - TC_RUN(open_gate_steps_like_floor); - TC_RUN(closing_gate_pushes_kid); - TC_RUN(open_gate_does_not_push); - return 0; -} diff --git a/applications/PoP/roomtest/tests-host/t_geom.c b/applications/PoP/roomtest/tests-host/t_geom.c deleted file mode 100644 index 0702db5..0000000 --- a/applications/PoP/roomtest/tests-host/t_geom.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * t_geom.c — тесты pop_geom.c (геометрия комнаты + PRNG оригинала). - * - * Модуль выбран первым, потому что не тянет за собой ничего: ни графики, - * ни данных уровня, ни клавиатуры — только свой заголовок. - * - * Главный тест здесь — geom_lcg_matches_reference. В pop_geom.c LCG - * оригинала (s = s*214013 + 2531011) написан на ассемблере по схеме - * Горнера ради обхода __mullong, и заявка «бит-в-бит как в SDLPoP» до сих - * пор держалась только на комментарии. Тест сверяет рукописный asm с - * наивной 32-битной формулой на каждом шаге — и по возвращаемому значению, - * и по обеим половинам сида. - */ -#include "tcheck.h" -#include "pop_geom.h" - -/* ---- геометрия ------------------------------------------------------ */ - -TC_TEST(geom_xbump_layout) -{ - /* Шаг колонок равномерный и равен TILE_SIZEX — на этом стоит вся - * арифметика колонок (x_bump[col + FIRST_ONSCREEN_COLUMN]). */ - uint8_t i; - for (i = 1; i < 20; i++) - TC_EQ(pop_x_bump[i] - pop_x_bump[i - 1], TILE_SIZEX); - - /* Центр тайла колонки 0 — та самая величина, которую кладут в Char.x - * do_startpos и pos_guards (seg003). */ - TC_EQ(pop_x_bump[0 + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX, 72); - TC_EQ(pop_x_bump[9 + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX, 198); -} - -TC_TEST(geom_yland_rows) -{ - /* y_land[row + 1]; [0] — ряд «над комнатой». */ - TC_EQ(pop_y_land[0], -8); - TC_EQ(pop_y_land[1], 55); - TC_EQ(pop_y_land[2], 118); - TC_EQ(pop_y_land[3], 181); - TC_EQ(pop_y_land[4], 244); - /* Шаг между рядами — TILE_SIZEY. */ - TC_EQ(pop_y_land[2] - pop_y_land[1], TILE_SIZEY); - TC_EQ(pop_y_land[3] - pop_y_land[2], TILE_SIZEY); -} - -TC_TEST(geom_y_to_row) -{ - /* Пол каждого ряда должен давать номер этого ряда. */ - TC_EQ(pop_y_to_row(pop_y_land[1]), 0); - TC_EQ(pop_y_to_row(pop_y_land[2]), 1); - TC_EQ(pop_y_to_row(pop_y_land[3]), 2); - /* Ряд над комнатой. */ - TC_EQ(pop_y_to_row(pop_y_land[0]), -1); - /* Оборот mod 4: ряд «под комнатой» сворачивается обратно в -1 — - * ровно на это опирается спавн падающего куска у нижней кромки. */ - TC_EQ(pop_y_to_row(pop_y_land[4]), -1); -} - -/* Цепочка сравнений в pop_y_to_row обязана совпадать с ИСХОДНОЙ формулой - * `(y + 60) / 63 % 4 - 1` во всём рабочем диапазоне — включая усечение - * деления К НУЛЮ для отрицательных. Тест держит инвариант: вызовы - * разбросаны по банкам (pop_map, pop_bg, pop_room), и соблазн написать - * деление «по месту» возвращается. */ -TC_TEST(geom_y_to_row_matches_formula) -{ - int16_t y; - /* −400..400 с запасом накрывает всё: кусок loose стартует у потолка - * (ряд −1) и улетает ниже поля в комнату снизу. */ - for (y = -400; y <= 400; y++) { - int16_t t = (int16_t)(y + 60); - TC_EQ(pop_y_to_row(y), (int8_t)(t / 63 % 4 - 1)); - } -} - -/* calc_screen_x_coord (seg008:2602) считается в pop_cdraw.c таблицей SCRX7 - * (банк 4, сюда не линкуется): хранится x/7 байтом, результат = x + SCRX7[..]. - * Таблица сгенерирована питоном, поэтому проверяем два правила, на которых - * держится генерация — ИМЕННО на целевом компиляторе: - * 1) тождество 8x/7 == x + x/7 (7x делится нацело); - * 2) усечение К НУЛЮ, а не к минус бесконечности. - * Округляй SDCC иначе — вся отрицательная половина уехала бы на пиксель, и - * поймалось бы это только глазами на левой кромке комнаты. */ -TC_TEST(geom_mul8div7_table_rules) -{ - int16_t x; - /* Полный диапазон obj_x по данным кадров: −416..695 (см. шапку scr_x). */ - for (x = -448; x <= 703; x++) { - int16_t want = (int16_t)(((x < 0) ? -x : x) * 8 / 7); - if (x < 0) want = (int16_t)-want; - TC_EQ((int16_t)(x * 8 / 7), want); /* усечение к нулю */ - TC_EQ((int16_t)(x * 8 / 7), (int16_t)(x + x / 7)); /* тождество */ - } -} - -/* ---- PRNG: сверка asm-LCG с эталонной формулой ---------------------- */ - -#if POP_PRANDOM_EXACT - -#define LCG_ITERS 128 - -TC_TEST(geom_lcg_matches_reference) -{ - pop_rnd_t s; - unsigned long ref = 12345UL; /* произвольный ненулевой старт */ - uint16_t i, got, want; - - pop_prandom_set(s, 12345u); - - for (i = 0; i < LCG_ITERS; i++) { - got = pop_prandom(&s, 255u); - ref = ref * 214013UL + 2531011UL; - want = (uint16_t)((uint16_t)(ref >> 16) % 256u); - - /* Обрываемся на первом расхождении: иначе одна ошибка в умножении - * забила бы весь буфер отчёта однотипными строками. */ - if (got != want || - s.lo != (uint16_t)ref || - s.hi != (uint16_t)(ref >> 16)) { - TC_EQ(got, want); - TC_EQ(s.lo, (uint16_t)ref); - TC_EQ(s.hi, (uint16_t)(ref >> 16)); - break; - } - } - TC_EQ(i, LCG_ITERS); /* прошли всю дистанцию без расхождений */ -} - -TC_TEST(geom_lcg_seed_zero) -{ - /* Ноль — законный сид (кладку сеют номером комнаты + ряд + колонка, - * что вполне даёт 0). У LCG ноль не является неподвижной точкой — - * убеждаемся, что asm это воспроизводит. */ - pop_rnd_t s; - unsigned long ref = 0UL; - pop_prandom_set(s, 0u); - pop_prandom(&s, 255u); - ref = ref * 214013UL + 2531011UL; - TC_EQ(s.lo, (uint16_t)ref); - TC_EQ(s.hi, (uint16_t)(ref >> 16)); -} - -#endif /* POP_PRANDOM_EXACT */ - -TC_TEST(geom_prandom_range) -{ - /* Оба генератора обязаны укладываться в 0..maxv, в том числе когда - * maxv+1 НЕ степень двойки (там другая ветка pop_rnd_fit). */ - pop_rnd_t s; - uint16_t i, v, seen_hi = 0; - - uint16_t out_of_range = 0; - - pop_prandom_set(s, 1u); - for (i = 0; i < 200; i++) { - v = pop_prandom(&s, 4u); /* n = 5, не степень двойки */ - if (v > 4) out_of_range++; - if (v == 4) seen_hi = 1; - } - TC_EQ(out_of_range, 0); - TC_TRUE(seen_hi); /* верхняя граница достижима */ - - pop_prandom_set(s, 7u); - out_of_range = 0; - for (i = 0; i < 64; i++) { - v = pop_prandom(&s, 1u); /* n = 2, маска */ - if (v > 1) out_of_range++; - } - TC_EQ(out_of_range, 0); -} - -int main(void) -{ - TC_RUN(geom_xbump_layout); - TC_RUN(geom_yland_rows); - TC_RUN(geom_y_to_row); - TC_RUN(geom_y_to_row_matches_formula); - TC_RUN(geom_mul8div7_table_rules); -#if POP_PRANDOM_EXACT - TC_RUN(geom_lcg_matches_reference); - TC_RUN(geom_lcg_seed_zero); -#endif - TC_RUN(geom_prandom_range); - return 0; -} diff --git a/applications/PoP/roomtest/tests-host/t_grab.c b/applications/PoP/roomtest/tests-host/t_grab.c deleted file mode 100644 index 0d64355..0000000 --- a/applications/PoP/roomtest/tests-host/t_grab.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * t_grab.c — прыжок с места через провал в три тайла с зацепом за дальнюю - * кромку (уровень 2, комната 9: Кид на краю (1,1) прыгает и должен - * повиснуть на (1,5)). - * - * Зачем отдельный набор. Трюк требует точной фазы и вручную выходит далеко - * не всегда — в SDLPoP тоже. Поэтому проверяем не «получилось с первого - * раза», а то, что действительно важно: **окно существует и достижимо**. - * Разница между «сложно» и «невозможно» — это разница между «так в - * оригинале» и «баг у нас», и глазами в MAME её не различить. - * - * Два утверждения: - * 1. есть хотя бы одна стартовая X, из которой зацеп удаётся; - * 2. короткий шаг (Shift+вперёд) приводит Кида В ЭТО окно — иначе окно - * было бы недостижимо для игрока, что равно его отсутствию. - * - * При провале в отчёт уходит карта исходов по всей ширине плиты: - * G — зацепился, L — приземлился на дальнюю плиту, . — сорвался. - * - * Механику зацепа задаёт check_grab (seg006:0A28): она работает ТОЛЬКО на - * кадрах 102..105 (начало падения) и только при зажатом Shift. mininim, - * для сравнения, разрешает повиснуть прямо в дуге прыжка (kid-jump.c, - * кадры 7..10) — но это переработка, а не порт, и источник истины у нас - * SDLPoP. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" - -#define E 0 -#define F 1 -#define P 3 -#define W 20 - -/* Уровень 2, комната 9, ряд 1: факел(0), кнопка(1), провал(2,3,4), - * колонна(5). Ряд 2 под провалом пуст — падение уходит из комнаты. */ -static const uint8_t room9[30] = { - E, E, E, E, E, W, W, W, W, W, - F, F, E, E, E, P, F, F, F, P, - W, W, E, E, E, P, F, W, W, W, -}; - -/* Судить по curr_row нельзя: у улетающего вниз Кида ряд заворачивается - * (0,1,2,0,…), и падение выглядит как «остался наверху». Надёжный признак - * — ДЕЙСТВИЕ: 2 = вис/подтягивание, 6 = вис у стены. */ -#define ACT_STAND 0 -#define ACT_RUN_JUMP 1 -#define ACT_HANG_CLIMB 2 -#define ACT_HANG_STRAIGHT 6 - -#define X_LO 76 -#define X_HI 99 - -static char probe(uint8_t x, uint8_t k1, uint8_t k2) -{ - uint8_t i; - sc_room(room9, 9); - sc_kid_at_x(1, 1, x, 0 /* лицом вправо */); - sc_trace_clear(); - sc_run(k1, 4); /* фаза 1: ↑+вперёд — прыжок с места */ - sc_run(k2, 26); /* фаза 2: Shift — попытка зацепа */ - - for (i = 0; i < sc_len; i++) { - uint8_t a = sc_trace[i].action; - if (a == ACT_HANG_CLIMB || a == ACT_HANG_STRAIGHT) return 'G'; - } - i = sc_len ? (uint8_t)(sc_len - 1) : 0; - if (sc_trace[i].col >= 5 && - (sc_trace[i].action == ACT_STAND || sc_trace[i].action == ACT_RUN_JUMP)) - return 'L'; - return '.'; -} - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} - -static void puts_(const char *s) { while (*s) put(*s++); } - -/* Карта исходов — только когда что-то сломалось: по ней сразу видно, - * окно съехало или исчезло. */ -static void dump_map(const char *tag, uint8_t k1, uint8_t k2) -{ - uint8_t x; - puts_(tag); - for (x = X_LO; x <= X_HI; x++) put(probe(x, k1, k2)); - put('\n'); -} - -/* Куда встаёт Кид после n-го короткого шага от x0. */ -static uint8_t step_x(uint8_t x0, uint8_t nsteps) -{ - uint8_t n, fx = x0; - sc_room(room9, 9); - sc_kid_at_x(1, 1, x0, 0); - for (n = 0; n < nsteps; n++) { - sc_trace_clear(); - sc_run(SC_SHIFT | SC_R, 4); /* шаг = нажатие, не удержание */ - sc_run(0, 6); /* отпустить, дать доиграть */ - if (sc_len) fx = sc_trace[sc_len - 1].x; - } - return fx; -} - -TC_TEST(grab_window_exists) -{ - uint8_t x, n = 0, lo = 0, hi = 0; - for (x = X_LO; x <= X_HI; x++) - if (probe(x, SC_U | SC_R, SC_SHIFT) == 'G') { - if (!n) lo = x; - hi = x; - n++; - } - /* Окно обязано существовать: без него трюк непроходим в принципе, а - * уровень 2 без него не пройти. */ - TC_TRUE(n > 0); - if (!n) { - dump_map("no-window: ", SC_U | SC_R, SC_SHIFT); - } else { - /* Границы фиксируем: если поедут — это осознанное изменение физики, - * а не случайность. */ - TC_EQ(lo, 91); - TC_EQ(hi, 95); - } -} - -TC_TEST(grab_window_reachable_by_safe_step) -{ - /* Игрок доходит до кромки короткими шагами. Если они не попадают в - * окно, существование окна ничего не стоит. */ - TC_EQ(step_x(80, 1), 91); - TC_EQ(step_x(80, 2), 95); -} - -TC_TEST(grab_same_for_all_key_patterns) -{ - /* Живой игрок держит «вперёд» и жмёт Shift по-разному. Исход не должен - * зависеть от того, отпущена ли стрелка и когда нажат Shift. */ - uint8_t x; - for (x = X_LO; x <= X_HI; x++) { - char a = probe(x, SC_U | SC_R, SC_SHIFT); - char b = probe(x, SC_U | SC_R, SC_SHIFT | SC_R); - char c = probe(x, SC_U | SC_R | SC_SHIFT, SC_SHIFT | SC_R); - TC_EQ(b, a); - TC_EQ(c, a); - } -} - -/* ---- Спуск через НИЖНЮЮ КРОМКУ комнаты (BUG-GRAB-SEAM-DOWN) ---------- * - * Уровень 7, комната 14 — по ней уровень и проходят: Кид на ряду 0 висит на - * кромке кнопки (0,2), отпускает и в падении должен зацепиться за кромку - * (2,2). Тайл-цель лежит В НИЖНЕМ ряду, то есть в момент зацепа персонаж - * уже НИЖЕ комнаты — в оригинале это curr_row == 3, а get_tile для него - * уходит по links.down в комнату снизу (find_room_of_tile, seg006:005D). - * - * Пока do_fall не пускал ряд дальше 2, check_grab на этом отрезке не звался - * НИ РАЗУ: Кид пролетал мимо кромки, набирал fall_y > 32, и дальше окно - * зацепа было закрыто уже по скорости — спуск становился непроходимым. - * Тест держит именно это: окно существует и достижимо. */ -#define C 6 /* closer */ -#define O 15 /* opener */ - -static const uint8_t room14[30] = { - C, F, O, E, E, E, E, E, F, F, - W, W, W, E, E, E, E, E, W, W, - F, F, P, E, E, E, E, E, W, W, -}; -static const uint8_t room15[30] = { - W, W, W, E, E, E, E, E, W, W, - F, F, P, E, E, E, E, E, W, W, - W, W, W, E, E, E, E, E, W, W, -}; -/* Ряд 2 комнаты 14 = «ряд −1» комнаты 15 (pop_map_set_above): после перехода - * зацеп продолжает целиться в ту же кромку, уже как в потолок. */ -static uint8_t above14[10]; - -#define ACT_MIDAIR 3 -#define ACT_FREEFALL 4 - -static uint8_t went_below; /* Kid уже пересёк нижнюю границу комнаты 14 */ - -/* Один кадр + переход в комнату снизу — ровно то, что делает главный цикл - * roomtest.c по pop_fell_out (enter_room(down) + exit_room_timer). */ -static void step14(uint8_t keys) -{ - sc_trace_clear(); /* трасса тут не нужна, важен исход */ - sc_run(keys, 1); - if (pop_fell_out) { - uint8_t i; - pop_fell_out = 0; - went_below = 1; - for (i = 0; i < 10; i++) above14[i] = room14[20 + i]; - sc_room(room15, 15); - pop_map_set_edges(0, 0, 14, 0); /* сверху — комната 14 */ - pop_map_set_above(above14); - pop_leave_timer = 2; - } -} - -/* Исход попытки: - * 'G' — повис на НИЖНЕЙ кромке (то, ради чего тест: ряд 2 комнаты 14); - * 'U' — зацепился обратно за ту кромку, с которой сорвался (ряд 0) — - * это другой, всегда работавший случай, и засчитывать его нельзя; - * '.' — пролетел мимо; 'x' — так и не сорвался (проба не состоялась). */ -static char probe_down(uint8_t x, uint8_t delay) -{ - uint8_t i; - sc_room(room14, 14); - pop_map_set_edges(0, 0, 0, 15); /* links комнаты 14: снизу — 15 */ - pop_map_set_above(0); - pop_leave_timer = 0; - pop_fell_out = 0; - went_below = 0; - /* Лицом ВЛЕВО у правой кромки кнопки: обрыв позади — это и есть поза - * спуска (pop_down_action, seg005:482). */ - sc_kid_at_x(2, 0, x, -1); - - /* ↓ + Shift — спуск с уступа (pop_down_action, seq_68) и вис на кромке. - * Shift держим, иначе Кид сорвётся, не успев повиснуть. */ - for (i = 0; i < 30; i++) { - step14(SC_D | SC_SHIFT); - if (Kid.action == ACT_HANG_CLIMB || Kid.action == ACT_HANG_STRAIGHT) break; - } - if (Kid.action != ACT_HANG_CLIMB && Kid.action != ACT_HANG_STRAIGHT) return 'x'; - /* отпустить Shift — сорваться с виса (hang_fall, seg005) */ - for (i = 0; i < 12; i++) { - step14(0); - if (Kid.action == ACT_MIDAIR || Kid.action == ACT_FREEFALL) break; - } - if (Kid.action != ACT_MIDAIR && Kid.action != ACT_FREEFALL) return 'x'; - - for (i = 0; i < delay; i++) step14(0); /* пауза перед Shift */ - for (i = 0; i < 30; i++) { - step14(SC_SHIFT); - if (Kid.action == ACT_HANG_CLIMB || Kid.action == ACT_HANG_STRAIGHT) { - if (!went_below) return 'U'; - /* За ЧТО взялся: после перехода вниз ряд 0 = кромка ряда 2 - * комнаты 14 (наша цель), ряд 2 = кромка ряда 1 комнаты 15 - * (этажом ниже — этот случай работал и раньше). */ - return Kid.curr_row == 0 ? 'G' : 'g'; - } - } - return '.'; -} - -#define XD_LO 90 -#define XD_HI 113 - -#define XD_DELAY_MAX 8 - -TC_TEST(grab_below_room_edge_window_exists) -{ - uint8_t x, d, n = 0, n0 = 0; - for (x = XD_LO; x <= XD_HI; x++) - for (d = 0; d <= XD_DELAY_MAX; d++) - if (probe_down(x, d) == 'G') { n++; if (!d) n0++; } - TC_TRUE(n > 0); - /* И играбельность: зацеп обязан удаваться при самом естественном вводе — - * отпустил вис и сразу зажал Shift (d = 0). Окно, доступное только с - * точной задержкой, для игрока почти равно отсутствующему. */ - TC_TRUE(n0 > 0); - if (!n) { /* карта исходов: строка = задержка Shift */ - uint8_t i; - for (i = 0; i <= XD_DELAY_MAX; i++) { - put('d'); put((char)('0' + i)); put(':'); put(' '); - for (x = XD_LO; x <= XD_HI; x++) put(probe_down(x, i)); - put('\n'); - } - } -} - -int main(void) -{ - sc_init(); - TC_RUN(grab_window_exists); - TC_RUN(grab_window_reachable_by_safe_step); - TC_RUN(grab_same_for_all_key_patterns); - TC_RUN(grab_below_room_edge_window_exists); - return 0; -} diff --git a/applications/PoP/roomtest/tests-host/t_jaffar.c b/applications/PoP/roomtest/tests-host/t_jaffar.c deleted file mode 100644 index 08bf622..0000000 --- a/applications/PoP/roomtest/tests-host/t_jaffar.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - * t_jaffar — спецсобытия УРОВНЯ 13: встреча с Джафаром, победа, выход и - * три исключения loose-механики (падающая гряда плит). - * - * Своего ИИ у Джафара нет — это обычный страж (seg002:085A), поэтому - * проверять тут нечего кроме СОБЫТИЙ и ветвлений по номеру уровня. А - * именно они и опасны: три из них — это `if (level == 13)` посреди чужого - * кода (тряска плит, удар плитой в беге, «страж не встаёт в стойку»), и - * сломать их можно правкой, вообще не думая про 13-й уровень. - * - * Порт: seg002:0544 meet_Jaffar, seg002:0517 Jaffar_exit, - * seg006:1927 on_guard_killed, seg000:1317 check_fall_flo, - * seg007:823/949 исключения animate_loose/loose_make_shake. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define L 11 /* loose */ -#define W 20 /* wall */ - -/* Комната с полом внизу и грядой loose в ряду 2 — она же будет играть роль - * «комнаты сверху» для check_fall_flo. */ -static const uint8_t room_loose[30] = { - F, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - F, F, L, L, L, L, L, L, F, F, -}; - -/* Комната, в которую Кид входит снизу: ровный пол во всех рядах. */ -static const uint8_t room_flat[30] = { - F, F, F, F, F, F, F, F, F, F, - F, F, F, F, F, F, F, F, F, F, - F, F, F, F, F, F, F, F, F, F, -}; - -static uint8_t above_row[10]; - -static void scene_level13(uint8_t room) -{ - pop_guard_reset(); - pop_current_level = JAFFAR_LEVEL; - pop_leveldoor_open = 0; - pop_guard_notice_timer = 0; - sc_room(room_flat, room); - sc_kid_at(1, 2, 1); - tk_log_clear(); -} - -/* ---- meet_Jaffar ----------------------------------------------------- */ - -TC_TEST(jaffar_notice_timer_set_leaving_room3_right) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = JAFFAR_MEET_ROOM; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, JAFFAR_NOTICE_TIME); -} - -/* Дверь уровня уже открыта — значит Джафар мёртв и Кид возвращается. - * Второй форы не даётся. */ -TC_TEST(jaffar_notice_not_given_after_victory) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = JAFFAR_MEET_ROOM; - pop_leveldoor_open = 2; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -TC_TEST(jaffar_notice_not_given_from_other_room) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = (uint8_t)(JAFFAR_MEET_ROOM + 1); - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -TC_TEST(jaffar_notice_is_level_gated) -{ - scene_level13(JAFFAR_MEET_ROOM); - pop_current_level = 12; - Kid.room = JAFFAR_MEET_ROOM; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -/* Счётчик убывает по кадру и останавливается на нуле. */ -TC_TEST(jaffar_notice_timer_counts_down) -{ - uint8_t i; - pop_united_shadow = 0; - pop_guard_notice_timer = 3; - for (i = 0; i < 5; i++) pop_frame_timers(); - TC_EQ(pop_guard_notice_timer, 0); -} - -/* ---- Джафар ЖДЁТ, пока идёт фора ------------------------------------- */ - -/* Поднять соперника с УБРАННЫМ мечом в одном ряду с Кидом и «показать» его: - * дальше решение принимает autocontrol_guard_inactive. */ -static void jaffar_faces_kid(void) -{ - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = 0; - can_guard_see_kid = 2; - is_guard_notice = 0; -} - -TC_TEST(jaffar_holds_still_while_notice_timer_runs) -{ - uint8_t i; - scene_level13(1); - jaffar_faces_kid(); - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; - for (i = 0; i < 6; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - /* Стойку не сменил: меч так и в ножнах. */ - TC_EQ(Guard.sword, 0); -} - -/* Фора кончилась — обычное поведение стража возвращается. */ -TC_TEST(jaffar_draws_sword_after_notice_timer) -{ - uint8_t i; - scene_level13(1); - jaffar_faces_kid(); - pop_guard_notice_timer = 0; - for (i = 0; i < 12; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - TC_EQ(Guard.sword, SWORD_2_DRAWN); -} - -/* На прочих уровнях таймер ни на что не влияет: условие в оригинале - * двойное (`level != 13 || timer == 0`), и потерять первую половину легко. */ -TC_TEST(jaffar_notice_timer_ignored_on_other_levels) -{ - uint8_t i; - scene_level13(1); - pop_current_level = 12; - jaffar_faces_kid(); - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; - for (i = 0; i < 12; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - TC_EQ(Guard.sword, SWORD_2_DRAWN); -} - -/* ---- победа и выход --------------------------------------------------- */ - -/* Смерть Джафара не открывает дверь, а ставит флаг «выход разрешён». */ -TC_TEST(jaffar_death_opens_the_exit_flag) -{ - scene_level13(1); - /* charid у Джафара обычный: своим charid оригинал метит только скелета - * (enter_guard, seg002:196), а визиря отличают спрайты и события. */ - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = SWORD_2_DRAWN; - guardhp_curr = 0; /* последнее HP только что снято */ - pop_flash_time = 0; - pop_guard_tick(); - TC_EQ(pop_leveldoor_open, 2); - TC_EQ(pop_flash_time, JAFFAR_FLASH_TIME); - TC_EQ(pop_flash_color, POP_FLASH_WHITE); -} - -/* На других уровнях смерть стража флага не ставит (иначе дверь открывалась - * бы от любого убитого). */ -TC_TEST(jaffar_death_flag_is_level_gated) -{ - scene_level13(1); - pop_current_level = 12; - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = SWORD_2_DRAWN; - guardhp_curr = 0; - pop_guard_tick(); - TC_EQ(pop_leveldoor_open, 0); -} - -/* Уход ВЛЕВО при поднятом флаге жмёт кнопку комнаты 24. */ -TC_TEST(jaffar_exit_presses_button_in_room24) -{ - scene_level13(1); - tk_room_fg[JAFFAR_EXIT_ROOM][JAFFAR_EXIT_TILEPOS] = 15; /* opener */ - pop_leveldoor_open = 2; - tk_log_clear(); - pop_jaffar_exit(); - TC_TRUE(tk_log_count(TK_BUTTON) >= 1); -} - -TC_TEST(jaffar_exit_silent_before_victory) -{ - scene_level13(1); - tk_room_fg[JAFFAR_EXIT_ROOM][JAFFAR_EXIT_TILEPOS] = 15; - pop_leveldoor_open = 0; - tk_log_clear(); - pop_jaffar_exit(); - TC_EQ(tk_log_count(TK_BUTTON), 0); -} - -/* ---- три исключения loose-механики ----------------------------------- */ - -/* Сотрясение (приземление Кида) на 13-м уровне плиты НЕ трясёт: иначе оно - * сбило бы им отложенный старт, и гряда посыпалась бы разом. */ -TC_TEST(jaffar_knock_does_not_shake_tiles) -{ - scene_level13(1); - sc_room(room_loose, 1); - sc_kid_at(1, 2, 1); - Kid.curr_row = 2; - pop_loadkid(); - knock = -1; /* KNOCK_DOWN: ряд Кида */ - pop_check_knock(); - TC_EQ(pop_loose_modif[22], 0); - TC_EQ(pop_loose_modif[27], 0); -} - -/* А на прочих уровнях трясёт — контроль, что выключен именно 13-й. */ -TC_TEST(jaffar_knock_still_shakes_on_other_levels) -{ - scene_level13(1); - pop_current_level = 12; - sc_room(room_loose, 1); - sc_kid_at(1, 2, 1); - Kid.curr_row = 2; - pop_loadkid(); - knock = -1; - pop_check_knock(); - TC_EQ(pop_loose_modif[22], 0x80); -} - -/* Фаза с ОТРИЦАТЕЛЬНЫМ стартом на 13-м уровне не гасится, а досчитывает - * до провала: это и есть падающая гряда. Проверяем на плите ПОЛА (тот же - * код, что у плит-потолков, но без mob-обвязки, которая в набор не - * линкуется). */ -TC_TEST(jaffar_negative_phase_counts_through_to_fall) -{ - uint8_t i; - scene_level13(1); - sc_room(room_loose, 1); - sc_kid_at(1, 0, 1); - pop_loose_modif[22] = (uint8_t)-4; /* старт «через 4 кадра» */ - /* 4 кадра — на выход из отрицательной зоны, дальше 10 — обычный отсчёт; - * 30 с запасом. Ванильная ветка «тряска кончилась» обнулила бы фазу на - * первом же кадре, и плита осталась бы стоять. */ - for (i = 0; i < 30; i++) pop_loose_tick(); - TC_EQ(pop_tile_at(2, 2), 0); /* провалилась: тайл стал пустым */ -} - -/* На прочих уровнях та же фаза читается как тряска и гаснет — плита цела. */ -TC_TEST(jaffar_negative_phase_is_shake_on_other_levels) -{ - uint8_t i; - scene_level13(1); - pop_current_level = 12; - sc_room(room_loose, 1); - sc_kid_at(1, 0, 1); - pop_loose_modif[22] = (uint8_t)-4; - for (i = 0; i < 30; i++) pop_loose_tick(); - TC_EQ(pop_tile_at(2, 2), L); - TC_EQ(pop_loose_modif[22], 0); -} - -/* ---- check_fall_flo --------------------------------------------------- */ - -/* Вход в комнату 23: шести плитам ряда 2 комнаты СВЕРХУ раздаётся - * отрицательная фаза, остальным — ничего. */ -static void fall_flo_scene(uint8_t room) -{ - uint8_t i; - scene_level13(room); - for (i = 0; i < 10; i++) above_row[i] = room_loose[20 + i]; - pop_map_set_above(above_row); - pop_map_set_edges(0, 0, 1 /* up */, 0); - pop_map_set_above(above_row); - pop_loose_reset(); -} - -TC_TEST(jaffar_fall_flo_seeds_the_row_above) -{ - uint8_t c, seeded = 0; - fall_flo_scene(POP_LOOSE_TILES_ROOM1); - pop_check_fall_flo(); - for (c = 2; c <= 7; c++) - if ((int8_t)pop_ceil_modif[c] < 0) seeded++; - TC_EQ(seeded, 6); - /* Колонки вне диапазона 2..7 не тронуты (там в комнате пол, не loose). */ - TC_EQ(pop_ceil_modif[0], 0); - TC_EQ(pop_ceil_modif[9], 0); -} - -TC_TEST(jaffar_fall_flo_ignores_other_rooms) -{ - uint8_t c; - fall_flo_scene((uint8_t)(POP_LOOSE_TILES_ROOM1 + 1)); - pop_check_fall_flo(); - for (c = 0; c < 10; c++) TC_EQ(pop_ceil_modif[c], 0); -} - -TC_TEST(jaffar_fall_flo_is_level_gated) -{ - uint8_t c; - fall_flo_scene(POP_LOOSE_TILES_ROOM2); - pop_current_level = 12; - pop_check_fall_flo(); - for (c = 0; c < 10; c++) TC_EQ(pop_ceil_modif[c], 0); -} - -/* Повторный вход не перебивает уже идущий отсчёт (иначе гряда «зависала» - * бы, пока игрок бегает туда-сюда). */ -TC_TEST(jaffar_fall_flo_does_not_restart_running_countdown) -{ - fall_flo_scene(POP_LOOSE_TILES_ROOM2); - pop_ceil_modif[3] = 5; /* плита уже падает */ - pop_check_fall_flo(); - TC_EQ(pop_ceil_modif[3], 5); -} - -void main(void) -{ - sc_init(); - TC_RUN(jaffar_notice_timer_set_leaving_room3_right); - TC_RUN(jaffar_notice_not_given_after_victory); - TC_RUN(jaffar_notice_not_given_from_other_room); - TC_RUN(jaffar_notice_is_level_gated); - TC_RUN(jaffar_notice_timer_counts_down); - TC_RUN(jaffar_holds_still_while_notice_timer_runs); - TC_RUN(jaffar_draws_sword_after_notice_timer); - TC_RUN(jaffar_notice_timer_ignored_on_other_levels); - TC_RUN(jaffar_death_opens_the_exit_flag); - TC_RUN(jaffar_death_flag_is_level_gated); - TC_RUN(jaffar_exit_presses_button_in_room24); - TC_RUN(jaffar_exit_silent_before_victory); - TC_RUN(jaffar_knock_does_not_shake_tiles); - TC_RUN(jaffar_knock_still_shakes_on_other_levels); - TC_RUN(jaffar_negative_phase_counts_through_to_fall); - TC_RUN(jaffar_negative_phase_is_shake_on_other_levels); - TC_RUN(jaffar_fall_flo_seeds_the_row_above); - TC_RUN(jaffar_fall_flo_ignores_other_rooms); - TC_RUN(jaffar_fall_flo_is_level_gated); - TC_RUN(jaffar_fall_flo_does_not_restart_running_countdown); -} diff --git a/applications/PoP/roomtest/tests-host/t_mouse.c b/applications/PoP/roomtest/tests-host/t_mouse.c deleted file mode 100644 index f3deb63..0000000 --- a/applications/PoP/roomtest/tests-host/t_mouse.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * t_mouse — спецсобытие уровня 8: МЫШЬ (do_timers seg003:0545, - * do_mouse seg003:0ABA, autocontrol_mouse seg002:07EB). - * - * Единственный набор, куда линкуется guards.c: проверяется не физика (её - * держат t_phys/t_char), а связка «условие запуска → рождение → ИИ → - * нажатие кнопки → уход». Всё это ветки по charid внутри общего кода - * соперника, и сломать их можно, ничего не трогая в самой мыши. - * - * Кадр соперника здесь полный, с ИИ — pop_guard_tick() + pop_guard_phys_tick(), - * как в главном цикле; sc_guard_run для этого не годится (он намеренно без ИИ). - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" /* pop_current_level (под тестом — из stubs.c) */ -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define O 15 /* opener */ -#define W 20 /* wall */ - -/* Верхний ряд комнаты 16 в упрощённом виде: сплошной пол и кнопка на - * колонке 7 — там же, где она стоит в данных уровня 8. Провал колонок - * 4..6 намеренно засыпан: он мешает Киду, а не мыши, и в тест на ИИ - * притащил бы падение соперника. */ -static const uint8_t room_mouse[30] = { - F, F, F, F, F, F, F, O, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Поставить сцену уровня 8: Кид в комнате 16, дверь уровня открыта. */ -static void scene_level8(void) -{ - sc_room(room_mouse, POP_MOUSE_ROOM); - sc_kid_at(1, 0, 1); - Kid.room = POP_MOUSE_ROOM; - pop_guard_reset(); - pop_current_level = POP_MOUSE_LEVEL; - pop_leveldoor_open = 1; - tk_log_clear(); -} - -/* Один полный кадр соперника, как в главном цикле roomtest.c. */ -static void mouse_frame(void) -{ - pop_guard_tick(); - pop_guard_phys_tick(); -} - -/* ---- рождение -------------------------------------------------------- */ - -TC_TEST(mouse_appears_after_delay) -{ - uint16_t i; - scene_level8(); - - /* Счётчик стартует с 1 («дверь открыта») и растёт по кадру, срабатывая - * на значении POP_MOUSE_DELAY — то есть кадров до мыши на два меньше. - * Прогоняем всё, кроме последнего: слот обязан быть ещё пуст. */ - for (i = 0; i < POP_MOUSE_DELAY - 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); - - pop_check_mouse(); /* тот самый кадр */ - TC_EQ(Guard.charid, CHARID_24_MOUSE); - TC_EQ(Guard.x, POP_MOUSE_START_X); - TC_EQ(Guard.curr_row, 0); - TC_EQ(Guard.direction, -1); /* dir_FF_left */ - TC_EQ(guardhp_curr, 1); - TC_EQ(Guard.room, POP_MOUSE_ROOM); /* унаследована от Кида (loadkid) */ -} - -/* Счётчик тикает ТОЛЬКО пока Кид в комнате мыши: в оригинале это то же - * условие, что и запуск (Char.room == mouse_room), поэтому 12,5 секунды - * отсчитываются с возвращения игрока, а не с открытия двери. */ -TC_TEST(mouse_timer_frozen_outside_room) -{ - uint16_t i; - scene_level8(); - Kid.room = POP_MOUSE_ROOM + 1; - for (i = 0; i < POP_MOUSE_DELAY * 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); - TC_EQ(pop_leveldoor_open, 1); /* не сдвинулся ни на кадр */ -} - -/* Закрытая дверь уровня — мыши нет вовсе (она подсказка на обратном пути). */ -TC_TEST(mouse_needs_open_leveldoor) -{ - uint16_t i; - scene_level8(); - pop_leveldoor_open = 0; - for (i = 0; i < POP_MOUSE_DELAY * 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); -} - -/* ---- ИИ: пробежала, нажала, ушла ------------------------------------- */ - -/* Родить мышь, не гоняя POP_MOUSE_DELAY пустых кадров. */ -static void spawn_mouse(void) -{ - scene_level8(); - pop_leveldoor_open = POP_MOUSE_DELAY - 1; - pop_check_mouse(); -} - -TC_TEST(mouse_runs_left_and_presses_button) -{ - uint8_t i; - spawn_mouse(); - TC_EQ(Guard.charid, CHARID_24_MOUSE); - - /* Бежит влево: до порога разворота ей ~35 пикселей по 3-5 за кадр. */ - for (i = 0; i < 24; i++) mouse_frame(); - TC_TRUE(Guard.x < POP_MOUSE_START_X); - - /* По дороге наступила на кнопку (0,7) — общий check_press физики - * соперника, тот же, которым кнопки жмут страж и тень. */ - TC_TRUE(tk_log_count(TK_BUTTON) >= 1); -} - -TC_TEST(mouse_turns_back_and_disappears) -{ - uint8_t i; - spawn_mouse(); - - /* 120 кадров с запасом покрывают путь туда (200→166), стойку seq_107 - * (11 кадров) и путь обратно (166→200). */ - for (i = 0; i < 120; i++) { - mouse_frame(); - if (Guard.direction == DIR_56_NONE) break; - } - TC_EQ(Guard.direction, DIR_56_NONE); /* clear_char: ушла со сцены */ - TC_EQ(guardhp_curr, 0); -} - -/* ---- ветки по charid у соседнего кода -------------------------------- */ - -/* Мышь Кида «не видит»: иначе он выхватит на неё меч (seg003:0965). */ -TC_TEST(mouse_is_not_seen_by_kid) -{ - spawn_mouse(); - Guard.curr_row = Kid.curr_row; /* один ряд — условие луча */ - pop_check_can_guard_see_kid(); - TC_EQ(can_guard_see_kid, 0); -} - -/* leave_guard мышь не записывает в данные уровня (seg002:02F5): вернувшись - * в комнату, игрок не должен встретить «стража» с её параметрами. - * Комнату берём из диапазона таблицы заглушки (TK_ROOMS = 8). */ -TC_TEST(mouse_is_not_saved_as_room_guard) -{ - spawn_mouse(); - Guard.room = 1; - tk_gs_tile[0] = 0xEE; /* метка «никто сюда не писал» */ - pop_guard_leave(); - TC_EQ(tk_gs_tile[0], 0xEE); -} - -void main(void) -{ - sc_init(); - TC_RUN(mouse_appears_after_delay); - TC_RUN(mouse_timer_frozen_outside_room); - TC_RUN(mouse_needs_open_leveldoor); - TC_RUN(mouse_runs_left_and_presses_button); - TC_RUN(mouse_turns_back_and_disappears); - TC_RUN(mouse_is_not_seen_by_kid); - TC_RUN(mouse_is_not_saved_as_room_guard); -} diff --git a/applications/PoP/roomtest/tests-host/t_phys.c b/applications/PoP/roomtest/tests-host/t_phys.c deleted file mode 100644 index 143c51c..0000000 --- a/applications/PoP/roomtest/tests-host/t_phys.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * t_phys.c — характеризация физики Кида (pop_map + pop_kid + pop_ctrl). - * - * Назначение набора — СТРАХОВКА ПОД РЕФАКТОРИНГ, а не проверка - * правильности. Эталоны здесь сняты с текущего билда, то есть - * консервируют и текущие баги; правильность по-прежнему проверяется - * против SDLPoP. Смысл в другом: перенос физики с `Kid.` на `Char.` - * обязан быть поведение-сохраняющим, и «трасса до == трасса после» ловит - * ровно тот класс ошибок, который там возможен. - * - * Поэтому при осознанном изменении поведения эталон ПЕРЕСНИМАЕТСЯ (см. - * SC_RECORD ниже), а в коммите должно быть написано, почему трасса - * поменялась. Молча обновлённый эталон обесценивает весь набор. - * - * Снятие эталона: - * make -C applications/PoP/roomtest/tests-host t_phys SC_RECORD=1 - * Трассы уходят в отчёт tcheck готовыми C-строками — вставить в golden_*. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_ctrl.h" -#include "pop_guard.h" /* pop_do_delta_hp — урон сводится дельтой */ - -/* Коды тайлов (pop_map): 0 пусто, 1 пол, 3 колонна, 11 loose, 20 стена. */ -#define E 0 -#define F 1 -#define P 3 -#define L 11 -#define W 20 - -/* Ровный пол во всю комнату: базовая сцена для ходьбы/бега/разворота. */ -static const uint8_t room_flat[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Пол с обрывом после колонки 5: падение с ряда 1 на ряд 2. */ -static const uint8_t room_ledge[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, E, E, E, E, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Проваливающаяся плита на (1,4) — сцена под loose-механику. */ -static const uint8_t room_loose[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, L, F, F, F, F, F, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Провал в ТРИ пустых тайла (колонки 2,3,4) — геометрия из BUG-RJUMP-1 - * (ур. 2, комнаты 1 и 9). Разбег-прыжок влево с колонки 5 обязан - * доставать до колонки 1; у нас Кид сваливается в провал. */ -static const uint8_t room_gap3[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, E, E, E, F, F, F, F, F, - W, F, F, F, F, F, F, F, F, W, -}; - -/* SC_RECORD= — снять эталон СЦЕНАРИЯ n (нумерация в порядке вызовов в - * main). По одному за прогон: лог tcheck 768 байт, на все трассы сразу - * его не хватает. Перебором занимается record_golden.py. */ -#ifndef SC_RECORD -#define SC_RECORD 0 -#endif - -/* Снять или сверить — одной строкой в каждом сценарии, чтобы режимы не - * разъезжались. Имя сценария = имя файла эталона. */ -#if SC_RECORD -static uint8_t sc_idx; -#define SC_CHECK(g, nm) \ - do { if (++sc_idx == (SC_RECORD)) sc_dump(nm); } while (0) -#else -#define SC_CHECK(g, nm) sc_expect((g), (uint8_t)(sizeof(g) / SC_REC_BYTES)) -#endif - -/* ---- эталоны (сняты SC_RECORD=1) ------------------------------------ * - * В режиме снятия эталонов файлов golden/ ещё нет — и не должно быть: - * первый прогон их и порождает. */ -#if !SC_RECORD - -static const uint8_t golden_stand[] = { -#include "golden/stand.h" -}; -static const uint8_t golden_run_right[] = { -#include "golden/run_right.h" -}; -static const uint8_t golden_step_shift[] = { -#include "golden/step_shift.h" -}; -static const uint8_t golden_turn[] = { -#include "golden/turn.h" -}; -static const uint8_t golden_crouch[] = { -#include "golden/crouch.h" -}; -static const uint8_t golden_jump_up[] = { -#include "golden/jump_up.h" -}; -static const uint8_t golden_fall_ledge[] = { -#include "golden/fall_ledge.h" -}; -static const uint8_t golden_loose[] = { -#include "golden/loose.h" -}; -static const uint8_t golden_rjump_gap3[] = { -#include "golden/rjump_gap3.h" -}; - -#else -/* SC_RECORD: имена нужны только чтобы SC_CHECK() раскрылся. */ -#define golden_stand 0 -#define golden_run_right 0 -#define golden_step_shift 0 -#define golden_turn 0 -#define golden_crouch 0 -#define golden_jump_up 0 -#define golden_fall_ledge 0 -#define golden_loose 0 -#define golden_rjump_gap3 0 -#endif - -/* ---- сценарии -------------------------------------------------------- */ - -TC_TEST(phys_stand_is_stable) -{ - /* Никакого ввода: Кид на ровном полу обязан стоять неподвижно. Тест - * дешёвый, но ловит самое обидное — «сам поехал» после правки - * геометрии или окна Char. */ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_trace_clear(); - sc_run(0, 12); - SC_CHECK(golden_stand, "stand"); -} - -TC_TEST(phys_run_right) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 24); - SC_CHECK(golden_run_right, "run_right"); -} - -TC_TEST(phys_step_with_shift) -{ - /* Shift + вперёд — осторожный шаг: одна из самых чувствительных к - * distance_to_edge веток. */ - sc_room(room_flat, 1); - sc_kid_at(3, 1, 0); - sc_trace_clear(); - sc_run(SC_R | SC_SHIFT, 20); - SC_CHECK(golden_step_shift, "step_shift"); -} - -TC_TEST(phys_turn_around) -{ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - sc_trace_clear(); - sc_run(SC_L, 16); - SC_CHECK(golden_turn, "turn"); -} - -TC_TEST(demo_backward_is_not_screen_mirrored) -{ - /* demo_moves уже задаёт forward/backward относительно Кида. На плите - * 0,6 он смотрит вправо, и move=2 обязан начать seq_5 turn, а не - * превратиться через user_control() в seq_1 run вправо к пропасти. */ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - pop_ctrl_auto_move(0); - pop_ctrl_auto_move(2); - /* SEQTBL_BASE+0x01CB — начало seq_5 в исходном kid_data.bin. */ - TC_EQ((uint16_t)(Kid.curr_seq - SEQTBL_BASE), 0x01CB); -} - -TC_TEST(phys_crouch_and_stand_up) -{ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - sc_trace_clear(); - sc_run(SC_D, 8); - sc_run(0, 12); - SC_CHECK(golden_crouch, "crouch"); -} - -TC_TEST(phys_jump_up_nothing_above) -{ - /* Над головой пусто — seq_28; проверяем и смещение по x, которое - * оригинал делает перед прыжком. */ - sc_room(room_flat, 1); - sc_kid_at(4, 1, -1); - sc_trace_clear(); - sc_run(SC_U, 20); - SC_CHECK(golden_jump_up, "jump_up"); -} - -TC_TEST(phys_run_off_ledge) -{ - /* Бег в обрыв: check_on_floor -> start_fall -> land на ряду 2. - * Сценарий, вокруг которого крутился BUG-FALL-SWORD-1. */ - sc_room(room_ledge, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 34); - SC_CHECK(golden_fall_ledge, "fall_ledge"); -} - -TC_TEST(phys_loose_floor_breaks) -{ - /* Пробежка по loose-плите: тайл обязан затрястись и провалиться, а - * физика — сообщить об этом соседям (trob + перерисовка). */ - sc_room(room_loose, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 34); - SC_CHECK(golden_loose, "loose"); -#if !SC_RECORD - /* Журнал заглушек: плита обязана была отвалиться (кусок отрывается — - * pop_loose_mob_spawn) и попросить перерисовку. Это уже не - * характеризация, а содержательная проверка — заглушка-пустышка её не - * дала бы. Пока плита ЖИВЁТ в отрисованной комнате, фазой владеет - * pop_loose_modif, а не trob — поэтому спрашиваем именно про кусок. */ - TC_TRUE(tk_log_count(TK_MOB_SPAWN) > 0); - TC_TRUE(tk_log_count(TK_REDRAW) > 0); -#endif -} - -TC_TEST(phys_loose_survives_room_change) -{ - /* GUARD против бага «плита не успевает провалиться»: Кид расшатал плиту - * и ушёл в соседнюю комнату — отсчёт обязан ПЕРЕЖИТЬ смену комнаты. - * В оригинале терять нечего (loose — обычный trob в общем списке, фаза - * в curr_room_modif); у нас фаза живёт в pop_loose_modif[] текущей - * комнаты, и её сдаёт/забирает пара leave_room + reset. */ - uint8_t pos = 1 * 10 + 4; /* loose-плита сцены room_loose */ - uint8_t phase = 3; /* середина отсчёта до провала (1..10) */ - - /* Саму анимацию проверяет phys_loose_floor_breaks выше; здесь нужна - * ровно передача фазы, поэтому ставим её явно — прогон бы привязал тест - * к тому, на каком кадре Кид добежит до плиты. */ - sc_room(room_loose, 1); - pop_loose_modif[pos] = phase; - - /* Уход из комнаты: фаза уезжает в room_modif + trob... */ - tk_log_clear(); - pop_loose_leave_room(); - TC_TRUE(tk_log_count(TK_TROB) > 0); /* плита сдана в общий список */ - - /* ...и возвращается при входе обратно — а не обнуляется, как раньше. */ - pop_loose_reset(); - TC_EQ(pop_loose_modif[pos], phase); - - /* Старт уровня, наоборот, обязан фазу ЗАБЫТЬ (load_level восстанавливает - * уровень целиком) — иначе дрожь протекала бы в следующую жизнь. */ - pop_loose_forget(); - TC_EQ(pop_loose_modif[pos], 0); -} - -TC_TEST(phys_loose_gate_survives_room_change) -{ - /* GUARD против гейта холостого хода (loose_any, pop_map.c). Гейт - * пропускает оба цикла pop_loose_tick, пока ни одна фаза не взведена, и - * взводится ПЯТЬЮ местами записи. Четыре из них — взвод дрожи от шага и - * сотрясения — уже прогоняет phys_loose_floor_breaks; пятое (фаза - * ВОССТАНОВЛЕНА входом в комнату) не покрывал никто, а именно оно даёт - * самый тихий из возможных отказов: плита, к которой Кид вернулся, - * застыла бы на полудроже навсегда. - * - * Поэтому проверяем не флаг (он статик модуля), а НАБЛЮДАЕМОЕ следствие: - * после возврата в комнату тик обязан ДВИГАТЬ фазу. */ - uint8_t pos = 1 * 10 + 4; /* loose-плита сцены room_loose */ - uint8_t phase = 3; /* середина отсчёта до провала (1..10) */ - - /* Начинаем со снятого гейта: старт уровня забывает все фазы, и ни одно - * место взвода после этого не срабатывает. */ - sc_room(room_loose, 1); - pop_loose_forget(); - pop_loose_tick(); /* холостой проход — гейт снят */ - - /* Плита осталась недодрожавшей в room_modif, Кид возвращается в комнату. */ - pop_loose_modif[pos] = phase; - pop_loose_leave_room(); - pop_loose_reset(); - TC_EQ(pop_loose_modif[pos], phase); - - /* И вот теперь тик обязан её ДВИНУТЬ, а не пропустить по снятому гейту. */ - pop_loose_tick(); - TC_EQ(pop_loose_modif[pos], (uint8_t)(phase + 1)); -} - -TC_TEST(phys_running_jump_over_3tile_gap) -{ - /* BUG-RJUMP-1. Разбег влево от колонки 8, дальше Up — разбег-прыжок. - * Ожидание оригинала: перелёт провала в три тайла и посадка на (1,1). - * Сейчас эталон фиксирует НАШЕ поведение (падение в провал) — когда - * баг починим, трасса поменяется осознанно и эталон переснимется. */ - sc_room(room_gap3, 1); - sc_kid_at(8, 1, -1); - sc_trace_clear(); - sc_run(SC_L, 8); /* разбег */ - sc_run(SC_L | SC_U, 26); /* прыжок и посадка */ - SC_CHECK(golden_rjump_gap3, "rjump_gap3"); -} - -/* Падение с ДВУХ рядов: пол только внизу, Кид стартует на кромке ряда 0. - * В обычном падении это −1 HP (land, seg005:173), под пером — ни урона, ни - * разгона. */ -static const uint8_t room_drop2[30] = { - W, F, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Максимальная скорость падения за прогон и итоговое HP — через сцену не - * видно (в трассу пишется поза), поэтому меряем прямо по Kid. */ -static uint8_t drop2_max_fall_y(uint8_t frames) -{ - uint8_t i, mx = 0; - for (i = 0; i < frames; i++) { - sc_trace_clear(); - sc_run(SC_R, 1); - if ((uint8_t)Kid.fall_y > mx) mx = (uint8_t)Kid.fall_y; - } - return mx; -} - -TC_TEST(phys_feather_fall_is_slow_and_harmless) -{ - uint8_t mx_normal, mx_feather, hp_normal, hp_feather; - - /* (1) как обычно: разгон до FALL_MAX и −1 HP за два ряда */ - sc_room(room_drop2, 1); - sc_kid_at(1, 0, 0); - pop_feather = 0; - mx_normal = drop2_max_fall_y(40); - pop_do_delta_hp(); /* урон копится дельтой, сводит её цикл */ - hp_normal = hitp_curr; - - /* (2) под зельем медленного падения (seg006:057C: ускорение 1, потолок 4; - * seqtbl уводит приземление в ветку stepfloat — без урона) */ - sc_room(room_drop2, 1); - sc_kid_at(1, 0, 0); - pop_feather = 200; - mx_feather = drop2_max_fall_y(40); - pop_do_delta_hp(); - hp_feather = hitp_curr; - pop_feather = 0; - - TC_TRUE(mx_normal > 4); /* обычное падение разгоняется */ - TC_TRUE(mx_feather <= 4); /* под пером потолок скорости — 4 */ - TC_TRUE(hp_normal < 3); /* два ряда обычно стоят HP */ - TC_EQ(hp_feather, 3); /* под пером — целым */ -} - -/* ---- точка входа ----------------------------------------------------- */ - -void main(void) -{ - sc_init(); - TC_RUN(phys_stand_is_stable); - TC_RUN(phys_run_right); - TC_RUN(phys_step_with_shift); - TC_RUN(phys_turn_around); - TC_RUN(demo_backward_is_not_screen_mirrored); - TC_RUN(phys_crouch_and_stand_up); - TC_RUN(phys_jump_up_nothing_above); - TC_RUN(phys_run_off_ledge); - TC_RUN(phys_loose_floor_breaks); - TC_RUN(phys_loose_survives_room_change); - TC_RUN(phys_loose_gate_survives_room_change); - TC_RUN(phys_running_jump_over_3tile_gap); - TC_RUN(phys_feather_fall_is_slow_and_harmless); -} diff --git a/applications/PoP/roomtest/tests-host/t_shadow.c b/applications/PoP/roomtest/tests-host/t_shadow.c deleted file mode 100644 index 2c96934..0000000 --- a/applications/PoP/roomtest/tests-host/t_shadow.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * t_shadow — спецсобытия УРОВНЯ 12: встреча с тенью, общий урон, слияние. - * - * Что здесь проверяется и почему именно тестом, а не прогоном в MAME. Вся - * сцена уровня 12 — это набор УСЛОВИЙ, каждое из которых легко сломать, - * ничего не трогая в самой тени: тайл меча, знак `pop_united_shadow`, - * charid соперника, номер уровня. Проверить их в эмуляторе — значит - * дойти до 12-го уровня и разыграть бой; здесь это шесть вызовов. - * - * Порт: seg002:0064 check_shadow, seg002:0536 sword_disappears, - * seg006:2033 check_killed_shadow, seg000:1518 do_delta_hp, - * seg003:0735 timers, seg006:1063 «появление плит». - * - * Сам ИИ тени (autocontrol_shadow_level12) сюда НЕ вынесен: он решает - * «куда идти», и его исход — траектория, то есть предмет прогона со - * сценой и эталоном, а не одиночной проверки. Набор линкует guards.c - * (как t_mouse), поэтому добавить такой сценарий можно здесь же. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define W 20 /* wall */ -#define S 22 /* sword */ - -/* Комната 15 в объёме, который нужен событию: меч в (0,1), пол под ним. */ -static const uint8_t room15[30] = { - F, S, F, F, F, F, F, F, E, E, - W, W, W, W, W, W, W, W, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Комната 2: верхний ряд с ПРОПАСТЬЮ в колонках 4..6 — те самые плиты, - * которые появляются под ногами после слияния. */ -static const uint8_t room2[30] = { - F, F, F, F, E, E, E, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Общая точка входа: уровень 12, слот соперника пуст, слияния не было. */ -static void scene_level12(void) -{ - uint8_t i; - pop_guard_reset(); - pop_current_level = SHADOW_FIGHT_LEVEL; - pop_united_shadow = 0; - pop_shadow_init = 0; - for (i = 0; i < 30; i++) tk_room_fg[SHADOW_FIGHT_ROOM][i] = room15[i]; - tk_log_clear(); -} - -/* ---- check_shadow: когда тень поднимается ---------------------------- */ - -/* Меч ещё лежит — тени нет. Условие ОБРАТНО уровню 5 (там тень приходит, - * пока зелье на месте), и перепутать их — самая вероятная ошибка порта. */ -TC_TEST(shadow12_waits_until_sword_taken) -{ - scene_level12(); - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 0); - TC_EQ(Guard.charid, 0); -} - -/* Меч подобран — тень падает в комнату (init_shad_12 + seq_7_fall). */ -TC_TEST(shadow12_rises_when_sword_gone) -{ - scene_level12(); - tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS] = F; - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 1); - TC_EQ(Guard.charid, CHARID_1_SHADOW); - TC_EQ(Guard.x, 0x51); - /* y = 232 — НИЖЕ поля (192), и это не ошибка данных: поле беззнаковое, - * тень «падает» из-под комнаты и появляется сверху. А curr_row при - * этом РОВНО ИЗ ТАБЛИЦЫ (0), а не пересчитанный из y (тот дал бы −1): - * do_init_shad копирует семь полей как есть и ряд не трогает. Обе - * величины закреплены тестом — «починить» их выглядит соблазнительно. */ - TC_EQ(Guard.y, 0xE8); - TC_EQ(Guard.curr_row, 0); - TC_EQ(Guard.direction, 0); /* dir_0_right */ - TC_EQ(Guard.room, SHADOW_FIGHT_ROOM); - TC_EQ(guardhp_curr, 4); -} - -/* После слияния тень не поднимается больше НИКОГДА (флаг ушёл в −1). */ -TC_TEST(shadow12_never_rises_after_uniting) -{ - scene_level12(); - tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS] = F; - pop_united_shadow = -1; - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 0); - TC_EQ(Guard.charid, 0); -} - -/* В чужой комнате событие не срабатывает — там поднимается обычный страж - * (возврат 0 = «занимайся слотом сам»). */ -TC_TEST(shadow12_other_room_leaves_slot_alone) -{ - scene_level12(); - TC_EQ(pop_check_shadow((uint8_t)(SHADOW_FIGHT_ROOM - 1)), 0); - TC_EQ(Guard.charid, 0); -} - -/* ---- sword_disappears ------------------------------------------------ */ - -TC_TEST(shadow12_sword_vanishes_leaving_room18) -{ - scene_level12(); - Kid.room = SWORD_GONE_ROOM; - tk_modif[SHADOW_SWORD_TILEPOS] = 5; /* блеск меча */ - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], F); - /* Модификатор гасится вместе с тайлом: ненулевой modif рисует на полу - * «фальшивый» узор (та же причина, что у поднятого зелья). */ - TC_EQ(tk_modif[SHADOW_SWORD_TILEPOS], 0); -} - -TC_TEST(shadow12_sword_stays_leaving_other_room) -{ - scene_level12(); - Kid.room = (uint8_t)(SWORD_GONE_ROOM - 1); - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], S); -} - -/* На других уровнях комната 18 — обычная комната. */ -TC_TEST(shadow12_sword_event_is_level_gated) -{ - scene_level12(); - pop_current_level = 11; - Kid.room = SWORD_GONE_ROOM; - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], S); -} - -/* ---- таймер вспышки -------------------------------------------------- */ - -/* Счётчик досчитывает до нуля и уходит в −1 — «уже слились». Ноль как - * конечное состояние был бы неотличим от «слияния не было». */ -TC_TEST(shadow12_timer_ends_at_minus_one) -{ - pop_united_shadow = 3; - pop_frame_timers(); TC_EQ(pop_united_shadow, 2); - pop_frame_timers(); TC_EQ(pop_united_shadow, 1); - pop_frame_timers(); TC_EQ(pop_united_shadow, -1); - pop_frame_timers(); TC_EQ(pop_united_shadow, -1); /* и больше не меняется */ -} - -TC_TEST(shadow12_timer_idle_when_zero) -{ - pop_united_shadow = 0; - pop_frame_timers(); - TC_EQ(pop_united_shadow, 0); -} - -/* ---- общий урон (do_delta_hp) ---------------------------------------- */ - -static void hp_scene(uint8_t charid, uint8_t level) -{ - scene_level12(); - pop_current_level = level; - Guard.charid = charid; - guardhp_curr = guardhp_max = 4; - hitp_beg_lev = 3; - pop_kid_hp_reset(); - guardhp_delta = -1; - hitp_delta = 0; -} - -/* Ранил тень — ранил себя: урон КОПИРУЕТСЯ, а не делится. */ -TC_TEST(shadow12_damage_is_shared) -{ - hp_scene(CHARID_1_SHADOW, SHADOW_FIGHT_LEVEL); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 2); -} - -TC_TEST(shadow12_damage_not_shared_with_guard) -{ - hp_scene(CHARID_2_GUARD, SHADOW_FIGHT_LEVEL); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 3); -} - -/* Тень уровней 4/5/6 боевой не бывает, но проверка обязана быть по УРОВНЮ, - * а не только по charid: иначе безобидная тень уровня 5 делилась бы HP. */ -TC_TEST(shadow12_damage_not_shared_on_other_level) -{ - hp_scene(CHARID_1_SHADOW, 5); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 3); -} - -/* ---- check_killed_shadow --------------------------------------------- */ - -static void kill_scene(uint8_t charid, int8_t kid_alive, int8_t guard_alive) -{ - scene_level12(); - Guard.charid = charid; - Guard.alive = guard_alive; - guardhp_curr = guardhp_max = 4; - hitp_beg_lev = 3; - pop_kid_hp_reset(); - Kid.charid = CHARID_0_KID; - Kid.alive = kid_alive; - guardhp_delta = hitp_delta = 0; - pop_flash_time = 0; - pop_immortal = 0; -} - -/* Тень мертва — Киду отсчитывается 100 урона, то есть гарантированно всё. */ -TC_TEST(shadow12_killing_shadow_kills_kid) -{ - kill_scene(CHARID_1_SHADOW, -1, 0); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, -3); - TC_TRUE(pop_flash_time != 0); - TC_EQ(pop_flash_color, POP_FLASH_WHITE); -} - -/* И симметрично: смерть Кида добивает тень. */ -TC_TEST(shadow12_killing_kid_kills_shadow) -{ - kill_scene(CHARID_1_SHADOW, 0, -1); - pop_check_killed_shadow(); - TC_EQ(guardhp_delta, -4); -} - -/* Со стражем связи нет — условие оригинала `(charid | charid) == shadow` - * проходит только для пары Кид/тень. */ -TC_TEST(shadow12_kill_link_ignores_guard) -{ - kill_scene(CHARID_2_GUARD, -1, 0); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, 0); - TC_EQ(pop_flash_time, 0); -} - -/* Оба живы — событие молчит (иначе бой убивал бы обоих в первом же кадре). */ -TC_TEST(shadow12_kill_link_silent_while_both_alive) -{ - kill_scene(CHARID_1_SHADOW, -1, -1); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, 0); - TC_EQ(guardhp_delta, 0); -} - -/* ---- «появление плит» ------------------------------------------------ */ - -/* Сцена: Кид стоит в комнате 2 на колонке 4 верхнего ряда — прямо над - * пропастью. До слияния он обязан провалиться, после — достроить пол. */ -static void floors_scene(void) -{ - uint8_t i; - scene_level12(); - for (i = 0; i < 30; i++) tk_room_fg[2][i] = room2[i]; - sc_room(room2, 2); - sc_kid_at(4, 0, 1); - sc_trace_clear(); -} - -TC_TEST(shadow12_floors_appear_after_uniting) -{ - floors_scene(); - pop_united_shadow = -1; - sc_run(0, 2); - /* Не упал: действие осталось стоечным, ряд тот же. */ - TC_EQ(Kid.curr_row, 0); - TC_TRUE(Kid.action != 4); /* actions_4_in_freefall */ - /* Плита появилась И в карте комнаты, И в данных уровня. */ - TC_EQ(pop_tile_at(4, 0), 1); - TC_EQ(tk_room_fg[2][4], 1); - /* Перерисованы две клетки — сама и соседняя справа, на обеих страницах. */ - TC_TRUE(tk_log_count(TK_REDRAW) >= 2); -} - -/* До слияния пропасть остаётся пропастью. */ -TC_TEST(shadow12_floors_hidden_before_uniting) -{ - floors_scene(); - pop_united_shadow = 0; - sc_run(0, 2); - TC_EQ(pop_tile_at(4, 0), 0); - TC_TRUE(Kid.curr_row != 0 || Kid.action == 4); -} - -/* Событие привязано к КОМНАТЕ: в комнате 3 того же уровня пола нет. */ -TC_TEST(shadow12_floors_only_in_their_rooms) -{ - floors_scene(); - pop_united_shadow = -1; - Kid.room = 3; - sc_run(0, 2); - TC_EQ(pop_tile_at(4, 0), 0); -} - -void main(void) -{ - sc_init(); - TC_RUN(shadow12_waits_until_sword_taken); - TC_RUN(shadow12_rises_when_sword_gone); - TC_RUN(shadow12_never_rises_after_uniting); - TC_RUN(shadow12_other_room_leaves_slot_alone); - TC_RUN(shadow12_sword_vanishes_leaving_room18); - TC_RUN(shadow12_sword_stays_leaving_other_room); - TC_RUN(shadow12_sword_event_is_level_gated); - TC_RUN(shadow12_timer_ends_at_minus_one); - TC_RUN(shadow12_timer_idle_when_zero); - TC_RUN(shadow12_damage_is_shared); - TC_RUN(shadow12_damage_not_shared_with_guard); - TC_RUN(shadow12_damage_not_shared_on_other_level); - TC_RUN(shadow12_killing_shadow_kills_kid); - TC_RUN(shadow12_killing_kid_kills_shadow); - TC_RUN(shadow12_kill_link_ignores_guard); - TC_RUN(shadow12_kill_link_silent_while_both_alive); - TC_RUN(shadow12_floors_appear_after_uniting); - TC_RUN(shadow12_floors_hidden_before_uniting); - TC_RUN(shadow12_floors_only_in_their_rooms); -} diff --git a/applications/PoP/roomtest/tests-host/t_timer.c b/applications/PoP/roomtest/tests-host/t_timer.c deleted file mode 100644 index b28ad27..0000000 --- a/applications/PoP/roomtest/tests-host/t_timer.c +++ /dev/null @@ -1,116 +0,0 @@ -/* pop_timer — логические тики, pause/unlimited, читы и QuickSave state. */ -#include -#include "tcheck.h" -#include "pop_timer.h" - -/* Минимальный memory-stream вместо EMM. pop_timer_qsave использует ровно - * u8/u16, поэтому этот stub одновременно проверяет его endian-контракт. */ -static uint8_t stream[3]; -static uint8_t stream_pos; - -void pop_qs_u8(pop_qs_io_t *io, uint8_t *value) -{ - if (io->reading) { - if (io->apply) *value = stream[stream_pos]; - } else { - stream[stream_pos] = *value; - } - ++stream_pos; -} - -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value) -{ - uint8_t lo, hi; - if (io->reading) { - lo = stream[stream_pos++]; hi = stream[stream_pos++]; - if (io->apply) *value = (uint16_t)(lo | ((uint16_t)hi << 8)); - } else { - stream[stream_pos++] = (uint8_t)*value; - stream[stream_pos++] = (uint8_t)(*value >> 8); - } -} - -TC_TEST(timer_starts_and_only_runs_when_allowed) -{ - pop_timer_new_game(); - TC_EQ(pop_timer_minutes, POP_TIMER_START_MINUTES); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(0, 1)); /* Settings: unlimited */ - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(1, 0)); /* pause/HDD/cutscene */ - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - - pop_timer_minutes = 2; - pop_timer_ticks = 2; - TC_FALSE(pop_timer_tick(1, 1)); - TC_EQ(pop_timer_minutes, 2); - TC_EQ(pop_timer_ticks, 1); - TC_FALSE(pop_timer_tick(1, 1)); - TC_EQ(pop_timer_minutes, 1); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); -} - -TC_TEST(timer_expiry_is_one_shot) -{ - pop_timer_minutes = 1; - pop_timer_ticks = 1; - TC_TRUE(pop_timer_tick(1, 1)); - TC_EQ(pop_timer_minutes, 0); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(1, 1)); - TC_FALSE(pop_timer_tick(0, 1)); -} - -TC_TEST(timer_cheats_match_sdlpop_rules) -{ - pop_timer_minutes = 5; - pop_timer_cheat_subtract(); - TC_EQ(pop_timer_minutes, 4); - pop_timer_minutes = 1; - pop_timer_cheat_subtract(); - TC_EQ(pop_timer_minutes, 1); /* minus не создаёт expiry */ - pop_timer_minutes = 0; - pop_timer_cheat_add(); - TC_EQ(pop_timer_minutes, 1); - pop_timer_minutes = 0xFF; - pop_timer_cheat_add(); - TC_EQ(pop_timer_minutes, 0xFF); /* не сворачиваемся в 0 */ -} - -TC_TEST(timer_qsave_restores_exact_state_and_rejects_bad_tick) -{ - pop_qs_io_t io; - - pop_timer_minutes = 42; - pop_timer_ticks = 103; - stream_pos = 0; - io.reading = io.apply = io.failed = 0; - pop_timer_qsave(&io); - TC_EQ(stream_pos, 3); - - pop_timer_minutes = 7; - pop_timer_ticks = 400; - stream_pos = 0; - io.reading = io.apply = 1; io.failed = 0; - pop_timer_qsave(&io); - TC_FALSE(io.failed); - TC_EQ(pop_timer_minutes, 42); - TC_EQ(pop_timer_ticks, 103); - - stream[0] = 9; stream[1] = 0; stream[2] = 0; /* tick 0 — impossible */ - pop_timer_minutes = 33; - pop_timer_ticks = 444; - stream_pos = 0; io.failed = 0; - pop_timer_qsave(&io); - TC_TRUE(io.failed); - TC_EQ(pop_timer_minutes, 33); - TC_EQ(pop_timer_ticks, 444); -} - -void main(void) -{ - TC_RUN(timer_starts_and_only_runs_when_allowed); - TC_RUN(timer_expiry_is_one_shot); - TC_RUN(timer_cheats_match_sdlpop_rules); - TC_RUN(timer_qsave_restores_exact_state_and_rejects_bad_tick); -} diff --git a/applications/PoP/roomtest/tests-host/t_wall.c b/applications/PoP/roomtest/tests-host/t_wall.c deleted file mode 100644 index 8086372..0000000 --- a/applications/PoP/roomtest/tests-host/t_wall.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * t_wall.c — удар о стену В ВОЗДУХЕ (BUG-JUMPWALL-1). - * - * Наблюдение с приёмки уровня 3 (комната 14): Кид прыгает, не долетает и - * вместо удара о кладку с последующим сползанием ВДОЛЬ неё пролетает - * сквозь стену «по свободной траектории». Класс отказа шире одной - * комнаты, поэтому проверяем его отдельным набором, а не сценарием в - * t_phys: там характеризация (трасса == эталон), здесь — утверждение о - * поведении («сквозь кладку нельзя»), которое не должно молча - * переснашиваться вместе с эталонами. - * - * Оригинал: bumped_fall (seg004:04E4) на ударе гасит `Char.fall_x`, то есть - * горизонтальный снос обнуляется и дальше Кид падает вертикально. Кто - * решает, что удар был, — check_collisions (seg004:0004) + check_bumped. - * - * Проверка — свипом по стартовому X, а не одним прыжком: исход зависит от - * фазы, и «с одной X работает» ничего не доказывает (ровно так и вышло с - * первым сценарием — из центра плиты стена держит). - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" - -#define E 0 -#define F 1 -#define W 20 - -/* Комната 14 уровня 3 с одной правкой: шахте колонок 6–7 подложено дно - * (ряд 2), потому что соседних комнат у сцены нет, а в игре Кид улетает - * вниз в комнату 13. Остальное — как в данных: площадка (0,8), провал - * (0,6)/(0,7), СТЕНА в колонке 5 рядов 1–2, площадка (0,5) за ней. */ -static const uint8_t room14[30] = { - F, F, F, E, E, F, E, E, F, E, - W, W, W, E, E, W, E, E, W, E, - W, W, W, F, F, W, F, F, W, W, -}; - -/* Плита (0,8) по X: колонка 8 — это [177, 191), плюс шов с пустой (0,9). */ -#define X_LO 177 -#define X_HI 196 - -/* Прыгнуть влево со стартовой X. Возврат — код исхода: - * 'L' — долетел до площадки (0,5) и стоит на ней (ряд 0) — законно; - * '.' — не долетел и упал на дно шахты колонок 6–7 — тоже законно; - * цифра — колонка, в которой Кид оказался ЛЕВЕЕ стены, то есть прошёл - * сквозь кладку колонки 5 (это и есть баг). */ -static char jump_left_from(uint8_t x) -{ - sc_room(room14, 14); - sc_kid_at_x(8, 0, x, -1 /* лицом влево */); - sc_trace_clear(); - /* Клавиши держим только на сам прыжок: если удерживать их всю сцену, - * Кид, ДОЛЕТЕВШИЙ до (0,5), тут же прыгает с неё второй раз — и исход - * говорит уже не о стене, а о втором прыжке. */ - sc_run(SC_L | SC_U, 6); - sc_run(0, 34); - if (!sc_len) return '?'; - { - int8_t col = sc_trace[sc_len - 1].col; - int8_t row = sc_trace[sc_len - 1].row; - if (row == 0) return 'L'; /* остался на верхнем ряду */ - if (col >= 6) return '.'; /* сполз вдоль стены в шахту */ - return (char)('0' + (col < 0 ? 0 : col)); - } -} - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} -static void puts_(const char *s) { while (*s) put(*s++); } - -TC_TEST(wall_stops_undershot_jump) -{ - uint8_t x, bad = 0; - /* Карта исходов по всей ширине плиты: 'L' — долетел до (0,5), '.' — - * сполз вдоль стены в шахту, цифра — просочился сквозь кладку. */ - puts_("x=177..196: "); - for (x = X_LO; x <= X_HI; x++) { - char r = jump_left_from(x); - put(r); - if (r != 'L' && r != '.') bad++; - } - put('\n'); - TC_EQ(bad, 0); -} - -int main(void) -{ - sc_init(); - TC_RUN(wall_stops_undershot_jump); - return 0; -} diff --git a/applications/PoP/roomtest/title_arc.h b/applications/PoP/roomtest/title_arc.h deleted file mode 100644 index e02e7f2..0000000 --- a/applications/PoP/roomtest/title_arc.h +++ /dev/null @@ -1,29 +0,0 @@ -/* title_arc.h — индексы в архиве TITLE. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef TITLE_ARC_H -#define TITLE_ARC_H - -#define ARC_TITLE_COUNT 20 - -#define ARC_TITLE_T0_0 0 -#define ARC_TITLE_T0_1 1 -#define ARC_TITLE_T0_2 2 -#define ARC_TITLE_T0_3 3 -#define ARC_TITLE_T0_4 4 -#define ARC_TITLE_T1_0 5 -#define ARC_TITLE_T1_1 6 -#define ARC_TITLE_T1_2 7 -#define ARC_TITLE_T1_3 8 -#define ARC_TITLE_T1_4 9 -#define ARC_TITLE_T2_0 10 -#define ARC_TITLE_T2_1 11 -#define ARC_TITLE_T2_2 12 -#define ARC_TITLE_T2_3 13 -#define ARC_TITLE_T2_4 14 -#define ARC_TITLE_T3_0 15 -#define ARC_TITLE_T3_1 16 -#define ARC_TITLE_T3_2 17 -#define ARC_TITLE_T3_3 18 -#define ARC_TITLE_T3_4 19 - -#endif diff --git a/applications/PoP/roomtest/vizier_arc.h b/applications/PoP/roomtest/vizier_arc.h deleted file mode 100644 index 8f30b67..0000000 --- a/applications/PoP/roomtest/vizier_arc.h +++ /dev/null @@ -1,14 +0,0 @@ -/* vizier_arc.h — индексы в архиве VIZIER. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef VIZIER_ARC_H -#define VIZIER_ARC_H - -#define ARC_VIZIER_COUNT 5 - -#define ARC_VIZIER_G0 0 -#define ARC_VIZIER_G1 1 -#define ARC_VIZIER_G2 2 -#define ARC_VIZIER_G3 3 -#define ARC_VIZIER_G4 4 - -#endif diff --git a/applications/PoP/sdk.mk b/applications/PoP/sdk.mk deleted file mode 100644 index ea08f79..0000000 --- a/applications/PoP/sdk.mk +++ /dev/null @@ -1,11 +0,0 @@ -# Привязка архивных PoP-проб к установленному Sprinter-CC. -POP_ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) --include $(POP_ROOT)/local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(POP_ROOT)/../../bin/sprinter-cc),$(abspath $(POP_ROOT)/../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT или создайте PoP/local.mk) -endif -PROJ_ROOT := $(SPRINTER_ROOT) -export SPRINTER_ROOT MAME_HOME MAME_BIN MAME_ROMPATH MAME_DSS_IMAGE -export MAME_SYSTEM_HDD_IMAGE MAME_BIOS CHDMAN_BIN -include $(PROJ_ROOT)/app.mk diff --git a/applications/PoP/third_party/16x16-RPG-characters/LICENSE b/applications/PoP/third_party/16x16-RPG-characters/LICENSE deleted file mode 100644 index 604209a..0000000 --- a/applications/PoP/third_party/16x16-RPG-characters/LICENSE +++ /dev/null @@ -1,359 +0,0 @@ -Creative Commons Legal Code - -Attribution-ShareAlike 3.0 Unported - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR - DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE -COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY -COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS -AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY -BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS -CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. - -1. Definitions - - a. "Adaptation" means a work based upon the Work, or upon the Work and - other pre-existing works, such as a translation, adaptation, - derivative work, arrangement of music or other alterations of a - literary or artistic work, or phonogram or performance and includes - cinematographic adaptations or any other form in which the Work may be - recast, transformed, or adapted including in any form recognizably - derived from the original, except that a work that constitutes a - Collection will not be considered an Adaptation for the purpose of - this License. For the avoidance of doubt, where the Work is a musical - work, performance or phonogram, the synchronization of the Work in - timed-relation with a moving image ("synching") will be considered an - Adaptation for the purpose of this License. - b. "Collection" means a collection of literary or artistic works, such as - encyclopedias and anthologies, or performances, phonograms or - broadcasts, or other works or subject matter other than works listed - in Section 1(f) below, which, by reason of the selection and - arrangement of their contents, constitute intellectual creations, in - which the Work is included in its entirety in unmodified form along - with one or more other contributions, each constituting separate and - independent works in themselves, which together are assembled into a - collective whole. A work that constitutes a Collection will not be - considered an Adaptation (as defined below) for the purposes of this - License. - c. "Creative Commons Compatible License" means a license that is listed - at https://creativecommons.org/compatiblelicenses that has been - approved by Creative Commons as being essentially equivalent to this - License, including, at a minimum, because that license: (i) contains - terms that have the same purpose, meaning and effect as the License - Elements of this License; and, (ii) explicitly permits the relicensing - of adaptations of works made available under that license under this - License or a Creative Commons jurisdiction license with the same - License Elements as this License. - d. "Distribute" means to make available to the public the original and - copies of the Work or Adaptation, as appropriate, through sale or - other transfer of ownership. - e. "License Elements" means the following high-level license attributes - as selected by Licensor and indicated in the title of this License: - Attribution, ShareAlike. - f. "Licensor" means the individual, individuals, entity or entities that - offer(s) the Work under the terms of this License. - g. "Original Author" means, in the case of a literary or artistic work, - the individual, individuals, entity or entities who created the Work - or if no individual or entity can be identified, the publisher; and in - addition (i) in the case of a performance the actors, singers, - musicians, dancers, and other persons who act, sing, deliver, declaim, - play in, interpret or otherwise perform literary or artistic works or - expressions of folklore; (ii) in the case of a phonogram the producer - being the person or legal entity who first fixes the sounds of a - performance or other sounds; and, (iii) in the case of broadcasts, the - organization that transmits the broadcast. - h. "Work" means the literary and/or artistic work offered under the terms - of this License including without limitation any production in the - literary, scientific and artistic domain, whatever may be the mode or - form of its expression including digital form, such as a book, - pamphlet and other writing; a lecture, address, sermon or other work - of the same nature; a dramatic or dramatico-musical work; a - choreographic work or entertainment in dumb show; a musical - composition with or without words; a cinematographic work to which are - assimilated works expressed by a process analogous to cinematography; - a work of drawing, painting, architecture, sculpture, engraving or - lithography; a photographic work to which are assimilated works - expressed by a process analogous to photography; a work of applied - art; an illustration, map, plan, sketch or three-dimensional work - relative to geography, topography, architecture or science; a - performance; a broadcast; a phonogram; a compilation of data to the - extent it is protected as a copyrightable work; or a work performed by - a variety or circus performer to the extent it is not otherwise - considered a literary or artistic work. - i. "You" means an individual or entity exercising rights under this - License who has not previously violated the terms of this License with - respect to the Work, or who has received express permission from the - Licensor to exercise rights under this License despite a previous - violation. - j. "Publicly Perform" means to perform public recitations of the Work and - to communicate to the public those public recitations, by any means or - process, including by wire or wireless means or public digital - performances; to make available to the public Works in such a way that - members of the public may access these Works from a place and at a - place individually chosen by them; to perform the Work to the public - by any means or process and the communication to the public of the - performances of the Work, including by public digital performance; to - broadcast and rebroadcast the Work by any means including signs, - sounds or images. - k. "Reproduce" means to make copies of the Work by any means including - without limitation by sound or visual recordings and the right of - fixation and reproducing fixations of the Work, including storage of a - protected performance or phonogram in digital form or other electronic - medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, -limit, or restrict any uses free from copyright or rights arising from -limitations or exceptions that are provided for in connection with the -copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, -Licensor hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license to -exercise the rights in the Work as stated below: - - a. to Reproduce the Work, to incorporate the Work into one or more - Collections, and to Reproduce the Work as incorporated in the - Collections; - b. to create and Reproduce Adaptations provided that any such Adaptation, - including any translation in any medium, takes reasonable steps to - clearly label, demarcate or otherwise identify that changes were made - to the original Work. For example, a translation could be marked "The - original work was translated from English to Spanish," or a - modification could indicate "The original work has been modified."; - c. to Distribute and Publicly Perform the Work including as incorporated - in Collections; and, - d. to Distribute and Publicly Perform Adaptations. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor - reserves the exclusive right to collect such royalties for any - exercise by You of the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme can be waived, the Licensor waives the - exclusive right to collect such royalties for any exercise by You - of the rights granted under this License; and, - iii. Voluntary License Schemes. The Licensor waives the right to - collect royalties, whether individually or, in the event that the - Licensor is a member of a collecting society that administers - voluntary licensing schemes, via that society, from any exercise - by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now -known or hereafter devised. The above rights include the right to make -such modifications as are technically necessary to exercise the rights in -other media and formats. Subject to Section 8(f), all rights not expressly -granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made -subject to and limited by the following restrictions: - - a. You may Distribute or Publicly Perform the Work only under the terms - of this License. You must include a copy of, or the Uniform Resource - Identifier (URI) for, this License with every copy of the Work You - Distribute or Publicly Perform. You may not offer or impose any terms - on the Work that restrict the terms of this License or the ability of - the recipient of the Work to exercise the rights granted to that - recipient under the terms of the License. You may not sublicense the - Work. You must keep intact all notices that refer to this License and - to the disclaimer of warranties with every copy of the Work You - Distribute or Publicly Perform. When You Distribute or Publicly - Perform the Work, You may not impose any effective technological - measures on the Work that restrict the ability of a recipient of the - Work from You to exercise the rights granted to that recipient under - the terms of the License. This Section 4(a) applies to the Work as - incorporated in a Collection, but this does not require the Collection - apart from the Work itself to be made subject to the terms of this - License. If You create a Collection, upon notice from any Licensor You - must, to the extent practicable, remove from the Collection any credit - as required by Section 4(c), as requested. If You create an - Adaptation, upon notice from any Licensor You must, to the extent - practicable, remove from the Adaptation any credit as required by - Section 4(c), as requested. - b. You may Distribute or Publicly Perform an Adaptation only under the - terms of: (i) this License; (ii) a later version of this License with - the same License Elements as this License; (iii) a Creative Commons - jurisdiction license (either this or a later license version) that - contains the same License Elements as this License (e.g., - Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible - License. If you license the Adaptation under one of the licenses - mentioned in (iv), you must comply with the terms of that license. If - you license the Adaptation under the terms of any of the licenses - mentioned in (i), (ii) or (iii) (the "Applicable License"), you must - comply with the terms of the Applicable License generally and the - following provisions: (I) You must include a copy of, or the URI for, - the Applicable License with every copy of each Adaptation You - Distribute or Publicly Perform; (II) You may not offer or impose any - terms on the Adaptation that restrict the terms of the Applicable - License or the ability of the recipient of the Adaptation to exercise - the rights granted to that recipient under the terms of the Applicable - License; (III) You must keep intact all notices that refer to the - Applicable License and to the disclaimer of warranties with every copy - of the Work as included in the Adaptation You Distribute or Publicly - Perform; (IV) when You Distribute or Publicly Perform the Adaptation, - You may not impose any effective technological measures on the - Adaptation that restrict the ability of a recipient of the Adaptation - from You to exercise the rights granted to that recipient under the - terms of the Applicable License. This Section 4(b) applies to the - Adaptation as incorporated in a Collection, but this does not require - the Collection apart from the Adaptation itself to be made subject to - the terms of the Applicable License. - c. If You Distribute, or Publicly Perform the Work or any Adaptations or - Collections, You must, unless a request has been made pursuant to - Section 4(a), keep intact all copyright notices for the Work and - provide, reasonable to the medium or means You are utilizing: (i) the - name of the Original Author (or pseudonym, if applicable) if supplied, - and/or if the Original Author and/or Licensor designate another party - or parties (e.g., a sponsor institute, publishing entity, journal) for - attribution ("Attribution Parties") in Licensor's copyright notice, - terms of service or by other reasonable means, the name of such party - or parties; (ii) the title of the Work if supplied; (iii) to the - extent reasonably practicable, the URI, if any, that Licensor - specifies to be associated with the Work, unless such URI does not - refer to the copyright notice or licensing information for the Work; - and (iv) , consistent with Ssection 3(b), in the case of an - Adaptation, a credit identifying the use of the Work in the Adaptation - (e.g., "French translation of the Work by Original Author," or - "Screenplay based on original Work by Original Author"). The credit - required by this Section 4(c) may be implemented in any reasonable - manner; provided, however, that in the case of a Adaptation or - Collection, at a minimum such credit will appear, if a credit for all - contributing authors of the Adaptation or Collection appears, then as - part of these credits and in a manner at least as prominent as the - credits for the other contributing authors. For the avoidance of - doubt, You may only use the credit required by this Section for the - purpose of attribution in the manner set out above and, by exercising - Your rights under this License, You may not implicitly or explicitly - assert or imply any connection with, sponsorship or endorsement by the - Original Author, Licensor and/or Attribution Parties, as appropriate, - of You or Your use of the Work, without the separate, express prior - written permission of the Original Author, Licensor and/or Attribution - Parties. - d. Except as otherwise agreed in writing by the Licensor or as may be - otherwise permitted by applicable law, if You Reproduce, Distribute or - Publicly Perform the Work either by itself or as part of any - Adaptations or Collections, You must not distort, mutilate, modify or - take other derogatory action in relation to the Work which would be - prejudicial to the Original Author's honor or reputation. Licensor - agrees that in those jurisdictions (e.g. Japan), in which any exercise - of the right granted in Section 3(b) of this License (the right to - make Adaptations) would be deemed to be a distortion, mutilation, - modification or other derogatory action prejudicial to the Original - Author's honor and reputation, the Licensor will waive or not assert, - as appropriate, this Section, to the fullest extent permitted by the - applicable national law, to enable You to reasonably exercise Your - right under Section 3(b) of this License (right to make Adaptations) - but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR -OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY -KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, -INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, -FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF -LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, -WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION -OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE -LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR -ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES -ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - a. This License and the rights granted hereunder will terminate - automatically upon any breach by You of the terms of this License. - Individuals or entities who have received Adaptations or Collections - from You under this License, however, will not have their licenses - terminated provided such individuals or entities remain in full - compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will - survive any termination of this License. - b. Subject to the above terms and conditions, the license granted here is - perpetual (for the duration of the applicable copyright in the Work). - Notwithstanding the above, Licensor reserves the right to release the - Work under different license terms or to stop distributing the Work at - any time; provided, however that any such election will not serve to - withdraw this License (or any other license that has been, or is - required to be, granted under the terms of this License), and this - License will continue in full force and effect unless terminated as - stated above. - -8. Miscellaneous - - a. Each time You Distribute or Publicly Perform the Work or a Collection, - the Licensor offers to the recipient a license to the Work on the same - terms and conditions as the license granted to You under this License. - b. Each time You Distribute or Publicly Perform an Adaptation, Licensor - offers to the recipient a license to the original Work on the same - terms and conditions as the license granted to You under this License. - c. If any provision of this License is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of - the remainder of the terms of this License, and without further action - by the parties to this agreement, such provision shall be reformed to - the minimum extent necessary to make such provision valid and - enforceable. - d. No term or provision of this License shall be deemed waived and no - breach consented to unless such waiver or consent shall be in writing - and signed by the party to be charged with such waiver or consent. - e. This License constitutes the entire agreement between the parties with - respect to the Work licensed here. There are no understandings, - agreements or representations with respect to the Work not specified - here. Licensor shall not be bound by any additional provisions that - may appear in any communication from You. This License may not be - modified without the mutual written agreement of the Licensor and You. - f. The rights granted under, and the subject matter referenced, in this - License were drafted utilizing the terminology of the Berne Convention - for the Protection of Literary and Artistic Works (as amended on - September 28, 1979), the Rome Convention of 1961, the WIPO Copyright - Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 - and the Universal Copyright Convention (as revised on July 24, 1971). - These rights and subject matter take effect in the relevant - jurisdiction in which the License terms are sought to be enforced - according to the corresponding provisions of the implementation of - those treaty provisions in the applicable national law. If the - standard suite of rights granted under applicable copyright law - includes additional rights not granted under this License, such - additional rights are deemed to be included in the License; this - License is not intended to restrict the license of any rights under - applicable law. - - -Creative Commons Notice - - Creative Commons is not a party to this License, and makes no warranty - whatsoever in connection with the Work. Creative Commons will not be - liable to You or any party on any legal theory for any damages - whatsoever, including without limitation any general, special, - incidental or consequential damages arising in connection to this - license. Notwithstanding the foregoing two (2) sentences, if Creative - Commons has expressly identified itself as the Licensor hereunder, it - shall have all rights and obligations of Licensor. - - Except for the limited purpose of indicating to the public that the - Work is licensed under the CCPL, Creative Commons does not authorize - the use by either party of the trademark "Creative Commons" or any - related trademark or logo of Creative Commons without the prior - written consent of Creative Commons. Any permitted use will be in - compliance with Creative Commons' then-current trademark usage - guidelines, as may be published on its website or otherwise made - available upon request from time to time. For the avoidance of doubt, - this trademark restriction does not form part of the License. - - Creative Commons may be contacted at https://creativecommons.org/. diff --git a/applications/PoP/third_party/16x16-RPG-characters/README.md b/applications/PoP/third_party/16x16-RPG-characters/README.md deleted file mode 100644 index b3b78a0..0000000 --- a/applications/PoP/third_party/16x16-RPG-characters/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# 16x16 RPG characters `v3.0` - -16x16px RPG character sprite sheet for up to down games. - -This asset pack has been downloaded from https://route1rodent.itch.io/16x16-rpg-character-sprite-sheet - -Adapted from opengameart.org 's "[NES-Style RPG Characters](https://opengameart.org/content/nes-style-rpg-characters)" and "[More NES-style RPG Characters](https://opengameart.org/content/more-nes-style-rpg-characters)", with additional content made by [@route1rodent](https://route1rodent.itch.io). - -## License - -16x16 RPG character sprite sheet (c) by @route1rodent - -"16x16 RPG character sprite sheet" is licensed under a -Creative Commons Attribution-ShareAlike 3.0 Unported License (CC BY-SA 3.0). - -You should have received a copy of the license along with this -work. If not, see http://creativecommons.org/licenses/by-sa/3.0/. - - -## Credits - -Maintained by @route1rodent: - -- itch.io: https://route1rodent.itch.io -- Twitter: https://twitter.com/route1rodent -- Github: https://github.com/itsjavi -- Blog: https://blog.itsjavi.com diff --git a/applications/PoP/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png b/applications/PoP/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png deleted file mode 100644 index 98bf1c74f65525aaaca2783040619e148fe7ecca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7830 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 S$U0~S7+g2jE&I(e>i+;CrcmSn diff --git a/applications/PoP/toolchain/1.1 b/applications/PoP/toolchain/1.1 deleted file mode 100644 index b71abdc62e1b1e1713f570544b58b946c4e72892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36981 zcmYhicUV(T&^8Q+(tc7DMCnDT(tC}FRHawxy+{d2FCi#MuOdaNfbo_l8ZY+`k_)$WorkP{FP+|^Kjp-(_Slzn}1 zkrG`$33ci$z5XF~R?<=;Ao!L{acO(|`kv57U+p9CMcU0qscCh| zn115fYa7dQ_driRqmh!gtMeZHz`Cnk=$H%*-RIQQAP(e3VQf;Iytf?+gpqLr!>vO0 zcjwXY-ilzFa#sIX)bab_MXJv%X+CXIaVvR7Z^w6RNupNfql3$@!%y>i{dBVnQd?l9u70bhnr00sYjYYw z3Ed^0sKQ$BaGYK7tzwGFXu_}HSH&lgdl!Y3X~(~eZFl3Bad0Qc$pIgMpX|%6lW~?a zQ=wMAy}nUvbz46s1z!|bHNSy(aN1z?K~(-$G4(ozMQ|11pH?Zk8 zCd)F9j%M3>!YajVKyMHWfH^Y`C|b%N}NN<4<_ zuc)Z3fd_&lDz5v3+~LoQKcBkH(C{fL4o1kt-jVyy(}HR3dn`dA_V9?{=(kG`n^m~` zP@y()Tp+r?wn;yBirAwk#U4=|B3tg+p_;LlrpLPos9_w_-5mcX6CI|G(%h$;W-40BkE;6&j3 zHi^W?IjA+$W6s2k`6ll2=vZT(o`+rXO?2hK#hg8db%I6HYnb7Ci3&wOlh>wu312LA zbucG8ds{3Z%9GP#?;U{N1%Ol0?E0^tTD$)vyf;;bjnFv#P4%;*9e!KVkGyD6O%>l+$uCv6G zv`6DR`e|)}%&WS5AGZ{^1Tl|V&UliSY`(hz-qjRri_28ppLani}#MCR)8OiNO_vP zIPVs3Xz)*N4enp1<(Rf;F&D#=9c`ZHfNICz;F-7O2ywf;E_8UIf=Gtg2 zL#9BmGXE^Mt9>|-g>bns2lQzwc{DUjy-6QNdnzmmYg)YLkwBj~`5-7Ot0PA6b!jM> zzQ}VR4Pr;iGr^5ctE{b&xXm>sN>LkYZgzbCL;FNlsB`pdbk2sFpjx&in)6v&=?alZ*0{a#+oc8;^4Df92iHDJ| zQKeHX%)n04@-hlH?#M?>Qyiwd+!_MNlmC()Jvp1nalgI3S;t_uU#y{j;o=RSwQYMK zl_^9A-mhv7$fc#~DGKb1M!gz)8g;vOwo%bYoXMZf6Q$@e{S8)gr-T=JGWe^~#O%bN zVt*vk)3>h_9Qbnp81ulNGEQC@(X@#cL5F%=Oi$wpcD&SlO*iFzKVqhs8e1&$nwIDe zUG)*pr`cc6Wn3mV!}kn-|54LY-g2;ZgZRk@`Rh9GFojfZl+}H{7=O#5MiJmy_>qAy8pdH9_i6m%dEte>CYd2NeJpad!H`;~Szn4lUj6FH;-C zI{sA5W^YGyeD=~{VfKSwJzWA-1bW-mUi)am!!56^@KVwGlX%OE^+1o&@kZ{l>b(Xl ziwETn+y;+ z;B-4~;1))+0L`UIemMFi)vsq5xC9j`@O4atWlAMHD7HaP0|Og8rm|9hjk>6DenS38 z>wLx=sU~0ja-h;jtI4|a^Awc`VIOZIGL;v0>EctCe$(wL&J@=vtm$ zm%hx1$Igq%?0Z$D+ai-!BV`>yp@ARr*tJDp4!#4!vdsb&KQg_Vd?n*s%98hxuq=_c zXQC=0_>EA87^8ZK+rt9MVcb2?`dV7F{6bUItPox66vKS*uaev*AQl5<-%O*U6}!jh z7sR6P<}C@lNS~Ev5otHZUZc#z0d=X_#Z>};9UkA6Rq7fw6Fa?pb%%U|f1h`!k3m`c5p(SN1K zSa)f7kCsMt?IV@^$S3EDvXZ;^IYm4S8S0B+3BP^^x5@U~J~=g1NM309@*!5MtwTg% zPIp`5SKACzj*tVCFmq$J%Y_1C&Tm?n`1mrb0-E03&pZI6^MlXe@lc~7#7KOuMa zc*2WL1H1ox3RZJ81>p(0e#3oe$hHr1tJ_a5@-s04kKX#F2t%2)RjV!KZD)Hw} ziK?GT!F=IaV}kPE&?zFl%}vBF5;zBT7h{e~Kk&OZK%BEFZoM8$c!1M2!*~B_^O>V} zOrF9lh9)Ui2w8{RTcT@fVxonM@Ocs8+9XMTv zPjB^h)Qe?Ew0|PMFdIAA9$-+C8Et?p?aE&m4*yxq9_V9u_dI|+n+7uSh){s|6^nV+ ziiGpp%VVwahxf%d{cw$j_qiQ%$?v{n|6tI`qLNPI^DI+Q$w%`W>~-U#+;P%+A0E4a zHv^xzFV+ryb@6Md%JsMbZ}mkx-uKt%zj{KId;9|t=#}jmv)9_Axr{~Y_m*3W?Y4s@l2QA_mC*T>XLxCA* zD_)XcxMcqu?r;@rtMOWqis*z&yyWml=goMFL&cP#kx0`Sqn`KbdK^hZZD>1;LrEvgOi^4o5@$kp;aV*7QQT% zlF+5;E&V{spO^AlT<-pqs~z(o+X>TKJ$hcXuy? z4w$%-o(hTy)u;!0P^zXC7fE~UyOx_|2a2(}JLbkKJ)EGN=i$82Ex)3T*VT^RuKIlW zAu*(8>L6%im668EC2lJCd6_T$IR{Z`7()xk_n9my-t=%u;}5aQJD)UrK4FghdBP`j zmUE>coC_s_QL(w`iE0yPhYm6n3;J7zLOF#x5d#>D-ne7XPmW-7B8M_e|~r8!6)7q#jAoE?K`AyT`EqL!je(^+-dJNt}4iQ@_E!+_P zzK=K(9pl3P)S5gU)#e}@ccir{^K`zej<_apWh=M&Qy5y7r=Di?^+Ow8#0KCsYv9wY z7A6x!VKRf>fqx`>iGf0^&l^TpR7DfoGv;jKR2MO2)^F<&B80AtbfRr$#;VJ7+3>A> zeK;w;R`ZIjd28COmNHo2vD$*ygBgYqQcbrS#(*MVsV9mu;?~;87$#Fd$VVb4+Boqa?5N9-)djD9_UXtlZkc&mC?Q}fzX?6r;fSrp_WGrAtI*z{eIhtY@$;d zBZ?E_Sd}lD++#8+_D#Kimjz=pWDAt@tPJDQwPl!{I1!JAi;TXU$@pxEQh0YpimSM1 zYzH_=l#$hYz&Ri$JC$tu;Q>5-jjZ+1UnA)hpON=`W;ZzvI`!Lr9|}y`WdnwL)ki$z z*!6P-BJDS@npPZ7j~+KgZn+Q2CN;{jJ1QJfp8z9{TKf8&y@0U#Yff$=Rvao%!{+0;; zR0cSF*>kDc=QRT3F>xN_hMSatxK_bNU?Q6|a2RYWnyGa0c%lvFhfIeH0*ZXVo)!qz zv0O}ya(|8CV%G@FmeqUGz@nLTJP%G$3Z7RpUZ+`tu};FV@t$dqB|VZNo~i02 z8R*~5k$<-8IBUU%Vr+#FzS`|jnH!a~_8E4Tqc1IbbnidL2en+vX-kOPBmdQ-WdlRV zrzCA=-pCq!bS;B=cQO09mZrE-_I{mauxrT6A)U3b=0)Zpa{dOnY!x++qY@iiMjYfe zlV~0J5Th#Ly?_#PmS%b-msal&Ba=n?4r}fQQPCVd?`nYFp>sN4p)|(d-VU(X&q(`< z8?JwZW~lg5w#R>1nXve8LZL;c*hrwug3O-2m|nS9)nv;i|; zmqnsyYGHpK!B11s(|rNv=-vbdjsCplvoc>xg#0CR=R8i}u^GI1TucN>5hp{|_)C-DtK6y$-{$Wb zxVy2HBV~=Rl0xCJqj$2v=}+)@jp!Vw639S@S*>%u;>Z zAg_nTPi1QT#MZ;AQH8q;fp?MWRJzrdd%2T7DVp<}a1G8>yE6JtG}`wb$i;YI3$oow zRqxRRuLAjX99%9jnpnXma@h{ODKctbRsGOH8AN>{e^0La<#|bYcqNfxCArZVzb>JX zECC%Ko#83IzdbW7gcio}JMfhwi3#5-qPKvye64^_t1HXM{gTYpVlOnx>*L>2d>U^K zuGPzFfL;J!(eQq2H%c;=`$eUV(Uq~Dbh;`~qC~XnR#h8$qNG}S_H7j(38eX)s!P)| zHBeR0RPz}bp+3l-*`uc9Xfx?0q83X2O*ZL? zUuuikE*r3F<+28ByLB_t7GB zX3fuvUp4~Y`M&y44?_!SHni$mAyh$nGjRW%%8uJ_iwiqoM(d9)(KUluV@D9Q_`3lz z{(Lvy_&N+PIgty}v871!^t>15$t}l?OSng3$oP8LzBvqZRn!6Y0L8D(;d3D-^-8*B z$EmwLAW$8I3WJ92;@0R^aS@tMXRUuIs^me>Vn8-@en@uhot=Xj0X>@RIw*fB`A!RpQwa=?{4OzIS>Z zD!!-`HWwx&&f+1?GSsdlUwffP$Wcz9XZZe>4KWj`>h~94zN@bj-WLN4(~ySV4oKM& zQ&mS8B|N6IrwpgLB(C-Ls%(O|&ry%@R$TNOd>$1aG%3M>RA29(}T&xW-RZGP2Wubg=QTqkW;^VD5&p(*r$=G)Jy*Jh6#I><6^vJkA z=8Rg@8zMpzxk`#r&qXe{)^a^dA7tHSRFvUCnwt=2x%3?NgSUP(WtlA? zvlf^tVu?NVGrIHvG$yA{Y={Bxt037#?*|Qqt=`vi$*P0zdT><4a+N1nP&GX7nfmj6 zk*GCR)l$m=RUc?t`CNNjRD+}+p>ORs9iTr0U$$YBS=_G*NEa+B`US+S{1F>kq7)hfTjRmfph0D#lGu;vavXwy6xt57xKdxdNk=0(-> zq03!AKG+E|Y7Uf_^O_aA+`7E)X=C-Eo#4W zp|v^`v_7$wX??$J6X%j6+hnEvpR<%Bna^gAr%rpGN7ge7BWHXFslu!d$WMpgrih_! z)1^8*VeN;$gFb)MXQJ?{=g z2K!+|r%F{A%ctTf+L_QM?^b%C=%;4Ro1hQ!(bkp2lS+Z7nb09(69HS>mpq$O)kPO> zky9^tmz#xay&#~6N0hV4N)V6C5-OXu#0ji2qWAbjpMxqt+wX?{rp=~ePXTBL3G#cW97F9e9 zOG2kA{0WLa)b4uf!ke@8tqoR+V4MbsO5_deL~&IPqg7rb-VCDi^sHkletkm5A7hhV zfwY|YcNY%EicQawu-#Mi2D|235TRX)sWzP(KI0qoqEoDE~QNPFAphmjFPL8*w-tsnwT@50^ z=r)CcC2&O-i<-0>fvUaK+|}VIKll^jUQNtg_gSN1PA1g>>aB!p?*s)01Q>iotoE2RtR30{Pxb1ifRHCxvW+ zK`I`}v5=h;O!Pkd(A?WW7bnP}na z=7t%Y2t6@ z9E@Tr%Px*>qe7njPp!Dk>#%S~hE57r2YV+GLtpc8xW)!yVTz!Z@(fdO>_7xMDf3k@ zM^l>eYfs?($_VjFQQudEk!l0(BsXxS7?+8E)4vh)V22#&xeYuZug*IvJuCb4 zu3rXyG{Ok6I^T7hpfg>dD~+!`J8@cR_PweYjS#T(>p1TOTAuF)xD%_oF%*eCgh8p^ zk)aFpDHvxFi(b!%UP?M*YTJjj$j1BkMqRI_cJH~UT`Wi?zbSfM@{!lk9`xFJCcq!W zD5);|gMn7IPx?T0JrzS=i`cVgb%TzGTANhI5*+h>BUC^)1+sX}f@d#-`IIFTg_P>! zmmHWXPyKM0vMdKx^zQ~;n9FQB#fTU6nK7a zd&O8m@IBAkGZ_F9xpcjXXqN+oc>qz8l)je>nSxi#@$_AFkIc9-_a_=mr1C=uD~5MW z?4s+`Ji|7p(Pcu#5_r<3a(Pj!)T1(~gUe94OBWLm5`Kvm=6jQDdC(Eyvt0(MoufLkghNveil8ptktK?+g`lDn7H)wP6r7OoBj^=T!e)~_I|=k{BlGHa=ZV1|tv!(iGNrhu~e)Fe#Rbq{Hmq1uRKTt?t}F&_}E?=@GvPC^hZf8|V? zYdfQKj4s;SQC%mv_%Zj*zHu@P7>CCoEThvBgcjOS^EE>lhFOpqk1;k)tAyxwRk0-$Jgq~+KU-sfu$FnE>zSphAo$itQ{BYs7M?K;%sYk z8+M5{zY4s?x(~)(yYFaZ$olHw;xKSMC$j*wioAy59o6+3Kqz`*yP06F3w*kDYPEEQ z_8_=vMu1`61A~d$ZE;Z7>q!@ znnJvTBwQyEa=D6*FF?5eCvX~u!(Z1PWOKLv_H-r+Suqzd5{lyYHscF$NlT(SdR zj+f);JXVx5UIJY!uBL1HO{ zEV~}vslnP@)gVo*+QJNkM=3bum;zW#uFlYh1DiGU2;7C#bE)>@X?PEIwDRN8xgX(h z=Q}m5eCe6J6Dyk-puivRdY@c$(lS;}OT#9K;Tx=42q~un%8^vJpz~KSW^I<9?({wt4Zg#s;&AV%8jRp8)mKR{> zJ@5k1Rvgg+AaH-JZ)+3Ko*FG82WWvEwF_CCZ!v~+&CbD&c1w^_TC6k#3xH7EnzNLY zb&%UOH_-EH1q+3A9-+I!t`Z@Zc&v3-vf+yHnW|vn&w{fx3X`t$zC7!_y~RNE8agND z&hh9=ID!R|NH>dbH-UuikHj&+l2$*SUMQ z+7|$W`yIF*xSibP*~mVtMHdz-RXS}l3Mgbfh#jJ*UCVDd8=g4;;QkzET0Kb417D7p zIM@Da^L+pdihK*WC7G!7f)N$S%<{Imy=7`Tjplgp_0FnFh-BTTWY#a=yy>lg8JbS!_wjr34o^J(r4;Pq zcnj54O^I4=^WM(^Mvd9e*k$s4wDLKnhM@3!`*K&IC-ViJ>6AVE;1d|j3Jx6TvyHN9 zKXV55BI&RiZ4W-)zqc*MiL*O5yZC*KDuv6NNmz1(#Rvzo`d!+MKUwSL!-k#_b3(Of zx7dgoaz-CKR9SD#Dd%B94qb1f_)O9NsZ*MkX$`|+x9HvId^bPTq*hT1KWg3muA^G4 z$!(UGW&!!*9>AepbdKT%(JbvNt9iD^VG<2w6>#Yr8GRwY=(NhdVtwlTRDyO~qDkx;TA9#SDTrj!X zKyUQXRIhHG)>`A%;euhd6jog)+?gfMMbPzkg5ENdTpU-Rf7>D5>hXI<1epa_5mKGc+|42J_y*$N@plr$WS{LBg##p=OB^=^#5?cc2H; ztBf`_m2Fu(YFeQ3kHT60$&sx{?zko`%oQ$MaS_qgb&9z{Ct@@N!&Y1K z0$`BedEhgAuaG?a+b`gJ_7E>XPo`l?miYv8YNcYNaC#YU4!7#WjY;J=%gtu$kac)o z9YRO3R*Nki*ArL>lfv(o$X(SJ-|y|gEnNNO40^l7QgMIr9DQ+}@v&Q|&e>M&#_Wl& z^nlaFQ8@%W_Mqb=#((w--cAn)kO6*x z4DztENeLX8=$6 zzE1=2@r(!@wuZIq8|-Kg3Ji00(B{$g)2DC8ca(p@#qxvy^5rHJ0o5v{Cn5Bbk_aqD z0_UZZ-xi2=gCsNb;&;)E;B$`f8X<6}9^%mHBp!Znd5lXO^NhQuz|M}79ysdq*izbJ zG4P-S5F$oP_TAcIfuIh*kl6(LyS8;Aq_Id&4?dcfjUGp{F5XU|NOAK<>o_$k>mfRq zPNlj61;CUx8(+R}IzwQ%W(eWzWgh?Ti!TtX_%23re;i4BdKwZOxC&+6i$aDVqY;FM z*Q{F)bQ1r_Ehz~*8Kk?0=UMA^E$AfCpKy5dci;4Xlx=Ilt-(8%=jcmY_cCQAx z^rQVVv$iFq^umZrPc|Ah3nm98fbV2qz57>6w<0O*Bl=Q0X&zVeR}JT{S^ZS8hZ<6Eb$?0kN7U-RW<^a6iAlBJTf__USUqv+j&4Gz6(zs@_(KujSF zaRsmnJIVoOl*t}oSy~I^6)oTYGe!;G>>6=^-|M@-{kH@H`;;7bR3!vE?&`ABX}~pj z^xmfrJ2g9V#DwEK0e7taUGdS#AciY{_!bgNamVE2n0V(8Ofoo!!*A-M^ z02u8FSLL>}P8J&yp!nmpy5k%WHnG3Gd^y2iZ@ial3>P`GLo!JRRZ-AH+osM!KlZ%^ zXc10`r5)|L~1zDnu}pB3v5!$XP4=T&b9K#?iVb9W( z1+*Oi#NFx^9{e8Y9Rpg1I#qG%d7NP%S5pC>G>4Q+ihh@8H)1cCU2H2lGhG=p;r=a$ z!eP&aaFCSb&HLZE*$N2o%=LFdiH=d<&G0`z>*UJx+1{ncXHs09{OI2lNd(HA6E9As zt*`44TqWr|2Uz(OToNnd147^4Wd#!zTn2=8MCpVPv0k-T0p9tzh2tKx6c65^zO z0hIuR=Td)wO88q>CxAt6z>zo4J~!Z`5#QfGatx8dQQVC3q-e_rxqN`hGZm^<9aK=eNmJadn z)(@&-XREDf`!Kj|j96%6w8--}Y9;bJx zJ|!WbY}?|Vkn~~kN|8w5|MC$__t4~hB|5022EOJ~5w7`_s4_GvFdqXid7lNJp@$yv z?SR(f*Rk!QwQO`>?`Z&sh30peI^R2fZg-pVW0?tf18R?>SG4_~MTA@pj33;29F6V~ zF0q^Bc=C$rz9GD}OHm~Vi8*b8T#Y0PhTWkP_6}Fu6#k5&qfGDL(1V=k+QwR4JjST? z92On5;@F2TU572t?5k~xvykUim1}^{9L_TEO}R zjThCg_K=GaKg!E z_c!6<84}4QG$v~O?mm_sR=dbQOB%Y#Z+&jYT`(3UPvLtzN|dIC;aw240XKbxEJJmj z9$+v{_|S_Ih}Dlb$1_wwqQD*gr+}fcl@|%eXeul5HUb5W5{u}+D5?8N( zZ)vaI7Od8fXDpzS-5OE$vgjqGzE)sD4U~@=9mx4Jb&(hFI20(X*m7%S-lTR@$Mf>= zPIxo;%zqn#`$Ga4L|v^=U41#p8gTeHMm_2@cGaijPY{aK*+qE*Q3NfmowsaIJs^S* z)KYE(=7e=l$22UXVAJ_rClhx;0#%U)m=%6R;V&_onO(Q2wBpC7Z&Aw7Y7YvGek%03 zwpv{%wjCN5kGlP^ajJE;`sNYo&S!CY4H_@kr63w|6VIT9ICm<~!xhOcYyFB3?~a=V2{j|{hSr#7Yu<9e^{-jEwl$PZlY4QDcOxe z4jUsGFqxP;JlBOjKi1{8%$8>t807FGv; zQu9>RxSqI_$^I&W-P=3Uf`(~LL%3A#M)Hs_6;CK$-skYzM(s>Rdcn=PKXqBH zSDV1GJd*cnKSql)cP&k3ZkN9{z9iLdYqBg&DZ$2=73e^q1Q1L1xh-=MY3) z$=zyzjOQ!rJuM+{?%h*edY>kK2VtWaF=x3OT$m?Xl||l{W_}Qot3!>^ry#i#zO;XOW~ze}l9z4f;(yQk90D&L zqUjT_j~m&m{E`Q_-B}`&|5*`C_(Fkzc`AOCs_Qnzb=T+Ggd`unvpa^QD`g6zjJIz9 zDgz4b#6H~snjnVftY*=DaF1ULq7Mq8%DXW1K0IjpTIpQdqzr`Og3De1g@G?_S9Dvc zH?pvC5lik*9y_vTv@!iC3OE?D^E=^)|Gh<45rR2)>#(|RQa&X2ElSRGU#aGo<*R8y z?e9yY*Nl+@`xszC^YiC^giRM6pW^3W)|qePOE-S~o4WBlv$`|-+3aOU-Kkwt)(;N1 z!ELGv&TCntEI&p(Ef0LQqJ}0{HNM0X-Fnv)u`>0)9ck=`lpny$M{Ollw73=l-P5rD z2S6zeh2vB&C1-cnxNiw0wvO=i7<1hipjyAlun}N0TffFf?Z=1b*$SNtS|VcyaX#e- zoibx*XYm_6Ot!7rGfoOzLAQmUsbkF;eZS4*Uwe%mH}wb22)RYDW<=;6MDajtz~Nf| zYbsK%HLjL>#PP&6I+;kJeQ{eJb?p;MMt!wwO7uNZ%-`=)R~569dCvI81HOKT|K8-U zPkN{?ve#&Qj;$H>`5j!hr2J5s1>F*XRsIPTvZtB0)1gINg0*B8*uS&A`pg(#yQ|Vtc1S@e2Hyk6sH+~P8{<9;JOxMK7+ zRL8O>r|=tQJcIv*MN9&}DJJ{)`UE#4U~bisGctu`fxe5a>!X zPO?ZD6<;5;ybj$O0kzbePRbAQpI5#%Vdg6uGMhHxO zmw`sDDln?lxkPIsF)LHJ>A>UJ8-2 zm&IEWOYDO#0*CfcZ&Md4o58G8yWZ*lB*I2Yqa%S%85Vcupn}@89EyYfj`RLE@!7R& zQN0dg3;NL-{cM#j80J||I=mpRq6#=y^ZSv;--HBu6+&dk2iSm!z018Yt~ z1SN5UJg*|CFa(Q41oEeI6bis*-T7;>=QqKpP(Us58RAr}v+>lY@0O4j1kZjF{>hTN zai%)eR8Z4q_N}$3Ai1f(&Laa3EEP@H;++5hv+DsOQ_^g25(!dC2?J|v4nS?4uAdas z@qvGD?jNs*!N)0OR&&?{3}23Wk>>mVG`Y4R@-Icsp@2t!QN;W&WR$F zSAhrf8&W-s@-EEQxqt+YtfJIx{^2w-_rW+>M@X|j5o_!tC96CpOmitStHl8+gu>qK zo4OlQA&jV;-cPThN5xt0x}bBtN_RM)3%H3uyoOJVve~x>j#z3}PNi91W$0boJ%T%~oWA3B-VCSz92FdEprMHAI0((M+c0FSbDQ4MK5k1;aiJe|v(oK? zLI>Q`e(BpD_%>a+SKrG6+NV#=~Z;^|dBbFP62#%2+`Rwq6o=^ylncUZd#DcxUdYb3IDtyHI-%2Yw+2+^>naWi^ZCNYJ z3z~byf2GkjCs%R5wXFqL@l#j2?C@UkGAPTw?0-VGV)O}j)KE_4G{tn$+W=}-YdJs6 z@&9GdIa2nGgz=e0V^kE|pH0`J|C7j0(lFMUr|oKr6MZeNaej>7l{&g(1KCWE{*qlV z-Gnf}kFr7Tjp6RC1_sM%irh+iKO)Z`|6r2br@bA1$GJT&^K6$u$d*sxaRk&<>gFsk2)t&2qaT`6f`G*u4rFB&UCn*Hb0^E?Rn;_K#wY%7elY)@vq{ z5v<0@?uAs*(#wpA<4&bFzS>_DJdU288=Bng$MZY#ScEdi#GB_tpTE_@`=f78!Kzc~ z{p3B_2<#Vrgrc5fv0|+mrMJEbmw6`nYkTYEyX6C@2F_P>NAtMpJ0__SECz$Rc{k-v z=clb7Mdsj(XG|+bOwYyJe?s5b7)xKj_}ahQq0S{XMN3$w-TN{yy;!wLNDgw7_}_{~ z)u$d2XYwV!F2mUG!E$*$e0;Ly#J8$ka5(2tbg zavA(ZX^o0vc)nVcXi~iX`9;)?LyBd`=H~QJj*8S98=^tUKDKQCCMv+<;|hxit)P2h zDT^J^+Lru+=*%Z;X^0Ggt(#j~X2Nw>ve}wp591c<8J5ZRt#D~Scaa zOFOK39z0(q*7AexskrQ?v`K~4_uP*Vpu-H?xF!Vpm)gI={9(moAOpm)&^a8%ilY+|3+gS|D;fgCw|yX;wq?= z4gb8bRD9AcP*3WCzb=%1d5a_)H}nsmEc5lc_ER?jWK`c0!BeON4+1EiMLXJpMHp|( z-b8_#Uq0uGC`-g)tL*)|+dmZa|8dv77p+zMSZb>&_6>KcC?+eG*5dg!x552wHHv?g zf+uR}mX|9ow!h4sol<*m*C(1VH}17>t<{S7hxUIJGk9Y0mg^eR^}l`#M^6Nws=efF z*y}jB_EO9f7ev^bznke=`k04Gow{024$2=GbhCd2IkH|W^c)+#1&@-A*4y?jJF!`! zg8aHQG=#kIvn-h5v*Xj}?Os-di`Z#P0(0}6 zj=;#j51d%-FVb8anRhU0#X8hy9JV2|sgBeqKV^O@j4DuNCCX_8sjKXb4ci$`% z-$FG08M2C;p{xj5=a%bua~&MJOrdooD-Q@(TF0!iPRxJwFu>ZuS2jNy^5m=Z@L$JC zT+@S?=aO=bZeY(|^<|30J3VOdaPZens&!CF;racpaD1)E>hWF@d1{7iGdpm|)L@yi z;^GE=P>#qH1LuFa@0q{on6j59V)=Sc;86i9^SL{>PV$hDpWx?43y<(U%jmd>=lYt` zmH#U2XcvJI%bL;2dr+HSdEZ}dKbNS=xk=YL>Prn{*6W+sVy$TWb`O@S4YqCPQO9tT90S^nJT ztA#&CL!3U`FaQ=ZTKtZ+Pk!I3Tkz@HF7%C0zF(@uX7t^E5%P2fs<<$s*u{@`X&eJw z39;0>fArU!%w_jv6AWIaBQT_CHa7U5i7D7!lyLsN{#*jh!Q%C?zPlv-PgKnnR`dU3 z>Z`+|`o6CR3`zl|6ln$gfOOY@ASK-mA|>4&15yeSiqaj@A>9Z_IWT~fbTf1fJq+{S z8Na{hdH*HuJ@?#wcC5AbzHoz3P6%L9F;6Q4ZTTX*RFF;#0p4dkj)Ltj|8*?-AFyz7 ziQq==d4>Vm_i9ohbPst6If}QcX{G@!0hgn|6TXv;FIMfck9}LEqVg7I0t3hld3!E{ z)P^suu_XH*oYJ%OCh13Mj(cFqh9FO&4#TSs5|SJy)-~5R(>0?gE=OcK>mTZ#GGFe! zTcGVw&S4hgJr)k^p~@4jS_ z^+pZ8F0I2GK2$kCsv*e5Ai|3f{!0R$yT$G2)^-%+OLI_Jb^QXZm?d;hy@N>@|M`U)&dRo}(B$Dd z{lxEc@53=h{a^c2ML#rkF>ya!jEH=C zX76rsyQzIef2=oP#9=4#a+WP1(cAGrVQV}%chgThq3ZS^Rc8%IOs|9DsJ^OyCX+5e z3jgV!rW^M?>6)^&T*;yhUB-l*%u@Gfp8MnrYhIorql0-e%ZUy6j;Ty$5Vv&q`btUn zaOgx)KYY#dkKYRt055^0L)A94;kbn^!3kBxhU1%=+t_#9BpUZVApS+ez#5(O#-sc4 zm{nP1w{(>ZIZo4vD|0#xLJ{)1aRu<{O~@Y|ZhpZ@Jn-;JODgmx@{A zzE34Sedp&jUDA=cNFze?#N5NUJT*@zi9K#xOB&GUWEnZlk|~Qv>$FKstlDdVZzgnz z0URr#CKndMq^67?9{t1Fw#Rp5Jsq2&UcDIUe#=iUv#i@#JGvWrLIrEh#(+fb~ei)>*?v&+C-w^KbLAFvR|c z-D+^D`;PX%Iyi{~DGqZ1=F92oz3iv7Nm1;e6em zYVcT&a`_#j^WdFcz!FiGsbd!k#A|%e>vDeYmY(&E71@Li2@dVj1`)1Btec74o|73e zeIe6=FR>o~vQRYZJG7k1S;j;a7hvOd*bR>xf_%t+Dw#E5EIZEeQmEaf7*RQ z^jqOP@80(qu~wPb(^*Wc zr+XN>@T{kS$m6+dn)_%gI!fkVY#OXKzTvP51w3khiThzEU9b@-7!LN&IhwNNT(NL{ z!S&Ioqd9G7qTaq{XBIDzGgw-HLsYL{Dm1ihflA;Y_BHmno@iv)8>>~=HXBERo*DXl zG|G&$Fv@X3ypT?#r4+hv{T4!lZ()vw|MWgzd?of2k-3SOZ5i5mSY|Z5!>%6VzQRLI z%sH501EqEU$p-TL_b3M=!cRCKl68Lcp=DA{DWs|L1PgD`)YMX3uDCSR_JsgYGHlte zhp(@us&Eg`&Lu1c!sR3`0kH$uCji=W;IO+aL2a5Khi zH$C6NZg}H`lw1L$TJ>T9T#VFV`H4e^RmTAX)b0`d#1Hx~c=@kwo3Q`fbv~YMVJL z#7Twk+*ZxvYD$n54v|wY5HMp4bdvh`3r|YEcFZs8mZBUl_qr?+(H=-OvchfV{b0fe zm8ov^r4i*C-OrlIeAa`2WJ6kk{)i{!lN3k?6rTg4p78BIr2f)7uu^f>z3s5=_Lku3 zW)GQgm@G>qZ46f~v>VxO?y1N%_Lf|!X=b3<;c`lHevzR}q6~gxE$|jS3z6(-+WsR~!tp+>%epaRs9FZD8a>dkb3T!kRj2yUZYt7`Hc5sn z9lkM#5_CC}UcNeDxgQoIJd5)Z<(<$A|63?OZ55?^iCnzN3F9G|NnuBCpJfStq0CVF z;BYQlHMX|hM*QAIx|)FT3d`ovT1O z_bsZjPMS;`&i6BZnkw6Hk?&VI`t$D1<&*|_HkiI1?{+W_J9%Fv%)u!Yhs-E^v1k4* zwU>N9^B?Z4*5k|nhm+b<3h#OCk z*=?NpY2FL-iexCg>@%gx`q)HAB; zY00d`F?0GJYUTTBg_oI$IJr~Dgk-s0p(ZP8c@2T6x$et>G20#-%HgHzez!G_C-&^z z=X-<&!E!|9XH+>3N?E!s*UE#ks+TX7-?#tR_Wj(1u#E}`2m<;y7x_62zVRS;Z)^ol zMi-1^o%|2zxJYs;3OLP_bKz~{U9T>s7!P@Dl|6bxKVujdg-T{W&85*JFo?WDfjZ9< z3yg)G#IJtl^(WYZ zOH?;=?&xr#rG3h4x^VDqEo&*)g=cLCPeL`@0JPGzm#&gSG?Wz^yHF3 zCB0PQ10~kFSP6gP1Yh}G1tgFAwylVNJhys$B1^N|*W)0BJcB@BG`>6doaZ-qza)rX zth_hsy;~f1LRJAblMUrG<*(pYgLx$fdp#Zb4~s7^5T0zx4fAcvJi(*l{k3&euCp_^ zz5v^x^ti01xO6CEf*eVjzz&4krw7X=hNUYf3M7NV$7o&Yr(*5K`Sa1-JwI31t58D>ap4Ie`IC^l@eTD_D31oA zy4v~OkkYIU{G~rvN+8pVeWOTG8+1|;MNR-a*nqpE#reiXDWXdPY$a?m<7rkdXmEO5 zSuK^sA6nr;$aO26Fq^YNjqKk77J+Sdqrevj(Qe$^TfeG}ZFNEH9M>~Bm*#?t5Tv&o zF1JKg->e4IOpbY68kkhnM-@9$j^Y65rdM15eVTgX*o0=>X{vemhVFZ_(o*b<@-PGpbYkaG6V0HWdGaNA4ej4|9B10{rBI1odQ`FeW-8y zv2SdoG*Om@@rJ95^z7_%%l}v0Bp|V~yo|d+N zG68POLL{z7^si%F-Izk0%yZ*x5}2Cko7ue)r-Yk^KP5?!x^a=#?-OvK01(}rnHT@n zu9bz!ZvwU9JnZQSt&5lHCVi>3yoeo5@=FJbc5xG@6lE_2QtV(C^mEt?i zZ!#Q~UY?n`dZ(K6RBq8{=_8nTPd5s&C7IB_WBxK zK_}N+(1(E_A@oVz^}x3dKMJYef51u^W~kpfps9AZ`=EBWx}zz2)RH4eD9Gn2A(K+07p9?TsxH8|Qs-zt;Efw@_mxdn!NH7o*V!m1gE%m&iE)A-vT4 zfnExd$(YI&hn{?uWBKddSA}(_@NF6q9sg8t63!=UA)<+||BfuO%TEC^Sm#+Av0rT40bl`%_G`AngA@^$TWZC^rD$In7AYA{uh#q#vZA8>$^ul$E z@$PgSA-TYst7lq};mT2@@l7@~jxlCXIR;!VpV6k?nEizE-1pZVNv)G1SJZD_;ZkPj zohGjfo0j2O*6o2QZ^M|Y01DNHwU!1as_nV|0+M<4ghTZ1+?{SQHA0nbU{Mz#@p#^5 z>lkoR+Ya&iq@4$Lc@nR3B7VXJEbU>%?NE%nhoi zF4t=-GpNhGUNTQ0H98j9M(YUAe-Q!@jQJ*^9hgR$7|D|#_%hhiV&O}@mR16t zYJ|B;YK(1`+#~PWzQAbqjqZr9jI}PoKlA`@CiWvR1!nqu&UGuoB_f%sjDmFB#>7)s z35<*~dhaF4Aq!T+?8KFh8$DHqjcvuqOaDN_!!ABjY+PghqMMaQJMq>D;1U_fyy}Nd zw`)GU&4la+1PMUi1vQA6(VZEUmfZJB=lc$YZ#mlt#0(njk(?#0`?_vOB6gp~HC#Im zIevTVuh!*Dz6KQB6SL?wC<#b)xkfb3`EFDM$3NKJ?-PJ|v_JOP>tK5G91FuLYZ;r5%u&CA4zFt~pO+bxXO@rqc>$<~9TomnBu(>t-t>=gI%eZ3YP3 zzNFkX2uei1nrND8?295vnXw{8ui4`ahhZ~@1B&LKYabtT9wco{%^`L!&YYy75k!CK z#*miF>WzUdUul2nO#9`SBj^cSq*RKoe3Z)9nWAYv$uBNO3EyC8`5E!{*smr%sk`Qr z0Wd70OX_xYHYcA~4oZJz<8L3Q{Xe23>1(+OvlE1~yEQshSaI4^4MLP?OYF5%VeIwX zxPKq)_>p>xudlAv@@Uqvu~|kx|x+}=Kb5!kCP&^2|aYLe+Ush zv$D@J%b?fmJ@qB`Me4;;YStcgQG%`=Y(_fBZYLEy-zx>5%x~oZqoga8{j>; zhycX2;JJ{KhLI>a2G+2@maXC?G>}dJYj6%2I8qqRBMG}rpXGqAQAf~rQXsHt4rfS3rsl|-Zr6n~0TjIGKzSJV27bLG}BTJpwjAp-? z4qLa`<8Bax9Ek=;FJ9dh`>pBw&!511pT>z$*LYrD2c9;1X#*_psvaEt(XF!ch|?5r zX7KR$99Fs#H{t6y%CA%53t-~?CT(UV1?5n<-XD3Ru=)=qOKS!_28aYMw1bILTvN5@ z*S1~j;iTb3h_JUR{#Mf~yxMdz?{FrrPZ-o*`s&@FR@d2yHEH)E4d_ED>*!-jEY>rY z8p$ABjA)EV-}~>oNub|Bu1140QFvPK3bB`erd7-I(4s9{Ks<-hZCb_eeqKPGBO4smp=lWFCd!Qo~nnb$B-(PhP|9p$ldnvV+icM}#1t`m0fvmlIDZ)zlFG17)B^*y1OLmWz z#e2+RLg&vk#ZrE$H}+I!FdO&TX5r~Flf#1kKv=n<5HBc~?Z?z!PxuOO;^~ga{ulHW zIEGd;i@MJjn^I&JS{B6Hqr@$}Sqo+H+gb&*5JPznx_!U@=QgWUE^709ZuBqU?5~4X ziIPMsSH(r!C2PMWpz_h31~1SC939e2+JO@0;OpoEK-rsvnxQu>)WEzDKb9fc&${V_ z8JdxJ^mKFG#-)S95loAy$b%a8vfD4!;*5|7w266pQ{HDAu=3ZYuW*dAUeT<0HBNe4MeZc732Pv%H>or=z*ixIBo%caAbA z{MvP`wz1ZgQOugk{Kn+&3!n<-+z$i|;wz_hNX$;3bn$hnI^Op7^RK>DPVm(h$x9=6 z;rjUty&m#K=mf{*wSeKb=9BMhgm^yp0nrSI>y~g0Rf&DuL*Rz_&KJ*zYC`Adco!p{ITc$9Ou^P9kKGY7m`Tjw0Wb3mfL>6S#Np5ccAuvE!R>b9ZjG_ivkn2{yk zW@CciMdauQ)VYi@y9g9w$ZW>A_zm|^{auusme0K?nKA;Ps=@>owF%#J@bE!oweEi` z)w(!8Z|f^XR{rS06k(<%?nNL%KyeX~ETxX4u6+BOD$9GeR_6e;<=k$xWk8yWOTLSgsdP3={g*5wC2ha26>?mn-|gfDdhc|!^TI!KE&9;^Op}ty z!!x0~5k*h;+x}=hI&CH}o%KK1_z~GPZ9LL9G1gUKl~Ws+7HekOQGEbM_xQ$I0`TqX ze`#@1#%<4Y<>d2 zZ4uud4P`Ep50Vi!DB#atFPc0{b8;!^I3C-ZH0#}EV((5nZhWnnUAh?6QE%?8sA!m395(w6NKf^ZCta&Dd~d5wU;$sszG- z18v?nBfpcvQ@a;`aGn*k|2e94bD3{;+lS(kZQHHXKel0wbsF~t1o9iw3K#b^;&kn4 zvWx)-lRch@GN$3q{U@l18hbv3c=G1CP6l(usoy)mmD790&TXe%dYWr*cZg^b#OVam zm0$OrMwjZ`Sg}J-@9%wLlfxb8w!YR%s z!_TIOUkt{@f*Xvcpl<*foYVbe(SI!2v5qCceP_KUr$6rdeDOFv9;Jbyh{|Vrug-;Q z4Em#;l>RzAzAvd!T_r}D{*g?kW7FH};YlWpBmc;DTlH;ya+NyAlQZsOx<&0v32ekI zgazWi4;B4sq0jDyw^p{F5U36H6ri63Ub#W9Dl|NZ*Wi!-&80|cT41KYI-;yYGBs4< zt6<`F3VYndWKmdrgeZyq#L{ikJCDYr#Qz>wWf=C@T42mCX@&;3D1rhG{?z~-x%e9* zIyK1nr4^Rv*2NQT2{n{6JxT~$KS=w{^>u%6!JpS)!J7TpmYFq7Ja$H$Lo}`u!0bpl z0$*Pl&IVzbGk;UZ8pT z{m>MEBO4bEr@FY1YwI#skL*|%5)sCf8jNjY8xQ}~cgy6;CFK|tBx;Ca>4Kn#xHEg~ zt;7i&Q)>=*49V}r8r$})8}!eY25fv+d8=wng3?T`efVN#gR8+}f2jsc0WpjFcB^Ub zUDg#H#!yjFnEl=xpzjb1m;+-WG}MSDx)R|sQam_pX^&LXN~b<;WPTr2)BH>?$m*3< z_W~+O(pL&3N^8)+1bYCRg5WBB8Ya$iWxQu7(9dA&>W>j9OZ(XmQjj(p`V(z?!U>WJ z#P_i31~L9e_E~!k&$rX}wjOb1WS*%CA+L$gRy_w`31mng^Gmh%Yk>Bo`stq47B30B zJBf5Sa0}?)za9_tMCNx<=Dy1*fFnb{^W4ui?fK}ZlTgz(zCt{PIEPej#Ha!ulaj z^(L!x*nlOOj!zye`f+Dc{4TY(hP{mww#GmomXN;uWJ@9!nEa=vA#d7thG5Iuu;1un zF6a-v^t)w_Z1)w1)aXid>`)ac&p6C9Y5H{UR{h#uP!ABh2IYd6RP>5`o^!vOcI&jv zBEo8DGH2XasRdQt2|oa;-ZGiR_cU40OI(GU-Cxx-W7fz^-gMs!Lj%Pm4E&;lFdIkn zofs2EZ3DSv@5B})aF*HTa@uACz_kdezBNStO5cmG`MnJs7EO*g=tMOU@H zaAvK!+*^V23^ zm$!MOm*vHPR`fjn_k!C^C! zGk+2ZR0d)AVlHi}CH2_zyzs8m^8G%~%(Te#DgbN{G1XnatO2x%894bvPo8ZblajF# z>THr$;Ih289G4*8clX9B+8f>}Q>VbZHt&PmXPOqkb?4gyc~Nr@14BBRjkpTZDquZ;9*>|kitN;Ue-4MZvj|VI9sS@W zST7M1o(lxegUOBvrP?9}d2SWo{`T`F&9nX!yb_XWW5C}is68mcb#X=VhumBB@MBJX z7eKP^Ww$oyu5V-L0^tDIrCL~1E2WV_05^GTy4@mJQK+S-dCq3}RZW^i8TkCsPiEUp zOHpxRI^g%1+p(H!X{#LE8OdR=PAs+(twMixqoQ=v{gy==IE-!y#19uUQ9a(qTx_B} zP#oC&FZGJ|y#gPtE-|Fu0|&PuTiY?qa-Q(5TETrK04`%o8BZ%DY*hsXN_nc%MUNiY z4P_Y3FT!bCsLu6YSnRj9Aw(HVqf*4;-qMN&%iLL8@)GWRMM9_Q(Y57{IY*F-uW$-i zF@X@E+IlxCbL=HW@^cA`R%X4TY7Ujcd3P^7^r!6|<<>X3z>tpT#6_@yX`4FfW$QH; zQ-TfWm{r2?8sf9fFjmV`0{=`l5J@<`He=|fMI@+*MxB67qY^pz45QdTQBM`4;Bs-z zG5kyEiI1Ny7qegImhAJ>qFNJnmSDE=>o_asm|ibsw)wKrqe-G>B31V9)NkIQ$R9q> z=YmQD%P^EsDOTFlT1nkX+{IS+wcZ4zebm`WiB+u@!5CfRwC^J`O1nWif5nINJ@AyP z(DClrM3`j4SAA_+=huI&_g0DR|6@=k&gOg;VH9IHsxowZ9tJP)2^4yrw$>~u16CJ8I67LAO!uX`-WzT!bTm8!=hL?ic~W$ZsHE=QDvP`s_{ zqu;$%xlK}^Z;BUbxS|H1Z@(_An-GUW1b=rpv<0!KUcaP$x*E4Aj z?uB8usu)JW=@g&Zph(-Lb4Zr*s)uf}+#L5phj-I>zvsA;Fk1MpUbO60H?N=qGiq%b zUWwxah!!29Wabz;HN}3G3K!|&M69~MSG?#`kocv>{osye`P&3+MXCiio#@d9LX+wQ zR6QL;?JaL2!@Eby8uyX-4Un=YjIKD!I(hmol3#B58OPeo3;cnoDkW9cs__(tC0yx5 zHZ1r{M)dkBgOtg^4lTXYSR;+x7T0&ZpH>;BUD*vV=u0_44?TSG<3sf_-jK{XVA*P$ zZDT;~4V-eq!fsYDU+=5sJEp8oVYi+Ke=O-kA~KT9je*+!t)YJ`7We7Q)APggz7oHj zK(-3{J(jS$5kI>Z?jImruHJYf&KGxl@0{ncu_^)U$ntz!;KfH(;w6C{H>uO$d5jWu zt3WCeR6-iUrp?%mg0vNO`uJxkYm;b8aBCEA+z+>p`%hPitNPk9lgEE#eT@GK!!r>c zpo88)M<@}INFMUo6AiNSl6$Jlj0*nw((cqL8=sLR&oQdQcsiz)2k!koA7th<92G5M z&KmR3C7;(>BQwOD|FKAaYVu)JTN)U?C)K`ucL>=s$%G|m$ZH9;n>7_P2K5e^7sB|!?e}Mgx-Qx&6iaN<(gUWi|MjSL?PqiZs3!d@q{QgE4tp_J`ac*}y$IyO7XKAN5&CG1F5lOqNo~^>llokJlp+tN z3Xh;QSn?1a_%qkHH~xOTFaHv?3A$Yk%>{bf>)qpkWyI+wsUNR;RvFFMY=))APM?#EDBc zDvp0Q>#nj(yhoFsa0*Xv=T~L@Xg;yA(`#iUC$yuL_dEv`*B}SgTBB{w!Hb%6vt5;j zg*P-tu2y*hP?@A6hiIbfRV~ewxre)P z>YK-9uP3E@p& z<0~B6FP|+C#iO>hWauV(@?^`|+%@&h{gvJwHJ;E%7@$hVv*L?`uRb6Uj(n0e590Ra zE{5q$??xvaiTo=o78q6e!y1`AiCMd&)f&=osfu>b#6kBcgDNvDprY(oDRqUz>kYu{ z?#EsbQ!$(Oq4Rg`%U-7qLpWvx4ACc}w=~a!+(+IGuQ$!XUGpP5GV`IR#w!`&;USrN zI+P=R4#lW=|_#Ulwllb4S$%h3ky3*HrebG>exktHo`M0~j%u z=b7xP2U-wR9q`y9x<0R39ofw9+Q2?a%2Jr#E-?jBaBb&`PQ4q~s@E&FoN30mu&{I{ z+z>5K+@i)!XZkm|KKV@^3=WkWjo5awKl0-*#g`a~w;72KAKBf(IgTh^3I4t72M({F z9SW)zFPyu!$qZbZW{2p1tU_ngg&FiYym4MOcIeZ&$)ojc9yAqc`*17ZM!oS2nXv3r zIVyf?1wgJf{pNe5ArZe^WLzIoW%yILlcr%CMW5Qbrmpexszz+`=)_rs8@Ky4KUQNo!Nu!b?l6A?M&#ZCxKcux8J5J}g6he;{Xb~5Dj{rPq z_kFEx^w>-ApjED`ryI`_s-{sfqp$X3O5Rl6V0k;OuA@_ocD;=hOXAG1k6;vfk zF}BE`<+ij>A`Ave-N`7@KJMQ_XlWZlb%#rhf?D*u*gVrTzdNs+oi-tQw&1aL(Dr>+ zNpGjI=b!V;>kiBpjSAZPeZOxV)Z|0yefxU;bC0a5H1whUS*%J<_U_B7rs4(0?O}*$ z#Uz_(uzDPd#M9k=2N;TIa+5K%GgW!3@e&4`Osc3JzyM+GIjVoaMY;dQ43d(ZqRjSl zzfg5tt!x}P1+A)e9Bo7VPp?k(I&SKmTTeG&D;>>j72`E}H_6@oYi>5Pna?oPgTaEA zbx$7;p!dh~_vj*XW4YHX#s8}l2Wb3)_qKHSpl6aQO#`l0d>jL|+>=1SM+7Ptu8-8F z-(Vca!Qto-F`g{{woFJnGI|!Ep>^oDhxXEp%;vrbG@V82nKgSkBBHstZt_Yi+F%i0 za~E9&79<~xyk;w!y|T>QhbvcSkrx>TTR&W$&$Zu==8MXDosmxPD!n95#Ig$+;&g zes#~qV9@a z#P3HZ2f(dtATC~w88^(0I=1I*XY^El6^q_u{#6_K$yJqnB+{dnjF&6AaXM5>qA?uq zT{Szb_GcR0K@@nT-e~0z|GIy=GeyW%$o;Y19Gqrgk+?Wp_1&L;vA=zRK_KmnQMy;} zgD3^p&-P~5!yYneUO*v(LlZDE-W>^K7YAY10#_?hXpaL3ozaM);Ti@*?*D8# zm`g?^+xA5cbL_3cFU$K90d$<2uNBwj5mSkKI7wQWV!ED<{_}s{djA=RwoK+L`r8dH zlPvUvZ>lTtK1E>jLq+AGir}y*^M0;dct^RWJR0J+*;F&gG)KH@@F=JMdIaGiUCW)! z1Z%n%H@GBamahiHE1dlY#Sh9?17~>h1EYV5S8jO5e`#k4F(oL8C&83jj3~Yh(_f`s zt$z0s@=Um=@m@_zQ|s%T^yF6h?K>r+9cl+_)f?CUI|h{8eMBdG6n){z31iL{QmrHfM%nkk3IZEk@T!dM)@8dE&gqLDFHbc4w1_SR$BevLOWsh zAuqmv1;c*Vm*b|I9~ci|n#-x=UKHJuNz$XJz>sH(^9DCYY5Gcf_KvyaRtH(yx|zwO zq=a4L-0X|)&IP=#@6G0+^WCOa{sI2(raNyM$}L#|cPURNM0`q4LE?ESz~V{!JUij} z2+zj|vqp8G+ZcbV6ztqCdap-@{UiHWSCo6DVcHou)?k+vH5L8>z0IqVl%*r%BU|1bP0O3JqN0xS$A-iJP^^soRI zO|j)1^$hiF%ra2jipIGc`KCpblR433r=%a4u5ngc`dFgl;%0oayZR+Iz7uy$tRBtV zeFMY_0XKei_O(=Kh=&&>2>C;EEfL82-M(M-RF0dQW3U5C$m9@WP^77_2oLZas>?Wq zhrGejzuS1MVE@Y6$PZfK`Fa`v?xxJM|8`}mnXKEOfR|)!{8ON$4$y!p0>yeo!-xfhpbW`nqQ?#N+K zBf7Iy>)Z?YQlZi0&~yJ8{C7HE63YByX4cKh?MH{tNTT_=4>I%RvdTNuSjhJ+w}s0& zu_-Q_VL{5acsX0-#{5LY;uS)#Fe_vfYcTYuz5$+u&(rU9AoMD~owbMSE=&ag0voXzg+3?>hZflrtcVIlFIUQLH+! z4vwk$8W{^bndK%TVFcW=5fCfOo_YTE2&huDldt}DiG7E4KNP?t@c#iKq>T~-hIjMw zkL)6b(a{K+f#WQv%cQ<)$hoD*J6Dx zhO!ZDj3?i0+xfzfMV45@(4?ZA^KS{m|QxVA}L0 zc49*H+ijZosyJW$+PiP`bqeVTr@(N<2)`egMwK95wLmyQxY4sP#~E*uG_&Tm&qtk+ z{vbKEieX{5pvY^cz}2dR2hov0GJ)K1Pphdo_^QiflQwpL$wVrHok2v%n0pVak?)Us z>`{LHGG<^g!bN_R$NZK1mzhl;$c~S^$`UsPs>hk_%?ObH6)Q)bd5kBwMQXM) z%}`2!Rp~6FIP%7>W!miOciD?|XVjtfYJ%)!9v4!yf-Bw?0bfzp16| zBEM|VF;NA6mI7-9Y%B=Q(jM4&gbpmG=%dpsp1(x54Jl#Ru@mJCCDqwXph4;nn|rce z0VlRdD}y1n5f|3|pLoJvz{H8qrj?;ng0tb^`#Y9k!`_Aj+aDNVad8hXrEz)lSmwH9 z!nSc?F(N`5^WO?;_eCA#fWEg!FT_{uwfA4QsU~(C7*+_Xd{)zXh}d=TGJf5&ee7Es zlxBrDbjJi7CwCBPW=m&dF>@8^U(24 zh_{z1HcLlo!~3_zjrPoEyqT|!1a4He99f}nJm+`K3mWgUr!{}S9*~ECXFI{OZ2{}i zHG-)03=Yo5k#Z=?BlOevrfDQ)qqjrbyPk|*55IG{j44JZU!ug26g3j3v$8qteI-5j z^S~sg=VdVFJMFSEPW6h+VdTwcjkv$8OA)L0WztyvXB-?rt4DYFBGemo^wx~;_8w>P zb6SQ&XY-}S@3IU^MEh{+U{aN<(&2&}7;OY&wF&z-MUOuF4A%%!x7@)zb-02R;HQF!2{oV0!&|9+b4-~CIbtWB&I#!sCEHA@?BX!>#-U-y zvaH1xMCJK@U=b3Jda}g);g<$A=G#*=$=oTxD2dC!i|fgU9=*pv#GF2^T&df%L2@~} zQZueSOF`XB`CjFJph&UfMsI3JA2&R(dF^vPXL`Ea=6{YufBeh!U)y4iAk{}kr}rn; zMI;`9_g7DkdJxsf<%_e*gL%|cU|@F5x7Uxh<`x|7l8!DlR3AS`WSKK8{xQ2fS!8lE z(M*YQKwELCiut1PFpX!K>t?d0{951GSIT^o!Fa(r?U#w7*$-X+K8lftTcQ-3+=EaH zf&Y^y-KC8QUl$$Ua}>^gD7-Z1gBtje4tX086wv27|BtmRDT0kXxnuc(WPbu#*wnIO zd7Z-At5zNd9!pnQzp6%ayF}mCxw*2cqQY#%t1_-nCqn;O0n_AqeDeqaJl=KQZKG8b30`zayU z3Pt9gEXLibr`h-K8Rma}j2_hqv?)7qfGz;NSgsbr;Ysy15@n)ucR<$*gJy=kpMg8! z<8%=hv3*;s@{)?s?|5$XGhydSZT8~Q@p>auI^T2%QxwK$ZXq5`W{&%YGtyMGbHahI zog*x+cTId*W_;dz;$FIKMS}_N>RC2<75^#Dk%Hvjk2ZgL1r}JqJ6v!Ka8Y|S zi}l5t8TQPKZKe6jyfQxFw-|ifXwe3}S-#SxuSx1pyXCXuUSs^8h_5GS!pwR_ur}{) z25?v%d-~Frr+5c5yzinft#OzITNo9>WG;;O_dvk+`i!bU53QQXrW^6`#I>&j(j2k1 ztV%{6Y_5XvK|l8kC8A1z3m2B`?PZoagn+x!hY#+VVK<=Pf_+3FKTOF#i)4urU(rJQ z^TX~8GT)7d|4v__6xFY=U7$ji0Y$YEn|$WD0=|`A+>gmLv?ezgC6t+yZx6Q+zvslG zZmCe<-^Og|R*FDe@d67WNC)UUJ>=+C!|WmW3)v66JYuOx7og34r7oJt9S!4+#e5e{ zVb3;l{=Mwo!x11Ru{UU8U1{-9X>y^&zF%xMOyhRfL?uUb`^^c3AQNB!ZdX_0rHI<% z8E)IN>xN_ck9z2hLI+8}HLjhc;FoY)Wsdc~c~183PRQ*RI@3EPz1hH^oi_ABi-Q#A zZ`Sx5r$|Rwh6+~ggme<}VIc&yn#!-(zkPg1QQgefh~57C;wMW|tb`=4x%O;N?MKIu zudC%qh$gh(BLbPI7u4Lwu~w?8{dFfa6ty@v9SAQ^TSSG<8#!-vhpv2h4JZrVl2-!zl!=beKu2ih^#X-Kf&)~;{Ce$Cg5ptl z@0>_i5d7s2|C&-m?!($mV5R*8e~&{4_Ju!0e{uY;C(<38{G z*Dg^h)?m9tEdoqr0y@B65wrNC-R##60#?<`8o*xK`0TxXYO(I%6wM5(rsar-i0&SK z7eRMST_c^yHgtNk&~_f=vFhy1@7NU0d438=D(fRrFpCdJsWwmv*zzNEY_k?Cy>ff7 zwC@jm6KpkURZGteS#jnw(BYfy@-M}9(7@6} zp74F?oh$XgCRU{npOom^&-%Ek<}nAFPQ%$f^UHv?<~-`u>GdtDyy?2Z`>d0Lv!ALe z=8AiIUP=WjUs&R{)s>?gW6TbUvp$s8z7Hb^Ejg9p6d|DT$^wQc1(}~0d)nSz|F88K zI^@?h&YF%_4ke39c_sU2a5)K-eb*DWINKFR$~Ec&=tQ zk(=FPSGJyiK{hUuwi3yB{+7+X6zvf(pE+Hx1D|3Y@o2JGw9n+`cdk&ft4&11uHR0# z?X*bU$*nn7U?cSlXR3oBtQAozCCT4-O{yom&2tSETQ`4HFO#{utg`%;lnBu!RL~f| zDje%kiMyjxPDOtwM+fT9CrOy92l;Z~F)=dyL@9Fne9KVV3R;L{l1!*;PukmG(6@(W57-RJ1->u-<(*O3|P;-pf^=)^M{GB5n14E>1w)V;iP@&~A+`wl()7 zPO+akR=l!QIXscQ98S9!)TbdQOHq#Bm$GEve?|K%x>;D=XQjLCsAIu@B?Q-2PV)Tn zP>t2)^1*{X%9T5&56o~XdGLP{FnlTbqSBu4b94QUm{Lg9LfH;#GP|l67>UG79yVfN*0_=v!{k*Qe9Rewn|%a_kjYbkVG$$_($3lOJU!RX-J6+{wQ& zks5nKz$c1(AN>j?5^VXXE14%f`}J@I+hX_DgULC31@-X4M_)L&I1^G!Y)z&wWTNU- z9`ZOoq`NW{D%-sMu%oDsaZslAV_P7_*7nr5n7usFmo~UPZbhs`Z(G7OWZ9&SWUNQx z+f84xY)v6pN!MPoG9>(Y_)9gnXysnIAoS_;?OaVjBQzVWY_vXVbHkyi_nPG>x6ek_ z=a3>$Q&YZVmR`NCLuVbzcGi8BsMt}lu~3~vpCgjBa@f0(a= zlvZLsUOg&TJ{{t&5DeR(?&(t~((wB=&6akqx%l>sSBJ@$Sl~V~|2@GMLbHK$S=3z} zS6Uo}K*^FOo>fHQjh{r7me@$=v$}wZ|Csal(LB*90)n2Vt{il)Hgf;Ucb2Kup7z@X zeXe3+mmXm0dSK`KG?k>ZSN*$5M8(5Ni)W5b%3!^o0zty%E`i|}f(y=vLfA~#Kj zc64;yEH7N)dCQYLDWBudIEu`jCbk9}1uDJ-rQU94S^a9JQTP)&*%0;Jq{hhNZ5H@D z|JLL2oIh+9w!43u_@5M|qRA}^cliE}S_#g2jT?L#ku@BeXr}G)fFFtvktEG|R?jHi z2M@#rTP|6c|M|ekzwv75=zE&rer}2D%Wj?{xjzA7kCo!-zsJ;nDbaqS;}{>M_bWuZ zihn>bo9?ZyokzX`ovqG>bR=a(s-TYfuvVIWd45%+j!Dki<1uGpEWC_?BFEiFKc*AB~a$l_Cih&%7yubyR@4r-4N=F7fHA zhw8*}buJrTwa)IF&UX_N&VjNe)+8_8wtq!rjDOerZSm|r^>*oFC$d$78c2!SLwSuE zhv%g@$~?7+$EofCy+jg<-F-8nQT+cemy9$C&fjQ? zLeJn30~Dm&DnBQxcwMx#3j7EA+PBVVjhLfb_U2{#uvKJU6ptYB|lc^aUlqYhB1>lO#P3>L%6vrXHdN51W{A zfEh7V4d-6hcs9EMn@$3xr?a*-x3w|Bi*7v`>2uXuOQ{i0s*@z+nzAzX@TAVA5Z^{g zH@>3grqYQ9w@nbcn%AF{Uq|5s(Co#j)p_{(L_59`yG^KwSOXsmZ$(wr3W$N^_K#Jo z(x_{qrkZud!y~nBljuWEKG?E-f}gMUUL*sVXBM>dE#;9@J;zsGHG#yQKe076wmF#9 zDtQwN8C^RzvfDsQ_XCOnL>RAV9%t0UqcBo2pTrs!>O5WO=zuXJ&WSWnIMK$9oMun7 z7U(bzmHb%G1MZ31yEr;>@8y8kNWC&hSTt~XPDv>ueyI%K**m6n^ml#X+mVX5u6ZLVrY38h1+RxSU*q#nJY zqFgr`r_XD#=(pPwA0d7@KYw+Iw#KSiTO!R z1!!i<>#6kQ$*5`tlP7XCcnIs6@6Jgk>tLvTKMk)zAyXzsCfdoo#$4C|EtcYUZ~Zv)5+sy!>JrA5ctW#*&-TmOs~?x6YHV zacbGN26Cy=TxJ<50(<`YF;t(SJx5#o^dxI>F?G=}6sVgb2Ord<+th7R=WIO?BQRq;Gd3Y&DGcyOTi_vM5AyTG24T_+9WT}R|avz-F+ zYop$}0KPduNfQUjv`@5Qo3$P@Dkfq2)5O-bjx3@F>UqAx3^$8aKA7?-zQYQl)cuV! zplP<-=D*XB=g!w^FB@H0#KE;bZ21FnfI`{f#7?A@x0x|T8!Dv;(FZ zVRQ}alH--ip-&nvK&(A0t7f9KP+W@+t6wy%i9nom$D_^OzPYG~4O{698=PZH=(5{1 z1}lxoKDD!+Wx!gx5RD;eIacTx7up^Y|5}g69uY)Y_Ek(fa$>E1G8L_u!A{fF=(>e5 zo7V=MKjvPVbE;gP4EC+x0MhqUV3Hukf}B^_43GdS)M=c#u8Ww*{7hIc+qx;DA4E;QJOYLJo>M>=+vNhyt!h>6p?d|dGjPXQ0LDP)0 zofPW4X$2>cs#(GuNZb_M#;6;U))DR8e%LisS0VLEYi9;1%@ayJRnf5hrETkaE;l2n zCw0tG<1yO)MeCe5jajSqh7mHc`t>EYqo_hbwgx(wX85fv#+2a{8mdvl9B`+twSAx* z9JDS|`&Xu1%4}SlUX!XEPc%(LtGv~4h?Dbu^{ zbk`7Jo{;-4pG39$tM}_AXRdQeLrVJ^0@fx94`aXgabI!&03WH|-QY1@z5SzSDx^S}$Ou|n6% zAGXMsHV^&9rcMmDLhXr<-S$B8L0XtL9-*)`w+4pkkn)y@sihcAK zI8dOh2; vN7Gzqn|XZU+%*e#k6E2htKAGog8u&jJEM|OB0f}U00000NkvXXu0mjfh>YAj diff --git a/applications/PoP/toolchain/1.1-2.png b/applications/PoP/toolchain/1.1-2.png deleted file mode 100644 index 9c8a8e9505604cd6480628b144a89daeb1412715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11117 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 list[int]: - text = path.read_text() - match = re.search(rf"byte {name}\[\] = \{{(.*?)\n\}};", text, re.S) - assert match, f"{name} not found in {path}" - body = re.sub(r"//[^\n]*", "", match.group(1)) - body = re.sub(r"/\*.*?\*/", "", body, flags=re.S) - - def word(mm: re.Match) -> str: - value = int(mm.group(1), 0) - return f"{value & 0xFF}, {(value >> 8) & 0xFF}" - - def bin4(mm: re.Match) -> str: - b7, b6, b5, b4 = (int(v, 0) if v != "_" else 0 for v in mm.groups()) - return str((b4 << 4) | (b5 << 5) | (b6 << 6) | (b7 << 7)) - - def bin8(mm: re.Match) -> str: - bits = [int(v, 0) if v != "_" else 0 for v in mm.groups()] - return str(sum(bit << (7 - i) for i, bit in enumerate(bits))) - - def image_data(mm: re.Match) -> str: - h, w, flags = (int(v, 0) for v in mm.groups()) - return (f"{h & 0xFF}, {(h >> 8) & 0xFF}, " - f"{w & 0xFF}, {(w >> 8) & 0xFF}, " - f"{flags & 0xFF}, {(flags >> 8) & 0xFF}") - - body = re.sub(r"\bWORD\s*\(\s*(\w+)\s*\)", word, body) - body = re.sub(r"\bIMAGE_DATA\s*\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\)", - image_data, body) - body = re.sub(r"\bBINARY_4\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin4, body) - body = re.sub(r"\bBINARY_8\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin8, body) - body = re.sub(r"\b_\b", "0", body) - # Hex обязан идти первым: иначе regexp съедает в `0x20` только `0`. - return [int(v, 0) for v in re.findall(r"0[xX][0-9a-fA-F]+|\d+", body)] - - -def parse_glyphs(vals: list[int]) -> tuple[dict, list[dict]]: - first, last = vals[0], vals[1] - font = { - "first": first, - "last": last, - "ascent": vals[2] | (vals[3] << 8), - "below": vals[4] | (vals[5] << 8), - "space_lines": vals[6] | (vals[7] << 8), - "space_chars": vals[8] | (vals[9] << 8), - } - pos = 10 + (last - first + 1) * 2 # offsets у SDLPoP вычисляются в runtime - glyphs = [] - while pos < len(vals): - h = vals[pos] | (vals[pos + 1] << 8) - w = vals[pos + 2] | (vals[pos + 3] << 8) - pos += 6 # height, width, flags - stride = (w + 7) // 8 - rows = [] - for _ in range(h): - rows.append(vals[pos:pos + stride]) - pos += stride - glyphs.append({"h": h, "w": w, "rows": rows}) - assert len(glyphs) == last - first + 1, f"glyph count {len(glyphs)}" - return font, glyphs - - -def glyph_pixels(glyph: dict, color: int) -> bytes: - """1 бит/пиксель SDLPoP -> 8bpp getimage: 1 = color.""" - out = bytearray() - for row in glyph["rows"]: - for x in range(glyph["w"]): - byte = row[x // 8] - on = byte & (1 << (7 - (x & 7))) - out.append(color if on else 0xFF) - return bytes(out) - - -def pack_atlas(fonts: list[tuple[dict, list[dict], int]]) -> int: - entries = [] - for font, glyphs, color, first, last in fonts: - assert font["first"] <= first <= last <= font["last"] - entries.extend((glyph, color) for glyph in - glyphs[first - font["first"]:last - font["first"] + 1]) - assert len(entries) <= 255 - - data_off = ATL_DIR_OFF + len(entries) * 8 - out = bytearray(data_off) - out[0:4] = ATL_MAGIC - out[4] = len(entries) - for index, (glyph, color) in enumerate(entries): - offset = len(out) - pixels = glyph_pixels(glyph, color) - out += glyph["w"].to_bytes(2, "little") - out += glyph["h"].to_bytes(2, "little") - out += pixels - directory = ATL_DIR_OFF + index * 8 - out[directory:directory + 2] = offset.to_bytes(2, "little") - out[directory + 2] = glyph["w"] - out[directory + 3] = glyph["h"] - out[directory + 4] = 1 - out[directory + 5] = 1 - - if len(out) > SNAPSHOT_OFF: - raise SystemExit(f"font atlas: {len(out)} Б, нет места для palette snapshot @ {SNAPSHOT_OFF:#x}") - OUT_DIR.mkdir(parents=True, exist_ok=True) - OUT_ATL.write_bytes(out) - return len(out) - - -def emit_header(small: dict, big: dict, atlas_size: int) -> None: - small_n = LAST - FIRST + 1 - text = f"""/* - * pop_font.h — контракт FONT\\FONT.ATL, СГЕНЕРИРОВАН. - * Источник: SDLPoP hc_small_font_data[] и hc_font_data[]. - * Генератор: toolchain/pop_extract_font.py. Руками не править. - */ -#ifndef POP_FONT_H -#define POP_FONT_H - -#include - -#define POP_FONT_COLOR 0x{FONT_COLOR:02X} -#define POP_FONT_DARK_COLOR 0x{FONT_DARK_COLOR:02X} -#define POP_FONT_FIRST {FIRST} -#define POP_FONT_LAST {LAST} -#define POP_FONT_SMALL_BASE 0 -#define POP_FONT_SMALL_ASCENT {small['ascent']} -#define POP_FONT_SMALL_SPACE {small['space_chars']} -#define POP_FONT_BIG_BASE {small_n} -#define POP_FONT_BIG_ASCENT {big['ascent']} -#define POP_FONT_BIG_SPACE {big['space_chars']} -/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом. - * Набор обрезан по '_' — им пишется только таблица рекордов. */ -#define POP_FONT_DARK_BASE {2 * small_n} -#define POP_FONT_DARK_FIRST {DARK_FIRST} -#define POP_FONT_DARK_LAST {DARK_LAST} -#define POP_FONT_SNAPSHOT_OFF 0x{SNAPSHOT_OFF:04X} -#define POP_FONT_ATLAS_SIZE {atlas_size} - -#endif -""" - OUT_H.write_text(text) - - -def main() -> None: - parsed = [] - for path, name in ((SRC_SMALL, "hc_small_font_data"), (SRC_BIG, "hc_font_data")): - font, glyphs = parse_glyphs(extract_array(path, name)) - print(f"{name}: chars={font['first']}..{font['last']} ascent={font['ascent']} " - f"space={font['space_chars']}") - parsed.append((font, glyphs)) - sets = [(parsed[0][0], parsed[0][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_DARK_COLOR, DARK_FIRST, DARK_LAST)] - atlas_size = pack_atlas(sets) - emit_header(parsed[0][0], parsed[1][0], atlas_size) - print(f"{OUT_ATL}: 2 x {LAST - FIRST + 1} + {DARK_LAST - DARK_FIRST + 1} glyphs, " - f"{atlas_size} Б; " - f"snapshot from 0x{SNAPSHOT_OFF:04X}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_extract_kid_data.py b/applications/PoP/toolchain/pop_extract_kid_data.py deleted file mode 100644 index 88071bb..0000000 --- a/applications/PoP/toolchain/pop_extract_kid_data.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_extract_kid_data.py — извлекает данные анимации Kid из исходников -SDLPoP в C-заголовок roomtest/kid_data.h (Фаза K1). - -Извлекает: - frame_table_kid[] (seg006.c) -> kframe kid_frames[] {image,dx,dy,flags} - original_seqtbl[] (seqtbl.c) -> byte kid_seqtbl[] (2310 Б, база 0x196E) - original_seqtbl_offsets[] (seqtbl.c) -> word kid_seq_off[] (seq_id -> адрес) - -seqtbl адресуется базой SEQTBL_BASE=0x196E: элемент = kid_seqtbl[addr-0x196E]. -Автогенерация — чтобы не переписывать ~180 кадров + 2КБ байткода руками. -""" -import os -import re - -SRC = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "SDLPoP", "src") -OUT_BIN_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "..", "poc", "res", "kid") -OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "..", "roomtest", "kid_data.h") -SEQTBL_BASE = 0x196E - - -def read(name): - return open(os.path.join(SRC, name)).read() - - -def parse_frame_table(txt, name="frame_table_kid"): - """frame_table_kid[]/frame_tbl_guard[] -> список (image, dx, dy, flags). - Записи вида { IMG, 0xC0| 4, DX, DY, 0x40| 4 } — sword/flags как - OR-выражения.""" - m = re.search(r'const frame_type ' + name + r'\[\]\s*=\s*\{(.*?)\n\};', txt, re.S) - body = m.group(1) - frames = [] - for row in re.findall(r'\{([^}]*)\}', body): - parts = [p.strip() for p in row.split(',')] - image = int(parts[0], 0) - sword = eval(parts[1], {}, {}) # напр. "0x00| 9" - dx = int(parts[2], 0) - dy = int(parts[3], 0) - flags = eval(parts[4], {}, {}) - frames.append((image & 0xFF, dx & 0xFF, dy & 0xFF, flags & 0xFF, sword & 0xFF)) - return frames - - -def parse_sword_tbl(txt): - """sword_tbl[] (seg006:2047) -> список (id, x, y). id 255 = клинка нет. - Индекс — sword_frame (cur_frame.sword & 0x3F); один и тот же chtab_0 и у - Кида, и у стража.""" - m = re.search(r'const sword_table_type sword_tbl\[\]\s*=\s*\{(.*?)\n\};', txt, re.S) - rows = [] - for row in re.findall(r'\{([^}]*)\}', m.group(1)): - a, b, c = [int(p.strip(), 0) for p in row.split(',')] - rows.append((a & 0xFF, b & 0xFF, c & 0xFF)) - return rows - - -def parse_byte_array(txt, name): - m = re.search(r'const byte %s\[\]\s*=\s*\{(.*?)\}' % name, txt, re.S) - return [int(x, 0) for x in re.findall(r'0x[0-9A-Fa-f]+|\d+', m.group(1))] - - -def parse_word_array(txt, name): - m = re.search(r'const word %s\[\]\s*=\s*\{(.*?)\}' % name, txt, re.S) - return [int(x, 0) for x in re.findall(r'0x[0-9A-Fa-f]+|\d+', m.group(1))] - - -def emit_c(vals, per_line=12, fmt="0x%02X"): - out = [] - for i in range(0, len(vals), per_line): - out.append(" " + ",".join(fmt % v for v in vals[i:i + per_line]) + ",") - return "\n".join(out) - - -def main(): - seg006 = read("seg006.c") - seqc = read("seqtbl.c") - - frames = parse_frame_table(seg006) - gframes = parse_frame_table(seg006, "frame_tbl_guard") - # Кадры КАТСЦЕН (frame_tbl_cuts, seg006:417) — Princess и Vizier. Нужны - # сценам 8/9 и финалу: там персонажи ходят теми же последовательностями - # seqtbl, что и в игре, но кадры адресуют свои chtab (sword>>6: 1 = набор - # PV1 ресурса 800, 2 = PV2 ресурса 900). - cframes = parse_frame_table(seg006, "frame_tbl_cuts") - seqtbl = parse_byte_array(seqc, "original_seqtbl") - offs = parse_word_array(seqc, "original_seqtbl_offsets") - swtbl = parse_sword_tbl(seg006) - - with open(OUT, "w") as f: - f.write("/* kid_data.h — данные анимации Kid (frame_table + seqtbl +\n" - " * offsets), извлечено toolchain/pop_extract_kid_data.py из\n" - " * SDLPoP. НЕ править вручную. seqtbl адресуется базой\n" - " * SEQTBL_BASE: kid_seqtbl[addr - SEQTBL_BASE]. */\n") - f.write("#ifndef KID_DATA_H\n#define KID_DATA_H\n#include \n\n") - f.write("#define SEQTBL_BASE 0x%04Xu\n\n" % SEQTBL_BASE) - - # frame table и seqtbl В .h НЕ ПОПАДАЮТ — они уезжают в kid.ani - # (EMM-страница): 3.5 КБ в _CODE окна W1/W2 нам дороже, чем один - # gfx_w0_map за тик. См. applications/PoP/docs/layout_plan_v2.md §5.1. - f.write("/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid).\n" - " * САМА таблица кадров и seqtbl лежат в kid.ani (EMM-\n" - " * страница); здесь только тип и размеры. */\n") - f.write("typedef struct { uint8_t image; int8_t dx, dy; " - "uint8_t flags, sword; } kframe;\n") - f.write("#define KID_NFRAMES %d\n" % len(frames)) - f.write("#define KID_SEQTBL_LEN %d\n\n" % len(seqtbl)) - - # раскладка kid.ani (смещения ОТ НАЧАЛА ДАННЫХ страницы) - f.write("/* Раскладка kid.ani: кадры (KID_NFRAMES*5), затем seqtbl. */\n") - f.write("#define KID_BIN_FRAMES_OFF 0\n") - f.write("#define KID_BIN_SEQTBL_OFF %d\n" % (len(frames) * 5)) - f.write("/* Таблица кадров СТРАЖА (frame_tbl_guard, seg006:372): индекс\n" - " * frame + add_frame - 149 (add_frame=70 для кадров 102..106). */\n") - f.write("#define KID_NGFRAMES %d\n" % len(gframes)) - f.write("#define KID_BIN_GFRAMES_OFF %d\n" % (len(frames) * 5 + len(seqtbl))) - f.write("/* Таблица кадров КАТСЦЕН (frame_tbl_cuts, seg006:417):\n" - " * Princess/Vizier, индекс — номер кадра как есть. Набор\n" - " * спрайтов выбирает sword>>6 (1 = PV1 res800, 2 = PV2 res900). */\n") - f.write("#define KID_NCFRAMES %d\n" % len(cframes)) - f.write("#define KID_BIN_CFRAMES_OFF %d\n\n" - % (len(frames) * 5 + len(seqtbl) + len(gframes) * 5)) - - # seq offsets - # kid_seq_off — МАКРО-инициализатором, не готовым массивом: заголовок - # включают почти все модули PoP, и `static const` размножал таблицу по - # каждому TU мёртвой копией (замер 2026-08-08: 230 Б × 9 модулей = - # 1840 Б впустую, в т.ч. 460 Б резидента W1/W2). Сам массив - # определяет ОДИН pop_kid.c — та же причина, что у sword_tbl ниже. - f.write("#define KID_NSEQ %d\n" % len(offs)) - f.write("#define KID_SEQ_OFF_INIT { \\\n") - f.write(emit_c(offs, 8, "0x%04X").replace("\n", " \\\n") + " \\\n}\n\n") - - # sword_tbl — макро-инициализаторами, а не готовыми массивами: так - # 159 байт таблицы лягут в ОДИН TU (pop_kid.c), а не в каждый, кто - # включил заголовок. - f.write("/* sword_tbl (seg006:2047): клинок отдельным спрайтом chtab_0.\n" - " * Индекс — sword_frame (кадр.sword & 0x3F), id 255 = клинка нет.\n" - " * Смещения x/y — ЭКРАННЫЕ (применяются после calc_screen_x_coord),\n" - " * x — «вперёд» по направлению персонажа. */\n") - f.write("#define KID_NSWORD %d\n" % len(swtbl)) - for i, (nm, fmt) in enumerate((("ID", "0x%02X"), ("DX", "%d"), ("DY", "%d"))): - # dx/dy — знаковые: печатаем со знаком, иначе int8_t = overflow - vals = [r[i] if i == 0 else (r[i] - 256 if r[i] > 127 else r[i]) - for r in swtbl] - f.write("#define KID_SWORD_%s_INIT { \\\n" % nm) - f.write(emit_c(vals, 12, fmt).replace("\n", " \\\n") + " \\\n}\n") - f.write("\n#endif\n") - - # kid.ani: кадры (по 5 байт) + seqtbl подряд - os.makedirs(OUT_BIN_DIR, exist_ok=True) - binpath = os.path.join(OUT_BIN_DIR, "kid.ani") - with open(binpath, "wb") as b: - for (img, dx, dy, fl, sw) in frames: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - b.write(bytes(seqtbl)) - for (img, dx, dy, fl, sw) in gframes: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - for (img, dx, dy, fl, sw) in cframes: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - print(f"kid.ani: {len(frames)*5 + len(seqtbl) + len(gframes)*5 + len(cframes)*5} Б " - f"(кадры Kid + seqtbl + кадры стража + кадры катсцен) -> {binpath}") - - print(f"kid_data.h: {len(frames)} кадров, seqtbl {len(seqtbl)} Б, " - f"{len(offs)} seq-оффсетов -> {OUT}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_arc.py b/applications/PoP/toolchain/pop_pack_arc.py deleted file mode 100644 index fd12db3..0000000 --- a/applications/PoP/toolchain/pop_pack_arc.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_arc.py — сложить несколько ресурсов в один архив PBA1. - -ЗАЧЕМ. На диске игры лежит больше трёхсот отдельных файлов, и дело не в -беспорядке: замер в MAME (2026-08-25) показал, что ОДИН `open` стоит -51,4 мс, а чтение 16 КБ из уже открытого файла — 32,6 мс. То есть 61 % -времени загрузки уходит на открытие, а не на данные. Одна только стартовая -пачка (kid + shadow + bg + sound + guard, ~142 файла) — это 7,3 секунды -чистого `open`. Сложив группу в архив и открыв его ОДИН раз, мы эти -секунды возвращаем. - -ФОРМАТ (512-байтовый заголовок, дальше данные): - - 0..3 'PBA1' магия и версия — как SPA1 у атласов, PCFG, POPQ - 4 count число записей, 1..126 - 5..7 резерв (нули) - 8.. записи по 4 байта: - +0..1 offset в СЕКТОРАХ по 512 от начала файла (uint16 LE) - +2..3 size в байтах (uint16 LE) - -Оффсет именно в секторах: архив `pv` — мегабайт, в байтах uint16 не хватило -бы. В секторах uint16 покрывает 32 МБ, то есть весь наш образ. Размер при -этом спокойно живёт в байтах — ни один ресурс не крупнее 16 КБ, потому что -каждый обязан помещаться в EMM-страницу. - -Данные каждого элемента выровнены на 512, поэтому его смещение всегда -целое число секторов, а чтение попадает в границу сектора DSS. -""" -import re -import sys -from pathlib import Path - -MAGIC = b"PBA1" -HEADER = 512 -SECTOR = 512 -MAX_ENTRIES = (HEADER - 8) // 4 # 126 - - -def build(out_path: Path, files: list[Path]) -> None: - if len(files) > MAX_ENTRIES: - raise SystemExit(f"{out_path.name}: {len(files)} файлов, " - f"в заголовок влезает {MAX_ENTRIES}") - header = bytearray(HEADER) - header[0:4] = MAGIC - header[4] = len(files) - - blob = bytearray() - for i, f in enumerate(files): - data = f.read_bytes() - if len(data) > 0xFFFF: - raise SystemExit(f"{f}: {len(data)} Б — размер не влезает в uint16") - offset = HEADER + len(blob) - assert offset % SECTOR == 0 - rec = 8 + i * 4 - header[rec:rec + 2] = (offset // SECTOR).to_bytes(2, "little") - header[rec + 2:rec + 4] = len(data).to_bytes(2, "little") - blob += data - pad = -len(blob) % SECTOR - blob += bytes(pad) - - out_path.parent.mkdir(parents=True, exist_ok=True) - out_path.write_bytes(bytes(header) + bytes(blob)) - - -def const_name(prefix: str, path: Path) -> str: - """kid12.atl -> ARC_KID_KID12; kid.pal -> ARC_KID_KID_PAL.""" - stem = path.name - if stem.lower().endswith(".atl"): - stem = stem[:-4] - return f"ARC_{prefix}_" + re.sub(r"[^A-Za-z0-9]", "_", stem).upper() - - -def write_header(path: Path, prefix: str, files: list[Path]) -> None: - """Индексы элементов — константами, чтобы код не считал их на память. - - Порядок задаёт Makefile, и он же единственный источник истины: сдвинулся - список — сдвинулись константы, а серии вроде kid0..kid27 код проверяет - статически (`#if ARC_KID_KID27 - ARC_KID_KID0 != 27`). - """ - lines = [f"/* {path.name} — индексы в архиве {prefix}. СГЕНЕРИРОВАН", - " * (toolchain/pop_pack_arc.py), руками не править. */", - f"#ifndef {path.stem.upper()}_H", - f"#define {path.stem.upper()}_H", - "", - f"#define ARC_{prefix}_COUNT {len(files)}", - ""] - width = max(len(const_name(prefix, f)) for f in files) - for i, f in enumerate(files): - lines.append(f"#define {const_name(prefix, f):<{width}} {i}") - lines += ["", "#endif", ""] - path.write_text("\n".join(lines)) - - -def main() -> None: - args = sys.argv[1:] - header = prefix = None - while args and args[0].startswith("--"): - opt = args.pop(0) - if opt == "--header": - header = Path(args.pop(0)) - elif opt == "--prefix": - prefix = args.pop(0) - else: - raise SystemExit(f"неизвестный ключ {opt}") - if len(args) < 2: - raise SystemExit("usage: pop_pack_arc.py [--header H.h --prefix NAME] " - "OUT.ARC file [file ...]") - out = Path(args[0]) - files = [Path(a) for a in args[1:]] - for f in files: - if not f.exists(): - raise SystemExit(f"нет файла: {f}") - build(out, files) - if header: - if not prefix: - raise SystemExit("--header требует --prefix") - write_header(header, prefix, files) - total = out.stat().st_size - print(f"{out.name}: {len(files)} записей, {total / 1024:.0f} КБ") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_bg.py b/applications/PoP/toolchain/pop_pack_bg.py deleted file mode 100644 index 75d8d58..0000000 --- a/applications/PoP/toolchain/pop_pack_bg.py +++ /dev/null @@ -1,628 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_bg.py — упаковщик спрайтов СТАТИЧЕСКОГО ФОНА PoP (Шаг 2 порта). - -Что делает: - 1. Определяет РЕАЛЬНО используемый набор спрайтов фона (прогоняет - render_room.py по всем комнатам всех уровней, собирает (chtab,id)). - 2. Грузит исходные PNG (VDUNGEON→VPALACE каскад, как в игре), переводит - 16-цветный индексированный пиксель в 8bpp getimage-блоб: - индекс 0 -> 0xFF (прозрачность getimage) - индекс i -> 0x50+i (env, chtab_6) / 0x60+i (wall, chtab_7) - 3. Пакует в атласы .atl с ПРЯМОЙ адресацией (idx = id), каталог любого - размера (блобы кладутся ПОСЛЕ каталога — загрузчик atlas_image читает - offset явно, лимит 19 из libbgi/mkatlas.py не действует). libbgi НЕ - трогаем. Дырки в каталоге (неиспользуемые id) = фейковые записи, - ссылающиеся на общий пустой 0×0-блоб (осознанная трата места в EMM - ради нулевых remap-таблиц в W2 — требование пользователя). - 4. Собирает палитру Sprinter (.pal, записи B,G,R,0) из res200.pal (env - -> слоты 0x50..0x5F) и res360.pal (wall -> 0x60..0x6F). VGA 6-бит - каналы масштабируются в 8-бит. - 5. Пишет C-заголовок с раскладкой (имена файлов, SHIFT, число страниц, - набор fore-id). - -Раскладка (прямая адресация, SHIFT=5): - ENV фон : 5 страниц, страница = id>>5, idx = id&31 - WALL : 1 страница, idx = id - FORE : 1 страница (спрайты «перед персонажем»: фронты столбов/ - ворот/дебриса), idx = id — отдельный атлас (жизненный цикл - другой: рисуются каждый кадр как sprite_t, не запекаются). -W2-цена: 7 хэндлов atlas_t (~21 Б), ноль таблиц id->позиция. - -Выход: в applications/PoP/poc/res/bg/ — *.atl + pop_bg.pal + pop_bg_atlas.h -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import render_room as R # noqa: E402 (экстрактор + каскад загрузки) - -OUT_DIR = os.path.join(HERE, "..", "poc", "res", "bg") - -# Спрайты FORE-слоя (add_foretable в seg008 — «перед персонажем»): фронты -# столбов, ворот, дебриса. См. tile_table.fore_id + анализ pop_background_strategy. -# 119..123 — фронт чомпера и его кровь; 77 — фронт ЗЕРКАЛА (MIRROR_ENV_IDS). -# -# id 12 ЗДЕСЬ НЕТ намеренно. В tile_table он стоит как fore_id ЗЕЛЬЯ -# (0x0A), но зелье рисуется из chtab_1 (`add_foretable(id_chtab_1_...)`, -# seg008 draw_tile_fore; у нас — pop_potion_flask), а в chtab_6 под этим -# номером лежит ПРАВАЯ ЧАСТЬ АРКИ БАЛКОНА (32x62), и она идёт в backtable: -# `BT room=18 r=1 c=7 ch=6 id=12` в трассе оригинала. Пока 12 был в этом -# списке, он уезжал в fore-атлас, а env-страница получала дырку — правая -# половина портала не рисовалась вовсе (BUG-BALCONY-RIGHT). -FORE_ENV_IDS = {9, 49, 88, 91, 95, 100} | {106, 107, 108, 109, 110} \ - | {119, 120, 121, 122, 123} | {77} - -# Пол-оверлей подъёма (floor_left_overlay, draw_floor_overlay seg008): рисуется -# рантаймом поверх нижней части Kid при подтягивании на пол у кромки — НЕ -# попадает в used render_room, добавляем явно в env-фон. (32 обычно уже есть.) -CLIMB_OVERLAY_ENV_IDS = {32, 150, 151} - -# Дрожащие/падающие кадры loose-плиты (loose_fram_left/right/bottom, seg008): -# 41/42/43 = покой (уже в used из render_room), 69-74 = вибрация/раздвоение — -# используются ТОЛЬКО динамикой (shake/fall), в статический render_room НЕ -# попадают, поэтому добавляем явно. Без них дрожащая плита невидима. -LOOSE_ANIM_ENV_IDS = {69, 70, 71, 72, 73, 74} - -# Кадры ВЫДВИЖЕНИЯ пик (seg008): три части — left (128-132, своя ячейка, -# draw_tile_anim), right (134-138, правый сосед, draw_tile_anim_right), fore -# (139-143, поверх Kid, draw_tile_fore). Рисуются ТОЛЬКО динамикой -# (animate_spike); в уровнях пики статически убраны (modif=0 → кадр 0), -# поэтому в used render_room НЕ попадают. Без них выдвинутые пики невидимы. -SPIKE_ANIM_ENV_IDS = {128, 129, 130, 131, 132, # left - 134, 135, 136, 137, 138, # right - 139, 140, 141, 142, 143} # fore - -# Кадры ЧОМПЕРА (seg008:638 chomper_fram_bot/top/for + кровь). В уровнях -# чомпер стоит с modif = 0, а chomper_fram1[0] = 3 — значит render_room -# (он анимацию пропускает вовсе, см. render_room.py:611) не кладёт в атлас -# НИ ОДНОГО кадра, и чомпер не виден даже в покое. Поэтому весь набор — -# явно. Низ и верх идут в backtable (ПОД персонажем), фронт — в foretable -# (ПОВЕРХ), поэтому фронтовые id продублированы в FORE_ENV_IDS. -CHOMPER_BOT_IDS = {101, 102, 103, 104, 105} # chomper_fram_bot -CHOMPER_TOP_IDS = {111, 112, 113} # chomper_fram_top (фазы 2..4) -CHOMPER_FORE_IDS = {106, 107, 108, 109, 110} # chomper_fram_for - -# Кровь на сомкнутых челюстях (modif & 0x80): chomper_num + 114 в backtable и -# + 119 в foretable, обе — MONO-блитом цветом 12 (blitters_4Ch_mono_12), то -# есть силуэтом, как пузырёк зелья. Появляется после смерти Кида в чомпере. -CHOMPER_BLOOD_IDS = {114, 115, 116, 117, 118} -CHOMPER_BLOOD_FORE_IDS = {119, 120, 121, 122, 123} -CHOMPER_BLOOD_COLOR = None # ставится ниже, когда известен VGA16_PAL_BASE - -# Кадры ОТКРЫТИЯ ворот (portcullis, DOOR_FRAM_SLICE + gate pieces 50/51, -# seg008 draw_gate): 50-59 + 67. В уровнях ворота статически ЗАКРЫТЫ -# (низкий modif → используются только нижние срезы 50-53); срезы более -# открытых состояний (54-59, 67) нужны анимации открытия — добавляем явно. -GATE_ANIM_ENV_IDS = {50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 67} -# ВЕРХ ворот, который рисует тайл НАД ними (draw_tile_anim_topright, -# seg008:0568): маска 68 (mono, чёрным — «продавить» фон под створкой) и -# кадр door_fram_top[(modifier>>2) % 8] = 60..67 по открытости. Без них -# над воротами остаётся чёрный треугольник (видно у шва во дворце). -GATE_TOP_ENV_IDS = {60, 61, 62, 63, 64, 65, 66, 67} -GATE_TOP_MASK_ID = 68 - - -# НАЖАТАЯ кнопка-closer (get_tile_to_draw seg008:2FE: при таймере связи >1 -# tiles_6_closer рисуется как tiles_5_stuck). tile_table[5] = база 41 (уже -# есть), правая грань 35, нижняя 36 — оба id встречаются ТОЛЬКО в этом -# динамическом состоянии, статически тайла 5 в уровнях нет, значит в used -# render_room они не попадают. Без них у нажатой кнопки чёрный провал на -# месте нижней грани и потерянная правая грань. -STUCK_ENV_IDS = {35, 36} - -# Левая половина кнопки-opener, когда СЛЕВА пусто (draw_tile_base seg008:0A8E: -# curr_tile==15 && tile_left==0 && level_type==0 → id 148 вместо базы 147). -# render_room этой ветки не знает, поэтому добавляем явно. -OPENER_NOFLOOR_ENV_IDS = {148} - -# ---- chtab_1 (flame/sword/potion), база ресурса 150, папка PRINCE ---- -# Зелье (seg008 draw_tile_fore/draw_tile_anim): склянка id 12 (малая) / 13 -# (большая, типы 2..4), кадры пузырька 16..22 (potion_fram_bubb) и его маска -# 23. Пузырёк и маска рисуются MONO-блитом (одним цветом), поэтому пакуем их -# силуэтами уже в нужном цвете: маска — чёрный env[0], пузырёк — env[12] -# (красный, тип «лечение»). Цвета других типов (9 синий / 10 зелёный) — -# TODO, когда появятся такие зелья. -POT_DIR_NAME = "PRINCE" -POT_FLAME_IDS = tuple(range(1, 10)) # пламя факела: modifier+1 (seg008:560) -POT_FLASK_IDS = (12, 13) -POT_BUBBLE_IDS = (16, 17, 18, 19, 20, 21, 22) -POT_MASK_ID = 23 -POT_PAL_BASE = 0x40 # 16 цветов chtab_1 -> слоты 0x40..0x4F -# MONO-блит (method_3_blit_mono, seg009:3040) красит спрайт цветом из ОБЩЕЙ -# 16-цветной палитры экрана, а не из палитры chtab. Кладём её в 0x30..0x3F. -VGA16_PAL_BASE = 0x30 -# Два цвета игра ПРАВИТ на старте (init_game_main, seg000:164) — стандартные -# VGA-значения там не годятся: -# 6 -> #C09850 (0x30,0x26,0x14) «palace wall pattern» — швы дворцовой кладки -# 12 -> #E00030 (0x38,0x00,0x0C) «blood, hurt flash» — кровь и вспышка урона -# Проверено дампом палитры живого SDLPoP: PAL[6]=48,38,20 PAL[12]=56,0,12. -VGA16 = [(0,0,0),(0,0,42),(0,42,0),(0,42,42),(42,0,0),(42,0,42),(48,38,20), - (42,42,42),(21,21,21),(21,21,63),(21,63,21),(21,63,63),(56,0,12), - (63,21,63),(63,63,21),(63,63,63)] # 6-битные каналы, как в .pal -# ЧЁРНЫЙ ФОН АНИМАЦИЙ — ИМЕННО ЦВЕТ 0, а не «чёрный из палитры набора». -# Вспышки (молния, урон, зелья) подменяют НУЛЕВУЮ запись палитры, и всё, -# что закрашено 0x30/0x40, остаётся чёрным островом посреди вспышки — -# пламя факелов и склянки «не мигали» (поймано пользователем 2026-08-25). -POT_MASK_COLOR = 0 # маска mono-блита = фон вспышки -POT_BUBBLE_COLOR = VGA16_PAL_BASE + 12 # ярко-красный (color 12: «лечение») -# Цвет пузырька зависит от ТИПА зелья (draw_tile_anim, seg008:652): типы 3/4 -# (перо / переворот) — зелёный, 5/6 (вред / открыть) — синий, остальные — -# красный. У нас спрайт красится при УПАКОВКЕ (mono-блиттера с параметром -# цвета в libbgi нет), поэтому каждый цвет — свой набор кадров: те же семь -# силуэтов под сдвинутыми id. Синий появится вместе с зельями 5/6. -POT_BUBBLE_GREEN_COLOR = VGA16_PAL_BASE + 10 # color 10 (seg008:663) -POT_BUBBLE_GREEN_BASE = 30 # id 30..36 = кадры 16..22 -POT_BUBBLE_BLUE_COLOR = VGA16_PAL_BASE + 9 # color 9 (seg008:658) -POT_BUBBLE_BLUE_BASE = 40 # id 40..46 = кадры 16..22 -CHOMPER_BLOOD_COLOR = VGA16_PAL_BASE + 12 # тот же mono-цвет 12 (seg008:678) - -# Кладка ДВОРЦА (wall_pattern, seg008:1928, ветка palace): тело стены — -# сплошные заливки цветом из palace_wall_colors, а поверх идут ПЯТЬ -# разделителей chtab_7 id 3..17 (prandom(2) + 3/6/9/12/15), и рисуются они -# blitters_46h_mono_6 — mono-блитом ОДНИМ цветом 6 общей 16-цветной палитры -# экрана. В подземелье те же id — обычные спрайты кирпичей (wall_fram_main/ -# bottom), поэтому силуэтом пакуем ТОЛЬКО дворцовый набор. -PALACE_WALL_MONO_IDS = set(range(3, 18)) -PALACE_WALL_MONO_COLOR = VGA16_PAL_BASE + 6 - - -# Основание факела (seg008:489 draw_tile_right: при левом соседе-факеле -# рисуется chtab_6 id 146). В статический render_room не попадает. -TORCH_ENV_IDS = {146} - -# ---- Два тайлсета: подземелье и дворец -------------------------------- -# Оригинал грузит РАЗНЫЙ .DAT под один и тот же набор id: -# tbl_envir_ki[tbl_level_type[level]] -> VDUNGEON / VPALACE (seg000:1108), -# то есть id спрайта от набора НЕ зависит — меняется только картинка и -# палитра (env 0x50..0x5F, wall 0x60..0x6F). Поэтому оба набора пакуются -# по ОДНОМУ И ТОМУ ЖЕ объединению id: раскладка id -> (страница, idx) -# остаётся одна, и коду достаточно подменить ИМЕНА файлов. -# -# Порядок каталогов — каскад: сначала «свой» набор, потом чужой как -# фолбэк (в распакованном data/ несколько id есть только в одном из них: -# res230/231/348 только в VDUNGEON, два десятка — только в VPALACE). -SETS = { - "dungeon": ("pop_", lambda: (R.VDUNGEON_DIR, R.VPALACE_DIR)), - "palace": ("pal_", lambda: (R.VPALACE_DIR, R.VDUNGEON_DIR)), -} -SRC_DIRS = None # ставит main() по выбранному набору - -# Спрайты, которые рисуются ТОЛЬКО на паласных уровнях (seg008): -# 78, 80, 82 doortop_fram_bot (низ верха двери, draw_tile_right) -# 81, 83 doortop_fram_top (draw_tile_topright) -# 84 полоска на стене (draw_tile_right, tiles_20_wall) -# 145 stripe_id соседнего тайла (draw_tile_right) -# render_room про них не знает (он рисует по подземельной ветке), поэтому -# добавляем явно — иначе при переключении набора в этих местах будет дыра. -PALACE_ENV_IDS = {78, 80, 81, 82, 83, 84, 145} - -# ЗЕРКАЛО (tile_table[0x0D] = база 75, фронт 77; 42/43 — общие грани пола). -# Тайла 13 НЕТ НИ В ОДНОМ уровне статически (проверено перебором всех 15 -# res200N.bin): оригинал СТАВИТ его в рантайме, когда дверь выхода уровня 4 -# дорисовала открытие — animate_leveldoor, seg007:0457: -# curr_room_tiles[curr_tilepos] = tiles_13_mirror; -# Значит в used от render_room эти id не попадают и без явного добавления на -# месте зеркала был бы чёрный провал (те же грабли, что у нажатой кнопки и -# дрожащей плиты — memory pop_atlas_dynamic_ids). -MIRROR_ENV_IDS = {75, 77} - -ENV_SHIFT = 4 # env фон: страница = id>>SHIFT, idx = id&MASK. - # Было 5: паласный набор добавляет куски верха - # двери (78..84), и страница 2 переваливала за - # 16 КБ. При 4 обе раскладки укладываются, цена - # — 10 страниц EMM на набор вместо 5. -ENV_MASK = (1 << ENV_SHIFT) - 1 - -# ---- .atl формат (== libbgi, но каталог не ограничен 19) -------------- -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 # _ATL_DIR_OFF -ATL_MIN_SIZE = 0x100 # atlas_load требует n >= _ATL_DATA_OFF -PAGE_SIZE = 16384 - - -def die(msg): - sys.exit(f"pop_pack_bg: {msg}") - - -# ---- 1. Набор используемых спрайтов ---------------------------------- -def collect_used(): - """Прогон render_room по всем комнатам -> множество (chtab, id).""" - used = set() - orig = R.load_sprite - - def spy(id, chtab=R.CHTAB_ENV, reason=""): - img = orig(id, chtab, reason) - if img is not None and id > 0: - used.add((chtab, id)) - return img - - R.load_sprite = spy - for lvl in range(1, 15): - fn = os.path.join(R.LEVEL_DIR, f"res{2000 + lvl}.bin") - if not os.path.exists(fn): - continue - lv = R.Level(open(fn, "rb").read()) - for room in range(1, 25): - rm = R.Room(lv, room) - L = lv.links[room][0] - if L: - rm.left_room = R.Room(lv, L) - canvas = Image.new("RGBA", (320, 192), (0, 0, 0, 0)) - for dr in (2, 1, 0): - for c in range(10): - R.draw_tile(canvas, rm, dr, c) - R.load_sprite = orig - return used - - -# ---- 2. Загрузка спрайта в 8bpp-блоб --------------------------------- -# Спрайты chtab_6, которые оригинал рисует БЕЗ прозрачности -# (blitters_0_no_transp): нижние грани тайлов (draw_tile_bottom, seg008:570) и -# нижние кадры loose (draw_loose, seg008:600). У 96/149 (грани кнопок) и 73/74 -# (кадры loose) ПОСЛЕДНЯЯ строка — пиксель 0; в оригинале она заливается ЧЁРНЫМ -# поверх того, что сзади, а у нас 0 -> 0xFF делал её прозрачной, и сквозь неё -# просвечивал Kid (спуск/подъём у кромки кнопки). 43/36 полностью непрозрачны — -# для них флаг ничего не меняет, оставлены для полноты списка. -# Дверь уровня (draw_leveldoor, seg008:1D29): решётка створки (33 — слайс 4px, -# 34 — верх), лестница за ней (99 — низ, 144 — марш). render_room.py -# draw_leveldoor не реализует, поэтому в автосбор эти id не попадают. -LEVELDOOR_ENV_IDS = {33, 34, 99, 144} - -# Куски двери уровня (draw_leveldoor) оригинал рисует blitters_0_no_transp: -# марш лестницы 144 обязан ЗАКРАШИВАТЬ поднявшуюся створку, иначе слева от -# лестницы сквозь него видна решётка (0 -> 0xFF делал фон спрайта прозрачным). -NO_TRANSP_ENV_IDS = {36, 43, 73, 74, 96, 149} | LEVELDOOR_ENV_IDS - - -def load_indexed(chtab, id, opaque=False, mono=None): - """PNG (mode P, 16 цветов) -> (w, h, bytes 8bpp). Каскад по SRC_DIRS - (порядок задаёт выбранный тайлсет, см. SETS). - Пиксель 0 -> 0xFF (прозрач); i -> base+i (env 0x50 / wall 0x60). - - opaque=True — пиксель 0 остаётся ЦВЕТОМ (base+0 = чёрный), а не ключом - прозрачности: порт blitters_0_no_transp (см. NO_TRANSP_ENV_IDS).""" - base_res = 360 if chtab == R.CHTAB_WALL else 200 - pal_base = 0x60 if chtab == R.CHTAB_WALL else 0x50 - fname = f"res{base_res + id}.png" - path = None - for d in SRC_DIRS: - p = os.path.join(d, fname) - if os.path.exists(p): - path = p - break - if path is None: - die(f"нет файла {fname}") - im = Image.open(path) - if im.mode != "P": - die(f"{fname}: mode {im.mode}, ожидался P (16-цветный)") - src = im.tobytes() - if mono is not None: - # MONO-блит (blitters_4Ch_mono_12): спрайт красится ОДНИМ цветом из - # 16-цветной палитры экрана — пакуем силуэтом, как пузырёк зелья. - out = bytes((0xFF if v == 0 else mono) for v in src) - elif opaque: - out = bytes((pal_base + v) for v in src) - else: - out = bytes((0xFF if v == 0 else pal_base + v) for v in src) - return im.width, im.height, out - - -def load_potion(id, mono=None, opaque=False): - """chtab_1: res(150+id).png из data/PRINCE. mono=None — обычный спрайт - (палитра chtab_1 -> слоты POT_PAL_BASE+i); mono=цвет — силуэт этим цветом - (порт blitters_40h_mono); opaque=True — пиксель 0 остаётся ЦВЕТОМ - (порт blitters_0_no_transp, см. POT_FLAME_IDS).""" - path = os.path.join(os.path.dirname(R.VDUNGEON_DIR), POT_DIR_NAME, - f"res{150 + id}.png") - if not os.path.exists(path): - die(f"нет файла {path}") - im = Image.open(path) - if im.mode != "P": - die(f"res{150+id}: mode {im.mode}, ожидался P") - src = im.tobytes() - if mono is not None: - out = bytes((0xFF if v == 0 else mono) for v in src) - elif opaque: - # Пиксель 0 — ЦВЕТ 0 (общий фон игрового поля), остальные — палитра - # chtab_1. Ноль здесь принципиален: непрозрачный бокс пламени иначе - # закрашивал бы фон «своим» чёрным (0x40) и не участвовал во вспышке. - out = bytes((0 if v == 0 else POT_PAL_BASE + v) for v in src) - else: - out = bytes((0xFF if v == 0 else POT_PAL_BASE + v) for v in src) - return im.width, im.height, out - - -def blob(w, h, pix): - """getimage-блоб: u16 w, u16 h (LE) + пиксели.""" - return w.to_bytes(2, "little") + h.to_bytes(2, "little") + pix - - -# ---- 3. Пакер .atl (каталог любого размера) -------------------------- -def pack_atlas(path, entries): - """entries: dict idx -> (w, h, pix). Пустые idx (0..maxidx) заполняются - фейковой ссылкой на общий 0×0-блоб. Каталог count записей с 0x68, - блобы — сразу после каталога.""" - if not entries: - die(f"{path}: пустой атлас") - count = max(entries) + 1 - if count > 255: - die(f"{path}: count {count} > 255") - data_off = ATL_DIR_OFF + count * 8 - - blobs = bytearray() - empty_off = data_off + len(blobs) # общий 0×0-блоб для дырок - blobs += blob(0, 0, b"") - dir_bytes = bytearray(count * 8) - for idx in range(count): - e = entries.get(idx) - if e is None: - off = empty_off - fw = fh = 0 - else: - w, h, pix = e - off = data_off + len(blobs) - blobs += blob(w, h, pix) - fw = min(w, 255) - fh = min(h, 255) - d = idx * 8 - dir_bytes[d:d + 2] = off.to_bytes(2, "little") - dir_bytes[d + 2] = fw - dir_bytes[d + 3] = fh - dir_bytes[d + 4] = 1 # nx - dir_bytes[d + 5] = 1 # ny - # d+6,d+7 резерв - - out = bytearray(data_off) - out[0:4] = ATL_MAGIC - out[4] = count - out[ATL_DIR_OFF:ATL_DIR_OFF + len(dir_bytes)] = dir_bytes - out += blobs - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) # atlas_load: n >= 0x100 - if len(out) > PAGE_SIZE: - die(f"{path}: {len(out)} Б > {PAGE_SIZE} (одна EMM-страница)") - with open(path, "wb") as f: - f.write(out) - return count, len(out) - - -# ---- 4. Палитра ------------------------------------------------------ -def scale6to8(v): - return (v * 255) // 63 - - -def read_pal16(res, d): - b = open(os.path.join(d, res), "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def build_tileset_palette(out_path): - """Палитра ТОЛЬКО тайлсета: 32 записи B,G,R,0 — env (16) затем wall (16). - Ею подменяются слоты 0x50..0x6F при смене типа уровня; полная игровая - палитра (kid.pal) при этом не трогается, потому что Кид, страж, меч и - зелья живут в других слотах (levels_plan §3). Порядок каталогов — - SRC_DIRS, то есть файл соответствует выбранному набору.""" - pal = bytearray(32 * 4) - src = read_pal16("res200.pal", SRC_DIRS[0]) + read_pal16("res360.pal", SRC_DIRS[0]) - for i, (r, g, b) in enumerate(src): - pal[i * 4:i * 4 + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - with open(out_path, "wb") as f: - f.write(pal) - - -def build_palette(out_path): - """256-записная палитра B,G,R,0: env@0x50..0x5F, wall@0x60..0x6F.""" - def read_pal(res, d): - return read_pal16(res, d) - - env = read_pal("res200.pal", R.VDUNGEON_DIR) - wall = read_pal("res360.pal", R.VDUNGEON_DIR) - pot = read_pal("res150.pal", os.path.join(os.path.dirname(R.VDUNGEON_DIR), - POT_DIR_NAME)) - pal = bytearray(256 * 4) - for i, (r, g, b) in enumerate(env): - o = (0x50 + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(wall): - o = (0x60 + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(pot): - o = (POT_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(VGA16): - o = (VGA16_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - with open(out_path, "wb") as f: - f.write(pal) - - -# ---- 5. C-заголовок -------------------------------------------------- -def write_header(out_path, env_pages): - """Заголовок ОДИН на оба тайлсета: раскладка id -> (страница, idx) у них - общая (пакуются по одному объединению id), различаются только имена - файлов и палитра. Поэтому здесь два массива имён и один индекс.""" - lines = [ - "/* pop_bg_atlas.h — раскладка атласов статического фона PoP.", - " * Сгенерировано toolchain/pop_pack_bg.py — НЕ править вручную.", - " *", - " * Прямая адресация (ноль remap-таблиц в W2):", - " * ENV фон id N -> atlas env_bg[N>>%d], idx N&%d" % (ENV_SHIFT, ENV_MASK), - " * WALL id N -> atlas wall, idx N", - " * FORE id N -> atlas fore, idx N", - " *", - " * ДВА ТАЙЛСЕТА (порт tbl_envir_ki[tbl_level_type], seg000:1108):", - " * 0 = подземелье (pop_*), 1 = дворец (pal_*). Набор id и раскладка", - " * у них ОДНИ И ТЕ ЖЕ — меняются только файлы и 32 записи палитры", - " * (env 0x50..0x5F, wall 0x60..0x6F), см. *tile.pal.", - " */", - "#ifndef POP_BG_ATLAS_H", - "#define POP_BG_ATLAS_H", - "", - "#define POP_ENV_SHIFT %d" % ENV_SHIFT, - "#define POP_ENV_MASK %d" % ENV_MASK, - "#define POP_ENV_PAGES %d" % len(env_pages), - "#define POP_TILESETS 2", - "", - "/* Палитра: env-слоты, wall-слоты (спрайт-пиксель i -> база+i). */", - "#define POP_PAL_ENV 0x50", - "#define POP_PAL_WALL 0x60", - "", - "/* Имена файлов атласов по тайлсету (грузятся atlas_load). Таблицы", - " * видны только тому, кто попросил POP_BG_ATLAS_NAMES: иначе копия", - " * строк уедет в каждый включивший заголовок модуль. */", - "#ifdef POP_BG_ATLAS_NAMES", - "static const char *const pop_env_atl[POP_TILESETS][POP_ENV_PAGES] = {", - ] - for prefix, _ in SETS.values(): - row = ", ".join(('"%s%s"' % (prefix, nm.split("_", 1)[1]) if nm else "0") - for nm in env_pages) - lines.append(" { %s }," % row) - lines += [ - "};", - 'static const char *const pop_wall_atl[POP_TILESETS] = { %s };' - % ", ".join('"%swall.atl"' % p for p, _ in SETS.values()), - 'static const char *const pop_fore_atl[POP_TILESETS] = { %s };' - % ", ".join('"%sfore.atl"' % p for p, _ in SETS.values()), - 'static const char *const pop_tile_pal[POP_TILESETS] = { %s };' - % ", ".join('"%stile.pal"' % p for p, _ in SETS.values()), - "#endif /* POP_BG_ATLAS_NAMES */", - '#define POP_POT_ATL "pop_pot.atl" /* chtab_1: зелья, от набора не зависит */', - "#define POP_PAL_POT 0x%02X" % POT_PAL_BASE, - "/* Пузырёк зелья: красный набор = id 16..22 (кадры оригинала),", - " зелёный (перо/переворот) и синий (вред/открыть) = те же кадры", - " под id %d..%d и %d..%d (draw_tile_anim, seg008:652). */" - % (POT_BUBBLE_GREEN_BASE, POT_BUBBLE_GREEN_BASE + len(POT_BUBBLE_IDS) - 1, - POT_BUBBLE_BLUE_BASE, POT_BUBBLE_BLUE_BASE + len(POT_BUBBLE_IDS) - 1), - "#define POP_POT_BUBB_GREEN %d" % POT_BUBBLE_GREEN_BASE, - "#define POP_POT_BUBB_BLUE %d" % POT_BUBBLE_BLUE_BASE, - '#define POP_BG_PAL "pop_bg.pal"', - "", - "#endif", - "", - ] - with open(out_path, "w") as f: - f.write("\n".join(lines)) - - -def main(): - global SRC_DIRS - set_name = sys.argv[1] if len(sys.argv) > 1 else "dungeon" - if set_name not in SETS: - die(f"набор '{set_name}': ожидался один из {', '.join(SETS)}") - prefix, dirs = SETS[set_name] - SRC_DIRS = dirs() - print(f"набор: {set_name} (источник {os.path.basename(SRC_DIRS[0])}, " - f"фолбэк {os.path.basename(SRC_DIRS[1])}), префикс {prefix}") - os.makedirs(OUT_DIR, exist_ok=True) - used = collect_used() - env_ids = sorted(set(id for ch, id in used if ch != R.CHTAB_WALL) - | CLIMB_OVERLAY_ENV_IDS # + пол-оверлей подъёма - | LOOSE_ANIM_ENV_IDS # + дрожащие кадры loose - | SPIKE_ANIM_ENV_IDS # + кадры выдвижения пик - | GATE_ANIM_ENV_IDS # + кадры открытия ворот - | GATE_TOP_ENV_IDS # + верх ворот (тайл сверху) - | {GATE_TOP_MASK_ID} # и его маска (mono) - | TORCH_ENV_IDS # + основание факела - | STUCK_ENV_IDS # + нажатая кнопка-closer - | CHOMPER_BOT_IDS # + чомпер: низ - | CHOMPER_TOP_IDS # верх - | CHOMPER_FORE_IDS # фронт (поверх Kid) - | CHOMPER_BLOOD_IDS # кровь (mono) - | CHOMPER_BLOOD_FORE_IDS - | OPENER_NOFLOOR_ENV_IDS # + opener без пола слева - | LEVELDOOR_ENV_IDS # + дверь уровня (створка/лестница) - | PALACE_ENV_IDS # + куски, что рисует только палас - | MIRROR_ENV_IDS) # + зеркало (ставится в рантайме) - wall_ids = sorted(id for ch, id in used if ch == R.CHTAB_WALL) - - env_bg = [i for i in env_ids if i not in FORE_ENV_IDS] - env_fore = [i for i in env_ids if i in FORE_ENV_IDS] - - # ENV фон -> страницы по id>>SHIFT - pages = {} - for id in env_bg: - w, h, pix = load_indexed(R.CHTAB_ENV, id, id in NO_TRANSP_ENV_IDS, - CHOMPER_BLOOD_COLOR if id in CHOMPER_BLOOD_IDS - else (POT_MASK_COLOR if id == GATE_TOP_MASK_ID - else None)) - pages.setdefault(id >> ENV_SHIFT, {})[id & ENV_MASK] = (w, h, pix) - max_pg = max(pages) if pages else -1 - env_page_names = [] - total_bytes = 0 - for pg in range(max_pg + 1): - if pg in pages: - nm = f"{prefix}env{pg}.atl" - cnt, sz = pack_atlas(os.path.join(OUT_DIR, nm), pages[pg]) - total_bytes += sz - env_page_names.append(nm) - print(f" {nm}: {len(pages[pg])} спрайтов, каталог {cnt}, {sz} Б") - else: - env_page_names.append(None) - print(f" (env стр {pg}: пусто)") - - # WALL -> idx=id - wall_entries = {id: load_indexed( - R.CHTAB_WALL, id, False, - PALACE_WALL_MONO_COLOR - if (set_name == "palace" and id in PALACE_WALL_MONO_IDS) - else None) - for id in wall_ids} - cnt, sz = pack_atlas(os.path.join(OUT_DIR, prefix + "wall.atl"), wall_entries) - total_bytes += sz - print(f" {prefix}wall.atl: {len(wall_ids)} спрайтов, каталог {cnt}, {sz} Б") - - # FORE -> idx=id - fore_entries = {id: load_indexed(R.CHTAB_ENV, id, False, - CHOMPER_BLOOD_COLOR - if id in CHOMPER_BLOOD_FORE_IDS else None) - for id in env_fore} - cnt, sz = pack_atlas(os.path.join(OUT_DIR, prefix + "fore.atl"), fore_entries) - total_bytes += sz - print(f" {prefix}fore.atl: {len(env_fore)} спрайтов, каталог {cnt}, {sz} Б") - - # POTION (chtab_1) -> idx=id: склянки + кадры пузырька + маска - # chtab_1 целиком (res151..res173 = id 1..23): пламя факелов, меч-предмет, - # склянки зелий. Пузырьки и их маска рисуются MONO-блитом — пакуем - # силуэтами в нужном цвете (см. POT_*_COLOR). - pot_entries = {} - for id in range(1, 24): - if id in POT_BUBBLE_IDS: - pot_entries[id] = load_potion(id, POT_BUBBLE_COLOR) - elif id == POT_MASK_ID: - pot_entries[id] = load_potion(id, POT_MASK_COLOR) - elif id in POT_FLAME_IDS: - # Пламя оригинал рисует blitters_0_no_transp (seg008 - # draw_tile_anim_right) — непрозрачным боксом поверх всего, что - # сзади. Все 9 кадров лежат на одном канвасе 16x18, поэтому - # непрозрачный блит сам стирает предыдущий кадр: heal не нужен. - pot_entries[id] = load_potion(id, opaque=True) - else: - pot_entries[id] = load_potion(id) - # Наборы пузырьков ДРУГИХ цветов: те же кадры другим mono-цветом. - # зелёный — типы 3/4 (перо, переворот), синий — типы 5/6 (вред, открыть). - for i, id in enumerate(POT_BUBBLE_IDS): - pot_entries[POT_BUBBLE_GREEN_BASE + i] = load_potion(id, POT_BUBBLE_GREEN_COLOR) - pot_entries[POT_BUBBLE_BLUE_BASE + i] = load_potion(id, POT_BUBBLE_BLUE_COLOR) - # chtab_1 (пламя/меч/зелья) от тайлсета НЕ зависит — пакуем один раз. - cnt, sz = pack_atlas(os.path.join(OUT_DIR, "pop_pot.atl"), pot_entries) - total_bytes += sz - print(f" pop_pot.atl (chtab_1: факелы+зелья): {len(pot_entries)} спрайтов, каталог {cnt}, {sz} Б") - - build_tileset_palette(os.path.join(OUT_DIR, prefix + "tile.pal")) - print(f" {prefix}tile.pal: 32 записи (env 0x50..0x5F + wall 0x60..0x6F)") - build_palette(os.path.join(OUT_DIR, "pop_bg.pal")) - write_header(os.path.join(OUT_DIR, "pop_bg_atlas.h"), env_page_names) - - n_pages = sum(1 for n in env_page_names if n) + 2 - print(f"ИТОГО: {len(env_bg)} env-фон + {len(wall_ids)} wall + " - f"{len(env_fore)} fore = {len(env_bg)+len(wall_ids)+len(env_fore)} спрайтов") - print(f" {n_pages} EMM-страниц, {total_bytes} Б на диске " - f"(+1КБ палитра), W2: {n_pages}×atlas_t = {n_pages*3} Б хэндлов") - print(f" -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_guard.py b/applications/PoP/toolchain/pop_pack_guard.py deleted file mode 100644 index 8598f9e..0000000 --- a/applications/PoP/toolchain/pop_pack_guard.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_guard.py — упаковщик спрайтов СТРАЖА (chtab_5_guard, база 750). - -Оригинал грузит стражей из отдельного .DAT по типу уровня -(GUARD/FAT/SKEL/VIZIER/SHADOW, seg000:1092); уровень 1 — обычный «guard», -то есть data/GUARD/res(750+id).png. Палитра — НЕ из PNG: оригинал -подменяет её из res10.bin (guard_palettes, 7 палитр по 16 цветов, 6-бит) по -level.guards_color; на уровне 1 у обоих стражей color = 2. - -Выход: poc/res/guard/g0..gN.atl (по 8 спрайтов на страницу, адресация -id>>3 / id&7 — как у Kid) + группа палитры 0x90..0x9F в общий kid.pal -(его собирает pop_pack_kid.py, см. GUARD_PAL_BASE там). -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B -from pop_pack_kid import transpose_cols, vflip_page - -# Набор спрайтов соперника выбирается ТИПОМ УРОВНЯ (load_lev_spr, seg000:1092): -# tbl_guard_type = {0 guard, 1 fat, 2 skeleton, 3 vizier, 4 shadow, −1 нет}. -# У обычного стража палитра подменяется из res10.bin по guards_color, у -# остальных наборов curr_guard_color = 0 (seg002:186) — значит цвет берётся -# из ФАЙЛА набора (res750.pal), и подменять его не надо. -SETS = { - "GUARD": ("GUARD", "guard", None), - "SKEL": ("SKEL", "skel", "res750.pal"), - "VIZIER": ("VIZIER", "vizier", "res750.pal"), -} -SET_NAME = "GUARD" -GUARD_DIR = os.path.join(HERE, "..", "SDLPoP", "data", "GUARD") -PAL_BIN = os.path.join(HERE, "..", "SDLPoP", "data", "PRINCE", "res10.bin") -OUT_DIR = os.path.join(HERE, "..", "poc", "res", "guard") -PAL_BASE = 0x90 # слоты палитры Sprinter под стража -COLOR = 2 # level.guards_color обоих стражей уровня 1 -SHIFT = 3 # g[id>>3], idx id&7 (спрайты крупные) -MASK = (1 << SHIFT) - 1 -MAX_ID = 33 # атлас-индексы 0..33 = res751..res784 - - -def select_set(name): - """Переключить упаковщик на набор (GUARD/SKEL/VIZIER): каталоги и число - кадров.""" - global SET_NAME, GUARD_DIR, OUT_DIR, MAX_ID - if name not in SETS: - B.die("неизвестный набор %s (есть: %s)" % (name, ", ".join(SETS))) - SET_NAME = name - src, out, _ = SETS[name] - GUARD_DIR = os.path.join(HERE, "..", "SDLPoP", "data", src) - OUT_DIR = os.path.join(HERE, "..", "poc", "res", out) - # Сколько кадров реально есть в наборе (у скелета их меньше, чем у стража). - n = 0 - while os.path.exists(os.path.join(GUARD_DIR, f"res{751 + n}.png")): - n += 1 - MAX_ID = n - 1 - - -def set_palette(): - """16 цветов набора из его res750.pal (для наборов, где цвет НЕ - подменяется из res10.bin). None — у набора своей палитры нет.""" - fname = SETS[SET_NAME][2] - if fname is None: - return None - b = open(os.path.join(GUARD_DIR, fname), "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def load_guard(id): - """Атлас-индекс id (== frame.image) -> res(751+id).png -> (w, h, 8bpp - COLUMN-MAJOR); 0 -> 0xFF (прозрачность). - - Off-by-one как у Kid (см. pop_pack_kid.load_kid): load_chtab_from_file - зовётся с ресурсом 750, а images[i-1] = res(750+i), то есть images[0] = - res751. Рисование берёт get_image(chtab, obj_id+1 − 1) = images[image], - значит frame.image=N -> res(751+N). С res(750+N) страж стоял в позе - предыдущего кадра (замечено на frame_166_stand_inactive: image 17 - рисовался как res767 — выпад — вместо res768). """ - path = os.path.join(GUARD_DIR, f"res{751 + id}.png") - if not os.path.exists(path): - return None - im = Image.open(path) - if im.mode != "P": - B.die(f"res{750+id}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -NPAL = 7 # guard_palettes: 7 палитр по 16 цветов (res10.bin) - - -def guard_palette(color=None): - """16 цветов (r,g,b 0..63) из res10.bin для палитры color (1..7). - Индексация как в оригинале (seg003:257): &guard_palettes[0x30*color-0x30]. - color=None — палитра COLOR (та, что запекается в kid.pal по умолчанию).""" - if color is None: - color = COLOR - b = open(PAL_BIN, "rb").read() - off = 0x30 * color - 0x30 - return [(b[off + i * 3], b[off + i * 3 + 1], b[off + i * 3 + 2]) for i in range(16)] - - -def write_pal_header(out_path): - """Таблица ВСЕХ палитр стражей -> заголовок для приложения. - - Оригинал держит спрайты стража в одной палитре, а цвет подменяет на лету: - redraw_screen (seg003:255) зовёт set_chtab_palette(chtab_5_guard, - &guard_palettes[0x30*curr_guard_color - 0x30], 16) ПЕРЕД отрисовкой - комнаты, где curr_guard_color = level.guards_color[room-1] & 0x0F - (enter_guard, seg002:184). У нас спрайты уже лежат в индексах - PAL_BASE + v, поэтому достаточно залить 16 слотов палитры. - - Формат записи — родной для gfx_pal_load: 4 байта (B, G, R, 0).""" - rows = [] - for color in range(1, NPAL + 1): - vals = [] - for (r, g, b) in guard_palette(color): - # res10.bin хранит 6-битные каналы, палитра Sprinter — 8-битные - # (так же делает pop_pack_kid при записи kid.pal). - vals += [B.scale6to8(b), B.scale6to8(g), B.scale6to8(r), 0] - rows.append(" { " + ",".join("0x%02X" % v for v in vals) + " },") - lines = [ - "/* pop_guard_pal.h — палитры стражей (guard_palettes из res10.bin).", - " * СГЕНЕРЕНО toolchain/pop_pack_guard.py — НЕ править вручную.", - " *", - " * Индексация как в оригинале: цвет из level.guards_color[room-1]", - " * (младшие 4 бита), 1..%d -> строка [color-1]; 0 = палитру НЕ менять" % NPAL, - " * (seg003:255 при curr_guard_color == 0 set_chtab_palette не зовёт).", - " * Запись — 4 байта (B, G, R, 0), формат gfx_pal_load. */", - "#ifndef POP_GUARD_PAL_H", - "#define POP_GUARD_PAL_H", - "", - "#include ", - "", - "#define POP_GUARD_PAL_BASE 0x%02X /* слоты Sprinter под chtab_5 */" % PAL_BASE, - "#define POP_GUARD_NPAL %d" % NPAL, - "", - "static const uint8_t pop_guard_pal[POP_GUARD_NPAL][64] = {", - ] + rows + [ - "};", - "", - ] - # Палитры наборов со СВОИМ цветом (скелет, визирь) — из их res750.pal, а - # не из res10.bin: на таких уровнях curr_guard_color = 0 (seg002:186), и - # оригинал палитру не подменяет вовсе. - saved = SET_NAME - for name, cname, human in (("SKEL", "pop_skel_pal", "Скелет"), - ("VIZIER", "pop_vizier_pal", "Джафар")): - select_set(name) - pal = set_palette() - select_set(saved) - if not pal: - continue - vals = [] - for (r, g, b) in pal: - vals += [B.scale6to8(b), B.scale6to8(g), B.scale6to8(r), 0] - lines += [ - "/* %s (%s/res750.pal): свой набор — свой цвет. */" % (human, name), - "static const uint8_t %s[64] = {" % cname, - " " + ",".join("0x%02X" % v for v in vals) + ",", - "};", - "", - ] - lines += [ - "#endif", - "", - ] - with open(out_path, "w") as f: - f.write("\n".join(lines)) - print(f" pop_guard_pal.h: {NPAL} палитр x 16 цветов = {NPAL*64} Б -> {out_path}") - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - pages = {} - n = 0 - for id in range(0, MAX_ID + 1): - g = load_guard(id) - if g is None: - continue - pages.setdefault(id >> SHIFT, {})[id & MASK] = g - n += 1 - if not pages: - B.die("нет спрайтов стража") - total = 0 - for pg in range(max(pages) + 1): - nm = f"g{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages.get(pg, {})) - total += sz - # Зеркальный по вертикали набор — пара к kid*_v.atl (см. vflip_cols). - # ТОЛЬКО для обычного стража: зелье инверсии есть на уровне 9, а там - # tbl_guard_type = 0, то есть страж; скелет (уровень 3), визирь и - # жирный с переворотом не встречаются. Если чит U всё-таки включат - # на таком уровне, соперник нарисуется неперевёрнутым кадром — - # pop_vflip_page вернёт 0 (pop_vflip.h). - if SET_NAME == "GUARD": - _, szv = B.pack_atlas(os.path.join(OUT_DIR, f"g{pg}_v.atl"), - vflip_page(pages.get(pg, {}))) - total += szv - print(f" {nm}: {len(pages.get(pg, {}))} спрайтов, каталог {cnt}, {sz} Б") - write_pal_header(os.path.join(HERE, "..", "roomtest", "pop_guard_pal.h")) - print(f"ИТОГО: {n} спрайтов стража, {max(pages)+1} EMM-страниц, {total} Б -> {OUT_DIR}") - - -if __name__ == "__main__": - if len(sys.argv) > 1: - select_set(sys.argv[1].upper()) - main() diff --git a/applications/PoP/toolchain/pop_pack_intro.py b/applications/PoP/toolchain/pop_pack_intro.py deleted file mode 100644 index d529d77..0000000 --- a/applications/PoP/toolchain/pop_pack_intro.py +++ /dev/null @@ -1,349 +0,0 @@ -#!/usr/bin/env python3 -"""Упаковка story/PV intro SDLPoP в полосы SPA1 для Sprinter. - -Исходники остаются единственным источником истины: TITLE/res41..45, res51 и -PV/res800/850/950/980. Runtime получает только готовые 320x200 композиции -и 256-цветные палитры. Это намеренно переносит смешивание палитров Princess, -Jaffar, спальни и кровати из ограниченного Z80 в build-time. -""" -from pathlib import Path - -from PIL import Image - -ROOT = Path(__file__).resolve().parent.parent -TITLE = ROOT / "SDLPoP" / "data" / "TITLE" -PV = ROOT / "SDLPoP" / "data" / "PV" -PRINCE = ROOT / "SDLPoP" / "data" / "PRINCE" -KID = ROOT / "SDLPoP" / "data" / "KID" -OUT = ROOT / "poc" / "res" / "pv" - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - -# ФОН ТЕКСТОВОЙ РАМКИ — ОТДЕЛЬНЫЙ ИНДЕКС. У оригинала это индекс 14 в -# строке палитры спрайтов title40, и load_title_images() красит его либо в -# #100060 (интро), либо в #800000 (финал, seg001:586). Раньше мы -# ремапили 14 в 9 — «тёмно-синий» палитры res51; подменить его нельзя, -# потому что тем же индексом нарисована сама титульная картинка (8265 -# пикселей). Поэтому фон уезжает в свободный индекс, и финал красит -# только его (pop_pal_story_ending). -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) -# Цвет текста таблицы рекордов: 0xB7 оригинала = седьмой цвет палитры -# title (224,160,0). Глифы шрифта запечены индексом POP_FONT_COLOR, так -# что цвет им даёт именно эта запись; тёмный набор (POP_FONT_DARK_COLOR) -# остаётся чёрным — старшие записи story.pal и так чёрные. -STORY_FONT_INDEX = 0x3F - - -def transpose_cols(width: int, height: int, rowmajor: bytes) -> bytes: - """Row-major -> column-major для бесплатного horizontal flip в BGI.""" - out = bytearray(width * height) - for column in range(width): - base = column * height - for row in range(height): - out[base + row] = rowmajor[row * width + column] - return bytes(out) - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"intro atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def sprite_atlas(path: Path, entries: dict[int, tuple[int, int, bytes]]) -> None: - """Атлас небольших прозрачных кадров, целиком живущий в одной EMM. - - В отличие от atlas_blob() для полноэкранной полосы, здесь нужен каталог - нескольких картинок: runtime держит страницу открытой всю PV-сцену и - переключает только idx. Пустые индексы не требуются — все наборы ниже - нумеруются подряд с нуля. - """ - count = len(entries) - if not count or count > 255: - raise SystemExit(f"{path}: bad sprite atlas count {count}") - data_off = ATL_DIR_OFF + count * 8 - directory = bytearray(count * 8) - blobs = bytearray() - for idx in range(count): - width, height, pixels = entries[idx] - offset = data_off + len(blobs) - blobs += width.to_bytes(2, "little") + height.to_bytes(2, "little") - blobs += pixels - d = idx * 8 - directory[d:d + 2] = offset.to_bytes(2, "little") - directory[d + 2] = width - directory[d + 3] = height - directory[d + 4] = directory[d + 5] = 1 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = count - out[ATL_DIR_OFF:ATL_DIR_OFF + len(directory)] = directory - out += blobs - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"{path}: {len(out)} B > one EMM page") - path.write_bytes(out) - - -def sprite_frames(directory: Path, first: int, last: int, - color_base: int, column_major: bool = False - ) -> dict[int, tuple[int, int, bytes]]: - """PNG-кадры -> getimage. Ноль PNG становится прозрачным 0xFF BGI.""" - result = {} - for index, number in enumerate(range(first, last + 1)): - image = png(directory, number) - pixels = bytes(0xFF if pixel == 0 else color_base + pixel - for pixel in image.tobytes()) - if column_major: - pixels = transpose_cols(image.width, image.height, pixels) - result[index] = image.width, image.height, pixels - return result - - -def png(directory: Path, number: int) -> Image.Image: - image = Image.open(directory / f"res{number}.png") - if image.mode != "P": - raise SystemExit(f"res{number}.png: expected indexed PNG, got {image.mode}") - return image.copy() - - -def pal_file(path: Path) -> list[tuple[int, int, int]]: - """16 цветов из .pal ресурса (4 байта заголовка, дальше RGB по 6 бит).""" - raw = path.read_bytes() - return [(raw[4 + i * 3] << 2, raw[5 + i * 3] << 2, raw[6 + i * 3] << 2) - for i in range(16)] - - -def palette(image: Image.Image) -> list[tuple[int, int, int]]: - raw = image.getpalette() - return [tuple(raw[index * 3:index * 3 + 3]) for index in range(16)] - - -def write_palette(path: Path, entries: list[tuple[int, int, int]], - extra=None) -> None: - """B,G,R,0 — ровно формат gfx_pal_fload; незадействованное чёрное.""" - out = bytearray() - entries = (entries + [(0, 0, 0)] * 256)[:256] - for index, color in (extra or {}).items(): - entries[index] = color - for red, green, blue in entries: - out += bytes((blue, green, red, 0)) - path.write_bytes(out) - - -def write_scene(prefix: str, number: int, canvas: Image.Image) -> None: - if canvas.size != (320, 200): - raise SystemExit(f"{prefix}{number}: expected 320x200, got {canvas.size}") - for part, top in enumerate(range(0, 200, STRIP_H)): - band = canvas.crop((0, top, 320, min(top + STRIP_H, 200))) - (OUT / f"{prefix}{number}_{part}.atl").write_bytes( - atlas_blob(band.tobytes(), band.width, band.height)) - - -def story_scenes() -> list[Image.Image]: - """show_title/end_sequence в единой с title палитре. - - res41 кодирует тёмный фон индексом 14, а его палитра делает этот индекс - чёрным; show_title() SDLPoP подменяет его #100060 либо #800000. Тексты - res42..45 имеют индекс 1, но этот индекс у res41 тоже тёмный; ремап на - индекс title/res51 15 (белый) позволяет проявлять историю прямо поверх - последнего title-экрана без смены палитры. Фон уезжает в - STORY_BG_INDEX, чтобы финал мог покрасить его отдельно. - - Последний экран — фон таблицы рекордов: та же рамка плюс логотип - PRINCE OF PERSIA на y=24 (HOF_POP оригинала — тот же спрайт res54, что - и в титрах, только выше). - """ - frame_raw = bytearray(png(TITLE, 41).tobytes()) - for offset, pixel in enumerate(frame_raw): - if pixel == 14: - frame_raw[offset] = STORY_BG_INDEX - frame = Image.frombytes("P", (320, 200), bytes(frame_raw)) - result = [] - for text_number, ypos in ((42, 25), (43, 25), (45, 26), (44, 25)): - canvas = frame.copy() - raw = bytearray(canvas.tobytes()) - text = png(TITLE, text_number) - for sy in range(text.height): - for sx in range(text.width): - if text.getpixel((sx, sy)): - raw[(ypos + sy) * 320 + 24 + sx] = 15 - canvas.frombytes(bytes(raw)) - result.append(canvas) - result.append(frame) - - hof = frame.copy() - raw = bytearray(hof.tobytes()) - logo = png(TITLE, 54) - for sy in range(logo.height): - for sx in range(logo.width): - pixel = logo.getpixel((sx, sy)) - if pixel: # blitters_10h_transp: 0 сквозной - raw[(24 + sy) * 320 + 24 + sx] = pixel - hof.frombytes(bytes(raw)) - result.append(hof) - return result - - -def pv_palette_canvas() -> tuple[Image.Image, list[tuple[int, int, int]]]: - """Спальня + bed. Номера 0..15=room, 16..31=Princess, - 32..47=Jaffar, 48..63=bed. Благодаря этому у смешанных PNG не теряются - исходные цвета при одном gfx_pal_fload() на весь PV.""" - room = png(PV, 951) - bed = png(PV, 981) - raw = bytearray(room.tobytes()) - bed_raw = bed.tobytes() - for sy in range(bed.height): - for sx in range(bed.width): - pixel = bed_raw[sy * bed.width + sx] - if pixel: - raw[(142 + sy) * 320 + sx] = 48 + pixel - canvas = Image.frombytes("P", room.size, bytes(raw)) - # 80..95 — пламя факелов. Это отдельный chtab PRINCE в оригинале; без - # отдельной строки цвета динамические кадры становились бы цветами стены. - # 112..127 (0x70) — палитра КИДА: на PV-экране финала и сцен 8/9 он и - # мышь рисуются СВОИМИ атласами (chtab_2), а их индексы запечены под - # игровые слоты 0x70. Без этой строки они выходили бы чёрными. - return (canvas, palette(room) + palette(png(PV, 801)) + - palette(png(PV, 851)) + palette(bed) + palette(png(PV, 901)) + - palette(png(PRINCE, 151)) + [(0, 0, 0)] * 16 + - pal_file(KID / "res400.pal")) - - -def sprite_paste(dst: Image.Image, sprite: Image.Image, x: int, floor: int, - color_base: int) -> None: - """Положить спрайт ногами на floor, remap его палитру в отдельную строку.""" - raw = bytearray(dst.tobytes()) - src = sprite.tobytes() - y = floor - sprite.height - for sy in range(sprite.height): - dy = y + sy - if dy < 0 or dy >= 200: - continue - for sx in range(sprite.width): - dx = x + sx - pixel = src[sy * sprite.width + sx] - if pixel and 0 <= dx < 320: - raw[dy * 320 + dx] = color_base + pixel - dst.frombytes(bytes(raw)) - - -def pv_scenes() -> tuple[list[Image.Image], list[tuple[int, int, int]]]: - base, colors = pv_palette_canvas() - - # Позиции Char из init_princess()/init_vizier(): x=120/198, y=166. - # В оригинале точный offset задаёт frame table; статические композиции - # выравнивают персонажей по полу y=166, не хранят таблицы PV-анимации. - waiting = base.copy() - sprite_paste(waiting, png(PV, 801), 110, 166, 16) - - jaffar = waiting.copy() - sprite_paste(jaffar, png(PV, 851), 188, 166, 32) - - magic = base.copy() - sprite_paste(magic, png(PV, 805), 110, 166, 16) - sprite_paste(magic, png(PV, 870), 188, 166, 32) - # res953 — первый полный кадр песочных часов; он использует палитру room. - sprite_paste(magic, png(PV, 953), 18, 166, 0) - - alone = base.copy() - sprite_paste(alone, png(PV, 816), 110, 166, 16) - sprite_paste(alone, png(PV, 959), 18, 166, 0) - - # FG9: статические ключевые позы тех же scene 2/4/6/8/9/12. PV2 - # использует второй набор Princess (res900), поэтому он лежит в строке - # палитры 64..79. Мышь в оригинале меняет только короткую позу рядом с - # Princess; здесь соответствующая стадия выделена отдельным кадром. - stand = base.copy() - sprite_paste(stand, png(PV, 801), 134, 166, 16) - - lying = base.copy() - sprite_paste(lying, png(PV, 901), 78, 162, 64) - # Часы для cutscene_4 выбираются runtime по оставшимся минутам и - # анимируются вместе с песком; в статической основе их быть не должно. - - mouse = base.copy() - sprite_paste(mouse, png(PV, 920), 120, 169, 64) - sprite_paste(mouse, png(PV, 959), 18, 166, 0) - - short_time = base.copy() - sprite_paste(short_time, png(PV, 816), 146, 166, 16) - sprite_paste(short_time, png(PV, 953), 18, 166, 0) - - return [waiting, jaffar, magic, alone, stand, lying, mouse, short_time], colors - - -def pv_animation_assets() -> None: - """Ресурсы покадрового intro. - - `b0_*` — единственный чистый фон. Он копируется accelerator-ом между - обеими экранными страницами; спрайты рисуются банком без shadow, так что - следующий кадр автоматически начинает с фона. Каждый actor-атлас <=16K, - поэтому нет чтения 320x200 с HDD в анимационном цикле. - """ - base, _ = pv_palette_canvas() - write_scene("b", 0, base) - # frame_tbl_cuts из SDLPoP адресует Princess как image 0..16 ресурса - # 800 (то есть PNG res801..817). Для Jaffar PV1 адресуется ресурс 850: - # image 0..37 = res851..888. Все 38 кадров не помещаются в одну EMM, - # поэтому сохраняем их тремя последовательными атласами. Runtime знает - # границы, но номер кадра остаётся исходным image-id 0..37. - sprite_atlas(OUT / "a0.atl", sprite_frames(PV, 801, 817, 16, True)) - sprite_atlas(OUT / "j0.atl", sprite_frames(PV, 851, 863, 32, True)) - sprite_atlas(OUT / "j1.atl", sprite_frames(PV, 864, 874, 32, True)) - sprite_atlas(OUT / "j2.atl", sprite_frames(PV, 875, 888, 32, True)) - # ВТОРОЙ набор Princess (PV2, res901..930 = image 0..29 ресурса 900). - # Он нужен сценам 8/9 (сидит и гладит мышь, встаёт, приседает) и финалу - # (поворачивается и обнимает Кида) — поз PV1 для этого не хватает. - # 26.7 КБ не влезают в одну EMM, поэтому два атласа; номер кадра при - # этом остаётся исходным image-id 0..29, границу знает runtime. - # Палитровая строка 64..79 — та же, что у PV2 в статических сценах. - sprite_atlas(OUT / "a1.atl", sprite_frames(PV, 901, 917, 64, True)) - sprite_atlas(OUT / "a2.atl", sprite_frames(PV, 918, 930, 64, True)) - # res953/res954 — состояния часов, res960..962 — три фазы песка. - sprite_atlas(OUT / "h0.atl", sprite_frames(PV, 952, 962, 0)) - sprite_atlas(OUT / "t0.atl", sprite_frames(PRINCE, 151, 159, 80)) - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - - stories = story_scenes() - write_palette(OUT / "story.pal", palette(png(TITLE, 51)), - {STORY_BG_INDEX: STORY_BG_COLOR, - STORY_FONT_INDEX: (224, 160, 0)}) - for number, scene in enumerate(stories): - write_scene("s", number, scene) - - scenes, colors = pv_scenes() - write_palette(OUT / "pv.pal", colors) - for number, scene in enumerate(scenes): - write_scene("p", number, scene) - - pv_animation_assets() - - print(f"{OUT}: {len(stories)} story + 8 PV compositions + base x 5 strips, " - f"6 animated actor atlases, one strip/page <= {STRIP_H} rows") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_kid.py b/applications/PoP/toolchain/pop_pack_kid.py deleted file mode 100644 index d8f1412..0000000 --- a/applications/PoP/toolchain/pop_pack_kid.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_kid.py — упаковщик спрайтов персонажа Kid (Фаза K0 порта). - -Аналог pop_pack_bg.py, но для chtab_2_kid (база ресурса 400): image id N -= res(400+N).png (data/KID), палитра res400.pal (16 цветов) -> слоты -Sprinter 0x70-0x7F (env 0x50 / wall 0x60 заняты фоном). Пиксель i: -0->0xFF (прозрач), i->0x70+i. - -Прямая адресация (ноль remap в W2): kid[img>>5], idx img&31. Дырки — -фейковые записи (как в фоне). Переиспользует pack_atlas/blob/scale6to8 -из pop_pack_bg. - -Выход: poc/res/kid/kid0..N.atl + kid.pal + kid_atlas.h -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B # pack_atlas, blob, scale6to8, ENV_SHIFT - -KID_DIR = os.path.join(HERE, "..", "SDLPoP", "data", "KID") -OUT_DIR = os.path.join(HERE, "..", "poc", "res", "kid") -PAL_BASE = 0x70 # слоты палитры Sprinter под Kid -SWORD_PAL_BASE = 0x80 # chtab_0 (меч в руке) -> слоты 0x80..0x8F -GUARD_PAL_BASE = 0x90 # chtab_5 (страж) -> слоты 0x90..0x9F -# chtab_0 целиком: sword_tbl (seg006:2047) адресует id 0..33 — подъём меча, -# ножны И вся боёвка. Меч в оригинале ОДИН на всех: и Кид, и страж рисуют -# клинок из этого же chtab_0 (add_sword_to_objtable, seg006:1798). -SWORD_IDS = tuple(range(0, 34)) -SHIFT = 3 # kid[img>>3], idx img&7 (Kid-кадры крупные: 8/стр ≤16КБ) -MASK = (1 << SHIFT) - 1 - - -def transpose_cols(w, h, rowmajor): - """row-major (pix[row*w+col]) -> column-major (out[col*h+row]). - Спрайты Kid хранятся КОЛОНКАМИ: gfx_blit_cols рисует вертикальным accel- - проходом (даёт бесплатный горизонтальный флип реверсом порядка колонок; - см. memory/accel_vertical_copy). Заголовок getimage (w,h) не меняется.""" - out = bytearray(w * h) - for col in range(w): - base = col * h - for row in range(h): - out[base + row] = rowmajor[row * w + col] - return bytes(out) - - -def vflip_cols(w, h, colmajor): - """COLUMN-MAJOR (out[col*h + row]) -> тот же формат, но кадр ЗЕРКАЛЕН ПО - ВЕРТИКАЛИ: внутри каждой колонки байты идут снизу вверх. - - Зачем отдельный набор. Спрайты персонажей лежат колонками ради - БЕСПЛАТНОГО горизонтального флипа (accel копирует колонки, направление - задаётся знаком страйда). Вертикальное зеркало у такой раскладки — это - разворот байтов ВНУТРИ колонки, а accel копирует блок только вперёд: - в рантайме это стоит ~0.6 с на страницу (замер MAME 2026-08-12), тогда - как ГОТОВАЯ страница читается с диска за 0.045 с. Поэтому зелье - инверсии (уровень 9) обслуживается вторым набором файлов *_v.atl. - Раскладка каталога у него та же — движку достаточно подменить номер - EMM-страницы (см. roomtest/pop_vflip.h).""" - out = bytearray(len(colmajor)) - for col in range(w): - b = col * h - out[b:b + h] = colmajor[b:b + h][::-1] - return bytes(out) - - -def vflip_page(page): - """{idx: (w,h,pix)} -> то же с зеркальными по вертикали пикселями.""" - return {i: (w, h, vflip_cols(w, h, pix)) for i, (w, h, pix) in page.items()} - - -def load_kid(aidx): - """Атлас-индекс aidx (== frame.image) -> res(401+aidx).png -> (w, h, 8bpp - COLUMN-MAJOR). 0->0xFF, i->0x70+i. Пиксели транспонированы в колонки. - - МАППИНГ (seg008.c:1589): персонаж рисуется add_midtable(chtab, obj_id+1), - внутри get_image(chtab, id-1)=get_image(chtab, obj_id) -> chtab-индекс = - frame.image; первая картинка chtab_2_kid = res401 (res400 = палитра). - Значит frame.image=N -> res(401+N). Раньше грузили res(400+N) — off-by-one: - стойка frame_15 (image 14) рисовалась res414 (беговой наклон) вместо res415 - (прямая стойка).""" - path = os.path.join(KID_DIR, f"res{401 + aidx}.png") - if not os.path.exists(path): - return None - im = Image.open(path) - if im.mode != "P": - B.die(f"res{401+aidx}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -def load_sword(id): - """chtab_0 (меч в руке): sword_tbl[].id = N -> res(700+N+1).png в data/PRINCE - (в оригинале add_midtable(chtab, obj_id+1) -> get_image(chtab, obj_id)). - Пиксели, как у Kid, COLUMN-MAJOR (gfx_blit_cols + бесплатный флип).""" - path = os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), B.POT_DIR_NAME, - f"res{700 + id + 1}.png") - if not os.path.exists(path): - B.die(f"нет файла {path}") - im = Image.open(path) - if im.mode != "P": - B.die(f"res{700+id+1}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else SWORD_PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -def _read16(path): - b = open(path, "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def build_palette(out_path): - """ЕДИНАЯ игровая палитра (gfx_pal_fload пишет с индекса 0, перезатирая - всё — bg и Kid обязаны жить в одном файле): chtab_1@0x40 (пламя/зелья), - env@0x50, wall@0x60, kid@0x70. - """ - pal = bytearray(256 * 4) - groups = [ - (0x50, os.path.join(B.R.VDUNGEON_DIR, "res200.pal")), # env - (0x60, os.path.join(B.R.VDUNGEON_DIR, "res360.pal")), # wall - (PAL_BASE, os.path.join(KID_DIR, "res400.pal")), # kid 0x70 - (B.POT_PAL_BASE, os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), - B.POT_DIR_NAME, "res150.pal")), # chtab_1 0x40 - (SWORD_PAL_BASE, os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), - B.POT_DIR_NAME, "res700.pal")), # chtab_0 0x80 - ] - # 16 базовых цветов экрана (mono-блит красит ими: пламя, пузырьки зелья) - for i, (r, g, bl) in enumerate(B.VGA16): - o = (B.VGA16_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - for base, path in groups: - for i, (r, g, bl) in enumerate(_read16(path)): - o = (base + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - # Палитра стража берётся НЕ из .pal, а из res10.bin (guard_palettes: - # 7 палитр по 16 цветов, 6-бит) по level.guards_color; на уровне 1 у - # обоих стражей color = 2. См. toolchain/pop_pack_guard.py. - import pop_pack_guard as G - for i, (r, g, bl) in enumerate(G.guard_palette()): - o = (GUARD_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - - with open(out_path, "wb") as f: - f.write(pal) - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - # атлас-индексы aidx (== frame.image), для которых есть res(401+aidx).png - ids = [] - for aidx in range(0, 255): - if os.path.exists(os.path.join(KID_DIR, f"res{401 + aidx}.png")): - ids.append(aidx) - if not ids: - B.die("нет спрайтов KID") - - pages = {} - for id in ids: - w, h, pix = load_kid(id) - pages.setdefault(id >> SHIFT, {})[id & MASK] = (w, h, pix) - - max_pg = max(pages) - names = [] - total = 0 - for pg in range(max_pg + 1): - if pg in pages: - nm = f"kid{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages[pg]) - total += sz - names.append(nm) - print(f" {nm}: {len(pages[pg])} спрайтов, каталог {cnt}, {sz} Б") - # Зеркальный по вертикали набор (зелье инверсии, уровень 9). - nmv = f"kid{pg}_v.atl" - _, szv = B.pack_atlas(os.path.join(OUT_DIR, nmv), vflip_page(pages[pg])) - total += szv - else: - names.append(None) - print(f" (kid стр {pg}: пусто)") - - # chtab_0: меч в руке — весь chtab (id 0..33), индекс в атласе = id. - sw = {} - for i, id in enumerate(SWORD_IDS): - w, h, pix = load_sword(id) - sw[i] = (w, h, pix) - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, "sword.atl"), sw) - total += sz - _, szv = B.pack_atlas(os.path.join(OUT_DIR, "sword_v.atl"), vflip_page(sw)) - total += szv - print(f" sword.atl (chtab_0, id {SWORD_IDS[0]}..{SWORD_IDS[-1]}): " - f"{len(sw)} спрайтов, каталог {cnt}, {sz} Б") - - build_palette(os.path.join(OUT_DIR, "kid.pal")) - - # C-заголовок - hdr = os.path.join(OUT_DIR, "kid_atlas.h") - with open(hdr, "w") as f: - f.write("/* kid_atlas.h — раскладка атласов Kid. Сгенерировано " - "pop_pack_kid.py. */\n#ifndef KID_ATLAS_H\n#define KID_ATLAS_H\n") - f.write(f"#define KID_SHIFT {SHIFT}\n#define KID_MASK {MASK}\n") - f.write(f"#define KID_PAGES {len(names)}\n#define KID_PAL 0x{PAL_BASE:02X}\n") - f.write("static const char *const kid_atl[KID_PAGES] = {\n") - for nm in names: - f.write(" %s,\n" % ('"%s"' % nm if nm else "0")) - f.write('};\n#define KID_PAL_FILE "kid.pal"\n') - f.write('#define KID_SWORD_ATL "sword.atl" /* chtab_0: меч в руке */\n') - f.write(f"#define KID_SWORD_ID0 {SWORD_IDS[0]} /* индекс в атласе = sword_tbl.id - ID0 */\n") - f.write("#endif\n") - - print(f"ИТОГО: {len(ids)} спрайтов Kid, {len(names)} EMM-страниц, " - f"{total} Б диск (+1КБ палитра) -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_music.py b/applications/PoP/toolchain/pop_pack_music.py deleted file mode 100644 index 0d6748b..0000000 --- a/applications/PoP/toolchain/pop_pack_music.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_music.py — музыка PoP в сырой поток для CBL. - -Источник — готовые записи DOS-версии (applications/PoP/PoP1_DOS_music, -формат flac). Оцифровки музыки в самой игре НЕТ: в digisnd*.dat лежат -только эффекты, а музыка хранится как MIDI под Adlib. Поэтому здесь мы -не «конвертируем ресурс игры», а укладываем готовую запись в формат, -который наше железо играет без единого преобразования в рантайме. - -ФОРМАТ — тот же, что у эффектов (см. pop_pack_sound.py и sound_plan.md): -8 бит БЕЗЗНАКОВЫЙ моно на 10 937,5 Гц — ровно CBL_FREQ_10K9. Частоту -берём не 11 000, а частоту железа: тогда CBL открывается ОДИН раз за -запуск и не переключается ни между эффектами, ни при переходе на музыку. - -ОДИН ФАЙЛ НА ТРЕК. Резать его на куски не нужно: читаем порциями по -16 КБ из ОДНОГО открытого файла (`bank_read_page` + `lseek`), и «дорогой» -open платится раз на трек, а не на каждую страницу — замер 2026-08-25: -open 51,4 мс против 32,6 мс на чтение 16 КБ. Этот же путь работает для -финального `won` (1,2 МБ), который в память целиком не помещается и -обязан подгружаться по ходу. - -Хвост дополняется тишиной (0x80) до кратности 128: насос отдаёт CBL -блоками по 128 байт, и остаток «не полного блока» ему пришлось бы -досчитывать в прерывании. - -Длина трека уходит в pop_music_tbl.h блоками по 128 байт, а не байтами: -самый длинный трек (won, 115 с) — это 1,2 МБ, что не влезает в uint16, а -в блоках даёт 9855. 32-битной арифметики на Z80 избегаем (см. memory -avoid_32bit_arith_z80). -""" -import subprocess -import sys -from pathlib import Path - -POP = Path(__file__).resolve().parent.parent # applications/PoP -SRC_DIR = POP / "PoP1_DOS_music" / "flac" -OUT_DIR = POP / "poc" / "res" / "music" -OUT_H = POP / "roomtest" / "pop_music_tbl.h" - -CBL_RATE = 10937.5 # CBL_FREQ_10K9 — частота железа, не 11 000 -PAGE = 16384 # EMM-страница -BLOCK = 128 # порция насоса CBL -SILENCE = 0x80 # центр беззнакового 8-битного сэмпла - -# id — нумерация звуков ОРИГИНАЛА (SDLPoP data/music/names.txt). Держим её, -# чтобы игровой код просил трек тем же номером, каким оригинал зовёт -# play_sound, и таблицу можно было сверить глазами. -TRACKS = { - 24: "regular_death", - 25: "find_mirror_and_find_shadow", - 26: "embrace", - 27: "cutscene_before_2_4_6_12", - 28: "fight_death", - 29: "meet_Jaffar", - 30: "life_potion", - 32: "end_level_4_and_killed_by_shadow", - 33: "potion", - 35: "cutscene_before_8_9", - 36: "out_of_time", - 37: "guard_death_and_obtaining_the_sword", - 39: "floating", - 40: "cutscene_not_much_time_left", - 41: "story_5_level_end_and_merge_with_shadow", - 43: "killed_Jaffar", - 50: "story_2_princess", - 52: "story_4_Jaffar_leaves", - 53: "story_3_Jaffar_enters", - 54: "intro_theme", - 55: "story_1_absence", - 56: "won", -} - - -def decode(path: Path) -> bytes: - """flac -> сырой u8 моно на частоте CBL.""" - out = subprocess.run( - ["ffmpeg", "-v", "error", "-i", str(path), - "-ac", "1", "-ar", str(int(CBL_RATE)), "-f", "u8", "-"], - capture_output=True, check=True) - return out.stdout - - -def pack(track_id: int, name: str) -> tuple[int, int]: - src = SRC_DIR / f"{name}.flac" - if not src.exists(): - raise SystemExit(f"нет источника: {src}") - data = bytearray(decode(src)) - - # Добить до кратности блока насоса — хвост тишиной, а не обрезкой: - # обрезать значило бы щёлкнуть на последнем сэмпле. - tail = len(data) % BLOCK - if tail: - data += bytes([SILENCE]) * (BLOCK - tail) - - chunks = (len(data) + PAGE - 1) // PAGE - OUT_DIR.mkdir(parents=True, exist_ok=True) - (OUT_DIR / f"m{track_id:02d}.bin").write_bytes(bytes(data)) - return chunks, len(data) // BLOCK - - -def main() -> None: - wanted = [int(a) for a in sys.argv[1:]] or sorted(TRACKS) - rows = [] - total = 0 - for tid in wanted: - if tid not in TRACKS: - raise SystemExit(f"неизвестный трек {tid}") - chunks, blocks = pack(tid, TRACKS[tid]) - rows.append((tid, TRACKS[tid], chunks, blocks)) - total += blocks * BLOCK - print(f" {tid:2d} {TRACKS[tid]:<40} {chunks:2d} стр, " - f"{blocks * BLOCK / 1024:7.1f} КБ, {blocks * BLOCK / CBL_RATE:5.1f} с") - - max_id = max(t for t, *_ in rows) - lines = [ - "/*", - " * pop_music_tbl.h — каталог музыкальных треков, СГЕНЕРИРОВАН.", - " * Источник: applications/PoP/PoP1_DOS_music/flac (записи DOS-версии).", - " * Генератор: toolchain/pop_pack_music.py. Руками не править.", - " *", - " * Нумерация id — оригинала (SDLPoP data/music/names.txt). pages —", - " * сколько кусков m_.bin лежит на диске, blocks — длина трека", - " * в порциях насоса по 128 байт (в байтах не влезло бы в uint16).", - " */", - "#ifndef POP_MUSIC_TBL_H", - "#define POP_MUSIC_TBL_H", - "", - "#include ", - "", - f"#define POP_MUS_COUNT {max_id + 1}", - f"#define POP_MUS_BLOCK {BLOCK}", - f"#define POP_MUS_MAX_PAGES {max(c for _, _, c, _ in rows)}", - "", - "typedef struct {", - " uint8_t pages; /* 0 — трека нет */", - " uint16_t blocks; /* длина в порциях по 128 байт */", - "} pop_mus_ent_t;", - "", - "static const pop_mus_ent_t pop_mus_tbl[POP_MUS_COUNT] = {", - ] - by_id = {t: (c, b, n) for t, n, c, b in rows} - for i in range(max_id + 1): - if i in by_id: - c, b, n = by_id[i] - lines.append(f" {{ {c:2d}, {b:5d} }}, /* {i:2d} {n} */") - else: - lines.append(f" {{ 0, 0 }}, /* {i:2d} */") - lines += ["};", "", "#endif /* POP_MUSIC_TBL_H */", ""] - OUT_H.write_text("\n".join(lines)) - print(f"итого {total / 1024:.0f} КБ в {OUT_DIR}") - print(f"каталог: {OUT_H}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_shadow.py b/applications/PoP/toolchain/pop_pack_shadow.py deleted file mode 100644 index aac74fb..0000000 --- a/applications/PoP/toolchain/pop_pack_shadow.py +++ /dev/null @@ -1,292 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_shadow.py — упаковщик спрайтов ТЕНИ. - -ЗАЧЕМ ОТДЕЛЬНЫЙ НАБОР. Оригинал не хранит спрайтов Тени вовсе: он кладёт -обычный спрайт ДВАЖДЫ — в x обычным прозрачным блитом, и в x+1 «блиттером -XOR» (draw_objtable_item, seg008.c:1600). Наш пакетный блит так не умеет, -поэтому результат запекается заранее, здесь. - -ЧТО ИМЕННО ДЕЛАЕТ ОРИГИНАЛ (проверено по исходнику, не по памяти): - - * `blitters_2_or` — НЕ побитовое ИЛИ. В SDLPoP это обычный блит с - colour key = индекс 0 (method_6_blit_img_to_scr, seg009.c:3306), то - есть один в один наш прозрачный блит. - * `blitters_3_xor` работает по 24-битному RGB, а не по индексам палитры - (blit_xor, seg009.c:3190: конвертация в 24 бита, затем `*p_dest ^= - *p_src` побайтно). Прозрачности у него нет — XOR'ится весь - прямоугольник, но прозрачный пиксель это чёрный 0x000000, а XOR с - нулём ничего не меняет. - -Отсюда своя палитра: XOR двух цветов игровой палитры даёт цвет, которого в -ней нет. - -ЕДИНСТВЕННОЕ РАСХОЖДЕНИЕ. XOR считается по тому, что УЖЕ на экране, то -есть зависит от фона. Разбор по пикселям: от фона зависит только кайма в -один пиксель по ЛЕВЫМ кромкам силуэта (там, где спрайт прозрачен в x, но -непрозрачен в x−1). На чёрном фоне `фон XOR цвет == цвет`, и запечка -точна; Тень почти всегда на чёрном. Мы печём именно этот случай. - -ДВА НАБОРА В ОДНОМ АТЛАСЕ. Набор спрайтов у оригинала выбирает НЕ -персонаж, а поле `sword` самого кадра: load_frame_to_obj (seg008.c:1752) -держит chtab_base жёстко равным chtab_2 и прибавляет `sword >> 6`. У всех -кадров frame_table_kid эти биты нулевые, у всех кадров frame_tbl_guard — -0xC0. Тень берёт таблицу стража для кадров 150..189 (seg006.c:533), то -есть идёт через chtab_5, а chtab_5 на 12-м уровне грузится из SHADOW.DAT -(tbl_guard_type[12] == 4, seg000.c:1117) — и это графика КИДА в боевых -позах, а не стража. Поэтому печём обе половины: - - KID — data/KID/res(401+id).png, id 0..218 -> sk0..skN.atl - SHADOW — data/SHADOW/res(751+id).png, id 0..31 -> sf0..sfM.atl - -Выход: poc/res/shadow/sk*.atl + sf*.atl + pop_shadow_atlas.h (палитра -внутри заголовка — 16 записей, её заливает приложение через gfx_pal_load). -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B -from pop_pack_kid import transpose_cols - -DATA = os.path.join(HERE, "..", "SDLPoP", "data") -OUT_DIR = os.path.join(HERE, "..", "poc", "res", "shadow") -PAL_BASE = 0xA0 # слоты Sprinter под Тень: 0xA0..0xAF -NCOL = 16 # столько цветов в палитре Тени -SHIFT = 3 # sk[id>>3], idx id&7 — как у Kid (кадры крупные) -MASK = (1 << SHIFT) - 1 - -# Половины набора: (каталог, база ресурса, префикс выходных файлов). -# Off-by-one тот же, что у Kid и стража: images[0] = res(база+1), значит -# frame.image = N -> res(база+1+N) (см. pop_pack_kid.load_kid). -HALVES = (("KID", 400, "sk"), - ("SHADOW", 750, "sf")) - - -def frames(dirname, base): - """Все кадры половины: [(id, w, h, [[rgb|None]...])] — уже после - наложения XOR, в честном RGB.""" - out = [] - id = 0 - while True: - path = os.path.join(DATA, dirname, f"res{base + 1 + id}.png") - if not os.path.exists(path): - break - im = Image.open(path) - if im.mode != "P": - B.die(f"{path}: mode {im.mode}, ожидался P") - pal = im.getpalette()[:NCOL * 3] - rgb = [tuple(pal[i * 3:i * 3 + 3]) for i in range(NCOL)] - w, h = im.size - px = im.load() - grid = [] - for y in range(h): - # Ширина на один больше: второй проход кладётся в x+1, и - # суммарный след занимает [x, x+w]. - row = [None] * (w + 1) - for x in range(w): # проход 1: обычный блит - i = px[x, y] - if i: - row[x] = rgb[i] - for x in range(w): # проход 2: XOR в x+1 - i = px[x, y] - if not i: - continue # чёрный: XOR — не операция - s = rgb[i] - t = x + 1 - row[t] = s if row[t] is None else tuple(a ^ b for a, b in zip(row[t], s)) - grid.append(row) - out.append((id, w + 1, h, grid)) - id += 1 - return out - - -def histogram(halves): - h = {} - for _, fr in halves: - for _, _, _, grid in fr: - for row in grid: - for c in row: - if c is not None: - h[c] = h.get(c, 0) + 1 - return h - - -def _d2(a, b): - return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2 - - -def _kmeans(pts, k, init): - """Взвешенный Ллойд по СПИСКУ ЦВЕТОВ с весами (их полсотни, не пиксели).""" - cent = list(init) - for _ in range(80): - groups = [[] for _ in cent] - for c, n in pts: - groups[min(range(len(cent)), key=lambda j: _d2(c, cent[j]))].append((c, n)) - new = [] - for j, g in enumerate(groups): - if not g: - new.append(cent[j]) - continue - w = sum(n for _, n in g) - new.append(tuple(int(round(sum(c[i] * n for c, n in g) / w)) for i in range(3))) - if new == cent: - break - cent = new - return cent - - -def build_palette(hist): - """16 цветов ГИБРИДОМ: часть слотов — самые частые цвета ТОЧНО, остаток - — взвешенные кластеры хвоста. - - Почему не «просто самые частые»: тогда редкие цвета уезжают в далёкий - ближайший, и грубых промахов (сдвиг >90 по евклиду в RGB при максимуме - 441) получается впятеро больше — 381 пиксель против 76 на все 251 - кадр (замер 2026-08-20). Почему не чистый k-means: он двигает вообще - все цвета, включая массовые. - - Разделение слотов подбираем перебором по критерию «сначала минимум - грубых промахов, потом заметных, потом худшая ошибка».""" - items = sorted(hist.items(), key=lambda kv: -kv[1]) - - def stats(pal): - bad = worst = mid = big = 0 - for c, n in items: - e = min(_d2(c, p) for p in pal) ** 0.5 - if e > 0: - bad += n - worst = max(worst, e) - if e >= 90: - big += n - elif e >= 40: - mid += n - return bad, mid, big, worst - - best = None - for m in range(1, NCOL): # m слотов под хвост - keep = [c for c, _ in items[:NCOL - m]] - rest = [(c, n) for c, n in items[NCOL - m:]] - if not rest: - continue - pal = keep + _kmeans(rest, m, [c for c, _ in rest[:m]]) - bad, mid, big, worst = stats(pal) - score = (big, mid, worst) - if best is None or score < best[0]: - best = (score, m, pal, (bad, mid, big, worst)) - _, m, pal, st = best - # Чёрный обязан быть ТОЧНЫМ и лежать в слоте 0: это XOR-погашенная - # середина силуэта, больше половины всех пикселей Тени. - j = min(range(len(pal)), key=lambda i: _d2((0, 0, 0), pal[i])) - pal[j] = (0, 0, 0) - pal[0], pal[j] = pal[j], pal[0] - bad, mid, big, worst = st - tot = sum(hist.values()) - print(f" палитра: {NCOL - m} частых точно + {m} кластеров хвоста; " - f"из {len(items)} цветов изменено {bad} px из {tot} " - f"({100.0 * bad / tot:.2f} %), заметно {mid}, сильно {big}, худшая {worst:.0f}") - return pal - - -def encode(grid, w, h, pal): - """RGB-сетка -> байты атласа: нет пикселя -> 0xFF, цвет -> PAL_BASE + k. - Чёрный — НАСТОЯЩИЙ цвет Тени (слот 0), а не прозрачность.""" - row = bytearray() - for y in range(h): - for x in range(w): - c = grid[y][x] - if c is None: - row.append(0xFF) - else: - row.append(PAL_BASE + min(range(len(pal)), key=lambda k: _d2(c, pal[k]))) - return transpose_cols(w, h, bytes(row)) - - -def write_header(path, counts, pal): - vals = [] - for (r, g, b) in pal: - vals += [b, g, r, 0] # формат gfx_pal_load: B, G, R, 0 - lines = [ - "/* pop_shadow_atlas.h — раскладка атласа ТЕНИ.", - " * СГЕНЕРЕНО toolchain/pop_pack_shadow.py — НЕ править вручную.", - " *", - " * Две половины, потому что и у оригинала их две (см. шапку", - " * упаковщика): кадры вне боя адресуют chtab_2 (спрайты Кида),", - " * кадры 150..189 — chtab_5, а он на 12-м уровне это SHADOW.DAT.", - " * Какая половина нужна, приложение уже знает — тем же условием,", - " * что выбирает таблицу кадров (pop_frame_tbl_is_guard).", - " *", - " * Спрайт Тени НА ОДИН ПИКСЕЛЬ ШИРЕ исходного: второй проход", - " * оригинала кладётся в x+1, и суммарный след занимает [x, x+w].", - " * Рисовать по тем же координатам, что и Кида — сдвиг уже внутри.", - " */", - "#ifndef POP_SHADOW_ATLAS_H", - "#define POP_SHADOW_ATLAS_H", - "", - "#include ", - "", - "#define POP_SHADOW_SHIFT %d" % SHIFT, - "#define POP_SHADOW_MASK %d" % MASK, - "#define POP_SHADOW_PAL_BASE 0x%02X /* слоты Sprinter под Тень */" % PAL_BASE, - "", - "/* Половина «вне боя» — кадры Кида (chtab_2). */", - "#define POP_SHADOW_KID_PAGES %d" % counts["sk"], - "/* Половина «в бою» — SHADOW.DAT (chtab_5, кадры 150..189). */", - "#define POP_SHADOW_FGT_PAGES %d" % counts["sf"], - "", - "static const char *const pop_shadow_kid_atl[POP_SHADOW_KID_PAGES] = {", - ] - lines += [' "SHADOW\\\\sk%d.atl",' % i for i in range(counts["sk"])] - lines += [ - "};", - "", - "static const char *const pop_shadow_fgt_atl[POP_SHADOW_FGT_PAGES] = {", - ] - lines += [' "SHADOW\\\\sf%d.atl",' % i for i in range(counts["sf"])] - lines += [ - "};", - "", - "/* 16 цветов, запись 4 байта (B, G, R, 0) — формат gfx_pal_load. */", - "static const uint8_t pop_shadow_pal[64] = {", - " " + ",".join("0x%02X" % v for v in vals) + ",", - "};", - "", - "#endif", - "", - ] - with open(path, "w") as f: - f.write("\n".join(lines)) - print(f" pop_shadow_atlas.h -> {path}") - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - halves = [(prefix, frames(d, base)) for d, base, prefix in HALVES] - for (d, base, prefix), (_, fr) in zip(HALVES, halves): - if not fr: - B.die(f"нет спрайтов в data/{d} (SHADOW.DAT распакован?)") - print(f" {d}: {len(fr)} кадров") - pal = build_palette(histogram(halves)) - - counts, total, nspr = {}, 0, 0 - for prefix, fr in halves: - pages = {} - for id, w, h, grid in fr: - pages.setdefault(id >> SHIFT, {})[id & MASK] = (w, h, encode(grid, w, h, pal)) - nspr += 1 - npg = max(pages) + 1 - counts[prefix] = npg - for pg in range(npg): - nm = f"{prefix}{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages.get(pg, {})) - total += sz - print(f" {prefix}*.atl: {len(fr)} спрайтов, {npg} EMM-страниц") - write_header(os.path.join(HERE, "..", "roomtest", "pop_shadow_atlas.h"), counts, pal) - print(f"ИТОГО: {nspr} спрайтов Тени, " - f"{counts['sk'] + counts['sf']} EMM-страниц, {total} Б -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_sound.py b/applications/PoP/toolchain/pop_pack_sound.py deleted file mode 100644 index a7d022f..0000000 --- a/applications/PoP/toolchain/pop_pack_sound.py +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_sound.py — упаковщик ЗВУКОВЫХ ЭФФЕКТОВ (оцифровка, chtab нет). - -ИСТОЧНИК. `MSDOS/digisnd1..3.dat` — оригинальные контейнеры. Разбор: -индекс по 8 байт (id, offset, size), **первый байт ресурса — контрольная -сумма**, тело за ней (спецификация `docs/POP-DAT-FormatSpecifications`, -§3.1.2). Тело — один из двух вариантов заголовка: - - digi_type (1.0/1.1): word rate, word count, word unk, byte size=8 - digi_new_type (1.3/1.4): word rate, byte size=8, word count, word, word - -Различаем по позиции байта размера: у нового он на смещении 3, у старого -на 7. Сэмплы — 8 бит БЕЗЗНАКОВЫЕ, МОНО (проверено по `convert_digi_sound`, -seg009.c:2358: один байт на кадр, `(b | b<<8) - 32768`; стерео в данных -нет вовсе, каналы размножаются уже на выходе). Это ровно формат нашего -CBL — конвертировать нечего. - -ЧАСТОТА. Приводим ВСЁ к 10 937,5 Гц — это `CBL_FREQ_10K9`, то есть -частота железа. Не к 11 000: проигрывание 11 000-данных на 10 937,5 дало -бы сдвиг тона −9,9 цента, а пересчитывать три файла (2 750, 8 200, -14 000 Гц) всё равно надо. Взамен CBL открывается ОДИН раз и частота не -меняется никогда — ни между эффектами, ни при переходе на музыку. - -РАСКЛАДКА. Всё склеивается в EMM-страницы по 16 384 Б, и начало каждого -звука ВЫРАВНИВАЕТСЯ НА 128. Это не косметика: блок запроса CBL — ровно -128 байт, а 16 384 кратно 128, поэтому при таком выравнивании ни один -блок не пересекает границу страницы. Проигрыватель за счёт этого не -знает слова «стык»: замапил страницу, отдал 128 байт, сдвинул указатель. -Плата — до 127 байт на звук, всего ~2 КБ. - -Выход: poc/res/sound/s0..sN.bin (по 16 384 Б) + roomtest/pop_sound_tbl.h -""" -import os -import struct -import sys - -HERE = os.path.dirname(os.path.abspath(__file__)) -DAT_DIR = os.path.join(HERE, "..", "MSDOS") -OUT_DIR = os.path.join(HERE, "..", "poc", "res", "sound") -HDR = os.path.join(HERE, "..", "roomtest", "pop_sound_tbl.h") - -PAGE = 16384 -BLOCK = 128 # блок запроса CBL при 8 бит (см. cbl.h) -RATE = 10937.5 # CBL_FREQ_10K9 -NSOUND = 57 # id 0..56; у музыки оцифровки нет — длина 0 - - -def dat_resources(path): - """id -> тело ресурса (без байта контрольной суммы).""" - d = open(path, "rb").read() - off, _ = struct.unpack(" 4 and body[3] == 8: # digi_new_type - rate = struct.unpack(" 7 and body[7] == 8: # digi_type - rate, cnt = struct.unpack("= len(src) - 1: - out[i] = src[-1] - else: - a = x - i0 - out[i] = int(round(src[i0] * (1.0 - a) + src[i0 + 1] * a)) - return bytes(out) - - -def main(): - res = {} - for i in (1, 2, 3): - p = os.path.join(DAT_DIR, f"digisnd{i}.dat") - if not os.path.exists(p): - sys.exit(f"нет файла {p}") - res.update(dat_resources(p)) - - sounds = {} - for sid, body in sorted(res.items()): - g = digi(body) - if g is None: - print(f" звук {sid}: не оцифровка, пропуск") - continue - rate, samples = g - pcm = resample(samples, rate, RATE) - sounds[sid] = pcm - if rate != 11000: - print(f" звук {sid}: {rate} Гц -> {RATE:g} Гц, {len(samples)} -> {len(pcm)} сэмплов") - - # Раскладка: начало каждого звука кратно BLOCK, страницы по PAGE. - # ПЕРВЫЙ БЛОК — ТИШИНА. Он нужен насосу: когда эффект кончился, в CBL - # всё равно надо что-то отдавать, иначе железо доигрывает по кругу хвост - # своего буфера (жужжание). Держим тишину СВОЮ, а не просим у libc - # (CBL_UNDERRUN_SILENCE делает malloc), потому что куча в резиденте W2 - # тесная и её отказ ронял бы весь звук. - blob = bytearray([0x80] * BLOCK) - table = {} - for sid in sorted(sounds): - pad = (-len(blob)) % BLOCK - blob += bytes([0x80]) * pad # 0x80 — тишина в беззнаковом 8-бит - # Длину округляем ВВЕРХ до блока: хвост последнего блока — это - # выравнивающая тишина следующего звука, и проигрыватель за счёт - # этого не знает слова «неполный блок». - need = (len(sounds[sid]) + BLOCK - 1) // BLOCK * BLOCK - # ЗВУК ЦЕЛИКОМ В ОДНОЙ СТРАНИЦЕ (решение пользователя 2026-08-25). - # Раньше длинные эффекты перетекали в следующую страницу, и насос - # переключал её прямо посреди воспроизведения — лишняя логика в ISR - # и целый класс отказов «играет не тот звук». Теперь страница — - # как атлас: не влезает в остаток — начинаем новую, хвост добиваем - # тишиной. Платим страницами EMM, их у нас с запасом. - if len(blob) % PAGE + need > PAGE: - blob += bytes([0x80]) * ((-len(blob)) % PAGE) - table[sid] = (len(blob), need) - blob += sounds[sid] - blob += bytes([0x80]) * ((-len(blob)) % PAGE) - - os.makedirs(OUT_DIR, exist_ok=True) - npages = len(blob) // PAGE - for i in range(npages): - with open(os.path.join(OUT_DIR, f"s{i}.bin"), "wb") as f: - f.write(blob[i * PAGE:(i + 1) * PAGE]) - - lines = [ - "/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP.", - " * СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную.", - " *", - " * Данные: 8 бит беззнаковые, МОНО, %g Гц (CBL_FREQ_10K9) — формат" % RATE, - " * CBL один в один, конвертировать в рантайме нечего.", - " *", - " * Начало каждого звука кратно %d — размеру блока запроса CBL, а" % BLOCK, - " * страница (%d) кратна ему же. Поэтому НИ ОДИН блок не пересекает" % PAGE, - " * границу страницы. Больше того: с 2026-08-25 каждый звук лежит\n * ЦЕЛИКОМ в одной странице — не влезает в остаток, значит начинаем\n * новую (страницы EMM у нас с запасом). Единственное исключение —\n * эффект, который сам ДЛИННЕЕ страницы: для него насос переключает\n * страницу на ходу, и эта ветка в pop_sfx_fill остаётся ради него.", - " *", - " * Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80", - " * 32-битная арифметика дорога, а так всё влезает в 8/16 бит.", - " * Длина округлена вверх до блока — неполных блоков не бывает.", - " */", - "#ifndef POP_SOUND_TBL_H", - "#define POP_SOUND_TBL_H", - "", - "#include ", - "", - "#define POP_SND_PAGES %d" % npages, - "#define POP_SND_COUNT %d" % NSOUND, - "#define POP_SND_BLOCK %d" % BLOCK, - "/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */", - "#define POP_SND_SILENCE_PAGE 0", - "#define POP_SND_SILENCE_OFF 0x0000", - "", - "typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t;", - "", - "/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */", - "static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = {", - ] - for sid in range(NSOUND): - off, ln = table.get(sid, (0, 0)) - lines.append(" { %d, 0x%04X, %5d }, /* %2d */" % (off >> 14, off & 0x3FFF, ln, sid)) - lines += [ - "};", - "", - "/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная", - " * половина): иначе копия строк уезжает в каждый включивший заголовок", - " * модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же", - " * приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */", - "#ifdef POP_SND_FILES", - "static const char *const pop_snd_files[POP_SND_PAGES] = {", - ] - lines += [' "SND\\\\s%d.bin",' % i for i in range(npages)] - lines += ["};", "#endif", "", "#endif", ""] - with open(HDR, "w") as f: - f.write("\n".join(lines)) - - have = sum(1 for s in sounds.values() if s) - print(f"ИТОГО: {have} эффектов, {len(blob)} Б = {npages} EMM-страниц -> {OUT_DIR}") - print(f" заголовок -> {HDR}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/pop_pack_title.py b/applications/PoP/toolchain/pop_pack_title.py deleted file mode 100644 index 0f739d9..0000000 --- a/applications/PoP/toolchain/pop_pack_title.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_title.py — титульные композиции SDLPoP для Sprinter. - -Исходник — PNG-ресурсы ``data/TITLE/res51..55`` из локального SDLPoP. -Runtime не должен держать 320x200 картинку в W2 и не разбирает PNG: каждая -готовая композиция разрезана на пять getimage-лент высотой не более 49 -строк. Лента вместе с заголовком атласа занимает одну EMM-страницу; экран -рисуется лента за лентой, и страница сразу освобождается. - -Композиции в точности повторяют ``show_title()`` до story/intro: - t0 — основной рисунок; - t1 — рисунок + PRESENTS; - t2 — рисунок + название игры; - t3 — рисунок + логотип PRINCE OF PERSIA и Jordan Mechner. -""" -from pathlib import Path - -from PIL import Image - -ROOT = Path(__file__).resolve().parent.parent -SRC = ROOT / "SDLPoP" / "data" / "TITLE" -OUT = ROOT / "poc" / "res" / "title" - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - # Каталог хранит preview-габарит в uint8, но atlas_image читает только - # offset; реальный getimage-width — u16 в блобе. Так уже пакуются - # широкие 320-пиксельные полосы фона. - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"title atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def image(n: int) -> Image.Image: - im = Image.open(SRC / f"res{n}.png") - if im.mode != "P": - raise SystemExit(f"res{n}.png: expected indexed PNG, got {im.mode}") - return im.copy() - - -def assert_palette(base: Image.Image, overlay: Image.Image, n: int) -> None: - if base.getpalette()[:48] != overlay.getpalette()[:48]: - raise SystemExit(f"res{n}.png uses a palette different from res51.png") - - -def paste_opaque(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - dst.paste(src, (x, y)) - - -def paste_transparent(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - # TITLE_POP — единственный из пяти элементов, который SDLPoP рисует - # blitters_10h_transp. В PNG тот же факт записан colour-key index 0. - # Image.point() у P-изображения возвращает снова P, а paste() принимает - # маску только L/1/RGBA. Строим L явно, не меняя индексы самой картинки. - mask = Image.frombytes("L", src.size, - bytes(0 if p == 0 else 255 for p in src.tobytes())) - dst.paste(src, (x, y), mask) - - -# Семнадцатая запись — фон текстовой рамки story (STORY_BG_INDEX в -# pop_pack_intro.py). Она нужна здесь потому, что «In the absence…» -# проявляется полосами ПОВЕРХ последнего кадра титров, то есть при ещё -# загруженной title.pal: без этой записи фон рамки был бы чёрным. -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) - - -def write_palette(base: Image.Image) -> None: - rgb = base.getpalette()[:48] - pal = bytearray() - for i in range(16): - r, g, b = rgb[i * 3:i * 3 + 3] - pal += bytes((b, g, r, 0)) # родной формат gfx_pal_fload - assert len(pal) == STORY_BG_INDEX * 4 - r, g, b = STORY_BG_COLOR - pal += bytes((b, g, r, 0)) - (OUT / "title.pal").write_bytes(pal) - - -def write_scene(scene: int, canvas: Image.Image) -> int: - count = 0 - for part, top in enumerate(range(0, canvas.height, STRIP_H)): - band = canvas.crop((0, top, canvas.width, - min(top + STRIP_H, canvas.height))) - path = OUT / f"t{scene}_{part}.atl" - path.write_bytes(atlas_blob(band.tobytes(), band.width, band.height)) - count += 1 - return count - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - main_image = image(51) - if main_image.size != (320, 200): - raise SystemExit(f"res51.png: expected 320x200, got {main_image.size}") - - presents = main_image.copy() - paste_opaque(presents, image(52), 96, 106, 52) - - game = main_image.copy() - paste_opaque(game, image(53), 96, 122, 53) - - logo = main_image.copy() - paste_transparent(logo, image(54), 24, 107, 54) - paste_opaque(logo, image(55), 48, 184, 55) - - write_palette(main_image) - scenes = (main_image, presents, game, logo) - strips = [write_scene(i, scene) for i, scene in enumerate(scenes)] - assert strips == [5, 5, 5, 5] - print(f"{OUT}: {len(scenes)} title compositions x {strips[0]} strips, " - f"one strip <= {STRIP_H} rows / one EMM page") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/render_room.py b/applications/PoP/toolchain/render_room.py deleted file mode 100755 index b441515..0000000 --- a/applications/PoP/toolchain/render_room.py +++ /dev/null @@ -1,850 +0,0 @@ -#!/usr/bin/env python3 -""" -Parse SDLPoP level file (res2001.bin) and render the first room by -faithfully replaying the tile-drawing logic of seg008.c (draw_room/draw_tile). - -Pixel model (from seg008.c): - - screen is 320px wide, 10 columns. - - col_xh[col] = {0,4,8,12,16,20,24,28,32,36}; x_px = xh*8 -> 0,32,64,...,288 - (tile column is 32px; the 4px offset handles overlap of floor/wall edges) - - rows drawn 2,1,0 (bottom..top). For each row: - draw_bottom_y = 63*drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - row2 -> bottom_y=191, row1 -> 128, row0 -> 65 - - a tile sprite of height h drawn at ybottom is placed with its BOTTOM at ybottom: - y = ybottom - h + 1 - -We replay draw_tile() which composites (in order): - floorright, anim_topright, right, anim_right, bottom, loose, base, anim, fore -Dependencies on NEIGHBOURS: - - tile_left = tile in the column to the left (same room, same row) - - row_below_left_[col] = tile in (room_below, col-1, row_below) -> for topright/floorright - - For a single room with no links we treat out-of-range neighbours as walls - (level edges), matching SDLPoP's custom->drawn_tile_*_level_edge defaults - (left = wall, top = floor). - -We ignore animated variants (spike frames, chomper, torch flames, gate -animation) for this first static render; they use curr_modifier/backtable. -""" - -import os -from PIL import Image - -ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -LEVEL_DIR = os.path.join(ROOT, "SDLPoP", "data", "LEVELS") -VPALACE_DIR = os.path.join(ROOT, "SDLPoP", "data", "VPALACE") -VDUNGEON_DIR = os.path.join(ROOT, "SDLPoP", "data", "VDUNGEON") - -# For dungeon levels (tbl_level_type == 0) the environment sprites come from -# VDUNGEON where present, otherwise fall back to the shared VPALACE set -# (PRINCE.DAT common images). For palace levels use VPALACE only. -IS_DUNGEON = True # room 1 (res2001) is the dungeon - -# tile_table[code] = (base_id, floor_left, base_y, right_id, floor_right, -# right_y, stripe_id, topright_id, bottom_id, fore_id, -# fore_x, fore_y) -TILE_TABLE = [ - ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), # 0x00 empty - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x01 floor - (127, 1, 0, 133, 1, 2, 145, 0, 43, 0, 0, 0), # 0x02 spike - ( 92, 1, 0, 93, 1, 2, 0, 94, 43, 95, 1, 0), # 0x03 pillar - ( 46, 1, 0, 47, 1, 2, 0, 48, 43, 49, 3, 0), # 0x04 gate - ( 41, 1, 1, 35, 1, 3, 145, 0, 36, 0, 0, 0), # 0x05 stuck floor - ( 41, 1, 0, 42, 1, 2, 145, 0, 96, 0, 0, 0), # 0x06 close button - ( 46, 1, 0, 0, 0, 2, 0, 0, 43, 49, 3, 0), # 0x07 door top with floor - ( 86, 1, 0, 87, 1, 2, 0, 0, 43, 88, 1, 0), # 0x08 big pillar bottom - ( 0, 0, 0, 89, 0, 3, 0, 90, 0, 91, 1, 3), # 0x09 big pillar top - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 12, 2, -3), # 0x0A potion - ( 0, 1, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0), # 0x0B loose floor - ( 0, 0, 0, 0, 0, 2, 0, 0, 85, 49, 3, 0), # 0x0C door top - ( 75, 1, 0, 42, 1, 2, 0, 0, 43, 77, 0, 0), # 0x0D mirror - ( 97, 1, 0, 98, 1, 2, 145, 0, 43, 100, 0, 0), # 0x0E debris - (147, 1, 0, 42, 1, 1, 145, 0, 149, 0, 0, 0), # 0x0F open button - ( 41, 1, 0, 37, 0, 0, 0, 38, 43, 0, 0, 0), # 0x10 leveldoor left - ( 0, 0, 0, 39, 1, 2, 0, 40, 43, 0, 0, 0), # 0x11 leveldoor right - ( 0, 0, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x12 chomper - ( 41, 1, 0, 42, 1, 2, 0, 0, 43, 0, 0, 0), # 0x13 torch - ( 0, 0, 0, 1, 1, 2, 0, 2, 0, 0, 0, 0), # 0x14 wall - ( 30, 1, 0, 31, 1, 2, 0, 0, 43, 0, 0, 0), # 0x15 skeleton - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x16 sword - ( 41, 1, 0, 10, 0, 0, 0, 11, 43, 0, 0, 0), # 0x17 balcony left - ( 0, 0, 0, 12, 1, 2, 0, 13, 43, 0, 0, 0), # 0x18 balcony right - ( 92, 1, 0, 42, 1, 2, 145, 0, 43, 95, 1, 0), # 0x19 lattice pillar - ( 1, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, -53), # 0x1A lattice down - ( 3, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1B lattice small - ( 4, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1C lattice left - ( 5, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1D lattice right - ( 97, 1, 0, 98, 1, 2, 0, 0, 43, 100, 0, 0), # 0x1E debris with torch -] - -TILE_NAMES = { - 0x00: "empty", 0x01: "floor", 0x02: "spike", 0x03: "pillar", - 0x04: "gate", 0x05: "stuck_floor", 0x06: "close_button", 0x07: "door_top_floor", - 0x08: "big_pillar_bottom", 0x09: "big_pillar_top", 0x0A: "potion", - 0x0B: "loose_floor", 0x0C: "door_top", 0x0D: "mirror", 0x0E: "debris", - 0x0F: "open_button", 0x10: "leveldoor_left", 0x11: "leveldoor_right", - 0x12: "chomper", 0x13: "torch", 0x14: "wall", 0x15: "skeleton", - 0x16: "sword", 0x17: "balcony_left", 0x18: "balcony_right", - 0x19: "lattice_pillar", 0x1A: "lattice_down", 0x1B: "lattice_small", - 0x1C: "lattice_left", 0x1D: "lattice_right", 0x1E: "debris_torch", -} - -COL_XH = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36] - -# chtab -> directory/subfolder + id offset -# id_chtab_6_environment -> VPALACE, res(200+id).png -# id_chtab_7_environmentwall -> VPALACE (wall images also here, res(200+id)) -# id_chtab_1_flameswordpotion -> flames etc (skipped in static render) -CHTAB_ENV = 6 -CHTAB_WALL = 7 -CHTAB_FSP = 1 # flames/sword/potion (animated, skipped) - - -# ---- POP1 level file structure (see POP-DAT-FormatSpecifications.txt, sec 3.4) ---- -# Block layout (for the standard 2305-byte level): -# 0 .. 720 pop1 foretable (24 rooms x 30 bytes) -# 720 .. 1440 pop1 backtable (24 rooms x 30 bytes) -# 1440 .. 1696 door I (256 bytes, one per event line) -# 1696 .. 1952 door II (256 bytes) -# 1952 .. 2048 links (24 rooms x 4 bytes: L,R,Up,Dn) -# 2048 .. 2112 unknown I -# 2112 .. 2115 start position (room, location, direction) -# 2115 .. 2116 unknown II -# 2116 .. 2119 unknown III -# 2119 .. 2143 guard location (24) -# 2143 .. 2167 guard direction (24) -# 2167 .. 2191 unknown IV (a) -# 2191 .. 2215 unknown IV (b) -# 2215 .. 2239 guard skill (24) -# 2239 .. 2263 unknown IV (c) -# 2263 .. 2287 guard colour (24) -# 2287 .. 2303 unknown IV (d) -# 2303 .. 2305 0F 09 - -# foretable byte format: rrmccccc (2 random bits, 1 modifier bit, 5 code bits) -FG_RAND_MASK = 0xC0 -FG_MODBIT_MASK = 0x20 -FG_CODE_MASK = 0x1F - -# backtable: a tile modifier that depends on the group of the foretable code. -# group ids map foretable code -> "group" used to interpret backtable value. -# (see Table 7/8). We only need the group for door/event interpretation. -GROUP_OF_CODE = { - 0x00: "free", 0x01: "free", 0x02: "spike", 0x03: "none", - 0x04: "gate", 0x05: "none", 0x06: "event", 0x07: "tapest", - 0x08: "none", 0x09: "none", 0x0A: "potion", 0x0B: "none", - 0x0C: "ttop", 0x0D: "none", 0x0E: "none", 0x0F: "event", - 0x10: "none", 0x11: "none", 0x12: "chomp", 0x13: "none", - 0x14: "wall", 0x15: "none", 0x16: "none", 0x17: "none", - 0x18: "none", 0x19: "none", 0x1A: "none", 0x1B: "none", - 0x1C: "none", 0x1D: "none", 0x1E: "none", 0x1F: "none", -} - -# backtable modifier meanings per group (subset, from Table 8): -GATE_MOD = {0: "closed", 1: "open", 2: "with_lattice", 3: "alt_design"} -TTOP_MOD = {0: "normal", 1: "black", 2: "empty", 3: "?3", 4: "?4", 5: "?5", 6: "?6", 7: "?7"} -SPIKE_MOD = {0: "normal", 1: "barely_out", 2: "half_out", 3: "fully_out"} -CHOMP_MOD = {0: "normal", 1: "barely_out", 2: "half_out", 3: "fully_out", 4: "out?"} -POTION_MOD = {0: "blue", 1: "no_blue", 2: "window", 3: "spot?"} -TAPEST_MOD = {0: "normal", 1: "alt_design", 2: "black", 3: "empty"} -EVENT_MOD_DESC = { # group "event": the backtable byte IS the event id - 0: "closer", 1: "opener", -} - - -class Level: - """Full parsed POP1 level file.""" - def __init__(self, data): - self.data = data - self.rooms_fg = {} # room -> list[30] of (fg_byte, code, modbit) - self.rooms_bg = {} # room -> list[30] of backtable byte - for room in range(1, 25): - fg = []; bg = [] - for off in range(30): - i = (room - 1) * 30 + off - fb = data[i]; bb = data[720 + i] - fg.append((fb, fb & FG_CODE_MASK, (fb & FG_MODBIT_MASK) >> 5)) - bg.append(bb) - self.rooms_fg[room] = fg - self.rooms_bg[room] = bg - # door I / II (event lines 0..255) - self.door_i = data[1440:1696] - self.door_ii = data[1696:1952] - # links: 24 rooms x (L,R,Up,Dn) - self.links = {} - for room in range(1, 25): - b = data[1952 + (room - 1) * 4: 1952 + (room - 1) * 4 + 4] - self.links[room] = tuple(b) # (left, right, up, down) - # start position - self.start = tuple(data[2112:2115]) - # guards - self.guard_loc = list(data[2119:2143]) - self.guard_dir = list(data[2143:2167]) - self.guard_skill = list(data[2215:2239]) - self.guard_colour = list(data[2263:2287]) - - def door_for_event(self, event_id): - """Decode door I/II for an event line -> (room, location, trigger_next).""" - bi = self.door_i[event_id] - bii = self.door_ii[event_id] - # Byte I: t1 s4 s5 l1 l2 l3 l4 l5 - t1 = (bi >> 7) & 1 - s4 = (bi >> 6) & 1 - s5 = (bi >> 5) & 1 - l1 = (bi >> 4) & 1 - l2 = (bi >> 3) & 1 - l3 = (bi >> 2) & 1 - l4 = (bi >> 1) & 1 - l5 = bi & 1 - # Byte II: s1 s2 s3 00000 - s1 = (bii >> 7) & 1 - s2 = (bii >> 6) & 1 - s3 = (bii >> 5) & 1 - screen = (s1 << 4) | (s2 << 3) | (s3 << 2) | (s4 << 1) | s5 - loc = (l1 << 4) | (l2 << 3) | (l3 << 2) | (l4 << 1) | l5 - return screen, loc, t1 - - def backtable_desc(self, code, bb): - grp = GROUP_OF_CODE.get(code, "none") - tbl = {"gate": GATE_MOD, "ttop": TTOP_MOD, "spike": SPIKE_MOD, - "chomp": CHOMP_MOD, "potion": POTION_MOD, "tapest": TAPEST_MOD} - if code == 0x06 or code == 0x0F: # event group - act = EVENT_MOD_DESC.get(bb & 1, "?") - return f"event(id={bb}, {act})" - if grp in tbl: - return tbl[grp].get(bb, f"?0x{bb:02X}") - return f"0x{bb:02X}" - - -class Room: - def __init__(self, level, room_num): - self.level = level - self.room_num = room_num - self.fg = level.rooms_fg[room_num] - self.bg = level.rooms_bg[room_num] - self.left_room = None # соседняя комната слева (link L); load_leftroom - - def tile(self, row, col): - """Return (code, fg_byte, modbit, backtable_byte) for an in-room tile. - Out-of-range neighbours follow seg008 defaults: - col<0 -> берётся из ЛЕВОЙ комнаты (col 9), как load_leftroom(); - если левой комнаты нет — уровневая кромка = стена (20). - row<0 -> top level edge = floor (code 1, mod 0) - """ - if col < 0: - if self.left_room is not None and 0 <= row < 3: - return self.left_room.tile(row, 9) - return 20, 0, 0, 0 - if row < 0: - return 1, 0, 0, 0 - if not (0 <= row < 3 and 0 <= col < 10): - return 20, 0, 0, 0 - i = row * 10 + col - fb, code, mbit = self.fg[i] - return code, fb, mbit, self.bg[i] - - -# Log of every sprite loaded during a render, for the per-tile report. -SPRITE_LOG = [] - - -def load_sprite(id, chtab=CHTAB_ENV, reason=""): - """Load resource PNG для картинки id из набора chtab. - - База ресурса зависит от chtab (seg000.c:1109/1122): - chtab_6 environment -> res(200+id) - chtab_7 environmentwall -> res(360+id) - chtab_1 flame/sword/pot -> res(150+id) (анимация, статикой не грузим) - - Dungeon (IS_DUNGEON) cascade: try VDUNGEON first (dungeon-specific - overrides), then fall back to VPALACE (shared base set). - """ - if id <= 0: - return None - base = {CHTAB_ENV: 200, CHTAB_WALL: 360, CHTAB_FSP: 150}.get(chtab, 200) - fname = f"res{base + id}.png" - if IS_DUNGEON: - vd = os.path.join(VDUNGEON_DIR, fname) - if os.path.exists(vd): - try: - img = Image.open(vd).convert("RGBA") - CURRENT_TILE_LOG.append((id, "VDUNGEON", reason)) - return img - except Exception: - pass - vp = os.path.join(VPALACE_DIR, fname) - try: - img = Image.open(vp).convert("RGBA") - CURRENT_TILE_LOG.append((id, "VPALACE", reason)) - return img - except FileNotFoundError: - CURRENT_TILE_LOG.append((id, "MISSING", reason)) - return None - - -def blit(canvas, img, x, y): - """Composite img onto canvas at (x,y) using its alpha as mask (draw_main style).""" - if img is None: - return - w, h = img.size - if x + w <= 0 or y + h <= 0 or x >= canvas.width or y >= canvas.height: - return - canvas.alpha_composite(img, (x, y)) - - -def blit_black(canvas, img, x, y): - """blitters_9_black (seg008.c:1054): рисует МАСКУ спрайта ЧЁРНЫМ — - непрозрачная область формы заливается чёрным (тень-силуэт), а не - пикселями картинки. Используется для floor-right в draw_tile_floorright - (тень уступа тайла снизу-слева).""" - if img is None: - return - w, h = img.size - if x + w <= 0 or y + h <= 0 or x >= canvas.width or y >= canvas.height: - return - alpha = img.split()[3] - solid = Image.new("RGBA", img.size, (0, 0, 0, 255)) - canvas.alpha_composite(Image.composite(solid, Image.new("RGBA", img.size, (0, 0, 0, 0)), alpha), (x, y)) - - -# ---- Dungeon wall_pattern() (seg008.c:1928) ---- -# PRNG: seg009.c:321 random_seed = random_seed*214013 + 2531011; return (random_seed>>16) % (max+1) -_random_seed = 0 - - -def prandom(maxval): - global _random_seed - _random_seed = (_random_seed * 214013 + 2531011) & 0xFFFFFFFF - return (_random_seed >> 16) % (maxval + 1) - - -# wall sprite ids (chtab_7 / RSET_WALL = 7) res(200+id).png -RES_WALL_FACE_MAIN, RES_WALL_FACE_TOP, RES_WALL_CENTRE_BASE, RES_WALL_CENTRE_MAIN = 1, 2, 3, 4 -RES_WALL_RIGHT_BASE, RES_WALL_RIGHT_MAIN, RES_WALL_SINGLE_BASE, RES_WALL_SINGLE_MAIN = 5, 6, 7, 8 -RES_WALL_LEFT_BASE, RES_WALL_LEFT_MAIN, RES_WALL_DIVIDER1, RES_WALL_DIVIDER2 = 9, 10, 11, 12 -RES_WALL_RNDBLOCK = 13 -RES_WALL_MARK_TL, RES_WALL_MARK_BL, RES_WALL_MARK_TR, RES_WALL_MARK_BR = 14, 15, 16, 17 - -WALL_MODIFIER_SWS, WALL_MODIFIER_SWW, WALL_MODIFIER_WWS, WALL_MODIFIER_WWW = 0, 1, 2, 3 - -# Сплошная грань стены (chtab_7), индекс = wall_modifier (seg008.c:567/687): -WALL_FRAM_BOTTOM = [7, 9, 5, 3] # нижняя часть (draw_tile_bottom) -WALL_FRAM_MAIN = [8, 10, 6, 4] # основная часть (draw_tile_fore) - -LPOS = [58, 41, 37, 20, 16] # draw_left_mark vertical offsets -RPOS = [52, 42, 31, 21] # draw_right_mark vertical offsets - -TBL_LINE = [0, 10, 20] # смещение строки в 30-тайловом массиве комнаты - - -def wall_modifier(room, drawn_row, col): - """Модификатор стены (SWS/SWW/WWS/WWW = 0..3) по соседям слева/справа. - seg008.c:1255-1305 (без USE_FAKE_TILES): сосед считается стеной, если - его тип == wall(20). На кромке комнаты без линка сосед по умолчанию - считается стеной (wall_to_left/right = 1).""" - left_code = room.tile(drawn_row, col - 1)[0] if col > 0 else 20 - right_code = room.tile(drawn_row, col + 1)[0] if col < 9 else 20 - wall_left = (left_code == 20) - wall_right = (right_code == 20) - if wall_left and wall_right: - return WALL_MODIFIER_WWW # 3 - if wall_left: - return WALL_MODIFIER_WWS # 2 - if wall_right: - return WALL_MODIFIER_SWW # 1 - return WALL_MODIFIER_SWS # 0 - - -def _wall_add(canvas, which_table, id, xh, xl, ybottom, reason): - """Emulate ptr_add_table(RSET_WALL, id, xh, xl, ybottom, blit, 0). - which_table 0 -> backtable (blit transparent), 1 -> foretable. - RSET_WALL id -> res(200+id).png, cascade VDUNGEON->VPALACE.""" - img = load_sprite(id, CHTAB_WALL, reason=reason) - if img is None: - return - y = ybottom - img.height + 1 - x = xh * 8 + xl - blit(canvas, img, x, y) - - -def draw_left_mark(canvas, decal_variant, arg2, arg1, drawn_row, col): - image_id = RES_WALL_MARK_TL - if decal_variant % 2: - image_id = RES_WALL_MARK_BL - lv2 = 0 - if decal_variant > 3: - lv2 = arg1 + 6 - elif decal_variant > 1: - lv2 = arg2 + 6 - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - _wall_add(canvas, 1, image_id, xh + (1 if decal_variant in (2, 3) else 0), - lv2, draw_bottom_y - LPOS[decal_variant], - reason=f"wall left-mark var{decal_variant}") - - -def draw_right_mark(canvas, decal_variant, arg1, drawn_row, col): - image_id = RES_WALL_MARK_TR - if decal_variant % 2: - image_id = RES_WALL_MARK_BR - a = 24 if decal_variant < 2 else arg1 - 3 - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - _wall_add(canvas, 1, image_id, xh + (1 if decal_variant > 1 else 0), - a, draw_bottom_y - RPOS[decal_variant], - reason=f"wall right-mark var{decal_variant}") - - -def wall_pattern(canvas, room, drawn_row, col, which_part, which_table): - """Replay seg008.c wall_pattern() for a dungeon wall tile. - which_part: 0 = bottom part (draw_tile_bottom), 1 = fore part (draw_tile_fore). - which_table: 0 = backtable, 1 = foretable.""" - global _random_seed - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - - saved_seed = _random_seed - # seg008.c:1941 — зерно зависит от НОМЕРА КОМНАТЫ (не строки!): - # random_seed = drawn_room + tbl_line[drawn_row] + drawn_col - room_num = getattr(room, "room_num", 1) - _random_seed = room_num + TBL_LINE[drawn_row] + col - prandom(1) # discard - is_dungeon = IS_DUNGEON - - middle_divider = prandom(1) - middle_divider_offset = prandom(4) - bottom_divider = prandom(1) - bottom_divider_offset = prandom(4) - - # Модификатор стены (какие соседи — стены) — тот же, что для сплошной грани. - bg = wall_modifier(room, drawn_row, col) - - if bg == WALL_MODIFIER_WWW: - if which_part != 0: - if prandom(4) == 0: - _wall_add(canvas, which_table, RES_WALL_RNDBLOCK, xh, 0, - draw_bottom_y - 42, reason="wall rndblock") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + bottom_divider, xh, - bottom_divider_offset, draw_bottom_y, reason="wall bottom-divider") - if which_part != 0 and is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(3), middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(4), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_SWS: - if is_dungeon and which_part != 0: - if prandom(6) == 0: - draw_left_mark(canvas, prandom(1), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_SWW: - if which_part != 0: - if prandom(4) == 0: - _wall_add(canvas, which_table, RES_WALL_RNDBLOCK, xh, 0, - draw_bottom_y - 42, reason="wall rndblock") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - if is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(3), middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(3), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_WWS: - if which_part != 0: - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + bottom_divider, xh, - bottom_divider_offset, draw_bottom_y, reason="wall bottom-divider") - if which_part != 0 and is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(1) + 2, middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(4), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - - _random_seed = saved_seed - - -# Per-tile sprite log: draw_tile resets CURRENT_TILE_LOG, load_sprite appends to it. -CURRENT_TILE_LOG = [] -TILE_LOGS = {} # (row, col) -> list of (id, source, reason) - -# seg008.c:1108 — вертикальные слайсы решётки ворот (portcullis). -DOOR_FRAM_SLICE = [67, 59, 58, 57, 56, 55, 54, 53, 52] -# seg008.c:517 — правый край шипов по кадру get_spike_frame. -SPIKES_FRAM_RIGHT = [0, 134, 135, 136, 137, 138, 137, 135, 134, 0] -# seg008.c:450 — «blueline»-декали на ЗАДНЕЙ стене (силуэты кладки/окна), -# рисуются правым соседом по МОДИФИКАТОРУ соседа слева: -# tile_left == empty -> blueline_fram1[mod] (окно/решётка-фрагменты 124..126) -# на высоте blueline_fram_y[mod] + main_y; -# tile_left == floor -> blueline_fram3[mod] (кирпичные силуэты 44/45) -# на main_y - 20 (если mod != !!level_type). -BLUELINE_FRAM1 = [0, 124, 125, 126] -BLUELINE_FRAM_Y = [0, -20, -20, 0] -BLUELINE_FRAM3 = [44, 44, 45, 45] - - -def draw_gate_back(canvas, modifier_left, draw_xh, draw_bottom_y, draw_main_y): - """seg008.c:1110 draw_gate_back — портикулис (решётка) ворот. Рисуется - на тайле СПРАВА от ворот (draw_tile_anim_right, tile_left==gate). У нас - это col 0 room1, где сосед слева — ворота из room 5. modifier_left — - модификатор тайла-ворот (степень поднятия решётки).""" - x = draw_xh * 8 - gate_top_y = draw_bottom_y - 62 - gate_openness = (min(modifier_left, 188) >> 2) + 1 - gate_bottom_y = draw_main_y - gate_openness - if gate_bottom_y + 12 < draw_main_y: - img = load_sprite(50, reason="gate bottom+B") # gate поднята высоко - if img: - blit(canvas, img, x, gate_bottom_y - img.height + 1) - else: - # id 47 (правая грань ворот) уже рисует draw_tile_right — не дублируем. - img = load_sprite(51, reason="gate bottom") - if img: - blit(canvas, img, x, (gate_bottom_y - 2) - img.height + 1) - # Стек 8px-слайсов решётки снизу вверх. - ybottom = gate_bottom_y - 12 - if ybottom < 192: - while ybottom >= 0 and ybottom > 7 and (ybottom - 7) > gate_top_y: - img = load_sprite(52, reason="gate slice 8px") - if img: - blit(canvas, img, x, ybottom - img.height + 1) - ybottom -= 8 - gate_frame = ybottom - gate_top_y + 1 - if 0 < gate_frame < 9: - img = load_sprite(DOOR_FRAM_SLICE[gate_frame], reason="gate top slice") - if img: - blit(canvas, img, x, ybottom - img.height + 1) - - -def draw_tile(canvas, room, drawn_row, col, left_edge_code=20): - global CURRENT_TILE_LOG - CURRENT_TILE_LOG = [] - code, fg_byte, modbit, bg_mod = room.tile(drawn_row, col) - # tile_left: колонка слева. col-1 == -1 -> Room.tile берёт из левой - # комнаты (или уровневая кромка = стена), см. Room.tile / load_leftroom. - left_code, _, _, left_mod = room.tile(drawn_row, col - 1) - draw_xh = COL_XH[col] - x = draw_xh * 8 - draw_bottom_y = 63 * drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - - # For topright/floorright we need the tile below-left. - # Room below = same room (no room links) -> row_below = drawn_row+1 if <3 else treat as empty/floor top edge. - row_below = drawn_row + 1 - if row_below > 2: - # below the bottom row of the level: floor top edge - rbl_code, rbl_mod = 1, 0 - else: - rbl_code, _, _, rbl_mod = room.tile(row_below, col - 1) - row_below_left_code = rbl_code - - t = TILE_TABLE[code] - lt = TILE_TABLE[left_code] - - # ---- draw_tile_floorright (seg008.c:392) ---- - # Рисуется ТОЛЬКО когда can_see_bottomleft(): текущий тайл — - # empty/bigpillar_top/doortop/lattice_down. Иначе topright соседа - # снизу-слева перекрыт и рисовать его нельзя (иначе «арки» повсюду — - # это была главная причина замусоренного рендера). - if code in (0, 9, 12, 26): # can_see_bottomleft - _draw_topright(canvas, row_below_left_code, rbl_mod, x, draw_bottom_y, - reason=f"topright(below-left tile {row_below_left_code:02X})") - if lt[4]: # tile_table[tile_left].floor_right - # blitters_9_black: ЧЁРНЫЙ силуэт (тень уступа), не светлый спрайт. - img = load_sprite(42, reason=f"floor-right shadow(left tile {left_code:02X})") - blit_black(canvas, img, x, draw_main_y + TILE_TABLE[1][5] - (img.height if img else 0) + 1) - - # ---- draw_tile_anim_topright ---- (gate top mask) - skipped: no anim - # ---- draw_tile_right (seg008.c:456) ---- - if code != 20: # у самой стены правый край не рисуется - level_type = 0 if IS_DUNGEON else 1 - if left_code == 20: - # сосед слева — стена: её правая грань в текущую колонку (chtab_7 id 1) - img = load_sprite(1, CHTAB_WALL, reason="wall right-face(left tile 14)") - ry = TILE_TABLE[20][5] # right_y стены = 2 - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - elif left_code == 0: - # сосед слева — empty: фрагмент окна/решётки по его модификатору - if left_mod <= 3: - bid = BLUELINE_FRAM1[left_mod] - if bid: - img = load_sprite(bid, reason=f"blueline-window(left empty mod{left_mod})") - blit(canvas, img, x, - BLUELINE_FRAM_Y[left_mod] + draw_main_y - (img.height if img else 0) + 1) - elif left_code == 1: - # сосед слева — floor: правый треугольник (42) + СИЛУЭТ КЛАДКИ (44/45) - # на задней стене, если модификатор пола != !!level_type. - img = load_sprite(42, reason="floor-right(part of left tile 01)") - ry = TILE_TABLE[1][5] # right_y пола = 2 - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - num = left_mod if left_mod <= 3 else 0 - if num != level_type: - bid = BLUELINE_FRAM3[num] - img = load_sprite(bid, reason=f"brick-silhouette(left floor mod{num})") - blit(canvas, img, x, draw_main_y - 20 - (img.height if img else 0) + 1) - else: - rid = lt[3] # tile_left.right_id - if rid: - ry = lt[5] - img = load_sprite(rid, reason=f"right(part of left tile {left_code:02X})") - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - # stripe: only drawn when tbl_level_type != 0 (palace). Dungeon: skip. - sid = lt[6] - if sid and not IS_DUNGEON: - img = load_sprite(sid, reason=f"stripe(left tile {left_code:02X})") - blit(canvas, img, x, draw_main_y - 27 - (img.height if img else 0) + 1) - - # ---- draw_tile_anim_right (seg008.c:530) ---- - # «Анимированные» части соседа слева, проецируемые в текущий тайл. - # Статикой (кадр покоя) рисуем те, что формируют ГЕОМЕТРИЮ фона: - # gate -> решётка (portcullis) на границе с левой комнатой; - # loose -> правый треугольный край шаткой плиты (иначе провал в полу); - # spike -> статичный кадр шипов по модификатору. - # torch-flame/chomper — чистая анимация, пропускаем (отдельные sprite_t). - if left_code == 4: # tiles_4_gate - draw_gate_back(canvas, left_mod, draw_xh, draw_bottom_y, draw_main_y) - elif left_code == 11: # tiles_11_loose — правый край плиты (loose_fram_right[0]=42) - img = load_sprite(42, reason="loose right (part of left tile 0B)") - if img: - blit(canvas, img, x, (draw_bottom_y - 1) - img.height + 1) - elif left_code == 2: # tiles_2_spike — статичный кадр (spikes_fram_right) - sf = 5 if (left_mod & 0x80) else left_mod - sid = SPIKES_FRAM_RIGHT[sf] if 0 <= sf < len(SPIKES_FRAM_RIGHT) else 0 - if sid: - img = load_sprite(sid, reason="spike right (part of left tile 02)") - if img: - blit(canvas, img, x, (draw_main_y - 7) - img.height + 1) - - # ---- draw_tile_bottom (seg008.c:570) ---- - if code == 20: - # Сплошная НИЖНЯЯ грань стены (chtab_7 wall_fram_bottom) + декали. - wmod = wall_modifier(room, drawn_row, col) - img = load_sprite(WALL_FRAM_BOTTOM[wmod], CHTAB_WALL, reason="wall bottom-face") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - wall_pattern(canvas, room, drawn_row, col, 0, 0) - else: - bid = t[8] - img = load_sprite(bid, reason=f"bottom({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - # ---- draw_loose (seg008.c:600) — статический кадр loose floor ---- - # Нижняя часть шаткой плиты (loose_fram_bottom[0]=43) на draw_bottom_y. - if code == 11: # 0x0B loose floor - img = load_sprite(43, reason="loose bottom (draw_loose)") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - # ---- draw_tile_base (seg008.c:611) ---- - base_id = t[0] - base_y = t[2] - ybottom = draw_main_y - if left_code == 0x1A and code == 0x0C: - # seg008:622 «Lattice + door A»: у doortop своей базы нет (base_id 0), - # и рядом с аркой (lattice_down слева) он рисуется ОДНИМ спрайтом 6, - # опущенным на 3 px. Без этой ветки на месте тайла чёрная дыра. - base_id = 6 - ybottom += 3 - elif code == 11: # loose floor: базовая (верхняя) часть = loose_fram_left[0] = 41 - base_id = 41 - img = load_sprite(base_id, reason=f"base({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, x, base_y + ybottom - img.height + 1) - - # ---- draw_tile_anim ---- (spike/potion/chomper animated) skipped - - # ---- draw_tile_fore (seg008.c:690) ---- - if code == 20: - # Основная (средняя) грань стены (chtab_7 wall_fram_main) + декали/марки. - wmod = wall_modifier(room, drawn_row, col) - img = load_sprite(WALL_FRAM_MAIN[wmod], CHTAB_WALL, reason="wall main-face") - if img: - blit(canvas, img, x, draw_main_y - img.height + 1) - wall_pattern(canvas, room, drawn_row, col, 1, 1) - fid = t[9] - if fid: - # fore_x — в единицах xh (×8 пикс!), не в пикселях: seg008.c:743 - # xh = fore_x + draw_xh, затем x = xh*8. fore_y — в пикселях. - fx = t[10] * 8 + x - fy = t[11] + draw_main_y - img = load_sprite(fid, reason=f"fore({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, fx, fy - img.height + 1) - - # Save per-tile log (keyed by logical room position: row=drawn_row, col) - TILE_LOGS[(drawn_row, col)] = list(CURRENT_TILE_LOG) - - -def _draw_topright(canvas, tiletype, modifier, x, draw_bottom_y, reason=""): - if tiletype in (7, 12): # doortop_with_floor / doortop -> palace uses frame - return - elif tiletype == 20: # wall - img = load_sprite(2, CHTAB_WALL, reason=reason) - else: - tid = TILE_TABLE[tiletype][7] - if tid == 0: - return - img = load_sprite(tid, reason=reason) - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - -def render_room(room_num): - with open(os.path.join(LEVEL_DIR, f"res{2000 + room_num}.bin"), "rb") as f: - data = f.read() - level = Level(data) - room = Room(level, room_num) - # load_leftroom(): левая комната по линку L — её col 9 виден на границе - # (col 0) текущей комнаты (напр. решётка ворот из соседней комнаты). - left_link = level.links[room_num][0] - if left_link: - room.left_room = Room(level, left_link) - - canvas = Image.new("RGBA", (320, 192), (0, 0, 0, 0)) - # rows drawn 2,1,0 (bottom first) - for drawn_row in (2, 1, 0): - for col in range(10): - draw_tile(canvas, room, drawn_row, col) - - return canvas, room, level - - -def render_single_tile(code, modifier=0, left_code=20, below_left_code=1): - """Render one tile in isolation on a 40x64 canvas (matching SDLPoP tile box).""" - TILE_W, TILE_H = 40, 64 - canvas = Image.new("RGBA", (TILE_W, TILE_H), (0, 0, 0, 0)) - # Place tile as if it were at drawn_row=2 (bottom), col=0 - drawn_row = 2 - col = 0 - # Build a fake Room backed by single values - class FakeRoom: - def tile(self, r, c): - if c < 0: - return left_code, 0, 0, 0 - if r < 0: - return 1, 0, 0, 0 - if r == drawn_row and c == 0: - return code, 0, 0, modifier - return below_left_code, 0, 0, 0 - room = FakeRoom() - draw_tile(canvas, room, drawn_row, col, left_edge_code=left_code) - return canvas - - -def main(): - import sys - room_num = 1 - if len(sys.argv) > 1: - room_num = int(sys.argv[1]) - - canvas, room, level = render_room(room_num) - out = f"./room{room_num}_render.png" - # Прозрачный фон (задняя чёрная стена, которую мы не рисуем) -> ЧЁРНЫМ, - # а не белым как показывает вьюер прозрачность. Композитим по альфе. - flat = Image.new("RGB", canvas.size, (0, 0, 0)) - flat.paste(canvas, (0, 0), canvas) - flat.save(out) - print(f"Saved {out} ({canvas.width}x{canvas.height})") - - # debug grid with code labels (на чёрном фоне) - from PIL import ImageDraw - dbg = flat.copy() - d = ImageDraw.Draw(dbg) - for r in range(3): - by = 63 * r + 65 - for c in range(10): - x = COL_XH[c] * 8 - d.rectangle([x, by - 63, x + 31, by], outline=(255, 0, 0), width=1) - code, _, _, _ = room.tile(r, c) - d.text((x + 2, by - 60), f"{code:02X}", fill=(255, 255, 0)) - dbg.save(f"./room{room_num}_debug.png") - print(f"Saved room{room_num}_debug.png") - - # Per-tile individual renders (the 30 tiles of the room) - # For proper neighbour context, render each tile inside its real room, - # then crop its 32x64 (40x64) column box. - tiles_dir = f"./tiles_room{room_num}" - os.makedirs(tiles_dir, exist_ok=True) - for r in range(3): - by = 63 * r + 65 - for c in range(10): - x = COL_XH[c] * 8 - code, _, _, _ = room.tile(r, c) - # crop the column box (40 wide to include left overlap, 64 tall above bottom) - box = (x, by - 64, x + 40, by) - tile_img = canvas.crop(box) - tile_img.save(os.path.join(tiles_dir, f"r{r}c{c}_{code:02X}.png")) - print(f"Saved 30 tile crops to {tiles_dir}/") - # Per-tile report: which images each tile pulls and why. - print() - print("=" * 78) - print(f"PER-TILE SPRITE REPORT (room {room_num}, {'DUNGEON' if IS_DUNGEON else 'PALACE'})") - print("=" * 78) - for r in range(3): - for c in range(10): - code, fg_byte, mbit, bb = room.tile(r, c) - name = TILE_NAMES.get(code, f"?0x{code:02X}") - btd = level.backtable_desc(code, bb) - line = (f"\n[{r},{c}] code=0x{code:02X} ({name}) " - f"fg=0x{fg_byte:02X} mbit={mbit} backtable=0x{bb:02X} ({btd})") - # If this tile is an event activator (group 'event'), show the door it drives. - if code in (0x06, 0x0F): - scr, loc, trig = level.door_for_event(bb) - line += f"\n -> DOOR EVENT id={bb}: screen={scr} loc={loc} trigger_next={trig}" - print(line) - logs = TILE_LOGS.get((r, c), []) - if not logs: - print(" (no sprites drawn)") - for sid, source, reason in logs: - print(f" res{200+sid:03d}.png <- {source:8s} {reason}") - print() - print("=" * 78) - - # Level-level summary: start position, links, door events, guards. - print() - print("LEVEL STRUCTURE SUMMARY") - print("-" * 78) - print(f"start position: room={level.start[0]} loc={level.start[1]} dir={level.start[2]}") - links = level.links.get(room_num, (0, 0, 0, 0)) - print(f"room {room_num} links: L={links[0]} R={links[1]} Up={links[2]} Dn={links[3]}") - # guard in this room - gi = room_num - 1 - gloc = level.guard_loc[gi] - if gloc < 30: - gr, gc = gloc // 10, gloc % 10 - print(f"guard: loc=tile(r{gr},c{gc}) dir={level.guard_dir[gi]} " - f"skill={level.guard_skill[gi]} colour={level.guard_colour[gi]}") - else: - print("guard: none") - # door events driven by any tile in this room - print("door events referenced by this room's tiles:") - seen = set() - for off in range(30): - fb, code, mbit = room.fg[off] - bb = room.bg[off] - if code in (0x06, 0x0F): - if bb not in seen: - seen.add(bb) - scr, loc, trig = level.door_for_event(bb) - print(f" event id={bb} (tile off {off}): screen={scr} loc={loc} trigger_next={trig}") - if not seen: - print(" (none)") - - print() - print("Room", room_num, "foreground codes (3 rows x 10 cols):") - for r in range(3): - print(" ", " ".join(f"{room.tile(r,c)[0]:02X}" for c in range(10))) - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/toolchain/room12_debug.png b/applications/PoP/toolchain/room12_debug.png deleted file mode 100644 index 71a96af8fc654fcc624bc9e33a1e6e15e42b088f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8160 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 diff --git a/applications/PoP/toolchain/room12_render.png b/applications/PoP/toolchain/room12_render.png deleted file mode 100644 index 6761022dd3481690b4eeb30fbdeb7ba10bdbf43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5514 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 diff --git a/applications/PoP/toolchain/room1_debug.png b/applications/PoP/toolchain/room1_debug.png deleted file mode 100644 index 9c30c669259c0394053a7fe09c5433f4832d76e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9291 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 P*YlK}lWnavD&_wGESsa2 diff --git a/applications/PoP/toolchain/tiles_room1/r0c0_00.png b/applications/PoP/toolchain/tiles_room1/r0c0_00.png deleted file mode 100644 index 3f83ec2bc7fb1632bdf0043b4da90db2d8fa8cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A+h7#N>&EPWFN7Ku2m=vMJe=sClA`st>Y>l$5I-@6xStp4e< zzCS$r+rM1_@AqGi{9hv}iww_6QsEJfO#^h!P!cVzu_|8sI)+U0##=eV!T z-Kla!AjB!W^t;mP&HEmP6^4G9WAInmK_q6gwt?Bvts6IGAK%OQCVAm9oat%*Sd-R@T>Z81%`%xIPL>_5MFQMU6~sP%^l&|u#fz?Za;uta_2 zo~dPt7GbOpj1B9L_qlJf`C%=yn^AfH>^VM0uI3xPH%CPr zj@&q9$A@RTEI7WVrtbRwz5h^Y`mB~6yPnUQZPk+KciX?LaC&TJm*4lBojYvKU)>SK zx64Dih1GFE+w~a-BW8x*y|n1ihq&BHCzJon)`(~<&B;xbPL$FWY8H}cOMJX!-JzO8 zwGo-jv7c3E{N8ZME&8>yiu|cl7t-1DfA+*S?Jhd=EbP&Y%#C*qWw&jACa)tqoi8X| RTL~EP44$rjF6*2UngH!f^eg}X diff --git a/applications/PoP/toolchain/tiles_room1/r0c1_00.png b/applications/PoP/toolchain/tiles_room1/r0c1_00.png deleted file mode 100644 index 6925c1b1995dc623cd305c2ac9f5a485190b7fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!l!B*=V@SoEw+9&+fxIS#|LgNS d96(G6$Y;}VU|^gk*R~DB_jL7hS?83{1OUi{5wQRO diff --git a/applications/PoP/toolchain/tiles_room1/r0c2_00.png b/applications/PoP/toolchain/tiles_room1/r0c2_00.png deleted file mode 100644 index ab917a91e70d2796d47d2509c5d1119f95a59d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!l&7bQV@SoEx92wUHYf-%95{Yc zqFGT#wn6YlcyiK8-qxQJc5~`60TqHlg67t@>77e9R!mv5G34McA#Y)uUq8;=-S%Ir ZSa1CVu1kA*TJL}qdb;|#taD0e0ssFSZ?9|=Y*7$!2>h0{ zUQGV#IwmLrn;HaK$twZTA%M^w(D%sabyuCOPr zYpfDVOH({nvF0rE)(^b diff --git a/applications/PoP/toolchain/tiles_room1/r0c4_01.png b/applications/PoP/toolchain/tiles_room1/r0c4_01.png deleted file mode 100644 index 53030d3790a5072fe797d45d37d32f9e139f703b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmVBS@Dx20ssI2 z007XU4A_Gqk`r8fTE%gssB{_{2x_h{$r8eB4 znT2awYPUP$zi!Y2`K&g$`|egO;Yy>NrQ pa=Jeq57NtYf5><_SD#70s9#$QE_aE>&{_Zh002ovPDHLkV1ndLVq^dS diff --git a/applications/PoP/toolchain/tiles_room1/r0c5_01.png b/applications/PoP/toolchain/tiles_room1/r0c5_01.png deleted file mode 100644 index 50f344a31fc452aa04647171d05ec4ab60ef884d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+}7P)3I9PUmBxND!&Ctx zA|fL4N{92Kc80d;3OgupPS8U@eV1~2PF~mPNY~%a)oFnseU!K+L5l&^OH-rO9ds8^ zGxNjmH1n?$S& zV~plCbJm&zh7ina=B(|v#7zf`hW^Y3T=EMo{h52dSQ~yxA@lszdN3NRR5W1xn0wYL zNy!}uhPh`BSgTLBhy4zBS@Dx20ssI2 z007XU4A_Gqk`r8fTE%gssB{_{2x_h{$r8eB4 znT2awYPUP$zi!Y2`K&g$`|egO;Yy>NrQ pa=Jeq57NtYf5><_SD#70s9#$QE_aE>&{_Zh002ovPDHLkV1ndLVq^dS diff --git a/applications/PoP/toolchain/tiles_room1/r0c7_01.png b/applications/PoP/toolchain/tiles_room1/r0c7_01.png deleted file mode 100644 index ebed99f8794ff98800756448ea8648c3282f5d3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMv3P)Zq}6oy|c4#40c1EYrw9X#|1j6Fbx9-@cp(4hzD&?98X*uf(Mg9i`Ysfa+L6oYuS z@eB1QAww*aU(YW;&o}@HHx3Y)LOwOdnA>@t=YRS$h>S4?geZU?kCXk;1&U7G<4H{R zGl&eI5l2Fx4OP{21*)nBQ5@+C6rDJ-0*54lt|Wo3>|3BL&kax(c>R1kgm`+8ji4A9 zG|3!Pz9Z=E|&i2 z0$Y@-ZpVHWO%jnySkj^?G;GP=Fg_<2K3~IX&+?s{Y-5Lebj|`f=jbuEvFR1CE1N}7Bl6P*^L;~Xe$EQ?c|+f9mV+8OOF;$d zf$w2wiG_>+U+_Jz0=LRj)p=pxW^<)ZXkOnx;PmkO`}^%MGJi{%S~Lv}`v<#b$XEaJ RjZOdn002ovPDHLkV1jh-&RYNg diff --git a/applications/PoP/toolchain/tiles_room1/r0c8_14.png b/applications/PoP/toolchain/tiles_room1/r0c8_14.png deleted file mode 100644 index dab7a5d70348243ba9c20436cf6f06413c4ad2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmV-Z0<8UsP)Huk$vB+G%^pnt7`-v&ck7{+f%T-%3!jihSZ|bqX#mHHY3ImI8us z5QKvu90cJY2nXRe3F-yk8mkDd8K8CG#rySGdQdyB&N1A2bX=fwZ7Sz^;r8+Nt3DH$CAlcP|`%hP+w_V zqN=Kv5KZZ+K5geFV?jw%-Tk$sD|9@mhrAWbvPaftBwb?jo+Kn`qH>Zf%kG;wb$W@U zmk_gpF$cL4X>)<@lNclA26OY9wo!sz68S_a|Lx-c?hVvjsFA>J12qT-K{yD)K@bjt za1expARGkYAXh^=GL>KxRFU}(>kzAmd`JF0SOz3bR6ZrqS(2cniG-#kI)84ZX$ba} zrXjkLGuD-+G2G;gpw44kY0?1;L*(I)Bx|7Vi-kkdBI2ML2;eQjExxkq&>o!fp^@u7 zjef-~&;uPK;v>2Wy$2<&a*BG2hjR)KrG{WbgofK~B?;K! zq^_TEj?=F)U|@{Cb3SoOxMvQ6z?cwmMy#E6@ooEIwx{V5bi81N)S5XyMgfvLs9n@f z0%#~)F+i=9xn2}dYx^nd160HOUtATS8b&7ju3kXdcgDfkd06Zg%bFdmehy}JF!f5Q z#C=y<11x`48f?fVfcdi>+DY5d)Omyvhdxa=l_hjIscUZ-(yW5St+N=}ftArTj5FQ(cT!K&)0k ztlke$Wv-do0i|b&tHwcjFYGy*4iX1_!HWdY4LT)*mIyhK8+1wrEur6C#0I34pp~Lo zXmZ05i26;`5EGj0aOA>KWsrT$pTrGEr32DaKx|=Efe)Bc&cm^FN;yx#d}F1Y2j!r$ zRt>6HU>r<=lm)Viad63CL^=nl^?nU&Zmob=t$@`7Dr7F<)KJoS7#a&o0w|sJ8S}Pk h2B^akXo-OINdLJ5AFZ2S=Bxk!002ovPDHLkV1mSd3Eltz diff --git a/applications/PoP/toolchain/tiles_room1/r1c0_13.png b/applications/PoP/toolchain/tiles_room1/r1c0_13.png deleted file mode 100644 index 097334b1d58826d6f722c3851e4c484dc6128ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)`s?{#%`_k1+QnEih5E~f8$Ho0@P3GpM5kx$kUak_k*ZTV5C=M7xQ6qs9Fjt{`mEy?e2IL}$<3A9q=}ret zz*wcAfcf`3qX<|FCM6PJxDP`c*7v=BsY~U-5XNu*5Uz!+%YzOw%!f-63xOzRR!TMn z7u#b^0da(@+59m1n}#>EoKuMbkd|?cHcb>kFjg(iaPk;7=<2dfQ%Vr|oTP`$HccsE z1VpmanOHmpbZ=LHU4?EdO6OR2>Hbh{;?PFa?2$$-@@F zv^16RO_xxF!3g2X?x zmb#9k~)>8viBRk&2KV#d;c`s gm#5?yF~h2*ABcvX@1?GELjV8(07*qoM6N<$f;8ej{r~^~ diff --git a/applications/PoP/toolchain/tiles_room1/r1c1_13.png b/applications/PoP/toolchain/tiles_room1/r1c1_13.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room1/r1c2_01.png b/applications/PoP/toolchain/tiles_room1/r1c2_01.png deleted file mode 100644 index a6cf25620850b7a7104beb64616797876a156a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmV+h0r~!kP)Py5XSN2!U%5!3rh+|pl|>S3x=>{07q~HO9yZW2e5F2+d(@+p)cVAzLWfa9f5-{ z+~o+B6xJV4&)oT13cKAOr6T|U0000GO4IJ&Kl3WVsRXAIsHM%IwV#dwV5yof`;I*b z06=+F+Z{rGkX3?HZ=spFYsS>N1E!SRHDhX*+v2|tXpZ^J2AuMSp83o@U%dlArIdO8 z&t}k^U79tZ4fdY5OFHKpNRGYd4p?eV>&<#4rJOHU>2}-fHQ^Wa3!?Zli&K!O?f?J) M07*qoM6N<$f+N*!QUCw| diff --git a/applications/PoP/toolchain/tiles_room1/r1c3_03.png b/applications/PoP/toolchain/tiles_room1/r1c3_03.png deleted file mode 100644 index 9e269c00c62ae6aa0fc2ce83d08aa0017776391f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmV+*1K<3KP)~>nrsV-6f zBK3gw<}J(NROQjyZ+}PdJo6Jt5k&?IO_cz2a|wUdLMU(qO1;LIMveoh*HktU^7=ARK#g0Yah(9 za$se3aO~u4YM2Lg#NAx;U^3jw;jY&Ea`7O9jGcpi(V6C-IGF7k2iX#30D*E6L66`}04UljuyVN>gGj9+Qulz-q#F z&^D>twD>!~aUGPhc?M~p$8j*Z^)Y61Y4c<2y>7QYIFOTs{MF|qRc3W5O`elz<^U>^ zlf)ntV+tzP2V)SL;o#_b5G!=u2d5BxEaYc9=*~~BLf0wI%1Fpx{U~mx%1NlYBqzC| zhWn{OpohQXoCH1)VY^Xz*0mT03OAzGft+N_TAXZRs4O-j|BIXitGb+|=t^>FPGUUW zqpEpOqNuvccu=CjQk8=jkK)_A59g^)o7&-McmMDm!-!DHc905Z5_2bl6QOc+6Q`Cw z8Hr|G$e|RWa#XNz>7imvJjK6$sm1~3I#i5-Sxpjd8MOUI0ek#EQy$O|;4qk#l=2Y} zNa0J#l|*_VLtw6Yz*2Bl7>)vF#oB&zOOA{=^&bG^!0mo%dLOjgZ=4ZqhRNCo73)?2 zX2m)up}=)J9R;)U!MR{$KnOlJgech+rx`5HJY-GsHds0000D%45Qg2!upq#oAfUjYV4$F2pm1QIaIg=6bB2lfDi1p@;C0RsgA1_tGw z9L1HDp6w(~a*^g=N-t89=F@-9B^PJ*{PKDxNP2t!B>Tq)=RWk1Vi{|3@l#3 zZB`uIe&cg+Xh7zGD*>?`v?)Ip({RuR$J51h9pn{UYX{X8r%S?EqD>ssP#7tvUIz^) zHSn0ARG-WhHJGmSr?KcrH3rp+D=IMPHZ+F3S1}ft)+FnosY%tryt;c#)1&#>9pt{I3EM&D zYnrgHVxQ0*^eOfvp^808sA5kNs#pg@6&(y!bTCxW!QiF|`-xiknkH-qy-gFggEG!E z{nweM`WPg(n5=h~o%N&t{r;&Hc=nTbp2DRS46#KM>~6cc`U4>ZVT@V9LZ-n=K=q?w ztZ}&o!L%3v*98oMD*;m@g>|iN?SmIm27t9mE%XYQHU(>&O4*@*1|4*PX($_9<^b!` z0a_ijrBXxH;hKOkHZSk9>Z6H}k1%MPan=+}OGAbT9D|`?eTohNCd8>XU^;|jtV(Sk zkaVb2vOXQe9Amaxs3WbzK?Qa!IATnPT|P@O!PH{D$r|Iu5!5u91^W;Frx4cxm_T0u O0000(`5HJuZPe*o?%8D&p z*0)nX;wbV+&%5?&-|p(=_3Z?S@c!`$&yV-UdvJB2kP_9%{;SRI;lw#_21QXo3UI^z zSWFVKfpWc$Lgw&AJA}se$8vJNCDGhjoGqo2TbKRbL$Sz7Y;Osa<;`VmA}4@`Cg_oM zu0F6o8^Y#w>Ln;hkxjdZy!yi4(p$X*eUoy*po?<>g3N&+b0EkZ2r>tP%z@x95u_eZ zjUWU=2536-;iFiPDo3ZY1w)V|4(nchB%$0)=3203Y*ZKcM$OnIs}{dm-Tv+auIq0A zU{FOQNa^vCSI!tUosz2fFAZI~7N}WImouxc*o1|k zD;9$Pk08~uj?@iCr2nB-H`Vb_nHB@MB5QZ=JG=PDDL7+fDK|zNoC@kzC9iSt0gu)KcAu>RLV1R&uKzaJ)SgEbZvYfN! zdoTTvVmZFwXXSK%ym@_lKf+3Ue15^p^JDZJvHw=ECi{{2o9+G6(HPTwD2f8sz(nE; zJ1ONB%BspDrq&wj`llx@7GJo@s?3=^-H7apd)Ud~nV4H#RTjN$#l%?V%t2rd0&@_UgTNdF<{&Ub9W-x&a$EJpvJ==9XT`D=DBDb;?QnH{YPoZuYtwYq zuFbdOm@g5h_Pf6@m!#GjlscR}h>O3EnI>vbv!Lk`ySw3bd(7}ymNs1?<_COEkKs?G zNiaQBCjE-72tQNhg5r7tyA|Ax{i;3%75Q#xZYVy6D!3iHLU}E+y~fa7>{vJc;3KAp zb5L(Ec@0t?HI*cRb7b>c*zU!Se}Po~1yZ>^fokTOIlDj^+2Yt_P_~7Aj;3Rg4Ekfr zPBclNH8-}awxpUKDwEzcbq!Cd>7kNjn$~<1C4AE~^-a*6giP6mY3drI9HwZ@l;M~$ z$|Y{dlr;jWg;fO%&)9h>$Ik*ObxO5`*#(JRYiKU^9a08WXV;+K+5&MKBi@#q&zku;OM znRwzz)_dA$*88N*`^V=QGU4m{2X?y`*wr;0TBhw&bw>_4F${kI&_icv-!!jp=W!gx z&33zm92hP96*V%}h%l$X(Dx#0#7lx){FQ7pt%2C+#I+Y!Rh)?*Q;H)Hml`b>KSJR^ zC>#id1EFvr6b?*9#7~#hQlvnB>VY+NxdK^JmmNVu(Ges(P6YYNna0ABA8j+uA(k!p z(Ulrhktqf9i631vQD?Mv9j$@nLaK06`jYO*MO7`!d>4P^GA*$&^gVEX65pxh_cBdu z$;K%PCd4pdRl8?5nH`geaWX+F$n(-O()+Fw=<7$M*^weuLG7N23CzOk8jio0bw%P- z-0FWS-;Ojei5v#=g5D`nTK+R@joF-LbotJe_u4(1h3MQF-OG;(-MA+HIfBc4=Uc-a zG@?`@-59RlRDNfo4gm`oV@}jQopTlt=+i0XD{hIWs|&?bU?`pfixbEr=S(bV7a>^$ z*_7CQi;mC6v36y4s;A?nd!26_0H9NkBCkDJsQ_hp9N-fQG#wg`U)S%(NGEF*T zl=391)9|D16o`=WB=K002ovPDHLkV1l!>Art@r diff --git a/applications/PoP/toolchain/tiles_room1/r1c8_14.png b/applications/PoP/toolchain/tiles_room1/r1c8_14.png deleted file mode 100644 index f668ced2dbd1fb96bbe71ab506f6076fd7fe98c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmV-b0;>IqP)KfXsfYR!IB&fazrG7zcJshiO2cU%jNmB_!Ps+h8u9XJcWC_FQ zYcQF#GrG4Q#RzGJOR$m~jPy9or{BGL{&p!lG${*=Xv%Nm`!qn)5rK6g@T#sKVmJ60 zr39~P504n|Q6rtD1TQ=aeA-0dH5qi(yO_Es1J}CReDNoP%X$|xhg+Lsx$f(Wzgnnc zBqASha~~`@CgYZqN(^yEZ>o#c+hDBT2H6>u2iHvG^c5jn2E|y|kC=2M$zTY)vKVxM zPnQV1sy#RMflrsf;3jA)wGySZocyVUifzZm5DbxW ztwgmR5E~4}7FN0O1Cy^UbPdMVDY^Ix7P^#6IL|2KSg02eC>h{*=Lz zU?c>IP*bmtbmBV(~HbzebZ76pQgWX0@uacMJ@X jWv zcbGP6eVj8hX2G1uM>kvoz6n=%Em8JnS^jj!RE>xQw|k2+_g&nz`t;G0ewS639Z$K} z`KoM|)7cAOZlv7ll=2DAGM;kBWT~0+N#Ed1<0szg24zX1={(mjl{zvdKhwPGf9Bo8 z;@sFzb5?Myy0~iMX)zwbJuXXh9)z}W#9fw1m2KX+b8m~OX?f$uJFJ_;S18qTJ{40{ vmv?qH7#KWV{an^LB{Ts5%s%^H diff --git a/applications/PoP/toolchain/tiles_room1/r2c0_14.png b/applications/PoP/toolchain/tiles_room1/r2c0_14.png deleted file mode 100644 index e2909b4069d0230a4bacffcff57c75b584f30fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)3<%C(|u|4@%eRvLVW-H!u#7x@IO^^ASg)_(cjchucyB6&5!MN3nl0S z`juW(s)mQ%E{mD2ZK3P_j45p>re6(<&wG`{U}HX8^J$y&>0?fF8m(nlE2fVi90cJY z2nRtp2*SZ!LUcU07Lf+&*n+Beat*3_C%b|g(G}F(P6cV=woar_KucbM@tyAP*1oyb4ha`GgS{`eoVj85mmG z8H^~P&%OrNAbJf-20=Io!a)!Yf^ZOS-5@b@38prsoQI)vjV3XuoclB9ZPjS7L?H5E ad-(??{YR$bfl@O70000P$fr#J#}nb8XIBQOU7b09DW z0&^fR2j(JDr%P&KDNvmnkX6Z7psY&X5hSpVAmMf*s20w2E!h0%o9Px}rNxh-)L@Ft zDOg?kF*Fl%MoZVx67*b16>d&nQXiGBs{1lO#4o7)rV95`>83~9G@#T;-&4sS;@74r zmb6P~y2Rm8&Ne)@IGMSbWsEcfv$WPllPRT zudB`ct=R8}`$3?c?_z4WP>JOl*OhPS-x1CcR!Yh;VvK&-Oj?6m77#e)rJP%wjk~Lh z#a&=5?gH5fR4eC950XxFHNT5nQD4sG0QY< z@kL6wOjB-iTyTO+-jwqZgs1-_m2~cgwL;U_WJT<{7hEuk;O!1iN7izpHFSuihuGvXED$k z;%79-dC4|K5rj-r*Q{xdf)o+5#n0s6Zp(uZti-bxPnFzIdkE<1<-Oa`Za_oM95Z$%sLOYxlK9)KuZa4VSlp0L`(uMkOv@*ikVuYE&nK}DDma9Y zrXDqww{y8=N=I`+r}*8~1tA!6AO24TV*=Q%5kwDLp!+VQbc?`4`snety9apn67o1H~tZr1Mt5Re)NF^7e8#Qd2#Pia!iq(y3nxp&eQ{IC%+zFzmFM*{=@xMgeH&Rgv^4|IE)2-4H g9NP_=8>&hB1(>Nt#wK?xHUIzs07*qoM6N<$f{w8s{r~^~ diff --git a/applications/PoP/toolchain/tiles_room1/r2c3_14.png b/applications/PoP/toolchain/tiles_room1/r2c3_14.png deleted file mode 100644 index 48ec563f6ddaeecb3bfdb2e29726209a49395944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmV;(0yq7MP)0m%YbL?xmk5;5Y55%q9h+YFhI|4H*k z^co7y2_HAf%ex(JUS8jR8X~=ae2%Y&VK{zWtybgr_?qqZl8Vm?#`*2!=WPEa{|&0C zl>ugoA)FBFhId_6FzEZJaZJH&H=?PjT_hxD}HaDuEUIK#QX zCQFP10p_K;;nqdE}%xubF2BxIzk%HXNq=zCCu2jI^?PY#wGD8u{1t&9$yPE6bpYn^D#eET<^81{2 zIjFW*H9+BT+U1}+)h%`AaA|aqI&-)*ad2r-Q`gbKr3&Cc*Uf~$@P^~v`4lf@4+0#H zWk+4V0B{1NTxO2fodGt!$2t8HZ#TkwzmuoBkg7N+J*6zvFwX*%5j8Y4Ms?N~0TdC3 uD>UZ$>B0NHbq}gggwlgi$^Vp#o$D9oP=A7N5G-2&00000 diff --git a/applications/PoP/toolchain/tiles_room1/r2c4_0E.png b/applications/PoP/toolchain/tiles_room1/r2c4_0E.png deleted file mode 100644 index 88b0c988d86597eae3d21e1e3a43eb8e7b93c3bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcmV-S1GD^zP)hoH%b}er^{bw@C#$NBYvTRA4EN*V^ug*DlKA*#z>$=X-F?|MDxv4_DxTl}r z7hL=8-G?iz*KWIcoo)9i7{So@rHexaJdNSp$sL$>Ut=YJRW)R=?vv2I41-G-C|w+S z$W~gGI+QMs2GcBQ85~rS#)2)i#M4RaFm?LSXxghS*xItqENG=>7SwFg|A!B{!r)^q zh_LIbaN>wFD+$Awp4xHtV)c4S|zS*(WDVXeVc7FHTxJgPWM$slO$lyv&5 z1vyAq#|(^u1><+~P^TRj8ZQu4%Kx_us$~rXC^z$_fD!}>7mrH-H)q0H5++9c|n664#wF!VGJwwARXOQyOfVD`$1{Neu z&9uQf<+lQBCI7F2nG{WPsH$k1LsdmnNfs-*s%R>0@Fp3xGZF~T5Su>buMt>SuqNf7 zBlTb0J$$_8AhiyTLO*VHj=vtC-#2gaKVqvw-PFns3NAx%L5S!8Km_+zTLds*F+>a( zL&V?HF}1UR8o2$t-HYSH@i8;bAGnA2`$7BHZ$GloqaUKjCv$GG&HOPU2H@HxU-TL< zSm&qn&|55?qMVgD3x~18x!gZKSU?Uer(@zjIS9@#V_#DNreNtR<5nG~v_Fa9B;S3J z^3$CRrZO2kw;D+~OYC=VRX!P}m>|=e@}W`kft+%H+mU1BZYpPSlP3!s#*d__i_f8c zId|~VAR4f3KRvl|I3FdrcxpK<=+9+S0ZCfF9IM5r&tIy3vUe2<3r5;EgUk}vR{9Mv WDh`TtJ%{K30000-Bp7J4^uLyllqzmxpG)^7wqa`Fx#V#v(K!d^jutiUX>-E8k$I zuy8Pj0g3CgZho%3*H9dsh9;y2&l%!+ii1HwQ*!Bd2cxJCnsB1RugAe1i~*O_L5frx z$%C&!thgh^WaFUE&Cwi`jtIB836o>SsDQ!|M7H$^4q?Vo94yCLg94d`qOQRhJBO*L z4)#sXDu+BMJ?_TJgTZnuhP$$@kdxGd&?AuQ!G-(<)>YPioLi`KcXDFNfHMEj_M%i zrL)vZQqA<)m${=@9la;ujC&* ziiO2lU&)_+6qiHwBv>8NlT5MYekcfJ`+u`1ffrQRdR0zwFnA2n9rW})=dc|^fTC5@ zFqtnR|3yz?D!ZPkU<(&0)^Yjd0|evL`HQ-ODqobFCx~>D|8l;l1XZWYaL6F9Cf* zZ@PRXCn+>JJHK42H?=tY%>>TE`8PRbr4Ain+ThZDghh6uQ0v4AMLpG*T6_-p)tpe{ xJZEc(X2yH=`yTv!*_gArWBH6n^36ZYD{rj*%nOVo22WQ%mvv4FO#nO(%Y*;` diff --git a/applications/PoP/toolchain/tiles_room1/r2c7_01.png b/applications/PoP/toolchain/tiles_room1/r2c7_01.png deleted file mode 100644 index 0352215f84a11789f00ff58d7255800355b8feb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmV-90mlA`P)F76dH@f>0W2sjD5jvW*JzYbz$Q*y zS@FLP*kLEkWJn03&31RiQ+_HSWeJfBs;YXNOOgrfc#PRJfp2-s{?Yy9%l%?eoa^H_ zjvtGG61n&E(7Hbn5fKp)5z)U%=d1c-f?EkeM z6lImXCMb=$r>&Cl`2?(D?x_>(t52hE{MCjI`@<30a^YMP{Gh%8DNtGS7p;s100000 LNkvXXu0mjf5`TwG diff --git a/applications/PoP/toolchain/tiles_room1/r2c8_01.png b/applications/PoP/toolchain/tiles_room1/r2c8_01.png deleted file mode 100644 index 992c339860203ca7b563107beaf177ee56905382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 zcmV+k0`~ohP)Zq}6owxb2Vn4!fzd;T4jy`hj6Fbx9-?Cp&?EE+9Xj*?9eRWe89R8);K2h!b}Azr z83aKX8^5IfB!nO_{`KDD@g637eS5E=$x|M9&@cGj9yWziKZ;NK#lI^^mac@ z6L*LuS5ngy8ZwpNT=E>BI6sHkIm>r!?w()j+jlW$2q1?5atI)Yz%Av$KCbnjPZs4g z?jbLxJQ$k$7I<8tW{hq@C1tb9G)DB2U!|sLA!(%v{(IAu>t`V#h5#~z%j>rxlv2)P z#>U!fbc+R2N}b1yjZLqBm$I4#l|y`vL404(H9oHj^m#$wtQLdH(Mv%EDl6}~dWnRz z0G-HtUInfdr=rb;W}k=tstvC2@%0Vchwl7lISkEbDML+@ov{A^P7d`iqTiu+00000 LNkvXXu0mjf7%k$4 diff --git a/applications/PoP/toolchain/tiles_room1/r2c9_14.png b/applications/PoP/toolchain/tiles_room1/r2c9_14.png deleted file mode 100644 index 0f3076878cfb83b76eb18cd61656270f145c65ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 541 zcmV+&0^-!Y|j%Nu~*O0Q(KOw{p#deEwFA$Trm#1v(c&>$My5csQ z4V1b7sBy%+|7fDDnRYHJ$PoQyCdbPP%*&al51 zD2h8wg>D^?RsCllg7P~MHqB{JpcW-|?M=)+6s2Xh1_g!|<-^SsbAiAd0&@t=Auxx) z9KwWF`~G`LVx?KQMo@bZGmuP$s_RLERZTvJ zIg%Z7rvH76++3iyDITFuW8p6hHs@NICY_o#;=kgAr{Stj0Zmie3|f(0aixc+IfOJ# z`n+zmiUfvhS$%Oz;IP(%J$2uEL%G{wTfm+)_c z%EC06)hIK}R|yQ4m1&w|H7eUZJYHRlPbjL>N5*QUDXM9T!GX(4lXP4dN?NF0Y9aqR zh#uT#St-;+Z}h diff --git a/applications/PoP/toolchain/tiles_room12/r0c0_0B.png b/applications/PoP/toolchain/tiles_room12/r0c0_0B.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room12/r0c1_0B.png b/applications/PoP/toolchain/tiles_room12/r0c1_0B.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room12/r0c2_0B.png b/applications/PoP/toolchain/tiles_room12/r0c2_0B.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room12/r0c3_03.png b/applications/PoP/toolchain/tiles_room12/r0c3_03.png deleted file mode 100644 index 4907ae25449d4760ab5c4f163636bceb2045f9c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmV;<0x|uGP)`1-CY zzqT{TI5$lwew?H!7?2+h5$EL(Fj-JIF`5C>G`d|-FkoK)J!r4NICy265CaFj9^;@9 zP!=on?m%SKK^cx_@OYfuK^t&R9mI$?nLK$6LPdI(m|z^#x#`V8)|25XH^tSkkuHpv2)0>>fq4DnTN0rGL5^o)w5!A}_TnM^2=CcVoH!`punrOu_m)~ts+l4CGU+K+z4s(K1=o{YoP%C^5{675 zCq0P{f+7;gOBOSPgOkS~Q!L`Tl7I3nrV3|uC4cZ)98cAgKsBZ(xq_DarX*m^|K*-U zyhMfFt;#VD8jm5CtEUQEQL~<&q&fq`@A|*>u4vx;^)%v-b>a;0qj&_UPyE_M=aNMwVI*&oq)<-neOc&BL4k{ML9x7(Q zQ~bpZjRpbQI#kqwwVI^d;?m%7zR#gj(z-w$za|r)+#7ySfS2IAaMDfX~9}S!^#LKiq8$8 zO704K8+Do+3sPjk8X@%Zwu#n{_u6Z`J${4g8@0Fp(!x{p&j0`b07*qoM6N<$f=*{e Apa1{> diff --git a/applications/PoP/toolchain/tiles_room12/r0c4_03.png b/applications/PoP/toolchain/tiles_room12/r0c4_03.png deleted file mode 100644 index 38f9effdef3b7ab1a77046fe07050367a8e70a12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmV+v1MB>WP)pFe5LGgU1_1&E0S62M3JMAf5B3B4Dfa>Q3H^kE0|yHN3JMAX3JL-i6a)ka7?|f~ zJ<*M;tfXCAa(wN*8Aq8~&Axfj?!Jwc`j26l;Y<1L=Fq&q%&2v-ScpEbuIs<=?f+_B zw(INDuV_4XEn=Ih?{^1%als~N_IqVa^MRNPE;(F_*d`=*y{gy*H|^^_xJRPkJhn+f z4#C+kQE(pH94R6&)w{rp1Sx1B_SRzZB@TP3JGNkpB;SX{d%J%iw>k?wgs+Zn8wWhiMDr|29m zk}BA@IGZWdK?taust!i|pi*~Uk`+^3fL%U6xY>ft4{qUvn03}o76osvTaprhL(G2N zyS|+yb_OMLNnO_`#4NJRBv(CV5-Ov+WY0d67>8umPV!I9B#@}9lsS5FpLxW1x=9uV zk(^XPtxK=fO0J+KDTO9l-e|qJFS03^3XQarq?$=ACOMOUFo9xm?V79(R)PdNOBRDb z!O^oAh$0@c{G(@aMJOAx{GX~07DHwdE{4n`Q3b8tk0k*d@4GVzUg)s9u3VzvEQg~8 z&rH%S)S^yOe)XBe#pGs^taWhcOk#+FJ*hgV30FOOCyBvLmPsi{A*+HzM$hHd?Ex<$ zj`FQy1-ZV@1l$b5A*Xz6Z_6K=lh+>0Z%OZ7AG>jb$EZNbeK%K^bcq@IP;nWE>BcW4 z#8N+0^r0KS2oW>JARRRn#`*b;L(Il6LW*gvMyy9XO!L8RWs5EZD&~?yv+@UT-|T0! S1cY_~0000p95xd+$-@Cbc?i3!9+MI{1(XD1oy z$!L1q5S!sFX>G#DS(rnJn|7HY2WR(o+w69bac`FqoUWDkgtLx(Flb? zz6y>+uq@v>s43^5Q3u<$rJHeugHxioT5oz1t+^R0;P}Y)O@n$l$9nAk=7(xUeae#2gw0d9M>crn3IpWCh4Z+L8~=M;qsuqP&-KE z9MqL_P)BY)s4JHTmymPt;vEbI7?8ziy*ZrBrvCR&ud~4G&#!;Icqe%<7+^pad9b_m z_UI-}(?A@@QZOwQl^0Ob-4>)VNrhlcu>ejRY!IzUR$LQ~b$xR+>xQ)eOm|I%IyePv zZd2|TTI>l_U<^tISDz5<7oe;u8Ppig1Q=5=r=OVwQ}#g&V23;i3dz!ivDMCE$b+ZK zV~gZLj9^SJ&yPP%EbC*|Uwr_8NB)z*A0Xo{Kcg9cZ+yiaxQCA6Fif|;0o$2|9dWUs QD*ylh07*qoM6N<$g8$#&5&!@I diff --git a/applications/PoP/toolchain/tiles_room12/r0c6_00.png b/applications/PoP/toolchain/tiles_room12/r0c6_00.png deleted file mode 100644 index 619fde065ad5ced51243f14d04725c5535e9d06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmVN`W2ZJ(menZ^`T%UA`bxF$1nN(w814&R3t(D}tXU#sNJ%w;Y0Q3Xx8CJEnSCaK{1-5qR*nEK%{_5zavq&cO=KLEs$J;2dm*bI|7; zOfH*)V(1rj7lPG-{Arf-A!lq3pI=ih#{lvRC?BzIL^l-f00000NkvXXu0mjfU>e`b diff --git a/applications/PoP/toolchain/tiles_room12/r0c7_00.png b/applications/PoP/toolchain/tiles_room12/r0c7_00.png deleted file mode 100644 index f349fa3ca1f0d836192bde79e07afb59700728e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmVo1N5Qg{Ah$x^~rchlhK9u|4LMd*z)n2 zim$Dr*|hAxRhTwJ2HraaH7n5UF1*7f>o zc^53%bCok)Tf8dnkS(V5&v%yV->xW|UDoyVdMCKqewIfOtmTNPKNyu#l3^+C9LpY( zj4s%8Qd!c>+C2RuS0N>BS)VSpc2FJ&DUn!m`|2TGY!#H-d1&Tr+UmiA_4an0xwd-O zZSJ*guRItoGnX{feQ`R)wxr9FSZ*OhnYcdcx_VMx$ z1|A+B+5Cc%4~8`*at9u|weiVX?Z{S4P~!qKhOLY%cpY*XvX~1#A81(kl0Pxy5?Jz&>E-_WD%I}kLMJL% z_Ix*v;DV@n8JF>GvxwjN!)I!y1xd~N#QU4|b6Vu}yZYRBfT6(P>FVdQ&MBb@0Amn< A9{>OV diff --git a/applications/PoP/toolchain/tiles_room12/r0c9_14.png b/applications/PoP/toolchain/tiles_room12/r0c9_14.png deleted file mode 100644 index 18e6ee3cad0a971af6491fbf2993a8575f1981aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmVIOv5HP;U%iJYd8pZ!^XURXQimJHD z*RylJ&kjH#j6?hK`Z)~4_m{e^ftvpMcGx;!8F50i&>W8>f^P2;Tmn*AaotHI7k9bI znJ_DK3#1ZfIXw$#nkU!`J~|h5}U5P=3+|Z&cyw10>#e6UAj1wA~2L9Fq9%N8-X%b z$)5`0=}SnvSa|pn{$o%(m?qQCw4avwI@<;@rWBmH>@-Qw zjUm!R?UM`n=RsJ&ZIu;cEi`7o1nf&$L=PpuroYx3s?Znd2n1$H2?qr07*qoM6N<$f?OflIRF3v diff --git a/applications/PoP/toolchain/tiles_room12/r1c0_00.png b/applications/PoP/toolchain/tiles_room12/r1c0_00.png deleted file mode 100644 index e1d87df679b49361fdef5af97718545fd9bd9938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!RII0qV@SoEx7Q4L8yo~!4yZd` z=w9H!z{=_*(7>V+pu`}k-@v5*fWfI$<;<1YG25%JTAWSi+O#HGYS%Zj;OT!oCVG9S wWr#cFE59v=fuY9zn>dsG^sfp)lNnwfWG!Lg|HiwmHwDD?boFyt=akR{0NsTy8UO$Q diff --git a/applications/PoP/toolchain/tiles_room12/r1c1_00.png b/applications/PoP/toolchain/tiles_room12/r1c1_00.png deleted file mode 100644 index b1f0d1f0ae8dc6cb161277877f2f80b50d939fb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)Cx}*$B>FSZ?A6TJ!Bx#^6+tI z<2?aQi3TOsW&;Lg1144Glnx$;gL(@a*)%(tUeCSw-%~Fq@|)+hbF&}6+_U1uQ>&L7 z?$_SgJU72QbXNC!_J(&)45t0nVYm=%|Ezf4;T?O9{oXYvWwC=|F$^w@V}3T>cDnZ8 z9c6LGp+}{S#9{DPyWAE2UmJbQ_%6K{-rezvVZ(I2QYN4y879nUUnS|#xW{Vg2N2iO L)z4*}Q$iB}C_Yz` diff --git a/applications/PoP/toolchain/tiles_room12/r1c2_00.png b/applications/PoP/toolchain/tiles_room12/r1c2_00.png deleted file mode 100644 index edad94c55802eae028f96eafcd2997ab17d80851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A+h7#Mv$T^vIy=DfYBn0MGfmg&Z!ofzPmoP;zahv~-XN<~u;75ffddB?)J)#IB=+vPd0*6i27mn* zbY;t`Df8#JY?^%Z^Xb>>p;_O*`T6(r-~7Mk*WRVGzP3KrUr|*4`u7{j7(oZ$%RTcI zTOQl-Y?$eA_t=E;cRzMtn)OY7o1KB~p=U}}o>O0&rQJ!pv+ei2`OOjsbDMts-201T znvjAyW05eBxF>UgZ#gHk%7rb8PcPyZZT`l><_&fH48bLlGw zi$ROSu`TJrwHga%7DUDN$sO@sWMsjSpb0StY#5mMr}~^(?}ESow|eJ8IW%9itu5YUUr@2I iP>5Y=wc*RMm)sNnN2ecjTeTJ#z6_qOelF{r5}E)csIR#I diff --git a/applications/PoP/toolchain/tiles_room12/r1c3_14.png b/applications/PoP/toolchain/tiles_room12/r1c3_14.png deleted file mode 100644 index f37308d44e4da19b59c6a96fe3c65c927226ea12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmV;T0$u%yP){>L&8!u@ zVmp#D^-nU%=<#K3?@M01y?-3DNc#Nx&UP=))-kNyi!7!}$Nr1e-J{il>-9PdA-r1`CQA9+eDXY>3`ka$*Eohi+xwz731Id=Li_I?w#8_`(i5_=AQiO| zKu--u*8<4Q0m>)@z%>)ejXNb274G4(BGW-!3yKO20Y8!aSA10LaTiLY5@eGJ&D9X6=9$GNfb& zX9DZxgHWJgkrGO^1MCC{1B+raX+h*GubKqmavsilm29o&%BDff&~PBSpUnqG4Rv`3 zsag>0@MK~!*WCL_<%9ATQ+}!$aI9v)OO=ctG)axg(E)j?kp!iSBuN2sM;3L~VNE5H z$nH`{2UMk&01Wf9&?%QHYtaPvL1@UTOIp2)CWH*7eRsq$7fr#6rqJDm(&Gr?R5ZEZ zu%9xvA0x4mv7kxG zTM%`7fa1zs{!8WE z>bp9sdVtr46T|@Yq{*hBRb4?0fUl*vQoUt!(iGthINv@00F`!24xSx%r~m)}07*qo IM6N<$f=XyIhyVZp diff --git a/applications/PoP/toolchain/tiles_room12/r1c4_03.png b/applications/PoP/toolchain/tiles_room12/r1c4_03.png deleted file mode 100644 index f803b068da8ae387f4cc874df7434af4a75f688a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)G1pxs92I1*! z&U>S5^s_6;Nxm7MZYK8X^CxSypX}L}uiuX9M)>~o>FxjB%dc7Y?&Isd*$5W zj2H!%+)2S)hd}Pb+OP?3Pk;Bxb0iARbLvRQanF}1IENvT!0u${Pp%*(XIA|4udZMV za+4}3fg5M?)t^BwbRvC;6qMe52^@(hQZN)Sm%ODjTnFMo=bSc3uoNaTi9#a+3US(| z1T9m+>SwSNhM9({pTX8E$7FdBN~hA~>{{kQN|KvqY(m{ud2j*b{A4Z3frhCr6u-sw zAd*93SP^4243SH=50TWjSV9bA?Mf6(5d-{r-io}*FbvUHszkwD zFk@C?PeK8ssokYRVaD+&f_z@Sm*(wE*Bn6O@ zDySnjTcuzMCF`<|6sygunJLiSsvhLx?iIX=C$Yi_RP0Gg^Pmw-psHsuwe+P(Sb>6* ztt2UOX2p+Fy^=^_0?MZ1RIemcqZ3usk(H$7{*0~gB*9q>2UNyzV7Z^01a|zLdJ=qF z;8*1$1$|-wY5_puEz_H9dwV*+sVB*qCg@Bu+(Ta)cU8^kKvgYM@Cu1qlM%X$UH%lBC>TpEHP&;rc|5`qAfsY!RKe(02(#{U zncPXpsaQKN?I5S5W>iI9d9PyaqNIb`mx`;+BkMbf^?MU1c#W5eDPo8sf>JoL{l+2o zdYzk|pkt7u#1LBROM=|Hm98W@5Hm*1$3-5DZTQrZq{KMn0Kq(n0e$kAR!S1J8>@5) zF#vqibMc;p5~JI1k{RsAkqD832>{Pnj2L3J`SkfMC&iXM>3foX>_DOxC5AXDm;$K# zBrGV_4Txc-zsRa1ELfEQ{?~5^|JyIXRT4D^)ElAs`VXPJxB!TdsagO4002ovPDHLk FV1h$Hl$HPh diff --git a/applications/PoP/toolchain/tiles_room12/r1c5_00.png b/applications/PoP/toolchain/tiles_room12/r1c5_00.png deleted file mode 100644 index 3e1cab3e42aa7677a347fb6cc62eb6390f1b053c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A+h7#NE@T^vIy=DeM;Fz>K|K%4%= zM2Ch%$AbqBI2=6SAiuDGxBClb9v%@M9v&%)mU63=>ugRJ&i&J8TQEN)Ry*?5^#4J} zujiFp#CCSn+1=ZnSii^b{&V|M8F#LSTSGeUMOkYf-#YDtOs&tU^;c%tsj73PDR3_G zXbKg6Vmmqhs$`z$Q7!w-9cJFe9w&ZY-Me1*)>ECLpm#fCzDC-lsGLaJ=zMtp57F&H z#V71Klt3CaCMk5OK$%9951jB}QZnZ3dee+74p#Cg<;NZOjk~Ppyz9Pe^Qo*R_KWKD z^Xsp+$4s5{_?O2S3FoNSk%l7sR;5Ts7WpPAt``0hE%E8krz<{Z7HS0NWNPOw{296Q z$eb&4?x-q0OPk3l@}|N-|Du<4N2curL*YAVTV3?R&ph-N+shufancIiBRw;_I9KZm zUEY3e+JunktwGa$HaxZc#vyv@sM(FMq9@xee0uD+|9jlwTE|%NAaBa*3$Yi0k-*^T L>gTe~DWM4fiUYdi diff --git a/applications/PoP/toolchain/tiles_room12/r1c6_00.png b/applications/PoP/toolchain/tiles_room12/r1c6_00.png deleted file mode 100644 index 22b5242bf66cdb906150bad6d59dd548126d4138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!l!d2@V@SoEx7Qp685DS!4|;WR zxIDPe;ql<+%uTBw#LWz0JfIQzyTqJ<;evjh;)k6#9D$k`UOi;$Rbfq9a-4S?i0kR< K=d#Wzp$Pzn1R`w! diff --git a/applications/PoP/toolchain/tiles_room12/r1c7_00.png b/applications/PoP/toolchain/tiles_room12/r1c7_00.png deleted file mode 100644 index 6c165a24a9d9f9c8031f18f02402896003e0798b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)FMw8$B>FSZ?A9UZ8nf_dH7iE zSNjJ65lN*~wi6sTuV;D)w`#ERu~*G^VQl@XvShLjBg2N3S;hCixiDBfx4ZT!F8AH~ z=YMxky0Sn)dyeQiuJqQ;ha%m1*T|Qz3;S01c2D9rsW^m0`VGh24gI@U9#lO3_o(Kc za)w8tr{(}%!SMf@-gP@o6Q6EPQyr}hwH)1?d+y4|>&Jc+|E}&e!(rc&pC5mM)Oou4 KxvXFSZ?CKuJY*o!@KL-^ zP|1pcsWYKPU4o(Ug}_vv0~|dKDGY510!JqQcobl=ciGR&*8AqK%y{?7v@%?M>f0|@ zelMH&x9s!hzfoGo)!iq&=WTTc8Vm&w_U{myopJkXH_sKx#7O2+g)?W4RR6CPAcursIcl4)v(=o+(Wd`=PLX%4(TMUagT&w(g#jDE9F_H(T4GAijT3 w4$Lw(J2qGUdRF1~-_ExlEAB`OU88o1edliba`s!%;vg$MUHx3vIVCg!06KnV_y7O^ diff --git a/applications/PoP/toolchain/tiles_room12/r1c9_03.png b/applications/PoP/toolchain/tiles_room12/r1c9_03.png deleted file mode 100644 index 21e4ddbf436e5a6d08f0ebb127b0798b8d9718af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmV;;0y6!HP)0 zp;p5%6iqpk6%`Q^6^M!n#Ka_Wk`F-e2?#!b58y)(2qa;KTb*u zB_~bZ>yjqGJ!k9ASx$R*^WMw5$&&f<`pBnKwwM(x1Rm~h6Vvw-fCFQ!VkL_ciEThW zzdBNGxZm%;K4)20UpY_f>*n>TeqMThc|5$YllE%5-^BJnd2<;8SU^>=&sq5xD#XsL4hCHXof4GfiX0!0qbulwoL2=YfF_ei zk3lSWPl<^}L6e%n6cjxfu2U03&N;!NCy8|Nh?(AC3Z|iAut1g}r!nYa?JZ1O-QrL7^$)rj~#7EG{(4 znp*zovp5~glVCB5C$S}gXufytNvyx1J?Oy#s;bwMw8s!#k|$5Ge3&UC|AZ$|5uGPd z5tSzaO?X6A2f3!Jj;oB znHEm!ppQevymN{#r`x%Lt_~G32yzq_6+uw;1_u!Y0Okw4XMaXwc41#e>m=cvGoRp! zf*4|hw%@u}3IGoEOA@1yBbAwU`;C&p&`hn4lng7(%vlLakI}YJ7;@!S7>TvOhLx3| zY(7_rF1ZWpG@3B6Hl!Z^75DhOvW^M1{f5N{^jaFG5ocK+00000NkvXXu0mjfKq5g* diff --git a/applications/PoP/toolchain/tiles_room12/r2c0_00.png b/applications/PoP/toolchain/tiles_room12/r2c0_00.png deleted file mode 100644 index 6925c1b1995dc623cd305c2ac9f5a485190b7fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!l!B*=V@SoEw+9&+fxIS#|LgNS d96(G6$Y;}VU|^gk*R~DB_jL7hS?83{1OUi{5wQRO diff --git a/applications/PoP/toolchain/tiles_room12/r2c1_00.png b/applications/PoP/toolchain/tiles_room12/r2c1_00.png deleted file mode 100644 index 6925c1b1995dc623cd305c2ac9f5a485190b7fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!l!B*=V@SoEw+9&+fxIS#|LgNS d96(G6$Y;}VU|^gk*R~DB_jL7hS?83{1OUi{5wQRO diff --git a/applications/PoP/toolchain/tiles_room12/r2c2_00.png b/applications/PoP/toolchain/tiles_room12/r2c2_00.png deleted file mode 100644 index fb8f938f838576ebce08d44619c7924d4da29954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)PGMG$B>FSZ*Q*UJ7gfz_K^7@ zlbV*6n)U<^y~gebi^>^=rwWUTidJ}VdjH7W-s1m7V4r!UTGqUr$nBGJmlU>N{+YFA z>f?K&*UK;MkkD5WN?EbSoc-CJ`S0AXmoDO)5hV1y>g4vFA;k--AFTPgr)uX~lXE%` zLKvn60_Pa zhF_muAL#xslL@H)*ut0Z8|t{K8tb?oRjn3(aj)Q2!@sxRRxw+>4c{Qrn8C70@WWAo$VD$h19UHG!{@IFS?%OU#T^V@2GLBZhZ>gTe~DWM4fWoCp4 diff --git a/applications/PoP/toolchain/tiles_room12/r2c3_14.png b/applications/PoP/toolchain/tiles_room12/r2c3_14.png deleted file mode 100644 index 5f433efea4724b5128cf38c1d5601b4978032090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmV+@0@wYCP)RX$Y9b%6@V908dlAVct^@)nf) zI&VRnO)!*AFqBO&lua;{O)wNe9j?-smOBPYw_R6l+I)I#0@P$^iiK7R5Kp%Z;tFlS zp{ZRsaCwC$-@r2mx6s51?u}>QnFHZ-0D7NK;92D~gI2qrR1kY2L+yT2LD>_@u7YE7 z*;J5Q)vN@ESeIZkv8XS_x+?e*f=A|W%h3fx#~+TY9Ip2Wj+l|7cB`u1o}S~-AvrV; z7Mw39vF_RG1?ODerV!lIYRf%a#iv7)Ykc)PW|Jv2a!}_YP)O7CXBC+#=?GbpF_ z8kjBuaEu))+B8|gMArq4BNFcM$f}$=1ws-GI1qd%Kvo{mx;-Gf2RIv;OxEN&;0l>jVuZ7S z&6XGj3X$gS`b5L!1DgPk_hCz`E{FOhY=Pkl@+6^q@45x%dxnj04ULOlCwk)vHYqsG zz(1l#iYCB;)W31%KqKIq<$j3t2*O@;ChE1zeP0w!``1|yVn< zdlL07mXNA+3xEdLX>eB46l-$SNyPX$wP1CDO{OWd(*!V_pQq0-kr)kEilBky0+ZSu z9-f@Nx~;lUeXMEP!W6A)np~!63sZk;d7NponIaz?PfYG|-p!x#vxUjMh^PFnNZTSP zw^}wpW{I>dg7Q??*q+0tDT3IZ!=_mTOS77)h6t9dx++{X{3vM;3X>dVn6G$L&Enbm)-LLk12WvZqjB0fJqTlu0V-1A_e2k-yTi z_@14^%iG5-gb?O=PETPR$B^IW*8s<`SBTdzeSIGGem}0kGEDxQ+c_xUMSz+r0UX^S zhcq~~18(QAKzeE5HsE%S?iDj*7k+HLz5IPN6XncG&OgUwc8$-{Hy8dBEu>*01|tKhAwAg`88l37Hm_& zti4VftS!G4n3v+Sf|-P-9#Vy-9#VxSP8MghDl~BmyosX@Mgrm*qU%+DjliOU8q1&M zdNZ+B!IoqPe5G#Y6|_or=#@z<4jUSb5xpijE^yjgVQ!&mQi8dKrpXA*3=o~bnp55S zb8oP!<*)tJq`Vg01B|r%RA21{)*PC8gNZ}aqrliZO^*iK+^hTfK0g&$Sac6fi07vR a%lZY@Xv`XlwbwiV0000Zq}6o!AEdH{wD42&K+dgu{21Vazeu?Of8dWasPN63(&Lk5ow9vD1yCu&3_ivlSD z;$PICgalYZpRn}X??HmVyuQ6RW8)79%>HOVEqMGgaL%32(=_E1bk0Gk9J?&*9S<(3 zTDhl3)jKW-%x*-ELU0IESzbX?S*SeY6;!Ppt)R~@L0y!i$sSzr@cEH|2mv_)as=cE z$Po~(9<+kW3+Ty$-F&=U>!NHfNB8~`Z*Z~9(?!|blA*=(OXKfm{B@XaiuF-L+`?YtHF`d>ne-)S@X_JLjh6V3*)AbB!oCmnisu z1@)Djo0^ZeGCSAw%zTVFxHj7tJgnTy+5Q{UE4S-{PjMZKrUi&a(;VWLrnQNJb9;nT zf~M0O+*S+t9+*ux(L*61M?j8%90553as*_UHVbKgOHp~o^;=3`(c}mA3I3m|k*nOT Q>i_@%07*qoM6N<$g0E7#q5uE@ diff --git a/applications/PoP/toolchain/tiles_room12/r2c8_14.png b/applications/PoP/toolchain/tiles_room12/r2c8_14.png deleted file mode 100644 index a8270a992e078333fbc3349d1a923e2af17095f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmV-I0=@l-P)aa0l2S3I_@V2Lb{D#=GaG&fK)I zXsN^H1-Oj9!qjmRN}Ck8>LNw>3m zt6(r(V&-D9@}zCpCKE`V#BJwElh{utYA%!~akq&Ygo7X)1mPeE2SGRp!a)!Yf^d*4 z5RJ4FYy#Ctzr#AjYJ}gB{|;6Grb)L8F+4E{GEG`gh~bHWh)R~Tr`Tnsp*L*k#YNz`Tm=36} QT>t<807*qoM6N<$f_1=^awpdVPQc*j}Q=05U|j|K)@ip9Vu1D<0Q8JwKMSp z9%mwJpVyw%e)8(&_3alb>HXsi+Qa8+YK+()2{=m}e+c@%H$T?vHE@&A=A_)fQ_~a) zsJaf6I+>)nBt%$qyR9r@aBq&CIoc;TB`j%9OULqgS_sUAz+4E-g}_`0%!Q=_QF|^e zEDciIf!s8F4a!Z!JA+!RGpO}A8Kl5F%_W?=Qx0Zvt~3ly)-a6s{;-)GW;FCYiV^A# zwWZt$G(z_h{l;pLs6^$Mr6zhns7$ zeCC}k)G?9?=5TrkYp%)YGN{H9XSGmWtQLc@S`4x?NQrAEa@s{GmO=Sn*i$qeSu!{U zURexU&>6P*rC>|A1Q~*kWr|X;CG?l3P~cI4u;rsGXvzslNuVhwASHpOnt*iIU~FL} z#|@^CI2c=}XtWD9HCITSs0`9z)yRbfmkfrOlm%GjlEIo_l=U6Vt;cIvQ)@98tHmID zgA~annA?;bZHD?9&0gTe~ HDWM4f{?s`J diff --git a/applications/PoP/toolchain/tiles_room6/r0c1_00.png b/applications/PoP/toolchain/tiles_room6/r0c1_00.png deleted file mode 100644 index ebeda3ffff89cbd527b91a601849c4e733069715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!RF|iVV@SoEw^t2$TLMH}EwVnGDs6b=UlRaI3cfd-Q*4ykA2!bSZ}v-hOTV*%=FnKk{b9#^=?I*lKDy!dKz ze@~SCp>)A@!DFdgZyeU93(Nj^T@^RC*Fn6Iuk6B6zH1H(x*gc9UnH?-D*#nB%a&|x rHWhfGbm1UhT^;-KkMea%C%!XuERw05yk6o9(0m3@S3j3^P6N`W2ZJ(menZ^`T%UA`bxF$1nN(w814&R3t(D}tXU#sNJ%w;Y0Q3Xx8CJEnSCaK{1-5qR*nEK%{_5zavq&cO=KLEs$J;2dm*bI|7; zOfH*)V(1rj7lPG-{Arf-A!lq3pI=ih#{lvRC?BzIL^l-f00000NkvXXu0mjfU>e`b diff --git a/applications/PoP/toolchain/tiles_room6/r0c3_00.png b/applications/PoP/toolchain/tiles_room6/r0c3_00.png deleted file mode 100644 index f349fa3ca1f0d836192bde79e07afb59700728e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmVo1N5Qg{Ah$x^~rchlhK9u|4LMd*z)n2 zim$Dr*|hAxRhTwJ2HraaH7n5UF1*7f>o zc^53%bCok)Tf8dnkS(V5&v%yV->xW|UDoyVdMCKqewIfOtmTNPKNyu#l3^+C9LpY( zj4s%8Qd!c>+C2RuS0N>BS)VSpc2FJ&DUn!m`|2TGY!#H-d1&Tr+UmiA_4an0xwd-O zZSJ*guRItoGnX{feQ`R)wxr9wVnGDs6b=UlRaI3cfd-Q*4ykA2!bSZ}v-hOTV*%=FnKk{b9#^=?I*lKDy!dKz ze@~SCp>)A@!DFdgZyeU93(Nj^T@^RC*Fn6Iuk6B6zH1H(x*gc9UnH?-D*#nB%a&|x rHWhfGbm1UhT^;-KkMea%C%!XuERw05yk6o9(0m3@S3j3^P6N`W2ZJ(menZ^`T%UA`bxF$1nN(w814&R3t(D}tXU#sNJ%w;Y0Q3Xx8CJEnSCaK{1-5qR*nEK%{_5zavq&cO=KLEs$J;2dm*bI|7; zOfH*)V(1rj7lPG-{Arf-A!lq3pI=ih#{lvRC?BzIL^l-f00000NkvXXu0mjfU>e`b diff --git a/applications/PoP/toolchain/tiles_room6/r0c8_00.png b/applications/PoP/toolchain/tiles_room6/r0c8_00.png deleted file mode 100644 index f349fa3ca1f0d836192bde79e07afb59700728e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmVo1N5Qg{Ah$x^~rchlhK9u|4LMd*z)n2 zim$Dr*|hAxRhTwJ2HraaH7n5UF1*7f>o zc^53%bCok)Tf8dnkS(V5&v%yV->xW|UDoyVdMCKqewIfOtmTNPKNyu#l3^+C9LpY( zj4s%8Qd!c>+C2RuS0N>BS)VSpc2FJ&DUn!m`|2TGY!#H-d1&Tr+UmiA_4an0xwd-O zZSJ*guRItoGnX{feQ`R)wxr9FSZ_h0hJQToi;KGE? z2_DB%JM^^#L`A1^u&qd7-;vB9aL19w-<9p3-R8&K$0~Qq^Z!ow|9omj+O*SCZ*SY! mclk7X=VS{Sp?cd7=a@a%1Zq|tboc^vFoUP7pUXO@geCwkQdRc= diff --git a/applications/PoP/toolchain/tiles_room6/r1c0_01.png b/applications/PoP/toolchain/tiles_room6/r1c0_01.png deleted file mode 100644 index d4c3d9caa6d05dc8e131d679e89dbe0199e358eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A+h7#LrBx;TbZ%y~OYvHy^PNQ1X= zp-^C>MW=&;fI1KgcT5%){?qYW^1Jc`bu~3V1p$sDoGeK~jV@txEDDoO>cwtLm0pum ztE=;*_T;9LlG^_7r`S)v5Ons5(VurduG4z9+T*ij?$>VTD;?3dY+XI?-L5GmGVR53 z#pfnF3b1_A*c*NSdvfJBoAo8OU5hN{`fvI@eRXV{V{pLE9Xxu>u}a)=?EdfnN7PN6 ze(^#^k!Mq6>N?dR4~=P|XIDKB)ykGyE@Z>jryMN|%iavSyckWhcTMkxq^kakEoE>p@GWpx2?N2g8Wq%mR z%~^8q^&0lWSE{cXRta!{(1%2u2={cG2zDr6pzE>Ty~kMzKO;hw;veT^H~?(EX(>FtjTrn@>`*;k&Me8+P-CZztvw>+WxYqvt6@k@#?}`njxgN@xNAYf$23 diff --git a/applications/PoP/toolchain/tiles_room6/r1c1_01.png b/applications/PoP/toolchain/tiles_room6/r1c1_01.png deleted file mode 100644 index 312972830721a22db6ba15fcb8e8e5cb13da4b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O$}C$B>FSZ?A0RJ!Bxjdf~jd zas>;Qmw3;FCPobnBNpdCBL?S6c7Y}j4n^m_8FSYDS8-|C@k6`Z(!m7;mN0I-9q)B# zdO;rut}sog;raWv`p2GsedhYdm+wki!+u1*`ReT?eU9fHVMi|IC$9CMaM(3(e&n~s z(i;mFR7JfJeJBHh7qbrhcv>g3<95H2QhE0}`yKcETZ*@cEt_)2G&$=mqcg{|S%zER zZrkyy;iSR*n+?JDE*Q<<`8iYehi2=UpY^j3ro0Kd*zhv*edO*Vll&DVzRk0I5L3MC p&YJKUr$3gs?Z2J&|8ZSlJmZNSvBvLTPX~nwgQu&X%Q~loCIC)igRcMp diff --git a/applications/PoP/toolchain/tiles_room6/r1c2_01.png b/applications/PoP/toolchain/tiles_room6/r1c2_01.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room6/r1c3_13.png b/applications/PoP/toolchain/tiles_room6/r1c3_13.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room6/r1c4_01.png b/applications/PoP/toolchain/tiles_room6/r1c4_01.png deleted file mode 100644 index ee3ea4c18961438f14216ae7f244936c68957204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)G|*O$B>FSZ?Em;ZFb;kOMHHW zL$0xDl9F;jN`r`|MAJeINd@Oh_DjpGUfO*uUhsY8`^RfGrzV0-U|FSZ?A0RJ!Bxjdf~jd zas>;Qmw3;FCPobnBNpdCBL?S6c7Y}j4n^m_8FSYDS8-|C@k6`Z(!m7;mN0I-9q)B# zdO;rut}sog;raWv`p2GsedhYdm+wki!+u1*`ReT?eU9fHVMi|IC$9CMaM(3(e&n~s z(i;mFR7JfJeJBHh7qbrhcv>g3<95H2QhE0}`yKcETZ*@cEt_)2G&$=mqcg{|S%zER zZrkyy;iSR*n+?JDE*Q<<`8iYehi2=UpY^j3ro0Kd*zhv*edO*Vll&DVzRk0I5L3MC p&YJKUr$3gs?Z2J&|8ZSlJmZNSvBvLTPX~nwgQu&X%Q~loCIC)igRcMp diff --git a/applications/PoP/toolchain/tiles_room6/r1c6_01.png b/applications/PoP/toolchain/tiles_room6/r1c6_01.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room6/r1c7_0B.png b/applications/PoP/toolchain/tiles_room6/r1c7_0B.png deleted file mode 100644 index b4b0c0ce2720b79c5fc3e7ff987e9091b24c66b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)O1f5$B>FSZ?A0RWisSxO%%S% zA=lW%DDjYsZNV7<9@mo$JWplcMQM3g?wZi>Z+)MzcHJgPpgtH7wp#mjs$;sdGrxQAYU)@Tmd1G7Z zwe&gvjt$?Ru(>}i*%^1v?9}J4+p6|2Ozopr0EHD& AtN;K2 diff --git a/applications/PoP/toolchain/tiles_room6/r1c8_01.png b/applications/PoP/toolchain/tiles_room6/r1c8_01.png deleted file mode 100644 index ee3ea4c18961438f14216ae7f244936c68957204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A-!)G|*O$B>FSZ?Em;ZFb;kOMHHW zL$0xDl9F;jN`r`|MAJeINd@Oh_DjpGUfO*uUhsY8`^RfGrzV0-U|S51q@%oxp-SJRDd*LMD% zyvSvujQ!F7789p(Nt(=`{qEbbcYWd6?P*(&J$o%(x4ShvZgp}lXJLzllZ;}YfP07X z5y3|snA}BE8n(ricr2J>J>!&V!ls7Wi|w`h|JwH3@*iJVc9Qq)iEG_@Yjn2c?!JBK zdlyrxOOeTv+Lxe;-*&&h6af3{ii^J1QAw*{|lDm)=p&d73@{nEPN z+x_qv)*Jd$cRA1DhPvbIp>+Nh!ABNb7Jj$On{5Q0v zCh~*xl*s125=#$HnLCqX>0z0bP0l+XkKsj{S1 diff --git a/applications/PoP/toolchain/tiles_room6/r2c0_14.png b/applications/PoP/toolchain/tiles_room6/r2c0_14.png deleted file mode 100644 index b5e9c6d7aae8a57f38c6b5d442c2681a5e29a2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~OrP)#`20FTCcb}u;r;E!`yEy7335^e^f%?x>#=QH`_Fc}g&edV zePtH4F5#gll9*}g8k*+Mnlgq$`l?%e-svO;EBjg7&%U`aeN1W2V6^(x3h5&V2SGRp z!a)!Yf^aaE5FJjfMWjJG)S$~ku0dTEvMXp1T|vX`RFD?#bS+$c^zAfG!t&hTvF}HPSxF*AJSK5{5BKrY0`~PQ`bOruz#D8KcsI% z6IZm27`oK%QO^!Mt~nhsbg4OcqzgQq$#z2M;ewpNV~8EPE(VAC9jEV+=h~sQG5w1{ zx8HGQxX_3-^t)sF!A8wNGdDQ-9?UsF;FK?=e8jojQyrJPK`wWL;tbNtJrgCpMMzdb zeQxY)3>{G_=nGy^4R(RYFg5gWnRU|C4?I&t50^=yDd$O)azm3Fj8dLNH3OmSDm3+j zQHoF$3T4PW30jk(P-YEs8!JtG!8Eq!y9T*^ik!D#zTX;K^IgNLAoZRa+)V~6xWuGh zDXaMOFBQxgjL4(Uz6aMJcn?YjK{yD)K@bjta1d_YATe_Z#x|v$m!WfwMlqdN5Ulb|&j3T6KYuT4h50#OwJ0000ffjF=fkvN=63rT_E&;f61x&nDqPZ_*+?JstVIpqwJpM!P=_djC3z`2peAZGsA z{OF4`m)LeMCUL6Ws;WEZu{J-3N`omfMR2eBz_AxppAa-Zh9WT|n)6R=joWGp^JUTG zLKRgBUs72evk-^jJH*dUQFUXdyBvCB?rCwVrfDvzEMT_S?mpb^>&b14;|0tX zi}54c=xC8KW+xYLj?qylWwucNxK!^_>YnhNduhzYKMAz!T}lt9U>A84m#*vL4;Jba z@WcS4=irhJL_WUiUn1#-_4M<#=OEbKX&jzu!)GhT}b zRHjCC)n=Pt%51S15+z0(omjJz3sI(Ntv69p%5&4Sra9^@Zq0jUn$|Q&t-)>bA{BG= z=y(G)2uv-kBJu%~Ys_~Jrq(H8Jq7b!%QfaZCnlD-0X5^gj>6>Atx6`20FTCBA=t;r;E!`JblW6V#;l=x@5G*W)xz>c@7wg&Ir_ z{YD-XqJxLFEn;RI1{lXbWl9?I={Ne|^G*~o*sIS$eVXQ$^s%HliPSQy<j1ltg!Ua*BVTd zB@NSAAAKt^R}_06#h|rNPPip=NxvsGRqHX|r{Bo&TTZyANq2q5VF03o`YuO)pS}uB zv0_t!u+{7yMR3ru&4~hGs|m>?I_PMVAz>#M7!!0PrNS2KFPHjVO5Y>LxtESD>CXo3 zewQ-C`9`cu*Im;0HtG~a;sS&3!I}dEhWx4IBhKcY>QcEIOyzEnok7anGm+Cr;V{YKskAKXe)!Mjg`yU96SGH+YR3ZQX002ovPDHLkV1g$u1#AES diff --git a/applications/PoP/toolchain/tiles_room6/r2c3_14.png b/applications/PoP/toolchain/tiles_room6/r2c3_14.png deleted file mode 100644 index 48f4307f91974ecfed6ccf3a30048574889b6d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)1NUewiDUj)s5zSt6ROky&oYHK0d$T<@wQhPf_nBdsjQtzdzs&$#~<1eWErV95|>BdLfG$7?cT~o>L<5#9> z3F0o2@hZ0WV$$q2%qVmbjaMm|YZuJ*uAwp4GeHrQ##bYBl2IZk7TS)B7Qv+u zbqywoAZH*j2Lf{-Fb4v2Al$k@8R$zewkTn3WKIVzmm94ZKZ0-|2nT|2 zAP5J7a3B|vI-XODNP+6u0X4N;fz;HpBd8%df*Q9IL3QOybHV4w&`Q@3OCCSQQiCg! zQ?MHOF}4zSMc3}5YhbxhSGb(Mq&+B8RogN@#$W03TUWT}O1C`vt^=ix=C>~SWBkT6 zr4SB<4Og{$q{W8E6-R{)SGB~CSi@so88H|xENOVM3Y^M!DS1x?-klno>bqeRqyOny6Dii3_}V53X52;3bndk2oK9SC@*rz*O7?iW8_Z=S-Azi@+8^8WVet zqN7LzL&mG9z@>&K2NrdjmKvTM2%4rfJ5a;OZA_DIhU^5c4pbj7W5zVOX2_qw(d20z zexDns%#a3W2WlTMV@6LQCokTQ9d zViC-RqI-}ff|7wC90>QCC&>S*gzs$Q6IJy?Hq5!QBSfr||Hh{$$O-4aJw7a6=h1U|O#D zQZQ?Wg6H{F_qndWNY`f~lJc&`s!4$C88lfmnbe>zIQ3b@1vH}8I+R5kK%>ny{ZAPU zP@!p?A{h$~(6lWM5Xz#<;M6rY+7!c*Gr0H~44T2YPs$}Z_M}UIm9C`$L#6BG#xA%95Y^QfX3`-Q4LQBkx!bi*`XSq5E?X1sZXEI zOp|ShVx2w>3G=k32^%6#Gei~Uk$r|JC7jJ8Lv+lF_=0Ip9O=7GDeEm5)eubroSQ*~ zb`36D;FUoL0Od+fkQ(G{F1%~dSFRTX$s1O1BquqbON#(ht{O}&SaJ=zbOBVJzC?0E uf%P(UDkuveSo^cjX;lk2_4J2ZnCBZcXk2F7{zgy$0000}^(+4Q%s>DTu)tB1#@PgY6KFK_Jr?#4T&-R&i-sa@dwtL@e8=P(TVV6)k< zTH<{D>sZQz=4k;=h%Mt?R}@I~{ity*!d+hoR#Ll>kZlb(5S$YrSpc+Qm8AkzoE=ae z`~ab~-=s_$BeCtg^CeXfCe10~nJ=k=xg~Q~Fti2TDE`+QZTc-Z(#uRWyKrTz0`0nFf{A-d%!nj zNvRW@3+&e=hJi}Or@LW7*b0H20WU7ymzFMGNLh5k9AQh1$t1S5hglU)zW(yYrgKhHKjQM4NLZ!li==XdcXaxkHqE)49!~Aj%nMHu}d5xO-6#P2<$Jfq9 zoGPrMZ4G<-L3DbkB34qbl^LoBidusJXF7e2Q11k^We2RN&yMC)uvy3*L9+wq4Dqv7 zu;e;aAs?(QZrE9MKpy)fDJ^Arl6ZZvw0NK!YHL|af9hylPZGS;#WM+g79%8;83C#R z_6D3YG{poQIsqPc6B533Km84O2oB&8s-s z9J^5}IW+0dpWHgfZq#ls(?b)0&}#YMWTLs#Zao?>Mq;A5FXAn~uhOmx;yq9dP&g{> zsvzFgP3?}^rE>*Cdug@AX$5NsBcF5ym#l^@Tn&6IX$>k{CaHOux#5Gsw_By9EIzoX z-A?{jcifeJv45PFN#qC*4UKW_G#%bwSMYxlpcrv;g~s4s9Yz2ILs-~a=GfPe)C0fB)zKn@U?gX92vggwH-g$r_s0RaI4h6V!~7=-VZ#?vm1 zMvrc(WzS#bipLMlmtS(LTb`S@pTGV!8|n9-_vZEGIeLxSe+|u++9$qWeSOXsXuUf- zF$`nVb)EN|Er9Rj`SIiLP3ZhIJwz6jpMfwN!ad&4`zU1&#vpSY(v16DsBX7w z`n%c1Y7UkN;f#vMU`(kHL(%4AFr_xtIM+dd@8f1-n%Qq(lO=$033toE8Kd#=}_*OvXVQ1_!?l zCoLCliGwbr>zMsi)&R2|bagQoyJ5vQ#%w309dx@{AzaSj*Uq`p+z=scsgkD>ETCLC zW6<7{(JX)^;X+&2<~lbUG(&m;OX3&^bSV~Sc9C`lSn>rra4!ek^kCoLT||-vFqZlFtN(llh<=?uXYD*wAF_>2c zOf7p*N`Mj-g&CjRsk2mKfDo9|#U12MU$A!3#F?VHuB%=&v1bxD+wM+TwgIUT7ng*U zGJPSGQ7j7rp)7~A{KidaK@jc;7=p{qw6$7!X1BWum#+3n(FZH(Lwx`&owyKJFmlzMH9fV8JMqVvIF*i XQywM%1l&nU00000NkvXXu0mjfvZHB1 diff --git a/applications/PoP/toolchain/tiles_room6/r2c8_14.png b/applications/PoP/toolchain/tiles_room6/r2c8_14.png deleted file mode 100644 index abc0826fd20233b46e8cb92c782633731791e4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 625 zcmV-%0*?KOP)~5X6ox|%5`jP@&9N>^oJ0*4K1aTm6q_h`U$>hO!6@Wf2(4B2Y0}$sY?g(3ea)#B6{s zK|KfgR`{DHXlt4t9?^7pn99png{gNP5pP*GA)TrvblTOqbXPqhD>=LC|G|0W84< diff --git a/applications/PoP/toolchain/tiles_room6/r2c9_14.png b/applications/PoP/toolchain/tiles_room6/r2c9_14.png deleted file mode 100644 index a41d144bc4e22950281c9b8b5e5a74ed9c512b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!3HEVB2A+h7?=b+T^vIy<~*Ibu&miYr0xH` z<~a@u0#gM=Cs*&VJs_9ZZ(wO@xY6AqBqYQ|Nl8iI^KDM%Sx-wQI52%LnV+TE@;*jk zr~O@9JKOq1<+!-}f%5mul7FXMjchW$`BUYhiSKXK^Th?q#zjtV0;fFHQorKm_}c&d z-_3FBbgr$Lm!Q;m+NK14wl0B2|HLu*cx34M} z8m5Qp#iwu=b1t1Gbnf(pfQu?kha%^%XVr|a - -Заголовок записи = `<имя тега> — <дата тега> — <коммит тега>`. Коммит — -дереференс аннотированного тега (`*objectname`), то есть та ревизия, на -которой релиз собран: по ней воспроизводится ровно этот билд. - -Здесь только то, что видно ИГРОКУ или меняет способ сборки/запуска. -Разбор причин живёт в сообщениях коммитов, открытые баги — в -`docs/BUGS_OPEN.md`, закрытые — в архиве roomtest. - -Файл начат с релиза v0.9.6; более ранняя история — в `git log` и в -досках задач. - -## v0.9.6-hang-sound-button — 2026-09-02 — `aaa480d` - -Три бага, найденные в живой игре и проверенные в MAME после исправления. - -- **Зацеп срывался на следующем кадре** (регресс, тянулся с 4e12aa5). - Кид цеплялся за кромку, поза зацепа рисовалась — и он тут же падал. - Ловилось на длинном прыжке уровня 3 (комната 7) и в attract-демо, где - Кид вместо подъёма на кромку (0,2) улетал на пики. Причина: страж - «падения сквозь стену» принимал кладку под кромкой за стену, в которую - персонаж влетел, и отменял только что состоявшийся захват. Теперь - удачный зацеп отменяет этого стража. `38fb3c0` - -- **Непрерывный взмах клинка у безоружного Кида.** На подъёме шёл - нескончаемый свист меча, которого у Кида нет. Причина: в порт не - доехали два условия оригинала, включая гард, который автор SDLPoP - подписал прямым текстом как «фикс зацикленного звука взмаха». `cb995bf` - -- **Кнопка под Кидом заливалась кладкой** на дворцовых уровнях. Кид - подтягивается на открывающую кнопку, и кромка, которая его прячет, - нарисована кирпичом (уровень 4, комната 18). Причина: подстановка - спрайта «кнопка без пола слева» действует только в подземелье, и это - условие было потеряно в перерисовке поверх персонажа — при том что в - статической отрисовке комнаты оно есть. `8548aa9` - -Сопутствующее, для разработки: - -- В доске исправлено толкование звука 11: это индикатор ПРОМАХА, а не - «любого укола». Прежняя запись описывала наш собственный код вместо - оригинала, и из-за неё в CLIMB-VS-GUARD зря отодвинули версию про порог - дистанции. `400f5cb` -- Новый набор host-тестов `t_hang`: мерит не «вис наступил», а «вис - ДЕРЖИТСЯ» — прежние наборы регресс зацепа не видели именно поэтому. - Входит в `38fb3c0`. -- В `CLAUDE.md` записан путь запуска на HDD-образе: игра лежит в - `D:\GAMES\SPRPOP`, а не в корне диска. `aaa480d` diff --git a/applications/SprPoP/CLAUDE.md b/applications/SprPoP/CLAUDE.md deleted file mode 100644 index ac39351..0000000 --- a/applications/SprPoP/CLAUDE.md +++ /dev/null @@ -1,241 +0,0 @@ -# SprPoP — правила приложения - -Порт Prince of Persia (DOS/Apple II) на Sprinter Sp2000 поверх нашего -sprinter-cc / libc / libbgi. Действуют правила корневого `CLAUDE.md` -(сборка, libc, ABI, MAME-автотест); ниже — только специфика порта. -Общение и комментарии — на русском. - -Приложение **автономно**: код, оригинальные данные, конверторы и сборка -лежат внутри этой папки. Наружу оно знает ровно один путь — корень -тулчейна, `SPRINTER_ROOT` (по умолчанию `../..`). - -История: SprPoP выделен из `applications/PoP/roomtest` 2026-08-26. Та -папка ЗАМОРОЖЕНА и остаётся архивом (закрытые задачи и баги с разбором -корней — `../PoP/roomtest/TASKS_CLOSED.md` и `BUGS_CLOSED.md`; там же -исполненные планы в `../PoP/docs/`). Разработка идёт только здесь. - -## Главное правило: SDLPoP — источник истины. Сначала читай, потом кодь - -**`assets/orig/SDLPoP/src/` (github.com/NagyD/SDLPoP, GPLv3) — ЕДИНСТВЕННЫЙ -авторитетный источник того, как оригинальный движок это делает.** В -репозитории его нет: заполняется `make fetch` (`make fetch-check` — что уже -на месте). Правило без исключений: - -1. **Перед реализацией ЛЮБОЙ функции** (движение, коллизия, окклюзия, - падение, loose-полы, стражники, отрисовка, тайминги, любые числовые - константы) — СНАЧАЛА найди и прочитай соответствующий код в SDLPoP и - портируй по нему. Не пиши по памяти, не выводи логику «из общих - соображений», не угадывай значения — это источник багов, которые потом - ловятся в MAME часами. -2. **По любому вопросу «как в оригинале должно быть»** (что окклюдит что, - в каком порядке слои, когда меняется тайл, какая скорость/задержка, что - делает такой-то кадр анимации) — ответ ищи в SDLPoP, а не строй гипотезу. - Если не нашёл — это повод копать дальше в исходнике, а не додумывать. -3. Расхождение нашей реализации с SDLPoP — по умолчанию **баг у нас**, пока - не доказано обратное (наша платформа/ABI требует отличия — тогда явно - зафиксировать почему в комментарии **и записью в `docs/impl_diff.md`**: - что делает оригинал, что делаем мы, чем платим, что проверять при - регрессе). - -Карта сегментов: `seg005` control-диспетчер, `seg006` play_kid/коллизия/ -seqtbl, `seg007` mob/loose/падающие объекты, `seg008` отрисовка тайлов/ -слои/окклюзия, `seg009` чтение ресурсов. Слои окклюзии у нас = слои SDLPoP. -См. memory `pop_check_sdlpop_first`. - -Вторичные референсы (когда в SDLPoP непонятно или нужен другой ракурс) -лежат вне приложения, в `../PoP/`: `Prince-of-Persia-Apple-II/` — -оригинальный 6502-исходник 1989 (Мехнер), `PR/` — Princed Resources, -`mininim/` — независимая реализация. Все они — **справочник логики, -структур и констант**, но НЕ код для копирования (лицензии несовместимы, -наш ABI другой): читаем и переписываем под наш движок. - -## Доски - -**Что в работе сейчас — `docs/TASKS_OPEN.md`** (приоритеты, критерии -готовности). Баги — `docs/BUGS_OPEN.md` (только ОТКРЫТЫЕ). - -Правило разнесения: как только задача или баг закрыт — запись целиком -переезжает в архив roomtest (`../PoP/roomtest/TASKS_CLOSED.md` / -`BUGS_CLOSED.md`), а в открытом файле остаётся ссылка. Перед заведением -нового бага грепни архив по симптому: корень мог уже разбираться. -Открытые файлы обязаны читаться целиком за раз. - -**CHANGELOG. Ставишь релизный тег — добавь запись в `CHANGELOG.md`.** -Версия, дата И КОММИТ в заголовке берутся ИЗ GIT, руками не -проставляются: - - git for-each-ref \ - --format='%(refname:short) | %(creatordate:short) | %(*objectname:short)' \ - refs/tags/<тег> - -Заголовок = `<имя тега> — <дата> — <коммит>`. Коммит обязателен: тег -можно передвинуть или переименовать, а ревизия, на которой релиз собран, -должна оставаться в записи однозначно. Берётся именно `*objectname` -(дереференс аннотированного тега), а не `objectname` — последний вернёт -хеш самого объекта тега, а не коммита. - -В запись идёт только то, что видно ИГРОКУ или меняет сборку/запуск, — по -одному пункту «симптом -> причина одной фразой -> хеш коммита». Полный -разбор живёт в сообщении коммита, дублировать его сюда не надо. - -Индекс документации с отметками актуальности — **`docs/README.md`**, -начинать чтение оттуда. - -## Сборка и запуск - -``` -make собрать build/sprpop.exe и разложить build/ -make hdd + образ build/hdd/sprpop.chd -make mame-link однократно: подставить образ в MAME (см. ниже) -make -C tests/host модульные тесты движка под ucsim_z80 (секунды, без MAME) -make test-tools тесты упаковщиков на хосте (форматы, которые читает Z80) -make fetch скачать внешние данные в assets/orig/ (SDLPoP + музыка) -make resources перегенерировать ресурсы из assets/orig/ -make music-mp3 музыка из другого набора (flac|mp3|ogg|mt32) -make clean снести build/ (ассеты не трогает) -make distclean clean + снести assets/packed/ (вернуть — make resources) -``` - -`MEMORY=huge`, `--gfx 256`, 11 банков кода в W3. Отладочные ключи сборки: -`make LEVEL=9` (стартовый уровень), `make ROOM=15 POS=2` (стартовая комната -и тайл `row*10+col`), `make PROF=1` (профиль фаз кадра полосами бордюра), -`make ALLOCS=100000` (плотная упаковка регистров — для замеров размера). -Сравнивать занятость банков можно **только при одном `ALLOCS`**. - -**Ловушка `make mame-link`:** он подменяет `mame/v306/IMG/test_hdd.chd` -символьной ссылкой на наш образ. Пока ссылка стоит, `make hdd` любого -другого приложения (в т.ч. замороженной roomtest) писал бы через неё в -наш `build/hdd/` — если понадобится собрать чужой образ, ссылку сначала -убрать. - -## Раскладка папки - -| Папка | Что | -|---|---| -| `src/` | рукописный C: главный цикл `sprpop.c`, холодная половина `sprpop_cold.c`, движок `pop_*.c` | -| `gen/` | генерируемые заголовки (индексы архивов, таблицы кадров, шрифт, палитры). **Руками не править** — их печатают упаковщики; лежат в репозитории, потому что без них `src/` не собрать | -| `assets/orig/` | оригинальные данные (SDLPoP, записи музыки; MSDOS — необязательно). Вне репозитория — копирайт; вместо них в репозитории лежит `tools/fetch_orig.py`, который их качает (`make fetch`). Правила — в `assets/orig/README.md` | -| `assets/packed/` | то, что ложится на диск игры, уже в раскладке диска (`BG/`, `KID/`, …). В репозитории — иначе из чистого клона не собрать | -| `tools/` | конверторы ресурсов. Раскладку путей знает ОДИН файл — `tools/paths.py`; менять пути нужно там, а не в отдельных упаковщиках. Адреса ВНЕШНИХ источников — так же в одном: `tools/fetch_orig.py` | -| `docs/` | планы, доски, справочники; `docs/PoP/` — форматы ресурсов оригинала | -| `tests/host/` | модульные тесты движка под ucsim_z80 | -| `build/` | выход: `sprpop.exe`, каталоги ресурсов, `hdd/`, промежуточные `atl/` | - -Звуковые ЭФФЕКТЫ по умолчанию берутся из SDLPoP (`SND_SRC=sdlpop`) — сборка -обязана работать без оригинального дистрибутива DOS. У кого лежит -`assets/orig/MSDOS/`, включает его набор явно (`make SND_SRC=msdos`): там -оцифровка полнее — в SDLPoP пуст звук 48 `spiked` (насаживание на пики). -Разбор — `docs/sound_plan.md`. - -Музыка собирается из одного из четырёх наборов записей -(`assets/orig/PoP1_DOS_music/`): `flac` по умолчанию, плюс `mp3`, `ogg` и -`mt32` (исполнение Roland MT-32 — звучит иначе, длина треков другая). Набор -входит в имя stamp'а, поэтому `make music-mt32` пересобирает музыку сам, без -`-B`; разовая сборка без смены умолчания — `make MUSIC_FMT=ogg resources-music`. - -Ресурсы: упаковщик пишет промежуточные атласы в `build/atl/<набор>/`, из них -Makefile склеивает архивы прямо в `assets/packed/<КАТАЛОГ>/`, а `make` -копирует их в `build/`. Порядок файлов в списках `*_ATL` Makefile — это -порядок индексов внутри архива, и он же напечатан в `gen/*_arc.h`: менять -порядок нельзя, не перегенерировав заголовок. - -**Каноническая спецификация форматов `.DAT`** — -`docs/PoP/POP-DAT-FormatSpecifications.pdf` (грепаемая копия — `.txt`): -первоисточник Princed для DAT v1.0. Наши разборы -(`docs/PoP/MSDOS_RESOURCE_FORMAT.md`, `docs/PoP/APPLEII_RESOURCE_FORMAT.md`) — -практические заметки; при расхождении источник истины — спецификация. - -## Проверка в MAME - -Только через `toolchain/mame_interactive.py` или MCP-мост `mame-z80` -(memory `mame_autotest`, `mame_mcp_bridge`, `mame_hdd_test_disk`). -Пересобрал образ → MAME ОБЯЗАН полный рестарт (`mame_hdd_rebuild_restart`). - -**Игра лежит на образе в `D:\GAMES\SPRPOP\`**, а НЕ в корне диска (так с -обобщения HDD-сборки, коммит ea8efdb — один образ рассчитан на несколько -приложений). `dir D:\` показывает только каталог `GAMES`; запуск из корня -отвечает `Bad command or file name`. - -**Тайминги моста** (не ждать дольше, см. `docs/mame-autotest.md` §10): -старт `run_bridge.sh` → 6 с → `go` → 8 с → `keyseq d:{ENTER}` + -`keyseq cd games\sprpop{ENTER}` + `keyseq sprpop{ENTER}` → 5 с → -программа работает. - -Отладочные тумблеры в живой сессии (`src/sprpop.c`): **1** — заморозить -кадр, **2** — продолжить (разбор позы/окклюзии); **ESC** — выход. Читы -(`src/pop_cheat.h`): **K** — убить стража, **I** — бессмертие, -**Shift+L** — следующий уровень, **+/−** — обход комнат (`ROOMNAV`). -Не чит, а штатная клавиша оригинала: **Ctrl+S** — вкл/выкл звук (пурпурная -палочка в борте = звука нет). Целевая раскладка управления, к которой -подгоняем SprPoP, — `docs/keys.txt`. - -Логику, которую можно проверить без железа, покрывать в `tests/host/` -(обвязка — `testkit/`). MAME остаётся для отрисовки, банков, таймингов и -клавиатуры. - -## Модули - -| Файл | Роль (порт SDLPoP) | -|------|--------------------| -| `sprpop.c` | Главный цикл: дабл-буфер (2 страницы + флип на vsync), порядок tick→draw. | -| `sprpop_cold.c` | Холодная половина главного цикла (банк 8): старт уровня, отладочная навигация. | -| `pop_tile.c/.h` | Общие ЛИСТЬЯ слоя фона — РЕЗИДЕНТ W1: блит куска атласа, чтение тайла комнаты, `tile_table`, метка «фон трогали вот здесь» (`pop_cd_touch`). Резидент потому, что их зовут обе половины слоя фона из разных банков, а `const`-таблицы банка из чужого банка не видны. | -| `pop_bg.c/.h` | ГОРЯЧАЯ половина слоя фона (банк 2, каждый кадр): fore-окклюзия поверх ЛЮБОГО персонажа (`seg003` redraw_at_char/char2 — один проход на всех Char), оверлеи кромки, кладка стены (`wall_pattern`), клип. `pop_bg.h` — публичный API ВСЕГО слоя. | -| `pop_room.c` | ХОЛОДНАЯ половина слоя фона (банк 7, раз на комнату/событие): полная отрисовка комнаты (`seg008` draw_tile), точечные перерисовки тайлов (пики, ворота, кнопки, дверь уровня, дрожащие плиты), падающие куски loose (`seg007` mob), загрузка атласов. | -| `_pop_bg.h` | Внутренний контракт между половинами: общее состояние + три тонкие `__banked`-обёртки; там же почему рез прошёл именно здесь и сколько стоит. | -| `pop_kid.c/.h` | Анимация/движение: интерпретатор seqtbl `play_seq` + frame_table (`seg006`), окна `Char` (loadkid/loadshad), атласы Кида. | -| `pop_cdraw.c/.h` | ОТРИСОВКА персонажей — одна на всех Char (порт `add_kid_to_objtable`/`add_guard_to_objtable`): спрайт, clip_char, брызги, клинок, heal; полоса HP и палитры соперника. Там же ПРОПУСК неизменившегося кадра (`pop_char_skip_mask`). | -| `pop_ctrl.c/.h` | Управление: диспетчер `control()` (`seg005`) + ввод `read_user_control` (`seg006`) поверх ``. | -| `pop_sfx.c` + `pop_sfx_cold.c` | Звук: насос CBL в резиденте + холодная загрузка набора. Раскладка эффектов НЕ компилируется в EXE — читается с диска (`SND/snd.idx`, формат `PSI1`); см. `docs/sound_plan.md` §10. | -| `pop_music.c` | Музыка (банк 9): загрузка треков, кольцо для финальной темы. Длины и длительности — из `MUS/mus.idx` (EMM-страница + accessor `pop_music_info`), в EXE их нет; см. `docs/sound_plan.md` §11. | -| `pop_snd_tbl.h` + `pop_snd_data.c` | Тип записи набора и инварианты (рукописный заголовок) + резидентные `pop_snd_tbl`/`pop_snd_page`/`pop_snd_pages`. Размер записи 5 байт — часть дискового контракта, проверяется статически. | -| `pop_map.c/.h` | Коллизия с картой + физика падения/приземления/стены + loose-полы (`seg005/006/007`). | - -## Банки: две мины, которых компилятор не видит - -Обе стреляют молча, обе поймали нас 2026-08-27 (разбор — в -`../PoP/roomtest/BUGS_CLOSED.md`, поиск «FINAL-BANKCALL»). - -**1. Прямой вызов в чужой банк.** Трамплин SDCC выбирает по `__banked` -в ОБЪЯВЛЕНИИ, а не по тому, где функция лежит. Функция без пометки -зовётся прямым `call` — верно ровно пока вызывающий и вызываемый в одном -банке. Перенесли модуль ради разгрузки банка — и тот же `call` уходит в -пустой хвост чужого банка, процессор ползёт по 0xFF до 0x0000, DSS убивает -процесс. Ловит `toolchain/check_bank_calls.py`, она встроена в сборку и -ВАЛИТ её (проверено намеренной поломкой). - -**2. Указатель на данные своего банка, отданный в чужой.** Обратная -сторона: пока обе стороны в одном банке, указатель на литерал или -const-таблицу работает; пометили функцию `__banked` — и трамплин на время -вызова переключает W3, а указатель показывает уже в чужой банк. Так экран -таблицы рекордов залило знаками вопроса: в `pop_text_draw_mapped` (банк 9) -уходил литерал `"_"` из банка 10. - -**Правило:** всё, что уходит указателем в другой банк, обязано лежать в -W2 — стек, `_DATA` или копия. `const`-таблицы и строковые литералы -банкового модуля наружу отдавать нельзя (то же, что уже записано про -`pop_tile.c`). Вторая проверка скрипта предупреждает о явных случаях, но -она эвристическая и гарантией не является. - -## Порядок слоёв в кадре (важно для окклюзии) - -`sprpop.c` каждый тик рисует в СКРЫТУЮ страницу: `pop_char_heal` (стереть -прошлый кадр — по слоту на персонажа) → `kid_tick` → `pop_phys_tick` → -`pop_loose_tick` (loose СЛОЙ ФОНА — ДО персонажей, чтобы они были поверх -плиты) → `pop_char_draw`/`pop_char_fore` для соперника и Кида (кто позже — -тот поверх, порядок задаёт обход тайлов) → `pop_room_clip_borders` (чистка -бортов, гейт по флагу — только в кадрах падения) → флип на vsync. - -**Дабл-буфер:** у каждой страницы своя видео-ОЗУ и теневая ОЗУ-копия; heal -берёт чистый фон из копии ТОЙ страницы, в которую рисуем. Любой -динамический элемент (Kid, loose-плита, падающий кусок) обязан чистить свой -прошлый кадр на КАЖДОЙ из двух страниц — иначе остаток виден через кадр как -**мерцание**. Типовой источник багов «остаётся кусочек» (memory -`pop_fall_debug_baseline`). - -## Ключевые memory - -`pop_port_project`, `pop_check_sdlpop_first`, `pop_banking_architecture`, -`pop_background_strategy`, `pop_kid_plan`, `pop_hang_state`, `pop_fore_layer`, -`pop_fall_debug_baseline`, `accel_vertical_copy`, `kbd_raw_fifo_drain`, -`pop_perf_registry`. diff --git a/applications/SprPoP/LICENSE b/applications/SprPoP/LICENSE deleted file mode 100644 index a738358..0000000 --- a/applications/SprPoP/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/SprPoP/Makefile b/applications/SprPoP/Makefile deleted file mode 100644 index 14abc9b..0000000 --- a/applications/SprPoP/Makefile +++ /dev/null @@ -1,624 +0,0 @@ -# SprPoP — порт Prince of Persia на Sprinter Sp2000. -# -# Приложение АВТОНОМНО: весь код, все исходные ресурсы, все конверторы лежат -# здесь. Наружу оно знает ровно один путь — корень тулчейна sprinter-cc: -# -# export SPRINTER_ROOT=/путь/к/C-Compiler -# make -# -# Без переменной берётся ../.. (раскладка applications/SprPoP внутри дерева -# компилятора), так что в родном дереве ничего настраивать не надо. -# -# Раскладка: -# src/ рукописный C -# gen/ генерируемые заголовки (в репозитории: без них src/ не -# собрать, а генератору нужны оригиналы из assets/orig/) -# assets/orig/ оригинальные данные — SDLPoP, MSDOS, записи музыки. -# НЕ в репозитории (копирайт), см. assets/orig/README.md -# assets/packed/ то, что ложится на диск игры, в раскладке диска -# tools/ конверторы ресурсов -# build/ ВЫХОД: sprpop.exe + BG/ KID/ ... + hdd/sprpop.chd -# -# Основные цели: -# make собрать sprpop.exe и разложить build/ -# make hdd + образ build/hdd/sprpop.chd -# make run-hdd запустить MAME с локальным образом игры -# make resources перегенерировать ресурсы из assets/orig/ -# make music-mp3 музыка из другого набора записей (flac|mp3|ogg|mt32) -# make clean снести build/ (ассеты не трогает) -# make distclean clean + снести упакованные ассеты assets/packed/ - --include $(CURDIR)/local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(CURDIR)/../../bin/sprinter-cc),$(abspath $(CURDIR)/../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT или создайте SprPoP/local.mk) -endif -PROJ_ROOT := $(SPRINTER_ROOT) -export SPRINTER_ROOT MAME_HOME MAME_BIN MAME_ROMPATH MAME_DSS_IMAGE -export MAME_SYSTEM_HDD_IMAGE MAME_BIOS CHDMAN_BIN -EXAMPLE := sprpop -SRC_DIR := src -BUILD_DIR := build - -# huge: small-раскладка (CODE в W1, DATA в W2) + банки кода в W3. -MEMORY ?= huge -# --max-allocs-per-node: во сколько вариантов размещения регистров упирается -# SDCC на узел. Дефолт sprinter-cc (100000) на модулях такого размера — это -# МИНУТЫ на банк. 6000 — компромисс: сборка дольше секунд на двадцать, зато -# резидент W1 худеет примерно на 150 байт против дефолтных 3000 SDCC, а это -# ровно те байты, которых не хватает куче. -# -# make — обычная сборка (ALLOCS=6000) -# make ALLOCS=100000 — минимальный код, для замеров размера и релиза -# -# ВАЖНО: сравнивать занятость банков можно только при ОДНОМ ALLOCS — иначе -# сравниваются не правки, а уровни оптимизации. -ALLOCS ?= 10000 -# Build info не хранится в C: ID и дата извлекаются из текущего commit. -BUILD_ID ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo dev) -BUILD_DATE ?= $(shell git log -1 --format=%cs 2>/dev/null || echo unknown) -BUILD_FLAGS := -DPOP_BUILD_ID=\"$(BUILD_ID)\" -DPOP_BUILD_DATE=\"$(BUILD_DATE)\" - -# --------------------------------------------------------------------------- -# Банковая раскладка -# --------------------------------------------------------------------------- -# Единственный список банковых исходников: из него строятся И ключи -# sprinter-cc, И зависимости sprpop.exe. Держать два списка нельзя — так уже -# ловили stale-бинарник (модуль компилировался, но make не замечал правок). -# -# Банк 2 = отрисовка (pop_bg + pop_cdraw в соседних банках): вызовы банк→банк -# работают, трамплин сохраняет страницу окна на СТЕКЕ. Резидента --w3 нет. -# Банк 5 = pop_ctrl.c: кандидат выбран не по размеру, а по частоте вызова — -# диспетчер управления дёргается раз в кадр на персонажа и горячих банк→банк -# переходов не создаёт (в отличие от pop_level, чей pop_level_tile зовётся из -# банка 2 на КАЖДЫЙ тайл). -# Банк 9 = оболочка (menu/settings/config/font, автомат, title, attract-demo, -# таблица рекордов) — мелкие редкие точки входа, но не рендеры заставок. -# Банк 10 = единственный владелец экранных палитр/fade; отделён от UI, потому -# что его зовут и игровой lifecycle, и все ветки катсцен. -# Банк 11 = тяжёлая кинематика заставок, чтобы анимации не вытесняли -# menu/config из банка оболочки. -BANK1_SRCS := guards.c -BANK2_SRCS := pop_bg.c -BANK3_SRCS := pop_map.c -BANK4_SRCS := pop_cdraw.c pop_kdraw.c -BANK5_SRCS := pop_ctrl.c pop_tile_cold.c -BANK6_SRCS := pop_trob.c -BANK7_SRCS := pop_room.c pop_redraw.c -BANK8_SRCS := sprpop_cold.c pop_arc.c pop_level_cold.c pop_kboot.c pop_guard_cold.c \ - pop_shadow.c pop_sfx_cold.c pop_qsave.c pop_qsave_coldio.c \ - pop_level_qsave.c -BANK9_SRCS := pop_menu.c pop_status.c pop_music.c pop_app.c pop_timer.c \ - pop_ui.c pop_title.c pop_demo.c pop_flow.c -# Банк 10 = палитры + РЕДКОЕ С ФАЙЛАМИ. pop_config (POP.CFG) и pop_hof -# (POP.HOF) переехали сюда из банка 9, когда тот дошёл до 98,5% (247 байт -# свободно). Критерий тот же, что и у остальной раскладки, — частота, а не -# размер: обе вещи работают раз за партию и упираются в диск, где `open` -# стоит 51 мс, так что трамплин банк→банк на их фоне не существует. -# Отдельный банк для этого не нужен: в десятом лежал один pop_pal.c на -# 485 байт, то есть 3% страницы. -BANK10_SRCS := pop_pal.c pop_config.c pop_hof.c pop_path_bank.c -BANK11_SRCS := pop_cutscene.c pop_intro.c -BANK_NUMS := 1 2 3 4 5 6 7 8 9 10 11 -BANKED_SRCS := $(foreach n,$(BANK_NUMS),$(BANK$(n)_SRCS)) -BANK_FLAGS := $(foreach n,$(BANK_NUMS),\ - $(foreach f,$(BANK$(n)_SRCS),--bank $(n)=$(SRC_DIR)/$(f))) - -# Модули резидента (кроме sprpop.c — его подставляет app.mk). -EXTRA_SRCS := $(addprefix $(SRC_DIR)/,pop_vflip.c pop_pace.c pop_sfx.c pop_state.c \ - pop_snd_data.c \ - pop_draw.c pop_tile.c pop_kid.c pop_level.c pop_geom.c pop_guard.c \ - pop_qsave_io.c) - -# --------------------------------------------------------------------------- -# Отладочные ключи -# --------------------------------------------------------------------------- -# Профилирование полосами бордюра (PROF() в sprpop.c): каждая фаза кадра красит -# бордюр в свой цвет, высота полосы на скриншоте MAME = время фазы в строках. -PROF ?= 0 -PROF_FLAGS := -DPROF_BORDER=$(PROF) -# Стартовый уровень: make LEVEL=9 — начать сразу с девятого. -LEVEL ?= 1 -PROF_FLAGS += -DFIRST_LEVEL=$(LEVEL) -# Стартовая КОМНАТА и позиция Кида: make ROOM=15 POS=2 — начать прямо в -# целевой комнате, минуя проход уровня. POS — тайл 0..29, то есть row*10+col. -# make ROOM= (пусто) возвращает штатный старт из данных уровня. -ROOM ?= -POS ?= 2 -ifneq ($(strip $(ROOM)),) -PROF_FLAGS += -DDBG_START_ROOM=$(ROOM) -DDBG_START_POS=$(POS) -endif - -EXTRA_FLAGS ?= --gfx 256 -I $(CURDIR)/gen -I $(CURDIR)/$(SRC_DIR) \ - --max-allocs $(ALLOCS) $(BANK_FLAGS) $(PROF_FLAGS) $(BUILD_FLAGS) - -# --------------------------------------------------------------------------- -# Ресурсы: что уходит на диск -# --------------------------------------------------------------------------- -# assets/packed/<КАТАЛОГ>/ повторяет раскладку диска (8.3, как в DSS), поэтому -# отдельного списка «файл → каталог образа» больше нет: каталог виден из пути. -PACKED := assets/packed -ATL := $(BUILD_DIR)/atl - -# Промежуточные атласы (в build/atl, в репозиторий не идут) — из них -# упаковщик архивов склеивает то, что реально ложится на диск. Порядок в -# списках = порядок индексов внутри архива, а их упаковщик печатает в gen/*.h; -# менять порядок нельзя, не перегенерировав заголовок. -BG_SETS := pop pal -BG_PAGES := 0 1 2 3 4 5 6 7 8 9 -BG_ATL := $(foreach s,$(BG_SETS),\ - $(foreach n,$(BG_PAGES),$(ATL)/bg/$(s)_env$(n).atl) \ - $(ATL)/bg/$(s)_wall.atl $(ATL)/bg/$(s)_fore.atl) \ - $(ATL)/bg/pop_pot.atl -# ВСЕ 28 страниц Kid — иначе кадры торможения/разворота/приседа (image>23) не -# рисуются. Плюс зеркальный ПО ВЕРТИКАЛИ набор (зелье инверсии, уровень 9): -# разворот готовит упаковщик, а не рантайм — страница разворачивается 0,59 с -# против 0,045 с на её чтение с диска. -KID_N := 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 -KID_ATL := $(foreach n,$(KID_N),$(ATL)/kid/kid$(n).atl) \ - $(foreach n,$(KID_N),$(ATL)/kid/kid$(n)_v.atl) \ - $(ATL)/kid/sword.atl $(ATL)/kid/sword_v.atl -GUARD_ATL := $(foreach n,0 1 2 3 4,$(ATL)/guard/g$(n).atl) \ - $(foreach n,0 1 2 3 4,$(ATL)/guard/g$(n)_v.atl) -# Скелет — ОТДЕЛЬНЫЙ набор (SKEL.DAT), его грузит уровень 3; кадров меньше. -# Зеркального набора у него нет: зелье инверсии — уровень 9, там обычный страж. -SKEL_ATL := $(foreach n,0 1 2 3,$(ATL)/skel/g$(n).atl) -# Джафар (VIZIER.DAT) — уровень 13; кадров столько же, сколько у стража, но -# палитра своя, из файла набора. -VIZIER_ATL := $(foreach n,0 1 2 3 4,$(ATL)/vizier/g$(n).atl) -# ТЕНЬ — набор, запечённый упаковщиком (наложение спрайта на себя со сдвигом; -# наш блит так не умеет). sk* — кадры вне боя, sf* — кадры 150..189. -SHADOW_ATL := $(foreach n,$(KID_N),$(ATL)/shadow/sk$(n).atl) \ - $(foreach n,0 1 2 3,$(ATL)/shadow/sf$(n).atl) -# Звук: оригинальная оцифровка на частоте CBL (10 937,5 Гц, 8 бит моно). -# Число файлов задаёт упаковщик (POP_SND_PAGES в gen/pop_sound_tbl.h) — -# список ОБЯЗАН совпадать: недостающий файл это молча пропавшие эффекты. -# Страниц звука СТАТИЧЕСКИ НЕ ПОСЧИТАТЬ: их число зависит от источника -# (SDLPoP даёт 9, MSDOS — 10, см. SND_SRC). Поэтому списка s0..sN здесь нет, -# а архив зависит от stamp'а упаковщика и берёт страницы из каталога уже -# после того, как тот отработал (см. правило SND/snd.arc ниже). -TITLE_ATL := $(foreach s,0 1 2 3,$(foreach p,0 1 2 3 4,$(ATL)/title/t$(s)_$(p).atl)) -# PV/INTRO: story и стадии режутся на полосы; у настоящего PV intro есть ещё -# чистый фон b0_* и шесть <=16K actor-атласов — они остаются в EMM на время -# сцены, а не перечитывают полный 320x200 кадр с диска. -PV_ATL := $(foreach s,0 1 2 3 4 5,$(foreach p,0 1 2 3 4,$(ATL)/pv/s$(s)_$(p).atl)) \ - $(foreach s,0 1 2 3 4 5 6 7,$(foreach p,0 1 2 3 4,$(ATL)/pv/p$(s)_$(p).atl)) \ - $(foreach p,0 1 2 3 4,$(ATL)/pv/b0_$(p).atl) \ - $(ATL)/pv/a0.atl $(ATL)/pv/a1.atl $(ATL)/pv/a2.atl \ - $(ATL)/pv/j0.atl $(ATL)/pv/j1.atl $(ATL)/pv/j2.atl \ - $(ATL)/pv/h0.atl $(ATL)/pv/t0.atl - -# МУЗЫКА: записи DOS-версии в формате CBL. Номера — оригинала, чтобы игровой -# код просил трек тем же числом, каким SDLPoP зовёт play_sound. -# заставка 54 55 50 53 52 | катсцены 26 27 35 36 40 -# игра 24 25 28 29 30 32 33 37 39 41 43 | 56 = won (стриминг с диска) -MUS_IDS := 24 25 26 27 28 29 30 32 33 35 36 37 39 40 41 43 50 52 53 54 55 56 -# Набор записей, из которого делается музыка: flac (по умолчанию — лучший -# исходник), mp3, ogg, mt32 (то же в исполнении Roland MT-32). Все четыре -# лежат в assets/orig/PoP1_DOS_music/, имена треков совпадают. -# Формат входит в имя stamp'а, поэтому смена MUSIC_FMT сама по себе делает -# музыку устаревшей — принудительная пересборка не нужна. -MUSIC_FMT ?= flac -# Источник оцифрованных ЭФФЕКТОВ (digisnd1..3): sdlpop (умолчание) или msdos. -# Умолчание — SDLPoP, потому что он выкачивается автоматически (`make fetch`) -# и сборка обязана работать вообще без оригинального дистрибутива DOS. -# Наборы НЕ одинаковы: в MSDOS оцифровка полнее (в SDLPoP `spiked` (48) -# фактически пустой, `sword_vs_sword` (10) короче — разбор в -# docs/sound_plan.md). У кого дистрибутив есть — `make SND_SRC=msdos`. -# Источник входит в имя stamp'а, поэтому смена SND_SRC сама делает звук -# устаревшим, как и смена MUSIC_FMT. -SND_SRC ?= sdlpop -# res2000 — attract-demo; res2001..res2014 — штатная игра. res2015 (copy -# protection) намеренно не пакуется и не существует в маршруте загрузчика. -LVL_NUMS := 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 - -# ЕДИНСТВЕННЫЙ список того, что ложится на диск. Из него выводятся и -# staging в build/, и аргументы упаковщика образа. -# Архивы вместо россыпи файлов не ради места: замер 2026-08-25 — `open` 51,4 мс -# против 32,6 мс на чтение 16 КБ, то есть на одних открытиях набор Кида терял -# три секунды. Четыре архива актёров, а не один: имена внутри наборов -# совпадают (g0.atl есть и у стража, и у скелета, и у Джафара), а константы -# индексов упаковщик делает из имени файла. -# README для игрока идёт НА ДИСК рядом с программой, В КОРЕНЬ. Русский -# обязан быть в CP866: DSS и любой местный просмотрщик читают именно её, -# UTF-8 покажется кракозябрами. Имена по 8.3, язык — суффиксом, а не -# расширением: расширение .TXT должно остаться, чтобы файл открывался -# просмотрщиком как текст. -DISK := README_E.TXT README_R.TXT \ - BG/bg.arc BG/pop_tile.pal BG/pal_tile.pal \ - KID/kid.arc KID/kid.pal KID/kid.ani \ - GUARD/guard.arc SKEL/skel.arc VIZIER/vizier.arc SHADOW/shadow.arc \ - SND/snd.arc SND/snd.idx \ - $(foreach i,$(MUS_IDS),MUS/m$(i).bin) MUS/mus.idx \ - FONT/font.atl \ - TITLE/title.arc TITLE/title.pal \ - PV/pv.arc PV/story.pal PV/pv.pal \ - $(foreach n,$(LVL_NUMS),LEVELS/res20$(n).bin) - -# Все шестнадцать генерируемых заголовков перечислены явно, а не wildcard'ом: -# список — это и зависимость exe, и то, что умеет чинить себя само. -GEN_ARC_H := bg_arc.h kid_arc.h guard_arc.h skel_arc.h vizier_arc.h \ - shadow_arc.h title_arc.h pv_arc.h -# pop_sound_tbl.h здесь БОЛЬШЕ НЕТ: раскладка эффектов уехала на диск -# (SND/snd.idx), и EXE от звукового набора не зависит — пару -# snd.idx + snd.arc можно менять без перекомпиляции. -# Ни звукового, ни музыкальных заголовков здесь БОЛЬШЕ НЕТ: раскладка -# эффектов и длины треков уехали на диск (SND/snd.idx, MUS/mus.idx), и EXE -# не зависит ни от звукового набора, ни от набора записей. -GEN_H := $(addprefix gen/,$(GEN_ARC_H) pop_bg_atlas.h kid_data.h \ - pop_guard_pal.h pop_shadow_atlas.h pop_font.h) - -PACKED_FILES := $(addprefix $(PACKED)/,$(DISK)) -STAGED := $(addprefix $(BUILD_DIR)/,$(DISK)) - -EXTRA_DATA := $(STAGED) -# Запись вида КАТАЛОГ:файл кладёт файл в подкаталог HDD_DEST_DIR, голый путь — -# непосредственно в HDD_DEST_DIR. Проверка на слэш ОБЯЗАТЕЛЬНА: без неё -# `README_E.TXT` превращался -# в `README_E.TXT:build/README_E.TXT`, то есть упаковщик заводил каталог с -# именем файла и клал файл внутрь него (поймано пользователем на готовом -# образе). -HDD_PACK_ARGS := $(BUILD_DIR)/$(EXAMPLE).exe \ - $(foreach f,$(DISK),$(if $(findstring /,$(f)),\ - $(word 1,$(subst /, ,$(f))):$(BUILD_DIR)/$(f),\ - $(BUILD_DIR)/$(f))) -# Всё дерево SprPoP лежит рядом с EXE, но не меняет дефолт глобального -# упаковщика: остальные приложения по-прежнему попадают в корень HDD. -HDD_DEST_DIR := games/sprpop -# Образ живёт в build/; run-hdd передаёт его MAME напрямую как hard2. -HDD_IMG := $(CURDIR)/$(BUILD_DIR)/hdd/$(EXAMPLE).chd - -include $(PROJ_ROOT)/app.mk - -# --------------------------------------------------------------------------- -# Сборка приложения -# --------------------------------------------------------------------------- -# sprinter-cc собирает все модули одним вызовом и depfile не выдаёт, поэтому -# зависимости перечисляем сами. wildcard по заголовкам намеренно широкий: -# цена лишней полной сборки ниже риска получить stale-бинарник. -HEADERS := $(wildcard $(SRC_DIR)/*.h) -# ОТПЕЧАТОК КЛЮЧЕЙ СБОРКИ. LEVEL/ROOM/POS/PROF/ALLOCS — это -D на входе -# компилятора, а не файлы, и make их «не видит»: после `make LEVEL=14` -# обычный `make` считал бы отладочный бинарь свежим и молча оставил его. -# Поэтому ключи пишутся в файл, и exe зависит от него; меняется строка — -# перелинковка. Файл переписывается ТОЛЬКО при изменении, иначе каждый -# make дёргал бы полную сборку заново. -BUILD_SIG := MEMORY=$(MEMORY) ALLOCS=$(ALLOCS) $(PROF_FLAGS) $(BANK_FLAGS) -BUILD_STAMP := $(BUILD_DIR)/.buildflags -# Отпечаток обновляется НА РАЗБОРЕ Makefile, а не рецептом. Так время файла -# уже верное к моменту, когда make сверяет его с exe — иначе не работает ни -# один из простых вариантов: -# * рецепт с cmp — под `make -n` не выполняется, и make врёт про работу; -# * подпись в имени файла — при ВОЗВРАТЕ к прежним ключам файл уже лежит -# и оказывается старше exe, то есть перелинковки не будет. -# Запись идёт только при отличии, поэтому обычный make ничего не трогает. -# На целях очистки пропускаем, чтобы `make clean` не создавал build/ заново. -ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) -$(shell mkdir -p $(BUILD_DIR); printf '%s\n' '$(BUILD_SIG)' | cmp -s - $(BUILD_STAMP) \ - || printf '%s\n' '$(BUILD_SIG)' > $(BUILD_STAMP)) -endif - -# Цепочка: exe -> gen/*.h -> ресурсы -> упаковщик -> assets/orig (см. ниже). -$(EXE): Makefile $(PROJ_ROOT)/app.mk $(addprefix $(SRC_DIR)/,$(BANKED_SRCS)) \ - $(HEADERS) $(GEN_H) $(BUILD_STAMP) - -# Полная сборка = exe + разложенный build/. -all: stage - -# --------------------------------------------------------------------------- -# staging: assets/packed/ -> build/ -# --------------------------------------------------------------------------- -# build/ обязан быть самодостаточным (его можно снести целиком), поэтому -# ресурсы именно КОПИРУЮТСЯ, а не берутся с диска из assets/. -stage: $(STAGED) - -$(BUILD_DIR)/%: $(PACKED)/% - @mkdir -p $(dir $@) - @cp $< $@ -# --------------------------------------------------------------------------- -# Ресурсы: цепочка зависимостей -# --------------------------------------------------------------------------- -# Направление одно и сквозное: -# -# build/sprpop.exe -> gen/*.h -> архивы и атласы -> упаковщик -> assets/orig/ -# -# Код зависит от генерируемых заголовков, заголовки — от ресурсов, которые они -# описывают (индексы внутри .arc, число страниц звука, таблицы кадров), а те — -# от упаковщика и оригиналов. Поэтому собрать код против устаревших констант -# нельзя: gen/*.h делаются ТЕМ ЖЕ запуском упаковщика, что и сам ресурс, и -# объявлены его целями наравне с ним. -# -# Правила генерации живут в ветке GENERATE=1 и включаются в двух случаях: -# * явная цель `make resources*` — перегенерация с учётом таймстемпов -# (поправил упаковщик — ресурс пересоберётся); -# * какого-то ресурса или заголовка НЕТ на месте (после `make distclean`, -# либо файл снесли руками) — тогда обычный `make` сам уходит в -# рекурсивный вызов и доделывает недостающее вместе с его gen/*.h. -# -# Почему не одни таймстемпы на все случаи: assets/packed/ и gen/ лежат в -# репозитории, а git не сохраняет времена файлов — в свежем клоне упаковщик -# и его выхлоп получают одинаковую метку, и любое сравнение по времени -# превращается в лотерею «перепаковать 6 МБ ресурсов на ровном месте, причём -# на машине, где assets/orig/ может вообще не быть». Отсутствие файла — -# признак однозначный, и именно на нём построена автоматика. -TOOLS := $(CURDIR)/tools -PY := python3 - -ifeq ($(GENERATE),1) -# =========================================================================== -# Ветка генерации -# =========================================================================== -STAMP := $(BUILD_DIR)/.stamps -$(STAMP): - @mkdir -p $@ - -# Упаковщики создают сразу ГРУППУ файлов. Обычное multi-output правило -# заставляет make при `-B` запускать один и тот же упаковщик отдельно для -# каждого выходного файла. Stamp представляет ОДИН запуск генератора; все -# созданные им файлы зависят от stamp без собственных рецептов. -# -# check-orig — order-only: без оригиналов запускать упаковщик бессмысленно, и -# понятное сообщение лучше трейсбека Python. На «устарел ли stamp» он не -# влияет, только выполняется раньше. -define stamp_rule -$(STAMP)/$(1): $(2) | $(STAMP) check-orig - cd $(TOOLS) && $(PY) $(3) - @touch $$@ -endef - -# ВАРИАНТЫ РЕСУРСА (источник звука SND_SRC, набор записей MUSIC_FMT). Оба -# варианта пишут в ОДИН выход — build/atl/sound, build/atl/music, — поэтому -# одного stamp'а на вариант мало: вернувшись к прежнему варианту, make видит -# его stamp свежим и не делает НИЧЕГО, а в выходе лежит чужое (поймано на -# sdlpop -> msdos -> sdlpop: заголовок остался с 10 страницами вместо 9). -# Лечится файлом с именем текущего варианта: он переписывается только при -# смене (cmp), а его свежесть делает stamp устаревшим. -.PHONY: variant-check -variant-check: ; -# СМЕНА ВАРИАНТА СНОСИТ STAMP'Ы СВОЕГО СЕМЕЙСТВА, а не полагается на то, -# что make заметит свежесть variant-файла. Причина — секундная -# гранулярность mtime: упаковка укладывается в одну секунду с записью -# variant, и stamp того же имени считается актуальным. Возврат к прежнему -# варианту (`sdlpop -> msdos -> sdlpop`) тогда ТИХО оставлял чужой набор. -# Нет файла — правило обязано выполниться, и время тут ни при чём. -define variant_rule -$(STAMP)/$(1).variant: variant-check | $(STAMP) - @echo "$(2)" | cmp -s - $$@ || { echo "$(2)" > $$@; rm -f $(STAMP)/$(1)-*; } -endef -$(eval $(call variant_rule,sound,$(SND_SRC))) -$(eval $(call variant_rule,music,$(MUSIC_FMT))) - -$(eval $(call stamp_rule,bg,$(TOOLS)/pop_pack_bg.py $(TOOLS)/render_room.py $(TOOLS)/paths.py,pop_pack_bg.py dungeon && $(PY) pop_pack_bg.py palace)) -$(eval $(call stamp_rule,kid,$(TOOLS)/pop_pack_kid.py $(TOOLS)/pop_pack_bg.py $(TOOLS)/paths.py,pop_pack_kid.py)) -$(eval $(call stamp_rule,kid-bin,$(TOOLS)/pop_extract_kid_data.py $(TOOLS)/paths.py,pop_extract_kid_data.py)) -$(eval $(call stamp_rule,guard,$(TOOLS)/pop_pack_guard.py $(TOOLS)/paths.py,pop_pack_guard.py)) -$(eval $(call stamp_rule,skel,$(TOOLS)/pop_pack_guard.py $(TOOLS)/paths.py,pop_pack_guard.py SKEL)) -$(eval $(call stamp_rule,vizier,$(TOOLS)/pop_pack_guard.py $(TOOLS)/paths.py,pop_pack_guard.py VIZIER)) -$(eval $(call stamp_rule,shadow,$(TOOLS)/pop_pack_shadow.py $(TOOLS)/pop_pack_bg.py $(TOOLS)/pop_pack_kid.py $(TOOLS)/paths.py,pop_pack_shadow.py)) -# ЗВУК — ОСОБЫЙ СЛУЧАЙ: упаковка, сборка архива и копия индекса делаются -# ОДНИМ рецептом, а не тремя правилами через таймстемпы. -# -# Почему. Упаковщик и копирование укладываются в одну секунду, а make -# сравнивает mtime с секундной гранулярностью: цель, сделанная в ту же -# секунду, что и её зависимость, считается актуальной. При смене SND_SRC -# это давало ТИХО НЕВЕРНЫЙ результат — `sdlpop -> msdos -> sdlpop` -# перепаковывал build/atl, но в assets/packed оставался прежний набор -# (10 страниц вместо 9; поймано 2026-08-31, с паузой в секунду не -# воспроизводится). Внутри одного рецепта сравнивать нечего. -$(STAMP)/sound-$(SND_SRC): $(TOOLS)/pop_pack_sound.py $(TOOLS)/pop_idx.py \ - $(TOOLS)/paths.py $(TOOLS)/pop_pack_arc.py \ - $(STAMP)/sound.variant | $(STAMP) check-orig - cd $(TOOLS) && $(PY) pop_pack_sound.py --source $(SND_SRC) - @mkdir -p $(PACKED)/SND - $(ARC) $(PACKED)/SND/snd.arc $$(ls $(ATL)/sound/s*.bin | sort -V) - @cp $(ATL)/sound/snd.idx $(PACKED)/SND/snd.idx - @touch $@ -$(eval $(call stamp_rule,music-$(MUSIC_FMT),$(TOOLS)/pop_pack_music.py $(TOOLS)/pop_idx.py $(TOOLS)/paths.py $(STAMP)/music.variant,pop_pack_music.py --format $(MUSIC_FMT) $(MUS_IDS))) -$(eval $(call stamp_rule,font,$(TOOLS)/pop_extract_font.py $(TOOLS)/paths.py,pop_extract_font.py)) -$(eval $(call stamp_rule,title,$(TOOLS)/pop_pack_title.py $(TOOLS)/paths.py,pop_pack_title.py)) -$(eval $(call stamp_rule,pv,$(TOOLS)/pop_pack_intro.py $(TOOLS)/paths.py,pop_pack_intro.py)) - -# Файл, сделанный упаковщиком, зависит только от stamp. Если stamp свежий, а -# файла нет (снесли руками, либо build/ вычистили) — перезапускаем генератор -# принудительно. Заголовки gen/, которые упаковщик печатает попутно, стоят в -# ТЕХ ЖЕ списках: это и есть «gen зависит от ресурсов, для которых сделан». -define from_stamp -$(1): $(STAMP)/$(2) - @test -f $$@ || { $(MAKE) GENERATE=1 -B $(STAMP)/$(2); test -f $$@; } -endef -$(eval $(call from_stamp,$(BG_ATL) $(ATL)/bg/pop_tile.pal $(ATL)/bg/pal_tile.pal gen/pop_bg_atlas.h,bg)) -$(eval $(call from_stamp,$(KID_ATL) $(ATL)/kid/kid.pal,kid)) -$(eval $(call from_stamp,$(ATL)/kid/kid.ani gen/kid_data.h,kid-bin)) -$(eval $(call from_stamp,$(GUARD_ATL) gen/pop_guard_pal.h,guard)) -$(eval $(call from_stamp,$(SKEL_ATL),skel)) -$(eval $(call from_stamp,$(VIZIER_ATL),vizier)) -$(eval $(call from_stamp,$(SHADOW_ATL) gen/pop_shadow_atlas.h,shadow)) -$(eval $(call from_stamp,$(foreach i,$(MUS_IDS),$(ATL)/music/m$(i).bin) $(ATL)/music/mus.idx,music-$(MUSIC_FMT))) -$(eval $(call from_stamp,$(ATL)/font/font.atl gen/pop_font.h,font)) -$(eval $(call from_stamp,$(TITLE_ATL) $(ATL)/title/title.pal,title)) -$(eval $(call from_stamp,$(PV_ATL) $(ATL)/pv/story.pal $(ATL)/pv/pv.pal,pv)) - -# Архивы: собираются ПРЯМО в assets/packed — это уже дисковый артефакт. -# Заголовок с индексами объявлен целью НАРАВНЕ с архивом: индексы описывают -# именно это содержимое и разъехаться с ним не должны. -ARC := $(PY) $(TOOLS)/pop_pack_arc.py -define arc_rule -$(PACKED)/$(1)/$(2).arc gen/$(3)_arc.h: $(4) $(TOOLS)/pop_pack_arc.py - @mkdir -p $(PACKED)/$(1) - $(ARC) --header gen/$(3)_arc.h --prefix $(5) $(PACKED)/$(1)/$(2).arc $(4) -endef -$(eval $(call arc_rule,BG,bg,bg,$(BG_ATL),BG)) -$(eval $(call arc_rule,KID,kid,kid,$(KID_ATL),KID)) -$(eval $(call arc_rule,GUARD,guard,guard,$(GUARD_ATL),GUARD)) -$(eval $(call arc_rule,SKEL,skel,skel,$(SKEL_ATL),SKEL)) -$(eval $(call arc_rule,VIZIER,vizier,vizier,$(VIZIER_ATL),VIZIER)) -$(eval $(call arc_rule,SHADOW,shadow,shadow,$(SHADOW_ATL),SHADOW)) -$(eval $(call arc_rule,TITLE,title,title,$(TITLE_ATL),TITLE)) -$(eval $(call arc_rule,PV,pv,pv,$(PV_ATL),PV)) -# У звука своего *_arc.h нет: содержимое адресуется таблицей pop_sound_tbl.h, -# которую печатает сам упаковщик звука. -# Зависимость на stamp, а не на список страниц: сколько их будет, известно -# только после запуска упаковщика (источник задаёт число). Порядок страниц -# в архиве обязан быть ЧИСЛОВЫМ — pop_snd_tbl адресует их индексом, а голый -# ls даёт s10 перед s2. sort -V, а не `-t s -k n`: буква s есть и в пути. -# Пара snd.arc + snd.idx согласована по построению: её делает ОДИН рецепт -# stamp'а выше (см. там же, почему не раздельными правилами). Здесь -# только восстановление, если файл снесли руками. -$(PACKED)/SND/snd.arc $(PACKED)/SND/snd.idx: $(STAMP)/sound-$(SND_SRC) - @test -f $@ || { $(MAKE) GENERATE=1 -B $(STAMP)/sound-$(SND_SRC); test -f $@; } - -# Файлы, которые ложатся на диск как есть, — простое копирование из staging. -define copy_rule -$(PACKED)/$(1): $(2) - @mkdir -p $$(dir $$@) - @cp $$< $$@ -endef -$(eval $(call copy_rule,BG/pop_tile.pal,$(ATL)/bg/pop_tile.pal)) -$(eval $(call copy_rule,BG/pal_tile.pal,$(ATL)/bg/pal_tile.pal)) -$(eval $(call copy_rule,KID/kid.pal,$(ATL)/kid/kid.pal)) -$(eval $(call copy_rule,KID/kid.ani,$(ATL)/kid/kid.ani)) -$(eval $(call copy_rule,FONT/font.atl,$(ATL)/font/font.atl)) -$(eval $(call copy_rule,TITLE/title.pal,$(ATL)/title/title.pal)) -$(eval $(call copy_rule,PV/story.pal,$(ATL)/pv/story.pal)) -$(eval $(call copy_rule,PV/pv.pal,$(ATL)/pv/pv.pal)) -$(foreach i,$(MUS_IDS),$(eval $(call copy_rule,MUS/m$(i).bin,$(ATL)/music/m$(i).bin))) -$(eval $(call copy_rule,MUS/mus.idx,$(ATL)/music/mus.idx)) -# Уровни идут на диск ПРЯМО из оригинала: формат res20xx.bin наш загрузчик -# читает как есть, упаковщика для них нет. check-orig здесь тоже order-only — -# без оригиналов взять уровни неоткуда, и сказать об этом надо внятно. -LVL_ORIG := assets/orig/SDLPoP/data/LEVELS -SND_ORIG_MSDOS := assets/orig/MSDOS -define lvl_rule -$(PACKED)/LEVELS/res20$(1).bin: $(LVL_ORIG)/res20$(1).bin | check-orig - @mkdir -p $$(dir $$@) - @cp $$< $$@ -endef -$(foreach n,$(LVL_NUMS),$(eval $(call lvl_rule,$(n)))) - -# README: перевод строки CRLF (текст читают в DOS-подобной среде) и, для -# русского, перекодировка в CP866. iconv БЕЗ -c намеренно: потеря символа -# должна ломать сборку, а не молча портить текст (memory -# iconv_cp866_workflow; //TRANSLIT на macOS падает). -$(PACKED)/README_E.TXT: dist/README.txt - @mkdir -p $(dir $@) - @sed 's/$$/\r/' $< > $@ - -# ПОРЯДОК ВАЖЕН: CRLF ставится ДО перекодировки. BSD sed в UTF-8 локали -# отказывается работать с байтами CP866 («RE error: illegal byte sequence»), -# а с валидным UTF-8 — работает. -$(PACKED)/README_R.TXT: dist/README.ru.txt - @mkdir -p $(dir $@) - @sed 's/$$/\r/' $< | iconv -f UTF-8 -t CP866 > $@ - -resources-readme: $(PACKED)/README_E.TXT $(PACKED)/README_R.TXT - -resources-bg: $(PACKED)/BG/bg.arc $(PACKED)/BG/pop_tile.pal $(PACKED)/BG/pal_tile.pal -resources-kid: $(PACKED)/KID/kid.arc $(PACKED)/KID/kid.pal $(PACKED)/KID/kid.ani -resources-actors: $(PACKED)/GUARD/guard.arc $(PACKED)/SKEL/skel.arc \ - $(PACKED)/VIZIER/vizier.arc $(PACKED)/SHADOW/shadow.arc -resources-sound: $(PACKED)/SND/snd.arc $(PACKED)/SND/snd.idx -resources-music: $(foreach i,$(MUS_IDS),$(PACKED)/MUS/m$(i).bin) $(PACKED)/MUS/mus.idx -resources-font: $(PACKED)/FONT/font.atl -resources-title: $(PACKED)/TITLE/title.arc $(PACKED)/TITLE/title.pal -resources-pv: $(PACKED)/PV/pv.arc $(PACKED)/PV/story.pal $(PACKED)/PV/pv.pal -resources-levels: $(foreach n,$(LVL_NUMS),$(PACKED)/LEVELS/res20$(n).bin) -resources: resources-bg resources-kid resources-actors resources-sound \ - resources-music resources-font resources-title resources-pv \ - resources-levels $(GEN_H) - -check-orig: - @test -d $(LVL_ORIG) || { \ - echo "SprPoP: нет assets/orig/SDLPoP — генерировать ресурсы не из чего." >&2; \ - echo " Скачать: make fetch (подробности — assets/orig/README.md)" >&2; false; } - @test "$(SND_SRC)" != msdos || test -d $(SND_ORIG_MSDOS) || { \ - echo "SprPoP: SND_SRC=msdos, но нет $(SND_ORIG_MSDOS)." >&2; \ - echo " Дистрибутив DOS не качается — положить руками, либо собирать" >&2; \ - echo " со звуком из SDLPoP: make SND_SRC=sdlpop" >&2; false; } - -else -# =========================================================================== -# Обычная сборка: assets/packed/ и gen/ — готовые входы -# =========================================================================== -# Ни одного правила с таймстемпами: пока файлы на месте, make их даже не -# рассматривает. Пропал файл — доделываем ровно его, рекурсивным вызовом в -# ветку генерации (она подтянет и заголовок, и оригиналы). -$(PACKED_FILES) $(GEN_H): - @echo "SprPoP: нет $@ — генерирую ресурсы" - @$(MAKE) GENERATE=1 $@ - -RES_TARGETS := resources resources-readme resources-bg resources-kid \ - resources-actors resources-sound resources-music resources-font \ - resources-title resources-pv resources-levels -$(RES_TARGETS): - @$(MAKE) GENERATE=1 $@ -# Перегенерация ВСЕГО, не глядя на таймстемпы. -resources-rebuild: - @$(MAKE) GENERATE=1 -B resources -.PHONY: $(RES_TARGETS) resources-rebuild -endif -# --------------------------------------------------------------------------- -# Прочее -# --------------------------------------------------------------------------- -# Образ HDD собирается после staging — иначе на диск уедет старое содержимое. -# Рецепта здесь нет намеренно: он в app.mk, а это только зависимости. -hdd: stage | $(BUILD_DIR)/hdd -$(BUILD_DIR)/hdd: - @mkdir -p $@ - -# Музыка из конкретного набора записей. Каждая цель пересобирает музыку и -# сразу раскладывает её в build/, чтобы `make hdd` взял уже новую. -# make music-mp3 собрать музыку из mp3 -# make music-mt32 вариант Roland MT-32 -# Разовая сборка без смены умолчания: make MUSIC_FMT=ogg resources-music -MUSIC_TARGETS := music-flac music-mp3 music-ogg music-mt32 -$(MUSIC_TARGETS): - @$(MAKE) MUSIC_FMT=$(patsubst music-%,%,$@) resources-music - @$(MAKE) MUSIC_FMT=$(patsubst music-%,%,$@) stage - -# --------------------------------------------------------------------------- -# Внешние исходные данные (assets/orig/) -# --------------------------------------------------------------------------- -# В репозитории чужих данных нет — есть tools/fetch_orig.py, который знает, -# откуда их взять, и таблица источников внутри него. Качаем только то, -# чего нет; `FETCH_ARGS=--force` перекачивает заново, `FETCH_ARGS=--ref v1.23` -# берёт конкретный тег SDLPoP. -# make fetch SDLPoP + записи музыки -# make fetch-sdlpop только SDLPoP (data/ + src/-эталон) -# make fetch-music только записи саундтрека (43 МБ) -# make fetch-check что уже на месте -# make fetch-list таблица источников -# MSDOS/ не качается — это копирайтный дистрибутив; он НЕОБЯЗАТЕЛЕН, всё -# нужное (уровни, оцифровка) есть в SDLPoP. См. SND_SRC выше. -FETCH := $(PY) $(TOOLS)/fetch_orig.py -fetch: ; $(FETCH) all $(FETCH_ARGS) -fetch-sdlpop: ; $(FETCH) sdlpop $(FETCH_ARGS) -fetch-music: ; $(FETCH) music $(FETCH_ARGS) -fetch-check: ; @$(FETCH) --check -fetch-list: ; @$(FETCH) --list -FETCH_TARGETS := fetch fetch-sdlpop fetch-music fetch-check fetch-list - -# Тесты инструментов (хост, питон): форматы, которые читает Z80. Секунды, -# ни эмулятора, ни оригиналов не нужно. -test-tools: - @cd $(CURDIR) && $(PY) -m unittest discover -s tools/tests - -# Перелинковка приложения без пересборки библиотек и ресурсов. -relink: - $(MAKE) -W Makefile $(EXE) - -# clean (из app.mk) сносит только build/ — ассеты остаются на месте. -# distclean дополнительно убирает УПАКОВАННЫЕ ассеты; вернуть их можно -# командой `make resources`, но для неё нужны оригиналы в assets/orig/. -# Сам assets/orig/ не трогается НИКОГДА: он не производный, а исходный, и -# восстановить его командой нельзя — только положить руками. -# gen/ тоже остаётся: без него не скомпилировать src/, а вес его — байты. -distclean: clean - rm -rf $(PACKED) - @echo "assets/packed снесён; вернуть — make resources (нужен assets/orig)" - -# Цели генерации ресурсов объявлены .PHONY в своей ветке (см. выше): в -# GENERATE=1 они настоящие агрегаты, в обычной сборке — переходники. -.PHONY: stage check-orig resources resources-rebuild resources-bg resources-kid \ - resources-actors resources-sound resources-music resources-font \ - resources-title resources-pv resources-levels $(MUSIC_TARGETS) \ - $(FETCH_TARGETS) test-tools relink distclean run-hdd diff --git a/applications/SprPoP/README.md b/applications/SprPoP/README.md deleted file mode 100644 index 33f9859..0000000 --- a/applications/SprPoP/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# SprPoP — Prince of Persia на Sprinter Sp2000 - -Порт оригинального Prince of Persia (1989) на компьютер Sprinter Sp2000: -режим 320×256×256, дабл-буфер, звук через CBL, код разложен по одиннадцати -16-килобайтным банкам. - -Приложение **автономно** — код, оригинальные данные, конверторы ресурсов и -сборка лежат внутри этой папки. Наружу нужен только компилятор: - -```sh -export SPRINTER_ROOT=/путь/к/C-Compiler -make # build/sprpop.exe + ресурсы в build/ -make hdd # + образ build/hdd/sprpop.chd -make run-hdd MAME_HOME=/путь/к/MAME/runtime # запуск с локальным CHD -``` - -Чужих данных в репозитории нет — есть адреса, откуда их взять. Чтобы -перегенерировать ресурсы (или получить эталон механики), сначала: - -```sh -make fetch # SDLPoP + записи саундтрека DOS-версии в assets/orig/ -``` - -## Что где - -``` -src/ рукописный C: главный цикл sprpop.c + движок pop_*.c -gen/ генерируемые заголовки — руками не править -assets/orig/ оригинальные данные игры (вне репозитория, качает `make fetch`) -assets/packed/ то, что ложится на диск игры, в раскладке диска -tools/ конверторы ресурсов; все пути — в tools/paths.py -docs/ планы, доски задач и багов, справочники (начинать с docs/README.md) -tests/host/ модульные тесты движка под ucsim_z80 -build/ выход: sprpop.exe, каталоги ресурсов, hdd/, промежуточные atl/ -``` - -## Цели сборки - -| Команда | Что делает | -|---|---| -| `make` | собрать `build/sprpop.exe` и разложить ресурсы в `build/` | -| `make hdd` | + образ жёсткого диска `build/hdd/sprpop.chd` | -| `make run-hdd` | передать локальный CHD в MAME как `-hard2` без изменения установки эмулятора | -| `make fetch` | скачать внешние исходные данные в `assets/orig/`: `fetch-sdlpop`, `fetch-music`, `fetch-check`, `fetch-list` | -| `make resources` | перегенерировать ресурсы из `assets/orig/` | -| `make music-mp3` | музыка из другого набора записей: `music-flac` (умолчание), `music-mp3`, `music-ogg`, `music-mt32` | -| `make SND_SRC=msdos` | оцифровка эффектов из дистрибутива DOS вместо SDLPoP (нужен свой `assets/orig/MSDOS/`) | -| `make -C tests/host` | модульные тесты движка (секунды, без эмулятора) | -| `make test-tools` | тесты упаковщиков на хосте: форматы файлов, которые читает Z80 | -| `make clean` | снести `build/` (ассеты не трогает) | -| `make distclean` | `clean` + снести упакованные ассеты `assets/packed/` | - -Отладочные ключи: `make LEVEL=9` — стартовый уровень, `make ROOM=15 POS=2` — -стартовая комната и тайл (`row*10+col`), `make PROF=1` — профиль фаз кадра -полосами бордюра, `make ALLOCS=100000` — плотная упаковка регистров для -замеров размера. - -## Сборка из чистого клона - -Работает без `assets/orig/`: упакованные ресурсы (`assets/packed/`) и -генерируемые заголовки (`gen/`) лежат в репозитории. Исключение — -`assets/packed/LEVELS/`: файлы уровней ложатся на диск прямо из оригинала, -без конвертации, поэтому они, как и `assets/orig/`, вне репозитория. Что и -откуда положить — `assets/orig/README.md`. - -`assets/orig/` нужен только чтобы ресурсы **перегенерировать** (`make -resources`) и как **эталон механики**: любая правка поведения сверяется с -`assets/orig/SDLPoP/src/` до кодинга, см. `CLAUDE.md`. Заполняется он одной -командой `make fetch` — качается SDLPoP (ресурсы + исходники-эталон) и записи -саундтрека; адрес архива музыки скрипт берёт из самого SDLPoP. - -Оригинальный дистрибутив DOS (`assets/orig/MSDOS/`) **не нужен**: и уровни, и -оцифровка звука берутся из SDLPoP. Он даёт ровно одно — более полный набор -эффектов (в SDLPoP пуст звук `spiked`, 48); у кого дистрибутив есть, включает -его явно: `make SND_SRC=msdos`. Подробности — `assets/orig/README.md`. - -## Происхождение - -Выделен из `applications/PoP/roomtest` 2026-08-26; та папка заморожена и -служит архивом закрытых задач, багов и исполненных планов. Референсные -реализации (Apple II 6502, Princed Resources, mininim) остались в -`applications/PoP/`. diff --git a/applications/SprPoP/assets/orig/README.md b/applications/SprPoP/assets/orig/README.md deleted file mode 100644 index 360080d..0000000 --- a/applications/SprPoP/assets/orig/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# assets/orig — оригинальные данные - -Здесь лежат **исходные** данные Prince of Persia, из которых `make resources` -делает ресурсы Sprinter-версии. В репозиторий этот каталог не идёт — -материал копирайтный (см. `.gitignore`). Вместо данных в репозитории лежит -**знание, откуда они берутся**: `tools/fetch_orig.py` и таблица источников -внутри него. - -## Как заполнить - -``` -make fetch # SDLPoP + записи саундтрека (всё, что качается) -make fetch-check # что уже на месте -make fetch-list # таблица источников с адресами -``` - -Тонкости: - -``` -make fetch-sdlpop только SDLPoP -make fetch-music только музыка (43 МБ) -make FETCH_ARGS=--force fetch перекачать заново -make FETCH_ARGS="--ref v1.23" fetch-sdlpop конкретный тег SDLPoP -``` - -Скачанные архивы кэшируются в `assets/orig/.cache/` — повторный `make fetch` -сеть не трогает. Версия SDLPoP записывается в `assets/orig/SDLPoP/.fetch.json` -(ветка/тег, sha, дата), и следующий `make fetch` по ней понимает, последняя -у нас версия или нет. - -Собрать игру без `assets/orig/` **можно**: упакованные ресурсы лежат в -`../packed/`, а генерируемые заголовки — в `../../gen/`. `assets/orig` нужен -только чтобы ресурсы **перегенерировать**. - -Исключение — `LEVELS`: файлы `res20xx.bin` ложатся на диск игры как есть, без -конвертации, поэтому `assets/packed/LEVELS/` тоже вне репозитория и заполняется -из `orig` командой `make resources-levels`. - -## Что и откуда - -| Каталог | Что это | Где взять | -|---|---|---| -| `SDLPoP/data/` | Распакованные ресурсы DOS-версии: PNG-спрайты (`VDUNGEON`, `VPALACE`, `KID`, `GUARD`, `SKEL`, `VIZIER`, `SHADOW`, `TITLE`, `PV`, `PRINCE`), палитры, `LEVELS/res20xx.bin`, оцифровка `DIGISND*.DAT` | `make fetch-sdlpop` — (GPLv3) | -| `SDLPoP/src/` | Исходники SDLPoP. Нужны не только упаковщикам (`menu.c` и `seg009.c` содержат встроенные шрифты, из `seg005/seg006` берутся таблицы кадров и `seqtbl`), но и как **эталон механики**: расхождение в поведении всегда сверяется с ними | тем же `make fetch-sdlpop` | -| `PoP1_DOS_music/` | Записи музыки DOS-версии в четырёх наборах: `flac/` (по умолчанию), `mp3/`, `ogg/`, `ogg_MT-32/` (исполнение Roland MT-32). Имена треков во всех наборах одинаковые; какой брать — задаёт `MUSIC_FMT` | `make fetch-music`. Адрес архива скрипт читает из самого SDLPoP (`ReadMe.amigaos4`, секция «AUDIO IS SLOW/AWFULL»), запасной — popot.org | -| `MSDOS/` | **Необязательно.** Оригинальная поставка PoP 1.0 для MS-DOS. Используется только `digisnd*.dat` со звуком, и только если попросить: `make SND_SRC=msdos` | Не качается — дистрибутив игры, положить руками | - -## MSDOS: зачем он и почему без него живётся - -По умолчанию **всё** берётся из SDLPoP — и уровни, и оцифровка звука. Так -сборка работает на чистой машине сразу после `make fetch`. - -`MSDOS/` даёт ровно одно: более полный набор оцифрованных эффектов. Из 31 -звука 28 совпадают побайтно, а три — нет, и все три лучше в дистрибутиве: -`spiked` (48, насаживание на пики) в наборе SDLPoP длиной 7 сэмплов, то есть -его нет; `sword_vs_sword` (10) короче; `sword_moving` (11) — другая запись. -Разбор — `docs/sound_plan.md`. Включается это явно: - -``` -make SND_SRC=msdos resources-sound # перепаковать звук из дистрибутива -make SND_SRC=msdos # и собрать с ним -``` - -Источник входит в имя stamp'а, поэтому переключение `SND_SRC` само делает -звук устаревшим — `-B` не нужен. - -## Кто что читает - -| Упаковщик | Читает | -|---|---| -| `pop_pack_bg.py`, `render_room.py` | `SDLPoP/data/{VDUNGEON,VPALACE,LEVELS}` | -| `pop_pack_kid.py` | `SDLPoP/data/KID` | -| `pop_pack_guard.py` | `SDLPoP/data/{GUARD,SKEL,VIZIER,PRINCE}` | -| `pop_pack_shadow.py` | `SDLPoP/data/{KID,SHADOW}` | -| `pop_pack_title.py`, `pop_pack_intro.py` | `SDLPoP/data/{TITLE,PV,PRINCE,KID}` | -| `pop_extract_font.py` | `SDLPoP/src/{menu.c,seg009.c}` | -| `pop_extract_kid_data.py` | `SDLPoP/src/` (таблицы кадров и `seqtbl`) | -| `pop_pack_sound.py` | `SDLPoP/data/DIGISND*.DAT` (`--source sdlpop`, умолчание) либо `MSDOS/digisnd*.dat` (`--source msdos`) | -| `pop_pack_music.py` | `PoP1_DOS_music/<набор>/` (`--format flac\|mp3\|ogg\|mt32`) | - -Точная раскладка путей — в `tools/paths.py`; менять её нужно там, а не в -отдельных упаковщиках. Адреса внешних источников — в `tools/fetch_orig.py`. diff --git a/applications/SprPoP/assets/packed/BG/bg.arc b/applications/SprPoP/assets/packed/BG/bg.arc deleted file mode 100644 index cc36258656df33d318ddc95b77a37a15b7b4ff5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202240 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 VhN-vygXxJtI$-7@hSFW{7y#UHH%0&e diff --git a/applications/SprPoP/assets/packed/BG/pop_tile.pal b/applications/SprPoP/assets/packed/BG/pop_tile.pal deleted file mode 100644 index e62c5734387a36849126ad4260bb9ae47cbd292b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 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 Dt%BLi diff --git a/applications/SprPoP/assets/packed/GUARD/guard.arc b/applications/SprPoP/assets/packed/GUARD/guard.arc deleted file mode 100644 index ad3aed9c630d36fc827fdee6ab0cef692f8a2366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76288 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 aBV}ovh~G1$(xjwr**&Ptw?(||75IOZ@WC(u diff --git a/applications/SprPoP/assets/packed/KID/kid.ani b/applications/SprPoP/assets/packed/KID/kid.ani deleted file mode 100644 index ec368af73fe7dc31aaddb6db645f5562eed2cd6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4150 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

    Hm;7HFA-Qm41p(Pg&a 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 BiS_^h diff --git a/applications/SprPoP/assets/packed/MUS/m24.bin b/applications/SprPoP/assets/packed/MUS/m24.bin deleted file mode 100644 index d861766..0000000 --- a/applications/SprPoP/assets/packed/MUS/m24.bin +++ /dev/null @@ -1 +0,0 @@ -{}|{~zwynvymo{|wvy|{svusnkoyzrx}w~uvsspwnvuswxywtlr|v~wxumwvlq|{vvz|wtvvrmkqzxq{}|y}uvsrrvlwvtwyyuqjwww~w~ur|tks{yvw|xxxwspovyqpy~|{vwtky~{z}zroypy}~~|ysyytu|{}~~}}{}xlr~zwqw}|}}s}z|z~wo}w~ywx~ysz|uvzx{|ym{yos{~~{|xtpx{ps|xrv~sr|ussywuyu{unxryw}ur}~ypmvzz~rfsxmjt|~{~vp}vkox}}|}{w|}w}~~z|~|xxqpvy~|||~u~qswt{np}vouy~wv|z{ury{w}omru{r{s|x}okyypz|ppzy}}qusjkpmqxv~x}qzyuvup|{z}q}uwpevkutytt{|kozwpsy}sujsx{ybj}w~}|}|xsz|nzx{~~y|wyuv|}lqx{zwytw|~x}sz{ik{}psls|t{}~|{tz{vwktvqt}~rz}{yy{oozqhtz~~zv~rynjnm{sr|pjk~ooknpqoxnw~p_vqu~yqrymszpwmyyzxsnx}yx~~txuolq{nnrwjg}wtwynZT`dqqvyzqyjvy_W^\lzofpwmdieWpmptzmfu|opzicfqyx}q][kok}owwqp~|pni^exzyx{h|wvmpgikz{ry|x|so}qmrquw~rfv{kt~ywnmzw~|zxuleksvyw||swzpnlshxplbvpoz|mwqj{{jptlkjmxq~zsyqnpmnruwqkqu|tqtuxl}{xhnvyo{h~~}wstyvni}wjrzqynehv~z|wyumlvtml_gv}gjzxsirzwnor{vm}ry|uvnhtzy{zqpyqtwp|unrguvvuiylktnlq{uvwtsqvqutwynz|zcm|qnwmw|r~z}{lusgcnpvs{}z~v~y{znxsmgos{sawj~ynqovd|zlgx|tluvTntiiu}~~wgv~kiton{pUSWnyo~r|vxtwtdzsl||~{~|pqnbqpmzu|~wmfzv|zi|}zzcZdmu|i^jtlo`jy|j\nc`eZXdru}}w{pj~torz}zkl}ROYWqupw{g\Yjhir|}xpo{rwqzz|wtxxwprjM_aPo|zwnj|ulqe`eXYmm|~vntswagld`CC^ks~stzpW[cRRl~yyv~zmpuvw~}s}tfzhmfWTZaU]glxs~}q{{ttuv{W\eOO^aprrsltoXT[aNGPdbjwvebg|evod`Zkegvypowhqdefagp|}jaslivur|~~{{x~phwwmp]kkdclk_jyxz{~qqtyz}{~_c|fhjDG7Khoqub^l]WM@WXhz||zjdpt_ekUJOZckjn}qrkroXWd`k{x}r|o]mjvwwx~ztrc\Y]b_QLbcxz}{t|{{{yytmxxzy}jywyiWF=@Ti|lbTaZUXYKKg__|{tx{lqXmzui_migdecckufry~p{iiophpqtxzsepugnufbywh}tp}yeszyuo\Ramckxqp~~}}ufihr||uwecy}yznLFEFPZbrgixcHOMFSRdb}wpi^ord[Y[b\WWdsnvvuz{zxgovc_pzx|}{o~u{|~{mbqbkblgewlmpng`aq\`dnfuv{r}vu|mx|~rs_`|{{w|tnrr}sz`RONGFKotgxgal[KY\LSkz~rnYplhX[ntqpl_k{senxkdpyu~~uyptwzwjy}xytckogpl`epqmwmt{|yuqu|oksthittr}fuyuzuyypcdkknfkzz~~lp{rlu`geZKDDWuºw]VcRYNSVWuuupj_TXXZ]Zc|s|xuwl{k]Zx|qp|~ztrymo~vbajYbZonw{wxyvuvrtnmxdWb~ywvv|t~wj}vbn^hwz}ypid\VUgkhz~{{pacj`]m|{utz|{uoffV]blponwtwwg`W[uvpqxtw~ntqigltfkvhbcdXRbkem~|s{xka[p{ke_rzsv}rpklb\]dp||vssqjc]colaprzihfbqcnutu{yxxrf[XZ^clvz}xqxkT^j`bq|}zp{uknrx}yxxk]fcXe\njh{xz}`Yhd^frur|ou|vqvdbfmu}|{vvvtqw~gkgjvt{s{{psxy|~{mrwpxh_bfijks{{th\]pgSLPil{z{swyrifhmv}ypgheYT_e^]iu{y|vkvxaTPcfewr{uyx|sf\[^iyy~zz{wqsobiplipv~w}}py}}}}xpnnu~rhdbdjwtqy}ws`jsc^[XWe|~vyurrroospdjkZg^fj]hptx~~~~}plzmdc]Yfwyxwtbrzlihgdchyt~yxzy}|z{{~{uuoamk_`usv_yt|rmmlfaamyyt|xqdhxfOQYKWYc~}~vmhgipz}xuh[[ee\Zcmrsu{~zuz|}vpu|{b[cV_d_vv{~|qv~{umhdcekmeyzz~um}}~|{~x||pd]VPf~|wstlhz}{{yvtpnptimxo}wwqdxocWPV][]lozvutsst|}ssoakcemcgnqqqokjquozxvsru{}teY[deck{gjtrnijlmlnswuryyzpq||~}zyz~yyjTNfmkrxub{zqqkkpsssu{|vrzzxsgn}pae]RZNS_`q{}zvux}{wkhkg^]fossqqngfm^o}|xnklpw~zxggf[gikz}rwvrpmkkmt~uy|s}~}jpussuy|}rdT[fZUdns~upzumnnpsx}zx}qu{sjzvnf_^cb\[cp|z}~z~{zzz|ztzyrwkoqjntuqlgb^ZVepmtz{xuv{zrpsohiq|njkjdbdgny|{~|nmllmrzthssb[XW]oyxzhlieflt}vmbeywkjombiealhflt|{{{{}~|r}}}vppsvvspkb[VPcm^eswy|}~y|}srw}~~rpokjknt~{ysuqpnhgks~vfixn^Y\]Xft|ursrooryuncn{snmjgiorolnqsstx~|}xvx}ogx~uu}ztssrokd[R\dVRZclu~~}}}qqngefiovwgq~yrliltyp}vle_Y[bkswuvqmmos{zfaqqggmpjptowxrpponmnsw~|~vzwuwz~{wsnhc[S`dSNV[`hs~~{yy{{y|{xsnmotyzxvqx{umikqz{kn|tigh`[`\`py}|zvuvz~}ou{ngddelsutuwyywtpljmktyxzxq~}omppt~zvqmh`YadWPPRU[er~zx{vt}|volklpvyyy}xmu{olsyyrppqs|zuvmgccc`[[an}zvuvz~tr|rhgedlmluyxyzyvrmjgacy||~|~pihnw~{tomgV[m`TSPNOT^jw{wrn|}zvtsrprzzywy|lden{~{{vsrtvx~{pxxqmfgh``b__fp}~}}|}re``ejllpv|ztqnbVgxsv~}zz|~xqjhnos~xsmbYcg[USQOOSZajwyhm}}yvttvwvuw{|tqzpgbhpv}|urvwxzyumiikkifeegils|xndcgfjsvy}~{wob]ilfir|}zrmlmnpu~xlZ`peXVTRPOPU]fox}st}ouxuy}}zy}{x{{xvsnuyqkgginwy~}yy|yq{~toihkiiorqpnllowumihhilry~}sbgvi]^dlu~|usrlmuzqekpcZWUTSTUWY]gqvx}xrlpty}}}}ztjcq|xyvrrplr}~z{}~{zurmn}tolkmoqruxzzxtqoqrqvy~xvpmqwz}}slwzka^^ahr}|||zxy{xmxvcYWWVVWZ]acdejr}{}wolmqwzqdcuzqnorvz}|zz}~yyz{~ynbi}~wusonpqpuz{{||{yumdf}|s{xvwz}|qqpfba`bhs}|~|}zwf^ZXXY[^_`adediqtus}|xzwrpos{|pcjxrkjlnt}~|{{}wf^nysonnoqsuwxy{|}}}{wnaex|zzx~|z{|~vq~yojgecdgnw~t~~}}|zyjc^[ZZ]`dfedcdgjkgh~}xv{zustyyjgvxledejqx}|{|zhhurkjllosssw{{{{|||{uidqsjlu||z{~{z{}}ynstnljgedfkr{yv}|}|xvwnhb_]]^_befdced`\Yg|yvuxyvvzujs|siecejns|}~}}}tlvviccglqtuvwxz{{{{{wlaluh`clx{y|}{{{xqqyromkigedgnwv~~}ztmx~wqke`^^_abcdeeda[TWlzxwwwvtrw~yvx~ttzlecdfimry|{}~{w{tgaafjlouxz{{{{{zxqhitob\]dmy~{{~}{wojw}tqpomkjihikov}|xy}|vml|}zwqkfb_`ceeefd`[TNZkkilrvxwuv{~~zymgefggkry{wrpqe`_bfkotx{}}}|{zukgt{nb]\]bly||}~}tkl{wrqqqponmnoonqx~xtux}shn~wwzzxtpligfeeffeb[RQ_f`^bjrxyz{}zqkihhikotzxki{{ofbaadksy|~}{xqikyyohda__ckwvjp}ypnoqqrsuvvutrrruwyxxuvy|wnu|tnorvy{zxusqnjhge`WOUb`WVY_hr{ztponmosw{~ts}{uw~~{tniffhlrw{~}ypgo|xokjihghjpyw|~tljknpsvxz|}}zwusoigv~{z|{wtkikou{{upljgaWR\e^WTTW^gp{}ux|ywvuuvwyz|y~spsz{~{wrmlmpsvy|}|vmkvzsmklmnnoopsyxnjjlptx|~|zvndcs}unjijou|ysoh^STabZTRRUZajt~{r{}{{|}||}~~y|upory~z~{xtpooqsvyxrjo{ypkikloqstuuux|snllnrvz}~|vkaftvtv|wqmkkmryzsi]U^f`XTRRTX\cmwyxu~}|{||{us~vqnot||~{wsqprturkly|sliijknpsuvvuuyvqmmorv{~{shdptnknt}~wrnlklpv}}sfZ[fdZTRQRSVZ`gpyvv|}{}~}|ztowzuqmlou~}xtqpqqojgsxojhhijloqrsrqqtx|ztpnnquz}}vkelunfeipx}xtqnmnqu{}re_hk`WRQQRRTY^elt|{t|}xy|~ztmo~zxvsomnrz~}~~ytqolhdkz{rlihhhiknrttsrqpoopxzurqsvy}|tklxvjb`cipx}zwtqooquy~~rgjqi\USRQRSUX\agmu|wx|y}|vvy}~xqksywwwvspopv}}}}zuoh``ozumjiiiijmortvvurokfes}ywwxz|~}wokt|tic`adjr{{w~}{ywuuuvx{~}tqyzl_XUTSSTWZ^aeinsxywwytuzzwwy}ynmzztsuwyyyxwwy~~~~}sh^`oslhhhiijloruxyyywrja_o}~~}}}~~|vnp}ulgdccejr|wt~~}}}||{zz|}|xsyqg_[XWWY[]`bdfhkmmkr~xvvz~{z{{qsvqpqtx|}ocgpmebcfiknqtvxyz{|{wofgsvqqv~}{wpjr~}tnkihhikou}zx}|}}{yxtnn|xpjea_^^`bcdeefgfb`m}{{}w}vqpqsw|}|vouvlc__aeinruxz{{{{zvmhoxtmikr{{tlkw{tpnmmnnoqsw|~zz{~~{vngk{}yuqmjgeddddddddc_YZjxzz}wsqqsv{~xrsy{{nd_^_chmrvxyzzzzwrjlx{tlhgkr||rio{|vrpoopqrrstuw{|xwy}|ukfp{{wvutrpmjiggfeddc`YU\kpoquzxusstwz}tmt~|pga^^aejotwyyzyxslhq{woifeglt|qnx}wronnopprssttuw{{wvwz~{qilwytrstuutqoljhfedb_ZSTbjhfiou{~yvtstvy}xnmy{pic`_aeinrvxyxwsmhmyyqjfcbcgnxzrw~zsonnoppqrssssstvwwyzvuvx|yomvzupoqtvvutroljgec`[UR[ed`_ciov{{xvuuvy|vot|{xy~|tmgcaacglptvwwtoiisztlhecbbdipz~|wpnmnooprstttsrqpoou}yvuwz~wqu|xplloruwyxwuqnkgd_XSVad^Z[^cjqx~~|zxxy{~~vu}}upqw}ytnifddgjnqtuurlhnxxpkhgfdddgls|wqnmnoqrtvwwwusplhgq~{yxz}xwxpkjknrvz|}|yupkf_WT[daZWWY]biqz}~z|~}}~}zvomot{|xsokiijknprqnhhszuokjjjjjjjlosz}uqonopsvxzzzxvrledo{|{~~x}zrmjjknsx|~ztlcYXae_YVVWZ^dkt|xw{}}yz}vqoosz|yvrnlkllkhdhuysnkkkmnpqssssux}zusrsuwz{||{yunfgqvsqsx~|z}wrommmpty}|ti_ahg_YWVWY\afmt|zy~yu{~zvttv{}xsnkie_^htuqmllmnqsvwxxwvuvvvx{xwxyz||}|zumhmvuollpv~|vz~yvsrqqrtvz}wlflpja[XWXZ]aejou{}||~}ut~~|zxxz}ytnhaZ]krpljjklnqsvxyyxwuroko}|{{{{{{xqjjtysmiikpw}vu~zxwutttuvxz}}unpwtja\YXXZ\`cgkptz}|}|{|ysx~~~~}|zz|xqg^Ybmnjhhijlnqsvxyyywtohdl~~|||{ytmjr{xpjgghlrzxsx~|zyxwwvvvwxy{}|xrrz}tib]ZXXZ\_behlptwxwy{xy|}{|~ww~|||}}}|zyz|ype]`kniedeghjlortvwwusngacq|~}|zxuojoz{slhfefjov{tt~{yyyxxwwwwwwxyywsrz}sic^[YYZ\^acfhknoopz}wuux}}}~|xzyz{|}}}|zyy{~{pebinidabdfhjloqsuvvtqkc`grtsuz}zwrlmv}xpkhfefhlryzuz}zxyyzzzzzzyxwwvtrpv}slfb^\[\]^`bdeggggl{|xutux~~}~{xxxz|~|zyyz{{tklrof`^_acfiloqsuuusoicdmrmjkqx{uokq{|uolihgghkot{~|zwvwxz{|}~~|{ywtplmw|vqmieca``abbcccb_`iy~}|zxwx{|yxyz||xtqq{yuyzrg`]]^aehlortuvusoifktskfehnvwomu|ztomlkkklmoruzzwvvxz}}ytnhkv~|yvusqnljhfeeddca^Z[fswvwz}|zz{}wolu~{pgb_^`bfknrtuvusoiiryvojggimt}~tsz}xronnnopqrrstvx{~~|yxy{}|vniluxusstuvvutrpmkhfda\WZemnmosy~~~|sqx~~~xqkfcbcehknqrssplhkuyvqmkjjlpv}|}xspoopqrtuuuuuuuutt}}||~~wolrxvqooqtwyzzyvsolie`YV\fjhgimry|~}wy~~zwx|}xrmifeegiknpqpmhhpxxspnmlllnrw~yspooprtuvvvvusrolo{~}vqsyztommnruy{}|zwsoje^XXagfcbdhmsz}z|{}wssw|{wrnkhgghikmmkhejtwtpmlkkklmosx~ztqpoprsuvvvutrnjho}zttz~ysnllmptx{}~}zvqkd\Y^ffb_^`dhnu|~zy{|}|{tppsx~}yuqmjhhhhijigdgpvtoljjiiiijlosx{urppqrsuvvvtrnifhs}|wu{xqmlkmpsw{~~{wqjb\^egb][[]`djpw~~yuw}~|yronosy|yurnkihhggcectwzx|yz{w~v}puvwyopwzzvohibXjlt}u}}zlwq}ux{zphtd_gqwqgfmsjdzqqxwbT[jsleZKL`eTN`s~{~x}vmro|ncs~qorzwpwp~uzuw|yz}yvxx^[^^swfdrz~zzb_q|[ZSi~wzwsurvuoZjupr[]Zcysur}wintrpppdx~z}hq{garffzcZwmhkttqtmv{pkqmpx{xw|zs}~xudcqp{ystuxl_`ysql|~iz{sxfqumluy}}or|~}{yjy|y{|xxkhf~n]eth_trnx}gd}|s{|wxz~wjsjmowxxvyzxxsqƴujor\Yjaazyvxxvvtai}ppkoy{~|s~wy}tr|mmwz}_RkdXf^V`ktxx~zlvy|swmq|jqwfchYam`afU`_dhuxmyuv~pjqwzywl|vvoupfwwl}zzz}xtwkevyhXxoXgcWZfouxrprtnro~o[pznp~qw~~wrlhisRSmnai`bqnswzsrrwwopeuzmpwl~{}vwn|c[`i]Sdi_n}vwy~f|tmtgy}z{sx|sxljyxqp~wtr|ey~{|fjqb[ZYrvlpmarmtu~|lSltSTYKCHQWZYXqluy^_tiVVblcgz{telr`WYJZeojqnblcX\fosvp}{~zj_yrp{~tzzrllnsd~xpqtrqk}r{yms|ufqznoxqmmp}tX]iiPXIJW[`ddajztgsxidaXfiVSEDWVkszkrx}rovon~nt}nuvrxmgehvzho{~qx~phkbkupgevlwr~ywmx|~|wz}xtj|vh]Zplqmrj`^NCCGIJIUh^kemfmqZLSfWT][MRb]\p{wuu|{gi`}}t}}yn~ug`sgqmuxvue_]ZURYnevzxz~omzthp}|tomov|hl\q}oviwyy}~qrjp|~ulht|pjvufcf_YnkVFSQLSM_Wk|vwppwtoc]]_]]_tuvom}rmpf\el`_oyxusw||q~t~{wuuup`ir^JN_Ymnzvqiqrog`bhkmn|{ztyyqe^XPMPbZfquy{xg]eeVWfqrrtzuwmbnoc^gkmjil|}yysfss[HPVN^Xmkr{prqq|||tkhigghyw~}mf{ztzukp}vnvypkjlfW`Pm|vyzxys}vs|}z{yz}wtmfws^NU`Vjgzxwod__`afus|}}ievohjeXWdcY^lqmgdehfU\Sk}mvv||wruwsuomfrrd]mjhuo~tnqxkeh_UPQRW`tvvvxrxx{ylhyp{}t}zry|upqw}rmy~vm{wh\`gXe_fpeqxxwwum`Wbsb[ef_[[\^cnsfurvx{kwzlkni^_nsmrnnq}ydrkdjpux{{k\\ok\UUknu}ux~{tsw{{rz~|wz~|ukggip}|wr{}row}|wtvwoYYdjiVcc\bioqsxrjrvj[MUhaQIGXVYlhzhivadjf`_chp|v{xswyqlwy~|{}{kbsyvvox|o~yyyzyvwymYcrcZMXsp~tccvnZfnopmz}ztyllgaWScgaetqadjpfcokkhdjrcUfkr~{x{ssz{zswuukjekolrm~rzyzdc]Y]OS]Wgwnz{pu}y|onznezqjjmqxynwzsly}~z|v^[Zpyu~ozy{}mmmemdPMZ[K`ggzxtxo~v]anbXX`[QTWcsxfhnwqstxtqmrxpoux{tgjlwlxotslgf~yz~mcfcvgbtrYg|s~hq~ysmnt~osdzureo{neYY\[cit|~w}~xvzz{oq||tqmRikq{jfomaWxefiorhbbT]skeicjhWx[fzvui}}sdljZTYe]oqw~gu^J\VVOP_t~xzffmedhtt{vpz~hWipec{su}lb}{lsw~xp{p^{wxjeWcxcXbTSXEjwkTWqzguyflr^xjwe_xn\`{qXaXQUY[oskxvhh\L_ybWX^\anu~{vxijsX`aSckksvuqvzzp[`oeYQPUVWY]bwrr|{rt~nv||e`gnqapwoy]cka}ww|x}{|k`]mthfkgp_Nrywpro~k]Zd_JPh`furt|{qf`hYI>JFKVeshpyx|ruvtbfe`cj~{|||aqUN|matspvnlwz{}wfimbUKNaoigobawivxtrsty|xvvdtznnlrs{w{tllpr}zmunsxrg^nze_rw~sm|||ymmdc[[NMbr~|TGfo_=@E>[Zlnx{\kr\gnp}vs~kafeo||ws`ngsn_]^ihjyxtacul|wcwuuz{xx[goaT^eaaxxx|uwr~y{sv~|polK\rc]ers{{xwbowvkkrrmgz~|glkxj[crw}mbe[`|usytnhX^|ivkml}¹}||tesvvufexxqthddixzzy|wnjw}mtjep}}y~tvo[vyw{}pysgmiWeXw|||c\]N`ujgu\aq|}vlshjIWRWld^awrgR\morlrqzmpmxusjmVbQ`qtkz~|snywg}|l|yw~v|r_]paomcvkfu^j`\U_|}rshwdpssgjyxxzyniggsh|m{u{oj[frp||lrdcXhvsz{~}~||ousue]qjk|r}mmqg_JT^YSXZFZRel~t{}ug^}izu{ymxyzknù~so}qnlkwnso~egfXlb`kdQhbJ_Y]WYhukvYgkk_mqu}l{lyuc_gR]hcjo{~peQ_]aykzw{trs{|xuajrfy|uz|us^sv[yrnv}tp\YR^mqo[hXV{ci||y{|tufvrgytklq{qpvh~{beist~pyqheixsx~z~mxsdno__pRTXVTP]_xu]gxMNVWMWaev|jvru}h`n_Yicgqyadi\uuox{vunei_p{}u~vstrww|qirly|~{honqi_`S`oiTSZ?cnVky}z{qqprzz|y{pmwz{ux~}xkptmod`\ckdpm{wwrbpcYaaN[_LW\da_lm^ywTX]__rv~pjot[WbPPbcjsymqunWbg`{}wy|{unvr}v|h`k\]nklq~x|krqpzz{ynpdj}x_[]Cjr]m{}ufowgbtkk~{tsgvxw}h~~gmv~pvh^khefnxtrxxglpbxmZd\`d^gmvtt^qr[XXZVirvpUhti[if[oyz{ytuw~~nxqqspw}}}}}yls^ecYo~uut{srsnkkdtt`UWPeokluf|m{}t}vf~x~z~o~|~t|ss|pun`qwpns|twu}rs{jjgbx]S^WZchlx|zwlb`bbw~^y|oX`_Tdpruzopwqt~rxx~{|~XtpbNYWSl|vvjkrzy}{}~tqf`bllljpx~_}o`okh}ysorrxspoxqwisf_quqn{yxxqqdpwU^^\]ilzqppbWNQQ_rup]zybV`TWlszvmw|~w|ywzxvyu}~}{nazcagZdy{}yyxzs}tvuyuxnwse^P_eadfoywqjqsix~n}yx~m~squ~x{l\gkhdnmmvqv|ygf`YmXZ_``hkx}j|k]VXYiwzko{i\^NM]goyxr`Ypzvywxz~{{wzt}{vfp|qb]YGP`jr}zursy|rtyxkluvTbyghkovxfw~tptmaowzztmsej}xdt~fein}}zv`NUXYZd`nzytqn`hmfcifjerz_uqUPOO\`ds{qi{oinhSN[bit~wim{{nx~vswsulz|wuqmkvpwpm{fdmeQSalv~~uzzz{||}xwjtvsfXczcVxodikp~w|v{lpx{z}skrjh{z{rjx~t{~sdpekr}y~u[Y\]\a]bssx|vmm`XddW^`cdd{~}qjZXV]d_rxzalvaKNV]eqp|}}xnflz}ytwmj{}q{x{wr|w||s|kvoP^l\KT`ks|ty{nk~mw}~}~~wsepgmnjmnv{vv~apr`gpuuwijmdksv|rslilr~htoWVX\\_Xdrpwradnh_fgknmwwx^TOOX__sywuWcqaKOZenyz}vpu}q{}vywuvn~z|tpsvn|}un}kQZldSXes{tz~xsabqentjjjpx~gnnp|ztzgyykz}yzzz}ymlls}rr|e_beefcbumriZihad`igus{kd]^drqx_]mlYS]gnvz|xsqs~wl~xyu|v{}zzztufOL^`RR_lv~s~{ngmr|ususx|tbav}ppzyqta{|q~rkjipz~icsud]`ccedhupogyommiqo~{tjb[\con~yp]Xjm^[bkqy|xt{|xw|y}|urvzu}~lzy_LI]bY\iv~}xjcbu}sttuy}vgg~z{wypj~lo~syu~zp~nlinvzhfywifhifgdrn{vdktgiaigqz|~vlb`blmyp^]li]]bhmsx}z|{}m{zys{v}ywys||qm|kTFJ[\Y`ktz|~pz~|}vif{ywy}~}{i`gvwtw{{wool^wzo|xpi|nklqy{|kcflha^]\Z[iimqiyuidliry|vu{h^YZ]]kv|{oaYY]^[^dkq{~~yvrqsntqs{wxplf`jjrvsyqeusXQNPX`djrxxpr~~~}zxnXmzwvwss}}zonmnv~}|zvprkajmtvmww}v\ovonpus{urlegjc]YWZfgj}xfp|g`gdkpsk~vjcab_jsz~kh_V[b``eju|zzyxz~~~poknhnmmv~zvog^egltrwvjkydTTMHR`ehnpvymgo~wx~lc|wryw}~u{tlokfp|{vqjjg\[m{oouz{m`v{vropop}womcW\c^WTT_eenzp|fkjiqs{{p{si`]Z\imyxpifZNUbcbgm{{|~ympminlpw}{{nf]ZbbjnmqlanqYTTMFSgoswy}om|xzfj~}xqqxw~}tsrtohrxrqk_c{vswkruwednltrooptwtqgZ_kkd_]ejftvtqcefeou}~|~uwnea`drx~toj_QUekklq{w||~{nnojpsv}wmgdlmpvqqjcumYVTOGOftwyz~}kqww}ox|{|zytommkek~wro\fy{xrrz{pskesurqtx{spmh^^lrleadibxvmjonwzmtpgcdht|~~rmibVUeqqqu}y~vqupv{}{ulgdjllrnkadufXUURLQgzqz~wp}rptyzqpqqmq{satz}soowy|qvb]lsssw{|vtsoecpytlhkkfqkinnytjstnklq}}~tpmg\Yguwvyyyqprow{~zypjiompsni_ns`XVWTORg{you|w~uw~xproosrnqysc_zxx~spvzvyv_^lvuuw~|vtppoi`]hrnhgjcpsnqpumgnrmijsy}|zuqnkcYWetxy~x~wssnquw{urxxndaeegkhe]^pdVUVVSQWlnxuwzvty|{}{}}xulsworuvtqt~vi^q~yy|rmqruumyj[`oyvty}|r|xrssog_]gpollhl}qmmjmtzxedmrmkrv|xysqme\VXgx{zwvuwzvsoiiijow~rotshab`dgec^WfiXVXXVTU^qzlhvrmvy|}zwzyurli{{nptutrpq{ug]cwyzyssuuw}zlvxfaft|xxxx}|yvon|opqng`XU^imjghw{utppuyodbkqnpqu|~}{tu|onkf_YUXh{y{sstw|xtlihfiov~xmgjjc^[\`_][SWg]SUWWVX\cttipypr|yz}||wvwuqmel}snsvwwwuu{tf`p~zuryutsv{~okxpcbdpyzywy|zwtluvqssoid]Z`msplo|y|vropuzogbjsuvw{{t}xqqmhb_\^k{vrqsv|~xqjhghkqyxnfgkieabdc`[S_hYUWXXZ]bhuskvulr{z~~|{xsmet|nnruwxzywzudauyvss|xwvzps|nfcbky~}|~{wpjx~qoppnkhc]_ltrkq~~{wsu{sibeqy{|}}wruqomifdbbh{ywuw{}wpmopsv{zodbikjfcdc^WRbdWUUWZ^dimvzuypv}x|~}ztkgxznoqvzji}yxtv}xwvy}owxiea_eu~yom}rrrtuutpifnxxnx}{xtv}vlddr}wwxurqonmlikz{xwx}}wqoqtvy|}sgckrqmhhf`UWibXWX[^djpswz|upu}|~vjn~vopsx|}|hq}twv}|{yr~uigdbeu|uiqvppqstttpidkvvo}z}wnedqzpzzsponmmnnlmzzwwywqprtvy~}yod^eopied_WN\eYUUX[`govx{zrrxy~|~wmet{onquz}~tm~|v}|{{{{|mtzkffebet}wmhy|poprsstspielwv|zx}yrkdes}sqrpnmkkloqqtvrpqu||}yojjkosx}~}{si^YcnmifaZPQc]RSVY]clu{}~{}rlqy{}}{~wodjzqknsw{{trrmxvx{r{|~zlkzrhiihehw|umclznhjlkjjjigccju{x|}ytoidgu{sjvoihfdcehnruxvolmot{t{~vlhgimrx||yyskaWU^ije_XOIW]OMQUX^fpx}}zyzzzmov~~{wywxpgcsvjkpux{~vmjmvy~yr}~~}vlcovifiihfht~wofduthhijihhhhgfekw|u~~~}uqnifiu~wnm}wigfecdglsx{{~qmkkns{xpvysjfeimsxzxy|vpi`XU\hlf^VLN^WMORW[bku}xssslqx}x{}y~yoeiyqimquy}~ujdi}|z~uq{|thfurgiklkjktwndixnfgiihhhijihehtzv}{vroljkuvkr}pgfecceiov{~|zrmlmpwwpsyvokkmqvyzv~zuoh`ZV[flh_TKS^RMORW]eoyzqsvru||v|~{oeoxnjmrw||nch~~vqv}tgkvmfgiklmmr~znepxmijlmnpqrrqojfr}vy~xusqppuvmx~qkjiijmqv|x{trrv|yoovxurqqsvyxt}xsnid__fnlcWO[`TRSW\clvrtyuv|}wrjwzonpuzrbf~~ysuujrxlggjnqssu}|ohvwljknpsuvvuurkcqxyzwvvvuv~up}{okjjkmpsx}v}wtuz{rouzzxvuvxyvv|wsokgb^ckkbTQ_[RQSX^foyqx{x{zy~onzumnqv}qamztuzmitqgegkosuutyyknyslkmortvwwvuslg|yy|xvvwxww}swvnkjjknqv{z{vtv{yplqxyvtsuvvr{}ytpmjgb^bji^SZaWRRUZajt}zp}{z}}vzox|qnpsx~xicu{ww{pelsjefimquwusx~skuvkhhijlnoqqrsqkq{z|xvuvxyww}xr|xkfdcceiov}}}vrqtz|umimuwtstvvst|vrnjfda]Z^dbWT_YONPUZblv}pr|{{}~|vy|~rr|tlmosw|xmdn}{xxwmbanjbcfjmqssrqu{xnpxmeeeeefgiloqsqr{{yusssuwwww{~uy|oeca``diqy~zspqty~wphejrussttspz}splhdb`^[Y\`^V]_SNORW]fpzunwwu}|xu~zz~{t||plnqtw{~yqhiw{|yyzqf]fmdaeilpsuusqrwtpxvhdccbbbegjnqrrz}}~vtsstwyzywy}{w~xic`^^_djs{y|ysqrv{{vogdisxwvvuqqwpmjfdba_\XX\ZYb[OMOSX_is}}stzrs~|vwzxzxyznmoqtx}~ypiq|x}~zyynb^kj``cgkosvvtqorqt}sgdccbcehknrttu~~{usrsux{|{wvxx|uhca_`chpx|x||wuuy~|wpidgrzzxvsotvqnkhggfd`[WXY`g\RPRV\doyw}}pp|}u{~xvvzqoqtx~|rlw|tx}|~rddoiaadimsx||ztonoztjgggiknprtuvtvzwvwz~{urtvkfdceint{}wz~|z{~~zuojjr|~|ytnxxtqomllkie^VSUdi\SRTX_hs}}qoz}uwpsyrprv|sq}svqdipfaaejou{~~|umglsliijmpsuvwxxt|~ywwy|{rlrtkgefhmry|uy|yupkjq{~yro~|vsqonnnnkg_UNVki\VUW]dnxqoyzwulvztsvyzpw{tvzjdnmb`bfkqw||tjcp~qkihiknprtvvuuzwvwz}ynhwqiecdglrywqu|~zwspkjpz~wpvvromkkkkjhd[PJ\lcYUUX^fpz}wop{x{nj}vssuy}zqqzwz~obfmc]^afkqvz||xodcxvmheddegjmpsuuvrqqsw{|tikvkea`adjrzzpmrz~~~{{xuqnjghoz|ustmjgdccdeec^UKPeh]XUWZ`ir{x}{qos||ulr}xuuuwz|}|zvpmzzz~~~|~tfbkg]\^bfkptwywriaj}{qjeb__`beinqtyxrpopsvz}~}wngqzphb_^`elt|unkqy~~}y||wuromjijp{{uzzojfcaaabcb`ZQKWeb\YXY]dlt{~xwvrrv}{rlx|xvuuwxyzxuqlq~}}}~{{~{ocgka[\_cglptwxvpgcpyuojea_^_bfjnruupoopsw{~|vmiuzuoic``chow~~unlpz|xyvtqonlkkoy~zwumhebaabccc`ZQO[a_^\[]ahpx~}w{vttx|rp|~}{yxy{|}|zvqmv~}}z{yoglk`\]adioswyzwqhhrtrqmieccdfimprvwsqrtw{~~wnnvusqlgdeglsyyrnpy|z{xvtsrqonou{zzwpligfgghhfc\ST]]]___afmu|{zxxz~tu}{{~~}|~zspz|zwolqka^^afkqvy{{xrilsporpmkjjkmoqsswzvtuwz}~worwqoqokijmqw}~xrrz{||ywvvvusporww}wqnljjjkkjhd\UZ^YZ`bcfkry}{|}~v{~wx~{sr{vsmptia^_chntx{}|xqkrtlmqrpnmnnoqrss{zvuvy|}uqxvmlppmlmosy~~xssyz~{yxwwwwuropsx~vqnkjjkkjigaYW_]VX_dfiou|~}}~~~zy|tw}|uowwpkltqe_^`diotxz{ytmowqhjpqomlllmoqru|vsstw{~~xquzqghmnlkmpu{zvrryzy}xvtsttuvuronr~xplhfefgggfc\W]cZSXagimrx~|z{{~~y|}yxrw~{wrmoxnfepvj`]^`chmruwwtnlvvidgmmjgffgjlor}|tpooqux{}|xrrzwhbejljjlqw||wtqoqx{w~}urpoopqsttronv}qjeb`_`abb`\WYc_TRYcilosx|~|xtzyy|yw~y|tqw~{yvsojjvzqf_ftre_]^adhlpstrokqypdadjkgdbcehknuwqnmnpswyzxtpv|qd`cilkknsy}}xusqprxyywqonmmoqsttrmm{xngb_]\]___]YW_f\SSZelprvz||xss~zxz~~ww{y|sqw~{xuqlhm}xma\hupe_^_adhlprrplmwynd`bikieddfiko{yspooqtvxwtqs{{pe`binooruy|}~zwusrrv~z~wrpoooprttsolo~{rjeb`___^]ZX\ef_XV[gpuwy{{zvty}|~{vy~|xux}xsnjjs~vlb_hqqkeccehknoppnnszzskeejonkhffhksyusstuvvutsw}|ulfejqsttvy|~~|ywuuz~yvutssssrpnlpzzsmifdba_][[_egc^\_gqx|~~||{wz~~~{|ysppw}ulfdhmonmkklnoqqqpoquyyuplknqrqnlklpx}zxxwwvutux{zvpkjlptvxz||yvuuw{~}zwutrqponmot{ytokheb`]\^befebbdkry~~zy}~zusuyyrlhgikmnoooppqqqpppsvxxuronnppponnpu}~{yxwutttuxxwtpmlmpsvy|}zwutuvy|}yvtrqoonopsx|}ytplheb`__adfgfefintz~{z||xuuw{zuokiijkmnpqrrrrrrqqsuwxwtrpnnnnnnnqu|~|zywvuuuuwxwurommnqtx|{xvuttuwz~}zvtqpoooqsvy}}yuqmifdbaabdfggghjnrx|~||~~{xvuw{~~zuqmkjjkmnprssttsssstuvwvuspnmlllmnqv|~|zyxwvuuvvwvurpnnnptx|~{xvutuvwy|}zwtrqppqsux{}~|yvrokifddcdfghijklosw{~}}~~}}~{ywvwz}{wspmlklmnoqsttutttuuvwwwvtrpnlkklnqv{~}{zyxxwwwwwwvtrqooprvz~|ywvuuvwxz}~{yvtrqqrsvx{}~}{xuroljhgffghijklmorvy}~}}}~~}~~|zxwwy{~{wspnmllmnprsuvvvvvvwxxxxwusqomllmosw}}|{zyyxxxxxxxwusrqpqsvz|zxvvvvwyz|~}{ywusrrstvy{}~~|zxurpmkjihiijklmnoqtwz}~~~~}~}{yxxy{~|xuronmlmnoqstuvvwwxxyyyyxwusqonnnpsw|}|{zyyyxxyyyxwvusrqrsvy}|ywvvvvwyz|}~}}{ywutssstvx{}~~}{ywtronlkkkklmnopqsux{~~~}{yxxy{}}zvsqommmnoqstuvwxxyyzz{zzxwusqpooqsw|~|{zyyyyyyyyyyxwutsrstvz}|zxwvvwxyz{|}||zywvttstuwy{}~~~}{yvtrpnmmlmmnoopqstwy|~~}~}{yxxy{~}yvsqonnnoprtuvwxyyz{{{{{zywusqpppruy}{zzyyyyzzzzzyxwutsstvx|}zywwwwxxyz{||{zyxvuttuvwy|}~|zxusqponnnnoopqrsuwy{~~~~~~}{yxxy{}}zwtrpooopqrtuvwxyzz{{{{{zywusqpppruy~}{zzyyyyzzzzyyxwvuttuwy|}zyxwwwxyyz{{{{zyxwvuvvwy{}~~|zxvtrqpoooppqrrsuvxz|~~}}~~}zyxxy{}~zxusqpppqrsuvwxyzz{||||{zywvtrqpqruy~}{zzzzzzz{{{zzyxwvuuvwz}|zyxwwxxyyz{{{zzyxwvvvwxz|~}{ywusrqqppqqrrstuwxz|~~}||}~}{yxxxz||ywtsqqqqrsuvwxyz{|||}}|{zywusrqqrtx|~|{zzzzzz{{{{zyxwvvuvwy|~|zyxxxxyyzzzzzzyxxwwwwxz{}~}{ywutsrrrrrsstuvwxz|~~}||}~}{yxxxz||ywusrqqrrtuvwxyz{||}}}|{zywvtsrrsux|~|{zzzzzzz{{{zzyxwwvwxz|~|zyyxxxyyzzzzzyyxwwvwwxz{}}{yxvussrrssstuvwxy{}~~}||}~~|zyxxy{~}{xvtsrrrstuvwxyz{||}}}}}|{yxvtsstux{~|{zzyyzzzz{{zzyxxwwwxy{~}{zyyyyyyzzzzzyyxwwwwwxy{}~~|zxwuttsssstuuvwxz{}}}}}~~~}{yxxy{}}{yvusrrrstuvxyyz{||}}}}}|{yxwuttuvy|~|{zzyyzzzzzzzzyyxxxxy{}~}{zyyyyyyyyyyyyxxwwwwxyz|}~|{ywvuttttuuvwwyz{}~~}||}~~~~|zyxyz|~~|zxvutssstuvwxyz{||}}}}}||zyxvuuuvx{~}|{zzzzzzz{{zzzyyxxxyz|}|zzyyyyzzzzzyyxxwwwwxyz|}}{zxwvuuuuuuvwxyz{}~~}|||}~~~|zyyyz|~|zxwuttttuvwxyz{||}}~~~}}|{yxwvuuvx{~}|{zzzzz{{{{{zzyyyyyz{}~|{zzyyyzzzzzzyyyxxwwxyz{}~}{zxwvvuuuvvwwxyz|}}|{{|}~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m25.bin b/applications/SprPoP/assets/packed/MUS/m25.bin deleted file mode 100644 index 6559022..0000000 --- a/applications/SprPoP/assets/packed/MUS/m25.bin +++ /dev/null @@ -1 +0,0 @@ -hzlpztpytncybxjehgl^{}d~tzmzm{}ztv~~]zsi{vrrtefzea}~yosthwx}wqzjcwgps`utxxe|Zyvfwyzlvts}zwvxtnleo{qvt{s]}y]s{zzi}ez~ykrtwlva{gpcuw|kefp~sfztr}k|~nxyakg~~vsruclubh|~y}q|un|{uq|rfyfnveizvsg|\y{pdtryusz~~xtvp{ick|r}ytxx_{y||atzz|nly{m}xu~hz`wni`|}csb}nsy`xr{m{yz|r|ttty_q{oswzphoxph|xx{zlkw}rusd|mvrkqszmeo|h}lhux|m{|x|nttifd~~uvsxevytzfuz||zvuw}pv|yl|drxm^~}vgve}oq|`{xxnywu~q{ptx^q{otwztl}jrrp~ywyr}lys|qhs}fxppvoivve|fovz~zoyvx|ed{qs]U|Vuzn`bVi||jj`qroywjggv{||w`z|thbulX{yF{~^ewrksrtoqzqtt\Jsevhp}]RWf}ihwxrj}w|swzpubxmiznuta|rr{yqh}soredxwrvtv|kuclqVsp{cLtrcqiee|{|lz~{|wpo~rimt`pPyynybgsxi~X~imt~qnfgkW`pz[v\v~`urx~|{sVwuwz{wixrY_xqx{wl~twrmn}vzbd{vqmg|kXsvvpv}rcz]wy^~Vbfw^}ht|~ty`tYly}|wx{tzmo|awz{wz}wb}ihbT~ygnysltrfofW~yjwvpyuvlZt{zy}woYxcr}inkizww`vjuizql_}lNxs}^sddjWww|nrzwmii{y_sexXqz]sxe\{lzhyx}p|k~|uqmpxwRr}yup~X\}wuhwZax}]myw|xibkrwp]pqvvsmqywzzvv{{w||erjo}lqcgRm}sqqaefxXnsgrxZkYtM`~t~hjzSndo~zeg\|tw~u~i}|LtxxrwWL|~dkmrnpujrekgl^rkkveS~j~{{cwaoyqc|Tsqy{l~sgr}nb|ekSIu}|d|op\{gW}ved>j|Q~n_tuzS^tX}puzVn}|{twycy~[b|n~ktbyrbdmugS`xdYj^mejsq{jjVWYjewjk{sztdutvS`HqjYaxyyuL`m~{ug}|gq`ces^rqnq_p{nFhhdtum]rgm}oolzxw|phfu{yw}l{`xzz|ngg|ixwxfnivxvmljv\ymp\|]|`cxoZt}l~nlaqw^qco}~_]y[ukvqw|q}ow{]wgsgw}ixsWnw|smshshds~se}}Qjhp~lfwwx\rsy{~onywtur~vzpnljvi|d^^ngtkgjl}z~pe]s~wvukuvpuQd]i{aryswttf}rknlwfzwwtpl線q~ql~βϴӾĪxɘиijt^baP]U642eB4UF~ogkjyu̬ȵvshΣ]agF^6HqspTQM[L?x|TsǾġ}gRn{~fLazcUlj^]I@Grimx[JMUSJbzvrmtau\vTxLZc&Wdyqz}}rȼqZ{VyXxlqfq}SI=OBNho}ncujmMui=YKgu֯rucacu\{whWHE9YSksɯȵǢlyerITwYEc`avtmO:.$RfeRaL]K=Y1>^?\_[EBV<|MBaRR4@QML6-YN.ccRnoou]cmxbpT^Vab8eZdMTZ2XYLechhysgfTblY;AWi\Xzx|m_a1IqLXWinny_^yk^nky˰ެܻȵlf[hx]jDGq\`iѼhsaPWL\.:Z]ORj7M=O`B\ZBgGXHfkIvV]M^qKnu_~q_Vbpv{zod~exslefSf_{_B[Yem~vk{om}zo{YpnY_7hNJgYga}|³ܱϵuĠѧsvZ]=/C-U\DZrSRZc/7]_RJhkOlZ>_RJ;;[>ZDKkDlkg`XgK^sdIJCR>)JJA.'1X`m{r}{rF\pwYPygdhkqefSfZCiUdj=i_mixga_k[K*D`UJS{q^jbszl~|UkRQ8@dPlǾ̸Ǧ¿༴x{a`bR[C(C@WQt|d|{^il]qNQhWV<^d@Y5R]RgS\U[h\~|quwnim}k`c|~mƺrl{vudM\GGZWiX[nWztx}rirpjfOeqa\ivxpvwmYzyst{r}nȳs}cuvq}{gzqT[bqbLaU{~o`dnxj[z}sukx[ZCfrOiFeqc~{ejt`|sdnmUr}nWCVxo|VYcnllei{}\i{uzg}bObrj]wqys|eL`lb\\gR_sW^nWF:ruc~atv|qk{ygYdLIi~ijǵþwkq\CZiLKSW=DR9GQ:&L-2H><=WVI3JWPhooga{}lpm|hawopfrry|tp`qqΫʾ~xpns{xhzvXlyY6ItPf^Oqejztmhͱҭs}}\g{ejnzkQ05+6KB5`WҲÛ}yxo}idu_@+VQ2K3M^R_fdPTc[omV>UtcEhz[Y_zv}ȭ}|ym~ynVIS:2L\cJZe]zurr{u|t~{jvnqm[uihiP\]ewqfZ~vuqm~{isytlW?KA*FbcTvuhyuzvf]^dga[XV^nkSalVXg\OV_gptof[TZk|ti`f|{spt||{ur{{~}}xh\fu{xd_elnjfd_VM@>SiYh{slktx`Wj[OcjZU^hryzskc_etsfZP]jlh`XQSZcloc[lxemli{~{~q`cormWJLSXXXXVOH>:J^NJme]v~vqoptwzpotre_agjgdabn}scwxfpujoxytrxwrxeciquwyytnf`hp}z}}}qfny}xeZ[`fiklhaWLL_n\asnvrtue[Y\\XUUZgo_Sik[etlcfpz|tmjprdftzyria^cjswnck|qh{fitwrkb]\\VJ<8EQXRDBIQUVWUOG=5>W^Pmwqoty}~xpeapxn~{xxxuqps~kvniyyjcflqspjc`co|zoeamy~{unikqx|vfeutbl}k]epvwsonmi_RIOZ^[K>=CILOPOKCF\nij|{oklpsuvupjjvx}{xttwopzhn{xjbbfgfd`_clvwoe^ajsvtqoptvsi\]ln\ZlkZS[cggec`[RICGPUTK?9:>CGIJGEEPdla_ysw}{yx{woup~{olnprqonqy{rq{{|}|vwwmkoty||zurw~{ru}|w{sorutplgbZQKMWcjiaXUVXZZWRLGJYhf]oy|~nuuopty|{z{vmmty{yvsrssnd\dspagxuhfox|}|zxrjb`fnrodXQOQTUUSNKMYhgY^uvhl|{{}xtrqsx}mn~~nm}zpllnonmnt}zsszwx|u|qs|~xphcfntuncZXZ^bddcabl}zuĻ}}x}{skdcipsodZTSUXYYVRPVdpk^f{ylpxw|}tnjiikqwypcgxxiixxokklljiimsxvmaWSW^cdcaabcaZTXhn`ZioaSPTVTPLF?81/5AKQPHBACFIJIE@@HXaZXo|~zrooprrpmkozyyvp~vkt~{pgdccbaadjqtqh_[^elpqqpookcYWbkbSYgeWPRX\]\YTNHCDJRVTLC<;=?CDDCEM[geYav{qp~}xyvuuuvx|zw{|}|z~}wst{{qkjlnpqpoowy{qkkpvy{|}~~|vpt~qw~nb`ab`]YTNIGKU`ghc[USSSSQNJJR`kjcnv~}}|uux}~|zxupg_amvmagwvjcflqssqnic__empng]VRRSTUUUW_jrlah{~spz~~||~{prvnwzsonmmoqv}zrorx~}unr~wkt|phinqrqnje_\^ekomf_ZYZ]_abchs{yzrruwwuqke`^aglnjaXRPPRSSSTZeprhbp|qr}ytuz|xuuvz~zoju|oo|xqmjgeefimni`UMJMSX[]^__^XSU`kfVT_bUE?=??><95214>IRVTMHDDDDDCCFO]jlgn||~zxzxqnnnoppqv~zryplv~{skgdcccfkpspja[Y\afijjheaZRT^faRP\c[OIJMOOMJFB@AFMRSOHB??@BEGIOYemiafy|v|{}~|yxwy|}|zvrnnrx~}wojhhijklnu|y~tkdcfkoqsttsokjq}ujmwvi\USRQOLHEDFLV_efb\WTRQPONOT^hjdct~~~{vogcfpvm`cpvnd`behiifc`^afmppkd^ZXWXXY[`istldl|xrwyszwpwyurqrsv{{tnkmquy{{zxsnijt|xkfpzvldbceedb_\Z[`fkmke^ZYY[\^afp{vy{~vqoppomiebacglnlg_YUSRRSTW]fmlc^gvypjoy{xx||spywpwztpnlkkmoniaXPJJLPRTVVUSOMR\ebVPYa]PD?<;9640//2:DLRSQMJHHGGGGJR[b`[_rƹ}z{zy{}~~|zxx{yurqqrsv{}x{}qqz~xrnkiijmqsrng_ZYZ]abbb`\WRQXbbXNP[`YPIGHIHGECBBEJPSTQLGDCDEGJOVahic^hxztw~|}y~{vttuuspnlmpuz}}xrmjhhhikov{t|}vnf`^`cfijkkigeirzzndenofZPKHGFDCBCFMU^dfea]YVTSRSU[cjkfeq|xrlggnuuj`cntofa_`aba`_^_bhmqqnida_^_`bgmuzxpltzzyv||rs||yvvwy{~~ytnjikmpqqpnjfdgowtiaeptne^\\\\[YXWY]bgkkhd`^^^`dgnv}|}v{}slihgfda^]^aeijid_ZWUUVWZ_fmpkccnz{smpx~yxy}{uwwrwysnkhggggd_XPIFFILORTSSPOPW`cZMJQVRF;521000026854444569>EMTY[YWUSRRRRUY_ehfbgvƾyw~xqnmmnmmllmpuz~~{xuttuwy}{y|wtrrrstusnhb^[[]^__][WSQRW^]TLMVZVOIGGGGGFEEGJOTXYWURPPQRUX]dkppkhp|zz}z|{tw~|uolkkkihfefimqssplifedefhlrx|ysouzz~ytqooooolhb]ZYZ]`cdeda_]^dif[RRXZSJC@??@ABCFIPW^ceea^[YXWXY\binokkt~yx|~sjjquphb_____^]]_bgmpqpmkihijlosy|xz{}zxvvwxzzxtniecdegggfc`\Z\bhf\VYad`YTRRSSSRQRTW]befeb`__`beinu|zy}z|wqu||vnhfedcb`^]_aeijjgc_]\\]^aekqsohhq{{uqsy{uw|}ysmhebaabba^YTPNOQTWYZYWTQQU[[SHDIMJB:6568:;=?CIPW]``]ZWUTTTVZ_gnqonv|st{~yrljijjjiiiknsx{|{xutttvwz~~x{}yusrqrstspke`]\\^__^\YURQU\^XNMTZYRLIHIIIIHHILQVZ\\ZXVVVX[^bhpvwrot|z{xru}~xqliiihgedcehlpqpmjgeddefimsyzvppz|y|~zupmkkkkkjfa\YXZ\_bccb_\Z[`dbWNNTUOGA>>>@ABDFJPW^cdc`][YXXXZ^cjnmjlw{qouyumfcbaaa`__`cglpqpmkiiijlosx|x~}~~{yxwxzzzwsmhdcdefffda^ZY\bfaXTZaa[UQPPQQQPOPSW\acba^\\\^`cflsy|xsv}}{su|~yrlihgfeca`acfjlkieb_^]^_adiorpignx{vqqw}z{~ysnjhffffeb^XTQQSVXZ[[ZWTSV\_YNHLQOH@:889:;;=@ELSY]_^[YWVVVWY\chkifjw»yw}}unjiiihgffgjnsvxwtrpopqrux}~~|~zxvuuvwwuqkfa__`aaa_]ZVSTY_^VOPW[XQLJJKKKJJJKOSX\]\ZXVWWY[^cipuupnt~~}{|zsu|~yrljiihgedcdfjmpomjgeccdegjouxvpmt~~xy~}||vqmkiiijjhe`\YYZ]_abb`^ZXX]a^SKKPRME?==>@ACDGKPW^bdca^[ZXXYZ^cjopmluzqqwyumgdccbba``adimprqnlkkklnquz~{}}~zxvvvwxxuqlgcaabcdcb_\XVX]b`XRU\_[TPOOOPPOOPQUZ_bcb`_^^`bdhlsz~}xw{y{vpsyztmhfeedcb``adgkllifcaaabceiotvsmmu~yux}ztvzzwqlhecbcddda]YUTUWZ\]]\ZVSRTYYQGCHLIB<99;=?ACEINT[`cb`]ZXWWXZ]bipsqpwþ}uu{}xpkhgggffeegjnsvwusqppqrtw{{~{wutstuutqlgb_^^_``_]ZVSSV\^XPNTZYSNKKKLLLKLMPTY]__]\[Z[]_bglsyyvsw|y{wqtz{vojhhggfdccdgjnoolifeddefimrwyupqz}y||x{~~ztokihghiihea]ZZ[]_aba`]YVVZ][QIINOKD?==?@BDEHLRX^bdb`][ZYYZ\_ekoolnxxw|~zrlhggfedcbceinpqpnljjjkmosx~{x~}~}zxvvvwxwuqkfcbbcddca^[XWY_b^URW]^XSOOOPPPOOPRV[_ab`^]]]^`cglrxzwrv~}vw}{uomllljihghjmprrpmjhggghjmqwywqou~|wx|~wx|~}ytpnlkklllifa]ZZ[\^__^\YVUW\^YPLOUUOIEDDEFFGHKNSY^aba_]\\\]_afkqrplpz}|{uqpoonmlklnquxyxusqpppqsv{}y}{z~}ywuttuvvtqlgca`aaba`^[XWX\a`YSTZ^\VRPPPPQPPQRUZ^acb`_^^^`beintxxsqw~xzytqppponmmnptwyywtrponopruy}}wuz}|xw{~~|xusqpqqrrpmhda``abcba_]ZYZ_b`XRSY]ZUPNNOPPQRSVY^cfggecbbbcegkpvyxtsyzzztqpoonmmmnpswyyxvtrqqqrtw{zx|}~|xw|~{xvtttuuutplgdbbbccba_][Z]bec\WY`ca\XVVVVVWWXZ^bfijihgffghknrw|~|xw~}x{zusrqqppooqswy{{yvtrqqrsuy}|ww}|{~z{xsuy|{yvsqqqqrrqnkfca``abba`][YZ^cc]VUZ_`\WTSSTUUVWY\`ehjjiggffgikosy||xuz||~yvtssrrrrsvy|}~}zxwvuvwy|{z~{|{vw{~}zxvuuuuuurnjfdbbcccba_]\]afga[Y^dea]YXXXYYYZ\^bfikkjihghikmquz}|xuyz}}xvuttssssuwz}~~}zxvuuvwy|}xy}|}{~xux}~|ywvuuvvvurnjgeeefffeca__afig`[\bfea\ZYZZ[[[]_bfjlmmkjijjkmptx{|yuv|}|{xvuttssstvy|~~}{ywvuvvx{~~yw{}{|~{|}ww{}zyxxxxxwurnkhgfgggfecbabfjlga^bhjgc_]]]]]^^`bfilnonlkkkkmorvz}|xux|}|ywvvuuuuvx{}~|zxwvvwy|~xw||z|}z{{vvy}~|zxwwwxwwuqnjhfffggfecbabfjkga^agigc`^]]]]^_`cfilnonmlkklmorvz|{wtv~~~~~{yxwwvvvwy|~~|zyxxy{}{x{||{z~xvy}~|zyxxyyxwtqmjhghhhhgedccfjmlfaagkkhda`````abcfimopponmlmnoruy|}zvuz}|~}zxxwwwwwx{}}{zyzz|zy}~||}z{}wvy}~|zyyyyyywtqnkiiiiiihgedehmomgbcimmjfcbbbbbcdfilorssrppopqrtx{~~|xw{|}}zxwwvvvwxz|~}{zyyz|~zy|~{{~~}~|yz~}wux|}{zyyyyyywuqnkjiiiiihgffgjnpnhdfkoolhfddddeegilortuttsrrrsuwz~|yy~|~}zyxxwwwxz|~}|{z{|~}yz}{|~}}~}zx{yuuy}~~|{zyyyyyxvsoljiiiiiihgffimppkedhnpnjgeddeefghknqsuutssrrstvy|~zx{}~|zyxxxxyz|}|||}~zz~~||~}}}}zy{zvvy}~~}|{zzzzzywtqnlkjjjjjihhhkorqlgfjoqpligfffgghjlortvvuttsstuwz}}yw{~|~|zyyyxyz{}}|||~}z{}{|~~}}~}zz}yvw{~~||{{{{{ywtqomlllllkjiiknrsqlhinrrpljhhhhhijlortvwwvuttuuwy|~~{xx~~~}}{zyyyyy{|~}||}~zy}{z|~~|||~~zy{|wvy}~}|||||{ywtqonmmmmllkjkmqttpkilqtspmkjiiijklnqtvwxwvuuuuvxz}}ywz~}}~~|{zzzzz|}~}}}~~zy}~{{|~}|||~}zy{|wvy|~}}||||{ywtqonmmmmmlkklnruuqkilqttqnlkjjjkkmoqtvwxxwvuuvwx{}}ywy}~~}{{zzz{|~~~~~{y||{|}~|||}~{yz~~yvx{~~}}}}}|zxvsqonnnnnmmllnquvtokkptutqnllkkllmoqtvxyyxwvvvwxz||xx|}}}~}{{{z{|}~~{z~|{|}}|||}}zy{~ywx{~~~}}}}|{xvsqpoooonnmmnosvwtolmquvurpnmmmmnoqsuwyzzzyxxxyz|~|yy}~}}}|{{zzz{|~~~~{z}|{{}~}|{|}~|zyz~}xvx{~~}}}}}|{yvtrppoooonnnoqtwxupmnrvwvsqonnnooqrtwyz{{{zyyyz{}|yz~~}~~}|{{{{|}}z{~{{|}}|{{|}~{yy|{wvy|~~~}}}}}{zwusqppoooonnnpsvxwrnmpuxwurpoooooprtvxz{|{{zzzz{}~zy|~~}~~||{{||~~{{|{{}~~}|{{|}~}{yy|{wwy|~~~~~}}|zxvtrqpppppoopqtwyxtonqvxxvtrppppqrsuwy{|||{{zz{|}}zy|}~}~~|||||}~}z{~{{|}~}|{{|}}zyz~zwxz}~~~~}|zxvtrrqqqqqppqsvyzwroptxyxvtrqqqqrstvxz||||{{{{|}~~{yz~~}~~}}||||}~~{z}|{{|}~~}|{{{|~~{yy|}ywy|~~~}|zxvtsrrrrqqqqsuxzzvrprvyzyvtsrrrrstvxz{|}}||{{{|}}zy{}}~~~}}||}}~}{{~|{{|}~~~}|{{{|~}{yz|}ywy|~~}|zxvtssrrrrqqrsvy{zvrprvyzywussrrssuvxz{|}}||{{|}~}zy{}}}~~~}}}}}~{z}}{{|}~~~~}|{{{|}~|zy{zxx{}~}{ywutssssrrrrsux{{yurruy{{ywutssstuvxz{}}}}}||||}|yz}~}}~}~~}}}}~~{{~}{{|}~~~~~}|{{{|}}{yz|~zxx{}~}{ywvutssssssstwy{|yursvz|{zwvutttuvwyz|}~~~}}}}~~|zz}}}~}}~}}}}~~{{~}{{|}}~~~}}|{{{|}~}{yy|~zxx{}~}{yxvutttsssstuxz||yusswz||zxwvuuuvwxz{}~~~~~~~|z{~}}~}~~}}}~~|{||{{|}}~~}}|{{{{|}~|zyz}|yxy|~~~|zywvuttttsstuwy|}{wtsuy||{yxvvuuvwxy{}~~~~~~}{z}~}~}~~~~~~}{{}{{{|}}~}}|{{{{|}~~|zyz}}yxy{~~}{yxvuutttttuvwz|}{xttvy|}|zywvvvwwxz{}~~~~}{z}}}}~}~~~~~|{|}{{||}~~}}|{{{{|~}{zz{|yxz}~|{yxvvuuuuuuuwy{}}zwtux{}}|zxwwwwwxy{|~~~{z{~}}}~~}~~~}{{~~|{{|}}}}}|{{{{|}~~|zzz}~zxy{~}|zyxwvvuuuuvwx{}~}yvtvy|~}|zyxwwxxyz| \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m26.bin b/applications/SprPoP/assets/packed/MUS/m26.bin deleted file mode 100644 index ac75614..0000000 --- a/applications/SprPoP/assets/packed/MUS/m26.bin +++ /dev/null @@ -1,3 +0,0 @@ -vmfa__bgmt||xvtuw{}~~|yutv~wqlmoszwh_m}trstvx{{jm|tmhb_`ciq{|gbrpuwrg`cqzijywxwxyyyxw{|t{omosvvussuy~fcobemuz~ur~jfowrfbo~~padzxx{xqtljnrttronprvy|h`yskpxvv{ooxzqegv~yx{~~{th^aw|{{vt||qkjmpqokihiknqsv{}xkbnyv|z{~x|}ogn}yttuurlc\_o~unoprywokjkmkgdbabdfhkosskch|~~ylkx~vsrrqkd\\i}ykiknt~wnhffggeb_^^_adgjnpleev~slt|usrple^\ex{||kdeipzyohedeeda^\\]_adhlnlfcozorxtrplf_\bs{ymbaelv{qiecddda^\[\^`cfjmmgbjsq||vspmga\_n{x~pc`cis}vmgeeeeb`]\\^`cgknnhbfztqz}wspmhb]^i}{w|sd`bgozzqjgffec`^\]^`cgkooiabuvpxxspmic]]fxzw{uf`afmw}umigfec`^]]^`cglooia`p~vqxxtqnjd_]duyv{ufabejs}xrmjigda_]]_afjorqi_]l}~vpxxtqnje`]bq~wv|ugbceipz|upljgda_^^`cfkpsri^[i}|vqwxtqnkfa^am}vu{ugbbdgmwysnkheb`__`cglqtsk_Ze}{~yrvzurolgb_`j||vtzwibbdfkt~|upmifca__`cglqtsl`Ybz}z{{ru{urolhc_`hw}wtyzkcaceir|xsokheb``acgkpttncZ^s~zztt|~xtpmid``es~wtw~od`adhoy{uqmjfdbabcgkostoe[[lzy~wsyzuqmjea_cnytu}sf`_bfmw~xsokhecbbcfinrsph]Ye~{y|}tv~xsokfb_ajz{utyyj`]_dku{uqnjgeccdfimprqk`Y_t{xzwtz{uqlhc``gt}xtv~pc]]ahr}}wsoligeddegjnppld[[j|yz}tv~ysnid`_co{vuyyi^Z]do{zuqnligedegiloomf^Zbw}yyyty~wqkfa_ajy~xtu|qbYY_kw}xspnkigfffhjmnmib\^m~zy}uu|ztmgb_`gt{vtxxh\W[eszuromjigfghjlmmjd^]g|{y|ytx~wpjd__do|wtv}}n`WXan||wsqnljhgghiklmkf`]cs|y{~vv}zrlea_blz}xtuzsdYW]ixyurpmkihghijllkfa]`m|yzxuz}zwuux|~}{yz|taRLQ\ky|{|}zvpiiilpsvtpeVHAOtrj}|~~r}j]QGGUnmtffknle^]ft}wykecaabfmu}w_GQ~rmvw|{y{vqjxrhc``ah{}xnnswvoe^\aotf|o``dhknrttttsodSI\~xuq{zvw{nfaZVYbpmrwot}tkhkrwvpr}udVXejfbbdec[OGRr~~|vwy|p^`}zzyzz}z~yihwzj\UTUXZ^i|vnfdnzwibdbXQXk|ztsv|zp|vnrrabjjedjt|}wu}}yz~wdVX^aahwxmd[TOMNSYbih\NNaxtrwjbfy{pfeq||wy|uxwld_^_a`^\^_ZOOb}|woe_eu{y~|pdbovkaXROOS]jw~yqtyslfdk~rjptoga__^]ZWXbt~{uwxogbbgp{rekss|}xqjbZTPPYnvkeirth\X[ZURXcjhfiouwwvw|tu~wux|yphddfilotzqq|p_WUQMQas|yri`YUSSW\beaVOVk}~vszwoowzqc^cjlnuxne_]^cjprl_NIVp~zungenslw~{xw~~y}}uor{{umfa]\^aeiic]czvi`bp~rtzztleb^[WTU`s|xx{{vwvuy|tmihjow{qt|xuvz}{urpmf\UUavumlsytfXTSSS[hsslc\Z\dmv}~rkv~y~{rkfb^\^j}vu}qe_[VV]jstqlhd_\[[^adcZNJXt}{zwuv|vw~yhZUW]hy{tnifeehlpneXR`{~wohekzyigr~ysos~yonpvyqljhgggijje[RXszspu{qrz{tle_XSQXh|{unjmyzokmtyurppruy{xpkuxqnt~|tmhc_`gv|wqpu{xiYOMQ[hsvrke`\ZZ]dnw~~wlhww|{skd]Z^lz{~m^XZakuzwqkgecbbabced_VMOd~{vqopyyw|ygZUW`n|~yuqnlklmnle\Wazzslimysjksyywvvuspr|}nffnzxqljjkmonjaWUfztu}~pmt}|ume^XVZgx}wpkimv}zqhfjq}}zwvuvxyxsjem~vrs~{slfaaiy|upnpw}{n]ROS[gsxupid`]\\^bgmolggvxqjd`bl}}oaZZ_jw{rjda``behigaVOSh~wrmmt{{vg]Z\alw}yvsrqqqstsndZYg{unknzqmqxzwqmihhjo{wkeeirytpoprsqj_Y^r{uu||qqw{{wrmgb][_kz|unlovzui^Z]clw~{yy{}~}wmddryuv~||vpjfflz|smmryzqdZUUW\fqxxtnidbabdghf`ZYd{~xsnifhqzz~xjb__ahs}{slfcbcfhid\ST_ufkrwvznnx|ozfVBGTFVbfxzwqcbUcxz~r}iqccq}mlwv|hqnjnghcrqw}r``\kt~vjrtWTA9Vuz~ll[byuhLT\Xclz~ysew||dbkWWUQlk`pnfhbi^cpoýwhywvh}ukpp|v}rk~zpiX_U?:4@GWtrt}sxtV38c~~åre}lbHPWNU`t|tofJNxujXLZWLNKUPSYKXbga^N]{~|r}yih`ssZL?EJVsw{Q?\~vf}~tso{xyTZw^\GNTFCHYs|[No~wl_liZZVbcjs`\sžwohgUZnqx}zzr~}lwoYTGZf\TFBCHbgniUjuSds|ţugmo[_eTKHNdsuK3H}id^Q^]MJEOT_qe^kgx°uxuccsqr{l{rhS_ibd`^ZSeeg`J^qA<=Ny|pvtxotgmvh[UTbkgCIzmjk`npa\V\`h}vq~uuz̷}lsm[Vd^X`ix~gSa{t^dkbcgnslvoioVg[K=:^ygg[cqgYRKSSm~}mD>fwYT\Vioc`]bgl}z}λx}kdpk`cg}nOR~fgk]XZbnmyn]kvbESWF6';O_y̭}tch{wmh`d_p{|]StZNUQfrieaehj{wsskg¶k{vn`Vb_SSTepzTO~zz~odcgvzrw|rS]iWJ5>DHaxrn|lURdd]]X\VaicvfceOSMbtpporxx|yjuĞ{pdnk^^[gm|QCi}kuknueVQQ^d{~nprnz~vW_o^VCGF>Lcqiùj`mmgjgmfnsgp}abdDB7GZZ]`djjzukzuaaxxrhtsed`ilyúaRtzcpnwyia]fj}x~`fl[WEHE42?^|^Ryobljchirnu{mpimwRL>HXWZbituytmxyxsitrc_[ack}|\LkiISUbxuibZ`bwnvwbbSYXD98JigWw}puodefqpw~nlzzuWZuND27FCBKVgm{yvvƗ}tpidilrſo_|vNNMZtyrnefcs}xv}clpTSGOSA2(+?YmZw|plkv{}]_eZD@KGCGOblvghWX˜ufqwj`XZ^cusrpeZQHMhttxuxqz{}gtf_PXaUF;49DliVopinomd^div|~\T~icQJQICGJZexnN@fȪvzvqifgj}}zqgeUG@Q\`imuru{rz|ox~vzhT_meQR^YQJBA>TiǾu^rznmkyooqyq_}mj\VZN@?BOUmzoI(5tz{|pklmml{|zŶyim[MVXWdpzoTWxud`cZUVRRIQUVx®vT]p`_Xhwwxsqps{qomfcmfUNIS[og=5]}x|sos||yx]nqaNQNCFQhw|{mTQy|ppwk\[^fcjg[eǶrtziTN=?_]fstž~zmX`^WHY{{prd{pw~oxpo_6?m{zttrrgq{ȗc_^JIC@Ws|~dSEcyYWiWRBOtox{q]c|nS]mzdbVX|ŒoT_h`kd\fk}xĴxeUFVh_[`Y|ump}pH=]|ySamu`sckUQTgyuautƔrxtp\HQblyŷxaLW=Di}{fIZzwww|``sr|osvIJunsrtpzjlejVDDO[»a]g7Oo}bxtgZpiV^hpgof`]naYPJ@S[`sǭfkUA-;:DkskDRxsxzss~wUZfdKQ[domnv{x}i[QSP@'#);XòyZ\_NYnffox{k\tslu|sdc]cw|qyrZGdbmgkdT_e|f_KDDAM\h}itZNNQHZecyrxKhu\gnww{}{wbwufRapߴr}tiXT`ie|Zmr|wzmWXhnZdpSD8TJEZvx\90+4HsýL]rbbawqmu|}eG[ssp|w_Vcs{~xe|ffRNU\YVM]i˴syjLLzʬzhkP@^VNczulVqcjohlsbopjyobXjutV`zq~fjpm]bcI;>]Sk}R{__RSSiej}~{a}joRev~otv[WWcpqieviiYoy__kWsged]t~|jTtik^NQZaPk»uTC]g_uy}rv|x{nmjfspZ^~k\~`hpoo^pe[m}[_dR1.;TnrdaGkipwjTfmum}iqbWSHdmory}{ykkmfTJ7:P{~T_qg`LRwtw~|oJeqjf~q`_ZZpmbmP\di`hXT`zΰry}[GAPMJ\i\]ssjnv}}|wxNXfr{msl^iqb`m_NEIlhppgpeaLR_t}~tdo[\p[\qpS9?|tmjmujfw{yqp\Y}omroz[EtpXhgMPdid˸uOmsM@Mmui|pp~v\mldYhy||^ShyogcxjlsNkiMH73;coP>fyvvinoog]y|{vmux[dQKSqus|̱{WirkOLB5J_ɨ~bqsKZPPfz}j{}r\YqoZjtcccgo~yVZwRVpnp]fZ_pýqz{lZKC@UEXzypiQ^`ka_oqykL|qXe~xhylWfoƏppitcaQJNikq~kl}r]YROZh}oobNV[SPn~rg@-\poopvtphiqwje}vlei|nbthxzjMn}kbjiMRW^fvɰbhzc44Bt}ztv~x^bpniidkbbl|qojYbmzsjfon_ov|oizcHI=-;Z_?Mx]lkmaegjey~zjVfuyt`]SSbj~ǚrWcxfUCB;@Usp^LKYR^nqim|dVl^b``o{ubljvumVPw{aVl}xggh]j}zyd[TA?LPTuomfZZXYXdYgog{w\UWvqxxoeUVaxrlvpob_TX[tvuY|krkSXTZjszthqlRTUNNYy}YCBhlujqr}z}pqwwdmwcllhb|wkxwYfqssoifhS[glnűjeuVD(4Fm|opcGTvajoW[|tw|yx~UhrVSrcaomczuebo\RZR84>JɫoBl|]ZTUmx\gsjnzr`Cnug}}y_Shqr|wrnШ~YW^Qeh_S_Vʺ`xgKD8QQJ^y}xSOVU\py~t}e^lowufpk}p\c`q}pVJ7Kq_oiuzb^NBXRdw^ixfZgT_nH,Ku^k}}m[azgwtZcvrf]Zko|XV{rUbk_[gcclXwnKHLe|ykvok\iyfqg^`z~}~u~dVaheZ\xv{|~Wns]I4<=R`Odut|poc^Oblasyq}ybLdq|ucl~kgcL\y~bXB:Nbbhss_zv]P\XPWtmzpr]TKNav}qcE:Gpyjy}qh^Lauv||omxseszmO^iahom|lcrXPQGY}kXO`^TMiolp{syrgjsbff\o{qrv{x~wfy~hepg_i\kk\y`=>BZlrtr{unkrxrn}|qkigroohp|yaqhek[cmvu{rbUx{UC6Nuwl`gZPsynihpmon|ry~}ypgaonlltyxihfaS@:@ijEFp~d^h}ttqrxiWTevrjcmuyybX\jgg\QUoſyo~lK@UONZsobyulacqtz~{ei|ran}}ieiz{|fGAMY\hxyb`w]RMQZsxedseVns]WEUuwvy{{b\`lsujuntxq^XVXjxb[uxohd_\feNRoaWl|uvlttpo|t|pkcghj||nulx}optiiovlqpr}rbriTE=7Sut[NKRwyy}vnhhp~vtqzjx}nc[_slupgjWNM<:R{{e[hkhUH_lsw~y}zx[Jatotok`o}}iZ}u_glb_fRP^{xzmF@IJDXd}vnzphc^nfew\Yys|kv{|xiW^fwufHBLNZcs|o^nPR^X\gnqribNPatz|bJ:3c}zyvsaWcanwv~ygyslmlzn[Ufgjzwi`uwng^\NKatzm\SjcCAh|urhjq^dulneaelg{ts{~}|vlszrqejjb\soj|U?A-/NtygMARptniclh`ryz~{veZpngb]r~yysvzu\jiVDF63KlqayrbRJNfrqvjoz~w|YZzysh_x}uked|}k`PUvZcod_ZUKUgr{eJCE@N^r}~yorfcTX^b]n}}}qafr^cn{tn|xgYRPa÷~~xyjTGJLZr|wkfs~pZZVVdjoz}~cZSGT_s^E46_{{w~pecagwkxkdhdq{kggfz~qhvrtjb]ZNYev~k_iyn]:.HxvdbjiSj|jgm^afep{zz~wguonwvqwqmvpknvz~tdKF9(:[pJ=bwipp|tkirln{zpk`Wr}ztvohu{}yxlooYbaWPNAG]ywVOPVS]f|mdnchgcrw}taV[ygdqmpnc]fivnSHMQ\cm}gdqs`aVYakj{~ho|eZ_s}ncXMDizpuwmab`mwwjd~|q{~reh`bpywbj{qdb[Ycj~tnRI[ka`s|tnvspz}kdfliqu}}w~{snhkikky~qYf}eZGBAUrs^PMY{uqkblu}|wyspeuyidkyyzz}}f]]VWQHITpô|sgqnfZZft||{x~lSYytw~snxq_uv^]^bhlb__m{x_NGMTamws{|b[_jgozad~v|wqqvzga^pyv|}iVNSfmy{rh|ocXR]ht}sizxqig_k|u\B6Uxvrhbs{y}m~shg{}vjhcixxeowlkjkijjnylfbevhPHZswgksc^c|ypoljg|~xu~}pjspomjw{{zy|jzlZN:=IcsSHVnxyy{sr{vs|y|xsjaby~rciow{y{}_ikdZSDGQ`}vlZSSZbvr~yX[m{vq}{vox}zjV]xbiqnpc\Z[^tZTLGUYd{~msk]Scjmox~wmxslhn{xvebUM[zqc[SP_jmse|~yi^UTanq~zvsraUV[_xvYL9=dxtfbktn||v|trkiw|pl_cq~rlp}znpbYZ_d|zlkjuqX99Nmscf_WUl|trkhpim{wr~~mpsirov}tyuiokoq^QC41@XeIPgurglxpqrnqxx{qsm^f|{uhelqzzqejrvjhh_\J@@EVt]RHTS]t}|~nbttieknrxqqv}kZJbujkopeVWSTkr]SKGOX_{|snl|~nfa`b^lov}pvfTY^qz|d[R=@XǴ~gaYSZfk~qopsuzpngadkjvunwvqfVNRVe|tYCHPZ^m~uehhkq{zejjdkuy}~qw|{uq{nmp_\`al_goW@08Dmk\RGTx{rvoegnju{xurjcqflywz{|swrq{vp`XOA66=Zt][ogcefps|{xv~thZi}rut|simx|q`YZzmec]`WOMMV~gQFDW]fzsr|}fhhhhns}r^bq~tn~ztrvsgcVQ^zxk\NHYkol`e{rh]_jkv{rwtbZ[Tj}{l^J18b~}{j`ev{~}rzlcl|}{rmox}si|qog`]aak{kZQZm]OLZurkmpfbhsegddj{{vsxouzztqvrruywvr`SF:?IcpUHVu~yvnmut}rg_nxmlo~|zl`XVSOILTcȵswq^ZY\f~hjxxpntu}~wgY^{teachdeacfv|k\RNX\j}whmo^`bhmu~yiesxkn|~xuyvplaYR]tǭz{uvlc^dnuk_v{ysja_iq~xss}sd_bddu{xp_SBIbs}rouuvwspknx|ytqx}sswphldcirr|z`W\s{kODDX{vj]XVh{tkirqswyy|ymosrnsuspwxt~}i`\TG?@Nx|\VdwzmlxuwurxsaTayrqqqywrjpm_Z\cYTOKVwylUO[W\p~tjuxqefrty|}qbYoveamtnecVYkraOPX\bx{ojq][ZY_rw~~rfyrc[`w~r~|mcPBFUyo^_dio~zvty}zztn]]`ak|tor|xvh^YT\n}|n\JIYc`pvpohmqqrux~sqlqrv}|pkroy|w{xoprndd]evpcpqQC:Mpüv]U_rwruzxy|~}kcm}{vvvw~xrk`gpc[ZTSMJTl¾oYR\^fuz|yw~tqqpt{~m_Zly}ojihdaVW`uyjXSZekzzreassnijksv}znwvjb_mzvqibSEBJp}{lfhpv~{qr~xu{}|srqqt|rlz{sia_]`k|raUHJWbag|xsnrqpurninqw{}~z}xqnmhjgnwfboxnYNEEKg{jYR^r{tqlow~|tpgem{sry||{z{wsu{{we^XLJHDLcsquysnejw}~|z~x}sa_qtx}{vxzoie]fk]_[XXXQVc|w_YVZcpzzw{xjbchgq{pdYj|~x}xilkijd[UYc~sb]Z`mt}urq|yhc`[bfnx}{syylcZ^fu~xvqo`M@;Pumiiuy|sotzuyxmghflqw~tqzvieb_Y\gtvg`[\ahXO[t~pjjg_iz~xxrrssx}zuuuut}|ux{{zurlinkfgoxwptnVH?9H_|y`SYm~|zrnqwtv}}zqj_[h{tooyy}~{y}tpkmt}}pchaVKD>GYt{n_[`ipwws|yi^p~|ysryy{vrunaTTmndijd^SPPXhsbZTR\erwtqne^dimpx~yrnq|}mhip|vuzvqdWQJJ[zwj`[Ybnwvpvxmc`_eot|zut~m`VT\cu{qaH?>Okxmghppx~zw~xuqmtztqllr}|ko|zple][bgvqceoshV@>Qlxf\WT\|~ztmsqqvy|~}wvmpzotuwz~zyxonopsp^PG:5BYznX[nvqps{~~y}~vkgfr{tpknw|wsi_^lxif^YSLDGVnhYQTZes{wsoq}|utrtz{}|zy|g^_mzuqokkcYQSZq{eWRR]gvrdgwxqpkmrw|wt|i`^guxvl\K<7Es{lc_fovyulsusqttv}rhg~zqkc^_duseYJMVYVatvjdigjt}sliflx}vtw~zvvtqlnovplxr\L>;D[xzbNJVo~ussst}xpqw}vnow{vtow~rg^RJC>FVrƽwrrrlfbiw}ymjz{z{wwtvxk`VZx}njc^XUNPWjzbWQVaq{sjemystwtuz{ocjwzrpwzsmhbZQPRdzƶxi^X\iv{kel{uplsx}~~|w~rg^]]i}}qi\L=4Bg}rjfqyzqkly~{{x}}uqxxpgb^`dkp]RS[bVMQe~qgghcj|zolkkn}}}wonx~xrrmjknp}~xiWLB;DUq}dTWk~}zsswv}wkbg{zw|~zrojimxibYRLEBJWn~|rgehnyunz|uopsvxi^RTk{jd`]ZQQSZgvib\]gl{|xuts|mdechmr{xmdjttlllv{pmkf[USLP`{vqjeemtwqjszpgdfhlvy~~|ufYVZak~qncTFCEYs|rpqtx{yz}|zxy~zoopqsz{}~w|yohdZZ^dmzc\^fldTIN]zwme^bn|wqpsxw~}wwomjhhwz|yspmhfjip{~rbYOEADQl~memw~|wy}{turu{~og_`o{wz}~zuqmfbei{yja]ZWLJIPeob`eeny}~~~~uwwogkruz|}qi`Z`u}rgehf^VTQZnuh^^bgn~zwu}sgdaafrx~vpp~yjaagwzqtsi[RE@Mi~vigimr}}vv~}vrhfhhmy~sr}vqh^[[apxpm`RLSZafu|roiikor}{ztux{}}wrusu|}y}|upqpgfdgrpfsyiUGBGUspbWVh}zyyz}xslllp|{ttvw}{z|~ztrmotzypd\PFCDMd|w{znigjt~uhdg{~~zttx|zqd\\g~slhc`VSQQ[t{hZU[`l}zmku{qstux{ulirz}vsz|vsph`[PMSew~qc[_fn~qr|ysmjnuy|xustxkgdal{|tk\P@8Hgwkfjmuxomrsvttx~{qjq{wpjhihl|rdZ\egXNN\sug_\Zbv|ztont{~yyyvz~}|}wvvtqx~pcVI?@KblWSas{zzz~yplsxrorw|tlfgm~ymb^WOGGM^zo_\_fu~zvwsmm||}{zz{wl^Ydw~slif^WQQWjtcWU]dt|ne`o|uuuz~vovwneht|vrg\RFAFZȻ{od_dlwvuyxwyywuvz}squyka]]_oxl\I>=K^mskhkpz|sljmt||uos|vtjdcdfqtebgkcTFDKbyi\SXfzrqnqs{~|xqjq|~~}vonjkow}i[OD=Mlyogjmt}wrvyqqnknsw{y|th[UQS`qvk_PFBN]emwtqossu{|spqw{~{xstsssqpt~smf`[XXes~lemtnZJEEOeynb\ey~ysqpov}xphb^gvzxrmicaemtocXMCBCI]w|tzzurx|||zxxzyxiem{~xrx}~{}~~uodZVW`xuf^\TOLMNZnvhdchpy~{y}wledgir|{mb[\lvwx~~sihc^ZUPPZh~ujfejs{~vqs||nhebdiowzyype_\akxyqlc\OC?Idzrpnuz|{uy|||snnkmrv}zu{vld_^\_ju~n`XW^baYVax~sjggeo}zxxzz|yvssprsty~~xtpkkjihntzy{|uiXLFCMc|zi_ew~|~zqgbbm}zwz~}}yxxsmkjir|zic`YPLIK[qsjgfnx}snmw|{}|~~zxnb\`n|oghfa[WRXctwhb`ciwtnqyqlloy|}tkmxyqlt{xusme\RJIOeumiinv{}ywpnnnu~|sop}yojefkv{ti]OGIVco|tlklpu}}xtruxywyx|~xy|ywvqommqwqgfmqi]QLO`wtcWW`w}z{wy}y{zxv}yutz{|~~{yuvuw}qf[RLGIUmzpnorqqx|~~|vngl|yvtw~yrkd^g}ule`YVPNTe|{g^^alz}rljkw}~~ujdjvyz~wqkfaZQOUcuwg^]clzvmoy|vvvx{~~||zx{yogcjt|sjaUE;=Pttkfhnwvqruvux{|wols{qkfbbgsyk\TNQTVXeztjcefkx{spmpx|~~wtw}xtplghjruuxugUIACPhp^SWh{zwvuv~}wrnu|yv{}zrkgffnv~~peYLE@@Ma~zywtolmw~{z|~}{sryzyyxwwx{naXRUhwlf\TLHFN\urd^\dp~{tolqxsrqpswz~~wlb`illmr}vof^VLGFM^xļ}pf``huzqmszvqnporvz~pbXTYarvk`TC97Ba{skhlw}{vu{}ywuvtuyyz{xsw{mc[TRW`pq`WSTWVPUf}~sihikp~wqqqt|~|wqmmhiryohc\Z[bn|ylZJ@=CUl|l_ao{xvsuwz|tkbcp~zsnf_[Y_jwug_SJB?CQd}voqu{~}}~~|vx}vpnorv}yocWON\vuic\UNHJQ]owmhfiqx}wtsx{pgfeimry{phfkokfinyvnhaZOJIJTjzsollsz}trt{tmihjlsw}}nbXUZcm~xkbVI?DObw}vrsuw|}|~}{|}vsrrquvw{|z|zpgb[Y]em{tc]afd^UNTcyylebhx|wv{|~yuojfgjz~zuolhdfims~}qbVOIFIVj~upw~~qhdgu~}xtlhe`_fwqe_XURONUawznginu~zuvy}vrrtzwnd\_iw{pjeb`[WTV_rwnghou{ut|}uokmpv~}xqms}}vmkkr~xpie\QGAG`{sosvz{|{wtrqsw|}vrxzsnkhhkp}}naXRQY_`do~~snlgir}yvy}}}|zy{{|||xtqrrqpst{umpvvl^TLNWi~{h]_l{~ztojkuywx{|}{|}zwtrpsuy}qh`XRMMUbvyqmpx~{uphhq~|{}xnf_`mxpkfa\XTW]j~vjbbhr}tkirxwy}|tolmw}}ywy}xrlf^WQNO]qzphfkr~yz}yusqry~ztqrwxnihhnywmcTH@BRk|qklou~}tprsvvwyupq||vpjgiimy{k`]_caWQUdysf^[^m~ytrvy}~}~}|wu{~}zwqnmlls|yk]QGBHVn{h_bny{zz}~yurnq|~yvx|~wpjb^_erwlaYOGDHSh|oefjs~zvssppx}{yyzxy}{pdZT[k{xogaXNJIO^t~oc^`hq{smkrzusruvwz~~yqpuunfccnzxqi^PGA>H\|¿~tidekt|z~}}yvuttwzy|}{y{wg[UUYdtrhXH>>GZluljinv~{urtw}||zxyxutspqvwneZVUYcrykgfe`SIFOa}zlc]_n|wtssw{zsoigkw|ulc^[Zaiup^QE==DUqtllsz~|zxz|~vpms|}yxyx|ukaYRQWd}ug]TJBBDQg}nhkqw|{yww{vnmmnrwzte[ST_lv{ne^VMHGJYmtiehnv}uopuwrliinouz|wvxsg^Z]hx{oh^RG?8>Oj}unlnu|}yx{|zwvutuuutts{|nc[USXan~o`XVWVTRWg}~sjefltxutuy|wrljilv|sjc]Z[ahuxj[MEBFUj|pggr}zzz|}unkmvvng_[YZ`onbXNGDEN`u~vstx|yxyxxz}yvuxz}{oeYRT_oujbYRMKMVdvwnlms{zsmoy~wsrtuz~~tllppokiluwmcZQJDDK\x~vrqtz~~}{xuvwz}|}vkd``enypbTJCDN\jy{vrsuy~~{zz~{yyyyyxx{wpjedchnwzldbdb\VSV_q|qgdkx~}~}{tpllq}{vrnkijmpu|se\SNMOWfzzz|~}{unlqz}wrlfb`afv{nd\WSSRV`pwqqu}{tqrx{xyz~|sic^alv|vmf`[XVSV]j{wqpt{}zzyurruz|wsruzzurnmov~vmd]UMGFQgytux|}||yvuttw{}z|xqkihilr{vh]UTU[^`fs|smlkoz~z{}|{ywuvvxz{|~ytpnlkknqw{urssndZSPTarwkglw~|xsnjio{}zvtrnkihiou}wnf]UPMPZj~ytsx~zvrnkpxzuph`\\fu~tnhaZTPPV`rulhlqzzurvzuuwz||uokjmqqqqt{|vpiaXOKJO]svnilqx~ytqprux}~|||~sia`bgq|~ukaTHCEQg~~tmlnrx}}xxxwvttvxy|~}}{wvz}skc^\^cmy}qhc`_\WSXdvvkebfq~ywxz{{yxxvtsrrw~}vohb_]`gpy}o_RHDHUhsjkqz}z{{}{xsqoov}|~wof_YVX`m~sh\RHDEN^uzqlot|zxusttx{yxwxz{~zncZTV`o{vmdZPHFISdx}qifipxysru}zvtsuvvx{}xsrrnfaaeozvmbVJB?BPhvnijov~}|{xwvuwyxy{{yz{rf[VW\fs|ocUHBEN\mwnkjnt|yuux{~}}{yxwurqqt|yog^YX[bn{{plje\SKJScy{md`dq|yvvy}~ztomns}~wpg`\[]dmvtcUKCBGUj{tsvy|{yyy|}{vtuz|||~yod[URVbu}qeYQIEGO]sumkqy}vqmnu|xwxy{~wla[]ckqw{pe[SKHHN[ntmjmv~vqt{}zyxyz}~||~}xogbcfp}zm`UI@MbþyZn{gqpyuww~|geztqs~tpllhrjjuw~qz~VRFJG<:CTlmYyqjqs~yvxv|}dnttow}tplkhpflsv~nqUREKD<=J[vc\morx~zwxw|~zdwquoy|tnliipemrw}nhVOEKA<@Pb~\`jrs}zwwwyudpsn|{snmhlncnpv}xp`UKEH>=CVktUhkvu~yvtwvogzopqztomiojcmnv}ruZTFEF=>I]s¾jTrzoxx~xvrx|tkksootytnmiofdlnx}o}yVQBEC;?Oc|aV{vsz}|vtqywuernpmvwsominbdkow}opSK>D>:CVkwY\ux}{tspxtxydzlqm{wsqlkm`fjoxqfPFKcy»~jSky}vrnpwqogxlnp{xrpjng`jjt{vwVL<;>9@Qj{dVu~|uqlrvrljsons{wrpjoecjlv}s{uRH8<;9CWox_X}|spltstiopplv~yuqokpdglpyrlOD5<9:F]u¼u[\zqolurxguopkx}wsqmmqeknt{qdL?5<7Kc|ye`womkuuykoxvqx}wrnkilchoultdH=2<=CTmxdf}smmmwv}hvxxr|}uolggiajqyhv|ZD94>@K^vwcnypmlozyxhyws}zrlhcgfams}udwuPA67AERftcxtnmls|{skzwv~wogc_dabovicxkI?5;FL[qqf~{rmmnx}~op{wx~tjc_\c_dq{`dwaD=6BJRdymj|xpmoq{~~ly|uz{ne_[[a]husZhvYB<9GO[m|iq{{~toops~~{m~|v{via[WZ_]mxfWmqPA=>NVdvxhz~w{|sqpqv}xq}{uzqe\XTZ]_p{}\YqkJA=DT]m~th}{v}{uqqrx|tu|xtxlaYUS[]bssW^teFA>KYdsnj|zw{urrrz}zr|{uvvi_XUT]\fvkTdv\CA@Q^jx{jo|yzzurqr{yyq|ztvsf]WUV]\jxcUltSB@CWco}wgv|y}xspprzvz|pyxrvoc[WTW]]m{z]XqoL@?G[es}sg~~{wqooqxtz~wryvrvlb[WSY\_q}sZ]tiG@?K]ix~zoi{}tonlrws{~ruytrtjaZVS[[bsoWau`B??Oan|}yln{yqmkjsut}oy}wrssh`YUT[[gviUesW@>?Sdq|xkt}vojijtsv}l}zwqtqg^YUV]]jycUioP>:BWm~utjb`civ}ms}urod\VTW`dr}`FPbR@@Hau~{sqgbafn{~}l{|sqk_WSRWbgytUCS`LAESmuqnfbdjs~yozpoeYRPPYckjKAW]IDL^w}qpledinv~wtvmj^TNMP\frv`CC[[IKTjxopkgimqz~}v|~rjdYPKMR`jz~lT>H_XLS_w~tnqmklpt{{{wzke_SKJLUeovdKWeWWctzxqtvqprrtwruy|}zmb^UMILRanzyhWAD_eX]j|y}wswwsrrqssotx|~uh^[SKKOVfr~tdQ?KedZcp}y|xuywsqqopomsx~|pc]ZQLMR[ku}o`M@Ric]ivz|}xvzvrqolommty{yl`\XPNOT_nw{l^JBYka`mzx}xwytqolknlnv|{ui^[WQOQWcpzwhYFF`kadp~x}wwwroljjmkqx}{rg]]WQPSYfs|~ufVCJdjags{|vwuoljikmmt|y|pe^^VQQU\ju~sdRBNfhajv{tuqljihlnoyv|nc_]VRRV_mv~paM@Rieamzxssmihhhnos~tymc`]URSXbox}n_IAVicco|uqpiffgipry{rwlca\VSV[er{{l\EBZhaeq~sokedeglsuwqvlcb\VUX]it~yjXBD]g`gs{olgcbdgovysrujcbZVUY_lvvfR?F`fajvxlidaaeiry~~ouuidaYUVYaoxqaLb|}y{}{nfhkkmopsxy~~m\QNJIOZh{uk^OA7Iqyx|}vmhmonnnnqtt{ycTLKHKS`pzneWK?Ei}zw|y|tpptroljhklqz|dTIIJLT`m|zmd\PHBPw}{yxu~vqsuqmifeikr{{v]OHJLPZfsuibYOIF[|{yz|u}vsutojfcdhjt}}zmXMHKOU_kw{qf`XPJJg||y|zw|vsurlgcadhmxxyfTKINRYcozwne`WPJPr}|y}x{|urtoida`eip{t{|bSKLQU]gr||tjc^VOKW|}{y~xztrrlfb`aglt|r}v_RMPTX`jtzric^UOL]}zzyxqqohca`cjozwq~r]SORV[cmvyqid]UONd}yz|uonkebaafntsqn\TQUX]eox~xphd\UOPk}xz|rmlidbbdkrzprl]UTWZ_hqy}xphc[TNRq|x{xojifcbdgpw{mtk^VVY[ajr{~xohcZSMUvzx|ukggdbcflu}wlv~k_XY[]ckt}~wnhbYRMX|~yx|qhffcceipzslz|k_Y[\^emv}ulf_VPL^|ww{|needbdhmv~pm~zi_Z[\_fnx|ske]UNMd~zuw|vjcdccfjqz|opwh^Z\\`hqzzphcZSMPl{wsw}qgbddeinu~znuse\Z[\ajs}wme`WQLUw|xsqw~|meceeglrxxoyobZZZ\clv}sib\TPM]xtpqywjcdfgkot{wq}|j^XXY^fpzyoe^XRPQg{sqnr|}ridghjmqu|vrudYTWY`it~}ti_ZTQQXt~uonnux~ohfikmorv|stm^TSV[cnyxnc[WSRUaxplloy{w{pjjmnnpru{~~rvyfXQRX_it~zqg\VTRU[o{rlkmstwyqmnponopsxzyov}p\RNS[do{|si_VSSU[eumilox{qyyspqqnllmptx~sluveUNNW`kv}tkbZSSV[dqypjins~up~zuqrpliiimrw~}lirp^QMQ\fr|}wme]VSVZal|unjkqx~rr{vrrnigfhmrwwggpjXONVbmwxph`YTTY`itzrmjnu|ypw{urpkfddgmrzoafndTOQ\is|yrkc]WTW^fp{wpllrxwp|ztpmgcbcgnt}{g^fl`SPUbmw}tng`[WV[dlv~upmot{urxqnjdaaciqxsa\gj]ST[gqzxpjc]YWX_gpz{tpoqw}}tvvokfa`aelt{~l\\ii\VW`ku|{slga]YX\dlt}ytporx~|uz|slhc``bgoxygY^ki]X[dow}}xqjf`]Z[_gowysposy|u}ypjfb`aekt|tbXami^[^hqx}~zvnie`]\]bjrzxsppuz|vvmgea`choyp^Xdoi_]aksy}~|ytmida_^_emt{xrpqv{{u~rifdabflt~}m\Zhrja`dmty|}{xsmieb`_agnv|~wroqw}yuzogfcbejqzzj[]mtkcbgouy||zxrmjfca`cipw}}vqorx~wuvkfecdhnvwg[`rvledhpux{{ywqmjgebaekry}{tpnsxtvsjfeeglrzsd[evvmgekqux{zyvqnkgdcbflsy~ysonsyrv{oheffjpw~qb]jyvmgglquxzyyuqnkgecbgntzwqmntz{owwmfeghmt{|oa_o{ukfgmqtxyyxtqnkgdbcipv||tnkmt|vnytjfghkpw}zl`bs{sjfhmquxyyxtqnifcadjqy~ypljmu~rmz|qighkntzxk`evzphehnrvyzyxtplhdaaelt|umhhnw}ml|yoihjmqv{vh_hwwmfdioswzzywrnjea_`foxzoifhpzvhm~wnijmosw|sd^jwshcdkquy{zyuokfa_]`it}÷tjedis~ofqvnkloptw{}n`]lvnebfmtx||{xrlga][[alx³znfcelwxjgvvpmopqsvy}wh[^mqicdjrx|~|ytmfa[XX\fsþ~rhcbgq}rgk}wqnoooqsvz~q`V]lmfcfow|~{uoga[VUY`m|øwmebdkvzngqvpmmlmnpty}yhXR]kjdekt|}xqiaZURU[fu{ricdhp|vljxuomlkklotzraRQ_kieipz{sld[UQQV_m}wngdflv}sln}smkjhiknt{{jYMQblihmv~wnf]UQORZfu|rkffjq{{smtzpjigfgjow~tbSJSemkls|{riaWQNOU_m~xpjginvzspzwnigefhlrz}m\NIWiomqx~wnd\SONQYetuojhlryysstkgedfinu}vfVJK\nrrv|{sh_WPMNS]k{}snjkou}ytv}qheddgkqy~paRINbrtuyxnd\TONPWbq{rnlmqxytwynfddeint}zl]PIRhvwx||tjaYRNOR[hvyrnmnszxsyvkedegkqxviZNKWnyz{~ypg^WQOPV`m|xronpv|xszsiffgjou}~sfYON]s||}~vmd]VRPSYdqwronqw~}vrz}qighjmsy|qeYPQdx~}~{tkb[VRRV]gtwroorx|spzzpihjmqw}zpdYQVj|yqia[VTUY`kxwroosyzqo{wojjmpu{xncYS[p}vof_[VUW[cn{~vqopt{wno|vnkmpty}ulbYVauzsld_ZWWZ^fr~}vqopu|~tlo|}tnmosw}{tkbZYfz}wqic^[XY\aju{tonqv}{qjo}{rnnrv{zsjbZ[l~~}ztnga][YZ]cmyyrnmqwxmhp~yroquy}~xrja[_q}|xrlfa^[Y[^ep|vplmqxtjgrwrqtx{}xri`[bu}|zvpje`]ZY\`hs|smklrz{pfgu~wrrvz}|wpg^[ey~|{ytoid_\YY[ajwwojils|wldix}vsux{}{vmd\[i|}{zxsmhb]ZWX[bm{~rkhhmv}rhdl|}xvwy{}~zri`Y\m~}|{wrlf`[WTV[dqxmhfipyxnffr}xuwxyz|}}vndZV]q~}{wqjc\WRQU\hxqifglt}}tlfjy|vtuvwxy{yqh^VT`v~|vog_WRNOU_nxlgfipyzrkhoztrsttux{~ulbXQSe|{tkbYRMKNWdurhfhlt}~xrljuxsqrrsux}zpf\SOVkyqg]TMIIP[k~{mggjpy|xrmnz~upoppruz~tjaWPO[s~wmbXOIFISasujginu~|xrnqzrnmnorv|zoe\SNPa{|sh]RJFFKWg{qihlry|xsotwollmosyujaXQNThyncXMFDFN]o|ojkpv}|xspwunklnqv|zoe\TOOYp~ui]RIDDHScwynjmsy}xrqz}rljlnsx~wlbZSOQ^x{pdXNFCDKXj~vmlpv|}wrq|zpkkmpu{}sh`YSQUewl_TKDCFO^qunnsx}vqr}wolmosx~yof^YTSYl~th[QIDDITdwtopu{|uor~vpmorv{wne_ZVV]r{pdXOGDFMYj}~tprw}zsnsvqoqtx~~vme`\YYbwxm`VMGFIP^o}tqsx~yqmswrrtw{|tlfb^\]g}ui]SLGHLUct|truz~wolu~wstw{yrjeb_^`l}qeZQKHJPZiz|utw|{tllv~xvxz~}wpjfdaadrxmbWPKIMT_n{uux~yqjkw~yx{}{tojgedchwti^UOKKPXdtzuvz~wnhky~zz}~xrnjigfek|{pe[SNLNS\iyyuv{{tkfm{~|}{vqmkjighowlbYRNMPV`n~wuw{xphfo~~}xtpmlkjhjs~rh_WQONRYdr|utw{|umffr~zvsomlkjikwzoe]VQOOT\hwyttw|~yqjdhw|yuromlkiimzvlc[UPNPU_l|wrtx~{ungdl|}zwspmkkihiosjbZSONPWbp{sqty|xrkffq~|yurnkihggir|qh`WQMLPYeuvqqv|~zvpjfiw~~~}zwsokhffefjwyne\TNJKR\j||tqsy|yuojhn}}}}}}zvqlhedddfm|wlcYQKIKS`pxrrv|}{xtokjr}{{|}|xsniecbbdhqti_UMHGLVewvrty~|zxtolmv{yz|~{vpjeb`abekw}qf[QIEGN[k~|utw}}|zyupmoz}yyz|ztmgc__acgn|zmaVLFDGQ`r}|zvv{}}|{yuqnq}zxy{~}wpjd`]^adjswi]RHCDIVfyz{{xz}}}}|zupns~yxz}{tmfa]\_bgmwrdXMEBDL[m}w{{z}~}}~}}zupnu}yxz~yrkd_]]`ejq|}m`SIBAEPasyu{||~}}~~~ztonv|yy|~wphb_]_chmtyi[OFAAHUfzvt|~}}}~ztoox|yz~|umfa^^afkpxtdWLC@CKZl}st}}}~~ysnpz}{|ztlfb``dint{p`SIBAEO_ryqt~~}~~ysnq|}|~yrlfcacglqv}}l]PGBBHSdxvpu~~~xrnr~~~wqjfdcfkpuyxgXMEBDKYkspw~|vpms{tniedeinsw{sbUKDCGP_r|qpz{tnmuxrlheehlrvz}n^RIDEJUexypr}~yrlmx{uojgfgkpvy|~yhYNGDGO[lvpu|vojm{}wqlhfginty|~sbULGFJTbsuqy~yslip~~ysnjggilrx|~~~m]RKGHNYhy~tr|{vojiszuokhghkpu{~~~xgYPJHKS^n|su|xrlhjw{vqlhggimrx}~~}rbVNJJNWdtzsx}yuojhm|}xsnigfhkotz}~|{}n_TNKLR\izwsz}yvqlhir~ytojgffhlqvz}}zzxi[RMKNU`o~ut}}zvsokhkx{vplheefimqv{|{yzteYQMLPXet{su}zwtqmjjo~}xsnjfddeimqvz{yx{pbVOLLR\iyvqv~|zxuspmklt{wqmieddeimrwzzyx}|m^TNKMT_n~}spw}{zywuspnmox~zuplhdccdhmrwzzyyxi[QKJNWcsxooy|zzyxvusqonq{}yupkfcabdhmrxzzz{tdWNJJOZhyslo{|zyxxxwutspos~}ytojeb`adhnty{{{}p`SKHJQ^m~zojp~}zxxwxxwvusppu}ytnhc`_`ciouz||||l\OIGKUbsukjs~zxwwxxyxxvsqqw}ysmgb_^`djqw|~}~xgWLGGMXgy}qijv{xvvwxyzzywtqrx}xrkf`^^`elszsbSIEGO\mymgky}yvuvwy{||zxtqrz}wqjd_^^agov}~n]OGEIRasukgm}|xuuvxz|}}|yurs{|vpic_^_cjqyzjYLFEJVfx~rigozwttvy|~~}zust}|voic`_afmu}vfVJEFMZk~{oggr~yvttwz}~zvsu{unhcaadipx~~raSIEGP^pxmgiv}xutux{~zvsvysmgbabelt|~}~zm]OGFJUdwtkgl{{wutvz}}ytsx~wqjeaachow}||uhYMGGNZk~}rjhozvuux{~|xssz|unhcaaeks{{yxpbTJGJR`rzqjjt}xvuwz}~zvrs|xqjea`bgnw}xwtk]PIHMXgzxpknz{xwwy|~|xtru|umgb_`djr|zuspeYNIKR^ovpmr{xxx{}}zvsrwxpic`_afnwvqpkaUMJNXfw}vqpv~zyyz|~~|zwtrs{{skd`]^cjr|zqmlg\RLMS_m~}vrs{}{z{|}~~}{ywusrv~vnf`]]_fnwumkjcZQNQYet|vsu~}||||}}|zxvusrsyyphb]\]bir{yoiihaXRQU_l{{vtw~}||||zywutsssv~}tkc][[^dlu~tjghf_WSTZeszutz~}|{zywutrrssuzwnf_[Z[`gpyyogfhe^WTW_kx~xtu{~|{zxvtsrrrtuw}{rjb]ZZ]bjr{~tkfghe]WVZco}|vsu}}{ywutrqqrtvwzxog`\Z[^dlt|zqifhid\WW]gsytru}{ywusrqqrtvwy|}tle_[Z\`fnv}xohfiic[WX`kw}vrqv~{ywtsrqqrtvxyz}zrjc^[[]agow~~umggjhaZVZbm{ztpqx|yvtsrqrstvxzz{~xpic^[[]bipx|tkghjg_YW\eq}vqor|~zvtsqqrrtvxzzz{~wohb^[[^cjqy{rjghie]WW]huysons{wtrqqrstvyz{{z{}vngb][\_dks{zqifhhbZVW_ky~vqnov}xtrqpqstwy{|}|z{|unga][\_emu}yphegf_XUXao}ztonpy{urppqrtwy|}~~|z{{umfa][]`gowxnfdec]VUZdrxrons}xspooqsvy|~|zz{tmfa^]^biqzvldcdaZUU[gv}uqnou|uqnnoruy||yz{tmga^^`dlt|ujbab_XTV^k{ztpoqxzsomnpsx||yzzslfa__agnw~rg`_`]WTWaoxspps|wqmlnquz~zxzyrke`^_biqz{oc^^^ZVUZfu|uqpqv|tommpsx|~yw{xpic_^`dkt}xk`[\\XUW^k{ztrrtz{tlkpssy~{zxz~smjb[]cfkwqf_YWZYUVduuqtxx}vmkpttw}~{vs}vpng^\^_dqxof[UXWSR^p|wrw|z|xnkrvuwz{z~|vqwytumb]ZZ]k~~wqaUTTRQ[kvzty~|||qmtxuvwww{}wruyzqd]WVYeyziXQOQQ[hpzx}}||~wrxzuuuuuy|yuwtf]VTUas}q^PKMQ\gks}~|{||v{|vtstsw}zywyxi^VSR]nv}yfTJIN\ginv|y{||xtqsrv|ywxv{}m_VSP[ipv|mYNHJ[fgjo}{x{{{tqsrv~}yssvv}q`XSPYdjotr_TJIXcgfjw{x|{}trtrw|zunptu~ub[UPX_ehlzwf\PKT^ecfs}{x|{uturw{xrknrt}}|haYSX\`aet}|meXPRX``cow|y|{wvwtxzxqhlps||pg^WY[][_mwsm`WUTYZalr~{}{}yxxuyywpgknqz|xpd]\Z[VYgp|yti`ZUTS\hnz}~{y}{zwzyxpgjmpy~{ylc`][TTaiu}{qibYSMTcjt|x|~|xzzxqgjlnw|~zvkf`]TQ\cn|wqj`WKL\ep{}wzz|zyrhjlmuz}ytnf`VPX^gu}wsh]MHS]iv~~xy|}|ytijmlty}}y~}wnf[QVZ`nx}{qfTHMS`pxxx~~zukjmlry|}y}wlaTUXZhrz~}zo^MKLUgrz}~xw~{vmjnkqy{}y{ui[WYWbmtyzwiWOKK\jrx{~zv|~wpjmknx{|{{re\[W]intw}tcVOGPaiqu~{vy~zskkkkv{{}|~{oc_ZZfjntx|o`VJIW_ipw|xw|}~vnjkis{z}}~}ykc]Zchips{yj^QIPV_jp{}yuxzzrkkhpzx{|}|}tic\bfekou}sfYMOPTait~{uvxwmjhmxwy|{}|{~ph`bfcgkox}|ocUROLWalw~wuw|}qlhkvvw{z~}yxnddgadfjsyvk]XRINWcp{xuuyuojkutuyw{}{ujghaacemt|sf`XKIMXht{utw{slltsswuy{}}plkb```ho}zmh`OIFM]l~xuuxpnusrtsvw~wqnc_\\ciytpgVLDFSc{zvutrwsrrqtt{}xre`ZZ_dtzwn]RECJXs}wuzvztsqosryxiaYX[_o{~tdWHDDOi{xw~~}}wtpoqow}|~|}ncWWX\ku}xk\MHCJ_qzz~|~~zvoppnvyxyv|teXWUYgox}}raSMDHVfy}~}{|yxprpouuusqy{|i[YSXbirv~xfZSHIP[n{~|zv}}{srpxwq^WHP|z~g}w}vlLztswzyoxd}y\XzuugzcK}zMLOLZk~x~tyRHuryxl]w|mT_f^ivtqjixVbzywfsMXldSUM\rtv~|^=[|t~Vqz|zargh^l{xjc{}{]Jx{~oaeEve}x[XRgursrsiE=t}wonX{|{qboieuujniphJS{e]ZUugrc[`mmj|{eU8Lmjgm}y{uij|smprkeytwdWDe~[\\l|mqlgehjhjpZG8cemm}xvxmgxvxvrngguj\LG~{Vccy|pn~gojghfp~dT>Aaup~vuz|dmtsmkcnzwaWDWsWle{{~iukteefdy~YM9Xygxpwtwpbwz~llgbyp}}XPFr{m_kjx{sj~~robgbevzRGAs|vktytv}gg}vllbemrRLRxm`iwwno}qide_lumMGQ{tiv|u}vdmyrmg`pk}hONbzh_qy{}ivxmhd_`zq~eLKa~ljy{}r_w}wribdfxaPTq~_dzxvdpog^^gk|^NPr~csy{h]vyjbblvcy[SY~|Yo|zhgnp]\asuk{XPW}b{|t[iwtacezgjvWTcs[t~t`wofX`ekrvUQfvc}|f[{ti`ejcqqTVu~lZy|hdh_[anixpPVwl`~nacjeafs}cxjP`}]\phlpb_]fwh~dNaZj}shbnojdbj{xg|^ThyOn|uoh{ef^aiyn{YSeuT}{uohdklcejrnvXVm}gR}}vtmn~fg`aluqtSQo}g[ytqnhnkmcaroprNW}|v^\vuwrotxgi]awntkFZzz_k}nqpnltyol]exhvbGfvtWrvpvutm}rmcZezkuVGizt^onprmiwqb]b}zkoROv~wm]oquxlori^Yb}iiLP|zqdzlmtoeqrk^UdwdgK]~wkazmtxmivihWSlqccGf}ikvktnffwlhSUnid_Otwaqusvmgf{i`PXxfc[Suuc|~trnhae{j^PY}cc^Z}}ma~ytmi_ktd[O`}^d\ZyoexmiaZqqdYNhx\j]aqkcwmi^]whbURts\kUerkhoiaX^}hcRYymblVo~neloj_Zbd^R`kcfTr}nguzkdZWd~d\Vc~lddZzvhgyylc\Xmy_\YgjaaY}tjkte]XVww^_Zi~fab^likte_WZ}o^aYp``^`kmn|m`[R`kb_Xt[c^i|hlp}ka[Uj|gc\[|zXb[ozjoxxe^VWpieX^tWc_xtgove_W]v}hbVdnV``|tiv|qbZVaz~i_VhjUcfogzzob[[e|e[XmgSchnlul^Y\fbZZp}cSgo}josk^]aiz|]Z\w~}^Rir}jwpg[^`lzy[[]{{|YUnzyi|of]bbsxsZ[`{ySXqxl{mc]aazzn[[c{uP]wunwncabezi[Yh|oMb{ustl`a_h|h[Xo}yiMh}ttslbb`pzeXYw}vdNm}vxqia_`uzcU\}zqaPu{uxpjc_eyx}^Sbvn_R|}u~mi_]g{z|YUhpm]V|smj^`k~|zvRXmlnZ\}smg[aiy~pQ\qxknWeyt|oe\cjv|fQ_xtlmVlwyym`\_lvzbTcpmkXtv{yk`]]sst_Uh}qmjZy}x}uh_Y\zpr^Wnxplj[{w}qg]U`jrZ[uypni[|vlfVRd~jsXayxoqe_zrleQUiskoXg|xqr`fvrj]NWlnom[jwsp_n~pv~hXOYtkok\l~ysm_ryo|zaSNZ}jqk\q}|pl^wrps]SN`guh\w{nkZ}}zpsiZONeiybazwogY~|unudZMRjzlw^fzun`]}}xsn{aWMUlyps]h|~uj]d}yuom|^VPUrwnp\i~qe\izvtlsw[WOUztnnYn}kd\rwupjyq[YLYmojYuyfd[~uunn}k]VJ_jqd]ysec_{vrlq~i`QKchp`b}{odaeyvpori]MMfgm_f~wncdmytooqhYLNlzcl_k{ukagrysqnrdVJOtubl_q}wthckwvtqku_THS|nal_zzwsegm{uvpjy|[REYgckbwvpeln~vwkj{uYNEaceii{vvmgmn|yuil~oVIHgafipwwsmjnq|{qhmkSGLmz_fmvuvqnjnu~znhmfOFPtw]hpy}uuqpiqywkgoaLGT}tZls|zusrpht{~tkgr}[KGYpZqtxtsuniw~{rifw}|VJH`k\vtxrtukkyxqhg|}vRJIjg_xuvrvtio{upeh}pPJNtecxwurwqhr}updl||kNJS}}dfx{~stwoiu|tmdpzzgMKZzchz}svvmkwztketxwcLMayci||swsllzxrigxutaMQixak{twqmm}wphk|qq^MVow`mzuuommvmhmmp\O[uv^rzvsnlm~sjipioXQ`zt]wzuqojp}oijs~hnVUcp]|{tpnht{kikxvhlUXfl`~zqpkg{whjm}qijV[k~hcxpphhqih}swsdnvg\~pkxt{wdLDuguwluqh|_[^[eqax?dkb`hrucn}tQ|tcbaqjnb@q_[hqwatnTO{qddtsX~|Ocf[XdxshqrhGswmir_YfMaZ\orbfoNQqrlpOtz_ZoeZgvfjnlZ?p}{fhcZ}p]~fa`und~msb?G~bgNwrh]ugYksfpo~dT;dqca^yn]uqifmcehX=Geb_{~zfa|kiokcg~~]M8Zx[di~~}qdxnnmifc{}lUD?gYis|||_inuhd_d}ZS;YYmh}}zlcsu}ob`YuyiRG?f]snxwz}akx~hcX`|[R9[[og}wri`vna\\ovmVIG|ocqiztvZg~gYW^s|_MF]immupxeWvv^ZYfzuuPMLsycsiwu~sUlfY]XocNOUkelov}}{]Yy|rZ]UixsyTWNlbmd|}}|lUj|{bZVWq~eRUWobiq{|}t_^uzpb[Qgvz[WOebah|xtf^hri^U[yxpXWUvuXds{xga]tvpgVUfpzeVU^eXozxkfbapt^VZw~owWWQpxShwymcf\vswlYYbo|kSQUcTs}|rde_aov`\[tm|[TKmyUfwxhecZsywl[YaqypQKUeWr|lgg^btue]Ymp}`JHms[`zrfg_`ssoaZ`||uwPEX|jVk}ikb^dxqj\YfrzgCMlseX{njh^dopsdYZqpyMB\~yrWeyil`ag|pr^X]xvk?MgvkQzmlf]dnougZVlowQB[x~x[^yll``e~pu_UXokALd|qRxomeaeltwlYQjrpWAUvy_[|ohabezrvaRVkkIG`rVpulddbi|tlVMiwh`CPvzfZqggectvtaMTjhS@_r^hyifjcgrmVLfdgFIvzm[}qfkgap}obLT|ne^=^ui`|ginbdrkVKcahKCx}tbqpeoh`mkdMStvacZoyj\q~vhMW|ifm`X?Hmoz^cwo^Gqtfirm^L?WrwqYl}yiSR}mfkcXBGhn|b]tpbLhvjgqu]NAT{ytuYg}{iZP}qhigWGHbrxhYqrdS`wmfr~]PFPuqv]`{|j]Qx{siinUMH\yrmXmtcXZ~woet_SKLopsb\z|k_UoytijuVRHWlqYhvc]X|vpgvcVNIjrnhYw|k`Yiwukm{ZVGShp\d}vc_Z|upkvkYPGevijXs~{k`]ivsmo}aWGPxim`a|td_`|upntu\OF^{ej[o}xl_alwrppy~jUHLplfd_zse_g}~srqp]NFWbh_l|un_foxstnv}rSJGkq_h_wrganwsvpm~_NDQ`eclytoajoyvtjtvSIBfs\ic}trhdoswxlj}bMAN|bahpusnfko~zqgoySEAaw[hkxsqlhms~vhfxhI@Kxg]pr~trolgo||nci}TCB]|Zis{wrppgjrsf`tkFAHxk[vrztprmdnu{k]d|}TBA]]kvxvqrregnr_[q|lG@Kxp_vs{sssjait|fWb~yxYADafixvvsumc`moZZluoIARuxbruz|uvpg\et}`W_|vu^@Kamdxqxxrj_[n|kYWipsJEUpbouv}zvlcXdt{`V\|utcCN_rauq}zpfZZn|l[UjosQGUmdgtw~uj]Xcu|cV]zyqhHN_wv]ouzo`XZlq[WipqZFVhh^wwueYY_xeW^ulnLL^qzZjz|{l[XYlu\ZgqpbFUc~iXxytaXY_{hZ^qkrQJYm|Yf~|{hZXYlx`[dvohGO_}jVv}r_YW_zk^\oԧif^V^fzTf\N_gugw|B[ǘif^jhtd`ziYh{RSZhfts2oΐgZYfmzarub}pHr|egdl~z^e;ƃaW[gw|cuh}ZB~o`h~uX^=`Y^n}nc{ejIGsmm{iUxXI|c\\kykvydrbER|ylu[Sr]Vv_U^xxfwfmW6\djOcpgekd\gxmfzuu`L8nz_kOo~sghng[lsdjyxkaD<{}^aL|tkhzģjf^omewzg_{zhdiw}{`o|pplqlhnsJ:Kx|edj||s]|ypkhsklmkG>St{`ej|p`spjotapq_C=_}uz^hqxkesshpl\{tSFCnuxz`ksx~fgqpgre_uyRHD{wv]k}{vdlpnjp^htpOEHw|s_p~ufjponiZn~lkNBR{t^wraiqqh^^xtgjLF]zq]}}q[pmqc^c}hklHFeyi^~}nV}so[^e`oeELpweg~gT{ueX`f[vaHP|}_i}yZ\yr[Zan{_y\IS~}^jqXfvjY__tsdxWEX~|ZjfXnsdY\a~pevRFe}Snxa[uh`[]fljxKIk~sJz{ma]bcZ_iipqDPo{gLyykc`}cdZ`hfvgDTrWT}}qj`gre`[_ljw`GSw|N]|}toibqmeb^Zsmu[BSrKi|wpohgvlgdWY|isU>\}nIxyppmigygkaR^~gtJ?dzfKrnmkkehpZSawjo>Cky_UklkpidnnUT`pkd:Jvw]a{kkmqbipfSTcnj]:Qs^hviiqm^smbSPhmgV7[{q_nrflse`|i`OOofdQ:kyu\uogro`czf]JQv`eJAyztWkksg]eqfXHV~}\cDM}pW}ipoc]hlfSHXwZ_CX~i\ylria[mjcNH^pX\H`{dbwqoe_Yth_LIhlW\Kesbh~yrjc\Z~e\JKufT_Mkocn}|ofbX]aYFO`XaLt~mbt|je_Tc{]UCZZ]_M}xmb|xfe\Uiƹt[REd|XbZQtmbrfdYVo˰nYNIm~xXdUZsmdmfaVWv˨hWLPt|u[cScqjgjf]UYȡcULWy|t[`TloilzidYT^ĝ`TO[}|tX^WrljquhaWUdš\TQ^}}rT_\yilv~tg^VWn}YVRbz~oQb`{gn{zse[VZx{YWRhzgOfdufsxsaYX_xXWRpyaQigohwxq\YYdĺuXVS{x}[Ujjil|ymYZ[kƲzrWUWy{WYjo}frxeW[^rƨwnXS]xvU[hxvfwv_Y\`xŸxkWRfwrS\jqh|p[Z[d~xhVTn~upQ[n|oj~iZ[\ixeTXs|tnM]vwomxe[[^mxaT\vxskHb~upood[[`qx\U]yuueDj}vntjdZ\cvz~YW]}sv[Ds{wmzgdX^d}~yWW\rsRJ{|wmhbX_f}tVT`rnLR~}uozi_Y^j{qTQg~phJY|urwg]Z^oymOQq|jdJ`{vuuf^Y_svgJVyxfbHj|wvqf\Xats]H\pebHu~u{mgYXatu~SKaig^L~sleUY_wwvMOf{gjZR{slaTW\ºumKSnuijYXxvj^TR]Ķ}rgLXwrijX^wvf]PLbƱundK_~~sjlTe~wszcZHKhkp_Mg{smlPp}rtrcRCMpȼfq[Sk{tqgN{zmynaJBOzǹfqZYmzwqaRrkjZEASƶ|fqZZs}zm]T|kmeTB@\ůwgsX\y~wi[Wviq^Q@Cf¨qktTa~rhW[}oiu|YN=InümqoQhngQb~xli|sWJ>PtõlviSl}lcNl~{sijlUGBS{mvcVnyi]Nv}wpfpfRGEUnt_WrweZQ{umdxaQIFZkr]Yw~t`YSwsjg\RJEahqY]|}o^XY|vqgmYTGEi~fpUb{i]WayunhrzXUCIqwflSi~wd\WmvtlkvuZS@NwpghTn}sb\Zzurlnwr[N?S~lfcWt~zo_\auqooyqYJAWhebZz}vl]^h|sqqn||oUGC\dd`]|sj[cnyrsrm{kQFDc`c_bypg[irwrupn{fNEFk[c_iuoe^outtvnq}_MCHt{We_r{rmcbsyswuluZMBM|¹tUeb{xpkbfusytmz}WLATĵmTffunicjx~tyrp}yVJA\ıfTilqlhdmz|uxqstTHCe®aUlrolgeo{vwru~qREHnÿ]Wow|njgfr{vutv}|nODNwż|ZZs{xnigfvzuuuvz|jJDUźxX^wvmhhf}ztutuv{dFG\ĸuVb{tlhhgysvrvt{]DJcõsTh~skigjwsupzsxUDNk±pTnrjifottsorsOGSt~lUspjhftstoqqmLIW~¿~iWw}nkggw~rrltnfJK]Ĺ|f[|znlgiy{qnkyzjbJMdızd]wojgj{yojm}sf`IQlybavoihhwjhpke^HVrz_eumighsfircf[J\xy\k~tlidimdku_hXN`uZq~qlgao|fhhܬ_VOLX]i^~hmY/\>8YrK]xqwi K:0G_miRqWQ^äy&S:7WbwhR}nkoo(W@5G_j~b@a[b}p*qGFROgwSu`fh3iJ?Jdku[8mfhzg2tڏYVIC_UqYbye>l|WMQijqU2|qfxu_9iۢke=?Z|Qn^btcDSh]VlbnpW0r|fy~}k[@`֬n8DWvP~qjcrcBCwm_q_ng\0gg}qwcXFZͱw=JUsNwxtfrzd@=|isZog_2^g~np^XMWzGOUrNoyhqvf>=orZo}pc5Th}tpk_]TT{QOUrRezkswi>;ukYmvua;Ml}qsfaaYQ~WJVrZ[xpuyjA:}zc\hqx_CGrzosabe^O^IXqycQxvx{}hE:m|\`aoz^LC{yups^dhcMndG[qsmHy}|sdJ:^~Ye[nx]TB{rtq\ekfJ^gG]rqtBzrdP8QXgVmu]\D~nvm]gnkHQlH`tqyBw~~tcT7G[gUkradImwjajroEIpKbvtyFkwx{eV5?aeVgmdiPt}nvgdltoBDuPdyxxuL_q|vhW6:g`YaihmYfzqtfiowmCA{Ve{~s|pVSnqlU89ém[\\goqcYwsnemt|jG?y`f~zrl_ImppT;9ɥrW_VcvumNvshgt{fM>fjfushfB|p~prSA<{͢wUaSb}yuGyrbjzaT>Uxiqugi@xwuzqtSGBoˢzT_RbzDz}q\m_Z?Em{lx|fgBqqzuqsUNId£}U\SdyCroYp\^@:rtj{wieFmo|prs[VQ[XVVhxHjoWr`_B3{njrkaNko{mrsd][V~^R]pvOaqZrh_D/sgjnl_WksxlqspfbT~eRcxtXYucpq]D2`dj~mn_`kzpkrs|ofVo}iThqaR~ypo{\C6PckxmnajkiissyjZZnZonjKu~~n}]B;GįemqondsldguwlYJqatkpEkq}]C>Bʳhoiqoiyk`du{oYBuizktC`v_EBDηmpbrqo~n`avsW?yq|lsEW{zbHEHϼup^rtvrc_uwTAywooJNv{dMHNͿ|m\qy}wyh^vzPFnsrhPJrqzgQLUi]o}|pm^uyOJZruaVFnkvkVPZsƽd^nf|r`vwONJsv[[FifqmZU_jaam_zvbwtSN>xvtV_Ifepo`ZcdaclZ~|ygxrYK7r{pUaNzefzppf_eaddmXw|myp]F5m}jWaTtggqrpkce`hdn|Yq}tzq`A5vl~eZ`Zolehsopfeamcpt^h~|{u_=7iwnzb^_aktabtoujfbpsdsle_}|y\;8^qqta_^gg|\^snymf``weufjV~w~X<9Umslb`_leX_qn{mf[T{gvcnN}tS>9O²msfe`andVamo}ngTMjwyemJwu|P@9Jôrpbf_cpeXbjo|oeNKnwrjiJowxvQ@:Gijyjaf^fpg^chp{qaIKtwlocNgqznT?;EŮede^ipjxgcgqzsYHKz{wjr^S_}p|iX=FŢag`_nqo^}t`isyuLOG_{wqoZ\Prxue`:?Gzcf^`proUy`lt{tHSBWsvj\]Lq}nf_:@Jqjf^bqtlR{bnu{oHU?Q~sxf_\L|ukj_=ALjqd_dqvhS|dpw}lMT?Kxvzcb[Mwzil_BAOcwa`gsxcV~|grz~hTP@FrzybcXOr|jm]GBQ]|`bjtw_[szks}}d[KABxn~vccVRmwll]NCSW`dmuu]`gzqtzcbFD>kmsebUVisoi]TFUQuafpxr^e\zvtwdiCF;^ori_V[fnpg_]KVLkeitznagT{|uthmCG:Tt~qm^WaelpfafSVHbklx|iehO}wqmmFF:M{yqp\Zffmoeem[TD]sp{~eifM|zorkKCHpns`aoltffpwoP@W{{dn`Qdok|eXBAKnmshfrrrybhx{xQBTuxin\VXhjc]EEPmmrqmrxf}bj~SEPftolW[Rdi}d`JKVynnr{vr{^}emVJKYpujR_QchxfbPR[rnprr|Z}kqYRGMoziO_SchoidWZ`moqttyYqu[XBEo}fO]Xgifkf]`bissxxqZ}~xz~_\?@r}dR[`}mi]lidfegwt}}i`t|e]>^{od`Zwu]Qdxrq_YZpTu~v{RFAY~lfc^xu\Ra{trZV`lQnuy{QIDVjhfcxw]T_~wrVU{gfPgm}wRKHUûjjijwz_U^{oSWyo^RahqULKUĶ{kjlnt}{dV_~iRXsztUU\}gkYLMVůunjosrp|jW`bTXd}vOXXwj}f\LOWçqoirvqezoYb\XTXtLZUsoud^MQVzqqiuyq}]zr\e}X\LOzoKYSqtmd_OSVtrphwzswY|r^g{zW^EKwiNXTsvde^QSUownhx{tnZrcizqZ\?HydQVV{u^f\TRUi|mix{te_rijyg`V>i{qgUR^nhaaX[PTNvrnt}e]nZrzqznblD@:amkURajgd_Z^RSErvpt|_blTs~txghhCB7ZkmTSchjg][_UO?o{sux\ggQuyubmbFB6T}lmUTegpg\]_XIg{wm`k\Wx}lfrWQ>8LxskZXgiy~f_dd_>A_ygfiYYmgkqUU=:Iyui^[hjkfagfa:EU|ycldWZccplVV<;G|vhb]hhafcija9IKux`q_W[[dtgXW>>G|whg`if[hfll^zdyriRQVz]bgltfu\rf`^gAR{iu_BBXɢ`^bpyxYztPdvTX-Xnm|aPWk}bcjvztpI{`{sb^6g{eveQFMj¦x[at|Vzrik[F/uc~cZTZrdUcowviMytrdRH{haRFOv͛nZbmpTtll}_XGD{}jo\XcǸl^iun^R~dcTK|nol_LS^Ժf[kyj_w}`ZGAʺz}gfUcfѤRVmvq`aohRK~hcM[]䮝]csy^ezo`^IMƮ~xq[kkѓ^k~pwJkmlgLTqjYPjmӜx^lLzikY>Zȳ}~gZ_vs`SgtqFz]Hk~|aU]nqΨhfwnKjmMKw{|mipzydmtZHrpRUw|pj[Yiy}ʾir}]VysbKP|ıd`dx~|Ƨ~\hxhUajXTª~]a`vqذk~wmYh}usSSQжziwuqˎvlkeOmwvZXP¨sg`dh}n̖yw|oVyqoPINigkvqijsui`ZXL\§hejpvlx}usec~~thCKjͲ|oy~sqzqkY`zcGRo»pnldllo{tw}ydgt|M?Hx˾wuluq~{rdnug]hTNPήonnojxfrvocixk=ITջysfrt~~{_Ve{iFT]ǰljokoiprbz}{cdk|qZ;J[ìz~uotwtgibfuSefeKZdæoylhlec^zpyt_h`krHHUfİwxx{qmljgv]SRdruQ[Tozg{bie`edsnl}faVkqogHJAz˿hoglpniVVvzQXMr|yYTN}rdc[^[d~zmkWcM|{ygscIIKsttrmoxpbkhBRC~liSTQst^a[\]npzyj~kU]Lpk|S@>JŹffcgp~sv]Xs}RPNSw]RJXzZ`X[dhcuwZ`Rdywe~lID>[ygvltyvlxqry~nCLFqsmVNJgxv]X\Viji`{{QbRuvr}ZA5;l̯he`h{utb|tgfy~z`D_IyjOIKv~]\Wei^`Z}{eYnNz{rvtO?@DǼhouyqk]qu{|xLNWE{xWNMPǭtfRZbmgg\\x]k`NmzeE:7NѸx_iqyusago`my}jOeMN|tYKJciXfik`\Pn{tdsQXxh{UG=GhħmlqnXrxsx~zfVZ=[x]UJ[v|rQ_kjobfN{~~khH`usqNB9Su̟httx}orQ~fgw}}f\\@c}fTRh{vbmipl[\F˜pkdEk~eueKBQe}}t~}ngQu}~]ZL9uykWSena`hnvgc]WqnWCwox[JHYa̵~zw~rqcc{jtyyZcLD|rfblntonxuaaRh}hnPKresTQVhpá{vr[ti_\LNq|}smii`~kgnv|`EXzy`[UX`_RTUW^mҷ|]zwV]7FʨWghuøP|Y1*3X{qun@Ndvj~ʝHB۬L# ?oyyvloG5g^sk~“^,~P,)Drr|tyiHQxsnvּPQq=%Ouz[o[<-Xlnul{RIqˢiG8Usnqvwe[IT|qlbRVQ%2exXqF;'QĤxdpkN]ceGaqn{n~stPMGMμ|}q}Z^aeDNswbr9:&Tş[|o}|\D_c֑{av{{oszqPE?>èzt~ybbd}ڭu\\tw{nqi7?+Rǩ]xvytbPDan؛nkzY:48~y}zi|wwf]kνser}zycnF;'NŲgr|h`UDSt˟oom=-8zos}xuwiZpǖ~irw_kR+ HxszxhgYFI}}vsvB(=|Ⱦ|mzslutiToȢtq~cj^ $Iryoon\GBėz~xrpCcwsnmedcUC?Xvذ~ddlQ51>`}xur|tc>Yeusn_PH>9Ir๳nvrxwilR?b\pd{NE5.=`έ|xo~xq>OnlicOL::Lqtypzwlm]8d`hjyQK4+?`ڦ{o{xGGreilQM5=Ppɦ~zp||yqke:`cc|snYM2*B`ަ|r~}zTBmdp}vUI1?QoΥys|z}tjhCUdd}|hfL0,B_٭~w}wxaA`izs~YC3AQnӬxvzyzviiPGej~g}sF0.A^ѻ|utvmBQql\<7@Rlٵ{{us~ykiZ8er~jv}B41?]Ȧ}lvvtAEzh^:<ZӧwexytC>}lz_<>:Pgʬyfpph[3]ziuJ:2UalV958T{ۻkhtbS:Cb|ᬵijm}z\XIMYg_983QpĨkjr{\\?pzTqM@7@Xo粰imk|vWZQLYcg>61Jb̨nlru^`HgzUoX>6;Ij漤pnpw~n[Z\Lc^pC21;XԦnrp}u`bS]~Xoc87,:fvsqn|wja]fJym]vB2+,Sڠrvj|wchWX^oe933`澐xnlsmkfefJs~uarH0"'Lՠ|rkw|~vlfYVjgh<*,_޿voighimhcQdaiQ(!#JЩpnnwzyr``Qu\m<%)`ŒrrcaejuecVW^cV$""K|бqmitxq]cNzzWl>#+\ɛtp^^aptcbWP`\W&!'Kqκpkhp{m^aQo|VdD /Rʪzl`Zcsnd^ZN}}iRY+!/DiǤnlgp{l^]WeWZM '/IϺibYhqjfZ^N{|rJY1$4=dөmkeswm][]`ZQT&-+DxŔhc\kkheW_S|y~wGT;*48_ٮqjhx~tk[Xad_JV3/)@oɗieckghbW]]wyzKMH/17Yٷygnyzuj[UekhEWB,)K@^Ȼk]LIYh|tqqsuiO-A;Dv²cQDBRbptbaiqym^:2NBaļg^KMWbzş}onpywfS':AExµdPEDS\mt^_gt|l_=*NHcþh^NPS_uƤ{mlq|vfV)3GKu»~kOHIQXizq]]fxzl^B'JSb~¿l_UQN\ozmku|tfU/*MQo»~sPNLLUcun_[iywm[G'E__{³~sa]NLWh{mmxxseT7%RVhɺ}|SSMIR^sm`ZkwunYL+@g]xĴv{ebMKSd{npyvseTA%Q[c̺u\WMHPZpob[lstmYO3;j`tŴuleOKN`}{rsxtrdTH+K`a̻nhXMGLVmtd_koslZQ?9egpƶx~seRJK^{|wvutqcVO6Bca|ͿlvYMGHTl~gcgmsj\SK9\omȹs{eWKI\y{wuvpcXUD:cetïpy[PHFSklgdkrh^UU>Qvm˻ng]LJ\x~yuwob[XR7^lmƮ{qbRIDSkskbjof`W[HGxp~ͽpjbML\v|vxmc]Y[`wñtXCDQkxiZ[bebcXVevWIZdyڸqD>wdUP'-r~xskgB7d}ğ`&V­one_M&On[L4OvrŤh*yմaIHGQ@5e{uzkRKjlnǢv;#v}YQ]pqQR||iqdQDSuwue[&. rN=BNEGc|w{UMSapxU:6àcS`^KXtmR?Q\yyrUve8=EȊmF?NHTrwzGJWYs{pg|jc`SqRbi^jvq|t=WU\wRY_owLJMg˲lT]PVjowVfQUc{t[invc_UtƩxpogsvw{]LUFRvnafJT`ydPVpԢ|gTDRl{ub`GEnfpgur{flwʓqjqlvz\vc]_CWRigBev~wkNr|ysVY`ispwkaL.PvTn]xuf{|ldZ]gkUU:?hpS|W]}spbO_bYS][dbSPzViiJa^v}w_bnCov[TNSzQNL_ze~kNY[xq{wZrmkZ^æ`OIc{Tr_O_jtmhdZLvncMKjeWLOarfMW`i|oookurWXjͧw_GNhtYqWNfli}UT]]qW=Zy…maPHWomXM_Yh^r|uwoZTnyɋvTGTxsXuT^n`o~Bcdc~eAHimucNO\{kQXVS||Oru|dTfrñ~hMI^l^tL^ZbeBr\luN@ShlsPJRgsq}QXNhd\p~lT_mt[TVqZfqO[ZwWPpWuv`KRZuqdKSZqp{PPRr~bhss\[gku^XWq`sjJWh}tSPhb~|mWUOZjYTWautiCQcw}ybf~zaWbaywnbV_wct]DaowuwPUvjym\XRKr{ddZYeyq]D^c{t{Ro}k]b`k}w]T`[qLIegvpggqn[drt}c]jYPPcniYQh`@sgpzu_]hmllZ\aD:>donURaxXFujx[_kvzxiwaiWQRr¡j^O^owPO{jy{cYbiolj`ta\C9Hpi_U\itOQ|pd]bpxywfrcfVO^sWTXg|}jN]j~iX^bnlpi\o^V<=UnX^[cu|oMasrb`duumaledRWasż|L[]qqmKlkr_^agpluYag_NJf{uswzoux|}sxq]QRT\rzk}QV`qĭror|rsr|}vftgjZRMIYn{h}`4GWstpzpruy{qvymWPHOgv~jeL`giv~wrqx}~conoeXJ?KbuzivE;Rfsszpusy{}}zhydUBDWm~vn{VWfvlz{xqvv~{q`~nnbO;BSmscd>E^uwmsuuvzyutp{s^E;K^yogtU_p|mt}wuty|pqejnX@?Ph{}QaZB_o|esz|zvxrlyzr[A@F\qsTun\pxo|nvssnpzpyweRB?DZnlOgUJdwxgx|~wyqmteLA@Ncv~hZ{lbt~kyttsjow~smXKC@M_vzfSjTPlzql}}xshrysXI@DWh~~wg_jgy{a|y}tjhw{t\RJAETf{yycVoQXouf}p|simyaVF@K]p}w{cegnuwz[|mfq{tQSDBKZmxx~]^qO^ix|gyw~yllv|\T@DPdty{~^pgppla~vgmxtqQNAHPanw}YioP]hrpx|rkty[M@JUis{z_|fmsfjnkt{siPHELTdm|z]qkN\pov}wmrxxVHELYjtyd}bm{dqwkqunbKIJLWcr{`tbKbxl~yonuylRLGL[h{{fuau^~qor|soXNNIMWezy^uXOj~h~qnqv{bWKEMZn~wgjhy|_wrowhw}SUJGLXm|o^qPYoo|xmpqvaWDDK`tlkgp}tntoqe|uXRDDH_pb^iQa|~vqnmyx`O??Ngwcmhvw{|qn}}dtTK>>OdyU_gRo|sqltyWG8@UkXv|jtxpxthiOC7BSmtJga]zrulr{kN96EZymXwzntxw}nzYF7:D]}_Llcrussrxw}}X?4:Ik}c`}mzusx{q|I=7;MmxUQvl{orzwsrs}~C;5?Yt}z]m~uounkpne>?7E[q{qId~orw}~|rkfr_>:;Oat|{|r]}h{m`dt}lzS@>BO_qw|wbNv{qlvg\guz~P=@HRbkt|zpiuynq]ZhwmftJCGHQ]gxyr]Urpo~i\]ivutEGIMTZgx{mruz~zz{a[^m[olHNHKMXlyxrT`}i~{{}q`]`tjzgGLJMK[m{izs}}k_\dwo[veLMHEI`q}xiOeyq}qia^j{i|aHMHDMaszczxph`amy{i_}_KM@AQfy~q`Fn}z|roicfnwmVJJ@FUh|p[sqgego|{{dk~TLC=HYp}xmPI}~|lqhhgsquxNH?BL]r{acqqjigrw{~ydtuMDDP^ltnicZbs{xnc]osba?=GT_lqsxztzwj__o|c]bA>HUboqqmf_lv{vh]cwh]]JP[fnwxque~ȮiT\`gw}v~mo_grfqgcgmsɹ}8$v-7K/.C`ogoxĸZuQ[vc]WeǼ͓>-d50D=37j|mpvR7MkBt{jVRuۭg/ڹV@2,1Gf^\UcrhsekљjmzsYѳƯ~),aJKP@)PfGKa`tTUpdgldbsʝ[*8Dⴔ~b0KSOMC`u_ZZNGZӣZX^yrɪU#'Cܱ]PBg?Qpʨg~l;.*rƲ|YuFDBbzs}lEa`bpuǢ|u{pRHaybeHcUfblDEEGMLpj~geg+$ 6_ͲzpBONcppt\B:Hmwl}zzpe?EѲh{]JJQxanBSadbiXng~vr|WN&@ʏU_d_iwhycgLCUd`Wzc_bnf&BӍzSPJ]xrr[EDCRxwf\ifz~kW_4``McqiWjZZgl~okNaxwks~l,9kYiei}{p]~eZEKYfKMBhsq|d~hj:"8}ܲȒz]Th{i|iuy`\IHhjEkzriqse<(sұgoZWwPi\LN]iuk\?-F``sml33 :zuyqjbFqzfMJnqhN[^dDzny`[QO$-dԮtV[~{uxOLCLRyo8;4UmйmrZ^xjJ3-S갞spIJ]fldnr}scLQ^aذtuyq|~|yvD-?wվ}twcdR_CWl{b:O&%DSҦiwmoxrMJ3)FYkϯ{T]NRvmrglsZDoKLAOڴunczougZG=-6PĜydrfS>S`liTS/'9{ٞ]cjm|ejM2 344:Ŭhj:OPU~GT^4GGbЛnnsq^]HIGB:}nf{Oic^elnu>PM2+.qɹÈo\ao}raWXʺgrp^\fzvbl]6,)=rĠzh[k`\a_M>-@[̴bUAL\qrL1()WuȔrkkcq}m\(2"JČzVST~zOa9<7):O^}ʝjbYa}{b8(5k؜qoYkx}~uN;/7Oe{ɡzk^gw?$>iյuebauwco<7&3S`\{q}r~ivyxcW3;5`ޮ{jXdt}sAFAFZhp}ikdz~FKZ򸑌\opzTrhC?BHNFVjsmkpywR"*.^z}x|ou[D?Jghqn¿}wxtubY[Siac|gnA;DYUZON6^ƶthvxIA3Xʙ^cpgXaYUQ`aɚgieWZ3%O۽ʖ|tv{iQJDR\c]C:fZuxrk]~gMPпogbaf~{PEG%=Eh֧xlzeeG8,31:N]fRTn}ug5D0+8Zƫi`orJ;)''@dĔ|q}i^OFJE9-@wvqlS]nmveMV#!#I˱ylvs|\aK:.495QtϺeab[uSFJ&29MmȶzjfKJB?@5HT|˿irnjnrlnETM85!GuٮwliqYU:BHI? GAs͛uv__zbkA++-:emklr_XNF>HL›lqc`vgIX80$*6Ti{q|yoR?EECI%17.b{͜qmmvsf`CF41:a~ö_mZUdl]@!!.g̲yif|{u^o_>1 $-Np}kdr`XTLG65->YmûzhgmvyR@0(>TgwrqsrYZid]D(1"Fr௪{qiXhDM@207H[RxuheTSgf[-)$@s׻Ƨwrx|`Q-*8H_zpxifios|m`3,!);i̼̝xt}noc>D+1HQSMBolx}kbak]M2C$.\Ο~~lwX\GBILYVWlg^fpg=@)nƻ\~iRH9[޾î}|eo@4/AKHIYNҽ~{iijptirKBD ';gҵsiwkac?>-8?=BQPկf]`vGC.4_j}kFD7?BAPJGđbnw~qZ1L7)-Ijəos{kU6-.FMDO9GxsÏolruVV("(KvԷʵ}`tMRMLSN<:My|lfkzRKD+SpĮm{QJ77==DK-[ag彠rjqX[G/,4Uu٭soFF>RdYL0EAi͛}u{{nVf;'&=bžb^PSGIL?>'XMkàznjvie.">]{~qcYLGQTKM!071_Ǡxx}SVQ78(2@Yr{ȳw~SS?@SXM96*2^߿|w}y`9'1KpnnTbYZ_UL)4$>[}ٻųvyz[g=4&+?Q^j\zbxi\EENFI,/91Gkߺʩ|{|ON617Kbni_\SLZogU$ -+Q°czmF>%*3D^``gr]ib\\WI83$(7DbګkQB+8KXdQh|onWO\`[D3? ;hڻƳsbyNQJ<9:?I5dupbcWTdf[0(+ $Gmս{shB04?O^Q|ƠnjfgjqeV1;)7_൫zrHN88HQR@-a]s²xwoyla\d\I2K*4\ҭpmqYLHBHAfșkjbs}tS2H$&>XytswzhzP6%!+9K[Ie{Ɣp}UAT24A]}ƸϽyenB82AMKDA'Tsɭzvx{rtSQN(&.JrǩcciFH:=@<;;1nx}Ʊtnz_[>'Diĭf|rLJ>BGDK?-^[pܮz}}c>S@44AXlϭe~cA<9ITJK4/VNoԫrvD1(8UxdwTLTV[[G?.POrշã~cZV*(,Jcscd`WOJGF@F,GNHaԾėlteC@9K^kɴRJGRbeYD!5(3_廴x[tU:61@Rd~_ndNX_`_RD(@:Lfɤ|Z?39Reovǽsva[\[\SQ78=$3Mѫj]e?DBFRVYcZpaVQV\e]L&3+6\ƺѲtbUA=FOhttǻ[Y_lmk^B!5$%5Uۭo_=86G\]dT\yƭdtrddcfaYO61D$'0Ovֿ˨umb_URSNVIphZY_lqi?;4 !R̸Թuv\QD?EKNXLsvsνw{WW\ourdL"3'-7Vt¹ibPMX[ZNHrkzǹ|xjiggbM=T,>jĻӪrePUQQULJ4Bie}¼za\[cksnG8;0WwnYOOHNBcmbvӹtkowzsa:D9"&>`Ǻ^WJFQ^[K1OHNkɼlrjlkmjV9T: &Baƨút}wogXI53ZUk{~ijmu{dLX( &Ge~siUKQPN;JY@M[xà{eccusG@H'#$0@Uij|vninfT3EE>WlxrpiH_\4, 1TnünmfeccU?+I0KRg}Ѳgoi82#"2;arYr\LC2%&)+$Lvrȩ~r{uLAQ*2:DYrrt{tqT=+$%4BD0OYUuټ\^_672;VvʴwooEA8?CC:&@Jaˮȟx{{xWeQ))(7Xz{\pmQR?:557)']Q[nď}goH*,8MgzpuSI90Ifٲkjb51/EYepladgb\TONNHC)F?.?ZҧqxWSDIQVgdq\QKSai`F%75dۼ̬deG@7ANXncrȵhseMVbij_N*=-9IhĶ״pVKGTaakUr˼medcaZU7?F!#,Q~ã|jvLJMRY[UUBrý~cVQ[elk]0=3&>lйvwocZTQVYUͣkddtytkP'?, -<]}ŻzPFEO_ddOKm_oʹ~x_ceqqg_B2Q.&,<[{ӯŸzxjqwtm]Q5KqoŸ|phmqqtMDN6]~ɴȺzrc[[XWSS@bi^oٷgTTe|yl7:9)6MgxļyqlqsrjT:\RUqϥxk[8XI*)'2IbǶ^\alle\;3WM_tŸrh]eptzdFZ0(Fgx}оvfX8KcN^lȫ¤|zxODQ+'.5@MXgmýo_^`ehZ:QN:LdɰvtrxzpdBS[7-*-:K^j|Ýzw}qJ-KDIbwͩ|wkUhT/%!(:ITUvèupf[P8CbLHO_{ķtim|x^O^?*.49BEFHvº}~mJPP51%$%(IVeo{ƶwt~\B5.),)#1RbqŶm_QNe`I@:@Qbyʶ|~{rnvlRC@>6/#7Wct̰~xuR517Jctrt~udUH6'=Y`n̸o\[^J@DHNSXgzrkowZD91-0.4HMM\rǸy~{^I<7=OZȩxơzfszlt`?jx__UHtiomf~gRSSX¿ἃTzʼ}y{{zV=SZL[cXSRpv_aL@P[trhyfPPVwyty~}YFA9D1;^Zh}îzm`WL'-0%4Z|{mru~ǰktt{yunx}hq^EACWVKYSPWYoz~~na_D;Nesjjp_QTarsxu|wYEHG;2:LWgȹor[C2#%'FVpzipžo{vxz{p}k][FJNEUMEPNdf^|~}uYSI>_hit`daSbX^rdp||uw\QV;:4-M]z~ԾqRH(%'>CNsxpirȴ{stmx}}v]VVRO>@J@@N`iZ^syzhRMPS]bhk^akeZOVc\hstmTJ703.SxuѻylK?*4:5BEiwvu|tfϿȸnxpvrwZQiRD:1I;>`[_WRtutlMVcLW]coZky]UFMaUputNB2221_yz{ǼľsaN>*#7819Gbuysv}ÿv}yqwtzxmc\aR864;GIVWPWUc{ea[_NE_bgpjr`IOHWlmxP8=*6FPsu{̲ǰsdY:?0(7,9C?b{|uzź´±y]aH5(*5Bgnzs~ȺurwwqzwtgW=@>@LAIPBEIWg\ju^M=BFO`aebSV^bd]grkq~i_WE835=C^zthN?*!%O\i}|m|΅qtzjlixxroYN6:QCDHFRFH^U[_`y{qNB4DVES^X]P_p^ccbtn}ygl]64-+?Lw}ĻĹ{WH."AVbxliѴxlrjelxtl[NHAEGED?HVVSTWYUgulYDABGKHLRWbbcke__kʻ~}p_Q0#'3SdzǿqC0$!0,Dddwwjxdzt]jkqw`_VTP8EG7AEZdMTRIX`r\`OKC:ND=QYjfYj`Wbj~̿raX2)7R\o~þpI1-,,+9P^qzx{ǭp]cwyuz|yh_d[L?7::@QZ`\KGHTkzs``dMA>;B?Nfde\RYV`ruvƮ}dM>%1@F`gw|t˼ïwkU9;+'/)EauwǬypaiuxxnzpjlTM;&6=JVP_W@FK`oqwufidKC33EJ[daeQIW^jknwsļx[LD87;HX^rxs̾ujbJ6+$%'Akw̧|tvq{zrurpeT@4$7MINLOR@K]^kpxubaG966W]Xe[XND`d^farursZPV:5>B[azyu|ŵtyj@2 &(Srx~yl~ynytvx}k^H>0,CGBEAMNKXXZdjp]VE;:I_\W[XTMN[XQUZiuti_U<-:GZq~u{ʸzj@&%);Mmr}yorvʡzdnzrdYN9?67D8AFG_VOTL_j{qRVI=MKX[M]YW_MPQFUVh~̽Ĺx\Q:+B[l{vpqzӷtfhwoZPHE8+4;>FP`\IFMXjo[LOMJJHTWT`d_Q?GNL]l~xí{cFB41Obtxt{sƿx^U3$1.8:Cjvptխpqbs~z~aYYB:&%<;KYT\J@MPl|pfLSVCC?NOcnp~x~ʺkNC>7JZdqpz|yzҹ}hXI61-,5>Tv}~švklo|{{zyzkYI4+$)ESWWQTKBUgwxifVNI79>JfgcaOI==Zbelk{|Dzn]G>LCHZ_qs{t|~ʫ~t`VV6)*&:Ebֹ~qqxhqypwvcO?**%7SQVTMUORbew{xrpfHA:-3>Xlb`YLJFRddjkmſfUJJIAER_rxtʽvnhZK3!"+B^t~Ū|}rnfepp{z^?4(09]g~tǷrmdUct}~{jF735;7BMJQXah\X\e}}m[@(,6=GQ_`UVZZVPU\_k|ƻzzwcRD=<>Tqx|ºztthQ<./CPgqxw}ӽzf\[]y~rgV=@94:1>NQcabeNRdxzqRB1+=;@MM^`\eYVQDUcoʹӽeU@3@EYqy}s{whK:6,4>K^cvxzsb^bhxznhaOA72.*8P^a_]ZNQiygTE=57=6EY[mxwyrèt]NWkluuӿv^KACW\]jmtwx{yvĸ}{m]QJE5,3?Rh̲rvvtlnzz|ykK0)#+9EWVQRNXabq{snhTD-,8;Shqt[LF;EKRdbht~IJtm`LROV_Wgpu|{|mswzɸr{oeaJB1#4@Yu{}}ĭtrfi}ugE.*'7==LLMRRde^iq{jQ='*9G^hllYLFDKGGT[ftvlf]WOOW[evxnonq}{}û~uw}qaJ61(0J]ou}ozɲsgjh{t^P3-65:49MLU`_eYZr}|mO:0%Siyí~rkVEELasyzpjam|ȿ{|{dL?2ICEOYk{жtijpuqt|xrleZB.('/=K[_ZUR[jvfQJ>4*):HWmvueLA*-2;OQX^TY]nzznRB>.-+3P`r{neO:;GQjyynjflhfsxȺtfSLIGKJNUU_oȱxvqmlksxrdP@6,.-#)4QoxxhWK9:GNVVawнŹs[K>N_ixy~}nqofbXdw|{¯|jdWMVNHFCSZb{ê}tlennxsaJ8916EEICBQU`otqP:' *5UqurcVPCDJHMLXrȺ¥s_QGR^dmt}|yqbYS]t~ytle`YVPB>CPamxʾmghkw}w\K>9@>@B9CLeusyx}ʼqegl{~wsaPF?HG<;8>DJ]fceizyzcC,%)8COaghea`TC==ERdŽƴvj\LBKYh}p`VRZh}ynsriXB<:=Pbqwqu|xkcpvxuhdYLMIGC58?DQhpʵ{cP@6H\sg^X]ik{ywxk`K79>L]esvqzþxtnmpnoh^^[VOEC=5;FRXUWZ[h}vxs^PA2+(-7F`txreXLAFUbltԿʼoW@45Nm~ygcfdikuvpaN@5@MR`gnxzǶw|vikdbb]e_PI<:>=KRSVLO[e}|ywj[U>*$*>Ts{tkWQOMY_emn˭w^@55Catypmeccez}n`OG@@INU\fxϺ{nc^_ehfaTD:8BJLPPLHIXkx|ukZH/$=Vhxte[TY\X]_`jzƷľz[G9>FTnw}}lfZYcsj^WNNBAJIUfxҼ{o\]bkqe]Q=;HMQLAABKV[got~wy{t[A/#4AS[`hcef_]PIPXoªg]NCCDXp~cWU\q||rlkZK:-9H^u}~µ}srnuyslXKIFKLII?;@HTUT^esuv~~iO>4-28BMT`knk`WOEFSduʺȷs_K>=Gao]W^gqwuhS>2.@Xfsvz~{¼~x~yxkbWLRQJG>A@=KPONGTfyyw|tdQEC615:KVevpfXJKGL]dowIJu[D8@LkxqaadcilwucK<54HYajmw|}ŵwpid]WWOD>;AFJNMFBBQi{~ug\RH7*.:L_ltl[PIKQTZ^amʹľwUD;BWkzvqea\\htt]P@=>BPV^lu}|yǶsmnhj_RL=:=APPIF<>BMl{}yoiXG7&+9MeklhYSOR]XUVXi|Ʒİ{YIAHXbs~k]VWetwcVLFB;@LYjz~|~ʳ}vopspdOA=:?JRTI?=@GUXdv}vz{~vbL6/-4FR[^Y]`be`\WOTbvžȸzhWMFGP\rzjZVaq|yuiYG6.0Cawðxsv~|vkWG99FKMMHGABMQTW^s{uty}wiP?21:;DNRY[bnjf`XZYbvûŻzmSE>=M_{rjaequ~zbO:+.8Smz}οwvyvlZKB=DJIIDEKMQRPPQ`}uw}~sgUD<8;;:@GR^gnng_X[dkt~ƽxbG76B[swqqonrux{pT=0.;J^ry|ó|yy{h\RJIBCE?BGPZUQNFKWr~|~q_WMFC::63BQbmjkdY[^jurx}Ͼŷ}hJ46AZo|~y|wmljp|~rV@76?GSdn{~͹~z~wi`\VNB;::ALW^YNFBIZqxl^YXPE;313@Velia]Z]houtptȻŻcM;;JXitzzmbfo|k\HB?Pl˱zvy|wkZE5,3DOUTOJBBMVam|ztonnf^M:1.;KT^`[WS\gghdbdgxÿwe_TLOR^lyogcct~z|ytoYE6,4AZy{۾|~weM;41@LMNHGIFMRS[cxxxy|rbUC86;KRTXWWXZdd_\X^fp}rgVIHQatvkhkpwzyvt{qV;=@GDBEFORMMJPaw|{nXKDPZirx~pjqµ~r_RHD@:;<@GNWVKDBL`yxgUKHGHGFHKQ[dgbWSRT]itxv|ʿ̿|cQGGXl|{wxxxsiims|kWC6:AJRXiwwplq̸~yi\VH>3.9?KWXVJ>AI_zud[NNPHC=?LS`kf`QKRVcnquqtŻɼeTMKYiryvx~~vqgfnvn_QDA@@EK\r~trvܿ|xm`O<0)/?MWWQKB@K]qsg]XSNG<7:FXdjg]SLO]hnpnqv¼úkZQUX^gjpu{znkjn}}v~ui_YJ?;8CQg|а}~~lWC/*+7LRURJKIM[drumea\MC9/3=Qdgf_URR\jlnnnxǺrd[Y[WZ_eq{}rlpv~|sq~~wrngZG838I_vé}wwx~{cI6+-7ALPMLLRXY^en|}rolaS@2..:LZed\YVZ`cjjhnvzmgaYWQR_l~|rpryqqwxvyyzp`P906E]n}yϼ{nox~mP=429;@GEIPX`]Z\ar~yseT@-*0;IS\`[\_bebbcdn{¿þ|xpeYQLM[n~ysu{{ups|}urzucN=38HXgqz{v~̽tmmz|jXE><8869BJW_`^UR]ovgP<0,6>DMQX_aihc_WZdpʾufXJKR_s|~tux|uttywuwu`LB<@KS^emwwƬrqtvk`SI?50,2BQ]_\WOP_uvaL>76:=?CKXfmmg]TOVgw¹̺uaQJO^jtzxtqvzxuw~~~~z|}k\NJIFIMR]ky}ǩx{{xqm_J<-'*4JWZZROPUi{n\OEC;787APbsrj`QNP\ox~ij~kYSR^jlqqptv{tsx{zvs~»}rg^WTLB@BN_sռ~r[B0&(2@MRPMKPYcoz|k`YPD7/2:J`oul^TMPYbloqxrg]^cglijos|}topuymjqyvrlj_SF8:CSiw~˺|w~oT:/*1<@FGFKNYbdjq{slbO?.)3AVhnodYUSX[[`cjx|qlhifdeekt}wqlmt~zogiu|uvzxo_L?7;J[jrv|tv̿}wwiS>457:99@EMX^b__kztcL7-*6JXdhgf^\]ZWQS^i{ttqic]_gn|{njmq|tkikzzxy}o]I@=@OZbgit|orİzxz}iZJ@=73//;FS]]\ZZh{yaJ7/.9HRZ_djihdZQKM[mï}ysg\X\iv~ulhnx|vnmryz|~o\MDEJOVX[cn{trͺ~x}|qc[OA7,(,4GV[[VU\e{fO?457;EKUakusg\NIMWm~ȱ}pdWTZgz|qmko{}xyxvzxy~½~xn^SLLRPOQS^l}{{}{vpi^K8+%)3CRWVSSZgxqZI@:622;GXkx{q`SKMXgwžɻq_UPTcq|~xsopuy||xx{{uqxviaYUVTRNIMWg{ͳ}xswxywiYD.'(2@GOQOSYhyviXMD6.'(9Mew{xjYST]gnxõƼt^POS_krxuqtw|{wwtu|tkm|}sf___]XQLGJWgxһwokoz}q]H5+-5=BDGKQ]kwzqi\K;*,F_pxumb[^bfilt·¾s_ROW]djmqux|umnt~riky{leacgaYOFGMYjt|´shio{~r^I=459:<:2++5Kdw|pbVRW`hmt±s^PKUft}wvwupjiovtkp|rd[UXZWTNMQVdouvrtx|ͽwtuy|o\G;207:<:9CO^r|skbO<,#*8Pjwztic\[__`ai}ǻn[SR\jrxz}|ri`bn{{niq~nd`]^\SLHLU_inmkjoy}uuz|kXH?<;;8314?Qbpz~wjS:)#);Pcpqolihe`[VYdx¿ǹqaYZ\chlv~}oa^anvpmt{qjhf_WMEHN[gijfdio|ſ|xxxiYOHHE<4-,3=P`ipvnX>,&*9HUahlqrtnaXQUbvʻxkb^YVZam}pc_cn|xuvzvspk_RHDFQ]gidabgr}ƶ|~|qg^VTQJ@2+*1?LX`emz}t\G6,/5INTZbrxeQC94214;H\p~|reZZdqȾ{kYIADUm~snprsstw{|ueSFAGRZ`bbceoz{}Ͼ|rhc`de]SE9318@DHHMZkwhZOH>2,(.=Rl}~rhcbjrxɳr\F=@Nex~zyuqmjp{~vyweSIFIQVYZ[bkt}}yuzͽznedfhh_RD:9;>AA@?DUk|sib\SF5'!'9Pgw|xqlmoqstv~ǷuZG>CP_py~vleem}xvzvcVNNNNQOQYds{|{uqszǹvkhjnle[LB>@FD@<69CUm~spnlgYH5# (;Qanspqrvysolmyļt[MGKRYenwrd`eqzuzte]YVOHFGN]ly|wqmnvºvprtsj^RHDGJIC922:IZkyvqtxuiWB0%&3BQ[biou{|xndcj|¿¿taWSOPRZjzyiablxzxzwmiaUI>=FTepuskhjq{ļ~ypbTOMNPKE:006CPYeo{ywytcN<305=DLS]kvwnb^erĺzmbVMIM]t~offlruuvvx~ym\J=9@P_ikigdhpvwusxĶte[TUWTNC9317AHMQ[l|zjYKB@=;<=ERbu~~wkc`bnyǷ½ubQEGRhzqmonljipv~|iTC<=IW^babfjptrmgiuɼ|md_\^ZQF;78:@BBBFUm|qdZSNIA748FWjy|vmecfkquy;v]LEK[o|wqib`ep}~zcQEBFLSVW\blturjbafv´wohge_WJ@<89CToskfa^WL@208G\ksuojikqrpopzȺw]NIO^kv~}oc[]er{xzdVMKJHHJOZfrxtkb]`ixпztrpi\PE?@DIIA836AUlzpjjjf\L<2/8IZeijjkouxvnikvĽzeUPTZagp{qb\^ht|~zuw~}oaZTKD=@JXiuyvkcadnw{{vj[KCADKMIB626AScswpmmpj]L;43:HS[^`fmu|{vogjuobZWUUX`pwgacktwwurvyqh]OA87BTgtxvpihlsxy}Ⱦ{m\MBBHMNJB;69CNYcn}{rprql`N?66>BIMNNMSby|thXMEBDCB?;?JYku{{usu}ŵziTC?FXl{zridfmxt]H=:AJQZ`fp{wmipųpbZVSNFA;97>M^kqrqos{}gSECLZhsy~zlcbgrzp]MEDDFHLVcs{nhis®~sje`VK>89?JQRND?DPf|}k]USURJA75;FVbhifipy¼wbUNOW]djp{rebfovwwvw|maXQJB>=DUhz|qiioyҼ|wobQB76>HPPKD>?JZkztg`^]YPD95;FR[__^ajw~{}¾qd^\YYY\erukfiorqlkpzzqlaRD74:I_qyztokjpsv{ɼ~mYF;8>ILLF@?AIU^hr~|rlkg^SF<;?JTVXVW^fs||zttzƿvpkcYST]l}xqnoqojebgt}s`K:14ARclnlkmpqpljn~|fSE@BFIFA??DLQUW]j}zxqfWIB?DLRTQPSYdouwspqvzoaSOUbu}xvxuog_]`k|r\E85;HS[`chmswrjb_i~ôxcVMJHDA=;?ENRPNNVh~q`PFDGMPONKMU`jooljlt~ù~m]RPYhw~xka[\cnzq[I>=BGLOU^ht{{se]]h~ïyj_YQI?76:CMSSMFHSgn\OHINOMIFJPZfkkfcfmxý~k\UU^jrwwx}xj`]`iptx|r`SJGECBDL[jy|sg_`j|Ű~vmdXI;12:FPTPKEGSe{p^SNNOMGBAGR^giea_dp}¼|k_Z\afjkmrzxlebglnnlq|th_YQH@:;DTix~|tlffoy͸{p^L:008FOQOIGJTdrue[USNG@:;CQ_eeb\]co}ý|mc_`dcaabkv}snmprojeepvpkf^PB75>Marz{wsrswz}Ŷ|iS?317AILKHIOXbks{of`YOC935?N[bb^[\doyļxngefea[X\et}wuxzwqg``i|zwuvqfWD75;9NX[YVX_oqZJ@>??@@CLXgopkc_cmþxl`YY`jopolnt}|qljknmkjn|~sg_ZXSKC=>HXjy}{tnnr|ï|vgR?/*/:HPRQPT^lz~iZQLG@:8=HXgpoh_[_iv|ne`bioqniilt~wqoqspkc^bp}tnjhe\PA88@P`kqomlnuz}¶vaI8019@EGFJP\jsy~zmd\QD816BSclmg_]_gpvz}tifhnqplgflt}{uqrvzwnbYYdvvrssqhYI;7=HU^bdfjpvzyvx·q[G<9:<<;=DLQUUYblv{ztnqλo^QGD?9416AO^fiijrwbL:23=LW]_`cgknlhdep|tqstpidchqz}volqx|rf\[`kvzy{~|qbSIFGJLKJLTapz|wplpֿrf]UL@5,+2AR]cccgq~eN=57>ELQU\entrlc_bmÿzxvqjb^ajv}}yqlmr|{qidchkosx~~yn`VPOQOKFCGRaqz{vonsŭ~vpjbTC4))1?OX\]^frmVF=;<=>BIVeryvlc]al}¼~xmc[X]it||volnu|zsonopnjhkvvjaZWXXUMEADP_nwyvssyлzxwvn`M9-*0FTevwpfTB/$$/BWfmnllmrwxyz}hYSU]dhiikqx~{tmlr|sf^al|{lcbege]RHFJQY]^^_gtų{w{sdUKFC?:537DVhu}|mX@-$'4DS]cgkrxzxtpr}þyg]Z]_```eny}tkhlwxmedis{wmikkf_TLILSXXVRT[hxDZxkaZVRI=3,.9J\iqtxkRFLQWaqo_TKD<637EXl{~yofbgq|Ķq`TQXgv~xrqsuupkijpvyvmecjztdYTV[]ZRIEDKU]`__ckx|ww{}vhVD947;>@AGTez|rhaUF8..8Kaqywpkijpux{Ǽk[TVaox|{xyy{{vnfbfnw|yqe_bnna[Z^_[SJFGLSXXVSWao}Ÿ|{scSGA??<868BTi|zujZE4+-:M_kponnrturopx¹~i\X\dkprtx~~sg``gs{|vkcagt}ndaba]ULHINUXVQMNUcr}̻{o`VOLJC:2.3@Thwp\F4-0?J\t}smjf_QA0'*7J[ipruyƻq[MHMW`hnrywj`_fq{~zslms}tcXSSROLIJPZdhe^XW^k|ȿztsrneZPKKNNJA96=Lavxtttm`N;.+3?MX_elv~y}m]UTVX[^fq~nc_cmtxuplnu~shb^XOFACKWbgd\USXcpz˼|sh[SPRUTOD947DUer~~{}~ykYG;68?EJOVap~{uvĹ}pgb]WSS[j{rgceknmkhiow~ysk_QD=?IU_a]VPPU^fkouózk^WVZ\YPD958BMX`ivq`QGDCCBABJXk{wrt}ʾ|th[PMTcwxoklljea`enx~|xy{kXG>>FRY[XRPQV\__^bnʼse^]`a\SG>:67AQcpvvtuyʿwbSOS`mv|}~}reYUXbnvxuqrxydTKILMLJILS[a`ZQLO\o·upnkdZOHFHLMHA<>J^wvmjihcWH;59DS`gjmqx}ŽweXUY`gkou|scYV[enrqnmr|{j]VRNIC@DLWbebXOLP]n~Ź~zumaTKHJOSPI?:=H\puomomdWG<8IWfs~zsrroeWI?=@FKNOS[iy~rkfb\VRT_o}qhegiifbcis{vpfXH;6:FVafd^ZY]ejnszķtbRJHNTVRJC@CLV_goz|ywodVJCBFIHGEHScuȺxtph]RJLWi{wsqqnha\^gt{o]J;6:FS\_^]^bgkkiiowcTMMQTSMGCEKRWZ\bnzn_SJGIKJF@>COar~ʻ~xm]NGIUfv~}}}ype\Y]hu~s_K>:?GOTVW\ckpnicaj|˻weYUUTQLFCELSWVTSZjzjZPMNQOIA;;DScovyzŸ|l[MHNZgpvy{|n`XYaluzzz{r^NECEHHIKR]iqrlc\^j~Ƹwjc_[SJC@CKTYWRMNYmvdYTUWUND<;@LYchjnvƾxgYRRX_dhjqzue[Z_gmpppu|k^UOLGB=>GTcnpkbZZapº|uofZLA=AJSXVPIIQatoc^]]YQF>=BKUZ\]akyqe_^_`^]_gtykb_bfgfdfmzvlf`WL?65=M]gjf^YY_is}þsbPB>BKSUQKFHO\juzokid\RGBCIQUVTSXcs·xqnmjd]XYbqyoighfb\Y\fv~zwqdSA529FU^`]YX[`ehkq~ømYJDFLQQLHFIQZbgmuzumaTJFHOUVSNMQ]lyƻ{{zul`VU\jy{urqpjbWQS]m}taL<57AKRUTTW]cec__h{̾~hXOMNNLGCDJRZ]^^cpxhYMILRWWRLIMWdovyy{ƿvh\VYcpy}}zxy{{ui[QNUaozs^L@@IUbjjd[UXeyƷtle\QE<9?IT[[WRS]nydWQQUVRMHHMV`eedelx}pe_`eikjijq|wi]WX^cfgjq}qe\VQKC:7:EUckjc\X\hwʼypcSC97>JUZYTRU^n~k^XVURLECFOY`b_]_gvymfceiifb`cmz|ofbcdda^_gv}rkfc]SF:36AQ`hjea`dlvƿ|lYF:7=CNY__[XZdrĻ~sjefikic\Z^iw|tonomg_XW`pwqnnmgZJ;35@O[bdccgmtxz}ùs]J>;@FKMMMQZfpvz|vndXJ>8:COY][VUZesúymffjnmh_XW]iv}}xuvxysh]TT]m~xporutl]K=7:CMTX[^dmuzyvu|̼t`OFDEFEDDIS`krsru}zkYG:6IXemomlqlUC::AJOQOOS[enrrsw½}qmossof^Z]clqqnlov{n`XX^fmrv|xsuz~{qcVMJIIFB@DN^mvwrlip˵~ric\RF:46@P^fhfejv~eQEADGIIHJQ\flmjgju|wwxvpg`]ahnpmhfir}}qf`^adeego|z{|sg^XVTOF=79CScmokfflxŶ~zul^L<33LY`b`_bju~ǿ{jTB76?CFFFJR_my}thYI=8=JXcfd^\^fpx|~xlgjrwxtlfejqwxuollpuunbVOQ\m~vomqusjZK?:GUerxzx{~lXE:9ANY__]\`fmrsst|skkpvwtmhgkrwwrkgipwzvl^TPUamw~sprvwqeWKEDEFC@>BM\iqrnlp~Ծuh_XRJ@749FWgpsstzoXF<=DLSUVX]emqqmjmxuopstqlgfjrxxtlfejt{}wk`YW\chmqxvtwxvnbWPNNMHA:9?L\ionkkq¯wpke[M?307EUbilmr|u^LCBDGHILS^jrtoieiv|vusoic`cluzyridelu||vmeabdeecelz|z{yri_XVWWTLA97>KZfkkjlt̺yvupeUC505AOY`cgo|kYOJFB><@JYhrupieitztlaYX^hsyxqhdfmuyytmjjlnke^\bpyod[XY]_ZQD;9@KX`degmxƻ{yz|xl[H:59AJQUYam}tg]TJ?516CUfprnhglwĸwi\ST\hrvsmhgkrvwsnkmqvuodZW]l~zl`XX]bb\PE>>ENUYZ]cn|ʿyz{n]LA>@DFHIP\m}tk^N=0+2ASbjkihkr|ĸxfXRU^iopmijnswvqkgjqy|xnaXX`n|xh]Z]bd`WLECGLPQPPVbqdz~xj[PJHGD@=@K\pucM9-,5CQ\`beksz~vcXV[bghgfipwzxqhcdlv|{sh^[^gqx}tf`adeaYPJILPPMHEIUeuȰ|pe]XVQI@86>Nbsw`I925=FMRW^hs|~{vtzÿrfaaccb`agq{{rhabisyysjc`chlnoszrljjgaXPLNRUSLC>@JYhswy{­~skgfc]QC627EVeouzoYH?=?ABDJUds|}xplq}ûvqmic]Z]gt~}shbcjqtrlgdeilkgegr{xtlaVOOSXYSI?9;ER]dgio{ϾuqprpgXF837ANW_dmyzhZQLF@;:AOaqzztlimxƼ|rf[W[ft~tlhimpojecdjnokc]_izrcWQRW\\UJ@:;BKRUVZcqǿzvx{zqbPB;;AGLOS]mynf^RF:48DWhsvrmknu~n_WXboz~|vqoprqld^^bjqrlc[Yap}l]UUZ^^WMD??DIJIHKUdwɸ|}yl\OGEEFDBDL\qyreSA42:IZflmklpv|~~~Ļ~j]Y]gqvvtstxzwpf]Y^gptqh^Z]gt{j^Z\_^YQIEFILJFA@FUgxι~tf[TQOLE>9=I\ryhR?54=JU]adipx~{vv~~la^bgkllnszzobZZ`jqrme_^clty||mdba`ZRKHINRQKB<=FUft|ӽznd^\\YQF;6:GYm{lWE;:?FLPU\gt~yss|qheedb`agq}|ob\]ckomhcbekprrqt|tmjf_VLGGMTXUMC<>GUblsxðujcabd`WI<69ETcowr^NDAAAABFQ`q{uu}ö{smibZTT]jyticchlliecekqtrmijs~ytmbTIDFNV[XQHBCKU_eioyɹsgabfhe[MA;=EPZbisudWPKF@:6:FYl{|xy˻~xnbULLUeu}unlmnmic`ahpwwrjegp~scSGCGPXZVOIGKRX\]_esºqfbeijdYMDADJPTW\h{uia\VL@5/3ATgu{{y{;sbRIJTcqxzwtsuvslc\[akuywogdisubQGFKRVUPLKNTXYWTV`qƽqihjkh_UMIKNONLLTd{}tolg]N=0-4CUclpsxɽs_QKOYckoprv|}th]X[dovvqifhoys`SMNQRPKHJOV[ZUNLR`svrqoiaWQPRUTOGCFSg}{xxul\J913DIMQYfuž{neba_\Y[cp~qd\\`fhgdbemu{{wst{zqkf_UI@>CMW[XPGCEO[gowƵrcYVZ_a]RG??GTbmv~o^QJHHGDBEN]p||ĵ}xsmd[TU_n~siccdda\Z\cmvzxsnpy}vj[K?=BLUXTLECFMTY]bm¸zi^\_dd_TIBBHPX^cl{ug]XVSLC<>DMTX[ajw{mc`addcdhq|scWSV]cfecelv{{zlc]XRI@;78BOY]ZSMKPYdmuǸxfVLKPY^\VNIKS_kt|~}xobULIJLLIEEL[n˾|urpme[ROUcszpjggfb\WW^kxxtv}|yxul^L=68AMWZWSQSY_dgjqķ|hWNNSY[XRMLRZbgkoy»xk^TOPQQLD??GXjzzyzxrfXNLSaoz~|xtstrlbXRT]kw~~zuuz||}raM?9IYhsz~ʽ|}~sdVNOXcmrttuy}}wk]SPVamuwvtv|}yzq_NC@CGIHHJPZcge_Z[ezƼ}lb^\YSMHIPYaca\[bqqb[Z]^YPE==DP[dinu»~}n`WTY_eghjoxtdWQS\ekmmnt|{vx{k\QLJIE@=@IUafe]VT[jþtnh_TJDEMX`b^XUZgy|lcbcc]SIBAFNUY[^ft¿vjb`acc`^`htyj^WW[`babfo{{wysha\WOE;57AO[a`YRPVbqĸwiXJCDLW^^YTRWbqxpmlh_TKGINSTRPR[k~ƽzrnnnke]X[esxlc^^_]ZVV]jz|zxsoleXH:23=JUYWQNOU^gnuȼt`OGGNVZXTPQWaksy~zulaVNMQVXUOJJSct´|xxzztj^WXanz~wojhgd^UNLSar~~{z{zseR@64:DLONLLPV]`acjyo\PNQTUSOMPXahklowtfYRRV\\WOHGMZiu|Ĺ~|~re[Y_isxxtqpqrneXMGKWft|~}}}z}tbN@:<@DEDDGNW^_\YYdxǻo`YWVSNIHMV`ghfdhtp`VSW]_[SKGJS_hnpt|ý|{nc^_fmppnmpvzzrcTJHO[fnrtx}y{q`QHDDC@<;>GS]a^XSVcxĻuke_WNFBEOZdge`_fto_XX\^\VNIJPX_cdflx~wlecfjkifehpz~teWONT[adgktyw{}pcYSPKD<54;HV_b]WSXdvƿxpfYK@>DP\dea^_gvte^]^\WPJINU[^][]fu|skhilmjd^^do{wj_YX[]\[\bn}yx|yofa_[SH;219FT^`]YX]hu|o^L@318EQY\[Z]dnv}ŻwcPB>CLTXXX[cny»|slbVJBAGPY\ZTQS^m~Ǿxngfkqsog]WXalvzxsonopmdZQOVeu|skhimok_O@66BFGGIOYgqwvrrzʶxfYRONLHEGO]lw|{yzycPC@ENTVSONR[fosv{»|nhiotuog_]`fkmjggks{~xl^SPT^gnruz~qjjouvqeXMHFGEB==BO^krrnko|ųuib]XOE>=EScpuust{t]NGIMQQNKMS\eijiluxppsvuohcbglnlfa`fpz{qdZVX]acdhp}xposwxrh^WSROI@748DTbjjgeitytneWH<9?M\gllloxm]USRQMHHLU_ffc_`jz}{|zunhfjptslc]]dox{wmd^]^_]ZX\gw~yy{|xqha__^YN@4/3?MX]]\^eq~¼~q_L>:?JU\`adlw|of`ZRIDELXbfd^YZcrvmhjpw{xod^^entuqjecdec\TOQ]nzphdehibUE702:DLOPQWamw~ʾlXIABHNQSU[eszqeWIAAIV`ec]XX_kwynhjrz~{sibbgmqpkgegkmi`TKKSctrifinpk_O@87:@CCCFNZhrwwy̺|iXNKKKJGHN[kzxeRD@EOZ``\XX^gouxztjiow||vmhgjopmgbafmrqi\PKMXeqy}ymhinrqh[MD@AA@<9:BO_kqqps~̷yj`ZVQJC?BM^o{~{dQECIQWYXVX]eloonq{slmrxxuokknrtph`]airvrh\SPT\cimqyxnkmqrmcXPLKJF?625@P_imllrϻzpjf`UI>9>K\kuyz{iUKHKOPONQXbkonigkwxrrttpkhhmtxvoe]\bksvqh_YY\`aaafq{spqroh_WTTUSK@504?O\ehhksözvtqi[K>8;GVdlpsysaUOMKGCDIUblpnhdhsyvtoha_cktyxoe^]bkrsoicacfeb\Y\gwywvslbYUVZ][RE936@LW^adjuúzy{yqbPB;=GR[aflv}nc[SJ@::BQ`knkfditźwlaYX_juyvne`agmpnjeehmnkbYTWcs}ui]UTX^a]SF<8IU\`adjrz|{oc`dkqsqopsxytj^TRWajnjc\Y\dlruwzxh^[\^\UNHFHKKG>76=M`rɱ~sha^^]YPF?AM_txcOB>BHNQTX`kw}xv}rifhjjhfhnw~~wj]TTZbijf`]^djmmklr}zmfca^WOHGJPSQI>65>L]ku|͹znebcfe^RF?AK\mz}hWKFFGFEGMZjx}wv}¸yqmkhb][_iv{nbZY^dgfb__djookeciu~uplg_UJDEKSXVNC;:@LXbjq{µykbaejibVJBCKWdnu}o`VQMGA;;BQdt~|xy̿{wqh]TRWds}zpgbbefe`\\`iptpib`er|zvobSGADLUYWOE@AGOV[^erwibchljbVLGIPX^bhqqhb\TI=43=M`pxzxy}³wiZOMTboxyuokjllhaYVYbmtuof``gr}sbQEBGOUVRKGFJOSSRT]nĶwjfhllf]TOOSWXXX]k~|uqmfYI:13>N^hnptzygWOPYdmqpooquupeZSS[fptqicbfnvz{zzr`PIHMQRNJGINSURLIMZn̹zqoomg^WSUX[YTPPYj}|{uiXE849DOX^bitžudYVZ`egghmt{}xl^TQWajnlgddipuvtqsz~m^URRQNIDDHPVWRICCM^rʴ}xqg]WUY^`]TLIN]qudRD=>CHLOS]k{qgbbcb_^`ht~}qbWSW]cecaaemsvtokmvwkd`\VMD>?GPWWQF?>FTcq{xj]XY^de_TJGKXgv}l\QKJJHECGSdvȽ}vspkc\X\ft~re\Y[^^\XX\eovvqjgkv~xtpi]NB<>GPVTLC==DMW^eo~̿oa[]chg_ULIMV`hovsg_[XSJA<>J[mz||´vi]VXbp|}ulecca\UPOVamuupifiswiWG>>ENRQKC?@EKNPRYh¸|kcbfig`WPNQW[^_cmypkif^RE;:BQanuvwyǺsdYX^jtzyupnnnjaULINZgprnifiq{xeSGCFKNMHCBDIMMIFHSg˽|ojjjg`XSRV[][XV\jwttsm`PB;=GS^fims}qc\^dlpqooquxul]PHIQ]gkjgfiqy}~{yzwdUMKLLID@@ELQQLD@DQf~пytpjbYSSX^a_XRQYi~}xyzxn`OC?BJQVY]eq¾rgcdgigffks{{o_RLMU]cdccfnw|}xsqvwh^XUQKC<;?IRVTLC?DRdw}th\SPT\bd_VPPXhy|~~yn_QHFHKMMMR]n¹umjjhd_[]er}seYTUY]^\[^fqz|uomr|xnhc_WL@87>ITYVOGEITany²{jZPMR[cd`XRSZfs~þym`UOMNNKFCGSfy²~wsrpkbYST^ly~vkb___^ZUTYdq|{tmkpz}vrpni^O@66=ISWUPKKQYbhnum[PNS[``\VTW_iqvzvi^VUUUQI@=AObtŵ{xyzwnaUOR]jvzxsmjjjf_VOOWdr{|xqmnt{~zutuxwpbP@88?IOQOMMRY`ccdjyȾo]SSW[\YUSW^flnnpw½rd\Z\]ZQF=:AP`nx}ö|z}zm^SPV`jpqpnpsuri\QKOYgrwuqoqv|~|vqpu{|q`OB=?DHIGGJQZac`[\ewþpb\[[YTPOS\eklhfit|lb^`caYMB<>GS^flr|Ǿ~{~wi]WX^dggghnu{{reVMLS^hmmmnrz|unmr{{l\PIGGFB?=BLW`b^WTYg{ĻumgbZQKIOZekje`aj{vjfgig_SHBCIPUX[am~¾}qgbbdec`^ait}xk]RPTZ_bbchq|unlr{~sg]WTPI@85:ER\^ZSOR]nôyn`SIGMXbgfa]^gtvqqpkbWOLMQTSQQVbtĿvpopokd]Z^ht|~wlaZXZ[ZXWZbo|}upqw~}tmjgc\PC95:DOVWSONR[fpyö}l\QOS\ceb^]`hr{~{vnd\WWZ\[VPNR^n}¾{z{|zsi`\_hryzungdcb_YSPS]jv~{vtv{zussspgZK@;=DLQQONOU\chkq{Ĺ|j^YZ^bb`]^cjrwz{~tia^_cdb[TPRZfr{}~zpfabhoturnlllkf^VPPWbnvxwuux}|xttwyyrfWKDCFJLLKKOV]accdkyĺ|ngddda^\^cjqtutu||pfbcfhgb[UUYbjquy}~xnhfimpqommostph^VRU\dkoqrty~}xtsw{}yqeYQMMMLJHIMU]bcb`bkyǽwrnjd_[\ahpttrqt|{oigikkga\Z\afjmosz~}volmnonljjmswwsja[Y[`ehiknt{ztrsw{|wof^YWURMIGIPX`ddbadlyú{vnf_\^dkqsrqqu}}rmkllie`^_bgijjkpyzurqrrpmigintxytmfa`acdddfksz}xtrtwzyunhda_\VOJHKRZaddccgnx}tjb_`ekprqqsw~yspolhda`bfijighmu|wtrsttqlhfhmswxuqljiihfcachpx}~{wtsuwwuqmjhgfb\TNKMSZ`cddfkqxyogccgknoopsxyurlgb`beilkihimu~~xtrsuvuqlhgjnsvvtqpoonkgb`bgnuyzxvvwxxvsolkklje^WRPRV[^`bdhnty}|sliijlmmmpu{|unhcbdhlmliijov}|wttuwwuqlijlprsrqqrttrmhcbdiosuvuvxyzxupmlmnnlg`ZVVWZ\]^`dkqvy{|~wronmlkjmqw}~vngeehkmlkjknsx|{vuvxxwtpnmnprrqppruwvrmheegknpqrtwz|{wsomnppokf`][[\[[Z\`fmruvwz{xurnkjkntz}~unjijlmlkklosvxz|{yyzzxurqprsrqooprvxxuplihijkllnrvz}|zvrqqrrqnieba`_]ZYY]binqrsvz}xsnkkmrwz{|}{upnnnmlklnqtvwwxz}}|{yvtttuvtrpnoruwwuqnlkkkjiikoty||zwuttttrnkigfec_[YY\afilmorw}}wqnmoruwxy{{wusqomlmpsuvvuvx}}zxvwxyxvsqpqsuwvtrpoonljhgimrwz{zxxxxwvspmlkkifb^[Z\`cfgikoty~}wsqqsttuvy}}zwtpnmnpsvwvuuw{{yxyz{zxvsrstuvutsrrrqolighkotvxxxyzzzxtqonnnmjfb_]^`acdehlquy|}yvuutsstw{}ytpnopsuvvuvwz}~{yyz{{zwuttuvvutsstttroliijmprtuwxz||zwtrppppmjfcaaabbbceimrvx{}|zxvtsstx|~ytqpqrtuuuvwy{}~{zz{{zxwvvwwwutsstuvuspmkklmopqsux{|{ywtrrrrpmjhfeedcbbceinqtvx{~{xussux{~{vsrrstttuvx{}~~~|{{{zxwvvwxxwutstuwwvtqonmnnnnoqtxz|{ywuttsrpnkjihhgedcdgjnqtux{}yvttvx{}~|xvttsssstvy{}~~~}|{zywvvvwxxwvttuvwwwusrqqponnnprvxzzywvuutsqnmkkkjigfefhjnprtvz~|yvvvxz{}~{ywvtsrrtvy{}~~~|zxvuuvwxxwvuuvwwwvuttssrpomnortwxxxxwwwusqonmmmlkigggikmoqsvy}}zyxxyyz{}}{ywusrrtvy{|}}~}{xvuvvwxwwvvvwwwwvuuuuusqonnoqtuvwwxxxxvtqpoonnmkjiiiklmnpruy}|{zyyyyz|}{yvtssuwy{|}~}zxwvwwwwwvvwxxxwwvvvwvutqpooprstuvwyyyxvtrqpppomlkjkklmmnprvy|~}|{zyyz}|ywutuvxyz{|~}zyxxxxwwwwwxyxxwvvwwwwusrqpqqrsstvxyzyxvtsrrqpomlllllllmnpsvy{}~}{yyy{~~|ywvvwxxyz{}}{zzyxxwwxxyzyxwwwwxxwvtsrrrrqrrsuwyzzyxwuutsqpnnmmmmlllmoqsvxz|~|{zz{}~~{zyxxxxxy{}}||zyxxxxyzzzyxxxxxxwvutsssrqqqsuwyzzyyxxwvtsqpooonnmllmnpqsuwy|~|{{{|}~~|{zyyxxyz|~~}|{yxxyzzzzyyyyyyxwvvuuttsrqqrtvwxyyyyyyxvtsqqppoonmmmnopqstwy|}||||}~~}|{zyyyz{}~}|zyyyzzzzzyyzzzyxwwvvvutsrqrstvwxxyzzzyxvussrqqponnnnoppqrtvy|~~}}||}~}{zyyy{|}~~|{zzzzzzzzzz{zzyxxwwwvutsrrrstuvwxyz{zzxwvutsrqppoooppppqrtvy{}~}||}~|{zzz{|}}~~|{zzzzyyyzz{{{zyyxxxxwvutssstttuvwxzzzzywwvutsrqppppppqqqstvxz|~~}}}}~~}{{z{{{|}~~}|{zzyyyyyz{{{zzyyyyxxwvutttttttuvxyzzzyxxwvutsrqqqqqqqqrstvxy{}~}}}~}|{{{{{||}~~}|{{zyyxxyyz{{{zzzzzyxwwvuuuttttuvwxyzyyyyxwvutsrrrrrrrrstuvwxz|~~~~~~}|||{{{|}~~}}|{zzyxxyzzz{{zzzzzzyxwwvvuutttuvwxxyyyyyyxwvutssssssssstuvwxy{}~~~~}}|||||}~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m27.bin b/applications/SprPoP/assets/packed/MUS/m27.bin deleted file mode 100644 index 7472064..0000000 --- a/applications/SprPoP/assets/packed/MUS/m27.bin +++ /dev/null @@ -1 +0,0 @@ -yl`Y\clty|||uhdeeedgkoqq{}{ytplnrigmnnmkkmplgpqnrvyz}{mmkgfddgltt{xrmlkjhbbib`gfghgghllgoqknpqnkjijmdahda``dffdahibgjjllnpszwz}wusstrniklccfddefhmuvy}~|wtqmlooimtporsqnljhjg`fgedgkpsrqtzsqvsrsrqtzzy~{xtpolbcda__bdhfeglgchhggijmuwv~}~tswvtswz~|}wyzxwvuty{w|{~}~z}zwtronqnjqwspttpligdg_Y^_]Z]afhfglpgflkmlmnrxvyz}~{z~x||{ywwvzyv~v|}{xy}~|~wrurqmkjikednrmlpnmhfeeh\[a`_]aejkikqrhkoopnpqvyu}}}}z~|}xxxx{vxvw|zxvy{~|zy~{orqpojjhihcirpmoonlghfje[bdcabgjmllovojppsqqstywx~y}}}{xyxzxvyt{zxvxy||zx{~rprpqkkjijegqrnoonojjikj_bgfdehjmnnovtkpqssqtuxxwz}}~}xzxzxu}{sz{yvxy{|zyztorqrmlljkegquppqopkkkmnadihgfjloooqwvlprtuquuxwv~~y}|~}xzxzwt~ysz{zvwz|{xz|spsqtmmlkleitwrrsqrlnmonafjkhfknqopszvlrruurutxuu}~y~{{xzx{tuvuz{{uy{~{y|~qssstnplnkenwxqstrqlpmqjbijmghmprnsw{qmsqvrstuyrx}~}{}{~yzxzyr{~ty{~yw|}y|zqvrtqpompghs{xqwusooqnpeeimnglnspovzznqrrurtrwvq}~~}{}|{|yzv{xr~|uy{zz}~x~ysvrtqqnnqgku}xryusprrooefionhmotooy{yorrqsrsqxtr~}}}|}{y{yyu|ws~{vx{{{}x{uwstssooshlv~yryvsrstpogghoqjootpoz|zrrrpsstpxvq}}||}|~}|wyzyt{ys}|wxz~|~~x}~wysrtupotklu}}ryxsstvpnighotmposrmy|{ustoqtupvxr{|{z~~wvyztv{sxzt|~|~z{~~z{{tqwnmu~v~}zy{zsvxoryzt{wuxzyrponoz}y}|~{}zrxsmt|yz}~vquwpnunlt|}rxysvz{somkjpwqqoppisxuronfflmfjpioy|~}~}x{}ywpjnpkhplkt~z}~xyw}yuy}zqomkjswqqnqmlwyxuupjmsqlttpx~~{vtrpv}vurrpkuxwtroghnngmqkq|~ywvtx}zxxyrz~|{rqwyrt{uw~}~y}y~~vz{y~ww{xpnmkmwtponphnwvurrjgnqlktopz~~|{yz~|~w{wry}wt}xw~~}{zvxv{|su|zt{usx}xnmljkvvpompjlxxwuumhntokurpz~}{{}y{ztz~yu~zx~}}zyuw~~uz|rt{ys{trx}xnmmkkwwqporjnzxxwwnipuomwrq{~~}}|}~x}yt{xvyy}}|zy~tx~u|{ru}vszrry~vmmnlnzvrpprjr|yyxwljrvnoxps~~~}}~{~wuv~~uzw|}}{|z|yt|yv~vryrxxpu|}rmnnkt|tsprojy{zzztjnvuluvpx~~}|}}{~{y}ty|u|w}|}zwvv~wy~tt{|qzvqw~|pnonmy{tsptnm|{zzzrjpxsmxuqz}}~|}~~}|~}{~zz{szzuzw|||yvuww|su|{q{tqx{pnpon{|tsquno}|{{{qjqxsmxtpz|}~{}}}}{}}z}zy|ry|t|v||}z~wvvyzut{~qzwpw~qnpqnz~utqupm|}{||tjoxumwvpx}|~|}~~}|z|}y}}vsv~s|~u{}z|zzyy{t}~xzsysuzpt}vnpsouxustulx|}~zllvynrzpt{}}z||}~}}z{~{}~}w}wr{wuwvz{|xuuxx~tv}{q|upy~porrp~vuswpo~}~~tjqzvmyvpy{{~{~|}}|zy{~y}~ust~tyuy~z{{x|v~t{w~txws}qr|zoptrs}vttwnt~~pks{ro{sq|z{}yz}~zy{y}~z~|zw|pv|r}{s|{z|y|y}|y}yv}~t{ytwzu}zx{yq|oq|}px{qw|y|{y|zx}x~yzuy|tvzv{zxy{q|qpz~ru}suy{|xwx|x||wvwtuywyzyy|rysnxts}tty{|xvx~|y{}vwvuuzyy{yx|txtnwur}tr~yz|wvy}}y{uxuuuzyx{yx}uwunvwq}ur}yy|wvy|}z{uyu~vuzzx{yx}uvunvwr}ur}yy|wvy}}y{uxuuuzyx{yx}twtnwvr}tr~yy|wvy~}y{}vwuuuzyy{yy}txsoxus}tsxy{vuy}y||vvvuv|y|zyy}s|qoysu}rt~xzzw|vy}x}xytx|tw|xzxz{s}oq|~qx{pv{x{yxyy}y~xv|~szytx|w}zx|zszns~|q{ypyzx{x|w|{{{yu~{s|xuy|x|zx|xtxnuzq|wpzyx{w}v}z|~{yuzs}wuz{x|zx}xvwnuzq}vp{yx{v~u}z|~zztzs}wv{|y|zx}wwvnvyr}uq|xxzvuy}}zztyt}wu{|z|zx}wwvnvyr}vp|xw{v~u}z|~{ytzs}wuz|y|zx}xvwnu{q}wpzyw{v|v|z|{yu~|s|xuz}y}zx|yuynt|q|xpyzwzw{wz{{}yu}}s{zuy~y~zx|{t{os~~rzzpv{wyxwyv~z~x~xysx}ux~z{y{}tpq{sw|qt~~wxyu}ty|x|{vvvvw}{}{yy}v{soywt~sq}wwzuty~}zzuys}wv{}z|zy}yvxov|r}wpyywzwzwy|{~xv{sy{uy~y{y{|t~pr|sx|pt~}vxyu|sy|y||vvvvw}|~|yy~w{toxxt~sp}}xvzu~t|~z}~{zu{s}xv{~z}zy}zvxou}r}woyyvyvyvx|{}yv|~rz{vzz{y||u|os~szzpu~{vxxvyu~z}x}yytx~vx~{{y{~uqq{uw}qs}~wwyu}sy|x||vvuvw~|~{yz~w|spzwv~rq|wvyt~r~y|y{}vwuww}}~|zy~x{tpyyu~sp~|wvyts}~y~|yzuyt~ww}}}|zy~yyuoxzt~tp|}wvyt~s|~z~}zzuzt~xw|}||zy~yyuoxzt~tp}}wvyts}~y~|yzvyu~ww}}}|zy~xztpyyu~sp~|wvyts~y|y{~vxuwx}}~|zzx|spzxv~rq|vvxt}sy|y||wwvwx~||yzxrq{vx}qr|~vvwtzsz|x}yzux~vy{{y{~w}ps~tz{ou~{uwvvwv|{~~xw}tz{vz{{y}}wzous|xoxyuxuyuy~{|~{yv}t|yw{~|~zy~{xxov}t}voy~xuxt{ty~z}}{zw}u}yw|~|~zy~{zwow}t}uoz}wuws{s{~z~|zzw|u}yw|~}}zy~{{vpx|u}to||wuws|s|~z~|zzw{u}xw}~}}zy~{{vpx|t}uo{}wuws{tz~z~}{zw|u}yw|~|~zy~|zwow}t}voz}xuwtzty~{}~{yw~u|zw{~|~{y}|yxov~t|wox~ytvtxux~{|~~|yxu{{w{|{y}~y{ouu{you~{uvuuxu}{|x~z|vy~wz||y{y~qr}vy|pr|~uuvs{sz{y|}yxwxy~}}zzzsqzyv}rp~|vtvs~~s}z|zzx|v}yx|~}~zy~|{wow~u|voy~ytvtxvw||}}yy~vz}wz||y|y}ps~vz{os|}uuuszszzy|}zyxxy~}}zz{tpz{v}sp}|wtvs{s{~z~|{zx~v}zx|~}{y~}{xovu|vnx~ytvswuw~||}}yyv{|x{|{y}~z{ptvzyou~|uutuxu~{{y~{|xyxz||y{zqr|xx{pr|uuus{szzy|~zzxxy~}}zz{rq{zw|qp|vtur~|s~zzy|z{xyy~~}zz{spz{w}rp~|vtur}}s|~z{y{z|wyy}~~zz|~upy|v}so||wtur{~s{~z~{z{z}w~zy}~~~zy|~upy|v|so||wtur|}s|~z{y{z|xyy}~~zz|tpz{w|rp~|vtur}|s}~zzy|z|xyy~}~zz{sqzzw|rp|vtur~|s~zzy|{{yyz~}}y{{rr|yxsh^fqtjjou}vnjh`hmilkf_hyvrmkvurrplaaliilnhgoumnyss{}sqldnnkljb^k|rgd]`kgegebW\gehkkehqtikrjiouqgnkafllb^abalmb^]bccsuuwulgq~zzzvvtpyvib_caapqqsqgdp~~{}pu{vwwtmouuilpggntngojdjqphgklmzyollrqs}qlv}x~ws|xw}ypwpimroeceeeqoe``fegvwxyvkhs}y{y|y~zy|}|~yx}||vow~v|uoz~xssqv~zos{wxzxpqwymnrihntoeliafllcadfeqtjeejllz}}~{pjsx{u~{qvwzvms~{yumlkkxyvywtigrpprrkioskfmhchppfhlcdkpidfjipzrkilqnywlp{y|~tyur{zwzom{~v|ymiifowsuuslclpmopmgjqpfjlefnsmgojejqphgkmmzzqmlrrt~smvx~ys~rt~wxwlo|zu}sjhgfrurutricnomoplgmrnfmkeiqtljrjhntqjkoorzropvty}qoy}zvtyqw~uyrjt{vw}nhheiutsusoegqnnppjjpsjioignutkpqimsvolnqpzxrptwuxnty}{szrs|xwwlm}|~zt|ujggepurutrjdnpnprnintqhoniltxpnvnlrxtnosrv}ursyv}}qq{|{~tuuqzzvxnly~}|tzxlhhenwsuvtmenroqspknusjnpjltysovqmrxwoossuwssyw{spy~z~vs~vqy{vyokx}}uzzmiigowtvwunfnsprtqloutkoqkmuztpwrnsywppttvwssyx|~rpz}z}us~~}tr{{wynm{~}v|ymjihqxuwxungqtqstqmqwtkqqlpw{tryqpuzwqqutywsuzx|pq|{{|ru}}}}ru~xyvlq}zxtljikwxvyxtjkussuupouxpmtomszzrvxpsx{tqsuu{uswyyvnuy|wqz||{xqxwzslw~x{rlkioywxzxsiowstvuoqwwnptnov|ysyvquzzsruvvzusyy{tow~y|uq}{|zx}|rpv{xt}|y~z|xqnjowtuwvqku}}z}~wuvuvwqpuux|pmv{yv|sqlqyuvxvrkt~~}{tvzyqoqqr}~upotuvzoipywpslep~xyru~{mhhflxwy||xpw~{|u}{{qjhgkvvwzzwou~~~~|xuxzx|qhmvxprnfm{}xwvonmp|~}}uu~}|~}|pqz~vutil{z{ws{ukiiitzy}}|ur}us|}y{qp~}wssrz{t}{~y}z|~{{z{{|}wuzz{{ohoxvoqjeoy{twrlkjo{|}|swwz}txxutuyv}zx}|w{~|zx|}wwxw{xsswv{~vjhpwrnphft}{|u{~rmmlt~}{s{~~x~{u~~wvuxvy{{zx}xw|{~~wy}yuvwv~{tqtwv{qgluwpqnfm~|~yxxpnnp|~~vv~~yzvyzwvuzv}y}~w{zvy}zyv{{uuwvzwrrwu{~vjirxspqiix~}x~soooxzu~}}~{xxv|wvu}|u}~y|wz{vx~zzvz}vuwvxxsrwvzxliqxuprkivy~uppov{u|}}~{x~xv|wvu||v}~y|wz{vx~zzvz}vuwwyxsswv{xljryuqrkjxzuqpox{u~|}}zx~ww|wvu~|v}y}w{zvy}{yw{|vvww{wstxw~~vkltysrrjm|~{}tqpp{xv~}|}wz~~|tzywuwxy{{{x|xw}{~~wy~zvwxx|vsvxy|qjoxxrsois|}xrqot}uz|~~~}~|v|}~xt~xvuzw|z|zz}wx~{|wzywxxy{utxx{zpkrywrsmjv|wrqpv|u||}~|~zv}|~wu}xvu{~w}~z}y{|wy{|x{ywxxz{utxx|zokrywrsmkw|wrqpv|u||}~|~~{u||}wt~xvuzw|{|{z}xy|}x{zwxyy|vtxy{|rkqyxrtojt}ysqpt~vz|~~}}}~}uy||yszyvuwyy||z|z|}||}}}y{~~{qs{~ywvosxtss}zw~{z~}z~~|||~}~zz~~~sry~zwxqryutsz|w~{~{}{}|}|~~{z~~vqv}|wxspz|vuswxz}}}{}|}~|}~|y|{rt{}xwvquxvuu}{x|{~~|~}|}~~zz~urx}zvxss~zvvty~x|~|~||}}}}|~{z}xrv|{wxurz|wvuwyz~}}}{~}}~~|~|y|zru{|wxvrx~xwuv~zy~~~}~{}~}|~}z{}ssz|xwwsvywvv||x}~~}{~}}|}~zz~~usy|ywxtuzwwv{}x}~~}{~~}|}~zz~vsx|ywxtu~{xwvz}y|~}}|~~}|}{z~vsx|zwxuu}{xwvz~y|~}~|}}|}{z}wsx|zwxuu}{xxvz}y|}}~|~}|~{z}vsx|ywxuv~{yxw{}y|}}~|~}|~~zz~vtx{ywxuv{yxw{}y|}}~|}|~z{~~uty{xwxuwzyxx||y||}~|~~}}}z{}{tv{|xxwtxzxwx~zz~|~}vvy{}u~{wvw}y~y}{tnotx}}pvu|yzsw{}{wxyzzz}y}ys}w}~|ztzyszsqr|z~}}xussvx~wx~wz{wxxyxz~zvsuuyzulyrz}ty|~~}xuv{|~~{y|yz{~||trr|yzw{~{t~}kvyzzywvvvytv}}{~v|tvwy}u{x}wkz}x~}y|yw|xtttvvnzzq|{tvsu|}uloux~xvtgq||{zzxnqyz|wivso|upspvuryxttjn~rgorfhlvxhkonvtm~qr}qoroxnlttw{quvfnpilgiu}~}tz|stmdyylo|srsowqmrprvksyq}|qnehy|}wuy{w~{r~klwnnomyonusvxipngwytwru{|wmdr}|zrznvvqkhtopwstwjsxq|xlmjqwsgkmhnnpxikxrrsr{}sqwsrxnqskz}uxqoz|iinkqmbswwsnkgr}omvut{povityqrnpxsv{tsmarwu}{zpr}tjpqnvonvju}tqkky{jnwtyzo{}vks|yqx~zuq{zruiivmx|sslm||tvxnpqi{yggtnott}pirsr{stxnx{uvnm|y~ot{v{ylwzfgwqmibj}}wzsnsimrkz~xxml}z}lpvpvumqvsnhcoy~{w~z{pqmgwwstlp}znuyquoj~tiuzzsmu~{u}}qx||}q|tsxqnfmyqwwpwonznwyqsmnrzikpjt{uxhn~z|wms~}xqyvt{nptp}|miy~tgovlqmfxqv{utnn}u~qs|vz{myjfsqw}||yywppq{ttwvy{mjz|{qv~nr}myugr|tpirt{tjvssugo~}wsz~wzvo|{gyqg{~wyprmr|uqrkvrhkmkqu|to}|kot}x{{}mpvxqm|~~fnrolpmnpfh}jzsixuq~y{tm|~|~~}qt|zxq~x|~}qsmZlyzpv~qoumpvc\wsr|y~w|ynnuvzt{wxmatvqo~~s~zqo{lntbccftrkdjrrryqfjus{zpdlnz}xw~{nffnyvstmg`lruokzmhyyvn^`nol~||or||mtqt~rz}qz}rvwjgs|xoo`]skkwflyyz{xunqjr|~~}zs}~{|u}xyx~rqs_`q{|{~}skszxudeeitqlmqrx{zzytzq{oh|{{vxzpo{ztj^ox~usmnkptnymi~zs}|x~uoutnl{{~x~~xqyzwst~~{xtbmomvpjtwu|lZjumvxw~}yuzqy|xw~nu~{wz}~wytil|kyvihegsxnmz|~z~pimsv{squvpn~uywxpkqw{~ru|wukl}yi_rwvwccqv{qjz~w{z}vw}|t~wrqzu~onrnlz|vuq{hjzpwtzgcjv}y|ycq~v~{}nyo|sv}yru~nouzwoimqrty}}xcgqmuw{gkrsp}vw}uu{}{~nvxws{|rkslktswqxtm|bhedux}xzqmmux{clsort|yuzx{rs}q}shuwmdo~jwkago}ykvvkedpyiuxuwksvfdpsnme|r{x{y~zhyh~|phdlt~{wnX`u~`atjojjx~zez{yt~uw{gxrmwp~xybkqtwjyw}yjh^_}~zgv{pqjq~nWwwzxsxutzt~nyppk}gfy~lu{v|q^`fv}zmziicglwqqt{mWzzvukx~vmoqvtcsxuxhgu|v}v~zqcixib~ujoij}zeuzw{}q~or{zfwr}ptfktvxsp}wok_cxwu{plhm}y]Yxxu}|}~~n}u}xrn}p~}owgr|vispcepu{u_spfc]l}s|ytmw~r_nvv{ttv~pzu{oj}s{oumf\mtqm}l`o}~uYoysxuh}wik~xpwzkw}^nsiwjztioi`w»}w}oMV_XWXLayzwnsQ^vigmVNdfgkjjwp|r|tmVH^b`_z|j{oQ^cZ\`U[mlbdrUk|cb{woridwupfmoVmxhHQgb`cXTok_a{hazlzz{~thormqcaupljbXtr^Vjpsxrg{xoppfgh_dupzu{pooUbjebbZ^noqulxo_pqoqlh~w~vqsxqu}zk|~trmZengjmtZn|s_^lkh^WXkorrrstvvmpt}}wt}xxqllwyzxomw~}virxvt~xe[noipvbjyxsx~`pzmTZh^^d_[oqsp{s^y~t_izxxylo~|~tho~ww|tq{y~qyly}|jv{ss}phrommfT_nmmp|k|uhgqjff_Xefmijqdywdgwqfihbwz~}sr~{|zwnpzxsslm}z}w}hswnmm_e{{tqjgunb^jgfro]lxvtqydqxl[_icenkbu|}|whzmv~yxvpx~up{xz}uuz{|vsthv|xytiu{|xlpzrjnmjg_Udnnln|qz|wjhqjgkdXhqtlwxlzoy{kirkl~~~{w|p~}y~ugwynqthq|~s}qovnjlgcxztpxubqrk^cjiruedyzys}rk{rkgljipsisvzp{uq}yswzt}wtv~yx~ynzz~|pxpyxttqs~{|t{qmuelohfeYbqpqsuv|rntmjng[mwupv|ruxvimwpm~|{{v|vr}~qr}rltrivr}ppskjpkl|uvu{pevskdlpstpgp~zys}oowtognmmuul{yutvx|sr}zq}z}y~}x|}pr|v~tz}wwypw{pz|wx{mykotifiaaqruvzpxnrpkmk_kytuuv~|wrjoxtn}|}|}w|}rr}}vvxpmuvjvx~urtlltspxv{uuqgvunhoyupsmr~{{u}olzyqjrpowxq~~stvwuxquxm~~|zz|~xz|qn~uyx~}xq{ry|yu}txoqujfkhbpuz~|pzrsskjkflxuxu{zqnoqwypx}z~{{}vpx|zvsnrxqr|zqsqms|soy{{rwmnytpp}ynsvpy}|yuxiuwnotrs{yv}ut~w|vwvt|}pr|~twyw}xws}x|{vxynu{x|}}ztt}w~|}{z|~}}}rv{uqnznlurqqzxzukuvwsx{zvsz|tvzqoww~{}rrwuogjjmuxx{~zo|~{qrqjwvst~zos{vu~}vxpsxrpuspvztxslqryouzsljmnpplhw}}|otxrprlhljfuvrsxw|tuzst~zvwpgltmoxxzxz}mjtspuvnuzxx}rx|yz|{w|ury{y}ww|yx~xigmjpwwvsxns}zqntst{~{}{~|z}zzxz~{|wuzztttq|{z}yy{|wtxywxv}|x{qnquolqtnt}xrju|vssuomqqqywxy}{|zvy|u{zy|u|~~}s~|z|yz{zzwnoxx{y{|}{vswsfkuyvtyqz}zz}|kfqsnx{{wwxruquyuxx{~{x}~ssxuxyuxzw~~uxysqswv}uq}{}}suqpstrnqwrttqrw~zwvwrosxutwz}}~{}{z|z{}{}u||zu|{~{yxz}wutlovy{|y~}~{zvtunfqzyvvyu|}~shnyur{||vyxxystzzv~yu}z}vpw{v{~}vu||~}yrxvrty{}|xsy~{~upttvturpxxt}uoyx|}ywwvqq{yovz|~|{~}}~|{~}vyw{x~~~z~|}{}x}urtonw{~}wz{ytrojt{yyv{x|zplszwsz|{wxz{~vtw|zyuw|}||sry}v~}}uv~~|~{xrwvux|}wyx|}|sowxvuxssxzx{rs}y{~zwvvrt}vmv}||~||~|~}|{{|xwvz||~{z~{{urtrnv}}x{}|soppsyz{w{{zvpquxzuw{zzw|}xwvy||}}~xv{}}{vsv}z{}~zw|x}{yvsxwy|vx|}}zvps{xvxxvvz~|}st{}x||xvwwtzyqpz}~~~}{}}~w|zy{yxzw{~{~~~{{~~uqttpx~|z}|~}rmqutx|{y|||~rqwwwzwuyzzx}}swx{{}~}~}}zxz{z~xvuw{|~~}{z|w||xwsvy{~ww~{~ztrr{zxyxzwyztw|}{y}zvwxwywsqv}}}{{}zw}wx|x|yxx~||~xvyyy}tsz}y~yszz{}zwz}||xsy|}{~}}xy}|}~~uv|~}{yqw|{{zyx}ztvwyz~{~{{x{|~~{wx{~~|~{}wy~~|~zxy{}xsuu{}~}~~}yyz~~{}xv{|z{}~|xtz~}}}xtxyz|yxy|~||vwy{}~vrx~z{ysz|z||ww|}~xsw}}||~zw{|~ut|}{wpy{}{xzx}wtw{zy}~~zzx{~yvz}}~~|}wt|~~{|yyy|urvy{}}|~||yx|}}ywy~~}{z~}{tx~~}|{wvy|}vvy|}|}}~}zvw|~yuv}}{|~{tx{z|zuy}xut{~|}~}|xx{}wsy~~}~ypw}{~|xzz{xtv||y}~{zy{zv{~{~~|vr}}}{yyzy}trv|z|||~{{zy}~zvx|~}{z~vu}~~~|{zxwx~|svz|~}}}|zvw~zwwz|}}{~uv}~|zzxwy}|tuw}|~}|{xw|~}xvv||~~}tt}}{|}zyz{~ztuy~{}~}~}{y{{xy~}||~|ru}|zwzz{zrsy}z{~}yzy{wuy~}}{|~ux}}~|zxzxyxru|||}{{wyxvz|{}~z~ztx~~}yyxxx|{tuy||~~{zzwz~}wvx|}|~~|uw|~}|z|zzz{~ytuy}}~~~}}~|yz~yyz~~|~}~|tu}~|zwx{{{usv}|~}~{yyz~yuw}~}~|}~ww~|}|{xx{x}|tsw~~}~~|zzy|{vw}}{~}{ut|}~}ywxzy}wuv|{}~~zzyx{{uvz}|}xtz~|}|zyz{{|~vtv{}}~~~|||z|}wx{}}}|~zsw~~|zwxz{yuuw||}~{yxz}zvv|~}~}~~}ww}}||{xw{{||utu}~~|zyz|~|wvz||~|~~xry~}}|wvyz{zvvz}{}yyyzwtx}}}~|sw}|}|yw{|{zsux}{~~}{{{{yuy}~|}~su}~}~{xwyz~|tuw{{~~|zxy~~{vvz~}~}}}vv|}|{{xwy{~|utv{}}{yy}|vvz~|}|~xsx}}||yvyz|~xvw{}{~~yyy|~wty~}}~~xsx}||{ywz|}wsuz}|~}zz{}}wuz~~~{~yrx~}~}zwyy{xtv{|{~~{zxzxvy}}}~|ysz~}|zywyz}wtuz||~}{zy||wuy~~~}{~ysw~}}|{zwxz|wuw{}|~~{xx|}xvx~}~}}xsx|{{ywy|~xtuz}|~~}{yz~|wvz~~{~~xry}}}}yxzy}~vtv|||~~{zy}}ww{}}~}|ut|~}|ywwzz~~ttw||~~~|zyz~xuw}~~{}tv|~}}|zxxy{{tuz}|~~|{xzxwx|~~~|~{sv}~~|zywxz}zutx}{~|zy{~xvx}|}~{tv}~}|{{xyz{~ytuy~|~}zy{~ywy~}}~|~zsw~}}{xwxz|ztty}|~}{zy{~vux~~~|}|tw}}||{ywzy{ytu{~|~~{{yz~xuy}}~~|~zsv}~}}zywxz|{uux|{~|zyz~~xvx}~|~|tv|~}}{zyyz{~zttx|}~~}|y{ywx}~}~|}~tu|}|zvwy{|vtv}|~|zyy~zuv{~~~~}~wu{~||{zxwzz}~vuv}~}~}{zz|{vv{~}}|wsx~}}}zxwy{}yuvz||~}|zy|~vvy~~|~{sw}}}|{yxzz|yttx}|~}|zzyvy}~~||ut{~~~|zwvyz~}vuv{}}~~{yy||wuz~~}}~xux~}||zxwy{|~xtuz~~~|zy|~wvx~}|~|sv|~}||ywxz|{vux|{~|{yzyux|~~}~ut|~|}{zwx{{|utv||~}{{z~zvw}~||~vty~}~}zxwyz}~wtw{}}~~|yy||wvy~}~|wuz~~|{zwwy{~~xtu{}~}{zy}|vvz~~~|~ysw}}}|{yvyz}xvvz}|~{zy|}wuy~~~}ytw~~|}zywy|}ytuy}}~|zz|}wvy~{~~ysw}~}}|xwxz|~ytuz|||zx{~wvy}~~~|~ysx~}}|zxvyz}xuuz}}xla`fjkqw{|xth_\]^^clpqt}zsporuxtlilpljkkfcbgmnstu|}ylc_`_`empou~yqkebefilfbbgjhjjidadimlmlkmloqrl`]cedc`_[[]]a`ZZ]egjsyzx{}ztnjgfegbZY\acgpvuuy~~zxwqifhmmllijkkoqrh_bhjiiiffhjmpmiinstx~}~|~~{{{y{{xmdejihfc`]_`cf`\]aghov{yx|{tv|}||zxvwyz}wstw|||yxy}}z|}zzysmjlqpomjllmoonc\_efddb_^`cfieabhlot||{~}zy}|y}{yusqqvy}~vtswvrrqmfcfjkkighijlnnd\^egfgedcdhjokfgjpqu}~|~}{}}~|wz}{wtrnnrtxzuppstqppnfcdgkjihgjjmppka_fjjjihefikppjikqsv|~~}}~}wwz{vtqnmnsvzyrpqtsppojdbfkkkjhjkmprqgacjlklkihjmpspkkotuy~~|}}}||vx|zvsqomptvzvqpqurqqojddilmlkikmortqgcgnnonlkjloruolnrww}}|~~~|~xvy{xtromnquyztpqttrqqmgdflnnnlloosuvoeflopponlmprvupnqvwz~{{~||~|vw{zvtqonpuw{xrqsvtrsqkgfkoopmlnoruwtifjpqqqommoruwqnpuxz~{{~~}ww|{wtrpnpux|ztrtxuttrmggkoqponoqsvxulgjpqrqpompruxspptyy}{z}~|xx||yvsqpquy|{trtwvuutniilqrqqnpqtwxwmhlqrrrqnnprvwsopuxz~{z~~~yy}}xvsqprwz~{utvywuvtniinrrsqprsvxzvlimrrsrpooqtwxrpqvyz}z{}x{~|yvtrrvy}yutxyvwvsmilqtssqqstwzyrjjqsstrqnpsuxupprxy}~|}~yvy~~|~{tv{}||zxvwz|{vux|}}{z{}x{zwutvxxqmsz~zvuwy}{usu{{||~|tuyywvtqnpruwplkotty}~}{~}yxz{~|usuz||}~woossrqnljknqsojknstx~~{y{|yyx{}}utwyvtronpty~zxz~zz}}|xtqoptw}}xvx}zz~}}}zwxy{}xrpswwy~~{xy~}zzz|ywz}{zwuuu{}~~ywzyy~||zyz~~}{}xuwzyvtqopty~}yz~{y{~z{~|zy}{vw{}|~wsw{||zxutvx{{urquxx}{y{~{xxy{~{uuz{xvtrqtz}}|}}yx|~~~|}~xuw|~~~{{}}{qpuyxwvtqrsvywqnostvz~|ww{~yyyy}zux||zxvttx}~||xy}{~~}~|wux|~~|yz|}vopuxwvtrppsuxtnmotuw|~{wx}|zzy|yx{~|zyvuvz~~zxz||}}}~xuvz}}}zy{|~{qnrvwvtspprtwwqmnstvz}}xx{|{{{}xy~~|{xwvy~~|xy}~z}~}}~zuuy}}}{yz{}}soqvwwvsqpqtvwrnnruvz~~zyz|{|{yz~~{ywvy}~}xx|y|~}}|}{utx|}}{yz{}}topuvwvsqprtvxsonquvz~~{y{}||}zz~~|zxwy~~|xx|}y{}}||~zuuy}~}{yz{}}sorvwwvtqpstwxsoosvw{~{z|}|}}z{~|zxwz~~|wx}|x|~||||~}xuv{~~}{z{|zqpswwwvsqqtvywroquwy}}zz~}}}}z|}{ywx|~ywy~xy~}{}}{}~~}wux}~|zz|}wpqvxxwusqruwyupprvw{}z|}}~|{~}{xxy}~}xwz~}xz~|{|{{~~}|vux}~}z{|~vprvxxwusqsvyzuqptwx||z}}~~|{}zywz~~|ww{~|wy~|{}{z}~}~|wux}~}z{|~wqrwyxxvsrsvyzvqpswx|}{}}~~}{~~|yxy~~}xvz~vprx}~zz}~|zxvtsu{x~}yxvux|~|w{~wz}}|}}|ywvy||}||z}z{|{zwvwz}}yx{vz}~|}~}~~}|}zxy|~}{{xvvtsrrv}|st}{vrstv}}|~}~|{yvtru||x{xwuw{~{x~|wz}||}}{xvv{{}}|{{~~y||{yxwy{}|xx{vy|~|{}~}~~~|~{z{}~|{}{xwvusrsw}|ss||wsstv}~}~}{yvtsu|}w~|ywvw{~~~~zw~}wy|||}~{xvw|{}}|{||y}}{zyy{|}{wy{vw{}{{~~~~~}|~||}~}z{~}~ywwvtsruz~zru}|xttuy~|}|{yustyzy{ywvy|~}}}|xy{wy{|}~~zwwzz}|{~~}zy~~}{zz{|}|ww}wux{{z|~~}{~}}~}zz|~~zwwwussty~|trz~zutux~~{}}|zvttx|x}yxwy{}}||{xx|wxz{|~{ww{z~}|~~}|yy~~}{z{|}}{vw}xuwzzy|~~}|~~~}yz{}~|xwwwvssvz|ss{~{vuuy|{~|}|zvtv{zx}zxwz|}|{{zwzzwxy{}~~zxy~}z~}}}|zy|~~|{{|}~}yuy}vuxyxy~~~~}{~}zx}}{}}ywwxwusuy}~wqw~}yvuw}}z~|}}{xuvz}w||ywy{||zzzxx~~xvwy|}}yy|z}~|~}{zyy}~~|{|~~}{vv|zuuxxw{~}|||xx|{|{wvwxwutw{~}uqx~}ywvy|z~}|}}{xvx{|w}|zxz||{yyxwy~}wvvy{}}zz}z}}|zyyz}}~|{}~}zuu|{uuwwwz~~}||}xw}{|{xvwxwvtw{~~vqv~~zxwx|y~~}{|}|yww{~xz~{xz|||yxxxx|yvuwz||z||z~~}zyyy}}||~~{|~|wsywtvwwx}~~|||~~zvz{{{yvvwxwvvy|{srz}zxw{zy~|{|}{ywy||w|~{x{||{wwxxy}~xvuwz||{~{z~|yyyz~}|{~~~{}~{vsy~wtvwvx}~~|||~~zvz|{|yvuwwwvvy||tqy}zywz{y~|{||{zwy|}w{{x{||{wwxxy}}wvuvy||{}|{~|yyzz~}||~~~{~}{usz}vtwwvx}~}|}}}yv{{|{xuvwwxvwz}{ss{|zyw|~yz~~{z|{{yxz}{x~zy|||yvwxxz~zvuuwz~~{}z}~zxyz|}|{}~|}~|xsv}ytvwvvz||}~~{vx|{|yvuvwxwwy|}ury~~zzwzzy~|z|{{zxz|}w}{x{||yvwxxz}{vutwy}|}z~}~zxyz|}|{|}~|}~|xrv}ytvwvvz~||}~~~{uy{{|yuuvvxwwy||trz}zzw{yy~~{z|{|zyz}{x~yy|||xvwxy{~yvuuwz~~|}~z~|xxz{~}|{|}|}{ury}wtwwvw|~||}}~}xu}~z|zwtvvwxwy{~~xqv}~{zxx{x~~|z{{{{yz|~w{|x{||zvvxyz||vvtvx|~}}~{|}zxyz|}|{{|}}||yrt|{uuwvvy~||}~~~|vw|{|yvtvvxwwy{~vqx~~{{xzzx~~|z{{{{yz|}w|{x|||yvvxyz}{vutvx|~}}z}}~zxyz|}|{{|}}||yrt|{uuwvvx~~||}~~~|vv~}z|zvtvvwxwy{~~xqw~~{{xy|w~~|z{{{|yz|xz}x{|}zwuxyz|~}wvtuwz~}~}z~~{xxz{~|{z{||}{urx~xtwwvv{~}{}~~}zty{{{xutvvxwxz|}trz}{{w{yx~~|y{{|{y{|~w||x|}|yvvxyz||vvtuw{~~}~|{~{xyz|~|{z{|||{try~wuwwvw{~}{}~~}zty{{{xutvvxxxy|}uqy~~{{x{zw~|y{{{|z{|~w{|x|}}yvuxy{||vvtuw{~~}~|{}{xy{|~|{z{|||zsrz}wuwwvw|~|{}~}}yt{{|{xttvvyxxz}|rs{}{{w}ofb^\^elw|y|~zqf_^]\]djrz|xwtuttpjjhggkqusuyxuuqlt~~qottpljflsy~{tsoha\RS\dea]]```bhlssrsuxvkgotsmjefklkgdccbcce`__`bdiprrz}{vnglqsokikkklrw}~~yyzzz{xvxwspiafnttolnlhcbdeijlmoqmehrxxwuqw}~zzy{yvuuvtkirxzxvpprqkfcegfghieefjosx|zy~zz}|}}|w{||zzsr|}~xs{~yuvxyywumihhjmqusptwvuunjpvvnfceeb]_`eikotyyphntvuwutxxvrqu{z}~||}y~|tpppollllnnpsxyrimvyxzzx||ztnjjlpsuqkkjklqwxqopnkjhemuyvpmprsqqrswwy}}xxy{|xsqqrx|upsttsspuzvtponpmjhfginpjeijhed`cjnkfbbehlnohddglq|xw~~|vrpsvtllprqrrow~~ywxwusttnjeehmuzxy|woid[]gnng`^]]\]cdghjntz|xz}|}yz~~zxx|xvqmuzzxsmlotxvtuy|zrw}wqklnnlheedfimpmlgeeiptsw}|zsu||{{{{|{~}ut~z|~}}zvv{}xz~zrjnuzyvrqnkfehhkhdachibcowxvvrswvtstwutwxyuuwyzz}}|rov|zxxx}{~~}zzyqpy~}tquvrnnrsrqmkfdefffjqsqvy{yvmkrwvplmpmheilrx{xpt{yzzyvuwzz{~}z{{|uvz}wqorrohggjprvwvtninv{}y{}yphgmruttusutux{~{rrutstuqu|~{y|~{uswy|{}|ytruy|utssuwxtnqvvuwxw||tstwurooqooqvzwkglommnmsvvqmnrvzzvrmnnqv|x||xssuz|shkrvuvvx{wutw{}ujiilqxzwrmgcjtxtmgiklkihhnsvy~~|{vvz~~|wtuz~|xrr}|yrmlrvvuvy{}x}{xyrotwvoifgkqu{wqmlnosz~~}upz~{~~|wy{|zv}}||~yz~~yy||zux|zz{}vrsx{{wz}{~||wy~ysytkihfelt|xy{{{xssu{|~~|zxwxrqnihkt|||}xuy}~~}rv|~{tnquvvwuvzzz|~|ullu~}~yrprqrttustrlinwztojjsvwvx{||~{qijnttv~tz{z}{{{z|wpsw}|yxwqnmrvw{~wrpsy~{z~zpdfpyxvvz{vstuttuzyss|}|xrqu|~~~}uouwvvxwvyxtrruzyvrqokjmt}~}z{|xyzxzy}{|}~zyxy|~vmq{}}|{|vtsw{ytqmqw{xqoqrsmfehqtuyww|}}|wvuy~|~~z{ztqw||xx~yttuywty|}|{}~}yw{{tmhlpu{{wqpqpnqy|y~{upmv|zz|~xwwx|}|~|zx||z}~}}zy||www{|uvsnuxssuvy{tpmnpquwuux|~{vnpywrvz~{uorx}}wst~{{}{{~}{~|~z{z|vx{y{wwtty~{zyy}~zrjhltz{pjmv~zqqqporv||y}{tpw|z~|tprx~~}~}}|x||qptz~{vpmqt{~yww||upw~{vsqssontw|}}{upvxrty}}zvpu}wuwzz}wt|}{~|}}ux|y}|}zvuy||}{}}vpqx{vy}|z{}{|~xssuy{|{{|{vsnmrwz|yuuw|||~}zz|}vuw|~rr|{uyz}|y~~|{~~{xwvsuz}{zuw~||ysssw}{|zyvoqvy{{z}yqjjqsx||y||||}yyy}{z|}|||zz}vwy|w|{vxz{snqv{|nrz||~~~|ummpuz{vvwyxttx~ztuw|~{}ywyyz{|y}~~~ut~}wttz{{yxy{~yyxtsr{|vxy{|xuruvssxwu~}wsrzzxy|sptuy~|wz~~~}w{}}{{~}~}|zz}~yyy}}zzztv~~{wzxnjntw}xlis}wxxxxtx{z}|{wv}|sosyz~}{}~~}~}}|~~zsw}zuos}~{uutvzzyxz~|xv|{wxyzunptx}~tpuxxv{{xrs|wvz{y|ztx|}|~~|xy~wv{}|~|zz{z{z{~vqu|}~~yy{{{|wszzx|{~|}||yqry|uuuty}wu{}~~|{}}|~|}wv}~}u}~yy|wx|}vw||~{z~~utxzusuww~|uw}~|~}{z~}|{z|}~{zzst|yy~{yv{}}{}{yxz~~~{v}||rsvz{rw{zwwx~~{y|~|}zxz}z~{~yx{{tx{x{~}{sqw}{~~|}zxww~}upx~}vqt{~~}|{~z}yyz}{wy}{z~}|y{~~~zvvtw}{vv{~{z~}qu}}uvuuy{xyz~xx~{z}zwz~{}{||y}|zz}y~wtvvxwqt~}~{|yz~~wsuwwzztu|}{|{|}{}}zyz{wz{tv|~||uruy{rqz||}}|{vuz{{{wrtw|xwww{zwyz|{~{z}~|z{z~~{|}}~||}xwv||st~|uqv}}~|z}~~yxvwytvxy}{vyzzz|~yy~zv{~yy|w{}y}{ysw{|xsuy~zz~~z||}xsuzwwz~~ywzwuz{y~~~|}~z~xou~yy{xux~{pq{}}~|z~~zzy|~|utw}}{z}zy}}z{x{~}|xuw}z|xwuv{|ysu||}}{|zvuz}{|z{~~uu~|w}}|}ytz}wv~vrt|vs}~yttz}zyvu{vrt{}{~~}|~}|{}|~wtx~~{{z|}y~}wsu|~rnv}}}||~zsrx{{wsu{}|}|}|zyy|~}~~~|y{yz}~}tz}|~{~}zuu|{zyyy}{uz{vvz|yyxvv|wsu}y|~~~~~|yz~~zz}xqv~|{|vuv{zuu~ztrvx}yuuv{{zwtw~zxz{~|{|yz}wy~{|yssz~xv||wvy}yy~}}}~yuty~}yxyvw}~xsx|||~~}y|}}}|}{||yx}}|~~~~~{ww~~|xuw}}xwx|}|}|{}vuv{yxxv|{wz|{vx}~zzy||wx~uqv||~|xw|xrtzw|~|xtx~xuxxy}xy~{x{{|z|~xrry~ww{}{zxz{~~xqt|}}~zusv}}}zzxuv{~xy{|}}{yyzxy}zwy|zyuqyzsux~||}yrwxuw|}y{~{z}|}~{yz|vux|~{vx~~w{{vuyxopz{xx}}zwsy}~{uux~~~|vtx}~}~~~}zvy~|wxz|~ww|xqvxtwz}xps{{z}|ww{{vvz~}{|~||~}}}{}~}yvx|~~y{}yxz~~}zx{zrqv{~{|}}{zxx{~~~xuv||{||}}yy~~~|xzvu{~{{}trw|~}{~|}|vtzvt{|usv{}{}~yvyyuv|}|zz~|{|{}}|}}}zww{~y|}{{{|{}}unr{}zxy~|{xx{}{zwuy~yz{}~{z{|{}~~yz|{|vsxz~}zwu{}}~~{zyyx{ytxz{~{trw}}zxyyxx~xvzzz|~}~z{~||upry}tpw~~{}~zvu{~uqsy|~{zz|{wxx|zzyw{|z|~|}|{z}}{|utz{vst{{xwx{~}}}yw|{{|}xuy}}uv|}{}{wtz|wwzz{}uv~|{{~|zzz{}~yustzxtv~~~|xx}{xx{||}|}wqry~}~{wyz}}yux~}z}~|~|}~{rryyvvvyzsqw}}}zz}|{|}xw{~~~y~~|yy}~zz{zwy|{}z{zuw{{vsvwzywx}}}|{{|{xx{}~zz~~~}wty}z|yvx~{{xvvz~z|zsuytsy|{utvz}{~~{z}~yx{~~}|y{{vw{{{~~|~wsv~}}}}~{yxx||snt{~yuv|~~}{{{}}|xww|~}}~{yy|~||~{|}}~|uuux}}zxxz}~}zsu|}uuwx{yuux~}yy{|yy{{xz}||~|~~|z|{y~}trtw{|srz~}{xy|~{squxz~xvy~zzy{|}{xx{~yx|}wvx|~}|{stx~~ztqw{zzy{zyz~~|~~|utx|}vvxz|~{vtw~z{{z{~zx{|}~~~}xwwy}zytt|{tuz|y}|||zxyx{}urtx{{|{z{|{m_Z^cehkpyxnd^YV[bfjqy~wwwxuuwuqjbagknooolifdirw{yvzyqmnljebejqw~|qie`]^cjmmllh`Y[cnsrolmnnllmomkkligedb^]]]^`cd_[Y\fnty}~~~tlgdeilpqoia]\`is}~~|vquz}}zxwtpiiljihjmmkf_aglonifiorpqv{~xpou}~}{rmouwtpppnlhghjhcbcbaadfhnruwxz}{yy}zsry}}~~xrtz{xvtw{}zywxyxwuwzxwxzz{}tpoqrmklmllloqnf^`dddegjllhefkqwyvsponpx}}{z|~}ywxz}|tmmswvwy|~|xtrsy}{qhdcfkqwywsomic^\bjnnkhhhigcacjqtuxzyst|||~|vsv|~}|ytpt|}vollopopsuuspmkmmmppmkllic`_afkoqlgcccdiquvvwvsploy{{{}|||~|z{|{zx{}}vnklotuvyxskhgglswwsmhdegknmhdehjiijorsuuroorvwtqty~}zxvx~yx|}{|~yvwxvsty}}xrprrrqrsrssrsqlhc`bhorruz{vqnihjnswxsmkjjnryzvsmms||}}}|{y{|{}~}smrwyzzzxrmgfintwtpljgcgow||zyvqjefjnmnpsuutsrrqpqqqqrstrruz|wvw|{{~{wrqty||{xvusrplklnpqqrttqsz~|vqprrmjmoqrstwwsjfilnqtutttrrsw{}}{{yurt{|}~}zyyyz{xrllpsux||{|~|wrpt{{uokhjntz~|vuurmkijmrtssttspjhjqwz~{x{~{yz|~~ystx~~~zwvx|ztrrrpmoux{{zytolmrtuuuvtoieejotwuroonlmsz}||~|wsqt}xvy}|zywy}{urpptw{||yromkkpy~}xrnmnprronmopqsutsuy{zvsuz|vux}}vsvz~~zwy~|~~}}}}~z|zxyz{zwx{|xuussvyyvtssvz{zsjeejoty}~ztminw~zvutssuy}|wsrw}yuuy~~}wusolloqu}}~~{uonty|~{z|}}}|z{{yurnmtzztporsuz~|x||unkkmosw|}~ztpqw|}xtrolnu|yxvrooqtuvuvxxxtniimqqrvxxuttw{||}~zvxz}}{tsstx|~{vphfjqx|{yx{|{{}~}}zwtssuvwwsqnmlnrx}}}}xvy~}yww{|xy|{wx{~{z{~{wrpqstspnopppnkmt{~}~}~{y{~|vux~zux||vstw|~~~|z|{xy{~}yxwttuwupkklpsuusrqrrsu{ytprxz~~{yy~~~~}{z{}||{}~|{~}zz|vonnqw|~}zuqollortuwvutuvvw{|zzxtru{{vwy||y{{tsvyxru}~}{zyy|~~~~{xurruwxyzyyyunjimqu{~{xtrrux{zvsstuz}{yxz~|zz||{yyz}}|z}|{}}xvx||usuvwxz{xtpnpv~{vttttx}}}|zupmqvwuuww{~~||~|xvtstw{|xvuw|}|y{~}zxsqty||zwuwz{zxvvz~~{yxvw{|~zrmmry~wronptz{vrpsy}~~~~}}}|||ztprx}~xsppqsyysqu|zzywuux{}|{|{xvtttsttsuwxwtppv~}{xy~|{}~~{||xy|{wuuwyz{|~}|||}~}zwwxxvw}{wwxwvvxyvrljnrwyxutvyyy|yssy}~~zyy|{y}~}}|}~{y{}~~|zzzz{~~|{{z|~xrnmou{~|zyxvtpmosy|||}~}zz|~ysu{|xvvx}|zy{~~|~}}}}{wvvz|wvx|~~}|{{yy|~~}|zvqqsv{~}zuqnoqt{zusv{~|yyyyyz}~{{}}zz{}~zusv{|z|{x{~}|{zy|}wvx|{vtsux{{{xtqpqu|}|{zy{~}zwvvuttvy|}~|z}ztqptz~|zww~}z||zz|{zz|}~|{yvstwyyxwwy|}{wuw{}xxy{}~|wtrsy~yvsprv{}{xvuwy{~~z{~}|}}~~~}}}{z}ysosz~~|z}zvvy}||}~~}xux~~|{|~~}~|wtv{~{urtz~{z|vutuv|{}{xvtvz|~|~zzyxuv{}|{vuttv{|wtrtx|yzyuty|~yx|~{zz{|zy{}}}}|{zyz~~~~~z{~~~~|~yx{|}{vrsv||}}yxxy~zz{|{}~}|wuu{|z}~~~{vsux|}}~}||yx{}yuu|~yvtuvx|z~~|y}}zwvz}|yxwwvtx}~~ywvwz~}}xvtqsz||zvuy||uty~~{y{||}||}{z|{zy~{yz}|}~|{~}xx~~wtvvy~~~~ytuwz|z~}{{~~wvvwvw|}}{xw{~}|}||{xrprwzyz|||}}xz}|wtx~wtsvuy~{|zz~~zzvvz~}zzyzxvy|{zxxy~}|||~}~{yvtv|}xy|yw{~zsrv{~||~~~}zz}}~~|{|}}{|zyzz{~|zz~}yy~ytuvy~zuuuv{~z}~{z}~ywwwvx}zwx~{zzxrnquyy{~~~xvx~}xv|ytrsssz||wz||~}{wz~|yzzzuux{~{yuuw}~}~|}~{zvtu{|y|{xx{|}~zsrw~~}~~~~|z{}}~~~|zyxy{z|}}}zz~zvxwz~}xttsv|~|}yx{zyyyxz~|wux~}}~~~z{zxrpsx|{~~~}ww{{uu{}}wtsttx~}zx|}}|xx{}|xxyyvuxy}~zyutv{~~}{yurryzz{wvyz|~}vtx~}|}||||}~~~~|zx|{z{}|~}}~xx|}zvwtx~~~xuutx~~|~}xx|~zyyxvx}|xvz~~|~|}|xqptz{{~}|}{xy}|wsx|}|wuuvu{z}z|~~}{yux{}zxyzzwyz|{{yuvz~~}}}||~{xsswzw|}xvy{}~xsvz~}~}||}|~}~}|~}{xz}{{}|~}||}xw||xuutx~zwwtx~{z}zz}|yxxvvy~}yx|~}~}|}zunptyy{~||}zwx}{vu{}zwuvtu|z}z}|}}|xvz~~zz{|zwzz|||wuw|||}}}|}~|xtty~xx}}yxz{}~}urv|~~}~{|}|~}~~|x}|z{|z}}|}~yy}}~xuvuyywusv}{{zy|}zyxww{}yx||~~}{|zvoosxz|~}~zvw{~ytx|~{wuuttz~|~~y{||}{wy|~|z{{{vxyy~}|yttw}}}}~~~}}~{urt{|x{{xyyz{~{tty~~|}}{}}~}zx~|{||{~}~xy||~ywvtyxwusv}||~yx|~|zyxwz}ywz~}~~~{|{xqpsy{{~}~|xx{~ysvy|}xvvvty~~}z{}}~}xwz}|yz{|xwyx|||vtuz}~~~|~}xsrw~yx|~yxyyz{ytv{~~}{~}~}~~{xx~}}~|}~~|wyy|xvtty~~yxutw{{}yz}~|zxvvz|yx||~}}|wppsyy{||}|xw{}}xsvy|}ywxutz}}}~{|}}~{vx{}{y{}}xyyx}~}|vtw|~~~~~}|{~|vstz}wx||yzyzz}~vtw}~}}}}||~~|zw|}~}{~~}}~yxyzywusx}zyvsu|{{}{y|~}zyvvz}zy}~{~~}}{wporxy{||~{wvz{}xtwy}|ywwtty{~~~~z|||~{xz|~{{|~|xzxx}}~zutx}~}}~}{|{usv}zvy|zzyyzztuz~|}||{~{xz~}~z|~}}~|yzy}|xwtv||xwrsx}|||yz~|zwvz~zy{{}~~~}}|wqosxy{}|~{wvy{}xuwy}|ywwtty{~~z||}{y{}}{{|~{xywx}}}xttx}~~}~}{~xsrw}ywz{yyxy{xuw|}|}|||}zx{~~~}{~~}}zyyy~~{yvtx|zxvrt{||}{y||zww{}yy}~{~~~~|wqptxy||{~{wvy{|wtwy~|zxxtuy{~~}~{}|}{yz|}{{}~{xyww|}}zutx|~~}{|zuru|{vx}|qf]_bbejov~ytpmmllmmliho~{vssusg`egfb`bcehkmrv{vja[Y]emqs|{unhdejlgclttld^XUTW[_bdgiiggjkntzuhbdec`][Z[_bdegkoty|}ysr{{xwxywrkfa^`elpqt~|}vmg`[Y[^acgihgfgggnwypgeilmlmnpquwxx{~~y{|}~zz|~wmhlqplmrvuqmlllossokgdejotvu{}wttw{}{zyxz}tu{xsuxwqprw~}xsssvy|{z}}sptxtonrsstuxz{~zsi^\dihfipttrrsuwy|{wsmjlqv{||yxx|vuyzuqrtx~~{vrljjlortsw|~tkkpqkgilnqstx{}~ztk`Y]fhfgov{{z||}}vpnprvxwz}}}x|{usstz|xrmhddgjnssv{~~wmjnrohghhknopstvy{yupf`clqonsw{{xyxx{~|wqorux{z{{tuxuomnpv{zwqmihjkknnotvwrieimmhgjknpqruwy|~yshabkqonsw|~|~}{tpsvz}~~~}}{|}|vwzwqpqrwzxtnjgfikkopsy{{vlhkooiilnrtvwz}~ysgackqooty}vqttwyy{}z{|~~}}}z}{usssxywrkfceijmrtx|}|vmknqpkkkmqrttvwz}~{xrhgluwtuy|~}|{~}zsrvwyzz~~z{z|~~wvzxsoppsyzxsnjhjllnpqvxxunhjmpnlooruvuwy{~{xnfgnvvtvy}~yrtwxz{}|yyx{|z{||~}xy|ztrrrvzyvqlhgkmmqsv|~~yqlmprnoqquyyy{}{wnefovusvyzstvvwwy}xxxy}|z||~z}yvutwzyuokfeilnsuz{soostqprpsvvvwxz~~zwpjkt{zwxz~ysuwwxxzzxxwz}{}~~~|}{vx|{vrqquz{ytpkhjmnqsu{}|xplmpsqqttuxyxyz||ysjiqyzxwy}|uuwxyy{|yxvx}xxz{|}{{~|~~xx|~{vtstyzyuqlhiloruv|~wqnpssqtvvy||}}{woimvyywx|zuvvvvv{|wwww|{xz{}~rhhmuy~{z||yzzutvutwy{}~yrpqqpnnv}{wsooopx|tkcadhloty}~zy}|uuz~~}{xvvw|{slmrvwrommswwurlgfgknqru{}ztnlmqssv{{{~|}~{zywx|wqjcehlopsxzxtu{~{~upsvxvrolntusroighlptxzxusuxxy}~{~~|{zzxrqpot|{xtroqvwtqtx~xskhjoqqsvyxtqt{|~|~}yx}}zsoorw{|yy|}}}z||xxvutsw~{tmkjiltz|}zwusrsy{yuvzzuoklquuvy{zvrsyzz|zzutvz~}zz}{xy~~xttrqqqv}}vnkkiksy{|zwvutuz}zvx|}wpkkptssuwvroqxyx}~|{wwy}|{~{yz}}xssqooptzyrkijjmu{}}zwutsuxzwuw|~xsnmrtssuvuqnqw~yy~zvwz~}}~zz|~{vttrpqsw|wpkjjkow}~~zwwvwy|}ywz{uqnqvxwwyyvqpt{yvy|}}zwz||{}|xz||xtstrpsw{xqlklmrz~~}xwwwy{}|yx|zsonqtuttvurnot}}wvx}|~|yw{~|||}yz}}xuttqoswz}unkkmot|}xuuuwyyyww{{tqpruvtuvtqnot|}wwz~~{xwz}||}}yz~}yvuusqswz~vokklosz~yvwwz||{zx{|tqpsvyxxzwtppu{|vuy}}~|}{ywz|{z{~yy}zuuutrsy}}tnlmosx~zvvxz}}|zzz~wqprtvwuwvronry~xtvz~~}~}|{yxy|~{{}}xz~xuvusquz~~vollnsw}}wtuvy{zxxw{|tpqtuwvvwtqnou}{vuz}}~~~ywwz||z{{y||wvwvtsx||tmllotx|xvwz}}zzz~zsqtvwzyzzvrorxyuvz~~{||~}xvwz}yx{~~yx}{vvvutu{|tnmnqv{zvvx{{zz{xqptuvwwxvroot||vsvz}|{}~|yvvy|}yy|~z|}z{zyx{{sqqsy~{xx{~~z{{~vrsvuwwxxtomov~vrswz~{vx|}z{~~}xrpswz~}xvy}~|{{|{zy{}uppqw}}zy|}|}xstxwxyzzwropv~vrrvz}{vvz}}|zz~~}ytqrwy|}xuw|~|{~{{{yy{wqqrv}}zy{~|}xrrvvuvxxupnpvwqquxz~|vvz}~|{{~~|xtpsxz~~yvx|~}|~{{{yx{|upprw~|ywy|y{ysswvuuxxtpmpvwqrvz}|xw|~}~{wsosx{}yvy}~}|~||{xy}ysoorx|yx|}{}~wsuxxwx{yupotz|sptx|~yvv|~}{|}yvrpuy{}zxv{~~~}}~}{{zx{xspptz{yy}|{~|uruwvtvyvropu|{rpswz|}~~yww|~}|~|xurpuz}}zyw{~~~~~}|{ywz~}vqoot{zxw{{y}}vsuvvtuxurnpv}|squy|~zyy~~}xtrpty}}zyx{~}|~~~}|{zwy~}vqonry}yx|~z|xuuwxvvyxtqqv|}upsx|~~zxw{~~}|~ytspsw|}yyxz}~{|}~~||zxx~ztqoqw~~zyz|{zuuuvvsvwtposzxqquy|||}|zxy|}}}|usrrv{{zzz{~}{|~}|{ywy{tqont{|xx{}z|xuuuvttvurpqw~}vqtx|~}}|{z|~ytrqsw|~zzz{}~{z|~}|zxw{xspnou|}yz}~{~xvwwxuvwvrqsy{tqty|~}}|zzy{~~}}~xsrrsw||yyz|}|zy|}}|zxy~~xsqopw|y{~}|{wvuuvtuuspqu|yrquy||{{~{{zz|}}}|urrsuz{z{||~|zz}}}{xwzytqpos{}yx{~~{|zwvuvttttqpsy|vrtx|~}|~||||}~~xsqrtw}|zz}}}{yx{}}|yxy}ztqpoqx}z|}}|yxvvvvvusqty}wssw{~~{|z{{||}}}ztqrtvz~{yy|~}}yxy~}}|zxz~}urqpqw}{|~~~{yxuuuutsqpsy}wtsvz}}zz~yz||||~|}ztqsuw{{zz}~}zxy~}}|yxz}{sqpprw~}{{}~~~|zyvututrpptz|wuuw|~~{||x{}~~}~ztqsvw|}zzz~{xvy}||{yx{~xqppqsy~}~~{{zvuvwtrqrw~zvvvx|~~z|yw{}~~~}|~~xsqtvx|zxy{zwvz{||zyz}wqpqru{~~~|{{yusturpory~xvvvx|}|y{xvz~~~~||~~xsquxz~zxy{{xvz{{{zxy}vpppsv{~~~}}}|~|{|yvsturoosy~xwxxy}~{|xvz~}|~ysquxz}zxy||xvy{{{zyy}xpopsvz}~}{}{xtuwtposyyvxyy|~~|{~xux}}|{}zuqswy{{vx{}xvw}{z{zyy}|soprvy~}|~{||yurutpnpv}{vvxxy|}|z{{uuz~|{||xsrvy{~xwy}|wvyzzzyx{~wpoqux{~~}z{|{|{xssusonry}yvyzz{~~}|}xuw}~||~{wrswz}}ww{~zvw{~}zzzyy|~uooqvy|~{|||}|ytuvsoot||wvy{z|~~}|~~vtw}}{{~~zvrsw{|zuw{}yvx|~|yyyxz~|topswz~}{}~{||zvrttqmpw~yvwzzz{}||{{uuy|{||yusuy}~xvy~}xwy~zyxxx{~wqoquy}~~zz}|{|{ytstsons{{xwy||{}~~}}wuw}~|{~}zwttw|~{vw|~~zwx|~{yxxxz~zsooty}~|z|}|}}{wtutqnry{wvx|}||}~~}xtuz~{z|}{xutv{~{wvz~~{xx{}ywwwz~{upoty}~|z{}{||{wsssqnqy{vvx{}{{|}~}yuvz{z|}{yvuv{{wvz~~|yy||ywvwz~zupoty~{yz}||{{wtrrqnqyzvvy|~}||~~yvv{{{}|zxwuv|zwv{}}{yz|~|xvuw|}xtppu{{y{}|}||{xusrqpt}xod^]`diryvpic`efffiotzztoifdeilprpokdba]_eltvx}yrke`[VTVX^hx~yuwwtqmg`ZXZ`flkebdhlnkhgghffkoqrqnid`^\afilkhfjkjhjpssqrvxz~~||unhdbb_^^]\[]`enzzwvx|{smmoppmhfffddinqqrpmifeejquxywuwyxvuz}|yxy{{}}{xvx}}{{ywwxxpifejquqkgdabdddefebcfjpy~}~}{~|xwwy}~{{|}|~zywsoqw{{wsmjhefkppnlmmllmolfbaemttokheehjiijkhfhkpw}~~||}}}}|~}uqqmhgjpuxyuplgcb``bhllihkkjlnojecektzvrnkjknnmmonjilpu}{}||~}}|{|~}~xpnmiddiosvvrlhdaa``cjmmjjmmmoqqmhgjpy}ytpnmorqqprqmknsy}z~}{|~}}{{|~}}~|unlkgcdjpuwvqkgdbbabflnnklooprtrnjjnu}zuqoorsrrrtqllpv|zy|{}~}|zz|}}~zqlkiecgmsvwtmheccccejopnknqqrttrnkmrzzuqpqttsrttplntz}y{|{|~~}{yz}}}~{tmkifcekqvwvpifdddefjorqnostuwwurnosy}xsqruvutuvsnntz~yy~}{{~~{zy|~}woljhefkrwyyskgeefghkprroosvwxxwtpptyytqqtvustusnmsy}yx|}{||zy|}xqlkhfglsxzyskfeffijmqssppsvwxxvtqquzztqruvustusonsz|yx|}{||zy}}wqljhginuyzyrieffhkmorutqrvyzzywurtw}xsqsuvutuusoov}zxx}|{~|zz~|wqlkiilqx{|yqifghkmoqtvtrrwz{{ywutuy~~wsqstuttuuropw}yxx|}|~|zz}xrljijmrx||yqiegiloqrtvussw{|{xwvuvzxsqstuututspqw}yxx|{wokkmrux~}{zz||sjdeglqvz~xtsssrppnmkinu|}ytpqqsy~}zwvusqpoptwz~||}~}~~~|wtsuspoqrqtw{{xuux}|xtmhghjnty|{voiilpuy}~|utuwwvvttvwvtssuwz||xwxxwy|~{wuvy~|ytnllnrv|xqmnrvz~}}}~~}}{zyx|{wuutw{|{{zyz}~}}}ztqruxxyxwxz{ywuuwy{}~~ztrrvy}zroquy}ywwvwwvutsrrv}|wroonnruvwxvwy|}|||ytstx{{|{yz}}zxvvwy|}}{~}wtvz}zspsw{zussrssrqpoopu}}wsnmmmnruvwxwx{~~}}|yuvx|~~}{{|~zxvvx{}~z{{vvy|~vqqty}~~}}vrrqqqrqonnoryytpnnnnqtwxyyy{~~}|xwx|}||}zwvwy|~zx{~xvx|yspsx|~}~~xsrqqqrqpoopsxzuqnnooptwxz{{{~}|ywx|~|{~~{wvvx{}~zwy~yvx|ztqrw|}~ytrpppqqpoortx{upnoppqsvx{|||}|zyz}}|~{wvvx{}}ywy~yvx|ytqrw|~}}yurpppqqpopsvzztpopqrrtwz|}}}}{zz{~}|~{wuux{~|xvx~~~~xvy}}xsqrx}~~~}yurppqrrpprvy}xrooqsssux{}~~{zyz|~||~~zvuux|}yvvy}~}xwz|wsqtz~~}|xurpoprrppsx{~vqnpqsttux|~~zyz{}||~~zvuux||xvvy}}|xvz~zvsqty~}|yvrpoprrqqty}~wqoprtuuux|~~zyz|~||~zvuux{|xvvx~~}|}yvy}{vtqsx~}|zxtqppssrqty~xroprtvvuw{~{xy|}}|}|wutwz~|xuuw|~}|}}zwx||xusrv|~|{yvrpoqsrqsx}{tooqtvvuvy}}yx{}||~~zvtux|zvuvy}|{~{xwy~}xusqsx~~|xuttvwvwz}vsuwz|{z|~{|~~}yvtvy}zvssty~|yxww{|zwuux}}zvtrrty~~|xutuwwwx||usuxz||z|}z|~~}xutvz~ytrsuy~~{ywwx||ywvvy~|yutrru{~~~{wutuvwwy~yssux{|{z}{z}~~~~{wtuw|}wsstw|}zxwwz}zxvvx|}zvtsstw~~~}yvttuvwx||ustwz||{|}z{~~~}yvtvy~ysrsvz~zxwwx|~{xwwwz}zvttstv|~~~{wttuvwx{}vssvy|}|{~~zz~~}~}zvtvx}ztrsuy}{xwwx{~{xwxxz~~zvttttv{}}~{xustuvx{}vrruy{}|{~~zz}~}}}zwuvx}{trsuy}{xwwx{~{xwxy{}yutttuv{}|}{xustuvx||vrsuy|}||~}zz~~}}|zwuvy~ysrsvz~~zwwwy|}zwwyz|{wtstuvx||}}{xtttuwzytrsvz}}|}|y{}||{yvuwz~wrrtx|}ywwxz}~|ywxz|~zusstvwy}~|||zwtttuw{}xsrswz}}}}{y{}|{{yvvw{~wrruy|}ywwxz}~{ywx{|~~yusstvxz}~~|||{wtssuw|}wsrsvz}~}~{z{}|zzzwvwz~xsrty|}ywwxz|}{ywx{}~zurrtvxz}~|||{yutstw{~xtrsuy|~~~~|zz~~|zzzxwwy}ysrtx|~zwwxz{~}|ywwz}{vsrsuxz|~}{{{zvtssuy~zurrtw{}~~~}zz|}{yzyxwx||vssvz}|ywwy{}~|zxwy|}xtrrtwy{}~}~|{z{yvtstw|}wsrsuy|~~{z{}~|zyyxxxz}zustx|{xwxz{}}{zxwz}|wrqruxz|~}}~|{z{xvtstx}|vsrsvy|~~{z{~~{yyyxxxz~~ytstx|~zxwxz|~~|{ywx{~~zurqsvy{}~}~}{zzzwutsuyytrrtwz}~|zz|}zxyyyxy|{wtsv{~|ywwy{}~|{yxwy||wsqrtwz}~~||zzzywustw}}vsrsux|~~{z{~{yxxyyy{~}xutuy}}zxwy{|~~}{yxwx{}xtqqsvy}~~|~}{yzzxuttv{wsrsuw{}{z{~|ywxxyy{}}yvtux|~{yxxz|}}}{yxwx{}ytqqrvy}~|}}{yyyxvttv{xsrsuwz}{z{~|ywwxzz{~}yvuuy}}{yxy{|}}~}zxwwx{|xtqprvy}~|}}{yyyxvttv|wsrsuwz}~{{||xwwxz{||xvvvz~~~~}{yxy{}}|~|ywwwy}{wsppsw{}|~}zxyyxvtux~}urrtvx{~}z{}~zwvwy{{}~zwwvx{~~}|zyyz|}}|~~{xwwxz~~zurpqtx|}||yxxxxvtuy{urrtvx{~|{{~~zwvwy{|~}ywwwy|}}}|zyyz|}||}~zxvvx{~~yurpqtx}|||yxxxxvuvz|urstvx{~}{|~~zwvvy{}~}ywwxz|}||{zzzz|}|{|~{xvvwz~zurppsw|}|~}zxxxxwvvy}vsstvxz}~{{}{xvvx{}~~zwwxz|~||{{zzz|}}{{}|xvuwz}|vsqprvz}|}{xwwxxvvw|ytrsuwy||{|}ywuvz|~|xwxy{~}|{{{zz{|}|{{~~zwuux{~ytqpqtx}||}zxwwxwvwz}wsstvxz}~||~|xvuw{}~zwwy{}~|{{zzz{|}}{z{}yvuvy|}wsqpquy~~|}}yxwwxwwx{|vssuwx{~}||{xvux{~}yvwy|}}{zzzz{{|}|{z||xuuvz~|vrqqrvz}|~{ywvwxwwy}zussuwy{}|}}zwuvy}~{wwy{}|zzzz{{|}}{zz}~zvtux|ytqpqtx}~|}~zxwwxxxx|}xtsuwyz}~|}{xvux{~|xwxz}}zyyz{{|}}|zz{{wttvz{urpqsv{||~{ywvwxxy{~yuttvxz}}}|yvuwz~|xvwz}~{yyz{||}}|{z}}rkgfgilptywohc_\[\airz}vropsrrpopoljgfecbeiqwz~xog`]\]`dioty{ria]]_bfggd_ZWWY[_fkoqqrsvxwtplihhjmopnkgdb^\ZZ[]`chow~~~~{xuqnlheb^]^`dhlptvy|}uojgggjnprsrrstuurnkhilosuvusqpmkjhijlorv||zyy{}~{{{}{vrmihikmmmllkjiihgfdbbdgkoruvwy{~~{ywutuwy{~zxvvwyz|~||}~}{yvrpliijmprrpmiea_`behjkklllklllkjhgilpsvxxxyz~}{zz{}~zwvuuvxz{}~|ywvuwy{{zxvutqnkifdcegknomkgc`^`bfjmnoopppppponlklorvxyyyyz}}}~zxvuuvwxz{}~|ywtsstvxxxusrqomjgecbdfjmonlieb`adhloqrrssrrssrqonnpswy{zyyz|~}~|xvutuvwxy{}~|yvtrrruwxxvtrqpnkhgdcdfimopolhebbdhlpsttuuuuuuttrpoqsvy{|{zz{}~}~~ywuuuuvwyz|~}{xusrrtvxxwusrqomjhfedfhkoqrplhecdgkptvwwwwwwwvvusrqrux{}|{zz|~}}~|xvuutuvwyz|~~~}zvtrqrtwxyxusrqomjhgffhjnqsspmifegjnsvxyyyyxxxwwvtsrtwz}~}{{{}}|}~zwuuuuvwxy{}~~|yusrrtwyzyxusrqomkigghjmpstsplhfgimrvyzzzzzyyxxwvtstvy|~~|{{|~~||}|xvuuuvwxyz|~~{xusstwy{{ywusrqoljihijmpsuurnjggimqvy{|{{{zzyyxwuttux{~~}|{{}~|{|~}xvuuvvwxz{}~|yvtsuwz{|{yvtsrpmkjijkmptvvtplihimqvy|||||{{zyxwvutux{}~|{{}~~|{|~}xvvvvwxyz{}}zvttvy|}}|zwutrpnmkjklnqtwwuqlihjnrwz|}}}|{{zyxwvuuvx{~}|{{}~~}|{|~|xvvvwxyz{|~}zwuuwz}~~}zxvtsqomlklnpsvwwupliikotx|~~~}||{zyxwvuuvy|~~}{{{}~}}|ywwx{~}|zxwvvx{{xwxz{|}~~zupmkkmqv||xtqommnqu{~{xvwy{}}|{zxwutssssux}|{{{|{zywwz~~{xvvuvwxxvqmhghkpuy|}~}}{zyxvusrqqrtuvtrpooqsvy{}~~}|{xvtrqqsv{~~}xussssstuvxz{}~}|zz{~{urrux|~|zywvtrqpqrtvwvusrsux{~~{xvtstvz}zyyy{~~|zxvuuux}zupnmnoqrsuwy|~}{|~~{{~~|{zz{|~}{zz|~~{xvtuvy}{xvuvwy|}}~|zwutqponorv{zuqnmnoqsuwy{}}|~~}~~~~zwuuuw{~{xutttvy{}|zz{}}zxvtrqonmnpsx~~ytqooqsuvxz|~}}~|}}zwuuvx|}zvtsstvy{}}zxyz|~~{ywusrponnoqu{~ytqpqrtvxz|~~~~}}~}{||yvtuvy}~|xusrstvy{}|yxy{}}{ywusrponoptx~}xtqqrtvxz|}~~}}}{{}~zwutux{~}zvtrrsuxz|~}zxxz|~|zxvtsqpoopsw|{vsrrtvxz|~~~~}||}{z{{wutuwz~}zwtsrsuwz|~~{yxz|}{ywutrqppqsw||wtsstvy{|~~}||{|~{zz}{xutuwz}~{wtsrsuxz|~|yyz}~|ywutsqqqqtw||xtsstwy{}~~~}|{{|~~{yz}{wutuw{~}zwtsstvx{}|yy{}~|ywutsqqqrux}|wtssuwy{}}|{{{|~}yyz~}zvttux||yvtstuwz|~~{zz|~{ywutsrqrtw{zvtstvx{}~~|{zz{|~{xy{~~|xvttvz}~|xvtstvx{}~{z{~~{ywutsrrsux|yussuwy{}~~|zzz{}}zxy{~~~|xuttwz~~{xuttuwy|~~{z|~~{ywutsrrsuy}yvttuwy|~}{zzyz|}yxx{~~~|xuttvz~}zwuuvx{~~|{yxwwxz}~zxwxz|~~|yxwwwy{}|yustvy~}{zyyz{}~~|{z{|~{xussuy}}zxvuvx{}}{zxwwxy|{xwxy{}}zxwwwxz|~zwtsux|~|{yyy{|~}|{z{}}zvtstw{|ywvvwy|~|zyxwwx{~~zwwxz|~~|yxwvwy{}|yustvy}}|zyyz{}~}{z{|~|yvtsux|~{xvuvxz}}{zyxwwy{}ywwxz}}{ywwvwy{~{xustwz~}{zyyz|~~|{z{|~~{wussvy}}zwvvwx{~}{zxwwxz}{xwxy{~|zxwvwxz}}zvtsux|~|zyyy{}~}{zz{}|yvtstw{~{xvuvwz}~|zyxwwy{}ywwy{}}{ywvvxy|~~{wtstw{~|{yyyz|~}|zz{}}zvtstvz~|ywvvwy|~|zyxwwy{~zwwxz|~{ywvvwy{~{xtstwz~}{zyyz|~~|{z{}}zwtstvz~|ywvvwy|~|zyxwwy{~zxwxz|}{ywvvwy|~~{wtstw{~|{yyyz|~~|zz{}}zvtstvz~|ywvvwy|~|zyxwxy|}ywwy{}}{ywvvxz|~}zvssux|~|zyyy{}~}{zz{}|xutsux|~{xvuvxz}}{zxwwxz}{xwxy{~|zxwvwx{}|xustvz}}{zyyz|}~|{zz|~~zwussvy}}zwvuwy{~}{yxwwx{~~zxwxz|~~|yxwvwy{}{xtstvz~}{yyyz|~~|zzz|~}zwtstvy}}zwvvwy|~}{yxwwy{~zxwxz|~~{yxwvwy{}~{xtstvz~}{yyyz|~~|zzz|~}zwtssvy}}zwvvwy{~}{yxwwx{~{xwxz|~|zxwvwx{}|xussvy}}{zyyz{}~}{zz{}~{xussux|~{xvuvxz}~|zxwwxz}|yxxy{}}{ywvvxz|~}zvsstx|~|zyyy{|~}{zzz||yvtstvz~|ywvvwy|}{yxwxy{~{xxxz|~~|zxwvwx{}|xussvy}}{zyyz{}}{zz{}~{xusstw{~~{yvvvxz}|zyxwxy|}zxxyz}~{yxwvwy{~~{wtstvz~}{yyyz|~~|{zz{~}zwtssuy|}zxvvvx{~~|zxwwxz~|yxxy{~}zxwvwxz|}yussux|~|zyyy{}}{zz{||xutstw{~~|ywvvwz|}{yxwxy|}zxxy{}}{yxwvwy{~}zvtstw{~|zyyyz|~~|zyz|~|yvtstvz}|zwvvwy|}{yxwxy|~zxxyz|~{yxwvwy{}~{wtstvz~~|{yyyz|~~|zyz{~}yvtstvy}}zwvvwy|~}{yxwxy|~zxxyz|~{yxwwwy{~~zwtstwz~~|zyyyz|~~|zzz|~|yvtstvz}|zwvvwy|}{yxwxy|}zxxy{}}{ywwwxz|~}yvsstx{}{zyyy{}}{zyz|~~{xusstw{~~{ywvvxz}~|zyxxxz~|yxxz|~|zxwwwxz}~{xtssvy}~|{yyyz|~~|{yz{}}zwtssuy|}zxvvwx{~~|zxxxy{{yxyz|~~|zxwwwy{}~{wtssvz~~|{yyyz|~~|zyz{}}yvtssvy}}zxvvwy{~~|zxxxy{{yxyz|~|zxwwwy{}~{wtssvz}~|{yyyz|~~|zyz{}}zvtssuy|}zxvvwx{~~|zyxxy{~{yxyz|~|zxwwwy{}~{xtssuy}~|{yyyz|~~|{zyz|}zwtssux{~~{ywvvxz}}{yxxxz}}zxxz{~}{yxwwxz|~}yvsstw{}{zyyy{}~}{zyz{~|xvsstvz}|zxvvwy|~~|zxxxy|{yxyz|~|zxwwwy{}~{xussuy}~|{yyyz|}~}{zyz|~~{wusstw{~~|ywvvxz|}{zxxxz|~zxxy{}~{yxwwxy{}}zwtssvz}~|zyyyz|~~|zyyz|}z|~vme_[Z\bju|wohb___aeiov|}xrnjhiiiiijieb^\^adinsy|~|tnjgffgikosx}{tojfddefgikmooonmjhjlostvvutqmkhfdbabdgkmppnjea^]^`dhlpuy~}ywvtrojeb_^_adhlpswz|~|wsqqrtuuutqoljhfeddfimqvy|{xtpmllnqtw{~{yy{~}zwsplifeddeefedb``acfjnrvy{}~~~}{zyxy{}zwwxz|~}zwvuttuwxyyxuqmihgilorsssrpnkifdba`abdfggfeddfhlptwz}~}|{z{~}}}~~|yvspnmmmnpqrrpmiebabdhkmopoomkigedbbbdfhjkkjihijmptwz}}|zxxy|~}~}yuromkkjklnopomieb``beilnppponljigeedegikmnmlkkkmpswz}~|zxwvx{}}~{wtqnlkjjkmnoonlieb`acfjmoqqqpomkjhgffgiknoponmlmorux{~~|ywvvwz}}~{xtqnlkjjkmnopomifcabdgknqrsrqpomkjhhhikmpqrqonnnpsvy|~~|ywuuvy}~}~|xuqomkjjkmnpppnjgdbbdgkorsttsrqomlkjjjlnqrssqpopqsvy|}zxvuvx|~}}~zvspnlkklmopqqpmjfdcdgkortuuutsqonlkkklnqsttsqppqsuy{~~{ywuuwz~}}~|yurpnlllmnpqrqolifddfjmqtuvvutsqpnmllmnqsuuusrqqruwz}}{xvuvx{~}}|xuronmlmnpqrsrplifefhkosuwxwwutrponmmnprtvvutrrrtvy|~}zxvuvy|~}}~~zwtqonmmnpqstsrolhffhkoruwxxxwutrponnnprtvwwutsrsux{~~|ywuuwz~~~}}|yusponnnpqsttsqmjhghjnruwyyyxvusqponoprtvwwvusssuwz}|ywuuvy}~~}{zz|~~xrmkklptx}~~ytpliggimsy~}zyxy{}~|zxvtsrrtvy~|xvttvz~}|{{{yvsokgfgjmquxz{zzyxvtrqqqrsuwwwurponoqsuwxyyyxvtqomllnrv{~~}~~zxwxyzz{||}|{zywwwz~}yvuuwz|}{yvtrqppqsuwwvtrqpqruwz|~~}{yvsqppruy}}{zyy{}~|zyz{~zvrppqrtvxz|}}~}|zyyz}~||~~|{z{|~~|zyxy{}|yvsrsux{~}{ywwwy{}~~~{xvtsssux|{vrpooqsuxz|~~|{{|~~~~}}~}}}~zwustvy|}zxvvvwz||{{}}zxusrqqrtw{{vsppprtwy|~}||}~}|}~|{|~{xvttvy|}{xvuuwy{}|zz{}}zxusrqqrtw{|xtrqqsuxz}}}}}|{|}~|z{}}yvutvx|~~{ywuuvxz||zz{|~{yvtrqqrsvz~zvsrrsuxz}~}}}|{{|}|zz{~~{xutuwz}~|zwvuuwy{~}{zz|~}zxutrqrsuy}}yvsssuwz|~~~~|{{{|~}zyy|~}yvutux{~~{ywuuuwy|~|zzz|~~|zwutrrrtwz}yvtttvy{~~~}|{z{|~|yxy|~~~|xvttvy|~}zxvuuvxz||zz{}~|zwutsstvy}|xuttvxz}~}{zz{}}zxxz}~~}~}yvttuwz}~|ywuuuwy{~}{z{}~{ywutstux{~zwuuvwz|~}|{z{|~}zxxy|~~~}}~~zwuttvy|~~|zwvuuwy{~~|{{}~|zwvtttux{{xuuvwz|~}|zzz{}~{xwx{~~}~~}}}~zwuttvy|~~}zxvuvwy{~|{{}}zxvuttvx|{xvuvxz}}{zzz{}}zxwx{~}}}~~}|}}zwtttvy|~|zxvuvwy|~|{|~}zxvutuvy}{xvvwx{}~|{zzz|}|ywwx{~}}}~}||~|xutsuwz}~|zxwwxz|~|{zyz|~{zz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxy{}|yvtssux{~~{yxwwxz}~|zzz{}}zyz{}~|zxxxyz|~~|yvtssvy}}{zxxxy{}~~|zxxy{}|yvsssux|~}{yxwwy{}~|zzz{~}zzz|~~|zxxxyz|~~|yvtssvy}}|zxxxy{}~~|zxxyz}|yvtssux{~~|yxwwxz}~|{zz{}}{zz{}|zxxxxz|}}zwtssux|~|zyxxyz|~~|zyxxz|}zvtsstw{}~|zxwwxz|}{zzz||zz{|}{yxxxy{}~~{xusstwz~}{yxxxy{}}{yxxy{}~{xusstvy|~}{yxwxy{~~|zzz{~}{zz|~~|zxxxyz|}}zwtssux|~|zxxxxz|~~|zyxxz|~}zwtsstwz}~}zxwwxz|}|zzz||zzz|~~{yxxxyz|~~|yvtssvy}}{yxxxy{}~~|zxxyz||yvtssux{~~|zxwwxz}}{zz{}~{zz{}|zyxxxz{}}{xusstw{~~|zyxxxz|~}{yxxy{~~zwusstvz}}{ywwxy|~~|zzz||zz{|~}{yxxxy{}~~|yvsstvz}}{yxwxy{}}{yxxyz}~{xusssvy|~}{yxwxy{~~|{zz|~}{zz|~~{yxxxyz|~~|yvtssvy}}{yxwxy{}~|yxxyz}|xusssuy|~}{yxwwy{}~|{zz|~}{zz|~~{yxxxy{|~~|yvsstvy}}{yxwxy{}}{yxxyz}~{xusstvy|~}{yxwxy{~~|zzz||zz{|~}{yxxxy{}~~{xusstwz~~|zxwwxz|~}{yxxy{}}zwtsstwz}~}zywwxz|}{zz{}~|zz{}|zxxxyz|~}zwtssux|}{yxwxyz|~~|zxxxz|~|yvtssux{~~|zxwwxz}}{zz{~~{zz|~~|zxxxyz|~~|yvtssuy|}{yxwxy{}~~|zxxxz||xvsssux|~~|zxwwy{}~|{zz|~}{zz|~~{zxxxyz|~~|yvtssuy|}{yxwxy{}~~|zxxxz|~|yvtssux{~~|zxwwxz}}{zz{~~{zz|~|zxxxyz|~}zwtssux|}{yxwwxz|~~|zxxxy{~}yvtssuwz}~}zyxwxz|}|{z{}|zz{}}{yxxxz{}~{xusstwz~~|zxwwxy{}}{yxxxz}~{xusstvy|~}{yxwxy{~~|{z{|~}{z{|~~|zxxxyz|~}zwtssux{}{yxwwxz|~~|zxxxy{}}zwtsstwz}}{yxwxy|~~|{z{|}{z{|~~{yxxxy{}~~|yvtssvy|}zyxwwy{}~~|zxwxy|~|yvtssux{~~|zxxwxz}}|{z{}|zz|}|zyxxyz|}}{wusstw{~~{zxwwxz|~}{yxxyz}}zwusstvz}}{yxwxy{~~|{z{|}{z{}}{yxxxy{}~~{xusstvy}~|zxwwxy{}}{yxwxz|~{xusstvy|~~|zxwxy{}~|{z{|}{z{|~~{yxxxy{}~~|yvtssvy|~|zywwxy{}~{yxwxz|~~{xusssvy|~~|zxwxy{}}{{{|}{z{|~~{yxxxy{}~~|yvtstvy}~|zxwwxy{}}{yxwxz|~~{xusstvy|~~|zxwxy{~~|{{{}}{z{}}{yxxyz{}}{xusstwz~}{yxwwxz|~~}zywwxz}}zwtsstwz}}{yxwxz|}|{{{}|{{|~|zyxxyz|~~}zwtssux|}{ywwwyz}~~|zxwxy{~|yvtssux{~~|zyxxyz}}{{{|~~|z{|~~|zxxxy{}~~|yvtssuy|~|zxwwwy{}~{yxwxy{~~{xvsssux|~~|zxxxy{}}{{{|~|{{|~~{zxxxy{}~~|yvtssuy|~|zxwwwy{}~~|yxwxy{~|yvtssux{~~|zyxxyz}}|{{|~~|{{|~|zxxxy{|~~|zwtssux{}zywwwxz|~~|zxwwy{}|yvtssuwz}}{yxxxz|~|{{|}}{{|}}{yxxyz{}~}{xutstwz}~|zxxwxy{}~~}{yxx~{qha^\]agou~wqlgeegimqtwy|~{yxy{yxuqolifdcdefhjnsuwxx|~~umga^]^`cgkpv{xpid`^^^_```__^_`acgjnrsvxyzwtrpnmklmmnmkjgecba`abeinrw{~}{xuplhea_]]^`bfjnrux{~}ywtqonmnoprsuvwvutrpnmmnpqssttsrqppppqsuy}~}||{zxurnkifffghhiihgfedcbbcdfiloruwy{|~}||}~~~~~|yvsqonmllkkkjhfdb`__`bdfghiiiiihhhijlnpsuwyz{|}~}||}}~~}|{zyyyz{|{{ywuromkihgggggggfdca```bdfhjklmmmmmmmmnoqrtvxyz{|}~}||{|||}}}}||{yxwwvwwxxxwvtrpnljhgggggggggfedccdegiklnoopppppppqqrtvwxyz{{|~~||{{{|||||{{zxwwvvvwxxxwvtrpnlkihhhhhhhhhgfeeefgikmnppqqqqqqqrrstuvxyyz{{|~~}|||||||||{zyxxwwwwxxxwvusrpnmkjiiiiiiiiihgggghjkmopqrrsssssssstuvwxyzz{{}~~}|||||||||{zyyxwwwwxxxwvutrpomlkkjjkkkkkjjiiijklnoqrsstttttttttuvwwxyzz{|}~~}}||||||||{{zyxxxxxxyyxwvusrponmlllllllllkkjjklmopqrsttuuuuuuuuuvwxxyzz{|}~~}}}}}}||||{{zyyyyyyyyyxwvtsrponmmmmmmmmmlllllmnoqrstuuuuvvuuuvvvwxxyzz{|}~~}}}}}}}}|||{{zzyyyyzzyyxwvtsrqponnnnnnnnnmmmmnopqrstuvvvvvvvvvvwwxxyzz{||}~}}}}}}}}|||{{zzzzzzzzzyxwvutrqppooooooooonnnoopqrstuvvwwwwwwwwwxxyyzz{||}~~~}}}}}}}}||||{{{zzz{{zzyyxvutsrqqppppppppoooopqqstuvvwwxxxxxxxxxxyyzz{||}~~}|||||||{{{{z{{{|}}~zvrpoopsvz|~{yxwvwxy{~~|{yxwwwwwwxxyzz{{}~}zwtrponnoqtwz~}{ywusrqqqqqqrssttttututtssstsstttssrrrssstuvvwxxyyzz{{|}~|zxvtsrqpppppqrstvy{}~~}}|{{zyxwvuttssssssssssttuuvwxz{||}~~}|{yxwutsrrqqqqrrsstuvwxz{}~}}}}}}||||||}}~~~~}}}}}}}}}}||||{{{{{zzyxwvvutsssssstttuuvwwxy{|}~~}}|{{zzzzzzzz{{zzzzzzzzzzzzyyxxwwvuuutuuuuvvvwwxxyz{|}~~~~~~}|{{zzyyyyyzzzzzzzzzzzz{{{{zzzyyxwwvvvvvvvwwwwxxyyz{||}~~~~~~~}}|{zzzyyyyyzzzzzzzz{{{{{{{{{{zzyyxxwwwwwwwwxxxxyyzz{|}}~~~~~~~~}}|{{zzzyyyzzzzz{{{{{{{{|||||{{{zzyyxxxwwxxxxxyyyyzz{|}}~~~~~~~~~}|{{zzzzzzzzzz{{{{{||||||||||||{{zzyyxxxxxxyyyyyzz{{||}~~~~~~~~~~}}||{{zzzzzz{{{{{|||||||}}}}}}||{{zzyyyyyyyyyyzzzz{{||}~~~~~~~~~}}||{{{zzz{{{{{||||||}}}}}}}}}}||{{zzzyyyyyyzzzzz{{||}}~~~~~~~~~}}||{{{{{{{{{||||}}}}}}}}~~~}}}||{{{zzzzzzzzzzz{{{||}}~~~~~~~~}}|||{{{{{|||||}}}}}}}}~~~~~}}}||{{{zzzzzzzzz{{{{||}}~~~~~}}||||{||||||}}}}}}~~~~~~~~~~}}||{{{zzzzzzz{{{{{||}}~~~~}}}}}}}||||}}}}}~~~~~~~~}}}}||}}}}~~~~~~~~}}}}}|||}}}}}}}}~~~~}}}}}}}}}|}}}}}}~~~~~~~~}}}}|}}}}}~~~~~~~}}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}~~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}}}}}}~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}}}}}~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sjc`_aflu{ytnhecbbdgkqw~}yvsrqomkkkkjjijlllmmqtux{xrlgdaabdhnu{{vqlhfdba``aabceffhikmmmnoopnnnnmljjihgfeddccccdefgiknpsvy|}zwtqmjhfdcccdegjlptw||zywutrqqpoonnnmmmlmmmmlmmnnnnopppqrsttuvxyz{|~~|{ywutrpnmkjigffeeeeeffgijlnprtwz|~~~~~}}||{zyxxwvutsqponmlkjiihggfffffffgghiiklmnpqstvwy{|~~~~}||{{{zzyyxxwwvvuttssrqpponnmlkkjiihhhhgggghhiiijkklmnopqrstuvxyz{}~~~}|{{zyyxxwvvuuttssrrqqppoonmmlllkkjjjjiiiiijjjkkllmmnopqqrstuvwxyz{|}~~}||{zyyxwwvvuuttssrrqqpppoonnnmmlllkkkkkkkkklllmmnnoopqrrstuvvwxyz{{|}~~}||{zzyxxwvvuuttsssrrqqpppooonnnmmmmllllllmmmmnnoopqqrrsttuvwwxyyz{||}~~}}|{zzyxxwvvuutttssrrrqqqpppoooooonnnnnnnnooooppqqrrssttuvvwxxyyz{{||}~~}}|{{zyyxwwvvvuutttsssrrrrqqqppppoooooooooppppqqqrrsstuuvvwwxyyzz{{|}}~~~~}||{zzyyxxwwvvvuuutttsssrrrrqqqqppppppppppqqqrrsssttuuvvwwxyyzz{{||}}~~~}}|{{zzyyxxxwwvvvuuuttttssssrrrrrrqqqqqqqrrrrssstttuuvvwwxxyyzz{{||}}~~~~}||{{zzyyyxxwwwvvvvuuuuttttsssssrrrrrrrrrsssstttuuuvvwwxxyyzz{{{||}}~~~~}}||{{zzzyyyxxxwwwvvvvuuuuuttttsssssssssssttttvwxyz{{|}}}~~~~~~~~~~~~~~~zvtsstwz}~|yvtsrqrstvy{~~|{yxxwwvuvvvuuuvwwwwxzz{|~|zwvuttuvx{}~|zxwvuuttttttuuuvvwxxxxyyyyxyxxxwwwvvuutttsssssttuuvwxyz|}~~|{zywvvuuttuuvwxy{}~~~}|{{zzyyyxxxxxxxxxxxxxxxxxyyyyyyyzzzz{{|||}}~~~~}|{{zyxxwvvuuuttttuuuvvwxyz{|}~~~~~~~~~~~~~~~~~}}}}}||||{{{{zzyyyxxwwwvvuuuuuttttuuuuvvwwxyyz{{|}~~~~~~~~~~}}}}}||||{{{zzzzyyyyyxxxxwwwwvvvvvuuuuuuuuuuvvvvwwxxyyzz{{||}~~~~~~~}}}}||||{{{zzzyyyyxxxxxxwwwwwwwwvvvvvvvvvvvvvvwwwwxxxyyzz{{||}}~~~~~~}}}}||||{{{zzzyyyyyxxxxxxxwwwwwwwwwwwwwwwwwwwwwwxxxxyyzzz{{||}}~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxxxxxxwwwwwwwwwwwwwwxxxxxyyyzzz{{|||}}}~~~~~~~}}}}|||{{{{zzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxyyyyzzz{{{|||}}}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyyyyxxxxxxxxxxxxyyyyyyyzzz{{{|||}}}~~~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~~~}}}}||||{{{{{zzzzzzzzzyyyyyyyyyyyyyyyyyyzzzzzzz{{{{|||}}}}~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{||||}}}~~~~~~~~~~}}}}}}||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~sjc``bgmv|~yslhdbaacfkpv}|xurqpmljjkjiiijllmmosuwz|xrlgdbbcfjpv}{vqmigecbaabbcdffghjklllmnnnmmmlljiihgfeddcccccddegikmorux{~~{wtqmjhfedcddfhknquy}}{zxvtsrqponmmmllkkllllkllmmmmnoopqqsstuvwxyz{}~}|yxvusqonlkihgffeeeefghikmoqsvx{}~~~~~~~~~~~~}}}|{{zzyxxwvutssrqponmlkjjihhgggggggghhijklmoprsuwxz|~~~}}}||{{zzyyxxwvvuutssrrqpponnmmllkkjjiiiihhhhhiijjkklmmnopqrtuvwyz{}~~}}||{zzyxxwwvuuttsrrqqppoonnmmllllkkkkkjjjjjkkkklllmmnoopqrstuvwxyz{|}~~}}|{zzyxxwvvuutssrrqqpppoonnnmmmmllllllllllllmmmnnnoopqqrsttuvwxyzz{|}~~}}|{{zyyxwwvuuttssrrqqpppooonnnnmmmmmmmmmmnnnnnooppqqrrsttuvvwxyyz{||}~~}}|{{zyyxwwvuuttssrrqqqpppoooooonnoooooooooppppqqqrrssttuuvwwxyyz{{|}}~~}}||{zzyxxwwvuuttssssrrqqqqqpppppppppppppppqqqqrrrsstttuvvwwxxyzz{||}~~~~}||{{zzyxxwwvvuuuttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxxyyz{{||}~~~}}||{{zzyxxwwwvvuuutttssssrrrrrrrrrrrrrrrrssssstttuuuvvwwxxyyzz{{||}~~~~}}||{zzyyyxxwwvvvuuuutttttsssssssssssssssstttttuuuvvvwwxxyyzzz{||}}~~~~}}||{{{zzyyxxxwwwvvvuuuuutttttttttttttttttttuuuuvvvwwwxxyyyzz{{||}}~~|xtsrstwz}}{xvtssrstvx{}}{zyyxwwvwvvvvvwwwxxz{|}~}{xvussstvx{~|zxwvutsssssttuuuvvwxwwxxxxxxxwwwvvvuuttttsssstttuvvwxy{|}~~}{zxwvuuttttuuvxy{|~~}}|{zzzyyxxxxwwwwwwwwwwwwwxxxxyyyyzzz{{||}}~~~~}||{{zyxxwwvuuuuutuuuvvwwxyz{|}~~~~~~}}}||||{{zzzyyxxxwwwvvvvvuuuuuuuvvvvwwxxyzz{||}~~~~~~}}}}}||||{{{{zzzzyyyyxxxxwwwwwvvvvvvvvvvvvvwwwwxxxyyyzz{{||}~~~~~~}}}}|||{{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwwwwxxxxxyyyzzz{{||}}}~~~~~}}}}|||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwwwwwwxxxxxxyyyyzzzz{{{||}}}~~~~~~}}}}|||{{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}~~~~~~}}}}||||{{{{zzzzzyyyyyyyxxxxxxxxxxxxyyyyyyyyyzzzzz{{{{||||}}}}~~~~~~~}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{|||||}}}~~~~~~~~}}}}}||||{{{{{{zzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~~}}}}}|||||{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{||||||}}}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{|||||||}}}}}~~~~~zogb``diqz|vqjfca`adhlrx~zwsqpolkiijiiihjklmnosvx{}}uojfcbbdhlry~ztplhfdcbbbbcdegghijlmmmnnonmmmlljihggfddccbbccdefhjknpsvy|}zvspljhfedddegilosw{}zyxvtrrqponmmmllkklkkkklllmmmnoopqqsstuvwyz{|}~~}{ywvtsqomlkihgffeeefggijlnprtwz|~~~~~~~~~~~~~~~~}}}|{{{zyxxwvvutsrqponmmlkjjihhhgggggghhijklmnoqstvxy{}~~}}}||{{zzyyxxwvvuuttsrrqppoonmmllkkjjjiiiiihiiijjjkkllmnopqrstuwxy{|}~~}||{zzyyxwwvvuttssrqqppoonnmmlllkkkkkkjjjjkkkkklllmmnoopqrrstuvwxyz{|~~}}|{{zyyxwwvuutssrrrqpppoonnnmmmlllllllllllllmmmnnnoopqqrsstuvvwxyz{|}~~}}|{{zyyxwwvvuttssrrqqpppooonnnnmmmmmmmmmmmnnnnooppqqrrsstuuvwxxyz{{|}~~}}|{{zyyxwwvvuttssrrqqqpppooooonnnnooooooooopppqqqrrssttuuvwwxxyzz{|}}~~~}||{zzyxxwwvvuuttsssrrqqqqppppppppppppppppqqqqrrrsstttuuvwwxxyyz{{|}}~~}}|{{zzyyxwwvvuuuttsssrrrrqqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxxyyzz{||}}~~~}||{{zzyyxxwwvvuuutttssssrrrrrrrrrrrrrrrrssssstttuuuvvwwxxyyzz{{||}}~~~}}||{{zzyyxxwwvvvuuuuttttssssssssssssssssstttttuuuvvvwwxxxyyzz{{||}}~~~}}|||{{zzyyxxxwwwvvvuuuutttttttttsstttttttttuuuuvvvwwwxxyyyzz{{||}}~~zvsrrsuw{~}zxutsrssuvy{~~|{zyyxwvvwvvvvvwwwxxz{|}~}zwutsssuvy{~~|zxvuutsssssttuuuvvwwwwxxxxxxxwwwvvuuutttssssstttuvwxyz{|}~|{zxwvutttttuvwxy{}~~}}|{zzzyyxxxxwwwwwwwwwwwwxxxxxyyyyzz{{{||}}~~~}||{zzyxxwvvuuuuuuuuuvvwxxyz{|~~~~~~}}}|||{{{zzzyyxxxwwwvvvvvuuuuuuuvvvvwwxxyzz{|}}~~~~~~~}}}}}||||{{{{zzzzyyyxxxxwwwwwvvvvvvvvvvvvvvwwwwxxxyyzzz{||}}~~~~~~}}}||||{{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwwwwxxxxyyyyzz{{{||}}~~~~~~~}}}||||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwwwwwxxxxxxxyyyyzzz{{{|||}}}~~~~~~}}}}|||{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}~~~~~~~}}}}|||{{{{{zzzzzyyyyyyyxxxxxxxxxxxxyyyyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{zzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{{{||||}}}}}~~~~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{||||||}}}}~~~~~~~~~~}}}}||||||{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{||||||}}}}}~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{|||||||}}}}}}~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m28.bin b/applications/SprPoP/assets/packed/MUS/m28.bin deleted file mode 100644 index fbdd262..0000000 --- a/applications/SprPoP/assets/packed/MUS/m28.bin +++ /dev/null @@ -1 +0,0 @@ -{wvtsttvxy}~||}}upnllnpqrsrqpnljgfffgknry}uy|ywwvxy|}ytqnlkklmoprttqi^Ydttjefkry~{yxxy{~|suwwz}}{wtqnmmnpsuvvuusrqppoonmlllmou||ywutrqppopt{{pgdj{wg\WUUVWXZ[[Z[_iw}yuqopu}~wu}wmb\euzvsqqokje`dptpmmnpsvy||zvqlo}yvtstw}}zvt}uhZ`hejvyupje^Wbz|vqmjiknrw{zu|wuttvwxxxxz}{yh_ryqpt|{ywyzxox{yz|~{tlcozslgdb`_^_bhpz|~{zz{|~yy{twwlaTQozpf_ZXWX[^acefgjmqqip}vssstttuvwxyz}|yxy|o_l}ofbeku}xqkgefd\Yig``abdfinrw{~{oh|urpqrtvxxxwx{{pw||}}uhnoa[[_grwj[fzme`_`cglquy{|~~{xss|tnkjkmoqrrsuy||uzsnrd[Z^huu~|yz{|}{qg]n|rkfb```aa`^]_cjrsv{t{xvvyn^^}|qf^WSQRTWZ]_`behjgamxonoqrrsuwy|}}}|{yvpk|}}~rixh\RNOV`my~yrffrkcccdddfimrvz}~zqeevpnmnpsvy{{{zyy{~~tjx}xutuwz}~~vozykeb_\\`hszkzricaabehlptwyz|z}wmbY_}vqnmnoqrrstvwunw~{~ux}od]YX[bmz|tj_Yoypjd`__`bccba``a`[_uzxvq~~}zxx|tv}pg^XUTTWY[]^_adeb\jtkjlnopqtwz~}xodZitmvh\SLIKPXcnx}{}rpnmlkkmptxz|~~|wnbb~~unlklorvy|~~}}}|yr~~rhvzurpqsvy{|}~xruqmjfcaadjr|zqmkjknqtvxyz|~y{{obUSt~{ywvuuvwvvuuuwxvnu~z{}wy{pida`achnv}uj_Vhyohc`__acdeeddded\Yinilszyp}|}ynfb`__`````bege]gunklmopruy}wk]bysqtywmvkaZURQRTW\cmx}{z{}zrf`yxqmlmptx|w{xlq|vsrrtwxyzz{}}u~yvtqomllmoqty~||}~{~ti]Vm{snkknsw{~}||~}uw}|}~{xztpmlllmmnorwxnbXe|rkfcbcdfgggggijjc^kpgegjou}u~}}}zxvtqmu|vrpnmljhhhjkiahvqllmopsvy}zobeyoihjpwum{rjd`]ZXWUTUY_gnowuiczyqmlmosw{~z~}qv|vrqqrtvwwxy{}~zt{yxwvututttsssssqli}}~uj^[szoga^^afmsx|x|~}}~wx{vtrrrrsrqpooquz{|~sg^mzqjebabcefghhijkjcanpgeefgimszz~|{}}wohaYU`~}{ywusrrpkdnwollmnoqsvz~}vlblwmgdcehnu|{qn|tmhdb`_][YXWXYYV_sxyxllxqmllnptw{}~x~~~~}v~wspopqsuvvwxyysq~{xxyxxwwxxyyxvsoiaXUk{rh_a{{pha\YXZ^chnsx|z}sz{wutttuvwvusrqpokjz{ohy~umhdbbbdfghiijkiccqqigghghikouz~~~~{si_TLUt~|||}}ztnw~uqqrrrsuwz}}vldoypifeefimqv{ypn|uokhfeedb`_]\ZWQUdedipxxvwsqpqsvy|~zyt|xusstuvwwxyyxtq}{yyzzzz{|}~~~|ytmdYSbwwqnosy|sjac{vnga][[\^`cfkouyzw}tx}ywvwxz|||{zxwvtnis|xx||twqljiijjkkklmnmgfsvolllllmoqtwz}yxypfZPRk}ysmkjlpu{|~|{zz{|~{qgmwpljjkmpsuwy|{ql~ysomlkkjigedcb_WVcd__bfls{~{zz{~}ytnis|{{{zzyyyz||wr|{z{{|}|wnbW`vxogddhnvxoeaw|slgca``aaaacfjopmtvv{yyz|~~~~}wov{vvx{~{vsqpppoonopqqkhtztqpppqrtvxz{|}}|zunk~vlaUUl~{rib^]_chou|~tjo|uqonoqtvwxyz{~{ql}{uqonnnmlkiihhd\Zfg`]]_aekrz}xqjb]g~~~~~~}|||}|wr|{zz{|}zqe\ez{pg`^^aelt|zofd{~voifccbbbbbbcefeahy{x{~uwzxxy{}ys{|vuuvwz}~zwvvuutssssqkiwzspppqrsuwz|}~}{xslcav}~wlaW\v}rh`YUSTV[`flrx~}sju{tpnnoqsuwyyzz{|zvwzooxrnkjjjjjjiihgb[^jh`]\]]^aejpw~~vndZVe}yvuuvwy{|}}}}}ztr~|yxyyz{|yoc^m}pf_[ZZ\`ekqw}{pgk~voiecbbbcccccca]Ycpmjmquz~~u|~ywvwy{~xu}xvvuuuvxz}|xtw~}||{zyyxwsmn{|trrrsstvx{}~~|wqh_^sysqrtx}vlbZb|vlc[VRPPRUY]aflquuwvp{~wsqqqsuxz{|||}|ztu|tt{upnllmmmmllljf_bnkda````acfjnrvy{|{ws{xpf]Wd|uqnlmorux{}~yw}|||}}{rgbpvle`^]^`cfjnquzxoq}vpljihhhhhhggfb]comhhknquzz~{{{}}y~|{zyyyyzzzyxurnjfg{}wu}zyyyyz|~}wnd`qyrnmnqv|{rh_cz}sjc]YWVVVWXZ]aeiijvy|yyy{}{xyv|xutsssrqqqqqnggrtmiggffgikmoprssrplgj}vmd\c{~wqmjjknqtwz}|yogp~unifefgijlmnpsvz|{~zwzwtsrrqpoononkdfrrmkklnquz~~}}}}||zwtpkfa[Zh|tjeq}upmmnrv{~uldezyqjea^]\[ZZZ[\_a`^hwzz}{~xv~{zyxwvuutttqkjuwrnlkkklmnopqqqomic]_ryqhag~wqkhffgilnqtw{~|{zqjsxqljiijklmmnnoqrror{ywvvutssrrqmgkutolllmoqtx|z~}}|zwsnhb[TRa{~||}}umjx|uolkkmoswz~~vmglzslgc`^]]\[[Z[[ZWV_jjilqv{~~|xsor|zyyyxwwvusojmwwqnmmllmmnpqqqomhc[UZm{ytqqsv{zqiepxqkgdcbcegikmprsqsxpmzxqmkiijklmnnnnnmkglx{xy||zyxxwvvutqmioxuommmmnoqsvy{}~}{xrpz~~|zwrmf_VPP`w~ytpmllnquz~vnn~~vqmkklnpsuxz}vniq|unidb`_^]]\[[ZXSR[db_adhmrx~}yuoiej~|{{{{zzyyxvrmpzzsppooopprstttrojd[TXkwtmhffhmrxvnjt|uojgedddefghjkkikx~}~|sq}}vronmnoqqrrrrqpmhkvyustwz}~}|{zxsns}{usrrrrstvxz{||zwrlhq|wqjbYRO]t|xrlhedegkosw{~usytrqrsuvxy{|~||smq|vplihfedcbaa`^YU[ed`_acfjou{~ytngaas~ztt|xvvvvwxyz{{{yvqjbYXhxwpieddgkpv|~unuxsomlkjjiiijkkgfp{{z{}{t}~yvuuvwxyyyxxxxuonx}yvuvwy|{~}vx{yyyyz|~}ytlei}}wph_VQ[r~{tmgca`acehlosx||x|yxyy{|}}~~{~wps|wspnlkihgfeeb^X]ggca`acfinrw|}ztme_^m~||}~~xy~|{{{{}~}yune\[jyyrkfcbceimrv{zt{~yusqponmlklkjecmwvttvy|}x~zyyyz{||||||zwqqzzvutuuwxz|~~~}{yuqot|~}}}~}xrjch{{xxy{~yqjaYUaw{tmfa^\[\]_bdhkorsrw~|{{|}~~{w|wsy~yuronmlkjihfc^Zaiga___`bdgjnqtvxxwtpp}zsld^`r{vsrrrtvxz|}~~{w{~}}||}}~}ytmd^aq|xphc`^^`behlosvz}~{{wtrqponmlljgcclspmmnqsvz~zz~{zzz{|}}}}}|yuqt}~yussrrrsstttsqnjfcbl}wpidl}ytqppruy}~yrkc\\j||tmga]ZYXYZ[]_aceeeky~~zw|{vt}}yvtrqponmkifa_flidaaaabcegikmnnmkgdes}vogbeu~xspnmmnpsuwy{||zw|}wqicfu{slfb```bdfhkmoqtttu|zxwvutsqplhgouqnmmopsvy}zz~zvw|xvuttsssrrpnkhd_[Zbw}vnio~|vrpoqsvy}xqibal~zrlfb_]\[[[\]^_`_^bnvvwy}}~ytry~|zyxwutsqojfkrqlihggghiklnnnnlid_^gz~woiht|wsponopqstvxz{zx{zrjjv{tnjhgghijklmnpqrpov}|{yvqntzyusrrsuwy|}yw}|}{zyxxwvusplhc_ZVYi}wpr}xustuwy|~xpifmztnjgdca``___``_\]foppruy}|ytpms}|{zyvqmpwxspnmmmmnoppppnlhc]Y`q}~{xwxz~}unlw{wsqoooopqrsuvusv~vonzztpmlkllmnnoopppmkp{~}~{vsx}yvuuuvwy{}~{wrq{~}|{zywuqmhb\VRUex~zwuttuwz}ztwzvtttvwy{}{sljt~wqlifdba`__^^][WXbihfgjmquz}yvqmhgp~}|zwrpu|zurpoonoopqqqomie_YW_pxuqmkkmpty~~wqs}wspnmllllmmnmkjp{}|}~vqt|vqnmllmmnnoonnlhgnwwtttvx{~}|ww~zwvvvvwxyz{{{ywsnjky~}|zywtplf`YSPWix{wsnkihhjlorux|~|x{wuttuvwyz{|}}{z|zsno}ztokhfdcba`^][XTW`eb``adgjnsw|~~{wrmgcbm}|||}}}}}|{xtsy}xussrrrrssssqnje^XV`pvrlhecdfjnrw|{vy{vspnmlllkkkigekvywvwy{~ytxzvsqppqqrrrrqpnjhowwsqqrstvx{}~~|yvtv||}|{{{{|}}~~}zwrlghu~|{|~~{xtoic\URXhx{xrmifdcdegjmoruwyxy~|zzz{|}}~~~}|yy}wrr~|wspnljigfeca]YZbgeb`abdgjnquy{}~}{xvzzuoicah{~|||}~~zx}}|{zzz{{|{zxuqle]Z`pxvpkgeefhknrvy}}}}{xwutsrqpolhktyxwwxz}~yz}{zzzzzzzyxwuqmqy{wtssstuvwxyyxwtrolmx|wqjhq}||~}wrkd]WXfw}{vplhedddeghjlorsssy}{zut}|ywusqonlkie`_ekjfdddegiloqtvwwwtqnq~ztmgcgw|{zz{|}~}{|xrkd_cqzytnjgffgiknpsvy|~~|{yxvusplmtyxvvvxz|z|~}|yuqt{}yvtsrrrssssrpnlifddnzsmkr}zxxz|~{uoha\^kz|wrmhecbbbbcdfgijiip{}|{wtu}{yxvtsqomiddjnlhfedefgiklnoonmjgehv|vojgm|~zwuttuvwxy{||{yy}ytmfdjw}ztnifdcdefhjlnprssrv}{zxvsomovxvsrrstvx{}|xw|}zvtx~}yusrqpoonnmkifc`][^j|ztoox~yvtssuwz|}wqkebgt~xrlhda_^^^^^__`_^`gqttuwz~~~~~~}zxurpt}|zyxvurokhioqnjgffeffghiiiigeb_]bp}~||}ysnmt}yvsrqqrrstuvvvtv}|wqkjq||vplhfedefghijkllkknw~~}~}{xtqtz{xtssssuvxz{}~}|zwtsy~zy}|yvusrqpomljgd`\XVXdu}|||}ytt||xutttvxz|~|vpkhly}wrmifdba``___^][\bjnmnoruy}~}zxuqmlo{~}|zxvrnotxuqnmlkkkllmmlkhea]Z]iv|{xvuvx{~ztqv~zwussrrssttutrry~xrotytpmlkkkllmmnnmljksz{{{|~}yy|zyyyyz|}~~}zwrps}|zyxvtrolhc^YUT\lz~~|zxwxyz||y|zzzz{|~}wqmny{vromjigfedcba^[_gllklnptw{~{xtpliis~zvuz}zwutssssssrqolid_ZZdqxxvsrrsux|zvy}{ywvuuttttsqpu~~wtx|xusrrqqqqqqqpmjjpwyxwwxz|~}{~~~~~|ytplo{~}{yvsoje_YTSZjw|{xusqqqrtvxz|~~}}}}~~~|~ysps~|wtqnljigfdc`]Z^eihgghjlosvz}~}~{wrmhefq~{wx~}zywwvvvvvutqnid^YZerwuqmkjjlnruy}~{}zxwuttsrqollrz|{zz{}}xv}~zwutttsssrrqoliipvurpppqrsuvwxxxwusqrx~}{xtokin{~}~}{yvsojd_YUV_oyzwsolihhhijlnprtuvvzvmrywzztokjkloswz||xob_c]UQOLIHIMQW]chmqstslk|{tmquq}|y}{|~wrnmha\XXY\`fjnruuo`LUvzstx{|~xs}vz~}ptfWIN]WW]__\YZ]afjoruwz||us{ov{mie]VZeoqmihijlnqqnfk}{n^QJg|wvvy|{po|vrvxxwuuvxz{zxtqnjg_Zltpw|}ztoiebackv|otww|x~yf_[Z_l|wme`[VO]srtyywspnopsvwxxyz{xnk{xqtuusrqqqrqnibZSMJJQt~{|~unhfgkt~||||{yuojbYPICSrwutqlfa^\\]^__^_acc\Wfg_bgnvwvh[RMWwnhd`]YVUSTTQGN[TSVY[\^aeinqstutrmdW^~}yxxyz{}|pfz}qismbaciq}}rdRH]ne\WUVXZ^bfikmnorvyyrywlcn~}|{yxyz{wny|{~|{wtrqrv}}zwutstuvvurnic[RGB^}~xsomlmoruxz||}~vv~vvx}}nj{{}}pcWMFYxohb^ZWTQOOORSOJYa\]afimrw|}rynm~|xqbah\TSU[do{}vl_OOkshb_`cgmsx~}rg]Wn}xutttttsstvyzus~tvojfb``adjqzzri^d}ywvwxyzzxwvvvupfmsiefims{wku}si^TJCEizvsqonljjjklldhxuqsuwxz}ykjzspnnopruy}}qhv{xvvwwwvtromkg\T^^SRTZbmyshz|urrsuy|wne\T\{yxxxxwvvvwwsluywxz{|}vjrvnjgedeglrzyqf[Voxqlhedeghjkkkkkkh``njcdgkpv~{nk}xuuwy||sjaXUi|yvromkjha\infegijklnqtx{}~zsias|tponnoqtw|}ukac~zwuuwy{|||{yxuoehrhcdhnu~{km{qjhgijmptwy{|}~|x~ulaWTlytomlkkkjjjjkjddtvoqtwy{~~yzvspppsw}}woeZQZ|{snifeefhjllllllic\fmc_`cfjpw~ylam}urrsvz~}sh]TVx}yvsqnkigfdaY]licdgijlnqty}zqeeumigffgilpty~um|}zwrh`jl`]^bgnwshvypkiiknquy|~|}yqh_TLPszvrppqrssttvxywqyy{unjgefgkpw~yqf[Tfyqjeb``acdddccccaYUbd[Z\_djqzxqypf]TMV}~|zxurpnnmh_gslgghijlnqtxz|}}{xrg\b~wmgdbcehlqu{wp~{yyyywusqnmkg\Xed[Z]bhq{xo}snkkmpsvyz{{|}~v}~wof]Ua}vxkutkfdcdgkpu||tk_SOh|rjd`__`bdffgghjkiacrpjilpu||yxog^UOa~|yvromlkjc\iphedeghkoswz}~wlbtwrppqtx|vkj{vuuuuutsqomljeZ]ic]]`dks}pqxokijmptwz|}~~|tkb]s~}|zyyz{ztr}||~rk~{pidbacfjnsy|ulbX_ztomllnpqrrrrrssmenwpklnqv|s}~{{}}une]TMNl~|{ywusrrqnfixuoopqsux|xmnvroooqtx{{piw}wsqpoonmkigec_VQ]`XVW[ahpy}u~xuuvy|zri_X_~{zyyzyyxxxyyuox~zz{|}{odkwkb]ZYZ\`ejqw{pebyysnkiijkllllkkjf_`mkddfilqw~wv{zz|~~zuoh`XPM_~}|yrnzwttuuvwx{~~vkdt{rliggikosw|zpgixrmigffgffecba^XQWb]XZ^cipy}zyy{}~yskc[Zo}{zyyyyxwvvvsmmz|ustvvwxz}{rgdv~sjd`__`dhmtz}tibizsnjgffghiiiiiifa]fnhdegknsyzr|yvuvwz}}xrkd\V[v}zvoq}{trrsstuwz}ypgi~wpkihhjlptx|}tkerytpmlllmmlkihgc]Ydib`bejpw{yyy{}}wog_X\x~{ywwwwwvvuuuuqlr~{vvxyz|~~tjntlgdccehmrw}|sidrzsnkihijjjjjiihf_^ilecdgjnsyyt|zz|~|vpib[V^|~yrx}xvvwwxz|xofl}tmhffgimptw{zqm~}xtrqppomljhgfc[Yega_aejpw~~~xrld\Wa~~~~~zu~{pgo{pidaabeinrw}|rhfyysnkjiijjiihhihe^`lmgfhkotz~~|wqke_XUp}vrsqr}wldo|pjjkheddfjnqtvtsqpyyidw{ph`YST`kkigghijje]_e\NLTXRNNQW_hr~o{xp{{mndSLHGINT[bhmmh[a}n_Xhyvmd_]^^_uy^DNujefhkmopmajpcb`[Vanmkkklopqxztlmnpsx|~|wsnmk~|mg_WXqzwsr}jYPJftaVSRTVZ]]Udg_ghfdq}{w|~{xtokz{wurqpqqng\RIFFfpeaaejpu{}wuxxhVHFo|l`WQLIHHA=NHFMMJGTehhiid^Rbysonopstrmgr|qvxz|zpin|yphhwewyvwz~qbQUrf_[ZXYXZQVdZ^bb]ZevxxyztiZtxqnnllkjgcaqznbTa|ofddgjmqswpyz}{tkh{vj}kZHXvg\TMGD@=2EMTY^bgcuŴhliJ4-@hsfIES@64459AKWcmrqf]qeYimgmsurmhp|~{n|xninzsjkknppponmoinu]IAi}hWOMORLP_XTXZSdkhsz{l\NHLexz{~wu}x{urpi_mwszw|xungdmt_Mgy\VRA:KZGCFGIKRZdmtxvqg}}uyw{|jUOVC::Fbdxr\SONQV]elsx|{v}x}zma_aqyk`YRJNa`]eltr~sfesv}spnlllmmkg_WL[z|skmp|sonnnkiytpj_Vszwy~rmfeokogXQPRW]elu||vffvha___Zarrtƻzp\I<:Jdx|unhbTYVGURJJMSY`eknlb^}{y|{kws}q]UNGBFY{|wugaadfikpw}z~zkWC\|k`\\][RYjheav}wqou}yvtsqlf^TI@_zrnorqxq{|vw]\}~qmow~ytqr~{ggg[WX[]biruunl}}uqoonial}q{ɽvg[RJEIZsykunb\PQ`^Z\_`ba]Q_tpry~}w}~z|wg`[XUTYkvzvsrsvyszk[Xyldistnhdbbc_Z^itnov~~z}ulbVJ:?ish`ZY]fpvv|j[}wkegluukfl{~se^kj`]_bfam}qncfv|urrrf\{yȾ©wmg_VNKThu}tmjfaZdne`\UHCcshdchnvoy~uqquywvwnie_XRRXs}|st{nnapp`SMTesuoiggd[bcjnint|{}{ydQ@5Qh\RKHIMSZbkrvyqu}vviehmsytcP?Cy|wsmcgqhbZYjhfmsz}q|rke`coxqfpsbgy{zöwoiaXJKet{vsrogckbM?PfZQNQW_iryw||~{mjknqsx|}}vulcUC4Khszz|}~q^b}mbZSMJM[ktrj^dnc_Zbpmowu~m_[GLhaRE<77;AIPW_fkit~ykhuvprvx{}~}kYIVmeeq|{yumgmhjjacehkrz|zwqppnkhjvxt{pllhdp}{}ºzochaSXh}|uiVKWjbRKHILS[dlsy~~wjivtmmopqon~x`KLaVFCQkymistpa\[ZWRPVcknyqgggfcbq|yz}|xq{x~~lVIk~fSF=7569>DJPVV\rtsu|ytz}}}|w~k`y~jYLITj~{ohsxqjhikou{wxs~zz{ytnjlqxsqpokkw{qlhdqyog`^ey|l\enhcTMLOTY^djpuwvsiy~ywsns}xsqkp~yzvifqucTICCMcwnxvidoohfec_ZQ^vz{wrpqsurq~tje}jn|e`ZJA>==>@EJNLXgejqx|~}gv}l^SKHO`w}rq|zuvy}~wu|~~rkvy~{zxshaf`Shzuqr|tucV]b]\^`bfjpnt}p}xrysz}vwz~xp}l]WTRQT_t|sl{xtlmxvpni`hg`hw|qihm}z}~|kYLRRHB@?ADBBU[Z_dlt~|sf_YSNMVj~w~}yqgt|wpoyvoeXEHvzuru{yw|xpjb`mnfdegfbq|y~xyyzqnyvvy}zzjmpgb`]YW[i|viq}}}}{unu~ooxohdaesvi\kvmns|vh_aymcYMKSNFB?7@LHKQW_gpyzzputib\VQNMSs~qb`{{vux}{vpmr~qaRH]sjij`\_foyn]c{xuogktme[`nihlrx~wgjxoiku|wps}wx{~t~xrikwtjea\VM[vqkzvtux{}}~|xkiqnmkgefpscm{h_hnjmt|~lXSqzphaZOGLN=8D>:?BHOW^ekopt|{zxt}|h_nteZXbsxy|{||}|umgvzpqlaYTPLGFJQWdi_ZXXWVZhrpoomjq|j]htdZTPPQTX]adddqxrooy~xtt|xury{xvqu~~tf_\T^nfYMGIUhy{u|}ytrs~yxsiab{~pic__hy{l\Zfb\WJCACFJOTZ_cco~}~~v|{ywpre[VV^o~|xtnhj{peckjb\XTMDDWbehfcbcddbdnnc\j²|urnbZWVWX[^`_csvsuxyxzuju~y~viZVryhZPHDEN^r~x}qklfg}wrnlnws{|iXOTXSQPQTW[[]mxwy}x~tlhedfn}wohan{vrlfgong`UV\TRYfpttrqpmfZT\t}xx|¿oglle_\\]\Ydrqrtx|yt}xnervrodYRMIFITfv}qbWl}xwy}zsmklp}~qh_WW_`ZWVVQWgjkoty~~{}xytpljluti_]v}zxxwuqkfjlejh^WSRWdr|}xqi^SWjuwqklrzľuo{~tihnkd^VVdgehlrw}ytwxuy{unfkse_dd\TNJGEDSsxrfj~}}unmnrv{whYRiysoib[^d_SNY]YZ]chnswyxund]r~}~yslcbs{utk_j~vpnmnprssrnf[eupf`\YVUW_jrqgZWksgZW`ggjpw~xo}~ukehg]ac\[\_ciov{~~zsjl{vtttw~{wqkc\^uzslf^Y\a\SKB=GLO^q|}~ywx{{usrgelmigiknppvqbftpghq{~zuog]VXbbWQQRSVY]acc`\X_y{xwwwz|wmqrigo}wh]iwoieddgilnnmhkslcgnkea_\XUSTW[lzrf]WRRZhmmptxz{obfvqe_^^`cglprrnii{xu|{zz{zz|~zoe\Wc}~xsnkigea[X\\QPTKEEJVh|ws{pfad|ypic`fnmihfeq}|{la[^hw|thaeddaYUSSSTUTRPMNb}}uopy}zyzzzyzvpkikuuo{vlgeefgiklkju{uqnjhpvsmhaXLBJfwume_\\\\^hsspnv}y{~potrlijkmmmkfbk|wtrx~x}yyrd_pzsolkllmlkhbXUfj]UQNMPXfwtgcuzurnifmsmityvy~vnheelwwkbbhe^ZWTPLGCIcxyvrpomkr~~zz{vqopv}uxytpnmnoolo|{{{{{yvu{~vi\QVeeachlmlkkkiggmr{~xz{wtpjdao}{|}~wjdp}uqnnopqrrqohhngbhhc_]\[\aiszy{~}zwrkep}wwy~|wsppv|ulfgjdZQIB>Iconkiijlnooow}{skdbdm{tszzvsqnjr|{z|~~vqpjdoul`XV[eotusqpmfdp{}||ukabu}xvwy|vnxxqmlklmopqnksxrmhcgonie`ZTON`{tsw{sotsqx{zz}~xrmjwype^]XK??Rcc_\Z[]`dgjlljit~reYOUqztosxtkjttqrtw{~tg^mrf]WTTXaltvtnipslglvyyy{~y|{ypgp|xqkijnsx|}z{wywpkhffffdbjtronnmjfgmog\PECTdjr{yrmknv~}w{~vpkjrz{z{||zwt{|qntsqy}thYKFIVcaYQLIIKNRW[_a``ipr{~~n_Zgvtqsz}xrkgmywnkjlnquy|}|wpin}|srog`\YWUV\djlrxrkhebdmsqmjheem~tiuwlebbdhmrvz{{z~|wropu{qjlrpieb_[^jlijkmopqokedcZOTa^TOQ\l{~xsnjikp{~xuspnq{{uoiiyxoklr|wi[OOaol_QIDAACFIMQSS\ijgfju{{vqqwylb]_hu~wnnssvupmnoruvwupkk|ynefmniea]YUSZnywtqmjhdabih`XWg|rkghilnqtuuy{sja_rytnkotof`fmjghknqtwxwsj^TYovi[QKIMWgyysjeo|}yuuxtjk~|upmnt|yngp~xi_]YPIFEEFHJJLZeefilnpuyrw{srh`\\bn|vqv~~|zzywtniq|xtpnrzztng^]ffiqx{yvsnh`WTW[m{~}ywvwwwu|tjhy~yrmnryyrnnprvz}~{ulcfsuspg^YVUV[et~z~xx~uifw}~yrkhilowugZUXYSNKJIFJY_`bfkpuy{z|}wwohc`bir{~|{tliv}yvz~ypstlecemu{|xqi_ULPl|wuvy~|wuwstsy}{|rqy~zvuvxz|}|ztljxvjdhkhc_][\_ft|x{|tpz}{}ti]UVl{ri_WVZXRJELUUUX]bhnsvxwrkjwzrke`[]nvln|{|~}upywojebadjooj`WUcsrmoqollnrv|{|}}|}}wogh~wsru|~xsu|}zxwwurnheo}vpkebellgb]WS\js~~{}{~~{urw{{z{~re[]o{}{tnf^VQQPPSPKJLOSY^dgiifaao~||}z{}xoe]_ddfp|yolryspprux{~}xw{zxzxqje`[WUVXXZevyqh`Z[bedcehkmp}~yvuuuvvvtqmhiw~wromlmry~{wstz|vqkd_du~ysolkjigddhjd[Z_\XZbo|~umo}yvvxztons{}{zzyy~|upy}slimsy{yung^TOW^YQMKKMPSVYZYWWbuzuopw|||}{xyvqrne``ckwvpt}upoprtwy{|zzytruxskd\TLEEQk|{skc]XTTZbca__erxy~{xvtrpmifen|vv{|wtqnkiis}zxy|zpgcmzzsnlkkmnoomidaenmc\YWX\eq{}xt{xon~}zxuv|zywstkebeltz{xqigh`WW[ZUSSSTSRPNRcrspmkjks~}v{yqkhfglu~y{|ywvwyz{{z}~zutvvnbWMHPcmoqplhc`]ZWW]a`fnoptz}xsnhddr}yvtw~~{vplqxy~~vqqs~xroopsuwxxwtmkoqqoic_\ZZ]ckqux~|}z}voieeipwzzypia^`ed`[WRMIPcnnlkkmprsv~zuqnmnqw}||~|{~xpkjg_\enniefinpomifb]WXgrrpqtyypieix{y}~|}zz~wpt~ywvwxyzzyvtx{wpiiljd]WQLJMVi{{{tmigkv{tme`a`ZRLLU_fhhijlnqsuussyvngdgpzytqpqty~~tjfhe]TKFITgzvlc[SNQ[bfkqw}~wrmgb`evzpklmjfeehmt}}wqppt{vsqonmlllnops|wnf`\]binppu|upnnqu}xy}wrpwwv}l_TMJKQYbipuwtlaXVZ[YXWWRIDOj{thddfhijox||{}}}}|ywvz}|zslgegkqy~}z|sopw}}zwvtru}iQId|nWLJLNPONLIE@>Kbf_\^bhpzp[Xshb^\]]]^ckj``oi_aemwt`qpebcdhlptvwvqkx|lilrrnlklkhd^Wbtjb^blstssrmrvnns{|qvx~qmib[XVSRSWWcyommgaZWYcmmg\N;QiVNMPTY`gmpru}{xuvz~y}zywttxyxxyxunf^}zwuv|~wp~zviZd{dTE<7;DNUVURNAFOGT\][^eo{~u^kvka\XY\adedbb^otehgfdgp|msqqpkjknrtvvwpnvtxuqnsz|wodUF8T{tmgddegnuwsguzs}zwsty}|ylvkddknjd^YRHZ`apvwsqooommleOGe_MIGJMSZbimqqriq~~z~{}~oZY|zsx~|{ygVuq_PD=:Nqod\UQNOPSUX_eg_hpgjpw~xqjedzogceknmkhd^kqimprsuwz{zwsnb_vt`UOORZbinnnkg^`porvwxy}~ws|{zyz|~{lnxroopswz}}}~~|me~wkb[YYZ\]]\WTb_VWUTV[]\\ZWRLFX}zxuuuuw|unkmsy||ytkgrliquussv{xo}zurty}}zwtqnk{zupmeWGFeobYPKGFHKORTUTR\pkgjkmpv|n`T\{uplihhknmdfrjhlnpruy}{rd[pwh]VRQSX_gmpojdondglsvvvxzywqkerywz|yrzvwponpsw|~~yv|r|xolieba```_\V^h_^`_][Z]cge^RE?Xg``elrvz~vpnorv{~}v}tqppsx|~~ynurYWydRIC><;@Nevxn`_srccfjqx{e\rn{ymZ@>djPDACEHIHLYb[QBD[VLMQW^iuO^vFUfv|skb[]tw\U_OB>@ENXdpyv[?ppegoyvuwafxnkmqy~{ôoA$jØkN@>CLT\djoicyzspjeu}|fpwtuwzyrguzchvljjns{}od~pms\jwomqwo\HE§r`UPOPQUX\TTlkijhbs~m~ywvuqi`ot|~rnjlosvvsmgb^TT|vstvx|}u{¹sdVELŲtfZPICBAB59LFGHGANa^`cfgcYKjxpkmrx}|vips~{vkwunxj~sh`Pdtlgc_\\\\PZf_bbb\gzxx{~~zme|{zzytk_g}}urpquz}{woh_ZPkwpoprtwzyɸ½tdWIhtg\SKFDEB7GKEIIJDMb`_acb]NPy|rmlpu{~wik|}}~unkyqovwnf]Y~tmgc_]]_YTfc_bcc^f{{yz|xrbq|{||zuk_dzvqpptxzxrjaXPU|qmmnprsx}yxð¸}n`QWsg\RJFDE.KG4BD[QHG`iC\e_[G?[d]pts^gj[uoU{_juaH_iOMN<^P+`\Q_owx{vjPBSL5(8R`(8fvolba~}{oafI13]UW[wxƿƴìܶͨchm<2V?@F`tq|ryd~ql}uzgpn>TFTXVTcZHfcu{tw{}ka`z{wtrZVenz}wngY?WoMOaGLFL`ST[GJYf]ZCLg]FYghdW\Wawpjct|xasuosu}|~wyzoz|ƞֶ~{jca_enrZsnctbkump{szxniwwtjizpRO^^inp}yfWu}Wfy_cQJYZ`WPTT^W\[k|kTcjhg^]SMQSPCT[P>cTNf[hg[Sbqchguz~lobfxwjd[GCATNO=RhKcicunfqzvvgNOMU[SNGS\H>GHZp^acfOUt^X}qyrzüütyv|}nohzwwp|_tqtzx~~xv{v{uz{w}r~utq{}da}hUixyohRPLQV\TSuYYui|r~uoovrYWdnvpgaSEiiJcaRbTReqvcfryugknxn~zp}|v}u{VV`_VUC;BAJGI?_aOnfhvw|}}vvzwy~ywzotpztlaqjv~|rov{ug_wm`{mexjgt{}qxvzuill{i]kw}{qjcrpnmss}~yxzup{x[]ltoiUQTRR@?>PE7][Yoniqtvriu{yqqk\_gsrkrdZJZjLOcKS[JN]if`e`dPINZmgVVdmoha[^kaiorz~z}wq~}qpttrgY^[fcXSdmQdr`r|pikp~y}zpcdkwptojjnxfubsiZ`hj^a_\[MQWgpjafouuk`SXTNRUmjQYqTRdT[llcfcepo|{wh[f|z`W`lom`VVMUJ;=W\F`j\oyojimtnregtyzl_\hrgUPWdofi`YU[qa[yof{tju}}x~yufe|kx~xuu{zv|{z~}}lbl~{bYbnsrh`d`g]MMfq]ss}qkt~we[]dkcd[SU[jVIhbRd_QYfmiqqpqegrvz{}~rxhkno{yxhajthK@@EGGJBCYj]]wret{zº}zy}sv{~uqv}|xmcn{nyttroplmz~inqdv{mehlpuqnkcfq}~tjjrz~|vrrpu}{ml~isthp|z{zvuj\TXdkdSHGMQSRSQKG=?S]MMijaq|z~~||yxwsz{oqq~qmquy{usnkr}vnr|}||ytmpw}}xphsy~z{zzvts~xv{{xstwylhmrm[I@?AEHNROMHGWkdYmyhfv{vwz~}zx{}{vttupkidit{z|lgwybcvn_dqyzwy|z{ukceowuj_Z\_bcfe_[TTdpd^vqsyzvpnkikjo{xgotfuujhlqusrrot~yw}~|}zphirxtfYTW\`acc^ZUVgvmg~|zmfhqywj]WX]adfgb_\^n|rjzrlhdedgsxn^dvl]jvnb`djoomnns~}y~{pbapnX[ok^_ktwwxxtneVKJPTM>/*,3:@GJJJJPdqe`v}ll}{rxrtvsxzojkoruwvrnkr{|{wsqqrzujynhw}rgegjkigfgmw}zqhgnv{{zzzz}}uhco{o`mxk_bkpqopmgbXOMS\_WKB@BFIKMKHHJYif[i{p{}~{~ywx|{xyx|}y}~~|vps|xlefjorvvrpouzxz|{q}}q~|wx|}~zmfp|rcn}uikt|~wnbVQSXXPB735:AFLLMOTcql_h{uhnzyzwtttz|pq}hfvvgahptuwwtqkdbfpwvmb\[]`cec_^_ix{oo}|xttwyrm|qkz|qjjlmkkmpxwpou}zpqwm|ujmty{{zvpi`Z\ckkbWOLNQTWWTSU^nujg{||}z}vnhiowyrg^[[^`bb^\]et}tl{|yustvz}odm{rcjxyphfhkkloszzuw~}zvl_YaldSXhfYU\ejmnlg`XOKLRSL@3+*-28=?@DM\ki^dxykjw|t{nntz}}yuomqy}tlijlnoolkmw{w~xp|yls~tkggggfhjpw{yqhegmty{zzyxumb`lvl]cqobZ]begfc^XRNMSZ^[RICABDFGFEGO\fcX`vyoo|~~}~{ysory|sjfegijjhhkt|u{s{st|wwxyz}~zpd_epm]Zjri`_ekoppke]UPPTWTK?62259=@BFO]lndaq{rgky~{po|}pedhmopplhd`afovvpha^^`bddcekv}rs~ws}os}tomlklnrw~xpkkpvz}~}yphhr|vfguxmb`cgiihc^YTSW^cc]UNKJLMOOORZfqqgi{z~}zvx{}}zvqlhglswwpha\[\]___bit~|rr~}~{njvwjm{~wrpqqrv{xrprvxyxuqle[RQ[e^OQ`f^TSX]`a_YRKD@BEHE>5/-/49?DHOZhrodev~tlq~suxmjlprsroligjpx}}xqkihjkmmns|~tvwnt{smjiijlpuzzvnfbdhmqstsqmf_[bnobX_ji]TRTVWWTPLHGJPWZWQJECCEGIKOYgtztsͽwvria_^_bdgbUP\gbUQ[de_XVVXZ`gpzrkgd_YQH@:79>AA;4,'%%&(+/8H_uzgN}TmھҠ{yvlc\WTSTW[_`^XSQSYaiotwyyxuv}uj_TKECB>7,"#',3?M[a__qydW[|´ʹ»xohc``befe`ZVW]dlsx|}~}yx}~}}~̴l_[ct~tj_RJP^bXPVbf_WQMKIIJLNOMF=40037<>@A@?<:>KY[RQ_orlilqx~źƴ}|lfklf^WSQPSVY]``\UMHIKNRTUUSPLHIS_aWQZinhbbglquxyz|Ǿƻxd\cljel{{ocZRMKKLMMHA93/013330+&$( *31+*.4:>AAAABFMTZ\ZWVW[aiqyŴxmbZVVX\_bb`\WPKKRXP@:BJG=41358:;<>AGQ[elnnnnquz}zpuwmdaagpy~~wlaYRMHE@;60)"!'13( +0+"$+39<;988:>CIOWcq{{z|xyznaXTX\UG?ENNF=87888753359@FIIFA?>?BEINVamttnq¾żſ~}~wojgeeghhfb^_b_Q>5:@<2)$###" !*5BMSPJO]jib`ht}{~}ygVJB<730,))+06;=;85211258=DMUVQLQalkddlwſ{qjgedegikkklrxvj^^jvxtokgd]WPG?9778984.($! !"%)08?@:5:HSRLKR]gnty~ýż~uoov}~}tpqty~~{xusqmf^SI@:632249?EE>68EOLD@EMU[^aceedb`_`emu|~shaac`THIUbfdaaaa_\YVUWZagjid[RJC?<::416?HPW]chlnnmlmqw}Ŀwh]XX[^adfikpu|}ug\]fh`UQTZ_bcccba]YURRV\bgjkklnpstsojjt~x|}qhb[SNIGGKR[dkmlhecceiov~|tw}xj^Y\_abaa`^[XROMNSY_cdeffhjlmjeadp{{spxwplkllljgeefikoqu|}wrlf^WOIFGJNRSSRQQRSTSOIFMZa\TWbmstttvx||wsqojcZQIDBCFLS]iu{yqnv~y}{vtsrokgc`_`bba\Y]jusjektywsoljknrw}}xsonorvtmhoztnjgc]TKFLUUJACLSTQNLLLOSX\_`^[XWY^cinqsutsv}vielrmc_eoyzmeflmbVTZab_[XVVWZ^addb^ZYY]bgknpqqpqw}plmnnnmnopppooqv}}wg`bghc]XUSRSUWXWSMFA>>?ABCCA?=:878>EMU[_cgnu|}xutuxyyxusrrtvwwtrwwnhd_XRMIFFIMQTTTTUY^dks}~}{yxxwtngdktumfhqxzyvuuvx|~}~|zyuplgdbbcca]VPKGEFGKPXblrqpv{tlgktvoffnuwusqpqsvz~}ywy|~|{|}~}xria[UQMJIKNSTOHJUbebbityrrz~wmjovywtqonnprtvurmgc`aceghhhfeehq{zuy~zwvuwyyxsnifcbaaabeggaULMSTKCBHR[dmv{xvuvvvtqliikouz~~}~~~ynlqunc\[_ceghjlmnoprw{yxxyywrlgb`acegiihfdcemuwpjmw~|wsrtvxyyy{}~wyvkffhihfc`^[WSPORYajrx~{tpnnopppomjgfjrxumiox|wrooprttuuvy~||trtvwurnje_XQKGGIMQUWZ\`elrwzz|~wromligc_[XX]ejf^^hqsniffgggfdbbcgkorqponoruy}xx{}xsonnmliea\YXY[\\Z\fwyw|}tmhfeeddccdglrwyywuttuwy|~}~~}yuplifd_YQMPZ_\VYcow{~xv{}unjhhhiihghkouxzywtrqqrsux}~}zwtqlcZRRY[TJHNV[\\]`ekrz}xusqqomkjlosvwurnkihhikmqw||vpq{xuw}|{|~{tleekmeZUX]^[WTRQSVZ_dghhhilqx|wqlihikmmliffegilosx~wppx}wolpw~|yvy|zskc]XUSSSTUTSRTY`is||xvtttux|}x|}wvz}{vpjeb_^]\ZWRLFCBDHMQUY\_afo|~~xtz{tty}}{z{z}{wsqpponlg`XQLJIJJKJJIGGJR]eebfsyw~~toptxz{{{{zxuqoorw|}}|zuof]VQNLJIGD@<97:AIKFCJW`a_`chmqvy|zwz~}wrooprssrolgb`bff^RNSXVOIGHJMQTX]cku~|}~|xwwxyxwuqlgdeikeYSV[ZRJDBBBCCCEHMT]fmruwz~xuy~vv}~~|yxy{|}}|yvropuyukcejjcZSOLJHEA?=>AEJMNNMMORW\bjs}}~|ztpmmnopqpomjikqyztmnv{xpida^[VOJEA@@BBA><99:=AFLT]gopnmvzwvwz~{tqolie`]ZYZ\\[XSMHDBAAADHNTVSOTalnlnw{xvwy|}~~}{xwx~xy}wuuutsqommnpssqmgb]XURPOOQTUPHCGPTPKLR[cjpv{zwvwyz{|{zwttw~xty~xtsstsspoooruwwuqlgb_\ZXWWYZXQGCGMJA;;?DHKNQTWY[]`elvyurrrssrqpmlmr{|uu}{wvuuspmjiiknqrqnkihhijklortpg\Y\^WKCBDGIKLNPRTTTUX]elsy}½{yxxvtsqqsvy|}{xtqonnnopswzxqjjqtofaadffeca_\XTOLLNRX]`dgjnsx}}zyzzzzyxy{{yxwwxy|yrqx|wnhhkmmljgea\VQKIIJMOPQPPQSVY[ZYZanxyw{}zxxwwvuttvy}~{xtrqppprtx|ztllsxtlggjmonmkifb]WSPPQTUVUSRQQRRROKJOZbb^`kv~}yurqqswz{zywvvwy{|~ut{}wnjlptxz|}~}{xtpmlmmlie`\XVTSPLGEJTYVQS\dijjklosyż~{yyxyz}|}~zvuvxz{zxuspnlie^UQTYXPHHMRSRPOPRV[agmqtuwz}{{~}yusstxzzzxvtrqomg`YW[_ZPJKPROKGECCDGJNPQQPPSW^emsy~zyytvz}}zvtsux|~|wplntumdadgfa\VRNKJIIHEA=8558>@CFJLNPQSW`krros~}z~}uuz~}zuqomlkkkjgb[UQNMNNMLJHEBBELRQLKS^ccbdhnuzyvy{srw||zvrponnopomhc]YVUUTTROLHDAAFJG?:>EIGCABFJNRVZ_fnw}zyxxxwtpjc^ZYXXXWVTQMKKPUVOHHNROHC@?>>=<<=?DKSZ`dhlqw~}xrmjjklnooomkhhjormc^aec[SMIGEC@=;;<@DIKMMMNPTY^elu|ywwxyyyxvrollptskcchkf_YUSRPNKIGFGJMOOMJHGGHJMRW^gnpnox}yvuuvwwwvspmkmruridgmmg`[XWVTQNKIIJKMMKGB>;9889;?DJLJGIS^a__enx}wtsstuvvusrpqu|{trx}|vojgeb_[VSPOOQRRPMJGFEEEFHJNQOIBAHNKFDHPX`gnv|{vtrqnjgdbbcdec`[VQNKIHGGILNLE?AHMJDBFLRVZ^behkmorv~ü|yxxwvusqqrtvwwtpkfc`^\[[\^_\TLLQTOGCCGJLMNNOPOOOORW_gntz~~zvuttsqpnnnqsutrnjeb`^\[[\_`^VNMRUQHCCEHIIHHGFDB@?@DJPV\`dinsy~~{yvspopruwxxusrppqqqrsuuqh_]aa[QLLORTUUUVUSPMJIJLNPPOOOPRUY[]]ajy{wtqpooopsvxunikqsnfcdgijigfc`]XSPNOQSTUTSSSSUVUSPQXbfdbhr{~~wtw|{tmkmoppomkhd`[VRQRSUTSQOMLKJIF@<=DJJDBHQX[\^aejpw~}}}~zssx|xqlmorsstsqolhd`^_acdedb`^]\[XSMIKPRLEDINPOMLLNPTY^bfghilpv}{trux{}~~|yusqrsrqnjgc`^\YVPKLRWUOKOTWVSPNLLLMPRSSRQQTX_fmu{¿}zyy{~~}{yxvuspic_bfe]VUY[ZWSOMLLLNOPPNKIHJMRV[_begjnuÿ}{{}}{yxwurlfachhaYWZ^]YUQNLKJJKKIEA=:9:<>@BCDDEGLU]`^^fqxzz|{vw|~xplnqqnid`\ZXVUTQMGA<999:;<<<<;=>?BDC>99@FD@>BGNSW[_bfikmpt{¼xspmjgd`^\\^`bba^[YWVUTSSTUUQHA?CE@968AEIKNOQSUY\_``_dnwzxy~zvrpnlkkkmnle^]ad`XTSUWWWWVTROLHEDEHKMOOPPQRTVVUSSXafebemuz|}»|rlmpmf^\^`bccccb`]ZVSRRSSRPLJGEDDCA>B>9972/,'""##$$#%(*-/0/3>IQST]ju}}y}}zyzzzyxvuuvwxxvsqpsyժdoƐNmwncYVUOB6/-+'  - -  (1<<>>>?@?>>=@FMPMJMU\]\[]`eimrw|¾wcI1'@\s~}q^J8+(267ACEIQY``^ahpsrqqtvy|ƹvomqz²wmcZSMIECA?<71+&"!   "#&(,18?FLPTW[`flt{ug[SMKMS]jzpbYSJ=0*++' $).5:753234441.*'$"! !"%('#&+*&%).49=AFJMPRTX\cks{ĿviZOGCCGNWcr{qhaZRG;1//+# !"""!  "&(*,,-.0369;<>DOZ_`eoz|ri_WPG=0&$)/26?O`r}tle_YSLFA=;9740-,079636=CGHIJLPSX]aehiiiknrw|vmd]WPI@7.&!#(/;Ncu|xtojd_[YZ[\]^__^]]`eiidaekmkgeeefggghijmqtwxwvuuvwy{~~wpic]WQLF@:40/18CRbsµ{vqnmmnnmlifdcba```acc_XRSWWRLJMPSVX[]_aaaabdhlorssssstuvusqsyzsnjfdcejr~|qhdca_\ZWTQNJFBAABDEFEDCCCCCB?<:GRZ_hvzoe[TNJGDB@=<:779>@>98=CCA>=>@ACEGJNRX_flpsvy|~wqibZQF;0& %,5?KWevytpnmmlkheb_]\\\]_bfhiebdkonkjlquxz{}~~~~wmhfd^TJC=84/,*+-2;ER^jwǿ}xtqnnoopppnmlkkjhea_`ehe`_cgijihhhjknprssrqppqtvxz{{{zz{~|zxwvtog_[\]YSPRX_hq{Ľwponlhb^YVTSRRRPNKHFEFGIKMNOONNPTY[XTTY]]ZWVWXY[\^`chntz~pxuywwy|~~·sijYGC>4-.+'&'%#""#(./-+/5?BEJOTY]chow~xrnkiecb`_]YWUSRTW_iw~vEQs>Lbglqwwrmlnqqopqsxǝ\:~[-?Xm|½zrmifd`YPJIF@5+%##%')-161)(+2;EPZagnu}ziZPMUiѿ}rkif^RF?70,+09ENSQJB:3,$  %-22039@CBAABDGILORUZ_fkpsvx|ƽn_SHBCKXlƳwi\PB3(" - - $WУkJ.&$(03DWYbt|{zy{}~sjdbcfkptvtofZL>1& &2@Rfx}lFNwQ5FUcnyŹÑrsofYSPSZes{hTB6219CNYfnrsrqsxiVrÞrnpsuvvusqnlhfggghjmqttqh]RKKP[k{omyljoyymZC-!*Ffuvqprsoe[UXezzyzvurpoopqsuwz~μskfb^[WSPOUe}maWOJGEEDDC@<70(!%,0110+''/=KUY[`gq~|~lXF83:Moukd`_`accc`\VPJGGJLNOMLKMQX`iqy}vngehp{ƿvgYLC>?HXn|phb__adghf^P<#  =R\bege_YSOLJJKMQV\bjqx|}{yyxxwwxy{}uicb^SE?EUj{vrpqv|s\F4& !@`}pcVMOURG>::=BHPW]``^\ZY[_bgkpuy~{ttz~vhZON`Ļwlc^]ajt~yqha\WTRQRSTUUUTRPPRV\chlllklmqstqnsÿrbQC835?Pf{m]QKIHJLNQTVUSOLLR]b]PC:6568:;<=>?@BCEGHKMPRVZ_dkrz|w{ytnhedgnzijwkdcfkpsuwwxz}|wz}|zwsj^PGEHE8%0Rm}zyz}{wsqonnmljigdb_^^_^\TJDQs|tlcZQG>5-'%&+5@MXbhjie`[VSQQSW^dije`blpiceo{|zz{{zui][m~fQC9437AQe|yohb^\[[\]^\WN@2+/63+$""$&).5>HS]cedjxwk`UKDABGQ]juz{xwywgZc}{z{|~|zvssv~Ǹ|vqlf_XPHA:546;BFD70)"!.AWjz~}{zxvtromjigghjmqstpg^]nzsmheb_]YURXfw~}~|~zqopl`WSRTSM@0%)8;FSZ_fs|yvrolihggjnruuphci|}zy{||zvpi`WMD;4/16ARew{xurpnljheb`]\]^aba\WW]`[TPRW^ekrx~~ysniea_]]]]\WPJK^}yyyttv{|xsnhb]XVX]hw}zxnfi{|wrnjgdb_]\ZYXWVVUUUUTTTTTTTSSSRRRRRSUX[^`_[WW^c]ODAIWaeflu{vpkgda_][XURPPQUZahlmican~|wlc_]]]]\ZYWUROLIFEEGMYi|Ľzy~tlgfghjmpuz~w{|{{}~{ywuuuuuuspmlr~ump{|xtoje_YSMG@:3-(##(,/2:Ou̿~xtqnkgc_[WSQONMMMMNOOPRTVY]afknnjffnvvqmmquy|~|skhkqpjeejr{~}~vt{tsvzxoga_`bdgilorrpjb`djh`Z[bo~ytoic]YWVX[_bcccgkjb[cyztoje`[VQLHC?<9777:=BIPX_gntz~{y~zx{|zvsokgb]YTPMKIIJMPTVUOE:7D[mndZUUX\`bcba`adly}}}uj_WUVTLA;;?GR_kw½~|zyxwvvuuttstuwz~}xvwxzwofbdgloqrqpnljgda^[WSNIFDEKUdt~zwutstuwy|~}yqe[\m}{ywurpnkihfdb`_][YWVTRQPPPQRRQMFABLUWVX_iu|wvwxxxuspmjihhjlqv|wno~{upkgc_[WSPMJHHJMRYco}zvsokfb_[YWWX[`fnuxvl\KGXtqb[\clu~}yuqmjfdbaabbbccdfikmlhbahquqnotzzx|{rlhghhgfda^[WSOKGC>:50,&!#2E[o{}}vpopruwyz{{|||}}|~~|yvsqommmoquy}xrsx{yusuy~~xrvzvrnjfb^ZWSPMKIGFEEFILPTWXTLDBLavztmhb]YURONNOQUY^cggc[ROYo~z{ukea^\[YXWWXZ\`djpuz~zz~wstwz~~}|{{{||~}vokmppi`VPMKIHGFDDEFIMQUWVQIABQgwyqgbbfmx{wsnid_YTNIEA=;::<@ELU`lx~{xvtrpnljhgeca_][YXWVVWXYXVQJDDIMKE@>AEJOTXZ[ZVPJJQ\gpw}zwutsux}zqoyyqmnqsnf_YWWWXXYZ[^bgmsy}~|xtplieb`^]]]^__^[YZalvyumc[Xatzy{~|yvspmjgdbbdiq}~{xtqmjfb^ZURNJGDBAABDFJMPQMG>7;J_ornklr|~}{zxvsqomkjjklnqtuurmiinsrlfccdeffedb_\YVSPMKIGFFFGGHIHD?821477548CRdvþ~~|ywz~sjhmstpkiijmoprtvy||wqlgb^\Z[\`dhmqsrmgbet|ztoje`\XTPMJHFEEDCBBA@?>?@CHQ\jx~|zxvtqokheb_^\\]^bejotutogabmzxy}}zwtrpoprux~}{yvtqnjgc_[WRMID?951.+**+.26:?ACDGJJE>=>@CGKORRNIEHVl}wpkjmqrpkfefjnqsrmifinokd]ZZ[\]]]\[YWVUTSRQPOMKIFC?<:8:=DMXblty|~øÿ~{xvsqpnnmmmlic\WW[aa^\]bhotwyz}{vpkfa]ZWTRQQQSVY]befd^VONXix}ypheehlptwyzzzyyxwvtrnib[WWZ^^ZTNKJJJJKLOT[fr|yvsqponmkie`ZVV\djlllnpqojd`eryuvx|vpryyqkhhknqsttsqolifb^[WSOKGB?;730-*'%$#"#$%(,/49>DHLNOPS^r½¾}xy}}wpkiijjihfca^[YWUTTTVWXXVTQORY`ffda`acgjnrvz~xqq|~zuqmiea^[XVUTTSQOLGA==AHORRQQQQPOQX`ca^^cly|ywvvwy|~{xusqppqrsvx{~~wrqsurkc\WTSRQOMKHDA=951.,*(()+.27<@BB>70-3CWdgb\WWY^dinrw|»|xuqmiea\XSOJFA=:64322468:;CIMNLJJLNRTWXYXWUSRRTX_gqzľ}zvrnkhfdccdefgeb_]`gpttrrv{~|zwtpkd\UPPQRPJC><<:850*# "!  %+29?CC@;9;:989:<@DIOW_gpx~|}|xtpmieb_\YWUTSRSSRPMHCABFJJGCAACFHJLMMMNNPSX^elrw|}|}|vohddfiihdbbdinswyz{~|xtplhd`\WSOJFB?<97544469=BHMRUTPG<42:J[dcZQJHKPW_gntz~}}}~{yvrnkgc_\XURPNMMMNQSWZ]``]XRNOXhx~~|yxvutsrqpmhb\XYZ[YSMHEDCCCBA@><:8653210/....-----../1258:742/.,,,-/148;>@@=81+).;JUYXSPPSYajrz½}{xvtrolhb[TMHGGIHEA<99;?ELSY_dffd`]_ix}{ywusplgb^]^bec]TJDCFIIEA?>>@ACDEEEEEEDDCBA@><97421126;BKT\dkptx{ľ|{yxwvtqlfa^_cffc_]^`ejpu{~~|vpligedca`_]\[[[[]^acfghfb\SKHKUblnjbZURRUX\_cfhjlmmnnopqrtuwyyxvrlgddfhihffioy}yurolihgfghjmpsvwwvtrqolf`^cmw|zupmmptzztqpswwrj`XQOPTWYVRKEA=;:876531/-*(&%#""!!"#$&)+/26:?CGKOQRRSWbsxqmjihgfdb_]ZXUSQOMLLLMNPRUWZ[\[YWWZ_gnrtuvx|yvy}|}~zwsokhd`]YVSQOMLLLNPRUX[]^^\YWUUVXYZXURRW_kwzxvuutssrpomkhd`YQJC@?@@=70)$  "%'+/37<@CEDA<759DTcmokfb__aejpv~¿~zvqmhd_[VRNJFB?;86433347:?ELT]fov{}zuoko{{wsojfc_\XVSRPOONLJE@;89>CFECA@@AAA@BDIORROJE@>>@CIPX`iqx}ü}|{zyyxyyz{{{yvrpqu{~{zz{~~{xtqmifb_\ZWVTSQPNKGB><=BHOSUUSPMIC>:;CO\egc\VRPRTY^bglptwy|~~|zxvutux||xtplieb_][YYXYZ[^`cfhhgc]VPOT`nz~|{}}{xtnf`[Z[[YTMFA><;;:986543211110/-*&#!!$(-/.,)''(*/4FLMIC<8:BP^innkijnv|yvtrqomkheb_[XUQNKHFDBA@@@ACFILQV\biov{~~{wuv~~}zxuspmifc`][YXWVVVUTQMIEEGKOOMIFDDDEFFFFFFGILQW^fnv|}yvvx}~|zxuuw{{yz~|xtplhc_[WSOKGC@=:754323357:=?BCCA>9559BMUWTOJIKPVZ^adhlqv{{tmgb_][ZYXXWVVWWYZ]_beghhea\XVXanz~xtrqqqrqokf`ZWWXXVPJD@=;;:::987654322100/..-,*)('&'(+/5>HT`my¾~zuqnoruupia[XX[agjkkigffgikmopqrrrrqpomljigfeddddfgikmoppnke]VQPU^hnnjc]XVVX\`ejnqstspnkjlorttrolihhijlmnooonnmmnqty{xxz~{usu}}{{}~}yskc\XVVVVVUTROLIEA>:62.+'$!#(-39?EJMOOMIFDHSdw¿xrnkjiihhggfdc`]YSNIFFHKMNLIFEEGJNRX]ciov|~|zxwutrokf`ZUQOQSVWVTRQQRTUVUTTVZ_cb^YUSSTW\ahov}~}|}}~|xvuvxywsmf_YTPMKIFDB?=:7520.-,+,,-/258;=??>:50-.5@NX^^\XVVX[`flrx}|xtokgc_\YVTRQPONMLIGDBCFMU]dhjkjhfcaaeo~~zvrnkigffffffea[RI@;ACEFFFFECA?=<:::CMZfnpnid`^_aels{Ļ}xtokfb^ZURNKHECA?>>>?@CFJNSY_ekptuutssv~{wrnjgca^\ZYXVTQMHB><;;=BGLORUX\`ejnsvy|~ſ}{zz|~}zxy{|zxyz{|}~~}|{ywtqnkhda]ZWTPNKIGFEEEGHKMOQRRQPMKIGEB><=BJQUVSPMKLNRW]cintx}}zwtpnkigeddddefhjlnoomie_YVX^ht|~{yy{ztmf_[YYXVQJC=853210.-,*)'&%$$$%&')+-/000/-+*+.4;AHMSYajt~ÿ¿}{{zyvpic][ZZ\^`bcdeeeeedddcccbbbaaaaaaabccdfgilnqtvxyywsoidbelvypga]^aflpqqpnmlmmnopqqrqqqppoonnmmmllllllllllllkihgjov~}vpkgdb`]ZWTPMID@<840,(%!#)/6>EKORRPKFBBFP]jswvsonqw~ytrqqrrqmhb\WROMLKJJJJIJJKLMNQSVZ^bglrw|}ywy~ztnhc`^\[ZZZZZ[\\]\ZXTQNMOSVWUQMJHFFFFFGHIKNQUZ_ejnruxy{|}~}yz~}yvvvxyz{{{yxuspliea]YURNJGCA>;:8776789;=?@@@>:50,+.6AMW]^][XVVVWZ^dlt|yslgdccdca]YTQOOQSW[`dhloppmjea`ckv|zz{||zvoh_WPLJKMONLGB>;:99::::::9987665321/.,+)(((*,06=ENYdozÿÿ~xrnkloqrpmjhfffffecbbcfimnnlifc`___`abcddeefghijlnpqstutqlf_WRPSZbilje^WRONNPSVZ^bfjnqtwyzzywtrqrtw{||yuqmjhhikotzumijq{~}~{xusplhda]XSNIEB@><;97531/-*(%#"  !#&)-26;@DILNONKGB?>CN\m}}vplifeca`^\[YXWVUUUTSQOLIFDDFJOUY]_`adglrx~||~|yvtqoljhgfeddcba`^[YXXZ^bfgea[VSSTVVTQOMMPTY`gnu|}|{{{|}~|ywwwxxwvsnib]XUTSSQMHA:4/+)''''()+-/258<::999999::<=@DHNU\cjqx~»zurqruwvtokgeeefgijjkkkjjjihhhgggfeda^ZVRONORVZ]_`_^\[ZYWSNIDCEKT^fihc]WRPOPSVZ^bgknruwz|}~~}|{yxwwwy|}zxvtrqpppqrsuwxzzywsniecfmxzusuz{slfa__^\WPIC>:8878888753/+&!!$&&%$"!"#&*/49?DIOTY^behjkmot|~wqlhfdcba`_^\[YWVTSQPPONNNNOPQSUX[_chmsy~~vojimu|tnjijlosvy|~~}{ywusqomkigfdcbbaabbcdefggec`\XWX\bhmoppqrtw{{upligec`]ZWSOKGC?<8530.-+**)(&$"  $*19?CFFDA>:768>HUakqqolheefjovû~|zxurnkgd`\YVSPNLJIIIIJLNPTX\`dhlnponkighnw|xuqnkigedb`^[WRMHEDEGIIHEA>;;;<=>@ABCCDDEFGGHIKNSYaipvyzzyxyz}¾ytqqtx||zxwxxyzz{zzxwurpmjgda^ZWTQNLIGFDCCCDEGJLORTVVTPKD<645;EPX]_]XSNLKMQV\ciouz}yvtrqponmmlllmmnpqstvvvtqmhb^\_enw~{yxy|}wqjea_^][VPJC=9643210/.,+*)('&&%%&&&')*,.02479DIMQRRQONMOT[dkpsuw{}{yxwtrnid_[XVVWWWUQMIFDCCEGJMQVZ_ejpuz{yy}ytokiiiiigd`\YWVWXYZZYWUTSUX[]][WSNKHGGGHJLORVZ_cglortvwwwwwxxy{~xtrrtvxxwtplhda_][ZXVTROMJHECA?=<;;;;<>?ACDEDC@<71-,/6@KT[^]\ZZZ]`ejoswy{{|}}{xvtromjfb]YVSSTX\aegiijjjjihgebachp{~zupjd_ZVSQPPOLHC<61-,-.1368:;<===<<;:865321001259>EMU^hq{½¾ytpnnopolida^^^`cehjlmlkhfb`^^_bdffeb_\ZYYY[^adhloruvwvsoib[VSTY`glnlg`ZTPNMNORUX[_bfilorvy|}yurpopsvy|~~voklqz{wttvz~zyz{{ytlcZQJEAAABCCA>93.)%" !#$&(*-047;?CGKNQRRQNJFCACJUdtýztnjgeca_][YVTRPOMLLLLMNOQRTUVVVVWY]cjrzztokknv~|zwtroljhecbaaaabdgilnpqpmhb[UQQTY]`_ZUNJHHLQY`iqx~~~|wrnkjiiiiihhfeb_[UOIB=854455530-*(''),059>BEGGEC?<;@AA?<8520025:AHPYajrz¾~{zz|~~}zvqmjihhhiiiiihgfdca_^\[ZYXXXXYZ[[\\\[ZYXXY[^aba]VNE?<=BKT[_`^[XUSTUW[_chlptx{}~|{yyyy{~~|zyxxxxyz{|}}}|yupjd`_agpzwpidb`_\XRKC<730.,+++*****+++++*)'%#""#'+16:=?@ABDGKPU[`dhlosy~}{yuqlhebaaaaabaa`_^][ZYXWVUUUUUUVWYZ\_beilptx|~zvrqrv{}zwuromjihhikmoqsuvwxxxwwvutsrqponnmmmmmnnnnmkhd_[WUVZ_dimqsvz~}vpkgda_\YVSOLHD@<730,)&$!  "$'*.269?CKVamv}»~ytqnmllkkjigeb_[VQMJHHILOQSTUTUUWY]bgmrw||zxy}}{xtplhd`^^`bfhjjie`ZTPMLNQTWWURNKIGGHILORVZ^cgkoruwyyzzzyyyyz{}º}}~~yuqnjhfeefghhfc_ZTOIEB?=<<;;<<=>?ABDFHIJKKIGD?:6337=FPX^bb`][YXY[^bglqv{{wtpmjhecba```aabbcbbbbcehlptvvtojeabgoy}|{zyxwtqlf^WPJFDCDDDB@>:7420..//1346788888877778:<@DJPX`hqz¿~yussstsplgb^[ZYZ[]^`bdeghiiihgda^[XVVXZ^beghhgfffghiihfc_ZURQTYahnrqnic]XTSRSUWZ]adgjmortvxyz|}~~~|{zyz|zwuux}ysolkkkigb\WQMJGDA=951-*)()*++*(%" $(,17@ABBA@?=;9767:AKVajoqpmieb`_`bejou{~zwsokgd`]ZXUSRRQQRTUX[^adgjlmmljihhkqy}zwuspmjfa[UOJGEEGHHGEB?=;;<=?@AA@><841/./26:?DHKOSW\ahov}¾¾zwvvwz}~}zwspmllkllllkkihgeca_][YWVUTSSSSTVXZ\_bdfgfda\UNGA>=@FNW^cec_YTPMLMPSX]chmrvz}~}}~{vqkfbachow~~}~wqmjhgd`[TME?:620.-+*)(''&&&&'()*,-/0122211236;@GNUZ^accddegls~xoha\XWVVWYZ[\]]]]]]]\\\[[\\]]^`acfhknpsvxyzzxvrnkhgjov~zrlgdcdfjnqtuutsqponnoopqrsttuuuuuvvvvvvutsqnjfa^[[\`dimoqstvx{~}ytojfc`^\ZWTRNKGC@<840-*'%#! !"$'+/38=BGKNOPOLHDA?AFNYcmsvvuronnqv|zuqnmllllkifb]YUQNLKKLMOQTWZ]aeilptwz{||{xurqprv}}ytpkhecbbbbbba_\YVSRRTUVVTQMIDA><;;::;;<=?ADGKPUZ`fkqv{¿~zxwxz|}}|zwtpmjhfeeeeeeeddcb`^][YWUSQPNMMLLLLMMNNNMKIEA<84348?HQZaeffdb_]\[[\^aekpv|{uqmjiijlnpqqpponnoppppomkhffhmt|{wpib[VSQOLIEA<9654445667776654321/.-,++**+,.15:@GOW`ir{ÿ|ywwxyxwtplifdba_^\ZYXXZ[^`bbb`^\ZXWXYZ]`cgjnrvy{}~~}zwqlfa^^`djptvuqlfa\YWVVXZ]`dhlosvxz{{zywusrrsuwyz{zxvsqpoopqrstvx{}xrlfa]ZXVTQNJEA<9530/-,++***)**+,-/1369FP\gpx}ľ~wrmjgedba`_^]\[[ZYXWVTRPNLKLNRW]dioruwxxwvtromllns{}{yxvutssrrrrrqpomkifca_]\[[[[[ZXTNIC>;9:;86668:=@CGILMMLJGD?<;<@FNW_ehhfb^[XVVVX[^afjou{þ|xtpliec`^\[ZZ[]_behloruvwvsokea]]_dmw}{ywurokgb]YUSRSTTROJC<50.-.158;<<;9630-,+*+,.037<==>?@ACFHKORVZ^cgkosw{}ysnjhgghjlmmljgda^[XWUTRRQQPPPPQQQRRSSSTTSRPMJFA=:88;?EMTY]```_^^^`bdgilnpqrstvx{~}{zywutqomkihghjlosvxyxvsojfb`adiqyxpib\XUUUVVTQLF?94/-+*+,-.0123444444433445679<@DINT[bhov|ÿ¿}ywutsrolieb_]]]]^`abccba`^][ZZ[\^aceghiiiijjlmoqstttsqnkgecdfinrvxxwsojfb_][[[\^_adfhkmprtvxyz{{{zxvtrqppqruwz}~~}||}|yxz~~|xtngaZSNIFCAA@@?>=:730,)'%$$%&(*,/259<<<=@DJQW]bdedca_^]]]_`cfimqv{}zvspmjgdba_^]]]^_`acegiklmmlkjihhilpu{{xtoje`\XTRQPPONLIFC@=:8643100001234554444579<:987666789:<=>?@AA@?>=<<<>AEJPV[`cefffggiknrw|¿~|zxuqnkgda_][ZYXXXYYZ[\]_`bdfhjlmnnnnnnnoqtw||zwutrpnligda]ZVTQPNMLKIGDA?<:987777899;<>@CEILPTX\aejnrvz}{zz{|||zxvsqnljiiiiiijjjjjiihgffedcba`__^^]]]\\\[ZZXWUSQPNMMNPSVZ]_``_^][[[[\^acfhklnopqstuwy{}~|{zyxxxxxwwwvutsrqqqsux||wrnjgeb`^[WTPMJGDB@><;98765433221111234568:=@CFJNRVZ^behkmpsw{|xtpmjgecbbbccccccba``___``acdfgikmoprtuvwwvvusrponmnoqtvxyzyxvtrqponnnnoopppppoonnnnoopqqqqqpponmmmlllllllllllmnpsuxz|~~}|zxvsolhea^[XVTRPNMKIHFDCB@?>==<<<<==>?@ABCDEEFGGFFGHILOTY^chlortvxz|~|zywvtsqomkigedcbbbcdefhijkllmnoppqqrrrsstvy|~|{ywusqomljihgfecb`^\ZXWVUTTSQPONMMLMMNOQRTVX[]`behknqsvy{~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m30.bin b/applications/SprPoP/assets/packed/MUS/m30.bin deleted file mode 100644 index 744fa8d..0000000 --- a/applications/SprPoP/assets/packed/MUS/m30.bin +++ /dev/null @@ -1 +0,0 @@ -~}~ywyz{|z}~z{|{zw}x|x|y~{zzw|yzy~~}z|x~y~v~x{z|}|z~}z{xy|zy~}y|x~zw{y{{~yy{}}~ywyz{{z}}y{{{yx|x~|w|y{zzx}z{z~~~|~zz~xy|{~}||}~zzxy{yx|{xzu{w}~uywzy~{x~~~y{|~~zy{|~}}}}~{z{{xv|vxw{y|ww~zy{wtws|wryzs||v}u{yz{{{}{}~~~{||}{wu~zuvxy|}t}|sw}}tyzy|ptqszqqy{ts|uwzs}~zxz}~|~{yxuv}uvtz}v~vs}vqv{wryuxvnrluvnqxwquyqyvt}}z{}y}}}}|{~y}wrxzttr{yy{ov{rpuzssvsyqnmlxqlryupwtszqv|w}zz|{}{~w|{tq{xtqs}xztn{xnpwzqtsvymnjrxmluzsqwrxxoz{vw}~~}{vy}szplxyqqqxxwvyknox~nxouqrshudlw|rwmt|hswxx{z~}|~s|~}qjo~spnyuxuythppupvpwnulpjgp}xsul{tg{zvyt||{}~zu}vvuit}opo|twtzmjotntqstnth{|djutvrq~mnxx~~x}}}}sx~spn|yqqvzzx{{lqr~~qyrzstqmsfmz|quluxfr|susy{x}y}z|u{~ypzim{omkv{rtouoell|qppltlrgpigoyvvown~~{}|~{}~yvyx{zryvvu}yutvzw}sxzvwk}llstullxjlxsrvvu|vv{yu|yz{~~yoz{mnszsokoxrxnkogkitrpueooqhfzmjjt}yzpz|t}|~x}~}}}{z{vx}x||u{yzzzww}ow{~lyptpwxyohsjnxv}xsr~utsl{~szzv|~y~~vp{vqwqospttixvnlkjcvtkfcl{o]ygiynuvowk|~z}v|uu{tw}y}vyy~s~x~w{~xv}{vv{~qi}pw~ku{xq~rbzngxuwynt{njp||{}y|v{~~|y}rxnsx|oksl|qp|hlmnjfwg}z]frsdrr\qto}npwx}{{{}qyrx{~wvwu}x}|{v~|vvrvuvlpsnlmxpx}y`kudzynxzvw|qxrqwx|ww}}y}u~tkyx{uonu{vpborlnsft~hern]rvbjhnxsh|ry~{x~||zx{z|xyxzyz{{yu~y~yu~r{}~p~n~pnqslsyehjfovwsrmtqwtnx{|s~t}~}}v~suyurhn{|rhxtuolrlnqns~ezwpefmokmzuu}m}nyz}{x~}}yy~||vvkx~wwtvyp}w}}~ox~v|yprtq{rlxfhoiun|pslvruvt{~uyozykw~sdlyvphlqqrlkhcdnusklmsohcgyzfhy{{|}{~}|~~~xy}}px{{xl{tpwz~y|{rnq{|xpt}|xrqy{gu}zsnqxiz~zsqty{xwsz~{z~zt}lt|ych{trikprrjpidclutohotojdgtifz~zw}~{~z|wz|ztryl~{wnux|zy~tpoy|xsq{}yuqwkp}~|tpowmr}t|wq|y{uzuz|zy{}oo|xlduxrnhrpsqklffjtwnolprlfcq{qfp}{|z~~}{}yzwywxuyro{w}uyrst}zp{rz}wrqxpt~zmpsovwwwt{{x||wy}tw~u|yxkz|jqksyqlkxmzsakflmzqk}eoribg~kpkpu~|~}~uwx~q}zyzwzq}zsw|uqq{s{kzuytothz|un|qrw|ugwktmyy{{psryy|}p~wp~r}hu{zxpsv{xrzshlnjzrkynkikj`xibrnwy{~xwv~~||{}y~wwy|to}~z|tou{zyyyu}zoyyrzuw}x}qlvmmqszvvmxo{vex~p}|{ztz~|~xyiyvmzup}vo{zrqo}umv|dnxo`jqljjmzrq}t~x}yrz~x{|w{~s|}~~{{yw}|tyszqqrsvpwsyfsts|w~z{mopkyr}{{|yxnkz|vu~~|~}{wxupuhjrvoitpvzozlopwz{w|vltwivshwpw}}z}wt~zzqtov{{z~x}~||}uw}y{yxzxz~zvt~{r~ruvwqmzr{s{nnnokit{{wo}u~~r~yp|z}xhxwloiwyijqv{tlkrqllu|wevwllh~wom{}z}}uo{||}}zw~}}}~x}~|{iyx~yy{|tvy|x~}{w|yqy{wuqw|xumfmhmfu|quxv~xxrv~~}z|{xurx}io~}xqykrzoqqyufyk`hbwqck|v{~yov~m||~vxx~~{m}wpnyseqt{s|nr}}zvu{}y~utznshjpx}jvytxpvtsw~~uw}}v}|wry|skl~mzz}uxq{jlz}uvrlj_njgyln{}wyx~zvx~}wxu}y}}|ztw||y}wnqnrwsw~xzu|{|y~swtw}tyklxhjq}zitw||lrzz~~yy{v}}w}ptuqrtvx}uypoyrw|y{jiojfemxxfozz|ywpqw|~zzyz~~~xs{vyx~xn~tpiyy}ytyy}zs|u{}|yzourqlfrwrlmzr}uwvu{~}~{{yqquzsot}rr{surtpxuzzlpihgouitly|}y}}szzy}zusyz}z~~yywups~{roqruq{~w~uu|{}tpnlsljmqsj|w{km}}{y~tu}|pztmv{xovvw~vrnl~tv~vwenrkaqqowl~}|{~ox{~|zww{|~~}~stxwzpszvqopz~~{{v}|zvozz~xkvngolrnlpys|iv|zvt}|z|wk|puxputxq{}uqsrvt|qntecrsmt{w{zyxsqv~||}zxt{{z~}{|zsr{}uu}|wxlr{t~}|zwyz}yvzzvmkhquhmqrywu}~llv{xs||}}~xp|vixutupy~|||~pirv}zwhnnbqpqv|}x||zqtxu~x~~~}yn}|~}w}v}}l{{|zrvsww||}}}o|wy~znnnqlipsvmst}xn}yw{}wuuz{}uvunursvtvtyz}soqx|wgpnhjl}~|x~~x{ko{vz}~~wxs}}|qv~tuzxxzwruu}yt{yww|vtrpvghmvzjq{|zw|yu|yxo~}{~}vnsxwnk~wpvt}yvr}uw~xopmesxy}zz{sosyvu}|~}vw}x}y}}}zwv~{twv~vrvrr{z{{z~{{p|~{zuznnpjpqtrq|x|y}~~strvu~v}~vnwrytjryxov{z}zyvty|~|pqjoyw~x{{}x~}nspvzy}}~vy{}}|}~~}y~}w{vwx}|vttozzz~u|zw}y~ztruuldoxtqv}v}xsuyxyxvvz|y{}ttsnxqlvwussy}zr{~rpynvw|}y~{t}qivttwz}~|wy|~~~{z~}p~yvt~oopw}{}wy{uv}w|xyshlksrqz}~q|~xpw~y}|rtvx}{pnxpropyooszy}z{v~wtvpww{~zzz}{zskuos|vy~~soy{~|yw~~}~uy{}z{~xquwt|}ss{zq|~qtoloktvwz}uq}qtyx{v|}utvoz~nnriwunqqxvw|{tw|uwyjo|{y{~ysmmxkqzwxvqx{}{us|~{wx~{{~|}ruwx{~|vuxvpxzwrqlqvqtw{~x~ww~{pqu}~y~|ursry||~nhsqlvsuwptz~wt{rqmlw}{xqtopno{t~ywyp}~~}}rxwz{yq{ywtxux{osyu|~}utptuuus}yy~xuyupr{vywp|tx}}~nnrlnwzupsw|}|ys|yoprrz|}vzzxxnjrruxxy~|~{wsr{{~y~}wpt~{~x~~xws}ztuqu|~xqx~vu}wuzsuux{uu{u|}wqvuyx}{xwwwy}|}yoiqrwypxwy|u|}w~trwpu}{uux}{rnoyqn|}|}vurv{|z||vtvxy|z~tvw~xrmuz~zyw}qyz~z{urvuvwx||z|}~ynm}~}~{xxux}v}~|}pkqsyvpy}rsv}wwmr{zywszx{wnspsy~}|svutuzz}xyvvwxx~}z}z~~}vxx~qprv~z|~zuwy|ztqlt{}~~{urntsw|zusttwxxqnrrs|w{~srvw~uqqr{~vxuv||zmmwx{yw~wvvmu}~z|w}|vxsv|y}xy}zvyrtrvz|wv|~z|{|rkou}x}zx~||zutxutv|}ywlmux{~~voloy~tvxswu|~svpt~zvtx|~wsszzpsy|}trrpz}||xy{yrvx{~zyvx|vposv}|{~{sy{ttntwv{{~~~}x}|movwuv~roouyx~}}~rlpz{vwuyws{|z}qqrw|ywx{y}{{uurnxxz}~|xssozzv}{{wz{xyt{~xx{v~xonqw~wuxux}xvxtvvu{|}|v{}{rlquww}}|swspxz~}~~|~wqrusw{xxyy}~z~yqsry}tt}xtqtpq{{||~~wtsmvu}{yx~trt{}xtyywwpnrsu||qvxv~}}xwuwus}pu|~spnt{y{}{tvntyw~{~~nmrqv|~|z{|~tsuw~xuv}ytqusuz|}|{}smkszw~y{}}|smryzxuyx{xxsrmow{tt}z~}zuvutw{}|rvvpsu|{zy}tspoyz}~|{|nhssw~{~{z~uvpq}zyz|~{vwqyxu||~tnmmvtv|w|wrpq{vx|}xz|}{rlot}~|t{}~zzuqvwz{}{tu~~~wssz}}zyvvsqntx}~|xy{}sknt{yvw}{qmqxxry|~ysx|yw~~~~{trnonw{}yuxywqsz~x|}|~}zx{|rposxw~~|z~|xrtu|~}|xr}yzxru}~sux}uonrwz~wv|{~zxpls}xvx|rqpsurt{}~y{~yyyx}|~|ropltz|{}~vtv|xsxx|}yw}ywwzwpnov~~}~xytuwx~zwx{{|zrtzvtw}rqnuwt|}zvz}~ynrx|{{{z~zwpot}xutvy~{|}yru{}|{toppsxvzyxvvz|{xyzvvw|~xvy{ypkq|{y{|zxssv}~{vz~}|z~{sksyx{yzvrqossyzvx{~|}~yqv{|z~~yy}|qoq}wwr{~{{usu~}{~}~vsrrnpy}zxu|}{xxx{wyv}~}{yvy|~qrryzz~uxy}yrqtz~ur||qkoz~wxy|wqokrw{}ww{~yyxrwzy}}zz|~xqrv{~xyw{uyxxz|}}z}}{yolnx~y|{{||{qpx}vxv|}xty|zwqqtzvu}~|sptwxy}}xx~xqrtz{uzw{ulmlvvx||~zx}|y|zmouz}{{z}~{uqpz{yzzxz~yyxz|~y}xqortxuu}}}|yqow~|vxwyuywpkqx~y{}xusutswwx~xttszxv{xvoonnuxzux}{~{{zkkx|z|}|}{qoq{~z|}|{zvxx}zxw{{zwusorqu|~y|xvtv~~wyzz~~~y}{ztnnpy|z{|}zxtotw|tq}}}{rpsx{xzyyrnjox~yyz}~~}|wnpx}}~}||~~rswz|uy{{zvx|}yuyz}~}~zqojquu~{wu{}ytsz}yvpxyu{ytonu|wy}}{uqsy|z~}xpwzw}tqpu}yy}|vlmovzx||}~z}}~~~xqrx|~~~}}}}wtrx~yttzz~xxz}{yyzywnllptv{wtv}ytqwvqtv}vw}xppt{|y|~}wxtvvw|yws{}yx|{uorz}|{yy|qoorrv~wvy~pms||xvzomt~zwv||}}zx}{wyx~wpnpnqyz}xww}~yvuuxysusv}{{{~xuqv~~y~~{xqpv~ztw||~|tpr}www}uoknw|usx|~|yoov{}xxzrnov}~||y~}}~|{zzzwz{}{yspopuy{}||zw{{ywtw~urst}~~~|x{vst||z}zuptz{{w{y~vrsy{vwzy~vlkqy|{zxuxyxx~vorz}{{w{{ppp}yv||xvw~}zz|xz}wqstrx{{y|}xvy{xut|yrsty~uv{|wrqw~}|~zvwuywx~zx~zx{}vqru{xyyx|rprtuvy|yuz}{{y~vos}~~{yw~~~zosv~{xx~ztxy}}vvx{zwuttyvrxzxyy}xvv{}xuvut{zux|}rmpzzz|}|ysstx~{v}{zy|~slpw|wxy{xsomswz|{z{}{}|vov}{z{|zsuw{x{{|xxyv~}vw||~|wwtpsrw~yzz{|zurw~|vqpy}~zv|uqqvuw|}wqotv{{quz{{rnpuxyy}|~|qljqwy~}z~~y}srvy~}}}}yuux{{y~z}|wvx}~{z|xx|~{tpmsww~}{{{vpqw~{rrsz}x|zusuyxx|{{rpptx|yrw}{|~uqoqy|}}v{ymmlqy|~}z|}zoktz{wz|}xvsv{{|}yvy|xxtx|toopvxvz|||}wsqsw|xuxvx{{{}zuot{xw{|vuqqw{|zv{}~~~tmow~|vyztomov{~{wx}|}slpx{~xy{~}}qor}|{}}z}{y{x~vuvx}ztqssrutw~}{xxzvsqs|zxrqx}}~{sosz{v}{vssvyxt}~{yxrptzyv|~~roptz}wvy}zpmrx}|}}|~rprz{ww{~~zvv}~xuyx{}zuusoqvxzxuv|xtrrx|or|yx}tsyrrso~y~w|~{~xqv{sr}zznnyrngp}||qyzzyyzzqxzu~{w{uvx||||xu|w{{nvy{qmtxur~~tlsxrt{zyzns}zrsqjvxq|z~svnow}rsyu}tr{xqfqz|tzw|x{{xrrljv{{toqoxx}|{|yvxu~w~vy~~{nltxrp|zzvpqrw}}~yynw|wz{qrjkxzz}|}r|tx~}sv}wwmmzvsmy~}nvtvuwwxpulr|z|}xqjsvpz~w~xuvr}u}vy~|sruyqlvsywqppw}}}spbsvysuir|y}{~~}}nqjt}w{wwhkuwsx}xxuoxw}x{y{mq~s|xpeytsyuw|{~xunvw~{uy|ytquyrw{yxyxsvuzyxsdsqnz}lrxm{{}zwx|~trnw~~}}ppv}wvxyv~zsqxsu|r}vfk{r~xofzqrwrz{{qih}|wv~~vpuznsrsytuxz{v{perop}pz~q|suuy~{sov|~yz}lq{vzzyux{rswv}v|koukv}qk{ovyv}{|rij|{u{{}vps|vqyyxz}~ys}txzmhvqw{n{wozsxwv~{ulky|ysz~~quosrtv~suxy~uufpsnz~~|pts}vtw~||yogl|{}mqzuwzzv{wyvw{py|nnwkvrkzwz}yuw}yopd~yhpg}wwuok~zxpxxvkq|rf|y{}~osvrszv}|ujeyuu}~||vs|yqkr~|y~yvz{zrkvvw|wknzjtxjx|~}}{tx{|or{v~{}ntqlyp||{xu}~uzoigs{uzshmx}wx{r{yvt|rs}py~owz|mimzm~{vt{wwu|wtywg_lxuzz~}zu|y|ywylovs||ugq{oispgmzsr|||{mksk|mjngzyy|{|rpij{~|~uffy~{ttqonz|sw{zvp{|zptljumnv~ztrjp~o}uxxmtmmgh|wzsqvu}{zswtzzw~v}yzsktzyv}yuxtzxn{}{uu}tfium|~|w}qzpgtoizpuwtr}vxvzz{}yxt}|uxx{~{wzwyw|upyspvx|kpemy{~ntwt|}u~~tv{wuuxx{szxxy}uxos~~z{n|xnuyztvqu~}wrtwykht~z}wvsbnwt~nu~rgtztqz|ys{turwy}xlvsp|zsdhr{v~|{qjogmtzuv|ikq}vtvq}{wxyrapx|~vmpooz}vx{~xtvvwvvyz}xs{xqefuwz{opx{xy{zetx{wpx~~~qwv}urp{||}oil{mnlpvl{~z{}zirlmt||ny~{sx}|vwhk{}|{zyuuz~rhsqw|ywkg{lw~opwr{vtny}~|sm}z~q{u|v}zntzl|ou|vszvywuvp{~}}tzvrs{vfrjs~u}w~u{sfx{qrowpzxbi{w~}zruwm~u{uwvspqen{~{|y~wxux}gkznixzw~x~{xgkuhzxv~q{ysndxnhtxrjfj|wpx~tkk~tp}~}rkn}~}vrnjmtzws}y}lrut|r|ouw{uvh{|{y~|oh}shsuxpif{~~z{vtrrtyy{ux|jooh}zsue^vykrpxzst}}xp{x{~ymz~pxx{swq~rgzv|uxy{w{zyr|pytrzpyzr|wzrpl}wlptp~y||vto`szx}}}ihotzz~~~syxbpypp{}~koo~ut~z}ufro||wxofj}~ln||~xv~yxrsr~w~~~}~~njq|k^lxy~~{rurvywsr{~vsw}markozuwmrZh|z{t|ovo{y}{{zuxgx|r{}x~}wk|kpvy{|x~~|ww~|touo}}x~ywy{w`Yulx{}zsxzmhtt{z~osmz|s}hwtwpmznrmsysw}xms|}~stzuympo{}omjvvv}xzy~zu~yxysrt~|w||uqldv{uot{tyrkjrwx|jgmx|wvv~puslyr~ppwfjzs}lw~umszu|k{szmnvxzlrqw{}xv~yu~lyuw{zrquyswl`wmu|{}u{omons{}~ohaz|{q~yqexoxlp|seu}smx||xnsws}~k~tzlpwz{lrnz{~ww~vy~ozru|wott{p{lavk~s}{x{woopooy}uhdyx}s~~{od}pynqzsesy}zrxyy|ussn}{k|u~lpv~~nql}x|y}|p~|z{qpz}{~qvu}{mnhpkz~r}vuwrqq~qs}|lixp~yx~~odzqxpuxztgqvzw{txzuonvpyypox{qpl}~}w}||xmx|oqt}txvwnnnljy{tzu~t~yuot{rq}~mowmu}~~lgvswqxs{~skovy~y|q{|wmo}ssv{ro{zsnny|w~{vlw}{prs}uyvsrmpil{yuzu{u~yuowyrs~luuns}}jmrtuswr}~omnyy{{yp}zult}qsv}}rp~z|rltxyxytow~wprv{tyvqzlnio}xtz}wvxvroyxpvykxrtu}zgupuutuv~inn~ywws|utm|nsywrs{uqk{zxx|}ztwxuov{wytwxsxglmttuz||t{nsp}ts}}rkwuzy}vjx}puvpyxvfnrsqyv{trvst~{qrq{xws|z}}v~poz~r|zzu~}wx~sfjsswsktrinrs}lmvuz{wwqovvtsk}|rus|}yrr}hlovz~yj||z|z~xsmyrs}|~~q|pzt}xxuyym`puwxl|tlutys{toot}pz~y}yzdv}y|mrnpx{~zwh|vmj{}vnty}y{u~txx}}t~|zoy}v|yyut{~zvs}wgp~nvx|ytv~rlrs{}|}|pmiy||khzxrrwzzdom|~yvssw}sjwz}um}kw{}wt~{{{~vtuv{w{~}tt{x}w|yqqfwtwwp|~||chosywxonyq}}{trlr~zlp~}viiy}yyzyw~ktp}rkuvuvmw|yz{xmwow|vvuws{{nfkuvwzr|wz~zzxuvfqwwxxtz}|v~wsogz}yuwokrz~vvuxurhv{|t}vy~t}rmz~y{|xv~zy~t}ysz}uzu~{onu{jyrprxvu{opw{}rvwywu~{siwxsx{yo|rmhr{suszl~~yrz|zt~z~~{|x|kn{~y}vwq|w}~{sw}}pw{|prpzokrzwvonvyxtvmr~~}}qvs{vxrp~|ilo{utsv~{{srxu{|r{y|xwvu~}zyrrr{}yz|x{x{~yq{vzslnkhytz|wx}{kuvt~xns|q{~{|znns~ntwglv{pvvzi~}xyx~|}v|zz{v|{wvv|yxo|rqs}|xz}z{x|}us}~vvsjohnuvz|u{|xkwty~unxwsy}|{}ykpv~lx|qho{srvwwlw}x{yt~w|}u~~}rwwxsuwosvyv}~{|}}y}yvv~yqqhqhwux}~{wzskvw}zpqoy|x}{}tfwwxn}qpku|lvtxtt}zs~}}|}w~u|~u{sq{z}|t}|opw{p{|y|zzv{zz|}unljrozt}}uzunj{tvm~o{wx}jm{ysu}vntm|uoxtwxxzuq}~{y|r~~tz}kxz~{ww|kww}p~}y{}xsy{omkkwq}uxyusjmztsr{rwz{~yxgszz~szzntss~rqxrzy|~znw}|{yzr{wzvm{{}}wxywmyyxt~x|}|z{ywx|~}mmjnxp|x~x~}srhr~wuqvytyw~|{uhvz{|s}zmvqv{qsxr|w|yl|~~|yzxty{|{so{|~|}xv{sny{uvz}~z~yvyy{{moiowrzy|{}~srhuwwpwww|v~{}tgwy|zs}|nvnwzouwszw}zn~~~xzwwx|{}tpz{~}zzz}rnxztw||z{wx}x|zppinstxx|~}vqku~yypwtyw}|ugvy}xr{rrmu~{nvvuuw{t|~~xyw{y|}yqwy}u}untyux||~{zvvx||vrjmky~xvz}}rptw|sus{~{z}visw~vrx{nls{}owswrv|{|x~~wyv}y|tsy}svqqzvy~z}|{~|vqy}|}ytklhz|wvx~stvt}uw|s~}~}y}vmrw}uswlkty|qwrwqv~||t~xxw{z|}vqz}svrp{}vz}z~{}||uoz~{}|{skkh|zwvyrvtu~{ux|~s{||xsnsx|stw}jmtzyrwrxpz~{zuxvyz|{|uq||tuqr}{v{~~{~y}~|rp{{y|plil}wxt}}qwrzzu{~{uz|{ypnuz{rvwwjov}stvsvq{~xz{yt|~~~}~xss{zxzspuzu}{x|yqu}{xymlht|yyuvqut~vu~wz|~zy||kqv|wtw||qmrz|owtvsw}xz|}zvu|~~|~zttxx~uptzvx~~}}{|wvwxxwrljow|{wx{ppu~~{rz~z|}}x|}rlt{zvxz~tsnx|sqvwswzzr}ytv{{|{tuv|~ypsv~~vz~}}z|xtzx}wsqjmswyyxtno|}wt}}{|{}yz}~|pmv{xyxwusq{~zrqwwtzztt|}wuuz{wtvy}|upux|wz}|}zzuu|x|urpipsz~yyxrmr~}vv~|~z}x{}yoow{xyyuvrt{wrryvuy|rw||vtv{{utuz||squz{x{}|{{zsw{yzuroipt{}zxzqmt~~uw||{{w||xnpw{vyyvvpt{vqtxvty}sy}|usx|~|vvty}~~sqtyxy{|z|ztwwxxwtojmuz|zw|rpt|uyz~~~zw{{ynqv}txy~zuntz~xovuwryxz|~|vr{~~~~xwsu{urrxwy|{~}y}wvruyyxolhvwyzu}vsvuwyw}yxyz~ort{tuyxtmrx}}oxtusw}}~y||xq}{}~~{yts|xtqwwx~yy|yvot}}{z{olhuwwzuyvwsyz~w~}yyy{~pruyttxwtmrw}}pwtssw{x{}ws}z|}yss}ztqx~ww~~y{|~zunu|~{{{plivvwyuyxvtz|}~wxyx||psvysuxyrnsx}zqxstrz|~x|}vt~z|~|ysu}ysry}vy}z~|||ysnv}y|yokkwtyxwwyuwy~~|x}wyy}xpsvxqxw|}qouytrxrus~}~|z|sv}|}}yxqz~}~uss||u|~y~z~}yvrqz~v}tohpxu{vxtxt}|x~x}~{uyyrrryus{w~yprxz}nvuutv}|}||}zqy}}xxvsvssvw{|z~y}~|rutu~wyxqmjuxx{u{wrw{w}~}z~~wv|{xsqtzszz}|yxpwxsqvvxuzw~}~|{ur{~}|tys|qus||y}{}zy~upyu|~}~wxtplnwyyztrrz~}~y}~{~|}ty{~ttpwxv{|wzusxzzqruxxv{{x~zyts{}wuxvyquu}z|{}~}yz~}przw~~{wwspmoyyzxv}qt}}|{}{||t{{|tsqxww{}v{tuw|xqsuxxv}y{~zystz}uvwwvruv}y}{}~}x{~|otyw~~~ywwsompzx{wx|pv}}{|}{|{s{z{ttqxvw||w|suw|wptuwwv~y|~{yruz~vwwvwsuv~x}|~|~x{~~}otwu~}xwxsolqyw{ww}rw{}|}~y~zr{y}tuqxtv|zx{rtxzyouuvvw~|}~}}zrv~{~xwxr{sut~xz}~zz{|~trus|~zw{tpkqvvzxvwwx~|~~w{twz~uuswtszx~~ztrxy}ptuusw~}~~|{swz~}{xxs}vuu{zw}y}|y}wrqry~{w{vpkrtuyxx}{yw}|x~zuuz~xtuvssyx}yurwz~}rtutrx~{~}~{txy~}|ywt{wtvzzv|~z|x}yspswzx{wpksruxxy|}yw~{x~yuu{~xtvvrtxy}xurwz~{rtutrz~{~}ztxy~||xwt}vuwzyw}}z{y{xqpsxyyzvnmtrwxyy}}wzzywtv{~vuuuqvyz~}xusxzwqutts||~~}wuw|}|yxvvzuux{wz~||~~x|~ztpst||vzxulostxyxy}yw}}~x{}usy|zvuutryz}~zxswx~}rrtvtv|~~}|uty}|{vyt}tvu{yz}~{|y{}}uousz}}xwyvqmouwyzvxw}~|z}zqxz}wwsutv{|~x|tvw{~uqsvvxw}}~|xsux|vwwywuuw{x~}~~}wz}{zntuw}~}ywwxtqnpzw{v{~t{}||||usz{yxuruvx}}{yztxxysqtvxyw}|xwqz}yzuxw~tvuzy{}}zt}{{unvu{}~{xwwwrrltzx{vzu~~|}}z{suz}~xxtrvwy~}~x{yuxyvrquvyyx~}~wwq}{yxuxxtvvzy|}}yu~z{sovu|}ywvwwrrlvyxzvyv~|}~z{rvz}}xxtruwy~|x{xvxyvrquvyyy~xwr}{zyvxxuvvzx{~}}{v|zzsoutz|yvwwwrqntyxzw|w~{{~}{ruz}}yxustvx}|zzyuxywsrtvvyz~zwty~zzvww}wvwyxz}~}}~yy|zvortw|{uwwxtoqrwwyx{y{}x~|urx}~zxvurtxz}|~yzwvy||strvtw}|wwu}{xwvz|vxyxy{~~{~v{zwqotu{|uwxwvnsqtxwzy}y~w}|wrw|}{yvvqswy}{yzxvy{~~turusw~{wxu~~{ywvy}wxyxyz~~zv{zwrotuz|uwxwvotqswwzx~y~w~|wrw}}{yvvqswy|{yzxvz{}tururx~{wxu~{yww{|wyyxyz}{~v|yvqotu{{txwwuouquwwzy|{|xzurx}|{xvupuwz||}x{wwz|yttrus{|}|xvw|zxvx|ywyxwz|{}yx{wtoruw}~wtyvxrrsrwvyy}yx{xst{}{{wvrrxx}z~zzzwx|}turuuv||xwu~}zxww||wxzwz|~}|{wzxupqtwzzrwvwvqrqwwwy|{}{zztsx}{{yvtrxx|||{zzxw{}utrsvw{{ywu{}yxxv{~yvywx|~~|{wzyvrqsvy}}ttwvwsspuxxx{}{~y~{wsu{|z{xvqvxz}|~~}{{yxx||tsquvzz}}wvw{wxwx}}wwyw{||~~wxzwtqrtwz~~yrvuwvtrqwxxx~|~|{zutv|{{zxuqxx{}|}|{zyxz|ytrrvw{z{wuyzwxvy~|wxxw{}|}vxyvsqrtx{}wrvuxutqrxxwy|{{yttv|z{zxtqxx{}|}~{|zzxz|xtsrvw{z|wux{wyvy}wxyv{||~~xxywsqqtxy~}xqvuwvtrrwxwy~}~}zzutu|z{{xvqwxz}{}|{z{xy|}zstqvvy{}~xwv}wxww~~ywzuz|~~{|wyxtqprww~~{qtwuxstrtxwx|}x}~wssz|y}ywrsxw}z}}{z{yw|{tvrsvw|{{yu{{xxv|~{x{wx||zxxyuqpquv{~{srwuxttsswwyz~}z{xssx|y|zwsqww|{|}zz{zw{{vvssuv{{|yuz|xxv{~|yzxw||~{~yxxvqprtvz~{tqwuwuusrvwyz}~z{ystx|y|zwsqww|{}}z{{zx{{vvssuw{{}yu{|xxv||y{wx||~{yxxuppruv{~~zrrwuwuursvxyz~z}wsty{y}ywrswx|z}~{z{{zx|{~uvrtuy{|{xv~yxww~~{yzuz|}}||xxvrpqsvw~~}wpuuvwutruwxy}~z{tsu|y{|xuqwwz|{}}z{{|x{|~xutruwz|}ywz|wyu|}x{ww}|~{}ywwsqrqvv{~~~zqqvuwvustxxw}z~}uuszzy}ywruyy|{z~~z}z|yy||{turuwy|~~xwy}vyvyyyyv||~}~}ywwupsqtwy}zuptuvwuttvyv{||wttu{x|{xusxyz|z{z||z|x|{wtssvxz~{vx|yvyw}~~xzvy|}~}zxvvqpspvw|~|xrqtuwwttuwxv{~~uusxzy}ywtuyy{|y|~y~{{{y}|~vtstwy{zuz}xwxx~}xzvz|}~~zxvvpqsqww}}{vqruuwwtuuxxw|~}tusxzy}ywtuyy{{y}~y~z{{z}|}vtsswy{zvz}xxyx~~y{vy|}~}zyvvpqspww|}{wqquuwwtuuwxw|~~uuswzx}zxtuyyz{y|~y}{{|y}{~wutswy{~|wy|zwyw}~z{ww||}}}zwvrospuwz~}~xrptuvwvtuvxv}}}yutu{x{|xuswxy{zz~{z|{}z{|~yvustxz|{wz~xywz|{zv{}||{yvtoqqsww|}zspsuuvxtuuwxy}}uttyxz}yusvxyz{y}}y|{|{z|}{wvtsxz{}wz~zxxy~}{zvz}||~{zvtporrvw{}{spstuvytuuwxx~~}utuyyz}zutuxyz{y}}x|{|{z|}{xutsxz{}w{~yxxz~}{zw{}{|{zutoprrvw|}zrprtuwxtvuwxy~~|ttuyxz}yttvxyz{x~~{y}{}z{|~~zwuttzy|{w|}xxx|~~|{xx|}{}}{xtrnrqtwy|~~vqqsuuxwtvvxx}~~wttwyy||wtuwyy{yz~}y{|||z{||xuuswzz}x{~yxxz}{zw{}||zzusoqrrvw{}yrpqtuwxuvuxw{~xutuxx{|yuuvyxzyy~~~y||{}{{|}yuutvzz~w{}zxxy~~{zxz}}}{zutopsquwz|{tqpsuvyuwvwxx~~|uutvxz|{wvuxyyzw|}~{y~{||{|~~{wtutyy}zx}~xwx{~}{yx{}|}{xtrnsrrvx{}wrqptuxwvxuxw|~~ytuuvx{|yvwvyxzxw}|~y{}{|{{|}{vttuzyxy~|xxy}}}zxy|}||{wtqosqsvy{~~uqppuuyvvxvxw~~xttuvy{|yvwvzxzxx}|}y|}{||{||{uutvzyxz~|xwy}~}zxy|}||{wtqosrsvy{~~vqqpuuxwvxvxx}~yuuuvx{|zvwvyxyyw|}}z{}{||{||{wuuuzy~{y~}yxy|~~~|yyz}|}{ztroqrruxy}yqqpsuvyvxvwxz~|vuuuwz||vvvwyxzwz~|{y|||}|z~{zuvtwzzy{{yx{}}~~zyz|}{{{wrporrtwx{|sqqqutzwvxvxy~~yuuuvy{}wuwvyxzxx~||y{}|}|z}{{vvtv{yz{|ywz}~~~{yz|}z}|xspnrrsvxz~}upqpttyxuxvxy}~yuuuvy{}xuwvyxzxx~|{yz}|}|z}{{wvuv{yz{|yx{}}~zyz|}z||wrporrtwx{~~|sqqqtuzwvxvxy~}xuuuvy{|vvwvywzwy}{{y{}|}|z~~z{vvtx{zz}~|yx|~|~~yzz}{{{{uqoprruxx}}yqqprtvzvxwwy{~~{vuvtxz|zuxvxxxyv{|{zz|||~{|{{yuvuzz}|{}zw{}~~~{zz{}{|{xrpprrswxz}{sqqpuuyxwxvx{~{wtvtvz{|wxwwywxvy|{zz|}|}|{|{zuvuyz}|z~}{wz}~}~~|y{z}{~{xsppqrrvyy~~|upqosuxxxywwz~}yuuutyz|yxyvyxxww{{zz{|||~{~~z|wvvwz{~z||yx}}~~yzz||}|zuqpqrssxx{~}yqqpquvxxyywx|{wtvtvzz{xywwywwvx{zy{{}|}}{|{{vvvxz}}{}~|xy}}~~~~y{z||~|ytppqrstxx|~|xqqoquwxxyyvy}~zwtvtwzz{xywwywwvxzzz{{}|}}|~{{zvvvxz}}{}~|yz}}~~~~z{z{|~|yuqqqrstxy|}{xrqqruwxyyxwy}{xuvuvyz{yyxxyxwwwyzz{{}}}~|~~}|{{xwwxz}}|}}{z|}~~~~|{zz|}}zwsqqrstwy{}|ytrrruvxyxxxy|~|ywvvvyyzzyyxyxxwwyz{{{|}}~}}~}}||zxwxz|}}}~~|{||}}~~~|{z||~|yusrrstwyz||zvtrrtvxzyxxy{}}zxwvwxyzzyyyyyxxwyz{{{|}~~}}~}|||{yxxz{}~~}~|{||}}~~~~}{{{|~}zvtrssuwxz||zwusstvxzyxxy{}~{yxwwxyzzyyyyyyxwyz{{{|}~~~~~}|||{zxyz{|~~~~}|||}}~~~}{{{|~|zvtsstuwy{||zwussuwyzyxxz{}}{yxwwyz{zzyyzyyxxyz{{{|}~~~~~}|||{zyy{|}~~~~|||}}}~~~}{{|}~~|yvtstuvxz|||ywuttvxzzyyy{|~|zyxwxyz{{zyzzyyxxz{{{|}~~~~}}|||{zyz|}~~~~~|}}}~~~~}|{|}~}zwuttuvxz{||{xvutvwyzzzyz|~}{yxxxyz{{{zzzyxxxyz{||}~~~~~}|||{zzz{}~~~~}|}}~~~~}|||}~}zxvuuuvwy{||{yvuuuwyz{zzz|~~{yxxxyz{||{zzzyxxyz{|||~~~~}}|||{zz{|~~~~~}}~~~~~~}||}~~|ywvvuvwx{|||{xvuvvxz{{{{{}}{yxxxy{{||{zzzyxyyz{|}}~~~~}}|||{z{{}~~~~~}}~~~~~}||}~~|ywvvvwxy{|}|zxvvvwyz{{{{{~|{yxyyz{|||{zzzyyyy{|}}}~~~~}}|||{{{|}~~~~}}~~~~~}||}~~|zxwvvwxy{|}|{xvvvwyz{{{{|~}{zyyyz{|||{zzzyyyyz|}}}~~~~}}|}}{{{|}~~~}~~~~~~}}}}~}{yxwwxxy{|}|{ywwvwyz||{{|~}|zzyyz{||||{{zzzyyz|||}~~~}}|}}|{{|}~}~~~~~~~~}}}}~~|zywwxxyz||}|zxxwwxz{|{{|}~~}{{zyz{||||{{{zzyzz{||}~~~~}|}}||||}}~~~~~~~~~~~}}}~~~}{ywwxxyz||}|zyxwwxz|||{|}~~}{{zyz{||||{{{{zzzz{||}~~~~}|}}}|||}}~~~~~~~~~}}~~~}{yxxxyz{||}|zyxwxy{|||{|}~~}|{zzz{||||{{{{zzzz||}~~~~}}}}}||}}~~~~~~~~~~~~}~~~|{yxxyyz{|}}{zyxxxz{||||}~~}|{{zz{||}||{{{{zzz{||}~~~}|}}}}|}}}~~~~~~~~~~~~~~~}{zyxyyz{|}}|{yyxxy{|||||~~~}{{{zz{|}}}|{{{zzz{|}}~~~~}|}~}||}~~~~~~~~~~~~~}|zzyyzz{|}}}|zyyyyz|}}}|}~}|{{{z{|}}}}|{{{zz{{|}}~~}}}}}}|}}~~~~~~~~~~}{zzyyz{|}}}|{zyyyz{|}}}}~~}|{{{{|}}}}||{{{zz{|}~~~~}}}}}}}}~~~~~~~~~~~~}{zzyz{{|}}}|{zyyzz{}}}}}~}}|{{{{|}}}}||{{{z{{|}~~~}}}~~}}}~~~~~~~~~~}{zzzz{{|}}}|{zyzzz|}}}}}~~}|{{{{|}}}}}||{{{{{|}~~~}}}~~}}~~~~~~~~~~~}|{zzz{{|}}}}{zzzzz|}}}}}~~}|||{{|}}}}}|||{{{{|}}~~~}}~~}}~~~~~~~~~||{z{{{|}}}}|{{zzz|}}}}}~~}}||{{|}}}}}||||{{{|}}~~~~}}~~}~~~~~~~~~~}|{{{{{|}}}}|{{zzz|}}}}}~~~~}}||{|}}}}}||||||{|}}~~~~}}~~~~~~~~~~~~~~~}|{{{{||}}}}||{{z{|}}}}~~~~}}||{|}}}}}}|||||{|}}~~~}}~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m32.bin b/applications/SprPoP/assets/packed/MUS/m32.bin deleted file mode 100644 index 44fa7c7..0000000 --- a/applications/SprPoP/assets/packed/MUS/m32.bin +++ /dev/null @@ -1 +0,0 @@ -û~~zpkU7&02LQfq{|s}PVMdzƳuzujMUF*&XmiU>L@zwjbλnǿxSjK!\fKOJH'/5Ypu|bxrzns|p|p}ioipjolxw}hrwzs{qe{~cyyhebjqqlxvvpo|xUWSDU99[zݸţuehbRigavYqlfunukx}sk|^TH_CVF:M8IP[elr|zz|cGZZ_5'2DRv}xestmvpkibyoxw{o}mmz]zq}}ezzj\loa{]lkcshmcj|nVlW]aAEVP_r۹ɼ{wl^w^kkVm^jokpi|os|÷{avtcejKaEAE7H>FIRs{i}dT_dsO8$6(,KCofmwzswpmarxatyz~z^tdercv~pcqo]w\bbcsgmdbulZtbcqUXbQSV]ҿwlhjrUcZhohpeponr|\grrq_n\GN@PGDE>VgZuynXcf|mL9@:!;&2Gapit~ttyvyhfvda~ntrz]pujUfv~lj{`pnWb[pnkn`jt\jvazrcodY]Q\mvѲu|e}iZ[[ofkmcrvd~th[jvslzh`WOQ[LOH@SROxw`\itkK>L5-<&+Kiyclyzdkuzz~ojt`jmuconVF]t~kqy_uo[\\pjmrgls]qxf{owf_bU\fixpͯzjrb]andineotexºc\o~oh{xgk_W[`RUSEPQInqw^^qzqNCM<+@% 6MYxųǴ}ak~bcvjo}~|oyljs|mijR@Wqnrgix`_\nkirqkylolxzrdc\Uffl`uþp|igfukiojjzn}wfbxrgx|e|wd_em^[^SQYMiqi~|aj}}sTIUG-A.!0>CZt÷ſzsav~card`~rtys}wtx|qfgOE_qw|xiukmzc]bumkpskyr}q{tli`TdgeSe|qxpjssqtniwpz~es~hdyvfsfaqtihfXZ^Xskgx}lb|zoRPZC:H/"#849H]cҿzybfvalqXercewxvwrmbJYnvqrc_wyg~wd]mtnpulkurxptpd]jeYNi_VimxĦss~|{}jnoxnot_mtar}jco{qsuo\b\rybw{zq]rcS^P>RE/%5427BBOg~ÿf`xijr]^p`Xc{z||qRZlzwsfUfj^yofstmrwrdnm{sxupgtkZMdXDMIJs˶|vonw~xyhmlXjwkcqwpuy{hkcx{hzwo]n{vdfPDXN>8C344=12@VɿƸojtvwqYgraVdkft~~{dkj~o^dUPqvnosroypgin|z}zyxpp~qZWhRDF28JcxztuzzxeTjoedvkkowxkssylur{~tinowpRL\REIR<;3?/+/@\VmĻí~v~v[fqf]id]cixp}s{pokSH`edmtysyqgotxs|um~vfdnXGI558@^tzz}}{uYdmd_rnhklventrv~w~tzq{m~fS_\NJXGI>>9+29OFFg˿Ǵigtlbkr]d\lbfv}o{y}zjNVb[Xpur{wikqr~owykdurTG?4?3HTkxwrqjpqdpladscojsncmz~|ppsyz{b`l`OSVCNCM9-4DTAD_pżҷydn|seomcj_m]^kyrhzu~|mXaf\Wiclxyrru|wyxjcssYM:/>:TT`faopx~rk_bu|ofxwgdo_njw{ho{~p~}wtu{|zwd`qo_ZZDNCPL::BUJGZephȽĬ~ggzzqso]netj_hz~y{vetzp[bpj^fcZoo|||pdls]LC2?=R]T`U]^Zw||l^Vptzeoytlq\cknuy~|~~ux~rv}vaZmskhhIPHKSCHMXLEXdj]tĬlhwysyyblatugkx~yuof|z`_oqimaXja~}{oru]G<6NKVUKZRSMI`|uj^^tu{nvyrsy^fbl~r{|xzpokz`[krmpjV]IVTFN[cNETabYqnԿtr|zs|omucvonuu|ticivipsoov^edfzq|{}tVG8DUViLKRPM=?Xkt¬i^[ssvqw}rwiin]soq~uh`mqflqnpt]i`Y`NOWe]PUW[SghfyoƲŧy|peykysgrtp}|g^`yyukw{qwfkl`ulo~lTCHQPn^WSHG97GSZgrs¸zhZmms}xtoju~|efretiftzk`fu{mjy|rpo^ocgmWV]eXS\`XKe`el[iq{˸nkthxmn|srw|urabli{lgvw`umlwglwxiUXLRk_jaO=/7FJHRLTruumm]um]Wl~gojg}lgn{{t}wgmhhpkxzj]rdmsgcdgXQZc^WdVdjW[\eyʽrrwg|yvz}xnt{{o{{|pjfZ|fcp|jukprot~vstjkSQmakj_L20@JII;=VOpzx|cqp\QYjw|~lutcvsstwskt~wsl^|ty~|coegzootraVY\^\odXgZ[ZXcw{v»}mx~t{tku~zww}~usx^j}scdrzz~ry~gz}z|{ps}~tqnYllhn`VF;<@EJG4DDGdmwzum~nWP\fhrqg{ppzpsrho{~zmkvxtq|clwsv{}l^_b\^tejhQWZ^gpmffpx|~~xuxyxvzsnqf~wykemruxvgys{{tu}xptnb|kk_Q@@FKNJ8>E@Yccl{ȴúz~|s`U_loj^Tieeww|{|ymefq~}uw{yzyvy}eho][]_aa]WQR]`}{|wx{uuz~suwo]V_pyzvmzuozw{wutkbPCGMJHA?P==W`fkprvżǷ~zuoebbinkZ^h[jy}yz~yv|}zjbjuyy|vv{|{~lui]X\flcOHLWV`xu{|~|php}xxrni`]dlsrgxkzy|uxuj\WVRQM?:QHBNOZdjc`juɻŶ{nhmrohh_glWerr|~z{|wzxy}sllrvvpsxwz|ma^\bliZIBMIZrdhpqv}xzymhhil}occkljifdwsp|s}umb^deZPBCM@LWOMW^XUW`i}ujoz|ueYnm^ikmqw}||yw|wxpqvprxytsih|~y}ncdijf_WOF8Qj``aa\]q~thibY|zg_fsul_Yqoi}}}zzy|mcfkmkbIHT?FVWVSOOQUWXj}t}tsw|~wdgjaqsklrpkt}}y~neritxjcvno{xolqm^WUUBJTXOOdakŰut}zxzzqaV[chptit{ksy|wy{z}x}{~zwtougaswvvwjYWXUZnfai_bhlpwztq}~ztzwz~wkmut|{rooptunj}s|}vmklaj}g][PE@BGFDJFMYL\ouɺ}xt|xui_\afebcvsm}{w{xsw~ltfc{nimdeggylWUUeuztolxlz{tnbTWntRW{tq}fdtxmaamylwkkYSuTQjrhnsrptfU^v}ydRA39IX`_QL?)Frm]r{qjn{v_OB7NWVhmke`[aq|mtlyyskipsy_V_mty|yvdSQQQYjypO\Ƚ{r~wldp{wv{sgbcZSsmYTb}tqYLdt{}vaKLiilshYOKLPOG0 +*=\lytaaqƹ|jWN^u~rx{nmw}nfe`Sowj\STbmqtwre[WTUTYRJULEDBAGS]flrketpuĴztszikpXOU`iv|zxvn`_glilvksnq}qlcWD/*././)3<5Pjtz|ynegrzƻzn_RMVcji`ntmwesxx{qzu|wk[W_gq~xtsmjsdR\SIJR^febgmsjhyqwyurz|tuvoumptw{ytz|{rhWKOYdllxz~teXPJJJF?J\RYfq{}qmmntyk_XXYVVZT[aTaln{}yuojt~mptpywu{{ugechsyqc]gqorsooqpw}yv}zrudciptnaYV]gnupe[TVYZ^dim|pknkb]TRb^dqlnyypnqszypdWX`c]SJUaRV_adjsqmopknvm{~oov}rnpstnf__dkponkely|z{qzpgagpl]OLVW`}vlni]QQ]geb^f}y{vwyzviX]dWdqqpnrrrrpq~se]\afe\KTZTa`]aecdknoq{uj|~wrr{utvmb^`f_g~uqohd`dszttplije\RQUThpjolh_VV^gleZipqxu|~zmag\[fioroddlqqtzygdggedZ]\M]fdbbb\\eop|szztzyx}|yzreZXa`esikplaY\fo{~zttwyrc[XYXPdlahmja]_abdfaigcx{|~qpu_^gdflng^]ekt{ny}|tppkc[hfV\aehg_XY[al}{vzppw{trt{yyi`\[Viuhfih_VV^ehmp|x{p_X^ZVhgcfcc_\age`Y[ne`ns|vw}mkjffgheca]_pymuxrtzzsk_iiake`fkg\XZ\_swt~vqpxukjrpux{}{jb_R_rnpi_ZWXZ\^_Zl}w}re]XVlofhe\TW_dgg^Tbdcnmnv~vvut{qjiha^cfbcokr{olotyikoakrnifheb`]]gnh{wwvux|{vkhhfwrvv~si[Wllmsl]NOX^]ZTUfgrvpkgWZsrqncYPOZege^^eZbssqsxz|~wyu}}xqjc^`egooapxpmkpy~uusfostusibehgclmdrxvvw{}yqmnnfdvot{~}~}vuhasojliaULOY^^URb^dzxmimehuorsj[ONRYaf^`m`alqy|ytv~s{zkccccmxjkolnoosxups~ntxtw{yoeflmtufoskqwzuhbhqn}~xtv{|zw}{vvvszjic\VRSSTY[V`a]nx~pijko|lkjdYQRWY[]_mihrqs{wx~~z}rigehslpvhdipuuohfk}||||xtojjv~prtkiku}~wmddlq}}{w{~|zyr}xqw}{tjcZPMSYYTQRcd]ksyxnrqsvod_[YZZYYSWlhjxywy}||~}{wogmqdouke`fpska^hs{|vvxunvxr|uihgktyqihnnp~yvsu{}tq{~~v{z|ufYPMRY[XLN_\dnnu}}{uz{vj\W\bb]WP[absxz}}yu{}~}xsujhpihfcchic]]gj{|wwzz~{mz}rlgilmljglro|vlkt}|qzyu|yiWQSUVWQPVNYikmqvvy~|vj^Z`ed\QY[Ufrvz~{srw~zz~omrfcdgie^[Z]_\o}}|{|vzwsrnlmld`dkjnz~znhmv{|wv~qr~tf\YYVRLUXJR\bgjhfjq}ypjgccd_X_WT`dmvywtrrt|}xvzy}}{vidadklbUQW[Vgrqz{pqstsmd]Zbei~~zuronprvssxtz{~~rnjb[VKPXOVWU]ef``ekruoqrme_\faV_abgqtqsutt}ytwrv}vjecehf^UORP]ojottru~~uosyxnb[[[Zr|xmipvtpnky{u{}{uttnbUNWOP\\XX^``abfn~wqsvtn_\h`bfbcfikosvx|y~|~xuo{{x~vkghf_ZVUPI^nkonkffpyuvxqg_][Yny|zohksxwnhuwv~{~vsvwtn`TYPNX[^^\XZaefkyv}}wwwvukfi_eoljjkggpxz}}~t|yv}wz{}xqkf^SNQVQ[gelnia_dn{~wnieec^nwr{|upopsvwptvp}}sqtvskadZNWYY_c`YX`hlvwt~}{vpmvmcmrtusmijowzxz|zz{~||~~zwvo`RKJRT`l`_egc]_govteagnjtzqqtvtprwwtrp{}qz|{|wtsrnelgZ\[Z[_`]\[^fvwr~~}|soysquqsy{tmmoqyupu~xtw}{zw{|{zyuhVLMRQbka_[[[[_dinpsxldgnr|qroljnty{xqm{{y~wx||}vpijrfgh`\]\YY]^\aomu{uvzuyzr|~yvxzvsqpq{vpv}yrot{}tp~}{}|tg\TTPXe_``YQNU^cdecm}}uponk~zwrlebjuyyvovuszv{}}~{niskkqnga^XTV[]`f_hupnns{v}|vsuvurz{u{xwxvzsoquxzvqxtyynfb_TZe]^`\SJJS[^]Wakj}zuxup}~zoeadksvrpzsp|}{yzuvttjqurqmcXTTUXbeYafeghjqusv~~}srvxx~wt~{}ytu{vx{rqsssos{or}|smjh_eg`a_ZSMKKNTUQY][iu|{xx~xkddghlmnysryy}{}xtw{t{y}~oqvvvuqf[WWU]c\caY]bfjkifhs~yuvzv}ytv}wrtty|zvsqkkxssyx}|}yqnoglvlge]SLLONJJIQZRZeku~w|umihgfdbqupz}{|~~~~xprtv|w~x{wwyyslg`ZZb\\f`YV[cig`^`hl~y{~vsru}|wuto}~}xqimsnw~{z~~~sonjw}vtj^RJJNQOHBNUR\aemv~{pmoolhc_knp|}zwtsou{||{}{zzwrpmgae\[b^[YVY`b]YZacr{}vssuy{xvvzu~~y{|ontls|~}{vsmy{zuhXLJKMONGJOM[ceipuxwlkprpiagjfv}vppvyvzvy{zuttropg[b^XYZZZXVVX_dj}|yuturmns{}zvz{x{pqz{{~xzy||zxpfXOMNLLHMSJQ^ejorrw}upnpqpgjlenw~unlrz||vw{~yuvvtysfg_WUUY[WNKQ^ej|~~}yzzxvoheky~~zz}{~xw|{}~z{|zxria\WRNJDMRMTX]fmomqw~{xxwsomksmhqswwmmtv~{yz|}}{zwvy~srp`XTSUWTLHLY_nysx}xvy{wmedkrz{|~}{z~~|~~~}wpiedaYPGHOIPXWX_fghlqv|{}}xogqslrrruz~yrssvzuw{}|zvv{{yx{pe[VVUQLJKNO_pmprsrt|xz{skfhkm{w{xu~~~{x{umllkf]NMOFMTUWWWY^dgju}}wnrnmvurstst{}{zrv|sqx}|yqt{wzvpia]YQKILMHWadlliefmyztplkfjz|}yy|yv}x}xvwz}spqqmg[YSINPQUWTOQY_blon||x|qluwwutpmpv}~}yz~xtsvyyssxqx{xspkbWNIIKHUZXbgf`]ahoxwpnqlivwy~{|}{{yzxwyvwx|zx{yvtrofeeVRTQQTUROOSYckemutzzuwvvyzuomorw{z~}|}wuwwtssrzurz|{ywvtj[PJKGL\[[]^^ZZ]bfknz{qmpmt}x{|{yxz}~|ysyz}}zy~||~wsv{~~xsnhlj``[UTTSQRSRS_fdnnlpv~z|xxzytrqqt~zw{{{tquxxtmnzvv||~zyyxqeYPNIN\\^_YTSV[_acck|~wrplw~|wqnsz~~|uw}y}}|xssww~{silofiib\YVQQTWW\`^joklou}{|yxxxvu{}z}z{|~vqqtwxuntuu{xwsja\ZTQ]]Z]\WOMT\acabpt|}wvyvvzrljow|~zzz|~}{yvtuzy~sorimpmjf^VSSUW^bZ`ihjkmsxy}xvy{z}~w|wyurtuutrxvq|~yrjdadb^d_YZXUQNOTZ__`klqxw}}~|tljlptyx{|~||}}tnpv~}~xzwlqsrqoi^WUUV^a\ba_dgknomnv~zxz}~y{y}{uv|yvtsoqzuu{}sidfjhmpb]ZUOMNPQRVW`gdoy}~|ysnlmnoor~~}}{z{}{slmw{z{yvwuuuslf_ZWY^Y_b[Y[agifcfo~{z|}wvw|}xvz}ztomusu|{{tkimlrzqjcZRKKORQNKT^\dlqxzsqqqomjhtxy}zzzxspnqr}~|{xxwrmje]]^V[^YWTV\`_\\ckr~}}wtsuz|zwx{y{potnsz{{{{|~~wspmx}xwpdWNLNOOLFLPQ]bdjqv}vqsusngfnkr~|{wqpqsnwz{|}ytsqojicY][VVUUUVVUVZ]bu}{wttutrtvzx}~yuvmpvwz|{vv{~}}zrz}|tfYRPOMKGLJFRY]aehjq}yutusmglhhrx~zsnnrpu~zxz}zvuustseb`XUTVWVPMNSXWdrv|{yxwtnkltwx~{xpuuvy|{wuw|}}}~vkb[UQMGHOIIORY_bbdjr{|xtrmopgkprx|rmnpo|{yz{{|}{xww{xnneZVSTVVOIGNSWfmpy|yyzytmhgmqx}}~{|xwyzzyyyx}}xojf`XQIINJMRQSZ_abekq|zslptmoqqsx}zspqp{~zyz|{zyv~|y|}tvrf]VTTSOKIJNRcmmrvwy~~xwyxqjgjmp~}z||zxz}}|yqmkje^SKOLJSUVWZ]`eimr~|tnspqwutvxx|~{yyuzztuz~}{vy~wyypiaYURLHHLQP\hinqqpqyzwtpljloo|~~|}yy{}}tnmmkg_VVOLRTWY[XY_fkpyzyvxoqxxxxxuuz|{~}{vtw{}|wz}yz|zrnhb\TKFELRS^aailljkqy{tljlqqs~|}{zz{~{wyztrqnjca_RRTSUXZWVY_entr{z~{svwy{{wttv{|y|~{wwwwwywx~y{xtpmicWLGHMNYa\^addcflrx~~umjost~}y|}~~~}}|z|{{}{vtw{wsoihi_\ZUTUVUUUVYbkjqutx~~z}zwy{yustuxyyzuuwywtpt|wy~zvtrndYPLMKV][^\ZYZ^cfilo~|uppot~|}zwux}zz}~||yy}{urtxzzslonfhd]XVSQQSTT[^_jjikpw}zywvutsu|z}{|||utuwwtmpusy||}|yxume]XRMWZZ_^YRQV\^``amsz|yxrs~}wqqv{~~zz~z~{~}|{yyyxussut}strlonjd^XRPQSTYXU_baceiouy~xuvwvvzvv}|}{|vuvuuqqtnsz{|}~|~~ztmhdaXZ]Z]^\WPNQVYZX_efs~~|x}uooquyyw~|y}zzz{{vrqrusv~{{rqtrpmg^VSSRV\VW[Y\_aeijkq{}xvxx|}uy{x{~zx{~|xvtrntunswz}~{|~unjjgche_`^ZTQPOPRTU]_`ks}~~vqoppqru}{{zyxz{xqlntu{~yvwutspia[WUW[WZ\VVY]bdcbemy}zx}y{{vuv{~zwy}{vsnruqvxwz~}~{qkkljrsjf`ZSOOQQOOOY^]fms{|vsrrpommw{{{xwwvrnmptz~{xwvrmid]Y\XV]ZWUUY^`^_dnw~|||yussvz{yxzzrrvrv|{{|~xrpqovzspi_VONPRRQLRZ[dknt{vrsutqnjqtv|xvtonotux|yuqolhcb[W[XVUTTVXY[`jp{z|zwsqrrrsv{ywwrw{|~}{}}yxyxu||wupg[SPPPPOMSST`gkpuy~ztrtusnlqor|}xrmlpww}}|~wtsqnmj^][USSSSRPPV_gkz~{xwtrqoklr|~wuyy{~|zz~~z|~|{xsjaYURPNKOSNTZ`flopu||yvtsqnromsw|zqmmsu{}{|~zwutttjfbXSQQRRNJKS\amvxxvuutpjhjrx~{{yyz|{zyyzzskfaZTOJNPLQSUZadeint|}{kgfggg`\Zd~lbvqd^]]^ehgskeziSW^ehikf\K1*Ko^FhpZ|Ĺx|zmgjq{sSV{olfq}~wfbhyfXhhefipuyzvkgtm}{blqf`gjihYB4>Yt|oYO`yòϴohc_WSVS[l}l^d{{qjgfhjltq\ft]autnvmcchy~|vpkbS@0-;99;@HU]_jnpu{~Ļwohc``dhijjkqnlonnqtutuuvw}|z{slfa[UK@649>I\dkrvxxy{}ž}||rkgcabfkpqqnqvsturqrrpmliginknqlheded`\]cnx|||uvtpnnmkkllkptt|~wwsmolgdcba``acjnpyzvtqoonjhipx}umgbZVXQMKHDCGOUZ^agsw|uohcacilxxtsuurkdeb\]YSMHC@ACFHNOPZ\\]_bglqxľyphfhjklhilhmrqrrsru{{tjikjlwwhaTSSTU_ml|ŨտrjiywWWn~dNL]swc`zY~t^tuaVQOU^k}kcxvst~zUSx|QGqiPKUfsz~xokpǴ~me\]ojJ\cO_{kf{srr{~sqpmg_\anlI56GZc`SE<97=BCPaxzrf\]qqbbm|{~xvpoonq|xigs{pmjbgr{nO41G`j\B738EQZ__\VSYao˹yw~jlvslls~{{|y{fWXjuieeghdYOGFHM`ny{kZNE?=?CMOPW[ds¹}mb\]cmv~}mb`lk]URRQMIFIS]s{smonikjks~oZMDDR\dkqyzj_]bm}sg^YY[ZXX\dlzoedebinsz~xuwtj]SH?::?GMPQS\_`eeca_^aivü{skjopwwvzzz|~~{xqrtnlifdeku}|si`XPNPTYcihljb[TNMMLLOWam{ofigfgjotxz{{|xvzxwwsnjjnqsrmjkfdfc_[WUW^gq}}|}{zsniea[[^^gpwywsld][]__]Y\][`ddddcchp{yuuy|yneWJHC??@BCDEGJOQT`elv{~~yvw{}zxz~{srtsvz|~~{vtssmlmgea[RHB>=;:8:;6:>AEIMR[hx{{zwwwvuqkfdefekkhjljgefilprsxwqsqonnkghkosxxrrlea]\[XTSXaiq{srlhghhhfcacjnqyxwxwvtsssttrprlffcbcefhlry|muuxuoefUGKACKLRY_q´}y_ijPTfr}~uk`e}pn~ebp{qehd~d~}s]eeJFXkrl^TMJSbsr[i{vvhrv]QPSRSUWX[opmx|i`iyhiyudqmLPmyjN93./447?Nav}lhqɾ}|xb`k|skkwpmtskcdxf[l}wz~l]W[ny|uh[OF>>EO]no`dvf^]agjjgba\]gr}iiy~oc_`pohq{cM=::9@CBA@AEP_qxihr~xpnkq}phgo}qjiflsuvwww{p`RF>82//4;@Papyjceq{uz}||tooqx}tqtrrrrqt{{tpmkjnt|xfZTSUV[^\`ccdc_YUTRPRUVcnzvnnllmoru}{wwy|nd^]`cktw}wrokbcb`___\WQLIJIFHFCHNV_k{ſ{sqsxzvojihnssy~~woiebbb^`aadhloponpuxx}|xyz|~vkfa]]^^^aelt~ɿzqigiefggijiea___digkmklnqturnmnnloojklnpu|~vld`abdnpqsroid`][[]cot{zvsqojc][[Y]a`chlqx|qg_XWSNMIECC@>>=<=CEGNPRX_hrx{~ztnga[]a`eiknruwyzyxxxsutmheca]WOHC?;@CCHJLOU^gov{ý|zxtpkimmouvvwxwutqmjjfehfdccdggeddggny|{tniea`abcfjiputvx|û|ysttromjgfecbdecknnǿ~j`UE?0/Vjj~}aM^t[XowowyueNZX_hoy}jZYUMjؿmVbg]Zjdjmwhjoi^qx|qcg]TGMtbSRG.-9?Uo^ZZPPlu[Re_N`u{v|~w{ypsuidaz}snlrs|slr}uYWn\84>IKfv{u~WFJMAGWX\clt~ww|hnvrnv}}|sanv`_c`qoX2>ZH3473.EP[fy|`YysVTWWHQUSR^h{vnuriaZ|vàmb[TAFDA;IMbmv}`MIF9>HKLX`gn^ZcmecJ[~kXYZV[vxqkjmjǼn|ja]QXbikrwtsicihgrxno__NU}gKltz]c|`JB?43770:>@:707=FVzxxm[su}˽|pXL>2) $1ZiŮobZOMHA9MJ_WRQZSSJ32TYIOdrjhgjoywvmkgghfgoifWUOSXdf}trjecSV{}zor`]q~{|wymez{ZGC:1'"1;at|iife`bUfnz~~i]cŸzk[_aemy{tuhIGC@:?3FOZjcjlpkoVJId]=8>FN]ag{vxwqshn_U[~æ~eSMA0*#&FQv|{`]VMCB4JIY[XZ\YYU>>Sx|spj^dfdmptȯgihc^aTkk|lei{bhxxuhe[cNIU|}}tzmdWZnfF9<92=DQqu|decZTXMdaoqprpouwfsƻ~ijyrSBLQP\js¨|pTSVMCG9JNU_Z^XWWX80AXYOWovqvpox{}utpzfUf{}rȫƹzcmtdI3:=:CONhdvzldeYLQCMOKRHLEIRdS]vgxtfNS\Y\t|̾ulwsgmlp|{xu|_Mrx}ovvqjiaaheFdxmy~x{}jC]eQO?G\`_mfpvryrammcfhdujsntwUhtXUC?U`lulwkbKRSHITQe\_\\\VU`R@t}rqyqitnwypuotkgijGd~u|xPnv_f\]pm`faeql{}s[dcSPUO_TXZfr{n~qt{ywKdrVXOJgyù|{{v]dkbeqo}tssvyvyyzz~|nnfeYQVY;bt~|t~~ku~roywzyvsicjVD>Hoοzxk]GTUJNTQ[PQRY\_jqq}}ho{pnyyzxsod_k`Gp{gqgfzyzü{w_\{}fhjXU`bomo|i]eXOWXbjjyew|wody|v~vrvRJj`V]Xtyyubbqf`hkvxpu}swkrw{mfa`YQWbFGptrxmĺlzcblabot~yoswxogwu_{seqf^dgmsoyzyzkWfcX]hvy~vmwbAMd]a]k½żs}kZLZLBHOW\U^oyw`mkafmptfaeig\[gTCSpmj_tļrn}sqx|{|xdpcTQRYb_gu}|zclgWZevulzehp]ZahsuosxyshtnXOhxvsrjS]YPTY`hitrwpmlig^TZ_]RCQNA7Mijevø{gUeaVVX^d^]hotsjpp]\`homgpx~~~ny{^WcY]mq}tlpw~sq{}ygepcZWyv_kpkwʼzyVO[KEDKU_g|uoaslb^]bd_ammgWYgXH=]uvtzqn{jehqxulttY_TKMRYYPOco}~{ioyvlvz[RbXZ_gjhckwvsgu{{}gvuqt{ooV[_PSZmvku`WSX]]TSYUTGNUI?Ct}ewt[V\NSU^ab`r~jWf^ZZ]_[UXlvz}yltdvzyd^offchoqjktsvozv}iZkhbk{nlUQWLVcn|~lY`ROPYedYR_`bTTb[Ud}lu_Wf\_^jv~tcR]VLHDMONPfpvsv~vgqzbYN^UNOYhjd`ryxhiniwrc}{aVLa`rnVYXNTVaZPEPRMJE\abw{o_VJWTNVaz{|vkb_fTRP^giektp{wquo}ok___T_drtrkykmr_UNdfv}zhe]o|wn\RP[T]Zafe\]c`ie{~|ufe[_ectlvo]UGH8=@N_aZXjró}ylgsq}~{ttz~os}y}\bvwt~é~{uK8Dds<1YlIC\kiSWVhkf±¶{\YqvP;XwÔswrWR\ciF56]hWYUgnw{sR79Mb}|puvXC9_|dd}{agztypsUJX_VipfG'ElnMAZ|zibsu|QDEnptbat|c^TM?('&@Wms~~yǾƬ~ypnpX973IVpyiqpPJMetus_hy}ytsrwxhD6%2G`wq]Pbdonqsaazffl}muiZ[gTQ_mbPQ<3'2M]eoմkkqmfclYCG_MF>M`l{vwfdRCC_VKILaajemplm}}wt~ymR:<42>Quqwpe`yqpuxsjukXKkwwzzhny\N=;" /16Dfz̺~|zeWMhdRMWkzzvbsh\Zieokic\]fyyî~shdu|~~~t^k]H81,"1;]zyoXptzsk~tdRkkZB60+1)24;@_}vozs|}gavogeq[kgZMW^]]R`fgaowpqm{}ururxmy}nMD`WC.42=Mkxyswy{caaVAA[K/%'-:Pq|~ivsfxkaj^UU\je][pvwkienjuuiYcigogn`OC\KJQeilup|xmwyʻƯkrliiehO9C_M9,.::Tbs~uv~pakfmx}mo_T]o[ABDQJR]qzwgffqrtnrgemgjTL^tntvx|~lsy~yvȬ|}ylabbbeRH84BM8''%;FV[jslhp|t{ʭ{|uhmodZ[QVUbn|||sh`VQXWjqlYYbgiYYMMdyomjl`lvxt||qg]l}{oʲž~~}uirwoeS]SJS[OEIUhdoorxz~~y{}ifbrronx{|vxprkoZEQf]LDBUXo{cgcaksuhgyxsnjpcutov{~tyjd}jluѾ|nffojidiZSWTR84ISDLNPXSURdtsdjwn}z}sĪ|p[auz\US[k||^WOTR_]^_fggjblfnwrxmb[lg_^h|~yvzijfag`dsynww~ֹ´ntnwtjmqxicZOTsrmgl]^fv{qlr~tecuyr__hqxvxzxvurgpzvoX`]OJ][NLXrr~qfsolbf|xnz|~zvkgt|vvwvssqZXtfgvx̼}dg\\^jpdU[lfbRVXMOg|laMMISXQX\ejx{qnypivvn~}}˺}p{}{}yxwxbObvous}}{nktj`cUJT\ha[\lqwe~{_UZ[d^jiYPY\]jcfXRPfyidgxxwosxtrkrs{qpqm{}rxceof^Wgrsnzxlpjruteoytpij^ilzxxb[\Zdjkbb`mia]SJ@e{thonfmwylijtooqutxlztrsnifd`pv|obmodThtog{ük_jdcRUdf]W_`fezwjfulb[ZGDJU`_`X[^fdl|l[ws{|ĽwtlljxzilnpulguxuowripW\c[WP`ekyso{tkabZWFHOJJUbYTQ^eYFHkt{ʿʾ~igm{{qhs|ww}bb]gghrjZXgcntwwe`eoelp||cZ[Q\^a[T[cj]_[_fnhjm]gqrkm~|xjrtxswaZZ\cjlhhappmi^Y\|m{|n]VR`^`^``e}n^kkUGRSPRSQJLJYdqpemtsq˺wgpptles|{swv~{yv~vjqzzftwk[^]eknevshUHB@@CWZSBO]a^Q[ZUgɲ{hvyxtqyljjiceTZa][iuojfxylg}sp|iZV\]OLTilcXbij}{rozvqp_bat}|~xs]Y\S_foj`dovlljpowouf^aedX`fsv|wfakf^VMTC=@HOV]_c\pw{vk}̻}}zvnfbvy}}}y{lcrx|~~z}sp}qqlszulwy\JD:BENIEP[YVXYeao}y¾xx{|q~ql^TLROZklbXjt~upsqsdakxk_KIYZ_WbkklvfdzjZ]cmitqn|{~}m_X_g]XYpxsejvuihsfZegkqj\dprbQ95:2=HWVLQeqors|wqjnxslqz~}xxomsfbert|{zorTSa[KNGE5XUbs{f{wxDZtiN#"-Vǵɰ}Zui^ahjkzywSfP_J>:JXWflY4F4(;&ACFV_ajf~~svӺ̸ֽwF03.[dͿ^QhCOAHTDW@MJTE[LLh\tzqeeXchpQ_`blRWaxpuxwWbuXr^phbpd|ǹwr}~iwlmlXEKNcxܷġ~pi\fhVR?02FCDPhlclfgVq]oYbemhown}|zqox{x{ixiz^dQMZLgz{TbBXTYTJ]]j^s`~|vVlScXBF]\ZZa\EhVSjf­ƭb_{rscgxoqqtu~|}W[KO?Q^ӵnw{bfubUXPSTXzuh[YT^bUe_xfl~u{s}~gZs\LY_UD\kƹԻum7JF-E.L\yu}iz{bxntpbCTSTkW]z{|e{{]kk{ow{ujnv|t`rvoZ|imTdVa:J2D,49Dy}ֽ}~wvl|teSW*Pji}Ul`i_Ui}yqonnQShN\HVNCmw}ȱvhzbDGB2!0!#MbƝyvduh`e?Tb\RSP^Uinr~w_m}yadfyp{g}}gfwpbJNJW6XG9?Dn⵿|lUP\fxtoO@IIhkqvo~}gXdvJ"'3>gntpomM.47;>,B6I>K`i^ǪyaxyqZatlbl}knbcXahutvQqxpY^|t}ivx}tvipa_`^qZGZcnXjjnyrv[X~rvŷ{xZ/9DGNYkw|quyoSHZecZjlnrdicw|s||{x}~^hy[pry];C1;>dz~}ryu~|wzkeT=QUYp|fD[h]bYks~~zRjqfmmfU7\QP]joy|ijvi`MHQJzxgbpzrsw|}e}z{w`Y}xiuwlqnsugUilub]m~l{tyvĻ|kiI4 -.(:F9?c_yǼ~waWubr~rfLM]V]IOfwwru~}zizqszn|mZrxwcWmwrpjYcsbokMQ2@CDjejġ|}zYmZmdWokaVRnp}vҰp|g\NO_Zjlf^Ki|os`nz}uf~{xjaO:M?<%.-@/EHfkǶ}jkitr_inssnrzv`kaYifzxZg{{u}~ifqhO]Khz{u_UfskmopniHas|x|uOkzi{nkpbqmk|rt\na];`mdqdhmQXyym[9bzv{xn{rhczZN[`@N6Ya[gYcc_wdfniY?;GQmvhVR_}i{teIR_yYEEOOho|jrz}pb`WqmfIGJZktwtnkxq~x_VZ~ut|}rlz~|xvlZfzvsmT[byvz\q}obeU63)WYX7EGGPTlw}ľɷks_Taja^=L[_Xc{m|nxsot~qplo~}oplf]m_Vgs~uQpy|kZ^WbfQ4PhpoNiglferqnɪwfc~~}xkup_z|nagOPL=Cd[ghjyvs~||qinwjx~U]B@A=(+3TekNTbjyoqqtcj_Xbllwyt[ss{ah|ryxXvnkskgZYifdwyoybnthXcVptsueffgjoqxuxrienaVZoo~Pab[Q]jpes{xllsv|xdttf|}yaaaqdcg\Nek{fWUVcOQehwƩsiubO]^knmzkzgfqwjlfzxob[TUJOLV[tw]kknvlqr{urseRUgntGQX^K@LSNggy}impVp~{{|~x|crmurqwZYzo|b}z|eprp~|x]BbG03K^b|}sm}^vuXe`tqz{rkmoopy~oypimymtxvezT^]XfW[dgUymvnynkjvwm[cjks~nt}nufjmxxixvyvuwsy}sylsunXiq~tfhd[[hqodkdkg[TSNJQ[mtýʵ~w{~|jqueleyyyfk]e_hoy{xloi||wvvpzregjp_sluZR_HWghiwm}xx{zt}}~vvdtj_ohsxyy~{zhJ^ONRRZQOYUPcMF_ejhvxow}ztq{y|srpu{xyglnxixuutjc[bXXSg_jrhrf}py|u|}{rnol{uhioro~wyzu|omtnzvri]Ta@Ubam_ihmjskek[mmsq{vwwzy{|tx{rvlrutz]mkWWXXfgy~~smukq{vumnrqixlz{ik]\`dqwz|}oomp}v~yuyrfp~~ygslxjuxylynlarn_iXfYuZ]\P[Ikiheoents~}wucuw{{~obx^af]fplw~qtyemry}wsfgnnrXS]Y^]_iX]cWUige}y}}njhdiqzhrmpr~|xx}~fzcxpcr`ZWeI^LPKHKKXY{`nmysxtvnpruzx~ypvs{p{kfxovv~{osphYfcYud]ZXh_cvrnymfljhaloyxz|zx}suup|{{o}idfepuuuq|xmk\^Z_OkWieegkq^fR\TYhmq|ffvekz~}kvuu||{}~r{|r}ruqxxeecbikkylpxshzzvt~r]q\]mklvoni^e\Q]``kwox~~byhlymp|x|u~ytryturrwxpomwcpgol}l{iiw]aNXLea`rfwbac^Lmkww~z{|uwhwfp~gfmrunypwuu{vqqu~z{ct^OYVkhbd`SdZT_bnq{}wx|rzvwu}zlxy}ppegZswu{jhecbTEHEWgcohpwpluux}x}{vxzrz~yy{}~k{~qziciukn|h_maZYcxm~|ifudZcurpoq||yqs}phqrz{xykt]MUbc|aufvihiU^gn^y{ortjhs~f}u{}z}z}{sqzio~~zox}k~z`gg||z|yahmmiklnofkX_fbzq`__p~u~yyw~v~uw_gu}ypmkaizyysovhd\j]hW]se{kc__jvomvgy{{xs{wzyu|xqtbdly}lhpuumk_livh_YSWlUNbduovpnmqyu~~yqm~~sqqwyqmlkgtlgrmqfVS\nWTd]gnt]jyy|sftofx}bsghv|Zdnx{htmnnslmuocchkvnz]`^Veab]syvjsxgg\dfxy~utzxvwqzzpot}zyynbXplVfgnnlj\hksgzo_]e^Wgg|tlxg`[hj}||pzm`oxufv\mn{y~~wlyjswwkwrjxjrjsrct`RVLVUiilpxoSkVHQft{{{xxz~nvubpspitxor{ew|kw{kjbjlRhkqn{kopTZMWYWexnp}\q^^cmq}~qriuu|z~xrpg{hvv|v~p|~x~twejfg`txm|ndUMLAAYb`lnvmra`_aid}vx}wmiys~z{|~uoszfr{}mzsia_X^_[eotomcjRIURlls{ppecm]tt~{zy~tkuusz{st~p{{~mvs~wlScXX`rr{ptpTlQLU_\cmpqiwmX_i_kyv{miyxy}xxolnmjovvqtgudaQTahrw{}o_`XPVhozotmlmc_uvghnzrx}~~~vyw|wz}nimnpm}qrkWaj{rzzgilW_M]Z_jjjktVY_emhsu{y}}}}~zqfshfn}}v~gS\`fxyyqth^_^_ic_kqheiiop}|kwmu}}|}{{wy|v|ytskurtzgddssukhqjQQdeXXdffol]gmnx|ml|wp{}z_ds}ytufk]_jslptlsdhbkpi`bncvvljm}}uz{isprx|v|y|{totzw}|lfhkogoztlke]fesrfcV`qk_iszumzunrptxrtxgjjy|ut}pdnsoiigwt{xqqgkuwdlefkdlev{zs|tbjedl~zxv|qfq{z{{xkmz}xtuigzp]jsuojm]Z_`^liduurnwueir}mvxxj{tsvwvwzuhmvfpsqzqggswrp|mS_^Z`v|~yxsfyn`jw~ggrnv~w||pv}|{neecjhjhkrrjdq`aRT\kvs~orvgdnw~~~|v}zi}~sry|{snluyn{k^hjccp}wxwikh]Wajooy}usynhfairy}zms}p|px}u{xxuxs|r|usxssobh[`chvsw}x^k]UT\rrwwmzp`qmrjyz}~{}}~~tw|s|~xwfoweix}{q{qfj_hrko~yvhudW[^gpnt}omj^ijitwxv|}wzwzz}{}{z|s{ruslov{{}qce]^durzvwofe_YZf[irurprlbvmsyyz}xwuuvvzx~~pjrjouxwtth^`cmrx{vs__h[`jqqpilrhohu~nozwu}{w{w{t{|hskqsyzaweY`jokrv{ivsZeb_`mnyp~ygrwrx||qt}r}}u{~}{qx}v{}vxggmwwzpjcafj{zyrtngbttpijrnpotruxn|uqks|vq}w{zz{z{qeip|ztsnobhklv{uuneenzhquqnzmitu}qmvsn{r~u~wz_inz~~xgrqqx|w{}y|ovvr|xikegtuqlw~t}qumlt}||ut{{wqt}zphyzvnvv~vklpqt||pamvpry|{|xwot{rlz~}wvos{}tvzpqtn|tzt|yz{rjnohov{w{|not|~w}~~x|}~wqpr~rzkj|ypn{q{ufomlwqnos{{{rsxry|xx|{|tzuqv{tvr{v}kmhgnx{lxzpmxyv}urzquv|~}qfnsnwz}yrxffktutxsu~vyzzuzyzux}|kpqmv{ufvp_cm{zy|ouuqwz~v~u{~{ztor|xw|}zsvgfjt{{trtdfiuw|ylr~|y~y}w||yw|{pv{vxyuvrldgq~wvtvniafkqz|{qtl|{{|{}}}}yzv}}|{z|wtznopt~}sxlafhv~~qyperjups|xyyxrt|xtxtys{yu{{~{}}z~uzv|~}xnuknx~z~lreghnwx}~y}oeosjqytzltvmrvru|rz}z}~zwyy~{~wx|~qqimsxxnrojfrru|}~x|niwlmqrvpvqw|{uvntqqt~tyy}wpytvw~xwjnowy}povmqp~}zstwloiq{ulsnrwozvy|szvpzywv}{qw|}~xztv}lqhnq~~{|ntrmlst}s|osuq||xxlqvjqv~~|pynrwzzz|v||xtry~~}yrpwz}}vlm|vxxqys{wuzwxr{sojqtvruyxkltxzotz|zpwwv~}}}snxxv|zttpvwysntsqxxr}xkty}zx}~|quzpyx{|}y~zttop~yy{|~{}uuploz~upuw{{z~}}{w}}}yvyw~ovz~z}yxtsomxvvss|}z|wy~x}z|wz}q{ytxy}yz|ypmv{}y|vz}~~~}{wz|~v}~z{mutuwqopsx}s}yy|}~~w~{}yvspwlx{qqr|v||~{~w~|nv{y}~}sowy~}}v|sx}z|ss}|~{}yzyy{w}~n}yjpr~~vxxutwz}z{zy|}|}{~~}{~}tx|utpx|x}rnu}||zjr}y}y{~y~~y}||wvx{tw|~~|~}{z{~|zvmrty|}rnqqx||{vsnzv~{wx}wvx}}r|}z||xxz~}w{{|}txv{y{|vonu~z|vlypszyxzzox|vtsssxv}~~{p{mqu||uyy{|~|{|s{qwyumqst}}yxkxvut||{tzzqrwq~vzowr||w{vxsuwv~prv}z}~xyysrzr{wporz}uovrvtyt~wy}wzwjwrlpv~x~|wpp{~~~x{~t|r}x{{sry{}||v}qwx~z~trm{}}xxutvz}z~uyqnwpvr{~xxjmrz}}wz}}~~~}y|}tylsv}}|t~wxtx{~z|yzvz~quotw}~|yrvopv}{m|nuu|v|~|{v|{{w|xuwx{qr}y|{{~y|xtkvytzx{zvnkp{}x}xuy{uz}tt}}xy~}s~~{w{|~|p{wv|~us}xnmw~t~uu{|z}{~zxt}~~zuty|v~tuw|~wsrz|~q}~~{|y}}|yy|xytvxwwuwy|xx||}}{v~z}yxuyxzx{|yx~~}x}z}~r|z{wzt{}t~||z~{~|~z|~~}{||tzuvy}|yz~z~~yz}{|u{}}w}y{y~}vq~z~~t|w~}zxru{~yz||z|{|zwy}z}}|ux}}y{}w~uxxw|qu}|~}~|z|wqz~}}~ywry}{z|||}rw{~{szy{~uv~}{y{yx{xzux}y|}yx|qxx~|uz{}|}zzz}vwwyuzyxz||~t{zxvty~{{|~}}p{upvw|x{vv{|v|y|}vuz~{wt{|~|r}y}~wwwvy~}zvxxz~vxv{pvx}vrotv~t~z~|{wzzy~}tvyyxxyyzyz~zy{|qy|qtx~~||wrtx{zw}~wwx{}{u{~}u}{y~zv{~~zy~{xwp|~{zz~|||~vp}uvy{y{xrnrx|||tyz||x}}u~}~xz~~~{|st|~~w|{}{~z~~z}~xxyw{}z|w}rwy~xp~qqxz~~q~|xx||}yzy~z|{{zz}~sx}~|}}xqxw{{sts|}xvvy}{zwv}|~{w~}vvz~|}y}v~xzuztsvy|zwy|~w~{}|w}~{|{{}~xy~y|x}vzvz~r||~z}}z|{~z}y~~|zxz~y~w}}w{{{|~|~|~||z|}|}{}~}}z}}{{x}~{~y~|v{|z~x{}}v|y{}{~{w|xz~|{y~|~w}}||~~{~}xu~}s||}}z{{x~zyw|}z}y|}x||{szw~x~{~~~w{|}tz~z{rz||}zwxwy{|~zy}wwv~zxzyxy{|{}|v}||}xz~ssy~~}}uxyyx~z}z}||wzz~|y}y~{|x|{zuz{~z}v{zvvz{w~swxz{y}{|||}yyv~y~xw~~xzwx~wz|xzzvy|w}|~{{utsz|{v}wqtw}~r|}~|~w}~z{{x}{{}xz|~|{wu|{w}~||zy~~~}||vzxv{~z~~~rvy~xw|ytyy}ux}z{~yz|~|w||w|~yyy}||{~}ws~}~z~}{xr}|vz~{{zutsz{|}z|{z{~}y~y{t{|w}~~{v|{~zz~utz{z~~y|z~y}~||}xwv}~xs~wsw}r}xy{~x~y|zx|zz{{{}}{|y~~u{~~zuz}z}uxz}{y{u|}}|sy~~|z}}{|x|~vwy}~zz|}y|~~z~vzx~~~z}{~~|z|y|}~}y}}|wy|}~z{}zu}|{~v||z~w}{{}y}}}z~}{w{}{|{~{~}~~~{|~~~|}|~~|}y{}{}~~|~x~}~{z}~x~~w}~}|~v|~||}|u~~||}}}~{x~~w{}|~~~~~}|y|{~}~}z{|t~z|z|}~{}z}x}~}wz}~~{|||x{z~}x}~~~y|zy|y}{z{~}}|~x|z|zvy|~~{y{}|{v|}|}~~w~}{zz~||z}~y{xz}}~y~{|z|yzvw{y~{yz||~}~yy||~xz}|yx{~xzzy~}y{|zxy}~x{~|x~{wy~|wwxvy}~|~w{~}~|~zz}zw|u}|}z}yy}}zxyvz~y}~||x|~}|~x~~|{|||wv|~yw~}vx{~tx~{z|{x~{|~yw|xy~zyz}{{~{xv}}{}~zzv}~{y~{~uxx{}y}~~y||~~}zxw|~~v|~|z|y~{z}zxvvw}||{~z~{y~y~}~~~~{|x|{uyxw}~w|}z||z~~yy{u~z{}~{|z}~ywzz|y|~~}~}~u|~~~yx}{wxz}ty~~y{|zw~}~~zwy}}}~~~yx~~|}x~|~xz}|~{~|z{y~}zywzy}}~}|}{}~w~~~~y}{x{|~~w~~|~{}}u~{}~|z~~}yzy~z|z{|z}{~{||z|{|}zx~~~}}u}~}~~u~}{zzz~x}}}~z|{{}z}~|~{~v~}}}|z~||w}~x{~|{v{~w~{|~~{}|z|{~~~x|~}|~}y~~~|{z}|~|}|~{y}z}~~}|w~~~y~{{}}|||}z~y{z}|~xz{x{|}}z~{}zzw}|z{}z{y{{{|{{}{x~~}|xz|y~~~}~~z{{z~zzxy{{~{~y~~}|||z{y~v}}}}~{yz|{wzxy}}y}~{z~|}|~y{~~~}|x{|x}{y||wx||{|{~~|y{vzz}}||z|}y||}~~~zw{{}}~}}w~~}|}~yyx|}~z}{{~}||xx~~yz~|~|{z{{|zzywx}}}{~{~~zzx~~~{}~~|}{~|{{zy{{|{z}}}}}}|z}w}}|}}|~||}ywzz|~z~}}|}~}y}~}z}}x|{~~wz}||z{w|~~}zz~|{~~~~{y~}}}x{{z~}{}}~|{}{{~zy~z}}~}~z~}{|{}|}~z{~}{x}{~}|~x~{}|z}~}{~}~y~|}}z|~{~{{~}~~~{}x~~|~w|~~x~~}{~w}~{~}}~y}z|{~{{~{|z}~~{|~{v}{|}}v}y}}||~y~|}|z~z{~~|~~y}~|}~z{|{{z|~~~|z~}y|{{}|{||~~z{z{~~~~~{|~zz~{z}~~}}|{{w~~{y}}}~yz{}y{}{|~z{~|}x{|x~}~}{||}}wz{y|}~|~z}|z}zy|}y|~~~{~zy|yx}yy{~~~w}~|y{z{|y|}~~|~}{z~~zz}|{{}}xz}{z|~}}y}|w|{}~{|{{|}~~xz~{|~~~}zy|y|~}~|}~y~|~~~y~{x{~{|}{}~z}xw~}z|~|{}{y}z|y||xy|~{|}}}z{w}{y~}}{~z}|}~x{{z|}{|~~}|{~|z}}x|}}~~|~||~ww}y{~~~y~}|z|{}}z}~~~{|{y}}}~}x{~~}}z|w~~}}}||~zz}~~{{{}~}}y~{~}{}}{}}{{}|~~{~{z}|~~}~z|~~{zz~~}{|~{v~{}|~}~~}y~|~}{~|y~}}~}}y~}~|}~{|~~|~|}{~}~}~}w}~}x}~~~~}x~~~}}~x~}~}z~~}{~{~|~}|~~|{z~}}}|~{w}~}}}}y}{~~|~z~{y}}}~~}z~}~}{y~~{}}{~}~|~z}~{}||~}~}z{||}}~}|~}}{|}|{~}|z~|y~~{{~}~}y|}}}{~~~~}~|{}~y}~~~~~|~yy~{|~~|~~}z~{y|}z~}~}~~}z|zz{{|}}y~~}~}{}zz{z~|~}{~||}~x{~|}}~~}z}~|z|~}}{~}y~~|}z||{}~~~yz{|}~}~y|~~z{|||~}{|~}{}}{{~{}}|{yy~}{~}{||z||~~|z}}|{|~}z~~~~~|~|y}|x~~~}{|}~}}w{|z|~|~~~|{~|z~~z}~~~~}~~{~xx{{~~~z~~~z}z||z~~~}}}~~y{~~~}z}~}}}|}y~~|~}}~yz}~~z}||~}}~~{~|}~|}|{}z{}}~}}~{~||~{}~{{}}|yy}}~~}||{w~|~|}|~|x}~}{~~|w}|}}}~y~}}|~}}{}}}|z~|~|}w}~}~x~}}~}w}~~~~w~}~}}~~z~~|~~|}|}{}~}}{y}~}~}~{w~~~|~}~zy}}~~}z~}yx~|}}~}{~~}~{y~}{}}|}|~{~{}}}{|~~|{z}|}~|}~{~|z~~~z}}}{}z}~||~~}x|~|~{}~~}|{z~~z}~~}~~|}~yz||~}|~|~~{|y||z}|~~~||~}y{}||~||{~~|||~}{z|y}~~|{~}}}}xz|}~~~~{~}{{~|||~{~~~~{|}{}~yz}|}}|y|~}{{}{{~|{}}~~||~||}|z}~}~~|zz~|{~}{|}{~|~{z~}||}~}y}~~~~}|~{{~}y}~}}}|}~~}x{~{|~|~~~|{{z~~{~~}}~~|}}yz}|~}||~~~~|~{{|z~~|}~~~}xz~~~}|~|}~}|~z~|}}yy~~}z}}|~||}|~}~}}{|}~|{~}~~}}~{}{~{|~}}||~~zz}}}}|}}~{z}~}}|~{y}~}~}x}}~}~~~z~}~~|}~}z~}~|{{~}}~}z~~~~|y~~~~~}w~~x~~~~~~}}z~}~}|}}z~}~|z~}~}~~|y}}~|~~zy}~~~|~~zx~|~|}~|~~~{z}~|}~}}|~|}}~~~z|}~}|~{~~|}{|z~~z|~}||~z|~~}}}}y|}}~{}~{{z}{}~}}~~}}}y|~}~}{}~~|}z||z~}|}~}~|x{}}}~}|}}{|~|{|}z~~}~~|{~~}~~~}xz}|~~~}~~{~{{|{|}{~~}}|}||}y{}}~{~z|~|{|~{z~|{~}~~}{{}}}|y|~~~~~|{{|z}~~}||~|}}{y~~|}~~}z|~~~||~z{}z}}|||~~~~|x|||~~}{}~}{{y~|{~}|{~~~}{x{~}}}{}~}||}{|}z~~~~||~~|xz~~~}}~||}|}~{~}~}~~yy~|~{}}||{}{~|}~~}z{}~||~|}~|}{|z~z{}}|||~~}~z{|}}~{}~~~~zz|~~}~|~~zx}~}~~~~|x~}~}}~|y~~~}~|}}y~}~|z~{~}~~|z}}~~~~{y~~~}x~~~}y~~}~~|y~~||}z~}}~|{}}}~~~{z|}~~}~~zy~~~~}~~{y~~}}}}|~~zz~}}~~~~|||}~z{~~}~|}~}}}|z}~~{|~}|}|}}}~~}z|~~}|~~||{}|~~||~~~|z}~~}{~~}}{}}{~|}~~|x|~~}|~~|||{}~{~~}}|~}~}y{~}~}|}|~~||}{|}|~~}||~~}~~|z|~}~~|}|}~}|}~|{~}|~~}{|~~~~|y|~}}|}}{}}}|}~}~~~|z~}}~}{}~~}|{{}|~~||}~~~~~}|z}~}~~|{~~~}||{~|{~||~~~~~{y}~~~}{~||}|}~{~~~~}}}y{~~~}}}||}|}~|~}}~~}z{~}}|~~}}}|~|}|}}z{~~}~~|}~}~}|{~{{}}}}}~}~~~{|~|}}~|}~~}~~z{|}~~}~~zy~}}~~{y}~~}}}~{y~~~~|}}z~~}~}|}{~~~~~~|{}|~{y~}~~~|y~~~~|y~~~~~|x~}}|}z~~}~~||||}~~~~zz||~~~~zy}~}}~~zy~}~~}}|~}~yz~}~}}~}|||~zz}~}~|}}}~}|{}~z|~|||~|}}|}~~~|z}~|z}~|}{}{~~}|~~{y}}{~~}|}|~~{~~~}|}|x{~~~||~~|||{}}|~||}~~~|y|}~}{|}~}||}{|}|~~~}|{~~~~~{y|~~~~|}}~}{}}||~~|~~~~}{|~~~~~|y|~~~}||}}{}}||~~}~~}{{~~}~~|z}~~}{{|}|~~|{|~~~~}{z~}~~~{z~~}}||{~}{~~||~~~~{x}~~~~}{~~||||~~|~~}}}}~|y{~~|}~~}|}{}}|}|}~|y|}}}~}}~}|~|}{}}y{~}~}|}~}}}~|{~~{|}~}}}~~}~~|{}~{}~~}|~~}~}z{|}}}}~~{z}~}~~~~{z}~~}}~{y~}~}}|z~~~~~~}}|{~~~{{}|~~|z~~~|z}~~~|y~~~~~}y~~}}|{~~~~~~|}|{~~~~{{}|~~~~{z}~~}~~~~~z{}~~~}~}~zz~}~}}~~}}}~~{{}~}}}}}~~}|~}{|}~}}~}~~|}~~{{~}z}~}}}~|~~}}~|z}}{}~}|}|~|~~}}~~|z|~~||~}|}{}}|~}|}~~{z}~~~~||~~}|}}||}|~~~}||~~~~~{y|~~}|}}}|}}||~}~~}}{|~~~~|z|~~~}|~|~}|}}||~~~~~}|{|~~~{z}~~~}|~||}|~~}|}~~~~~}zz~~~~~|z}~}|}}|}{~~}||~~~~}{y}~~~||~~||||~~|}||~}{z|~~~||~}}~|}}|}|}~{y|~}}~~|}~}}}~}|}}z{~}~}}}~}}~~}||~}z|}~}}~}~~}~~~|{~~z|}~~}~~~}z{|}}~}~~~~z{~|~~~~}~~~zz}~~~~~~{y~~~~~}~|z~~~~~|}|z~{{}{~~~|z}}~{z}~~{y~~~~~|y~~~~~~}~|z~~~~|||{~{{||~~~~~~{{|}~~~~~~~zz}~~~~}~}~~zz~}~}}~~~}}~}z{}}~~~}}~}||~}z|}~~~~|~~}~~~{{~}{|}}}}~|~~}}~|z}~}|}}|}|~}}}}}{z}~||~}}}|~}|~}|}~~{y}~~~||}|}}|}~|~~}||~~~~|z|~}|}~~|}}|}~~~}||}~~}|z}~~}|~}~}|~~||~~~}|{|~~~{z}~~}|~}}}|~~}|}~~~~}{{~~~|{}~||}}~|~~}|}~~}{z~~~}||~~}|}|}}}||~}{z}~||~}}~}~~}~}|}~|z|~}}~}}~}~}~~}}}~|z|~|~~~}}}}~~~}|}|z|}~~~~}~~}~~~|{~~{|~}~~}~~~}{|~|}}}~~~}{|~|}~~~~~~{{}~~~~~~{z}~~~~~~{{~~~|}|{~~||}|~~|{}}{z}}~|z~~~|z~~~}~|z~~~|}|{~~~~||||~~~~~{{|}~~~~~~zz}~~~~~~~~z{~}~}~~~~}~}z{}}~~~}~}||}z|~}~~}~~}~~~|{~}{|}}}~~}~}}~~}|{}~|{}}|}}~}~|}}{z}~|{~~}}~}~~|~}|}}{y}~}||~|}}|~~}~}}||~~~}{z}~}|}~~|}}|}~~~}||}~~~}{z}~~~}|}~}|~~||~~~~~}|{|~~~}{z}~~}|~}~}|~}}|}~~}|{{~~}|{}~||}}}|~~||}~}|{z~~~~}{{~~~}|}|}|~}||~~~}{z}~~||~~|}}}~~}~~}|}~~{z|}|}~}}~|}~}~}|}~~|z|~|}~~}~}}~~}|}~|z|~}~~~}~~}~~~|{~}{|~}~~~}~~}~~|{}}{}}~~~}|z|~|}~~~~~~z{~}~~~~~~{{~}~~~}~{z~~~|}|{~~~~||||~~~~||}|~{{}}~|z}~~|z~~~}~|z~~~~}}|{~~~~||||~~~~{|||~~~~~{{~}~~~~~}{|}}~~~~}}~|{|}}~~~~}|}~|{|~}~~~~~~}||~}||}}}~~~}~~}||~}||~~~}~~~~~}}~~}{|~~}||~~}~~~}}~~~}||~~}|}~~}~~~~}}}~~}|||~~}|}~~~~~~}|}~~~|{|~~~}}~~~~~~~}}|}~}}||~~}}~~~~~~~}}}}}||}~~}}~~}~~}||}~~}|}~~~~~}~~}}|}~}}}~~~~~}~~~~}}|}~~}}}~~~}}~~~}|}~~}}~~}}~~}|}~~}~~~~}}}~}}}~~}~~~~}}}~}}~~~~~~~~}}~~}}~~~~~~~}}~~}}~~~~~}}~~}~~}~~}}}~~~~~}~~}}}~~~~~}}~}}}~~~}}~~}}~~~~~}}~}~~~~~~~}}~~}~~~~~}}~~~~~~~~~}}~~~~~~~~~}}~~~~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m33.bin b/applications/SprPoP/assets/packed/MUS/m33.bin deleted file mode 100644 index 5c9c638..0000000 --- a/applications/SprPoP/assets/packed/MUS/m33.bin +++ /dev/null @@ -1 +0,0 @@ -{yw}yzy~}}{}~y~y}v~w{y}|{{}~z{xy{zy}}y{w~yw{y|{}y~y{|~}ywyz||z~}y|{|yy|y~~x}y{{yw~yzz~||{}|y}y|v~w{y~|z|}z{xz{{z~~z}yzx}z~|}{~z|{|xw}xy|}zx}{vzxzvwyx{|~v|xz|zy{}|~~}{||~|~}zyvywwvz{zzu}~w|zrxszyqw|tzv|wwy}{x~{|~{|}~||{|vt||tvv|yv{~su}vw}y}qrspyroy}vr|yuzrz~~}v~w{{~|}{}{~wsu~vtuyvz{s|wov}yryyzxlsnqulpzxrt|uvur{{}wx~|wy~|}}y|srxzrut}|s}us{qpy{us{xzpmqjspkuyvrx{rurtzyzs||yy|z~~~z~yvrtzvsuvuw|ovwnuzytwzxvmplltlpwxus|wqvquyzwv~}x}x{}}}v{|rtuxvut{{t}toyrqvxzszyvsnnipqnrv{tv}qtwnxxzxy}}y}y}~|t|p||qwour|zwxulrzuxl~wk~z{pmghxnvyzsqqt{prrs|vtz}zw~z~}|vxquvqrvtvzurjxxyqqnt~x{lmdqvpxz{ox|m{vnsrv{xt~z~u{xxz}svuvoxsz~s|romzwxk{}j{x{vijdvrrv|vn}sp}norq{vxx|z}z}~z}tyxnzytqovp|vtvrkt{zvpvqypnim{ty}uwq{|ptsu~vu{z}w|~}||~{zvyyrxwwv}uqlywxmtktyvwfi`orosxwjwvjypkons}vw|t|zz|w~}ptwmsxoqismvyr|ztmq|w{pqwpom~x}|v{xwuwv|yyz}yxyz}~~v{{x}{yt{v}}}wkwvstl}po{vtgg`hpjurukozmptmklmrwq~rz|{{}tnynnwjqnjmout{uyrk}uxx{vyrrk|x{y}}~|uwy{~|}y~}z~uzv||vszzyu~ztw~zwrr|pqqxsn~{yfibcqeqzplmurtnrrjmposx|rx}|}|}z{~owvjymjsohoto}yp|o}zovs~myqpwt{y{tr{uzu|~z{pixqpz{}~{~yuwwhz||xvw~uuiuvrzgcp_pei|wtjostwpziewnmyrmu}xz{~}~}t~t~rvhts`vxhhqntqqqr|yux{{ktpvzt~|xmyzx}}o}q{xw}}vjuxq~}{qs~pwowmzvstnumws\gckpgsyptrruprqilojykr|~r~zu{qt{pvyfjxmiwim~t{oqwt}y{xniniw}~|x~vt|q{yzuvz|~omzvy{|vxozwy~wwupuwwrryw`cYimnynrmp{uohxpgqfhp|~o}zz{|}wy||yn|isltnoqs|ny{}|srx~|llns~~y~}p{vrysuoxz{tzwz{ux||y}|yt|ws{~zzxuuxptwztjikbspwwue|xkuhjefmceu{wuxo|{vz{}y{xxpol^trprhifwzrzrz}vxuz{u~{xymnvuwrtmp~{~ww|lt|z}uxy|ks{z}qyetwuqttwyv}ywuctlo{|yot|w|xiebjvgy{o{{||zt||tv}|mrqp~tqnpurwlrvx}ynkn}}|sz~zukizzy~w}zx}ulq}|~~{wyvss~{z~x{v~wtwxwoy{rmceiwqrv|zrtpkvtph_cqks}qt|yyzxx|wt~~ossq{xnsmutuop{{u}|ysjnxy~}wu|znjtyvw}~u}~ypnw|}}yzyquz}z}yuzx~z{x}||}wwvnhajuvn{z{|suppxso`djjnutmzzw}|{vzz}sxu~zstxo|zontnvzkrwx|w{~tngv~{y}yw{viwst}}|xywyyrrqszyx{mpy{z}~{|st}ut{~t~y{qidatunqw{}qvsqxtjcpcjqmos}u~|t{tr{u|{xq}sxqmpum~sj{tx~wz~xpil~yw|yx~yor{l{|xzu{z|}ypumxz~u~ohuyw}|srxzxx|~~{wz{|jfanzqr~wxtzrvypeojbrklqyxwxwv||myvvtv{ytunnvnw{hwys~wy}qmiz|v}~v}{ro|ou~vz}y|y{{}rtpr}zq{i|~wu}wrlxtzzlysrr|~~{}rm`~~{zytnqp_mtrohn|x~t}~pr~x}~}}~uwziotpyprtzujvw{|suvke|vu~yuouytzyxz|xwmmvm{~{{~sroqvx{zvtvyx}|~z{{zw|z||o|~wblhozvzvuuslivsywm{yy}mv}yys}|irspufmxppjhrrnwqy|jpzstxsyrr}xn{{xt|y{}vpisqwvhtry~~}z{{~wx~~|xw|yq}{uockz~{z{vzyomipqpv{slxyrtouwtw~}{|w{xustvwjrokpgp|vtk}xurusxys}~{psz~w|}{~rngp|u}zkz~vwu{}trpy~s{uzzx~|xnuyw~}y~o{ukh^jxossluqw}mz|~z~rurmyu~ms|v{t{~vvjq|r{yty~}ueq{{y{z{t{w{{~z{~{lh^r|}~|xuuyvzu|rtuqyty}|xoxv|y~zz|wgu~yqilhlrq|qiwx~xot~{q{vo~yu|wzwnpwz}~|}thnt{uw|||nptomzruprvvvzz{lrdisxywpopsho|xymsrxszw~s}x{y|}wzqo}~}onqiqk{yfnq~~vktw|yytxn|xs{}{{~urry|vqqwzmwu|s}jfm~|swow|z{zz}}}w~ieevyszzzorprtu}~{onzsqyv~r{x}{uzkliz~}{qjjiwqplo{su~{q{{t}{uyvz}nmt||x}{|r{tzz~wtrw}pxyyllpzv}yqvwz}~}|~{qkpklwzxosnos|}{xwwpjo}u|||zyxpixryoirsgorxukswtvxz}|ts|qqo}|qx{{~z~uvq~vywuutuwv}szhm|~z}xzux{~~~yz{{{|wchn{y{zu|tnzvz~{hpmz}xz}~vx~ztpswxpwniksulpu~{xwsywt|}w~xutwznxvwt{}pqx|w}pq|rzuzijn{y}wxxu|}zxvigkzvy|}|}vy}unpu~|~}vkv{ny}|z|z|}{ntr~w}whmmxxqwqyyr~ysypw|}~yysxwqmw}}}zu~rvp|x}{pwtzxy}w}qpr|{}zyowz|u|t{z|xropqos{|v}rinr~~x|{zzsuqn{v{x{z{zwsw}ztmopwqp}{mmvw|}ooux~}w{{xyop{z{{uusvy{wvuwzqyzu||wqm|}squ~y{x}}|{v{xuefttzxiqqwwz~|vyxtip}v~{z~s}}}z}s{yvrspk{|~knoy{souuzx{t{~qo{wyr}}|{{{sy{}|wwpqvyyyhitzzpvt}y}{w|}}z{vxdgjuuyvpmt{pm}wysvkuv{z}w||||su}{zwkmvtwtnrp~z|rvtozv{{twwxlww~xxswz|ssunuwzz|spiru~{sz}tx~~vvz}~xvyzsmhinw{zuwxoqpzzzuyu|{xwos{{zyt{}prt{ytvzzpmx}}|}{nvpovvxuzxsopxv}{x~yv{sqrsxvsyrohuzwws~~~ut{{wvztleox{}{~vwvnuoxypvzmqnsy~z}~ss{~}y~{zsrrtzxxxty~}}}|{oonrxw{x~}}{{urom|~tw}z{x}xxtvyopw|}nuo}vywq~|zu|}w{zxy}rqktx~{~uzpjvu||{sxvzujqmz~wx~yxrt~tsppsx}zwwzsomvrlv{~tzxwsruw{}ty}wz~yxqpur~vxysruzvtwz|~~syzyw~}{zqmp~yz~xvrprwwy}|}xsvzxjpwx{z{z{lprumrovz}{u||}wsrumnpz|{|qt{u{wty~|~z|w~{}ust~wsvz{ss}|txxt||uu}|z|wyz{pqutvwrzsptu}zzsqv}upvw|y~~}~unuy~}|xsppx|tor|}wynlpr{vyzvuvwy}{vv}~y{}||{w}zyxy|qq|~yxsr|zxwxx{zv{z~uuz{vujkvy{vtwrtqz~{wux|~z~wwry|~y{|tvs{||ypsyzqop}|{pmsstpwytwv{z|u~{x}z}~xvu|~~}yvpu~|x|knwzyzsx|~zwt|zssvztgip~}zxsqsnr}|{ynwzswwzw}zwtx~}uzwy~~|vtyyy~|wvnsmnz}|qu}z{urz|{~~{}vvxz~qv{ywv|qmpwtsv~znx{zwuu|{nkmxzxuoqqsn|~ztlow~tuwt{}~|}}{uyw|yyx|y}xpvw}}|ypiqu}{wzzy}|wmq{{zzwwz{~y{|woxx|wsuu{vtrvyz{y}}yttvrqkvz~~xorrrrr~~{rnptx~pkry|x~{|yvr~y{tt|wst~}xwpovxtqsz}z{~xttsz{~y{~|xt{xtsqzu}zqpu{ttuuwtz{zz}z|zpkm{y~{ttvonqww~}soqx{wjpyy~{{~}|ntzsrrz~zts~|}u{wxxwsqnpwy|ztzy}ytuz|w}yz{{}~zrvtr}zspqx|wuns~~xr{{{}}{~{~smlp|}~{zytmnv{z|{~ystvw{~xpuxz~|zuu{{}rryx~zwvwz~xxz}~zsqmoou||voy||tqwz~yz|~xw~|xvuzuz|~xpmxsrrv|wtx{{sv{ylkrx~}~}|rurtwrv~~~~~utuw{rsu{|uz|~svw|{ywx{zyuw||{|ywomqotw{~vtv{~xvpv}utz{vz}|{wz{w{}vrqv}uvztx~~wu~zsqzuplq{~~~{uyynqt|~zzzvtyxv|ymuv{yvy~wpry}ywwx}xt{{}ywzurpoptvy}yw{x~|zzqvz}{xy~{}x}||{}{zy}zxqt{}xxnuxxz|ttstnqv~{|~}}yrotwyzxz~~vwotzyrrt|~{xwwsty~zuuz|}srw~~xx{wwtktuuyzwuz}xvsx|~|x{z~{x}|}|x~yw~wtu{~zrrw~~v||ywwz}~|tqnvz|~{qrxzvoy{z~z~rnpyypqw}{ty|}wvvx~zwyw|xpq|{~||zvtstuuyxyzsu}xxwu{}~~{~y|uu{}}}suzzxpryuvyy{{~~yz~vs~smms}y}~yzwyumnz~y}xqqs|}yrrw}}}vv{sx}xuxzztqu}}xx|{tuvusqw~wvy~~x{tt{|}|}}|vvv{}~|wrt}}ypnx{y{sox~|wx|yt|xlmpx|y{zqopnt{}vwvtzxstvz{{w||xz~|wvz|xrqx}zv{}}ytvonqw}vxyzyos|~}y{|x{u{wuvyy}z|uppw|troqz~vszz}vyvmmov{}}wupoqpx~xutuz~}tqqwxt|}u{~}wy{w|ups~{xy||yonnsvz}}zwxvspu|zyw}|{}y|zxz|zw{z~uolxzosos~zyy~{~wyvkjr||}ztvpqut|~{tutu}ukpt{}{yu}z~{vvy}xtsy}zvwy|{z}zvpptruvy~}zz||xvuou|~|{||}~~z|ytyy~tonx|tsts|~}z}~zxumlt{zy~}|wxurvuyz{|xsww{wmrqt}{||z|xpszxqsuz|~~{rs~{~~~~}wuustsqvy~|sw|{xppw{~{}xxztz{|wrtv{~}uvuu}}v|~{}}wqqovz~}{}yzvtvx{}yyvvvx}xnnrywx}srz~{usvtx{qqy~zz{srpquu}wtv{|utrv~|xx|{x|}xyyvx||xrmv|wxwy|wy|v{vmis~|~~~zywwvox{}~vxy}zonty{stxxzz}ztsrw{wux~}uorsruyzwuy}vwvsvz{zx}}~wv{}}zxyu||}rnu~zyywz{~|wy{tw{nmqz~xz}~~|wwsnq}~{yuzvprsv{ywsx}vwz~xssvy{|{wsw~~|zvqspsw{}vuy~zwtnv{|}|}~wwy}wyyw{{y}yvtw|z~yxrt||vy~{yv{urstvv{|vpqqs~|wury|rpnu{yvtzuw{zvuuuy~|pnuz~}{{rqsrxy{ytz|trsw~}~|~z{||}~~zy|vtxx||wpry~wsrs}zy~{wz}tmktxz||trrvsu}}ztvv|wlpu|~~{xx|~xww{}|vrqwzsnqy~~{yrttsuu{}{y{{wwyvuyz}yz~{yxrsyx{vomt|~{suwv||z|}|zx{wmjnvx|~xxxtuqu~}~yvxuyzruuu{|~}||xtw{yqsvz}|ywtpt}~|zuvsnqv|~vv}~{vppx{~|y{~~yrustxu}}poox{wxvu|yuz}~|{~qmlrz|~}{vrtrx~yuvx{qqot|}|~~vuz}|vvwuwyzywtsz}}zsomovw||xwytoov|~~}y{}{wsuvoux}upqvyxusx|xuz~ywwoorz}~~~{urrsv~ywz{}{olos|yxxv{z}{tsqsyz{zvuy~upppprx~~~{||usqpx~}|}~{{zxwutsqx|{wssyvvus{}{xwy}~|y|xrqt{~}{zururx~{{{w{umopw~zuzyttzupprvz}}{wv|zwrqqmqw~{wyxutqv}}~}|~yyurttvzv{xuv|zvwuw~~~}zuv~}~~}wtsx~y{~~{vuutu}~{~{wv}yqnqw|zx{wqtx}vpprs|}~yvtyz{vpqoqvy}xux|vtvu{~~}{{{}yxtvvrtx{zvx|}yvwv{~}|xvz|x~wtsvxy~~zvuwtrz{}}xz|xpsuz|}{|zttux{{vrqrx~~}wps|}zvprrrtv~}xw{|xxxw|~xwx|}yyuusnv}}zusx}ywyxy{|~}}{wx{wwxrnsz||xwtpnx}|}}|||vtvy~}yx}wsuw}}zstvw~}zurt|}{xtsrnqx|xy}yzvwz{{wvyz}{{vqstu|yxzrpv~yzvsv{}~}}xsy|{x|zpoqz}{{uqpos{|}}xw|}vuuv{~}|y}{urvz}}{vvwy}yxxvvv|~||ztpnqw|}|}~{xqt{}yywxy}zvstxvsvuyustzxvrqx|}~~ywx~~}~y~xrrsyz{~xrpqqrz|}xwx}vqps}}}z|{vtww}}wxuswx{{wtu}}wqrstvx{~}wtrx~}|yux{|wxxuuqovv|~xvuy~{rtrtxz}}}}|z||~|ytrsyz|~xvrqqov~~yyz{yppsy}~z|}uqty~{usqu|||xttxzyvuuqpsy~~}wwvu{~zzwy|{~{{ysqqotx{{vrv||tutpv|~~|~{wwz}tqrw{|}yysoqrw}{||{}}{sttw|~~}~|~~{rpv|xrqsw|{ywttx{}ztrmouz{{}zzwty~{|{yxy|xuoqrpwy}ytsv}|ussry~|}}|wty|zsqry{}~zwsrussz|~~|utsv~~|}~~xtuxz|usvuxyyzwttz|tqoorx|{yxtv|~}{uwz~vtqqrru{|xttzxsvuvyy}~{wuw||wsrv|~|xvtspozvrru|}yw}yvtu{}~zvustyyyyvtx{vprpqx}~}ywvuy~~}xvy|}~~xuuqsvtz~}}wuw}~wvvrtz~|||{xuz{}~ussy|z{}}ztqqqu~~}|tssv}{yvz|uqsv~~|tsruzxxywuu{{zwsrruzyxwuzzzz{zx{}yvvtvwuy|y~}yvx{}xttqw}|z|~|yy|~xutuxw{~yrquttyz||~wtsv|zzxw~ysqsv||usttxzy{wrqw}|zuvvuz}}~}wxvx}|xvvy~|wywvxutwx||xtvy~{rtvvz{z|{|}~{|~wrptxy|yxvvuory|~~}vtty~}{}zzwz}|wsruz~zustuzzxvqosz}}}xywvx{|yzwx|z{xuvxz~z{xvurrx{~ztpuzzuxwsvy{}|~}|}~|sopvxx{}|wrqnrz}wuuvyzz~zzy{~ytsw|ztttuyxtrqpszzzvsv|~{zutyz|xxvxy}{{ursru{{~}tqqwz~|vvrqwz|zy|~upprvxz}xqpqpw~~wtpsyz|~|{}y{~yuvzxuuutusssppv}wuru||wrqw{{}zzxy{}{xuqtvtxy{~vsrsy~~ussqv{|}yy}ysppuy{~{wsqssvuporyyy}{wy}|}xwyzzvtppstsrpqw{vvuw|wusswz|{|z{}~xvvtvvrwyzwrqt{{sttsx}~|{{~yqprxzx|}yxtsuuzyqppsxz|}yyy~|}xuvywqoortrssrsw~}xxxvx|}zvvssy|}}|}}}~{wyvttrtyy~{ussx{~~wtvvw}}}~{{~}tsrtww||ywvwww|uqpqx|{~|z|||~~~~wsuy~wppopsrtuspr{}yxuuz||~wutsx}|}|{y||zwssurvz{zvssv{~vvyx{~}{y{|urorx{||yxzww}~{sqptyzy}~}~yxyuuy{|zvqpoptttsppv~~xwuw{~|~}wuvux{z~{xxz~{wwsturw|}{vqqx~zy{yz|{}~{z||~upou{{|}~{xxus{}trrrvyy|zww{xwxx}{|yrpopttqrssvz~yxxuy~}}~zwwtsy|~}zxz{}}wxusutu{yz}ussx|~z|zvx{}~~{z}}wsstxxx|~yuutx|uroqx|}{xyxz|wuvy{{vqqqprqsutrsy~yxww|}}{wurv}~{{{|{|~|wwusvutwuy|wvtvy|zyvuz~~~}{{~zvsquvx}|wtwwy~tpptz{y|zyzz||vtvyz{xrqnnrttsqorzzyyx|yvvvx{z}}{zz{~{wwutvqpuv{}wtqty~|vxwx|~}~~~}}~}yspqvx{}{xxxvzysssuxwx|{{}|~yttw{~~||uooorusqooqw}{zxvy}~}|yywtwy{~zzzz}}yxwsqpnsvw~wrqty~~wyzxz||~~~{z{zrqqvz|~zxxvx}wtqquwx}}|~zutx{~|ztpqqqrpopprx|ytty~}zxurvz|~}zyzz~~ywtooposuw}usru{zzzvy|}}ywy|xsrsy|~~yvwuy}uqorwx{~~yvvy{~~}yyurqooppqrru||wusv{|vusuz|}|zzz|{trpopopvw{zvtuz}xyww{}~~{xwx{}}}vttx~~~zxxvw~~uqpqvz||{{xvvvz~~~{|ysonnqqqttuy|wvutx}}wuuty~|{{{{|{urroppotww{~ywwy}zxzwy}~|{{zxvy||xww{~}}zxxwy{trqtz}~}|{}zursv{~}|vonnorrtvvvy~|wvuuz~~}xwww|}|{zxxyusropqoruv||zyy|~{yzwy}~~|yz|zxvy}zyxy|{~~zxyxx|~}wtsv{~}|}}~xsqsuy}~|zvpoootuuwvtu{}xwvvx|~~{xzy{}ywuvywrrqpqontw{}zwy{~xzzy{{z{zz{{yxx{|~~zwuy|~}zzyuv|~}xvvx||{~}~}~zurqsuz}~yyvqqqrvvuussw|yywuw|}||z|~}}zvvvwyvstqoonqwxy{wux}~y{zwxxy{zy{|{ywy|}~wuuz~~{xvsu|~{xwwzzz~}}}|zvrprv{}yzwssssvtrrsuy~{yuuy}}xy|~~zxvvuvywsronqqruux}xvv{~~zzvsvxy{zz}}ywx|zwwx|}~}vtutx}~zvtuz{}~}~||}}ytqruw{}~~}{|wtusrsrsuuw{|wwvy}~{xw|~zywuuvyyrqqprrortv~zxxz}yvusvxxz{{|{yxz|}~}yxxz|}{vtvtv|yusv{||~}~}~~|}}}|yvsrstz~|}}~zvtqpsttuuuz~{yzxx{~|zzz}~{yvvwwxwrrsppomrux|ywx|}uvvsuxy||yz{{{yz{}~zwvz}~|zvuutx~~xvvx|{|~}~}~|}~|||zvqpsw}~|xrqpsuttttv{|{yvw|{}{{~~|yxwwvuwvttpnonpvx|zwwz}~yuwttxyzzxz}}zwwz}zxwy|}~{xuvvv{}{yvvy{{~~}~~}~}|}|}}zuqqtwz|}}~ysrrsusrtuuxzxvvz~}{y|{zxvuuxzvrpnnpoty{|ywx{}wvvuvxxy{{||ywvy|zxwz}~{xwvuv{|yvwy{|~~||~~}}~}|zwtstuvy|~~{xuutttssstvz~zxwx{|{z|~|ywvwxywtrpopqswz}}zyz}}ywvvvxy||{zyxwxz~|zy{}~~}ywutw|}ywwy{}}|zz}~~~}}{zywutsux|~|zxvuttttttux}{yyz}}{z{~}yxyyxwvusrqrtuwy{~|zz{~{xvuvx{||zyyyxy||z{|||}~~{xvvwz}|yxy{|}~|{yz{}~}|||{yvsrsvz~}{xuttuuuutux}~|||}}||}}{{zxwvvutuuvvvwxz}|zz{|~{wvvxz{{zzyyz{}~|zzzz{|~}{zxwwy|~}zyz{||{{zyz{}}|}~}zxusstx}}zwuuvvvvtssw|~~}|}~~~|zxwwwwxxwwvvvvwz|zxy{}}zxxxxyzzzz{|}~~{xxyz|}~}zxwwz}}{zzzyzzzzz{}~~~~}~~}{ywutuy|~{yxwwwwvtrrty~~~~}|{|}~|zyxxyzzzyxvvvvxz~|xwxz}~|zyxwxyzz|}~~~~~~zxxyz|~~{xwwz}~{yxxxyzzz{||}~~}}|{yxwwxz|}|zyxwvutsrrty~}}~{zz{}~~{zyyz{|{zywvuvxy{}~zwwxz}}zxwwxz|}~~~}}~|yxxz{}~~|zxwy|}ywwwyz{{{{{|}~}||{zzzyy{}~|zywvutssssv{~}~{zy{|~|{{{|}}|{ywvvwxyz{~~{ywxz|~{yxxy{}~}}}~~{yyz{|}~}{zyz}}ywwxyz{|{{{|~~}||||}|{zzz{}}{ywuttttttvx}~}{zz{|~~}|}}}}|{zxxxxxxyz}}{yxy{|}zyxz|~~~}}}~}{yyz{|}~}{{|}{yxxyz{{{{{|~~}}}}~~|{zzz{}|zxvuutuuuuvy}}{{{{}~~~~}||{zyyxxxxy{}}|zyyz|}{z{|}~~~}~~~~~|zyz{}~~~~}}~|zyyyzz{{||}}~~~~~~}{zyz{~~|zxvuuuuuuuux}~}|{{|}~~~}||{{{zyxxxyz|~~}{yyy|~}}|}}~~~~~~~~~}{zz{}~~}}~~|zyyyz{|}}||}}~~}{zzz{|~|{ywwvvvvuuvwz~~}|{{|~~}||}||{yxxxyz{|~}zyz{}~}}}}}~~~~~~}{z{|}}~~|}~}{zyz{||||||}~~}|{{{{|}~}|{yxwwvvvvvwxz~~|{|}~~~}}}}|{zyyyyyzz{}~|{z{{}~~}||}~~~~}~~}|{{|}}~~}}~|zzz{{|||||}~~~}}|{z{|~~}}|zyxxwvwwwwwy|~}||}}~~~~}|{{zzyyyyyz{~}|{z{|}~}||}~~~~~~~~|{{|}}~~}~}{{{{{{|||}~~~}|{z{|~~~~~~}|{zywwwwxwwwy{~~}}}}~~}}||{zzyyyyyz{~~|{z{|~~}}}~~~~~~~~~~~|{{|}~~~}|{z{{||}~~}|{{{{}~~~}~~~}|{yyxxxxxwwxz}~}}}~~~~}}}||{zyyxxyz{|}{z{|}~~~}~~~~~~~~~}}~~}{{|~~~~~}{{{{|}~}||{{{|}~~~~~~~~~~}{zzyyxxxwxxz}~~~}}}~~~~}}}||zyyxxyzz|}~}{{|}~}}}~~~~~~~}}}}~~}||~~~~~|{{{|}~~}||{{{|}}~~~~~~~~}||{zzyxxxxyz{~~~~}}}~~~~~}}|{zyyyyyz{|}~}||}~~}}~~~~~~}}|}}~~}~~~~~||{|}~~~}||{{{|}~~~~~~~~~}}|{yyyyyyz{{}~~~~}~~~~}}|{zzyyyyzz{|~~~~}}~~~}}~~~~~}}}}}}~~~~~~~}|}}~~~~~}}|{{{{|}~~~~~~~~}|{zyyyzz{{{|}~~~~}}||{zzyyyzz{|}~}}~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~}}|{z{{|}~~~~~~~~}|{zzzz{{{{{|}~~}|||{zzzzzzz{|}~}}~~~}}~~}}}}}}}~~~~~~~~~~~~}~~~~~}|{{z{|}~~~~~~~~~}}||{{{{{{{{{}~}}}||{{{zzzz{{|}~~}}~~~}}}}}}}}}}}~~~~~~~~~}}~~~}}||{{{|}}~~~~~~~~~}}}||{{{{{{|}~~}}}|||{{zzz{{{|}~~}}~~~}}}}}}}}}}}~~~~~}~~~}~~~~~~}|||{{{|}~~~~~~~~~~~}|||{{{{||}~~}}}}||{{{{{{{||} \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m35.bin b/applications/SprPoP/assets/packed/MUS/m35.bin deleted file mode 100644 index 40340d0..0000000 --- a/applications/SprPoP/assets/packed/MUS/m35.bin +++ /dev/null @@ -1 +0,0 @@ -}zyupnlhefcabcbbcdfiknrtv{~{|wsnjgd`_^^_abcfimquyz~|xuqmiea]ZVTQQONMLKKKKLLMNOSUX\agnxs`gkv~}}}~~{z||yvspmkgeca`^^\\]]_`bcehjmpsuwz|~}|{yxwwwwwwwxyz|~wka^ev|snllmoqruwy{}~~}}||{{zzz{{|}~{qiddjuwpjfcb```_____````_____^^^^^^^__``acdfhilnpsux{}wnfa`clx~vojfcba`````````````_____^__^__`aabcefhjlnpruwz|zrjaYSOPU_ky{rjb[VRPNLKKJJJJJIIIIIIIIHHHHHIIIJKLMNPQSUWY\^acfilnqtvy{~xpic_^bju{uqmlkjiiiiijjkkklllmmmnnoopqrstuvxz{}}xuv{~{ywussrqqqqqpppppppoooopppqqrstuwxy{}{slfbacjsztnifda`^]\\[[[ZZZZYYYYYYYYYYZZ[\\]_`aceghjmoqsuwz|~zuohaZSNLMRZdp{~wpib]YVTRPONMMMMMMMMMMMMMNNNOOPQRSTUWXZ\^`bdgilnqsvx{}ztmgb__bhq}zuqpmkjihhgggghhhhiiijjkklmnopqrtuwy{}~xtrsx~zxvutsrrqqqqqpppppqqqqrrstuvwxy{|~}voidaachq{ztolifdb`_^]\\[[[ZZZZZZZZZ[[\\]^_`abdegiklnprtvxz|~{vqke_YTPOPTZcnxxrlgca][XWUTSSRRRRRRRRSSSTTUVVWXY[\]_abdfhjloqsuxz|~{upjea__bgox{xuromljjihhhhhhhhiijjkklmnopqrtuwyz|~}xspoptz~{ywutsrrqqqpppppqqqrrsstuvwxyz|}}wrlgcaachnvzvsoligecba`_^^^]]]]]]]^^^__`abcdefhiklnpqsuwxz|~{wsnic^YURQRV\clu~zuolifc`^\[ZYXXWWWWWWXXXYYZ[\\]^`abdegiklnprtvxz|~zvqlgc`__afmu~~zwtrpnmlkkjjjjjjkkkllmnnopqstuwxz{}|wspmmnqw}}|zywvtsqpomlkjihhgfffefgghiijlnoqsuwy{~zuqmkiilpu}~|zyxwwvvvuttttttsrrrrrrsrrrsstuuvwyz|}~}zwtqmiea]ZWVVX\ahpz~|{zyxwvvvvvuuuuvvvvvvwwxxyyz{|}~{wsqonprv|}{zxwvuttssrqqqppooonnoooooopqqrstuvwxz{|}~|yvrolheca`acfkpw~~{xwutssrrrrrrrrrssssttuvvwxyyz{}~|xuronmmnptx}}yvsqommlkjjiiiiiiiiijjjkllmnopqrstvwxz{}~}yvspnljjkmpsx|}zwtrponmlkkjjjjjjjjkkklmmnnopqrstuvxyz|}~|yvsoljgfffgikosw|}yuroljigfeddccbbbbbbbcccddeefghijklmnpqrtuvxy{|}|zwuromkjiiiknquy~}{ywvtssrrrqqqqrrrssstuuvwxyz{|}~~|yxvvvwx{~}{zyxwwvvuuuuuuuvvvvwwxyyz{||}~}{xvsrpoooprtw{~~{xvusrqponnmmmmlllmmmnnnooppqrsstuvwxyz{|}~}{ywurpmkihgffghjmpswz}}ywtrpomlkjiiihhhhhhhhiijjkkllmnopqrstuvwxyz{|~}|zxvtrpnmmlmnprux{~|{zxwvvuuutttttuuuvvvwxxyyz{|}~}{zxwwwwyz|~}|{{zzyyyyyyyyyzzz{{||}}~~|zxwusrqqqrsuwy||{ywvutsrrqqqppppppqqqqrrrssttuvvwxyyz{|}}~~|{yxvtrpomljiiijklnprux{~~{ywvtsrqpoonnnmmmmmnnnnooppqqrsstuvvwxyz{||}~~|{yxvtsrppooopqsuwy|~}|{zyyxxwwwwwwwxxxxyyzz{{|}}~~|{zyxwwxxz{}~}}||||{{{{{{||||}}}~~}|zywvutsssstuwxz|~|{zyxwvuuuttttssttttttuuuvvwwxxyyzz{||}}~~~}|{zywvtsrponmllllmnoqrtwy{~}{zxwvuttssrrrqqqqqrrrrsssttuuvvwxxyyz{{|}}~~}|{zyxvutsrqqqqqrsuvxz}~}|{{{zzzzzzzzzzz{{{||}}~~~}|{zyxxxxyyz|}~~~}}}}}}}}}}~~~~~|{zyxwvuttttuuvxy{}~}|{zyyxxwwwvvvvvvvwwwwwxxxyyyzz{{|||}}~~~~}|{zyxwvutsrqpoonnnoopqstvxz|~}|{zyxwwvvuuuuuuuuuuuuvvvvwwxxyyyzz{{||}}~~~}|{{zyxwvutssrrrsstuvxy{}~}}||{{zzzzzzzzzzzz{{{{|||}}~~~~~}|{zyxwvuutttttuuvwyz|~~}}||{{{zzzzzzzzzz{{{{|||}}}~~~}|{zyxxwvuutttttuvwxy{}~~}|||{{{{zzzz{{{{{{{|||}}}~~~~}|{{zyxwvvuutttuuvvwyz|}~}}|||{{{{{{{{{{{{||||}}}}~~~~}}|{zyxxwvvuutttuuvwxy{|~~~}}||||{{{{{{{{|||||}}}}~~~~~}|{{zyxwwvvuuuuuuvvwxz{}~~~}}}|||||||||||||||}}}}~~~~~~}||{zyyxwwvvuuuuuvvwxyz|}~~}}}||||||||||||}}}}}~~~~~~}||{zzyxxwvvuuuuuvvwwxy{|~~~~}}}}|||||||||}}}}}}~~~~~~}}|{{zyyxwwvvvuuuuvvwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~}}||{zzyxxwwvvvuuvvvwwxyz|}~~~~}}}}}}}}}}}}}}}~~~~~~~}}}|{{zzyxxwwvvvvvvvvwxyz{|~~~~~}}}}}}}}}}}}~~~~~~~~~~}}||{zzyyxwwwvvvvvvvwwxyz{}~~~~~~}}}}}}}}}~~~~~~~~~~}}||{{zzyxxwwwvvvvvvwwxyz{|}~~~~~~~~}~~~~~~~~~~~~~~}}||{{zzyyxxwwwvvvvvwwwxyz{|~~~~~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvwwwxyyz{}~~~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxxwwwvvvwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxwwwwwwwwwwxyyz{|~~~~~~~~~~~~~~~~~~}}}||{{zzzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~}}}|||{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwxxxyz{{}~~~~~}}}}||{{{zzyyyxxxxwwwwwxxxyyz{|}~~~~~~}}}}|||{{{zzyyyxxxxxwwxxxxyyz{|}~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxyyzz{|}}~~~~~~~~}}}}|||{{{zzzzyyyyxxxxxxyyyzz{{|}~~~~~~~~}}}}||||{{{zzzzyyyyxxxxxyyyyz{{|}~~~~~~~~~}}}}}|||{{{{zzzzyyyyyyyyyyyzzz{||}~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzzz{{|}}~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyzzz{{||}~~~~~~~~~}}}}}||||{{{{{zzzzzyyyyyyyzzz{{||}~~~~~~~~~~}}}}}}||||{{{{{zzzzzzyyyyzzzz{{{|}}~~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{{||}~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{|||}~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzzz{{{{{||}}~~~~~~~~~~~}}}}}}||||||{{{{{{{{{z{{{{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{||||}}}~~~}|zyxuttspppmlonmnnnpsuwxy||z~ysnid]YURPONLMNPSVZ]aeimquwz|~~}|zxuspmjgeb`^]]\[[ZZ[[\\]^`adgimrxotv}{zzzz{}|}vuw{}zvrolieb_\YWURPONNNNOOQSUX[^adgjmqsvy{}yokq~xuuuwyz|~~}|{zyyxwwwwwxyy{}~{qiccitvnieba`^^]^^^^^^^^^^]]]\\\\\\\\\]^_`acdfhkmoruxz}yqicbemyvojfcba___^^^^^^^^^]]]\\\[[[[[\\\]^_`bcegikmprtvy|~zriaXRNOT]jwzqh`ZUPNLKJIHHHHHHHHGGGGGGGGGGGGHHIJKLNPQSUXZ]_cehknqtwy|xqjfehp{zvrqonmmmmmmmnnnnoooooopppqqrstuvwy{}~~yuvz}ywusrqpooonnnnmmmmllllllllmmnnoprsuvxz|~{slea`bir~xrlgdb_][ZYYXXWWWVVVVUUUUUUUUUVVWXXZ[\^`acegjlnpruwy{}|wqjc[UPMNS[eq|xqic^YWURPONNMMMMMMMMMMMMMNNNOPPQRSUVXY[]_adfhknpsvx{}ysmgddfmv}xtspnmkkjjiiijjjjjjkkkllmmnopqrsuvxz|~zvtux}ywusrqppooonnnnnnnnnnnnoopqrstuvxy{}}voida`bgoy~xrmjgda_]\[ZYXXXWWWVVVVVVVWWWXYYZ[\^_abdfhjlnprtvxz|~}xsmga[VRPQU\eoyysmhda^[YWVUTSSSRRRRRRSSSTTUUVWXYZ[]^`bcegjlnpsuwz|~ztnieccejr|}zwtqonlkkjjiiiiiijjjkkllmnopqrsuvxz{}zurqru{}zxvtsrqppoonnnnnnnnooopqqrstuwxy{|~}wrlgc``bfmu~~xtqmjgdba_^]\\[[ZZZZZZZZZ[[\\]^_`abdeghjlnoqsuwy{|~}yupke`[WTSTW]emw{upmjfca_][ZYYXXWWWWWWXXXYZZ[\]^_`bcefhjlmortvxz|~zupkgdbceipx|yvtrponmllkkkkkkkllmmnoopqrsuvxy{|~{uplhghjou}}{ywutrqonlkjihgfeddddcccdeffhijlnoqsvxz|~~yvsrrtw}}{xvuuttuuusokprjlprsssttuuvvwxyz{|}}{wsokfc_]]^`ekry}zxvutsstuvvuqmovsnnprtvxy{|}~~zwutsux|}|{xurnmpsuspmkkklmnoppqqrstuvwwxyzz{{|}}~~}zwsplifdccdfjpv}~|zxusqppruxyyxvutssstuvwxz{|}~zwtqonnorv{|yvtqnljiijlnpqqponmlkkkkllmnopqrstvwxyz|}~~{xtromllmorw||yvsqnlkkkmnpqrrrqpnmmmmmmnnopqrstuvwxyz{|}~|zwtqnkihggikosx~}zvspnkhfddddfgijjjihgfeeeeeeffghijklmnopqrstvwxyz{|}}~}zxuspnlkjjlnquz~|ywusrrrtuwyzzzyyxwvvvvvwwxyzz|}}}{yxwxy{~|zxwwxyz|}}}}|{zyxxwwwxxyyzz{||}~~{ywusrqqqsuy}}zxusqpoopqrtuuutsrqppooooooppqqrrstuuvwxxyz{{|}}~~|{ywurpnljihhijlnrvz~{xvspnlkjjjkmnopppponmllkkkklllmnnopqqrstuvwwxyz{{|}~~~}{zxvtrqponopqtwz~}zywvvvwxy{||}}|{{zyyxxxxyyzz{{|}~~~|{zyyy{|~}|||}~~~}||{{{{{||}}}~~|{ywvutsttuwz}~|ywvttttuvwxyyyxwvuutssrrrrrrsssttuuvvwwxxyzz{{|||}}~~~~~}}|{yxwutrqonmlkklmoqsvz}}zxvtrqpppqrstuuvvuttsrqqqqpqqqqqrrsstuuvvwxxyzz{{|}}~~~}|{zywvutsrqqrrtvx{~~|{zyyzz|}~~}}|{{{{{{{{{|||}~~~}|{zzzz{}~~~~~}}}}}~~~~~}|zyxwvvuvvwy{}~|{yxxwxxyz{{|||{{zyxxwvvvuuuuuuvvvvwwwxxxyyzzz{{{|||}}}}}}}}}}}}||{{zyxwvutsrqpoonnopqsuwz}}{yxvutttuuvwxyyyyyxxwvvuuuttttttuuuuvvwwxxxyyzz{{|||}}~~~~~~~}||{zyxwvvuttssttvwy{}~}||||}~~}}}}}}}}}}}~~~~}||{{{{{|}~~~~~}|{zyxxwwwwxyz{}}|{zzz{{|}~~~~~}}|{{zyyyxxxxwwwxxxxxxyyyyyzzz{{{{{|||||||||||{{{zzyyxwvvutsrrqqqqrssuvxz|}|zyxxwwxxyz{{|||||{{zzyxxxwwwwwwwwwwwxxxxyyyzzz{{{||||}}}}}}}}}}}}|||{{zzyxxwvvuuuuvvwxz{}~~}}}}~~~}}||||{{{{{{{|||||}}}}~~~~~~~}}||{zzyxxwwwwwwxyz{}~}}}}~~~~}}|||||{{{|||||||}}}}}~~~~~~~~}}||{{zyyxxwwwwwxyz{|~~~}}~~~~~}}|||||||||||||}}}}}}~~~~~~~~~~}}||{{zzyxxxwwwwxyyz|}~~~~~~~}}}||||||||||||}}}}}}~~~~~~~~~~~~}}}||{{zzyyxxxxxxxxyz{|~~~~~~~}}}|||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxxxxxxyz{|}~~~~~~~}}}}}|||||}}}}}}}}}~~~~~~~~~~~~~~~~}}}|||{{zzzyyyxxxxyyzz{|~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxxyyyz{|}~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}|||{{zzzyyyyyyyyyz{{|~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}|||{{{zzzyyyyyyyyzz{|}~~~~~}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}||||{{{zzzyyyyyyyzz{|}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzzyyyyyyzz{{|}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{{zzzzzyyyzzz{{|}}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzzzzzzzz{{||}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}||||||{{{{zzzzzzzzz{{{|}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzzzzzzzz{{||}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||{{{{{zzzzzzzz{{{|}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||{{{{{zzzzzz{{{{||}~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||{{{{{{{zzz{{{{{||}}~~~~~~~~~~~~}}}}}}}}}}}}|||||||{{{{{{{zzz{{{{{||}~~~~~~~~~~~~~~}}}}}}}}}}}|||||||{{{{{{{{{{{{{{||}}~~~~~~~~~~~~~~}}}}}}}}}}|||||||{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}}|||||||{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}}||||||{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}|||||||{{{{{{{{{{{|||}}}~~~~~~~~~~~~~}}}}}}}}}|||||||{{{{{{{{{{||||}}~~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{|||||}}}~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||{{|||||||}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||||}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~}||ywwwtssroqrqqqqruwy{{~z~xtnjc^ZVTRQPOQRUW[^bfjnquxz|~~|{yvspmjgd`^[YWWWUUTUUVVWXY[\_ceimszsx}s|}}|}}yzvwz{vtpnjfc`][YVTRQQQQQRSUWY\_behknqtvy{}~~}}||~~~~~rkly|xwwx{|~~}|{zzzzzz{|}~tkdaen{{smheccaa``aaaaaaaaa``_____^^^^_``abcefhjloqsvy{~|skdabhs{tnjfedbbbaaaaaaaa````___^^^^^^^__`abdeghjlnqsuxz}zskc[SNMPXdq}vme^YTQONLLKKKKKKKJJJJJJJIIIIJJJKKLMOPQSUWY\^adfiloqtwy|~zrkfdeku~yusrqpoooopppqqqqqrrrrrrssttuvwxy{}~yutw~|zxvussrrqqqqppppoooonnnnooopqqrtuvxz{}}umga_`dmx}vpkgeb`^]\[[ZZZYYYXXXXXWWWWWXXXYZ[\]^_acefhkmoqsuxy{}|wrkd]VPMLOV`kw|ungb]YXUSRQPPPOOOOOOOOOPPPPQQRRSTUVXY[]^`cegiloqtvx{}{tmhdbdip{|xusqonmmlllllllllmmmnnnoopqrstuwxz{}{vssu{}zxvutsrrrqqqpppppppppqqqrsttuwxy{|~}wpjda_`dkt~|vpmjgdb`_]\\[[ZZYYYYYXXXYYYZZ[[\]^_abdegikmoqrtvxz|}|xsnhb\VRPORX`jt}wqlgda^\ZXWVVUUUUTTUUUUUVVWWXYZ[\]^`acefhkmoqsuxz|~zuojfbbcgnv}zwtrponmllllkklllllmmnnopqrstuvxy{}{vrpprw~}zxwutssrqqqpppppppqqqrrstuvwxy{|}}xrmgc`_`ciqz|wtqmjgecba`_^]]]\\\\\\\\]]^^_`abcdefhikmnprtuwy{|}|yupkf`[WTRRTY`ir{~ytpmifda_^]\[ZZZYYYYYZZZ[[\]^^_`bcdfgiklnprtvxz|~zuplgdbacfls||yvtrqponnmmmmmmmnnnoopqrstuvwyz|}{vspnmmnqu||wsolifdcb`_^^]]]]]^^^_`abcefhikmpruvx{~}yurqpqqrrw}{ywusqpomlkihgfeedcbbbbcccdfghjlmoqsuwy{|~|yvspnkjjjkllo{~|{yxwwvuutttssstttuvwxyz|}~{xurommr{~{yvtrpnlkjihffeddddccccddeefgijkmnpqsuvxz{}~|yvrokhedfkr{~|{zxwvvuutttsssstttuuvwxyz{|~~zuqlhdbabekry~{yvtrponmlkjjiiiiiiiijjkklmnopqrtuvxz{}~}yuqmifcbbdhnu}|ywusrponmllkkjjjjjjjkkklmmnopqrsuvwxz{}~}zwsokgc`][Z\^cipw~}zxuspnljihffeddcccbbccccddefgghijlmnpqrtuwxz{}~~{xuqnkhfeehkqw~~}{zyxwwvvuuuuuuuvvwwxxyz{|}~~{wtqnmlmptz~|{zyxwvvuuttttttuuuvvwxxyz{|}~}zwtpmjgedegjntz}zxvusrqponmmllllklllllmmmnoopqrstuvwxyz{|}~~|zxuspmjgda_^^_aejou{~|zwvtrqonmllkkjjjjjjjjkkklmmnoppqrtuvwxyz{|~}{yvsqnkjhhhjmqv|~}|{zyyxxxwwwwwwxxxyyz{{|}~|ywtrpoopruy~~}|{zzyyyyyxyyyyyzz{{||}~~}{xvspnkihhhilotx~}{yxvutssrqqpppoooooppppqqrrsstuvvwxyzz{|}}~~}{zxvtromjhfdcbbcehlpuz}{zxwutssrqqppooooooppppqqrrsttuvwxxyz{|}~}{ywusqomkjjklnrvz~}}|{{zzzzzzzzzz{{{||}}~}zxvtrqqqqsvy}~~}|||{{{{{{{{|||}}}~~}{ywusqomkkjklnptx|}|{zyxwvuutttssssssssstttuuvvwwxxyzz{{|}}~~~}|{zxwusrpnljhgfeffhjmquy}~|{zyxwvvutttsssssssstttuuuvvwxxyzz{||}~~~|{yxvtsqpnmmlmnpsvz}~}}}||||||||||}}}~~~}{ywvtsrrrstvy|~~~}}}}}}}}}}~~~~}{zxvusqpnmmmmnprux{~}|{zzyxxwwwvvvvvvvvvvwwwxxxyyzzz{{||}}}~~~~}}|{zyxvusrpomljiihiikmoruy|~}|{{zyyxxwwwvvvvvvvwwwwxxxyyyz{{{||}}~~~}|{zxwvtsqpponnoprtvy|~~}}||{{{{{zzz{{{{{{|||}}}~~~}|{yxwutrqpoonooprtwz}~~}}|||{{{{{{{{{{{||||}}}~~~~}|{zywvusrqpooooprtvx{~~~}}||||{{{{{{{|||||}}}~~~~}|{zyxwutsrqppoppqsuwz}~~}}}||||||||||||||}}}~~~~~}||zyxwvusrqqppppqrtvy{~~~}}}|||||||||||}}}}~~~~~~}|{zyxvutsrqqpppqrsuwz|~~~}}}}||||||}}}}}}~~~~~~}|{zyxwvutsrqqqqqrsuvy{}~~~~}}}}}}}}}}}}}}~~~~~~~}|{zzyxwutssrqqqqrstvxz|~~~~}}}}}}}}}}}}~~~~~~~}||{zyxwvutsrrrqqrstuwy{}~~~~}}}}}}}}}~~~~~~~~}}|{zyxwvuutsrrrrrrstvxz|~~~~~~~~~}~~~~~~~~~~~}}|{zzyxwvuttsrrrrrstuwy{}~~~~~~~~~~~~~~~~~~}}|{{zyxwwvutsssrrsstuvxz|~~~~~~~~~~~~~~~~~}}||{zyyxwvuutsssssstuvwy{}~~~~~~~~~~~~~~}}||{zzyxwwvuttsssssttuwxz|~~~~~~~~~~~~}}|{{zyyxwvvuttssssttuvxy{}~~~~~~~}}||{zzyxxwvuutttstttuvwxz|}~~~}}||{zzyyxwvvuuttttttuvwxy{|~~~~}}||{{zyyxxwvvuutttttuuvwyz|}~~~}}|||{zzyyxwwvvuuttttuuvwxy{|~~~~}}}||{{zzyxxwwvvuuuuuuuvwxyz{}~~~~}}}||{{zzyyxxwvvvuuuuuvvwwxz{|~~~~~}}}|||{{zzyyxwwwvvvuuuvvwwxyz|}~~~~~}}}|||{{zzyyxxwwwvvvvvvvwwxyz{|~~~~~}}}}||{{{zzyyxxwwwvvvvvvwwxyz{|}~~~~~~}}}}|||{{zzzyyxxwwwwvvvwwwxyyz{|}~~~~~~}}}|||{{{zzyyyxxxwwwwwwwwxxyz{|}~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwxxxyz{{|}~~~~~~~}}}}|||{{{zzzyyyxxxxwwwxxxxyzz{|}~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxyyyz{||}~~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxyyyz{{|}~~~~~~~~}}}}}|||{{{{zzzyyyyyxxxxxyyyzz{|}}~~~~~~~~}}}}}||||{{{{zzzyyyyyyyyyyyyzz{||}~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyzzz{{||}~~~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyyzzz{{||}}~~~~~~~~}}}}}}||||{{{{{zzzzzzzzzzzzz{{{|}}~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzz{{{{|||}~~~~~~~~~~}}}}}}|||||{{{{{{{zzzzzz{{{{|||}}~~|{wqoniffeabcbbcdfhknrsuz~}~~ytplhea____abbfimqtxz}~{wsokgc_[WTQNMKJHGGFFFGGHIKNQTX\cjtwa}kmx~~~~~}{yuspmifdba`_]]]^_`bcehjmprtwy{}~|{yxvutstssssstuwy{~wka]dtwrppqsuwy{}~}}|||||}~zpidcit|tokgfeddcccccccccbbabaa```_````aabdefhjlnpsuxz}}umf`_bkwztnkhfeddccccccccccbbbaaa`````aabbcdeghjlnpruwy|~}wph`XRNOT^kxwnf_ZVTRPONNNMMMMMLLLLKKKJJJJJJKKLMNOPRSUWY\^acfhknpsvxz}}vohb^]aityuqpommlllmmmnnnoooooppppqqrstuvwxz|~|wtuz~}zywvuuttttssssrrrrqqqqqrrrstuvwxz{}zrkea`bir~~wrmjhecb``_^^^]]]\\[[[[[ZZZ[[[\\]^_`bceghjlnpsuwy{}|xsmg`YRNKLQYco{{tlfa\ZXUTRQQPPPOOOOOOOOOOPPPQQRSTUVWY[\^`bdgiknpsuxz|~~yrlfa^^agp|~yusqomlkkjjjjjjjkkkklllmmnopqrstvwy{}}wsqrw~~{yxwvuuttsssssrrrrrsssttuvwwyz{}~{unhda`bgpz}wrpmigecba`_^^]]]\\\\\\\\\\]]^_``bcdfgiklnprtuwy{}~|ytoid^XSONOSYbmx|upjfd`^[ZXWVVUUTTTTTTTUUUVVWXXYZ[]^_acdfhjlnqsuwy{}~ytnid`^^afnw~{xurpomllkkjjjjjjkkkllmmnopqrstvwy{|~|wsonosy~{zxwvuttsssrrrrrrsssttuvvwxz{|}|vqkfb``bgmv}yvroljhfdcbaa``__________``abccdfghiklnoqstvxz{}~}yuqlgb]XTQQRU[bku~}wrolhfca_^\[[ZZYYYYYYYZZ[[\]]^_`bcdfgiklnprtvxy{}}ytpkfb_^^aelt}}zwusqponmmlllllllmmnnoppqrstvwxz|}{vromlmpu{~|zywvtrqonmlkjhhggffffffghijklnpqsuwz|}zwsqppru{}{yxwvvwwxvqmqtmnrtvuvvwwxyxyz{|}~~~{xtplhd`][[\^cipx}zxwvvvwwxywtpqxwqpruwxz{}~|xurqqruz}{xtqpruwvronmmnopqrsstuuvwxxyzz{||}}~~~|yvspmjgdb``bdinu|}{xvsrrtwz||zywvuuvvwxyz|}~~{wtqomllmpuz|yvsqnmkklnprsssrqponmmmnoopqrstuvwxy{|}~}zxuromkjjkmpuz~{xvsqonmnoqrttttsrqpoooooppqrstuvwxyyz||}~~|ywtqnkifedefimqw||yvspmkhgfffhiklmllkjihggggghhijkklmnopqrstuvwxyz{{|}~~}{zwuspnljihhjlosx~~{ywutttvwy{||||{zyxxxxxyyz{{|}~|zxwvuvwz}~|zyyy{|}~}|{zzyyyzzz{{|}}~}{xvtrqooopqtw{|zwusrqqrstvwwwvutsrrqqqqqqqrrsstuuvwwxxyzz{||}}~~~~}|{yxvtrpnljhgfffhjmpty~}zxurpnmlllmopqrrrrqponnmmmmmnnoopqqrsttuvwwxyzz{{|}}~~~}{zywusrpommlmnpruy}|{yxxxxz{|~~~}}|{{zzzzz{{||}}~}{zyxwwxy{}~}~~~}}}}}}}~~~}{zxwutsrrrstvy|}{ywvuuvwxyzz{zzyxwvuutttttttttuuuvvwwxxyyyzz{{{|||}}}}}}~~~}}}}}|{{zyxwvtsqpnmlkjiijkmoruy|~|zwutrrqrrstvwwwwwvuutssrrrrrrsssttuuvvwwxxyyzz{{||}}}~~~~~}}|{zyxvutsrqppopqrtwz}~|{{{{|}~~~}}||||||}}}~~~}|{zyxxxyz{}~}|zyxwvuttttuvwy|~~|{zyyyzz{|}}~}}|{{zyxxwwwwvvvwwwwwwxxxyyyyzzzz{{{{||||||||||{{{zzyyxwvutsrqponmmmmmnpqtvy|}{yxwvvvvwxyzz{{{{zyyxwwvvvuuuuuvvvvwwwxxxyyzzz{{{{|||}}}}}}}}}}}}||{{zzyxwvuttsrrrrrstvxz}~}}~~~~~~~~~~~~}|{{zyyyyz{|}~}}|{zyxwwvvvvvvwxz|~}|||||}}~~}}|{{zzyyyyxxxxxyyyyyyyzzzzzzz{{{{{{{{{{{{zzzyyyxwwvuutsrqqpppoppqrsuwy{~}|{zyyyyyz{|}}~~~}}||{zzyyxxxxxxxxxxxxyyyyyzzzz{{{{{||||||||||||{{{zzzyxxwwvuuttttttuvwyz|~~~~~~}}}||||||||||}}}}}}}~~~~~~~~~~~~~~~~~~}}}||{{zyyxwwvvuuuvvwxyz|~~~~~~}}}}||||||||}}}}}}}}~~~~~~~~~~~~~~~~}}}|||{{zyyxxwwvvvvvvwxyz{}~~}}}}}||||}}}}}}}}}}}~~~~~~~~~~~~~}}}}|||{{zzyyxwwwvvvvvwwxy{|~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}|||{{zzyyxxwwwvvvvwwxyz{}~~~}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}|||{{{zzyyxxwwwwwwwwxyz{|~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||{{{zzyyyxxwwwwwwwxyyz|}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{zzzyyxxxwwwwwwxxyz{|}~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{zzzyyxxxxwwwxxxyz{|}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{zzzyyyxxxxxxxxxyzz{|}~~~~~}}}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzyyyxxxxxxxyyyz{|}~~~~~~~~}}}}}}}}}}}}}}}}}}}||||||{{{zzzzyyyxxxxxxxyyz{{|}~~~~~~~~}}}}}}}}}}}}}}}}}||||||{{{{zzzzyyyyxxxxyyyzz{|}~~~~~~~~~}}}}}}}}}}}}}}}|||||||{{{{zzzzyyyyyyyyyyzz{||}~~~~~~~~}}}}}}}}}}}}}}|||||||{{{{zzzzyyyyyyyyyyzz{{|}~~~~~~~~~}}}}}}}}}}}}}||||||{{{{{zzzzyyyyyyyyyzzz{||}~~~~~~~~}}}}}}}}}}}}|||||||{{{{{zzzzzyyyyyyyzzz{{|}}~~~~~~~~~}}}}}}}}}}}|||||||{{{{{zzzzzzyyyyzzzz{{||}~~~~~~~~}}}}}}}}}}|||||||{{{{{zzzzzzzyyyzzzz{{||}}~~~~~~~~~}}}}}}}}}|||||||{{{{{{zzzzzzzzzzzzz{{||}~~~~~~~~~}}}}}}}}}|||||||{{{{{{zzzzzzzzzzzz{{||}}~~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{zzzzzzzz{{{{||}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{zzzzzz{{{{{||}}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~}}}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{{|||}}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{|||||}}}~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{|||||}}}}~~~~~~~~~~~}}}}}}}||||||||||{{{{{|||||||}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}|||||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}}~~~~}|ytpokggfcbccbcdegjlprsx||{wrnjgb`___`bbehkoswy{~|wtplhd`\XURONMKJIHHHHIJKLMPSVZ^djs~doohr~~~|~{||zwtqnkhfdb`_^]^^_`bcdgiloqsvxz|~~}{zxwvttuttttuvwy{}|pe^anwqmlmorsvxz}~}}}||}}~ulfdgp~{tmiecbbbaaaabbbbbbbbbbaa``````aabbdefhikmprtwz|~zqic`ahszsmifdcbbaabbbbbbbbbbbbaaaaaaaaabccdeghjlnprtvy{}|tme\UPOR[gtwnf_YUQPOMMLLLLLLLLLLLKKKKKKKKKKLLMNOPRSUWY[]`begjmoruwy|~zsle`^`fq}~xtpnmlkkkkkllmmnnnooopppqqrrstuvwxz|}yuux}{ywvuttsssssssrrrrrrrrrrrrsstuvwxz{}}vnhcabgo{~wqlhfdb`_^^]]]]\\\\\[[[[[[[[[\\]]^_`bcefhjlnprtvxz|~{vqjc\UPMLOV`lw{tlf`[XWTRQPOOOOOOOOOOOOOPPPPQRRSTUVWYZ\^`bdfhkmortwy|~|void`^`emx}xtrpmlkjiiiiijjjjkkklllmnnopqrstvwy{|~zusrv|}zxwvuttssssssrrrrsssssttuvwwxz{|~~xqkfbabfmw}wrnlhfdba`_^^]]]\\\\\\\\\\\]]^_``acdeghjlmoqsuwyz|~{wrmga[UQOORW_it~|uojec`][YWVUUTTTTTTTTTUUUVVWXXYZ[]^_abdfhjlnprtvy{}|wqkfb_^`dkt~zwtqonlkkjjjjjjjjkkkllmmnopqrstvwyz|~yuqoorw}{ywvuttssrrrrrrrrsssttuvvwxy{|}~ysnhda`beks|}xvrnligedcba``__________```abbcdeghiklmoqrtvwy{|~{xtoje_ZVSQRTY`hr{}wrnlheb`^]\[ZZYYYYYYYYZZ[[\\]^_`acdeghjlnoqsuwy{}~{wrmhda_^`djqz}ywtrponmmllllllllmmnnoopqrstuwxz{}~~ytqnlmoty~{xuromkihfdcb``__^^^^^_`abdeghjmortwy{~|xurpoprrsy~|zywvusrqponmlkjjjiiihijjkmmnprsuwxz|}~|zxusolifdccdeefiv~}{zyxwvvuuutttttttuuvwxyz{}~~zwuromns}|zxvtsqponmlkkjiiiiiiiijjklmnopqstvwxz{}~~|yvsolhda_^`emw~|zyxwvvuuttttttttuuvvwxyz{|}~zvqlhebbcflsz~{xvtrqonmlkkjjjiiijjjjkklmnopqrstvwyz|}|xtplhebaadhnu}~|ywusqponmmllkkkkkkklllmnnopqrstuvwyz{}~}zwsplhd`][[\_djqx}{xuspnlkihgfeddcccccccccddefgghijlmnoqrsuvxyz|}~{xuqnjgdbbbeinu|~|{yxwvvuutttttttuuvvwwxyz{|}~~zwspnmlnpuz~}{zyxxwwvvvvvvvvvvwwxxyz{|}}~}zwtpmjhfeegjou{}{ywutsrqponnnmmmmmmmnnnooppqrsstuvwxyz{|}~~|zwurolifca_]]^aeiou{}{ywusrponmlkkjjjjjijjjjkkllmnnopqrstuvwyz{|}~~{yvtqnkigfefhkouz}|{zyxxwwwwvwwwwwxxyyzz{|}~~~{yvsqpoopruz~}||{{zzzzzzzzzz{{{||}~~}{yvsqnljihijmpuy}|zywvuttsrrqqqqqqqqqqqrrssttuvvwxxyz{{|}~~|{yxvtqoljhecbaabdgkpuz~~|{yxvutsrqqppoooooooopppqqrrsttuvwwxyz{||}~}{zxusqomkiihijmpty~~}||{{zzyyyyyyyzzz{{{|}}~~~|zwusrqppqsvy}~~}}}|||||||}}}}~~}|zwusqomlkkklnquy}~}{zyxxwvvuuuttttttttuuuvvvwwxxyyz{{||}}~~}|{yxvusqomkihfeeefhjmquy}}|{yxwwvuuttsssssssssstttuuvvwwxyyz{{|}}~~~}{zxvusqonlkkkkmoquy}~}}|||||{{{|||||}}~~~~|zywutsrqrrtvy|~~~~~~~~~~~}|zxwusrponmmmnprux|~}|{zzyyxxxwwwwwwwwwwxxxyyyzzz{{||}}}~~~~}||{zxwvtsrpnmkjihhhijlorux|~}|{zyyxxwwwvvvvvvvvvwwwwxxyyyzz{{||}}~~~}|{zywvusrponmmmnopsux|~~}}|||{{{{{{{{{{{||||}}}~~~}|zyxvusrqponnnoprtwz}~~}}||||{{{{{{{{{||||}}}~~~~}|{yxwutsrqpoooopqsvx{~~~}}||||||||||||||}}}}~~~~}|{zywvutrqppooopqsuwz}~~}}}}|||||||||||}}}}~~~~}|{zyxwutsrqppoopqrtvx{~~~}}}}}|||||||}}}}}~~~~~}||{yxwvutsrqppppqrsuwz|~~~}}}}}}}}}}}}}}}~~~~~}}|{zyxwvtsrrqpppqrstvy{}~~~}}}}}}}}}}}}~~~~~~}}|{zyxwvutsrrqqqqrstvwz|~~~~~}}}}}}}}}~~~~~~~}|{zzyxwvutsrqqqqqrsuwy{}~~~~~~~}}~~~~~~~~~~}||{zyxwvutssrrqqrrstvxz|~~~~~~~~~~~~~~~~~~}||{zyyxwvutssrrrrrstuwy{}~~~~~~~~~~~~~~~}}|{zzyxwvuutssrrrrstuvxz|~~~~~~~~~~~~~~}}|{{zyxxwvuttssrrrsstvwy{}~~~~~~~~~}}||{zzyxwvvuttsssssstuwxz|~~~}}||{{zyxxwvuuttssssttuvwy{|~~~}}||{{zyyxwvvuuttsssttuvwxz{}~~~}}||{zzyxxwvvutttssttuuvxy{|~~~~}}||{{zyyxwwvuuttttttuuvwxz{}~~~}}||{{zzyxxwvvuutttttuuvwxy{|~~~~}}||{{zzyyxwwvvuuuttuuuvwxyz{}~~~~}}}||{{zzyyxwwvvuuuuuuuvvwxy{|~~~~~}}}||{{zzyyxxwwvvvuuuuvvvwxyz|}~~~~~}}}|||{{zzyyxxwwvvvvvvvvwwxyz{|}~~~~}}}|||{{zzzyyxxwwwvvvvvvwwxyy{|}~~~~~}}}}|||{{zzyyyxxwwwvvvvvwwxxyz{|}~~~~~}}}|||{{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~}}}}|||{{zzzyyyxxxwwwwwwwxxyzz{|}~~~~~~}}}}|||{{{zzzyyxxxxxwwwwxxxyyz{|}~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxxyyz{{|}~~~~~~~}}}}|||{{{zzzyyyyxxxxxxxxxyyzz{|}~~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxyyyzz{||}~~~~~~~}}}}}||||{{{zzzzyyyyyxxxyyyyzz{{|}~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzz{{||}~~~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyzzz{{{|}}~~~~~~~~}}}}}}||||{{{{zzzzzzyyyyzzzz{{{||}~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzz{{{|||}}~~~~~~~~~}}}}}~}|ytrqljjiffhgghijmorvwy~zw{vsolhdcccdefgjmquy|~~zvrnjfb^ZWTRQONMKKJJJKLLMORTW[_elur]|dfr{|xvw{{ywtromjhfeccb`aabcdfgilnqtvx{}~}{zywwxwwwwwxy{}vi_[brxpjgghklnpsuwyz|}}~~~~~}}}}}}}~~zphbbgr|tlfb_]\\[[[[\\]]]]^^^^_____``abbcdeghjlmprtwy|~~ume_^aiu{rkfb_^]\\\\\\]]]^^^^____````aabcdefgijlnprtvy{}yqi`XQMMR\huxof^XRNLJHGGFFFFGGGGGHHHHIIIJJKKLMNOPRSUWY[]_bdgiloqtwy{~~woha]\_gr~wrmjhgfeeeffgghiijkllmnnopqrstuwxz{}|vssx{wusqpoonnnnnnooooopppqqqrsstuvwyz{}zrkd`_agq|wpkfca^\[ZYYXXXXXXXYYYYYZZZ[[\]]^_abcefhjlnprtvxz|~~ztng`XRMJKOWamx|tmf_ZUSQOMLKJJJJJKKKLLMMNNOOPQRSTUWXZ[]_acehjloqtvx{}yslfa]]`foz}wrnmjhgfeeeeeeffgghiijklmnopqrsuvxz|~}wspqu|}{wusrqpppooooppppqqqrrsttuvwxz{|~|unhc`_afnx}wqlifca_]\[[ZZZYYYZZZZZ[[\\]^^_`acdeghjlmoqsuwxz|~~zupjd^XSOMNQXaku|vojd`^ZXVTSRQQQQQQQQRRSSTUUVWXYZ\]^`bcegikmoqtvxz|~ztoid`]]`elv}xuromkihgggffggghhiijkllmnpqrsuvxy{}|wronorx~{xvusrqqppppppppqqrrsstuvwxyz|}~|wqkfb`_aflt}}xtqmjgeca`_^^]]]]]]]]^^__``abcdefhijlmoprtuwy{|~~{wrmhb]XTQPQTYajs|}wrmjgca^\ZYXWWWVVVWWWXXYZZ[\]^_`bcefhikmoqrtvxz|~~zupkfb_]^`dkr|~|xurpnmkkjjiiiijjkkllmnopqrstvwyz|~|wrolklotz|xuromkigfeccaa`````aabbcdeghjkmoqsuxz{~zvqmjhhjot{|yxvuutsrrrqqqqpppppppoooooopoppqrstuvwy{|~~{xuqmiea^\ZZ\`elt}~}{zyyxxwwwwwwwxxxxxxyzz{{||}~zvspnmnptz}zywutsrqpoonnmmmlllkkkkkkklllmmnopqrstuwxz{}~|yvsoligeddfjntz}zywvutttttstttttuuuvvwwxyyz{|}~~zvspmkjjknqu{{wtqomlkjiiihhhhhiiijjkklmnoopqrtuvwyz|}~|yvspmkjijlnrw{|xusqonllkjjjjjjjjjkkklmmnoopqrstuvwyz{|~}zwtqnkhedccdfimquy}{wspmkhgfddcbbbbbbbbbccddeefghijklmnoprstvwyz|}~~|yvtqomkjjklorvz~{yxwuttssssssstttuuvvwxyyz{|}~}{ywuuuuwy|}{zyxwvvuuuuuuuuuvvvwwxyyz{{|}~~|ywtrpnmmmnpruy||yvtsqponmmlllllllllmmnnnoppqqrstuvwxxyz{|~~~|zxvtqoljhfeeefgiknrux||yvsqonmlkjiiiiiiiiiijjkkllmnnopqrstuvwxyz{|~}{yvtrqonmmmnprux{}{zyxwwvvvvvvvvvwwwxxyzz{||}~}{yxwvvwxy{~}|{{zzyyyyyyyyyzzz{{{|}}~~}{ywusrqpoopqsuwz}}{ywvussrqqppppppppppqqqrrssttuuvwxxyz{{|}~~~}|zywusrpnlkjihhijkmoqtwy|}{ywutsrqpooonnnnnnooooppqqrrsttuvwwxyz{||}~~}{zxwusrqpooopqsuwz|}|{{zyyyxxxxxyyyyzz{{||}}~~|zyxwwwwxyz|~~~}||||{{{{{|||||}}~~~~|{ywvusrrqqrrsuwx{}~}{zywwvuutttssssssttttuuuvvvwwxxyzz{{|}}~~~}|{zxwutsqpnmllkkllmnpqsvxz}~|{zxwvuttsssrrrrrrrssstttuuvvwwxxyzz{||}~~~}|{yxwvtsrrqqqrrsuvxz}~}}||{{{{{{{{{{|||}}}~~~}|zyyxxwxxyz{}~~~}}}}}}}}}}~~~~~}{zyxwuutssssstuvxy{}~}|{zyxxwwwwvvvvvvvwwwwwxxxyyyzz{{{||}}~~~~}}|{zyxwvutrqpoonnnnnopqrsuwy{}~}|{zyxwwvvvvuuuuvvvvvvwwwxxyyyzz{{||}}~~~}|{zyxwvuttsssssstuvxy{}~}||{{{{zzzzzzzz{{{{|||}}}~~~~~}|{zyxwvuttsssttuvwxz{}~}}||{{{{{{{{{{{{{{||||}}}~~~}|{zyxwvvuttttttuuvwyz|~~~}}|||{{{{{{{{{{|||||}}}~~~~}|{zzyxwvuuttttttuvwxy{|~~}}}||||{{{{{{|||||}}}}~~~~}}|{zyxwwvuutttttuuvwxz{}~~}}}|||||||||||||}}}}~~~~~~}|{zzyxwvvuuttttuuvwxyz|~~~}}}||||||||||}}}}}~~~~~~}||{zyyxwvvuuuuuuuvvwxz{|~~~~}}}}}||||}}}}}}}~~~~~~~}||{zzyxwwvvuuuuuuvvwxyz{}~~~}}}}}}}}}}}}}}~~~~~~~}}|{{zyyxwwvvuuuuuuvvwxy{|}~~~~}}}}}}}}}}}}~~~~~~~~}}||{zzyxxwwvvuuuuuvvwxyz{|~~~~~~}}}}}}}}~~~~~~~~~~}}|{{zyyxxwwvvvuuuvvwwxyz|}~~~~~~~~~~~~~~~~~~~~~}}|{{zzyxxwwvvvuuvvvvwxyz{|}~~~~~~~~~~~~~~~~~~}}||{{zyyxxwwvvvvvvvvwwxyz{|~~~~~~~~~~~~~~~~~}}||{{zzyyxxwwvvvvvvvwwxxyz|}~~~~~~~~~~~~~~~}}}||{{zzyyxxwwvvvvvvvwwxyz{|}~~~~~~~~~~~~~}}||{{zzyyxxwwwvvvvvvwwxxyz{|~~~~~~~~~}}|||{{zzyyxxwwwvvvvvwwwxyz{|}~~~~}}}||{{zzyyyxxwwwwvvwwwwxxyz{|}~~~}}}|||{{zzyyxxxwwwwwwwwwxxyzz{}~~~~}}}|||{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~}}}||{{{zzyyyxxxwwwwwwwxxxyz{{}~~~~~~}}}|||{{zzzyyyxxxxwwwwwxxxyzz{|}~~~~~~}}}|||{{{zzzyyyxxxxxxxxxxxyyz{|}}~~~~~}}}}|||{{{zzyyyyxxxxxxxxxxyyz{{|}~~~~~~}}}}|||{{{zzzyyyyxxxxxxxxyyyzz{|}}~~~~~~~}}}}|||{{{zzzyyyyyxxxxxxyyyzz{{|}~~~~~~~}}}}|||{{{{zzzyyyyyyxxxyyyyzz{{|}}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyyzzz{||}~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyyyzzz{{|}}~~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyyzzz{{||}~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyyzzzz{{||}}~~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyzzzz{{{|}}~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{|||}}~~~~~~~~~}}}}}||||||{{{{{zzzzzzzzz{{{{|||}}~~~~~~~~~}}}}}}||||||{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{||}}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~|{ysonkffebabbbbcefilorsw|{vqmifb_^^^_aadgjnrvx{~~|xtqlhd`\XTQNMLJIHGFFFGHIJKNQTX\biq|jjxjs~}}}~~~~|yvspnjgeca__]\]]^_abcfhknqsuxz|~~|{yxvutssssssstuwy{~~sh`am|uqpprtuwz|~~}}||{{{{|}~wnhehp}xqlifeddccbbbbcbbbaaaa``______```abdeghjloqsvy{~{skeabhrwqligfdccccccbbbbbbaaa`````__``aabcdfgikmoqsuxz}|vnf^WQPSZfs{rjc]XTSQONMMMLLLLLKKKKJJJJJIJJJJKLMNOPRTVXZ\_bdgiloqtvy{~|tmfa_`fp}|wsponmllllllmmmnnnnnooopppqrstuvwy{|~{wvy}{ywvuuttssssrrrqqqqqqqqqqrrstuvwyz|~wpidbbgoz{uokifdb`__^]]]\\\[[[ZZZZZZZZZ[\\]^_abdegikmoqsuwz{}{wrke^WQNMPV_kwwpic^[YVTRQPPOOOOONNNNNOOOOOPPQRSTUVXY[]_acegjloqtvx{}}wpjea_`emw{vtromlkjjjjjjjjjjjkkkllmmnopqrsuvxz|}{vssv{|zxwvuttsssrrrrrrrrrrrsstuvwxyz{}yslgcabfmvzuqnjhecba`_^]]\\\\[[[[[[[\\\]^_`abcdfhikmnprtvxz{}{wsmhb\VRPORW_it~xrmheb_\ZYWVUUTTTTTTTTTTUUUVWWXYZ\]^`acegikmoqsvxz|~}wrmgc`_`dkt~|yvsqomlkkjjjjjjjjjkkklmmnopqrsuvxy{}zvrpprw~|zxwvutssrrrrrrrrrrssttuvvwyz{|~ztojebabekr|{wtpmjhfecbaa`___^^^^^^___``abcdefghjkmnprsuwxz|}|xtpkf`[WTRRTY_hqzzupnjgda_^][[ZYYYYXXYYYYZZ[\\]^_abcefhikmoqstvxz|~|wsnieb__`diqy{xusqponmllllkkllllmmnoppqrsuvwyz|~~zuqnmmotz}{zxwutrqpnmljiihgggffggghijklnoqsuwy{~|xsoljjjnsy}|zyxxwwwvuuuuuttsssssssrrsstuuuvwyz|}~~|zxuqnjfb_[XVVWZ^dlu~}|{zyxxwwwwwvvvwwvwwwxxxyyz{{|}~}yurpooqty~|{yxwvvuttsrrqqqppooooooooppqrrstuvwxz{|}~|yvspmifdb``adhmt{~{yxvuttsssssssssttttuuvvwxxyz{|}~}zvsqnmmmosw{~zwtrponmlkkjjjjjjjjjjkkllmmnopqrstvwyz{}~}zwtqomkjklnrv{~zwusqponmllkkkkkkkkkllmmnnopqqrstuwxyz{}~|zwtqnkhgfffhjnrv{}yvrpmkjhgfedddccccccccdddeefgghijklmopqrtuvxyz|}~}zxuspnljiiijmpsx|~{yxwuttssrrrrrrsssttuuvwwxyz{|}~}zxwvvvxz}~|{zyxwwwvvvvvvvvvwwwxxyzz{|}~~~{ywtrqooopqsvz}~{ywutrqpponnnmmmmmmmnnnooppqqrsttuvwxyz{|}~~}{ywuspnljhgffghjlorvy}}zwusqonmlkjjiiiiiiiiiijjjkklmmnopqrstuvwxyz{|}~}|zxvtrponmlmmoqtwz~}|zyxwwvvuuuuuuuuvvvwwxyyzz{|}~}|zyxwwwxz|~~}|{{zzzzzyyyzzzz{{{||}}~}{ywutsrqqrstvy{~}{yxwvutsrrqqqqqqqqqqqrrrssttuuvvwxxyz{{|}~~~}|{yxvtsqomlkjiijjkmortwz}~|zxvusrqppoonnnnnnnnnooooppqqrsstuvvwxyzz{|}~~}|{yxvusrqpooopqrtvy{~~|{{zyyxxxxxxxxxxyyyzz{{||}~~~|{zyxxwxxy{|~}}}|||||||||||}}}~~~}|zyxvutsssstuvxz|~}|zyxwwvuuuttttttttttuuuuvvwwxxyyzz{{||}}~~~~}|{zywvusrqonmllllmmoprtvx{}}|zyxwvuttssrrrrrrrrrrssssttuuvvwwxyyzz{||}}~~}|{zyxvutsrrqqqqrstvxz|~~}}|{{{zzzzzzzz{{{{|||}}~~~}|{zyxxxxxyz{}~~~~}}}}}}}~~~~~~|{zyxwvuutttuuvwy{|~~}|{zzyxxxwwwwwwwwwwwwwxxxxyyyzz{{{||}}}~~~~~}||{zyxwvutsrqpoonnnoopqrtvwy|~}|{zyxxwvvvuuuuuuuuuuuvvvwwwxxxyyzz{{||}}}~~~}}|{zzyxwvutsssrrrstuvwy{}~~}||{{{zzzzzzzzzzz{{{{|||}}}~~~}}|{zyxwvuuttttttuvwyz|~~~}|||{{{zzzzzzzz{{{{{|||}}}~~~~~}|{zyyxwvuutttttuvwxy{|~~}}|||{{{{{{{{{{{{{||||}}}}~~~~~}|{{zyxwvvuutttuuuvwxz{}~~}}|||{{{{{{{{{{{|||||}}}~~~~~}||{zyyxwvvuuuttuuvwxyz|}~}}}|||||{{{{{||||||}}}}~~~~~~}}|{zzyxxwvvuuuuuuvvwxy{|~~~}}}||||||||||||||}}}}}~~~~~~}}|{{zyyxwwvvuuuuuuvwxyz{}~~~~}}}||||||||||||}}}}}~~~~~~}}||{zzyxxwvvvuuuuvvvwxyz|}~~~}}}}|||||||}}}}}}}~~~~~~~~}||{{zyyxwwvvvuuuuvvwxxz{|~~~~}}}}}}}}}}}}}}}}~~~~~~~~~}}||{zzyyxwwvvvvuvvvwwxyz{}~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyxxwwvvvvvvvvwxxyz|}~~~~}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyxxwwvvvvvvvwwxyz{|~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}||{{zyyxxwwwvvvvvvwwxxyz{}~~~~~~~~~~}~~~~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvvvwwxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxwwwwvvvwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxxwwwvvvwwwwxyyz{}~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~}}}}||{{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~}}}}|||{{{zzyyyxxxxwwwwwxxxyyz{|}~~~~~~~~}}}}|||{{{zzzyyyxxxxxwwxxxxyyzz{|}~~~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~}}}}}|||{{{zzzzyyyxxxxxxxxxyyyz{{|}~~~~~~~~~~}}}}}||||{{{zzzzyyyyxxxxxxxyyyzz{|}~~~~~~~~~~~}}}}}|||{{{{zzzzyyyyxxxxxyyyyzz{||}~~~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyyyzz{{|}}~~~~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyyyyzz{{||}~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyyyzz{{||}~~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyzzzz{{|}}~~~~~~~~~~~}}}}}}|||||{{{{zzzzzzzyyyyzzzzz{{||}~~~~~~~~~~~}}}}}}}||||{{{{{zzzzzzzzzzzzzzz{{||}}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{{||}~~~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzz{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{||||}}}~~}zyuomlgdec``a`abcdgilpqsx||wrnjfc_^]]^_`adgkosvx{~~|xtqmiea]YVSPNMLKJIIIJJLMNOQUX[_djr{yelnz}|||}~}|yvspnkgeba_^][[\\]_`acfhknpruwz{~~}|{yxwuusttttuuvwy{~|pfbiywrooprtuwy{}~~}||{{zzzzz{|}~unihny{smifdcbbaaaaaaaa```____^^^]^^^__`abcefhjloqtvy{~{rkedgo{yrmifecbbaaaaaaaaa```____^^^^^__`abcdegikmnqsuxz}}ume]VSSXbo|vme^YURQOMLLKKKKJJJJJIIIIIHHHHIIJJKLMOPRTVXZ]_bdgiloqtvy{}{tmgcbemy~xtpnmlkjjjkkkllllmmmmnnnooppqrstvwyz|~{xy~}{ywuttsrrrrqqqqpppppooopppqqrstvwxz|~~voiedgmv}vqlhfca`_^]\\\[[[ZZZYYYYYYYYYZZ[\]^_`bdegikmoqsuwy{}|wrkd]VROPU]gs~{sle`[YVTRQPONNNNMMMMMMMNNNNOOPPQRSTVWY[]_acegjloqtvx{}}vpjebbekt}xtromkjjiihhhhiiiiijjjkklmmnoprstvxz{~{wuvz|zxvutssrrrqqqqqqqqqqqrrsstuvwxz{}xrlgddfks}|vqnkheca`_^]]\\[[[ZZZZZZZZ[[\\]^_`acdfgikmnprtvxy{}|xsmga[VSQRV]fp{{uoiec_\ZXWVUTSSSSSSSSSSSTTUUVWXYZ[]^`acegikmoqtvxz|~}wrlgdaadiq{}zwtqomlkjiiiiiiiiiijjkklmmnoqrsuvxy{}zvsrsv|}zxwutssrrqqqqqqqqqqrrsttuvwxy{|~ytnifccejpy|xuqnkhfdcba`__^^^]]]]]]^^__``abcdeghjkmnprsuwxz|}|xtoje`[WUTUX^enw|wrnkgdb_^\[ZYYXXXXXXXXXYYZZ[\]^_`bcefhikmoqrtvxz|~|wsniebaadhow|yvsqpnmllkkkkkkkkkllmmnopqrstvwyz|~~yuroopsx~}{zxvusrqonlkjihggffeefffghhiklnprtvwz|~|wromkkmrw}|zyxwwvvvttttttsrrrrrrrqqrrssttuvwyz{|~}zxuqnjfb_[YXXZ]cjr{~|{zyxwwvvvvvvvvvvvvvwwwxxyyz{|}~|xurqpqtx~~|{yxwvuttsrrqqppooonnnnnonooppqrstuvwxz{|}~|yvspmjgdbbbdhlrx|zxvuttsssrrrrrsssssttuuvvwxyz{|}~}yvsqonnorvz{wtrpnmlkkjjiiiiiiiiijjkkllmnopqrsuvwyz{}}zwtqomlllnquy~{xusqpnmmlkkkjjjjjjkkkllmmnoppqrstuwxyz|}~|yvspmkihgghjmquy~zvspmkjhgfedcccbbbbbbbcccddeffghijklmopqrtuvxyz|}~}zxuspnlkjjklorw{~|zxwutssrrrrrrrrrsssttuvvwxyz{|}~}zyxwwxz|~|{zyxwvvvuuuuuuuvvvwwxxyyz{|}}~~{ywtsqpppqsvy||ywutrqpoonnmmmmllmmmmnnnooppqrsstuvwxyz{|}~}{ywuspnljihgghjlnqtx{~{xusqonmlkjiiihhhhhhhiiijjkklmmnopqrstuvwxyz{|}~~|zxvtrqonnmnoqsvy|}|zyxwvvuuuttttuuuuvvwwxxyzz{|}~~|zyxxxxz{~~}|{{zzyyyyyyyyyzzz{{||}}~~}{ywvtsrrrstvxz}}{zxwutssrrqqppppppppqqqrrrssttuvvwxxyz{{|}~~~}|{yxvtsqonlkjjjklmoqsvy||zxvusrqpponnnnmmmmnnnnnooppqqrsstuvvwxyzz{|}~~~|{yxvusrqppppqrtvx{}~|{zzyxxxwwwwwwwxxxyyyzz{||}}~~}{zyyxxyy{|~~}}|||{{{{{{{||||}}}~~}|{yxvutttttuvxy{~}|zyxwvvuuttttsssstttttuuuvvvwwxxyzz{{||}}~~~~}|{zywvusrqpnnmmmmnopqsuxz|~|zyxwvutssrrrqqqqqqrrrrsssttuuvvwwxyyzz{||}~~~}|{zyxwutssrrqrrstvwy{~~}||{{zzzzzzzzzzzz{{{||}}~~~}|{zyyyyyyz{}~~~}}}}}}}}}}}}~~~~~}{zyxwvvuuuuuvwyz|~~}|{zyyxxwwwvvvvvvvvvwwwwxxxxyyzzz{{|||}}~~~~~}||{zyxwvutsrqppooooopqrsuwy{}}|{zyxwwvvuuuuututuuuuuuvvvwwwxxyyzz{{||}}}~~~~}|{{zyxwvuttssssstuvwxz|~~~}||{{zzzzzzzzzzzzzz{{{|||}}}~~~}}|{zyxwvvuutttuuvwxz{}~~}||{{{zzzzzzzzzzz{{{{{|||}}}~~~~}|{zyyxwvvuuuuuuvwxyz|~~}}||{{{{zzzzzzz{{{{{||||}}}~~~~~}|{{zyxwwvuuuuuuvvwxy{|~~~}|||{{{{{{{{{{{{{{||||}}}}~~~~~}||{zyyxwvvuuuuuuvwwyz{}~~}}||||{{{{{{{{{{|||||}}}}~~~~~}}|{{zyxxwvvvuuuuvvwxyz|}~~}}||||||{{{{|||||||}}}}~~~~~~}}||{zzyxwwvvvuuuvvwxxz{|~~~}}}|||||||||||||||}}}}}~~~~~~}}||{zzyxxwwvvvuuvvwwxyz{}~~~}}}}||||||||||||}}}}}~~~~~~~~}}|{{zyyxxwwvvvvvvvwwxyz|}~~~}}}}}|||||||}}}}}}}~~~~~~~~}}||{zzyyxxwwvvvvvvwwxyz{|~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyxxwwwvvvvvwwxxyz{}~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyxxwwvvvvvwwwxyz{|}~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}||{{zzyyxxwwwvvvvwwxxyz{|~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}||{{zzyyxxxwwwwvwwwwxyyz|}~~~~~~~}}}}}}}~~~~~~~~~~~~~}}}|||{{zzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxxwwwwwwwwxxyyz{|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyyxxxwwwwwwxxxyzz{|~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{zzzyyxxxxwwwwwxxxyyz{|}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxxxwwxxxxyyz{{|}~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxxyyzz{||}~~~~~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxxyyyz{{|}~~~~~~~~~~~}}}}}||||{{{zzzzyyyyxxxxxyyyyzz{|}}~~~~~~~~~~~~}}}}}}|||{{{{zzzzyyyyyyyyyyyyzz{{|}~~~~~~~~~~~~}}}}}}||||{{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyyzzz{{||}~~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyzzzz{{|}}~~~~~~~~~~~~}}}}}}|||||{{{{zzzzzzyyyyyyzzzz{{||}~~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzz{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{||||}}}~~zyvpmlhdec``a`aabdfikoqrx{}xsokgd_^]]]_``dgjnrvwz~~|yurnjfb^ZWSQNNLKJIIIIJKLMOPTWZ^cipyfzomw~||||}}}ywtqnkgeca_^][[\\]^`acfhkmprtwy{}~|{zxwvutttttuuvwy{}~rgbfuxsonoqstwy{}~~~}||{{zzzzz{|}~woihlv|unjfdcbbaaaaaaaa```____^^^]^^^^_``bcefhjlnqsvx{}|tlfdfmy{tnjfedbbaaaaaaaaa```____^^^^^__`aabdeghjlnpsuwz|~~wog_XSSW`lyxog`ZURQOMLLKKKKJJJJJIIIIHHHHHIIIJKLMNPRSUWZ\_adfilnqsvx{}}unhcbdkvytpnmlkjjjkkkklllmmmmmnnooppqrstuwxz|~|yy}}|ywvttssrrrqqqqpppppooopppqqrstuwxz{}xqjfdfktxrligdb`_^]\\\[[[ZZZYYYYYYYYYZZ[\\^_`bceghkmoqsuwy{}}xsle^XSPPT[ep||tmfa\YWTRQPONNNMMMMMMMMMNNNNOPPQRSTVWYZ\^`cegjlnqsvxz|~xqkfbbdir}~ytrpmljjiihhhhhiiiiijjkkllmnopqstvwy{}|xuvy}zxwutssrrrqqqqqqqqqqqrrsstuvwxz{}~zsmhedejq{~xrolhfcb`_^]]\\[[[ZZZZZZZZ[[\\]^_`abdegijlnprtvxy{}~}ytnhb\WSRRU[dnx|vpjfc`]ZXWVUTTSSSSSSSSSSTTUUVWXYZ[\^_acegikmoqsuxz|~~xsmhdbachoy~zxtqomlkjjiiiiiiiiijjkkllmnoprstvwy{}{wsrru{}zywvtssrrqqqqqqqqqqrrsstuvwxyz|}zuojfdceiow}yvrnkigecba`__^^^]]]]]]^^^_``abcdeghiklnpqsuvxz{}~}yupkfa\XUTTW\clu}xrolheb`^\[ZYYXXXXXXXXXYYZZ[\]^_`acdfgikmnprtvxz|}}xtojfcaacgmu~}yvtrpommlkkkkjkkkkllmmnopqrstuwxz|}zvrpoprw}~zwtqnljhgecb`_^^]]]]]]^__abdfgilnqtvx{~}zvsrrstuu}~{zxwutrpponmlkiihhhhgghhijklmoqrtvwy{|~}{yvtqmjhfeefgghm{~|{zxwvuuttssssrssssttuvxyz|}|yvsqoqv|ywutrqonmlkjjihhhgghhhhijklmnoprsuvwyz|}}zwtqmieca`chqz}|zyxwvuttssssssssttuuvwxyz{|~{vrmifdceiov~~{xvtrpomlkjjiiihhhiiiijjklmnopqrsuvxy{|~}yuqmifdccfkqx~|ywtsqpnmmlkkkjjjjjjkkkllmnopqrstuwxy{|}~{xtplhea_]]^bgmt{}{xuspnljigfeddccbbbbbbbbccdeffghjklmnpqrtuwxz{|~~|yvrokhfdcdgkqx~|{yxwvuuttssssstttuuvvwxyz{|}~{xtronnpsw}~|{zyxwvvuuuuuuuuuuvvwwxyz{||~~{xuqnkigfgimqw}}{ywutrqponnmmmllllllmmmnnoopqrrstuvwxyz{|}~~|zxvspmjgdb`__`cglqw}~{ywusqpnmlkkjjiiiiiiiiijjkklmnnopqrstvwxyz{|}~~|zwtroljhgghjmqw}~}|zyyxwwvvvvvvvvvwwxxyyz{|}~|ywtrqppqtw|~}|{{zzyyyyyyyyyzz{{||}}~~|ywtqomkjijlnrw|}{zxwvutsrrqqpppppppppqqqrrsstuuvwxxyz{||}~~}{zxvtromkhfdcccdfimrw|~|zywvusrrqppooonnnnnnoooppqqrsttuvwwxyz{|}}~}|zxvtromljjjjlorv{~}|{{zzyyyyxxyyyyyzz{{||}~~|zxvtsrqrsuw{~~}}|||{{{{{||||}}}~~~|zxvtrpnmlllnpsvz~|{zyxwvvuuttttssssttttuuuvvwwxxyyzz{||}}~~~}|{zxwusrpnljigfffgilorvz~}|zyxwvuuttsssrrrrrrssssttuuvvwwxyyz{{|}}~~~}{zywusrpomlllmnpsvz~~~}|||{{{{{{{{{{|||}}~~~|{ywvtssrstuxz~~~~}}}}}}}}}~~~}|zywutrqoonnopqtwz}}|{{zyyxxwwwwvvvvvvwwwwxxxyyyzz{{{||}}~~~~~}||{zywvusrpomlkjiiijlnpsvz}~}|{zyxxwwvvvvvuuuuvvvvvwwwxxyyzz{{||}}~~~}|{zyxvusrqponnnoprtwz}~}}||{{{{zzzzzzz{{{{{|||}}~~~~}|zyxwutrqpoooopqsvx{~~~}|||{{{{{{{{{{{{{||||}}}~~~}|{zxwvusrqppoopqsuwz}~~}}|||{{{{{{{{{{{||||}}}~~~~}|{zyxvutsrqppppqrtvx{~~~}}|||||{{{{{|||||}}}}~~~~}|{zyxwvusrqqpppqrsuwz|~~}}}|||||||||||||}}}}~~~~~}}|{zywvutsrqqqpqrstvx{}~~~}}}}|||||||||}}}}}~~~~~}}|{zyxwvutsrqqqqrrtuwz|~~~}}}}}||||}}}}}}}~~~~~}}|{zyxwvuttsrrqqrrsuwy{}~~~~}}}}}}}}}}}}}}~~~~~~~}|{{zyxwvutsrrrqrrstvwz|~~~~~}}}}}}}}}}}~~~~~~~~}||{zyxwvuutsrrrrrstuwy{}~~~~~}}}}}}}}~~~~~~~~~}}|{zyyxwvuttssrrrstuvxz|~~~~~~~~~~~~~~~~~~~~~}}|{{zyxwvvuttssssstuvwy{}~~~~~~~~~~~~~~~~~~}}|{{zyyxwvuutsssssstuvxz|~~~~~~~~~~~~~~~~~}}||{zzyxwwvuttssssttuvwy{|~~~~~~~~~~~~~~~}}||{{zyxxwvvutttssttuvwxz{}~~~~~~~~~~~~}}||{{zyyxwwvuuttttttuuvxy{|~~~~~~~~~}}}||{zzyxxwvvuutttttuuvwxz{}~~~}}}||{{zyyxwwvvuuttttuuvwxy{|~~~~~}}||{{zzyxxwwvvuuuttuuvvwyz{}~~~~}}||{{zzyyxxwvvvuuuuuuvvwxy{|~~~~~}}|||{{zzyyxwwvvvuuuuuvvwxyz{}~~~~~~}}}||{{zzyyxxwwwvvvuvvvvwxyz{|}~~~~~}}}|||{{zzyyxxwwwvvvvvvvwxxyz|}~~~~~~}}}|||{{zzzyyxxwwwwvvvvwwxxyz{|}~~~~~}}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~~~}}}}||||{{zzzyyyxxxwwwwwwxxyyz{|}~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxxyyz{{|}~~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxyyzz{|}~~~~~~~~}}}}}|||{{{{zzzyyyxxxxxxxxyyzz{||}~~~~~~~~}}}}}||||{{{zzzzyyyyyxxxxyyyzz{{|}~~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzzz{||}~~~~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyyzzz{{|}}~~~~~~~~~}}}}}}||||{{{{zzzzzzyyyyyzzzz{{||}~~~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzz{{||}}~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzz{{{{||}}~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzz{{{{{||}}~~}zytonkgeeb`bbabcdehknqrvz~{wrnifb_^]^_`abfimquwy}~|xtplhd`[XTQNLLJIHGGGGHIJLMOSVZ^cjr}qgkq~~}}}~~|yvspnjgeca_^]\\\]^`abegjmortvy{}~}|zywvusrsssssstvwz|xlcbl~~vqopqsuvy{}~~~}||{{{{{{|}~{rkgip|yrmifedcbbbbabbbaaa````__^^^____`aacdfhiknpruxz}wohdchr~xrmifedcbbbbbbbbaaaa```_______``abbdefhjlnprtwy|~yrjbZTRTZer}tld]YURQONMLLLLKKKKKJJJJIIIIIIIJJKLMNPQSUWY[^`cfhkmpsuxz}xqjdabfo|}wspomllkkkllllmmmmnnnnoooppqrstuwxz|}~ywy}{ywvuttsssrrrqqqqpppppppqqrrstuwxy{}{slgddgoy|upkifdb`_^^]]\\[[[ZZZZZYYYYZZZ[\]^_`acefhjlnpruvy{|~~ztnhaZTPNPV_jvyrjd_[YVTRQPOOONNNNNNNNNNNOOOPPQRSTUWXZ\^`bdfiknpsuwz|~zsmhcaaemw|wtromlkjiiiiiiiijjjjkkklmmnopqrtuwy{}~yutv{|zxwuutssrrrrrqqqqqqrrrsstuvwxy{|~|vojeccflu{uqnkhecb`_^^]]\\[[[[[[[[[[[\\]^_`abdeghjlnpqsuwy{|~}yupjd^YTQQRW^hs}zsnheb_\ZXWVUTTTSSSSSSTTTTUUVWXYZ[\^_abdfhjlnpsuwy{}zuojeb`aejs}|zwsqomlkjjjiiiiijjjjkklmmnopqstuwyz|~}xtqqsw~|zxwvutssrrrqqqqqqrrssttuvwxyz|}|wqlgdbcfkr{{xuqmkhfecba``__^^^^^^^^^__``abcdefhiklnoqrtvxy{|~}zvrmhc^YVSSUY_gpy{vqnkgdb_^\[ZZYYXXXXXXYYYZZ[\]^_`abdegijlnprsuwy{}~yupkgca`adipy|xvsqpommllkkkkkklllmmnopqrstuwxz{}~|wspnnptz}{zxwutrqpnmkjiihggffffgggiijlmoqsuwxz}~yuqmkkknrx}|zyxxwwwvuuuutttssssrssrrrsstuuvwxy{|}}{yvsolhd`]ZXWWZ^dkt}}|{zyxwwwwvvvvvvvvvvwwxxxyzz{|}~~zwsqpoqty~|{yxwvuuttsrrqqpppoooooooooppqrsstuwxyz{}~}zwtqnkhecaabdhmsz|yxvuttssssssssssttttuuvvwxyyz{|~{xurpnmnosw{~zwtrpnnmlkjjjjiiiiijjjkkllmnopqrstuwxy{|~|yvspnlkklnrvz~{xusqponmllkkkkkkkkkkllmmnoopqrstuvwxz{|~}{xuroljhgfghjmqvz~zvspmkjhgfeddcccccbccccdddeffghijklmnoqrstvwxz{|}}{yvtqomkjijkmpsx|~|zxwuttssrrrrrrrsssttuuvwxyyz{|~~{yxwvwxz}~|{zyxwwvvvvvvvvvvvwwwxyyz{{|}~|zxusrppoprtvz}~|ywutrqpoonnmmmmmmmmmnnnooppqrrstuvwxxyz{|}~~|zxvtqomkihggghjloruy|}zwusqonmlkjjiiihhhhiiiijjkkllmnoppqrstuvwxy{|}~~|{ywusqpnmmmnoqtwz}}|zyxwvvuuuuuuuuuuvvwwxxyyz{||}~~}{yxxwxxz|~~}|{{zzzyyyyyyzzzz{{{||}~~~|zxvussrrrstvy{~}{zxwvttsrrqqqqppppqqqqrrrssttuuvwwxyzz{||}~~|{zxwusrpnmkjjjjklmortwz}~|zxvusrqppoonnnnnnnnnnoooppqqrrsttuvwxxyz{||}~~}{zxwutsqqpoppqrtvy{~~|{{zyyxxxxwwxxxxxyyyzz{{||}~}|{yyxxxyy{}~}}|||||{{||||||}}}~~~}{zxwvutssttuvxz|~}|zyxwwvuuutttttttttttuuuvvvwwxxyyzz{{||}~~~}|{zyxwutsqponmllmmnoprtvx{}}|zyxwvutsssrrrrrrrrrrrssstttuuvwwxxyzz{{|}}~~~}|{zyxwvutsrrqqrrstvxz|~~}}|{{{zzzzzzzzzz{{{|||}}~~~|{zzyxxxyyz{}~~~}}}}}}}}}}~~~~~}|{zxwvvuutuuuvxyz|~~}|{zzyxxwwwwwvvvvvwwwwwxxxxyyyzz{{{||}}}~~~~~}}|{zzyxwvusrqqpoonooopqrtvwy{~}|{zyxxwvvvuuuuuuuuuuuuvvvwwwxxyyyzz{{||}}~~~~~}||{zyxwvuutsssssstuvwy{|~~}||{{{zzzzzzzzzzzz{{{||||}}~~~~~}|{zyxxwvuuttttuuvwyz|}~~}||{{{{zzzzzzzzz{{{{{|||}}}~~~~~}||{zyxwwvuuuttuuvwxy{|~~}}||{{{{{{{{{{{{{{{||||}}}~~~~}||{zyxxwvvuuttuuvvwxz{}~~~}}|||{{{{{{{{{{{{||||}}}}~~~~}}|{zzyxwwvvuuuuuuvwxyz|}~}}}||||{{{{{{{{|||||}}}}~~~~~~}||{zyyxwwvvuuuuuvvwxy{|~~~}}}|||||||||||||||}}}}}~~~~~~}||{zzyxxwwvvuuuuvvwxyz{}~~~~}}}|||||||||||||}}}}}~~~~~~}}|{{zyyxwwvvvuuuvvwwxyz|}~~}}}}}|||||||||}}}}}}~~~~~~~}}||{zzyxxwwvvvvvvvvwxxz{|~~~~}}}}}}}|||}}}}}}}}~~~~~~~~}}||{{zyyxxwwvvvvvvvwwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~~~}}||{{zzyyxxwwvvvvvvwwxxyz|}~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}||{{zyyxxwwwvvvvvwwwxyz{|}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvvwwxxyz{}~~~~~~~}}}}}}}~~~~~~~~~~~~~}}|||{{zzyyxxwwwvvvvwwwxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}||{{zzzyyxxwwwwwwwwwxxyzz{}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{zzzyyxxxxwwwwwwxxxyz{{}~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwxxxyyz{|}~~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyxxxxwwwwxxxyyz{|}~~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~}}}}}|||{{{zzzzyyyxxxxxxxxxyyzz{|}}~~~~~~~~~~}}}}}||||{{{zzzyyyyxxxxxxxxyyyz{{|}~~~~~~~~~~~~}}}}||||{{{{zzzyyyyyxxxxxyyyyzz{|}}~~~~~~~~~~~~}}}}}||||{{{zzzzyyyyyyxxyyyyyzz{||}~~~~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyyyzz{{|}}~~~~~~~~~~~}}}}}}||||{{{{zzzzyyyyyyyyyyzzz{{||}~~~~~~~~~~~}}}}}}|||||{{{{zzzzzyyyyyyyyzzz{{||}}~~~~~~~~~~~~}}}}}}||||{{{{{zzzzzyyyyyyyzzzz{{||}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzyyzzzzzz{{||}}~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~}}}}}}}|||||{{{{{zzzzzzzzzzzzz{{{||}~~~~~~~~~~~~~}}}}}}||||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{zzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}~~~|{{{ywxvtvwvvvwwz|~t{|wrmfb^[YWVUTVWZ]acgkosvz|~~|yvsplifb`\[YXXVUUUUUVVWXZ[]acgkqwlytnx{uspquy~}yvtqokhfca^\ZXWVVUVVWXZ\^bdgjmpruxz}~~}~xmfiw{urqqsuvxz}~~~~~~~yof`]bky~tlfb_^]\\[\]]]^^__```````aaaabbcdefghikmoqsvxz}wof`]_ep~}umhc`_^]]]]]]^^____````````aaabbcddfghjkmoqsvwz|~}wog_VOJJMUao{ypg_XRNKJIGGGGGGHHHIIIJJJJKKKLLMNNOPQSTVXZ\^`behkmpsux{}~vngb`bis~xtpnmlkkkkllmnooppqrrsstuuvwxyz{|~|vrqt{{wusqpoonnnooooooopppppqqqrrsttuvxyz|~yqjc^\]bkvwpjeb`][ZYXXXXXXXXXXXXXYYYYZZZ[\\]^_abdegijmoqsuwy{}~ytnhaYRMIIMT^iu~~wphb\XUSQONMMMMMMMNNOOOPPQRRSTTUVWYZ[]_`bdgiknpsuwz|~wpjea_afny|wsqomkjjiiijjjkkllmnnoopqrstuvwyz|}~wsppsy}{xvtsrqppppppppppqqqrrrsttuvwxyz|}~{tmga]\]ahr|}wqlhfc`^][[ZYYYYYYYYYYYZZZ[[\]^^_`bcdfgiklnprtvxz{}~zvqke_YSOMMPV^hs|yrlgb`]ZXVUTTSSSSSTTTUUVVWXXYZ[\]_`acefhjlnpruwy{}~xrlgc`_aelu|yvsqomlkkjjjjkkkllmmnoopqrstuwxy{}~}xsommpu||ywutsrqqppppppqqqqrrsstuvwxyz{|~{upje`]\^agox}xspmigdba`_^]]\\\\\\]]]^^__`aabcdfghjkmnprsuwxz|}~{wsnic^YTQPPSX^gpyzuplifc`^][ZZYYYYYYYYZZ[\\]^_`abcdfgijlnpqsuwy{}}xsniea__adjrz|yvsrponmmlllmmmmnnoppqrstuvwyz|}}xsolkknrx{xvspnkihgedba```_^___``abdegijloqtvy{}{wsponopqqw|zxwvutrqponnmlkkjjjjjjjklmnoprsuwyz|}}zxurokhecbbcdddhu~|{zyxvvuuuttttttttuuvwxyz{}~}yvspnlmr{}zxvtsqponmllkkjiiiiijjjkklmnoprstvwyz{}~~|yvrokgc`^]_dlu}|zywwvuttttttttttuuvvwxyz{|}~yupkgca`bekqy|yvtrpomlkkjjiiiiiijjjkklmnopqrstvwyz|}|xtokgda``cgmt||zwusqponmllkkkkkkkklllmnnopqrstuvxyz|}~}zwsokgc_\ZZ[^cipw~~{xvsqnlkihfeedcccccccccdddefgghiklmnoqrsuvxy{|}~{xtqmifcaaadhmt{~|{yxwvuuttttttttuuvvwwxyz{|}~}zvspmlkmoty~}{zyxwwvvvvuuvvvvwwwxyyz{|}~}zwspligeddfinsz~{ywutsqpponnmmmmmmmmnnnoopqqrstuvwxyz{|}~~|zwurolieb`^]\^`dintz}|ywusrponmlkjjjiiiiijjjkkllmnoopqrstuwxyz{|}~~{yvsqnkhfedegjnty}|{zyxxwwvvvvvwwwxxyyzz{|}~~{xusqonnoquy~~}||{{zzzzzzzzzz{{||}}~}{xvspmkihghilotx~~|zywvutssrrqqqqqqqqqqrrrsstuuvwwxyzz{|}}~~}{yxvsqoligecaaabdgjoty}}{yxvutsrqqppoooooooooppqqrrsttuvwxxyz{|}~~}{zwusqnljihhhjlptx}~}||{zzzyyyyyyyzzz{{||}}~~|ywusqpopqrux|~~}}}|||||||}}}~~~}{ywusqomkjjklnqtx|~}|zyyxwvvuuutttttttuuuuvvwwxxyyzz{||}}~~~}|{zxwusqomkigfedeegilptx|}|{yxwwvuuttssssssssstttuuuvwwxxyzz{||}~~~}{zxvusqomlkjjklnqtx|~~}}||||{{{{||||}}}~~~|zxvusrqqqrsvx|~~~~~~~~~~}|zxwusqpnmmmmnprux{~}|{zzyyxxxwwwwwwwwxxxxyyyzzz{{||}}}~~~~}|{zywvtsqpnmkjihhhijlnqtx{~~}|{zyyxxwwwvvvvvvvvwwwwxxxyyzz{{||}}~~~}|{zywvtsqponmmmmnprux{~~}}|||{{{{{{{{{{||||}}}~~~}|zyxvusrponnnnopqtvy|~}}}|||{{{{{{{|||||}}}~~~~}|{zxwutsqpoonnopqsux{~~~}}}||||||||||||}}}}~~~~}|{zywvusrqpoooopqrtwy|~~~}}}||||||||||}}}}~~~~}|{zyxwutsrqpooooprsux{}~~}}}}}}|||}}}}}}}~~~~~~}|{zxwvutsqqppoppqsuwy|~~~~}}}}}}}}}}}}}~~~~~~~}|{zyxwvtsrqqppppqrtvxz}~~~~}}}}}}}}}}~~~~~~~}|{zyxwvutsrqqppqqrsuwy|~~~~~~}}}}}~~~~~~~~}||{zyxwvutsrqqqqqrstvxz}~~~~~~~~~~~~~~~~~}}|{zyxwvutssrqqqqrstuwy{~~~~~~~~~~~~~~~}}|{zyyxwvutsrrrqrrstuwxz|~~~~~~~~~~~}}|{{zyxwvuutssrrrrssuvxy{}~~~~~~~}||{zyxxwvuttsrrrrsstuwxz|~~~}||{zzyxwvvutsssrrsstuvxy{}~~}}|{{zyxxwvuutsssssstuvwyz|~~~}}||{zyyxwvvuuttsssstuuwxz{}~~}}||{zzyxxwvvutttsssttuvwyz|~~~}}||{{zyyxwwvuutttttttuvwxz{}~~~~}}||{zzyxxwvvuuttttttuvwxyz|~~~~}}||{{zyyxwwvvuuutttuuvvwyz{}~~~~}}||{{zzyyxwwvvuuuuuuuvvwxy{|}~~~}}}||{{zzyxxwwvvvuuuuuvvwxyz{}~~~~}}}||{{zzyyxxwwvvvvuuvvvwxyz{|}~~~~}}}|||{{zzyyxxwwwvvvvvvwwxxyz{}~~~~}}}}||{{zzzyyxxwwwvvvvvwwxxyz{|}~~~~~}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~}}}|||{{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~}}}}|||{{zzzyyyxxxwwwwwxxxyyz{|}~~~~~~}}}|||{{{zzzyyyxxxxxwxxxxyyz{{|}~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxyyzz{|}~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxyyzz{||}~~~~~~~}}}}|||{{{zzzzyyyyyxxxxyyyzz{{|}~~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyzz{{||}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyzzz{||}~~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyzzz{{|}}~~~~~~~~}}}}||||{{{{zzzzzzyyyyyzzzz{{||}~~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzzz{{||}}~~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzz{{|||}~~~~~~~~~}}}}}}||||{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzz{{{{||}}~~|xuspnllkllllmnoprsuwy{}~lur{xtojea\XSOKHECBBBCEHKOTY_djouz~}zxvvvttsrrrssttuvx{|{}|{z{|}qivqd_`cfjlpoopqqoonljhfca]YWUROMKIGFDCCCCDEGILORVZ^bgkptx}yz{yxyzz{}}~~}|yxwutsrqpoooooppqsuwy{}ypg`^ajwvngc`^][[Z[[[[[[[[[[ZZZZZZZZ[[\]^_abdfhjmorux{~zqib_`fp}vnhc_^\[ZYYYYYXXXXWWWWWVVVVVVWWXXZ[\^`acfhjmortwy||vog^VOJHLT_myzqh`YSOKJIGFFFFFFFFGGGGGHHHIIJJKLNOPRTVX[]`beiloruy|{tnlms}|xutsqqppppppppqqqqqqqqrrsttuwxy{}{uqpsz~ytrpnlkjiihhhgggggffffffggghijklnoqsuwy{~woha\YZ_gr~}umgb^\YWUSRRQQPPPOOOOOOOOOOPPQRRTUVXY[]_acehjmortvy{}|wrkd]VPMLOV`kw{tle`[XVSQPONNNNMNNNNNOOPPQQRSTUVXY[\_acehjmoruxz}ysmiginv~ywtrpnmmlllllllllmmmmnnopqrstvwy{}xspprx{yvspomlkkjiiiihhhhhhhiijjklmnpqrtvxz|~~xqkd_[YZ^enxzsnhdb^[YWVTTSRRQQQQQQQQQRRSSTUVWXZ[]_`bdgikmoqtvxz|~~ytoic]WSPPSX`ju|vpjec`]ZXWVUTTTSSSTTTUUVVWXYZ[\]_abdfhjloqsvx{}ytnjfegkqz}{wtrponmllkkkkkkkllmmnopqrstvwyz|~ytpnnpu|~zwtrpomllkjjjjjiijjjkkllmnoprstvwy{}~ysnhb^[Z[^dkt~{upmieb`^\ZYXWWVVVUUVVVVWWXYYZ[\^_abdegikmoqsuwxz|~~zvqlga\XTSSUZ`ir{}xrnlheb`^\[ZZYYXXXYYYZZ[\\]^_abcefhjlnprtvxz|~~ytokgedfiov|yvtrqoonmmmmmmmmmnnopqrstuvxy{}~|wspmlkklnsz}ytpkgda_]\[ZYYYYYYZ[\]^_abdfhklnpsvx{|~}xsomllnsyyrpuoiklmmllkjiiiijiiijjklllmnnopqqrsttuvwxyz{|~}yuplhecbceiov}|x|}vrrstuuvvwwwxxyyzz{|}}~zvspnmnpty{vtvwvqlhfeeeeeeeefffffggghhiijjklmnopqrstuvwyz{}~{xtqnljjjlpu{}zwusrqqqqqrrrsttuvwwxyz{|}}{wtpmkjijmpu{{ywvvvvutrpnljhhgggggghiijkklmnoqrstuwxy{|}{xuromkjklosx~|zyxxxxwusqomkjiihhhhiiijkklmmnopqrstuwxyz{|}~~{xurolifeccdfimrx}|xvsqpppponmkigedbbaaaaabbccdefghijklmnoqrstvwxz{|}}zxusqonnnpsv{~|{ywvuttttttuuuvwxxyz{|}~|zxvvuvx{~}{ywvutsssssssttuuvvwxyyz{|}~}zxusqonnnoqtx|}|{{{zzywvtrpomlkkkjjjjkkkllmmnoopqrsstuvwxyzz{|}~~}{ywuspnljhggghilorw{}{yxwwwwwvutrqomlkjiiiiiijjjkklmmnopqrstuvwwxyz{|}~}{yxvtsqqqqrtwz~~|{yxxwwwwwwwwxxyyz{{|}~~~|{yxxxyz|~}{zyyxxxwwxxxxyyyzz{||}}~}{yxvtsqqpqrsux{~~~~}|{zxwutrqppooonnnnoooppqqrrsstuuvwwxyyz{{|}}~~~}|{zxvusqpnmlkkklmoqtwz~~}||||||{zyxwutsrqppooooooopppqqrsstuuvwxxyz{{|}~~~|{yxvutssstuvxz}~}|{{zzyyyyzzzz{{||}}~~|{zzyyz{}~}||{{{zzzz{{{{|||}}~~~|{yxwuttssstuwy{}}|{yxwvuttssrrrrrrssssttuuuvvwwxxyyzz{{||}}~~~~}}|{zyxvutsqpoonnnopqsuwz|~}|{zxwvuuttsssssssstttuuvvwwxxyyz{{||}}~~}|{zyxwvvuuuuvwy{}~~}}|||||||||}}}~~~}|{{zzz{|}~~~}}}||||||}}}}}~~~~}|{yxwwvuuuuvwxy{}~}{zyyxwwvvvvuuuuvvvvvwwwxxxyyyzzz{{|||}}}}~~~~~~~~~~~~}}||{zyyxwvutsrrqqqqqrstvxy{}~}|{zyyxwwwvvvvvvvvwwwxxxyyzzz{{||}}}~~~}||{zyxxwwwvwwwxy{|~~~}||{{{zzzzzzzz{{{{|||}}}~~~~}||{zyxxwwvvvwwxy{|~~}}||{{{{{z{{{{{{{||||}}}~~~~}}|{zzyxxwwwwwwxyz{}~~~}}||{{{{{{{{{{{||||}}}}~~~~~}|{{zyyxxwwwwxxyz{|}~~}}||||{{{{{||||||}}}}~~~~~~}||{zzyxxxxwwxxyyz{}~~~}}}|||||||||||||}}}}~~~~~~~}}|{{zyyxxxxxxxxyz{|}~~~}}}|||||||||||}}}}}~~~~~~~}}||{zzyyxxxxxxxyzz{|}~~~}}}}||||||}}}}}}}~~~~~~~}}||{{zzyyyxxxxxyyz{|}~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}|{{zzzyyyxxxyyyzz{|}~~~~}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyyyxxyyyzz{||}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}|||{{zzyyyyyyyyyzz{|}~~~~~~~}}}}}}}~~~~~~~~~~~~}}}||{{{zzzyyyyyyyzz{{|}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyyyyyyzz{{||}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzyyyyyyzzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzzzzzzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzzzzzzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzzzzzzzzzz{{||}}~~~~~~~~~~~~~~~~~~~~}}}}}|||{{{{zzzzzzzzzz{{{||}}}~~~~~~~~~~~~}}}}||||{{{{zzzzzzzzz{{{|||}}~~~~~~~~~~~~}}}}||||{{{{zzzzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}||||{{{{{zzzzzzzz{{{{||}}}~~~~~~~~~~~~}}}}}|||||{{{{{zzzzzzz{{{{|||}}}~~~~~~~~~~~~}}}}}}||||{{{{{{zzzzz{{{{{|||}}}~~~~~~~~~~~~~}}}}}|||||{{{{{{zz{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}|||||{{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{|||||}}}~~~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{|||||||}}}}~~~~~~~~~~~~~}}}}}}}||||||||{{{{{{|||||||}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}}}~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m36.bin b/applications/SprPoP/assets/packed/MUS/m36.bin deleted file mode 100644 index 66f4253..0000000 --- a/applications/SprPoP/assets/packed/MUS/m36.bin +++ /dev/null @@ -1 +0,0 @@ -zvqnlhda_[YYVTTSRRRRRSUVXXZ]_beihkoquy|{}~{vusrppmjjihhhgeeeeeffdddedddbbba``_]\\ZZYXWWVUUTTTTTTUVVWXYZZ[]_`bcegjmpsvz}~yw~~}{zwutsqpomkjiihgedddcccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccddeefghijklmopqstuwxxyyyxwutssuy}~~~~~~}}}|}}||||||}}}}}}}~~}{yxwxy|}{yxwvvuuuuutttttttsssssrrrrrrqqqqqqqqqqqrrrrssstttuuuvvvwwwxxxxxxxyxyxxxxxwwwvvvvuuuuttttsssrrrqqpoonlkigec`^]\\]_adgikkkihfca_]\[ZYXXWWWWWWWWWWWWWWWWWWWWWWWXXXXXYYZZ[[\\]^^_`abccdefghiijklmmnoopqrrssttuuvvwwwxxyyzz{{||}}}~~~~~}||{yxwuutuvy{}|zyxxy{}}{zxwutssrqqpppooonnnnmmmlllllllkkkkkkkkkkkllllmmmmnnnooopppqqqqqqqrrrrrrrrqqqqqqqppqqpppppooonnmmlkjihfeca_^]\]]_adfiklmmmlkigfdca``_^^^]]]]^^^^^^^^^^^_____```aaabbccddeffghhijkklmnnopqrrsttuvvwwxyyyzz{{{|||}}}~~~~~}||zyxwvuuuvxz}}{zyxxyz{}}|zywvutssrrqqppoooonnnmmmmmmmmlllllmmmmmmmmnnnnoooppppqqqrrrrrssssssssssssssssssssssssrrrrqqpponnmkjigfecbaaabcdfikmoqrrrqponmkjihgfeeddcccccccccddddddeeeeefffgghhhiijjkllmmnoopqqrsstuuvvwxxyyzz{{|||}}}~~~~~}|{zyxwvuuuvwy{~~|{zyxxyy{|~}|{yxwvvuttssrrrqqqppppppoooooooooopppppppqqqqrrrrssssttttuuuuuvvvvvvvvvvvvvvvvvvuuvxy{}~|zxvutrqpoonnnnmmmmnnnnooppqrrstuuvwxyz{|}~}~}|{zyxwvuttsrqqpooonnmmmmmmmmnnnooppqqrssttuuvwwwxxyyyzzz{{{|||}}}~~~}|}~}~~}|{yxwvvutssrqqppooonnnnmmmmnnnnoooppqqqrrsttuuvwwxxyyzz{{||}}~~~}||||}~|{zzzz{|}~~}}||{{{zzzzzzzyyzzzzzzzz{{{|||}}}~~~}|zyxwvvwwxz{|}~~}||{zzyyxxwwwvvvvvvvvvvvvvvvvvvwwwwxxxyyyzzz{{{{|||}}}}}~~~~~~~~~~~~~~~~~}}}|||{{zyxwvutrqponmmmnopqrsuvvwxyyzzzzzzyyxwwvuutssrrqqqpppppppppppppppqqqqrrsssttuuvvwwxxyzz{{||}}~~~}|{zzyyzz{|~~}{zyxwwvvvwxyz{|}~~}}|{{zyyxxwwwvvvuuuuuuuuuuuuuuuuuuvvvvwwwwxxxxyyyzzzz{{{{{||||||||||}}}}||||||||{{{{zzyyxwvutsrqqpooooppqrtuvwxyzz{||||||||{{zzyyxxwwvvuuutttttttttttttttuuuuvvvwwwxxyyyzz{{{||}}}~~~~}|{zzyyyyzz{}~~}|{zyxxwwwwwxyy{|}}~~~}||{{zzyyyxxxwwwwwwwvvvvvvwwwwwwwwxxxxxyyyyyzzzzz{{{{{|||||||}}}}}}}}}}}||||||{{{zzyyxxwvuutsrrqqqqrrstuvwyyz{||}}}~~~~}}}}||{{{zzyyyxxxxwwwwwwwwwwwwwwwwxxxxyyyyzzz{{{|||}}}~~~~~~}|{{zzyyyyzz{|}~~~}||{zyyxxxwxxxyz{|}~~~~}}||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyyyzzzzzz{{{{{{||||||||}}}}}}}}}}}}}}}|||||{{{zzyyxxwwvuuttssssssttuvwxyz{||}~~~~~~~}}|||{{{zzzzyyyyyyyyyyyyyyyyyyyzzzzz{{{{||||}}}}~~~~~~}}||{{zzzyyzzz{|}~~~~~~~~}}||{zzzyyyyyyzz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyyyyyzz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzzyyyyyzz{||}~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzzyyyyyzz{{|}~~~~~~~~~~~~~~~~~~~~~}}||{{{zzzyyyzzz{{|}~~~~~~~~~~~~~~~~~~~~}}||{{{zzzyyyzzz{{|}}~~~~~~~~~~~~~~~}}|||{{zzzzzzzzz{{||}~~~~~~}}|||{{{zzzzzzzzz{||}~~~~~}}}||{{{zzzzzzzzz{{|}}~~~~~}}}||{{{zzzzzzzzz{{||}~~~~~}}}|||{{{zzzzzzzz{{||}~~~~~~}}}|||{{{zzzzzzzz{{||}}~~~~~}}}|||{{{{zzzzzzz{{||}}~~~~~~}}}|||{{{{zzzzzz{{{|||}~~~~~~}}}}||||{{{{zzzzz{{{{||}}~~~~~}}}}||||{{{{zzzzz{{{{||}}~~~~~~~}}}||||{{{{{{zzz{{{{||}}~~~~~~~}}}}||||{{{{{{{{{{{{|||}}~~~~~~~}}}}|||||{{{{{{{{{{{|||}}~~~~~~~~}}}}}||||{{{{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{{{{|||}}~~~~~~~~}}}}}||||||{{{{{{{{||||}}}~~~~~~~~}}}}}}||||||{{{{{{{||||}}}~~~~~~~~~}}}}}}|||||||{{{{{|||||}}}~~~~~~~~~~~}}}}}}||||||||||||||||}}}~~~~~~~~~~~}}}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}}|||||||||||||||}}}}~~~~~~~~~~~}}}}}}}||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~}zvsqprwy|}}}~~~~}}|{zyxwwwvtssrrsrpoonpqpnnopqstrsuvxy{y{}~{~u{|zyxwvusppnmljgeca`^\YVTRQOMJHGFFEEDDEFGIJLNPSVX[^`cfhkmortuwxyz{||||}~xrqu~zrlgdbbabbba``___^][[ZYXWUSRQPONLKJIIHHGFFGGGHIIJLMOPSTVX[]_acfhjmoqsuvxz|}~{z{}}|{{{zzzzzzzzzzzyyyyyxxxxxxwwwwwwwxxxyyzz{||}~~{xtqnljjlosx}~{xtromkjihhggfffeeedddccbbaa``___^^^^]]]]]]]]^^^__``aaabbccddeeffgggggggggggffffeedddccccbbbbaaaa``__^]\[YWTQNKIFEEFIMRW\_aba_]ZWURPONMLLLLMMMMNOOOPPPQQQRRSSSTUUVVWXYZ[\]^_`bcdfhiklnoqrtuwxz{}~~|zxvsoligedcdgjmruy{||zxvspmkhfdcb`__^]]\\\[[ZZZYYYXXXWWWWWWWWWWWWWXXXYYZZ[[\]]^^_``abbccddeefffffgggggggggggffffgfffffeeeddcb`_][YWURPONNOQUY]bfikmmljhfdb`^]\[ZZYYYYYYZZZ[[[[\\\]]^^__``aabccdefghijklnopqstuwxyz{}~}|zxvtqoljgfedefikosvy{|}|{ywtromkigfdcbaa`__^^^]]]\\\\[[[[[[[[[[[\\\\]]]^^__``aabccddeffgghhiijjjkkkkllllllllllllllllllkkkjiihgedba_][YWVUUVXZ]aeimprstsrqomljhgedcbbaaaaaaaaaaabbccccddeeffgghhijkklmnopqrstuvwxyz{|}~~}||}~~}{zxvtrpmkihggghjmpsvy{}}|zxvtrpnmkjihgfeeddccbbbbaaaaaaaaaaaaaabbbbcccddeeffgghhiijkklllmmnnooooppppppppppqpppppppooonmlkjihfecb`^][[ZZ[\^`cgjnqtvwxxxwvusqpnmlkjihhgggffffffggggghhhiiijjkklmmnoopqrrstuvwxyzz{|}~~|{zzz{|~}}||}~~}||{{{zzzzzzzz{{{{||}}~~~|yvtqnlkiggfghjlorux{}~~~}|{zyxxxwxwvwwwxxyxyyzz{|{||}~~~|zywussrssuvwz|~~}|{zzyxwuttsrponmlkjihhgggffffffgghiijklmnpqrtuvxy{|~~~~}}|{{zzyxwvutsqpomlkihhgffghjlnqtw{~~|{yxvutsrqqqppppppqqqrrrssttuuvvwxy{}~{|}{{|}~~~~}}|{{zyyxwvutsqponmlkkjjjkklnprtwz~~}|{zyxwvvvvvwxz{}~~}}|||{{{{{{{{{{{{{zzyxwvutstuvx{}~~}|zzyyxxxxxxxxxxxxxxxxxxxwwwvvuuttssrqpoonmlkjiihhhijklnpruwz|~}|{{zzyyyxxxxxxxxxxxxxxxxxxwwvuttssstvxz}~~}}||{{{{||||||}}}}}}}}}}||||{{zzyyxwwvuttsrrqqqqqrstvwy|~~~~~~~~~}}||{zyxxxyz|~~~~}}|{{zyyxwwvvvuvvwwyz|~~}||{zzyyxxxyyz{}~~~}|{zyyxxxyz|}~}}|||{{{{{{{{{zzzzzyyyxxxwvvuutssrqqpoonnnmnnnoprsuwy{}~~}}|||{{{{{{zzzzzyyxxwvvuttssstuvxz|}~~~}|{{zzzyyyyyyyyyyyyyyxxxxxwwwvvuuttssrrqqppooooppqrsuwy{}~~}||{zzyyyz{|~~~~}}||{{zyyxxxwwwxxxyz{}~~~}}||{zzyyxxxxxxxyzz|}~~}}|{zzyyyz{|}~~}}|||{{{{{zzzzzyyyxxxwwvvuuttssrrqqqppppqqrstuvxy{|~~~~}}}}|||{{zzyyxwwvuutttuuvxy{|~~~}||{{zzyyyyxxxxxxxxwwwwwvvvvuutttssrrrqqqqqqqqrrstuwxz{}~}}||{zzzzz{|}~~~~~~~}}}}|||{{zzzyyyxxxxxxxyyz{|}~~~}}}||{{zzzyyyxxxxxyyzz{|~~}|{{zzzzz{|}~~~}}||{{{{zzzzyyyxxxwwwvvuuuttsssrrrrrrrsstuvwxy{|}~~}}}||{zzyxxwwvvvvvvwxz{|}~~~}||{{zzzyyyyxxxxxxwwwwvvvuuutttssssrrrrrrssttuvwxz{|~~}}||{{zzzz{|}~~~~~~}}}}}||||{{{zzzzyyyyxxxxxyyzz{|}~~~}}}}}}~~~~}}}||||{{{{zzzzz{{{|}~~~~~~}}}||||{{{zzzzyyyxxxwwwwvvvvvvvwwwxyyz{|}~~}||{{zzzz{{|}~~~}}}||||{{{{zzzzyyyxxxxwwwwvvvvvvwwwxyyz{|}~~~}}|{{{zzz{{|}~~~~}}}|||{{{{zzzyyyyxxxxwwwwwwwwwwwxxyyz{|}~~}}||{{{z{{{|}~~~~}}||||{{{{zzzyyyyxxxxwwwwwwwwwwxxyyz{{|}~~~}||{{{{{{{||}~~~}}}|||{{{{zzzzyyyxxxxxwwwwwwwwwxxyyz{{|}~~~}|||{{{{{{||}~~~}}}|||{{{{zzzzyyyyxxxxxwwwwwwxxxyyzz{|}~~~~}}||{{{{{{{|}~~~~~}}}|||{{{{zzzyyyyxxxxxxwwwxxxxxyyzz{||}~~~}}||{{{{{{{||}~~~~}}||||{{{zzzzyyyyxxxxxxxxxxxxxyyzz{||}~~}}|||{{{{{{||}~~~}}}|||{{{{zzzzyyyyxxxxxxxxxxxyyyzz{{|}~~~~}}||{{{{{{||}}~~~}}}|||{{{{zzzzyyyyyxxxxxxxxxyyyzz{{|}}~~~}}|||{{{{{{|}}~~~}}}|||{{{{zzzzzyyyyyyxxxxyyyyyzz{{||}~~~~}}|||{{{{{{||}~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyyzzz{{||}~~~~}}|||{{{{{||}}~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyzzz{{||}}~~~~}}|||{{{{{||}}~~~~}}}|||{{{{zzzzzzyyyyyyyyyzzzz{{||}}~~~~}}|||{{{{{|||}~~~~~}}}|||{{{{zzzzzzyyyyyyyyzzzz{{||}}~~~~}}||||{{{{|||}}~~~~}}}|||{{{{{zzzzzzzzzzzzzzzz{{|||}}~~~}}}|||{{{{|||}}~~~~}}}}|||{{{{{zzzzzzzzzzzzzz{{{|||}}~~~~}}}||||{{{||||}~~~~}}}}||||{{{{{zzzzzzzzzzz{{{{|||}}~~~~~}}||||{{{{|||}}~~~~}}}||||{{{{{{zzzzzzzzz{{{{|||}}~~~~~}}}||||{{||||}}~~~~~}}}||||{{{{{{{zzzzzz{{{{{|||}}}~~~~}}}|||||{||||}}~~~~~}}}|||||{{{{{{{{{{{{{{{{|||}}}~~~~}}}|||||||||||}}~~~~~}}}|||||{{{{{{{{{{{{{{{||||}}~~~~~}}}|||||||||||}}~~~~~}}}}|||||{{{{{{{{{{{{||||}}}~~~~~~}}}||||||||||}}}~~~~~}}}}||||||{{{{{{{{{|||||}}}}~~~~}}}}|||||||||}}}~~~~~~}}}}|||||||{{{{{|||||||}}}}~~~~~~}}}}||||||||}}}~~~~~~}}}}}|||||||||||||||||}}}}~~~~~~}}}}}||||||}}}}~~~~~~}}}}}}|||||||||||||||}}}}~~~~~~}}}}}|||||}}}}~~~~~~~}}}}}}|||||||||||||}}}}}~~~~~~~~}}}}}}||}}}}}~~~~~~~}}}}}}}||||||||||}}}}}}~~~~~~~}}}}}}}}}}}}}~~~~~~~}}}}}}}}|||||||}}}}}}}~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}yvsqnmkhfdcaaaaeiotwz|~}{{zyxxtrsrrqronoopqrqprstuxz{}}zwtqnjfeca`_\ZZYYXXUSSRQPPNLMNRV^emodIRlKHX_fhllllmmnoooppqqrssstttttsrqqponmlkjjihhhhijkmpruw{~Ƽñ}zwvtsqponnnmnnnnopqrttsqmg_UMGGN[gnld\SLGEEEFHJLNQQRSUVWYZ[[\\]]]]^^__``abbcdeghjlnprtwy|{vrpprx|xurpnnmmmmmmmmmmmnnnnmmmmmmmmmmmmmmnnnoppqrstuvwxy{|}|xtojd_[YXZ^dkrx|~|yuoje`\XVSRPOONNNMMMMLLLLKKKJJJJIIIIIIIIIIIJJKLLMNOPQRSTUWXYZ\]^_`abcddeffgghhhiiiiiiijjjjkkkklllmmmmmmmlkifd`\XTPLJJKOU]dlquvvsplhd`][YXWVVVWWXXYZ[\]]^_``abcddefghijklmopqstvxz{}~|zyxwvvuutttssssrrrqqqqppppppppppqqqrssttuvwxyyz{|}~~~}{zywtrnkgc^ZVSQPQUY_ekqtvvurnjea]YVTQONMLKJJJIIIIIIIIIIIIIIIIIJJJKKKLMMNOPQRSTVWXYZ\]^`abcefghijkklmnnoppqqqrrsssstttuuuuvvvuuttsrpnlifb_[XUSSTW\bhouz~~|yurnkhfdba``___```aabbccddeffghhijkklmnopqstuwxy{}~~|{yxwwvuutttsssrrrrrrrqqqqqqrrrrsstttuvvwxxyz{{|}~~}|{ywuspmjfc_[XUTSTVY^cinswyzywtqnjfc_]ZXVUSSRRQPPPPOOOOOOOOOPPPQQQRRSSTTUVWXYZ[\]^_`acdefghjklmnoppqrsstuuvvwwxxxyyyyyzzzzzzyyxxwutrpnkheb_\ZYXY[_ciouz~{xvspnljihgfffeeffffggghhiijjkllmnoopqrstuwxyz|}~}||}~|{yxwwvuutttsssssrrrrrrrsssssttuuuvwwxxyzz{||}~~~}{zxvtromjgd`^[YXWXZ\`dinswz}~~}|ywtqnkheca_]\[ZYXXWWWVVVVVVVVWWWWXXYYYZ[[\]]^_`abcdefghijklmnopqrsstuuvvwxxyyyzzz{{{{{{{{{{zzyxwvtsqomjhec`^]\[\^`dhmrx}|zwusqonmlkkjjjjjjjjjkkkllmmnnopqqrstuvwxyz{|}~~}|}~~{ywvutuwy}}{zxwuttsrrqqqqppppqqqrrrrssttuuvvwxxyz{{|}~~{ywtromlkkkmorvz~|{ywvvuttssrrrqqqqqrrrrrsssttuuvvwxxyzz{|}~~}xsnjgda_]\\^__`bb`bb_^]\XWVTSRRPOOPQSUUTWY]_cddhkpsxzz~~~~}vsnjfa\VSOLIGD@?=<;::999::;<=>@ACDFHIKMNPRTVWXZ[]_`bcdfgikmnpsuwy{}ztpmkhfefghjlmpsuwxxwvvtrolhda]ZWSPMKHFEDBA@????>???@ABCDFGHJLNOQSUVXZ\^_acegikmnprtwxz|~}yvsqpppqruw{~~|{zyxwwvvvvuvvwwwxxyz{{|}~~}zxwvvxy{||{zwsplifdcbabcegjmpsuwz{||||{zxvtsqomkihfedcba```_______``aaabbccdddeefffggghhhiiiiijjjjjjjjjjjjiiiiiihhhgfedb`^\YWTRPNMMNOQRSSRQNKHEB@>>=>?@CEHKNQTVXZ[\\\\[ZYXWVUTSRQPPPQQQQQRRSTUVVXYZ[]^_abceghjkmnoqrtuvxyz{|~~{xvtrpoopqrsttsrpnkhfca`_^__`bcegikmnopqqqponmljigfecba__^]\\[[ZZZZZZZ[[[\\]]]^^__``aabbbccdddeeffffggggghhhhhhhhhhggffedcb`^\ZXVTSQQQRSTVXYYYXWUSQONLLLLMOQSUWZ\^`bdeffggfffeddcbaa``______``aabbcdeffghijkmnopqrstvwxyz{|}~~~}~~}zxvtrponmmnopqrrrrpomkigfeddddefghiklmnopqqqpponmlkjihgfeddcbbaa``````````abbbcccdddeeffggghhhiiijjjjkkkkkklllllkkkkjjiihgfdcb`^\[YXWVVWXY[\^_```_^]\ZYYXXYYZ[]^`bdeghjkkllmmlllkkjjiiihhhhhhhhiiijjkklmmnopqqrstuvwxyyz{|}}~~}|{zzz{|}~|{ywusqponnnnopqrstttsrqponmlkkjkkklmnopqrrsssssssrqqponnmlkkjiihhhggggggggggghhhiiijjjjkkkllllmmmmnnnnooooooooooonnnmmllkjihgedca`^]\[ZZ[\\^_abcdeeeddcbbaaaabbcdefhijklmnooppppppppooonnnnnmmmnnnnnooppqqrrsttuuvwxxyzz{||}~~~}|zyyxxxxyz|~~|{zxwvutsssstuvwyz{|}}}}}||{{zzzz{{||}~~~~~~~~~~~~~|{zxwvutssssstuwxyz{|}}}}}}||{{{{{{||}~~~}|{zywvutssssstuvwyz{|}}~~~}}}|||||||}}~~}|{yxwvutssssstuvwxy{|}}~~~~~}}}}||}}}~~~}|{yxwvutsssssstuvxyz{|}~~~~~~~~}}}}}~~~~}|zyxwvutsssssstuvwxz{|}~~~~~~~~~~~}}{zyxwvutsssrrsstuvxyz{|}~~~~~~~}|{zyxwvuttssrrsstuvwyz{|}~~}|{zyxwvuutssrrsstuvwxy{|}~~~}|{zyxwvuutssrrssttuvxyz{|}~~~}|{zyxwvvutsssrssstuvwxz{|}~~}||{zyxwvvutssssssstuvwxyz|}~~~}|{{zyxwvvuttssssssttuwxyz{|}~~~}|{{zyxwwvuttssssssttuvwxz{|}~~}}|{{zyxwwvuttssssssstuvwxyz|}~~~}}|{zzyxwwvuttssssssstuvwxyz{|}~~~}||{{zyxwwvuuttssssssttuvwxy{|}~~~~}||{zzyxxwvuuttssssssttuvwxyz{}~~~}}||{zzyxxwvvuttssssssttuvwxyz{|}~~~}}||{{zyxxwvvutttsssssttuvvwyz{|}~~~}}||{{zzyxxwvvuuttsssssttuuvwxyz{}~~~}}||{{zzyxxwvvuutttssssttuuvwxyz{|}~~~~}}||{{zzyxxwwvuutttsssssttuvwxyz{|}~~~~}}||{{zzyxxwwvuutttsssstttuvvwxyz{}~~~}}}||{{zzyxxwwvvuutttssstttuuvwxyz{|}~~~~}}}||{{zzyyxwwvvuutttttttttuuvwxyz{|}~~~~}}}||{{zzyyxxwwvvuuttttttttuuvwxyy{{|}~~~~}}}||{{{zzyyxxwwvvuuuttttuuuvvwxxyz{|}~~~~}}}||{{zzzyyxxwwvvvuuuuuuuuuvvwxxyz{|}~~~~~~}}}||{{{zzyyxxxwwvvvuuuuuuuvvvwwxyz{{|}~~~~~}}}|||{{zzyyyxxwwwvvvuuuuuuvvvwwxyzz{|}~~~~~}}}|||{{zzzyyxxxwwvvvvvuuuvvvvwwxyyz{|}}~~~~~}}}|||{{{zzyyyxxxwwwvvvvvvvvvwwwxyyz{{|}~~~~~~}}}|||{{{zzzyyxxxwwwwvvvvvvvvwwxxyyz{{|}}~~~~~}}}}|||{{{zzyyyxxxwwwwwvvvvvwwwxxyyzz{||}~~~~~}}}}|||{{{zzzyyyxxxwwwwwwwwwwwwxxyyzz{||}~~~~~~~}}}||||{{zzzyyyxxxxwwwwwwwwwwwxxyyzz{{|}}~~~~~~}}}||||{{{zzzyyyxxxxxwwwwwwwwxxxyyzz{{||}~~~~~~~}}}}|||{{{{zzzyyyxxxxxwwwwwwxxxxyyzz{{||}}~~~~~~}}}}||||{{{zzzzyyyxxxxxxxxxxxxxxyyzzz{||}}~~~~~~}}}}||||{{{{zzzyyyyxxxxxxxxxxxxyyyzzz{{|}}~~~~~~~}}}}||||{{{zzzzyyyyyxxxxxxxxxxyyyzzz{{||}}~~~~~~}}}}||||{{{{zzzzyyyyyxxxxxxxxyyyyzzz{{||}}~~~~~~~}}}}}||||{{{{zzzzyyyyyyyxxxyyyyyyzzz{{||}}~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyyyyyyzzzz{{|||}}~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyyyyyyyzzzz{{|||}}~~~~~~~}}}}}||||{{{{{zzzzzyyyyyyyyyyyyzzzz{{|||}}~~~~~~~~~}}}}}||||{{{{{zzzzzzyyyyyyyyyzzzzz{{{||}}}~~~~~~~}}}}}|||||{{{{{zzzzzzzzyyyyzzzzzz{{{{||}}}~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzzzzzzz{{{{|||}}~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzzzz{{{{|||}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzz{{{{{|||}}}~~~~{xurpoljhfedcbaa`````aabcddeghjkmlnoqsuvuwxz|}}~{wtqlgd`\ZXTPMKIGFDBA@@@???@@ABBCEGHKMLOQTVY[[^adgilloruxz}|}tpqkfgfbaba_``_`aaacdegikmpsvz}|yvsrqonlllllllkkkjjihggfghoxgsjj|zxvutsrrstvx{~z~vorsx~|zwurolhec`^[ZXVUTSSSSTVWY[^adhlosw{yz}zxyz|~|{zxxwvvuuuuvvxyz|~vkb]\akxxqib]YWUTSSSSTTSSSSSSSSSRRRQQQPPPPPQQQRSTUVXY[\^`bdgiknpruwy{}~zung_XPJGHLT`mx|uld]WRNKIHGGFGGGGHHHIIIIIJJJJJJKKLLMNOPQRTUWXZ\_acfhknpsvx{}zrjc^ZZ]dnzwpkfb`^\\[[[[\\\\]]^^^___``aabbcdefghjkmnpruwy{~|xvx~}zxwvvuuuuuuuuuuuuuuvvvvvwwxxyz{|}~xqkfdeioyztnjeb`]\[ZYXXXWWWWWWWWVVVVVVWWWXXYZZ[]^_`bdegikmoqsuwy{}}zuoic\VPLJJMS[eoy~wqjc^YUQOMKJIHHGGGGGGHHHHHIIIJJKKLMNOPQRSUWXZ\^`begilnpsuxz|~}xrlfa\ZZ\ais}}wrnjgdba`__^^^^___```aabbccdefghijkmnpqsuwy{}{vsrtx~|ywvtssrrqqqqqqqqqqqrrrssttuvwxyz{|~ztnifddgls{~xsnjgdb`_^]\[[ZZZZZZZZZZZZZ[[\\]^^_`acdegijlmoqstvxz|}|xsnic]XSOMMOSZbkt|{uoje`\YVTRPONNMMLLLLLLMMMNNNOPQRRSTUVXYZ\]_acefhkmoqsuwy{}~ytojea][[\_emu~{vroligfdcbbcbbbbbbccddeeffghijklnoprsuwxz|~{vrpoorw~~|ywvtsrqqqppppppppqqqrrsttuvwxyz|}~|vqlhecceiov}}yuqmjhfdcba`_^^^]]]]]^^^^__``abccdfghijlmoprsuwxz{}~ysokfa]XURQPRV[ahpx|wrmifb`][YXWVUTTSSSSSSTTTUUVVWXYZ[\]^`abdegiklnprtuwy{}~|xtpkgc`]\[]_djqy|xurpmljihgffeeeeefffgghiijklmnopqstvwyz|~}yurolkklptz}zxutrqponmmmmlmmmmnnnoppqrstuvwyz{}~|xtpmkjjlosy~zwtqomljihggffffffffgghhijjklmnoqrsuwxy{|~~zvrnifc`__`cglrz|yuspnmkjihgfffeeeeffffghiijklmnopqrsuvxyz|}}yurnjfca__`bejpv}|yvsqomljjjihhhggggghhhiijkklmnopqrstvwxz{}~}yvrnjgda`__adhmsz~{xusqpnmlkjiiihhhhhiiijjkllmnopqrstvwxy{|}}yvrokhdb`__`cfkqw~~{xvtrponmlkjjjiiiiijjjkklmmnopqrstuwxyz{}~}zvsnjgdb`__`cfjou{~{yvtrqonmllkkkjjjjkkkllmmnoopqrstuvxyz{|~~{xuqnkgdb`__`behmsy~{ywusrponmmlllkkkklllmmnnoppqrstuvwxz{|}~~{wtqnkheca`_`acgkpv|~|ywutrqponnmmlllllmmmnnoopqqrstuvwxyz|}~}zxtqnkhfca`__`ceinsy~|zxvtsrqpoonnmmmmmnnnooppqrrstuvwxyz{|~}zwuqnlifdb`__`bdhlqw}}zxwuspnljihfeddddefghjklnorsuusuvuuwunopmmnmgggffffa`bbegjjmsyzwz~|zvtrpnlieb_[WTPKFB>951,)&#"!"#&).39@GNU[bgmqux{|~ƻ{vqqx}uojfdba`__^]\[YXWUTROMJGDA>;852/,)'%$#$%'*-27=<<<<=>@CFJNRW\aglqvz~~|zxvtsqonlkkjjklmorux|~}|{zxvtromjhfeegimquy|~~}{xurolifdb`^][YXVUSRPNLKIGECB@?>=<<<=>?ACFIMPTX\`cfilnprstttttssrqponmlkjihhgffeeddddcccccddddddddddccba`_]\ZXVTSSSUW[_chloqrrqomjheca_^\[ZYXWVUTTSRQPONMLKJIIIIIJKLNPSWZ^bfjnsw{~~}|{{{{||}}|zxwutrqponnnnnoprtvx{~~~|{zxwusqnljhfeefhjmqtwz|}}|{xvspmkhfcb`^\[YWVTSQPNMKJHGFEDDCCDDEFHJLNQTWZ^adgjloqrtuvwwxxwwwvuutssrqqppoonnmmmlllllkklkkkkkkjjiihgedba_]\ZYYYZ\_bfjmqtuvwvutromkigecb`_^][ZYXWVVUTSRRQPPPPQQRSUWY[^aehkosvz}~}}|{zyyyyyyz{|~}|zywvusrqppooooopqrsuwy|~~}{zxvtsqomkihgghikmpsvy|}~~}|zxuspnkigeca_]\ZYWVTSRQPONMLLKKLLMNOQRTWY[^adfiknprtuwxyzz{{{{{{zzyyxxwwvvuuttsssrrrrqqqppppoonmlkjihgecb`_^]]]^_adgjmqtvxyzyywvtrpnljhgedba`_^]\[ZYXXWWVVVVVWXYZ[]_adfilorux{}~~~~~}|{zzyxxxwwxxxyz{}}{ywusqonmkjihhggffgghhjklnprtwy{~~}{yxvutssssuvx{~~|zxwvtrqpnmlkjihggfffffffghijlmoqsuxz|~}{zxwutsssstuwz|~|zywutrqonmlkjihhggfffggghiklmoqsuwy|~~}{zxwvtsssstuwy{~~|zxwusrqonmlkjjihhhggghhijklmoqstvy{}~|{yxwutssssstvxz}}{zxvusrqonmlkjjiihhhhhiijklmoprtvxz|~~|{zxwutssssstuwy{~~|{ywvtsrqonmmlkjjiiiiijjkklnoprtuwy{}~|{zxwvutsssstuvxz}~|zywvtsrqonnmlkkjjjjjjkklmnoprsuwyz|~~|{zxwvutssrsstvwy|~}|zxwvtsrqoonmllkkkjkkkllmnoprsuwxz|~~}{zywvutssrsstuvx{}}{zxwutsrqponmmlllllllmmnopqrsuvxz{}~}{zyxvutsssrstuvxz|~~}{yxwvusrqpoonnmmmmmmmnnopqrsuvxy{|~~}{zyxvuttssrsstuwy{}~}{zxwvutsrqpoonnnnnnnnoopqrstvwyz|}~}{zyxwvutssrsstuvxz|~~}{zxwvutsrqppoonnnnnooppqrstvwxz{}~~}{zyxwuutssrrsttvwy{}~|{zxwvutsrqqppooooooppqrrsuvwxy{|~~}|{zyxwvutssrrsstuwxz|~~|{zxwvutsrrqqpppppppqqrstuvwxyz|}~~}|{zyxwvutsssrsstuvxy{}}|{yxwvutssrrqqqppqqqrrstuuwxyz{}~}|{zyxwvutsssrssttvwyz|~~}|{yxwvuutssrrrqqqrrrsstuvwxyz{|~~|{zyxwvuttssrssstuvxz{}~}|zyxwvvuttssrrrrrsssttuvwxyz{|}~~}|{zyxwvuutsssrsstuvwyz|~~}|{zyxwvuuttsssssstttuuvwxyz{|}~~}}|zyxwvvutsssrssttuwxz|}~}|{zyxwwvuuttttttttuuvvwxyz{|}~~}}|{zyxwvuttsssssstuvxy{}~~}|{zyxxwvvuuuuttuuuuvwwxyzz{|}~~}|{zyxwvuttsssssstuvwyz|~~}|{zyyxwwvvvuuuuuvvvwwxyzz{|}~~}|{zyxxwvuttsssssstuuwxz{}~~}|{zzyxxwwvvvvvvvvwwxxyzz{|}~~}|{zyyxwvuttssssssstuvwyz|~~}|{zzyxxwwwwwvwwwwwxyyzz{|}}~~}|{{zyxwvuutssssssstuvwxz{}~}|{{zyyxxxwwwwwwxxxyyzz{|}}~~}|{{zyxwvuuttsssssstuvwxy{|~~}||{zzyyxxxxxxxxxyyzz{{|}}~~}|{{zyxwvvuttssssssttuvwyz|}~~}||{zzzyyyyyyyyyyzz{{||}~~}||{zyxwvvuttssssssstuvwxy{|~~}||{{zzzyyyyyyyzzz{{||}~~~}||{zyxwwvuutssssssstuuvxyz|}~}}|{{{zzzzzzzzzz{{||}}~~~}||{zyxxwvuuttssssssttuvwyz{}~~}}||{{{zzzzzzz{{{||}}~~~}|{zzyxwwvuuttssssssttuvwxy{|~~~}}||{{{{{{{{{{{||}}~~~~}|{{zyxwwvuuttssssssttuvvxyz{}~~~}}||||{{{{{{||||}}~~~~}|{{zyxxwvuuttsssssssttuvwxy{|~~~}}|||||||||||}}}~~~~}}|{{zyxxwvvutttssssssttuvwxyz|}~~}}}}|||||}}}}}~~~~}}|{{zyxxwvvuuttssssssttuvvwyz{|~~~~}}}}}}}}}}}~~~~}}|{{zyyxwvvuuttssssssstuuvwxy{|}~~~}}}}}}}}~~~~~}}|{{zyyxwwvuuttsssssssttuvwxyz{}~~~~~~~~~~~~~~~}}|{{zyyxwwvuutttssssssttuvvwxz{|}~~~~~~~~~~~~}}|{{zyyxwwvuutttssssssttuuvwxyz|}~~~~~~~~}||{{zyyxwwvvutttssssssttuuvwxyz{|~~}}||{zzyyxwwvvuuttsssssssttuvvwxy{|}~~~}}||{{zyyxwwvvuutttssssssttuuvwxyz{|~~~}}||{{zyyxwwvvuutttssssssttuuvwxyz{|}~~~}}||{zzyyxxwvvuutttsssssstttuvvwxyz|}~~~}}||{{zyyxxwvvuutttttsssstttuvvwxyz{|}~~}}||{{zzyyxxwvvvuutttttttttuuvvwxyz{|}~~~~}}||{{zyyxxwwvvuuuttttttttuuvvwxyyz{|~~~~}}||{{zzyyxxwwvvvuuuuutuuuuuvvwxyyz{|}~~~~}}||{{zzyyxxxwwvvvuuuuuuuuuvvvwxxyz{|}~~~~}}|||{{zzyyxxwwwvvvvuuuuuuvvvwwxyyz{|}}~~~}}}||{{zzzyyxxwwwvvvvvvuvvvvvwwxxyz{{|}~~~~}}|||{{zzyyyxxwwwvvvvvvvvvvwwwxxyzz{|}~~~~~}}}||{{{zzyyyxxwwwwvvvvvvvwwwwxxyzz{||}~~~~}}}|||{{zzzyyxxxwwwwwvvvvwwwwxxxyzz{||}~~~~}}}|||{{{zzyyyxxxwwwwwwwwwwwxxxyyzz{{|}~~~~~}}}||{{{zzzyyyxxxxwwwwwwwwwxxxyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxxwwwwwwxxxxyyyz{{||}~~~~~~}}}|||{{{zzzyyyyxxxxxxxxxxxxxyyzzz{||}}~~~~~}}}|||{{{zzzzyyyyxxxxxxxxxxxyyyzzz{{|}}~~~~~~}}}}|||{{{zzzyyyyyyxxxxxxxxyyyyzz{{{|}}~~~~~~}}}||||{{{zzzzyyyyyxxxxxxyyyyyzzz{{||}}~~~~~}}}}|||{{{{zzzzyyyyyyyyyyyyyyyzzz{{||}}~~~~~~}}}}|||{{{{zzzzyyyyyyyyyyyyyzzz{{{||}}~~~~~~}}}}|||{{{{zzzzzyyyyyyyyyyyyzzz{{{||}}}~~~~~~}}}}||||{{{{zzzzzzzyyyyyyyzzzzz{{{|||}}~~~~~~~}}}}||||{{{{{zzzzzzzyyyzzzzzzz{{{|||}}~~~~~~}}}}}||||{{{{zzzzzzzzzzzzzzzzz{{{|||}}}~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzzzz{{{{|||}}}~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzzz{{{{|||}}}~~~~~~~~}}}}}||||{{{{{{{{zzzzzzzz{{{{{{|||}}}~~~~~~~~~}}}}||||||{{{{{{{zzzzzz{{{{{{{||||}}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{||||}}}~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}||||||||{{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{|||||}~xpjegp|tjd``acfggiihijijknoqsuvwy{}~}{wsqokjjhhkpyt}zwoiccormlklmquy}z{{}xtoja_kb`^]]]^^^^^]]\[YYXX[ajnpsw{~{yqyywz{}~|{zzzz{{zvmpfYOJSestj_VSSVZ_dinsw{~qeadluzysle``Z]_[\SY\Z_ehjmortvy{|~|y|~upje`Y^\]_acfhknqsvqv}pedit~}wttw|{vpkfc^[SNWTX\cjr{}qeccipw{zupke`]ZXWVUVWY`ku|}ykiipy{snjjlrx}|wttxpfdiopiWCDJRX^cgknoomkhfddegimptr{|xzp_XRRW`n{}xvprsoonpsw{~x~yvuvz}plbcelqwxzywsqnmmmnnonljgfgmu|vv}qc]RQTZclu|yusvy~|qd\[`c]O:7-*-3=FPW\^_^\ZYXYZ\_chmsy~ve[RONS[fovxyyz|}|zvrmjhikmnnh^ha\]]aflrvyzyxxy|~vqszohicioy~znd_cotd_PLKOT[afjhkpnqsw{yx}~xgSMCEELT]flqssrpnmkklmpsvz}~sj\LD=<=CM[hrxywspmjhgffhkpu|~{{zy{~zysw{}ywx|~yx|~~~~yqh^XX_kol\PNEFJQZdnv|znfejnmcVWNKLNSW\_``^[VSWSSSUWZ^cglpvy}yvi^UWTW`m{}zyxy{soiijpx}qheqxxscc^Z^cjqw|~}zywwxy{}}zz{zphipz~zib]SUW^emt{}wqmlnrvuogbbghcQEB78:AIR[bgkmnnnnnoprux|{znhd`[XX[cnx~zqlkc`]]^aejoqskmngfegjoty}{}~yw{zl^TSX_^_LF?79;BIRZbglpsvz}~z|yf\WKKLRX`flprrpmjfb^]\^cir|yxuo^TLGDDHP\l|}{{|~zzwhicemx~{yvu{wwusomjmnzzqg_Z^hrvra_XRTV]dlsx{}uqqrmbK@;1/16=@EMU_hotxxwtplifddcdcdmloln{y~|y}|se`ZVTTV]gu|{|{xwy{~}{~xpncefklw}~}{zyyyzzzzywtronl}zqg`]agqtf\[QOPU[ckry~rjg^\[[\_elol^NK=98:@ELRX\_accdddefhknruy}vh`WPKGFJRaryusttwuuuqwnmkklptx{}}{ywvvvxyxupjfhnw||qsqlrv~{tmd\UQU^kstg_[MIFHKOTWcilruy|}wsqqrw}siiWTRTX^cinrtvwwwwwwwxxz{|~~~||u{unjmu~|onaXRMJGFFJQ\jy|zz{~yy~~}x{}ypkv}{yxvsniaXOIHMV\_TTSJLMSYaiqxukb\YZakx{sqb]XWVXZ]^_]aebcabbcdegiknpstvq{smldb_^^agq}zwstw}{ulcd`elpoeifcgjpv{~~|tjaZY^fllbe_WXX\`fkpux{}zrjb[WUW]fqvvhd_RPNQUZ`ejoruvxxyyzzz{||{|snov~~{uqmiea^\[]dlv}}wtrsux|}~v}}vustvy}{ust{{zxz{~{qfZNFAGSTSHKE??@EJQX_flrw|}tlgehozzuna^[]_cgknoppnligfegjou{~~woiimv}vqpb^YWVUVX[ajv~wpkkosuniplqx~{vsinuv}{xupjbZTQSZcgf\`YTTVY^bivxsh_[\bluvrhaXKHEFIMQUY]_abccdddefgiknpstvuu{|rnhfdbbbdhoy}z{~}|||{|{wtqponmkfb^]ainrkfldfiov|y~wof\TOPV[]TKNBABHPZenw}~vlc[UTZetxwka^[]_cfjkowuwxxxxxxyz{}~zxzqmd^VPNLLKMOT[eq||ywy{~}~~{uwrqw~~~wz|}vsnje^VMD=;>GNSNHLA@@CGMT\cjqw}~rh`\`ixvraUNJKOU]emsxzzxvspljgebdjgjijektqvwz|~}vpmov|~wmjfedeefhkpv{wttuwz{zwuvyvushgepsw|~xpyxz{tkbXQLU^bibacYXWY]ciou|zqeZNFBEP`oywno`XROOPSW[_behjkmnoprtvxz|~~}yzwkd]YVUTWZaju|zywtttwz}|ywutsrqnjebciry}w~|wz|{tmg`ZTOLOU_gkbc_ROJIIKWZ^ejoty}~rf\VXar~yrkhfgiknqtvxyzz{{zzzyyxwutrqkv|}zsjc_`gpwuptha\YWVVWXY[`fp{{vrsx|||~vxyqru|~yupke^VMD>=AKTZUZZRSRVY`fmsz}o`RHDIWm|shb]ZXXV^_^`abbcdeefgijkmnnnjvyx|}}wuw}~urnmlmmoprv{||{~{uqjhg^\\bioojqlhikpu{xqh_WQQU^dhbgd\[YZ\_behlptx~}ti]RHDGQbq}{~~plecbcehknqtvxyzzz{zzx||sjcadnx}ysoligedba`hos}{||yz{~}{zxwspmlov}~|x|vvuzvlaUJ=ACFJNSY^dglso|~~|tvrooqwpkiiihga\\UU^l{}yu}{xicdnqxxe\VUVZ^bgkmoonlfi`ejjpqwtrwponsvuvppqtx|zsmo}unmd]WW_mtsobfbbdfiknqux{}|xrq~{gWNUXY\[fq}}{zzxzuvsqvrposqrsuwy|{xpgclifffqptpllmqsxz~}solpu~uplffefgijmpsuvrmiq|||{~rmu}mbYQIC@BIXmpcc`VSNX_bfbaabddebhkjnikuv||wpg]UU_s|ywvuuurmd\Wflkh^_\_fglosx|~||{zzyyxwvvuspnpysqsicXW]\]XPMKJJIPUX\aaanpv{zolmrzqjssuqd`]Z`bdhkosx~yx}{z{~ysmknvzoruvwqnjhaba\[XWUOY]bjpxz~zx|xtpmigabky{tqtpqqqstvx|}|{zqrv~{qlv{yz||piqsvxx{nlkffefde]`fcfgjloqtwyw}ysop}}rwvy}znnurrh`agn}|trnlt|qkq{|vqppqqrstvy}ze[ZYSQMKWix~z{}xmgmomjfegmrw{~~{vqos{|~}|yvrupnlkmrz{vv}wf][ede^WVVY[^adgkotxz~|~vmi_]YXVWY^bh}yswzuzkecbcdfgggfda`ckwyz|||}}}}||~}nfkiidXVSUVY[^aeimps}vjebdfjosttkokda\\_gt{yz~xogaagmhusortwz}~||{wpiektuyrpruxzwonr|||wpjgedcbbbcaahjknihwvy}|z}wtlde{ztnnpxuy}qnjigheekjkif`^boqwtnqrwv}ykhjfg_\bjt|zuxvuuurjtxw{}zpkq{wztmlknsx~y{xg]VUX`l|}vnbYV_cgicfinrt}}~rnhfb_[YWXdkv}wx}{yiXW\djmqjhghlotx|}{~|{yxurmidceq~}xpgagloqeb``b`djjnqtwz~~{xutssromrppqqrqpiku}z||n^ZU]fjppkkknquy{}w|zyy{}|xvvsxumbYXcl{~xy{~~|xwrvwsutwx|qmklmoppy{}phfkpqtmgdbccffidgpnrtxz~zwtrpnlhd_]cvz|wtv|wqww~womlmllsuw{~ustt~pkkpzyromlllheomortwz~~}|}~yurrtwz{ztmfijkgWRPU^lxysgjksqhhghfmnnoprsvx|~|xka^afgmjkpw~{~upmlvz{urrsux{~}vy~xtrqpmkpkkgltyvrrrqb[UPUVVX[^bfkpvz}zpmox{~upjgdc`a\fqwurpw|vusuwz}|xq~|{{~~ysnljjhotszxosonqxwpjnpopnmkigggilpprvmkmv{{||ywtosx{}{{{{{{{{yvrkf^m{{}zxxy|~|wrr}}uomovy~|vqomlkkklmoqstuq{{y{zsmns~~|~xnbbhp|~ytldbfvz~{{|}|unkqv|}okhhijmjr~vsnc_QEEFR_o}}xqr|zuonpw{wsrrrrnx{z}ytrpqtzx{xwvvtpjc^cjnukeddegggntwz{{mb]ZXVUTSSUZakw}ytkb][`hotxronmpqsov}{|~|ytohida^p~{vphabjmuogfdffiqns{{maXTSTVZ^bfhjjjgd^Xbbfq{xxz|rmhhhkikxu}~wr~qs|~{yx|}vqkhflijhopquvzz}w~wsoonpprrsuvxz{|{w}{~wrsy~~ytronielkqoqsuwy|~|xq{yv}zvsnh`XU]gt||xw{xvursxvy{~~}{vrq{|xhb]]^aeinrw{y}zyw~zogihpogils{{yq|zsnm~ypz|{tswzvjcecdjpy~ztjkmp{zphcaacegjlpswz~yph`\Z_ejuxzyry}yyxyyyw~x}~wsxy~runnmmmmjiomnpsx~tpokoz|pkghhjkmoqrtuwwxvr|{||{~tlfb_`eou|~vnf[VTN[^iv~~~{{yqloqy}zvsuvy{}~~vnjhggghijknprstp{~{~y|vrqu{~xsvojsqopoooooquyysyuzztoqsy|zyz{}|wsf_\am}|wspnmllmnpqtuwsy~~x{|}yspmklpy~~uodhiehilptx}|tj`YYbswy~ysmhglx~{tqw}}rieeiov~}x{zuqmjkov{{{tx}}wrtvzuoiilhknt|zrjcmnwynmijkmortvw~uqt}ypieb`^]\[Z[^bhotu}~|xsollpruwrmid`kjmptx|xooms}oleiootvxxwurnkfd^_lqyprw||{xwutqu||~smmx~yqpnooqrstuvvwtshuytyz~}wqlgefktzzurnkeopptuxz|~{wy}|}}~~}wouompux}}|~zwvvwwxxywvpoz{wtsssstuuuvvtrqw|z|||y~|}{zxwuuywpidcnrv{xtrkryvz{~~~zuniekixypuptv{~~xshljfkr}woa\RHHPZnvx}umks}yxvutsrrqqnrtp~}xwxxyxxv~y{{{|||}}}|zwqlimos|usstvxz|~}zytjd`efpqe`[ZY[_dlt~{kw}{y}wrnkjiklnprtvtyw~~xqmgaWWSQV^esx{||utzvutuuuuuutuvvwwxvump}~ytme\Yaqrmlddccb`[Y^[^dmxxib`^_^ekmrw}zzsjknu{tpjfcceipy~zsrqrrpnkgfipxy|}zuz}ymmjkhgmjjkmrxvkovqfeehjmorqw|se^[ZYXWVVUWZ_fowzlcdgkovqjfb``adhlpsox~znhw~xrqpolhb\VQPT_qxvsuw{~zrs}ymjiiggnkkkjs|ypuwg_][\]_acehlpuz|na\Y]bfonifdehpv{ywwt{|z{yxuuw|xow|uhfkiiiihhijns{|xon|yujgfgghiijjjjjstu~rf\_pric^XTVOMLMQXcqrkdcdkr|~~}|}||{zywvuuwxwpr{vjhcfjqssvx{~timtypl`\ZZ[[\]^`cgmt~sp{xtomkkklmoqsvwzyng`XUWSXZbjilpu{w~wvtuttssrqqponmmmqrz|zwupi`[`ptpogfeeadd___afmwphdbaijmqu{}srvy|uxxrpkhedcdgkrz|sqnmifddgmr}{z{zrvzy|}wqvxnljgknjkjkmpt{ttuzvkkjmnopx{|{u}~tna]ZZYYXXWWX[^div{{wolotopic`]\[\]`cgkmjuz}{pkls||uonlje`YSOOU_k|zxz{}|toq~xtjhfekmjjjrrv{}wqd`^_`acdfgiloruy|~|v{w}voc]acjpkhc`^^`dix{yuw|xwtrooqw~yvst}uslhgghhhgghjmqx~wrt{xmjhiiiiggdfkiinwv|zzztokhdn{~wrf_\W[YTROOPU\fq|okior{}zyxwxwwuspmjikq{wx~xjokmtrtuwxz|~~}|~vqkgrspma^]]^_`abcefq{~y{}uqnnnnopqrsttz~~qd\TYY[^ghddcfjpw||zxuussqpnljgedfkqw|}}|zxvuroib]`nsutjhfmjhfdbbcgluxqjlpnqsw{~xnhs~~vqmjihgggikpv}upjgdegmr}|zvz{yzyrx{z}}{zx|qljpnmmmmmnoqux~yyxvtru}|uouyuthb_]\\\\[\\_`hsx|tx}rsoheb`^^_`cfjnqtq{~yxojp}~{sojf_YTQTWaot|~vony|~|pkiolkptrtvzx{~{{mheddeghjlorux{~~vmotqtmiqrnkfc`^]^_frwy{{vtpnmpu{xqpz|qnkkjjiihijmqv{~|ut}rnjihgfcijhjisvy|~zvtuuvxojqvtsg_\`[YVTRRSW^hs~vuv}{yyz|{~zxvusqnifbbdpyxtostruuwwy{|~xw{w{~{{nhfosrqea__`aaaabknrzyrnllmnnooppr{|~}y|zufXX]\cjfc_\[\`eltz}{{wsromjgc_\[\bir~w{|wz}|{zxwusplg_\`nrwsmpjkhgdb`_`amxxqrpnoprtxy{zpnoulfdcbbbbcehlryvjdabgktzvtnlqooqqqluww{|xux{lnnkkihfecaacip}{vwvquywz{~ulirvtre_\[ZYYXWWWW_kszzrr}|pnfa^\ZYXXYZ]`dhlnly{~}}|rkhp{{~tic]YVVXYbecfhov~~~zqklwzzwhjifnnnoprtw|vqw{yylgdcdefhjlnpqst}|thciuw~tnhd`^[YXXXahlu}||spljjnsyx}spw~~rokkjihhggghjmotv{y{us}roihdejhfgejpptwz}{~~yvuwyypfagmnqcea][XVTSSUY`hr}|yvvvxz~y|zvqnifa_]`duyv{~vwvwwxyz{|}}}|ywor{{|~vohemquwkhddccaekjmpu{xsqqqqrrsrx~}{rqsorfgfjojhc`]\\^bhov|ztqlid`\[[`eq{||{swxz{}{{yywvusqlfaalqwuqoljgeb`blovzyvwwxx~~|~z|unifeeeffgilqv}xnkknyzxvrnqsqssuuupz{{~|vu|}}ytonljheb`^`eox~|woiorvymhdba`_^]Z\lmqw~|}wlhda`_^^^`behlorsq}}~~ytlhjrt{rhb^^_bjhecbchnv~|y~~}|tnkrswyspronopqqsuy}ytx{~wrnmmmnopqrsu~~}z|umgfl{|rkeb`^\[Z]eekqxwrooru}y|tu|}urmljjihgeedegkpw~~yw~vqilmjigfemnnqswx{wy}~|ywvvx{}xpg_]bhiqmfb`^\ZXXXZ]bht}ywuvvxz}|wx}smgd`__bcq|y|}~~{xwwwwwwwvvtsqpopmv}{xy~zwrkfelotvjgcbahihjkmqtz~yusssssrrzzz|}}ynggkkwwvqkhc`][Z[\_chouz}|zslhc_\[\_corqqpnmenxtwwxwwvusrpnkga]art}~trnmjhdb^bfejot{}zxvwxrtuuznhdcbbcdefhkosy~yx{zzuw}zwsokjomlmnopqpkvwwz{~~~}vrqxvroigca^[Z[_fo}}}ru}~yqkhnquxlgca_^\ZZghhmqx~xngb`^]\\]^_aegkmpnp|~{xsmfbdjktlfedkojgb^\[^biqy}xsrwtw|{sminnzxsonnnnopqsvy~~wrvyytpnnnoooouzy||~x||yvspnty|~wngb`]\ZX_bbfkqx~{vrtwy|wu{}zvpnljhec`^^_dluzv{}yzsomjigiomopsuxy{vw~xxvwxz~ysme^Y^bp{olfda_]\[Z[]irx~zxwwxy|~xv{|}pia_^_cmvutuvy|}~|zzyxwvtrpooqty~}{y}}yuniekox}rmjolkkllnorv{}{xvuuty~|~~}siaci||tmgc`^]\]_afkrx~{ric^\]_fpqrqqponlmyzy{{{zzyxwvtrojjigpu}zsplidafcacdhmt{wnnpvtnifddddefhknswypot{}xrojmpmnnoprtttp|}|xqns|wphc^ZXX[`jvx}}xvv~{smhlpxsnhda^aeiiilotyzv{yohc`^^]^_`bdhjnov{w~}{wrjb\\bguspwuplfa]ZXY\ahow}{vpssrx||slfn}zuponmmnnopruy||uqvz|vrpnnnnuwvxxzz{zz}}}{xwvxx|~wrrtv~rjc_\ZXZ`^_bejpv{}y~}~~|{zz{{||{wyutz|ytmjfc_\YXY]cm{}wtyy}wpmigekljkkmnopooiltptw|}xsoid\XT]ioyojeb_][YWYachov|yxvvvwyz}yrpsrzrhcaagmnrmlkkmqu{}zzxutrpmkihimpxz~{{yxwuv}zzywtpjfdjluysskkiiijjkmorvy}~z~yvtsszzyy}~ytmjgu~skea_]\\\]_bglqw|~|~~qib``bjpmmjiggffgohqvtwvwvvutsqomqmhfgosyuokgbcd^\Z[]cju{ts|xplgglrvx}}{}}zx|yf`~zux}{rgkp~|xxoporrrqpoooonmjlh}|xvwy|~vw~}hhzmjpw}yvxndairih_XSVj}yvw{ĽqhjYKIHJJLNPRTWZcjjnhntv}{tod^ds}~mZ]wwrw|wmy{w}}|yxy|xtwxjej}znsrsuwwuroq|wjfowlfYOKGP^ityz{~r__`zu`QQUYVQLKPZfry|srtpst}~~tnhhm{~pednkecXXX\fhjmoruxz||zune`t~xt|y{}ui`g|qadlcb[WWWY]eq|vmozse\VSQRSUX\]a\`hkrw~}skkwuovvzrkc]hykehoy~zvuuwz|ty{~}~|{}vmmko{{wsu{~tyypj`XURQOQU_jsz~v`QOfseceeaYWY[cmnv|yyvwx|~zwspqwxqxvlgXVYY]`dgknqtw{}yoqhhm~y{}z~ytuy|wledk}n`RIHLTSVX^gr~scafw~oe^ZXWXWXRU\\bhuy~{vlis|sko}tqrxzvmdcn~ui\ciny}zxxz|~}y~~zxwstvy{}~}|yunlptvjbh|xhZWTTSQONOS[dn|sZIFSd|qlnpoib^X^lr{~{zz|{{|yvw{xo`[XWU\]_begiktz{}{v}xvsqqv~}ugbft|xplmrvukeadqzmkwk[NIIKNQSVZajuxpifeitsnd_[ZRT[[aflqv{wl`arrsurv}xtzwrrwywnebi~}~}wpgckpz{xwspz{~|v~zqmmnqsuvwwwvuzyuqmrn~qijqntujff\XVTRPONQV^hrw|x~zrqi^SOUe{yzzykcb]bpz}|zwqns~~yurpnpynccb_^^[^cchkoswz}|x~}{zy|tidcfksz~~zrkhjputiY`fwxor}wtrpsibXOLJLMOS_hp|~}vqmkjlr~um_]a^bejmruxz||{}ylecnmfh_cku}zt||uty{xnbXYjyx|~umdinx|tzy||ofjlkmnprtuwy{|}}|xoqx~|}~uf[^homlb[WTRPPQTZaiju~njjnokaXU[gx{tmlov~xnghv}|ynw{xqc[[k|~ytpmjhgggfemorwz||w~ysmhedeioux}}smikolsqflu|sfgehonhcXSRSW[ahox{}yvsrrsuxyujnonpruwy{}}|wnfcmqnl_WX_dnvywwuj[PVgt||~vppzxqmlmnoryqnllkjhfcdiit}ytqsu}g_RFB?@CHPZeox}wv|ndbfr}|vnhfimur}~}{|~wrmkjlqzxxrre_befikmoprtuxy||~zv{omy~ttnlic[TRU[bee`cqwpuwfSJHHKOT[bn}|wqgihls}}solmnpqskmroqpqqqqqszxvrkkm|}{yz|~opqtrmhirujb]djouw~{{{||tuxxmjjkllmlkjiihklwvges{pfVNHECCEIPYdoz|mkwreXW^jvzrohnz~~||}~zrs|unjgflw|{tigfgfekkmoprtvwyyyut~{~~{md\\aehe_VQUY`hnnljv|tryx{lb]SPNPRVZ`is|wlccdgimpv~zuskrtoqpqpqqrrsrqlf^\bx{v{z~}trtutokkr}~~{vmhbfpu~~xzvmijkmnnnmlkjihiiklp{{vyzic`a`^YNIDELNS\eq|}srwsrnhf`]^fr~{stpuz}ytnggo}}}vplkklnoor}tpnmlkjijqrqtvxz|}zt|{|~}qaYWY^chigb\XY_iqvuqdq{yvlfjlhf_WTSUX^fnwvjfbbcegmvx|y|vvttttsstssqmf]X]imgcfks}~{xs{{wqicbj}xtx}zsmkjv~qjiijjjjpqoonnnnooojuyxgXTT\``aXSPPRW^fpyqf]aejjgcelx|{}}thbdrtnnejty{tnic]Zas{yxwwvvuuttsszz}~yyh`YWVY^dhjiea_`fmwvxuquzpmhffjjnma]Z\_fnu~toigdddgkqw~}xvtxzwwuqka\]ikecZ\\gry}zqcWUex|vqpty}yxy|vponnnooppqrstuttlrvv}qjaZTSW_afe_]\^bfqt{}sx~|i`Z\`fjpmiltthcntjg\\]bfrz~|paWUalmrnpswz{||{{z{{{{y~}qf]VW[\bhnqrolhgdpxyzuuvwvuwuqljlonqjecdgljuxtomigfefhlsz}{zxtmc\\gjdaURRUY]ex~}}ylc[ch^a`isxxtrsyzvsqpppppqqqswmrtrvw|{upkf_^ZVZbjnuomjjdjtv}qhl~xrke`^agmppnmpy|vs{znfVQOQTY`dn{}wj`dha`YX^dkpwx~yz~ria\[]cjqwyvpbbdemqtrqvzzxwyyxtommrrqqjl`cloxxqmjhfjkijknsz~ype[\ksg_UNMNQTY^dhu|wphkp{m[NCHSbnvwusv}xw}rtzzvtssuvxxytpwsttuwy}}zxvsqmid`^bkv{tjmkmqv{tq{smflnpoke`_agmrsrqyyrt|m_RMHHIQW[bjr~vnijxraVLNRYaipvz}xt|~sopt}xogccejs}tukfehntwwvuz}~|wttx}}}opmmrw~ulkolmmllmnorvzthdlwlaYQPOQRTVY]bhnutbZduwocSIB@FXgr{~~~xmkvxvutw|~|{||}yryvutssx{z}}{zxwutpmjmw{|vsrtw|zyoe^``isvsmhccgov|}{vspxypea[WSQPQTYajt|nbeuwpn_XTSUZ_fmtyzrs~{srrqrvx{~zuvw{zy}xqjfeiouxwurqow~zv}~wsry~}tronjponpprsuw}|qr{tlcXURRVZYZ[^bgnu}vlle^^Yb]YRLJP[kyynlx~yystx{~~|{}{~}|{{yyyy{|{wxxow|}{xuvx}uiecehknxwvrnklqy|~~~~wriigfb_[XVWY]dlx{uzthb[[\b``]_bgnv}}yu~{yonoswz||{{~|t||||xwskghlsxyukbbt~~}{{~~tqmptrqnpvuy{~}}reb^^]]]]]^`cfkpx}n]JFKR^c]YSRWcr|u{}uqfdfkv}~}|zzyxwuqmlkwxqqt|~||~|{~snigffhkoovyututrus}xfa_dkkjifdbcdgkrw~|}saYUX]`hhdddhmu|xu}yvjffhkpuy}|z{|~}{vpjffhigb_dmjpru~}{zyyzyxusrrrrrsstt|y|{~rlgecba`__^^_cjnotrw{|yeWHDFKT^ifb^^epykdcdhlrw}~|zvph`^gqorkjlq}{wuw||wrlmw}tqosolihhjnrtw~zuqflsw{ngcdfjlnonnmlmmnjnxypia\WUV\_ejfehpuy{yw}yugb_chhlouz}|}}|xrja[YUWcnheZX_ku|sjho~}~yqqpqqqpqqqrtv}~}xyrnkhgfeeeffhikhjuwupjbXMEDIV`nsnkjnw~xxwojgffgjmrv{}yri`\ajdd\WYbjmq}~wttx{}zpimz{|ztuuvvurpmkjknsv|y~vqrknu|rjggilpt{|zxvnlsqvzztqtlk^||wtxwuskc```ccq}xps{snjlrspqklnsrw~{yx{}udcht}}~{~ywxyupbRUvynefls{uRHphPD>>DO[flkfa^`jzrhw{x|xzzmqfdfiloprttwz~}}tsxxurpi_QJUq}tm^YWY\_cgkpt{mRU}hQ@8:FUad_UMOYj||{tqxxpjp}vz|uqnljjjjlnruz{}tqphhn{}yqnkhc\TS_x{vifdegjmqty|eQY~}dOCCLXaa[RLNXhwxzut{}umirxszztpljhhhjmquz|~uuskls{rnkhc]VXf|tgdbdfilnpsw~eU`|eSHHOY``ZRNR]mz|vwqu|~umju{|xv|vromlllmoqtwyyruqjip}{tplhb\VYj}shecdfikorvzyaVf}gVLMT]b`YQNS^mw~vrrmryxpijx|~{vvytpmlllmoqtvxunqlhjsyqnjgaZU[n}skhfggiknqvzq\Vj{fUMOW_c`XPNS_mx}tqplrzvoim~}}wsv~zuronlmmpruwytmpigjt~wpmie_XU]r{ynheddegilpuykYYsyeWPS[beaYRPU`mwzqqolqxwohm~{uqv|xtqonmnpqtuvomoffis~|snjgb]VU_u~zxkheddegilpty~|fWZwweXTX_egaYQPVbnwxprlkox}tlip~}xsqw~yurpnnnpqttummnffju~|snjgc]WXdy}{wljggfghjmquz~yeX]{wfYWZbhicZSRYepywprklpy{sljs~{wrr{zwsqpoprsvvvmomffju}{qlifb]X[gz||wmkhhghiknruzwcYaxh\Z_glkd[UU\hs{wqskmqzyrkku{wss}|yvsrqrsuwxvmqlggku}{qlhd`ZVZgyyzskigggijmpuyr`Xcwg]]aimle\VW^jt{uuunorz|tllu~{xtu~}yvusstuwxyuotmigkt~~}zqmhea[X[ixy|smjhhhiknqvzsaYfwh``elpmf]XZbnx~wyuops{{tmmw}{yvx|yvvuvwzz{urvnjhlt}~|yplhea\Y\lxy|rmkiiijlosw|ra[ixjbciorog_[]fqz~wztoqu|{smny~|zxvy|zxwwxy{{|utvnkhlt~}}yqmhea[Y^ox{}rnkjjjkmptx}p`\mykdflrtog`\`it}x{tprv~zrmo}~}{zxvz~|zyyyz|{{svumkhnu~}}yqmie`[Y`pw}{qnjjijkmpsx||j\Zpwjfhnstog`]`is||y}trqv|{smo~~}|zyvuz}{zz{|}|{swtmjhmu}|}wokgc^YX`qu{wnliiijknquz~yh\]tvjgjpuuog`^bkt}zz|srqw}zrmq~}|{ywutz~|{{{|}}zrxrmiinw~|}vnjea\WXcsv{tljhhhikmpty}vdZ`ztihkrvuof_^blu}xyyqppv|xpnt~~}{zywurt|~}|||}}}xrwplhioy||tmhc_YWZgtv{rljhhhjkmpty}qaZd}siimtwvof`^cmu{vzvppqw}}unnw}~}{yxwusps|~}}|}||tsvnkhjpz~}}smhc^XW[jtwzolihhhijlosw|}m^Yg~rjkouxune__dnvzu{uooqw~|snoy~{}|zywvtros~~}}~}}tuwnkhjqz~||rlfa\WU[kswxmjhhhijlorvzzi\Zk}qkmqwyvofa`fnwyw}vrprw}~uop|~{~|{yxwvtrpt~uxwolhkq{~~|rlgb\VU\mrxvljghgijlorv{yh\[n|qlnsyzvnfabiqzzy~urqsx~uop~}z~}|{yxwwvurqv}v|wqmilr{}}|rmgb\WV^mrzumkiiijkmptx|wg\\p~rnqv{|wogdels|z}vtruz}toq~}~~~}|{yxxwwvusrw~w~wrmjlqz|}toid]XW`ms|unljjjkmoruz~wg\^qtqty}}xpifhpw{vusv{}tpr~}}}{zyxxwwxwwtty~zxsnjlqy{~|sohd]XWams|solkklmoruy~~uf]atusv|~yqkhjqy|ywtwzvqt~}}{zyxwwwxxwuu{~|xtnklqyz~{soid]YXdmu|rolkklnprvy~}~se]dw~vux~zrkils{~}yvtw{}uqu~}~||zyxwwwwxwvtu|{~wsmklqxy~zrnhc]YZfmw{rplmlnoqsvz~|{|~pd]gx~ww{zrljnt|~~}yutw{zsqx|~||zzyxwvvvvvvtsu~z~wsmklsyz~yqlfa[Y\hnyzqolmmnoqswz~~zz{zla^k{~wx}zrlkou}}~{wtsvzxsqz{|{zyywwvuuuuuussvx~ztqlkmtyz~xqke`ZY_kozwpnlmmoprux|}{yz}uh_`o|wy~zrmkou}{{xtsuy~xts}~zzzyxxwvuuttttsrrvyytpllnuyy}void^YYakp{tomlmmoprux{~{yxy|}rf^br{x{yqlkpu|yzvrrty~wst}|{xywxvvutttttsrqrw|ywtolknuxz|tnhc]ZZclr{romlmnoqsux{~}ywvx{|pe_ds|y}yrnnrx}zyvrsuy~~vsu~z{}wxvvuutsssssrqprx{{wtollouxz|sngb]Z\fmt{rpmmmnoqsux{~|xvvx{zod_gv|z~yrnosy}{zvrsvz|usw}z}|wxvvttsssssssrqszz}wtollovx{}toic][\gmvzqpmmmoprtvy|zxuvx|ymc_iw}|ysopt{|}|wttvz~xty~|~{{xxvvutssssttsrqs{|yvpmlovx}~upid]Z\glyzrqnooprtvy{~yxvx{xlc`jw~~yspru||}xuuw{~xtz~|}|{yxvuttssstuuusrs|~{wqmlovx~~wrkd^Z]gm{yrqnooqruwz}}ywvx{xlcalyysqsw}~xvvy}~xt{~|}~zywvutsssstuvvtst~|wrmlpvx~~wrkd^[_hn|ytrppprsux{~|xwvx|wkccnzytruz~}xvwz~}wu|}|}zyvvttsssstuuussu|vqmmpvx~wrkd^[aip}wtqppprsvx{~~{xvvx|tiadn}ytsv{~}xwwz|vu}{z|yyvutsrrrstuutrqt}vqmmqwz~xrjc][bit~vtqppqsuwy||ywvx{|qg`eq~xssuz}~}ywwy~}wx~zy{}~xwutsrrrrstttsppu|upmnrx{~wpha\[djv}troooprtvx{~|{xvvx{zoe`gs}vrrtz|{xvwy~{vz|xx{|{vutsrrqqqrsssqopw}ztpmnsy{|unf_[\fly{rqnnnpqsuxz}{zyuuuw{vkcaku|vrru{{~yvtvx}yv|{xx|zwusrrqqppqqqqpnnoy~|xrnmotx{ztld^[^gm{yrqnnopqsuwz|~y~xwtttwz}shaalw{uqruzy~xutux}}xv}~zwx|~{wusrqqppppqqqpnnp{|xrnmoux|zsld^\`io}xsqopqrtvwz|~~}v~zvussux|zpgacoz{vrsuzy~yvtuw|~~yx|xvv{||}utrrppppppqqqpnnq||wrnmoux|yskd^\biq~wsqppqsuvxz|~~|v~xutrsux|ypgbfq}|vstw{z~yvtvx|~~yy|yvw{{~}vurrpppppqqrqpnor~}wsnnoux}ysld_]djs~vtqqqstvxy{}zw~wusrstx|yogchq|wuvy{}~ywuwy}}yy~}ywx{{|vurrpppppqrrrqopt~xtonotw~ytle`^eiwxvssstuwy{}yzwusrsuy}xngcir}xwx|}zwvx{~}xz~~zxx|}}xvsrqqpqqrsssrqqv~xtonotv~zunfa`fjzxwtttuvxz|~vz|utrrtw{~wngelt~yxy}||xwx{}z||yvw{~{xusrqpppqrsttrqrwytooptwzvngbbhm}yxvvvxy{}~u|{ttqrsw{}vmhfnu~zyz~}{xwx{}~z}|ywx{~zxusqqpppqrsttrqqx~ytpopuwzumgacgo}zxvvvxy{}~~~t}xtsqrsw{|ulggow~zyz~}~zwww{}}z}~|xww{~ywtrqppppqrsssqqrz}xsonptw~xskfbeiq|zxvvwxy{}~|{s|vsqpqsw{zrkfhqz}zy{~}}zvwx{}|z~~zwvw{~}xwsrppoppqqrrrppr{{wrooqux~xrjebfjt{yvuuvwxz|}z~xs{srppqsw{~woheir}{xxz{||yuuvyz||~zwttuz}z}vtqponnnoopqponnr|zvqoorvy~wqidbhlxzyuuuwxy{|}~}|w{sqxppopruy}{tlgeltzwvyy~|xuuvy{{}|yvssuy{zzusponnnnnopponmnr|yuqoosvz|vogcbim|yxuuuvwxz{|}}}|zuypswopnprvy~zsjedmt~ywvyx{wuuvy{~z~~|xurrty{zxurponnmnnoooomlnt|~yupoosv{|vngcdjn~yxuuuvwyz{|}}}|yuxntunonprvy~~xqjffov~ywwzx~zvuuwz{}z~|xurrtyz{wuqponnnnnooonmlnv}~ytpoptw{|vnhdejp~ywuuuvxyz{|}~}|xuxnvtoonprwz~xpiefow~yxx{y~zwuvx{|}z~{xurstzz~wvrponnnnooponllnv}zuqppux}}woidfjt|ywwwxy{|}~~~}|wtunwrpppsvz}}wpiehpz~zxxzz|xwwx{}~|}zvspqrwy~ywsqoonnoopqpommnw~{vrpptw~ypjegjv}yxxxyz{|}~~}|wwvqzsrqrtw{~xpjfjq}~{yz{}}yxxz|~}~zwsppswz~zxsrpoooopqrqpnmow~|vrppuw~ypjehky}zyxyz{|}~~}wwuszrrqstx{~xpkglr|z||}yxy{}}}~{xtqqtwz~zwsrpoooopqqqpnnpx|vrpquw~ypjfjl}~zzyzz{|~~}vwstyqrqstx||vnigms|z}||yxy{}|}}zvsqqswz{xtrppoopqqqqonnqy{vrpqux}xpkhko|{z{|}~~~|zsuptvprqtvz}zsmihou~|z|z|yxxz{}~{xtqooruz~~}yusqonnnoppppnmmryzurprvy}wojhlq}{zzz{}}~~~}{xrsoutoppsuy}}xrkhipx}{y{yzxwwyz}~}zwspoosty}zxtqonnnnnopoomlmtz}ytqprvy{tmiimt~|zyyz{|}}}}}{yuppmtqnoorty|{vojgjqz|zyzy}ywvvxy~}~|yvspoosty{xvqpnmlmmmnnnmklnv{|wsqprvy~xrlhjmx~{zyyz{|||}|{zwsnmmsnmmnqtx{~}xslhfkr}|yyyz|xuuuxx}}~|zxtqonorsxzxvqpmmllmmmnmlklow}~zvrppruy}xqliln{~{zyzz{||}||{yvqmlmsmllnptx|~~{vqkggmt|yyx{|xvuuww~}~}{yvspmmnqrwy}vtpomllllmmmmlkkow~~{vsqqsvz~xrmjnp{{z{{|}}}|{zwuokjmqklmoruy|~}zupjhhou|yzx~|xuuuwx}~}{yvspnmnqrvz|wtpomlllmmnnmlklpw{vsqqtv{}xrmkoq||{||}}}}}|zwuokjoqlmmpsvz}~zupkhipv}zzx{xvuvxy}~|zwtqonnpru|{xtqonmmmmnnnnmmmrw{wsqqsu{}xrnmos~}}}}~~~~~|{xuollrqmnnqswz}}zupkikqx~{|z|xvvwyz}~}{xuqonoprv~|yusponnnnoooommmsx{wsqqtu|}ysonov~~~~}|yuplmtqnoortx{~~zupkikrz~||{|ywwxy{~~|zwtpnmmoqu{yurponnnnopoommnsx|xtrruv~~zuppqz~}{xtnjnupopqtwz}}yuoljms|~|||}zxxxz|~~|zwspnlmopv|yusponnnoopoommnty|xtrruw~ztopq}~|zwsmipuopprtw{~}ytokjns}|{~}zxxyz}~|yvsomlmnpx|yurponnnnooonmlnt{{wsrruw~ysopq~~~~~}{yvqliqtooprtx{}~{wrmkjot}|z{xwwxy}~}{yvrolllnoy{wtqonmmmnnnnmkknu}zvsrruw|xroqs~~~~~~}}{zwtojgrrnoortx{}}zupkiipu{{y~zwvvxx|}}{yvspmkklnoz}zvspommmmmmmlkjjou~yvsrsvx|wrqrv}}}}}|{zyvtplfeqomnorux{}~}{wsnjijrx~zzw}zwvuvv{~}}}|zwtqmkiijmn{{ytromlkklllkkiijou}xurrsvyzvqqry}|||||{zywurnjdfrnmnoruy{}}|zvqlihkrz|yxw|yvutvv{~}|}}{yvsplihhiln~{ytqnmkkkkkkkjhhipv|xtrrsvyzuqqs|~}||||{{zxwtqmibgrmmnprvy{}}|yuqlihlt}|yxx{xuutuu{}}|}}{yvsplihhiknzxspnlkkkkkkjihikrw{xtrqsuyyuqrs}}||||{zywtqmibislmmprvy{}}{xtpkhhmt|zxz{yvuuvv}~}|~}{yvsplihhjko{xtromllllllkjiikry{xtrrtvzyvsuu~~}}}|{zxvsqlhaksloortxz|}|{xsokijou|{x}}zwvvvw}}}|}{yvsolihgiiq~{xtronllllllkjiilr{}yusrtv{{wstv~~}|{ywtqlhbptnpqtvy{}~}{xtpljkpv}|y}zxwwxx~}~|zwtpmjhgihs}|xurpnmmmmnmmkjjms}}yusstv|{wtux~}{zwuqmhcssnqqtvy|}~}{xtpmklrx~}z}zxwwxy}}{xuqnjigihu||xurpnnmmmnmmkkkos}yusrtv|~{wuuz~|zxuqmgduroqqtvy{}}}zwsollmsz}{}zxwwxy}|zwtqnjihigx||xvrqonnnnnnmlllpt|yusstv|}{vvu}~|zwtplefvqopqtwy{}}|yvrnlkns|~|{}zxwwwy~}}~|yvsolihfggzzzvtqonmmmmmmlkkkpu|xutsuw~}{www}|zxurmjcgvoppruwz{||zxtqmkkou~{||ywvvvx}}}}{xurokigfgg|zyuspnmlllmmlkjklqw{wussuw~|zvwx~|{ywspkh`humoortwyz{zyvroljkpv|y|~zwvtuuw}||~~|zwtqnjhfffh}}ywsqnmlkkkkkkjijmry}zvtssuv}{yvxy~}|zxvrojf^isknnqsuxyyywtpmjjlrw~|x|yvtsttv}{{{~}{yvspmihffek{xvsqnmkkkkkjjiijns||xusrstv~{ywx{~|{ywtpmhd^lrknnqsuwyyxvsoliikrx}{x|xutsssw}{{{}zxurnkhfdeclzxurpmlkjjjjjihhjns~|yvtssuw{zxz}~}{zxurolgb^nqlnortvxyxwtqnkijmtz}{x|yvtssrw|zz{|zwuqnkgfdecoyxurpmlkjjjjiihhins|yvtstux{yyz~}{zwurokgb_ppmopsuwyyywurnkjjnu|}{y|yvuttsx}z{|}zxurnkgfdecqyyuspnlkkkkkjjiijot}yvtstux{yyz~}{zxurokgbbspnpqtvxyzywuroljkou~{{|ywututz}{{|~{yvsokhfddduzzvtqomlllkkkjiijpu}yvtstux~|zz{~|{xvsplhbfuqpqsuwyz{zxurolklpu|~}zwvuvv{~{||~|yvsokhfdddwzzwurponmmmmlkjjkpw~zwuttvz}z{|~|zxurokhbhvrrsuwyz{{zxuromlmrw|~{xwvvv|~{{}|yvrokgecbey}zzwurpnnmmmlljiikpx~zwuttvz|{{}}|zwurojgbkvrssvwy{{{zxuromlmsx{}zxwvvv|}{{}~|yvrnjgdcbgz}zzwurponmmmlkjiilp{}zvtstv{~|{{~}{yvtqnjfbnvrstvxy{{{ywtqnllnsy~{|ywvuuu{|z{~~{xuqmifcbai{|zyvtqonmlllkjihilq~|yvtstu{}|{|~|zxvspmhdantqrsuwyzzyxuromkknt{}{{xvuttt{{z{~|yvsolhecbal|{zxvsqomllkkjihhins~{wusstu{}{||~|zxvspmjfbaosprsuvxyxwuspmkjkou~~{z~zwutsrsyyxz~~{xurnjfdaa`mzyxvtqomkkjjihhggins~zwtsstu|}|}~~}{ywtrolhd`boqpqrtvwxwvtroljjkpv}z{|yvtrrqrxxx{}zwtpmieca`apzyxuspnlkjiihhgfgiou}yvtsstu|}|}~|{yvtqnkgc_cppoprtvwwwvsqnkjjlrw}y}|xvtrqqsxxx{}zwtpmifca`bqyxwurpnlkjiihhgghkpw|yvtrrtu|}|~~|{ywtqnkgc_eppoprtuvvvurpmkjjmsx~z{xusrqpsyxx||zwtpmifca`dsyxwurpnlkjjiihhhilqz|yvtsstu|~|}~}{ywtqnkgc_hpppqstvwwvurpmkjkmsy~z|yvtrrpsyxy|}zwtqmifba_esxxvurpnlkkjjiihhilq}}zwutstv}}}~}{yvtqnkgcalrrrsuvwwwvtrpnlklot{|}zwussruzxy}~{xuqnjfca_gtxxwusqonmlkkjjiiimr~zwutttw~}~~~|zwurokhdcnssstuwxxxwuspnmlmpu}}}zwvttsw{yz}|yvrnjgca_itxxvusqonmlllkkjjjns~{xvtttw}~}~~}{xurokhdeoststuwwwwvtrpnmmnqv|zwutssw{y{}|yvrokgca`ktwwvusqonmmllkkjjkot}zwutttw~~}~}zxurokhcgpststuwwwwvtronllnrw|ywutsswzy{~~{xuqmieb_`mtwwvtrqonmllkkjiikov}zwutttx~~}}{xvspmifbiqsutuvwwwvuspnmlmnsx~|yvusrrvyx{}~{wtplieb_answvutrpnmllkkjiiikox|yvusttx~~~~|ywtrolhebjprtsuuvvvutrpmlklntxztpllorv|yk^USRTW`deijiaYcsxw~zwuuvwz}~xoktqrvx|{{|{xvrqt|lb]`ifZVICA@BDFJOTZ^`_^^h~o`TIGFJMP_jq{|tfhiluqep°xl`YTT\k~rjc^\U^ksypnu{{w|{yxyz{zwpja]durhgaeipv||ĽlXVlhSG=843468;?DJPV]_bdotz|utqmhb\WV[eu~ysrqrpry|wmhevt`QLTnp^TPT[dlpqnhc\XTSNTl{wqorpolhht~vqqw|upms~|j_\ima_Y[_ekqx|~þx{rhi_OD81/./0259=BFJFPX]fnv~{oijptsyykgb`__`cfjosuurvžm[MGLaq]NGGLU^fgfg`[WWX_cj~~yt{}~{{~{unf`^dt}vw~tf`hx~{uxvmd_ZWSOJB;7ADHMPTR^ejrx|rifinjhmsvrngfdddginsy~~}~pbWRUarl_XY^fmouuojc_]_ckow|yv}|rq~}{||}|zwsnifgpzw|vvu|}{xqkga\TLEBGQZXXUOQKS[^eiosww~ysonr}tqlt{yvrllnrw{}|xx}rnjkkopy|hYXd{}dVOOT[bghf`ZSMLOU^ekyxog`]^es{{xtvuwx{|~~~xx}wrnnr{}mldda`^^]]]^_bdhikddhdir~xux}qonnnnljfb\\gq~zjc__`deozzvnmsw`WYetyzwkcYRKHHLRY[ku{|~z~xplo~~ttstsuuvwxyyvsmlr{zvnlow}~ve^YWUTSSRSSUSW]_dhhhtv{}}skgfeda^ZVRRXdq~~qwtsrs{|ukdbhr|vkpvz}qfabk{uontz}rfZQMT`pp|~}wwwrsrsrpmnu~{y||wy}wpidgsyxzqqsvzzzg\UQNLKJIIIKMOSVZ\[hlqw{}~vohddijdc_dnxxyvhkjghiknrv|}zvwy{{yw}sg]WXarlgfkpvztmheejoy|||xqkmy|zxxxvtqnkkoyvnr}zzuy|unh`XPOS\`_`YWWXZV^egmottx}}zxuqmkkq{~oq||||uqqrvz}|qmjlnr|~l_\fwye][_flqsqlg`]\^cjqwysmjedgp}|yusrv~ytomjiggfffhilnpnlbbko~~~wqpz}rokkiifc\_afs~xvga]^_fsy|xs~ups}mdjsx|wqiaYTQQTZbil}zqjiu~xyxyxyz{|~|vtx|topw{ke_]\\\\]\[bcfjnqutu}nea^\YVSOMNVbpz}zszv|qc^cmwzsnjhdqyypieiqyy{reYSWbouw}|zywwwxwuqpv~{{~{~}{wslhit|}vutvvn`ZVTRRQPPPQSUX\`dferuxzqh_^agea\UX_jprvpmchjimotx}vsst|xqqwyu~}|tj`XV[i|{mmly{tnjjmtz{upkhkxyurrqomjikr|}qjm~vqnmuvx{}ukaZVX^edf`XUTUWY[Xchinpqz}}~zuspmiecelt{zvvqutyzwuvx{vomuttqedefo~|~|ykb`hpxsdaciotwvrmga^^`bnx|wnju{snjfcbcit{}~z{~w|~z|yxvsqoqwzuqponnmlllljifc_`_l}{}vzyy|~}xqmmwyzylgca_ZW[Y]gs~}rimnjj^ZZZfnt|{vqolmtvwqqw|{x{}zywtng`ZVUW[ckrt{tlfgrv|}z|{||}~~}yvzz|xqmmr{y~}~|nieddcd`dhfjkoqtvzwz{qstsug_ZWTPMKKOXcou{zzrq~}ywppfelm|~|~}~zvpjea`aefv}zrjedj}qe_`hltywzw~|zyyzzzxtsv}|~}~}zwqmmv||zuz}|~pga]\ZZZZZ[]_cfjmqqoy}rebcfcd[TSW`imtuqpmgossy|~{wvu{rllpqvwow}||wqh`ZZap{|wtsv{zxusmjjs{}zvusrpqsz}z~zrtwuxy{|}shbbgknphd`^^_adegcnqqrv~}~{yzuolgdaabhmrpvx|z|}tlgmnvxoko|xuvx~~zogehkx{xx|stv|ztolhkuzxokmz|toljhhjqy~{xv|}||zxqyzwxvvtstw~~ywvutttsrpmjfhkus~|xw{xz{}~}xrlipsxznic]_^[]bku~sh`bdgmeacmpw{~~|wrmiejqu{~zspr{||xrkfb`bflt{~{unijrz}zzzv~ysonpu~}x}}wsomjhnnnpqstvx{|~{}}wmgjllqe]XSPNMNT]hot}zzv|{xqfbehvtoxwuwwwuqke_[Y[_ejl|~|yske`hu{snnoourrux{y~|{yyyzxwrrq||}y~~~~{xsoow|zvzzz}|~zvuxzyyy~qjeca```aabdfhkmopns~}}zspqlslifdaVQNRYbgkronmmlhtxzxrqww}sy}yphegginjkmjswqnf`ZY\hx~{}xvux{yvtrolhefotzurnmlmouz~~wpspqqstuvvwxyz{|{yr~~wnnqqurjfa`__`bdffgcmolwx{~yvv}}rleb]\[^bginx|~zqu{y~xpga_gjqtpwz~{upmmnsw|yztpkkikqt}sstx|~|vpimpry{vrrtuwzqkgedfks|wwry~~zvussssrqkturrqqpsw{ywvusplhdbektwvwwpxuwxz{||}|{wslhfmovxhcb\ZZ]dlw|wncZUZ^fpgmnquwxurmhc_fhnv~}vqpt}}|xsmgcbcglt{}vlggoxx{wtvz}}zspmmpxyuy||xpqtqsstuwxz}~}{|xnf`beipd\UPLLOV_jpy{}zl^W[iq}xturqlhb\XVW[biqvu~wridjo{{wxvyysrrv{~{txx~|}|wspw{}}z|uqrz|sruxwpjfeddefhjloqtty||znb^cj{wti\SMMQYbgqusuuvwxv{smltzzsjebddkljlnqtovvlg_\[am}w}zz{~~{xwusojgelr}}yspoosuuw|{tsqrrssuvwyz|}}{}}wvv~~wpkgdcccdfhjlnmjry|~{usxzumd^YXY]cix}{t|}xsle_^cl~ztoljkosxz{srvoqmqonvuknsxtwsuy~~ywx}}}ttuxyqkfefls}}~|{}~{vsqpooppqpojsuqrqsu|~{xvrnjfegnu{|xnmwuuwxyz{{||{zwrlgeikpxme_\\`hqy~}}yrkd\VTYahxxttttroje^^bbhow~~wrnou|vqkhffint{{xy~~}pkipu~}w~{vrnnqx|uvvnmjklrz|wty|{}xvuuvwwxyz{}}~~}vs~xuvy~ysme`\_ael_XQNNRZckq{v|}ukc]]_gvtvtonie`ZVSRTZ`hossnuoddfgq|snklosy|z~}{zvuxrqs{~yy{}ytrpvw{x}{|}~yxvrmknw{toruyyrmjihiijklmnnvwwyvsypf`^elsrcXPNPW_elussstuxy{y{vpkjktv}tmgddccgb`adhmnnfih][X\er}y}ywuuuv{~{xvtsqolheelpxwrnlq}zsnpqu|vrooooppqrsstru{xvt}|}~zrrx~vpkigggghijklmmkfyzx||~~{upnrr{xkc[XWZahu}|z{v~zwtplga]dmozvpkgedfimprppimsnqiilv{rnszyyx{}ywy}woijlq}uokikpx~uqos}xtqonmmmnnooonirtqstw}{vqliilrv}{uqivyuxwyyzzz{zzxurlgbelsyniddgltyz}zuplgc^[Z_dv~zvqke^baafksz~y}tomnu~|z~~xspnoqu{~xspqp{{vww}|xtpmmpuz}yoqumnmqu|}x|{}}}}~~}xquyux~|xuqlf`\\^cne_[Z]clq{}unjhiinpmq{}vnha[WTSUZ`houyytkooijnx~}vrpqty}{}|wusx{}{vssy~}urxnllr|~wrrt{{vsrqqrrsrv}{~~|}|wqlhgempmvlaZWY^eiuyyz{}~}{xtpont~~ulgecgga``cgloqolacb[]aly{xuttw}~{xwutsqokigknxytx{~~wpkiqxxuqpoppqrrsqw{z{zxu}}|vuy|tolkjjjklmmoopmrqz~{|zsolnluse^XX]gr}|}|}x~|ywtqnmhgjhit~xqkfcabdfikmooqjougfenx~vqqy|zz{|{~|tmgcdhmzsnlmry~wmhgw~xsnljjiiijjkkkjidnpnqu{wpkhimqw}yuqnhmiowrvuwwxxyyxwuqmeefgirxnkilrx}|zyzz{uqmifda_\[Zeqyypja^`\]`elsy}~zqjohgjr|vrv~|vqnllnqv{}wpga_ch{}~{}~~~}}x|y{wqlhhinryzvqlh`djfkov~|xt~}||||||{zyuqjmij{{{xvsqokf`[XY[`kc__bhmr|unihimpwrlfktt|rjaZTQPQTY`flqrqjfbgffoz|ww~~uokjknrw{}~}~|ytrqvx~}}|xsnlvv~|{{{{|{{{zxvqmdajhpy}wroqt{|wsqpponvwwyzzzy~||xsqpqqqtkgdblf_^^dgpyxzyz{|~{}{zxwuqnjpvtupkilf`][]`eillke_TY\Zcn}{uollov~|yxvutrpnjgehjr}~}wqignovzvrqopopopxwxyzzyvs~}~}zspmlkkllmnopppwuq}~yrkffclla``ip~~~~~y}{ywtsqpmsurqnv}xpida`abdgimpsswjfjcho|~ywx~{vqkeaachxvtuw|yslnv}uqmkjjjjkllmnnmlgptry~uqnrt}}yvtpotrls{wyyzz{{{{{zxsvpjfggq}wxx}~{uqnlkjjklkigmqs{~vkif`achmsy~ysidlilr|~xvy|xtstvy~~xqjb^^el~~xqkijnq|~{yurokibhomsx}|xuonrppv~{ywvusqnje`[[[bqnnoru{unkilow|yrnqnorzpg^YUUW[agmrttqsnf`jnsyvxztqpqswz~}zvrorr{{ssuzz}|{{zzyywuroie`csu|wstw}zxuv}{||}}}{~|~zwsrruw}}tkb^\]klikmpz~}~|zyyyyxwroqlmly}ttqga\Z[^cgkllie_ZQYcfsvngdcdjorzwwtnaWV[Z^dkqv{}}ulgdejtx|||yvp|}uuokpw~|vumjjige`bkzy{psvw~nbveLGAABFIMORUWZ]_bcc]chjorvww~}z|wuvvwxxxxxxyyzxvlee^`jxtk[]^bjs}ïy\E@Zöw^F8-()/9EQ]fkmlf]ORPPV]gpw|{ukhqrxz||~{pdXPWnxjcZWUUUWY[^adhkooofba[]dpxupnijlonmhhqyvowzûo_]qn_QJB=86432357:=AB>JMRX]bfgqv||y}wtqnmlkklmnppoecc^cn~}qeiiowt`OFNnuaQE>;9888:<;;<>@DEHBKQSY]bfhlvy~wyytplihgghjloprmimggkywgiinw{k[NJYsbSJEDHOW`glnlh_RTOORW^hnz{~}yjfjjpruuuw}wog_X[l|wmidb_^]^_bdhkoprjjja`akx~|}vuuvwtokq~u{|ýwg^focZRMHEB@??@ADFHGEPQVZ`chhpw{zuzyupmjihhijlopphlkfhn}|nehgowueUIMcq`TKHINU]dknolg[SUOQTZbkq~{{ufihkoqsstx}wph`XU^v||slifca```acfiknpneid__do{}|vuttrnijuvtyz}n`_p~lcYTNKGECBBCDFGIEHRRX\bejjsx|~yrr}~yuqnkihhhiklmidkfegr~}xecdfnv|k[NHRq|l]SMKMSZbinqpleWVTORV]emt|}zndiglorspms~xqiaZ[g{}rokigedddefhknopkgkdaait}xvvurmjn|swy{xj`czzkd\XSPMKIHHHIJKKFOSUZ^cfijtw{{{zsnq}wtpmjhgffhilmojjpklp{zyvm`dcjr|vgZOM[~{l`WRQSYaiotwvrj]_YVWZ_fnu|lihgjkmmnov{tnf_[_n~|rqlkhhffghikmppqijkdccku~ywvtqkjq{tyw}tgafyof`[WTQONMMMOOQMMWW[_cgkloyz|}ysptyvroljiiiklnppiqqnos~xxywjcedls}reYPQ`~mbYVUZ`govz|zvjde]]\aems||lnikmopppqxzuoia^ct{usonkjiijklnqssrkqlheelv{zyvrlkrywzx~vjdkyqgb]ZWUTSSTTVVXRW^]cejmppu}{usxzwspnlkklmpqsqmvrsx{zrtxssdefirz{{pd[TWi~nd]ZZ_emu||onkccaehos~{qpjllnnnmou~ztngej~}|wurqoonoprsuvwqqvnlhjp{}{yromx~x}y|}rheq{tlgb_][ZYYYZ[[ZU_`bfiloqqx~~}~ytnovywspnlkkkmorsvpuzvxx~uousrmbfdkqzzyuj`WU[s|ne_]_dkrzyorjfeehlrwvsnkllnmmmpw{vpidfpzzutrqooopqrsuvvnsslkhkr|~{xtnlm{||tyuz|ynghzxoida^][ZZZZ[[\XXa`dgjnqss{}~~zuolo|}|wuqpmlkklmoqstnvwuwxwpoupod^aaioy|sx|qe\TUb~vkb^]`fmu|tpqgfdfiotzsrkllmmmllpy|wqkdbfv~xwtsqqppopqrstuqltokiglt~}zvtnihozy}stsswy~|rhel~wnidb_^\\[[[\[\V\b`fglmqrs|~{z}~|}}zupjedk|}xvrpnlkjjkmnqsvss}yz{~vmgjmji^`_dks|xto{~vj`WRWitjb^^agnu}uwskjgikptzxummkljighlu~yrlfgn}zxwvttsttuvxwxrqvpnjkpx}xsmiiuz}}rvqtvz}zpgfp}umhdb_^]]]]^^^]Xcdeilpquux}{~|}}yuojden|yuspnmlkllnpsuwsy{}|ridjikf]`^ekt{{wpr~uj`WTZorha_`djqyx|somlmpuy|uppnnmkiinw~yslggp~{zxwuuuuvwxzyyrxxrpklpy~ysmhitwyuuquv{}|qhfruojfca``_``bac^`jhlnqtwzy~}|}ytoiefq{wurponnnprtwyzv~~}pgchglda``gmv}~{vpwtj`XV^ttidachnv~}utqqrv{utqqpomkgkt|wplmz}|{{{{|}~}x{wtppt}|unjnwzzyvtvx{~ynghvwqkhecbbbccede_glkoqtwy{z}||z|}{wtojc`bp}zwtrponnopsuy{~|~th_`cej`caekry~xzuqn|{qg^XXdxsjdcejqyzwtttwz~xvrromjhhmvzunlo~}||{{{}}~yzywsppu~~yqkhpu{~wwrstwy|ulglx~wpligeeeeefggealmnqsvxz|{}{z}~|zwtpkfaagv}xusqpooopqtvyz}yzmc]aaed_a^ejqx~~wrsoily{~tjaYV[l{pieegmt{}yvssux{|wsqomkhghox{upklu~}|{{z{{||}||t{{utpoqwxskgiqs|xtsoqruwz|xoihs{{uokhgfeeeefffadnkoqtvx{{|}||yy|~~|zxuqmhb_`kx|ytsqoonnopqsvxyzwznc[Z_^f```ahmty~~yumllhdox{yof^XX`tzoiefinu||xvuuxz~|yusomifeflv~|wqoq}~|x|yvssu{yrlimtu~uuqorsuwz|~}vnilw~{upmjjihhiijiicjomqsuwy{{}}{||zvwz~~{|{{zzywuspmhc^]_lu~zxvqqopopprsvx{}~wkaZ\]_d_b_diouz~|wrkjjecqv|~ulc\Y[gxzqkhimsz~yxwx{}}yusomifehmw~{vqptz}|{wutv|yqliorx|vwqqrtuxz|~|unjnv~wspmlkkklllljgrrsuwy|}~|}zwx{~~||{zywusqmid_^bnu||xutrrrrstvy{~~wk`Y\[cebdagkrv{~~{wqklkdjvx~ume^\^kxyqlklpw~}{{|{wurolihjoy|wsqv{~}xvuw|zrmjpq{{xvqrrtvx{}}uokquxtpommmmnonojlvsvwz{~{{xuuy~~|zyyxwutrpmie_[Zalvy|vutsstuwy{~}pdZVY[efgffkouy|~~|zvrlhkidqy|zrjc]\`nz{snmnsx~~~{wsokhfhnv}|vsr{{xwzyqklptz{trssuvxz|yqkkqwxtpommmmnonnirvtxy{}}{}zwtuy}|zyxwvtsqnjfa\YZem{~y{uussstuwy{~xj_VVX]fcfbfjotxz|{yvrnhejeeuxxog`[[esvokjmrx}}~|yuqmifehox~|xrqs~{yvwz{slhmow|vvoooprsvwy{}{tnjnu}ztqmlkkkkllljgsstvx{|~}{}~{wtruz}{zxxvvtrpnjfa\XW[hpxwwrrqqqrtuwz|}pcXSVV`cab_dhmquwxwtqmhcaf_gtv|sjb[Y\iw{rliimry}||}zvrnjfddfmuz||xspqx~{ywy}ypjjoq{{xsnonpqstvxz|}~}}vojipuztpmlkkkklklgjuquvxz|}~|yx}~~|yvrooqw}{ywutsrqomkhd`[VST]hr~twurrrssuwy|~ug\SQVXcdecdgkoruuusolgd_`e_mvzxog_ZZ_nz{sljjmsy~}~yupkgddhnw||xspq{|zxy~woijnr|yxqonnpqstvxz|}~|unijqwzvronmmmmnmmhswtxy||}{z}{wsqprw}zzwvtsrpnlifa]WUU`hw~uzvtttuvwy{~tg\SST[ffgdgjnrtvvusplhd_cdbtw~woga\\co}|tomnrx~{vrmiffipw~}ytst~~{zzxqkmnv~|zssprrtuvxz|~~|uokmqy~zvsrqqqrrrpmzyy|}||~|yusrty~}|ywutsqomjgb]YWXbi{~x}xwwwwyz|~{qd[TVVbklmjnpsuvwvsqmjfc_fciyz|umga^_hrwrqrv{}ytojgfiou|}}yutw~}}yrmop|~ytsrrstuwy{|~~{uoknq~~zwusssstssos}y|}~~y|~~|yvsopqvy|}zwutrqonligc_ZWUZbl~yy}xyxyz|~xmaXTUXfjlkjmpsuvutqnjgc`]eanwzyrke`_alv}vrqsw}|wrmifgips~~{wut{|}~}vonoq}~|usqqqrstvwyz{||{||vqmmqt}zvutssstrsmv|x||~}zy~~~}|yvspnoqwx}}yxtsqpnmkifd`\WVW^er~uxzvwwxy{}{rf]UUV[gikhiloqssspnjfb_[Z`^osyzsle`]_fq|ztqqtx~|xsnjfdfios}{~{xttv~}{|}xrlnnu}{xqpnoopqstuvxxywz}|}ysolorz{xusrrrrrqomzyy{{}~~zwy}}|{yxvromklotu}x~}utqpmmkjhfc_\XUTW`gx{uyzwyy{|~~}~}ul`YSVWbjllilmpqqpolida]\W[^cst}~wpic^^`jsysqqtx}zuokgefinrzx|}|}~}{xursw}}xqmooy~|vqpooopqssuvxxyv{{{vqmlps}|yvuststrsoq|y{{}~|zwz|~}{zxurolklptv|z{wtqpnmkigeb^[WTTZbk{{w{{yzz|~}|}|~sj_WTVXglokkmnpqqpnkhda][X^_kvx}vnhb^]akuzussv{zupkgffknu{}~{xtrrx~~xqnoq~~wsqppqqstuwxyz{x}}}wrmlos~zwvuututtoy~{~~~{x|}~|zxtqnmmqty~~{wusqomligd`\WUT[ap|z}{|}~||||~tk`XUV]koqmnoprrrqolieb_^[adsx}}voic`_dmx{vuvz~{vqlhggknuz~~}zwsrryyrpov~wurrrrstuwxz{|{z~|vqlmov{ywwwvvvtr~}}yxz~~}{xvrolkkoqy|}{vtrpnljgea^ZVTU\dw{xxxyyqg^WWXerttqqqrrrpnkheb`^\]cky{zslfa^^fn~|wvwz~}wqlhgglnv|~~|zwtqpsz~vpoo{{usqqpqrstuvxyzyy|~xrnknp|~zxvvuuutqt|~~{xy{~}{ywtpmkjkorx}|yuspnljheb_[VSRW^i|||~~}yvwvx}ulbZVWZiqspnooppomkhea_\[YZ`nwz}vohb^]`js}xttuy~~ytnifegknu|~|||}}}|{ywtqppv~~~yrooq~}vrpnnnoopqrstuutuy~ytoklot{xvutttsrnx~z}}{xvy{~|zywtqnkiiknqv|yurpnljhec`\XTST[ao}y||}}zwsrqtwnf_YXZaottppooonlifc`\ZXWVYaquz}wpjd_]^cmx}xutvy~ysnigfgjmr~|{yxxxxxxwvurpnnpxxrqpu{uronnnoopqrstttrrz~zvqnkmpw}yxvvuutsq}}|~~}zvwy|~|zxwurolihhjlotywsqnljhfdb_[XUUW_ev~{{vsqrquume^YZ[erusppoonmkiec_]ZYXWZgtv}|void_^`hp~}xvvx|ysnjgfhjmu}|zzyyyyyyxvtqooryxsqpz{vsqpoppqqrstuuust~{wromop||zyxxwwsw~~{wxy~|zywtqnkiijmox|yvspnljhfd`]YWVY_h|~|wsqqpvumf_[[]kvxutssrqomjgda^\[ZY^owy{unid``bjq|{{~zuplihikmy~}|||{{{zywurqptyxtrr|xusrrrrsttuvwwvtw{wrnmoq}}|{zv{xxy~|zxvtqnkiijlm{}|xvsqomkigeb_[YY]bn~ytpnnntslg`_^cs{{wvutrpnkhda_\\[[[dwy}ysmhdaaelu}||}wrmjiikm~}|zzyyyxwvtronntywurw{wtsrrrrsstuuvuurz}yuqnnov~||{zxv}ywxz}{zxuspmjhhjko}|xurpnljhfc`]ZXY^dv|vrommntpid^^^hx{yvtsrpnlheb_][[YZYhxx~|wqkfb`afn{|{|ytokhhijn~}{zxxwwvvusqommpv|{utqz}xtrpoooppqqsssrrn{~|yuqnlopz}{zzxxuw|yvwx}|zywuroljgggjjq|yvspmkigdb_\YWVZ`i}}xsollkmrlf`]^`nyyvsrpomkieb_\YXWVWXlvw}}xrlfa^^aiq|yyz}~{vplhgfiis~}zxvttsrqpomkihinuxtrsyuqonmmmnnooppppnm~|yvrollos~|zyywws{~~zwuwx}{xwuspnjhfffihv}|xuqomjhfdb_\YXY^dq~ytnkiiilqjea_`eu}zvsqomkheb^\YWWVWX\swz{uoje`^_clu|yyz}~}xrnjhgihx}}zyvutsrqpnmkiijpw~xusvzvrponnnoopqqrqqnq~{yuqmklou}{zyxvuywuwz~|zxvtqnkhfffii}~~zwsqnligda^[XWX_ew~ysnkiiinqjfbabl{|xvsqnlifb_][YYYZYdzy{uojea_`emy}}~~ysokihik~|zywvutrpnkiijpx~xus|{wtrpppppqrsstssoy}zvrnkmoz~~|{xz|xwx}~|zxvspmjhggil|yvspnkifc`\ZXZ`h|ztokihioqliefft~{xtqnkhea_\\Z[[^]n~|ztojebabho|wqnkkjo}{ywutsrpnlihgjoz}xuu|xusqqqqqqrsstrro~|xtpmlmp~}z{wwx}{ywurolihfggq~{yuspnkigda^\[_dpzuplhgghoojgefiz}zwspmjgc`][ZZZ[\^t}||wqlgc``cjrytoliigs}{ywutsqpomkhhhlr{wtw}yurqpoooppqqqqpnn~{yurolmot~}{zx{xvwx|zxvtroljgfegfu~~{yvspnkigda_\\]bgw|wrmjgffgnlhfefm}}yvspmjgd`^[YWWXXY_uxz|wrmhda`agny~~~}}}~{vqljghgx}~zyvtsqponljiggiou~}}~}xvt{yurpnnmmmnnnnnmmjo~}}}~~~~}{zwuromlnpy}{y{|~ywvw{|zxvtrpmjhfedegz|}ywtqomjhfdb_^^agn|wsnigeeehnkihhiu}yurnkgd`]ZXWVVVYXexx||xtnjeb_`bhp~~|~{{}{wrnkihj||{xvtrpomlkigfefjow~}}}|xvu~yurpnnmmmmnnnnllit|}}}}}}}|{ywtrommor~}|y}~ywww}zywuspnkigeeek~}}zwtromkigeb`__chr|wsnjgeeeinkihil{}yurnkgd`]ZYWWXXZ[mzz~|xtnjeb`adjr~|||wrokigo~}{xvtrqonljhgffjo|}~}{xuwzvtrpooooopppponm{~}{yvspmmot~|~ywwx|{ywtromjhffep~|zwtromjhec`__chw}xsnjgeeejnkjijq{wsplieb_\[ZZ[\]at|}}xsojfcabekv}~}xsokiiv}zwurpomkhfdcdhn~}}|~{xv|{wtrqppppppqqppmq~|zxtqnlmow~zxw|}{ywuspmjhffhw|yvtqoljgdbabfmzvqmifeefmpmllmy{vrnjfb_][ZZ[[]^hz{wrmiebabgn|~{|~~ytoljkz~|yvtrpnligeccejr}||||ywv}yusqpoonooooonnkt~}{yvspmlnq~|{xwx~|zxvtqnkigeejz}zwtqoljgdb``chr{wrnjfdcdelnllmp~|wsnkgc`]ZYXXYZ[]kx|~~{wrmieb_`ciq||~zy|~ztpljhn|~|zwtqoljhfdbabflx|{zzzzxwyzvrpnmllllllllkjjv}}}|}}||{zywurnlkknt~|z{{|xvwx}{ywuspmkhfdddn|~{xtqoligda__`eky|xtokgdbbcfmomnov~xsnjfb^[YWVVVWYZ`ox|~~{xsojfb`_`dlvz{|xx{~zuqmkis~~|xuroljgeca__afl|}{yyxy~}yxv||wspnmlkkkkkkkjjgkw{|{{{{{{zywuspmlkmpx||~{||xvw{}{ywusqnkigedes}~{xuspmkifdbbdip}yuqmifdccdgmnmopz~xsnjfb^[YWWVWXZ[dry}~}zvrmieb_`bgn{z{|xy|~ytpmjkw~}{xuromjhfca``cho}{yxxy~|yxw~yurpnnmlmllllkkiqy|}|||||{zywvspnlknp}|~}xxx}{ywurpmjhfeiw~}zwuromjhedcejs{wsokheddehnnnorzupkgd`][ZYYZ[]_lv|~{wsojfcaacip}~~z{}zvqnjnz~}zwtromjhecbbdis|zyxz~{xwy~zvtrppoooooonmllv{~}~~~}}|{ywtrommnr~~yyy~|{yvtrolihfnz~|zwuspmkiggjnz}zvsokigffgkqpprv~xsnjfb_][ZZ[\^`dry|yuqmifcbbeks}}y{~|wrolt||zvtqnligdbaadiw}{ywwy|yxv|}yvsqponnnnnnmljmwy~}||||{zzxwurpnlmov}|yy{}{ywuspmkhggrz~{yvtqoljhghkq{xtqmjgfeeflqoqr{|vqlhd`^[ZYYZ[]^fsw~}zvsokgdbbcgmy}{}{y{~yupmlw{~}zwtqnligecaabfl~~{ywvvy{xxw~yurponmllklkkjignvv{yzyyyyxwvtrpnmmoq{|{}zxy~~|zywuspnkigfhuy}{xvsqnljhggimu{xuqnkhedcdflpoqt}xrmiea^[YWWWXY[]irv}}~}|zwsokhdb`adiq~zy{yy{zvrnkmx{~|xurnkhfca_^_bfp~{xvutsxzwwx|wspnmlkjjjjiihgfptvywxwwwvvusrpnlklos}zz|yyz~|zxvtromkhgelwz~|yvtqomkihilq|}~~{xuroligeddegnrrtx{vpkfb^[YXWWXYZ\_mrw}|}|zxtqmifca`bekt~yxzxy{{wsols{{|yvrolifca_^_chu}zxvtssxyww{{wspnmlkkjjjjihgistwzxyxxxwwutrpnlkmov~{{|yy|}{ywuspnkhgfqy{}zxurpmkihimr~}zwtpmjhfeeehoqrt}|vplgc_\ZYYYZ[]_esu|~|yvrnjfdbabfmxzz{yz|xspnw{}~{wtpmjgdb__`cj{~{xvsrsxwww~yvsqonnmmmllkjinwv{|{{zzyyxvuspnlkmpz||}zz}{ywuromjhiuy}~|yvtqnkiijmt~{xurnkigeeejqrtw|vpkfc_]\[[\]^abmwx~|yuqnjfdbbchn~{{{yz~yuqr|||xuqmjgc`^]_ck}zwtrqrvvvx}xurponmmllllkjjrxw|||{{{zyxvurpmkkmq|}|z{}{ywurpmkimxz}zwurolkjlq{|yvspnkigffgkqsuzztniea^\[ZZ[]^`cpvx~}zwsplhecabdjr}yzzy{|wspt|{}zwsolheb`^^`eq~{xurporvvv{zvsqomllkkjjihgisttzyyxxwwvusqomlklou|y|{z|~}{ywurpmjigoxy}zwtromkjkot|~{xvspmkhgeeeflrsv}|vpkfb_\ZXXXYZ\^dprv|||zyvsokhdb``bfmw~zwyyy}|xtpnv{z}zwspliec`^^_cix~{xuspoorvvw|wspnlkjiiihhgfeirqswwvvvuttrqomlkkmqz}zy|{{}|zxvtromjijtyz}zwurpnllnrx~|y}{xvtromkiggfgintuxyrlgc_\ZXXXXY[]_hrrw|{zyvspmjfcb`adip}~ywyyy|xtqqz|{}zvsolheb`^^`dk}}zwtrpnnruuw~yuromlkjiihhgfeelrpswvvvuutsrqonlklor}zy|||}|zxvtromjilwx{}zwurpnmnpt||{~{yvtromkihgfgiotuzyrmhd`][YYYZ[\^bmtsy}|zyvsplifcbabekr~zxzz{|xuqt|{|}{wtpmjfda``aep~{xuronnruuy{wtqonmlkkjjihghqtrvyxwwwvvtsrpnmlmot{|}|}~|zxvtqnlkqyx|~|ywtrponpu}}{xvtromkihhhjptu|ysniea_]\[\\^_afruv|}|zwtqnjgeccdgluzz{z|~yurx}z~|yvrnkgdb``bfs~{wtqommqst|{wtqpnmllkkjiihkttswzxxxwwvutrpomlmpx|}~~}{ywurommvzz}{xusqppsx~||zxvtrpnlkiiikquw~wqlgda^]\\]^_ackuvw|~|{xurolifdccdhn{~yy{z}yut|}{~{xtqmifca``ciz|yuromkmqsv~zvspomlkkjjihggmtrrwxwwvvutsrpnmllnq}}z{~}}|zxuspnlnwyz~{yvsqoopt||{~|zxvtrpnljihghlrvyztnida^\ZZZ[\^_bltsv{|zxvsplifdbabejrzwxz{}yvru|{{|yuqnjgca__aen|yvrpmkjmruyzvspmljiihggfeeemqoquvuutssqpomlkklou}zx{}~~|{ywuspnljpxxz~|yvsqonoqv|y{|zwvsrpnljhgffhmtw}}vpjea^[ZYYYZ\]_cnrruyywurolifca``bflv}yvxz||xurx}{||xtplieb`__bfs~~|yvspmjiilru|}yuqnljihggfeddcfnompttssrrqpomlkjkmpx|yx{~}{ywusqnllsyy||yvsqoopsy|zx|~{yxvtrpomkihgginux|uoiea^[ZYZZ\]^`gqrsvzywurolifca`acgo{}xvyz~{xutz}{}|yuqmieb`_`ciy}zvspljhilru~yuromkjihhggfeejqpprvvuttsrqpnmlkknr}}zz}}{ywuronowzz}~{xurppqt{~|{}{zxvtsqomjihhinty}vqkgc`^]\\]^_admutvx|zxvspmjgdcbbdip}yxz||yuv}}{}}yvrnjgda`adl~~zwtpmjhhlqv{wtqonlkjjiigggosqqtwwvvutsrqonlklns||}{ywtqps{{{|zwtrrsv}{|~|zyxvtrpomkiijpuz{uojfb`^^]^_`bdgrvvwz|zxusomigecbdfkt~zx{}}zwz}}}zvrokgdbabfq|yvrolighmrx}yurpnmkjjihggfhqrpqtwvuutsrqpomllmpw~{|~|zxvsqpv{z|~{xvsrrtx~|z~~}{yxwusqonljiikqv~~xrlhda_]]]]^_achsttuxzxvspmkhfdccehny|xx|}zwv{~||~~{wtplifcbbdiw|yvspljhghns|~zvspnlkihhgfeddhoonnrtsrrqqponllklnr|~|z|}{ywuspoowzy{~~|ywtsrsv|~{yx}}|zxwutrqomljihimsy{tniea^\[[[\]^_bjrrrsvwuspmjhecbbcejq}ywx|~{xuv||{{}}zvsokhecccfm|~}~}}~~|ywtpmjhffiou{wspmkjhgffedcbcinllmqrrqqpoonmlllmpt~{{}~}{ywusqorzzz|~|ywutsux~|ywx~|{yxwvtsrpnmkjjjnt{~xqlgc`]\[[\\]_`dmrqrsvvtqoligecbbdglt}ywz}}{xvy~}|||yvrokhedcdhq~~}~{yvspmjgffjpw{wtqnlkihgfeedcelnmmnqsrqqpoonmlklmpw}{{~}|zxusqpu{z{}~|ywussuy}zy|~|{yxwutrqnlkiijnt}~xrmhda_^]]^^`achqtstuwwtroljgedccehnx}zx{|yw|}|}}zwsolhedceiu}zwtpmifeeipz}xurpnlkjihgffeippooqtutssrqpomlllnqz~||}{ywtrrx|{{~}zwuttv{~|{}|{zxwvtromkiiinu}wrmheb`__``acdfmuuuuvywuromjhfdcdfjp|~zy||zz}}~~{xtplifddflz~|yvrokheddiq}|xurpnlkjihgfefkqpooqttssrqponmlklns~|}~|zwusu{|{||ywuttw~|{{}|{zywvtqomjihjow|vqlgdb`___`abdgoutttuwvspnkhfdccdfkr|yy}}zxz~||~}zvrnjgeddgp~|zwsplifccekt~zvspnljihgfeddelonmmpssrqpoomlkkklpv~|{}}{ywtrqu{zz|}zwussuy~|zxz~|{zyxvusqomkihhkq{xsmhda_^]]]^_`bforqqqsuspmkhfdbbbdhnw}zwy}zxvz~|{{}~{wtplifddfkv~~~~}}~|zwtqmjgdccfmy{wspmkihgfedcbbellkkknppoonmlkjjjkmrz~|{~|zxvtrrw{z{|~|ywuttv{~|yxw{~}{zyxwvusqoljihils~|vpkfc`^]]]]^_`chpqppprsqnkifdcbaceip|}zxz}{yww|~|{|~}{wtpligffhn{}}~~|||~|zxusolhfcbcgo{~zvromkigfedcbabgllkkknppoonmlkkjklos~}||~|{yvtrsy{z{|~{ywutuw~~|zxy~}|{zyxwusqomjihimuzuojfca_^^^_`abelrrqqqssqnljgedccdgls}zy||zxz}||~{xtqmjhfgiq~~~~|ywtpmifdbcgp~~zwsqnlkihgfeddekonmmnqrrqqponmlllmpu}~~|zwutw||{|}}zxvuvy~|z|~}|{zywuspnkihimvzuplhecaaaaabcehptssrsttromjhfeddfhmv~{z~}{y|~}|||yvrolihilu~}{yvspliecbcgr}zvsqomkjihgfedgmonmmoqrrrqponmmllnqx~}{ywvz~}|}~}zxvuvz}{{~~}|{zxvtqnkihinx}xsnkgecbaabccegksttsrsttqnljhfedegjpz~{{~|zz~~}|}~{xuqnkiijny~~}zxurokhebbdjv{xurpmkjihgfeddhnnmllnqrqqpoonmllmos|~}{ywvv{}|||~~{ywvvx}}{zz~}|{zyxvtromjihjq}{vqlheca```aabcekrrqppqrqnljgfdddegls|z|}{yxy~~|{{|~|yvroljiikr~~}~~}|}~|zxurolhecbbem{}zvspmkihgedcbbchlkjjjlooonmmlkkkkmpv}}~}{ywutv{{z{{~~|zwvvwz}{yxy}||{zywvtromkihilt~xsnjfca`___`aacfmqponnopnljgedcbcehmv~{{~~}{yxwz~}|{{}~|yvrolkjknv~}||~}|{{}}|zxvspmjfdbabfp~{xtqnljhfedcbaacikjiijlnonmmlkkkklnry~}{ywutx|{{{|~{ywuuw{~|zyx{~}}|{yxvtromjihilv}wrnifdb````aabdhoqponnoonkigedccdfipy~{{~}{yxx|~}|{{}~{xuroljjkpz~}~~}||~|zxusplifca`bgr|xuromkihfedcbcfklkjjkmooonmmlkkklns|~~|zxvv{}|{{|~{ywvuw|~|{{~~}{zxuspmjhghmx}xtokhedcbbbcdeglrsrqppqqomjhfedcegkq}~||}{yz~}|{{}~|yvrolkjlr}~~|zwtqmifc``bhu}yvspnlkihgfedeinnmllmoqqpoonmlllmot~{yxy~~}||}~{ywuuw~}|}~}{ywspmjgfhnz{wrnkhfeddddeegiotsrqppqqoljhfeddfhmt~}~~|zy{}|{|~~|yvspnllov~~|zxurokhda`_bjx~{xuromljhgfeddejnmlklloppoonmllklmqw~|zxwz~}|{{}}zxvvvz~||~~}{zwurokiggiq~}yuqmigedccccdefipsrqponoomkhgeddefiox}|~}|zyx|~|{{|~}zxtqomlmqz~~~}|~|zxvspmifca``dn||yvrpmkihfedcbbejljjijkmnnmmllkkklos{~|zxvvz}|{z{|~{ywvvx|}{zz~~}|{ywuspmjhghlu{wrnjgdcbaaabbceiopponmmmmkigedddehlr}}}~}|{zxwx|~|{zz{}~|zwtrpnnpu}}|}~}|{{}{zxuspmjgdb``bgr~}yvspmkigfecbaaaejjihhhjlmmllkkkklmpu}{ywvw{}{{z{}}zxwvvy~~}~~|zz{~}|{ywuromjhghmw}ytplifdcbbbbbcdfkpponllllljhfeddefinu~~}}|zyxwy}~|{zz|~~|ywtrpooqw~}}~~}|{}}|zxvsqmjgdb``biu|yvspmkihfedcbacgkjiiiikmnmmllkkklnrw~|zxxz}}|{{{}}{ywwwz~}|{~~}|zxvspmjhginy|xtpmjgeddccddefiorqponmmnmkigfeefgjpx~~}|{yy|}|{{|~~|zwtrpopsz~~}{ywtqnkheb``cjw~|ywtqomkihgedddfkmlkkjkmooonnmmllmosy}{yy|~|{{|}}{ywwx{}~~}{yvspliggip{~{xtqnkigffffffghlqsrqonmmnmkigffefhkqz~}|zyz}~|{{{}~|zxusqpqu~~~|{yvspmjfca_`cmx~{yvsqomkihgedddglmlkkkkmooonnmlllmpt}}{zz}}|{{|~~|zxvvx}~~~}{xurnkhffir|}zwspmjhgfeeeffgimrrqpommmmljhgfefgimt~~}|zyxz~}|{z{|~}{yvtrpprx~~}~}{ywtrokheb`_afp{}{xurpmkihfedcbchkkjjiijlmmmmlkkklnqw~|zyxy}}{zzz{}~|zxwvwy~~~||~~|zxuroligfglv~|yuqnkhfeddcdddehmppomlkjjjigfeddegjow~}|{zyxwwy||{zyyz|~~}|zwusqqqt{~}}}~~}||~~|zywtrolifc`_`bit}~|yvspnkigfdcbaacgjihhgghjllkkjjjklosz}{ywwy|{zyyyz|~}{ywvvwz~}}~~}||~}{ywtqnjhffhnx~~{wspljgfedccdddehmonmljiiiihfedddehkqz~}|{zyxvvvy|{zyyyz|~~}|zxusrrsw~}|}~~}||}{yxuspnkgda___ckv}}{xuromjhgedcaaadhiihhggikllkkjjjkmpt|}{yxx{}{zyyyz|~|{ywvvx}~}~~}}}}{ywtpmjgffipy~~}zvspmjhgfeeeeeegkoponlkjijihgeedefimt~~}|{zywwx{}|zyyyz|~~}|zxutrrty~~~~~}{yvtqnkheb`_`dmw}~}{xvspnljhgedcccgkkjjiiijlmmmllkklnqv~|zyz}~|{zyz{}~}{ywvwy~}{xuqnjgffiqy}}|yvspnkihggfggghjnrrqonlkkkkihgfffhjov~}|{zyy{~~}{zzz{}~~~}{yvuttv|}{ywtrokheb`_`eox|}}{ywurpnljigfedceillkjjjjlmnnnmmllmorx~}{z|~|{zyz{}~}|zxwvwz}zxtqmigefjsy||zxuromkjihhggghikprqpomlkkkjihgffgilqy~}|{zyxx{}}|zzyz{}~~}|zxvutux~|zxvspmjgda`_bhry|}|{xvtqomkihfedccfjkkjiiijkmmmmllllnpt{}{zz|~}|zyyy{}~~~}{yxwwx|~~}{yvsoligfhmuz|{yvspnkjhgffffffhkoppnmkjiiiihgfffgjms|}|{zyxwvw{}|zyyyyz|~}|{ywvuuvz~}}~~}}}}|zxvtqolifca`adltz||{yvtqomkigfdcbabeiiihhghijlllllllmorw}{yyy|}|zyyyy{}~~}|zyxwwy~~}}~~~}}{ywtqnkhggjpw{{zwtqoljigffeeeefgknonlkihghhgffeefhkpv~}{zyxwvuuwz{zyyxxyz|}}|{yxvvvy~~}}}}}|}~|zxvtroljgdb``afnvz|{zxuspnljhfecbaabfhihgggghikkkkkklmosy~|zyxz||{yxxxxz|}}|{yxwvwz~}}~~~}{yvspligffjqwzzywtqoljiggffffffimoonlkihhhhgffefgilqy}|{zxwvvvx{{zyxxxyz|}}|zywvvwz~~~~~~~~|{ywurolifda``bgpvz{{zxusqnljigedcbbdhjiihhhhiklllllllnpt{}|zz|~}{zyxxyz|}}|{yxwvx{|zwsplifefkrwyzywtromljiihhhhhikoqpomljiiiihgfffhjms{}|{zyxwx{}|{yyxxyz|}|{zywvvw{~|zxuspmjgda``biqvz{{zxvtrpnljhgfdddgjkkjiiiijlmmmlllmnqu}~|{{}~}{yxwwxz{||{yxwvvx||yvrokhedflrvxyxvtrpnmkjjiiiiijmqqpomljiiiihggfghkou~~}|zyxwwx{|{zyxxxy{|}|{zywwwy~}{ywtrolheb`_`cjrwy{zywusqomkihfeddehjkjjiiiijlmmllllmorw}{z{}}|zywwwxy{{{zyxvvwy~}{xtqmigeehntwyywusqomlkjihhhhhjnppomljihhhhggffgilqx~|{zywvvvxz{zyxwwwxz|||{yxwwx{~~~}{ywtrolifda__afmtxzzzxvtromkigfdcbbdgiihhgggghjkkkkklmptz~|{yyz||zxwvvvwyz{zyxwwwx{~~~~}{xurokhfefjquwxxvtromkjihggfffgimonmkjhgfffffeefhjns{~|{yxwvutuwzzyxwvvwxz{|{{zyxyz~~}}}}~}{ywuspnkheca``bhouxyyxvtrpmkigfdcbaacghhggfffghjkkkklmorv}}{zyy{|{yxwvvvwyzzzyxwvwx|~}~~~|zwtqnjhfeglruwwvuspnmkjihgggfghjnnmlkihgffggfffgikov~}|zyxwuttuxzyxwwvwwyz||{{zyyy{~}~~~}{ywuspmkheca`adjquwxxwvtromkihfecbbcehihhgggghijkklllnpsx~|zzz|}{zxwvvvwyzzyxwwwwy~}zwtqnjhfehmruvwvtsqomlkjiihhhhjmoonmkjihgghhggghjmqw}|zyxwvvxz{zyxwwwxy{||{zzyyy|~|zxvtqolifca`aekquwxxwvtrpnljigfeddehjjjiiihiiklmmmmmoqtz}|{|~~|zyxwvwxyzzyxwwvwz~{xuqnjhffhnrtuuusrqonmlkjjjiijloqponlkihhhiihhhiknsz~}{zyxwvwy{{zyxxwwxy{|||{zyyz}~|zxvsqnkhecaabfmrtvwwvusqonljigfeddfikkjiiiiijklmmmmnorv|~|{{}~}{yxwvvvwxyyxwwvvx{}zwspligefjortuutsrponmlkjjiiijloponmkjihghhhhhhjlpu}}|zyxwvvwy{zyxwwwwxyz{{{zzyz|}{ywtroligdbaachosuvwwvtrpomkihfedcdfijiihhhhhijklllmnpsw~|{zz|}{zxwvuuuwxyxxwwvwy}}zxtqnkhfeglqstuutrqonlkjiihhhhiknnmlkihgfffgggghjmqw}|zywvuttvxyyxwvvvvwyz{{{zzz{}~}}~~~}{ywurpmkhecaabekptuwwvusqomkigfdcbbcehhhggfffghijkllmnqtz~|{yxy{{yxvuttttvwwwwvvvxz~{xvrolifeehmqstutsrpomlkjiihhghilnmlkihfeeeefffgiknsz~|zywvutssuxxxwvuuuvwxz{{{zz{|~~~~~|zxvtqolifdba`bflqtuvwvtrqomkigfdcbbcfhhggffffghijkklmoqu|~|zyyz{{ywvutsstuwwwwvvwx{}{xurnkhfefinqstttsrqonmlkjiihhikmnnlkihgfeeffgghilou|}{zxwvutuwyyxwvuuuvwxzz{zzz{}}{ywuroljgdbaacgmqsuvvvtsqomljhgedddfhjiihhhghhijkllmnorw~}|z{|}{zxvutsttuvwwvvvwy}~|yurnkhfefjnqrsttsrqponmllkjjjkmoponljihgffggghijmqv~~|{yxwvvwyzzxwvvuuvwxzzzzzz{~~|ywuromjgdbaadhnqstuvutrqomljigfedegjjjiihhhhijkllmmnpsx}|{{}}{ywvutsstuvvvuuuwy~~{xuqmjgeegkoqrssssrqponmmlkkjjlnppomljihgfgghhhiknrx}{zxwvuuwyzyxwvvuuvwyz{{zz{|}{yvtqolifdbabejoqstuutsqpnlkihfeddehjjiihhhhhijklmmnoru{~|{z{||zywutssstuvvvvvvx{|yvspligefhlpqrsssrqponmlkjjiiikmonmljigfeefgghijlpu{}{yxvutttvxxwwvuuuuvwyz{{{{|~~~~~|zxvtromjhecbbdgmprstttsqpnlkigfdcccdghhhgggfgghijllmnpsw}~|zyyz{zywvtsssstuvvvvvwy}}zwtqnkhgfgjnqrrrrrqponmlkjiihhijmmmkjigfeeeffghiknrw~~|zxwutsstvxwwvuutuuvwyz{{{|}~~~~|zxvsqnligecbceinqrsstsrpomkjhfedcbceghhgggffgghiklmnoquy}{zyy{{zxwutssrstuvvvvvwz~|zwtqmjhffgkopqqrrqppnnmlkjjiiijlmnmkjigfeeefghijlosy~|zxwvtttuwxxwvuuuuuvwyz{{{|~~|zxvsqnligecbcfjnqrssssrpomljigfddcdfhiihhgggghijklmnpru{~|{z{||zywutsrrsttuuuuvxz}zwtpmjhffhlopqqrrrqpoonmllkjjjlnoonlkjhgfffghiikmpt{}{yxwvuuwyyxwvvuuuuvwyzzz{|}}{yvtroligecbcfkopqrsssrqonlkihgfeefhjjjiihhhhijklmnopsw|~|{{|||zxvusrrrrstttuuvw{|zvspligefhlnppqqrrqpponnmllkkkmooonlkjhggfgghijlnqv}}{yxvuuvwyyxwvutttuvwxyzz{|~|zxvsqnkhfdcbdhlopqrssrqpomljihfeeegijjiihhhhhijklmnoqtx~}{zz{|{ywutsrqqrssttuuvy}~{xuqnkhfefjmoppqrrrqpponmllkkjkmnonlkjhgfeefghijlnsx}{yxvuttuwxwvuutssttuwxyz{|}}{xvtqoligecbceimpqrrssrqonlkigfedcdfhihhgggggghijlmnoruz}{yyyzzywutrqqpqqrttuuvx{ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m37.bin b/applications/SprPoP/assets/packed/MUS/m37.bin deleted file mode 100644 index dcce0f0..0000000 --- a/applications/SprPoP/assets/packed/MUS/m37.bin +++ /dev/null @@ -1 +0,0 @@ -ysgx{lw}twz]{~v|mxzzp|x{spror[uqt{}|uwvo}tlm}fzmm|}lxwjxs\rrcXvkt]ZhyqUrzl|yp}gzz~g_~{t~||rtruqzu~yTe{nwrnywmp||pautjtzh{dp{zsc_icr{|}o~}uv{f^||z{i_NOroo~s}wokSRry|||{yv~}|ju~ur`bbngiv}nwdgz~}i[Zh~wski`kflvwxz|qu_mhluux~uew{|jnhkmwvtb`a|zi|wek}vmo}tvm{z~{rebtfspn\Q_dhqqcgl`owyu{~}|ol|{vw|znrvZ_]mxjvz{uvhZ`lnjwWealpXVi}uvw~}x|uactxwyeduOYkutwmquilgbgrarzgmqz{hxw\YVX]cx}ecv{v|~zxxvid]oyz~goxkqkxux~{qhzskvufTV{dOagiiwvsjryy|rzvbo|vqb|~xyxyshfjfh|z}jyyt~sffop`jtjhkr`sbZhx~z|w~~t}uyyyyl`it}opay`Yirqmiaonejrs]|zvVerr\pxpb_WXXexoht|r{sp}qqji|}uyulw~z{zmt~yu|r|tv|hqo_ul_bi[jstqzzvqxzysy}{{eblmf}s{ospomgkfupv|u|vup~}tanfvredyqYbowy|rz|uytsz|{}}sfq{zmcp|otvurljtiovqlnmzoRk{{nrs^svn`^_r{{}~{zy|aisyotlmvqepd~tu}v~xsrxntzvtqdf\]seTdsx|}|phu{{z~xsso^es~txkiemlvw}wnltr|~}d`rhsrmazzihjno~{zyrm|rx|w_lgwylywow^vve{{tr{wteql~silggloor~q{{}st}qujjageetxtg~sqsrp~~~rhdmzp[ht~`plbpoomrks{prxz|xo|{wlr{~tqvl~}yxx|r|dzvxu{}ttx}wkvw]tZttbgsxxv~rxp~rwpinpwvx|p{xwuqfsx}r}exxkikw|giwpypudmskhssqyowz~~y{uwdoopvrz{ajm{y|f~z|wxxrzu~|ksp}qgmc]iw|xx{lvzz||n}vzqxiegu|mszspvmn}~yyylpb|~|n`cjek|ltwsptxxv~wsmqn~vty~wuqwv~x^nrgvvssvw}wwovmtebpkdpxz~zv}wrzwt{jdmilrtlttt|vtu}~wkmmq|z|xbqvwuh{gcw|xrp~trhuywx{z}vvpxrvlrkv}yxczpv}m}xqsw{vho{ptfvrcdu~|~z}pvwzxyjmkmpx~ymzumx||pmmkv}`cvprd~|[tpiu{yypzvpp{~|}t|~{jyrimtu|sq{zzn|wpzuzx~gr{yqhk|ifjdiwz}|y|{wnu{zrjglw{otlh|zupwmqmts{z|pblp~y^elz}~svyywvi{}ow~uttxysxs|ztltpvtwlh|~xz|w|unuyj}}_dqkgt|}zto{{}hkkllkio~}v}~rykydoup}rs}mtfqw_gwxvzxpiz{|||yzxv}vsyzkzlx{u|zstvy~|njtv~{~|obosv|tstlhvxu}pvu{pmlmt|yxxj|~~xvx}pkwixpp|~uokjvQr{`iz|t~xws~z{syu~~r}tktuvy{z{y|~yzr}|o~khx{kdty}|zuovuozhjnefs~}zqz~xqoqqnhrvfuvwoylw{n~r~~}{nkxutmnp_t}{vtvz}olu~ty~yyvyszuxvv~}psx}sn|kn}}~uw|{~zysjpvrtmflsniov~~iwz{|{xvqplfiu|{z|vurwoypo|~tl|~y}~pvu]}tYev}|}lssxvz~z}}{||y}{su{~s{zvz|urpv{imxv~ytoin~zmxyuvsq~~z}jrz}}utvyytxmq}||zr|kokd}rvzuotste\w[enz~y~nw{~s|qu~rvwyuqwtu~yz}xo}ngy~umhq{y|}z}}{z|wonomhu~}v{~~{y~z}qukhdj^Kow|||mp{y~|vfnt`oxtgcwgystiomf_lflO^_ekrz^xn{tw{qlv`iti\lztjV]efSjabkstv~}rfqlz}hpu^x}mgm^bu^Rmvj}spcp`zhtub{skszgl]dyg~yqZetjy~tmpk|uY~zfnffNap`dxliz|}zy}gij{ifodkegppeuu[nYjzrprhmahplev{id}yivwcs~v|}ao~xYuwrrmd[jxvppulXye~w{|}z|{\s}XtaPgnujcrqmh_nvs{{xv|{kt}hbks[~g`nlfdijh}xoysz{wx~wrwqiquvysnsru~u~qssk}lzk_ktzbYucThg\fuVmzotzzjk]S\]UYswv||vw}cctxxrz~wl~qtw~oixtoshamugszwrxweppZetolhp{[o~jk~vajwx{swvZ^emkk]gwbcubtS_~}uu{jhqacknkqxflnd{|o}~xjvdu{qstb\{U`reYiwdr|ztsyqz~b_ja`o~{sryr\jsjuv{uvulsmplu~jqgfx}bgx[iyyo~{yahngba^Tb{spyeau}lcy{x{ywbnvyy}ktqlylrdUu~pz}nq}q~yutojxzrxz{}~spm{p^vrpyrpzj_`RTw{pgYYQroXh{f}}|zmvtuycnqrfjtqmtpnkcaUkyyxkwx|z{|o~~tzz]}apXTbdmwqfs{zQsx~|xjvy|_uuovitzypo`uuj{g_ekZnu{xxwl~vmzzmSaxpm|Xpws|piq[u|xgmhjvovdhOJevxto\pwuefztw{{xm{u||nesrh{~t~dflXf{{}~||\Yokyrp~tmumbrwu{e[|p~~~|}t{r}vvz}pn~e}vweWdk}{ndTZpwxh|mnytw^Hlwrw|rmwSRdkbbwvienzv}|{n}}lsxk}kkwsifhdnkpiR}swtrurcmb_rlhlzrw|ukluz}zw{xwmytawzvZq}YMTW[[[[wdYeyugkxvkw}zh`_[MXtw{ttssn|ykvy~xm^ftjhlikhg|qhs|tuoxjmxh~{g}{tyt^kkmmwuumo|ytzwn}}zqVtbtsm`ROMLUjraasz|ehyyz}fphe`}[YddYa~|zwuxv{{|z~Wdn^bki_ed`qfy[n}}qsshuswrq}~uoeedr{upx~q{|rwmXnw{m]skXSSTP^tpy~}}le~yznu}zmp]Zada\kx{qs~{xo{ss~tnfoqmcWUijvjmt{{sh~mdrus|p|gs}{ypjkoqryx{ze}x~odwcXwud\VSTVQp{khh}usyrsmznwq]Z^ajlzuzyumvz|uum^swnnlcZkuxsqzqyzmzzz|yz~g}hxpqqt|vy}vz|zzxkxyo]syml{ygVOO`dy|wsv{y}egxn|nuoukmokz|xuzs|slvw~xxkogjrupibf{ulfox{xyzzsvsp|y}tqv|{}||~z|u~ovxjpok{fgsiaZZs|lr|z{|hn|t~gjzzsyuiqr}zy~w~rv~lyx|z{{ghvxtpimqypqpw~yostyq~uud}n}|||wz{}y||r~evxw}}v}urnuzvmi_bw|uykiz~|zs}~yuwvxq~|stvot~|}~muxqz|ysuq~uwpwtuyzrquxsrytsu{~zy}y{z{{y~|zy~}x~qure~yys~}dq}vnnplyzzvp~zy~tns~zy|yvruxyvyy{rvxwtp|ouzt}ysgo{zly}yo~rq||}~u|}zuovlyw{||}~z}{|~xzlm{sz|}vwvwzytmz|xyyy{~zzxpu~}zw|zuytzw~stxyyzpozpsqwprvw|wt{xtj~{|q{ws}vxx~sz{vxw}}u~xwy|}w~zzuyr}m{uwjs~ukww{wsky|~zw{xz}rwt{q{~{}yz_|{smz|sw~hkidpSm~eYq|vsdzsvmnn_}}c_u}{wif{n}pkq}f]eyxnbzym|zxbkfmxfptl{jshb}oj~{zvpyzyor}_zlescolt|hsw}uh|z||~rkttsp\lohwxxzo~|lw|hbdcbz}vxms}uovnVaw{||\Vi|wpgUk|{xz|~{ruxv}qotwsdshzmllm~sb||[oxzpsytkovysxvznouvrrqvif}tulmq~yo|w{fqtvqhpg{svkmra\sswuhzc`mn}ob`d`ar}~{qsmspdvs\e{o~rwxux|nvcgavuhmcpwb|ftknpVtvbvkptpaUZnx{qipxatlrxj^n|}~xwttvtt\o{ikyf_{tsz~|}s{cdbdmlaj}zl}x|o|ih]Ufa]ontu\jx{z~rzhe}dqlYYkqhwyxt}rv~U^zotcskfq~v{s}etipmduau{trm~yp}|mewekko~wro^Rou|wz{spUtqgz\^unj}{phuggmPYufzuv~~r~~gg{sizplf{qnf~vmsjguaiskuq^ct}{sx{xrlmyblqlmdv{tz{soxceygnsky~jizjsu`luixtcow~~|lxm{sZgs]Wmwh}|esy|fws|ruimjfvmdt}y|swuxyswYcsrlgqww}{onlrpdokm~jw~{s~ytfvpgl{}}zpeizxtynp~iuuxqyfr|bylpxy~z{jb_Vek~xtqtr{vqg{wigwmr{uosviw}s}oqycfwx{x}emz|l|q~nriovfsrslvwuvwjplw}ql{x{msl~v|lgy{lp\ve~~~f|x{on`~uT[ph}{uk|o~b{my}|{fwu|ztwqmzoxwyz||qsrfks}w^n~y|~|{zzrktmviq_}ro|}|rzx{rv}zfh~u~wx~vwmmnzuuziywu}iewuptwt|u~vu_tq^h`wtmxpy~{nwsn|xzpl{zwzaz{ko}rnyu_nz~xt~}d{qhyxxxwytnipydu}~|v{|zyx}s}qqxih{||wrt}nfzx~naqhrz|p}x|uvujze[pmzwy||l|kl||}ury~yf}}w{{}l~ywx|}z{|ju{nrsrv~z\{yxy}{t~~qptrp~tug|}pzwsq{zym}{kk~qx}u|tyg~{zqmulwyd]zulx}|yyvyfs~rhqi~~t{|n{w|yzlryvtytlwxdxwq|{}rtrfp{qnxzg}yotxt{njwklsZuz{|}}}~s}~q~}vsvyem|qyqw~gqruzekjorr}y|xqwvmx}kku{s~w~wjy{l~hs{tl{w~^wx|pp{~z~u}ufmnrvma{tc~m~y~m~knxmsmzwwpvwt||t|nxxyrpyr||y{mnxzxcqteuup[qdw}|yuvxtvsnswvxrz|htzww~iu~ypnr}uyrh~|~sopswuctw{k}tn~r}ci{fvu|_~|z|{zx}uz|mlny|ly}zwuq|w}|fvspgoqpjvnq{||qi{zsyxxp|{|ytk~rz{hvy}skutbvxiu}}xd`o|ze^xokunlt~wxslzsybvuvmt}pq~}yjvywqw~uzw~sqqywfgzmrtyvu^yn]xx|~lyuhs~~b~rs~w~juyyxj|}zxr{nd{{iw}x~yspm{wdmu~huv~w{so|usj{rttrvqpu{zsw}txtobpt|wwxsrss}~lpyt|vnn|Ydxnpx|zzx|pv}g~ywyx{p||nzxixsv}}|rrn||yslzzwh]l}y`dmlqm}~nyi~~|pr}izuoyvt}mlsvy~co{mqu|q}~x{wzwutdoqvospyplm_jw~wyg~pi}ghqwyp~osp~{nt|xwx~yyzqqlqo~mzzrimppcqnrgux{yyq~}x~uw}{zys}}iqq~{oty~~|o|vbh{ysr~|nqs}~}|omrx{{ukbTtzspzw}sprww}|huzx~}w|zqqumxhsuqr}xqvpsc~xvszjne`n{l_igzmusy}{j}woz}wyzgy}xijowr`ozqxru}ty}~~o{zwtvienxmknxuuabnu|yy{gtyn|cm}y{qlwwm}r{||qyzytzw~|yqtvot~m|vqagp|qgqmpiw}x|yrv{xzmmywt{mot}y|xn~{igwmvznp|}y{|}|omlzzzwpcZpzq|}uxuxxiwz|gzzx{yvy|knrtiiuroqrrzsu}c|zum_jihpscjevmy||yxq}wzrz|vom}wjehr|rzfhszvsu~uxz{xpt{wv}xpfkzrhnvw^^uu}~}wxzooy}avuhfq}}mqvzryr~ywr}zx~sjkxx}}vw}qj_hu}osmx{fq{|~ye}xz}pv~up{{rkou|v{vqw|yynq~tstul}typmju}v~vhcexuv|sp|xko~~mu{svzyx~pjzy{_fuqmmtr~~x~mu}skWetomiileyno|yszw}~}swy}}spsjfdjq}srgjq|qq|t}w|ftxy}z~}uoktxpisoyUgwuv~~xz{{xvshtvpsafsnjoxzi{~wrv~v~rudqvu{qbgenwzu{qt{dmu}w}|vqwsssmrq}uqnsv|wwyyuvypq{zyqpz}ytwzvvumkpz|zyofngr~|{vptyopu}w}ot||y{rpjyZhqojpywr~yr~x||lZ^vxnbnkjvao}zuzzv{qyz}w{ubceimuz}znlmkt~}yqz{skw|s|~|xurrttvnqkhalztyzz}yw||vkq|mx|~i`gujnyq|jn|~vv{{{rhuzzy|mZekovttp}rary{wpw|opot~zqvnqqstvryw}q{{}ukzywnv~vx{sou{|qlipw{~}yugtpkw~xrtt~qwwv}ytov}{zuyhoidlroq|}wzqttsh[`v{kdphuk`v~xyvrvq|~}}|r^_eilqsjqrosw{w}yw{ryttyxqqquwstssjsljzz|~|yv}y|euzmvvxjbdr}qlrx{ho{}|}~xns}}}}rX_nosqs~vpfs|||u}zmnpy{|v{}pinrsttozwp}|mwr}lwuyslvzzxkiiqvx{~|rnyyouzxty{wv}t~zzxxrpv}|xw{fuznmntsytsowq{vkf_dw{hkjst`l}~v}qs~{sv}~}dZaiknkyppxur{uu}|yy|vmzyw~uijpw|wsvwkzwymt~}z~w}zdywpttqiffp}yoiwfqx~~yuzww~r|nZ`strlvx~gmv}|sslsxz~uyqeeowvvmtx|ouxotxqt{wm|z}wzzjdhqvxv|vow}xpxtv{}|z|vp~zxqprv|ww{ptkrtnqu|}}upxypphjifsypli{i`lz}vqyzvz}}{yte]emnkjy~~ntxwtqrxz|ytzmz{yiagu~xr{qyvo~}or|x{}|otysvqyxhiklt~hr~hkpw~{|oo~|l|~vm_fwxlop|kkqvzoyzpqxzyu|zf`et{zposxqnwzwtyt}~|~q~}w|occnwzvv}|puy~zu~tqzyv{|j|y}vjnv{uyv}q^syrpx~z~u~{xuzpv}~nglrlmrxnlzdclu~~zz}y{zplkcdlqkhry~tvw{x|}o|t~z}svqw|k`_m}uyv}whxpwwxw|~zx|qxru|pgkqqxy}nwnmorv|w}mm~vi{trphgwxlpl~lpsuz|pywqsyvx{|~xf_bo{|pqpynqv~~vxqv~z{pdakvzws|}}qwy~{}sxtxulu~|{|~yjhq|~xxv}adw}uvwy}{vuyy||n}}uigpvqjo{oxpcjpvs}{}uicihhmrilo{yz{{~t{}w|z~s|qpyi^^k|y{wwixxvvuw|}|q~qwruzqhluuvuyvirttu~|w}qkzrjxoospirwpplypuvvz|wytrtx~v|zxwtg_bly}qtpzotx~t{~tsy}|~ncbku{uuy~yt{|~x||wwvm{u{{}qghs~|wzu{chxz||vzzps}~}o{}y{ymhkvzrdtxzxfkotxp|||}~wyr]alnmrllot{{~{x}|{uwmyvi_^iw}~xyjwzwt}y}}uiuvswz}rloxzvsrcuxvt}zw~}unyiv}|rinwxnorwntynuwxv}~yrux|w}{mjfchoyuusuprx{~~wyyy}vp{{pgekrzuvxz{t{}}|w~|y|x{trw{~}phhq}zxzvxkip}zuxro~rwy}|tkjox~sfnvpfoqswt~}uztm[_pusnkpm}yv|vy{vvr{zkc`eoz|znqy~}vw|xfv}yrxz~urrv||px|cgv{vw}xz~zu{ou}u{jis~}qguvtxfnxyvx|vu{~{sbgjklqqvvs}mmvyz~~yu{|}uvo~~unkhkottsyu}ty{}}xq{v|~~yp}tvv|skimt}w{v~qrmmxwtywp}w{vzx~rkmsyumhsnhossw~}ru}w}sb[iwxnlrn{rq~~twwv~}zundbfmtzzruv}{~|z~xunz|uv{zusuy{wtxxgix|y{|zzzyn~ww|vjitsetu}rbnx{x|}yw}~v_alqoojuvw|imw{|~|v}xu~ovsgfimqsqrzvzsz|~~qsxxh|wunx|qjilsxyzx|ruwqp|{wxxsvszxuvwnkqv{|urg{|lnswv|}yptt}{~{pe^hw{nprt}lqyv~vu}w~~~~y{ncciotvysz{xz}w~}uuvvvv{|tprv}~xywzolv}}|~xuovxv|uljtxhpwrclw}|~~~{y|z}xa]kutogsv}|hmw~~}}|v{}yttpbahortmryzts}ur|zzf{rlvwifipvz{x}x{pz|vrzz~zvyi}xwpxvpmnuy|wzpqzprtxz|tpwrx|~zyqleeo{spsumlzyyz|wtyx~{|{{|pddlqurut|yu~}zx}{vtrzxz}ynkqy~x}xywptyy}}~{{oz~wxs}zpmoyunl~jhmx}~wy}}v}p``qyvhjqzkiq{vvw|~wzvc\dpuvlnvzsoz|u|~zlz|uns~ufbhrx{uw}zuny}uz~y|{{rh}{tpx{olnsx{vv}uylkuwy|wtwwmzx}qmnmkptrurtgp{u|uv}w|x{tpjejrvrmy~uxutr{{~wrrt}~|ofiuw}|w{zttyrwx|}uyz{swrorw~}ynqqllov~}x{{qxtxxmcgu}pikqphls{|tzw{{}}~m`]htwpjqtylr{|~|{y|wzutu~}ncajv{ypyzmqyzy|z}}no{y|rsxwkjpvz{rv|}}dftzz}}}yx|tmzw{ojousnlpwtuiov}ww{s}w}thhilswultxyz}uxt}}|w~}uluuhelz|z~xwwuvqw|z|xs}|xsy{qpw||~rwwoqppt~zvz|pup|~vqkir{rokp}mjnsyu}|y{|~|{qe_epwqjpp{nrx~~~}s{xxvy}}reaeqz{qtyrov~{~}~~|mxtywquz}phkt{|wqz|xbiw}}~|y|~|z|mt~|wx~vkjqyxpfpwyqmry|~~zwxz~|rzv|udbiouyunuwz~{zw{||sxjp}shelz}~xy~xzswz}~{~}or{|wsxzrrz}|y{qovvtt}{vzqr}n|ztsqnpwstnsylmquxz{{z|~xuohcgovomprwquz|}zsuw{zyyvlcbhs{xqwxpsy{z}{sxvqvqsv|tjhny}zqvymfn{|~zu|{op{w~xw|xlhny~xhiuzsosx}}yzvwy{}{s{v{ze^fqvyupvv{~|~x~|~~rzkoz|qhgnz}w{|~|wyw}|ygx{|uw{vsvyzhpyzvv~~xw}~}st~sw~ssvwrqpwuswjlqtv{~~|{}~|okkijmqnnpq}spvz~v}xpt~}wpiccjqyuswwzpty}txyvvrpqvy}|ypjjqz~vqwyokmx{yt}xn{wxyw{qijr}ugkqymswz~y}tty|~swzq`^jvzvputw}u{{{~r~vps~~sjhlt}{zy~}}{~x{~lo}|~vx}~wuw~z|lfr}|yy|}xvy~xxxw}vqu}}ujoyx|idmsuw|}|vfflqqokjqozrksx|~|r{yluthccgnsupvu~rsu{~|qu~}o{ytkpw|}yrljlsz}tsuzztpos|~|~tx~ro}vwtu|}qijr{znll~xmrx|}}xqu|~t~xz~yi`cqzwovu}sy|zw}|w{wx~yuw~wlikrx}z}z}z{{{znww|zuz~wtu{zlir~~{zyww|}z~t||{vrvyjnw}jemtwx|~~|}jcjtwtkhrq{tjqy}~}w|rpz{mcdiostovx{utw{}ztysp{smt{~|umkmrw{yuyvwxvtv~~wzylv|vxsx~yqlnu|yvqq~tqu{~zsu{yu~~}z|xnhiqxvrzx~syz}{}zvyv}}~}{z|}vnlpvyzw~|~zy~}{~~}u{tzyw|{utv}~tps|}zz{~~s{~z~wtw~{psvplpvz||z{~{}nglvzwnotutnt{|}}}}wv|zmgiosurr{yuxz}}y}~~o{}}ssy~zqmnsxzzw|y~yz{zwz|z~}ou}vzvw~ztpquz}z}yt}vsvz~|ww{vv}~~|ysooqvuv|y}tx~y~~ywz~x~}|ztootxyxx|}{wz}|y{u{y{wsty~||wuw|}z|~}~u|{{}ywx|~wxvyyrqty|{xz~yvnmtyystvuwqsy}}{||~|}|rklquurv{y}vx{}}~~|v{~yy|yqnqvzzwzyxz||z|ys~yz{x{~wstvxzy|x}zruw{~~|{|yu~~zvuutttv|xwvyz~{xz~y|{vrqtxyxw~}~{}}x{|}~{x{z|ztsw|~~|zyxy}|{}|}w{{~{xy|}~{}{v}vuuwz~xy}z{{urswyxxyt}|ttvz~y}~|~}zsoptvuu{x}zxy|~|{y~}~~yrpswzzx~}{|xz}~}~yyx{}{}xuuxyzy}z|tuwz}|}~zv~}{wwxxvuv}x}zwx|~}|yz}z|ytrtwyyx}}|||~{{~~}}}~{}|~yuux|}}}}|{{{~~}z~}{v{zxz|}}||y|yxxx{~zy}z|~|xvuvxy|}u}~wvwy}{|}|}||wtsuvww|zz~zy{~}~~}~z{|wssvyzz}z{z{~|~y}w}~}}xvwyzz{||wwy{~}{|~xy|}zxxyyxvy~x{yz|~|~}zz{~z|zutuxyzz||}}~~~}{~~}}{~}}~}~yvvy{}}}~}|}}z~}|~zw~z{yz|}|~|||zzz{}~~~zz}y~|{yxxxxz}x~yxy{~|}~||~~~~zwvvvwx{~x}{{}{}|z~zvtuxz{}|~~{{}}~~yx|~zxxyz{{|yxy|~}z{~~x{{}{xxz{zy|~x|{{|{~|zz|||}zvuwxyz}z}}|{|~~||~}{||ywxz{}~}}}~{~~~}}}xz|zz||}~|~z{{|~~~|{}~z{|zyyyyz~yzyz{~}}}{|}~}zxwxxxy~}x}||}}||~~}~}}|}ywvwxz|z}{|~}~z}|{|yxyz{|{}zy{}|{}~z{|{}yyz{{{}y}}{{|~~}|~~{z|~}||}yvwxyz}{|~}~|}{}~||~~{|}zxxyz|~}~}}~|~}~}~z~z}}{z{|}~||z{}~~}}~{~|}~{zz{z{z|zz{}}~~~~}||}}~}|yxyyyz}z|||}~{~|~}}}|}yxwxy{}~{~||~}}~~z~|||zyz{|}{~|{{}~}|}~z{}{~{yz{||~z|~|{|~~}~~|{|~}{|{yxxyz}~z~}~}}||~~|{|~|~~}|zyyz{}|~}~{}}~}}~}{z~~|{{{|}~}}{|}~}~}}~~{|}~|{{{{|z~{{|}}~~}||}}}}~{yyzz{}|z}|}~}~|}~~}|}}~}|yxyyz|{~}~|~}~~|{{~~{zz{{|~|}|}~~}|}}z}|{~{zz{|~z}}|}~~~}~~|{|~||||zyyz{~}|~~~}|}~~}|{|~~|}~|zzz{|~|~~|}|~~}}~|}~z~~|{{||~}~~|}~}}~~}}~|{|}~|{{||~~{~||}~~~~}|{|}~|~}}{zz{{}z~}}~|}|}~~}||~}~|}{zzz{|}}~~|}~~}~}|{}~|{{{|}|~}~~~~~}}~}{~|{~|{{{}{}}~~~}~~~}||}~}{~|~|{zz{}{~~~|~|}~~}||}}~|~{zz{{}}~|~|}~~}}~}}{}}{{||~}~}~}}~~}}~|{|}~||||}~{}}~~~~~~}|||~}|~~}{z{{|~{~}~~~}|}~~}|}~~}~}}{zz{|~{~~~}}}~~}~~|}|}{{{|}|~~}~~~}}~~|~~{~}|{|}|}~}~}}~~~}||}~~|}|}|{{{}|}~~|}}}}}||}~}}|~~|{{{|}~}||}}~~}}}}}|}}|{||~|~~}~~}~~}}}}|}|~}|||}{~~}~}~}~~~}||}~|~}}|{{|~||~~}|}}}}||}~}~}~}|{{|}~|~|~}}~~~}}~~}}|}|{||}|~~}}~~~}}~~|~~|~}|||}}}~~}}~~~}||}~~|}}~~}|||}~{~~~}}}}}|||}}}|~|{{|}|~||}}~}}}~~}~|}}|||}~}~}~}~~~}}}~~}|}|}||}~|~~~}}~~~}||}~~|~}~~||||~}|~~}}|}}}}|}~}}~}~}|||}|~~|}}}~}}}~~}~|}}|||}~~|}~~}~~~}}}~~}|~|}||}~|~~~}}}~~}||}~}|~|~~}||}~}|}}}}}}||}~}}~}~||||~|~}~}}}}}}}~~}|~}||}~~}|}}~~}}}}~~|}}}~}}}}|}~~}}~~}|}}~~}}~}}}|}}|~}}}}}}|}}~~}}~}|||}}}|}}}}}}}~~}~}}~}||}|}~~}~~~}}}~~}}~|}}}}~|~~}}~}}}}~~~}||~~}}}~|~}}}}}}|}}~~}}~}}|}}}}}}}}}}}}~~~}~}}~}}}}~}}~}}~}}}}~~}}}}~}}~|}~}}~}}}}~~~}}~}~}}}~|}~~}}}}}}}~~}~}~}}}}~|}~~}}}}}}}~}}}~~}}}}~}~}}}~~}}}~~}}|~~}}}~}~~}~}}}}}}}~~}}|~~}}}~}}}}}}}}}}}~~}}}~~}}}~~}}~}}}}}}}~~}~~}~}}}~}}~~}}~}}}}~~}}~|~~}}~}~~~}}}}}}~~~}}}~~~}}~}}}~}}}}}}}~~~}}}~}}}~~|}~}}}}}}}~~}~~}~~}}}}}~}}~~}}}~~}}}~~~}~~}~}~}}~}}}}~~}}~}}~}~~~|}}}}}}}}~~~~}~}~~}}~~}~~}}}}}}}}~~~}}}~~~}}~~}}~}}}}}}}~~}~~}~~~~~}~~~~}}}}}}~~~}}}}~~~~~}}}}}}}}}~~~~}~}~~}~}~~}~}}}}}}~~~~}}}~~}~~~}}~}}}}}}~~~}~}~~~~~}~~~~}}}}}}~~~~}}}}~~~~}}~}}}}}}}~~~~}~~}~~~~}~~~~}}}}}}~~~}~}~~~~~~}~}~}}}}}}~~~~}~}~~~}}~~}}}}}}~~~~~}~}~~~~~}~~~~}}}}}}~~~~~}}}~~~~~}}~}}}}}}~~~~~}~}~~~~}}}}}}}}~~~~~}~}~~~~~}~~~}}}}}}~~~~~}~}~~~~}~~~~}}}}}}~~~~~}}}~~~~~}~}~}}}}}}~~~~}}~}~~~~}}}}}}}}~~~~~~}~}~~~~}}~}}}}}~~~~~}}~~}~~~}}~}}}}}}~~~~~}~}~~~~}~}~~}}}}}}~~~~}~}~~~~~}~}~~}}}}}~~~~~}~}~~~}~~~~~}}}}}~~~~~}~}}~~~}~~~}}}}}~~~~~}}~}~~~~}}~}}}}}~~~~~~}~}~~~}}~}}}}}~~~~~~}}~~~}~~~~~}}}}~~~~~~}~}~~~~~~~}}}}}~~~~~}~~}~~~}}~}}}}}~~~~~~~}~~~}}~~}}}}}~~~~~~}~}~~~~~~~~~~~}~~~~~~}~~}~}~~~}}}}~~~~~~}~}~}~~~~~}}}}}~~~~~}~~~~~}~}~}}}}~~~~~~~~}~~}~~~~~~~~}~~~~~~}~~}~}~~~~}}}~~~~~~~}~}~~~~}}}}~~~~~~~~~~~~}}~~}}}~~~~~~~~}~~~~~~~~~~~~~~~~}~~}~}~~~~~}}~~~~~~~}~}~~~~~}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~}~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m39.bin b/applications/SprPoP/assets/packed/MUS/m39.bin deleted file mode 100644 index cdd7951..0000000 --- a/applications/SprPoP/assets/packed/MUS/m39.bin +++ /dev/null @@ -1 +0,0 @@ -~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzz{{{{{{|||||}}}}}~~~~~~~~~}}}}||||{{{{zzzzzyyyyyxxxxxwwwwwwwwwwwwvvvvvvvvwwwwwwwwwwwwwxxxxxyyyyyzzzzz{{{{|||}}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxwwwwwvvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{|||}}}}~~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwwvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{||||}}}~~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwvvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{||||}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxwwwwwwvvvvvvvvvvvuuuuuuuuuvvvvvvvvvvwwwwwwxxxxxyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{zzzzyyyyxxxxxwwwwwwvvvvvvvvvvuuuuuuuuuvvvvvvvvvvvwwwwwwxxxxyyyyzzzz{{{{|||}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxxwwwwwwvvvvvvvvvvvuuuuuuuuvvvvvvvvvvwwwwwwwxxxxxyyyyzzz{{{{|||}}}~~~~~~~}}}||||{{{zzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxxyyyyzzzz{{{{|||}}}}~~~~~~}}}}|||{{{{zzzzyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwxxxxxyyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxyyyyyzzzz{{{{||||}}}~~~~~~}}}||||{{{zzzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxyyyyyzzzz{{{{||||}}}~~~~~~}}}|||{{{{zzzzzyyyyyxxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxxxyyyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxwwwwwwwwvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxxyyyyyyzzzz{{{{||||}}}~~~~~~~}}}|||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxxyyyyyzzzzz{{{{||||}}}~~~~~}}}||||{{{{zzzzzyyyyyyyxxxxxxxwwwwwwwwwvvvvvvvvvvvvwwwwwwwwwxxxxxxxyyyyyyzzzzzz{{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyxxxxxxxwwwwwwwwwvvvvvvvvvvvvwwwwwwwwwxxxxxxxyyyyyyzzzzzz{{{{|||}}}~~~~~~}}|||{{{{zzzzzyyyyyyyyyxxxxxxxxwwwwwwwwvvvvvvvvvvwwwwwwwwxxxxxxxxyyyyyyyyzzzzzz{{{{|||}}}~~~~~}}}|||{{{{zzzzzzzyyyyyyyyxxxxxxxxwwwwwwwwwwvvvvvwwwwwwwwwxxxxxxxxyyyyyyyyyzzzzzz{{{{||||}}}~~~~~}}}|||{{{{zzzzzzyyyyyyyyyxxxxxxxxwwwwwwwwwvvvvvvwwwwwwwwwxxxxxxxxyyyyyyyyzzzzzzz{{{{|||}}}~~~~~}}|||{{{{zzzzzzyyyyyyyyyyyyyyxxxxxxxwwwwwwwwvvwwwwwwwwwxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{{{|||}}~~~~}}}|||{{{zzzzzzzzyyyyyyyyyyyyyxxxxxxxwwwwwwwwwwwwwwwwwwxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{{{|||}}~~~~}}}|||{{{zzzzzzzzyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzz{{{||}}~~~~}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{||}}~~~~}}||{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwxxxxxxyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{|||}}~~}}|{{{zzzyyyyyyyyyyyyyyyzzzzzzzzzzyyyyxxxxwwwwwwwwwwxxxxyyyyzzzzzzzzzzzyyyyyyyyyyyyyyzzz{{{||}~~~}}||{{zzzyyyyyyyyyyyyyyzzzzzzzzzzzzyyyyxxxxwwwwwwwwwxxxyyyyzzzzzzzzzzzzzzyyyyyyyyyyyyzzzz{{||}~~~}}||{{zzzzyyyyyyyyyyyyyzzzzzzzzzzzzyyyyxxxxwwwwwwwwwxxxxyyyyz{{{{{{{zzzzzyyyyyyxxxxxyyyyyzz{{|}~~~}}|{{zzyyyyyyxxxyyyyyyyzzzz{{{{{{{{{zzzyyyxxxxwwwwwxxxyyyzzz{{{{{{{{{{zzzzyyyyyyyyyyyyyyyzz{{||}~~}}|{{zzyyyyyyxxxyyyyyyyzzzz{{{{{{{{{zzzyyyxxxwwwwwwxxxyyyzzz{{{{{{{{{{zzzzyyyyyyyyyyyyyyyzzz{||}~~}|{{zyyyxxxxxxxxxxxxyyyzzz{{{||||||||{{{zzyyxxwwwwwxxyyzz{{{|||||||||{{zzzyyyyxxxxxxxxxxxyyzz{{|}~~}||{zzyyyxxxxxxxxxxyyyyzzz{{{||||||||{{{zzyyxxxwwwxxxyyzz{{||||||||||{{{zzyyyyxxxxxxxxxxyyyzz{|}}~~}|{{zyyyxxxxxxxxxxxyyyzzz{{{|||||||||{{zzyyyxxxwwwxxxyyzz{{|||||||||{{{zzzyyyyxxxxxxxxxxxxyyz{{|~~}|{zyyxxxxxxxxxxxxxxyyyzz{{||}}}~~~~}}||{{zyyxxxxxxxyzz{||}}}~~~~}}}||{{zzyyyxxxxxxxxxxxxxyyzz{|}~~}|{zzyyxxxxxxxxxxxxxyyyzz{{||}}}~~~~}}||{{zyyxxxxxxxyzz{||}}}~~~~}}}||{{zzyyyxxxxxxxxxxxxxyyz{{|}~}{zyyxxxxxxxxxxxxxxxxyyz{{|}}~~}}|{zyyxxxxxyyz{|}~~~}}|{{zyyxxxxxxxxxxxxxxxxyz{|}~~}|{zyyxxxxxxxxxxxxxxxyyzz{|}}~~~~}|{zzyxxxxxyyz{|}}~~~}||{zzyyxxxxxxxxxxxxxxxyyz{|~~|{zzyxxxxxxxxxxxxxxxyyyz{{|}}~~~}|{zyyxxxxxyyz{|}~~~~}|{{zzyyxxxxxxxxxxxxxxxyzz{}~~~~~~~~~~~~~}|{zyxxxxxxxxxxxxxxxxxyyz{|}~~}|{zyxxxxyyz{|~~}|{zzyxxxxxxxxxxxxxxxxxyz{|}~~~~~~~~~~~~~|{zyxxxxxxxxxxxxxxxxxyyz{|}~~~}{zyyxxxxyz{|}~~}|{zzyyxxxxxxxxxxxxxxxxyz{|}~~~~~~~~~~~~~|{zyxxxxxxxxxxxxxxxxxyyz{|}~|{zyxxxyz{|~~}{zyyxxxxxxyyyyyyxxxxxxyz|}~}||||||}~~~}}|||||}}~}{zyxxxxxyyyyyyyxxxxxxyz{|}~}|{zyxxxyz{}~~}|{zyyxxxxxyyyyyyyxxxxxyz{|~~}}|||||}}~~}||||||}~~~|{yyxxxxxyyyyyyyxxxxxyyz{|~~|{zyxxxyz{}~~|{zyyxxxxxyyyyyyyxxxxxyy{|~~~}|||||}}~~~~}|{{zzzz{{|}~}|zyxxxxyyzzzzzzyyxxxxyyz{}~}|zyxxxy{|~~}{zyyxxxyyyzzzzzzyyyxxxyz|~~}|{{{zz{{{|}~~}|{{{zz{{{|}~}|zyxxxyyyzzzzzzyyyxxxyyz{}~~|{yxxxyz|~~}|zyyxxxyyyzzzzzzyyyxxxyz|}~}||{{zz{{{|}~}|{{{zz{{{|}~~|{yyxxxyyzzzzzzzyyxxxyyz{|~~}{zyxxyz{}~~}{zyxxxyyz{{|||{{zzyxxxyz|~~}|{zzyyyyzz{|}~|{zzyyyyyzz{|}}{zyxxyyz{{||||{zzyyxxyyz|}}{zyxxy{}~|{yyxxxyzz{{|||{{zzyxxxy{}~|{{zzyyyyzz{|~~|{zzyyyyyzz{|}}{yyxxyyz{{|||{{zzyyxxyyz|}}{zyxxy{}~|{zyxxxyzz{{|||{{zzyxxxy{|~}|{zzyyyyzz{|}~}{zzyyyyyzz{{|~}{yxxyyz{|}}~}}}|{zyyxxyz{}~|zyxxy{}}{zyxxyyz{|}}}}}}|{zyxxyz|~}|{zyyyyyyyyz{|~}{zyyyyxyyyyz{|~}{yxxyyz{|}}~}}}|{zyyxxyz|}~|zyxxy{}~}{zyxxyzz{|}}}}}||{zyxxyz|~}{zzyyyyyyyyz{|~~|{zyyyxxyyyyz{}~|zyxxyz{||}}~}}||{zyxxyy{|~}{zxxyz|~~|zyxxxyz|}~~~}{zyxxy{}}{zyyxxxxxxxyy{|~~|{yyxxxxxxxyyz{}}{yxxyz{}~~~}|{zyxxyz|~|zyxyz|~~|{yxxyyz|}~~~~}|zyxxyz|}|zyyxxxxxxxyyz|~~|{zyxxxxxxxyyz{}}{yxxyz{}~~~}|{zyxxyz|~|zyxyz|~~|zyxxyyz|}~~~~}{zyxxyz}}{zyyxxxxxxxyy{|~~|{zyxxxxxxxyyz{}}zyxyz{}~~}|zyxxyz|~}{yxyz|}{yxxyz{}~~}|zyxyz|~~~}{zyxxxxxxxxxyy{|~|zyxxxxxxxxxxyz|}~~~{yxxyz|~~|{yyxyz{}~|zxxy{~~|zyxxy{|}~|{yxxy{~~~~~|zyyxxxxxxxxxyz{~}{yyxxxxxxxxxyy{|~~~~}zyxyz{}~~}|zyxxyz|~}{yxyz|}{yxxyz{|~}|zyxxy{~~}}}}~}{zyxxxyyyyxxxyy{}~|zyxxxyyyyxxxxyz|~~}}}}~~|zxxyz|~~}{yxxyz|~{yxyz}}{yxxyz|}}{zyxy{~~}}}}~}{zyxxxyyyyxxxxy{}|zyxxxyyyyxxxxyz|~~~}}}}~}zyxyz|~}{zyxyz|~|zxxz|~{zyxyz{}}|zyxy{}~}}}}~}{zyxxxxyyyxxxxyz||zyxxxxyyyxxxxyz|~~}}}}~}zyxyz|~~}{zyxyz|~|zxxz}~{yxxyz|~~|zyxy{~~||{{||}|zyxxxyyyyyyyxxyz|}{yxxxyyyyyyyxxyz{~~}||{||}~|yxxz{~}{zyxyz}~{yxy{~}zyxyz{}}{zxxz|~}||{||}~}{zyxxyyyyyyyxxxy{~~|zyxxyyyyyyyxxxy{}}|||||}~}zyxy{}~|zyxyz||yxyz}}{yxxy{}~|zyxy{}||{||}~~|zyxxyyyzzzzyxxyz|~{yxxyyzzzzzyyxxyz|}|{{zz{{|~}zxxz|~}{yxxz||yxy{~}{yxyz|~}zyxy|}|{zzz{|}~}{yxxyyzzzzzzyxxyz}~{yxxyyzzzzzyyxxyz|}|{{zz{{|~}zxxz|~}{yxxz||zxy{~~{yxxz{~}{yxy{~}|{zzz{{|~~{yxxxyzzzzzzyxxyz||zxxyyzzzzzzyxxyz|~~|{{zzz{|}~{yxy{}~{zxxy{~}{yxz}|zxxy{}}zyxz|}{zzzyzz{|~|zyxxyz{{{{{zyxxyz}}zyxyyz{{{{{zyxxyz|~|{zzzzz{|}|zxyz|}{yxxz|}zxy{~~|yxxz|~~|zxxz}}{zzzzzz{}~~|zyxyyz{{{{{zyxxy{}|zyxyyz{{{{{zyxxyz|~|{zzzzz{|}|zxyz}}{yxxz|}zxyz}|yxxz{~|zxxz}}{zzzyzz{|~|zyxxyz{{{{{zyyxyz}}zyxxyz{{|||{zyxxy{~}|zzyyyyz{|~}zxyz}|zyxy{~{yxz}|zxxy|~}{yxy|~|{zyyyyyz{}|zyxyzz{||||{zyxxz|}zxxyz{|||||{zyxxy{~}|zzyyyyz{|~}zxyz}~|zxxy|~zyxz}|zxxz|~}zyxz}~|zzyyyyzz|}~{yxxyz{|||||{zyxyz}|yxxyz{||||{zyyxyz|}{zyyyyyz{||yxy{~}{yxyz}|yxy|~{yxy{~|zxy{~|zyyyxyyyz|~|zyxyz{|}}}}|{zyxy{~|zxxyz|}}~}}|{yxxy{~}{zyyxxyyz{}}zxy{~|zxxz|~zxy{~{yxy{}}zxxz~|zyyyxxyyz{}}zyxyz{|}}}}|{zyxyz~}zxxyz|}}~}}|{zyxy{}}{zyxxxxyy{}}zyy{~|zxxy|~{yy|~{yxy{~}zxxz}|zyxwwwxxy{||{zz{||}}||{yxvuvx{|zyyz|~~}{{{||zxvuuuuuvwxz~}|}}zwutuw{|{}}|{{|}~~|zz|~~zwuvy}~{yvuuuvwxyz{~|{{{||||{zywusrrtw{}{z{}~|{|}}zwtsrrrsttvxz}~|xusrrux|}{|~~|zzyz{}~||}~zvttvy}|zwvvvwxyz{|~}{zzz{{{zzxwutrrsuy~}||}~|{z{}~zxussrsstuvxz}}zwtrrsvz~{z{}~|{zzz{|~}}~|xussvz~|zxwwwxyz{|}~{yyyyzzzzyxwvtsrtv{~}}~}zyyy|~}zwutsstuvvxy{~~}zwtsstx|}yxy|}|zyyz{}~{wtrsuz~}{yxxyz{||}~}zxwwxyyzzyxwvutstw{~~~|yxwxz|}{xvtttuvwxyz|~~~}{xutsux||xwwz}~|{zz{|~~~{wtrruy~}{zzz{|}}~|xvvvwxxyyyyxwvutux|~}zxvvvx{~}{xvuuuvwxyz|}}}~}{yvuuvz~zwuvz}}|{zz{}~~zwsrsv{}|{{{|}~~~}yvuuuwxyyzzzyxwvvwz~{xvuuvx{~}zxwvvwxyz{|}}{|~}{ywvvy}|wuuwz~}|{{|}~|xussuy~~}||}}~~~~~yvtttvwxyz{{zzxxwxz~~}{xvttuwz}|zxxxxyz{||}}zz|~}zxwwy}|wtsuy}~}}|}~~~|yvtsuy~~}}}~~~~~~}yvtstvwyz{|||{zyyy{~~}zxutstvz}}{yyyyz{|}}~{yy{}~|zxy{~{vssuy}~}}~~}}}zvttv{~~~~~~~~}}~{wtsstvxy{|}}}||{z{}~}}~~|ywusstvz~~|{zz{||}}~~zwwy|~}{zz|{vssuy}~~||~~{xvuw{~~~~~~}}||}|xtsrtvxz|}~~~~}}||}~||}~}{ywusrsvz~~}||||}}~~~~zvvwz}~|{||xtrtx}~|{|~~{xvwz~~~~}}||{{|~}yvsrsuxz|~~}}~|{|}~~}|zxvtssux|}||}}~~~~~~{wuux{~}|}~}~{vssvz}{z{}~{xwy}~}}}||{{zzz||xussuwy{}~}}~{{{||}~~}}|zxvtstvy}~}}}~~~~}}}~zvtux{~}}~}|||~~{wttv{|yxy{}~|zyz~~}}|||{zyxxy{}}yvttuwy{~}}~{yyz{|}~~}|{ywvttvx|~}}}~~~}}||}~zvttwz~~}~|{zz{|~|xutvz{xvwz}|{{~~||||{zywvvwy}}zwutuwz}~~~}ywwxz|}~~}|{zxvuuvy~~}~~}}|||||}~zvttw{~}~|zyyz{|~}yvuw{}xuuwz}~||~||||{zxvuuvwz}}zwuuvy|~}~~yvuvx{|}}}}|{zxvuux|~}}||||||{z{}}xtsuy}~}~|zyyyz{}|wuvz~yutvy|~~|}~}||{zywuttuvx{~|xuuvz~~||~~yutvx{|}}~~~}|zwvvx}~}|||}}|zyxxz~~ytsuy}}}}zyxxyyy{~}xvw{}xutux{}~|}}|{yxvuutuuvwz}|xvvx|}||~}xutvxz{}~~|zxwx{~}|||}}|zxvuwz~}yutvy}}{|~|zyyxxxy|}yxz~|xvuuwz~}|~}zxvuuuuuuuuw{{xwy|~}|}{wuuvxy{~}{zzz{}}|{|}}|zwutuwz~~zwuvy|}|}~|{zyxwx{}~|{|}yvttvz~}~{xuuuuuvuttuw{}{{{}~~}|}}yvuuvy|~}}}}}}}~}|||}|zwuttuwz}}xuuw{~|}~~|zxwxy{}~~}~|xtsvz~~|}zvttuvvvutsuxz}~}}}~~|zz||xutuy|~}||~~}|{zwvuttuvxz}{vtuy~}||}~{xxyz{{|~~|}~}}zutvy|~{z}{vttuvwvuttvwy{}}||}|xwx||vttwz|}}~~~|{|~}{xvuttuvvvwz~yutw}}zxx{~}zz{{{z{|}{|}{{}}ywwwxz|}z{~~yvuuvwvutuvwwwy||z{}~xutw{{wuvxyz{}~~{z|{wuttuuvwvuvzzwvz|wuvy~}}||zyyz||z|~{yy{}~{ywvvx|}||}zwvwvuttvwwvuvy}~zz|yuttw}{yxwwwy{}|z{~{vtttuvwwutuy}~{z{}}wttv{}{yyz|~{|~~zyyz}}yutvy}~}}}{yxvttuwwvutuw||{|~}~}yvttw{~zvuuwz~}|}}|}{vtttvwxvttwz|}~}~|wttuz}zyyz~~}|||yyy{}yuttx~}||~~|xutuxxwuttux~~~}{z|{ywuuxz}zuttv{}zy|~yvutvwwvttvxyyz}}}~{xuuwz}~{zyz~|yz}zyyz}}xutv|{wx|{vtvxxvutttw|~zxz}~{zxwwxxxz~xutuy}zxz~}zwvwxwutuxxwvwz~{z{}zxwwxyz~}|{|~yy}~|{{|~~}}{xvw|zuux|}xxyywutttuy}zxz}}|{zzzywuw}|xuvz~~zyz}}zyyywttwyxvtuwz}yy}~{zzxvv{~}|z{~}|}~~|{~|zz|}|vttw}|{{zwttttvz}~}zz|~~|||||}{xtty}yx{}~|z{|}~}|{wttxyxvttuw|{yz~{vtw}~}}~|z}~~}~zvttw}}yutttuy}}}~~~}}}~~{z{{|}~{vtwz}~~~~}}~~~~~|}~}}~~}~zvuwyyvtsttx~|}|{}{utx|~~}~~~~z{}|{||yvuw{yvtttx|}}}}{{~~}}zwxz{|{wwyzyy|~}|{{~~~}|yx{{wxyzxuttsuy{xz|wwyzz{}~~|yx|~{}~~|xx|}zxyz{{~|xvtuy}}}}{yx{~|wuvxy||y{|zwuw{{xx{~~~|wuwz~{{|{xtstsuz~|ww{{{{zwvx|~}vtw{}~|}}xwz}||zxvz|yvw{}}}}zww{|utuvx|{{}~{vtuw{{ww{~}{utuw{{wttttw|}}~yx{~zvtvy|}vtux}|{|}~yx{~~}{vty~{y|~}}}{xwx|}}zuttux}|{~~zuttuz{xx|~|{}xtttu{zvtttv{}|}~}|||}}yttuw}~{wutw}}{{|}~{|}zy{ytw{~~}}{xvx|~{z|yvttv{}}zz~|wutsv~|{}|yxzyvuttx}~yvutw|}|}}{y{}}~|~|wuttz~~|xtuz~|||}yvx}|xy{{{|~zwvx||xwz}zwuwz|{x{|xwvtw}{wvyyxwuux{}}}{ywuy}}|}|xwz}|yx|}zwuu{~~{xxz|}}~}|{yvw}}}~|yvw|~yvwz}yvvz}yxz{zww|{yywvz}}{vvz}zzxvwz{zx{~|yy}~|}}zwvz{uuy{~~}zwx|}~|||zxx~}{xx|~yttx{zwx|}xvvz~}|}|yuu{}zzzxx}}|}~ywz}~{zzyxy{{xux||}}}yvvy~~{|~utuwz~{|~}|~|wty|{}}}~~wttvy}yy|}yvvy}~|vty}}|yyzyz~}|}|{}{{}}}zyzzy{}}ztuz~~zvvx|}yx{|wutu{}}}{{~}uu{}|~|z|}xvttz|}{wuw{}}~~{~|vwz|{xwyyy}~~|xw{}|}zwxzyz~}xtw{}}|~}yvvz}zww{~{wtuz~{xx{}~xy{|||~}|xvy|}{yvtz{wvx|}|}~zx|~~yz|{yvvxxy|wux}|wuwxx{~yvy{{zxz~yvw{}xvvz|wwz|}{}|wux}~}~}{xwz|utwy{~|yx|}}{xwz}}|}|vvz{}~~{wtuwwz{wux~~{ttvwx|}xy||zvux{}yxz}{vuw{|||{yw|{wvy~}~~~{utx{~ztuuvz~{}|||z{~~|}}wuwxy~zutuuw~~yww{}zz~xtuuuy~~yy}~|wtuwx}~{{~}wuvz~~~~~ytw~zwy}{yz~~ytuvxxvutv}~|}|{}}}}}}wtvvvz~wuutu|zxy||wvy|wvttx}}yz~}xttuuy~~~xvw{}}}~z}|uv|~~}{|~zvw{~|xvtu}|zwtv{~~~~zwx~~~|vtvuuzzxvtv|~}}yx{~{vux~|yuuy|}zw{}xuuutz~xwy}}|}~zx{~}wy||{z|~xuv{~{ytv}}yvy{|{y~xuv}ytuvtv|}}}{xuz}|}~zyz~yuux~|wx{|{ww}|wvvtu{~}yy{~}|~|vvy{}}~}{wvz}~yvv{|xy}}|z||{wv}zvv{yuvutw{}}z{{y}}{|~|yy{zwvy}}||}|yuv|{xxwuw|}||{~~}~{uuwxz|vtvy{|yx{}}|}||~|wty~yx{}zz}}xwvuw{}|xx~~}|}{wwy{xwz}||~{utz}}zwxxvw|}{}~}~~|vuvvw|{utuv{|{}~|||~}}}||{uv{}~||~||~zvw||zyvvz||yuy~~|xvw{}yxz}~||}{y}zuw{|{wwxxw{}|}|yz}yuuvuw||wvtt{}|}yx|~{xx||wy{{zxz}~zuuz}{xx{|{wuz~~|~|wuw|{yy|}}|wuy}}xz|{yuvwww}}}}{wwzyuvvuw||}|yuuz~|vux{}|wuy~{}}{wuwz{{wvz~}z|}}zuv{}}{z|}xvx}|xwy}~~zutwy|}~}zvtuvvz~~}yvvzxwwuuy|}{y}|xy|}~zttvx{|wvz~zutvwz{yy|}~~}wuy|}zwx{||xx||xvx{}wtuuv|~yttuuw~{wvx}~|}|yxvvx||zwy~}~|}~~~vtutw}|yz}{z|}wttuv}||~}|~~~ywz}|zvwyz}}{~}xuvz~}wtuttx|vuttv}~|xvx||yy}|{xwz||zvx~}}}zz|yvutuz~~~yvx~zvutu|}}|yzzy|}|xuvwx|~xuw{~~|wuuttx|~~ywutx}~~{xx{}zww|}zz|}|wuy}~|}~{ww{zyvtvz}}|~xuw}{yvtw}}xux{~{}~~zvuvvw}}xwy|}}~yvvvtvy{{y||yvvz}}~}zxz}}xvw{}}~{vw{}}{z|~{vvz~|{xwxz{yx}zwx|~|ywz}}~~wsuwz{wvvvw~{y{}}}~|wvvvuwzzyvy~zy}}|}~{yx{~}xvw{~|wx{}|ywy{}ywy~~|}~}{z{|zwuy{z|}~}{}~}|~~|}{uttuz~ywvvw|}}~~|}|wuvvvx{{yuu{}}}}{xxz~~zwwz}}yx|}|yvwxy~{z}|yy}~|}~}ytu{~~}}}}}|zy{yvutuz}zxwvz}}ytuuuvz{{wsv{~~~~|xwx||xwy|}}~}{~z|~~{wvwwyzww{~~xtwz||{}~}|yx|~{xwz{ywuuy|~}|zxx|}}}wttuuw{|zvtwz{zz||xvx|~{xxz}}}}|yx{}}~{wvvvx~{wvzzwyzzywy|{vux{~|wvy~~~}|ywxzzzy|~|z{}{|}vtttux{|yuvyzywvy||xwy}|yxy|~~}}zuvxz~zwvvvz|xx{~~zz|{yvuwz|zttvx||xx{~|{}~|zz{{yvv|~}~{z|{vuttvz{zvuy{zwtuwz|yy||ywx{~~~}{vtuvy~}yxwwy~}{|}}~|}~}|~~{vttvx~wtttw}{z{}zxz~~}}~}zvtx}~{y{~ywutvyzyvvy{zwttuv{}|~|xvx{~~~~{usttv{{zxwz}}~|y{}~~|wtttv|{wutuz}~~ywx|~|vux{}}~~zz|~~|zwvwyywtvz{zvtttuz}xvx|~~~~yutttvz~}|zz}~~}{wvxz||xutsv|}zwuwz|||~xwx|{wwyzyxz~}{{~~||~|yyzzxutx{{xuttsu{}xxz|}~~|wttttvz||{~~|}~|}zutvx{}ywvtw|~}zxyzyxx~zxy|~}~}z{{zwuvz}~|||z{}|}{xttxzzxutttv{~{z{}}}}{wuuttwyzyw{~}{{|vstux}|zxwy|}~~|||yvuy~{{|}}~|{|}~~|}~|xutux|}{{~{vtwzzwututvz}}~~~~}}}{vtuttvyyxuw|~{{}{vttux}}~|{yz}~}}~}}}xtuz~~~~}}}{xy{|~~~|xtttv||{|{vwyzxutttuy|}}}}}}~}|xttutvxzyutw|~}{|~|xvtux{|{{~}||~}}|zz~yuvy{{{}~}|xvwyz}~~yvttu{|{}~}yz{zwutttvz}}}}|z{~|wttttvyzxutwz||{}|}~|}}ywvxzyxy~~~}~~{xx||yyzyxwy|{vtuvx|~~zxvtv{~}||~~}}}zwtsttw|~}}|zxy}|vtttuwyywtuxzyxx{}~}|}|zzzyvux~~~~~~zxx|}}}{xuuwz~ytttux}~}}{ywwz}}|z{|~~zvtttv{}~}}{xxz~zutttvyyxuuwyywvwy|}{|~}zwtuz}~}}}~~}yxz}}|~{vttvy}wtttvz}}||~|{zy|~}}~{yyz|}xvutvz}}}}{xxy}~}}}xvutvxywtuxyxvtuvy~~|}~xtuy{{zz|}~~{z{}{z{~~xuttv}ywutuy{{yz~}|{|~}}|{~zxyy{~zxvuw{}}}}zxx{}|z{~{yvvwyxvtvyyxuttuw}~}~~zvwyyxxyz|}}~}yxy~zwutw}{yvvwyyxwz~}}}~|yy|}yxxy{~|zwwz}}}}|yyz}}zyz}~{xxyxvttwyywtttux~|{}}{{{ywvwy{~}~~|xvx||yvtvz|~|zxxxvtswz||zz{{}~{{}|wvuuw{|}|~~~}zyz|{xuvx|~~|}}|zwx{}}zxwvvx|~~~|xsqqrsx~~|}}~|zyx{~}{ywvvvtrrv{~}yyz|{z}}yyyz|~~|zxusrtwxvtvy}}wuwwvspnnnpuxy|~~{zz{}|{|{xtqqruz}{{{{{{zwwyz|~~}z{~}|||||xutvxxx{}{|~||{{}~}}|zy{~}ytpqstsrrstv{|xtstux|}{z{|xvvwxxzzyy|~~|ywutuz~xttttsqqstw}}zxwxxwttw{~~~|ywxyyxxwutwz}~{}~~}{zzy{~~}{yy|~{|}~yurruxy{||{|~|}}||}}|}~}~~}yusuvvuuwy|zvvx|}|{{}~~|~|wuuwvtrtvyz||{z{~~{vsqpprvwwwwvvx}}||}~~|z|}zwutvz|~|wrqqsvz}~~}|{}~~~~{yyz|}{{|{xttvz}}}{z{{~|z{}~|{||yyz|~{{zwspopqtz}~|xvutvxyyy{||}}|{yuqprtx}zvtuxxx{|xspooqvz}|wuvxxxwxz||{|}|{zvrooprv{|zzz}}zyz||zz}~|||}}zxwuuw{~~{zyz{~}}|~~}{||{wtrrsw}~}|{zyxvwy{}|}~{vttuwxyyvtsuwz~|yvuvyyxxvtstwzzz||z{~~}||||~}|{z{{vsqqrtvvux}{yz|~}}}~|zz}~~~zyyzzzzzxx{}{zy{~{{}|zyxxz|}}|}~zwtstwz{|}|{|~~|{{{ywuvy|}~~}}~~zurqqrtwyy{~yusux|zwtsuwxxyzz{}|z{}}}}{xvuuvz}ytqpooqsttux~}|}~|ywwz|~~~~~{wuvxxwx{~}|{|}}|zz|~~~~~~{yxvwy|}~zuqpqsv{~~|{zyxxurppqsvy{{{}~{ywutuwwvtvy|~{yyy{~}{|~~~~~|zxwvurpqtwyzz|~~}||zyyz{}~|}}||~~~}{wsqrtw}~}|yxyyz{|{ywy|}~}~~}}~~}{zxxz~}}{xxzzyxxy{||}{xvuuuvvurruz}~}{zyyyxwwy}}{ywutvz}}|~|zyyz|}zxwx{~{wtrrrssrporvxz{}~{zz{{{{zxvxz|}xutux{}~}{z|}~~{y{|||{||}|{}~~}||~}|{|~|wtrqrsttux~}xspopqstuuuwz}~~yxxyxuttwyyzzzy{~}{yy|}{|~|xtsttsqqsuyysrrtw{~~}}}}~{z|~}yvtsssuvxy{~~}zyxxz||{xwy{{yxwx{|zz{|{{|~|z{}~{xwwx{~{wvvwwxyxvttuvvuvxz}|wrppru{{xwxxwvwy|~}|||}|zxx|~~~}{yxwvurpprssrrsux}}}~}zvsqrsux|~~|{zxxxvttuwz~~|}~~|ywwx{|yxy{}~|}~}}~}|zxwusppsuxz|}~|xusrsttrprvyzyxyz~{xvvwxxyxurqsv{~{yz|~~|{zwtrpppsx}|xtrrtvwwy}~|||||}}{xvuvwxxvsruy|}~~}}}}}|zxyz{zyxwwvw{|yy{}zyyyy{~}{{}}xusstwyywuvxyxusrtw{zwutssttuy{wuvxz{{{yy{}~~{yyz{{{{{|}ytqrttsqoorvz}|wrppqtvvuvz~}wrpqrsuxz{}}|{yx{~|||{yx{~~}||}zussuusqqtx|~}||{xutssttstvxx{~}|||{yusrqpqrvy{{}~}zxwwz}~}{}|wtssuxyxz||}~~zvrpquxyy{}~~{wsstvwwxyxvuuvvwwxz|~~~{z{||ywvwy|~||}~~}ywvwy{{yxz}}}~~~{yxvutttuwyyxxwvtuw|~|z{zxspqty}~~}{yyyvrrsvz}|}~{xvwx{}}{wtqpqrsux{||{{~|yxwtssssrstvy{||}~|ytrsuusqrw}}{|~~}}~~~zyz{yyz}}ywxzz{}~|{ywussrqsy~{xxyxurpqty~~zvrpqsttsqquz~~~}~~}|{xwxz{|}~~}{yy{|||yvvy|~~~zvtsssttuz}xspqsvyxuux{zwtrsvz}~{{~|yyyxx{|xx{}yyyyyyyyyxwxz|}}|{{~|vqpsuwxvuvy|}}||}~~~~~{zzyvsqrvz~}wssrqrsux{|~}}|zxx|~~{urqsx{{yyzzyz|~{yyz{{wropsvvtsuy{~~~~}yvusrsstvz|~}}~zy|~~}{wuv{|zwuw{{yxz~|wtttwzzxz|}|~~}zyxvtux{}||yxwutuvtqqrtwzz{|}~~~|xwy{zwwy}}|{{zyxz{zy{~|vsqqtwy|}{yvsrrrtvwwxyxvtux}}~}{||z{~~}z|~~}{zyz}}zyz}~}zvuy{zwvxz|~|zurqqsuvx|}{y|~||~{vsqsz}zutvwurppu|}{z{~{z}}zz~{zzz{|zwv{}|yxy~~}~~{yvssrrstsrw~}~{xyzwrppry~|zz{}~{|~}||{z|}~~|ywwxwwz|}}|xwy{}~}yvy|}}}~~~}~{|~|{z|~~|}~}|}~|wrtwwtrpquz}}{~}xwxxvx~}{z|~{vw{|{z{z|}xvwy||zy|~~{tppruwwttwz{|||}~~|zz}~||~|{~{wwy|~~~}||{xwxyvtw}}~|tpprw|}|}}||}}~}~~z{~}~~~{zzz}~|}~~{xxwtrrrswz{|}~~~{xy||{{}}{yz||yy{{yyz{}}~~}xrppqvz{z|}}~{{zvrruy~|}zvttw{|{~}~|}}||{wvy{wtuy|}}||}}zy||zxz}~~~|zy||{~~}~~}}{wwxvrpqt{~~~~{z~}~~yx|}|~~}|{|~}zz||wrrsw~|||yw{~~|xsrpquvuw~}{z{|z{~~~}{}}}~~~}yyyyzzxx}}|zvuy|{{~||~{|}xxxy|}{x{~{zz~yuwyxx{~|z}~}~~}xx{zvqppsz~~~{xz{~}}{}}}~~|wx}~|xwtv|~~|wstwy}~{xz~~~~~}|~|~{yxy~~}wppqsy}{x|~~|}|{}xwywtv||zz|}wy|}zyzz~~~|~~|{||}zvvz~}}wwzyxxyy}}|~~|~{y|zz{|}wvwuqprtz}}zw{}~}~{trqrx||z}|{|}|{~|y|~|~}{~~|~~wtrquyyx|~{{{|~~z{|~}}~}zxy||y{~~|{|||yusvzyvw{|}|~~}}}|}|{|zuqrtx}{~}~yxvv{~~~~~~}}~}|~ytstv}~}xxwwy{yw{|{~||{|{wuv|}~|vuutvyzxz|yz{~~~~{vsvzwuw{||}zy|{}~~ywwz~~~~{}~z||z|}~}|~~yvz}{vttsy~|}}|}yxx{~}~}yz}~yz}}yutrv|~~zx{~}{|zsqsrtwwssy}}{z{}~|{}}~~{vx~}|wwwy}~yv{}{zy~{y{|xw{~}{z~|~|yyy|~|x{}~|yy{xtvz|||zvxz}~~~zuxzyutsswzz}~||zvwwz~}}{z~}{~}zwxwx}}~}{}|}}vuuv|~|x|zvwy}||{y~~|~~vrqqtxwrsxzzz}~zzz|~~{}~~}zy{}ytuz}}y|}~{wvwx}z|}~~}z{}wuy}~|wwxz~~~xvxx|~y|}{xz}~{~|{y|~zy|zuqqqrwxxyxy~}yxz|{{~|wwtuxzxx}~|~}yy}~yx{}{{y|}}|wwutwywtx{zwx{~|{}{}}{y|~|}|yyy}|vsvytpquwy}|{~~~yy~~~}{y|~}z}{wvtx~}}{vwuvyzyx~{zz{zz~~ztsrt{{zzwuy{|{{~}~{{{{{~~~{{{|}|xrqonqsqov~}}~~yvxx|||{zyz}|}yz}}~y{~}xutrv|}{z~}ywzyutwyxyxuy|||z}~|~zx~~}wxxy}{tvyxrnmkpuw|}||~z}}zvwwx||{}zyyy}|x|~|zxz{usv{}}~yx{}|tsrruwtorxzz{~}xyx{}~}|{z}|ywxxz~||{vrsuqmov{}}z|}}yx|}xw{zxyz~{|{|{{|tsqrvxurw{|{}}z|{wrrqqvvvxwx|~~~~~zwyy~|}~~|xx~ywx|{{ypmmkpuwtw}|{~|uussy|{w{~}yy|~|}|{yz~~zy}|wqqqqwxxzyy~~xuwzupqtwy|{y|}zy~|{}~{|z}~~|vvvuwzxstwuolmnsz{}~{zz|~ztqrsy}}~}zz}~~}~yxwyzuuywrpswx{}{~~}xsroortrqx}}{{}ywxxy||yy~zzz|xw{|xttru{{zxspqvvsty|}~}z}zuvyvsuy||~|{~~~|z}zy|}{uqqnorsprz~xx{ytoompwz|~|{~}xz}|ywwuy{z~|xvyzutvyxwupoqquyxtu{~yrqpptvurw~~zuvvx|}xtxyvqnmlrvx|}}~yssvuqsx}}}yz|~{y{~yvx|~~{x{|~|uqrqtwupptvtrssu{||~}}{z{xsoonrxy}~~z||yuvvw|}||ytsutoosy||}~|uoooqvyxuz}}z|~~yuusvyyttz}|{~~xxzxsqqpswwxwuuy|yvwz}~~|{vtvupotz}~~~ywy~{wwz|{ztnnmnsvutz}~xvxwspqrv|~~~|z~{x{}zusssw{z||z}~xttwupptxx{ytuuuwywuz}uomlnsvuw~~zuuuuxywrsvtomnou{|~~|}~~|xtuz{wx|~}z|~|~~ywy{vstx{|||~|xqonmqtsquzzwuutx}~~{xzxsnmmpx|~}wxzzvttswzyxvrquxutv{}~{z~~~}}zttuvy|zvx}~}|~~~xsrpqtvstz~xwxvqmllqwz||zy{~zwx}~ztruvrsw}}|~}zxy{yttwxwwsopqswywux|}}~~}xw{|zvvwy~~~}}~~xy{xspoosy{~~~xrqtuqrv{}~~xvutx{{xz~|vpppqvyxw|~~~~wsrqrttoosvurssu{}|}||~}{}}{}~zz|~|~~{vsvwsrv|~}zunmmotwwux}|xuuvzzvwywsrrsy~}~}yx{{wrpootvvxwuw||yxz||~~{}}}~zzyyz{yw|}zsooorwywx~~~~wtutqnopt{~{xz~}z||{{||~|}~|yxz|ywy}~~|}{}xuwvrorvyz{vtvvxzxuu{~}{{{~}}~{ywy{uuvtpoqsx~~{wttxzvvz~|wvwx||||yyz|}{}|wuuvyzxtx~~}vomlmqtsrwzyxwvuy|}~}{{|{{~~{xtsw{zwy~{}~~~}|zusssw{{wvy{ywy{~}z|~z{~|zy{}{x{~}ywxwy||~~}|~{wxwrnllovz{|{z|~xwz}}|yxy|~}||}}}{zxtstuw{~{{~~}}~~zvx{zvstvz~}}}zz~zvvuw}}zxxy~}~zwy|~|}~{uqrutsuy|}}xvtuyzxy~||~~zyy}~}|wsuxyvuuw~~|{|~zz~{yz|}~|z|}~|vx{zustw~|~}||{wvxxvw~|yunmnquxvty~}xtuuy{z}{yz{}~}}}z|~}}}{z|~~}~}}~~}~xxxwxxvtw}~}}}~}yvx|||~zwwx|~}|wuv{~~zssuspprsw{~{y{~{z~~zyz~~~~~|}~}zyywz||~{vwy|~|xw|}{{{~~}}zwtv{}~}{}~{uqsvy|~{wy{zxx{~{y{~}~}~~}{yutw|zvw}~yuuvx~~|~|xxz{}~~|~}y{|{{|}}{|~|z{{z{~~~{z{~xwy}}|yyzzvtuuuuvvz~}}{y}{yxx{~~{~|z{~|z|{zzwutsuz|yvxyxvwz~}z{{{}{}~}|}xutw}~|{z{~}y{~~yvuwyzz}~zwvy~}ywvx{~|zyy{||zz}~|yx{~|~{yzytty|zusuz}|{y{~{wwutx~|{z}{x{}ytsvz~~}zwx{{y|{{|xvvx~~}{zyxx{zvtuuuutru{~~}~zvyzy{}~zwx{}~}z||{{|}|yz}}xuxzxsqsyzwy~~~zz|}}xwx{{z|~~}~yuuwxvsqtyywtsoqwyz~}}yxyzywuu|}z{zwzzzywutw|}|}~~}}}xuw{|~}{z{~|xuwyy|~zux|||~~|}{{~}|~zy{}{{zwvvssw{}~zxyxursv{}|~}{{{z{z|}xxwx|~||}~}zwuy}}~{z|~}wpptx{~|z}~|{}~|~{ttxzzxxy|||~}|}zyx||y{}~~}}~|yy}|wtv|~}|wpmmoqtvy~~}|~|tpqv|}~}|zwwy|xy{~}}zxxxxussstvwx~~}|~||}}~zwy|}~|z|~}|~{}}{|{zwropuzxtvxsnmmmt}}yuvxurqty|}||yuvxxyz}~yuty}xvux|~|{{{}}~~{|~~ywwttvuswzzzww{}{{|~xsuzxqopuz}}}yrqtusuz~}{}{usv~|}~|xx|~zwwvz~}zz{ywwyxutuwvutuy~{yxx{}{yvqquy{}xy|}yuty}}|}~xsuz|zy|}yuqmlmsy{wv~|||~{wutuvvz|xtvyz{}~~~{~vstwxtpotyxutsptz{}yy~~}{yxvux~|z|}~{{z|zy}~ytoptuvxwpmpqnmquy|}|{wqrwzxvwyy|~~}zxx}||{xtrttqsvy|yvwytpqtw||~}}trstv{}xtvz}|}}zz}{vuvvokmoqqppuvssspou||xw~|~~~~y|{|}wtw{wpnrxywtpjfhklmqv||z}zz}}~|xwuux~|zyz}}~~~|{}~xsquxtpoprtuusonrrqpqstru{~}|}~||ww{|z||yvtrlikpspmppjeeegnv{|yy~~|{~|{|~~}||~||{~}|{yupopstolmljjkhhotusprz~|vvx{|tpswslijpvwvvrkjmmjntyzy{~~}{{~{~|wvz~||~}yxxz}yuuvrnkjmponmifjoprvxwvx|~~~}}}}}|}{~|{z|yrorvvttwvplhedhnsrnq{~zxzywyzy{~}yy|}zx}|~|zyxsnoswwtqrpnmllovzztosxzzwuwz}wvvuz}yz}|uoknqqqrohhkifglptuw~}~|{~zy~~|{{}~~~~~|vrswxuuridfghloqssrvxxvv{~~~~{zyvtxzxyysoooqrpotuppolkqvvrpw~~xuwy{|z}}}}}wuxyxz~{sppuvrnooiggegowzyuw|yvy|}~|{~~yx}zvttwyxvtooqpmkmoomotvvvuvxwy}}{{}zw{|~~~wvww||y{|urrvxyxxrllmnnquxwvz{xuqrvvty~~~xw{~~ywvxxropplkkhhnqqoknw|}ywxz}|{~|yy{~zz}{~|{yy|}yxytonieflqtqmsyzvqpsuy{zzz{~~|}{}}xsprwvsrpjjpqpruvvttwyzxvxxtv|||}}wv{~~zxvv{|~zwyzwwxrjiljhjnprsx~~{vvzyvz{xx}{zzvx{~~ywxuqonnqvywplptvtomqtuy}}~}~yzzz}{z|zvx|~{|xux{}{xwyvssqmnswwrqx}~ztqqqry}zz}~{xw|~|{}|y||zulijkkmoqsqorttrruwww|zvvz~|{|zy|~|{{~~}ususqqqpolouwuqqssqrx{~{y}}|||~|}}}zwx|}xuwunkkijrxzytuz}{uqtvvz~{z|~|{zz~~zxx|~~}|}~|}}{zurrpllqtsnlpw{{wvvuv}}}}zxxzvux}{|}zy{}uqrsqruxyvvywtpmoqoouzz{|zwy|||y|~|z{~|~}|yyy|~~}wrrtuvyzxusx{yxvvxwstxwx{ztqsxzvrty}~}~yuqljlqutonuywrnnpsw}~}}}{{}}}~}|~xvxyz}{xy~{{xuw{}{uoqtusqooprwywwyzyxy|{xx{~}|{{{~~~yqpromnqsuux}}zvuwvsw}~}~zurrw|zuuy}|}|{~~~}~~~wttstwxwussvuspqvwwy}}~~yvvy|yrprx|~|{}}{|~~{zwsty{yttz~}yroooqwxvvxxsqrvyz{}}z}~~}ywy~~|}|xwutu{}yz|}|vstvw|~{wwvrqqrsqppswy{~|}}~}{|zwuutsprvwurqrqoqw{}~~zvux}{ww{~{vwyxvz}|||yz}|{|}~~|~~ztpoqqqtwyyyvqoqwzvsru{~~}~}~{yxuruxxuppv{}zvuuuy}}{}~|wsqsspqtxz|~}wvwy}}|z|~~}|wvy}}xw{|ztpppsy~}|zxuuwvsstvuuvyyvvwy}|~}}~}yz}}}~zy{|{zwwwuqtwwxywqopstpmou~~|~{}~~}~~}~zuvyyz}~~}~xxzxwz~zrnnqrokinsutuvtv|~~~}}{{~}xtvwwuqoopswxwwyzywvxwttuw{~|wwvwz~|~~{}}y{}~}|}~~}zusqrxzywwvspoqpnorvxwwz{wvx{~|z{z{}~}|yyzyvttwxwy|}~}yvvxzvnkmqvxxxwvwxww{{|}z{}~~|}xwwusvy{~zvtwzuonrvxwurnlosux|zvw|||{{~}wuvvx||xwwurqqrrommortw|~{{||~}}}zvwxvv{}|z~~~~{xvusnjjmppnprnklnqx|z}{wwy~}wsrrqptwxxwtqquzzvsrvzzyyyxy{{y{~}}~~~|zzzz~~~yuux{~{{{zz{ztpquuokjmsvvvupnqttw~~{}|{~zussty~~}||zxvvyxutttsqrsrooqtx}}}~zx|}~}}{{}{z|~{{{zyyz{wsrtuuuuvsmjiilsy|{{}zyzz{|}yvx{|}~zx{~~}|wqnortplmquusrqoquxy}}~~||xuuuw{~}|}{xy|}xqmmpqppnigiihkpw|}{{~}xvwz|{z{|||~{xvvzzwvvuqnoqrqsuxzyxzxsprtw|}~~xwwxy|~}|ywvuv{}zwuuvvspppqqprtqnmmlpvyzz}zz}}~yxz|}~zy{|}~~{vstxxsprw{{xurmkmmnqw}~~|yxwx~~~}||~yutx}|xvvxzzxuqnnnmklnpqsy~{|}zyurstsu|~}yvsqpmkloqrsuuplklntz~}}~|xwz}~}|~}|||zxxyyvsqokhgffjnoonpy}|{xuvwy|}|yspqux|}{wqnorqmijouyz{yusuustx|~}~~zyz}{{{zyyz|}}|~xvwwtqqswwuspkjmnoqstutvz~|vux~~zyxvv{}{xvwxuqqrtuvyzxtponoruussy~~{z{{{}}|~{{~{yxtsw{~}|{wrommpsusnlotwxwx|}{{}xsqppsvwxy|{xwywqljlopqqomnoooquxzy|~}~yy{~~|z}}|~yvx|~~}yrlkjjjkmoonprtuw{~wtuwxwvwvttrprv{}}~{wtrpmllnoopsussttvz~~{yz}~~~}}~~}z{}}~~{}ysrtwwwxxtpmllosvvssvz{xuw{zxwxy{}|yxxyz{{{{{}~zz|ytqqtwwutqoqssrtvwvuvxyz{|~~}{|~zxy|~|yz}|vsuz}}xvwvttuvustutrpoqrt{}{{xvvvttvwwtsuz}~}~}xsrsrpoonjhhimrvxxvx~~|~~|{{{}~~~}|}ywy~~~}~~|{}~{wtqpprsqmlpturoopty}{yxupmmpsvyyxwy}|uolnqqpomjjmoruy}~~~~|{z|~{{}zz|}zyy{}~}|ywwvrqssssuvvuuwyyxwwwuv{~~{ywtsttux}}z|~~{zz||yxwwvuvvrnlmoswywvw{~~zvuvx}~wux{{yz{||{zyz{zz}|yxxwwxxy|~zwwyzxtpppptwxz~{usstuxzzywyzyvtuwy{}{zyvtplhhhhikosuvy}~||{y{~~~zvuux~~||{|~~}~}|}}vtvxyyyyxvuvurqppqqrv{}{uponlmqvxxy{}~}zzz{~~|{{ytqpoliiiknsvwwy~||~|{{~~{z|}}}~}zsonnqvz{yww{~|yvuuw{}}~~~~}{|~~wrqrtvxyyz}zyzyz}}{||xsooqrqrtuttwz||{{|{z{~~{wvy~~|zwsqrvz~|ussuy}}yvussvyzzxursx~~{{|yuuxyyvvy}~|yusruz}~yqljijmppnkmsxzzy{~~~|xwxyxyz}|{}|xvwxz|~}yuvz~}z{}~|xspoquyzz{|zxy}|yvsstsqpquy|||{{{{~{{~~xojiijmpstttwz|}{{~}}~|z{}~{xwxz~|yusstwy{}}}}{yxz}~zxxyzyyz|~~~}|{{{zwwxzzxxz|}}}{{{~~}}~~{uqnotxywuvxyxvuwy|zxz{|~}zzzussrsvz}~}zz~}{{|||}~|{{yxyyxvsrqqruz}~~|yxz{yvuwz|{zyyz{yww{}yupmnpqqrssrqqsvx}}zvvvx||{|zwwy}}wuux|~|{}~{{~|{{zyxyxxwwvvx{zvtu|}||||}~}zvttuvustw{}|}~}|zywvspnooppsy|{xuux}|xxy|}yxz~~zvvx}}{|~}}~}~xsu{}||~~|||{{||yursvz}~|xsrtw{{z}~~{xwz}|wttvxyz||yvw{}}{xvuvx{}}{xusrv|~~}zwux~|~~}~{xxzywux}~~~}|~ztqruwuqmmpsw{}|zzz{}}zwtrty~yvtsuuuv{{zz|~wpnqvxxurppqv{~{{~{zz|}~{wvxz{{{z}}|}~~~~||~~~}}}}~}ytqqtwwxxxwvx||{zz|~|wsssstw|~zxz|zxy}ytstux{{yspqtvxz{zyxz~|urtz}zyxyz}~~~}}|~|wwy|~|xwz{yxyzzwtqrsvvuttwz|}|{zy{~|yvspoqux{zussu{~zy{|{{||||{yx{}~~}}~~|yvuw}~~~|z{~}z{||{zz|}xvvx}}}~xtqooqtutsqomnswz|~~|{zzzyy|~~{wutqooquz~|{{}~xtqrtvvwyyxwxy{~}}}{~{xwvtsrtz}zz~|zz{|||zxupmnsy}}{wrorx|~~}|}~yuuy{zyxy|}wtuxyyz|}yvuwxyy{zsprvz~||}~|yvuwy{~~||~|xusuxz}~{{~}~~yy}xttvy{}}yslhjpw{|xvw{~}{}zsopqsstsrvz{zyyyz}~yxx{ztqty}|yxz}~}yutw}}}|xwxz|~{zzz|}}|{{z{~wpmnqtuuroljhlt||xtsty|zvrppqrsuuvy}}}wqptz~~~|ytqqv{~~wtx~~}}uqqrsuwz}|~|zz{|}~~~}{xtqoorwyyvtrprv{}{|}|{yussw|}zxwxxvsrtx|~{xxy{|~}xssy}zyzz{}}ztonqv}{z{|}zurru{}{z}~}~~~}{xvvvvvvuqnmnrw{}}|zyy{~}|{zyx{~|vqoomlklou}|z|~{wspoquyz{||{xurqu|}~~|yz|~~|~}zz{~}{~}ysommlmnoqqpnnt}~~}xvutrpptyzwrolkmoruz{xy{|zyyyvqmou}~}~|xvy~{xuuwwwx{~{{}yttx||y|~zxy{{xsnklptwyzzxuu{~{y{zwvvurprw}}wrqpprtw{}~{xwx|}yz}~zvtuy}zwuvvustw|~{xuvy||{yyz||{~~|||||}{zy|yrnnquy{yuqoqv|~}zyy{~}}|zwuux}wmhhjlnoqsx~~}~~{|~~xrnnptwxwutuvwyzyz~z{}{{|}|~}{|~|~~}zsmhgimquvutsrtz~ytqppppruxuojhjnswxx{ytsuxyxvtrppsy||{zz}}y{|yy{}|xxy{|||}|ywvy|~}{z{}}wvz}}|zzzxsokjmty|||}~|xy~{vrqrstuwy{zwsqrtvwwxz~|zy|{vw{~~}|}|yvtvxyzxwwy|{xuu{yurruy~~|~~|zxz~~zvtuz{uu{}{zwspquyz{{zxtqrv|~~~zxzzywuttvwsnlmopopsw{~{yz{||{xuqnkknqtvwyz|}~}}~{zz|~~~zxy|zz{~~||~~yvusqnmmnqvz{zvsrwzusssrokhkqtspnoruy{||ztppsvyyxtpllqvz}~}~||~~~~~zxy{~~~ytrsvz}}yvw{}|wtttuutsqru{~zwy}zyz}~|xutsssqoorw|}zvsux{|zxy|~}|}~|vtw{~~ztnmpv{}|yxz~~xuxzy}~zxwwxz~|zyyyz}|xusuy}xw{~{zz}~ztsv{~}{ywutuz|yy{}{zxtqoopuyyuonpstsstvzzuvy||zvqmjhhmtxzyy|~}}~|wvz~|{{{{{}~}}~}~~{|}}|zyxyyvrooquwyyyxy{~}wrolkjhimtxxtrswyzzyz}}}~}ytporvwuqomlnrx|~}~}|~{}}{}~}}|yxxyy||~{ursuvvwxyyyxwwwxz}~~{ywvwz~{uolmoqrsuy~{xxxyyxx{}zyz{{|}}zwwyzyxxwtrqswz|}}}}~~~{y{{vv{}z{}~~}|{ywtsvz}~|zyz~zsqv{}ywvxyz|~~|yvw{{wvy}ytrrrstttuy{yurppqswz}~|wuutrqqppnllou{~~}}}}~}{xvx~~~}|{zxwwz~}vuy~~{y{|{vqnpty}~|{~||}}uollmnnmmpv|}yutvy|~|xwy}~zsmjloqrsttsruz}~~~{xxy}{{|~}wroqvz{{z{}~~|yvwz|y{|xvwwxy{{zvqnortuutw|{xwz}}|{}}ywvwz}zspptwz|{xutvz}}}||~}~}zz~~}}}{xutsrsw}~|~}yutx~~zxx{}~}yursw|}{yxy{}~}zxvvvuuvvwy{zvssuxzzzy{}}xroopstutrpopswz|}|xxz|}|y{~~|{||wuuvxz}|||y{~~}|{xtsuy|}}}||{yy|}|{{||{xurqpopqrsuy||{|}~}zxxyzyuojilqtuuvxyxwy}z{~ywz}}}|{{|}|{{|}~}|}|xtsv|}}~~}~~{wvx|~}zxurqrvz{zwtsuxyyxx{~~}zwvwz~~}{zyxwwxz{xtrtwz||}|zwuvx{{yz~|}~}~{vuvwwvvx}~}~}zz~|zyyyzzxtonrx}~|ywvwy||yxzzyvssw}|xvvvuuvx|~}{{|}|xtqqrtwyxtpopu{~yvwz}~|yyz{|}}xwxz|}}~}}~{|~}~{wutuwy{{ywuvy~yvvwz|~~|xutsrqqqru{~{z{|}||~zurrtwxvspoptx{||{yxz{wy~|{~|zz{}~~~}|xutvz|}|}zwvy|}{ywusrsvwvrpnnoswz{{yxwwwwvvy}{xwvusrtx|}zvsrtx~}xwz~|{}{y|~|zyyyz{}~zvsrtw{}~~~}yxy|{upnoppoomkjjloqrqqrtvy{~|xvuuttuw{|vrqrrqqrv|~{{{|~ywwy{||{zz{}~~}{yy|}}|wvwz}~}zurquz{vtvxz{|||{xtolkjklnpssqnlnruvtsstuuvy{zwrommortuw{|yxvvwxy{|xutvy|~}|zxwx{}~~}|}~zz}{wttx}}}~~{vplnsx|||}}|{wtpnnoqrsrpkgdgknoonmmotxzzxvuuvxzz{|~}yuqooprtvxyyyxvwx{~}|z{|~|}~}zvrpnoquy{}~~|xuv{~|{xrkffhklljgcaaekqtuttux{~{xxyyxussux{zvqnnopqsux|~}xwz}~}~{yxxyz}}xuuvwvutsrsvz}}ywxz||{yxvuspkgegjmpqokhgiouyywvvwwwxyyxvtstttrqrv|{wuuwwwvuw{~~|zyyz}~zwy}~zz~|yyz}~~}{zzz{||{yxxy|~}{xutuwz{zz{}|zuqnnnpppoljfddinrsqqqstuxz|}~~}{zyxxy{~~{vspoonmmosx|}}{z|~|}|y{~}}{xvvvuuutrqqu{}{|~~}{yupkgfghgfeddcdhmrwz{zyy{~}zwtqpqrtvwvsqonmlmpty~||~~|{{|{zz{|{|}~|uonpsuwwwwwx|zvuvxyxvtrqomigffhjlllllmpuy|}{ywvvy}}xtrqpppqsx}~zwusrqqsv{~}}~~~~{yy|}}~}||}~~yuuwz}|zz{|~}xtrsuxzzzzzywtpmjijkmnmjgfiouwvtssuw|{xwwwvuvy}}xqliijkmpty}|xxz~~|}~yvtuwwwwwvutuw{~ywy|~}{zzzxtnhcaaceghihfgkry|}|{{~~zvtqnmmosvwvrmjijmqux|}|}~~|ywx|}|}~}||{zvropsuwxz{||{|{urrstuutssroidbbfknqqpopruy|~}|{{{}~}yusqommmpuz}}yurqqrtuwy}~~~|~|{~~|{zz{~~|zxyz}|{{|~{xtqopsvy{{zxtpmjiiloppnlkklptwwxyz{|}~{wuttttvxzzxsnkklnnoqw|}zxxyz{|}~~}~{wuuwy{zxuttx}{vuvy{|{zxtokfdcdfgiklmlklqx~}xsommmmmnprrpnmmoqtw{~{zzzz{{{yxwy|~~zwwxz||xtrsvy{|}}}}~|tnmorttsqonljhggjmprtutsrsw|}{zz|}|xtqonnnnoqswyzywvutuwz|~}}~}{{}|zz|}ywvwz}{|~~~}zvqnmptwyxvuttsqnllnqssqnlklqw|~~|zyy{~{xvvutrpprvxxvronnpqsux|}~~{wsrsvy}~|{z{~~~~{xwwxyzzyyz{}}yvuuwxwvutrqoligfhjmoonmmou||xtpmkihhimrvvtqpruxz{}zwvwy{{yvssuz~{yyz{}}}|zwvvx{~~ysommnnnnopqpolklnqstuuvvvx{}zyxxxxxwvspmkijlosx|~}{zyxyyyz|||}}{zyz}~}{zzzzzz{{{zz{|~}|}|{{}|{zyvrnlloruwxxyxwtrqqqrrrqqqqrtwz||{zxxx{~}yvrpnnnpswyyxvtsrqqruy~~}~}{xvtstuwz}~{z{~}|{{zz{~yvwy|~~|zywxz}}ytpoqsvwxwurqomkjjknprsttux|~}}~~ztnjhhhikmquxyxvuvwy{~{wuttuvvvvxz~~||~~{{|~}zwwy}~}|voighknqrssstsrqpqrtwz||zxwy|~zwuuvwxwvrnkijknqsvz|yyy{}}{yz{|~~}|}~~{xutuvy|~}}|yxwxy{||{zxtokijotxzz{|}|yvsrrtuvvusqppswz{ywwwy|~~|yvtrqqqqrtx{|{yvtstvxz}{xxxxxxxwvwy}~}}|||}~|xvvwz}|{{||zyxwvuuwz~}zwsppruxyyyxwvspmlmpsuuutssvy}~}|||{yvrnlkkkklotx{{zyyz}}wrqruwyyyz|~~~|{|}~|{|}}{z{}~{wspmkkmoruwxxwvuuuuwy{||zxvvwyz{{zxwvtsssssqonnopsvx{~~~~}|{}|zz{~~~yvvvvwy{~~{wtrsvxyyxvvutrpoorw{~}{yxxwwvusrqpnnoswyyyxwwxyz{{zxvtstuvwxy{||{yxwwwxy|~{zzzzzz{{zyz}|z{|~~~|yxxy|~|xwwwwvusrrsuy|}}}}}|{xusswz||zyxwwvtrqqrrrsssssux|}zxxxzzyvspnnnnopsv{~~}}}~~}zwuuwxz|~||}}ywx{||{zyyyyz{{|||{ywtqnnorvxyyzz|}|{ywwxyyywtssuwyzyvsrqqsuwwusrstuvvx{~|zyxxxz|~~~~~~}~{zyyyz}|{{zzywtrqpqqstvxyyxvtsuwz}~{wtsrrqpnmklnrvwwuuvwz|~~~|zxwvvvvx{}yvtttuuwz~}||}~~~|{{|~}}}~}||~|xusrrrssrqooquy|~~{ywxy{||}~~}zwspooppppqrrtvy{}}|{z{|}||zywtrpoopsw{~}|zzzz{|}~~{zz|}|{}~zwuuwxyyywutsux{~~|{zyvsqrtx{~~|ywvvvvvuutsssstuvuuuuvwy{{zxvvvwx{}}{xvsrsuy{}}}|||}}{z{~~~~}}~}ywwwxvtpmkkmpsvxz{|||{yxy{}zvspnmnnnmkjkmqtwxz{|}|zyyzzzz{|}}{wtrppqsuy}}~~|{z{}~zuqooooonmllmqvz~~{{|~|yvspmllmoqssrqqtx}~~~{yvtsstuvwy{~}ywvvwyz|}}}|ywwy{}|{{}~|yvutuuutsssstvy{~~|zwuvy||yussstutsqonnptwyzyxyz|}~}||{||}|||}{wtrqpqqstwy|~|yvuw{|xusrqonmlmnoqtx|~~~{wrnlllmljhhhkotx{}~|zxvvwyzyvsqoooooqtx}~~{yz|~{{{|}~}{yuqmjijklmnoqsw|~}{xtqomlllmnoppqsv{}zxutsstvx{}}|ywvutttux|~xtqrtx|}||}~|{{{|{yvspppqsuuuuuwz~~{zz{}~~|zxusrqqppppppqruy|~~}}~~|zzz{|}~~}{xspmkklorvz~}}}{xussuy|wrpooooonnnoqtx{~}zvqmjhhhijkmnpsw}|ywusrrtvwvtqnkiiknsy~~}||}}{zxy{~~~~~~}{zxtokiijlnnoprux{~}~~}{zxvsqnkhgilortuvw{|xusrrqqsvz|}{wsqqqrtwz~~|yvsrrtw{~~}{zzyyxwusrqqrtuvwxxxz|~}{yz{|}}~~|zvronnoprttsstw{~~|zxwwwy{||zvqmkjkloqty~|{{||{zxxwwutssuz|zxwy|~}|zxusqppppqqqqqtw|}ysnjgghjlmoprux|{wsqppqsttsqnlkklnrvz~}|{{z{|}~~}zxy{~}|}{xvuutrpmllmoqstuwy{|zz{||zxurnkihiloruwy{}{wtqooopruwyyxvtssstux|}{xvsssux|~}}~}|{{{}|zxvuuvxyxwuttvxyyyxyz}~{zz|~~{xusqppqsuwyyyyz~|ywvvvvvwxyxwspnllmorvz}zxwvwwxxyyxwvuvx{~}zwussuwyzz{|~}{{|~~~|yvtssssrrrsux||yvrnljjjlortvwx{|xtqonmmnprssrqonprvz}~{zz{{{zxwwx{~~|zz{}~|{{zzzz|~}zwvvwxwvtrqqqrstvx{}~{yzzzywvtsqonlmorvy{}~}yvtqpnmmnqux{|{yxvvvwy{~~}||}~|{ywussuy~~{ywuuuvwyyzz{}|zwvuuvxz|~~}|zzz{{{||}}}~}{zz{|~~~}{zwusstvxz{{{|~}zxutsrsux{|{xusqqqqruy~{yvuuvwxyyz{{zyxwxy}~|zxvspnnorvy{}~}~~~{xuttuvwvvvwy|~|yuqommnpqtvy{~|wrnkjkloruwxwvuttuwy}|yxwwwwvvwxz}~|z{}~}|{zywuttvy}~|zxxxy{{zxvutuvxz||||}|xvvwxyyyxwtsqqrtvy}~|xuqnlklorw{~~|zyyz}}|||||}}~~~|zxvtttvz}|yurqqrtvxyz{|~}|{{zyyxxxy{~~~|{yyz{}|ywwy}}{ywvvxz}}yvtsssuwy|~}zwtsrsvz~|zyyyxxxxxxy{|}}||{{{{|}~{xurnlklnqtx{~~}~|zzyyxvusstvxz}~}~}zwtqooqtx|~|xsomlmnoquy|~}{yxyz|~|wtrrsuwxyz|~}|||}~~|zxvuttstux{~~{z{|}~}||||||{zzz{}{xwxz|}~~~~{yvuuvy}|yurpnnnpsvz~~~}~~{ywwxz|~}|{ywuttvy|~|ywusrqqrtxz||}}~|{||}}}||{{|}~|{yvttux{}~}{yyz||yxy{}|zxwvvvwz}~|zyxwwx{~~zxwxxyyyz{{||}}~~~}{z{}}yvtrpnmmmorvz~}|{{|~}{ywvusqpprtx|}yvtstuxz|}~{xtqpopqtx{~~~~}yurppqsvxz|}zxwvwwxz{|}~~|{ywvvvuuttvy|}}}}|||{zxwvwz|}{zz{}}|{{{|~}{zxwtrqqtwz~~{zz{}~}{yyxyz||yvtrrrsuxz}}{yxvtrrrtwz|}~~|{|}~~~~~|zwtrqqrtvxz|}~~}|}|{{{{|}}}}|}~|zyyz{|~|xvuvwy||zxxxyz|}}}}~~|zyxxy{}}|zxwusqoopqruy}~~~~}|{{{|}~|zwurponnoqtx}|xustvx{}~{wutstuvy}~}||~~|zxurqqtwy|~|yvsqrstuvvwxyz{{zzyxxwwwxy|~}}}}{{zyxvutuuwz~}}}~}{zz|}{zxwvwx{~|yvuvy|~}{zz{|}{ywtqonoqsuwy{}}{yxvtssuy|~||}~~|zxurnllmptx{~}zxxxxyzz{z{{}~|||~~{wusrtw{~{yxwxxz|~~}}|{ywvuvxxxxyz{}}}}{zxvtrqqqsvz}zxwwxyz{{{{}~{xvtrpnljjmqw}|wtrrsuwz|~{xvuvx{~}zyz{~}{xvuttvxz~}zxurpoooopqsux{|}}~~}|{yyy{}~{yyy|~~||{zywtrqqsvy~~~{xxx{}~~~|zyz}~zvtssuxz}}||}~|zwtrqonmmmortwz}}zxvuvwz|~~~~~~|yvroljjlosx|~yussuwxyxwvvx{{xvsrrsvz~{xwwy|~}|{zzyxvussstuvxy{|}~~{xvtttuwy}|ywvvwxz{}}}~}zwurpnlkkloty{vqonpsvy{|||}~|zzz{}}{ywwx|}{yvuvwz}~|zxvrolkklnoqsvx|~}}}}~~}|}~~|{zz{}~|zywvutsssvy~~yvuvxz|}}|||}~{vronorv{~~~{ywusrpnlkkloruwy{~}{yxwwwy{}~~~|{{}~}~~}}}zxvsqnllmptz~|wsppqstuuuvwy{~~{wspopsx~~{zyyz{|}~~|{zyyyxvtsrssuvwxyz|}}{yxwvvwy}}zywwxz}~{xusrrqpnnorv|zuqnmmoruy{}~|zyy{}}zwvuwz}|{zyxy{}|zxvspnlllnoprtvy|~}||}~}{zyyz{}~~}|}~}{{}~||{{zyxwuuvy|}xtssuxz|~~}||}~yuqoopsx}~~~}{xvsqonnnmnnprux{}~zwutuuwxz{||{zyz{~~|zxusqpopsw|zsnkknqtvwwxy{~~~~{xvsrrsv{{xvvvxyz{|||{zywvuuuuuvuuvwyz{{{|~~{xuttuwy|~}}~~|{zz{}~|zxwvvutsssux|zupkijmrw{~~{xwwxz}|zxwx{~|ywvwy{}}zwvttsqpoooqstuwy{~}{zyyz|~~|ywuuvx|~{yy{}~|zxxy|}{{|~|wsqrtx{~~~}}{xurqruz}|{zz{}~~~|zwtqonoppqqqsvx{|~zvsrqqrtvyzzyxwxz}~~~|zxvsqqsw|ysnkknquxy{{|}|{z{|}~~}{xwvwy~|xusrqrsvxzzzywvvvvwxxyyyyz{||||}~~zwtrqrtwz}~}|}~}{|~~}}~}{{{{zyxwwx{}|{}~~|xtpmklpuz|xutuxz|}||}~|zwusstvx{}}zxwvvuutttttuvwyz|}}zxvvwxz{|{zyxwvvwy|}xvuwz}~|{|}}ywwxz|{wtsux|~|{|}}{xvuuy~|ywvvwxyyyyxwusrqqqstuvwyz|~{uqpoopqsuwyzzzz{}~|{{}}|}}{ywuuuw{~~}xsooptx{}}}}}}{{{|}}zyxy|}yvutttuwyz||||{yxwvvwxxwwwxy{||||}~~zvtssuvxy{~~}}~}~~~~}~~}{zxvustvy~~~{uqoqtxz|{{zz|~}}~}zwvwz}zxvuuuvwy{}}{yxwxxxxwwwwyzzzyyyz}~{xvuvwx{}~~~|zyz{}~|{zzyxvtttw{}}}~ytpopsw{}~~}}~|zz{~|ywwz~}|zywvvwxz|~|ywwvuutsstuvwwwwxy||zyxyz{}~|{zz{}~}~~|}~~|yvuux|}{z{}{vsrsvy|~~~}|{}~}}}zwuuvy~~|zxwvwy{}~~|ywtsrrstuuwxy{|||||~|wustuwy{}~}||}~}}~~~~|zwusrtw|~||~|vqnnptx{||{{{|~|{|~}{zyy{|yvtsrsuwz|~~}{zxvuuvwyyzzz{{{{zzz|{wtstvx{}}{|}|{{}~}~~~~}{zxwwx{|zyz{~{uqnnqw|~{xxz}|zy{~~{yvttuvxz|~}zwutttuvwwwwxyzz{{{~}yvuuvxz|}~~}{yxy|~{z{~}zxwwz~~{yxxy{~}wsqruy}}||}}||}}zxwy}}zxutttuwyz||{yvsrrsuwxyz{|}~~~zurqrsuwy{}~|||}}||~~}~~}{yvuux}~|zzz|~{uqnorw{}~~~}~}zyy{}~|{|}zwtrqpqrtwz|}|{ywvvwxz{||||}~~}|{{}zvsrstvxz}~}|}~~}~~~}{{}~|zyy{~~{xvvwy|~|xtqqsw||xwwy|~|{}}{xvtssssuwz|~~|zxvuvvwxyzz{||}~~}}}{wtsstvxz|}~~~}|{{|~}||}}yxz}}zxxz}}zxvuuwz}{wttuy}~~~zyz|~|{{}~|zwurqpqrtvyz{zxvuuvwyz{|~|wspopqsux{}~|{zz||{|~|ywwx|}ywvwxz|zvrqsw{|xvvxz}~~|ywtrpnnnpsvy{|}|{zyyy{|}~~}|{{}}xtqppruwz|~}||}~{yz}}zyz|~zwtsrtvy|}yutuz~yvuvx{~~~}{zxusqppprtw{}~}{ywwxy{|}~~~|{|~~xtqpprtvy{}~~}{zyz{~|yy|~{xvwy|{wusrsux|zvuw{~~{xwxz~~~~|zwtqonmnpsvy|~}|yxwxz|~}{z{}~xrnmmnpsvz~}|}}~}|zxwxz}~}}~{wuuw{{wtssuwz~yustx}~zvuuwz~~|zwtromllmpsw{~~{zz{}~|zxwxz}~zupnnpswz}}}}}~}{yxy|~|}}zwuwz|xtrppruy}}xvw{~~}yvuwy}}|zxurpooopruy}~|zyyz|~}{xxy|~ytpnmorvy|~||}~|zxvuvy}~}~~zvsstx|}ywusrsux}~ywx|~|{{|}{xwx{~~~{ywurpnnnoqtw{~|zz|~~|zywwz}{vpmlmprvz~~{yyz|}}{xuuvx{}ytrsuy}}yvtttux{}yxy{}{{|{xwwy}~|xusrqponnorvy}~}}~~|zxwvvwy{}}yupnorvy}}{{{|}}}|{xvvw{|yvttvz~~|zwsqqswz~{z|}zxxz}~{yy{~|z||zxvutsssrrsux|~}||}~~}}}}{yxwwy{|}{xuqoorv{~}{{{|{zyxxwvuvy~{ywtrqrvz~~|zxvuuwz}zxy}{xxyz{}~|zz}~{{~zwvwvusqqrsttvy}~}}~}||||yvsrtx||zwspprux{}zxwwxyyxxxxyz|~}zvtrrruz~{xwwwwwz}~zxx{}zyz|}~}}~}{zz}}yy}}zwuuvvutsstvvwy}}{{}}}||||}{zywtrrsw||vrrux{|}}zwvwy|}|{xxz~}ysompuy}|ywvuvx{}zxz}~}{yxxyzz{{}}|~|yx{}|{zywvwxxvtstw|~ywxz|||{{}~|xtrrtwz~~|xtrsux{|~}xuuuvwz||{xwz~~}ztokjnu|~zwuvzzuux{}}||{zzywvw{~{{}~}||~~{zzywvwwvtsrsx~}{zyyy|~~}|{ywtpopty}}|zxvuttx}~wrrsw{}}|{|}~~~xsponot{}zxvtw}}zxuuy~{yxxxxy{zwy~|yy|}~zwxz||xttuvw{~zxxwuux{}}|xtrrsstux}zvuvwy|{z}}yvtux}~}||}~~ysolmqvy}{wvvy}~{wuvy|ztrsux{}~~{}}wtuy}{|}}|yvtrtz~zurrv{}||}|xussswyyz{wrqsw||}~xuuwxxz|~}zy{|ywusolmqv|~zxy~zsqrw{|}|zwvvuw|~|~wsty}~~zwwvvvvwy|{ursw|~~{vrrttssuvwz}zwuuz|y{yuuwz}~~|z|}zwuvutrrt|~|||{|~|wssw}{wuwxy{}}}~wrstw~~}||yvx|}|{{}{usuuuwyzwurqrtxzyuv|~zyz{}}}~{{|}{yyz~zz||~{~{{}|zwtqqqty|}~{zywvwxyyxusuy|~}{wqprx|z|}|||yxzzxx}|vstuwzzusvwvuwxxyy{}}~{xy{|||zy{~~~}}|xw{|yy|ywxz{|ysnnt{~{xwvuvursvxz}}|}||zusv|~zwx|}xutuy|yvuvwvuusruyzusvz}}|{}{{}}{z}}}~{wyzx{~~zy~|{|}~~~|wtuvy~zyy{}~}vsttuwxy|}||}~zvuxyy}~||}wssw~~|yyxtnmpsuvvvwwx|}z{~~zurt{|y|}zwvz}}~}{|xy~|{~|vtwxtrw~~|z|~xqllpv{|{||||y||wwxy}~~}wrruvuvy~~xvspqsrrx}}yvvz|ywwz~yvtruxxzwuvz}z{~zx{~||~~}{wurtz~~z{~}xw{~{vonnmry~~zxz}~{ww~xqoruux{}zrmnrtwyyvux{zzyxxyxywtwzyutw~~wuwuu{~~}|}{{~~~~vqqu||vwzzxxy{voortw|~|{||~~|{}{ww}~{zxvtpot}~yuqmjlsy|{uty}|xw{yvtpnqtuz{tttv~|~}x{~~}~{utsopz}|uw}|xsnlpw}{y~||~}wy|zy||wtsrplls{|sqpptxxy{||}}{y{|zyz||{yyrkkpw~~zww{}yy}||}}}wtrrw~{xwyyz~xwxursrsvxtqu}~}{z{wollqy}}~|xtpqx|{xvwz~|usvyz|~~zvrpquw{~{yvv{|z{~|z{{vty~~xtuzzstwz}{y||{|vx{yut{~zzyx|~yvz{~yqmorw|~{vuvvsrtvuw||yxvx|}{~~xojlsusuwxz||wy|~}z|{zyy}}y{{{{xwzxuw}}}}{{{xz|}vomv~~{y|{x}|}wnkospnsyxx{xuwy|}yuyxwww}|yy{{z~wtrooquzzxx|~z|~yz~~}}{ux{|{y}|||{{z~|yurvyww}|sntz~~ywy}}{yz}|z}|}yvppsrtyxrs{~}|}zvvx|}ztsxxtwxvx~{y|{uqrpouxxyz{|}wv|yz}vpot{~}~|~{{|}|{wnostzzxyywxx{}usz}{{}xw{{}}xsqppopsrquz|slpx{zxttww{ypmoldekpt{~zvuy{uv}}zywvxz{yvx|}~yvttqqu{}ywsrtttx~}}uqsqpv~}{xsrsmddjnpwyyyuu}{vy}}y{|vwzx|~xpjeekprtz|y~|yz~~|ytx}}|z|}}|yrnjjpwxz{|~}topu~zrnpqstw~~~~urqjinolp|ywz||wwusu}~~}{z{xxylefeirx{{tt|~xw}|{}~yvx|{wvxyw|zx}}yvx|{ytrsnksx}zssux}yvqow~~~vlhgjmpvyvsx}yvvwyyw|~{wuv|vidgeafpwxxz|}zvz}xx}{wzyx{wz}uuyxuwz|ystuvwxzx{vprusz}vxvqtvvx{~}wojkgbdmtwytw~zx|}~upsuvy~{qifdfpwxsv}{zy~~~wt{~~|}~}|xqu~z{yurprvysuytsv~vsqsvzztu}sjkiiouutw{{~{{}|{{uw{ypotx~{{xphilpurt||{{}|yy~}|}xvxusywy|{xttxwuy|ssvvuyxttrzzz~}{x~~~~}|zy~|y}}wrljjpvursvz{xy{|~|}{~~|{xvwww{zvnhlojhipyzy}~}{{~|tnrvuw{}~|qorvwxvwyuz~xzzsw}yz}x{}|{||wps|~}toklnlknoow~}||}~zwxzwrpswtqsswyzuoqqonqwy}~~~z|{vx{ws{~|{{{y{|xuy}zstww|ypp{~{z}}}}~}{~|z||ux{{~|wz|yxplpruvsrx|{wxwuxxwuvyusstvvxxy}|upimxzzyuvzytrvxv{}{y{}}yw|}wuslipvrrz}xvy}|~}y|{z~|~}x{{}{||{}|ywvuoovy{ytt{~ztvy~{vu}{utokswwz|yurmkmrvuw|yz~yttsons{}{w|}ywvuusoijpqx|}|yzspu|~}{ut|}{|~yttvwnipwywxwy}}y|{tvxy{wppqlfhlszzrqswzwru~~rrssw~}~||~}wpnqqnqx}}{yyyxy~}wx~~}~{{~{xtz}~~zy{~~}{wspv}}wtz~ytw|vnntzyxvpjhkosw{zyxtsttwxw}zvtsu~~zy{}{}vmkgeitxxyzwwy}|xw~~z|~|vtz}}~{~~|y}|}xtwwzzuvwtw~|xtru|yv{zpjkijt{~ywz~ynjotu{|ursuuvy{y|xuqnlmjgnuy}}|||~~zvrsw}}~z||{zwv}|wz}|tv|xsqsvxz{vssv|zxwofgkjfjsyz{~~ztvywt}{z~~wruy}~z}~}}xsnmorssut{zy|~}|yxw{|vv|}|y}~wppxyx}{y|{zyzyv|wrtvtrrvupmihhksyytx}xuvxy~||~z}~~}z{|yz~yx}~ysvtpmkknrprz||~vvy{}{yyyxustz~~umptxzux}{{~|~xsvwwyzumospkloquuv}}{||vru|~~}|{|zx{~zsu}|{}sooppqsokkp{}tquxxz{usvxz~|ywssw~~zutvz~~{xssvrnnkfhpqmjmv|z|~|~|~}z||}zz}|xy}|~|~xuxywstxwpmrvz}|~ztw{ywwwv{}{upmpwz}{z{~}~~{yxtokilnnmknpoouyx{~xtv}|y}z|{zz{}~}}{xwtwzyxqiiqurqw|{xvsmnrvwwz~~}|zysnrx~~|}yz}~~vtspoqnlpuurnknvzyxy{~~}~{xtw}|~ywz~}z~zxz~~}}wz{uruyytqonopr{|tssnnqpqu{}|y~|{{zxxzyzvyysljoqoppommnmnpstz~}xz|~|yy|{vswywy|~~~}~|yyw{zsvyvpmou~}z}|tkmtvux|~~}|{}xuuxxty}}~~~xuqmihjnqtskjnquust{~ywvvvxxy}~}uquwz|z~~{{|~zxwsmknqrv~zwroomkpy}yvz|}~~|wssyzvx}}zzypmnoqrqswtqpqpnrwy{}|zy|yssv|||{zxvwz{z}}|}~{z~|wvyzytkkpsy|rnopnopsxx{zx}xuwy~|}|yxyysqnmrvvsmknqpijqwy{}}zwx{z{~yusstxy{}~}xvuy~~{}~~~zyxusrrv~~{xyxrnrwywux}}{tuywtv|zz}ztsurllptqpqnmllrxxx{trv{wstwvvyvrtx~}{zy{|}{||vrqrtvxy}|xwzytrrporwyyz|}{{~|wwvuxzvx~~yy~|{yusqsxyrotwuolorw{~|}~{yvvtsxzvtw|{yy|||zsw}}}~{z{{yxzvruy{~|zz{xtstuvrlouy}}||~~z{|vsv~~yy|{|zy}wvvvvtsspkioroqx~}~~~}ysrqqtxywtty}yvzzsrux{}|~~yz}|zwx~wvz{|}{xvusstuuy}zz}xvvvw|~ywy{z|~|wwz{tnnrsrnjnqryz{}zrpsoilrvwyyyxwxyxz{{z}}}|z{{yuuxz|}}}|z{{tnmosrsy}|~{wyzz|~vux{~{xxvqpw|~}zz{xuvwtpqtvtsvz}}|}{ww~yqnkjpvwuw~}xwy|~|xy|||}wzyvwy{zx||wwy||z{|zvtsnkmt}yvsuy}|y}~}{||uutrv{|{~zutwwrpqqpuzwsuy|{xvz}{tlkmpuwy|zuuyzwuz~ztw}}~}}}{~{ywuvz|}|y{}yxz~}wvwtooux~}zwwx{~}~~|wqot{}|~|{xtqppsvtrvxwy||xwz~|tkjonkmsz}{vtwwx{~{~z{}|~z{|vopw|zy~|~}yskkrww|yuz|{yx{~~yuqqqrtw{}yyyywttvx{}{vtw|{wvwxz~{rlmnnpvzyy{|{xuu~~|}|yx}|yurv{|z}}}}xx~yy|{wropqu|uuwxxz~}||wopsvxy{}|xtw{zxxywvvttssvzzwx}{xxupmmt{zwvuuuuwy|zxz|}zw|vsuy|{}|~|vx}}|{}~|}|vwzxtw|~{|~zv{~}{}}xvutsw~|z{}zttxyz~}vstwywuuy}}|~}yvsqonoqrsvxwrrx}{y~~{z{~{vxxutuy{y|zy~|}|{||{zusx|xw{}}|~{vx}|{||uuwwsqv|||}|zxw||~~zwwuqty{zwuy}y{|{|~|tnosvusruyxvy{{~}~yx{}zvxyyz{|{{}~zwy~}z|}{yx|~zxywv{zw{}zwvz{|~}}zvssy~}yyz|~~}wtvxsnouxxyzzwvz~}|~|vvuqpsvvtptz|}zz}|yx|}~~{xw}zwwtsw||{{~xxz|}~wuv}zy{}{xzyy~~}wvyz{z{|{wx}~}{zwsopvzzvw~~xuwuv}ywyxrllpsrtxwx}~|{}~~z}~~~|xxxuuwtorx|~~}{x{|wwwwuv|{yxvuz}{wz~ztsw{{yy}~~{}zrqtvyzz}yrrvtpt{~|wroqtrnqz}|{x{~|z{}{vtrqrwyzyz|z{{z{yuvwuw||{{{vrw}~{{{xvwyxux|squxvsty|xtrolow~|~}uqppqqvywz|}}~~}~~|vwxsnosvyy{~yuw~}ztpt}|zywy}|~}xuv{zx|}{ustuuvz{usvunmquz}ywwsmkrwx{~}zz~~}||}ztspmptsqqw}|{z~~}ztrty~}wwz{|zwvtt{zy{{yutx|yuuqjlsvtsy~wvtoouvsy|z|}{~~~xwwrmmqttrw||~~yzwrsv{{{{||z}}y{~}||ywwxvvz{~}|zyyyyvrtupkknpqs{}vpqvxy~{x{{y~~|~{|yxspruurnpy}{xz~}~}||wwwxz~~~|}|z~~~~wu{|{wtzyuwyvttokmqrpnox~}zxywtx~{xw{|y{z{}~wopsuspqtttuz~}x|}{}~zux~}}wv|~{zxw{}wx{|}|{ztqutonppppqvxy{}zuyzx{~zwx{}{vw|~~{}~{upsvvplqwvsqsx}}~}zwx}ztx}zwz~}z{zuw{{wy~~~}|vsqmmqsqkjpuvwvw|~|~~zz}zyz{yy{}~}{z}~uruvxuswvrqsvwvx}yz|yxzxtv}}||}xy{zxw}|~~}}trrplmnopnorrqrv|~||~zz{~zrsw||~|wz|yuqtywsmkorrw|ttwusvxzzy~{}~wvz|zwz~z}zvtmjpuurmotusopuxy}~|yxzxvvx{|}}}}}~xwxwuswvrpooonmt~yuuslltzzxx~~yy~|}|wv~}||~{zwqnpqrppsqnkkosrry}~xuw{}}wx~|~~{y|}{wsu{{wroooosxz}xuurpswwwx~xy~{}|xxzz{}|~wnlorrmjptrmjknps{zxyyxxx}~zz{yy||}}~~}{z{ywtrroijquy}~~yqmquwuru|}}~~}|{}xv{}zww{~}~~|tpqqqprvvrmmpqmnv|ytw{|yx|}|~}xy}|}}|zz~yuwzzwqnoolmqru|zwqoqpoorxzzyz|{}||~}zy{}~{||vwyxrnqvurmjjjinuvw~~|z}}xz{yx{{zxz~zzywwy|~{y{{xvvwupnruwz~~}}wqrvwtqsxz|{z}~~xssvx{~ywvsoossollmmihmtx}~~zyyuuxwrrx|{xy}{vuz{|}wuvvrrtqpuz{||}zxwusqtwtrqty{z}}z|~}~|zwuutu~~xy||wroswvsponlmsttx~{{}|usttux|}{x{~xw{~~|}|xuuvtontutuxww|zuvwwtnnqsrpqtvx|{zyz~}|{xxxx{|}zxzxurqqqmhjoptz|yy~zwywqrw{|zwy|||}}vtxzyuv}}xuuvvvz{ww{}zxy}~~zyzywtuyxtqptxwx||~{|}{wqqx}}{~~wuwvspmlkkloposz}}~ysqnmpuvtsw||zxzzxxyzz}}{{}yuv{|{{zvrsw||xz{|}wvyxuqonnns{}|zy|{y|{xyyuuxy|{zzyx{}||z{{xtqrtsoossvz{yxz|}~ywtnkntxyx{}|||}~~~yw|}xvvuswzxw{}xtsuyz|~}~}zwuxyuokmommry}{zyusvy|{z~|x{}{xuw~~~zusrqptuqquvtuvyzz|~zuqsuuttw|~zutvyz}}yvw{ywwxywtuz~zx{}zvy~zvx}~{wxzzyvsromrz}~}zuvz~~|z~}}|zz~~|{|~|vsrspmnrsuwvsrv}}|~zrmnpqpqtvwvuvvvx~xw|~{zzzy|~}yvwurtx{|~}~}}}{zvutrnmqsw~|wx{|{z|}|{{}~{x{~}|utwz{yx|zvtsqsxzxxz{yxwz{zz~{wsrrqomry|zxwxz{|}{zz{yuvz|}|yz{zuqrx~|{~~zz|zxvtqllpssu{}wvxywst{~|zy{~{wvxyy{}|}{uuyzz|{vrqtwvssw}}ywwwurtwxxwwurrw}}~~{xtstuvz||}yyyz|~~{{ywy|{yx{~}yvvyxutvvw}~yxyzzy|~|}~}~||{}{y~}zwusvywvyzwtsuvuvz~~||xsnmqtspoqtssx|~|yz{{xy~}ustwxxy{{{{zwvy~}~{zxvxzxuvxxy|~yx|~zvvxyz}|~|zxuv{}{yy{{wux{}{xy||wtw{~||~~zxyzwroqrrtuvwuv||{zyz~}|~}~}ywvwwx{|{|{{~~}zwvwwuuvvvyyvuw~~~|yvxxvvvvwww|~{}~|xux|~~}||ywvrqsvwwx|~|yz{{~zwyzwsqsuuuwyy|{{zvsv{}}|~~{|}zyzxsswyzyxz||zxwwux~~~|z{|}xx}}zxyz{~|||~}|}|z|}}~ywyzwrqsw|}~~{|}{}|ywtqnnonmpwz{}}~~|{z}}zwwyxsqqqrtwxxx}}{|~||}vsuyzy{}~|zyywtv{||{yzzxwwwwx{{xy{{zz|}xutssx|}zwz{xsonprsw{|~~~}~|z}~}zyxvuvvtsvz||{}}{yvuy}~~~}{xwwwvw}|}~|xussttx|}}}~}zwwz}}~{utuvvwxvsstsqrw||ywvsqrx|}~~}}|}}~~~xttrrtutsrv{|zvvxxwx|~}}~}zy}~{z{{yxz~}{{{|}ywwxwvvy|zwvtsuz|||~ztqpnortuy~}|~~}ysqpmjkorrqsxz|}~~}{}|vrsw{}}}~|{zy{|{|zwvwwwy}}~~~}|zwvvtpnpsuvx||{zxuropv{}~~|~~ztqpnorttssy~}{z|}}{|}}~|~~yttvz~}{zyutw{|~~{~}yxww|{xwwuromklnqqqsz}|zyyzz||{}~~}|}{yuporssqprttuvwvux}}{}~}||yx{}~||||~yxyyz}|~~|}~}zywtrtsqprtuvwz~~{vtvxxyzzyz|~~|}|vsolmnmjjnrsrrtx{|{xxwwy{xvxzxwz}~~}~{{|yx{{vsqpprrolmrwxwwxzyxzzz}|}~{yvqmmprrprtuuvwxxy}}|}|zxx{|{{{zz~~||~~~~~~}{z{{{{}}{|}vrpnkijlmllortvz}~~{y{~}yvvvurppstrnmoqsuy|~|xwxxwvxyyy|}}~{zvrrvyyy|~xspnmorsqopuxwvwz}~~~|yy{|zy{}~}ztrrqpnnnnnnnopqw~{yvrpommquvvux~}~}{}}zyyyz||{|}{xtstusqqqpooqsttw}}|}~{{~~|xwz}~}~}{{|~|zxxxxvsswzzxvuwyz~~ztpopopsuvvx|}}}}~~|y{}~|z{||xwz}xwy{{zy{~}wsqssqnmqsroopsvz}~~{xwwvvwyyurssstwyz|}|}|{yxwtsv{{vqmlnqrompsuvuuuvwz}}~}|}~{xusrttsrsx|}|xuuuvvwyzxvvwwvw|}{{|zurtvwwvwxxwxvtuy|~|}~{ywy}~zvwyzwtrstsuy}wqnjggghiknqssuy||||wvxz{|||zxwurqsvxxx{~~}~}zwwyzxuqppprwz{~~}~~}|||||}~|wuutssssssw{}{zz{zyz~}}{xxz{zxxzzzz{{yx{{upkjlnnmmquwxwxz{}~}}|zyyyz{}|zxwxyxvuwz{yxy|~zxvtstusrrrqppt{}}~~|ywvtqqokknqqqrv|}{{~|}{z{{yyzz{~}ytpnmlkmonmmorttv{~~|zxtppqrqpprtuvwz|~||{xutw{{yxwwwy|~}{zyxxxywsppqqrtuttw|~~~}~~}~|zzxwvvvtsuy{|}}upmljfceikkkmpsx~}{z{{xtrqppqqpoqvyyxxz}}|||{yyxwssvy{~~~|~~|zxwtqrttspoqtvwxyzz}|yyzzwuwzzxvuwy{}{vsqnlklnnmnptuvz|{|~}|{zyxxxvuuwxvtuwwwvvuuw}{wwxwusrrstvy{}~xrpommnnmlmoqrsv{}z{|}}}~~}|{{zy{~}}~}{vpmnnmkiijkpv{}}ywvtttrommpqommortw}}zyyxwwxzzyz~~~~|zxtrpnlnqttrrtuwxyz|~|}|wutttwz{}~}|xsnlkiedeghint{~zvtrpmmopomnpqrstuuvz~{yyzz|~}}zwuttuuutsturonorux|~|yxyxwvutsrsw~~|vrppomkkkknty|~{wusstuvurruwvsrrsstwz}~yvtuuttw{~~zwrnmnoonmnoonmnpsz|z{~~|{zzz|~~|}}{vqmlkjhjnrv{~|yvvvvsqoonmllljkpvz~}}~|xutuwz{urpnmnooprwxwtrstvy~}|zwttwy|~~||~{yuqlhecdhlosx}|xurqrrpmlnpomlmoqsvy|~~~}|z{~~}{xustuuttvxwuspmmpv|~}}|zwuuuuvxz|~zuqonllnqty}~~zxxvsstvwuuuussssrqsvyz{}~yvttwz|}}{xvtqommprrpooonnqv|}|}}}}}~}{{}}}}}}}~yuqnnpppqtvxz~~{zz{{ywuvvtplkklmoqrtx{|~}}~~}{yvvy}|zxvrpppolloruvwwvtuy|~|{z|~~~}}}{z{||{{}~~{xupljkmorstuy{wttuusrrqpomlkkmrxz|}~~{z{{{{}~~|yxyyzzxussvxwvwxxwuuuvy}~~}{zxwx{}}}}||}|{yy{~~~}zxvvwvvwxyz{}{wtssttstwzywtrrrsuxz|}~{yy}{yz{}}{z{{yupooopqrrrtwyxxz}~zxwxzz{~~||}~|zurrstvy}~|{yxxusrtwyyz}|yyz{{{||zxvsollpsuwxwvwx{}|xwz}~}~}}{wttuvusppqpnnptwz|~|{zxwxz|~|z{|{yz}|zxwvvx|~}}}{wtssrrtvwx|~{yvsrsvwutqqpnnpsv{~}}~~{xwwxy{~}yustx{{zzxwuuuvwy}~{z{~~}|~|}~||}}~{wussttuvy}~}~~~~zxy{}|{|{xusrrtwxyzzyxvwy{|}~{xwz~~~~|{{{zz{|zvpmmnptwz}}{||zyxwvwxz|~{vrnkknqqsw}|ywvutuwyz|zwx{~}||{{zyxvuvxxxyyzxvvy~}yvvwz}|wutstuvvusqnnnszzwwyyxwx{~}zxxxxz|~|ywtrrsssuy~zvuvuttvz}~yvtstuvvutvyyxxxx{~}|~~|{ywuvw{}{zzzzxvssv{~~{ywvvw{}{{~~~~~}|z|~~yurrqonoruy|~~}~}zz|~~~{xvtsrtwz|~~}~{ywx|~}|||}}|~~~~~{xy{}~}zvrpquy|}~{xwyzzxvvx}~|xvwvtroliiknpruz~yuuvwxxxuuwy{}|yxy{|}~zwwyzyyyzzxwy|}yvuvz}|{|~~{vsstuvvwwuttvy}ywvwy{{|}}~~}{ywvtsrstuvvtqopqsuwz}}xuuvwy{|{zyz|ztqqtw{}~~{yz|~}|~~~~|zxvvy~|yvssuxyywvuvx{~~~~}|~}|~~~~~~|yvuvx{|zvrppomlnquz}|}~~{ywvuvx{}~|yurqtz~}~{wsrsvwxz{{{|~~~}}~|zxxy{|}~}yxz}~|z{|}}zyyyz{zy{~}yvtqnnqttrmkjjjjlnrz{wwwwurpmmotx{}~{y{|xwwy{}}|xspquz~|||~}zyyyyz{{xusrtvz~}}|zyxwxz|}xsomlklnpsuvvtqooqsvz}ywvvuuvuttux|}wuv{|y{~}ytrty}}zyz|~~~}{zywvurporwzzxvuw{yuvz~~}~|xvtrppqsuwzyvromkklqv|~|{ywvutssrrty~~~}|zyz~~|wrnkknruwxyyz||ywvwwxyyxwwy{}|y{~}~|z{zwwy}{vsqpnljjnsurmihijmrv}}vqooonnmllnrx|~|yxxyyxvsollpuy|~|zz|}ywwxwwwyywvwz~|xwz}|yww{}yuokijjihjnswxvrporw{}{somnpsuusrtx}~~~}}}}|{zyvsqprw|}{xwxz~|yutuwwvtrqpqsvy{|}~ytopuz~}{yvsrqponprtvxyvrooprux{~}wtsstuusrppqtx|~|zyxvsqomjhkqvxwvvx|}yusqqstvwyzywvwy}}}|yww{}|~{wtromkjjjlprronoqsux{vnjkmnmllmnnptz|vqopqrrqomlosy|}}}~~}{yxwxz|~}{xvtstw}~}zvtuy~~ywwvurmigijjiilrxzzyxy|~{tmjloqsuvussvz}yvttvxyyvrpprvyzxvwz|{yvrpquxxuqooqty|{zywtpnqw}}ywuuwxwtqoppppppsw|~|xvvvwy{}|wsqqrtvvspmmpv}zurqrsrqpomjhkqvxxy|~yutsrpoqtxz{zxwwz~}~~|z{}}yuuz|z{|}{wsqomkihhjouyzxwvvwz}}vojijmnnnnmmnt|~{vqkiknppqqqpoosx}~||{ywvwy{|}}{yxxy{~|yustx|{vsstutqmjiiiihjnv~}|}|zyz|{vniimrtuutttw}~}{ywurpprtwyyvspprw|}{zxvsrtwyxvuvwy{~}|{{yxvtqopuz~yurppprturnllmoqsw|~{{||||}}zzz{}~ztqqsuwyywvvx|~~{yvtssuvwusokimt{}}}~yussromlnswz{{{}xttuvvuttvyyvrrw~}yvuvwz}~|xurqqrtuwz~~yutssux{~yspooppppppqsx}{zvojgikmmmmmkknu}}zxy{~~{wuuuuttvx|}xutw{~~|ww{~yvvxyyuokhghjlnqv|~|}~|yxwwxwslffimpruxz||xtrrsrnkjlptwxyxxxz~~|zz}}zwvvz}{yy{}|}~~}||{zxvrnmrz~xrnllnqssqmloswz{}}|}}}|{|}|yvuuvvx|~|wrqtx|~||~~}}}}}{yvtssuvwwvtrqu{~|wtsqommpw}{uqpqrstuvwyyxvuy~ywy~~yvvwxy|~~{xwwxyzyxy}|vrsuwyzz{~~~|uomnquwxxwuuz~|zywtpkhgikmptvvuvz~{xwuttw|~zwvvvwy{}zwtsuz|}|xutuwwusqoopqrsux~}~|xuttvwvsmiinty|}vuvwvtrqqstrnklpuy~{yyyyyy{~}|||}|zyz~|xx{}~}{yyyzyvux~}~~ytolkmquxyxwwz|}~~{{{yvsqrtxzyvttuvwz~|wvy|vtvz}}|{|~}ytqqtx|}zvtv|}{|{vttuvvwz~ztonpruuvwy|~{wuv{|xvvwy~}{{{{{zxy}~ytrrssrrrv|~~}~{wtux{||{zyxy}}{~|zyyxvsnigintx|~~|yy~{ywvtrrtx~{yz}xvwz|~}zwttw{{wutvz}~}xtrrtvwvwz}{zzzzxxy|}yvsrrtwyxusuz~{tqqttsrrrtuuroosz~zxxxxyz{}}zyz||z}{xxz|}}~{y|{z|}wronptz~{{}ytrqpnmlmpuyzxvuuvx|~~}ytrtx|}}|}~~{xvx{}xtuz}{{~}||}}|{}}{}{uomoswz}~}}~~}|ywvw||zz|~|{{{zxwx{}ysmkkmoppqtz~}}}yy{}}}|{zz{ywz}~{yxwwwuroorw{~~{z{wvvusrru|~{uqrvz}{wtvz~{{~}||~{wtstvxxxz}|wttvwvutuy}|yvttvz|xy}xqmorttssuw{}{yx{}~{xwwy}}zxyzzzz|}zxwx{~|xy~|xwz}||yz}|zxyz|~||~yrnmmmkiikpuz{zyz{}|||}~}{{|}}|xtrty|~~{z|~zusu{~{zzz|~}|{z~~~~~xw{|wrprx~~zyxyz|}}{xw{~zzz{zwspqssplijkmnopsy|yxyz{|}|yxy|zvwz{{{|~~|ytrty}|z}~}~}xusssux}{xwwxz{xspqv{~}{z}|zz|~{wuuvwwvtstxzywtsrsssssuz}{{}}{|~|}~yqklpuxz|~}{}{yz~}yurrsv{}{zzz}}xusrsw||yy~~~~~|{~~~~zvttwxwsnkkkihhimt{}zvsqruxyz{|~~ztru{~zz}{vroquyzzyxxx{~}|||}~}xvy~}zy{~yuuwy{}~}}~{xwurojgimqrnjilnonorwyvvxyzyvsqrtx||wvy}}zwvwz}{vtw}|yyz{~}xvwz}}xuuuuuvxxursw{~}|{{}}yvtqoppnmoswzyvtrqqqrru|~~||}~~~|yvvy}~~{uonrz~}|uoosy{ytpoqty~~zyyxwutrqty}|z|{{}}|zxwuqooprstsoljhghjnv}|}|ywvuspnlmrvz}}}}yx}|yz|}wrnjilqvyzywwy|~~}}}~~~}}{{{||ww|~~xssvzxspomlhddflstplmoopru{}tpoprssqpqqru{~|~~|zxxxz}}yuqoqw||zzzyz~~|}{xvututtvxxwxz~ywxy{||}|z}}}|yurnklnnkjlqy}|wsqqswwx|{tstvz|{ytqqw{||~~zwv{~{ywqkjmrwyvqppsy}zvrqtvxwustwy{}{uuz~}~}{yvtspmlmmnrvuqnkjlosx}xtsqprsrpmiilqw|~zxwvvspmljjjkow}|xwx{~{yzyxx{|~}|yy|}zz}yvw|~xspnljgccdgmsussttuvy|ulhhkoqpoqrppsy}~}|yuqsvwusrppqty}}{zzxy~|xwz{zyzywusrty~~}zvsqrwz}~wuttutqkjmmljkms{|xvx{zyz}snnpuxyxvroqtvy~|{|xwvttvrliilpuvtrrtz|{zxvqmnqvz{xuwzz|}{|~}yvvvx|{yzz|{vspmklmjkpx{zwrprsw{}vrnjknqrqmhgiow|wtqnnmkkjjkkjks{}{{|~{wwyyvtvz~|z}{vuz~~~zzzxusqnkjfccdgnuy|~{yz{~|slgehmooqtsporx}~|zywqlnrsqqqprsruxz|~~{vtwxwx{|zyxvx|{z||xtpmpuz}vpppruuqmnonkjlnv{{}zy|}}}tnkmswxxuqpruw|~}}yuspopsqmkkkmruvyz|{zyvupmnotz~|z~~}zxxxz||yxywuw|}xvwwz}zwsnklnllqzztttw{~~~yuoihkpqqpkilox~xtsqmkifhjkmnlinx}}xuxzxuuw{}{~~~yst{~~|wwxtrtusnlgdeglsy}|||}~zz{{|{tojfhlnnqvwutw{~zxuuvvqllooopqqtutux|~zvuwvux~|}|{~|xy|}zvolou}yqnnotxwqprqnnqsx{wy}}{||yx}~ysolquwyxvvyzx{}}{z{}zurmknrpllnoptwz~~|{ywvpmnou~~zxusuuvz}|z|}yuv}~z|zuuvy|xrnotsqsy{wuuy}}||{zvmginqsurqrsx}~zussrnkhdfhjorqou|~|wvz}zx{{xuvx~yy||z{|}yuw|~ywxvrsvxusnjkmouy{}}||~yxzyyyvtrmklnnqz~}z{{~~|z{zutssuwtooqommpqv{{|{z}~|}|wvyywz~xux}{xy|}||upru}yw||tqposxyvwzyvtvwz{vwz{zzxvyyz||yv{|yvqrvx|}{{}}yx}xv|}zzyy}|zwpkkopnpuxwwwv{}z|~zxsprsw}~~{xtoosuy}~|}~{}~{xvy}{www|yvxyusv{|zvwz{wv{~}}}{{}yplnsuyyuuuuz}{yxz|wrruuqnhdfhmuyywz~~~|{ztrtw~|~}{|~{yyz~zy{yww{|~}{{{ztru{}}|uqqqty|{}}{~||yvx~zwxzyyxtuussttsx}~}}{wstrprqrvxvrstqmosv}{{|y}|y{|{|}}~ytuz{xx|{yyz{tuz|utqrx}~~{yzzysrtsrspptuy|}yx}}}}{}}}}}yx{|trwyxwxxz~~|ysnnstsuz|{zxuy~zwz~|}zwzz||}}zy{}{xvonqsy~yxwuwy{|{zz|{}xuvz|}}|wtuuqotxxwy|~~{{|wvxxz{xwxwy}|ytrtzytsuwutpjkmpx}}z}~}}|yyuqsuzxsstx}~zz}|xvy{~|}|y|zx{|vvtvz|zz{vxxvwtqrx{xxz|zzzvx||~|wz~}|zzwrpmlpqswzxuy{ytuxz{y~~}zy}|y{~}yzzytvzyy~|~~}}vsv{}{yyx}~}{}xomoonoljnrw}|y~}}ywy~}||z}}uruvuuxx{{vvywtw|}|wsvyyw{}z|~~}~z{xtu{}{zuoprv~~|{|wuvtwzzx||uux{z|{wxurrrolpttruy|~~{z{wvxwy}}z|}ysorxwstx|{|xrqqry|{|~~~}zysrtu{}~vspqx}}z~}yx}}{z~|}||}{wvy|zw{}|{vvwttrnnswvvz}|~{}~~}}}zxzzurniloqx}}|}yyz}yz~||~ywz{~{}z|~~~yxw|}yz~||~zy~~xuwz{|}}yvy}xpmnnlmjhkns{{z~zvvxvvxuuwwz}~yvxwsrvy|~|}zuv{~}}zsrsu|}|y{~}||yssw|}}|vuwx~}yyvsuvvz|zyzuuxvttoorqrsqlkqsrpsw|~|ytuuuxywrtz}||~}|toqwwvz~xvtuy}|{ywxy}{~~}~|vuxz|y{~~~xvtquz|{~~~y{~~{|}}~|xxyytqvwvuwxvxwttqmnsutx~}{{zz}zyxvvy}{wx{|yvojlou}~|z|xwwrqv|}|{vtvx}~}z{}}z|}{xz{xz~|xy}{|}yxuqpuxtpopnmmihknuzx{zsppqppqnpsty}~zy{yuty}|uuy|||xpmkkrx{y}}|~}vsw}~|}|}~~{zwrtuw}|tqqqnnjhlnqttplpssqsx}~zsppnpsrnnsvvvz|~{uuz{{}}zwux{{y{|vqppv~|z|~}|~|xx{{}~zxwuvz~~|{||~~{||}{|~{|~~|xuusnlpsqpruw{zwvropvyx|}xttrtxvutqptzzwx|~|{vqqty}{~}wrrpkjpwyzzutvw}~~|xyyx{|{x}~|}xw~~zz~~~yxyvusnlntsqrsroolknqwxstsmkmommlilpsx}~|~}z|}vuwxvupjhfglrtv|||||~~zz~~}~}}{utwz|sooollidgjntwupsvwvw{~yoiihkookkprsswz}}}{~}|ywxxuruwupnmlqx||{}}~}{|~yxz||}|y{||{yxvvxvvyz~{yvssrnjmpomnru{}{yvuy|z{|uonnotusspnpvxvx}zxvx~||}zywrooojfiouxzwtvx}}||zywstvw{~}y|}|}{vsw|}}~|yxyvtrmkmqqpswxwwsprtx~wqoojhilllkhhlov}xrqqpomgfedgloqx~}~zw{}|z|~|zxw|~z{}~~~wqoomkkfdfiovzyy}~|{|}}vkgeehlljlpqpquz|~}{xvusolorqnlkkoux|~}}{xx}~zz|~~~~}zxxvssrqux{xttsstrmkopomnqw|{~~{|~zsmkjnsttsompvwx}}zz~}yxxutrnlmnifhmquyxxz}{zzxwuqqtvz~}~{zyy{{xsswyz||zywyyvurmloqqrx~}xuvw{~vpolgfimmmlhimrz{sonmlkidddehklnv~~|xux{zyz}~}zwux~{{|wrqqpnlhegjox~~~}}~|xohecfjlklqsrsw||{~zwtrrqniknomlllnsuz~~|xw{}{{~~ywxxutqorv{}vrrqrutpmprqoquz|{~|}~{|~{tnkjmstuurqty{{|{}~{xvwwsrolknnjginrw||~{zyxwtpqsw}~~}||xvvvwz{wuwxxy}}~{xxxz}{xuqorvuuz~yxwy}ytrnhgimnppmmqu|}||wqnnljjgddegjmnpy~~~~~|ww{|zy{~|x{~}|||{vv{{z{yutttrqnjlnry~~zz||{yrlifgjllouxxwz}}z{|||ytrqpqqmiknnllmnswy}{xy}~}~{{}~{xy{zxuqpu{}~~xsrrsvxurtwwuvx{}z{~|zyxy{{yy}~ztpnnsvxyxwx{|{}}||yvy}}zxwuwxusplkmomkmqux||~~}}{ywrruy|zzyxwtrstw{|zx{|{{~|xww{|yyy|~|ywx{yxz|yxx{}{z~~|ywtmjkpsuurqrty~~{yyzwrooomkhdefinrssx~}zxz||z|~}|~~{zz{|zvvz{zz{|~{}||}|||yvwzzyxsqrsw|~~~~zxyz{{xspnkmopquz|{z{~{wvuturooooqrolmoomnqsy}~|{}~~|yxz}|yz}~~}zvwz~}yxz~~xtssvz|{{~}zz{~zwwxxxwtuvvxzzxz~|xvtuz|}~|{|~}{}}zywspsxxvuuuxzxvsonqtsrtwxy{{}}~~|yxz}~zxxxwvtpqsvz}~}zusrtx{}}}||}}~~{z||ywvwvttx||{||}}|}{ursvwxxttuvy~}}{yxvtuxvrqrrpnkhilotwwvz}}|{zwux{yutuwyxuuxzyy{}}}zyy}}{}zvuvx{~{y{|{{zxy|}zxy{{{{wvutuvvuw|~|||yusrppolmnortspqstssvx|~~{y{~~~{zz|}zxy}}|}|{|||{wuw|{xxx|~~}vrrsssrpprux{{y{}~~}}|yz~{ywvvtpmpsutuvwz}|{xutwywvxz{{{yz}}~~}||yvvxxwvrpsvz}}||ytrqqtxz{}zz}zwsrrroorvwwy{}~zyzzzyvttux{||}|{|zwusrtwvssuwvurnopswzzy|~|}|{zvux{{trqrvxwvxz{z{~}yy|}{yxxz{ywxz||||yvwyxwvtuy|zyz}~}|}}}}{xy}}|{{}|wtsqonljlnptwwvy{{xxy{~~~|||}~}zz}~~{xxy}~{z}~~}zz{yuux|~~}vqopppommpsw{}}~||~|xvxzzzyutttuurnnqrstvx}}z{|yxy{|{zvuwz~~}{{xuvyzzyvtvy~}{{zxvrqqrtwyzzyz{{{xusrqqpnlosuuwz}~}{yussstvvtuz||zzyz||yvsqswxvx{}~}ytsstxzzyz}}||~~~}|ywy|~wrqqtwyxy}~}}|yvx{{zyyz}|zxxyywvz||zywvxxwvtsuyzz|{{}}{zyxy|||{zyz|yuttsqokjloty}}}}{{||z|}|{}~zxy{}}}~~}zyy|~}{z{|ywx|~}~}{yz{ytpopoonlmptz}{{{wsqqrssrppqruvsqqsssuy}~{xxz{zxsooquz|||~}zwwy|~}zz|}zzyxwtrrsux{}|wuuutsqopppqpnnqtuux|~{wrponopomotwwvwxz~~{yusuz|{}}xvuuwyxwxzyvtvx~~}~~~~yutsux{{~~~|{{{{{ywx{{zz{|~zxvvurqtwxxxwwyzxwvtux||~~|||zwutuxxxxwvwzzwuvvtrolmptz~}{{~{wwxwwy|~~}zxxz|~~|zy{~zyz{yxy|~}{yz|{wtrrpomkknsy~|{{xsrssssqopqruusqrssrtw{{yz||{xsppquz||}~}xuvy{||ywxz}~}{ywtpoprvyzz~|yxxwvspqrstsomorssux}ztqqprsrpqtvvvwxz}}|yvstwxwz}}yxwxz{zy{|zxvwy~|z{~|xussuxxy}~|{||}|xwxyxxxz}|zzyvtuxxxxxy{{zxvttwyz{~~{xvvwyzxwutuxwttuvvtpllosx|~~zxxwutwz|}{xuvx{~}}}~}}|{~~{|~{yz|{zz|~~|zwvxywtttsrpnmorw}|yyvrppqpomkkloruvuvxxvvx{{yzzxvqmllosvwy}~}~~zy{~}{{|~|{{zxvrqsux|}}|xwvtsommnqtusrsvvvxz~{tommnoommpqrrsuy~}zyzzy{~|zyyyxvvxwusrsw}~~~}~~~}zyyyz{||~}|{zzywwwxz{zxz||{{|~|zyxvsrtutstvy}~|zxy{||~|xtsrtwwvtqpruuuvyzzyvrqruz~}{wuutqoqtwyywuwy}}zyzz|}|{}~}{xwy|}}}}~}|~~}~~~|zvtsuvuvwyxwurqsv{zwuronnnmkigilpuxyy|~~{z{}zxwvtrnkjiknpqty}}}~~~|{|~}{{|}}{xuuwz}~zwvtrokiknrwyxxz||{|~yqmkjlmljjmopqtw|~~|{}~{yxwwtrrttsqpprwz}}|}~}}}~{zywvsqqsvy||{}|zyxxvspqrrrtvz~~~~~|wtqpqstsrqpruwwx||wuuw{}}}|zxvtsrnkloswzyxy{~}{wuuvy|~}~{zz{zxutvwwy{~~}zxustvxxy{~~{wuvx|zwupljkklljikmrw{}~~|wttsrplhffgjmpt{~||}|{{|~zwvw{}}}~{yyz}zvtrqomkmosx|~~~~~zsnjhhiiilorrsuz{ywuutrprsqomlnrw{~~{|~~~~|zwurpnoruy}~|zywvtrpqtuuvw{~ytomnrtuutstwyz|~|{{{}~}~~|{|}|zvroonllnquxzz|~}zwtrruy}~}zyyzzyvrqsuwx{~}}}||}|{ywwxyy{~{yz|}wsokjlnpomkmptx|}}~{wvusqmhddfimopsy|xwyzz|~~||}~~{z}~~~|zywy{}}~}{{~|xvvvvuroorv{{smighkmmnqtuwy{~{{}~~{wuuuvvsonnnmmoquxz}~|{}~yvvvuuspqsx~}wtstvwvwxxxy{~|||~~}zvrppswxxwwxz{zyz~~{zyzzz|}}}|||}|yurooqrqoprvz|||}|zyxwuuvy}}zz{||zxutstuuuwyyxy~}ywwz{z{}}{|}|~~~~~}ywvtqppqrtsqpqsw{}~|xtqnmkihjklnqsw|~|{zxy|~~}~|zyxxyyy{~~|yxy|{y{~~|}~}~||}}{yxwvvvx{~~{yvrpoooooptxzywxz}{ywvwwvuuuspnlmprsrrsx}~}~}|~{yzzxy{|{xusuwz}~}~~|xuuvy||zy}~||~~}|z{|}~~{xxz||zywvx|~~|yyzz{}zyzyvsrv{}}}zwwxxwwvuutttvxxxyyz~~~|wwz~~|{{{|zwrooqtx{{yy|~~~~~zustvy}~|{|~~~~|}~{z|}{yz~~xttwxwurpprx~}||}~~~~}ytqqrrsrnkkosvvtvz~}wuwy|ytstwyzxvtuvwy|~}~~||~~|zz||}}~zvuuy~yyz{|}zwtruwwuuwxxz~~xuuwwwurnmnpqrsuvttvy{}~~}}~}|}}||}~{xwwz~~}||~zutux}~~~{wwy{||||{{}~}{xxz||{yxvvxyy|~}~~|{z}~~|yustuuuvywtstvz~{wx{|yvuvwy|}|~~|{|}zxtrrqpquxyz|~||~{yyzxvttsrsux}~{xwwy{~}z{~|xwvuuvxyz||zz}|z{~~{vsuvvvxzyvtsssrrsttw~zxvtuy~}zxvvvurppsvz|}}}}~|ywvy}~}{wuw||z|~}|{|{z|~{|~}{yvuuy~~~}|zxwupljkmqvyxuv{}|ywx{~~~~xvx{|~|zwyz{{|}~|}{wvy~~zvsstx}~{}|||||{vpprty~~ywy}~{vstwxxxuonprsvz~}{ywvw||zy{~}{{~~wrrrtvxwurt{~}zz||{ytnklnrv{~~{wwy{{zyxvvwx{~{z|{ywtstwzyxy{}~xutsty}}zxz~|vqpqrw|}}}|zzzz{{{z{ztnmoqruy|{y|}xvwz{zyzyusstw}~|z{}{yyy|~|{{{}{xx|}|||vqponmorttuy~~}{zxy}}~{xyyxy~}}}vuuw{}{}}}{{|}~|vvvvwx{||}|wssrqsw{}}~{zzzyustwywvwvrponosxzzx{}|}~|wttxyxy|~}zywtwz{zvvyz{z{}~~}|xspolmrvxxw|~~}zyz|||||xsrsuy}|uqpsusppsx|}~}yvyzyz{{{yz}}{yvtx{{||zwwz}~{{~|{y}{urppsxyxuy~|y|{xwy{{{{wqqtuvy|}}~~yx{~{vv{|}}||~~~}zxx{{wvx|~zvussuwwsnou{~}zz|}~}}~zyy}yvwxz~~{{~|}}zy|~~~yvvz|ywy}|{zxy|}xw|~|xwwvxzzwux||~|uqquxxwwrmnpqsvxyxux}}yvvxysmmqx}}~~}~~{wx~~yuuwy}}~~}vuutstuusrv|zwx|~}{{wtuwvvz~}{zxwuokkotutwyvsuvw||y|{{}}~}{{xuttxzwttw}}{}}}~|yy{zxux|~|}}~{utw{|zyzvsttstz}}zx}zvuwz{}}z|}}{z}}xsruz}}~}wtvxwx{}|wuwxwutwzz|{{~{vuy||{~~{z{ywz}||~~{z||||yy{xsrsw{~}yz}~~}z}|{}~}~|~~{}}{{{wy|~~}}wuvxwuvvqmmmmpv{{wu{}yz}~ywyzvqooqrsvyvuy|~~}|yy}~{zyvv||yz~|zzxwz}}zsrw{|zxy{~~~}|}ztqrsu{~z}vpmoqqrtqlnrsty~~{|{z}ytruywqoqwyxx{{z}~|{}~}~yz~{xz}}~ywyzyyzvpprsuz|}{y|{wwz|{{{xuwyz|~~~xvvyywxzyuvvuv{|x|~xrrrsz}{|}zyy||zz{vqswx{}{{|~yuwz{}~|}ysrtxxwwyvuwxy|}z{{|{|{{~}xxz|~}~|zyvomoonpsuvtv}~{{{y{vqqtwurqojkprtz{xy}~~||}}}{}~|}}{yy|}z{~}wwyz{~~z|~zvtwxx}zuuvssx|~}||{{{xrqpljlmlqx{|yy}}}ywyxsooruuvxwrpsvy~}{||z|~}}}{zvqqqopu{}|y{~|}~~~|||xstuuy~}~{z{~~|{yrpsvvy}~}zz||{wuy{{}}zz}zvw{}}ysrsrqv}}}}wvvuw}{y|}xvvxywxysnpstw}~|yxz||}|}|yz{tqpnotwxtory}~{z{}}{xwyywvvpiijjmuz||}}{|~~xw{||~ytsv|{vux~~zyzxw{{}~ywvuy}~{yywx|}|xu{~~zqjkkknsvwvu{~yxy~~vqprvwuutpoqqqu|||~~~~{z}~}~{tstrruwwutz~~}~}~xtvwvw|~||xx|yutsrv|{y~{{}}~}{{xttv{}zxx{~~}~xtussvyzywy}zyzxwy|~~|~}}vuvz|zxxupqsqqv{}{y~}ywy{xuw{|}~~~~|}{zxuuwxxuswyyvtuyz{{z||{}|zysoonklpstssz|}zwxxx|{vuxxsqrvz|}~xwy{{~z|~|{~}~|xwz{z||~zy}}}zwupnptvtpsz~{y{~|yy|zvttwwvuwuomooquyzyw||}zyz{{}}xwz~yyyvuy|{wrsy|}|{}~~{{|zxwvw|}z~~}zz|~~}xxzyy{||{y~}{}}{ytruyvqqu{~}}~zvxywwz||yux}}|}}}}{|{w|~ywwz{z{ztopqqty{zwv||yy}~xrpsx{}|{~~~{yz|z|~wty||ytrssv}||~zyz~~wssrqsvurnouz{zy|~}~xwyyz}~~zroptwwwxwtuwwy~~}~~~}yvvy|yvvx|~{xz{}z{|zz|{xsqvz{ywxzz{ysruyyxwupmppprvyyvu{|xx|~}zwwz}~yxyyz~|xz}}yutvy{}}}{{~|y{|{z}}|zz|}}}xvyyy||z~}}|}}zyzysopsvwx{{vtvwy}~yy~~zwy{{~~}}{{~|zzuqrrppuyzxvz~{z|~~yutvwvtvwutwy{~}~ywx{}}~zwwwtvz{|~|z{ywx}{vwxvuy{zvrsvwvttvwy{wwwwz~}~yvvvutvupnqsuy~~}}~}yvx{ytrsx|||}zx{|z~~~~}|}}xz}}zwuvwy{zyzywxwqmmnnrwyxuu{|y{~}{}~}wwz|~}zz}~}||zwxzyy}{}{wutty||~~~zuuvx{}z}}~wstvw{{y{xsqsvvuutppstuy~~~{zyxz}~|{{|zsqrrruwwusw}|{||{{wwy{yxvplmprv{ywy|~}}~{y{|}}{yy}}{zyvuw{}{yy{}~}~~zvvvvy}~|yw{~|xsqssv{|yyyxz|~~}~~zwtnlnoosx||y{~}}~{vssvxxxzytrtux~~~|}~}yyyxz~~{{}}}{vpoonnqtwvtw{~~|zzzz|wvwwx~}|}{utuvy~~{~}}|z{}}|}~|z{|z{~|vuvvvy}~}|wvvtuy}~}|{|}{wvvxxvvvrnmmnrw{|{z~}}|{xx{~||~}~~}xwustwzyvsvy{{zz{{|~}~}{{ytonllotyzyz~}}~~}}|wtuxy}zurswxussx|~~~|wvwxwy|}}{z~}zxvtuz}}~~|z{~~}{{}~yz|tpnmnrvwvty{z}~yuuwxxxxtpqssuy|~{{||~~~||~{zz}~{z{~ytsqqruvtpqv{}|yy{{}~~yvvwx{~~{{~~yxxvvy}}~~~}}|xuvy|{yy|}yxxww{}|yw|~~yxxwy{|{xy~~zutwzzyxuomnooquwxvw}}yxy{yusv{~}~~}{{|}{wux||yvuvxz|}}vrrqpqrtsrsy~||~|wuvvvy~~{xxxtpoquwxy{yuuvvy}{y{}{|{{}}||{xvvz}{yy|}}~}zzwttvvusty|~}{|}~~|xvwz{yxxuqppprwz{yx{}yxz}}}~}zz}~zvvy}zwwwvvxyxtrtwwwvwyy|~~~z{~|zyxwz~|}~~~zyyz{~|z~~~~yvwywssuy}~{wxzz{}~{y{~~}}~~~}{|~zx{}yxyzyxywrnnnnqvxvsty}~}{}}zz|{wsrsvxz||yx{}~}}|}{z}~}zxvuuy~{z}}xvuttwywsprwzzyy{~zvuvwy}~~||yspprtuuuqprtuw{~~}}||{}{wuvyzvstx{}~|||}|||~~zuux{{ywxz{~~xvwzzzyvqnopqtwxxwx|}yy{}~~~}zz|}~~~ywwy{{|}|xwwwx{~}zwx{|zurrtvz~|~~||}~~|wwyz{}~}{~~~{wwxy{~~~}~~ztqruwwxyxuuvwy~|}}zz{|~~}|z|~}~~}{ytpoppprtutsvz|{zyyz||wuuwwvttqprtvz{z|~}}|zzyz|~}}~~|{|{z{}{xxxyy{|{xvxyyvttvwzzwwwvx{~~|||yyxvssqnlmnpty{{z{}}|~|yxyxtrrtwxzzyuux{~}}zxxxx}}}~}{zxuqoonptwxvux|~|{|~~}}|yuuwy||zz|}|{yustvwz|~}{{}}zxvtty|~}}~|yz}~{wuuuvz~||~yvuvw{~~}~~zwuvwvvvrnortvz}~~~}||~}~~~~|{||wrqppruvtqqvz{zxxyz|{yyyyxwsmkkmpuz}~~}|}~{yz{}~}~{xvx{}{xy{~~~}zwwwwy}~zy|~~|wuttw|~yxxxz||{y{|xrljklnqtvwvy~~||~~ytrsuwvvvsqqrtw}}{{{}~}~yspppprtutsv{}}{{{||~yuuuvw{|{}~~|xtsstw|~~{z}|{{{|~~|{{zxxz}}{z{}~yuuuuwz{{z|~zxxwwy{}}|}yxyzzywvronnnquy{zz~~{{}~}{|~}|}~xwuttvwvtsvwxwvwxy{~~}~~|zwronllnrtuux~|xvvwz~}ywwyxutvy|}~~zvvwxy{}}{{}}{zyxz}~~~{{|~||~~|z{~ztqnmnqssrrv{~}||~|{}~{xvvvwvvuqnnpqtwzz{}~~}|~}{}zwusstvvtqquy{zyyz|zwuuwy|}|{~}|}|xvvvvxz{{z|}}}}~yvuwyyvvx{~~~}{xwwwwy{{zwx|~~~}{zz|~}zx{}zyz{{{yupnnopsuuuux}|{}~{wuvz}~||}}~~~|||}{wuvy{yvtttw{}}~~~~ytqqpqssrposx{|}~{wwwxy|~}}|wsqsvxxyywuuvvy||{}~|||~}{yxy{|{zz}~}||}~{zywwvusqquxxxxyz{~zwwxzzywtpnnnoquwwuw{~||~~~|z{|~ywwwxyyxustvvuttuwz~~{yyxxyzzxxz~~zwvvvwzzyvux|~|{||}}|yvvwy{|}{wsstuwyywuuxzzyxy{}~}}}}zxxz{{{{}}{wrpnmlnppomosvwwwy||||{{{{xuuuwy|}}||||}}~~{wvwxwvttttw{~~xutrpqrrolknpqqrtvzzwutuwyxvuw|}{zzyxvrnmnpqtuuuuy{|{yyz|~~~{{|~{{|}~}|~~|{{{|zyyzzytporssrqrtx}~~}|ztolkklnoommqtvvvx{~zwxyz|~~~}{wuuuuvxxvssvwwtrqqty}xvvwxz{yvtwz}|{{|~zutttvxxxvvxzzzyz{}{yyzzyxurpppqsvxwuuwzzyxwwy}~}}}~{{~~{yyz}yspoooppommosutssuvy~{wrooprtwz{zz}}zyyz|~}~}ywwxz~}xutttvwvsqqsusqopqtx~|yxwwwxyxwx{}}}}}{xsnlkkmorsrqtx|}|{z{||z{||||{wsrsuy~~~~|||}~~|zyz{zwtsstv{~ztpnmlmoponmpsuuttuw|~yuttux{}|{|~zuqqrtvxxwuvy{{ywvvvx|~xuuuuwy{zxxz||{{{|~{wuttvxywvw{~~|zyz|~~}|zxsnkklnqstssvz}|zxxy{~}{{|}~~}}~xusqqstsqnortutsstv{}xrnllnqtuttx}{vuuvx{|}}}~~~|}}|}|xtssstvwwvtuxyxvtrrtx~{zyz||zwvx|~~|{{}wplkkmoponorvxxxy{}||}}}{wronopruxyz|}|||~|||yxx{~xrpooqrqnlmqtusrrtvzzvttuwxxxxz~{urqpqsvwvuwz||{yxy{}|~~|wtstuxyxvvy~~{zz{{yxxyzywuvy|}|{{|}~xrmkkkmoppoptxz{zzz{~}zyyz}}~~ywvvwwusqsuvurqqsv{ytqpoopppooswz{||}{vtstvy{zxy}|yy{}~ztqopruwwusuy|{ywvwx{~|}~}~~~{yz}~}{z{|{wtrqqqpmmosuutstw|}xsnllmpssrqsy~}zz{}~|~~~~~~|~}xutttuuspnprtsrqqrv}{xwvxzzxuvy~~}}yusstvvusruy||zxxy|}|~~{z{~ytssuvxyxvuwz||{{z{}}|{|~~{xvx{}|zyy|}vpnmmoqpnkmquvutuw{~}zwwxz|~~}|~}|||}}{wtuxzxurqqt{~}wsrstvurnmptvuttvz~xvvvxzzxvw{~~zyz|~~|wroooqsvwvttxzzyxwwy~~{|~|{|~}~|}}zxy||{z{{zvqopsusqpqrv|~}vpnmnorsroorvyyyy{~~zxyz}}}~~~{{}zvttvx{zwsruwvspnoqv}~~~{zz{}}|zww{}}{yyz|{wvvwxzzwsswzzyxwwy{xx{}~}ztqpqtwzzwuvz||ywwx{~~}{|~}zxwy|{tqqqqstspmortsqppqu}~~zustux|~~{z|{yy{}z||xuttw{~|}|z|}xuvvwyzxtrsuvtqppqu}}zyyz|}|xvx|~}{yy{}ztnllmptvurrvz|zwuuvz~~}yxz}~yuux{}|{~~~~zwyzxurpopu|~wrpooruurnnsvwurrsw~yuuvy}~|~~}|~ytqrsvy{{yvwz|zwsqpqv|~|}}|~zxwx{}yz}~{xwx{{wvwy|}|xvy|}zwuuvz~{{}~~~zsnmnpswyxuuy}~{xwvwz|||~|yxx}ytrrsvxxtoptwvsonnpv}{soopsw{{yxz~~~ywwx{~~zxwy|z|~{z}yustux|~{wux{{xspoot{|zz{~|xy}|xwxyzqmllmqttrorwzzxvvvw}{xy|~~|vqopqu{~~~}}~}}wtrru|||wrqqrtvvsoptwvsqpprxyuuuvz~~{y}wqonpty{zvuy~|xvutw}}zy|~zz}zutuw{~{|}zyyy~{zyz|~{xz~~{xwvx~~|uolklotwvrrv|~}ywvwz~yxy{~}}|wuuuwzzwssvxwsqpopu|~|}vrpoptwxusv|}{{|~xuuvy~|{~}~z{|yx{~vqqrsw{}{ww|~{wutru{~{{~}}{z~~zyxy~ztpnorutqmouxxusstw~||~}wpmmnpuxyww|}||}}zxy{y{|}}wussuxywqoswxurpppt|zwvwz}~{wx}~~xsqqqtwywtu{~~{xwww{|xwz~zwy}}wtttuy}~{wy{zyz~}|}|xy~|yxyz~{sonmnrttpnqwzywvwwy}zyxxz}}{yxy}}wsw{|ytqppryzxy~~~vtsrtwxvqoty{zwwxy|zxwvx|~zx}~xwy~~wrpppsx{zvty~}ywwvy~zxz~~{|~~|{yyz|}{ywwyyupnrvvtqppqu}~}}}uonmmptwupqw|~|}~{zz{~~|z|{xy}{wwvwz}|xssxzxtpppqu}~z{~}{z}{wx}|zz{|zwuttx{zuqsy}|yvvvx~|{}|wuw{~zsqqruz}}xuy~~{yzz|~{~~zyyx{~{utrprvwuomqvwuqqrsx}}{wwwx|{|~{{|}~xy}~}xutsrv}|xx|~ywzzwwuvz||vqrvxwtrrsv~|zyz~yvz|{|~}{|}uooopsxzxtsy}}zwvwwz{xzzww|}{}}}{zy~}}zstxywrnnnpw}~|sqpopuwupnrwywttwy|~yzzz}~~|xx|~xvvvv{|vv{}{vrpppu}}yy}}|~|||~}x{~ywxxzzxxwy}~|vtx{{xuuvvy~}wvy}~}~zspqpqu{}zuv|{xwwx~~}yyxy}vuutvyzxroswwtonoor{~}xtuuuy~zy|yyyz|}|wvuuz|xx|~ywx}~xvvvx|~ytw{{xrpppqy~}|~{x|~zxyy|}uponnqwywrqw|}zvuuuy}~zww{~}vtuvy~~}|||uqqpou||z|~}vtsqrvxxsnqvxvrpqqt}ywwwz}{~|~wrrstx}}xw|{vttrsz~}ywz|xy~|yzzz}|}yxxw{}{yx|}ww|~yttttz||~~~ypmnmotyzwru|~zvwww|}|}}~}{zywvuvz}}wqtxywroonov}~}usrqtz}}yv{|{}~~xwxwz}~|{yyzwx~|wvy~xstttw}zvz~{vsrpqx}|~}}z~zxyxzzsqonquwvqouyzxttvuw~{y{}upqqqu{}|~~~~{wvsu|}ywz}}{utssvz{wqpuyxtpopps|~yywwz~yz~urrppu{}{vw}|xwwvz{wwzywy}ywwvw}z}~zzzy~~~||}xzzwwvv{~~}yqonlmrvwsosy|{xvwww~~{zzy|zzxwz~}vty}|wrqqpry}}|xx{~~zvvtsuy{ystz~|yz{z|yxvv{~y{}|{}~yvw|{sqqprx}}yuyyvvvtyzwx~~}|{zzyyzxurswxvpmswxuqqrrv~}}}}tppooty{ytw~~~~||xx}zy|zyxuv{}|vqtxywqopoow}~{z}|{xvx}~|vsy~}yyz{~wsrposwxupry||xuvwvz}wvy}xvw}}vvwwx~z~~~~}}|~{vtqpswwtnnuxxursuty{z~|yy~}vtusty}~{vz}{||{}yy~~yx{}xxwuv{}{uquyzwqoonov|||}{vtv}|z{{zyx{}vu{}z{}}}}}vttssx|}ytx}~ywwvu{|vssx|xssv}~yyyxzzvz~~{urrrsz~ywy}}~xwusuwwsliorrnjjllox}|{~||wttrrvz|ytv}}~}|{|{ux||ysopoou{{|}{vstz}yx{~xxwuvyzxroswwtpoqqr{}}|wqqomosusljotvsppqqs|zxy~~xttx}~xtuuv{|||{xwz||wqqvxwroppqv{z~zwx|~}~yrppopuyyuqtz}}xvwww}|z}}wuw{~~zsrssuz}|wqtyzwrooonsyzz|{vssx}zutw~{{{z{|x{}yxyz{|vuttv{}|wty~|wvwwxzvvz|wrqsxz{||vrstux~zw||wutssz~ywx~{xx|~yyxvx|}zsoqtsojhhhjrxy{|{xxz~{{~|vvtsvz|zusy}|yy|}~z{{{}{{vtsqrz~}~}yutv{|wtuzyvvuvy~~{trwyytpooos|~~~wsrpptwwsmnsutolmnot|~zy}zvuy|||}yrpqqsx}~|y{~~}{|ztw{{xsppppw~~||{yz~}vonnmpuwwspuy{yuuvvxzwy}~}~|uqqqpty|{vuy||xtrqpry}|||xtrtz{vssw{}}~xvwwx|{z}xwww{zwwuvz}}zux}~zxxxx}|{~|urswyxxxrllmmqw|}zw{{xxwx~{xy~}xwz~|wwwwz~xuy|zuolkjkrvwxywssv}|yy}xtuttw{{ytty||yvvwx|zxxx{|}zyxw|}xuvz}yusvz}}~wrrrsv{}|wuy||xsrrqrz|{zvutruxyvqptwvrnmmmqz~|yy}{xy|~|{{volllntyzwtw~~|}}~}{z}~zutsru|}{{~{|zromklpturnpvyxusstv|~~~wponnqvyyusx}}xvvuu{{vssxzuqpsxyyzxrnoprv|~{z|{{y{{yww{~}yuw}~zxyyz~{wwzzyywpihhhkptusrw}~{zzz{}{|~yx{xtuuvy~zx||wtrpqwzzyyurqtyzvuv{~vsrqquzzxrsx{{xuuuv{~{yxwx}~{~~~}}|xx|{vtvz{{{{upoooqvyyurw|}{wttst{|z|~xvuuwz{ysquyyvrpqprx}~}yxz|yx{~~~yqlkjjmqsropv{|{yz|||}~zyxx|~{z~~||zronlmoqqmjlrutrprstz{sponosvwtqtz}}zyyyy|xwz|xrpruwwwwqkjjjmswxutx~}|||}~||~}xuy}~|yxxy{~|~~|xqjhgfhlonkjouxxwwxy||{}xsrqrv{}|yx|{yyxy~~zurswyurqty|}~|vqppprvwvrquyywtttuw~||zyxz~}yx~~|xwy{|{{xplllmptusopuyywutuux||}}}yxwwy||yttxzzvssssw~}yy}{xy|~yrnljjmpolhjptvtsuwz~}|}~~}|{{~~}{}zsqpnorsrlikoqollmnqy~wtrpruvtpotxzyvwxz}~~|vtuwxwwtlhgghkopomntxzyxyz{~xy|~}ywwwy~xpljhikmlheinppnnqsv~ytrrqswyyvuy~|{|{~|yy||wsrtwxyywrnnnnquvtonsvwtqqqrw||~|}~}{z{}~zwy~}|}~|}~}ztnljjkorqnlptutqpqru|~{zyy{~~{vvz}|yvuuvz~}~zz}~yrnmllnonjfglnnlkmorz~}|}}{~}{{|~~~~~xtrqqsutpllpqokiiikpx}~{ywvxxwroquvvtstvy~||}|zyunigfehlnlhglqsrpqruy}}~zxwwx}~vromlnomiegkmlihiknw|vtssuxywsrv{}{yyz{~ywxzzyxunjjklpstrnnrutqonnosz~|xwwx~~{yy|~}yuw|~}zyz{~yqnlklnpokjmrsronooqw~~|~}|||}zxz}}{xvvvy~}vqonmorrojhkmmjgfghmv|~}|}{{~||}~{zyy|~|}yvuttvxwsnorsrnkihinuxy{{yy{~}}}xssvwurpprt{}umihfgjlkhehlnmkklmpw~|{{|~}|yxxz|xvttutpkhjlmjgffgjqx{~~~}{zyz|}{vtvyzxvvwx|}yqkihhkoqqnmptusommmouz|}~}|}|zxxz}}~~{vux{{ywvwx||vtqpqrrojimpqonmnosz~~{{~}|||}}}|ywww{xsqpprtspllopokhgfgkquwz{{{~~}}|}~{zz{~{yy|}|yvy~~}}~zxwwxz{ytqsuvspmmlmrvxxxwtsu{~}|}~{|}|xtrqpsy|uqmkkmmjfehlmkihijnu{}~~}yxwx|~{|}zyyy}~}|}~{uonoomigffhnuxyzzxx{~}~{y{~~{xuuvyyrolklnomjkostsppppsx{||{xuvz||}~}|{wwyzyusssv|}yxwwyxupmnppnlklmpw||z|~{z|~{z{|}|{|{xvuvwvrnnqsroljjjnsvvvusrty~}~|z|~|||}|wux{|zyyz{|yxwx{~~{wwyzxuqonosy{{{yvttwzyvuw|~zxvvz~~{xvusoigiklkihijntz|}}{xxzzwvuwz{zwy}}}}zyyy~~}~}yyzxtokihintwxyywvx}||~~~~}}{zz|}ywttusokilpqpoopqv|~{wvwyywvx}~zyyz}}~~~~}}}zvsrrsx~|zyy{|{wtuvvtpmkkmsz}}|~|{{}~~}yuuvw{~}~~ztrtutronmmpuyzzyvrqsvwutw|~zy|~~}|{|}{y{|{xuuuw}xtsstwz{zxz~{wussvz}~~}{xx{}|xuvxz{||yvvx{~|}~wqopomigghkqx{}~}{z{}}zy{~{yxxyzwtrtx{{{{~}zz|}{zz|~{zzz|}|~~zvroosvwwwvuux|~}{{}|xxxz~~~~~~~ztqrrrollmnry}}~zustwy{}}ywwxxz}~|yy|}|~}~{wutv{}}|{z{||yuuxzzxusrqswz{|||{{~~zsoooquy{{z|}|}}zvrpopsy|}}|zwx{|zvsrtwy{~}{|}~}yy{|{xvvwz}{{|~zvttuy{vtsstvusruy|}}||{|}{z{~}zyz|}|{ytonnptz~~~{upljikqvy{|{z{~|{|}~~~|xwxyz|}|ytsuvvtssux~|vsrsuy}}}}|yxxy{}|zxz~~||{|~}{xtrtw{{yy{~|vtttvy|}{{}{|}{wspnmpv|~~|{{ywvrnlmosw{|zxx{}}{yyz}|wtuvy~~|}}{|~~~}~~|wuuwxwvuuux}~{xxz~{uqonoqrrqsx}}zwvx{}~~|{{~|yyyzyxvqmmosx}~~|yvttuz{yxxz|~}{{|z{}zxwwxvsooruuutvx{~|}|z{}}xrommnprsstx~|xtsvxxxwwvwz|upnoquz|{xwyzyurppqu|ytrqqsuuttw}}}~}zxxxy{||yvwz|{zyyz}}ywxywttw{~|xvuuvxywutw|~~}zxwx{}~~~}|}}woigfgkpsttvz}}{yxxy}zurqrsvyzyxz|}}||~~}~{wwxxurpopsy~}~}zz}{xwuuutqmlnruvwy|{yyz|~{z|~||~}yrmjiimqtvwz|zxwy}~zyxy{||yvwy|}}}}zzz{|}{wsrsssqoopsy}zz|}~~zurqpqrsromoswyz|~|wwy|{wtux{|{{~~xtrpopqrqrvz|{yvtssw{~{wtssuutpoqtwxy{~|wsqrtw{|{ywy{|zxvvwz}wttvxz{{wutuwy{{yvtvxxxwwy|}{|~~}{|~xsomkkjhfhntxzyyxy{{urpqsuvvttx{|||}}|~}xuuvy|~~}yvsqpsw{}}{{}~|zyyz{|{wsqqrqonoqu|~xtsux|~~}~|z{}|vsqoooonkjmsx|~~}{{~|yxy{||zxxz|{xwvx{{xvvxz||zxxzywsponpuz~~|zvrqqqsuutrpqttsrrsv|zvssvz~}|zwuvx|~{yxxxxvrnlnrtuuvxy{~|z{}}zyxxvsqqsutsrrsv|}vronoqsuuux{}}{xwvwz~{ywtqonpruy||zyz}}|xvuux~~||}||~|zyxwvtojghijkmquy~}yvttutrqrvyzzyyz|~~{vsrrtvyyyz}|ywwz|}||{yy{{vsstwy|}|zxyzyvsponqv}~{xwvutw|~||}}}}zvtsssuvtqnmoppoqtx~~}~~}zy{~~}}}}{xwz|}|zyxxy}|zyxxyxwuux{|{xvttuy{|}||{}zsnmmortusqruwwusrsty~|{zxvtuz~ywwxz{{xwwyz}}zwwvtqnmnqw~{z{|}{z{~}xtstvvutsstx}|xutsssqnloswzzz{{|~}umihilqtvvwz~~|{{{~~zy{~{yyz{|}|yussrplhfgjqz}}}}}|ytqqsuvvvxy|~zvtsstvwvtstx{}~}zxxz{zyy|~wrpoqtwyxx{}~}{xwvwy|}}}}~~wssuxy{}|xspoprtvwussuvvsqonos{~zxyz{{{zxwy{~{yz||{zzz||zzz{}}|yutvwwvvwxz}|zxy{~~}}ytpnnooooruwxwvvwy|}ywwxz|{wrnmnquy|}|{}~zvsqpsw{~zxxz|}~~{zz|}{zyvtsstw|{yxxxyxvroopqpprtx}~}}}xtqmkkkkkmrx{}}}}|{|~ytrsux{||zyz{zxurommpsvy}}yvuuwz~~{yxxvtsrsv{ytqqrtvwvttvwxwvvy|~}}|yvuvxz|}|zyyxwvtrpoqvz|}|{{|~~{z|{vssuyxqmlmorssrtvyyxwvvvy{}}~}|zywsnllmqvz}~|zyz|{wvwy|~~}{|||zwtssv{~|}}{yyz|~~||}}|zwrlikortttuvy~~}~~yvvyzrmjjlortux{~}}~|zxy|~||{zyvsppqtx|zvtux}{yxyzzxuuwwurpnnqv}~~~{wtrstvwuqlggjnqsvy|}}~}{}~yusstuuuwz}~}zyxxz|}|zwutw||wsqqqsuuvvy}|xutux}~xtrrssssuxzzxwvvx}|yxxxxwtqnnorvz|{vrqqstvxz|~{{~{xx|}xtqomllnsvwwwwxz~~{|zsnkiijlmnorw}~~}zyyyyyz}~{yxy|~{yyz{|{xurrsvz}~|xuspmllnquz}zy{~|yuspnkjkpuz|}}~~{yz{|~}xrnllnprsssv{}zwuvxzzywutuwz|}|wrommnpsttssrpljilpw~|||ytqpsvyzz{{|~|zyyxxz{vsqqqrqomnqtwy{|}}{vqoptwyyzz{}|zxuplihhjloqsvz||xtqprw~~~~~~}wplkmopqsuw{~|~{snkjjkjighkoruy}|yy{{wvx{}~~}~}{yurpoopqsttux|~}xsnklqx}~~|{{||{{}}|}}~}ytommmoqsw{zvux|}wrommnoonnpsuwx{~||~|zyyyxxxy|~||~ytqonnnmljknsvwurolmrx~}wssux|}||}~~|z{}{ywvtstvy~{wvwy~|yvutsqonoppooprv|}zy{~zwussstvy~zrmjhhijjihimrwz||zxxz}{urqsx~~{xsnkklpv}~~~|xuroliggijkkkmpv~{vsrtw|~|yyz|~ysommnpqponpsuwy{{{zyxwxy{}|xwwz~~{zyz}~|{{|}|{zzzwsollou}~zwutstuvvtspmkknpqqqrtw}|zyy{}}ywwy}~~~xtrqqqomjjkllmorux{|{yyz}}wsppruwy{~~}|~}yxxy{|}}|wttw|}zvsqrvz}~}zvrpqrqponmosx~~|{zzy{~|vsrtz}vqmlkjhgfgiklmosx~~}~yvsqqrtvy~|wrpqtx|ysqsvz}|xsmkkkjiiijnsx~|zxwvtsruz}{}}|}~~zwsqpponmnpqrqqqsw}~yvvz~}{zywvx|~~~}{ywwx{}}|{xvuvy||slhhkpuwvspoooooopsv{~}||}~~|zxy~~~{yvsommnnmkiijnt{}yy|~|zxtpmmqv{~~|{zywvwz~}vpljlpv{}|{zxusqppqsvyz{|}|xwwy|~~~~~}|zwsojgghjjjijkou|{yxxxxwtpoqv{~}~~{yxy||wspoqtvxyywsoliijnrvxz{|}|||||{xusstvx{~{wtsuwyzxuqnmnpqqqqqsvz~|yww{}}~|xvvxy||yxxyyyyz|}|}~ytpljhhjnswxvronorw{~|xvuwy{}~~}|}}}||~|xuux{~yusrqpomllnpsvxz}}zz}|xusqppqtx}~yy{~}ywwxyzz|~}ywutromklov||yutuxz||{zyyz}|zz{~~{xvw{~yvvwz}}{vspnljihiknrvy{}}}{yxxxyyxwvvutstv{{vtw{}zy{|~~~}|zuplmqwz{yuqppsuwxxxxz|~zxyz|}}|zz{{zwutuyxromnquwxwvutrpopqtx|~~~}}}yvvx{}|{zyz{}~~~~|yvvy~~{|}zxwvx{}|{zxtojffimrvwwvwx{|~~}vrpqtwyyz|~}|~|wtrrtwz|~~{vsppqsvxxxvuux|~|{|~~}||}|yvrposy{wuwz}}~~}|zxwxz~}ywvvwxwtqnmmosw|}|{{||{zyz|}ywwx{|}~|{|}zxvuuuwz{{xtolklptwyyyyz||zxxyyyzyxwuuwy{{ywvux}|xuuvy}~{xwz~}|}}}{xvspoquy}~{ywvwy{||{{}|yxxwwxz|~}|{zz{}}yvsqnlloty{{yvttvy}~|vqnnqtxz{{zz|~~}}|z{~~{zz}~~~}|zxvusokhhlrz~}~|xurpopsw{~}{zyxwtrqty~|zz{||{zyxxyyxxz}~wrqsx|~}}~~}|{zzz{{||uqrv{}{{|}{yxxxwwvvvxxwtqopt|~~~|zyyyyyyzz|~}{xvuw{{wsrsvxz{{yxwwwxxxxy{}~~}~xropsvyywvwwxyyy{|~~|{|~ztqsx~~zxxwwxyz|}~~}|}~zurqsy~{zzzzyyz|}}}||}zvtuwxyz{|~~}|ytpnmnoruy|~}|}zsmiilqtvxy|~}{z{~{z{~}{z{}~|zz{{zxuronotz}ywvwz}~{uqopqsvx{~|zyyyz{||zxvuuuuvy}~|{{||{xwvwxz}}zvrqqtwz|~~~|{~{wtsux|}wsrsvxyyxvuvxyzzzyxxy{~~|{{{zxuqnnosw|}{yxxxy{~|zyz|}|zxutsuy~|yyz{||{||}~~zuqoopsvyzzyxy{~{xwwyz|}}}}{wutx}yrmlnrvy{||}~~||~}yxxyzzywtsstw{|xvtuvz~}zz{}~}{yxwuspnnpu|~|zxwwxxvrnihjnty{}~~zwvvxz|~}zz}ytstw{}~~~~~}|{{{|}}{xwx||yusrrsuwyz{|zwsqpquz{uqqrtvwwwxyzyxvuvx~~{yyxxwvtrqrtx{|zvqopuz}}}~~|wssw}ytqpqrstvwyyyyyz|~{yuqnlkklnpsvz~~{yxzyusuwz|}~~{xwwy}|zyz{|}|{xvuw{~|vqnnpsuwy{}}zyxwvuwz}|ywz|vqnlmnpsw{~||}{xvsqoopqrtuvy}{xxz}~zxxyyyy{{{zxvtstvy}}yurppqtwxvsolklnrw{~{yxxwvvwz~~|yvtssvz}~|zy{}yvtssssrppquy|}}{xwwy||wsqooprvxzzzzz{}~|zyxurnlklnquxz{zxussux}}|}~||}~}}ytolmosvxyyz|{upnllllkjjlotx|}||}~}zwtstwz~~|{{zyvtrrrsuwy{}~~{vqnnqw}}zwuuvwxz|~}}|{ytoljlptx{~}{}|vqnmmnppppqsvz}~}~yutvxyzyyyz{}~}|||~{wtrqppoopqtwywsolmpw~|yxyz|}~}{xvvxz{}~|{|~~yussuwy|~~zyz~zwutttrqppqrstvy}~~~{z|zupnoprtvxz~}xsomkkkkklloty}~{wvw||xutuy}~~~}xtqoooqtx|{vrpnlkiijklnorv|}xsqqty}~{wuuvwy{~}ytqppqqrrrrsvz~~{wuvx||yxz}}{zyxwwx{}{zz{||zxvtqonnptz}{z|}~}{xurponmmnprstux{~zwvvy}~{xvvvx{~~}~{wussrqpnlmortwyyywwwy{~xspqsvyz{{{{{zzz{~}ywwwy{}~~~|yvuvy~|zyy{}|ywtrqrssrqqrty~zxwwy{|~~}zvrooquz{upnllkjiijloruy}}wspopsw{~~~{vrppsx}|{|~~zuqmkklllllnqv|}xurqppqsw|~{xvw{}~{vsqppppppqsuvxz}|z{}}zwvwxy{~~|z{|~|{zyxxy{|{yvsqruyztqprvyzyvronopqrstvy}}}}|zxwvvvuvw{~zyy|}|}}zxvtqpooooooqtx}~{{~|yurpnoqty|}~}}}}zxwwwwwx{~||}ytporw||ywvutssstvx{~~}{ywtstx|~{wuvx{~{wspmkiijllmnpty~{ywurpnnpu{~}}~}}}}{zzz{}~yutux|~~|yvsqomlmoruy|}zywvusqnlmpty}}|||{{{{{ywurpopqstttuw{~}}}}zwutux{~~{ywxyz{||}}}~}}}~xsnlmoruwxxwusrrsux|~|zxvuuuvwwvutsuwz}~}|{{|}}yvtssrqpppquy}|xsommoqux{~~|{|}~~}{yvuvwy{}{wsqonpsw{|ywwxz|}~}}~|{yyz{|}}{ywvuuuvx|}}}}{{}~~zuqonmlllmorvz}|{zyxvspooqsvz~yvtvy}~~~{{|}{xusstvz~}zwtrstwxzz{|}ywvvwwvtrqppooprv|~yurqrtwz{zxvutttstuwy}~zz{}~}~~~|zyxwvvx{|yy|~}|{zyz{}|yuqmjjlqvy{{yxxy|~{uqoopqsssttvvwvvx{~{xtrrtw{~|ywuttuvyz{|~~}~}{ywtronosx{vstvy{{{zyyyyyz|}{yxwurommpuz~~|wutuvwxyyyzzzxvuuw{}ywvvxz{|||{ywtqoopsvy{}~}}||{{zyxwwvvtsrrtyztqoptw{}~|{||yusrsvy|~~}|{z{|}{xvuttsrsstsrqpprw|~ytqonnpqsvy{|{yxwwy{~{wuttvwy{|}}}~~|zxxz~{xwwy|~~}|}}zvromllnrw{|wspnmmmoqsuwwxxy{~~~~}{xusqqqqrtw{}{|}}~}|||}|ywxz|~{yvtstw{}xtqpqswz|}|||}}|{zzyxwusrqqqruz}}}~~{ywutssuwy{{{zzz{|~~~~|zyxwvtttwz}~~}{yxxyz{{{|}|wuuvwyyyxxxyzzyxxwxz|}zwtpnnpu{~{zzz{||||}~~}|{yvttvz~~~~}}}~{wtrqrssttttuwyz|}}zxvtrpnlkmptx{}~~zsommoruwxz|~}yutvz~~}{zxvspnmot{~|yuqmllnpqsuwz}~|zwusrrrrqpooprvy}~~~~}xussuwz{}~~~~~}|{{|~}wspoqsvy|~}zxwwxyyyxwwwxxxvustvz~}||{zxxxz|}}|zwuttuvwyz|~|zyxwxyyyywutttuvxz}~}}~{vtrrrsuvxzzzz{|~~}}}}|yvsqopruz{vsqqruwz{|}~}{zyz}~}|||||{{{{}{xvussrsuwz|}~}}}~}zxwwwvurpnmmmnorv{|xsolkkmptx{}}||}~|zxwxz~}yvvwy{}~~~~~~~}{ywvuvwy|~|zzz{}~}|ywurponoqty}{uqpoopppooopqrsux|}|||}}~~~~}|zwtrqruy}}}}~~|xtqpquzyusrstuuuvwxyzzzz{|}~~{xtrqqrtwyz{||{zxwwwz}yusrsuvvvwwwwwvuuwz~~~~|wrpoqsuwyz|~}||{{zz{{ywtrrtz|vqnmnoqsux{~~|zwuttuvx{}}zwvvwz|~~zxvvuutsssrqpoopsw}}|||}}|ytplkloqux{}||{|||}|zz|}ywuttuvxz}}{z{~}{xwwwwxxyz|}}|zwuttvy|~|wsqonmmnprsssstvy~}|{ywuuvxz|~}{xutttvy|}{{}~{xvwy|~zwtqppqsuxyz{|}~yurqpppqrsvy}~}}~}~}zwusrrstvxyyyxxyz|~}}{zyyy{}~{xurqrtw{~|{z{|}~~~|{{{|~~{xurommnqux{}}yusssstuvwy}~}}}~~}}}~zwtssttuttsstvwy{}|zxwwxyz{{{zxurpopsx}~~~~}~~~~~}|{{|~}{xusstvx{|~~}|}~{yxwvvuuuwy{}~~}}}~{wspnnpqrstuwy{}|yusrrrtuwy{}~}zwvvx|~|{zyyz{}}|}{wsqqqrtvxz}}yvtsqpooqsuxz}~}{yxwy{}~zwtsstuvwyz|~|ywuuuvwxz{~~zwuuw{~~|{{|~~~~~~~|yvsqppqrux{}}}zwvttsrstvxz}~~~~~}}}}|{yxxy{~|ywvuuuuvxz{||{{|}{yxwvvvvwxz}~~}zxvuwy|~{wuuvx{|}}}}~~~|zxwvuuwy|}{z{}~|zxvuuvvwxy{}~|zxxy{~}{xusrqrsux{}~{xutsrrrrsvy|~}}~{wtrrtwz}~~}{xusrsux|~{xusrrrsstvy|~|yvtsstvy{}~~~|zxvvvx{~~zxwvvuuuvxz}}|||~}zwvvwy{}~~}|{yvtsrtw{}{zzz|}~|zwutuuvwwy{~~}|||||zxvutttvx{~}zxwwy{|}~}}}}}}~~~|zxwvuuuvxz{}}||}{xussstvxz}~~}{yxxz}|zxwwy|}{zyxxwwxy{~~}~~~~}{yxwvvvvxz||ywvvxz|}~}zxvtsrrstvxz}|yvtrrrstw{~~||}}zxwxy{}~{xwxz}~{yxwvuuuwz}~}{ywutsrrrrtw{}||}~~}~~|zywvuuvwyz|~}}}}{ywvutuvy|}{zzyz{}{wtstvy|~~~}|zyxxwxz|}|zywvutttsssstwz~~}}}}~~~}|{|}~~|yxwwwwwxy{~~~~~|ywurqqsux{~~~~~~~~~}yusrsux|~}|zzz{}~}{zxwwwwwvutttvx{~~}||}~~~~}zxvvuuuvwx{~}{zxvtrqqsux{~|zzz{|~~}||}~|ywuuuwy|~}{zyyz|}|zxvuuuttrqqqsuwz}~~}|{{zz{}~|zyyxxxxy{}~|{|}~~}|zxvuttvwy|}{zz{~}|}~zwusrrsuy|~}||~{xutssssssrrstuwy|~~~~~}}||{{zyxxz|~}|{zyxxy{}~||}~|zwutsssuwz}{xvwx{}~|ywutrrrtw{}ywuuuuuuuttuuuvwy|~~~~~~~~~}}{zyxy{}~|{yxxxy{~~}}~~~~}}}}||zxwvutssuwz~~yvttvx{~~}}}~~|{ywutstwz~{xvuuttssssssstuw{~~~~}{ywuuvwy{}~~}{{{{}~|zzzzz{{|}}}}|{zyxwvvvx{{xvuwy{~~~~~}{yvsrqrtx{~|xvtssrrrssttuuvwz~~}||||{ywvtttvwz|~~}}~|zyyyz{|~~~~}|{zywvutuw{~~zwutuvx{}~}~~}|{zywusrrtvy}~{ywvutsttuvvvvvwy|~}||||{zxwvuuvwxz|~~}}~|ywwwyz{||{{{{zyxwvvwy{~zwusstvx|~|{{|}~~~~~~~~}|zxvuutuwz}|zxvtssstttttuvxz}~~}|{zxvutttttuwz}|xuttuwyz{{|}}}}|{zyyz{}|ywutuwz}~}||}}~~~~~~~}|{ywvusssux|~{yvtsrrsttuuvwy{}}|{yxvuttsssttvx{~|xvtuvwyz{|}~~~}|{zyyz{|}~{wusstwz}~}|{{zzz{||||{zyxwvuttvy}}{xvutuuuvvwxyz|}~~|zywvvuuuutttvxz}zwutuuvxyz{|}}||{{|||||}~{xusrsux{~~|zyxwxyz{||||||{zyxvuvx|~{xwvuutuuvwxz{{|}~{ywvvuuttsrrsuwy|~|xutsstuvxz|}}~~~~~~}}~|ywuuuwy||zxwwxyz{||||||{zxwuuvx|}zxwuuttuvwy{|}}~|xvutttsssrrstvxz}|yvutttvxz|}~~~}||}~|ywuttvx{~{xvuvwxyyzz{{{{{zxxwxy{~~}}~}{zxwvvvxy{|}}}}}|ywuuuuutttttuvwy{~|yvtsstvxz{|}~~}}}}{ywutuwz}yvtttuvwyz{|}}}}|{{zz{|}~}}}~~|zxwvwxy{{||||}~~zxvuuttssssttuvwz}|yvsrrsuwy{|~~~~}{ywvvx{}ywuuuuvwxz{|}}}||{{{{{{|~}||}}~|zxwwxy{|||}}~~|ywutssrrssttuuwy|}zwuttuvxz|~~~}}}~~|ywvvx||ywutttuvwy{|||}}}}}}}||}~|{zz{|}~}{zz{{|}}}}}~~~~~~{ywuttsttuuuuvwx{~}ywuttuvxz}~}}~}{ywwy{~}zwutssstvxz{|}~~~}}}~~|{{{{|}~~}||||||||}}}}}}~|zwvttstttttuvwy||ywutttvx{~~}|}~}{zz{}}{xvutstuwyz|}~~}||}~}|{{{||}~~~}}|||}}~~~}}}~|zwussstttuuvwy{}~}|}~~|zwvuvwz}}|{{|}~}|{{|}|zwusssuvxyz|}~~}~~~|{zzzzz|}~}}}~~~}}||}}~~{xvuuuuuuvvwyz|}~}|}~|zwvvwy{~~}|||||}~~|||~}{xvtsstuvxz|~~~}~}|{zzz{|}~}}}}}|||||||}~~{ywvvuuuuvwxz{|}~~}||}}~|ywvwxz}~}|{zyyz|~~}}~~{ywuuuuvwy{}~}||~~}|{zz{|~~~~}}}||||||{{|}~{ywvuuuuvwyz{|}~~|{{{||}~}{zyy{|~}{zxwwxy|}}|}~}{ywvutuuwy|~~||}~}|{zz{{}~~}}|||{{zyyyz|~|zxwvvvwyz{||}}~~}|||||}~~|{{{{|}~|zxwvwxz|~~}~~|zxwvuuuwy|~}|||~~|{{{{|}~~}|||{{zzxxwxy{~~|zxwwwxz{{||||}}||{{{|}}|{{|}~|ywvuvwxz|}~~~}|zywvvwy{}}|{{{|}~}|||||}~~}||||{zyxwwxy{}~|yxwwxyz{{||}~~|{zyyz{}~~~~|zwutsstuwy|~}{zz{}~{ywuuvwyz|}~~~~~~|{zyxxxz{~~}{ywusrrstuwz|~~~}~~~~~~}}|||}~|yxxyz{|}~~~}{zzzz{||~~}|{zxwuttuvy{~}ywutuwyz||||{{{|~}{ywutssrqqrsvx{}~|zyxwwwwwwxy{}~}}||}~|zz{}}zxusqpprsuxz|~~~~~~}}}}|}}}~~~|{yxvusrstw{~}}}~~}||{{{{{{{|}~|zyxxxxxyz|~{yxvuuvwyz|~}{ywusqppoopruz~}zwuuvxy{|}zxwwwwwxz|~~}|||}}|zyxxy{~}{yvtrqppopqtwz}~}{{{{||||}~~}|||}|zxwwwxy{{{{{{|}||zzyzz{|~~~~}|{zzzzyyz}}yurqqrtvwy|}~~~~~{yvsqpppppqrtvy||zyyyxwvvwxxyz|~}~}{{}~}|yvsqppqrtux{~~|ywwwyz{{{|}~~}}}|zxusrqppqtx}~|{{{{zzyzzzyyy{|~~~}|{zzz{|~}|{zzxxxy{}|zxwvvusqqpppprtx}|yusrssuwz~|zyxxxxyz||}}~~|{zzzzz|~~~~~|{zyvspooppqqsvz}~{xvuvwyyz|}~~}}~~{yxvuuvwwwwwy{||{zyzzzz{|}{z{}}{z{~~|xtqooprtvy||ywtrpppppoprux{}}{yxxwvuvvuttvy}|{{}~~~}}~}}|{yvrqpqstvy}|zwtstuxyz{|~~|{zzywusssrpoorw||zyz{{zxxxyzyyz{}~~~|zyz|~~||}}}}~~~}|{{}~}|{yvuuuvusrrssrqqsw}}ytrqrrrsuy~|{zywvwyzzyyy{~~~|zyyyxxz}}|{zxuqppprrrruy}~}zvsrrtvwwy|~~{ywsqqstttuvy|}}|{z{{{{}}{yxy{|}~~||}~}~~}zuqooprtuw{~{zywtqpqrqppruy|~~{yyyxusstsrrruz~~{{{{zzyy{}}{{|}}|xtrrsvwxy|}{wsppruxzz||xvuvwwusstsqppquz~~|zz|||zyxxz{yyz|{yyz}}|{yxy{{yz}~{zzyxurrsuvvutvvutstx}~~|xtssrppqtz}{{ywuvwwutuwz}~}{yyzzxwy}}||{zwsqqrsuuux|~~||{{yurpqrtvvw{~|zxtqprssqqsv{~~|{|~}}~}~{wvwzzz}~||~~|zz|}|z{|}|zurpprtuux~~|{zyvsrttsqqsw||yxwvspqssqpprw}~{yz{zyxvwz|{z|~}yvvwxzyxz~~{vqoprvyz{~~~~}{wsrstvwustvvsqqrw|~~|zz}~~|zxx{|zz}~~|xvwz{zywvwyyxy|}zzzywspqruwxvvx{zxwwy}~}~}{vtutrpprw~}||zvrrttsrrsw{}}|zyz{zxz~~~~}zusstwzzxy}zxyzzyuqopruwww{}{zywroqsrqqsv{~~}~}}~|ywxzzy||{}}|zxvwz{yxy|}}{vsrsuxyxz}||||yvvwwutuw{}ywvvurprsrppqtz~~|zz|{zxuux{{yz~~zyxy{|zy|~ztqqrvz|}|{{zyuqpqruwvtvyxuttv{}|~}}~||}|z|}}}}~yvuwzzyxuuxzywy}|{{zyvqpqswzyx{~~|yyy}~}|}}ywyxurqsw~}{{zvqrttqpprw|}~}zz}}{|~|{}}xwwx{|{y{~}}yxzzyxspqqtwxwy~}||{vrrttrqrtz}~~|}~~~}|}}yy{|z{~|y{}|zxutvyxwx|~~~zvwwx{{yy~~~~~zz}}zxxx|}zxwxwspsutrqrtz~}{|~|zwuw{{y{|{z{}}zwz~~|{|}~xttux|}|~}{{|zyupopruxwuw{{yxxx{}|{||{~~~}|{|}{yww{{zywuw{zwy~~}~}|ztqrtw|}{{|{z{~}~~}}}{{}|xvvv{}{z{zursusppqsx}~~}}~|}|{{||zyz|~}y{~~|{|}zxz{{zvrrruy|{z~}}~}wuwwustvy~|~}xxxy}|~}}}~|~}{||zy|~{zwtswywvy}|zzy{}}zy~}~{zz|~}~|zxyyvstwwtstu{~~~}~}}}~{ww|~|{~~|{z{}|xwz{yvwx{{yxxz}}{|z||zyuppqswzyw{|zzy}}|{|||}{yyz}~|zxy}}|{xvx}}z{}|}xuvvy}~|{|{zz~~{xx|~|{}~~~~zyxz~|{z|{xstwvrqqsx~~}}}{}}{z{||{}~yy}~{xxx{|z|}||yuuvx|~}{~}~~|y|}zwwwy}{|~}|ztsuvz~~{}~~~{|~{zy|~}|yutxzxw{}{{{}~yx|~}{}~~~||z}|z}|z}}}{|}}xuy{zwwxy~}||}~}{|~{|{{zz||xsvxvssuv}|{z|~~z{|{}~||wrrsuz}{y}}{{z~~{|||{}}}}||vuuv{~}{}}{~~zz~}{}~}|}zxxx|~{}|zzx{~|{yutx|yx{~}|zz}|{{}~{vwzxtstu{~|}zwxy|||{}~|{~|wy|zvtuuz~~{xyx{||~~~{xxx}~}}yy{{zytqrrvz|z{}|~}}~~~~{{z}}xvy}{y{{|{|~~zwz|zvwxz}|z|}yvx|zwy~~~}z}~zyyz~}|~|}~~{|zzxxzzvqtwurqrsz~|}~}yx~~{||~~}|vvvw{~}y}}{{z}}xvy~|{~}~}~~|}~}{tsssw{{y{~|~|}}~}|{{zy{~~zy~}yxvvz{yyvrsxyvw|}{||{~~|}|}|x|~|xwww}~~~{|~}{ustuy}~~~}}{}~{uvyxurssw~z{z{}z~}}~~~{zyy~{{~}wvxzyyvppqrw||y}|{~~{wxy{|~|}||{~{z|}z{y{~}wtxxvrsux~}z{}|{wtvzyuw|}z{z~~}}~|~}|z|yvvtvyxsquvspqru}~|}~|vw{{xvxy}~yyxy}}z}|zzx||{ytsw{xw{}yz}{{ysrrrvz{x{~||zzz{~}}|}|yz}}yw{}zuttsyzyyvrrwyvvz~{{~||xvx~~{|}~~~}|yyx|}{~}yy|{zytprru{~}|}z{|zutxxuqrru}}|{{~}y|~zxzz}{yx}}~{wv{{utwyxxwqprrw|}z~|z||z{wsuvx}~{~~}}z}{yywy{ztrvwtpqrv~|{xz}{{zusvzwux}}{zz~zy~||~~yy|}||xststwxtptwuqqrt{|}~{tswxvsuvz|{zz~|x|~ywwuy|zzwsrvyvvzyxz|zzwqrrsx{{x}~{|yvwwz}}~|y{|ysuyxtrsruzyyxtsvzwvz~{z}|zzvsu{{xy~~{{y|{y|~yvwzzyxropptz}{|}{y{|xsuxwsrssx~}|z|~~yw{|yuvwy|{xz}{zyutwzvsuyzyytqrrv|~|}|yz{yywqrstz~~{z{zvvtuxytquvtppqs{|zxy}|{zvtv{yvx}~{zy~~~{ww{}zy}ywy{yzvqrqrvxuruxwsrtu|~{{|ztrvvtqrtw}|z}~{wy|{vstsv{yyxsquyvux~|yz|{{ztsssw{|z}{z|~||yttuv{~}{}zyzxsquwtqqqsy{z{xuv{|yz~}{yz}{zxtruzywz~|zy}~~{wvy{vtvyyyxrpqquz|z}}{y{|ytuyyustty~}zz||wtwzxttuu|~{xwzzyyvstxxttx{{{yttuv{~~{zy{{yxtoqru{~}|~z{~}|{ursrtwwrquwtqqrt||{yz~}}|xvx|{xz{zwz}||zvux|yx{{wwyyxwrpqqtxxttyzxvvwy|{y{|xrruurqrty~}{z||xsuxwsqrqvzyyxtswzwvz}z{~~}{vtuvz~|~yxz|{{xsssuz}}{~|yxyxspsvtqqrsy||}{yy~{z~|zyy}|zyustzzwy|{xz}{{yutwzvsuxzzzuqrruz}|}||z|}|wvz{xvwwz~{ywyzwsuxwtstu{}zxvzzyxussxyvuy}~}xwwx{~~{}zy{|zzuqqru{~~}yy{zzxspqpsvvsrwxurstw|{z}~zy|~|~|ywvz|{{xuvz|yy}ywyyxxtpqqsxzxvz}|ywxy~~{{yz|zttwwtqsty~|zyzzuqtvuqppqvzz{yvuy|zy|~}}xxyz~||xx{{zzurttw|~|}}{yzzvqrvurqrsx~|{~~{}}~~~{zyy}~}|xuvz{y{{ywy{zyxtsvyvtvz{{{vsuux|~|}~}}|}y{~~{yzz~|zxxzytrvxvstux|zxz|zzxutw{xwz~{xyxz~~{z~}}}~|{|~}|ysstuz~}}xxzzyxsopprvwtswzxvvvx~~~~}}}}|yxwz|{{yww{}zz~{y{|zzvqrsuy|zx{}zyyy}~~~~{zz{}|xvyywtuvy~{ywyyvqrutqppqu{{||yy|}z|~}~}{{{~}~zxz|||xttuw{~}}|z{|zusvwussuw~}~|{~zzzz~{}}zzz}~zx{~|z}|ywvy{zyvsswyvuw{}~}ywwwz}~{|}~{{{}{yxzzwtwyxvuvx}{zz~~}|yvx|}zz~{yyy{}{wy}}zxyy}~}}{vvvx|}}{xxzzywrppqtwxvvz|{xxxy~}}~}}~~zywz~}}|yx|~||}~~}{vtuvy}}zz~}zyxy~|z{|||{{{~}yz}}zwww{{yxwyxuqsuurqqrx}~||~~|}~}|}}}|~|||}}|z|~~~{vwxz~~}}|}~}yvy{yvvwx~~}|z|~~~|wuvwz}}z{~{{{}|}||~|xwvx{{zyutwzxwy}|xxxz}~{y~~}|~}|zz||zvx{{yxy{~~~}|}}z{|{~{yxxy{yuuxyvuvvzzyxy|~}{~{xy{{zytqrsvz{xx|~|yyyz~}}}~}zzz|~}{zz~~|}~~|xwwy|~{y|~}yxww{}||zww{}{z}~||}~~}yyx{zyxwyyvsuwvsstu{~}~|}}{|}}}}~}}~}z{~}zxyz~~|zzz}{|~}zxxx}~|~|yy{{{zusstwz{yz~}}}}|~}}~|}{xwwz}}|{xwz}{z|}yyyz||xx{}|zz{~~}||{~~}~}}~{z}}{{{}~~~}}~|}{xwvwxwsruvusstw}}{zz{}{y{}|||~~{{}~}|xtuux{|zy|~}zyxy}}{|~~~{wvwy}~}|~}~~}}{yyz|}{xz}|xvutxzzyxuuy{yy|}|zyz~~{yyy{|yvwzzwvvw{}~{{~~}yvwx{~}~~}|}~|xwzzxvvw{|||}}~{yyz~{{}|xvwyyyvrqrswzzy{||~|yyy{~|z}~{yyy}}{{~}{}|yxxy{zvuxywvwx{~|{}}zy{~}{}~}||}~}}}|~|wutsuvtpqttrqrty~~|zz{{xvx{zxxxz~}~zxwxz||zy}~|yxwx|}||ywy}~|}~}~~~}zuuuwz}||~}~}}|zyz|{wwyzwtrrswyxxvtvzzyy}|zxz~~~}zz||}{zz{}~|y{}|zxxy}~}}zy{{{zvstux|~}}~|{{|zvuxywuuvz}}}~|}~||}|zyy}~{xxzzwuvxxxvrqrswz{z||{{}||yuuvx{|{y|}{{{~}}|xwvwxwtqtvuttux~}{yz}~}|zxz}}{|}||~~~}{|}}|ytrqqstsopstsrsty~{zyyyurtwwuuvx}}zyy{||yx{|zwvuvyzzywvw{|z||{}}}|wttux{}|}{zz{~}~}{yyzyvsuvurqqquxxxwuvy{zz}|yxx{{zzxwy}|{|}|}~}~~|zyz}~|{}}zwwyyywsqrtw{}|~|zyzzwtuxwuuuw|~}|}~~{y|}{yyz|~{yxz||{ywvxywtuwxxxtrrtwz||}{yyzzywsrsuy{{z|~}~}}~yutstutqpstsrrtx~~{yx{}}}{yy{~||~~|{}~|}~~zyz{zxtqppqssqpsutssux{ywwwtqqttsrsuz|zzz{{xvxyxusrswyyxvuvy{z{|{|}}|xuuvx{}}~~}ywwx{~~|}{yxxwtqsttqppquxyyxww{}||{xvwyzyxvuwz{z{~}{yy|~}zxz{xvvwxxwsqqsvz||}|zyzzxuuxxwvvw{}|{||yvxzzxwwy~|ywwyzzywuuxxuuwyzzxttuwz}}|~}yxyyxwtqqsuy{zz~||~~}zurqqstspprtsrrtx~~{yy{~~~}{z|~}|{z}~}{{~~}{xxyyxuqoppstsqsvwvuvx|{ywvwvrpqssrrsv||zyyzyutvvtrqqrvxxxvuwz{z{}|}~~~{wvwy}}|}~~}yvvwy|~}}|ywvvuqprsrppqsxz{{zy{~}~|xvuwyyxwuuw{{z|}zyxz}|{ywvxywuuwxxwtrrtw{}}|zyz{ywwyzyxxz~|zyzzwuvxxwvwy}{xvvxzyxvuuxywvxz||{xvwxz}}|}~zxxyxxurqsuy{||{z{{zytqppqssqprttssux~~|zy{}}~~{yx{}~}|zz}~~{xxyxxurppqtvutuyzywxy}~zwvvvurprttsstw}{yxxxvrqstrppprvyyyxwy|}|~~~|yz{}}{|}}|zwuvx{}~}|ywvvurpqssrqrtx|}~}|}~~~~||}}{xvuwzzzywvx{||}|ywvxzzyxuuwxvuvxyzxustvy}~~~|{{|}{yz|}|{{}|zyyyxutwxxwwx{}ywvxzzyxvvxzyxz|~~{xxyz|}{{~~}}~~~{yyzzywsstvz}}}}yxyyywspopqssrqtvvuvw{~~|||{yxy|}}}{z|~}zyzzyxtrrsuwxwwz{zyxy{zxwvwwussuuttuw|{xvvvurprsrppprwzz{zy{~~~}|}~~{|}}}{xvwx{~}zxwxwtrsuusstvz~~~~}{{{|}}zz||{xwwx{}|{zyz}~}~~{xvuwyyywuuwywvwy{|{yvvwy|~}~~}}}}}}~}{yyyywuwyyxxy{~{yxx{||{yxy|}{{}~zyyyz{zyz||{zyz}~~|{|}}{xuuvx{}}}~{xxyyxvrppqsuuttwyxwwx|~~~|zyy|~~~}|}}||||{yutuvxzyxy{|zyxy{~~~~}yxxxyywuwxxwwwz~|xvuuutqprsrqqrty|}}}|}~~~~~}}~~{yyz}|zzzzxuuwxwvvwy~~~}~|ywwxz{zxy{{zyxy{~~}|~~||}{yvuuwyyyxvvxzyxy|~~~{xxyz|}||~~{zz{{ywx{{{z{~~}{z{}~}{|~~}~{xxxyyxvvxyxvvwz~~~~}ywxy{}}|~}~~{yxyyyxurrrtwxwvy{zyyy{~~~~~~}{z{}}ywwxz{zyy{{zxwwy|}}|{z|~}||~~zzz{||zyz|{yxxz~{wvuuutrrsutsstw|~~~~~~}~}}}}||}~}||}|zxz{zyxxz~~~}{{|||zvttuwyyxx{||{z{~~}}}~~|zz{zxvuuxz{{yxy{}|{|{yyyz{{zz}~~}}~~~||}}}{z}~~}}~~~}}~~{xvvvwvsstvuttux|{yyy{|{z{~~}|||~}~~|zz{{{zwttuwyyxxz|{yyy{~~~}{z{}~~~}}~~}zyyz{{yxyzywuuvyzzzyxy{|{{}|{|}~||~}{zyy|{xvvvwwutuwwvvwy}~}~~{zz|~}~~~~|z{||{z{}~~}}~}{zyz}~}|}}zxxyyyxusstvxyxy|~~}}~~}~~{yyz{{zxyzzywvwy|}}|{{}~}~}yxxxyywvxzzyyz}~}~~~~~~~~|wutsttrqqstsssuy~|zyyzyxwxzzyxxz}~~~||}~~}ywwxyzzyy{{zyxwy|~~}||~|yxy{}~}}~~~{zzzzywwxxvtrruwyyxwwy{{{|~~~~~{yxy{~~~}|}~~}~~{xxxyyywwyzzxxx{~~~}{{|}|zxwwy{}}|~~}|||ywxzzyxy{~~{zyz}~}{zzzzwvwxxxvsrsuwyyy{~}||}}|ywvvwyyxwy{{zyyz|~{xwvvwvtsuvwvwx{~|{|}}~~~}}}}|yurqqrrqpprssstuy~|zxxxwuttvwvuvwz~}zyyz{{yxyzywvuvxz{{zz{}~~~~{xwxz|~~~}}}~~}{zyyywttuusqqqsvwxxwwz|||}~}{xwwy{{{zyz|}||}|zzz|}|{z||{zyz{~~}}}|zxyyzywutuwz|}}~|{zzywvwyyxxy|~~||~~}||}|zyy{||{yxwyywuvwxxwtstuxz{{}~{yyzzywtttvxyxxz|||{{}~~}yvtsttsqqstttuw{~{zz|~~~}|}~|{{{zxtqppqqqpprtttuvz|ywvuusqrsttstvz~~{zzzzywwwxwtsstwxyyxxz|~~~}~~~}zxxy{~|zz{}~}}~|zxwwusqrsrqppruwxyxxz}~~~~~~}{xvuvxyyxwwz{|{|}}}~}|}~}{zyz}~|zz{zxwwxxxvtstvy|}}}{zyzywvwyyyyz}~}}}|zy{{{zz{~|ywwxzzyxvvwxwuvxyyxvuuwy{||}}zxxxxwusrsuwxyxz}~~~~~}~~}{wtrqrrrppqsttuvz~{zz{}~~~~~}}|zyyyxurpopqrrqrtvvvwy}~yvuttsqoprsrstw{{zyyyxutuutrqqsuwxxwxz|~~~}~~|yyz|~{yyy{}}}~~zxvuusppqrqppqtwyzzz{}~|||zxvttvxxwwvwz|||~~~~}{yyy{}|{yxxyxwvvwxxvttuwz|~}{zyzyxwxzzzz|~}|{{zxwxzzyyz|}ywvvxyyxvvwxxwwxz{{zxwxy{}}}~~}}{xwwwwwusrtuxzz{}|{{{zxurpppqqpprttuvx{~}{zz{~|{{}~~~~{yxxxwurqpqrttstvxxxyz}}xvtssrqoprsssuw{{yxwwusrrsrqppqtwxyxyz}~||}~~~~}zyxz{}~~}ywuutrppqrrqqsvy|}}}}~~~~~|zzzywuttvwxxwwx{}}~~}~}|yxwwyzzywvwxwvvwxyywvuwy|~|{z{{{zy{}}}~}{zzyxvwxyyyz|~|zwvvwxyxwwwyzyyz|}~}zyyz{}|||~~}}~}}}{ywxxxxvttuwy{||~|zyyyxvspppqrrqqsuvwxz~~~~~}|{|~|zz{}~~~~|zyyyxwtrrstvvvvxzzyzz}|xutttsrqqsttuvy}}ywvutsqpqrqppqsvyzzz{}~~~~~~|zyz{~~zxvuutrqrsssstw{}}|{{{{yxxxxwuttvyzzyyz|~~|||zxvuuwyyxwvwxxwwxyz{zxwxz|~~}}}~~}|~|zzyyxwwyzzz{}~~~|zxwwxzzzyyy{|||}~~|zyz{{{zz{||{zz|~}|}}|zyyzzzxvvvxz|||~~~{yxxxwvsqpqrssssuwxxyz}}~~~~}{zz|~|{{{{zxvtuvwxxwxz{zzzz}~}zwvuuvutstvvwwx{{wuttsrppqrrqqrtx{|}}}~|{{}|zxwwwuttuvvvvx{~|yxxxyxwvwxxwvvwy{||||}~{zzzxvutuwxxxwwxyzyyz|}}|zyy{|~~~}{zzzzyxz{||}~~}}}|zyxy{}}|||}~~~{yyyyyxwwxyxwwxz}~~~}}~~|||}}}{xxxz{|||~~~~}}|zxxxxxwtrrstuvuvxyzzz{}~~~~~}{{{}~}~~}|yxwxyzyyyzzzyxyz}~~~}|}~~}|}~~}{ywwwxxwvwxyyyy{~}zwutsssqqrsssstvz}~~~~~|zzzzxwwyyyxyz|}|}}}{ywuvvwwvvwyyxxxz|~}||||{yxxxwuttuwyyyyyz||||}~}{zz{||||}}|||||{|}~}}~~}|{|~~{xwwwwuttuvvuuvy|~~}zyyz{{{z{}}}|{|~~}|||{yyyzzxvuuuwxxwxyz{zz{}~~~~~}}}zyyzzzyxyyxwvvwy{{{zz{|}||}~}{zzz{{zyyz{zyy{}~|yvuttutsstuvvvwy|~}}~~}~}}~~~~~~~}}~}{z{{{zzz{~~}}~}{zzzzzxuttuvwwwxz{{{{|}{yyyzyxwwxwvuuwy{||{{|~~~~~{yyyyzyyy{||||~~~~~~|yvutttsrrstttuvy|~~{yxxyyxwxyzyyyy|~~}}~~}|{|||{ywwwxyyxxyzzyxxz|}}}~|zyyyyxvvwwvuttvxyzzyz{}}}}~~}||}}}{z{{{yxxy{}~~~~~~~~|zxwwwwwvvwxxxxxz}~~}}~~}{z{|}~~}~~~}}{z{|}||}}|}|{zyy{}~~}|{{{zyxyyyywutuvxxxyz|}}}}~~}}}}}|yxwwxyxwwxyyxxxy|~~~~~~~~~|zxwwwwvvvxyyz{|~~~}}}}{yvtssssrqrstuuvxz~}zxwwwvuuuvwwwwy{~~~}{yxxxyxwwwxxwvvxz|}}}~}||~}zyxxwvutuutsssuwyyzzz|}~~~}}}~}|{zzzywwwy{|||||}~~~~~~|zyyyzyxxxyyyxxz|~~~}}~}|{{|||{zyyz|}~~~}|||zzz{|||}~~~}}|{yxxy{||{zzzzzyxyyzywvuvwyzzz|}~~~~~|{{{{{zxvvwxxxxxyzzzzz|~~~~~~}zxvuuuuttuwxxyz|~}}}~||{{zxusrrssrrrtuvvwx{|ywvuutsstuvvvwy{~~{yxxxxwvvvwvuuuvy{|||}~}}}~~~{ywwvutssttsssuwyzz{{|~~}}~}|zzzyxvuvwyzzzz{}~~~~}{{{{{{yyyzzyxxy{}}}|{|||zzz{{{zxxy{|~~}|||{zz{|}}}~~~~}||~~~~~~}}{zxxxz{{zzyzzzyyyzzzywvwxyzzz{}~~}}~~~}|zyzzzywvuvwxyxyz{|{{|}~}}}|{ywutttttstuwxxz|~}}}~~|{{{zxusssssssstvvwwy{~|ywutttsrstuuvvx{~|zxwwwvutuuutttuxz{{||~~}~~}~}zxwvutssstssstvyz{{||~~}}}}|zyyyxwvuvwyzzzz{}~~~~|||||{zyzzyxxxy{|||{z{{{zyzz{{zxxyz|~~~}|||{{{}}~~~~}}|{{|}}}~~}|{yxwxz{{zzzz{{zzz{{{yxwxyzzzz{}}}|}~~~}}{zyyzyxwvvvwyyyz{||||}~}|||{zxvtssttsstuwxxz|~}~~~}|{{zywutsstttttvwwwxz|~{xvutttsrstuuvwy|~|ywwvvutsttttstuxz{||}~~~~}~}zxwvvusstttttuwy{|||}~}|{{{{zyxxxwvuvwyzzzz{}~~~}||||{zyyzyxwwxy{{{zzz{{zzz{{{zyxyz|}~~~}}}|||}~~~}}}|{{|}}~~~}}|{yxxyz{{{zz{||{{{||{zxwxxyyyyz{||{|}~~~~}|zzzzzywvvwxyyyz{|}||}~~|{{{{zxutsttttttvwxyz|~~~~~~||{{zyvuttuuutuvwwwxy{~~{xvuuutssstuvvwy|~{xwvvuussttttttvy{|||}~~|zxxwvtttuuuuuwz|}}}}~~|{zz{zyxxxxwvvvxz{{{{|}~~~~}||||{zyyyxwwwxy{{{zz{{{{z{{|{zyxyz|}}~~}}~~}}}|{|}~~~~~}|{zyz{|||{{||}|{||||zywwxxxxxyz{{zz{}~~~}|{{{zyxvvvwxyyyz|||||}~}{{{{zxvttttuttuvwxxy{~~~~}}||zxvuuvvvuuvwwwwxz}~~|zxvvvutstuuvvwy{~~{ywvvvutsttuttuvy{||}}~~~|zyyxvuuvvvvvwy{|}}}}~~~~~~|zzyzzyyxxyyxwwxy{||{{|}~~~~~|{{{{zyyyyxwwwxz{{{{{{||{{{|||zyxxy{{||~~~~~~~}||}~~~~~}|{{|}}}}||}}}|||}|{zxwwwwwwwxyyyyz{}~}|||{zxvvvwxxxyz{{{{|}~}|{{{zyvutuuuutuvwxxyz}~~}|zxvvvvvvuuvwwwwxz|~~~|zxwwwvutuuvvvwx{}~{ywvvvutttuuuuvwy{|}}}~~|{zyxwvwwwvvwy{|}}}}}~~}}}~~}|zyyyyyyxxyyyxxyz||||||}~~}~~}{{z{{zyxxyyxwwxz{||{{||}||||||{yxxxyz{{|~~~}}}~~}||}~~}}~~}}||||{ywvvvvvvvwxxyyy{}~}}}|zxvvvwwwwxyzzz{{}~}||||{ywvuuvvuuuvwwxyz}~|ywvvvvvuuvvvvvwy{}}~~~}{yxxxwvuuvvvvwxz}~}{yxwwvvuuuvvvvvxz|}}}}~~}|{zxxxxwwwwxz|||||}}}}||}}|{zyxyyyyxyzzzyyz{|}}}||}}}}}}~~}|zzzzzyyxyyyxxxy{|||||}}}||||||zxwwxyyyz{|~~~~~~~~~~~}||||{ywvuvvvuuvwxxxyz|~~~}|{ywvvvvvvvwyyyzz|~~}}}||zxvvvvvuuuvwwwxy{~}zxwvvvuuuuvvvvvxz|}}}~~|zyyyxwvvvvvvvwy{}~~~~|zxxxwwvuvvvvvvxz{|}}}}~~~~~~~~~~}|{yyyxxwwxy{|||||}}}||||||zyxxyyyyyyzzzzz{|}~~}}}}}}||}}}|{yyyyzyyxyyyyyyz|}}}}}}~}}||||{zxwwwwxxxy{|}~~~}|||{zxwuuuuuuuvwwxxyz}~~~}{ywvuuvuuuwxxyyz{~~~}}|zxwvvvvuuuvvvwwxz|~}zxwvvvuttuuuuuvxz||}}~~|zzyyxwvvvvvvvwy{|}}~~~|zyxxxwvvvwwvvwxz{||||}~~~}~~~}~~~~~~~}~~}|zyyyxxwxyz{|||||}}||||||zyxxxyyyyyzzzzz{|}~~}}}}}||{|||{zyxxyyyxxyyzyyyz|}~~}}}~~}||||{zxwvvwwwwxy{|}~~}|||{zxvuuuuuuuuvwxxyz}~~}{ywuuuuutuvwxxxz{~~~}|zxwvvvvutuuvvvwxz|~~{yxwvvuttuuuuuvxz{|}}}~~|{zzyywwvvvvuvwxz||}}~~|zyyyxxwvwwwwvwxz{||||}}}}}}~~~~}|}~~~~}~~~~~}|zzzyxxxyz{|||||}}|||||{zyxxxyyyxyzzzzz{|~~~~}}}}|{{{{{{yxxxxyyxxyzzzzz{}~~~~}~~~}||||{ywvvvvvvwxyz{|~~}||{{ywvuuuuuuuvwxxyz|~~}|zwvuuuuttuvwxxy{}~~}{yxwwvvvuuvvvvwxy{}~}zyxxwvuuvvvvvwxz{||}}~~|{{zzyyxwwwwvvwxz{|||}~~}{{zzzyxxxxxxwxyz{|||||}}}|}}}~}|||}~~~~~~~}||{zzyyz{||||||}||||||{zyyyyyyyyz{{{{{|}~~~~}}}}|{{{{{zyyxyyyyyzz{{{{{|}~~~~~~~~}||||{zxwwwwwwwxyz{|}~}|||{yxwwwwwvvwxxyyz{|~~}|zxwwwvvvvvwxxyz{}~~}|zyxxwwwvvwwwwwxy{|}~}{zyyxwwwwwwwwxy{||}}}~~~~~}||{{{zyyyyyxxxxyz{|||}~~~~~~}|{{{{zyyyyyyyyyz{|||||}}}||}}}}|||}~~~}}||{zz{|||||||}}||||||{zyyzzzzzz{{{{||}~~~~}}}}||{{{{{zyyyzzzzz{{|||||}~~~~~~~~}||||{zyxxxxxxxyyz{|}~~}}||{zyxxxxxxxxyyyzz{|~~}|{yyxxxwwwwxyyyz|}~~~}|{zyyxxxwwxxxxxyz|}}~~~}{{zzyxxxxyxyyz{||}}}~~~~~~~~~}|||{{{zzzzzyyyyz{{|||}}~~~~~~}|||{{{zzzzzzzzz{||||||}}}|}}}}}|||}~~~~~}|||||}}}}|}}}}|||||{{zzzzzzz{{|||||}~~~~~~}}}||||{{zzyzzzz{{{|||||}~~~~~~~~}}||||{{zyyyyyyyyz{{|}~~}}}|{zyyyyyyyyyzzzz{|}~~~~}|{zyyyxxxxyyyzz{}~~~~}|{zzzyyyyyyyyyz{|}}}~~~}||{zzyzzzzzz{{|}}}}}~~~~~~~~}}|||||{{{{{zzzz{{|||||}}}~~~~~~}}|||||{{{{{{zz{{||||||}}}|}}}}}|||}}~~~~}}}}}}}}}}}}}}|||||{{zzz{{{{{{||||}~~~~~~~~~}}||||{{zzzz{{{{||||}}}~~~~~~~~~}}}|||{zzzzzzzzz{{||}~~~~}||{zzzzzzyzzzz{{||}~~~~~~}|{{zzzyyyyyzzz{|}}~~~~}|{{{zzzyyzzzzzz{|}}}~~~~}||{{{{{zzz{{||}}}}}~~~}~~~~}}|||||||{|{{{{{{|||||}}}}}~~~~~}}}||||||||{{{{{||}}}}}}}}}}}}}}|||}}}~~~~~~~~~~}}}}}}}}}}||{{{{{{{{{||||}}}~~~~~~~~}}}||||{{zz{{{{{||||}}}~~~~~~~~~~}}}}||{{zzzzzz{{{||}}~~~~}||{{{{zzzz{{{{{||}~~~~~~}}||{{{zzzzzz{{{|}}~~~~~}||{{{{{zzz{{{{{||}}}~~~~}}|||{{{{{{||}}}}}}}}}}}~~}}}}|}}||||||||||||}}}}}}}}}}}~~~}}}}}}||||||||||}}}}}}}}}}}}}}}}|||}}}~~~~~~~~~~~~~}}}}}}||{{{{{{{||||}}}~~~~~~~~~~}}}}|||{{{{{{{||||}}}}~~~~~~~~~~}}}}}||{{{{{{{{{|||}}~~~}|||{{{{{{{{{{{||}}~~~~~~~~}}||||{{{{{{{{{||}}~~~~~~}}||||{{{{{{{{||}}}}}~~~~~}}}|||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}}}||}}}}~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~}}}}|||{{{{|||||}}}}~~~~~~~~~~~~}}}}||||||{{|||||}}~~~}}|||||{{{||||||}}}~~~~~~~~}}}||||{{{{{{||}}}~~~~~~~}}}}||||||||||||}}}}}~~~~~~~~}}}}|||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}||||||||||}}}}}~~~~~~~}}}|||||||||||}}}}~~~~~~~~~~}}}|||||||||||}}}~~~~}}}|||||||||||}}}}~~~~~~~~~}}}}||||||||||}}}~~~~~~~~~~~~~}}}}}}|||||||}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}~}}}~~}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}|||||||}}}}}}~~~~~~~~}}}|||||||||}}}}}~~~~~~~~~}}}}|||||||}}}}}~~~~~}}}}|||||||}}}}}~~~~~~~~~~~~~~}}}}}}|||||||}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~}}}}||||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m40.bin b/applications/SprPoP/assets/packed/MUS/m40.bin deleted file mode 100644 index 018cc3b..0000000 --- a/applications/SprPoP/assets/packed/MUS/m40.bin +++ /dev/null @@ -1 +0,0 @@ -xmd`bis|{qjd``cipy~wsojgdccbaaaaaabbcfhkosy}skeabfnwzrjfcaacfhkptx{|}{yvtpligecbbbdgjosy~|upjfcbcejov}yuqmkigeddccccccccccccccccddeffhjkmoruwz}}yvrnkhfeddegjmqv{|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtronljhgffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnpruwz|~~}}}||{{zyyxwvvutsrrqponmlkkjiiihhhhhiijklmoprtuwz|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zyyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxz{|~~}|{zzyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxz{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}|{{zyxwvuutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxyyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwvvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyz{{|}~~~~}|{{zyyxwwvvutttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxwwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~~xtrsuz}~zwtsrsuy||zywutsssssrsssssstvwxz|{wtsstw{~zwutsssuvwyz|}~~}|{yxvuttssstuvxz|~|ywutsstvx{~}{yxwvuutttttstttttttssstttttuuuvwxyz{|}~}|zxwvuttttuvxy{}~}}|{{zzzyyyyyyyyyyyzzzz{{||}}~~~}}|{zyxwwvuuutuuuvwxyz{}~~~~~~~~~~~~}}}|{{zzyyxxwwvvvuuuuuuvvwwxyz{|}~~~~~}}}}||||{{zzzyyyxxwwwvvvvvvvvvvvvwwxxyzz{|}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvvvvvvwwwxxyyzz{||}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwwwwwwwwwwxxxyyzz{{||}}~~~}}}|||{{{zzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{{||}}~~~~~}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{|||}}~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~~~~}}}||{{{{zzzyyyyyyyyxxxxxxxyyyyyyzzzz{{{{||}}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}|||{{{{{zzzzzzzyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~}}}|||||{{{{{zzzzzzzzzzzzzzzz{{{{{|||||}}}}~~~~~~~}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~ymd`bhs|{qjda`cipywsojgdccbaaaaaabbcfhkosy~tkeabfmwzrkfcaacfhkptx{|~~{yvtpligecbbbdgjosx~|vpjfcbceiou|zuqmkigedddcccccccccccccccddeefhjkmoruwz}}yvrnkhfeddegjmqvz|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtrpnljigffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnprtwz|~~}}}||{{zyyxwwvutsrrqponmlkkjiiihhhhhiijklmoprtuwy|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zzyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxy{|~~}|{{zyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxy{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}||{zyxwvvutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxxyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwwvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyzz{|}~~~}|{{zyyxwwvvuuttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxxwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~{wsrsw{}yvsrstvz~~|zxvutsssssrssssstuvwyz}~zvtssuy}|yvtssstuvwy{}~~~}}{zywvutsssstuwy{}}{xvttstuwy|}{yxwvuttttttststttttssttttttuuvvwxyz{|}~|{yxwvutttuuwxz|~~}||{zzzzyyyyyyyyyyyzzzz{{||}}~~~}|{{zyxwvvuuutuuuvwxy{|}~~~~~~~~~~}}||{{zzyxxwwwvvuuuuuuvvvwxxyz{|}~~~~~~}}}}|||{{{zzzyyxxxwwwvvvvvvvvvvvwwwxyyz{{|}~~~~~}}}|||{{{zzzyyyxxxwwwwwvvvvvvvvvwwwxxxyyz{{||}~~~~}}}|||{{zzzzyyyxxxxwwwwwwwwwwwwwwwxxxyyyzz{{||}~~~~~}}}||{{{zzzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{||}}~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{||}}}~~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxyyyyzzz{{{||}}}~~~~~}}|||{{{zzzzyyyyyyyxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{|||}}}}~~~~~~}}}}|||{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{||||}}}~~~~~~}}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{||||}}}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{|||||}}}}}~~~ymd`bhs|{qjda`cipywsojgdccbaaaaaabbcfhkosy~tkeabfmwzrkfcaacfhkptx{|~~{yvtpligecbbbdgjosx~|vpjfcbceiou|zuqmkigedddcccccccccccccccddeefhjkmoruwz}}yvrnkhfeddegjmqvz|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtrpnljigffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnprtwz|~~}}}||{{zyyxwwvutsrrqponmlkkjiiihhhhhiijklmoprtuwy|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zzyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxy{|~~}|{{zyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxy{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}||{zyxwvvutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxxyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwwvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyzz{|}~~~}|{{zyyxwwvvuuttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxxwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~}xtrsvz~~zwtsrsvy}|zywutsssssrsssssstvwxz|{wtssux|}zwutsssuvwyz|}~~}|{ywvuttssstuvxz|~{ywutsstvx{~}{yxwvuutttttstttttttssstttttuuuvwxyz{|}~~}{zxwvuttttuvxy{}~}}|{{zzzyyyyyyyyyyyzzzz{{||}}~~~}}|{zyxwvvuuutuuuvwxyz|}~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuuuvvvwwxyz{|}~~~~~~}}}}||||{{zzzyyxxxwwwvvvvvvvvvvvvwwxxyzz{|}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvvvvvvwwwxxyyzz{||}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwwwwwwwwwxxxxyyzz{{||}~~~~}}}|||{{{zzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{{||}}~~~~}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{|||}}~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~~~~}}}||{{{{zzzyyyyyyyyxxxxxxxyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}|||{{{{{zzzzzzzyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{{{|||||}}}~~~~~~~~}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~skzjg~qot~wvekizsyynmltxcwqx~|uow|}~}}qygjqN\i}xtOptQklwt~n~l`~}uYPwjP}`_oao|ztnyb|Zym`]sfzzaObfTvvx}{an}ubNiyOltR{dfpwnw~vnsvt~^OVXmsS{azizv{n}f^yuiPY|^ZYilbjvm~zwucLSklUd{T^w_qxktinrRfogTQunPzlY}ddmmrxOS_yzY|gNbx{~dYsehjbr\Tmj_Mc}YcYomcgpho~]NYnnwYXo{ztQek_jaglNcmgUSxqT|p[icjit}}jmvUYds]fyzy\Xp`fg`o`Ohe]Pi\f^nueelg~{ubvhS]no_p}{tRfl`idbqSYicWTvxUxyZ~ldgkm{xnbzbZexhbsyxbUrcehcgoN]b\Rah[kakdjhywejwY_kzcizyvVapahh`neNc`YRn\i`myhdkjzuu`nv^gx~{ahuskPmjchh`raO_ZUXyxWt]uxigkt{xro\tp`lsamvteSsefggbuYS`ZT^qX}x]~ugik|y|uok\zjdpzncqvv^[wajghbwWT[WUhj]s_wjln}vvsljZ{plywm`mpoX^uajggcwTV[WVlg`qawjmo~xxfClnvZofm`P]Ia{nMMMoDM|rsuduy`pwxyuś˱qp{}PKKLY|OgmKyZ_ZnljPwWss\y|eOhOqxedmdz|}yArb=^]A5bucwmu_er~jGXBRRri7iaYdh_WswȪo{hqdjLP_PBZr~thgt[}]qv[gHdsml\rxqaCoqjOfvpp[`]^^i^֮԰yZsrbzlimg;k|ePqhykdj{wjd_oXsczwfxto^rn˹||~vz{zig=V:UmquNbjikZlmqtkY\YeWvv}~{n{bzsz¹{pX^F[Lb|lovnqX`kFXec}w}gDd`yn]p{vt}u}g¦İv^SmRObKZmyeycbs^PR]n_t~dR|odne[xrpw|qjhv`?`GSmp|mziTYUX|ear[aWKhgA[x|hkmfl_n~t^k_IQ\>\{oqwmjVVb]K^h8]{un{keoZgqr}whkkBej@sk|m{~z|iRk`Iwg9jkppkgdpgp}qv|wwlqLl`Mrwkos~cr}q]}zggJf{lwaVu^e}o~{u}wyrpuP{tb~~~s`uEWpwrYVzxpk^{cru^vpf|yo|{wtsgQyve}x||Mfka`SLx|V]~Ozpuo~kyty~]w~omzqip~jujP̿~\WcZoQestqkruxVxooqrXsv|ijm[s{l|pRhHReg{pmt5Ba0<6FsCam|MSn_f~joʴph_Ma\J][hmi]Qfbbq\Wo[X^^`=H~aSYn}jbI=ZUX]mƳwnpU^zVPWUhxafjypRerPmgW{vsjirgenRTVm|dkyxjZY[XXBdipxUqiscb~|wtwȁyrfljfjYKcrrqKxqqPv{jryjjy}}VSjtdLrlrD&Y]F+3h>P~X{gwyTy}lTltJwϦ}}r|~}YvOeYInq~`K%QH80?aHMYW|Lbkxıä̻m`].DFpXornKeaa7EnBFE@lL=R@<]hjX}vdm}qvt{zybuݳמv{vquxjed4YfV8TY[wYijadiNf`sqçɾœ{r}xu}O[PSO'9AE848* H68pr[|yirkkff{mWozh\ln\x_lbkMh}t]vZEcTJRBWe`kutqilyZb{jpbQFAA.8UGRYS[EJoVUtiuYdRrglyjdzv~wǧhrqWx{jyf}tqWRiv`ssjyb[fkktoy|cwhenkq|iUlb`tradvyzb{{]sdlbTY}\qymrrhjcPegsupomypEW``DS8F?.LZ^MaiOnu]Yuqtuu`jansʢ{bgeuQc`KXOSlfTy\piblztyvsnzdbhmWFRFpcg{dj|KfkcWk]WXWl~kYt~Uplkgosunnro^][XHVTR;YQE;=WkWAju\xwm~xvorxs]vvjLngbXO^tkapnr{~ymwwjw[ce|kbfjgl{{yv{uyo}_UsylQl^gjinjhs~wop_ji`wsbxzsfjfxRPZcWU`N^GWjdHXee{p{s}zabz~zvi~r~x~|k}sgbkg\eqmXhlstraozRkz}xdvyrNgYtpciqe[zv]w[eqdllznXx}s{|fxzaoa~p^fskd}zus{uPgdmOckWTQanbMvuMbx|wszvx}ndsiwuyt}x}f||SfsjlekhWSwr_czq}c|}dp]}}vojmkzYzw[diV\`]haHv{dtt}{~|x{{j~{cy^uoluhe|`zmoRY`]eWcohZn}ojz|zj{|fp`pjh`dxvsWuevYLfajiqxxryt}}v}x|vnygrsoiXLh~zjwyr[zqw{uZr`\jov{kluxluwpspwlwyrrib[Re{ymuswoolym}csi[jxp~b{xryvspancxoeXq~|x[luqvp{|s|olhhilxktptqqj[zvjgI`JXabZNNXqw{sxzv~yzmgo{gqvyrlmdysuRgd\}|rjfg¤j~y[tntz~gr{g_lx~isqs{t{}yrcawk]UbPpzwoidz}v{|iip`h}}syxw~~|txi}jrrk^[zfiMj]l|nsx~ltaxu|}rpbqoykju\Zbk{Wk|bpvhfav}_vx{~svsdsziy{l|hcdhv`noq{ong{{]\fZquup`\xyztts|dz`swrwynommnuw~}{e\sgw|whg}w~s|\j}x~rsryhjpupclSpve`]bpss~}vpx|eVtcq}vs|ov{|mkvzvox^}ujjq}}p{unkuiXGcXgtrj`]qsw|otje{wvs{mfrxvmzvvwkVl_l{}{tpw~uyjapsz~je`qcYgmqkyepknyvtk~zurzun_Plft~vslj{yqopnyyxsqswptkwngoml[Md[hommgcw|}~{mz|^^qy}wqoqxwxxxyp~|xy`Vkgswywos{|~j~~X_rx~rmsn}{zpzwiqhglwzh|p}{wnuUYkhx}{vq|ygts}qurwkfjt~wsrntxuyhiLZ^^nrlb]ks{y|x~fxuts|rsyrt{z}tpVhgeprohfuwp}uhyhygwqhsbrsjiotzr|}oy||xkcK_^amomkn|{xzq}qrrp|msjmsv{sjuwtwiaW@TTZed`_evpnxzrpwmn}vvpyrt{|nw}|picM]^eqrokpiryrfdrfksyvhdshxvkinuzr|udhxtw}jcaL]bdpvww~s|vrpqt}~qkyo~|ojkptoy|ogdupsxl_]GYacqxyvx|jqz}qlltr}~vq}r~|plntywwuj}oq\hspz~~noxtkg}b|virrmephh{vicgmomts{aw}rs^^onw~~z||t{uop~owuqfnmgoegotttvgyml]Scahsvrqzz}ot{vmutqjorqgkrj~squ{y|wmgVfjktyzy~zmpxsgbx^xgaikfaibo}rory~}zl|ifRXhirxzz}yryzmdtew{elopjrpmyx{~gx~}igYN`ekuz{|jnv}|pilsjmnssnryqzvy||xymj|{}ld^M\iluzzz{iir{sjijtoxywv~uyqrxzwqvdyy{|sfdPVeir{~}~pkry}rkor{|yu}vy|spsuuzq~av|}wecRRfjow|~vlt}yrxry{ztxspyqorrsuu{ds{zz{hdTNbkry}~~ouv}{quvvswtnzpmprtuwwbo|||}xheYO`kpwyz{}uzvz{xpsusossm|sprrsrxvdlz{}|idXK[fksvxy{yz}ru~umossoqqk~|qmoqssxqfm{{|}yf`UHWdjsx{{xx}rrzvknqrosrm}tnnnpswsdmyxyztc^SIZgmsw{uxzptvxjpsspsokyqnppqssr^kvvxzteaRI[iqy|~tu~yovu{joqrotplzqnommplr}\oxzzzqdbUOamu|sv~yo}o~irrqnrmqumjjjjsh{y]sx|~sgcSUgs{|sxvmovhqrrprkt|piijklzfrd{|skeU\lu|{tzwnqqkqrppnguzpkkijm~kmktmcU^muz{|zxt|~uprninommlgvxolmmnp~onpslaR[ku{|{{yyt{up~rihmnmomhw|rnpoqttnt~oj_S\jrwyyzzyv}|rozsijnolmlj{}uqsrsvtlr~og[OZiqwyyzxzu{|rm~sihorqqol|xstrsunmo|ng\OWgrxzz{xysx~ulrpkqtttso}ysrpprmmj|ng]OVfpvxy{uzsywosumuwxwvq}vqqpooiqe}~}pg^PScpxzyz~xsv|qtnvxyxwpwyqnmlmyi|zay~~|rhaTQ`muz{|~{wxvznuwxutosxplljksns`s}vibTN\kuz{{}{{y{znquxvuon}zqlljjnviel~~~|wldYNVgryzz{w{svymsuuspkv~smkihj{e~q_x|~|zof]OP`nv{{}z}~uvjqsurqlounjkhipko~]p{|{zrg_SLYju|}~zytzomrutrmkyzpihfgjxdddyyzxtibXNUfs|~z~{psvjrttqnkvzpjhgfgx}_zj\vxzywldZOSeu~yz~qr~hpsvsoip}rjgfceqbrtZsyzywphaUSctzyszvjortqojm}~rjfebdlhkyYnz||{tkdYUbs{x~uxyjnrtrojl{~rjffcdjji}]n|}~|wng[Vas|x}vt|}lnqtroijxtkfecflqham~}xoh]V_p}~y~xszllpsqnjjxtmihfgmticm~}xng[T^p}}x}ws|{klqtroijywojjgioskbo~~}{vnf[T^o{}y~utz~knqtrpkn}wpkkhjqpm_o}~~{uldXS]o{|y~uwykptwurmpwpljhiqko}^r|}|yskbVS_p|{zs}vltwyvsnuunjigjvfvu]v{|zxpi_TTbr|{{|twowyzwrox|smkigjzb{lay{|ywnf\RVet}x{~v{zrx{zvpozzqjiffj~yb~eez{{yumf[RVft|w~x~xrxzyupp{xojhefjvc~cfz{|yuldXQWgu|~~wyusx{ytoozvnihefjteahzzzwtlcXQWgt|}}~xzutwzwsno{umhgefkse}_hyzzwskcWPWft{}}~wyurwywsnnyvniheei~tb|beyyyvskcXQVes{}}~xw|wqwyxsnmxwmhfddh|w`{dbxxyvsldYQUcr{~ywzzpvxxsomwwnhfdcgxz_xg^vxyvtle[RUcs}zwxovxytokryohecbdr`rpZswxvuoi_VUaq|y{otvxtpkp}{piedbdmfivZnxzywslcYV_o|}zqrvxuqkmy}rjedach}pb{_gyzzxuog\W\ky|uxzouwvrlksulfdcbfv}`wm^wz{ywrkaXYet~xxmsvwsoko{zpifeceniky\oz{zxtmdZW`p}}v}squxupklwtlgfdei}ub{cexyywuoh^W\jy}txzouwwrnmvwnigedgw|_vi^vxzwvpi_WZgv~vwovxyupmszpjfeceqbpr[qwywuqjaXXcsy}|qvx{vrnr}|qjfdbemghvYlwxvurkcYW`p}||svy{wrnq||rjfdacj~ievZivwvurldZW`o||uvy{wrnp{}rjedaci}kbw[guvvtrld[W^mz{vuy{xsnpy}qjecabg{maw[euvvtqldZV^lz|uvy{wrmoz|qidc`bh|kbvZfuuusqkcZV^mz}tvyzvqmoz{phdc`bi}hcuXhuuuspjbYV^n{svxzvqlpzzohdb`bj}dfsWktutspjaXW`o{||rwyzupmr}wmgcb`cn{_mmXotutsoh_WXcr}~z{rxzytomtulfcaadtx]sf\rtvsrmf]WZgu|z}|tyzxsnnv~sjecaaexs^v``tuvtsmf\W\iw{zytxzxrnnw}rjecabfyq^v_buvwusnf\X]jx{{xuyzwrmnw}qjecabg{oax^evwwutnf\X^kx||wvy{wrnox|qiedbch|obx^fvwwutnf\X]kx{{xuy{xsnow}skfebdh{raxadvwwutnf]X]jwy{~{uy{xsnowtlgecdhzu`xcbvwwutog]X\hu~x{~}ty{ytppwvmhfddgwx_vg_tvwutoh^X[fs}y{|tz{{vrouxoifdcfr}apn[quvutpj`YYcq{}~uz{|xsot}zpifebem~fhsZkuutsqkcZY`nyxy{}ytprz}rkfebdj{mav^brtusqle\X^jv~z}~vy{yuqpwvmgdbbftw]qhZnsusrnh_YZer||vyz{vrps|yoidcadl{dfrYgrtsrojb[Yany{wyzwsopx|rjecabgwn]t_^prsrqle]Z^jw}}~uxyxsoou~tkfcaaest[peZmqsrqmg_Z]hu~}}twwwspns|vmgca`dpw]jmWhpsrqnha[\er}~vvwwtpnqzxngca`clxadqXdprrqojb\\dq|xvwxtqnqyxohca`ckxcbrYborrqojd^]dp|yuwwtpnpxyohcb`bjxf`r[`orsrple_]cp{{uvwuqnpwypidb`biwg_s\`orsrqlf_]co{{uvvtpnpxzpidbadlxeas\`orsrpke_]dp{zuvvtpnqyypiecbenydds[borsrojd^^dp{zvvwtqorzypjfdcfoybfrZdorsrojc^^eq{~xwwwtqpt|xoifddhsv^lmYhpsrqnha\^gr||~wxxxtrqwwoifdejvr^qh[kqsrplf_\_hs|{xxxwtrsy~vnifegmym_td\kprqojd^[_it||yyywtrtz~unigehnyk`tb]kpqpnid^[`jt||zyzxust{~unigehnyiat`^lpqpnic][`jt{}zzzxusu{}unifehoyhat`^lpqpnic][_it{}zzzxusuz}unigegmxj`sb]koqomic][_hrz~|{yyxustz~vojgfhnxk^rd[hnpomic][^grz~{{zyxusty~wpjgfgmvn]qgZfmoomid^[^fpy~z|yyxussw~xpkgefktr]klYcloonjf`\]dox~{~yxxvsrv|yrkgeeiqu`fp[`jnonkga]]cmv}~zxxvtrtz{slheeipve`ra[gmonlhc^]bkt|{xwvtrsw~}vojfeflun\niYckoonjfa^`hrz}~xwvtrru{xqkgeeiqs_ep\_inonlhc_`eoxywvurqsx~{smhedgnug^qc[gmoonjea_clv~zwvusqrw}|unifefltl]nhZdloonkgb`ckt}~|xvusqru{}wpkgfglsp]jn[`inonkgc`bhr{xvusrqtz~xqlhffjrr_ep]^hmonlhd`agpyywvtrrtzyrlhffjqsacq^]gmnnlhdaagoxzwvusrtyzsmhffiptbbq`\glnnlidaafoxzxwusrty~zsmiffiptcaq`\flnmlhdaafnw~{xwussuzzsniggkqsabp`\ekmmkgc`afnw~{xwussuzysmiggkqr`cp_\fkmljgc`afnw~{xwutsv{~yrmiggkrq_eo]]fklljfb_afow~~{xwuttw|~xqlighmsn]jl[_gklkiea_ahpx~}{yxutux}}wpligintj]mhZahllkhd`_biqy~zywuuvz|vplihkqtf_oeZbhkkjgc__bjry~~zywvuvz|vpliikqsd`pd[bhkkifc__cjry~~{yxvuw{|upliilqsdapc[cikkifb__cksy~}{yxvuw{{upliilrscapc[cikkjfc__cksy~}{yxvuw{|vpljilqse`pe[cikkjgc``cjrx}}{zxvvw{|wqmkjmrtf`pg[agkkigc`_ciqx}}|zxwvwz~}wrnkjlqth_ni\`gjkjgda`bipw|~}zywvvy}~ysnkjkptl^km]_fjkjhea`bgov{|~zywvvx|ztoljkoso`fo`]dikjifb`afmtz}{yxvvx{{upljjnrqbbpe\agjjifcaaekry~~|zxvvwz}|wrnkjlpsh^lk\^eijigdbacipw}~zxwvvx{}ysokjknrn_eo`\chjjhfcacgnu{~{ywuuvz}~zupljilppc`nf[`fijigdbbfltz{ywvuvx|~~zupljikoqf^li\_eijjhecbekry~}ywvuux{~~{wrmkjkoqi]hm^]cgiihecbdjqx}~zxvuuwz}}|wrnkijnqk^en`\bgiihfdcdipw}zxvuuvy|}|xsnkijmpl^cnb\afiihfdcdiov|zxvuuvy|}|xsnkiimpm_bnc[afiiigdcdhov|zxvuuvy|}|xsnkiilpn`anc\afiiigecdhov|{xwuuvy|}|xsoljkmpl_bnc\`ehihfdcdiov|{xwuuwz|}|xsoljknql_cnb\afhihfdcdiov{{ywvvwz}}{xsolkknqk^ena\afhihfdceiov|{ywvvx{}~{wsolkloqh^il_]cghhgeccejpw|{yxwwy|~~{wrnlkmpqf_lj^^dghhfdbbekqw|~|zxxy{}~{wrommorocamh]_dghgecbbekqw|}|zyxy{~~{wrommorobbng]_dgggecbbfkqw{}|zyyz|~~{vrommprnbbnf]_dgggecabfkqw{||{yyz|~{vrommprnbcnf]`dggfecabekqv{~|}{zyz|~~{wsommorobbng]_dfgfecabejpvz~|}{zyz|~~{wspnnprocami^^beffecabejpuz}|~|zyz|~~|xspnnoqod`lj_^beffecbbdiouy}|~|zyy{}~|xtqnmnqpg_il`]aeffedbbdhnty|~|zyyz|~~|yuqnmnpqj_fmc]`dfffdcbdgmsx|~|zyyz{}~|yuqnmmoplabmf]^beffecccglqw{~}{yxyz|}}zvsommnpnd_jk`]adffedccfjpvz~~{yxxy{||{wspmlmooh_emc]_cfgfeddeinty~{yxwxz{|{xtqnllnolaalg^^beggfedehmsx}|yxwwyz{{xuqnllmomc_jj_^begggeeehmrx|}zxwwxz{{yvromlmone^glb]`dfgffeehlqw{}zxwwxy{{yvsomlmong^eld^`cfggfeegkpv{~{ywwxy{{ywspmlmnoh_dle^_cfggfeegkpuz~{ywwxy{{zwspmlmnoi_clf^_cfggfeegjouz~{yxwxyz{zwspnllnoj`blf^_cfggfeegjouz~|zxxxz{{zwtqnmmooh_clf^_befffeegjoty}|zxxyz{{zwtqnmmonh_dle^_beffeeegjoty}|zyxyz{{zwtpnmnong_eld^_ceffeeegjoty}|zyyz{||zwspnmnome_hkb^`cefeedegkpuy}|{zz{|||yvspnnoolc`jja^adeeeddegkpuy}~}{z{|}}|yvspooppkbbki`^acdeddcdgkpuy|~~}|{{|}}|yvspoopojabkh`^acdedcceglpuy|~~}|{{|}}|yvspoopojaclh_^acdedccdglpuy|~}~}|{{|}}|yvspoopojaclg_^acdddccdglpuy|~}~~|{{|}}|yvsqoopojbckh`^acdedccdgkptx{~}}~||||}}|zwtqpopokbbkia^`cdddccdgkotx{~}}~}|||}}|zwtqpoppkcajja^`cddddddgkosw{}~}}|{||}|zwtrpoopme`hkc_`bdeddddfjnswz}~}}{{{|||zxurpoopng`fle__bdeedddfinrvz}~}|{{{||zxurpooonhackh`_acdeddefimquy|~~|{z{{|{yvsqooookcaijc_`bdeeeefhlptx|~~|{zz{{zyvtqonnomf`ekf`_bdeeeefhkosx{~|zzyzzzywtqonnnmhabjha_aceefefgjnrw{~|{yyyzzywtronmnnjbaijb_`ceffffgjmrvz~}{zyyzzywurpnnnnkc`gkd_`bdefffgimquy}}{zyyyzyxuspnmnnke_ekf`_bdefffgilpuy|~{zyyyyyxuspnmmnle`dkf`_bdefffgilpty|~{zyyyyyxuspnmmnlf`cjg`_adefffgilptx|~|zyyyyyxuspnmmmlf`cjga_adefffgilptx||zyyyzyxvsqonnnlf`djga_aceeffgilptx{~|{zyzzyxvsqonnnke`djga_aceeffgilptx{~|{zzzzyxvsqonnnke`ejf``aceeefgilptx{~}{zzzzzxvsqonnnjc`gjd``bceeeegilptx{~}|{{{{zxusqoonnibaijc_`bddeeegilptx{}~}||||{zxusqpoomhbcjib_`bcddeegilptxz}~~}~}|||{zxusqpoomhbcjib_`bcdddegilptwz|}}}~}|||{zxvsqpoomgadjhb_`bcdddefilptwz|}}}~}}|||zxvsqppomgadjhb_`bcdddefilptwz|}}}~}}|||zxvsqpoomhbcjhb``bcdddefilpsvy{|}|~}}||zxvtrppomhbciic``bcdddefhlosvy{|}|~}}||zyvtrppomicbiid``acdddefhkosvy{|}}~~}|||zyvtrpponjdbgje``acdddefhknrux{}}}~~}||{zywtrpoonkeafjfa`abddeefhjnqux{}}}~~}|{{zywurpoonkfadjhb``bcddefgjmqtwz|}~~~||{{zywusqoonlhbbhje``acdeefgjlptwz|~~~~|{{zzywusqonnmjdaejgb`acdeefgilosvz|~~|{zzyywusqonnmkfacihc`abdeffgilorvy|~|{zzyxwvsqonmmkgbbhidaabdeffgiknruy|~}{zyyxwvtrpnnmlhbafjfaabceffgiknqux{~}{zyyxwvtrpnnmlicaejgbabceffgiknqux{}}{zyyxwvtrpnmmlidadigbabceffgikmqtx{}}|zyyxwvtrponmlidadihcaaceffgijmptw{}~|zyyxwvtrponmljeadihcabceffgijmptwz}~|{zyyxvtrponmlidadihcaacdefghjmptwz|~~|{zyyxvurqonmlidaeigcaacdefghjmpswz|~}{zzyxvurqonmlidaeigbabcdefghjmpswz|~}|{zyxwurqonmlhcbfifbabcdefghjmpswy|}~~}|{{zxwurqonmkgbbhieaabcdefghjmptwy{}}~~}|{zywusqpomkfbchidaabcdeefhjmpsvy{|}~~}|{zywusqpomkfbdihdaabcdeefhjmpsvy{||}~}|{zywusqpomkfbdihdaabcddefhjmpsvxz{|}~}||zywusqpomkfbdihcaabcddefhjmpsvxz{|}~}||zywusqponkfbdihdaabcddefhjmpsuxz{|}~}|{ywusqponkfbdhieaabccdefhjloruxz{|}~}|zywusqponkgcchiebaaccdefgjloruwz{|}~||zywusrponlhcbgifbaabcdefgiloruwy{|}~|{zyxvtrponlidbeigcaabcdefgilnqtwy{|}~|{zyxvtrponliebdhhdbabcdefgiknqtwy{|}~|{zyxvtrponmjfbcgifbabcdefgikmpsvy{|}~|{zyxvtrponmkhcbeigcbbcdefgikmpsvy{}~~|{zyxvtrqonmliebchhebbcdefgijmorux{}~~|{zywvtsqonmljfbbgifcbcdefgijlorux{}~~|{zywvusqonmljfbbfigcbbdefghjloruwz|~|{zywvusqonmljgcbehgdbbcefghjlnqtwz|~}{zywvusqonmljgcaehgdbbcefghjlnqtwz|~}{zyxvusqpnmlkhdadhhdbbcefghjlnqtwy|~}{zyxvusqpnmlkhdadhhdbbcefghjlnqtwy|~}|zyxwusrpnmljgdbdhhdbbcdfghjknqsvy{}~~|zyxwusrpnmljgcbehgdbbcdfghiknpsvy{}~~|{yxwusrpnmljgcbehgdbbcdeghiknpsvy{}~~|{zxwutrpomljfcbfhfcbbcdefhiknpsvy{|}~}{zywutrpomljfccghfcbbcdefhiknpsvxz|}}|zywvtrponliebdghecbbcdefgiknpsvxz{}~}|zywvtrponliecdhhebbbcdefgiknpsvxz{|~}|{yxvtrponliecdhhebbbcdefgiknpsuxy{|~~|{yxvtrqonliecehhebbbcdefgikmpsuwy{|~~|{zxvtrqonliecdhhebbbcdefgikmpruwyz|~~|{zxvtrqonlifcdghecbbcdefgikmpruwyz|~~}{zxvtsqonljfcdghfcbbcdefgikmortwyz|}~}{zxvusqpnmjgccfhgdbbcdefghjmortwyz|}~}{zxwusqpnmkgdcehgdbbcdefghjloqtvxz|}~}{zxwusqpnmkhdcdhhecbcdefghjlnqtvxz|}~}{zxwusqpnmkieccfhfdbccdfghjlnqsvxz|}~}{zxwusqpnmljgcbehgecccdfghjknpsuxz|}}{zxwusrpnmljgdbdghfcccdeghjkmpsuxz|~}{zxwusrpomljhebcfhfdccdeghikmpruwz|~}{zxwusrpomlkheccfhgeccdeghikmoruwz|}}{zxwutrpomlkifcbehgeccdefhikmortwy|}}{zxwutrpomlkifcbeggedcdefhikmortwy{}~|zxwutrponlkifcbdggedcdefhikmoqtwy{}~|zxwutrqonlkigdbdggedcdefhikmoqtvy{}~~|zywvtrqonlkifcbdggedcdefgijloqtvy{}~~|zywvtrqonlkifcbeggedcdefgijlnqsvxz|~~|{yxvtsqonmkifcceggeccdefgijlnqsvxz|~}{yxvusqonmkifccfhgdccdefgijlnqsvxz|}}{zxvusqpnmkhecdfhfdccdefghjlnqsvxz{}}|zxwusqpnmkhecdghfdccdefghjlnqsuwy{}}|zxwusqpnmkhecdggfdccdefghjlnpsuwy{}~|zywusqpnmkheceggedccdefghjlnpsuwy{|~|zywusrpnmkheceggecccddfghjlnpsuwy{|~|{ywusrpnmkheceggfdccddfghjlnpruwxz|~|{ywutrpomkhecdghfdcccdeghikmprtvxz|~~|{ywutrpomkheddghfdcccdefhikmprtvxz|~~|{ywvtrpomkifddfggecccdefhikmortvxz|~~}{ywvtrpomligdceggecccdefhikmoqtvxz|~}{ywvtrqomljgdceggfdccdefhikmoqsvxz|~}{yxvtrqonljhecdfgfedcdefgikloqsvxz|}}{yxvtrqonlkhfcceggedddefgijlnqsuxz|}}{yxvtrqonlkigdcdggfdddefgijlnpsuwz|}}{yxvtsqonlkigdcdfgfeddefgijlnpsuwz|}}{zxvtsqonlkigecceggeddefgijlnpruwy{}~{zxvusqpnmkjhecceggfddefghjlnpruwy{}~|zxvusqpnmkjhecceggfedefghjlnprtwy{}~|zxvusqpnmkjhfccdggfedefghjkmortvy{}~|zxvusqpnmkjhfdcdggfedefghjkmortvy{}~|zxwusrpnmkjhfdceggfedefghjkmoqtvx{|~|zywusrpomljhfdceggfedefghikmoqtvxz|~|{ywutrpomljhfdceggfddeeghikmoqtvxz|~}{ywutrpomljhecdfggedddeghikmoqsvxz|~}{ywvtrpomljgeddfgfedddefhikmoqsuxz{}}{yxvtrpomljgedefgfedddefhikmoqsuwy{}}{zxvtrqomljgedefgfddddefhikmnqsuwy{}~|zxvtrqomljgedeggfddddefgiklnqsuwy{}~|zxvtsqonljgedeggfddddefgijlnpsuwy{}~|zxvusqonljgedeggfddddefgijlnprtwyz}~|zxwusqonljgedefgfedddefgijlnprtvxz|~|zywusqonljhedefgfedddefgijlnprtvxz|~|zywusqpnljhfddfgfedddefghjlnprtvxz|}{ywusrpnlkifddeggedddefghjlmprtvxz|~}{ywusrpnmkigddefgfeddefghjkmoqtvxz|~}{ywusrpnmkigeddfgfeddefghjkmoqsvxz|~}{ywusrpnmkjheddeggfedefghikmoqsuxz|~}{ywutrpomljhfdcdfgfeeefghikmoqsuwz|~}{ywvtrpomljhfdcdfgfeeefghikmoqsuwz{~~{ywvtrpomljigecdeggfeefghiklnpsuwy{}~{yxvtrqomljigeccefgfeeefhiklnpruwy{}~|zxvtrqomlkigedcefgfeeffhijlnprtwy{}~|zxvtrqonlkigedcefgfeeefgijlnprtwy{}~|zxvtsqonlkigedcefgfeeefgijlnprtvy{}|zxvtsqonlkigedcefgfeeefgijlnprtvxz||zxwusqonlkigeddefgfeeefgijlnprtvxz|~}zxwusqpnlkigeddefgfeeefghjlmortvxz|~}{ywusqpnmkigeddegffeeefghjkmoqsvxz|~}{ywusqpnmkigeddfgfeeeefghjkmoqsvxz|~}{ywusrpnmkigedefgfeddefghjkmoqsuwy{~}{ywutrpnmkigedefgfeddefghjkmoqsuwy{~~{ywvtrpnmkigedefgfeddefghikmoqsuwy{}~|zxvtrpomkigedefgfeddefghikmoqsuwy{}~|zxvtrpomkigedefgfeddefghikmnpruwy{}~|zxvtrpomkigedefgfeddefghiklnprtwy{}~|zxvtrqomkigedefgfeddeefhiklnprtvxz}~|zxvtsqomljhfddfffeedeefhijlnprtvxz||zxvusqomljhfedefffeeeefgijlnprtvxz|}zxwusqonljhfedefffeeeefgijlnprtvxz|}{ywusqonlkigeddffffeeefgijlnoqtvxz|~}{ywusqpnlkigeddefffeeefgijlmoqsvxz|~}{ywusqpnlkihfdddffffeefghjkmoqsuxz|~}{ywusqpnmkjhfdddefffeffghjkmoqsuwz|~~{ywusrpnmkjhfeddeffffffghjkmoqsuwy{~~{ywutrpnmkjhgeddefgffffghjkmoqsuwy{}~|ywutrpnmkjhgeddeffffffghikmnpsuwy{}~|zxvtrpomljigeddeffffffghikmnpruwy{}~|zxvtrpomljigeddeffffffghiklnprtwy{}|zxvtrqomljigeddeffffffghiklnprtvx{}|zxvtrqomljigeddeffffefghiklnprtvxz}}zxvtsqomljigeddefffeefghijlnprtvxz|}{xvusqonljigeddefffeeffhijlnprtvxz|~}{ywusqonljigedefffeeeffgijlnoqtvxz|~}{ywusqonljhgedefffeeeefgijlmoqsuxz|~}{ywusqpnljhgeeefffeeeefgijlmoqsuwy|~}{ywusqpnljhgeeefffeeeefghjkmoqsuwy{~~{ywusrpnljigeeefffeeeefghjkmoqsuwy{~~|zwutrpnlkigeeefffeeeefghjkmoqsuwy{~~|zxvtrpnmkigeeefffeeeefghjkmoqsuwy{}~|zxvtrpnmkigfeefffeeeefghikmnprtwy{}~|zxvtrpomkigfeeefffeeefghikmnprtvx{}|zxvtrpomkjhfeeefffeeefghiklnprtvxz}|zxvtrqomkjhfedefffeeefghiklnprtvxz|}{xvtrqomljhgedeefffeefghijlnprtvxz|}{yvusqomljigeddeffffffghijlnprtvxz|~}{ywusqonljigfddeffffffghijlnoqtvxz|~}{ywusqonlkigfeddefffffghijlmoqsuxz|~}{ywusqpnlkihfeddefffffghijlmoqsuwz|~~{ywusqpnlkihfeddefffffggijkmoqsuwy{~~|ywusqpnlkihfeddefffffgghjkmoqsuwy{~~|zwusrpnmkjhgeddefffffgghjkmoqsuwy{}~|zxvtrpnmkjhgeddeffffffghjkmoqsuwy{}~|zxvtrpnmkjhgeddeffffffghjkmnprtwy{}|zxvtrpomkjhgeddeffffffghiklnprtvx{}|zxvtrpomkjhgeddeffffffghiklnprtvxz}}zxvtrpomljhgeddeffffffghiklnprtvxz|}{xvtrqomljhgeeeefffeefghiklnprtvxz|}{ywusqomljhgeeeffffeefghijlnprtvxz|}{ywusqomljhgeeefffeeefghijlnpqsuxz|~}{ywusqomljhgeeefffeeefghijlnoqsuwz|~~{ywusqonljhgeeefffeeeffgijlmoqsuwy|~~{ywusqonljigfeefffeeeffgijlmoqsuwy{~~|zwusqpnljigfeefffeeeffgijkmoqsuwy{~~|zxvsrpnlkigfeefffeeeffghjkmoqsuwy{}~|zxvtrpnlkigfeeefffeeffghjkmoprtwy{}~|zxvtrpnmkihfeeefffeeffghjkmoprtvx{}|zxvtrpnmkihfeeeffffeffghikmnprtvxz}}zxvtrpomkjhgeeeeffffffghiklnprtvxz}}{xvtrpomkjhgeedeffffffghiklnprtvxz|}{yvtrqomljigfedeefffffghiklnprtvxz|}{ywusqomljigfedeefffffghiklnprtvxz|~}{ywusqomljigfeddefffffghijlnoqsuxz|~~{ywusqonljihfeddefffffghijlmoqsuwz|~~{ywusqonlkihfeddeeffffghijlmoqsuwy{~~|ywusqpnlkihfeddeeffffghijlmoqsuwy{~~|zwusqpnlkihgeddeeffffghijkmoqsuwy{}~|zxvtrpnlkihgeddeeffffghijkmoqsuwy{}~|zxvtrpnmkihgeedeeffffggijkmoprtvy{}|zxvtrpnmkjhgeedeeffffgghjkmnprtvx{}}zxvtrpnmkjhgeeeeffffffghjkmnprtvxz}}zxvtrpomkjhgeeeeffffffghiklnprtvxz}}{xvtrpomkjhgeeeefffeffghiklnprtvxz|}{ywtsqomkjhgfeeefffeffghiklnprtvxz|}{ywusqomkjhgfeeeffeeffghiklnpqsuxz|}{ywusqomkjhgfeeeffeeffghijlnpqsuxz|}{ywusqomljhgfeeeffeeffghijlnoqsuwz|~~{ywusqomljhgfeeeffeeffghijlmoqsuwy|~~|ywusqonljigfeeeffeeffghijlmoqsuwy{~~|zwusqpnljigfeeefffeffghijlmoqsuwy{~~|zxusrpnlkigfeeeefffffghijkmoqsuwy{}~|zxvtrpnlkihfeeeefffffggijkmoqrtwy{}|zxvtrpnmkihfeeeefffffgghjkmoprtvx{}|zxvtrpnmkihgeeeeeffffgghjkmnprtvx{}}zxvtrpomkjhgfedeeffffgghjkmnprtvxz}}{xvtrpomkjhgfedeeffffgghiklnprtvxz|}{yvtrqomljigfeddeefffgghiklnprtvxz|~}{ywusqomljigfeddeefffgghiklnprsvxz|~}{ywusqomljigfeddeefffgghiklnoqsuwz|~~{ywusqonljihfeedeefffgghijlnoqsuwy|~~|ywusqonljihfeedeefffgghijlmoqsuwy{~~|ywusqonlkihfeedeeffffghijlmoqsuwy{~~|zxusqpnlkihfeeeeeffffghijlmoqsuwy{}~|zxvtrpnlkihfeeeeeffffghijkmoqsuwy{}|zxvtrpnlkihfeeeeeffffghijkmoprtvy{}|zxvtrpnmkihgeeeeeffffgghjkmnprtvx{}}zxvtrpnmkihgfeeeeffffgghjkmnprtvxz}}{xvtrpnmkihgfeeeefffffghjklnprtvxz}}{yvtrpomkjhgfeeeefefffghiklnprtvxz|}{ywusqomkjhgfeeeeeeeffghiklnprtvxz|}{ywusqomkjhgfeeeeeeeffghiklnpqsuxz|}{ywusqomljhgfeeeeeeeffghijlnoqsuwz|~~{ywusqomljhgfeeeeeeeffghijlmoqsuwy|~~|ywusqonljigfeeeeeefffghijlmoqsuwy{~~|zwusqpnljigfeeeeeefffghijlmoqsuwy{~~|zxusrpnlkihfeeeeeffffghijkmoqsuwy{}~|zxvtrpnlkihffeeeeffffghijkmoqrtwy{}|zxvtrpnlkihgfeeeeffffghijkmoprtvy{}}zxvtrpnmkjhgfeeeeefffghijkmnprtvx{}}{xvtrpnmkjhgfeeeeefffghhjkmnprtvxz}}{yvtrpomkjhgfeeeeefffghhjklnprtvxz|}{ywtrqomkjigfeeeeefffgghjklnprtvxz|~}{ywusqomljigfeeeeefffgghiklnpqsvxz|~}{ywusqomljigfeeeeefffgghiklnoqsuwz|~~{ywusqomljihfeeeeefffgghijlnoqsuwy|~~|ywusqonljihfeeeeefffgghijlmoqsuwy{~~|zwusqonlkihfeeeeeefffghijlmoqsuwy{~~|zxusqpnlkihgfeeeeefffghijlmoqsuwy{}~|zxvtrpnlkihgfeeeeefffghijkmoqrtwy{}|zxvtrpnlkihgfeeeeefffghijkmoprtvy{}|zxvtrpnlkihgfeeeeefffggijkmnprtvx{}}zxvtrpnmkihgfeeeeeeffgghjkmnprtvxz}}{xvtrpnmkihgfeeeeeeffgghjklnprtvxz}}{yvtrpomkjhgfeeeeeefffghiklnprtvxz|}{ywusqomkjhgfeeeeeefffghiklnprtvxz|}{ywusqomkjhgfeeeeeefffghiklnpqsuwz|~~{ywusqomljhgffeeeeeeffghijlnoqsuwz|~~|ywusqomljigffeeeeefffghijlmoqsuwy|~~|zwusrpnlkihgffffffffgghjkmnprsuwy|~~|zxvtrpnmkjiggggggggghhijkmnprsuwy{~~|zxvusqonlkjihgggghhhhijklmoprtuwy{}}{ywusqpnmljihhhhhhhiiijklmoprtuwy{}}{ywutrpomlkjihhhhiiiijkklnoqrtvwy{}}{ywvtrqonmkjiihhiiijjjklmnoqrtvwy{}}{zxvtsqpnmlkjiiiiijjjkklnopqstvxy{}~|zxvusrponmkkjjjjjkkkllmnopqstvxy{}~|zywutrqpomlkkjjjkkkllmmnoprstvxy{}~|{ywvtsqponmlkkkkkllllmnnoqrsuvxy{}~~|{yxvusrqonmllkkkllllmmnopqrsuvxy{}~~}{yxvutrqponmllllllmmmnnopqrsuvxy{}~~}{zxwutsqponmmllllmmmmnoppqstuvxy{|~}{zxwvtsrqponmmmmmnnnnoopqrstuwxy{|~}|zywvutrqponnmmnnnnnnoopqrstuwxy{|~}|{yxvutsrqponnnnnnnoooppqrstuwxy{|~~|{yxwvtsrqpoonnnoooooopqqrstvwxy{|~~|{zxwvusrqppoooooooooppqrrstvwxy{|~~}{zywvutsrqpoooooooppppqrstuvwxz{|~~}{zyxvutsrqppppppppppqqrrstuvwxz{|~~}|zyxwvutsrqqpppppppqqqrsstuvwxz{|~~}|{yxwvutsrqqqqqqqqqqqrrsstuvwxz{|}}|{zywvutssrqqqqqqqqqqrrsttuvwxz{|}}|{zyxwvutsrrqqqqqqqrrrsstuvvwyz{|}~|{zyxwvutsrrrqqrrrrrrrsttuvwxyz{|}~}{zyxwvuttsrrrrrrrrrsssttuvwxyz{|}~~}|{zyxwvutssrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuutssrrrssssssttuvvwxyz{|}~~}|{zyxwvvuttsssssssstttuuvvwxyz{|}~~}|{zyxxwvuttsssssstttttuuvwwxyz{|}~~}|{zzyxwvuuttsssstttttuuvvwxxyz{|}~~}|{zyxwwvutttttttttuuuuvvwxxyz{|}~~}|{zyxxwvvutttttttuuuuvvvwxyyz{|}~~}|{zyyxwwvuutttttuuuuuvvwwxyyz{|}~~}|{zzyxwwvvuutttuuuuuvvvwwxyyz{|}~~}|{{zyxxwvvuuuuuuuuuvvvvwwxyzz{|}~~}||{zyyxwwvuuuuuuuvvvvvwwxxyzz{|}~~}}|{zyyxwwvvuuuuvvvvvvwwwxxyzz{|}~~~}|{zzyxxwwvvvvvvvvvvvwwwxyyzz{|}~~}|{{zyyxwwvvvvvvvvvvwwwxxyyz{{|}~~}||{zyyxxwwvvvvvvvwwwwwxxyyz{{|}~~}||{zzyxxwwvvvvwwwwwwwwxxyyz{{|}~~~}}|{zzyyxwwwwwwwwwwwwwxxyyzz{{|}~~~}}|{{zyyxxwwwwwwwwwwwxxxyyzz{{|}~~~}}||{zzyxxxwwwwwwwwwxxxxyyzz{{|}~~~~}||{zzyyxxwwwwxxxxxxxxxyyzz{{|}~~~~}||{{zyyxxxwwxxxxxxxxxyyyzz{||}~~~}}|{{zzyyxxxxxxxxxxxxxyyyzz{||}}~~}}|{{zzyyxxxxxxxxxxxxyyyzz{{||}}~~}}||{zzyyyxxxxxxxxxyyyyyzz{{||}}~~~}||{{zzyyxxxxxxyyyyyyyzzz{{||}}~~~}}|{{zzyyyxxxxyyyyyyyyzzz{{||}}~~~}}||{{zzyyyxxxyyyyyyyyzzz{{||}}~~~}}||{{zzyyyyyyyyyyyyyzzz{{{||}}~~~}}||{{zzzyyyyyyyyyyyzzzz{{|||}}~~}}|||{{zzyyyyyyyyzzzzzzz{{|||}}~~~}}||{{zzzyyyyyyzzzzzzz{{{|||}}~~~}}||{{{zzzyyyyzzzzzzzz{{{|||}}~~~~}}|||{{zzzyyyyzzzzzzzz{{{||}}}~~~~}}|||{{zzzzyyzzzzzzzz{{{{||}}}~~~~}}}||{{{zzzzzzzzzzzzz{{{|||}}}~~~~~}}||{{{zzzzzzzzzzz{{{{{|||}}}~~~~}}|||{{{zzzzzzz{{{{{{{{|||}}}~~~~}}}||{{{zzzzzz{{{{{{{{{|||}}}~~~~}}}||{{{zzzzz{{{{{{{{{{|||}}}~~~~}}}|||{{{zzz{{{{{{{{{{{|||}}~~~~~~}}|||{{{{{{{{{{{{{{{{||||}}~~~~~~}}|||{{{{{{{{{{{{{{{{|||}}}~~~~~~}}}|||{{{{{{{{{{{{{{||||}}}~~~~~}}}|||{{{{{{{{{{{{{{||||}}}~~~~~~}}|||{{{{{{{{{{{{{|||||}}}~~~~~~}}}|||{{{{{{{{{{{||||||}}}~~~~~~}}}|||{{{{{{|||||||||||}}}~~~~~~}}}||||{{{{|||||||||||}}}}~~~~~~}}}||||{{{|||||||||||}}}}~~~~~~}}}|||||{||||||||||||}}}}~~~~~~}}}}|||||||||||||||||}}}}~~~~~~}}}}||||||||||||||||}}}}}~~~~~~~}}}|||||||||||||||}}}}}}~~~~~~~}}}}||||||||||||||}}}}}}~~~~~~}}}}|||||||||||||}}}}}}~~~~~~~~}}}}|||||||||}}}}}}}}}~~~~~~~~}}}}||||||||}}}}}}}}}}~~~~~~~~}}}}|||||||}}}}}}}}}}}~~~~~~~~}}}}}|||||}}}}}}}}}}}}~~~~~~~~}}}}||||}}}}}}}}}}}}}~~~~~~~~}}}}}|||}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~~}}~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m41.bin b/applications/SprPoP/assets/packed/MUS/m41.bin deleted file mode 100644 index fae6352..0000000 --- a/applications/SprPoP/assets/packed/MUS/m41.bin +++ /dev/null @@ -1,2 +0,0 @@ -ĺ}yfK2:HG``v|qrDDhyjK^P~veZvyc{uVhM+`z`Nba\cfpzd{{}pXf`ziv_m~vc~Zpr{bfHWQn|rW_\|YaYsx}rryg;Hx>FKmiwpg_Qoy]jx|rfYedvuqs^hVHHJTL^v{`pQb~~wűJ=2trNKPKJssswlaqi[XXQg~q|gTXflkhYc]_n}uuw{xo{m^uc~uz{uvj;16Y{ɺ~Qe`JRYZWgcfDQBPJCTo_meMWHqf{{~{rjxSlalon|~|vut~~m~q{ƯȮR91*MS~i_mJVALSDUBKJUJg_o~wlja\TjyouyrVWdpoxo|o{}zs~hqwtN?156Szֵ|qf_SWcgNRXQeJL_uuxr~alqmsqm|xpz~l~o}{fl}}i}yrx}{eNO0@,/XӺuhwdlU`]i[cafmqzuyoxwxsnu{tydsaztovWulh}pqygr{{ZSFB1/:GѲckkcw\Zqzwyvqy}zy|txvvY^mcdaieSvgquvzw~xpupw}^[U@M+#7,65JSYnȲxos}u|w}ozt{syjzv}|^elYYa`fyzywsr~ytzmyawusr^\VIGUQH8X]a~osur|trvywyzsz|o||~~y|~zq]cW[lTc{|u~muu{xpul_nnR^W?6AJAHW`kòq}{o~~~uvviyu~|yun~}~|ohreaid`iohuy~~{lwpoz~vt^`\WHUVN;LQAVmuȽ{nqk~qx|ztw~zpxz{wzjhbhz_btq{q{ztt}py{vdplScbK?JPGGJGDYexxq~{{yrwkoqtx}v~~x|hmrnhmm`ryl|lqkpvdifbXd[H9NE3BHMo˸°wsxzztvxzottv~~hxyrvtiyzbquunbrzvtzxn~}~s|k\piXOZJGEJ<4=JqvǸ|z}ntvjtwpyw}r}oy|uyxsywiun_{~rtqtvehbaXlgTEXM9?89PWm~ųº~~wv{}z~vxwfny~kwzru}~x~|o{q\fbomx{}ry|oZkk^Zk\SMOJ677QQPzº|{rut~lrp~zxrtosty{tx|zyzrYattvwwvnysyln\cj]MVU<;?6IEOTmĸx{wxmskziv}yj|{sw|z}syqnnkkhf{tzu|~xqkvl]bhVZKQ@;>HTCJg|u|zutxq~ltz}kuvnoowtybnulkux|r~~t|onYffZUg`B<:?Wfsrxw~rzlzjhry}okytp|pro}hnvnizz~zxx{~txjegXN[bMC>6NFMHNei~óxxuz{ppkddjsztv~tsyyuttzajlej}|}zrtjlSZQXYB@CULAQZcYpºwtpvvejwpvkes|swpnu|ovqh|{{~zj}r}pkp_U_eQGG?N@ILLa^kkiȻ~w}riynheh~sy}isvzy|z{yxo}gmlej{~|znk~z|x[dV\YHIKP>;MVXMio|pxlukm|t|~wtriwwqtw{ltzkqvsuzzx~soqqd[d`LFDPYCK?P_^bY^{q~~y}ykmgvuoto{m~u|ww~wmwkbmzokw~}nv~mgbScPLT`W>AMTFLYVrn¬{xx~oqu|mfuryvqs{qgmoxxjsf|wy{r|pmxomwtZNIL_NXKCXZ\MDXnyy{xrzkfh{|kxi{sitxpzxxmxvszrghqxzwxzfoZRS^[HHILDOYM`Var~szmtrfnuspz}vtxfekyxz~~nsnx~untoq}}fWQ[aOaRSZUXKGU_bmwu·|ywni~vvzfy}~{w}|xskssw|~v}yrxpffszpts|c_di[PVVM:OLJUAMV_x~{wszoilnhj{~yt~~ogk~q~~xxuwury~vtqztj_eeTcT\g^QABRYW^`Yy~{yxwqum{{zshvzrrt~tt{qtu~|uls~lzszxoik_NPXYKTOJ]IDDGVm}¹}{uptsi_thqw~wuq{mqr{nw|zw}|nsur}}rotw[e_RdgeRBJZ]ZWDW_bxyp~rw|scan}~{znhqxyv{}x}}{yurqup{}~u`WVVQQ`GJQEJGIXiik{mgpvloxfxsmyx}}rrkusntzw~qqy{zvs|}go^Zea_RJLQW]YI[W\uz|z{nqzheqy{x}|tglssqzytxz|z|vp}v~~}hWWXPQfU[V?DFJS\\\dyunmjq|cnpchq~}twu}xfwzt|}plrvu}y{qr~mzqZde`SOW^YRTGVWKfmttu{yyogjrwywq~||nggkn}svw~{{xsw||~ylf\SM\PN`NC@GWdbX[f|ytwujktvzeddi|pvpqwzzv{x||xsspy}twp{zing`SGLY`]SBU_Rcfitwxwlmv|xupbv|y{rtphdy{u{wxxz~ty||ujhh^WfVS`RMGAJ[^XW_smy~uwyrrvfx{hddlwrz|q~{tkjwv{zzzuqzylxlvtfUQUZ]^RCOINddenzy{yzzges}}wgj|l{silspq}n~{z{y~|yu{y}sqnjekaM]VJMPSVVVWZc`]yzyutv|xnumgdkvvs|~pruhkz{}tw|~x|qp{|pzytfVT\\YVO^UCXaabcbagv}{vtx}|mdreizxpmlwil|vwxx|os~ojnqnzyagaQJJS\[MKTa]Pfffz}wy|zmmpruwuomyzzwzzxojpywx|vy~vwx{n{{okjfd_PH]TKUT\ce[SY`gz}x|yzqx}eoyuzywwrn{w}ylosyy}{}||}tposrkwaUTRXccYNLYRRbRXhowzljr{|rjkrwqy|sr{}zwuo~v{u|~uvx~y||{rlqvneZSaVVd[RU[TLJOWc}}~{hslqutwz~|xxzty|mnily{u|}~uzsruxfXTY]\ZYXXKJaVOX`dcr~xrzvlmufmy|ylmzwjvxxu}}tsx}utz}}yhR^[J\cb_XTQPPLMcfctxv{rssjhrvv~{u}vliq~~uxy{|rvu|yozrmiabg_UV]_IKYPX\XUW`s~}{{|ywvqcrsmxv{|hrtoyww{u~y}~rlt{rfk^V`]^a^NAFNQSb`bxz|on{vogfouy{ysqxxx|}|~}zy|~~}y{|uzwpjkmg_XSW_QWXDQ]_XR\kv|}|sw~|fnugn|yu{}{zv|kzvpuww}~zvy}ueqkS^a\\b_SHCJP`^Qiokwzz~{~}obcegq|qlo{{ss|zt}zu{zyrmqqsyr_VXZMObSKOWZUU\juz}}z}rustxflstxz{yjsqs|~wtu~{x|}|z~{xvoxwgme]\XRMLLFE\f[ihdjoyz{}~qgdffuzw{vqv}rr~~zwv{}{mimuxslaZ_PM[QTYRNRZdhjoju}vk{lmqrjhwrz}uyzyw|ztzx{}yz|nfyqgurgaaVJKOMJROTia[aly~|uqnlhdn{lz~yzyy|{}{yzn~{zx|z|}xwor{vmlk\M\SJW[VGCRagfad|{wm}ttxrmijtx{mt}zzzz{s|vpyyp|ytpeWMHFKP^WH]`ZYXcs{wmpqljsgkxvzz~vxnryss~xyu{~~xxzwurup[_YMRWYSMLT_b[Sefhnt~{obens{yz|ymksyyyzw{vx}uk}}{zkVQNHJ\TNVMPVZ_gmmq~qjor|~iswjlu{yv}w}xn|~~}~zv}xxww~xuy~pjt\U[WQMOTTQXUYfXasuyvzyplpuspn~vuc\`dnwnehuthmnO66^sjP6JgbJAJ_yŸzppx{jSUoibjWwxppjdgf|zhdtun~omxyyhL;A`ub@:MgxW?CK[l}~kgga_`bc]WSMcvdqdPTuvalvwzvu{{eJ4APZwmJ2/JpxdWXQLjppʺsgjbbm_V[g|pj`r}fY[j|~pkkoysmpu|v{{aYSHEO`nrdK/3LXt}{{vqyyzsopt{yrfZjjfkjltumjmriZqzxoxlfx|tlf]UQMPTbci{n_P>36DR`m{z~Ȱxqjkbj~tmpqnlb`h\bkmsvrio~}~zogjplV[cZ`holektsj]GA9'=S^is{~|}hlpmjlomq|xpmnlkifhu|uv{{|zmbchkm}|kvqaWROKA6:ETWTnvwzz}~|ztomi^X^kge|zyytm}~xsu{wrqmcRNWB:?CKRTPT_jxx{|z|}xtthggSY`^hrtqtwy|ww|we\ROSQF96CIBRSSdp}zrpmwso|qb`ejjcYUV_cfywy}oeTOUGJMCDMQKEHPVe}|}zwmejrskaZhjX]_]^dkikrxx|j_\ZZWPJDC=BTJIT\_br{ps{knymdYWahcYTZ`Vewox~{yfYbWMZXPHEECCDFOdenvnjlrsn\UbZ_f`aeebhmps|vzrd^`\SPQTI;LLIQRSTXh|}}pmuljifcfhd`]_V[igr{~|vu}wee\RZZ[\WIAEHGFSRUkry~uostrskkm[dojea_XV_ko{z{ytmf\TT[QJPDISTMGLWcq}|~~qkknqmcaeifV_dZgvzvv{~~zhag_[\ZNA=CHOYLTa\coyzrhrucfknqoe[XX[duyqvxsc]\]SS]KELSQKIPY^cgt~yuqsz}ugbim_dcY`eknms|~{y~zppifc`ZRLC>EULJUQRXfyst~swwljnl`VUWXewr{zvsx}ncd\P]YQRLJHIMPTXX[v|}xvwzzvqkkdepa\bdbcmw}~ss~qhc[PMNLFJRLXXMMQXgx~s{wm{~xromgb\WVbcbyzvyy{ztn^W_SRYWMCGQWVSMQcds|uuvuccqgffc_Z]ly|~y|y~zoeYPMMLPN?OWQOOVajpyu{}|zth^_ba\dh_mutuv|~~{|p\bZPTWULCDNWYTO`aawxrszsinddmmf]]cjszvt|x{q^QNKIP\PMRNPQRW`dfpx{{{~{ma^aafhZdjemu{}}~~zmobTWVSONONNRSNYXViq}xvxrnzmbhmkb]`fimqv}}~qbVPKLTKRUHGNV]a__do{xumhb^`nqdkjbbgt~~}zs{m`]YRIIPTQLJRaYZfjnw}~ps{polihfghhhf`n}u~zniaWR[TN\VMFEP[^YY_kksupoldbkejoc`bfp}}~xxzppg\SNOUWTIAQRS``dkqu{yw~suyth`dkmjf`ero}z{|upj``WNXSPPMLRYXWW_]`tyxpnppstenvkd_aglqvzy}|z|xkZSTUVWQNTJR_^\]`^`lywy}}ujgmrph\cf_p}{wz~yyxtuwc^bUPOQSQMMRX[QYeao|xtrz{knokkhgjlhhq|}wx|~{pe`_[UMPXJITY^_]WW[bm}~ytqonpphmkblpt||wutuz}|{ztkj]VSSX\XMIPYRR]W\gr{}|y}z~|lhjlmlgddlws|z}yrpkc^WO[XSYSRWZUNNTYd{yy}|umgiredmmov~{wxxtw|{y~xeZUTVYWRMNQNZ[RZbfkt|~utmioutkedjii}}y~xz}zzzreVQYOQ\ZUTXWSQQRZikyzw{~xjkwnprmlllmptwy|~|x}ri^[\[USSUPES[UZ]__an}zvplnsqlhkibovv~y}{~yvy{yti[_XQYZYWRKJOSUXfhj}vnrikwvrqqlhntvy}z~|{|xqke^[VPNSYNMTPXab__ep}{yyzyupooqockpjv~{|~{xy{yx{|xoef[PXXW[\VLINTWa`_qt{yxvnvwwuphcchqz}~~|z~vtqooi\SPQTMTXLQ[`^Z^hqx{xz}tlnutipmhov}}|~}}{xxx~|zyyrnuh__YVTTPLIHMXf`dolnvwyvyyuy|xmgefgty}}|{urrrsocXTVOKYTPSTYZ]agkopz{sptnswjlppptzz~yw}|{zsnwpine^\YSNNMIHVXZgccip}~xuupjgefmwu}||y|uxvy|yqia]TMWRQWUOLQZaceek}~}ymt{qqqpljr~y~|z~|v~zvxvztj`YPJIMNPVOXd^\\bkvxrqokflmhw~}~}yuy}|~|{}|vrpm[W[PQWXTLLT\_]W_jhzvyxsxwqjfiqz||}z{}||vx|yuj\RNLKPWLMWVYZ]ckmr}smoqpusktusy{~|}}{}~}zz}x}|zxwxmeeWTVVSOMMPV[X[eaiv~tv{{tlkoqswv~{|}~yyz~z}|}{~{vl]SPNNXWSZQNSW\`bcgq}uposznntmmr{}~~~|{v~{wwz}yx{zosn][ZVQOSUSPPP\^Yems}}|yxtpooppoq{z|ywwz|z}~tkbXPOUNQZTNMS\cb_ahru~|xru}vyzolknyzzrx}x}yxw{zyqxujh`YQKMSVUPKX`\fikov|zssvwtplgrxy|z}y{~~~~zw}~|ztmhe_X[UPYVRPNPY__`cklo~}zwyqr}vpmnrw|~}}|xy{}yy{{z}~rszpnng[QOQSTTMNTR^ijmruv|ypouywrjquq~{x|}||yx{w~~~|xqnjfbbXNVROQSUWXY]bhggwz~||~{u|xuqnorsrx~~vx|vx{{}zywyprsneYRQRQQNVZPYcfikjiltzwvwxtlrokv}|z{|ywx~|{{y|y}xnklkkpd]]SNLOTXUQT^fbfqnv|{}{rsuvwuroqz}}~~~ytsv{~yrvvrje`ZURKJURQXZ`hkgehms}}~{vurwzotxvz~||{zyw{zuz|~~vpmmsmfj^TPORWXTPQY[^jfiry}uqtxytnnqvu~~zyxtr||}}|{yuokjibYQNVRT\YVX]][]`foxntzrvxvwz|||||{}}|ys}}{zwy~||ztt{uswlaWRSTSRRSTNWc^bhlor~zx{}ysprplz~}z~~|vrsvwx~z~|z{zttutofWSWMRZZZXVUVYZZcml}y|{w}xuspnrx{}~|u}xx~wu{xw}|}tv|snia][VQPTVMPXV]bcabiu}{xwvwrkttu~~||usstwxu~~}yuvxwsjddWVZXXXUMINTW]fclx{uz}zuolntw|}|vz}}zwvx}~z}{{vrnke]UQQVSPWPPZ``]_fnvwvy{qqvnry|}|sqrr{{y{|~}|}|{ytkni[]\YYZXQLJMR\_[glmv~}}{skijls~y{|zxy||zzxy{{zvuttrj]UTUNQZRQTXZY[`flrw}wx{uxxoqtvy{yxsqvzuywy~{|}yvqvtjjc[XUQMMLKLY_]hhgjp|}{tokjjtxz}ytsw|}{vvzusttqibZXQNVSRVUTTZ`egjjo|{st}vstsqot|}xw}wz}{xvz~|}|yopumnpia\WPLMNMOUS_gdfjq{{vqpomlrurxtvy|}ysyzz}xvwvpjfcXPVQOUWUOOW`eggjx|yszvvyvrnou}~~~~tw}yy{||}~~~zxwyquupjcXNJIKNUXQZaaceiqx}|spqpnrplwy||vuwyzyyzz|y{~{xtpnmlaZZPPTUTQQSY_b`eony|~{swzxqlmpuz~}}|~||wvw{~|xx|z~}vrxwusnbUOKIKTQRXUY_dinqsy{sooqwypuwruz|zxur{|w}{yy{vrqslgi]UUTQNOQSTXZ_jhmx|{xyzwsqrrrss}}}xwvy~|wv|~{|~{ywsjaYRNNURT[UQRX`efgks~ztouyrwvppryzvs||{|}}ywwx|ywxrptic^YTOOSUTPLT_]dlpv~yustusronz}xvwz{zyyzvz~}~{tmg`WTVNRWSRPRX_`_agmn~~z|zwzsonqw|~}xszuw}{zzxvx}~uw{rpmdYQOQSTSMQXW`ffhlos{{uwzyuojrru~~||{wwz}wt~|~}yz|vqnlgdbWWZSRQQQSVX[_dbkvzu{}xvsrtuvx}~~~|w~~wrswxy~|y~yuwtlaXVUTRONTNQ]adgihjpz~ywyzxqrvpv~~zz}}xuvz|w{{v}|y{ytrolnh[]YSRRUVUQRW^_]hln{{xwuttspqw}y~}~|vrsuyz{yxzwqib\XUSNRYRTXZ^bb_`elv{xwruvnswz~}{{xvxyu}~wy|~|yz|~}vrqqusjjaVRPQTVROPX\[efgpxxvwyzwqopvx{|{{xutsru~}~{{yvplie]VNLSPRYXY]bb`beiq~xsu|vvyvvx{|{|~}|yztw~z{}{zz|~}z{upqtlnmcZTSTUTRQRUT_fdjptw}{utxyuqorsq}~~zvuvusxyy}}~|vpmlkhaWQVRQYYXWWXZ]adkx|~vrwsv{ywxxvx{}}~uw|wz~}xtv|~z~~}xxxquskd]VTSPOQUUOX_`glnps|}zyxvtstpnwy|~}vqqrux~xy}|~|tqqqmh^XXORVWYZXTTY]`fnnz|~{tz}zxuqmnsy}z}yvz}}yvvz~|x~~~~wswsnkgb]VPNPTQRXU[cgggks||vstwvosuqyytrqrzzv|{{}~~xutsqkgh]WYVUVUQMMQW_ihmwyyz{|}|wqmmot}xzzywvwxxz{{}ytqnliaWRQSOQXRRX]`aciot{xtwxrwuptwz|}~xtrs{zz{wwz~|{~}xuonpfca[YXVRPNLMU^\djkpw|{{vplkloz~~|yvvy{yvsw{}zwvvtmd\XVOSVRTTTTV[`dhlo~|{wu{wstuttx~~||vtyuv~|yww{|z{~|uwzrrpf_ZUOLMMLPWW`ebdgny~{vspmlrru{usuyzzut}{}zyyuoje`UUWRTWUQOSZ^`a`ityvz{wxwtpnry~}{w}|yyxwx{{{{~|z~x|wuyupiaXQNMMNRNQ\\^`djqx~~vrrrprupv}}ywxxyxtxxt~}}|wspng\]XSUVUPMNSY\]^ilp}yx{zvqoqty||}|y}ywxz||ywx|z{z{}yupg[SOMMQWQTWVY\_dilqy~vsrruunsvuy~{yxwvu|}w|~}xwz~yustogg_VWVTRPQRSVXYbdgrzyzzxsppqruw{~}xvvy|{wtw}|{~~|~{ywsk`XQMMRPRWSSW\bgijnu{wsqtzuvxsrsxzwrtzw{~}~~zyyzzuttlnla]YUPMORSSST^femsw}~{xutttsqppz}ywx{{ywvxxy~zwtmfa[TQURQXVSRTZadehmvz}ytsvsuytrrsx|uw{w|~|{{yyyyy{yvorqigb[TOOQSSQNV\^inqv|zsqsutrooxy~zxyxvwyzuw}~}xrlhc]YWORURSSTW[^adinoz~}{|ztzzvsqqtwy|xzwu|~}yvxyyy~}~xtwqoniaVQPQQRPRXU\fiknqrw~wtuvvrmqsq{~{wuvzyv{yz{z}vomkhfg]XYSQQRTUTUZ`fflvxxyyvvutuussxy}}|||xsqswz}}~wtusme^XURPMOUPSZ_dhjikpw~{xvvurvuqwz}}}~yuvyww}xw{~|{|~ytqnnofc`WTRRUVSPQW]]djjs{xvvvvtporx{}~}}}zvtrrv}z}~~|{xsmhd^XTOSVRVWVY]^]^bho}Ŀurrgiknzxjorc_\ZZ\^h|dfpnw}qWSjg7MsT3LkjXDEIHRau{dzsdp]~zYT_qykbhtexk]]bejlga_[mbjm|{cOKZkqcD7>Ocqwuttw}t|ɾ|ztZ^rpbZXZ]^akxmi|fhx}nc_evyuwm]ZavnL:C[llaMEGEKS[fu~}ŹmdslYV^euvkehszqllpssutpjf]Wdw~jhw}hQ@BHTgqtqjb]]dltst|uu|wod^\\[\`babfgrzmmwuj__js~p\TWcqvp`PE>5599@EHIMXi}ma^er|tnhntzqkb_gtwytorttqpu|}pb\SLGD>98<<.1CVb_RD:49>@KXhu~rpsj_bozv}v{nf`[X_n~~mcdpytoginviI/,A^eR?1.;L]jswxxxyyò}x{xherujdfo{~|ycTUgphiovzxrmid^cilu|{rdWLD??BMST[_bjxûobXVYalv}}l_]h|xh^\^bdcbchkt|uuxstspqw~zgUH>FQX`gmsuttv{~}~zj^Z^i{rhcdhmnpsx|zpjmklrux|tuwoj\PG>758?GLOQWabgkjhfc`bht{uorvx|twxxxxy{|ywutoikhba_^^clv}wmcYPMMPU_cekhb]XWY\^agpvwjeheeegjnqrstupnpllmjgfhmqsrmmokklid_YUV\dmy~uoliec^`deox}~{vnlje_ZZ\__^[`a`gjihgdbfmvth`RGFA>===>>?BEJKNW[bmty{~ytsv{|xwporruxyzzwrpppidd]ZYUOGA>=<;:<@<>DFILOQXcrxwxuutsrnhcabc`bc^aefedehkostz|wwvsqokeceilrtnolfdcceeddhpvx¿}voojeeeeec`_bgjjpompqrqqqqrsrqtpjjgddeddfkr{{f_OFC;99;KVew}zn[MM^sĹIJyup_QQix[Xxz`\j}jl_zzYtypppurxpqxpgijnsmS6:`h@4\yrVKWiv|}ʶżqikpomlbY\pyXds`tsmqra`nqhyjnj]VPKGEDGQ]kmZF89MfwxnaWTZcjwů¢}iZ[evnbbm{vij}iYbz~rhcgmu~vpxxnkeinptvseN:8NjugVMITbpyŴxlb]btjWS_||rhgmxzoownkheb`\VPHABLUervrgZMFDFKS]aktw~ÿyjc\Y]fp{ynlu}piea]\^acegm|unhdc][]ZZ[`fmmeXH;17ESds|th^\bp{vpmnpsxz~|rkgegceknu}}qnrt}}ujaWIB=99;=@GQ[dnux¼zxwx|z|}mdb^cjptvwy{|{vutmmooqtuuvy}{skaWNF@@GR^dnpnoomiginu}ƿ{sf]\WYaiosvz|}}{z|ursponlgdceglqopqkigeddeis~z|{uvvtsrnhb`_agklv|{vvpjhc`_^ZXXZ^enprvronnoqqrwzmaXOEB?89:>@DINTY_eqx{{vsrpnnpw}{y|wvvusrrrplidbbZUQID@=98889?GHNSSUY`jt|þzyunlhecbdfgfdciihllklnpqtuvw{zx{vpjfcb`]ZZ\\^fghjjhghloruxyojjdaaa`aekoqrprvtwzxvutqpomjjkhjlifdceilosz}wrlea_]\^abjprw{zzwsnjebaa`adggoqs}zlhbXRWkZ`M82+CV|rpsYfto\Zpz}Yhv|mw|w`PX}\pjrtk`tv~Sczvoen}jqlc}t?)Lrvii]kqstpmvqwb_bmwOXrkX\jykjWV`ht|mfruw~mYSuż`H!$LnnQQFOOFPK\lxq{y}{ztmyrPNHF_mmubZMg{~}|ohZfn|qñ{cPjaE9>>SSe~ytmcgd]Vc]k^WZkfigkxο{pngmyymd]`[PIVSf[XV_QRJKSUXZVVKONQPow{uzsjhcutuivŴ|lcVRG7 (";H[vzuhd^ZHQNQSBCJOHK@KSYabp}|w|~z|xwesr|vwzypqcnootjf`]_hixvnfk]_S]sypna]XWqz~nd^WNE1*8;]at~vwrpli\oftkdemkkf[jnz{uwwxvcb^]YWFXP_^Z[`[ZWK[X[_RSV]duq}igbe\aQbr~yvkd[LH7HG_imvu{njffdmg`x|x|xs|yyltghdKMVXZfYgcgqupsk[[QJRAG9=:@G__pp}spxdbmkh|yxuqetgqjke^W_UPgks{rif[^YZ`gYqy~rztxnZf]]gW]rwsyiihbop~|}}oywihd[gW\T[_jw~}fne]i[Vipuȹzt}xahj^[]P\ORPRQIDRRSqxu{otode^c\Z_fXn{}w~tcngm}qxvucdc_kq~|zjskXVRMUFKJZdqumtm\e\\i[_yȺ~iuuiljbhX]]da\_wyu{md`[XMHTXQjq|{{zvpojke]\hXXgh|~{znukkr|}{zpkrbV\W\\Vam}ofkVSUIQWNiȾ~ebnc[]QQJAFIOLNexxx{yz~nkdcZRWfZblj{r~ywwogppeu||mngdcXcpovn[ZXU]U^l}{yv{}nblcY_VYidt}xmxmnigfY[alorzz}{}j^VUQIK\SS`ctv~|vtpxy}vfeikd[hqmxwpig\alwvlr{lwudbfjwwx}zl`jdVZUXmpx~v{uboj\]]ZXJJWhuw|vvzyxgWUXXRLZTNZ]dsmuwzrmpqphryqkff\W`hidd~yv|icisy~tvwxxkhkmi[\dW\bi}{zkhqeefdc]Xj}vmYQTTP@ALDJNQ_oo³y~op}okjloiZX\_dfvvvvqc^dhkdn|{wz|hnndn~{jiqofRY]Zfovxzahm`]Z[]]cz}}}|vqrrk\[_ZTFRXOQRZl~~~zusw~sbgp{rzmkkki_MKZbkgurx~mkyqvxzuk_dlhbTdrz{{rtelocfjw~sjfjmgVMNGI>EMGPYm{vtrymkpbfhnng]g}}l|usqoi\NL^fnffvw~{yu|u~}{tmyzvttoc^fdh`o|~rv}}uprg^iajspuiabeojYFLMPHCUWcr~{zxxvrcrljjnz||zzkosgeYYSLETbee]t~rpkocnpddcmh^S`kuxxyrnpjh[mr~mjm_cag_N=AE@B;Qat|y|}ureg]hf\bg|{~wrzhd[``[SXb_icpyz~~~uxtyonndmkqkc[j|vttqldwuxwnrj|}u~qmfdlbf^a`[MKPNYWpwu~omirhnnkwwzvsj^]MRLUYTHJ\crjwz}|njo|sqwifdm}jmr~sfMJT|I:_sE9Mc[JNNgo{̾vomb]`y]N`|sqqi[bgxvVB<^qkSNHGSXwxnwaFNUrzdfv|pTSjef{jkhuni^httxuage\OLS_|{K9Lt`91QknxlZkwlZLW~kqrsloplpiiQE32?O]gtjngsýrmahmplcQMBHUeu{|z|plcZV\rvulhnv~~zo^F:ANmthQXW^bbolqpxllmzxxrlWchiZSNP\szy}{mp^P<4ADGNitɾt{~j`[Uc^WHPOOHL`l|rta_XYTUTSURfkxwzvdU_î}{uw}{nZVN>AFex}hnntihhp{rj[bc^VV`i|iswwxlj]ZL75081**E[vùtrg`]^^UXWnzwnvxxpuigcqtxxvd\T`ahtysy{woyuwlux~wl_TUHG49@Ttz{zpkz{}w{vjiss}u{soifhd`LI?FA;;43;^qvzz|nlgjmyz{ohafaqoqieombV`aqy~}whheee\lmhTSTRI>D?O^x}osqmkU[YXQWUH:1>55+.44;Pkr|u|||tunsq{kdclujZSbe{ywvzxeQY\[`X_TPLQKB>1.01=E`feblop|}}y{{xwntrk_Xfaf_ituvwzv~wxpad[QM_\VHFWURFNOXev|~yvu|zŴw[]YVZV^RIEOLD<6C>ET^|y~zlusjqnraThTP_vutķx[266J|ŴvaaZ\PQp]QNUTEhkfk^[QLSeviugT?:5AQQ^sk{ckwq}jposqmoYft~l}ƻ{yidRG.=NR}δypm^M\P=KKQ4LTQRFDG?K[~}o]SVV[][qbkkyrjtfs~s|psznwuosfXsmwþ˳wphP@-&7AqƳyelq[bZgJWZRV\[T?CFkhgztze]]fnkt{liu|oxqylr|yv}tcgYqdi{lbO>&!GLqé~anljuxy|yvhNNEefo~e}{qePRXaoqsnojjZ_OJUafavr|usfmrid_TF.5,?Z_°{ntpcqvta^[zmtuo[YY]fjrw|pYVBGYZSG[WU^_tk||uqqrvxuw~mkaTUUUJ9<+MbrƼ{pjktxx|{oogkumnhjeouxmjSZf^SEM=RUee`ebc`iiYfaywqrhwhbGB>B?#$%#OW}Ƽѿzs}zwpYZEdgo{|jetj}yaSlngXSUSe_tffZXUbp\T[Tsfpwx~yq\JC;A6&0-?Mtѵ}Z]STdUu}}zpXrhwukfJ^nhiZXI^]svqihjiyoZdQbcfstzrzoZVNYT7>,&:5Zsij}qlYmYhwq{|rvqºprqrvxSNd]]KD:FR\wvthg_q}enhf|mp}z~wrfq]mrpabZU[D?G-A?Vtotbimcqz}wqvdtn{WcdZ\NG:IE\ibTTSTnibwfqnr{vtmuiYhdYKI@KI0A96IBaqʽ˷ƻtdgVjds|yzs{aXci|gxstl]OIQH`geYYKPcRW_Oc\pzjbi^MKNFO='9(,29Zj;qd\L]Rfq~w~XSVcytqrjaUYYVuzoecPW_FY_WcXpw~}~onsiZYUOW>*6!18E^jİŸxo`LVRowv~|^VTa~ofpdhe^V`aZtyplkZ_gRdi`jbvys{v~uqxpqxhTTVT`J4D3>GVltĮ|mXec{ytmsyi`_qpjvge`VNVSFcngfk^ajMYgapmu{{wvknk`fXFEJI[R9E38L`}ǹ~`cbx|}sjpowwfsdhotrjg[NS\J\md^bWLWDB[Xkr|rm~q[g]F;>:GL,60,F_ǵĽrxXTYoyvsppYoo[\cĤtyppf[blV^rg_`VKXG:QL\hzyysjodJ=<3;G0;4(?Y~ź}o}aXYk~wtzrpVhj[`io{uqtn`doZavoimfU]M>QJWd||yn{zxioeMCA:ES0B]lbar~}no|xs[stjkwpwlih^TbiUcvpppcU_LIWPbtrhswlmsbk[HEE;FK=RA9Lopil}hnz{uwn_wnjoĹzvhgh_XhcOaiafgYPXDRXTdymhopgvkbcH<:4.B>AS=AY~Ĺr}lix{hym{wkoV\j`dr¬ytto`er\Sd_ckeONHJ3.Gkzzf`nw~wsuv^ii[]ku}trombsifmaowq[XIJWGKax}xjhpir}qy\ECB;=C@VI6<`w¼xmrzswqpzwi`pa^jz~xqocaxo]g__rvm]WCSPFSr~pkkmezlmhE?;>4??MV?3Ij|vowzsju}{~ymo[fh\bvz~~uq^jyjeiUbmp^SE@QECZzxpslkxfq`D=87-74KK62Pku}}ynptxlwsx}xmjWd\Q[st{|vexoplVeko]WDDN?=Xrzxovnv{nx`J?:4+37QI65Qgu|w{rxtv}pzq~zpk[dWN`zx}yfw|ovp\ipwd]HJP?;Wq|{tiqkwwitaQB>:28LVQUqz~{tttw}uxlZRWITJNcotuyt}|rhc`y}z}[O\qwpnle|tuxoi_w~yeOGIUaMX[MAETVUjyvy~xtrpz{zzoaRUGRMFZmusw{{tjf_rzwcPUlvrqnawtq|qj\q{lSHGQbOVZPHGUYWiuxt{|vrp}v~v}yqfWXHTQDUlvsvrji`oyxkVTivturbwwr}{riZlvpSFCMbRY[VRMX]\kr{r{~vrp~~twupf\WFVPFUp{w{mhibru{iYVlxw}uf{uv|xvdZkq}lNC?N_R^XWURZ^bps}}o{vrm~roomb]QDWMGVs|u}igfcpm}{gYXnxypk|u||yy^_ip|gJA@UQ[XRZXTW]ki}ü~koynxs{|lkohg[DTMFJexrspilksk}}k`Vbpuqitp|xw}hfjm|qSE=OTY_QX\WQUchjtlwqp}zttglliiLPTKJWrun|jmktlsrj^^js}{iqlv|s}zuckgtybM@FSScWT]_UQ[ibzmo~py|t{yiclhn_KVNKL`ursthkotg|}pj__kutpqn~zs{njiitqZG=JLXaRWaaRPafeukqzs{xy|y|cciioTOQJKOespy|pjkvnh}tng_^ixrvlqws}opikqlXEALH^\QWb_OPdblqjqxuxx}}y{{`afjmSSMJKPbpqzysjlxjixpnia\fy|rxhr}uqzssiknk[FEJG`ZRXfcOQeaqpjp{xvx{v{|_^dmmWWLKNR^mt|ywjl{kjvppng\bx|v|jq{tn~xvujjjh_JGJF`^W\jlXTfdsump~yww~ssbZ`lo\\NLRW^ly||kizmiqlpqn`_w{oqztmwx}wxigdcbOHKC]`[]ksdYijx|oo|~vt{vljVXep`aSKS[_fwqdrpemgmquj^l{zpywpq~z~v}ngc^bZJMAR`^`hwschnvzrmuxuv|kyt\R[oed]LQZaanzfksflcgovsac{zsxwqouz~uwke[]`QPCL^_divzmjnuz~xot~yur{kvzcSVnghdOQ\ecimlshnbdnwwgbvyvvsomp|{t{nf[ZbYVGM^ahmx}upouzytv}|tnykt{{gUSlhmjUU_iehpnqjpb}{qnoijquhuvsbT]faZIVm̾uS67F;Umt}µp|v^rmGKRl}x||<6wqbeTKV[ppil~ŷ;$̮F)UgqXB6-0;DTbxoU]kͻf\bc{ple]`eb^qþyzS07<[ytY>RiaTR\TQ`yèc* 3҆;"(F_WWKBEMS`s{md`F=UqƾwdTOnqxƾpr|o{}}`K:JSU[jtdWb]kp}sbWNf|zr^UatMWwP;NPQULLW]bitWHBEB-@VzqNQ__p{ǽ~fTQklr~rnpiaelhSZ^l}xgeUZssqyxO-n⾔ha\MNCID7RUXnùztvwk`\Qb}~i~{{a`J=>EPi|ikprZp|jkW\WDCPTEEQfzw||lXnfw{jgNADQG9LANQb~oyynusvhm|c\HD.AHBLL]`jz̶u|{urj`eg{~lo}qp]P>86Fr~µkp~s}ovbRWTUEGAVZJ^y|rxzsvtl\ngngUF443PEG\pp~z~r{~zaZ\klŷ{xlg_qnOH?>0Qeordo{}|cjQGFE:7RMWRf}{txtm_WZsYN?<&5HFQOg{ǻϴwpozqfXJa|w{pwdSob\A)4=MXǴsepwzpedHI30[]}oVejuntnqlb_RQGB6?49MR|İ}ttondgug½~{}vxqtdKXEQEC3_b}fnshzfrn_rZVKHFKT,? -KkͺƷƒvqzm|y]ygquxεylmx|nt~Ob?6FIXCENcq˦qtrsxZr^@F2'B\Uzzzje^cn}{s\eX6CAC9+%>;^w{ͼģxrvfpr`u]xtuɾvadkkedKPB@VKOVPeŷ~ruq|mh`R]?/=9?9I]xttqebnpyqiTHEJ.>I3-7DK{϶¹~zzlnbkfnpiqedvdfoVW?<4H]K`Yj}Ũs{usp\rSB?A?2]g|vd_Zy`xVPSG>)D?@7=MXŲǪ}refdrhrr}µglhkZ`YhcDG0MKNfUZ|οįjrwhntGWGC:2Eb{}~cW\ferqYjGI0/M@C:*6e~xmgqde_YbƿylgvX^_dU>#4H=drb{ĹlqtlmkTZZ;J>N^jtqbhZ_fif_eZ8 >14RICSgzʶ}jbl[krcdy|xgLQQRi`I9<-PeVys|mqkgwzj^hX^19VH\j}z]dTG\mZcfU7H;7A.HFKhy˹ȩ}{|ftgH[VwuūdaWQfBFF3-0SWm}ƹmimawe[UUM;ZYh`l_jkVZ_VqfUM?7)01CYZs^|μzqfjtY_ZuukǙxZFJ]NJLGG5@WVwwºð~ojkhmpur]^KLMNUjxvqV\bOMZ^ZO[\G.01DRfdlpİÿrzu`QVcdrsm{yhbVME=C=D@4GolųɠynxipnafSHbVHRekwz}usibjdcTchM]JI:0EHacacҺнp{xyWa]ZYhfn`acBBC8;SK=HKZ{s¼z~inuhlzX[^LMESsp{y|jqa`UHN]eOcC,:.?`N`gs}Ҹɭv~ygbUeXRbal¿k}`GJ84JBFP=6ShrĴ}{~pgg_giUXJAQ[u}}wr|rbt\WU[V[N:P9+DEFTa|{˪x}[_YQPPd}~vYe>,8HFPVH;A_vʹƽ~ythrdmkgXH\U[ojw~|uzZRaHY[hMDXCDNLTX=CB>UqxvįʵzcygyihbGKKR\h}x{r~fbg]_JhRTcBP?%3JWSqok´yvYRLKKfz~sCGN>?[J4O>CTdoqƺĥwifrWkdSiVSWQZp{ogj\YZ[A\X;^E7@=GNVYfw~rkrxQUQAU[{vs]TPSB6ODCD9D3A\{Ѹkit`lchiRTUc`t}lVOSWSKjeUWBI5.>T^XjsǶsvvutQKNUTcjbMUJ57;?8BGDW`òua`fihwrj_M[]q{s~daZX[HOUXMIN?>;Pjiyå|uvyy~ybVFUY[{tvr_OOIA<:OIHRDL_tva_h^juhma`\bqpkcXNQUSVR_ZLSH7@BZ`sұ{kxto{h]YSVRexstzbTS62,6?DNS\^wom_e]^_de\mqo{z}|qeneRVKDOIQHLHJCGbfr~Ű}rrfd^]RXcXcrvvji]NHFA1:>8CKhmq{}{vgYfb]bi|mciqn|~xkcSXNMKQLOQ??=NREOo~ɫtvtiham\MP`[n|su^E57F4.:ICWau}zu}tYR^\Vdjzqgxyz{lgT?:7QMFCN>CMR]S`ɹxcbjYe_aYGUtwrnmabP9A=D4)BY]`vxypuskeLNjuotymwkxkcs~fUQO7GCSN6APNDOPc{ɵbUnypbbMZVi~l|~XQTG6996GF^`ag}k{uqVWSYopq}|}{}kq{yzN=KI@AN\LJDHdeu׼Į|jtn^]N^`XWm}ȴoofgoSA3,@6:BcVgtnp^cbUO]k`~z}a~|xfg\XdMB91JEC=TBJS[{nپt}zh\ekVj\ocLm}ulzi^LS2466J2Cgqstqw~k{dq]B_ksnsqztmdp]P@R8>AFZ6?Z]ZOXf¼}kMgljXVSinyƮzsyupzOKULB226PLkypyby~|g[Teggzjuqw}qloqdpD?TOM?BBTEZiXXmrѱvsfmphsVYY_qrh]fKMXD9FA[iYb^rxc\XWzqlrfxuwo|f~~j\NWFI]LCVM\eLOFMm|ڲȾ|pj_~whgO[`ge~xrxkgjC:2+DIURqhvswz_Y___fnsbz~zfjj_PaG:<3LSXK__[olѭyhlehc}dj_cy\xot`ilfPKO>QBa_Jjp||}{|nzphYvZaxmkty|biZV\UJ@T@XRblDVbfkfvDZ}cwjWvwygZ[t{n{|}mR@MGO@CSsjztgy|z}xv_ux~{_vmgyxkkkp`ljowtrp{uveYfjA_^P[DHYgc|s|s_U7TLR[FjwxqiXuxstxo^]xj{mdvtgxaUbNP]mg|zp{coLCER>\gle_SReey~bxmyh]hio\WHEXmxzuyeRz^dnSsoitzjs|V`l`rxrhb_wyTXZjmMOW6PgdfaJorlûӴ{{}fpq_VlmzyqZQK\Z|~kmkk\L\_ped|qlv~raSWYMVdx}rSuzjksb~dQCMUPtunansyƻѽ~xbad@RHcjvwdOfdz}|zjmVib`z`jxfo{{lL_LEP_s}yftvzoyhkflpWKZFbg}l_mrz~׻tgpX`SRR[}k{dSf^un{|oiaeZbn_|ntsy`QFLK?j~si[orlz}pib_EVCfqvz{qr~sĭҦ|pfeFRFZuerzoWUssh|mhvrYubivk{v}{Y\WKKTS}{k{td|wxgvj}g_aSZlnxtuvjmɳ~twgU^RHVvikrbK]k}qst}h{fZ^ojgy}tcXODIHIm{z{iqbiynwstsd[eLTyjn{zxw{ʭsjgIVMMxZmxW\go}ns{}itdmmow_suyx~z\nVKT:Yqworjdzwti|tepeaasm~hw}dssɶtleONNFq`rn|tMSvw|zoxi[cmu`ztvz\^_JA>P[y{r``ozsayf[nTfivn{z{oˤz}`OX>^`Zsp~f^mpxw~wxwtpjdkqlyr{m_wQMI5Srt{~~dhwz~{~uhvsiluskztqwo|l{||}yz|W?PDS]iovTXh{zikkljmoes{q\iTH48_i}yqjYpp}~iqxkhkrif}xyuwouuyTVIBdBhqx}}ljq}|ryshzs]wgzsxtfjjV^2Gfnunhhuz||pfx[s|qjwpxixiwsuJI?HYLqyw`rnv|mlureaxbtgueMX;7]w~ingVhzrymjxgok}fin|syw|u~na\CQYRknyqrwtttvofb{|ywmwXV^9Ghj}zsorkf{oyz~fxx}klu|vym{r|{xysn~~XZQ6WY]u`tu|}j}}ellupxwkqLPN;Vgtzkc_glZ{rz[syk|xjrzka~{pynrhnxuk`WCXN`uuot|{`f|qd{lymjzRXWOkg~z~bbj^mcg~|kpkfjovtuh~rryyksmd~cWk@HNer{zuz{zxpm}mpghxm}lZdSFiqs}qxefTemQZysvmtwgfmyo|{vyp{qe_hednWTNnto~zn|x}~pu~sknysv~roabKYljz{~tjc\gy\]zmme}xgsw~}n~k~pyvw^qinaNZM`xy~r}otvupgqcm}wzuzuVaPOvnu}uqj`^jWhm~{z~{nxqspyqpkz~oxbuxgjrcgycfaPO[ngr|~pv~ta~}jmgs{r}s]bdLhv~vwcnfLmaRvsu~xxtwiny{q|qswrp}wtcegoegzcdlIXMTcswvqo[~b_p|tvZt[aii}sxsgWY_Zbcj}t{sfqhuolpxwx~nfua_tbdjevZSY`\j~{|rvux]y|he{}h`dYZgr|tsyglgYf^gv`xx}ootqop~{wr{vQ|}kdpurmezuTGOc]fzsnovqmju}xngsUW_\|xropgfhOgjhl}yk{{yqyyj|yw}{w[_sllgeslZfDNV[avyttimzyiowrpxkdcZc]k~y{xb`iO]j\jxv{pp~ilo{llsnt[jwrn\ffldlwWIEd`Vts~u[trqymfoyrzbejjnxw|ztwl[[RWlb]rw|~xvzrdotjfvno`uv|l]^ZcyXfxaNSfldstig{tvklqd|n]hhe~}zxtlt`YcSajfjs}xnnwjquxay||zcWuf~fg`^`yjkun]_\bg|okh}vuyskkkguqle`mt~vlpUg\mgXar}ttsuzung|{ogWfcyxefdf]gbszde\Vfbsz~dv}lslkj}zrZzlbju|nsvugZVgbWXmyx{|jmuemj~xzgJcluvstjWdRWfczri^^[ixw|luudn{|s\jzemsc}vyiaqucbZXf[No|~vuufgc}gk}~vXVpwpd}im^[KRZjkdolcjwy{}tlsmp}zldypr}ppm_^grt_PZpdTguyo^lfxqsziTchr~l`krrUVTS`h|fq{oplx}z{nlupclvtqiw~rxsy·d9*7-(:Vewylutzȳop~u}}v^`XXQ;8G^r}pv|kg]W\eɿw_XRej^^klέ{p^@@Q]u~_D44W`ohlpfSZF1'-FNWx_Wffu}}lKKC9?_{Ÿ~xpswklXWQ_eadsvtla[Scs|ĺjb^pn`c[H8NWmru|qtoWMF]_V]~uO4=AY~wv}{ywqkx~tp[kjt~|lm_dlepiXNNLMUvu~iPEAYlw}}hQXah^xΧyr~vs\^e|mey{Ż}iF>GDYdxpz~y`kryrplejfmq_[[J[TTP?16?UfzaWOUcdesaVX^obI?HPMLqšr{{~tfs~q_drkwsnxn}{}lpf`q~~rmlPVNOMCOitiWZSKabqrkhmjlhsphwo`S[gYEDP^\d~n[fbhQAIcxxwy|zztp`iVOjʴ`\RJRT\g{zsaWOIR?AS\O]|nqeflso{dN?+T]R;DLLm{gXgyo\H_vtfPY~}}tzwtP<6>IqƾwX\bbUMA:Wmrdcmn~gc|{\Xnt{l_GPesopiWFD5G]VuθrYWmrzebd{g[HL;LKWvxѴzhl^Q>E4@`~ɵvqnv~cRU[BYuna?*2;_{vx~gtrrqmx|hk[Q0!6Ocnl_Z\auhU]huxnxswkpvikZA./6MRU_lǿ~h{nsq}UUIV^mbixoon|sluilu{yekpTT`{{fXRNC`qvwsap\]W]VgucP1BXnxӼ{VVQwvtona~ofWCI55>KQ_zmki~lT\jWTNYEMmhy}kvf\?K^}zpdcguaTbjmt]W^~y~z~wT`CeqZu~ytxWte`V\;7eTUWf}սȽؼ|mcpmT_WeL]uc_cyurrW{lwwz}qxd>ZEG-;DDX[Stekdmgzbm`huvbkrvfezkdoww{fGJ8HYbXsqxxwyjrV]hD8K8Ygjsyribnmweq|zuivznndjyVhurqvx{rpmpidzphS^W[ysé|r~{mpaJ[FRNULIUZVoóvw{kRkmy|olSD`GIDesvxqmwyouep?IA=?^S_oq{wt_Xo_zbsxhx~vsr{u|zVhbSKTZD@OQKo}ĶayloOJphuoXQmopjoc\ify}x[rvPRxp{zj|~}qWQ;W^hl~zɴklr|lbjnrN(C`tnr|qwyt|mfho^g\Tal~|r\rlQMe~{]IJbԹ}fglz~oujjkyubR29Sw||ufN^}scUHXpxobUP[nUQ_x{zndgm^N^pxQB9@8G_WRE122MOOWpѲcYNSNUfdnma\]^LALimkdlhWGvyslpUA;/8CXq|vOK^ov{}Ա}ygZcgjvi]HdopstoeZRAKID\`x}~dv~}{cOPxz}tyH+=PQXƦuwtvtlpsqm]SI=*5[]|n_~}ɽktekuw}\gjUhjo^c}lp|qgwxQO]^TBX\Rah~˷gya_wkq{rqfxv`O1;FOphrwiIYoxmc]^U_eR]C@<>_eg{tŹzye]>Zydwwĵpm]2-(-VYx{pWnziu~rT\uwkbTjgejQGJv}rfaZ_eaz{}wisxdLSRhbied_\hp{߿qrqfvvqzqs|rǣ|nfzso[9QWTcO[:%1*4@`Ztʱ{pOhjoWNHN79GLi]nrnh}jsu~zt}n^zpff[LDYjbŦu}ngML[]PTYyyw]iaf]egXfxnjmsWJD[\kkdK]`RTPjj~m}rb^T>KUNdea`\N?ZTpjt}ʳp`_n{tt|v{z}rk|apsuovotaOVDWE2;@D8dssrougl~ybgUqrifssttpy~~xtuwgv|ovlZ]BF070@Yqy}Ǹ|}xT[nun~hvyi|taZjfoZ{sstmsoaiaUF;OpowsV^XW\l_noc`gW\vst^eYcowqXSV}|wv\JZ\fj_svјmmio{lX_YRZdYRvx~z{xzxnlgR3;RRYMWyvbYiMeuwȖfbdM^aHf}ɭ~}~|fnLC[myy]@7qyz~wo]i~ysiQYX8Od^{zlNIszz{FFYtwhfHOgsdKTTTshnuhrngqfpvf]a\xplduhbL6AxveOSpzϺzqbM_qXKe`i̺̬ŵU"J˴^45L6&#?ifnj~vlj{rpfMal\XX_LZT:I`~om\Soƺwx|}qpnlR;=_wyxuusYL\R]opgMKF^i[gttȿkE9A5$/U™kbag[sjV`l~aJK:6JnwgB2&.K]nykcKXJHUfTXMQSj~~_3DLk¦h<->DO]t|}isȱuv`Z_r{~QOLbLJQFF1 328Ar|{`A=3/&0a`czW]PTmb]`fzlXlmsxX]lbttNIUaPTdpzv_EPIZröntv{jMV_RK;Lf~UTKLjxuqmwuuoN'6994AZip^Opr{zVW`xpgtrwuzg{xjcb}|t|~tgabel~RGH\qu~{zyĹunpmaw|Ĥu7**&+4adpcYV^mZOLRa>AJclbk^hipyyzwqfMgeyru_ZifkU]ROgqnfgvr}gdlgfmvhx]]hkal}zz|ccllobvfYQXXJJ.0/:\vymYOWZgU`PE[^hd{sl`]Xr\FDOs~xvqvwnok[azνp^QJJ6Eeqq[YKdsy|fhbe_lzzpz`\Wkwl}t~kz}upr{vtnoqqĽzZf]dtmnimllm^^nvwîp}z|\]OX\Kbwdj[OI9:NVip_{gehtp`Y`Pd]lǢ|z|}}xzrb?VMHgzpirxw~}zpnnjkZL0GQF;09/9EEQP`gnvrzsqy|tvkaaadv}[Wdpta\YZT=_pʽtgn}vu~x}m`kt}{yj`lb^^\Yic@I[UUSA8LCWjv}kfszot}ssa[]YWswlvQGUirilp{|npzhmxmhxib[Uru|~ʺuwx{{mhkb_\VZpgOat|}t{xoxdcothqzg`U944.-MQ\oX_zzz~r}_MV_XZrwzsx}wjidfy}tYXcFHHMU^exkyfgx|n_zjY^knk~}r{k[gpq}~xpvnlrdvn`^^\l`_wndiǺ{xrk}yrke_[e{wex{y~{snqptr}ghZflZf|}||lQSib]BLauvȾĿǷh\P83BQtxwaHSP^ZOVQQ]Yefb^BACJCBC9;V\m{}yio^owrqcZXLYW_kSGCNRPYZO\HDE?FNU[y{ztg|}tl{|xp^Z`qsbmh{olutwvuSFDG;.9EF^Vf}r\cXQdfi`TWRV`ZtskeltvzxkdgnvvƷýyn_LJNg|~ξl_f^w{rhXSY[j]dcI>@F=2?EH[MVcfgmj_M[SRgnxqinlrum}vmnpmtouq`YF99=A@NhiursĸukmmziihK936, *4>[Wevyyq}{kjegeVgb_XVWT\j]fg[ZH=?EHEPifzyhYIEFZvz˿sxizpceh{tp|iZRWTIMX[wvw|u~s~~zxspihvmjn\\J52:?AHnyƵ~tqxpcVRT^|}t{mpcg}nZWWgk]k]OBAA99HLlz{qyv}vnppzgjohonmgeuyx{|hbkpolxdRLNUu~ÿ}giYXlqveQLL^g]lbYNIG>:C@Yc`g__lwxe]cT_^eohcfjxfhmgqvwplz~|w{t\MSWVRqrkmpwxofaosgp`VH@90/9:\ks}ryqsyqjjnzfhg_iomb\hgkufnhREJNHC_ex~uwynWRR[swqxmgdwxwtqibZPRTRpszsr{sy{u~pirjrsdj_F:=A9=[e~{zytw^JIIWcg}yyxqhhypxufbXM?7>9Fbfy|w~}}{wzimxylour||ub]``Scq|{~ueH9:>SWnƺ{pist~xcVMY`]l`]\VJ>?C;U_gulgvtxx||~~zowxmumw~owq^OMNFD[b||fcdry{u~xfYXe]jeZYUI807.GHIcq{~~tk^gbclenz~}vz~vwtpm]jjghkk^LF8@IF[gmvwyz}yjRWXVkt~xtzy{q{}|skwn~|{\DE=>BHOe\V\^WUkhsnOZV`b~~ҹupSQUReYLILHLGEMA=Nl}zyfVS`[fwwtdb{vlu]Znurp}yt{~kYg^XfXSO>11MYeqn~uwƷ|vwr^gYn}fLIcit_Ven{~{}j_uvufUD00/685CIFIJVkwuvbemhmnkrzuqot^PYK`{yu|o|nfq{tgbOZw|eUcisnhbc^f~~ſiOALP^{zYNPcu~n^[rm]KOOM[GA=9-)@?=10BV_TJKcq~kfwlkg^ap{|~zzaYXba[i[g|}lcrnwyjnmhub_kvlVZNS`~~maz~{i^moxsҸ|{rw_>:FZe~}{`I>IJYQD8!$#)>ObVSZq|{}{{~|cfb^EC@H`wƩj[hr|wsYM<3BFN>P^vjif}}sojp~ytkw{xqmXRDRy}}st~h\BDUcmqlRQES_mfVfewdfhzx}~{iqzyqx~vvlos~mjd|xqykt^ORRcp{xjjwn[\Xin}iluz}ztz|ym||wq_\dlspgc{slTOKXzrhyqu\Vkuy{rRTOTU^ZKa`}zb]PYUsur}uwxzrz}nsnprvt~}ykg\ydX_Q_WgZRPIavгfqwdcXXYiU^hw|wku{pn\g|{t}qZaVd~qksib;;R[dqgLPHLPhaZfapb^_lrs{||lrs~xcqmkqffouzqj_cltoowlq[ZQWp|~{{nokgimrzz{s}xww|{qgZikqzu\p|gY]SkpnveLcqu}\PSRS\fP]Zo~edUXPjyj|zln|tropx|}pwmhryo~}wki[|p[[OaX]YWUJ_m}ʶq}oqkdftakhwzzlom}qjWhtv{t`i^{wttzlAJ[aiw^LSOIPi]fbi{gdWZ\ywo{xyypmr{zwrirgsncjqh}}miZwwekdwomg`YLbp{v|nouoiu}}psqxu}xujYijlwz]io`eZw|uutUhuziVZUP[m^bXevhfXVOhzk{ygfuqrphiu}s~vytgpzm}~vli\xw_YM_YVTVQFY`jxûu{uil}qsjozylid}}~vzwmYgkqwt~hlhzzwXYbglyfOWUJMdchbavkgYURi|owuv|rjm{wp{v~pvlvtegrdk|ql]j{b]YkqhdebMYck{|o|zznk{wnluut|~uuxbclio|tXq}jdii~v{r^mxj_aVO`qljXgpleXTRrzp|tb`kitoaar~{ovvwipuf~zrkf_vs^SP^ZQQ[PJ]]fxr}ƶ}{nqpm}{ojcw}{~wnz|tzw^gihtjslqwuqbgloxw[X[RM]kkj[lrnbVQTyojokxsdgu~zouzyvpszkailZsurle_qmYPVhjabo]Wecnt{znrxoh}w~t{xq|{nuxbilhp~vZq{mgpwv{xektqfeXR]rwr\bnpf[SRo}y{scW__pq^]mprw~~yifn]lwnia\hp^OOZ^TPa[Pbahuzsƽ~sr~mzslfq|z{u}|siowymvghkekzixsyuxlkmvu{g\]TQYnuq]aqvi\RPj~rbfdsu`brpqy|~xmoxl`]hWc}njjd_el[LNZfb`tl`lfkww}ss{~tiuvsu~u}qjr{|lw{emjgmzy`p{ukww~~ois~tlg[X_u~v_cqsd[RVp}xp_SWZqmZapptz{xvhegVn~lmf_]eiWLSZbTYk[]dakxt{Ľxwx{r}rih}svuuv}}{}xgjnxokuiodgm}pj|xu{qm{z}seaUTVgzzeYixnaVP`txu__]mw_\j|skyxrr{oeXbWZxkehaabi_MOSab\tpdmeipw~yxyvmzuop~{s|ommxzl}{hmdeixudu~{vl|{ukzvpb^]d|q^gxoaYR_qqoVPP^q\Uapxjyv}yz|tbh^Yvohmb`]daPQR_`ShgY`[`g{{pŷ|{{u}wnhwtpp~vp{~}z{ijhtsg|yjmbceurgzv{q{qgWYXb|~mYezqe[T`ptwa[Ziy_XaqufwuzwsmZ`YUrldiab_ecQPN\bYordh`cfx|s~}|~yxpzynlwynw{wsnirzl|kjbbbqvirz|zlyszgdfd}zde|wh^U`n~tuaRQXrbR[f~|gtxyx~lhiYovhoifa`eYRQVeXbo]\XX[jyovízzv~tgn{klljowxzvztgfdtlj~siga`evoky~z~z|m[a\ip\j|pgZYfp|rt_\Xlz^Z`suixt|{yr]dZXrlgjdc^bcVRM\aYosee`acw{t·}zyxny|njo}jr|{t~|xmggvlrsjd`^ixppy}uw}|vfmetr`rshW[gq{rqZUOfrWW]trjyuzzyfka^tnjljg_`bWSO^b[op`]YZ\tyt}ú~|}x~peqyxjgkkpz|r~wpspf`_pjl~sidb^ewrpw~{v_e`hw_h|rjZYfk}}or`[Vf}f]brmwvztyv`_\Shlfhfe]\b\VOVc[kxlgbdbt{yyr{kt|olhoqxx~rvztvwng`onl|neb^avvtx}~{gmjm}dh~wo\Weh{prbYQ]wdY^nmuvyq{zzfecXjnhiii`]a]WOWd_mylb]_[n|z|ystcmu|{lgeqrxy|nu~wnnnh_[kim~xjab]dwuvw~~|ciblv`j{rjVZgi}ynn_ZTj}gbdzqyv{{t{zt_aXVghggie[[`^WO\basxldcdd{Ź}~~~yvpixzuogq}pr{xum|~}}}sorsl`fokxuhaa[mwvyxojnj~mbwyrcUcfpqqg^VYtm\]gqqtw}qvx{jdcZemkjjlc]_b\PTbamzqd\_Yjy{~|tucpt{xogfqqwzynv}vmloj\\ihq~wh]`Yfvvys~xhmfuq`qxqeS`gl~sph`XWsucafvruw|~uvy}nc`V_giihmc[[a_RS`_kwre\a[j{}|ï}|txhv{{sjjqouyvnw~~}vnntpablkvxi]aWesuxq~ylqm|udtzuhWdhl}sqjbYWpo]Y_{smpty}utw}pge]dlonlqg_^dbSR^`lxseX\Tarv|uñv|gqwxzskf}rnq~{qv|}{plpp`Zefp|ykZ\V^psxounqktydlxulW^hgyvpkd]Ujvf__vzpqtyz|twxif[]dilhpj_Z_dXOZ^ftukY[Z\rxzyź}yom{yxsgt|ql}zrpx|}tlmun^din{~wc\]Whqwwm~ypqptguxvfYggmzrpheY[rn`Y`{snmsu{vrw~qic^eipnnti_\efUS\`nwugW\T_pv}r|ĵzkpxuzvofwwom{rsw|{rklthZadmy{t^ZYViqzumyrpp|ndqtsbWddkwqnfdX\qod^gwpovv|upv~pi`[`bkjjqg]YbdSS[aowvgW]Wdt|wķ{|koyw}yshx}to}wnorwyrhitm]cfo|~yc[]Xir|zn~ppozwgpuuhXcfgsqngf\Znrg^`yzrlrttxnozrhaZ_ajojtmaZ`j\S[_mxyq\^Z^px{yĻxpkws{{vuirwo~yooqs~y}ujgrp]^ajx|zgZ]Veq{p}rpowudiprhV_cboomfg]Ykrkbc{~umsutymlyrjaZ]\fkfqk_X^i[RY_oxzr\][`r}}Ļxnkvs{}zxkv{sz}vklmp}x}rgero]ado}}f\^Zjtp~qnpytgmqsdXcceoolfg\^oqk`f}{rksquuinxoh\[^]llmuk_YdjYW[cty{m[_Zftxù{{}kqvs|~wyqk|vt}}rkplw}x{oejvg]`dt{|t\]X^lvvtxrov}zifkplY\c_glmfhbYgpne`tymptq|nhvtmcZ_[clgqnbY\j`TX\nxzu^\Z^nzzĽz~onvsz{{ymx{sxvkokp}xrfetm]`bs}~{b\Z[jtzo}sou{qilqq_]eagmohhf[eooh^m}xllrm|}pftune[_\bpltth]]leWZ]nyzx`\[]kv}s}sryuzz{xnxyp~~zxmrmt{uiixo`act}}y`[X[hrvm}urx}~pijqq`_fbglqjki^fnoh_n~zllrm|rgtvqh^b]bpltui]]lgYZ\nz{zc[Z\it~s}}vryvzsz~s~{~vzmrmo|zlhvudcdtj^\[gp|lwxqv{wnlqwhbighmtolobfnpoaiz{zofoksvfmwsm_a`^oqu{se^jq`^]j||n]][forw}tyzy||wu~wvx~~|ztpslyujp|ofdj}xa^Zaivrnztsz}~rkjsqcehfhmtlpldloskbq}{qxxosntfPC>ME96AX`bkWIFLUYkdT`q}~yͯ}ozmRGFFGB?@M^UQXYUTYTR]]ik\djLnTaaeysųkbZ`h`oeFUpalu|tywqqzqqwʧi?CscA59EUwxfUPBESUae_VYjg^]azupr}}y{ɾsiwo]]\]^XRNVc]\fls~z}yppqzpm|~sXLNFC8@KOiz}}c[YetjUSo|xmehxiRA9LzsV?+8ITWPXUTdflrnb^nxpps|qiebicMKTenpu}qmpqos~ztwmiu{~uyyxzlrjaJ=<0?;08:=U^irnd`nvlgdp}{yfRGDIN^_QS^oxwyxqoka_ls}{unx~{sw|}zz|uq{{xkesxxjee[fpt{zpfm~zyyzxlb_iø¸ocL32=N_|sVRMG6),#):ALOH==MOGBCXbcbOD?FN[mg\`l{|z{zsdelnupg\Vaelqomfnxrtvwx{vqtyz}ttvoeSYdljahegzynlsoe`ctscWO82:JZmynlfZDA90=CJNJ>7AKFA>Nbei_QKOX`svhdjz~zw{zsz{}sh[bgkqqpil{{}{oosvw~z|shQLUY[ORURes~y}z~~tgdmne]]jxnaVS?6>LWbebWS_ed]\n|~~rfZ^aftn`WZhi`WXevty|~tt~|~{vslvxvukfYSTGBDMV^r~}umv~swxp{|omstxnjxzqnwvhdejlt}hdefXMJ@CO[dfaVT_dcZ\oy|znaW]^eqh]TZgg`Y\j{}rwz{|~}pqyy{wrngqssqhcUPQGDHS]g|voxx}~uqottwmhw{tq{vung`[oswztnqqlS_WJ\agtiZTdjxqYvmu}sfY]Rim`\FJa[TO[gy{|phjmv{pjqavuunmgp|kkdMPPA=L\qtr{}ssjkyuf`ck~lpf{rv{[a\h}qsjd]^X`\Xlfnoihoohs`kszs^GQ\[u`QK?^ficcdq}}{vmlz|zo{w`xnmvg[Sjnwt[_KHURXY_e~~uyrimfy|ypcbvoxy}d_raamhtojzyj[S^UouksdUXrsmigwzzwi`^UNecNTF[kcMSnswqloh\ozxqaiputkkhfaenX_LAWRHDcpz}~}pkucxzkQXmu~vyĻ{l^bahfgr}oqspXedV]\ly|vhmzpj^mn}otcLDRU]XTN^f`Yhww~{{}||utq|rohhflufjgVG_``_\UOTNJXns{xmsr|ujhpqyuvk}}}u}ojed`dzu~wybTUbl}zqnkf_sbbk|x`N]b[^URDY]a]XUjw}}jtrj[pl_`lryq_S\rhg[ZKNNOPQM`}zliputqkZ^zrbs|xxzmYpkeT_g~~h__\_m|ndf|kgjsz}peRTG]bZIBNbr`[bwqs}~wx}vgbope[bhtfcTWVdlaRFFJcXVTlmyl`lj}tdp|pobp|~~jwisaeX[fuzovnghhx{rmionslqhsts|\[TcYWODJ^db\_ecv|xtrpdghrje\[m^q^X\jeZWHEKUW[T_]uubgkxx|lintrkepv}mq~ngcgb^Tswyvhjoquq~otsukfoiwsuj`VXTZST;ScbjQ_a|ouessfjpqWaT`gba]V_]^XVE:IK_]YWMQNVlisp{fcklue[mtzx{vmny|iettpXM]\lgcjcf[Wloyv~z}xoysp^XYQXTP[_somskpvw}skZQ^`f]VWVVE>HHTTW[RQNPdnrispiihkbhmpw{npvyxkkhlq[ZY^dUbmhhYZ_n|vz~zpvuz|kaTQRH_]bldrrlqh~{y|vZZV^d^^NNTGRFMRBUXRWL[[dnlsy}vjkdWqqytkww{qqpmohic\j]dZMafhgXa\gt|xs|~rxu{}ygVVIM^cn_aqjonoz}y{tg_W\`aVRPCSVRUCHNJURY\XYbrqx{ujWgi|zdu}|}remijgq`^t]tTF^]`ib`lfcrkj|sw|nuc|~uo`X[V^k\dcT`knq{~x~od[d`qURW5OU_bLBIKIU]V[VLTdqrdq`infztzrx{{xeipnl]Zky^]YS]XO[]`rneonjpw~ustii\Ydhhb`cQ^l{vexox}zw}zqeVOfUTVCa`CDE8IU[`TPSS`yub}pjsnxlttmsvvvy^pza]]dkhjk\VNTcloec`\uhmvypxu|z_eePkcQ[YaWnmpqk{uzaKSWW`_\bOQYRQGBWMQ_ONS]Mlwv|vrbngijqkm}}~r}remon[omVbQMRYZ\kZd\]uuyywuxt_x_ZaP[dhf]lui]gqy_inW[^]_UNYLK7IN@KNTSddUiytuh~swmwl_hw|l~wsnklxhNrjdZQSS]aiiibXUlgvtx}p|v}zaaNXZdhP]gjTdofpvvsnlPVe]eISTY_VPTD9BMNThO_cnmct}wzjvsobfdorx~~bqgjpua`[YQJVVc]iZZb[eyt}zrzvoYVVTZcXic_[zykwk~sx}tzidebYN[OKVU]J@4DAFQ\Zhgggj{~qnmcvxsof~|xoixomkcVa^PAUUV^b^cxbtci|}~|xxt~y}cie^_GS]e]bnmhxtqykt~}t`hNW_RBRQ]U>?AJ@\LQ[_nfiu{uxsuujgupppn|thjj}sc^]iT]KICMbdeedqiszgz~l}sukf_bS[N^P`{jzo|soznvr~tbO^fS_FIHHRTA9APRbSViS~y|lxbjyvyj{p|xw|Vmikvq_VRdbY:KRRvexklpoqrptufn~wjXUT`JWict~pms{~{{vm{yqd]VZb`Y1GITODRCSN`\Sjppfgltsws|wy|lWobxdX]a\KZDM\]y}h~ros~{z|ul|f`caTZfZobvvjk{s}~xnrlxWbYbSOC=SJSeOMTXdYkbql|yu}~ygwsgsvqv}t{pp[hqclr_`_hWZPQnburmityyh|q}xxwzxhc]S[ljV]eqwmp|xpweY@?6)?FXdigwqmstvsytd?FAGF`|{z_QSdk~[XVL^WQORXigb^LGES9CMIrtdd{xwywnhyYhn}_AK_hnkt~zw{TMMLuqw||rU^cȤY@gPGZpz|pp[OCGFFa`^mquyjdl}ɿžzfiqq|yhUOQ[rzwdqkcfOH`kkimgf~xt|nyhHOaZkhccioqzqrw~oTWS[txmZfqvvzX?.)eṐ|lRNAQrszh^WSNgranrutstjcYRMWYlyryypcb[Rgf`lm}{ocq{|kkvf|~p|qmgOE<4,17(%+A>;JK][L68LRbdjoojcdciaiq}||ymkkcXT[[ap|wpsssmettrefjs~{j`b`yuaZj~vvtgkx~zefdicprixw{ǽͱȻ}dMFZH8)3HjõpijsxfX@A/%)8?8BDW\Q?6JOdjv}|knmukiu||zqrsocnffn}|qronxv|{|jT\cw{{r[KYd~zpin\ai}}x}{spX^`gkx~qzszxʺxgodlpTB8SI?4:UtŵzzzxpWYH<=EQNUYjj_NG[^tvswu|okx{~w|otw~rqdO\l|xqQDT\zoj^X\LTWinov~ivu|ookeQ`agr~y~r{x~~yaWcRe^G99VHF7Ba׾x}dfPPOYebenvnZaiqt}wzdpxz|~vewlZKau|pHNPbubePSGCHL_acmwhbkkzfmhiTTb^n{{vu}|zsy{ziKZTShND2JPKF7Rn̹wpd\`[osnu~riqmu{{}lfwq~zcovjcGXmWQVZxcgUKD;D=T_[azzpi]e^usdfghZPbZfv|ys{osv{}{z}xnLVWLePJ7DQKI0Gdѿvmch^s}v{|qwqvz{{kdvn||zckslcARg|b^^c|ekWKB>C9R^W`ztld[_[so|^fghUQ`Uds{yvt}qrpz|vytzxoM]YOeSQ;EONI,B\vĿynjoaxy~vwqvz||levky~y~{edplg@J`pwhheordOE@I;QaYZuuki\^Wlo|y`agfXL^T`pxx|vosrzouwys{vpxvUXaKaVTC=NOT18Tfũ}rjscr{{zq|t~}taslr{twoYggnP@[f~ptez|pv[MBNCEbaWh|mnd_X^pr{|lXdd`KXZWktz{~nv|w~tsoywqxxjwywlObRMYPR:BKWK0J^rĹzlrpe}|wspwzyfgsj}~lzrtcVahlGJblwugyxw\IGSAPgaZozloc]VbpywybZcdZJ[X_rx}|m{z{ztoqwwryvewsugNaLJPMN7?K\L7Teyözlysj|utnuyxdhrm}|fpko`PZgoNQhr|vg{z{{bKIWFRie[lzmrh\W^oyvubV^b[K[Zbv|oy|ytnpwtuxt}dmqqkNZK>FGM:6E]ZBYm}ƹǷínwzkwrpouxietpv~ebdhcMPbt^Vlwygs|{mQIZLPij`fynsl\WZkxuqcTZ`]MZ]cy~qwxslowr{}yyqwbf|nmlRUK9?DL=4C_bNauǻȶp{~nus~pnsyjiwttx_Z^e`MNdwa^r}xgt|~oQN^MWllahwnukZX\l{rn^UXa[O^^m}oz}}~phqtqx|yumuz[g{shjeOSC5;EI:5KhaVj{Ƿ´²qyuyuu|onvwhqv}ytlVV_dXISqs_hvskz~gLY[Odmk_nqov`VX`tzmfYU[cTV_ay}tqzvkkuqrx}ymmyeXptieiZOL74?JD6<^kYbr˸vwtvysmq{nmuv|spZQ[d_NLiwddo|}mvvTXcTbmpcgrnxfVZ[n~nh]VWcYU^]tzun~~|nktqpt|mjrkUhqhdhaPN:1=IG:7Xi\^i{˹ƶ}|uyywop{rnttzup\P]ebQKiudchwr{zY^fXgosegppycV[\p|mg^UXcYW[]su~~pm~|nnurou}lkq~gUhmhehdSN;1@JI;6WeYY`t~ǹʼu{y{qq}uqssyxq`P\fdWIetgbbsxx{c`k^govkdooziU\[k~ngbXUb^XZXmrx}piy|rntsppmhkyoS`ifedhWNA0;IJD3Me\YYlvǹƮw|zvnz{tuq|~qgRRcdbLUrnf`jv~xx_lhdmsweinvw[Z]_vuif`R[c\[Xbqr~~whp{yzorrrluyfhkx_Sbbd`ddPI8/BHL=9\d^Z_uz̿v}ypp}yvtuuyk_LUab_I^unh`rxzvepijnxwejoyrX]\czrgh_R_d_^Yhswxht{yyrtrslw~vfgjv[S_]d^dcNF61DHO?>`ge_e{~˽v|yno{zxsvsz}|wf[IQ]``J]uqndu}z}iqmkny{ijnzv[]]autghbS]ddb]iw{kt~x|turtks{ggfvaQ[Za^_fQE8.?GPH=]nmihétyv}rkwz{xuusyxwzdYIHX\cOUtwvluzmqplnwnjlw{`\^`pwghfV\ehhahy~prw}utptkn}hfcteQYW_^]fRD9.IVIF]hnfjx|zv|~rtttw}~}v~omestu~lUHDKRa[N_msnhvx||wx{lusgbenu}pkrdabjvhcmxxk{v}|~~stnd|}rk`kn]YQXa^jaI93:APUFOcknerxĺ}xv|}suvs{}xyxxnhetqwzeODEKUcWQdoulmx{|}v|yjxpgahnv{mlrccbmwgen|vn{u}z|~~qtje}||qj_kk\XNY`_i_G74;ARUHSenqiv{º~wv{|ttvu|vwvwmfaqouyeMCDJScZTcoxrq{~|}vy|jtqhaflqynjrfdbkzmgo{}o{v|wz}rrlav{|qk^ek^WMR^\gcL94:@PZOSeqypy|ys||uvtz|xxzq}ynf]jnpxkQBCHOb`Wbp{yu~}|xv~lnsiackmvpirieci|siozqzwztvzsol_p~yzrl^bi_XLO\\edO94:@P]SVfs}v|{yr{~|wwt}~uwxozvnd[hlpviPACIPcaZdq~|y||ww~jo~qj`dkmtmjrigcl~rkq}rzu||ru{~pog_s|ywpi\cf]VIQ[]faJ76=BV]U\ix~x}vt}}{ywx}q~qryrk]\jkss`H@FIXf^^ivy}{}t~vgxymg_ijosjophgdv|mnswvxuuqvxnn_fyyysna]fa\NJX[cfX?4;?K]XXbo}y|{|s{}}{zt~tvwowtobYgkquiN@EHQc`]co}zz~}w{~is|qkahklrlmrjibp~plo{txu~ypu}oobbuzytqe]dc_RHV[bg]C4:>GZYV]hxwx}}t|~}{t}uwxpwuqcZgkrvjP@EHPb^\`jyvwyy~ju{rmbjllrlorkibq}nkmytvt~xpv}qpcev{{usf_edaRJW\dh]C4:>FYWVZdtsux~v}|t}~wv|qvvtfZekrvmTADHM_^[^etutwz||nq|tqeinkpnnsmkbk|rjjx~tus{~pstqfbqz{vtl_dddXJS[chbL68>ATWUW]nsrvy{z~wy}|}tstuvn\_iovsaGAHHW`]]_lvsvvz{lyxtmenllpnsqnhcuzmjmxtru}umv|rmaguzzttfaddcQLX^gh]D6>?IYXYYcsrvv~y~w}wtrutwk[dktxs^FFKM_baabrwwxx~~zvmyvukgoklppusqigz{plqwtpu{rkuyrk`gtzytteccfdROZakk_F:BCO]\_^gvvzxy}x}vsstsxm]dkuyubJIOPafffet{z{y~}xxlvvungnkkoqwvumhyuoq{vpsx~tiqzqk`dpxzsuhabehWOZalmfP?FIPabechz{~{{{|}|zwpysrqws`bjszxkRKSR`iikht~z}v|~{kruvqgmlinrxxwqiwzsqzxqsvu|jY[hd\YSZiw|ttg]^bk^Vahv{xhZbceqnoln}||spu~|{{tz|vo|yvpp}{yxnrymipksuqqkv|wrgmr~{w|}xmtvyrjrrt}}uzsqt|pjddok\PXga^\Ydqy{leekrcajr}mbkimurtns}xvkpx|}~xuffwwqpjq~~srs~tlu{~mrsqzwwsp{xvnnw{~yz~|wefkmx||wyqvwiWQ^b[ZTXdoypphZYZfbW`fs{zq`bfblkljepppkhsvxx~~mdqxrrlny~onmyxltysquoxwwvpxyxunwzy}zz|yfcklvz}w|vx}sbWbkcc\\enxpmiZXXceZafr{ztcae`iiijdmoomforzw}~pgs{vwpqy|nmmyzpx{trtnwuwvpxxyunux|}yy~zgfkltw}zw}w{ue\hoiiabhnwnlgZYYfh^eiu|zscac_gfijdlmolfmp|x}}uju~y{srx~}{ommy~tz|vqtmttuwqvxxwntv}zw{}~lejjqu{|u}yyzmahsnngcilupjk^\[emchjr}{vhad^dggkfjmnpfknxv|z}pq}}yrwzz~snntyy}~qtopusxtsxw{rqvz}}xw~~wfhimtx~xx}v}~vidruqpfhjotklg^^`mlgmmx}yrddb`gejjfllqmhnp|w{zzpx~xtxz~z|qppyy}}zstnsttysuwx{qtw~}|wu~|seiiou{y{}w~~vjguutrhjkorjmgaacpnkonz|yqefcahflkhmlrnjorzvzz{qy~yuxy|z|srqy{~~{tunsttyuuvx|tvy{|vsy{|~~ueiiow|}|w|~xnhtwuujkknsknkcccoqlqnx}zujhfbihlnjllrrlqt~~uzy~tu}uxx~~y}usrv}~vwprutywuvv~ww{~z~|vruzy{|vgikox}}w{~xpitwuwmlmnslomeeeornsow~{vljhcjilokmlstnsv~|uzz~uw}wyy~}y}usrw}xxpsutzwvuwxx|{~~~ztpv~xyyzrfklrzw}}xplwwxwnooqsmrlgghrrqtq{~{ummgfkinolmmvspux~wxz||u}zyz{z|{tts{}}|yupvtvzvvt{}w{}|~}}|vrp{|}xyyxkimmw|~{z|wnszw|uqrquqqrjihntqvrv}yrolflklqnnlrvptv}}{vzyx{z|{|{}vusx}~~zxquuuzwvtx~wy{~||~|}wsox|xyxynhlktz~~z~zrt{y}ystrvrqtlkimtrwtu~}{tqoglllqonkpvpru{||vyxz}|~|{{~vutx~~~|yqvuuzwvsx}vxz}}|~||vrpy{yyxxmiljsx}}|{ux}{{vwuwssumlkoutxtv~{usohmllqonkpvpqty~||vyv}}~~}|{~wvtw~~}zrvvuyxwru}vwy}|}}{|wsou{zyxxpiljpv|~{}xx~|yywxvtwpnmnuuywu~|xtsjmnlqqplmvqqsw~|vyvy~~zzvvu|}}~}uswtwywtq{yvxz{}~||ytqpz|{|yxwvkkkktx|~|x|~~~{{yytwvoonrvw|vz~|wvqkpmnrqokrvqsuz}{{vyv|}|ywvw}~~}suwtxxwss|xwy|{~}|z{wsoq{z|{ywwsjmlmuz||y~~~}|zyuyvppotvy}w||xxqlqnpsrpksvruv||zzwyv}|{ywvw|~~~tuwtxxwss|yxz}z}||}yywrooxyy{xwvtlnnnv{~}z~~~}{zuxxqqpsvy~xz~zzumrpossrlrytvx}|y}|w{x|}{{www{}~vtxtwxxtr{{y{}z~~z~|{xwvqnmuww~zxwutmnpow|~{~~~|{vyysrqtwyzz{{vnrqpstsmszvxy~~{x}{w{y}}{zwww{|~vuxtwxxtr|{z|~z}{~z{}vwtpmnvvx}yxvusmqpqy~~|~}{v{yssrvw|z}~||totqrttrnvzwy{|yxxy{y{~xxwy{~|txvuxxwqv}y{||{{|~}y}yuvromrvu{|xwuuonrou{}~xy|vutuwz}{}}zqssqtutorzwy{~}zx|zx{x|}|zxxx{}uwwtwwwrs|yz{~~z|{}~~y|ztvrompvuz}yxuupmrosy~zz~xuuuxz{~|sturtuupqywxz}~}zx|~yw{w{}}zyxy{}uwxuwwwrs{xyz}}{{{}~}y|ytvromqvu{|yxutnnqnrx~{{~xwvvy{||suuruuupqywxy|~}zx|~ywzwz~}|yyy{}wwxuvwwrrzxxz|~{|{}~~y{ytuspnpvty}zxvtomqnpw|}{{wwwyz}vuwstuvrpxxwy{~~~zyz~zvzxw}|zzyz{{vyvuwwupvzwyz~{~{|}~{z{uttqonsuu|{ywurmoqnsy|~yxxyz}}uwvtvvvptzwyz}|~|zx|~}xvzwy}}zzy{|xwyuvwwsqxyxz{{~{||}zzzssspnottv|zywtqmqqpu{|yyxyz~}uxwuvwvquzxz|{}{yx{}~|ww{xz}}zzy{|ywyuvvwtqxyxz|z~}z{||zyysrronnsst{zywurnqsqv{}~zyyyz}wxxuvwwst{z{}z|{xwy~|}yv{zz}zzyz{{vyvuvwuqwzx{|~~~~z}~zz{{yxyrqronmrssz{ywusorusw|}~{zyz{}wxxvwwxtu|{|~y{zxwy}{|xw|z{}~zzyz{zwyvuvwurxzy{}~~}~}z}}zzz{xxwqpqnmnsrt{zywurotutx~}{zz{{~wzxwwxwsx|{}|yzxww{|{~{vy|z}|zyzz|wxxuvvvrtzyz|~~|}~~{{{zzzywxtoqonmqsrx{yxvtpqvtv{~{{{{}zyzwxxxuu|{|~~xzywwy|{~|ww|z{~~zzz{|ywyvvvvsryyy{}~|}}~{z|zzzzwxuoppnnptrv{yxvtpoutuz|{{|}{z{xxxxvu{{|~~xyyxwz}{~{wv{yz~{zz{|yxyvvvvrrxxxz|~~~|}}~{{|z{zzwyuopponqtrw{yxvsootsty~|||}~|{{yxxxvu{{{~~xyyxwz}{~{vuzyy~{{{{|zxyvvuvsrwxwz{~~}|}~|{}{{zzxxvoppooqtrv{zxvtpnsssw|}}|}~~{|zyxywuz|{}yxyxxy|{|~|xtxzx|}{{{{~xyxvuutquxwyz}~}~||}}z}|{{zywxropooostsyzywurnptsuz~}}}~|||yyyyvw|{|~}wxxxxz|z~}zvuzyy}|{{{||xywvuusrvxwy{}|~}||}|z~~{{zzxwwpnpooptssyzywurnrutw{~}}~|}|zyyyvx}|}|wxxwwz|z~}zvuzzz~|{{{||xywvuutrvxwy{}{~|{{|{y}~{zzywwwqnoooosssyzyxvsorvuw{~}}~}}}{zyywx}}}}wvwwwy|z|~{xuz{{~|{z{{~}xyxvuutrvyxz|~{}|z{{{y|~{zyywvwqmnnnosssx{yxvtprwvx|~}}~~}}{zzzxx}}~~|vvwvwy{z|~{wv{|{|{zz{|xyxvuutrwyxz|~}z|{zz{zy}~{zyxvvvomnnopsssyzyxvsptwwz~~}~~}~}{zzzwz~~~zuvvvwz{z~}zvw|{}~{zzz|zyywvuustxxy{}~{{|zzz{yz~|zzywvvsmnnnortsvzzywuqqwwx|~~~~~|{zzxy~~~~|vuvvwy{z|}{wvz{{|{z{{{yzwvuussxxxz|~{z|{zz{zz~~{zyxvwtnnooprutvzzyxurqvww{~~~~}{{zyy}~~~|vvwwxz|{}}{wvz{{~|{{{|{zzxvvussxxxz|}{z|{z{{z{~{{zxwwtooppqtvtw{{zxurqvvwz~~~~}|{{yy}~~}wvwxy{}|~~{wvz{{}}{{{|}z{ywvvtsxxxz{}{z|{z{{z{||{ywxvpopqrtwvw||{yvsquwwy}~~~~}|{zx|~}yvwxy{}}}|yvx{{|~|{{{~{{{xwvusvyxy{|~}y{|zz|zwvtstuvwyzywusqqrtvz}~}||}~~~~|zxvuttuvvwyz|}~}}{}||}~~}||{{||}}}}|{zywutrqqqrrsuwz|~{qksztrstvwwvtsqppprtvy|~~~|{zz{}}|zxxwxyz{}|ww}~~~}{yxwwxy|~~}~~~~}}}~zsnlou}|zwurpmjhfefgilnpstttrqpprtw{~~{yxxy{}}|}}}||}}|xwx|~|zxvtsstuwz|~}||~{wspnpsy~}zwtqnkihhijloqsttsrpooqsvy||ywvvw{~||{|}~~~~}zxwz~}zxvtsstvx{}~}|}~~|yuqoorv{~{xuroljiijlnprtuusrqppqtwz}}zxvuux{~|{{|}~~~{xwx|}zxvtstuwy|~~||}~~|yvrpopty}~|yuromkkkmnqstuvusrppqsux{~~{xvttvy}}|{|}~~~~|ywwz}~|ywuttuwy{~~|||~~}}zwsqooqv{~{xuqomllnoqtuvvutrqpqrux{}~{xvttux{~|||}~~~~~|ywvx{}zxuttuwy|~}|{|}~}~~~~~}zwspnnpsx}}zvsponnoqsuvwwvtrqppruwz}}zwuttuwz~~}||}~~~~~|ywuvy|~{yvuuvwz|~}|{{}}}}~~}}~~}zwtqonnquz}yvsqppqstvwxxwusrqqrtwz|~}{xutstvy}~}|}~~}~~}zwuuwz~~{xvvvwy|~~|{{|~}||~}}}}}~~|zxurpnnpsx}}yvtrqrsuwxyyywusrqrsvy{}~|ywtsstwz~}}}}~}}~~}{xvuvx|}{xwvwy{}}|{{|~~|||~~}||||}~~}{yvsqonoquz}zwtsstuwxzzzyxvtsrsuwy|~~|yvtssux{}}}~~}}}~~{xvuuvy}|zxxxyz|}~|{zz{}|zyy{~}||}~~}{yxwvuuttuuvxz||xurqqrtwy|}~}|zxwvvvwxz{||||{{z{{}~~~|zzz{}{wsrrtx~}xtrqruy}{wutux}~yvuwz|{{}}yvuuvx{~|xtpmllmpuz~}}}}}}}}}|{yxvutttuwz}}yvsqpruy}{{|~~}}~~|{{{{|}~~~~~}}~}yvttuwy|~}|||}~~}zvtsstvy|~~|yurommorw}{wtsrtwz~}yurppsvz{vrpprv|{yxz}}{zz{}}zwusssux|}||}~~}{zyxy{}}{yyz}~~}{xvtssrsstuvwxyyz|}}zwvuvwz|~|ywuuvx{~|yvuuwz}{yz{~|zxxxy{}|zwuuuwz~}yvuuwz~|yvvx{~zwvwy}~|yxwwwxz|}~}{yuromllmpty~~|zxxxz{}}|zxxxyz|}~~}|zyyz|~~~~~~|{ywvvvwxz|~zwvwy}}ywvx{{wuuvz~~}|}~}zxvtssstuvwxyyxwusrrsuz}||~~|yxxyz|~}{zxwwwxyz|~~}}}~|zyxyz|~|xtrqrtx}{yxy{~~{xwxy|}|||}~~|zyxxxz{}~~}{yvsqppqsuvwxwwwx{}|}~{ywwwxz}}zwusrrtvy}~~~~~|zyyz|~{wsqrtx~~|zzz{}~~}|{zyxxxyz}~}}}~|yvttuwz|}}{xuqonoqtvxyyyyz}~|{|}~{yxwwwxyz{{||||}}~~}||}|yxxz|}zvsrruz}{zyxxxy{}~}}}}~}|}~|xustvx{||zwtpnnoqtvyz{|}~}||{{{{{||}~~|ywutuvx|~}}}{|}~{yxxy|}~~}{xvttux|}{zzz{|~}{zxwwwy{~|{|~{wtssuwy{{zxuronmmoqux|~|zyyyyyz{|}~~~~}}}~~}~}{{}~{xwvvvwyz{|}~~~}{yxxyz|~~{xwwx{~|{{|~}zwtrrrstuwxxxxwvutsstvx{~~}|{{{|~|ywvvwz}~}||~}zxwxz}{xurqqqsvy}}zxwx{~~zwuvy|}xutuy~{{}|wtstvx{~{wsolkklnpsuwxxxxy|~}~}|{{{{{{|~~{zy{~{xwx{~|xutuwz|}}zwtrrtx}~}|{{{zzz|~|xtrruz~zxx{~~zyy{}~}zvrnlmpsw{||zwtqpprux|~|zz{}|wtsuy~}|}}zwvwy|~{ywvuuuvwyz|~~~}{{{}}{yyy{~}|{{}{xvuuvwy{~~|yvsponnoqsuvvuuttvy~}{|~yvvx{}yvutuw{~|{zz|~~{yy{}~{wsqrty}{xuvy~{yxxy{~~|zyxwwxz}}{{|}{|{vqooruxz{ywtqpoopqsvx{}~{zz{~|xvwz}||}~|{yxvuuuuvxz}~}{{{}~|xwx|}zyz|~~{xutuw{}{zyyyz{}|yurommnptwz{zxtpmlnsz~~~{xvutuvx{~~|{|~{xxy||yvvwy{{zwuttw{~~~~}|zxwvvwy|~||}}|}~yussvz}~~zvqnlmoruwyyxwuutuwy|}{zz}{xxz~~~~||~|yvuuvwyz{{{{{{{||||{{zzz||zz}|zz{~}yusstw{}{zyz{}~|{ywvusrqqrsuwxxwtrpnorvz}}zxwvvwy{}~}|}|xvvx{~~{vrppsx|~~}{yxwvvwy{}~|{z|}zyz~}xutvx{}}{xurpooprtuvwwwvuuuvwx{}|{{}|ywy|~|yxwvvwxy{|}~~~}|zxwvvvx{~||}~{zz}}zwutux{~~~}||}~~{xusqppqsuxyzywtqnmmpswz|{{z{~}{zzz{{|}}~|z{}}ywxz|~~{xtqqrvy|~~~}~~|{yxwwwxz}}{yy{~~}}{xwwy{~~|yurpooqrtvvwvutssrstuxz}~|z{}}{|~}{zxxwxxyz{|}~~}|{ywvutuvy|}yxxz}}zxwwxz{}~~~~}~|wtqnnorvy|~~|xtoljkmqtwyyyz|}|{{{|~}}~|xwx{}||{yvtqqruy}|zwwwy|}|}~|yvttuwz}}zwwxz}|ywvx{~ytomlmpswz|}|{xuromlklnquz~}}{wvw||{|}ywvwxz}~{xuronmnpsw||xwx{|xussuy}{xuttw{|zyxxxyz{|}}}|{yvroljikmqtwxyyyz|~~||}~{yy{~|yxy|}zxxxyyyxvuvx{~|yvtstux{~~zxwy{~zvtstvy}|ywwy}~}|yvsqppqsuxz|}~}{yvspnlkkmoquy}~~zxy|}{{|}~|{zz{|~~{wtqpoopruy|~~|{z{|~~{yxwvwxy{|~~}|{zzzzz{}~}zwspmlmnpqsttuuwxyzzxwvwy~~}}~~}}|zxvuuvy|~~|xurppsv{~{yxyz|~~}{zzzzyxwvuuwz}}zwtrqqrtvxz{|{zwtqmkjknqvy|}}|{z{}~{yyyz||}~~~|{{{|~|xusrsuxz||{ywuuwz}~~~|zzyxxwvvvvvwxz|~~}{yxxxyz|~|xtqonpswy{zvrnkknrx|~~|ywvx|~~~~~}{{|}~~|zxvuvxy{{zyvutuw{~|{zzzz{||}}}}}~~~|zxvvwxz|~~{xvuvx{}~}{xusrrtvxxvtqnmmosw{~~}||}~~}||{|~}{{}|xtrrsvy|}zwvuvy|~~~|zywvutuvxz|~}|{|~}zxwxz|~~{xtqppruxyzxwtsrqqrsuwz}~~~~|zyz|~~zwusstuxz}~~~~}}|{{{{{|}~}zwutux|}zyy{|xvuux{}~|yvsqppqrtvxyz{{zzyxxwwxxz{~~}|}~~~~}~|zyyz{|}~~}|zywvutuvxz}~{zyz{|~~{yvuvx{}}}~~}zzywxywvwwvwy{}}|~~~|zyyy{}~~}zxwvwz|~{zyy|~|{|}~}{zyywvty}zxvutuwy|~~|xtpmlnqv{~|zz{~~wu~zwuuuuvxz|~|ywvvwy|}zwvuuuwz|yxxz|}{yyzz{|}}~}yvv{}{zz{|~~|zxwwxy{~}}~{yy{~|wspnnryysnkjjknquxz{{zwurqoopqsuwxyzzzzzyxwusrqqtx~~yvuvx|{xwwz{xwwy{|yvuuwz}}ywuuvy~}|}|vpkiilr{~{yyyz{|||zwtpmkiijlosvz|~~}{xvsqppqrsstuw{~zwuuw{~~|wspprx}||}~}|zzz{|}}zwvvx{{vqmjjmrz|wutuvy{|||zwtpnlklmpsvy|}~}{xurpoopqqrtvy}}zxvwxz}}||}~zwuvy~~{z{}}yvuuwz}~|zxvwx|}|{|~ysnkjlqy}|||||{zxvtsqppooprsvx{}~}|zwtqonnoprsux{}||{{||~{uqopt||{{|}zwvwx{~}|{zyyz|~}}}~||}~}yuqmklpv~{z{|~~{xurppppqrstuwxz{|||zxuspnmlmnqty~~|{zyzz|}~}}~~yussw}}{|}|yvvwy|}{{zzzz{|~}|{{|~|ytoljlpx~||}~zwtqppprsuwxyzzzyyxwvvutsrqpppqtw{~}{zz{|~~~{wtsuz~~~|zyyy{}~|{yxxwxy{~~~~|yxxy{}~~{wrmjjms|}|}{wtqpoprtvy{|}}}|zxvtrponnnopruy}~}|{{||~~~|xutux~}{zyy{|~}||{zzzz{|~~{xvwxz|}|yupljkpw~~{xvtsssuvwyz{{{zyyxwvutrqqppqrux|~|zyz{|~~{xustx}|yxwxy{~~}{zyxwwxz}~{xwwxz|||yvqmklou|}zwutstuwy{}~~~}|zxvusrqpppqqstwy}}{zzz|~~~~~{wsrrv{}{{z{|~~}}|{{zzzz{|~~{xwwxyz{{yurommpt{~{yvuuuvwxz{|||||{yxvtsrppopqsux|~|{zz{}~||}}yusrtx}~{yxxy{}}|{zyyyzz{|~~{yxxxz{{zyvrnlkmqw}|zwvvvwy{|}~~}|{zyxwvutrqqppqsvy}~|{{{|}~||}~}zvtstw|}{zz{|~}{zyyyyyz{}~~~~}zxvuvwxyzyxurommptz~zxvvvwy{}~~}|{yxwvutsrqqqrtwz~~}}||}~~|{{}~}zvsrsw{~|{{{|}~}{yxxxxyz|~~}}}~~{ywvvwxyyxvspmlmpu||ywwwxy{}~}|zywvutsrrrrsux{~~|{{{|}~|{z{|}~~|yvttux}}|{{|}~~|zxwwwwy{}~}}}}|yvtttuvwxxwtronoqv|}zxwwxy{}~}{ywutsrrrrsuwz}~}||}~}{zz{|}~~}{xvttvy}{{{|}~~}{zyxxxxy{}~}|||}~~{xvtsstuvwwvtqpopsx~~{zyxyz{}~~|zxvusrqqrsuwz~~||{||~}{yxyz|}~~}zwustw{|{zz{}}{zxwwwwxz|~}|||}~~|yvtssstuvwvusqpprv{}{zzz{|~~|{ywvusssstuwz}~}|{|}~~{yxxyz|~~}{yvtsux}}{{{|}~}{zxxwwxyz}~||{||~~{yvtsrstuvwvusqooquz|{zzz|}}{ywutsrrstvy|~}}|}}~~{yxxyz|}~}|yvtstw|}{{{}~~|zyxwwwxyz}~|{{{|}~{xvtsrsuvwwwuspnnosx}~||||}}{yxvuttttuvx{~~}}}}~~{zxxyz|}~}{yvtstw{~|{{|}~}{yxwvvwxy|~~|{{{|}~~{xusrrstvwxwvsqonoqv{~}|{|}~|zxwuuttuuwxz}~}}|}~~{zyxy{|}~}|yvtssuy~}|||~}|zxwvvvwxz|~}|{{{|}~~|yvtrrrsuvwwvtronnpty}||}~~{yxvutttuvxz|~~}||}~~|zxwxy{|}~}{xvtstw{~}||}~~|{yxwvvvwy{}}|{{{|}~~|zwtrqqrtuwwwvtqonoqv{~}}~~|zxvuutuvwy{}~}|}}~~{yxwxyz|}}|zwussux|~}||}~}|zywwvvvwy{}~|{zzz{|}~~|ywtrqqqstvwwutrpopsw|~}}~~}{ywvuuuvwy{~~}}}}}{xwvwxy{|}|zxvttux|}|||}~~|zxwvvvvxy{}~|{zzzz{|}}{yvsqppqrtvvwvtrqpqtx}~~~}{yxvvuvwxz|~}||}~}zxvvvwyz|||zxvuuvy}~|||}~~|zxwvuuvwy{~}{zyyyz{|}~~|zxurpppqrtvwwvtrqqruy~~~~~~|zywvvvvwy{~}}}}}~|ywvvvwy{||{zxvuvw{}||}~~}{yxvvvvwxz|~~|zyyxyz{|}~~}{yvsqpopqsuvwwutrqrsw{~~~|zywvvvwxz|~~}||}~|zwvuvwxz{||zxvuuvy}~|||}~}{yxvuuuvwy{}~|{zyyyz{|}~~~}|ywtqpooqrtvwwvtrqqsuz~}{yxwwwwxz|~~}}}}~|zwvuvwyz|||zxvutux|}}}}~~|zxwvuuvvxz|~|{zyyyz{|}~~~}{yvtrpopqsuvwwutrqqruy~~|zxwwwwxz|~~}}~|ywvuvwy{|||zxvttuw{~}}}~~|zxwvuuuvxy{~~|{zyyyz{|~~~}{yvtrpppqsuvwwvtrppqtw|}{yxwwwxz{~~}}~}zxvvvwyz|||{yvuttvy}~}}}~}{ywvuuuvwxz|}{zyyyz{|}~~}|zwtrpopqrtvwwvusqpprvz~~|zyxwwxy{|~~~~{ywvuvxy{|||zxvttuw{~}}}~~|zxvuuuuvwy{}~|{yyyyz{|}~~~}{xvsqpopqsuvwwvtrqpqsw|~|zyxxxyz{}~~}~}zxvuuvwy{||{zxvttvx|~}}}~~|zxvuutuvwy{~}{zyxxyz{|}~~}|zxusqoooqstvwwvusrqrtx|~|{yxxxyz|~~~}~~}zxvuuuwyz||{zxvuuvy|~}}}}~|zxwuuuuvwy{}}{zyxxxyz{|}}}|zxusqonoprtvwwwvtsrsux}}{zyxyy{|~~}}}~|ywuttuwyz|||zywvvwy}~}||}~}{yxvuuuuvxy{~~|{yxwwxyz{|}}|{ywtrponoprtvwxwvtsstvz~~}{zyyyz{}~}}}~~{yvuttuwy{||{zxwvvx{~~||}}~}{ywvuuuuvxz|~}{zxwwwxyz||}}|zxvsqonopqsuwxwwutssux|~|{zyyz{|~~~}}~|zwuttuvxz|||{ywvvwy}~}||}~}{yxvuutuvwy{}~|zyxwwxyz{|}}|{yvtqonnoqsuwxxwutsstvz~}{zyyzz|~~~~~|zwuttuwxz|||{ywvuvx|}}}}~~|zxvuttuuwy{}~|zyxxxxy{|}}}|{yvtqpoopqsuwxwvusrrsvy~}{zzyz{|~~~~|zwvuuuwy{|||zxvuuux{~}}}~~|zxvutttuvxz|~~|zyxxxyz{|}}}|{yvtrpoopqsuwxwvusrrsux|~|{zzzz|}~~}zxvuuuwxz|||{ywuuuwz}~}}~}{ywvuttuvwy{}~|{yxxxxyz|}}}}{zwurpoooqsuvxxwvtrrrtwz~}|zzzz{|~~~|ywuuuvwy{|||zxvuuvx{~}}~~~|zxwutttuvxz|~}|zyxxxyz{|}}}|{yvtqpoopqsuwxxwutrrsux|}|{zzz|}~~~{xvutuvxy{|||zxvuuvy|~}}}~~|zxvutttuvxz|~}{zyxxxxy{|}}}|zxvsqooopqsuwxxwvtsssuy|}|{zz{|}~~}{xvuttuwy{|||{ywvvwy|~}|}}~~|zxwutttuvxz|~}{zxwwwxyz{|}||zxvsqonnoqsuwxxxwutstvy}~|{{{{|~~~~}zxvtttuwy{|||{ywvvwy}~}||}~~|zxwutttuvxz|~~}{yxwwwxyz{|||{zxusqonnoqsvwxyxwuttuwz~~|{{{|}~~~~~|zwutttvxz{|||zywvwxz~}|||}~}{yxvuttuvwy{}}|zxwwwwxyz||||{yvtrpnnopruwxyyxvuttvx|~}|{{{|}~~~}{xvtttuwy{|}|{yxwvwy|~}||}~~|zxvutttuvxz|~~|zyxwwwxyz{|||{ywurponoprtvxyyxvuttuwz~}|{{{|}~~~{xvuttuwy{|}|{yxvvvx{~}||}~~|zxwutttuvxy{~~|zyxwwxyz{|}}|{ywurponoprtvxxxwvtsstvz~~|{{{|}~{xvutuvwy{|}|{ywvuvx{~}}}}~~|{ywutttuvwy{}~|zyxxwxyz{|}}}|zwusqoooprtvxxxwvtsstvy|~}|{{|}~~|ywutuvwy{|}|{ywvuuwz}~}}}~}{yxvutttuvxz|~~}{zxxxxyz{|}}}|zxvsqpooprtvwxxxvussstw{~~|{{{|~}zxvutuvxz{|}|zywvuvx{~~}}}~~}{ywuttttuwy{}~|zyxxwxyz{|}}}|zwusqoooprtvxyxxvusstux|}||{|}~|zwvutuvxz|}}|zywvvwy|}}|}~~|zywutttuvwy{}~|zyxwwxyz{|}}|{zwurpoooprtvxyyxwutttvy|~}|||}~|zwuttuvxz{|}|{yxvvwy|}|||}~~}{ywvutttvwy{}~|zyxwwwxyz||}|{ywurponoprtvxyyywvutuvy}~}|||}~~|ywutttvxz{}}|{zxwwwy|}|||}~~|{ywvuttuvwy{}}{zxwwwwxyz||||{ywtrponoprtwxyyyxvuuuwz~~}|||}~~{yvuttuvxz|}}|{yxwwxz}~||{|}~~|zxwutttuvxz|~~|{yxwwwxyz{|||{zxvsqooooqsvxyzyxwvuuvx|}|||}~|zwutttvxz{}}}{zxwwwy|}|||}~~|{ywvuttuvwy{}}{yxwwwxyz{||}|{yvtrpoooqsuwyyyxwvuuuwz~~}||}~}zxvttuvxz{}}}{zxwvwy{~}|||}~~}{ywvutttuwy{}~}{yxwwwxyz{|}}|{yvtrpoopqsuwyyyxvuttuwz}~}||}~}zxvutuvxz|}}|{yxvvvx{~~}||}~}{ywvutttuwxz|~~}{zxxwxxy{|}}}|{ywtrpoopqsuwxyyxvutstvy|~}|||}~{yvuuuvxz{}}}{zxvvvwz}}||}~~|zxvutttuvxy|}}|zyxwxxyz{}}}}|zxusqoooqrtvxyyxwutstuw{~~}||}~|zxvuuuwy{|}}|{ywvvvx{~~}||}~}{yxvutttuvxz|~~}{zxxwxxy{|}}}}{ywtrpoopqsuwxyyxwutttvx|}}||}~~|ywuuuuwy{|}}|{ywvvwy{~|||}~}{ywvutttuwxz|~~}{yxwwwxyz|}}}|{ywtrpoopqsuwyyyywvutuvy|~}|}}~~|ywuttuwxz|}}}{zxwvwy{~|{{|}~}|zxvutttuvxz|~}{yxwwwxyz{|}}|{ywtrpoooqsuwyzzyxwuuuwy|~}}}}~|ywuttuwxz|}}}|zxwwxy|}|{{{|}~}{zxvutttuwxz|~~|{yxwwwxyz{|}}|zyvtrpoopqsuwyzzyxwvuvwz}~}}}~}{xvuttuwy{|}}}{zxwwxz}}{{{|}~~|{ywvuttuvwy{}}|zxwwwwxyz||}|{zwusqoooprtvxzzzywvuuvy{~}}}}~~|ywuttuwxz|}}}|zxwwwy|}|{{||~}{yxvutttuwyz}~~|zyxwwwxyz||}}|zxvsqpooprtvxyzzyxvuuvxz~~}}}~|zwvutuwxz|}}}|zxwvwy{~~||{|}~}|zxvutttuwxz|~~|zyxwwxxz{|}}}|zxvsqpooprtvxyzyxwvutuwz}~}}}~|zwvuuvwy{|}}}{zxwvvx{~~}|||}~~|zxvutttuvxz|~~|zyxwwxyz{|}~}|{yvtrpooprtvxyzyxwuttuvy|~}}}~}{xvuuuwxz|}}}|zxwvvwz|~|||}~~}{ywvtttuvwy{}~}{zxxwxxz{|}~~}|zwusqpopqsuwyyyywvuttuxz~}}}}~|ywvuuvwy{}}}|{yxvvwx{~}|||}~~|zxwutttuvxz|~~|zyxwwxyz{|}~}|{yvtrpooprtvxyzyywvutuvx|~}}}}~~{ywuuuvxy{}}}|{yxwvwy{~~}|{|}~~|zxvutttuvxz|~~|zyxwwxxz{|}}}|{yvtrpooprtvxyzzyxvuuuvy|~}}}~~{ywuuuvwy{|}~}|zxwwwy{~~}{{{|}~~|zywuuttuvxz|~~|{yxwwwxyz|}}}|{yvtrpoopqsvxyzzzxwvuvwy|~}}~~{ywutuvwy{}}~}|zywwxy|~|{{{{|~~|zywuuttuvxz|~~|zyxwwwxyz|}}}|zxvtqpooprtvxzzzzxwvvvxz}~}}~}zxvutuvxz|}~~}{zxwwxz}}|{z{|}~~}{zxvuttuvwy{}}{zxwwwxyz{|}}|{ywusqoopqsuwyz{zyxwvvwy{~}}}~~{ywutuvwy{}}~}|zywwxy{~~|{{{{}~~|zxwutttuvxz|~}|zyxwwxxz{|}}}|zxusqpooqruwyzzzyxvuuvxz}~}}}~~|ywvuuvwy{}}~}|zxwwwx{~}{{{|}~~|zywutttuvxz|~}|zyxwwxyz{}}~}|zxvsqpopqsuwyzzzywvuuuwz}~}}}~|zwvuuvxy{}}~}{zxwvwxz}}|{{|}~~}{ywutttuvxz|}}|zyxwwxyz|}~~}|{xvtrpopqrtwxyzzywvutuvy|~}}}~}zxvuuvwy{|}~}|zxwvvwy|~||{|}~}|zxvutttuwy{}~~|{yxwwxyz{}}~~}{ywurqppprtvxyzzyxvuttuxz~~}}}~~|ywvuuvxz|}~}}{yxwvwxz}}|{{|}~~}{ywvuttuvwy{}}|zyxwwxyz|}~~~|{yvtrpppqrtvxyzzywvutuvx{~}}}~~{ywuuuvxz|}~}}{yxwvwy{~}|{{|}~~}{ywvuttuvxz|}}|zyxwwxyz{}}~}|{xvtrpopqrtvxzzzyxwuuuvy|~}}~~~{ywuuuvxy{}~~}|zywwwy{~}{{z{|}~~}{yxvuttuvwy{}~|zyxwwwxz{|}}}|{yvtrpooprtvxzzzzywvuvwy|~~}~~{xvuuuvxz{}~~}|zyxwxy{~}{zz{{}~~}{ywvuttuvxz|~}|zyxwwwxz{|}}}|zxvsqpopqrtwyz{{zywvvvxz}~~}~}zxvuuuvxz|}~~}|zxxwxz|~|{zz{|}~~|zywuuttuwxz|~~}{yxwwwxyz|}}}}{ywurqpopqsuxyz{zyxwvvwx{~~}~~~{ywuuuvxz{}~~}|zyxwxy{~}{zz{|}~~}{ywvuttuvxz|~}{zxwwwxyz{}}}}|zxusqpopqsuwyz{zyxwvuvxz}~}}~~|ywvuuvxz{}~~}|zywwwx{}}|{{{|}~~}{ywvuttuvxz|~}{zxxwwxy{|}~~}|zxusqpppqsuwyzzzywvuuuwz}~}}~|ywvuuvxz|}~~}|zxwvwxz}~|{{{|}~}{yxvuttuvwy{}}{zyxwxxy{|}~~~|zxvsrpppqsuwyzzzywvutuvy|~}}~}zxvuuvxy{}~~}|zywvvwy|}|{{|}~~|zxwuutuuwxz|~~|zyxxxxyz|}~~~}{ywusqppqstvxyzzyxwvuuvxz}~~~~|zxwvwxy{|}~~}|zyxwxy{}~}|||}}~~}|zxwvuuvwxz{}~~}|zyxxxyz{|}~~}|{ywusrrrstvwyzzzzxwvvvxy|~~~~|zyxwxyz{|}~~}|{yyxyz|~~}|||}}~~}|zyxwvvwxyz|}~~}|{zyyyyz{|}}}}|{ywvtssstuvxyz{{zyxxwxyz|~|{yxxxyz{|}~~}}|{zyz{|~~}||||}~~~}|{zyxwwwxyz|}~~}|{zyyyyz{{|}}}|{yxvuttttvwxyz{{{zyyyyz{}~|{zyyyyz{}}~~~}|{{z{{}~~}||||}~~~~~}|{zyyxxxyz{|}~~}|{zzyyzz{||}}||{yxwvuuuvwxyz{{{{{zzyz{|~~|{zyyzz{|}~~~~}|{{{{|~~}}||}}~~~~~~}|{zyyyyyzz{|}~~~}|{zzzzz{{||}||{zyxwvvvvwxyz{{|{{{zzz{|}~}|{zzz{{|}~~~~}}||{||}~}}}}}~~~~~}}|{zzyyyz{{|}~~~~}|{{zzz{{|||}}||{zyxwwvwwxyz{{||{{{zz{|}~~}|{{{{||}~~~~}}|||||}~~~}}}~~~~~}}|{{zzzzz{||}~~~~~}||{{{{{{||}}}||{zyxxwwwxyyz{{||{{{zz{|}~~}||{{||}}~~~~}}||||}}~~~~~~~~~~}||{{zzz{{||}~~~~~~~}||{{{{{|||}}}}|{{zyxxxxxyzz{{||{{{{{{|}~~~}|||||}}~~~~~}}|||}}~~~~~~~~~}}||{{{{{{||}}~~~~~~}}|||{{{|||}}}}||{zzyyyyyyzz{{||||{{{{||}~~~}}||}}}~~~~~~}}}}}}~~~~~~~~~~~}}||{{{{{||}}~~~~~~~}}||||||||}}}}}||{{zyyyyyzz{{||||||||||}~~~}}}}}}~~~~~~~}}}}}~~~~~~~~~~~~~}}|||{{{|||}}~~~~~~~}}||||||||}}}}}||{{zzzyzzz{{||||||||||}}~~~}}}}}}~~~~~~~~~}}}~~~~~~~~~~~~~~}}}||||||||}}~~~~~~~}}}|||||||}}}}}|||{{zzzzz{{{||}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||||}}}~~~~~~~}}}|||||||}}}}}|||{{{zzz{{{||}}}}}}}}}~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||}}}~~~~~~~~}}}}||||}}}}}}}|||{{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||}}}}~~~~~~~~}}}}}}}}}}}}}}}}|||{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}||||{{||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}|||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|||}}}}}}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~}}}}}}}}~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m43.bin b/applications/SprPoP/assets/packed/MUS/m43.bin deleted file mode 100644 index 0aba339..0000000 --- a/applications/SprPoP/assets/packed/MUS/m43.bin +++ /dev/null @@ -1 +0,0 @@ -{{pɃhea||xz|ɰTq\auXSoƇ_iwY>~{i}2}iyO}9m~oymeo{_^bE~|ssOgqudl=^~yOlMKoaLPjigFWkylzcdfqOmwz~v]gd^ulpgv´pY]fgZ\yzu:Gse~``Gvdak|k\_uʫ|̲XNt_iqrrv}Tgjn[\k[f{3M{c7Hwbb`Qh[n`kyzwV~rX`msojWxÜag\/!OOnyoydt}U`x~~etR:=wDdsqikqpckVD~JMQ~D=uvVft`Vbz>]Yh̍؝edyTq_[ijl~z~{{k^|fƆgqmS]i#,sygZvjbQ`n|ìpF*(B#WF~~tWj|m}gRyzkyi}pTaa}̭so|xTWlxzmU}LQqQPUC}vvs\vZVkgbieG2SXH_zaz|]p}rȦllu|cYLp{uqIJpxl1Y8s~H=Jnh0Qyn_@Qxk?.B\I%L|uéŷkm}zv;fլ̰ars\Ilqzz6Fq9Cg||moUJmw}m>v}AZai{lO78Rb9`G}ȑܯphɩ]X{yp|mY{mߎ}}uj[m}c6FCqjVbbw[MpdNb}nVr{U:!$E;~WnZTѰuם_yǤzŀQFfydxol~rc\UQG>6tHUFAUL%T{pCLnJnQ9O`al}wRci_boskxrMyYm;=kldUKrUw[}~fLLThxdtv[e{D.645WfMBJ[Rj;Wz~cgqneND\kK^JCduueXykģkr}x~{y~|B;d?tHbtpK-%+N{~vwQNyj>Ek[ilf_iOPkiպ~pȬq~uxfpj\hl_XSH87^wxrLPoVZ{mISvpE.Xs_KXgvxqdepqp~o\Hde|]Omuvzsserl}kDQy}bI;9HhoN~ef]ryqaLFXjg[\`WV{orozqxgbr|w|ust~–aejQOZitysV#(k}xr[]~nn|UZz]pS^pqvX\wrfsrxdUws}vqpzrn{j_lwtdukopeb_^behn|x]ql]xcm}rg]QRg{zgZVRb~a{tZo]cdU]{kqqtxfvrd\XUOEKqsnOOyuzz}vlo|qdkvjdnvd_jPfjuuu}~}mtug_kyea}}i}zrrqlmso\ctb\m}xw~w}qMOyli{[Ruqri~rmxxmgkvY{um}lw_vpY[gnomntqdGh~Ynvr~|eOIXs\>Mh_djup}mqpk|ijqovrqygr|ox~tmnv~yoaOHkuTZ|sppmktthpxlnfysz^xkl~uelr\jgak}uom]Ou\QytplXR^q~WQ{olfNaz}w_`vxgyksjqj|sd]dx~mgsqzpks}|iTNXksG>b~n[X}pigkwrTDOxbt~_erwkluyiyzgcov]ysoh|jrympzxlb_cxjQyq~~j[YhkLau`huVcuublxhvzjtj^i}}Xqgmz|ywts{yqo`Vdwdgq~~|}}a^t|kvfylXw~x}~ruu|}wz~r`v]wtucJRo}|~}qbfztwfCnstxph`[\j~|\GZtlm~|nvv~x~soszi{gvrgelzzhbdd_WQMTl~{pnyvw}|pffckv_[}z\eztt|ihs|y|c`xtys}{zvxzY;epwnYcqe`i`LiqZc{pXPU~v}{mq|uvmxo\qwh|wohdeoiVcsU\wtr~xg^Z^o\EZxpkz{`soqxYZ{^P\v~rz{bjzt_e~r\NP`yh_}}}ysusqmhjwzYaypguh~eUrnzqgr|kf{}texiqzd\cry\JRl|b[tngmkj{]jtgh{~z{kyaZ_nv~~vxfg|haiwvim`ZvlZrzow{ywqkge`\bxoJYvj_swdzyx~w~u}netxhqxlby L]Z]AFAqma_Hb|cbud^w`[͘cW_|¶|u`QW`}^zfl=$pJMg@M`^u|qkϤ`VjcbkakMvzzp}z}kN^nW<$`x}rUpOIR{䦊gbʡct{qprICsPUtg|'#flmE=z69/Wp^Vgzfp|hxq]x}duRU~Q8yq6`uR~b*?dENu{e}~Faw_^Ūo}ɱtqra46sadfic%@izx_uZfP5ro~uupW`ư~bYn|Zhm,3p\GQN[h}hsI,Se;#fJkVGr+HϷƣoof~ض٪ʅXfsCJEQv͜ӺnohX;">dH0R[KiFp^Tn\TVFmNI>A^}rsMt|iRi}i;fnmzW\{{zpvyi<5ekKsZ\fsludon{eceh{i|FJqsyxWcfg|iHiqV]JWgK-TʥT6xa^tfFvGPȧxo=>ehcN.ߨ̚nKjzbQɊDZq="ekq}acVymafqnFo};*7'7"t}ġӦuaflerƗn^EeysZZxXLolzxt~q[zq{arKtO+;[qzv~Gd}EBe9!6M?;USg}S˭jF̻еoɰc@Gorrq\yw_azk>bfI;'G]X)+\2O}k]seCMMQdJnV@n҅xVK|չzKʒ}ytoj{^bf/:4nnzunmtdZWdFEiuVLWB8Ia9rXV`W{_xzkz~U҉cg8heyzC 8&^XO.InOhiXmpWczmmqtc('!-?V{}vxdťtxޚ~b~ãPBhjkQ|dWqxYYefcRZ_Re4KrqD0atoe2BoT>uoER\o{mi͹ª~^sft|}̒zϽMAqv[Oi]^Urdv?:Divggg^nxqsua>P|dk`YY)@pF/ivȆ~Ũi|y{mtf|ä~y\p]eMei=)1spwJE;tc[]slLR{|?TZQ5%b_o=kLJ~fǖiiÍ[לͤpnh|mmbkZriXj7<16\__EN`jS@a\JZROjkpeOGKjrw~obkοt\TºƬ|ètLVs|a=x[Z/\|ehNnC^kfaku]iSQqV?Z.&kK_{Zxű~^Wcn_LtmxYF}KLr{`f79twWeqvimȾOievkz\OinwJ[\Eʁ]sb'PtAO^krri}Y}zkTygwOqi`[{EwP_fJNZ}WWPlj\gƆ{yZwpLrx+3lidv|zeuvkas֖gV[XECbnS6fsRyxTiAR0GwfVv_]̔`NyَtbmkvU,wP\|u}bH}b,}aa`@)9lkyQzgfggknsG~~wgԄGk}Ɗ8SkX`}|w9h#epkN;Vjusy~kQptzkxFGySro`i`j2æ\fS^=[qS(M˒z\XXd~YJƸ{cqfYoafa!Dëù\IwTyQTm'(FuyW,gg+SͬɚUε~d̙73Ue|чVBA9B6DGC\XuPBZcMV}xej3PihI3J\חՃziZvܰrsxdMYtb[iv_U|rtbk^9HtPAC|`ihwk}jlxƜ}am}ҢqZJCbB`wborh[VO^NbQwQHIcxC1cz=U{t{raYe٤…sxYEu|qMuthgdy{ipgͨYd_hLq*Ue^bxfMTlisDzqI/ ?0@cx׏yrXl|jSxzre[VZ|w˥vkirQZw_jH;jNV8pyicJb`S_QUipWOWXd^t}~mgmtWvhX[ahr`dr_yu~znbgzLx|bSj~|te_mzznmqaweMDPgo^OPc|ufjxgx~}mznahyz}|vokw~scXX_egp\cbZxftkoxnc[kh~]~hebewtzyut{wq`Yq~nhg\kcWwihqnx}ewka{_]ie{qqyirfdu}mldYV_oqmr}mankhlcw_rgp|~wjjrptegvq{h^^gmdMAUz}ibizy{{vkm|z~whyiv_~nmlheehpcZ[ogk}cXotnt_niz^iwpkr|ixuszryrekfXd\hyxw~yx]]t^snjyyypfvyhyyW|pxxeY_ofUcyyjjyywitiwn]Pa~rgoj[zv{xf[W\dhc_iqcU|piypzpptupbiz~}}euΚr_g^p]zkbv?LF$P|tnof\DLu`GAvoDywtqpp,bmnR}lk0tsnt{eBayqOPoQgyii(`gWy_DbPRxWxouqQrsrLr¡n|n[_=f~fitmW_[fidIp[y^qlڴh1k$xz0[{}4]nKLRNnj~ágTkvt8i]IUkmjfY{qS,[nZzqk{jeUaKAOAotoh>ɢXK~U`mq[{;ygZ{{{wuyUE~°tl\Z]z~~ows~mxfazi9;|xOV94>M~p|{̰rtxouΆs}`_78Peze/Znr~kvdJjQN?\yc8beu׾U}q͜}{{mJrkW28W]Jc`8^}[e}Xf|yxMdbSlebxx̢q}zmtu|NsXrbSZuwC9R]k}uIJxjScWUwCqvs}zgif|ltzodk{e}^vyr]M_i^dp}wncUzkuobiHWq\l{uyvmqzkzhtw}{pbro]Qmogjbj{lxpRGZg{juqnoxpcRwq]Cy}j_YffQX}qoke}7Lztuyths{oeWryRG]ee|i}bH^lYpayrolf[Nbti`{jjp`yȵcrovwJclYS^yrF;egJMYg\PTnef7Xϛnqnpklm_hija~kzr[`^XolywsbfVm_lhwug{{ggsh]vsvY_{kNU}~[Mu]Vxl|}Q4_ussltjmpkjzmpr`_besdjuciy~mdtv~{tegkFixkp|vqppj}o^tde_z~ZBGQGKe~x`cFgr~Z`nq{|]wty{tqxttyQnvm~r|gjvXgba}yg\WVwrgqq_ziuu\]Gjyn{f^YwhIEfpYR{{u|iY4G\|~}Ʃrmx~tz}\pOiaIyxql[[KLU^zrf{}`nhl_o|~w{ehsauk~n{_OmeUlhMgdggRhqZS]ymn~xrlzzv}¬xqum}~n}kRYxt]\dx~h`@]ih|iz~qsqv~qw~qnmaTZ~wsh@BW`ec^gzqwe|trmo}pKgwz~uijortpukD~]{sciy{v{vnoj{zp~pudD`~ojoYerZe\pod®yfozc_mcF?Xx\IZqkvb_sx[;kojind~obwgqZiUppTirXY_emqy}~|cQUezmk|nqosrZm}iTl|}zly^Wrnl`diWdkoaqfpyuejrvr{som~ydT{bjx{kZa}sKDYaNap|{otw{{uuntZwcabseIUK14GTY[cq}syrgjtywu|sUi{uw{t`Qb{cvl|gyhcv}ripfelbtudsua_Z`YkrVGWRi{v~~zzwtm_YdrspolwxumkrmZ?oqn{o|p`\_^]igWiQFdO?WrdctS>M`qrxtwsmpw}{~yM_ahxkamolfwrwfP^~dVFRL?M_msjq|rbXcwt~ɨ|lijw{dn{k]_szhURg}z{hbswdunzxn~}]`igWHJd]JZWIQfsmbY^}Yenw^Gio^^d`YXruc{k}qmqwm^dsmuwfnpekjsjt^V_vcZgmjxmuq^SNRizxtnkhXa`LLNXmyhuyvqrx}dcjhdj}zskMhnUSbmRFZKB^z{|w~xuqqrigq~lmlvp[sqhsttxwsns}pUwyp|u^]em~pW^_XfvwPi|htnebcefbrétpwrWUowp^hhbcrfJC\s}rXVmzpuu~~gynjyhd]U_T.5JIKX\WX[o|}adhlblmocVZ{|~pthsyywrsjjrgixzl~dq|n[V_p~cMOVluikxzlelx|gV`s~mdfXSTWke_qno{eONU]k}{xoBMeTDI^o]N`WMev^wznu|~^Jjrdiqtob[g_i~lq{bON^jy}^QTPVbst\fVx|n]KARn|l˿~{{fhy~\gmY[dgkwp]X_lq{}wvtrzbecp}itw}t^nzdpmaTBAQC7YqnnnjdX\||fwpzrau~iYVSQaouys|lb[apqrz}luxg[V\ililkx}uuz}snu^Waqn`_mwkULC=>BSy\n~~s~{p|f`irvo]ZtxUfvgYXbl\>CJR^ow[KX~Ƶ{slfegjhb_bjledoxoq~thfqrggnrttuwxxy{}~miovywqljnxuow|mcafq~{trpjccm|uaPOciUVf~|pbYX_gmpomllkjhhjntuoihkmnorriZOMT_jqssu}|yxzqaWYcmssqprw{~yqmp~zxukilquurptz~xtpoqyz|yusu|wrw{tmihjmonmptrfXT]ly}wy}sic]WRSXYSJEEJR\hznNE\{uqnmlhb^_homffpz{xkcgttkkoqppsy}qghloomkms|{oiq}vkfgjpyzuqmiipyzodZ[ko]Yew{od\Y[bkqspnjgddhowytkfhlmnpqndVLKQ\djnt~}pdbfknonnptxzyx}~vnlryik{xja`djoruy~}|}|tsuwxz}~zursz}x|ytrstusrtwuk^X[eovzz{~zy|}vnhc_]^_[SLIKQZdo}tXQhz~ztqomljjmtxtnpz|skgjs{{smmqtuuvxzz{}~usuwwuttw|~yqoxzqnnnosy~|xsnjks}|skebhwydX\j}ypic__emstqmjhfginrqkddhkjhghgbZUU[ckqu{ykbbfloqqrsvxwvx|xqkhly|igvwkcachmrv{~~}yrnoruvwxz|}~~}}{xx}{xvwxwspopoib_`fmruvvw{|uqqstqlfa][\][VTUY`ithUZvzx}|ywuqmkmtyxsqwwpjilqsqnpsvvuuw{~|urrrrrtx|~yplr{}unkmpqruz}~{vqnpwymebfrzd[_m}zrlf_[^fnqplieddhotsmggkmlihiif`ZX\biov~xjefjmnnnoqtutsv}~ysmhkukaj}shb`bglqx~|zxupmlnopsvz}~z{~|||zwrponlgcabeikmoqv~~xsppqrokfb`ab`[XY^enxm]^sytty}zwsru}|y}~ytnlknqrporw{{zz{}zwvuvwz||wokpz}xqnorsrrsx|}{wstx|pgdivk\Zet}vojd_]`fmonkgedgkprmfcglmkgffgfdbadjpv}{ztidegiklnprsssrv}~yupkgfirmck}}pgbadiou|}xtplijlnpruxz|~~~~||zxtolkhfeddegiklorx}}wronnonkgdccb_]]`gnxwf`jzsps{}yuuy{{|wrnlmopnjjpw{|zy{|~yvuuwz||wpos{}xrnortuuvy||zzxlcagvp`\cq|vpjd__afjkifcbdhmpnhdfknnkhgghhgfgjnt{{~}rjhikllmnoppppqu|~yuqmihjq|}hcm}qhcabfkqy{vqmighjkmorux{}~{wsoljhggffffghkou|{xz{wsolkkkkifeeeecbcgnvqdcrzroqv~zxy~zvrnkkmppmijpw|}|{|~|{{}}wpnt{|wqopsuuuuwy{|zyzvjccl}k^^hvysniebbdhjkigeehlppkecglnlifefghiiknsy}|vmihijklmnppppqtyzuplhfhnykdl}|pgbabflsz{upkgefhjmoruxz|~{wsokhgfgffeefgjouz{xtsw}|wspliggggfeefffegkqyvhcluompv~~~}{xuqnllnqrniglt{~}|{}~~~ysrv|~yspqtvwxyz{}}qhcdnma`iu|vpkgdcdeghgfdehlonieejnpnkihijlmopsw}}}}tmjijkllmmnnnnpty~wrmjgfhnyqfivxngcceinu{~~~|yupkgeegilnqtwy|~}ytpligfgggfeefhmsy{ytsv|}yuromkiiiiiiijiijlqywibi{unlns{~|zwtpmkkmprpkhkrz~~yspsy|ytpprtvwxxyz|}~wlfdlzvf`ep}}wrlheddefgggffhloplgdgloomjihijmorvy}|~yqliiijjkklmmmnquy~zsnjfefjq|ogkx{qjedehmsx}|{|||{zwtpkgedfiknqtwy|~~zvrnjgffgggfeefjotxwropv{|{wtqnljhgfgghikklmot{}oder|rmkmsz~{ywtqnljknqrokhkrz~~~{usw|~|wsrsvxyz{|}~~sjeem{zjcemy|vqlifeeeeeeefhkopmhdfkpqpnlkklnqtwy}~~|uokjjjkkllmmmmorv{~xrmigfhmuzkgo|xoieefjoty}~{{{{zyxurokgeefhknpsvx{}{wrnkhggghgfeegjouwuqoqvz|zvspnljihghhjklmnorw}zldgu{qljmsz|zwurpmkjloqrnjhlsz~|wvz}xuuwy{|~~xohfisviehp{}wrnkihgggffghknqplgfinrrpnmmnortwz~~~xqlkjjkkkkkllmnptx}|vpkhffiowykgmz|slhffimrvz}~|yyyyxwusqmjgeefiknqtwy{~{vrnkigggggfefhlpturmlotxxvspnljihgggijlnpruyrgenwojjmsz|zwurpmkjlnqrplikrx}|xwz}yvuvxz|}~wnhfjuvjfjr||vqmkihhggffgiloqokggkpssqonnoqsvy}|uoljjkkkkklllmoruz~~xrmiffgmw~ogkuzrlihikoswy{|}~}{wvuuutrqomjgfeghknqtvy{}~}yuqmkihhhggfghkostqmkmrvwvspmkjihgghjlnqsvy}rhel|{rljkou{|ywtromkklnqrqmjkqw|~zy{|xwxy{}wpjhjt|ohhnw|vrnlkjihgggilorrnjgjnsttrqpqrtvy}zsnkjjjjjjkkklmorvy}ztojgffipx|ngkvzsmjijlptwz|}~}{xvvuutsqomkigggiknpsvxz|~~zvrnljhhhgggghknrtrnklptwvtqomkjiihijkmprux|xmfhswojjlqw}~{xvsqolkkloqrpljlrx}~z{~|zz|~}unihluqjimt~zvromlkjiiijmpssplijnsuvutsstvxz~}wqmkkkkkkkkkklmpsvz~{upkhgginu~vkhny{toljkmpsuxy{|}~}{~~yvtsssrqomljhgghjloqtvy{}~~zwspmkjihhhghilorrpljkosutromkjiihiikmpruy|ukgkwwokjlptz}zwuspnlklmprrokjmsy}||~{zz|}{sliioyzojjpx~yuqomlkjjjjlortrokjlquvvutttvwy|ztolkkkkkkkkklmoruy||vqmiggint}xlhmx|uplklmpsvxz{|}}|~~yvtsssrqomkjhhhijmortwy{}~~zwspnljjihhhikmprqnjikortspnlkjiiijkmpsvz}yohhq~unkjlpty~}zwurpnmllnprrpmkmrx|~~~~|}~wqlikq{zokkpw{wtqpnmlllmnqtusolloswxxwvvwxz|}xrnlkkkkkkkkklmpsvy|{vqmihhjnt||oiksztpnmmoqtvwyz{|~~{y{}xurrqqponlkjhhhikmoqtvyz|}~{xtqnmkjjiiijknqsrokjkorttrpnlkjjjklnpsvz}{qiho|wpkjlosx}~zxusqomllnprrqnkmqw{~~}|}ysmjkpyslknu}}yurqonmllmnpsutqnlmquxxxwwwxy{~|vqmlkkkkkkkkklmpsuy|~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m50.bin b/applications/SprPoP/assets/packed/MUS/m50.bin deleted file mode 100644 index 00a7ce1..0000000 --- a/applications/SprPoP/assets/packed/MUS/m50.bin +++ /dev/null @@ -1 +0,0 @@ -}~}}~||||~}~}}|~~}~~~~~}~}~~~~}~}}~~~~~~}~}~~}~~~~}~}~~~}~}~~~~~~}~~|~}~~~}~~|~~}}}|~~~~~}~{~}{z{~|~~~{}||~~|||{~}~~~~z{|yxx|z{}|~{~~{|}~{}{{}}~zx{wvvxxw~~|~z~}z|~{{|~|~~{{|}~{wywtuvwuz}|{{~y{|}{z~{z|~}~}|{}~~~~{wwxsttvtv|z{x|yy||{y|}y||}}~{~~~~{xvxtssttszyzxzzx{{{yy}y{{~}~~|~~~~{yuwurtsurxyyxxzwy{zzx|zz{|}}~}~~~|zuvvrtrurvyyxwzxx{zzx{zy{{~|~~~~|zvuwrtrtsuyyywyxw{z{xz{y{{~|~~~}zwuwstrtstyyywyyw{z{xz|y{{~|~~}{wtxststssyyywyywzz{xy|y{{~|~~~~}zwtxttsttsyyywxywz{{yy}y{z}|~~~~}zwtxttsutsyyywyywz{{yy}y{{~|~~~~~~}zwtxttsutsyyyvyywz{{xz}y{{~{~~~~~~}zvtxtttustzzyvyxwz|{xz}y{{~{~~~~~}zuuxsstvsu{yxvzww{|zw{}y{|~z~~~}~}ysvxssuvrv{zwv{vx|}zx}|y{}}z~}}|xswwssuvsx|yvw{vy|}yx~{y{}}{~~}}|wsxwssvusx|zvwzvy|~yy~{y{~|{~~}}|wsxvssvusy|yuwzvy|~yy~{yz~||~~~}}|vrxvtsvvty|zuxzvz}~yy~{yz~{{~~~|}{vrxvttvvsy|zuwzvy}~zy~{yz}|{~~~|}{wrxwttvvty|zvwzvy}~{y~|yz}|{~|}|xrwxttvwsx|{vvzvy}~{x~|yz}|z~|}|yrvxutvwtw|{wuzww|~|x}}yz|}z~}~|}{ystyutvxuv||xuyxv|~~y|~zy{}z|~}}}|ztsxvtvwvt{|yuxyv{~z{{y{}{{~~}~|}{vrwxtuwwty}{vvzvy}{z~}y{||y~~}}|xsuyuuwwuv}|xuzww|}z}yz|}y}~}~}|zusxwuwwvt{|zuxxvz~~{z{z{}{z}||zvrwxuwwxuz}{vwyvy~}z}z{|{y~~||zwruyuwwxuy}|xvywx}~z~~z{{|y}~}}}{xstyvwwxvw}}yvyww|{}z{{|y|~}}}{xtsyvvwxvw|}zvxxw|{|zz{}z{~}}}{xtsywvwxwv}}zvxxw|||{z{|yz|~|{xtrxwvxyww}~{vxxv|}|{zz|zz~|}|{xtrxwvxyxw}~{vxxw|||{z{|yz|}|{xtsywvxyww}~zuxxw||}zz{|yz|}|{xssywwxywx~~zuyww||}zz{|y{~~|||zwrtyvwyzwz~yuywx~|yz{|x{}~{|{zvruyvwyzw{}wuyvy|~yz{{x}}}|{{zvrwyvxzzw|}vvyvz~|}xz|{x}}|~~|{yuqwyvxzyw}|vwyv{~|}xz|{x}}|~~{{yurxyvxzyx~|uwyv{~}|xz|zx~~~{~}{zytrxxwx{zy|uwyv|~}|yy|zx}~}{~}{zyuqxywy{zy}vwyv{}|xy|zx}~}{~~{{yuqwywy{zy~~vwyv{}}xy|{x|~}|}~{{yvqwywxz{x~~wvyvz}~yy|{x|~}||{{zwquzwxz{x|xuyvy}yx{|xz~~||z{{zxrtzxx{|z|zuywx~zxz|xy~~}~}z~|{zxsryxwz|zz|uxxw}|xz|zx}~}}~z}~~{{yurwzwz{{ywvzv{~xy{{w|~~||{|{zwrtzxy{|z|zuywx~yyz|xy}~}}z~}{zxtrxyx{||{~vxyw}|xy{zx|}}}}y|~~{{yurwyw{||zxwyw|~~xy{{w{}}|~zz~{{yvruzxz|}zzvywzyyz|xz}~|~{z~|{zwstyxz{}{}|vyxyzxy|xy}~}~|y~|{zxtsyxy{}{|}vyxx{xy|yy|}}~}y}|{zxtsyxy|}|}~wyyx{xy|yx|}}~|y}}}{zxurxyy|}|}wxyx~|xy{zx|}}}|y}|}{zxusxyy|}|}~wyyx{xy|yx|}|~|x~}|{zxtsyyy|}|}~wyyy{xy|yy|}|~~|x~}|{zxtsyyy|}|}}vyyyzxy|yy|}|~~{x~}}{{zxttzxz}~||vzxzyxy|xz}}|~~zx|~{{zwsuzx{}~|zwzx|xxz|x{}}|}yy~|~{{zwrwzx{~~|xwzx}~wx{{x{}}|}y{~|}{{zvrwzy{~~}xxzx~}wx{{x|}}|~}y{~{}{zzvrxzy|~}}xxzy}wx|{x|~||~|x{~{}{{zvsxyy|~~wxzy|wx|{x|~|}~~|x{~{}{{zvsxyy|~~xxzy}ww{{x|}||~|x{~{~{{zwswzy|~~~xxzy~}ww{{x|~}||xz~{~{{zwswzy{~~}yw{y}~ww{|x{~}|}yy~{~{{{ysvzy{~~{wzy|xvz}yz}}|~}yx~~||{{{ztuyyz~~}wzz{zvy}zy}}|~}~zw}~}{|{{zvtyyy}~wyzy|wx|{y}}|}~{w{}~z~{{{wswzy|~zx{y}wwz|x{}}|~}yx~~{}|{{ytuzy{~~}wzz{ywy}zy}}|}~zw|}|z}|{zwtxyz}xy{z}ww||y|}||~{wz}~z~~|{{xtwzy}~zx{z~ww{|y{}}|~|xx~~{}|{{yuvzy|~|x{z|ywy}y{}}|}}yw~~}{{||{zvuyy{~~xzz{zwx}zz}}|}}zw}}|{||{zvtyy{~~xz{{{wx}{z}}|~}}zv|||z}|{{wtyyz~xy{{{wx}{z}}|}}~zv{||z}|{{xtxyz~yy{{|ww||z}}|}}~zv{|}z}||{xtyzz~yz{{{wx}|z}}|~}~zv{||z}||{wuyyz~xz{{{wx}{z}}|~}}zv|||z|||{wuyy{~xz{{zvx}{z~}|~|}yv}|{z|||{vuzy{~x{{|yvy~z{~}|~}|xw~}}z||||zuvzy||x{z~wvz~z|~}|~}|wx|}~y}~|||zuwzy}zx|z~ww|}z}~}|}~~{wy|~}y~~|||yuxzz}zy|z}vw|}z}~}|}~{wz|~}y~}|||yuxzz}zy|{}vw|}z}~|}|~zvz{~|y}|||yuxzz~yy|{|vw}}z}~|}|}zvz{~}y~}|||yuxzz}zy|{}vw|}z}~}|}~~zvy|~}y~~|||zuxzz}zy|{~vv|}z}~}|}~~{wy|}}y}~|||zuwzz}{x|{wv{~z|~}|}}~{wx||~y|||}|vwzy|}x{{~xuz~{|}|~||xw}~}{zz||}|wvzz{x{|}zux~|{~~|~|}yv|~{~{y|||}yvyzzyz|||vw}}z~~|}|~zvz{}|y}~||}{vxzz}|x|{wv{~{|~}|}}{ww~}|~y{||}|wvzz|x{|}yux~|{~~|~|}yv|~{~{y}|}}zvyzz~zy||}vw|~{~~}}|~~zvy{}|x}~|}}{vxzz}|y||wv{~{}~}|}}~{wx~||~y{|}}|wwzz|~x{|~xvy~{|~}|~||xv}~~{zz~||}}xvyz{y{|}zvx~|{~~|~|}xv|~{~{y}}}}yvyz{yz|}{vw~}{~~|~{}yv{~{~{y}|}}zvyz{yz||{vw}}{~~|}{}yvz{}{y~}|}}zvyzz~zz|||vw}~{~~|}|}yvz{}{y~}|}}zvyzz~zz|||vw}}{~~|}{}yvz~{~{y}|}}yvyz{yz||{vw~}{~~|~{|yv{~{~{y~}}}}yvyy{yz|}{vx~}|~|~~{|xv|~~{~zy~|}}}xvyy{x{|~yuy||~|}{~{wv}~}{~yz~|}~|wwzy|~x||wv{|}}|||~{ww~{|}y|~~|}~|vxzz}|y||~vv|{~}||}}zvx{|}x}~|}~{vxzz}{y||~vv}|~}|{}}zvy~{||x}~|}~{vxzz~{y||}vw}|~}}{~}yvy~z}|x}}|}~{vyzz~zy||}vw}~|}}{~|yvy~z}|x}~|}~{vxzz~{y||}vw}|~}|{}}zvy~{|}x}~|}~{vxzz}{y||~vv||~}|{}}zvx{|}x|~~|}~|wxzy}|y||wv||~~|{|}zvw~{{~y{~|}~}wwzy|~x{|xuz}}~||{~{wv|~}{~zz~|}~~ywyy{y{|~zuy~}|~}z~{xv{~z}{y~~}}~~zvyyz~zz|}|vw~|}}~{~|yvy~{||x|~~|}~|wxzy}}y||wv{|~~||{}zww}~|{~~yz}|}~~ywyy{y{|~zvy~}|~}z{xvz~z}{y~~}}~~{wyyz~{y|}~vw}}}|~{}|yvx~~{|}x|~~|~~|wxyy}}y|}wv|}~~|{{}zvw}|{~yz~|}~}xwzy|y{|yvz}~||{~{wv|~}z~zy~}}~~ywyy{yz|~{vy~}|~}z~{xvz~z}{y~~}}~~zwyyzzz|~|vx}}~}z{xvz~z}{y~~}}~{wyyz~zz|~|vx~}}}}z~{xuy~z||x}~~}~{wyyz~{y|}}vw~}}}}z~{yvy~z||x}~}}~{wyyz~{z|~}vx}}}}z~{xuy~z}{y}~}}~zwyyz~zz|~|vx}}~}z~{xuz~z}{y~~}}~zwyyzzz|~{vy}|~|z~{xv{~~z}zy~}}~ywyy{y{}yvz~~||z}zwv|~|z~~yz}|}}xxyy{y{}xv|}~|{{|zvw}~{{}y{~|~|wxyy|}y|}ww}}~|~z||yvx~~{{}y|~~|~|wxyy}|y|}~ww}}}|~z}|yvx~~{|}y|~|~{wxyy}{y|}~vw~}}}~z}|yvx~~z||y}~|~{wyyy}{y|}}vw~}}}~z~{yvy~~z||y}~|~{wxyy}{y|}~ww~}}}~z}|yvx~~{|}y|~|~|wxyy||y|}ww}}~|~{||yvw~~{{}y||}~|wxyy|}y|}wv|}~~|{||zww}|{~y{~|}~}wwyy{~y{|yv{}~||{}zwv{~}{~zz~}}~~xwyyzyz|~{vy~}|~}z~{xvz~z}{y~}|~~zvyyy~zz|}}vx~}}}~{~|yvx~~{|}y||}~|wxyy|}y|}xv|}~~||{}zwv|}{~~zz||~}xwyyzy{|~{vy~}|}{~{xvz~{}{y~~|}~zvxyy}{y|}~ww}}}}{}|zvx~{|}y||}~{wxyy|}y|}xv|}~~||||zww||{~~z{|}~|wwyy{y{|yvz}}|}{}{xv{~~{~zz}|~}xvyyz~yz|~{vy~}|~{~{xvz~{}{y~}|}}yvyyz}zz|}|vx~~|}~~{~{yvy~{}|y~~|}}yvxyy}zz|}}vx~~|}~~{~~{yvy~{}|y}~|}}zvxyy}{y|}}wx~|}}~{~~{yvx~{}|y}~|}}zvxyy}zz|}}wx~~|}~~{~{yvy~{}|y~~|}}yvxyy}zz|}|vx~~|}~~{~{yvy{}|y~}|}}yvxyy}zz|}|vy~~||~~{~{xvz{~{z}|}}xvyyz~y{|~zvz}}~|}|}{xv{~{~z{||}|wwyxz~y{|yv{|~~||||zww}||~y|||~{vwyy{|y|}ww}|~}}|}|zvw}||}y|||}zvwyy{{y|}~ww}|~}}|~|zvx~||}y}||}zvxyy|{y|}~ww}~|~}}|~~|zvx~|}}y}~||}yvxyy|zy|}}wx~~|~}}|~~|zvx~|}}y}~||}zvxyy|{y|}~ww}~|~}}|~~|zvx~||}y}||}zvwyy{{y|}ww}|~}}|}|zww}||~z|||}zvwyx{|y||xw||}~}}y}y}xt~|{{~x~~{~|{xvww|}wz{{u}{~{}z}yt}~~~}}}~y|~{{zytyz||x{|}}u{~||{}~zxv|~}|~~|~y}}ztxzx}xy{z|x{}~}z~}~}yzx||~}|~z}z}~yxy|y~~}y{z|xz{|{z}}|wwty~}}~~~|zyvvx}{{y}~yuu}}||}~|}~{{xvy~}zx}{~{yvurwy|~z~~}xw~}{y~zx{z|yz{||{wzywuy{|{vxy|z{~~}{z||y|{}|~|}}~||z||xyz}|zyx{}|}{}z|zy|~ytvv{~|}}}~y{xwx|}|~|z{xwvz}|}{}{zwwy}~{z|~}|yuuttz}~~{||xx|}~}y~}{x|z{{x{}z{xwxvvw}~zww{~y|~~||~||x~}}|}}|}{}|zz|wyz~wwy|z~~}z{zx~}wtxy{}~|~}}x{zyz~}~y{{~{vyy{}|{{wwwyz~~{{~}{wtvtw}~}}{}zyyz~}~~}||z{z{|z}yy~{yzuvwwu{}xv|~~{z}}~}~}y}~}{{~}y}{||zw{ywz~vuz~z}}zz|x}vuz{y|}~~|{|}wy}{{}~}uz~yuz|y}}zz~~vty|z~~}|{~|vswxx|{~}zwz|z|}|{|}}uy}|~{y|{yyw{utwxv{}|xx~z{}|~{}~~~{}||{z~}z|yz|zux{x{|zxt{||zx||~}xvz~{y~}~z~zz}yx~|||uvzvy~yz||z~||ysy}}{~|~}|z}ytt{z||y|~vx}}y~|~z~~xt}~~{y}||}wwztuyzy{{|{|}v|~~{{zz}~~z{~}{~xy{xsy{z}wxww|}}~yw~~~|}zxz}y~~~~x}}yy|zx}|}}zvw{xy~zx|}}{xyuy~~|~|~}}x|zut{}{|x{}}ww~~yz}{~~}yt{~~|x}|~xuyvsy|{|{x~~~~vy~}{{~~zy}||}}y}~}|}~{wzzut{|}yuyx|{|}|xz|z{}{y}~|z~zx}|xx|z{~~zzyv{}{zz~xy}ywyv{~~~|}}~{x|yvv}}|}~zx}z{wy~}yz}}|{xv}}|y~~}}xuxutz}|}yy{w{~}}||~~yz~}{|}y}~~{|yvzyuu}~~~vuz{|z}}{y~|~x}~|z~|z}yx}zxx}{{wyyz|}}z{|w{{uxzy~~~~|{}xy|yx{|{z{y}yyzy}zx|w{|v{~}z}|zwtxuw~{~yy~|}yx{}~~{{z|}{||}~|{yyyxxtz~}vx|~~y|}~}}x~zz}~{|~~|z{|{yv||}~xy||yzz~}yzv}zw~}}||zwxzx||~y~|~}uy~{z|x|{v{}~~~|zuruwz|}}zyx}|~}~}~||~yy{~~}}{yxttuy}xy}~}{~|~z}~~xx~}}z~~}}yxwvwx~|yw{{}~~}}{||w|xsx|z}}~|yvuw{}z||w{{}|y}|~}wx{swzy~~|{wtsu{y{}|zx}~z{}}|x}vu{{}~}zvttuxyx~|vv}~|wzwyzz}~}}yttux{y|~}vry~}xuz{{yyvz|~~~~ywxwyxx~~|ss{}{}vxzyxxvv}|z}}wwxwxtw~~{uw{~~z}yw|{}~zxuz|~{|~zuvvwvty}}wuyx}}{z{|x~{w}}y~~z{~wvxvwvv|~vuvv~}|z|yw}zy|yx}|~}vyyyzww{}}wxuv~~~yy{xy}{yyzvz}{~z|yxzvvz{|{{vy~~~}{xz{x|~|{zxv}{z}}}|}xxxtvzz~~|uy|z}{y|~z}{y~~~zw~y{~|~||vyxsw{{|uxxw}x|}{}zw~yw~}~x}}~{w{xv{{y~}|vyuv|w|{z|wx}wv}}}{}|}{}vv}zy~|~}}|z{uyyv{z{|w{~~wx}|||{~|{}|ux{vy|z|}}ys|wx{z}x}{~y}~{{}}z~{{~xt{zv{{||~ws{~z|zzzy~~|~{~||~{{|}~~vx}yy}y}|}~~tv|{~{}y}~w{~{}~~y||~|{}x||w{{x}y~~{v{||}}zw}zx~}|~}|y~}}|||zz~zx{vy~yz~{y|y}~~xz}y}|~}}{}|~{~yy}|w{yu||y~~{}zw~~~z~{z~{~~{~|~~~}|z|{{~yy}xz}xz}|}|vy~~{||y~z|~}}}|z~{}~{}~y}yw|yw}}|~}zx}}|}xz}{~|}}y|{zz||wzyty}{~y{{|}~yw~}}~{|||{||{|wyztv||~|{zx}x}~~}|}~{~|z}z~~{}xx|wu{{}~~{{v|yz~~~z~}~|}|x|z}}y|yswz{}}}}xx}y}}}{{~{~~||xy}}~~y{{ttxx|~{~w|}{z{}|~~|}{|zwzz{~||~{x~yqzxwz{~w|}xz~zz}}|w~~~zzy|}|}~y{rpxvy|}xxw~}~}{~zxz}}z{z~~~x}zv~wszxtz}zqs|}~||{|y~}yy}x}|~||ru|wx{}{}{~vu{}{{}vwzz~zuu|}|~~}~{uy{t||xx~}sw|}~{x}~|}zxxyx||z{}y~vz{uqwxv~~vxyy}{~{{{zz}wy~|||y}{|svysyzuv||wut|~~}x{}~~||}x~~~~x{{{wr{zvy~yxvt{~~{}{wv{{}~yvw}}}|{|}yvzxs{z|vs{xx~yy}{y|||wy}||||}}v{{tqy}y~~yvy{{~y~xz{{|}wz~|zz|zsvxrx}zy|y|xwv|{|{}}y|~{{|z~}}{}yzzvr{}z|~{vvvv}~y}zwv{~|~xy||~}y|{wu|zy~{|}}~xuu~|vy}xz|{~{{zw~~~|{}xv}{uu}z}|~ywv~wz{x||}{~xx|y~{tszww}{x~wzz{|}w~|{|{|~z|||~}|||}xwzyuz~z||zttxz}z{|{xyz~|z|~{{v{|zw|yyz{|zzwv{~{wy|w|~x||y}}|y|xz}yuxz}z||xy}{|}w}yx||x{{{}}yuwzuz~zx~~xw~~~xx}{}{|}{||}{z|yx{zuv}z}}zuv{z~z~~xzy~~z~{|z|{v{}yv{|w|z}w{{wz{}xxzzxy~y~}}{z~xw~zuv||xz~zyyz}x||w||~yy~}}~{~ysv{uy~|x~{~zv~}xw|{~~~~~}{~|z{}~y||uz{us}|}~}|ut}~}y}z}|z~|x|z}~|~~vv}zvx~y~~z|xw{{zx~|x{}yyw}|{}}xz|ty|yv{{}vz|{|{v|~z~yx~z~|x|}|y}}wrvyv|{z}z|yxz~~z{~{|~~}{||{z}|wzztxyuv|~}ztu~||~|y}}{~~~x~|}||~|vt{ywyz||z}wu{}{z}wy}yyu{||}}xx{ux~{wy~~|tw}|~}x{z|~zw~w{~{z~~~yy}xst{wy{}xy{w~{}|x~zz~|w~|}}|~xvzuuzyuz~{|}wt{{}|~w~~~|~|z~~}}~}z}ytv{yx{|zxztw~}z{vz~{~yw}|}}|zwxzvx}z{}|zsx~~}xz~yz|y{{y{z}}v|~wps|w|y}zwwz~|{x}yx~~}}|y~z|{ux{tquzu{}~z{z|z}||z}zz~|~}~}~w}~z{~w||tsv{yz~~zxvx~~}{|}{v|~~{}}uy}~}~z}~xutx}{|}z~~ztx~||x{}xt~}z{~zv}{z||vrvzw|w~{wz|}yyw}wu|~|}}yy~}|~{x{ysqy{u}zyx|z~}~yxzw}~|~|{{}~z~xx~xrs{|x}{wuy}|~{z}}x}||zy||w{zutyz{{y}zvw~|}y}|yt}~|}z}|wz~~y{|zwtxyx}}~x}~|w{~~z~zw~~wt{{|zw~||zzzxsqzzw}zyu|z}~wyxy~}||z}}{vz|xpt}{{{{}vu~}~|y}{x|}~~~}}z~}~~}u~}xrx|x}~x|yxx}|}~|{~}yw{~|}||{x|}yzvtxzw|~|z}}zzz~{|{z||{vz~{|~~xx~{}{~xusvzy||~||yxy}|x{}x}}}~|z{}}{z|yvqu{z~z}|ww}}y~z~{w~~|z|~|x{{xsw|x}x|{vy~{||yzv}~~~{yz~y}|vsx{w{}x}ywz}}~{x~}zw{}}}}}zx~|}}y~{urvzw|~|z|yy}~||}y|}}y||{~}y}}~}x|zvssyy|~||}zw{}~{{{}xy|~{x~yz{yvtz{z}}z~~zu{~{~|z{xw~~~{w|}|z}{uqz|x|}y~yv{|~|{y~~yw}~~}~|yy}}w~|vqv{wz}y}|xy~|{~}y|~{x|}|}~|y~}}v{|wrtyyy|{~zw{}{|{|{~zw|}}x|~~}yy{yuty|x}z~zvx~z|~x~{v}~|}yx~~}y}|vrv}x{~y{{vw||x|{u{}{~}zw~~w{~xru{wx~zz~yw~|}|}x{|wz}{}~|y}}wy}xrtzxx}z~yw|}{}|z{~xx}~~}x}}}wy|xtt{{x}z~xuz}{~{yyw~~}}}x{~yz~ztsy{x~|x~yuz~|~||y~}xv~~}||x{~zy}{usyzv||x~zwz~{~|{x~}yv~}|~|y|}zx|ztryzv}~zyw{{}|{yzw~~}}y{~~|xx}ystz{x~|zyvz}z~~|y~~zw~|~y|~~xz~zttzzx~|y~}xvz~|~}|y~}xw}}||x|~~x{|ytuzyx}~{y}yw|~||}zy~}wx}{}~{y~~x{{xsu{yy~{{}xw~~}{~~x{}w{~|{z~}~}w{zvrw|y{~y|{wx~||~y}{w}~}~~{{~~|w|{wsx{x|}y|ywy}{}|z~~zw}~}~}{z}|y}zvsyzx|~|y}~yxz}|~|z}}zw|~|~}yz}{y}yusxzx|}|z~~zxy~}{~|y}~{x~~~|{{~{y|yvsw{y}~~z}~zwy~}~{~z~{w}~}~z{|x{zwtx|x{~~y|zwx~||}y~~{w}~~}{z~y|{vsw{w{~}y|~zwy}|}y}~{w{~}~~{y~x||wsv{wz}}z{|xx}}~|}~y{}}y{}|}}z~~y{|wttyxz~~|z~}yx{~}||{{~~yx}~~}y}~zy|yvtyzx|~}y}~zwz~{~||y~zw~~}}z{~~y|{wsw{xz~}y{zwx}~|~y|{w{~}~~|yx{}xsu{xw}}zz~yx|}||}zz~}yy~}|~z}}zy|ztsxzw|}y}zxz~{~{}y~{w}~|~zz~~|x|{vtx{wz~}z|{wx~{}|~x||w|~|{yx|}wsv{xy~~zz|ww~}}|~y{|wz~|~~|yyz}ytuzxw}~{y~yx|}{}}zz~}yy~}}}z~~zz}xttyyw}~|y~yw{~{}|{z~yx~~}}y}~zy|yutzzw|~|y~ywz}{~}{y~~zx~~|~z|~{y}zutyzw|~|x}~yvz~{~||y~~yw~~~|}y{~{y|zutyzv|~|x~yw{~{~}{x~}yx~}|}z}~zy}zttyyv|~|y~xw{~{}|{y~zx~~}~z}~yy|yttzzw}~{y~yw{}{}}{z~}yx}}}z~x{}ytuzxx}~{y|xw|}||}z{~}xy~|~|y~y{{wtvzxy}}zz~|xx}}}|~~y{~|wz~|~~{z~~y|zwswzwz}}z|{wy~}{}y|{x}|{{~}y|zvsw{x{~}y|zwy~|~|}y}~zw}}~{||x|{vtyzw{~|x|~ywz~{~||y}~zx~}~~{|~|y}zutyzw{~{x}}yx{~|~||z}}zx}}~~z{~|y}zutxyw{}|y}~zxz~|~|~|y}~{x~|{{~}y|zvswzx{}}y|~zxy~|~{}z}~{w}}~{{}y|{wtw{xz}}y{~{wy~|~|}y|~{w||~|{y||wtv{xy}}yz~{wy~}}|~~y{~|xz~}~~|zyz|xtuzxx|}zy}yx|}|}}~zz}}yz~}}~z~~{z}yutyyx|~{y}}yx{~|}||z}~zx~~}~z{~}x|zwtxzwy}|y{{xx~|}|~y{|x||~|zy{|ytuzxw|}zx~|xx}~||}zz~}yy~}}}z}~{y}zutyyv{}{x}yxz~{~||x}~{x~|{{~}y|{vswzwz}|y{zxy~|~~|~~y|~|w|||zx{|xtv{wx}}zz|xx}|||~y{~}x{|~}zz{}ytuzxw|}zx~}xx|~||}zz~}yy}}}z~zz}yuuzxv{}zx~~yx|}{}}zy~}yy~}|~z~{z}yutyyv{}{y}~yx{~{}|{y~~zx~~}~z|{y|zutyyv{}{x}~ywz~{}||y}~zx~|~{}{z}zutyyw{}{x}~yw{~|}|{y~~zx~~}}z}{y|zutyyv{}{x}~yx|~{}}{y}}yy}}}{~zz}zttyxv{}{x~}xx|~{|}zz~~yy~}}~z~yz|xtuzxw|}yy|xx}}||~z{~|xz|}}zy||xtwzwx}|yz{xy}|}|~~y{~|x{|~|z~~y|{vtxzwz}|x{~zxz~|~~|}y|~{x}|~~{{}y|zvtxywz||y|~zxz~|~{|y|~{x~~|{|}y|zvtxzwz}|x|~zxz~|}||y}~zx~~}~{}|y|zvtyzvz}{x|~yw{~{}|{y}~zx~~}~{}}y}zutxzvz}{x|~yx{~|}||y}~zx~}~~{|}y|{vtxyvz|{x|~zxz~|~|~|y|~{x}|~||~y|{vtwzwz}|x{~zxz~|~~{~}y|~|x|||{y{{wtwzwx||yy~{xy}}||~~y{~|x{|~}{z{|ytuzxw|}yx}|xx}~||}zz~}yy}}~{~{y}zuuzyvz}zx}~yx{~{}|{y}}zy~|||~~y|{vtxywy}|xz~zxz~|~~{~~y|~|x||~|{y{|xtvzxw{|yx~|xx|}{|}zz~}yz}}~{~|z}zutyyvz}{x|~yx{~{}||y}~zx~|~||}y|{vtxzvy|{x{zxz~|}~|~}y{~|x}|~}{y||wtvzwx||yy~{xy}}||}~y{~}x{~|~}zzz|yuvzxw{|zx~}xx|}{|}zy~}yz|}~{{z}zuuzxv{}zx}}xx|~{|}zz~}yy}}~{~{z}zuuzxvz|zx}~yx|}{}}{y}}zy}|~{}|z}zutyyvz}{x|}yx{~{}||y}~zx~~|~{}{y|zuuyyvz|zx|~yx{~{}}{y}~zy}|~{~{z}zuuyxvz|zx}}yx{~{||{y}~zy~}}~{~{z|zuuzxvz|zx}}yx|~{|}zy}}yy}}}{z{}ytuzwv{|yx~|xx}}|{}~yz~}y{~|~}{y{|wtwzwx||xy~{xy~||~|~~y{~|x||~||~y|{wtxyvy|{x{~zxz~|~~|~|y|~{y}|||}y|{vtxyvy|{x{}zx{~|~}||y|~{x~|||}z|zvuxyvy|{x|~zx{~|}||y|~{y~~||}}z|zvtxyvz|{x{}yx{~|}||y}~zy~~}~{}}y|{vuyyvy|{x{~zx{~{~}||y}~{y~~||}~z|{vtxyvy|{w{}yx{~|~}||y|~{x}|||~y|{vtxzvx|{x{~zxz~|}~|~}y|~|y}|~}|z||wtwzwx||xy}{xy}}|{~~z{~}y{|~}{z{|yuvzxw{|yx}|xx|}{|}zz}}yz}}~{|z}zuuyxvz|zw|}yx|~{||{y}~zy~}|}~y|{wtxyvx|{xz~zxz~|}~|~}y{~|y}|~}|z{|xtvzww{|yx}|xy}}||}zz~}yz~}}~{|z|zvuyyvy|zw|~yx{~{~}||y|~{y~||}~z||wtxzvx|{wz~zxz~|}}|~}y|~{x}|~}|y{|xtwzvw{{xy~{xy}|||~~yz~}y{|}~{{{}yuvywv{|yx}|xy}}||}zz}}yz~}}~{{z}zuvzxvz|yx}}yx|}{|}zy}~zz}}~||z}zuuyxvz|zw|}yx|~{||{y}~zy}}~|~|z}{vuyyvy|zw|}yx|~{}|{y}}zy}||~|z}zuuyxvz|zx|}yx|~{||{y}~zy}}|~|z}zuuyxvz|yx|}yx|}{|}{y}}zz}}|{{}zuuyxvz|yx||xx|~{|}{z}}zz~}}~{{{|yuvzwvz{xx}|xy}}{|~~zz~}y{|~}|z||xtwzvw{{xy~{xy~||~{~}y{~|y}|}|z|{wtxzvx|{wz}zx{~|}}||y|~{y~||}~z|{wuxyvx|zw{}yx{~{~}|~|y|~{y~~||}}z}{vuyyvy|zw{}yx{~|~}||y}~{y~~||}}z}zvuyxvy{zx{}yx{~{}|~{y}~{y~||~}z}zvuxyvy|zw{}yx{~|~}||y|~{y~~||}~z|{wuxyvx{zwz}zx{~|}}||y|~{y~~|}}~z|{wtxyvx{{wz}zx{~|}}|~}y|~{y}|~}|z||xuwzvw{{xy}{xz}||~|~~y{~|y||~~|{{}yuvywwz{yx||xy}}||}~zz}}zz~}}~||z|zvuyxvy{yw|}yx|~{||{y}~zz~||~~z|{wtxyvx{{wz}zxz~|}}{~}y|~|y}|~}|z{}yuwzwvz{xx}|xy}}{|}~zz}}z{}}||z}zvuyxvy{zw{}yx{~{~|||y|~{y~~||}~z||wuxyvw{zwz}zxz~||}|~}y{~|y}|~}|z||xtwzvw{{xx}{xz~}|~{~~z{~|y||~~|{{}yuvzwvz{xx}|xy}}{|}~zz}}z{}}||{}zuvyxvz{yw||xy|}{|}{z}~zz}}||z}zvvyxvy{yw|}yx|}{~||{y}~zz}||}z}{vuyxvy{zw{}yx|~{~||{y}~zz~}|~|z}{vuyxuy{yw{}yx|}{~|}{y}}zz}|||z}zuuyxuy{yw||xx|}{||~{z}~zz}}||z}zuvzxvy{yw||yy|}{|}{z}}z{}}|{{}yuvywvz{xx}{xy}}|{}~zz~}z||~~|z||xuwzvwzzwy}{xz~||~{~}y{~|y}|~}}~z||wuxyvw{zwz}zx{~|}}|~|y|~{y~~|}}~z|{wuxyvx{zwz}zx{~|}|||y|~{y~||~}z}{vuyyux{yw{}yx{~{~|||y|~{z~}}~}z}{vuyxvy{yw{}yx|~{~||{z}~{z~}|~}z}{vuyxux{yw{}yx{~{~||~|y|~{z~|}~~z}{wuxyvx{zwz}yx{~|}}|~|y|~{y~|}}~z|{wuxyvw{zwz}zx{~|}}|~}y|~|y~|}}{||xuwyvw{{wx}{xz~||~{~~z{~|y||~~|{{}yuwzwvz{xx||xy}}{|}~zz}}z{}}||{}zvvyxvy{yw{|yy|~{~||{z}~{z~||~~z|{wuxyvw{zwy}zxz~||}|~}y{~|y}|~~}{{}yuwzwvz{xx|{xy}}{~{}~zz~}z{}}|}z}{vvyxux{yw{}yx|~{~||~|y|~{z~|}~z||wuxyvw{zwy}zx{~||}{~}y{~|y}|~}}{||xuwzvvzzwx}{xz}|{~{~~yz~}z||~~|{{}yuvzwvz{xw||xy}}{{}~zz}}z{}}||{}zvvzwuy{xw||yy|}{|}~{z}}z{}}}|{}zvvyxuy{yw{|yy|}{~||~{z}~{z}}|}z}{vvyxux{yw{}yx|}{~||{y|~{z}|}}{}{vvyxux{yw{|yx|~{~||{y}~{z}}||{}zvvyxuy{yw{|yy|}{~|}{y}~z{}}}|{}zvvywuy{xw||xy}}{{}~zz}~z{}}|{{}yuwzwvzzxx|{xz}}{~{~~zz~}z||~~}{||xuxyvvzzwy}zxz}||}{~}y{~|z}|~}z||wuxyvw{ywy}zx{~|}||~|y|~{z~~|}~~z}{wuyyuwzywz}yx{~{}||~|y|~{z~|}~~{}{wuyyvx{ywz|yx|~{}|||y|~{z~}}~}{}{vvyxux{yw{|yx|~{~||{y}~{z~}}~{}{vuyxux{ywz|yx|~{}||~|y|~{z~|}~~z}{wuyyuwzywz}yx{~{}||~|y|~|z~|}~{}|wuxyvwzywy|zx{~|||{~}y|~|z~|}}{||xuxyvvzzwx|{xz}|{}{~~y{~}z}|~~}|{}yuwywvy{xw|{xy}}{~{}~zz~}z{}}}|{}zvvyxux{xw{|yy|}{~||~{y}~{{~|}~{}|wuxyvwzzwy|zx{~||}{~}y{~|z}|~~}{{}yvwzwvyzxw|{xy}}{~{}~zz}}z|}}}}{}{vvyxux{ywz|yx|~{}|||y|~{z~|}~z||wuyyuwzywy}zx{~||}|~}y{~|z~|~~}{|}xuwyvvzzwx|{xz}|{}{~~z{~}z||~~}|{}zvwzwuyzxw||xy}}{{}~zz}}z|}}}|{}zvvywuy{xw{|xy}}{~{}~{z}~z{}}}}{}{vvyxuxzxw{|yy|}{~|}~{y}~{{}}}}{}{vvyxux{ywz|yx|~{}||~{y}~{z~}}}{}{vvyxuxzxw{|yy|}{~||~{y}~{{}}}}{}{vvyxux{xw{|yy|}{~{|~{z}~{{}}}|{}zvvzxuxzxw{|yy}}{~{}~{z}~z{}}}|{}zvwywuyzww|{xy}}{~{}~zz~}z||~~}{|}xuxyvvzzwx|zxz~||}{~}z{~|z~|~~~{}|xuxyuwzywy|zx{~{|||~|y|~|z~|~~~{}|wvyyuwzyvz|yx|~{}||~|z|~{z~|}~~{}{wvyxuwzywz|yx|}{}||~|y|~{{~|}~{}{wvyxuxzywz|yx|~{}||~|z}~{{~}}~{}{wvyxuwzywz|yx|~{}||~|y|~{z~|}~{}|wvyyuwzyvy|yx|~{}||~|y|~|z|}~{}|wvyyuwzyvy|zx{~{|||~}y|~|z~|~~{|}xuxyvvzzwx|zxz~|{}{~~z{~}z}|~~}||}yvwzwuyzww|{xy}}{~{}~zz}~z|}}}}{}{vvyxuxzxw{|yy|}{}{|~{z}~{{~}}{}|wvyyuwzywy|zx{~||}|~}y{~|z~|~~}||}yvwyvvyzww{{xz}}{~{}~zz}~z|}}}}{}{wvyxuwzxvz|yx|}{}||~|y|~|{~|~~{}|xvxyuwzyvy|zx{~|||{~}y|~|z~|~~}{|}yvxyvvyzwx|{xz}|{}{~~z{~}z}|~}||}zvwywuyzww{{xy}}{~~{}~{z}~{|}}}}{}zvwywuxzxw{|yy}}{~{}~{z}~{{}}}}{}{vvyxuxzxw{|yy|}{}{|~{z}~{{}}}}{}{wvyxuxzxvz|yy|}{}||~{y}~{{}}}}{}{vvyxuxzxwz|yy|}{}{|~{z}~{{}}}}{}{vvyxuxzxw{|yy|}{}{}~{z}~{{}}}}{}{vwywuxzxw{|xy}}{~~{}~{z}~{|}}}||}zvwzwuyzww{{xz}}{}{}~zz~}z}|~}{|}yvxyvvyzwx|zxz~|{}{~}z{~}z~|~~{}|xvyyuwzyvy|zx{~{|||~|y|~|z~|~~~{}|wvyxuwzyvy|yx|~{|||~|y|~|{~|~~{}|wvyxuwzxvz|yx|~{}{|~|z|~{{~}}~{}{wvyxuwzxvz|yy|}{}||~{z}~{{~|~~{}{wvyxuwzxvz|yx|~{}||~|z|~|{~|~~{}|wvyxuwzyvy|yx|~{|||~|y|~|{~|~~{}|xvyyuwzyvy|zx{~|||{~}z|~|z~|~~{|}yvxyvvyyvx|zxz}|{}{~}z{~}{}|~}||}zvwywuyzww{{xz}}{~~{}~{z}~{|}}}}{}{wwyxuxzxvz|yy|}{}{|~{z}~{{~|~{}|xvyyuwzyvy|zx{~|||{~}z{~|z~|~~~||}yvxzvuyzww{{xz}}{~~{}~zz}~{|}}}~{}{wvyxuwzxvz|yy|~{}{|~|z|~|{~|~{}|xvyyuvzyvy|zx{~|||{~}y{~|{~|~~||}yvxyvvyywx|{xz~|{}{~~z{~}z}|~}||}zvwzwuxzww{{xy}}{~~{}~{z}~{|}}}}|}{vwywuxzww{{xy}}{~~{}~{z}~{|}}}}{}{wwyxuxzxvz|yy|}{}{|~{z}~{{}}~~{}{wvyxuwzxvz|yy|}{}{|~|z}~{{~}~~{}{wvyxuwzxvz|yy|}{}{|~{z}~{|}}~}{}{wwywuxzxvz|yy}}{}~{|~{z}~{|}}}}{}{vwzwuxzww{|yy}}{}~{}~{z}~{|}}}||}zvwyvuyzww{{xz}}{}{}~zz~}{}|~~||}yvxyvvyyvx|zx{~|{|{~}z{~}{~|~~{}|xvyyuvzyvy|zx{~{|||~|y|~|{~|~{}|wvyxuwzxvy|yx|~{|{|~|z|~|{~|~~{}|wvyxuwzxvz|yx|}{|{|~|z|~|{~}~~{}{wvyxuwzxvz|yy|}{}{|~|z}~|{~}~~{}|wvyxuwzxvz|yx|}{|{|~|z|~|{~|~{}|wvyxuwzxvy|yx|~{|||~|z|~|{~|~{}|xvyyuvyyvy|zx{~{||{~}y|~|{|~~||}yvxyvvyyvx|zxz~|{|{~}z{~}{~|~~||}zvwzwuxyww{{xz}}{~}{}~zz}~{}}}~}|}{wwywuxzxvz{yy}}{}~{|~{z}~|{~}~{}|xvyyuvyyvy|zx{~|{|{~}z{~}{~|~~||}zvxyvuyzww{{xz}}{~}{}~{z~~{|}}~~{}{wwyxuwzxvz|yy|}{|{|~|z|~|{~|~{}|xvyyuvyyvx|zx{~|||{~}z|~}{|~~||}yvxyvuyyvx|{xz}|{}{~~z{~}{}|~~}|}zvwywuxzww{{xy}}{~~{}~{z}~{|}}~}|}{wwzwuxzwv{{xy}}{}~{}~{z}~{|}}~}|}{wwywuwzxvz{yy}}{}~{|~{z}~||}}~~{}{wwyxuwzxvz|yy|}{|{|~|z}~||}}~~|}{wwyxuwzxvz|yy|}{}~{|~{z}~||}}~}|}{wwywuwzwvz|yy}}{}~{}~{z}~{|}}~}|}{wwywuxzwvz{xy}}{}~{}~{z}~{|}}~||}zvxzvuxyww{{xz}|{~}{}~z{~}{}|~~||}yvxyvvyyvx|zx{~|{|{~}z{~}{~|~|}|xvyyuvyxvy|zx|~{|||~|z|~|{~|~{}|xvyxuvyxvy|yx|}{|{|~|z|~|{~|~|}|wvyxuwzxvy|yy|~{|{|~|z}~|{~}~~|}|wwyxuwzxvz|yy|}{|~{|~|z}~||~}~~|}|wvyxuwzxvy|yy|~{|{|~|z|~|{~}~{}|xvyxuvyxvy|yx|~{|{|~|z|~|{~|~|}|xvyyuvyxvx|zx{~{||{~}z|~}{|~|}}yvxyvvyyvx{zxz~|{|{~}z{~}{~|~~}|}zvxyvuxyww{{xz}}{~}{}~{z~~{}}}~}|}{wwywuwywvz{yy}}{}~{|~{z}~||~}~|}|xvyyuvyxvx|zx{~|{|{~}z{~}{|~~||}zvxyvuxyww{{xz}}{~}{}~zz~~{}}}~~|}|wwyxuwzxvy|yy|}{|{|~|z|~|{~|~|}}xvyyuvyxvx|zx{~{{|{~}z|~}{|~|}}yvxyvuyyvw{zxz~|{~|{}~z{~}{~|~~}|}zwxywuxyww{|xz|{z{}{z}~{z{zz||yuvxwrvzxux{xz|zyy}~~}z~~}~~~~}z~{xy{{{|{vxzyzz{z~~{{|{y{|z~|w|}x}~~}{}}xtuxvwxrt}zy|}}|}}vx|{z}~~~~zwyzyrrwvuvyvxzxww{|~|~}{y~~zwwz|}}{wx|zzz{|zz{{yz}||zv}~y|}~|{||xuuxwwvqu~{z||~||~~|wy|{{~~~~|yxyyxsswvuwxwxzwwx{~|~~~~}{||xxx{}~|ywx|{zz{}~}yz}~{{{}}{yx}{}~}}z||zwvwxxvtsz}zz|}}|}~|zyz|z}~~zxxzxuuuwuvxxyyzwxz}~|}~~{{{xxy{}~{wxx{{zz{}}|zz~~{|}}}yx{~|}}~~}z||zwwxxxusu{~|{y{}~~|}}~|z{{|{}~~}yxyyyuvvvvvxxzyyxxz}~|}~~{{|xxy{|}{wwx{{zzz}}|zz~~||~~}yx{}}}~~~{{|{xwyyyustz~}{yz|}~|}}~}{{{||}~~}zxyyywvvvvvxxyzzywz{||}|{}~yxxz|}|xvwz{zzz{}|{y|~|~~~{yy~}}~~|{||{xxyzwtsu|~}zxz|~|{}~~}{z|||~~~|xxyzyxuvwvwxxy{{xxy|~|{~~|{}}zxw{}}{xvw|{yyz{}|yz|~|}~zyx~|~~||{}{xw{{wuru|}zxx|~{{}~~{z}|}~~|}}{xxzyzxtwwwxxwy}zxyx|~{{~|z~}zwx|}|zwuy{zyzz{}zy{|}{}{xy}}}{|}{wy|yvtrw~~|zwy~|z{~~~z|}|}~~~~}|~ywyzz{vvxwwxww||yyxz|z~}z{{ywz}|{yuw{zyyzz|{x{{~|~~{yx}}~}|{}|xx|{wtru}|zww}}zz}~{|}|}~~||~~ywyzz{wvxwwxww{}zyyy~}y}}{{{ywz}|zxuv{zyyzy|{xz{~|~~{yx~}}|||}|xx|zvtsv}~|yww}}z{~~{|}|}~~~}~|~}xwyzzzwwxwwxwx|}yyyz~{z~~|{}}zyw{||zwux|zyyyz{zy{}~}}zyz~}{{|}zyz{xtttz~}{wwz}{z}~}|||}~~}}}}{wxzzzyxwwwxxx{|{xyz|}z|}{||zyy{{|yuvy{zyyyzzzzz~}~|yy|}{{}}zy{zxttv{}}{ww{|{{}~}}||}~~~}|}}zxxzzzxxxwwxxx{|{yyz}}z|}{|}zyy{{{yuvy{zyyyzzyzz}~~|yy|~{{}}zy{{xutuz}}{wwz|{z|~~}}}|}~~}}|}{xxzzzyxxwwwxwz||yyz{~{{~||~{zxz{{{wuw{{yyyyzzzz|}zzz~~}{|}}yz{{wttv|}}zwwz|zz}~}}}}}~~}||}zwxzzzzxxwwxxwz||yyz{}{{~||~~{zx{|{zwuw{zyyyy{zy{|}~zzy~|||}}yy|{wutu|~|zwv{|zz}~}}~}}~~}||~zwxzz{ywxwwxxwz}{yyy|}z{~|{~{yx{|{zwuy{yyyyy{yy{|~}}{yz}}{|~|xz|zvtsw}}|yvw|{y{~~|~}}~~~~}~{~|xwyzz{xxxwwxww||zyyz~|z~}|||zxz|{zxuw{zyyyy{zxz{~}{zy~}}||}}yy|{wusv|~|zww{|zz}~}}~}}~~}|}}ywyzz{xwywwxww{|zyyy~}z}}|||zxz|{zxuw{{yyyyzzxz{~}~{zy~}|||}|yy|zvtsw}~|yww{|z{~}}~}~~~~}~|}|xxyzz{xxxwwxwx||yyyz~|{||~~{yx{|{zwvy|zyyyyzyyz|~~}zz{}{{|}zy{{xttuz}}{xwy|{z}~~}}}}~~~}|}zxyzz{yxxwwwwwz|{yyz|}{}}|}|zyy{{{yvwz{zyyyyzyzz}~|zz}~}{{}|zz{zwttv{}}zwwz{{{}~~}}}~~~}}|zxyzz{yxxwwwwwz|{yyz}}{}}|}}zyy{{{yvwz{zyyyyyyyz}~~|zz|}{{}}zy{{xutuz}}{xwz{{{}~~~}}}}~~}}}{xxzz{zxxwwwwwy{{yyz{~~||||~{zyz|{zwvx{{zyyyzyyz{~~~{zz~|{|}|zz{zvttv|}}zwxz|z{}~~}}}~~~}|}{xyz{{zxxwwwwwy|{yyy|}||~||~{zx{|{zwvx|{yyyyzyxz{~}~{zz}||{}|yy{zvttv{~}zxwz|z{}~}~}}~}~}}}zxyz{{zxxwwwwvy|{yyy|~|}~||~{yy{|{zwvz|zyyyyzxxz|~~}}zy{||{|}{yz{yvttx}}|zwx|{z{~}~}}}}}~|}|yxzz{{xxxwwwvw{|zyyz~}{}|}|zxz|{zxvx{{zzyyzyxz{}}~{zz~}||{}|yy{zwtsv|~|zxw{|z{}~~~}}}}~|}}yxy{{|yxxwwwvwz|zyyz}}|~}|}|zxz|{zxvx|{zzyyzyxy{}}~~{zz~}|{|}|yy{yvttw|}|zxx{|z{~~~~}}}}}}|yxz{{{yxxwvwvx{{yyy{~~||~||~{yy{|{ywwy|{zyyyyxxz|~~~}zz|~|{{||zyzzwttuz}}{xxz|{{}~}}}}}}}}{yyz{{zxxwvvvwy{{yyz|}|~}|}}zyy{{{ywx{|{zyyyyxyz}~~~|zz}~|{{||zyzywttv{}}{xxz{{{}~~}}}}}}}}zyyz{{zyxwvvvwz{zyyz|}|~}|}}zyy{{{ywxz|{zyyyyxyz|~~~|zz}~|{{||zyzzwttuz}}{yxz{{{}~~}}}}~~}}{yyz{{zyxwvvvvx{{zyz{~~|}|||zyz{{zxwy{{zzyyyxxy{}~}~{z{}|{|||zyzyvttw{}}zxxz|{{}~}}}}}~}}{yyz{{zxxwvvvvy{{yyz|~|}~||~{zy{|{zxwy|{zzyyyxxy{}~}}{z{}|{{||yyzyvttv{}}{xxz|{{}~~}}}}~}}{yyz{|zxxwvvvvx{zyyy|~|~~||~{yy{|{yxwz|{zzyyyxxz{~~}}zz{||{||{yzzxvttx|}|zxy{{z|~~~}}}}}}~|zyz{{{yxxwvvuwz{zyyz~~}}}|~}zyz|{zxwy||zzyyyxxy{}~}~~{zz~}|{{|{yyzyvttv{}|{xx{{{{}~~~}}}}}}}zyz{{|yxxwvvuvy{zyyz}~}}}|~|zyz|{zxwy||{zyyyxxy{}~}~}{z{}|{{|{yyzyvttw|}|zxy{{{|~~~~}}}}}}|zyz{{{yxxvvvvwz{zyy{~~}}~||~{zy{{{yxxz|{zzyyyxxz|~~}|zz|~|{{||zyzywttvz}}{yxz{{{}~~}|}}~~}}{yz{{{zyxwvvuvy{zyyz|}}}|}}{yz{{zywy{|{zyyyxxyz|~~}~~{zz~}|{{|{zyzyvttv{}}{yyz{{|}~}}||}~}}{yz{{{zyxwvvuvy{zyyz|}}}|}}{zz{{zyxy{|{zyyyxxyz|~~}~~|zz}~|{{||zyzywttvz}}{yxz{{{}~~}||}~~}|zyz{|{yxwvvuvxz{zyz{~~}~~||~|zz{||{yy{|}{zyxxwwxz|~}}~~|{|~}}}~}{z{yvsruy{zxwwyz{}~~~~~~~~}|zyxvuuuuwz||{|}~~~}}||||}~}zwttuutrruxxxz||}}~|{|~{zz{~~}}|{zxxwuttvy||yvuwwustvwwvvvvvx{~|yyzywy}}}}}{ywwxvtsux~~{yxxyxwvtsuwvspooppprvy{|~yvvy}}|zxwxxyyzzzzxvutsqprvwvuuwz{|~~|zyyxwxwwuuuuuw}}|{yvtv{~|ywwyyxy{|~~{{|{yxxyzyxxwvuuuwwz||yxyxxww{|yvuutttrqsuvwxz}|}~}||zxvwyz|||{yy{|zvsswzyxzzz{}}~~|}{xxxxxvuvwwy|}||~}|{{~}}~{|~~|xvvvuttuwxxy|}~||{z{zy|~||}|{}}}}~}zyzxvttsnjhjnrstsqrv{~}|~~~|{|}~}{|||ywy||{|}{z}~~||~~~|}}{z|~~|yyywx{zwroprsqppprux|~~}~}{{|}}}~{xwvurppuyxvuuuspqsvvuutrrty~~}|}||zyz~~}{xwwwwvtsrsx~}~}|{xwvwwsrtvuqooprpptvx{~~{wtuxz}}zxy{zyxy{zwwvtroptyzxwxwxz~~}~|yvwy||yxywuuz|yy{xuuwyzz{{{zz{{z{~}{|}|{|zyyzzxvtsuuux|}|yy|}{wy}~|{zyvuvurruz{zxz~}|~~}zwwxxxz|~|z{||xutuyzyzzxxz}~~~}|~~{{zyvtvwyxvx{{{|~~{yz|}~~|zyyzvtuuux|}{}|zzzyz}~~}}}}|{|~z|zz{xxxvspnmmooswvssw~{zz~|ywy~}{||{xvwz}{{||zxy{|~~z{~}{z}~}~}yxzywy{|yuuuwwttspps{}}~{{~}~~~}~|z~~|||xwwuqnnswxzzwtsuwyywxyustx}~}}~}||}|{~{yy{~~~~~zxyz{xuwuqps}~~~}zwuyywwwuusstvuqqrrsw}~~{z~{yvuuuy|z{{yww{|{|zxtpqtwzy{{xwy~~zuux{~{z{ywvy~}|yxzyyywusv{~}z|}zz~~~~~}~{yxzywtruutwz{zz|~{zzy{{xxvtsu{{xz{{~}}~{yxvutx~|zxyz{xw{zwwy~}zzy{~~{wsuy|zvvxxz|~~}zxy|~~|~~~{}~}xvvtsv}|}~}|z{zy|~||}~}}}|yzyy{}~|{|{wrpsttpmquuuw}}ywy}}{wvz}~}xvxz}~}}{|}{xwwvyyy}~{|~|}|~~~|~~zz{yz|{{z{|}|wvxtqqu|xz}{|}~~~}z{zy{}|ywutportx}~{vuy|~{y{{wuv|}|}}~|zyxy}~|yy~|yy}}}z{|~}xuwusrv~~}yy|{{|yuruyz{vrsqprx~}}}zx{~}ywvwuw}}|z{zy}~|vrtvzzx{~|zz~{z~~}{wwx{~{z|{xxzz|}|yy{z{}|wrsy{|}||~|{}~{xyyywuwwvxyyxx}}|{xx|~}|||{{xutw}~||yvz}||yvutv|{z}~~zvx{yyz}yxvvz~zuvx{{vuvtux}~~{xwx{{}~~xxvttx~|}~|zz{}|}}{z{}~~|zzzwvy}}|}yssvyysoqrsvy~yvw{}~}ywy{}zwy{}|y|~~zx{}~zwvtwzy{~~}{}}|{{~{xx}~}|~}{yyzyzwtsx{wyz~~}}~}~~}z}{{yvv{~{yvvtsutuz}}yw{}{{}|zz~}}~~|zyux}~||~zvw{|~~~}~}}xxwuuv{~~}}}|~~~|vrv{xvvsqpv~}yz}~~}~~~yuvzyz|{{~~}{{zz~}wxyzzvx|}}}}{{y{|~}z}xy{{|wvzzyy}~}~yy{~~{z||||vtwz|}}{|{|~~~{xvxyy{|{}|xtt{}|}yvv~|}~~~~~|{zx{}|xvx~{tuy|z|}ywtty|~}}wwxxz|~~~{zwuy|~}y{{{yuuwtst}}~~{xwwx}~|{xtsy}~zww|}{yxx{~}~|y~zzyvux}}|yz}}wvyz}ztssqqv}wvxz~~{|||~{~|vw|}~~ywyz}|zwsvy{}~|yx}}|z{~|wuz~}yvz||{xwx{z{}}zy{~{xz}~{wuw}zxxvvyyy{|{xy~|}~||}}{}}}~}zwy{~z||z~yvwx{||||}}|{xyxvv{~||{}|vvy}~zzyurs|~~~}||~}~|wx}~|x{~}zvvy{}|z{|}|}|{|}}}zuuz{|}~y|}z{{|{{~|{}~}wtxyxx|}}xxz}~||~}|}~}yxz|~|z|~|{}}}}{z}{xxxy}|urx}~|}{xv{||~}z{}{{{{xy}|~~{yzxwx||z|~|wtx{yxxwx{{z}|}}}|zvwz|}{~~{tsvvtrw~}~|zywx}~yuu}~yuv{~{wvy|}xw}}|yvuz~|yxz{~~xy{}}yvwvrquzxyy}}~~~~wuxyz}}zxyz|~|wuwz}~xtx|~|}{z|{wwy|}wv|~}zy~~~~~xtu|~{z}{vy~|zvv~|}}zzxvy}~~zvw}{|}{|zx|}~|{||{wy|~}xy|}zzyy{~}}}{xz}}}}}{zzxvv~~}zy{}|~y{|}~zz}}yvx~|xy|z{|{|}vw||vx{{{~~{vvy{||{z{}}{~}uswxxz{z|~}|{}~ytvwvvz{uwz~{ww{~}}xz{vy||{|~ywy~{zxv{yuxz~}}|yw{~~{ww{~{xz{zy|~~}}}|z|zzz||yx{~}yyz}~|{{wuw{xz~|~~|xy{}{z~urtuttz|{~}|}|yy|~}xzyvvy~}ywwwz}vw|zvx}vux{}|{~~{vwzxus{~}|}~}~{|{xxvux}y|~zz{}~}~}{yyz}~xux|}|~}||{|~zyzz}}vx|~|}z}}vsuz}yy{|}wy}}z|}zyzz}~~}|ywz}|uv}{|~{|xwz~~~~}~ywxxy||wy|~{{||||{z}}zxy{{}|~{|{xuy~{}~}yy{{||}~zw|~{{}~~wux~~{z|{z}yvz}~wwyxxz~~xwxz~~~|yy|}{}~ytvvvw}||~|}~|}~zuwxvux}uux}|vtw|~}~xz}vwz{z{yuvz~~~{wx~}y{|||yz~{w{|wvy|}xxzyz}~}}~~{y|z{|~|wvy|~}|}{~}}~{vu~zy{~}~~~}|z|~zx}{uttssx|z{~}{}|z{~}~~|~zxxz~{zxuy{wz|~~|x{}|usw{~}{~zuwzyvw~~{|xy~{{yut|~yy|~}~~|}}{~~}}||~}zvy|}~{y}}|~}}zyz|}~z{}~zz}{}|xuuw|}zzyxz~xz}{xz||{}}{yz~|yy|xvz~zz}~||~xwz}}|{yw~~xyxvuzzxz~zy{~~zy||zyzxx|{{}|xv}|y{}~|zyxz}xtx|}|~~}~xuvy{{{zy||{|||zwxywuw~{z{{~{yz{z|}zyvst{|z|~}{|~{{~wwxvtwzvvz}xuvx|~|~xx}ywyxxy~wuw{zy{~}{ttz}}z~~}xwx{~}{yvw|{y~~|y{zz}xuw{~{xz}}}zx~}~~{|~}}~~~~xw||zxuqqy~}{|~|z|}|}~{}~~~||||~yvx|zz}}|yw|}}||vuvz~~~}{{~wuxxwx~}~||}|}zw{~|xuy{z{}~~|z|}|~~{vuz}~|wvz}|{~}xx{~~|ywz|}|y{~zyyy}|{zwvz|z}{wxzzy|~|{|~}|~~~~{{|zy|}}yy|||}|z{}{}{z|wu{}yyxuszzz||yx{|zzyyzzxx{}|x{|{y{|{}~}|xw{}}vuwy{}y{{wvwy~{{zy{~~}~|xuvyxvu}~{|}}~}{{zy{}~}ytsy}xy~{x{~yv{{yxvuw{yz}|ywwx{~|}zx|zyyxvx|xwy~}||}~vsux{|~~zwy{~~{wuy}{wz}~|z{{z|{wwz}zvx~}}~~|{ywz~~|z{~ywz~|z|zuqt~~{}}}~{z{{|}z|~~~}}}}}}~{zz{|}~}zutx}||~zxwz~|z|z{~xwwvvz~~}}}{yz}~~}y{}|y|}|}{z}~|z{|{{~vrv{~~ytvxzz~~}{wx|}}{uuxzz{zz~~~}}}}~|{xwy|~zvwyxw{}z{}zy|~|}~}~~zz}|xwzzz{~{yz}|zz{~~xwz~}|zwuv~}|zxy{}yvwzzyz|~~~zyzzy{~}||{xz}}~yxvuw~xx|~yyyz}}zy{~~{}yssvwvw~~{{~~}||{yz}~~zvxzwy}zxyz~zuw|~{xuxzvvxz|~~|{}}~|yy{yww~}{|~|}{vuttw|y|{z{}|yxz}|wx|}~~}|~~{{}zyz|~vuy~|}~}|}|vvz}zxz|~xvz}}zy{|yvx}}z{~~|zyz~zx{}}|~z{~~~~~}}}~}|zttuwz}{}~~}{|}}~{yz{}~|~{zywuv}~}~~ywyz{~|}~}|z|~|{wx}~|yzzz{~ysuy||xuuvvx~~|yy{~}{|}}~{utvwx|||||~{yz{}{vvwwwyyx{zxy}~}}}|xy}{vvxyy{yvx{~|zx|~zz{{|{|~|yw{}yxz|zvvwxy{}~~|{{zyy}~{{|}|{}~|~|{yvtw}yy}~|||}~~}z{}~~zzwsstuw}|{}~~|{|{zz|~~}~}}{|}zy{}zxwz|wwz}{xy}vtvy|~||~~zwwyyww}~~~}yy}ywurt{~zz~}}~}~}|{|}~{xx{}~}{}~}}~}|zz{|~zvxz}|z{}}|}yvw{|yxyz{wx{}}yxy{{z||z}~}zy{~}xx{|}~~}~}y{~}|~}zxzyuuuux||~}}}|}~}{zyy{~~}z{{xuw~}|~|xwwy|}{wx{~~~~ywy~}zyyyz}ywxyzxvvvuuy}{{|~{z{{|~}xuttv}~~|||}~}}}~~~|}|wvvvuy}yy}|yxz~~|~}xvz}|xuvvwyxvw{~{y{~}~}zwvz}}{|{xxz}}xvuvy|~~|y{~}}{yz}~}yy|~}|zy}||{yvy}|}~~~~~~{xy}{xvsru}~~~{yz{z{|}|{~~|}~~~}||}}{xwzzz{|{zz~}}|vuwz~~~~}~{{|wvwwwy~}}}}}yvy|{xusw}{|}||}~}{xvx{||yxz|}}{yz|}~|{{zxvxz||~~~}zyy||zxxz~yz||{wvxyy{||}~~~~~|{|}{xx{}}{z{||}|{~~~}zz}~xtw}zxwutw}}~|}}|{zzzyy{{z{{yy}{|~zwvx|~~xuwy{}~~|yy{|zyxy|~||{zxutvvuuy~}~~~{yyy{~~~{xtsw{z}}zxz}}zx{|xwvuw~}{|~|yyz|~~ywy{}{xvuuux|xwy}|||}~~zutvz|}|yy{}{xvvy|~}ywz~~~|{~}|~{xy||xvx}}}}{yz~}{{~~}}{xx{~}{zvssy|yyyy{}}~~}zy|}}}}~~~}zxy{}|}}{xwy}~{xwy|~}{|~|{~}yvvvvx}}{zz|~{wx{~~}|{xvx}~~~|{{|}~|wtvz||yvwz{||yy{}~~~}}~~{wtuwyz}|~}|{{}|{yy|~|||{wvvxxy~~||~}}~~~}}~~~|xxz{{zxyz{|~~~|{}}yyz|}wtv{~|zxvvz~|{}|yxyyyy{~{z{zz|||~~~zwxz}~zwvvwz}{}|{{}}{yy{}~|}~{vssuuux~~~~|zyxx{~~~~{wuyzy{{wwy|~zvx}}zwvx~}zyy{|~|yz{{zwvvutu{~{zz}~~~}zuttvy}{{|~~{xxy{}~{wwz}}}~~~~~}~{yy{~~xtvz}~~}}}||~}ywz~}z{}{wwz|~}{||{xwz~|zyxz|~~}{wwz~}|}}|}}{}~||{|}~~~~yvvxz~~}~|{{}~~~}{z{|~}~~{yxvuw|}ywxz{~zzz{{z{}}{z|~|||zzz{}zutwz{yvvwxz~{yz|~}|{{|}~{ustuw{~}~~}~}|{|}|xuvvwy~}z{~~{{}~~~|ywxz{zwuwxy{}yxz}~{yxz~~xvwy{{{||zyz~}z{}~ywwxy{|}}~}|{z|}}~}|}~}{zz|}}||}zxwuw}|{~~~~~|{{|~~|{}~ytsstuy~|{zyxxz|}~~~~}zz}{y{~{xvwz}xwy}~|yy~zxxz|~|{{|{yvuvuuuz~}}}~~|zz~zwustw~~~}~~|{z{|{ywwz|}||}~~|zzz{~~wuwy{{z|}}|~|xwz~|zz|~ywx{||zz||{{}~~|zyy{}~}{wuw{~~|||}|}{{~~~~~~}||{z{}{xvvwz}~~}}}}~}{zyz|~{zyxvw|~|xwwy||||{zxxz|||~|{}~{yyz{~~xvwyyxvvvvx|}{{|}~{yyz{}~~yusstw~}}~~~~~~zwvvvw{}{||z{}~~~zwwy{zxutvwy|}xxy|~|zyz}}yxxxxwy{||{~|z{}{xwwy{}~~~|{}~}|{}~}~~|z{~~}{{{zyz}~{zyww{~|}~}}~~}{y{~}yvtstw~}{yyyxyz|}~||~~}}~~~}{{}}zwvw{~zyz{||}}}}yxy{~}|}~}zwuuuuvz~~}|}}}~~ywy}~{xvttw~~}}~}|zxwwxz{zyz{|}~{zz{|}~{yxxwwwy{|}~zxy{~{zz{|yzz{yxyz{|~~~|{{{|}}{wuvxz{zz{||}|||{{}}zwvy}~{yxww{~}|{{zyyz||{{zyy|~|}}ywvx{}}~~{wvvxz}|{}~{zyz||zzyxvuvvvwz~}}~~|zxwxz}~}}zwtsu{~}~}{z{}~|{{~zxwvw{}}~|{{|{wwyzywuttuw|zxxz~~|{{|~}{{{yvtux{|}{{}}zxwy{}~}{yy|~~~~|yyz}~{xvux}~}|{yy{~~~|yxy}~{ywttw}~{yyxyz{{||{z{~}}}}~~}~}{xwxz~}|||{zy{~}zyz|~~}~~|}~~|xvuuuwz~|{zz|}~zwx{~}|zxvux~~}||}~}zwuvyzzyxyz{}}zz{|}}}~~~|{zxvtuwy{~{zz{~~|{z||{{{ywwxz{}~~}|||}|zxuvwxyxyz{{}~~~}}}{z{}|xuuy}}{zxxz~}{zyyyz{}}|{{z{~|||ywwy{~~~}yvvvx{~~}}~}{zz{}~}}|yvtuvvwz~~|zxwwx{~~}~~|zxuuy~||~|zxy|~}zy{~{ywwz~|{{|}}zxxyyxvttstw~|zy{}~}}||}~~}|}}|yustvy|~||}|zxyz|}}zxy{~~~~|yxy|}yutvy|~}}}|{{}}{|~~}~}zwxz}~~||{xww{~{yyyyz{{zywx{~}|||}~~}}{yyy{}~~}~~|zxxz}~|{|~~}||}~~}zxwvuvz~}zxxy{~}zxyz{{{{{zxy|~|{{|~{vuvyzywwwyz}}{{{|~~}||||}~~~}zvsstvy~~}||}~~}||}~}zwvwxz}~~~~~~~~|zwvvwwvuvwyz||zz{~}zyz|zvuvy{||}|{z{~}}}zxxyz{}~~~~}|{|}}~~{zyyz||||~|ywvvx}}}}|||}~~~}}}yuttuwz~~|zywwwx{}}}~~}}|zyz}}{|~{xwxz~{xy|}{z|~{z{|~~{zzzywuutttw}~|||}~~}|zz{}}zvtstv{~~}{{{{|{yxy{}}|}~~{yyy{~~yutvxyz{|}|}~{yz}||}{xxy{||{||{z{}~|{yyz{{{ywuvy|~}||||}}|}~~}|{zzz{{|~|ywxy|~}}~~~}{{|}~{yxwvw{{xvwy|}{zzzyxyz{{{|~~|zz{}|wvwxyxwwwxz~~|||}~~}{zyz{}~~~~{vtssuy~}}}~~~~~}ywwwx{~~~}~~{xvvwwvttuwy{~zyy{|zyz}|xvvwxyz{|||}}}~|yxxy{}}~~}||~~}|}~}~~}}}~}{zyyyyy|}zywvw{~}~~~}}}}||||xvuuvy~}{yxwwxy{}~~||}~}|}}||}}||~~zxwxz~}zyz|}~~}~}zz{}|{{{zxvuuttvy~~}||}}~}zxxz}~}zwutsv{~}{{zyxxy{{{{{}~}{zyz{}{wvvvvvxz{|~}zy{~~|{|~{yyzzzz{||}~~}{{{{{{zxutuxz{{{{||~~}}~||}~~~}|zywwz}}{yxxz~~}}|{{{|~}{zyxy{~}~|ywvwz}}||{zxvwyz|~~|{z{}}zxxxwvvwwxz~}}~~~}{yxxy{}~}}}ywtstx~~}|{|}~~}}~|yxwwz~}~|ywvwwvtsstvy~~zyy{~~|{z{|~~{yyxwuuwz|}~}}~|yxxz|}~}|zz|~~|zz|~~|zwuux{~}|{zyxz~}|zyz}~|ywvux}~|zxxxxxyz{{z{|~~||||}~}}~{xwxz}|{{{{z{~|{{|~~~}||}{ywvuuuw{~}{zzz|~~zxwy{}}{yxvuv{~~}{ywwxz{zyyz{}}{zzz{|}~|zxwuttuxz}}{z{}~||}~{{zzyxy{|~~}||||{zwutuvxyyz{{|~~~~~}{{{}~}zwuvx|~~}{zyy{}|{{{{{}~~|{zz{}~}}~{xwwx{}~}}}|zxvvwy|~~|{{}}|{yxvvvwxy|~|zxwwwz}}|}~|zxvuvy~~~}{zz|~~|{{~|zyxy}~~~~~{xwxxwussstv{}zyy{~~}||||}~}|{zzxutuwy|~}~|zyz{|}}{zy{}~|zyz|~|xutux{|}||{zz|~}~}zyy{~~}|zxwx|}{yxxxyyyxxxy{}~}|{{|}~~~~~}{yxyz|~}}}|{zy{}}||}~}~~}}}{ywvvvwz}}{yxxz}}zxwxz{{{zywwy|~}}~|yvvxzzyxxyz|}|{{{|||||}}~~~}|{ywtssuw{}{{|~~}}~}}{yxxyz}~~~~}|{yvttuuvvwyz{}~|{{}~|zz{}~|xutvy{||||{{|}{zz{{}~~~~}|{|~}|}}zyxxyz{|||}~}{xwvwx|~~||}~~~~}|yvuuvxz}~|zxwvvxz}~||}~~}}|{yxy{}}}~|yxxz}}zy{~~|{{~~}}~~|zyyyxvtssstx~|{{{|~~~}||{{{{||{xuttux}~|{{{||{zyz{|}}}}{yyy|~|xttuvxyz{|||~~|{|~~}~|yxy{|}}}}|{{}}{zyzzyyxvuvx{}}|{{{|~~}}~|{zzzz{||}~~}zyyz|~}~~}}}}~|zyxwwy|~|ywvwz}~{yxxyyyz{zzz|~~||}~}ywvxyyyxxyz}~}|||||{zzz{}~~}}}}{wtsstw|~}}}}~~~~}{xxxy{~}{yvuuuuttuwy{~|zy{}~|zzz||xvuvwyz{|||}|zyz{|}~~~~}}~~}}~}}~~~~}|zyxxxxy{}~}{yxwwx|~~~}}~~}}~~~}zwvuvx{~|zxwvvxy{}~~|||}}}||||{{|~~~}|}|yxxz||zz{}~~}}|}~}{zzzywuttstw{~||{||}~~}|{yyz|}|zwuttvz}|{{{zyyyz{{{|}~|zyyz|~zwutuuvwy{|}}{z|~}}~~{yyz{||}}}}}~|{{{zzyxvttux{|{{{{|}~}~~}~~~~}|{zyyyy{}~~|zyyz}~~~~~}|}}}{zyyxy|~}zwvwy{~}{zyyxwxyz{|}~|||~~zxwxxxxxxyz}~}}}}|{yxxy{}~}|}~~|zwussuy~}||}~~~~~{yxxz}~}{xvvvutsssux{}zyy{~}{zz{}~}zwvvvvwy{|~|zyz|}~~~}{{|~~~~|{|}~|zxwuuwz|}}{zyxxz}~}|{|}~|ywvvy|}{yxwwwxyz{{{|}}}|{{||}~}}~~{yxxz|}{{{{{|~}|}~|{{{zxwvuuuwz}}{zzz{}~~{ywwy{||zxvuux|~|zyxxyz{zzz{|~}{zyyz|}~}zxwvtstuxz}}{z{~~}}~~|{zzzz{|}~}|||{zywtssuwxyz{{|}~~~~~~|||}~~|zxvvx{}~}|{zz{~}}}||}}~}{zzz|~~}}|ywwwy{}~~}|{{zxwvwy{}~||}~|zyxwwwxyz{~~~}|zywwwy|~}|{|}}|zxvuuw{}{{{|~~}||}~|zyz|}{ywwwvusrrtvz~{zyz|~|{{{|}~}|zyxwuuuwz||{z{|}~}|{z{|~~|zz{}~|zwustwz{|{{zyz{~~}{z{|~~}{yxxz}}{zyxxxxxxyyz{}}|{{{{}~}~~|zxyz{}~}||{zz{}}}}~}||{yxwvvvxz|~}{yxyz|~}zxwxy{{{zywwx{~|yxwxzzzzyz{}}{zzz{{|}~~|zyxvtssuw{}{{|~~}}~~}|{zyz{}~~}}}|{zxusstuvwyz{|~~|||~}{{{}~~|ywuuwz|}||{{{}~}||||}~~|{{|~~}}~}{yxxxyz{||||{zxwvwx{}}}~}|{ywvwxyz|~}{ywvvwz|~~}{{||}|{zyxwx{}~~}{yz{}~|z{}~}|{|}{yxxxvussrsvz}{zz{|~~~}||{{{{{{{zxvutuwz~}|{{|}}|{zz{|}}~}{yyz|~~{wtstuwyz{{{{|~}}~}zyz|}~~}}{zz|}|{zyyxxwvvvxz|||{{{{}~}~|{zyyz{||}}}|{zyz|~}~~~~~}|zyxxxxy|}~~~{xwwx{}~|yxwxxyzzzzzz{~~~|ywwxzzzyzz{~~}||{{{zzz{}~~}|||{yvtsstw{~|||}~~~}{yyy{}~~}}{ywutttstuwy{~}{z{|~|{z{|~~|yvuuwxz{|}}}~~|{{|}~~~}}~~}}~~}~~}|zyxwwxxy{||{yxwwx{~~~~~~~}{xwvwy{~}{ywvvwy{}~~}|{{||{{{{{z{|}~~}~}zyxz|}{zz|~~~~~~}{yyyxwvttstvz~}|{{{{|}~~~}|{zzyz{{{ywutuwz~}||{|{{zz{{{||}~|zyyz|~~|yvtstuvwy{|}~}||}~~~{zz{|}}~~}}}~}|{{{zyxvutuwy{|{{{{|}~}~~~~~}|{zyyyz{|}}|{zyz|~~~~}{zyyyy{}~~}zxvwxz}~~}{yxxxxxyz{{|}~~}~~{xwxxyyyzz{}~}}||{zyyyz|~}|{{||{yvtssuy~}}|}}~~~}{zyz|~~~~}|{yxxxy{}~~}}|||{||}~~~~~~}||}~~}|{{{{|}}~}|{zz{~}}}~~~~}|{z{|~|yvtstvxyz{|}}{zz|~|{zyz{}~|yxwvusrrsvz~|{zyyz|}~}{yxyz{{zxwwx{~{yxxxxyz{|~~}{zyxwxz|}~}|||{zz{{|~~}|}~~||{{{{{||}}|zzz{~}}}}~~~~~~|zz{|~|yussuwxy{{|}|zyz}~~}|zyz{}~|yxxwusrrsuz~|{zzyz|}~~}{xxy{|{zywvx|}zyyyxxyz{}~~~}{zxwwyz|~~||||{z{{{}~~~}}}~~~}||{{||{|}~}{zzz|~}}}}~~~}~~~|zyy{~~{vstuwwxz{{||zyz|~~~}{yz{||yxxxvtsssuz~||{zyz{}~}{xxz||{zywvy~~}zyyyxyzz{~~~|{yxwwy{}}|}}}{z{{{}~}}~~}}~~~}||{{||{{}|zzzz~}}}}}~~~~~~~}zxx{}|xtsuwwxz{{{|zyz|~~~|zz{|~}yxyywtsssuz~||{yyz{}}~~{xx{}}{zywvy~~|zz{zxyzz{~}|{ywvxz{~}|}~}z{{{{~~}|}~~}}~~|||{{||{{~|{{z{~}}}}}~~}~}}~|ywx{}~|wttvxxy{{z|{yzz}~~|z{||~~|yyzzwttsrt{~~}}|zyy{|}~~{xx{~}{{zwvy~~~}z{{{yy{zz~~~|{yxvwyz}}|}~{z|{{}~~{{~~~}~~~}||{{}}{{}~{{zz|}}}}}}}~}}|}~zwwy|~~~zutvxxwz{zz}}yyz{~}~{{|||~~~|yz{{wttsru|~~}~|yyy{|}}{xy|~~{|zwvy~~~~}{{||yz{zz}~||zxvvyz|~|~|{|{{|~~zz}~}~}~~~~|}|{}}|z}||{z{~}}}}}~~}~}|}~|xvw{}}~~xtuwyxx{{z{{yyz|~}{|||}~~~~{y{|{vuusrv~~~~~~{yxy{||}{xz}}{|zwv{}}~}}||}|y{{zz~|{zxvvyz}}}{{|{{}~}yy}}}~}~~~}|}{|}}{z~~||{z|~}}}}}}}||}~zwvx{~~}|vuvxywy{{z}~}zyzz~}}|{}||~}}}|y{||xuvtrt|~}~~|yxyz{||{xz}~|}{xw{}}~}}|}~|y{|{{~}{zxuvyz~}}{||{{~~~|xy}}}~}~~~}|}{}~}z{~|}{z}~}}}}}~}~~}{|}}xuvz|}}yuvxzxw{{z{~{yzz|~|{}}|}|~~}~z{|}zuvussy~}~~}zyxyz||}xy||}|ywz~|}~}}~}y{|{{~}|zxuwyy~|}{|}{{~~~|wy}~}}~~}~~}}}{}~|z|}}}{z~~}}}|~~~~|{|~|wuwz|}~~xuwyzwy|{z|}~~zyzz~}}~|~||~|~}}|z|}~yvwtst|}}|yxyy{||{xz}~|~|xw|}|}}}~|y||{{~}{zxuwyz~|~{}}{{}~{wy}~|}~~}~~}}}|}~|z|}}}{z}~~}}}|}~~}{|}}xuuy{}}zvwxzww{{z{~}{yzz|||~}|}|}~}z{}~|vwvssw~|~~~zyxyz|{}~yy||}~{xx~|}~~}~{y}|{|~~}{zxuwxz|{}}{{}~zvy|}|~~}}~}}}|~~|y{~~~{z}~~}}~|}~~}{|}}xuuy{~|{vwxzxvz{zz||yzz{}~}}~||||~~}~|z}~yvwust{~}||zxxyz{{}xz}|~}zx{}{~}~zz}|{}~}}{zwvxx{}|~{}|{{}~yvy}~||~~~~}}~}~}|~~{y}}}{z~~~}}~|~}~|{|~|wtuy{}}zwxyzww{{z{}|{y{z|}|~~|}|}}}{{}}wxwtsv~~|}{yxxy{z|zy|~|}|yy~~||~~~{z}|{|~~}|{xuxxz~~|{}|{{}~yvx|~||~~~}}~}~~|~~{y|}~{z~~~~}}~|~}~{|}~|wtuy{}}zwxyzvw{zz||}{y{z}~}}}|~~|~}}}z}~{wxvssz~||}zyxxz{z}y{}~|}zx|~}{~}~y|}{{~~}|{zvwxy}~|~{}}{z~~{vwz|{}~}}}}~}~~|y{~~~{z}}~}~|~}~||}~|wtuy{|}yxyyzuw{zz|{}~zz{z}~~~~}}|}|~~|}|{}ywxust|~||{zxxxzz{{y|~}|}zy~~||~|y}|{|~~}|{yvxxz~}|{}|{z~yvx{~{{~~~~|}~}~}~{x|}~{z~}}}~|}{|}~{vtvy{|~yxyzyuwzzz}{}~zz{z}}~}}|~~|~~|}}{}~{wxvssz~|{~}zyxxyzz~}y{}~{~~{y|~~}{}~~y{}|{~~~}|{wwyy|~|}||}{z|}wvy}|{|~~}}}~~~}yy~}}{{}~~}~}|}{|}~{utvx{|~yxyzyuwzzz}{}~zz{z}~}~}}|~|~~|}~{}~{wywtsy~|{~~{yxxyzy}~yz}{~~|y{~~~~{|zz||{}~~~||zwxyz~}{{}|{zzvwz~}{{}~~~|}}~~~|x{~~|z}}~}~}}~}~|}~~yutwx||~yyzzwtxzyz~{}}z{{{~}}~~~}|~}~}|}|{}zxyvst{~{|~}{yxxyyz~|y{}}{~~{y}~~~}{}~~y{|{{~~~}||xxyy|~~{|}|}{z|~xwx|~{z{~~}}}}~~}yy}}}{{}~}~}|}|}~{vtvx{|~yyzzxtwyyy~{}~{{{{}}}~}|~}~}|}|{}zxyvst{~{|~}{yxxyyz~|y{}|{~}{z~|{~~|y{|{|~~~}|zxyyz}~|{~{}|zz{wxz}|zz}~}}}~~{xz~}~~|z~~}~}}|~}~|}~}wtuwy~}}{yzzytuxxy||||{{{}~}~~}|}~}|}|{}zxxvsu|}{|~}{yxxyxz~{y{}~{|~}{{~||~{y|{{}~~}|zxyy{}}{{~{}{z{zwx{}{z{~~~}}}~~~yx|}}{z~~~}}|}|}~{vtvxz|~zzzzwtvxxy~{}~{{{{~}}~~~||~}|~|{~~yxxusu|}{|~}{yxxyxz~{y{}~{|~}{{~||~|y{{{|~~}|{xyyz|}{z~{||zz|wxz}|zz}~}}}}~{xz~}~~|z~}}}|~~~}}~~xuuwx}}}|yzzyutwxxz}|}||{|~}}~~~||~}|{|~}yyxusv}}{|~}{yxxxxz~{y{}~{{~}{{~||~|y{{z|~}}{xyyz|}{z}|||zz~}xxz||zz|~~}}}}~~|xy|}~~|z|~~~}|}}}~{wuvwz~}~zzzzwsuwwx}|}|||{}}|~}|~~|}~{|~|xywutx~|{}~}{yxxxx{~zz|}}z|}|{}~~||~{y{zz}~~}}zyzyz||zz~~{|{zz|xxz|{yz}~}}}}~~{wy}}~~|z~}~}|~~~~}yvuwx|~}}z{zyutvwwz}|~}|}||~|}~~||||{|~}yyxutw}~}{|~~|zxwxwz}zz{}}z{}|{}~~||~{z{zz}~~}}{yzyz||yz}~||{yz|xy{|zyz}~}}}}~~~~zwz}~}~}{{~~~}|}~}~}xvvwy}~}~{z{zwsuvvx}|}}}}|}}|}~}|}|~}{}~~zyyvtv{~~~{|~}{yxwwy}~{z{|}z{}|{|~}|~{z{zz}~~}}{yzyz|{yz~~||{y{{yy{|zyz}~}}}}~~}ywz}~}~}{{~~}||}~{wvwwz~~~}~z{{zvsuvvy~|~~}}||~}|}~||}|||}}yyxvtw}~}{|~~|zxwwwz}zz{}|z{}|{~~}}~{z{zz~~~}}zzzyz{{yz~}||zy{{yy{|yyz}~}}}}~~~ywz}}}~}{{~~||}~~~}xvvwy}~}~{{{zwstuvw||}}}}|}}|}~}|}|~}{}~~zyywuu{~~|{}~~{zxwwx{}}z{|}{z|}||~~}}~~zzzz{~~}|zzzz{{zxz~}||zy||yz{{yxz}~}}}}~~~ywz}}}~}{|~~}|}~~~~yvvwx|~}~|{{{xttuuv{}}~}~}}~|}}~|}~|}||}~|yyxvux}~~}{|~}{yxwwy|~{z{||yz|||~~~}~~}zzzz|~~}|z{zz{{yx{~|||zy}{zz|{xx{}~~}}|}~~}xxz}~|}~}{}~||}~}ywwwy|}}~~{{{{wstuuw}|}~~~}~}|}}~}|}|}~|}~~{yyxvvz}~~|{}~~|zxwvwz}}z{||zy{|||~}}~zzzyz~~}}{{{z{{ywy}}||zy||zz{{xxz}~}}|}}~}yxz|}||~}{}~||}~}ywwwy|}~}~{{|zwsttuw}|~~~~}~}|}~~}}}|~}|}~|zzywux|~~~||}~~|zxwvx{}{z{|{yz|||~~~}~~|zzzz}~~~}{{{zz{zxx|}||{y{~{z{{yxy|}~}||}}~zwy|}||~}||~||}~}ywwwy|}~~~}{{|zvsttux~}~~~~~~}|}~~}}|}||}~|yzyvvy}~~}||}}{yxwwy|~}zz{|zy{|||~~~~{zzyz~~}}{{{z{zywy}}||zy|}{{|zxxz|~~}||}}}yxz|}||~}|}~|}~|ywwwy|}~~~}{||zvtttux~}~~~~~}||}~~}}}|~}|}~|zzywvx|~~~||}~~|zxwvx{}~{z{|{yz{||~~~~~}zzyz|~~}|{|{z{yww{~~||{zz|{{{yxx{}~}|||}~{xxz||{}}||~|}~~~|yxxxz|}~~~}{||zvttttx~}~~~~~}||}~~}}}}|~}|}~|zzywvx|~}~~||}~}{ywvwz||z{|{yy{{|~~~~~~~{zzy{~~}}|||{{zxwx|}||zz|~|{|zxwy|}~}|||}~zxy{|{{}}|}}|~~~~{yxxxz|}~~~|{||yutttuy~}~~~}||}~}}}~|}~}|}}{zzywwz}}}~~||}~~|zxwvxz|~{z{|zxy{{|}~~~~}{zyy|~~}|||{{{ywvy}~||{zz}||{ywxz|~}}|||}|xxz{{{|}||~|}~~~|yxxxz{|~~|{||zvttstx}~}||}~}}}~|}~}}}}{zzyxwz}}}~~||}~~}zxwvxz|}{{{|zxy{{|}~~~|{zyz~~~}|||{{zxvw{~~}||{z|}||zxwy{}~}|||}~zxy{{z{}}|~}}~~~~~{yxxy{|}~~}{||{wttstv}}~}||}}~}}~~}|~}}}}{zzyxwz}}}~~||}~}zxwvxz|}{{{{yxz{{}~}~~|{zyz~~}}|}|{{zwvx{~~|||zz~~}||ywwy{}~}|||}}yxy{{z|}||~}}~}~}zyxxy{|}~|{||zvttstx~~}||}~}}~~|}}}}}{zzyxx{}}}~~|}}~}zxwvxz|~}{{{{yxyz{}~}~~|{zyz~~~}|}|{{zxvwz}~|||{z|}}|zxwx{|~}||||~~zxyz{z{|}|~}}~~~}|zyxyz{|~}{||{xutssu{~~~}||}~~|}~~|}}}}|zzzyxy|~}}~|}}~}{xwwxz|~~|{{{{yxyz{}~}~}{zyz~~~}|}}|{zxvvy|}|||{z|~}}{xwxz|~}}|||~|yyzzzz|||}~}~~~~}~}{yyxy{{|~~|{||{wutstw}~~~|||}~}|~}|}}}}|zzzyxz}~}}}|}}~}zxwwyz|~~|{{|{yxyz{~~~~}{zy{~}}}}}|{zwuwz|}|||{{}~}}zwwxz|~}||||~{yyzzyz|||~~}~~~}|zzyyz{{}~}{|}|yvutsuy~~~}|||}~~|}~|}~~}}|zzzyxz}~}}~~}}}}{ywwxy{}}|{{|{yxyz{~~}}|zy{~}}}}}|{zwuwz|}|||{{}~~}zwwxz|~}||||~~zyyzzy{||}~~~}}~|zyyyz{|}~|{||{wutssw|~~~}|||}~||~}}~}}}{zzzyy|~~}~}}}~~|zxwxy{}}|{{|{yxyz{}}}|{z{~}}}}}|{zwuwz|||||{{~~~}zwwxz|~}||||~zyyzyy{||}~~~~}~}{zyyzz{|}~}{{||zwutstx~~~~|||}~~||}}~~}}|zzzyyz}~~}~~}}}~}{ywwxy{}}{{{|{yxyz{~~~}|zz{~}}}~}|{ywuwz|||}|{{~~}zwwxz|~}||{|~zyyzyyz||}~~~~}}~|{zyyz{{}~}|{|}{xvtssv|~}|||}~|{}}}~~}}{zzzyy|~~}}~}}}~}{xwwxz{}|{{{{zxxyz|~~}|zz|~}}}~}|{yvuwz{||}|{|~}zwwxz|~}||{|~zyyzyyz||}~~~}}~~|{zyyzz{|~}|{|}|yvutsuz~~|||}~}{|~}}~~}|zzzzy{}~~}~~}}}~~|zxwxyz||{z{|{yxxyz}~~~}{zz~~~}}~~}|{xvuwz{{|}|{}~|ywwxz}~}|{{}}zyyyyyz||~~~~}}~~|{zyzzz{|~~}{{|}{xvuttv|~~}|||}~|{}~}}~}{zzzzz|~~}}~~~}}}}{yxxxyz|{z{{{zxxyy{~~~|{z|~}}~~~}{yvuvy{{|}||}}zwvxy|~~}|{{|~{zzyxxz{|~~~}}~~|{zzzzz{|~~}{{|}{xvuttw|~~}|||}~~|{}}}~~~|zzzzz{~~}}~~~}}~~}{yxxxy{{{z{|{yxxyz}~~}{z{~}}}~~}|zwuvxz{{||||~{xvwy{~~~}|{|~~{zzyyxz{|}~~}}~~}|{zzzz{|~~|{{||{xvuttw|~~}|||}~~{{}}}~~}|zzzzz|~~}~~~~}}~~|zxxxxz{{zz{{zxxxy{~~~}{z|~}}~~~}|yvuvxz{{|||}}zwvwy|~~}|{{|~~{zzyxxz{|~~}{{yzzyyz{yzzzzz{zxvvwwxxyzz{~~~}}}~}}}}|zzzy{}~~~~}zywwx{}||{zyz{}~{zz}~|{z{zyxvvy{}}}||{z|}~~}~~}||{yxy{{{zzzz{||z{||}~|||~~|{zyxxwwvuuuttwxwwz~}{z{|}|{}|}~}}}|~}||}|yy{zzyxwvuwzz{{{yy{|}zy{|}}~}}}~}}}|{{}~~~~}|}~~~~|{{||}~}~}||{{}~~~|{yz{zyxyxyyy{|~~~~~|{zzyyxvsqqssrtuuuw}}~|z{{{{|}}~~~}}|}~}{zzywvuvvtuwz{{zxyyy{|}}|zzzyywvuvwxz{}~}|{zyzzxvsrsuvwxyyyz}}|}~}{{{{ywwvvussqpppqqrpppty||{||{{|}}~}}~~}|{{}}||{xxxyyvuuvwy|~~~~~~~~}{{}~}}}|zxwuuuvwyxvvxz||{||{{zz|}{{{z{{{}~}}}|{zwvvvvutstttvvwwxz}~|~}|zxwuutrqpppstttuxzyxxyxwvxyzzzzyyxwvvxxxvvwvutuussssrrsvwxzyyyz}~}}}~{{{|zxvuussssrrrqsrppruwwutuuuuvxzzz|~~~~~|{|{zyz{zzzzyxvwyz|{zzy{~~~}|||{zyxwuttuvwxxzxvvx|}}{z{{{{|}~}||{|||||}{yxxyxwuuvvxxyxvuuvxzywwxz}}|}}|{{zywuutsssstrooptvwutuutvy|~}{{zyyyyzzywvwyywvvvuuuvutrsttvvuvwz}}{yywvvwutuvwvuuuttuuusqqruxyywxxwwy{}}||{zzz{}}{yxxz||{{}|{{{|zyxz{|{z|}~}}|}}|zzyyxvvvuuutuusstwy{|{}}||}~~}|{{{|~~|zzzzxwvxwvvutsrrtuvvuvy}~}|{z{}~|||{zwwvuuutssqqrtwxxwvwwvwyzzywwuvvvxz{zzyz{zwvwxwwvvuttvwxywvx{~~|{ywvvwvvvvvtrqrrssqrqpqswz{{zyyyyz|}~||{{}}}~}|z{|{zwwwxxxyxwvwy{~}{|~~}}}|||{{{{yxvvvwyxwvuttvz}}|{yyxxz|||{yyz}~}{||{xwvwwwxxwvuuvxywvx{|}}~|{{zzzywyxxvsssuvuuutrstxzz{xwxwwy{||zwwwxxy||zxwwwvvtsuuuvwwxwwyzzyx{~~~{yxxwvwuvwwwussuvvtssrqrtwxyxvvwvwy{~}||}~~~}|{zyywxzyyyyyyxy{{zxy|}{zyxwyxwxxyxvvxz{zxwwvvxz|}}{z{{z{|}~|{z{|}}~}|{yywvuuxyxxyxxvwyyyxwz}~~}{zyxyzyyzzyvtuvwxtsrqqrtwyywvwyyyz|}{yyxyz{{}|{{zyxwutuvwvwwwutvwxxwy|~}{ywvussuuwxyywtuwyyvttsstvy{{yxwyxxz{}}{zy{}}}~|}||{zyxxzzz{{zyxzz{|{|~}{zzywwxxxyzzxuvwyzxvvuuvx{~~}{{|{z|}~|{{|~}}{zxwvtuvvuvwvvtvvwyy|~|zyyzxxyyz{{{xuvxyyvtutstvxzzywxyxwxy{zwwwxz{|~~|}{zxwvuvwwwxxxxvwxyzz|~~~}zxvvvtsuuvwxwustvwwusuutuwz{{zyy{zyz{}~|{{|~~~}}|{xwwvvxyxyzzzyz{|}}}~~}{yyywvxxyz{{yvwz{|zwxxwwx{||{yyz{yyz|}|||}~~{yvvutwxwwxxxuuwxz{|~~~}zyxxwtuwwyzzxutwz{zwvwvvvxz{zywy{yxyz{{yyyz|||~|{{ywuutstwwwyzzxvxy{}~~}~}zxwvvtrtvwyzywtuxyzxuvvuuuvyzyxwz{yy{}~~}}}~~~}{yxxwvxyxy{|{xxyz|~~~}~~|ywwwvtsvwx{}{ywz|}~|zzzzzy{}}|zz||yy{|~~}||~~~~}{xwvvvuwxwxzzxvvwy|~~|zyxxwutwxy{{ywvxz{{xvwwwvuxzzyyz|{xyz{}}|{{|}}~}|zxwuuutvvvwzywuuwy}|}}zxvvuttrsvxy{{ywwz{||xwxyxwwyzzyxz|zyzz|~}}||~~~~~|{yxxwxyyy|}|ywy{}~~~}~{zyywwutvxy{|{ywx{|}{xyzzyyz|}|{{}}zz{|~~}}~~~}{ywvuutuvuxzywttwz~~}~}zzyyxwvtuxy{}|zxx{|~}zxzzxwvyzzyxz{yxxy|~}|{|~~~}{zxwvvuuvvx{{yvtwz~|}}yxwvuttrsuwx{{ywvy{}~{yz|zxwy{{zz|}{zz{~}}~~}|zywwwwvwwy}~|yvy|~}~~~||~{zzyxvvuuwy{}}{zy{}|z{}{ywx{{zz|}{yz{~~}}{zxvvwvuuvx{{yvtwz~}~~}~~~|xxyxvuutuwxz||{zy|~}z|}{xvx{zzz|}{yyz~~||}}}~{yxwuuwvuvwy||yvux|}}~|}~}}{xwxxuttstvxz||{zx{}}z{|zwuwzzz{|}{{}~}{{ywwyxvvxz}}zwux}}|}~~|}~||~~}}|xxyywuuuuwy{}~}}{||}}ywx{{{||~~{z{~~|}~}|zzywvxxuuwy{|zwuv{}{}~~~}~}}zxyzxvuvuvxz{}}|zy|~{z||xvux{z{|~}z{}}}~}~|yyxwuwxvtuxz{zxuty~{{|}}~~|||{z{yvvxxutuuuvxz|}~}z|}~|xuvyz{|||{}}~~~|z{zxxzzwvy{|}|yvx}|zz{}|z}~~}}}|||yxy{xvuvwvwz{}~}{~~}yvx{|}}~|{~}~}~~zyzxvvxwttwyz{ywux{yz{}~|~}||{{{yxz{yvuwwvxz{}|{~}}}zvtvz{{{|~zz|}|}}}}zyyxwwxwuuyz{{ywuy~{yz{~{z}}|{zyyywwyyvtuvuuwyz}||~zwux{|}}}~~~~|yzzxxyzxvx{||{zxw~{xwx{~~|yz~}{{{z{zyz{zwvwxwwz{}}}xvvz}}}~~}~~~~}zyzyxxyxuvyzzzywvy}yxxz~~{z~~|zzzzzyyzzwuvxwvxz|}}}yutw|}|}~|}}|||}|zxyyxxyywvxzzzzywy{yx{~~|z}~{yyxxyxxzzwuvwwvwz{~~zvtv|~}~~~~~}{yzzzzz{xxz{{zzzxz~yvvx|}{{|}zx{~~{xxxxzzz{{xvwyxwy{}~zwtw}~~}|}}|zyyzzzzyxwyzzzzzx{~}}yvvy}}||~{y|~zxxxyz{{{zxvwywwyz}}|xusw}~~}{{||{yxxzzyyywwxyyyzzy}~~~zww{~~||}{y}}ywwvwyzzzywvwxwwxz}}{xusv}~||}||{zz||{zzyyzzzz||{~~~}|~}yuuy||yyz}~}ywz~~ywwwx{||{{ywxyxxxz~}{wtu}|{|{{zyx{|{zzzyyyxyz{|}~}|{|}zvtw{}~zy{}}yz~{wwwwz|}|{zyxyyxxy}~|zwtsy~|{{zz{zxz}|zzzzyxxxz{|~~}||~}yvw{}{xy|~{y|}xvvuwz|{yyxwwxxxxz~|{yvsu}{{{zz{yy|~|zz|{zyyz|}}{z{}{vux{}}yxy|~~|yy}{wvwwz}|{{zyxyyyy}}{yvsw~~|{zyz{yz}~|z{|zxxwx{}~}|zy{}yuuxz||wwz}~~|yy}zwvvwz~~{{{zxxyyxy}{zxusx~}zzxxzzyz~~|z{}zxxxy|~~|zz|}yvwz|~zwx{}~~|yz~~xvuuw{~}zzzywxyyxz}zyvtuz|{zyz{{z}~{{}|zxwx{}~~zyz|{wuwy|~|wvx{}}}{y{{wvuwy}|z{{yxyzyy~{zxutw~~{zxxz{z|}{}}{xwwy|}~}|zxxz|yvvxz|}xvwz|}}|yz~~ywvwz~~|||zxxzyy||zyvtv{{yxwy{{{~~{|}|xvvx{~~~{yyz|{wwyz|}yvwz|}~}{z}~~yvuvx|~{{|zxxyyy||yxvuv{|zxxz||}|}~|yvwy|~~~~{xxy{zwwxz{~~{xuvy{|}|zy|~~zwvwy}~|{|{xxzzy}|yxvvw{{yvwy{|}~{|}{wuvy|~~~~~ywxy{zxwxz{}zwuw{|}}}{z~}zwvx|}|}{xxzzz~{xvuvw|~zwvwy|}~|}}{vuvy}~}}~~yxxy{{yxyz|{ywuwz{|}}{z~~~~~}yvvx{~|{|zxxzz{~{wvvwx}{wvwz|~}~~{wuwz~~}}~ywwxzzyxxy{~zxvuwzz|}}|z}}~~~~~{xwx|}|}|yyz{|~|xvvwx{|wuvy{~}}}{wtux}||}~zwwxy{zyxxz~{ywvwy{|}~}{}}~~~~|ywwz~}|||yxz{{~~xvuwxz}xuuwz~~~|yuuw{|{|~}xwwy{|{yxy||ywvvxz{|}~|{~{|~}}}~{xwz}}|}{yxz{}{vuwxy}{wuwy|~}{wuvy~{{}{wwwx{|yxxz}~zwvvwxy{|~}{|}{~~}}~~{xy{}}}{yy{}zvvwyz~zuuwz}~|yvtvz}z{}~zwwwy||zxx{~ywwwxyz{}~~|}}|~}}~~zxy|}}|{yy{}yuvxyz~xuuwz~}{xutw{}{|~}ywwxz}|yxx{|xvwwxyz{}~}|~}zz~}{|~}zy{~}}|zyy|~}wuwyz}|wuwy}~{wuuy~zz|~|xvwx{}{xwy}~yvvwwxyz{}~}}~~|z|~|{}|z{}~}}{zy{~zuvyz|xuuwz}{xutw||y{~~|ywvwy}|ywx|{wvwxxyz{}~~~~}z{|{|~{{}~}|{yz}{uuwy{~zuuwz~~{xutv{~}z{~}{xwwy}~{xy||wvwxxxy{}~~~~|z{|z{~~|{|~~||{yz}{vuxz|zvuwz|yvtv|}~}zz}}|{xvwx|}{xx{{wuwxxxyz|~}}{yz~|{|~}~~}||z{{vuy{}yvvx{~zwutw}}|}~|yz~}|{xvwy}}zxy}~zvvxyxxy{}}}{z{~{{|~}}||{z|~yuvy|~~xuvx|}yvuux}|}|z|~||{xwwz~~{yz~}yvvyzxxy{}~||zz{~zz|~~~~~}{||z|~yvvz}~yvvy}}xvuuy|z|~~|z{}||{ywwz}}zxz}~|yvvxzxwyz|~~{{yyz~~{z|~||||}~zvwz}~zwwy|~yvuux|y{}}|z{~~|||zwwy|~|yz}|zwvxzyxxz|~|{zz{}|z|~~||}||~{wvy|~{xwx{zvuuw}zz}~}|{}||||ywy{~}{z|}{ywxzzxxy{}}{zyz{~}zz|~~~}||||~|ywwz~}zxxz~~yvuvz|y{}}}||~{||zxwy|}|z{}~|yxwxyxwwy{~|zxyz{|z|~}|}}~|yxy|~|yxx{}wuuw|zxz|||{||{||zxxz|}|z{~}{yxxzzyxxz|{yyy{||{|}|}}~}zxxy}~}{yxy|{vuux~zy{||||}|{|}zxy{}}|{||zyxyzzyxxz|}zxyz{|~{{}~~}||}~~|zxy{}|{yy{~yuuw{}yy{|||}}{{||yxy{}}||~~{yyxyzyxwy{~|yxyz{~}{|~~~}|}~}zyyz~~|{zyz}{vtvz~yxz{{|}~~|{||{yy{|}||~~{zzyzzzxxxz}}yxyz{}~||~}|}~~}zyyz}}{{{zz}|wtvy{xy{{}~~~~|||}|zz{|}}}~{zzzzzzyxxz|}ywxz{|~||~~~~~}|}~~|zzz{}}{{|{{}|wuvz{yyz{}~~}~~|{|}|zzz{|}~~{yzzzzyxwxy|}ywyz{|}}~~~~~}}}}{yz{|~|z{|||~zvtw|~zxxz{}}|}}|||}|zzz{|~}zz{{{zyxwxz~|xwy{|}~~~~~}}}~{yyz|}~{y{|}}~yvux~}zxxz|~|{||||}}|{{z{}~|zz{||zyxwxz~~|xwy{{|~~~~}}}}}~~{yy{}~~zy{}~~~zvuy}zxxy|~{z{||||}}|zzz|}|zz{||zyxwxz~~~~|xwy{|}~~}}|}}~zxy{}~zxz}~~zvux}{ywx{~{yz{|||}}|{zz{}|{z{}}{yxxxz}~~}zxy{|}~~}||}}~{xxz}{xy|{wvw}~|zxwz}}zyz|}}}~~|{zz}}|{z{}~|zyxxx{}}~}{xxy{|}}}||}}~ywy|}yxz~}zwvz~}{ywx{~{xxz|}}}~}|zy{~|{zz|}}{yxxwy}~}}}|zxxz{|~}|{|}~|xwz}|xx{|xvw|~|{ywx{~zwx{|}}}~}{zy|}|{z{|~}{yxxxz~~}}}|zxy{|}~}|{|}{wwz~{xy|{xwy~}|{xwy}|ywx{}}}~~{zz}|{z{|~}{yxxx{||||{yxyz|}~|{{|~~yvx|~yxz~}ywx|}||zwwz~~zwvy|}}}~}zy{}{zz{|~~|yxxxy}~|||{zyxz{|~}|{|}{vwzzxy}~zxwz}||zxvx|{wvw{}}}~~{yz~}{zz{|~}zyxxy||{|{zyyz{}~}{z{}|wvy~{xx{~zxxz}||{ywx||xuvz}~}~~|zz}}{yz{}~}{yxxy||{{{zzyy{|~}{z{||wvy~{xy|~zxx{|{|{ywx|{wuvy}~~~|yz}|zyz{}~{yxxy||zzzzzyy{|~}{z{}|vvzzxy}}yxy}}{{|{xwx}}yvtvz}~~~{yz~{yyz|~}{xxxz~~{zzzzzzz{}|zz{~yvw{~yxz~|yx{|{{|{ywy~|yvtvz}~~~{z{~zxyz}}zxxy{~{yyzzzzz|~|zy{~yvw|~zxz~{yy|~{z{{{ywy~{xutvz}~~{z{}yxxz}}{xxx{~zyyyzzzz{~|zy{~zvw{~zyz~|yy|~{zz{{yxy}|xutux|~|z{~zxxz}~|yxx{~|yxyz{{z{}~}zyz}{wvz{yz}}yx{{zz{{zyy{}yvttw{~~{{}{xxy{~}zxxz}}zxxyz{zz|~~~{yy{~ywx}}zz{~{yz~}zzz{{zyz}{wutux|~|{|}ywxz}~|yxy{~|ywxyz{z{}~}~~{yz||xwz|zz}}zxz{yyz{zyyz~~yvttuy}~|{||ywx{~~|yxy|~{xwxy{{{{~~}~~zyz}{xxz|z{~|yy|~zyyz{zyy{|xvttvz}~|{~{xwy|}{yxz}}zwwxz{{{|~}|~|yy{}yxy}}{{}}zyz|yyzzzzzz}zwutuw{~~}||}ywxz}~|zxy|~|ywwyz{{|~}||~~zyz}{yy{~|{|~{yy~}yxyzzzzz|{wuttvy}}||zwxy|}{yy{}zwvxz{||}~|{}{yz|{yy{~|||~{yy}}zxyzzzz{}|xuttvx|~}}zxwy|}{yy{}zwvxz{||}}{z}{yz|{yz|~||}}zyz~}yxyzzz{|}|wuttvx{~}}~zxwy|~}{yy|~}zwvxz{|}~}{z|{yz}~zz{}}|}~{yx{{xxyyzz{}~zvttuvx|~}}~ywxz}~|{z{~~|zwwx{|}~~|zz}~{z{~|zz|~||}}zxy|{xxyzz{|~~yvttuvx|~}~}ywxz}}|{z{~~|zwvx{|~~~{yy}~{z{~{z{}~||~|yxy}~zxxyyz{}~yuttuvx{~}}}yxxz}}|{{|~|zwvx{|~~{yy|~{z|~{z{}||~|yxy}~{xxxyz{}zvttuvwz}~}~zxxz}~|{{|~~}{xwxz|~~|yx{|{{~~{yz}||}}ywx{|yxyyz{}|wuttuvx{~~}~|yxy{~~}|{|~~}|ywwy{~}zxy}}{{}|zz|~~|}{xwy~~zyxyyz|~~zvttuuvy|~~}~~{xxz|~~}|{|}~}{ywxz|~~|yxz~}{|~~{yz}}|}}zwwz}zxxyyz|}yuttuvwy}~~}~}zyy{}~~~}|||~~}|{ywxz}}{yxz~}||}zy{~~||~|ywx||yxxyy{}|xuttuuwz}~~}|zyy{}~~}|||}~}|zxxy{~|zxx|~||}~{yz|}|}~zwwz~{yxyyz|}zvttuuvw{}~}~~{yyz|}~}}||}~~}|{yxxz}}{yxz~~}|}|yy{}||~{wvx}{yxxyz{~~zwuttuuwy|}}~~|zyz|}}}}||}~~}}|zyyz|~{yxy|~~}}|yyz~}||~{xvx}|yyxyy{~~{xutuuuvy{}}~~|{zz|}}}}||}~}|{zyyy|~~{yxy|~~~}~|yx{~~}||~{wvx}|zyyyz|~}zxuttuuvx{}}~~|{zz||}||||}~}||{zyz|}{xxy|~~~~~~{xy{~|||}~zvvy{yyyyz||ywuttuuvx{|}}|{z{|}||||}~~}}|{{zz{}|zxxz}}}~~}yxy}~|{{|}}xvw{~{yyyyz}}{yvutuuvwxz|~~||{{|||||||}~}||{{zz{}|yxxz}~}}~|yxz}~|z{|~}xvw{{zyyy{~}zxvuttuuvxz|~}||{{||||{||}~}||{{{{|}|yxxz|~}}~|xwy}~{zz{}}yvw{|zyyyz}}zxwuutuuvwy{}~|||||||{{{|}~}||{{{{|}}zxxy|~}}~}ywy|~{yy{}zvvy}{zyyz|~{ywvuuuuvwxz||{||||||{{|}}||{{{|||~~{xxyz}}|}~zwwz~}zxy|~|xvw||zyyy{~|yxvvuuuuvwxz}}{{||}||{{{|}~}|{{||||}}zxxy{~}|~}ywx{~{yxy|{wvy~~|zzyz|{ywvuutuuvwx{~}{{|}}|{{{{|~~}||{||}}~|yxxz|~~||~|xwy|}zxxz}~zwwz~{zyyz}~zxwvuutuvvwy{~|{|}}}|{{{{}}||{{|}}}~{xxyz|}|}~zwwz~|ywx{~|xwx}}{zyz{~{ywvvuuuuvvwy}}{{|}}|{{z{|~~||{{|}}}~|yxxz{~~||~{xwy}}ywwy}}ywx|~|{zz{~}ywvvuutuuvwx|~{{|}}}|{z{|~~}||{|}~~~}zxxy{}}|}|xwx|}zwvx|~zwx{~|{zz{}}ywvvvutuuvvx{~{{|}~}|{zz{~~}|{{|}~~~}zxxy{}}|}{xwx|}yvvx|}zxx|~|{zz{~}ywvvvuuuuvvw{}{z|}~}|{zz{~~}{{{|}~}zxxz{}}|~zwwy}|xuux}|yxy~~|{zz|{xvuvvuuuvvvx||z{|~~}{zz{|~||{|}~~|yxyz{}~||~}ywwz~}zwuvy}~{yy{~}{{{}{wuuvvuuuvvvy}|z{|~~}{zz{}~|{{|}~~{yxyz|}~|}}ywx{}zvuuy~}{yy|~}{{{}zwuuvvuuuvvvx}|z{|~}{zz{}}|{{|}~}{yxyz|}~}}}ywx{~}zwtux}}{yy|~}|{{}{wuuuvuuuvvvx{}{z|~~|{zz|~|{{{}~~|zyyz|}~}}~~ywwz}~zwutw{}{zz{~}||}}yvuuvvuuuvvwz~{z{}~}{zz{~}|{{|~~|zyxy{|~~}}{xwy||yvtux}~|zz{~~|||~{wuuuvuuuvvvx|}{z|~~|{zz|~|{{{}~}{zyyz{}~~}~~zwwz}~{wutvy~}{zz|~}||}~zvttuvuuuvvwy}|{{|~~|{z{}~|{{|}~}{zyyz|}~}}~ywxz~~zvttvz}zzz}~}||}}yvttuuuuuvvwz~|{{}~}|zz|~}|{{}~}|zyyy{|}~}~{xwy||xutux|~{zz|~}}}{wutuuuuuvvwx|}{{|~~}{z{}~}{{|}~|{zyyz{}~~~~}yxx{~}yvttvz~{zz{~~}}|xuttuuvvvvvx{~|{|}}|{{|}|{|}~|{zyyz{}~~~~zxxz~}yvttvy~|zy{~~}}|yvttuuvvvvvx{~|{|}~~|{{|}|{{}~|{zyzz{}~~~~}zxx{~}yvttvy}~{yz|~~~|yvtttuvvvvwx{~|{|}~~}|{{}}|{|}}{zyyzz{}~~~~}yxy||xuttvz~}zyz}~~~{xuttuuvvvvwy|}|{|~~~}|{|~}|{|~}{zyzz{|}~~~{yyz}{wutuw{|zy{~}zwuttuuvvvvxz}}||}~~~}|{|~~}||}~|zyyzz{|}~~~~~{yy{}~zwttuw{|yy{}zwutttuvvvwxz~~}||}~~~}||}}||}|zyyzz{|}~~~~~~{yy{}~{wutuwz~|zyz~}{xvtttuvwvwxz}}||}}~~~}|}~~||}~}zyyzz{|}~~}~~~|zyz}{xutuvy|}zyz}~{yvuttuvwwwwy|~}|}}~~~}}}~~}||}~{yyyz{||}~}}~~~~}{yz|~}zvttvx{~|yy{}zxvtttuvwwwx{~~}|}}}~~~}}}~||}}zyyzz{||}}}}}~~~~|zz{}|xuttvx{~~{yy}|ywutstuvwwwy|~}}}}}~~~}}~~}}}|zyyz{{|}}}}|}~~~~|zz{}~{xutuwy|}zyz~~{ywutttvwwwxz}}}}}}~~~~}}}}}~~{yxyz{||}}}||}~~~}{z{}|yvttvxz}~{yy||zxvtttuvwwxy{~~}}}}}}~~~~~~}}}}zxxz{||}}}|||}~~~~{z{|~}zwutuwy|~|zy{}zxvutttvwwxy{~}}}}~}~~~~~~}~}zxxyz{||}}|{{|}~~~|z{|~}zxutuwy{~|zy{}zxwutttvwxxy{~}}}~~}}~~~~}~}{xxyz{|}}||{{|}}~~{z{|~}zwutuwy{}|zy{}zxwutttuwxxy|~~}}}~~}}~~~~~}zxxy{||}}||{{{|}~}{{{}~|ywuuvxz|~~{zz|~{yxvutttvwxyz}~}}~~~}}~~~~|zxxy{||}||{zz{|}~~|{{|~}zxvuuvxz|~}{z{~}{ywvuttuvwxz{~~}}}~~~}}~~~~|yxxy{|}}||{zzz|}~|{{}|zxvuuvxz|}|{z{~}zywvuttuvwyz|~~}}}~~~}}~~|zxxy{|}}||{zzz{}~|{{}}zxvuuvxz|}~}{z{~}{ywvvutuvwxz{~~}}}~~~}~}zyxyz|}}||{zyy{|~~|{{|~}zxvuuvxz{|}}{z{}~{yxwvuuuuwxz{}~}}}~~}}~~{yxxy{|}||{zyyy{}|{{|~{ywvuvwyz|}~~|{{||zxwvvuuuvwyz|~}}}}~~~}~}zyxyz|}}|{zyyyz|~~|{{|~zxvuuvxy{|}~}{z{}~|yxwvvuuuvxy{}~}}}}~~~~}~~|zyxyz|}}|{zyyyz|~}{z{}}zwvuvwxz{|}~~|{z|~}{yxwvuuuvwxz|~~}|}}~~~~~}{zxxy{|}|{zyyxyz|~|z{|~~{xvuuvwyz{|}~~~}{z{}|zxwvvuuuvwy{}~}||}~~~~~~|zyxyz{|}|{zyxxy{~|{z{}|yvuuvwxz{||}~~}|z{}|zxwvvvuuvwy{}~||||}~~~~}{yyyz{|}|{zyxxyz}}{z{}}ywuuvwxz{{||}~}|z{|}zxwvvvvvvwy{}~|{{|}~~~~~}{zyyz{|}|{zyxxxz}|zz{}|yvuuvwxz{{{||}|{z{}|zxwvvvvvvwy{}~|{{|}~~~~|{zyyz{|||zyxxwxz}~|zz|~{xvuuvxyz{{{||||{z{~~{yxwvvvvvwxz|}{z{|~~~~}|zyyyz{||{zyxwwx{}}{zz|~zwuuuwxyz{{{{||{zz|}zxwvvvvvwwxz}~|zz{|~~}{zzyyz{||{zyxwwxz}}zz{}~zwuuvwxz{{{{{{{{zz|}zxwvvvvwwwxz}~|zz{|~~}{zzyyz{||{zyxwwxz}}zyz|~zwuuuwxyz{{{zzzzzz|~{xwvvvvwwwxz}|zyz|}}|{zzyz{||{zyxwwxy|}{yz|{xutuvxyz{{zzzzzzz||ywvvvvwwwxy|~}zyy{}~~|{zzzzz{||{yxwwwx{~|zz{}}zvuuvwyzz{{zzzyyz{}}zxwvvvwwxxyz}~{yyz{}~~}{{zzzzz{{{zyxwwwy{~{yz|~|yvtuvxyzzzzzyyyyz{~|zxwvvvwwxxy{~}{yyz|~~|{zzzzz{{{{zxwwwxy|}zyz|~{xutuvxyzzzzzyyxyz|{ywvvvvwxxyz||zyyz|~}|{zzzzz{{{zyxwwwxz}|zz{}}ywutvwyzzzzzyxxxy{~}zxwvvvwxxyy{~}{yxy{}~~|{zzzzz{{{{zxwwwwy|}zyz|~zwutuwxyzzzyyxxxxz}~{ywvvvwxxyz{}~{yxyz|~~|{{zzzzz{{zzyxwwwy{~}{yz|~~{xvuuvxyzzzyyxwwxy|~{ywvvvwxxyz{}~{yxxz|~~|{zzzzzz{{zzyxwwwy{~}{zz|~{xvuuvxzzzzyyxwwxy}~{ywvvvwxyyz{}~{yxxz|~}|{zzzz{{{zzyxwwwwy{~}zz{}}zwuuuwyzzzzyxwvvxz~}zxvvvvwxyz{|~}zxxxz|~~}{{zzzzzzzzyyxwwwxy||zz{}~|ywuuvwyzzzyyxvvvx{}zxvvvwxyz{|}|zxxxz|~~|{zzz{{{zzzyyxwwwxy|~{zz{~~{ywuuvwyzzzyxwvuvx{|zxvvvwxyz{|}|yxxxz|~~|{zzz{{{{zzyyxwwwxy|~|zz{~~|ywvuvwyzzzyxwvuuwz}zxvvvvwyz{|}|zxwxy{}~~|{zzz{{{{zzyyxwwwxy{~|zz{}~|ywvuvwxyzzyxwvuuvy}~{ywvvvwxz{|}}{yxxyz|~}|{zzz{{{zzyyxxwwwxz|~{z{|~}{xwvvvwyzzzyxwuuuw{}zxvvvwxyz|}~|zxwxy{}~~|{zzz{{{{zyyxxwwwxy{}}{z{}|zxvvvwxyzzyxwvutux||ywvvvwxy{|}~{yxwxy{}~~|{zzz{{{{zyyxxwwwxy{~|{{|~~{ywvvvwxyzzyxwvutvy~~{ywvvvwyz{}~}{yxxyz|}~}{zzzz{{{zyyxxwwwwyz|~~{{{||zxwvvvwyyzyxwvutuw{}zxwvvwxz{|~|yxxxy{|~~|{zzz{{{{zyxxxwwwxy{}~|{{|~}{ywvvvwxyzyyxvuttvz~}{xwvvwxy{|}|zxxxyz|}~~|{zzz{{{{zyxxxwwwxy{}}{{|~}{ywvvwwxyzyyxwuttuy~~{ywvvwxy{|~|zxxxyz{}~~|{zzz{{{{zyxxwwwwxy{}}{{|~}{ywwvwwxyyyyxvuttuy~~{ywvvwxy{|~|zxxxyz{}~~|{zzz{{{{zyxwwwwxxy{}~|{|}~~|zxwwwwxxyyyxwvtttvz}zxwvvwyz|}~{yxxxyz{}~}|zzzz{{{{zyxwwwwxyz|~}|||}}{yxwwwwxyyyyxwutttw{|zxwvwwyz|~}{yxxxyz{}}{zzzz{{{{zxxwwwwxyz|~}|||~}{yxwwwxxyyyyxwutttw{~|zxwwwxy{|~}{yxxxyz{}}{zzzz{{{{zxwwwwxxyz|}}||}~}{yxwwwxxxyyxxwutstw{|zywwwxy{|~}{yxxxyz{|~~|zzzz{{{{zyxwwwwxyz|}}||}~~{yxwwwxxxyyxxwutstvz~}{yxwwwxz|}~|zxxxyyz{}}{zzzz{{{zyxwwwwxyz{|~~}||}|zxwwwxxxyyyxwvutsuw|~|zxwwwxy{}~}{yxxxyzz|~~|{zzzz{{{zyxwwwwxyz{}~}||}~~{yxwwwxxxxxxxwvtstuy}~|zxwwwxz|}|{yxxyyz{|~}|zzzz{{{{zyxwwwxxyz|}~}||}~}{yxwwwxxyxxxxwutstvz}{yxwwxyz|~~|zyxxyyz{}~}{zzzz{{{zyxwwwwxyz{|~~||}~~|zxwwwxxyyxxxwvtstux|~|zyxwwxz{}|{yxxyyzz|}~|zzzz{{{{zyxwwwxyy{|}~~}|}~}zxwwwxxyyxxxwvutstw{~|{yxxxxz{}}{zyxyyzz{}~|{zzzz{{{zyxwwwxxyz|}~~}|}}}{ywwwxxyyxxxwvutstwz}{yxxxxz{}}{zyxyyyz{|~~|{zzzz{{{zyxwwwxxy{|}~~}|}~}zxwwwxxyyxxwwvutstw{~|{yxxxyz{}}{yyyyyyz{|~~|{zzzz{{{zyxwwwxyz{|}~~||}~|zxwwwxyyyxxwwvtttux|}|zyxxxyz|~~|zyyyyyzz{}}|zzzzz{{zyxxwwwxyz{|}~}||}~{ywwwxxyyyxwwvutstvy}}{zyyxyz{}}{zyyyyyzz{}}|zzzzz{{zyyxwwwxyz{|}~}||~}{ywwwxyyyyxwwvutttvz~}{zyyyyz{}}{zyyyyyzz{}}|{zzzz{{zyyxwwwxyz||}~}||~~{ywwwxyyyyxwwvutttvy}}{zyyyyz{}~~{zyyyyyzz{|~~|{zzzz{{zzyxwwwxyz{|}~}||}~|yxwwwxyyyxxwvutttvx|}|{zyyyz{|~|{yyyyyzz{|}~}{zzzzzzzzyxxwwxyz{|}}~~}|}~}zxwwwxyyyyxwvutttuwz~~|{zyyyz{|}}{zyyyyzzz{|~~|{zzzzzzzzyxxwwxyz{|}~~}||}|zxwwwxyyyyxwvutttux{~|{zyyyz{|~}{zyyyyzzz{}}|{zzzzzzzyyxxwwxyz||}~~}||}~{yxwwxxyzyyxwvutttvy}}{{zyyz{|}|zyyyzzzz{|}~}|{zzzzzzzyxxwwxyz{|}}~~~||}~}zxwwwxyyyyxwvutttux{~|{zzyzz{|~}{zyyzzzzz{|~}|{zzzzzzzyyxxwxxy{||}~~~}||~~{ywwwxyyyyxwvutttuwz~}{zzyzz{|~~|zyyyzzzz{|~~|{zzzzzzzyyxxxxxyz||}~~}||}~|yxwwxxyzyyxwutttuwz}}{zzzzz{|~~|zyyyzzzz{|}~|{{zzzzzzyyxxxxxyz{|}}~~~}|}~~{yxwwxxyyyyxvutttuwz~}{zzzz{|}~~|zyyzzzzz{|~~|{{zzzzzzyyxxxxxy{|}}~~~~}|}~}{ywwwxyyyyxwvutttvx{~|{zzzz{|}}{zyyzzzz{{|~~}|{zzzzzzyyyxxxxyz{|}}~~}||}|zxwwwxyyyyxwvtttuvy}}|zzzz{|}~}{zyzzzzz{{}~~}|{{zzzzyyyyxxxxyz{|}~~~~}||}|zxwwwxyyyyxwvtttuwz}}|{zz{{|}~}{zzzz{{{{|}~}|{{zzzyyyyyxxxyyz{|}}~~~}||}|zxwwwxyyyyxwvuttuwz}~|{zzz{|}~}{zzzz{{{{|}~~}||{zzzyyyyxxxxyyz{|}~~~~~}||}~}{ywwwxxyyyxwvutttvy|}{zzz{|}~~|{zzzz{{{{|~~}|{{zzzyyyyxxxyyz{|}}~~~}|||}~|zxwwwxyyyyxwvtttux{~}|{zz{|}~}{zzzz{{{{|}~~}||{zzzyyyxxxxyyyz{|}}~~~~}||}~}{yxwwwxyyyxwvutttvy|}|{z{{|}~}{zzz{{{{||}~}||{zzzyyxxxxxyyyz{|}~~~~}|||}~}{yxwwxxyyyxwvuttuwz}}{{z{|}~~|{zzz{{{{|}~~}|{{zzyyyxxxxyyyz{|}}~~~~}|||~~|zxwwwxxyyxxwutttvx{~|{z{{|}}{zzz{{{{||}~}||{{zzyyxxxxyyyzz{|}~~~~}|||}|zyxwwxxxyxxwvuttux{~~}{{{{|}~|{zz{{{|||}~~}}|{{zzyyxxxxxyyzz{|}}~~~~}|||}~}{yxwwxxxyxxwvuttuwz~}{{{{|~~|{zz{{{|||}~~}}|{{zzyyxxxxyyyzz{|}}~~~~~||||}~}{yxwwxxxxxxwvuttux{~~}{{{{}~}|{zz{{{||}}~~}}||{{zyyxxxxyyzz{{|}~~~~}|{{|}~|zyxxxxxxxxwwvuttvy|~|{{{|}~}|{z{{{|||}~~}||{{zzyxxxxxyyzz{||}~~~~}|{{||~}{zyxxxxxxxxwvuttuwz}~|{{{|~~}|{{{{{||}}~~}||{{zzyxxxxxyyzz{||}~~~~~}|{{|}~}{zyxxxxxxxxwvuttuwz~~|{{|}~~}|{{{{{||}}~~}|||{{zyxxxxxyyz{{||}~~~~}||{{{|~}{zyxxxxxxxxwvuttuwz}~|{{||~~}|{{{{{||}}~~}|||{{zyxxxxxyyz{{||}}~~~}|{{{{|}~|zyyxxxxxxxwvuutuvy|}|{||~}||{{{{||}}~~}}|||{zzyxxxxyyzz{{||}~~~~~}|{{{|}~~}{zyxxxxxxxwwvutuvx{~~||{|}~~}|{{{{{||}~~~}|||{{zyyxxxxyyz{{||}}~~~~}|{zz{|}~|{zyyxxxxxxwvvutuvy|}||||}~}|{{{{|||}~~}|||{{zyxxxxxyzz{{||}}~~~}|{zz{|~}|zyyyxxxxxwwvuuuuwz}}|||}~}|||{{|||}}~~}}|||{{zyxxxxyyz{{|||}}~~~}|{zzz{}~~|{zyyyxxxxwwvvuuuvx{~}|||~~}|||{{|||}~~}||||{zyyxxxxyzz{{||}}~~~~}|{zzz{|~}{zyyyyyxxxwwvuuuvxz~~}|||}~}||||||||}~~}||||{{zyxxxxyzz{{||}}}~~~}|{zzz{|}}|zzyyyyxxxwwvuuuvwz}~}|||}~}||||||||}~~}||||{{zyxxxxyzz{{|||}}~~~~~}|{zyz{|}}{zzyyyyxxxwvvuuuvx{~}}|}~~}||||||||}~~}||||{{zyxxxxyzz{||||}}~~~~}{zyyz{|~~|{zzyyyyxxwwvvuuuwy|~}||}~~}|||||||}}~~}||||{zzyxxxyyz{{|||}}}~~~~}|{zyyz{}~~|{zzzyyyxxwwvuuuvwz}~}}}}}}|||||||}~~~}}||||{zzyxxxyyz{||||}}}~~~~}|{yyyz{}}|{zzzzyyxxwwvuuuvxz}~}}}~}}|||||||}~}}||||{zzyxxxyzz{|||||}}~~~~}|zyxyy{|~}|{zzzzzyyxwwvuuuvxz}~}}}~~}|||||||}~~~}||||{{zyyxxyyz{{||||}}~~~~}|{yxxyz|~~|{zzzzzyyxwwvuuuvwy|~}}}~~}}||||||}}~~}}||||{zzyyyyyzz{||||}}}~~~~|{zyxxz{}}{zzzzzzyyxwvvuuuwx{~~}}}~}}|||||||}~~}||||{{zyyyyyyz{{|||||}}~~~}|zyxxyz|}~|{zzzzzzyxxwvuuuvwy|~}}~~}}}}}}||}}~~}||||{{zyyyyyzz{|||||}}}~~~}{zyxxyz|~~|{zzzzzzyxwwvuuuvxz}~~}~~~}}}}}}||}}~~}}||||{{zyyyyyz{{|||||}}~~~}|{yxxxy{}~}{zzzzzzzyxwvvuuvwy|~~}}~}}}}}}}|}}~~}||||{{zzyyyyzz{|||||}}}~~}}{zxxxyz|~}|{zzzzzzyxwvvuuuwy{~~~~~~}}}}}}}}}~~}||||{{zzyyyyzz{{|||||}}}~}}{zyxxxz{}}|{zzzzzzyxxwvuuuwx{~~~~~~}}}}}}}}}~~~}||||{{{zzyyyzz{||||||}}}~}|{zxxxxz{}}|{zzzzzzyyxwvuuvwy{~~~~~~}}}}}}}}}~~}||||{{{zzyyzzz{||||||}}}}}|{yxwwxz|~}{{zzz{{zyxwvvuuvwz|~~~~~}}}}}}}}}~~}|||{{{zzzzzzz{{||||||}}}}|{zyxwxyz|~~|{zzzz{{zyxwvuuuvx{}~~~~~}}}}}}}}~~~~}|||{{{{zzzzzz{{||||||}}}}|{zxwwxyz|~|{zzz{{{zyxwvuuuwx{~~~~~~}}}}}}}}~~~~}||||{{{zzzzzz{{||||||}}}}|{zxwwwxz|~~|{zzz{{{zyxwvvuuvx{}~~~~~}}}}}}}}~~~}||||{{{{zzzzz{{||||||}}}}|{zyxwwxz{~~}{{zz{{{zzyxwvuuvxz}~~~~~~}}~~}}}~~~}}|||{{{{{zzzz{{|||||||}}}||{yxwwxyz}~|{zzz{{{zyxwvvuvwy|~~~~~~}~~~}}}~~~}}|||{{{{{{z{{{{|||||||}}}|{zyxwwxy{}}|{zz{{{{zyxwvuuvxz}~~~~~}~~~}}~~~~}|||{{{{{{{{{{{{||||||}}}||{zxwwwxz{~~}{{zz{{{{zyxwvuvwx{}~~~~~~~~~~~~~~}}|||{{{{{{{{{{{|||||||||||{zyxwwwyz|}|{zz{{{{zzywvvvvxz|~~~~~~~~~~~~~~~}|||{{{{{{{{{{{|||||||||||{zyxwwwxz|~~|{{z{{{{{zyxwvvvwy|~~~~~~~~~~~~~~~}}|||{{{{{{{{{{||||||||||||{yxwwwxy{}~}{{z{{{{{zyxwvvvwy{~~~~~~~~~~~~~~~}}|||{{{{{{{{{{|||||||||||{zyxwwwxy{}~}{{{{{{{{zyxwvvvwy|~~~~~~~~~~~~~~~}}||{{{{{{{{{{{|||||||||||{zyxwwwxy{}}|{{{{{{{{zyxwvvwxz}~~~~~~~~~~~~~~}}||{{{{{||||||||||||||||{zyxwwwwyz|~~}|{{{{{{{zzyxwvvwy{~~~~~~~~~~~~~}}|||{{{{{||||||||||||||||{zyxwwwwyz|~~}|{{{{{{{zzyxwvvwy{~~~~~~~~~~~}}}||{{{{|||||||||||||||||{zyxwwwwxz|~~}|{{{{{{{{zyxwwwwy{~~~~~~~~~~~~}}||{{{{|||||||||||||||||{zyxwwwwxz{}~}|{{{{{{{{zyxxwwwy{}~~~~~~~~~~}}|||{{{|||||||||||||||||{{zyxwwwxyz|~~}|{{{{{{{zzyxwwwxz|~~~~~~~~}}}||{{{{|||||||||||||||||{zyxwwwwxy{}~}||{{{{{{{zzyxwwwxz}~~~~~~~}}}||{{{||||}}||||||||||||{zyxwwwwxz{}~}|{{{{{{{{zyyxwwxy{~~~~~}}|||{{{|||}}}|||||||||||{zyxwwwwxyz|~~}||{{{{{{{zzyxxwwxz}~~~~~}}}|||{{|||}}}}|||||||||||{zxwwwwwxz|~~}|{{{{{{{{zyyxwwxz|~~~~~~}}}|||{{|||}}}}}|||||||||{{zxwwwwwxy{}~}|{{{{{{{{zzyxxxxz|~~~~~~}}}|||{{|||}}}}}}||||||||{{yxwwvwwxz{}}||{{{{{{{{zzyxxxyz|~~~~~}}}|||{|||}}}}}}}||||||||{zyxwwvwwyz|}~}||{{{{{{{{zyyxxxy{}~~~~}}}||||||||}}}}}}}||||||||{zywwvvwxyz|~~}|{{{{{{{{zzyyxxyz|~~~~~~}}}||||||||}}}}}}}||||||||{zxwwvvwxy{|~}||{{{||{{{zzyyxxyz|~~~~~~}}}|||||||}}}~~}}}||||||||{zxwwvvwxy{|~}||{{{||{{{zzyyxyyz|~~~~~~}}}||||||||}}~~~}}}|||||||{zywwvvwxyz|}~}|{{{|||{{{zzyyyyz|~~~~~}}}||||||||}}~~~~}}|||||||{zyxwvvvwxy{}~~}||{{||||{{zzyyyyz{}~~~~~}}}|||||||}}}~~~~}}|||||||{zywwvvwwyz|}~}|{{{|||{{{zzyyyyz|~~~~~~}}}||||||||}}~~~~~}}|||||||{zxwvvvwxyz|~}||{{{|||{{{zzyyyz{}~~~~}}}|||||||}}}~~~~}}|||||||{zyxwvvvwxy{}~~}|{{{||||{{zzyyyyz|~~~~~~}}}||||||||}}~~~~~}}||||||{{yxwvvvwxyz|~~}|{{{||||{{zzyyyyz|}~~~~~}}}||||||||}}~~~~~}}||||||{{zxwvvvwxyz|}~}|{{{{|||{{{zzyyyz|}~~~~~}}}|||||||}}}~~~~~}}||||||{{yxwvvvwxyz|}~}|{{{|||||{{zzyyz{|~~~~~~}}||||||||}}~~~~~~}}||||||{zyxwvvvwxy{|~~}|{{{||||{{zzzyzz{}~~~~~~}}|||||||}}}~~~~~~}}||||||{zyxwvvvwxz{}~~}|{{{{||||{{zzzyz{|~~~}}~~}}||||||||}}}~~~~~~~}}|||||{zywvvvvwxz{}~~}|{{{{||||{{zzzzz{|~~~}}~~}}||||||||}}~~~~~~~~}}||||{{zywvvvvwxz{}~~}|{{{{||||{{zzzzz{|~~~}}~~}}||||||||}}~~~~~~~}}|||||{zyxwvvvwxy{|~~}|{{{{|||||{{zzzz{|~~~}}}~~~}}|||||||}}}~~~~~~}}||||{zyxwvvvvwyz|}~||{{{{||||{{zzzzz{}~}}}~~~}}|||||||}}}~~~~~~~}}||||{{zyxwvvvwxy{|~~}|{{{{{||||{{zzzz{|~~}}}~~~}}|||||||}}}~~~~~~}}||||{{zyxwvvvwxy{|~~}|{{{{|||||{{zzzz{}~~}}}}~~~}}||||||||}}~~~~~~~}}||||{zyxwvvvvwyz|}~}|{{{{{||||{{zzzz{|~~}}}~~~~}}|||||||}}~~~~~~~}}|||{{zxwvvvvwxz{}~~}||{{{{|||||{{zzz{|}~}}}~~~~}}|||||||}}~~~~~~~}}|||{{zyxwvvvwxy{|~~}||{{{{{||||{{zzz{|}~}}}}~~~}}}|||||||}}~~~~~~}}}||{{zyxwvvvwxy{|~~}|{{{{{{||||{{zzz{|}~}|}}~~~~}}||||||||}}~~~~~~}}}||{zyxwvvvvwxz{}~~~}|{{{{{||||{{{zzz{|~~}}|}~~~~~}}}||||||||}~~~~~~}}|||{zyxwvvvwwyz|}~}|{{{{{{||||{{zzz{|}~}||}~~~~}}}||||{{||}}~~~~~~}}}||{zyxwvvvwxyz|}~~}|{{{{{{||||{{zzz{|}~}||}~~~~}}}||||{{||}}~~~~~}}}||{zyxwvvvwxyz|}~}}|{{{{{{||||{{{zz{|}~}||}~~~~}}}||||{{|||}~~~~~~}}}|{zyxwvvvwwxz{}~~}}|{{{{{{{|||{{{zz{|}~}|||}~~~}}}||||{{{||}}~~~~~~}}}|{{zyxwvvvwxy{|~~~}|{{{{{{{||||{{{z{{|~}}||}~~~~}}}||||{{{|||}~~~~~~}}}|{zyxwwvvwwxz{}~~}||{{zz{{{|||{{{{z{|}~}|||}~~~}}}}|||{{{{||}}~~~~~~}}}|{zyxwvvvwwyz{}~~}|{{{zz{{{|||{{{zz{|}~}|||}~~~}}}||||{{{{||}~~~~~~}}}|{{yxwwvvvwxy{|~~}|{{{zz{{{{||{{{{{{|}~}}||}~~~}}}||||{{{{||}}~~~~~~}}}|{zyxwvvvwxyz|}~~}||{zzzz{{{|||{{{{{{|~}}||}~~~}}}|||{{{{{{||}~~~~~~~}}|{zyxwwvvwxyz{}~~}||{zzzz{{{{|{{{{{{{|~}}|||}~~~}}||||{{{{{{||}~~~~~~~}}|{zyxwwvvwxyz{}~~}|{{zzzz{{{{|{{{{{{|}~~}}|||~~~}}}|||{{{{{{{|}}~~~~~~}}|{zyxwwvwwxyz|}~~~}|{zzzzz{{{{{{{{{{{|}~}|||}~~~}}|||{{{{{{{||}}~~~~~~}}|{zxwwvvwwxy{|~~}|{zzzzzz{{{{{{{{{{{|~~}|||}~~~~}}||{{{{{{{{||}~~~~~~~}}|{yxwwvwwxxz{|~~}|{zzzzzz{{{{{{{{{{|}~}}|||}~~~}}}||{{{{{{{{||}~~~~~~~~}}|{zxwwwwwxxz{|}~~~}|{zzyzzz{{{{{{{{{{|}~~}|||}~~~}}}||{{{{{{{{{|}}~~~~~~~}|{zyxwwwwwxy{|}~~~}|{zzyyzz{{{{{{{{{{{|~~}|||}~~~~}}||{{{{{{{{{||}~~~~~~~~}}|zyxwwwwwxyz{}~~~}|{zzyyyzz{{{{{{{{{{|}~}||||}~~~~}}|||{{{z{{{{{|}}~~~~~~~}|{zyxwwwwwxyz|}~~~~}|{zyyyzzz{{{{{{{{{||~~}||||}~~~}}||{{{zzz{{{||}~~~~~~~~}|{zyxwwwwxxz{|}~~~}|{zzyyyzzz{{{{{{{{{|}~~}|||}~~~}}}||{{zzzz{{{||}~~~~~~~}}|zyxwwwwwxyz{}~~~~}|{zyyyyzz{{{{{{{{{{|~~}||||}~~~}}}||{{zzzzz{{||}~~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}||{{zzzzz{{{|}}~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}||{{zzzzzz{{|}}~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}|{{zzzzzz{{||}}~~~~~~~}|{zyxwwwxyyz||}~~~}}|{zyyyyyzz{{{{{{{{|}~~}|||}~~~}}||{{zzzzz{{{||}~~~~~~~~}}|{zyxxxxxyz{|}}~~~}|{{zyyyyzzz{{{{{{{||}~}}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}}|{zyxxxxyzz{|}}~~}}|{{zyyyyzzz{{{{{{{|}~~}}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}|{zyyxxyyz{||}}~~}}||{zzyyyzzz{{{{{{{|}~~}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}|{zzyyyyyz{||}}~~}}}|{zzzyyzzz{{{{{{{|}}~~}}}~~~~}}|{{{zzzz{{{||}}}~~~~~~}}|{zyyyyyz{{|}}~~~}}||{zzzyzzzz{{{{{{||}~~~}}~~~}}||{{{zzz{{{|||}}~~~~~~}|{{zyyyyzz{||}}~~}}}|{{zzzzzzz{{{{{{{|}}~~~~~~~}}||{{{zz{{{{|||}}~~~~~~}|{{zzyyzz{{|}}~~~}}}|{{zzzzzzz{{{{{{||}~~~~~~~~}}||{{{z{{{{{||}}}~~~~~~}}|{zzzzzz{{||}}~~}}}||{{zzzzzz{{{{{{||}}~~~~~~~~}}||{{{{{{{{{|||}}}~~~~~~}|{{zzzzz{{||}}~~~}}}||{{zzzzz{{{{{{||}}~~~~~~~~}||{{{{{{{{{|||}}}~~~~~~}||{{zzzz{{|}}}~~~}}}||{{zzzzz{{{{{{|||}~~~~~~~~}||{{{{{{{{{|||}}}~~~~~~}||{{zzz{{||}}}~~~}}}||{{{zzzz{{{{{{||}}~~~~~~}|||{{{{{{{||||}}}~~~~~~}||{{{z{{{||}}~~~~}}}||{{{zzz{{{{{{|||}~~~~~}}||{{{{{{{{|||}}}}~~~~~}}||{{{{{{||}}}~~~~}}|||{{{zzz{{{{{{||}}~~~~}}||{{{{{{{{|||}}}~~~~~~}}||{{{{{{||}}~~~~~}}}||{{{{{{{{{{{|||}}~~}}|||{{{{{{||||}}}~~~~~~}}||{{{{{|||}}~~~~~}}}||{{{{{{{{{{{|||}}~~~}|||{{{{{{||||}}}}~~~~~~}}||{{{{||}}}~~~~~}}}|||{{{{{{{{{{|||}}~~}}|||{{{{{||||}}}}~~~~~~}}|||{{{|||}}~~~~~~}}}||{{{{{{{{{{|||}}~~~~}}||||{{||||||}}}}~~~~~~}}||||||||}}}~~~~~}}}}|||{{{{{{{{||||}}~~~}}||||||||||||}}}~~~~~~}}}||||||||}}~~~~~~}}}}|||{{{{{{{{||||}}~~}}||||||||||||}}}}~~~~~~~}}||||||||}}}~~~~~~}}}||||{{{{{{|||||}}~~~}}|||||||||||}}}}~~~~~~}}}|||||||}}}~~~~~~~}}}||||{{{{{|||||}}~~~~}}|||||||||||}}}}~~~~~~~}}}|||||}}}}~~~~~~~}}}||||{{{{||||||}}~~~~}}}||||||||||}}}}~~~~~~~}}}|||||}}}~~~~~~~~}}}||||||{||||||}}}~~~~}}}||||||||||}}}}~~~~~~~}}}||||}}}}~~~~~~~~}}}|||||||||||||}}}~~~}}}|||||||||}}}}~~~~~~~~}}}}|||}}}}~~~~~~~~~}}}||||||||||||}}}~~~~}}}|||||||||}}}}~~~~~~~~}}}}||}}}}}~~~~~~~~~}}}||||||||||||}}}~~~~}}}||||||||}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}}|||||||||||}}}~~~~}}}||||||||}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}|||||||||||}}}~~~~}}}}|||||}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}}||||||||||}}}~~~~~}}}}}||||}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~~}}}}|||||||||}}}}~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}|||||||||}}}}~~~~}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}||||||}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}|||||}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}|||}}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~}}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m52.bin b/applications/SprPoP/assets/packed/MUS/m52.bin deleted file mode 100644 index f9fa0ff..0000000 --- a/applications/SprPoP/assets/packed/MUS/m52.bin +++ /dev/null @@ -1 +0,0 @@ -vkc`dltxpidabeks}}wsnjgddcbbaabbbbcegimpu}{ridbchq{xpjfcbbdgimqvyz}}{yvsoligecbbcehlqu{{uoifccdglqx~ytpnkigfedddddddddddcdcddddeefgikloqsvy{~|yuqnkhfeeefhkosx||zywutssrqppppppppqrrsstuvwxy{|}~~|zxvtronljigffffghjlnqux{~~~~~}}}~~~~~~}|{{zxwvutrqonmlkiihhhhhhiijlmoqsvx{~~~~}|||{zzyxxwvuttsrqponmmlkjjiiiiiiijjklmnpqsuwy{}~}}|{{zyxxwvuutsrqqponnmllkkjjjjjjjjkklmmnoprstvwy{|~~}||{zyxwwvutssrqqpoonmmlllkkkkkkkkllmmnopqrstuvxyz|}~}}|{zyxwvvutssrqppoonnmmmllllllllmmmnoopqrstuvwxyz|}~~}|{zyyxwvuttsrrqqpooonnnmmmmmmmnnnooppqrrstuvwxyz{}~~}|{zyxwwvuttsrrqqppooonnnnnnnnnoooppqrrstuuvwxyz{|}~~}|{zzyxwvuutssrrqqppppoooooooopppqqrrsstuuvwxxyz{|}~~}|{zzyxwvvuttssrrqqqppppppppppqqqrrrsttuvvwxyyz{|}~~~}|{zzyxwwvuuttssrrrrqqqqqqqqqqrrrsssttuvvwxxyz{{|}~~~}|{zzyxxwvvuuttsssrrrrrrqrrrrrrsssttuuvwwxxyz{{|}~~~}}|{zzyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~}}|{zzyyxwwvvuuuttttsssssssssstttuuuvvwwxxyzz{||}~~~~}||{zzyyxxwwvvvuuuttttttttttttuuuuvvwwwxxyzz{{|}}~~~}||{{zyyxxwwwvvvuuuuuttttttuuuuuvvvwwxxyyzz{{||}~~~ytrruy}~zwtsrsux|}{ywuttsssrrsssssstuvxz|{wusstw{~zwutssstuwxz|}}~~}|{ywvuttssstuvxz|~~|ywutsstvx{}}{yxwvuttttsssssssssssssssttttuuvwwxy{|}~~}|zxwvuttttuvwy{}~}}|{{zzzyyyxyyyyyyyyzzz{{{||}}~~~}||{zyxwvvuutttuuvvwyz{}~~~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuuuuvvwwxyzz|}~~~~~~}}}||||{{{zzzyyxxxwwwvvvvvuuuvvvvwwxxyyz{|}}~~~~}}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvwwwxxyyzz{{|}}~~~~}}}|||{{zzzzyyyxxxxwwwwwwwwvwwwwwwwxxxyyyzz{||}}~~~~}}}||{{{zzzzyyyxxxxxwwwwwwwwwwwwwxxxyyyzzz{{||}}~~~~}}}|||{{{zzzyyyyxxxxxxxwwwwwwxxxxxxyyyyzz{{{||}}~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxyyyzzzz{{{||}}~~~~~~}}|||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyyyzzz{{{{|||}}}~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzyyyyyyyyyyyzzzzz{{{{{|||}}}}~~~~~~}}}}|||{{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{|||}}}}~~~~~~}}}}||||{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}||||{{{{{{{{zzzzzzzzzzzz{{{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{{{{zzzzzzz{{{{{{{{|||||}}}}}~~~|oe_`fox}rkda_afmvxtojgdbba``````aabdgimqvulea`djt~|skfca`adfinrvyz}}zyvtpligdcaaacehmqv|}vqkfcbbdgmszzuqmkifedccbbbbbbbbbbbbbbbccddefhjlnpsvx{~}yvrnkhfdccdfhkotx}~|zxwusrqqpoonooooooppqrrstuvwxz{|}~|zxvtromkjhgeedeefhilnqux{~~~}}|||||||||}}}}~~~~~~}}|{zzyxvutsrpomlkjihggffffgghjkmoqsvx{}~~~}}}||{{zzyyxwwvutssrqponmllkjiihhggggghhijklmoqrtvxz|~~~}||{zzyxwwvuttsrqpponmmlkkjjiihhhhhhijjkklmnoqrtuwxz|}~}|{{zyxwvvutsrrqpponnmllkkjjjjjjjjjjkkllmnopqrstvwxz{}~~}}|{zyxwvvutsrqqpoonnmlllkkkkjjjkkkkllmnnopqrstuvwxz{|}~}|{zyxxwvutssrqqpoonnmmmllllllllllmmmnoopqqrstuvwxyz|}~~}|{zyxwwvutssrqqpoonnnmmmmmmmmmmmmnnoopqqrsttuvwxyz{|}~~}|{zzyxwvuttsrrqqppooonnnnnnnnnnnoooppqqrsstuvwwxyz{|}~~}|{zyyxwvuutssrqqqppooooonnnnoooopppqqrssttuvwwxyz{|}}~~~}|{zyyxwvuuttsrrrqqqppppoooopppppqqqrrsstuuvwwxyzz{|}~~}}|{zyyxwvvuutssrrrqqqqppppppppqqqqrrrsttuuvwwxyyz{|}}~~}||{zyyxwwvuutttssrrrrqqqqqqqqqqrrrsssttuuvwwxyyz{{|}~~~~}|{{zyyxwwvvuuttsssrrrrrrrrrrrrrrsssttuuvvwwxyyzz{|}}~~}}|{{zyyxxwvvuuutttsssssrrrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuuttttsssssssssssttttuuvvvwwxxyzz{{|}}~{vrrswz{xusrrtvz~}{ywvtsssrrrrrrrrstuuwxz~}yusrsuy}|xutsrrstuwy{|}~}}|{zxvutssrsstuwy{}|zxutsssuwy|~|zxwvuttssssssssssssssssssstttuuvwxyz{|}~}|zywvuttsttuvxz|~~}}|{zzyyyyxxxxxxxxyyyyzz{{{||}}~~~}}|{zyxwvvuutttttuvwxyz|}~~~~~~~~~~~~~~~~~~~}}}||{{zzyxxwwvvuuuuuuuuuuvwwxyz{|}~~~~~~}}}}}|||{{{zzzyyyxxwwwvvvvuuuuuuuvvvwwxxyyz{|}~~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvvvwwxxxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwvvvvvvvvvvwwwwxxxyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwwwvvwwwwwwwxxxyyyzz{{||}}~~~~~}}}||{{{zzzyyyyxxxxxwwwwwwwwwwwwwxxxxyyyzzz{{||}}}~~~~~}}|||{{{zzzyyyyxxxxxxxwwwwwwwxxxxxxyyyzzz{{{||}}}~~~~}}}|||{{zzzzyyyyyxxxxxxxxxxxxxxxxyyyyzzzz{{{||}}}~~~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxyyyyyzzzz{{{{|||}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzzzyyyyyyyyyyyyzzzzzz{{{{{|||}}}}~~~~~~}}}}||||{{{{{zzzzzzzzzyyyyzzzzzzzzz{{{{||||}}}}~~~~~~}}}}||||{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{|||||}}}~~~~~~~}}}}|||||{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}}~~~ujb`cku~xohcaadjs||vrmifdcbaa``aaabbdfilpt|zqicabhpzxoiebaadfhlquyz||zxusokifdbbbcegkpuzztnhecbcfkqw~}xsomkhfeddccccccccccccccccddefghjlnprux{}{xtpmjhfdddfhjnrw|~{yxvusrrqppooooooopqqrssuvvxyz{|~~{ywvsqomkihffeeefhiknptwz~~}}}}}}}}}}}}~~~~~~}|{{zyxvutsqpnmlkjihgggggghijkmnpsuxz}~~~}}||{{zzyxxwvuttsrqponmmlkjjiihhhhhhiijklmoqrtvxz|~~}}|{{zyxxwvuutsrqqponnmllkjjjiiiiiiijkklmmnpqrtuwxz|}~}||{zyxwwvutsrrqqponnmmllkkkjjjjjjkkklmmnopqrstvwxz{}~~~}|{zyxwwvutsrrqpponnmmllllkkkkkklllmmnoopqrstuvwxz{|}~}|{zzyxwvuttsrqqppoonnmmmmlllllmmmmnnoopqrrstuvwxy{|}~~}|{zyxxwvuttsrrqppooonnnmmmmmmmnnnooppqrrstuvvwxyz{|~~}|{{zyxwvuutssrrqqppoooonnnnnnooooppqqrrsttuvwxyyz{|}~~}|{zzyxwvvuttsrrqqqpppooooooooopppqqrrsttuvvwxyyz{|}~~}|{zzyxwvvuttsssrrqqqqppppppppqqqqrrssttuvvwxxyz{{|}~~~}|{zzyxwwvvuttssrrrrqqqqqqqqqqqrrrssttuuvvwxxyzz{|}~~~}}|{zzyxxwvvuutttsssrrrrrrrrrrrrrsssttuuvvwxxyzz{||}~~}||{zzyxxwwvvuutttssssrrrrrrrrssssttuuvvwwxxyzz{{|}~~~~}||{zzyxxwwvvuuuttttssssssssssttttuuuvvwwxxyyz{{|}}~~~}||{zzyyxxwwvvuuuuttttttttttttttuuuuvvwwxxyyz{{||}~~|wsrsvz~}yvsrrsvy}|zxvutsssrrrrrrssstuwxz}~zvtrsux|}yvtsrrstuwyz|}}~}|{zywvutsssstuvxz|}{yvtssstvx{~}{yxwvutttssssssssssssssssstttuuvwwxy{|}~~|{yxvuuttttuvxy{}~}||{zzyyyyxxxxxxxyyyyzz{{{||}}~~~}|{zyxxwvuuttttuuvvwyz{}~~~~~~~~~~~~~~~~~~}}}|{{zzyyxxwwvvuuuuuuuuvvvwxyz{|}~~~~~~}}}}}|||{{{zzzyyxxxwwwvvvvuuuuuuvvvwwxxyyz{|}~~~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvwwwxxxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwvvvvvvvwwwwwxxyyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwwwwwwwwwwwxxxyyyzz{{||}}~~~~~}}|||{{{zzzyyyyxxxxxxwwwwwwwwwwxxxxxyyyzzz{{||}}~~~~~}}}|||{{{zzzyyyyxxxxxxxxxxxxxxxxxxxyyyzzz{{{||}}}~~~~~}}}||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~}}|||{{{{zzzzyyyyyyxxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~~}}}||||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzzz{{{||||}}}~~~~~}}}}|||{{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}}|||{{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~}}}}||||{{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~|}pyae\XpwZlchh`zZPUUiwewz}u~dtdu\ehxytfYz}{vriyjnhbvSMPQgqgv~oz`vay_mwel~a}tqhq{ssigudsckdbvUNQXtjqq|vznntup_|orp|g`mifklelfdm`k_htQRR^}d~nx}|saxdjutzwU_ZkUisb^l}\fhak\poPVUfboxzqmX`tc{mMjuNqpOl~ndayoXkbej^xlTY\vvj{yz|kd^MlpjeS{fS{^Svygaf~a_lbkgf~aX[eiznwyl]YPWxhw\gXc{T]{vkfwvXkhendn~^]`tenueZXLhthsYztRxlPm}pijd_mdjlb}pZ_fmrs}xwo^YRSvhs_h\a}YXxzqmztWlgfmfhe`dw}emu~hYWNmqg}s]~vTwoPi}upp`amejnazw^bjkss|u}ws_XP[xcscp\h~X[zyrm}qYmghmghiei~ugnu||{i[WVwfiymgmZ~iRm}xsyzWjigjma~tcgtdl{uzq^[Rmq`tz|fZtyUb|zvta`nfincpdfkmmwtry~~wh]X`z^mtnsjbhUo}|x~rVpgjin_vhlzzdj{s~yua]Vslbx|Գscywr|~d]`emmqvtolc|o||~u^tzJSd[\gw~|m`z\i|{PJU7XZfSlQ>4UlVMix|ui}zvc|fpVo]YTXn}wĩr~|qWSn>FVCKJh`K\y[y\qxt~xOLzjW|TtryUbiaQIJ/J{igc^exz}zΗ]p~pRQhZmCbwO`ShsyavwpDQ`VotXn[vz~sƙy|f~Qq{_l\c}fUMrR7aLi`xhhntqlkcxXjwzdRgeVpNlygaNxZc{qDSO[GEjaY]xfzvgwoub@g`nxȰmn^onOybxSUhhiR[nV:[tos||o`f]FAlpovblk[xzor|ich}aQ|oZWhlFrzr~dxpx_7LMtoo|wpRpp^faxn_nnyhmmZ[c{htx{phqvn>I8[iMxTu\boJ^m}irl}pm{p{zloxsyed~kM?,JtP{zXTjStefwrjntolxlisvvwg{fY91?j]fqsgbmPiZZtltbZfcph}k}zqvvŲlsS=H{ibuwkJzaAqpRfngmiLmutpalywpzrokRLOq|{]RwdQdeOLkvu}gJ_iri\sxuz~q~rzrtscp_}rt^Kei@XtJLugsvTNkgfdZ_{iuqw^xn²өb]|BiNNE?nxe6U\RJZ\esolirYkaQfnalzdh]ZN\cI@F&J<][qmuws}YiwmVbL|_N^gZXTXykbg˛nrtk53-a>3GNtuy~T_bDJpRc^oa~pqimsΏtj^lmo67`aQXyr–eyc{gtaexy{UQauio[@c~~n~ydr=Dcu{PzL}{bfrcvterS[`qb]Oq?eTezvqxk`tl[__nmu|qtnrf}sttd}W^_rvYO^DXMMhlRWihkgus_\hfln٣ncW[FYX._Rr~z;czGjjP`SJpu^rm|d\r{}Y˴f]qRN=@UT\\zWnmtTjszill`dQoMiuommyʗķxixwr^q_MjxqHtKFM:`owqbklciznSYmr{|provhvwr}w`ePef?BdMQnWGVLM\onafw}sup^rs\yk~xloyLgk;gy]a[YIVRYVU_@M_lrbfx{v_6@`RYco~V9kh__mSKlQoSOnXdnuVQ_[tgǛle]_dE?QZ~ŻuvXH|iinOVEWoCkpZ[`tp^^svxةŤv_Wo[Y][se~e~aQxjl~\RFL_S[plYnugipntp}~~||p~twmksozeY|o{c\MWgOQl][]ji_oqjc|wÍmnm`ubprj}iEddw`tggdUzrf`gLOqW}hkizt۶d^Zrttwq[@XWf~Mk|uxg]|lXsxcetvzq\YYyfdpqwoqn>zxF}sn&"*]7ZvCԧq\oSfYfcr~Qh{^XJ4EU?``|~fw\bOSS\icQeyڻݶyl~Hf{ax{tj|r|bneTY7,.JE89 =EbZJw_w˲䱠]q|m}advjHYh?J:/F$;#4ZnUxwZͻƬt[A4N8mpzAn{6mc)MnkmlfQM_\oCeqT\^]qwqѨzb]d]deQ<)0:qw²|x[}a`qxi{`Ktv~ieZGaP_lab¥šÿ~vjtqYadfeiRxrUJo-EW(%6TQ]amq}u||b[m>GsE=kpfjtH_kaw[^kqpltvu୙Քpqa\=Zqe°yc|c`xwhgxmm^{pockvUOiXynnh||ttwaTSb{GP[_AG6H_On{j{rc}d}Ȳ~t`_R}Bic]AMg_hnDapml~wwnxezuy~{se`V^^W@Xi_oglDEj[W~~vzkenzjxh~VkybOQ\Lj`Ymhy_^j~wsfU{wa]{ȖkWXnj`RBEB]boa~dwsMCP_nOIZMq]M9chgu}fUor|Ʊ~zspgzu{mc~aŷhlwd^]o|{sMVQi_Y@fwimuh^piz}q{myp`T\\]yjLomwrwns|}luRjty~Xhdz]dvqx{g`\ysff}utqUy{r}qbj^o\B@Rcr]TT_ztmRwzqzbpnwt~ytztnfot`Yjsxv`qgtkQenxzjeepec}hWYj~oj}u\up_cZezwzo\iispqZxkllqghrŤus`duqleYXXxxi{zkqfsYVdnPh`auslMkiltlbWpsS|~rr˷yyvjkqWy~uxe]_cinh|ilLdnfeZYTg~ev{ɣ~wsqx^|uh_fT~~tr|fP`zbUa]|ih?Ka_camatm||ewq^r}usnu[vpi}jWXhveVZIj^gFMqivwqswr{~umqzx{s|kz~iVV`deLASHvxqrh|h]dzwg{{rl{n{zn~|az~yq|bHJ\fl]P[Z~qrmrpzmhiy{t||z|sesx~vlverfYfwxtr|}kuka~ph]r}rvzjnu||n[^Nsttg~}{t]Z}w^rd\[usu~q|noysqmzz{zmvvk\YEr~ysbrx|~s~~tzvwehxzqsyb}kazjajztp}izzon|xrl`Rv|pvyrshwdozMcmjlyh^}yai}j_lxuyrztc\NTzk}sozxfy\uz^ttwslygn}slwyvrhhy_WZkg_VXBXuozvxtzebv~m}u}zqsyxwecu]`ltokdSu~yehsuwiaiSurvXfgnr}cwvfwqpkuvw|oyjt}yk|zv}}lnwfyzaqvzy}h}os}ogesxlm{nulfoxcmwyjaQtqx~{wuqwgjyttxwqq~}nm|wy{~wmiZvk|yvnynqwtgflVvu[jrtty[u}uji}qhcr{xmuwtmawu|}ro}c}elqxy}]xxm`ne`at|uh{ulicivth[[R`zqz~z}xth{npxjsz|o}rs~mt]bqvib^V_z}v~zvw|twxxm`jYayqnbfkmvaauwjz|uvuh^gs}vnecfx~xjrlfvvbjt|n`}x{~{}sy}ou`n~WX]kje\VQt~q~|rson]{}ut~ot}|}wej\`gic]XUi|x~wupw|tuof_i[iywzpxrz}}~p}{h|Y^fqmhbcmu~{lsslxi|zuwxpl}q|ft_a|VMR`e`VX]|v~||~p{|rqr|pzn]iRR_faYUUm}}z{sptqy{vyew|ayyy~~i{x}v~}\zXU[b`^[]r}y}nx|{fnw||}w{cmrnymkvRjnHEJUWWTT`}~tuuwry}t~nixVixRLPWWUSVcu{qqfiy}|omw||}~pt}r~qk}`l~VNS^aa]^ozwnlnewyy}}}~yzebpguwi^pU]wSJKV]_[\hy~~tpun~kmzr}zmf{]g|[UV^`a_ans~wvig{{x~pkvz{xz~hkup~omfu`]aihfbduywjmnnp{~uwvxuvaiqky{ki|^t|WSV^^][_p|ykwjxs||{}~xev{wpv}_~vXY]b`\X\t}~|ufy|{~cp{xy{yi{{|k{xcnWWY\[ZX]x|sg|}xb~tzxyxn~yzjnebVXZYXVXd~}wlg{}wfzx}tn~zse|lg^TW\]ZVXd|{}xmj~wl}~to|w}se{gj`WW\[WRTb~{}}~wkkxpnl{x}~qg~gl]UUXWTPScyz~ylj}pohwv}qd|ge~[RSXWVSVb|{x~spo}{rjxw{}o`wh`_TVZWRPTb{{vvsny~z}rhuuw{o_un`aQTXYTPP\v~v~yqlt}|~sdost{~talrY{kRSSUROOZrv}|rn}t|{|welvu{|tdfxYpqQQRVSPNVkwz~qwwtw{yx||ifqry~td\v]exUPQUTQPUf~tslw|xw{|ndoqrx|ujXmkWx`ORUVSPUe~vol}pzxx|~sagppv{xn]`uWopPRU[ZWV`v|qwxpw~yww{~wfbnorxyqdXsa`|\UW[[ZY_p~qpiw|vsw|yj`korwysiZro\}dUY\^[Y]lsn~kousv{|oahoryzo]jw[ynUY[^[Z[h~wo{nwnvstz}tfjstx}{rabz\quVYZ]ZXYd{~vmwrspwutyxghrux}{ra`z^mvUVX]\ZXavxmtuqrxwx}zihrux|{rb\w^hyXWX[ZXYbvxmsyow|yx}{jgqtvyypb[wadwWVY][YYasxnt}tx}zx}yhfosvzyo_Yv_gwWWY\ZWW`sxow{ww|yx}wggqstxwo_]w]itTUWZXVWau~xp{zyv|xw{udeosvywn]^vZkqRUX[YWW`t|ztusywx}qdhpsuxsiXcsWsjRWWYVUXdy{{zwqvxuw|}ncjpsuwqgWloYv`QWYYUTWfzz|yzqxxuy}yibkqtvwocUpg]xZSVXWTSYi|y{y{p}|}wtx}whclqstunbVrd^vWRVXWTSZj}z~x|rz~{vsw}vfakqsvum`Vsa`uVSVYWTSZk~{~x}rwzvsx}ufbkprttk^Wt`buUTVYVTU^o|x}qy~{urv{ueaiorttl_Vrc_uWUY\[XW^n|y|qzy{urvzufaiorttlaUpg_y\VZ]\YX^n|}x{n}x|uqtyvgahnqstneWpl]y`V[]]ZY]l~|}yyoruqswyj`ensuwqhXit[whV\]^[Y\hz}{{xs|ovrrv|}pdfnsuwtk\ax]ppV[\^[Z[fv|}wyurxsqv|tfemsuwum`[wbfvXY\_]ZYaq}~wzo|w~wsvzykdiptuvoeVmn[xbU[]][Z^l}~}ywrsytuy~pdfmrturiZ`vZmnTZ\_\[\fw~}v}uw|vtw|tfbipttsj^Vrd`vYW\_][[cr~~wzrywsvzwibgmqrrlbUkkZu_U[^_\\ao~z{tuxstxyjadkprsmdUcqWqgT[]_\[^j{~~{x}sytsv|{nbbioqqneW[sYjmSY\_]\^hx~{{ztysquz{naahmpqnfYYsZfnTY\_]\]gv{~wtytquy|ob`gmppneYVr]cqTW[_]\]fu{tvztptx|pc_eknonfZUp^`qVW\_^]^fu|uuysptx{ma_eloomeYVq]bpUX\`^]^gw{}vtxspsxzma_floomeXWr[eoTY\`_^`jx|{xswqosxyl`_flopmeWZrZhnU[_b`_ajz|v}pvqptywi_agmopkcUarYqiU]_b__bm|~~rsupqt{tg_cioqqlcVjn[ubW^`a_^co~~~q}w|tprv}~re`emrrrkaVph_v]Y^a`^^dq}}}rzz{tprv~sfbgmrsrk`Wrg`u[Y^a`^^dq}|}sx|{tqtxrfbhnssrk_XsdbuZZ^a_]]cp|{~tw{vruy~qfchossrj^YtcdtXY]`^\]dq{{~uz}vsuysfchnrsrk`Xre`tZX]`_]]co}{{~~u}}wsuysgcgnrsrj`Vpg^t[X]`_]\bn|{z}u{xsuxthbflqrqjaVmj[t]V\__]\alz{z}vvxstw}viadjpqqlcVepYqdU\^`]\_iw|z|ztztsu{xkbbhnpqmeX^sZjkTZ]`^]^gt~{|zvztqtxzncaflppng[Wq_bpWY]`_]^dq||t~y~vqsv|}re`cinooh`ThjYr_V\_`^^bm{}wswrqtyvi``eknokcW\qYikT[^b`_aiwvvzsprv}yla^bimnmf[Tnb^rYY^ba`agtr}w}toptz{oc^aglmmg_SiiZr_W^bdbcgrtruppsx~}re^_ekmniaUboXogW_beccfp~x{qvqoqv}~th_^djmnkdX\s\jnX^bfdden{zoourzukmszvy~onkfZQLOZiv~ŭ~sgbfovywtpquxgc|jmYNLMOSWYYaxvusncZSU^hprqlkpw}|uv||wqpruf]xgtzz{|{pltumpv{{{~q|wlryf^XY[bed\OECGNQRQJ?=UDIV?CHMMNQZiy~xohggjkh^QFELTZ_a_Y]yjvov{}}}~tqvttq{wux}tkjotxyvncg|eqw_adfcbahr}yqmklms~vs}pgfimnniaVbnWkgU[^`__bly~}etravmb\[^chjf\RMPV]ac`[Tjo`zmelqttv{xzxstv{xma\^cffe^UNdZQePJNPOMMR\hpspjfehkpyzxtvz}}{tke{pi|fbehfefku~}}xy~ncxefvjc_`djnnh^URV\acc^WXpcbwcafjllow~}ytuw{}{sg\XZ^``]ULLaPP`JGILKKLR]hqsqliimpwxtvz}}{tliqmjegjihhmw~}wxpcyigxmfbcglppkaXUX]bdd_YWne_ud_chijls~}|ztsuy{zsh]WX[]][UMJ^WJ`RGJLNMNS]irwvronpsyyssvy{zungw{h|vfhjkjjmuyw|zfpxbswlgehlqsph_XW[`ceb]Wbq]lr`beijkoxyxstvyzwodZVX[]]ZTLOcQSbNKMPQQSZdpx{yurruxvqruxyxslhzxi~sfiklkloxxw|zgrxctxojikosurjaZY]adeb]Xer^ltcbfikmpy~z|yttuxywoe[WWZ\\ZTMPcURdUNPSTUW]gs{~~zwwy|}tooruvtoigztg|rfgjkklpyyx~xhxwfyypkkmptuqi`ZZ^bdea\Yio]pqbdgjkns||u}wstuxxtlaYWX[\\XRMWcO[cQPSVVX[cnx~{yy|wolmprroidn{go{jfgijkmt~}z}~npkp}uplmpsusld\Z\_bca]Yaqafufbehjlpx~z{yttuwxund[WWZ[[YSNTeTUfWQSVWY\cmw}{{}vnjknppnhcjyhlzjefiijms|}oqlq}vpmnptusld\Z\_bca\Xbp_ftdadhikowyv|{wxy||yria^`bdca\Ydo\fpa]_bceipzxtzwxz||xpga_acdd`[ZhlZjm_^_bcejr|xtyxy{}|wof``addc_[[lh[nj^^`bdis~{ww|{wpllnqrpkhgjnqroibcqcZk_UTUVWZ_hqy||zwx{~{sooppnib[XZ^bbb^[aqd`rg_^_``bgnv|~}zwwy}xpjihge`YTXeUTe[UW\aekt~qrpo}zurrtwyxslecdgijieckyjk{piikmnqw{qicbccb`[W]j\Zk`WWY[\_enw~~zzyyzzwpg_ZYYZZXTQVeZVhbYZ^adhox{v{zz|}|vogbbcddc_\aof]oj_]_`adipy~}~}zrmkkllkgcerpaprfbcefhls|upx{vsrstsoh`ZWXYZZWTTagVal`\]`cfkr|}~}|}~}zskd``aba_ZXal\]lbZZ[]^agow~}|{}|~wokijlljgdgundushfgijmqy}r~mv}ytrqrsrng`ZXXZ[ZXUWdhYcnc_`behmt}~|}{{|{xrjc_^^_^\YW_j]Zkd[Z\]_chpy~y{tmhghiihechumdutjgiklot|yr|lw|xsqqrrqmf_ZXY[[[XVZhgYhncabegkpx~y~~{zz{yunga^]^^^[XXdhYala\\^`cgmu}{z|~|voiffghgebdouekxpiikmosy}syqp{zvrrrsrojc]ZZ[\\ZXYdl^apiccegkou~}z|zzzyvpib^]^^^\YYbj\]lf^]_acgmt|||z~}~~|voiffgggeccmugjwpjijlorx~tzrq|{wtsstspkd^[[\]][YZek]cphcbegjnu}~{|}|{{zvpic_^__^[Y[fiZald^]_adhnv}|y~~~ztniffggfdbfqpcoulhhiknsy{vpy|xvuuusoic^\\]]\ZY_kd[jmdabdgjowz}}}|ytmfb```_][Zak`[jh_]^_aejqx~z|wqkgffgfebbjsgesphfgiknszy}zs}|ywwwvsnhb^]]]][Y[dk_^mjbabdfjpw|~}}|xslfb```_][\dj]]kg_]^`bekry~{~{wpkgeefecabkqecqnfcdegkpv}x~||{{xsmgcaaa`_]]emb^mldabdfinu|x~|{{{xsmgcaaa`_]]emd^kmfbbdfinu|x~}|{{xtnhca```_]]blg]hngcbdfint{~y{}{{zyuoida```_]]`jj^eoidcdfimsz}{y}{{zyupjeb```_^]_hl`bolecdfhlrx~w}{zzyvrlfb````_]^dmf^kohddfhlpv}}wz~|zzywsnhda``__]]bkj_fpkfefhkou||{v|zyywtpjeb```_^]_hmbannhffhkntz}u}|zyyxuqkfb```_^]^eme_lpiffhjnsy~}vz}zyyxvrlgc```_^]^cli_iqkgfhjmrx~|wx}{yxxvrnhca``__^]bkk`fplgfhjmqw}|yw~~{zyxvsnida`__^]]bkk`dpnhghjmqv}|zv~~{zyxvsnida`___^]ajlaconighjmqv||{v}~{zyxvsoida`___^]`ilbbonighjlpu||{v~~{zyxvsnida`___^]ailaconhghjlpv|}{w~~{zyxvsnida`___^]ajk`domhfgilpu|}zw~~|zyxvsnida`__^]^bkj`domhggjmqv|~yy~|zyxvrmhda``_^]^dlh_gokgfgjmqw}x{~|zyxuqlgca``_^]_fle_iojffgjmqw}x}~|zyxuqlgca``_^^`glc`kniffgjmrx}x~~|zyxupkgca``_^^`hlb`lmhffhjnrx~x~~|{zxupkgcaa`_^^aikaalmiffhjnrx}y~|{zxtpkgcba`_^^bikaalmhffhjnrx}y~~|{zxuqlgdba`__^bikbalmiffhjmrw}y~~|{zxuqlhdba``__ahlc`kniffgjmqw|y}}{zxuqmhdba``__ahld`jnjgfhjmqv|z{}{zxvrmieba``__`flf_gnkhghjmqu{{z}{zxvsnjfcaa`__`dki`enmighilpuz}y~}{zyvsokfcaa`___cjjabmnjghiloty~x|~{zxwtplgdba`___agle`iokhhiknsx}zy~~|zywuqmieba`__^`ekh`ennjiiknrw|}w{~|zxwurnjfca`__^_cikcblolijknqv{wz~~|zxwurojfca`__^_bhleajpmjjkmquzxx}~|zxwusokgda`__^^aflg`honkjkmpty~yw|~|zxwusplhdb``__^`ekiaeooljkmptx}~zv{}|zywusplhdb``__^`ekiaenolkkmptx}~{vz}|zxwuspmieb``___`djjbdmpmkkmpsx}~|vz}|zywusqmieba`___`djjccmpmkkmpsx}~|vz}}{ywvsqmieba`___`djjbdmomkkmpsx||w{}}{ywvsqmieba`___`ekjbdnolkkmosw||w{}}{ywvspmieca``__afkiaenolkkmpsx}{x|~}{ywvsplheca``__bgkgagnnkjkmptx}zy}~}{yxvsplheca``_`chkeahnmjjkmptx}y{~}{yxvsokhecaa```cijcajnljikmptx}z|}{yxvsokhecaa```dijcbjnliikmptx}z|}{zxvsokhecaa``aejibbjnljikmptx}z|}{zxvsokhecba``aejibbjmkiikmptx}z|~|zxvsokhecba``adiibajmliijmpsx|z|~|zxvsplhecba``adijcaimljijlosw|{|~|zxvsplhecba``adijcahmljjkmosw{{z~~|zxvtpmifcba```chje`fmmkjklorw{}z}~~|zxvtqmjfdba```bgjgadlnkjklorvz~y|~~|zxvtqnjgdba```aejibcknlkklnquz~zz}}|zxvtrokhecaa``adhjeahnnlklnquy}{x{}|zxwurolifcba```cgjgbemomlmnqtx|~xy||zxwuspmifdba```bejicckonmmnpsw{xx{|zywuspmjgdba```adijebioommnpsw{ywz{zywusqnkgeca```adhkgbgnonmnpsvz~{wy{zywusqnkhecaa``acgkhcfmpnnnprvy~|wxzzywusqokhecba``acgkhcemponnprvy}|wxzzywutqolifcba``acgjicelponnpruy}}wxzzywvtrolifdba``abfjiddlponnpruy}}wx{{yxvtrolifdba``acfjiceloonnoruy}}xy{{yxvtrolifdbaa`acgjhcelonmnorux|}xy{{yxvtrolifdbaa`acgjhcelos~|pgbaeozwg][\^bhow|voha]]ZQJKPRPOOPSWZ_cglqu{{vuyneb`][[\\]^_``_acdffhlmgceihda^\\]^`cfilpv}zqh`YSLHFHLNMQ^jqv|~y{{yyz{{zyxwwwwwvusqmjjmplfhlopqrstttssrsstuwy}||~|||||}~{vpje`]ZWVUUX[YSRY]]\\^adhlpuy|zxxvsokfb]YTPLJHHHILQWXVYcjnptx}yy{{zywvtqoligedcbbdgjhbbgkjhghijloqsuvvwxy{||yv{~}~~zxvtrqqsvtnlquusrstvy||wuvwqighhfda_]ZWTRPONOOQTX]^[\cjmopsw{~|zwtqnjgca_]\[[]__ZWZ_`^]]^`bdgjmoqrtvy{}|z{}{yxwvvwz{xsuz|{zzz|~}yuqqtrkeeggedb`^\ZXVTTTTUVY^ba^`hmopqtw{}{xurokhda^\ZYXY[]\WUY]^]\]^`cfiloqtvxz}|zxwvutuwz{xtu{}}||}~~|xtqpsrlfeggfedba_][YXWWWXZ\addabioqrsuy|}}}{yvspmifb_][YXXY[]\XUZ^`___acfilpsuxz|~{ywutssstvyzvsv{}}||}~{wtqrtrkggiihfedb`^\[ZYYYZ\_dfebelqrstwz}}||{yvtqnkgda^\ZYXXZ\^[WX]aa`abdgjmqtwy{~~|zxvtsrqqrtwxvrsx|||||~}zvssuuoihjjihgedb`^\[ZZZ[]_cffcdkprrtvy|}||{ywtrokheb_][ZYZ[]_]XY^bbbbcehknquwz|~}{yvtsqqpppruwuqrwz{zz{|{xvvxvpkkllkjhgeca_]\[[[\^`dfebekoqqsux{~}}|zwurolheb`^\[[[]__\Y[`ccccdfilosvx{}~|ywusqpoooprutqorwyxxyz|~}zyz{vpnnonmkjhfda_^]\\\]_beebbglnopqtwz~~~|zxurolieca_]]\]_a_[Z^bcccdfhjmqtvy{}~|zxvsrponnnnopmihlpqppqrtwz}|{{{zywurpmkhfedcccegigcdhlmmnoqsvy||{{{zywuspnkigedcccegigcchlmmnopsvy|{tmheefgilnopppqrrqljnqrttuxz}{||wqnnnnljhgedbaaacehknrutolmljgdbcglrzzusrpnkifdba`__`acfimqrporwzzzz{|~|xsojfb_\[ZZ[]]ZWY^abbcdfhknqtwy|~}zwspmjgdba``aa]YY]acdegkoty~~{usttsrqomljhfedcccdfhkkhgkprsstvy{~~|zxvsqomlkjklmmjgimpqqqrtvy{~}wuutsqnligda_\[YYXY[]_^[\afhjknptx|}zzzywusqoljhfdcbbcdfhgdcfkmmnoprtwz|~||}}|{zxwusqonmllmnprromotwwwxy{~~~~|vqpoomljgeca_][ZZYZ[^`b`^afjlmoqtwz~}{{zywusqnligedcbbcdfgdbcgjlllnortwy|~{z{{zyxwusrpnmlkklmnqrpmnsvxxyz|~}}~|wqooonljhfdb`^]\[[\]_acb`afjmnoqsvz}~||{zxvtqoljhfdcbbbdffdbbfjkklmoqsvy{~{zz{zywvtrqomlkjjjkmopolnruwxxz{~~~}wrqppomkigeca`^]]\]^`ccb`bgkmnoqsvy}}}|zyvtromjhfdcccceffcacgjjkkmoqsvy{~~{{{{zxwusqpnlkjjjjkmonlknruvvwy{}|vsssrpnljhfdb`_^^^^`bcc``dhklmnpsvy|~~}{yvtroljhfedccdffebaehjjjkmoqtvy{~~|||{zxwusqomlkjiijkmnmjjnrstuvxz||wuttsqomkigeca`____acdb`aehjlmnpsux|~}{ywtromjhfedddeffebbehjjklmoqtvy{~|||{zxwusqomljiiiiklmljimprstuwx{}~yvuutrpnljhfdba`__`acdcaadhjlmnprux{~~}|{ywtrpmkigeddddfffcbdgjkklmoqsvy{~}{{{zxwusqomljiihiikllkijnqsttvxz||wuutsqomkigecba```abdecabfjlmnprtwz}~{zyxvusqomjhgeddddeghgedgknopqruwz|~zxxwvtsqomkigfedddefhhfefjmopqstwy|{xwwvtsqomkigfeddddfghgefilopqrtvy{~{xwwvtsqomkihfeddddeghhfehlopqrtvy{~|xwvvtsqomljhfeddddeghhfegknpqrtvx{~}ywvvusqonljhfeddddefhhgegknpqrtvx{}}ywvvusqpnljhgeddddefhhgegjnpqrtvxz}~ywvvusqpnljhgeedddefhhgfgjmpqrtuxz}~zwvvusrpnljhgfedddefhhgffjmpqrtuxz}~zwwvusrpnljigfedddefhhgefjmoqrsuwz}~zxwvutrpnljigfedddefhhgefjmoprsuwz|~zxwvutrpnljigfedddefhhfefjmoprsuwz|~zxwwutrpnljigfedddeghgfegjmopqsuwy|~zyxwvtrpnljigfeddefghgeegjmopqsuwy|~{yxwvtrpnljigfeddefggfeegkmnoqrtwy|~~{yyxvtrpnljigfeddefggfeegkmnoqrtwy|~~{zyxvtrpomkigfeeeefggfdegkmnoqrtvy{~~{zyxvtsqomkigfeeeefggfdegkmnoprtvy{~~{zyxvusqomkigfeeeeffhdp|zyxxxxxy{|}~~}yyzxvxxtqmjlpw}|{yxtokhfdcccdfhlotx|}ywtqonmmmljkov|sy|}|xtqmjhfdccdefhknrx~}{yxuqqruxz}|su||~{xtqnkhfedccdfjotxz|~~|upr~~|}~~}|zxvtqomkigedcceghhhjnrw{{uppv~{yzz{|||||{ywtqnkihhhfddfimquy|{vpjgiq}}{yxwusrpnllllkgeeefhhijlmopqtvy}{vsrqonpv~~}}|||}}|ytqonlkiihijlnqtx|}ysmhedgmu}ywvtqmkjjjjjiiihhhhhijklnqrsstw|~{yvspnlmpu|}||}~~}{xurnkigghjnqtvy}|vpjfcdiqz~zvsqnlkihgggggghjkkjijlopqrrtuwy{~~~~~|zxuqoopu}}|{{{{|}}}}|{xuqkhhjmquz|vpkhghmv|vqnkihhhhhfddfhijjkkmnoprstuvwwxxxy{zwvuvz~{wusrrrsrrtx}|wrmjjmsy~xrlhhltztnjhhiihhgggghhijklnopqrrstwyzyyw{|zzz|~}xupjfc`]]\\]`cgmrx|~|yusv||urquule`]\\]_acfilnqsvxy{|}~~}}}|{zyz|u{~wz~yvtstuwyyxvroligfgijmpty~}yy|yskc\YZ`kxzvssstuwxyz{{{zzyyyyyz{|~yoil{{snnquy}~{xtqnkiijmqv{~~|z|wqou~}|zxtpkfa`cly~}}|{{{{{|}}}}{xsokjlr|}wtsuzyrnlnqux{}~~~|{zyxxxz}yoheehmt|~|zzz{|~{vrpsz}|zwtplgb^[[_foy}yvspnkjiilpw}{uqpquz|zwusrqqqrrsuy}{xusrqqrstuwy{}}zz}xsmhc_]_ciqx|~}zwsqnmlllmmmnnmmlkjjjmrx|{}~wqjecdipyyogcdhmruwvutsrrrrsuwy|{xy~|smkmqw}~ytojgdba`aabdegijlmopqrrrrrstvz|zwutsux}|xusstuvvtoic_`djpuyz{{zz{{}~xog`]`ivztokhfdca``____`abdfhkmpruwz|}~~xsommqw{vrnkihgghjmpsvwuqlgegmt{~yuromkhgedbaaaaacfgimoqvzz}}xxxx||qfcabglt{zvqmjhgffefffgikmoruy|yrnoty||}ung`[XY]fr~}{ywusqpoppqrux|xx{tuwyz{{|{|~~{uniginty}~|zyxwxy{}~|{||}vjr~~|zwspligfhkpw~~zxx|xmehw}rkhhjlnoprrrqomjfa]YVUV[cn{umkrxttux{|{xsmhfhkortsqnkhgginu}}tja[\fx{tolkjjjiihhgffeeeeeeeeffgikot{|wpkgglu|zywvtsrqpooopqrux{~~{uojhjpv~{upnou~}wpkfccflt}}yvtsrsstttutttsrqqqruy~xrnjijmrw}}zxvtsrqpppppqrsuvxz|~|tlgfjq{~{yxvvuuuuuuvvvvvtsqooqv~|{zz{~xqkgfipyzsmihilptusojfddgjnrvy{}zqkkq{}wrnljiijklnprtvxz|}xurpnlklot{{uokhedccccccccbbbbcfjow~~ytnifdflu}wpha]\^bgknpqqqqqrtvx{~zpe\VUZet}wrmifca_^]]]]^_acfhknqsvy{}ytu{xphc^\\[VRUY_k|}wrqsxzqid_[YWWVX]ix}qdYPKMU`my}unf`]ZYXY[\`dinqu{~xs^WWY\_bdfhlrx~zvw|~}~}ric]ZUMEBFMSUWWWZ\\[YWVX]dlty}z}wrmg_UI>746;CLV`irz{pbUPVduzvtromkigeb_]^djielx||yrlhc`\YVSQRW_goz~zvqlfa\Z[_foy|xtqnnquztja[YYZ\^^]ZWRLGEJSQN[ffir||}|y}~}ytojhfeeffffeca`^^`chmsx|yuuwyvmnujhojefjqx}~ytokiijnsx}~wmc\WV\gtsq|vknlf_YUSRQQRTUVVUTTSSUY`iqy~|||~{ywuttux{~~yqsuhonjv{vqmjhhkqx}zxwxyyzyxvtqnkhjt||z{~~}~}vojfc`_^_chnty}}|{zxurnieb_][[\^aa[Xe`glhtz{yxxz|wttw{~|umcZTPPRW\`dfilosuxyyxvtqmjjqshpjojdklonpprtvvuqmjilrz}yvuuvrfppu|~{{~{xvuvwyt|~{wsnid_[WTQOMLNQYbmx~{yyz|~~||{{tnjfdcbceip|vvzxvzypnkkjjkmorstrqoorw}~wpkkpx}{y{~}}zwxz}yrlgeehknonlkkmpsutqke`]\]`bdedeiqkjomrwqqsuvxz}}xqkhhlqvxwuqnlkkmosx~zt|vwvu}{zz{|}|zvpib^]_dimpsv{~|}xqnvopvw~ytoic]ZY_Z`rz~wohc`adgjjgdaaeltz}}|{}yrlikqy~wspnlkifc^[Ygikqsukjiiijlotz}~{urqsuvtqlhfdefilqx~|{~{wwzurorw~zqjggknppnmnrw{{xrjc_]]^`accc`^Yagbfgjdjpv|}yvuz~{qifhntyzwrpqu{~|yvux}xw}{}~xpkhjov||zz~zvttvxy{{{zxss|}~~}ytokhea`alqmuxx~|zxtokhhkqwzxqha^bkt{~}{z|{urswyzzz}ytssuvvvutrogeoklnilrstsrppqu{ytpmmlmmmlnrysnlmquwupljmt{zsmknvyspsz}xwy~{vsnj`]fbffeouy|~~snpw|zywwwuvyvmgddeea]\_guzwvvx}uxxxxopqqqrty~}ywz~zy~~}zvqmjjiibgrqyxzxz~}vqpsx~{wtstuxz|}~~wsqszzwx{~~|zz{~|ywuvwxvpib_agpxzyvtvz}vngefinswy{|~zr}|~~~vpkigfeecccrvu}{~wtw|{vsuz}|{{~}zyxxwwxz}~}yrlhiow~|xqhronqkqvwxwvtssu{}vpmjiiihjq~wrqsx{|ytnmpw~~zxy~ytrpnllmnnlga[X[bny{xzxz~|vpjgeefiknr}{smihkpstpjedhovzyvrprw}}|z{{~~zx{{z{|~~~}yumwzvz{wtz{}|{yxy|}vsuy~~wpkkoty|{wrnkhhghgjn}|}ywy}}xx}}~}~zrlknt||{~ztqpqrsttspmfiunqqummrsttsstv{zwx}~zvtsrsw}yx{ztprw}ytrsw|~u|{{||}|xrlebciqx|}{z{}|~|yt}yz|}}|{{}xrmjggfimyzs~~|vqnnrvyytnhehmsxxuplkmry}wqoqw~|ytpo|ususxmmnprstvz~{|{ursw{~}{vqlhecddiozvs~}yxy}~wrpry|unifhmu{~}zxx}}wrpooonljfdfunnsq|uqtvxyz|}~~{{|xussty}~|xvw{~ytru{~zy{xw{}}w}{{|||zvpjecejry}}{xx|}ywwxyzzzxx||z{~ytpmmmpu{so{y}z{}yurrtx~{uqqtz{vtuy~{{uollpw~~~}zz|z}{wvuvvxz}zvux}ztppsvz{zxtplihhkputjw||{xz~}~}ytmgbadjqy}~}{{~{wutrqonpxrvyvv}vutuwz}}z{~xuux|}zwustv|~~~ztruzzvuvy}{vs{yzzrs~||yywvtplhdcekt}~|zyxxwy}z~{|xspqux|}}|zxwwx{u}yvtuw{|vqnosz|xuuvy}}yu{}t}xtqru|~{yxwvw{v~|~y}|xyy{}yspptz}wroorvz}~}{ywvwy}s~}|}|xwz{yxy|~|xu{z||xrnjjmsz}zxwvvv|u}|}zz~zzz|~{xy}|wuux{~~|{z{|~|q}|{|~~xsqsx{vtsux{~|{~~w}yupkhhkqy~{ywvvw}q|zzzu||zurrux{}}}{{z{|~{xp}{{|{uqprx~~{yyz}~|}||zt}}zvrmighkrz|zxxx|}px~|w|z{~~xsqqswy{||{{{{||xrp~}{z{}{vstx|{{}}yz}zuu{~}{xtnjggint{~|}}|{|~x}{{|yx{{uqpqtwy{|{{zzzzwqlxw~~~}}}zxz~|zyyz|}}}zwx~v{~rtw{||zwsokgefiou|}zxzww~yww{ztpopsvxzzzzyyxwqkj}}uz~ywy}{xwwxyyyxxwyvyrrtxxxvsplhecehnu{~|yy|w}u|xvw{xromnqsvwxxxwwvsnjm|y}|xvx|{xwvwwxxwvvzuw|soptuuspmjfddfjpw~~~~v{v{{wuvy~~xrmkkmortvwxxxvtomtz}xvw{}ywvvvvvuuuyryvvnnqrssqoljhhjnt{~vw|v~yussv{zupmmnqtvxzzzzxuqmrw~~yvvx}~zwuttttsstws|rtpqstusqoljijmrx~}}v~wvw~zvssuz|vrpoqruwxxxxwtplnz|{{wuvz|yvttstttux~uwupqrsrpnkihhkot{}}zvtsw{xwwz~ztpmmnprsuuuusqmlrx~~yutvz~{yxwwwxy|x{xxtnmmmmkihgghlqw}~~~uz|w~tz{xwx{|vqmkklnpqrssrpnlo{x~{wuvy|{zyyy{|tqyokkkjihgffgjou{~}~yyx{yzwuux|~wrmjijkmopqqpomkmwv~{yy{}{zyxyz~}r~qw}rljiihgfeegjntz}|}}{{x|}yvttwz~xsnjhhhjklmmlkiimxu~}zy{~~{zyyy{~}q|ssumihggfedefimsy~~}~||{wy~~{wtstvz~}xrmjggghijjjjihinzu|yxz~~{zyyz|xq~qs~tligfeeddegjot{zxww||yusrsvz~|wqligffghiijiiiksw{xx{~|zzz{~rr~mu}sligffeefgjnsy}zx}vx~}zvsrrsw{zuplihhijklllkjkoyy{~}zxy|~|zyyz|zoxvn}{rmjiihhhhjmqv{}}{||{yuy|xurqrtx}{vqmkjjkllmmlkjjpzu}||yxy|~{zyyz|yq}vr|snkjiihhijmqv{}{|~z}z|xuz|yvsstw{|vqnkjjkklllkjijozs}{|ywy|~|{zz{~{r}wr|smkiihgggilpuz|zz}z{{zyuy{xutuw{|vqmjiiijkkkjihimxtyz}yxy|~}||}~rzzo}}smjihgffghknsx~|zz{|zy~wz}yvttuy}}wrmjhhhijjkjihhksys{~|zz|~|||}urptvnjhgffffgilqv{}{zz}|{zy~}zvtssvz~~ysnjhgghijjjihginys{z|{|~|{z{||pvzmy|rkhgfeeeegimrx~}{z||zxy~{wtrqsvz~|vpkhfefghijjihhjq}~s}~{z|}{zyz|xnysm|xnifeddddegjou{}}}}{|wz}yurpprvz~xrmifeefghijjjijnxzz~|zz}}{yyyz}}pp{jt{qjgeeddeegjotz~{yww|~zvspopsx|ztokgfefhiklllkknux}zy{}{yxxy{sm|mo~~umhfffffghkotz~~{zxv{~zvspopsw{|wqligfghjklmmlkmtw~}zyz~}{yxwx{~umzpn~xojggfffghknsy}}{~zxvz~zvspopsx|}xrmigggijklllkklsv}|yyz~}{yxxz|un~opwniggffffhjnsy~||~{ywv{{wtqqruy~|wqliggghjkllkjjlt~u~|yy|~|zzz{~rq~lu~slhgffeefhkotz~|z{~{ywz~{vsqqsw{ztojgffghjkkkjiimxvxz|z{~|zz{|znxul|ypjgffeeefhkpu{|zy{~}x|}yurqqsx|~xsmigffghjjkjihinzs{y}|}}{zzz|wnzrm}xnigfeeeefhkpu{~{yy{|y}|xurpqtx|}wqlifefghijjihginzr|y~|~}{zyz|wmyrl|xnifeedddegkouz~{yy{}x|}xurpprv{}wrmhfeefhijjjihhmxtyy~|}}{yyy{~ymuujyyoifeedddegjotz}{z{~{xz}yurpoqty}~ysnjgeefhijkkjiiluzu|||~~{yxxy|qn~~kp~}skgfeeeefhjnsy~|{{~~|zx}~zvspoorv{{vqlhfffhiklllkjlq|u}{tlilrytdXPJGGKQ[hvysrrsuwy{{{zzzywsmedo~xn|pcYSRV_l{{naXQMLLNPTVX\bm|w{wqlgdcflt~}}ule`_agp{zp~yh`aehijihec_[XTSSUX]adfec^ZVTSTWZ_cgknpru{~xrlfb_^^aeks|}uz}{xvtrsuwz}|xsonnosx}yu}wz|~{z{}~xqkgc`___^\[YVUU\gog]myll{~}{{|~qky}jkzzqjfddddefhkotz}|~ump}{glyob`ejmopppomljhhimrx~}}~}~{xutsrtvz|wj`lsa]kmcZTRPPOOOQSW[ahmqstrponptz}}|vpljiijklllkjijp{|o{ys~{vpkgfhkptxzzyvsqnmllmpsysotvzwvwxyz{}yx{~|xtpkfcaacfjmnnkf`[VRQPQSTVWXXXX[cpxphyuu~}v}zrnlkjihijkosx|~zvsqqsw{~wnkusiy|ngiotwxxxwuspmkkknsx~{wtsstvxz|~~~~~}yurpnnnptvsh\epaXfld[VSSSSSTUX[`flrvyyxusrsuz{uqnmlmmnnnmkiinx}nuzpzzupmlmpty}~|yvsqpppqtx~tlxsp}vrqqrrsuvy}|y|}yuqlhdbbdgkoqqnje`[XVUVXY[\]]]]^dpzwjtzs{~xxronmlkjklnrvz~|xtrqrtx}xpq~rp}plpuy{||{zxuromlmptz~|xtqppqsuwyzzzyz~zvsqppprvywl`gtg\ipi`[XXWWXXZ\_diotx{{zwustvz~~|wromlmmnnnmljiks~uost|vrpprvz~{yvtsssux|}qootyroooppqrtw{|y}~{wsnjgeegjnqssqmhc^[YYY[]^``a``bgr}zmu}ux}swpmkjjiiikmpty}{wtssuy~ws{~q~ypqvz}~~}{xurommorv{}xtqonnprtvwxxxxz}yvsqppqswyuj`jtd_mpia\ZZZZ[\^`dinty}~{ywxz~|zyz}}wrnkjjklmmmmlkknvusuy~yussvz~|ywutstux|zno{lu~vpnmnnopqtw{}zz~|yuqonnquy|~~{xsnjgffgiklmnnmmovw~~}{ywwwy}}pky|klz{skgfffgghjlpuz}}{z}}yuromnptx|~~|xsokknolhdbaadhkq{~}}~shqweanoh`[ZYZZ[\^`ekqx~toruwyzzzywvspnnorvy}}xrlgca___`abbbbcfn{x~{yxyzzsf_lrbevytpopqsstttuwy}|xtqqsv{ztyt{~ssx}}{xvvwz~~zvsrrstuwwwwutu{vzw}zxvvx{~}vihwsckvsjda`aaabdfinsx~}}~yz~}zvrnjfddfinrvxxwtpmkjkmortvxxxwx{~}{yyyz}wmurjw|umhfeddddefilpuy|}|yvsqpruz}zwwx{~ytoljijklmnonnmnr|u|z{zz}}yvsqpooqtx{xnfpzkhw{tmjiijklmorvz~~{vsonnorvy{{yupkfca``acddedccdhr{wktxq{~u~xs|tomllkkllnquy~|zyz}|}|zwsvz}~~}|zwtpmjiikoswz{zxtolihhikmoqrrrrsw~~{yxwxz~~tio{odqwqhc`_____`beinrw{||{xusstx|}zxwx{}ytpnllmnppqqpooqx{v{||yy{~}zwusrrsux|}xlixxhmzyrkihhijjlnqty~}yuqnllnptwyxvsnieb```bceffffefku|pw}u~sx{p{}upmlllllmoquy~~|z{}{x}uuy}~|zwspmkjknrvy{{zvrnkihijlnprrsrsu{}~{ywvuvy|~{pgpyjervogcaaaaabdfimrw||yxxy}}zwuuvy|{vromllmopqrrqpqt|{y{{yy{~}zwussrsvy}}vklzvhp{xqliiijklmorv{~}~{wsolkkmqtwxxvrmiecbbcdfhiiiiikq||s|z~}}}vq~qrxqmlllllmnptx|~|{}|zwuy}}{xurnlklnquy{|zwsoliiijlnprsssstz}~{ywvvwy|~zogryigtvohdbbbccdfhkpuz~}zyy{~{wustvy}|xsomkklmopqqqqpqvw{|{|}zwutttvy|~zoiv{klyzslihiijklnpty~~|xtpnllnquxyyvsnjfdccdeghijjiilr|zs{{~}|}sr{ls}zrlihhhhijlnrv{}|||~|xtqooprvy|}|yuqmjhghiklmnnnnnrzyz{}{yxxy{uls~qjv{unihgghhijlosx|}{{}}~{wtqooqtwz}}|xtpligghiklmnnnmnr|w}{}{yxxy|~tlu}okx{tmihgghhijlosx}}{{}}~{wsqooqtx{}}{xtoligghiklnnnnmns|v~{}{yxxz|~tlu}pkw{umihhhhhijlosx|}{{|}{xtqpoqtwz|}|yupljhhhjkmnnnnmnr{w{{}{zyxy{wmr~sju|vojhhhhhijlorw{}{{|}~|yurpopsvy|}|zvrnjhhhiklmnonnnpw|w|~~|zyxyz}{pmzzkozyrlihhhhijknquz~}{{}}~zvspooqtw{|}{xtolihhijlmnoonnos}w}{}{yxxy{~wlq}tit{wojhhhhiijlosw|}|}}}|yurpooqtx{||zvrnkihhiklnoooooqvw}|zxwwx{~}skt|ojwztmjhhhiijknpty~}}~|~~zwsponoruy{|{xupmjhhijlmopppops{{z}}zywwxy|xmmzwipzwpkihhhijkmosw|~}}}}|xuqonnpswz{{yvrnkihhikmnopppprwx~}{ywwwx{~{pkwzklxyrlihhhijklorv{}}~||yuronnpsvy{{zwsokihhikmnoppppqvx~~{yxwwxz}|rku{mkwysmihhiijklnrvz~}||yuronnpsvy{{zwsokihhikmnoppppqvx~~{yxwwx{~{pkvzllxyrlihhiijklorv{~}}~}|yuronoqswz{{yvrnkihhjkmnoppppqwx~}{yxwxy|ynmzwjpzxpkihhiijkmosw|}|}}~{xtqoopruy{|{xuqmjihijlmnopoooszyz|}{yxxy{~~uls|qjvzunjihhiijkmptx}~||}~~{wtqpoqswy||{xtpljhhijlmnooooos|w}{}{yyxy|~tlu|okwztmjhhhiijkmptx}}{{}~~{wtqppqtwz||zwtpljhhijlmnooonot|v~{}{zyyy|~tlu}pkwztnjhhhiijkmptx|}{{}~|xtrppqswz{|{xtpljhhijlmnooonos{x{{~{zyyy{~vmr}sju{vojihhiijkmosw{}|{|~|yurpppsux{|{yuqnkihijkmnoooooqx|w}~|zyxyz|zpmyykoyxqlihhiijjlnquz~}||~~}zwsqooqswz{{zwsoljhhiklnoopoopt}x}|}{yxxxz}~vmp{sjszvokihiiijkmpsw|}|}~~|yurpooqtwy{{yvrnkihijkmnpppppqwx~~|zxwwxz}|sks{ojvztnjiiiijklnquy~}}~}}zwsponoruxz{zxtpmjiiiklnopqqpqt{|{~}zywwwy{~~wmmyvjpywpliiijjklnptx|~~~}~{xuqonopsvyzzyvrnkjiijlnopqqqqsxy}{yxwwxz}~zpkvylmxxrmjiijjklmpsw{~~}|yurpnnpsvyzzyvsoljiijlmopqqqqrwy~~{yxwwxz}~{rkt{mkwysmjiijjklmorvz~~}|yurpnopsvyzzyvsoljiijlmopqqqqrwy~~{yxwwxz}zqlvzllxyrmjiiijklmorv{~}}~|yurpooqsvyzzyvrokjiijlnopqqpprxx~{yxxxy{~~xnnywjpywpliiijjklnpsw{}}}~~{xurpopruxz{zxtqmkiiiklnopppppszz{|}{yxxy{}}uls|qkuytnjiiiijklnqtx|~||}~{wtqppqsvy{{zwspljiijklnopppopt|x}|}{zyxy{~}slt{okvytmjiiiijklnqtx}}||}~{wtqppqtvy{{zwsoljiijklnoopoopt|w~|}{zyyy{~}tmt{pkvytnjiiijjklnqtx|}||}~{xurppqsvyz{zwtpmjiijklnopppops{x||~|zyyy{}~vmr{rktzuokiiiijklmpsw{~||}|yurpppruxz{zxuqnkiiijlmoppppprx|x}|zyxxy|~zpmxykoyxqljiiijjkmorvz~}||~}zwsqppqsvyz{yvsoljiijkmnoppppqu}x~|}{yxxxz|~}vmp{sjsyuokiiijjklnptx|}}~|yurpooqtvyzzxuroljijklnopqqqqrwx~|zxwwxz|~{slszokvytnkjjjjklmoruz~~~~}zwtqoopruwyzywtpmkjjjlmopqqqqrt{|{~}{yxwwx{}}wnnyujpyvpljjjjklmnqtx|~~~~{xurpnopsvxzzxurnljjjkmnpqrrrrsxyxj]VX_ghmsd^^ecW^mmgn}z}zvwodefca`_`de_emozyyojaZWW[dow}|nemukionof\__]\\Z\aeemxwx|{umhb`c^Yadbbejnpplorgabdmncgvwpoyvuwzzwqssfba]Z[]bkuy~xxvrmjggjkhqyvxzxrkfa`c^\fhghlqwyxv{|pllnwvjp|zpr}}w}v{|miqmimhcacgkmljomccb_^_bgpxyzuvwpqyyxy}usrx}tmyypx{u|~}yvwtqpnmnngfpqryymirk_bgbdgb__chllkmrjdecaacfmuyzx~wvw~srvq}usyzz||pooljigghg`bllourfhpf]ceaegcabgloonqulghfcdeipwy||yxztuur|rqxxxz}~xmmljhgffge^bllouqfipg_egchjfdeioqqptwnjkgefgkqxy|~{yzwuvq~~|spvxxy}|~ynlljhhffhf_almoushirkafieiljggkpsrruyrkkiggikqxy{~|yzzs~{qy~}votxxx{|}|qlmjihhghhb_jpptumgqrgdjhhnnkikqttsu{xomlihikovzy~zy{txss}zqqwyyy~}|}wnmliiihhif_eprrwsilvofilimqolkotvuuy|uonkijlnsyy{~|xx||s{{pu~|wprwzyz}}}tnnljkkjkkeaisstwqipwnglmkpsqmmrwwuw||tpokjkmovzy}|ywyws~wpz}{tpuz{y|~}{ronkklkjljbdpvuwvmkvvkimlnsuqmpvyvvz~yqpmjkmosyyy}|{ww{|sy}ps|xqrx|{{~~vpomklmllmfblwwwxrjrzqimnnrvtoouyxvz~|tqokkmnqwzw~|}xwx~tv~qq}yrrw}|{~yqqnlnonnoickwxwxtkqztkmoorvvqptyyvy}vrpkkmopwzw|}{~xvw~~uuqq}yssx~}{~yrrnlnponphcmy{xysks|vlmnosxxrqvzyvz|vrpkkmopwzw}|{~|xwx~|su}pr}z~{~{vsvuv}}~wwwutyvqx}~yvxxuxwoq~y{xtturnlkmr|zw|~w}ujq}~wz~{~}~{wppsrnqmdgt{xwxmn|}rmprtx}wqtyztu|ztoleadgfjpln|~|urptvnitvhdq}|x~}{|~~zqv~|puqortuy}uquzysx~zvrogeilkqvqv}}zvtst{xuy|{tx|wpljiopifstgft}z~|z{zz|y{~~|~{}zwnlptqw{vz}}|wz}{|v}}yxzzsnmmmsytpswvpsyuokjhmqlgsxkht{|{z}{~||soswtxy{||z{tv||x~{swy}wswxrlklloyupquwqqzwrnmjlrpho{qir}|zzz||}~xqrxwv}z~w~}urx}wy~us}xzzrtxvmkklluyrptxuox{uqnlkqtmkyylm{}}{zz}|z{|~tquzvz{|||w~{stz|v}}sv~v{vqvyslkmmozxqquxsq{ytqpmmstln|vkq|zzy~|~zz~|}rqwzu|y~|xx~xrv}{wyrx{w|sswyqllnmr|vqswxqu}xtrqmpuskt~qlw}{zzy{~z|||{}woszww|z}~t|ssz~w{~ttv{xqvzvmlnonz{ssvzuq||vtsontvon}ymq|yzx}}z}yw|{{ppxyt~~x~tyvryzzxt}wy{quzyolnqox~usuywpz~wutrmsvql{|op}}{yzy{~z~yw~y~~}pow{s|x~~}vvxrx{yzt{xx|rt{{plnqowvsuyxpzwvusmrwskz}op}}{yzyz~y~xv}y~}|ooxzr|~w~~txwsz{zyu}wy{qv|{pmpsp{wtvzxq}xwvsmswrl|{nq~zxywz|y|y~vzy~xmqzxs|w~~q~tt}xvxu}xqy~xmmrrq~uuw{ts|xwvpovwnpvnv}~~xwyv~x{}x|wzwz~rmu|twxz|~xs|sxy~v{|w~st{~tmotqv{uuyzqyzyxvnqwvkvqo{|~{vxxu}w}}x~u}w|}~pmv|rzw|{wu}v}}z~}wzwrtyv~~zz~~u}}|yru{xn|ss}yvxwu|{t{z{t{}|}oyyrw}~}x{ljsyow}ty{xu~v|}z|wyyrtyv|zz}u}~}|{rt{zoytr}}~{vwxt{~}tyx~tyzpv|rv~~}y}mirzpt}twyzqw{|{zzw|rsyxyzz|wy}}}ury|rsxqy~}~vuxs}zuwyvwyvqss{}~~}ythmxvo|yt~||rzzw~|zu|urv{u}zz~|t}~~yqv|xn~rt}xuwvu{{t{y|u{~{~ox{qv~}}x}mir{qt~tw~x{owz||~x{u~~rsyzx|z{yw~~vqx}up{qw}vtxsx{}~wu~||yv~z}{o}wrx|}wzjkvzox|sy~xvrv}|{{wxzqt{w{{z{u|~~ss{}pvvr||{{tuwrw~txxvyxssrs|~~~~{{qhp{tp~vt~~y}~o|yy}}}y~t}srw{v}zzzu~xqw}wo}qw}~uswsvz|~xu~{{ywz~zo~vry|}xxilxyo{zr|}{xqu|w~|{u{vqv|v{y}}t{qu}zn}ru|}vsvts|yzt}~y{v}{|}o{yqw|}x{jkv{ox|ry|}vtr~w}{|~vzwqu|w{y}}t|qu}zn|ru|}wsvts|zyt}}y|w~{|}p{xqw|}xyilx{oy{rz|~zvqt}x~|zu{vqw|w{y}|t{qv}yo~rv|~}urusty{~xuz{yxyzpvry|}~yuhnzxo|xr~}|~wy~n{yz|}~y}v~rryzx|zyxxvqy~srxr{}z}rsvp}v~tyww{ysurt}}~~ynit}rt~sv{}|svnw~z||xyzqu|x}|y{u~rs|}pxts~{{xqstp~v|t{v~w}~{qy|qv|}y}kjv|pv}rx{}{ttpw{|}~wzyqu|w{y{~t~rt}|ozsu{{vqtsq|x{t|~w~w~}|qz{qv~|}x|kkw}pv}rxz|zsupw{|~}xyzqu{x}|y{~urs|~qxtt{zxqstov}t{vw}{swru}}~~zmju}st}suz{{r}xmx}z|{{w~rtzzz}zyx{vrztsxr{~y~rqtoyv~uxw}xzyxsusz~|}~|uip|yp|xr}|z|vvov{y~~}{v|vrw{w{y}|v|qv~{p|rv|~{uqsrq{x{u}~w~x~~|ry}ru}|}~z~mjv~tt}suzzzr{ym~y}z}{~w~ssyzx}zx~yyxqyxq{ry~z~sptpux{xvzy{y{}r}yrw~{}zzjmy}qx|qxyzxruoyz|~yy|ru{x}|yz~wts|svvs~|y{qqso}uuzvx|zvutt{}~~}|qis}wr}ur{yzsx}nzz{{~~{w}usx{x~{x~{xyqxyq|rx}{}tpsptx{xwzy{y{}s~xsx~||{xjo{|qzyqz}xyusqs~z|}|w{xrw{x{x|}v}rv~|q{~sv|}{vprqrzy{v}w}y|~s{|sv}{|{zkmy}rx{qwxyvrsqz{|}x{yrv{x{x{}v}rv~}qzsv|}zvprqqzx{w|w}y|s|{sw}{|{ykoz}ryzqy}xxurqs~{|}|x|xsw{x{x|}w|rw|q}}rw}{{tprpsx{yxzy{z{|t~xsx}||}ujq}zr{wq|{xxrv}ny{}{}~|x~utyzy}zx~z{wszvsxs}y}qpro{vw{vy}{wwtu{|}}|~nlwuu|rtxwvp|vozz|{z|sv{y~|xy~xtu}sxtt|yypqqp}w}w}vy}uztv|{|~||lmy~tw{qvxwuq~tp{z|zz{sv{x|xz~x~sv~~szsu|}zwpqqq{x|w~}w~y~~u{~tv|{|~|{lny~tw{qvxwuq}up{z|{z|tv{y|xz~xsu}txtt}yzppqo~}v~w}vy~}wyuv{{}}}~nlwvu|rsxvupzxo~{z}~}yuuzz{}yx~y}vs{wtxs}xrproxvx{w|z|{{vxty||~{~tks}{s{wp{{vvrspu}}~}}}y|xtw{x{w{}y|rw}s{}sw}|zvpqpq{x|x}v~z~vzuv{{|}}}nmxvv|rsxvupyyo|{z}~y~vuyzz~zw}{{xrzzs~zrz~z|tpqoux{zyzx|{}u}|tw|{{}ylo{~txzpvwvtp|up{z||z}tvzy}|xx~yut}vvut~x|qpqo{vx}w~z~|ywwuz{}}{~qluzt|uq~yuupu|oy}{~~~~y}wuxzyzw||zzsy{s}{ry~z{uopnr~tsxvx{{ss{u{}idff]\eouwfaicbdf`coyvy{vojkmgrxttpdY`kmdhkdk}mfmgdfgacozxywuslpvkb\^b^ipnpncX]jndfh^ctyntmiqyucZYWWdgdhfe[Zhhjornnx{xtqljusnokg[Zfdfjniku~yx|}pcgqqfig]csvmskjs|wg``_bqrrussikwvx{}vv{y}w|z}youy}sqywe^]Z\iihkhf\`kjmrsnqzxy|}u~vrrpv}rz~z}y|{||zzy|||}xu{y{zkfnvpind_l|~pppfluyj]Z[Yblimmlg_kqptwupw~u~}~|{z~x|xy}||xw|{stwuz}uopupx}|yo`akpfeg\^m{xkokenxwg^]]]iomrqpherstwzusz|v|~|~y~y}z|vv{wqrtryyqlnrnw}zzuk^akneff[_p}wlqkhr{xh`__`nqpusrihuuvy{vt|{v~{}~y~y}{|vuz~xpqtqvyqlmrnv}zzvm_`kpgfh]_n}znrnir||lbaaamtrvutmiuwwz|xu{}v~{|~yy{}zyuy~zqqsrt|smkqor}{zxqb_hpjeja]j{rqrjpzsfcdbkvtwxvrisyxz|{vyw{{}~}}z{y~y~uw|}uprsqzvpkoqoz}{zui_dnpgig^euzqvonx}meeeftwvzxwnnzyz|~yw~}w~{~|~y}yz~yztx}{rqsss~~uolqqr~}|ztf`hrogke_j{xtwoq|zkffejwwx{yvmr|z|~~xy{y}|~~}|}x}x|{{wuz~yqrtrv{snnspw}}ypccmslilbcquwuovujghgqyx{{ysmx|{}|x}x}|~~~~|{}z{yyy|ux}}tqsts~wqmrrr~}|vjbisqimhak||vyrs}}oihglxyz}{xos}{}~yz{z}}}|~}{~|~~}y{y}z~vw|wrsus{zsnqtr}~~ynchrtkmkbiyvzts|qjihjwzz}|ypq}|}~zy}y~|||~|{|}|}y|y}{}ww|xstut{{toqus}~zodhrtlmlciyx{ut}skjikx{{~|zqr}|}zz}y}|}~z}{r{ylo|~v{wz}~~}|{xxqlorr}v~{umljmxyy|yuloyxyzzuwzy{xqmqrtzvz||}nhgekvuwywskrywyzxsv||stxrty~ytzvpsxxonpqr}~vqpvv{vs}~{y}~z}}trsru{soout|~tu{}{vut}~uqz|z{{wsx}xqvuqu|ww|uty~zstvv{zuv|z}rs}{z{sw{xxx}z{~w|zvyxx|ssw{voprqw{tqrxw|ru~~w|}||~|~z~{||z{||}yz~}{qt}xxxou}trqq}}ts}||||wuz}wqwtqu{}uwzrrw{vpqtsz}wsuzy|qt|||uz}|}}}~{|~}qr{xvwoq||ronnx~|}{soyzyzzvrw|wpuuptz~wv{tsw|yrsuuzyuuzy}rs||z|uw|{{}{tpxzuwpn{{snmlr|{}}zunuzxyywru{zrswrsy~{u{xsw|}utvvw|wuz{}vqxy|ws}|{z~{~ypt|}uvtmt}|xomlmy||~{yppzyyzyusy}wqwurv}xy|uuzzuuww|zvw|{}rs|{y{sv~{zy~~{upv~{tvqmw{}uomkp{||~{wos{yyzytu{}usxtsyw{|uw|yuwxxzvy||zqu~yzyrx|zyz~||}qqy~xtuno}{}rnllu}{~}ztox{yzzxtx}{svxsv||x~yvz~wvxx{}yw||uqy}xzuszyx~}~~{~vou}{tvqmv|}vomlp{}}~|xpt|z{{zuv|~wtyuuzy}|vx~zvxyyzwz|}yqvxzwrz{yx{~~{}yps{|uusms~}yqnmoz}}}zrs|{{{{vv{ytyvuzz|~wx}|wxyy{wy}}{qu}yyxrx{xwy~~~~{|yps{}uusms}yqomoz~~}zrs||{|{wv|yuzwuzz|}wy~{wxyy{wy|}yqu~xywqyzxwz}~~{}xpt||uusmu~~yqomq|~~}zru}|||{vw}xvzvv|z~|wzzwxyzzw{|~wqw}wyur|ywv||~}z~~tpw}ytvpo{}uponv~}wrz~|||yvz}vyzux}{yx|xxyy}}xx||}srzzwxru|xww|~~~~{{~|rrz~wvvptwtss}zx}{z}z~||{{}|~zz~~{rs{~wvvpuwtst~zy}|z}{|}{|}}}y{~~{rt{}wvvpvwutu~zy~|{~|}}{|~}~zz~~{rs{}wvvqvxutu}{y~|{|}|{|~}~zz~~|ssz}wvwruxvut||y|{|}|{|~~~zz~~}tsy|xuwsuyvuu{|x~|{~}~|{|~~{y}~urx|yuwtt}zwvuy~x}}|}~~~|~||~|y|~xrv|zvwus{|xwuxy{~~~}|~~}}}{~}y{~zsu{{vvvsy~xwvw~{z~}{~}}{}~zz~~~tsy|xvwtvzxwv{}y}~~}|~|~||{y|~xsw{zvwvu||xxvxz{~~~~~|~}}}|~}z{~{suz{wvwtxyxww}|z~}~~|~~}|~~zz}~uty{xvwuwzxxw{}y|}~~|~|~|}{z}~wsx{yvwvv}|yxwz~z|~}~}}~}}|||y|~ysw{zvwwu{}zyxyz{}}~}~}}}||y{~ztw{{wwwuzzxxy~~usx~ut~zuw|yw|~t~zx~}}ur}wuty~x~|}yuttwyywwyyxyxzxw{zysqtx|xlstzry}v~t~xvxzz}~~}~ypnxw~}|~t|np||{{xrpx}vxt{~t~yrt|ly{u~wnswwsuz}lgqzmw{}{yu{{|~rjp~vr{t}rsuutyurzz~svzhvvnz{pr}zzohszkt~szx{u~{zqu|{|rzvx{t~ptzyw}{wjm|xm{wp}loz|~{|rdiuywts}||uzojuosux{r|zu|y{xnbgvjg~joy|y~|no}yl{~s}yso{}{{lbnxhlwlmwzv|wx|siqvqzsop{}x{zqq}hrvmv}}x|yoer|mswy}muzzxqfoysu|yvjty~~prktzqy~yoy||||wnu~ml~yyuzgkvutvfj}{pv||xr{{z|||ojztxts|emzyt{upzstsiyyu|yqp}~y~|~kiy~mwyxr{yu|vtz}}rz|xxr~kmz~y{}}lm}jv|t{|tjw~wz~xs}}sq|x~x}tww}v|}oo}lyuz{}pw~wz}~wu~lcmzovjm}y{|po~o{~u|vxozxs|~leqmjxrtwu}|y~z}s}ojzzo|vrzpm|{stut{wnt{ro|w~{~|zms~{fdx|nr~y}nk{uqys{{jmw|~}~u}osopxy}|~yynksqsp{yyrx{|xupsnjwtswul_w{uw|kgxxwtp~~{}w|x}|xvzzxzt}pjmg|ulttksyjujv{~||lp}~~{z}vsz}z}y~yxqs|vox~sm}|~orxynq{orw~|xmmtjpzmzykq~}to~qq}vluy}zuz{~{uyyyvxmr}zstrju}jrdcwzv{rlf{}}~}}wu|zuwzh|{~fs}tv|obholqtjvqu|{xkoontzq|ujr~~tv|lv}rxxko|{|}wpjqn~{{rrowzvsdko_py~ny{qlwzv{|rrqqy~|y}|~zsumk{{zzxkutlpnbkq_nyx{qek{vtznqw}y{{|~xwkn|xl|~gpnlxxjhkjdhy{qjqvu{qzmk|}x~yt||r{rt{uj}z{{nnimw{zpolcsjkrvu{yt{zb`wywy{rz~zywrtvxthq{tv|~{utnkvnc{gmuoowxuzn^cyz|ustxsqzmoljw~|nnsldxqvsnrty{{xnjdaku}rr||}~vv}movq}}y~~{ytqhq{mllnoltuxwcfy|ldox|thj}~~z~uu}wd_osrxksxquzrgeigstsu}wimtrrv~zxoluxz|z{|||}y{}{opjz|}|pxhpzovsifiq}zvz{tmxvvttjehuzwmvwwu{{lr{wkqqs~x|vnlpggvulzom{rw}olwvyvqtpusyjiulo~wtwxuzy}|xixfb{xf|ytxw|mkbkvyvqlxki{u}}q|xqu~vn|o\y|gxw~t{x{mttm|wnjw|tw|~v|xsrv{zy^urZlsgr~|w}}}}oxep~~~||xuwyqpsxtvznlrp_fxsz|wwv|zif~ql|tx|vszyxz}puwewppzjqoywuszuo}ntfdsvwzyzrwwwr`zv{rt~mv~r~~yy{}{uw}rzwmu~}px~xylnsw|`spwssw|gr|u|yvwz}vvr}pzxxm}vttpyxjznszgh|yu~stmlry|{rsk}xy~~utx|{}prrizkjyu}vzz|uppp~nvunl~vxnzv~xy{rwxzz|d|usxs{j}yuw{nwxk~oswqqn}}x{}sw|zvzyh~}m~m{}qswm}xs~ar{}lq}y{ysi{u{ypm|yd{|hYghisr~npugmwoDJ[]d{sr}js~tkzgp~xSN`^XhiXjsqmzk}~xZ_eZV]JXwtxfipanupOUdVOcWLfrsk~h_|j]hgcgnclyulitbkvuVI[_`kfWhqqfxsiksh_h\Rnulevd\s}wn|v}|kzxenoiafe`jrraplk}sWisimycewyrwrxifpqt}|rs|||zz~}x}xrygguskmo`mxwgqj\ozu^fkeaiah~|{}lv{x|}|vq{~|~szx{zyt~nutr{{xymez~xm|st}{b[kd^glWcvzswxbu~vbfgb_gfcxxzptpgw}jux~{uguyx}t|ponprrphzu{~ssso[bffgrcXjtrcqgcpthdomfgtejyzpitgqefrlforfzx~r~zs}{rp~uoqn{oeopnroUbtslmxhnqk^eb^`fe[o{}sssoz}vchjggurm{u}sozr}~|vr|{{|~z|ickpkoqdt~}u|~jiro^efggmcXlvpamldpxqfqnho|lj|}vp|rxpqvolpxnz~|uz|rx|x|yiwzvt|wkw}vhqqrmj__qsrktogloi_aacembi~|s~xxokolnuquzu|rzr|}}||}qt{{x{v{xcjqnjpogx||v|uajuk^ghihm`]vuliumiv~upumqx}pr}xtzsruqou|q{~|~{~swu|zvyxjtvxvvvmu|vhqtrggearutpwqflunaefhgpkr{t}yokqqt|ov{zv|y~{{ry|zzvvz}obpqnltpj{}~z|jcrvjemkkhjbkwomnumo}sqrty{~ov|y}~tvussz|t|}z}~yzr{x~zxw{nkvzzv{qs||orxrfdneowvssugkxt`djkiqvq{zy~vmtuz}tu~xzz}{~~}sw|zs~vxyoisronusn|ysjjtxmgomkgmjmsoqrxpvtqv{{||px|||{rutuu}|u}}zw~~uu{|}yywxin||xwzrw~zqxtidopiuxvsvoivziallmn{xx}~y~~qpx}|{t}{|z~}z{~}y}wv}}y~}z|{uy{yx}xy{y~}u{zwr{}tz|}yy|}wwxwx|~yuytvyytxrv}|zz~tv}~|uzy|w~z{us~}~z|nw~{x{xsqmmvwonz}z~wotvnquqoy{|uy|xsszpsv|stvtrv}yy~~}qqvolpmps{w{w}mpvvtw|z}unz|{vwtoy|yv~rkporqvu|yy}vszxkjjnqsumwz|{{z}|uvxuomjftyvuz~y~{v~{{~{y~{ry|tu|qvwutx{szrv{}yyzt{zuw}wz{y{pu}|xz}{~~|ru{wpytuwu}z{zysiqysptuyz}zy{|syz}z~xqv{|z|v{~ryx|~|yy{pxxx}xy}~}}~}ut{wtmpmnxxvt~trzvsnpou~{z~~|tv~|~~~|z~~z|~vrr{~wux{wuprtvwvysxvuw{px~|yxrmryqqxs{yx}}{|qp{~vuy|~}x|{~}}wzxt}{|y~tp}xyzyvvtmyvrwztv|{z}vz{zy|}|yvvxvrnppqx}~zzwx|xuovux{}vq|{z}~}|}}|z|youu{}|||tqy|rnpsstx{|~wsvvy|uq~{xwspxzu||wyzy}|yswuw}~yyz{~{yz}|}s{|z}{wpz}wyxwurqu|tqvzwt|z{xu|zy|yx}xwxsqpurw}~}z{zvpwzx}|~up~|z~~}w~|~xz}{~toywz{{z|sp|}nlrutt}}~||ytvy~|tu}{wxusz{|zz}zy}zxxy~uy~ww}~wzzw{{|yx~~y||ytw|{uxwwqrwwtpuy{w|~x}|uy|y|{uwxutquxt}~~yzwsv{{x{~yr{}~y}}}w|~~|ww}sqzzz||zz|ur|}pltwvv|z|}vv|xvz}~zwxwwx}~z}{z~|wy|z~}xzyqz~{v{ww}{~}{|{|{~|{uzz}zvwyvpwzrqsxy{}|y}zwy{{wy~xvvttxxy}}}}wytwy|zv|zuy|~|{zy{{y}}z~}uyxrx{}zz{x{yvx}xpovxw|~y|~wx~v{}{~xww{yxz|}|}~|yu|~|||{|uo}z}x}|vx~|~~{x~~||~xt~}}}wuzvsx|qntxy{z~yzxy|zz|tuuwxy|}}{yvtx{||vxwu}|~|z|wx~z||~{}|ww}}xsz|}~y{z|{z}~zvuw{|~~}}{{}}~}~}}wz~{}~ypt~{yzxy~|utxzy|~~~zy{|~|vw~~}|{~~tw~~yw{wx~}rqy|}~}}xyz~}}}vv|~~|xyst~}~}zwzuuxu{{z~~{yxx~}}~ytxz|}~ur{~~zyy{zxxtwyy|}}{z{|{|wx~zz}{qt{~~}{ywz{uuxyz{~~{~yx|}~{t{{z}vt~~}}xyxx}~vqt{|}|~~yx|}|ty~~yy}zpz~}}yyxtyztw}{zyxx|}}uwz||{zpx~|ywzzw||su{zz~~}zzz~}zxw}~x~}qt{|~}||{vy}ttyzz|z~|w}~~|wz~}x}}tt~~{|zyvx~urtz|}}~}zw}~|~{uy~}y{~wr|}{|yzvu{wtx~}{}}}zw{||{uy|}}z|vq|~{yvzxwxrw|{z~~zyy|{xuz~{zuq{{~|{z~xvvrw{{{{~}z{~~{y{|y{~ts}{zz{vvvrux{|~}}|x{|~}{wz}~y{~wu{~zzz{vv|}vsx|~}}|}{x|}|~}zvz}~{z}tt|}{xwywywrx|||~}yxy~~{uv|~|}}rv||||z{}wy}tsz|{~~}|||~~~|w{}~|z~wpy~{x{zu{{rtxy{}}|z{~|}{wz|{z~xt|}|zx|yv{~wru{|~}}|zz~}|{wz|}y{xsz||zwxwv}zuuz|}||yw{|ysx}|~wsz}~}{zy{zy}ysuz}||}{z~~}{v|{|upz}~|w{yw|zsuyyz}}{z|~~}zvz}|{~xs|~~}{w{zv|wruz|}}{{{~~~zvz}yyxsz}~}zwywu{zuwy{}~~~zxy~~}}{uv{||ysx}~{zxzzx||uux{}}{{z}}{wx}|{~|qs{}~}{xzxz}wtwzz|||zz~~~xv|}{}~ut}|zxzyx~~uqvz|}}zz}~}zu{~yy~wrz~}{wywu{ztw{{|{yx}~~{vvz~}{{rw}}|zxxzw{}uty{{|{{z~~{xv{~z}try||{zzxx~xtvz{{||y|~~|vy~{|wry~|{yzyx|zrsy{||y{~}~|vx~{y}|rw}~||yxyuy|utz|{~{zy|~|wvz}}{~}st}}}zxxzxyutx{{~~{zz}~{wv|~z}~ssz|~|zz{wyvtxz{|{~|y}}zwzz}~ts{}{zyzwywruy{}}~|y|~~}zvz~~z{~wrz~{{yyxv|wtv{}|~{y{}~}zuz}~z|vsz~~{xwyxx~ysw{|}~|zy|{wuz~{|urz{~}{zx|xxxsw{{}{}}z||yx{~{|}sr{}{zyzxxvsuy{}}}{z|}|xw|~~z}}uu{~~{yzywy~}usx{}~~}{y}}~~|xw|~|z~|sv|~|{wwyv{}vty||zyy~}yux|}|~zrw|}~{zxzzx|ztuz||~~|{|~|zv{~{|vqx}}zxzyx}zsuxz|}~|z|}|zvz~|{wsz||zx{xw}~xsuz|~}~|z{~|ywz}~z{wsz|{zwxww~yuvz|}}~zy{~|yty}{}wsy|~}{yxzyy}ytvz|}}~|z}{zvz||vqx|}{wzyx}{tuyz|}|{{~~zvz~|{~xry}~|{xyzw|ysty|||{{~}{vz}{z}ysw|~}zxxxvz|uuy{}~|zy}~~~{wv{~~{~|sv{}|zxxzx{~wtx{|}||z~~{ww{~{}~try|~{zxzxyxtvz{|||z|}zv{~||wsx}~|zxyyx|zstx|}}{{~~~}{wx~|y}{sv{~}|xxyvz}vty{|}}{y|~{xvz~~{|us{|~zywyxyxtv{|~~~{z{{yvz}||wrw{}|zyyyx}zuuy{|~~}z{~~}{wx~}{yrv{~}{xyyx||tsxz|~}{z~~{ww|}z|}su{}}{ywywy}wtx||}}{z|~|ww{~~{}~ut{}~zxwyxywtw{|~~}{z}zwv{{}tsy{~}|yxzxzxtwz{}|~}z|~{yw{||~urz|{zxzxyxsuy{}}|z|~|xw{{|~vsy}{zxyxx}~xtvz}}~|z|~|yv{~~z|uty}}{xwxwz~xtwz|~~}{y}zwv{||tsz{~}{ywzxz~xtw{{~|~|{}xja^`bgqxxu}|rjdcbchmignwxllnnokgcbcbehd]`egknx||}}xnhgcejlhhpy}ug]_bbb^\Y[\\cgc^_ehkouusqpsvwsnklkkoojbcgffb_^`ehnwwssy~}tqrolgb_`cejrsopv|zvusruvnfhjklpusqnosvwrmnnnquvqkosttqonptv|{y~}|{|~~ytrqoptrlegjiiecbdhjqxxtuz}~~zxy}|yvz~||vquy{zwtrsrrvwqjkmopsxuronsuvqkkkjlprlfgklmjhginpv}~yw||xuw{~}ywy{z{}zqjmrstqnkkkilpkcbfiilrrpmkpsuqljkklqurljoqrqmlmpsv}|y|}}xuswz|yuuxxyzzsihmnqnkigighmlfacfhjospnknsvuqmnoorvwrlptstqpoquw}|{}}zwstxz{vtuvvwywnggmopnkhhhgimkcadgikrsqpmqvxwqoppqtyyrotwwvsrqtwz|}}}ytrtxzyusuwvxyulfjmopligghgloiccgikotsrootxzvrqstuz|xrrwxxvssswy}}}{{vsswz{wsuvvwxwofglnpnlhhihknmfbeiknsvtsqty|{urtuux}|vrwz{zvutwy{}}~|||xsrvxzwstvwwyyrigloppmjhiikopiegjmntwutqty|}wtuvwy~~xtvz{zwutwy|~~~{z}xtsvz|yuuwwwzysjgmorqnlikjkqpjegklouxvusuz}}xuuwwz~~ytw{{|xvuwz|~}~{{~}xtswz{ytuwxy{{tjinqsqokjkjmqqjfiloqvzwutv{~~yuwxx|yuy{|{wvtxz|~~|z{}~{wsuy|}xvwyyz|ypikprtromlmmptpihknpsyywvuz}}xwxxz}|vvz|}{xuvy{|~|y}|zvtv{}{wvxyy|}xokquxyvustuv|}xstxz|~{xx||yvz~}yutqpssmhjnrv}{wtuvw|xvwyyxzwssrw|~}xvssutmhjnrv~{{|{zurnorty~|vtwxxyzxsqosxzxttvwwyzulglorromkmmntuplntwzwqtwxwspmmlmrtokmqvy}}~~{|}}{|ytqnqvyxtsvwxz|xpkosvwtrqssty|wrswz||yvx}~zwyzz{|ypikortqommnnswtonswy~|y{|}{sty{~|yxwxx{}vtvz|}~{y{||{}~}|}xtqpuwyvrsuvwyyskinqttqonppsxyspswz}}{vz}}{yzzz|vvz|~|{}ywvxz}|xy{zyzytpmptwxtrsvwx{yqjlqsvusqqssv{ysruy{~zx||z{{}{uwz}z{~~{xuuwy~ywyzzyzxrpnrvxxtsuwx{|xpkoswxutqstty|xsswz}~yz}zz{{~xvy|~|y|~~|xvuvx{}xxz{yzztqnpuxzvtuwyz}|tmnruxwusstux||vsvy|zy}|z|{~zvw{}~y{~~~ywuvxz~xwz{zz{wsoptxzxuuwxz}}wonsvyyvtstuw||wsuy|~~{x||z{{}{vwz}yz}~~zwtvxzzxz{{z{xspoty{yvvxy{~~ypnsvyywusuux}}xsuy{~~~zx}|z{{}zvwz|~y{~~zwuwy{yxz|{{|xtqqvy|yvwxz{~~xpotwyywutuvx}|vsvy|}~yy}~{z{{~yvy{}}z}~}ywuxy|~yy||{|{wsprw{{xvxz{}}unpuxzxvttvv{~zutwz|||wz~}zz{|}wwz|~{{~}yvwy{|yz||{|zusquy|{wvyz{}{rorvyzxvtuuw|}xstx{~~|{w{~~|zz{||ww{}{||ywwz||z{}}|}yurqvz}{wwy{|~zroswyzwutuvx}}xtuy{~}|zwz~~|z{z||vwz|{|}zwwz|}z{}}}}zvsrvz}|xwy{|~{soswzzxvtuvw|~yttx{}}||wy}~|zzz{|wvz|~~||~}uqosy~~||{z|}}}{ywwwvxyyy{zvx}y~|xvyz}{}wtsw~~{|}wx{}|yyy~vq{yy~~}}}}~{}}~x}ypquwxwustwwuw|}v{~}zvz|{zwuvz}|||zvsrstx{~~|zvty~yv|}{{~|yxz~~zvuuvz}~z{zy}~~}tr{|tsz}yxx{~}}w|{potvwvttvyxwx~wz~~~}|ztwzzyvuvz}}}||xtrstwy|{yxusx}yv||{{~~}zxx{{vuuwy}|y|zy}zrs||usz}yxy{~~}}{w~ypptuvuttwyxwz|w{~~~{~xuxyywuuw|}}}}|xtssuxz{zxvsu{|wx}}z|~}{yxy}zvuvx{~~}zz}x{|tqx~ytw}{yy{}~}~~}w{}sortuuttvyxwy~wy~{}{uwyxwuuw{}}}{~zussuxz{ywusuz|xx~}}{|}}{yxy}{wvvx{~~}|zz}yz~{sqx~ztw}|zy{~}}~{w|}sprtttstwyxx{|vyz~zvxxxvuux|}~{|~zuttvyzzwvtsv{{wy|{|}|yxx{~zwvwz|}||{z|{y{~wqs|~xuz~{zz|~~~}~~wyxqrtttssuxxxy~wv}{|wwxxvuuv{}}~z~}xttuwzzwvutuy|yx{}|~|}|zxxy}~~ywwx{}|{{z{~zy|zsqw}ww|~~{z{}~~}~~{w{wqrttsstvyxy{}uw{}xwxwvtuw{}~|z~~yuuvxzyvuttuz|yx{}}|}|zxxy}}zxxx{}{{{z{~zx{~~zsqv~yw|~~|{{}~}}}~}{wyzrrsssstvxyy{~~vv|{{zwyxvtuvz}~~y||vuvwyzwtttux|{xy~|}}}zxxx{~~~}xxxz||z{zz}|xy|}~|uqsz}xz}~~~~|||~||}}~}~xw|wrsssrstwyyz|{tw~{}yxywutuw{}|y|{vvwwyyutttuy|zxz}}}~|zxxy|}~}yyyz|{yzz{}|xy|}~|tqs{}x{~~~~}||~||}}}~xw|xstsrrstwyz{|{tv~~{}zyywttuw{}|x||wwwwyxttttuz|{xz}}~~|yxxy}}~}zyyz|zy{zz~{xy||~{tqt||y|~~}~}||~~{|}}~}|xx}vstsqrsuxyz{}xtx}{~yyxutuvy|yyzwwwxyvttttw{|zy|}~{xxy{~|{zyy{{yz{z|~yxz||~}wrsx~zz~~}~~}|~~{|}}~}yx{ytttrrsuwyzz{ztv~~{~zzyvtuvy|~zx}{xxxxywttttv{|zy|}~{xxy{~||zzy{{xz{z{~yxz||~}wrsy~z{~~}~~~|~~{|}}~}~yx|xtutqrtuxyz{|ysw}|zzyutuwz}xyzxxxxyututtx||yy}}~yxyz||}{{yz|yy{{z}|xy{|}~ztru||z}}}~}}|{}~}~~{xz|uuurqstwxz{{}|tt||}{zzwtuvx{~zw|}yxxwywstutu{}{y{~|xxy{~{}{{y{{xy{zzzxz{{~~~wssw~{{~|~~}}~{{}}}}zx{zuutqqtuwyz{{~zsu~|~{zzvtuwy|~yw}|yyxwyvstutu{}{y{~|xxz{~{~|{yz{xy{zzzxy{{~~~xssw~{{~|}~}}~{{}}}}~zxz{uuurqsuwxz{{}|tt}|}|{{wtuvx{}{w{~zyywxxstutty}|yz~~~yxy{}|}||zy{yx{{y|}yyz{|~~{usuz~z}}|~~|~}z|~}~}}yy|xuvtprtvxyz{{~xsv~|~{{zvsuwy|~yw|}yyywxwstuttz~|yz}xxz{}{}||zz{xx{{y||xyz{|~~zusuz~z}}|~|~}z|~}~}}yy|yuvtpqtvxyz{{~ysu~|~|{{vsuwy{~yw|~zyywxwstuttz~|yz}xxz{}{}||zz{xx{zy}|xyzz|}ytsv{}{}}||~|z|~}~~~|yy|xvvsprtvxy{||vsx}}{{yttvxz}wx|yzxwxtsuusv|~{y|~zwy{|~}{~}|y{ywz{zzyxzz{~~zulb`a`ais}vqlmldacdcgowyspifffbcgfddhlnqxxuw{~}zzqaZ]``a``ejoyyuutqoib`abgdabc`_acccfijknia_gpruurqpkkhdeecchjgdglpsz~{xuplh_YYZ`b_ckoqw~{}zpjiiijnjgimmoqnlnqvwokjhddfhjmqtvy|voqvxyyvtvutsnosvw~~~wpputrpmihdba\\`cdiprnlmprv|}}}wux}|vuussuwxxz{}{||z{{vsqoosroqutokea`bdhb[YYWX_eimqrrswsjiouuuutvww{zxy{|}yw||vtuuu{}~zvsoknruw{}zwxwmgjrspjc`a_^]YY[[]grussvwuw{xwy}{wsmilqw{yxxuqrvy{|xtx~||ywxwux~{{~}{sgabgnlggfb_bhmptvwvwuljpxz{wrpqqsrpstojmpojkorsstqt{ywz|~{rs{ztpmpnklkfdhjjimprswupquvtuqjfhlsrljjf``bfinquwzuhdjtvwuqnnmqvx}}|~zwusvtpnje``dhnw|rnqvutrnkicefdfikntuqlmopry|vrtxxwslggiouuz~~~}upljorqry{xtv{~xqmllopoqrpmpqnjjlmlpuoihnrwzvrrnkljovyy{zvxyz|~~~|xy~zy}~zxyxuvx|}~~{vuopuuqrwxphffhinpoqrnknnkikmojfgjijnty{~wtx{|~}~}}wqrvxzzuuwz{z}yrqqmknsxyxvuwyrkmssnkiikied_[^bgp|}}{{{~{zvsvyzwvvtuy~~z{~{yuy~}zzurqsw~|xx~}z}}ujdfkmqnhhhgipvww{{xx{vopy{{}}y{{zxuppuvttwxurv{|}|y{{}~~}z}~{{ups~{ssuutponkgjqvusuxwwyvtuz|zxrmqw{~zwvoeaflot}~{tpsy{{yursvx}|{|z|{srv~vsof`biqxvqsxyzwrnmnpnjlqrpswxtruz}}wx}xnhimw~~||}|~~yrprytu}}~|tprsttutx~wuuz~{xwz{{}rs~{xvy{~{~}{|zxxyz}|{{{zwrooruuxy~~|xrrtwyxuy~yqkostw|uwzxx{{|}wuzzvxvu{soqvxz{wuxyxzyvrvz}{vvwvuvutpsy{z|{vrswy|ztvzxuojnvxvxzuqrw~{wrrw|}{z|~{|}wrt{{y}}~||{ww|{tposy{~{{|xwvqpx}rlllmnsuuz|}xtu}{yzz{~yttvxy~~}{z{xqrv|}|~|zwz{ussttuy~~|yz{{||zwy|yupos}yxy}~wvx}~{yz||{zsx{~|zwsrsqt{}x{|zy|{wx}~{ytsvy{|umfchkqz~}z{}|{|x{}xz}|~}}~~~|x}|{}}{z~trzzsmgdjs}vru{{yvqrxuspnrqmmu|ztx|~|zz|~vokov{touxxy|wtsxwqppmpx~xoijrzzuuzzqmmppotz}~xlis|vutuz}{z|{wz}~z|~zurv}~|{zsprsuz{uw~{xsszxwx{|xurooopw||rqw~zsoru|}}~yttux|~ywzyxuty~{|ywy|zxxtuz{xyz~~ytoqsrsv}}{ypotz{wupllijpvw{}zzz}xy}{{zyzyzxz{w}}~~vtvwz~~~zvrnrvvw}vtvwv|y{xpmonqonrwzyx{{yzyzz}|tsy~|vsx{wx{vw}zv|vsv}|}ytw{||vu|{zz~ywwzzxuw|~~|xtpmnquw}~|{zyyxz}|}|}|z~|z}ytrmin{}{{{|~{{{|~~{wy}{}~}~|zz|{yyy}xuyvrojipy|~xuyzzyw{~|xwxupmnt|}zvz|xrqv|{|}~~}~{}}ury}xv{vz~}xsnkmpx~~~~xokrwy{y|{uppsrpwyvru{}yxy||}~~~~{|~~~}|upu~{|zzz~uorzzzvsrsvy{tu|{vx{zwv|zuuwvps{xuzzssv{}{xrtx{{|z{vrx~~~}z{yxwx~~xxzyy}|xwy}yxtopty~}{pqz~|vtsqrqvwv|~zyy~|{wvw|zvx}wu{xux}~~}vrqw{~}xvyyxwz{|{x~wsrsxxx||~|}wuy~xvvzyzvu{~z}{uttvz{{{}|wopw{{|yy{xuxwy{x||{{xz~|~}vtttz~~~~}}{yqmvyvz|~wuuwz~yy}vou~ztv}|{yuvy{~{zyuu|}zz}~|yvtv{}}|~|}tqrwy~zvz~yvw}}}|{yxz}z{{{|yzz~zwx||wwyz|{~~xwwvw{y}{}~|voopt{xxyyz~{xwxxux~{|{|~}}}|~~}{{z}z||~vmnw~{|{trqs}}{~~rnv~{vuvuvzzvy~|{|}y{~|x}~~~|xx~wrty}~~|{vwz{|xv~~|xx}{vvx|}~{yxtx~~|}}xwx|xy~~z{zxxy{~~wx~snrz}~~y}}{{{z}zx|}}}|xqsx}yx~{tsy}|{uu||yxv}|zy|~~~zy}vmmqx~~{}~{z}zvv}|x{yposv|~~}|yz}zrw{vxxtx{wz~}|}}xppszxz~~{uuxyxxy||{~{sstw~||zww{~|xu|zvuuuz~{||~|yvwy|}z|wwy}}wtsu{~{}vw{{vw~|zwtuvz~|wutz~~yz}}|~}}|~}}}ww~yxz}vrttszwv|~~zy~}zzyx|zxvw}~||ss{{vwy{~z~}|usz}{ytqpqv~||}wv{|wx{xuz}z}~yy|}~|}}|||yyy{xwstwy}~~{tqov~~yy~zsuy{}~xuvwwz}{w|~z}{yz|}{|{{|z{|uqsx|}y}~|ysrzzuwy~wsvxzxvv{~|{|wt}}z|yvuwyy|~y{}torwy~}}|~yz||}|yy{vqtyy{~usw}~~~|}|xw~{xwy{z{xz}zu{|tnmqy}{|}|yw{}z{z{vposx~~{yyy}zw|}zyxtt}zy}}}~~~vons~z{||~xx}{wvuu{xrqs|||zvvyz{}rs}xwuvx~{|}}|}|}|ywuwzwy~}yutwz{~|~}}{{xvz}}{xtstuz|||xtx{|}}z{}z}}}|xx|yw||wy}yvurryxx}|x}{zy{}ywuu}yxysqx}{yxx{}}~|uv|~zy}~xvtqsy}zz|yv||xyywx}zwzzsu|}zy{}}~zw{}y}{{|xtuxy|~zuquz|ywy{}|{{wwyyywvw{}}yy~|vuy}{z{x|~ztqv}~}uopxzvuvz|vsv}}xux~~|z~~~}wz|xuqswz}{vspr{||z{~|yxy~zwv|~wtstx|vtw||zzzz|}}y{zvvw{~}~xw~{wsoqz|}}}|vtw{x}ytprz}zyxy~}|{~|{vuz}yw|~}zy||}yqov}zy{|{vsprw~zspw~~|wvxxv{{uw~~{yxz~}}}}~zx}vnoy~z|}{wxwuwz}~yqqw|zxtttux~zy~zxz}zy}~||}{y~|}xux|}yx{~{|~{{xrsy~~}{{|~}{||~~{{}|xvtx}yuyvruy|}}zxyzy|{z{|zxvy}zuz{ywvuy|}}{z~{{{yy|{yw{}wswvru|}zwx{}{y}~~{tqquz~~yvvyyy|zzyx}{uttuyxx{~~~wv{|wtvzz{xw{|~zuuwy|~||~unpw|~xvvzzuvzz|zx|~||{{}~~}~}xsrru{~}zvor{{xxz}{xvx{zvy{vqs{~wtx||zyvvz|~}~~{xuty}{}|{}|xuru|~}}~vrsx}zuxzusu}~|zyz||}~~|{~zx{}}{xw{|ywx{|}~xtuxzz||}}ztooqwztuy|~|xwxxvx|{{{{}|}|~~|||yy}~}qlqz~{{xusty}~unpy|yvutuw{|yz}~}{z~|{}~zz}yvv{{vvz~~}|yuuy{|{}}zyx{}yyz}~}~|yvuy~~~wvz~yuw{yyzzxyz|~~yw|yrrw}xw}|{zyy{|{|||~~}vtv{}yz~ytsx~zusx{ywy~~|{}vdVRTZcq~xwuspmjecb`abiqy|yyz{ytmfeijjkkgeejnsvsrw{~xtpkijig`\]dnv}|ric^[Z[_bbabdgd``ekllqsnifhpwwrjd_[ZZ]dihhjhdbbdgmrqpqv~~vledghe^Z\abaaacgnwywxwx{|{xsnnpnjijjkjiggfeipsuwwxyyvolmov|}||}wqorvy}}||{{{|yrmmljc\\affed`]^`dkuzz}}xwx~}{yww{}xwxwuw|{|}xy|~}}~}}}~{vtsv}}{}{upmjhkqwumc\Z\_befhjknqqomosuvvuuuvvroou}}zwx|uoosx~~|ytswyvrponihigea_blrpje`^`ekpw{zxtmfcdhmqpnllnsvwx~}{}|}~|{wvw{~wmeeilmnppngbbfijkkigfbbhrwy{xrnjgffjkkjkptsqswzyyxz{|{x}}xx|zz}~~xvzwronklqvwrmkkmnlllllklquwuspnoprronib^^entxz}~vnlnprx}~{uppssrtvz~}~~xusqponqx~}{vmihlqwzxwvrmhdbdilpqpmnnmntzywvxvplkkmmlmostsqonopu}{vtttyvstxy||{z{zwvtpnqtuspnmmmligglruttsplkoswurssqlfdipsrrqnllou|~~}~~~~|}{usvz~|zxusstttvupljmruwwxzwsponjiovywoiggefilnruy}|yz||}}||}{wsopu|~}~~~}{|~wqmotyz{{}}vtvvsrrrpnnnmhb`envxuojghks{{tnknrwxusrvyyyz~yy|}~~|{}{wtv}zpigjkpuusnigjmmlmnnnoonquz}xurpqpopqty{{xy{zxx|}|}{vx}xttzyw{~~~}|{|zwuqoptwvqoqtspnmlmprty}}}|ytrtvzzytmgejrw{~yusrv||vuwxurqqty~z|xz~~}|xrkinu|~{ytooty|~}zvrokjklnqvz|xutwz{zz}}zyvrmklu||zyvtstv{ysppty{|utvwwy{zvsqrrsxzvvvvwvuuutpnnqw|}~ww~~zvroqtwy}|yvvx{||~}ulilrvwvspmkjkntx}}xvuw{}|||~~ysonooopqqqrvxxvsv~}z}~wtrsvy~{vuuwyz{{yussv{~xuuuwvvx{}|{|{z{{|||yspsx}}ysonrtux|~{tpqv|~||}~|z|xpnry}~wsqsxyrmknqssqswyxx{~}}~~}~zvqpv~zwwxz}{xxz~~zzyuqqv|}xssuvutsrtuwy{zxz{xvtqnmotyzzzzyvstx||~{y{~zy}~z{|~zvtx}|}~|}}yvxyyxutwzzwsqoprw{zvuwz~~ysmjkosx}~{uru{~~zwwzyvspnqu}|~~~{wz}|skjpw{~}{wwz}}zvsponmnry}yyzyxz|}yqiinuyxwurqqtx~~}~|zwsrvz}}~~{xwxz|~|xuuvyyyyxuqpruxz|}voosw|zsooqrstttttuwz}~{|}yy}~}}~|{|~~zvvz{vrsz|yvvx{|zywvwxwx|zxyzxwwwwwuvxzwrlhhkpv~|{{}|xvvwwy~~}{xwy|}|}~{xy|~~}~}xusrtv{}vstwyyz{zunhgjorvzzxtstx~}xtstuwy{~~}}~~|y{~~|}}yxx|}yy}~zyz~{wvx{}zz}~ytonrwywrqsutrqpoqtx||{}~{wtrty}}xuvx{~|{|||~~|{{|~xwz~}|}{}~~~}}~~}~{{zyuqqtxzzxtpnnqw~~zww{~zvtsrsx~~zz|}{zz|}|xuqmnqx~}~~~|z|}yxy{xplmqux{}~~}~~|zwvrnmou}zwx|{rlmrvyzxvuuvy~~|||{|~}{xvvvvuvz|yvuw|{utux{}|yvttwyz{|yvssw~|wwwvtsstuwy}~z{ztty}~~~|vvy}~zuux{}~}{yvv{{yxz{{zz{}|yyz}}|zz|||}}zvrty~~{vpkikrz~}}|xtqqsw~~{wuy~|{~}{xxz{}}vsrqsy~~|yuqqtw|~}xwwxy}~}zz{}~~}~~xxy||~~|||{{z|}xx{|zx|{{wuwz|~|y{{~{{}}z{|}{yzyww{~|}yuuz}~~|||~|vqsw}~}|xuvwx~}}~{xtrx{|}~|~~~}|}|xvz}}zyyyvtx{|~xussw~}|xwz}|xyxspqw}|xxvxz~~~xuvyzz}~}|}~~}}|{||zx{~}{{{w{~zvw{~~~yvuposxz{~|{}}{{}}}}}|zzzxz|}||yxx}|~|}}zuonrx|~zxwvv|}{zwtqvxyz}}~|{yyvx{}|{{{yvxzz}~zxuvz}{yxwy{}z{|wtsw{~}{yyz|~}~|xsstwx{~}{z||}~}|||{{|{zwu{~~yuz~}}~}~~ywtorw{|~{|}}|{}~{z{|yy{||{yx}~|~}|xslmry||xuuuv|}~yvsoswy{}z}}||xy}}{{|{vvxwz~{ytsv}|{{yz}~{}yustwz~|{xxw|~{||{vstwz{|{{}|~}z{|zyyvw}~zx|}{}}}~yytqtwz{~}y{{{~~~~~|yxz~~|{|}yvw|}~~}|}~|xrmot{}~{xvwwx|~zwspvy{}~~z~~}{wz}~zyz{ytwxwz}zwrsw~|yxz~{z{vsqtx{}}{xvvx}|{~~|vuw{z|~~}~~~|yw{}}~{{|zw|}wxz|}~~{yvpqswxz{|||}}||~~~zxz}{||}zxw{|}~}||~{uoosz}~}zxxvw~}z}zvrwxz}}~~|}|yux{|zzz{zvyyy{}{wtty}zwwy}~{|{usswz}}{xww{}~~yuvwyx}}}~}~~|{wx||~}||xy~~~xvzz~~~|xwqpsuwy~}~|}}||{~}zz~|{zzz~~zy{~{|}}~|wompwz~~zwvuu|~~|}{vquwx{}|}|yvy|~{{|~{vyxx{~|wstz|zwwz~|~{vttwz}~|yww||~}|wtuxzy~||}{~}{x{}}}|{zvy}}}xx{{~}~|}zxwqrtwy{~~}{|~}}}||zz}~}{zz||yy}}z|~}|~~ztnnry{~|xvwuv}~||ztqvwy|~{~~zwz}}{||~zuxwwz~|wrsx~{xx{|~|vssvx{}}xvuy}{}~}xuux{z}|}|~{xx|{~}|{|ww|}{wzy~}~}|~}zytqsvxx}|}{{}|{~}yy|}{{{~zxz}||~~~|{{~zsopu{|}{ywwuy~||}{utwxz~~}~|~~zwz{|z{|}zvxvwz~|wssx~~{xxz~|}{vssvxz}}yvuy}|~~zvvx{z~~}~|~~zwwzz}~~}}yx|}~|wxx{~}~{yuqrsvvz~~}{}}|z{~{z{}{zz}yy|~{|~~{z}~xqoqwz|~}{xxvuz}{}{tuwwz~}~~~}xwz|{z{}zxyvw{}wtty}zvwz~|}zvtuwy{~~yvv{}}~yvvxzy~~}}{~}zwx{{~~}xx{{~{xxw|}}~}zytqrtvw||{~}{z|{z||zy||z{~{z{}{z|toosxy~|xwvsw|}}}}vtuvx|~}~zxz||{|~{xyvvy~xtsx}~zvxz}~{wtuwyz}zvuz|}~yvvyzy~}}|{~~zwy{{~~}|wxz{~|yyx}~||~|{ytstuvx}~z{}{z}}zz}~~|zz~{z|~}zz}~{y{~xqoqvy|~~zwwttz}}ytuuw{~~}~|yz{|{{}}xxvuw}ztsv{~|wxz~}~|wtuwxy|~yvty|}~ywwz{z~}}|{~zwxzz~~~|wxz{~|zxw}~|}|{xtstuux~}z{}zz||zz}~|yz}zz}}zz~}zy}~wqpswy~~}ywvtv{}~}xuuux|}~~{zz{{z|~|xxuux~~ytsw|{wx{~}}zvtuwyz}~yuuz}~zxxz{z~}~zpc]__aflrz~zwroljlnqtvvtsw}xvvxwmbdhifdfhjmopsx{|xkb[XY_fjls~wog_ZZ^a_[eorngd`^^aeilnppnkhighmspd_adca_^^^acefhmrx}}wt|~}wromnqpmhdaaeltyz}~zrlea^`bdfikjhffeeluwndbgjjjklnosvvwz}xsv~}}{yz|thcglkhkrvuqonoortsolhfiotyyyyroosw{~zqrvyyxyyyz}}~xvxz|wqnoqvy|{|}sqvyvrswxxxy|}zrf[[cgecgnrropqsvxzxuqkhjnrvuw}zx|}xstvy~~ytpjggilprqtz~}sjjopkfhijlnoswz}~yqf^`hieekptsqsrtwz}|zvqquy}ztw{zutvx~~xpkecdfgklmruvqhejookjmorvwy{|}~}wqf]]elkjpv{|z{{z|~zuqux{~~||~~~|~wrsruzxtnifdfijnppuxzvlfhmoljmoqtuuxz{}{vka_fnnkosx|z{}|}|vpqsuyyy|y|{vrrsuzxupjfcehhknntxzxpghlokgijmoqruy{{rgeippmosw{yz{yy}~{uvy|||{}}ww{{wsuux~|yrjebdffilnsuvslfhmqompqux{{|~|wmdekssruy~~~~ztwz|~~~{{y|}{{}~~}}~}wsssvywtnieeikloqty{zumikoroprswyyyz|~{vjdgousqtw}}}vqtuvwx{~}}}}z~~zutttxywrlhdfijloqw||{tlkmqpmooptuuwy|}wlhltvsrtw}}|~}}~wvz{}~~yxwy}~~|~xw}~zvvvx}}ztnhdehiloqw{zxqkkossruvw{}}}~}ysjgmvxvvy}}wvz{{{|}zxvx}~xy{|{y|}~|wusuyzxsnifhlnqtu|{snmpssrvww{||||~zulgmvxvtvz}vtuvvvv}{{yz~~~~{~~|~{{~ywuuyzxtpjffilorsy}vomosrqsusvxxzz}}zslnvyxuuw|~}xtpsz~}zwyz|}xvvx~xjbbhoswz}~zwtx{zvqkdbdilpru~ytrty}}|w{~{wxz~zqljfflsvxwtqonntz{yvx}|vmedegiikmnlfdgkq{|rheipvz}~~{{~zsllswxvtv{~~zxvv|{wussx{zvux~|wohhknonprrnihlrzyposz~~}~{tqquy|~zwy{{z}}|}~|}zvrnqwzzxx{~|{}uqrvwvwy{xsnot{tnouz~}vv{~zwuz}zwpkjkptxy|xsqqtvvy}~|}}||xuqrx}~|}{truyxxz||wsrv}zqosy}~ywz~~ytqsyzxupkjkotwy{xronpstw|~~}}|wtsw|~}}}}~~}}zwz~~||}}ysru|wsv{yvx|~{urrwyvsoifgjosvy}yspopstvz}}{}~|}}yvvx|~{{{||x{~|}~~ztsv||uqsx|{usuz|}ztrrxzwsnigikptwz~xrpoquvy~~}yvwz~~{{z{}xuy}}{|~|xttxzsqtz}}|xwx|}~ysprxzwrnkjmpuy{~~xqooruv{~}xvx{}~}{z~|zz{}~zz~|~}zuruzzuvy~yxwz}~~xsruyytnlhilotw{}wqpptvw|}}xwz}~|}yxyz~}z{~}}zusv{}vrtw{|uuux{}}wssvzzuolijmpux||vpprvxy~|ww{~~|}~ywxz}~ywx{}}|~|yusw||urtw|wwxz}~}xsrvzzvpnlnqtx|~~xqpquxy~}xvy~}|}|zzzxxz}~|z{}~}~|xtru{ytvy}xwxz|{vsvyzwolkloquy|{tqqtxx{~{wy}~~|zwwx|}yz|}~~~{vssxxsqux}ysuwz|~|xtuy{ztnlknqtx{}wqqsxz{}yx|}~~}}~wvvy~~}~xvyz{}|}|wtru|{uqswz~xvxz|~{xtvzzyrnmosuy||uqqtxz}|xw||}}{z||vvw{}|~yx||}~}~{vrrv}{usuy|yx{~{y|~~{tppsux|zvvz}~{{~|}|{z~}uqrsy~|zz}{{{xsuxxyzzzwqopv~}tpptx{zuvz}}z{~}xroquw{~}wvx}|{~||}{{|yrqqu{|xwy}}z{}ysqvvvxyzwsopt|wqoswz~yx{~{z}}zuqrwy|~yuv{~}{||{{yxy}zsqrtz~ywx|~zz}}wswywxyzxtoosz{trtx{~zxy~}|}}zuposwy}zwvz}~||~|}{z{zspqtz{yy~{z}~wtwyxxy{xtootzyqorvy|xvx}~~}}}yupotwz~~zwv{~~}}~|}{z|ysopsz~xvw|zz}{uruwvuxzwsopu}xposwz|zxz~}~|xuqqwz~|yww|~}|}|{{yw{}vqoqv||xvx~}yz{vuxyxvzyvrorxwqrvz|}}zx|~~~zuroqvy}{ywx|~~}~}}|yy~ztpoqw~~zxz~zzzvuxxwvyyuqosy~uopuy{|~~{xw{~~~zuroqvz}~zyxz}}~~~~}|{yyzspnqw~|xvx~~zzyttuwvtxxuqptz~vopuy||}}}{y{}~{usqrw|zyxy|}|}}~||zxw|{tqopv|}ywx|~{z}xvwxxuwxuqpsyzrqvz}}}~}{z{~~~|urppty}{yyz{~}{|~~~|zx{|uqpos{}zy|}z|zwwwxvvxwsqrw~|torvz|||}~{zy{~~~ysrpru{}yzz|}~{{|~}}{yy~yspoov}~zwy||{|wvuvvtuvtqqt{yrpsx{|{{~}|{{}~~~wsrruy~{yz{|~}zz|}|{ywx}}wrpoqx}zxy}|{}xxwwwuvvtqqv}ysrvz}~||}|||~~~|urqrtx}~zyz||~|zz}~~|zy{ztqpos{~{z|~{|{yxvwvvvusqty{uqrvz}|z}{{{{|~~~ysqqsuz|yz|~~}zyz~}}{yz}~wrpopv~~|yz}}||xxvuuuutsqrw~}xsqty|}zz~||}}~~~}|urrtvz|yy{~~{xx}}}|zxx{wrqppt|~}zy|~~|~{zxvvvvtsqrw}zvtuy}~|z}|z}}~}~}~}vqpstw}|zyz~~~{xw|~}}|zz}xrqpqt|}{}~}~|{yvvvvtrqrw}~xustx|}|y}yx{}~}~~}~vqptuw}{yy{{xw{}}}{yz}wqppqt{~~|{}~~|zzxutuusqqsy}wutux|}{y}yy}~}}}wrrvwzyxy|zww|~}{|{yxz}}tppqsv~~~}|}}~|||xvuwurpqu||wwww{~~{z~|wy~~}}ztpruwz}xxz~~yww}~}||{zy}|rpprtx~~~}}|}|yutwuqpqv}zuvvwz}}{z}zuw|~}|}zuprvxz|wxz~ywx}|{|{zz}|rpprux~~~~||~{|{xtsvuqoqw~zuvwwy|}{z|{vx}}|}|wrswy{}wwz~zvv{}|zzzxx{~toprux}~~~|{~|}}{wsvvrnpu}|wwyyz|~|{{}vv{}|||xrqtxz}~xvy}|wvy~~{z{zy|xpoqux{~{{}|}|yttvtpnsy|wuxyyz}}|{}wtv}}|{}~zvqrvz|{vw{~zwx{|zzzyz~}toorvy}~~|z|~{{}{wsturnou}zvvyzy{}||{~}vuy}||}zvstx|~yux}}yvx|~{yyxxy}{sopsx{}~|z||}}{wsuuqnpw~zwx{{z|}}}||vvz}{||ytrtx|~~xux~}xwy~~{yyyy|xroquz}~{z}}|}}zututpnszzwvx{{z|}}}|wtv{~{{}}zwssv{}{vv{~{wx{}zxxxz~|uporw{}~|yz}{||{xsttrnpw|wuwz|{{|}}|{vvy|{||yvuuz~}xvy~}yxz~~zwwwx|}wrorw{~~}zy}}}}|zuttsoou~xvwz}}{|}~}~~wvx}{{{yvutw}}xvw~~}zxz}~{xwwy}}xsoqw|wmaZZ_mx{nhdehhc^^bjry||y~~~}yustrnikpolggigfhms{}|}}xusrnkie`^_aiu~||unid`^^^]\ZYYYXZakv{ztkddegjjhffggfhnpoolg`ZZ]dlpmjjnuz}|}~}vqld_^`dhkkkkheeefmw|yuqlhfdeks{}yqhabehkkhgilllqwyzywrlijnt{}yutw{~~{yy{{z}zz|~}}|yqjeda\Z\bgmpqqpmjjjjpy~~wy|~}{}yuuy~{y|~{yxyxw{}yxwy}y{}{vsqqpoopprrpnoqtvvwwwuohddb_]`gmsvwutqnmmmqy}}|~|ywyywy~}ytrqrw|{yzyvrrutpljjjiijilnmklnqtvwxxwsmggfcabipvz{yvtpoooqw~~}ywwxvwz~zwrpoorw{||yuuutpnqrojhhiiijijmnmmoruwyzzzxsljjhediqw|~|xvspqqqu}~{wvxwvw{}zwspoopsx{|{wuuuspoqqmihikkkkjmpqppruxz}}|{xrlllifhov||xurqrrty~}zwwxxwy}|xuqonopty||zwuttrppqpljijlllkkmqrqrtwz|~~}zsmmljgjrx~|wusrstu{~~~~~{xuvxwwy}~zvspnnopty{{yvttsqppqpljjlnnnmmoststwy|~zsoonkjov}{wusstux~~~~}|zwuwxwwz~|wtqoopqrw{||zwuutrqqrolklopponorvvvwz|}xroomklryxusstuwz~~~}|{xvwxyyz~yurpoprrv{}}|zwuutsqrqnlloqqpnnqvwwxy|~{tponkkpwytsstvwz}~}||zyvvxzzz}{urppqssuz}}|{xuuttrrrpnmpstrpoqvyyyz|~}wqpomlqw{tsstvxz}~~}|{zyvwx{{{~ztqpprtuv{~~}ywvuusrrqonquvsqprw{{{|}}wronmmqwzsqrtvy{~|~}|zzywxy|}}ytqpqtvvx|~zwvwvsrrqopsvvsqprx||{|}|vqnmmnrywqqrtz}zwuutv|}z}~wuutstuuwyxyz|~}yxy{|{|~yxwxwtsutsuy}~{{{~xtqprwz|{unilpu{}{{~~wpllmnomnnmjhmu|{vpmlmrvwvuttwyzz|}ztpqtvwxyz{}|{zzz|}~}wpkiikou{~}xqlmquz~yxxwwutsrolov}ztomlmquwwxwwz}{wx{}~~~~}{zyzz|}|y{~~~~~|yz|xtoihhkou{|unmquz~~|zxyzwwvx}||~|zxwxyz|~xtuw{|}}zvuwwwy{}zwttx}~~}zwsmjjmqv|zrnptx}}}|{{{~~~{xvwxyz|~ysqsv{}~~{yzyursttvx{{xusuy}zxsmlnquz~wpnqvz~}}}}}zwvwxyz}{uporvz|}}~}yxywsqrttvx{zwtsv{}{xsnlosw|}vporw|~~~~|yvuvxyz}~ysoorw{}}|~{xxxvrprtuwz|zwtux}}{xrnnrvz~{tppty~~~}}~~{wuuvxy|{vpnpty|~~}~zxyxuqqtvwy||zwuw{|{wqnpux}xroqv{~~~}~}}~~~}xuuuxy{|wrnnrx{~~}~|yyxvrqsvxy|}|yvwz}{xsnosw|yspptz~}~}}~}~~~~yuttwy{~|wsnnqw{~~}}zyywsqruxz|}|zwwz~~|yupotx|ztposz~|}~~||||}~~~yuttwy{~|wsonqw|~~{zywsqrvy{}~}{xy{~|yuppty}~ytposy|{{}~}||}{|}~~~yutuxz}{vroosy}~~{zxvsqswz|~~}{yz|}zxsoquz~|wsppu{~|{{}~|{}{{|~~}wusux{~xtpopuz~~}{yxurqsx|}~~}{yz}|zwsprw|~zvrpqv|~{zz|}|{}~zz|~~~}xusux|xtpopu{~|zxusrsx|~~}|{|~|zwtqsw|~zurpqv|}zyy{|{{}}yy{}~~~~yvtvy}{wtstx~}zxww|}zwttx}{wtrqtz~{wutvwwvx|zttvy{{{z~|{~~~zvtux|}wtssv|}zxwwz~{xvuw{|xusqsw~}yvtuwwwwz}vstwz{{z{~{|~~}xutvy}zussty~~{yxwx||zwuvy~}yvtrrtz~~{wutuvwwx}ztsuxz|{z}}z}~~|xuuw{xtrsvz~{xwwx}~{ywvvz{xutrsu{~~{wutuvwwy~yssvy{|{z}|z}~~~{wtuw{}wsrsw{}zxwwy~}zxwwx|}zwusstw~~~~zwttvvwx||urtwz||{{~z{~~~}yvtvx}ztrsuy~~{xwwx||ywwwy~{wutssuz~}~|xuttuvwz~xsrux{||{}{z}~~~~{wuuw||vrrtx||yxwwz~|ywwxy}{wutstux~}~}yvttuvwz~ytrtx{||{||z|~~}}{xuuwz~wrrtw{}ywwwy}}yxxyz}{wutttux~~}}}zvtttvwzysrswz|}{|{y{}}}{yuuwz~vrrtx||ywwxz}|ywxzz}zvtttuvy~~|}|zvtttvx{}xsrtw{}}|}{z|}||{xvvw{|uqruy}|xwwxz~~{xwyz|}xtsttvwz}|}|yvtttvy}{urrux|}}}}}zz}~||{zwvvx}ztrsvz~{xwxy{~}zxxz|~|wtstuwx|~}|||yvtstvy~ztrrux|}}}~|zz}~|{zzxvvy}ztrsw{~{xwxz{~~|zxxz}{vsrsuwy|~|{{{zvtstvzzurrtx{}~~~}zz}|{zzxwwy|{ursw{~{xwwy{}}|zxwz||wsrsuwy|~~~}|{{{wutsuy~{usrtwz}~~}{z|}{yyywwx{|vsrvz}}ywwy{|~|{xwy|}xtrrtwy{}~}|{{{yvtstw|}wsrsux|~~~{zz}~|yyyxxxz}zustx|~{xwxz|~~}{yxx{~{vrqsuxz}~}}}{zzzxussux~zurrsvy|~}{z{}{yyyxxx{}xtsuy}}zxwyz|~}|zxwx{~~yurqsvy{}~}~}{zzzxutsuzytrrtwz}~}z{|}zxxxxxy|{wtsvz~}ywwy{}~}{zxwy||xsqrtwz}~~||{zzywustw|}vsrsux{}~{z{~|yxxxyyz}~yuttx|~{yxxz|~~~{zxwx{~zurqruy|~~|}}{yyzxvtsuzytrrtvz}|z{}}zxxxyyz}zwutw{|zxxz|}}~~{zxwwz}~zvrpqux{~~}||zyzywutuy{usstvy|~}{{}~zxwxyzz|{wuuw{~~|zxxz{}}}|yxwxz}~zvrpqtx{~}||zyyywutuy{urrtvy|~|z{}~zwwwyz{}~zwvux{~~|zyxz|}}}~~{ywwxz~~zvrpqtx||||yxyxwutuyztrstvy||{{~}ywwwz{|~}ywvvy|~~~}|zyyz|}||~}zxwwy{}xtqpruy~~|}~{xxxxwutv|xsrsuwz}{{||xwvxz|}{wwwxz~~}}|{zyz{}}||~|ywvwy|{wsqprvz~|}~{xxxxwuuw}wsrsuwz}~{{}|xvvxz|}{wwxy{~~}||{zzz{}}{|}|yvvwz}{vsqprvz}|}~{xxwxwvux}xsrsuwz||{}|ywvwz}~{wwxy{~~}||{zzz{}}{{|}yvuvy||wsqpruy~~|}|yxwxxwvw|ztrsuwy{|{|}ywuvy|~|xwxy{}}{{{{zz{|}|{{~~zwuux{ytqpqtx}||}zxwwxxwwz}wsstvxz}~||~{xvuw{}}ywwy{}~|{{zz{{|}|{z||xvuvy}|vrqpruz}|}|yxwwxwwx|{ussuwy{~}|}~zxvvx||xwxz|~}{zzz{{{|}|{z|{wutwz~{urpqrv{}|~ynfcejpuxz|{}wpg`ZXY]bhpw|xtssuwwwvutsqpnljfcbchpw}zpga`aelsy~|qh_[XXY[]`dgkmmnpqqokjknrtsttspmjgc_\Z[^acdeffdcaadinsx}~{zyz{zyvrpppolhdbbfkry|zzyxxy{{{zxxwurnkjloqrrsrqomlifdcdhlprtuutromorvz}~yvuwz~}ztlfb``adgijjjjlnpomkiimqw}|ywttwz~~{xuuw{~}zyyz{|}}|zxxy}~|zvrmheegjoqqnic]ZYZ\`ehklmmprtusqnnrvz~~{yy{~}yvttuvwwwusrqrux{|}~}{ywtrokfb``cgknnlgb][Z\_chlnpqrtwyywtrruy}~~|z{}}{wtrrstuutrponpsvyz{{zxvtqolhda_adimoolgb^]^`chlorstuwz{zxustw{~}||}|{||zvsrrstuusqonnpswyz{{zxvsqolhda`bfkopolhc`_`bfknruvwxz||{yvtvy}}|{{{}||}~|zvsrrsuuutqonnptwy{{|{ywtqoliebadhmpqpmida`bdhmptvxyz{}~|zwvwz~}|zz{||{}~|zwsrrstuvtqonnpsvyz{|{ywuromjfccdhmqsrolgdcdfinquxy{{}~~|ywx{~}|zzz{~|{|~~}zxurqrtuvuspooprvy{|}|{ywtqolifdehmqttrnjfddfimqtxz{|}~}{xxz~~}{zyz||z{|}|yvtrrtuwwurpoprux{|}~}{yvsqnkhfegkptutqmifefimqtwz|}~}zyz|}|zyyz}~zyz}~|{xusrstvwwtrppqsvy{}~~}{yvsqnkhfgimruvtqmjgghkoruy{}}{z{~}|{zz{~|yxz}~|zwusrsuwxwtrqprtwz}~~}|yvsqnkighkptvvtpmjhhjmqtw{}}{{}~}{zzz|}yxy{~}{yvtssuvxxvtrqrtvy|~}{xurpmjhhjnsvwvsoljijmptwz}~|{|xrnklot{}{{{||zwrmigintz~~~|yvttuwz|~|yvtrpppsw}~{wtstx|~~ztolklmnprtvx{~|ywwxz}~{ywusqnmkklnpsvxwuqnlnrw||xvtuvxz{|}}~~}|zxvvx{~{yyyyy{||~|ywvwz}~|zxwutrqpprtwz}~}zvrqruy~~}~}zwutux{}~|xtpmllmpsuwy{}~~|{yx{~~|zywvwx{}}xtstx|~}{yyy{}}{zyz|~{xtqonnpswyywsolkjknqtvy{}}|z{}~}|}~}|zz{|}xutvz~}{zxwwwy{||zxvvwy|~~{xtqnllmoswxxuromllmpsvy{~~|{|~~}|{{|}}||}~}xuuw{~|{ywvvwxz{{ywuuvy{}}zwspnllmptwyxvromlmnquwz}}|}}|{zz{|~||}~yvuwz~|zywvvvxy{zxwuuvxz}~{xtqnllmptwyywtpnmnorux{}~|}}|{zzz{~~}|}zvuvy~}{ywvvvwyzzywuuvwz|~|yvromlmpswyyxurpooprux{}}}~}{zzz{}~~~}||~|xuux{}{yxwvvwxz{zxvuuwy{}~{xtqnmmorvyzzwtqpoprtwz}~}~~}|zzyz{~~}~}|||~zvuvy}|{ywvvvwyzzyxvuvwz|~}zwtpnmnptxz{zwtqppqsvy{~~}~}|zyyz|}}~~}{{|~}yutvy}~|zxwvvwxy{zywvvwx{}}zvspnnorvy{{yvsqpqrtwz}~~}|{zyz{}~|}~~}|{{}zvtux{}{ywvvwxyz{zxwvvxz|~~|xuronoqtx{{zxurqqrtvy|~~~}{zyyz|~||}~}{{{|~{wutwz~}{zxwvwxyz{zywvvxz|~}yvspnoqtx{|{yvsqqrtvy|~~~}{zyyz{|||~~|{zz|}|xutvz~~|zxwwwxy{{{yxwwxz|}zvspooqtx{|{yvsrqrtwz|~~|{zyyz{~{{|~}|{zz|~{wttvz~}|zyyz{}~~}{z{|~~{xustvz}}zwvuvx{~~|{yxwwxz}}ywwxz|~~{yxwwxy{~|xustw{}{zyyz|~~|{{{}}zvtstw{|yvuvwy|}{zyxwwx{|xwwy{}}zxwwwxz|~zwtsux|~|{yyz{}~}|{{|~|yvtsux|~{xvuvxz}}{zxwwwy|{xwwy{}|zxwwwxz}}zvtsuy}~|zyyz{}~~}{{{|~|xussuy}~{xvuvx{}}{zxwwxy|{xwxy{}|zxwwwxz}}zvtsux|~|zyyy{}~~}{z{|~|yvtsux|~{xvuvxz}}{zywwwy||xwwy{}}zxwwwxz|~zwtsux{~|{yyy{|~}|{z{}}zvtstw{|ywuvwy|~|zyxwwxz~}ywwxz|~~|yxwvwy{}|xustvz~}|zyyz|}~|{z{|~~{xussuy}}zxvuvx{~}{zxwwwy||xwwy{}}{ywwwxz|~~{wtstw{~|{yyyz|~~|{z{}~zwtstvz~}zwvuwy{~}{yxwwxz}{xwxy{~|zxwvwxz|}zvssux|~|zyyy{}~}{zz{}|yvtstw{~{xvuvwz}~|zyxwwy{}ywwxz}~{ywwvwy{~~{wtstwz~}{zyyz|~~|{z{|~zwussvy}}zwvuvx{~}{yxwwxz}zxwxy|~|zxwvwy{}|yustvy}}{zyyz{}~|{zz|~~{xussux|}zxvuvx{~}{zxwwxz}{xwxy{~|zxwvwxz}}yussuy}}{zyyz{}~}{zz|~~{xussux|}zxvuvx{~}{zxwwxz}{xwxy{~|zxwvwx{}|xussvy}}{zyyz|}~|{zz|~~{wussuy}}zwvuvx{~}{yxwwxz~~zxwxz|~~{yxwvwy{~~{wtstw{~}{yyyz|~~|zz{}}yvtstvz~|ywuvwy|~|zywwxy||ywwy{}}zxwvvxz|~}yvssux|~|zyyy{}}{zz{}|xusstw{~{xvuvxz}~|zxwwxz}|yxxy{}}zxwvwxz|}yussuy|}|zyyz{}}{zz{}~{xussux|~{xvuvxz}~|zxwwxz}|yxxy{}}zxwvwxz|}yvssux|~|zyyy{}}{zz{}|xusstw{~~{xvuvwz}~|zywwxy||yxxy{}}{ywvvxz|~}zvsstw{~|zyyy{|~}|zzz|~|yvtstvz}|ywvvwy|}{yxwxy{~zxxxz|~~|zxwvwy{}~{xtssvy}}{zyyz|}~|{zz{}~{wussux|}{xvuvxz}~|zywwxz}|yxxy{}}{ywwvxy|~}zvtstw{~|{yyyz|~~|zzz|~}zwtssvy}}zxvvvx{~~|zxwwxz~|yxxy{~}zxwvwxz|~}yussux|~|zyyy{}}{zz{||xvtstw{~~|ywvvwy|}{yxwxy|~zxxy{}~{yxwvwy{}~{wtstvz~~|{yyyz|~~|zyz{}}zwtssuy|}zxvvvx{~~|zxwwy{~{yxxz|~|zxwwwxz}|xussuy}}{zyyz|}~}{zz{}~zwussux|}{xvvvxz}~|zyxwxz}|yxxz{~}zxwwwxz||xussux|}{zyyz{}}{zz{}~{wussux|~{xvvvxz}~|zyxwxz~|yxxz|~|zxwwwxz}~|xussuy}~}{yyyz|~~|{zz{}}zwtssux|}{xvvvx{~~|zxxxy{{yxyz|~|yxwwwy{}~zwtstvz~~|zyyy{|~~|zyz{~|yvtstvz}~|ywvvwy|}{yxxxz|}zxxy{}}{ywwwxz|~|yusstx|}{zyyz{}}{zyz|~~{xusstw{~~{ywvvxz}|{yxxxz}|yxxy{~}zywwwxz|~|xussux|}{zyyz{}}{zyz|~zwussux{~~{ywvvxz}ujdbdhov~yrmgc``acgmt}~zusplifccccdfhkkjihkpsx}~xrkc^ZXZ^dmvztniea^\ZZ[^bgmquwvtojhggiijmnpqpqpomjfdccfimoqqponmmmnpruy~ztnhebacdedca_^_aekqx}yvtsuvy{}~|xrmhfeefhkmoprsuutrpoooruy}}{zxvuuuvxz}}|~|zxxyyzzzzxvsplhc_[YY[^beghgfffgjnsy~}|}~~}zywwwxz|~}zvtrtvz}}zxvsqppqrssrpmjhhhjkmnooonljgda^\[\_chlnnnmllmpsx|~{yxwwxy{|}}{xtqnmnqtxz||{zxvtqomkiiijkllkigeddegjlmooonmkifca``bfjnqsrqpooqsw{}{ywvwxyz{|zxtpmkkmpsvxyyxvtrpmkiggggijkkjgfddfgjlopqrqqomjheccdgkosuutsrqqsvy}~{ywvvwxz{{zxtpljjknqtvxxwvtrpnkihgghikllkigffghknprsttsqomjhfefhlptvwvtsrrsvy}|zxwvwxyz{zxuqmjjknqtvxxwvtrpnljhgghjkmmljhgghjloqstuutsqoligggjmruwxwutrstvy}|yxwwwxz{{zxtpmjjlnruwxxxvusqnljihhikmnnmkjhhiknqsuvwwvurpmjihikosvxxwvtsstvy}~{yxwwxyz{{zwtplkkmpsvxyyxwusqomkjijkmooonljijkmpsuwwxwvurpmjihjmquxyxwusssuw{~}{yxwxyz{||zwsolkmorvxzzzywusqomkjjkmopqpnlkjkmortvxxxxwuromjiiknrvxyxvtsstux{}zyxwxy{|||zwsomlmpswy{{{yxvtronlkkmnpqqpomlklnpsuwyyyywuspmkijloswyyxvtsstvx|}zyxxxy{|}|zwspmmnptwz{|{zywusqommmmoqrsrpnmlmoqsvxyzzzxvtqnkjjloswyzywutstux{~}{yxxxy{|}}{xuqnmnptwz|||{zxvtrpnmmnoqsssqonmmoqsvxz{{zyxuromkklorx~zvtrrtvz~|zxvuuw{~~~~~|ytpmkklotwy{{{{zywvuuuvxz~zvrmjhhjntz}yussuwz|}~|{ywvtrqqrtvz~}xspnmnprtvxz|}~~}|{z{}~{xwwwyyz{{zyxvtqomlmosx}~{xvtrqqqsvz}yurqrsuxz}~~~}|||~}zxxy|~{ywvuvwxyywurpooprtwyz{{{zxvtrpoprvz~~}{{{|~{yxy{}~{yxwwxy{}~~{xtrpqsvz}~|zxusqpppqsuuutrpnnprtwy{}}~}|zwurqprtx}~}}~}||}}zxvuuuvxz{{{yvrommorvy{}}}|zxvtrpoooqrtvvusqppqsux{}~~|yvtrqrtx|}|{|~~~}zwvtttuvxzzzxuqnllnqtxz|}}|zxvtrqpopqsuvwvtrqqrtvy|~~|zwtrqrtw{~|{z{}~~|ywutstuvxzzywtqnllnqux{|}}|zxvtrqppqrtvwxwusrrsuwz}}zwtrqrtx|}|zz{|~{yvutttuwyzzywspmlmosvy|}}}|zxvtrqpqrsuwxxwusrstvy|~~|yvsrqsuy}~|zyy{}~~zxvtttuvxyzzxvromlnqtx{}~~}|zxvtsqqrsuwxyxwusssuxz}~{xusqrsvz}}{zyyz}~~}zxvtttuwxz{zyvrommoruy{}~~}|zxvtsrrrtuxyyywutstvx{}~{xusqrtwz~}{yyyz}~~}zxvutuvwyz{{yvspnmoruy|~~~~|{ywusrrrtvxyzywvtstvx{}~{xvsrrsvz}}{yyyz|~~~~{ywuuuvwyz{{zwtpnnoqux{~~}{zxvtsrstvxyzzxvuttuxz}|yvtrrsuy|~|zyyy{~~}~}zwvuuuvxz{|{yvronnptw{}~}{ywutsstuwyz{yxvttuwy|~~{xusrrtw{~}{yxyz|~}}~~{ywvuuvwy{||zxuqonoruy|~~|zxvutsstvxz{{ywvuuvxz}}zwusrsux|~|zyyy{}~~~}}~|zyxwxy{}~~{xusstw{}{yxxxz|}}{yxyz|~~{xusstvz}~}zxwwxy|~}{zyz{~|zyz|~~{yxxxyz|~~|yvtssvy}~|zyxxy{}~~|zyxy{}|yvtssux{~~{yxwwxz}~|zyyz}}zyz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxyz}}zvtssuw{~~|zxwwxz}~|{zzz|~{zz{}|zyxxxy{}}{wtssux{~|zyxxxz|~~|zyxyz|}zwtsstw{~~|zxwwxz}~|{zzz}~{zz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxyz}|yvtssux{~~|yxwwxz}~|zzz{}}zyz{}~{yxxxyz|~~|yvtssvy}}{zxxxy{}}{yxxy{~~{xusstvy|}{ywwwy{~}{zyz|~|zyz|~}{yxxxy{}~~{xusstw{~~|{yxxxz|~}{yxxz|~}zwtsstwz}~|zxwwxz|}{zzz|~{zz{}}zyxxxy{}}{wussux{~|zyxxxz|~~|zyxxz|~}zwtsstwz}~|zxwwxz|}{zzz|~{zz{}}zyxxxy{}~}{xusstw{~~|zyxxxz|~}{yxxz|~}zwtsstwz}~}zxwwxy|}{zzz||zz{|~}{yxxxy{}~~{xusstwz~}{yxxxy{}}{yxxy{}~{xusssvy|~}{yxwwy{~~|{zz{~}{zz|~~|zxxxyz|~}zwtssux|~|zxxxyz|~~|zxxxz|}yvtssuw{}~|zxwwxz|}{zz{||zz{|}{yxxxy{}~~|yusstvz}}{yxxxy{}~{yxxyz}|yvsssux{~~|yxwwxz}~|{zz{}~{zz{}}zyxxxz{}}{xusstw{~~|zyxxxz|~}{yxxy{~~{wusstvz}}{ywwxy{~~|{zz|~}{z{|~~{yxxxyz|~~|yvtssvy}}{yxwxy{}~~|zxxxz||yvtssux{~~|zxwwxz}~|{zz{}~{zz{}|zxxxyz|~}zwtssux|}{zxxxyz|~~|zxxxz|~}yvtssuw{}~|zxwwxz|}{zz{}~{zz{}|zyxxyz|}}zwtssux{~|zxxxxz|~~|zyxxz|~}zvtssuw{}~|zxwwxz|}{zz{}~{zz{}|zyxxyz|~}zwtssux|}{yxwxyz|~~|zxxxz|~|yvtssux{~~|zxwwxz}~|{zz{~~{zz|~~{yxxxy{|~~|yvtssvy}}{yxwxy{}}{yxxyz}~{xusstvy|~}{yxwxy{~~|{z{||zz{}}{yxxxz{}}{xusstwz~~|zxwwxz|~~}{yxxy{}}zwtsstwz}~}{yxwxz|}{zz{}|zz{}}zyxxyz|}}zwusstw{~~|zxwwxz|~~|zyxxy{~}zwtsstwz}~|zywwxz|}|zz{}|zz{}}zyxxyz|}}{xusstw{~~|zxwwxz|~~}zyxxy{}}zwtsstwz}}{yxwxy|~~|{z{}|{z{}}{yxxxz{}~~{xusstwz}~|zxwwxy{}}{yxxxz|~{xusstvy|~}{yxwxy{}~|{z{|~}{z{|~~|zxxxyz|~~|zvtssux|}{yxwwyz|~~|zxxxy{~|yvtssuw{}~|zywwxz|}|{z{}|{z{}}{yxxxz{}~~{xusstvz}~|zxwwxy{}}{yxwxz|~|xvsssux{~~|zxwxyz}}{{z{~|zz|}|zyxxyz|}}{xusstw{~~{zxwwxz|~}{yxwyz}~zwusstvz}}{yxwxy{~~|{z{|}{z{|~{yxxxy{}~~|yvtssvy||zyxwxy{}~~|yxwxy|~|yvtssux{~~|zxwxxz}}{z{|~~|z{|~|zxxxyz|~}zwtssux{}{yxwwxz|~~|zxwxy{}|yvtssuw{}~}zyxwxz|}|{{{}|{{|}|zyxxyz|~}zwtssux{~}{yxwwxz|~~|zxwxx~wi]WSSYbnw}{zywwwwuphn}~{vsqonooplc^kzwjcbdjqv}~yurpnmmlidcp|tmigefgilllkihhiknqsttojlvwmfa`acddddccbabbcegjnrw{zsljr~{ywtrolkjijklnoomlhecgs~}zwtompw~vnifffghiijjjjjlnpsvz~wqmnv~zwvy~~wpljiiiihhgfedccccdfhjlmnnlifeekt~}}||||}~xroqw}|{{{}}yvsokgdcflrvuqkfb```abcccccddeeghjmoqrsrpmjhhlt{uqrv~|yxvvvwy|~~|zwurokhd`^]_elpqnjeba`abcdeffgghijklnprtuutroljjmt~|vsrv}~{ywuutuwyz|}}|{ywurpmjfb_\[^cjprplhecccdefghijjklmnoprtuvvuspmkjms|~xtsv|~|ywvutuvwyz{||{ywuspmjfc_\\^cjpsrolhfeefghijklmmnopqrsuvvwvtrolkmr{~yutv{|zxvuuuuvxy{{|{zxvtqnjgc`]\^cjptusoliggghijlmnoppqrsttuvvvvtromlmqy{vuv{}{yxvuuuvwxz{{{zywurolhea^]^cjqvwvroljiijklmnpqrrsttuuvvvvvtrpmlmqx~{wuvz~|zyxwvvvwxzz{{{zxvtqmjfb`^`djqvxxurolkkklmnopqrstuuvvvvvvvtrpnlmpv|xvvz}{zyxwwwxyz{{|{zywtrnkgda_`djqvyywtqommmmnopqrstuuvvvwwvvutrpnlmpv}|xvvy}{zyxxxyyz{||{{yxusplhebaadjqvz{yvsqonnnopqrstuuvvvwwwvvusrpnmmpu|{xvvy~~|{zyyyzz{{|||{zxvspmifcbbejpvz{{xvsrpppqqrsttuvvvwwwwvvutrpnmmpu{{xvvx}}|{zzzz{|||||{yxvspmjgdccfjpvz||zxvtsrrrssttuuvvwwwwwvvutrpnmnpt{}yvuux|~{xurpooqu{~}}}}}~~~~~~}}}|{zywusqpoquz}{zyyyzz{{|||}||||{zyxwvwz~~zwuttw|}{xurpooquz~~~~~~~~~~~}}}|{zywusqppquz~|{zzzzz{{||||||||{zyxwvwy}}zwuttv{}zxurpooqty~~~~~~~~}}}|{{zxwusqppqty}{zzzzz{{||||||||{zyxwvwy|}zwuttvz}{xuspooptx~~~~~~~~~}}|{zyxvusqppqtx~~|{{zz{{{||||||{{zzxwvvvx|}zwuttvz}{xusqoopsx}~~~~~~~}}|{zyxvusqppqsw}}|{{{{{{||||{{{zzyxwvuvx{~|zxvttvy~}{xvsqoopsw|~~~~~}}|{zyxvtsqpopsw|~}|{{{{{{||{{{zzyxwvuuuwz~|zxvuuvy}~{yvtrpopsw|~~~~}|{zywvtrqpoprv{~}|{{{{{{{{{zzyxxwvutuwy~~}|zxvuuvy}~{ywtrpppsv{~~~}||zyxvtrqpopruz~}||{{{{{{{zyyxwvuttuvy}~~}{zxvuuvx|}{ywtrppprvz~~~}|{zywvtrqpopruy~}|||{{{{{{zyyxwvutttvx|~~}|{zxvuuvx|}{ywurqppruz~~~~}|{zywvtrqpopquy~~}||||{{{zzyyxwvutttvx|~~}|{zxvuuvx{}{ywtrqppruy~~~}|{zywvtrqpopqtx}~}}|||{{{zzyxxwvutttux{~~}|{yxvuuuw{~}{yvtrqpprux}~~}|{zywvtrqpppqtx}~}||||{{zzyyxwvuuttuwz~~}|{ywvutuwz~~|zxvtrqppqtx|~}}|{zxwutrqpppqtx|~}}|||{{zzyyxwvvuttuwz~~~}|{ywvutuwy}~|zxvtrqppqtw{~}}|{zxwutrqppqw{rmjjmsy}~}vqnkjklnmgao~|yvvtqpnmj`SRbpkdgmu~yrmifffeb]]l}xtpmkkkkkkkkjkkllkid\VXfrqkhghkmnmkihgfffghjkmnopqrtuvvurleeq|zywvtrqpnmlkjjihfb_]am}~zvpjc\Y]fputqnmnoooonnnnooqstuwxz{|}}}|yupkhjr}{tnlou}|yxvtspnmkjihhhhijjkkkkkjhfca__dnz~xtsw{wrmkls{|xtnhb\[^dlqsrpnmlkjihggfgghijlmnopppponkhebbemx~}~ytomns{~}||||||||||{zywuqmhb\XVX_fmppomlkjiihhiiijklnoqrstttsrpnjgdcfmwzuqnosz~}|{zzyyyyyyyxxwvtrokfa[WVX^fmpqponmllkkkkklmnoprstuvvvutrolhedfmv{vroosy}|{zyyxxxxxxxwwvusqnkfa\YWY_fmqssqponnnmmmmnopqrsuvvwxyyxvsplighmu}}{xuqnlknt}}{wspnnry}ytpmkmry}zwsokijnt|~}{xvromlot|}{xtqopsy|yuqnmnrx~~|zwspmkknt{~qf\XUUX]ekv{vsqruxytnv|vpmkjkou|~}|{{yxqfbo~|rnorx|{wutuusnmxzsmga^\\aglruwxxxxyxuqibcnz{skebba`_\ZXVTSQRTY_gntxz{|}}~}{vqpy}zuplheefhmquwwwwvvvurnmpz}wpjfhox}zuojfdca`__^]\\]_djqx~~yust|~~}|{{}}{~|wsolheb_]ZXWXZ_ekptvwwwvusqoos{~{zxvtsqpoopsw}|xuv|~|zxwutrqoooqty~~zuokikqx}~{vplheb`^][ZYXXY]agnswz{||{ywtrqtz}|zyxy{~zww{|yvtrqomljiijmquz}~}zvrniecekrxzxtokheca`^]]\\\^aekqvz}~~}{yvsrtz~}~{xw{|yvsqomkjhgghjnrvy{|{ywtplgcbdiqwzyvrmkhfdcba`__`adhmrw{~~|zwtsty{xx{}yvsqomkjhgghjlptwyzzywtplhdcdipwz{xtpmjhfedccbbcdfjnsx|~zwuvy}{yxwuttstuwz~~zwvx|~|zxwvutsstux||yvvy}{yxwuutstuwz~~{xvx||zyxvuttttvx|}ywwz~|zxwvutttuwz}~{xwx|}{yxwvuttuvx{}zxwz~|zyxvuuttuwz}~{ywx|~|zywvuutuvx{}zxxz~}{yxwvuuuuwz}|yxx|~|zyxwvuuuvx{uh_\]dozzrkgdcdgkmih{}{|~|xtponlllkjd[^sysrtv{~~xqlhffghgdh{ztqqtvxxwusqomlkjjjkjgd]Y`p|zrlheca^[WUVY^djnqrqpponnnoopqpmjgkz{xwwx{~}zvspnljjiihgecdkz}ytogb]]coy~{uojgda^\[]aflrvz{{{{{zzyxwvspliinz}|{|~ytqry|vqlhda`beimpqqponmllkjjigeccfnz}xuw}~zwtssuy~}zvrnkkpy{xvtstw|}{xtpkgb_afoy~~{vqlgc`]\\^afknqrssrrrqqponljgfhnx}yuqmmpx|xurpooquy|~|zxvspmid`\Z[`irxzyupkgda_^^`dhmqtvwwvvvuutsqnlihinw{vronpw|xtqonnoruy{|}|zywusqnkgc_[YY^gpwzyvrnjgdbaacfjosvxyyyxxwwvtrpmkijnu|xspnpv~}yuronnoqtwy{{{zxvuspnkgd`\ZZ_fovz{xtpmigeddfhlptwyzzzzzyzyxwtrollou~|zxwwy||yvromnry~{ywwxz}~{xtqnmou}|zxwxy{~|yvronnry~|zxxyz}~{xuqonpu}}{yxxy|~|zwspnorx|zyxy{}}{xuroopu|~{zyyz|~|zwsqoorx}zyyy{}}{xurpoqu|~|zyyz|~|zwtqpprx}{zyz{}{nc][_gr~|vnkhgiilnlmv|yvvx|{vsooppsvy{uhhzumlnpsuuvwz~vplklptxwst~wqmkmqtwwwvsqomlkkmosuvslfjxvke`\ZWTQNMOT[cinqrrqponnoqtw{}}yuv~}~zvrppruy}}yvspnllmnprtsqqv~|yupjhmv}}vnf`\YVTSTW\cjqvz{||{{{{{{|}}|yvuy{xvtssty~}}{slgb^[YZ\agkoqqqponmmmmnoppoprxzuqnllmqv|}{ywwz{vromllosy}|zxvspmjkpv}|wpjd_[WUUVY^dinqrssrrrqqrrssrrqsx~{yxy{}zxwzzupmjiijnrw{~}|zxvtsqnlifdeipvzyuoid_[YWWX[`flptuvvvvvuuuuuutsrsw~}}~~}~~{xxzzupmjhgikotwz||{zywusrpnligdbcgnuyyvrlgc_][[\_chmruwxyyyxxxwwwvusrsw}}{{|~{xwy~{vqmjihiknrvxzzzyxvusqpnligdccgmtyzxtojfc`^^_aejnsvxzzzzzyyxxwvutssv|}{{{}~{xwx}}xsoljijknruxyzzyxwutrpnljgecdgmsy{zwrmifcaaacgkptwyz{{{{zzyyxwutrsv{~|{|}~{xwx|zuqnlkklnqtwyyyyxwutrpomjheddgmty||yuqmigeddfilqtxz{||||{{zyxwvtssuz~|{{}~{xww{{wspmllmortwxyzyyxvusqomkifeehmsy}}{xsoligfghjmqtwz{|||||{zyxwutssuy}||}}zxvwz~yuronnnpruwyzzzyxwutrpnljgffhmsy}~}zvrnkihhiknquxz{|}}||{zyxwutrrtx~~}}}}zxvwy~{wtqpopqsuwyzzzyxwvtsqomjhggimsy}|xuqnlkjkmoruxz{|}}}|{{zxwutsrtw}~}~|zwvvy}}yvsqqqrsuwyzzzzyxwusrpmkihgimsx}~zwsqnmlmnpsuxz{|}}||{{yxwutrrsw|~~|ywvvx|{xusrrstvxyz{{zzywvtsqnljhhjmrx}|yusponnoqsvxz{|}}}|{{zxwutrrsv{~{yvuuw{}{zyyz{}}{ywuttux}}{zyz{|~~|{yvuttv{~|zzz{|}}{ywuttux}}|zzz{}~~|zxvuttvz}{zz{|}}{ywuttux|~|{z{{}~~|zxvuttvz}|{z{|}}{ywuttux|}|{{|}~~|zxvtttvy~~|{{{|}~}{ywutstw|}|{{|}~}|zxvtttvy~}|{||~~}{ywutstw{~||{|}~~|zxvustuy~}|||}~~}{ywutstw{~}|||}~}|zxvtstux}~}||}~~|{ywutstw{~}|}}~}|zxvtssux}~}||}~~|{ywutstvz~}}}}~~}|zxvtssux|~}}}~~|{ywutstvz~}}~~~}{zxvtssux|~}}}~~|{ywutstvy~~}}~~~}{yxvtssuw|~}~~~|zywutstvy~~~}~~~}{zxvtsstw{~~~~}|zywutstvy}~~~~~}{zxvtsstw{~~~~}|zxwutstuy}~~~~}{yxvtsstwz~~~~}|zxwutssux}~~~|{yxvtsstvz~~}|zxwutssux|~|{ywvtsstvz~~}|zxwutssux|}|{ywvtsstvz~~}|zxwutssuw{~|{ywvtsstvy~~}{zxwutssuw{~}|{ywvtsstvy}~}{zxvutsstw{~}|{ywvtsstvy}~}{zxvutsstwz~}|zywvtsstux|~}{zxvutsstwz~~}|zywvtsssux|~~|{zxvutsstvz~~}|zywvtsssux|~}|{zxvutsstvz~~}|zywvtsssux{~}|{yxvutsstvy}~}|zywvtsssuw{~}|{yxvutsstvy}~~}|zywvtsssuw{~}|{yxvutsstvy}xneaacjr|zvrpopqrnjl~}{{{~|yxwvvvwvnbar{pfegjoqtvzytqpqrtqlm}~yurqrrtvwxyxxvutssstutrnf_bpxpe_YWUTSRQRUY^chmqtuvwwvvwxyz{{ytno|~|||}~}ywuuuvwz|~~}{ywvtsssssrolkp|~yslebfowwqib\YWUUVX\`ekpuz}~zvqps|{wvttuvy~}yx|~voiea_]]_adhknprstttttsssrqomkmr||}{vspoopruy}{vsrt{{wsponopsw{|xtojffjpvywrlfa\ZXXXZ]aeimpsuvwwxxxxwvtronnrz}{{{}}xusuz{vrolkklnqtx{}~|zxuqmhc``cjpttpje`][ZYZ]`chlpsvxyz{{{{{zxvtqoory~}~~yutuz}wsolkjkmoqtwz|}}}}|zywurnjfb__bioturnhda^]]^`bfimquwz{|}}}}|{zxurporx~}}~zvtuy~xtpmkkklnpsvxz{||{{yxvtqnjfb`_bhotvtqlhdb``abehkosvy{|}~~~~}|zxuspprw~}|}~zvtux~{vromllmnpsuwyz{{{zyxvtrokgca`chotwvsokgedccegjmptwy{}~~~}|zxvsqprw~}}}~~zvtux}}xtqonmnoqsuwxz{{{zyxvtrokhdbadiouxyvrokhgffgiknqtwz|}~~}{yvsqprv}~}}~~zwttw|~zvrponopqsuwxyz{{zyxwurolifccdiouyzxuqnkihhijmoruwz|}~~~}{yvsqpqu|~~~~zwttw{|xurqppqrtuwyz{{{{zywuspmjgdceiouy{zwtpnlkjklnpsuxz|}~~}|{xvsqpqu{~}zwttv{~zwtsrrrstvwyz{{{{zywvsqnkhedfjpvz||zvspnmlmmoqsuxz{}~~~}|{yvtrpqtz}zwttvz|xvtssstuvxyz{{{{zyxvtqoliffgjpuz}}|yvsqonnoprtvxz{}~~~~~}|zxvtrqqty}zwttvy~{xvuttuvwxyz{{{{{zxwuromjgfgjouz}~}{xusqpppqstvxz{}}~~~~}|zxvtrqqtx~~|xutsuy~}|{{{|}~}zxusrsv{}|{{||~~|ywtsrtx}}||||}~}zxusrsvz~}|||}~~|ywtsrtx}}||||}~}zxusrsvz}|||}~~|yvtsrtx|~}|||}~}zxusrsvz~}||}~~{yvtsrtw|}}|}}~}zxusrsuy~}}}}~}{yvtsrtw|~}}}~~~|zxusrsuy~}}}}~}{yvtsrtw{~~}}~~|zxusrsuy~~}}~~}{yvtsrtw{~~~~~|zwusrsuy}~~~~}{yvtsrtv{~~~~~|zwusrsux}~~~~~}{yvtsrsvz~~~~|zxusrsux}~~~}{xvtsrsvz~~~}|zwutsstx|~|zxvtsrsvz}|ywutsstx|~|zxvtsrsvy~}{ywutsstw|~|zxvtsrsuy~~}{ywutsstw{~|zxvtsrsuy}~}{ywutsstw{}|zxvtsrsuy}~}{ywutsstw{}|zxvtsrsux}~}{ywutsstvz~}|zxvtsrsux|~|{ywutsstvz~}{zxvtsrsux|~|{ywutsstvz~~}|zxvtsrsux|~}|{ywutsstvz~~}{zxvtsrsux{~}|zywutsstvy~~}{zxvtsrstw{~}|zywutsstvy}~|{yxvtsrstw{~}|zywutsssuy}~}|{yxvtsrstw{~}|zywutsssuy}~}|{yxvtsrstwz~}|zxwutsrsux|~}|{yxvtsrstwz~~}{zxwutsrsux|~}|{yxvtssstvz~~~}{zxwutsrsux|ʹѰcpblvbZrXlciyqWby{zhgqowweslc?ggtrybN{^Xdfn]_k^hgGSs]VUb_ovVOYyoyv/=jNzmvzp_Vs|ciyoeeriowu]hzdYevo~ic^::luMIJMfeqLTYuūz~z~gDi|r`jPTJNTSw{ke]K]oVe`uql }[amueT5*BXvh_KOQLOjXl\moXqbmsa:SZ{k`^b[nu}eb{d^fnst]t¼zpzfd`{NPYANi}ph`jQ^oiFU|qoi][LiWaum}`rkN]z}}mtuco{Zmwd{mmtylrU`]]z}c=U\\tpc{h\krvx|[hO_J>ONKOTZ?Y\Rupyxi{g{mzwvojgaWga|sqtu~wf_gd\zpx_f^aPEA:Q7QCHaM\alv}q{ss}y}guffoSYvu}d|ipuowloco{gTjRb[?FTGKHS[LlXYh]{rpzhyrv|lq\USa{n}vvws~|gz]kvuh^i_iPL@TI=P3LMQd^idwz|{wswfpt~|xeyeQcmi{|s}ohuxxmhxpSh`^pSO_TKIAQAW]NlWn{sjxycw~zzzt\XZqZusnz}xk~wqqprak^hUKFXWCX7@BD\Xd_e|rw{zigl|~{~qycoj^hbvys{zqu[pa^pUVdVVTM\M[RHcLaquixyzso~}w~w`ZglSn]]ipx}isz~hhlep\SSjTR\GLGidb}ottnlknsuodrqq]^uan}s}y~wy~q}ryiad]YjfeJSY@MZOP__cqki{vwvyru{zfzjXR^h_dkcirjrzzycctgYq\QL\\RTRBIHEdYZwr~y~tplgkyxsfpsmXZp]eztr|x|ow}y}jehe^npjQU^ADPCFUY_ooh|}||{xytlr{m{zcX`i^agg`ng~m}{n{tZmiWQ^cVTSF:A:W[Pnw|v}wkxieyz}zro}udUk^Sfhexy{}y}ukkh^dpiVQdMEQFDQQT_kaqvzzzzp~oz{qzj_fn`_``R_]umxvx`rp_Wfe[YYQ@D=UTE`ktsk{nzki}yy}}|rp~ubZn\Sd`ctstwt|x~tuqqemwlX]fKEL=GMMP]jcuzi~{zzm~uh~stogwmebd]QZ\xrf{uuk|obdsbcZ]I@?FYFHbhrblr{yt|xmx~rxyt}ts`mkPRUOegoo{~n~~wpfwqa[o_MUJITJKH[Uaobh~{w{{lukiuqz{p~xmkdbIMNgl]s}r}yvu~mjxhjdi[KKM^J@TX`R]gprwy}utyr{gipv~tguv\XWOb\c_owswlsxgevdRVJQXPSL^U\bS]vuqw~xl|mknk~}ywrrnTTSf\Oeowhnwy~tz~lrfoZPOZcLN[]XFWVd^j|xuz}}{{{}gjnwxrw_]SV`U_Wnpryhiz|yjp}j^`Ud]XUO^RXSDUjkj~~|}|skhfe{s~~vwqYXYiZNajp^glnui}{u}t{nzh^^fjQOZ\SARKZV^rnk~~yhhj}{m~|wljccmX^O^eem`]u}y}z{yt``Xhh^cUhb`YCF[``qxnx}wxnpj~rttuzlgfphMS\bWVhasfs}us|{xw`afseT_ccKQPJRDX__jv~|}orylgw{zih`rjcbUidhdT^qtsxzwjhdwgi`Yh`bTCNZYYmfmxv}}tlinnzox}igkxjV]abPYa\kYgnkry}kjoyfX_a]IXRQUDUWWf|wlqs}}mp{ojv}|s}roi{ojiVe`a\OZnro|xsxpiexjnlbrjh[IO[ZWe^bsmxv|vqpryqk~~yypr{t]]`^NP`Vk_bjglvqtvnp{r`fkiTW\N[EHMLVp{qsvxuwufmsugzxqjuwhvblphaONbnowwi~tw~}tukr_poj_LP_a[bZTke~zsqpqvynxn}~srzxeeklZT`PbXWb_dwzuvvbchhW]`RdPOQLRfmfimxw{tirxvgzxx{|wykvanrlbNO`ijtoexlzvvwgyxtdQTaebfTWaXsrs}zxqznl~|zmhysbeigWc^TdRX^_gvujlo}vjnpj`q]\^JPLKWfc^gqlflqhk{k{wzwr{qj{wr_QXbdhn^pmg{rv~|~kryvo_\ehei_QbSblit~z|wzzl|rel{nknpcjnXcQJPQ\pwkhl~u|tppk`tkhoVVUTZc]QRZvvy}yrsslp~ivqfot|xiwvse[bheddSgheyoq{}pu}}~tdepslm`YgQ\`Xaq}uv{q}zyogoy}vvpmjaspes[RPOXhkb_`suqu~sp~isr\YSWdl`UT\latzpvvwsfvyomgjlx}}|ufclrmh\QdW`pfgpztotyx{thlx}yt]akYhd\_gidhqwt|||lhs}}|xj|~vk{qiv`XQMVde_`drhf|ls~~y{wpy|kjc_fneYTXcScoi}~w}{u}zkqeccl||xifpxxtfRbWWkhjnpgcionmqow~nfo[el`]`bYZgqr{{wwjn{{hrzo}wy{sy{i|tec][`bXTXgl\olk}|rrtngghlqnfdcj[RdV_tzzux{yyv{vvqpljrzxt{|zjiszzwedgO[a]dmma^gpoxrzy{lvt^nojig]POV`f{zzsuz~{kyqi}}|z}kykca`flg\Y[ie^p`^pwwno}wolmu{rb]cm]XfU[jstpv{z}jhkov|ytv~{sqtxxvfksZ`e`bgi`[Z^cur|lv{gokeileWRVY\st||xt||xn|{iz~~~|xsvwgffjpqdWV_^Tlkajnrpowpkjoz~ulfmg[iZP\adfo}zyzpjlv|qnr{}|qr{|wsigwebj`]`b]]bdbivyyx|pr}ks|rjji^UPQR_rm|sv{jwmwyvz~qi`^fqvpjddaQ`bZfkgdiwzruzyrnmobWneY_a_Z`sw|sokq~|wwsqsqyxfevfitogb`VPT\^gtiy~z{w{~hryurld]\]ZVdj\txz}w|q{vp{z|uou||~u~vngiprkfglZQeYWfmj``p~}}~usy|e`hY]b^WT[k}}zyyz{zwuvzwhy|syx}|jrl`qpllg[RRTYatnauvrtvvuzzztbTUYX\gZcrmuzzju}|ytmlpz}~nnqrstonotm[bXMW\a_`fo{xxsszolu^\hh_ST`jr}z{ut{vylsufp{~z|tvdrvtrqfTKLMPgiduliqw~||xyzpe][]goX]fZ[fvxy~}vgcegnyss|zlgkujaq^RZ[WSZgoosrwxzmv{ebad`ZZ`fihf~|~zt}zqqhrttuyzt{pvpptrh`ZSPVcX_pc[\jzynjg`Xeo_jgZZ[fz}|z{pjhik||{{wsytrxngsc[[VSLP^lqmaiw{sx~push]\aggecZiwqzpxilmlfk|x{y~ustma]\UP_WTheba_iyzw{umormmo_ho\SSZes}}xqnlgcqvj~||ywpbuqcih\NLS\fmj`nnm~xqkuvm^Zfooi[[mbm|xvuxyqidgsry{tngfecafcOZ]RV]djqw{wunjjlyu_mpfa[]fjhoz}nottpxphwstxy~{veqgcigcWNU^`cacufe}~z}xtwvsidcjqpb_j\bqyjqyxmcgqx~|}~uc\^a^goZ]aVSVanskhruutrmx}kqgZ^_bfjjin{yngko}yhxwmpyyu{|qyl_imh^[\\_a[Wnneoqyx|rwungioqkjgcqd]oqs|ttwvnjltxxt|yy}vha_ahrcbhSNOS_ourns|y~xpmrxkv|i]\emofadlut}{yrkzpwrfggs{l{xbbcda\aig_[Tbecvxrvzuw}{uidlvxpa^sjajilov}~{|y|tlkpwyvvnoxnkh_Y_pdgqdXQV]cfimqsk}}w|}irujd\\jtqigoqez{utwwrxts{likqy{n{sqriaZ^ejmjYTeYYmqsrqtx|}|~_NMG`t~~xoab{ázuvSRoUot^c]`MQVgT=Dct[FbwaTNebZgf~žƼrv]SwKrePKMANjlyt|mrTYx[La|`k}Zcw^UY\alu`>JheV^oumy}zsrhZfoA_~pklusw{|_dmtk]T[wo`N^ltrlgj|kSbsx|x{zdJ=Ef{}gh}h`dURb^J_||{nbk~j^lnblipyhZ\lic{mSIYozkUSFBOdosu}uhopxqqssso[U^jkfhllo~yhxyt~uruyx}ws{~z|jSTMS_emtkWNKKAMc]_ittleemwǸ}{{v]YXM[\UbfghegqwxwwwvvodYSUUYf[ZYOLIFEHMON]qghldis®o`^WLFGNQ^iconhffoz~bNGKUZXTKEKB>OLOWSQU[cfirs½~nZ\]GDJNJL]jpvvjr|yww|tdUJ[WJVUJFHCBBFZZS[VZbhpz¸udVSVXbTO`ZWakr|zvz{}~yjehni_WX^`QRV??GFFIRZ]`kksuõu||f]^`YQNT]`bev|s}~xthuq[^\\^[TLC<>AMQQeaUXdp{}|~xqlcWYh_V[SPQYl{~{vwx}~qkmsl[SU]SU]OJIJE@IYcc_]o}s{w|zlkbXVVY\[]]Wlwr~}}~x}pwljk]WY\VNONEFSHI[WURTfx~}~tmmja^c[egVRTYbqxv{w{z|~zvuusndbYR`VMTNE@BHT_d]WilstuxqaRWaeb\T]gas~}z{{wu{xkvwlb\VROMNMQKHUQRWY[`kptxzttsut\]g\UOQ\dhqz~x~{|zy}rmprcT`\VZYUF?GORYZ[fZ^txy{|wxxqf^_hidUZbXdsz}yst|usywzuvti[SVYVWaPGPGCGQ\c`amw~rw~{vs}ooha`]ZZ^\[fwztx~}}wxu}yyshgVV][UPMKORPKVeZ[dltxuory}vrroiii`e^S_beryxwyxy|~}wyzzzl[TTV[cYYYKHGIT_`YWcrmrzs}x~v`Z]bec^]`hpn||v{{{}y}xuz}}ts~i^_`^USXXRQKKZU[c\_jqnknv||tw}}ti`jm\^bbciqonswu~~}v}ytqka\[hcXbYIBEKS[^``ccfwojt|~}|qe_flg]X]d\h|txyu}upqt}swynib]XX[^b^RGRTL\eda`efhijqyx}scjibhb]`bafoty~{xzxv}sjkkb]e_`i^YRJMSRPW_fZ\pmpuvxytrniejlifde[`jhsy}|xz{{tu{}~}~zmsthZTYadc`RSTJSX]bd^[cmrr}}~~~zpsh^mnhca_Y\hqu{zu{ssmlnnobWc_WTUUTUTSXed^f_drwurx~sqrspf`cgj_[ibdt|{z~{zzxx}~z~rkmnk]W[aecZ]aNQZWZbd^WYemxzypwxecfhigaZ\`fq~~}}t~ztmgftraf`[\Z[`[PNQXYZkf]fqvts{~tolqxvkcfohag]]dktvzwz~zuuy}zunhfebaac]`fXWVTUW[]_`_ewx}qxxotlehkf[VY]au~~~|}v|zx{|{{tpvmmn\TTY_dd^VV\SUc^`bbhmu}}wutvtoiefakl]`efelywryyzzvz~{rgdlqjc\[ia]f_WWWRPW\]^nry}||~osxqideca_]^hok}~x~{{zvwzyyx}tkwtg]Y]de_]\ZRP\WYdf`[ds~{}~zvwxtaclaa`_^]ew||}z{yq|~}~tkkqvsf\fb_fd`ZUQMOV]ckaexurrxxz}{ysg\]__[ahanz{}}y~yxtos}~swmjha`dhfefiYQYNNW]^YYds{|v|~wu{zmnhaihbYX_htxs{pq}|xwwvvwqkm`dmigf^OIJLO\i`cjjorsz~yyztg_affke\hfdnv~}|qkjls}unmppkeadhja``QRVVWX\`dlusxw}tzr`bgga[]djntxx}w}rosw{xw|{wps|kdihiigaWQQQVa]bh\[dmv|~{xqkc^_kpchicchu||qmnnoz}rkioxxmgipkclaTSTROT_ghfgn~xvvvtojedbbdfhjgs~z}mnpnlqy~znuyrtojjlh`\YROY[Veic_^hu{xw|}upppkellgnd\]`iy||ztokilvsz~zvqpsuslhkehpecaYSOPYdjkbevsy}zyznqqk`\ckmjhckvvs}wvrojgn{vyulvwnhggdbcc]^\T\][^_aiv{}yojjlkphbqogbafmsz~uruvsovqkwxustwwurtwuialgbed]RPV\bhgfojq{tnrrmc]blpogfrkpz{rtxtlfhmu~y{rqvvvpg_]`a`ehX[aZ[_ejllrz~wqomltuffgcdcdjprv~qknrrxskurpuwy|zrlnvsglfbiie_XV[^``cqlfryvopmkhgffjokjqimw|tqwxsjhlqsww|vwvpptqe_`deknba]TST]iqomsuoljrsmtkacgjlljlrzvqpvunsjfgoy~{vtvpqtc_dfd_`b`^_Y^lhnrqw}z~yvqieinnigfprflqqw|xuqqpoppqrnn}x}vrqoib^]bojgocXVW[cijjktw}|tvwkpsh_[alrolnuywyyxtnwzu|tkihmw}yxxyqkwtkiedabejhbZYc^bnnlmuyz|~ypjinssmagqjoqnpsvz}~ulmswvrnjsuu}{xsmjmmhemjgnf_WSX_bdjosjn~zz~~~ruvomgcelljilojw}|~~vr}ulffjpuz|~yqumnqkc^bimmk_[bZ^gjmmiglsvw{rqstvskmhdookjkkks}}sns{|xnltlp}~}zphhlmmofkrjfd_\][Y]fmfjonw|{xyy|vkjklljimorlepnn}}||w}yvrmmonlrzyy}pnrtncafmpnggfX[`_ciicairw~{||{xtpwqdkopokfbcis~|ywwz}wrvlkqsx|{wromnt{mhlfdcdgf`\]agchmaeouurvxrnosskcfnpglmgmu}xnoqstronq{|wxppnnmkijloliqh_b__`cc`__ep~{{|rszpnmgjnmfbdhlz}{zxu|zmqsprxytqqnkrwrvpffgikle\Z__[hjeghmorv|yroptwsnjmmjqhbhkns|wpqvyumkmrovxwxsmhlrqnlhksiii_\]]\^cfdjxv{yy}vwxouwoiijgcabeny{{|{qy|surnmnprtvvuxtlvthb`elomjfd`Yaa_fhedju}wuuroooohcpnhjjjhm{zvqpv{xtrtojvutwwskhmtvrhepljpmg`]YVX_cgols||z}qnsrplfcdhjhktou}{xzrw|vqomghnrsx}qrvqoidfjkihki[^b[`gjgcgt~}yxtpqusghhejkiefmx|{zywtrtuvpirnmwyvqnnprvrjnhfnmkid[WX[`grnisuwy{wsvrqqne]_dgkrlq{z}rrxwurmhfhot{uvsihjkkkjjmpped`WZ^acdhlt}~tpnqpkqiahlkfdjrxzww||tsx}tnriglrtqruvsrorvhhnnmmjaXUVX`liosmqw|{wroonieacgqsioplpz{z{vvxwogdefl{zxxojjosnfeipkioc[]][[ainosv~yxvlprgdceffhlptvy|||wsvwsyqillkmquyzwpmwsmniiklhda\Z\d`dnidemy}wtoigfc_fokqqjkmt|~wsutpljijrst}wqmjlrvsnloljphc`[XUXajnnio~|{qttlnle_aglnnomyvr|tmljheit{||uqvpsyqlkkgdcb]\a[`hffeelvz{}{tmkmmkmheoldbdjs~|vpoomikqkq|xvtsrrpqrqpglrjjjdYTV\bhkfjony}z|ulookc^ckonjgrru}v{uuvpjeekt{|wx{ppvusnjffhihigZ]_Y[_cgkpv{}tollmtoelligefknqywpqttsulkpmoqsvyvrsx{okogikid\XZ^`cbhnelvz|}}{}vtsplgeeinnhmmhqywoturjgimpvwwytwtuwtjccegipiad]YY]dihejt}z{}wuqtxonkaadfiklns~zsooryxnrpjkpuyzvrptvrvogjlkfca`__^]hiejkovzyx{{xtojjmmjiijqkhprv~~wutsollnoonuwxzuqrspkgghmsjjh[UUW^fjjinwv|z~xsuwoutibafkmihkry|}|zvryzruogeelv{zyyyuowtjihgeegigb]Zbdcmmkmsvuvy}|tmilppmfdomjnmnqw}{{volorsqokjvvx~|xuqmkliefollrjbZX[_adgknls}}{|qnrkgb_clonmpurx|xxywvxrw{qkggjpuvwyzqrupqoidbejllg]_b\cikllmpv{~smlnpqnfijhqqooqqs{|~~xojouvtnjqmnyzxxvpjkopmojgoida][^``dkrnktuxwtvnjigfegiknrmq{z|{{|rrupmihjnnrx}~vwtjmqngacimnlefb[aegkmkgjry}uqrqpnkphbknnnnmmr||}|zuqpsvwqnrklsvyzxrlijlqujjojhfeda][]cjinqls{}||ukgfhlkgflrrkqrow|zzz|tpponnlijpyyw}uppookgfilnjjnc^a_`dhhghmu~}yuqkprijijmolggkpy}xwxxuutsxpjomnswvsrpnowsnofcdehkha_aebenhgkqvw{yqljlnlfdhmjppjosw}|zoklqtsnmnssu}wsspljlonlljkqjhga__`_acefo||yqsslpmgeijhghko{{y}zsr{uqsomnpqqqrqququyohegjljfb`a\agdhihhlt{zsqrrqpnmifolfijkmu{uprvupmnpkpzvwxuojkqusnhmqjmlf`]\Y[aefkony|wx{{|vpusokfdcdeegqrw{wztvwrnmljmsvvy{qquplgeinnmllg\_`[`debahs{~~}}zwqopsmekjhkjgegp||zxvvwwwvumlqmrvvsomosvvompknqnkf^XVW[_glfmuuvwyvwurpnhabfiinnjswzyszzvroieglru}xuxrppnlkkjkmohbd\[_ab`aemuzy|}xuvwonkbeiiebfmt}~~~{truyvnrojnsurqrstttrvpinnmljd\YY[^hiejhhnrw}~ytrqkd``dhpkjrprx}yxuvurlhhjmv}wxypkjnrrnkmprkki\Z[[[]bfilrt|}{wwuosrgefgfdejosx}|}~xvyysvohjkmoqtwxvroxvnpnmmmic^ZXZbcdmkfhmt{~~~wspmjhfdenmjojhkq}zutupkhggjtux~xsolnssmjjollqic`\ZX[cilmls~|{rprkigcabfkmorqy~|zxwqvxomljghnuyzxqsuptrlijjgffc^`b]dheddis|{unhfggdhihqpkjlqy}~zurpoonlkqnnxvrpooqrssqqkjpjggb[WX]dimkkuv|wtulkljc^ahnppnr{{~~ssuopnjfdhpwzytwvntvsokhedeedeb]cdbeghlqw||sljjkkohdkjhghlsy~|wnklnmnqkmsrtsstspnpttkkoijkhbZY\`dhhnqlu}}ulkkieaaekonlrts~~~~yzrosrmgehlrwww|uqsqrrnhdfiiknd_a[Z]bhmnpxypljinpikifghjloqt}~}ysooqswpkojhlptwwtrsxtpqhfiigc`__`aafnjlqu{~xtqmhffgghkjppkrvz}zqpqpljjlnopt|xvyurrsnheegjpkih_[Z\agihjqz{zurtrloja_agkmmot||xuroqytrtmihlrwwuttuquxnkkjheefea_\agdikjmswxz~xrliknmiffomjooqu||xsonopponkpyuxzvsqpoomkjnqkmkaZWX]begimooy|x}z{vquqjeachjiikrsx}}}ywytuvmhfglswxyzzrsvqpmifehkljd\_b^eiihiknqux|~uooqrqkfjiimkjlorw{tnosutqlmrov{zxvrmlnommplpqkf`\[]]^chjfmtsx{||wwslifdehjklonlux|}}}}xuzvqmjjlmptx{wuxrqtrlffjmnmgcd\]bbeffdgnux}|wvutrmmldjmlkkjimu~ysqtwwtnqokquwwwtonorsvqjolhfdba_^^bhhfkhjrvwwzwpmkkifdfjokkros}}ywqonlmnmmpw|xyyqopqojhjmoojkj__a`adebadkrz~}zwsorpghhhjkiginu~~{yxwvvuruqlopquwuqonmowvprmjihhhd^\]bcdligkptuw|{rmjknmifhnmkpkkqv|wqooqpnjjmstw|vtspnmmmmmmklpiec^]_abcfhks}|}xqpslmlggijhfhkpy}yy{{xtquwoonllorrrssqtvqtqhedgjljebbc_ehehiknszvpmmljhghhhpoknpru|}{tolnrspnnqnpxvtusnkkprqnjjplklfa_^\]aegktv|wttlmnjfeefhjlnt{|{{|~}zrtvqtsnllkknqrsvupuvpkgfikihgfb]cdbhjihks|wrqommmnhekjilllms}}zvrpqqpoppkmtw~r_KBG`xq`cϪuodKobTPRdaVmny~nf^haTVggZ\V[|hMslSLNWtM^uCUx|jYuky£{rfZ]qqLvxNYqzvj]f|||\fuu\ZxWZhmg[ThnWP\f`QOlzO>f||{yi[qĩð~m\][SPbwMKpyfh|wqlm}{cXYXYczmMTseSVj}dNVnyeOEDHO]vootzuztYTcx~n\QNS^r}xg`ixzfW]nxkcbgp|nda`gu~gKAJ_opto`VSYhxxv{{cMGRfmpska\]hx}x{xcSQ^mpusg\SSZbfggf`TTZbpvrjdfls{~xpj_W]co|~{ursw}ukggknnlhd\]chu}o^NCFKLUWRNLPX`dhlrtw}qcVNQRTYUQPRYdnty}|{naWUYYafa^ZWXZ\[YXXTZadnttroquz~~~yrjbfhku{{xx|zrnmkihgf``ims{~~zskbXQNFGKHHIJNT[_chmnx»ukc[XUNSVRQPQV\bipx|}{uog_^YU[\[[Z[\\\]_a][cfjrutpnqux{||wrtqsy|{wvx}}zwspopqllpov|}|z{{qkea\ZWMNNJJLORTUZahnozwngbb^UVTQRRTX]`foywojgde`\_]]_abdc`_bggekkmtwwspnoprst|yx~{xzzyvuuuwzz{}~xuuwtv{ww{}|yxy{}~~zrjeb``b[WUMKKNTY[\`hpsz}rifkssy|vuux{~~~{Ư{mlrxLbQ{|xxYBpQX|{PnjWW_ZNa{Vyr[bfce{nuzxtf{cWUV`q]~gekvswnknw^[udakkmtikzhDrpIOepdM5:auZ@H`qrmfxxͱ̺jftOJW\O>9Puz^IL]ihiwƴrTkpTLUUICLh~dQPUUPZr\[yfTRgdbzv~{{hh}xaY]qxiy|}~xplhqx_dwpa_ezlVQe}oXQMIKTcpqgZTTW]uzp}pryc]XW\epxwmc_afr~vc]jxjgaafp{xspqs|r]TYeputl]RONXeloldXT]rredioqmf[WST`hjjga[_prd]^fmold]]Y^inpmfZRTar~zxrppqrspmlpvxtlmv}}ustwyyxxz~~y{sigmx~||}~}zm`VSW\^^YVTKLOPQSQNOXhyymfdca^Z\WRUWXYWTSXdurga_`ac`^_YY\]`a`\Z]dn{|zxyyxtrswzz{zwslikqx~~~|xwz|xx{~xvx}yqia\ZZ[[X[YQPNKKLMLOT]j{»yrkfa^`[WVRQSTSSX`jx|snkheb`bc]]][[^`__bfkt}~|{{||xsqstrxytsoligilpuy~}{z{z{zwvtrqty~}|~}umfedca_\``[ZWQMMMMPU[amw|ypijfab^ZWVVUW[aiw}vttrnifjfdda^^_`cgkotzz~~yvuwzzxvtrmnpllkgcadimqtv}|zyywrwxsspmhim|x|fexmm~\TjWVVXvW|[PbRCl{tu~Nq_n\jqqƲfS{RJmfUtqnnt}vwrlqZgTPjqYr]ju\TZl~XKhrXSZkpJtge|ð}{uVWr~onu]Wvq|}|fgU_ywVefXY^VPYpeI>@DCH_}^SrƵxqmb`niREDGKYv|a_}wvyidd^fylYPPUavuZWj|zk[RV`nwtsobOFZ{sklsxǸ}iYTZcpwsrk]OPi~mjt|}paXY`fquqme[V`xypqqr}zl`YZcq}jZQVeqz~}xtv{qkhlu}h\U[hu~xrsx~nbZY]add]UPQVW[_WPJEFQeyþ|rg_\\Y\]UPKKQ^p|pkiiiga\XY\[`^WUSU]k|}zyxxvuk^XQMOU^eikmrz|||{yxmd_XVX^gpuwz~|qkd[WUUXZZXVWWTVUOMJJOXft~~}zuoid^YZVRRQSXcq}xpjhhfdcba[Z]XVWX[bn{~}|zupk`\XRPOQV]aejpuw}yumdb\VSTX`hnu{~{yplke`]ZZZYZ[\[VWYUUVUTU\fpx}~{xpfd^XXYYZ]fpy{vrnkiijeab^^`__afpz~{z{{xupc]YQOOQTX\bhnrrx}}{xxpge_[XWX\`elu}~{qmjdbaabcbacef``_Z[[[ZY\ahmrtz{zzvlfca_^`djpvx{~|xvvupokdcddccgmsz}xvvwvwsjd^S|ŮypjfhuSari}huk{nvyyfvu_noPnuUDG^fjozi\[h{zvme]YWf{weieszϾsniUOTROTYWWB>HWQUSW`nmmhbb~wmjh`ZRL@M[eftqplXPTTKVd|lmd]Wlvynrh`htŸynijWQ=77@Nanoeg_WUigtd^dzy|upwxvneSYTfvǺzujksuotxs{kmyv|ʼȼ}sfZORQbq}u~wYLNUXjpxvty{vjq~twmnmea_ZSCCDJSuzvcYa]bdf{vpan{}~sbJXZõyn^\UWTR>DDKRGLSUKQJUZ]ipuqm]XSQZ`komhwj`cz{rkkqgZT]RVNezs}plc_MMJRoxrmba`aN]Zjnhjnieg^t~zy||skV_ró~|xpaZlh|pmgokujiyʾgdSMNBHMNM][mmjocnw|zzwwz}xv}p}pvv~uv^_hacWLU_pqmkmaffnztpvt||xq}wvl\WKPp}ywkYOJ=QJWI??IFF:3N\~jtmkraZVTVe\cihy{{{prmbrpukaUPLUUQovzva^Z_my|~mjqi\cajzr|feckl{ns|xvuqjmx}zogndwqmhbie_YYMm~deh_gU=CHEIKJghxry~uhwr|{u{{elbbqn|}z{dc_fgo\fnvu{{rt~uytkinry{ewzkdlmq|pqk^bbZbO[QQFCBRRfz}zj|tklYX`TEOPg~wrerlxxi^VYUSXQ:O[ms|ziswoqtio\c^dimjnbbulotcpyoxukn`[f]aONIO]xpxseiROYD=@77Pd|uwtrtvmwulagY[r|~roqpqjb_YLbk{wpuow|lynrt{xkdupdj^dri{wtv~rgaaiRMCKO^uxv{ad][`E9IIPtvv}sv}zi`przrsunpjkYJNYMexpuu|xgidnljokf^`ljS]bhzunnp{|ebmcfWSZg~y{spX]_NMJ=Tm}om~|{skkfkgga_mvsknp|njd[PHGZZ_ois~w}~xkqsyxqhptnksfnzzvfgyuzrij``c]lwtsuggnyvaR_XQQDIYSm}tvm{vquzjhm{{|xdTQPIKccYclüq~}djgZ^innVMV^[NOfdrz}|mmlo}xmgzm]_ep{{|}m]\hVJMKUnrzv~wql]eif^OVev{px{uz~~{`QRSVUU`QReinxp~z|r|z}xoookifstwkhkvss{}fbkuvlrqqy{zmrqsyohcdg[W[NUZc{zx|}|}v|w|}wvur}~riXPV\[HGWXcefx¶ww~kdk[crid]_jeUQV^ck{zohnwyvlilswpnxws~~ydkvtbO]]_o{~}u~t~}}~~|kYrpf``gjlvt}vxofji\U`_UEIa[XZdqýxv{xyvin|uabpxptnnsqrjSL_gqtn{}m||ybdriryzm`[ejaWM`l}}p~}swn|shmtojjmkeWSHFHALADMZqssmjrtehZ^dfc\SRi~m{zh]Vdr|q|w~w~~~zpwvuh_`\_Sdxlkbvnaj|wx~jce^fo~yyjkiuyaQ\`aLLTT]q~{jozqofoqmlvsoozmoaZYRFRhkj\r|{pomphwrll|xhT]gkx~ypshu{}zq_opyjkn`glwlVIQRG?5HObuvz~z~zijgtj[[br{~}}||ogbidb]fhbnm}|z|{}vqsp|rwjgtsteZTcr}pttm\Yihrv~w}ymph|~}qqikpmtllihYWPMTNlttpijtfh^]eov|yph`QWNW^YJFVam`iu}uq\ZQRXQbsKuwywj}yMNVdQ`nq{mSawtljhpiNGLVXIUA=Xferg]mfsϞ~unpxv]zw\DH^zpuhiponKCtxOchT[UanmϺrsooNfu_\\acaG`~iWucissumxN_nltrsylkybktQFhh>1CK_epuptxji}sSXn~{ǡtarpkcureG>4:IgzV88Vfy{{ľ~§tp\fh}hTKUO^ilrwt_^c}zaCNdqbbl~}txm]Y`buz}fVH@M\vudM^kq~ǭj_eiifqu|v}~w|n`_Wf{xkECEGDSfmvxitxvr{z}pzsshz~~v~wzu\UNWZb^aOBEAWr½tlou~|]UZUX]fXNCOJFPb~pecqwe`Wb`ZU]ei}}uvhmltjWUML<25P_xwyz}h_rvrYR]baW]KB:AAMgvǼüwhptaaSVZc^VIFPIL>KYm}ongrpcd`hbp}w{x{}zheai]QHB=Fjx}u|~~mesk\[Sb^]SG::85JN]\oôsb`[^RScaWDPPSDEKP`xvZ_olhR]diq~vy{ugWhd^QIQIJYquzxsggdocehaKFF>CGTIHUox~´kYe^`b_cSST[OHAKPXu{z~uzv{~nlcktv~~jpmqfZ_[biogx|vq}wy{~h_mmm^]VFE;<=5DV^lox{޲oa_fjlVRWa[SKJPNhq|||}mmfmhk~}sytqgmnhWXSZWlulhkohsw|z|vozysrWUUSIPSNA8LLTP]ryżve^oldQOa_XGNLP[nsrx~yts}spxuzrm|w~w|uvuyoadkg~mlt}pu||q|pvxy~ximk\LBHAIFG6.6=D8@Ldw÷ϼxtmp\`c`bVXV]dzx~|y~yvxxytnm||nx}}unsttomwnk\\[Yku~yygZgyomexzx~rrc]\KU\^OBCKMDEDU]{ĽvykTV^d]KQUYXouvxytgqz{qju}v~piilfk|~~n~~r~mrmsqu~uusrjsx~tvssn|voqqy}~sZIQIHBIL?36C=;1BITsɷhZfqhdXcisx||}~njsmuxvot~wwzvvlgpvrsqvehmqtheeln~~vktxkW`kx}vzw|yso]UZV_]QKFSOPDGLTewy{w{odb`\`W`]_wwqiwyigh}uko`[`Vbkslhjyoqssnmr}svx|xz~vf_p|yuqntnqz|xgot~||ndZNAPTSD3EKL>?CKQh|}uw{mboqx|}sp|fbbb`csof]pwyqrxbha`es|o\\ollaeqp~yspu~mjehgqvzodstz{yqnn`[\eWPPU\TONXXnw}~{gnsyrc[dnw|xwekjsqtzgTNTO]^^[Wekslrwüysqpm{y{rsruslvr}z{pr{wlluefbcmw|uol|z}rtudi_aa^QJGOVIIFMLThqtxv{~~~yvr{u~y~xsicTZbfcQ[elddgpt{pki`mkk``rsh\bdmow{{|lgmrxoi[[\b`dx|ym}wwppmwwgPSec`NSZ]gv|{xytylz}xsnxsu{rwywungW`]TNXYNKM^^ZS^gow{zrgmyxjerrwwz{waQ\\_ihofiq{xsrv~pfjainlcRQS[ONJKVfqnxuqgq{}yx{kedeije\WP`_^\Y^_q}tsrxrg_`mjmge^f{wmhvrspm^RKIW_i^Yetyvvw}|rpxxzjimk_\\_b_w|vzsu{~~xusrv|~|sc[TURadYBBORTELSX`w|kuyvrmzzx{{gebXQ]hb]Virrjnwyrtkifnj^Z_jaREQU[jmvz|omnxvjjiy~st~|}{iif^hkqcWU__WWU`g{}|{{{vdikpg^bgs}stuxplmZUPSPQORQN_`hhkryľ}|xxrhhvssgb^gx|~tp||upnw}||v|w}}vb]WRVUZOLQTLHFGQOex|y}|vts{qg\_Z]gbUJXbldalt{yuqgmpk]R`ae[Z_[Yi|zztrrzvnchjtqstiprmk~}|qphfcng]V_ni\Q\^gv}{}y{pjrvoicnjwvww{tslaLLJENRYNBEY``act~}lloysmnrz~}uut|xwzlfenorsxuo}|~|kaZYRZVTGDRTZQLIS_r{y}{~h`YVXZbYVU[Z_acontuliqto`\^ga_Z^dh~{zttv|oidnmkje\T]\jvxolx~~qhmrnVWfȳ|U:E=5NareOE\~vT2EBJfsanzssT[uyJG`rj:1E9_}|l^r~YatrŞcpvVLI~Z^{scaRZ^^{I9{aw}t}~ltSenZ]bSF;J=CQat\pw{vKmhHZmqywnld~`aqoebubimsX`uxBdԟvdXRjgnx`[agNMditnP:SfoxVbmk~}wrĽvvztG%;ȷqUQ]RYQESLUhxmQXGFU?>5% .Pfnpb]lýɽι}UFkgR\RCIBUohz~e]icqucqpnn~ǻ~xhuaR>CˮtkY\e\ff^yv}mUUB=IA@BbnopeYWo{[>OtrhjZ_UKffqn{rrsopqts}_n}}nX<64aԾzr}wvei^^Udscekl^^muzooiquwlqkC;Qp}yoc]OWmc||}zynflyylxsz}|hODF(3U~Һtxiicg^yrlonkYggf]V]ad_i}~v}qiuef]>Ie~xruq_hieyxfzyxpts{u|ooszskMG9$@bôuoiikkj_^edZnhlaVWZYQ]vf{znm{x~}gaR`VFWh|hpbcnww{s{rsulipr^S2:*BfԿtefb^oUVVba^zpmVEMTQKXum|pmldlyx[SATK;Qhwrys|ssf^_YHL3;+Ab̹za[TSmTUR][Un^_N9CMNMUj]utvroks{{]U=NMJj~tvvuxpf[][LP7;3 ?YdzeY\NhUTW[]Ihgh_>@KJJC]ZryrpumeOXk`~swyrrjipgmfe\^W148:S]νnhX>HAQSf}yeir^ng[[QIPmnrrkarh_jG@>SsƯw~lop^SYSUcF=?,73CN]ʹï~ntTKJLXWt~i~qnyfaZNJ`pv{weft`nfJIIgzɳu~xs|zzz_jbQNTP]^:8MK3.MoȾ}u|tm{j\W`dissppvzzfZlfXimjnkha`HSPMZnw̹ɺyghs]Yt{kfonw{mvZBB?5-:;TK53Rn~~uu{rghjmp|zup{{zaaoa[lhqpkbb[LXMOey|Ž~yq]mkW[~}ujelg|ihkG?=>/35BSB3>]x|z{qmrnuy~pqz~ybljX_b_mfdZ`PRUHOlu{ŸǺ}vrb\o`Tf|tfhglvfq^D?<9+13NM=8Phw{unupqxzl{nin\U]Tfjf[ZVKRC>Wno{Ƨ{svkWhdQSr~pjnkorpSH>B476JVG;GWsűwu{zmsrgosmsyykqdV_V]mgaTYJPG:Eegnuȸ~uv``iZPe|qxp{}q{gYKJG;=@XRA@N^þryyrmxgfl{xdrwrrp]X[LahiZXWRUB9Qggmvƫ{vbnk]]urvmuuve]GL>=:KZNDNQhž{lqx}lt{glo~~oir|qtfSXPJbfiX\VWP=<]jprªwksj\dvzutppskbVBF8:7NXLGRNj~peivxkzzgin{pmpuwdV]NM`ghU[W]P?Efr}xŵ}sjmcZgq|yrq}lmcdWBC574JPGHTLj~~occsuhyzkjo|urrl\cSQ]gkY_^fVCGer}÷xzrll`Xeix|wpn~{lmbe]DA24/CMILZOe|}uebpxl}wrq}}xrp]dWU\fs^`ak]GGbqļvzvom`Wcelr}uphvwlj]^bIC263@LMPcYdx|jfkwr}|oyz^^[TYXn`\]kiRI`m»xx}t}ssmobW_kdnwvsdloge]UdQH6566>EMNYw||pb`q{y{xh~eUONUCVZUT`laS`azvl{vpgoqxiYfqizmu{qqjbkc^e[^?:AKML[y{zqccqxxzriyeUHPRCVWYXfod[ebuq}|miry~m_pqq{jvtpnb^h_d_]Z9:COLLd|}}|m`fqu{}|mpyv_PGWKKWZ]^lnceekqs{|emv|gbslxwrlqs|pgY\b\bT`N5;HPHMmu}|~zh`jpurw}q`MRYITT^_folgkc|·youn`mw}p^iiowuktlwm\T]ZbXY^=5>LG@Wmr~xuehnp}|~~}o[Q_OST[dellhj_htsz|]dr~xdafdtiprkrscTX\caScN77FJ@Gcg~y~sinnuzkU\[RYRbgjkhieZt~{qpp\hx~rac\iohlqd{o\RW[gXZcI:?NKARcl}~urrr{udU_RWRRdikhin_bw}tnneZiz{neb\rjnyrmejVPT`hTbaL>EPKFZdyxtqo~y|r_UYLWKNbjjfio\fu}}smmaXgzzoj`^tir|yljjVRSdgVe^O@HQLJ]exrmlzywo]VTKWFI^jgbgp]js}{tnleXdxyqna^tktnmoYRQchWd]UFHPMLZay|tlh{}u{z}vpbZTIWGCViibhudmuz{vrnn\`vzuvh`vnupl}sXPM]hXc]YNHONMY]t~zngt{pwwuqf]WGVMBOhpij{qs|z}vvo|wd[mzy{ubtrt}vesx|^NIOdY_\WVMMOP[]t~pstinsvzqonj`^HQUFI^tpl||rsntzz|l]ctwz}gput~}|cmq|eMEDZVZ[RXTOOQ\]kplz|no~yurkmlddKNUHGWqto}nomsuszl^]ksxkpss~yflmu}iOC?SRZ[PWXRMP^_hrkvrp}~{vuhklfhMMSIHSnup|nnltqnvk`\fow~kqnq|tx~fljryiQCARO^[PX]VNRb`mrnxtu~wx|~rbghggLQPIITlsp~ljkvlnrlb^cly{lsks{rvz{hmiqvhSBDPObZT\d\QWhbupo{vz{t{uk]eekbLRJIJWlqt}ihnwfuyojc_co~vstjzzqz|upoksrcPALLWfXYbgZP_ge}npv|w|uyq~bZbclVNNEHL[koxzwjhupgxqnje_evsznp~wruwmorn`LGOJb`V[geSReapqlsyxuzv}r}qY\`kcQREGIQ_jqwvskszhuvqolc_k}uxtjz{sz}}upsqjYHPHWdXYbiZLY^aw~{no~xwpx|xrdY_hoZYMFJOWdnxrrospzssrmaav{v}kpzuprromgROOKd`[^ihTN\Zktvot{pu}u~p{z`[aqk_]KMQW]hvzupvowtstum_f{v|xitvpqzqojkcQTITd]^cmfRU[^qqupy}pxz~pu_[duhf]NRW[_k}y}~nyznvnruwm^gyuuktsnr}xqkehaSSFVa^`fphVYYcrqwr{rv~}ruaZfuhl]OSZ]]ly~nzuosiotwl\futtnspmq|yribfbXUGY_`ciqj[\Ygsr{u|uu}|sxdXcsho`QT\^[g{ɽo]V\b^bZQbegd\mzN=9=@IZhv|aRfî=>joqb[a|pgûj|VXnax}M70MN>5.)/Wt^xzsXeǾeHVbk]i~^Fbw|èbjxo]15@BGJYo~YJiîZ(gvt}|~unaS^{tZB@e}uoRJE20?Zmw{oպǾOAeSEQGDLRK;:[{mecn}SSdwxlyhSSP`r_Nqk3>¿pvpbTGCGcow}yVK4@Yuuqz³aD6bǖsSQ>++4;>E\lf[JCIPOHFK=Up{vil{~x{cTr`I9YǯzvgXNJNXrv{}xvzzeIIDZly}yɺb70@y۸kdN98ET[_jj|ohTDCFC8Kjɬzyv||sol\VYVdaclqvz}x_Y^jmjqppr^df]ZckhYT;:GM]j|fa\bjs}~|wibidg}~xshXJTMGA=Qoʪ}|tz}uoiYSRO`aepw}|c[^hmlspswacc[V]dcVS95DPduƽʿha\cnv~z~~zlcieew|{uqfUDLGGFCWtάvw~wnfVPNG\bht}}i__gmmtrt|hdc[TX]^RR<1@Pjƹükd^es{}u|sfhgcqtypofU?AADON`{յ~rzrgWKK>Oakz{{re_ejmtvrsfcZRQSVMMC1=PoǵwhheopxqnstrTnff{vldcR80/8DNmtӽ{~sz{xp\LQ4Lhlzrzuhubpvqxd]XNPJQC6B"*Fg~|vsrk~zuun^jbftskZ]Q(,%9b`smrwnxngLcL>Wq|{{vpoojs|t~~fXW?DACRE>2@:]ʯu|r]uzqq}}wunWfUXlcuk]S=%0Eby¥zvxuqrmFDY?TZqyvrrfnvrts{_TPH,=06<(FXu{v~zuqotpivxls|_i_fWa]R\E87+0\u|Źdw}qoQCFKP[{{~y{qmqsgrr_^GHPD87J25GWqz{x{tvmutwjsUa`Yija^iP?335Ym}dz~pk~uviLCKFU]x{mxemsyoyTDHI4+58,2D\ƯrygkuupvouvhmaTVeYT\RJ-.,3F`ն}ivx~vgTHM5U[k}smu||sgp]I9BBB0>D-CAG/BB5DEXfŸ}r}rxvrouqzjYjIOTf\ebQD?4%H6Lpįfx{onex{zsyj\TeNOT^XO`CH*2B\iž`o|slHSLPMRhp~ezwmwtamOMA'*/3)@>Maƭ|xvwwvnfxt}wwv}wPhZSR9NUTE=>/1;2;<-=;TT`}ϭhdq]zp}wjqoqklWFC>LdPQ;;>#ALu{{]nch^TLI]Pv}xqdtovc`;@+&+45=`YrvѶxz|ilkk|x~{lnp{w]\C@?/GJU3B?.E=hû}|{wgobv]dR4UXgry|vzZrghik^FG(-!7Fagpu˻}ZWgbirzzgjljg`a=M74<1KABB37Qkȱ~qYe]cTTHSYfžu}xqhpfoX`bPD,1$NozĬ{{xzxonddww|ktat\S_EG6'$?=;MQCQ_uǪ~vsrt_mq^ZSFdrjwqik}h\eOCI6,0*@i~ֽ}v{i[gcfz|u}v]gkWeZAA912E@;?=>PtzͿ~p|iigPYbEYbmnvum\{qesZKP:1551Vjvz|luzeb^[uyxyjmsgijIEA.*12::IIJh`uƹ}vuxipiXbaSSO]ey{lsh^m^]`RE,()&DYf¿uxvtfWX^lxwnabokZP@388263;>F]\t||t}vycR\U_dVacmqu}{tjppbbWQOB5,2;>VwzǶr|}s~lSeaelwkju_d^?88.)-@CCKCMdqª|vvsz~lheS^]N\dlnv~nbpilpc`^J/!83.P_hnsk[bWRa~|hqr]naCKE8&)94AM@Scetyztkke]af]b]Z]r~szoig^dhZD,;+(GI[v|Ƽƶnv{mpjeISptzwh`ngPM@5$6>9=B;CYdo{òx}t|z{zq`RVbfa`\nntvv|nojpgVJ66.,9:Un{z{¹rytmvdcJUos|jgibe\P='4//5?JGV^]eu~rsuw~o_VgkTYTegnlabunb[L<+43/EUinz~rj|tlSQV`mwsmn\hbQD1A94,+?CL]_ipʭux}}saPWq]_Z`_g|zqdvk[XQL678)AL`enñ|kqjmXf_Zdfz}yvb_ndS9?2/))7ERQN\cͿɹ|ruq~sjXbWVS\`eszytcitcdUSI=@40SPpԳ~mee[olaMVpyvyuoWcXJM:4"+2)INBScɽȼ{xqpqnmhFTKOdnw}|q{h\`NNQROEE/>KZ|̹}ooZ]_e`Jfusu{|iOWRZOH/-"*BDRUt½ô{vbfbv`URFNfu~}WZMIQTTQQI:FKemztpe`f^mVTfgzxz{~h^KVJG?'5/*8(?E[{}οkoaneXSBHVj|{ssfVCJRUYVMAB?]i|||tbbS[Z`kd~~}}zjlSUXNL/4-#9'1EJeh̹gk]hhceEGQXr}{rrZDLRSZ^TJU?KSgvzƤ~}zzpo_`N[kXt~}~szgUMJH7F=,:# ,T>av{uvd[nNcjQi^h~wrog?LQCQ:9-, AMO¿Ʒ|rtvOUbT`[ijn~qy{jurg_]ZPd_U`R;4K[jƵjmWMtac_m^hxcpndKSP@ZMbMhmhqhslq[|gfg_VFtgrznmjY\o\]O4<)@/;.(78SVB@]euioj{upy[ixmyULSZ^Styug`OVZ_:=396;=:;F;HuɻʽŬ_Z\dTYYql|~wpitU[h^LMC@XWx}}u{a^ccei_abhuaor~dgS[PKXGC=.$@7?LUCMh~ұ»ɾ|kfzl`Zhei~}xoY_bddfRNW]{kjonyƝ{uqleo{xh`Zt{Uriv}|kaRORPHY[@7EARFA;5`]rӳȯƼlx_dZchjujr|mkk|gWLJS3@FQIN]ɳƟXanfnhWbnktoswU^ORUSRgr}{dx^ino~pVǶyuwyZmei_]mosolg{bRbFYTL~Ybbiq{wwzvrWiVmrb_RjK]o|tbp\sj\Wdssrusjxy}wtofP{ekXd{txy}ȺhJz^IJ9cbbcYtqrecmZYslma~unihqvqN2`¶_Z^Ioqyffyc{vlfNujObZZKOhwf`ddmwkdUtxwMBbRWQBaakrjQi|z~w\VVAYuļȬviTnttZegrjc{k[O@^HME\XF_WqmO^p[tqcWlm`isoZPjlpb^kGjt|yz{qi8EH=VyȺrpW_as^onwMOZ8@b]||qh{v`RQmvgibguvYJipugl`ojbflt|zu}{xwbkb^I4YEm}wxrl^hhlpvv~ib9I9<_SvyZuzjS_hjwa^^{yg\`vighLekmu}~zy}yzt~s^gSSM0FSg˵jhlitkztzxfW93/QN]hixnVV^llz~gfZMr\K\z{wppbl|u{szypz~vtgjhOR^HD]Jyiyhx]vw|twq~V6B1H[Y}~[n~lek_yeswtaSbo~sVly{f[[me}ss|vʹlw~~{sxid[8W@@HOŭ|ek|{fqw}rzygO70.THj_~^hi`aszg{v^]Nex{zb^h{hs_eqzkpvz¥|~uqxthdghCNYM\Bl~Ƹsg}n~kh~wrvw{jEP,JOM|wpqgqocsinssxd^Opmu]p{{tWbmfm}rxp|y}wh|SGU=QH4>F`lty^mk]_eu{sxnSFfT~snntwj_uy{t{uxuqtĸ|tqgvnheKGPQM=]j̶ym}jzzh~WRK3M?Hnvyn|nsxpt_wo~eqoQIVf}wttk_nv~pk}t{|ǵfzqexmmzS;V7TI:Uuvup{ss~w{OFE4:4]hks~ein^`~gsy{z\:NSlw{zz}{Vnrztprhs`}|Ƶ~oysZjsiiDGIBZOXY•lsxsqqjwPVAP@Aglp}tqpfhgv{xmp|wlPzxxvwpmj}~qx~ikk|svj`f_ts<>H9KYdizsztvuofN:J?M`ipukrtp]{|[qnRhFLSqzu~zzdxvrxh{r]}wzsp}lc]OZqkJI96NKvq{̳fmx}grqZ`79PKSd~uzsgfhpunfcTamWCDqͭsmt]k~p`yf^who{xowhRONQuP:95MW{epvmp{vgYnL9M`m^xwndm`ox~|iVfUVse`VhǼyuuuwia|tofpp[tzpz~zrynUORHKlbSA5Pbr`|{qn{uSv_GGVmmtw{pmZftof{_bZWu^XZrǵ³vqqiyb}shqv^eju{}{}|}aKWKNaROS+Ahxzg}~vtuxw[ceJ:\qi||u|~scdb{wug`EYgZf[sx{yxl^fsNghi|tkYQCHFRTSM5E\xvzhyomj[taBEWtur{{k]w{izjxs^bIP^]Znz}Ľ~tpos|w|gi]Wb\uxy}vsxjKPL<;KONjP3Fvzslhntpq}kte\Tappv}z~iXh~oe}xqqqtNFe`jgt̢{udvm|u|x\aat`YvuqwzjV]M:CWR\X<NcqK23>\zÍcow|zUbwKSflB(;lo{~pmc=&KikBLq|}|ȝvaC?JW4S}fBHQBLN^i}ak{WRgh<-=kpf^oml~wUW\z~n`fmzuqjuV\{p`V}cZdXKYrʱzTl_mzj^xaF^ujqWR[h\ivqhLay~rXWviGHINjqi_QO@QZpvi_ktuWb}wqaro~wa[MZUgqeRCW[\nvr}fIJlK.;R}}zht}f^mbb[EH__}w]N`~پyyiUMNux}wqRMbw|rlJF9DWQGJEYQNNFCD_gahgVjz{jɾx^948XnoƸanyeZmegeMJ\Xl{[?EYjɯv}}ypxued`gɾz\V]SLNJb\VRLHBNOIW[QfzpiaaWvwihuncGJU{s^phXX}x}zvyz_KZlzmosnvs}u}rvu~zvc`[LGHPzyxlvsmg_JYf~zw^VDIMMB,8Mwbipd]{|y{v|uxg_jqflпvjrZabhj^csnwbY_[__aRIX_^wv~hcazhUJ?PP\C.-35Oav~p{{SCLM:Vp}vvwuqdda^Wn||}}xmkmhjlvpfX3:G;G-Mguorbc`b~p^l`uwnr}{wuhi\cgezpvlLTglXgecpYdswz}}sk_UYlbZm]ku}{sk\nwtx{~toxjzdMUkpt¯xupqGDT`sjnreC&7tS5g}u^`Vyppo{wmZ\\agj^@FQuqxkfi|za]jPm{oq^\lʞƲǩwW;9&.a{rzYDQ^QSzsgkwqt}_IK[xohnW]cu{vlcmK?85*Kbrt[j{pU\r}dYdfmq}bZFWXW0#)@n}sŽ{vqp_x~yoC=Uo`XSjdonhp{xlW[N^kz|A.1BHfŨintss}o]LRMMNulbqzsmc}[kpwqw{sqN@D]t÷vlYmuWLIB:SVkn~xadk{kku}VNCXo|bIFIQH^s}|nxxr^sqyaeYYgpke~t{utvt|nacK@I?N>E_{Ży~j~Z\`hmdXR5SYawsz]fbSalkd~mLO7Pwtyeuo¬mhwolx}nuwmpjfiw}omqiqkcxv}~q`SGHZoȶôPJPALTf`p]VP]y˳Ʈp~tvyinrok\cSL]Zrsthtlk{i|mqJE\DPS^GFKSiӏ}pu{b5al;jirrogvaIs~hhmklsgj}p:wx=XzzʼxrbggMdoT:?RO;*+O|wmFGIYVbmoype_vhUGwǧlHdmKiiXC=TV]Woz\;1V}wˢ{|k\^iwzcUAHXsɰte`ynbSZlfgYG;8Xdx~fwx|gzrZY^lrpp[C1OuraYw]JTpl\h{|vxkrjfj[REJYcfS:+UgؿxgXzt~muD4CP<4)+('\`yszxwtthw}t}{r}opyzYZ`m\g`_QA@9@#3D6b`piǻ~yzrkqvp{zxxjipuukJQQh\^uTUV[MCN>\U_XXgrΰŲ|umyzmsQb^XWowvqk}ygcXVoZuwnmSgXyeebWPebj{wñklgeURp^a;<`elq`RXm}u{`x}\[RI,"=2Hxxiat~kŚpJxX[srzpY>gaQuobZpypayi^f}lZPSMVYUWYxxbrȤyzx|^>/@buu_{k~tvtrml}W2Y|zb:’n^rcKMZeN^`fl]lqb~y^vv`|y}xXjmoeGBRtzpgʴzXWqդuJ7MM^x_9ClxdLJMLfvk|Ʒd|[]ai|xHSk{{ro~kjm}~Ѱmww}`J16Pgx`X_FL[WiWA=Wqxnjbool]|mm|}z{oxeZohgps{v`0=_u}dgZbt`;=Xn{q}zgVTJPok}ƭ~|qxsfZPUyƶyOQXm]tol}of_jWABQju{kS;;A\rjYZRUPZV_hS\qmuprs{vmnoxxeXRjt~|}[moxvnosS?ONTVikgYHUwt_iooeZ^gZrdsmf`RVYubaU^muzmpw}lSaTUd\vuzZWƶ̵qj[PK%%9;A5@Fupmdr|qtrx}yw^lbsnznukmWyv~hdgVWTnqlc]pt~olitf;=;4QT{veryvldYReQX{wbqseW_^nĜ{{|f|ywcpkt^|rns[WO^eeUDRPYORVs}]dh^m]yl}cY:LXb{wbVikth^HRhixfTBJIVgi{tilncinpklpoɯåsfaaA6(4CYVYypme^gXxry|zxxhequmxhZgII[aqhcL]kvs[JOLZ]XnXP\P]Xt¥tm^wwsspwzxw{`zi|{~w|qy}x{thUHYxskzr~gflQ[bjwldO`arwcC778KIX~o~y{r}~Wcd[\=:0AFIs~sgmkqsrs}v}kl[l_jmvz{̽lvcRXOZXJ7-6;]e^Tdomcrvhu~}jTstysv{~jlzf^PMW{t]iebluk~hbMIL=QZsvszrʷz|gsouegMVSYqsuuxstvwy|\JcbU`~mvrhsp}o}rgZ[vkli]]kabr\PB2EAWlq~}vtog^etjn]ibG[Vhxy~ib\nnZsuyz{xzqcz~{z~ȡznVHNn[GG80CSVxv}}izvlaonovgtVZ\|s~nnwywerg]avaasnhvxeeWbehr[råmqlu}||fpvttjtyscPLj}iqmwy~~zlfro}thj\IYZgxzxxchm^l}}{xnyl^itVhuhcbxwu{|~{|n||qW]WTB=bQUdjxunx}pW^akihqvk^TZfijup`itnmvVJidOC3%8D7[p}~~ul\lqzn_lsq}fio`j{{yfOS\`Yn}|rJRXfztttu{ʳqyf`ms|v\kdX^ifly\Sz{{q|~x{ld^X^q^_^Spil}ls{pOMX\Sd|mzyp~rp|ofnnvyf_X5?;5?Tbyy~p}vzy~ytgvvlu~jvkhmisz~pi|y|gKIORZZIf]CFc|qpjh{l]baf}~~w}}|oz|i`n`nheotyz~}lbK_s_YLQdtn~narzrrvp\s{xq^pqobeqnunl}|l]J9RVXU`kwyvvx|{zlvlutcnx{x{wkXeyx|q}s[eynie^EOP\YGMXRD\lpuszxbevc[~~{uusqssjhajfZ@@5?A.=[lv{sx}wYZw}wnkfbSdiywljns{x_Zegcix}mikVdfljcHPlgl¾|zjfjkgksnfbtxwipm||mimhTUXWeL05Uckr}}v~wsw}jfhjdjtwgopds~t~yx|sy~urzsyfJGGG>Imnepkyo}}yzzu~bchiYdmurj|k^XSYdYeWF889EKatxtxzpxxlhvrv~n[hq{v}turbum\pvsbY]Z^pf_{xn~~mzxy|zemuo_a\pw{oymdqqzrhRXJAPXC>?\qsm~ttqlglxyss~~|{sr}hfrhmkndlc^^H?U[daen|­vj[Xg_XJJ6;N`~b]tprsptheNWl|rdDFLM8Zcvvmeuqu~{{~uZQS^UJ\kz}tsbryhprquhwi]\PIYcbU[eYjjto^_d^gPU[blu{qo¼{xlbfatdZLYmfXWZ]PMW`~yth_WiizlVT]pql}ȶľ}{h]F5IIGZd|ppnvsfypjbQJ[hk]n{|xzs{~ùwn_\ee~zt[ivofgb`PXUb~{xi`NLTQiZLJWcfk}{|z{zneujhWC=LVSG_gtzyu}u_]P[epkYYf^osk}yutnd[g]x|vfokuob\cc_hln|u}~}juzwu_NQ^cTRb^mirxi_beudaXSdr{o`jjl|~pell|dYeaYXRJ:CEGjw~usidld~~qimssw{v[NSYTCSSbmpuut~omYap}mluoyjnt}~rv~|{oWchfhjdWVdZu~xjpbmyk_XZVT`[]ur}zrkyvzybSWafU\__ohqvmjjxw~nk~°vmqru}qryt{zy|vhWe]`yrocb]Ulid[\]Yak]orptpsyrxoyhNBEIB7D>Q[]nttx}lmypjh`rjvyjlt|~rp|pqw{the]Xd^[njuwyŸhoikuaLJPWNSYTkhioljjs|vbj|tukp}rhY]cwusyt{}xqornaGLNFYeutea^\^L^fhjhifj~xȹ~u_[\\OWTTjfjoptumrwvgrwn~vlqz~uuunjnvugP[WWisusorn^onrqkcXXe[fkkxqn|wlujmpcooyo}yihlnguqt~~~udbfzoqynkm~yoq{|pX`^^ov|y}zftqv{wodcrkuyuvjszzvx{jpykVNKH>MILcfiggno{ojw}vublrjxstz{~{t{uszwkYPZT\e_qpfl~~|~on|xi_\ZP\bZpuvlcdehzvunuwst{zwiPHFZc_nhlnv|s}nfh^oqy|yzrsvp}ujsw{vgqpdVLE9>NF\kuvmpx{xy}|g]Zjyu}}~vhp}odfYiloz{tolxe``S[eeTDIMRieu|zyosxlx|ztokag{uyyv^PJWfdvqs|wy}rscrvv~}yvvrrfo}vehimzy}upy{oylcewtwj\eec_WOAHZXo{|y~qwvq{~to~y}|xk||{{rejvyeRTMWibqywu}}}urt{sywwwmbR]gfz}nghnxn}xttvytqshsokx|w|sbWPacmzqy|{~qk{y}~wrz{orj~|{omjeecVE7IIVflysfhm}zxymacpk}xpu~}rq~tztlu|v{hryyzx|z}zyeemzs_YSRifpyz{}ut}txtt|zn[^kjsrz}v{|rrl`THSPVdX\gtqm|~v|{~tlp~vhfYkqpzwtuv|z{wrquqqkejndOCSPcou|qqw|{|qm}}~~zujour{u|u{~~y~tb`gqkYSEIYT`b`ekqv}xtt|xwop||nYaekxmgsyt{ukp}utole\e]hrhkt}vz|}tpyz~wpsytgx{~~~}srt{sqh`dmgPAKEVacie\WXos{|}tnyyx{sz|~wzw|||{qq{snpz|qj[Sc_imhjtvwxtty}xr{jdkg~ukj}x{{yokwuofacXXRL\TRVbh``ji}z|rq|w{|yx{{uu{|~ykdltmSQPOfjqpop_lPb^M;AJOp|j]qŰƶ{nsYZiqtqf^bbYphVKXiwgWN<5/Sv{SzYqit{sxe_dcqcdqpJ7?Vk~poW=LPeoni}p[RNXtlzsUWUpY)>Ѥrev{lb`s^`dolgly{k`VPCOC8I9H^qmgaOezycgaVi^eWFQԥuTZvkZJQYntlhWQZrxit|}zkckW[gm~ƸvU/:\ĥ|[O\klvdTZNTQ>4+39WncokWZSB49M[pnWSZXai{{~}_[XMg}|zypu}w}mZB%!Km̽h\bTOM;IW^h\Y\^`kpkoeZWipwusimqxq~Ľ˹`IJ?0"8Zxʵ|~w_T@?QRQH9REF34QsѺrvdib_lhgswww}yzovrl||rrcijsq`UE\R[cQZ\uimjar~y}lNaYcpUNO@=1,;>M;Kn÷¸~sbm_e}xs{{lf]iv{raopsanjhwuia~oombnqs~~s|lMaUUZGD.9BUZOpƼ}jlpc}}}{vrnrcklwspuz{o~uihKLUAOC@1'8G^MWtƹ}levjs{r~~tys}yseyw}ir|vpebw`_^_jjxruesyx}{mWfONPJK:EQi_Qm~ʸótk|zuz{y|zlv}yx{{pbypgniurltyknwqkIN@3=4:+/@W]JgµȲy~ozlfx~egkoegti{wp}tbpwflbihqzwx||th|uvXQTAMGI;0=QdSfȻqnvev~y~sonnyyu|zr{qochimw{xtwu~lxnpZQYFLJOG8@Vn`kǼĹsm{m{v|}snykhrvlbql{ju~ysek{eaYbgjtuskprpxyi[cLIHLI:@Um][pzðigzpz}zrwzuz|qhwrwxzuqoz~mz}l[\A=>D?06NeUVm~ȹ̹zxu~~ofl{~{jeile`ohuxj~qs}kgdlkkr{~zywwavvqvfUU??DLC11H\JPgwrq{iuwrp{wtz|zswssx}yu~{eyulnaQSA@ENH85KbSXm{üƲzsq||}~mmt}nimwpfoiwnyzmo|ma[acemuuolhtfvzstkY[JACJG94JdWSakyŴxpz~s{w{~|oirwv{yr{gm~vqsp\YH78AB5+=\WN[iyͽľw~vnjsxogdkk^fgl}}{hm}s}wg`flhiozyotf`vtmnrd[Q==JQH8=[aS^l~ŷƶ}{~sszupu~vz~}srvpmq|{ppwm[pukgh_OJ84@KH:5QcW[gyͽ˼zv~{}{fik}ynebomflftnyvr~wjdjjimz~vmtls|z|kbWGIWVN?Nnngmwɺr~|{vyzt{vwuw}zshjooqw~mnvp^nnihjfVN;0;A?3.Nb[_dvò|}{mokw|rlfcqngmk}nztnvwxvw|ljwrqosi\Q=;LPO?Ghkfit̾||~zoqpyshlxsuz}y}pqtplkzyyhfjwlQ\d``]^MB4&2CFC6Okhilɹĭ|ooox{tiu{w|z{{smrpolv}lpujbtrsprmZO?;NRTFFkxvx|wzx|msqxwln}zzxw}t}zugghggh|}}iderlT]a\^ZbSG;,6CDD6Onptt˼įvxuzvtndsyuwsry}wptruq||ptyjbkeieifSJ96HLSFKovuryŹ|xuyniki}vrp`gsqts|yv|{wnqopjl}{zvbefueQ[Z``_dOC6-@JUQIk~~ȿǮ|joj{yykhwxzy{x||qssrplqlkwu\chjoircQE6BQVWE\xy{vv}wy|xz}~gkgs}rtjcsx{yustrqoojvnmvy^afdibkaOE7>MQUBTtw{vǽŰqspwqsj_mtwuo~q}}{xwtvnyopxgcgdjbkePF7:IMTCNortkw{xtvhjinswpcnuyxs|~|{xyn~tigoy_[^\f_icLA25EMWFRrwzqŽ˹~mmjqvzqepuyvquwvtssi{wmjrz`^bdngskTH9=LSZEOlprjx~~pqovx|sgsz|uu}zurrgzxnjpz`\``jakeOD7:HOVBHglpgtŶrqpurun_howtjtq{{}yuwk{}pmrlcgdnfnnVI>GUKBaosmlªyxkklvvuyggnvzno~|w}}u{rowsl}ycfbmro}lWLAJT``M`uwvnxnmlt|szldls~un|p||srpcy|tkclu]YX[g^jdL?58EPYEIekoep~|toot}svsbglzzmtz~tz{uqzikfsooxcOE?JTbZKctyuns{xhgiq|slufbhp{ojwu|}rtqd{z~md[eoXUQU_Xe`H:14?MVEMirwlxzxqnt{u{|lqtu{zsuxsl~wdc]kmmziRHAIRcaRey~|s|yqv~kggovwlvlafm~wmxo|}yu{yzqln\k~uzrg^_p_TPN_ZbgP=66AO_TNhu|uw~urw}|ynmp}zy~|wn|tivzgd\fmgsiOB=CM_dS^u~v~}xqnyfa`in{tfoi_ch|wir}t}yv{z|rlp_lxzrf[[k^SOM]Y`fR?89BPbYUm~ô­x~snsxwwqqs}|v{qkwoettc^UagesiPCAGPcfXezy||xt|jnvhbcknzphsicelwnxq~z{~txy}pol]qw{qj^ep`YPTb^jiQ?;@J\i\`v}zzrnxzv~{noqw~z}luwkhwmb[Whflq\D@ENb_Xbp|yw}o|vmcknrzppvjhduqotx{|v|qsfd{~|yqf[fe\RIX^ai^C6:>G[ZS[jyyvxxmtxyyv~tqmz}w|||sl~thqumbVbjlunTCEJOdf]ao}~x~}prxqgjqpxsnvnjemvmqu{x}rv}qpi^p{xvpi[bhbYJR^_hfO98>AU^VXdtyrw|zuq{xy}vqqwyq{qpxum]]lnuweJBHIWf`^es~wy}{m|ulblkntlorif`tnlp{v{xyqx~ppbbwzytqcZbb]NET[af]B39=EZYTYeuvu{}~ru|z{|xrz~zo}}lotriX]ilsr^FCJK]hbagw{~xziyzrjbmknslqrkhcxomr{vwu~tmtylk^`rvuom_X`b^OGU[bg^D6AILaiijozyu}y{{z~w{ukr~}likolWVbjrsgLCLLZiijiv|}u{|gqvrlaihfllqsrmewxrsxuv|wiq|pl`anwxrtg_aceTJV_jmgP?GJSgjlkr||sw{w{~wxyzojt}~wijjpdT\fptq^GIPRgmnlm|yv~rkvtshgnjmrtyxvlpxs}~xtz|liytnd]gsytso``ah`NU_jpo_GFOPclmml}zzv~yy~{{~zszqjr~~nmltoZ]gqyxkQKSRblnnix~}yzmwwxojqmkqtyyyomyrxĢaVNFR__juywUSbls}cywskG@VlxeRDYyUFUcs}tvfVis3Vshv~}uxfb[hs~e`ot[ieahz}zn]XJThtyj\HQxkc\_m|ypLctCAatl|smynj{|m_ep{iiucb\SW[gc_kgkxzxlcPKgthkpvx}wzYKguPJ]gef}}rqptnp~ormdefrywryx|vk~nXAEbrh[I=I\ZQE75:EKObgs|kXV\gjjYLVVZa\VEAPYfgnf]pz}xqqj[cu]OGNgoT<;NSKD9;DTej|{z{pZ\`bnoqjeww{y½kH9DCOV\^Uanroef\cxzxqjjjrkajvqR>CMbznRP]ZSJDLXm}zfijp}~|x||}zyuqaH02AVro]fj_VIIP]orz~xxwoptv^V\]jrxxkqvtlad^h~zsmruruyxhb`dhtnfjsrojYC8GYtjgutmd\bk|}~~z}zwruw}x|gYYQB16Mgpvypb]biz|xxv{xinow~qjomkaedh}{shfjhhhsztyud^\bertjjoz{}zyc^^UFJUMOS\bXfxqpv|k\afjorg_kss~~{}sjrpjbV_fle[NHNQWdfjXTlxwor}z}x~}f[bdfdecfniou}}ynY`hebQRV_]QJFJG@PUb`T\bgjezxkkhljljddbnw|upqhibfednicVNNEWdjgVZbfmcm{|v|mpgja\fjk_Xlsyx{}sehecXXb[_WWXPO>;JWd[ZYRY[eqzzzsrfijiiZiv}q{}{nid^pnoiekaXQFTZhb[c_^Z[qrxvvt_[dfm`U_j|vvwt}~~|yqgdQZehfPU_ZV@>AL]Z]YQQI`mt~}|~ilgdkbkiswtz{}zof\nn{ragda\MWQXY]dccUMgpvstum^g`ea\`[jpvtmulzwnTWaeq[U[Y_NDDAKOZXTXFR_mpyx{tnagbopiily{}~ow`ljt|kndZd[`WQMM\_fbO]`u}l{lorg`aUa_cbhqmrng~|qYc]kdYeZTXNQDFEHMNYSN\Wptqymedbqmndgryusrij~kiwd]o\kYFMLRUoW`u^uhe||{hw|}yhr_R_Rbh^Z`xmxundjesoWk[LQM\PTAIL>[ONd[dXn}roi^^\lknogzprkmnmU^oV_NFMKRF`er\s|vz|ytvwunr^jZWb]gXgzrvu|x{x{pLclViJHQLD>G7KSEcUbj\yzy{inbjrtlizm{yr{^qobZUdSc`YVBNHOrltehotz~|vyypym[WZVnZYhYZrzz{sOVdVg^\VBJMXQEC7QNdnUfkXg|hba]Xjzviu{nw~sbeaxoYQ\\H]G>TT\ehrpgs{~}}r|zifh\\YRVpfepunz~v~xol~d^T]TNQDRG>9?GGM`Uivcjxv{psmjfvdltmpgbmbPSaYQTKD]Thdnxd`hl}y{{r|wq[WLTafcelcr~kv}}utx^T__VFOLRQTRGU:FMPbk]fixlk{~xzqcgvebtgzqtkik{fielPS[LQOTZVjnWj_eat~}yzx|}~|ww`ZKXO\lgzdc}tzr||y|vyjgeIPOVGIUSRP8I?HXSedve]h{}~yg{s_kxykt~nqidjpiWS]S[C]SSk]^kujdYlzxu{x}wvvdgc[TT\qdgtjpq{olkzqfLQVXDEYHfOGHGNTNOZeg\cjxkyouulufvum}~rx_dinvXdYca_XHDZYaeej^eipcry~~tmryfp[c_\Y\]krlzvdmp|{m|WSZdPXNDLSWaAGKFT^ZUZUsoqw{rqiqyyqzf}r~zuZcgaruY`WggVLMMRqlm_mejcl~vtf~q{zkf[XcJhg`r{vjqqyr{n}yujYYNd^[DERRYUOBPLcRMehjtntluxz}vyxpx|vT\hgtd___RgIDW[jrjpxkeyvx|{jpsohi^WoYdpjelkxnwz}qtpruWXZZR]DGORc^PNYZS[h_qc~mwskmyt|z~}r|vmW`hinuhVflWWWOdSlpohh{yw}~yt}ui~hmTdcjd]ohiwmpz~ǻ|MVC3IDFGYT]t~|hqåtuvfzr`oԶsR\rqVUi|mSON_u~y^kjnhplkUmot{_v{g}tSpyee}wNDDYu}uNLXemv|bcgrr`VNmupkifnǯW;ǃZUoylkXUHcylvɲneZun\aqYMNmuYX@CGRzt{_OYktx|xtuiiux~Ĵ|yR)+4K״jQ;ETRVF/37:Dhq`pt~jO?NZntkolbemkhfoxpkPR[Y\atozxgb|wuyV116JӸzZEN_ci]IQRS[x~rqcsiowvvwx}vc`ykL*(+?Ŵo^eswp`FNKHQim]js{aQbl}zrrx}rnSV\ZZZhYdwxrmrovwtswobpsu|}aWuqX:24={ųúuel|z^b`Zbwu~rqs~{|vorxwpux}u[JefM5%,6nͻʵy}da^QUbrfhps^lpymvvxpq\Vc^e_n]T`hi^jebp{{nomfmwypbisqzbM`v_K136]͵÷w~yjqadl}zzr|{nv}u}vzd_pi||`JHhWH.*3Mũho`\^jphmyigrzmmqnnnlYefhgjpWZ\ma[hZbr}wvhmw{mm{}|hWiimkYGgkYD-7Esò{wppelq}z}{~|~rtrwr{v[[maxpVADdTK.,Pyñ}~rrgom~zrz~vr}tzq|vxz\QgVjnTB6YRP:1I`ürmbbcdxulzvqsss~z`Ze]iw{ntnirv}d^Yrp]l[_hxhhr|psrQ\fYveW@I`VU9D\xȲxqrfpiwm{zzzsyy~~r{u~tz_JdR^fNB0PPSB4Siȼxoeffaxxn{yssqnzzuZVd]m|uxniszhaZur_l\ciyhjuot~rM\cUo\S;BYXZT_}̽©os~k|wuoxpltyhYe]jv{~zqhxnxtlclkn|z|qsrzbxw}kZgQOTYR;>RdL?U_qʹ¦rl~ot~z|yktqvy|suzv{{uclruoS\OAGLN80B[Q:L[iĹκo{q{zrp~~lnuw_`daux~ylm|pqhfpjszywqumc~yv{d^aKLRYK8@[cGJ[f|Ŵmrn}{y~~x}yjto~xypxwu}xs~~^lynrjRYI=BKJ6.E`RCSbpͼq{u}xrq~zlktu`bcfyzzlp}srhiqlrz{yptka{vtyd\\GENUK7=[fOR`mƴosp~xyz|uvzjsn~xxnvwszxow]cxtjlkTSI7:GJ;-?`^NZiwŸĮrv||rrv|nhmwfafe{}ro~tylhrnnw~rp|u]p}totlYZH=FQN>7Um^Yfuʵxpv|~wxw~tq}|lro}xzouxrvylq]\qogfjVOG44CH@/>bfZao~Źȱuy~{qsuznfkviehirpwzlkspowrpzs\oxqmqlYVF8EQN@8Ypecj{ȴysw}sxu{ro}zospwwnvuqttkqzX^mifdhUMC05FGA0GigbfvǮx}tssx}wneouhigqnuyvlqrqp{~os}g_rqomqgWQ>9KOMGG:5[kddjǻ;qvs{uijwqljlsp}~qqtspuqqus\jnnmmo[SE7EOPE:[ohfg{ù}{{|qws}pn}ytrq|tutusqrnkn|oU`dcdafSH<-;EG@3Rhdcbw~ƻƫqwr|zlixtpkk}to}uuuustrrtv^ilnomr_SG9GOQI:Ykfc`uyü~z~ovr~}nm|xuoowtxyvvrtnnn|nWaaefciUI=0?FJB4Rda^[rvǭrws||mjxvslj{}tn}{{xxvuutt{aiknrmvdUJ;FOSN;Tieb[ntz~otq~|~qkxxvpk{zo}{ywuqsnmyw[_bchbl^LB3;FII5Iba`Wir̵svs|{}thtvuphu|}l{~}y{suv|jflktnvp[PA@OQVBFdgf\dswij~{~spps||yipwwukq}pw~}}wypwoon~jZb^gegkUH;3BFNB8Wcc]\qsĬsvt{}mluwwmkz~vp~{|xuzwtfjimsnxjVK>ENTT?Phgf]lt}z}opmux{tgquxtis}oz~|vxmz}omn|f[`\gbhiRE84BFPB=[egabuwêttt{}lmtxznm{yr{}xt{wsgifkqlwiTH=CMTVBQjllbpx~}xyomkrvxtfnryvjr}qx}}|twlsolizjZ^XcbcjVD82>EQI>Xiljfz}ư~ssq{x}qjrv~unzs~{|pxsxlfedpjroXI>?JQ[JLhptkq|ytrkimyuuvfjowzmp|vu{~}}svlmokeumY[U_a`jXD82=DQOAXlqqk}Ų}trpzw}rkrwyp|u||pxrxkfcbohrnWG=?JR\LPksxov~{wrpkgnxrutfknz{ms}txz|~~{rvho|nifvhZYS`_ciTA64?GUNF_nurq­{tps||x}nnr{utx|~wr|xp}{hg_gmjugPBBHS]OQdntjry{vqpkgpv|pwqgjk|wiowoy{{z}~ytsevwqfjsd^UUb`igP<4:?KVHK^hogov~¾}}xs|{|rttrw~yq~tutlc`nltu`I?BGQ]QO_jqimuz|{osmgpt}~rutijhx{jlrrt{x{{~~tvgo{sifsi`WR``gkXA58>GVMHWcmhisx|{szuurwuz|wv{r~zph^jnqxkRAAFK[XNXdomiru~qvyqijrv~wqxmjhn~rinxozw~x{wuoeyvqdkoe^QWabkfO:5FGSa]_cn{y}}y|juyrmcklmqnrsomfwtpr|wvvvms|qnadtyzsrf`ecbSJV\eg]D5<@IZYZ^hxx|~|u{}|}v}rrxosrrcWbgpsjR?DGM__^`gwxz|{}nqztqfjmkpoqupogpwpo}wvt|{mp}spdbpx{utkaedfXKU\eibL8!-X:Y_$QCSV`I;t;>E2C.ICRD$Ya0kqƲStyiyVordklbLFr^4E?FGGM9T]Cu~smhKjdjNE`TeBvpoHCQHmD6vstkliQO<|zw¶ѷ§϶|ucug[cMTL\hJqsnYhRTVA=JO7`jL;Q{kSN5[]F^4Rwej\P[{]c`adkubxYapm[Xpǫ{zg{fo|sqkKSmY[GNqQpmyz}k[hd`4`TeIWsI}˷שŨҥpgF@.!(3YE׽}{[\ZADRW9PZHLd]OY.B_9H-CbNdHuZY|^`CB=/chN.0ET1/JAB=BmikrSJWmmdum]dft]UCRMDKEanNfwzsdyyePBAM^CFi^Vgq{s{jv~_[a;XacUCfoָεݼѵھκàuuSV:49;W>>^k{~~yYw{]\r[fcFjiWE+aF^cKfIqwoiQ]Ym|tjpiXezvvytzpεśqzszzs^WCQC;WfkYP{||f_jcqbPjt`f~yvbxyZ}}~wuƱ~x}[wuw{c_]Ja[aWBqrn^`f{}fuqkwx^in_:PdKrZqr_xhph^z]gs`pcZQMjhbd`nlmsYlzhjtjl~|hTbT\mt|^zxlhpt`_pdEWls\g[Ack_JL|]vqhr}w{wrkQ`bWcnxcԼ{tj~rXeoL:F[RKV78QB(B9"H1GJ4Q[X:7GLhs]Uo{vwnst~xfup^vwryyqvwxmsbdhշȬyvfgs|duVdqdNKsO\iOgT^|{Znv}̡¤st{oq{vefstmW/&)$9B<%Whȩ~v~}{^nhL+7R5PN@UJSmqdZj[WnpkSGtiJZtcS^xyzdo}dAAB5PdjTRTJi|pbpcmymyuhkvfw}yy{ymx~xjhkahz}ljz{qns}wmqrcnjvjev|tt~}{znc[svlmxxsir{yzwqrtpjuxZUeh`DIRXWLEB=EQMABkigvvy}b`hwbQIGQdcUVTIFZR9SMAQRHU`\]d_[_[SMbvk`Xq|ysnjgpyuwɻĻ~xy}|}ʪtenfu~}pca^UVVH@^vfzv~zplow}sjeVIR^<@VDL]RO`hgmtoiaQIQgaQBG^\ULIB@LVYeumaota|{cx}xxmfu}oZdqreMQ[_YLHLGELF:DcQYt]szouzttunipzn]_jzj]XYanoedc`ipa}tiz|py|}tku}|xyytxujhz||xt}ux~u{sp{~~yv|hn}{bajpohgid__YQZvfkw}ydem}p]RPU_a[ZWQVkeQigXiqbbpxztrtfryrj^X_jt~}otxrxle[W\eg_NCUaeWGNW[XUROIGH@=Wrbú}wnzsz|~rzps~ory}{|{wupdevypou|yrnijwkkpl|uceouz|uogadyxlbt~xpjmsxynyovsl{~yummsxugRN]bbM>CJOONSURQI@HdgWy~puuve\[`fd`\Y]lqVVkZUfdVWbjoqokf\W`v{skex}uos{v{v{ýzy{xx~wuy|xm_`qxyhXW[`^\\[WSMHUwv½}~xngbdnkRXo`Zkl_`ku}}sh^ZbrocXQamojc[VX_ht{qgt~luwo|~{lZZfigSDELQSUY[XSICSoi]{yi~yttwyzmilzvibcgidacgp|wbppppnu}zwztflwzubY]fkmqw{xtlkž}yzvy}z~~z|widpvvjXUZaegjljf_Ya{pumou~vh]Y[_^ZXYaos`byqizvot|}uppvui`ivzwpiegoxum{ooo]cihb\VVXXQG?GW__OBBGMNPSTROJNf~~Ⱦĺxvv~yt~zhbelquxyvphcnxupqsrnkmv}hl~qix{kaemtwungcfqtido|ysnpv}zkk{{gm}makuxvqmmlh^QJQ[^ZJ?>DKOUYZWQMTivhs|wttqmjktmh}whsthfltyysliku|tmu~w{zmlry}ztt{yzyvtv}uw}yv|~xqmkg`VOTclndTOSY\\[XRKDH\sok|iumi{rkov~ytrwvhbkw{xrlikqwxoel~yk|xpzse`jsun\PNQVZ]^\UNKWkm\juovwwpmmkiimw{il~vhsxkhlswwtomq|zsy}|}wxuh_blqpdVRU[`eijfa]dy}y~~~~x~~siemuxrdYWZ_dgigb\Zfyzitzzy}tkfdcaafpzxij~|krwqsx{{wroqyxlaaiqtqmjkouxsgcs}oi{ydZ`dea[WSOG>9>KW\WLFGKOQRPKEAFZnlfý}~z{|uxyjbaejnpojdagyzs{wtqqsyxjssht~vidfikjfcdjt}{ribfqz}}zwwy{xlbgvsadup_\ckoomkgaXNINW]]TGAAEKPTUTQQ\oynk~wvzttwzywuv{~x|}|}tnr{xlefjosvwtonu||{zz~}||znfgow{|{|~{sxtq{g\^cec_\YTNIIQ]fhbVNLMOQRPMJLYn{uwwuvnov|}{yz|}yngn~|mssovxpgchpsrh\USUY\^^[Y\hy|oo{{|zvsrsw~pjyulw|pjijlkjjnvyplqz}smvyiqyjflswwurmf]VU\dhf]SOPU[`deccix~{wv||vnfackqsnd[WX[_acbabk{zqzz~xtqpptzwnyszwsrrqnkkotwsi_WW]diklmostpgbjwsa_liVJIMONLJHD@=@IU]^WMGEGIKLKJKRcx~wü}}uxx|{zrnqxzofabdgijhgis~x~{yy|tlwvio||rifeedccfmuzwpfadkrwxwwvvri`^hrj[`ol_VX]aba_[UNIJQX][SKFFHLQSTUXbr}xo{}~~~~~~~~xy~xqkkqx|{tkdbcfikjjjq}v|}}{ywwz~~uja^ahnqtuwxwrkhp}|lgsvhXRSUUSPMIDBDMXadaYQMLLLKJHIQ_nrkp}}~ypilytjtrmpw{}}zvpkgipvxulc][\^__^^bkx|skx{}wox}oo||smkiijknu|~wnhhmty|}}|{wogfpzteeswka^bfhhfb\VRRX`ef`XQNORTWXY]et}sw~z}utwyzyvrlgdflqtqia[XXZ[\\]akw{skv{y~zs|zx{vsqpopswxtkaXTV\adfhiihc^]gsqb[fkaQIGIIGDA=98:BNW\[UOJIHHHGGHO\jnhk¿yrs}uuxtw{~}{wrootzzrjfddeffgjq}wwsq|zmo{{smiggghlqwyvnfaadjnpqqomia[^hofXYfkbVRSVXXVSOKIJPW\]YRLIJKNQRW`pľñ~ngkosvusojhhghjg[POZaWKNZbb_\_cjq{ùtlpn`MB?>=;84/*().5::6.'"!"&+2>Qq@r]PĿzq^X\^WLB<867:?GOUXXXZaly~hYPJGA;61,)*07<=92-(%'*-19EYrЬv\{Δvq{Ľpmsvqg_ZWVVX[`ege`ZX[bjs{{uolnoqtxȾo^e׾v\PNRWZ]_abejmmi`X[fi]PPW[VKC=86557:==93-*,2:BHNSVYYZ^j{yŴymjsԽwpmi_UOWddXRYcgb[WTRRRTW[\ZTMFDEINRVXZZXVV[huwnlzŻƿ~gUHDGRcxĸredcVD>EKKE=841000232-%#'*++)''/;C=12?GB:57=BKOG;:DKG=63456644359AIORSQOPRUZ`fnyżĽvbPB99@Pd}zod[QH@81.19=5'"(.* - - - - - *177620///265/./0110//16@A?:4/+((()+/6=@<41;HKD?AISZ`dgkmnnmmot|ĺýyocUJDC?4'&6L\enwwne^[ZXTNE<4.($"!!%,363.3CSVRPV_gmoqqqpnljjnv¾x`SRQH=56?N`tui_XRNMOSVTKBCNVRHDHNUY[]^^][XTRSW]dkortvx{|zvdRD80'#!#*8Kb{vpljhaUIISXSIEHOUZ\]^^][WTQRU[bhlnoprux{|yts{ź|rg[OD;66:AIR\iwxpsrgXNMPSUUTSRPMHD@@CHNTXYZ[]_bdeb][anwskkt~~zwtpkfb_][WOE:0)(+3@Qe}ĺ}vpjc]WTTY`hnsuvvvvvuqj`Z]gkd[\fry{}}ocWME?<=EQ_jqz¼ti`[Y[]^]\YWUUUTQJB?EOSKBCLUYXVUVW[`fkqsrqonpuz}voib^[YTK>8AR_dj{µzuqnkjgbZRPXa`UNR[ac`]\\]`einqrpmkkmrx}q_UVWM>33:EQ^m}~xri^UU]aYMHLRTQKEA?>>?BDDB>:89=CJQW\_abcgp{yopyxsqruy}{wtpib\YWX\blzƷ}ma_fkjgdbbcehlopojd^ZYZ\]__^\ZXX^hqphfp~}}yodXMD@BJUbp¸|z{woe]WSPPPQRQLFA<:<>ADFFFDBAENW[TNR_gfb^_bfilnpsw}zpieb`]YVVX^hsſ¹}{xtnf^WSRRTUVUTQNKMS\_YQQ\dd^YXZ]_bcegjow~zrkd^YUPIEJZmx{~qeZRNMMNNNLJFCCGORK?;AGE=511369>AHSaq}wvxui\X^b]TLGFFFFEDCEHNSXZZWUSSTVY]cjrzzurxwlbZSOMMORUW[ajv}pf`\YWTQMLLNRVXWTPLJHHIKNSYaeb[YbormhjrzyphaZUNG>4*# "*4@M\jwtke`\XTQQRW\`b`\VPLHEDCDHOUXUQVdsvrqwĿxlc\VRNKHFEEIQat}wojeb`__adjnmf^`jrogcgnty|~~|{||slhd`\WPH@8216?DA@J^p{yrlhecceilh`XZdje]Y]dimprsttsqnmosy~wne\WVXUH;8@GHFFLUanz~{z{zui^]eidYTV[`cdefffeb_^_ciqw||uqqrn^MCCC;.##*2JXbfjt}{vnhiqvpfafmomhdbaabehkmljgfhlqw}||urqqrststuwz}}zsj_VLD=84259>?<=I]lruy{}qhipvvusrtvy~~~|{}|wsolihhhdYMHNSPHDHR]hr|uptyyvqmjhhilnppnjebbcgjmoqqpnnqy}wz}{yxxz{yre]_c`THDEGIKLNQTX\`fo{¹~{yxyzzzwqlhffhkmnoomkikqz}xpq{}xvwyz{{{|}~}}}~umnuuk_YYZZXUQNJFA=::>FQ^itʽ~{zxuqke`]]_behiihfddhorlb^ekjd][[^adfjmqx~|{z|~xrjaWNGDDGLQUY^cjr{¾ztnjkotqgadmplfbbdfhjklnrw~}umhdccb`]XTPNNNMKHHP_mrsyytsv{|tkjrwuoiffghiihhjnsx}~|yxwwxy{ywwxyxvrnid`]XSJA<@ILGBGTbkrxwxzqkhgggfeccdhlqssqnkihhijmqv|{try~xy~~~~|yumcYUXZTG>?DFECABEJQ[fq{zohecbcccceinuy|{xsokhfedfiouwtpsxuwvl]TTVVQKGDDFJPW^fkosy}{z{}{xvuuuvy}z|yzymhjmlg_YSNKIIIHGDA>=@ENWakt|ºzwusrrtw{~}voq{|uru{}}~yvz~~ztnieb`_][WRJB<98:=@DGKOSXap|xvuuwz|zrjksyumilqvz|~~|zxy}{~~wqlhecbb`]XRKEA@@AAA@?=:9;BMSROTbpwz||~|xustx~ysnkigd`[TME?;;?DJOV\dnz|yxz~|ww}}x{zvuuvwvurnid`adf^RKMQOG>743222247=EOYbinsx~z{xtx}}yusrrsuxz{zwtrrtwz}~~}yuqoqtrgZUYZUKB=;9887668;@EJLMLKLNSX`hs½wx~{xy~{pimrrkb\YWURPMIGGHJLMKGCA?@BEJQZepxz{ľ|~~~|yxy{}}{yzwxxromljheb_]]_`_\WPJDA>;;;=BGKJFFQ_fgho|~~yvtuvy{||{ywuuz}uu|ysponmljhfeegiigc]VQLHEB@?@BC>604=A>:;9;?DHLORV[ahntvx~y|zusrssrqppqsw{}|zvspnmmmnpswxskgkrrjcacfhhgec`\WQLIHIKNOOONNOQTVVTSYdqusu~|tpnopqrstvz|xtrpooquyzvpr{}y{~~{vqkd]WTSTWZ[[ZYYYYXWRLGIQWTNOWbkpuz½~}{z{|}}}}~}~}xsolkmnonlieb`][VPHBDJLG?>EMQSTVZ_fnw~}|}~yzzvx|}zvqnllnqrrpnkhgeb^WOIJOPI?;?DEDA??@CGMTZ`dgims{~{zyxy|ztu}wtv{~zxwx|}{zxtme^]aaYMGHKJE?:64346:=@BBCFKR\enwzvsrty~wqqttk_[\_^ZTPLKJJLNOPNKHFFIMRVZ^bdgjp{}wsv||uljorrnida^\[[ZYVRLFA>>?ABCDDDEFLVagffo~Ŀ~{{}~xrqu{zrkmrutplhfdcbbba]XQKFDCBBA@>;8447>DC>>FRXYY\bipw~zz}soquvsnjgeddefggd`\XVUVWWVTPLFA>@CA90.4::757;BJQX`hq{yx}}ywvvxz}}xtqoooomkgc]WRRTUOD=?CC=62124579=AGPYckqvz¿{vrpopqqpnlhd``cfe\SRWYUMGCA@?><;;<@EJORSTUX\agmu}~}~~zuqooopqqpnkgdcejjcZX\`\UMIGEC@=;878:=>>=:8678;>CJR[dghku¿}||}~{xvwz|~}zvspquund_bfc\URPPPPONNNOQTUTPKD?:642248>DGFFN\hlmqzº}}wpqvwqjda_^\ZXUTTUWYYWSOJGDBA@ABFIJFA?GORNLPXaipv|þ{z|vsrqqomkihikmmlid_ZVSQOMMMOPLE>>EHC<::668=CJPU[agnu|¾}|{zxwuuvy|~}zwtqpoooprtwungglokc]]_aa`^\ZWSNJFDDGJLNOOPRTWZ\]\^er{|{~{yxwvvx{|yskkqsnfaaceedb`]ZUPKGDDEFHHFEDCCCDCA>;>CEDCBCFKQX`gnsvy~ſ¿}yuqopqstsromkiheb\UPRVWOGFJMMKHFEEFILPSVWWWY]cjqxÿ{wsonoqstsqomkjifb\URVZWOHHLNLHDA>==>?AAA?<::<@EJOSX[^bfoz}|zvqicaef`VQSUURMIECBBCDFEDA><;=@CEHIJJJJMT\a`^bmx|~½~yuw{xofdghfb]YWUUUWXXVSOKIHHIJJJIGECBEKPOJIPZ__^`diouz}~wtw{{xtqnljjiiigc^XSPOOONMKIFB@@DIJD?AIOOLKMQUZ^bglrz¼ý~}xtvz|zvromlkkkkjfb\WTRRRQPNKHD@?AEE?76;?>954568:<:75457:=?@?>=>@BFJOV^fmonr}~}zwspoquunfdhkha[WUTRPMKIHHIKLKIEB?>==>@BGMQRPOT_ghfipy~|yuroosvskefklg`[XVUSQOLJIJKLMKGC?;987779=@B@<;AJNLJNU^elrw}Ŀ|snpsrlfbaaaaa```abdeda[VPJFB?<;<>@@<89@HHECFLRVY[]_`abbdgmu~~wspnljhecbbcdedb^ZVSQONMMNPQPJCCHLHB?@DGJLMOPQRRRTW\ckrx~½~|zxwwxyzxuqlheb_^\[\]^ZSLKPRLEAACEEEEDCBA><<<@EKPTX[_chmrvwxz}{yxxyz{zxtokhfdbaabdec\VV[^YRMNPRRRQPOMKGDBACFILOPQRTVY\]]\]cmtusv~zuqnkiijlnmhccimjc__aa`^[WSOJD?;99@BCDEGMTZZWZcmrsuyͿ}pf`^_grż|me]TJA93/-++++*'$ !%).5=GPYaglrx{l]QHBADLWetyhYMF@9-"  !###$&),05:BIPTTU\hprrv}xrk^L9.(! *;M^nyui]PE=61.--0476444+$+AZoĻ|xvuvvvvwwyz{{yurrwytmhilkhd`][ZZ[]^_^][[[^adhknoppqsx~{|zvrnllowŸ{wtpke_[XVVUUTSPMJGFILLFA@DHFA=<;<<===>?BFJMPQPPPQSUXZ^dinpomqz~wojfefjp{ȿsifbZPGA<9630-+))*+,,)&"!$$! (--**.5;AFKPTX\_bfkqzúrf`[RG?<>DNZgvth\RJD@=80(&*,)#!###" $*05:?DJPV[^`cju|}|~tkaWNE=72+##/;DLYj{vkb[VRNJFC@>=>>>;99>FJHFIPW[]^_adgkptxyzzyz|{tkaWMD<60*#$-8FS`p~{yvsokgddefgiihgfddejmkfcfkliecbcdddeefhkosuvvuuuvxy|~{wxyxsmga\WSPONNNOSZetʽ}zwtqnmmmlie_ZUQNKJIJKOQPMJMUXVRQTXZ\\\\[ZXVTTUY]cgkoqux|zoga_^`cjr}Ľzrqoi_WTTTSQOMKHEA>;99:<>?>>===>>><97:AED@AGNRTUWY\aekqvz~yrg[RQTTRRYdr}tld]WPIA95773+''*+*'%###$&(+,,+**,/38<@EHKNQV^gnoot~¿yskbYPHA;75324:HWciq~xqh_WQLIGEBA?<8657;><89?FIIHKNSX]aeimrw}xof^VOIB<4,$!)2=JVco||wsommnnnmkhfedddegimprplkouvroptx{}~~~}{{|yqhaa`ZPHA<8531249ALYgu|wsnjhhhijjhgfeddc`]YXZ`a]XY]accbbbbdfhkmnmlkjkmortuvvvvvy~|~wnhgiga\\ahqzº}vldabb_[WTRQQQRSSROLJIHIJJKKJHFDCFJLJEEJPSRQRUY]aehlpu{ÿ{ʻ}mnbMGD:120+))($#!!$(*'$%*14447;@EKQW^emvysmf_XQKHFFJQ\i{aT[Tptxz~ypllmmjiijnu¡d1]l(3Mevwnf^VMB86784.++.258;?BGKNQU[clwǼ˽~xpic^ZVMCAFNTX\birvxvm_K4 /^νztmf^WTQQQQQQQQTUVUSMC6*  9S_\PE>=@GPYahlmoqu{¾»xeSF?APj¶zreQ:'&2@JNJA6*  !&)+--.16;=:78=BCA?>?ACFHKOSX_ekptx{żxeTICFPbxƶ|jZNF>4( -+'6?KLTEJ2avU<0""-06\s|vme`_cmy|pcWMFBAFMWdq~zIAe<)2:CKS]jszqT;_cWl}Ʒ~rjcba^]ZVRMJGFGJOXgs}rhѽ|vyzlffimqssqmifd_XLA8238@LYervx޾}}uZ?,+>V^VJA?@@=977>L_updbhq{ɷuqȤj^\__VE2$$1BVjz}paP?.   #/;HS[`gq{gTE==GYrt]G73A^}{odYPGA=?EMV[]_`chnty}}zxvuvx{ƿzwxyyyune]WUW]fq}veTE=:=ADA:0&#/F]jmlkid_[\ahr|}{yvsnic\SI@70,,08@JXk}zy{~wqoryµƽyiXJ>634:FR[\WPLLPW_fmrstrolhaWI:03=CA==?CGMT[bjqxhREJ_u{vnmpxvkc\VQNMNOQSUXYYXWWX\bhmnkf`[VSPOOPU\frĺŽ|upoqstspia\YXYZWQG@F^||yvspoorttrkaUH?>CHF@979=BGKOQTWXZ[]^__`aabbdehlpuxvoijsxqifhjjigd`]]_ep|wqkgit~yvx}thf{~ysnhc^YUPLHC=86>Pftuogfq~|wsokhfdccb_XOKY}{skcYOF;2+&&)0;FQZ_`^ZTMGB=:8778:GOTVVUVX_gpvy|}}yvsponoqtxzysiaf}}wpjfcdglt~{~wlecdgjmnnmljhhimszÿyn^L<430&!-:FLLLWp{|wrnifdccb`\WRMJGEDCCCBBBBDDDEGIMS[dlqqkcbjsvuplnt{|wrlgb^[YZ\agpwyrkc]XTRQRTWZ[WNB;Da~{xvtsrpkcXQT]_[\cp~~zwussuw{~|thaj{uoib\UMF@:41/04:CNXaeeehrzzsnnprpljp{|vonptvz}}yuqonnoruuri]TYjywleda[WX[^behknruvvtojffglrx{zvohc_\[ZYXWWXY\_acdefhjjf`^dosnjkpw~zskc[TNIGGJPZeq{zv~y{{upmjijmqv|||yoe^_hrupg_VPWn{wsoligdb`^\[YXVUSQOMKIFDA>;976679;:76=MZ]ZZdw|ywvwwxwtqmifdb```abdhmsy}{shdq{n_SLIGFGHJMSY`gnsvwvuuw|vqpqrstux{}{qbVWg~uljnu~{wsolhda^\\]aejmonjfciu}upt|vqkd]UME>6.("")1:CLSYZWQKOdzvroljhfedba``_^^]]]]^^`cfjnqroiehpuphddfhijihgggilortttxzuqnkkkot{zqp¿wnjlnh^RJFDDEFIMT[bhlov¼ytokgdbabcfjlmljknog\]n}vng_XQKFB@??BEKQX^ejortutrpmkhgfffikmmjd_akstrtx{{zz~zupke`ZTOKGDBAABCC>6**ARUPMPZgu{wsolifdb_ZSMJNXaedfkt~|{yxwwwxz}}wpjhhhe^SJFFHJKKLLMORW]dksy~~zrke`]ZXXY[`fmswyumc]dx}zwtplhea]ZVRNJFB>;86568;AIS]gosvz|{|}~|{yyy{}~x}}voha\XUTTVZ_ekqw||wrmhc]WRMIECCDGKPSSL@1)4Plxtmmu~zuqnkhgggggfecbaaabcehkoswzzwrot|}xx{{xz~}vld_\YWTQMID?;7432246:>BFILNOQTZco|~w|~~zsorvungbbcfilorv{}vnf``gnqpnptx{zupq}{uoib\VQKE@:620..038?GR^it|~{tpv~zvrokgda^\[Z[]`cghgbYPMUhyzrnosz{utvwskd``chntz~|ywuttttvwxwtppu|~ytrsvz~}wvxytkaXSOLIFB?<9878:=??<723@Ysǿ|yuqmieb^\ZXXXYZ]_behkmnpqsux{wpq{}zxuspnkifca^[XVTRQPOOMIB:315860,-2:CMXbkrvwusu|{xvtssssttuwy}~vmmy}ulc^_ba\TNLMQV\ciqy~|zxvtrpnlkjjjjjifb__eovvoeZPLSfy~tkgfgjnprtuwxy{~|xtpkgb]XSMHB=941.--/27=CGJIFDI[u¾~}{ywvussrqqpqqrtvy{|yunkmsupicaaaba_]ZVRNJFB>;9778:>CIOUZ\[[[`fjgb^_fp|~|{zzyyywsnhegnsri]TSZdijils{zuqlheb_\ZWUTTUW[afkopmgabmz|{uoha[UOID@<:989GPX`jqsnlu|{zuqmknsvsld^ZYYZ[]^`bdfilnprtuvvvtsqomkjiikmptw{|ztka_gz||}tlgecba_\YUQMIDA=:86789<==;9;ER\_`chnuz~|yz}yy|}xtpmjhgggiknquy~~{ywtqnkhda]YUQLIEA><:99;=?BCC@8.#%7JUUOKKMRW_jy~wngccec]SIB=:875443469=CKT^irz}}xtvzsonrvvrmhfhkoqroicadhf_VOLKKKKJIHHGGHIKNQUX]`cfgggfeefintz|{|ȿ}xtplieb_][[\]_`a_\[_hsz}~}zwtqnjfb^ZVROMLKLMPTX]begd]TLKTetytjb]]`chknoppomljigfc_ZTOMPW^ba`_aeimqsvx}}{xvtsqomic\VSU[adca`aa_[SMMVgw}wqpsz¿~}|{{{}vpqx}tmiikoqsttrpmjfb^ZUQLGB=940+'$! #'-3:BJRZagjlkhhm~¼|uppsuqjb]\[\\\[[ZZZZ\^adinsx|~~|yxz~~xqljhhhijklnqtwz}|xqhacn|z||wrmhc_ZWSPNLKIGD@:523:BINPSW[_bflv}zywwwxz}{{xy{}}wroortrmf_[XWVTSQNJFB>951-)&#! !"$'*-//,& "0EW`a``cjs|ü}yuqmiea\XTOKGDA><;:;CEFGJOV]djptwz{{{{|~{wuuux{Ŀ}yvsoljhfeeegimqw|}zwtrqponljf`YRLJKMMJE@<;=@EJPUZ]_]XPGBFQ_gg_VOLKMPTX[^`cefhjmorux{{wrniea\XTPMIGEDDEGJNRVY[YWTT[k}{ywvvvvvvusnhcaced_YSONNNNNNMLKIFA:3-))+-,(# !$).39?AA?;3) $5DPX[ZZ\es~}vpor|¾¼~tkeceinsvvtng^UMHC?==>@CGLQV[`ejpuzwnhhq}|}~}xrkc\SLE>95310.,($"$)045447>>>>>?AEN[k|{vrnligggghigc]VQR[htyzyz}~||{|||{{zyxuspnkjiggghjlnprrpkc[UU^lzyvuwz|~}|{{~~vme^YUSQPOOOPRUX\aglqv{}wne\VSRTW\bipw~tmnuukebcfkqw~|wtromjfb]WRLF@:5/)$  '3@LV^cdb_`hx~}~~~|xqkd``bba]WRNMMNPSVXZ\^`bdfhkmptx}}wndZSOMLJD<5/,+-/38=CIPW]begghmt||xvvvwx{~{vqmkiggghjmosw{|yuqlgb\WQKFA<72.*'$!#'+046751+$"'4ET[\ZXZ_gq}|wsniea^ZWSNHA:2,)*-021//28@KWcp{Ľ{yvtrqponljfb]Z[^bdaZQHDFIKJGDBBDFIKMOQRUVXZ\^_aabaa_^\[\]`djpw}þ~zvspmkihgghjlnprrpnmou|~}}wtssrng_WQLIGEDBA@>>===>@BEHLOQQOJC;6671-+,+)#  - !%'(&# %0@Q]bca_`bglry|yuqmifb_\ZWUSRQQQRTVY]bhov}yuqmifc`][ZYWVURNIDBCHMPPNMNOQRSUX]djnomjfcaacehmrx}}zwutuvy}|wsqpooppqrtvx{}}zwsplhd`[WTPLIFCA?=<;9741-*()-3:>@@?=;73.*+2>KUYWRMJIKOU[ahnuzĿ|xtpmifda`^^^_`cfimpsttqmigjt~zvsomkigda\VOHDCCC@;4-($"! #*.000/137:62-)%   )4AKRTQMJLTbs{xvuttsrqponlkjihgggghhiklnqsvz~}yurpmjgd`\YUQMJGECAAAAAA@>;879>EJKJIHJLORTVWXXYZ]aekqx~zslhfhknoonnorv}{wsokgc_ZVRNJFC?<96310///0247:=@BBA=8426@MW\ZUPPSZbioty~yrjb\WTRPOONNNNOPRUX\afjnpqplheekx}|||ytng`\YXXYYYXUPIC?=>@>:3,'$#""##$$$%%%&'()+,-/01233334468;8530-+)('&'')+.1479;:850,,0;IWbggfeehmsz|yuqmiea]YUROLJHGFFFFGGGGFEEHMU^hpvy{{{ywttw}xtokgc_\YVTSRRSSSROJC:2,,06;<93-)'),16CHMRW]bgmqv{~ſ}}~}zuojfddddeffgggffffeedddddccddefghjlmopqppooquz~zqg^YZaku{|ytnifeefhjlmnooonmkjheca^\ZWUSQPONNMNNPRTW[`dioswxxwtrqrtuvx{}|vpligeb`]ZWTPMJGDB?<961,' !(.5:?ABA@@CKXfrz}{xuttw{}zxuqnjgc_\YVSQNLJIHHGHHJKNPTX\bgmsy}yuqliea^[XVTRQPONKHD?<:>=;97541.*((,3;ACA?<<=@EKQY`gntz~{xvsomjgeb`_^]]^_acfiloqrrplhdcfnzý|ytng_XTRRROJC<62/-,+*))('&%%%%&')+.147:=>??>==?DJQW]bfls{~|zzz{{yuojgffilosvxz{||||{{yxwutrpnlkigedba````abcefhijifb\VPNPVakqsnf\SLIIMSY]``_^^^_`bdfhiklmnopqrstuwxz{}~}{yyz|~yvx¿~|woha\XURPMJGC?;72.*%!  "+4=FNTY[YUQNNS_m|xrmigfhjmmlhd_ZWUUUUWXZ[]_`bdfhkmqtx|}}zyyzyvqkd^YURQPPPPQSTVXZ\\\ZXVUW[afhhec`__`abcdefhjmquz~~}|}}wtsssssrpnlhea]XTOKFB=951.*(%#!  !#%(*,..-+'!#0>LV[\\ZZZ\^bgox~zuoib]YWXY[[YVSPOORV[ahou|}~xqkhfghjifaZQH@:669<>=:51.--.0235789;<=>?@AAABAAA@@?@ACFKQXajuÿ}yusux}}}}~}|{{|{vqligedcbbaa`__^^^_`abdeffec^XPHB?AGPX\\WPIC@>?ADHMRW\`fjosvy{{{zzz|~|{yxxwxxyyzzzyxwvwz~|sjcbfo{|unifc`\XTPLHC>941.,+)('%$" !%).4:AGMSX\__^[WSSV_m}¿xrmigfffeeeeeeefgghijjihfca_`bfkpsvvvvxz}~zy}|wtssstvwxyyxxwutrpmkifdba_^]]]]]]]\[ZYYY[`eknpnjfccehkkigeegjntz|zxwvuuvvxy|~{xvutsrokf`YSNKIHGEA;4-'""$'*.158:::741./4>KXbikjhfefhlpu{{wtplhda]ZWTQPNMMMMOQTX\afkptx{}~~yuplhd`]ZWUTRQPOLIFB?>>ABB?:40./49?CFGGFFFFGIJKLMNOPQTW[`ekqw}~}{ywusqomljhfc`\WRNIGFGJMPQQPNMLKJHEA<8559@JRWXVQMIFEGIMQV[`ejotx|{xuqnligecbaaabcdfiknoqqpnkhfgks~~ytmf^XSPONLHB;50,*)))****)'%!"%'((()+.27CFHGFDCBDIS_n{zurqppppoomljhfdb`^\ZYXWWWWXY[]_bfjnsw|~|~}{xurokhea^[YWUTSRQPOLIEA?>?CGIJJHFEEGILNQTVXZ[]^_`abcdfint{~zwsokfb]YTPLHD@=:7532112357:=@BDDB>92*%#&.9EOTVTPKHGIMRYajrz~xrmiecba``__``abcehjmpsvxyzyvrnjhkq{}{zyywurnhaZTPONNLHB;5/,)(''''''''''''()*+-/1368;>AEHKNQSWZ_foz}|}}}}|{ywusqpopqrtuwxyyyyxwvutrqonlkjjiiijjklmooonlhb[TMHGIPYafhfa\WTQPOONNNORV[afikkjiggghjmpsvx{~}zwvwy}{wvy{wvtrnhb\WTQOMLIGDA=951-)%!  &,3:BIOUY\]\ZXX[airz~ywuuttrpmiea^]]_abca_[XVTTUWZ^bfjoty~|{~~yvuuvwy{|~~zupjd`][\]^^\ZWTRQQRUWZ[\\[[[^bgkmlifb_\[[\]^`cfimptx{~~}{zyzz|}zz{|{zvqlfa]YVSPMKHEB?<9630.+*)(''()+-/134430,(# $-8EPX\]]]]_ciov|~|zwurpnljigfeca^[XTRPQSX]cinqtuwxyz{zyxww{|zxvtqnjfa[VPLGDBA@A@>:5/*'%&(+/37;>ACFGHJJJKJJIIHHHHIKNRW^emu~|{}~{xvvvxz}}yuqmkkklmlifa\XUSRSTVXZ]_bdeeda]WQIC??BHPVZYVPJD@>=>@CGKOTY]bgkpuy~|zwusqpnmmlmnoqtwz~yslhgks~}wqlighhfc\TJA93.,,-.//,)$  $'+/49>CHNTY^bfhihfc`^^bkwÿ{upkhfeedddccbbaaa`aabcdfgikmnooonnoqtzztnklpx|wspoooopqqrrrqpomljhfdb`^\[YYXXYZ[^`dhlosuvusnjgfglsz~}{yutuy|wvsrlfhhikkmorux|~~{wsqos||{zywvsnnptxz{yrfYOFCHQZ]YJ5!(5:8-%19@DFFEGD@;6448?JVajorstuwz~ƺɻ~yywsqnmkjiihfda^YTOKHJO[l{yoknw~zuplgc_[YVUUVXZ]`bdd`ZSJB;63111248=CJOSUTROKHDA?=;;;96420.,*('%$"!  "$'*-049?EJPUZais}ÿ{unf_XSPNMNPRTVY\^`begiklmrz{wwvvw|}~}{{z{{x|{umd]TLGEEHNV`hnqoi_SG>88?BIR\ekmlieccfjpv{~~{xussv|¹ÿ}ywvwwxyxxwuqnjgffhlptxzzxvrnjfb]YXXY]biqz}ti]OB81./5FLQSRPLGB=975567;BFJNRUX[]^]][XUROLJJLPXcpxw}yttx|mb]`iuxngdflry{tlda]YWUSPNKHFDCCCCCA?<84357=FQ\flonkf_XRLFA>==@ELU_ju}{z{~zpha]\_emv}zslfehow|vsrtwz}}pdXOJHJMQTVVUTQOKGA:2*! - - - - ").49=BGKORUWY[\^`dkuxpic^YVTSSTVX\`dimqtuwwvtromkiihikmosux{}}||||||{zwrokfb]YVTSSUX\aglorrqnjea^\[]`ejotx||vqnjjloruxy{{{{{{{zzyyxxyzz{}~{sompu}ylaWPJGGHJMQTVWVTQLF@81)!  $*.2579;<<<;;=@ENXclswxvsokhffhjot{}|{zywvsplhd`[WSPMKJJKMPUZ`ekqvz}~|zxusqppsy}{ywuspnjf`ZRJB:40../1111236:@FLRX[^__^[YWVVWZ]`cegijmpty~ÿĿ~|zyvolljje[[ZYXMIIFFC=;;99631-*% "1@JRY\]]\\\\]^]^^^__aeins~||}m_X[fuvka^`ht{qigdcfkrx~õrf\URSVZ^^[XTNGA:3-(#  #(-38=EKNQQQOKF?7/'!"*8J]o{}uja^bn|tponnnnmmnqtx{}|{vqlfa_]]^afjnruvwvuspnlkjklptuwwvtoibYPHA>>CKWcow~ysle^YTRRU[ckswxtlcZTRU]ht{yxy{~{zzz}ysomosy~zwuuuxz~|z||n`SIA=;;<>?@@?=:73/,(%$$##$%'*-059>CHNSW[]^][TLD;4/.29DP\fnswy}zrkea__bflqvz{yuoh`WPJFEGLT^it|vtsv{{uojgefhlqv|}ulbXPIDAABEJPV[_cegjloswz{zwqkc\VOJFA=;97567;?FLT]env}zvvzýxrooquy}~|yvrmga[TMF?93.)%"  "%)-26;>ABA>92*#!)2<:986531/-,)'%#!  !"$&)+/3782.+*)*+,-.///.-,+++-/36:=?@AAAABCEHKNQTVXYYZYZ[_fo{{yxxzzzxvspnlkkllmnooooonlkjhfecbbabcdfilosw{|tld]YWY_fnuz|zvpje`][[]_behloqtuvwwvvusrpomlkjiijjklnpqsuuvusqnljikmpsuvutrqppqsw|~xqjd_[VSOLHDA=951.+(&$"!!!!"##$%&&&'()+.159<>?>;9769>FPZcjoqrsrstwz~}yuqnljiiiijkllmmmllkjiihhhhijlmprux{~}}~|ywurpnljigec`]YUQLHEDDEHJKKJHEB@>=>?@BEHKMPSVXZ\^_acfjnu||yxvvvvwxyyyxvtroliea]YUQMIFDB@@?@ABDFGIJJIGD@;5/*'')-39?DHJKLMMNOPSVZ_ekrx~}{{{|~~{xtqnljjklnpsux{~}yurpptz{uoib[VROMMLKHD?93.*'$#""""""""""""#$%')+.159=BFKOSW[^`cehknqux|¿~|yuqmjhgghhiiihhhhhijkmoqrtuvwxyyzz{{|}}~~~|yuqke`[WVX\bhnstsplhc_[XVUSSRRSVY]bglqtuvvutssttvxz}|yvvw{}sojgcgnpwƼxj\PD;74336:;<<==?BEHJJIFC@>=<=>ADHMT]cjotx|}}|yvronmosy}vrsx~~woh`YSNJGEDEEEFFGGGFBA@@?><;9752/,($(3AN[fnqrokf`[XUUWZ_emt{}yvvwy}wne]XVX]ckrxzzvqjc^ZZ]bipx~|pdWKA942357:;:974323469;741.+)('(),.13679:;<=>?@ABBCCCDGJOU\dkqvyzzyywvuuvwxz|~ſ|xusqomkjhgeca_^\ZYXWVVVWXY[^adhlquz~|zxvtrpnmkifda]ZXVUTTSRPMIE@<840-*('&&')+.1468;=?BEIMRX^elt{~{ywusqpnljgeb`^\ZXWVUUVWXZ\^`bdefghggfeca_][YWVVVWYZ[ZYXUTRQPPQSUX[^behkoqtwy|~~}{zyxxwvvuuuvvwwyz{|}~~~}|{{{|~~xsnjfa]XSMF@:50,(%" #(-28=BFJMPSUWY[^adiow{wsqomllklllllllllllmmmnopqrsuwy{}}zxvtrpnljihgfeeeeffgghhiijkklmnoqrsuvwxxyxxwvuuuvxz|~~}}}}}}}}|||{{||~zupkfb^YUQMHD@;72.+'# !$(+/37:=?ABCDFHKOTZahnswyzzzzz{}~|zxvtqnkheca_]]\\\]^_acegjlorux{~~|zxvspmjhfdba`__^]\[ZXVTQONMLLLLKJIGEDBA@???@@ABCDEGIKMPSVZ^beimqux|}|zywvusrpnljheca_][YWUTRQPOONNMMMLKJIHFEDDDEHKPTY]_abaa````bdgjnqtwy{}~{xtqmjhfedddeeffffgghiklnprsuvvwwwxy{}}zvrmhc^YURONLJGEB>;86420/..----,,,,,--./012469<;;;;;<=>?ABDFILOTY^hoty}~}ytmfa_`gq}{xvtstw{}zxxz~}zyxxyz{}{yvtqoljgd`]YUSQPQSW\bilnnke^VMFBAEKS\ekmlib\VQMMOSZahouz~}zxxy{~|xusstw{ztmifefimquxzzywtpkfa\XTPMJHFECBBA@@@@@@AABDFHJMPSW[_dhmrw{{yvsrrrsvy}{yy{~}{{{{}~zvspmieb^ZWTQOMLKKLNPRVZ^behkllkjgc_[WSPNMLMNQSTVWY[]^acehkmpsvy|~}|{|}zvtrqpooopqstvxz{}~|{zxwusrpnmkjhggffghijlnqrstuvwwxxwwusqnkgeb`_`adhmsz}zywvutsssrrrrrqpponmlkjigfedcbbaaaaabddfghijkklllllllkkigda]XTOLIGGGHJMQUY^bfknruxz|~}{zyxxxyz||xtqmjgeb`^[YWVTRQPONNNNNNOOPPQRSTVWZ\^`bdfhjmoqtvy{~}zwusrrrrrstvwxz|~~|{{zzzzyxvsqmjgc`^[YXVUUTTSSSSSSSTTUVWYZ\^`bdfiklnprstuvwxxxxyz{}~~|{ywvtrqonlkihgedcbaa``aabbcdefgijlmnpqrrssttuuvwyz{|||{zywusqponmmnopqsuwy{}~}|{{{zzzzzyyyxxxxxxyyz{|}~~|zxvtrqonmlkjihgfedcbaaaaabcdefhijkmnopqrstuuvvwwxxyzzzzzzyyxxxxxxxxxyz{|}~}{ywusqpnmkjihggfeeddcccbbbaa``_^]\[ZXWVUUUUUVXYZ[\]]\\\[[[ZZZ[[\]^_`abcdefghhiklmoprtvx{}~}|{zzyyxxwvvutsrrqqqrrrsstuuvwwxxyyzz{||}~~~~~}}}}}}|||{{zyyxwwwvwwwwwwwwwvvvvvvvvvvvvuvvvvvvvvvvuutttsssrrrrqqponmlkihfedccbbbbbba`_^\[YXWVVUUVVVWXYYZ[\^_`abcdeghjlmoqsuwyz|}}{ywusrpomlkihfecb`_^]\[[ZZZZZZ[[[\\]]^^^__`____^^^_`abdfgiklmnopqrstuvxyz{|}~~~}}}}}||{{zyyxwwwvvvvvwwwwxxyyzz{{||}}~~~~~}}}||||||||||||}}||||{{|||}~~~}}|||{{{zzzzyyyyxxwwvuuttsssrrrrqqppoonnmmmmllkkjjihhgfffeeeddccbbaa``___^^]]]\\[[[[[\]^_`abbbbbbbbbbbccdeefhijlmoprtuwyz|~~}}{zzyxxwwvvvuutsrqqppooooppppppoooonnnnnnooppqrstuuvwxyyzzzzzzzzz{{||}~~~~~}}|||{{{|||||||}}}}}}}}~~~~~}}}|||{{{{{zzzzyyyxxxxxxxxwwwvvvuuuuuttuuuuuuuuuvvvvvvvwwwwwwwwwwwwwwwvvvuutttssttuvwwxxxxxxxxxxxxxyyzz{||}~~~~}}|{{zyyxxwvuutsrqponlkjjihggfeddcbaa`````___```````````aabccdeeffgghhhhhhhhhhhhiijlmnprsuvwxxyyzzz{{{||}}~~~~}}}||||||||||||||||}}}}}}~~~~~~~}}|||}}}~~~}}||{zzzyyyyyyyyyzzzzzzzzz{{{{{{{{||{{{{{zzzyyyxxwwwvvvvvuuttsrqqpooonnmmllkkkjjjjiiiiiiijjjjkkkllllmmmmnnnoopqrstuvxyz{{||}}~~~~}||{{zyxwvvutsrqpoonnmlllkkjjiihhggfffffgggggggggggghhiijjkllmmnoopqqrstuvwxz{|}~~~~~~~~~~~~~~~~}||{{zzzzz{{{{{{{{{zzzzzz{{{{||}}~~~}}|||{{||||}}}||{{zzyyyxxxxxxyyyyyyyyyyyxxxwwwwvvvvuuuttsrrqpoonmmllllkkkjjjiiihhhhhhhhiiiijjjkkllmnnoppqrsstuuvvwwxxyyyz{|}~}|{zzyxwwvuuttttsssssssssssssssssssssssssttssssssstttuuvvwwwxxyzz{{|}}~~~~~~~~~}}}|||||}}}}}}}}}}~~~~~~~~~~~~}~~~~~~}}}||{{{zzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}}}}}}}|}}}}~~~~}||{{{{{{{{{{{zzyxwwvuttsssrrrrrqqqqqqqppppppooooooooooooooooooooooooppppppppqqqqqrrrsssttuuvwwxyz{|}}~~~~~}}||{{zzyyyyyyzzz{{{||{{{{{{zzzzzz{{{{{{{{{|||}}~~~~}}}}}~~~~~~}}}|||{{{{{{{zzzzzzzyyyyyxxxxxxxwwwwwwwvvvuuuttttttttuuuuuuuuuuvvvwwxxxyyzz{{||}}~~~~~}}|{{zyxxwvvuuuuuuuutttssrrqqppooooooooopppqqqrrrsssttttuuuuvvvvwwwxxxyyyyzz{{|}}}~~~~}}||{{{zzzzzzzzzzzzzzzzzzzz{{{|||}}}}~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{{{{{{{zzzyyxxwwvvuuuutttttttssssssssssssssttttuuuuvvvvvvwwwwwxxxyyyzzz{{{||}}~~~~~~}}}||{{{zzzyyyyyxxxxxwwwvvuuutttttttuuuvvwwwwwwvvvvvvvvvwwwwxxyyzz{||}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~}}}}}}}||||||{{{{{{{{{{zzzzzyyyxxxwwvvvuuuuuuvvvvvvuuuuttttttttuuuuuvvvvwwwwxxxxxyyyyyzzz{{||}}}~~~~~~}}}|||{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzz{{{||}~~~~~~~}}}|||||||||||||||{{{{zzzzyyyyyyyyyyyyyzzzzzz{{{{{|||||}}}}}}}}}}}}~~~~~~~~~~~}}}|||{{{zzzzyyyyxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwvvvwww|}~~|zvsqliiiikquw{|yqllnvumlr}wnkns{xuutttuuwy{~}vpljmqx{snmot{xqljjlqv}{smhhks}|phhp|xnhioyxuqmjihhijklmmmnmmlkjjihijlnquz~{uokiimry{snkijnsy~~zwtrqponooooooooopqrtvy|wplkowypklrzysnkklosw{|yurolllnquy}vqmllnrx~zupmjihhhikmoqtvxz|}~~zwvsromkihhilotz}tnjils{xqljkmqw|ztpmjiijlpuz|wsomllmorv{{vrnlklotz}wqmlnrw~~zwtrponmmmmmmmmmmmmnnopqrsuwz}{wsolkkkmptx|~{xvsqpnmmlklmlmmmmnopqsuwy||vqmkjlotzytpljiijkmpsvy|~}{ytrpnmkjjjklnpsvz~|yvsqonnnnopqstvxz|}}|zxvurpomllllnpsw{{vronmnqtx||yvsqomlllmnpsux{~zvsomkjjlnquz~{xtqomllkjjjjkkllmnnoooooooonmmlllkkkkkllmnpqsvx{}}{ywusrponnmmmmllmmmmmmmmmmnnnnnmmmmmnnopqsuwz}~{wurqpopqrtvy|~{ywusqonmllllmnoqsuwy{~|zwtrpnmkkkkmnpsuy|}{ywvusrqppoonnnnnnnnnnoooppqrstuvxyz|~~}{zyxwvuttssssrrrrrrrrssttuvvxyz{}}{xvtrponnnnopqsuvxz{}~}{zywvusrqponnmmmmnnopqrstuvxyz{|}~}{zywutrqonmllkkllmnprsuxz|~}}||{{{{{{{{{||}}~~~~~~|zxvtsrpoonnnnnoopqqrstuvwxyyz{||}}}}}~~~~~~~}}}}||{{zyyxwvvutsrrqppoonnnnnooopppqqrrssttuuvvwwxxyyzzzzzzzzzzzyyyxxwwvuutsrrqponnmmmmlmmmnopqrsuvxz|~}{zxwutsrqpoooooooooopppqqrrrrssstttuuuuvvvvvvvvvvvuuuuutttsssrrqqpppoooonnnnnnnooooooopppqqqrrrrrrssssssssssssrrrrqqqppooonnnnmmmnnnoopqrstuvwxy{|}~~}|{zxwvuttsrrqqppppppoopppppppqqqqqrrrrrrrrrrrrrrrrrrrrqqqqqpppoooooonnnoooooooooooooooooooooooppppppppppppppooooooooonnnnoooooopppqrrsstuvvwxyz{|}~~}|{zyxxwvvuutttsssrrrqqqqqqqppqqqqqqqqqqqqqqqqqqqqqqqqqqppppppppppppooooooooooooooooooooooooooopppppppppppppppppppppppoooooppppqqrrssttuuvwwxyyz{||}~~}}|{zzyxxwvvuuttssrrrrqqqqqqppppppppppppppppppppppppppppppppppppppppppppppppppooooooooooppppppqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}}~~~}}|{{zzyyxwwvvuutttsssrrrrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppppppqqqqqqqqqqqqqqqqqqpppppqqqqqqrrrssttuuuvvwwxxyyzz{{|}}~~~}||{{zyyxxwwvvvuuuttttsssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssssssrrrrrrrrrrrrrqrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssttttuuuvvvwwxxyyzz{||}}~~~}}}||{{zzyyxxxwwwvvvvuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssstttttttttttttttttttttuuuuvvvvwwwwxxyyyzz{{||}}~~~~~}}||{{zzyyyxxxxwwwwwwwvvvvvwwwwwwwwvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvwwwwwwxxxxyyyyzzz{{|||}}~~~~~~}}}||{{{zzzzyyyyxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxyyyyyyyyyzzzz{{{{|||}}}~~~~~}}}||||{{{{zzzzzyyyyyyyyxxxxxxxxxxxxxxxxwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyzzzzz{{{||||}}}~~~~~~}}}||||{{{{{zzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}}||||||{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~}}}}}}}}}|||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}}}|||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}rlkjikqtvyz}wtokijlpv}yqljjnszysokijkmovz}~zuqmjikpwskjp}sjjsvmiimu}~}}}ysnkikou|~vokikov~~wqljiknsx~~wqljjmt}zpjkr}umjkrz{wspmlkjjjjjjjjjjjkkmqtwz~xsnkjlpv|xrnkklpty|zwusqssrrqrrstuwy|~vpkjlrzyqkjnt|{uoljjkmpsvy|{|~~}zxvsqomkjjkmosx|ytokjjlouz}ytrpmkjjjklmoprstuvvwwvvuqpomlkkjjlmpty~{tnkkns{|uplkkmqu{|wromkkkmpty~zuqnlkklnptw{|xtpmlklnrw}}wqmkknrx~~{xvtrponnmmmmlmmmnnprsuvy{}}yuqnlkkkmpsw{~|zxwvttsstttttuvwxy{}~ytpmkkmpuz|wspmlklmnpruwy{~}|zxvtqpnmlllmnprux|{wtronmllmnoprtvxz|~}{ywurpommlmnqtx|zuqnmmnquy~~}|{zzyyyyzz{|}~|yvspnmmmnprux|~}|{{zzyyzzz{|}~zvrpnnoquy~}yurponnoprsuxy{}|uga^\Y[_`dgkz}|ztpjfea`achmu~zsmjknrx~|smgdb`bglry|yvtsrqpppqtyxpou{mfhrunmov{xvyxxxz|}zy{}tmhgimt}|xuuvy~}sjc]Z[`itvnjmvumjlrzzvqkgca``bcfhknpsuwxyzz{}~~|vqkgdcdgmt|ysnkjknptx}{xtpmjhhikou{zustyulggls||xvvwy{~|zxvtrponmmlllmnorux}ysmihhjnsy}zxvtqomkihggghjmptw{||}|{yvroljijlosy~|vpljkpw|tnjhghkosw{~|wrnieba`acfkpv|zupljgffgikmpsvz~}{ywwwy|{tokjknsy|yvspmkhfdcbaabcgjmpty}{vrolkjkmosw|{vrnkighjknqtx|}yupmjhhilpv|}wrmifdcbcdegjmpsuw{~~zvrokhecbaaacehkotx}{vrokifdcbbcdegjmquy}~zwsqommmmmnpqrtvx{~~xtomllmpty~~{ywvttttvwy|~zvspnmlmnorux||ywutuvxz}~{wtqnlkjlnqv{}xsoligfeefgjnrw{ynkea]WUSRQS\]^`bpxy}xqid`[YXY[^djqw|zvsqpquyyrlg`\[[\^aeimpwxoga\Z[`iu|z|{ndacir|}vmieccejr{||xrlihimsz~}||wtsv{yl`VRV_lz}tlijq{|tnhc_[YWUTSSSSTVX[_chmsyvme^ZXX[`gnv|}xtrqqruy~|xtqmnnlkklmoqtwz||xtqpsy~xwz~voifefimpu{}vnjea^]\^`djpx~{zz|}|zyyyyyz{{|}}}}|{ytqolifdbaaabehkptzuka[WW[bku}}xspnorvz~}}}~ztnieb``adglpuz|yvtrqpppqrsuwx{{|{tnhecbdhmu}|xutuy}~}|||}}~~~}|{yxvtrponnnoqtwz|zyxxyz|~~|zwuspnljhgghilotyyqic^[Z\`elsz|yvsrqpppqqpqqqrrrrssstuvwxz|}~|zwurpnljiiikloqux{~|yvsqnljihggghikloqsuwz|~~xsnjfcbbdglryzvsrrsvx|~~~|zyxwwxyz|~}{yxvuuuvx{~xqkfb`_`cglrx~}zwusqppoooooooooopppqrstuvwyz|}~~~~}{zxvtrponmmmnoqsvx{}{tsponc`aabbadfijs||~wpqpjgccjklorw||uokiikqx}zxwvwxyz{{~}~}|yz{xwuuwy~tlltrgdl{~z{~{yxxxxz}}vqmlmoruxzzxuqmjikou}wne`\[]`ekosy~yqib\Z[`juwpot~vkdcfmu|{vqkgdbaaacdfhjlmopqrrssrrrqqqqstwy|~xqljiknsz}{ywusrqqqqrsuy|ysqsxwohgiq|~}|}~~~|{yyxxuuvwyz|}~zvrnkihijmqv|~ytnjfca_^^_`bdfhjloqssrsttttsqomkhfdbbbdgkqw~}wrnnqv}{rjc_]^adinsx||vsqonnnpsvy~~zvsqppqrux{}zxvwx{{uokijnsz|xvsqomkihgggghiknquy~ytpliggghjlosvz}~|yvtqonkklkkkkkllmnoqrsuvwy{|~~zvsomllnrw|xrkfa^\[[]_bdgjnqux{~{wsojgda`__adhlrw}}{zxwvvvvvvwxy{|}~}|zyxwvuttssttvwy{~}xtpmllmpsx}~xsnkhfeefhjloqsuwy{|}~~{xuromkjjjlnqtx}zvsokhfdcbbbbcefgijlmopqrrrrrqonkigeba`_`acfjotz~|{zyxwwvvvuuuutttsrrqppoonnnoppqstvy}{xurpooopqtwz}{vrnjgeddefgikmoqstuuvvwwxxyz{{}~|ywtqomkihhhijknpsvy}|zwvtrqpoooooppqqrrssttttsrqponlkkjklnpsvz~~~}||{zzyyxxxxxxxyz|}}zxvtsrqqrrsuvxz{}}yuqmjhedddefhjlnoqrsssssrrrrrrssstuvwxxyz{{|}}}}~~~}|zxwuspnlkihgggggijlmpruwz}~~~~}}}~~~~~}|{zyxwwwwxy{~~{yxwutttsttuvwxyz{|}~|xuroljhgfgghjkmoprssttttssssrrsssttuuvwwxxyyzz{{||}}}}~~~}}}|{zyxvusrpomllkjjjklmnprtvxz}~~~~~~~~~}|{zzyyyyy{|~}{zxwvvuuuvvwxyz{|}}~|zwtqomlkjjjklnoqrstuuuuuuuttttttttuuvvwwxxyyzz{{{|||}}}}}}}||{{zywvutrqponmmmmmnopqsuvxz|~~~~~~~~~~}|{{zzyzz{|~~|{zyxwwwwwwxxyz{|}}~}{yvtrpommmmmopqrtuvvwwwwwvvvvuuuvvvwwxxxyyzz{{{||||}}}}}}}}}}|{{zyxwutsrqqppooppqrstvwyz|~~~~~~~~~~}||{{zz{{|~~}|{zyyxxxxxyyz{{|}}~~|zxvtsqppooppqrstuvwwxxxxwwwwwwwwwwwwxxyyyzzz{{{{||||}}}}}}|||{{zyxxwvutssrrrrrrstuvwxy{|~~~}}||||||}~~}|{zzyyyyyzz{{||}~~~}{yxvutsrrrrrstuvwwxxyyyyyxxxxxxxxxxxyyyzzzz{{{||||}}}}}}}}}}|||{zzyxwwvuuttsstttuvvwyz{|~~~}}||||}}~~}||{{zzzzzz{{{|}}~~}|{yxwuuttsttuuvwxxyyzzzzzzyyyyyyyyyyyyzzzz{{{{{|||||}}}}}}}||||{{zzyxxwwvvuuuuvvvwxxyz{|}~~~~}}}}}~~~}||{{{{{{{{|||}}~~~}|zyxwvvuuuuvvwxxyyzzzzzzzzzzzzzzzzzzzz{{{{{||||||}}}}}}}}}}}}||{{zzyyxxwwwwwwwwwxyyz{|}}~~~~}}}~~~~~}}||{{{{{|||}}~~~~}|{zyxxwwwwwwwxyyzz{{{{{{{{{{zzzzzzz{{{{{{|||||}}}}}}}}}}}}}}}}|||{{zzyyyxxxxxxxxyyzz{|}}~~~~~~~~~~~}}||||||||}}}~~~~~}|{zzyxxxxxxxyyzz{{{||||||{{{{{{{{{{{{{||||||||}}}}}}}}}}}}}}}}|||{{{zzzyyyyyyyyzz{{||}}~~~~~~~~~~}}}}|||}}}}}~~~~}}|{{zyyyyyyyzzz{{||||||||||||||||||||||||||}}}}}}}}}~~~~~~}}}}}}|||{{{zzzzzzzzzz{{||}}~~~~~~~~}}}}}}}}}}~~~~~~}}|{{zzzzzzzz{{{||||}}}}}||||||||||||||||}}}}}}}}}}}~~~~~~}}}}}}}||||{{{{{{{{{{{{|||}}~~~~~~}}}}}}~~~~~~~~}}||{{{zz{{{{||||}}}}}}}}}}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}||||||{{{{{{||||}}}~~~~~~~~~~~~~~~~~~~~}}|||{{{{{{||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}|||||||||||}}}}~~~~~~~~~~~~~~~~~~~}}}||||||||||}}}}}}~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||}}}}}~~~~~~~~~~~~~~~~~~}}}}||||||}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}|{zyxwvvutssrrrrqqrrrstuvwxz{}~~|{yxwvtsrqqpppppppppqqqrrrsssttuuvyz|yz{vz~}}{zyxwuutsrrrqqqqrrsttuvwyz|~~~}}}}|||||}}}~ytsx|wtsrstuvwxyz{|}}~~~~~}}}||{zzyyxwvuttsrrqqpppooooooooopppqrrstuvwxyz|}~{xurqruz~zwusrqppppppqqqqqrrrrrrrssssstttttttttuuttuuuvvwwxxyyzz{{||}}~~~|yusqpoqsw||ywusqqpppqqrrstuuuvvuuttrqppoonnnnooppqrstuuvwwxxxyyyxyyyyzz{{|}~}{xusqppqruy}|zxvutsrqqqppppppppqqqqqqqqqqqqqqqqqqqqqqqqqrrrssttuuvwwxyzz{|}~~{xvutstvx|~{yxvtsrqqpppppooooooooooooooppppppqqqrrrssttuuuvwwxyyz{||}~~|zxvuuvx{~}{zyxwvvuuuttttsssssssrrrrrqqqqqqqqqqqrrsstuuvwxyz{|}~}zwtrpoopsvy~~{ywuttssssttuuuuuuuttsrqqpooooooopqqrstuvwwxxyyyyyyyzzzzzz{{||}~}{ywusqpppqrux{~~}{yxvuttsrrrqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrsssttuuvvwwxyyz{||}~}{ywutsttvxz}~|zxwvutsrrqqqpppppppppppppppqqqrrrrssttuuuvvwxxyyz{{|}}~~|zxwvvvwxz}~|{zyxwvvuuttssssrrrrrrqqqqqqqqrrrrsstuuvwwxyz{|}~~|zwusqpopqrux|}{zxwwvvvvvwwwwwvvuutssrqqpppppqqrrstuvwwxyyzz{{{{{{{{{{|||}}}~}|zxvusrqpppqrtwy|~}{zyxvvuttssrrrrrrrqrrrrrrrrrrrrrrrsssstttuuuvvwwxxyzz{||}}~~|zywvutttuvwz|~}{zyxwvuttssrrrrrqqqqqqqrrrrrssstttuuvvwwxxyyzz{||}}~~~|{yxwvvuvwxz|~}|{zyxxwvvuuutttsssssssrrssssssttuuvvwxyyz{|}~~~|zxvtrqpppqrtwz}}|{zzzyyyyyyyyxxwvvuttsrrrrrrrsttuvwxxyzz{{||||||||||||||}}}~~~}{zxwutrqqpppqrtvx{}~|{zyxwwvvuuttttssssssssssssssstttttuuuvvvwwxxyyyz{{||}}~~~|{zxwvuttttuvwy{}~|{zyxxwvvuuttttssssssssttttuuuuvvvwwxxyyyz{{{|}}~~~}{zyxwvvuvvwxz{}}|{zzyxxwvvvuuuuttttttttuuuuvvvwxxyyz{||}~~~}|zxwutrqpppqrtvy|~~}}}}}}|||{{zyyxwvuuttttttuuvvwxyyz{{||}}}}}}}}}}}}}}}~~~~~|{zxwvusrrqpppqrstvxz|~~}|{zyyxxwwvvvvuuuuuuuuuuuuuuuvvvvvwwwxxxyyyzz{{||}}}~~~}|zyxwvuuttttuvwy{|~~}||{zyyxxwwvvvvvvvvvvvvvvwwwwxxxyyyzzz{{||}}~~~~}|{zyxwvvuuuvwxy{|~~}|{zzyyxxwwwvvvvvvvvvwwwxxxyyz{{||}}~~~~~}}|{zxwvtsrqqpqqrtvxz}~~}}|{zyyxwwvvvvvvwwxxyzz{||}}~~~~~~~~~~~~~~}|{zxwvutsrrqqqqrrstvwy{}~}||{zzyyyxxxxxwwwwwwwwwwwwwwxxxxxyyyzzz{{{|||}}}~~~}|{zyxwvuuttttuuvwxz|}~}||{{zzyyyxxxxxxxxxxxxxyyyyzzzz{{{|||}}}~~~}||{zyxwwvvuuuvvwxyz|~~}}|{{zzyyyyxxxxxxxxyyyzzz{{||}}~~~~}}}|||||{{zzyxwvutsrrqqqrrtuwy|~~~}|{zzyxxxxxxyyzz{||}}~~~~~~~~~~~~~~}|{zyxwvutssrrrrrrstuvxy{|~~}}||{{{zzzzyyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~}||{zyxwwvuutttttuuvwxz{}~~~}}||{{{{zzzzzzzzzzzzzz{{{{{||||}}}~~~~~~}|{zzyxwwvvuuuuuuvwwyz{}~~~}}|||{{{{{{{{{{{{|||}}}~~~~~}||{{zzzzzzyyyyxwwvutssrrqqrrtuvxz}~}}|{{zzzzzzz{{||}~~~~~~~~~~~~}||{zyxwvvuttssrrrrrsstuvwyz|}~~}}}|||{{{{{{{{zzz{{{{{{{{{{|||||}}}}~~~~~~}||{zyyxwwvuuuttttuuvvwxy{|}~~~}}}}||||||||||||||||}}}}}}~~~~~~~}}|{{zyyxwwvvuuuutuuuvvwxyz|}~~~~}}}}}}}}}}~~~~~~~~~~~~~~}||{zzyyxxxxxxxxxwwvvuutssrrrrrstuvxz|~~}}|||{{{|||}}~~~~~~~~~~~~~~~~~}}|{{zyyxwvvutttssssssttuvwxyz{}~~~~}}}}}}|||||||||||}}}}}}}}~~~~~~~~}}||{{zyyxxwvvvuuutttuuuvvwxyz{}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyyxxwwvvuuuutuuuuvvwxyz{|~~~~~~}}}~~~~~}|{zyyxxwwwvvvvvvvvvvvuuttsssrrsstuvwy{|~~}}}}}}}~~~~~~~}}}}}}}}~~~~~~~~~~~~~~}}}||{{zzyxxwwvvuuttttttttuuvvwxyz|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuttttuuuvwwxyz{|}~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxwwvvvuuuttttttuuuvwwxyz{|~~~~}}}}}}}}~~~~~~}|{zzyxwwvvvuuuuuvvvvvvuuutttsssssstuvwxz{}~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}}}}}|||{{zzyyyxxwwvvuuuttttttttuuvwwxyz{|}~~~~~~~~~~~}}}|||{{zzyyxxxwwvvuuuuuttuuuuvvwwxyz{|}~~~~~}}}}|||{{zzzyyxxwwwvvuuutttttstttttuuvwxxyz{|~~~~}}}}}}}}}}}~~~~~}||{zyxxwvvuuuttttuuuuuuuuuuutttssssttuuvxy{|~~~~}}}|||||{{{{{{{{{{{{{{{{{{{zzzzyyyxxxwwwvvvuuuuuttuuuuvvwwxyzz{|~~~~~~~~}}}||||{{zzzyyxxxwwvvvuuuuutttuuuuvvwwxyz{{|}~~~~~~~~}}}}}|||{{{zzzyyxxwwwvvvuuutttttttttttuuvvwxxyz{|}~~~~}}}}|||||}}}}}~~~~~~~}||{zyxxwvuuttttsttttttuuuuuuuuttttttttuuvwxz{}~~~}}|||{{{{{{zzzzzzzzzyyyyyyyyyxxxxxwwwwvvvvuuuuuuuuuuuvvwwxxyz{|}~~~~~~~~}}}}||||{{{zzzyyxxxwwwvvvuuuuutttuuuuuvvwwxyyz{|}~~~~~~~~~~}}}}}}||||{{{{zzzyyyxxwwwvvvuuuttttsssssssstttuuvvwxxyz{|}~~~~}}}|||||||}}}}}~~~~~~~~}}}|{{zyxwwvuuttssssssstttttuuuuuuutttttttuuvwxy{|~~~}}||{{{zzzzzyyyyyyyyyxxxxxxxxwwwwwvvvvvuuuuuuuuuuuuvvvwwxxyz{{|}~~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvuuuuuutuuuuuuuvvwwxyyz{|}}~~~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvuuuttttsssssssssssssttuuvvwxxyz{|}~~~}}}}|||||||}}}}}}~~~~~}}}||{{zyxxwvuuttsssssssssstttuuuuuuuutttttuuuvwxyz{}~~~}}||{{zzzyyyxxxxxwwwwwwwwvvvvvvvvuuuuuuuuuuuuuuuuvvvwwxxyyz{||}~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvvuuuuuuutuuuuuuvvvwwxyyz{{|}~~~~~~~~}}}}}}||||{{{{{zzzyyyxxxxwwwvvvuuuttttssssssssssssstttuuvvwxxyz{{|}~~~}}}|||||||||||}}}}}}}}|||{{zzyxwwvuttssrrrrrrrssstttuuuuuuuuuuuuuuvvwwxy{|}~~}}||{{zzyyyxxxwwwwvvvvvvuuuuuuuuutttttttttttuuuuuvvvwwxxyzz{|}}~~~~~~}}}}||||{{{{zzzyyyyxxxwwwvvvvuuuuuuuttuuuuuuvvvwwxxyzz{|}}~~~~~~}}}}}||||{{{{zzzzyyyxxxxwwwvvvuuuttttssssrrrrrrrrrrssssttuuvvwxxyz{{|}~~~}}}}||||||||||}}}}}}||||{{zzyxxwvuutsssrrrrrrrsssttttuuuuuuuuuuuuuvvwwxyz{}~~}}||{{zzyyxxxwwwvvvvuuuuuuuttttttttttttttttuuuuuvvvwwxxyyz{{|}~~~~~~}}}}||||{{{zzzzyyyxxxwwwwvvvvuuuuuuuuutuuuuuuvvvwwxxyyz{||}~~~~~}}}}||||{{{{zzzzyyxxxwwwvvvuuuutttsssssrrrrrrrrrrrrrrsssttuuvvwxxyz{{|}~~~~}}}}|||||||}}}}}}}}|||{{zzyyxwvvuttssrrrrrrrrrssttttuuuuuuuuuuuuuvvvwxyz{|}~~~}||{{zzyxxwwwvvvuuuuttttttsssssssssssttttttuuuvvvwwxxyyz{{|}~~~~~}}}}||||{{{zzzyyyyxxxwwwwvvvvuuuuuuuttttuuuuuuvvvwwxxyyz{{|}}~~~~~}}}}||||{{{zzzzyyyxxxwwwwvvvuuuttttssssrrrrrrrrrrrrrrssssttuuvvwxxyzz{|}}~~~~}}}}||||||||||||||||{{{zzyxxwvvuttssrrrqqqrrrrsstttuuuuuuuuuuuuvvvvwxxyz{|~~~}}|{{zzyxxwwwvvuuuttttsssssssrrrrrsssssssttttuuvvvwwxyyzz{|}}~~~~}}}}|||{{{{zzzyyyxxxxwwwvvvvuuuuuuuttttttuuuuuvvvwwxxyyzz{||}~~~~~~}}}||||{{{zzzyyyxxxwwwwvvvuuuttttssssrrrrrrqqqqqqrrrrrrsssttuuvvwxxyzz{|}~~~~~}}}}}}|||||||||||||{{zzyyxwwvuutssrrrrqqqrrrrsssttuuuuuuvvuvvvvvvvwwxyz{|}~~~}||{{zzyxxwwvvuuutttssssssrrrrrrrrrsssssttttuuuvvwwxxyzz{||}~~~~~}}}}|||{{{zzzyyyxxxxwwwvvvvvuuuuuuttttttuuuuuuvvvwwxxxyzz{{|}}~~~~}}}}|||{{{zzzyyyxxxwwvvvuuuttttssssrrrrrqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}~~~~~}}}}}}}}}}}}|||||{{{zzyxxwvvuttssrrrqqqqqrrrssstttuuuuuvvvvvvvvvvwwxxyz{|}~~}}|{{zzyxxwwvvuutttsssrrrrrrrrrrrrrrrrssssttuuuvvwwxyyzz{|}}~~~~}}}|||{{{zzzyyyxxxwwwwvvvvuuuuuuutttttttuuuuuvvvwwwxxyyzz{||}~~~~~~}}|||{{{zzzyyyxxxwwwvvvuuuttttssssrrrrrqqqqqqqqqqqrrrrssstttuuvwwxxyzz{|}}~~~~}}}}}}}}||||||||{{{zzyyxwwvuutssrrrqqqqqqrrrsstttuuuuvvvvvvvvvvvwwxxyz{|}~~~}}||{zzyxxwwwvvuuttsssrrrrqqqqqqqqqqrrrrssstttuuvvwwxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxwwwvvvvvuuuuuuttttttttuuuuuvvvvwwxxyyzz{{|}}~~~~}}|||{{{zzzyyxxxwwwvvvuuutttssssrrrrrqqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}~~~~~~}}}}}}}}}|||||{{{zzyxxwvvuttssrrrqqqqqqrrrsssttuuuuvvvvvvvvvvvwwwxyyz{|}~~~}}||{zzyxxwwvvuuttsssrrrrqqqqqqqqqqrrrrrsssttuuvvwwxxyzz{||}~~~~}}}|||{{zzzyyyxxxxwwwvvvvuuuuuuuttttttttuuuuuuvvvwwxxxyzzz{||}}~~~}}}|||{{zzzyyyxxwwwvvuuuttttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvwwxxyzz{|}}~~~~~~~}}}}}}}}|||{{{zyyxxwvvuttssrrrqqqqqqrrrsssttuuuuvvvvvvvvvvvwwwxxyz{||~~~~}}|{{zzyyxwwvvuuttsssrrrqqqqqqqqqqqqqrrrsssttuuvvwwxxyzz{||}~~~~}}|||{{{zzyyyxxxwwwwvvvvuuuuuuttttttttttuuuuuvvvwwwxxyyzz{{|}}~~~~~}}|||{{zzzyyxxxwwwvvvuuttttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvvwxxyyz{||}~~~~~~~}}}}}}||||{{zzzyyxwwvvuttsssrrrrrrrrrrssstttuuuuvvvvvvvvwwwwxxyyzz{|}~~~~}}||{{zyyxxwwwvvuutttsssssrrrrrrrrrrrrsssstttuuvvwwxxyyzz{||}~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvuuuuuuuuuuuuuuuuuvvvvwwwxxyyyzz{{||}~~~~}}}|||{{{zzyyyxxxwwwwvvvuuuuttttttssssssssssssssttttuuuuvvwwxxxyyz{{||}}~~~~~~}}}}|||{{{zzyyyxxwwvvvuuuutttttttttuuuuuvvvvvwwwwwwwxxxxyyyzz{{|}}~~~~}}}|||{{zzzyyxxxwwwvvvuuuuutttttttttttttuuuuuvvvwwwxxyyzz{{||}}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwvvvvvvvvvvvvvvvvwwwwwxxxxyyyzz{{|||}}~~~~~}}}|||{{{zzzyyyyxxxwwwwwvvvvvvvuuuuuuuuuuuuuuvvvvvwwwwxxxyyzzz{{||}}~~~~~~}}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvvvvvvwwwwwwxxxxxyyyyzzz{{{||}}~~~~~}}}||||{{{zzzyyyxxxxwwwwwvvvvvvvvvvvvvvvvvwwwwwxxxyyyzzz{{||}}~~~~~~}}}||||{{{{zzzzyyyyxxxxxxxxwwwwwwwwwwwwwwwxxxxxxyyyzzzz{{{||}}}~~~~~}}}||||{{{{zzzzyyyyxxxxxwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyyzzz{{|||}}~~~~~~~}}}}||||{{{{zzzyyyyxxxxxxwwwwwwwwwwwwwxxxxxxxyyyyyyzzzz{{{|||}}~~~~~~~}}}}|||{{{{zzzzyyyyyxxxxxxxxxwwwwwwwwwxxxxxxxyyyyyzzz{{{|||}}}~~~~~~}}}}||||{{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyzzzz{{{||||}}}~~~~~~}}}}||||{{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxxxyyyyyzzzzz{{{|||}}}~~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyxxxxxxxxxyyyyyyyyyzzzzzz{{{{||||}}}~~~~~~~}}}}|||||{{{{{zzzzzyyyyyyyyyyxxxxxxxxyyyyyyyyzzzzz{{{{|||}}}~~~~~~~~}}}}|||||{{{{{zzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}~~~~~~~~}}}}|||||{{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzyyyyyyyyyyyyyzzzzzzzzz{{{{{{||||}}}~~~~~~~~~}}}}}|||||{{{{{{{zzzzzzzzzzzyyyyyyzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{||||}}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{|||||}}}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{||||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||{{{{{{{{{{{{{{{{{{|||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||||||{{{{{{{{{{{{{|||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||{{{{{{{||||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}|||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}|||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}|||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~trqhbb_[ZZYXXXXXXXYYYZZ[[\]abcefhjlnqsvy|~{xvspnljihffedegggggggggggfffeeeeefhjou}i_a`p}~|yvspnkigeedccccdefhjmpsvy}}|zywxxwwvvuvvvwxz{teduuha`bejmosvy|~~}|{zywvtrpomjgecb`_]\[ZZYYYYZ[\]_acehkmpsvz}vlfekxvohec``_``bdeeffgfeeeeddccbaa``^]]]]]]\\\]]^_acdfhiknprtvxz|}{sjc^[[_fq}xqjfb_^]]^`acdfghhhgfecb`_]\[ZZZ[\]^`acdfgijkllmnnoopqrstuwy{}~xrkd_[Z[_gp{{tojgda`^]]]]\]]]]]]]]]]]\\\\\[[[[[[[[\\\]^^_`abdeghjlnprtvxz}}vpjebacipy|vpkgda_^]\[[[[[[[\\\\\\]]]]]^^^__``abbcdefghjlmoprtvxz|~ysmiedeiox}xtqnljhgfeddccbbaaa`__^^]]]\\\\\\\]^^_abcegikmpruwy|~zskd^ZXX\ajtzsnifcbaabbcdeffffedcb`_^]\[[[\]^_acdfhjkmnopqqrrssttuvwxz{}ztoid_[YXY]bjs|}xsokheca`^^]\\\\\[[[[[[[[[\\\\\\\]]^^__`abcdefhiklnprsuwy{}{uojfb``bfls{~xsokgeb`_]\\[[ZZZZZ[[\\\]]]^__``abcdefghiklmoprtuwy{}~~xsnjfddehmt|{wtpnkigfdcba``_^^]]\\\\\[\\\\]]^_`bcdfhjlnprtvy{}{unhb]ZXY[`gox|wrnkigfffffggggffecba_^]\\[[\]^_acefijlnoqrsttuvvwwxxyz{}~}ytokfa^[YYZ]ahov~|wsoligeca`_^]]\\[[[[[[[[[[\\\\]]^^_``abcdeghjklnpqstvxz{}{vqmiecbbdgkqx}ytqmjhecb`_^^]]]]]]]]]]^^^_``abbcdefghjklmoqrtuwxz|~}yupmigfegimsy}zvsqnljhgfdcba``_^^^]]]]]]^^_`abcdfgikmoqsuwy{}~|wrlgc_\[[]afmt}|xusqonnnmmmllkihgecba_^^^^^_`bcegiklnoqrsttuvvvvwwxxyz{|}}yuqmiea^\[[\_chmt{}zvspnkigfecbba``____^^^^____```abbcdefghijklnoprsuvxy{|~~zvrnkhedccehkqv}{xuromkihhfedcccbbbbbbbbccddeefghijklmnoprstvwxz|}~|xtqnkigffhjmrx~{yvsqomkjhgfedccbbbbbbbbccdefghjkmnpqsuvxz{|~~zwsnjfb_]\\]`ekqy|zyxwvvuutsrqonljigfedcccddeghjlnoqstuvwxxyyyyyyzzz{{|}~|yvrokheb_]\[[]_bfkqw}}zwusqomljihhgffeeeddddddeeefffghijjklmnopqrstuvwyz{|~~zwtqnjhfdcccegjnty~~{xwusqpnmlkjjiiihhhhhiiijjkklmnnopqrstuvwyz{|}~{xuroljhfeeegilpuz~|ywtrpnmlkjiihhhhhhhiijklmnoprstvwyz{|}~~}{ywtqnjgc`^\[[\_cgmsz~}||{zyxvusqonlkjiiiiijkmnoqstvwyz{|||}}}}}}}}}}~~}zwtqnkheb`^\[[\]_aeinsx~~|zxvtrqponmlkkkjjjjijjjjjkllmmmnoopqrsstuvwxyz{|}~|zwtroljgecbbbbdfilpuz~|zxvusrqpoonnmmmmmmnnnnoopqqrsstuvwxyz{|}~}{xuspnkigfddddfhjnrv{}{ywvtsqponnmmmllmmmnnopqrstuwxyz{}~~}{{zyxwvutrpmkhec`^\\[\^aejou|~}{ywutrponmmmmmnoqrsuvxyz{|}~~~~~~~~~~~~~}{xvspmkheca_]\\[\]_adglpuz~}{zxvutsrqppoonnnnmnnnnooopppqqrrstuuvwxxyz{|}~}{xvtqomjhfeccbbcdfilosw|}{zxwvutsrrrqqqppqqqqqrrssttuvvwxyz{{|}~}{yvtrpmkihfedddefhjmptx|}|zxwvutsrrqqqqqrrrstuuvwxyz{|}~~~}{zxwvvuttsrqonljheca`^]]^_beinsy~~}{ywutrqqpppqqrtuvwyz{|}~~~~~~~~~}{yvtromkhfdba`_^^_`acfilptx}~|{zywvuutssssrrrrrrrrrrsssttuuuvwwxyyz{{|}}~~|{ywusqomkigfedccddfgilorvz~~}|{yyxwvvuuuututuuuuuvvwwwxyyz{{|}}~~|zywusqomljhgfeeeefgikmpsw{~}{zyxwwvvvvvvvvwwxyyz{||}~~~~~~}}~~~~|zxvutrqqpoonnmlkjigfdba`___`behlqv|}{yxvuutttuuvwxyz||~~~~}}}}}}}~~~~|{ywusqpnljhfdcba```abcegjmptx|~}|{{zyyxxwwwwvvvvvvvwwwwxxxyyzz{{||}}~~~}|{yxvtsqonljigfeddccddfgilnqux|~}||{zzzyyyxxxxxyyyyyzzz{{||}}}~}|{zxwutrpomljhgfeddcddefgilnqux{~}}||||||||}}~~~~~}}|||||||}~~}{ywusrponmllkkkjjiihgfecba`__``bdgjosx}~|{zyyxxyyz{|}~~}}}||||||||}}}~~~}}|zyxvusqpnljigfdcba````abcegiloruy}~}}||{{{zzzzzzzzzzzz{{{{||||}}}~~~}|{zyxvutrqonlkihgeedcccccdegikmpsvy}~~}}||||||{|||||||}}}}~~~~}}|{zywvutrqonlkihfedccbbbbbcdfhjloqtx{~~}}||{{{{{||}~~}|zxvtrpnmkjjihhhhggggfeedcba``_``bcfilpty~~}||||||}~~}}||{{{{{{{{{{{{||||||||{{{zyyxwvusrqonmkjhgfeccbaaabbcdfhjloqtx{~~~~~}}}}}}}}}}}}}}~~~~~~}}|{zyxwvutrqpomljihgfedccccccdeghjloqtwz}~~~~~~~~~~~~~~}||{zyxwvutsqpomljihgfedccbbbbcdefhilnpsvy|~}||{{{{{{{{|}}}~~}|zxvtrpnlkihggfffffeffeeeddcbaaaaabdehknrv{~~~~~}||{{zzzyyyyyyyxxxxxxxxwwwvvvuttsrqponmkjihgfeddccccddefhikmprux{~~~~}}||{zzyxwvutsrponmlkjhgffeddcccddefgijloqsvy|~~~~~~~~}}}|{{zzyxwwvutsrqpnmljihgfeddcbbbbbbccdfgikmoqtwz}~}|{{zzzyyzzzz{{|}}~~~~~~}}|zywutrpnljigfeeddddddeeeeedddccbbbccdfhjmqux}~}|{zzyxxwwwvvvvuuuuuuuutttssrrqpoonmlkjihgffedddddddefghjkmortwy|~~~~~~~~~~}}}}||{{zzyyxwwvutsrqponmlkjihgffedddddddeeggiklnqsux{}~~~~~~~~}}}}}|||{{zzyyxxwvuutsrqponmlkjihgfedccbbbbbbbcdefgijlnqsvx{~~}|{{zzyyyyyyyyzz{{|||||||{zyxvtsqomkjhgedccbcbcccddddddddcccccccdfgjlosvz~~}|{zyxwwvuutsssrrqqqqpppooonnmmlkkjiihggfeeeddddddefghijlnprtwy|~~~~~~}}}|||{{zzzyxxwvvuttsrqponmlkjiihgfeeddcccccddefghjlnprtvy{~~~~~~}}}}||||{{{zzyyxxwwvuutsrrqponmlkjihgfeddcbbaa`````aabcdegijlnqsuxz}~}|{zzyxxxxxxxyyyzzzzzzzyxxvusqpnljhgedcbaaaaaaabcccddddddccccddegikmptw{~}{zyxwvuttsrrqqppooonnnmmmllkkjjiihggffeeddddddddeffgijkmoqsuxz|~~~}}|||{{zzyyxwwvuttsrqpponmlkjihhgfeeddccccccddefghjkmoqsuwz|~~~~}}}|||{{zzzyyxxwvvuutssrqponmllkjihgfedccbaa``_____```abcdfgiklnqsuxz}~}|{zzyyyxxxxyyyyzzzzzyyxwvutrpomkigfdcbaa````aaabcccddddddddddeeghjlorux|~}|{yxwvutsrqpponnmmllkkjjjiihhgggffeeedddddddddeffghiklnoqsuwz|~~~}}}||{{zzyyxwwvuutssrqpoonmlkjjihggfeedddccccddeffgijkmoprtvx{}~~}}}||{{zzyyxxwwvvuttsrqqponmllkjihgffedccbaa````__```abbcdfgijlnprtvy{}~}|{zyyxxxxxxxxxxxxxxxxwvutsrpnlkigedbaa``````aabbcddddddededeefghjlnqtwz~~}|{yxwvtsrqponmllkjjiihhggfffeeedddccccccccddeefghijklnpqsuwz|~~~}}||{{zzyyxwwvuutsrrqponnmlkjjihggfeeedddcccdddeffhijkmnprtvxz|~~~}}||{{zzyyxwwvvuttsrrqponnmlkjjihgffedcbbaa``________``abcdefhikmnpruwy{}~}|{zyyxxxxxxxxxxxxxxwwvutsrpomkihfdcba`______``abbcdddeeeeeeeffghjkmprux{~}|{yxwutsrponmlkkjiihggfffeedddcccccccccccccddeffghjklnoqsuvx{}~~}}|{{zzyxxwvvutssrqpponmllkjiihggfeedddcccccdddefgghjklnoqsuwx{}~}}||{zzyxxwvvuttsrrqponnmlkjjihgfeedcbba``__^^^^^^^^^__`aabdefhikmoqsuwy{}~}|{{zzyyxxxxxxxxxxwwwvutsrqonljhgedba`__^^^^__`aabccddeeeeeffffghijlnpsvy|}|{yxwutsqponlkjihhgfeeddccbbbbaaaaaaaaabbbccdefghijlmoprtvxz|~~~}||{zzyxxwvuttsrqqponmmlkjiihggfeedddcccccccddeefghijlmoprtuwy{}~}}||{zyyxwwvutssrqpoonmlkkjihgffedccbaa``__^^^^^^^^^__``abcefgijlnprsvwz|~~}|{zyyxxxxwxwwwwwvvvutsrqonljigfdba`_^^]]^^^_`aabcddeeefffffgghijkmoqtwz}~|{zxwutsqpnmlkjhgffedccbaaa````____````aabbcdefghjklnpqsuwy{}~}|{{zyxxwvuttsrqpoonmlkkjihhgffeedddcccccccddeefghijklnoqstvxz|~~}|{{zyxxwvuttsrqpponmlkjjihgffedcbbaa`__^^^]]]]]]]^^__`abcdefhiklnprtvxz|~~}|{{zzyyyxxxxxxwwwvuutsqpomljhgedba`_^^^^^^^_`aabcddeeeffffggghijkmnpsux{~~}{zywvtsqpomlkjhgfeedcbbaa```_______```aabbcdefghiklmoqrtvxz|~~}|{{zyxwwvutsrrqponnmlkjjihhgffeedddccccccdddeefghijklnoprtuwy{}~~~}|{zzyxwvuttsrqpoonmlkjiihgfeedcbba``__^^^]]]\]]]]^^__`abcdfghjlmoqsuwy{}~}||{zzzyyyxxxxwwvvutsrqpnmkihfecba`_^^]]^^^_``abccdeeffffggghhijklnprtwy|~|{zxwvtsqpnmljihgfedcbaa`___^^^^^^^^___`aabcdefghjklnpqsuwy{|~~}}|{zyxwwvutsrqpponmllkjiihggfeedddccccccccddeefghhjklmopqsuvxz{}~}|{zyyxwvutsrqpponmlkjihhgfedccbaa`__^^^]]]]\\\]]]]^__`abcdefhiklnprtuwy{}~}|{{zzyyyxxxwwwvvutsrqpnmkjhgedba`_^^]]]]^^__`abcddefffgggghhiijlmoqsuxz}~}|zyxvusrpomljihgfedcba``__^^^^]^^^^^__``abbcdefhijlmoqrtvwy{}~}|{zzyxwvutsrqpoonmlkjjihggffeeddccccccccccddeffghijklnoqrtuwxz|~~}|{zyxwvutsrqponmllkjihgfeddcbaa`__^^]]]\\\\\\\\]]]^__`abcdfghjkmoqrtvxz|~~}||{{zzyyyxxxwvvutsrqpnmkjhgecba`_^]]]]]]^__`abccdeeffggggghhijklnoqsvx{~~}{zywvusrpomljihgedcba``_^^]]]]]]]]]]^^__`abcdefhijlmoqrtvxz{}~}|{zyxwvutsrqpponmlkjjihggffeeddccccccccccddeefghijklmnpqstvwy{}~~}|{zyxwvutsrqponmlkjihgffedcbba``_^^]]]\\\\\\\\]]]^__`abcdeghiklnpqsuwyz|~~}||{{{{zzyyxxwvutsrqpnmkjhfedba`_^^]]]]^^__`abccdeefffgggghhijklmnprtwy|~}|{zywvusrpomlkihfedcba`__^]]]\\\\\\\]]^^_`abcdefhijlnoqstvxz|~~|{zyxwvutssrqponmlkjjihggffeedddcccccccccddeefgghijkmnoqrsuvxz{}~}|{zyxwvutsrqponmlkjihgfeddcbaa`__^^]]]\\\\\\\\\]]^^_`aabdefgijlmoqrtvxy{}~}}||{{zzyyxxwvuutrqpomljigfdca`_^^]]]]]^^_``abcddeffggghhhiijjklnoqsuxz}~}{zyxvutrqonlkjhgfdcba``_^^]]\\\\\\\]]^^_``abcefghjkmnprsuwy{|~~}|{zyxvvttsrqponmlkkjihhgffeedddccccccccdddeefgghijklmopqstvwyz|~}|{zyxwvutsrqponmlkjihhgfeddcbba``_`____^^^^____``aabcdefghijlmnpqsuvxz|}~}}|{{zyyxwwvutsrqonmljihgfedcbbaaaaaaaabccddeffgghhhiijjkllmnpqstvxz|~~}|{zyxwvutsqponmlkjihgffeddccbbaaaaaaaabbccddefghijklmopqstvwyz|~~}|{zyxwvutsrrqponnmlkkjiihhgggfffffeeeffffgghhiijklmnopqrtuvwyz{}~~}||{zyxwvutsrrqponmmlkjjihhggffeeddddcccccccdddeeffghhijklmnoqrsuvwyz|}~}}|{{zyyxwvvutsrqponmlkjjihggffeeeeeeeefffgghiijjkkllmmnnopqrstvwxz{}~~}|{{zyxwvuutsrqponmmlkjjihhggffffeeeeeefffggghiijklmnopqrstvwxz{|~~}|{zzyxwvuutsrqqpoonmmllkkjjiiiiiiiiiiiiiijjjkkllmnoopqrstuvwyz{|}~}|{{zyxwvvutssrqpponnmllkkjjiiihhhggggggggghhhiijjkklmnoopqrtuvwxy{|}~~}}|{zzyxxwvuttsrqpponnmllkkjjiiiiiiiiiijjjkkkllmmmnnoppqrsstuvxyz{}~~~}|{{zyxxwvuttsrqqpoonmmllkkjjjiiiiiiiiiiijjkkklmmnoopqrstuvwxy{|}~~}}|{zzyxwwvuutssrrqppoonnmmmllllkkkkkkkkklllmmmnnoppqrrstuvwxyz{|}~~~}|{{zyxxwvuutssrrqppoonnmmlllkkkkkkjjjjkkkklllmmnnoppqrrstuvwxyz{|}~~}}|{{zyyxwwvuutssrqqpponnnmmmlllllllllllmmmmnnnooppqqrsstuvvwxyz{|}~}}|{{zyyxwwvuutssrrqppooonnmmmmmmllllllmmmmmnnooppqqrsstuvwxyyz{|}~~}}|{{zyyxwwvuuttssrrqqpppooonnnnnnmmmmnnnnnoooppqqrrsttuvwwxyz{|}~~~~}||{zzyxxwwvuuttssrrqqqppoooonnnnnnnnnnnnnnooopppqqrsstuuvwxxyz{|}~~}}||{zzyyxwwvvuttssrrqqpppoooonnnnnnnnooooopppqqqrrsstuuvwwxyz{{|}~~~}}|{{zzyyxwwvvuuttssrrqqqppppooooooooooooopppqqqrrsstuuvwwxyzz{|}~~~}}|{{zzyxxwwvvuuttsssrrrqqqpppppppppppppppqqqrrrssttuuvwwxyyz{||}~~~}}||{zzyyxxwwvvuuttsssrrrqqqqpppppppppppppqqqqrrssstuuvvwxxyzz{|}}~~}}||{{zzyxxwwvvuutttssrrrqqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxyyz{||}~~~}}||{{zzyyxxwwvvuutttsssrrrrqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}}~~~}}||{{zzyyxxwwvvvuutttsssssrrrrrrrrrrrrrrrssssttuuuvvwwxyyzz{||}~~~}}||{{zzyyxxwwwvvuuutttssssrrrrrrrrrrrrrrrsssstttuuvvwwxxyyz{{|}}~~~}}||{{zzyyxxwwwvvuuuttttsssssssrrrrsssssssttttuuuvvwwxxyyzz{||}~~~~}}||{{{zzyyxxwwwvvvuuuttttsssssssssssssssttttuuuvvvwwxxyyzz{{|}}~~~~}}|||{{zzyyxxxwwwvvvuuuuttttttssssssssttttttuuuvvvwwxxyyzz{{||}~~~~}}||{{zzzyyxxxwwwvvvuuuutttttttttttttttttuuuuuvvvwwxxxyyzz{||}}~~~~}}||{{{zzyyyxxxwwwvvvuuuuuuttttttttttttuuuuuvvvwwwxxxyyzz{{||}}~~~~}}||{{{zzyyyxxxwwwwvvvvuuuuuuuuuuuuuuuuuuuvvvvwwwxxxyyzz{{||}}~~~~}}}||{{{zzzyyxxxxwwwvvvvvuuuuuuuuuuuuuuuuvvvvvwwwxxxyyzz{{{||}}~~~~}}}||{{{zzzyyyxxxwwwwvvvvvvvuuuuuuuuuuvvvvvvwwwwxxxyyzzz{{||}}~~~~}}}||{{{zzzyyyxxxwwwwwvvvvvvvvvuuuvvvvvvvwwwwwxxxyyyzzz{{|||}}~~~~~}}}||{{{zzzyyyyxxxxwwwwwvvvvvvvvvvvvvvvvwwwwwxxxxyyyzz{{{||}}~~~~~}}|||{{{zzzyyyyxxxxwwwwwwwwvvvvvvvvvwwwwwwwxxxxyyyzzz{{{||}}}~~~~}}}|||{{{zzzzyyyyxxxxwwwwwwwwwwvvvwwwwwwwwwxxxxyyyyzzz{{|||}}~~~~~~}}}|||{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwxxxxxxyyyyzzz{{{||}}}~~~~~}}}|||{{{{zzzzyyyyxxxxxxwwwwwwwwwwwwwwwxxxxxxyyyyzzz{{{|||}}~~~~~~}}}||||{{{zzzzyyyyyxxxxxxxxxwwwwwwwxxxxxxxxyyyyzzzz{{{|||}}}~~~~~}}}||||{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyzzzz{{{{|||}}}~~~~~~~}}}||||{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~~}}}||||{{{{{zzzzzyyyyyyyyyxxxxxxxxyyyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}~~~~~~~}}}|||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}}~~~~~~~}}}}||||{{{{{zzzzzzzzyyyyyyyyyyyyyyyzzzzzzzz{{{{||||}}}}~~~~~~~}}}}}||||{{{{{{zzzzzzzzyyyyyyyyyyyyzzzzzzzz{{{{{|||||}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}}~~~~þ~hd]RPOPVUU^`\`f`^b_YYYRMKHB@>:876679<@EKS_gqz|qe]VOLHC@<:87666678889::<=@CMYfxŸ~LWcÿzsld[UOIEA><;;BFKQV[afjnrvy|ueUG>=CSi{k]RIB=:8766667777777666554444444678:<>@CGJNRV[_djoty~rdVMKP]p|m_UMFB><;:::::;;;;;<<<<<<==>>?ABDFGJLOSVY^bfjoty}reYQOT`szpf_ZVRPOMLLKJIHGFDCBA?>==<<<<=>@BEHLPTX^chmsx}sbQC:7==>?ACGJNRUY[^`bdefhikmoruy}sfXK@847@Pd{rf[SNJEB@>=<;;;;;;;;;;<<<<==>?@ABDFGJLORUY]`dimqvz¿xk]RHDEKYj~qe[RKEA=;987666677899:;<=>?ABDFHKMPSVZ]aeimrv{¿|pcYQMMTarüvld]XSPLJHFDCA@?><;::9888899;>>>>??@@ABCEFHJLNQTWZ^aeilpuy}}rg\SLGGLSaq~tjb[UPLIGECBBAAAABBBCDEFGIIKMOQTVY[^bdhlosw{{qf\TMJINVcr}tmf`[WSPNKIHFEDCBAAAAABBDEGIKNQUX]aejnsw{ym_RG>869AO`t{pg`[WUTTTTTSRPMKHEB@?>>@ADGKOSW[_begjkmnoqrsuxz}~ukaVMD>:9;BLYizxog_YTOKHECA@?>=======>>?@ABCDFHJLNQTVZ]`dgknrvz~|si`WPKJKQYfsxog`ZUPMJGEDBBAAAAABBDEEGHJLMPRTWY\_bfilptwz|sjbZTPOQV_kyľwpje`\XUROMKIHFEEDDDDDEFHJLOQUX\_cgkpsw{~xncXNE>;;@IWfyû}upkhgedcba_\YVSOLJHGGHILORVY]`dfiklnoppqrstuwy|~|tld[RJB=:89=EO[jyyqke`[XTROMLKJIHHHHHIIJKKLNOQRTVX[]`behjnqtwz}{sjbYRLGEEHNWcp~|ungb]YUROMLKJIIIIJJKLNOPQUWY[]_begkmptwz}}ume^WQMKLOU^iv~wpje`\XUROMKIHGGGHIIJLMOQTWZ]`dhkorvy|~wne[RIB><>CLYhyþytqnlkigfda_]YVROMKJJKMORUX\`cfiknopqssstuvwxz|~~wog`XPJD@==@ELVbo}ysmhfc_\YVUSQPONNNNNNNOOPQRTUWXZ\^`cegjmorux{}yrjc\VPLIIJOV^iv}wqlhda^\ZXWVUUUUUVVWXY[\]_acegilnqsvx{~|vohb[VQMKKMQXalxytokgc`^[YXVUUTTUUVXY[]`behknqtwz}~{xsng`XPHB=::=BLXfu}zywuroliea]ZXVUUUWY\^beilortvwxyyyyzz}~~yrkd\UOHC?<;==@DJQZdoz{wspmjhfdba`___^^___`aabcefgijlnpqsuwy{~zvqkf`[VQMJGFGILQX`jt~}yuroljhfedccccccdeeghiklmoqrtvxz}~zvqlga]XSPMKJKMPU\dnx{vsoligecba```abcdfhjloqsvxz|~{xuspomkhfb^YTOJEA??@DKS^jw{xtplheba`_`acehjmpsuxz{|}~~~~}}}}}}~|wrmgb\WRMIFCBBCFJPW_hr|{wtqoljhgedccbbbbbbccdefghjklnpqsuvxz{~|xtpkfb]XTQNKJJKNRW^enw|yvsqomljiihhhhhhijkkmmoqrtuvxz{}~|yuqlhd_[WSPMKKKLOSY_gpy~zwtrpnmlkkkklmnqrsuwyz|}~~~~}~{wsoljhfdba_\YVRNJFB@??BFLU_jw{wsqomkkkkmoqsvx{}~~~~}~~~}yuqlgb]XSOJFCA??@AEIOV^foy~{zxusrponmllkkkkkllmnnopqrttvwyz|}~~{wtplgc_[VSOLJIIIKNRW]dmu~~{ywutrqpooonnoooppqrsuvvxyz|}}zwsokgc_[XTQOMLLLNRV[aiqz|ywusrqqppqqrstuwxy{|~~}|||||}~}ytqmjgecb`_^\ZXUQNKGECCDGKQYcny|yusponnnpqsuwy{}~}|{{{{{{||}~~|yvsokgc_ZVRNKHFDDDFHLPV\dlt}}{yxwutssrrqqqqqrrsstuuvwxyz{|}~~|zwtqnjgc_[XTQNKJHHHJLOSY`fnv~}|zyxwvvvuvuvvvwwxyzz{|}~}{xurolhea]ZVSPMKIHHHJLPTZ`gnv}|{{{{{{|}~~}}|{{{||~~zvqmifb`][ZYXWUSQOMJHEDCCDGKQYblw{yvtsssuvxy{~~}||{{{||}}~~|ywtqlhea]YUROLIGEEEFGJNRX^elt|~|zyxwvuuttttttttuuvvwxxyz{{}~~}zxvsqnkheb^[XURPNLKJJLMPTX]ciqx}|{zyxxxwwxxxxxyzz{||}~~~}{ywuspnkheb_\YVSPNLKJJJKMPTY^dkry~|{zyxxwwwxyz|}~zwsokgc_\YWUTSRRQQPNMKIGEDDDFINT[dnx|{zyyz{}~}|{zyxwwwwwwwxxxxxxxxwvutrqnljgda^[XTQNLJHFFFFHJMPUZ`gnu}~}||{{{{zz{{{{||}}}~~~|{yxvtqomjgda^[XVSPNLJIHIIJLOSW\bhov}~~}}|||{{||||}}~~|{yxvtrpmjheb_\YWTQOMKIHHHIJLOSX]bhov}}|zyxwwvvwwxz{|~}{wtplhd`\YVTSQQPPPPONMLJIHGGHILQV]fox~|||}~~}{zxwvuuttststttttttssrrqonljhec`^[XUSPNLJIHHHIKMPTY^djqw~~}}||||{||||||||}}}}}~~~~~~}}}|||{zyxwvtsqomkigdb_\ZWURPNLKJIIJJMORVZ_ejqx~~~}}|{zywvtsqmligeb`]ZXUSPMKJHGFEEFGIKNRW[agmt{~}{zxwvvvvvwxyz{|~~~~}|zwtqmiea]YVSQONMMLLMLLKKIHGFFFGILPV]emw}{zxvutsrrqpppooonnmlkjihfdb`^\ZWUSQOMKJIIIJKMPSW[`flrx~~~~~}~}||{zyywvusrpnmkhfdb_]ZXUSQOMLKJJJKLOQTX\aflrx~~~~~~~~~~~~}}}}|||{zzyxwvutrqonljhfda_]ZXVSQOMKJHHGGGHJLNRUY_djpv|~{zxwutssssttuvwxyyyyxwurolhd`\XTQOMKJJJJJKKKKKJJIIIIJLPTY_gox}{ywusrponmllkkjjihhggfdcb`_][YWUSQONLKJIIIJKLORUY]bgmsy~~~}}}|||{zzyxwvutsqpnmkigeca_\ZXUSQOMLJIIIIJKLOQTX\afkqw}~~~}}}||{{zzyxwvvusrqonljigec`][YVTRPNLJHGFEDDDEFHJMPTX]bgmrx}{zxwvutttuuvwwxyyyxxvtrnkgc_\XTQNLJIIIIIJJKKKKKJJJJJLNQUZ`how~|zxvtrpnmljhhffedcbba`_^][ZYWVTSQPOMLLKKKLMOPSVY]afkpv|~}}}|{{zyxxwvutsqpomljigeca_][YWUSQONLKJJJJJKMNQTW[_chmsy~~}}}|{{zyxxwvutsrqpnmkjhfeca_][YWUSQOMKIHGFEDDDEFGIKNRUZ^chnsy~|zxvutsrrrrssttuuutsqpmjgc_[WSPMJHFEEEEFGHIJJJJJJJJKLNQUZ`gow~|zwusqnlkihfedcba`_^]\[ZYXWUTRQPNMLKKJJJKKMNPSVY]afjpuz~}}|{zyxxwvutrqpnmkjhfdba_][YWUSQPNMKKJIJJKLMORTW\_dimrx}~~}|{{zyxxwvutsrponlkjhfecb_^\ZXVTRPNLJIGFEDDCCDEFGILORUZ^chmrx}~|zxvutsrrrrrrssssssrpnlifc_[WTPMJHGEEEEFGHIJKKKKKLLLMNQTX]bipx|zwuromkigeca`_]\[ZYXWVUTSQPONMMLKKJJJJKLMOQSVY\`dimsx}~}|{zyxwvtsrqonmkjhfdca_][YWUTRPOMLKJIIIIIJLNORUX\`dimsx}~}|{zyxwvutsqpomljigedb`^\[YWUSQOMKIHGEDCCBBCCDEGILORVZ^bglqw|}{ywvtssrrqrrrrsrrqpnmjgda]YURNKIGEDCDDEFGHIJKKLLLLMNOQTX]biow|zwuromjhfdb`_]\[YXWVUTSRQPONNMLLKKJJKKLMNPRUW[^bfjosx}~}|{zxwvutrqonmkihfdca_][YXVTRQONMLKJJJJJKLNORTW[^bfjoty~}|{zyxwutsrponlkihfdca`^\ZXVTSQOMKJHGEDCBBAAABCDEGILORVZ^cglqv{~|zxvutsrqqqqqrqqqpomkifc`\YUQNKGECBBBBCDEGHIJKKLLLMNNPRUY^cipw~~{xuspmjhec`^\[YWUTRQPONMLKKJIIHHHHHHIJKLNPRUX[_bgkoty~}|{yxwutrqpnljigedb`^\[YWUTRPONLKKJIIIJJKLNPRUW[^bfjnsx|~}|{yxwutsqpnmkjhgeca`^\ZXWUSQONLJHGFEDCBBBBBCDEGHKMPSW[_cglqv{}zxvusrqqqpppppoonmkigda^[WSPLIGECBABBCDEGHJKLMMNNOOQRTWZ_djpw~|zwtqnkhec`^\ZXVUSRPONMLKKJIIHHHHHHHIJKLNPRTWZ]`dimqv{~}{zxwutrqomljhfeca_^\ZXVUSRPOMLKJJIIIIJJKMOPSVX[_cgkotx|~}{zxwutrpomljhgeca`^\ZXVUSQOMLJHGEDCBA@@@?@@ABDEGJLORVZ]bfkoty~}{ywvtssrrqqqpponmljgeb^[XTQMJGECBAAABCDEGHJKLLMNNOOQRTW[_djpw}~{xvspmjgda_\ZWUSRPNMLKJIHGGFFFFFFGGHIJLNPRUWZ^aeimqvz~|{yxvusqpnlkigedb`^\[YWVTRQONMLKKJJJJJKLMNPRTWY]`dglpty}~|{yxvtsqpnlkigedb`^\ZXWUSQONLKIGFEDCBAA@@@AABCEGIKNQTW[_cglpuy~}zxwutrrqpppoonmlkihec`\YVROKHFCB@@@@ABCEGHJKLMNOOPPRSUX\`ejpw~~{yvspmjgda^[YVTRONLJIHFEEDCCCCCCCDEFGIKMOQTWZ^aeimrv{}{zxvtrqomkihfdb`^][YWVTRQONMLKJIIIIIIJKLNPRTWZ]`dglotx|}{ywvtrpomkigedb`^\ZXWUSQOMKJHGEDCBA@@????@@BCDFHKMPTW[^bfkotx}}{ywvutsrrqqpoonlkifda^[WTPMJGECAA@@ABCDFHIKLMNOPPQRSTWY]aekqw}}{xurolifc`]ZXUSQNMKIHGFEDCCCBCCCDEFGHJLNPSVX\_cfjosw|~|zxwusqonljhfdb`_][YWUTRQONMLKJJIIIIJJKLMOQSUX[^behlpty}~}{ywusqonljhfdb`^\ZXVTRPOMKJHGEDCAA@???>??@ABCEGIKNQTX[_cgkotx}~{zxvutsrqqponmlkigeb_\YUROKHFCA@???@ABDFGIJLMNOPPQRSUWZ]aekpv}~|yvspmjgda^[XURPNLJHFEDCBAA@@AAABCDEGIKMORUX[_bfjnrw{}{ywusqomkigeca_^\ZXWUSRPONMLKJJIIIIJJLMNPRTVY[_beimpty|~|zxvtrpnljhfdb`^\ZXVTRQOMKJHGEDCA@@?>>>>>??@BCEGILNQTX[_cgkotx}~{zxwutssrqponmkjhec`]ZWSPLIGDBA@???@BCEFHJKMNOPPQRSTVXZ^bfkqw}}{xurolifc_]YVTQOLJHGEDCBA@@@@@@ABCDEGIKMPRUX[_cfjnrw{|zxvtrpnljhfdb`^\ZXWUSRPONMKKJIIIIIIJJKLNPRTVY\_beilptx|}{ywusqnljhfdb`^\ZXVTRPNLJIGFDCBA@??>>>>>?@ABDEGJLORUX[_cgkosx|~|zywvtssrqponmkigeb_\XURNKHFDBA@?@@ABDEGIJLMNOPPQRSTVX[^bfkqw|}{yvspmjgda]ZWUROMJHFECBA@??????@ABCDFHJMORUX[_bfjnrw{|zxvtrpmkigeca_][YXVTSQPNMLKJJIIIIIIJKLMOPRTWZ\`cfimqty||zxvtqomkifdb`^\ZWUSRPNLJHGEDCA@?>>=====>>?@BCEGILORUX\_cgkptx|}{yxwvtssqponljhfca^[WTQMJGECA@????ABCEGHJKMNOPQRRTUVY[_bgkqv|}{xvspmjfc`]ZWTQOLJHFDCA@??>>>>?@@BCDFHJMORUX[_cfjnrv{|zxvtromkigec`_][YWUTRQONMLKJIIIIIIJJKLNOQSUWZ]`cfimqtx|}{yvtromkifdb`^[YWUSQOMKJHGEDBA@??>>===>>?@ACDFHJMPRVY\`dhkptx|~|zyxvutsrqomljgeb_\YUROLIFDBA????@ACDFHIKLNOPQQRSTUWY\_cglqw|~|zxuspmjgd`]ZWTQOLJGEDBA?>>====>>?@BCEGILNQTW[^bfjnrvz~}zxusqoljhfca_][YWVTRQONMLKJIIHHHHIIJKLMOQSUXZ]`cfjmqtx|}{xvtqoljheca_\ZXVTRPNLJHGEDBA@?>>==<<==>?@ABDFHJMPSVY\`dhlptx|~|{yxwutsrpomkigda_[XURNKHFDB@????@ABDFHIKLNOPQRSSUVWZ\_cglqv|~|zwurolifc`]ZWTQOLJHFDBA@?>>>>>>?@ABDFHJLORTX[^cfjnrvz~~|ywurpnkigeca_][YWVUSRPONMLLKJJJJJKKLMNPQSUWZ\_adgknquy|~|zwusqnljheca_][YWUSQONLKIHGEDCCBBBBBBBCDEFHIKMORUWZ]adhkoswz~}{zxwutrpomkifda_\YWTQOMKIHGFFEFFGHIJKMNOPQRTUVWYZ\^adhkosx|~|zxvtrpmkhfca^\YWUSQONLKJIHGGFFFGGHHIKLNPRTVY[^adgjnqux|}{ywusqnljhgeca_]\ZYWVUSRQPPOONNNNNOPPQRTUWYZ]_adgiloruy|~|zxusqomkigeca_]\ZXVUSRQPNMLLKJJIIIIJJKLMNOQRTVX[]`behkorux|~|{ywvtsqomljheca_][XVTSQPOONNMMNNOOPQRSTUVXYZ[]^`bdfiloruy}}|zxvtrpnljhfdb`^\ZXVUTRQPONNMMMMMNNOPQRTUWY[]_bdgjlorux|~}zywusqomkihfdca_^][ZYXVVUTSSSRRRRSSTUVWXY[\^`bdgilnqtvy|}{ywusqomljhfdca_^\[YXWVUTSRQQQQPPPQQQRSTUVWYZ\^`begiloqtwz}}|zywutrqomkihfdb`^][YXWVUTSSSSSSTTUVVWXYZ[\^_`bcegilnqtwz}}|zxvusqonljhfeca`^][ZYXWVUTTSSSSSSTTUVWXZ[]^`bdgiknpsvx{~~|{ywusrpnmkihfecba_^]\[ZYYXWWWXWXXXYYZ[\]^_abdfhjlnpsuwz|~|zxwusrpnmkihfecba_^]\[ZYXXWWVVVVVVVWXXYZ[\^_abdfhjloqsvx{~~|{ywvtsqpnlkihfdca`_]\[ZYYXXXXXXXXYZZ[\]^_`abdeghjlnqsvx{}}|zxwutrpomkjhgedba`_^\\[ZYYXXXXXXYYZ[[\]_`acdfhjlnprtwy{~~|{yxvtsqpnmkjigfedcaa`_^]]\\\[[[[[\\]]^_`abdeghjlnprtvxz}}{zxvusrpomlkihgedcba`_^]]\\[[[[Z[[[[\]]^_`bcdfgikmoqsuwy|~~}{zxwutrqonmkjhgfdcba`_^^]]\\\\\\]]^__`abcdefgijlmoqsuwy{~}|zywvtsrponlkjhgfedcba`__^^]]]]]]]^^__`abcefgijlnpqsuwy{~~|{zxwutrqpnmljihgfedcbba```________``abbcdeghiklnpqsuwy{}}|zywvusrponmkjihgfedcbaa``___^^^^___``bccdeghiklnoqsuvxz|~~}|zyxvusrqpomlkjigfeedcbbaaa`````aaabccdeffgijklnoqrtvxz|~~|{zxwvtsrqonmlkihggfedccbbaaaaaaaaabbcddefgijkmnpqsuvxz|~~}{zywvutrqponlkjihhgfeeddccbbbbbbbcccdeefhijklmoprsuvxz{}~|{zxwvusrqponmlkjihggfeeddcccccccccddeefghijklmnpqstvxy{}~}|{zxwvusrqponmlkjihggfeeddddccddddeeffghhijklmopqstvwyz|~~|{zyxvutsrqpnmllkjihggffeeddddddddeeefgghijkmnoprstvwyz|~~}|zyxwvusrqponnmlkjiihhggffffeeeffffgghiijklmnoprstvwyz|}~}|{yxwvutsrqponmlkjjihhgggffffffffffgghiijklmnopqstuwxz{}~~|{zyxwvutsrqponmlkjjiihhggggfffgggghhiijkklmnpqrstvwxz{}~~}|{yxwvutsrqponmmllkjjiihhhhgggghhhhiijkklmnopqrstvwxz{|~~}|{zyxwvutsrqponnmllkjjjiiihhhhhhhiiijjkllmnopqrstvwxy{|}~}|{zyxwvutsrqpoonmmlkkjjiiiihhhhhiiijjjkllmnopqrstvwxy{|}~~}|{zyxwvutsrqpoonmmllkkjjjjiiiijjjjkkklmmnoopqrstuwxyz{}~~}|{zyxwvuttsrqpponnmlllkkjjjjjjjjjjkkllmmnoopqrstuwxyz{}~}}|{zyxwvutsrrqpoonnmmllkkkkkjjkkkkkllmmnnopqqrstuwxyz{|~~}|{zyxwvuttsrqppoonmmmmlllkkkkkkllllmmnnoppqrstuvwxyz{|}~}|{zyyxwvuttsrqqpoonnmmmlllllllllllmmnnoopqqrstuvwxyz{|}~~}|{{zyxwvvutsrrqppoonnmmmmllllllllmmmnnoopqqrstuvvwyz{|}~~}|{zyxxwvuttsrrqppoonnnmmmmmmmmmmmnnnooppqrrstuvwxyz{|}~~}|{zzyxwvvuttsrrqqppoonnnnmmmmmmnnnnooopqqrrstuvwwyy{z~{wzxvu{~w{s{xnrso}ukhw]nl_uq]empVcvh]jmqoprsqnWYm{n~W\mxo|wxxl}rw}z~ns|^|giplsfyvbvrosooyS}}eUZyurTUkmQ_zff]j]vxnuevrzpo|}pszq~yh{xYry~}q~o`ipqwtuigyr`]^XpZ\hxzdpgji[nqs}rkcbu}y~}{wxny~e}sfxkomchos{kuaqiiWdq]PPZxYobkxwpytx|j|oqz}e|sxxmts}}pzuul~ryqzqq~\fyxnvgnybwcWm}tg[bdo|su\mzyz[\uVoic{g{upmi`x~{tjz~pmklv~`wyhhanay{Lrh_dx|xflvfbvjexzh}xuidwVc~yq}q|}pytctsy]lwm}~ucvmyUweaO`kcIabtHe]tmivOnsKxuhmVayn}aZjxhwoUkc^wl~dgsqeqv|n]eld|ZFj~Zvm\htbboc{nXpcoTbqrtdo_pnlp|[puygn{{l~ztb{ns|ZwpiztnTRNC~k|m|w|u@RWcqojcipn}s`jkzvxo}km~z||dsy]x\jirxf}g{gr[og~jeZ_kftdx}dbiuemudamfO~pnlZi}l[ixfeft]{m}}TrXmmfwNQn~_tmYp[Wi|butfLc\gvjn|skpyql[[sm`qagkrye`|yeey`]o~~kyOy~shSXVpbrb]RH{kvrux_f~lg{xwwdVeifeq|cV~g|{ozoxq~iqġuwphɥTpmylusfPTnjkj[uuw~pajlajep~yh~Vqun>[L5xj}IvuvtՎ_|orltc`kzpzOh`|hd{@lrg~v:auiargthtbjvewk`vexXxjj_}Vqk`dRp<|uzlnl^sgWhr|Y}U~kU\u_^pzUYz_lqy]fsT[_}tkTRceohAjVuwkzozzǙ}glyyrkqlwvrai|kq`cnyp_qy`gVbnexq[V}aT}ywu{}YsioW_\ms||mivwtgvM}ppn{|XhBx^fhqyw^E\RGivbcxkkW_miw9t\s|j~Zouy}v`khap}Ns~|ip~dRYpodk>{tRrnQe~ssw|vasos~Iuyt}~cozlod_R^ep`oego~zko`mwrdixw~yxRtf/|zpwS{vYyewg}IsujUujv`PiXme|Sth[Ytnwm}RiRftd{mkj`Ѓqe_~nf[zzfzSotrv`|zhF}Zu}^qymuaJbvyTr7xypTkeftapnNz^{~{~s~Tj_}_gYhWz~sUsjvLjmkil`Xm~Slk\Pc|i~xkpg\qZnwZgwbuYtjm~~nWotIlp}XI{Ertvas^qi}Jz}_W~iwdfYRy}}kyy{~F^WhmkboG~xJinhxxvi^[uOotvXxWgzqjMqv{lZX}zrNvnctXezwttwk|sjlg|dyoK|_bwmrhatZZlysLoysTuOsxb{|uceg~^pWfjptnn}|qp}qk}ZO_nl^uHVwfuqytwapbtzbi}qzVe{0zx}}Ztdwoxizfh_[|uOi~Yurp}k]u}eX}rzzcxnIj@ywxm]~zrw_vphdm[yg{opu`sd{u`kw}nwh{nrhh^_gs{ngnxiqmqnwiQQgsvznyfvrrzwZ}r{phl`iLPYjn|gy^lsFxo~iqogrbVij~g}uuksbzz}qlhuU}\x`qeolFml|vj}rtrqmtlfzyMnovgrowGvk{bop~~k|n~XzzyiyuiqvzatJswXs|YOtde`cdoctqyq]a~qwwTdqNkzq|o~bhtRiexassnOwRgYpk~x_teibxrp_ssmoqmxgsyjw~why~iq~rg|fqhid|mddnu}amTY|qw~fws^k{kYWlrqi~Wovs^sdM]xoxjuv|\nsaWtu{yxlh{doS~jlfzfvwzyic^z{nz^[man|]x}st{~wpas[{xbtmdvw{uyorrvx{brwuw~foX]Xfvicl}au|yyjkvVw~ylTbv~}tmyfhwguw{wu_tRz\ayY{xdy}\~rntfvmjpumtgrod{_|{xwh_{vts|xevnhpmiz~aurwr|r||mkxt~~cgsxmsh|jkjy~nn}spxyqy|vvvyuzgf]lpi{~tdxcRsawqlgpwy`vybykegpRxm|hp|j}xz~cl|oiwbmqoi|te~yzjk|qcksRnpudyur[yu\qmninr~{|{nykowgbugku{||R|cc}{{ypa{woz{rr|wjzxknj{`nwvnkjq~aywpv{s}uqmk~szvzwskdvu~_ijn|xkgXgftzyf~prxlbc~x~x~}olhutsz~`|}sxoowx}nxfmda~mvw{yor~}o]ztt~{~~|{ZPtavfvsz{inltpspkvsw\uzuwv}k}~_xzwj~sdito|}{k}lpvtmlrxx|q\k}r[~yxvmm}m}gkfu}~yo|s|o|ys}nuzb|v}twYr}R~wwvj~xty}pmsvlu`ej`h|uus}~uqni{rsfy}~vnmrdZmslehu~sr_hvukswqc}x~~{xlnhdhz|rrrs~rr~yrw~nr|`y|b}y}xvzwzoizzy~o{ywUbx{utlisp|d|ri}knqoout{u{ntfzwo||~|xjm|orvasp}qjsau~ufx|wrv|iuywvtxwcw~m{qrgxxzdr|}}~w~ty}wq}koznxvswys|ygun{|{j~trt~kq|~q|{j}`m{mexz{yexxtljxth}vrqsiv{jxtymyynwm_xnccszr|ukrsxwxzz{t|vyrs~umqluvmzs|w|rgzmwuy|xey}q{t~r|s|ipr`~wc{|~ry~|wtrjx||xjqtpympqvkwmx}ux}y|fh{~zvwwvghzhsnxsx~jk}}zmmm~rlq|{}yp~|x{n{l`nu}|m{cv{nwzro}zt}nj}x|ropu{mh~wwruwyq}wowox}|udretivlnl\y~~}}vso}}kw~}tn|~wrmsm}ofr_kwkmm{uw}xnqwzyvrzwv|h}q~|qzqphzfhtxsx~|shyqtnu~w|gry|r}r{wziqx|qixjo~niux{vzg~izoucuwxrxy}tqx{m}z~rvx}}lhfxqowzzl}}srok{ntxy|vpt~{uqhuf~{vzwu}yn{}}`|zg`{qk}|{u~yq|y}w|}_uvv|vutzjxz|s|vnoisltsq~u{uv{q~zr{sp}|~nvu|lb|sUgvisuo~xyr}||yut|{xjv~|t|{nwvzsonjtmy{t|duqvzvurys}z~e{jy|}yz}ztmorp{y~z{gmmx~s|a{y|g~sqmr{{}}jw{pzp{}izryltmv}{gttev|qzv~}~}tl~}xx{jrp}|kvoytwu|i{x|lyr{u||s}|xnm}}x|{~}v|xxzyhz|w|uuxsxs}x{mq~oywzx|s~lu~}sw{vvtyom|~oxyrq{zrtqpsewqwu~|tswm{}{~yuut{sn|q{zvwxr{l~{z}v{lpz{whsz|w}zy|~||~{szxvp{k~zorwt~v|w}rmvosvvwyv}{|||py|x|}x}}owuwsr}~}z{nsvzy|mwvrz|vw|r~qy{w~m{t{tzyzru}v|v{gzzgpl|w{}zz{tm}|x}~xpzqzz||zzox{gy|xnzmpy|zrn}zsxlyn|t}xu}|wut|ocwo{xzo}{ro~pux|~snvolq}{wntxrwnky}~wp{rr|zzwlw{om}n|w~{xxz{}z~}sp|v}wz}vs|qrv||~~zytyupuwutwgyt~sp~vwyov{z}xoorsvy~wov|zk~oun}vyuuly{{nvpokz}sowm~{~sln|nw~ok|nqruvy~uuofzyb{wkux~}tz{wxyypt~|k|{o~tzuzo}typsu|}wv|ywqw~~{uouwfy{uz{~luz{zpx{{q}qm{m}~q|umsr}oojwj~z}lj|tvvp|~}||t|kxw|nqxe{tyxlxns||~rzuwv{|vtzqusxb}sjksnq}youu~|yxttju}{~u~toto~sor|zn|uqoyz}~xy~zpx{ik{vtv}wf}t}|x{{~v{s{xot|~~uz~wjq~}~pjmlz||pcvp}xt|q{o~l`~}ov|zrrr}vlnpsuuz}yywnxqv~sx||x~th~ru]{q}ssu|z}r~vy{yswjv{tu{a~|wv|to|xrzrty}yx{{uksqq}}vreyxt{|tx{~~xy|qw{wsjyxuzxuu~sqxkwmw}{}`ttj~pz~}qpwo}vyz}|shxsytts}ut}|ppri|}lxl{}q~wpzmuyoplz|zw|s|~n{pwz^n{zwzzspsz|mw|uzoz}vy{ph|uwxz}gxvq}}ejkw}~zqvm~yxuwxyzt}}dvuvpv{|sqls}pt~dou}xv~zxzzz}|}o~}{~zxyuvyxvy}me}zsyyxmnrwzs}|x|v{}}xrwiryt~v|~yv{{tu}sazxz~~yswyxtt{om~loi{krt~{z{|rsqysxqjq~uq~swumyxs{z|uup}zxhxlv}}}t{^wxzyi|y~trw}x}}tnu~mz~oxzmvtvwowmfwucxow||~x{r~}~wstp}p|nvp~tksnmy{tny{rysgu}~po}jsqzxn{zz{jx}xjtwnwv{tq}ji}~{{vsorso}pxz}eyp{zwzxiywt{}|}s~y}|u}vwzlm|y{q{ps{lu|y{{~ykuq{|y}{~v{xt}|q{sqwxqzp}ty}{|kwxp~z}v}q|l~v{}z}{~}yupset{{pwm}lvxhr~|||z}fqz{xsv~|s~zsrlytotc|vsxvzoxwxw{r|svu|xpyuzmsm}{xhjxn~~{ywx{y{y|ww|n}q~yqxr{uqf{}qtn}|zxzwwvy||mwyv|xl}u{ztxtxi|xz~xqsut}~vyto}ztp|x}vrwotz{uhu}{u}t~riwxz}v~rwoxi}x{}txxr}uz{voy~{xzzixx}uxy{w}o{m}xpux}t}yvtvo}tuxts|}zo~tqs}{{vz~vzl|xzx{|{y|}nowvrx}t{|~p{u}r~t~y~|ymiw|{zyv}{}{||qk}p}{{{w|mxuzxwxw}z|~{nzv~|xour}uzz|ptx~xs{wizuw~tz}vpyuwu|~xr}|x|zynst}|y{psz|t}upvot{q{m}|}yz}w|t}~z{tvxy{{~~yv{y}uurvxyux}|viy|~~wx~lru}|tz{z}y~z~xo~pus{w|u{}}xe{|mx~~||zm|w}yn{yw~|t{||ps{v~x~wxv~yvq}i~~{xo{ps|{qwqt|{ww~tuosx|u|y{s{}rruxvvytwr{|s{~uus|~ywnyznuzw}|z{ws~y}}~}yxj~}|yz~u}s|yyz{wsxxrqv~ulz|qyz}u~y{}vyvro}ry|}vww{xw~y||}yyyu~vx{{zs{|ts{}qzu{qu{y{wz}w~xuwz~}}{|~myw{~xvyxm~}uzymu}|wxxoww}}zxx}t~z{v||t{t|{x{zi~zq|q{xtw{xrj~~|{~{w|x{}{{tys{wz{}s}pyru}x~pi{}pw{w|s}}r{}x|}z}r~u}x~vl~}x{w{z|tqs~t{~r~~~wzvy~~yx~wtuwz}svwfxxtt{y||{}{ztux}t|xtz}}~}zux|}{}w~~{ts{vw~v~w}~s|ymzrvuxywwxvz|z{}{{sy~{wvx}t|z}|ux{}}ssv}~}u}zwzq{zvx|}ywt{~yxx~|{uz}ps|{{{|w|uzxrv}z|tn|s{s~xs}zzrlwzs{yzxy|o}v~zz|zv|{{xx{}z|t~||}|sx{p}xwxp~|xkq~z}wy~y}}~~yzwp}s{ozw~wyswq|y{yyx~z{|viy~~}~}|}{}zu|xwzt{|tv~r~}zwwwwz{~||}{~~}~{~r{{v{vpxrs}}zsz}zzqxyt}v}yv}{x}z}~z|xv}wx~z~~{wxouz~u{tv|xzyyx|xy|||x}x}usx~urw}zrw{|y{~|w{{vsxxx||w{u|u|wxzvz{xy}wy}x}|yxx}|w{||~~sw~y}x{}w~z~ot{suv}y|}v}{x}{~svyw}}zvy~yy{}~wtxzw{}yv}ys}{}||x|z~u|~~t~w|{wtuw{xzrx|~~|wtx{xy~}x|}z{vuwzy|{u~~y~~or|vxv|yrv|yw}~zx~~~}|yxx|~~{z~uw}}{{yqx{t}{s~w|twu|{}}}|{z}x~zy|{}x}wzr|}{oq{}}r}y{t{uxzwywwyyu}~~~uz~}{pq}}||w{}vn|}||usz{z~~{xwyz}~z|w|uous{}}x~w~}}v}|qso~{~~{wy}zxuzy{{xxuyyy{x~|yvzyvyuz|~z{~w}}y{{xz}wsvw~|x~~}ut}zxw{~y~px|~~z~qy{vy|~||yszyy|z{||zzw|tu}~v{{w{~}vwxz||{|vvlz|||yw}wxvszs|xxzt~y~zw{s~{pxxz}uz~~~|qz{|}~xz}{~xy}}|uyp{{r{||{wv|~|}~|{xx~{y}xsx~uvu{z{|~wsx~|||y~tqz{up}{{|rx|x|{wp{s~~~w}~vy{}|yv{y}{z|z~~{z}wv~}{~~{~q{~~w~t~~z}}}~uuux~wx~~{z}~uv}~|}{yy}}s{s}|zx~~~~{tv}zw~~~|~ou~~svpu{y|zvutu~|}{up|~~t{|||{{~zt|y|||yyx|~}}yo}x{~xt~{|~||v}{x{zyyz{yw|wx}}v}|{}~ypur~~}t}yxv}|~wyyv}|xzzsw}w|u~}|}~|||~}wy~}zxk|||}uvwz~|uwvuy|w~}}vrx~~z|}~}~}z~ox~}z}uyy||~vo{xz||}sw|v{x~}~x~qzzx~}}~w|}u{|y}||zyv~|u}}uy~z{~x{w{{w~}{~s}}}wzyvzw}z|~uww{y{uxv~~}|{y{xz~{wxsy|vwz~v|z||}}{|vx}|~~}zy}~{w~wzy~z~y~z~}xumy}~z||nuzyv~~xyx~}~{|{x}{y|}|{~z}y|ww~ywwntvyy~y}w|~xy|v~yy~zu{}u|{~{~qy}yz{y~xy}}{}xz~}z~z~yx|zy}|y{{{zy{~||~u{xu~x}y|~~~vz{|{{x~}xx{xx{u~zs|upsu|{}~w~y{~|u{v~~{||~wvzuxst|outpzv}{|~yz{x}}|~z}vv{~~}x{}}|yrr~~~{uwxv}v{~~}||z{z|v~|}~wyr~z~||zz~y~|}{z{y~}|~xx}|yzwxx~~{ovqy{}}~|{z|{|vzx||v{w}}}zzxtxyzztnxv{~~|v}{y}~}y}y}|y}|{yz~yv~}}}|{|vx{|~}z~ss{zy|{x~|}|x}z{w}~~}}|~}x}tz~w}}{rs|~~yuz~ypv|o}~q{{~~zz|}z~~xz~swv|}{y~}}w}v|v|}|~}xvtqx~|wz|~~yz~}~|x|wzv}{~w}v~}~}v{szx}||~zu~u}~}zx|~{{xvrtz~~x}{}}}{rxw}y}}vx}{}~{~{u|{zszs{z~{|t}x}~~}w|zy}z}~y|y{~vy|wv}|s{vzx~{~yzxw|~x~{xuxy}~}}yv{z}|{{~~xxxs|x}}}}z}wxy~}wxs}z~xux}zy}yy}z}xws}~|txv|{~vz~~~yxs~wz~|~yy|{}~}{~~|}ywvy{{~~~|sz}|x|yx~xt|z{zyxzy|}~}szw{w}||w||y}~z{|x~{~s{s{z||xtxxy|r}v||~||}{v{|}~|z~{~z{wyxz||w|~v~x~~}}|~r|v|ws~~}u}x~{~xy}~{{{vzy}|uz|yw{~|~{x~}xw}~u}y~xyvx|~zzyow{~y~zxzu~x}}{}zws}u}yszv}~}yy|u{|}}}{|yz~~~}}y|w|zy~|}~|zwx~{}~}v}|}xw{|||~||~{xy}~}x~}~~|zyu}v~~{{|{~|{}|}{zyv|uy|z}y{uz{{vutz~}~~{}vz{~z~z|~|{v~u}{~~y{{||}}}y~tzyz|vw|yyxyx|{y}~z{|v|y}y~}{|}~}}t|}~|}{w{x}v~yxx}zz{~}}zy{ypyx}}x~|z||{}~{w}~yvv|~{}wvzxyx|~}y}zx{~{~zz}{}|~{{z{{v}u}y{~|}tvx}|}{wwwu}~}zy{x|~yx~zvw|~~}szyyuur{w|}|zx~|}~zy~}}}~~w{|z||~}w{{}~{ux~~|ww}{~}{~}~{}zy}{w~x|~~z{{{{}~}}}}~|uy{|~x}z|~xt}z|~}}wwsvyx|}z~z}|{|{}|~~{{}u{{y|vyy}|zrxvu~x}z|}}w}~z}~~z{z{||z|}|wzw{~y~wz}z||{{z}}z|w~||}}{~x~|~z|}}zz{|}z|||||{xy}z|}|~~}~{~}tuy}|x|zw{zy~xz||s|~vy}}}{z{|tyv}~z{qtrw{~||~v~~|x}||x~{y~}}|{ww|~|}y~~{zw}zyzz{~~~{~zvyw{{{{}{|||y{}~}}zyv~}zz{}~~{yyywyrxuz|z{{yy|{{{}{}~|~~|u{{x{~}wuzy|}}v}}x}y{{z||}~|}v~~|}~~x}|vz{z|~}~||{|zw|}{{}|w~{~~u~}~~{{~||~u}zw||wu~zz}||t~x|{zu{~{{}}z}|~}|}|}|~z~~z{|||~~~zw{v{}~v~uxuz|{|}{}~~}~}~~{}zx}y|}{x|~|~x{~|w{yzz{~|{{qy{}}}|~~z}~~~ywuy||{z~~}uu}}z|z{w}{|{yz~~w~|y~zx}{x}}{}}~z{w}{~{{}~}|}~zzyy{z{z}~zyx|x{|}}|}|{~zz{{}zz~|~}z|||xz|tz{}xzy~}z{y}~x}w{z~|{}~~|wz~x}x{{|z{xz}~}|~}y}}yzy~{|{~}||~{~{}z}{{yz~}||w~|}}{~{~{yv}|u|v}}~~xuz~|}~~~|}{}||~z{|~zy{v~~}~x{x|}|}{}y|{||z{|z}z~{~y{{|{zx{{~|w~}~|{{}~|~~vz~{}{~~}y}zyyzz}|~~~yvu~~|~~~|{||u~|z}z|~~zw~wzy}}~{}~|yy~xx|{x~}||~~|zy}wy{~{|~{~|~y|zy}|~{wz~~}{}{}{x|}}~|v}{|{{x~~{|zz{}{x}z}}}~~|{{}~~z{|z}~~}|z{x|{y{|}}|{w}x{{~y{{|{z||{~|~~||{y}~~z|~}}|}|{~||}~||}~~xz|{z~{{z|vz|{{{~z~{zyy}}||~}~|}~y}yz}~|zz|~|~{}|{{}|~{w{{~y{xv~|~~|z~z{}}yv~}|y}{~z|}}z}}z|z{~~{y|{zw|}}~yzx|{~{~}|wz|y|}~}zww|~~|||~{z~}~~z~yzyzzy~{{~{wvv~|z~}{}}~~||}~{|y~{}||y{}z|{|||||y~}}~{}}}}~x~}xy{}}||}|}}}|||}~}}{|~~~|}z}x~~{{~~{}{}t{{yy~~}~}{}~{||}}||~{{}zy}{~x~{zw}z}z}yy~y|~}|~~~z}|~y}y~{{}|t}~~|~{~~z~{}{|}~}{~|~}|{~}}|~v||~~~z|{zyz|~|~~}|~||ywy}~~~~{}~~zz}}~|}z}z}|~{}~~yy}~~~v~{{~www||}}||~~~~}|~y{~z}}||~y}}~|}}|{zyyz~vy|}}~}z}}}}z~|~|~~|{zz~|}}~zz~xz}||}}|~||~~~yz}}{{~~z}|{~z|z~~}~}~~}{{{}~||}z|~~|}yz~|z~||~~}~{}{x~~~}{}y}||{z}~}{{|~~{}x{~~|~}x~}~{z||}{|~}y{~~~~}|yz{{||}~|{~{w~~|~|~}}{||~}~~~y||~~}}|}~|y}z|}~{~~zyz{|~~~}z~y}z}}y}~|~}~||~}}}}z{{~z~|xuz|z{}~||~~x}|}}{~}~}}~~}z{{~~~w~{|~{~z{}}~~|~{~~}z~{z}}~}~~}~~|{z{~~~{{~~}|}}{|~{~{{|x~|z|}|}z}~~~||~}~|{|z~~y|x{}||~{}z~z||}{z~~~~{~~}}~}~y~}|}}~~{~|~}y~{|}~}|}}||}y~}{~}~~~|~~}|}}z||~}z}zx~}~}y~}~{yz|{~~~{|y{|||}~}~~}~z|~}~}zy{}~~z{}y}}z|~~{~|}y{~|}}~}}|}|}z{}|~|~}|~}~|z~~|}|{~xzzz|}~~}~}zz{{~}}~{~{{|~~|}|}z}|w{~|}z}{~~z{{{}}~~~~~|||~{}~|{~|z|}~x~}~}~~~||~||~||}}{|~}|{|||}~{}~{z}~{x}~||~~~}}~}{{~}}y~~|||~~}|~}}||}~}~{|}y{||~}|~}}~{z|}|~}}{}~}~|}}~}~|||}}}z}~}||~~|x{{}{}||}z|}|{}|}|}z}~}~y}|~}}{}}{||~{}}|}{{z~}~|~}yz~~}|z|~|~~}}|||{}~~yz|}{}|~~z}{~}~{}~~{|{~~}}~z|~}z|~}{~~~{~~~~y{~{~~|~~~~~~|{{z}}~}~|{}}{{|}}|~~~|{}~~~||{~~}|}~y~}}}~}~~~{z}~|~|~}}x}~}~}~{~~}~~|{~}|~|~~~|{}|z}{}|~}}~}z}}}~|~~{{~|}~~}~~}{{}~}~}z}~{~~|}{{|z~}~||{|{}}}~}~~|~~~}}||x|~}~{}{}~~}~~}|~~{x}~}~~|~~}y|~}||~~}~z~~{{~|~}}~|}y|~}}}~}~~{|}z~~~|}}}}~}}|~~|~}~}~}{|~||~z~}~||{}~|z~}~|~~~|~}}}}~}|~~{z{y~~}~~{}~|~}}~~}~{~||}~~||~}}~~~||{||}}}|~~}~{{~{~|~~~|~z|~~~~~~}}{|||~|~~}}|z|}~~|{~}|~|}||{~~~}~~}|{~||~|||y}}}}~}~}}|}}~~~~|}~~}}~y{}~~|~}{}~~~~~}~|{{~~}~|~~~{|~}||~|}}{}~z{}~{}~~}yz~~}~~}~~}}~}{~{}{}}{|~}~}|{|~{|~~~}~~}~|~}~|}}~}{}|}~~~}|{}{z~||~|~}|~~~{~}}~|}~~~}~~|z||~~{~~~}|}~z~~}~~}~}~~~~}~}{}~~~}~~~~~{}~|~~~~~z|~~|~~{~~~|}}}}}|~}}~~}|{}}~~~~|{z~||}~~|}}|}~~|~}~~~}~}}~z~{~~~~|}|{~~~~~~~~{}|~~z~~|}~|~~}}~}}{}{y}|}}}|}}~}}~}~~~~}||~|~{}~~{{{}}~~|~~}|~|~}}~}~}}~}}~|~|~}|~|}~}~~}z~{}}||~~~~|}~}}~|~}|~}|~~~}|}}|{{}}|}|~}~}~~~~}}~}|~|~}~}}~~}}z~}|~}}~~}~}||~|}|~~|}}~}~}{~|~~~~}~{}|||}~~|~}}~~}~{~~~|~}{~~|~~~}}~z}}~~}}~|}}}}}|}|}~~~}|}}~~z}}~}}}~~}}~~~~~}~}|}~|}~~~}}z|~}}~}~~~|}}}~~~~~~~}~}~~~}|~{|~}z~~~}}~}~~}~|}~~}}~~}}~|~}}}{}~~~~~~~~|{|}~|~}}}}}~}}}}~~}~}|}}}~~~|{~~|}~}|}}~|~~{|}~~~}~}~~~~~{}~}}~~}}|~}~|~}}~|~}~{~~}}}}~~~|~~||~~~~~~~~||~~}}|~~~}}}}~~}~~~}}z|~~~~}~~~}~~~~|~~~}}}~}}~~|~|}}}~~~}}}}~}~~~~}~}}}~}~~}|~~{~{}~~~~~|~~}~|}~~}~~|}~}}~}}}~~~}~~~~{}}~~}~~~|~~~}}}~~~}||~~~~{|}}}~}~}|~~}}~}~}}~}|~}~~~~}}}~}~~~~~}}}}}~}~~~~}~}~}~}{~}|~|~}~}~{~~~~}~|~~}}}}~}~~||~~~~~~}~~{~~~~~~~~}}~~~}~~}~}~}}~}|}}~~}~~}~~}~}~}~~~~~~~~~}}}{~z~~|~~~}~~|}}~~~~}~~}~}}~}}~}~}~}~~}|}}}}~~~}}}~~~|~}|~~~~}}~~~}~~}|}}||~~~}~~|~~~~~~|}~~}~~~~}}~~}}~}~~~~}}~|}~~}}}}~~|}~~}~}~}~~}~~}~}~}~|}~}~~|}~~}~~~~~~|~|}~~~||~~}~}}}}}~~}~}~~~~}~~~~~~~~~~~~~|~{|~}}~}~}~~}}~~~~}~}}~}~~}~~~~~|~~~~~~~~~~}}~~~|~~~~~|}~}~}~}~~}~}|~~~~~}}~}}~|~~}~~}~~~~}}~}~~}}~~|~~~}~}}~~~}~~~|~}~~~~~~}}~}~}|{~~~~~}~~~~~}~~}}}~~}}|~}~~~~}}}~~~}}~~~~~}}~~}~~~~~~|~|}~}~~~~~~~~~~~~}~~~~~~~}}}|~~~~}~~}~~~~~~}~~~~~~|~}~~~~~~}~}~}~~|~}~~~}}}~~~~~~~~~~~}~~~~~|~}}}~}~~~~|~~~~~}~}}~~}~~}~~~~~~}~~|~~~~~~~~~~~~~}}~~~}}~~~~~}~}~~~~~~~}}~}|~~~}~}~~}~~~}~~~~~~~~}~~~~~~~}}}~}~}~~~}~~~~~~~~~~~}|}}~}~}~}~}~~~~~}~~~~~}~~~~~~~~~~}~~~}|}~}~~}~~}}~~~~~~~~}~~~~~~}~~~~~~|}~~~~~~}~~~}~~}~}}}~~~~~~~~~~~~~~~~}}}|~~~~}~~}~~~}~~~~~~~~~~~~}~}~~~~~}~~~~~~~~~~}}~~~~~~~~}}~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~|~}~}~~~~}~~~~~~}}~~~~~}~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m54.bin b/applications/SprPoP/assets/packed/MUS/m54.bin deleted file mode 100644 index 5d9b1ae..0000000 --- a/applications/SprPoP/assets/packed/MUS/m54.bin +++ /dev/null @@ -1 +0,0 @@ -~}||{{zzzzyyzyxxxvuusqpoptz~||}~}{ywutsrssstvwxz|}~~|{ywusrpomlkkkkkmrv{|o|{emx|zxvtsrqrstuwz}wqz|z{~}{yxwwvvvwxyz|}uhfttjfegiknqsuvwxxxxxwuuuuuuvvwxy{|}~~~}}}}}~~}xrps}}|||}~~~~~~~tlffmzwqligeeeeeeffgghhiijjklmnoprstvwxz{{|}~~~}{wtpoqv}~~~~~~~~xrmhffjq{~yuqnljhggffffffgghijjlmnoprstuvxyz{{|}}~~~|zwtqpoqv}~~~}xrmhffipz|wspnkjihgfffffgghiijklnopqrtuvwxyz{||}}~~~}{yvsqooqv{|wqlhffiox~zvrpolkjihhgggghhijjklmnpqrstvwxyzz{||}~~~~|{xvsqooqu{~zupkhffiow~zvspnlkjihhhhhhiijjklmnoqrstuvwxyz{||}}~~~}|zxvsqooqtz~ytokhffinv|xurpnlkjiiihhiiijkklmnoprstuvwxyz{{|}}~~~~~}{ywuspooqty}xtokhffinu~{xvsqonlkkjjjjjjkklmnopqrstuvwxyyz{||}}~~~~~}|{ywusqooqtx~~zvrnjgffint|~{xusqonmlkkkkkkkllmnopqrstuvwwxyz{{|}}}~~~~~~}|zywurqoopsx}}yuqmjgffims{}zwusqonmllkkkkllmmnopqrstuvvwxyz{{||}}}~~~~~~~}|{zxvtrpoopsw}|yuqmjgffhmsz}{xvtrqponmmmmmmnnoppqrstuvvwxyzz{||}}}~~~~~~}}|{yxvtrpoopsw|}zwspligffhlry|zwutrqponnnnnnnoopqqrstuvvwxyzz{{||}}}~~~~}}|{zywvtrpoopsv{}yvsoligffhlrx~|ywutrqppoooooooppqrrstuvvwxyyz{{||}}}}}}}}||{zxwusrpooprvz|yuroligffhlqw|zxvutsrqqppppqqqrssttuvwwxyyz{{|||}}}}}}||{zyxwusrpooprvz}zwtqnkhgffhlqw}~|zxvutsrrqqqqqrrrsttuuvwwxyyz{{|||}}}}}}||{zyxvusqpoopruy~~|yvspmkhgffhkpv}}{yxvuttsrrrrrrrssttuvvwxxyyz{{{||||}||||{{zywvtsqpoopruy}}{xvspmjhgffhkou{~|zyxwvutttttttttuuvvwwxyyzz{{{|||||||||{zyxwvtsqpooprux}~{ywtqoljhgffhkot{~|zyxwvvuuttttuuuvvwwxxyyzz{{{||||||||{{zyxwvtsqpooprtx|}{xvsqnljhgffhkotz}|zyxwwvvuuuuuuvvwwwxxyyzz{{{|||||||{{zzyxvutrqpooprtw{~|zxuspnlihfffhknsy~}|zyyxxwwwwwwwwwxxyyyzz{{{{|||||||{{zyywvutrqppoprtw{~|zxvtromkigffghknsx~~}|{zyxxxwwwwwxxxxyyzzz{{{{||||||{{{zyxwvutrqpppprtwz~}{zxusqomkigffghjnrw}~}|{zyyyxxxxxxxyyyyzzz{{{|||||||{{zzyxwvusrqpppprtvz~~|{ywusqoljigffghjnrw|~}|{{zzzyyyyyzzzzz{{{{|||||||{{{zzyxwvusrqpppprtvy}~|{ywutrpnljhgffghjmrv|~}||{{zzzzzzzzz{{{{{||||||||{{{zyyxwvusrqppppqsvy|~}{zxwusqomkjhgffghjmqv{~}}||{{{{zz{{{{{{{{||||||||{{zzyxxwutsrqpppprsvy|~}|{yxvtsqomkjhgffghjmquz~~}}|||||||||||||||||||||{{zzyxwvutsrqppppqsux|~}{yxvusqpnlkihgffghjmpuy~~~}}|||||||||||||||||||{{zzyxwvutsrqppppqsux{~~}|{zywvtsqonljihgffghjmpty~~~}}}}}}||||||||||||||{{zzyxwvutsrqqppqrsux{~~}||{yxwutrqomljihgffghjlptx}~~~~}}}}}}}}}}}||||{{zzyxwvutsrqqppqrsuwz}~}}|{zywvtsqpnmkjhggffghjlpsx|~~~~~}}}}}}}}}|||{{zzyxwvutsrqqppqrsuwz}~~~}|{{zyxvutrqonlkjhggffghjlosw{~~~~~~~}}}}}|||{{zzyxwvutsrqqqpqrsuwz}~~~}||{zyxwvusrqonlkihggffghjlorv{~~~~~}}}}||{{zzyxwvutsrrqqqqrsuwy|~~~}||{zzyxwutrqpnmljihggffghjlorvz~~~~}}}||{{zzyxwvutsrrqqqqrsuwy|~~~}}}|{{zyxwwutsrqonmkjihggffghjlorvz~~~~~}}}|{{zzyxwvutssrqqqqrsuvy{~~~~}}}||{zzyxwvutsrponlkjihggffghilnquy}~~~}}||{zzyxwvutssrqqqqrstvy{~~~~}}}||{{zyxxwvutrqpnmlkjihgfffghjlnquy}~~}}||{zzyxwvuttsrqqqqrstvx{}~~~}}||{{zzyxwwvutsrponmlkihhgfffghjlnqtx|~~}}||{{zyxwvuutsrrqqqrstvx{}~~}}|||{zzyyxwvutsrqponmljihhgfffghiknqtx{~~}}|{{zyxwvvutsrrqqrrstvxz}~~~}}||{{zyyxwwvutsrqonmlkjihggffgghjknqtw{~~}}|{{zyxwwvutsrrrqrrstvxz|~~~}}||{{zyyxwwvutsrqponmlkjihggffgghiknpswz~~~}||{zyxxwvutssrrrrrstvxz|~~}{zxwvsrqnlkigedbbbbdgjmopppprty|ywwry~}{zyxxxxyzz{|||||||||}~}zxwvutttuuuuuuutsrqonmkjjklnprsne^fvj]bgnsx|~|~}{zxwutsrrrrrrstuwyz|~~~}xwxyyzz{{{zzzzzyyyyyyxxxwvutsrqpnmmlkjigeb``dkqtssrsux{yuy~wtqpppppppppppoonoooopqrstuwy{}~~}{yupke_[[_hqy{zvspooprux{~}||~~}}}||||||}}~~{{|yvtrqqpppppppppqqqqqqqqppoonnmlkihfdcbbeinsvxxyz{}zwvx~{wtrponmllkkkkkllmnopqrtvxz|}~}{yvsoje`]\^dlt{~}{ywwwwxz|~~||}~~~}}}}}}~~~{z{}zwusrqqpppoopppppppppppooonnmlkjihfdccdglquxz{|}~|xvvz}yvtrponmmlllllmmnopqrtuwy{|~~}{yvsplgc`^_bhpx}}|{z{{|}}||~~~~~~~~~~{yy{|yvtsrqpppoooooopppppoooonnmmlkjihfeeegjnsx{}~}ywvw{|xvtrponnmmmmnnoopqrtuwxz{}~~~~}|{yvtqmieb`_aelsz~~~~|||~~~{xwx{~{xvtsrqqpppppppppppppooonnmmlkjihgffgjmqvz}~{xvvx}~{xvtrqpooooooopqrstuvxyz|}~~}}}~}|{ywurokhebaadiov|~}||}~{ywwx{|zxvusrrqqppppppppppoooonnnmlkjjihghilotx||yvvvy}}zxvtsrqpppppqrrstuvwyz{|}~~~}}||}~~~}|zywurpmjgdcbdglry~}|||}}{xxxz}~}{zxwvuttrrqpoomlljihgfeffhjmpstwxz}~|mm}klx~|zyyyyzz{{{{zyxwvvuttuvwy{~~zuz}~}|zyyyzz{||}}}}}|{zyxwvvvvvwwvnc[fsd]enx|xv{~~}}~~ulmyxstx~~|zxwvutsssssrrrqqppoonnnnmlkhfcdhntvwwxz}zqmpy|z{}}{yxvtsrqqppqqqqrrsttuvwxxyyyywvutuy~}xqib]\_gpvzzxxxxyz{||||{{{{{||}}~~|zxwwz}|vqmmpv}}{ywusrpoonnnnnnnnnnoooooonnmlkjhfefhlquxz|}ztpnpu|~|zxvtrqpooooooppqrsstuvwxxyyyyxwuuuwz~zuoid_]_dksy}~~~}}||{{{{|||}~~~}{yxwx{}xrnlmqx}{ywutrqppooooooooooooooooonmlkjhgghkosx{}~|vroorw~}{ywutsrqqqqqqqrsstuuvwxxyyyyxwvuuux{}yupkfb__bgov|~~}}}}}}}}~~~}|zxwxy||xsomlnsy~|zxvutsrqpppppppppppppppponnmkjihhjmqvz}|xspopty}|zxwuttssrrrssstuuvvwxxyyyyxwvvuuvy||yvqmhda`aekry~~~~~~~~~~~}|{yxxxz}|xtqnlmpu{~|{ywvutsrrrqqqqqqqqqqqqppoonmljjijlptx|}yuqooqu{~}{yxwvuttttttuuuvvwwxxyyyyxxwvuuuwz}|zvsokgdbbdhnu{~}|{zyxxy{~}yvromlnqw}~|zywvuttssrrrrrrrrqqqqqpponmlkkklorvz}~zvspopsw}~|{yxwwvvvuuvvvvwwxxxyyyyxxwvvuuvx{~~|yvsplifdcdfkqw}~~~}|||||zwspnoqw}}{{zxxyyz|~~uhbuzf^cjptx|}|ysrsuwz~|{zzyyxwwvuutssstuvy{xou{jknswz~~|xrnotwsmhffhlqv||sq{}rllmqtx|~zwvw{~~{vsqqtw|{vohcfoz|umgddehlpsvxz|}~~|{|~}zxwxz~zuolknvzurpprsuwxyz{{{{{|||}}}~~~~~~~~~~~}|{zxurpooqtuusqonnqty}}xtqpty}ywuuvwxyzz{{{{|||}}~~~~|zxvuvwz|}|zxvvxz~}zvrmieegltz~zvrpoooqrtuvwxyz{}~~{zz{}~{zyz||ytpmkmry|ywvuvvwxxxyyyyzzz{{{||||}}}}}|||{zxwtrpnnoqtuutsrqrtw{{vsqqu{|zxxxxyyzzzzz{{{{||}}}~~~~}{zxvttuwz|}|{yyyz||xtplhffiov|}zwtsrrstuvwxyyz{|}~}{yxxz|~}|||~}yvrnllot{|zxxwwxxxxxyyyyyzzzz{{{{{{{{{{{zyxvtrpnmnoqtvvvuttuwy}|xtrqsw}}{zzzzzzzzzzz{{{{|||}}}}}~~~~~}}|{ywutssuwz|}}|{{{|~|yvrnjhghlrx~}{xwvuuvvwxxyz{{|}~}zywwxz}~~~~zwspnmnqv}}{zyyyyxxxxxyyyyyyzzzzzzzzzzzyxwvtsqonmnpsuwxxxwwxz|}yvsqrty~}|{{{zzzzzzz{{{{{||||}}}}}}||{zywvtsssuy}~}|{{yxwusqomkihhjnsz~|zyxxwwwwxyz{{|}}~~}}~~~trxgmt{}x|}tonorv||yxwwwwxxyyyyyyyzz{|~xnn}{lfefhiknpsuwwxxxyz|}{xvutuw{wpq{{tollkkkjjjjkmprtvwxxyz{}~|yvtqooprv|~xqnov~xurqppppoonnmmmoqsvxz{|||}~|zxwwxz~~xsnkkow~yuronmlllllllkkjjjijkloqsuwwxxyyz{||}~~{umijnt{~zwtqpnnmmmmnnopqqrrplijqxwrpsw{~}{yxx{{|tt~~|zyxwvtsrqpoooopqstvvtpkoxytqrtvxyz|snxtc`ciqz}ywvutssttttttttttttuuvvwwvtpmkntwurqsx~xj_^gsvtsv|{yvtrqppppppqrsstuuuvvvvvwwwvutqnjghlt{~uleadn{|xutsrqponnnnnnooppqrrstttuuuuuutsrqonnopsvz~}zvuvy~|ywusrqppoonnnnooppqqrssstttssrrrsuwz|}|zxvuvz}zqkghlsy|}|zywvuutsrrqqqqqqqrrrrrqqqqqsux{~}{ywussux}wpidbchow|~}{zyxwvuttsrrqqppoooprtwz}~~~}}|{zywuttvy}ysnhdbdipw}}|zyxvusrqpoopqtvy{}}}}}||||||||||{zywvvwz~~}{{{}~yuokgefjpw~}zxwussstuxy{||{{{{{{{{|||}}}}~}}|{zywvwy|}{yxwwy|{wrmiggjpv}~|{z{|}}~}}|{zzzyyzzz{{||}}~~~~~}{zwutssuwxyyxwwx{}ytojggimsy}|{zzyyyzz{{{||}}~~~~~~~}{ywuqnkjikosx}}ysnifeglt}~}|{{{{{{{{|||}}}}}}||{yxvtqnljhikou{|xspmlmotz~}}|||||||||{{{zyxwvtsqpoopqsuwxyz|~~~~~~|yurppsx~~~}||{{zyyxwutsrpppqsux{}~~}|ywuttvx{}~~~~~~~~~}xtpnoqv|~}|zywvusrqpopqsvy|~|zwurpooprux{}~~~|xtqooqu{}{xvtrqppprtvy|~~|{yxvusqpnmmoqtx{}|xuqooqtz}zwutsstvxz|~~}|{zyxwvvutsrqponnoqtx{~}yurpoprw|}|{{|}~~}{zyyxwwwvvvuuutssrpooooqtwz}|xtqnllnqvz~}{zyxwwwvvvvvvvvvvuutsrqpooopruy|~~zuqligghlrx}{zyxwwwvvvvvvvvwwwvvvutsrqponopsw{}yuqmjhgimry~|{zyxxwwwwwwwwwwwwwvvvuttsrqqqrsux{~}zxvtsrqqrtx|}|{zyyxxxwwwwwwwvvvvvvvvvvvwvvvuuvxz}}zxusrrtw|~}|{zyyxxwwwwvvvvwwxyyzz{zzyxwvuuuwy||xuronnpsx}~}|{zyxxwwwwxyyz{|||||{{zyxwvuutuvx{~|yuromllnqv{}|{zzzzzz{|||}}}|||{{{zzyxwvuutuvwz|}zwtqnmllnquz~~~~~~~~}}}|||||{{{{zzyyxwvuttttvwz|~~{yvtqomllmptx}~~}}||||||{{{{zzyxwvutsrqqrtvx{}~}{yvtqomllmorw|~}}}||||{{{{zzyxwvutsqpoooprux|~{ywtqomlklorw|~}}}||{{{zzyyxwvutsrqpoopqsvz~}{yvtrpnmnoquy~~}}|{{zzyxxwvvutttsssttuvwy{}}{zxvtsqppqrux}~}|{zzyxwwvvvvvwwxyyyyyyxxxxy{}~|{xvtrqppqtw{~|{zyyxxxxxyzz{|}}}||{zyxwvvvwxz}}zxvtrpppqsvy~~}|{zzz{{|}~~~~~~}|{zyxwvutttuwy{}~|zxvtrpooprtx|~~}|{zzyxwvuttstuvxz}}{ywusqponoprvy}~~}||{{zyyxwvuutssstuwy|~~}{ywtrpommmnpsw{~~}||{{zzyyxxwvuutssstuwy{}}{ywusqomlklmorvz~~}}||{{zzyyxxwvuttssstuwy|~}|zxvtrpnmllmnquy}~}}|||{{zzyyxwwvuutttuuwxz}~}|zywvtsrqpppqrtwz~~~}|||{{zzyyyxxwwwvvvvvwyz|~~~}|{zyyxvutssrrstvy|~~}}||{{{{{zzzyyxxwwvvvwxy{}~~}|zywutsrqrsuwz~~~}}}}}}|||{{zyyxwvvvvvwyz|~}|zxvusrqppqsuy|~~~}}||{zzyxwwvvuuvwxy{}~|{ywutrqpopprtw{~~~}}|{{zyyxwvvuuuuvwxz{}~}{yxvtsqpooopqsvz}~}}||{{zyxxwvuuttttuwxz|~~}{zywvtsqpooooqsux|~}}|{{zyxxwvuttssstuvx{}~}|{zxwutrqpooooprux|~~}||{zyyxwvvutttttuwxz}~}|{yxwutrqpooopqsvx|~}||{zzyxxwwwvvvvvwxyz|~~}|{zyxwvtsrqppppqsux{~~~}||{{{zzzzyyyyxxxxyyz|}~}}|{zyxwutsrqpppqstwz}~~~}}}}}|||{{zzyyxxxyz{|~~~}|{zyxwvtsrqpppqrtvy|~~}}|{zzyxxxxxyz{}~~}}|zyxwutsrqppppqsuwz}~~}|{zzyxxwwwwxyz|}~}|{zyxvutrqppoooprtvy|~}||{zyyxwwwwwwxz{}~~}}|{zxwvtsrqponnooqsux{~~~}|{{zyxxwwvvwwxyz|~~~}|{zyxwutsqpoonnnoprux{~~}}|{{zyxxwwvvwwxyz|~~}|{zyxwvusrqpoonnopqsvx|~}}|{{zyyxwwwwwwxy{|~~}}|{zyxwvutsrqpppppqstwy|~~}||{zzyyxxwwxxyy{|}~}}|{{zyxwwvutssrrqqqrsuvy{~~}}||{zzyyxxxxxxyz{}~~~}}||{{zzyxwvvutsrrrrrstvxz}~~}||{zyyxxxwxxyz{|~~~~}}|{{zyxwvutsrrqqqrsuwy|~}||{zyyxxwwwxxyz{}~~}}|{zyxwvutsrqqqqqrtvx{}~}|{{zyyxwwwwwxxy{|}~}}|{zyxwutsrrqpppqrsuwz|~}|{{zyxxwwwvwwxyz{}~}|{zyxwvvvwxyz{|}~~zvty|wwxz{|}~~~~~~~~~~|zyxvvuuvwz}~yvpyqdqsvvxxyz|}~~}~~~zuvyxyz{|}}}}}}}~~~~~}}}}}rjo|jdeikmprtwy{}}zvtv}}{zz{{|}}~|rjhq~zogdcdfiknqtwy|~|zwuuw}~}||}}~zslhjr{}vojgffgiknpsvy{~~|{ywvvy}~~~ztojhkqy}xrnkihhikmprtwz|~~|{ywwy|~~~~~ysnjikpw~|wrnljjjkmoqsvxz|~}{yxwy{~~~~~~ytokijnu|~zuqnlkkkmnpsuwy{}~|zxwxz~~~~~~ytokiimtz|wspnlllmnprtwy{}~|zxwwy}~~}ytokiilrx~~zvrpnmmnoqruwy{}~|zxwwy|~yupliikpw}|xurpooopqsuwy{}~}|zxwwx{~}zupljijou|{xusqqqqrsuwxz|}}|zywwxz}~zvqmjiknt{~zwtsrqrrsuvxy{|~}|zywwxz}~zvroljknsz}ywusrrsstvwyz|}~}|{yxwxy|~{wspmkknry{yvtsssttuwxz{|}~}|{yxwxy{|xtqnlkmrw}}zxvutttuvwxyz|}~~|{zxwwxz}|xuqnlkmpv{|zxvuutuvwxyz{|}~~|{zxwwxz||xuqnlklotz~{ywvuuuvwxyz{|}~~}|{zxwwwy||xuqnlklosx~}{yxwvvvwxyz{|}~~~}|{zxwwwy{~|yurolklnrw|}{yxwwwwxyz{{|}~~}|{zyxwwxz}~|yvromklmqu{~|zyxxxxxyzz{|}}~~}|{zyxwwxz}~|yvspmllmptz}{zyxxxxyyz{||}~~~}|{zyxxxyz}~|yvspnllmosx}}{zyxxxyyzz{|}}~~~~}|{zyxxyz|~|yvsqnlllorw|~|{zyyyyyz{{||}~~~~}|{zyyxyz|~~|yvtqomllnqv{~|{zzzzzz{{|}}~~~}}|{zyxyz{~~|yvtqomllnquy~}|{{zzz{{||}}~~~}}|{zyxxy{}~|yvtqomllmptx}~}|{{{{||}}~~~}}|{zyxxyz|~}{yvtqomllmosw|~}|||||}}}~~~}}|{zyxxyz{~}{ywtronllmorv{~~}}}}}}~~~~~}}|{zyxxxy{}}{ywurpnmlmoruz~~~}}}}~~~~~~}}|{zyxxxy{}}{ywuspommmoquy}~~~}~~~~~~~}||{zyyxxyz|~}{ywusqonmmoqtx}~~~}}}~~~~~~~~}||{zyyxxyz|~}|zxvtrpnnnnqtw|~~~~~~~~~~~~~}}||{zyyxxyz{}}|zxvtrponnnpsvz~~~~~~~~~~~}}||{zyyxxxyz|}|zxvtrponnnpruy}~~~~~~~~}}||{zyyxxxyz|~}|zxvtrponnnorux|~~~~}}||{zyyxxxyz{}~}{zxvtrqonnnoqtw{~~~~}}||{zzyxxxyy{}~}|zxvtrqonnnoqsvz~~~~~}}||{zzyyxxyy{}~}{zxvusqpnnnopsvy}~~~~}}}|{{zyyyxyy{|~~}{zxvusqponnnprux|~~~~}}|{{zzyyyyy{|~}|{zxvusqponnnpqtw{~~~}}||{{zyyyyyz|}~}|{yxvusrponnnoqswz~~~~}}}|{{zzyyyyz{}~}|{yxvusrponnnoqsvy}~~~}}|{{zzyyyyz{|~~}|{yxvusrponnnoprux|~~}}||{zzyyyyz{|~~~}|{yxvusrpoonnoprux{~~}}||{zzyyyyyz|}~}|{zyxvusrqponnoprtwz~~~}}||{zzyyyyyz{}~~}}|zyxwutrqponnopqtvz}~~}}||{{zyyyyyz{|~~}|{zyxwutsqpoonopqsvy|~~}}|{{zzyyyyz{|}~}|{zyxwutsrppooopqsux|~~}}|{{zzyyyyzz|}~}|{zyxwvtsrqpooopqrux{~~~}}||{zzyyyyyz{}~~}|{zyxwvusrqpooooqrtwz}~~}}||{zzyyyyyz{|~~}|{{yxwvusrqppoooprtvy|~~}}||{zzyyyyyz{|}~~}|{zyxwvutrqppooopqsvx{~}}||{{zyyyyyyz{}~~~}|{zyxwvutrqppooopqsux{~~~}||{{zzyyyyyz{}~~~}|{zyxwvutrqppooopqsuwz}~~}}||{zzyyyyyz{|~~~}|{zyxwvutsrqpooopqrtvy|~}}||{{zzyyyyz{|}~~}|{zyxwvutsrqpooopprtvx{~~~}}|{{zzyyyzz{|}~~}|{zyxwvutssrpooooprtvy{}|yxy|~}zyxz{{ywvuwz~wrsx{qjhltz{wsppqrrpmiikoqomnuytz}vqnmmory}vzz{~|}xrnouojpy}~~}||||~}ywzzqhdgkopqqrtv{zpszpkjloty~rgi|}~vk}{srsrqoomkjo}oguzx~qtrlquxyytmn|ynv}usx}vu{~pxvvqwjj}oo}}kz|ttxxgacobnwsy}z}yppxy{}zvop~urczrs}vzp~uhgthmq_qjhra]||louwz~pvvw~|z|zphw{ssjko}qpvnmni^e~t_`n[r}ylWLUly{qxbermzw|ovbn{wqru{{jt]KI\lTOSXgsaeot~pu~wysxdg|yh~{zoddjpyzslqaRukd}~wsfyzqdvkiyqsz^]{mochifjzk]qnzvfYowonjv|rryzsvuljv~yvuzfCew^jxcQKVh|tvz}m}xqkjz}u{e[b~|mwpZVVMMoqTZU[jrmc}pf{rnz~xxzrin}}tN^p^^apuklrhymuspy|~~~x~}q{fcz~{vwlxapqjnPQ^lnqh_~tn|lt|txd}mzpvtc[`dhgubaf_pl|}vsqr}qtmu~x~x~|nl|uzu[Y{nq{|voWjmgqbol]ccyqep_tx{lx|ukqfvr~p^jc`Uqyb}svoutvt}yh{|moonox}y|xy|psw|txp}jivwswz{ohociyto`ohp|djwrnjr|hk~hkydje]Y\kkxq{ntv{y~tryzuv|pzysvu~vumxjsjxvip{|lnu{kl{w^[buybkuscrvd{let}vyu}yo~rspkik[oquyx||zpoqwfyrzn{sd||j~wrzwzwuvgxx|ut~]mw|xiroqfrpgr{nfs}wx|r|iwtr~~vjwze`jlcTotmoxotvtu}o{|vswq~vu|yspvlu{}v`_zzrx|vjvvpZgoxha{wqjtaenol|}|yvx~qvup{udfsoY_usv~zrytz{oy}|{ygw}zl}jw|lt~qg~~lqnfsorcj||iuublxwpo}~{xv|yw{zoxfsqejj`fli_Vovzh|zz~k|~~{x~{cezlop|xwyxdl}~yzicxwYqwplgnxutzjrolo~zvrym}|svugcpmf`u~wz|}ywkxxy}tu|xr|z}|~ji{qvuwztrwmkrvugjuowosiqbu~w~zn~svzdqyvvttpecfdb[uvoyz~zut{w|s{yzlfqtljpu{r}vkk}}tiuyyessqdcymt}psiro{vsvvzz~rborgbawutvmvysu{px~ozo~uqnrtkrwzs~r|vstzi}sukluruuqtzkmz{zzw~~xtpwnqqywb_poeVemol~txz}yqznz|z}tihnpetppqo~{uosmuy~yn~muonksmyr||wqz{}~}}~wxx|wrvzbiwriXjozptt{suvi{u~yz{~v}npqogyqpnt~vtv|xr|wppzo{p}zxtvtvzzuzouurpjl|v^`pmaWjit{h}z{~wxt|qv{yu~vnokhaqonlhy~snt}~|yxtqyonyp|rv~~{}vu~lxysnpf]ovlZnstp~|~x{{nxrt~{}ru~rxzorieapvnve|{~}~nxyqtzyxr}|{wow}}ootqrqkdvnU_llaeqi}suyy~wuw~u~}}|~uu~|pnh`]bxlrhk{}zut}~ul}vl|vpz~~{rv}{o}vuqmqd\lpjcupyx|~z{}mzts{|t{{x|wpxtloe^\nynxg{|vpwp~xs~|}ymu{tk~vsmfdo~w][fjfbsnz{{y~r|~u|{x}}|z}ysoxxiglaYXoorxd~|z|~qrqrw}zw|wr~uwwywpkiws_dilitzzxs~pqyzus~u}u{}}zpwwrkowphlh`Yevo~otp{p}yv|}xnt~xy{nzwumgdk}zb\dihl|rxzwvyo}{x~x|~}xysvtlltpdilaW[snxnh|~uru}}sy}~rs~|~w}yzvniokafjnqxxyq{lw|{tw{v~v{y{o}qrojkuscclf[]snxvi|r{~~tz~|rp{}|xuyqwskek{zf]afin}r}{z{t~ox|}x{w{yzs}oonjmun_cjd[_qiuohy~}|p|~zux~uu~~wz}pywpjq~{jddgkwu~vyynvyvs{yp}xxv~txollkrvh\gld\goj{ko{~wu|~~qv{}j~vkurkjw}qecacg|{xuqtpvzxyxty}z}zpkknusc]gha\kgltcq|x}}u}r~|~uy~xmyoyvop}tjgdfpz~wsqptvvzwp~w|}|w{|ynhglvra]ehc_lfotevz~x|s}~}vy|t~jykrsnpz{pheabmw|~suvruww|~r~}~~z{{qhgktsb[cgcameiqcr~vxzwrzzwlnrvss|ulkfel}}vuzrsttxrt}}|zz{|t~wuuhcfqsdY_ghcmigugo~}~~yz}|~z{~xttosjorpu|vkjgbdwvy{~x{vstux}q{z}uypvpfcktl]Zagfjobpngxzwxv|}|~sn|pntsu}}snnifn~zvurrsy~vp|wxuz|l|ylskccmpfZ\cghrmfvjm}y}|{}||~{o|l{{mioqu|xnlkedrzy|}x}ustu|ws~yzxykulsi`dnn`W[bgkuikugs}x}}{~~uuvt}ymjqu}woomil{wxsqrv~||rrs|sxw}hp~hjlc_gmfZX^elvtgwpm~{}~{~|}ym}|qwxqfjpw}yomnkiu{}~{||~xsrt~}~zr~zywvxqgqemh`dli\W\bitxhrsiy~}x}~|p{uzyxljrz}sprplt}~}}z}ztqrz|zzrv~pvqxv}tayvchjbcji^Y[ait|lruix~y~~{ny{t{svnfmw~{qmpokry{}||}|vst}|z|uwrxsywsczwefkedkh]X[`hvzirqgvy~x}zp|yxswqhn{|sqsrpy~y~z{{uru}xwztwxu~tqwzukfyrcejefjd[YZ`j{vjukk{z{|~rr|q}|nungo|wooqop{vy|y~|vty~xy}xv~ut{w}~gnyqcekiki`YY[bo|omsdm{|y~z}}|qx{q~pwrjtwqsttw}s~|~||wuz|uv{x~w~}{rqw~~s{zfmtobbjjjg_YY[ap|mprdo|~z|~~yoyyp}ntsjq~vpqrsw{o{y}}~yw|}ww}}{|~~utw}t||hnsqg`jnmh`YY[`mzoptdkyx}|yuyzk{kkqijx|upoqtx}qx|}z}w|x||y~~x~vqxpnqv}}ruzefjhdX]hkjfcd`\bvarhk{~{wyvwtz|ntskq{xpmprv~wp|vy{nkszztps{}v~r{{utw|ys~rgokle]hpof[TSWe{v|ufr}}ytwti`kjav{jemjhsytoprv|pwzy}uywxuy|xu}yz}}xyz|sluyp`RMQ]ppclruwyxsq{y~||~~xs~vqtqzxv{}|sq{qz|rjfksuhj{lfw~~{uollouxumvwfmlgja]iog[UW]fw~ss~{yy{}{kmrajyn`bkhiqqmmptzsozz{xs~~u{vwsv}~}}|w~utqddnk^RQWbroty{{ywvsz|{{wy~}~}xsvpzpx~z~~qs{p}~tkhlwyej~kfu}~}yrnllmrtolyqfpjejc]iqi]X[al}}uy{yy{|xnvocszocdnnlppnosx~nv}t}vxzxvzyvzztu~}}|u~zoqncgpi[SU]j|zx}~{wvxy{u~xw}~|z}}uzous~wu{nv{qlnx~je}sfox||xrnmllnplkxrgrmdhjbfrob[[akzzy{}~~ywvv{~w~rix{thdoupmmnpt{{nyxp}uw{r|~yw|vyy~}~~z|yxnqrhjrk\UV]jz{~{vw}~vt|xx}x~{vuz{~syvu||~{slz|z}usxzgs{okqx{xsonnmlljhuwhpuicjlfksma\^dpxr~{~yxsopxpy|wliv{rklosxqsymqyu{||ws|x{~yzv}~|{xxwumqummrk^XX_kro|w{tx{xy{}v~yssxt{wz{||yrmywty{y~|ovxsqpuxwsooonlifguvhrwlcgomjppga`eotm{~|w~{snmr}w}}vmsznjotytt{mmz{vx{v|r~|vv}|{{}zvsw|zolsunmng_\_hqlu{{~w~{z}t{w|urszzx}zy{ytunsytsy}}xvzsuurtwuqoppokgcixpiwvkdgqqlnoidektrn~|}uz}yvw}z~zrq||oglt{uw|ljv|vsu~qwz|{x{z{v}|z~}}~}zuolw~pr}vkflwwqmlage_sqy}r{pt~usyv}wzyu{yz|iq|umkqz~}}xur{xuwyvtttsoiccqsfpxqgcipkdhqsstyzq||~vfm~{nkovtv|{vqw{oms|zwtjr|yutv{yin|~{{w|oikj_\fqvx{|ql}w|zsqv~wx{u{z{np|or}y}zzwh_v|y{wqqvwnpxigsrllmllmonke_csnfswnd_eongjswy}~uxo|ykgr~~{lu{wuvsot|vkjq{s{}mjs|{ustux|uiv~{y{y{mb`gi`_ku{v}|{topzwqvsw|||tn}~vqw~~z~{xuunbm}vuyyor~odpwpkjjkmoomg`cqmerxqhcdnsjfnx|~v~xr{vnilz|pz~ywyyutzyplr|{t|llsz~}xuuwvvyulw~z}w}zzofelma\fs{|z|{spu~vny~p|~}}~pw~xwtv~~zurlhrux{}}tp}jhtxpihjlopojcbmodmyvohejsthdmx~v}~~~w~{rqllu|}}w{zz}~yvzyrov~tzskouz{xutwyvtuttzx||{}yyvypiiooaZcq{x~{tsyunzr||~|}xs}zuzwtz~~yronoqlstroiqzukghloppkddomcmywqlhjrwndiuu}}~~xzprqknw{|~}~~|yw{ztv}}tyvlotwxwtswyxsqsy{sv|z{{~zwtx{slilpk_]ixy~yvx}ruvy}}}{~~sy~tu{wsy||}zsljounhy}qy~okrzvkfhloqojeiqhcrzvqmjlrwpgkx~w}~~{v~tkpsmmu|~~|v{~zx}{s{wnptvvurrvywqnq{rs{|||x{zw~qrzslhhlngaiy~}xy~wt|{}}~{|sw~tpy|vu||yxyxrjejvviquswnnuzsigjnpqmhhqnbkwz~{{|}}wtx{~~||}zuxqceqtpu~|z~|~xv|~yxulo{thinsvwspnvybbkz}tzy||zxr{~{rorwxstyssx}}vrzywzxvwz~}zupuye\grrou}~z{|xsljpy|ujbhyzjrx|yw}wtw|~wgkrxxppqmipwzx{{xtuz{svwikttopyzxuof`_gvznlwzfbu}xwzxz~{}~ww{~{wx~tfn{~~}{yz|{uxynhiptrzwtyxngkqsrrqpqyw~y~uuurnihlsyyrjl}pm}|~{uvxi\erx|ws{zrz}rou|~yutx}~~~~wstxunuznnvzsns|~|troic^^eq{|x|ply|xwy}|s|~zz}vuy||yw}~nhs{{z|~~||~~yywnklojj|z}ulnstsrpnrxy~u{wuvuqkgglrvtony}nt~|~}yy~uccnrsv}|~uyvmpw||zutvy||{}z{{|{vuvtkl|~sot{|smrz|xvuqjb^_eouxxzwx~}zz|ut~}}yw}|usvyxvzximwywwz}~}}~|xqnokci|zz}rquwvspow~u||}r|}ttvtoiefjprqno|uw~||~|z|wefoqqsx}w}xnpvz{yutvyzyy|wuzz~|vuurijy}sorzzqov~}ywvsme_^cjqtux}~ws~{~|vv|~ysrtttw{kiswvuw{~~|}}upomecr}x{~ssxyxtqs}xv~}ws~urstqkfcfkoqont|z}{zzyx~pcipqqu{{zworwzzxuuwyyxx~ttzx|zuttofl{|rpsy}tpv~}vttqkd^^ckquvzxtz||wsv|{tppqqu}{kgpvvvx|}~~{|upnmgcp{{ztvz{xtt|{u}~ry~voprpkfbcinrqps~~}xvusw}tccmrsv|}ysruyzywvwyzxwz{p{xx|{vssphhwwqrv||tsz|tppnjd_^bjrvx{{t}z{}ztrx{xqnnnrz{memuvvx|~z|uponhdp}|wuz}{wv~{u~~~ty|smopojebcinqqqu}}vsqrx|oezztrw~}tkm~|uw{~~}}~}vw~~|zsjo}|rmmpv{xqpwtz~{tvyyuplknrtrprxxr|~}odwummoqpnou~{on||~zx~yqv|wx{}us~}z||uy|snpttqmiiloolhioplw|wtvwmizzwuqnnt}xkj|}uuy{|{{|~}yw|ywyqxzvvy~z{}z|~wx~zz|xuyxoknrrplijmpoljnutp|zqllssjj{zsnmrz|rdi|xtvz|}}}~zzx{xu|{{}~wwzyuu{yqw|zyux|tjjnqqmjhilmkhhorkk{wokovqgn|wv{rfp~vsvxyyyz|~}zwy}u{|rt}wvvx{yrsvwvy~xp{{xw|~tkkorrolklopnlnuwnn|vmjounel}ytsx~}odn}{utwz{{{}}z}x~~ux{z{|}usvwwz}umwxst}~siimpomihjlljhkrriiz}~yokovpgm~{y|vio||vtvxxxwy{~}zwy~w{|ss~wvvvx||topstx}xow}vu~xljnrrpmklnonlnuxokz{y}yoikrpfiyyvw|xjjw{vtvxyyyz}~z{{~xt|zzzz}zqoqsv|{qqupw~ohjnonkiijkjhhntpgnz{~}uljptmiv|{~vmt|zvvwxxwwx{}{xv{|zzqv|vvvuvy}{rkknrx~xr|~ts{njnqrpmllnnlknvypm{ztuxvnghpqjm|{xx{{qmuzwvwyzyyy|~}zz{t}~zyyxy|~{rjilrz~xuyorwkilnoljiijigfktumn}ztuxumglttow~|}|sszzwvxyxwvwy{{xuw~~tr~~wtttstwytkefkuy~wpzulloqpnllllkilt{vpxzroprnggotop~|zy{~}vrwzwvxzzzxxz}~|yy{u{}xxwvuwyyqhdgp{|z{npymiknnljiiihfgmwwoqwporrlipwtr}~~{vy{wuwyzywvvyzyvu{zrv{ussrqqtvqhbclz{tqsmmppomlllkijpy{ts}vnjmolimsqnx}||}}yuxzvsvy{zxwxz||yy~}uy~xvvussuwtldcky~yrn|rkkmmljiiihfgmwwoo{yqlnqpnqvrpz{y}}urvyzywuvxyxvv|yrwytrrqooqtrjbbky|ytruonopommmmkiks{yps|umiknnmqrklz}zwzzqqvzzywwx{|zy{xvyvvutrrtvskddo|~vx|pt{qmlmlkjjkjggktxpkr~voknrrtvqjp{zypqvzzxvuwyyxw{~{|st{trrqpnnprpibdp|{ty~tz}upooonmnnmkjpxzrnv~{tlhjnqstmfm||wxxnpvzzxwwx{{yz~}}vy}wuutsqqrtslefq{ysy|rx{tomllkkkkjhhmvwnjr~}wojjotxxphn}zz}qotyzxvvwxyww|~z{su|tqqqonmmpqmedlxytwxzytqponnnomkkox{snt~~}{vngfjpuxqgiwxv~rlqwzyxvwyzyy}|xu~ytssrpnnoqpkeiuzvvyv}zupmlkjkkkigjqxumnx~{umghnv|zojt~x{|potyzxvvwxwwx~||xrvyrppomkjjlnlgemxyv|z|{wspnmmnnmkkpx|upv~}|{zyunfbemv|vllxxt|xnntyzxwwxyxx|xt{ysqqpnlkklnlhir{zy~x{~{xtpmkjjkkigioxyrow~~}|{yungdgq|yptxwvnpuyywvvwwvw|}zrs|{rnmmkjhggjljhlv{z~}|~|zvqnlllmlkjow}ysv}}{zyxvtngaaiu~soyyty~qmqvyxwvwxxx{xszyroonljhgilmkls{{{~z}|yyvqmjiijjihjrzzrrz}}|{zxvsmfcgs{sy~vxvnotxxwvvvvvx}vpuxpllkihfeehkllryzz~{|{vqnlklmlkls|}vsz}{yxwvtqleacm|{ru}uuxnmrvxwwwwwwzxswzrnmmljhffilnosxxx}{wxyupkiijjjikrzzrqx}|{zyxvsnhdep~}tx~vxzpnrvwwwwwvvy~|tpvwolkjigfddgknptvtv|y{|ysnllmmllov}zss|}}zyxvusplfbdp~wpwztyxonrvwwwxxwx}~|tt}vpnmlkigefimqtvtpvxvyzwqljjkkjkpwzsns|~}{zyxwurmheivus|zwxqoruwwxxwvx~{wps}zrmkkjigecdglquupmuyw{}ysnlmnmlnsz{tpu~}{yxwvuspkfcgs~|rrzxvxqoquwxxxxwz|xrv|sommlkigeehntxwoltwtx{xsmkkkkjlryyqms|~|zyywvtrnifit~~vu|{x|tppsvwxxwwy{wps}{rmkjjigecbekrxxqjp{ux}|wqnmmmmnsz|uot|~{yxwvuspmiffny|vtz{v{~vqoqtvxyxwy~}|sr{wpmlkjigecdipx|vmmz~tsx{xsmkkkkkovzwoow}}zyxwvurpmjhlv~|xzyy|uporuwxxwwz|uot}xpkjihgfdaadjt||rkr{tv{|ysnmmmlnt{|vqu}|~zwvutsqomjhhnx}zx~|vzzsonqtwxxxy}tqwxpljihgfdbbfnx~snwwqtyzvplkkjknu{zspv~{~ywvutsrpnljlt|}~{w~ysonqtwxxwy~yppx~zqkhgffeca`bgq||qq~usw{{vpmlllns{~ysu|{|yvutsrpomkjkow}||}wy|wqmnquwxxy}upu~~wokihgfecabemyxqxwqrwywqmkjjkpw}{trx{z{wuttsrpommmpw}~}yy~ztomosvxxx|vor{}woigfeecb``cju{qu|srvzzvqnmlmqx~}vsx}zx~|vtssrqomlllouzzzyw~}{vpmnrvxxy|yqt|~xpkiggfecaacju|rt|rpsxyupmkkkow}{tqw|xx{wuttsrponnorwzyzzz~|wqmnquxxy}~wpt{}vnigfeedb``cjuzqt}truyzwsommnsz~{sryzvxzvtssrpommmoswwtw~y|~}|wqmnrvxyzwsy|tnjhhgfecaaemyvpwyrqtxyvrnllnt{|uprz|wu{yvuttsqonnorvxusy}{~~}xqmnrvxy||~ut{~yqkhgffeca`aenz}tpxztruyzxtqnnpw}|upt||vu|~xutssrpnmmorvvrow|{}}}xrmnrvxy}yx}}voieeecb`^\_en{uqw{zzvpjghlsy{wmgiqw|sljo}ysv`_nw~{ytmhn{zrjfktz{wtrrsx|zz{m`[amsne]YX[akrrmo{zsx|upmkhedflstrw~{~~}z||sqrqnifdegjnsz}usxxxvy{xqpsy{wrt}rq~sonlgb_^`b`ZXcvsn}}zrlmtzzto{mtyz}zjcjwvq{jZkoigffly~~{{zvvz~{nt{eo|qklvtwqg{tj~ujgiq{x}zumxalpaca`ervolkgfyytx}~zz}pzwkqptrpxwklqsur}zwofdee{|z|yljpg{hde_ZbphYY\\[tpxq}~|~uvrx|tvt}liqqklzukt}tzpqfzpmmqkf}~vyspyrw|tmzjsjw|s}{yyuz||mz{wysrry|{lvgmeutimtyhl{piwxs~yt~~|fkqzozzvwwstwxizzmkxmff}~|jsx{kqsqrps^^bpgZkrhfi{r}~xxvvz}wtx|{tp`gnzlgy|v{ov}sfb|zzx}ztxx~vpo~sllllj~uyzx}v~w|s}y{}vy|{volhjfi|yset|jju{xr~y{sytp}tpp~s{{v~pr~xn|}|nys]dr{rxyso|orwxsdplfZgtgfnpldxt{wy}}{{m{zx}nkvqh_r|u{v~tzwxmkw~uxw}~|{ryrjxp|sumtvny}}|uvz}mvyw{}yz~~y}y~x{|v}rshvlinxwfo~ytsx{t{pypltvpftluuz|y}|w~z|pbqxus{yyuwusdksnsn|lfitpdqwjgnuytvwvzyytt~x|{}{tzmkmujm|~zt|zrupxyvswlvzwmsszun|zunz|xy|~v}s~sv~{|pys~nmtpigxxmpqtkuzt|{y{~pztrvquqtvuy{v~|zyklwpjpqpgz{}tq{u|nqfkxrjgyvadr{pvxt{{v{t{}||v~rwkt{rgi}yjv|vv|s||u}}~n{{wnxuuvvomyksotu}|x}pwtx}u~o{x}wxy~owq|pqyyluutz~}~w}s}s{tfqzuizt|ww|y|}xw{ugr~rou}~q{}q{slrnz~k`mvtlqsi~on}zxyz|p||{xl{puhekagxk`qq~puvpqmnhtul{{vq}wkatvql{}rzwz}vxsrzvn{z|ytm|y}z}}}wizvp~~lt|uzzvrzysy~mfwzhwbtrwyq}}zmxvh|tsow~ul{mx}rseswy\uyvollp{{{dr~kpzzs}jq}|{{zr~}yxf|~~Zigfojxszyurz}vz{httvugkvswv{ypyz{}ksro}|||xzqqquoqup{vzyxvuztlizvs{vzzmuxwwlsooewor|y}wtpvy{rn|yv{rvtxmoxxkuvu~{mpxw{uxwytuy|pswrz{z~mx|wvvogsshvsr}{txt}~t|o}}wo{wnlrt~~z|ts{~~}~zu}|w|xltwn}}w{}}~tm|sdr~psvww|ssussr|{kr|so|x|xw||xv~|vzkmvrmwtkv{||}|{zsrjl}svmsuzu}hzt{~y}twytxtrpnmknsjnxsyzz~|}~w~ts}vpzps}}vv}ptvomw|~x~~xywx}u{vzzly{r}|oo}|{y{{syuwvx}w{pxztxywlnhew}wu~x{|xvy}{wxptxin{r|v~wv{{uq|~ywrvuv|mt|yrsuyxz|}~w~y~uzwp}tsyfkukhxwm{xqyxkxyuyw|zyzuoz|wqxzy~}z}zsulopxpyypiq{szo}s|v}w~yqt{x|q}zovpbpymuln~{}}{{ymyvmvpqsollyy{|uuwsoxstvs|siu}o|u~}wwy~~wtx{}|vyrnpvi`mhhptuutzsw|u{|tmzvtyxv~~v~yz}|ruotxvwp~{vr~xvjw}}v{}u~zippdnyhkfhxyvs|~}}{~wzzw|tnxnjeutnzv|u~t}yu{|sv}v~v{}xr{ysz~~y~tv~|y{rwnmxocmmjumxx{}|~~z~svuswq{{zq}us|twxu|xu}~rw}nvmqyut}x|ofz|~~{{x~ypzwqwyq|ykmhs{{~w|}}~x{q|x{uxhbpnojxun}ukrowv~nsu{~~zxqttrttptfnz{|}up{|pp~tyvipllsrowsmdoz~oo~zghkiyz|{s}}wzyole}uwxyv~}xko~tketrkj`\lumpzxmt~ywzvs~wtjgwuup|sw~z{q~xs~ox}ry|by~konyrjpupt}{v{pv~{|mmk}mpoi{rqgx|qqkuqw}v}pnsyrfjhrhtvfsyz|}vls|qkhwwqprq}psvvw~{~sngtroxyqrrhaunehaar}v|s}}{w}vpsrp~lizs~|fn|{w{wxsqn~q{t~tqq[fnpfumv~y~zyxmzz{lzwmmvsdxt~|wt|x}zotnws_r}zuqfrkrxjy}~uz|z~}~|zx{~vp{}nzo~zvvstx{w|wzz{|gmvpqt{vmwrz{nfo{t~~{|pton}w|}opmt}wvraqs{ztv}sxvxxwvpfgzf_dnkgy|~uy}w|x}zyyno|z}{k{rsgxz|~}||}zwvv~rm|r_qrvekpsrysz~~~||u}prup{xfx|vv{rqy|}z}xw}|vwn{}|yhx|wmiwmrryl}{st|s|nx~|qjxy|x|oyzwp~{su}z}v{~kot~{ktovhsz~pkvpkvq{{wz|qwsyyzszyfutjshrzq{pyurr||sy{mhntgywyjfvxqrv}|vzwwz}kgr|ujwovz|{xv}xpxvzxxypxpsup`oywzsto}}w|~{rrzxluuojusuz{x{|tuy~gku{wpsfwo}tfjuwturx{{|z}xnyskwzz{r}rx~|xu{y{{gutsgooommfzzrgmyy{vt~{vv~~tvvt~uuo|uv|{j{~q{|}~tyytq~}|r|zr{}tksrdirwqlyqpzsuzzyykvo~rh|~{|}xwsuxoyyvosng~sr_fupfiuy~ww}{{~tr|wnwkz{mrxy{y}uvxuxylyzzl|wep~wurtlsn{}~}~~soo{tlmrnrtmyz{tsy{~ro|u{k{vxwgip~uiorpszxr||}skjsqkemZlmom`gpup{~~}{s~tuqr~wpkhyvomww|vco||}u}p}v{|}soks|xjtzxkgxl]kic~ggm~ut]gsnhggu}x}~{{yryttsi|woxrvkytgyrayz~zlwvxz~~sx{{jlnlq{|v|{~xmnbspl`Wklsgkytmr`k{rd_^e|}peppkjqqfsqoutrzwjrihgptbrlz}|vp~dl}irvjjtrlnfXipqhfzgj{eOmWfURbPWQt~^`dhfmvrg{xzy{oq~qlrbfe]nl{~z{m}wrmpz|xzuvtnvuxbVj{~ys]bueVndbKZiUd^muVmzzymsaowv}uyy~vmxzq~sxfjsw`j}hzz{{nrxp{w{tkz|{b]im~ym\aumseaUY|vghVlparz}~lwemzxskuzoqrw~rp~j}yhvqmhowb}{us||~i~~wy|}}|{~xks{}m[^[mttonsp^\_byykd\um\jqzqivhoj{sfl}}yzs}|wrt~llpmkc{vh~{|y}v|{vyury{yamzt^bXt|{uryshc\]mvc[apzTYnwnf{bno~gqn|}v|v}jvy~ujpnsdkxi{oxsl{z}u~yogswtkjdls}k~suqjeRitnUcmriYmvqftihzjm{wx{|nu|~rn~|t|vwzwugdts|{zynuwmz}p}~}xadoyvjqc|qtxm}kf__tzbZqur[aosgttiojsgo|vy|{pw}srt|{zzxq`wq{u~s~wuuzv|zj[mnuihii|v~pz~ojVkvuY_ppr[cgiavnhlwtmsvzz}wwt{vtutstrhg{wy}k}zy}~p~}vvqz`[krnbrgsz}nvjj\rtmR`toobdmgg|spevt}qz~szzq{xxvlktspdsw~~|v}tz}vvrzsfq|jW`dqkp{j|kpkoclttcTs{ne_boiz|ohhyyrx~z}yiswzzzrqmtzsllw{{v{y{yz~up}}~}|kl~wb^glll}m~~uivxhdrrt\lleabpjurmgzs~vsv}{yznuz{}|zmgrzuohyy}ux~~ws~z|v~}{vjhvweZ]imj}lt|lyo`pwyegrdi`kfnrre{vytr|{{qpuwxxysgpwojdxr|xxwsztw~{wy{xjiqpbZ]dkk|lwn}nisxwcer`ofd`p}pqd|{tvxz~pqrpprx{pipvrki}vyzu~|trxrx{pwxvljqod^bfcnwizp|~mnwunclmalgec~|wqk|zpvv{}xkrsqrt~kdptvksyr{wu|qu{x|yq}{qijpogc_a_rqo~n|~osxvnmxkfpe`juwgp~{pjzz~w|oqpruy{fbqyum{rvx|{v}o|~|u~}~vsyvlfmqnie__aslq|xrrxutoqyjasj_m}qufr|nk~y{z~n{svvv{zgdowtlyn{|{|uymyz}qz{~wrxsnikoifd_^atim{ttqvytptw}o_noaj~sxjt~ql|xyxpsttru}kclsrkxnu|z}~t~ymsy~wv}wxlssokmjeef__]nnlu{uxzysu||xglsfe{wzqnukw}wruzwwrpq{sceqtpzypx~vw~{qpv|tzrhkmnihlfdifa^htg~z}}}x|wtr||tenn`u}w|ly}kl|~zw}szwwrqx|kdiqss~n~x|qz}ypytz~uz|ozhmnlhigbcie`]rqpv~}zzupvzrfonf{wxtl~vho{x|z{xxsqqywfckrtz}o{~wq|}wr}sz|rywzmseijffjdadgc_cwp|z}||yvr{}wpgrno~s{pqrjw}xzwxuytrry{ocemtuyyvqt|yqss}xp}slxhbcdcghb`ghebrvp~|{|xtxvuljsm|ww{m~}km}zs{}qwwsou|xkfgnt{uzz|qwwsp|wv~su|~o}xkscceeghc]ajjejxn|z}{vu|uvjrsyzs}nxqkx~}swquwtpr{zofejqzx{upvvur|q{yq~||rw~h}xebccehc\`jlgiwn}~~~ywtwmlu~}r~outkv|ssrpvsps{{rheioxw}wqtuus|tx|r|z|rtzjxujcbbdgd[^ilhivl~}~~yyrwpjv}s|owslx~xsssnuuqt{ypiegnzu{ysttss}sw}t{~w{qutoxrkb`afhb[_gjgmrj~~}y|qwqm|wvxn~qq}{xmzmpvusvzumifgm~wv|sutrwqx{y|xt}pupxtoja`ahh^Zahkjrjoy}{rzsos{ts|quu}ilouuuzzunkggpw|w{tsrqz~qv|~sryrqnzookb`cjg^Y_hkkrfqx~}|rzvpu{qt|sws~konuvv{zsnkffpux{uqqs}~ss~~~~qp~xupl~okmc`bhf^Y^fklreowswzqx}sr}vxsyo{skqvwz{tnlhfl~w|xvsqq{wp|{{snzzurf|tgng``fg_Y\cjmuilwvt|u|}woxxustuzllsw{|wpnkgiyzwxzuqqv~}rtzzxkpsvdn~gilc_chd\Y_glusf|}y}tw}x}~ow{x|{o|~r}~tjoux|yrnmigp|t~{yspr|~~zpyv|pitvtp`yvbii`_eg`Y[ajq{ooz}|sz~}{n|~zzvpwu|zsinty{xronjiu{vy~xrps|}yq}~wz~|livqvk`{q`gh``ff_Z]dmw}mx{}{t|wq|y|~ps~syzxqhmt{|uppnkm{x~w~|vrqx~z|vru}xsgkzuqu_i|g`ge`cgc]\aisxp|~xvox}xzvm{wv|vvlhpx}zsppnmu{uy}ztqtz{|txsx}zkgrzovh^wr_bhcafe_\^eo}q}||t|ss~yzymwxtuuqhku|{upppns{tz|}wrs}zy|wur~yy|nfn{{oum[pvd^ggcffa]^clzt|}|~wzyr|wyymvwrvrujjt||uqqqptzr{|~}xss|zw{zvt}vx|nflyynvm\ouf]dhefe`\]bl{t{|~xzyt{vywmxusvpulis||uqqqqvwpy|~ytvyw{|yw{ryzmgnyunxi_prf\dihgd^\]cm}~s{}~y|{vy~xu|}royoyqpuljv}zsqqqrxqrx{}yvz}vw||~}|voujirz|qrvbgqnd\ekjgb\\^dq~uxz}~{yw}|w{quwiz|ech_]hnkffhkptiu|}y|yz~~{{mhx}~|vldfow|}wlrq^eig`V^hjheccaclsmxzuy}toyzqzzqrntnjrwrmkmotviwy}}vmrz{vrt{|{ok|~tmnt{zovtbjlkg\alni`XUV_s}{~znhqzmagk`t}memmgnutonorwxjr|vztyw|{xl|yrrw}x~qw|xzpmw{reXQPXlyzy~}}~y{|{yupq}vv}ozqs{vv}{yz|zwu|zky|qkkrzufrs]csyyvofdgmruumlvidnhih^bnoe[WX]i{~||xtpmlvznukbvyi_fjehmmjjlpvsety|xwuvxw|}wzlz{vv{{t{|tvqfksm`URV`q~|yv{~~x{}{xurqzwu~qtwpy}y{~}}xsv{mvvnkpz|hhye\kvxvphegknrsnjtocnlfjf_grmb\\`jz~wzxurqotrttco|se`jmjkmllmqxzlmz|~y}u{r{wyrpr}wwz}zvv~ursjdmqg[X[et~yz{wx~ty~|ywsqxzvtq~rt|}~~z~sv{mvxpmq|jfxi]hrwuohfhlnookjuneqmdiibfrqf_`eo~ut|zurpovu{rfw|thblrnklmnpu|yjuv}zw{}y{tuzx|spuzwz}~{ys~}qpskfnpf][`k|uzw{uq~|xsor}y{o{sy||}||yvx}no~~~vqr{tespcenttoifimnnlihuperqffljentmdaemz~{uo{}wqmjp}}wlzzpfjvumjlnrw~xkw|ryzv|ywxru|z~{y}v}uw}yx|}zvz{u|pnspimqh_\`kxy}uzx}zos}uolq}uv|u{|y|}ysxyjtxux{y}porkjjorqkginpnlheougnwmdgomjoslfdhqwqouvmgfo~u||tlq|wlilpv|{mr}rq|~wv~ur~{q{zuw}}~{~|y{z}zw{~zutt~xnovtmnpia_clqm~}~{{}xmu}tlkr~ux}{wz|vp}umvsos}vwolpnnpojhkpqnjderrfryoffosmmqoigjqsl}xuvi_Z_kw|qz{sq{}qghlqwuhmyomy~~txvy|tru}|wx|xs{{xxxtqsy{{wtuwzo_pxwqssnijpsly}|zz|vxs}rlnwtw{zw{wuzuhjorvqpt~{lpvqnmjghmqqmf`dmce{xnmtxrosspnrwpo|vddouof_`it~w~wt|ukkqy~ymx|mjqw|{o}y}ww|z|ognnewvsupd_`_]^dg`l{~y{z{~~}~uxvprzuqu{pcpyhflheho{~z{yx|kfstnkjhhlpqld\]kjex}upt}|sqvvuw|yswkkrrj`\aku}~sx}}zuu}~slnv~}psshlt{ut{|y||}~{qe^fois{vy|recfeehjchzyw}{|~~}zw}{tsz~qlqxvhoymkqlhioy~{|xzmdqxrkhghmqqmd\_ligzwsuxrv{{}zt}yqnrtlcafnv{}|~r}}~~yw}voqyyozohmtzw{|{~y|yy{~|vk`_kkgz|y}vhfjlmnibr~wy}x}}~~||~{yux~|vkmrytszrpuqjhlt}}xxvekyxngeglqrog__khcu{ww~utz{s~zy~|usvqiegmswxx~s~yz|sry~wo|pjmrvz|}~}z}xyvx|~|vkacjccx~~pkostqfdw}w|~uzz|}yy~zw{qmnqtwy}zrz{rkjnw~}vphp{yneejptsneahj_hz~{yx{vv~~rz|ww}|xxsmkmqsttyuzz{}vw|ypxxmmortvvx|}~~~{{y~utx}~{shdjf[hy}}}~vrw|{pcm{vs|~|~v{|xy~~|{~z|pooppqsv|yxvonryywrkpzzofejqtsnfelh^jy{yyy||w~s}|vuz|zxtqrstsrxv{~y}}y{xox{onpqrssuy|}|{{|{|uqtz|{tkfkg[ctyz{}wxyjn|xrx|~y}~yx{}~}~y{tnmmmnoqv|~v~xssw~~u||qmqyyneflrtqkgknb`q{z~|{|~{~}~zsoptyxu{~}~}{{ywsrxzpz|}y|zwoiu}pghkmquxxyw{hy|stx{ysljqncky{{uv{qsy}}zvssvz|ztv{{{xvwy~tqvkv~ztv{~~usskkkjhggnz}xyzxz{~}xx}vrv}}zkpvw~|st~|qz}x}|yyz||yrkilt||wvy{{{zxv{}z~ywrlecfq{{hr~~xuv{|}zz{qnquvrlilk]]o|{xzz~skinw{|skmqsttrpr}}x|pm|rigfddeiqz~x~{|{ttteZfu}y~wnx~tpu{}ywx{}~|{}wuuxzzvojinw|zxv{}{zxtolgcbdjuqyzww|z{}zxwz}xpmqtsoklpg[eu}{z}wnjlrwv~tmqvwvtqpwv~|rjvukhhfdcejr{~|~{}zuuwj\dqx}zr{vosy}~|ywwxzzz|w|xttw{|yrljmsur{}vz||~wuqnieaaenwz~~{{}w{zzyuuyxrnprromqse]htx{{yqmnpnm{yru{|ytpr|wvz}}lm}|pkkjgdbbfmtxz|~}zy}vdbmrrv}x}~rpty{{yvuuvvvzwrvtvz}}xrnnppkm||{}y}yzvtqkea`cipvyyvzxzxrrvwsppqonqwn`costv|~}ysqqnfiz{}~wz|vsx|szz|xks}vmllkhdaadinrtz~}{y|veforqsx{truxzzxvuuuttyvn|xsuz}}ytppqohjx}ww}z}{~zvvqoy{}|umkr{xrtuvz~|~}vqrxzwutokrjjwws}ywz~~|{zxwzuyozwtuy~xuzsty}uu~v{vprtsqnmmoqqoowvhi}rhefkuynhr{|{|}~x|{{~~}|yus{~z|}z{{vpu~uuz{z~{||qfmuoijmnmjhhjmoonq}}~vu{~|wusty|oq}{vssu{|zxgjx~yqorx{{ywwxwqmw~wonrx|{tnry|yuwx|wxz{zxwwz}~~yxz}}||rpsrlffosspppt|xmt{{mn~}{{nq{uy~}|sqruz{zut}zvtuwy{{xpkmtnglidgovyrbkialmlmvwln}|qmnt~~rnv{yvtux|{xxxwusqpponqz|gam~vu{vmmwo^dsuru{|~}|nebba^\\bku}}zxywoggt~wqpsrd[i}||{z|z{vjq}~tliknqv|x{vrsvz~zwz|}}spppqruwwvsnkox|vy|urnf[U[hrtstx|npwywwx{|}|~}w}{ov~zz}y{xqqruy|yuw~}yvsrrrv}~qlkjhebabdghjq}{~~|x|xtx|siqyr}|{ywspnmmnr||qs{zwwwtrqqqkejwwpnquy~~~uqpppqrtx{|{z~z{z|}{}zxund\_jrrlhiqtibjsuuvy|~}z||z|wusrrrngdhmqx~{xtniffq~{nhijkjgfefhjkoz}wyty}qpz}xuvz{rgp|ywusomox}rfdhnv{{{{||zyxwriitxqlmprv}~xvtrnkiijkkkox|usvv~~tmmomh`[_kssonu{ujktwvuvy|zuspkejz~|}~}{|}zsnorw~zpt}}{ysjcfxznklmmkihiknqt{}yrry|uqtwoeivxloz{vsstttttttsqps}vkklmry|||~|ss}yuvxy{xlk{xtvyywtrqrsttxwnu|tt{xwxpnookd]]eqwvv}vu~yx|}|wnmwysrrqoorutnkms|ur|}}}~}vlgu~utvwvtqooooqu{}xy}{}phowzz{~~vqw|yuuvvutssstssu|ytvvuzyrvxuwyyz}}qrunmmlkihikmorywqyyv{}wvvurmgejt{{z~uu}~|~{{~|zzzvomw}vttsqoquwsmms~~y{ofnxtuwwurpnmllnv|qq}~~|ysmkpx|zwz{rimw}~~~z~||}~}|{zyyxwvz{suwvx~vlktwplmqtvz~qjw|pllmlkkklnpsyx|~|wtttrojfgnwzyy}ynjry{{{~}z~}z|~{z{|ztr{~||{yww{~wrt~y~ynadx~rlloqssttttux|y~}}{xsnkmtz{z}}unt~}yz}}}{yxwwusrw~|pjnpnow~vxwsstttuz{z{nl}vsssssrstuvyx~}vx~tljjkjihgjr|uw|~{tx{{{zxvx}}uputu~{njyxututspnmllnvxsz~{wrqt{xos~||xppsuutsstvwwy{uy|yuxwps|{tpprrqrv}|yrn{wsrssrrqrstx{u{~{~}~wutspnkgfjry~vov~~~~{}|~|uqy}wtuutqqtz~|vt|~{odfvxtrsssrpomlmq{{rt~~|yuqnqw~|onv~~}~~y{|zxwvuuyypsxxsqu{ssz}wqprsstv{wmr~~wqnmmlkjkkmqz~yz}urqqonljfdgoyzpr|}|}{vw}{|{wqu{{}~}{{~{xz{wkdkw{yvtssuuuutsrtz|uz}{yvtplhhoy{pr}}}zsuz||zxvuttuzxpsyzvrs|xy|ustutstx~umq|}zwvuutssrrt{z|yy~vsrqpoonlihnyvu~zyxy~}}~}|{tt|}wuwxxwwx|{|{yvmmv||{zxwvwvvusrrv~uu|~|{xsnnuvns}ywqty||{ywwwwzytzzvw{v{xrqrrpppsy~}|wqv|{yxvsqppoooopt|~y}|~zvutsrqpnkilwvt}{tszy}||xy}ysrz~xuvwxwwx{|wnmuzyyzywutsrqponqy~ury}|zxvusplimx{opy|}wuy}~|zxwwx~{su||xuyysu}{ustuvvvx|voqxyvvwvspooppqru|}~}{zusrqoonmkggo}xrx|w~wy~~}~{x}}xw{{vu|}yyz{zzz|}z|ulltxwvz||zyxxxwvvyzv{}zywutssqmjmx~st}z}wsvz}|zwuttv|upu|~{y}~y}}vtttsssux}{}tqx|yuwzyvtrrrrstx{y{}vtssrrsttqnpy|z{tuytv{~}||y{~zz~}wsx~ywxyyxxy{~zuz~usz{wy}~|ywvutttv|ysw~|{zxvuusplksutzxyystx|~}|{zz}}vz~{{zv{|usrrrqrsuy~}y|tsy|vpqvxvspoopprv~{x}{ywvtsssspmmvyzxrw{vw|~}~|x}}yx{xqpx~xttuvwxy{~|{wqu}|tptz|zwutsssuz~uu||{yxvutsqmjktvqu{~|zz}}{z|vw}|zz~{vxyuttttttvx|wy}uqv|wmimsuspnnnprv~|}ywvussssroloy{y~}ut~zuvy}~}||~wy~~{wvy~vrvzxxyzz{|}xz|trzzpmry||yvuuuvy|ux~zxwutsssqolnv~~xw|{{zxz}~}{{}wx~}{}}wzzvuttssstux~st~vtz}rkmtyyvrppqsv}y|zyxwuuuuusqqx}{}urz{urswz{{{{}{z~{z}zrs|zvvwwxxy{|~{v~ytxxomsz}|xuttuw|vty~|{zxwvvutqorx|yvy~~y|{xz}~}}}x{~|}zv{~wtsrrqqrstw}~sv}ut|{ohjqvwuqooprw~}x|{yxwuuuuusrsx}~{{|urz{wvx{}~}}zx}}zxy~{srz{wvvwxxz{|~w|ysv{plov|}zvtssuzyuz~}zxwutsssrpoquxwux}{{zxz|~~}|~wx~}|~xy|xwvvuuvvwx|xs{|tqw~sjglsxxurpqrv}{{~{xwvtsttttstx|}{|xty}xttvyz{z|yuy~~|yx{wtz}ywwxxyz{|}wxysvuopw~|ywwy}{vz}z{{xvutrrrrrqqswxutzy{zwwy{|||}x{{~{xvuutttuuw|urzyrr{}rjhlsxyvrqqsx~x|}}|zyxwwxxxxy{~|z{tt|~|wsrtwyzz}}vw|~|yx{ztv~~yvvvwwxyz{|}x~xx{rory~zwvw{|vx~{xx}ywutsrrrrqrtvvqov~xz{yz}z}|~{wvutttttuv{xtyxqr{}riehnuwuroorw{w|~~|zyxxxxxxz|~|vu~xsw}xtrsvxy|}yplotsnkiikllnpqrtz~uu|ytuxzytnjikqx|wpou{~~~xrqywnx}yzzx}|{zxtqpsx|~~~wuy{xroooopqrsstw}}x{vpr{ytrty|}zwttw}}xy~|wv|zx}~~}vy|ww~|y|}||}}}{z{~|xx|}zusrrrrssttuw}|wy}}xvx{~zxwz~z|zrqw}yuuvxvojmv~~|{zzz{|{yuqqw~{yy{{xtqpqstw}~|{{||}{z||smiilorqomlnsxxtopuy{|}~}vru|}yxz~yz}xvtrrv|{wuuvurruwupnmmnnopqrrtx~}yyz|~}zyz}}|}{xz|zvtw}}}{vnjnuz|zxwvvwxxxurpsy}|yxy{{yvsrrtuy~}}~}{z{~}vpmkmoqqpnnptwwspquy{{|}~}vsuz}{yx{zz}wtqprv||xuttsrsuwuronooppqrstvx|}zzzz{{||}|{z|zutvwuux~~}yrmmrxzzywvvwwxxwtrsx|}zxxz{zwtrqqsv||ywvwy~zuqnnoqrrqpqtwxurruxz{{|}~}xsrvyzyy|~||vqonpt{~{xutsstvwvtqppqqrrstuvx{}~{yyyyxxyz|~~xsrsttuy~ztooswzzyxwvvwwwvtrtx{{ywwyzywtrqqsw|}yvutux}{wsqpqrssrrsuwvtrsvxyzz{|}~~{vstwyyy{~~~ytpnnqv|~{xvtssuwwurqqqqrrsttuwy|}{zzz{zyyz{}zusssssuz~ytrsvyzyxwvvvwwvtsux{{zxxyz{ywussuw{}zwtstuy~|xussstttttvwvtstwyzz{||}~~|xvvxyxxy{~}yuqooqtx{~~{xvuuxyxusrrssttuvwxy{}|{z{||zyyyy{|~yvutrqprv{|xwxz{{zyxxwxxwvuvx{|{yyyzz{yxvttvxz||}}zvtsrsuy}}zxwwwwwwxxxvuuwxzz{{|||}}}|zxwwxwvvwy{}zvsqqrstvy~|yyz{{ywutttuuuvvwxz{{zyy{|{zyxxxyz|~~zwvtrpppsw}}|||}}|{zyxxxwvuvxz{zyxxyzzyxvuuvwyzz{~~{wussstvz~}{zzyyyyyxwuuwxyzzz{{{|||{zxxxxwvvvwy|~{xusrrstuw{}{{||{ywvuuuuvvvwxyz{zyyz{{zyxwwxyz|~|ywvtrpqruy~~~~}|{zyyxxwvvwyzzyyxxyyyyxvuuvwxyy{~~~|yvtsrsuw{~}|{{{{zzywvwxyyzzz{{{{{{{yxxwwvuuvxz|}|ywtrqqrtux|}|}}}{yxwwwwwwwxxyz{zyxyzzzywwvwxz{~|zwutrqpqsvz~~}}|{zzyxxwxyzzzyyxxyyxxvuuuvxyz{~~}|{ywurqqrtw{~}|||||{yxxxyzzzzz{{{{zzyxwwwvuvvx{}~|{zxusqpprtvx|~~~~|{yxxxxxxxxyyzzzyxxyyyxwvvwxz|~~|zxvtsqppqsw{~}}|{zzyxxxyzzzyyxxxxxxwvuvwxz{}~|zzywusrqqrux{~}}}}|{zyxyzzzzz{{{zzzyyxxxwwvwxz|~~}|zyxvtrppqrtvy}~}{zyyyyyyyyyzzzzyyyzzyyxwwxy{}~}|zxvusrppprtx|~}||{zzyyz{{{zzyyyyyyxwvvwxyy{}}{zyxwutrqpqsux{~}|{z{{{{{{{{{{{zzyyyxxwvvwxz|}|{zywvtrqppqrsvz~~}|{{{zzz{{{{{zzzzzzzyxwwwxy{|~~}|{ywvusrpoopruy|~}|{{{|||{zzzzzzyyxxwwwwwxy|~~|{zyxwusrqpqqsux|}}}}}||||||{{{zzyyyyxwvvwwy{}~}|{zywvtsrqqpqrtx|~}}|||{||||{zzzzzzyyxwwwwxyz|~}|zyxvutrqppprtwz~~}}||}||{{{zzzzyyyxxwwwwwxz|~}|{zyxwvtsrqqqrtvy}~~}}}}}||||{{zzzyyyxwvvvwxy{}~}|{zyxwutsrqqqqsvy}~}}||||||{{zzzzzzyxxwwwxxy{}~}|zyxwvusrqppqsux{~}}}}}||{{zzzzyyxxxwwwwxy{}~}|{zyxwvusrqqqrsuwz~~~~}}}|||{{zzyyyyxwvvvwxz|}~}|{zyxvutsrqqqqrtvz}~~}}}}|||{zzzzzyyxxwwwxyz{}~}|{zyxvutsrqpppqsux{~~~~}}||{{zzyyyxxxwwwwxy{}~~}|{zyxwvutsrqqqrsux{~~~}}}||{{zzyyyyxwwwwxyz|~~}|{zyxvutsrqqqqqrtwz~~~}}}||{{zzzzyyxxxwxxyz|~~~}|{zyxwutssrqppqrtvy|~~~}}|{{{zzyyyxxxxxxyz|~~~}}|{zywvvutsrqqqqrtvx{~~~}}||{{zzyyyxxwwxyz{}~~}}|{zxwvutsrrqqqqqsux{~~~~}}||{{{zzzyyxxxxyz{|~~~}}|{zyxwutssrqpppqrtwy|~~}|||{{zzyyyxxxxxy{|~~~}}||{yxwvuutsrqqpqqrtvy|~~}}|{{zzzyyxxwxxyz|}~~}|{zyxwvutsrrqqppqrtvx{~~}}||{{zzyyxxxxxyz{}~}}|{zzywvuttsrqpppqrsuwz}~}}||{{zzyyyxxxxyz{}~~}}|{zyxwwvutsrqqppqrsuwz}~}}||{{zzyxxxxxyy{|~~~}|{zyxwwvutsrqqppqqstwy|~~}||{{zzzyxxxxyyz{}~~{{}}zyz{{xtqpqtx|}zqgado}yw}siky~phddflv~~zz~unlsmiqx{{|}vqtrllnqqrsv~zmqxzx}wp{{iizjdcbbcefoytxjiwxwzgixuqqtsppzolnhu~}zzt{pyxux~ru}}}kurnzyprw{vzuw{yzfsdkxo|g]^kxpd\kqt{tt}wqq~wzn{wwzw}uirz}t}z{}~~{jzmmsovvxsfsnxy|qacfxwix~|}xtssooppkqa_kplyivqy}qlsusqjiprhmxkrrqxmhwvwpwrbixagxww_kwxsjjnz{}xzz{ysrslxojc_\qtnvtxu}~g|v|qnqt}nvp{br_|hg``eeokSixgkmswzco~}yk_~s~heko}`tgsirzvvm{nsuoZO]lua[[bilXpwtsZbYcoo_s{mw|ow{xszysyooZX|~~yuuu|wzx]VUZkg|zwb``jtsZdiSiudhtehxz|iz~`fzyutaVzp{x}~p}~lbTJJSfnumnxnzqj`tqTspj|xgm|{axs|tzu\p_o}lns{u~o}yyy~}xhc^bmgpsrl}~kkpmlya_xhp~bjzys{sp`|tlymq~qbq~p{rx~}w}u{vv{xxijcsmi~~n~mgjqdq]Z}lmtwirwiet|~_l~ut}~q}sXewpg{sy~xj|zvwvtmjfa\v}yvefsljcn^mo^fpkrvmbuwwnmyrvujqzXVqsluxv}v{zm|{~{qrdYfYty}xxmmj_Yj`mq_cscf{tkm|yyjxsisovosy]Xdmktw{xvzujZe\hwon~znujeWj[_xgekgbpypgwq}`suupqtvyorw`jvktxw|z||vh`ia]tpvyknrm`_fYnoeceVhwocrstqq}|v~lphmrqy{z{v{y}tpj^ePbjuxynrno[jYbyhdk_]vvo~z~osynsyejnpt|~}}y}~}y}xtzkjiabXOnd{tt{xkinYs~rlm_nzry~rk{uwqh{m^nuku}~z}yw{~xqwpkhc^gV_rqr{|mpjaztmlmar~rk~ht~wtwqshy{jlsroq{z{vwvvv~r~tpolek^qxzs}x~hqhc~obmjcoutl}yfzxqs{ymjwshksnpw{v|{}wwzw{|t~wpngekYzwzu}zvcugfvmfkhbpusmz~furm~wthfxtfbmprwyw}~|~yovopg`^jawy{vzrzesjcwmfje]p{ri}}}fr|~|qo~rjedurceotzy}~xesphd_]f_z|vzszgrf`zp`fcdtwrew{zbr~xy|rn|plek{shjv|~||}qcnkfb_ag[~ryxw`pckzlab_fsvnj{why~zusojq}ymoy~|~yu{kchbfc^]`e{{{{zsapbs{idkclx}rrvtu|omhw}sjqx}~|x~s|vz_`fdcbZ_\qxy}mqsg|mkkix~r{pw}~sxkgfyymks{}|}y|y{{zuytwoZddeb[\e`}jxkuvmlfpzwp}to~{z}uuoidnxulqtz|{yx|~xw}|t}txcgjegf`gcv|srqk|mjjguz}ny~ziv~y}ynwkdfyxnmrv{~u}{v|{{~w}v~qemigfddegz{kxgyrkherv|pq|}mpyzx{q{~mfcsxoinsyvv|z}|{{vywemiih`_dcumwiusjidpw}rk}~mkz{wzqv~mfcpumhnqttz~~}wyvxelkhec^b_ywwoumpxkhgnwxwiz~}qhv{|t{wn~sjekwsknruvz|ytzozlgmjgb]^]h{n~ynwk}ojijwv{mq~{xjsxzz~q|~pjjxztprv{z||xwxsstckhfe^X\]ymw{oypwwnmisy}{l|uoz~zztynhr}xopuyy}|{~vouluhaigd`ZXYfyh~t}pypmn}}urpu{|yv{rkiw|tmqtyw}|z|vyxpqjsadgeb^X]\qtq||zzvvqms}pvynx{xzr}nhjxxqnqtwxyw~}~tzrqnkqbiiffc\_a|v{x|wyupnw~|nx~voy{vz}pzkeiwxomqtwxz|v~~sssmpscjjjhd`bfvw|w{uqmx}}mx~}tnwxsxzpwjdivvomquxxy~ws~rsmmschiihd^cgwx{vxupmw~|mu}{sluxquzn|wicguvoosuy{{yr{ppkipaghgfc`dhyx{vyuomx|z~lu{yqktv}ouzm|xkdiwysswz}~}z~o}|lnehl_fffeb`dkwu{t|~spozz{}kv{ypnvw}qzyqxlgo{{vvx~}{||yl}{|hm`hi_eeffb`esuu}s|tqr{{n|~|qsx}{swvtjht}ytwz~~y~{ypmy}qfi^lb`feed`bg~w|}y|vs{~ut~ypxytur{~nijw{vtx{~~|x}{{zxitvzhjaaj^ceffc`enw}zzwwp{~|rsxyzo|wqujgpzytvx|}|x|w}v~nk}wzpgj]kdbggggbdiy~~yv}ts|{vpvvpu}o{|mfjw{usvy|}{|wy}y|wjx~yzhmahlbhiiiecgvt|zvz}znzzwptt{to}svohhszvrtvzyzx~}~z{kux|kmedncgiihdaeps|{wx~ny{ypsuyvm|usrhfpyvqstww~}z|y}nqw{mlh`nefiiheacity~~yxpuzysquu{lw{o~xlflwysrtwx{yyqk|yxuil^jjdhhhfa`dv|n|y}ypzyvpvt{qq~ryqjjv{xtuwzy|{||xwis}uxilcamdfhhgc^ak~mzz||qw|{ttwx{n{|r{niq{{vuwyy|}~wv{}ohywtrgk]ficghge`_ctzj~}r||ztxv|tpwxulku|yuvwzx~z~w}twilzrtjie[jedggfc_`g|sq}zt}|xtyv~our{rkmw|xvwxyy~zyxzt~tfmxosgib\kefhihfbdnrz~wu|{wuwu}mv~q}~oimx{wuvxyyzuzxt}qeqwpsgk``mfhjljgdhtruu{zutvt{kv}p||nimwzwvwyyz{wzyt}rfoworhkb^lgiklkifittvtzyusus}zjs|oz|nilvzxvxy{{{wyzs~|qenvmphja\kgiklkjgkvvvsxwsstq|xit{nz|ojmx|zyz||}|uzxs}zndoslofj]]kfhklkihlytssxwsttr}vixzp~|plq{~{{|~~~rzur||wjbopjlehZ_jfiklliiosrwyxtvsvrl}wsxomu}~{|}}~|{rzpu|yqcdrjjgfdWehgjllkilt|w~tzzwuxs{}lsrytmoy~}|}~~}{suvnwzvj`jpgjeh]Zigikmljio|tvw{zvwut~tk{yq{pms|}|||~|}|zpyorywobcpiiggeWejhkmmljmv|x~tyzwvwr{{ks~pyslpx~|yzy|v~~{gnlk{pfpqjmhk\_kgjlmljkssty{zxytw}ml|rswolpu~~|{vakqZ]b[`^cXUddfhjjhhn{o{y|}}~yxnlmt|qswtvwywvz}x}{sorgo{wkovkmlog^nppsttrrv}}xzy{rnssrtrozuiw{o{|ohkrx|loddr}vryneda`OYcacefecem{ujw}z~|}thdjqx}zyutz~vv{|xlnohqyztmvyoqpsgcstuwxwuuzx|}{~qnrsqsqpzsiyzo|znimuy|wfledrz{uuwnnliW^hfhiigegn{uhu~~zy{wuiejrx~}{wux~~wt~xxolrinxzunt|qrrvncrwwyzzxvz}~}z{~zynrssssnvxks~qv~tllsz}~hhjcmx}yt{~qpnobZhkjllkiimx~kuyy~}|t~ty{nfgpx}zvv{|tyx~~y{iooiszzsnxyortwjgwyz|}|zzx|xwz|}vnrsstrnxvjv|ox|rlow~wchkfr}ys|{opoqb\kmnppommr|myyy||}zrzpuxmgjt|zwvz~{uxy|xzhmrlt{{tmvyoruznhx|~~}z~yuv{}}xortturnwvju{ow|snr{~|qaimkwxs|ynpqrc`nqqssrppvm~xz}{|}|xzo{zltvmjp||yww{}yt|w{z~sgqqox}yqoyvotxzjm|~w{~zuuxzsqsttuoqzpl{uo{yrqx~|wfdpmr}|ux~sorvn_jttvvusrv~tru~}zz}}~~w}~pu|nowpkoz}zwvz}{uxyzx}whntnu{zsoxypsy}pl{v|y~ytsv||vqtuuvppyrlzwnz{trw}{wgcomp{|vzurvzrcmvwxxwutwsqt|{xx{}~}v}|ov{mqwplpy~{xx{}zu{x}~z}tgqrnu{yrq{yqv|~no~twx~{vrpsz}usuvvuosyoq}sq}yssy~|rbhnjqz|ywuw|~nhuzzzywuv{}k}vu}|xvvz}xxvr}umwvnlr{~{yz}|wx~mowopx{us|vxyo}~z~s|v}ztqqvseu{mcbppiwynw|vru|~~|w~zjaljhqxzx~|u{qjv}g^zyjox{xtqprwv{x|uxtr{wppv~vioznuuptvwxobhngkqrnnyypt|rlz~}{z~v}v}~zurrwnjvukpibnndntnknty|}}{yz{{wxqitspx~~zy}wqnqy}n}hhorpmjhjo~~|yz~yyyt~}ww|yurnkrxvwvvoackeekmjirxopyvit|||||~|~vz|wutx{u~wovz|{nrwjkurmmrw{}~|}|zxwxzxwxkqxsv}~zmuwtrsuzx~zmqttqljjmu|~y~z~u|sw|xz|vrponp~zzyywlaimfinnjlvums|pkw}}}~w~uz~}zwuvzuvyu}x|xntuinvroqvz~|}}zxvuwyxywlu{vy~}tirutux|vymqutqmkkox||~|~x~}t{~rw~{~}wrnnprvzyyyxncjpjkookkuvmq{riu|~vtx|}{xvx}}sv|w{xnuvjowurty}|}|ywutvyz|vnx}x|}~y|ofpuwzuxnruuqnlmq|{y~{w~zt}|rz~~xsnmosv}zzzzwkeopkmpnjnwrlt~}mkx~uyty||zxwzxr~zx|tqyqkuxutw|}{|ywtstxz{|qs~|y~}{{wxgkux{|zqptvtpmmow||{{~v{}vztv~xsomorv{}{||zpfnsmlonkluulq|qjv~t}sw{|zxwy~zr|}zytzuluzwvx|}{~|yvtstwyz}qr~|x|}{yzvzhlvy|~}sruvtqnmowz{z{~~~w|~w|tw~xsonoruz~~~{ogqslmomjnvsltolx~uztx{{yvvx~ws~~~zy~spy{xwy|~{z~{xvtstvwyxow~xwzzxzwzsjsyz|{tuxwtpmmq|v~x{~zz|zzt~|wspopqt~vjnuplmmjktvmp|wkt}wuvz{zwtux}tx~y}}}rw}{xy{}~}{y|}zwuttuuvzsq{{uvxwv|{v~onx{{|~|vxzwtpnntyv{y{z~z~|~wv{vspppqtukrvolmljmvtmrtlw~vuvz{yvttx|tz}z}{z|}||{wux}|xtqmkjkouxxws|~uuvtqmklr~xs}|wpx}{yt}{qecuywmqzupqqnowyqr}qv}}~zwtwywurrv~lft}{uqw{vyzooxzxwy|}~}zwx}|xurnlknt~~wtttsypy|ljlmkhedgp|ymq{{umt~zz}zpgbbjv|zz{wmgptnklkjnwtmsrjs{yxx{}|yxy}{rjeq~w{{uxuknvwuuxz{{zwuw{{xsoljkou{z{|obit}y~mkmmkheehq|ymqz|yuqz}zz~|skebdku{||xohpvpmmlknvumq}sir~xxwz||zxy}|tpmmzx||wywlowywxy{||{xvw{{wrnlknsz{}tv~{iamzw{mlnnliggku~wms}z{yut{yz}umgdejs~~|}|wmkuwpmmllqwrlt}nkxxvw{|{yxz}}~wrqpu{z~{y{sltzzyy{|}|zwvy{xtpmlnry~{~{{uqx}qchw{|smnonkihjq||oo{y}}zxu|}x~{|}vnheejr|~~~zqksxrnmlkovtlp}rkuwwvz{{ywx|{|~ytrqs}{~{}vnsz{zz{}}|zwvx{yuqnmnrx}z}}|yytow}sdhw}~vooqomjikr}{oo|y~}{xt|}yz|~|uniffjqzzpmvyrnmllqwrltplxxwwz{ywvx}y}~ytqns~~tpw||{{|}}{yvvz{xtqnnorw|~y|{ywz{qs}}mdmz}tqrrpmjjnx~umu}{}zttz|~x~ztnifgjqy~vnszvpnlknvvnp}wlr}xzvxzzwvuyy|}~xsnlw|ru|~|||}}|zxvx|{xtqonorw|yz}zxww|vqxyigr{uttspmklr|}qny{}}xruz~{y~}~ysmighkpx~uov{uonllpwunsvmu~xyvxzywuuyw|}~xsnlx~tw~}}}}}|zwvx|{xtqooprv{yy}ywuv{~upwzkhr{wuvurolms|~snx||~ysuz}|x}|}~ysnjhhkpwxpu|xqnmlovvop}znr}y}vwyywutw~ww{}zupmtwu}zwwyvsqqqrsuv{yzx}yt{}wvvw||{~yp|xtvxxurqs{}st~|}}}~zsxvrpooqvwvttttuvwy~{xzyy{|xx~xkcryljmopnmmqzznp{|yrrxxsomotvtsrrstuvx}}wxyyv|{{||mnytjwrnprrqoorzylm|~~xifp|ytqquvusrrrsuwy~y}}z}{zzyztiouju}ojlnomllow|ujm~~uijw~xuuyzxutsttuvx|yuyyw{yxx}|tx~ohsypspqsrpnnry}tjqyx~{wmdix|wtuxyvtsstuvxz|z{{{yxy~zsx|mkxpl}ymkmonmlmqyzoit|~~yngq|xvx{zxvuuuuvwy~uw}|v{|xwvy~~urzujnrwyqprsqonpv|xll|yuy}zwpefszvvyzyvuttuvwy~~y~|z|yww{{su~~qjutlz~pkmoomllpwzqiq{{~zogo}zwy|{ywuuuvvwyvv{|vz|xvux}}trzvjn}syzrqssqooqv|xlm|~wty}zwpefr|xx{{ywuuuvvwz}x}{zzwvw|yrw}okvtp|olnonmlmryynit}y}~xlgp}{{}~|ywvvvvwx|{tvzyv}yutuy~yru~~qiq|uvqrssqopt{}sjr~ytv}}zvjciu~}{|~|ywvvvvwy|xx|~y|xvvz}uvvkoz}q{unnoonllpw|ujm{~yy}shjs}~~|yxwwvwwzwsuz}vx{vtsv{}vrz|nkuz{urstrppqw}{plv|wsx~~{thdkt}}}zxwvvwwy~~wx{}zzwuuzzswtkp{}tuooponlmqx{sjn|}xy}rhjs|~{yxwwwxzwsuy}wx{vsruz|ury|okt{{wsstsqpqw}|qlu~{vrv|}{uicis{|yxwwwxy}wwy~z{wttx}{tt~xlnyu|zqoppommpv{wlkx}wu{}ujhpy}zyxxxxy~{ttwyv}~xtrrw{xqs}tkp{y}usttrppsz}wmo|~|xrqw|{wodenx|zyxxxx{|vw|{zyustx|wpt~~rlr~}uxqpppomnqx{sjn|~zut{~zqhis~}{zyxxxz~zsuy~wv}}vrpquyunq{|rlsx}usttrppsy|vlp~|zvpotyxumdfq}}{zyyxy{}wy~zyytrrvyunqz}smt|tzqpppommpvzsko~~|xrqw|{xphkw~{zyyxxz~ytw|}vv}|uqoptwrlpz{qnx~y|uttsqppsy{tms}{xsmmtxwskejw}{zyyyy|{x{~xy}vrpquwqlr{zqp{xwwqpqpnmnrxxplv}ytorx{yuliq~}{zzyxy|vuzyty~xronqutmlu|wotywtttrpprw{xop}~{xtmkpvwuofhs|{zzyy{~xzyx~~wrpptwrloy|tpx{vzrqqpnmnqwyrls~|ysnpw{zvmho|~|{zyxy|wtxytxxrnnputmlu|woszyuutsqprx|xop}~zxsmkqwwunfgr~}|{zyz||wx~xx}vqoptvqlr{{royzzysrrqonotyxplv}{wqnry{ztjhp|}|{zy{|ttx~wu{|upnnrvrlpy{snu|wuutrqrv{|smt|yuoknvyxricju~}|{{z|wux{x}ysppswunpy}unr}zvssrqoosx{tlo||ysnpw||xogis}~|{z{}xrty{vxysonpuuomt|yonw~}wvvtsrty}zqnx{xsnlqxzwpfcku~~}|{{}~utxzywrpptwsnr{|sms}|wttsqpptz{slp}~{xrnpw||wnfir|}|{{~xrsy{vx~zsomptupmt|ypnvxwvusrty}{rnw{xsnkpwzxrgcis|~}|{}wtw{x}ysposwuopx}vnq{|zutsrppsx{wnny{xsnmtz|yqhgoy~}{{}|trv}wv{}vpmnrurmoy{tnr}~{xwvtrsv{}woq}}yupkkrxyvmeeoy~}{|~|uuz~xx~}vqnosuqmqz{sou|xutsqpqty{tmq}~zvqlmtz{xogis}~|{{}{tsx|vu{{tnlmqspkox{tpv}{wvusrruz|vos|xsnijpwxvnfhr|~|{{}}vv{}ww|}vpmmqtqlox{uqw{ytsrqopsxzunr}xtojkry{xpikv~|{{}{tuzztu{~zsmklprnjoy{urz~zvutrqrv{|upu~zvqlgjqwxumgkv}|{{~{vx~zuw}zsnlmqrnkqz{ut}|}wtsrpoquzysoxzvqlimuzzumjq|~}{z{wtx|vsw}|vokjmqpklu{xsv}~xvusqqty|yrr}~|wrmhgnuywpiis~~}{{}~ww||vv{{tnllprokox|vsz~|yusrpoqtyztpv{vqlhltz{vnjoz}|{|xtv~}vsw||vokjmqpllt{xsv}xvusrruz|yrs}~|wrlhhovywphir}}||~|vv{{vw|zsnlmqrnlqz{tsz}yutsqprw{yrpxzupjiow{ztkhpz~||~}usw{uuz~{tnklprokoxztqw|xwutstx||upvzupjhltyysjeku~}}~wsv~xw{~wqmmqtqmow{vpt~~}xvusrrvz|vpr}}xsmilsz|xngir|~}~yrsyyux}~yrmlnrrnmszxqqy|ywvttv{~{sqyytniiowzxqgeku~~~~usw}xx}}vpmnrtqmqyztpt~}xwutrtw||ups}|wrmilt{|wngiq{~~yrryyux}~yrmlnrrnmszxrqx}yxvutv{~{tqxztoihnvzyriejt|~vru}~xw{~xqnmqtrnow{vps{~zwvtssv{}xqqz~ysnijqy|yqignx~~}tru{vv{~|uollprplowzupt~{xwutux|}xrt}|vqkgiqxzwoggoy~~|tsx{vw||uolmqspmqyztqv~yvusrtw{|vqt~|wqlhjry|xpiir|}~|trwytuz}zsnkloqolpxzurwzwvtstx|}xru{upjfhpx{xpiiq{}}~vtyzuuz~{uoklorolpx{wtx~~xvtrqsv{|wru~{upjgiqy|yqklt~~}}|tty~xsty|yrljkoqnlqy{vu{~yvusrtx||wsw~ysnheiqy{wojlv~}}{uu|~wtv{}yrlklpqnmrz{vv}~{wusqqtx|{usy~xrmhglu{|wokpz}|~xtv~ztsv{{uojjmpolnu{yux~zwutrsv{}ztu}}|uojegnw{zskkr|~}}~vuyytuy}zsnkloqompz~~yusoosy}{tnow|}|}}sicfszqlq~oqy}zwxxsmkr|nbcpywl`\gwysysmlmpuyz~zytsnb]Z\ckoqvyni||zuttw~tsq~zyurrtqcYo{~z}vwz{nnpohn~ozwt{y~wxvoctwuyv}}ovqwzoqtzrfeq~wymn{~yeopkwb]czzzxvyxt|~uq|xwnoXWVgxojdhngtqxy}z}{zwwlukb[^tx~xtr~~{o|vekepwyx|}yzr~yqqkz}|}t}|zowufvuzynujpwptiprmkoeo}q{}~vxwwrv~qkl^bqfo}mnohpxxzt}~v~~}}spyihtejvsz|rux{oz|o{{zwlwwo}t|t{w{}~|vz~x~y}}itwjz~{}txtk{xn{qzpknjiyuszx}~xvuxryunwromfongwpakdeqw~|}~~zxzyipkWdjm{z~wv|qmynysyvpyvwpt||moxr|w~pvvnw|og}uwxs}vs}ngqhlnopvt{yp|zwns|{stppqnk~ymvnlur}yuuwu|u~||w~{~~{xkuucipo}y|sv|wsm{rtxvvu{}{vxut~uytu{}|xmxwo|yvxwzzys}ovsoukqrnl|wx~xxyilslsw}sptmcjpfw}hklpy}q{{}}w|vjbi]cwoo{{y}{w{rzymvvtvsyy}u~x}vppxuy~~ysx|x~sxuz}vv{umqsgx|ghfhvsp~|xskwtyyz|~sqjvtknzzgv}}z|z|w}t{{ysvnyzohutrufttwz|}z}v}rw|puyvpvvtyut}z~xwysxr{{|qqsi~ssnq~xqz|qg{{w{tty}{}vqsdo}lilrxvqnzqrsqztnxv{~}z~w~zuwusxqjridjj{}x~y}wpvnozlnhvzuu~w|vx~|~w|}}ny|}}x~wsz}xt{znsnvukonrxw~wxr}|v{|il}xxusxpyt|wz|puv}{uvuov{z|z~zwwuqvjqions}yuruszxvu}{xx{tzy|w|v~xzo{{fdbrrxwfkjs|}po}vetuuhpvvw{vt|y}rpyuzwz~vur{u|}}xxyocrxrmw||put{}xwzuknt`ffc`zt}|t|uro{}xov||z}{yzmun~qryy~u~q{r|{{szyt~olspmt|sdn{ywxz|mmvzobdy}vgiwwnywnx{tsxs{wxz|xp}w}sunhvurklw{u}{~}rnopkw~yr}ylv}q|zqwknqptsuv~lwqpwot{zysw~||}~w}q|gcdavxy}{sxswrtq{xvqxyzw{}sy|{uw{wz}sueku{s|}}|}mrlqsnkrrz||wszz{}~z{tisnu{vvqyxztzw~sov|twtux~}yztvkljruvwvz~w~stx~yu~xw~t{y}utzm}}~w||xwsy{qvbryx|oz|}wssuxxnn|vyy}t}{u~~suteolm}nw{{|~}uwwwswx{yvu{zwp~~wzv{z}x}{tnokqrrvu}yuvv~qvnsyv{zv}s~~z{qxtx{v~{kj}zwsp{||~{rul}mmrtq}tv~{z}~t|}uyxopmi{rru~}~|~v{yxz}y}}q{vumw~tvs{~z}~z{yrnoprotst|~|vswszqvz}y{x~st{~z}twvt}u||jlyumlyvx{|vtts{pmwvvs~w{~tx{zlojk}lkm{|~~zzywyy{yuw|}up}wqso{}~x{~urqvrsout{ovyz{zt{{wxwu{yrvw~}}|{uw~ws}xzl{xrmqxorxwwrqor~{p}xq{w}xw|rqmi}thgq}v}~|z~|~~}v~{qwxpnmv{ux|x||vtszwvqrsynpy~{~wx}z|ux||suxzx~~}{xvt||m{zunothin|yyxyttor}vwp~{~{|y{|vrpk~vffnunuz}w{q{vpqjwtpuw{zwxxyswxymnx{qx~|}x|zwuv~yuv{ywy||y{vv{{r~urttfgnvppu}{ysq{}yrv}zw{x~xv}|vuqrrjhtumu{q}y{x{rnlyrow}{ytpu~~zgfq|vxwnknryr{ypljrnq{upt~qy{v{ysyyztw}vv{wleuy}vxwqlyytolqpqzzwnuvrkhhumkvnnyu~v}~~{}}zf|gipzto|zzsr||rprytgymvyjm~zwvumq}{opzmz||zuvtv|wyq}vwqfmt}wn~v~}}~}x~tsmwsnq}{~yynoiifcsvos{wyzvz}wvy}~zrnrrym~|vv{}~wzyi{}mnlqtljq|{~~wxq~{{~u|{{~~|}tz}rzwvtnkytcqpcrpo}{~yt~~x{ov}mu{vr}~~xmyqwvy{rfvzpw~~zy|r|onmkv{||}~~{~x{zzwju|er|nupit|t~z}}~zw}xsxq|w}yy|}z|~pnwnnruyzmvlw}vwv|uuyv|xsvmy{y||vwkvqo{rvpmsznx~vw~{~}vzwqyz}}xuz~~zywytttxzlpubdkhuux}uy~{}u|w~to~y{|xzywquxsvrjinfqvz}|~trzuqyzy}x~z~{w{z{sys}yyzhwvyxqptsyw|}xo|vp|sxo{{t{xrxzotvyv{pyygpyrwq}x{w|z}}vwu|qr{qy~|svvn}osnlwtjryq}tl~~zxxu~{oown}zs}vy~uxvszkesmnnrx}z}z~|yz}~n}uy~~y~yy|zpzwnfkanmhon}~v~{|{z|~|t|t}z}{ww{x{x~mxywpmtqqumz{py~sw~prn~}uttzw|w|zy{z}t|wnwtuskwurozs{||}{}u}|pwsx{{~}v~su{oolzzqm|z{vdsz~|{v{upvmozsupw~|zuzt{wmrorqqtotp|xsyr|}zt}zs|yxyr~|ukrlk}tdicqwsr|{~}zsxs}~~v}{zz}v~su|tpwviolsuiptv}z~|xtupz|utt||~}~y{z|qtzy}lprpjjniswxz|zwuyu}v|y~~~}|}}svqotysy{qgz{w{srrty~{}{uxmwvmmn{}z{pzsnnjrlrmhqv~}s}zyt}rutvr|}|ywxwshquw{r}y_n{}rrpnwvqecu`q~|l}akyuxss|{znwwyvlzkf{yrqipsytovzxzzjqw{xsyxuqbvmheqpuq{xiupvnijtm{{xvtw{trlpr|rvtzwhpsynr||oiOkk{zfmqpsojpjrX^fnziaioiwyv}w}t|sfmbjlqut|{z~~tqrt{yw_iZfyxs`kmfmbhUgk^qlqvxbiu|~us|quw{k|dhontr{}zztq~tsg]ohh{w`fxgecnhonWnsmxvekz|ivt|ltry}vi|e_txuo}|rzikg^n]k}}tkx{e`iqdsc`qmiopbs}pmwzmxsz}}vk}pZbr||}x}u}||}refdck^r|{zotdiim\l\ewgeohfr~qr{{hzswvyzot|h[n}x}~}uz~u}~}}hfk\gil}trzghln`ai[lqiisemzvmz{spz~}uxwzzixwhix{u}}~v~yz|t~znleZljxlxufljo]pebwidnlbo~rp|v~|m~xtu~pjztfs{y|w~{}}xyturmg]fhjyvnnonben[lsghk[gvzpx{yoqvo~~uhywhftwy{|x|}t~r}whf__n`w}~uvlmon_oYcskij``w|orxi~|rxwsgt~lcpux{~s}}}t~o~vjgb^f_q|}~hpmrco`^xncibcv}pl~{h~}tzuuir|qeowv{~}w}y|~rvzokh_h]f|xmsrwckg_xrcdgar{tl{gw|yrxtnmvejstt|}z}z{~zs{pmia_b^yrwvyxnbr_pyfdg`hvxmv~ynn}u}|rphv{ogqprv}|{y}{kvvmkc[bYpxvv~xxeohdxocge_pxum|}~i{|wsvshj{tjmqqu|~{|~zx}ukvqng_^c\zp}{|ysdt_lyjde`gv{qrzrl}}}rytpes~rhopuy~||||}}~kqvmjc]d]fypy~y{ljp`vxhfg^nxykv}jo{r|rlfy{lgpsw{|}~z~|jrqjfc^d\n{txzjnka{uheebryvjx~ht~|tynji{ykkrtxz|}~}~{||~}grnje`\b\uz|y{gmke}tfecevyxj|{gw||sxogiywkktuy|z}{~}}||y{elkgea[c^x|{|gmlf~vhgfduyxmz~|jw~~|q~yoifvwlltx{z||~}yyvybhjgca\dc{~z}inme~viheeuy{my{jw~~{q~ymggwynnvx}y{|}~}}xutu`jifd`]fe}}gqjivjidixyzl{~xjx~z}ypwmehxvmox{w~z~~zxxqto_igdc`^gh~}gtfrsjhcoz|ul~}qmzz|utqjemztlsx}||zyrvlvebiedb_dft}}tjrf}oigfwx~or~}kr|{z}q{|mheuzqnwz~yz}z~{rqms`fgedb^gfirkoxlifo{{yl{}}tly~y|ystlejyvnsxz~{{zupujugbifec^adtzvltiqkiiyy~os|zkt{{y|q{|mhftxqovw}yy~vurnop_hgfd`^dg{kvkxwmkhvz}wm}}}ooz~~w}suqjepysosvz}{x}w{zqpksbghgd`\ac~z~nwot{olit|}zl{|}rmx|w|xsukemyumqtw{y{zwosiuffjgea\_`w|uvutqrnjp}{~mu~}vlwzxy|qzmgiwwonsuy{{|ysqtipmcjhfc^\_ipqznxoll|{un}|{nry{t~twqjfsysnrswx|x~uzxqojtdhigeaZ^`zuwvyuwtplv~|mw}|tmwzuy|qylgjwxpostxz||x~rorhnmbihgd^[^hot}r|roo}|ym{|zorx}|s}vusjfpyuoqswy~~y|}}vs|mpergeigfc\]`s{pw{tyros{sq}{xntxxt~rzoigtzsnrsxy{w}}suummeqefhgfb\_bzyu}zzwyspx{pr}{vnvwuu}q}}mhhuyspstz{{w~~~ox}qmheobfggeb\`e~w{||yyxsqz|os|{unvwsu}p||mgivysqtv{|{w}~|nu{okhbnbeggfc_bg||}{zyztrz|qs|zvnuwss}p{}mghuzurux}}{w|~y}mqy~oig_mcdgggeadj|~|{y{us{|qr|zuouvqr}p{|mgiv{vtvy~~{w||zzksx}kjd`laeghhebfn||~z}zus~}ot{zsouvou{n}zlgkx{vux{}~x{}z{viu~vzhj`akaegiifchtz{xyuvnwzyqruwzlxxpujgozzuvx}~y{x~v~oi{xxsei[gfbghiieekx}yyv{|xozyvott{sn|qvpiit|yuxz{xy|uxin|txjgc\kcdhiihdhp~|}xwpuzysquu|lvzo~xkgmy{vvx|{{w~v{}ngywurei[fhcgijieek~w|zx~}yozyvpus|qo}qwpiiu|xuwy~}|x{zzutgq{swgi`_kbfhiifchtw}}z|owzxqttxvl{vrukhqzzvwx||}yx|twhm{rvkhd\keehiigcfow}{{qv{yssuvzkxypxlhoyzuuvz{~z~v}t|yjjzstnhg[igehiigbdkzu}|vs{zusvt~mt~p|}oilw{wuvy{{{w|wv}ofuwrsgk]ckdhijhdbgwo}qz{ysvtysm}utuljszyuvwzy~z}x|s~ugmzqtkjd\kggijifbensx~vt{zutvt}lv}p}}ojnx{wuvxzz|v|wv|netvprgk]akehjjhechwn~rx{ytvtwul|wrwmjrzzvvwzy~~|u|syvhhwqqmihZhifijjhdel~zq~rz{xtwt{po~swslku{yvwx{y~{{v{qz}sejwnpjidZiigjkjhegpwv{szzwuvs|~mq~qyrkmv{ywxy{z{wwyq{{odlumohja[khhjlkhfjtt{zszyvuvr||lr~pyrlnw|zyy{|{{wvypy}yncjtkmhiaYjhhkmljhlvx{{syyvtvr{}lp}pxslnw|{zz|}|~zwtyov{xmbhrjkhibXhjilnnljnxz{|syyvuuqz|kq}pxsmox}|{{}~}ztuwnwzvk`jqhkfi_Zjijmonlkp|xxtyyuutq{yit|oz~rmqy}||}~~|qvtnwyth`kogjfj\\kiknpommtvuuyxuvsr}tixxo~{pms{}||}~~}~}pxopxwobaojghggWcljmopompxwswywuvqv|mm}rtwoow}}}}~}~{trwmswtj_fofhfiaXikknppons~yyuyyvvtq|wiuzo|}rnrz~|||~}oxpnvunbaniehhhXblkmpponpyutxywvvqw|ln}quvopw}}|}}~}|qtulsvrg_inehgj^Zkkloponnttwvyxvwrs}qk{vqzqou{}|||}{}urwmqvsi_foeggkbXillnponmr}t}{vzzxxtr|vjyyo}|rosz|{{{|{xpxooutkadogehkfXemlnoomlpyvuvzzyxvqzzkt}pyupry||{{|{{pwslsuodalkdhmqel|{z{zvsqw|kx{{}|zysvts}{{y~szypv~}vtxmnspg`hn`]aroaknnqrqonqzowvuslqrrrplwuiu|p{vqrx{{zzzxv{y}{{vpvjWVcxpklc_```_bjvsc|u~}{}}}}wyyu}xssr}{snzzqsx{~slulkpof\^f\[eqshszwwwvtsv|xy{jjkkjjekqehvln{unntxywvtrnu{}{{|vi[\^TXfwwp|~wsojecgpvfixr|~}yxytmhpw~zyywzr{}z}~|losiknj`X`d\bmxqjy|zzzyww|x}~pponmjfnpdmvkr|vqqwzzywtqpy|}trrk]SX]Wbqzq~{xtpljnvzhozt|}}yyzupkiuyxyv{rz}y|}|lmshhkh^W^e`fs}vkx~~~~}{{}}pooonkfnqfmwmr}xrsx{zyvtrr}xz{nmkdWPY`^jz|s}zwspos{|iuzv{~|yx}~{vqmjn|w{vyxt~|z}~wippgijd[Xcfcnzso}~zw{ypqqpoiisnhutly|vsuy{ywutrx~t{rije\QUaafvv{|xtrt{rkt{}}|~}y~{}}~~{wrnklxzz{v}t|~z|~{kmrhgif]Xaidkxyo|{wx~sssrqlisqitvmw~xtuy{zxutqv}szsihe\SUaaduy}|xuw}rktx}|{}{}~y{~~|}}zvqmkkw|~|y|u~z|~xjorhhie]Zdhclzwrxtxvuutslmunlxtn{}wuwz{ywurpwvvzoiicZT[a]fwyzy|}jtzrz}zyzz}~{zz{~~~}yuplhmx}zx{||~}olumhjha[aibdr}q|z|xv|~|}zyxwqlsultyou~{vvy{{ywtpqz~szwljhaXW`_\i{z~}}vits{}zxxzxy|}}|~~~|xtokhowz|y}}zlnulijg`]ehafuzrv}~}uu}||}|{yrnvunvyov{wwz{{yvspqy|~}rywljhaXXa_\izz}xjury~~|xvvxw~y{~|z~}}{xtpkhmvy~~{~}|omuohjhb]cjcdr~s}zy}~{z|wqy~z~}{votyqs|rr~~ywy{{zwuqpw}}stynhgb[W^c]duzosru{~}yvuv{xw}x{z|~{{zxuqmijsz~|~}wkpukhie__hjdjz|vv{zwvzppz~~~~}{uovxqw{qt~}yxz{zywtqrz}vnke\Zce`jz|pvxisxtst{wwsnwqnorssqnkikv}|~uyylpvniie_^gkek|zky|mgegkwvggt~}~|||ztmppit||{z{||zxvtv|us_`bXTTRNP\a_j}{}jsvp|}xuv|vzssnlzoihgedcaagt{}{xtzz{{pvwnkkhdhstp{kvvw{phejri]et{x~{yxwrigooq{~}{{ut{{ynpgZWTOMU`^aqw}mhtw}yw{|x{rgippzyuqmjgedfpy|y~zsz~|tvzrlljghrwrx{fn{v{soqyrcft|y{}zzxtlhorr~{~}|z~}st{{}twob\YTRYb`aqw|nitu}yx{|x~ypfiooy}xtpmjgehqxz}zzu|~|uy|snmkhkuvqyudrur}|vrv|qdjx}x|}{{ytkkrqs~{}{z}{rwzx}|{|pea\WW_c^dv|uzirzou}zzx|}wlgmmn{~}xtplhgltvxz}}x{{{zyzqomjjrwqs~ij~xkp|}yz|kit}yv}}|yqkqspx}x|z|~wtzxu{}~phd^Z]db^j{uvsi|snu~|{}x|tjjnlozy}{wrnjiouvwy{~}~y~{{z}zsqnkluvpt~yfm~uiny~|~}lmxzw~}}yqmstry|w}{}}~vtzwuz~tlhb]agd`k{uutj|uns|}{}x~{tihnmoxyzzvqmkpvwwxz}~}y}}{{|~urplmtxrs~|hg{ykku}~rmw~x~}}zsmpusw}x{||z{wrwyvx{pkfaahicgw|s||kqqqy~||zz~|zuleinmu|y~zuqnouyyyz|~|{y}~z{tqompxxrw}sbk~vlp{}{~oo{~{||{xpkqvu|z~|~~vwspwzy|}yojfbdklfk{}u~yjrtu|}{{z{zxuqhchoqz}~zwsqrx||||}~z|zxy}{tqompyztw}~qai~|ru~|z}po|}{zyvokqxy|}zrsppy}}|wnjfdgnnio~wviuvx~|z{y|}vtqmebkrv}zwtsu{~~}}~~~~}x{xzyytqoot{yt|}yi`q{uz}zzzou}zyxslmvz}|~~|~rpqnt}}~tnjggnrmlyyz}mm{w|}{z}xvsqmgagqv}}zwuu{~}}~~~~~xzyyz~}urporz{tx|~zm`l~uw|{rt~|vmluxzx}{yy|~}|usuu{}rfdtws{{sw}no~x{~}yvv|yqx{romkeaisyrhszpnpruvwxy{uxxz{xuplo{~{ldux{lit}zus{{sqqqmhkux|}y}xuz~}}uuvvzoebku{qt}~~|odp}qpuy{ywvw~zmp|xvupjku{ypjmyyusrqrw~{qqssy~}y|vqmjkt{zxjqzx~|ieq~zzupoolgemsuzztw|yvu{}xzy|ulebhqtxxiexvmnswxvuuxtlu{xxupkoy|{uolo{|zxx~{rsst|}|~|w}~upljmvywvjuwv{~~xhgtxrqqmggouvzyrw|yvuz}xzy}tmfdiqswyjfxxnnrvvuttxuls}yxvqlox}}|vpmpy|zz~tstu||~|wzvpmjltyw|zlp{uy~|{}{kfq~}usrpjgmuwz{ts}|yvux~xyy{vmgdgpvw~rfosnptvutstz{nm{zxwtomt|}|wrppv~|z|{stux~yu|{rmjjox{yukwzwz~~{xx{}tghw|utsojipxz}{tu~|zxvw|~}xyz}}|piedkv||~rgruoruvurqsx~xln}yxwtonv~}}|xurru|~|{||ttuyytzzqlijq{|vlv}xz}}{wtsvysgj{}vtspkjry|~|tt}|{yxxz~}}xyz~y}wlfdfp|~qhuupruusqprw|vlq~ywwtopy{||xutsuz~|{~ztuv|}vtz}vnjilu}rn~{xz{zvspquwnhr{vusokmw|~yrw|{yyyz}~}|~{xz|xx}zphefmyxkn|rqstsqoptzyom{{xxuqou|x|xvttvz~}vvwz~wrx}xpkiks}}umz|vwyxurootwqho}z~}|tknw|}}~~~~}|{}~}|zvrr|wsux}x{zwwx~||~znq~tsvxyxxyxt~xvurlipy}xx~tz|sqsx|uuw|zx~wtrswztmw||ok|{y|zx|zts{xutspmq{ztz|xw{}||{z{~zy|qhkwvs|zqu~tmyyssutrompz~~~}zvyvuxyz|wwyxvuttuvvx{{xy|}{xsr|}xwyz{}qvqedjs|roy~y|~z~|zxtnmsyz|{w}|rnlow}|yqlkmrvspy}zxkl|||zxwy~~y~skhffkxyrv|~~}|{{zxwx|~}|||{zz||~}xuw||zy}~zvtw|vmmnpoopu}w{v|{jnx~}vwxrnlnt|~~~xy|z{zvqs|{vttw}}x~px{qoquvvvy~~v{zv{ummrqklsx{zsou~~||}|}{vsw~|slgegnst{|wvz}wmrzqpsuuuux~yytt|~xnjottrpoptz{wurpnnpuywtx{}wtzvhb`_^_dn{{y{||upryysoquvtsz{qq{}z|{sqrtsv~~unkkosqlp|yrt|}{|voyzvy~~wsuxwtszzw{~}{ywvutrqswzywvutrpoosz}yux|}wtv}vomkiffjqvsklx~z}~vpqwxtty~}|{{uoigjt~yupihnusmihjpuupr|zpqxx|z|~|y}}z}}ukhouxxxxxwvtstwyxwwyzzxwx}|xx{~|x~wwmjkjihimtxrjlx|vz~}~{|{{ztomov~zvpjjquqljlqy~|x}~wz|ywutsrqt|~tnsyzy{{|}rijqvz|~~|{}~|zyxvtuz~|{xy~ytw{||~y{~qllopqruz~ur{}ww~|{{xspt|}~|xuqnlnu{urx}{uqoqv{{vywx}~~tq~|||~~uorxzxy}}sry}~~~}|{z|~zwurnkjnv}y|{yy|~|ysvyz{~{trrqopsy~}ur{}|yrloy}xu{~zvtrpqu}ysry~zsomnruqlpz~wrxzw}vuvwwwyzzw|~{stz~~}zxwtrppty|}}~~|zxx{|{}~yx~~yvx}~|ytrpmkkmsupjo}zvy~yvwxwuy|tv~}zvssw}vnimturoosyzzxv{yt}xttuuux}}wx~{y{~~}znlry~}{|~}zwvtsqqsy|xz~}z~~}{}x{}vuvwvvx|wrx}|ztsz~{vtuust{~z~~{wsqptz~{wyzw{|uomnrwvru|tu{~~~wv{{{zz|wprwwsquz}zw{}{zyxvuw{|{xvusqppsz~|{}{{}|zrty|}~{wuspoqv{{tot~|z~ytt{}{{{yzx{~}zxwvuvw||uqu{{uollpuuqr{xx~|wzyyxxx|yw{{~zz{||~ysv{~~}{zywvuw{~|{zxvvw|||}xv|zutv|~{~~{}wtsqoorx|yrs}zvy~{zzywzvrw}~{wtqprx}xrrx~}wsrsx|zvy~wx~wtwstuwy|~vqt{}{yz|||xuz~|zyz~~|yxvussu{~xwz~}z{z|~utx|~~|{yxvtux}|tt}}}vqt{}zwwwvvz|~|xurpnnqy}wuz~xrpquyxtv}zqqv{~|{zzyxy}{zzsnr{zvy~}|zxvvyzxusrqqqty}xy}xvw{~{vyzrsy~ywusrsv{}wopy~{x{~yx}|z|xv|}{}~{xvusrtyxssy|xqlkmswvu{~y{yyzwwvvvx}}x|ztsy}tsw{}|{{{{{{{~|zxwutw||}~xvz{xx||zvrv|}vsrqpqv|yw~ytv~~}zxxyuy~{xusqpqu}|ww~|wttx|zvx|tuzxv}yyyyy{z{yrpu}}~}|{|z~|zyz}}{xvutrrtz{||y}{wwy}~yw|}torx|~~|{ywvy}~vsz}|}wru}~}}{z||x{~|{}~{wsqomlns|~xw}~xrprvywtwyst{z{}yxxwwz~}wz{}{upqyyy~~}{ywwz||zwvuutuy|}xx}|vstwzxtv~{ttz|yxvuvz~zsu}|}xw|~|{xx}wv|}|zz}~{yxvttv|ywzztqquzzwxxw{yv~xvuttuyyy~wsw~}|||||x{~}{{||zxwuuvzyy~}xux|yx{}{ztv{z{zxwwz~{v{~zuv}}yxutu}{ux~|yvtrqqtz|{{{}wtux|zwy}vv{{ts{zzzz|{{zsqu||zyyyz|}{z{~}zwvtsrsw~|wx~z||wvx|}zw{wrty}{}{yy{zuy~|~xssz~{zyxzzz}{{}}zwtsqppsy~||z}}wssvyyuu||uty{x|zyxwx|yw}~}{uqt|~||{{{|}{ywx{}|zyxxwwx|}z~}xx}|wttx{zvx~{tsx}|||zxvwz~|ut|~{x|}{xw{zvy}{z{~}zwusrqrw~}|}xx}zutuz}|y|xy~wwywvuuw|xx~~ysqu}~|{zz}x|~}}}zywvuw{{y}{wx~}xuvy|yvx~xqqv{{{~|{zz|zy}xuy}zxvz{wz}{yy{|zwtrpooqv}}}}}yvvy|{wy|vuzyw{yxwvx|~wv|~zz|~{vpot|~~}~{z{}~}zxvuttv{}{{wx}zursvxurtz{tnou|}{zyz~}ww~|}{vv{}zy}xuy~}|ywuvxyvtrqqqrv}~z{{vsuyzxvzzuw}xz}xvuttw{~xsu|~{y{~|wsu||{~|zy{~~|zxwwvwzz{{vtx}{vrqtxxuuz|urv}}}{yxy|zw|~~yvy|ywyysu{~|zyy{}{xutsrruzzz~xuvy|{xz|vv{wv~xvuuux}}wx~{{~|wrsy}~}{~{z|~~|ywvuuux~~xy~yw{zutvyyvty}zsptz|~}{z{~zw|~}}wtx}zwvy}wz~|yxxz{yvsrqpqty~||}xuvy{ywyytu{~xz{yxwwz~{uw}|yz}}ztqrz}|}}~|zy|~}zxvuuuvz~z}|xx||vssvxwsuz|vppv||~~|{z|~xx~|~{ww}~{xyxw{~|zwvxzzwusrqqrv}|~}{zvux{{xyxw|xw|xwvvw{}vuz~zz}}xsrv~}{yz|~~|{}}{zyxxzyy~yvx~ytsuxyvux}{upsx~|x}{z{~~z}{xz~zwux}vw|~|zxxz{zwusqqprv}zx}}}}zz}~{}~xx||uv{xwvvx}}wv|}zz}~{vqqv}|zxwx~}~}zyxwwy~~ww}ywyzustwxutw|zsoqw|{w~~{}{wx~}zvuwxw|}{ywvxzyvsqpooqu{|y}~zy{~}{{xvz~wu}ywvvwz}wtx}|yxz|{vrpt{}{zz~||}zxxwwx|zwzzvv{{urrtvusty{vqpu{{|~}|z}yw{}yvuzzuw|~}{yvuvxyxvtrrrru{|{~{xy|~|z|}wx||uvzwuttvz~{uty}|yz|~|wssx~|z{~~|}|zxxwwy~yw{~xtv{zussvxwtv{|wrrw}{|~||~|{}xw{}yvuyzuw|~|zxvvyzxvsrrrru{~|}~|yy{}|y{|vvz}vv{xvvvx||vty}{xx{|zvrrx}{|~}{|~}{xwvvvy~zx|zvw|zurruvtrtyzupqw}|~}||~zz}~{ww}~{xx}zvx}~|zxutuwxvtrqqqsw~~~|~zwx{|zx{yvw}}w{zwutux|~xsty{xvxz{xtru|}|~}}{z|~~|zxxxxz~zz{vux}|vrpruurrvzwrpt{}|}|{||y|~~zy|}ywz|uvz~~|zxuttvxwusqqrsv|||}|yy{}|z|}xx}~wxzwuttvz~~yssx{ywwz{yursz|z|}~|~~|zyxxy}yy{vtx}|wrqruurrvywqosz|z~}}~|~zx|{wvz{uvz~|zxuttvwvtrqpqru{}{~}z{}~}{}|wx}{uyzwutux|~}xstxzxvwzzwsqt{}{z}}}}{yxxxy~{wyyuvz~zuqqsutrswytopu{z}~}}{xy~|xuw}xux}}{yvtsuwwurqppqsx~z}|{|~||~xw{|vv|xvttvz~~zusvzywwy{yurrx~{yz}~}zyxxx{wv|}wuw|}xsqruutsvzxspsy{x~}~zx{~yutw}vvy~}{ywuuwyxvtrrrruz{x|||~~|~}xx|ytu{wvuux|{vuy|{xy{|zursx|ywy~}zyxxx{}vu{}wux}zustvwutwzysprx~yw~~zxz~yusv~xwz~}zxvuwyxvsrqqrtx{wz}|}~|}~xwz{ut~~zwvvx{}wtwzzxwy{zvrqv}}ywx}~}}{yxxxz~yvyzvw{|wsrtvustxyuppu{}xz~}}yx}~yvu{|vw{}{xvttwxwtrqqqrv|zx~~|{}}|~|xx}{uw|xvuuw{~~zuswzywwyzxursx}zxy}~}{zyyy|yvz~xuvz~~zurqsutrtxxtpqv|}y{~~}}zz~zvv{{uvz~}{ywussvwvtrqqrsw||y~~||}~|~}xx||vw|wuttvz}}ztruxxvvxyxursy{yz}~}{yyyy|yvz}wtuz}}ytqqrtsqswwspqv}~z}~~}|yz~yvv|ytvz}~|zxusrsuvusqqqrty|{~{|}~}|~{wy~yuyzvtstwz}|wrruwvuvxywtrv}|z}}|~~{yyxy{~wx~ytsw{}{vqpqssqruxvqpt{||~~|~}zy}{wuy{utw|~~|zxvsrrtvvtrrrsux~~{~|{}~}|}|xx|{uw~}}~|{}~yrmmtvsu{~}~yuw{tpoqv|~{xwz}|tos{vuuvx|{y||ups~ojkqw{||||{{{|wrrx{wux|~{yz}zolwunklnrwz{xvx|~ztpovxvy}}sor{uoorvwvsrtvyyy{~|||uooy{yxy{~volpz~xvwxxxxwwvvwy|}||||||~xqpu}{{}~}}vnls}ywvxyzxuux{{{|~~|}{uqps{||~|snpv|{||{xutvxyxy{}~|{}~ysps}}|{|~yrnnt}~}{zyxwwxz{||{|||}~}wrrw}||~~}~{tnnu~|{{|{ywwy{{z{}~}}zvrqtz~~{sppv}}~}|ywvwxyyy{}}|{|~ytqt{~}~ysoos{~}{zyxxxy{{{{{||}~}xtsv|~{upns|~}}}|{yxy{{z{|~~}}}~{wtrty|uqptz~}{ywwyyyyz{}|{|}~{vssyzuqoqw~|{zyyyyz{{{{|||}~{wtuy}xropw~}}}|zyyz{{{{|~~}}}~zwttw|~xspqv~~~}{yxyzzzzz|}}|}~}zvtu{|wspptz}|{{zzzz{||||}}}~~~zwuv{}zurpry~}}}}{zz{||||}~~~}}}zwuux~~zvrqsy~~|{zz{{{{{|}}}}~~{yvux}}yurqsx~}||{{{{||||}}}}}~~~|yvvx}}zwtrsw~~~}|{{|||||}~~}}}~~}zxvvx|~}zwtrsx}|{{{||{{|}}}|}~~}|ywvw{~|yvtrsw}~}||||||||||}}}}}~~}|ywvx|~|zwussw}~~}|||}|||}}~}}}~~~}{xwvx{~|zwtstx}}||||||{|}}||}}~~~}{ywvw{~|yvtssw|~}}|||||||||}}}}}}}{ywwx|~|ywtssw}}}}}}|||}}}}}}}}}|zxwvx{~}{yvtstx}~}}}}||||}}||}}~~}|zywwx|~}{xusstw|~}}}|||||||}}}}}}|zxwwy}~|zxvtstx}~~~}}|||}}}}}}}}}{zxwwy|~|{xvtstx}~~~}}|||}}}}}~~}}|zywwy|~|zwusstw|~~}}}||}}}}}}}}}|zyxxz}~}|zxutstw|~~}}}}}}}}}~}}{zxxxy|~}|zxutstw{~~}}}}}}}}~~}}|zyxxy|~~}{ywutstw{~~}}}}}}}}}}}}|zyxxy|~~|{ywvtstw{~~}}~~~}}}}}|{zyxxy{~~}|{zxvtstwz~~}}}}}}}}}}||{yxxy{~~}|{ywvtttvz~~~}}}}}}}}}||{yxxy{~~~}|{yxvuttvz~~~}}~~}}}}}|{zyxxyz}~}}|zyxwuttvy}~}}}}}}}}}||{zyxyz|~}|{zyxvutuvy}~~}}}}}}||||{zyyyz|~}|{zyxwvuuvx|~~}}}}}|||{{zyyyz|~~}|{zyxwvuuvx|~~}}}}}|||{{zyyyz{~~}|{zyxwuuuvx{~~}}}}}|||{{zzyyz{~~}}|{zyxwvuuvx{~~~}}}}|||{{zyyyz{~~}}|{zxwvvuuvx{~~~~}}}|||{{zzyyz{~~~}}|zyxwvuuuvxz~~~}}}}|||{{zzyyz{~~~}|{zyxwvvuuvwz~~~~~}}}|||{zzyyz{}~~}|{zyxwvvuuvwz~~~~~}}}|||{{zzzz{}~~}|{zyxwvuuuvwz}~~~}}}|||{{zzyz{}~~}}|{zyxwvuuuvwz}~~~}}}||{zzyyz{}~~}}|{zyxwvuuuuwz}~~~}}}||{{zzyz{}~~}}|{zyxwvuuuuwz}~~~}}}||{zzyyz{}~~~}|{{zyxwvuuuuwz}~~~}}||{zzyyz{}~~}||{zyxwvuuuuwz}~~~}}||{zzyyz{}~~}}|{{zyxwvuuuvwz}~~~}}||{zzyyz{}~~}}|{{zyxwvuuuvwy|~~}}||{zzyyz{}~~~}}|{{zyxwvuuuvwy|~~}}||{{zzyz{}~~~}}|{zzyxwvuuuvwy|~~}}||{{zzyz{|~~~}}|{zzyxwvuuuvwy|~~}}||{{zzyz{|~~~}}|{zzyxwvuuuuwy{~~~}}||{{zzzz{|~~~}}|{zyyxwvuuuuwy{~~~}}||{{zzzz{|~~~}||{zyxxwvuuuuwx{~~~}||{{zzzz{|~~~}||{zyxwwvuuuuwx{~~~}}|{{zzzz{|}~~}||{zyxwwvuuuuwxz}~~}}|{{{zzz{|}~~}|{{zyxwwvuuuvvxz}~~}}||{{zzz{|}~~}|{{zyxwwvuuuuvxz}~~}}||{{zzz{|}~~}|{{zyxwvvuuuuvxz|~}}||{{zzz{|}~}}|{zzyxwvvuuuuvxz|~~}||{{zzz{|}~~~}|{zzyxwvvuuuuvxz|~~}||{{zzz{|}~~}}|{zzyxwvvuuuuvxz|~~}||{{zzz{{}~~}}|{zzyxwvvuuuvvxz|~~}||{{zzz{{}~~}}|{zzyxwvvuuuuvxy|~~~}}|{{{zz{{}~~}}|{zzyxwvvuuuuvxy|~~~}||{{{zz{{|~~}}|{zzyxwwvuuuvvxy{~~}}|{{{zz{{|~~}}|{zzyxwwvuuuuvwy{~~}}||{{zz{{|~~}}|{zzyxwwvuuuuvwy{~~}}||{{zz{{|~~}}|{zzyxwvvuuuuvwy{}~}}||{{zz{{|~~}}|{zzyxwwvuuuuvwy{}~~}||{{{z{{|~~}}|{zzyxwvvuuuuvwy{}~~}||{{{z{{|}~}}|{zyyxwvvuuuuvwy{}~~}||{{{{{{|}~}}|{zyyxwvvuuuuvwxz}~}}|{{{{{{|}~}}|{zyyxwvvuuuuvwxz}~}}|{{{{{{|}~}}|{zyyxwvvuuuuvwxz|~}}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~}}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxy{~~}||{{{{{|}~~~}|{zyyxwvvuuuuvwxy{}~}}|{{{{{|}~~~}|{zyyxwwvuuuuvwxy{}~}}|{{{{{|}~~~}|{zyyxwwvuuuuvwxy{}~}}||{{{{|}~~~}|{zyyxwwvuuuuvvxy{}~}}||{{{{|}}~~}|{zyyxwwvuuuuvvxy{}~}}||{{{{||}~~~}|{zyyxwwvuuuuvvwy{}~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~}}||{{{||}~~}|{zzyxwwvvuuuvvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuvvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuuvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuuvwxz|~~~}|||{{||}~~}|{zzyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{zzyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{{zyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{{zyxwwvvuuuuvwxy{}~}|||{{||}~~}|{{zyxwwvvuuuuvwxy{}~}}||||||}~~}||{zyxwwvvuuuuvwxy{}~}}||||||}~~}||{zyxxwvvuuuuvwxy{}~}}||||||}~~~}}|{zyxxwvvuuuuvwxy{|~~}}||||||}}~~~}|{zyxxwvvuuuuvwxy{|~~}}||||||}}~~~}|{zyxxwvvuuuuvwxyz|~~~}||||||}}~~~}|{zyxxwvvuuuuvwxyz|~~~}||||||}}~~}|{zy}wf^]dn~|yo`\`o}xuutucZ_UO\qzkN9?]|oirҭgR{.EWŽ~^G>@FLNKDDScW>D_mqvn\TWg|tqk]afgecbdku}vpwvrs}w\jƿļppa.-Oaw{^J?<>LYM5MW;Hdtvxzpi`RU{x_x{bTRSV`vupomo~z|}okis}ƺPKE0Sr־zjebT9PU>a\KTaikszssk^[x{j{wtq|nrwmp|xll}pvtsinz_vpnCS4&@]|԰|iTcjLhRZseaeuxsyyz_wvvrruvm~kqmr|bishof{xr[cI9K1-9\ҼfqmbwVhw~~tk|{pxsnppx{e{|}saThsZN`tjuwwjmffnw|}|ovYf=?LNV\e̻Ǽrkwda`lvnyuxnzw~~c}|zmfcl{vZZqm^X_lvuujtm}rgih_K^:+%/Io|ɸumvnqvxywxmltkq|iU^qbIO^jmrayri{fefrqrtsvi|cm_G[VTLCGrƴ}}qmp~nx{ruzur|ngn}zqs{jUdseUOWhr}wmz{krnpjnbuYadB6.6J[Wdqykzt{uyt}utdovp_lv^JQ]ca]Pvuvo|lhkxntzoorkfv^N_\VH89^|ɷztw~jz}tv}~wosjggz|valxjXOR_xeyzqwxjrtr}}ipfx]amPD;>HNAFrǠ}rzqusuvvt}c}uxm|jsrXW_c_XIhwlmsooznmyuxikqsScdaTA5IbdjǾ{|ts~tswmsyftbsr~milzhYW[rhboxtqumzpigup`u[I@AKRD8Qvɪuzwq}r{vvy~hwsopx}y^\eke[G[h]qxpo{unyvzfpruS_c`S@3E[VQiƼtuxx~on}h|yijs}n|{vx|l`^apY]xjxw}ptwnymqhxfezaSJLSR:/Hdmwʭ~tsrstvqvfnw}f|{wiekmdVJj\_qc{}mty||pc~o]jicSCAPQ?>Vuʮ|}wzo~pikz}vspj~fw~|{rjlwqTk[lm{uou{prp|axo]SPV\N79KQQYoƭwz~qzwwvxvwvmio}|ywty{thXk`QmVoyy|vtzznmwrZiol\HBT]H6:K[hsɾ{|xntmz}yojv~onqtqs}yywZt`cnYp{uus{{qn{w{a|xicchgQ;BTRF@Kcǵss|y}vszxv|zcozynj{{zic~jbiOlupurz||yzks`knmbVVa\G=AHIJKjʽl{jp}wharw~lxsw}mwyp~_tjTcp{{yw~}qzp~jrgbgpq[GLXTIADPZKt}oxv}~ijlqwyslm}{s|ztnrxZmi_`mx}qxrscnroaW\miPABFC;3Lf^t{zuqw{xplvuhn}yrs|nlrrzvZbimkiryx~qsxnsknvvcOTb`TJHKQ=UBSqjɿvq{~{piopadp{~}z}qgvrvdfgd_cw}zm{vumotq`V_f`UQTWH/NLPurȽ~upn~z~~{qjm|zmmu}}{}l|rhfmuslt|vqnvzugZ[mudQKKJEQjp|ü~x{{wu{vkmqpifruzhizs}vuwvnehx|ofo}|ywjY`lkb^_`R9MG>YHBQcs|tyoizsvzigmstqx}zp]`s~srmoqontzdVSTTPMWV8OS>R[^fx}tq~xggmlfcyzktkuu|}}yros|~qdclw~y}}|lhlmjdceaFGS;MO<@JTZf|uzg|vo|zqgjprrz|r||pgluxy{wvrliozcURQLJXfKKO@BDMaxyh~rjuv}|mhhhit|xo}|pt}xzz~{y~|soxynhb[VUddMaW>PYVRT[^[c}³wurjgsukybjuv}qxp}vt{vnkjgj{yqwxrn_LbcN]M>EQZVLIPar~~ynvvdacchxxttux~gpquhrl}~|xumopmo}|\efM\lkc\[YLBFUcjs~}zw~m~|lz~wtwyzxv~{i{vhppqlkrwtvx}mxs~~ulxaUlaPOOI@CS]XJDIR\oy{{nykfb^^exzwsmn}vk|lotwzwmr~upoqt~kgrXUbeeebXMGISZ`foyzvx{fn{yuicr~p~cruprwus|{v}p~nz|xj~}_gfRIIKHFIV^VJCFMWk¿vu|mllgbfr{~}zy{yuzxqqdyvu~w{ypznu~xojm}sp~_VfiffhbP=@Sbfdhpplruqz}ujbevzhzpwzigmpqv~|y~||{j{vpxg{nVOLJKQYZQJHIIIQdzwy}}|ichifhs}yootuv|pvohxpqtwxpou~y|}vul}hhjifcc`UIEM[bdc`Z[{xts`\hv{uqo}hdips{zvvzwu}iyqwlXOMIHScfVC?DGHOfl_|t~sjgkry{ukddmvz{ozq|~|ywy~~njllsxw{nymm|zplh]PKOWY[bfcULenbzt|pednvyvy}mrfaagtqprs}~|zm|xkcXRSX`d\OB=CJS_WJhslzwunfm~nb_^cr}rk~xoq~w~|snos|}|pswtldUKR]b^WZYLI_[Smz|z~qklswyzzzyrvy|rsnghsztmms|yxwqymif\Waif]TNF>CUeTF]ZPhz|}{x}ug`_ag|s}|q}zqmqzxp|yunozmw{gVOS]hkh^RJMaRD`jbhwmkv~~xvsh_ww{mhmplnzzsrplvwzvnr|}~vtomnllj_QNPOKMZTG\ZGTft~yw{}ume_ds|pt~steetyoz{|x}~||z}zup[U\acgh`K=VcMS^VPS`qsox|pdbvxntmlp{{usqpty}xqvpvwmnpor||obVMKOV`]FKbSDPbls~unpolluu`l{t~ohn{xj}t}vqw{sv~}nf`ahjfebUKUSFYfWMPV_s}~}t`aypdzsqliovllprywpr|tvyxonsz|iWQNKRaeLBZWLU]bjpt|xjkqw{ehyml}}rnrty~}vquyxzsrrzzylhnmgfcYNK]cEHb^RJJR]ntyshrt_jytuwuxthfkuswv}~{pko|zn]QORZcXM\R?L_ffgkigtypirlcytbn{mju||}yq~qzuz~{rrv~xzpjkpwzqgaRFWcNLYYUSRQXhw~z~sll}aj{qjpqry~{ukgm~uoswr~w|{{vzylf`UU_`JJd\EFXeihda`ct}|{yxps}h_kw|pkq~woqw~|vu|ysw~qhlvzyynZLN_ZKZcPDINRVbs{{}{gquguypfgqx}vnptpq}szvxwzvrzuwyqhfgfi]IU_NKSU]dd\QQ]m{y}ln~efsy{~wvwx{mdv}v{pqrv~~tpkq|{r^Qa_EOfbSEDNXafhjhixvwyo~mca`hyvmmu~ksr~|{~yqu}topnnvx_K^bLLZ`\W\\UMO]kt~yo}lotwzwturp{zmw~nvxorxzv~|o|y{~~pehpaOYa[SMFBN_ig^Z\`m~omyicehpzsnr}fuzt}wr{{zs~spt|n]gbLJWcd^QJJKPV_inqx|~yoy~ywsiiqxumskp{vvqq~~wrsr{v~{npnR_j]QRSROT`d^TNS\h{y}skdeow~yxyx}uzpjyxpmoz{oyxtxtgysWQX\adaTDCLV[[]`\\vqn~}qha_k}sj|uvf\bo~z{jcXG:?SknU>Fj{hB0<\tmfp^YmbgrPiyiVOU_jm[wykhywsxwjq|lYEFbyc5#BpzfL97Cbzμr_aeoyxm[LGHWunTi~c[h{blwnuphomG7@UoxgJ7C_ppg`[GBdvil~fVUZ_cfjnq}qYdsc_fs|plodc}xzvyvWMIJZiqm\D2.?\psjet~ln˷zrpzg\juoo_[aju~}qlkjku{mVaulnqppqohammXVb`XPR_krslX@/3H`u{tþysvwqb]w}tmb[]a`cea[Zh}vf~thelyx]PafWT`ptttk\PKF?81-5K[NNi{qt|~mdhmojd^ULUnsdm~y||}~}yyugZRKD@EI>=PULPbz|yrty|zusqi`WW^b]Vd{{pq}z~yl^[ZYZXN=.8NI8BX`^crpuzzyxrfZXbge]QIJ[oibvzyzpeYSUWWK76MVC;GVbq|~~xqlls|~vidc`^_d_NVttfjw}~}qeaa^YTKACNI>FNPNKLTiyopo`]dkjcZUVZdqwwusw|{wrqxrf]VTY_`[UVXY[`eaXe~tlzrnprrppomnv~wm}~w|{|{|xg]ZYVPLIFBBHOOJFObkdh}t~unkiilibZWY\aimko}sx~~w}xib_^adbZQPV]`\PHVp{vt}|s~~rmqxzxrnkkswq}zz|}}}spme_YQLKLJFDFFEKZbWRhuptvrifda^\]``aflypnz|ofeeefd_WQU_aVFK_f_cnyy~wuz~zsljkpz~tlyur{~{wx|{vwwqdYQKJNRPIBBIW`UGPewxsw{zshcddc`]\XYh~{pw~|}{wnkhc_^]ZXXXMFQ`_UTbr||}~{unnrtqll|rms}zwy}x{zx{|ysfXQMLMOME=BWcXHM_jnu~{xyzzxqg_bhjg`[Zatumyv{z}}}wpjd^\^a_UHESb]OLS_ny|~ywwwutsm`]txrrvz}ww|~z~~vvz|wpg[RPPNMKHHNYWKL[fjko{|}{xurmfbdhf`Y\jvrjqyz~~~{|~tha][^b^N>E]eYMNV_gr{~vvy|{rd\fzwptxyxxz{yx|{uzxxxunhbYRNJEDIU^TFJ[fgeglv{uononjfgfdeouk^g{yz|~||~xja___]QGKXZRMOTZ_cis|yx~ub\kyunosx|{wuw{|zz{}~wvytpmjge_VNIFL\aQ@G\hifejq{|vrrtrlcaep{wf]hyxrv}yux|~}{|{tjdc^QEJ[_PGJQVWZ]`gt~|qfjvtgahrwyxtppv~{wxv~~vqnnlie[OIMX`XIHQ[abbbfnv~}ywwyyskfpk^fu{~}{qrvz~~yssy}}yuu{{vneWHI[aTD@HPTSQRW_lzzkgsxh_`gqwwvtrqtz}xsxzuporrojaXXaaPFO\^[[_cegjos|~|zxtsyohovxvv}y~}rqtuvwwursy}|xv}~oYKP_aVJDCGNQPMNSZcnw{rjx}k``cfkpqqrttuwzz|}~~sx|urssoifhlhWHN\b_XUZafhhjms}{mkwzwvzuu|xuttsstvusruvw|xo[VacVJHIHEFIKKLPV[bmxtxxlfdeffinqrttroqz|yws}~}yusqorzzfPMWadb^YX]dfedflt~~}mo}{vuw|x}}{}|wqomnswxtpryyq|~mdgmfUIGJMKFDGKMNPSV\l}qllkhecackruwvsqyvuvwzz}}yrmovr[T[a`^]]\Z]dggfhntwvxvv~~zyz{xuyz}{snmmpturnq}ryrjqyoZLGGIKJE@BIPRRSWatzzkimolgdbbfnstsswx~}uwyst|}|~~vptyg`dfea]\_`_\]afilnoier{z~||}}swysw|~|vomnpqstuzvwqip}~oZMIIHIJIEBELPQRXgy~~vmiknlgbabejqtu{ywpmsrty}zzzxx}mflrmd^[Z]bc`]_elnle_e|{y}{z{~twwtw{~~|ytommlms~{szvkrpbYQLJFDDFGFFJOSZfstknyurmlmmjecccejq{ws}ss|trsuvy~{y}viku|ypf`^]^``^\^ejf[Vcx|{}yw~yyywwxyzzzwrnlnvpm|ws~}oe`]UNIFDEGHEBEO]lpg_g|}xyyumiijjhedcfr|szyprzutttttux~{{qlu|umeba``aa_^__YSZjtqms~}|}{wrruty|zwvxz{{ysmlrwpv|qjhfc\QJFEFHIGDGUfi]S[m}~|}}zsljllieabiyzu}wmqtmptvsqopt{yu}|vmgc`^_ba\RJJXhle^`iw~xngo}tqsx{ytsuz||{wtyzps~yvnmnlhbXOJHFFFGIR^aWOUcov}~{vpmnomigmx~zrsukoyoknsvtqooqu{}}wnhcaab`VHCQcg]TSXalv|{ncev~vsssuy{xttvyyy{|nnzvpopnje_WPMJGHMW]ZNHP^hmpt||wqmmmlow~yliuuozyrpnmnqrqooqru{~{~wmgdb`[PEGUa`WPOTZ`jt{|mdky|vssutrruxxvuwy|tjp}|wsqpnkgbZQKHGN[c[IBN^giilqz~}}{uomqytecqxyunnqqomorrqonoqz~{rjfaXMHNZ\VONOQTW\bmx|oho{~umnruwwtstwywtsw~op{{|{vplkjhe`WOLQZ`[MDIVcjklnrx|{zvpmu}kcjv|}wnjloqokjmrtrppt}xqg\NDHXb\NGJOSVX[`gr|~rlq|wlegnsuutsruy{ywzyw|ww}yz|ztnjigea[USY`\PGJSZ_eilnrx~}{zxwx~qgju}wzskjlnpqokknqqpr{{tfTHHT_]RHCGNSUVX^enysho}oecekruvvussuxz}{|ur~}zyyytnjihfcaacd[KCJX```cimpruz}yx{|okqx|}}vzyplkkklnnmlnqtxx~xkYLO[_XOHFDGMRUVX]biswpvzmfcdehnrtvvutv|{xxos|zzzvpkhgfhnrkYIFNY``^]ahmpruz~tio{~~zxzvqmlkkmnnkiltus~vh][`b[NGFFFDEJOSUX\bk|{x|slheeefjostutsv|u}zst~}zxzzwqmlpx~xfQLS[`bb`^^bhkmotx{||~qq{}}}y~}zzytnkjjlopnlq~}pp{xlekroaRHEFHGECFKNPQU]k|pmljgdccflrtuvz{vxpoxzuw}}zz{ytrvo`Z\`a`_``_^`ehjlmlhgrz~~~xryzxz{{xsmkjjkmosz~rpy|qmt}|m[NIGGGGDBBGLOPVao{||zomnnkhecdglpsy{z}pjsyrorx}}||}~wigkmjgdaaba^\^cghd^X\n~uu}vuxzzywrmlkknt}|rpwyorqaTMJIHHGEBBEINVamrmjt}uomnmjgeddgmu~{syxnluxpnorw}|z{ulnuxtlfbaabb`^^bd`XSYi{~xsxyvvxz{zytokjlr~zmmxvxsh`WPKHEEFGECELWckjb]fz{wrnmmliecbdkx~tv}uopyxspnoprw}~vlpy~zrjeb``aa_]\ZUPTcsyxx|~|yusx{yzyvvvxzzyupnrz~pjq~z}yngb]VOJGEDEEDELZhldZ[hy|zxuokikkifegn{wv~vljuvqpqqpqqsw}tou|{vngca``aa^WPMR^lrplmu~{ulip}vvy{zwvwyyxwtty~snqyz~{oifc_YQJGEDEGINVaf`WWbq~|zywsmiiiiggmv}vvynktwmknqqpopquzxx|}yrjd`___^WLEJ\lpkdcgp{}siel}|vtuwzywvwyz{|wllv{rkhgea\UMGDCDIQZ_]VQVamv}|zxvsnjiklou|~xnnwymnz}unjjnqrqpopsy|y}zumfb`]YRIEM]hg`[[_fnxzndeq}xvuuvx{zwuvx{~pjoz~unkigda\UNIGIPZa]PGKYfntx}~|ywsnjkpxylfl{xw}{somkjjmoppopry{~yske`YOGFNY`_ZUTUZ_foy{rjjs}~yutttutsuxzyww{qkq{|xsomkiea[SNNS\a\ODEQ^gkmqv}~}{xtru~vhdkw|yypllmmkjlnonnot~zqg\PHHS]^VNLMOQSW]epyzplpz~umlortuuttvxyxzzrt{{w{||{xsomljgc]Z[ab[OFGNW`fjkmpu{}|{|}ogirz{z~rljkllkiilopqt{viYLIP]b\QGEHLOQSW\dnwxnp{yngfinqsssstwz~y|zroy|{}}ztpnljhffhhcVJGMUY\`dgjlpu{vmlqx}~vyumkkkmnljhjnqv~}{{o_SPX``YOHCCFJMORV[cmz{rs~{ogdehmqsttssv|}zzqox|{{{zvronmorusgVIGOX^_^`cgiknrxwmnu{~~~zz|uokjijlmljkpxvrzth]Y]dcZPJFDCEJNPRUY_jyyz}tlfdcdhmqtuvvy{w~zsot}{{{xsomnsy|veRILSZ_`_^`ejmprvy{}qkq{zz{xtolkjjkllloy{qq{yoecfjg^SJFEEDCEJPSVZal|z{uokhfeefinrtvy~xz~vqpv}|~}{yzzxtsv||n]RQV[^`aa`_bgkoqrroowxrsy~wy~{zxvqmjjjlnpszypqzznfgnvsfVKFDEFFEEHMRV\esumjihfdcdhmrw|}z~}skkvyuw||yyyzz}}ob\\^____`aa`bfjmlieenxx~yty{yyzzxtnkiilqx|tpt}{okpy}vhYMGEDDEEDEHNU]gs{|yzvmjjjigeddgmu}}x}~wokp|ysqrv{~}|}viegklheb````_^`ceb\Y]l|yvy~ywxyyxvrnlmpxxnlt~wqutg[QKHFEFEDCEKT`kqpigp~vpljjjhfeehnzytz{tmls}xrooqty}~znkouwtnhdbaaa`^\ZXTRWds}~|yurr{~{xwxzzzxtporyxliq|}}xnf^VOJGFFFFFHP[fic[Yaq}zuqmlljhffjsxtx|slmuztqonmnptz~tqv}}vohdbaa`\VOJIP]krqoqv||voknx~zyzywvxyzzzxx|xnkox|}vnid_XQLIGFGILS\caXRT_m{ɿxlsrwwozyxplcUSU[n~zbXkuqs{}i]kSLzpAC_cSIJNMKQ`wpjϴphx\EPntbXZmt]`{zi`\_hrtokhq|pwtx_F;F\h^F46Kdttmgis¤rntsWN\un]SRXaiq}uo`etuhZQRaxwossfh{dGGZkhWHELRPLKTcwvovǷt{~`NMZp}obZX`ovoosurmjovzwmhlzzozwdN;37EWhv|whZTZfuȿvlilurhddeb[TT\fmqu}zu|wmaWRUasndeo|~oZD4-1;DGE@=?GSezohlquw|{ric_^bjxwmkq~uqu|~yqlhfhlrx|{vk^TOOOMC6.2?P`osha]\^bjw}vw~~wuyxuwyvpifgkpu{xsw|l]PGB>BJPTVY`kzsou|tmgdgrvkc^[YVSQQTW[`hr~~uqrvxyyyxx{tf\[ajmib]]afjpv}ö~uj^TRXeoqkc]Z\^__^]]_cgls{ymebcfikmpuz~{ywvvsk_WW^gpx~~||{slhffinsvtmbYVZ`ejpv|}{|~}tk`SE97>JQQJA:8:=@BDHNVbo}zvvyzvrjb\^hywrnljhd_ZXXY\`b_TG;7;BGIKPV]dmvtqtolcYOJIAC?;=Ibu{gU`ePTampuniiqjj~fSQYennmljcSCLvoeĜZGW{o[NLT^p|aFXcpyVP_r|maZ]oqjz{{vojrzdpW[iswy{~lWNZsn[\vwhw|j~yYKKQTTSS[kqvsjd^[]fwr_r{dfzļ~uypTA=EQXZYXVSMB7+#)Bcrj^gʵ{siedkywjtifs~slmu|k\X[cilptvuph\UU_rk^`hlje`]\ZZ\_gqz~{qdYV^rǿǿúh_dnx}}zuomovsnopniea^[VOIGLWiy{ncaflqyyleeo{qljjigaZPFAI_~~|}xm_TNJGEDHQ_p~unlmot}{qh`]dt|rnp{j\USSSSTTSUZbkrutojip|~zy}xqlmt}|zwsmiip}qf]Z^iz~{~{vwywm\L@;9;?EJPUZ\ZWVWXY[al|~|wrmg_YUU[gx{uvzspqw}wph]RLMQVXXWVUTSPMLMMKHHN]q{upmlljbYRQWajrw{zumfdjsyvmaTH?953235:CRcuú~zz{|zwsolknruunc[[blsxz|~~~}yuqmhc^\^gqyzumgcbbeimpty{xvutsrpnlhedlyrfdhnrsrpoppomljigedfny~xqlihhhiklou~|qia\XVUSPLHFHNTXUOJMYjz{rkd^ZYZ\^ciszvz~~~}|pbWTX^ab^YTQPOOOMJFCCGP^ksvwx{}Ǻzx|}wroprqkbXTXblswyz|ywhYO<71,038HXliL?Gb~ʻy|y~}n\MEOjjZndT^xvp[deledelyrlhk~zsqs{~pP8JgQ(7mqYRZhqvzxspwunrxz|yrifqiRkoqwgevfSXnxumZu|aQID?:55;IYc`Q@L`s}{lXH@AHR]gqzyrkfb_^bn~wiem~~k]TPPRSUW[bo|xvusqoliecabfklfWF97?KV^djqxvh]X]kwlea`beimrzvrrttsrsux}{wy{}~~~}|zulcXOIFEEA:32:JZhs{~xvuvxzxx}wpmljgeegikmoqqnkjjntz|xpjkr}}tgZMB;:AOaqyytld^[[_fozʾxlffgfcabdgjmoprsqonptxyuj_XZbksy{{zyywtokhfiq|xvtsrqqty}}vj_Y[bjquy~{wspliggiljbWONU`lu{}~~}}|{xtqoqx|yxz}q`QHFIKHA:668;@EJQYajqz}xrlghp}|uu{{rljiheb^\YVSQPOOKC91/29BKRVZ]`ekrx}¼|~ww|vkb\YYZ[ZYXZ]`ekquvrmjlryzvrnic[SNPXdosqjc^]^`bfkr{¼~phhnrpia[XZ^adeffgintz~|tkggjnpstuuusqpqrqpnqy~}~}tdd̻qspgnu}~r\G:;LYk|muy_ym]iukxxgyiZf|vjhaQBOqsIJq|ZUpxagvvknVB]{xMBTXcsqrs{jspnwt}wytyn{lmo}qr~vgm{qn\bmlzqzrVWTeqöƹusggy]ZT^aVhtqwZZ_VN;>3&45a{{phz|mjpcf`eq[bcouu˻j{mpttt`Ra]\OVZNSNXlTUTdf[hihbI^\\WWkqprhv]SRZfl~wurüdmf]F77+.ARutU[g_[JLOCICTUFMQ^^^jm|kqlwtnbji]aZnwcehzwqpaz}vlsUMIU]eyzxkt^]e}xwu}ysusokQ]ZTA>IKUht}}`frleX[_SWSdfX]amnrĴyy|upXn~|f\ih`PUSFE@M]EBCSRITXXRFi{urmze\[hpuvtiz}ksƵ{zpjJKLG;=DO;9;JQ\s{~ej~qqruneed|k\Ydh]\jmwkld]gdRS^pwrd]_zpszvyzphid_L>PY^Ygnhgiu~z|~|bsywlehgWWVg\SXm~~svyui\wypuqoZ^ijYTZYONJ\\FAGRLLbszzuqshZX^iXV]ot}~sxxojjcZMcqteije_fq}~|sW`jfXONPA=>PQMYt{pryooxum\tǻ|litvgbjj_ZWhmWQ[kov}wshUSWaPJPciv|vop|{g_dg^Z[dijhrutoiny|}xzqYgojZUVZKKSmsyuhjobVYa^SOqѿyzqY[dcQQRN@;;OK:;QdoyxuwmabkmYS]kox}u~ngogb^it|ttkafhcbio_ki\MIHE9AUppu}xzngqlbZdeaSgvjxthlhbUS\k\Yjwspr_YYbSINbfqv{z||mltxf\`fahp{zhljf[`oz}}|dluqa][b[cwz{pbij`TV``[gtysiZcldRWVUFBI_[Zkw~qqoscWV`YMN``ehw~}~uv~shlww{ef`^TXf}rv}ejsnZVVbbiz~~vzyuikw|g[ci^WXlrsxv}~wgjro]dccUPZu{urdNLUUG@KNPZcx~{yzgr}opkpb^blbVYqxrnnnh`ew|mj}}~}kalna[drwop|r^W`UQLbtxr~{|j\bgYQTNLAKe}zswvln\V\g\MJXS[Yervt{|||ljpwmlzz{p]ecfYU\qtowmhqsgq{{|szxs~{yfcnzjWXc]fl~}}kgrua`beii{z}libfTRW[K?ESKUTj~ɹtv{mlz}ljllkX[ixx}tuzsemggTOZqsmr}~xxdgztzxvedkscSZlmzyv~y|se^efTVbl{xx}qz~o_d^hYRSYQGHUKX\v®|wxwnxvqrmsemkltp]bWVJFUowom~sxvx|renzvelek^UYge]g{ywivtiY_ifhvqvs`c]`U?@JJ;4FJWoŻ}uwm{}mZ`on[`[ilqwpy}i__Z_R[mzoesvuk}~xvhkolfRUdsrt~ryo|xyntwjY\lxw~xkamtgee[\IJRUIBSfqzu|xzuhjvxgour}qcggTITP]TWcttpz~y}~yuqnl|zoejobejcgYayvwkyx~oxonwqjq{ytd[gpbXSJUD@EMJJdurxvhftn`]jqhy|~wtc`aSO[XcRO_ttjs|~w~ptqtzg`lsbefgohzxznxtkj|z}v{lt~}~pgtk^^jkTTUUZEGUaenx}symmbqxk]fy{|xrYLQTDORNNBQgsml|ww}jb[pult]_ghtliyzoUTVdzrIBhf-@Z]XYZU_rnʯ~}giZ_iuWCux|m|vZ_fosn\=9[ft[B?LW_yz|ykNCZy{tmxytRHi{^axxqfjg[hf|pub\]KPGWxxeSHOthT?9^tz}q[glo^N_|~mssfn]iwuke[; 1=_d^grqpƮf[enmszsh\eUA?Vs}smxwyej`OMhrkZry{±v~v~w~gUMC5Oblu`[`f_Yklqwdsz}tusg_kmWXFQ`lwvg[G.;=4'1#39@dôuaf^_aN]bak}q{~nvadmjhu~iiXfdWar{{hxyxqmv}ws|phSa[E35A@Vx{{uezw|rr~v}nr|yipkcobleN?CG6*7/CL[v~zxsrkk`u~onZdnihoseZm`gcYgy~}s|uv]]homir`PZKSL<7CXfy}vslqj[QYWN_JFD=51/$53Q``s{|rvrynk}ymdej`k^Zi^kxou}pqw]dYR\ihYSUIUB=FA?OmyxƷ~kb`^SRbSUI:NL>14;2J`dxqs{zxr{wty}yvxldj^nkWN\j^\g`y}{hm]`bV`hbPPbROK@UZcr{ŵ}wwYTXVQOXB6A6A;-(/;AVibvlesx{w~vm{gfb\\ae[]qj|svqqcP`WUeXVSUVT\IGQF`sttty{tpxѶ}in]Y_e_SRDIU>CD@>Ndakzitlo}w||sln}xm{ypfqkddGU_YQS_^k|lf`WiaiiPRag^W_R]gm}}vrx{ǿwv^bdU\bZFCRADKCoĚO%nA=_eoSNPTzt{}vb~yskepwXSWeok^_mknq{nc}ɷƩgr||mC!69Rac{{{fspkQ8S[qx|жV:VщU@9Goik`[uqWS\k]~aZekn{o\RRhsx|ֹrwKF,,5>YW8>KK0>QUn|}ˮhm`gvqgh_[pch~{mUB=i罚}qj}}zr}}[ssmL8;(0Gdtn`Vk}~vm]X[q~xageTc^93;KMfjattz~tqie]`nttimqsp~}v|qtg\O8.,^rϸhc`]YXeACEYPO\W\ckscjdxy{xr]SJKOIgnmwq}r~|prmhq{vhjw_stos~{wxekg|z[QND9 &[mýxvySYPaUhpga`eaNNEkry~ngddjmomvup^^s}xjt}p}zmxslnuziVZVyoupSH=84"$,O]Ľsvu}|rplURSSo_v~kvzvlsz|w||u_|}{zzgXWDRkophtajtzx}{ebV]qi{gYPQP;3/EGcikZoohxsygdldig}~y~yebH:PYWIFID]c~yxsoyxkmczx}~kxlvyynb[PRG:C+@O^´ô~}|wvllek}kwcpsvqq|mxiFQZSTIL9KLbgc[XY^xxjzhwwvx}sum`mfbMFcѴŴ_\QSdUmu}wSc^rbmtgi\]KYVfyvme^TeaPg[acYv|lyso`^TRN/--!=7NbffMV[^{~wqzwYe[v}qQ^_Z[RRKaXisrklb^qictbofgz|xvv}uso~ym}rcW\V[T5@<6JFamöqqXkhr|zu~vvtvakknYlf]YNHCOB[gfaf`br_[qevnwtr{wnhvk[e\OGOMYW9A75NRq|ʻtx\ecrz}ssvxutdolµixqfaQFCTJ^hbY\SM[LIb[oqulwj[kbN@E?JH%/+)EQvĸȰhkLTXf}yy~gsnTZ[}iy{opcZWeVask]ZTL]R>WR^hn}wjrnZDE=@L205%?Moʴhr]U[^}{wxigqW`d|dkwmtm`Vc\]xwighY`_BTUVfpq~w|jmr`KIDGYB8B.AQnzn`de~{{qlzmljlodfmcf_RN]WVu{qlgV^bGY\auuzmq|uks}bbiYILGCTC>L9K`xvfjq|odv}unojnvªllk^dbVP]PMjk__\MVYD]^crnqvniy}]]^H;925I7>J3Gc{q|d^bvus|kigUnh]curopiamlUeulmlZKQ9AQL\k}w~}r{yilTEC@7D>4E16NrĻxy`[i~tzrxccudbgz{qhiiafyi[mmmuoYVRBWQVey|}ijrnkptfHBB>?M=KJ8Ecshk~nmvsytm^vmeiz~nig_ZniQ]eaorfY[BOTP_uolrqevnhdE;;<7IEFQ77Qwý}metxll~vkmWfoehr}}uoiYfuaZe[eniSOB=OFOgssxnmwgoX=9725@5I>+6]|¾yz~n`ds~{|zptnbTh_Y_ovúyuje|xcid\jkcRR;FG>Lizxswzn}wttPA;8-8;BP7)=cz¾}upcjq{wwzvs]ZcWZjuv{zhjuircetwj[S@OEMU;.Ed}vnst|ss~vv_ei]bx}~}yso\gxlir`irte\RFVICYzxnhljg}yeogKF@?1;;SYC9Ro|z~|s~kqrp{}qucgeX`~~xst`fvjfnX\gnbYPFXMCSvsgghgzcicH@56(02MZKCWm·xrxx|y{hoojyuvil\_`RY|z|hgvleo[[fkcUN@PG<4-.8VUP\nz¿pus||uqip`mswnhjfo_Tkuvsfuvlwpaghq`]MTYOMdr{~~vubf[j}oekYU@<813<[a^ky~nqrtykbjZenwndhiufZnytseoldpnaecqdaRVZSTis|xsyghYdui^aQT?9616?\aasȲilovw{f^aQ]and^bjuf^w{yqfoifsjea^j\[PWWRYotwy}mkZgpb^]QV<9//1=W\a{Ůz~dej}|xd`\OZ]oa]^lq_Yu~vsvjkwjm]_e\[TZSN]joo|zsl`ppef[XW>:*13HXZe{źvdbo}vybdWZ\fp_`bsjYb}uxpgtwrt_kdc^^ZOPfex}qi|tvfgqhccVaRD929?RY\r{}nghvskcaV]Woibbpxf\s~wttfhxt~kdhbeceYQckkzetvvm_if_cX\_ME16:LUXg|·{~kfsot_]QZQ`mbdjym[gvxzjbrszu`f^edjaSYjczmlyvwdhh_`\T`PJ3/6ANR\x{xlcdy}yg^WWXMfc`_mraZmqyeertme_\bfgVM_ce|iwxyjne^cVZ[RJ/28FJM`wt}kck{vg`V_QTe_`dsn\`ipvenvniZ_ckgURe]jwtjxxtlla`cXdZZI16>IHNjxzofpz}u{f\WcPYddejwp`fgsuemsrkYbislYYg^nrliosqlg[_aZbV_H4:FOLTszqit{uvdVVaOY^bdlwsgnkz~p`fmumW`htn]^jctsjhloskbTVYW^Q^M7;IQLSt}sjsx}w|}xfUP]KRT[cjuuoumy}~rcdhunQWcqpb`kfwqpklkznaQQWW_N\R97DPLOp~zwjnru|~lZLYLOPSahrtrxqsyiddwuxYP^ntjaicrsszglb{vhVMTVbQT\D9ASTPf~x|pmrtz|rdPXQNTK]hruvtxlebnxhQXkwrhldqzngj\n}nXJMQbWRaQDCV\Vd|x{tvu~||{tshTVOMVIYlwy{ztje`kxoTVjyxrthspiiXey{nVFFK`XRaVKFWa^h}w}}xwu}xw}q{zofSSJKUFUmzz{qgd]fzsmTShzyvwgvsnjVet{pTCAG^SR\SNHXa`m{t}tx}yus}v|qvtmeVUEMQCRkywyofd]jvtiUQgwvwvdx{v~sjXis~qSC?G]PWYTQLX_`nvv|oy{tpq~tvsod[TCTKCUqzuzlhgbss|}dSTlwv|nf{sx|yyc_muiMD?S\S^VWRPX\dpvxp~|qqzn}sqpmb`LJXII^yzszijeitsucU_sx{}fpvs|{~zqYejxz]IAD[T[[U[UU[_mmnuyp|ozvmlmfdYFWOGOl{twlghfrnl^Wiuxqjxs}{z~ccio|kNCHBU_SVcm^Tgmoxij{{w}z{ofV]cn\SPGMQYiujcosamlkllb\lzzn||rsxvvmffdbS?F@K`WW`pjYbopmjsx|u}lytYV]leXVGLSZbruehvehjhlol_c|~ovzslxuwwsed``_JHED_^\`pwgbssump|}zp{mo|`RWjk^`MNW`cn|iduhiifnsufaxstxslqu|uwwgd]\aRLGC\`bfs}situ}{{pr~{myml}}dRQflbgSOXdfk~mcrijhcmuylauywxsnozu{sxzidZW_UPHD[`fjvyouv{v}rs}zlykmy|fSOgieiSPZggjofqflcalvylbu{yxuqopy~y~r~|meYV_YVGI[_hmxztswyv~su}wnykryzgTPhfkjUS]hfh̽v^jl|n\_\NQX_^`carbK<*8F_r|ǻdeL_lufaz~²S/TtTILDVVUbv{Ȱs:Uߔ17]`\L26DSULTbuyygjÔXFOflm|sqlhjhfa[uzԷ|ws~mgaGT`ekq|X=?qmn^XTB?Memrͪ\%mx;)/=SGGSae]XdqyfY[TNpo[XXNfrŵmarkvw}sgQHCKR^xwipgvbJGXt_W`falMBժwS8DA>Mbqofhjwf^UF9;F=WxqkOK[b{|_H\fm|y®xf[VTbvilmrnQOPl{yqyV!)[ݿkRO:7F\eb^YZvrohRFE@60DGDb{zkGIHPgz|~zzyqZUmkwxyyssvZLNTv|b<3lɨtaO4-7GJFF68QLSkpRPEL]lonwycmnmojlv|ydepmxw}hJHMZ|̽t^O-!>yҴt[?39DC?=-VP\px`XIO^kjfqo]fdjmjqlklkwxs]?FPa~m\HD**H־gN@BJIFD1KTfojpvaVOoxvu{ypy~q]ZE?[tsz~m[H7$#77Mj϶tkcfjlsm]cet|qb\YR?DOeõ}rv}r_VJkt{vrv~xlpv}|ztt|xkWYLE`yr}wv{oxscVF4"7A[w̺xpkmos|yilhwxj`YR@CLeŹz}{txxj[WKjtwwqs|wkmotzulltsfSXQLe~rwz~qntgo{{|m]SE3 8Hh̺zuqrsw~rqiyylbXO?EJiĹvoppaZULosyvqt{uilir~xpffnm_PYRVksvv~zkjmalqwwfWPC2%:Os˸|xwvuzzuk}zncXK?GJp¸~ojihZ[RQvtxsw{sjkdt{wjadljXQZS_pvts}tfjfajjvp_TOA-.<[{ȹ}{{xw~qpvm`TCCFP~ujff_W[LZ{z}yv{{plhez||se^ejeRWWXft~zot~~mdh^dejuiYSL>'$3Bh}~~}yzmx}ul^NBHD_xlfcbW[SLd}}yqnco{||k`_idXTNXWRzzsgeztgQhd]mywd_TH6)11OqpǠsy{~f\QARRkĶ~tgbPU]EKGg~}rrqjabr{ng]Qb[RZTnh_rxqzzy}}n]ac`akwfY\DB33KIYl~Ҳ{}n}}dleKIYny̬rrlesaXUP15e}~xtphW`mtlrrZ[ZP8U[Zptzwxz}xfT^V\cku`YR//+L`nǬww{|W\ZQZKdͽ}dN]MVYMXKJf|~v{xfck{daiZh^][OQ]jfzqknu|acc\FehbcRVC0)?Q^yʾz}{lXQ]ONeǻ}tcTVZLPRLIj}uh}lmqqueWf]V[YOQeems~t}mms]d_de]^hpSNLA&)7J`rynSURQJZxηvmZKNGGAIL]swpmzemz}a]^WTIJK\^pt~|mrjT[]WJ`\P@98596^tʿ~z{rne\OHdYiŸe^Y\HKWDORcfykxplfbmh_KZ[T[\c_wqknxsdo\VJIOV_WbG=8906[pľv~}ru|snMJOOh˦xn_QT?HFM]htqêtmtvwfrmlzzlNPBKVcmr}|}u]\qxtafNMHLKQ[HIEH;;Liʯ}{mfsuv_VM^wsɳzn_S;:.PZ`vylro]dor[N?YKVd{||{acdvnndVWUT?FADM6A@MGvƲ˻|{ftpchbVBch}ɸ|dRGG32PUrlvxuwlfp]njd=CGHYQp|sirucfNYQBE@B5O@C=1HXuϽ|ywfl^kUS\]enżz{lV.657;Tk~}}kz~zboZe^V_PJ?OPft||r{Zehs[[\JO-.8><6>=RUrw|~tv`d^]\YflŹz{}neHH=DFKWkiv}|i{wh^\]fUWMPRcpvnl[Sg^WDE:A9ALG=8BQnkȵ|{ywnfjgnfSjkưê|wt[H?P=@MU||z}zzy|tw}qeghqc=D9Rcih}}}odWajjr`N?=8J>AF3H=P[xѺϾnjU_g[d[kdz}c_<;9B@Gln}lnZ[d^eQQ:T[i{o~v`[^zm_\>G254CA9G7PFT|ļ÷z}_nijkJ[_m{ƱxvrpGI00DEYcr|ijp{uz{cpeimGLABIR^y~cdSdfl\KN4A(-GCE::>VZt}k`_\Ycd]xȽãt~||w\@0<2?Xdpxoypc_XYb`IUVSZjtz~uvTc^XkXQ@2'30>RKDMP[yuɿͻ{zx{seadZkle~ʵqvwvRQ>@KBRUhu~|uoq`pm_mM0QG\_ls}k\TmrOaU0?<7C6=;7SI^lغԽ[jcY^ZY[vzdzz{qoP<2/DIOeqèrfsR\`RCWN]cl}r|wiSemisQB8-+(:DHA[GUn]ĽƷ{qwpmcXqfkZRpq԰īzvunnmb_R3M23Qats~vxzh}`kkbW?FKYrstq|ytWdMa`MREH.6.'DMKKVUyʼǪlmVScWNXtmϭ~ich[X@34:JRlȸēt}~xtqRb]RYZLNkml|kuuxjq_WwTTL4<3'*:BMR^]fxӽηwxrk}dPmm]Xecxjlf`k`fpT@24Cad¹}rlsdiv`[\LUgVozxgvxwaROOYfGLN5&"(NHCfUpϿum}y[mSKXWsk|ʺ~x~}mmY]nLRJ.?F[a{sw~fs~ojqTc_UX[YPgsdclwirmZZ\LPJ<>%&1?VadȰοx}kxmbdnXOOktiȮjmcL[hdTYBDAOjdulzswsqwqb]Q`cj`Spy}wqjv`YaNSMVO:0$1 5CP^t¼ƧzmvytjgkJEajwrkǯx|wwZ^\^]JZOKPGHi~§wva{{~krb`PgfIM`g{fo`_hxis_TIJiCB,%'$HR^|ջùýʬzogltaWMNQqtvuwu`Tl^PLUGQbOPdljx|h|vvriZEjp]cXZr|}oYvhrsQTLSBF)'6$'8;_uu࿱ϵnwguvcdV[`_Wrw{~}yeXo[VRVXbXMF@Y|qwvcvf^eO[UKSatuinjalPZM\QN76#2"+CYis˦zv{bvaOYQTLozh{e\`@NKZcTUQefxw}fovbc[mS_`aV\uwvtygkjsWN_:B48,+51:3Y`cͼ}w{arevi`_=cjyxyn~a`V[lOnaLP<]\]rŸs_syyrpvK[JRaYXss}zso`nWcWWV4E847*1&4Dpsùpv_kd]@PdYz|vhPU[W_QbIM^DYcmsz}tx]c]%3+FWvjڻ«lng[nS[RVoa|{oXiK\oMSJ^ICRK^iĭytuqukWERQbs}c\ziqoW^>1SE>AE++53A;eh~{musih\q_Ko\xw{~fgx^]bWcHW]SZ:Jirnu~xnH^[Ziqmgjmujkrc^kO;IQYSD7,5/1;SFkҸƯqlnqiZcg[RHagorfgdaVN^\TKKZDMflwvryz{j`S]eUmskp|s\]^_SAMULB/7)8R[OPVOBWXvyrqo}rdceWWjaskfylvrj^X^C@TD72/(/5WXl˾ʸkekfT]TV^CV}iusbeaO@LEXYC_jX\wòykvwqo]l[Ife`pxfbo\V[T<:9@P3(<)&5V_xѵwpLWjX\jw^]bvxhjcwoN\S>CW\O_iy{wʸznx^Xzrr~hXVXhq{r`aV`jNR\908I8:8>BAIXsüɳ˺}^\U[^`iknf|}ta`slc^VVOMPRZ^}tlfeovrrmfXUmns{qwqXV_hZ[RNE@;32$5EXh\nnxmMfjg`V[l`JjtxbqjVSfKGU?3% 3;%%GATeҴgbmcGX\U`ow{whSHYdI7OBNWtvtt}Ųr_`rnWis`bdtebgm{ibP@NXC-?27;LI8/:La{Դͺxitd\Xhoztgus}}ewhcbqoUBBMYjfqzspmi{qooyrwiV`RgqVh^]ZgiQ:48AL==;.IIQkԾoW]KXf`atne{rlknve_R=QKLWoXp~xzr]j_mse[g[Kpp|o|ddcekVWN4?304E"2=9HFgžȺ~gj_Hf]b\Nfvtrlud[[mGFL?H>Jnymm|uinmUwplaHWaWLhy~_i^TNaD=C+2#&AA0+CEctһ»®|TXbWCS^grvs~cbOKecK:JCUVu}vU[kh[agdkd{sdlbrYWI=Y^J-2+76CVJ?RbuϹ˳xwdvr\ShoryfbZZ_`tbMRbgylmquynvgutdpnvz`jli}y_USLULg_B:IHUG3D:I]ixƷƿz|b_fThlpnv}hqlvqRUJDZ^cmvv{q}nbxfgkh`lkazvu[bcbiLDC*:?CMbdfamvcca`mzrvl~{[hc[eYsXROp^^|ʼx}pmgssUY5*:8WrperupzZ[T5;5[GL]ru`quiS\[]rymvnl]Zl^RyfWeekkmv~z{wdbmpf^Q?:;@\ɹll}prxhicPM6VQAQToaa~oee\_oi~akrhppekVeYVUfihy|ĥҷuu~hhvgcUC;<Ij̾|yzqzu}tklOEF-MT@Son]yv|P`cYcm|pitlm}{bhfl\bj_s\|nqup}y}|~uhYhpJWG?<5NoƯ|}s|~zoyubZN=:W;VUctZzpnYfjm`yzbpy]vz{mzWfXZhbgm}d~Ǿ|}k}udjp[XH1G(*Owĵhtt}psq@P=1H=VUurvsi`ccjebpkTsjjhokgicQqlgzsntmvy~̷|{iseWaWOL;KD;W¾u~q|~|umznIRDFGD]\{nonswX\pheo}|Pwhqn~qv__^Yolpmqony}{~ϦhzotmlbYML:=;AXgϼqquyoxSP>9Q7NknsytxWj]akXkv~mwXRdxĦ~waxkaa][spyuunt{zzvùton`ZfQ1R;6TG`tɠ{{qudAC>JDZjoe}iu_ihdpmplsws[Ukg|zcmcfYuc}w_rlf~t{}uvov_]b_T;D5?DLqmƻ{h~}|_IM'MEIcuq}eqohd_ki|{|szhmiNYeƼjwzz_Ueh]}rpcpupwzkŰƭ~lzvbZaJeX*88EPns|z|k^^6A;Yoftzutnk\_{{fruZpbLac|ľŨ~|zrjkhjyurgfl\`yyuwǫ~pt}bWYPM_FEB#7LbtƶuyvuV\L=Tdkkqwzr\_uaryv{lmk^bXbanpqljhvzzplJblak~{z}[MVXBCUPa?-;doy|vutrt^OHblcr}t|j\hxhit{wo_Qg]Qgnkx{n}xov|ddVYaa\urjUKIAFEEcC2:Vxõ~xzgwezdRVaehv~~wab~xerx{{oxg\RYZWcot|zuvtiv}ggORfYPmy}zoUADD2EBUO<2^xrvqlsnfuhj[Zhu{{~xboy[criysq]aI]fMX}¨ö|owuvjtyl]^TZVXltsr}pLA<>><2U]I@]yy|}bcso|mmskc}zmzrgroUa_mzfiegT\i]Y}Ĵ}oturgd{se\]hRWry}tv{reUIA@UTSiṭ~vuypZD/19PKCYttxh}q]c\ZvĮ{ƪlkkaegV[_riZX\WqnYFTPeo}ohSP9%!#Ldl|opqulʼxTF?MSJUrs~zme]IK\WhxkQT^`d_ȸospsxcYYK[ZexvgjKE99:G]abvrthPQPNLvĪkmwsezxndmzvsyqehhva][d[@5ISijlſ~i]TIUpxxnk]S`gpɶupj{}pk\_lfz~zZOTZQOhx}|tkX^vjvnZYxdcVTSWdKCXmzyb]ORNWj]`expY[mthtyfc[XVXVIIbdq|coggXSbkz}ycSNRpz}]LNP?Fsz~i}hTQD::I[Sf}nrgtrwoz~q`L:OIfzncii{ilqnf[fsxd`]n{vyyX2'FkbfaSh||oXE?YPQ?B]lon{nacREHHfz|_QJJYVt_ciyowgeid__{{¢wxpfakyqzq{ȽvQYgql`w`EKJ:$EGZPEUyŪe\BWTe`]=EWYQA?QMHNR`nrsp~rpey|hvzlXmeqvfXGWrγpdP_iddspfhdojc]qhkVSd{{uokuejnzc[odvuT@]VGEPKg\{ugs||wnv]M\xs|rr[JZg_gxubXY[:@837>O]βz\hlXDZ]Ydy||iotyjcexvwhZ[^^[is{yoak`OgKI@YXYu}°x[ikan^j[`tlxluƹnabskkv}~aiskQDK7YjsyˮwyaXlizaRVN:,ESRUsxwmqdztmRZUdsbouqxuk{uu^|zxvh]gfrk\RTak~}neTBZVYYx\Rmeubijf^b[n}}}YvYTaVKY[gvxxpzrn\ZOLVh^V;?8Nszìs`N`cX@K`pc[inotP[]Yh}ty~UNWmZ'*E_R57Io¯gXddoPHKG[rgNHVsmd^Sn{ll`fv|aUD.G_}~|Ľpjv_^Xdmjne\Uc}tgs\=<>ESfrl`LQTRMLPRxrhwmkclo_TD5;,0/Qutyylw~wqkk^SSRX[nyür^WjtPRXsytmgy~~zvannyvs}yd]81)-:CcoejZaz}OI^ijC1:In{yvspp}zmvqi^cL+:8NVnt}žsdotlqzqw~ze^gRgol{qssnywTWS@IV^`D[szy~emzqysgth]bn|h@:FLbptsPWWYcuaad[ff\_VTYMH?RkxǸynEOa]iaūt}|zdFF#-JWqysjYUqx~wcecyuuuoggVfhQR2^smkdkcjygpyjmvwdE,\K\]`vbnüǩbmpvPj{~v|vsZveVjnTTMC.$.$-=DZ^پ[]kk]RZPGS;6M\zy{~}j|vuox~iyrgiFGMI[ayǝrxTOMX]`hXp|}xfnaSlpX_kcuzvv`Qd]`dowz^SUCUGS]dzs|iR^lXNVhQXx[T8IQ\aTrpĨqnzimlrzoujydufkz{vvkzNWO_LXT[YdIBHLYUglsh^M?UPMR4IQ`Tauyk_hYTS`ujfShm|{~to~m}kxuNgo|ly{sqmġ~of~rON>I:76?=@F@c{_zybkgRQI_`aGIT]c[VXlX3D9?>7Xa}q|xuS]\Gcūxm^jax[_EUvtwms]RNZsvnkqkt`]yrkrgcdtzrPZW^WREQdHFfowp|nkl|ykuy~|wxpohaJ::T]lrpxnxztxWHnhwnZ_ZiQ_xvgl~g`UVar`GV[ky}tt^Viidj[ַ~imjwvnouc`BCBPzglcY|~sgQjpf_svxXSsmocZU\?KRUX9EQ?AATrqm`bfUltq||~tzá·jf^h_Pytp§|cx~}kfcW8P\RI^flwRC^Zk^UG?J4>G[s`u}vd^dw^fa^kvmy{mqyjzkmv`W`__nɾ|z|rtx|ez{{T`m^JQTR[8//GMZafqcafjcZbrhr~jjUKVHPQepinNe~znp\Z_Papqsȷond{y|oL[dpsgjzVOheVYitvx|vsius`YoomgWVhecp]\P3CDTb̵ŵxw~}ttstklch|}ptrvs|}zKJLN`YHJf[Rwwwjr}|}deihiXtxaWgsrjVQdlqyqkcOoeKELfwönkki{zmtrd`QXSZgAGTao|}qmnnhn^ex~jdfbaFdl]e[]U;,?\`s{u~zw}utt|vlmzp~}}xq{e^lTVa\^U_acnqmsmdc``vsaiPXivw`[YYQ9[``igwzjc|ieryzfahumu}~xzo[JNXJf{~p{dbp_q{~t||suiecZXl\SR06CQL;>EWV\opy}y_W`fYezffX`tptskj~xjrjcbe`jvXKfnw|rtkcqyn~zimd\a_V_p`pcTjuhozqf\`hm}lp^D=IC;Pg{wv¸|k}~}ztdg`afkuys|tk}|s`botcdiTPO=EORVypdz~tkzrwybbhkzzky_Sdpp}yr}aoxrjb^UXkniWlxk{Ҷx}xd_{qhRLTb]^plm~rtu~zcmyuqkXintx}mT[UHa^>;AM`}yluhm~jdzw{z|z}yij_reYerkbck`P:Rbhf`sw~l^r|vpl[Zhjtpsw_XcW`wlpy~mqqnnz{vbphQbsqsomddTnǽvvrhmzc^r}ttzyzluthalh}pTLclg[UH<)69J^^j}zxvswprr}~|^UcTKgwxpuvpjmh[N`b`LLD[kalƷ~{nfkl]Zaf}mURjrtqtngb|t|tjli}xwe^USOVbf[``MMSjvq}Ǻrnqujg~km^[u~x|ynsuqpyrnmy\SPO=9=Ie]QYwm{ppl~}ql\\Zcryv}xttqshbsxjYjhdGBJWZ`wvvohpesyb_q^YZc^^gy~ncvry{|mVafc_MKAQThlbcngp|xr}ys}rl~|qhyxǴm|xw_O]epbijyzķzqnvfgkkMDNy\TZyý~rwF>f`J^pc^Wp}źgcx~\Q\RwjgP9STddZRVRSNmy}\QGQ[ar{}xxabjsluwg`x~ȹ|xdiiPPGUTfnacl|ter~xw\LH?FADbt|iQKO>OVcoidmoso`I;:AFTuyvhhje\oyncTejxvfnyqfulPPO\gp}]WEF?5Hc|iiTP\asofhmjb_|iKE@FGJ^jaicyreimul}us}|tnswfl]HHUeen|yfSQO`Xlunp{uxjm}jt`XRNTHCXeͺiQFDECNmro_JRNYZC@H^fbjiagLNOB6>JTNb`j{aZVaibyuuw~ymxworYTCB>.0EYδszw{ug~kaalnpƼƱxrxvolNMF70:IU\{|sfoh_kba_lm`[]Pc_]WC:IX^MTXNQGONBHWk|mb_fb`vtiXPWNe^QNYhlp~t|mqlb`gptwwpzyynert{xliUSK:;Hb׿pexxyyqddmifw}zmfmc{|rmt}~~usrYSC4-08=GeduobT`WOVNUXdhcedYnnxyh`n~}xwrdckϾr[TZYUg~~ulbhXhne^]cbama\dROB5059>A^]ckmxo^UJUXP]Vakx~kxwzn]`lullrdlYLE706HnwĹx~{|vovp]eRI;&!&/5ZlvyymthfovytqrZ[^Yh\JGQ]\\j^jeTNC:=Fhq}aOPVTZt}ļx}ml{wzvwsnxykwjh`KCHMQRr}}utqyxyqyd\ahdbl\eaND83:Foʾ~kjpj[\dcfz~yt}ywpwfdpkrpoh`ih[fXXQ9/7=CFlqxhbn|{|jkicuqa]dnov|vhcekƸ}|l\Z^\cw}žuojoX[_[efe]Wda_i[aX@6;=::[anxnpoih`e`V`NO^qurx{gnefyvihmuq~wp^MIKWw̿}|}yt{}smugkfY]J1*03/@blyxs^`n}zu~uhl[foh\\_`^rknypcN@?=P_i~{t}wusgd`_ml|u|s}}quxrsvxcPPSQG`nxsqis~swolldlvhtpeQ9117PXwÿnkmvnc^ZU[^]xw~x|}|}zsynysip`F:;;0@;6OUj{xwswymgovr||xvrpfv|u}wbH?=EUWxĬ{vx{soxut{qp{mdeYhc\cXC643(2FOnx||}xt}|ybgihhgd^]tq|}fROM[\f~|z|wl_\cXdsuzzkp~ttqo{yh_\YL[alxuxlkx|kqpptrl`ctlywsiL711A=Qhlyywjjobpuxwt{zyoo}qwtfUJC<3EG\rvzstvtsxuxylumZTVcZnz|yoz|zrhedVFFK@RWbwyw|~znpv~}sf\TLCSQbuwxker}rllxy{uvyhmws}t[E;;IBVfm|{|jhl`mnt{nnxohYUcZa_TI?4,$79Khr}zw{xpo|wq\OKZR^oqxzw}qnpl[PWMW_c|wsxxnbspw}umi^THTY]wss}ompxsqhafrqaTa[iqmk^K=4CFKem~~yjmdfoj|{t|xqs~xn[hfiqi`]TH8BMMiw}|~~~|sjn}wivrpaS]^\op|wz|vxwszlwwlikoeVWPTa_u·lwvz}tsl^KQZVluslpnkmsu~~vkm{ziqit}zn^QAHJK_bs|~~}nl`cjct|}ypv}~xw}p\e^elc[[UG5AHLer{}xu}pcT\UZfesy}x~p|pvgUVT:C>>EKTwu{~^`behzpPEB]i~|^LM=Wgjqustpfob^NTCB[RlvujQE?jsng{~yo?>Pdu{NQp}r`g\ReXmvzn^dJO`xɫnD\ӽyGHcvsvgWEJD\m]_a\\RBELe|ue[RV]ssxt\WWFNK=Odlrtulrtzq}wbUianucWPYXlx}y}z{~cjmgy~YO9=IXq}~a:%SڳdU>@9Ckuojkqjv{_cdd|{{tl]XVbduyweoi\MONGYSQhrǾ»~m_lqiNJN@^t|yxlVSPMGYeIILOghVFOdw{|}dd^^}a<.5/Yмj[b^`cYZUKGXp`chbndL49GMciik_V\dqvqoturVYWSVQPWep~yuvzpcsysyhz{|l]JCI\SXgeyzvn|jgpbpx̹˾ȳ{kraK0)/iǺfSS]c\K5703QUeigggiinksjmt|rpvwskua^`YPOY\dpxogjqy{|sssv}zbNC;_rzzu}x{{vdbag`j`[s¼Ϸοé{rYEM[C/%0Yѿ̵s_PR:30<87>Bd~a]hlup^YZRbgvvtt|~{itn{}trkcKTQZhxzu{v~vvvp[eR\\@1)H@=,(?bҿpra^[Zb\]btqkWKPPfe}u}|}}y{|qwzf\CPegW[Yxnm^SP=A:HOMRgvolXbczphrvxdqko}~}tnsp~tfm}|}bRg\rrWH;QBC46Tm}~xwbcdi}xqvyufgoxsrsvr{wqys\oldX?MXr[benmoVNCAOMdhaexqic\c]qj~zbkjiTIVM_s{w|iz{k}nz{yuRX[I\D9%-@>F/=Yxϼ{thuis{oo|kl^nq|wwyl{~nanacDD_u}fl\xomjQL=G8>PHG^kbfXYQer{{g^jkk\ohlxxjqnyphjqurjz{|^PdPgfYL3=IH;6Uk__hw̷Ⱦ~y|str|ts{szwyhV[geYI\rf`dr{wvh\j^bnrkbpoyrYZXd{si`VRabZa^nxzugu{rkpoklxvms}]bqmljlZPE5:JKB/?\WSXhwɻȲtvu~~ulfsxpwuzncPSdd\ERpkdbluzp\kdepvq`fdliORS^w~nc_ZTad[_[iv{~o{qjponly|{j_dqtX]jfgdl_SH59IJF3Eda][jvɺʵwyvzsz{v~ylX[hgaKYqhaZgq~{vdqhhovsbimyuZ][bysig]Q_d^`[irt}yoaox{}uospniw~ujmw}_]hfkgncQH68JLK5Zjje`wxǯuwu~{piqx}tr}srsvvx_RDFS[bLTorrfs~zzwtr~uml{y^ZZ^kzsdieT\dnmckwpy|}}yvnrel|~ygc_qaQVS`^`iSB82@IVM@\mqnmĬrtu}y~nmw{z~x}vprmtyss]RHOYccM]twvjz}yxvuttjm~uabaiuqfmcZbhrkcp{kzyx|xxqopbux~pf`hv_YXYe]hfNA66CMXGKgorhp}Ž|vtxz{kps~qz|||zmnkytz~eRFBMVcTNirukn}~~{yt}|qjz~g^\aiwvfijZ]aordjvquz|}}yptej}~zjd_pcTUP_^bjTA74?JXND\jqllĭ~usx|{noty{xzzu~ooivuvkVKGPXf\Ocpuokzzzzu}uiwlcbgoz}llo^acpudgrrq}ty}||xnsfj}}ykeasj\[UcbemYD:7?HWNDZgngetv®zv{}qrrqt~||xpmgwvylUHDKSaWK^kphdsux~xjyoe_djtxijo___ltden|ro~x~~~rvig~|oh`oiYVO]`bl\D75=EVQCSbjfbrvƵ~ztx}trr}zw|v}srnfqwurYJGMTcaPZipmdqs|~zynqvicfot~tktgabhylbjt}kyvyx|}sqnaw|~sl`hqc^UZfblhP=8CUWLRanpiswyv{vuuvyu~wszqf`opvzjPCFIQaZS]juqovz{}krslbekltlhpgd`h{oglypyv|ux}sql`q~zyrl^cjaYKO\]feO95;>P[RT`nvov{zzr|||wvr|~tvunywoc[jnsxkPAEIQeb[bnzxu{~yyko~rk`dkktolskgbj~sko{szv{}orzqng\nzywqj\afaYKR^`igQ:7>BT^VWbrzt{~}yt~}|zwu}~qztpxvo`]kmtvgLBHITd^Zan{vw{x}hu{qk`ijkpikogf`p~nkn|txu~zqv~oocauzxtpe[dd`SGT[ag_F59>EYZV\fwwv|~tw}{}}zs|}yq{msurgXbkpwqYCCIL`d^ahx{w{}|xol|tocdkioolsnjch}wlmxuxu{oozsog]lxyvrl]`cbYJQ\bifR:8?BU]XY`pxuz|zw}~}vw~~{q~rsvvn\akpwt`FCIJ[b\\`owswxzul{vrhemimnjqmjbdzvjiruusyrq}wqi`my{wsn_ade\KPZ`gdQ87>?QYUW[lsquwzy|~vx}||spstvm[`jqwt`FCII[a^^`ovsuu~~{vm{xtjfnjmpouroffzxljrvurxqmywqj`iv{xtrbbdf`NQ]dljZ?:AAQ\YYYgrpst}}zzw|~szwuvyubalszykOEMKYd`_\gsqsqyx|nx{wqhonlposspjbr|pjj}ysprzxlttoces{}vwjcegiXPZakldL:ACJ[Z[Y_ppsqw{~z~}w|xtstuzn^fmx|xcKKOPbedbbrvvut{x~{wnyxxmjqlmqsxvukj||qlrxsovzpivyqiahs{yvvgeejhTT^hqqeK@HHT``a]fttvs{{|~y~z~tt~vww}oaiq|~ydMOSUehhdcrvwuuzx~|wpxwxmlqmmqtxvujj|}slrytovxmfpįzhkrubU8*.,5BKK@J_YWOVOOkorǟwbgk}pPHE=AITZbdYaqgWKRZ\echpqpb_ixfgpMm{}hiv|m`LUo|kNcyhdclhcoz}{~mcfδu5&YĒI(+Hh|skecMAKVfjiWGLOVejpnsĶ~rafo}ub]\UU[chkmcj~~~}xugVg~lfoy}odWFEI\aYgxzuxw|lnplidnqrgh~o^chpqrxb? GƵs\SOJUSW]fp`X^gsur^OW\gx}xnaUcgemkmo{c[Xal}~ub\beswl[^xuw|h[RWH7?FV\[N:;BFW]cc_q~srryô~~}÷yiQC;-%5i¶{fXQA?=JOBHUgstmXQYYellh[]c`ZMMDJ`fouuvwg[VY]hc[ckwyy|tjqrv|r`Uh{ops}zu{jeju~wbV^dq}pmptǽeVG::3+-Qt\M@?E3,3@OQL9+13;FIMCAMORHJHKcow~|x}qfecjeVUXad_efdfr~wz|||w{sbR]|wspuxqvoljqsnvpvy}njmq|ƼŷsWLB8;6-)Cso_Z]I=?GRPJ8'+-6@EKBBOUZRUSUmxy{yxu{tgcckkfiiegt|z{q^MXu~~x|zpoc]V^j^\esvhnqz}yzlgjmv|mSJC;>:0(9c{uzgYX^ig`O<>?EOSZSN[bh`a_^r|yytry}wyxutxyqaMNi}xuh]TR_WMS]pushXY]dou}woy{upivylegkr{vlVGE<>?8-/Qtmjlx|wlWNQR\`hh\bltrkleoy{~uqpfUHWt{uf\OU[LIN\ijeVKOR\cjoedmtvljccsz~zrfciox~{zzwmcKC@;A@91EHGNo}~ukkmuwtu{zvmr~{~fr^T`N\YlvlaeqwY\_armfTXK]h_oaScde[^W_n^q`bldcizxvjmrzkm_tx}wwmmt|xqkstl`[9=>BGRLRhw£y|ppwy{{yxzbdp|zwx}xU_\Oc[Ycn}oniqa\qkqoYGNY^oee_OblrgaMOi`pmbmbY]xv}zt||fpqq{qc`oxrzslcyg]_7@AYZpʻ~}~~~qoqht~~pur~{[\^RORX[htslznhcy}wbW\i_^cfYe^hc[IM`]dcejsgfo{vfvtpcm|oefz~r{xuzla[pi^RJ:HDDHWXK`uu|{{mlkfuyqnsnXLLRW\\f~w~wepvulaYPZegdU[XxpcY]ZR]efjo_el|mwyrp|{h_ox|skc`kjqm}tjhm_\SP@C:AHOHFZk}̺ur}}~smiouzwzpv}s~lRQLRLX_`{|zuphyszze\`hXg\[Ydmja[NPYdd]tdqekvouq|yk^jsqkhezzxiopx|rhbXbWY>C=@M@INae}¾rxuvgcun}}z{{vuo]W\O[MTZgynplyzxvo\eZ`dgTWfirVQJ^ZkfYiggmu{}~syvlg]gquqqdhvv{wm`unl\U\fX]<69;GQMWYoƸp|q~mZin{~}}||qq|}|\WNTY`YVjmzm{o|}ryV]Xfho_KYghhWJTUilkZj_j}txyuhclc~ksdZjvzx\`iqojQUY\YT9/;7XWeds}ɻyr~rvnXmi{õtiovj}`]MPO[`Wmz|rtoyuun]\cmoi[IiXcYQTQ_ai[ejj~t~jomviio[nlgmebw|rrYdi_iSZSUKO8.;CSkjkr{unjWgr}y}aitptpWQX\[hhk~stvei_g^i`eQKf_]bVN[gfdp_rl}|}{vwlpynjrldkVa`ottkkeWjhhZJSQZWMD4FMS``wz|¯ruirf^r|~~y|zpmjnp]STPa]foi~py|~xo``[jvhe]`hRTLCR_migrmrx{jmhrwxsfhjzuad[gqivg^kfk^XWUZW\N=H;GMSogg|Ǻryv{`]dl{ywjityf`UIVN^d]u~p|o`cmojqa\cZ`PFYSYbevzqpz~~vzprtzpan|vlhZbahtijtfc_dh]S\[MML?@=N]R\ltĽ{xw{cefdr}zjn}qlgXYHJWQ]poq|hovehkjlXaeTZ\RMTkvvrwoe{ywu~ukvymskffXfjg{wjb_mqg[]VLUOLF7IIBW]fryuzmrfeis{~{{v{xnkhefUIMGVhbci}ukdboui^_]ffQMN\uoq~pbft~pvuliktn`^^au|mgflthhhQLNQXRKE>HGWgt{wŽ}ps{orpsqbvyxw}|qu~{u|t\`kol`YNRWKWbu}uhioopomeehY\Y``Tdphlfnp{ov|yucintuld`de[kqzufig]ZINT[^WQF>ABWcssluqo{xwi_k|}w|vrqpz~zrdeenicbaZMFT^txw~zzrylhqsp_Va_h]WYZdcexv}|}~xvmhtovllqjg[R`h}tlla]US[P[YXXPO@>TZljp¿´rk}y|icjiuqty~}ylm}|yhiuil`aiegQER[moxx~lhqrwcV_dk`[WOWWgv}wz{tblwxxfgtrmVT[cqrqkb]NZa_[PVYQUHHNW]`p}°~yyu{ummiifbzt}mut{x~qcrr}gXghidVTL]airt|u{mvnrnfeZhde^RUGSko}y~wihsumipkug[[WcconeiTY^apUQWNWOVVIQQ^jwpz{utotpmjUiw{uztpoo|{iuo|yafddhYaXSW^cdtto~urkfogecgaZ[JL[e}wzsv}yutuoqxklhidZ]_baim[dabl__WIRPY\TIGSWgtk{zsotqxkZhg{|zz}s_onw~ozpdkhf`ZdYfcQ\Ldfpx~~~{egcbkhZ]aK[f[ygs~msl|xvt|~g`gcche_hda[^dsdTfVJ^Mf^RREED`YptǼ̮xzxr{svgriwi~znqbc}kxzwhvjmZ`^bdcnMSSBktesoi{uj[``\dW{j\x[gwtut{vuoc[kthXUN]cewrxdZi[\N`lQZFCGINC_`uqz}r|nkbrduz~~yzyq}tuyun{jyurL\]a]i\FWJUlf}pvvfz{rrR[Yda`pQZfdyvvtm~|h~quzqrjpul^]]Mf|o\UeY]UbPISTbVPL:Zdlvoynyq|cxuiqnx|{ty}wxWjv{qmkpoud\]etdaNNSTsisyoqyllfhynbc_r^cX^bxspwujp}yqrpjm^`_gK\`[shn{fYWduWNLYJV_DPUNXbi{qľu{zrxjyqmxxq}}~~|nuusitw~pvsende_`j`YXURMSkdu{r_jldr[mu`X^PVWntw{uq||zlngcoijrdUihci[qeea]gaKFQKGTaTjV[Z_xrs~v{srwvf~xupy{~}}hpcysrnmkg^[lep_hbgjO\[]u{ozzfckh]qgtwaqadVW]bkyzslt~}ksjbUmjij]ZSVj`Ylat]WW_RAYT[d\ZUPph{|{´÷~{kn{uuvmohy}zxuqwudnli|}u{nY`dm^Zc_cl^pWY\ex}|q|_mdjwcbm[e^aaQVbpsznepodWddlzdhNc^Yc`kdTSXZRN`PZKcgYh_`ttȽ~~pzrkjyivnm}om{j^uqp}uzmdkh`Kl^mm^loffbRhxézpwfsYfncn_c``Rb``n~pprk`uYcihq_TeUcgk[Q`XlQVZ[\^\YX^fdmm~{xxƫv|syw}jgclzzx{zuxitYiq{jjlwefb\_eh~ritaZcgj~q{qtuofe`_iyrZ\Z`Zhm|{nio}om[Uy^rbQUalkaN]^Tht\dY_c^[i^`sjri|w|y}{zysafzl}fk{sz|v_^ouv{xodomi[kkvpyf__anXq~~xv~jqqiZnhpg_aYS[zj|{`nortmiT^ohli\kcaclT[ehpd^[^St^\iagg`tv|vvevrjpn~wwnvmpiertyoloful_qgu|ngrreZle{p~mQ18/1FBFMUYiZVZfs{vq[?TXa\xq]OTZWdkwvz]^UJ\^giffxy|v\H@L8HROljqe\RYǸrqnmyo~uWrqMNZ_lq}qaZdCI]U_dewƬþ¨whMNfqjXa[]{z{}iI:1.2QV>FHQ_TGAUopxkgzhg]B*6uʣ~iSK`hmpZNLHHXp[T][pn]EDT_vytth^chlmmw|~xpd_[CIOEEGMYjkh`hsuo^bmTXY`{oeZRUnwagis}pd{yw{wujz}ûʮͫc??K9$4H|Ь}[QYfiaN65'$-D?0:;OPA*#9Gcloqnlkwy|rxztknRLSRKGMKTi{tsx}uleiuqc{oXOW]j~um|vtgn}|zp~|hmtmwu~ɼƢwvqzoK+'A71+?WԳnjl{p]>;'$+=>047MPE/+>Jiq|yo}wz~{w}`\_e]V^SZm{qs}t}w`vxdUKYfhz}b[iyuoj\fqywx}hwz~~|p`nurvr|zv|˼ȴi`dZk[=#,E::3IcЯ{lTR:/Ieȵ}pb[a]pmbh}ug]cctur~~tzv{qTfhaT=Pb]_^lotVK=;CBZZPXqlfZSVWts`psv^^jdw~sutlevmxfq{w|kGYPRfMB(=CC;'C]̽Öwgcfaxxkq{ogihrsqyw~{{~tV_gbX7H\umhfkqw_K?I`WLbqdeVTLZnt{i\mojScbd|}n{yklonjdnwoyugLaLU\ME+SeXQkpefWTK`m|xy]\jmaTf`l|m~zislnfimxpypbM^EPRLC+:DU?5VgʽͿugsjjs||rimlzjt{y}v}yfujjPGTacBOfsysj|{\FEPAUh]Rhpei[TL\n{uv]YfkaSfdoo|}kpqlegmqqxyk|z{gJZEDLGF,3CZP>\pпŨ{itrizwtli~ls}no~{}~sy_gdeVAM^nSTmv}wg|fKFUFRjcUbrglaTMVjyur^T`idUfgqpypovlegmmtwuisvvjKTC:BDF//B_[KexƮkwulxuli{jpyos~~ssZ]^cTAKcrY^r{wh|iKKXHYlfWdofn`SNWj|qnYT^iaWhgyo{ousibkln{wurcu|qtcLR<8>FC/2Kh[Vo~μӽį{oru~~qkmwkr}}n{~ttfTY_aMBRplZjwqo`IXVMgmcYljkmXQP^ryneTWbhY`insr{olcdmirzzwntid|}pnoTOG37AH;.<_gVdvǵľp|}qzwmlv~onxru~~qlUT\cVCIhr]cq{zn}nNV\NbmiYdkhq\OPWn|ngXU]j^]fgvor}qfdmjmv}ymo~m]tzolo]OK63?IA05XgV^n}ʷƴvw}zmntrmuuu{~slVR]dZEGho]akwssR\_Tgnm[djjrZPSXq{mfZU]i]^cg~ppvrfhnilv~yjm{i]sumko_PI52AIC05XbUZfvƷ̹|{{oqtuntwvy|unYO]d^KEdp`_ds|vZ]eXgora`jjt_PUUk}mg^UYha^abx|rl}z~wignljq~lktqZkrmklhTM;/>IG9/ObXW]p{ʹĬotr{rp}wzx}pbOUdbXBVpha_mv~zo[i`amso]fhqnRTT]wshc[Sag^a^l{}{is}~zqgllkjwufkv~`\ljjglaOF31EHG39]a[Zewмyquuznt|{y|ujYJXbaTC`ridbtx||jalagnvm^fiuiPWTa{nfdYRcfab_r{wiw{}y~oilkjhy~pehtyZZfdgbi^KB01EHI5?bec_l}ʿϻvrut{lt~}zxseWGU^`WEauokfy|}{rdmfimxr_ditkQXU_wpff\Qbigfbt~}kv{yz~rkmklfu}tdgly^U`_e`ecLC3.BGN?>bnmin}oup}}nm~}~vz~|vbWEK[]_IYwvuk{y~gnjimwyedhtqVWW[q~ref`R_jkkfsnv}x|{unnkmeq}wefhxaS][c_beMB4-@HRF@dstqs»¨}nso{}nm|~twy{ys^RCJX^`J]yyyo{~kpllnzygehvpVYW^r~qeh`Ubkpmhwny|x{{}sonkmct|sedjw\U[Zd]ebJ>10CJUDHluyrzƿʽvopr|}{jr}|~pws|zzhWJAPXbXLjz{vrwpqmnrshenzeWZYgx{jfjZ[gnskm~xowx}yqqjmgf}~ifbslUZW_a^iVC8-;FRQA\swvp½ǯ~pqp{zqmy}{{qspv{uqZNAJU__K^wyxnttpppzmfk{nZ[Zds}ofmaZdktnixm}y|z{{ttmmjbz{mganrXYV[c]i]F:/8DPTASmrtl~ɶ~rqpzzsmv~~yyzrrnt{urZMBIS^_K[rutjz~ywtrs|pgm}o]]]gt}ogn`\dlukgu|m~x{||wwnojc}|nhaoqZZV]d_k^F:09DPR@Qhnogx~ɸtrq{{unv|~w}wytrmq{uw]NCHQ\aLUmqsgtzzwurujj}ua^]fp}shof\chvoepzlyzyy}yzrnoau|tkciu`ZWXe_jfM<36ALVDHbjofo{~ztqy{}otwv~w|z}qojyuz~gRFCMUbVLcntlkyzyytz|rgt~ja]bkw{lkp`adpxiitvo}vyzzzymqge}}nhapm\ZS^cal]E72;CSRCSfnngw{Ǹwss|{xqu{w~tw}vpijxr|y`LCEMYcRRhqvkq{~yys~|qgx{ha]dkwxjmn`cdtxilusr|uwxyzxlpcf~}zmf`pj[XP^`bk[B53F[]U_o}{{}yprz|z{xv}~zn|ou{qj]ammvr[E@GL]f]`m{zyyrnextha\ghpqhpmggh}}oszuxxwppu|rji[hzxxqk^_haZMM[\ffS;4K[WV]jxtx|z|r{|~~}zurvwpxvrc[imtwjO@EHQb^[`jxvwy~x}~hrypk`gjjplorkibqqmo|uvt}xmr~}onaaszzurg^eecUJW]ei`F5:>EXXVYcstuy~uy~|}v~xqquvul[bkqwr\DBHJ\a\]brxuxy~xsjxtpfckhlolsolff{{nmtwvswqmwvoi^gvzxrpa`dd`NNZ_hgX=5=>M[WX[ivtxy|u}||}v~ssypttteYdksvnUAEHM``__evxxy||zolxrpdekhlnnsonei~zpnwxvrx~nkwtnf]huyvro`abe_MOZaihX>8@AQ][]^lyx||{~u}||x{~qrzpssvgZdkuxqYDHLPceddgx{||}~{wqiurqfdkhjnotrqii~tpvzvqv{ngr~unf\cpwwrrcabedQNYakkaG;DFRaadcl|}~|vz}z~z{z~sny~pqqvn\bjtyveLIPQciijix~}zu|uhrrrjdkhhnpvvunj|ysu}wpsx~pen|vmg\amwwrse`aegUP[cmnfO@IKUefigo|}vz|y}|yx|qnx~pqqwn^dku{wfONUUflmmk{~|xu{}riqqsjekhhnsywxnm{txvmfkmu~vc_n}wskdjrysli[[^jo_bjrywmWOXVbjkrq}x}{{wzmlotyksutnuwru}}xsbihkww{z{yyxzpqrvvinw|~ruvru{|wjs~w{ojlitsbR\|qeVV_infibZ_gvofot~zjX]`aprxx{}}|~|~vxr{~tho~okqzxytkot~s{~tacgftv|~}{}xyvxy~ss|y{pcbZ`f`X]u}ykfhmrhgbXZ^mj_egpsnbORWWeioss{tws||}rrksytknyvy~yzulos}qvw|p_bfgtw}~y{w~}|}vw}{}||ka`XagaY]u|zomotynoj`besmbffopk`PTXYgjqsr~~xpso~|{stlrytlk|xz~||zqrtrut|{rbdiiuy~~wyu}zvz~|{}qccZ^gd\Zm}{|rnps{srrgggrsdfdjpleVU\[glqvrz}|ynpmu{~vvomxwpjwy{||wuu|ussu~{wkdlksz|xvuv~xyy|}w{icaYcfb[ax|}zoqqw{swpkjlwmefdnokcX^_cnowvt{y|smomz~}}uvlpxuom~z{}wwvrspv}zvkjpnx|uvsxyyy|}v~xfd_Ydfc^g{}zprryzuzrnmowmgfeoome]dchqrywvzx|rmnmy}|tukovuqoz{}yxv~stpu}{xnmrpz}vvswzyw{~t|{}yhc`Ybgfbh|}rrqv{u{vponvphhdnqokbfgissy{wzx|vnomu}~|~ttlkuwur}z{z|zw{utqr}|{tpury~xutu{zv~{~~rxx{}zxibaYahigj|srru{v{xrpnvqiiensqnfjjkttz|xzx|wnomt{|}sskkuxwu{{z|{x|vuqs}}{uswt{xvtu~~|yv{}}{rxvzzxufc_Zdikio~stsx{w~xtqqxqmjhrtrnimkovv}|yyx}toonvzzzrripwywx}|}|{x}vvpy~|ztvvv~~vvsx}}}{wy|~~}~ttvuzwxncd\_hklkxyuvv|y}~vurwwppinvtrmnnmvvz~zzw|zppmrw|||stlluwxv~~}~}z}xxru~|{vvwu}~~wvsv{~}~|xv~}~~~vswtyxxqee^^gjlku}wxw}{}yxuwysslnvutoopmuvz|{w{{qpnqvz|{tulltvwu{zzsv~|{wxxu}~}vusvz~}~|xw}}~~~~~uuwuyxxqfg^_gikju~}yzy~|{zvyzuumpwvtpqqnvwz|{vz{qpnquy~|{uumltvwu}}{|tu}|{xxyu}~|wvsux{}~|yu~|~}~}}wswtxxxthha^fikjq|}z{z~~~}zz|wxqowwvsssovxy~|wy}tqoosu~zyvqkquwvy~~~zt{}|zx{vy~~||vtsvw}||vz{}}|}|svutxwwnhg^bhjlmx|}{{|}~~z}|yxptywvsvsrzy}~{v|zrqoqsy||{vvnlsuxw~~xu}}|yz{v}}}yvtsvw}}|{u|{~}~|z|yrvstwvulhf^dilnp{}}}|}~~|~|{yqvyxwuxst{z~|w}zsrorry{||vvnmsvyyyv}}|z{|v}}}zvtsuv~{|{zuz~z~}}{yzxqusrvuunig`djmpr|~}}~}}~||suzyxvzvt|{~~x|}uspqrv|}z~~wvplsvz{|v|}}{|~x|{|vtstt|}z{zzuw}y~}|}}zxxwpsrptttniiaekosu}~}~|~~}~uv{zyw{xu}|x}~usqrru|~}z}|~vvpmtw{}|v|}|{|~x}~|{vtstt}}~zzyytx|y~~}|~{yvwuptqqtssmkhbhmqtx~~~}~~ux{zyy}wx}~x|usqrrx{~{}||{vunpvy|yy}}|{|y{xvsssv|~zzyywu|z{}}{~ywuvqrsorssqkledkosv}}yw|{{z}{w~z|wurrrt~|}~{}}|~}wwpntw{}}x}}|{~~x|}yvssst}|||zyyxtzzz~}|~ywuvrquprssrlmgdjnru|}|x|||z}}w~{|yusrss}||~{}}|~}wwpmsvz}}y}}}|~y|}yvssrt|{{{zyywu{zz~}|~~ywuuqruqsttqmmfdjmqu{~~}y}}|{~~x||yvtsst||{~|}}|~}xxqmsuy|z}}}|y}|zwtssr{{z}zyyxuzzy~~|}ywuurqvqrttsnnhdilpty}~z}}}|~z}~{{wussrz|z|~|~|~~yxumqtw{{}~}|}{{{}wussqv|x|zyxyvw|x|~}}}{xutspttqsttpnmefknrv}~~~|~~}}~{|~ywttsu|z|~~}{}|}~~|xxrnsuy|{~~}|z~~{{wusrqx{x}~yyxxux{x}~}}}|ywtsrousqsssoomehmpty~~}~~~~||ywutsv}z|~}}~}z|{|}}{xyrnsvz}|~~}}{~{{wusrqwzw|~yxwwuwzw{~}}||{}yvtrqottqssspooghmquz~}~~~|~~{xvutt|{{~~~|}|zz|{|||xyuosvz~}}~}}~|}{|wusrquzw{ywvwuvzwz}}|||y|yusrqnstprssqppiiorv{~}~~|~{yvutu|{{~~~}}~|{xz{{||{xyuptw{}}~}}~|}{{wusrqvzw|}xwvvtwyv{}}||~zy{wtrqontsqrsspqpilptx}~~zxvutw}z}~}~}~}{zw|~z{||zxyrqvy}}~}}}{}}~yvtsqrxxx}zwvvuuyww|}|{}|xzyusqpmquqrssrprljorv{~}zwvuu{{{~}}}}{zwy{{||{xzuptw{~~}}{~~|zwusrqwxv|~|wvvvuyyw|}}|}}xyzusqqnpusrssrprnimquy~~zxwvu{{z~~~}}{zwz|{||zxzuptwz~~~~}|~|zwusrqwwv{}~{xvvvvzxx|~}|~|wyyusqqnqvsrssrprmimpty~{ywvv{{z~~~~}{zxy|{||zxyupsvy}~}||{wusrqvwuy|~|xwvvuyyw|~}}}}xxyvtrqnovtrsssproilpsx}|zxwuy|y}~~~}{zxx~~{||{xyxqrux|~~~~}}~}xvtsqswuw{}~ywvvuw{xy}~}}~zwywtrqpnsvssssrqrljnquz~{yxvw{zz~~~~~|zzwy}{|{zxyvpsvy}~~}~}|xvtrquwtx{}~~xwvvuxzwz}}}}}yvxvsrqontvssssqrrllpsw|~{yxww|z{~~~}{zyvy~|{{{zxzvqtwz~~~}~||xvtrqtwtw{}~~xvuuuwzwy}}}|}yuxvsqpomsvssttrrsnlpsx||zyww{{z~}}~}{yxvw}}{{{zxzxrtwz~~}~~}|~}xvtsqswtv{}~yvuutvzwx|}|||yuwusqpomrvttttsrtomqty}|zyxx||{~}}~~~|zyxvw}}{{{zxzxsux{~}~}}|~|xvtsqtvtw{}}xvtttwzwx|||||wtvtrppnmsvttttsstoosvz~|zywy}{|~}}}}~~{yxwuy~|{{{yyzvsvy}~}}|~}~zwusrrvuty{}zvuttuyxwz||||ztuurqpompvutttsrtrnqtx}}{yxx||{~~}}~~}~{zxwuw}}{{{zxzxsux{~}~|~}{wvtrruvtwz|~|wvuuuyywz|}||{utvsqppnouvttttrtrnpsw{~|zyx||z~~}}~~}~{zxxvw}}{{{zxzwstw{~~}~{wvtrruuswz|~{wvuuvzzx{}}}}{uuvsrppnqvvuutsrtrnpsw{~|{yy||z~~}}~~}~|zyxwx~~||{zyzxstwz~~~}~~}xwusruvsvy|~~|xvuuvz{xz}~}}|wuvtrqqopvwvvvustsopsvz}{zy{}z|~}}~}~}{zyxw}}}|{zzzutwy}~~~}zxvtstwtux{}~~ywuuux{yy|~~~}zuvvsrrqptxxwwvuturorux|~}{zz}|{~~}}~~}~|zyyxy~}}{z{ytux{~~~~}}~zxvusuwtvy{}}{xvtrppooqstuwutsqponorux{{|~~}|zyyy{|}|zxvtsstuwz}~{xvuuvz~||}|xvuuuvxy{|}~~~|{zywvvvwy}ywwtrrqrrrtuwyz|}~~}|{yxwvwxy{}~}|zxwwwz|}|{{|}~~}~}{zzz{|~~}|}~}|{{|~~}|yvtrtyzvqnlkklmnoqrssrqonmlllmortwxxwvtrqppqsux|~~~~}|{{}}zxxxyz{}~}|{zz{|~~|{{|~}{ywutrqqqtx{wsqpoppqrsttsrpnmlkkkmoqtvwwvusqpooprux|~~~~~}|{{zz|}{yxxy{|~~|{zzz{}}|{{}~{yvusrqpqrv{zwtrqqqrsttutsrpnmlkklnpsuwwwutrponoqsvz~~~~~~|{{zzz{}}zyyyz|}~|{zzz{}}|{{|~~{yvtsrqpprty}zwusssttuvvvusqomlllmnqsuwxwvtrponoprux|~~~~~||{zzzz||{zz{|~~|{zyz{}}|{{|~~{yvusrqqqrtw||ywvuvvvwwwwutrpnmlmnortvxxwvtrpooopsux{}~~~}|{{zzzz|~~|{{|}~~|{zyz{}}{{{|~}{xvtsrrqqrsvz{yxwwxxxyyxwusqonmmnoqtvxxxvurqonopruwz|~~~~}|{zzzzz{}~||}~~}{zyyz|~}|{z{}~{yvtsrqqqqrux|~|zyyyyzz{zyxvsqonnnoqsvxyyxvtrpoooqsvx{}~~}~}|{zyyyyz|~~}}~~|zzyz{}~|{zz{}~|ywusqppppqsvz~|{zzz{{||{zxvtrpoopqsuwyzyxvtrpooprtwz|~~}~~|zyxxxxyz|~~~~~|{zyz{}~|{zz{}~{xvsqpooopqtx|}{{{{||}}|{zwusqppprsvxyzzywusqooprtwz}~~~~}{yxwvvwxz}~~~~~}{zzzz{}~|{zzz|~~~~{xvutssssrrrstvz~|zxwwxz|~~|zwtqpooqtwz{|}|zwurqpqsvz}{vspoorv{~{yxy|~zvtssuy}zvsrsvz{yyz|zupmkjkmpswz}~|yxwvvvvwxyz{{zzxwvtsrqrstvy{}~~}||}}{z{}~}}}~~}{ywutux||yxxz|~~{ywvvxz}~{zxxz|}|{|}{wrmjhgilpv|~}||}~zvrpnopsw{~{wrolkmptz|z{}~{yxz}|ywvvvwyz|}~}|{zzz{|~}{yxyz{}}{zz{{{||{ywurpnmmnpty|{zz{|~~{xvtsssuxz}~~}zwtqopquz~}}~|zz{}{wtqpopruy}~|}~}yvuuvy}{wutvy|~||}~|xusqpoopqrtvxy{}}{ywwxz|}~~}{ywvvvwyz{{zwusstvy}~~~~~~}{zyxwwxz|}|}~|ywvx{~{wutux|~|zyyz{|~}{xurolkjkmpty{wuuwy|~~{ywuuvwxz{{zyxwwwxz}}|{{|}|yvtrrrsux{~}|~}zxwx{~}yvutvx{}zxusrqqrstuuvvuutuvy}|xvvwy|~|yvtssstvy{}~~}}}}~~}}}~}{xurqrtw|}}}}{zyyz|~~}||{||}~~|zyyyz{}~{wspmllmpsvxzzzz{~{xvuvwz|}{xvsrqqrtvy|~}|||}}zyxyz|}}{yvsrsw{~||||~~|zxwvuvvxz}}zxxxy{}}}{wsolkknrvy{|||}}{zyxxwwwwwwwxxy{|~~}{{|~|ywwxz{|{yvtstw{|zyxxxyz{}~~~~~}{{|~|ywvwxz||zwsolkknquy|~~|{zyyyz{}~~|zxvutuvwz}}{{}{xvvwyz{{zywvvwz}~~~~~~~~|zxvuuvwz}}{z{}~{xvvvxy{{ywtqnlklnqty}~}|{{zyxwwvwxy{}~~}|}~~~|{{}}zwusrstvx{~~|yvuvy|zurqsx~~{{}|xuuwy|}zxurqoopqsvxyzyxvuttw{}xvvx{{xvuvwy{}}{yxx{~||}}zxxz|ztpmmptx|~|}~~|zxxxy{~{wsqruz}{|~}wssuy~}yusstvvvtrnkiijnsy}zwwwz~zuqprw|}zxy|~~}}~|xurqpprtwz~~}~}|{{}}{ywxy{|~~}|||}}~~~|zxusqpopqtvxzzzxusqqtx~~|xvwz}~|yxwwwxy{|~}zyyz~}yustvyzzxvttv{~{xxxz|~}{xvttuwz~|xvvy}~{xwwz|~}zuplihilptx{~~~~|yxxz|}}|zxwy}~~}}~|xvtsrstvx{}~~}|{{|~}zyz~{vttwz~~{yyy{~~}}}~~|zwtrqppqsuxyyxvrollnrx~{{{}}zxwvvvxz|~|yxx{zvttvyz{ywutvy}}{zzz|~|yvtrrsvy|~zyz}}zwvwz}~~|yuqnmnpruwxwwvuuvwz|~~}~{yxz|~|yvuw{}}~~{yxwwxyzzzzyyzz{|}}}{zzz{}}}}yvvwz}~|ywvwy{}}||}~~}|zyxvtrqqrsuwxxvtpnmnqv|~}}~}{zyxxyz{}}||~~zxwxz}~|yuqpquz~}||}}}zxvuuvwy|~~}~~{z||xttuy|~~}yuronnpruwxyxwvtsstux{}|}{xuvx}~}{xwvvwyz|}}}}|{yxwvvwxz|}yxxz}}zwvvvx{}~}}}}~|ywutsstuvwxxxvtqnmmnrv{~~}||~}{zzyyyz{}~}{{}zwvwy|~}{xussvy|~~}|{|~~|ywvuuwy{~}{yyz|}|~|yxxz|}}{yvsrqrsuvxxxwvtrqppprtw{~~}}}zyz}}{{}}|{zzzz{{|}}}}}|{ywvtsstvy|~zxxz}|zxwwxz|}~~~}}}}~~|xurqqsux{||{xsoljjmptwyzz{|~|{zz{}~||~|zz}}|{{yvtrqsvz|yvuuvy}~{xvttux{~~{yxxy{}|ywx{~xsollnqux|~~|yvroljijloty~~|{{}{vstx~~}}|ywvvx{~{xtqnmlmpsw|~zwxz}{wtssvy}~zwuuwz~}zyxxxz{}~}zwsokiijmptwxyxxxz|~~}|}|yxxz~~{yyz}{xwwxyxxwvvx{~}zwuttuwz}}yvvx{~zvtstw{~|yvuwz~}zwtqpopruxz|~~}|zwurpnmlmnprvz~~}~zy{~}{zz{|}~|zzzz|}}zwtrpoopruy}~~~|{{|~}zxvuuuwx{}~}|{zzzzz{|}}zwspnmmnpqrsstvwy{{zywuvy~|{{|}~}zxvttux{~|yurpprv{}zxwwy{}~}|{{zyxvtttvy}~{xusrqrsuwy{||{yurnkjjlpuy}~|{{|~{yxxyz{|}~}{zz{|~}yurqqsvz|~}{yvuuw{}|}}{zywwvuuuuvwxz{}~|zxwwxy{~}zuqnmoruy{{ytplklpuz}~}{yxz}~}||}}~~}{{{|}~{yvutvwyz{zxvvvx|~|zyyyz{{|}}}}}}~~|zxwwwyz|}~{xuuvx{}~|yurqqrtvwvuronnpsw{~~}|||~~}|{z{}~~}{{|~|xusrtwz}~|yvuuvy}~~~|zxwutttuwz}~|{{|~~zxwwy|~~}{xtrqrtvxyyxvtrqqqqstwz~~}}}~~~|zz{}|yusrrtvy|~~}}~~}|{zzz{|~~{xuttvy}|zyz|{xvvwz}}zwtqpopqsuwyz{{{{zyxwvvwxz|}|||~~~~~}{yyyz|}~~}{ywutstuwy|~|zyyz{}}zwuuwy}}{zz{}~~~~}||{z{zyz{|~~~~}{yz~||}~}yvtsuwz}~~}|zyy{}}}~|{zz{|~~}}~{zzzzzzyxusrrsuxz{{xuqnllnrw|{wy|wspnlklnquz~~|{{|}}|}}yvuvx|}zxwwxyz|~|||xvtssux|~zxwwxz}|xvuvy}||||||{{{|~|zz{}}wqlkmt~~yurpnnoqtvwxwurolkjknquy}~|{{zzzzyyz|{wuuvy}~|{{{}{vsqrv}{xvuvwy{}~~~}|{{{{{|}~~zwwx|~{vqmkmqx{uqnmnpsuxzzzxuroljijmqu{|ywuuvvwxy{~|xussuw{}||}{xvx||wutvy}~{wuttvy|{yxxz~}~~~}}~ysollou}~zwuuuvwwwwvtsqponnnoqtx|}{xvuttuuwy|}{zyxyz|~zurqsy{vttvy}}yvttux|}zyxy}~|{zz{}~}ytpmmou}~ywvwxyz{zywusrqpoooqruw{}}zwusqqqsuy}|zyxwwxy{~~~~yutv{|ywxy|}zwuuvxz~~}}}}}~~~~}||}~ytnkjnt}}xvvxz|}}{xurpoopqrtvwxz{|}}}}}|{yxvtsrstw{~|{zyyz{}|xvvx~{yxy{~|zwvvvx{~|zxwwxz~~|{z{|~~|zyz|~|xrnllqx|yxy{~|yuqommnpsvz|~~}{ywvtssrrrsux}}|zzyyz|~|yvvw|}}}~~}|zyyyy{|~~}}||||}~}}}~|yxxy|~}ytolknt}|zz|}~|yvtrqqqstvxz|}}}}|{zyxwutssstvy|~|zyxyz|~|xuuvz~|yvuuvxz}}|zyyxyz}~~~zxwxz|~~}zvqnlmrx|yvtrqqrtwy|}~}|zywvutsrrstux{~}{yxxy{~{wtstx~~}{yxxy{}~}}|{{{{|~~~~~{yxxyz||{yvronosx|yvtsstuwy{|}~~~}|{zxwutsrrrtvy|}{zyyz|}}}~yussvz}zxwvwxz}}|{{{{{{|}~~~~~~|zyyz{||{yvrnllot{~{yvutuvwy{|}}}}}||{zyxwvtssrstwz}~|{zzz{}~}}~~zwtsuy~|zyyyz|}~|{zzzz{|}~}||}~}{xwvvxyz{zyvrpoorw~~zwuttuwy{}~}{zyxwvutssssuw{~~}||||}~}}}~}zvtsuy~}{zyyz{}~}|zyyyyz|}~}|||}~}{xwvwxyzzyvspnmosy}zwvuvwy{}~|{zxwvuuttttuwz}~}{{zz{|~~|{{|}~~|ywuuw{~|zzzz{|~~|zyxxxyz}~}|||}~|yvuttuwxyywurpopty~{xwvvxy{~}|zxwvutttuvxz}~}|||}~}|{{|}~}{xvuux|}{zzz{}~~|{zyxxyz}~}{{{{|~~{yvtsstuwwwvtrqqsv|~|zxwwxz|~~}{ywvutsstuwz}~}|{{{|}}{zyz{}~~}zwuuvy~|zyyy{|}{zyxwxxz|~~}|{{{|}~~{yvtsstuvwwvusqqruy}{zyyz{|~~}{zxwvuttuvwz|~}|{{|}~~|zxyz{}~~{yvuuw{}{zzz|}}{zyxwxyz|~|{zz{|}~}{yvtssttvwwvusqpqsw}|zyyyz|~}{yxvutstuvx{~~}||||}~~|yxxy{}~~~|ywutvy~}{zz{|~}|zyxwwxyz|~~|{zzz{}~}zxutsstuvwwvurpoorv{~|{{{|}~}|zxwvuuuuvxz}~}}||}}~{zyyz{}~~}{yvutvy~~|{zz{}~|{yxwwwxy{}}{zzz{|~}zxusrrsuvxxwvsqoopty~}|{{|}~|zxwvuuuvwxz|}|||}~~{zyyz{}~~}|yvtstw{}|{{|}}{zxwwvwxy{~}|{zzz{}~~{yvtrrrsuvwwvtrpoprw|}|{|}~~|zxwvuuvvxz|~~}|||}~~|zxxxy{}~~}{xvttvy}~|{{{|~~|{yxwwvwxz|~|{zzz{|}~~|ywtrqrstvwxwvtqpoqtx}~}|}}~|zxwvuuvwxz}~}|||}~~{yxxxy{|}}|zwuttvz}{{{|~}|zywwvvwxz|}{zyyyz{}~}{yvsrqpqsuvwwvtrqqruz~}}}~~|zywvuuvwy{}~}|||}~}zxwvwxz{}}|{xvuuwz}|{{|}~}{zxwvvvwyz}}{zyyyz{|}~~}{xvsqppqrtvwwvtsrrsv{~}}~}{yxwvvwxy{~~}|||}~}zxvvvwy{|||zywvvx{~|{{{|~}{yxwvvvwxz}~|zyxxxyz|}~~|zwtrpopqrtvwwvtsrrtx|~}~~~|zywwvwwy{}~}||}}~~{ywvvvxy{||{zxwvwy}}|{{|}~|zywvvvvxy{}}{yxxxxy{|}~~~}{xusqoopqsuwwwvtsrsuy~~~~~|zyxwwwxz|~}|||}~~|ywvuvwyz|||zywvvx{~|{{|}~}{yxvvuvwxz|}{zyxxxyz|}~~~}{xvsqpopqsuvwwvtsrrtx|~}{yxwwwxy{}~}||}~~|ywvuvwy{|||zxvuuwz~}|||}~}{yxvvuuvwy{}}{zyxxyz{|}~~~}{xvsqpopqsuvwwutrqrtw{}{zxwwwxy{}~}}}}~|ywvuvwy{|}|zxvuuvy}~|||}~}{yxvvuuvwxz}}{zyxxyz{|}~~~|{xvsqpopqsuvwwutrqqruz~~|{yxwwxy{}~}}~|zwvvvwy{|||zxvutux{}||}~~|zxwvuuuvxy{~~|zyxxxyz{}~~~}{yvtqpooqrtvwwvusqqrtx|~|zyxxxyz|~~}}}~}{xvuuvxz{||{zxvttvy}~}||}~}{yxvuuuvwxz|~}{zyxxxyz|}}~}|zxusqoopqsuvwwvtsqqsuy~}|zyxxxy{|~~}}}~|zxvuuvxy{||{zxvuuwz~~}||}~}{ywvuuuuwxz|~|zyxxxxyz{|}}}{ywtrpoooqsuvwwvusrrsvz~|zyyxyz{}~}}}~|zwuuuuwy{|||zxwvvxz~}|||}~}{yxvuuuuvxz|~~|zyxwwwxy{|}}}{zwurponoprtvwxwvtsstw{~|{zyyyz|}~}}}~~|ywuttuwy{|||zywvwx{}|||}~~}{ywvuuuvwxz}~|zxwwwwxy{||||{yvtqpnnopsuvxxwvuttux|~|{zyyz{|~~}}}}~}{xvtttvwy{||{zxwvwy|~}|||}~~|zxwvuuuvwy{}~|zyxwwwxyz{|||{zwurponnprtvwxxwuttuwz~}|zzyzz|}~}}}~~|ywuttuwyz|||{ywvwx{~}|||}~~}{ywvuuuuwxz|~}{yxwwwxyz{|||{zxusqonnoqsvwxxwvtstux|~|{zzzz{}~}}}~~|ywuttuwyz|||{ywvvwz}~|||}~}{ywvuttuvxz|~}{yxwwwxyz{|}}|zxusqonoprtvwxxvusssux{~}{zzzz{}~~~~|ywuttuwy{|||zxwuuwy|~}||}~}{ywvuttuvwy{}}{zxxwxxyz||}}|zxvsqooopqtvwxwvusrrtvz~}|{zzz{|~~~~|zwuutuwyz|||{ywvuvx{~}}}~~|zxwutttuvxz|~~|zyxwwxyz{|}}|{yvtrpoooqsuwxxwvtsrsux|~}{zzz{|}~~~~{yvutuvxy{||{zxvuuwy}}|}}~}{yxvutttuwxz|}{yxwwwxyz{|}}|zxusqonopqtvwxxwutsstvz~~}{zzz{|~~~~}zxvttuvxz{||{zxwvvwz}~}||}~}{ywvuttuvwy{}~|{yxwwwxyz{|||{zxusponnpqtvwxxwvuttuwz~}|{z{{}~~~~~}zxvtttuwy{|||{ywvvxz}}|||}~}{yxvuttuuwy{}~|{yxwvwwxz{|||{zxusqonnoqsuwxyxwvutux{}|{{{|}~~~~|zwutttuwy{|}|{yxwwx{~~}|{|}~~}{yxvuttuvwy{}~|zxwvvwwxz{|||{ywurponnoqtvxyyxwvuuvx|}|{{{|}~}~~~{yvutttvxz||}|zyxwxy|~||{|}~~|zywvuttuvxy|~}{yxwvvwxyz{||{zxvsqonnopsuwxyyxwuuuwz~~}|{{|}~~~~~|zwutttuwy{|}|{yxwwx{~}|||}~~}{yxvuttuvwy{}}{zxwvvwxyz{|||zyvtrpnnopruwxyyxwuuuvy|}|{{|}~~~~}zxvtttuwy{|}|{yxwvwz}}|||}~}{yxvutttuwxz|~}{zxwwwwxy{||||{yvtrponopsuwxyxwvuttux|}|{{||~~~}zxvtttvxz{|}|{ywvvwy|~}||}~}|zxvutttuvxz|~}|zyxwwxxz{||}|{ywtrponopruwxyxwvtssuwz~~||{{|}~{xvuttvwy{|}|{ywvvvx{~}||}~~|{ywuttttvwy{}~|zyxwwwxyz||}|{zxusqonoprtvxxyxvutstvy|}||{|}~|zwuttuvxz||}|zywvvwy|~}||}~~|zxvutttuvxy{~}{zxwwwxxz{|}}|{ywtrponopruwxyyxvuttuwz~}||||}~|ywuttuvxz|}}|zywvvxz}~|||}~}|zxvutttuvxz|~}{zxwwwwxy{||||{yvtrponopruwxyyxwvutuwz~}||||}~~~|ywutttvxz|}}|{yxwwxz}~|{{|}~~|zxwutttuvxy{~}{zxwvvwxyz{|||{ywtrponoprtwxyzyxvuuvx{~~}||}~~~~~{yvutttvxz|}}}{zxwwx{~~|{{{|}}|zxwutttuvxz|~}{yxwvvwxyz{||{zxvtqpnnopsuwyzzyxwvvwy|~}||}~~~~}zxvtttuwy{|}}|{yxwxy|}|{{|}~~}{yxvuttuuwy{}~|zxwvvwwxz{|||{ywusponnpqtvxyzzywvvvwz}~}||}}~~~|ywutttvxz|}}}{zxwwxz}~|{{{|}~}|zxwutttuvxz|~~|zyxwvwwxz{|||{zxusqonnoqsvxyzyywvuuwy|}}||}~~~|ywuttuvxz|}}}{zxwwxz}~}|{|}~~|zxwutttuvxy{~~|{yxwwwxyz{|||{zxvsqooopqtvxyyyxwuuuvx|}}||}~|ywuttuvxz|}}|{yxwvwy|}|||}~~|zywutttuvwy{}~|{yxwwwxyz{|}}|zxvtqpoopqsvwyyyxvuttuwz~~}||}~}zxvutuvxz|}}|{zxwvwx{~~|||}~}{yxvutttuvxz|~}{zxwwwxyz{|}}|{ywurpoooqsuwxyyxwvttuvy|}}||}~|ywuttuwy{|}}|{ywvvwy|}|||}~~}{ywvttttuwy{}~|{yxwwwxyz{|}}|zxvtqpoopqsuwyyyxwvutuwz}~}}|}~~{yvuttuwy{|}}|{ywwwxz}}|{||}~|{ywutttuvwy{}~|zyxwwwxyz{|}||zxvsqpoopqsvxyzzywvuuvxz~~}}}~~{yvuttuwy{|}}}{zxwwxz}}{{{|}~~}{ywvuttuvwy{}~|{yxwvwwxz{||||zxvtqpoooqsuwyzzyxwvvvx{~~}}}~}{xvuttuwy{|}}}|zyxwxz}~|{{{{|}~~|{ywvuttuvwy{}~|zywwvwwxz{|||{zxvsqooopqsvxyzzzxwvvwy|~}}}~|zwutttvwy{}~}}{zxxxy{~~|{z{{|~}|zxwuuttuvxz|~}{yxwvvwxyz{|||{ywtrpooopruwyzzzyxwvvxz}~}}}~}{xvuttuwy{|}~}|zyxwxz}}{{{{|}~~|{ywvuttuvwy{}}|zxwwwwxyz{|||{ywusqoooprtvxzzzyxwvvwy|~}}}}~{ywuttuwy{|}}}|zxwwxz|}|{{|}~~}{ywvuttuvwy{}}|zxwwwwxy{|}}|{zwusqooopruwxzzyxwvuuvx{~}}}}~~|ywutuuwy{|}}}{zxwwwy|}|{{|}~~}{ywvutttuwy{}~}|zyxwwxxz{|}}}|zxvsqpooprtvxyzyxwvuuuxz~~}}}~|zwvuuuwyz|}}}|zxwvwx{~~}|{||}~|zxwutttuvxz|~~|{yxwwwxy{|}}}|{ywtrpoopqsuwyzzyxvutuvy|~}}}~~{ywuuuvxy{}}}|{yxwvwy|~|{{|}~}{zxvutttuwxz|~}|zyxwwxxz{|}}}|zxvsqpooprtvxyzzywvuuuwz}~}}}~}{xvutuvxz{}}}|{yxwwxz|}|{{{|}~~}{yxvutttuwyz}~}|zywwwwxy{|}}}|zxvsqpooprtvxzzzyxwvuvxz}~~}}~}{xvuttvwy{}~~}|zywwxz|}|{z{{}~~}|zxvutttuwxz|~~|zywwwwxyz{|}||zxvsqpooprtvxz{{zywvvwxz~~}}~}zxvuttvwy{}~~}|zyxxxz}}{zzz{|}~~}{zxvuttuuwy{}~}|zxwwwwxyz{|}|{zxusqoooprtwyz{{zywwvwy{~}~~~|ywuttuvxz|}~~}{zxxxy{~~|{zzz{}~~}{ywvuttuvxy{}~}{yxwwwwxz{||}|{yvtrpoopqsuxy{{zyxwvvxz}~}}~}{xvuttvwy{}~~}|zyxxxz}}{zzz{|}~~}{zxvuttuvwy{}}{yxwwwwxz{|}}|{ywurqoooqsuwyz{zyxwvvwy|~}}~~{xvutuvwy{}~~}|zywwxy|~|{z{|}~}|zxvutttuwy{}~}{zxwwwxyz{|}}}{ywurqoopqsuwyzzzywvuuvx{~}}~~~{ywuuuvxz{}~~}{zxwwwy{~~|{{{|}~~|zxvutttuvxz|~}{zxwwwxyz{}}}}|zxusqpopqsuwyzzzywvuuvxz}~}}}~|ywvuuvwy{}}~}|zxwwwxz}}|{{||~~}{ywvuttuvwy{}~|zyxwwxyz{|}~}|{yvtrpooprtvxyzzyxvuuuvy|~}}~~{xvuuuvxz|}~}}{yxwwwy|~|{{{|}~~|zxwutttuvxz|~}{zxxwwxyz{}}~}|zxusqpopqsuwyzzzyxvuuvwz}~}}~}zxvuuuvxz|}~~}{yxwwxy|~|{{{{|~~|zxwutttuvxz|~}{zxwwwxyz{|}}}|zxusqpopqruwyz{zyxwvvvxz}~}}~}zxvutuvxz|}~~}|zyxwxz|~|{zz{|}~~|{ywvuttuvxz|~}|zxwwwwxy{|}}}|zxusqpooprtwyz{{zyxwvwxz}~~~~}zxvutuvxz|}~~}|zyxxxz|~|zzzz{}~~|{ywvuttuwxz|~}{zxwwwwxy{|}}|{ywusqpopqsuwyz{{zyxwvwy{~~~~~~|ywuttuwyz|~~~}|zyxxy{}}{zzz{|}~~}|zxvuttuvwy{}~|zyxwwwxyz{|}}|{yvtrpooprtvxz{{{zxwwwxz|~~~}zxvutuvxz|}~~}|zyxxxz|~|zzzz{}~~|zywvuttuwxz|~~}{yxwwwxyz{|}}|{ywtrqoopqsuxy{{{zxwvvwy{~}~}{xvuuuvxz|}~~}|zyxwxy|~|{zz{|}~~|zywuuttuwxz|~~}{yxwwwxy{|}}}}{ywtrqpoprtvxyz{zyxvvuvx{~~}~~~{ywuuuvxz|}~~}|zxwwwy{~}{{{{|}~~}{ywvuttuvxz|~~}{yxwwwxy{|}~~}|zwusqpppqsuwyzzzyxvuuvwz}~}}~~|ywvuuvxz{}~~}|zywwwxz}~|{{{|}~}|zxvuttuvwy{}}|zyxwwxyz|}~~}|{xvtrpppqrtwxzzzyxwvuuvy|~~}~}{xvuuvwxz|}~~}{zxwwwy{~}{{z{|}~~}{ywvuttuvxz|~~}{zxxwwxy{|}}~}|zxusqpppqsuwyzzzyxwvuvwz}~~~}{xwvvvxy{|}~~}{zyxxxz|}|{{{|}~~}{yxwvuuvwxz|~~}{zyxxxxyz||}}}{zxvtrqqqstvxyz{{zyxwwwy{}~}{yxwwwxy{|}~~}|{zyyy{|}|{{{||}~~~}|zyxwvvwxyz|}~}|zyxxxyyz{|}}|{zywutsrssuvxz{{{{zyxxyz{~}{zxxwxyz{|}~~~}|{zzz|}}|{{{||}~~~~~}|zyxxwwxxz{|}~}|{zyyyyz{{||||{zywuttstuvwyz{{{{zzyyz{|~~}{zyxxyz{|}~~~}}|{{{{|~~}|||||}~~~~~}}|zyyxxxyyz|}~~}|{zzyyyzz{|||||{zxwvuttuvwyz{{|{{zzzz{|~~|{zyyyz{|}~~~~}||{{{|~~}|||}}~~~~~~}|{zyyyyyzz{|}~~~}|{zzzzz{{|||||{zyxwvuuvwxyz{{||{{zzz{|}~}|{zzz{{|}~~~~}||{{||~~}}}}}}~~~~}|{{zyyyyz{||}~~}}|{{zzz{{|||}||{zyxwwvvwwxyz{{|{{{zzz{|}~}|{{{{{|}}~~~~}}|||||}~}}}}~~~~~~~}}|{zzzzzz{||}~~~~}}|{{{{{{{||}}}||{zyxxwwwxyyz{{||{{{z{{|}~~}||{{||}}~~~~}}||||}}~~~}}}~~~~~~~~}||{{zzzz{||}~~~~~~~}}|{{{{{{||}}}}|{{zyxxxxxyyz{{|||{{{{{|}~~}|||||}}~~~~~}}}||}}~~~~~~~~~~~~~}}||{{{z{{{|}}~~~~~~}}|||{{{{|||}}}||{{zyyxxyyyz{{|||||{{{||}~~}|||||}}~~~~~~}}}}}~~~~~~~~~~~~~~}}|||{{{{{||}}~~~~~~}}}||{{{||||}}}|||{zzyyyyyzz{||||||||||}~~~}}|||}}}~~~~~~~}}}}~~~~~~~~~~~~~~~}}|||{{{|||}}~~~~~~~}}|||||||||}}}|||{{zzyyzzz{{||}}}}||}}}~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}||||||||}}}~~~~~~~}}|||||||||}}}|||{{zzzzzz{{||}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~}}}||||||||}}}}|||{{{zzz{{{||}}}}}}}}}~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||}}}~~~~~~~}}}}||||||}}}}}}|||{{{{{{{{||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||}}}}~~~~~~~~}}}}|||}}}}}}}}}|||{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}||||{{{{||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}|||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m55.bin b/applications/SprPoP/assets/packed/MUS/m55.bin deleted file mode 100644 index 8188946..0000000 --- a/applications/SprPoP/assets/packed/MUS/m55.bin +++ /dev/null @@ -1,3 +0,0 @@ -~~~~~}}}{{|}{|}||~~y{x}|zyxwwwvvvwwxy{|}~}{zyxwwwvvuuuuuuuvwwy{}wtzxy|~~}{zyyxwwwwwwxxyz{|}~~}{zyxxwwwvvuuuuuuvwyz{}~wtxyvvxz|~~~}}||||{{||||}}~}xtqt{}zwutttttuvwxyz{{zyxwvtsrrrrrsttvwxyzz{{{||||}}}~~zwutuz|zxwvvvwwwxxxyyyyyyyyyyxxxxxxxxyyyzz{||}~~{xvuux||zxwuttsrrrqqqqqqqqqqqrrrrssttuvvwxyzz{|}~~|zyy{~~}}|||||{{{{{zzzyyyxxxxxyyyz{|}~}yurqqsx~~{ywwwwwxxxwwvusrqppppqqrsuuvwwxxxwwwwwxxyz{|}~~|ywutstwz~~|{zyxxxxxxxxxxxxxxxxxxxxyyyyyzzz{||}}~~|ywuuux|}{ywvuttssrrrrqqqqqrrrrrssttuuvwwxyzz{|}~}{yyy{~~}|||{{{{{zzzyyyyxxxxyyyzz{|}~}zwtrqqtx}}{zyxxyyyyxxwutsrqpppqrstuvwwxxxxxxwwxxxyyz{|~}{zxvtssuwz~~}{zyyxxxxxxxxxxxxxxxxxyyyyyzzz{{||}~~~|zwvuuvx|~|{yxwvuttsssrrrrrrrssssttuuvvwxxyz{{|}~}|zyyz{~~}||{{zzzyyyyxxxxxxyyyz{{|}~~{xusqqrtx}~}{{zz{{{zzyxvutsrrqrrstuvwxxyyyyyyyxyyyyz{|}~~|zxvutstuwz}}|{zyyxxxxxxxxxxxxxxxyyyyzzz{{||}}~~~|zxwuuuvy|~|{yxwwvuuutttttstttttuuuvvwwxyyz{{|}~~~|{zyyz|~~}}||{{zzyyyyyxxxyyyzz{||}~~|zwtrqqrtx|~}||||||{zyxvutssssttuvwxyyzzzzzyyyyyyzz{{|}~~}|zywuttstuwz}~}|{zyyyyxxxxxxxxxyyyyyzzzz{{||}}~~~|zywvuuuwy|~}|zyyxwwvvuuuuuuuuuuvvvwwxxyyzz{||}~~~|{zyyyz|~~}}|{{zzzyyyyyyyyyzz{|}}~~|zxvtrqqrux|~~~~~}}|zyxwvutttuvvwxyz{{{{{{{zzzzzz{{|}}~}|{yxvuttttvxz}~}||{zzyyyyyyyyyyyyyyzzzz{{{||}}~~~|{yxvuuuvwy|~}|{zyyxxwwwwwvwvwwwwwxxyyyzz{{|}}~~~}{zyyyyz|~~}||{{zzyyyyyyyzz{{|}~~~~~~}|{ywusrqrsux|~}{zyxwvvvwwxyzz{|||||||{{{{{{{{|}}~~|{zxwvutttuvxz|~}|{{zzzzyyyyyyyzzzzzz{{{|||}}~~~}|{yxwvuuuvxy|~~}|{{zyyyxxxxxxxxxxxyyzz{{{||}}~~~}|{zyyyz{|~~}}|{{zzzzzzzzzz{{|}~~~}}|||||{{yxvusrrrsux|~}|zyxxxxxxyz{{|}}}}}}|||{{{{{||}}~~}|{yxwvuutuvwxz|~}||{{{zzzzzzzzzzz{{{{{|||}}~~~~}{zyxwvuuuvwxz|~~}}||{{zzzzyyyzyzzzzz{{{||}}}~~~}|{zyyyyz{|~~}}|{{{zzzzz{{{||}~~~}|{{{{{{zzywvtsrrrsux{~}|{zyyyzz{{|}~~~~~~~~}}}|||||}}~~~}|{zyxvvuuuuvwxz|~~}}||{{{{{{{{{{{{{{{||||}}}~~~~}|{zyxwvvuuuvwxz|~~~}}||||{{{{{{{{{||||}}}~~~~~}|{zyyyyyz{|~~~}||{{{{{{{{||}}~~~}|{zzyyyyyyyxwvtssrstvx{}|{{z{{{|}}~~~~}}}}||}}}~~~}|{zyxwvuuuuuvwyz|~~~}}||||{{{{{{{{{{|||||}}}~~~~~}}|{zyxwwvvuuvvwxz|~~~~}}}|||||||||}}}}}~~~~~}||{zyyyyyyz{|~~~}}||||||||}}~~~}|{zyyyxyyyxxwvutsssstvx{~~}}||||}}~~~~}}}}}}~~~}|{zyxwwvvvvvwxy{|~~~~}}}||||||||||||||}}}}}~~~~~~}||{zyxxwvvuuuvvwyz|~~~~~~~}~~~~~~~~~}}|{zzyyyyyyz{|~~~}}}}}}}}}~~~~~~~~~~~}{zyxxwwwwwwwwwvuttsstuvx{~~}}}}~~~~~}}}~~~~~}|{zzyxwwvvvvvwxy{|~~~~}}}}|||||||||||}}}}}}~~~~~~~}}||{zzyxxwvvvuuvvwxyz|~~~~}||{zzyyxxxyyz{|}~~~~~~~~~~~~}}}}}}~~~}{zyxwwvvvvwwwwvvuttsstuvx{~~~~~~~~~~~~~~}|{{zyxxwwwwwwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyxxwwvvuuuvvwxyz|~~~}||{{zyyyxxxyyz{|}~~~~~~~~~}}|||||}}~~~~}{zyxwvvuuvvvvvvvvuuttttuvx{}~~~~~~~~~~~}||{zyyxxwwwwwxxyz|}~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxwwvvvuuvvvwxy{|~~~}}||{{zzyyyxxyyyz{|}~~}}||||||||}}~~~~~~}}|zyxwvuuuuuuvvvvvvuuttttuwx{}~~~~~~~~~~~~~}}|{{zzyyxxxxxxyyz{|}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}|||{{{zzyyxxwwvvvuuuvvwwxy{|}~~~}}||{zzyyyxxxxxyyz{|}~~~}|||{{{{{|||}}~~~~}||zyxwvuutttuuuvvvvvuutttuvwy{}~~~~~~~~~~~~~~}}||{{zzyyxxxxxxyyz{|}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzyyxxxwwvvvvuuvvvwxxy{|}~~~}}||{{zzyyyxxxxxyyz{|}~~}}||{{{z{{{{|||}}}}||{zyxvvuttttttuuvvvvuuuuuuvwyz}~~~~~~~~~~~~~~~~~~}}}}||{{{zzyyyyyyyyzz{|}~~~~~~~~}~}}}}}}}}}}}}}}}}}}}||||||{{zzzyyyxxwwwvvvvuuuvvwwxyz{|}~~~}}||{{zzzyyxxxxxxxyyzz{|}~~~}}|{{{zzzz{{{||||}|||{zyxwvuttsstttuuuvvvuuuuuuvwyz|~~~}}}}}}}}}}}}}}}}|||{{zzzyyyyyyyyzz{|}~~~~~~~}}}}}}}}}}}}}}}||||||||{{{{zzzzyyyxxwwwvvvvuuuvvvwwxyz{|}~~~}}|||{{zzyyyxxxxxxxyyz{{|}~~~}||{{zzzzzzz{{{||||{{zyxwvuttsssssttuuvvvvuuuuvvwyz|~~~~}}}}}}}}}}}}}}||||{{{zzzyyyyyyyzz{{|}~~~~~~~}}}}}}}}}}||||||||{{{{{{zzzzyyyxxxwwwvvvvuuuuvvvwwxyz{|}~~~~}}|||{{zzzyyxxxxxxxxxxyyz{|}~~~~}||{{zzzzzzzz{{{{|{{{zyyxwvutssssssttuuvvvvvuuuvvwyz|~~~}}}}}|||||||||||{{{{zzzzyyyyyzzz{{|}~~~~~~~}}}}}}}}|||||||{{{{{{zzzzyyyxxxwwwvvvvvuuuvvvvwxxyz{|}~~~}}}|||{{zzyyyxxxxxxxxxyyzz{|}}~~~}||{{zzyyyyzzzz{{{{{zzyxwvuttssssssttuuvvvvvvvvvwwyz|~~~}}}}||||||||||{{{{{zzzzzzyyyzzzz{{|}~~~~~~~}}}}}}|||||||{{{{{zzzzyyyyxxxxwwwvvvvvuuuuvvvwwxxyz{|}~~~~}|||{{zzzyyyxxxxwwwwxxxyyz{{|}~~}}|{{zzzyyyyzzzz{{{{zzyxwvvutssrrrssttuuvvvvvvvvvwxyz|~~~}}|||||{{{{{{{{zzzzzzzzzzzzzz{{{|}}~~~~~}}}}}}|||||{{{{{{zzzyyyyxxxxwwwvvvvvuuuuuvvvwwxxyz{|}~~~~}}}|||{{zzzyyyxxxxxwxxxxxyyz{{|}~~}}|{{zzyyyyyyzzzzzzzzyyxwvuutssrrrssttuuvvvvvvvvvwxyz|~~~}}||||{{{{{{{{zzzzzzzzzzzzzzz{{{|}}~~~~~}}}}}|||||{{{{{zzzzyyyyxxxxwwwvvvvvuuuuuvvvvwwxyyz{|}~~~~}}}||{{{zzzyyyxxxxxxxxxxyyzz{{|}~~~}}|{{zzyyyyyyyyzzzzzzyxwwvutssrrrrssttuuvvvvvvvvwwxyz|}~}}|||{{{{zzzzzzzzzyyyyyzzzzz{{{||}~~~~~~}}}}||||{{{{zzzzzyyyxxxxwwwwvvvvuuuuuuvvvvwwxyyz{|}~~~~}}|||{{{zzyyyxxxxwwwwwwxxxyyzz{||}~~~}||{zzzyyyyyyyzzzzzzyyxwvvutssrrrrssttuuvvvvvvvvwwxyz|}~}}|||{{{zzzzzzzzzzyyyyyzzzzz{{{||}~~~~~~}}}||||{{{{zzzzyyyyxxxxwwwwvvvvvuuuuuuvvvwwwxyyz{|}~~~}}}|||{{zzzyyyxxxxxxwwxxxxyyyzz{|}}~~~}||{zzyyyyyyyyyyzzyyyxxwvuutssrrrrrsttuuvvvvwwwwwwxyz{}~}}|||{{zzzzyyyyyyyyyyyyyzzzz{{||}}~~~~}}}}||||{{{zzzzyyyyxxxwwwwvvvvvuuuuuuuvvvwwxxyzz{|}~~~}}}|||{{zzzyyyxxxxwwwwwwwxxxyyzz{{|}~~~}}|{{zzyyyyyyyyzzzzyyyxwwvutssrrrrrssttuuvvvwwwwwwwxyz{}~}}||{{zzzzyyyyyyyyyyyyyzzzz{{||}}~~~~~}}}}|||{{{{zzzyyyyxxxwwwwvvvvvvuuuuuuvvvvwwxxyzz{|}~~~}}}|||{{zzzyyyxxxxxwwwwwxxxxyyzz{||}~~~}}|{{zzyyyyyyyyyyyyyyxxwwvutssrrrrrrsttuuvvwwwwwwwwxyz{}~~}}||{{zzzzyyyyyyyyyyyyyzzz{{{||}}~~~~}}}||||{{{zzzzyyyxxxxwwwwvvvvvuuuuuuuvvvvwwxxyzz{|}~~~~}}|||{{zzzyyyxxxxwwwwwwwwxxxyyzz{{|}}~~}||{{zzzyyyyyyyzyyyyyxxwvuutssrrrrrssttuvvvwwwwwwwxxyz{}~~~}||{{zzzyyyyyxxxxyyyyyyzzz{{||}}~~~~}}}|||{{{zzzzyyyxxxwwwwvvvvvuuuuuuuuvvvvwwxxyzz{|}~~~~~}}|||{{zzzyyyxxxxwwwwwwwxxxxyyzz{{|}}~~}}|{{zzzyyyyyyyyyyyyyxxwvuutssrrrrrssttuvvvwwwwwwwxxyz{|~~~}||{{zzzyyyyyxxxxyyyyyyzzz{{||}}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvuuuuuuuuvvvvwwxxyzz{|}}~~~~}|||{{zzzyyyxxxxwwwwwwwwwxxxyyzz{{||}~~~}||{{zzzzyyyyyyyyyyyxxwvvuttsrrrrrrssttuvvvwwwwwwwxxyz{|~~}}|{{zzzyyyxxxxxxxxxyyyyzz{{||}}~~~~~}}|||{{{zzzyyyxxxxwwwvvvvvuuuuuuuuuvvvvwwxxyzz{|}}~~~~}}|||{{zzzyyyxxxxwwwwwwwwxxxxyyzz{{||}~~~}}|{{zzzzyyyyyyyyyyyxxwvvuttsrrrrrrssttuvvvwwwwwwwxxyz{|~~~}||{zzzyyyxxxxxxxxxyyyyzz{{||}}~~~~~}}|||{{{zzzyyyxxxwwwwvvvvvuuuuuuuuuvvvwwwxxyzz{|}}~~~}}|||{{zzzyyyxxxxxwwwwwwxxxxxyyzz{{||}~~~}}|{{zzzzyyyyyyyyyyyxwwvuutssrrrrrrsstuuvvwwwwwwwxxxyz{|}~}||{{zzyyyxxxxxxxxxxyyyyzz{{||}~~~~}}}||{{{zzzyyyxxxwwwvvvvvuuuuuuuuuuvvvwwwxxyzz{|}}~~~~}}||{{{zzzyyyxxxxwwwwwwwwxxxxyyzz{{||}~~~}}|{{{zzzzzzzzyyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwwxxxyz{|}~}}|{{zzyyyxxxxxxxxxxyyyzzz{{||}~~~~}}}||{{{zzzyyyxxxwwwvvvvvuuuuuuuuuvvvvwwwxxyzz{||}~~~~}}||{{{zzzyyyxxxxxwwwwwwxxxxxyyzz{{||}~~~}}||{{zzzzzyyyyyyyyxxwwvuutssrrrrrrssttuvvwwwwwwxxxxyz{|}~~}||{zzyyyxxxxxxxxxxxyyyzzz{||}}~~~~}}|||{{zzzyyxxxwwwwvvvvuuuuuuuuuuuvvvwwwxxyzz{||}~~~}}}||{{{zzyyyxxxxxwwwwwwwxxxxyyyzz{{||}~~~}}||{{zzzzzzzzzyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwxxxyyz{|}~~~}||{{zzyyxxxxxxxxxxxyyyzzz{||}}~~~~~}}||{{{zzzyyxxxwwwwvvvvuuuuuuuuuuvvvvwwwxxyzz{||}~~~}}}||{{{zzyyyyxxxxxwwwwwwxxxxyyyzz{{||}~~~}}||{{{zzzzzzzyyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwxxxxyz{|}~~}||{{zzyyxxxxxxxxxxxyyyzz{{||}}~~~~}}||{{{zzyyyxxxwwwvvvvvuuuuuuuuuuuvvvwwwxxyzz{||}~~~~}}|||{{zzzyyyxxxxxwwwwwwwxxxxyyyzz{{|}}~~~}}||{{{{zzzzzzzyyyyxxwvvuttssrrrrrssttuuvvwwwwwwxxxyyz{|}~~~}||{zzyyyxxxxxxxxxxxyyyzz{{||}~~~~}}|||{{zzzyyxxxwwwvvvvvuuuuuuuuuuvvvvwwwxxyzz{{|}~~~~}}}||{{zzzyyyyxxxxxwwwwwxxxxxyyyzz{{||}~~~~}|||{{{zzzzzzzyyyyxxwvvuttssrrrrrssstuuvvwwwwwxxxxyyz{|}~~~}||{zzyyyxxxxxxxxxxxyyyzz{{||}}~~~}}|||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyzz{{|}~~~~}}}||{{zzzyyyxxxxxxwwwwxxxxxyyyzzz{||}}~~~~}}||{{{{{zzzzzzyyxxwwvuuttssrrrrrssttuuvvwwwwwxxxxyyz{|}~~}}|{{zzyyxxxxxxxxxxxxyyyzz{{|}}~~~~}}}||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyyz{{|}}~~~}}}||{{zzzyyyyxxxxxxxwxxxxxxyyyzz{{{|}}~~~~}}||{{{{{zzzzzzyyxxwwvvuttssrrrrrssttuuvvwwwwwxxxxyyzz{|~~}}|{{zzyyyxxxxxxxxxxxyyyzz{{||}~~~~~}}||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyyz{{|}}~~~~}}||{{{zzyyyyxxxxxxxxxxxxxxyyyzz{{||}}~~~~}}|||{{{{zzzzzyyyxxwwvuuttssrrrrsssttuuvvwwwwwxxxxyyz{|}~~~}}||{{zzyyyyxxxxxxyyyyzzz{{||}}~~~~}}|||{{zzyyyxxxwwwvvvvvuuuuuuuuvvvvvwwwxxyyzz{{|}}~~~}}}|||{{{zzzzyyyyyyyyyyyyzzzz{{|||}}~~~~~}}||||{{{{zzzyyyxxwwvvvuuuuttttuuuuvvwwwwxxxyyyyzz{||}~~~}}}||{{{zzzzzzzzzzzzzz{{{|||}}~~~~~~}}|||{{{zzyyyyxxxwwwwwwvvvvvvvvvwwwwwxxyyyzz{{||}~~~~~}}}||||{{{{{zzzzzzzzzz{{{{{|||}}}~~~~~}}}|||{{{{zzzzyyyxxxwwwvvvvvvvvvvwwwwxxxxyyyzzz{{||}}~~~~}}}|||{{{{{{{{{{{{{{{||||}}}~~~~~~}}}|||{{{zzzyyyyxxxxxwwwwwwwwwwwwxxxxyyyzzz{{||}}~~~~~}}}}||||||{{{{{{{{{{{|||||}}}}~~~~~~}}}||||{{{{zzzyyyyxxxxwwwwwwwwwwxxxxxyyyyzzz{{{||}}~~~~~~}}}}||||||||{{||||||||}}}}~~~~~~}}}|||{{{{zzzzyyyyyyxxxxxxxxxxxxxxyyyyzzzz{{|||}}~~~~~~}}}}}||||||||||||||||}}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyyxxxxxxxxxxxyyyyyzzzz{{{|||}}~~~~~~~}}}}}}||||||||||||}}}}}}~~~~~~~~}}}||||{{{{zzzzzzyyyyyyyyyyyyyyyyyzzzz{{{{|||}}~~~~~~~~}}}}}}}}}||||||}}}}}}}}~~~~~~~~}}}}||||{{{{{zzzzzyyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}|||||{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{||||}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}||||||{{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}|||||{{{{{{{{zzzzzzzzzzzzz{{{{{{|||||}}}~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}||||||{{{{{{{{{{zzzzzz{{{{{{{{{|||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{|||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||||||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vtpigfedccffdfhffihgjkkkmoprvxz~zvsokheca`^]]\\\\\]_bhqyxipw}yvsqomlkkllmmoqtvy{}~|zywusqonllkkjjknqrux|~faxoffjouz|~~}|ywwvvvwwxy{}}|{zzzzz{|}|sq|zwwx{}~|zxwutsrrrssuvxz|~tja]`mxqjea_]]]^``bdfghiiiihgedba```acfhknruxz|~xrpqu}|yxwvvvwwwxxxyxyxwwwwwxxyyz{}~~wpkfdejr}~wrnjgdb`_]]\[[ZZZ[[[\\]^_`acdfhjlnprtvxz|~|xtpoqu|~{yxwvvuutttssssssstuvwy{|~vme_\]blx}wspnmmmlljifda_][ZZ[]_acehjklmmnmnnnooprsuwy{~{wsojgefiox~{yvtsrqqqqqqrrrrssssttuuvwwxy{|}}wqlheehnv|wsolifdba`_^^]]]^^__`aacdefhikmnprtvwy{}~|xtrppsy~|zywwvuutttssssttuvwxz|~{tmfa]]_fp||xutrrqqpnlifca_]]]^_acehjkmmnnnnnnnooqrsuwy{}|yvrnjgeehlsz|ywutsssrrrssssstttuuvvwxyz{|}~~ytokgedfjqz}yuroljhfedcbbaaaaabbcdefghjklnprsuwxz{}~{xtrppru{}{yxwvvuutttttuuvwyz|~~ytmgb^\]bis|zxwvvusqoljgeca`aacegikmnoppppooooppqstvxz|~}zvsoligfgjov}~|yxvutttsssstttuuuvvwxyyz{|}{wsnjgdddhmt|}yvspnljhgfedddcddddefghijklnoqrtuwxz|}~}zwtqpopsx}}{yxwvuuttttuuvwxz{}~}zwrmhc_]]`emw}||{zxvtqnkhfdccdefhjlnpqrrrrrrrqqrrstvwy{}~|zvspligfgimrx~}{yxwvuuuutuuuuvvwwxxyz{|}~~zvrnkgeddfjpw~}zwtsqomlkjihhhgghhhijjklmopqrtuvxy{|}|zwtrpppruz}{zxwvvuuuuvvwxyz|}~}|zxurniea^]_biqz}|zwtqnkigffghikmopqrsssssrrrrrsstvwy{}~}{xuroljhggilouz}{zyxwvvvvvvvvwwwxxyzz{|}~~{wtqmjhfeefimsz|ywusqponmlkkkkkkkkllmnopqrstuwxyz|}~~{yvtrpooqsw|~|{zxxwwwwwxxyz{}~}|{zyxvtqnjfb`^^aelt}}zwtqnmkkklmnprstuvvvvvuutttttuvwxz{}~~|yvtqnljihiknsw}~|{zyyxxwwwxxxxyyzz{||}~~|yvspmjhfeefhkpv|}{ywutsrppoonnnnnnoopqqrstuvwxyz{}~~}|ywusqpooprtx}~}{zyyxxxxyyz{|~~{ywvuttsqpmjgda__`ciow}zwtrpooooqrsuvwxyyxxwwvvuuuuvvwyz{}~}{xvsqnljihijmpty~}|{zzyyyyyyyyzzz{{|}}~|zwuromjhfeeegjnrx~~|{yxwvuttssssssssttuvvwxyzz{|}~~~|{ywusqponopsvz~~|{zzyyyzzz{|}~|ywusrqqppnmjheb```bfkrz~{xvtsrrrsuvwxz{{{{{{zyyxxwwwxxyz{|}~~}{yvtrpnlkjjkmosw{~}|{{zzzzzzzz{{{||}~~}|ywuspnljhfeeegilpuz~|{zyxwwvvvuuuvvvwwwxxyz{{|}}~~}{zxusrponnnoqsvz~~}|{{{{{||}~}zxusqpoonnmlkifdba`bdhnu||zxwvvwxyz{|}~~~~}}|{zyyxxxxyzz{|}~|{ywtrpnmkkjklnqtx|~}}||{{{zzz{{{{|||}}~~~}{zxvtrpnljhgfeffhknrw|~}|{zzyyyxxxxxyzz{{{||}}~~~}|zywvtrqponnoprux|~}||{|||}}~~{xuspnmllkkkkjhgedbbbdgkqx}{zyyz{|}~~}|{zzyyyyzz{|}~~|zxvtrqomlkkklnpsvz~~}|||{{{{{{{{{|}}}~~~}|{yxvtsqomkihgfeefgjlpty~~~}|||{{{{{|||||}}}~~~}|{yxvusrponnnnoqsuy|~~~~~~}}||||}~~|yvsqomkjjjjjjihgfdcbbcehmsz~}|||}~}|{{zzzz{{||}~~~}|zywvtrqonmmmmopsvy|~~}}|||||||||}}}}~~~~}}|{zyxvutrpomljigfeeefgiknrvz~~~~~~~~~~~~}|{zxwvtsrpoonnnoprtwz}~}|{{zz{{|}~~~}{xuspnkjihhhhhhhgfedcbcdgjou{~}||{{{{{||}}~~~}|{zywvtsqponmmmnprtwz}~}}}}|||||||||}}}}}}~~~~~~~~~~~~}}}||{zyxwvutrqpnmkjhgffeeeghjlpsw{~~}|{zxwvusrqponnnnoprtwz}~}{zyyxxyyz{{|}}}}|zxvtqnljhgffffggggfeddccdfhlqw}~}||{{{{{|||}}}}}}||{zzywvutrqpoooopqrtwz}~~~}}}}}}}}}}}}}}}}}}}}}}}}}|||{{zyyxwvutsrponlkjhgffeeffhilnruy}~~}|{zyxwutsrpoonnnnopqsvx{~~}|{zyxwwwwxxyzz{{{zyxvtqnljhfeeeeeffgffeedddegjnsy~}||{{{{{{||||||||{{zyxwvutsrqpooopqrtvx{}~~}}}}||||||||||||||{{{{{zzzyyxxwwvutsrqponmkjihgffeeffgikmpsvz~~~}|{zzywvutsrqponnnnopqsuwy|~}|{yxwvvvuvvwxxyyyyxwusqnljgfedcddeefffffeeeegilpu{~}||{{zzzzzzzzzzzyyxxwvutsrrqpppqqstvxz}~~~}}}}||||||{{{{{{zzzzyyxxwwvuutsrqponmlkjihgffeeefghjlnqtx{~}}|{zyyxvutsrqponnmmmmnoqrtwy|~~|{yxwvuuttuuuvwwwxwwutrpmkigedccccdeefffffeeefhjnrw|~}}|{{zzzzzzzyyyyxxwvvutsrrqqqqqqrsuwy{~~~~}}|||||{{{{zzzzzyyxxxwwvvuttsrqpponmlkiihgffeeffghjknpsvy}~~}|{{zyxwvusrqpoonmmmmnoprsuxz|~}{zxwvuttsssttuuvvvvutrpnligedbbbbccdeffffffffgiloty~~}|{{zzzzzyyyyxxxwvvutssrqqqqqqrstvxz|~~~}}|||{{{zzzyyyxxxwwwvvuuttsrrqpoonmlkjihhgfffeffghikloqtwz~~}||{zyxwvutsrqponmmmmmmnoprsuwz|~}|{yxvutssssssttuuuuutsqpmkigecbaaabcdefffggfffgikmquz}|{{zyyyxxxwwwvvvuttssrrrqqqrrsuvxy|~~~}}||{{zzzyyyxxxwwvvuuttssrqpponmllkjihhgfffefffghjlnprux{~~}}|{zyywvutsrqpponnmmmmnopqstvx{}~|{yxwutsrrqqqrrssstssrqomkigecba`aabcdeffgggggghjlosw|}|{{zyyxxxwwwvvvuuttssrrrrrrsstvwyz|~~}}||{{zzyyxxxwwvvvuutssrrqpponmllkjiihggfffefffghikmoqtvy}~}||{zyxwvutsrqpoonnnnnnopqrtuwy{~}|zywutsrqqqqrrrssssrqpomkigecba```abcdeffggggghikmptx}~}|zzyxwwvvvuutttsssrrrrrrrsstvwxz|~~}}||{zzyyxxwwvvuuttsrrqpponnmlkkjihhggffeeeffghijlnpruwz}~~}|{zyxwvutsrrqponnmmmmmnopqrtuwy{}}|zywvtsrqqqpqqqrrrrqqpomkigecba````abcdefgggghhijlnruz~~|{zyyxwwvvuuuttsssrrrrrrrsttuvxy{}~~}||{zzyyxxwwvuuttssrqqpoonmmlkjjihhggffeeeeffghikmoqsvx{~~}}|{zyxwvutsrqpponnnmmnnooprsuvxz|~~}{yxvusrqqppppppqqqqpponljhfdba`___`abdefgghhhhijkmpsw{~|{zyxxwvvuuutttsssrrrrrssstuvwyz|}~}}|{{zyyxwwvvuttsrrqpponnmllkjiihggfffeeeeffghijlnprtwy|~}|{{zyxwvutsrqpoonnmmmmmnooqrsuvxz|~~}{yxvusrqqppppppqqqqppomljhfdca`___`abcdefghhhhiijlnqtx|~|{zyxwvuuttsssrrrrrrrrrsstuvwxz{}~}||{zyyxwwvvuttsrrqpponnmlkkjiihhggfffeefffghijkmoqsuxz}~}|{zyxwvutsrrqpoonnnmmnnoopqstuwy{|~~|{ywvtsrqppoooopppppoomlkigecb``___`abcefghhhiiijkmoruy}}|{zxxwvuutsssrrrrrrrrrssttuvxyz|}~}|{{zyxxwvvuttsrrqpponmmlkkjiihhggfffeeeffgghiklnprtvy{~~}|{zyxwvutsrqqponnmmmmmmnnopqstvwy{}~~|{ywvtsrqqpppppppppponmlkigedba`___`abcdefghhiiijklnpswz~~|{zxwvuttssrrqqqqqqqqrrstuvwxy{|~~}||{zyxxwvuutsrrqpoonmmlkkjiihggffffeeefffghijkmoqsuwy|~~~}|{zyxwvutsrqpponnnmmmnnnopqrsuvxz{}~|zxwutsrqppoooooppooonmkjhfeca`____`abcefghiiijjklmoqtx|}|{yxwvutssrrrqqqqqqqrrsstuvwyz{}~}|{zyyxwvuutssrqpponmmlkkjiihhggfffeeefffghhjklnoqsvxz}~}|{zyxwvuutsrqppoonnnnnnoopqrstuwxz|}}{zxvusrqppooooooooonnmljigedba`____`abdefhhiijjkklnpsvy}~|{yxwvutsrrqqqppppqqqrsstuwxy{|~~}|{zzyxwvuutsrqqponnmlkkjiihhggfffeeeeffgghijlmoprtwy{}~}}|{zyxwvutsrqppoonnnmnnnoopqrstvwy{|~}|zxwutsrqppoooooooonnmlkigfdba`____`abcefghiijjjklmoqtwz~~|zyxvuttsrrqqqqpqqqqrrstuvwxz{}~~}|{zyxwvvutsrrqponnmlkkjiihhggfffeeeefffghijklnoqsuwy|~~}|{zyxwvuttsrqppoonnnnnnoopqrstuvxy{}~}{zxvusrqppoooooooonnmlkjhgecba`____`abdefghijjjkllnprux{}|zywvutssrrqqqqqqqqrrstuuwxyz|}~}|{zzyxwvutssrqpoonmllkjjihhggffeeeeeeffgghijkmnprtvxz|~~}|zzxwwvutsrqppoonnnnnnnoopqrstvwxz|}~|zxwutsrqqpppoooooonmlkjigedba`____`abcefghiijjkklmnpsvy|}|zywvutsrrqqpppppqqqrstuvwxy{|~~||{zyxwvutsrqqponmmlkjjihhggfffeeeeeeffghijklnoqstwy{}~}|{zyxwvuttsrqppooonnnnnoopqrstuvxy{|~}{zxwutsrqpppoooooonnmlkihfecb``____`abdefghijjkkllnoqtvz}}{zxwvutsrqqqppppqqqrrstuvwxz{}~~}|{zyxwvuutsrqponnmlkkjiihggfffeeeeeeffgghijkmnprsuwy{~~}|{zyxwvutssrqppooooooooopqqrstvwxz{}~~|zywvussrqqppppoooonmlkjhgecba`____`abcdfghijjjkklmnpruw{~}|zywvutsrqqpppppppqqrstuvwxz{}~~}|{zyxwvutsrrqponmllkjiihhggfffeeeeeeffghijklmoprtvxz|~}|{zyxwvuttsrqqppooonnoooppqrstuvwyz|}}|zxwvtsrqqppppoooonnmljihfecb``____`abdefghijjkklmnoqsux|}{zxwvtssrqqppppppqqrsstuvxyz|}~}|{zyxwvutsrqponnmlkjjihhggfffeeeeeeffgghijkmnpqsuwy{}~}|{zyxwvutssrqqppoooooooppqqrstuwxy{|~}{zxwutsrqqpppoooonnmlkjigedca`____``acdeghijjkkllmnprtvy|}|zxwvusrrqppppppppqqrstuvwyz|}~~}|{zyxwvutsrqponmllkjiihggfffeeeeeeeffghiiklmoprsuwy{}~}|{zxwwvutsrrqppooooooooppqrstuvwyz{}~~|zywvutsrrqqppppoonmlkjigfdcba`____`abdefghijkkllmnopruwz}~}{zxwutsrrqpppppppqqrstuvwxy{|}~}|{yxwvutsrqpoonmlkjjihhggfffeeeeeeffgghijklnoqrtvxz|~}|{zyxwvuttsrqqpppooooooppqrrstuwxy{|}}|zxwvutsrqqppppoonnmlkjhgedca``___`abcdeghijjkkllmnoqsux{~~|{yxvutsrrqqpppppqqrrstuvwyz{|~~|{zyxwvutsrqponmlkkjiihggfffeeeeeefffghiijlmnpqsuwxz|~~}|{zyxwvutssrqqpppoooopppqrrstuvwyz{}~~|{yxwuttsrrqqqppoonmmkjigfdcba`___``abcefghijjkllmmoprtvy|~}{yxwutsrrqpppppppqqrstuvwxz{|~~}|{zyxwvutrqpoonmlkjjihhgfffeeeeeeeffgghijklmoprtuwy{}~}|{zyxwvutsrrqqppppoppppqqrstuvwxyz|}}|zyxvutssrrqqpppoonmlkjhgedca``___`aacdefhijjkkllmnoqruwz}~|{yxvutsrrqqpppppqqrsstuvxyz{}~~}|{zywvutsrqponmllkjiihggfffeeeeeeeffgghijkmnoqrtvxy{}~}{zyxwvvutsrrqqppppppppqqrrstuvwxz{|~}|zywvutssrqqqppoonnmljigfdcba`___``abcefghijjkllmmnpqsux{~~|{yxwutsrrqqpppppqqrrstuvwyz{}~~}|{yxwvutsrqponmlkjjihggfffeeeeeeeeffghiiklmnpqsuvxz|~~}|{zyxwvuttsrrqqpppppppqqrrstuvwxy{|}~|{zxwvuttsrrqqqpoonmlkjhgedcaa`___`aacdefghijkkllmnoprtvy{~}|zyxvutsrrqqppppqqqrstuvwxyz|}~~}{zyxwvusrqponmllkjihhggffeeeeeeeeffgghijklmoprtuwyz|~~}|{zyxwvuttsrrqqqpppppqqrrsttuvwxz{|~~|{yxwvutssrrqqppoonmljihfedba``__``abcdeghijjkllmmnoqstwy|}|zywvutsrrqqqppqqqrsstuvwxz{|}}|{zyxwutsrqponmlkjjihggffeeeeeeeeeffgghijkmnoqrtvxy{}~}|{yyxwvutssrrqqqqpqqqqrrsstuvwxy{|}~~}{zyxwvuttssrrqqponmlkjhgedcba``_``aacdefghijkkllmnopqsuxz}}|zyxvutsrrqqqppqqqrrstuvwxy{|}~~}|{zxwvutsrqponmlkjihhggffeeeeeeeeefgghijklmnpqsuvxz|~}|{zyxwvvutssrrqqqqqqqqrrrstuvwxyz{|~~}{zyxwvuttssrqqpponmlkihfedba``````abcdefhiijkklmmnoprtvx{~~}{zywvutsrrqqqqqqqrrsttuvwyz{|~~}{zyxwvtsrqponmlkjjihggffeeeedeeeeffghhijklnoprtuwyz|~~}|{zyxwwvuttsssrrrrrrssttuuvwxyz{|}~}{zyxxwvuutssrqpponmljihgfedcbbbbbccdefghijkklmmnopqstvxz|~}|{zyxwvvutttsssstttuuvwxxyz{}~~}|zyxwvutsrqpoonmlkkjiihhhggggggggghhijklmnopqrtuwxz{}~~}|{{zyxxwwvvuuuuuuuuuuvvwwxyzz{|}~~}|{zyxxwvuutsrrqpoonmlkjihhgfffffffgghijjkllmnopqrstuvxz|}~}|{zzyxxwwvvvvvvvvvvwwxyyz{||}~~~}|{zyxwvuttsrqpoonmmllkkjjjiiiiiiijjjkklmnnoprstuwxy{|~~}||{zzyyxxwwwwwwwwwwwxxxyzz{||}~~}|{zzyxwwvuutssrqqponnmlkkjjiiiiiiijjkklmmnoopqrrstvwxz{}~~~}|{{zzyyxxxxwwwwxxxxyyzz{||}~~~}|{{zyxwwvuttsrqqpoonnmmmllllkkkkklllmmnnoppqrstuwxyz{}~~~}}|{{zzzyyyxxxxxxxyyyyzz{{||}~~~}||{zzyxwwvvuttsrrqpponnmmmlllllllllmmnnooppqrsstuvwxz{|}~~}||{{{zzyyyyyyyyyyyzzz{{||}~~~}}|{{zyxxwvvuttsrrqqppooonnnnmmmmmnnnnooppqrrstuvwxyz{|}~~~}|||{{zzzzzzyyyzzzzz{{{||}}~~~~}||{zzyyxwwvvuttssrrqpppoonnnnnnnnnnoopppqrrsstuvwxyz{|}~~~}}|||{{{zzzzzzzzzz{{{{||}}~~~~~}}|{{zyyxwwvvuttssrrrqqppppoooooooppppqqrrsstuuvwxyz{|}~~~}}|||{{{{zzzz{{{{{{{|||}}~~~~~}}|{{zzyxxwwvvuuttssrrqqqpppppppppppqqqrrssttuvvwxyz{{|}~~~}}}|||{{{{{{{{{{{{||||}}~~~~~}||{{zzyxxwwvvuuttsssrrrrqqqqqqqqqqqrrrssttuuvwxxyz{||}~~~~}}}||||{{{{{{{{{||||}}}~~~~~}||{{zzyyxxwwvvuuuttsssrrrrrrqrrrrrrrsssttuuvvwxxyz{{|}~~~~}}}||||||{{{|||||||}}}~~~~~}}||{{zzyyxxwwvvvuuttttssssssssssssssstttuuvvwwxyyz{{|}~~~~}}}}|||||||||||||}}}}~~~~~}}|||{{zzyyxxxwwvvvuuuttttsssssssssttttuuuvvwwxxyyz{{|}~~~~~}}}}}||||||||||}}}}}~~~~~~}}|||{{zzyyxxxwwwvvvuuuttttttttttttttuuuvvvwwxxyzz{{|}}~~~~}}}}}}}}|||}}}}}}}~~~~~~}}}||{{{zzyyyxxwwwvvvvuuuuuttttttuuuuuuvvvwwxxyyzz{{|}}~~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}}||{{{zzyyyxxxwwwvvvvvuuuuuuuuuuuuvvvvwwxxxyyzz{{|}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}|||{{zzzyyyxxxwwwwvvvvvvvvuuuvvvvvvvwwwxxyyyzz{{|}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}|||{{zzzyyyyxxxwwwwwvvvvvvvvvvvvwwwwwxxxyyzz{{||}}~~~~~~~~~}}}}}}~~~~~~~~~~~}}}|||{{{zzzzyyyxxxxxwwwwwwwwwwwwwwwwwxxxxyyyzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyxxxxxwwwwwwwwwwwwwxxxxxyyyzzz{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzzyyyyyxxxxxxxxwwxxxxxxxxxyyyyzzz{{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxyyyyzzzz{{{||}}}~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{zzzzyyyyyyyyxxxxxxxyyyyyyyzzzz{{{{||}}}~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~}}}}|||||{{{{{zzzzzzyyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzyyyyyzzzzzzzzz{{{{||||}}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}}}||||||{{{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~~}}}}}}}|||||||||||{{{{{{{{{{{|||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}|||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~}{|||}}~|smha_bo~rmmquy~zvrnjgfecdfhjnsvz}ytnic^YTOMJHFEDEGJPXcsYZ`Ke}yvtrrrtwz|}xuqnkigffhlnsx~vdoxnpv~}yvsppnnnoqsvz~tUBLwp^ROOSX^cfillmifecb`^\[ZYYZ[\]aeimqvz}{zzyyy{|~{sgZSYl{xwy|~}}}~}kZKDI\zyk`WQMJJIHHIIJIIJLMNPQRUWZ\`cfjmptwy|wpf_Z^jw{vronmmmnopqstvxwx{}yj[ND>AK_x»re[SMHFEEFHJKMNOOOLIIHIJKNRVZ_diosx{~{|{||||}}}|zwsmgb][^gtsfZPIIO]ryoe]VQLHECA@????@ABDFHJMORVY]`cgimoruwy{|~|wqib\YZ_jx|wtrqppqrsuwy{~|o`QE<;APf{qida_^[XTOJEB?>?AEINSW[^`abbbbcdegilpsvz~}wph`ZVW[er|xvtsrrrrrsttuvwxz{}|qeZQKILWgzxne]WQLHFCBA@@ABCEFHJLORUX[^behlortwz|~}xrlfccgp|~{xvuttttuvwy|~zocUJA=AK]sztoljfc^YSNIEBABDHLPTX[]_`_`__``bdfilpswz}}ysmf`ZVUX_jw~{ywvuttuuuvwxyz{}~yod[RLJLTaqwng`ZVROLJHHGGHHJKMOQSVY\_begkmpsuxz|~}xsnhc`_bhr}zwutsrrstuwy|~zqfZOE@AHVj}yvsokf`ZTOKIHILOSWZ]`abbbbbbbcdfilorvy}|xsmga[WUW\ep}|yvutssssttuvwxy{|~}ulcZSNKMR\j{wpjd_[XURQPOOOOPQSTVX[]`behjmpsuwy|~|xsniebabgoz}{xwvuuuvwy{~~{wrkaWME?>BM]q}zwusmga[VRPOOQTX\_ceghhhggffghikmpsvy|~zupjd_[YY]dmy}{yxwwwwwxyyz|}~wph`XQLJJNVbp{tnid`\YWUTSRRRSTUVXZ\^acfhkmpruwy{}~|xtojfcaaekt~|zyxxxyz|~|yvsnibYQIC@BJVh{~zuoic]XTRQRTW[^adefhhggfeeefhjlnqtwz}~{wsnid_[YY[ais~}{{zzzzz{|}~~wphaXRNKKNT^ky|vqlheb_]\[ZZYZZ[\^_acegikmpqtuwy{|~}{xtplgc`^^afmv~|zyxxyy{}zvspmjfaZSLFCCHR`q|vpic_[ZY[]_cfhjkkkkjihhhhijlnqtvy|~}zvrmid_\YYZ^dmw~}{zyyyyyzz{|}ysmf`YTPMLNS[fr~ytpmjgedbaaaaabcdeghjkmoqstvxz{|~~|zwtplieb``aeks|~|{{{|}~~xsoligda]XRLFCBEMXhy}wqkgcaaacfhkmoqqqppnmmlllmnprtvy{}~{xuqlhc`]\]`elu~~}}|||}}~~ytnhb]WRNKJKOV_jvzvroljhfeddeeeffghjkmnoqrtvxyz|}~~}{xvsolheb`_`chow~~~~}wrlgeba^[XSNIEDEJS`pztojgfefhjmoqrssrqponllllmnoqsvxz|}~|zwtplhda^]]_cipy~~~zvqlga\WSOLLLOU\fq}}yvsqnmkjjiiiijjklmopqrtuvxyz{|}}~~~~~~}|{yxuspmifc`_^^adjqy{tnieb`_][XUPLHEFIPZhxzuqnmmnprtvwxxxvusrponnnopqsuwyz|}~~~}|{xvrokhda^]\^aels|~~}}}}~~}zvrnie`[WSPNMMPT[cmx|zwutrqppoooppqqrrstuvwxyz{||}}}~~}}|{zywtrolifc`^]]_bgmt{{toid`]\ZYXVSPLIFFHMUao~{wusstuwy{|}}||zxwusrqqqqrsuvwyz{{{{{yxvspmjgdb``acglsz}{xuqmiea]YUQNLKKMQW^gq{~|zxwvutssssttuuvwwxyz{{|}}~~~~~~}|{zywurpmjgdb`_^_aejqx~xslfa]ZXVVUTRPMJHGGKR[hu|yvuuvxz{}~~~}|{ywutsrrqrstuvwxyzzzyxwuspmjhecaaacfkpw~~|yvspmiea]YVROMLLNQV\dmw}{zyxxwwwwwwxxxyyz{{|||||||||{zyxvuspnkifca_^^^`chms{}|||}~{wqke`[XUTSSSRQOLJIIKPXbo|~|{|}~}zxwutsrrsstuvwxyyyxwvtromjgeca``bdhmsy}|zxvspnjgd`]YVSPNMMNPTZair|~}|{{{{zzz{{{{||||||||||{zyxwusqomjhec`_]]]^adiou|}{yyxxyzz|}}}|zvrmgb]XURQQPPPPOMKJIKNU]hu~|zxwuttstttuvvvvvutsrpnkigedccdfimrx~}|{zywusqolifc`]ZWTQOMLLMORW]dlu~~~~~~~~~~~~~~}}||{zywvtrpnkifdb`_^^_adhmry~|zxvvuuvwyz{{zxvrmhb]XTQONNNNONMLKJKMQXbmz}{ywvutttttuuuvuutsrpnljhfedddfhlqv|~~~~~~}~}}||{zyxwvtrqnljgeb_\YVTQONMLMORV[biqz~~~~~~~}}}||{zyxvusqomkhfdb`_^^_`cfkpu{~{ywutssssuvwwwvsplgb]XSPNMLMNNNNMLLLMPV^ht~{ywvutttttttttssrqomkjhfedcdegjnrx}~~~~}|||{zzyxwvusrpomkhfca^\YVTRPNMMNORUZ_fnv~~~~}||{zywvtsqomjhfca`^]]]^`cgkpv|}zxvsrppoppqrsssrpmie`[VRNLKKKLMNNNMMLMPT[cny~|zxvuttsssrrrqponmkjigfeefghknsw}~~}}||{{zzyyxwwuusrqonljhfda^\YWURPOMLLMNPSW]cjqy~}|{zxwutqpnkigeca_^^^_`cfjnty~}{xusqonmmmnoopponkhd_ZUQMJIHIJKLMNMMMMORW^gr~~|zxwvutsssrrqqponlkjhggfggiknrv{~}|{{zzyxxwvuutrrpomljhgeb`^\YWUSQONMMMNPRV[`gnu}~}|{zxwutrpnligeca`_^^_`behmqv|~{xuspnlkkkkllmmmljgd_[VQMJHGHIJKMNNNNNORV\cmx}zxvusrqpponnmlkjihgffffghjmpty~~}|{zzyxwvvttsqponlkigecb_][YWUSQPNMMMNPRUY^dkry~}|{yxvusqomkigdba_^]]]^`beimrw||ywtqomkjjjjkkllkjhfb^ZUPMJHGGHIKMNOOOOPRUY`hr}}{ywutsqqponnmlkjihggfgghjlosw{~}|{zyxwvutsrqponlkihfeca_][YWUTRPONMMMMOQTX\agnu|~|{yxvtrpnljhfdba`_^^_`behlpuy~}zwtqoljihgghhiiiigeb^ZVQMJGFEFGIKMNOOOPQSW\clv}{ywutrqqponmllkjihhhhhijlorvz~}|{zywwutsrqponlkjhgedb`^][YWUSRPONMMMNOQSW[_ekqx~}{zxwusqomkigecba`__`abegknsw|~{xuromjhgffffggggfeb_[WRNJHFEFGIJLNOOPPQSVZ`hq{~{xvtrqonmlkjiihggffgghiknqtx|~}{zyxvutsrpomlkihfeca`^\ZYWUSRPONMMMNOPSVY^chnu{~}|zxvtsqoljhfdca`_^^^_`behkosw|}zwtqnkigfeeeeffgfeda^ZVRNJGFEEFGILMOPQQRSUY^dlv}{xvtrponmlkjiihhggghhjkmpsvz~~|{yxvutsqpomlkjhgedb`_][ZXVUSQPONMMMMNPRUX\afkqx~}|zxvtrpnljhfdca`___`abdgjnquz~{xuroligedcccddddcb`^ZWSNKGEDCDEGJLNOPQRSTW[ahpy}zxvtrponmlkjiihhhhhijkmoruy}~}{zxwutsqpomljigfeca`^][YXVTSQPONMMMMNOQSVZ^chntz~}{ywusqomkigedba````abdfilptx||xuroligeddccddddcb`]ZWSOKHEDCDEGILNOPQRSTVZ^dlu~}zwuspomlkjihggfffghijlnqtw{}{zxwusrpomljihfdca`^\[YXVTSRPONMMMMNOQSVY]aflqw}}{ywusqomkigecba`___`abdgjmqtx|}zvspmjhfdccbcccccb`^[XTPLIFDCCDFHKMOQRSTUVY]bhpy|ywtrpnmkjihhggggghijkmpsvy}}{zxvusqpnmkjhgedb`_]\ZYWUTSQPONNMMMNOPRUX\`dintz|{ywurpnljhgecba````acdgiloswz~~{xtqnkhfdcbaaaaaaa`^[XUQMJGDCBCDFIKNPQRSTVX[_elt||yvtrpnmkjiihhgghhijkmorux{~|zxwusrpnmkjhfecb`^][ZXWUTRQPONMMMMNNPRTWZ^bglqv|}{ywusqomkigedba````abcehknqtx|{xtqnkhfdcbbbbbbaa_^[XUQNJGECCCDFHKMOQRSTUWY]bhow{xvsqnmkjihgffffggijlnpsvy}~|zxwusqpnlkigfdb`_]\ZXWUTSQPONNMMMNNPQSVY\`eioty~|zxvtrpnljhfdcba```abcdgilorvz}}yvsoligecbaaaaaa`_^\YVSOLHFDCCCEGJLOQRTUVWY\`els{~zwurpnlkihgggfgghijkmorux{~}{ywusqpnljigedba_]\ZYWVTSRPONNMMMNNOQSUX[_cglqv|~|zwusqomkihfdcbbaaabcdfhknqtx{{xtqmjhecba```___^]\YWTPMIFDCBBDFHKMPRSTUWX[^bhov}zwtronlkihhgggghijkmoqtvy}~|zxvtrpnmkigedb`_]\ZXWUTSQPONNMMMMNNPQTVY]`einsx~|zxvtrpnljhfedcbaaabcdfhjmpsvz}|xuqnkhfdcbaa````_^\ZWTQMJGDCBBCEGJMOQSTUVXZ\`ekrz|yvsqnlkihgfffffghikmorux{~~|zwusqonljhfeca_^\ZYWVTSRQOONMMMMNOPQSVX\_cglqv{~|ywusqomkigfdccbbbbcdegiknqtw{~~zwspmjgecbaa```__^][XUROLHFDCBCDFILNQSTVWXY[_chov}{xurpnljihgffffghiklnqsvy|~|zxvtrpnljhgeca`^\[YWVUSRQPONMMMMNNOQSUXZ^afjnsx}}{ywtrpnlkigfedcbbbcdeghkmpsvy||xuqnkhfdba`____^^\[YVSPMIGDCBBCEGJMORTUVWYZ]aekry~zwtromljihggggghijlnprux{~~|zwusqomkigedb`^\[YXVUSRQPONMMMMMNOPRTVY\_cglquz~|zwusqomkjhgedcccccdefhjlorux{~}yvroligecba```__^][YWTPMJGECBBCEGILOQSUVWXZ\_chnu|}zwtqomkihgffffghijlnpsvx|}{ywtrpnljhfdca_][ZXWUTRQPONNMMMMNOPQSUX[^bfjnsx}}{ywtrpnljigfedccccdefgikmpsvy|{xtqnkhfdcaa``__^]\ZXUROLIFDCBCDFHKNPRTVWXZ[^afkqx|yvspnljihgfffghijkmortwz}~|zwusqomkigeca_^\ZYWVTSRPOONMMMMNNOQSUWZ]`dhlquz}zxvtrpnljigfedddddefgijmortwz}}yvroligeca``__^^]\ZXVSPMJGECBBCEGILOQTUWXY[]`chnt{|yvspnljhggfffgghjlnpruwz}}{ywtrpnljhfdb`^\ZYWVTSRPONNMMMMMNOPQSUX[^bfjnrw|~{ywusqomkihgfeddddefghjlnqtvy|~zwspmjhfdcba``__^\[YVTQNJHEDCBCDFIKNPSUVWYZ\^afjpw~~{xuromkjhggffgghikmoqtvy|}zxvtqomkigeca_][ZXVUSRQPONNMMMMNNPQSUWZ]`dhlpty~}zxvtrpnljihgfeeddefghikmprux{~|yuroljgedbaa`__^]\ZXUROLIGECCCDEHJMORTVWYZ[]`dhmsz}zvtqolkihggggghijlnpruwz}~{ywurpnljgeca`^\ZXWUTRQPONNMMMMNNOQRTVY\_bfjnrw{~|zwusqomljihgfeeeefghikmoqtvy|~{wtpnkhfdcba`__^]\ZYVTPMJGEDCCCEGILOQSUWXY[\^bfjpw}}zwtqnlkihgfffghijlnpsux{}}{xvtqomkifdb`^][YWVTSRPONNMMMMMNOPQSUWZ]`dhlpty}}{ywtrpnmkjhggfffffghikloqsvx{~{xuroljgfdcba``_^][YWTQNKIFDCCCDFHJMPRTVWYZ\]`chmsy|xuspnljihgggghijlmortwy|~|zwuspnljgeca_]\ZXVUSRQPONMMMMMNNOQRTVY\_bfjnrv{~|zxusqpnlkihggffffggijlmprtwz|~zwtqnkigedbba`_^]\ZXVSPMJHEDCCCEGILOQTVWXZ[]_bfjpv|}zwtromkjihggghijkmoqsuxz}}{yvtromkifdb`^\ZYWUTSQPONNMMMMMNOPRSUXZ]adhlptx}~{ywusqomljihggfffgghjkmoqsvy|~~{xuroljhfedcba`_^][YVSQNKHFDCCCEFIKNPSUVXY[\^`dhmry}zwtromkjihggghijkmoqsvx{~|zxusqnljgeca_][YXVTSRPONNMMMMMNNPQRTWY\_bfimrvz~}zxvtrpomkjihhgggghijkmoqsuxz}}zwspnkigfdcbaa`^][YWUROLIGEDCCDEGJLOQTVWYZ[]_bfjou{|yvsqomkjihhhhhiklnprtwy|~{ywtrpmkifdb`^\ZXWUTRQPONMMMMMMNOPRTVX[]adhkosx|~|zwusqpnlkjihhggghijklnprtvy|~|xuromkhgedcba`_^\[XVSQNKHFECCDEFIKNPSUWXZ[\^adhlrx~~{xurpnljihhhhhijlmoqsvx{}}zxusqnljgeca_][YWVTSRPONNMMMMMNOPQSUWY\_bfimquz~}{ywusqonlkjihhhhhijklnprtvx{~|yvsqnljhgedcba`_][YWTQNLIGEDDDEFHJMORTVWYZ\]_bfjotz~{xurpnlkiihhhhijlmoqsvx{}~|ywtrpmkifdb`^\ZXVUSRQPONMMMMMMNOPRTVX[]adgkosw{|zxvtrpomlkjiihhhijklmoqsuwz|~{xurpmkihfedcba_^\ZXUSPMJHFDDCDEGIKNPSUWXZ[]^adglqw}}zwtromlkjihhiijkmnpruwy|}{xvsqoljgeca_][YWVTRQPONMMMMMMNOPQSUWY\_bfimquy}~{ywusqpnmlkjiiiiijjkmnprtvx{}}zwtqoljigfdcba`_][YWTROLIGEDDDEFHJMORTVXY[\^`beinty~{xvsqomkjiiiiijklnoqsvx{}~|zwurpnkigdb`^\ZXVUSRPONNMMMMMMNOPRTVX[]`dgkosw{}{yvusqonmlkjjiijjklmnprtvxz}~{xuspnljigfedba`^\ZXUROMJHFEDDDFGJLNQSUWXZ[]_adglqv|~{xvsqomljjiiiijklnprtvx{}}{xvtqoljheca_][YWUTRQPONMMMMMMNOPQSUWY\_beilptx|~|zxvtrponllkjjjjjkklnoqsuwy|~}zwtromkjhgedcba_][YVTQNKIGEDDDEFHKMPRTVXY[\^`beinsx~}zwurpnmkjjiiijklmoqsuwy|~|zwurpnkifdb`^\ZXVTSRPONMMMLMMMNOPRTVX[]`cgjnrvz~}{ywusrpomlkkjjjjkklmoprtvxz}|yvsqolkigfedba`^\ZXUSPMJHFEDDDFGILNQSUWYZ[]_adgkpu{|yvtrpnlkjjiijkkmnoqsuwy|~}{yvtqomjheca_][YWUTRQPONMMLLMMNOPQSUWY\_beilptx|}{xvusqpnmllkkkkklmnoprtvxz|~}zwurpnlkihfedba_][YVSQNKIGEEDEEGIKMPRTVXY[\^`beimrx~~{yvtrpnmkkjjjjklmnprtvx{}|zxuspnkigdb`^[ZXVTSQPONMMLLLMMNOPRTVXZ]`cgjnruy}~|zxvtsqpommmllllmmnoprsuwy{}|ywurpnlkihfecb`^\ZXVSQNLJHGGGGHJLMPRTVXY[\^`behlqu{}{ywusqponmmmmmnopqstvxz|~~|zxvsqomjhfdb`^\ZYWVTSRQPPOOOOPQQSTUWY[^acfjmptx{}{zxvutrqppoooooppqrstvwy{|~~{ywusqomljhgedba_][YWVTRQONMMMNNPQSTVXZ[]_abegjmquy}~|zxvusrqqpppppqrstuwxz{}~|zxvtrpnljhfdb`_]\ZYXVUUTSSSSSSTTUVXY[]_bdgjmpsvz}~}{zxwvutssrrrrrsstuvwxz{|~}{ywutrpomkjhgedb`_][YXVUTSRRRRSTUVWYZ\]_abdfiknqtx{}{zywvuttsssssstuuvwyz{}~~|{ywusrpnljigecb`_^\[ZYXXWWWVWWWXYZ[\]_acehjmpsux{~}|{yxwvvuttttttuuvwxyz{|}~|zywutrpomljigfecb`_]\[ZYXWVWWWXXYZ[]^_abdfhjlnqtwz}~}|zyxwvvuuuuuuuvwwxyz{|~~}{yxvtsqonlkigfdcba_^]\\[ZZZZZZZ[[\]_`acegikmpruwz}~}|{zyxwwvvvvvvwwxxyz{|}~~}|zywvtsqpnmkjigfecba_^]\[[ZZZZZ[\]^_`acdegikmoqtvy|}|{zyyxwwwwwwwwxxyzz{|}~}|zywvtsqpnmkjigfedcba`_^^^]]]]]^^_`abcefhjlnprtwy|~~}|{zzyxxxwwwwxxxyzz{|}~}|{zxwutsqponmkjigfedcba`__^^^^^^__`abcefgijlnprtvy{}}||{zyyxxxxxxxyyzz{||}~}|{zxwutsqpomlkjhgfedccbaa``````aabbcdefhikmnprtvy{}~}|{{zzyyyyyyyyzz{{|}}~~}|{yxwvtsrqonmlkjigfeedcbbaaaaaaabbcdefgijkmnprtvxz|~}||{zzzyyyyyzzz{{|}}~~}|{yxwvtsrqonmlkjihgfeeddccccccccddefghijlmoqrtvxz|~~}||{{zzzzzzzzz{{||}}~~}|{zyxwvutsqponmlkjihggfeeddddddddeefghijklnoqrtvxz|~~}}||{{zzzzzz{{{||}}~~~}|{zyxwutsrqponmlkjihhggffffeeefffgghijklmnpqstvxy{}~~}||{{{{{z{{{{{||}}~~~}|{zyxwvutsrqponmlkjjihhggfffffffgghiijklmnpqstvxy{}~~}}|||{{{{{{{|||}}~~~}}|{zyxwvutsrqponmllkjjiihhhhghhhhhijjklmnoprstvxy{|~~~}}||||{{{{||||}}}~~~}}|{zyxwvutsrrqponmmlkkjjiiihhhhiiijjklmmnoqrstvwyz|~~~}}}||||||||||}}}~~~~}|{zyyxwvutsrqpponnmllkkkjjjjjjjjjkklmmnopqrsuvwyz|}~~}}}||||||||}}}}~~~~}|{{zyxwvuutsrqpponnmmllkkkjjjjjkkkllmnoopqrtuvwyz{}~~~}}}}}|||}}}}}~~~~}}|{zyyxwvuttsrqqpoonnmmlllllkkllllmmnnopqrstuvwyz{}~~~~}}}}}}}}}}}}~~~~}}|{{zyxwwvuttsrqqppoonnmmmlllllmmmmnnoppqrstuvwyz{|~~~~}}}}}}}}}}}~~~~}}|{{zyyxwvvuttsrrqppooonnnnmmmmnnnnooppqrsttuvxyz{|~~~~}}}}}}}}}~~~~~~}}||{zzyxwwvuutssrrqqppooonnnnnnnnoooppqrrstuvwxyz{|}~~~~~}}}}}}~~~~~~~}}|{{zyyxwwvuutssrrqqpppoooooooooopppqqrsstuvwxyz{|}~~~~~~~~~~~~~~~~~}}||{zzyxxwwvuuttssrrqqppppppoopppppqqrrsttuvwxyz{|}~~~~~~~~~~~~~~~~~}}||{{zzyxxwwvuuttssrrrqqqpppppppqqqrrrsstuuvwxyz{|}~~~~~~~~~~~~~~~~~}||{{zzyyxwwvvuuttssrrrrqqqqqqqqqqrrrssttuvvwxyz{|}}~~~~~~~~~~~~~~~~}}||{{zzyxxwwvvuutttssrrrrrrqqqrrrrsssttuuvwwxyz{||}~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuttsssssrrrrrrrssssttuuvvwxxyz{{|}~~~~~~~~~~~}}}||{{zzyyxxwwvvvuuttttsssssssssssstttuuvwwxxyz{{|}~~~~~~~~~}}||{{zzyyyxxwwvvvuuuttttttststsuxtr}{ywtrt}vu|xx~|yxw{~|m{~|xvx|xw~~rs|uvp|uyyorl~|w~uov~x{vz|bdjuhtojemljn{ustuqw~~xx}l{xxtywtxuyw{lxy}yszs{~~t~u{xl|{vqpn|wtk}zv~yx{syec~ltitrpdjihv~utturrz|{w~l|x}w~tuzsyuwnx{|oxnzy~}sv||k}|vqqox~u~g}rw~zx}mzuehjyivttbjdituuurny~~wuyox~yl}xsy{|v|z}p{|xqunxux{pyns~y|nuq~{wzvf~oyz~y{wl~srdq}izlxxvaj`r|tvvuri|vqrsss|izu|{r~zu|t}zurtnsutyoziw~z}pyu~{wzvdzkw|}{wyf|nrjsi{l{~zak_t{twuvrbysmqtssiyv~zq{ut{v{{ypumunsv}ownt}{vzzw{vwdz~cw}|~s`xmopqkzk{ekcm~twvvvdlyin|lxzf|v{wqzytwzv|nyk{fuovu|wy|}~{pvoYouksZ|pypTxzzrpon~|lkIdqowgPy|ymivi}tn|{rvsc{ntkwu{|jyxwqwsrsgmvwvp~uyjiyppzc^pr[}uf|Zj_~}jrefbv{u|ef}us|xysy~tzswzsmgrvzwjgxixy~}yx}ijv{uvsslysq}{vyvjk}niu|jrpkgovwaqn[lzo}rr}hwtjx~satw{kksz|nwzwyuqqxuo|yfw|i|u|g|usoywlni~offmyqvvptf^j}so}imwylu}jilhh{vxmmm|du}r|lsuv||}xstvzmox}|d|zuihwovy{|gpfqxpdhluzn^{tivwx~Rvyy~ymgppdTh~~m|y}wxzu{x{nmyzvrm}z~suuivpk}Wt{}vwiir{wzux]}to}iwsufp~ir_s~~x`uvshxvZjr|er{wnlzh}on{}s~yj~|zuyzxm|wsxponzz}s`{qzp]lfqrlnsl{sssf{eitrywgshwlwozobntrn~rooxm~kmiv|hctcltk~pm}byopzpzsoqzs|pmq_kqi{{}jfvp{anskchkzvx~hmzttqrcmyjav]Pzn`hrzwgi{zyygmuy{ZcunĂ|}ysYirk^rxpvszbqt|~zwcTr|yzc{^rozs~^c_uwvb[tz~~{{^yewvfu|nijto^u}kWuv~vlqwmycnS~ziuv|||ms]vYxitbj~|yxox}hy{ow~}jz{ezvbbys~xmvofvius{z|r_uekf^kw{gsauz|ydtfylzytlvhhk}pk}ek|kv{}~t|z^s{zrYgcru~yinYwq]wz}uyopXvi}ts~fdxc}wx}}x~p|}|txky~uiy_opceusur`|}|xuou|~}wqz~wu{}tu`dwtsj{xZlhsdls|ksvyugjhrztsq~n||v~pxknz}|~v{og|wxzuiv{zbq|z~oz}ek{vyxlyxxlrr|s}huvmvfk~~y~uv}h~~zo~y}t{|wvzvsnk{~v{tygZpx~}usm}wvrq{rywywms|pJXQ\~y{p{pPEI@V7CgHW}xn|lɽ׸hlXfzpsRTS\{bmgo}vdawl̻f=`wtqdHr\ynyqwzwszPly\gp~skbnfUSXeqXp{lVmgISPLlgVrTr}wwRCuzmYHRMȽ~qwY{j^m^t٤bXL/^mjzL,66[>7~hhHxec{ysIJMK;,BM]h^NXcbl|vt{gp[:blx}wR@QTd|]U`eLTER{ƬºsS1B!Q}{ž̾o~tBOSFCfGkpMZv@TjSSXP\T\]czd[OI\5Ooujszk˅mxj\<>78WZjwauSaPMoln||Ş_1- !<=ĺbKQIUP>gfZHDcQYj_|ziRXRD_<8]B6]\^u~rpaeKXjq^wsmuxL`\[zmVvaPY8Vzuy^v`_qű٬ɨϩv^T6:Y_mνn~sLfjvJf[9UGFTGHjidzvkvy}}erZsOFcqkwlunmxVkp_zs|olnTaW>_Thgfrmczwkzs}}kuy{ũ^^I_eOxrÞxtxopNTZegA9,AT^BFIcGZtyxjttWSI[[>5:B1=3C%bLX_S39MDFhuX_[[]gngna\KpZQJCVf[NdU??\]YgiiMsv|zxyf~zkab~xl\yvqun}rãuoezyf{|ֿųs|hVkkkj[pJqv}oc{vey{qlfvs}uioahy[ldKGamW`blTin}{rrhqxd\Rgi`LflVh\rZx|rs|tyeu~n{koymRa_;'4A4AKePlwf\ttynp[xrxr~wpuh~ϫzzusmw~xmw}xvxgkwgH[]:/EUFQU^Jmxo}qcVeZD:OODL7H3MNL]U@>\[COeXZ[Q\frf{ts{u|kkbvzqƣ~˷pwUN^YMWaaXufn`OHYMXXTdQf]a`TABWJ;Wh`eZZdxoclbiPf]WVM`cNNbV?C\[\kiY\rh|txlivrfkrstvo{wwrbkwuwxnȽϴv{l~pvifvt~obtnm{ugnzsy||~vvvehscLThbgkiO_ggyzwup_di^Zmo[lXg`dvuuo}y{vpuocseonkvmRXdJ5>H<:AE5Zmwp}sy~teu|hl|~o}rasr°{wtz{~swyspx|uvxaKV_G9FSMRXP9\eh|{ilj^Wf`MbIPECQPVTGCY`KH_^\]XZdv`ogv{q}~zzlwrco{t|{e}xzhRSZUX][Igz~zi^ghRj_hl`mknfULZ]MHY`agbitfqmfu]lfdc_aTHK\TCIZZ[bfR^rg~v~}nktomwr{uo~vrz_\otqvwgoƿºѾ}~ulqzzzriskozw}vo}x{f_osXLX_]acUMmetyv}u|n`dd^auj]rcpecqw{przz{z|ydt]gl[lgkkpq[KOW@*/:7IOTWS_|q{xuszmmv`ol\ZZ\VS`nm\Ziqtqquwgdyewtdsy~}{o`amvg[aimnnixutg|thu{}o_\ecK=BKQUXYt~m|vxvtodakqhVZkw}{}mzydye[dghc^NCIY\JDMV\_][v}tyxx}t}z{tuyytyv~uwtt}~{ve[aniXV^dijfjƷzwxwtzzoyzrvvmp{}yqb^fpgVSWZ[XSYsint}tonov~pj|jp|olloop{{r|{udXiUYdLQ\dfe\NJOUG3.259<>Nqm{˾~wo{{}{o_\fpgYZagjjgt~xwxutwmv~zlj|elt]_fjgcWIGPZQB@EJNNLYsivzsyogffcajtvi_grxyyzwkg|hlzegqwxuma^gqi[Y]ab`]gv{~qhyfdt``ktvtk]Z_eZF>?BFHK[zxŻ}~yuy}oagrzzs{rodinmg]NIO[ZMHMRVXW^xwrwyvttusysu}o|jvfkqspi]V[fi[RTY]_`d|~ƹ¾|zyvyuq||ozl||imuzxrg\_hmbURTVWWWhufxt{vtwotnzuooqqtzqw~}ytiWUdOSaMNYac`WJGLQG6037<@GZyu~µ~qu}pswwqh[W^jk_XZ`dghq|}vtsqupks{}yobkr\hkVV\`_ZOEGRYQFDIOSV[pv||qnmlmw~|phmw}}vjm}jjzjdkppmd[Zcmi]WY]_`bp{z~|}|}{pa[laVj_T\ehe^RMPWSE;ESjxqwxsqroh_XY`fcZUTVY]hzuywwz~rjkquvtnd_io\^k]RRUTQKHLU[XPJJMPU`szo}|stzzrlv~llzobbggc]X[cig]VTUVYapwjs}{||~}rortsnf[SZaQO`ZPPUXVQLMRVQF>;=AIWlzuĽwty~}zzpjihb[TSY``XQOQTXap{su{{vuw|wmilqttqiacpgYgiZSSUTPLMT\`\URSVZcr|yy{yqr|kt|ndced`[Z_fjd\VUVX]hurhyyzvxzzxy~rhfhigbYOJTYGJZSIJOROJFGLPLB;:=CM]r~wľ{w{{ukigb]WW]df`ZXY\ajy~}}~xvvz~}vlefjmmib\]ifT[dYNMONLHHNW][URSV[cpyvux|~|womx|ljxre```^ZX\ciib\ZZ\akx|qx~yx}}vkeefd`YPKS\PIZ]QMOQPLHHLQPICCGNYh|ºyux~~{wthdb^XSRX_b_YWW[`jx}z{}ywwz}|ukeehkjga[_jeU]f[PNOOMKLS\b`\Z[^dm{yy|~{uor}zinxnb__^\XX]dhf_[YZ]doyum||~yzz~{{}~vj`\\\ZUMGJVUGM\XNKLLIDBEJMKFCEKUbt{y}|~ogeb]XWZafd_[[^ckw{}|xxz~}vlecehhe_Y]gdTWc[PKKKJHIPX^^[XX\akx|yxz||xsnr}xhmwoc^^][YY_eifa\[\_grztn}|}|~~wkb_^^[UNIOYSGQ\VNMNNKHGJOPLGEGMVev¼yy||}zzmgc_[WX]bd`[XY\cmy~vy{{z{}~yqhddfgd`[\eiZTabVNMMLJKOW^`]YXZ^fq}x|}|wsu~olxwkca`][[_ejid_\[^clurisw}zxzpfa_][VOIKUTFGVVNKOW[agnywytuzyyz{yqmnmhefhsynos[BL~aV_js~}zumlzvt{qdXRMJHA957?<-/>@;=GXjzyL$@BCCDJW^UP\c\TPONNNRX^ba^]^ahq{~wz~|z{{yzzxrjeceffdaahqlagsrjghknqwɾunheqŷxhZPLIE@:69B@20<>5/-./14;CKNNMMPU\fnlen~}uwxi]`f^[m}mc\YVRMJMX]SP^fb\[\\\\_eknnnqwɿƷ~jgmqt|ƻznhjk]NRVL>62.*(*.477445:ALX]Y[mxss|ytxvlaZVX^fmu}yrsvk\`id[VUVWX\ckqrqqrv}ȴxneYNFEN`u}iZPHA;89<=:50./28@E?;IUPLS]ejmmlijow{{|}{xqeUG<62127CYr|y{oha[USTXZYXWZ`htüsjbXOFAHV^`u|uk_SLGFHNPIBMYSMR[bfihfddipx|~{sswt~}}yqkhhhe`YSTWM;=CML@CPQJGGIKNRYagjhgghms|}v~vppt{ô||~~}{y}}wka[YXURPQV[`mxi]VPJC<78@A55BF@;;<<<=@EJJIGHLS^juwr{}}{memxvz}{~}|xhZWZOBFR[cn}z{yj\`bYNHECBADJOSRONNQW_hkdeu|vt|uputoihkr||~uollkkmrx|{wutuyxnpneZQJFEC@>AJXhwzrkd\WTTSOHCACGOZba[bolbcioswz|}vi\UTX^enx}{|~}ytpopt{|}}ysk_QE>964229I]fk{uqoqtuldmungjqvyzywtsw}~ypkifc]VQRYXNQcmor{{y{|swwxznd]XRKC:8<ITao~vwyyzzywvy|tntyztstuvurr{vkptk^VRPOQXdq}~xuwzpaad[MC=83017?IPXcqʾxooxynluzyvuvy{{wqmmnpqommszujmurha^[XUSTVVSMJIMUap|ywxyyxvv}z}yqke_WRONKE>7559AMWY\p|}vmfdegiiiltvy|vsqomlnqrohb]ZYZ]]UMWb`_jz||~~~}|{|zsnjhgifZPUYPHLT]fozƺ}vngededb_^dlh]bljc_^__`chnqrnkiijnssjbincZ[^_^][XX\ftzqjhhhhgfhq{xr{|{{yxx{~{yz|~tiffda^YURTZclszĿ|xtqrzvox~wokigedfjmnlgddehoutln{|trx~~ztnlmpponmlkhhu}zvxws~{utuuwy~}wtttrnie`YOKT^ZZk}½{tkgdb`_bfiiea__`djnibhsphjqvyzyvrprv{}}|zwqgbhk_X_eggiow~yy|wutrpoptvurpprx~phkk]V\aa^]_cinprw¶}wpkhginpibjtoilty}~~{yx{{xvpuxtnifdca\VSTZbjqw~~~z}~zrlgc`\TJA=>@CFJQ`s~{ps|ulkptvvtqnlntz~yv}w}}ywutpi_UNKHEB>=BMSOViux{xlc\XSMGBCKMECQZ[]dny||{uz~ty~}~~xqlkkkiea`eg\RX\UNKMPTZdq~yvtsojdacf\NNSL@853227?JT\ckt|{{v~|yxxxvphb__``_\\bkkacmne^ZVRNJJKMMKKOVap~}}{xvyzt{~vke`ZUPMLKHB<868>HT\^h¾zsonoppommszulpyvnjihgfgjnomgb^\\^ce`\huuu~|}~~}zx{vt}|tlifda_`bc_YRKGDDEF?59DC>CO\hs}~vmhffedbafotmjuzuokjhedehkkigefimsxujgnj\VY]aejot{}}~~}|~|zz{}{voida`ac`UNUVKDFJKLKJIJNXer~ºÿ}{~tx|tpoooorv|~~{xvvx|zt}yrswxwtpjebdhmpsw{}{vywsqqpprvz}{wspoorvvmekpg^^ab`]XRKHHKNOPQSUTT[lxx|xtpmkmpstrqqty|~ttx{}~}|zz}zuof][dkfhx~}xuttw|}wpwxqsx{{zwrlhhjlkieb]UKHOPECLSVX]fp{~~zqovuhdikhdbbehkkkmrz~zwvwz~wrzysv{~~|xtrtx{|{zxtmdbifYTXXRLGDBA?;659@IR[dqyzw{|vlb[WWWWXZao{{}|{{y~}}{uyxmotsnifdb`ZRJEBA@><:>HNIL]hkpx}ztmiggea]YZ`^SQ[]XUW\agnx}~|y}zvsqole\SNKIGD@=@GF<;EF?;;<=@EMXckrz~ywvtqnmpwullutmfdb_]]_cggfegkqz}|upmllkhdadieYW^[RJGDB@?BFHIGFGKR\htwz¾||}|zwux}rpxxpifdb`_`cdb]WTRRUZ_\Xaopov}wpjfeffdcbfnpffopha]ZVQNLMMJE@=<>BINLFKVVQU_js|ǽ~~}{|~}wpjfdcde`VU]\TRX^chknpt{}|||{xuv|wpv{vokjigggjmmjd`\ZZ[^ZPKSTJEHLOQRRSTZdp|¾{yxvvvy}}yurqqsvvngmqh`adffda]YX\binsx}|zzywtsxwxztqoliggjkjgdccfjormddjcVQRRQONKIHKQW[^_`aa`an~ļ}{{}~ur{|sorvxwvrmighkmmlkjhc_bnpkp|~|{yyy||xutuw{{tmrxphhlmmjfa[WVXZZXVTQLECLQKJU_eiow}{z~}yvvy|~~|{ytlfjof^afebaadhkmllou{|{|~~|yxxz~{y}qkmpqqqpnmnquvtpkf_ULMTPGJSWVUVX[^^][]bjs{ÿ~ww~|pntuqmjhhhgb][\_cgilr}}~zvsuxzzywurldbhg[W\^ZURPOOLGA=<=@BDEJTaedo{~xtqonjd\VSRSSRQRXbb\bnqnnptwz~wnkqtkipvvsqpomibYPJHEC@=98777:@GMPRUZajuzustttsqrx~yqu{vmgb^ZWUVYZYWWZ^dmw{xy}unkigda^^dha\bgb[WUSPNMOPNID?=<>CIJFJY`_er~|yxvutuxzxtokhghjlg_akicdlsx}yvutsqmkmrqfdkkc]ZXVTSTWXVQLHEDEGHB:>EB<=DJOSWZ^clx¼}zz|}{xtrstx}ypswnc`abba```birz|y|wwzvttrqpqsspjc^[YXYYQHKPH@@CEFEC@>=AGMSX]bgklryx{|{yupkggilmlllkieeovrr}yvtrppqtutpkgedfhic[]d_VUXZZXVQMJJLOQQQPPMIGPWSR[ejmrx}zy{~yribdha[ajnprw}|xutuvqhfmkb_bdedb_ZVVWZ\[ZYWSLGIPKBELNMLNRW\_`bfmu~}uu{xmkpqmjgfggfc_]^bfjlos}}v{xqruwvurnjhilnonmkhc[X^^SNRSOJFDCBA=8558>???>?CLNIMX]]_cipv}~{vpjgfffecbekledkmhdccdeglrx}|slnphadijhgghihd]WRNLJFB>?DF?=FJHFHKNRV\dlqtvx}~zy|~vosvqjfedcceimoonnorw}xvz{wsponmje_ZXWVURNMOSMEGLHB><<;;<@EHHHHILQYaggiuwsokgeefggdbbcejosqkowuopv|}vqmjgd_[[_aZU[_ZUSRQPOOQRQNIEBABDHGBBLPMNV_flrwz~}xurqrsslfjojdfknqrsssuy|zywtpmnrpfdiha[XVTRRRTUTPLIFFGIJF?BIGABGLORTUVY^gpw~zvzvkffhhihhggintxz{{|{xv{x}}xtsrpnnopnjd_[WVVVSJEJKC>?BCCB@><<@EJNQUY\]]cpvu{}ytolmnpponmlidenpkltz|~~|ywvwyyvrmjgggiha[_b\UVXYXWTPLJKNPQPPONKFFMPJJRX[]`ekrw{}}xriejkdbiopqrux{}|zxxz}~{z{yqikng_^`a`^[VRPPRTTSRQOKEDJKDBHLLKKMPTWXWY]bhnsw}|vrvwtqnmmmkhdaabdfghjpyyu{||}~}zwsnkkmnmligd^WUYWMIMMJFCABBA>;9:>BEHKOYbcbjuwvw{Ľ~wqnkifb_`ehdaippoptx{|xwxyzywuspidfje]_bb^[YYXXUPKHGGGFDBDJLFEMQONOSV[`gpx~~}{zwspqtsjgllfb````aejnpppqtw}}wprspjfca`^ZTOMLMMLJILRQIHNMGB?=<;@GIFEGILOSX_dghilotzzz~{upnmlkkmpqqonmnpty|zx}}yvtsrojd`]\ZXVRPRUQIJNLFBA@@?@CGIIHHHJNSY^]^gppry{xtrqrstsponnprutnjoqjgjosvy{}|xurnidbee_Y]`\WTTSRQRTUURNJHFFHJHAAHJEEJPUX[^`chpx~}~~yrrvslkmoppomkkmqvz|||}tqutmgdb`^\\^^\XTQONNPQLFHMJEEHKMNNMMMQV\`dhmuy}̹xvvuxz|~}}~|zwsnhdda`a^XUTMEEKLIMWco{xĿxne]XPD743+#!#%'()+,/4:AEIKMNLIIORLJNRRQRSX\_`bdgmsy޸uң|yuqmie`_ejffnvz}{}{slhffdcehjlklnrxn]QK\}zcUOOPRY_fkmnonkfbed]WX[XUSRSUVVVW[ahpx~¾u^PParcTKECBBA@>>@BCDDDHNPMMSWWVXZ]`chmsuvtsstwz|zutzxqnooolie`[YYYZYWVVSOLOUSOSY[ZXVSNF<2,.;Pgz~vpu{}}ƿ~pjeXKB>?GVlƾtqncZVUSPLGB=:99:98642.)',-'%*-.--/2577779=BEHJMS[]Z\egeefilpu|ľ}|}}tj_SIA=BFKQX`jqsuzofbdlwyqkhgefhloppopqsw|~|zufZTK<, /G^s}utnd^^__`aaabeinrsttsqmjmsrnrz~{xvutnc[ZWNKP[hx}}~{wtstttsrsw|zuy||}~zsmhc_dsµzurrlbac_XSQOMLLNPQQOMLMORVYVU[a`^bgloqsssux}}vmd^ZYZ_fqzqib\YXZ[ZYWWWXZ\]XSVYVQSX\`dhknsz»vnfa`cjs~ùytmf_WPIDBCCCBBBA?=>EIEFMSVWY]aehihijmqsttuy~}xy~ywuutssuwwvsoljiiif^UTRG=9778>;6;IZj{vkihaXRMIFCCCFGFECCDFHKKEBGHC?BEHJLMNOQVZ]_```^ZWX^^Z]ejlnquy{|yuqolifbaenz}unga\XSOMNU`ouja[VSOJFA=81,/1+&)-.--/1578991'&'(*1=N_p}{ujfhfa][[[\^aehiihhiknrtrosywtv{~zvsplf`[XYVPS]flu|y|ztnjfb^ZXVTPJECBFMXfrŽ||{sllmjfdbbbba^\\^`cdeeinojjopliggghilptvwxy|~{wwvsplgb_`ciov~~}{xsnkihgda__bc^\becbcfilotz~snmida`cir{ysokihea\XUTSUWVQPVYUTX]`cefffilqvy{|~~}z|}}}zuqnljfa\WUSLCBEEDGOXbku}zyywrmquqoqvy|~}wroke^WPKHGILMNXhrzyxxpiilkigghiigd`^\\[YWUUY[VTY]\ZZ\]_`cgjlkigffghjhb`dd^[[\[YVRMIGGJMQW^hs|}vppnd]\ZUPLKLNSX^gsytpnkga\WSQPPPLFGLJEFJLNOOONOQUZ]`befgeekqpnsz}~xyxsoorx~}~}{wtqojc[SKE@><:66?HLTap|xpnolebefdbabceedbbdfikmnpv||y~{uojfdba__acfiq|xtoh`[[WMFFC>95223468>HUdsľ{utuvwwwvvvx|~~|xtrvxsqv{||}~~{yxwurnkklia_b`[XXZ]bit}zvrnlkmopppooliioqmlquvvvwz|}}|{|~zupligfd]Y]aabju»|zwrmifefecbbehgcekkihiklnquy|}}}}~~zvpljheb^ZVSOLNV[\bnx~}{xutvxtnpsqmkklmosx~{xxvqlheb_[UPMLNQUZaky~{}{tppqpomkhffgikllllghmv¼som]UWUPQUX[[\begr|x_NNcujM;9CN]iryysqf_\YXVTQOMNPSX_hs}ͥ|wqjb[VSK?762-)&&(,18BLWeoxzoW=Ptjeeo|}cYkrXMOV_got|}vrpqsuwvsjaZVUV[agjnwzkwqgmu~mdmiYTXbgefjhb^]`cglqvz|}~¿cA'0Os{hWKD?<;;=?BB?>==>?AB?;>CB@@DIMOSW[ahpw}~{yx~vqxwqmkkjhc[OC7//8HXfpvobVOIEA@DM[ju~~zuplgb[TNGA;79@Ob{}yvtrnjfb_ZNA:71/3CDISYYY]bfhjkkkmquy|~|vqmmovxf[W\h{tzpaK0"0AKL_gdbillqx}wmjtl}zPHP^ql`9/+/;Plqbi~qaanwlP.,F^oxww{Źnj{}{{kVLRgfuu}zx{z`@*6^f]t̽ztrrttsplpwЯuYK\g=% )3>FHE?5*$"&*+,5EYdjv´bG:>TrȽujc[SJ@6-&"!$,8FWgs{~zqdXV`zоiVUjνjWKGJMKD7%5RcosiUC73:GWepw}wsqoqsvy}r\JGIJWqzrqu|̻{z|}_:  =f¬{`H>A;0-2:AGLPUZagoyzeQFKZgnwpedgnvzxqg\SKEA???EJNTZ`fjmopokdaohSDCK]us_OC94578515?C:1.15:@FLQTVX[dp}|rjddk{Ѷue`cglpt|ueP9)))!"@s¬ypieddhkotx~wi[L@60/4?Pbr}zsmjhjlib^hnghr|}xuuusmkrjSA86;FTakrw}zri_WPKF=7?OTXgz{vqmheba``aeks|ȾxmdahztdcyyocZSONNPRVZ`eimpqqrrpjdfg\POXbjjeittkjnqqponrzwof^VRQSXXROg~{xsme[OA3%2Ojx{wuy~yqieba]UOVtysokjklmmo¿r\MF@7,,9AJdǽvmd\TNHB=840-+)((),29CMQMB@O]]VU[dlrwy{{zyvsoje_ZWVY`jvymaUJI]yywzvsojgjy¶zriaZWWY[[bw}yvvuttrpmieb^[WOD>H\iq}}|{zzzzz{}}{yumgb_^irg_XQIA82/6Hfyrke^YTRQQPI@?HJDDLXepz|vvxnd]YXYY^rƺ|xqjc__h}Ƶs`RO`|yodYQKHGGHJKLKIHHKPSROLIIIJLORW\]YSW]SA@Scir}ytojd^YUQPRX`imry}wjdcba_\ZWUSTYe}{yxy|}yvz~{wtsrrx~tnknw|wysle\RF;0%&4Giƴztoic\UOID@<987789;<>?@BFNUYUSZ_XTW^fkosvwumb\bkjir¿yxz}yppzzz¼ypg^WRNNNNLNXeffqy|}unhc]YTNHB=72/.0481,&! %5Qs}xusoh_Z`hf_]_begjnsy}}x|~z{}~}zvsqprw~yy{}~ysnhb]YVVY]ce`URexqkd^XRLGB>:98:=@BFSemlowtllj_PFB@@@BFMU^hpx}|slourkhlptwy{|~xvutrojd_ZTNJQf{}{tmf_YUSTX_ht~zxvtroliebaaa`^\[[ZVMFGLH>;?DILKD:4:L^o|ume^WQKFK^t}~ztokijlnpqsuurmimttldbbcegjpw~zrt~|xqkd]WUYf{{ty}xrpqsttrokhededc`]ZWUTQNJFB=82+%'6N^fnx~}{xvutssux|xsw}ztsuvvspmifc`^\[[\[XQGBCFCDRi¼~zvspprux{|{wst}smrxtnmortwz{wspnnmp~~xsnhc^YTOJFC@><;::=FWlzpjhgfd`\WPJEBBFKPSQQXgooptxzyupic\XUUW]fq}~xsmhd`]ZXVTQKDAEJMWl¾|x~xuyzsonmkhd_ZVRQPRUY^bgkmoqtwzywv~xvyyqf`_abb_[VQLIGGFEA947==87;?DKTezxpnoqttu{}yuqmigefjq{{tmfb_^^^__]Z[fqtqqpmjlrslc]]al}zqkoqkcabdfggffghigaZWZ[ULGFGGFDB?;989;?CL_}zusssqnligedddeeedeirȿ|xuqnljiiiihc[TU]aadmxzuqmjgdb`_^^^__^\`oyrjc]YWUTQLD>?FJGCCGKPWbt~{wtqnmkigeb\UPQX]\Z]cimt}wpib\WRNJGDBABCDGIKNRYdyĹ|yvtsrsvxvpjkome_]]^^\ZWUTTVY]^^^bnx{vsqrrqqqrtxzzxzysmhea^ZVRPNLHA:9@ILKJJKQ^gghrſ~{yxyz|}|||ywvvwz~zusrokf`ZTOHA;510135436ANRRV\chjkmtzw|~wokjkkklkjgc_[WTQNKIGEDDFHIIGFJWgoqs}¼~{z|~|toomdZZ`b_]^bfjllkijr|vsqoljgc_\XURQQRRPLJQ]fgjqz~|{zxsldaeiha[YZ\]]\YTOSbu{vqkfa\YWUTTUUVVUTRQS\m}yuqmhb\WSQQSW[^^_gs{wqt{tuzxnfcdgikkhaVKDDFC;30148;=>=;9:?L^q¾{usvz~zsosvqhb``a``_^_`cglqv{~{yvuttrpmmrxyz|tmf`ZUQMJHFFGILORSPMO^y~zvrnjfcfs{slmswvrsx||}~}|zwtplhd`][ZXSJ>3,-,'#,48;ANZ^\\bpþxpnrw|}}{xuqnjfb_[XTQPOOQTX]cipv{}zvroljhfaYRPVYUONQUY[\]_eo~zuromlie]SLKPTRPRXahlq{}ytplieb`][ZYWVUUTTTTSND<>Oeolfdegijlmoqstsrqrwÿ}xsmga[VRNLKLORTUUXcr}¿{wvvvuuuvvvslc\\_\TLHFDA>;741.,+++-037:=@CHQ_tĿ}{yxxz}~vjacloja\_foxytokgffhkoqqps|vja[XWUTSSSSUVXYZ[]cm|~vplklllllljgb`ft}yuqnmmnquz|z{{zxupkfa\WQLE>70)#(3@LTXZ_k}ſ{uuy{uoklnnlf_ZZ\[TMIIMRX_fmtz}tnmong\TOMMNPRSTQNMS\`^[\^ckw}{}xrlgc^[XVVWY]bir{~||zxwtqnkheb_\YVSPMJHFDB?;722;KZbehlqvz|zvtvľ}{xuqlcYPKJJF>746=BL[m~|zzyxxyzzzwtsx~yurolhb[SMLPTUROMLKNV_db_^`cfhhiiiihhhfda^[[^gt{wspmkheb_\YVSQNJFCBJZkv||uqrrkbZVUTSQOLJHGEB=8315:<:51/03;GYozof``egb[VUUVVWXY[]`cgkorvxz||{{yxvussrrqnihmx{ywvutrqolieb^\YWVUUUWY\_acdb`_fv~~~~{{~uoljigda]XSNID@<864221110.*&%*28966>Ocqx}zurpnljfb^ZUQNKIHHILOTZair{|vrolhea]YUQNLJHFB<759@C@>?BEGIJMS^m}ÿ|zxwwwxyyxwz~xrlf`[UPKFA=97557:>ACCCGNROJKS^ehjlpuy|}}}{wwxvoha]\[[[[ZZYXWVVVUTU[j}|yyzzxrjdcec\RKGEDCA@>=<<<=>????>=?DN^q¼{vrnljigd_ZY]a_VMKQ[ejkkmpuz}}{yvtromkifc`\WV[htyxtqonmmkhd]WRSW\][XY\aglqtvwz~vstvuqnmosvwuuzyututmbXSRTTTSPLGC>950,)%#! !!#&*.38=ADEFJVm{rmkkklkkie_XRPSY[ZWUW\bipv|}ytplifb\UKC>?BDB?>?ABCGOX\YSPQV`n~~|{yyyz|~vmfb^[XUQLGB=841/./1355423:EMQRV]fnu{ü}xtpkgc_\[ZYYXVRMIHMSWWUTUXar}yvtsrssrlbUKJPUQG=88;AFKORSTSPMJHJPZfs|Ƽ}jYMKPUbsx~t`VQNJOUZ\aehhghgfn|}o^MCAGTdpsk^QKLQ[iwxiXI=89?IT_jt|~{wtu|ɽϴտ}slgffnx~{zwodZV\l}qmnu~~~|unjihe_YRMF:'-@IA/+E[`Q:)%4NmðvaSPT]is{~}yskb_\WUTUX[_dhjmqy}pkkq|ooy}hTD9314559=BGMRWZYSI@9659FYnxpjc^]dryldbfnu{}uwĺ~{yvrmdZPHB<2$  #4CP[gsyvlbYTTZfx|~weXRSZckpqnh_ULD=9667:>DIPV\fv~wsqsvz}wph]PC:7773./28?FJLKKMTaqwoloyrjd`[SLIKR\fov|{wrnjgdba`__^_]ZZYYXXVTQKC90)%#$(2@NZdmuz{wqh_XUUX_gqzypga[XWWX[^bfjosvwwtrszǼ{tpoqv|}qe]UI9+  "(09AKYk~~ysmklqw{zxvw{~|wqkea_^`cglqty|vkbZSMHD?<::;=AFLSY`ekoqsu|~wsrtvz~xsmjgffhknsy{tldZQH?6.&  -",6>CGMZk~½xpkige_VKC<8544579=<<<=>>><:;?FOWZ[\^bhnswy{~}zwvttssrpmkknsyzwrqtwvtqszzuqmkiiikmprrqmjilpqnieddeda\TNIHHGB:3,(&%%$##! ,;FKNOQSTUUWZalzƿ|vqlhdbaabdfgikmry½}xtqnmkhd^XUUWTMC==BIMMKJIIIIHHIMS\gr{}|zyxwutpkd_^aefc_]^`dgjlmmmmlkjifb\TLGEFIJHECCEFFFGLS[^][[]`eimpsuwy{|}}}|{ywwz~{yvspor|}rh_\ZXQH?9766652.' #(,28@JU`ly|upmorsnga^]]^_``abdegjlosvz~|ywtrpnmmmnorvz~zwx~}|~zvuwy}{upmmqturolklpty~|vrssph^VPLIFC@<840,)'%$##" #%$##&.940//010//39?A?;7557:?GQ\fotvvvuvw{~zvrnid_ZUQMKIHHIJKJGEDHOX]`cgnw~{xuroljhfc_YSMHFHKLKHEBABCEKTcs~{zxwusoibZSOLLLJE=51026;?CFIKLMMLKIHGIMT^jwľ{snnpqplihjouz~}~zvtrqponlie`ZTPQV]aa]YTQNLJIHGHILOSW\_ab`][[^djpv}{wtqonmnpqrqnic_`gouupljlqy|rf\TPPRSRMG@<9889:<>@BEGJMOQSUUTSTXbtý{qic_\YVSPMKIHHIJLNOPPOOQW`ipstrollpw~|{z{{{zwtqlhb]XRMHD@=;::==@FNUYZYZ\_bfjov|yvrnid_ZVQMJGDB@@@@BEHMQUXYXY_k{|yvtrnjd]XVX[^]ZWTSRRSW\`b`\WTUZcnyú}{{{zwsnihjmnkgcaacefghggfdcb`_^^^][YUPJEBACCA;5029BJNOOOPQSTVWY[]_acdeeeeegkr|}ywtssstuutqoory|rida_ZRIA;765556789::98779?FLPQOMLMQXblw|urplga][[\]^__^^]]\\[[[[[\\]_adhlptwwvsqqssqonoppoljhggggfedb`^\[ZZZ[]_behihe`\[`is|{smhc_ZTNHA;4.)$ "$'*06>DJPV\`aachq}¿xropomhc^ZXWWWXYYZ[]^`bdfilpsvyz{|ztqnmllllllkhd^YWX\__\YWVWXZ[\]afnx{xusrrrsrqokhfegkorqmgccdgknpppnkhea]YUQMIFB>;864310.,,07BMRRPOQX`gkmmmmoqux|ÿwoifddfilpsvwvutv}}umcZQJGGHFA91+(&&&'''()*,.024579;?DKUanyyvwyzwpf_[\agmppnljjkmoqrstttttuuwxyyvrmihjnpnjfeehlorsrokfcbdhklkheddfhknqsuvw{yuv}vi^UQNMLJHEA<73.)%!"'.4:?BDDGMWbmu}zrmjjjkllkhd_ZWX[`eggedegkpu{}{ywvuspmhc^\\`fkljc\WW[bffb^ZXY]cjs}}||~}yvtsrstuvvtqonrx~zuplhffhkmlgaZTOLJIHGFDCA?=;:852//2;HT\acehlpswy|~~yuqnkhfc`\YWY^flpolikqzzupligedb_YQG=522210-)&$$&*.38;>@AAAACGMU_js{ž}|}~}ysonnquy}~ysomnpqpmieccdefeb`_aeiie`][[]_acdefghiklnpqrrrqonnpv}zxvutsqnkijnty}ytssqmf^XSOKE?9533431,'#!!#',29?EKPTWXY[al{ýxohc`_^]\[ZZYYZ[]`cgkotxz||{yxxy{}|xtokgc_\XVTRQQSUX]afijjhffffc_]`ht~||~~voieba`^][ZXVTRNJD>8312467631//026>JZiu|~ztnhc]XTPMLKKMQU[aglptw}ztoid_[WSOKE>6/++.01/..04:?CEDBA@BIR\fov}~|}{wsnjfb^[YXWXYZ[[YUPJFFJQWZWRMKMRX`gmsw{}~~}{yvtstw|}zwtqoljgd`][\blv~vokifaYOF?;864322123469<>@A@??AEMV`iry{rmnrsph^VQOPTW\`cfhjlmoppqqqqqqppppomkiginv}vpkjjkljf`[VTSTUXZ]`cgjnruwwvrmhgjq{zy{{ysmgb_\YWTPLHC?:63/,*('()+.27<@DEEEGNYgt}¼{vsrrrojc\VRONNOQTW[_diotx|}}}xspnkhb[TOLJJKKIGDABEILLIEBA@ABDGKQXblv~|{{zywtqmhc^YTOJFDA@???><9768>FMQTUWY\_cglsy}~}zxxzyspoppnjfa][[[\\]_eny|tkc]YVRMGB@?@ABCDEDDCBA?>;988:>EO\kzſ~umgdeggfb_]\\\[[\_ciorrqnlkklmnppqqqomjfa]]_eknmjfb`^^^^^_`abccb`__afkqtutsrrux}~~zvqiaZUSQOJE@;86433222111123568;=>>><BIS_lx{ungb_][WRJB;51/0147;>@@?>>AGOUXYZZ\`dhlptx~}xtokheca```abcddb_\Z]dp|yvtrokf`ZWVWXVQH@;:=CIMONKHEBAABDIOWalw{uokijlkhd_\[\^adgilnpstvwvtqmhc`_`bcb^WPHDDIR[cffedcbccccddefghjklmnopsw|~|{{{{{zxutuy}}yof^ZWUPIA:411134420-)&&(-38;<<<<>@DGKOQUZcp}wspnnmlkihfdb`_^^^_acglqx~zy}yusstuuvusqnjfb^ZWTRQQRSUXYZXURPPTY^`abdiowyrnjfb^YUPKFB>;8531.+(&&)08@EHHGHMV_fjlnptz{wtrqqppomljhfdba__^__abdefgimv{wtrponmmlkjhd^WPKIKMNMJGEDFIMPSUWWWXY[`foz~zxwxyxtokiiklkihhjmqtwyyyxuspliea]YVSPNMLLKJHEA?@CJPV[_bdeeeegilpsvxz{||~|wsqpqrsuwyyxvronpuz~~}}~ysmf_XTRRQMG>60+)((()*+,-/258<@CFHJJJKLOV_kxztpnnnnljhgfghjlmnoppqqqrsuwxyywtplkmquwvsqonmlkhfdcdfhhea]YVVWZ^bfikkjfa\Z\blv}zqjfdba`]ZUQKE?94/*'$##$',18>DIMORV[adedeir}zxvsokfbaabddb_[XVVWZ^chlprstuy~xrlfa_`cfiigd_YURRU[`cc_[WTRQRTW[ahouz~ÿ}|{||}|{ywvwz~~xqliknswxwsokgeba_][YVSPLIFCA=:52//4;730/./0248?IUajprsttuvwxz|}wqkf`\XVUUVY]bhmqtvvvx{|vqlhc_YSLD=8568;;:86545579=BGKNNNMMPU]gr}þ~}~}yvuuuvvvutrpnlkihggffedb_][ZYYXWVVVVVTQOOQUZ`ejnqtuvvutromkiikou~~zwtqmiffipy|vroke\SJB=:8777788876420/039@GLQSUVX[`gr|vof^YVVX[^adfghiiiihhhhhijkmoqsuvvvwz~ztnida_^]]]]^_`begjmpqpnjea`aejosw}{yy|}xrlgca^[YURNIEA<95310001245654336=;:87544446:@GP[fpyzwvxywrkb[VTVZ`fkmmljhgghilnpqstuuusqmiecdiotwwtqonnoooomjfa]ZY[^cgjkkkklnpqqqppsyyttuvuqjc[TNKHGFFEDCA?<:7420///0246789:=CMXdow}Ž~}}|zwsmg`ZVTUX[^`bcegkosvxz}|xuqnjfb^YUQOPQRRQMJGFGHGEB?>?AFLS\dnv~¾|xvttuuurme]UMHDBAABDGIJJIFC@?BGLQTTTUW\agmsx{~|ywusqolifb_]]^`cfkrz}ysle^YVROKGDBBBCBAAAABCDEEEEDEGKQZdo{Ž{tnlkkjfa\XVWY]bhmquxyywtpmjijlnoomid^YTQQTZbjprqokhfedcbba````acehknqsvxyz{}zqjecba_ZTNIEB?<9520014677520/026;@FJMOPPQV^jyƿ|wspnljhec`^\ZZZ\^bfkqvz~~}{||{{}}ytoid^YUQNMMMOQSUUTSRRTVWUQLHGKTanzxsoljhgeb`]YVQLF@93/-/38>BDDB?=>CKU^ejlmnpsvz}zwsokgc`]\[[\]_`bdfkr{~|zywurojd\TNJHIKKJGEDEGJNPQPNJGEFIOV^fmt{~umgdehkmlkiijknqsuuuusqoligdb`__^^^^\XSMFBAENXafhfb_]]^aeimpsuvvuutsrrtx~}ytrqtx{}~~~ztmhdba]XPG?830..../02368:=?@@@>=<<>CHOTZ_gq~yspppqu{~wvxshjmi___\W[bghkmkccfiku{jZK<88>N]ivl_TG8569;?CGMS\fp}pzv}}ut{|yeXTV^jt{~}wncXLC:68689=GUft}~vnd]ZZ_houyzz{|ub\dws]ORar{zmZH<:?HQX]``a_\]\\[ZZYYYZ[\`emzĺ|xsmheehnxxfWRYk~vdWQU_kvytmf`ZVRNKIIJPXcmtwvqi`XQLLPYetvmhio{¾tkhlvp`WUZeq|xsonorvz}q`QF>;<>@CEFHJKKJJGC?:62.*'$!"'0;IYizŹÿwmd\VRPPTZ`is}zpe]WTTVY^cfijlnrvz|}xqlgdb`^]ZXUSPOORX^fmuz}|vmaUKECFO]ovompv}tcTJFHNW`fhf`XNB7,#!&+169::989GMQSTTUVX[^adinvĻ}ywvvvxyyxuqjc]Z[airx|~~yrjaXOGC?<71( -:GRZ^_^\YVTSSUY^emu{|vsrrrqmhb\XVVWY[]`cfimqux|~~|zxwusnf]SJDBDHLPSVY^ciouy}~|zywvvwy{~}~}}|yx{zwpz~woif`_bdba`YTL?0'%5GWekh]M?8DJMLB5( -FbxvdSNYnþúvjdekt~|pdYPKIJMRTVY\agpy{xx}|jcfr|l[MECEIOTY]__]YSMIHJMRX^dhkmkgc]YVUX]ep|tkgjszgYTXevvj^SJD?<;;<>?@A@@@BEKRY`eimpstrnf^VQOPU\eox|rmou}obXSSXbnz|vuv{~wmaTG<3-+*+-/13567787789;;<;:97569ANayȿzvsqmhaYRLHGILRZbjrz~zy}xqibZSLFDEJT`n{xme_]]_acehkotx||yvuuy~}{zxvtrpnmlmmoqtvyz{{xussv}xi\RJD@>=>@BDFHHHGFEEEFGILNPSVY_gpxwlb[TOKGEDEHOYdp{|yvvvwxyyyywurnic^XUSSV[afiifa]ZY[^__]XRMIEBA@ABDGKPU[`eimptw{ļ{wvvvtqkd\TLFB@?@BEIMRVY[\[YVTTW[`dgiikmquz~{tnhdbbekqy}{yvsokgc`_`dinswxyz~}{yxxy{}}xrkfbcfjnnlf]TJB:51.-,-.02479<@CIPXalwĿ}zwronnqtwz{zxtnhc^[ZZ[\]^`behlortvx{}unfbmrx}}oe^VJHJM\dil~yppzvlgjo|xuwwvrpWR^stiZNE?<=@CHLOPQPLD:/$&8L^hi`RC;>Md̾u\[khODJ[n{~wph]UPNOQTW[^acfhnv}tmmt}uaM=43;GWenuupg\QHA<731/.16:AJVdu~z~zwngegmx~snmqx{qf\SLFA=976757;=>=:5/("&2D\qrbTMRbvxsw¾yustw}wj]PGCBFMU_jt~¾{sprys]J?;ALYemnh_RF<4.,)&&&')+,,--/3;FWi}ÿź~zvpnmmqx}pbVNLQ\ix}qdYRNNQTW\_aa`_^_bgmtwxskc[VQNMMNQUZ`gnu|{wronnpsx~{xwx||ma[\co|xndZPF;2,()-3:BIOTXZ[YVRMHDBBDHNSVXXYZ^fsyncZRNLLNQTY\`dhlptwz|~}zvqnkjlnpomhc_]]`cefeb]XRNJIIJOV\dltz}vl^PC931148>FR_n~|rib\XUSRRSTUVWVUTROMJIGEB?<60,*+19AHKKIGEEJPYerý}vqpqsttroje`[YXXZ^chnty}~zuolkloswz}}zupid_\ZXUPIA92-*)*,/37<=AHQ]jvytqnkhe`]XRMIFDDFINTZbhnsvxyz}{tk`VOLNT[ckpsutsrpopqtx~¼zvssuy|zqib\WTPMJGDA>;740.,+-05;AFIKLNSYbksx|~|zxwvvvy|ĺ{upkea][YZ\aflqw{|xutstuvwvurnida__`bba^ZVROMKIGC=70)#$,5?IT^fow¿~{wtsrqrqpmjfa[UOJEB@ACGLS[bhlnonmmosx|~{xusqppqrrrqpnkihfeehlqx}xutuwz}~|yvsstuvwuqiaWNF?93.*&"!#%')+.26;@FMV`kv}{yxwvusrqonnopqtwy|~}wqlheegkpuz|zzz|~~xtrsvz|yvtrpppprstuvvvutsrqqrsuutqlf`ZWTSSSSQOKF@92+$"(.39=CIQYbkrx}ļ}xrnkjlotyzqha\YWWVTPKE=5/+)+/38:;975210//..../25:@HQYbjpvz}~~}}}|ywwxz|}zxvtsrrqqqqomjfcbceinruvwwwwyz{|}~{rkea__```^ZVROORXakt{}{zz{|~}yrkc]XVVWWTOG>5-(%%&(*+---,*(&$###%).4=FPZep|¿}||||{{zyyy{}~~|{yxxy{}~|zywtrokgc^YUQOOPSW[]][WRONPV^hqy~{ywwx{~~|yxy||zxxxyz|}~~}|{{{}zslfbabdfggd`ZTNIDA?>>@BEHKNPQRRSV[bjt|¿|yvtqnjgc_[WUTTW[`fjnonmlmpty}ztmf_XSOLJJJLMNMKGA;6336:?BCB>953259?GOXbjqw|}wqkgdba``^][YXVUTSRSUY_fmqtutrqpqrtvxz{|~zslf`[WUTUWY[]^][ZY[_fpz|ywurplgb]XUTUXZ\[XTNIDBCEINSWYXVRNJGFGKR[eq}}yusrrstvwwwwvvtrpnkgd`]ZXWVUUUUVX[^`aa`_^_acfikkkifc_[WSPONOQUY^bgjmoqty~{yy|}zwqjd^ZXWXYZZYWSNHB=:88;>BEGHHFDBABFNZhx}uolkkkmmmkifb]YURONOQUY_ejnqrssstvy{|}}}}}~~~|zxtqnkheb`][YXWVVUTRNJEA>=>BFJMNNNOQU[bku|yuqlgb\WSPMKJIHGFDA>;99:=CIPTVURNLKLPV]emu}}wsnjgda_]\[[ZYXVTRRTYakw}{wrmifeeeda\WQMJIJLNQSTTTRQONNPT\fsþzrljjmpsspke_[YZ]bglpsuutqmhc^ZURPNMLLKJHHHJNSY]__^\[]`dhloonkhd`]ZYXY[^chov}wpkihhfc_ZVRPONNMMKIGDA>;98779:<>?@?>==?FQasypjedegjllkhe`]ZXWX[^chmquxyxvspmmoruxzzyxwwwyzzzxurolkjjjkjihfeddcb`][XVVX\`dgijmpv|~~vng`\YWUUTRPMJEA=964223568:;<=?BHNV\`a`][[]clwzuqmjhhhhhhggfffghikou}ytpljihhhgeb^[XWWWWVTQONNOQSVXY[]_adhmsz|xsnkhhjnrvwvsniecbdhmquvurmg`YSOLKIKHMVVXYYYZ`ekrwz{{ollnb]bc`\[VVRNLRVY_ksyʼ~wpjedbbb_]\\YXXZan|mdr~Ʒ~{}wrlfb__aehjg_RA- ):JW[TF5'"'5EU^^VI<429GZpƳ̽Ǻpu}iYNIGHKOSVWVTQMKJMS`q}l]SQYhz~k[PMS]kx{rh_XSNLJIHGFDCDJNU`lzymhp~rnnt|{uu{qhdcglquwvsojdYQKD=71+(').6@JNKA3'#*:Oblj_OB=ALYjyɾnaYUTX]dkqvy{||||{|~|~zsszsh]UOJGECA?=;:99864347=EOZhr{~yutuzumikr}tg]WTUY_gouy~~ysle^WRLHB<61+&"!#+6DTdr|{tmf`[YXY]ckt|þtkfehnt{}zxxxz}zvtsuwz|}}|yvsomkhd`[VQMJIHGHHJMNQSVXYYXVSOLJKMR[ft»~yurruz~ysmgb\WSPMMMNQSVY\]]ZWSOKIIKNRVX[]_ciou{}wog^WQMLMPV\ckry~yvsrrstvwxz|}{zz|vj_ULD=83.+(%" !%*/38<@ELU`mz¾~{vqjb[TMIEDDGKPV\cintz{rib[UQNLKLLMNNNMMLLNPSVYZ\^aekqy~~~ztmf_XQJD@<98776666679=BJR\dlsx|~ysld]WRNKKKLNPRUWXZ\_bgmrx}zvrmhb]WRMIECCDGJNRUVVVUTTTSSRRRQQRRTW[^chntzľ}zvqmhd_[XURPNLJHFEDDEHKOQSTTSRRRSUWZ\^```^\ZXWVWX\`ekrw}|wroljhfecb`^]\]_cjqz{vpje`]ZYWVVUSRPNLJIHHHILORV[`ekpv}Ŀ|vqmkjhfd`]YURPONNOPQRSSSRQPONNOQSVX[]^_abegknprrrqpnmlkkjhgd`\XTPLIHGHIKLNNNNMLKLNSX_fmtz}zwsojd_XSMGB>952/-+)(('''(*-28?FLSX]bglrx~}wqmifca^\ZXURNKHFEEGIMQUZ]`cegkot{~yupkfc`___``_]ZXVTTUWZ^bgkpuz¼|xtpljhgggggfedba`_^]\ZYXVUTRPNLIGEDBAA@?>====>?ACDEEEEFHJMOSVY[^`acdfhkotz~}}}~{wsoid^YUQONMMLKIGDB@>===?ADHLQV\bgmsz|wsoljgea^ZWTQPOOPQSTUVWXXWWVVUUVWY[]_`aabcegjnqsuwxyzz{{||{{zxwvuttstuvwyzz{zzzz{}}yvsplhd_[WSOLHEA>:62.+(&%#""!!!""$%')-16;BJQYahov}~{ywusrpnljihggghjlosvz}~{xurolifc`^]\\\[ZYWVUUWZ^ciouz}|zywvuuuvwwwutqoljhfdca_][YVTQOLIGDB@?=<<<<<==>@BDGILNQSW[_dhmrw|{xvsqponnnnopsvz{uoic]XSOKFB=96310/...-,,+,,.149?FMU]elsy}zwtrpnljhgedddegikmopqrsssrrrrrrssstttttsssstuvwxxyyyyyxwwvvuuttttttuuvwxz|~~~}}||||}}zvspmjgd`[WRNIEB?<96420.,++**++,./0257;?DKR[dmv}zxvtrponmllmnoprtwy{~}zxtqnligeca_^\ZXVTSRRRRRRSUWZ^chnsx|~~}}}}|{zwuromkihfedb`^\ZWUSQONMMMMNOPQRSUWY\^adfhkmqtx}}{yvtrpnmlkkklmoou~{xwwxz|~|xtpkgda```aa`]YWUUTQKD=879=CIOUY]__^[XURRTX_it~}|{zz~|xuux|wqnpt{vnkmni_UNLOU\elqrpjbXOHEEHPYcmv|}zvtwth`]^ckt~~wqmkklnquy|xleeihb]\`ejllid]WPKHFGILPSUWXXXYYYZ\`eilpy|vroptzsjly}ysnhc_[XWVVWXYYWTPJE?;88;AIQVWXaouojjmopqsw}}}zpifhox|tonqx}xusstvxz{zxsme]UOKIILQW^dfc[Zch_WVX\ahpx~}{tnjjjloqsuwwrp{}~~}{zyyz||wrnkihgdb_ZVRPPRWZYROU^ux~h\[[_dhdovu{~Ƚ}sf_]i|zutw|}shadn}qcfynQEQeol_SQV`iosrs~oZPHKXmuqty{wj`Z\hzl`_iy|qoyÿwwz}_Tczj]UOKMPRQQPOKD>=ESgu{k^YY[]ZVSWdu|hTJLWcnx~{pe\YZ_kpdbnqp|ol{yia^`flqtvyyl`WUXZWWfs`NA::@GOSTSSW]afhkh\QIFFIOWan||eQXu~qjn|Ƽ}xzvsojghlrxxiVB1.8Oi~zvmV9.=Wjy|x~}n^VSRQQUcsyrkhhjlmrv}yĿ~xu{}zwuuyvu}hQJ`~rbULKNRUUVUU\eihkyymiovmba^YY]````elu{}{vf\drttz}xvukls}~nsvw~wlc]YVQI>@MLLWZ]s}}~z|z||qdct~{yvxusiabhnqqppu{|{n^PHEFHIIF@76BKDFVTT]^VKQZSPXbjpxsmxna_aflruwyzret}ysjaULMOKJKOSVUh}z}|ogghgeb^ZUTWXQYjfhklonebiv}upr~ttlveNV_Y[``affceiostsqprvqky{x}uicrukihc`_bfgd\QJah]cku|~{ttwuqu~{unihjldlxlfk}zhflsx{|{xvvy~}or~uv|xigrmhkkgdiprsvnr{~~~zx||unhefhie]YSTa]\`^iwqjkjhgffedb``bfi`W`YT]cdb_\WLGWaTJHMWcoy{yxyvvxyzwnagbQNMMR[_ZSMIWf_XWVW\epqkttjorspmjijklmmmopjiuywxsz{~~{xwxz}|}~}{yxz|wldadlt{zq{w|zvuzw~{yvuuvx|z||~{zyxurokhfgjnlbgi^ahlj`X`e]^cda[UPORXXRKX^ROOPSX[[XWVTOVc\PMOU^b_jmbdggfc`agljea^_fq{~{z}}zy|}qs~{uwz|yvqjjmmnnnmkjhgecbcfjjmwwz}z}xuuy~~vomsxyzwsyry~ywwyzxtnhddhmldkmbcffcbb`]dia^`bcegijkhdq{rqrrsuvvwx{|}||xsrnmpsrj_clgbdda\WVWVPWa[[^\VNIHKRY]\WOHL]bZVVS]lfdefghhfdccdffd`\Z]enpem|u|~{z|~{{{wy~v}}~~|}|wuuvrq~{}tuxyzyvuxywtrpmgesvmkkkkjhfda\W_ga[[\]^_[T]b[]`cc_XSSVZ]_^]^`_csymeq{uv|y~y{|pozsgfgknokc\WVX\__]YSNUd`W``]chjifdbccddeedbdgijjfixvho{z{~yustuvwwwxz{vpy}w|vt}|z{x}{z{}{|xyzyxxyzyqipqjmqrokgdbbdhibWVcfbdgd_hj^YZ]afgd]VQNNQTVVWX[[UVgj]^eiijmoppomiggjpw|{t||vojimswz|yldw~meflrx|{vpkgffffffgjlgbmqnsvrqz{tt|~vrquz{u}sorxtkp}{tqpqtz}tw{sqrrrqppppomjijkiiuyqnz}vuvz~~{xvwyyy{~|xwz}~yrlgeeghhcZ\ii]]lmghhea][^dgf`XPLMSZaed^\c]\eb_chkkjihgfdcaacglmhfrrknuzyss~~zvvy|{vx~|wxsu{|zux~{wvx{yv~{{xtqsx~xnmy~xwxxus|urqrttsokgeddccdefc_cimlfhmnlhfegjllid_\]afknmlxujl}wuyrptnquwxvrlfddefe`ZURUZ[Zenhb^]gle`adhkljhgghjkjfbmulffinu{{sjmwvsvz{yxy{yu}~yvvzztx|~}~}xv}{xx{~|ro{|rny}}ztpoqsspkfdegjmni`dophbdkqroib^^`cfea\ZZ[WS_jggkjc`jrmhiiiikotxzywqmy|~|yxxy|}{uldlxtoprsomtyoc`bfjmonmmlgagqnjnqqmjjntxwnkrvst{{sw|vw{yrmnrw|}|yuqxzu|zw|~{yxvtqooqtvxwtqx}sz}|~~vv|}}~xqooqrqomklkfeqtjekuqhgkpqpke_]_dimlf\U]b\Z^ekonf`dkf`_adhloqqkekpkkostrqpqsuwwsln}{z~x|{}}rpt{|z~sprw|{tomotwuor|~zyvx~|}}}~~xqmmry~pksqu{~wronoppooqpkfnuqpqmkrvroruupjffjpuyysntyqiipy{ru~}||zvwsuusvvmkmoonlihilmhfmoe_`behknqpkccjjdcgmqromv|rigiouzzxrmjkotwvrnv}tzytsw~~~}|vux~~xu~{}{{}{xvvy}~xwyxz~ztpqsvxvpltzqiimtxvqrupiimppnlklmkipxrkigeegkquwumd`kwxvwwus~~~yvx{~}wqtuolkloqqponnmjfjttnkjhly~zyywspprvyywrnlnsy~}umt{x{}}~}yvvy{z~~y|}~}xx{yzz{{y{xvx}|vswwv|~{xx|~zxwrow{vvusrsvxvqqurkintxwskgoxtnnoppoljhhjmpqoifoyvlfnwww{~}zwuuvxxvtstx|~y~}~xx~z~zwvwyzyxwwxww}|qt|yuv{{tporuxyxvvwxwuz~|~{{}|tq{{uux}~wrw~{xyzywuvx{|wolrxxy}}vsz|vvzysoptz}wv|~|~||~~~zyxz~|xutropy}xtuvrou{vrsuvvusqoligghmrvvrkkqy{rkkowxqmmosvxxxxwtr{wx|{~z|ut~{|y{|toorw|{ss{z|~{vtv{{v}~ww~z{{}~usw~}vqsx~yspqtvspu|}xspt~}vstuvwyzzwrkfdgnv}~uil}squ||zz{}|~{yxww|ut}usty~~xqkiikmpsvywpioy~{uqqruz~voklqw|~{trz|wwyz}{|~zx{~{}{z~~zy{~|y~z}~~~zrmlpwyy~}}||}}}}zxzyv}}|~~}}{yyz}~ytoorwzywyyvz~ytsux{}~|yurqomlklptwtsxzqnw~{trty~zvtvy}~}xv~|y}~y~||}~|x{}~ztonptxzyuwxlmy~{xvvx{~}zwvwvst}zy{}}|xw{~||z{~~zy}xv~||}{urrv{~tnz{vx}{yz{|{xussuvu|wsx~}~|vz}{~~|y}ywzwvwxyyyy{|zrlw{vwyzz{{|{yvsqqrttrojkwxplny~upoqw}~{wrov|z{{|~|{~}}~{yy|wvz{|yxz}}zxupms~zuwzvtuy{rs~yx{xsx}~~z{}{ustwz{{{{{yutz{y||yy{~}yussv{~~zrjiv{z{|{{zrquz{v}~{x||~yuux|~wv~|sv~}wtstwz|}|ztlgnxywy||ytrx|qkkpxztx|usv||zxuv~||yy{{}y|{xxz~zwzv}{vuw|umqzzuuz{y~{vuw{}{z|zut}~{vtw}vvzz~zsprw~~vrzxpoy{xutuvxz|~~{tnqwuprw{~}zvx~vnmrz}wsu{}{|~}}}{vw|}v}{||}~{x|xx~zvtuzysw|wnlpxxonw~|wuvy|~}|zuuvy|~zwwwx{~x}}{wvwzyz||{vux}zv|}yxxzzwwy{}}~|y|}tprv{wsw|{yz}}|xvx~~{z{~ytuz}||}}yv{}z{{xvz}wtrsw{zuyuljmu}|tmkt|wvvuu|~zxwx{|wuw|~~}}~}xz{y|zwy|~}z{xsqruz}skmy|vru|z{}}zxxy{~}xx|xwy}zv~~~~|yvu}~zz|}~|{~}uruz~xu}}tpqty~|zvsszzsqx}}~zxx|yu~}z~ztv{wy}~ww|~{yz|~~}yuv}xusqrv{zuomr~{pmw~~zvuvx{}~ws|~~yzyy}yz~yuy}}~{|~|yy~zux}zyz{|{zyxy{}}zvxws{}zwvwzzw}}}yuv|z}ywyysx|xx{yrov|}~|wtx}}|zxwvwyyyxxyzzy{zx}zwy{vtuy}{|{twzxz|y}|}~{sqw|vu}|yz~ztporw}}xtuz}|wvy~ztqrv|zxzz}z{}y~vloogacfl}ud^bm}jZ\nq[]m|zqb[`q~pd^dt|h`eovyqmqk\_smVZttim}|dXWZajsyzvnd[WW\bhlsytnoopv}qjiov}ztmfa`dfaZW[aioru}rhgr}h]cvwdbjmnt~t`TYkwwxwg]]es|wwod]Z]hxyk__ccdmiX[qndbhr}oeaeoz~xqmhb`hy~k^[`qthbeqse__bglong^Y[bdbbceffl{~oc\\blu}|uollmpole\UQRYbjpqoow|qifiste]`inoszzyzqaUSXessia_hswspqsu{|vtrrkb^akz{mc^_epz~{xy{~}ui^[^dkt|~tr|}wpic`bhs|~uh`_adhmswywrlhddhkljechok_X_o{{oilqphbabegggjqtof_afknmha_frvqmmutkkpqleacqypiebbbcdhlqu{|tppppkc`eox}{qidabejllic]XX`muqdZ\itvuw}xt}vlhhilnoomjfccdfhigden~~}zvph`Z\iuyyz{xvtqnifddeecaclwyqnu~uu|zpfcfknomlnrz|wzyoheflu~zpjo{}z||ywuttttsstwyz{~}xuttsqnje``fjlpuutv{xpq||vrnlmrxti^XY^emswvqjhowwssuy}|spv{tkiovtkedgjmmkhgjpyzutw}~|xzwppw|zskd_`ipokjloqstsqnkikpw}wlgo|wiaagpx{zsja\Z\`eilljffnwvlgjtzyxxywtokjmsxzvmaY\ehdbdjpttqpv|~|{~~|xwwxzzyulc_bgfbbekorqnjjnplfdgmsusontyth_]`fmpplgcbbbabhqtmd`gqsnjilpsvwunf^YZ_hqvul_W]mwsg``gqz}|}wpmnrvy{xpfaemrqkd`aelruupkebcfjmkfadmtqjd``dnwxpf`_aehlopplggloia]^cjquvri`\ahlkjigdbgs|zphegmty|{yxy}|rouwpjegp{}wnhecegkmliebbejmlheeiospibadiptusnid`__adhklihlokccjnligikllkiiikllje`_hsvqlknsvwz{x{||~|vngektwsmjjklljkornfabflpplgelvwoe^]`fmqrplhc_`fqwti_[bmtspnmkjjjjigdbbekqtrj`^k{wlikry}}}~yvwy|}vlfkx{qjhilprtsplighijjhc_akwyqf]]er{ypf_^agntwvqia]bknlhfgimpqoiefikjknqqmgfny}yrnmosvxyyz|~ytw}zvpmqz~{uqnlkjkkllkjjkkkjknnkjmmiddiqw{ysjc^^afkoqqmhdeilmnomjiloqpnjhhjostqja]cpyzvroopv}tqsy}{|zpgfmvywtrpmjjpwysh`]bjsxyslhlpnfa`ekruurmga^ajtxvohccjrtqmlmoppolhdbbfmtxvofbhv|qhfkuytruzysqu{ymfkzsiefkry}}ypha`chorpkfhpwti`^fs{zuoiedeinsvwtmebekligjnqsrokjmomheglqtrpqw~{rifipy~{yyz{}yuz{ywvtsv~ulfeglqtusojgfghkqvtlgkqsmgfipw||wof`^_elrwwrjddkswtngeglrwywrmihimppmihny}zsmkmuzuuy~~}{xtoklt|}wqmkiiox~{qhccgmswvrmlqvtj`]`isz}zrh`^eqyysleacmz{slighkoqqnjhhkptsokjow}|unlnu}{xwx|~|ywx{|tkir~}rkijnswz{ysmgdehloomknvztg`doxzvqlhginswywsme`bktvqmkloponptuqjfhntwvqmoyxniiow~|xvy|{}{{~~|{||zvqqw}tlhfhlqvxvrlgdfnx~xkcentrooruxyvpidbdhmrvxvof`dr||skghlquwwtqmlmoqqnjfgrtjho}{sqs{{}}~}wohho|ypifju{oeabhr{xmegnrnifhnu{|xpf`cmuxwtplgflw}{upmlllmnonmmnprqpqssstwwrmms}}uppt{}}{wwz}vqrw}}tlims{zqhcaemtyyunlputmimsvwwwtpljkouz|{vmd`epxxvsrpnmqx~|rhbdlv~~wrtyztlils||uqqy|z~{|~xvw{}z|ypjilrx}~yrkedkxzngjtzysoqu{~yphcchpy|sgbjzujehow~umgfjqwywros|~sijs}xttw}{z|{x||x|y}{yyz||{wst|}rkip{xqkikpxzqmottnijpywmhksxyvtsrqps{}rkhjouz||xtpnopsx~~xrsz}ytqt{xqnpv{z~~~}~~{~|{~}{|~|zz{{{~}wrprw}~ulfeiqz{uqruvvwwvtuwyyxwwwxyyxvrmjlu~~wronou{qkjnu||wv{wniltzqou{vx~~}}}x{|wwz~|yz{pjjnu~{phfn|~rihq~}xvvxyywspopty}~woimy~tnmpv|ysnmotxyxvv||qmszwwzxtyyy~}{zy~}vwyy}}|||{zxutx~rknx}wqnos{vlioy}{vsuy~~xsruyyyyz{yurrz{snmoty~|vqopwyppw~~|{}{ursx~{uw~}{{~wyyx{{{}{}{|}{{~|xy||ywx|~xqlknu}yqnry}xuvz}}zwvx{~~ztmimx|snmtvmjlt~vru{}yusw}|tpu|xy|{~xvy}usz}{|yrrv}}xy}~zursw|ypjlvwpnt~~zy{}~|xtqpty}vqqw{snpv~|slknv}yvy~zuv|~zxy}vrv~xx}}wx~}xw||x}}zy|~vw~usy{usuy~zy|~uqu}}xtrsx~slnv|}zyz}|zz|}zvtuy}~|{~uomqw~yrmmtwps||y{|tppv~tqzzuw~}xx|}uv}yy|yz~usw~}zxxy~|vw}{xy}wojkr|slo{wppu}}yvvxz{zwtu{{qmpyzsopt|{vv{}ztrv}{ttz~|z}{vvz}}~{|xssxzy~{{zy~|vuzxstx{{|upqw~xpnt}}vqqyyrquz~|yxy{}}{zyz|~ytsv|ypklqzzwy|~~~~}|}{vtx}yy||vv|urv{ss{xtx}|~}z{yuw}zusuy~~}ywz~}}|{{{}|tnnv~ywxz|~{vtvz~z{vnlowwnkq~{pls||~|xwx{ysuyvx~~yxz~{uy{y{wru~{|}zrqv~{usv}rpv}zvssv|vmmz{rqu||zyzz{zxvuyvnoy|uqrv~|rnr|}yzzx{}zz}vtw|{xy~zx}zutw}|ts||yz|wuz|rpxupqwurv}~zxy}{utx}~xst|yutw{}~}||}|{{|{z|~}yx{yrnnt|{srx|y{}}yrpwytu~|spt}|y}~yx|~urwyux~}~}wuzxqorx{xy}~}~}zy{vmks}xuw|xpos{z{}vrrw~~tmmw|spu}~zvuw}xuy|uty}uqry~{y}}zy|xpqz~wsv~}tqt||tpqzzrry~~~xsqrx~rmsumnvwrquz}z{|sqw}xttw~}sns{~}~~|z{zsrv}wst{{ux~~vqqw~spxystz{vvz||{qqyyssv}ztuz~}{y|{y{}~||}~~|z{|rnqx|ywvx|xw}}yz~zqlms~xop{}usw~~||}{xxxqs|xssx{{yvxwtx~zxz|utw}~|{|~}xw}~uoos{~vtx}xvy~}|}}xtszyrqvwqqv}{|}vqrwzqouwqr{}vux}||}}|}|wvz|spqx}|xsszzww|wsu|xpou~snq|ypow{xx{~~{yz~}wtyzsqu~{ursw|}}yy}~|{{~yqot~{z{}{xx|~~tpqx~tos~vpt~{xy|zss}ytuz}xvx|~~ysu~}xuw|}sor{}|}~~{yz~{z~voot|ysrw|sqw~zvtuzunq~}tsw~||}~~}{yy~wqt~~wtu{|srx}~{{}{x|ytsw~|xwz~xx~~|uqrw}tou}wux~}|}{uru~snr~xpot|xsu{}zz}~xux}zuu{~wvw{~~~}{|}vqqw~wuz||~ysqvxst|~tpr{|x{}ywz}tpt}~vrt}{yz|}~~}}}~|{}}vsv~yroqw|xy|~~{z|xpntzvw|}uru{~~{vuyxqpxwru~}ywy}yuxwsu|vqqv~}}}yz}xwx}yqnt~~|z{~zttxxqpu~xqpuwru}}xtsw}{qpyvpqyxtux~~|}vu{~yuv{}trw~}|}zsqu}|urt|zuy|~|tppv{qnwxqqwzvuy}}zzzqovysqt{{uuz~}{|}z{}~|y{wqqv~|yxy}}z}|z}vpns}~sqx{uv{~}~|xw||spu|tqt{|z|{wvzzsszzuuzxrsw}~{z{|~~xuw}zrnpv{vv{}yx{~|wsu~yrrxxssx}xstz{rqwxrs|xvy}}}}{{|vtx{soqx}|~~}~wqqxyuuywrty~ypns}unoy{qnt}zz{~~{z{xtw~uqt|~xttx}zy||{{~|sot~}{|}~zy|~~vopvuoq{xpq{}yvvzyqpyyrrw|wuw{~||yrs{}wstz}snq{~}~}{|~zzwpou}ytsx}tszzvtv}snt}tsx~}}~|yxztpu{tqu}xqsz}||yz}zww~|tqsy~yvw|zwz}}wqpszwpq{zuv{}~}wss{xoox~snqx}uuz{z}zuv|{utzyvw{~|yz~~upot}~vtx{{~~}xqouvprz|rmqzzx{|vux|ros}|tpt~~zyz|~~}~~|{}|urwxqnqy|y{~}{|unoxxvx~{sqv~~~xstz}snq|{rpx~~~zwwy{utzyqpvyqory~|~~yx|}yvw{{qmq{|z{}|usw~{ros{zros}yrs{yusv}|rowxoowyttw}}~usy~xtty}spt}}{|~zrorz}uprz{tv}|}}toot~|pmuzqpu~{vvy}~zz}rnt{sqsz}vuy~~||~{z}|yz{ros{}yxx|~z||z{xpmqzupt~vtw~~}}|xvxvopyvppvyy}~yuv}vrt|~wsu}~ursy~{{|}}wuxxpnqyzuw}}yy}{usvxrrywrsx~~wrtzyqpwvpr|xvx}}}|yz~{tsw~zroqx|{}~~}|}wqpvzuuxztsx~|snqzxonuunq||z|~|{{ztt|yrqwzutv{|xy~|yy{vopx{{|~|yz}~}{qnqyzqnttot~{wuw|vor}wqrx{wwy}}|~xqs|}vrtz}sos|~~~}~}z{xpou}zuty~vuzyusv}snsvsv}}}~|ywyuos}|tprzyrry~|~}xx{zvv}vqsxzwx|}z|~||yrpryyrqy}wwz~~xss{{qovvppvxvy{z|{uuz{tsxzvvz~|xx|vpot}~wtx||~}}wqovwqrz}soqz|z}{wvy{rot~|squ~{z{}~}~zz}{trwwqpt|{z|~{z|{qns~{vvzxsty{usv}wpovvps|~|ywx}wsvvprz~upqw}}{xzzvvyuopy}{z}yvx}~upry|tps||tsyzutw~}rowzqouzuux}~}}vtx}wstz{sqv~~~~}~~}}zros{{tqt}zvx~|}|tpqxypoyzrqw{wx{|z}zqpwyrqu}zuv{~}~|z{~}yx{wpqv{xxz|{~}zz~{snowxqr{yuv{}}}yvw~ypovyqpt}{y|{ww{xst{xsszxrsx~|{|~~xuw~yqnqxzuv|~zy|{urvyrqwyrrw~}~xstyzqpvwppyyvw{~}|yy}|uru}|soqw}{}}|}yrot|vtw~}utw~vopw{qns~xoox}z{}}{{~}usx}tps|}wtuy~zx{~zwx|{rns}}zz|~{z{}}wons}vopx|rpwzvux~~snsvpryzwx{~}|wqt}}urtz{rot}~~~{y{woot~ytty~vuzytru|snr~wtwldo|{vrhYQT]eowzrgfltveYZ`n|i^VTU]diifdabk|ta_qkjrUQdzmkpxzwojkq}wkb]`nx]OUmuaWZfvxdX]unbnjcmwkdaadgigb^]_fmppmihmyq_W\k}vjb`fqwmlrwvoeYST]iruqjgkx|f]dxqgl}}pkmqssqpu~vmfcdgmtzs^TVe{wtrpmhdbglqx{~|tlebdjt|}pilxxh]]hy}o\RTcvpbZY`m{wmcaiywoklrzvdWTZdklida^^_chmonmowtbURZizyjcejmlhddfhkliecfn|yla^gzqaZ[`hnsw}{spquyysi^X\iyzsmhdbcegilr||x|rf`_elqqoov{tmfbaguyqrysaUU_mx~}yvxxvxzulc_dryronnlgbadhjiffiov{{tj^VTXbmuwqidfsxrolid^ZZ`jsuodZV[frxvm`VSWbnzwj_XZetxnc\\bktyytmjksxlcciqurleelz{rmlmke^YY`iqvsj_XXanz}vnlrzslgfjosrkbZX]fpwyume__frzsmgbadkt|{y}~|th]WZcox|yqifkx{nedjswtldbivytrrqlfbchlopmidbbfnw~}uoms|zyywsnlntxwod[X]fqz|yqhbdn~~ztmf`_ckvyw~~}}sg^^fpwyuojhlvtuqzxnltnYNPXdp~tcSFAFQcv}}zvjhseav~[IWz]GDTpylhlwpd][]frylbaiz|idjz{skc^]eszoutlx}vpkhhhfaXNFFQaq|ncgvlYPQW_hs}vg^\`eiid^[[crwjkxs]SYkq_SQW`jopnmov}||yskfeir|{uokgfhqxqry|tont{wnhe`YOHHQbx~mcep~}{|xsrxwi_YVTW]epy{rorw~uf[X_n~zwwwvph]QMQ]kwzuleemy{snllmlieenwlffjoqokfeglrrqu~ob\^hzuomps{|z{zsh]XZco{ulihd_YVW[aeggedhp{~spwpd`fr{nbYV\grxyy||wxwrmiecbbcejsrcWRUar}oijpuyxsmhfeffd_ZX[agf_VQUbt}ywsmf`^_aa^YUSUZ`dgfb^[]dpz~zrkkszqh_ZZ]aceiq}~xqjecccdb``dn|}vtvyyti]TSZgv~}wqkhfeda_]\^aeea^^eqxpifeffecaadgiifa\]er{y~|pgbaa`\XY_kz{~|xrlgffhhgc`agq|}{~|zwsoje`]^dlvtjeeilmiebcgkjd^[_k{{rmkkjheb`afkoojc^`iwxst|}tmiggd`]`gqz~}~}{vpiedehihhjpz}ww}|ywuqkc^\`hs~}~hURNPPRN[msx|x~rltxeWRU_lz~qf[PGHN^p|}{zuvyop}vTK^{pSI]j_brt]NJNZiwyqhcft}jcj|~ria[Z`pockn`XWXTOJHIKLJIKS_n{zmktlYPQYeq{wi]WZcmqlcYW^o{jadqzePHSlm`_ivzqmhc^YWZalwyqic__gvwnot|}wsu{~slea\VPLMSatymm{tqsutrru~~{|~~}vsxuf[VTSUZalwwmhjpw~rbUQUctvjbckv{qgaafnw}}|}tkfeecbdl{{mccipsqkecdgjmnrynccqyl_VRV`mwz|{z}zz|rjfgozsib^\\[YWWZ`gnqtv|wtwwkccl{yuph_XW^iw~~{uleachjidchv|vqkfgn|o`TOPW_dc]WUW]a`^]`fnstpicafr{qnorrmf^WSTVYZXVX^hprmcZX`n|wrt||uple^YY^gouy{~xsqpomid``befefkt~vpljjjhedfozjaaeknmf]WVY\\YWY`ku|}yspt~zz{|zvoiecbba`__aflomhcbhswrpolhc^]_dkqv{xnjkorrmgcbehifbags~~~{upljjlmlhfgo|xlgglpqmga^^`aaacglqtuvuvz}{|yofa`dikjgfhnstogbclz{sty{yrjc`bfknqsw}|smlnppmjggilkhefmw~|ysnjhikllmqzx`PE>AJLUZ]^r~sr{nYLJTdv}toj_QHDL]nz~uty}zuumTRhnTOf~nozxw}yiVHFRg|znfekvyqsscWWh}q{bQWozbPJILLLKLPVZZWTT[gvzuyxbSLQ]m}{sje_]agmomga_dotjdcju~ufZWbvpfgsvh```cda__eq|rkggilqxxkgnxzusv{~yqkbZVQPRYfxur{tb[^ht{~}{|uv}w`QLPYcjmot|te`cks|{pcYUZh{ujdelv|}xmaYV[epzypjeccdhmu~qgbchmpnh`[\blwrgfoyvtph[PKP]lx|pfdly{j_[Z\\[YY\cjnnnnt~~z{vh_^gu}umfb``cit|{~}wnfcbdfgghktznedk{yhXLIMTZ]]\^adffeefhikmnnlkkq{ukhhkkg`XSTX[\[[]ckqsoh`\]eq}xsuwqoppmhcacjs~vqpolgb_`cgjjhhjr}|wqnlmlkjlsqbZZ`fif_XUW\bgijjknrwyyxv{xrsx|}yphbacca][]cluywqjglw~smlmmliecdgmrvz~{|tjdcegheb_^`cfilnrxxojknqqmhefinpnlmsxnms|{rkhimqsttuy~yz~~yustutrsuy}{qllostqkd`afmsuuvzxuxulioy{m_WX_glkgb_`cfhhggjpy|tpt{qnr{{pf_\^addcbdhnrrqqu~yz}|~~{wz{okmsy{xrkfdehklkkms{xnhjs~thbagqy}xmaWTX_fhfdbceghhhhknruwwtplms}wjbagovyvnd\WX]dikgcadkqvx{~smmqvzzwqlhgiloqqonoqqokhiov|~ype\Y]eovvodYSU^gmlga]]afkllkknruuqjdbgq|tf\[cnxzsgZRQXblpoidbflruuvytmovzneaemuyxtolnpplfbbhqy|xnbYW^jtxsh[RRZenqmga_`cfhhggjnrtsnhdelu{zrf]Z`jtzyqeZSSYbjonkggjnsuwz~}~xonu~|qiegmtwwtpprtsnhegmsxwria\\bktxul`VRWajoojebacgknonliikmonlkntyzuj`Z\dox{vmaXV[epvuneadlu{}}}|}||smpwypihls{~|uolmqrqnlnsx{yrh_[]eqy|vk^VXboxwod\[`iqvwsokklopnkhjpy~}uh_]dp{zocZW]gryzumgfjpvxyz}}|qmr}}qhejs|{tporsrnjinu|~{rg``gqy|wmbZZboy}yoe``dkqttrpopqrrpooquz{wogcdlv~|rf]Z^gqy{wqkimsz|z~}~|{{vopwtkgipx~|wsrsttrqqtvxwtokhimtz}zqf^[`kv|{tlecfmuz{xrmkmruwussv{~{tjbagr|wk`\alxymeelw|yz{}y}yolpzxnhiq|umjntyzxvuvxywrlgfjqzwka]co|tibbir{~ztpopsutrprv}~vkefny|qf`ahs~zpihmw~}zy|{|x}wnnu{ohhoz~tnmqvxwusux|}yslikqx}~yqhcdlwukeejry}}zvrqrtwyywvwxywrnlov~{qgabit~{rkjq{}{}~yy}wz{}~z}{wzysrwwmhjr||toptx{{ywvwwwvspoqv|ypfbeo{}rieiq|~umjmt{|xwxzzvpkkpyymecit|pihp{|}{|zw{{{~~vv}|tprz|qijr~{pkmt||ywxzzxsomou||sieitymeelwwolnsy}}{xxz||xrnou|~vmhhnwtkimw}|~zuw{y~~z{}uvzw||trwvmkox{qmou{~~{yyz{zxuttvy||zvqmmr{yngflvxpmou|yuuwyyvttx~wnggmwtjho|xsu{}}ytw{vx~}zw{zwz}xwzyojlt~smnu~ytrtx{|{zyy{}|ysmknw~riflxtljnwzwvyzyurrv}zpjjq{zoijsyttyzwy~vuz~|uu}}vw~{{xsu|~rklu|pjlv|vstwz{zxwy|}wqnpw}sjhmw|rlkqy~zxxzzyxwy|~~yustypilplknmgjs|zutss~wuvwxrprxwpnjd^`flprribj|sXVnthv~lkytmmquwtokjro\TWdt}ma^dq{hYTXfzy~oa\`ntcctl_dw|sqstof[VV]gpsojd``enxxdVYixgbgt|smjjjgecceinsvz}r`]msjpvhadlx}vtw{|wl^STavshbbdis|ug`_eklhb[[gwynhiouwri`]cqwicgsxojijmr|xqjeadm~~nfgmu{}{z~womqvy{|sd_gyxsnic^[]cjnmf\SQWbp{~ywzre^]_cgnvxl_WUZdmrpg^VSXdt|mb^bkx|rg[RR[l~|~zrkffimpqs{uqtz~zpd\\es}tg^Z_l}sd\]gxzwxtf]Z]cimpprwyy}{}{{yskc`clvyfXTZfrvrg\X\fs}}tia^`eijihhlsz~~~teZW\fnrrnjgghjllljhffghiikq|rcZYap|n_WX^gnpnkikpxwlhhiifccfmu|wrrw}znaWTYcmstpia]_emtxwuux~zldfoy~{qf_^cjqttqnnquyzz{~veZX^iu|}yutw~{ttz{l_WW\djlkhfeglqvz|~}vu{yk_\`glmjfdflu~wkgku}qhfjtvtzvposy~|la]`hqvupjfglsx{||}~~}xnggnywj^WX_iprme^[^emsttstx{}ztons}vkfiq|teYUYcmrqlfehnu{zzywz~~qeafpy|wk`Y[cmtvtpnoqssqnlmrx~zqf`ajv}{qdYUYcmttog`\]agkllklostqkgglt{|yqha_clu{yqdYTW`jqsplijntzriglu~|rf][_fmonkiikllkihilorsqkd__foxzuj^VV\fosrld^[^dkoplheehjihfgkpttpg^YY_isxul_VU]iuzwpifjrz|phhnw|rg^]bjqspjebcfijjihjmpqng_[\doxzth\VXbnwxqg\WYajrtpjeceghfcachotsnd\X[dovwqf\W[fs|~zrlknt{|pijr||oc]_fpvvrkfdegihgefimqqng`]`hrwvnbZW]gszzsi_Z[aiorplhfghihfegjnpoke_]`gqxzula[\eq{~wqnou}zpkls|tia`entwtokhhikmmmlllmmljgeflsyysh^Z]fqy|wne^]cltxvohddhlnmkjlpsspib^`gqz~zpe^`jwuljnxzoijr|viabit|}wnfcekqturomnopolgegmv}|ui`\bmy~uj`]ajt{|wpighlnnlklptwvpidchpx|zsjbaht}sllqz}~~}tmlr|wkcbju~ulffiosutrpprsspljkov{{vmdadmx}sh`_enw}|vojilorsrqpqqrqnljlqw|}ypgbdmzzqlnv~{|{~|~}~vrrv~{ofchr|zqjhjpvzzwrnmorsrpoqv{~zrhbbiuxlcafr}wleeksy{xtrqstspljkow~}tjdfp}vlinx~z{~|{~|z|~wqpu~}pgelxwlefmu}}xspprssroorx~{rhdhr}|pfbeo{vlfgmtyzwustuvtrpoquy||wqjhlvvmimv}yy~|z~~y|zyzxxstyzohip|zohglt{~~zurqrtvvvuvwzzwrmknv~ticdlw{pihmu}}xrppsvwvttvy}~{tlgir~ynilwvrt}|y}{v{z{{wz|xwzukgkuukgjs}~unkmsz}}zwwy{zvojjpz{pfdjv}qgfkv|vrrtvvussty}~yqklr}yoilv{srw|}wu{}}wywu{yx~~yuuy}qjjrxlehq}}tmlpuz|zxwy|~{vomow~ulgir}|qhgmv|wtsuwyyyxxxyzywsqsxyoilu{srx}}}xy~uu~|wy{wzzuvzx}~zyz}yqmowynghpzvpnpv||xvwyywtrsyxnggnzsigmy|smnry~~{yxz{{xtppu}qjlvwppx~}~z{{uv~ww}}z|}usxzwz}|~~}~{smls~~qihp{tlkpx~yxy{{xspqvzpijr~{oghq}}toosx|~|{yz|}|yustyyqmpzyqpv~}~{tt|xw|}|{wy|tt|{tu|||~}{{}{soqxxnjmv~uonrx~}{zz{zxvux||uporzzpjls}}vrruz}ywwyzzyxy}yqnr{xrs{|xz~|~yvyxvz}~{{}xw|yux~}~~|xuuxunlqy{tpqw~{vuvy||{{|~ztppu}vomr{~vppt{{yyz{zywwz|urt{wsu|zz}|y||wx~~}zwz|wx}|zz}}zvtw|xqos{xqory|xvwy{{zz{~{vstx~}vqqu}ytrty}}{zzz{{||}~{wvy~yuuz{z}|yz|xy}z{~{y|ywz}{|}}zyy|{vstyxsrty}ywxz|}}}}}}}|zxxy||vrrv}ytsv|zwvx{~~~~~{xvy}yvw}|yz~}{~zy}~{{~||{xz~{{}~|||}}}}~|xttx~zusu{{wvw{~~}}~~}{ywx{}xttx}wttx~{xwx{}~~~~~|yy{}yxz~~zz}|z{|{~}|}}zz|yz~}}}}}||}~zwvy~zvuw{~zxxz|~~~~~~~}|{z{|}zwwz~{wuw{~{yxz|~}}}}|{|~|yx{|z{~}~~~{{~|{}}~~{{~{z|~~}}}}~~~|zyz|zwvx{~zxy{~~|{{||}}}~}zxxz~{wvy}|yxy|~~~~}{{|~|zz}}zz}~~~}|}|{}~{{}|{|~}{|}~}zyy{{xwy}|xwy}~}|||||||~}{yy|~zwxz~}zyy{}~~~}|}~~|{||{|~~~||~}|}}~~~|{}~{{|~||}}~~~}{z{}}zyy{}zyy|~~}}|}}~~~}{{{}{yxz}~{zz|~}||}~~}{|~|{}~}~~|}~||~~~~}}~|{|~~}|}~~~}}||}}{yy{~}zyz}~|{|}~~}{{{}~{yy|{yy{~~}}}}~~~~}|~}|}~}~~~~|}~~~~}|}}||~}|{}~~~}|||}}zz{~}{z{}}|||}~~}|||~~{z{}}{z{|~}}}~~~~~~||~~}~~~}~}}~}}~~}~}|}~||}~~~}}}~~|{|}~|z{|~}|}~~}}}}~~~|{{|~~|{{}}||}~~}~~}}~~}}~~~}~~}~}|}~}|}~}}~~~~}||}~~|{|~~|{|~~~}}}}~~|{|~|{{}}|}}~~~~~~~}}~~}~~}~~~~}}}}|}~~~~~~~~~}|}~}||}~}||}~~~~~~~~}}}~}|{|~~}}~~~~~~~}~~~~~~~}~~}~~}}}~~~~~~~~}~~~}||~~}|}~~}}~~}}}}~}||~}|}~~~~~~~~~~~~~~}~~}}~~}}~~~}~~~}}}~}|}~~~~~~~}}~}}}~~}}~~~~~~~~~~~~~~}}~~~~~~~~~~~}}~}}}~~~~~~~~~~~}}}~~}}~~~~~~~~~~~~~}~~~~~~~~~}}~~}}~~~~~~~~~~}}~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/m56.bin b/applications/SprPoP/assets/packed/MUS/m56.bin deleted file mode 100644 index 5268478..0000000 --- a/applications/SprPoP/assets/packed/MUS/m56.bin +++ /dev/null @@ -1 +0,0 @@ -{zxtssru{|urqppqrsttuwxxz|}~{yywvxzz}~uhhzqlovyn|m|~}}}~~~|thcm|znggjmpsvy{|}}~~~~}}}~~~|{{{{|}~~{umhm|~{{}}yogl~~nffiloruwy{}~}yrjddmy{tnkjkmorsuwxyzz{|}~{vv}yogceny}zrjecccegjloruxz}~|yvpjecfmw~ytqooppqstuwxyz{}~}~woihjpw|~}ytoliggghiklnprtvxy{|}}~~~~~}}}|zywurnjfddgnv}~{xvuttuuvwxyz|}~}{|~~xsooptx|}zwsqnmlllmnopqstvwxyyz{{{{{{zzywvspmjfdehmu|~{xwvuuvvwxyz{|~}{{}zuqpptw{~~|yvspnmmmmnopqrtuvwxyyzzz{zzzyxwuspmjgeeglsz|zxwvvvvwxyz{|~}{z{~{vrqqsw{~~{xurponmmnopqrstuvwxyyzzzzzyyxwusqnjgeefkqx~~{yxwwwwxxyz{|}}zyz}}xtrrtwz~}zwtrpoonnopqrstuvwxxyyzzzyyyxwusqnkheefjpw}}{yxxwxxxyz{|}~}zyy{~~yvsstwz}~|yvtrqpooopqrstuvvwxxyyyyyyxxwusqnkhfefinu{}{yxxxxyyz{|}~}zxxy|{wuttwz}}{xvtrqppppqrrstuvwwxxyyyyyxwvuspnkhfefhmsz~|zyyxxyyz{|}~}zxwx{~|yvuuwz|}zxvtrrqqqqrsstuvvwxxxyyxxwwvtrpnkifefhlry~}{zyyyyyz{|}~}zwvwy|}zwvvwy|~|ywutsrrrrrsstuvvwwwxxxxxwvutrpnligefgkqw}~}{zzyyzz{|}}}ywuvxz}~{xwwxy|~{ywvtssrrssstuuvvwwwxxxwwvutrqnljgffgkpv|~|{zzzzz{||}~}yvuuvy|~~|zxwxz|~}{ywvutssssttuuvvwwwwwwwwvutsqoljhffgjotz}|{zzz{{||}~|yvttuwz}~}{yxyz|~}{ywvuttttttuuvvwwwwxwwwvutsqomjhgfgjnsy~~}|{{{{{||}~|yvtstvy{~~}{zyyz}~|zywvuuuuuuvvvwwwwwwwwwvutsqomkigfgimrx}~}|{{{{||}~|yvsrstwz}~~~|{zz{}~|zyxxwvvvvvvvwwwwwwwwwvutsqomkigggilqv|~}|||||}}~|xusrrsvy{}~~}|{{|}~}{zyxwwwvvwwwwwwwwwwwvutsqpnljhggilpu{~}}||||}}~~{xusqqrtwz|}~}}|||}~}{zyxxwwwwwwwwwwwwwwvutsrpnljhgghkoty~~}}|||}}~~~{xurqpqsvy{}~~}}}}~~|{zyyxxxwwwxxxxxwwwvutsrpnljihghknsx}~}}}}}}~~~{wtrpppqtwz|}~~}}}~~|{zzyyxxxxxxxxxwwwvutsrpomkihhhjnrw|~}}}}}~~}zwsqonopsvy{}~~~~~~|{{zyyyxxxxxxxxwwvvutrqomkjhhhjmqv{~~}}~~~|yvsqonnortwz|}~~~~~}|{zzyyyyyxxxxwwvvutrqomljihhjlpuz~~~~~|yvspnmmnpsvy{}~~~}|{{zzyyyyyxxxwwvutsqpnljihhjlpty~~~~|yvspnmmmorux{|~~~}|{{zzzyyyyxxwwvutsqpnlkiiijlosx|~{xuspnmlmnqtwz|~~~}||{{zzzyyyxxwvutsrpomkjiijknrw{}{xurpnlllnpsvy{}~~}||{{zzzyyxxwvvusrqomkjiijknrvz}zxurpnlklmorux{}~~}}|{{{zzyyxxwvtsrpomlkjijknquy~|zwurpmlkklnqtwz|~~}}||{zzyyxwwvutrqonlkjjjkmpty}~|zwuromlkjkmpsvy{~~}}|{{zzyyxwvutsqpnmlkjjkmptx|~|ywtromkjjklorux{}~}}|{{zzyxwvuusrqomlkkkkmpsw{}{ywtromkjjjlnqtwz|~~}}|{{zzyxwvutrqonmlkkkmorvz~~}{yvtqomkjijkmpsvy|~~}||{zyyxwutsqpnmlkklmoruy}~|zxvtqomkjiijlorux{}~~}||{zyxwvusrponllklmoquy}}|zxvsqomkiiijlnqtwz}~~}|{zyywvutrqonmlllmoqtx|~}{zxvsqnlkihiikmpsvz|~}}|{zyxwutsqpomlllmnqtw{~|{ywusqnljihhijmorvy|~~}|{zyxwvusrponmllmnpsvz~~}|zywuspnljihhhjlnqux{~~~}|{zyxvutrqonmmmmnpsvy}~}{zxvtrpnljhhghikmqtwz}~}|{zyxwvtsqponmmmnpruy|~}|{yxvtrpmkjhggghjmpsvy|~}|{zxwvusrponmmmnprux{~}|{zywusqomkjhggghjloruy|~~}|{zyxvutrqponmnnprtw{~~~}|{zxwusqomkjhggghiknqtx{~~}|{yxwvtsqponnnnpqtwz}~~}||{yxvusqomkjhgfggikmptwz}~}|{zywvusrqponnopqtvz}}~}~~~}}}zwvqjfdhs|zqidcdfhjmoruy|pmlsy|~|zxwvvvwxyyyxwvsrrstw{{~|{zz{|~o[^|jUNOSW[_beilptx{{{~|{yxwvvwxyz{|}~~qs}rmllmnoppqstuwxz{|}~~}}||{zyxupjcaht||vokihikmpsvz}sp|wokhgggggghhhiijkkllmnoqsvxz{zyww||qe[X]l|{pe]YVWX[^bfjnquxz}}zy{{tnmr}~xtpnllllmnoqrstuvwwwwwvtrokfcbdjsy|zwsqpoqrux{|uppwxsoljhgggggghiijkmnprtvwxxwvvx~{tkc\XZbnz{slgcaabdfiloruxz}|zy{~ytolmt~yurponnnopqrstuuvvvvutrplhebadksy|{xusrrsuwz}ysoqx|vrolkiihhhhiijklnoqsuvwwwvuvy}wog`ZWZco{}wqligfghjlnqsvx{}}{yy||wrnlnu{wtqpoooopqrsstuuuutsrpmjfcabelsy||zxvuuvwz||uqoqy~ytqnlkjjiijjklmnoqrtuvwwvuuvy~xqjc]XX\dp{{vqnlkjkmnpruwy{}|zxy|}ytpmlnv~yvsrqpppqqrrstttttsrqoliebabflty}}|zxwwxz|~~xsonrz{wsqomlkkkkklmnoprsuvwwwvuuvy}ysmg`[WX]fq|zvrpooopqrtvxz{}}zxwx|~zvrnkkov|yvtsrqqrrrsssssssrqomjgdaabgmtz}~}|{zzz|~{vqnns{~zvsqonmlllmmnopqstuvvvvuttvz~zupjd^ZWY^gr|}yvtrrrstuvwyz|}~}{ywwy}~{xtpmklpw~||}~|zxvsqppsw}xsqt~}~~rfssja[YXYZ[]_`cgjmruvxyz{~|x|yurnkhdb_]]_enxm`re_cjosuvxyz{|}~~}}~zu|~}|{zywvtttv|whnn`\\^`bdefgfgggggfedcdfjouy}~~|ytomr~|}viiytf_ZYY[]_acfhkmnoppqruy~{vw~}zxuqomlmqx{mccnxpkhhhijlmopqqrrrqrsuy~{wuy{plp{ypida_^^^^^^^^^]]\]^afkquwxwtqnmpw~tnnuzrlgdbbbbdeghjklmnpsw||xwy}{yvtqpopsx~~vmgfkv|wsponnnnopppppqrsvz~~zwvz~uootzsnifdba```__^^^^_`chlqtvwvsqooryzrnpxxrmjgfffghijkmmnpqtx|~zwwz~}{zxvsrqprtx}{tmhhnyzwtrqpppppqqqqqrtwz~|xvw{{tppw~wqmifdcbaaa``___`beimpsuutrpnos{wrorz|vqnkjiiijklmnnoqrux||xvvz}|zxwusrqqrux|}xqlikr}zwusrrqqqqrrrrsuwz~~zwvw{xrpry{upligedcbbaaaaabdgjmpsttsqpopt{|uqpt|{vromllllmmnoopqsux{~}zwuvz~}|{yxvtsrqrsux{~}zuokjmt~zxvutsssssssstvxz}|yvuw|{uqpsz~xsoljhfeddccbbcdehjmprssrpooqv}yspqu~zvsqoonnooppqqstvxz}~}{xvuvz~|{zxwutsrrrsuwz|}|zwrnkkow~{xwvuuttttttuvxz|~~|zwuuw|}xsppt{{vrqrstuvxyz{{|}~}zvsqqtyxf_lzfZVX[`cdgjknrux{~~~~|{{}zq{zvvwxwvsqommmoqrttsrqpsxjtj^_chkmnnopqsvy{}~~}|{z|{tx~~}~~~|{}s`by}fVPOPQSUWY[^aehkmoppqrty~z{ugesxi`[Z[[]_adgjmprsssrrruy~~xrpt~}yvtssssuvy{}~qmtxmfb`__abdgjlnpqqpppruy~zusv}wkfhr|rh`ZWUTTVX[^`ceghijlotz}zz~|rkkq|~vojgeddefhjlmnnnnopsw{}xspqw~}ywuttuvxz|~}uqs{xrmigffghjlmnoooopruy}|xttw~|rkhlvzrjd`\[ZZ\^`bdfhijlnquz{yzzqmnu{uokihgghjkmnnooopqsvz~~zurprw~~zxvuuuvxz|~{tru~|vqmkiiijkmnoooppqsuy|~zvttxxpkjoywoiea_^^_`bdfhijkmorvz}zxzwqnqxztpmkjjjklmnooooprtwz|~~{wspprw~~{xwvuvwxz{}ytsxzuqnmlllmnoopppqrsvy{~~{xustx}uoklr{{tnifcbbbcdfgijkmnpsvz}}zxwy|uqos{}|zvvtpqpmnqsty|}~~|yusrqsuwzxyz{{|}~|mv~xxyvtromlklnqsvxz{|||}}~|tii|~{zyz{~y`]x~opw~~zuokgdcdegikmnoooopqsvy{ytno|}~~t{yg^_fpz}yuqnmlllmmnnooppomjgfm|{vttw|vkiwxld_]`fox|yvtrrqqqpolheekw}{{}xngiu~wsnid`^^bir{~yupmifc`][]dny~|skim}~zwolic_]]_enwyqk`XUYk~xwvxy{}~}yzgegijkmnoqrsrrqqrtx~{usv}|u}{ttvxz{}}y|jsjWSUX]afimprssrqppqtytlo}zxy{~|{z|zdV\trbYWY\`dgjmnnmkifefjq}yrlmw~xqkjo|zl^UXi~~qgb__acegggda__ckw{uqqw~{vqlkmu|si_YZfw|rkfca___`djqvz{{}{wvyyrkgeir|uld^]cp}ricachpw{|zwtssuz}xwy~|skeflw~{{|xphb^`ht|z{|~}|zxvtsrqrty|tnjjloqrv}|zyxwwxz~~vmd]Z]fu}yvuttttsstvy~zod[W[gxzvsrrstuvwyz|~ulb\[`m}ywvvvvvvvwxz}{slggkr{zuqoopqsuwyz|}~~yvtrpqt|~{yyyyyyxwwvwxy{|{zyz|zvwz~|xurqqrtuwy{|}~~{smlpz}|zyxvtqmjgeehnxzqkghmtz}~|ywuuuvwxz{{{{zzz|{smjlt~zvsokfb][]blyzslgeejqx~~|yxwvvwwwwwxz~~wpllpzyrkea^^agow~|xsnjgfiov}{xvtsstw{{uomnt~vngdfjqx}|yvuuwz}~{xtokiimsz{xvvx}yrljkpy}zy|{vrnlkkmpty}|xtoljjntz~xog`]^dnz|wroljhhhiknrw{~zupkhfipyyoe]VUYevztpmkihhhhiknquz}}yuqnmnsz~xrlhfgjov~xtpnlkjjjjjlmpsvy|~~~~~~~}{z|~}~ztpnpw|wsqomlkkjjjklnruz{xxz~|zxxy}}tlfbcir}{wtqomljihhikpu|{xwx|~|zxvuvx}~vohb__cku{vsomkjjlnrvz~}zxxz{wuttvz{uoid`^`fpz}xtqqqsuwxzz{|~|ywxz~|xvwz~{vqlfb__bis}~~}|{zyxxxy{~|xtrqswz~|xtoid`^_cku}zyxwwwxz|}xsnjijnv~~{vqke`]]`gr}{zyxxxxy{}{wrnkjlqy~~~~~~}zvqlhdbcflu|{yxwwvvwxxyzzzyxwvwwyz|~~~}~~~~~~~}{ywuromkjlqy~|zxvtsrqppqruw{|{|~~~~~~}}}}~~ztpkiikqz~{wtqomkklnrx~~yvtuw|~}}}|||}~zuplighmt}{vromllnquz~zvtrrtx}~}|}}{vrmjgginv}yusstvy|~~|yvsrqruy~|xsojgeehnu}~||{|}}~~|zwurqqrvz}ytojfb`adjrz}zyxwwxy{|}~~~}{xvsqpprw|~{wrmhb^[[^dny|yxvvuvvxyz|}}}|{xvsqppsw~}zwsojea^]_ckt~{ywvuuuvwxyz{||{zyxwvvvx{~|{ywtrpnljjijlot{|zxwvvuuvvwyz{|}~~~~}{zzz}~}|zyxxxxyyzyxvspmkkmry~{ywvuttuvwy|~~|zxxz}~}{zyyyz|~|wrnjgfgjpx}zxwvvvxz|~~|yxwxz}}|{{|}}yuplheccfkrz}|{{||}~~|zxwvwz}~{wtplhebbcgmt|~~~|zwuttux{}{yvspliecaachnv~~}}}}~~}{xvsqppruz~}|zxvspmifca`adjqz~}}}}}}~~~}|zxvsqonoqu{~}|{zywtqnkgdbaadipy~}||{{{{{zzyxvutsrsuw|~}||{yxvtroljgfeegjov~~|{zyxwwwwwxxyyzz{{{|~~~}|{zyxwvtsqoljhggilqx}{yxwvvwxy{}}|{z{~~}}||{{{{zyxuroligffimry|zyxxyz|~~{yxwxy|~~~~~}{yvspmjgfefimt{~~}~~|zxvuuwy|~|{yvsqmjheddfint{~|{ywvttuvy}~}|zxvtqnkhecbbdhnt{~~}|{ywvtsstwz~~}{zxvsqnjgda`_`chow~~~}}||zywvtsssux|~}|zywurpmifca_^`chow~~}}}|||{zyxvutttvy}}|zywusqnligecbcdgkqw~~}}|||{{zzyxxwwwxy|~|{yxvusrpomlkjihhilotz~}}|||}}}}||{zxxxxz|~|{zxxwvvvuutrqoljihikotz~~~~~~}|zywwwxz}}||{{{{{{{zywuroljhffgjntz~}{zxwvuvwy|~}{ywtroligedegjou|~~|{zxwuutuvy|~|{xvtqnligeddegkqw~~}|{yxvussstux|}{ywusqnligecccehmsy~}|{zywutrqqrtvz~|zywusqoljgecbbdfjpv}~}|{zyxvutrrrsux|}|zywutqomkhfdccdfint{}||{zyxwwvuuvwxz}}|zywutrpnljhgeeefilqw}~}||{{{{{zzzyyyyz|~}|zyxvusrpomkigfffgjmrx~~~~}|{zyyyy{~~}|{zxwvusqoljhfeeegjnty~|{yxwwwy{}~}{zywvtromkigeddegjot{~|zyxvvvwx{~~}{yxvtrpmkigedccegkpu{zxwtqrrrtw{}~}||{zyvtqonlklkkmooqux|}sw}~|{zzz{||}~~}}}}~}}{yurnkigedddefhknrw}sprtvwwwvvuuutuvwwxxyz{}~{~|{zxvtromkjiijjlnquy|womlllmmnnnoopqrsstuwx{}}y}|zywvtsqpooopqrtwzzunkiiiiijjklmnopqrtuwz||yz~{zxwvvuuuvvwxy{}y|}uolkjijjkkllmnooprsuxz}}zxx|~|{{{zzzzzzz{|}}xyzuqnlkkkkkllmmnoprtvy{}~{xvx}~}}||{{zzzz{{}}xw{~ytqomllllllmmnoprtvy{}~~|ywvy}||{{zzyyzz{}~zvw~}wspnmlkkklllmnoprtvy{}~~}{yxy~~}|{zyyyyyyz{}~|xvz|wspnmlkkkkllmnoprtwy|}~~}|zz|~}{zzyyxxxyyz|}zww|{vromlkkkkkllmnprtwy|~~|z{~}|{zyyxxxyyz{}|xvxyuromlkkkklmnoqsuwz|}zy{~|{zyyyxxyyz{|~}yuuy|wspnmlllmnnoqrtuwy{}~}zxx{}|{zyyyyyzz{|}~zvsuz|wtqpooooppqrstuwxz|}~~~|zxwx|}|{{zzzzz{{|}~~zvsru}}yvtsrqqqqrrsttvwxz{}}}|{ywvx}~}|{{{zz{{{|}~{wsqrw~zwutsrqqqqrrstvwxz{|||{ywvvy~}|{{zzzzz{{|}~~|xtqqsz~{xutsrqqqqrrstuvxyz{{zywvuw{~}|{zzzyyyzz{{|}~~|zvsrrw~zwusrqqqqqrrstuwxyz{{zxwvvy~}|{zzyyyyyzz{|}~~|yvssu{}ywusrrqqqqrstuvwyzz{zyxvvwz~}{{zyyyyyyz{|}~~|yussv~|xvtsrqqqqrrstuwxyzzzyxvuuw|}|{zyyyyyzz{|}~}zvtrsx{xvtsrrrrrsstuvwxyzzyxwutux}}|{{zzz{{|}}~~{wtrqtz~{xvutsssssttuvwxxyyyxwuttuy~}||||||}}~~}{xtrpqu|}zxvutsssssttuvwxxyxxwutssvz~~~}}}}}}~~~~~|{xurpoqv~{ywuuttsstttuvvwxxwwutsrsw|~~}}}}}}}}}}}}|zxurpnory}{xwuttssssttuvvwwwwvtsrsuy~}}}||||}}}}}||zyvsqonpt||zxvuttssstttuvvwwwwvuttux}~}}|||||||||||{zywtronnqw|ywvutssssttuuvwwxxwvutuvz~}}|||{{{{||||{{yxvspnnosz~{ywvutttttuuvwxxyyxwvuuux|~}||||||||||||{zywtrommot|~{yxwvuuuuvwwxxyyyyxwvutvy}~}}||||||||||{{zywurpmlmpv~|zxxwwvwwwwxxyyyyxwvtttvy~}}|||||{{{{{zyxwurpnllmry}{zyxxxxxxxxxyxxxwvtsstw{~~}}|||||{{{zzxvuspnlkknt{~|{zyyxxxxxxxxxxwvutsstx|~~}|||{{{{zzyxwusqolkjlpv}|zyyxxxxxxxxxxwvutsrsuy~~}||{{{zzyyxxwusqomkjknsz}|zyyxxwwwwwwwwvutsrrtv{~}||{{zzyyyxwvutrpnmkklpv~}{zyyxxwwwwwwwwvutsrsux}~}}|{{zzzzyyxxwutrpnmllnry}{zyyxxxxxxxwwvutssrsvy~~}||{{zzzzyyxxwutrpnllmot{~|{zyyxxxxxxwwwvutsrrtv{~}||{{{{zzzyxwvusqomlkmqv~~}{zzyyxxxxxwwvutsrqrtw|~~}}|||{{{zyxwutromlkknrx~}|{zyyxxxxwwvutsrqqruy}~~}}||{{zyxwvtrpnljjkot{~|{zzyyxxxwwvutsrqqqsvz~~}||{{zyxwutrpnljjjlpv}~|{zzyyxxwwvvutsrqqrtx|~~}|{zzyxwutrpnlkjijmrx~|{zyyxxxwwvutsrrqrsvz~}|{{zyxwvusqomkjiikot{~|{zzyxxxwwvutssrrsux|~}|{{zyxwvusrpnljiijlpv~~}|{zyyyxxwwvuutsrstvz~~}|{{zyxwvutsqomkjiijmry}|{{zzyyxxwvvutsssuw{~}|{{zyxwvusrpnljihiknt{~}||{zzyyxwvutssssux|~}||{zyxwvutrpomkihhilpv}~}||{zzyxxwvtssrrtvy~~}|{zyyxwutrqomkjhhhjmrx~}|{zzyxwvutsrrrtw{~}|{zyxwvusqonljhgghjnt{~}|{zyyxwvtsrrrsux|~}|{zyxwvusrpnmkihggilpw~~}|{zyxwvutsrrrsvy~~}{zyxwvutrqomljhgghjnsz~}|{zyxxvutsrrrrtw{~}|{zyxwutsqpnmkihhhilpv}~}|{zyxwvutsrrrsux|~}|{zyxwutsqpnlkihhhjmrx~}|{zyxwvutrrrrtvz~}|{zyxwvutrqonljihhikot{}|{zyxwvutsrqrrtw{~}|{zyxwvusrpnmkjhhhjlqv}}|{zyxwvusrrqrsux|~|{zyxwvtsqonljihhhjnrx~}|{zyxvutsrqqrtvy}}|{zyxvusrpnlkihggikotz~}{{zxwvusrrqqrtw{~}|zyxwutrqomkjhgghilqv}~|{zyxwutsrqqrsvy}~}{zxwvtsqonljiggghjnrx}|{zywvutsrrrstw{~}|zyxvusrpnmkihghdjimvz|uvqorqv|{ztikpuxyxw|~~xe^div||}wlh[Yes}~nfoohc]]_\en|}wsnd`dgsyzw`Racceejsuy~z{n^hoaY^ehr|ts{~hszkfhaZ]^[[Q_cRkxrr{}yq|jy{hhjrxocixqtgulswlrwv`k_aljdT]ungkj~s}x~~m}soqku_mjknnxhg`k}jgZfsj_n~mnc^vy{rlgjw{~uyutak|lgy}pnqxy}txrpix||}ksx{~~zg]Wktikvussz{{xzslnjct~b^Yinlw~~qenw}ebmiu{sv|||lt{{xzvvgojgfnqlo}o}zWGwyxgTPVUaijzt^lg~uy}q{~}jc}||rxtdhxwywy~~z{izv|irowzwiS{pg\_d[fwsmYathq~flvwyoprzvyo~{xlw~ikijgsro~xuzzyrr{xzv[WSjuczgtmzrsTB``ilTkbgo|{injuqhupxy{qlvejhm[rqpnqtqZYSKimhmorxuq`]a[]pYjempr~qqcr{nZ~oz|x~gst^kku^vw~ymoqyvnZomMPmwvgyqssdkW\a}~]mtkpmrluhhwsg{z}qtzqxg~ondfsixvmrtfy|~xelq_MTw|nquutn_hoW\m^`uphes|jcvzppvysrzhvtkm]mr{yjx~qzutv}}xfbsmZSn}mstvqiSkjW^rs[uvoodgwzdj{{wuqv{{yi}znhadwk|x{m~|}n|||~q|W_ykcWusiuyrg[[wZUfuiZunqojn{wo}ry~vz|yxormnnbgvqr}zs~|rsz{whThtie]tomwqfXcvTZnzjZqr~reozrr}v{wq}pklimj`kzzuw{}ywv|}}zqx}YTnqfao}ukp{nh[mkVrvq_fqxngzvv|r|~r}um~ykijuo_h~xp}x{w|uxugzrSXifnd}php^eza`~rm]io|rfoo{}p~{~or|zxqhmtkitr~zvrz~t~w~ygsxVRcgmmpkxyf`vqXtrlh\du~nezss{ox{r|wpz|}uhlwphs}{w~~wp}ww}|fiycP\hnphsm{kcpqXhgjZ\l{qdnxznt~~rpzz~{g`xzgmut}}l}|wnfrkZ_djtnverbmq_aeh^Xosdpuxrt|pl{uxziauwgop}k|~r|~lfsp__aitn|dvclpgffhjVk{vim{xos~u}lpwrx}i^syirt{{nzt{~mhqna[\lqiy|juhvrjggikWp}vip~xip~vx~lovozk[t|ouo|yxgz}r~y~xoklia][kljvp{mxqnmhgkQp~sdmsep}tv~qoyt~k_t{rwn~wuiwr{p|ynihgd^Wgjiwtpynork^oVl{thkudpn~wytxr|o^p{qtnw}{x~qu}yvkvvojfhlaSfpkwysovpquys[m\e{tkk}hmrx}txxrux`etrypyx~|}vzwowrutpumnjejhY^qhxt|wvvnywwchk[wytjzmg}wzwyv{spq}e_oryuryv}oy~vrxdsnpldgl`Xphqv~~w|ntyr`nbn{wnsxbqqvyzztqnyr_fry~oz}u|~qrqm~ungnlod]ilY`mi}r}~}xp~ujdmgvwql|ie}uuzt}xtvps}{lcmryzyzsxo~zu|m}{}alhji^`leXkiu}x}}rtypegnlstos}dmuyzrtvumuyiemxv|swt}ttt|{qwq}^ecidZamc_qlz{||ryqpffoprsnx}zer}x|uvnxtpy~ugdlv|tsz}sxruzvon]cdkaXdqdlps{v}volpcjvrvsq~nh~{z|m{jwnt{xndgr{u~r}vurn~x{yw~b_bhg[]nnhsm|z}ryzmoav|qto{hr~zv{mipvpwytifi~zuuvwp|sxyx{v{s{p__di_Xesipmy|y~wwjshkttpw}nm~{xwhwewpuxvpieu|q{qwqyp|v|}yvvwtf\_fcY]nmqpo}|~}|wsmsc{orq{vkxz{rpsdstu{xslgmtququrzz|x}puyqj\]feYYjoqqk~~|wziub|oqo{ylw|~qxpfowv{xtohjutuqtvt{rqq{ml^[feZWgptqi~{xgufxqpm~zqy|~r}|nljwx{vrpjg|wvupvyqxppn~inc]ed[Xgovpi{yzfvi}roq}zt||~p}zplkwxzurphg}yxwtoyzptonmgod^ge[Xfnxljwx~iwn~vor~zw}}|}o{ysnguz{urqhh{xyxtox~}m~vnqjgmj^fd[Wblymg}uxktt{zoq~yx~~||ovzu}sgr|}vqslhyuy{tmxzm{xlvejgm_ec[V_iyne{txqnxzpm~|xy~|}ptzyzwjm|~xstphusx~wntyuw|lv~~czv_pcac]V[etweyw{|zzkw|xj|~|wz{~urwz|wshw~zsstipq|z|qr{zp{po}ikaik`c`YY`m}jszwvpont}xx~~ypuuvwlk||vqtomrqzyozvw{zyjv|yazt^lgbb\X]ezxm}vyx}nv}}l~zu{}~qrq|pvfr~yrrtmrm}xsrzvsx~pl~z~mg}gamec_ZY_mqx|zv{ym{tq~us}xnsnwptev}wquursmx|pvvx~wyz~loy|flybamfa]Y\btr{u{vnzpw{qu}tnqppqrfx|vrwtvrsz{|zq{rz}}wzxks|zucpr_cld`[Z_f~|z{{v{ss|n~~voz~znrkyjvlk|{ttxvymu}vvxs~~}tqlxvzigrj\glc^Z]arzvw}|nvyv{pq~snqkvjwhr}xsww{sqy|{}u}~sv~}quwyrdknd]pne`aflyzwy}xz{mV^`dfmtywj}vzvnpvq|pow|uqqchij^lujechl{yxllwwny|xmu|moccyftz|~vuy{~l|ofmtx~uqeZYbjrmgl^daf]^qh_[_bs}}~zwz|weZn`gqgddhVbtsu|}q}y}v|yx|zlbdx~|wtx}zrysvtmtptx~|hafyvqhtpsuxywrgj}wde]Zvne|r{k][nvq{keefkfbgYbX[]RhhZUZ]lswyy{~jhXWld]w{blrsqryrwyxrzz|yjcdz{n|{z{||}squynsoru}{y}yxlqwrnv{umu}xvnfmwgk]cuk`r}q}k`]qrc~zuqlnggh[hXXaUel\VY]lmwxz~}|nm[[jdYelrrrsl~xwuxwow{zledw~f}|z{z|tum|qyyoqt~{uyyzwu|xuxt|nk{vofiz}ila_qoeb|~}x}rd_iw`m}z|soigm_heS`_ZkhYX[gkly~~|~|}{vofXgfbXm~tzo}|nqzvz|szoovsgcjri{x|zvx{nq}s|vpqxy}vqx{{z}}z}xqho{tjel}vjl[gongd|{~~la^msbmyunfkl`ndT`e]jj\\_khq~}~}y{zzzsoaXfce]l}}p}qp~px{symmtrgcj|slt|{wtw}qm|zw{rrx~u~zsnu{~|}mqgvkejyykm\dnloez}{|~k_[gqjluzpfipcomZ[iedog`alkk~}wwzv|vleS`beigsxxpwwlsyqjnxxiceuxtrx~vo{|v|nrz{ytvu~xsln~ovfv}oegr~nn_]ljroq||zwzm_Zcontptflvz}vuqi|ystlhb^fvqv~xt|~zty|to^lpt{i^wb``fxvb{nrjbfr~qln|{|wr{jlwxwvzlx}|wqko³wl~zomXcn]i{vf]any}tvekws}}{sn|y}pouqiiv{~v^WvmUJVcX]c\[c\axty{wsmlwx|ywql|z~n\spaZdYNng_bVV\lzykb`jqo{jr}}yphuz|~~|xzx}pp{kqf]epdVT^ipslpd\mjnxvyyz}|lzyyvxury}~tg\gtitm\bc\`ZVmlowsnhdkzuz{~y|p|~~|wcmyxt`prhfXUYgvymc`hmhxjdxxx{{rek~|{x{v|xwyztnxp^Zainplte`niluxsw}|}kt}xuxyu||xxv{l[ctzy}fglfeX[nhqwtngdjw|oq}{ywz}yejv}pvsrj[X\iwyneclifwf`|sqv}}sbitw~~wz{v{~}yw~vzwf`eknmmwgdpjkszrwww|mqyyuw}x~zuzo~s_`knuhrpl]]ngoyxqhdhr{rhz||x}zkin{}uzvd\]gtztkglkcso^lwkoyxhdnlz}uwww~wvz}uihlmmlwrdqojoy{pxvz}torzwu||}s}rt{w~|k^gewuoyxm\kmhv{yogflu{nn}y~{{|zkkp{txf_alwztmjogeukbl~vglw}tfiklzyy~~wxx~wv||yomoomm{riuokpz~rtxxxrpryxv|~~q}utzpxyiahdxq{saooiv||sjgltzso~y}~}}{~z{lmpzqmddluzwrnrjcsohhv{ieq{|vijmi{w~yw|~zwwzvrrqnkxylwunow{pzxztyvqswz}vytvyvvnkuzwndkjpytjmujq{zpjkqxzr}{{}}|}{}~|vpqux|~|rgunpxnks}}ufpotptvtwk|yr~wp{~obomow~xx{xzz~|yup|v|xuz|u{}vwwz~zxy{}yo^sfZerupipijvty~qxzqmkjq~wwz{xz~sefwygasndggjnty}uk~sv}tryrgpmwuw~vzwoug]Yas~olnrrkehuz~~jn~kmwzxuqrzvwliqvz{{|pZ_`i|~|uihhZj|}~~{vyupyp|rnw}~vkdcelu}~{rb[ap}tpmihjovytil~mz~wru|udlln~}|}~o}yi]WV[hznjq}xzniuseq{zupn|zt{ojnxy}}|{}o[_]_s|yvr_jy{}~~xv~~r{zutnv}yphfefn}{~|wg_`itw|zunihlswtkosw}{vx}ugngixx|~n}|nc\WVayytntyr|}mluteq~|vor}uy{qmou{yw|{ww}qadYZjouwdpxx{~~yv~wxw|spv|~zrlhedkxw|}necflop}vmhkrutlq{vy}z{~xkqgesuq}p|tjb[V[rqo}uvxpy~omr||jk|yqq|twvporwxs{~xuxzgh^Vckjumpyxy}|vwwsy{puz}|vplgcey}m}{vkeehmmqvmjnttpo|~~tz~~~pqnbkurn~yvzph`XUevjtz{uqxnps|zjm~xqw{q~vqqswxu}wtxrggXXfmjsqy{y{~|vxvm~xruy{zuplgbh~{n|||ytjeeinqtyplottps}ytw~}psmblvunzyy~xog_XUgyou~~vrzprrx|pkz|sxzo|wrqsw{z|zuw}sfhZWeqqqu{{|yv~jw~stwyxuqmgcf{u||~|rvlfehpx|~tx|pw~}|wwzg`{xsx|vi`ztYLUmlcn~y|~t~vvtminwuu|qv~ffphoxp|vs}qvofntnbqx{teaxye]lufckvsls}|~}{tr}}r~regz{jbib]qn_dsz{xw{{|pnsrjg}z~zyj`aqqbcrldit}wv~wozylidbk|v~plhflz}myrkw}ww{tmqc\cjnlw~z{}j`^dszokluslqz}}}{qzuqpms{yqkjjnwll|scjy~|xw|w~uhjprnn}|xnd`cm{|vuts{|{}prznihdes|w~}eacfkt|xrq|xzyotl]`gmmnp}lc_bl||wqrzurw|}~}qt~uppmlwvphikms|wo~nhw|y|xxjjnqokv}{yribagt~yysu}psznjjfclz{xf`bcflvzwp~~z|xrxm`afiihuvzohbbgttr{zuwz{}ymtzpookgp~{x{ojkkjmuzwtmy~{~{zvklooliqz~}tmeacm{|~ur~~pvymllgbh{~yth`abben{}r{|}~vs{occeggfl|~xrmfbdm}}qy{wxy|ymrwmlnkeh{}xprghjikq{zru~|y{nlnnnkl{{yspicagtrvtszpjljdbp~n}t`]_`bhs~}v~zrzxhcdfghjtwookfdhtzr}}wwz~~rmuphklgdloqkcehjowvyx|vmlmnopr~z}nllgcdmztvrvwlikidet~jzp]Z]agoy~wwr{vgddfimqx~qgkjghn{~szywy}}rmtmehigelpkk`agmu~xxzwmllnrxy}x~y~hchhgjrzt~ttwlfijhitjl|s`WZclv}|yyovyjddgls{~xuwaailovxsxw{~vkqoccgiimzwfq{pc_fq|}|}yv{nlmpu}vypwiZailqyvz~uswldgklmulgrpcZ[eq||~z~yntxkdfiow~}rn~x^\hqv}|t~zwz|tkqmabgjlp{~rfnsmebiu}vwwmmosyt}riv}dV`kqw~x{~}ruuhdhlnqyyhimic\_iu}{~snxthfilr|{wipoY^lu{|wyx{xmnqe_cgjmtyjjnljddmy{t~|pnoqu}uz}ufk~qXWeouzy~~tuxkdfjmou|mlkffa]cny|vowvkgiknw|ximw^Zfrx~z~xyvmore^aegjpzxlnkfigcgq|{v|qoppryv|~}}~|rdk~rZVblqv~{~{swxjdfijlr|yprjcfc]_hr}}tr{tkiiils~|ugpw`Ydouz~zytlrrd_acdflvunrjaghbbju|x|rppopvz}}||}{qcj|u`U]hosy~zrxylefhhjoxyrwm_cg`]blw}xs{wmkjijoz}whj|{j[]irw}zulpti`_abdiq{xnsq`_hgbemyxuqqqps{{~{z{zugaqxl\V_krw~{ss{sgefgils|stxeZchb`fpz}uw|slkkkmt~|pdmzug[]ju|yqjrre__acflt|}}rmuo\\hkghq|z~sqrrrv~}zxxxqb`nrj^V^lv|yprzqfdfhjov}|prxfW^iifjs}|vv{sklmnpw}||yobgsrka]hw{qinsg__adiov||z}rirs`Wcoppuy~tprtvy}yvuupcZemjd]\jy}qmvuidfimrx~||olvoZWfqqqwzxtzulloqtz|zywn`amnkhbgwrgkri``cfkqx|t{pgoueW^pxxzz}upsvy|~{wtsrm`Xbiffc`j{~okushegjot{y~xkkvo[Wfuxwzy}~vv{skmqtw}}zwvsi]bljjkgjyofmpf`adhmtz}{t}wjfssbW`s}|}~}z|rqux{~|yusqogZ[fedhfdn~xkoumffilpw}w|phsvfX[lyzy}y{xv|xnlosvz~{xvtl__jiflliowhjqjbacfjpw{}t}ymfpvhZYiy}|~~~|{tqswy}~|zvsqog[[fd`fhdgu|mounfegimtzz}pitxiZXeuywy~zxvx~yoloqtx~{xvsj_blgcjmhjwyjmqhaabcgnuy|wxkhtugZWdtzxz|z~~sqsuw{~|zwtrndZ_ha^ehdco~}nrulfefgkqx|~|olwxi\W`pwvv{}vty{omnprv}~{ywsi_clf`gmjgo~~noribaabekrwz}ymhtvj]W]mxxw{zw}uqrtvy}~|zwusof[^hb[`hhcgutqungeffhntz}sktzobZZftxvx}xqttnnpquz{}{ywtma_ji``jojisxormdbbbchntx|}shmwqe\Y`pz{z~vt}trsux|{}zxvsqk`Yag^Y`jkfjxttskefejxppmjlidebee^Z_dqx|wg^flwwonuxufSFQ`fbepsz~rou|lb]Ve~}z~|yhfrsgirrqz~ttumiuxe^``Z_`entz_]igv|jdfkpmfzxncRj{tosxlkqzt`j_`ryudeksqbZrg|uwtx{|pyz`Xlh_\O[GP_mwurwy}txfq__ip|~{mzusm}}wpmeidZcWZld\qu~||u|sp^^iruguvumtr}fiaHTenvswqn`ddcSZd]jua_`\s~~}wwqn|y}{~w`T^\d|xxwrwpew}vv~pxfvzmha\`gnu}x{vrv||w~{zslhb`a^lweez||~sxynfbXjwzwqxt|xzx~hTahi{~xkm`gqkimfXfi`mo^twy~{s{u{umgRZnn}~~srqoxj{ow~}|y}|tp{vshknk_n}z|ztx|}yuvsxsu{}rqto\\jfp|qtxr|r{oxkZrqirxwlruo|nthek_\ilw~zduvcbc_blWXjbViqqv|||tzw}sxnh]XdVWt|r|zxsxyqvq{}z~qtfiumknzp|ynlq|wz|yxx{vvttqmvegvorw{~y{yvtfur[Ze`fmwvtsujse^nelvkfphggiaeflo^Zmsvxvvw{}{~|~ztqb_^biacwq{y}|swvnrdeedq{r{my{~s~~{zi|{x|pnkgip\fwrftyx{|x~uaepnmflyu~~{ztx_YhaR^pyvs}zplrqn\aceolendpz~~~}}sss~{~wzrnXRY\nyz{~xz{w~{iyreojiingkxu|yyxzm}}|~w{kqwzxxtlstyrdm~|~nrqptjagWetoxvxvtkWSertuiexjkfvofuoh{zsuuwzv~xj~{|q}ydwje]gsapqs~w~so}teprz}k~y}vhuvncivvxxx|rqvwutszsnunzzvimxymuy{jnvbmn^ksqqj{|zxfbl^`bagl{`kocfra\tqi`xstuoy~{yyzz|mwmh\Rb\o]nvpq}yzx{m}|sw~nrgmxvl|ywvvv}xsu|f`m~odgo~jrtytkxw|t{xvcr{rqhe_jers{|yx~wzpsrltdc|~tvifmosvvwnv~xew~omm}khmz}y}vnqkkcXe_Umn}svt|s~t}~y|vvuxwthrw{qz}{}}zu~xztj{hfk^gs{gtprhsoozs{fr~ttjibk|ry}~}tlsnjdRqz~mn|~lxxp}jqkttov^xltk}w~xy}}yxlrphl[Xb\b|uz}}xm{vrtu{yotjmroyrvv|ur~z|yiqjgkr~~~|npnq~sv}nv~tbljnshsjn{{{{xvwsu\a{syrk}|{tynwvwup~zotnlxqhkvtqxr{v|nooYVaNkmeqs{~uq|xysy{wviwuwgp{|wzy|t}poqhfkqhkq}ytrwrttnx~mtwpqgpfdtt~~}y}|~pdxvjkah}z|s|zxlt}lpoa}ggg|wk}~sx{tvyhggUghTTYp|x|v}v~wupxyxlfupk{n{t~yv|ypvsuvsxjhjynq{ys~}vput{krkre`ijli{|x}wxxh|vthfoejm}{~rzznopijghsz|gwz{w~ojo^fpWTM_jau}~x}}yv}slyoinelyuuzuy||uxy|twmpkvmcnsywowq~romupfpkrempvzz~zyr~}xteni\adrkx{}zpwmslhfvwvpm|~|zuztvqfyk]XZf`^o{|r}w}iwvooe_c]m|owywus}otqtst}|s^pgjuxsw|zw|rgllh]jktup}xzf||opqcmack[hqpr}yswo}~j{issr{o}msuuw|}}}|opvurigcfaaqxfps}~~qz~|zwnp^eaxh`guz}krm}oinyul]o{ond`u}zvz{vy{}rhylobnkfy|nr~zypswj^f`kZjcwt{~nwopcxyoiozpuox~~}wrsob^seSlybf^d{}|~vsxqspndrwjbz}xvyw{ku|qihnafocaqotpuxd~moogpvkz{sq~zu~|lj}leokei[cshpzr~xzpwwymi}ukn||z~|yn}hwygqmlxtgwo\gws}wyw~}|{epttlqg[vks{{|xsy|onxnk\kkd\[mz{z~w{}z}wjo{zsiwuu{x{{u{mvye\xoV]\Ygqiyx~u|{~us{onupv}ly}zx|lx}p{zojvjmjZgmgqyvzkuvglcmrky~y~jkz{~z}s~|opymti]j`Ydxdd|~{trz{qq}sqmoznzt|suzro|}tyy~q[gyehnihvsynwr|pdt{cgecvzu||vl|zrqjyohbdqmajqyuto|yopmlqqzuk~z}~v|xeshbbWah`dvtp}rqy{vtuzu}kjxrkqxi~y~z}xqwlpgpj_chclemvw|votp}{t}qfxq{{xwzzv~vtlskeglW[qk[bav|x~zv|r|vryoxnswsr~|v{qxy}yhqpnpldel^khoy{|{}sulkiaexujmuu{y}s}tsqlupahljk\lrnm~y~y{wvsvqwqhnppzr|ww|nzulkapxohrxnscYo{uz}vxwfaY[YP^^VQXVdz|y~xx~tjnvw|rX]cx}TMZems~zvzsl~xik}fy~pf]afkrpciwxgqnnnj{ayskmqj`txaUyeXbfjck~|xwz||xotyorjodmhcsoseozlwgemocXkuy|mdotmmrsvqhz{}qxl~yupt{M\tlZoqrfbsq}~~ztq|pbdjZ\dU][F_eIVIch\^gmmd}ux}x{vfhvY~~pt|lwvkryuywvwx}zswv^f\Wd[QUPtfU]cgmfu|njwqxdl{rZXWjsYmuz|sx}wysxtloyxq}}p}~hqlW]QLTUKGJnSI^_bkl~{zvjtscke}wr{u}{xvwqvxp|wsvzvxpmz}lymgg\XidXOevM[lcilq~vy}s|qrp^nqa^gaye~}~}e|}xy{~wwt`h~zxp|jcn_aYLSkUKJm[Efgbkmu}tokzsjsmxvvv}~sovz|sxv}yr|je|ltlnl^YsnUVitM]nclnlx|v|y{}lwp^jkehhg{m}}h|v}u~no}mZj~~x~sjgdeiZO]pLK[mSJf_joix}zxmntqrsm~x|qw{t~x}o|z}nk~x_h|slpzj^d|[ShqcNebjrhpvu{wsoyhcghljesxv~xuyz||}pfwwZ^vx|uzynbgudVWrXEbf^KZ]frfk{}~}wwnmrxqmy~yw~zyzv}xyxtv~ldxy_bwxz|iuqcf|_QtkeUZ_msekxrrst}ypf`irhfoxz|zv|}{ldvtY^nnxov_rzjY_qVJp`\RQZlpbhzx{{}pgs}qoux}y~t{}|||}|ss|jarv_`nq~xiyygixfSzmaaS\ptee{|zpuyuvzyxk[fuigmuxzw|{wobnta\ehsqvdmva_mdLlmU`NSjrf`{}}ty}zdi}wovy~|{qy}}yx}wxpwqaerh_dhv|xyntfrq_f^f_Qivnbn}ynt}nszuzxaXmsgom}|x{}wv~}twwgcmk```ivqcw~v`hjaVugTdMXrpeb~tsy}}w^j~uuy~~|~}xyo}y}xu}qisj`dkgccey{xsvismgk`edRpwpdovkv}yp}tyqxzbUjsktpz{x|y{ux|kprfafgdc_hxvhsz{fhidanrTeYUspkbzro}u~}x}baxzy}z~|t|mw||kxx`mia_deihcwq~lrmnnyt\m[eyslf}jmxu}oxuopzpW]rqxw~~t~|}x|v|ltbme``bejfd{zspu{qfldjltdZhWmroepxjy}}}u}m]o{~~|~|~ry|pz~q}{{ph^cf`_`akpgux}}qrnmxuxbhhexrof|ji{syszywonyt\[ns~zsw|vyw~xg~v]ha``^dojh}{vwr{rjldqspi[hcppoftvj|z~~{u}m`nx~|y~nywp{nrxki}[a`_`]`ori||~svmttuehmqtrjn|fo|ruzsxvnrzn\`myzv{xty|w}y~vyfh`a_b]\jrgtz~xtynpim~qng_lrooil}lp{ww}wzxffp}{}urqwpzvx|}}}kvaxi[^\a]Ygtjt{{xzrt}prcp{qqlm{~kkzlqr|pryrb^ety{|tusyu~ozi{o___d]Weqhqs~~vyrumrwio^n}lngnz~mqqvxx|xifj{zwqqsqx~|}v}zirhsl^Z\aZUeqjsq~{}u}~mwdunqhsz|kp|~|iop|rvxpd``tzxxtruuyouqtrd]_d\Taniql}yxtxqx~grdlmmeoyzprm{p{}xmhev{xvpqqv}pxkkpmmeX[a[R]mlsm|~zy~nupkvpio{xrp~~tj}~gxvwysid^i~y}u~qss{vxvlstlo^\baUWilrmq~{rzvvshtcljhzw~yr|vztpu}|{smghvrqox}vtl}thgudkcW]`WRbmstnx|{lxpvupgwzz}swvukxhtvywpjf^pzx|{tqu{pvuetseq^[b_UYhpzmyypzw|uhukphj{w}yvr{uspz}ysqij~~wvrnzr|rhxti^wcehW\_YS`ly{rwx}rryv~sgu{y~|wzvo}qv{kjtyxqmlbmy~~y{wqrwrmwge{`jgZ``YWepyxnuy{kpvyzmfxyy|zyru~v||no{|utrjz~v}vot{w~~~{gjspZhrXiaZ`^W\jxy~r|~nx}}jn|yzyx{~xkvututflxztopjkx{zw{uq~x{uiw~um[xg_l__b\Yco{oqx|sky|tevzyxw{qrxzyxuiw~vvvoz{uyot}uy}zgg{pqZcsXce]`^Y^j|~~r{qvjq{yxuw~~rkstyoughy{tpslqu}v|~}utzzqixvvh]wd^jcba[[ermsyslwpkzxxtu~zmtsuvtgy|uxuuzzzy|~xq|y}zywqdm~tqkWmjXdea`[Zbnuv||pwzkzyyss}~wiqn~tmuco{xprrqurzw||t}{{xxjoytq]lp]bjeb\Z`jtqw|oxu}kyyysq|{lsn|m{jp}uvwwzt|y||t|w}wqtgkysqm\gl]\ie`ZY_hzv{twp{yyqp}uiqjxhwhkzwprrusoy{{~xyyswizt{lb__fzuzxp|}s{}qbr{p~tzpwvunq{||xcz{tu{ylq{s~z~}{~wnpcs~}w~|qsjfhp}{Xdoiajmrumtsskl}|u|tt~y}yqokqwux~qs|s~z~o^i~nbghk^ovka^ah{xs~~v{zxy{uadtvv}yy~}}vt}pkhil^khdtc_mcljjqpv}yqr|}}gx{mfm~}x{wqtwvua`o{lyuchejhhc]f|wiqktyp~wtztomotg~x~{v}z{kbgyvuqbtteZ[\jqrrryy~r{ukyu{ndgv}{|~vz{pkhqis~o{tkveijclciory{tnq~u|dwvkjtz{{wsu{wryrsdfq}|pgmqkia]g|ujsix|p|}swspntuixz||{}}p~vidl||vzhr{j^]_koqusyy|{~wtyett{rhju|v~wxwtmjhtotqw~lrmmncmdfnu|}vnox}qim{|vlmw{x}tvy{fyyovklr|{jgxqle^bu|krlnupxopnos|p|u{~{mpvulfnszvkyxf``gpktzy{yz}tvkd}uxzoossyv~wlihiuxuxpwkoruemhclt~zpnsn{rhrxwnnyzxwy~bnvmwppvysazyog_bqnsml{mz~mjlott~w~{~{|plprkhqux}pv|ldcjojw{zzww}xr~mdyryyqrur~wv|~yvfdgkxwz{s|kl{vgpfdlwxonvquqmovsmp}zzx}~{~yapnovnrxvpe{qe_fv{puhtzl|}jfloy{tx~w}y{vqknngiwx}tyzlfgpgtz|{zxtw~uqzgosr|rqr{{o{tz}x}maehrvp{{ygxmolchrrnqyrntnpsmlw|z{|v}llmkullq}{gxyjadr~swjp|rssdinwyp~~}sw||qyokleep}~w~tlkqgrz~|zvqs}{nunqpr{pnow{s{v~eehpjd{v~yy\lxdostx}~qnr}si{sptrtnfzuqsophnvmnr~}rt\]vywxjx~z~rn|p_enzus{{nozppurbumddadoy|}z{rcduv}}zupr}}mntvluvuwc_|sq`ltrwphsnXYalgdwpxnvjkjozwruzf|}rsrvzihzvmeenrb[eiY]h_^`jyvqyuc]jnw{wqox|womousovropTal\WUXaknnj}ylpkhqn}wt{}pxzv~usxjam}u~sstidm`QVbeZkmfw|j{upqjq}}y~rnutwnloktx{qpvs_YmfRaa[]bnx~xpxsdcqt}zsr}~oqvntpx}sxpTdm]STZenokjzjqppsnvt|~mxvw{rlskepvtvodkdTWdd]qmhw}{pxtvsms~~~tmuqvmeopxx}rputcUnlS_b^`gqz~y|qrvkitx~{|rz||smooyuzsuwZ\neTQYfpspk{}kkuwzqzuzsoszsvhkpkr}xsuvhcj^U_g_pvlt~}wyutqx~uv}zmxpr}}zw`ft}unptnX]v^Ycacit}txylrtpv}|~yvvppojj}}vq{eXfn\PWdqvuny~}{tfs}v~wy|lv~witkdnqv{stxpbggZ^g`qzou}~trxymw{yzstro{|uzxbcuwpqsp\]ud]baelw}ou|mnttz~{~x}rjluggtuzg]fo^QXgsvso{w}{}ugtv~x{zp{~}ofukbkry|wx|rcgj^bccyupw|{qpyh~{{}vxop~ytys`ezywstum]kqcc`bhr|~{zxk|{kmtx{|~}|{ylevt]qz~u~rgblmXTantsmuuq{ok}w}|uz|vcqtc`ks~z|qesoadgkorv{yspwxwyktz~y|kfsx{um~~|ygnf^`^emw{x~z}x~~vq{}|topxzyzz{}~wv~umd}oRGSbiifoii}x|smjmu|npv}yxshnybPSh`^dgjmqw|zsrw{{olro|zmt~|wutwja`i{e]^dkkecjy|vuk{}pyzu~ytmnxuuz~~~~~lchds~rmomf`g][ryy{{yzv~ytyukggkp{~y|}}sgdmz~vn|rgigfehmstnh|yx}zpirlu~~|y{zq}mc__dqwtwzyphiryrzyinrm||vxz|{qns~~t}~|}}sagcgx|{{{vlnk\iwwyz{xzx}{v}}slihkr|z~~nffp{~~uzrnnkgfhnsrkky{~~lnpky}|~uvxjb^^dwyx}|skluvp|uio}rk{{tzvzqouu}~{{|nagai|}|xptn_mwwy{|xw{}|{u{|slihjs~z~{}nffp|z{vrspkghmsrmk~~{|nnrky~zuvjb^^cv~w|yqouwpzzkmv{kqvwvy}tpu~v~|z|~r`feg{~{ytvweiwwy|~|wy{x{uw{~|unjikq||}}t|~pggo|w{sutpjhkqsokwy|rmtnv~u~|tjb^_dttlnvvd_nupgdmcbrlb_akw{z~|z~r]eyxsrtrwxefqprv{|yyv{stx||yqe\d}~oXfurtt|s|qmpnjechnqnm{}~xw}rq~zny}ydezqYLHMc~vq{qu}{usvrmyukmpx{ogqupqyw{yfttmgTMUNVkvrp~wuv~uhswuvyytkhrzts}}}{wtqpqlcbozqo\^jd\Y]ep{vyxtld``_]^p||~uvshpguqhijigebaaetyme\Z{zrpusgjwxnmqdj||yx}~znmlgzsu{y}wrzsu~us~~wtt~nhrvbszqsuwwxxxwwbp|f]bf`dtysuxkryuvyxgZZfsvzujzprxw{vdf}yw}oZptnopomifa[WcyxyyqbXjtv{xtwzqsw}|~ucWZh|okw}vomok\Z^Wau{|}ujqkeivn|zyvttw{~td\p}zorsjicS^nqssssty~}|x{|vmb^ahq{}t}}rwqjn|jnymhlpqpmhb\Xbusry{mcqut}{y{tjq~tf^^ep~xzttsfcgZWbmqmnu{xnkow|}{}~}|}}zwxhX`jl{~zwtbbpqmjiikqz{~sfZUW_k~z|mlka`k~w}snkhedcc`]`s{v}~~yvqekyv{~}tw~{vxyzungcejtx}{tsvrhom`bjqrkjzu|}|}sqv}v|}{h]inrxz{~xflxwspmjilsxuovkb^`eo}|~u{psqgdkyzwrlgca_ZV[pxx|rbfpmt~~|y}u{zxqg]X[bo{{plmjcmrhjrxyupy{zupyvoov~||{zz|}ytg]jsvtmpvwhjz}{xvtrt{st{uxyumfcejr}u|~~}lmsminz}~zunjgfeabpzu}|~yjeqpox{xu}~|{utog^XX]gx|vurhkrgcjrwxtu{vlttljoy~}~|uplbWcrwst|mgsvttuutw}yp}poolgcdhoy~xtqbfqqpv{uwuqkhghhfgu|u}yx~qnyvvz}zv|uyttqkc__dn{ytjqtgdhmpqpp|wr|{tsw|~}{~xuqd]jpstvlmvurrqpqu~yxvttpkedeit}~{nbkojip{vtxtmgccfhis~|}~||{rgosow|wu{{zsljfa\Z]cq}}|zrt~vmortvwss}ukv|wstywx}vtrh]ekis|t{w}|{zww{xnyttrniecdk~~|qclqkfgmw}|tnkkjip{vs{x}}|rfklekv}~}ywnie_XUSWd~|ps{qjloqsutpvqhtxsppu|{{sqoc\egdp}}{{}}}{yx{rm|~upoonliggp}vw~lftwqllnu~|wqonmlu|qp|}uq}wouphmuz{|}}xvqnhb]XXbx~sv|qjjkkmqspsxp|{vssu{z~}}|}|xui`eb[bnw}}||{yy}yuwsqolhdahyy~ytfotojggkr|}zsppqrz{uwy}}vlqpefnuwy|}wniea\XUZkyv~~{tssrqsvtnq~kr}|xtrruz{}}}vtmabe[Xakrx~~}{rx|z}upnliea`kyuuys{keopjfccgp{zvsrt~uvwy}zxnipjbfouy}~|z|tib^[XUU]qzy||{sssqpswumm}yhpzzwvuvz|z}|soi`ei`_gqx}~yrxyry}wpnmljggq{z|{~xospfpsokjjmt~|wtrs}vs}|y{smurghouxz~w}|qga^[YW\mzwy|srsssv{}wpxqoy{xvuuw|~{{~|{|}ypi__gb]cnv|~z}wu~}sligfddl{}xunyvcglkihims|}}zxyx||}woiqrhgmsvx{}orxqe]YXWW[kxu{ywxwuvy|xoqsnuxvutsuz}~z{xme[\e`[akt{wtoy|sjeccbcm{{y}|}|rkuqbehgfgjnu}ywy|y|z{sjhsqikqvz}{|}whmtmaZXXY[ctzwxxxvtuyzumrrtyyyxxxz}|}~~wzxnb]fh``gov|wyoq}~ulhgffkx|u{~~~|zz}~ypp~}nkmkjijkov|xxx{oiqsjgjosv{z~oktvk`YWWW]ksnw{{|{yz}|usxwyxvvutuyy}}~}y}paZce\Z_fls{{|pmx~vlfeddiuvov}}{rpxwonmjhgffinv|{z}|{lhqpfdfilpv{}|lgqul`XVUU\hhdp~|yy|}{uu||x{zvutrqquz|xw~x{~p_ZcaWVZ_emwy~pjt}wlecbcjuslu||}}ztqtrorojggffhmsxvx~{}~nirrifgilpu{~z}nejtqe\XWX^jiblz}zy{|{wvxxyzxwvutvy{vtzx{h^ef\XZ]agow~{{ymo{wlgeejtukmz~|{|~~{wvrpwwpjhgffhmqqo|~zkntleefgjoty|||}mgmupcZVUXbibanz||xt|xuutrsuwwqt~zv|wc]daXWY\_fnv|}xmnx}vkdcdktqhny~}}}|zxtkkvwohfedeglonn~}~yknqiccefinty|z|ldgoodYTSWahaanz~~~~wnwxtsrrsuxxsv~zrt{xf\baYWZ^bhqy~|pjpyyofbciuvlo{~|{{{zxxujboysjffghkptsq|zrnsohfhikouz|w~rfbgolaXUWalhcmz~~}opxuttuwyyts}{~vqwznacc\Y[^bgow}wnnv{ujdchsvmmx~}|||{z{zm`kzwmgefgjosrpz}}tormfeghjntx{yshackkaXSVakfbmypp|z||}{rrzy}}rdjwrx~wpvunmppoqvy}~x{wqr|{vxww|}||}kr|}~}}}|yyzvf_p~xvvxz}zyxdu{{urz~y|}xtttrqrtuvz~tpv{||rkgltupklt|mlzokjkmoqsxxldr}|}~~wrz|vwzvkdnyy~{}~xwz}yqs|tjjuwpjfdhquqmlr|}ttz}}|}}ymj|~~~~xmwymem}|ywvxxupotvuwvpmnonnoppprwxqopr|}xtv|~yx~yli|}xtrruujbkz|wvvxyzxrow}wppsslehu~{y{}~~urqq{}~uojfgmrplkqxwqsxzzz{{{}}xlftyr{{xxumegv|xroqrtwsmlmnooprrruywrsspt}yuuy~~zy~~ymfs{yzxmekv|{wttvwxvqpx|vqqsupifn{}}~{yz|}~~wutpsysojhkpqnlpvuprwyzz{{{|}{qhn||tx~{yxsjelz{vqooswuolmopqrsttvyxstvsqv~|yuv{~}{}|shjx}}|ukjqx{yvtuwxxtrv|ztrrtsnhhp}|{~{{}~xturnr~ytqlkmrsqquxtrvyzzzzzyzzvmiq{{w|yvusohfl{}xspqvzvpopqqrsttuvxtprurpu~|yy}~|zvohkxwooty|{xvvwxwtrw{xsqqqqniip}}|||}}~~}}zsoqqor}}yuqnortssvwtsvxyyyyxwwwtnkqz}z|~~|vrpomjin|{vrquzxsppqrrssstuvsopttru~}zy{~~{wuspknx{trsw{{ywvwxwusuzxtqppppnmr|{|~||}~~~~|{zxrlmqrt}{xuqoqtuuvxvsuxyyyyxvuttqorz{|~}|vqnllllp{}yuqtz{vsrstttuutuvsnnrttv}~|zz}~{xtqonmox}wuuwz||zxxyxvtvyxtqonnooor{}|~}~~~}|zywunikoqu}}{xursvwxyzwuwyyyxxvusrqppsy~~}|~}xrnkjjkmr||wtv{{wttttuuuttuuqmmqstv|~|{~~~~}zxtqnlklqyzxxy{||zxxxwuuwxvrpnnnnopt}|}}}}}|{zxwuqkhknqu~}zwuuwyyzxvvxyxxxwutrqppquz~|{||ytpmjijknt{wvy|yvuttuuuuuuusonpsttw~}{|~}}~~|{xuromkknsz~|{zz||{yxxxvuwywtrqoooooqw}|}}}|||{yxwsnjkmnpu~~{xwxz{{ywwxyyyyxwutrpopruy}|}}zvroljiijnvzx{|{xwvvvvvvvwwtqpqrrrsx~||~}}~}{yvspmjikmqy}}}~|{zyxwvxywusrpooonnsz~~~}|||{zyxvsnkklllou|z{|}}zxxyzzyyxwutrpoppqtz~|{||yvspmjihhjoy}~~}{yxwwwwwwwwurqqrrqqsx~}~}}~~}|zxvspmjiikmqz~~|{zywwxyxvtsrpponnpu|~}||{{zyxwvsolkkkklov~}}~~|yxyzyyyxwvusqppqpqu{~}|{{{yvtqnljihikqz}{yxxxxwwwxwtrrrrrqqtz~}~~|}}}|zywuroliijkmr{~}{zyxxyywvusrqppoorv|~}|{{zzyxwurnlkjjklpw~}zzzzzzyywvusqppqqrv|~}{z{zxuromjihhilrz~}{zyyyxxxwvsrqqqqqrty~~~||||zywuspmjhhikms{~}|zyyzyxvtsqpoooprv{~|{zzywvuspljiiijmqw~|{{{zzyxwvtrpooqrsv|}|zxxxvspmkigfgims{~}{zyyxxwwvtqpppqrsvz~~|{{zxwusqnkiggilpt|~}{zyyyxvtsqpoopqtw|~~}|zyxwvtsqnkihhhknrx}{{{zyyxwutrpopqstw|~}{yxwvtroljhgfgjnt{~|{zzyxxwvtrqppqrtw{~~}{zzyxvtrpmkhggimpu|~|zzzyxvtsqpooprtx|~}}|zyxwutrpmjhgghjnsy~}|{{zyxwutrpoprsux}~}|zxwvuspnkigffgjou|}|{zyxxwusqqppqrtw{~~|zyxwvtrpmkigfgilpv}~|{{zywvtrqpooprux|~~}|{yxwutrqnkihgghjnsy~}|{zyxvusqppqrsuy}~~}|{ywvusqoljhgffhkpu|~|{zzyxwtsrqqqqrtw{~~~|{yxwvtrpnljhffhjmqw~~||{zywvtsqpppqsvx}~}|{zxwvtsqoljihgghknsz~}|{zyxvtsqqqqrsvy~~~|{yxwvtrpnkihffgilpu|~}|{zzxvutsrqqrsux|~|{zyxwusrpmkiggghilqw~~~}|zywvtsqqpqrsuy}~}|{yxwutrpmkjhgggikotz~}|zywvtrrqqqqsvz~}|zyxwusqomkigffgilpu}~}|{yxvutsrqqrsux|}|{zxwutrpnljhgfggimqx~}{zywvtsqqqqrsvy~~}|{zxwutsqnljihgfgikot{~}|zywrsqqpptrvu{~y~~|tronloqsvkg`]cmpz~}xovwgg}srpfkt}tsinxmgahV[ahZexolcz}z}uwvwvv}qr|{t|jz~{}}ztxseqaZfgYQXnnbnwzwpxjlyyunkhpu~pn}n{ggjxztpnljfruYlxuoi|}w|okgkviopt~vhwd~nZaZnmg^b]lu~{utvwz~qv}zwxwfpxo}uzvvw}zxttgl^uY^^Yppml{sv}n]qilqkv|scu{u|x{^wyovpuu\rnp}nyzor{q\wbP[Z[srovrxt{n|vewz}xs{y~txzxw|fokllgu{a]{o\KS\f[lfvsmyhw~zcutdwy|ru~~cus]h~yxwzlvdj_[nd]q\_qegqgmutvstsusq^f{yvbytz|`_kmxrcliotV]gOjWVd{r}v{y~vkpzurhwjx{}{z[\bzuxkvifOlMpOTPgt~r}t{~{mmnwrd|yr|ty{z{x]`^grl|my]bXX~WaZgyutg~|od}wwwerqqtr}}|ne]fal{yxrlzjehZdhe\s}|}ni~{zuawpmypo~ov|p{nfVgWeqqukkZuigkeqxty|u_wsz}fzxkwyl|}nvus|}{||}pcVhbaltssplbvhdkakspw{[{|u}lzrfsxpz}tmt}~yyyxcW`_ao~xtki]uf^hgnoor~aywxl|xfltnr~tnyv{zt~n[dccp|ytjiavlZfdnsut}kq{{|nszgepqsyoy}zxuyyz__\^mxxkf^ox^egntxsuri~}yzsmmflno}zztr|qve_`Xfp~uldjgcdjswxt|ya}|||~~d{tilrq{wl|puw}vxmZ`W]j{}qfa{vbihqqxtv}eqyx|{nr~okomquwxwvuzryv\]\Tfpxmco~ceennvyvzq_~z~|ewskosl|wr~u}wssyhTaVbl||rgd{sbilootxvfpyxz~rlzkhpon{y{~{yxypvxZY_Zjrynhlfcjprszx}z_|zyz|grohjyny|sxyy~qpymQ[Zaszrigxcgouqtuw}pdzxxw}wjumfnyp~|t}yzxuykoxfP]Wixpjmx`grttuwu|hly|xx{pkumfu{y|wt{}x~sqglu\R\\r}jgptalsrtutuzex|yzyyzlqvlgzyzpyv|~wt|heopVV[azygkvibmssxwtwpfx|}zzshtrknu|}s|w{ozubfpeQ]_ondm|egsquwwvygt~t|{zxlkspiyz}{wwy}xl{hbjpZW_cx~iiuqcquqxzwwqcuxzyzsformpu|s}wyktsaeocS\apqgs~glwqtyzvvcu|ryyyxjjqpk}{}szz|thwealmWV_h{~jp{ogvvqxywxlfsvzxyphppmux{t~}x}guk^hp]R]evomzxeszpuxxvqbvs|yyuinpnpvq~zvlmo^dreRXaotjy~gmzrtxyutbx{q{zwwllpom~ysz|z~~sis`aokVV_j~zjxlj|sryztufq|qz|wxmkpoj{z|uv|}z|vhub`noWT]eylxriztsy|tsgo~owxxokopkyyxxv~yzyitd_lqZS[ctoxvi|urx}vthk|quyxqknpkxyu|t~wy{jsh^js^RY`msv}jzyqv~yrlf}tq{wvkmpmr|psvy|mon_ereSW`f|zsmv{pu|}snc||xn|xwmknoo}p~t}x~~yrjp`bpkVS]cx}suqssyuqfqzpuxxqkmolzvuzwvuzgpf^jr^R[amx{n~xsv~|rkgzvo~}vvmknnt}qsuxynkl^cqhTUae|}utusuzuoev|yovwxplloo~tyxy}vsxgnb^kq]S]bqx~oytw}qkhxvn}vvnjnou~rsu~}vvohk]aokWUce~uxtsuyvogq|wqrxvrlkpp}yx|us~pwgkc[fqdU\en{zs{{sw}slg{wwmxvvoklqtuw{~yv}zosek^\jp_Ucgwx~rxtw~qjiuvk}}uunknrzvt}tzz|sqndh[_mm]Yijvtuvyzohm~utlzutmkqtzs~qzzlrgfcYbpi[_mpwyz~sw|ulfxvwmruvqllsxzxy}yr{|z|vkpbg\[ipd[in}yuwuw~piirwi|}tuokouzt{qyw}w|mnicdX`on_`ppw}ytwzwmgsvvonvvrmlsy}zx~ypyyxxuiocf\[irg]lp~zxwwwpikqwh|}tuokpw|t{oz~v|vyjnheaYbpm`dqrz~~}uw|ukhwrwmpuwrmmt}|w{{urvzwwojlceZ]lqe`pnz|uxyzmhpwttixvunlr{}|wzo}xxyuthmef\[hqh_ln}}}wwwpil~pxg}}uvpkox}tznyzu{ttjlhf`Zeql`hoszwwrjj~ozixuxrknv{uzow{u{ttkkjga[com`enn|xwtkk|n{ktuxsllt~zvypw|u{usmkkhb[bnmacmk}yxvlkzo{mqvytlks}zwzru}|u{vrojkjc\`lncalgyx|{mkuswtkxxwnjp}z}{zvr{}vyyqqkkke]^jog_ke{yzyokqyq{g|wyqjmzy|x||oy|wv{qplimh^]foj`igq{{{wskon}jxwztkkvz|}wzpv{yt{tnoiklb]bmnddkf~{y}{mmvrxukyzxojq|{}}{wqxzuwynplhnf^^hoiakex|{{xrlq}o}h|xzsklyy}}xzouxwtzrmoflm`]cnnegki}|x~{mmwqxtkyzxojq||}}{vovwtuxlnkeog]^holdmgx|ynjputosyqvqijw~pk|{siiW\acbjhbkeioc^bmqkjl_xxkkkaicbf`[artryzxi||ntutt|sszq|~st}~ygYy~v{y{v}vd^f}yt|}{sowh`|mn^V]`_ch^ce]kf]^golbd\mpYTftzjicZYftmts|xz{yssiuutxzyuzx{tu{zl_\U|w}~x~xtso{s`[d~x|vyzjfd{o\````g_\fZdi\\ajjbcckzyydSVj~|wqfahwqtuyywxtrrmuxrwxx|rzzpvjhkldZ^\|}}{tunyub\e|~z~vw{xugigxceddcib]j]fn`_dlmfgfnssubSYm~xlfm{rwvzyvwsrsnxvruvw||p{xosihkkc\_^|xusnzsa^iz~wzvxphhjvefeefk``l\ln`afnmgidu}|otq]T]sxlhtzq{s~~uvsu}qrmrutvx}wopuniilja_\e{}swnszl^bp}{w{t}jidrnigefji[ke_ugadkplifdupwiXWczvlo|sxwtz{tuptsmqytuuw{}n{{lwlklnha\Wxvwrp|sc`hx|x{~|tpldgyolghkm]hm[uncejpnkf^wzrzq^W^nx~rp|tuyox}sto~xvnlvuswz~pvj~nmnplf^Si}|vvn{yiaepxy{y}}u{wngasuqkklpe`t^lwffioqnj]i|~rxxgYZcqv{sz|r}px}wvsqswtktywstx}xltquonqqkfWYtx~v{pu}sedjtv}z~~|ysrnce|xqlnpp`lp\xrfhlqqof]sy{qztcZ]grx|wywm}zzssny{xqkyywruy}tomxronppkdT_vwuznv|qeelux~{~zvs}qmbiyrmprp_syozpx~zrz~yzjdjurhU|wZRM\mab^\l~zxtx}}kdwututogWby|lnu[aYaibXZcox|qtqmh{xkibhxeKhzmXWY`bcYRivr}{}ymwthagski[|iYPUi`^]Yf|{xvpnonifwttwurdhmivsk^Yd`VT]hty}yrr{tzritqqnooe^[[gsgacfebS`vuu}v|rryrikv~to^hpvpe\kmac^bv||woiceipm}}~yvxyyrizmslq||vejkb[_iu|}|twtmztllvrtrzoaWX]eixropon`ay}w}ry}unwtlkvvkk`iywzndnvhjfgw~}}zojbchppyyuwyzvj~wgqpu|jlph`clv~|sttm}tlj}wsvtym_VX`il{uqrrqcc{~x|}pv~}vowuonxtjj`l|y}pgrwkmijz~z{wmhabhpo{}yvx{|vlrgqpw}kpqicfnx{zrtpnztkovvwvuj]VZbjo~wtvvsbj}}wy}}~ny}}rqxuopzqkh`sx{|pkzumoin|urle`cjomzzx{}~qrklrpyzouriekq}~yvrtjv~u}rl{~uzvzrfZY]dfzyyyymcv|xvv~sq|z~~qxysot|{pmbgwo{qyrtnlw}zwxojbbgkjsz{~wluksoszuxxpiinwt{tulo|o~xpxw{xvwn`[]``juds{wr~u{~~xp{yz|uy{vqrxvqedrgvz~xxsnu~z}s{qldbfifi}{kz}nurpt}~}~wolnsuwwvnkynpux{{{u|}ug__`__zjo{wstxu}|ox{xz||x}ztquz}umboke||ss}wq{tphbdhgctyrqssupqtwqpq|~n{wsisvgy~}vzyxzpd_``]fyjyzwpxsw{~vqzyxyz|~zutw~ztgeqej}uwwo}rnfbehfeyzow~ottpru~||sng^ki\rzq}yjfpkl||vw|}{|nsmb]ktglpw~mmxwyysqids~xxux~~hkzqfxtdvtljdbglkl~}{trwx}yv{zwi`n}xmYptnvxupnjdrtgxzvoumjyztluvfdm__ekufbmoqtx|hcekw}}yoofvvyzblpfd^[_eggvyzpnu||~u__hxnsqtvuokh`hthnyv}qdjqo|y~qin}szrcgito_gmnru|}yg_gpy|{~|i_jqywlxohd]]chip}xxomv~}{|r^_n|tw{yunldcuqj|~qwreest~{vx~pipz{|jhjrucenptw}yyzl_gr|y~uwi^hv{lwrie_]cijo~wypnw|zzyr`_oswzyvplfctuixprredtw{uw}~~}pjq|zlgjrweenqtx|wwzmait~x}}}qth_kw}mwqie_^cikp}}vyqpz{yuxq`brux{zvpmdewriy}mrqehvwzuw}~~}|olt||~kilwuchprvx}swzjbkv|~wy~wpqebpwzqyoje_`fjkt|ywwqs}{~|yuyk_ft~z|zupkbnwkl}vlsmfqvw}wuy|{}wnny|yjkr{lenqsvwxr}ueeox}x}~vprncjsttyumjc`ciiowyw|tqv~z|zs|ub`jw{}~}ztodhwnguzlqsinuqyuw{{}snr~qms~rfnqsuu||p}|iejqz{xzt~srtikpm||{ypmfbchimtvxzyst|~{|{{s||h`enz}xrgfvqen{omunovov{vvz{{ypov~}{ps~{imrsuvvovqfglt{~}vuvznuojqlo}upkedgijqswx}wtx}xy}~}xttcbgp{}wncpwifuwiqtovsn}~xuwzy~~~upqyz~xrytjs|xzux{|}|{dw|le|qvlkmhjfcdhimrmjp{ncrhqs_gxmglsy~vt}wmfw|rv}fuykoqmsqrspptvw{uos`Qi|khpbZrujkquyyzvcwv`kvwnlkffc`aefiickxt_m|}zbfwmeiov|pu|qk{uv{yvhe|wxqtqqqmlnqoqlky{nmmZYs{ucu|omptwvuwvey|z~rvokibt|urjiea`bbbeco~|niooessi|xllqv{}}xsvjtvpzsnrklkj{ywrsokklkklk|xd`gd`umoypqtvwtsz~ny}u{vmijdhjuxuojhc``a`dfm}zqbepnshsrmpv{}|}u{om}qsxhkihoq~zysrpkiihgllz|}ydZbjgvvjsqtvvtrvwvt}|tymbfbhpy|wqkjea`a`dio}t{p_`nsvkowoqvz|{{z|ql}~rpzyfeggqv}{ysqpjggfflnzzxwcXbmmzzkurtvvtqvzx~s{{rv|k^cckt}~yrljfa```fkqyqwm\`osykrwqrvz{z{z|pn|ppzubdfjtx}}yrqnjgfegmn~vvt`Yenownustvvsqyw{zqvouye]ceotyqmkfbaabikutpuf[eqq}}j{urtwz{yzxluumrzm`ehosy}upplhgffjlo}sxm\_kkqoy{ttuvvsu~{rsv|ppyq^aejpswomjecccgjjznsp__lloqs{rruyzz|v}ppznnxuccimqn~xqqnjhhhjlgzuwuc_iggzwuwuvwwuu}zmyus}qowvc`gkmiy{qolheeehjdu|oqtd`ihewysustxzz{tyto~|pmuyhbjoqis|rqpliiikmenyuzlahhantzvvwxwu{}omzq}tnryl_fknhkvrplhgghlfgumtn`eibi}t}zutvyzzyq|owumoxrbfnrlh|wqqnkiijnicxsvwgdkdct|zywwyywxxjstt|pmtwe_hnnequrpkhghklcn|plsi`ggamuzuuwzz{vsyp{rloxn`foskkvqpnkiijnge}|quteejbfy{~zwwyywyvkwruynlstb^honguurplihhllcq~{oiph_ffbpv{vuxzzzwtxoz~rkmvn^cmsmmwqpmjhhinhe||opsecjeh{|{xwxxvx~ynvrrznioscZdnpkwvrpliggjnfo~zpfli^cieqx~~xvwyzy|v{ou~ukiqq_\issq~|qpnjgfgkmfw}pioh`ikk{y~ywwwvu|vuvnx|phhojX[issw{rpmifegnmkysfcia_jmrw{wvwyx{}ro{ylgjqeXapywtomjgddhokr|rfikafpp{|~zwvvutz|xymr|rgdjkZVeuz{spmifdfmqn}xsf_fc_kqtw|xvwxxzsmxymefngW]o||}vomjfdchpnq{rdejbgrt}}{wuuutzzxlqzqfchjZUew}~somiedfnro|}wqd]ecamrvy}xvvxx{~qmywkdfmeV_r~}~tnlifddjqnu~}yobejcjst~{vuuuu}}|uksymdbhhXWjz|}rolhfeiqpp~~zun`^fbdopy||xvwxyymr{rgdhl_Wfx}|}qnkhedfnok~~zuiaihenpuzwvvvyy~{nnytgbdkaT_rzywqokhfgnqlx|wrh]cfbilo~~zwwxy||rozwkefmgX^qzvvpnkhfflohq~{xnbfkfjll{}yxxwy~vx~rnywjddkgX[mvrz|tqnkiinqio~yul_ahdfgft}yxyz|yzvpzzngfll\[mwrv|romjhhlohi}ysfclihifq{yyyz~vt|wnvzofdhl_Wftqpwsqnkjmrlg{|wqe^fhefbiz|yzz{{w}}qv}tjfinfYctto|wqomjijpldr{wmbgmijegw{zzz|{sv~rqzvjddjiZ[mtntvsqnlkpqhkyuoa^hhfebm~{zz{}xxyqy|qheincZgvrpvqomjilpjdv~yujahmjieiz{zz{~ysx|pr{thcdjgY\ntowvrpnllqqhm~xtm`]hhgeco|zz{}yyxqx{pgdhlcYfvtsvqnljikplev~xuk_dmkkgk{{zzz}|vz|ppytibbgh[Zlvryvromkkprjm}xsmaZejihep|yyz||{yot{rgcdjfZ`tyvzqmkigiophq|xtm`^jmnlmz{xxx{z{}rlsvkb_bgaWdwz{yroljilsql{~{zsofY]ikmlp}ywxy~~|qnwuib`eh_[m}}~rmjhfglrnn{~xsnc[dnqrqy|xwwy}}tjnumb^_edY_u~}rnkihkruoxy{rngZYgnppr~ywwy}|qltuja_bhb[j~~slihfgltqo{|xrndZaosutz|wvwy|tjmtmb]]cd[_v~qmkihksvpy~yzqmfZYgprqs}ywwyzoluth`^bga\m~rligfgntppz~vqlbZcquut}{wvwzzqiotj`\]dd[cy{pljiinutp}{zwplcX[krrpu|xwx{vlowpd__dg_`t}pkiggjrsmv~z|soi][jturszwwy~}~vlltqe^]af`\l}~volkjlruory}sni^Wcprnnz{xxz~{pnvuia_bgd]jz|unkihjosln{vqmbZdrtomx}zyz}z}zolutia^`ed\evx|{romlmqtmm|vplaX_nqkgq}z|{~xtqpikdb`n|{y}vtpln}wkzqu|ma`vvxwkjz{}}y~~}ois_LObomgtzgqhlm^X^bl~xs}wwpiwq\xxtshenqrvvukci]TX[Yis{xlywooquu~vvwmryojomwddxz|wr{slw}}mfae\b{yxz~kbbihejooev{uxnv|~slv{upovuhnxuvtcpw|wyoltr`cr{xqjs~tyxh~y~jbfighinzznnjoyrv}xzqjhffko{|zuluiecb`hqq}|rvyrvmjorutsys{}nxsju{vsqh{~{oym|tyr{{~r}wrehZjpxwxqv~r|}vtdibl{vtfnej]o~uzruxu~lrtvfppytt}oqr~vpqgntkfqmx|~u|vuy}wqrwwwq|x|~mulkiid`zuxx{r|osu{vkkgjcz{{nqrXZ]p}~z}t{}}|st|ul|igmwy}}~qjqfvzqyj{{yu|zyv~wvtm|w}hknnf_y|wuqz~~zz|s|~|sippocz|{rqbhspx}zzt{}}z{tso{uumn}x||z{}~kx|~u}ssoj}nuzzyvo~~yws|nx|unpz]Z[gu}}~t{|uzw~wp~c[_j{sopbhdlrzw~}uww~|xv{xyqwlsuy}~v~vlxkjmuwu{{xw{wu}yw~n{|zwm~zxz~~~|{tgqqjkw~}yxz}x~z}pnuzioupq|~}ruwkaw|wvyzrw}~|}rtywu|{o{xw{loosqpw|~|utyu~~zspuwxilnvz{}wxnojfdo~x~~vvqqqx|~vsqnjjt~u}nb]mucox{|ztw~zuhfwpw~yypuqltx|xy{y}zqmnqww}zxqy{x}odwzun}zusyzz~yz}z{wqtp}~{}snmlivt^g~txqqrts_]lu}{t{zsyt{v~ppr}ju{}|vz|wuzyporez|{duyk^\irz}~q|uyzxwsxsmxottpw}jhhlll~x}rwzzxw|jpxtu{juo}rr~ooqjeyw{ysp}|yqrzwmq{m{yx}sm{{m|}z~}uudgrvspt~{pormltapu{x~yysy{kt{okvus}hnmkorsxw|npyztw||qz|jp|tyrvxmmyzv}v|v}wz~srr||zsm||s|tulgZast~|y~~vvns}z|zsy~|z{wzunqpfyqs||rwxxjpz~{zxtr}}|}~ylrqqowrxxrxz~}zu|ww|uqyztsm]flvzxu~qnrzvoy{|tw~x}z{twrio~tuz||tsxnx}r}wtu}{~}}mprleg{~z~}~~~twx~|v|uyxqir~{}xiggiu~}z|zzzxs|luwtutszzv||{}~}~tgu~vsx|}xurthvynzwyy|~~|uz|v{ogapu{x}~~zzytrskzvpv|nzvykmpov{xvt}y}xxv~wqtoox{yzu}~rnzrp~}z~|}ttlrsp|sy~{~zpv}~~lefxniz}}yyz~{oxrl|torqxuyywquuvtuu{{w~xs{{|u}wstmlsu~vyx{yw~pxpw{y}}tpqmwn{}os{||stvojzpev~v}|~w}}v|unwmhh}sv}{w~y~}{tszpu{sy~zy|xznjrrt|z|u~utvyx{ptvn{|y~tronxw}jq~|}ut{|zvuoctto}|vxq{lfd{~mw}r{|~nszp~|{|{|~|w{{qpvpnsu|z{}vrs}sx|qmttr~{zrnwukxzvsx}xx|||z~|vw{p}m~||umwygag{`fy~~wwi{w{tyws~|~vp|y~ytwl{znps~w~wf|yp~nzwjanz~s}tr~o{j}zpmtv}u~v~|qp}~~x}pk~||vyof]w[`rtsu}~~ynpt|yzw{v|pzrtki|it{uvzzx~~sw{sozq{tux}~~yzqlrhqliyxw~v|t{rqw|}~~~rtv||l{cmr}wyx|z{{y}xvx^pxsnq}w{|t}stzvlrrm{vyrlrx}}vw}qzuzz~xymyuinbqpl{|ru{{}~yuvmu~|}t~nnsppgstiy{xu||}{xyvm~}|yx~~mttco`ptewvzvwvtw}{utryx~{~ly|yvctsvy{x}w}xvpshiw}{}~sr|~sx|rpvnnv~rzzlmsxs}{xlzyt{~toynhhwjr|uphxy{vu~m|tv~xxxvxpwkjlllxy{zvx|s|y|yk}{~u~~rywfvaf{hgh}~p{{|uy}xyysnysqvypkpfquxu~}}}~~pmll~tyz}~x||uuykisukqq|sxuol}wuyvpy{~~wvuttlhsxozy~kk~{~y{}{|q~xntmywy}uuznnomfmuqtyxx~zs{{s~~s}zyu~oofeyf_bxxsx{~z{~rz{uuvzs~uivojlsoqx{~trlvp{{~|}~}zw}skroipqirhxtmv~~|~~yqryz{zwxwllxm}ydmv{sx{z}|}~}uspjxpt{z{{sqnrprmmtvmx{yvztwux}u}xzvznqetue_ewkqp{wu~zr||~s}qvuklrjfkquz~|z|~~wz~wov|}soljutnsimospkroj{yrxujv}voszu{js}j|{rbhv~xTwypppk|}wunyno{|w{yZioe^YlyjipWx{zw_ttodPXhurnuwsws{l]y^ldbys~nju|nwym~p{}tdeSkuomsq~}mnws{~hjdyuspvxlgeuzjxu^{srprzyv\`_l||{ibqmX_bmceh`fk`ptbdv}zytxyiy{w~zyy|v|~t|olbVHVfpz~lmnzfqqer}kpzd~~}rw}uix^njcr~qpvpul~}zzjdV_kpwupefZocagYgna^eo[pxxzzzzsqyvpvt}{yzwvmZYVN`kwxrgx}euhhzwlmyjqyv}rhoirbhx|ptjt}mrbcVcn}xpd`[v^abYdoicjmZv{}vypr{yq|zpx{{}w~wkW[LOal|todwxhtin{uotfmxxun~ggndj{}|puhowq}j]dXblz|shb[y`[`^hkhjppYu}{}orvytwpx}{}vryvhOXSO_mvohwanlqywtxokyzwhmdlji}{uppm{kzhUcZbl~~ufg]vmV`_hnmjlu]h|}uutqzuzy~v}uyurnslSLVPgonokqdgkvxwz}{b{z~fptjlslyv~my}i|uy|tw|tW\a`q|}nd]fzXZ]dknqoth[|{}oysyy~y{srx~yqvelmZIYRdtspjzbiisvx}|dq}|}|{kltikwuw|xoulxxvxysntt[[cav}shdb{_W]cklqrvq[}}p~zuz}~wssz{{mzvagl]KZXivvqm|_fkww|{et|~~zxkmtnkxuw{{nwlyux{xokurV\aeyzrgck}^Z^fknuqwm`|~~xo|xv}|x{xuxzjwkZdlYNYZqzwqpv_emwx|{b}x}}vtioqqp~p}up~zl~qx}ekxlU_^n||rgdwwX[akltxrw]n{~y}}rsyzwzs|x|wny\[kiPUWbr~uq|idlttz{mkyz~xtpjoqmw|qzxxnxzw{ujcsv\\_fw~~njr~bW`ilq{txgaz}xz|xvrx{yvy}x{jyeZipWRU\kt~xs{qaluvy}qgzy|trknrps|kz{}vrs~t~vqcqzbY_cnx~tktmWalln{vtm]|yt~wxquy{ys~xw}yornZesbPTYcpwt|eguvv}yc|~~s~vvnlouolt{~|y~zo}uzx~ejzs[\_eqylq~d\lolu}ts^l{~rxzyvrs{v|vx|~kxd\kpXQW]etx|xzcpztx}pf{tuumlqst~h}w|}wq~t{~xywdmzm[\bfuz|kw|a`pnlx~uq^sz}pzyzurs{vx{w~}}|~zju`^lmWRY^gvyyzyeuzuzzlhzr~uumkqru}iy|~~xp}u{|wvuckxlZ[dgx}~myf`romwwp_q{|qvzyupqzx{yy{~{y{gpaZho\RY`gzz|whs|vyzof~|ovvojnssk}}}~zozwz}|owcesp]Zcgvous`qrmt{qdf|wpwxqnvyuu|{w}yykgiW^leUVbeztuk|wv}ugt~sqzurkjrsys}~|vr}z}|{mqj^isg[`kpwn~fivnp{tk`yz{nxxysorz|zv|~{yz~~}qqajYYgj[Vbhvw}kzzuzvjk{xm~ttlhpt}r}}zq}z{y{{okk\erl^`np|mngwpqxwmasz{przyuopz|~xy}{v|}~}nrah[Xfl_Wckwx}n{{vzvjjzykuulhou~s}|zp}{yxwynki\frl^aoq{nnmxoqyujbwy{ntyyunpz~|vz{wwz|{~xlnagXZhk_Ygk|vqyw|shpyvj{utliqvzw~|wr~{wrwjmc^jsh]gnvuwmwvpspfguyi~wyrmszztyrw~ynpgeaV`lfZ]jkzy{wyymi~w{luuwpikszs~~rzxw~}xsqkj]dpna_mktxt{rs{wiewuynqxzunnv~yw}xuxw}y|slmfeX]ji\Ygd~{|xy~}nixyzqnxxtkhpxs{twzyz|{rtml`bnoc\jf}xv}tsw{keqyvtj{yxpls{z}}y{zsyz|yxknig\[fkbWbbpz|z{skpt|hwxohlt}vt~}rxu|}ssqoe`iqk^chj{~}~zttrgi~q|jxw{tlmu~xvxryv~yxqllicZ_ji]Zf`~}{zolxxyulzyvmhnx|tx~yv|{v{~{{qqqmbakqh^hfszxvuogmo{h|xzskmw{zvxqz{u}vvnjkjaZakh\^fcz{z|nmzuzsmyyulhnz{tz~yw}ytz|xxoopkaakpi_ift{xwuphln|hywztllv|{xypw}zszurohjkaZ_jja_ic|{}olvxuxh{xwnhmy}vz~}uz}q{yx~vvpkomb_hpmchko~zwu}vijyoypmxzwols||{~upyysuvnohfje[[fmh`jgv~||yulom}isvyskjtzz~v~{qs{ztywqqjjof_bnrkfrlwwvmhoyn{e|~xzsmp}~wx|lsvspumljcgh]Zbmmeioo|y~zmmxoxrjxyvnjr~{yy~uowxtvwnpjgnh_aksohsnwyupin~k|gvx{uno{xykptrnslijafj_[bmpikqo~vxpbakyelg]tjif_asw]YqfPSQP^WPUakkhtpxyvwu}{tWYpirswnssw~vxx`al~~nimbkmaaiuyu|y{wxnysfifp{neiwkynmwwm_`x_U^uw_]ONYMJQ^ebdkiz~|~|nZTi}x}lillyxyrs~yzyc\ep{tvpgwnfku~}|~tvmhgfvrdbjzrkvcvwpnd^hxbRZfwzs]h`RS[ddahbsv{~{~t}}qk^U\zrspu}xvouzxk\bgq||y|iwwijr{}yxut{rrjwyjciwxjxhqzrri_`vxhUX\izmtr^[_ghdhblv~}}y~|xxupdWUjyvssyyo{z~~zs_aahsxptmlpy}z}xz|ryvxxmt}qehr|mtqkzuuoc^i}}zu\WW]lqlaafkhhfb}~t}z|{{u{un_U[szywq{{ssy~yzh`aajwymzlot|}{|stwt{{wn|{lflwxmwlrzvvmb`q|~}zmXWV^nyzkefkmkldhxw}~{z}z|v~xtl]V`vyzwr{|svy{xxe`_akywnzoqw~~{trwq}~wq~zlhoywovmtyvvlbbu{~yxiWWV`qy}niinpnoekyw~z|{y}z|~u|wsl^Wbx|{ys}~uv~yxvxe`_akxxmrsx~t~{ouqz~{q}}pinwypuorxvvndct~~|utjWVV`qwumlptssjjuw|xx|z{}svuplbZay}yr}~xs||vswj^`ajw}yq{utw~wx|zopvu~rwwllsztrsnuvurieo|{rlm[UY`pqpnouwwtizx|yx~}u|}|y|zytornlf_bvzut}}uz}vqrq``bivu~n~vx}}y}suvplxvxr~{olqxwqsoruttmhn{|oil_UZapw|uqqvzzylv}x}t||u{~{yz{wtnomkhbhy|vjgg}y}vzxzyc`jy~ztetxd~suztzyno}xvtsoxuzzzy}ri{~v{xuzZWp|iTPfQ^sdeiry}}q~~~x{yq`k}gdodplfei}x~~uyt`alyyi{vhw{vmxxtq~kmhhwvnnt{{wvxyzytmo{~|zu\UathgmPfm`bfotyskz|zv{ws~wofeuy~vltifbpx{xt|qlsg_elyzuoy~xxritz}|opfpvpkntxxqsutuuqmr||lodV\evwoe}oiimtxxjs~vrvxrz~~}}~uroidi~y}ynil}{|v{{yktn`bdm}u{o}~vtsjptuwxkoxtnntx{srzuvwsmkx{lqjXXZg|kznlntxzkpu|ssxsy{t~}zvtmdan~rlkz}vyykstda_dsyo~}|rtmnsj~}rmwwqnsv|xo{xuyvpjn|~}zror_WVZlt|vpnsw|ri}yt{ovtt}qy|{vvrjacs|}rkwzzw|tkwkb`^gw}zy{ssqlskk}nsyupptwrr~vwyunjryzkrl[WU\puxsrw{}no~vuunurxzn}~x~uuphafu{~sn~{zy|~olvhb_^iy~x~{~ppmkshn}ovyuqruyottwxtmktxzhqiZXV^rx{vty}~nr}vttmsqxyn~t}rsnhchv|to~{{y}|ojtgb`_iy|||}nkjhrkmruzwssuxrpuuwtoluz{fkhZXX_ryxvz~rpxr~xkpou|p{}sz~oomifjx~xpz|zxxerkbbaiw}v}yrfheormwqyyurtv~{j{zqvurpu~~~}{}l_i]Y\apz}yy~}o}}tvnjmo|xv~{m}riljjmy}}ss}||y}gioddeit}x|uzwcccjwr~~rwz|~vmvowiS^[X`gwshj~qcYbUJQUekitv~k{vilmot}vgwjioeer\Xd\^cht~|xrtvb^`hzxl`imfkX[nbdikmqz{{zor~wu]hfbjq~ygi~k^WcZPV[knj}qmylyotvy~n`iozfdkRS]UX[`lx|yx}ytxuxxeeiu~o[cu{^co`beghmtrz|wtyoht{scpjiouvhftogm\TX_nhi|~zkq}{tytxz|~}o^aottxoV_]WZ[amwxwu~vu}u}sehl}~|vb_lzj|tillkkpptvrwvkm||gjnfjms|ngl{tvr^]`moes~rlu~psvwyz|wgamny}eae[[Z\erwwy|zuxx{{hfjw|sk_eo|soonmklllu~uuypmyx|pjpghhkwwljs~z{f`bmqcly}vkpv~vxwxxwz|~~~pfnknrfk`][Y`kst|}{~wv{zpgjt}qxxedhr~~zrrpmlkfwww|ryunwxt}krkgggmzslnwz~~vedjtherz{omqv~wwyyxxzw{mnphvmni`_[[dnqw|{vx~{{}kin|wo~odfjt|xvtrnmgi}r{usyrqzswvoriighp|}rmqywtghrueju{|}{mnrw~}}xzyyyxu|~wlqnizoqhb`\^fnqx~}|zvx~|{|kjr~uqleglw~zxvtpnfmzq}ssxqtzt}vrihddiqtx}{uwvnny{qux~wek}iX\hs{qsz|uyf}qomk|}~l^vwc]ajkjtz}nlu{u}z~jcfmynZamdU[VYc^ex}wzsrlcdvvu|yvlS_~ppq\XjdX[bkv~vuqpx|ww{u|i`etuke_^badeovqnr{|tkpim{w{in}qdXdj]\kk_gljuvs}wwuv}{y|xp~onuk\}sZck\W^hr{s~~zss}xzzkpmlwvz`Pmr[]aeilvuopyv}|noy}in}n|whjtuag|bR[dVV`_hqn|{yvlfcp||x}{xfVrpgmlV\lc\bku}uxxwsqw~y}lprr~o\U\twogbbaknjjr|{{rwzjcjslro}rs}xldfs}~hfjZS]^enjv|vpkcchs~hafday}~w]`od]bjry|os{pnosz~otwyvl]W[evztrlssmmt{wzznssc_jsmuqtvujfgnw{xyye_ffnqmzz{rngaejsn]^hdf}}dnvgcgmuz}l{xonptyyymuw~rfZY]hx~}wtzvqrxzuunwoacpojzuw{txpighnr}|wdgjmtmq|zxqlcbdit~h_gh_mriyqeeipvz~tpsnopssxrry|{o`ZY^k|x||usvysz{osufalpemtuvzzojhhipmiopwpm{yzvoeaabjwqejj]bum}yjghmsw{xowpooolmxr{~}wg^ZY`o{vvxsu}rqxmckrfftuyuw}unjgdd{|mruyulvyyztiba_blz~ljob\ixvztkikptxoysppokfssx~{qc]YZcs|xyvp}}xnuugfqlajvzxwy}snjf`hxqx{}qp{wz{qeb`_dn{xjnn^_m{vsmknruy{n~|qoonheysz{~la\Y[fu~{{ur~}vmutfhribmw|}xx{zqmje`lwtz~qs~}uz{oda__eo{uink]ao}xtnmptwzzn}{poonhf{sz|}k`\Z]hw||vs~|vlstggpibmx~{zy{zokjgcm{szus~sw{qd```eo{{vgjl_bq~yxqoqtxz}nw~qmnnkgwsv}~~l_\[_iw~zt|ynnujdmmckxw|z{|}njjkilrv~{r{vqzvg``bfozwxxhckeapxuqqux{~rn~ulmopmqzq{}z}ra[]bkxxz}{rjqodhohixx}{{z{ohimoovr|uyyouxk``cgpywrvkaiidpwxssuy{~vlyxmlprpq~~px|t{sb[^cmyzy~{simpefojiw{z}|ywpginqqyr|xyzmsyl``dipyuosjahjeqyzutvz|~ulwxllprpr~~qyxrzr`[_enzy{}zrhnpehohkyz}}|vvngjoqqyux|wktyj``diqzqnrhcjgfu}zvvx{}qn{ulmpqmu~zr}rt{m]\`fp|~x{xnhpmfllfo{y||~t{yjhknmsw|yon{td_adjs|ymqqegibiyzwwz|~ynt~pknokk~~twxp{wc[\`gr~z}}{simrjkmeht}~~|~vxphikhi~|{tkz{h__aelu|pptkijacp|zy{}}qstlmmhev~zw~}p{}i][]aiu|||wlktnlnednv~||ywwkiifbr~{lupb__afnyumtrjkc^hs~||~urz}pmmjcj~}~v~ssua[[]blx{}{riptnojbhqx|~~wzqjigae{sl}}i`_`bhp}~|onuokj_`lu}~~st~ynmlgbp~|~wnvp_[[^dn{~}zqirtoogbjry~}~{vz~oihf`h~pm{g`_`cir~ymmtolh^bmv~}tt~ynmlfcr~|~w}lto^Z[_eo}~}zqhptoohbjsy}~ztwohhgbh~rk|~j`_`djr~~ymiqokh_amxtsz|ollhdp|~wlm}s`Z[_fp|~~{tiktqokcisz}}|srzshhifg{yirrb_adjq{~~~zpejpkjd`kxxrt~tmmlhk~}|wresyg[[`gp{|xmfospnffqz~|~sor|xkhjjivlk|yf`aejqz|}zredmljgajxzsrzxnmnjk{}~v~tdmyk]\ahq{|xoflsqohfqz~|}snoyymhjlkvniz{i`aekrz||xqdblmkgbkyzsryynmnjl}}~w~rbmyj]\air}|xnemtroggr{~|}}qmoyxlhjkky}kj|yg`bfls|~|zwnbcmnkebm{wss|wnmmio}}y}kbrwe[\bjt|vjgqusldju|}|~vomr{tihihlvhtqc`cgnu}|}xti`hpnh`dr}~vtv~rmlihw|}ztciyo^Z]dlv~zqgmwvpeeow~}}zqopyymggeev|koxg``dipz|}~yvmaeppj__ku~xwvvnlgdq~z|~xggxsaYZ_fo|}ujlwyrfcksy~}}sqov{qheb`l~qm}mb_bfkt{}{xrebmsnb\dow|yw{}rmhciy}yy}}~ndqyj\X[ahr{pir|ymbfouz~wsqqzxlfc^bt~{mtyh``cgnx~z}~yvmbeqsj]]hqy{zxzpkfcn{zwyzietvfZX\bjuznjv}xjbhpv{~urprzvkeb]ew~}ymvwf``dhoz|{|}xukafssh\^irz{zxzpkecp|zwyxhetueZY\ckvzoju~xjbhqv|{qje_btystvy{rz{pxuqry{kvlttnnmg_ds{tjjsz~|tyxu{xvttnpyrsvxwqfaoyoecgkqxw~{slt{ty~hswmmrqighgqwrmkhjw~}~uttt|uvzsnywvmhge][gsqhcktz{y}}~~}qgt~yvsof]bopfabgls{~x||}uv}|{trq{|zwnggfirrliggo{}ywwwzxx}w{x{}tuxuw}snke_dprjdhpvz~}yx|~~|}|uomnoz}xoedorjddhmry~|uv~~xv|y~}unmsxyqnllsuplkjpz}zwuvyz{~w}{wx{~ulnuwzzuqjdgqtnhkrw{~~|xw|~}z{~wplkor}zrihpslggkoty~{tv}~yw|z~zrlmtxyrpmmtupmllsz{xvuuxz|}y~{xy{}~{qkntw{{vrlgksunjmsx{}}zww|~|z|{toklosyqjkrrlijmquz|xtw}~}xzz{~|vokntwytqnputomlovzywvuvyz~|{zyz|}~~wolpst||wrljpurlkpuxz|{xvy||~}zz~}wrmkmotxplptpkjlosw{yuvz}|}|z|z}}ysmmpqvxurptuqnmnsxywvvvxxy~{{yy{|}}yrnoqpr~}xqmpvtnlosvxzzywx{yy}{z}~yuqnmmmv}uprusnlloruyyvvy|{x~~{~}z|~~~}zupnonny{vsuwtpmmqvwvvvvxxvy}~~zzz{|}{uqpqoms~xrqvwrmortwxyywwzyvy{z{~}zvsonmkny|vsuvrnmnqswxwuw{{wx}||{}~~}{xsonnko{|wuxwspnptwvvvvwxwv{~|zzz{|{wrpppmlu~xsuxvqoqsuwxxwvwywu{}{z|}|xtqnmlkoz}xvwvroopruwxvvxzyvx}~{{|}|{yupmnmkp}}xwxwtqpquvvvvvvwvv{|zzzz{yuqoonlmvzvwywrqrtvwxxwvwyvv|}{z{|zvspmlkkp{~ywxwsqpqsuwwvuwyyvy~~{{||{yvsnllllr~zxyxurqsvwwvvuuvvw|}zzzzyxtommmmnw{wwzxtrsuvwxwvuvxww|}zyzzxuqnkjklq|{xyxvsrstvwwvuuwxwy~|{{{zxuqmjjlns{xyywtssuwwvuttuwx|}zyyxwvsnkjkmqx~yxyzwttuwwxwvttvxy}~{yyywtplihjns}}yxyxussuvwxvttuwy{~~}zzyxvsplihlpv}zyzyvutuwwvutstvy}~~{yxwvurmihjnrz{yy{yvuvwxxwvtsux{~~~{ywwvsokhgjnu~{yzywuuuvwwvtstvy|~~}zyxwurokhhkqx{z{zxvuvwwvusssvz~~~~{ywvusplhgint{}zz{zwvvwwwwutstx{~~{xwvtqnjhgjov}{{zxvvvwwwvtstvy}~}|yxwuspmjghlry|{{zxvvvwwvtsrsvz~~~}{ywutqnjhgjnu}~{{|zxwwxxwvussux{~~}zwvuspliggjpw}|{{ywvvwwvusstvy}~~~{xwvtrolighmry~||{ywwwxwutsstwz~~~|yxvtspmiggjou}}}|zxwxxwwvtssux{~~~{xvutqnkhghkqx}}{yxwwwwvtsstwy}~|zxwuspmjhgimrz~~}{xwwxwvutssuwz~~}zxwusqnkighkou~|zyxxxwvutstvw{~|zxvuspmjhgilpx}{yxxxwwutttuvx}}zywvtrolighjmr|}{yyyxwvutstuwz~|zxvuspmjhhikov|zyyyxwvuttuuw{}{xwvtqnliggilqz~{zyyxxvutttuvy~~|zxwusqnkhghjms}}{zzyxwvutttuvz}{ywutrolihhikow}{zzyxwvttttuw|}zxwuspmkiggilr{~|{zyyxvutttuvy~{yxvtromjhghjnu~~|zzyxwvutstuw{~}zxwusqnkiggikpx}|{zyxwvttttux}~|ywvtroljhggims|}{zyywvutttuvz}{ywusqnligghkov}{zzxwvtsstuw|~|zxvtrpmjhggilqy~|{zyxwutsstvx}~{ywusqnkigfgjnt}~|{zyxvutstuwz~}zxvtrpmkhgfhkpw}{{zxwutsstvx|~}{ywusqnligfgimsz}|{yxwutsstvy~~}{yvtrpmkhgfgjou~~|{zywvtsssux{~}|zxusqoljhffhlqx~|{zxwutsstvy}~|{ywtrpnkigfgint{}|{yxwutssuwz}|zxvsqoljhffgkpw}{zyxvtsssux|~}{zwuspnligffhmry~|{zywutsstvz~}|zxvtqomjhffgjou}~|{zxwutssuw{}{zxusqnligffgkqx~|zyxvtsstvy}~|{yvtromkigffimsz}{zxwutsstwz~}{zxusqnljhffgjov}}{zxvutssux{~|{ywtrpmkigffhlry~|zywvtsstvy}~|zxvsqoljhfffint{}|zxwutssuwz}{ywurpnkigffgkpw~}{zxvusstux|~|{yvtqomjhfffimry~|{ywvtsstvy}}{zwuspnligffgjou|}|zxwutssuw{}{yvtqomjhgffhlqw}{zxvutstvx|~|zxusqnlihffgimsz~|{ywutssuvy~}{yvtromkigffhkou}~|zxvutstux{~|zxusqoljhfffilqx}{yxvttstvx|}{ywtrpmkigffgjnt{~}{ywutttuwz~}{xvtqomjhgffhkpv~~|zxvutttvx{~|zwurpnkigffgimry}{zxvutttvy}}{yvtromjhgffgjou|~}zyvwur|yturibc[WWPRRPRZW`ipwxyzxyyoqpoqvt{||zrhhkjstsrtmokhd\kpeszqknvy|qihefknn{}u{ql\X]hlodcfgjqsv|oXUrxf_^blnvzvrc]essnchjmrzxphr|umtsrrtlnqx}q{xuiVMdvmplms{{}uk{wpqxsqtxt{y~~sfx}tx}iea]^wljjgkal}oqumieff\V^`ZPd\V_hjccnv{w{rwwne|rtw|w`VZaaaxzv{}~lks~zuy~{~{{}w{vxxiNQThnytxwi^ZPW_TCILZVXaTgkplbgy~xz~yzdhblhlwqxv|umuv`NXShhy}~xmz|ieqo|{}|uw~qltkOS[[pyt~~{fdaNM`VFPVT\]c[edekdcz}t}w|gmk_giwtwqxfmxdRb^cmzjuhhwut~~{y{|reqkP\g`l|zy|xdkfQIdVLYcY]ec_`^]dbb|{}tyzito\djxwxzoudlzbYlegohx}fn}zs}z{{}wmesfOcgcl|xpdmdKQkTR`g[dhc^^_Zc\h{|rwtizg^dpyzyotibsxYbjekv{~xlqhuvzv~|xxxhjuVWicfr{fhjZIgdRYfa`lf`Zc[]_[r{w|~kuu^cf{u~yyf}m`hd[jegpzl}hs}v~}|v}vxnjx^Thddj}mfl`KfoXYdc`phbXf_Y_Wiu}znszaedyvvewpbd~oZgbem}yx~s|lqwu}u|y}{tktmQeheewxhklTXudZ_h]oofZ^hW`X]mvz~{lmdfn|vx}phwe`p__b^fw}tuyox}t{qsx{pkx_Xjggl}ukojRfubZbc_xmgYjh\cXbpzz~uqijfszx~~vjlsd_u|[b`_h}|uzvp||q}||vos~wvomx\]ljkq|vlojSitcZbba{oiZok`f[cp}y}vrilgszx|t}~jjpc]r|]a__i~vyxrz|qz|~xj}~qxuztnjwc\nnot}ypoqWewi\`e]{tm^mrbj_cm|t|~onlll}t|xv~pfoe]fe_a_e|zvru}{tz|x~hu~v{~wyyrtliqq[krsw~~xnufXsscZg]l~rjc|lmkbizy~|sx|irhwx{yqy~ueij`[vv_cbds~y~vt~~|r~y|~v{li{~|r}xqyonjilwbhtvyzzqqnXlviZcbduqbzunqehtwzxu~jslr{vz}rs|uggjcZp|bcceo{{xu{zt|z}xyofx~|p}~wovokiilxeiuxz||tsq[mwm]edgxtd}wqsghuxzxv|jtls{wx|qr|rhhhc[szdcdes}wxv}|s}w{uwhfw}yqw}{tmunghgpwdmuy|~svm^rwm]kapyqhsurii}y|s{vkvlwxzv}|ntzliiia_{rdcfe}|uyw|}v}~wsqbmy|q{s}yxonuiehixmgqwxt{djxygeld~zhv~rwmhnt~|u|lsso{wyx~um{rklii\pzibcdn{u|y{t{t}tsegv}ttq}zxskvnchfupfmsu}y~mjx~pgqf~nrsxqjiu~~v|opwoyz{|v{zlyvkphl_jzmbadf~x|~|}xwx{u~xrhcn{vqsv|wvulowbeeovflnus}zjt~|hrlsyjxvvoew~~z~~xzvlvuq}xww~tm}lqlkh`uuj_eau{}t{|~wy~s}tndfu{rvm{wwsthvp`gevohlqsz|toxylvktpwzvnfz}w{rnxssxvv|nq{jsildcwti_fa}{{v{~}|wx{u}sjbewxpv|lzuuqrexnagfwmjlss}rqyzovmtryzvng{}wzqoxtrxvt{mo{jthkdcvul`hc~~|wz||wx}t|ujbctyqsju}tunrdst`heuqkmsv{}vqxqxozq||ysg~~{}xzrotwo{wrzyqi}krkgh`rwsdhfw~v{{}xx|t~|}ymb`jyqrvmlw~vsooke{eefnxlpp{w~|pt|wvuuty~|ymozxwppxquxztr~xwfsvjsdjaixyofmjyz~z|zxxxwz}~}rc_burpr~tgpyypqjpavqciiyqrq{{~rsyvyt{v~zrk}}~xwpovtpy}uo{xvilzitfidfwzuhoj{xy{{yw{ux}||}|sd^`rsoqywfmvzpripartcjhyssrz|~ttyx{v}v{sl|xvpoutpy{smyutfnyiueibhw|vjpmzz~zzzxwww~w|y|z}qa^`toppzqekvwpphp_vrfjkystq}{|su||z{|x~|pp~yrpnxpuxxpoyrsbvsnsdianx~pmntx~|~x{w{tzzy}w|wzi_]ivltn~gfmyqsinid}ijhsvsst~|xvxzz{}zl|{zvooryl~}ukvttii|kvhgcfs|ylpl{|{xzxxvw}~u{v{w}~p_^`vlrnyldgwsqmho_yohhnvrsp{xzxx~x~}nx~|xopo|l}wkstsme}nungedpy|mpk}vxzxnxy}xrquq|vuyv|z||}~v\TRrq}uhhv}uvhr_jq`^[eab]giuwvqu}oe||{y{{sts|xqzqtansiqceamx{phd}qtsxsu{}v~zy{~~ufROnz|rpggURWjfibafWpib_gklljtt}~}v|nuy{vmpnu|wpbUctdi{}zyzpx~lgkltoux}{qzt}|uw|~zr|v{t|t]RQb{x~iaeunshkkaypkirtwtv}{qky|egoytqhhfb}ooptujg]a`qeqv~}vjnroqdzvtvieahmugdcs|}}qtoiUJM_~{j\Wd]^UQWH_^VS[^a`_gh{zvvuqy|wxyzwzx|wmdfemc]_k|s}vwokyoafelkmqt}ztnqstzqst~{yozvrqlmrofUX]|{wicpurshthpvrt||{tpkwvvrz|lqywuhodlnspvpkc]`crby~yzshpnplf|rvshaafntjln}~pndiecSSZu|fYZe]aTXXOeb\Zcchegkoz{opkxv{~x|{w~}nb]^clehluv{vvnm{icffnlqpwtz~ktqxvpru|vvlxy}klelloa[_p{pfgvrwootj~yv~~mkdmvyy|qrw{znnnevtrusmh]aasfpx{timnnnexvtvkbbelvpqr}|}kg_cbeWW^wk]^hbfZ]]Ugh`_fekhijq{z}lnjxx~xz~|x~}xh]^]hkhjrv~xymuyehelnqrr{nrmssyprpyuvmtsrmghkmj\^d}zmeruvvmwptx}~rkegsy|yz{zoxh{wvtunl_a`plh||~}vkknmpfsztwqccdjvqpny}mgacbdUUYsvgjqks{~{tol``]frllyu~kwzyy~~~{xs{z~vnb`ccicl{y|}qpsv{rxzxu{xspluw~tvv|yvux|u~ujdlylvuov{qggoghfs}yuqwv}|y~~}~vtq~slojle_afvjs|zwpglkqpm}~}rvu{yytz|}v{~wqvx}vwt|z~xz||vcb\Z]bytlcab^^\hpkh}tp{zuwxyxzu|~wpnv{z|romxtxuyy{~wijmvywxtvnnqur]pc[_egbcbkgmdk{s}zupss{vjfh{vu}tqzwj]R\_hlmy|{yxogbkpt||{uc^Zdg]mvlltnj_]`agcgvxr{ploqx}r~}ohmt~xvy}~|~{{jZJQT_hn|{xvnidmqme{rkwvzpsrz|~|}usvrsv{pjhqz|~wroxx|w{{{o_bfuz}zzwpuuzbkn\^biceahhjhcxvw}yqrrvznjft{ry{npvkaRU]epry~yvvwpb_`ot{rd`^kgbtxkptni^a`egek{xu}opouy}}o{xwgglx}y}wz~}}{oul^OHS\lu}{}xtmlsvnjqpvxypsr{zz~{vrynnqtiggu|usq~z{z{~qxspa[am~}~{~vvx{wbqj^_gheecjgmdj{uy}wqsqyvlhjyws{viqoeZQ\crx|}qklma^^mwzjeakmeo~qmunlaa`difjy}s~tqqsz}luttgeju~ywx~z}|wgmf[NIU^px|yqqwyrlrpvxwqtqzzx~{wqxljqqhghv|wtu|z|z{kqmi[^btz~|ohtf^cjfhdhhjkct{vz}trptyplhtzuu}njqh`SW^jty}}whhmd_]eqzunhotmmzmvqoddimx{|xzqhqY\^`VSWarz}}zyuw~w{q^f_WKJS^ox}xlnoqge{pv~zj^aw\Zwv|yuqz{|teepmjinzztov~~}uozwhbccZSV]mv|vfVSjp_egbnqkmkwuoinx{vz~krsmd]cgw||ypu{|~|k_gha`^ip}xfYMVb|x}wah_[U\flkempwgnk[`ccY\]js}}~rrvpss}t{sm`ber}sh`]SV[j}uog\UZcqmooutedaSQ]YYVZbispw{w~}{}yvqqv|{prtngik{z|nXYWTZ]jtrlafgb][fjkfsc_f`\QUWelrs}zvrrtovw~|kirllgmt}jh_\WZak~tkahkoghjnnak`WZ_ZVX[ipzu~|xyhmoouvu{upeijy~wj^Z[W_dpxtg_bjvqsqvtgcbTP\YZWZbjtrv{w}|zywursx{~oospimm{vtpZUYV_dow}rhflfc]fjngnn]da_VVX`mrvyt|pmrqu{{~~}uelolnlv|rubc^aako}~ujeknphllrkcl]X[`YZ[bow~x|{u{sdmnt{}yvxtpinrqrtbZ[_bns|wugceowtvtzsgccSS]Y\Z`fqxu|{yv~wuwtwv{}~qZRSIGIP`ivt~~psqooihcjfgspiyrt}xqedblqtqzswwzuzv|rzfpyxg`iceaglx|{|xyuupnpidhvpyw}thejcbbfr{{lcuyqzqoisttoqwzxp{lfgea\adu}|xkiggsx{ttzopt{uwggpnrpv|{|lvzsmgj~nmrqhgoswqutzrkqg^`e_baju|rq~~xyztv}{y{{||yshowxqoqw~zwebZQOScejkormdgg[ehonov||ujninswny~yu{|zr^df_iusxrunaVZtjQMWf~ww|t{{|xz~zz{xsttxs~~{ypo|~x{|zwomjpjks{wyp_PMasrdT`l`clnfmryxy||wuwpfjhedbmwyspow~oidb`irf[TQ^jwwuaXaXWZhqtwtwqh[`UR^eqt|~}}}}}wxxxztmt}|vqtmXWS]dr{zwwm`Y[XYU]bpru|wtumlhmwz|zyvzx}}xjfgu{{|xuux~w{j^\\blr|nni\`frvz~~zttrehiikhqxxw}stt|}~ys|{tqrlmjt|wtwgYZXcgr|x|tqu~|ykjm_delknov}ufb]^`cq{{vxxkoprts|yfm`PNP]gwpmmmnkrs~ww~vompkmjs}vgbhaV_ewwxwnmp~xszmoqxzz|~~oxzpfinurqqxxx{y{uuzmmqquqy~|pzuquvtxy~}r~vus{|~~{~sossxv}y|yywzz|zfefo{yvsq|~pxqjlnsopnwvrowzfoy{ty~|{lcefnmtz~}{|wytw{v{y}{{vhre_`kxwxvxwx|}z|}shda[XR\bijs~|}thfocZ_borz~qzxut}||~rrryxz|rzzpfmsyyw}yzwuulcabSUW^dhuxszxu}{}~}uj[hd[\cou||yyy{}|rlvpelr|}yoijqptopmndeqjmowvusw|wvwwq}yqslmjqrwuirwnchktvx{uwxwfqmffp~~zxqceejou}~ojidc]fkpmr}vkq~vvuwvuzx{tjfskbeivxqyzy{|pwymchlvw}}~wlol^_]b_agpuptxxckvttw~|}xhame`^ipwy}}paahWTUbmv}y{wo`gb\Y^babdonpqqxwxrqosvwzmlusccgpwz|qfQY^XWbsvsnonoqrzrorrc_`__[fkrpu|nsxxvxuvywzulhxrikr~~ytqrvw~uqzpjns{||xtvwyzvywpgpi_^`eafkvttv{sansts{}nqyrijty~~w~z{lusb^`mqz{vz~{{lelf^\dcdainnotyr{{|}yzzjkmut{zusyuuyn^ge[T]emr{{ytwvzx|vrvsb`^`\^hnttvrp~rifovzvyzskqvxz~|}|{~qgkr`WY_gjw|~}{}{uhpncadliotnu|~ojutheot{{|z~~}~||xq`al^WVciqz~}{lrtnfmppnpyx{z}{zzy~|u|ohhnqr{~~~{w|yu`ZdcWUagqs~}}}lkilfjqxzys~~|mlynd`jnrw}|vz}}{|zwtvwvzpehrbYZailxtz{nhjplps~}}~opx}|~|j^gkaYbgpqz{wuxtt|}~y{ywvpdXge[Xamtwqwvkhoopluwyy~xy}zupootryukhvufgkvx~vryyy|rx}}}}ytmZ\hh^dpy~ylkjkelpvuw}wjuvwuuttzx}{ykruoo{~y~zqxy{w{|}|ttqvvy{qiq{jfisy~s|xlehkgjnvsttyudhqxyojuxljsy~~~wusvpuzx{z{xsccrleesznorl`efgehoptvz{{y~~zqvqiiquwzxquyw{xx~~xt`\hncdpx~{u~ugefjfnt|}v~||~{wfjwpgfru}~|y}|sz|{}utqvtxxofoyiegsw~|t{rlsttw}|nox||~~|ubcopchowz}}{x{yw~y~}wzxvvsj[ing_gqwy~rpttsqxwzyxv{{tsruxyzpl|uheiqr{~xx}z~xqu}|~}{usaW^i`[dktwsmlnhnrxwz~ouy~{{yy}z|zvehtodcmqy}~}u{{}yy}vqonrouqh]jm^Z]hkw~~{{ojpmpqzzz{|sjkwy}~||n`dqkahmuw}vtxrwzvuy}{xuruprom\Xfh_[gnyyu|xknoqmquuxyrx{zxrsryw~ymq~qhenpw~~|rwwxy~~|ohpvw{w|z{vuo^Zfobdjsx|pjmkiosxv|}zosy~{|y~~~xgoxsfipt{z|wrtvuryx{zzqyyztrqtww~zqftvhadlnzz}pkpnprzzz{{vljw|vhftsgjmuv}{qmplnsx{{|ux~z{{zxl^hoh]djryvypnoqopvvzz|v~~yyw|}vm|ymehmpy||z~qotswz~so{~~xxj\[ji^bgps}|rmqmoty||}tv~|tfnwqdinsz}}x{yuxzzyv{{|trprssyul`mqe^ahlw}~wpvtvw~|qkv|vgbotghjqsz}~|uwuty|sqv|xxsvustrm\^jk_`hnx{sttvrxy{|uwz}zuuvzyyknzrgcjkrx}tvwwy|~}}thitv{wzzyuspbW\lfafmty}sprmruz{}yqs||{yy|y{zzkbltlckow}zvttvsuyy{{vnrttmljnmquqf`pphbhnuurtsvx~|~}}~wlgsx~|~~z{ocbssjmqy|tormpsxyz~}wlksusqospqqrg[domdkqz|}xsstrrwwzzyoswyssrwx{vm{~ulptx|sr}vv}{{ytlcoqd_cdWW\c\bbgii{ii|xx}}rxsccjiiqx}zp~n}z}oopvuicvg_xjemvvtvcimld`flx~xizfamx~y||}}{ffku{lq}wrgw~xsqqksxzqlk|ovsviUct_`jpymqmtmzoo{yzppk}vvuqwmtpkxo}}qylu{{}r}xzw~zjZ\p~wti]`]VNa\XohZceerqszxr~ydosft}}}~q{scupp{yu{zm|}|u}zy{ehytvun|w[`]R][\^bYhn`kpdkykknniy|n~~px|stoistpx{tookp|y{utg_bacyz~~qkiVZaWVf_fwonll^kiW`nag}yyvtwqwno|r|squtijwp}|vludcj`]ox|ekcWdi`ac_fn`\pc\omfcb]ejrw|uknsh`tru~kmemtqddnjnsz~tpch]LZZOYicifdbijmvdcvwz}uxyimriuonooxxfftvzs{xu}sdgfZmvt{nqeS`^^\\^bmkyq]^oihdbruuiywy}nmeh{y{y}qs|pv|lv}}~~~z}tfteX`gqznha`agocSgqmpimrvg]c`hpkgqe}jqslqyk|rtpnl|ln}u|xomclbRfrmsugoqjg\`lnbZigoujg_Wnsrtr}s}~lzxnlppw}fkuiWint|y}seqqZ[d_chvxuyvr]Wa^krmhh\smhgkn^qupxppmnlq`fwlbloopsqq~{~~~}xpyssomdchhqjg{xoqtdbbTlkmiswirulsyaso`dkprouzfhkhkjoiwv~ydi|x|xzzzv_Tbrsvss{ohlp\goftxmzrdfeafk[dytfrvxsxskru|obi~~rtyx}kx~thvvwmdlkq``lxt}unid_gmgihlxj[fce`o{q|zzwtxpkahfsjmznxor}z|ot`kqjYdljp{wwr\gjjdchsbjlqx^djoibhpfok{vv}y]pktkepq~xow}~~}vvvuusopnqg[rxr|svro\_ttshmnmfg^ig^gjhvy}k}~vmkqskqlpciu{~|zw|~}u{tlptlgWtrxrknqgcrr~sioljnXdo`ghgt{{ls~yyjtugjvh}shypvy{yz}{ssvyunq`oldi^ryu{{nctpwqestpydizhgfhjcr}tzxrnrgitarogznmqy{x|xx{yqhrdmicm^kuwui|usnetvozlopcidfnqrxvv}uljmjntbzvipirliuw}z}|xulo]lskm\ahiw~}r~yyupyupzhnv`^\eopr}ovzoinmmrfxoeojorz}yw}~{y~~|rvilrkq_aaYdkfv}ot}nvqu{hkjiciioo{so}uyxidkZmzilesvruyz}s}}z~jfzouh^hhjqgx~yyouxjsokmfejlggutxxl{ntzlmimwksotsvqmnwtt|{yy|xwalnpe^le]f^ltrx{ws~pjhehfljqn~u|~|lwvihfc~mcej{tu~|ul~}{ydq~vzmekb^_aohv~xwkvjrpkbpvmkzusfh~{}rqjrmdnlqozyxs{sl{xv~z}knnqhdnb^aVj{iipy~|lvr~rwyuunympkxmo{}|tzoqg_zobbkto|l`yz~u{}in{mkjajh_bdndmq}}vxrs{rjnznkvvxshyyqoorlenlsmtsutyxo{v~}}~{phqrgboh]c\[pb\^q{wv~u{vw~yvspscov}qyxxvjxw`^\krjwfs}{}~wx{|vixtooeamZ\_niirs{~wwjppns}xbq}w}~t~srvximhskntrwv~llt}pv}}}~y{~kvxs\[^adfNspUgcqy{uyxjcfkmzwtmxtylnysWWvxwxxlqrvw}}sy|wz~kx}{eyzd]k__Ue]^ojhjv~srgqyz}xdvzsp{kk}{grfl`gkh~vkt|gz~y{|s}{wywpsu``kVYcTPr]]_kyvy}yxz~wvfwvlv}zupqylm_gwgdysiy}xmz|u}w|uu}zx`d`[T]_mf_ntfttytyn}~qtut|o|fmtfcrluwruyo|m~tt}x{v|}~u}}ptuhlpa\hXfzb]gghmqw||||v}ckxhdvitv{{rxjo|wgvyyyloer}szoxtwv|vgkp]f^bhbZ_lWi{yqxy}zt{nkkzz}t{jxikuxmiwjnzzfpeis~||~x~rrtlXSXT\jcVkcalvqw}~}xwto~oy|}ov|pekjg}sfwsrzwny|uz{m{|~p|~}~{wwvm\ur]^_\hibdlldh\fym{jpz|pu{mymkdrsgj{~rmhz{utw~xpwv}s~lpfmk`[iueiXXnvjywjes}qktafttk|yotwxifytllwlxpvxxisqjup[\tifpf]`tcmkglnk|ozomkjz|rfw~uml{swzqprhrykts|z{}yzwrv~ym|yqa_ki[hhei_^g]_aj}uyr~}ls~zykkslurhpwttkyxssv|}qz|}xqu~ygoageYXd^e`brhmepypp~{ut|z|yxy}sdknnqiwxtpytklrywyqtyzlzwy{nkpelY^b]e]hnhaiiwll~orw|zwy{ykunuroxumuy{~jyytktxmvx}vyr|~tz~wyvwkoach^Wejobbpf^]i\gwqtqvt}yilrptdtvoktsdrrknm~~qkRVZeq`ouvmqkc}yssyw~sqxmy}odicd`MZa^]\i[Zuu`juo~{t~opd^lrhozwzrZa_VS`jZgs^e^Wrrlt{nylmo_b`Tfpqsrozscz|}xziusx~x~yx||}x_cn`WkgjzkcsbT^h[Sqxden\jw|~w|vvxx~{{ogwtjs}~ozj^eT?QI=IXR@R_LBLDJ`ddt|qwrbfv{|t~zybpugm~x}}tluykdniocn{yyyunowzru}y~zdetclx|tuka`]ODXeULYRWfi`ttfibJZpegz|ssjfqeizqpt|msprek{zrytown\qognqo[Tf\EQ_`zz{~zcafWWfeapn~wsxperiaXWV?>[R>ORI\bS\qbkyfgo~ru}{xoxx~~stsqpx~sz~}xdwxURaWntz{w~|lyw~xviejomvppsurfjs]TqhIOQE_kcinhmRGhlaorfikvoyzx{vkgjikhny|uovvhmsnuqftsj^ldMaw]TaRYrqs~ywplg_UY[[^m|{gspaVjaNcqSFH8CWTWjupzq]i|wu~wzwy}zx{{~{r~{w}w}vkqymdxnV[\Ysyxyzvx}}}zzsxx{~~qgoeactuqnyaVjo][[Tac]\enmph[csrimed^uzo~xosm\cmfnlxvvvk{vzurrSake_km[_qiWURWloxw~owrbcdRTe_ekpqixmedoc\gjTEB@PZ__cuqprho}zlex{q}s}v}w{{zx}|q|xoothgx{habbqv{z~{||r{|~t~}yw}~hah_drr|vqfmmgnt_]Y]hfa\stnsdXlyjqxjhmxdpnhuwhmvkrpfvoqqxzvumk]Zlgj^d^T^si^ffo|{uyzooiYdZ^haWbdbso|sy{tk[cXTgqZTWScicYdunxyjw{nlk|}{xywzrwu~~p}yzkgoce|ybdeh~||}}||}yl}|ouzs|tukinkciqs{ywfvodthahas~pdcndhiZcz~w~pkhlujpkqvqjmnktit|qzrr{rhpwnuglom^R]OQnuejkf|~xy~{qh[hZ\]^b_WXcj|w~wo^i^Ymub]\Shneeizx{tek}}~wwzvx~{x|ysxvzwnddRYrriomsy|u}}}|x~|lxxv{xyus~imjhmndiuu~suejzymnknul``nmojbiy{vyqvo{noeekfbqstzpzquup|xkmuptmarjgZ^ZTdof^`_v~xxsocsi^bWW]SPcjt{wsi`hof]_at|soey{vwlhz{t{v~|rx|u}xsx|yzm\\Vasxlhgox~~zywyy~{y{yywzvw}xr}uylij^Ubiqwzu|pkgn|urfxwyj\hyt{~uyuolfamnfjpitrkytfahhmfpyooYZVUeqe\bcz|~{yz{nz}mncnb^[ZcaXX]\mqqwrjbp{ngjfwzqlnmkx{xv}}y~{uxx{y}x|zo}x{peldj{wcbajx}zonlw}yyx}stvr}~v|{wvuwtwqhed`\_io}{yxsqm~vpq}y{qfm|~mrhqzosrwysifehqi~}~}xf_jlmnesml_[b^l{q`\Ub{v{{xz}y~yraa^]rdba^`^VT^bqr}txqvzqie{trtu|mjvzv~y}wvowo}|u}{z{m~|ypef^ixwomkt~}yykoquyukz{zzyzurwuowzrmcuidignskgonw~}}yq|ynrh~ulu~~usposstpvvkiqlwtoypyv{~uortqq^clag^`bhuwl_]az~~~{{y}|~zsntmvwlj]^X`hX]Y]jjdknkzoyxxu{zqqx|}qp{qvyzp|zxvpp|qwkxijf]divsno{~~{}z}wqx}{mqxvprt~wqcw}wp||{mefbqhjhispjkru}~ztyvro{npyvljriooy|tqmjwhryq|}~{sjlpnjbsmliVYX`ryonsz{w}{{yv}|nz{wte`lvuwg``T_WTV]konmnmysvooqw}xyuquxz}~{{yzzx~wisjmi^fdm~~ux|~xwts||vww{}}mhij~y~nmdsy|wihs{~prlcn^Y[cnuvw|yu~|{ro{twepvmruzzvmnr{~vtsunrpioywvkgpei]Y\^p{vppo|soir~yvmguvukdfptqfZ`Sag[^^afd^dkv{vw{}|z}vor}y||~y|yxyuzyyxm~|xteb]huyxz}{y~|uw|yv}zyy}qxx~tpnt|ror{wxjxyri_^m{~}prdbiY\^eprkntzv}{sx{x{t~xvptumksuyqsruvolprqpcpypxg^Y\ellip|y}{ljlx}vu~xrwvn_SYjmrkeg[e^WWWbgcchixyw~y~zsv~xpsvyw{~uortrcfis~tqs~}yu}{xyv~v{okqvyt}sghiu}sstzqpbpttrfcntrqacc_pjigjokedis~{qwxuywvv}{tpmsxj|yvzogjjidj}u{r`]Yaoqkos}x~zvxy|omm}|y}qyvqdUU`iml\`\Wieceije^X[exv|}y~{vtxxtuqmii}z|mjemzzsuw}qjpsump~rxrmoqyld_mqiulqxtgSKN^r~oicWkkfjqy~|xz~~ust}uylzwvYmy~|y|qlio|~ulfgwns~{|qw|wzoz|rkqsuvp}pkhp{}wqout{}vv]JOl{QD3?VT^dhmkbbkt{}||}ogmz||{n}{~xttruor}uv|pbnnumbc`fie`fgpmgukotxysqtxxufmvjurmou}}te^apjflYae^XSWj}{jg`\pnqux~usx|w}vngmnhacjg`^[Y]KU[Xgouphcbbc[Yohjpb`bktysot{to|zyvuz{}poWWWNIBF]v~msfZTS[[XY\_kabrhsv~}xpdtx|{v|~~qmsnmgkwssyvlc\W`ZTjbdopnhb`figamvkuj_`blvsklmvla]KQUY[War}|kpmgyurqx~|opkg_`tvnnttqia]`VLaXZghhe^_ikkdjo`e\V\dvywuyqwlt|{sxulZFGGGCJ\rrw}mgffd`XUZddaxst~wywuzuxinxzsms}{wfjga]ex{xuoddhnhcn]\^^ca`honlahnbjeaaiuxrkdfrdbfV]b]SNQ^oyzxyxuoorzrjrohcep~yuj_abibcnabbb`YYbinnbmm^e_Z\huzxsr}}~jqrlggo}qoUJQLGBCOfuulcehcbhjridrhkt|~z{~ut|{skdh{~|njsojc^i}~xnjmnwodqb[adc`_`dhe^oxlwo`]]ckmgks{oieQVZXVPSdqvyszxt~|{z{uxof[R\t{uokpkYjf]hnmhd_ac`Xbrgrtgggksslox~qmpnmfgv}{}ojgVZXTI=AQbr|stspjui`blpqz}y}{}}skwmushq|~turvvifbemjcfn~}w||ynls{vu|m{nj]Ttu}|~{yvvpnx~z|~yuv|{o^WXZ^_Yglcwxnlnkgitx{xb[klkn`fhhidbjppom{wpskhir|~vyxy||usxpkms}~~xxurps}uou~||}t}||~rh`_grvzwunddjlonr{|~}~xv}uqs|}vtonpy~zvowshablvyplgdZUXYYWOZ_RZZTU^knlc\^gZ]i^gspf]W[cea_jb]oifjnxvwtokktzyvttlc_[VRGI^X]kebdjnokflz|rvo{{wros{{|kswmmnx{zxwwp~~wzrdlcXTVdr~zttssqh`qngwwuzts|v~~q|{|unshn}{zx|}{}|nsqg`cq~v||ui`WTTOJ\cWdaWVY_ff_bipfehY]bbb\^jrplad\Tdfgjuurtg^^juty|zunda\RJY`Vbc\^bmxzuvxznhmdlxyx||yumwtm|}tosxy~~{}~~yz}{qoWV_XV^kt~~tmookiv}qyvmlmv}xzllu}~{znupgyyqpu{{}vylkl]Y`kw~xpfdgd_Zb_QUSQT]lsoidch\\e\ajle^_bgidboebsmddgksy~itwjhikqw||oeddba`mk^a[UT_owzywy{ijockvxrpry|{ojtjejpz}~{yv|}}vukU_`WWY_hpy{tjuthruqqyzv}u{ty}vqpu}~z|xutlikt}z~~|kuvkfadikrzoklmnj`ihTZ[ST\eijeenuhjnZY^[ZZ^jutnil_Zhhghltww|wuug]W]hq}{tokeZcn^emdcglpqkhpxsrspuqmgen{~{kqrlijsvx}juskox~zvqxojtobUQQWo{xqfgue^dVLJMU_aenwujnfZ`cec^bihd^\cX_u~ohstxptz{{sts_bh`ZY\`r}yrganpdnmda_bhfdkw{z}njkljcfov{}{~jVOirtpox{~{}~usttvts~rgpgWNQXi~sqtrpwxptjfflzz~v|h[V[omlheda`fkihry|{~~uty}|qnpYW`WPVbqvtplmz|urxrokVKO\q~polmkedgc_^hohpxyy{}|~yomnrtmdkcQ^bZ\ckwz|~{zzw|}zyvqyj_jbWX_m|ztg^\YXZbwws|zrms{~tw}zuuuwyreccMM[WZdo~~yxuvtz~~yzqXYZPR\mywxyqjgb\ZVerkv{vx}}}{z}}{y~xqmmf\Zc[Tbb^`dq{yuyqpnYV^Z]dr~xlb_]^b`l{nnwpkow}yvnxzzxttvobZ[VJWacfkw}yqm|{tp^OUTTZkxog_^]X`sjhwtrw~{{~vp~}x~vjhkhdaddVX_][^m{{su|qfeZO[aabm{xnidbffbjylgpkiouzpvtow}{rpohb\[^PR^^]eu~|wx{mj[ISZZ_o~~zwpmle]alacqrvy|yvy|{vwwxvlfikkkeghUU^XU]kwyy}v{`VVJKUab[_db``dpkk~zwtqpnmtzz}|qw}ropnkdX\WFTcdisxy|z{x|qcZ_k|}}nlu{z|xyutzp~}u~{tqxwwwpiknsxvpyr^gmhlt{mq|ge]RZbfju}utsfmwnoxyrpopsrnt~pn}yrqoqvx~{|lmxu|y~r{jptjc``anm^`b]Ybntyyvwucem``ikhhimttoqwf^kjjlntwtt{{|xqsrv~upv||tg^^bmwc]]^UQ^qrcXdqisxxwifpc\ca]YWZdggmwpcijeeivvwyotj|wrce{xoie_Xel_YYVMKXm|{oq|njxyw|~u{qa``_aagprpqx~ypeq}sywtmg]TXfrzjbcccgjjiZXgaVZ^\]fpy}to|zn{|}w|smljlmvvi`i~qxvty~{wp`OOMHTex{qjinc`lme^]\[`gmupdnp\TWW[dmv}}|vttz~wsotobWPPNIO\kt|vkbYMGLSX]]ceTUbc`elmoqooo_ZjfZ_dhotv|}xx||xz~kknwz_ZZ\cn~xoeWSZTNPRNEDGKRX]ml`krjfiijmnotobkwjbcbdghox{}½sf_]afkv}pe`WQQTYYQVVGCHJHMT[ac_fk[]oposuuvtpqn^Yig^`djoqum`^J?nU@LVP_P`[K[XYcr|poX`^gtvrulcvcgeytyxOKVZtov|rh}qov_nlNHGEIʹtz[CO:DpRSS]v\au`d@Dlc|zimgYxskxyz~znuYjb@QbczuZx`ts__`;G\c{wx^ePLbQIWkma`v\WKNROor`x]^^{pk{n]P]M]fzkzvrv`mqm²z`UWD6G{hoNBtQBHNse_~snJ?n]fpav{rn]uupk|pp{s{bpsKJP;z]yru|xqtd^tSDc]gauspfOa[SGgg`]qnVYNU>[yht}]ecZya~b|[eZKTW|zwz~unnkkepĶxcqZG9PbkzLqoDDBilXx~ug:blWe^T~|]rrvl}|yvnoulg`MX7Ir{rxq~{urn|tl`ygMfebSFűy_macO_d\XatU^bdHPiVcy\{hf]uhva|eokLSK_\|zwoninik}liVELL@hģg}QMGopZ{|lBem]bYLpprduq|l}wyykrzlh}bX_?PuU_is{}um}xjki]zmjJ6p{ĥuvyaq_[U_jScnpJX\CVgUiebhZj}jMPTTElxxvd{ogc|uzieN\>4Pox|_VamlXMtc`fTUmO^mux}yjswrm}awm\g\Hs]fkgSayupo~rwwxps^\Bl]:?]Veût}kjfdnx}i\eGDQ>>X\nơvwgfvqQif_\\O`lb}x}gpccWf^k~hyyc8Zcljy~o|\zX^|ny{bkkVY^7JEC\`ʰwqytqeXfXL]TLglmytx^kY[swz\ssU[bSZ_`rq{aisdl~yawZO=/R*(Htz}slerd`odYpZMjNgUlp~m`~noqjVUWCN\Ys¢p|gurlx|xrt_c~QIXaI_]K5m̸|{upmeuQU6XX9Gt~rjs~|npuagkY^bNXkSq~|r}{lurjtuh`wroC]ZQ?@`]uycgNnsNNkg[wrYQmovhq{mu}in|Zb^AD2f]Wwzu}sp}{`~}jaqVQO=8KP`ȯk^`|udOqfeNfupw|s~p{hypXUIqT;KhShn{zrkfYrw|z{|vzxbX[JEM?F[Sfmg}exr_h]MVccz|qucY^_Oh~cwi@Vgdbg~pl]|`a{vtyknrahhLRWGY̵ѽx{rbgaVb]Yoljwo`{ecqmSxxsZ_jT]_U`zxoj|bv~fm~on^nM;,BU32\njưytt~rw~efpWeiRTYizmmzd{vjvfSUTGTX[yygyxv}vz~f[SubBMiOQe\:Dqyǻ||ocQD\pNLt}on}z~jckbdmahkRV_Mfnagxxnqqgvx}vkqlj~|\@acYCI[Naon}ufirXlfnrP_~wtxvn{vuvixe`lL;2SbHUv~zrmufckw}}mdn_UiPJFJB6M^mгvse~URXueV||pbw~hvob\eb_RocX^ajT~tlravptvx}Ycf@AH(Kd7FDcnб{q}whkm`G_wgvozZjhkfl_iwbh9Wvcyse|y~yjteve^}sxq~adq^eRLD3LMERzodhWxpVu{nUxqk]nm_Rln[aRaCTo\t˚|pfvumwrvqd}WHV47i<36BfOkȨvu~m\Sn_fovspY~`kevivzSCybajSX|t~fhvwNyXihj~s`{pdhUU;EHB8Nfintjkdo~Un|r~~ofyjc^xeadg[:[RJlnnyslqmosi|my}Z\Z1Uc28-JW?hzqſ°ñ~pe`oXdkwspnpc`hpzUVz^^]JXn`uwhn}vSyNUWstgoeea^COHF4HNN\nʧ~s}n~Wou|~k{wm|ikbyldlsa<[L?]ZV{}rmjmi`xx{|q|bee8Yj47/GW@[ootVų~zl|a]jxlbv}b^bxthU|ibaMOkT`gyou{~[|ROImw}~g{vajakPVRQ>:M=IRxuš|xm^|~moymskhrxbnorLT^BFS>ps~òwrskv[hnyt}qy`fODpM5.@]JGhgjSSҶchmoRpssodboTrjj]F``R`hwgyv|qfoeRJbzlxrp_ecnYW]TR;M>BAageŵ}}^rbxt{spr}^foqV_jOEI4Wz^fq˿x}szafirrm~zifSKtT<2CcOBch`KAxʺnsqlUlwjp{qzmjp]wvn_K`_S\alXnu|ltdxp]Rrzah|{xgigsZZ][RDU>EBXQSl͸~gscqpz~{~{^emmVnoRFE2\gMOeȿ~{^lftkux~z~}lkTf}Q?8V^GHhf^:Hrr~ǫz~|dayk`ffwynwxi}nYRlXY]dXR^fyrwmign`hpXp{k{zúxqnp`knbbcZdfgrupqpx{qqtr{vsnvlrx{zf_`s~~da\antw~x~ul^gtwgiwRa^bnluuwpqmfq}{}xwqchwsf[gridKSNDKLMcnkxǾZ-TȷqO58LRYbeyxoavv~lknejim{up|{ygN`x`eg_mtqvlztxG_`EHEMZWorc|~is\i{tvruvvήqSI'?ĪvneaG5KR?[_HXak{k]isbqnOuwiLRYelYJ``hv}v~oebamL~|t~vmaVfkM}jmpuk_oavz^bflird|txln§tz|PB8!>/o׼wUae^VDJONknEKNX{[lIe{oXCTbikeGS^t~{thtUeRP_Zy}zwP[G[f`toyclmvnptdlli~crnonĭhsmAIB"48vıxx\`m\KPXRJofBUWXrccJoleyUAZb_`nNOeuyhjXs]QX`ttw{wujL[HTgjr}|kjvu}jjgrqllprwlbfe;IN,3>uŧque]saJYbZGkoDRYQlhdOjtdx_=Ua\VpaPh{j~q[zsXYZ{i}xxuwhnESJLjp{~xxiv{|vgnk~nnyrkzlkXe?=V?9ChǩƭxopWmmOPfcOY}SEWJ`ogYXmtrCC\_VfuYd}uq]kc_Xpk{|tqty`nI?H:Vws}z{yl|u}wyyw~wyyu|~ppaPPH/OZRhhejxeQfq_Uyq?HCGombSwvY6L]ZY~wpzylgsolbvk~}ghb{pVXuF+;6_~uw|{l|qq~vuyxy|yxvypicYOQ<7YS[lqdzv_[ys^c[>K>Vuk[_~}F=V^Pduo~fzozduziw{}tos_nzdQji/05U`U[swpstw{x{u{is~wpwrc|l_aulV]rC'50U}Ηlqruxw|uuw|mnwupumltzixhFHGTSFQ_XYqzzq{pw~zx~exwoyo`vm^^mmXUpP&44Oբqmo~y~xpu{q}ohpkujtht}kipEB@LRK?IXPwr~~}v{r`ISIi{pak~HF]a[n{wpuyysnymuy}qtjds\Y^j]Mai7.LQLH]em{}{}|YTP[un\|^BViktv{|xhv|~s}rk~mVmZQMVUKXoQ7DHxÒurwywk}nntzqgnuujflrzWfvsqxrhQfO79COQKLcbz|}}{VYPptjb}OH`no~|}wm|ru{xmp~ZbhTONXPMeh@;DTѭruxxewvzmztkexsjjb{s_YlupwsnWXb@9>KPNGUadsd[Vayt_|`EXlpy~{z|lw|v{ql}cYmXRMURL]nL7@Fzлxw}x}yermyxleplrmeyogTfsquun_QeH:=HPOGK\Zys}w^]\xjltKPfptz|hwvtlsqVkaTNNTNTk_;=ET[\Wbmyykgw}|fpiR_u~{j|zvhdkroWSeNNEDKRcujRW`ź|zrvn}flkvrrwiehzı|o|~TONdzmZ`_nw|pWb~sxMXX@LJ^kkW\lxssiORQl~|]_]mzyxi~`VAYDHPMcojZxz{}Y_]dtuxzmSVYMaX\ppYXiVwv}dW_Tjkqsj{cwerevsqm^jlѝq`wfe|{|smQ[WV{|lk~~dh|jigezkcvpUTgKctrjdm_p{qg}`jYB\oťdvVH^firo[KXRJmpf|ej~{vfnqR`ywzu}xguiMSdH]qlwruyi{z}n^I[E>[qdUcdlwqWJVIGn|e`qVfsqm|q]geGcv}zysfq^EU`F`qiuq{yi~zx}~uRE[ABZqgYddp}uVLWFGpza^kQfqnk{o^gbEhs{||uiq^EW_H_liszoyvg~{{w~vSE[CBWln[d_n{YKWEEn|`XcMdpnjzxejbEex{|wiq_EU_H]hiovzozwf~}~w{t~wUF\JASfv]d^jaKZHBh~dS`K\pmjwjkfG\z|{kqeJRfMYe~pmwruu|gt|}on}z]EVRAR]egbcnJXN?]mPXKQplkotmjLN~~}zppkOLeSVbuyjxrqlkv}jm~{fHO\DPVxoej^y{STZBNxyVPPChomlpo[Bj|}}yop[H^bRchntxxnygy}srxozpQDXNKXejqdljL_LCegKP@Trmlu|rjFP~yrqgMPgW`e{|rs~qlntwgiĵzs_CKZJY\~ypwbz}WU_ELv~WKJ>dqmmwr]>`yyro\I[fYjjz|vp{ixzupieƮ|tjQ?RUQdez|weuO_XDYtMJ?DpoopwqP@n|{tqjRLcadqs~~lujqsdwlm½um]@EZRch{|kt}aSgMKq^HH8[unn~ue>Tuzvso^KYh`tn{xu{lwzpkdaİtodK=RXXome}]eunbhrrO^uoZ]j_dkji~iovxnxiaGq|sxuo|}{bl|_eybHgsLIj|ff^oc_\>&Qovaak`s|yulvnipxvK]\E}`m{plmjtwituy}n{zerb7~boY[jr{zksYWOUzuyd}v·ARFkjKE5YRJPryvwrP8nmozx}ps}sf_}lkK[cEWxdk|gpG_p|kE9^p̖|i]FZPctv]bxYtq\HTLU>9UNtn~r~{e`yge^N^_oĮh[tseur{\hoxxZGU<5]}Z^gL`xag^bpVetmj5V[2HXa`z\fpr_l^HsOKcSi~~c~jp{zů~iu\G[K[Kizugv[^|uTfhKP\Y^B3>!Xpkl|i}xkVxiwfboa^SiisǢogovxmxznr_j}wxranD42>WuŖcc{[idbsUdrfp?ep9?:9Tp`~qjlqyirkV{hZoTAi^xĬanyz}V{yx^t\Z8%pjįgX]flNMQ_b]GJ*4N?eshxjQdrrntvmhfW7rĝt{y~q~wu}{wq{\qŽ~ohP@BABBU}ʮvlgpfh_ufmNJ~[MMD8KSh~~rlzy}uq_o\o_nwMcYB]eº`spuewchw̫tv{h^0CZ@T{ŲkrczjUGV\bWKM4RG,T]a{qtxyktfqxmxwwuU=ip|~gwjzv|}dox}~ĸzrXKVML37F\Է{ynvnlzohIQx^S[TDSDUe|nuh{xtv^eTyart[r]MQRwĹszhsfT]|yp`?KdA=XjȌhy_Q\]bRIM?cS4EEFss~yiwjpui|~~zd?nln_rpqb|yvq}mkbǘr~bQWVV?55;vž̨~ykk[IthQ\_O[RSX`\PwldppkUmggvflnRZVgpk{|j|q|`Uexn|fS=fVANY]rqob`ki`HI>YhLBN@Oc\yzttxj|{olyw}xDXsqiSmox}qzi]^|l\W`ZL742[ol˯kwyyt~oQ<6+'Rv~\iTyhlus}^dm~mhT+3QgnsDZp|n^pt{~d+&1N_k~zqDTUN=9qt]RRA'XTXTjnQpknY}LCF8IvǨ|gps^kuxfqM_x`PW{ȳu{sYNWnpU[QQoVeKALjxq}inowYvxZqjcALoofG:`_kk²olwsq~{KPT<62hƝydTs_RDf~oH1P{fekoxfv|luxfc{{xrc^?-Bkf~y\qugdlebŪwϻursYL3?UZwȦ{a_fsj\onbaT[*IhZdGnvnUKvfk{of|sZm[5Kqhjxknxkwwpykkal;+,$bȾk{h`pfoVwlHQLUIZgck}{qeyj_k|yquyse^4(\Xtrxxvym]w|iRdʧr{oc9KI;LShķVldOOrlY;Kn]9:HRMg~xkiezpgurqhZQTP[hzodmYzkkxzmvhS-"]¦{nkWbcWgzy[\>>kWiijm|nsxy}~WljrS{eMrqI-6S`s`tf`{}prwecTF>LAFjm_bTF]zui_{q`Vh`IXxtvrko|||rnujdl}lZU4Hpm[w{WXpk¹svp`[1WE.Wnii`e]`pzsPGMKY^zVnze{vdZ{a^YQGs|tiggU[iff˸zoux}xfovhwahtXarU88aZ]xyMR}wgguNR6O|Vt|ois{d}bf^_`xxaKLWctįliZeda~kvogahvh^[]O?E\T~yh@txrmXgZC+Ezjfqh]f{rkZPqunydSG?pzovzw\jw~n[ZVNUxeR:J`^rԵosWgalu{mOKRMTZ~nxuzvkjso|Eo{hrRfZE3@yhqqo|mqjYfhdYVWC/;_Ĕni\MX^PYmXM9\x}td|xiiSXXcm}fPJJLNfŢku^oomazVOllQCH=GQc}y\ignm[JPSULc_sxmv_g{NGSRMTkUG?fpvm~}p^j|ywdDybTI1GFFR~a_fUPh]vizpoplxwo~ynqsGvwbxk^QUZNVzÙp]}utvl[zxppu~a{T`\cabU41ASj}̮}ovbk{TV=Qad]_|a`dZbqzlWmuXGV[e}s}}xnbp{`\yeLQH76KA?@bʧðbklg^]`TLRirt{umyw}j`mq|}UipHI5F^di{it~uuyogw^ZXPL73?Wfiþn`hr[LB4?h^hawze}nkLv\eYXSRJ?UrsvWtwctg~y|shk|~~|Y;IYSKOr~Ǿ||y{si[TVX\murc|hleYFPzpRH=-;__nprzphgl~|v_Sgqwve8AP7FF^}˳srcEKmxtzktrvwqbhifl|uXz^AKHOi{o}xqw`SKPZ{~ckT`TE<3;IZcm}uwnL=q_klcwpid|tifiejiNoh>2Riu£sz`p|Zows|qSWOLBWviD%")[àgrPHKYh}wyvw~}xknrh_]mqkcM,Migzow{|`Qgq\MR\Z[bR-LH;[q~tfrse_m{iGDIUeopitmtgmdTy\@DLdy~|~{yvqj\xtqd]S\qTXKPwqi_O<7bɼtx~yioOEzgswv|_z`fLPXVOMgjQ@BWit}\n~cjtmmk_WVfbVLJMILRFnĵ|sfl}g{vnrh\pqzytrilg[W[gbXZR7ayvzr}stp]Rd{ppxzxdWcsifgiZVD2YTMf|~}wZVX`ntrnlpqhi|wcQIHau`iRUofflkkvw|zxujecua~{}dFiXJS=D?3+8]kiq}˯³{hndYBx~wvx{jq]][]cnvbPIN\i~mbce`]ykkYQOP\VOJHH@I^Svwhk\QG?[wuooqvzVJYu~|}u^VL?pw|z~mY]qsnqhgycI;5?[mTQ86Zhw´hZZW`mpx~{kUGrkbiKF=29Uoj~bhiey|~}zzL^gFUW[\ZU?8E[zȰrosvebD`rtspo^V]emq]NFEMTsvh~gQJMSdywsmwhM8F`snc]H?PGouwrpd`bwo{opodm~lQMLRgv[PC;bw}sbT^ju~wmmb_UH=^jOR8&,/?d̷v{tlnlzyxppUP{fepeb\ZTN`uztzsolu`jcb}owrJdiSTS[ZWL64=Ofz©íujkQQV`h}zpsutk|qjXRetvjbcUfuns|voiqzvx{ypui`YJSgi^KFA=PT=HFRħz|sqfb`lz}wzoacafg[TokNOA9HWfsyigx|{t~li^VTXIEn]IPFEPZgk}̳zwp^\g~mv|lr|ilL]~lhb\YRSLOcs|y}{^lz[lhakkqyuqurkDSaeh`S;:KT^crz{µvillu}qgYMIKg|{kTH@Gfbe}t{zulgahtswx~o~zof]GAUZleevowstsq|i`skgemua\VPS^{}]mǺncepkbesgx~yjUIUxuR?\gkmijjwtw{khyFCHPWdvhazôgIV]lvh^IEEGH]}hsСxgg]`vgnkm{jaQabZƸzrzjM~c?MsegF(2MADQRgwzhdvmXuw_jyxnlH]txd_k`^Wamvtlejkvw\fgUZ\ѽpei~jѻYNir˒v^NLDD?ELRMTK1tqdy|~uk\i[bfkmYWUEHhyrtxm|Y[>̥qcv|_[vn|tsȎ}gK,6Kiסr[P/SnPY-WiO_giRTvq|k}pcgffzugflxn[ezaRSdwsZuoc_tqgD]yssĽ}q}zz_]J@P̼ʡiqI@KemSCLJE[iqXwx_E@_sh|jOYcU\xkJnqwbiW_ƣtk{{qom|zv_fxdotpgH(\bo|¼pJng\UalFAmzpSFv|L:HVYUqz|pQli_]|y{ZaG\Wisx~jZ[lb~q{z{iXvna]bE1fǢxomiT[\KZo}|fiTBnXgnuxkl{TSvbn^^>itP:Nmx~btljse{rmjvoY^ROOeU\Įg^YZaTH[[NtoXP`fLLxxs{vwpjRhlnnzb_nYKEvatñhs^]tqTU|sw«||yumVOT;,EFfngúҵniugJ35BfrF+2KO]wb`v|ac\hqaN?e]CJ[rhҹ˯tco`^iukpu[xntxvmSFS60Sqpū˷sZvYNNUTc[T@9ME_c~tWyvaus_hvgHRlH7?TƭrUXizih|f{{xfl`:GgSSTT|کhts8Xrh^jWVWZN:zisgY\vgyysSfm>OudUQjȚakvx|pv]|oxwmyX{W@PTKeevʶfSThtzmSSimdOvmhFXjk\Wwtd`L:moUb\yȖ}hrxtuixv~xSyj3/`ZQ_^џfv|WZN^ig\eR\zVqqoXkb}a_yq]zANoXazxlymi}l|x`jk{}okrqxZ5\Z?_tu׳~tzY`[^hlPRRVs\LpNxlc|mYqfZo{q@D{_@]Ƨr}qf~yuhwzbyzxv~^\{nq]:NZ:Glx~ǽtwmVNeka[K`jW|Tf^ntc~_ruL:hW?c}zv~|jsmvuuibsybVuyb9Tg9skCXov{|v|~uswoindsmets_GdP=[Ydpµ~{r}yhjZWePridrzjknf_wdJPQO2*U}oeimYlsrVqmcr??D^\:3FIUp˻mrrbnq^@ohUnzpzztk}cpq}|pqc>HdgsRxs~y|}lih|wgN^}pqkqn}ZEwfJ:LZEEIį͘~sr_RXadNbfiz~he`SzcThpaAn^N-L~b}̲|e`t`ix}{u\Y^c_PoZ: BFSHEƟcjm]\ppf`{{v^lSn|fl;/3SbU\~|jnjmxkYtbOmydMo[[ac_OHA27cԧzv|yhsgSE`lua_sq}vRhmddq~qF`gHGO{x~xbyHQXuwokzW.TygGCPI8WNRaēæo|q~yqckWPkvyYgmnaia`oqiGbVH4QwuĖvwwmhpaf~omwwnQ`JThDI'%2WŻZ\paliO>nnpgs^zu}a]P~j\b_RHUWZpī{r~}vahd]`v~iq~u[~iH^{T\llL&GrRL]ҸwujgjW@Mfetu`yrjI;uaE@MB+g|Ӱqɫzxbt}otakvsnv|dbaj^IR_Za`b,1\L]aЯqrHcwfqxoxzz~g^dtyhlaKmIOKEYxy`TUZeWHzyceWVeQWDm[9<=EDcx͸qzQQygsqva{buqSqp_PmpivoI0Svuzt}ybbgearhrg]B`f^@0bk;%0EFJݺԬ|ykzYe[bb~}sv|s`W\kh[kmjf`d,Ywu}rwfWH}usv~ysdjTHQ_k`QX,CV@\`pû}uZpVEW`UmomgZ[xlmX`v>FIW`sro~u}y|cG{Z|jfj[S__·}u{{jPbcpwk|f`JEO`gPLRFOI`BK±ոh~fNk~nuvqaem[_mspVVJ7mdo~~yajNweLWkljwuNYxkXPdnPS,WQ2R\tȫ~uv{rqp`luofbYUHCiun\`ylabp\QqyusomaR{yqnx~s{kmnt_?Ritxy|}}q}w`BPW[WTSYnkk~ohv~y}h(JV[`px{izxx~Wm}z{txrjYz}~|v`4.ER^]eckrol\kz/wbTUQ^YYLSv`c^^wutp~zʢrtjipxva3C[psw~zp`]s}`YY^,Zxxvfc\v]hv[idnt}uDzkhjWSbz^DeóǙx[:/OXKB>vp{rSHot^_`|}v{jT^hsd\Pbnmìzz}uwxrrM|~pj\nseprmbnĻŬ~rtgKLUb[PJPn_¬}z{mhi_ha2UeOM6`{yz^FXzO=DVJE7j}u~g|fG_f`aq~uztXXdrl\SNiW~~wtwp{|NpqrX~k{xfl~sn_ǺqstmOKTa^MEB^N±vondkh9WlTW9Twts\ER}S>BSHB7`yk}coL[jaamz~wzx\Wboo[SF`K~xztzVfrw\hlqhfxskbzµwzwstXHR^eQK:SIlutjiuOFt]\H?ovufLGmbD=MOC>F{gxgxZQpxfcd|w}jU[fr`VFSRW{|yumT~tqV~tjpckvhgeòt|rriKHR`[KC@XDxvktqF`u[a@Krqo[IS|~VA?NFB<]|e{_}TXwujgoyxvy_PZgo\UD[Ni{|uwe]xwjXomjamqfeluvnnaCDM\SH@GYKª}zpzoIiu]cANrpmYLY~|UA>LB@>e~g}`~V[wypmuy~wtv]KTajXTH`Uj}~wyi_{xqUzonl`gnbel²srjh`@=GXVJFGcPį}|qywRe}ahKGnqo^NWw[D?I?FNxetVd~}zwqw}qmigIAJ[bWXXxc}wbpv|iX~zlv}eYcc`i}szuyvkc][M15?SOOPguo~wmVyxdkHOljhVTcvQ@I@JXygvXdzov|~xujhdbG>EU]UY`~i{cxu}jXw|}rkxwbWb``lvs{v}pznm_[UVC-5ASLQTupĽfgrnhG]ihbT^qiN@EICOgx{li\m~ptyyoifdY>BJ]WVVmtnpiv}\dxwwjql]Zc[gznzmmupke[YUQ528JMIN`vfȯwdmuXQighY[i{YHAKBJYugz\fzmu|{vshhdcG?DTWOQ\t_zfue[ttwkl{p`XcZbo~pxmqsslh\[VU;27FLDHRmZͷjr{cRgfh]]k`NDLDJYoh{agxo~yy{ttijfgOBDOVJMTmXixpYorumjywdW_[]jvtsqzntjj]\XYG36=K@BFdXpŭs{}{vUbjid\gxnWHKKFSnnuhncqzns}vwmigg^EDFTKIKb_`rrx`bpnqhrl^Z`WdxwqzhmpkgbYZWV<46CE=BQdRкsymXihjabpgUIPIM\lksgiv|qr}tyqsghegVBCHTHJMhYnoz~||\fnongtiZ[]Xfwp{xeimed]XWUR955C@=CXbWζxzm\igjafsfVJQJQbplvhkx}qr}rvnpefcfVCBGRGJQj\pq{|adllmgtj\Z^Ygvnw|{ybxgic`[SUSR:34AC>FWiYϺx}u\ihkderl[LROQbquplis|vjnsklcbbb[DAAOIJRjigvtwl^jhmfo|o`V^Xcw{np{v{fdn`bYZPQORD349GAITpfzƼĮ|~gbigibnz{cUPVQ`vn|fn|}ivrnlhf]`]_K@@IQKTbyfpzz^fhkihwwfX\]_qyrjsrxl[uu]_VVOMNOJ645EDIVpsqÿȱ}qaifjdlxhZPWS`u}t|glw|kntjjcd[^\_OA@FRLUc|lp|{abfghfuzhY[^_rwthpoukWpsZ\TTMKMMK756EGKXrwsÿɱ~rbjgkenyj\SZWe|u}hny||~gnphfa`Y][^LB@GPLXi}krx~{_dcgfiwteW\\bvxmhpzmtdWslXXPQIKLOG657FEN]xq~îmgjikhu{gXV[Zm~svjqxwc{iibb\Z]]ZFB@LLO[stow{wp`edifr}m^W^\lw|glvmqoVbu]WROLINMO=64>CESivi˶iminjr~qbV\Zf{}yzloxz|~glpgd`_Y_]_ND?EKIUgve~xwzaechemzpbU[YdyzywiksonqZ\ubWTOOHNMQA739A?L^qaͼnplpnuvgX]Zdyx|vpqy}}kjvif`a[a_bSF@BJFQ`q_iigfel{weUROXuuiXhzceqt_ogo~p_achdVTU`\eqpzs~tcunkx`^bgmq}gigXIauoynrznnpqmZTNWSV`rkgr|kzy{nsszznb`Vgbezqdn~wjhRiy[QKPB>=GMO]msarop|{eijruxaZMTwwbp|fjtob|ys~~y|{~uhedokuqjkTdq][jURUY`dv}kYRQRjcjh`jzx{jM]nfw~xtaZU^]`l{vj~bHD?U~v{zm^GKThpy~~{fgjSJhgbiinhmkneXTS[Wamyfu{vzvoqs{~qijk{lk\?Mkiz{cUJLJGR^^Ktqwuwomp{}hjipqzwcNNM^uhirvezvr|x~~{ywzxswvbneTVS[\ju}gWILLaxj`pr^dmlkiQMqz{vgb`hcnzo~~z_I@HTzy}pZJQ[mq|{{p^e`IQqllkijgmlpc[W[`]jvycx}utrw||kknz~}x~h\^N@aycYPUPS_hZUqv{~x{iuo~zjkhoozjYLT\zuxflu}ll|xx~xs|~tuwqngs`YVX^bpxq_NKQZxv}`e{yd^erlag[Kgpjdkim{zr}vzv|y^MBNY{zuaNSZkpzyvm\c`KOrsolhliqoti`\^c`nxwa~z||~yvsx}|lmqvsww^X\LDilcZ^W]glX]|pu|{}}}vwi|zpukihno|zeTOWb}zofnz{zfy|v|yz{nzv}xptv}mxq`^Y`bnw|gWLQSl~{kcr{i[aiz~~qahbMV{{rkmnm{}l}twuz~~eSDJQl~kUW\krz{vo^edNLlplkionusxmc^_c`nvs^|x{~|z~zxsy}|lnm}pqt~s]_\GDgtxxngh_l}|zoipyved{{cai_koolryiXWVdu}wPU{xogvojj]br~ftypvwxtrieox{|fdsq]o|}qaaak~|`bvz|m\tz}{xta^mrt~|vnv}}qwishgqv{ytc]^b}}SCX|qa_kaQbztvuxnndesyv~{zviotv}cid`qwg]__vx{fZgyptwj\O]qyvujkecWX_ix}vfkyacmbhkw|p__]jv{r_LVj}na{}~|yqrku{wdR_[aqr\QOPgz~hyecttfQMZmzus^k|zw~zoa_Y[m|{{{nptwqxv}vxv~yeTEUl}dVmskifqt~~xjc[]Wcosewxw}}|yriostj|gXhgjtnefhy~jery{l\VRTj|}sn_]`hsyun_eyqZ]iafhrx}o_`_l{qrnaP[mue{}|ruozzhrxdN\gkzm[[Xi|qon`f{~}viZMYf{~s~|ha}~zod\^\o{zrx{|u{nwz}~pu{wj_TVl~x__yxsmlsv~{}pf]Z\]oyuetw{~{{rotxxggys]\rs||kijtyx{kp}wk_SVXi~|tpcffntz{ogZkwhUbnkpnwxzmafg{~zjl~~|uja[l|qjwrwvwe^nlWSmu{h``dzl{}d^k{xyneVWdruxtbo{~of[_anvyz~rn{x{||hhwuslc\Zoib{ysnuw{}rg_\`as{wfttz~{{sosu|rcewr]\txpnpzyuzlr}vyf]SZ]pztgjhqt{xmc\pvdUgnnqpy{yldhlyrfn~zzph\^pmt~tvv}~wk[gpbP_qvzjjgxsrn`dxzzrfZQ^hz{w|hf|yvka_bg|zxvx|s~ps{|{idrurmaYRbtuh}}wpvx~vkc^a`ovrd~xv|{zqloq{~{qdizs\Zn{nZZZg|zqpqzl^lv~woc{||iqenuwzvy{}qvqfopztopwteefqy{zyXYq~nqptqsh~~}t}r~zw}}zrlqr~|{gmm~~zzmlnw{{uoZ_n|xxhyzfeug^ijmpolejkv}}usxfqux}|~qkmqyy~lVUiv{xfn|xxsv{y~||]^fl}qdY\]p}|jqthm{m]U`k~{|li~}~rligw}x}}|{poqt~}uro~~}|iZMYl|jZkzuqiqvuphjepwtgw{s}{}}ztlpoy~zrpl[ipw~voqtxvzifq~{vhd`ev~{{{snaa`elsxnicss]`nntr|ympo}|ysq{l_S`nui}}{}yy~~tq{dScmxqhhhyxftmck{{}rfWT_k{~y}|ik}}wmjil|{y|rqru~|uqpzr|zuf[P^oq_m~zvlrwuohjfpyvhq~s{||~zvlpou{vpk|nZdt|~tvv|xx{ogr{ysibefy|}|yskceckowqicfzyfYiswxwupsuuzlo}zzqg]_o|qn}|}z~~|qfjxo[Xp}qmlqvh||jbmxwwlcW]gr}}|xxhs|wphlmy}~{rusy{wtmvnhsrpld_^p}ncvxqxz{rlimm|~ug|ys{x|{ysnqpwzwngj{vd\s{xy}yt{purt{|}}oo}uusv|o\U~z[^oqrlswvwuqpm]h|rg[`cnv}ttxym|yor{qhp}kdv{|}~vtzj\ertxogZ\aiszz{zwchz~}|y~u~oq}trnedh|nz}zryregwz|ukirxwzwrvz~|zvyz|yhbzjo}~qqnpv|xxxzvpu{~lnwkk}|pdhhptzp{}ywxtypb]}qq{vjbo}wd_oruu{xu{xp|rfYajyps}}}{v{|r~u|z~{ujhuvwtzqkfn~xif|~y}yqa[grx~zlmnu|pztex{ketythactxlz~{{|xzvrn|}tehlvoluz~spmsqyym`ry~}ukchlx~vqwrfu}~~umkzmpyy}unachoz{fjx}ujc^lwsigxxiYdptspx|{rntwx{mn|}|uiejny~}{~kh}||ljv{}qst|~||zrnhuw~xm`TXXafqsv|~h^p{}~}xic|~wxpkabjr|xoguy~{}}{|wkqwnYbv~zrur{{n_lwkqoqqmhaghsxyokoshw~xppqxt~zmgjlv{spxt~{{utlg]bht}|jgstunsw{qrox{qtxq|ul`efpv~|o^iytgy{~}xqjpstrhfgy|wm_Y]`jnwrst}s`\s|{mhxrsnqmmgkqx{xql|~{}prsy~{}~q]ey}z}yjZcxmstttniaghpv|zposzhnz~~x}qrp~xvj`depxwj{|qtumlhebbnu|p_jt{zx~~tnpru~pmww{wqhekmvxzy{wd^urjy~z~zysuz|~zzyylkmv{}yn_]_cjoupsvq_czvglsrqnnjienrz~no}|~~~vkpowy|wx{u`Uh|wh]rvjmhjhgefoqxy~uppztgt}{pns{{y|uhfjmuy{}qromojkhkikisy~}jhuy{swz|rutx{vnw{}|tj`ddlpxxv{~j^q}of~|~y|yxtu{{}~|p|ymlpy~tk]]`emrwquxp_dz}viqqoljlijhsv{z}~ms~ytmpovw|vtu|q_[steaqlmjmjidhknsvxoosolz}zpss}yoeijrw~|vjzrixkkdfccafovuiu{{||rqqxyysv{{|tmadfkqvxsw{}j[f}shzwyuwvusryz~~q|xnmpwzqcccflpsnrxqah{~obq}opmnmjgemp{|mwwjijmrvztx{l[_u}l`nqqmmmifaffnszwrt}uenyxttu|z|sggknv{|nnylsrnjfgca\dhs}qt{uvu~}vo~wryy|yrhchhosyuv{wd^p}{mm~yyvzvtmopsz}wtxoomv{xt}qfigmpvssy}j^kyxid{poikhe_`eiu~{p{}}uikknrvxrvz|iX]q}qeqpokklifbfelrzxswyhnz~yuvu~yvymhklsv|y|sm~yjiumkfidc]adkvzs~yzw|~wpvuzzzzri`ccimtuszm^fwri{{{vwwtplpov{}nt~upqpzyvuznikkqsyuw}zhaq}vhgxomhkgf`cgku}zr~{}|tijjlpsuoty|iY^q~tgstqmlmjgafdjpwxsx}kmyzsvt|}yvzqhlkqt{zzuhs|mdxzjhaba`^_hkwsy{xyy~xs|w{y{voeaeeknsorxud^p{mkwvrvttopst{}~xlvzrrsx}xkjjkorwryveew~nbirmjgiggdkmt|sq}}}}tlcfdikpoms{ueYfypi}sqklkjgfkjptzutyufozwvxz~}~wljmmsv|x}nj|refofc_cadaint}{tz|z{t{wzz{zrjaedhkppnv~zi]i{qjwvpsrqnmrrx|}}yjqzxqqtw~ymlllqswsyuedv}mbjpjfdfegdmou|sr~|}}~zrhadbfgmijr{qbZk}{mk|rpknllgiklrvztx~ogs|}vyx~~z{riljorxyyvhruf`uwhf_babacknx~s|~~}~{uv{yzxyrlacdfknqnv}n_cutkzzwqqrpnkpntw~|zzioyzsrtu}zxz}qppptvzv}wfev|lcoplfefedaghpvswyw~}xqecddhjnjpw}k[Zmzxnxzuomnkidhfkowxw~|jmwzvwv|xttzomnnsuzw~}mhx~mbhngb_a__\bcjs}|z}|up~z~z|xqhbedikqnr{wf]jxzooxupsppjkklqw|xrjt}yrtrvvqo{zqsqtv{{{sem{thd{}plegee`addls}|s{ztv|}uncddehknks{|jZ[lxzq}}xqopmjeheimuvv~}lmx|xyvzupo}snposu{x}pgspde~tid_a__Z^`cluz~~uov}~}||tmdfehjoppy}l]bq}tm}{wpppnkgkhmqyyz}kmw|vstqvropwsuswx}zoeq}qffynjcfdd`bdfnu~}t}ysw~{{slbcbcfikirzziZ\mzyq|xropnkgjgkovxwlkv}xzv{xrq|smpmqsyx{tgn|rd`szjf^___]^demtz~zts}~y{vpfcfdijpms|ue]jxzooxtmommhjkjptzw|tgnwztutuytsxtttsvy}z{kgv|lcjtlfbecdaghms{yt~~wt~~zxvog_a_bchgis|teYarvq|wnonmjilkpszx{yimw{zzy}xuwyomnmqsxv}}mfsyh^b{qfa\`_a_eimu}yxt|~{yxqjbdcfhlmnx{l_eu~plzummmliilkosywy|pkkjfkpw~zvyv}~}rwyzy~xzzussuz~vw|xt{|x}zxry}~zzzuqsojpq|~ylgkoz~}xvz~~tyu}qyyskr}{~|wyy{ssuxty}}spvzwtz}|~wy{|~t}xsuyprvz{zzywsw}yx{|~}||}x~rozns~}wqv{}xvtqooyz~~|vwy|trz|{}xrnklnkdoypz{|{|yyw}|{urnus{|z~txstuu}uzzu}t~|zzzutsnlhroryx~{v{~zzz~xt|kqwwsx}zy~|wzxpsy|~y}ytzx{}tu~}~|xtjhqlqpq~~|yypq~}}xrtspyx}~~}{~xw{y{tsx~||y}x}yqos|vpoujklourz{v}}{z||}}piipr|wz|z~}tnpz}y}}zy~xw}{~~tvmhqjpsssw}w{}{yy}z||wquvq{wuw}x|ut|}{yyulr}~~{u}{}|tmtw|xtlsknmky~yw|zwouz~r{yvmqvz{w{~~}|{}xssx{~}|zvw}zvwpo{zpvrokivwst|}wxv{t}}{~}xytsoy}~zz}~}}~~xtyxxwyy~~|ytu}}|zz~~{z}rssjrow|{}}|w}|{|{~}upooqyxy|{vxnz}py}{srw|~|xvzr}|yv{xu{pqnojqv|tuqwxx|{}z{umkw|~{~xyzyrtvxzvvw}}zxuuuzx}z}{rvklwx{vwqv}}wvszw{|}~{rnoz}{}|z{{|vzx~|yz}~}m|}{~u~~vrz~}toort|x{x~xwzxz}|y|~{xrrvvvy{zrz}}{}xxs{z{z}z~wwsx}}|||~xv|}zpsotsuu~}z{yuw{{|vuwwupw{zz~~{x|{x|s}~yx|yz{{xqrmvy|~u{qwyqvuzy}y}x|yvx}~~|z{qyxzywutw|z~{||wzx~zw|}|~zyw}x}uxz~}}}roysqvyy~ywsxxw~w{}wzzry}qx}xuuzz~|v}{}z|~}|xsr{xvtzrs||}ywxwyzz~xquyquz}tstxwsv~xz|y}{{x}x{~z}s{w}v}v~zzrxgmry~{xtsvyzpx~{wx}~vv~u{x~zx~ywywty|{z}~}xswxyx}v~|zwyv|v}wx}xzxy~}xt~y{|uwv}zzzwyvpqt}ywy{vwqxw}|y|vwstmux~v|}}}uuwypq{z|ztqtsy~|rvuyx~|}puypsy|zwsu|zyzz~zswrw~~}zyw|||~zs~xxy{~||~vtonmiwxvrvxytzwvuswv|}~~|umttwzy~}{tz|z{rz~xtxuvxyuyyx|~tt|zrqu{sv~~svsz{yxwvwqly}}tyruw{{{|||uxmpu~}y|{xv|y|~~{}wnw|yyx}|yzwrvqx|}ysvx}{z}vommtuw}~~|svxww~|xvuwwuu{x|zwx~wy}}vvxxrxw~wqpurqwy|uyrx}~y~yxqw{vy~~ypwpzx}uyxust~~~yx}|{rtwz~~{ysx|xu{zvsyz|{~{w}xvxzpuz}zw|yww~~~sttvrq~{}{vmvstv|}w}y~~~xw~}}xttvuvwyys|u{sq|~yyx||w{zwuu~{}}u{yrsv{vwyw|}|yz|~}syyvszz|{}x|zoyv|y~ytmruvyz|{z|}~}zxz~pvzwvv{{wttpy|}|}uv~|~{~xxy~|}yw|wzyrovsqqu~{yuvxv{~|zvz|}~}ywxzyz}yst{xxx~|{zykyu{||~|~w|}yz~}}y|~{xumovusstvzwsu||}~{|yx~}|u}swv}~|swvryv|~xsxu|~v~wtz~}}|}|}||~{y}urltytwuz|pwr}xz{~~||wuqs~}}~}|ptyowpz|zq}z}}}y{{{~|vsux}ssxols|{~}xzw||xrvuxvu~z}yw|vzxtwo{||{{rpo|~z{}}x{ztkqqqoquvtt~y|wy{~wz}vvrv}{~~zsvqzzs~~xxuxzuru|}}xz|{~vyqyvrorty}wtwzpvnwxty|{}~~{u}{uys{vturutty~{rx{xx{~~~{v~|zyrq}}zulu}xomus~|xyt~{u|y{v~}wsu{{}xz~wyvup|}yuvpnps|x|zy|{}wzy}|yonutu|zvw{r~uvvtxx~|v||wqjv~|{y}su~{yv|}|zt}{qoxz~zy{}{|}x}r|}wuvurnwxwu~xumjs{}{u~~~vow{y}qtzuzz|y~uuxzw~~}|zy~|{~yptyy{|{sosrwrqr}w}yszyqx}}|~y~|x{ztvz~wyswrsv}y{tslqt~}~tv}zw}y~s|wlnnryu{v|tpxvtxyx~||zwnty~~xr{}{suw|vwxywpo{xt}|~|}x{}v||yzxuytrw~t|vvoohlq{~{~x~~tqwv}}|~~zqvuy|wxwqttxw|~}{zzrqtx~}||stvytlzzzyvw}}{vmr|}{yw}zww{yzytxru{|}{wurmwx~y|~~{tw}|}|zvojkvq{vv|wrvvxzw}yxvqwy|{uqtu|xx{}~~{}up|~~tvx{~{|~yzz|y{usrupttv{uxwrqmnv|zz~x||z{}skpt}|vv{{vpt}u}~zz}|~yqsvz|uyvkovw~}}z}vlnosw~{yz~z~x{yvwkeljbklnxw{uwx{}|yzxpspqvlnrlhvy|mkovy~~x}yt|{y~z|~~zlpunowt{{vxyxxzvy~w|z{|tvuqwrlrqhr{~|xqv|}{|yx{~~~pmuroyy~}ww~zozxxqtrglngmy{{}xxpfnuuyzv~}~urqmwut|{{}wmttpxyzvunluv{z|}y|v}{}vx~y}z{sqkrqlprwx~vhnokqqnxwy~}xyypjmghrqt~y{{u{z|{z~~wzx{{}uv{wz|{z|xz||}tnomw{vyy|zw~sy}{~z~||z}~{xxt|sz{{~z~qrwsv|y|~ytswqllnr}~|}{y~nkmnz|x|yzzu{pwyxyspwtu}x{z{z{y|v~|}tz||y~}rpoq{zvwrrx|xouutrjhonoz~}yuqvwnsxtuxt|ww~{u|~zrwyxw{}}|~~ty}zy|}~poqt}}y|w~v~~ut|}|~~}}|}uxq}y||zwy|{|zw{~xy}{{psxtplt{zvwznloq{|}w{v}~sy||xpkrrow~}||y}{{~z{}~~sxzz~~}~upppv|wwxpzxzuvzzwohlplr{}||~www~tszxuusu}yw|z~v{{~stxw{}z|{~x|}}ytz~~zxqprw~{|z}}}z}uv}||~{{}||syry~|}{|~{xz~xx}zxpvzvtpuz~wuwzpmnqy|~}w{v~uy|{rlpsnu~|{y|||{}x}}twz{~{wplmpyyuxst~}|vz|~umkqpny~z}{|yv|}sz{xttsz|wz~|}w}~{}zqwwy}||}yy~zw}|{vz~~{{vrpsy~y~y|}}wx~{~zyyzxz|~||t|u}y~||~~{xz~wy}zvqyzxwsvz|uuyxrnnrz{~|x{x}vy|zqmprox|zy}{~|z{}~syz}}yy}snilpxvuxsz~zy{upntpr}{|||}zw|w~zyttv|yy|~zu}y~tsxw|{~~zwz|vz~|yx{{zvprv}||z~}||zw}||yww|zvxx}|~wzwy}~|zz~xy~{vsz|xzvux}vvzytonrx~z}|x{yvxzyrnprpy}z{~{~~~|z|~}~uzz~~zyzyqlilqwsvvt}z{|}uqsurz~}~{~}xzz|}zxuvz}w{{}{yz}{|sww{}|}~{xw{ww}~yw~~}~xsqty|~~z}z|~|xz|z~{wxz{twv{}{}xwy}|~|z~yz}vt{}x{yuw~xx{ztonrw|y|{y{yvxyxsnqqq{|}{~~}}y~~}v{{~~|zz|vpjjlrtqutu||~|wsvtv~||x}{~|{xwx|{wz{{|w|}{txx}|||zxxzuy}|vx~}xrru{}z}|||~|{~{w{z{~}zxx{ztuv{|{{zvwv~}}y}~vw}}y|zux~yz|ztoorxzw{zz{~zvxx}ytprqr|~|}}~}{|~wz{~~|{|{yzzqlikotpstu}{}~~~{wwxu~~~zy|{zxyzyyz~}{}w{~wvyzz|{|zwzvv|~yv|~~{vrtw}y{}{z~{~~{y|x}~~{xxw{xstvz}y{yvyv~zwy~~z}{ux~{|}{tpprxyvzz{{yvww{yuqsrs}}}}~}}z~yy|~~~z~zy{yy}|rmikmspruu{~{x{v|~}z~|}{zzz~~xz|{}w~~}}uxy|{z{{}{yy{uz~~xy}yusuy}x|||}z||}~z{|y~{|zywwv{vrswy~y|yx}x{~w{~~z~{vy~|}{uqrsyxvzz}z|z|twvzxurvsv}}~}~z|yz}}{z}}ww~|yxx}zpljkototvy{{|x~|z||{z|{|y{~~|{u}~ztyy~~x{z||{x|yw~|x~}}wtuv|yy||}||z}}|z}y~~z|{|zwvvuyxrsuy|y|zy}y|x{z~}wx}~}vrrsyxvzz~z~x}tvuyyvswuw}}~}~z|y{}|y{~z|}vv~~zxyx}wokjkpspvv{}~{|}||}|{||~zz|~{}yz}vwz{zy{z}|zz|w|~y{}~zvuuy{w|{~|zy{{~}y|z{~zy|y{wvvvwzsstwyzzzx{{~~z|{}xx~wtrrwxuzy~z~x~}tvuxywsxuy}~~|yy|}~{~x|~~y|{uv~~|zyzy}uokkkqqpuv}|}}}}~~||~}z{|}|{~w~~vzz}yzz{}|y{{w~~|x}}|~zwvu{yx|{{~{x{z~~{y}y~~~yyyzyvvwvxyrstwy~wyww|x{{yy~xtssxxuzzz}y~}tvtxxwtyvz~~|z}z|~~}~{~xz}}yz|uty||zy{y}xpmkkorntu{|~|}|}~~}{|~~}}z}|x~zx{{|x{y}}|y~y{}zz}~|}zvvv|w{{~z|{yzz~|zy}y|{wy}wzwuuxvzwstuvz|vyvy~x||yy~yutsxxvzzz~y}}tvtxxwtyx{~|~{zvxkrvwxyyxxxz{{||||}}|w}zyyzyz{}}x~|}}sztrqsty}zyyv{}~~}{s~{|{}{}}z{w}z{}xq|z~~|}|{vxxz{~~{~}~y~ysxpport|{|xx~yy}vnrrluq|}zuypqywz{|z}|}y|}}{uxy||x{yuxxsrsst{|z~~z{upvorrr{wsrtjuwyz|wvux}{{v|~{}}|||z|y{}{}{~|}~y}~w~xxwzv{{}|z}y~~{{|w|u|zvpuor{{~xwpw}y{x~{{yv{u|{vvyvsyz~|y{|z|||~}~y}xvtwrw|~z~z{~xrstq}|~~usx~{z{||zx{uzty~xytuwxotu|}{x~y}{zzyvvyurx}~~yz|z{uqxs|}}~~~{sv{}x~z{|{z|wu{wzvxz}rrq}}|}wy{xz~{zy{yx}yswy}}zvvzz|vrzv|{yyz{}vuy~xz|z~~~yuz~wzy{}wuox~{|x~yyux}x{y|{{}vyv|~zwvzy}wrzw|yxxxy}xuw~xyz|{ux}w{z}xvow}z{z~ywsx{vz{~}|}xzv{}zwwyz}vt|y|xwxuy{ytx}xv{~|vw~x|}~yyox{zx}y|tryxu}y}~~}|{zv~{|{wxy{~vv~{{wvxsxyysx|yu|{vv~y}~yzowzyw~y|tqyxu}z|~~||{{v~z~|yyz|xv~|{xwxsxyysx|yv||uu}z|~y{ovzxx~y|uqyyt}{|}~{|y|u~y}{y{|yu}|xwwuwzxsu~ww{~vt{z|~{{rr{wz|~z~vrv{r|z}}{w}u}z}}y||}u}}zyvyu}xurw{z~wsx|z|~zvo}}w}~x|}xss}s|~~y{{z|v|vz{}z|}~wz~|zw|s|zwp|z{x~{ttz{~~xznwyyx}t~vnyuzvtk~}ytz{|z{zu}xx~~{qny{vvwz{wzxyvwuzv{yx~u{z{z|toq|y}{}ty{{s{{{x}|~x{zxywxzz{z~}}y}{z|y}}}xyz||z~}vz{llnxvw||{xv{z|{tv|~~syy}}w}wvs}~~}{}u~~wyw~{|zuskdqot{tp{zny{wy{{wvvxy}{}~wrv~w{xyx}w|z|y}{o{tt}xvvpjmgprxw{vx|u{xzx}z{~{vv{|~{}x{nt~}~|}wz{{||qwwuxx{~~{{sroyssswuykz{rt{}v}yzyv}u{{xvt{}|~zzw~{}zwr|ytvo~}|smtpr~tvuvty}{}su{qx~|wy}{u|{zuy~z~yxy{ysuquy}xzz{xshyst~uxzvruu}z}}vvywt|x|ytx~ztv}|~~~~tytxoyus{z|zzttpoukv|vzso|{|ur}xws|xyuu}|~yyvzzy{{{z~~|{}rzwutlw|~ypmstvzp|~uvy}}zxz~{twuv|z||~{vz~zx|~~{{~~}{{~{}vyqs{vv{|{x|trru}zy{u~}ty}|s{px|v{ztu~}{sswyyvy~x|w||~~sxzruvx~vtuozz{{xqovz~{yy~n{xvzrt}|wy{vxsuq~|~w~|~~}}{vxspmrzup}uv{s|}xyqu~~}{}{~yyvr}|yyz~~}xusz~p{y}|}~~~|}{~{spwxxvxv~{z~xyvr{{{xxxtz}zt{{swx|{{|{vsztt}~{~{|z}}z|yrtsy|~y}}ytw|~{yuxxx{~s|~t{~puu~y~|zzz}}zy}y~zz}~{zpk~}}u~{z~wwnvx|z}}v{x{ywzw{}yz|xx}y~~~~~}z|ypuvlxuurqxzz|{rvoqtvy}x~~wz}y}|yw{y{~{z|tyv||wojxzvwvvqutzx|~x|xnoklkqyzz|{~{x|}~wwxyzv{}{y{s{{z~{~{{vklu{zzxxzy{w}}}lloiikrz{y}{|}}xy{xzy}{vww|}vx~{~~wlgy{r|ywuvx}z}|{tnrljjnv{w}{|w}zw|zyzx}}x|~wy|~xrlqt}{wrrvy}y}|{qqqmkmqww|~xyxz{{|||vzw~~||~ww~yzvomyy~{tuz|}y}}rnrpmopsvy~|~vtzw|{{~~{tzx~~}xx~x~|woj}|w}uxzz}{|~~|rmqrnoorvv{|{~xvyw}z|}yt}~w~~yy}}upiz|v~|vwx{zz|tmrrnnqsuu}z|~|uxx}y|||{v~{}{}~yy|}|uoizxt~wz|}{~~uprrlostvw~}}}|ytxy|x{|}|t}zwxxz~xxtwzwxv{vy||y~xr~tp|uzxyv|||~|v{|}{~y|{|{tquz}{~}}vv{{q~}yos||~~|}|}|~xstvzyvyx~}yzxquuvtz~~~zty}|}ylx{wyz|{st|}uw}{|}~{||}}voypr|{u{{|x{{sxywyz}xvquywzttxz}~|rsyzuv{yy~}{wx{~~|}y~vy{}uyzxv~}|zuv}~xwt{w{xz|}ut}|ys~~|{s}xuyz~{}tsq~~{xwuzvvxu|}wv}~ytuz{yx|x{{~|xnm|t~{y~zywntw|{zw~}zw{}rmuupvrntsr~}~|srzvt|~zmq{sw{z|~{{~{{|wzyzx}~{}y}v~xwvx~}znsqjiq{{wur~}wrruovx|~vx~}}vv|~|t{~wzt~t~wzv|utvwz||pvvkrwnsz{~|vrrpvuw~}~{}zu{~{|v|||}|y||x~~}~|{x{x~zyvphdkqotuyxwzrqqoqvwuysx~}zox~z{x|yz}{~~sx}~~~t}|}u{~~vzyrszt|}zmw|||}u{~u~{|uzsvrruxyx~{~{{~|x||x}~}~vznmv{rnkpux|zyx}ww{{|uswqv~yz{x}{nzx}vyy{}wx}{{xx{y{x~yxwtvtsv|y}v{|~slt|vvuuyx|z~|{w{|xwzt{}y~}~{wx~~{wywzxtpxzyyx}~uossusu}{vqy{{x{{xsuvx{w~{{vx|ws~~|zwy|wyv|qqy}st}ukv|rwrttssyx{wvsu|x}wyw{~}y{}zzy|~ou{}y}wxz}||y{w~yqxusou~}z{{urz~}z{|{pwx|w~{w{|~stqqnvyxz~x}~}yu{z|{ynxtz|y~~x{y~uttsxwyvtrmwz}u}xx|}~}~zz|u|zw~}||spwws{~x~zx|wptw}ysty|}|wwwsyvlv|z}tx}|}vuuz{zuyyuw~~||z|z~|~{zv~}zumrqppuzyx{{tz~|y{|{trvu}y}~~ysw|{x~{x~yt{}zv|}~~{}|tw{~|yzuzw|wxw~~w|rx{{}xwvrrrnsw|xzxu||}y~{{vu}~xwz}~z}{}vrz~}}zyx}sqpu||z{}xxx|}~|||uwtwux{z|z~vuys|urwwt}{}~~uy~~y{yxyz~~vtlwxsvyw~z}xwumqvrox}~wv}zyw}}y~{xy|z{|y|vsw{~z|{{~}znxtv|u}{ssy{~{~yzom||vx|yw}xy|}}|vvss~zwxzzyz}}|w{|w~uxzsz{rtqpw}}}yy{{|{xvwyuuu~ywx~yutyz|}|t{|~|yu}~yzxwx~|xxyzvuuw|~z{||z}zwwoquqsyz~|v{{vxy{vuz{}||z||~vuwuz}~}wptpyy{s}{{zssw|zxzz~wy~uqz~yy~{|{|{||}~wsvqtx|xtou{x}}|zzxw~}|ty~yssrvywz|z|~wru{x|}~~{}z}y{}|y~yxzwyytxxtq{}xvt~{y}}~~|zvqs|||~ruvux}|}{wwz|z}x~|z}}}~ywxv{yqqzty}zw}}~xnvxt~|{}}}qqy~}|vuwx~{zxyw{|v||pv~wqpzyw||}y~xx{yvvvwyzz~|{~|{xwvvy{~yv}~{}~|xtz~{y~|vxtuvvv~|xwvv~{~|~~z||zxzvuwz|}~~zzxuyzxv|~z|}|~y~|z|~ztspt}}yztpty~~z~{usuy~}|wy~z}|x~wq|ywwz~|}~|}wv}~}{ysu}{zzwtxwv{z}}}xttx|y}~{|yv}{{xuwuy~|{zx|~~~~|xu|~|zxz~|y~{xyut{wrv~~~}}{|~sp{||~}ytqrw~|xv{~x~}y|{|}|wwuw~|vvz{urzxsty}~}|}~wv~vw~||~{||~|wvw{{yz}z{}|{x~|~yt{|yz}}~{v{xpx~{ysvwuz~~{zzz|yuw|zz|||~}|}{}}{|||zy|y}yw|}}{{{}|wux{}~{xuonvz~~|{||z~~}}}ywww}~zzz|{|vv}wuz|x{}~|}|x||{~zwvuz{wzxttwvyzxzz{}{~~|{ztrxz~~}z|z{xtx~{{|}~|{~~~~{t}{~|}~zuvqqxy{{xxzwwy}}}|{}}zx{x{~yzzzx}~~}|xvxty|z|~~|{||yusspsx{zvry{su~~{z}|sw~~~}z{{x}|zywsy}}~w||wtu{~xuqqyzttxvrsx|||}~~~wzxty|yuvtwzz|~~~~~|~|xzy|}~z|wtxxootxz|xxytuvz~{z|~z{{zz}{tuuv{~{{zz{~~~}}|||}~{xustppuwzzwuwtx}{~{xtv}~|z{z~}zxxv}}vv{uu|~~~{w}}y|~zwutvwuwsrrstz||~||||~zz}}|{{yzvrsxy}}~{zz}y~~}zwxzuvy{|ztusrtuw~}xy~|}yx~~z~}}vuuuwz{}|{|~||{~|{zxz|}{|zwwusrplpuzyst{vt{|{~}{~}tw}|~|}xy|zxvsv{|~~y}{yxz}vps{xqtxvrpqyz{|||~}}}~{z~~~~zz~~|yxwu{||z{}wxwx{~z}wtvxtrssrstv}|||z|}}}z}vw{}}}{||xu|z}zxsnonrs{sqrwz}~{|~{{~|zvzzy}oqmrzz{zutujsvvx~}~}|~}ywz~~xqtrnpmrw||~~x}|{~~}ytnpqw||zqvxropzy|y}~{yy}z|zrwy|zxsryxuv~usovtw}}z{~~vwxuuy}t{yrmnyxwsyswz|~zw}~||wzrmutrv~~~yklptqxwx{us}}{}{|~yuwxxv}ruvtsyx|yy~}{z~w|}ypnrnsv}}zsuxz}vx|wtzyu}z{y~|vt}vzz|~{qqpxsvwxuywv{y{}~}zy}|xtyxz|s}yns{yyuy{}z{}}x~y}zx~yvinqtwyzz}uxyzzxusyzz~wx|rxvst{z~xyrxz~syx||}~vzz}~yxw}zxwvtxowx{rvyu{|u~{{~wsz~{}}v||z}uvsvuyy{|x}~w{|~}y}~x|rtymmwzu|vzyyz{yxxtz~|}}ut}txx}}wu}xzlq{}ywxw|||}~|~yxsx{}~~|sqvszrttyyz{~|zy~}xot|zyzy{{|}}}xuywx|y~}}w|vu~{yyy{~vuppqupux|xtv||xyzxywqww~~{y{}zxwx}~yz~{||xv~y~uy~||y{~~|~z~yxr}utqlvx|x}xv~sy{wxtxzzz}|~vxv~}|}||}y~xvoyz~}|}}w~x}}|~}z|y|yrquuuu|~xzyyy{}~|~}usywz}xsqnopvv|}|{~wx{~x|pr~vx{wt|~zvzyxzz}vzu}}zzyytuz{|vytwy}w|~yuwtpryx||~|w|~~}}zqrnlwwuv}|~x~oyzyz|}}y~~|txtvu{w~zz{||zsxv}}}}u{~yu}trljnux}yx|~{~{}rwxxy}y{wzzztu~{wt~yyvz{{~}|s}{t|vz~}y}vpjljtu||{|}|}syxt~ytz}|r~~}wvu|~ws~ytzyzz~|x|zv}|{||z{|x~uuqqnqt~{{}}y{vwwy||x}}zu|{wup}~sz{tyt|||~ww{sw~{}~}t}{ytookpu{z{~~zzv}yy~vzy{twvvquuzw{}vzz|}z{}ww{tx|{z{}w||v~spinqsx~~{}{||w{yy{{x}|u|yvtp|~v|ztyu}}|}uxywx{y{z}~|z}{yxnnmpv~}|}~y{xz}||u|ytwwutzwxwvw|~{}|xtztsv}yz~|}~y~yvmnpsv~{|||{~z|x~{zvzwyvy{uwr~y|~t}qw{xwwwvvx{u}~||~}x~vqlrpt{{}{|}}zy||wu|~yu|{usr}v}vtvv~~~y{r{stsyvw|}}~{~{{xmorst~|{~}~}~}}ys{zuy}vus{|y|w~u||}w}uwvprwys{~}}~z|yqksqsx|~{~}|~|{txx~yxz{squy{zzvu}}}{{wrxussyt{}~}}|yxkrqvzz|}~}{{trx{zx{||spu{~|xyt|z|~}yyr{vspzsw~~|~~|{lqvvz|}}}~}~~yzwp~{y|yz}wss~~}~}wyr{}{zyzq{utrztv~}}~z{oputx~}||}|}z|wp}y|xy~xsq~z}wzs|}}~}}yyoyttoyvt}{}}{~~~prutz}|{~~~}v{st}y|z{z}s|xwvy~zxwz|{x{{~|yx}qvuju|}~xv||tqp{uqzz|xy{yuvsy}xyw~~wrv~yux{|{qs|}~wzxn~xmuttx~{{yvu|~|~~zy|}z|z~}wpyz{||xzutwxr{{{}||uzyx|zz}xtyyvznqvyu}~}usuxzxq|y}ysqyywvt~}xyov~{xy{wz{}zyz{|~~{||kkusv{}wz|w|}vytz|}y{vzzvttx{~yvqzvjt|y}ux{yzv|}~||spvjjrhnx}~{u}~|}w{~y|zw|}yyrtsvpx||zwytw~yt{y}~}xy}ursz~ossnuzxsz{}{~~x{{{{}z|x|y{zv}|z~ox{|{~}r{t{|yw|}}}}wvyhnyx{{}yzzvwtq}}}wvyw|vv|zzztnyvtww|zzsvzry}~zu~~}z}tqrriqkio~{}x{|~xx{vv|{~}}~zo{{xyvvuytux|{t{x{tpxz~~zu|sozppls}}~}||}{|{{z~x~zp}u|xq{}xyyr{|sw}{s||}w}}{zs|||tnlhlosoy|}}zr}uzuywuvovtuvzz}|tz~~wy{}}u{y}|w|||zrugk|~u|xv|zy}|~ywtt|}|}|{xzzu{{y~x~{~yuwxxru{{{~}yztpwtqqipx~{y{~{{{|v}}|~{xqox|vwzz}xu{{{~vx|~{zzwy{|~nr{mmmfgnqqy{{u{}|||xzux}}|ww|~xp}}zzv|~ztrxywx~}zst{suqnos}w}y{zxvvvz}}}z|ytxz}sx||wz|~vvztq}~|z~{ssiuuw~stnspxwvrott{wwwv~zv{}vqunwz{vrwv{|tty|w~~|vwwttsmrt|vwp{~uv}~|x~w~xv~{tyxpmpv}}wyxw{~y~{}~z}~{||}}zzz}wyquu|uv}{{yzyszzxx~|{xwuw}x{y{{|xpn|{ryzpniilu{tsknvqrrpmqqtrz|sz{z}t|y}vrv{ztwyv||}~~}}yv~wxzwtzywzz~|zx|zxyzyrv|~}zxwtuz|tqltyxvvrqsrvtvvvvytou}yvp||xxxzy~z}|~utx{yu|~y~~}}|z~}wv|z{}zz~uvxxpy{}{~wqqsrs}yqplqrsnppmosvuxrvz{|~|v}|zwzwy~{tv}zxu~}~{}}|}zz~wxvwtxxs{y}}yxv~xo{}}{|wyy~ytovwtx{uttutqwqt{yxuv|yyq~~xvx~}ux}}~z|}ystxxw|{y|}}|z}}|x|yxzw~{}wtwy{ux{~||wxqqqxxtsqvusvuutsxvtvuz{|w}|ty~{xz}z{~~utu|{~z{{z{z}}z{w|xvsvyuxxy|~}|~xzyw}|xwvz{wwqyyy|ytrswvuvsv{}zvyzwzztw~|xxxzwyz}{|tmr|zxz||{}~{~yzz|{|{x}}}|yzru|zv~~||z|wsstx~yxuouuvyvrtvxzwyvz|~|x~{}w|zxzz{xy~vrx|}}}xxz|}|z|y~{wwv{z{xw{{z}~|tyyx}~{xzy{|yuzzyzxuvsuuuxu{|ut|y{|yw}|xxv|}uuy||zzppw~|}~y{z~}{||zzzy|x~~|}~}z|vuz~ws{}}}|{ytwx{}|zuvzz{zvvuvxxzw|ytz}zy|zy|{wz{upv|~}yzx{~~~xww}zyvuxyzvz}}}|{{w|{v{~~}{~}{ww}~|yzxxyzzw|~~wpv}y|~xv|~zwvv~zuxw|~xwqms}}xy{}~}|~}{z|zyz{{wy}~|zwru|{st}}|zxx{}~|wu{||{xwvwxzzxw}~~|tu|~z|~yxx{{z{{xqr|~z~}|}|}|zxy|xwwyxwu|}y|~xw}yt{~~~~xy|~{{yxwyzzw{~}xqx|v{~ywy|ytuv{xxx{~}yxrmt}{y|}|~|yz||{zz}|~}{ysrwytq{~}{z{}~zvx{}}{zyxwyzzx|~|vt~|{z{|wy{|||}}|vqu||z}}}zx||ywwwxxx}}x}~~|{vvz}yv}~y{~~}{zz{{{y|~{vr{y}zxz|~zuuxyxwz|}|}}{ywsos{}z}|}}}zz{{{{~|}{{{}|zyurvzxuw~}~}}}~{y}~}zzyyy{{{{{wx}zz|zwy}~{xy|~~~|zxtsz||}zyx||zxxyyx{}}y}~|{|}}|{xzzx~{}~}||z{{{z}zuu}x}~zxx{~{wsuz{xuvxz|{|{xutppv~|{~~{~~|{||}|~}}{yyz~~~~|yxvtv{{yw~|}~}y|}|zzy{{{||vw|}zz}}zwy~~{xy{|}}~~|yxssz}}~|{y}~{xxyxy}|~y}|~~~|zz{{}{{ywz{z~{}~}|{z{||}~yuy|zzxy}|yvuw}~ywuvxyzz{zwutqt|||~||||}}}|~~}~}zxwxz|}~}}}{xwttx{xuz~|}~}{{{{||}}ww||{}~{wx}{xy{{}}}|{xvssz}}~|yx|}zyyy{~||x~}}|~~|yyy{~~~|{zxx|~{x{~}|}|||wv{|zxy}~zxvwz|xuuxyzyzywusqrx{{}}}}}|}}~{~~||~~{xwwx{|}}||{yxvtw{zvv}~}}|}}~zw}}}zz}~|zy||zxyz||{|zxvutw~~z~}{|z{~}zyz{}}}yy~|}~}~|zxwx{}~~~|zywx||yv{~~~~|ww{|zxx||ywuvz|yvvwxyyyxwusrsy|z|{}|~~~~{|~~}|}~{xvvvyz||||{ywutvyyvt|~~}|}}|x{}|y{|zxz}{yxzz{{{zxwutv|}|}|~{{|~}{{|}|~~yy~||~~}||}~{ywvwz{}~}}|zyxwy|}zw}~|xy|}{xx{~~|zxwx{}yvvvwxxxxvussuz}z}{~}~~|z~}~}|{{}~}{xuttvyz|{{{yxvuvy{yvx~{y~~{z|}zyx{}zxyyzzzyxwvuuy|}}}}zz}~||}~}{|x{}||~~}|{{|~~|yvutvyz|}}|{yxwx{~}zz{y||~zxx{~~}zxwvx||xvvvvwwwvutstw~|}~|}}}z{||~~}|{{|}~|yvtstvwyzzzyxwvvy||yw}z~~}zz}}zyy{~}zxxxxyyyywvvvz}~~}~{{}}|yxyz|}yy}{x{~||}}}}|{zxxxyz}}ysoszyvxz|}}}{z{~~zy~~~~~zv}ww}}{|~{yxx{~|{{{|}}|{ywwx|~z}}~}|}~}}~~{|{y~}~|tmlt~zurqqqqqruyzwuz|wv||yxz}~}{xwwy}|zz{{|}}}|{{|}{vsrtx|}{zzz{}~zz~{wz}{|}~~~}|{zzzzyvrpprw|~~|zywwx|}{xz}ytsxyutuvvvutsqpprvz}}|yvtttuvvvvuutvy~||}z{~|~~~}|zxuqmmotz}yussuvsopw}|xy|}yvw~|{|~~~}{yyz}~}}~~~}}}{z{}~|zyyyz|~}ywy|{vuz~{z{|}~~}|{zyyyzzxurpprvz~|zxxz}}zx||xtsw{yyyxwvusqpqsvz|}|yvttttuvvvuuuvz|{}yz~~~}|{zyvrnmmqv{}zwvxyvrpv|}zxz~~~~~{ww{~||}~~}|zzz|~~~~~~|{~~}~}|~~}{zz{|~~{wvy|yuu{}zz{|}}}||zyxxyyywurppswz~}{yz|~~zx~~}{wtty|zzzyxwusrqqsvz}}|zwuttuvvvvvuuw{|{}yx|~~~}{yxwvurpnorv{~|yxyzzvru|}zz}~~~}|ywz}||}~~~}|{zz{~~~~~|xx{}~~~~}}}|{{|}}zww{|yuv||zzz{|||{zyxwwwxxvtsrsvz}~|{z|~~z{~|{zywux|zzzyxwutrrsux|~~|zwvuuuvvwvvvwy~{|{wx{~}~~}{ywvuutsrqqsw{~~{zz|}ywy~|yyz{}~~~~}|ywx~~}{y|zxz}~}|{zyxy{}}{vvx{|}}~xwz|~}zz}}zuv|}{z{|~~~~}|{{{{zxvtssuxz}~~}|{{|}~}}|zxx{~xsrw~wolloswyzywutssttttttuvz~|~{xy}}{{}|}|{zzz{zyxxy||xvvvx{xuvxyyxxxyz|~}|{{}~~~~}{yy~{xwwy{~~~~~~~~}|~ywxz~}{wroostplnsxxvtstuvwwwvuuuuvwwwusssuwz|}~}{ywwx{|{{~~|xuttvx{~}zwsqonnnooooopsx|}zvvz|zutw{~|zz{~}}~~~~~|zyz{~}zxwxxvvz}{zz{|}~~}{yxxy{}~~~~}}}}}~}{xwy}yxwxxz|}~~~~~~~~}~}zzz}zustvtompvxwussstuuuuuttuvwxxwusrstvy{|||zyxxz|{xy~~~ywuuuwy|~{wtrpppoooopqtx||zvvz|yutvz~|zz{~}|~~~}{zyz|~}{yyyywvx}}}}~~~}|zxxxz{}~~~}}}}~~}|ywx}~{xwwxyz|}~}}}~~}}~~|~}zyz|~{wvxxuposxyxussttuuuuuuuvwxyxwutstuwyz{{zyxxy{|{yz~~|xvuuwy{}~zvtrrqqqppqruy|}zvvz|zvtvz}}{yyz}}{~~}}}~~|{zz{}~~}{yxxy{zyz}{zxyz{|}~~~~~~~~~|zxx{{xwwwyz|~~}}}}}}}~||~|xwwz}{xxzyuqqvz{xvtttuuuuuuuuvwyyyxvuuuwxyzzzyxwxz}~|{~~}|xuuvxz|~{wutssrrrrstx{~}zwx{}zvuw{~~{xwx{~zz}}{{{||}}~}~~~}~~}{yxxxy}~}|{zyvtrppqsuwyzz{{|||{zxutuz|yz~}}{xuvwx}~~~}}~}}{xwvvx||~}xsrvz{yvutuvwwxyyzz|}~~}{zzz|~|xw{~{|~~~{z}{vrpqv}}zxwuuttstux{{z|}zy|}xsqsx}zxxz}|xux}}|||}}}}}}~~~|||}~~~}{ywvvxz|}~}{yyyz|~{upmnqw~}zxvuuuuuuuvx{~z{~~ywy|~zvsqrty~~|xw{~|{||}~~~~|yvtsuwxy|~}}}}~~}|zyxxyz|}~~~|zxy}~}~{vsppruy}}{zyxxxxyz}}~~|}}xtqpqty}zz||yttw|~~|zyyyyzzzz{{}~~|{zzz{{{{zywvwxyyxy~~|{{{}~~~~xsonnpty~|ywvuttttuvy|~zy{~~zwwy||yvsrsvy~|y{~}||}}~~~}{ywvvvvuux~~~~}|{yxwwxz{|}}}~~~~}|zxwx}|{}~{wsqqqsvz~}|{zzyzz|~~|}|xurqrtx}}|~~zvtw{~~|zxxxxyyyyzz|}~~~}|zyyyyzzzyxwwwxyywwz~}||}~~~zuqonoruz|ywvuuutuvx{~~{xy|~|xvwz}|yvtsstw{|{}~}}}zywvutsrponoprssty~~~~|xtt{{z}{yy|~ytstvuspmlmoqux|}yxz}|yusstvz}wsu|}{zyz{{||||}}~~|zyxwwwwwwvuuuvxyxwz~{yxxxy{}~~}}~}yuqnnorvz~}yxvvvvwx{~~{z|}zy{~}zwvvx|}xttx|~}{zyzz{||}}|{zywusrrstuustx{urpprtvy{|}~~~~}{yz}||}~|yurqqruwy|~~{{}~}zz|~|yuqonorvz{zwnqx}}}||||||||}~~}|{{zzzyxwvvwxzzxx{}{{}{z{|{xusstwz~}xyysonnptx{}{xvx{}zwuux{~}{xusqqruy}~}~~}}|{zzzz||{{vsqppqstuvwxxyyyxvtstw{~}yvvxyxvsrrsuwz}~~{yxy{~~ywx}|xussrrrsstvwxyyyxwuttttssssssuwyzyxy}{zz|~~||~~|zz{||yursvxvsppsvy{||||{{yxvsqppqsw{}~~~}}}~~}~}zxvvvvwwwwwwwwvtrqsv{|zvtuwxxusrqrsuxz|~~~{yyz|~~zxz~|ywvuttttuvwxyyxwvuttsssssstuwxyxvux~}{zz{|~~|{|~zvtvxxurpqtwyz{{|{{zywusqpprux{~}~~~~~~}~~~~|{zyyyyxxxxwvusqqsw{|yutuxyxvtrrrstvxz}~}~|zyz|~~{y{~}{ywvvvvvwxyyyxwvuttttttttuvwyyxvuw|}~~|zzz{|}}||}zwwyzxurqsuxz{{{{{zyxvtrqqrtwz}~}~~~~~~~|}~~~||{{zzzyyyxwusqqtx||yutvxyxvussstuwy{}~}~}{zyz{~|zy|}{yxxwwxxyyzzyxwvutttttttuvxzzzxvw{}}~~~}|{z{||}~~~yxy{{xtrrtwyz{{|{{zywusrqrsvy|}}~~~}}}}}~}|~~|||}~~}||{{{zzzyxwusrsvz|{xutvyzywvuuuvwyz|~}}~~|zyyz||zy{}{zyyxxyyzzzzyxwvuutttuuuwxz{|zxwy~~}}~}|}~}~}{{{{||}}~|yy{|zwtstvxz{|||{zyxvtsrstvy|}|~~}}}}}}~|{}|zz{|~~}}}|||{{zywusrsw{}|xuuwyzzxwvvvwxyz{}}|~}{zyyz|}{yy|}|{zzz{{{{{{zxwvvuuuuvvwxz||{yww{~||}~}||~|}}|{zzz{{|}~|{}~}yvtuvxz{||||{zxwutsstvx{}~||}~~}}}}}}~~{y{~{zz{|}~}}|{ywutsuy|~|xuvxz{zxwvvvvwxy{|~~||~~|zyyyz|~~|yyz}~~}}}}}}}||zyxwwvvvvwwyz{||ywuw||{|}~}|{}}|~~|{zyyyzz{|}~}~~~zwvwyz|}}}}|{zxvutstuwy{}~}{|~~~}}}}}~{yy||zyz{|}~~|zxvuux{~~{xvwy{{zywvvvvwxyz|~~||~}|zyxyz|}}{yxy|~}|zyxxwwwwxxy{|}|zwuw{|{{|}~}|{|}|}}{zyyyyyz{|}~}}~}zxxy{|}}~}}|{yxvuttuvx{|~~}{{|~~}}}}}}~}zxx|~zxxyz{|~~}{ywvvy}|xwxz||{yxwvvwwxyz|~~||}}{yxxxy{|~~}{yxxy|~}|{zyxxxxyyz{}}}{xvwz|zz{|}~}|{{}~{{}}|zyxxxxxyz{}~~~}zxyz|}~~~~}|{ywvuuuvxz|}~}{{{~~}}|||}}~~{xvx|{xwwxz{}~}{ywvx{~{xwy{}}|zyxxwxxyz{}~}||}}{zxwwxyz|}~~}|{yxxy{~}|{zzyyyyz{|}~~}zxvx|~{zyz|}~|zz||z{}~|{yxxwwwxyz{|~|yyz|}~~~~~}{zywvuuvxz{}~~|{z{}~~}}||||}~}zwvw{~~{xvvwy{}}{yxwy||yxy|}}|{zyxxxxyz{|~}||}~~|zywwwwyz{|}}~}}|{zxwwy|~}|{{zzzz{|}~~|ywwz~|zyyz|}~|{z{}}zz|~~}{zyxwwwwxyz{}~~{z{|}~~~|{yxwvvvxy{}~~}|{zz}~}}|||}}~}zwuwz~~zwvvwxz|~~|zyy{~|yyz|~~}|zyyxxxyz{|~}||}~}{zxwwwxyz{|}}}||{zxwvwy|~~~}||||||}~}{xvx|~{yyyz|}~}{zz|~{z{}~|{yxxwwwwxy{|}~~~~}}}~~||}~~}{yxwwwxyz|}~~}|{zz{}~}~~}}}}}}~~{xuux|~~|yvuuvxy{|~}{z{~|zz|~~}|{zyyyyyz{}~}||}~|{yxwwwwyz{{||||{zywvvwy|~~}}~~}}}}}~~~{xwx{~{yxyz{|}~}|zz||zz|~~}{zyxwwwwxyz{|}~~}}}}}~}~~|{yxwwxyz{}}~~~}|{zyz|}|~~~}}}}}}~~}yvuuy|~}{xuuuvxy{|~}|{}|z{}~~|{zzyyyz{|}~}||}~~}|zywwvvwx{}}|{{~}{zxy}~|{}}zz}~|{{{||}}}}}}}||||||}~~|zxwxz}~~|ywx||wv~{optwy{}~~}|zxuuy~}}~~~}}{{{{}~|zz||wuz~wrqsuusrqrsuvxy{}~~}}~}~~~}{z|~|zzz{}~~~~~~xsompv~zwsrpoonnoqtwyzyyy{~~}|{{|~~~~{yxyz{|}~~zxvuttvz~~{xvuttttuuuvvwxyz|~~|zxvuuvx|~}|{zz{}|zxuttux{}~{wtqpppqstvxy{|}~~~~~{yyyz{|}~~~}yvspnoqty~}zxusrqqrtvxxwwxz~~}|{{z{|}|{z{{|}~|xvttttux{~}{zxxwwwwvvwwxy{|~~}{ywvuvxz}~}|{{|}|zxvuttvxz|~{xusrrstuvwxy{|}}~~~|zzzz{{|}~~|yvsqoopsw{~{yvutttvwwwvvwz}~~}|{{{{||}~}||||}~~{ywvutttvx{~~|{zyxxwwwwxyz|}~}{zxwvwxz}~}||}~~~~|zywutttuwy{~~{xwvvvvvwwxyz{||}~~~|{{{{{{{|}~|ywtrpppruy}}{yxwwxxxxwwxz|~}}||{{{{|}~~}}}~~|ywvutttuwy|~|{zzyyyyyz{}~~}|{yxwwxy{~~~~~~|{ywutttuvxz|}{zyxxxxxyyz{{|}}~~~|{{{{{{{|~}{ywusqppqtwz~~|{zyyzzzyxxyz}~~}||{{{||}~~~~~}zwuttttuvxz}~}|{{zzz{{|}~~}|{yxxxxz|~~~}|zxwutttuvxy{~}{zzyyzzz{{||}}~~~|{zzz{{|}~}{zxvtsrqqsux{~~}{{{{{{{{zz{|~~}||{{{{|}~~~}{yvtssstuwy|~~}}||||||}~~}}|zzyxyy{}}|zywvutttuwxz|~}||{{{{{||}}}~~~}|{zzz{|}~~}|{zxvusrrrrtvy|~}}|}}}||{{|}~~}}|{{{{||}~~~~}{ywutsstuvxz|~~}}}}}~~~}|{zyyyyz|~~}|zywvutttuvwy{}~}}}}}}}}}~~~~~|{{{{{||}~~~}|{zxwutsrrrsuwz}~~}}||}~~~}||{{{{||}~~~}|{ywutttttuwx{}~~~~~~}|{{zyyyz{}~~}{zyxwvutttuvwy{~~~~~~~~~~}||{{{{{||}~}}|{zxwvussrssuvy{~~~~~~~}}||{{{{||}~~~}|{ywvuttttuvwy{~~~}}|{zzzzz{|}~}|{zyxwvuuttuuwxz|~}|{{{{{||}~~~}|{{yxwvutsssstvxz|~}}||{{{{||}~~~}}||{zxwuutttuvwxz|~~~~}||{zzzz{{}~~}|{zyxwvuuttuuvxy{}~}|{{{{{|}}~~}|{{zyxwvuutssstuwx{}~~}|||{{{||}~~~}||{{zyywvuttttuvxy{}~~~}}|{{zzzz{|}~~}}|{zyxwvvuutuuvwyz|~~~}|{{{{{|}~~}|{{zyxwwvutttttuvxy{~~~}}||{{{{||}~~~}}|{{zzyyxwvutttuvwxz|~~~}}||{{{zz{||~~~}|{{zyxwwvuuuuuvvxy{|~~~}||{{{{||}~~~}|{{zyxxwvuuttttuvwxz|~~~}|||{{{||}}~~~~}||{{zzyyxwvuuttuuvwyz|~~~~}}||{{{{{{|}~~~}}|{{zyxwwvvuuuuuvwxz{}~~}||{{{{||}}~~~}||{zzyyxwvvuutttuuvxy{}~~}}|||{{{||}}~~}~|}zx}khtjcgejjqxb\e|~~lsPPOKS\`ybqkwxvcntcUxdVr{yuavfj|{Wh{^dkZbxeX`oXZ[\`Tvh\||_M8cJ1VkV[mzrdz~\x|ypz||yq~dQbjW^rmV]Ux~hsu{cmjozjqqjnplZag{zloq~vzzgkX_|}zszϿųdZ\1LħhquaR1]HN;7HJUa_RqlWbuxwq_a]~tcVhlcyeu~zthSgffw_cakruo||xr_Pgjkj}mbixlo{cizvrtu{yo{w~pm|DE7=NUrybcR^Z4<-bqёnvogzgSYXm_oajysjhb]wm\M<`e1)WXUhzklw]q{}sv|bplvZdMtMHnlN{_Z|o~fzzouhljlpZx|pqweqw_uZBN]FW_kyz`r]qS>le\iltSi{IPZAUYcWz}~nyzgj^yxYHwg{plozwly_Q\QV\sblxumtrl}|{zmxwsswĥ}oiNmF4J0EOE~zlձigyrc]r[my^]lWbydVpbWUI_NEOdpdrvaYtps~xq}voipL\sNIPWCIvny{ppw|~jp|wox}mkxczmv`kYxxAG[YTBCYTjȵʨh|m]Pe_Olwp}Ta}f]nHaRLKYyrtpvwzwgTogojemfnrhkqX\jd]\Ljpr[y|uinyy}dx`jXqyu•|tt|rqlnnk=DWC\_E``°z}x|nr|dxfotbT]h]gNA7@egGLs}Xull}mippcrcUaV~g5C[gHt}vzvlsgsyyX`voksupZruRpqP;HRBLSn^k¸zvig\dPr`^wnWt~obuNLqioqy{zvhlxiu[x{mnlu|xakUPj`JFRFsj}˜zplpnhz}uvq~y{h{}qx}zffiijoHMJT?GK6onrusǨɚ|o}zpwwh|{`jyioTWc^@6=hv^_~vthhz|~jy}ztpgrbmV\XV=P{`ILbhwʺ||w|u|qhiy{Snvlx{adĩrz|pe_Q_VeyWbkL1MifSPfùgbrbevmmfT{g`GgmSn_tx{rq}k`[vxYei}pqgf|rYZYHYYIaqj|mz~t}vrwr{q_~|zyj{qs}yqvZ[`USGE/LRA]ae}ş°r|quejh{tkksaU^XXN_pu[{trt~mzt~stlujjtJ`aYU@K`DO^qbnòy|~|}ouh}wxpgr}XwjwvpM[us_c`L9a^?5Jl`dUn~srkxyzmy[dywTQe]qq]^l|ujadzdzuisWcndYzck]FCdckusy{ytdl}mffqik]zpx|zrmudldfotYXLSc_F5Q7dl^clɫïq`xj}tWYZ]diQFZxecr|lyvsn{wxo|rWihdxTV=GkW>KovhuŹzyj{sflr_}dj}uszu}t~whi_tydX\mH4IPB?NUK\b{zwt{fmnyqpmgy\qkton{s{xwssu}btze[wmoh]dMTdLN[Vm}ou~l|r{_vjdaory~u}ti}|fltf|rYLVQYRQLUVJTRs{t{|ymj]Qeyut[qx{xi~q[qsgdrf_Kcvc\@U^_k_Xvy~ybxl_{}~xeZgxYwx|tzzvnYboifNxjgYF>RNDJKYWgQ\_zʳƶyu~r|k|fhZXqth[|upyjppntheigzrXI_;]dLF?d}ortlurwu_ezsb{{ygltzvqxpY[aZoUbI@e^HF\VJ2FLSPvv~yp[omcjnpra|w~~zv}n|~{ynUTj`WYbQaKQoPdqrq|tkwwovys{ktsxish]e\|ynnktdVihjjUfX^aEKG>F`PRV]bqjtƭnnylxrsnkUi~or~{j~ix~|idtkirifk`WJ8Y^^M?pzz|yreg|__zj{esmvhz}zp~z~l}c^dCcpbS7HbcMMVG7IN@Egxdo{Ud|~jf`|wdqzrxqmXX`QHo[LJMrfadiv|{w`hPMMd}sfhv\UQWWeKfnfhobRL\Y^mng~^klggcaGZ]GAmiXb_vw{{{sPa_Txv|yozltwvypox{~vx~fT&]ZWage|t~^n{xzlfflZfxu|xv=G`TXM`b^QqbjuyrqrrZmfdLC{vx]M>L^RJmts{zm}krmcmrc`{zslSIrB1A?<6,cQYpd^oy|y~}anj{xgyjqv[I\TKgp}toy{}poVqtjmu~|]O9Zdn໪qde\g`}wrcryh]^gJ|smVSOsxnq}smRPeh{tv~bot~ukmlvmd¬~QVJP\mt^R_dOVjH_RP[VbskZ]Ujk{}zpPfaem\WgP\fe\ZhdLCRILj{}rhWYih¸mj^Yc_jK_oncjtaT7BM?Fzngqbwgcnsqty{~qgo[jimertgcqst{~zxml{^f\A/30GQdtgSLdNK\cJbae}uwpy{vp{znz|mk}ZTS[dl{um{zx`PWdyxvkY`pKcuV`a_QG3IcYcroxx}hbfasch|}qnvq]MIfbtscPjrgdWyywvws}kjkxbTC`үd[gm]_art~qmq{`jc]{ttrg~sh\rp}jjkfRO^\HLBr{}uuokghUABSr{ta^?BU=;\NHH?^SECKW[gpwkwzoagj||uVbi{mty}ڽ}th`RM2Iqpotfnr|xt}g[ia]^^Wrgq{toTntgkju[]esd]_QV[_pzq~}~jssloyn}}xxzqopVjlz׾ѳ{ubepltotyrylUSHd\e|v|o~v~s|unc\FYlv}rgug\vktiULM3.C`fzybxfgz`dfVSpeeXJZrmmsk^`]HGXZZXP{gjudZ_YMaLTpyyIJ~|tv~ihZitn~~skxcg_idTc_PA>Ek\yor|keoxisxw`y|j`[ctnqhqnvtuvttsrtpmUL@QN4<Rw_JUZVTmpjqpr||snO??Jw~nr{{s~wfep}^fn^fuwqi=9Car\kT[sxwveqfcfkvlvy]tlr|to}lT=ORnqv{}{m^Tl~y~~xzbF8@dt}uZPlt`h`iwxrubr^\RUl{s|}y}vUsmKIAY||yir|u}r[LUE1?Akyvyjpg\VWUmgvo]w{qlzxjzr~q~vf^]G9;Mh}t{~y|}odRF*/Nhw{{wqobUvf[iuZR\^m\rfjsnnvvizbeWM>Bxwvmxriot}~sctQRO>EZt||pltqZrtrnfj^P{bYcp{zv}loh_ogJZQ5Sg~|~t{qkkM@<.)N~qube\SXd^ddhtgskciqqzauwwz}}zcL?B69Uzy|{}{vr~{ytqkIG6=RT|sxwvehbM]dNOc\hayzqkxyqedc{mcwXK_\Ucjvltrqumif]be/?VLWnebf}helflr{gVkYTgsqwzx|tatdcca@0DXH_}~{yztwcbTB).6AQ|vnojgb[WNd{c[ajp{~id|ug{rl}|tlepSBTDFOau~{vs{}~ytpypp]fpRFRAQ^tyrpiWof]q\LURX|}wddi`_gfifPqeLTQQcn~gvxpz{uqrhUKOU@9KI[ƹwovqzea|uoivr\Ogo^q{qzt|hndPRUO:@ISEd}s|yxbMo^68A:=N}yhb^Y\`ZptNgvpkr{o|s^[vzfqmnspqxLCO:AJ`~sm~zqtzvu{bkqllP:rsYGhZQWZlwuzwlpbiSLwwzisswuprso>dejo{i~tfU\~r]Ydp~}csyv}pysjx|WG|R\ryyu|twxux|n~~~^-?omqu{{lvzwztbkmxigxzq'-[jiU[yvfaxuj[xntyvkgu]_olyuottvtj<2x}tq}roxvvxa_{scDDkxj`_UDb`GclnjjmrZ_yiQLdpvwwuzjmgegeZdV?Njsyomzn}zr_LC1$WtvfSWP>BNQWaM^kdkdM[kj~|w{xwfhNJI-9c}~|z|yw|wyk]BEJ2VgsiaTV[GJJGHP[[@P~osvddg~xgrhacl^KQwvrw|{cj~}xrtQF\XCHthO^yZN^\`gjhaLZ\=;Rhw}y{`|~ijg^OBFdI=g}nm}uy`{}fPC38?1PcprbTPNIFSeQSV[h]]z~{}z~xtx}~wrq\K]OKDB`{xwyuy}zuqjYNHCFNypxta_PNhVMPKACJM]genyfbjktkUgeWRZUWizplwsj~yhYLSN1ESOrǻwf[gv]Iekf_\ZW>HlNLn{ww}mlt]UOFA=?\RJt~}ps}z^`eC52>CBcmeuaOHJOQR^IBYbiZbwyibmsruwri^CDHHIQww}{rklnnwhZI>@JFfvloicT]QBA89LVVkqttv|la\X_jQLLEWnk{}zqwt|tkeYQKAD6.\kuŰz^]iofS`a^bc\UIZaJ`uy}|}{r[guYPLB42Ggdrtsxz|y~}mRQB)(5JSnŹxY[VWSJEM^HCZecnyyvvoe}djyukaZU>1X`R`||usoppnw|m|z_`YOKIL_Wa|xhgcLXdKECENKIvxqsslZW\[[`EBSTacb{t|tuzn{gc[J=/PdzuhN@MTjoU^`YSOPUSeyspNM}jWQn|qqjt{hc_XTS\ĵaKoLJWrvnlk^Qli[lxcMOϮxyed^XMA[rWdsdb{u<(cjH9>HMQJ[t]Xrzrz\AMxs_fzvlgrzrǫ~Yg|]MJLE>OG;;?H:+UyyzcVnc\J4+Rwn|m~sac׼kfq[SWGE?82+.Pbelxl^YGDsysmlrdbjt~yyreS=0(6wƶxhg[ceRLMNbupswo^Xlwf`i[agVXsŹzfZE+KtmnoZTL<1>N\W_yvmdbb_WsvXetrf_lIJ|zytont³tnoS0%;moSRu}vzxtqmwoxlkk\PjdMMRB"&Vqgfa_^^]p~oV95micwkRM\inrtgawdTMA/ %Wtzumifzqj[H=GvviTVWD=919Ij˻xo`KF>742>X^rxku~}ondR;:ETx}|{rsxfZL;5Ed´~~cS_UA:;N`Vdnfdloc\m~pdfqitg^ggWUmmstPE9) +W|mh^QFVs|vusbh|[alhcnynzk^XPMN]bQTI6?o~]Rlja\URT]yiqwhgfTUlZGDGH>G¹~riinyqdWJDNreOKYWQ@>Tg{yvju^LD:01GywfWdx~~vqtfc_VPYzɿ~jjmXME?I^nsuu]_V?1:WpV^bGC@+(J~jgvhJ@947AYrisvxti`NB^sy¯lRaY8*!"D½zXQYULQk|gitohivx\Qz~g^XRTiulxn__hokyscyS?86@]|kbYTPXpqtme_^YFMoiPDO^oξ~od[UV_uru~^B/1BPhrgolic^bm{ukYhoUHDGUf{|zt_SWd{~{|ma[W[l}jZa\UT@9Oj}pgegr_E?:6;Q{{jcyzntzZOVUT_~Ǽy_]aK=4/5Klvwz_XaUEKi}v}vrv{vfP^\A=D=3Mǿ|q^OGEITn~p~}zujaYK@Tymqher~l^kU=3,(1TiODNTOWrpgx{tmp|xW`}qgc^[dxmffowrzZenX?.%%6^}tlhdauyqnhUQlk\HOd¼vgdjqfku]TMECPmtlse`bRCNf~ncwfQLF>=Nvxi]f~}tndXnqJ@KOMUr˻ôz}xaUKEFQm}fpxj|uQKWQ>=X}w}~zdZm_GEKD2=qǹvaND@@F\a]zzo|u|rngXJUwl^frydagM=6/',H~ƺ|dTZfacrlryxzagtkgd^W[r{nwsbZX`lkplsrfZF709Y}ļypgc`\cpxzrnhVQjh`ZFIbzpowna^j|}hWpiZUOJNc̾}~kgjaPRn}cSs}YD=716Mq|wlm|tbVptM7?dȸjXQRYmvk{zotmnze^ZSLOmyv}jZbsyxodiU=6304Iuƾs^LN`kurft{rkkmedj]W]_]au|vf^Zarf]bMEI@37Oyyoihlu|z}tphTUi]TYQ@Ilyv^TOQXgln}kXQI?IttZZago~w}sTTdRA=<>Mrydfppmx}nIRj\NKLP_~qst`UV^`\ouXe~mTHDFSpxplkk}umeTCVfS;1=QkzdWOMR_zsevvZE;DXg{}xxuw}jSEUP815BXnºupjYOTbzpwug_e}va[[]dsxuztp_Yk}jYNWaE-),2B`zk\Xlwxqng^msSGQZ_muw{i\UT^t~p[a`@8HNJVu{qiglwutqhbRDVZGFRUN\|zdZZborsueZkfPIIGH^jUWest|~dXeXD@@COm|aSZkpv}q}|roslNH[UNOT[lȷl^ZamounT[ibVIBDTswpoqt~rj`LAV[OC58Mmu^RKLSb}qpxaSILdrlnnr{t[BHTA105B\{Ǽqqpc\aswvs[Vr{eZXXYe{ypzwlmi\[pjRYtcB767?U{ȽqcX\ww|toeYj}_EITYbz~n`XUZhv~kYdb@0;FBF_~vtw}zo\UhcOMUXORv{ydWV[fz{stpn`csdQLJDARw^ZfruvvcbeP@<;9B_p`ct|yz}wwlWWXMKLLN[yͼqd`eqtw|{n_if`]QDANkunllnvx}zofYCEXSJF70@`Ǵre_]ammwp]RE@Rqphknrx|^FRWB523:Opʿtnrla_lvlr}]Tr|ja_]\f{~spqj^dlNKkhI7214EeǼ}rg`j|ukZb~rQCHPXip`VQRZmv~wchs\@9DOR^x|wvzyucR]hVHJRVU]{yeYW]kypqre]VfnYLIGDFX||e[fwwsoxqVIFDDNjm[Vexqtunj`Y_S@BILP`ǰtg`bo~tmaj_OTUJBMi~wqqu{vvl_JEXTHKJ=GYħePIFQJC2:F+&:dth]][W_`tTU>0IRXPTfyZP~xhYNQWqqi}`Semimvp||tdɗP`sb~nauxrfWkpYXstxYSy{lo}YiYMfUHEZwp}fcMmvkfg~ZE,bvTPs|Uqpxl`jwl]vhYcY_<34m||ca~eUni`Sp{nbm^eu|nox~SF@yqlF7AIE^Xm|}mM[c^Te|{siO_dVFY[tRXVp|Ƕnna]TYkVy_fX_^dñti=017CCHTNos{drp~msTW}kkq\wtvtzjVN(SUBht˾tlxezhw~uwʹ˶t[[Ch|^d<36%PK?U<0VQcjnipylUYht|o[hgFDcomwd{wu`ppx}|`oU]|iqNYb`Z8myekL=LY]XOUCw}}|xzv]e_`}msR_~elesk^`[Sb}zlN[SS16z|ÿɫhPtg]?Ui[Z`Yb_KW9UmVptOgkcm]swio}wh^kkghwĸb`ecfJWSeulɱ~]`xiQ.MMPmcyhVvaek`gLHihjNQpf{jhI>rrxcrqx}qW`O{uog^iqjzҽt{ze[tUUfLfwV`yT[gclzI^xkInpggquzqkOpkOifSxlgfQa[Wwx|uzżnV|hkzcpiq}wIIODOmʗƽkwV=2?GNHV^Psh^tepzolzWTlapup|igE;jbmYkl~t|}opcODSUXUpmf][fNOmed85_ECXdhrw^okTMVmx{soJ_hK^iV~hzcâzkfoi|{\UTZn^i˟yjnr|TXOTL:5;OW_ctc{r}}fsk}{jqX3ehMY{tq^{ffeswsxtet{ca>@KZ=Uֺпs^ZC_bMj~it[FWUhf\pKrp^fufs{xfbMcMHJqxajhtx}zeǬrqgusO4.%MONvcRnZgtTWSXmzi^xpvdaYf_WHMB^xhyrljRdgìv{}ns[rpsxstvt_dNH;B{v~}f^swgakyhSDKBgte~yg~xjqgllXbs}i/N[fxÛ]vs_khy”¹pyxp__`\f<3szĈ~m\PUmtE[n{fa_X]bzp{gpy~|xT{wKJZH%^^hŸt}|pzwovly~it|^NLC<\_hӦkavuSVhfqhkRntvt|nltmahhnP`S=X:|mZkqg{n`dyhpkKhIZNEZXiƽu{mry][uLMNk^r}ybcb]dmcgvnYZVJ[sZi{zsu{~}tobnMvRO]P8^hdFxqowo^Ef^^ZGldkv{xW|ycat{{_GV[Wejayqn^irixxoqkc}RN)5b;4J{~ookogYej`n{q}k|dfWgzZsVosATXUbl`pyjtmUrvtsmpeevvmqV8EM?ZURoiͼrypi`PZldgyzwmiWUH}fMQ}weneWBormbcf|szwi~oijidgXB@LMZoiww|rzppnZcyjm{}u{zvhinY`z_kZXf=6IkZvyp{gyu~abxc`XADIAF\oþusbjf}Vlys[kx{snfbql_nrbqiCIV?QOy|ǽ{ljntgSIapWv~l;@[S`Qmòvom]BepQLokfvtvsfieWYhiejYN`aSm~~voqtso|weunPLAopH5DD3^wzj|x~ec\Tlk]ggriv~XqtlYpogeR;CYbmwohkt\~|qms_WdWSa?'%2gbZzıкqy}jbf`m~swsbdw|R]xa\n~]^|k`KTig~pjnb[hs{}ZZSn]DTm]^E9L`KYs~ZZovib|x|}t|s~wPPWq}C_~ID]_KVaf^^w_|cT_]DTL[E('3Xesʳoqo~glo|mr{slwvxrwSRXS\ljfNXPPZh{žy|qkmx~~m{ipv`hPyvdW?9?8Vxbħuilz[yk?^juo|opjhW^^V}mkbQP;SiSooŸt}lzisbyolhWueFX\[UMkG:UWinq}qcHQzZnmy]onrYY]]m[@XGRfZv~ryvycptv|txS\_FE6AbbL=ObCs̬|`uqzmnxutvd|n}~vgpfjnpoLSW@L_YgmnipYxufiqZONBi\A@-=GXzyЫįr}wsuptq{|~~kweZafia`rs]cDWjikmy|wfvyotgyrSWngtYT_ULL1ROGmv|пtr^`n|jm|urnzomNYiY`ZWIM_ldvww|ufZ|gghnkedrhXX862FeYWtmȥp}uk{nybu|zzx{plX]v`WfBA[HQGdux|ͥ|~zqdlvtspcVx`VHOoiTWGH>7s{~ʽqpkl\}ieypn{krxqcIvZ?WR`kdo[|}wsThcf`upNct]`[kK>C90;jnpt}xo|xvnhzvag_eVqtrfs`@OSaZuqt}vsy]w~qx||\XU`NSfL98WVcZvxd|nbztayg}{skJXRXLZeRG?V@I`ti޵~ntxxxmgujN^qtUeZ;__azzym|exvy}VonKihXkp~}|z{~\_q|{Z|ytw}¤~wzt|z|pTvQHlrNT\ozxTeqmjyuqT?~tpe`mved`cmotVzfpbheJdebvvq}nv|awxdvqLjhYbguwx|zafz{P}|{nvz}w|wzfQlAFmiHQYmr}mUhmfhwpqJE{kkbcuvejkpxY|[qZ`QCiZf{n|y|t}qvx~XsYEkyWV^nu~z[iwvunVzxzb~|tx{~~jsN\Z6TpXJVfp{[`rpk|wiBqsseqmkmho|q\heYfS`FT}n^zzv~~zj~xu}t{g^sJ[s\bmtyz}s}kd~z]~~zxkp|r~yt|utdRjCNqjOQ^gp{zzhu|}oH_qsegrgkcezslcv\waeQQup\opiz}}|nu|w}w`{W[{vYWdilrv~mk{^n}y{~ngv|xonNiKDdjOIV`^ypx}jvxsSPzsp_ovogy|[}]lh\TF_nXdhfkzpvt}^ndMhxaRXg`}vy|qoy}zk\xuwsant{}wp|zmnXV]>Rk^KM`Yr{vrznRpy|klzvwhgzxfdqWq_ZLLjfcomjsvtzwprYsZYuyaWehgr|zf~qhkrzqxxobwv|ok|xjnW_\E\m]LPbWytu|xhTyv|envxtdhxzapraxe[NRlbiljfr}suy~tu`v[]uv^Sc_dk{x~gv|cgn|uzul`q~t|~vrn~xijWY\CUh]KL`Rtvs~jWs{}ni~~miz}iiw\thWLKc`hpkkn{q|wmt\m[UmuaS^d`q|hz~~hdu{p~tuh^fzsypsipruk^]M_GNegTL`\kszw`ey}a|sfqyxZvagt]TM]kk~tyn|jzl}zpoeblUdxr_Zl^zr~rs~~ucvo~vsqneavyz}zb|tetnv^dR\VI]k_OWe[v{f]xhpzjjx`pp`yhWPVjh~xwpwrory}zkn^nY\qsbUf^jmz~qvcklxoryla]mu|~t|cuwbqjs]]SUWFWibRReY}}j`}}rmnkw~`kq]ukUOTgh{yuxtmpuz{wfj]kX[nsdWh`no}|svfqmt}{lnwh]\mr~u{z^qm_nfmX[QYUJ\leTYf[x}kfzmt|kju{^okaxiVS[hoz}t~molxw{qiielYbtscZkZzo{r~of|myr}pwnc]`nq~zwl_wxcgmjiX[U^NPcj^PaYjnȵvgrycvjr}mhvfoz^SSadtyn~h}vq~vzijdlaZiskX``\k~qwflyktwzp}rskYYdg~v}ny}_oxjaogiZVU\RKZfbRX^Wp~Ǽmpym~mnysgsli{fRR[_wr{nlxxo}vvmeelcYeqn]^dVqw{mkozr~tr}{oyupqXX_bxt|mcjtl`nid`UV^WLVefWT`Owr~zǴus}prktziqqivuWSX]luyqwto|py{rtheok]anrfZfSsfw~n}rl{}hzntpvwrvaVY^e{tsl~s`opdfpce\S^_PP]f_Q\Q_d~мs{zmpo~qrsrn}iSUY\~pyjmw~xrwqrdhrd\doo_]`Qqnsono{}pwow|pvtpwzZTXYlrumqkcnkbim^bXPb[MQ^e^S^Mleѹw~nopnspqm|dRUX`tznlwztr~snq`jsb]epoab^Vnss~qor{}pultworposxXTXYotwoqi_ig_ekZ_YNb]OR^gaV_Ohf|Ѽñy|rqn}nspsm{nVX[`wrkqvsoztjsbewe^dpqeabSvjsyrֽ wwSO`w]]hLyxpoYITy|yteWZWbqki_|_R:MfOUJcsegtzyz}mwjvrqitvfotdoHUbw`^dd}}}}hio~mnmv{pwh||r[[gwvpwgoh~vlx|yy^Wu|xsyy\[^^u~sP.*KYI1+JA>J]ihgo`yes{{wxw_L_r}kX\]jz|prS`pyˮrK1Mhem^BF@NdUENe{aph]uqfTTl{yu}`X[Yuqtil}p|_W2-Gdw_zrdiu}x}k}qļϷƭj_LIcpOICImaSVJbqlv_nhaT9IYkz|rdqpnu|}ro}xkga[HDgxrulwyir{uvxeeIC!'EfiiVT[`[VUCksVuj]ec^Kdpzyuusiqk\Zqiidt~~uvcsf^SI4A`xƮ}a_N_eNDNdjThR[qedVJPpvvyprsXVT[|mpbuyii`UH,;Niuytot~tu|yͯǾpndVIQxq^VPqu\_RZulskei_^>@KZmorexnr|~tgms`b[NA\bzzpq~ko~xuo}~y~gaMG%"3KozjefjfaWGnqTojV_`XKa_v}}vustpvlYRdsph|{oflt~a]UF5GIfշwh\oeOLWhbZaRflgcPDLjivtpxnWWPloogdw}kh\\=05>Xyx{y{|i}~wƸЮ|shTDJoĴscntkdZn|lwmgagT>AAOf}wwg|usu}}evvqi_b[IPTS{m~vktqly~}i[UE%%'9\yxysnUV{jXqeT^_SU`Rp}zoyqv~xznZP_||}vp}pihj}~|`ZVH:H?RzŶƚ|jzt^U]hi_`YckifVFF]^hoytx_YQfsqkdxt{tcY^G233Fdl~xw{Զ˿~xzrk\ID[u|ǰxsvtejxqzj_ebEB?CXo{nhwwynfivy[Z[OJXJ`ȶ|sroz|np}twy{rYMP8$'+Cf}wűy_YTEajow{fiXctrr~lal~w^hq~rz~d_^bwv}|ufap_dtZTYQK[OZzQN|EAL^jrsj_ayumvtm|n`h\CBALe|z~r^ezckoV]e`fvjį|pyoly{vnv¼ŮzpKfh\XB>PC8?DXr|vrrw|m|pX^^Vci_{XLRWmuhhilnj`\jymaUozrrtjdjqƖnSHOnĒssP9>;7MKPsxojR`moxzw|}xnnx]IHko|grnXZ\f|y}{ƮiT:.I^t~tjd_VH?EYScsWlaX_H:/Ic]puvrvvZVdSHMPavzyhphYPVjgkjfyzur}}jJ65_nϼ_b\A>Yjy}z{wmgoz~pbYu{svvks\KAKd̬~]]UP`VTruyyxvb]HXhmttu}y~yqquyiPAJrvïm|t`aaj}~|WM26Qf{xoj_QIRYPnhWmXWYD66Y^`tu|p}qR^cNNNRev|o\~cWR_szjpkup|stsV?3QgnӲumrYLFCO`i^j}Tki^V[gvpkzjyiS[Z`sbgp`PUm}s|oggi\HPY^i}~cWȕvmm|si{ɯukTEW|~gncOjq^PIP]dY{x^^QWPX^aMGSY_k}xoaZdnwzbhhVQijdygHLoq|}hWp|hef[DJW`nϸ˵aCAvi[;%0+#3NIThm~bllVK=MA434C\nmkvk]sukjvy{rTPQec`rmzvx|qvϵt_\ALkx~|{zcgrdT_js{v{wmhbbn¥|xp~|nllxòuPFFYSWkl`B;BGLSZbu^DjdRSNKKTUbw_nnV]`U`xs|d`_LMQcxorq~sse[TVetyhfSL\WQcehtqboSCL;548Jbmmsvhfzunq}{|{uaMLYgXipu}tzvù`aL??G_zf]af[QnsfZN^N67BTB@]p{~jbuoY[elt|llib`cnsw}njel{VIL\NJo~{ZPQQTX]fz`HqlWVQMJLG\tdttZ_d\kxmzge\KHFRntqvr]yYidMKXdlyurdbz}clujglcn{pykLd~NDRemwph\NbehXEWfq{nqjqwKeLKSZRY}zizwp]XPKTdp{m`cc[GPjo[et{xwslgpv~|pnljjceiAJsdzVUH=IDHKKTcmt|s||n{lTVju_dyotVD`{`^v{yl|ucfo|eUU~pQ^\NK?NWDF[scWflnmhizqnrppsuyk~{wpdMMeWMnxw~vskcafjyoglV.)Akŋ{^P[fmomjzyOZwdWPKJGBJ||w|^[VZvtkfluq]baU\WYZRX|uzoxt[\zƩzrkmtP/QZRgn{UZj[ZdV]syYV^hlYISQaqtzvrxvwh]QTuys~]`{noy|qlzh~~mamr_QEMi|yf^QLfT5HOII:BL;:SofbupzgwtqmmkjPVZru}ռmxrYYmvcnp8:M^{pZJIO/!NZMR\fkgYmn]fnVYx}wqh\]]dspy{|xv{|rqxsstsibugk]42F\}wstp[SYQQJEEBFThvv{tlhq[HQgca_q[kuipkz|una^YbkmsyxrmVKJF`tyt`Q=HPFQrplx|pbfQy{wz~}tx{dZpsmr{y|{}vqY]spap}yllc=Jtxy~~zvtxbfootxvidojyv^iushbWX_ep}vjh\iuv{uymh~|xyc}btkmtxti{rWTU:3Tumrqoidgeeiprwrcmn{wf\h[ISlg[kvyxqipmSo{z}Zk|omjjo{|tk__a`eloswhkrnwems__u{edpvth_OmmRGHNTU[c\pvkrtodbeho{|rnu`Sf{sxjPty]xwqy}kyuchuaUm~{u`IJRUSWbhnx}jrih}~o~jdXUlngywmqr}qluhPb~uigd`bglsr`lmgy{jzyxqeniRUibUdr{}xQTqlhloqsu|bmzzouxwis¿wjjjlt}rwxjzouvcfztbhnoomfheABejq^]xqYQTXWLVxwd^hbBD^ysiw}rjmonrx~xƵĮsqoxidvpvkji`KE_^LL`o[\ujUY\K:889@L[lymrqs}~~xsdfulh}rv|yzwkgz}hTe}jgnbNIMPXcnwsk~tn|oeRDMD4BPEI^lwxVetklu~wav}uwmmjinu}n~|lxzoamxmv|nuxxywqsrRQjgdksz|wv~nPTqt\RTVREQstgfsvYRg}~{yy{z}ɸ|o{yeitz|~eK^f`hv{wxr_ShpZOT_N9HavutwZSbXA:<>DP]m|tk|nz~q~x}|pombP[tjXU`aHKju~n\XUQPRV^^JUi^dv|~~ofSKWMDTUGO`jvjxwx}p}sWJGFHP]l~zox|ikqabm_T^einokmmROhjiowvXUms]PT[[Rawt~k`vywx|~m^gf[isfixw[g{y}jswqtrdR_p`ON[[CGe}fTeo[LNQU]hut|zn{xrtqcZq}k]]h_HUv}pi[YWUVX^g^Nbm`m~wkWV`VUe`Yiwvl{roofmxj^yĿwrsYQPPSX^gm[Tmkg}yiqvjpve_hjkliejhTb}t[ay|g`fke\o~oo|klpziggegksqj_h`Va\NVbhnrpouh[stwrto^WnubW[iaOa|_WmjSLPW_jt}r}sckwqx{yedy}g\`c\P_ujYVagTUwq|jgfcbdgpjVdypusjXRa`\jg^jw~ui|xv|yypuwg|fcxmRJJLOU\hn\Yuwqx|oksuuvsnqn^g}s`ez|g_cf]WnqddooY]~}usrqru{vg~t_Ze][bUP]fkqrnoqce}r`j{mZV`hVRrkQ_oYEEHLS[ftrarzr~|pw}}|xrpgtu`]_YKSnm]Ycqh[tskheddhrr]b}xpsjXGPVOWTJVgr}zx|~yikpinzsaqeaymPHIKQXbptaew|ru||||vpqj]dprtw|}bW_tsa]cdZa~wqv}gotrsjkklos}kj{t`cmghbSXdipvvtwvlq~leyyeXXb`JMnzvh]wz]PPSX_iwrl~rrqq{~}~tr}xvvdb_SMcrf\^kra[y¿qkgedejp`PdvgcszfZgieeVS`jqy~||xqx~~~tftzjgoyn_uhonSKJKOU`miYiv|wiotsuuqmnmfiswy~tkn~|e\\WKSnrfdkyyej|uvihhjms~nl~ganlh_NQ]cjqtrtvqnu|}ogzsfdlrbWppVew_HEGLT]kyqdz{|o|xq|~~}vx{txi`^UITkgZW^kiXbwtsstv~{dc}oo~~xmXUegd\NTbjqy|z{~{v{rk~xkiqymby~bmhMECEJP[g_Pc~yn{w}~wpmlfcjorvoijy|h]]XNWrthdjwyhkyokkmpt}~ke~zxaUbfaXGFRZ_fighmpouvgrr`Z^hbS`y[ZuoSHIMT\gvwfnxvos|~~yvxxsxviemxkXSQGD\kbZ\huogynkjjkpwkWc}zlt{seRVgifZR^ls{~~yjj~mbbkqd`}eQft]IEHMT]jrd]w~xqx{zzwpjjliirx{}zjgl}}kdc]Vg|wkho||ny|{yjffgimvp[^ztvznZVgmh\NTagmrroouyx|lfx{i[Y`i`XqnXg|lUOQW^gs}rfzpyogotuvuojkqppypklz{h\YQHVkfZW^lqgrrljjknunY\xttxlXUhqnaU^kry~~{z}wpaauwg]^hrkfjUfu`HACHNVck]Wq¼vqy|{|yrllrpnu|zmjm}}ldbZVj|tigo{{o|tzsfdeils{o^k{}tePRdi`NFR]cinmjlv{xyksxf^`il`c|a\vzaQOSZakwucjwt|ns{}~~yrnsxrqzpjgnym\UNDLdfZUYfqljþ|rppqszwa\s{o|}taUetrbRXelrxyurx~zxii|}k`^emh_siVdtaH?@ELTbgWUpzƾyx|skmuphow{yroq~{j`YOSkshadmyyquifhjnuubYm~nu}ubPZllZFGS[agigekyzs{ļtpsfbfnl`k|u^f{qWKKQXaowkcyy~pktyy{yrihrtfiɷs`U:?;:2%52?ND;Tx\7]zs||{fuxoocdpacPPY_w|^DXtx||~ozQBsˈUXZqpukc|znc^O_\ZWHNK[v}jnY/Sur}os~peebf|tyjb`XdrfU`s},aЫ}dWaegdTfgXKJ?OZW^POC>KYYgvzvyyp|f0Ivrb`inqecedmwɾzxh/ Uó{mjS^cN;86@VNWOPK<16E]kv~}xdzvgj]YQYpyJ?h]ktreex{~k\EBPK:ïĨzgbt`C399LE@?:BCA3.FjljfsthidZL>EktHiʱwbg~xdtóq{whL3/LA(w²˫{qoatuW;:>EI76000@D6-`t}}bq{ormskaI=FvlTɳo_v|vosxya·IJpr|~yiH1+P@E̯Үme`\[zqR9ABG:+*')-BF5:y{|buoopqsj]F:Jnoйhcqggdpwl˻Ǯ}gw~u]C,2ZGlŵٻr`[UO`}kJ;GE@)#!$)AM5Vyte{ktprkfSF:[rؽwarpe`aZvlӻ¤knxmTE,H[Tֵƕ}a]TLLpz^>CJA. "%"1IH8tgkpnqolg[JDC~ȯjczg`cYbqȹʽƳqdwxr[M:8aT}Žӣj\XNH]|nM>KF8%%',+BQ5dz|sbt{imkkfaKG;g|׶r`}i^^ZW{mԺθĸtcn|xtbOD2YXgѷղu]^RKVyx[@KL>*%&0!%=P11HK19|x\^k^bgflPF7G{r;zdtjWVXNth¹ĭohlxuueRM6L>Eĭκxzf^d~m[unM?:B=Ba_3Fpgq^mu~mb=PaNior^ikyoXac[GHnҾӾȺnhx{bY]^bZ=4+EFJ۲~pmg^k^qn:@odazeV:Wn[~ڪ~xvuQ[sXIP\P^uy0neSqv{ZZk|sbKbaJ^FDIYePvʯx_zymy{w{suŸϸɖrorrtgdbpeN;UkCnx¨towewqEN3:C@oiN_gVf|nF_^vd{]]nulOLiwWe״˩sh\xsyepŮuv{imXKU;P3@U\vcwͿudymkvXNQ[jY^zpHXXoxrj_|i[xqeir|kWQ~Zkxzhu~neZQi]ˬj[tp~PFPWedG:5-2`zjk}á||_d>fj]us|ru]`XumE;9C[`[HWkfXjʭxZg}```WrySwsgasmL.GlM7/7 LpcOX֩ɱ||y|i^_IPydVvmurspdivb[fV?:KE41jcRxηx{dYoup~|tLegHR@9;?-BZODKfݻsfG|{gjaVkr|qrogXU*?UkJNbWXTx~gkcZfo`Wõ}kLUgg>H.GAOF3GivVvvZX`CcsH[sp¨{stvdbh\S[>>Z}w[Xdÿ|ng[olXIt[pqrOcWhW@7KB?O`^YbuɫszoinRT{v`Mbqec~jfZmpgW2^~ZMXul_Lyw^Whtcujzpkdd{qB_WF,WX8LUM9mɿԹ{}~pa\qbxULX~~zqRd^ConJMcrqɟ~}Yq\daDk~}ls_`waXNAAE27F_W``Sϴ~nitY:lt][cT~Ll}quWQ>dR=KQ[jw]sǩv~|}bQyjll{jYq}WivT%=gM=;TMYW}ttѼɴvcnty^blvhUjzMUq^hs\CTqWZbV:^mvwV{idgcv|uv{[hslM]vH&)3+HGEizʳ}zv}c`hxxy[wyq_qY?XZC%?lTFZlMmƮyydzSccp|lp|dZaymg`TMU;L==9f}mL̴Ķ`qicxlxn~cwkUqaFGRWCFOYgtVƯǚuuuzixynQxp{|}ugf[ltoQG@'N:8;9Rqh~ھԻ}v^gcI`pifx}Yvmv`URW?FPYN_geoª|vez[Bp`YngPw\slhssPG/]4*74@Yofn~ݼ\dzdbc_Q}tta>cnSBTTMS^df|}tkso]gnwXvuvdQMCUzjMA^WITN*-mvgg|dl_h~rivw~aSrnB;?+;VNBWȸŮyviclrgm{htnw~dxzku]z]>AEqsvtuiQtk`bpsage`_R^hSHsuToyMrxpz̼~uMYuqihQMuJ$Gzv{u`iwxjinmPm[K_{p}wwx|ypѶǫy|pF=?3B.>QOXfpbns~tpn~fSQYieTƴszrnhxVHfyZUM_uwf>EdNToeZjkzvqvxejukyvgRIU%^}x[0". 7Nrzw~zoyugc`bTsbZA2^M=(^WNS^_[s~]qmrqmw^^I>NX_J@I>r~̸u}j}igupvqmln^dtlv´{QeWSLWm]L9<>PjumQ^ku{mQFMpznu=C~|}I7.j{ZrfZ\]sgwu|^LnmkPbkL/8mƾu{r]auax`k{tcf|¼ůlwm~N\dF:aY]F=Ugx֭qy\v}hYOX^QgbjO]c[evwH0W}{mvzUwdZeknykWhvqowkk]cfej}^E^\Ūz[[n`gk^yashRh|{M}_V=6HPN?>glVWjjzp}zv}xx|~mlchO8@DXbaP_fpzij{rPytklp]qyrZvubMtqæ{zxwO\X]E9!0Y̽|Ǥsy]a}cVbW_yl~xrvlhy=P`HaD<02EFVmrZ\m]ZGpx^bZTU_ss[IKI1=>n:aµyq\Mnqp?$:2FL\ki|vfgm}rk>AwXphm{iyYTbuZYLf|ossl~zZ]`TRd`Fpu|XRƚux_iq>qVXSUZVvrpjoh~Ƌour_VqOLbmvxnWHE'Zvz}jdl^xymhzs^j~b|dzsisѢbRWUI_Onkw~gbdŭUoz`N^G}fv~fRE\tz`YQa6cxacClzxwaqr?>KQBN1tgdx|iYo}^jbvQZ{wzqøf|lc7[sxtYsztvrVQ >ns~^n][mywEYtys`Zp|haFv[Ecru}Yexbf4rt|epr~a[m~rТ~?Jo|iXzQUWdtykXM--^hdd]FX6eykb^P[zqhaz|ui}]hnaLboil^`SZuǨt¬byzVtsf^@RETx}bWprmkP-ucgLBmvnnXLv[;=HEA9-x~u`~vdPmrkn~]lqYnb3SqspbEg}{hX2JqulgbjmCTy}tf[raiAsgB[rwzdbu`g:]yuk~fx_^tvݲK?h|s\mhbdhvvj`E/LkmgeJPFD~v\]OTgugcmWpSvubNCqpjc]R~q¿pl]qzmbPAT>nxzim~ur;A{_lADerebGM}^>=B?=3Ej\~{m_xtos|jrxS|j[.Hfni_Fnz}vjYD_~tqijiGP~xods[j>enH`wvx{h_tu_fMU~btkkUz~}vxʽwT7Oywrfot{zpkZ>>Xooi[OZBlti^RQ[hqgp]fvUTnzi_G[xjic`]tx˹|_VdncXFHXPzz|pi.]sbg;KclaY>Z}\<=AA@Dnz{][zwl{rzpxuH`_@*Gdmo`ZqtneX\orirw^G\~vs|pZ_8ofYr~two`^owhbiPyjlw[ivsyxwwu|v]?8h|yvw~mhrcRVqukVz{h76Xnjn~jzf}u~TqdKrnmvlXoxɃSFEorIyzqftzajefnhzy}Vbw~wzlqnYx}|POeeK_vwldV1^fsxcvfmoqؤƗ94D{S:9Q9$OCbgwqknx}dS@nWadqmgigy{\ar\cYl\BiqtL_̶]ƺԹl~1DuO(@59OxsUFojYS`EcmsH7e~mux{rkuXUiIihn}w;HS~|ZA[iyxɓ|xe}orG6?5fӬcWcF*BPt}bPgyxqT?hY2nafZedu{w_inSejtKbpZk}ay_trywj_~qz{ɴehW;?cݷY=Obm=Rjil`^]OkpJjQLfoY^hTJmgn{z{zy_2ErWQUrqetpnm|qιtϋsxeNjc>QlўfYD^uG3h}qERjkzIZRJYv^{}c\dMNTs}h|lU_RAwqƋcTm}{d{~Ű{zffl9.1Va\˶v]P]WMvXSWUUcqQO\okym__^HoraGZd\`DqqIl~cczWfq_ms|eUMKPQ`{p^fuunoqryɰ{yDGkfI<`ftڣinkrbWWc`niG^dd;>dzhNfkAF^bSSyaNDVj[ETxm||qa]oHC{ki~wyal{tV\mxW@h_i~Y{}|uQpXVmrtmelrsUayOsxnXamo}|S8®ovs_jqlik~zNJ[}|liqhNamxgeYnqf{ztm~wvnV4&Y)NoB;C6sfnsesx{v]mqo]sw}^X[4LtUkZw[`byzpWcNg|ˠnF616n˩ilFBtf^yK5~ljpcMmg]V8?VckjZn{nucwnl6*cgT_{}ow|ki̤Nmi##zӦcOZkoUdjFX_gm\MheK7>zunefla}RKQ;SM-]̐~msm{p]ukty¼Œlnc9F_FbmտvoeiWIUSJah]hUdKC5,DJYhwnwlKvyly\or}nhj5?uʲztx~z{rhtumyy{xSOf=3Wuֻkrk\@go`\Qns[QIJ]9FrkitrsQd]slehaYZTA2`mov~x~|zfvdqǚ°w|`=NK9LLp̷daMUcXZkdnX<_[KKM&$kjzumwa{p[U?@PSa›wwzfuwtMpVWhyǰɴ||theJ.BTYm|ȸpgivQcrYF^cARoC*1*MdXgnms~pe{~y{oTXgVS4Jn}vuvixnuhp|f^Ʊֹ~snjVDJ,8=cľzodkH>r}RODBa^NWo^beMk|vwmqzmsqfiVD;SZ_|~[wrbd`}ddƬzw^ia@.6Ap{Ū}TWLczaNd}moS9]qNQY[\~jc|zuhxuzlTYVYN;j~trs{jS\~{}jy}wzo78VaFL`I@waassvt|giq|lm@[h:K`{|aKTMXrtphaeq}roOA[oY]g|ϭzI{M8A;@57Nu}kxx{_Ntvko{QIvPHFO\rzvuYdzoknssxxnlbgvlɻs5K~jolT9;BSWAfwRnvqd^[OHjoy~er}opow\GM1t`Xo|kL|}o~w{lWRQgȶ~\KG:/gsb}SJxloqyxk_myWQTx}|ozzcnr~\o¯vϤaVhbGCH{mF_]JSk^7X^>OD>]ZKt}flj{h{}r}rcioTTJn}gwqmvftokJc}uӿÝx_`kTA.6hf^apzppisxv|i]jmT[X~lx{{hXgx|`xʽx_ewfVMM}~nSvaHKaS4\[BP<9abXZjkz|ujj{qx}qyxXQAhalkjykmrx^q~ĸĤfZcUF@9\\Oybggvztoz~swm_hmUWLaxtudtntYhìz_Wg_GF=qVoxcVjkHK|f/Qųbd~gQ\qS=gsF?B.B\T`^w~p{sn}swwu[P]YMWNyf}~qjiegbYúqmfLOaTIJJ{Xun[Rk_?Oy[BLBCeeZrhcv|mvcrnnzr[aiVYSavktrxemn[gƻùy}ywaJTXGNEhbbziW`x]Kp|J<=0Id_caskzumsssvbR__S^Sxl{qfjd`V{ȻzupjOESLBQPf|kSagHHsgAB=6\ngot]~unxtyosmPK[SS\`ns~zrvamcnʶwr~slI?TI3Wi]ζ~PrKWoiTjv@3@BZmWbLw~sdnxdwp`q3GeYupǵy|jcc|ZRUYɿsdsV,$69LqpєpgB^y`cz:@F+jsY[fh~sowtcYn|z^=I\pzq~xpem]YVukĠ{ojiWetS&2DD?gvxvRnYGo`E=>'OjzsinuplWpzo]X`I[^j{\ygzhcPuɾkt|gMi:?B6jU^Ş}cl`^n_9Z[2:>_`c|r]d~whr{zjsi^6RYZ[Tđmxy|jhmjsYvdrycyfB8B_EAu}ĵƦdoY_ihqbkII4K}UYn{twybtwlzrTRVK@HkviΨ~pzrjqsrYig|ZsqtnJawJ;HM\Qcȓzgb_^kO~rNFTWPc|hzwo[_nivd>bSSOa~zyyirquZRr~iccpYaJG?0LY_oòf}]UegKQ~UTIro]fkorwlwyw`heopssAGTcoSxftl|hnshqyyn}pudvuj:0N@8Caþ[]R`phrWZ1TieZVy}~sZr]injRJkkWXhvjͼlq]vc]\r{|utTuk]ZSM7ISRSoƽƴuuZpo_wKGTZSXny{}t}wl|b^[nQFfUX?Kl~x̾xstqkiwtii`UZSiMYM1>Ym{mxXOuzpgbU:krf[bsmoj]sviwgeJEbOSvxw{fkwlambsuth~naacF'5a`\^Ѵºtw~jQef}hk[J[gx}wjsUZ{hXFjmIENF?`p~|qvgvepyl~{{ruggmTO>C:+YS]Ofپxw]xr|dC?jvwv~{n|jcgtpY]BUcY]NInv~gumNll^`gjsw|vYWHpGIZRTJa}uͳ|ygnrjaT`6g|nkMkeu{sd^nYj}re_^D1Xtez}~l^r}rttwqxOYeS<1U`F24GEW;gmaxUjhxkmztxtp{_an||d[dOGDSLC{|t}luwfx[c}twziaurbERVR99RRao¹‘kx`?[pt]S^TXkoeryChisYq\^XQzwy||zzvy}nsudP\|~vqr^SUUQ/^dJ[jh[bʱӽɪs\D^yzOZW{skuu{kaxrhAuwR8ZUN8@]Rfcaȭwjn~_g~{supz^jll:*>PR]G7KY_c[Ĭluchongz\smrCbTxnntdNiiNO[bD Gp^jV̽~|vwp\`dnmi{vJ|gtW;&+LidJNkSZa~ѵkxpm}w`KohlXl^uVXj[`U]Q7,Q`ameƠ~z_Ybfgjqp}{ѯ_bnH5Obsp_fmsh~ioźtzy[aINjC?Z^y̢ZcȌSV^gfp~t_qzpr_[zt}zwfan\eITOdp`h`x{ef!'TsIEgt_Y_qseĠ}|yxdfbbY~KR_}qy}g^QSelUafnylrv\fkeYfZh~ջªb4kڳr.';Zg82jwNHPeykm|~~Uc{RcI~~LNayqgn}seTcaGNgsuu~vqsͻwL|Q68^cJA?dhfolpR~~k`|uru|\o]YeSz\Pqge_rwwxehwyxt|gn||~URmnPDƵwmtzsM5LN61C]fHtw}rcqkkR[yvzsj[haryVZevjutsjXhobmyz|frvªm}kuomqnR~˟jnsuW-O{cJTSomehPb\|~}v{ky{jI[V[wrhLZyq|zaYZPv~ƵvqQ`r^eyj˩WJZlraiafroSGikB4:PbRxkhMReVZPgnnefzZdAftdstswgsutotauyjd|nyã¬yv|}}fv|ZT`\SVwfF2Sn]ZkkqQe]q|i}twkj|jnw\dN|~x\Ymbru]Z\oyuSMzrhpykk|ɾ~qtzv]WgngQ|ո}z}mYehNBIPhQim\dG^`d`Xzrmj]PxjrgggiswaU{~mdx{crlY\vrkzrl{xrxgf}eQSXWV˰tXGhmSZa\ZSR}gpfkmlviu{YaMftlh^[qt~{`TRYro`N~lis{p~rլ}oxbQUccbTp̸|{{`QbXRXMXFUmqIS_YTImipvlPnzslX{_HmpmyРozsgkrltfneov]R}wRACA<_ӺoVYgad~}TZC}ubonwnm|wdc_`wqeUWg|naqjTQTqhxR]teqrfY}ŰskiUPXjnpiڽq}pgdSRW^d7bpcfAV^[SHwtiqjXNwqgYk|vz^Xs_[wȞyln~dxvlqbrRHrdA36;AnּoKUo_Wur`jOmQ]]kuv}jnb`tqlc`kyyi^heagokDZyYisYagg\{Ī|w~uwnqoSIL]blwٸxzsahdfkmr;Wu`eE^rn_Lqu[`\RKvwda~zVHmoXSsңzsn|y{Z}|{ȷ}zqth]^^W[L+GEdvĮˮ}XlvtYSWNgf>alOngjwytt_r|vV_hQ_wtXWMEehrto[gjZsjv}Įoz|fuwR6QVSkv۷r~~{z^JMd`FSik\_FEsqbr~mZpfz}]bwuovdGNxi]fsŶxvqt~wsypg~}{qiuUYOJXiFDQkg^rpdahTP}~NCnX`yrq}hjbok]o_Rkja^`G]i~|h{fmu\c{j{oģnov}cbqV>HVTo{Ǔu}~qmNLceEQncY^MCytϥֽqyl_pf`\{vqstYU`UstUurqd=PVXdebiavchV|x|i{yo\lldXbdMYYlSdo~’ek|~n|sr}}{zpVsYAR@3hI27YICguxklŰŲuwclqsfty{nsjp~inNtypmVKf\]cp~wxoejU~_VWwwhztdc]aEPGK;GPJP]uių}crwf}xyyzub`dhUTgT@IA\ror{ygeknom~t|`^TR{\A3H^I=Zd`PIķltrn`zmjql~qztvVx~s]Md^UX[cUoy~kk\~h[X{xeswwnofkMQOTIHTHLM_KXl~ͩvqjlu|tfkj^XnbG@>CsfZXy{emgqd{y}~zs`_TzwVDFcU?Id[Q5Uw}||zeq}o^cb{v|ggq[YjWYT_MMYhy{pkn~hYon\y{wsop|d\]n]VmmcRnoy{\M_q|naqryVHaev~aeloxkup*dUfwųv{yVYqq}~W'KI\aUFPLRE1Wnrxj~<t]U_UiTV~ywh~rc~qZHftqy_dwvq]ecReI`tgjzyrmy^NnulfwmxfPJo-g~vxz~rtllt]prsdsmvm̽ɴ}x|iG%4cAϰooaGMEJ7#6];3$JL$_[VBM~rpk}qZqfufrlXddiaLqunxz]ih^?.Omb|{gsoqeEo}^kRof|orb{vlkxvj||hڴٯݻfaa^O<;esɾudj]cH']HBF0k7[iSmKqsp`ssxfXWve|wynS[dzTW`^tSLjrtkx~znxcHWMQ::Gtiz\ffa|f}{ytlթ¢ɞ{TOQOH7?_{|wWbS_LI@/@[5HgGjJrksuhy|uih`eog]lhiSy{vx{tMYU]EEPunstuRXZqQn[}zvnmyxxj{lo˷˩͠WQTYNCKsȬžireuZ3dLHG3o>cpXpO{dno{zUfht\WV}k~syqS_p~WZcf}VUg{eylvpsktY9GKP:AOs|\wh|Xt|x{sƓäxxl?dzj~tj{jfqd~yiu~weq|q_]y{yxusllRAKUJ?K}|вxux^kYekeRk}rimlrXQ\eSGQ|fxurw}hkijg`mvaaxo_zocd^]=;GN=;Tiȷzoiyuqwnjzzp|hjxd_ZYJ1:FD7>l|tĩynhr[_ZV}hbQc|vjnoudVbncU[{~x{y{upvsrzg~{kmfhLBNVIDZrǶxqvd]tid~y~~~cfqr`\yr{zumpmiedW?HTQGPҷ}}htbdoeUi|uhmkp\P[cVJVh{ww{|lpmohdtwe`{rfZsyi\_YZ>9Ol̾zsq_~|Ro{eYSpyoiqprZ[fhXTsl}|}ztvy|nwfm~ljfgZCKTNDN}w~Ⱦxkepui_v~s|xiakpaXmoxyzlwge{|jcd`\BFPPEJvzҼ¾sjiseXj|whomr`S]cVJX~bz{qsprij~sj^|l\Ypte^`[Z>?HG;>htgı~|uwj{~|luzocpz{zue}n]WlqaX[TU98@A45]n^Ųpyl`tbUcwwhppujX`h_Q[l}~xwvn{lcxuhngiOHPRD?\x^±zx|cm_e|quyyw_dlfVZvp~{wurq|i[jxrah`dQAIND>S{cǺʶi~qa]s}qltptZX__OKkt\w{tytkrmwqaydU]po]a^^U>BIC8Bm_lx{si{zwjrvj`qp{|~vcviXRel]U[SV<7?A54WiV}zc|gZ_syjpstrZ^eaTY~ro{xvqk^jzvenfiZFLQH@Rw]~yhtra\p}tmzs|f^eg[Unbv|zzezjYXjq`^c\`FCKMBEkugͿĮnn_dw|kqtrqY[b^PTxlizxt~to{mkb~r]PZjhV`Z\R=CJDB;<]r[÷gym\[oylmwpx`^eg\\{k|}il\\mracg`cIHPQHNuul|yf~hZ`rwhstru\_ecY_ur}x|urn_yq[LSccQ]YZWAGPPL\v˾Ǹ{rj]hwwhwpvmY^d^Wgh}z}ustxobc{hSIVc[P^S\K>GNJKgg¸s~ygdvvvxngnphir}u}pwoWhoUCCRXGMPKR:;FIFQywrõ|ki[bswhvtvv_ckhbnxzqjv^Q\ieWf\bYGOWTUlojop\Wfsjiwkxe[be_`|gxw{r{oxqYjsZGGW]NWZU^FHRVUcĹsl^fvviyrvr\afc_nl~|~uuwxq}aawfOFR^VO^R]NBKRPTrkrudct}pxwkgnninu|w~u~kz}dSieK;Alp_UfaOIOVVgkUc]MLRe}jehpsnkdcvfgzw{}iY]SF=Kstrrz~uqk{Ŀ|pahUOXnƦӥtl^fkVgonv|ta_dVME]usqw}{||{~]|dY]\SKJLqxl~pjovwwsry~yzbNPG=9HusokpyzVRjOU[YQNJ[xrszznmstvqhrb]exǛ}tsxpih\QQND??Juve[jdSMQVWihTc]QQYmwlehprmjbeubgxux|vbV[QIBUyk~ox}zspmzxztz~`cdTVb|˜xlete]ppryxj^f_TJLjsps{~{~}gdvWXZVMIF[{{pwvkltv}|ytuxn{|xgRQM@:;_y{uw~aN~wRSZ\TOIQmjxuu{nkprtvhuh_amͧvszpf{d[RROE>9Bfmýnevz~kffk|\hs[`ggbYHRaay{pt{vhlre]Sf{{rtkkw}yuoqp_hqvmc`atjZjaWU[nzxeUlVbf`end\O]omox~so}ji`gke]VSiijfhrwy{khrh}mhnd\PXptz¾ͻgb~R47>@=;8NVOm~x}~qcOYegouuq}lxrnmvv|i\ig~xli~kjonhd^nzϾzUKXbx\T]OGEIXf^FndV\a^VLDUVSt|pvvkbWhrnr~tkr~xqikv{xoӾu`KM]Z|}plZK9;IFDLW]hzgcsg]XZgwtZxp[_dc^ZUhmc~ufT`ry|vqz|~snuf_itogXL?AP@Hbhpvthdk`VFBTXYblotxl~zrps~oxwyui^S^ok}ns~vw{ztpm~o]IThr{}k_Y[em[Do\OTYUMDATSSrwnvtkbYjtpr{ypmy{tmpy{xo}ueVIPhg}{j\JETTNQY^eym_pk`\]j{}aj}^\bd`\XetfuqfW\v||tlz{~s|uhdnwolcWMFTWH\knsuncefYQDPceejnoyoqyvv}jkjjd[TUp}{p|}qtxwsqu~|o`UPly}ogekvuXO}{VMQSNHBKc]c|~sowrldbtyuv{s{qpx|~}wrn{z~qtrjg_TMNh~~zk`PUb]XZ_bnycbofaak}y]}nZ]cc`^_uujuwrf`[ryyz~vs_s|nfjgdb`s|{mtruiadgca_l{luoa\]qsoqw}mnOasfVQRfl_q|}xo}u`vtfgls}vbx~}{~yof_oxuv}vh^iX[aaaam|mpncnx}q|~ɲoN6Myoc`\Wbjgg`kyvrtzhsaafdbbj~{wddhzphhkrvrsg_j|zqa`t|wrmW:Y{`MR]a_^`plYekkruhqzusv|}zz|tVS{ndgufd{yoxvpw©|wlYG9DPS|phfgsu^ah^XWbu~hSvYD@DNahel\Wkruxunkqliip~ryquy}{zz~ukfb]dhS`iun_KSuk@:S_adedmt||rmnr{ozX[v_fv}yvy|xfagsrtnkgkuwy`HYk|vj_]ny[68kiIBHPQRS`n]_ty}}rmoltut}}z|vf^X^ucbp|øz}lnuxy{y\GDIdz`PHK\UI^hikox}pOVmKCJWdr}ww}ytuźupqxzwssu_ipr{~o^`F=;?Nf~vpja_e`ZRISWTXdnxyetnstntyvrp{vqouw{r~z}shggiq~}umehbEI`pncKGKNRXduh[jqrtrliqrv}~}yx|{spgVUZ`l}~{utuyyyy}pitz{~{ooytnfZNPY`t}u~{~nTpuZUY]ahsmx{|ywt{y\[mvvqsqlin}seu~uputv|~l]zO729E[wyx|vrkdnsmjjkp|o]qoqrinssqpzjcnkd^WQ[o}u{[e|_[cmsz~ridaitc^zèndfgc_^kjU\nty{wptyz~{vvy{w}}q^||\TYbmz}~yu{zroeiwzyyz{svsyw{|yyv}vne\[kztwiWzeONW_goyublpmlkin|vpjhqjXkpdg[`jmllumfv{{{yty`arNDNat}wkfonhedemvc\snWsvquvrnnzv_bkgc^XVbox|{u_ya_gqytlfcml[niefd_\bn]O\`\XTNRakx||vqNNqeB6@Sfx{~{}ur|}xuuviinhca`exxvytsrhM>f}dSU_hnt}yfpwvwvsu{wrk_chb]]]boiZpvqufgkjiiupo]fmLEPbtvnomfe_dqsomlmwydg~hUvmWTY[\_hwjYbgb^[W[ku|qtxjnwtkd`em\\zrojnolikvoY_igeb][dikpkoupihjrv|wWKowUACN[ix|{yeahc\VOLVak}vYFgyZA=BHOYj}tfryxxwtu|xtoekpjebaepeVkuuxvvxwx}\C]nO65BRdz}ul_ae`[YZ`nfWgy`ei\]aa`bnr]Zgiggdcjqu|junqtwyklpkgffkwp]ipiga[YbiWQaggfc^`caefiw}yvuw}ssYkwWKMSZg{wqlpqqs}yiqtnhb[Zabju}mOU{uUEDGJO[p|lkx{zzzz~upwxspnox}hcx|}}zy~py}{}{}{`SsyV>8@EM]v~nxo|rjgcbfpq^T]bbbbchjjorvp]pqa^_`er|{ysh__`]\\_ikZWj}ƻ~pmvyxxwwzxvxuvqWKfpWKJMR^q~~y}~yyzsvhc^YZ`g[HJRTTUW\cfltxjfg]\\_hx~rzzsiehgffgnvm^h}|xvyvjqxyyyz}~|}}zy~wjRZ\Cuxs}vgz{pbizdwvx{_OTO$,SlVrʬ{mswtovv^tcUVnwqINrxfb_dpb~lnpl^zmyspdYXW;Ueb~̦w`b}vf{dxgz|u]UcZ=MAKGD_ndrj~oesY~xITY65CuhYwz`uppqp|x~rcqeOucobG{wz}i~|untrkĿxyqno}}meeCFZ5>BjglhbqQVGudDYGU]V^nbv}}wtmrsisk`~|QDZ:JG}~v|u}x{fo{rnkmcs[UiG7BMOiעuil[{UmdeujfjSCkINNjpztne|m^_YM`p?MMNegw{}~urw~\~lhmu~{{pliVAU=?^Ksesʢw}v{uSutbadoXnhOPY]Zqduw`e_haretodga;S^N_rūxvy}fl_r`xn{gue|wwE[aaA9aPjtuxtkuvxiidQPbEbnmkpnh^y]prrvvlX}i`Xd`Sk`WgyƯ–n|lkwmrzw{y\}|~oU]Z751]:9Vb}vtn]utb{vNkrrRXv_kji{v{glnjkpvlb^XCLZCqǫ{pkzzwi~ur}wir\Wc~IHJGVLGUTHv©~uhZafEDEtVOgomzxu{wqnlj[lrVyutoD]u~pvzsxwyxsfmppkdhjnziaeR;UOB@X`aªĴjxy[X_ZLUVgd]kp_w{~}}zvgzy`^sxUI^?>E|n{{yotltxzx~v^sr^S`]JWREJMRXħƶvotxail{vekgNVk^Yit}qlkym^vZLHjd9@G[qo|{s}~tbxvdkswluo[XOH=SE:ek}q~hnoahs]dk`eimjtuvlgZ]|TX\hlVUWEEgmo~lw`^y^]j~}}vlcv[RqkqSSV@5A\aahylxahggu{xKmixvrugh~sjZwfi^Y_9M\EUvvmrm~ykwltujxjtZUgW8kp?F:6X>;iewtzxkRbn[]cie^`mgiyr~H`aan_Jdf[oo~pvtnK}K[Ydzyd}|fvklbOZYH<4NHLHgwpmzpWmgitlbuhqn]olltpuIR^=D\SAzytiyntujz}yo{yyfapbE:MaJMi`aX2^{ijzleqpxQm~mqzgjpguXdlisgSnlO]T^]Tp}u{yqz``[NSqkas}iwpus]acVX:OKABB`ZSn{Ԣ|e{yicgpx~vvg|zepx{tUncKFP4qp}Ȳkvp{]a}rhu|eynfq~s\ptlZWqUXW]fR\tr{urqfs}^WNqq_evpnwqk\k^ZNAV?F>M`OTivqǛkkhqdss{zswdrw}b`w_IEG+MpPMUlü||z}icuiyhos~v}s{px]\hC=4TaNGembW2Epl|ozruXlzneqqh{ui{xsi~kUUjNVW]eS^mostoubveWX{o[_tqwntq}h^i]cKKX@F>QSAP`qvsȷix|slfUb_^ggegd`jsn|}yxuwxnsrtujtr^_ayysXSST\giptsz{jcQdjr{~{yuWr{w~wv||{u}ljgflvtz{vztkzr~tiZfn][CGOG@IGJYcuwbtb16ɻ|NKHGT`^cdb|~lh|zmyofkedh\^w~~~w|{{ofLVxqg_kgakqnrk^up}lNtrgLBLP^mgipot~stZg}w|myǨeT?3H7z±fgfdgU>@\NL]M>NZbyvXP[_|]{I^|xsPIUYii[Lamovlncq|eTZPUmKtx_TRGvlsz\Wfkz{}agfhznhjmgmkzfqnrs|~ğ|phFDD6E`˵õ~tdjOUaYOBMQSKooKG]Ua^nHb{d{yVB`cdamfL`lbjx[UjeGaRvs|{}ZW]Eaokvme~svrr^elou~v^}}dsvgyrouzlͩkaJY^5-:Ṵ{lUd\Qh`FH`][AjqILb_YuggMct]ox\@aeZV^sNUh|nh}]\x}WVTnih~}r{v\[dRRkgvsi~unbenuvbreuosnxxoezeķhxkIUdL.6Aõud`lPijW@aabHV{WES\OgpgXU}mm|mDOm\YQubP^xf~p[tsZ[Zy[q|~u~uuqhMSP?_iprr|~zuvfhztwbrfqrutxgrqg~~˧gwXH\bB8MKGlngUgz|b<7byŤs|xsqj|x}|ktk|xpo{}{{pyzguw~zvYdP9O`RL[]|xvOslaFisgRZ^=FJ@_ti]XytC@_ZTIuvjms~w`v{koZ}gjhhd^\03:5ZǴ}r|kwn|mv~q}j~lrq}zy|yyity}r}rlkVZO5I^YWng~SqpcMl~oZYe>ELAXuk_ZyyF=]YQFq}ss|wycx|py]zllg|e|x`Y}W+0:8`ɷ~r}m|p~i|r|v|mlsryuvmpwzp|~}eo]aRXF6O`Xbwo}X|odRw}oYg\>HJBewk\a}p=C^XPO~{zsz|{sjwxw`{ir~j}sbrUcwA(5<@tʪvwtm}iuo{zssonxqrx||nxrtpula_XYTT:AW\Vvrho~k_dzk\{GBMDQxqfX{}T9V\VJhzx}z}jysdztsm|gtctu^UxX*.:8]yrudrkxz|ok|rquotmltwmr{qwW]QYUXA=QYQlupwlnhaq_~PAKGKvtiYs`:S]VK`|yyu{y{}pysksqxo~y~h|pfpvbUv]++75Tȑ~xxcniv|{pjxtrumthlsulox|zotQXMWVXC>OUMerepsnhzf}WCONKtwm^niFOSJ@L[^hrxztxy{WMSNjso\~S@[ddf~yy|zk}q|w}sx[sm]UTf]RQm_71?DjƘ~tlluuz~xjzm~tmu}pel}prchczqpYryuo~}wfXrJ>;AMRNDM^fl{{}wu|}_PUPhuq\yWA\gjl|}}{m|r~x|qv}XojXSO_XPQlc=5CJqėwnnxuy|xf|l}rmv{mel~qqdgbngYqwuq~ws]XlF=:DMSNGSdivz}w||]SWSwto]yNGckou}}fvz{vrwmXt^XKPZSMYpX:E`ƥywz{uzzrkkqxxntxkbeq{f~~igd}kxcO`msryqk_MgR@GVc_OVew{ʰêh_`TPe}xfbci|W_xh9T:VHBVKQattgvrx}jr}]jf^p\bIWCYRNm`_hzr^gne_{srmwWjf[iz~~rQacm]rlryzs\GgǤyl~gFr{ev^WmemG`_V_|}zrstyH]ddTf^lvrmT_d_Syjz|p|}^}xnrz}`y¬sRWWQDnƧtuPvwcL^UL_YW:[VMTroquxep|w{hX]i@atoaqhyoxZGWa^V{tu}z{bysz{dÿ̛srJ:JVRPyniTgSWaZL9\LHQvfmpp\t|vmzydS`_?N[L_xx{e]hMb][>@XCGYtchka\~xsjwbWhMCukhxrqsdDPaiUp|x|s_r}krlvڱssS9IZZMnrr_g_Uk[T3RNAIjebdgRm~uisp^_c=YxdvtznrNG[ma]z}xyxr_plw{cͤ|tf>DTaKat{|limTmc\=@V@BXn^\aPZumh~kahGC~npyqu\EVijVrx~y|{~\uvhnne|۳vrIBSfTSlx|sku`isaO9YIAJvx]XZUHwwqctfiX:d|jxwslHQdu[htz{xjdkhyzqvveˬzw`?K\dKhixwua|mbAIYCB[jXQXAZ~rkhrihDC|ryy~sw[IZpmZvpz}~}~_w{ih{w}ceu׻tsLCRi[Unk{~okj]?ZUEEm`RPS;myqdw|ok_:I}RRT}wkxY4qn{Zmz{{sog]%Ktyec^sw_{\njf`_nzşh?)8IUੂ}sZJb;9DBSOKkgbZjpcM:SIIny`iwZckxh|x^|TQPCFİvbOq{q}pxeG|tǩձZ`Z8*-Zxϲos~QLWE"Qg;GJ@ieV|o[_-6yp~iyls~qt{mzskWZ7/WSnŇ|otsc[x|ylm_{|}lHH+?+dǢι{x\\PEODKj``O_q^VGTN9GZz|swXTxb|fwraZ^T;8]_~t`oxgun~qVjPz}Ͱ˨zãuzeO.*C>\s˻plxL,fT1K;GmUbnug-K_Dbxxjrml{zzzl}|{np>?N6Kɿ|Spyxp^o͸qfeG=N0+T_ིtu^YQBVb\UQl_bS]lJ@GCcTurN}Yjbp}yk}ut_bqy}jjvvkzyhSVOk̾~mY?I330VǛsOrg<@9Jg[Vx}xwLMkLCW^^zzr]w}vzl{{}X\a;6LCCjk}yqhtshsxuwrd`oU7LPH\Ol̽qM[bW_Nie\WaudQTJN2Emoyf\YZgrogxX\\xhnƹt}xtypq]kğ|}sud\NbQLB&UkocdZXr_eYj|`]fWR1BRMU}ys`_Opxt`n~fkjJLCLNOrx~gszj}whxsZe{gcɩ|kybR?4J<8_tĵiPSsgXdyzaQuojV?5^Ynp{nvl}tjwx{gtTEF'7`RP`slhv{hP?@D=CPN1)Xl{vp{ivwe^u}uj`gbDSƧ\KZ3?[s|qp~ry[Ywtmi[~srgrmUKevsl]VqaAWϴ]Bp9+@Ubb`jqcY_̭onqymWps_omIcxbVuj]glpgfp^s\]unzkUPPz||vYp}zd|ȷmfdS\WRP@AMfxpGHlKHYVgwx[CC9mw|VfjrXh|wmocehqw|~jisoW~gZ^f~iPTEr·wj[]VP}nyxwtVNU[gjP,QD43Jgpbs~G4?*MsY^~yl]p~u\\kmbwpytr{|~Uup\Yvj[hSnϳþgJM^f[}x~mei_dd^2LL41Wtx_guA6F2CxvZ]xm~j]sjR]rzjgrwx}t}YsuZ\jft_oͤɲ}}[ERhnfszmli_cc[3QK28g{{Ykg==L4Lxwv|Sjqh{g]_Rcyxrjvu~|yyWzpZd~dht\|˝zʩ~}vPEUkjmvkrheciS4WF4Cs~vRyV9CI3[ws|rP|lirbb~{uTUh|q{|p|uyi_}gZu{ubqm^ɾ{zgGL\k`zzovkpjpG2@mztXkqesi\qx}_Wesin}wtujwh\wT{r_svʤvnk_R|hgyyzttJDpuonkf~_NlSIRzergvtjct~|oE,[mS>F\IJRm}{m[kllu|b}OMhjdt{h}²۫Ȳpi{tu`xkTw5?]ji|dbPeh˲\m~{wWRk`kfgo_M\jngOR}g}nW?padvpx|gWXbwciuNUytҿÒZ\^kgL[DK/;YWbQG_~lz~{jk8Hm^ws>Uu~q\kw{yPP\t{}yevqwtkyweXel\i`brjĨŜqvgUXgSpm`^F'4O`bN7dOvx}`F@K[]DX~xk{ezxmVmkui\kzLoX>FEdc}ymvnuiiFJ{٨Ʒ}asKC$0`zŬ_]QY2FnROZ^fW5U|t`Z_wvl{vtzcocft[@AR{}hjkyxMjkrtY\g|||`?>HG^ɚr|K78L`XDSicWffigLgOD+7dzxdplcr}}jfmoWpiBLsnZnФrajeYnx|_ES}~{z^MFC8,xŴvRI|qehikYZM|irulfO9NdbxUUOKthenvwifZ]F?l]wiuUqcsy^pStʚsȻurKgPHO5EesLn`WB5XZgT>UgC5]@Y\Ujgqo`dqrbmv[l|]Ac{aHBVoxusbVprqsw{xfUQKQ:MlkLPTE4OjZ]I|{shhP/.ifmZ{~rcqvnvn\N:hap~zvu]Kvqzg{bQjʭlqoB`V8GXpyoHmh\hVQTiwj_lWGFANPDWj}~zqchzinq|qjjn{^ZXSM\h|`{ebYnsmdzstxãwkio`Q=%XcTVumfzti{mYnsipxFQ3P`yu^yx}ut|bmov}tsmwziZyv]N8cg]h}̺yYjTcaab\pjW\agcUNc]ckf_txv|}yv|aVvhZsnaG0Tv{|n_|lvXg~v`Z^VL5BZo¦uPBhqQUed_Qky]M:]hgpvflkpqtXhz{{oRFP\^ioxi{fgyrdZuŦntdlcF8DVAd[{roZcdmlbYMRWO?OhW\ksyiPrh[gkYBN_NN@oyzanyi`bs}{MbkCD'9Tejftȵsb~v|z[SrjF99TYd}ruuuno{wqywtr~]~]`SC5BTmwzwurbggosn[Npomxžz||rhoS[P@>9/5l|~fm{nwqp_gCF==J\{{s|zWVjsyuhyur\v}sgiX-Clɞ~|igmyypr|rHg[=HP^fyxcoo\myydR[upG&,7?Qpºvx|~vqXXXYp|wjmt{sYX^YTLJE&_Ϊwnf[X~pp_wwoU79nTcgsq~qk}ne}]OYiqwhqemzhgZ6cQ.:F]uquolfusjnvnfeaDTzv`[|r[]WKMktwbs{lcmcNU}sppo}~nO~|t{m]sko^gl\>/:VW=;Rcr}ξycutxMbqDCTatpu{z}}bdsrmoxfPOPV]cuhcmfhhc{}vthwsjlov{hZ\XSF:EP2bqùawhnvm\BCaj[NQfkiwylwV]y}y|sZZ?9k`Xdtvv{yr`fln|{w{eRSMLSquZQ3@VYYi~zryļ¸{swvxsfji[SP^ZQ~x}y\VuklOOO?//Ixwsy|ycuirQe~UnYdf^YTVVA3:Kdx|~oabb\jqhGduvvyyc|`^^hmtzjTMJQSVhsxhxlkd]LPv~ru}uYPa{l\WTJDTHnj{tvul]JOfwktrmxyh[c{y`[ZUSUpaJK9Zj{{j\aejvssruvrqQPxUIC$,8=67M[TJDNbr«|byi^^o|{}}{}rlmmljv{qdWSUPSZWUw{phfvvn{vfX^x}lqhc\`c`ZNLOHBBF=4g}v|prkabjzzg_ciyzilY`y~hX\:Bja`o{x{znkdeeejcuwihfio}dOHFKhsU[K/DPU\`gfe~ȽʬŰzutkahbKqv\Vzwgq`PE>6/A`rxrowx}koooZJlytw~tw}]\vaT]d`adYJ90;HVkuux|u|zreiidz}]``^ehm{mvsznSPOi{w{t{|royw|d^tybndp~|jjbpog`RH::Q^^kcU?Rnywtnwy^OwD4J[lxrø|jfnUHOfn|ojX\jtzxuvozeblmOHRfysy}xnYIlucjoѹuF2IwjBNK3,P]NLTLc|}sjkvixYLk|TE\~wnrh]RVlwLQbdytu}s{pZSUPTuu`_ktuǜIJy_AS]hs^ZVafiXRTV_]Y}jVi`rXNY]m_LWix~}oMczxu_ddoikzkpcNlS\6DlJip~wgjyss|[K'1?Vmi£t^glaQzdb8lqo}SCeqQRWmvipYys]chz|shyrluN44Gaxww{^|gkw}x}ziN{uԯôŢyr\IDG8M̞_szwPFMUotWctidkceY7dTI6?q{lGLfdplYsuCRoMEXxnms\HOa}ŝ}aIMM= :|½i[UOPfkkYoadT`UGO^Xc{w^p\YRUntqo]b4QaWWig[q]{~Y\{˼v_Ch?@3)?hup~wtXi]BY{eBTlD8@OT>M{uSugi}yZtw}exV`PW[Ylvjd[`o||x{PpsǬzl`^^B3|sxv}{fXi^Xi~]W?>bFZLJSZo|t^lxvwjaqiC^{d>3Ndrlq|ht|o~jsvptZEG@EO3`gy_dhfM?xwp]obNN][I5[m`Yck{hr|nRW1Rm^|sYyeOt`lxɵy¤reF?f0=Oeon`iUNRVm{rVXUMGQWmM\suQplTd^ynt_tWPSleVeȫ~w}|wunfy{oC3_WAN}yXFt{_]UnoNR4jWD]ksuosubi|vZ~xpvy|[P[QR]fm~k{nbvsypxt~vťzoefgaVBFN>ws~lCwufXzvjO&5pmUKatoVQ{nyv|jz_ZcqS[6arNspPatu~ysnt}r]eѫ{sizoar_VuP=I\oǿxkB33Qcd`PJ[cmma>Qnisuolcfw{zY^vKVbL8Df̳p}c[dap|~stme}HuʻyjydL?4bs;,HfwͰ̼©I;N\S^ZPKJUUOP[RHu|{{zwx~b]wrVhoS7hzJV~yyIRgx|k|fW}qmfluZ4KQ+WuMR~_mrn_pth_kvT(DhQ[]K_en~Vmyfof|]pul^Fgk-[yZa|pytplw{Pbv~Ưwt{mposH?J0geBNj·`izrvpkj}~=@^EX`fa]guQaxl|nczTzibWNK1loU_pqyxgmYY|ni˟roomX\cUA#\_ZzwnzqYYnm~{pkqV@XKSZzcLXctSsti{pjvVWneV;e`_v{vjyeNxlfpmsi\xuK=JD7'[k\w¯p`Obr}iedaY@h^FJe{\isftWdq]f^NUXWGZecywRZ}xpUvn~yzvlzF@VT;(GdXƟqbNZmmj{pqbV/NXMP\lrus^potvs]eQY\OFe}dugPa{~xLlo~znnieXHOJ83Z|l̦lIQm|nfXZ@]_SKphqacrizdntqm_|[Ve^G9Rve}{^dzv|Psz}wunxuiclG=PN>/Pzu¬vdP_zlspnka9YZ]\`rjdtw~ep|dmcT`PIHlzk}vcb|uqxsX}vshguYgnF9XOC6fvz~cRYuq|fZ\MFW[G]u{]xijXahgS|i~|{moEvmJ[^]TIJL39GYlyvê\ofPtz~tV]oprhtqxfmvPXwP8?Ii^ulylzxubWSepvj|mrvsI0\sQ?NO:,PHIGɺépzxmpl\_np|xk[prr~l4hVIF@g|yh{~}~bmbVXkx{|zlimnoc]oJ\p@H8+-:Rjtp˱m_piomSAgspqqnt{onfld`kZaWQJCZRNbysw\W`mUgx`th}xcpi\Gsnnlw_5%JeVAH[ʴqmiZVUplo]v}xbKcW8AB>0;npwuҾ}tlorrhbagujn~kygX]ci]Rgga`WWATLKXM{ť~omi`djYXey}vnqrtm_e|}xyz|vo_eoL=;;.%,JWKZ~̱v|Ztjjz~hhmiqsvywpjlhsfav~{akmhhG]xMJVI, *L_UpvUu~S+F]Z`iuwuxotsNZ|pylbcyqpptpll`r}fkJNYXeB'(2K\Id}aӱpG[iavx}yxR\}vjrqjl{ec~f|Ŭfi_^p{vyUw۵yMQYDTeiZ??>[c?e5'`JapiVGo~SELdus}cGIswvlIrtkhdieqFymKGSZisaQzppʣ|{_[r\j}qWXUeizqCpmelep̰łyl~X{zxrt`ϭs_zhbwodI?;1``G]!HNQpUGsi==SzymL@ysvUS{qdc[[cyoj~J|tCjgktXZwxlƮqpZlyayygTXLah~bQjmubnco}áæ}qwTuy~toteȦ{ognm~qdF@<5b]K]'NMUlQFrg;;QzwmJA{ryVRwl_\XZh{qk~J{Joop{[Xuuo}±zzop`ok~ygPUOal{nPjo~~cgeq}˯ʱ{mSowlywneˮyvlqtjM@@8ZiKf9C[J}mUCgsF8CmwxnP;suwgFok\SWXwr|k}Kv~TixudRusvvxynlgsuxhOSO\rxwR~npzddes~϶̷xnQkthu~rqfɮyzu{wmOCDBdiPi;_lnnYDQ|ixcEfcNKWecrx[ku{wSZk}uq[vzxxyhksqc^zets{bYz}jqhrmyɼpz{wSNqw]grpyukgxYgsrvj~eHjV`ry~i[WlfJ8Mhhm]JIsqnwHXjWKVam`^z{}nx~`Oopn~yn}j\{{{tpvySsojxrpY`pguo~ls~{Ƴ}|ueFZv|i[oquypfnoQyuxpSXiTkt~xe\]x|^D:XfggTHY|jvkGbiTQ^mei_xtzxXVvks|}tq~_ex~wxuyUxknxumWc{klop{mwz¯ut|}z^D[txf\ootvlfrmT|~|tT\kViq|wfab|~aF:VdeeSI\{iukGbhSR`qij_{u{yXSrkp~|~ttaaw|{yUuoizywsZ[x|xhjwhpx|zstvvwaCQlujYhmoumiruWs~reSq\cmxzjedxlP;K`_cTJXxmnuKXl\Vdssf_ztyy[Ol~mk|z}ss~i]v|}Wrrgxzxt[Xsy|wgixdrz|wq}ussr]BPhqhXflntkjvuXt|weZt^dlwxjhh}mR=M^]`QK^yjpsLZn_]k{ri`}uwsVRm||il{xxqv~basy~Yymhu}zzoVZqrwmbnnh|r~xi|wprtxkQ?Vin`ZkkqqilyjY}{Zkq_hnzrllrfK@UZ]YLTowfzeMhn`ivitomz{xxxeM]s|tfsvxzpq{sWr{rdh{govz{~}bRdnppaf{axvzz}yk|xrp{zm[AKclgXdkkqghtrVnukcycgmyxopppUAO[[]OQi{jvsOaqcfrlk{izwxjQXpywgovtynnxuXg|m~qc~klq}y|~iS^jjmad}|cqyzwt}j|qnwxk[BJajgXahgmdeqoTh}prh~jjnyyrtuuZDPYY[OTmziwtQbtgjugg{m{ywgOZqyugputwllvpTiwklh}kmp|}x}gR^ffh^gycsy|qp{o~~smvuhXAKaifY`fei`cpjQexlylqmoy{txxy_HPYX[PVo|lwzV`ullvfbm}yvhQWnvvhmtqujitqUawh{eployy}~lTXdcg^ayzgk{yrgj{unpth\FE\eh\\eag`^lmTXvkwl}qpu~xz|nSLXW[USi}sofXsuoxq^pm|zyxmZPfsxnhroqmeou`Sqnjhv~mmp}z{|aR]_baZkv|avy~fmqux|rlsmaQ?N`fbWacce\bndNftgtxsr|~y~iPRYWZS[t}nw_`yvvkaxpyzshUUksvkiqlpifrrYYtinh{|onq|y|y_S^]`^[o|uv`wz{dnkxtzoiph\M?P`eaXabbc[doaPishļw{ur|{jRSYVZS\t|mw_azwxocyn~xy}qgTRhrujhqlnifssZWtljkxrmnyx{}dSZY[\Xk{q|_p}ijlmuy|ndifZN>J]ccX^b`d]cqiScxi{¸swsx|tZRYUYUXq}oqh]x~|wetlywsyoeUPeoslfolmjdpu_Vqnfnusmlxxz~fRXXXZVg}zn|^l~jg|ikru|madaVK>J\bbX^a_c]erhTeyjzżvzsy}u[UYTXU\t|msh_{vgwmxtqujaRRgosjgnilgftsZYtkhj{smmxw|y`QXTWVWn}rnr\s~ydk~}atj}ug_d\RF=Q^c_Xa_ab]kr`Toui{u~mWYWVYVi}wl~}_jmjtx|osod\N\lqqfjmusi|]^ygYaggpvzfQTY[dexkO[j}mn|}ylbR\mssbZZhxjisiUfzitcH|nCET^nws]\cckkz{clvyd_xprtwokalm[Wd~zhR`zovsfW}xiinluzpZW^^gj}ujbdfbkjdRRypk|pqrhbV^osqa^afwzw]i~nvp{XNz|vrkpt}kUTYY`bs}s~xysvykRJMXujmu]b~}ztwoprvngxXMmtslprpx|lVUXW_avy~xxcdzuvwyql`iy}|nlop}vo_nRElybG@B?FGXrshvjbzvh]kuxea}swvxoj\_nok[TWYkxvyyu}y_{tlqnuvr|}{~zwybSqo\u{o`[_WTJK^df[SVS]er~cb{siivjH_xzcTXV[`ixw}w}uh]hkh\LNO[ov|xmpow}fmsLOjonjrrs{|hTWVX_c|su{ruxcnvytwvokbm|~pppq|zl`oSDg|mRHHCIK\tsgrn]s|~seZgs~whaoxqumi^\kml`UYYguzu~cpnpnptzmo|xzz}v~r[h}dh~xj[][UQIVbfcVWWZfmr`qlsnhx[Opx`Y[X_ctvvx}}rk]VacaVNUYj~yynqpxvcnrNUovslrru~lYZXY`f}zoi{|yuygnzuutunmckz~tswx}zfYmbNmy_PPJMQ[twjnu[iwy|n^bnxxj^zozmpid[TaghbX`eqxy|mopnljor{h]mou|}vbgnf|~s`]]VTKSaef[[`anuycnuo~|kcxiVth]_Z`ftsw|~vrrg`TMZ\^XT_fw}yorpx}o`qqP\u{umsrw~kZ\Y[aj{yegwxwxsi{ztmhbluzvimnpypbt|ccvthmns~sep}^[wuz}qqxfOLZe}usgqxub\wynqnngd\fty|stwx}~xrTU_gywysd~}uph]bfxvwgywn{yb[y{qnrmnhp~}qwtewvprrxxzgkhn|}fYPZkf^k}l[o{~qdmwzjco{rtnmgk|~{~{xyu\jywtnx~sqrZp~{}}rqtmps{~ziYTiyie[YQWgmqifhdmuxbhyj[nzystq|sroYo{y|x}|vngnwswwv|i{shuvlx|nq{eTfryl_arWBXineflluxui[]b^eiwzr{iz}odnx~qaXh|zqpio||vv}qhy{}wzy|pf_fuxzx_jtyyh[OYguz{rbV]x~rsmmgl}||u|nqu_kv|urvXg{{xrnutz|koxzp]RWvpgdquyskkcfnwxabut^esv~}~yqurwvp}Z_u{rxwzpe`lpwsqufgv~ql~vjvz`Zjp}ymaksPF\jjaeilvzreX\__inwtvk|vg_ku}n_Wl~vslt}ws~sft{uxsxx|rh_crwglv{|i\NTan|xysbY\}vuuonkk{~xzlizzbcrxyr`^tw}|pvwy~kclr}|trbWUqxsjq{}~splgnti[hwh\kt{}~trus|{rvpWhyuptrx{zqgist}~ovsdivyps~g`mqYXjuzogrwUK`npdfikuyuk`cdclqvszjxwh\elx}vvk`_sxwqu|pvp|dj{ylmilptzsoo{|njv{qcSR]fuutrd]_||xuqonkx|zi_mvb^q|{uj^ryz|~yz{y|ziZ_cmqklc\_v{xoq}~zutmsylYasm[fs|vpsqw}ztuxZcuwmolrw}ztr{y~~ttuefq{xsy~~}smy{~xnbcafmq~~}vpodd{~up`X^dvtdfx~g`r~ultwxzu}zsnhg`lw}|~}{{ty~}r`_abkpz~}|y|nsx|t|zpchn}so~zgs~wmwsmuulkfigp|v}ryslnktw|spws]mzywknr|w{mhj~~yk[Whq{vjjefbgw}|rzrwwmoksx|x{tU_u}spsjmq{xo{lr~wjoz{x~ynsljpt}xui_a^dioyuxtkim~oS\p~ytyy~sosnrv{r}oq{rjbmzpktzxstqty~zss~hJUk~|legaehqxi`l~t]cnxocW^hvxkgrzystps|zszww{{uxtz}{z{bm~tuzxh`Zhxumst{licd`crw~{wxrxtenmqx}{uxtz}wsvpRYl}|{tmrov|}t~rtvhmx~z|zyvmqzw~{rjlgjmqzvwsigj{oQUhxvotv}phnls|t|rnx~pfZ`o~yqsyxwuw{|us}wSL]qzw{kkiiruveiyj^ho}rgYT_hy~}}ohi}zvvq{~xt}uuzwxzx~{{rbp}}ruyrd[Uetyt}xrnhhchuy|yyrynbmlpv{~~wuyv{~usvqRXk{|zxptqxvxt}vhis~}z}wzxqq{t{~ynpmlpqyyvvlikxz[Paszqsuzwknpq|vwmrwvj`Zgs~rwzyu{tvtqvtz}yy~y\cwtjkfkt|zr~zu|qdTORVjxzrc`eziixqqopsrp_xianv~ypuz~jq~ysqlu|zzz}~mktmihq||}uwyyzvwy}~l[bv}mmuy|yrmwyted~{tuwoacen{|qsnp{z~r|wg`ho~|y~zoicvxjj}~|ooqnss{r]hy}z}xmnllgXc~o`UHNWdqqvqjmxouvtw{{eYf~wzxmhrwb`puwwwigcj{uv|seajrxtw}yrllybcttkrvzpz}xvYQbwxxz}|v~uw~rcX\`lqqwuv~}~qll}}b^nymmqpwx}}w^etvrx|qt~~}kXLAHVhvvyslnzrz}{ttt{~sjuxy}|spwuwwwzxvVZn{~}}vvpwztzllr{~uighs}bS[ouggmqxsnfbigknqwruwu}fdq|twxyyrv}ock{u}xjYX_hvvzysw~~wvxpywmngdcdnq|nfp}zpqpx~sjibelqtgcryv}pfXX`jxy|{swvw|{vtswrdn{y}~|ulisv}on}{zsyqfn|~pv}n\Y]eolmh_ak}luyvnmjnoblsrv{~vpsoppquptx|nlx{|{y~ys~~xihmuztkigmiX_s|qostyrkc]cbfjmuqsts}c^jyzrvyxxqt{pgqts{l\Ybm|}~|tv{|~~wvlpmmnmrnnstumx|}sijehqv|nen}qhowypb]ciuvwwos{|x}vqnky~gjzvyzzumrtuzz{}zs{}xtacozqhum_acmqnphgn}vjt{tpklju~fcrwyzytihkgjjptrxynp}~~yxry~svuhjpz|wy{xqpmqrdl|qmnnrkf^Zcekorxssrpze`l}{~~}turvuiq~upywg`diuuuunqz~|rt}zmmlhiglljqr}sx}|urpksvztcgu|lou~pcVY]hqqwuu}w{|xqqovmdp}~}xpkrqux{rmw~}uuz{{j_hwuq|whafkvvtsklsrku|xuqrozijxxxw{|upffigjinqouv}mq{|w~ss~|zlkow~ywv~vrkjkoxfkzxppouqkd\bbbffmlmstnaiz}yxtqxyzm^fvyyj`dgsxvztu~v~tr}vob^a]abiqqz}tttnmgnswvfguwtw~qh[[`hsrusovqq}~|vvwzvhpwwv|yuqlssuxywmvzzutyxxh\fwy|lbefpqnoimvwow~yvsusxbdswyx}}vpdegdggnqrz|mp~}y~ouznbfjv~}|zps}|sqmqr}okw{wssuni`^caefkqnstwz__l~xxqvzzuccqzz}tgfjqzxzxu|yz{qz~{y|und]a^_`bkiov{{w{stnqwxvean}upszwm_]ahsrtspwsqzywqqrvxks{zy~zungnmoqs{z}woyyxpptrp_Yfy|z}nhjmvutsnt|pks{zwwxxrdl}xvrwrle]bbcgiqpsx{ypx||xzvq~xkfkozyyxsyrnvzxrqrs}nuwtpuplf`ggiklsoprr}jcl~yzux}}zico~ytxyjfimvtuur{|{xlu}{y}wpf_caabcigjns{v{{uw|{xieqxppttk^[_eqqsurzuqy~|wuttznv}y}ytnhnoptu|yy{{tlt{ztsxvsc\hvunqwupsv~|zzuzvpw~zwvs}wgn~zwswtnh`eeeggmkjmn{{r{||umwyy{}phknwxvxtyxmq}zvrnolwvx|uwvni`cfdhhmnkooxwfix|zxsyywm_futtvwklnuzvyvxuxqo{{usumg][`^abfjgkntwxzztx||whjxxrpuum`_ciqoqpowqpy~yxuv{ox~yuzwrmhopquv|yxzzwmt{{vtywsd\guypquxoqrzzwzv{sx{{w~yfiv|ysuvojabfcffjminpxqs}{mr{yzrffipwuwvu}nltwvrrpsw}xztogbhghklqnnpq|lcl~|{vuzyug_jy~ssutlnqyzxzw{uz~oo{zrpqicZY][]^afdinwzzy{~{ufft|usvwpd`dhqoprpxrlr{zwvwwpw}vywpkdikkoovwv{|}mpyvrmrqncXbsyy{{qqsz}y{xzpr|~~{jht~xqoqjf^\badeinlqu|ur|||nn}|}{sgcfjqoopov~mgmz~xxuuvxt{}vxuojchihkkqpotvseiy}|xuzxtg^iyzzz}rikmuwuyx}ux}jly~yponfaXX\Z]^chgotvw{|sekz|wty}rk`adkrorrt}mlt{|xyx}ws~{wysogekjlnpvrvy~okt~wvoprnhZ[jz|xx|vsux||}|xrx}|qhr|uoqlf`Z`_`bcjilrxzrz~~zliw~|{|uidfiqoopov~ldhu{uvtuvwxxzuoibghhkkrpqvxrgl}zzutxuqc_m|zyy}rlnpxwvyx{rwvhp}ztkkha\UZ[[^_ffhotu{|nhuzvt}xqgacfnnnqqytko|~|{zy~rz~wyvqkfklloousswysinyysruql]Zhw{tstwrux~~~vz}rhr~xprmhb\baaccjhiosvnu{mjw|wt~ysidfiqpprrznfiu|xyvuus}{}}ysmfklkmlrposuqgl|~~yw{wrd^ky~urp{~uoqs{{y}|~twykq~~wmmjc]VY[Z]\bcbimz}rx}qhs{wry{uldfgoqotszykku~~~{{w~vzzxwpmegkimlqspuw}jju{xvpsrmdX`o}vrou~tux}yw}nlw}tnpie_\bacdfkgkouqoxykm{{ut}vqfcehomnppzleiv|xzwwvt{~{uoinnmontrquwsgjy|x|xrf^jwwtpw|umpqx{y}}uu~|jlxzokjc_WW[Y\\_daglvrr~xkn|{tt}~uqfegkrpruwpjn{}||zy~vxytojdijjllqpotwsgkzyxtpsoj^Wcqvspy|uwy{~wosnkoqwsx|{xu~~~vpwqts|~yy|{{xvvuqv|vsuxwzuxt}{ynlmhopsux}z~~{~srpokoxuz~}~uvvnxyywsyrs~~{|yy|{zvwzwkrypt|}zvvqphlntz~{}|ssolriegmuz}~}~xtpwzvsqpskonty||vv}wnpuqpu{zzz~}}ry|xwz{rmprspkmkdbhot{|y|~tz{qrsz|{tmplrv}z|}{yuw}vrsqwft~yyyywx~}~|}s|nnw}}uninqrtrwzz~|w|vtspvy~wvssxxwpn~x}}}|ukjz}vsqpnv|}}|rpqtz~zwu{xu}{tqxwqjmssyy{z~|qvnijtv}usrqoyxuzvywvvvv}lwvlzuxuw}|}}}yv|zymokh|}rs{tnklqnx|~|xz|{sw~{|~||xpq|x{tutsx~vzz|xwpnv~y~yz{z}}{~{xwwmsvuxtqpwz}yrv}mvrpnluy{xttrrwqq~x|x|vv{yuorw}{o}utqrzz|x}~y{|v{rz|t|{xyztnnwptyxz{wx~wvvommzvqnvstxq~~~|tv~~{uw{z{uu|y|zxxy}|~wyqngpzzwxruzsrl}yuyxqvtv{vuy}|vqxxows~xrw{zxz{|}urkusy}y}xu{tv~}~{}sqywuq|{prtu}}w|yqrtq{yyy|zusvov|w~z{{}~yy{tpotx|w}~w{yrt|ytyv{}uyoz}sw~}~~z{s{v{{{vnsmpqrvq|tnzrtwsx}y~{sptz}{~}zrxzttuv{}|{|}tsliinp|}|yszxqt}}x}{ulhz~{}z~xowwrur~xpq|zuvz{~yz}w~~w{xqty||u|xnjkoypt~{ww{tqoqpqom}v}}~pz||xw}~yrnppkrz~yrpy||~~}vutu}~zx|}|smsurrwz~{|~y|~msrcedpzy{|{~wytvtxvuwwvogxw{z||}}wxyw|xz{vt{~~}wuriifimv}{tvy}y}w}zltstts|zxxx|zw|tzpoomtpqy}~}zy~}{wtvvxvuw~ssqqqiowztz{{~y{uloltupzx|x{zytwxz{xyuvypgkwxuzz{}z}z{zvozu~zz~tmmmmklx~z}|{|~zuqoklprr}z{uvs}}vwxxtroptrw|~y{vz{sqw}~||~|rptfjfmyx~|}y{}qrtrkkty~{{~wutw}x}qsrorlwx~{~|w|ysxt~|~~y|yy|~w{xljlpxvxz~~{uvxtpszzy|yr~|z|}{sjjojnrz~wz~|yy{sx}y}{xzqlglxrs{~}}~|~~|wwxkjlvyy~|swzyv~}yuvwwmnzt|{|yxzz{}ty~{y~{yrrhmklokt}}}wtmqzwxw}}{|zvxytslpsvxvuyz|~xwuvsu~}yt}|rvttqklsvz}tnnnxnv|y~ywzwzz}z|vwqigozxwz}xyv}y{z{z{{||zyvkmtpqlqxww{zzzytstssss~zyvzy}~{|~xurqqojxx}|||ywuz|wz}~}}~~wlohhnkutv~}|voy{xppwwyyz{z|{{~{nsjwwpz}z~{~}zuqruyryy}z|~|xxwsoononr|zwwwrsss{~w|~zxx}x}~vojmsomorz~~}uwry}{~~|~ty~|njklmmmlv}}{vzolunwyru||z|~}tmjiil|y||ursxvr~{v{x}}{}qlhghqtruvzwt|prwsotw~}wzstuy|zoqsrtwrqvz||~|urxwystww||{|t}~{ywtlixow}~|~rxsuqm}vw{|~{|wx}tmpmksrmry|~}|{prx~{~ysosw~{xrkjgilqrv~~yvjuvpqsyvwrsy~|~uvvqoouzyy~z||truyxu|u}zx~{~||wpkanpjxn{}yv{rtuwy}~|}}wqefgjswxw~~yytrruz~{x}vvvy{v~vvpknsrjnoy{xw|luxqprz}xz|zz}z|yqidltwtvs{|{zsosvz}y{}|{}zqlgsjlu}|wquwtv}zuz}to|{|vxtvvpiiz~}~~yttw}~~wrvvw{~z|{wsphjlinnt}}w{umqy}~zwww{|zxxqmjqtsxzz}~z~|xutts{{ttnw}~|uhpsjogo}z|y}~vruxu}~~y}{x~y}yxutrilssvu|}v{zwsrz~yx{~~{x{|ztrspilmjvvt||{xpnopxz|~qx{}yknwvrlouy~}}vpovr{~}|wx~~~zwthpnelnqmv~~}{tqrzuv~{~}{||rmhn|{yvw{z~tspxux|}}{wvulvpmohmyxz||wqxy}}~||~~|yw||xyvqokmrw|zx~}{|x}tm||wqu}xprskljluvxuz|}|{ytzsjmtvwz{}|wrsrwy|z}xx|{}{~y}}x}}|{z~|~{tlqsijolltpt|pvxz{}{zyv{wxypkvynktvz~}uxiefltw|}}zvny~zwy{|ukstmnuvuyz~{~||z}~wx|wmx}vvvzzy}xy}zrxzqr~~|zx|sruxyz{yytv}sz|pwyv||y|yz|t|yw{yy{xpz~w{vsvuilqkiu}~}yz}wxrhnsutw}w|{}{srlktllstyyv~wywv~{x~zx~ypoqimssy}zz|zyv}}zx~}|~|~w{~}ttppypkniky~kipokpoinskw}|~wolprinqos~~|{}||v{wwupvz|x}~}zxy}|{yz~}~plopt{{zy}x|~|uz|v~~~zvvpo{xsrvtu~|oswtu|zw~~v}|wqtwqolnu}|{qpqqvxz{vsyzvt~y|}|rlroipu||~wt|zwy~w~}v}u}~|rwxw}|{y}psssyzrutnn}{vmswsrldeojlqx|}zuwwzwmsvusyxz|~~zzypv{{wv|z|}xvvvy|u|{~x|onrtxy~}y{~ytz}w{}zxxto|t|sxutx{uy|z|zvv~zvxyz|toywvonx}}{zxxxqttu}z~~wvv~r~{tmmslkou}~w~|x{vy}w~|yz{{~|ruwuyzzssrsu|vtuqjxz~suyzzrjfmokov|y}{~xyw||ptxvsrut~~~|w}pz{}y~vszy|}{{ttvuxsu|yytopru}~zz{w|~~xw~zy~~|zywoq}uwwxzwyz{}~xvx~wuwyyyov{wwosy~vvt|vutvw|}}tz}y{u|}|}smmrkjpv|{}xyvz|y{w{|z}zpuuvz{|}~tqnpqyvrspjv{ww{~wojmqmnv|x|z|{zw{ttzvuqss{~~w|syzy}yqxxz~{xy{squvvvt|zw{sqptw}~w}z{~y{zz}}{|z}~xxvov~vv{zz}|~~ywx}vuyzyvqz{yysux~vuvyvsvw{}}u{}{|w~}||rlkojiqx}}zxwz|z~||zx}zzzosvv}{|{~~tpjllqupqsot}x{}~tplrpnu|zz|yzww~{szyxvtwz}{xzs}}z}uuzx~yvswsosyyyxzz|wtpsu{|}zz{x}|x}{x~zzy~{vxx{|~yyzvu|{y|y~}{yw|yuy|zvrv|yyxsux~}wz~{xsuv{{|}xxywy{||rlhmjir|}yz{}z~~|{|v~{xzqrww}{}~yz|zqlgijprnstsy}y|}|uqotpqy~{|{yyvw~zv|yzxw{~~zzxw~{{|twyy~}~~{wssvprw{{x}{}{vrptv~|{~|y~}y{~}y{|x~yxx{|tuuwz{yy{wv}{z~|~}|x|zvz}}wsx|zwztsv~x{~{ysuvzz||yzyxwzy~zsninjlu}{}|}z}}|{{v~zxzrtwx{}{||y{}uojgijqnnsrt}|}}zwqttqy}~}{{xvzxz|xzwz|}}z~t~z}xuzx~{~{}xurvqpvy{vy~xuptt{|y}{z}z|x|z~x}~~zxyy}tstuyy~zwyutx{~{}}w|~zty||w{yrtz~~y{~}{uuwyz{}z{|x}wyx{|tqjnlktz}~z}||{t~~wzvqwv}{{}{y|y{{{pmgihmplqqrw}|}{wtxtv~~{~|xw|x|zyzx|}}||}u~z~wuyxz}z~{xtrvorwyzuzxuqtt{{x}zz~y{x~|{~x~}}~}{ywyw|trssww}yuxtux|}}}x||uz|}xy|ssw~|{{xuxw~|z~z{{{yzuxv{vrmlokrz~{}~}{|zv~{x{stwx}y}|}xx{|y{y~unjfhhonlrqv}}~}xwzuz~{{xw}y}{z{z~~||}v{~wuyx~}x|x|zwtrvpsy{|w}yvrutz{w|zy~x~v|}{z||{~|~}xxuwuxwoqpuuz|vyxw{|}|zxw||{v|wrt{~}{vww{~x||zzx}~svtvwsplpnp{{}}z{~~s|yzxrxy~}zy~~~yzuw}}{wywzznkfgglqmruw~}~~|w{xx~{yxz{|{}|~||u|}ztxw{~vzwyzwvsxtt{}z}zxsttx{uzyy~wuz~}~{z|~{y|z{{vvtvswunpptu{|v{yy}~{}~vy||yw|usu}}zwxw}|x}z|z~x~wqurvusoosow|}~zz{wv||y|tvz{|}w}}~x{|uux~}zwwxw{qlhghjqnpvv}~z}{y{zxy|{|}}{}v~~|tyy{~}uywxzxwtxuu|}~z}{xtutyzuyxzw}uy~|~|z}~zx}~x{xuttusxsopqtu|xvyvy~~|{x}|}wz{ttw}yyxzy{}{{y{|qtrtvsqnsqs}}~~~{y{{s{~~z|wtyz}~x{}}zx}vtu}}~zxwyw{umjghhonmssy}~{}}zx~~y~|{||~x|~vxzz{{{|~|}{}{~yzxyz~{x~~{~~{|}|~~|{ws}~}|||}wyyrxw{}zz|{|zzvr|xu~~~xxtz}x{~{z|xzzw}|}|zw}wxxvts{uxywzzzv}w}w~~}|x}{uxsv}}z~~zv}{y~uy}}zx~wt||}x}wry~w~|ywtqrzuxyvxxxz}xw}ws}zu~wyxvrsqos}}{y~{~tx}zzy|zxx|{rw|{zq|}{}{|yv{|xss{w{~z{|y{yw}}wy~zszyzxuywuw~|y~|vxnpvrqx}v~|z||uw}}{t~}}u~yrvrmksqs{xy|}}~y}}}}~~ylz|u}|v}}zy~}x{sqyxtwz|{ytywz|y|sqx~}zu}x}tyyrmstrzzx{~zu{ysu~{~~|oxtz~xouxts{~}}~y|vs{{wz~}v{z||~vpw|{vpv~y|||~vw||uqvxu}~{~}y}|vw}{s{x|sy{wv~zzzztwqmturu}|}|x}}}yqz~~wry{}}~w~zqvwplqtq{}{|~y{{}|yo|}vw}}yz|||{wzrqwvuy{}z{swux~zy}roy}}ws}}{{szwqotus}{zzx{vtx~|wqyw~xrywtx|}~z{{tuzxy}zv{x}{|}nqy}xqq|zx|{z}~{|yv}wssyvy}|||vw|{}uzwwx|vw}zzzyuxrortsw}~|x{|z}zpy|wqy||~|~z||quwporvs}{~~{x|}}{yvrzyy{x}z||yzyrsvux}~~~}ztxty{x{}{nrz~{tv~~~wuztrrxvy{{ywsv|~|}xr|~uvxytw~y|}{{|vtwxy~}v{xx~y{~roy{}sq{|zzzy}}}{}~u{yuuy{y|zvw{~}|wxx~|xyxrn{z|~w|yzzvz}xyvw{~w~}}v|v~wxzyyv~~||||{v~{}vvvy{|}yuv~zw{}y|}{zxz~zxxptxy|{yu{~uov~|}zzzxty~yvtrz{~~y|x~{vwxy{xusovzu~{}xqntxxrnv~~wqtrwx~z|xvy}~~~qqx~|yvy~z}|~{{z{~|zurp~{}|z}vswsqtnhpykozqu{x|vxvwz~xy}{zxvwvwy~zx|t|umy}|~~|v}|mw}q~z|{ytqtsposvssqsw|{y|}~{tsty{zxx~yu{{v{y~z~yyuu{w{yv~{|}}xyzsxrw||}}|wvoqzqrrhv}{yw~~y|}ssuw{yv|~}z|{~xst|~uxvy|yx}{|x|syoo~}v~x|{rw}vmrntss~~{u||~xx~u~vxstuw{}}yy{usz|~|}~xyttvv}}|{zquvixso{prouwyzyutspvzzy~|t{|}yrs}|{{wq~|{t{~{{}{uw~rwywwx||{|{xwuqyqtqktz{}xwzx~~}utq}v~vzv{~{yuxyy|yx|{{|}z|~xyqp|z~~~~ss}tvmozuwpw{~}z|vzxrw~xx}s~yvy}}{|w~ysspu||x|}}}{z{p~zvwy~zxytyruutqzv|~|v{xqzr{u|wwwzt}}|w}}||tz~}{v~|x}{zy{vvww~|}uturwpmnqsz}}xz|y{sp|y}xv{|wty~x~~|}{t}y~~}}~}{y~yz|yupltv}xzx{mp{w}{yur~|~|xpxzwyx|zx}}~vv}{z||}{~~|}}x|zv{~z|v~{||}yw}|xwunvss}w|v||x~wvqsxyvp|~vy}~yz}w{{~|pfz}y|yw~{y}||~xwuzz{wxyxsxyu}y}z|{|y~|zu|{wp}~~~v||teq}}~vy{z|uttry{zy{tx{}|zz}|rwx{z~~x||~|{|{wytwxv}z|x{{x{{qrvrjy}~wz||woswrsuqpqluz{}zzz}vuyx}~z}{v}}{}w}u{|}vyww~{x|{~}}vjjsrl~yzzxtvumssnmolryz|~w}|zxssw|}{zu}{{txzw}vzyw~xx~}z}{~xkgpsl{zywyrssqwsmnqmqwu|y{yxurt~~z{w~~||vz|y}zu{zxxw~{x~z||ohpsl|}}y}{{yttvuwtoptqqttz}z{{zsv{}||~~~x{|~}zy}}|ytxzx}{v{y{}~~tjqvov|}~xzwsuuttopuurstwz}{qsx}|~{|{y{{|~{|}yt~|~ztxzx{}xzz}~~}tlrxnuz||x}~trutstoquwtuux~w~{xrtz~{|~{|{y|{||~yz|xt}{vyzwzy|x|~~zrktxox}x~}{|{utvtvtoptvuvxy{v~|zsux|~||~x}|}}~{}~xt}yy~xz|zz{xwwyvowry|{~}}uozxq}ww~xy}yxz{z{{|yz}}vrv|}}|{zv{y}}}}wwxtv|yz{|~{|xy|x~|}op~zxux|~~{y||xwvz{}}yz|~~{yx|w~um}xysnuvuxzxsv}~|v|xx~{~~}~rwxqw|yyx}}~{z|~}}~|y{~yx{sp~}v}}owywtkmtt{{~~{vwyux~~{v}~{wxpxynpwurw|}xxxy}yu}~z~z}zyz}t|v}}}}us{}w~~sv~}xrtzw{~~w{{vx|{}yxzy|~ztxy}{zzyovou}}|}xwvr}z~yx}~|zxrssyyxzuumkunswvr}{uuuyrijp~x|z}x~~}swq~w{zxyxw|}yx~{w}z~|snu~}vw}xrxv~qksnfsxtxur|y|{|{~{zyrjosv~wvx~vs|{~y}y~~}~xonqot{wzwz{lgrqwqx{{}{|xsxx}vx~}~xuxuzyw~|x}~xtvzzzvy{|}}{y}}y~{}stnxojhggpy}yrx}svzvxx{{{y||wliy~{~|z|tz}zy}|}r}}~~z}{{vpzqu|~~wotromcn~{~}w|rzpsplorvx~z~|}{~yywy~|~~|u}~~nswyyvzx}wx~zwnlhnjjwnsv}{~|x~{~{yrv~|{vwwvy~}}yxty}yuz~|}~zxy|y~~|~~}~x|qvkkqzvv|wpxxx|}~~xuw~xyurvtzw{ty~{t}}{|yq~}|z{|}wwvssvxwy~wvqxvmtpfp|z~}||~z~{}}~w}wzzq|{~}t}~t{x|~{y|uxzt{z{{y~ysnx{}zvvxojkhlirqosy~x~~{~v||}rq}{z{{uv|szx|yw|z~~~|xxtpspujqz|~{{vzvwqstqx~vzxr{{vtqsyoswozuxvy||~{y{z}}}}wr~~u~{spxyrz}vyspln{{x{trouwswsy~||~~xzvsuzwxzyx{}zz~zyxutw|z{~}|yywnpuw}wxuwwt~y|{{voy}{v|{~z{|v||sqoq{yywy}v~{~vy~{|z~~|~{tyunoppkssx|~vtyryuiyuy}up~|}z~zqssv{ww|~}|}wyy|{v}~|zv~~{~{~|}tutsxvwwx}vrx|rooyxqwrtqvyuz|z}~yy{zyury}~{xy}|z~|x{w~~zw~|us}~ztv|plomty{yyzt{usts{yzywzuy|~}xz}wor|vvy|~vv}{y}}z~}}|s~||{tu~~~{|svplzzzyywuyv{ynuqu{zwtw{|zy}ytussr|w{x}}z{w|~|}z~z~{rmxxsvyxz{{xz}{utqoy|}tvwyunoqqr{|zzw|{|zz}zs~}}~~|~|{vurxymsvqu{~~|xtsyvqx~}}yqz}z{}xnnq}{|~uxy}|x{~}}{{~|zzyy~{z~zzy}~u|~xvyxsvysw|~|ts|xos|{x{~~{{{y|}~|~xv||wvuuyx{|{}w|{z|}zwz{~{z}}ywy}xy|{vromzus|xqsw}}|~}}}{}~}zwxtvz{|v}}}~|}xy}y|~|{~{}xuv}~xtqrtw~zwqptqty}~vzyz}xz}}yz}|{rvyrn~z{x{~~~x}|w|}|{{}~~{}w||wxvxvuv{zuw~yqnrs~|ywt}w{~~zyvzyttvruzz{}z{xz||z{{x{}{{yy}xvxzvpr}yz}vxy~zvyyyy}zx~xz~~~|zwutns~||}}xz~xxzz{~zwtvssy}~ytsyuqr{~{}}{y}yx}yu~}~~~}zzw||yxvrpy}{|~}~~x~~ztux|~xsz~|{|~{y}~yyttutuw}}}}{~~zvyzxuy}wz|xyvsvxy{~~}}}~|}||~|~}~}~}{~{~z~vv{~zxsoqw}y{zuuz}|vw||{zy|y|~~~ztstoorxy|xuz{}~|{~}|zxwvsxxzwv{{ywwrtvvx{}|}zxtw|}{{~|tt|{xrvvtwy~}|w}~~|z~zx~~}{yyxzzyzz~~}zxvquyzzw~}|~~~zwxz~}~}}{|w{rqrw{~}zx{|y~}~xz{{zx|{}xvuvww~~~wuzwnn}{yz}zwy{{~}~{~zuwtppqsx~||~{|~~~}{~|zu{{{~~}|}yvyut{{~}xvv|~{uvxvx{zwuxxy{}|||}zxywxyvstwtz~}|~~~}z{}|usy~wz|xw||}zxqqrpw~{x|{x|x{~zzz~}zvrqqusw}{{}{}xz{}w}xzzy{wwvwvw{x|}{xtptzy{~}|zwv~}yz~}}~|y|vsqont~}z||~}}wyz}{|y{||{|yw|xxyz|{wwuuxzyz~|}~}zwxyvz{}vttyzuqv|xtx|}|y{}~|{~~y}|w~}|wqsux~zuvvvw{|z{wz~|}z|}}|zz{~}|yxxwvsrquusz|~~~~~|yvz~~}z}}xtrqvxwyyywxvt|}wxztvw}~}|{|y{|~}}}z|zuvtsswyz~~~}yyyx{}~}}|yxxww}|vst|yx~zusuwy~~~}{{zuvz~|{~~}vpooty~~~~y{z}~|zw}||yz{yqp}}xwy||~xvxvuvxw{}}}}~xw~~{~|}|vuwyuywtuz~~y~~}{|zvvvut~~~zovsxy}|{~{zyrsuwr||vrw~rput{~~~}wmvvruy}swsv}~~~}{ywp{~xxy{usnoqoxx{utuvvytowxuy~yy}yupty{}}}~uypszskjp~xvsuz{wuxyyz~~x}~z~{~{|yvpvwtx|~{~u{tz~yxsz|}{yvvoz~vz|popxzqphrpqtw}yxz{vru~}}wzt~|zopw~|~}|~xz|{zvvttuy}|{}z{yn{{|wzuqlkmou|~usy{|wzx}wwvx}z}z}uuulsqqs{|{}xz~{~~}xyuwtttsqqw~|trinpkmsqpw|x|z~~z{~}|vz{yztwy~xxxvvyss}y|~~zy~wvxqy~z{yxniq{yvuuny||~{~|yy~|}tvytz{{{}z~|wzxy|~~~z}xnv~~|||rvxu||zszr{yz~ytrsqioijir|vqwun|}x|z~yz|{}|{xwt{ssqnoy}z}}~|{}|~x~}}~wru{zqprjeqw|pvuy}z|wvv~{z{|ywwz}}zxy~~~}{w~wvwpzy}~yxwvx~}vxzvlhwv{uswu}}{y|y}t{}~~z}}~qx}}~xz|~{}x|{rqluuuxr{||x}rs||z~y}{~twtqrjokiiozvuxp||~~~|y}}~y}zx~}~{yx}z~pr{|}|}yzw}||zwvrtksy}~{zwyotynqjjv{~vxwt|y{~x{{}wwwz}{}~}|uvyt{wpz~{xy}}ty|vyzx}~~~zywv}womgilkojrs}x{x~z~yy|}{}xx~z}wuz}rtsrvtzwz|}~~~wlixuuyz}z}{~{}~nsps|{}x~}~{~yxxv~zzvoxwuzr{zz~}r{|s||xzw|ytsmnvnsuw}~|~vwvtwztu{|{wz}w}|}wtnxuxy}}yz}zv{zs~~sw{z|}xyzuppvlvz}z}~xvznpyvszz}}x|}v}~~ty~ytwpp{w{}||{w|zzuzy{vy~z}u{woqnrt{}~{~xuzppuyuyw~~uz~sz||yt|sutrpxsxxy|~{zwuw~u~z||wz|wolooqu~}wwuqpy||zw~{uw~y|~x{o|xvttrtxv}~~v|{w~{y~tw{|z~snoqqtwx}{~zxpqsvwwtxuw~x{v~~vp~utwyvvuw|zz~~uyzs{~r|{||ytqkjpwu}~~xsvqtosyw~~~}uqyxs|wsosrtt{zyz|w~{v{{nz~}{xwzxtmjlqxv~w}trtu{tvuz|w}{ws{vw~zqontzx}{|{|u}z{||v}|{}|z{wqljipx{~torsvssv}|y}~{~xt}~pu|{wvuwwt|{|{{{v~x|}t{}{wzyy{qmijqsw~~ytttwrrx{zw}{}}|wty|yu}zysuxxz{|{yy{{w~ryz{~sy~}w}tpjmpsv{||}stqxupwz|vu||}|||s|}|r|}vswz{y~{z~xv}xzzz~w|}v~qrhkqv{}}|~z}qvqvwsx~~wtz~}}r|zzyo{}vux{{z|zy|zzz|~xyz}}v|~svtiiquy}~~|~vwpuwtw}yx|~}}}~}yyqyy~yn~vw{~~}{~{yz{|w~y~|~}ywxy{u}vr{vvqyxzuvxy|{rr|yz~~}{vqmqz}r{~vyzv}yzx~z{vuny{utxu}}ty~{rqkkmnl{~{wsruy|uwz{z{yz{}rztuzvywwzzw|~~w{y~zy{~~~~z~wryz~~~zwqus~|z|~wwvvwxwwzvqwzz|~mkxy{~{vwtyy~xo{~}~zqqw}yuuwz|xxysuolux}|x}~}wzv~}~}uxpywklttw}}xvvvuv~|x~y~|v~x~}||z{zvu}yv{zouzwnsmz}z~||~vzyyx||y~{~ss|wpw|yv~z~{yuuxu{}|{||xrtxxw}|z{~u||{|zxvrsvt{~|{{kw|z}~y}yyu~}|vswuutzvwzw~vxy}{}tpy}pzuw||xsvk{|utxvvyuoovsuy{|{~~xz~~~z{yxw|w}t|ztyx{qz}x|w}y|}}yzuur{uu}{|y~zu|w}~}{{{qq{~||y}yy~xuvvy{~x~z~{x|y~vr|}{{yuu}~z~{v~|uzy|~{}||zswxxttu|yysssynnpv~w|y}~|tmz{xwuxxoswmvvtsy||z|xy~z~~~~}ysv~y~|}ppxy|}}~~}rwutwrjw~}{{yxtvovst{z~vyvxw~x~x|s{|u}pstuurx}}ytsvwu{swy{}{~}wtryx{y}|uw|{z~ww|{y}z{}|~ppqzuzxzxvwpzz|~||z~x{|{ux}zptqwu{wmtrtnopu{|}~tnw||zyrtvr{~{{xz~yw||~{xyzvux~}|}yoy{tqwt~{tz~}}u|yy~tvst~zy{sqousuz}{{wzyzwo{{||z}|z||}|rtq}x|}y}w~uxz{|zuzy|{wrfnur|{{||~yx|}z~}|syyt}y}zuy||{{|yvy}||s{}y|~|}y}u{~x~|~zwsplmr{}x~wkkux|z}s{vv~~wvqor}s}~}||{~rrqx~|~y|{ry}}y~rt||zv|s}~ywy{x|}~zwu||y{zouzwqrtvx}~~z{||{}|vrqjotswtvrrs||{wt|vwwy{||txywtpt|}}{vwx}{zzz{y~|}xxxzont~z~w{ux}~|y}|}~||rz{x|uursuzzu~}|~~{|twrvwwuonfkpry{qpz|tw|x~~~vv|}vuuzsywqyzy~~{~xwxusurx~~~ty|~{{{{|z{}zzvz}xos||~{zsuzzyz{xt{zz{}xvtvut{qnlmuy|vqw|qqysy|}wty}}zqpu|}|y}rt}|y}z}~zxxwqyz}}wu|}~{}|{ywz|}~}}|~~}zyxx{urouz||z|v{||y}zzzsyuxqkjinnyxspw|xr}wxwzyxwwzwtvypm|{x}~~wxsvvt}w}}u{x}|}{|zvvzox}~}zvvzx|xwwvyw~ux~}{uxxuzusmosx}{xw|~xq}vost~vzvtty|xu{~rqyw|{||wrvuz}~zv}|{xss{z}}~|}}xx}w~|ttwz|xzyw{{{tw~~~ysvwvytnjosw~{vx~}wvtw|~y{zywy~yusz{qnyywy}~|xstvx}{xv}~xvzy||}|}{}wuwv{}ww{|~wwuz|~|tv{}}zuuxtxvpnqvy{|zq|~ttt{|}zzzwvv{~vttzyr}}{yz|}zwyttvx}|zx~}|{xtyz}|{}{vuwy}uuyy}~yxwzw{|uw{}~}xwxrtqomqux}y{|vxyy~}|}}yvu}}}vttx~tr}~{y~~||wvw{||~yx~~yw|{~~}||z~|wstw|w}vz||~zwvxyx{wz||||yvyvuurqsw{}{wxzsrw}|{zwyxssv}|u||z|}}{zxvy}}z}}{wuyz|~y}{|{~~|vtx~~w|~}wxz}~ywvzz~~zwz}zxzxtvuqrvy{}{xvy}|~~|zyy}~~{usv{|tv}}|y~|zxyz}wuy}yvz{{~~~}x~zz{}ytsw||vz|z{|~yxx{||z|~}}zwzzvxwtvz{{{zxtw|~}zyx|}|urrx~}vz~{y~{yyzy|~ywz}|wtvxy~}x~zz{}zvtx~~vy~}zzz|~~yxy||~|~~|y{zvvvuuy|{~||xx{~~zxw{|~}wttx~ww}}zw{|z|{}}yvx||xy{z|~~~x||y~|}~~{vtvy|vu|}{~}{|}zz|}~~~}|zz{xvvvw{}||ywuw{~~|zww{}ytrv{~{w}zz|zz|}}yyz~}yxxyz~|x}x{}|{~~~~yutxzysv}|{|||{xy|~~~}}~|xvvtvy}{~|zwy|{zxx{}|wtsx}~zx~zz}}~~{xyzzyzz{~~zyy}~|{{~~}~~{vsrwywrv}}||{|{zz|~||}|yxxxz}|~{yvy|}{zy{||wtsx~}z||}{{|~~yyy}~zwwxy|}yyz~|}|~}{|~||}~|wtrwzytu|~|}|~}z{}~~~~{yyxy|}~}|xx{}zyxy{{vtsw~~z~|z|{~|xwy}|yyyz}zw}y{~~{{{}}yz|||~~{vsrwyxst|}|~}~|}~~~~|yxy{~}~||xx|~|zxxz||yustz}{}}}zz}~{yyy~{yxy{}{zx|~|z{|{z{|}{{|{zwtrtyzwsx}~}~||~~{yxy||~{xy~~~{zxwy|}zvttx{~{~~|~}yxx|~zyyz||x}{z~}{z{~~{xyz}~|{|}}yusswyvrt{}|~~~}}|zyz|}~}{xx|~~|zyyz|}{wttv}|}|}~|}|zy{~{zyz||y|zy{yz{}|xyz|}zz{|{xtrsxzwru|}|~}~}{z{}~|xx}~~|zyxy|~{vttv}}y{~{}|~{zz}{zyz|{w{zy|yyz|~{xy{}}zzz{zxusswyvrt{}|~~{z{}}yy}|zxxy|~~{vstv}~zzz{}}~|{}|zyz|~|xz|x|~|yxy{~~|yxz{}~~}{yyzyxusswzxtsy|}~~||}{x{~{ywxy||xutuy{x||y}}|z{~~{zz{}~yx}yz~{xxy|~|zwxy{~~~|zyzzzwutuz{xsu|~|}||~zx{~~}zxwxz}}zvssuz~zy}|z~}}||~|zz|~}yy}~yz}ywwy{~}zxxz{}}|zxxxxwuttv{|xtw~}~}}~{y|~~~~zxwwy|~~{wuts|~}{}zxxz{|}}~}{yvvw{~||}~~ytrvzyttz||}}~}yxxxyxwusrrrrqpqsx{yuv}}~~~}}~{|}~|z|{wutuwz}{uppv{x{|~~|{{~~~~}}~yuw}~ytpooqtwyyxvtstuwwwvtttttttuw||xy~{z}~~|{}}xrnmqy|}|uruz~|ywvwy|~~|yyz}~|{{|~}yz~}xy~~zxxz}}zwwxz}~}{ywwxz{{{zyyyzzyz|~~{xwy|zyz|~~{xx|~yw{}xttx|~}}}}||}{xwwxy{}}{yvsqrv|~{||x{~}yutvy}|wuttvwvtrpooqrrrqpopppppruz|yuw~}~~{zz}~~}|||}}|zxtqoosz{y||yvvwy|~|zxxz}}{{|}~zy|zwz}ywwxz~}zyyz|~~}{yxyz{{{zyyyyzyz|~{xuvy}}~|yx|zwz}}yutwz}}|{{{{{|~{xwwxy{}}|zwtqqsy~}|}y{zvsstw|}zyyzzywurqqqrrrqppppppprvz|yuw}||~{yxz~~}|||}~}{xuqnnpv}}|zxy{}}zxxy|}|{|}{y{{xy~~{wvvwz}}{z{}~|zyyyz{{zzyyyyyz||xutvz{y{}xx{~|wuux{}~~|{zzzzz|~}zwvwxz{}|{yvsqruz}~~{x{~~zvsrsvz}||}}|zwussssssrqpppppqsw{|yvw}|{~}zxwy}~|zzzz{{zxuroopu||zz{}~|zyy{~~|||}~|yz~}yw{|xvuvw{}||}~~{ywsponmmnopsw||xvx}}||zxyz}~~~|zxwvvwx{~}zxwxy{|}}|zxussvz}|yy~|~|xx{~}~~~{~}yxwwxz}~|yvuv|}yxxyz{{{zzyyxwxy|}yy}~{}~zz{vx|~{ww{~~{xwy{}}|{yxwwwyz}~{yxxz{}~~}{yxx{~|z|{vv|~zuqoqw~zvtrqponnmmmnorvyzwtuz~~zxy}}}}~~~||~~}}}~yvwzyusv}zwvvwz{||{yxxxy{}~{y{zz~~{zyy{|||{yvtstw|}{zzyxxwvvvvwy}}}||~|xy||yvttvwxxwvutsttvx{~|ywvvwy{}~~~|zyy{~zvw{}zwv{~~~}}{xurppsx~~|zxvtrqponopswzzvsuz~}yvx{}~||}~~~}}~~~}}}~}wvxzxtsw}zwvwxz{|{zyyyy{}{yy}|z||zxxyyz{{ywuttuy}~}|{zyxwwvwwy|}~~|{|~||~}yvvwxyxwvutsssuwz}~~|ywvvwxz|}}}|zyz{~zww{}{wvy~}||||{yvsqqrvz}{xvtsrqqrux{zwtuy}|xuvy|~}|{|~~~~~}~~}||}~}wvx{yurtz|zxxy{|||{zyyz{}~~{yy|}z{}zxwxyyzzzxvutuwz~~}{zyxwwwwy|}}~~|||~~~{xxxyyxwvutsstvx{}~~}{xwvvwy{|}}|{zz{}}yvx|}zwvy~|{{{{zywusrqsvz~}zxwutsstvz|{xtuz}}xuux{}}|{|~~~}~~~|zyxyz|yuvyyupptyywy{~|yusuy{zvuy~~{xwwwxxxxvusrrsvz}|uu~spv|}{zz{}~y}}yxyz{{{zyxwwxyz|~~~|ywuuuvxz|}~~}}}{xz}}yy|}{vuwy{}~~~~~}}{zyyxxwvtsssvy~{yxz|}|zwwx{~}zww{{wuwy|}|vw~}{zxwutsssuwy|~~}{zyyz|~~}}}|wsuxzyvvy}{{|}}}||{||}~|{}~~~{wuuux{~|xwz~}yutux{}~~|zyz{|~~~||~}|{zxwvvvwy{}~|{{{|~}||}~}{{z{|}~{yx{|z}{xvuuuuuutttuwz}~|{zzz|}}}}}~zxz~~zwwy|~{|~}yx|}{xwuuuvxz|}~}|zxwwxyz{|}||{{|}|wttx{{xvx}~~}}~||~~~~}zwuuuwz}~zy|~yutuxz|~~|zyxxz|~~|}}|zyxwwxz|~|{{|}}||}~}||}}~~}{xwy}|yy}|xvttttuuuuuuvx{~}{zzzz|}~~zz~|ywx{~}{|~}yvx~|zxwwwxz|}}}{yxvvvwxzz{{zzz{}|xtuy||yvwz~}~{ywvvwy{}~~|zz|}~~~}}|{{zywvuttuwz|~~}|{{zzzyxwwz~yz|}}}|{{{|}}{zzz|}}{||yy~|zwvw{}zz}}zxxxxxyyyy{}yvy|wuuvy|zy{~|xuuwz}~}xvw{|vtw}|zyxxyz|~~|{{{|}~}}{uonrz~|{{{||{{zz{{||}|||{||}~||~~~~~}|zzz}~{ywvvvwy{~~zursux{}}||{{{{}|wrnkmpstrommp{|y{}~}}~|zxwwwxz|}~~~~~}{|}~~}|||}z~}{{|~}zxwz}|ywwvwxxxxwutsrrqnlkpw|||~~||}~|tos~~}|||}~}zvrnkjjmqw|~ytrswzyussuxz||{zyxwvvwz|yy|zvsrsy~{|}|wpkhhimqv{|zwtrpooqsuxz{|}}}}}}|{ywtssuxwtqqv~~|zyxwwxz}}{zz}~zwtstvy}|xtrsuvuqnnquwwtrpooprsuvwxyz|~|zwtrrrtwz~~{|}zxyyxursy~|zwuttssrqomkjiiiklmopqrsuxz|{yvvy}|zz|~{zxxxz|~|vqlighkqx{yzzwrmjikmoqstuvvvwvvvutsssuwz|}yurqqstsqqv~}|{{|}}zvsqqsvz~{yxvuuuutsronnquxxussw{}}{ywuuvwxyzz{{{|}~~~~}}|zyxwvwy{~~~~|zyxyywropu}}zwtrqqqrstuvutsqpppqrstuvvwyz}~~|xuux|~}{{}}{zzz|~~}~}xsokiijmqu{}|~~zurqqtvxyz{|||{{zxwusrrrtvy}|xvuwy{yursx~}zwtqpooqsvz}~~}|zxutsuy{zvrrtx{||{zyyz{{|||}}~}zxvuttvx{~|xtqooprplijov~~|zyyyyzzyxvtrpppqsuxyz{|}~~{xy|~||}~}}}~}{z{~~{wtqnlklmpsx~{urrsvy|~~|{ywvvvwy|~~|zxy|~~{xuw|~{yxwxz}}}|}~~}{ywutttuwy|}{yy{~~zwwz~~|zxxxyz{}}~|zxvtttuwy|~}}}~zwsrrtutpmlou|~}{ywvuuvwwxyz{|~~{{}}}~|zywwvvwxz|~}|}~~|yuromllmosx~zxxy{}~~|{zyyy{}}zwsqopsvwustx~~}|{|}~~}|||}}~~}zyyzzyxwvvvwy{}~{zz|~{z|~{yxwwxxxxxxyz{|~}|zyxxxz{~{yy{~~~}zwtssuwwurqtz~}{yxxxxxyyyyzz|||{wtsvz~}~}|{{{|}~~~}}}~}zxusrqrsux|~{z{|~}|zxwussstvy|}zwtstvyxvsrtz~}|}}~~}}||}}~~{zz{{zyxwvvxy|~}zxvwy{|zwuvz}|||||}}}}~~~}{yvutsstuxz}|z{|~|yusqqsvwwtsty~}}}}}}||{zyyyyz{|}~~~}zwx{~{xxxy{{{zyyyyz{|}~}{xvtsrrsux{~{zz|~|zxwwwxy{}~}|ywtssuxzyvtsv{~}}}~~~|zzz{{zxwvvvvwxz{}~~~~{yz}}{ywwwxyyz{|}~}{ywvttttuwz}~~~|xurppqstsomlpu{}{zyxxxyyzz{}~|ywx{|zyyz{|{{zyxxyyz{|}~~~~~~~~~~~~~}|{ywtrponnprtx|~}}~~|{yxwwwxz{}}{yvtssux{zxutw{}zz|~{xuuuvwwwwwwxyz{|}~}}~|zz}}{yxxxyyzz{|}~}{zxwwwwx{~~}}}|{z{{|}~~|zxvttuwyzwtrrv{~|{zzzz{{{|}~}zxwy}~|{|}~~~}}|||||||}}~~}|}~|{z{|}~~|zwusrqqrtvy}}~~}{yxwwxy{}~{ywvvxz||yvtuy}}|{{{{|}~~}}zxxxxxwwvuuvvwxyz|}~}~~|{}}|{{||}}~~}{zxwwvwxz|}zyz{}~~~|ywtqppqtvvtqprv{~~}~~~}zy{~}{zz{||||{{{{{||}}}~~}||{{||||||}}}||zywvtsrrstux{~}{zzzz{|~~|zxvtuvy{{yvttw{}zxy|~}zwuuuuvvuuuuvwxyz|}~~}}~|{{{{||}}~~~}{yxvuutuvx{~~~}|{zzz{|}~}|ywtrpnoqsvvtrqsw}~~~~~~~|yxz}~{xwwxxxxxxxyyz|}~~}~}{zzzzzzzz{{{{{{zyxvutttuvwz}}|zyyyyz{}~~}|zxvtstux|}}{xxz~~~}}~~|ywwy|}|zwuttuvvvvwwxyz{|}~~|}~|zyyyyz{{|}~}{zzzz{|~}||}}|zyyxyz{|}~~}|zxusqqrtwxxvssty~~}}}}}}~}zyz}~|{||}}}||||||}}}}~~~~~||~~|{{{{||||}}}~}}|{zywvutttuwy|~}|{zz{|}~|zxwvwz|}|yvuvy}~}}}}~}zxy{~~|yvuuvvvvvvvvwwxyz{|}~~~~~~}{zyxwwxy{~}||}~}|{zzz{|}~~}{ywtrqpqsvwwurqruz~}}}{{||}}}|ywuwy}~}}~}|zyxxxxz{}{|}}}zxwwwwxyz|}~~|{yxwvvvxz{}~~}~tuz~}||}}~~}~|ywxz|~~|zz}zxwx{~}||}~~~~z{{xwy{~~|z{}~|{zzz{|}}~}|{{|}~~}}~~}}~~}|{zzz{|}~~}}}|ywy}}zxwwvvwwxyyz{||{ywuuwz}~~}{zz{|}}~~~~~~~~~~~~}|{{{|}|}~~}}}~{xwy|~}{zywvuttsstuvwxyz{|||{{zyyxyz|~|{}~|zyxy{~~}}}}~~}||}}{zxxxz}~{xvvwxzzzywwvvvwxyz{|}~~~~~}zxxy|~}}|{{{{{|}|zxvwy|}{zyxxwxxxyzzzzywvvwz|~~~|{{||}}~~~~~}}||{zzyyyy{}}||~~{wuux|~|{zyxwvvuuuvvwxyz{||}}||{{zzz{}~}{{|}~}{yxxxz|~~~~|{yxwvwx{~~|yxxyz{{{zyyxxxyzz{|}}~~~}}}}}~~~}{ywvwy}}{ywvvx{~~}|{zzzz{{{{{zxwwwy{}}}|{zz{{||}}}}}}}}}||{zzyyxxxxyz|~{yvuux{~}{zyxwvvvvwwxyyz{{{{{zzyyyyz|}~~}{zz{}~~|{zzzz|~~|{zyxwwwy{~}{zzz{{zzyxxxxxxyzz{||}}~~~~~~~}}}}}}~~~|zyz{}~~~~~~|zyxwwy{~~}|{{{{{{{zyxwvwxz{{{zzyzz{{||}}~~~~~~~~~}}|||{{{z{|}|zxvvwy{~~}{zyxwwwvwwwxyyzzzzzzzzzz{|}~}}~~}|{zz{|~~}|zyxwvvwxy|}|{{{{{{zyyxxyyzz{||}~~|{zyy{|~~~~~~~~|zywwvwxz}~}}}||||{{zyyz{|}~~}|||}}}~~~~~~~~}}|||{{zzyyz{|~~}|zxvuuvwz|~~}||{zzzz{{{|||||||||||||}~~}}}~~}|{zzzz{|~~}|{zywwvuuvwxz}~~}|||{||||}}}~~~~~~~~~~~~~}|zyxxy{|~~~~~}|{yxwvvvxz|~~}|{{z{|}}~}}|||||}}}}}~}}}}}|||{{zzyyyyyz{}~}}|{zywvuvwy|~}|||{{{||||||||||{{{||}~~~~}|||}}~~~}}|{{zzz{|~~}|{zyxxwwwwxz|~~~}}||||||||}}}~~~~~~~~~~~~~~~~~~~}}|{zyyyz|~~~~~~~~}}|{zyxxyy{}~~}|{{{{|}}}}}|||||}}}}~~~~}}}}||{{zzyyyyz{|~~}}|{zxwwwxy|~~}}||||||||||||||||||}}~~~}}}}}}~~}}|{{zzz{|}~}|{zyxxwwwwxy{}~~}}}|||}}}}~~~~~~~~~~}}}}}||{zyyxyy{|~~~}}}||{zyxxwxyz|~~}}|}}~~~~~}}}}}}}}}}}}}}}|||{{zzyyyyyyyz{}~~}}|{zyxwvvvwy{}~~~~~~}}}}}}}}||||}}}~~~}}||||}}}}|{{zzyyyz{|~~~}|{zzyxwwvvvvwxz|~~~~~~}}~~~~~~~~~~~~~}}}}}}}}|||{zyyxxyz{|}~~}}|||{{zyxxwwwwxy{}~}}}~~~~~}}}|||}}}}}}}}||||{{{zzzyyyyzz{|}~~}}||{{zyxwvvvvwyz|~~~~~~}}}}}|||||}}}~~}}}|||}}}}}||{{{{{{{|~~~~}||{zzyxxwwvvvwwyz|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||{zzzz{|}~~}}|||{{zzyxxwwwwxy{|~~~~~~~~~}}}}}~~~~~~~~}}}}|||{{{zzzz{{|}~~}}|{{zyyxwvvvvwxz{}~~~~~~~~~~~~~~}}}~}}}|||{{{{{|}~~~~~}}||{zzyxxwwvvvvvwxy{|~~~~~~}}}||{zzzzz{|}~~~~~~~}||{zzzyyyxxwwwwwxyz{}~~~~~~~~~}}}||{{{zzzzzz{|}~~~~}}||{{zzyxxwwvvvvvwyz|~~~~}}}}}|||{{{zz{{||}~~~~}}}}||{{zzyxxwwvvvvvvwxyz|~~~~~}}}|||{{zzzzz{|}~~~~~~~}}}}}||{zzyyyxxxwwwwwwxyz|}~~~~~~~}}}|||{{{zzzzzzz{||~~~~}}}||{{zzzyyxxwwwvvwwxy{}~~~~}}}}}||||{{{{{{{||}~~~~}}}}||||{{zzzyyxxwwwwwwwxyz{|~{y{zfhdh_cnofRY_jiroihcwz`_}\_qmSB:>JIYexcJf|wt\YnwiVCQxirnXnjżuudXms`px}njmflVScn`TL^NUkYQoo_qKivo~iloϹ\T?JUB?Mnilqer~rwv\ikyypng}YyihcPLazflawyyo|pwgGN|rao~\P]Ujk~xxyokO`}iyt{ouñǵØ~|4.3DxĻr}yQ`sYOPBV\XXehH\^mW=fekidWUSLMwaTGdebo|cv}|uX^mwb}pefc_y{le}out[sQP[f~l{yhZp|j~me_toyh~m{q}yxwúĶeg[PVKN[m|tc]Y[_3_J21FLC_rZf\^d]qOfp`POsxUpc^ZMTMtpfrnd|wbsadS\~}{tmy}zgaSDYhk{af^No}~l[z|tqywfwqcoz}win{@DOBPh´iqelVO9VoTT`WWSeNXfHd|eO`c^z[\?UE0F__p|t~mfvXgonotb|mozjkyqdq]wLQ]ny{|tn]pcnt_ixwo{wxpŰz|pyS@4$ieXy|]Yxc_gaP;X?HPk`drmGebJNhnDRIGolKA_uGX{t`}ehOio_sus}|m{ZN`iF2uyubYonps}smsquf_w}`tnÜ|lD\[GVVf_ҾkfjNFT8]g;79Uw_l{}rcykux~zzh\Ti~YThfmYriltsnnoxb{ssquhk]oy{j}{yq|j~viMKMOR]~yfrkbWS~fOAYf[[qnQPwtgcXk_TgZLTXI_s||ro|mauSYmNb|h|wZfe[BcX>Gkfn—v}wdfsh]tqzy}wukyy}qa]MAII5G:y}½zucxhSrsTM_Ta^i_[qq]fqYRrmO]@AkV7)]oTzoo}njm{vnzsiofpeKNfjDg~|Pmśqn|fslogrs}zogxyrvvVp}zmfm{lwaZkaRUepέ~x||s{zvuj{tXWjeqlytjyxvw~~~Z~vjg[KLYQYVIIA[a}szhrr{ppjpfmwnqvpbb}}|jfjo``fJcUWUPQXWFJjFQ?>jfbnìĶ{l]qjnTVjkip}{ut|}uaszwd\JfpIPT]e\_L^Waw~uvyqvubne]ugp~t`Xghyxvtlh[m~dLRbpeWWUcbaaR;8QIUeI`uexvywͱĝyo}qhnsodpuxZkhVsy~olqkyimxn~bltl[``xvykqefs|v_RSFkz`{UXpvwyxyl|timyqa}od[VpcZm{uz~hYCf`CE8A<-952NtwhW]wrqb_zʬdtvw}zs}dyttk[qYw`eXMVbaKMN]sl~xκtn~ntx{v{|kteSM-MoiaaVbWLHPjWop_zk`~pgi`oXNR\`FaQ`daq`ysqhodWp|w}pnryQd`p}}z_KJcfD`EHtilh[Vbykkn`ti~zz|cXfq^mXO[JS[PWrfVMQVc`dc`jtT\_Tqky}y˯˰tuOSL<||xbZqX_jzhihqoao[^mp{u\OPQZ\\UFQd{wrzuUr~}vuux~|xuvptx}d=bJLokolqvlwbRTOPLiTNnec]EWfhjunj{l~nwy`amkm}su}ypgzzsmnpg~qvfZumfhpsurok^hZvwmufTtphvpty||hYTVZngp~zyehj\emQVZMJiwjvzdl~]pwoya`NinRfgp}rnwcsXlucnpmgnfh_lplk`W}ib~}c[etm[aR_knwvooyeXp[dqjeg{fpvdqOZrzrbp}pb_h[z~~cb|cikSara`lOYfcVB7FLkvwncorjgTgZCaTDa{~}ttn~x~λszswnpo~`Ya`wkf_RYh[cd[_|uotzuTqj~ywz{ij\lofr[egnq`iklrvpOcfR{re|r|nxorqsl[hms|cfwzwc]rl~y{hpwu{}ph{ku~aq|pp~uf]_iMhzXrwzWurm}{x|rg{z}wżʳ{rgnf|v|scZ^_z}nhvbnuUj|ovqnYWkcWMUn_|}|nwyt|py|~v|o`dMU\KPosymZ}|myiki\[qxokxq~~yxm|essmUKXLd_edQRdwzcubyiHl{E*>KC_Yrr}}uosl²hm`e^Nir}{vj|zq|w^e\rsl_XSoT4>^I,8 (NR\]`lw|se^Yvvh|xy|wo{nglfGCWwiilkz|snw{wgTRTXo\Y4$+7A:DRQw~ok}nffMf[Wd`_fwy~~}jm{~fsdjld[_mprzt]E<46UZyrimVVG6JTW\]ZjkVhuc]]_`\aXsu|fouptpgkc]btwyupnfY{}y}s̡yuiJ>XB=RmbigYW\ekxx`agYUcWNRQUeMSr|uixvx~v~njzooutYmy~ymwqYfZTOGKcppeYN?QlcpkZpoy~iRZNMSGG]|}~sy~pcxyhpiu§rzffcUTfyz{qzvsZDbx}Ÿkmufpĺ}cYMC9/'Gl`ȼ~ezhjx]PV]scP]_^^YXnm`k`\Z]acgwh]vgQI?M_^||v}{|wwkcJ653KUu|tlQst_ZTQMJBASYYb~~{hlogwzgvtu~o{upfYNTY_zq~|syrgd{thpdLPD5?do~sszrl}vtwrkdaTIbV:I\Q^uqqqjwrr{ospe^]^[`G7h{|vt~xq~fUQJ:'6dm|cfq]XcelhJXlh_PNefZkljnne^_on~|cbgN@6?Y^yuw{qm||owļ|{h^YO/'GWXln^piUPHFKMECZ[Sx|z~ybn|yrwdkkjidec[Tlqjsywsjh||}tvvn_^T9BH?Pms{z{u~pknrwulebRRO9JZNf{s|uf|qrqi\PJEIUIb~z~t~~vlsq^@93*'+GoƼ||f{r]YZXcgOS]UQXs~uxdfhgjovqr{scHQbI8Cuxbvxyin}mip}sU\ea[RQe|vx|lgb`xnoj[J;@J53AOzϿt~dr{zre^\WBG[Wjjj~zmgztime[QE?@A97>Q{rqrsmtvt}xx|}ogk_QggV\flrݟmtyjz{fhqpe\KX|s`Yjynyxuwyqf[J\qfknie^XihYe~{hSKkԗ{}vzx|tkwp^\ydUQSUKH~qyxysh`jt_UTRQOJQrnq~~{aF9DStYNZjZ\ooruwtmm|yz}eq|qr{iqónkhjidZNRZVs̻ҽmA1YaslVH=),DEJF4Ms|tglxkyxh^cvfiwtknȹqpkZ@)'/+OȵwnhhiYJaa;Mxoc`^OKPqzc`[MZWJ_qnlshb{{o~srmdYQJPRT{·to}praj|txxlflfdջznlUEB=75>NNCHj|jdvXgmYMHCEL?FoyqstvZ^djmc}ĪxkNKHB=96;?(-b|`N]gSIkfc{anqzpqd_XJ7)2THGŰiXdkZTYdWF`~wjkvh]cob\}ychk]WTYpymȾ|ie\J7*2<5Luof^Y[\NFZQFe~~rkh_MXllobcsoc`pvqɳ|wqoqrosx{uZPP7*<@Dh|{}wvyyvzsfurcXljVQOG=BIBSdsmzwddjkjoe_q_SOTUX²wzv_]meWhsswklh_ovbTSOD5+*8FDjĹrnvubxuero_LBBTceynujSJGDB?C^jPfscfubJDI]eczylWer\KGPV?6Sv±x_TQNIAOMIctupheiwqg}ytldbr¸sywhb^Zbusm{yypjTA8/'*C[f˺}wohffebcm}vqdWhtekq]V^^bzzmc`YSRSXhputmZ=IfpkjblbQN[eWVk}p_dUTPB40?\el{yxo_lqyc_fS]_QFJdõzk\TNMJHTuwjouzcLKTA-3Oabvq^kmVF=9??0@qȽ{}~kTLLKFGUUSm{zwwpkd\VOVxyvp}jckWF<2&)Fa~ɽoZ`k^^aZnxrmhdlupnnh`WQRauyy~nfc_^ew}~n`gU?428M]bϹ{tmgcdk_Lm|wqkbQH^eQO``IJ\mǴ}rpkfb`fqhf|i`[O5)?WWUrnmwupmnx|lxg[qybTQNF<;Rshfpdrr`ZalbYsjszpmg\STgvltl_X`j[Slxgnx[fsVNMG=7=PRRoznt}jbv{r\MUULIXjhw˾m_UMKJHMY]cr|p]ZbTIW^Ym~xnaooXKE=7>C>Pbpʻ{e^_]]bUMf}}}y|toldYTSUQUo|uznv}mk¿iZSK>1,3CELz˽zkZ`olZJ\y}xo^c|_eolb[\gunqê~pkgfdi}mf|{zSKWI/$(8B;Lrȹ}h\nZeudSQ\`H>Tnph~üwjhgebclkZe{{kd_UC2Ce\Rrkr{ytu~tgz{_ShgRGD@933Fce^}õysqrzmf|se|nb\VNHJZgcmźwkb]frfarossrwwp]PJD@CSWShò{{zunknx}r`S`g[\VBAJOYmsyӼ|rh`\Z[b^\{{utjdSBJTRXV]z}wcbrgPE@9/1EVV[z°zowiVQRW]OLf}oi}wrqlc^dtueumu|mdttYneH@=5+'0HWXtİzp_^y}a`}ztdUivUTa_UR\r|y}v{j_YWXX^vvtxvXFNR?4A\hjzvtqs~qo|xr`SckYKGJSQBRzlaaa`dpogxuk{ycVOIB=8AdwxrcnyzwislZPJD<;BXpútaassnslo{tnjkib]XRLHJYsDZth`YZfsrnqvhqnVWXF616E\eg}w}oZO_aLGQG26Mf˵nf^XUV^lgfstnebXD=Xswozynvwtrv{\EN]L7/-*&-Ju~vųrw{k_bqtgoiYyvfa_ZUXjv|~zjcfspaobPkvW=64.-6Ngmxùzrnh[_zxhtxrmaPXrwgPNZ\]hxlb]]]bqugtzgS?4=D>Gamr|wwx~wm[YjfRHDBFRTZt{{gVSVYckae|vunwsb[XROR[gtzdgv}qioxnWLHD<8>Qfl~sb_r{jf|zqcWhv[HMPJCDQjz{ʼvia[Z_p{f{zjXddOBEUijj|yxyvb~vfQPbYD>GL9/FizzϾukfc_`jl^d}o~ve_\SB8Oqk]p~|jr|~~dZkeOA<71/8Urokȸor~tgloabyei}nfc^YZewypvqgagtrfpytkZ^d^J7/)',=NNXvŹzy{~q`fvrmeQKSZbryt¹xme_^_bjkh{yn}m]R@3=JLSSWq~~|rlZ\mfRIFB>GZb^`xȽwigiqq``wgeyr`YVOIJU`VU|~lnwgicQNJB<>LYVZ~xoa]rgSczzseRZytOCNSMKTgtq|ʭxqnkotcz`OY_NAGY]Vc~||{~kd{|q]Q^cP?:@G?2BbjkȸwjfedgmdXg~}qmibYQZtwo|rgr|~{v{|j^f\I>93.-6K_jrǺou}vrccx~ztrsojea[UV_osmvrg_\cryrkk|}otm\\XF838FWZ[rθokvc]npa`dUBGYlzwyļqga][]dj`^||hhxr]QK?,,F\\S\z{dhyp[PMHBDYuvcsmpwl`_im_]qhN_yp\RPMIKXmrep~scjrkZ7,44.?]ybewN4\pFKNVlr~ƽxqpkhl:1u~pz}zioo[_ldWKATVar|اxWlvjw}wfpdXeld~g^b^emyy}bO*\uvrgg}]~|bkp~~ibrliv`hQT^v}sL )R{d_kdhnv{v\vqYqpPH\sukT__aPbusw^z̪vg_?Cl{vj~udLUX{PIGUmr{ͯr]82S[rJE>77KDk~u{yybwrnN3Y\Wqjp{h|g|sjit{~ocwo}w{r^qjaqбp_zin{||lkhJU\WоïyVqW0;0J}ĺ\ihibD;OS^s`bicn]]g`PBjp|qnMfurm{sbxqepSAB(chƧ~z}|_r~fjwuwgr|~׶Գa\T>GQEHANuuugkpXC|vUP:NgMQvv溧~~|sbmwZWkw{é[YoI?C>5f|ɦg}c`TZkQEh|Y^oTL[L4k|_upj{pmvz~c^[HL?&5BKkr}wYka]]yd{iOF3FF;bzmZXLid>RzpmH'T]FS^]czwws~}mlBZI39N>Wg}hnkua_|ɞthzsdm<<*;YP[߭ykwq{dJcog\:Q;7.1MJJs|sovtkirjsrI8b]Sj}ġ}|uz}hriuzТ}zǻ~u~mGW4%*1GHa~]qaM[tUEmU/-!A[P[Kf}yxtf[AW>DG`~glcSW}w}{XVztj}{C>DTH8cjt|ƨz|pxdxsm`RE]W??;STpcx}^nyHUje]PG9`E*IVkʲlz}yKmZ]uf__yt:'GH<:\aαǏ]uzSaV@oSahE5`]?Olnjzd]uq}|lage88LTK[~yǜojWusZ~nq}}Ó\OyF#=IG3Mlף{|wdSVelcNF`;Q`LRehxQ_z]f]vOMRW?:VYaxipfhPqgbmpS_:!,%{masɿwddj`qxd8JUOP]_p{sr\v`vns_~jc\{]gP1Yhj~ùfniuI^[wi{kctaIIQ4AQZKd~]pcdjTMIgulzqsj{muG\]iiG_PcVVt}ukV~e_v`}tugdd\LG8,5\[[xɋx|elr}Qqp6fgUdS[kl{q{~{us|}UlgX_,Bd)2:fʛ}{}mjzaigzRdth|Z9E/=HTVsȯ~otRNjQ;P\8XfsiOx}w|wqaSzy_TMD>aQ]`ânwgWosdeétm\]t_kraH"Q[Rlkwkghaz^KS+HdDEF|r}ux_QuwdISNEC\Tnzugeaxnzz}mL^Njj, K]YO@}u~m`rdVdYhlc[ljQ.5166SWcxĤmxkqrFRsgdVQrr~lwstuiYvyRH53]E77a}Ȫȿnj{{ypmun[lx~}q}{y]Eu~q[8?G7@Oa^Ƕc[QcHGdPAdrs]jmwmpfmy[HIG:M\LTjz{muveW\cioypovT@ZpXQ[NA%Gbhqt|ttwr}]F3;Q{[B\~{vl{fe[[pbVF>U_ibmqjYgop^q}r]sb\CIRT' %AW_lϾȮ˵|mimtm`|[SY?/OMCE=hǷΰ{wfi`Q_Tk|zoxjy|t}p}jH\~zhJ;PZbsdwsvfyalR;r]^[tt`uo\cRUS159:=Aalȷġ}ljgfLdsgoUfw}~nleZjclca[>JYUcSwvXwyt^Zoskt~togcIG8XaB'4.'^gRfiɼѤǽtlIZg[[Yz|y}dziLjcH]MN[L>Zflx\p }}tidhx\Wjgr\}|pkqscowgws]`JFgUMPA5Tnm̻|}yvgLPNCxbfnsyrVYudl_UK-;R[gYySzpaONsiUrux{|^Y\NVD]XF92MIDXhݯzakzr^]z{~opL\ow^F]G7>K8c{ſyo~rkckVRgbym}goTLR1@xW)BQ=HѵĬƹ~t}dfWco^ity|prjZo~_N|~f1?fZbioequwQfqXQ]`Wx^ph_t[Z^PUW,7JR=&6 H67pnpp`[rkvcUduprux\ETgQ^^uiv}~Szcldsu|oT\UnǠto_|mlKqh`YWpxZW[`w{{lݨϬLJqxrz~oSrxlOr~wr[<.:a6PVDLZNKYImDPgk|gIew\e[Yd^Nh{qTYm~guapg[ULdtWkuZv|_qab{XWyvvS\T|xbuyc}yhMt|ÊtjhrcUWzbpwzh_h]HjPX=BROBKCJMRmfc^DAjotX|cm{z\nnYs}hlt]eTlnSSokZ}zzzYOum]x~y|m{rgkclZTnwldfht8ksyȡwzΤyltfXplR8Wb]yx`WP|@=?2HD@EGDV%L}gsrqX}idcquzdk~~XF~gELitdjs}v_b]ruhon^|`MizkzlheSbQXNmmfnYulsص÷vt{gjpg}ycMhxpnw^QCS@JB\[^fjis2LlvhjRugm\X|]act[ayq^L}jTfgpow`RbRj|z}tqYvn|pv]uztrfqai^y~Kupw®~ivdr[r|cG\kdwy{u~}ikBSE[XYcb[b,Cy\kV`NlbgeXylyzxotvTyrQQtWofjbiSY`|vu`yrR_i\qu~{|gH\Tpplw|{LR|{yut~ų}\lK\pgAG_\nyz`}8G@MOKT[ZkJ+tltmmkozds\v{txzW}im[XmIBZiT{qobyi|r`{~OZu}YTqq{|mpUMRUjfsOn}oĞ{npvaaVMejOcjq}yqco;ROd`fwuor?Gft`i_n`]gVmhoi{tR{XpVcsW\polte]ejpxiXeaeqoy}zu}w]\bnzrtM{wx{vsjzodNG]zaIY\hp~{~FVUg`bpkgj9Ax`l[aasf_j]rtz[[t`_lNSslfr{brkbwt~b|PZuVSadmt}xwfQ[gthtuKyzr|iv}zq}voHsR:JjgFT_owwtJDK]ZUjvmpP?~{xxmt}{evflpvxyPu]]bIbKLfi~qz|i~drt^f}OTie[lr|}qjwrJTgxmyZ{vmsr{nyc}{~worJv^GVvuTajwrpxXO]qkhzxuTF~{urbhzwcrbdgqrxPx^cmZnY]vxwgoser^yv|dp~V^se\fnrt}y{|y|yVax{p|oT}~yz|sqhlyzfOvNHWtbKXapizVTip`cyynb?Spsiapqs{mqtxq\~VraabQ]|m~kxys|zstwox|RydQ]vuTZ^oe~zpaQhwmlwX`pqsyhpyoiz|boBaY?KcmMT\qjtiMape`twnRR~~jnq}nijvs{yPuZ^iX`NUju~zy{zeoxl~UioP[pa_dvlx{snsSjurfc~jvvv|nsxcfo}uarL`eJVjyYW[nfx|z^uvpqUTzzde}nyldess}xTxaevdeV[mu{tyu{vcn~s^rsYbt^\]oauqunxazwrw^avv|s{yjm}|}{emw}ftQ^eIQaqRMOdYiq}øgxwpzmSPyxxjavxnmz|[xkaxf_RTa|ozyxjzvjzzp|ectU[fz_SRc^dlyrzdotovv_Zr~qpzpcblwh|uhshd[IdGIRl]JMZc[wumzrrxcUp}f}~~qgnxydcsYln^UPWnut~rqnjhvVq`X`uv\Y\nZx}ywtfxus^owwww~lsvxkdiz{|v_amzqZiQ[`KTct[SRgZmnyy{~w^\zxx]x~wjbou||_orbxvbYYbxw~l~~gq|n|ot^w`^cyqZV]iUtx|r~rysjYo~ptvx}uy||ieiyzvvv_es|s}ZhR\]IQ^nWONdUmj~|yysZZwu|]thrx~corcsx`UW`ss|k{~pro|fqZo]W]pqZTXhS}t~{oup~lZj~nys}n}uo|eadp}s}]p{ecwhuZYVP]GLVmcVSdecv~}u~g_vvhvvehqx|aendi|iX[btywyzsf|h|~y|`m]kbX_oze\ZmXozzy{w~s^jeukx|wkwtoieiupyyyWfws`_ugp]YYUaNRZqhYTdbatx~f`vqdrvdhq{|dlqlop]ahxysxungzk}{dmbo`Y^oubX[hTn~~~zrjYlvxermzrrwuq~bcgtxxnsqXmvp^isflVYT[XKQ]n`URfVrnŷŤ}zt]gv`ufqvqhnmkub\ajt}ohsppvyjccdiWYatl_We]dn|vyow`d{sf|iqwxiqoprh[aiszpu~Z^mm`\odd\QSV\KMVji\Ubb`yİzjh}rjwydho}udmiollZahtyw}liy{qj|vpnbcfm][aruf[cdYyuy}r}fbvmlq|gjrygrmtor]bgrvrzq\Yhi`[mga`UT\aPPWik_U__Yxyìʼ~mi}ols{fiqxjsluop[`fovu}kkx{royqqgcmo][`ppcWa[Xprzz~rzcbvjir~hltylukvnoX\ahn}mvsa^ikc_oj^`WP\`NMRcg\QZYRxrưëqj}rxpmlu}jviuk}uY\_hmx}ulwztn}{moi]iq]X\jpfZ^^R}i~{~skaupȿu|`jcgeFEDLJmuWZJAT`evqs[JX\YR`fX[`Vexjfmz}Xsr{yæyhwi^w~n_gr{`leittmfgnnmn]NOCXgokx}wj{pevlfi|{y~mEzqiXbqvxwsrrpxtnWXieqyurQS[^Z_rshvxnp~O?tXOyoolliu|no~cqkywY7-;Rkkʾnbfr]UdI_W[eJDBAFo_HF14Rlju{pvXPSUV]mrciay{vu{|vd[H9j|v~lvĽzrezWN92K{ɴuqga[dj^OjXLzk\\ahhaWO4Qq`lu}{xfixkwvxxup`urW<,Ud_yy|sfn]`uoXJQ[gej{~sxtvxypiccebMGYzyxtwvqrvpbzy|dboaE26?MTc}ĸ~ja\nXc_KD?AgiPQ?9He^e{x~zo^]WV\kpd[e`spstvpgN;_h^j˚{gtmTCENZZ[itxheuzwxlfdpp_Wc{{x`Vw{v`U{fzv~gp`cfdi[RefUFKVbgkuqA]~~{vw{tVl{rktűtS>Xiijj^rmos||c\zv}nu_Lhz˨tl}uimu~}YI8/:^ŐzmhfieX8EbYQTsgYbdZYbEHbkww}jnY`poa[bkt~ww^LJ\bwo^TX{{jpeanmg[Yg|{xlY\U=\~ڿqYbg]MKQYcmch~p]T[hcvqvxg_Yp|{{ns}_QF>Ii|z|ah{}poudL=AXfrZKIfcPTGBMgk\rx]WiXC=22B_qrh{W~zrps{n[~y|qrl_iaMmʲ|kxzopx~qvmJ?66HoĔwpmqoaAQkaZUpiSWYRW^BMht~yzonY`mmb_emu|owhULRfj}q`Wdvpujk{|vic[_uoeaVQ]IJs׸mdml^UV[aps\tx}}ufYXddosnyte\byws~{o~hQKAD[~pcyx~|zziîs|ztnbOBAR^qo]Xqq]aXNUjs_j|_PeYD?52>Ylpk`zxst{p^~vvzgie^k`Jf̼q||suydqdH?53EiÝ{z~zbIdmbYUncOTVSbZ>Qep|~xwjZemjbcglwklz{rcTMTY`whc~t{wnttpj`X`wxw{a^ZT`T;Smӽuyzpebbdmz\byw|znbZ]XZrxw}ncdy~v|i|qYQC9@Wn}ʬjn¬usud_ShkQPX\onQ\lr||v_AHbx{umjngWt|}wtwwuʷuLMmҮ||kYqpPbpa`]UUfytzuafpTGLN^gLOgvͽ~URnx~oIhyglqohb_^Sixpqsp\N[}~|~xwƻaQ[˽k[hV@CHTfQDYdnz}xtZRdx|Yanhllfa_b[hkTU{tkRgbTRJCJ\jpvss~zx~wibO?UzjoooiaZXRKmjk~ekeSKc}|mxzRXdTPMGIZo|rmzpgu`LPTdqWQenx~{cavyq][IKZgke`hs\MrommoneTYxv`ZfpVAGIMbjszpppmowdON1)22>PSh{d_d`_XUYXVZbimusaghW[^[fʹs}mj~~|uþưþygPLVG0;PbɿogbYOA=;50268;C=9RWWef^an|ymzsgcVSdaQWp|ialprvyz[buhcsy~lyzƾurlfgr|~fafdit[Y[B2DISXHK_UQ]^^hy}llzqeru{eJ`jblſªpirbbojMK_tȹ|yrkihffdM=JB6ETawoaiaMObbLKUXZ]]X[eT9TwѾulhcbbdktiT_yvcepw|~zzpakuqrrb\flnqspiee\RW`ejsǿxl{tlmwzgYkykxb]]\]]^cj^FKegUVfsȺ}sy}{{|wpkkeZ[aa`cjwwxxzvh[hxlZPQY\J=Pp}uzô~vtqqqryuairozv~sjpronlf]WUNDEMQV_oƲtfstbZ[dfTFWrxij~}s~ha_^^_ahoaLVoo\Zgqx}}¾xqx||}{urrnedijjmv~weVbn`K@>EH6(9Yf_hĩytpnmnsznX_y~kdox|}xyor|kckppqrnfa`]TRW\_dp¾}m`k}ue]_irhYg~ob\XVTSV\R:EXWawqwn^yuh\@LaegvrlĖuxǮ~m^_KPawQ?EPJatw{kewytuZUB4BT|~w~mdmfptpw{}ir|zNG[fny}hhY^MQaw{qgw_OYgbB;LIUlku{w~cVnsduvcOB>E;>CVdkjn}u{|v}vrnnkxeOWu|pzsnsshputvks½nXZhbJL[Ted[c_hy~}cUpdpkUFMMYWNNLcxmbpr|mi|~waui[dt[Rl~t|{~}r}}cwg¦iYLSe`LZc^dSNTQ^fsxiXwyktUFM_cf][YUkxuekw~l_zdgyh]VasXSz{|xv{p}\uzdîr^PGNdaPffb]JKST^]lqkW~pshEH]ndb^a`]rryevn\y[tqd[W_ryXWzuxwpy~y|uZnygm\PGI^fSjkbXHNZ_dZdjqXvqv`@Smnakuyvknh{ry|qJ\r_t]Wbj_Pjunu|t}r~xu}ucpze`|ovkULRQb}}c^xto^`fszmovl\Qio=?Toseq}|lle~qv~znEXq`s[Vgn`Qnvnw}s}zu}ws|sar{bf|nrlVRXUh~ce{wpchm{owwkTXkf9G[wshy{lgjxqsxf>ahm{nVYjpeSuinhrzsרlho¼úil[Ixv}lqdV9=KIi{ofcz{TFJTgtcw]thxabixj^Vgwzopqifsp|y{ymV7_mx}qmwfyvίty|{{ns|`iy~dylgM:hwxtsYOe]L[hWIEZ_j{kP{`g:Qy`ilvrrutgflnnZ6;\d{^cyxyap{pa[bwun}Xp}SZ\cszy`VMZz[qsDn^\;Jqyg^zg^I'OtqyUhr[U[mRZzwhνo`{n|psxvrhb?hpFYwruoLmoP\k\jmC4ZaJcTT\^XQs^\_n|rwvrIZzhZ^nqwzyrx{Xrvw}{{quX*beosj|Yui]nSa~jOyvh\N_vFdIUku}~{y|{z|Ixxzkk?QnaUkhuNkol}kxrmrr]67Slyokxc|sUlvnfxrXopke]=JmbKK]YcotD$Yrp|ybVnL~hd}w{fŮz~seY~zsooRK~kl{nz_U{xed}y`nx=5jd`zyw}iImMemh~|leanwN=Gg~zKluon|ln|h|zygU{zgv}s|d"!`msc{kedgxh|icXIv{ePU6@lhkn||hnusd}N^kjtg~qGTwtgouoV[unZ}ypbl~~^90:a}yW{||edw_Uy^ir}YXnum\@;drh[pxpyln33pVsZbótwxui^|jgKR||{ipwrytQpkCKoe_ql|XgtdxtD?tyf|tx^TqEtx|udgjF::aulPbypoql`s_tx|rdxwXPxvtyj8"Xkyc˦r{z{ye\WDa`yXG@.dlkhktdfzxyZmu\Hph\gjf{P\}efV{tdYyb_w{w~t\=20V}{lgn~ɣnZzcQY\_mVHUnw_;;h~mtwwI3e|`yi]ϫyshZyyg^UEs|}ws}bhzx~qeFfeG?fcXinp^vzgx|OJ}}ay^bA4Niups|o_srlPUozhfomSxWipr~ea{ahue}ntprtbbbkYdoRCIoz`]u~rĿehln~hoqd`WajWTs{oQctgi]Nbh}r~mWruw]hʹ{x}Nwz|gaWywqgrilUzZe>-Qkn~vvuxvy~}w]fGugdnnN-\yeot}~gazgprugfNYmtzynqogqTt]Cggqpzyj^wjkgdb_sxvo{wl^Ir}FJwrH@QaQHqv^tnzxbfcxqtztclɬu|opk~iFJjnhE^{~gkyrSbkne;=pwzǺuTETmbqVLT^^Eruoh~^|om{zTgbRR}|]fsp|~jxzun;?Orzai|r{no[t}{Z>`zY>Qep[r|suݼƮlg~~mo^NZBt^fjVo~sep\A`wygWp|abnjKzʙ®x_wwvtX^h\ZkluW_j|aegMS\s[hlialZr[gmn_UAjgT`j{y||mvva@D]}wyph||`c{wjǪinpnCXu^\guutsvyibnzyXP\P{ueXgxzʔd]TmxXnwhLO~gbo{lU{olvnnX^pgltux[ut~sxrz}[uuGCTS:[soj{\logf{YTAj~`{mon|zxš~~rgoiOVfcP1Wzan}_y~|yMKnsylrgubpt{ritz|rnhhb8lgd]jShh\fkPSteVAp~qXZ}{ٙXttq_RJUb_Palubs_[]AObVYxi^ytر}}tr}feOHuX__]eoxV_aaD]hjUNlVhxo^Ůϵc}o|ih\[^OR_mvs|t~|vz{p~vulwgLx[hoLjzw|wpxypiUO{IPY^gnwut[l`i]PIWjohz[ξâzz`G_|cVSiukqk~||tv{hk\Ru~{c_n~moəmjc`^_m\]yjemzdOgosr|_{Te__WYaX`utvhɪž|vh[|uMBGD7PnjkroowsrpX]^o}vij}qisvItaQi[L2FwuXUiq^ayte}zRDe{llqtrjuŒƭmxbyl`b_KDfroe]r{uwSi}{rLOjl`][TPO\L]`ac_gag~ko`^o`ĩ{yqjuj_^zq|@'Si`UgVOXfjsdicp~amtkq{r`[cfoteҵxfڰyViqr]ZuM@DGcule[_ays}}|rn|pXSODLn}ths|xcbfodKKg͸n:UkrOVp}xwR]ZDdxf[o{}}rfhmknyllv–y|wuk͘{}~^9QSøj[j}\.+-@:)%F&PlYq\lzxsvjQ~Y@)6IKV{fUvor=y_[i~yON|jxxkccKDJ^m}y{yX]{|d``audxn}|olA|̨}~]YW_wofxGJGUW4,PvbX_r{pPjuTdDvkAJ[hmRMtfY_Sd^ZqdxyreswSUqg]jgvkh~wnuvoosBFRf¤mshnDY\GUft|m_{juh`fȼ{wvuuqn_QtTfhs^clo|OP7KegyhqfSWxhFMjf;VSjmh|J/.Cjmnz^ajgrSy~]wlsqcfy~o}|ZWxykfktmPemOG[|yTfrw{|foowq||}Z{ϴã~и{rsxsv[:Bddm]PP]lkWbrYFJFGTJuv\NpmhM:Mq`TTYJh~uwnci5RMWvskekdi}[]tgkW}oyrm}cczm{TSUNQZvvxtoahpUSeiOq][[rKXz~o}k|spQXPgqS==>IVhlw{kkpgiqedeXCskqdGCS]g]5064IMjŧgtcb{wqmmgrouSV|eYYlwΒx{x}jnu{ntnWJTN7"9dd]jd{vgzmڸ̦yg̕hqcMVtlgYhnum^@Me~nfTXyjoqjqy}jw`ih~hB3LkwyU7?9GP^˴sgQrtaywP>SgZGFPozz}tynuw]ntymVI=PdYA5RUFPN[gd[gr̐feb^yqlhmzrX\^kyzsq^lV|jWYIHgUgeKG`aeK0:?GLMcz}ǹ|}cespxcksakn[jxtecftyɳ|txvjz`z}kv{mbPOTB62Yeajnw}yjc]Ԛzrۭts^f}uihorjDJh~vdXqwylizbxs_kqzsH5Hw\845LZbhm|{v~mlÚ}~|`uZMZgfi}~`lyy_fNntslC6?u]9Kzyytmowbdtrjq[Okx\X@QWg>2iIMK,ilin԰}|w{jepYstPbl`f*%gTQ?8;[mscn̙lk{TS],DW\XWgI}dxG^~sFqtzdm_pop}mUnŨeLQ/_N55>bmxgnx|opyX7ayteMGhǰپ|qty]laJ4\3Xkojdm`fqqaimsYwbfygiZVDp~~vyzv]axls>;Kl|e(YkYwjox{wtvİnpSRT;pnY]KMkedjpjXaW^hsz[wd:3uvjPV[r|VLXlN\uc_ol:Y}uTktflwismzH~sthpüȽč\H,k|Ɩktqm^SD3yTEMz||qso~maghinwVne\/Bqq}{`fdQVdytdI}sWiEn]hGEoum{̩osqvjr}pspzO_u|ro~i_7Pxmq{obxпy\LA}jKO*roYN`rz_1A}{eft{`]twvrrtssmaluZ9G*Ktxgbmwiq{em}nc|e=Eyr^eɺtbzwslc]WgZQ\s~}]M=RPMZkoU@85@lhgx|yp{m]bb`}_SppriVxJB,y^idaiolielͼoqhvK*4h|ǐspzfO:sbK,;wSBLgxsXoI0-3jzz]sp|~w]g~}e?*4Z`^wr`WKwPknɫ}w~iPI?1Kṥu|wnH>97QXHSfgdrw|QtUEBd`rdM]w}aZ|~YyvvQmdCKbq|iryzzv`[vaQP`~}}yrkkT4"jzpF^R?EB^PYSqTa]^YNRfeaso}[ebeMJNe{i{PMeDFQпjtnoCf~ssptgwqdGL?4D[~z^SrMD1XgidD5l}UHSVC!M~qrrcZoV`gvyo\ZW[o}νqbwt]^\fy~sfwodzpr?%Qoccèxyok[LWZMWg{uxoLsTVYAHYsoftzsTzrWd~TjZBOa`IZrQtgad{~yzvxxuxqaZR(dsШrhxZZdbC/[]aUeqfdrrV>Sfeo~tz]rjulnkfjyjdpyzMYiE^\mLjud~pjm~xµ~x{mZQIRXafqq]Y[R<9;Rhtdmsh]^V^A?{jpnMnaO]jgVhqojujOC{jr{|~vjr{~i^{etJ>heC.Ci~]BLhY[jnpSR~PV^irxxt}r}ckmsd_dkhlla]dewSpr]^WfidRry|Ҽ|~xv}~jQHM9suonm`/jnfdGjxpY;Pph_|~nxuZyn`VDPcca[®jooYRdX`PZzscr|}_Cnn]kRFRyN]Y\dl\i|~qvazykuy@gi[C:pibpktzƔ|~pYI@v`{dhba{vyQaz^`^KVmnmib`jYVhwnzuƳya.tzwM,>r]FILFkzqmutyoyrðrlHCmw\9:sr\dto~jzevbffzwtyxdtz~cUH4}Z:UY-",*?jkahoTl~lXprMENa\Q]{uebeypqxk|sWPeh~d?R|vȥT+d?doyp^[ozoi~jr]J:_zlqN7^rXG>F|^bǿ¨U.ՐR5AAECPateUvth]ewjEPjowxW{goZbJZgph]XyX{}zih^wrha|rwnWwvǹйtceCqfECGIBXmiO]PNbMNTkfHA2`y~cwYitsoiqxpQBpc~~ugYp[Hxof~lcY]EY˻{ϽaQTQDx_βtiDo|xwrzsTospwps{|x~XQctk]fg}a{vw_ybjtb{Ħ~qrqPMPVFU\vzlcsM^t`KV{gE8rsO;<-$QeizeU|lzyoqtbN]eaOd`u~Wjku|[WbUoϸzmqRDS]PNgn~oo~fHsf`QmdJ+MoOBMM4OpnhwWxluzgw|trxV[p|hcgp}vnt|l_|k`{kpjXĵwx}zXY`aGINouuCWgXKP{hKEzrIAJ>7^hhto\zpspts~tTUacS^VwvqqyUr|hppdi[hƹjn]FOVP?WV|{sr{~RytkN^waFN|cIFF0=jnjt`^zwxo~}qw_J^j`O[XwgpqatsrnRx˵Ûyr_l|\O[cS2IQȹȕ{fjaFnqvb]VA/FiQa;9G5ozu`yuxvsrefa^VUrhGBTTxPxczphmUMkȡ}TbXRRUT\eWyufWwg>jVL:Eg|Ȭ~r{myh~k\{aFϭzuxgKfP@B6<]làov\eUz^JgaITp{V=D2SfjMuuze~dW^m{T=\mWWbw|h~y_]ZwRYèÝxlXeb;&>]fZNyҧyY_i\lUhlSYTdOKM4<}s~}}rkq`hhhXvc`G]iNZaũqmnql\Vz~_hzw}spst]Fi;><9hjjծ|{dni|nvSGrn@8H]rawq^Oq|hSu_wld{ea'>T\ab^˴b|z}~vpVwunpƮ}rZX~hki?*"?_eRyȫq~caf}_a]cjkQlOQ:Rvpnny|ubjjyaGMLCLhkoov`gly[y}tI`j~z˻}hlvirdE8gjKCU[vɻΦxsydT[SrXyuC5=Vh}st|}w]ik}{VPshX_eN1GqWn`jylgta`zwwimRVOPS0QFLA2k|ͺ|{mvu_fkdUO_rYRcwyrqm~^kQgv\Z829Omcv{WQyjxynYP|hnwY^X`aXLA>VV`kǦrotnqj\QVavAUiSXKoyrhecrcwdavoru]53l}dbrάwlnbzwzbNVyz[kwlJ:dyd?+6=9-f~â~~cgRmtujd\Kkvbn|nc}j^^qgmrc[bUX68qWtUsβ|{dwb~^Ktbcs}y\QM+TMIL>LSocy_=NaAELKOW}}}d|{dofpLlHPT[Y^g~ǹ}pqpv~kvw~xssAzk{qzvw`TtnYVocYUX@+3yպҦlfz|rrSMvYeiY^_x~igpta`{~kM8Xs_?5BVSWҸes}z\grnsdzzP@WlmSB:Th=OV4>ǐϞvt_|l|_rUIdlxwdvih\e]`hec\^3>]_|qȜ|vdk|iLv>bpkflqcc}l@hhZWaCue:Ui|mЫƳszkTUXb`jhPHDX`[wvxsxf]}vEI]q_;vZnTb~Ya¯ypy}qa~dho|Ĝunkr96^E\j\KPK7+RKERy˓Ȩhk~jvIqYp|stz\iujiVzocKbOop]ig\\k|UղeXMLOQmkrgrmlrprVyz][gglcG%=|KZ:Beåǟk|gf{}xrXYz}Tao`y|cG3:VVReeM;KUbP^bhűu°w~iwu\Q|lZK}ivccj\hf^GDlJ6SQJ]HJ`|zrȹ͋zvomntrVpwij}izn|LD{^QcbgjG,dfJYC}«{ܭofn}uxwz]kb`lxnvuɱo|upw{Y<8.Ac]X?GRILR^`zDzğztĥ|kz~wdCjipHnsnq`g\s_nmvqVvTVEJfnifŷ{jdaeb{zlvwqjes{ptyuVC\vS5;Jj^:8[7G0y|Īڻcnsrowopl}si|ydwoue^NKGcmlQP`KZbhrtcziZ|TriOo}]s_~muX\Zdx_]Y>p^==yqyƨ̼w}seblllqbgryinq[ibb_WAF6OdgHHXKFAZniʫϲtįf{hQn~tvQt{xn{ZZgosebD|m;L\[UJKMfhmxxygctupy{ahyg@m{Y?Q\bO6#:^DN3Vu|òׯpgyp^`Xguuuzs[RxzokT{l~oSstdGNwVBKwuysWc^{m7]piMPYbk\g}zrosnPWt}A'/C\lY^ªrw^Omr|pf{jkqpl|tmtZOrWhmhkFRv|u\iTRVm_jkon\γ] ;>ce;9?JigOhpZXrk}gzqshir^Kgrap_J}uux}iUKZcj{{sMVjlkmVS_mxqgzѶ\TBUvpz[L=UmTVssqm_cqsWN\OgYX^T]augWmxyGb}lqb=;2GVZhroy~|n[Opx¿eUUPNE:Avsckax}gctk[ajctdTqkvQ=H>G>5Ire]uwthq[}aEOeqzzt~}}|uiPWwĦwtvVDDGD=holw{|cZsqivvvUTTXoUYTd|iWf|lXcvfTuzkqu]vnG,3Bjzm|z~o]fyex^Uexðqz~aKB?Wjh_gMXrmmzcPRSwbYlRa8*=C]bSPy|kjqr\npo}k^ufKGVhzrtzto_Zqôcf{oM1/@Zkv~niqtQOsto|tPiN^[?SSajiccNamw~{pwoiwQ59Zh~oyowrjrxe`xuzŲʨoowV9-xmfP=Sg_SLqxigihdmv\COujUPo|vywru}`QYwiIZxR(,Fcfnv|t]]fiv|KX9Rb?Sbx|qbwwhbjzvf{odgzkV^E=?Uj}to{gl{|j|jkδɠ˜a][;.1Lmƣo^dyo]tpg_d[hNI[Y<#EQ`[UY|c_ivodrqww]MfyeY]pogwvrhku{xsXGox[0!-@P]º`Mo~jlsahYFsQH[cktpysojx}{qoomr|wkJRMIQeszrloX~ow{rfpqc}ùĞè~rmpI44Mcsyλ{rqzqvsjhstuX1o_PM+Ngo_PGtkVZad^c|zpcHQvkVEVr{{moynkl|xu~fPdV\^J(2Ye±qazeb}ao]ZDlP:eqwmht{|vp{[imbqZQVS=Zww~vhtfutsppws}t|uu]-0Q[Gg}ļws_mjnVmkWMfXb[Y0Lrej|yeeopfiru{xG5OtjIdkrvlbNgvxyZ_9=N\D,QYcyhfbvsg^zzHLeq?\kqma{}ftftfo_vTQKWH@jms|wedug|t|`~p|jyE0-HNJuzu[uolJqxhQedQkfS)Usks}{pkppdq}}~rxA4FffTsr|mptp~f}Wq~mvkxUY//HZP:]eqrq`pay|iWy\YYaHa{v~cxy~mlnk\sZfPFTWS@gw|vc{kyyd{pXy|cxadP26;LGp]vzuuNYzmV\zQaue7Bzy{vmvung{r~kwl[3;Mf^sk~qzeurlk|~vhiOk^K? 5MdS`{Ÿxe_tbgx_^sfdZEVsvj{mv{uQldTR;N[dO_~|hrrxtolkWdu{VldRP5Kdaun||sz]j}~{gtu~yrieAdXE=$4Lh^nɹte`mVixahupp[<]ua}~yqxzuNp]PK[d`}Ȱzpdm_[mit|oEE|_qv||rz~~xWhkLRBFYmb]x}hufk}mrnx[dv{}njlNo\IKYu<=I=tsʣħt~q{tfP^dtjalQt}TpkNiD+dPA]nftƱ|sy~`}eVhkDQrgkvzauoehddY\PLjkc[h}}~~~vthjejdqvVzrgl\TBY`HNQTbD@6ccaӯ}~oymY_ztzg}jdjTtvYy~bmD0fU@RWN_zeu\gsMLjVrg]~vgjgpadXJ_`XR\vowt{ehwlpsjZuwsg}k[GQdQLQK^=EiW^zϠ}jn}`ib_kcmtuv}}wbvcmrDO|S>F7SbNlʰ}outp`uxfsv|k`fWc|e\~wrl7FkNPWI>burĹooq_miEiZWaeziprinhcjVObVTF^rouworhpd}suuR|~mzmimgS[`IIPMV4MdWXwxqœôqycocciYg~tzrit_hkF_{L><;]_OhƵ}o{toe|weqtvotgfXrybatp_:WmQXTB>cdmïlobr]M|X]Vssz|j}kudfdNY^SRDgdkplwnfmpbUtptxexzle\n]DMHPA8[WJVn^ǽyzvsfp^Wpn{vzkh^kPYfGA7X`NRzp¶z}xyykz}ehqtzg{vqmj]xk]xrg?JqcaZE7P^Umoŷ{{ckbS~][Tpx}zmxpzmnjOU]UYFb]_boxuiwo~fWwvvrxe{yqievaMTJO:?WM=BRK|Ļytv][jdth~wvk_eOlcQDHfZHNsrxj_ztyakkqgevsorijkf|u_@]sejXE9ULMY]tqvĹĹ|hp[mt^XYsswpuxpxdT`T^QWeW_Yrui}wv{ryZsyohvxqutxl{rW[YWH=3RIFd>Xc"WPX];ROERvXISEiRINY_nl[|eUlqwgooXtu~ns|fh~gv{vyP\_d~^zhUu{vw{utzupwgPn~nnz}tptzʮzuw~`K[NfZPuTbBX^akSeRgfXaU}\VYffwncy]Mk~arctr]hfY^xpi}q}tzkn_guxyoP`tw~}w\sntmMb]mvaspŜwxratu|yppohq~_hvqrquzrvKOPM`D]dBka4mpK`PRUDjnNJKOpJOV`_x]roTV}{uph[wv{|xnoxlburx`^f]ucuc^zsvyyxyslwp{d{W}lzuq{exhkhkmzʱ|m`hZm[c|Sf|Jk`jgakSofTYUZX^ja|jjxXKp}nxhzhm`mYtnwxs}f|ehcc^fxohTr~sg|uh]i]sfsk|mrshw|x|cs]`^c`j|upyk`dUdP^qHZpDbyT_ZY]GcqXDHHyzNMWcWwciwVLs~vnj{qkmookuxwh}vslqetdwcufzqnrt{w~{rd{tgpaynvtsv^xrZ^^jfpzƲ~vyhudn]cYnhnnloVn~lPSUbX]p]{of|]Ii~z~t}mvgffqruwv|cyz\[[f\bueyuZt|yj~{lugshqnlw{{|no{sv~u~dmzYSSok[^ulr}qxhid]|fLmdT{k\g_iQVmkL@E[hPOc\^|Z~jJTwzkq}xutaeslhz}xqn|z}wqteawky~t}eitwtvncqelewjrosn[r{kNPUfamq}x}nzkamoqqutv]n{tSNSuj\]r]q|afI^z~yz|ssu^|vizpzt}dl~|]ORiq\[rioqaf~tv}rqrke~upuvo{nupnvsxl]rwhGGOy~^YgzeqpsbqbUtec|eeiijSdokIAGgaSUlUh{\jM_~~kvzrvkVZmjh}zusn}uvkfprz~tadmxpzl}q^|~oj^zlkijnokVholKENpndis~vz{a{~nypxw|ep{{^LRir_^rbca}rTZ||uo_oj|lwt{ffuwaEIXu][opcwlbwwmms}mny}tlxsftrmnpsjXimiF@Ikd]egsyxjtnXqqf|lgoooXgnnOAIdfVVmVb}[~nS`lyymweOUjyijuwtv~ttguxyt|vZ`qqmxitie~um]axeoq_ihnZZhj^>CS|yeezpxrn{t}}ql{zrPOZ~f^irT~pg|dRo{njc~stkrsxi_poiECNry`ZhxZtwbz}rwn}kfqyn|kvsc|woyfilodVgeeA:Egv`[g|`|upra{zq}koswn_qopMDMk|bY_qQox^lTi|n}xzxj{xyXLVsnfnfyotzj}z~~rbXbvls`kt\n}mlZqqhr`cgk_Se`bA:Fhwb_lcsy~zp||YPYxkclyVzzakUh|}~uve}~t{iorwg_oijF?Ihs^XeuT~mzexw~o|kbmxjvgxzzfz}qxfimpbVg`cB7B_p\WbxY|st}lzqsy}qexpuVGQk}g]cwSm|\z~oWdy{swx~xj|ty[IRj~ldlbzsr|{o~zzqjU]sxmoeng~y_cyu|r}z`fzjnb]fhePb^bO6>Rpd[`{hjy}rtUXgzig|lZhmyaYp}r~rk{xuhqru^hmhc@ANmkZYnlSsotf|~~rz}fal{wdszgyyxex~pq`cgl]Vg]cC7A[k[YfxVxmwu~ut{xi~tzdLSg|mcg{Zb^q~t]`vvxxyqy|{gxtuiJN^zrfhocw~{u{rt~r|}}ZWcnk{wWsf}jZn|s~}wokZmsfeUZ^dUTdYbD8B^l_`o~[u~vrW\nvmpbdcpxccyuzpizumbjmoZiigcA@Njh\_skTsmxmsx|j_gxu_hzhuuxcizkj\Z_c[QfZbO7?Tka]g}^ko}xyqy~~mz|tSSazrhk|eWgg}zie{z}p~wjquyfrvorOKVrtil~x\tyrqv{swydU]t}mkvzQu{Zsyn^k{uxvwimY`rdaSSX^VPeYcO:BXmddpawvž}wz[]mwosbadlyhh}yyohzrg^eijYlggcBBPif`fydYooyuut|ve_jvwu[vhsj|xwvm\otg`RW[`P\cZbC;F`g_extUpztx|tyyeU\rzmmyxPy|]u|sfu|p|}xhkouhjzlv]JVnkxc}|pavujjugjovnptkYayoudlSjtx|oevgq{udbfka`uhtY7:eujt|Wvfwyjr{|{¯y^cLVizy{jrz{~y~oazoafzyopztF@j~Smhyw~{p~jd|qmryrryv`h~zbTUdoZVUYOF?^eWLTmfdXY`ibcwgnV?X|{zsvxstu{qu~}qvjRHNTU`}gQ]iTE;TVNE>FNQI`WUV51Banythymzxzqtmdbnfpq|y|r{u_b@1?cijxqcjmhSacRrtvy|yjXVobUJ`}poqujurl[av~aiqsgUV[^Xr}ja|yj\`ysmabjrnst}pVZpv`mn]ZezZT^olnwY[f\ki]X`d_^w~xiy{qf}|sjosuj|qfhH?Prx|vo~ux{wo{jbgdUDHPYX{{d[qfVEH]VNBBHPKScP[M6;Slwd|oq}~w}|}{weuyjhoqmx|y{~ywvutephU[A9LsǮ{wkprlXfhTrxx{{whVSkbYRc|nkmqjtrs^br~\xa^c\NQ\efyrf{od^wwpfbhnoouwx_aujU`oekqj]bruu}eRrWac\V`hidw|muvhu~tghkndpo\gRHY{}x~xqpvr~y||\vVOQKAGVdhoatq_RJ`^UIDHOMQdRWV@DYujswn{z}}y{o^myptyxqz|ww|y{yjhgdYh[P[GG_ȥ~xputjZndXvxzzzrbQXk_]Wnxkjlok~sobgxtV|UWXRLVbjjnpzpai|vncdhok{o~pbm|˻kjtd_cgbonzsa_lyxrznquvkzsurzzSSgbtgxuch{|y{|muagvo`Ynj^WXuysheiop|}{h?q<8>BN\c^msx~unmWYtyt~hnkSRbwh~woi{©k^twmklzduurjlsumu]=?g]PJ1/AYhy_rvktwux|mmz[b|rcsrd][w~tpsy{}x|upfJzzl\X[[S^xgz{t|pfwtfXYjjiyʦvuLRmͼx`QIdlh_\`fgqq{{ebkutx}qOvxzvmlolanrrdpgWILa~e]hxmxw{iv}yzmlndabX;iyqeQSeN]ttvtrfXShhZPEWWK=;GZguqqoVP\oymypkvV\vsh~{lu^eaP@=Nl|ihqt|V_kV\`_bheXUgMMhn{{mzzh`Tiyxrnrw{xkmtqpqiEQ{xpa\ujiuyhs}se[bqw|tamXD`pjm{vncbeij~{m|p`bmrtzyYHswzvpqpg_wyl{hcnbTGK]vsmvi|y~sf|~|ukllfecP5i~p[alRcwxzwsgYVlh[PEVWM>:DUcvuuw`Ybr|j}uz~}{jfsUUq}o}{}quu]Z_RD=I`}|v|kU\Z^``ee\O`YB\lustqh\^uyummqwy|lfknlooYAx~zo`nydyz{|rgvxnb`k{}q]WbFHi{qz~shgjlqxqoceorv{tRSssurorphd~xo|~s^Ze]SLUizui}v{~}o|~dy}j]\_\`e\Cowfhx_b{}~{wl_Yjk\TDNUNDAKZhuzr|kagvppsswxxyscZjWNqv|}}}twhSHTRLJWn}vUzfY[^^bbZLW\BUo{sqwme`t}yplnsvz~k`bfgmrfNv~|uhpks|y{tdovphgq}yxuroeSL[HGox}xlijmszp~qcclpu|wXZtqrqqtskjzowujVS`]WUbu|u}hMexnxb]_bjiQC}}{wuy|cUa_SFDJT\ouamqcco|}`~g]Xg{s[EMR7Gbn{|thw~_~rmx^DKNG@BNasp~b[^jv]\bDIdnw|}ukj|{qmdt~vqswzrzuXxgh~k[_|eimdYU\hutg]\cr{s_ZcHIhxn{yrt|gj{{|yzxfBUzcdilqvtlsttzz{v{soyfYUZgrqdclPLgr|yx}xlxvmklmt~jk~zx{oMe{~{nv}zhdy|yhkmcUMPZg{}ornqz~{ofZm~~e@Xs_aglqtphsjn~oa`txvtflofYSWds{la^`jtvnryZXnu|y|}r~yy}i{yuurqmdZe}r{~nqthXLLS^rzz~v{_k|[RQU_jnimy]Voy}owzq|{tLW~fekrx|zsy{w}xtw~~onxò{soqxyrseThptvwtopxuhl{{sifgjp}marrpyzTSpnsy}{qq~v}qz{~us}xk\WZdr~|p~nmqyz}vl_\q}ZCodY\ciooiexxaqug\broqoiuvl^X[esxrgdemttq`fx}|y~t{{hrlllki`Xexjysw{rbVRV`rvu~wzZd|YMKOXchgn}fZp|}psv[Vmeipw||vws|}uty{qlt~urtz}zuz[dtxyxvpluztldqxtib`bftt_gtrulOq}jkotwwqk{uwzmXJ>?K_shl{lxkx~yqwpe{~ymqgkkvztva]~sruvxtllw]fruq||ujantpiglwzwaJKS[cea\lt]h{glwv}h}~ubKDkxwvxuikwxqhfjsu|xygexlnu~rUYyjc^XRRW`m}myvsz^NwdRYm}}qjzxaowfZWeut}{ewpprvunfqvYYlw|zmZPpaXOF=H[MOn~vlkuqbZGFRY_ciovsmrx~kIJwvWKLPVYTNXtsqxxwst{}źzw^bpy{xmr{wyfTK^~agmhir|yWGo_IEN]oyyyxkSecRLSVVhtslgejtg}osyf`uƫ}zZ@guksx\\nolnz{oiZ_fd]]ft{EDdgrxcP>2;H8Ci~x}v}unpt|su|x||xb[Ug|y||w~vQ^plmllnoq|s}gN>=NtfCQ~x\SV^gnnktnbtzyvwz~z~wuyg54_fat|hXkw{zwrpt~}qpyxl]TVgjwyy~sswXBMV^j|y}{qfbck{{u}}nP`wrv{~|unvrkvm\ZfmligjupP`g[Z]bd`\j~pl|}z{sGOvsgqwk|}tkcfrspvpuse]\ezzWdzYLO]owenohbahutovula[[ap~uwxT^jhsu}n]RPZuɿ|T[mbadhjfaiweYkvwtqquubZ`a][bph@AijUTct{nmt`Sj~xqswvlkw}yoihozcmsqlkp~wqs|}o|}~wQHlrSCDMXafhts|utyvmdlphYLEGTluv`Szq\WZbjmko}fo~xvz[?[td]nyw~vnkrzqjbTW\XKA>EXvhPn|bXX]cea^hiLFV]^_biwxv{zrjgjt||{bz|zt{}ui`]ezbd`JA@BEEETkd[m||vpklu~xkckqngbbiuxit|z}sJ>bpZQ[l}~||dm~|upq~|x{~{~a\hkihlvo`WW`r{pw]>SugPLS^fhc^hmVObnsssrt{xseahh^RJJUm|]jtoqw{{xqrIhui_`l|~tkntslfgp|x_j~eWSUVVV^fUCKZbddiupWasknv}ot~umjlpka[QGIQSPOTcyqiiihgnwiU[ippllq|y||zrwv]BIqyidjvypt}{vv~~ae|`OHHJJKT_SAGXaddhsmRX}xdZ\dlqt|io}xrqu|{soh^ahje`ak{z}mhjmmnxs`fsxupos}{~{z~qx~pT;Gm|n_[bqyorxysmmt}v|cnn^YZ\\\em^LQ_eebckymSZ~ydYYajpupuywy}zpkbWW^_ZUV_ozvtǽwononnu~q]_lsqkhksy}y`DHlr_VYes}}vklswsnmsypps_USSRQW`V@?MVWUV]lwZUtl^Zajqwvszwy~wql`]chfa_dr~v~xpdaceejvvb\iuxurs{wow{yz|zq^A4NqsaTR[jxztyyuw~|ygyk\VXYY\fkYKS_db^`huq[hnbbiqv|qtvpnptqhc[QRY\XTU_nxtqŻ~tsutu{|feqxxroqx{zzcF@_zuaTRZgr{zu{{wzpaxyaQLMMLNYZG;ERXXW[fwmWf}i]]dlryqv|wvy}ypkcYY_b_[\et|wsxnlnnovwb`luupmpx~okswwxyvkV;4SstdYXbq~|tx~~xuwwcthWPPRPTZnyrpikostqr}tyabq`WX[^alytfixwWazlqvq~j_^ab]Yezsdgpurnmostokiccmw|||oAU{{meeioryy{nqw}qduxuupcV^~ztromnrz|y~ijpb\]bfkvv|jUVwohloh_dpxxgg}meb`\[dy}x||wsruz}zwuqt}}uwusc\\`diq|~sq|}uqpzyhZNHQm|mc`ac`^]YYajoppt{~rkmpqu~xlw}lb_beiozys{~|xnc_am~w{yo{}qjhffkzskigkxucYVUVX_e_W[ejkhggjkha]\`n~~w{}ryzj_XSPTdz}{|~zyvtw|wqg\VW`vvrtttuvtmaW\o{ug\TQPOR[jqrw~}xuux|}{zxvyvpomlr~qifgilrywqs{{y{m_UNJLXl}}zunid_afjkklpuwqiikllou||uwvkggikou{ysu|~{zywqg`\^l}|yqx}xvutu{vojeben|yngca`cfb\^dhihhikmke`\[cq~~xx}yrwznf_ZUTYdnx|ywvy}ytkaXRS_t~|zywuoe]`nwtjb\ZXWVY`dhq{{wvwzzywvtw|vqolhgjqzxuttvz~z{|y}th_XQMPXcp~xqljlnooopsurkijjihikoqqv}smkklnrvwsrvz{zxvutqjb\Y^l~|{}zxwuv{xoiea_ahs~~xsonnmhdehiihghijgb^Z[bmx|wx{}~ztqwvnhc_[[_go{~}|wsoh`YTU_p}zvqicdlsqkd_\ZXWY]afnx~|ywwxywvutuy}ytrolkmt||{z|~|{~{x{th_YSPQXco~~xsoopppoopqplgffeddgkoqt{yspopqtx{zxz}~~|zywtoidabl{|~{xvuuw}xnfa^\]cmz|wtrqokhhiihgffffc_\[^gr|}~{x{~vmga][]dny~}xrmhc^XUU[hz~{xtnhgkqpke`][ZZ^dlry~~}|{{}}yrligfhnx}|}~|~|z{zy{zsi`XSPPT^l{|wsrsssrqrrqnjhhhhkpv{~{xvvwxz{{yxyzyvtqnkhdabhs}~{xvuvz}yvqkc]YXY^hu}zyxvsppqqpnmmlkhedejs}~~|xwy|{vogb^[\aju~}}}zxuqlgc_[WTUYcr~yuqrvwtojfca`aflsy~~~}|zz{|}}|{zxuojfdcejr|~}zxx{{vtutnf^XSPPT\iw}}|{yxwvtqmjihhimrw|}zxwwxyzywwwwuspnkheb`aeo}}~|yvutux}}{xtqmga]ZY[_gs{ywwusrponlhfdejrz~~~~~~}{xuuwxvqkfb_]^air|}|{z{}}{ywtqmifb^[YY^gu|ywyzxsokhedcdgkpw~}{zyyz{{{zyxuqmifdcdgmv~~~|ywuuy}yxxwsmfa\XVWZ`iu}{zxuqomkihiknsx~}{zyyyzyxwwwvtrpmkhd`^_dmx~~|zwvtstvy~~{xuqlgc_][\_emx}|zxutrqnkhfdfjqx~~~|{xvvwxvrniea^]]`fmw~}|{zyy{~}{yvrokhda]YWX\ep~}||{xtpmjhfefhkpw}~|zyyyyyxwutqnjgdbabejqz~|zxww{{xvusojd_[XVVY^fp}}|zwtqomljklosx~~|{zyyxwvuusrpmkifb_^_cjt}{zxwwy{~|zwtqmid`][YZ\bjt~|zxvtrolihhkpv}~}|{zxutttsplhda^]]_dkt~~}{zz{~|yvtqnkhda^[YWW[alx~|yuqnkihgilpu{}{yxxxwvusromifca`adipx~}{ywwx||xtqomkgc^ZWUUW\dmx~|yvspnlkklosx|~|{zyxwvtsrqoljhfca`adjs}~{ywvuvx|}{ywtrolifb^[YXY[`hq|~|ywurpnkjikou{~}|{ywusrrqnkhdb`abgmu~|zyxwxz~~|ywtqnlieb_\ZXWXZ`hs~{xuqnkjjkmqv{~|{zyyxwusqolifdcdfkqy}|{ywvuvx}}zwspmjhfb^ZWUUW[ajt~|yvsqommnptx}~}|{yxvusqoljhfdccejqz}zxvtstux}|ywtrplifc`]ZXWWZ^emw}{xvtqonmnrv|~|zxvtsrolifcaacfls{~|zxwuuvwz~~|ywtqnkifc`][YWVWY^eoz|yvsqoooqty~~|{zxwusqnkhfdcceinu}~|{ywutstvy~|yvspljhec_\YVUUVZ`gq{~{yvtsrrtw{}|zxvusqnljgecbbdhow~{ywusrrsvy}|yvtromjgda^[YWVWY\bjs~~|yvtrrruy}~|ywvtspnkgecaabeipx}{ywutsstvy}}{xuromjgdb_\ZXWVVY]dmw~{xvtsstvz~~}{yxvtromjgecbbcfkqy}{ywusrqqsv{}{wtqnligeb^\YWVVX[`gpz|ywuttux{~|zxvtromkifdbaacgmt||zxutrqqqsvz~~{xusqnkifda_\ZYXY[^cjs}|yvuttvy}~{ywutrpmjgecaabdhmu}~|zwvtrqqrsvz}zxurpmkheca^\[YYY[_emvx{~{nktjhnmukmjijfga_kcmnx||sslotv}ww~lhhfi\]XVTU]atlP8\aPku~}uquwjuq`^{|{aTPdk^I9HR[YVUTt{]lrxKLZekgt~|dqydo~ywydbih^`s^YqRPer|¾yqrmogn|beQIqm\YGAQbrkdajwosu`m|iwsivdmr{}rutnVpxogof@Hr~tx{pqubtVsYcxl~iczmei]`uoVMacVubqd>vpb|wjbmrvuhVpswt}wfNiJB_e`edPe{shl{~jl{~vvw}{w~_~gihmZ]~yzwgplru`ny~zq|}QdTprexr[_czwlxUaRfurdEF`_JNgpX=f[MyMkrfuzhyy~v|wkwTPVYaApvlzqird}lsp`lyifueznqtrvbOf}rw|hdrIDLdzfDrTapbzmƝ|fq~s``^kuc]c~^Ppt`]mnXwja[wUH]om}rwk~u`viyr{{{vgz\ZVLTKbW}wWuswnr|mevzzu}crefRjt\Wphihm}wzxqc^cȵcpVFgmp|ljdv`Mb^djmv|^VgVCBU][G`RRyXtPWysstzntsqpxZiR\PNyzlijv|^qmd~wz{w~wyxyb}mnl{SRzyfas~~s\Xbg[Hi|^zo{n_\kv_epo^}sylph]_sbkwxecvhQtbPaQ^iag}tm]{uauiuwyp|xrgm8BOXO+U||ojhvn[zufhqqs[PYlqiat~ixhUvT}sk~m`R\l^\XjQtfwYRwpWKZc^@ANZjsvXMtylcpveijhty}vtwpƸpnayxtnYUdlYoxjy}ljqv~qqr}nzsajjwRMs\]daW_dnpYU|feRvi{}|{v~zy}\Vtyw^WvvmeVjwck`}iitapkESfia~zlgy~wi{z~sozAOVI9.U{a_mi}lxz}ysr|q~pr`fvugP`]zy|}h`f{Qwz\fnvqovmJ@|flvyeIStw[JRBijr|aIXqqg]]^dewtc}nnx~Ȱws{foxzwzp[PdbOIuxnyywg]`~rvaUlvpG\olhZPFavcg`mq~uwraXow}{{cgvr|bd{rdWooYfpn_x~f`LtsvnF]quuuezhukd{oyxv}u{{dfn[C,;gjZRMTm^tlvZp}~|z`h|agT^vt~spp|]vwchuiNr}p}iVo|ww~zumu|lekruyqtQas\bQQYsvnm[[nbUdtU~[wwor{k_aVBLpxti~wmqylNzekMQohXO\X]zc]Iehy}tlxc`xq{trrukrstwon}}w›rZapn`RO{~pTx|ztJ[pyo|qtqft~z{unf~|{}d|Sk}`BOo`=4ESSHvr}d}}xgy}sXry_jdkw~yXhsZZ{hq|{uoz^cne}q||}~l_ojnh_tc`SNSl~zaTjwenMLmydlo\u{}~~}bqtznPIXeirzXx|s}ilobk_xxi\Q`UOqRawvolyyXp|mjx}pk|~~puWmy{vbioofsxpcVyoxo||xS[ohqsvz~zpynwxV}u{iY\h?6862Rqeewthyygsvecvjg^Zc|xx}i{nT}ti_`eofUxwoy~el[nrtWzui|rg^hsm\by|osZFl[TZy|q]ayoqgzp|}tvyoomb\^tXk[v{X~jq|{nebOWf^Qi[qwvqTZywneflwz}sgyqo~~wztiyk[hp|upoqmgdnQdylw~}^cdKZckv~kftzstg~mvi|uYheVSI;:`^_]elgsjjv~uXY{vhjtsdgxzsv~o_`qej{q{tkn}wwpP{o^qgrr{enouyqZ]q~KZ]`kefeaTdjSYeq|izxhowinxllvGZzZorhusq|yfXuodhbRWmew~wPHl|{zxljjqtk}qrUq}~sY}km]pmu|p}mi}rt{pYUd[R^vsmtyurz~wsqo_}ujwyrennJMZZO_lWTDedxvjuyzqqoishvt`btuv|isi[gq]ztdwZnzosjtiZsSRZszq~~qkxpnx~|[p\fn^bqcFR}mZ]_[]zvwrmms{vqnt~^X|TSemvy{~yzs||r{n^dgde|msolXg~|po{wm~}|vzvt\yiiy{iotKl~hsgkqk`hw{hg{}vnwehaVl|sd^hv||{a}Zlyx|p^\yn\RFC\phSQsx{[c~vptwt|cmxl|xxupu{orv{zqmrl]wvqjo~{pdIw}^\^bjz}utenxSdpxjVanZDd~^NSY[d{y|uuuwspwXpa^a^`m}k}rzgdy_YZ]r}k`[Krxrvtto}lqww~v^cqo~{u{~mjl_bYdieZapuqq~t_tdZk|tosiadkr{jjvvzcp~}kjtqgum\]_\_tebbYyzxxn\_}y}jptsy|ybj|_]}~yuszljkr{|wrbq|~v{^|uVTYcmwtff{}|tv~a{jrhgoeNOsxm]KCJb~zte}t~zrusy~{Ruvappjfkqnhn}s|~v|yuqge|l}qOhymqc[}{xxtl}py|omx~dSxy]SUUOWsd[ivrkxrv|ysy|g^rylfud\{hrtz|m{hkzjXsdZW[lqfIclOE]~yyc{y|~frw{md{lvjqzxmoystqjb{xqoWvbXYampg_`djxuzs`qacdccqzbJP\aumho]vu~w|{hhbgkrz}sa]i{|}~~hehv{ni}aKaxow_qulr~|vj~lfnlXfihlaaYKBQrwbWSTg~kvrpu~tdoxqebzxzl}wqf[uyiammY]}vpigv}}fx|lQLlv}vxbYqwjiJ8inafRMRUYivlqyyzY]{^jvmqusrpjehqxz~`]{jkvf_\WTciRWc_tvpWVys^Sjuz~yxyeWX`gnzyjUj~_n{a\npfr|ohfqplvcZjl[ww~~plx~~hSm}^_S?@FKN\nn]MHIO`|tprrk~gvz_a``dmsty|b}pwn[UPRazpXVf~su]jp]NSq{oz~wjcht}fLxW]]VTPMTntg`gn{~dgq~oiskmwvhhou{cv~zo}~xpq_Y_b`fzymg_[svhh^mttuundjq{yrlhjiimollvrZa{ru]Yjh\r|qor|xtmvkeq|vg}{~~|xuzdh}ddgRIC?CYyy^LGL_|xgoY]wºixkaog\`o|umsk\ZYVZmiZfouz|{\ey~ud]mwqstst||xy}r`lp]tcIFQYe{yporzu~o~xaq|xww{~|ytpr{i]y]akxvk[ST`yujhoyfweYi~xh\_uz}`sykkghq}||~|if{iwmb\SUpslwv]oyhl{yuyztjv~}}`vwlfRMLKM\qztjd^\fwj`lVSju}qjqvlmj]fwyrpx~jnr]VVZg}slopmxqf[r|tjdo~iz~xppor|wf~suTR[SOioghrzx\e~qrpx{vy~~rlqzoSo{`_baco}qlfbjxqr{dPlmmkae|zq~yzg{s`outsuuu|wfgszq_Z\`huwivz}fm~|wrwkmx|tnipv~n{pyf]_i}pnwdgRH\jmg]V\sypu}sotyzhg]AAOjyi^\jrmzhftvffz~wlh~|ye}rqxxwz~z[neD>[y{snlikwtu_juy{zrlt{|gv{vnllr~tlzbgnruyz{u}qb_kyxk^\anzq}hevyuyzfYqw|iV~}vtuuwtx|yxr|iZz|l`bq~ycSXdgruumPZqzzsf]d~yqybdxts{xejuwwjbiql^QIJXopbodHP_ghd[SZqy`{y{|p]nhn{{{z|~p`VRWdsg_ucGXv{kbadouulSqyvoy{|r_s|i{xtvs[Tb{ujvb[o{ypd[^qyx_|}sopqtzzfrzzzz~g[rsbZavuq{d\p~|k\azygrlazrqty|dozzygdm}|{xzth_`vrbndakqssmdbnu{new}}xvzfh{ilm\VW`ooW\gUZlrng_X[k}qxv}pwtfhxwtllvxdYZfwrZb`N`trkqrb[nrwqxuvxzpi}voltt_drvyngzoZfw{nbbqvuyomqyzd`q|}z{}{sh_exzvrt|~gdvg`q~|smnx~ouyg|wx}xbqxn}x}~p`gtlmxunpz{^l{_Tkzkadr~t}|{xvwa~zxxtjdzynu}pa^iviYdYFTkz}uf[]m}|nf{uml~|w{v^W}vrt}|topyw_`hQK]nz}oZ\uwuwuj|}{}}xn_Xp|ww}zwuopjkbVgz{rmq|wrsyq{}xad}imxxtsqlaSVx}|zsloXUk}yonz|zwwlv}y|t`ztmu{wrtd\]wy|ytx}ovbNd|zorslisphvxnyuxygn|{n_Udqdpu[ceNN]hlmjfhq{zociraryus~kX^o|}xps~qfmYMZgliedhnq{zeg}wl}z{ys~wsvtmjie]Tc~voxtw{lcfwzl`l}{qr~rdnzm}yomzzcOVenty{||~~{umcey~qzr^fs{~|uqxsk}uzqlpzbJP[bgihksxrmsuhlxtu}rjos{wbbzvnxkr|ob^isld^Y_kqomnsxysf`tu{ytwsr|adqwunedoys}kwmjjrxvwib^_cghhlquuneh}}s{vpd`i~~jowyulcbpxtyf[ZeuyyzsifmpdW_ptjZRdthy{z~wi`anpjuopwtvr^Vatwgosnmljf_[^gptm`Ymok|~vt{pbi}|~rhfpr}n`XTYeol|}vrnkf_ZZbmsjVXuo|jbi~zrgl||oo^UT\jpi~tr~ufaelrtsmfmps||~nel~zz}|wofbjypxedgaaq}{yqf_^dlqqkeqwx}ptndeq}yzoecjxth`_gtxuxj_amod_cfplwzqmp{tggt|~xztfl~qhfhoy}|xqlf_\\`dfefxp{xokmv}ik|zzlgn~~yj\W_o|vp~xof_\]`a`_hvu{or||w{}|z{pkqz}}~tkdbjw~styxnqvm`]emlgmvmlt{{nj~zkchtzuph]\st|zod^^bfeesulrws|}wlx}ohmx~|xxmhktq{qha`hofYl|wnkls~}{~{ojwpdpzrkjo{}wstzla]^_^ZVaxnknv~}zzs{{vxs]Zgs||oxuz|pe```]WVj{~tr~|sm{xxz}vneadmyyuuvzqacprf[Ygzspv|}q}yzzusx|v|}{sh_]eswu{zxrnkf_WXo~|wu|qk{}tjr{|xw|xvxxnkijoyw{|urqnfZVjorsmpx|trx~lox|{ywwuvu~}rhccir~|}r~tqtvhdbcqngdelplaYesrivyz|x{kchm||yqc|xuxXcgZ\^ZRZuusxk}yup~xuv|vpkt{p~zkZeRTdkfug\v}vnogszi{fn~s|iw~|z_Y~ljUdVJipls|}pm~|z\ijpwxxvZi|{urspyx}|i`or|n}ymniqlh|gP@NubZpuy^RzxwhijbltmajNMOqn{Wi}lwlzq~hBV}{ylXZOZpxglqynjdy{aodxuyqZvi}y{bmw{{~{ldmaf}}tyqy]Yhm~v]Grpw^`mmtsptf_mzprwcfm~{ppYysj{lura~vy|tyux|~zymcdtzz]pbk{QLNi\{uNhq~{u~ykernv~vs^jTrvqgoux}vreKnskctldssbr}sY]bLe\cXjt}sRl~{u{shfzou`turdvZ^ZLne}vesXlt}t]`sx{}de{d}je{kRRgnjtJonxw~iqpod[ew|oukJjWBA_novu~L{x|umlrvo~rkWcr~rs[~xxncxoQpzm}bxqb}}_`nbUi\lnh{^cqffwubXmrkjzyx{}ypo~vnmsv^Yoa]Vwtonekertt}}ipgqivqoWnsRQkq{twhysx}zl}}loys`V]aet|fbPnZK[r\isYoyyrix{mrzdggn[qs~zxwj{zwz}fawl~oSSwixnkjZeqdle`Ppk[bqZlx|oy}ljsx|yy~z\at}uj}~oeXcU\znawjqjqxywiqruyf~szhe]_lfmy_lnVwx|~|z{tr|~w}~tsdX[dknj\YJwpY{o`z~uaspkpwuzoru`j\Ygju|yx{maxlcuyhazqlrobvrjfYigzzWOdp^|Z{zqt~vunet}y}ijcqh}fqnUbNS|w{ov~odn~vlwqu|ycjtdeddQku|sUZxxwkmttm|nusggvugciu_[n\~}jrey{{}qgozi~cvuZg`ezd[qwq{x{yimsyj|fh~okx~y|{n^x}i\TpnTXyjlV}vvwo`kw}{lrvsj{zi~~q}dozUMShwl~}z}|przoskw}dgqal}xuhnzjj~efws\`rq~wzz||sq{uzoypf`auxz|vqx{it{skstvxzco|{x~|ozxgq`v\NSrn^r|vz}vyzas~viMdxcwypn{z{fXPa|rjurorsvZysuqqx}ihnyvv~srz}yypvdame]Zpg[try{hwjywnamuonZ[scqr_g~ndv{ht}u|{r}s{iZjuopfnvtuvluzy[gmmvpw{sh}zgt~orfWMTvux|w{v{ttlsynprd`gp~tczjtl`XiZojl}{mf}wyvh|zcfho~wpzsu{q~{{}pohjypcUZnlb{x~y|dzwoxwor{quonmvw]gunlaeyzl~yzxftlxy{kjnrpkp`cej|z~ox|qusnp|lcz~utuy{w^fjbZ^zqa}{wvxzyhiuw]]rOcxnv}z}~xhvywoeou`cerxuho|ui`nwu|}w~txmzy}ml|qmvjWDRwqwz|pqutwvcps`i|ravx^oc[nrw{xv{v{pnrxqvze\cYgnzsoqrg|}~}{ssvzso{m}imh_rvtd^mxr{{}w|r}kkv{g]}iKgujet~yvzdjz|tttsquiu}s{|tgswrp{osjrms~tr}||y~y|v|sai^ZU`tt^iovvupfzz|ym\gxyrurc}w[b{|ywr{pqyn|z{vprwwn_\jgwkgi}~{iq|t{opp~oo}pgtqstbOarvyt{z}ooxzxprmbpj`io`bc}{}flpp{q}u_d}qgysx~mlhcxrh{vw{uzwzs|op[atthMShnez}tyx{~nwyvnkrpqprpnadztqfsszz|qn|~zwxm}|rnsqiroWlqlqzjot}v{uo~pxwf{}s}wwoinlqfr~yfv}}yyuxzpb|kyghwy^Tcpenm{sh|iztcoztv{ion}x|rbkiny}tuyzquxuxst}|pboppyf]LWoyiotin}yv{nsggi}rbd|rho|iddv{}{zx}~z}ll|pw{p}oXllcetxeam~w}w}s~xwx}myxxnk`z}l^mztsqir{~typvl~xcjiYZqxjgYmr|sw~ssqjdvztytrlutgstsgxltsv}yy|v{szxtt{i^hbgX_or^g|}piv|t~yvutvxyvopj|p_^olsyu~kty}tztiz}ztruztjokd`mp[mqon|sy~r{~~p{vz|jfwrzrp]jwwwyjvzzy{jzup|||mc\ogbhq\\br{zu~ryierwxmo{yspuuatxvoq{wo~|tznttvpcbTjkjcR^kru{lxsj{louqxwhjl[^vrqatxx~~|yv|wto|}vv}jp}i`pmTeboxphmlpzxz~w~rw{yw}qlzpwkr|wpoxyv}}~vo}x}ctv|uljewgUTecpors~w~{mj}rowlqpjkiszuo~yx|p}{qwpwl~k_be]pebUVtzdolpuxsz~xwjy|pl[mrmnvhdjiy{}|{}yvvnv|ufqhl{r[d[encof_buwz|yuywluv|qhcWw|`tuo~ugtwx{vqvt_oyryvw`aXOYpmknh~zzzo~rffvwqpxv|u[jywskv}m|w}w{zsmvogcZI^f~airfyxp{{_f~~{{uad`X`\obQQb]efewhsu|{l|v}zzxsux|z{u{t{vo`Jbpzjfm{swuxsthkdgvi~xpxn{quyxmMa}m[MD[VRW`S]Zfyggpu|~|}}m|w~s|w~i[[^\xzbt}e]knmvgzrp|vdvjqtgYTLZwgpz}|twkqls[aqx{oY_RNVcX_V]yvtn|}|n|x}rplqy|hvtr}mYKGDemwr}y~wy~|xxz|zyqk[Tyyz{w{jquq}u]cag{vufl]iaSSa\ceVfhvomxup|~stl~tswkuqkbaTiwmpdclthpdm~wnvetvipc\_ePapxuox}yyup|t`ZVuxyq][eYW]^Vkhtnoum{y~|xod||tqpxoxy{pyoiWKKINllwuv{xv{o[`fdqw|swiz}zurkg[f~xw`f`X]i]XZ`ydl}{mvqsw~|tq|z~}yop{vi\\Vmxernffndntuyusozmjv`lrmWTZmnkkurvte\`[qwnn]g]TXjkq`esozx||teeb{~~qzq}zz}}}yutX]WPJNIg~{|yz~oryonjpe[]{}w~}yrx~zrtg_bc{ykblb[WY`rVdwsnpu}k}xo}~~{wq~sx}~o{pqe]^ci{xonpcalrxp|zqwwsup^wsri\bbS[twivuoog^_[jst]bbckl\oxauz}{|xwogeqr~opoyt{t}edjV\VMFNW|{xwl}yuwsn}i^hmaxyrxpq|}}qtvkddhlzohcRZlbXpgtpiqsrvrdy~|ojhtw{xnmlf]XPn~}gmkkuuynf~wxwtozqyv\qo[R`c~s{yw|lrg]X]gvxmpzd[otemgqngststry}vsmpzux{nvvh_pYVTPS]Sazmnzz~l}enxo^[Yu}z~wkwrqv{z~pvog`ZXwzeargWammmVkrnqomuuq}usjdges}|zoqeTO_\iz~r|vsqguinuvy}^yccfhfdc|z}{tuklebgitysktsggj{~p~~if}qz|vopmmxsopvq|xvyagkXfgVFR[nlzvzvz~|h{ure^\\_xozwsotmq|z~vteVQQfyxjfkmj]eh\tpmotzxq~filicc_w{zz_agfRNY{wssjlnkyiouwlqojvqjdcfyzy|xpruoulutng^ayq~rgo{y|qyqvso{wzuppjo|w}stsmq}v}|zuwffk^V\ZNFd}{{{{fihd][Wq{~~|lx|{v|y{he]ZZ`dxu}laadcp_ewt}~w_pqcjgbajvz|yzerqlfVZ`ZXql{uulkpno{n|y{of{psoigdhyiv}soo}t~ym{wwk^YVe}ttu}{z}ytxuw{|uxuyth_\zx~pswy}{k|yvuukoZecQJT[t~m}qj{gggb\_c~{}wlzy~wow]`efdfe}tngbchbnjexrtbfwbdiorob~zsv{wivyW`ibTQSp{wqupllqsp~uysynqqmc^Xpyy{l}npzutkha[X[_|~z||sn~yqpoe`hrk{y{xtq~lrz{~mUsqRRX]_clyu|tbwo`efhlpx{}m|vrvn[sleljfgjyqjkecgfrq{urpti^ukmxoagu~{vxy~xi\xkbZTQUXqyttqpx||uyzrwoni`WZawtns}~xrutqvt[^][Y]f}}xr{hro~s]itm_cy}qmonr|hwynxu[f]Zdcabfwyryn|z|ldyjiruplfutz|pnyytvgokjjiffcwmnjhowzvn~wusrrrbzicitmcj{{tujxfSVUSRUf}yzrsj{zqm_^^`fj~w{olpo}xlfes][\[\grwropz}}`o|qjaholkw{rrlkontuzzrbZwmadc``_l|o{zt}}{|kowvtka^^u{rpx}}}z}mz~ijg^SUh{wsyy|{x}fo}xvuy~itoore_emmzh^oZUVTRW`}~wvv}{jmt_dkmjjn}spkjmoqt}|yq\nmZagkdYd}try}}yxvrketqe][j}o|wpqmmtzj{|ru}nk}jcd`WRPgwtw|~qwpjfb]\_xz||tpm|{b[V[c`\x~{wqs|go~|lgx^ckooo|zs|}zueYn`TY]_cdr~n|vw|~zfe~qnrqlkk{}i}pnmjlqu|zwus_fxkmgZYgkxxx}}}z~_tqic_[[ayvw}qssy~uyz{zfwv`\VPMRb~}|}sxp~vbdc`^`q}~|uw}k{wdrcXfgXR^vu{vqqow|j}vyxbuokrspopz}rr}p|urq_Yoc_fhc^[lymyxzxzmrwprpjd_p}~zqmnnt}o~{wttuhpeWaleZ]|rw~uwg_a`]]c}z~ynp|yd||ghrXPRUY`i|xxx{qhlzeadfiqu|zzsnmp}w}qVayi[V_ghgz{txsppqt|}|qatrrtspnp|vvt{|qwx}xspojYmxgfc^XYc}yz|}}|oonjb[cywuu}pvx{~z{im}ywvzw^ilgg^Z`ko|tbtl]`bcfn{ply~rtzm|xcUf[R\aefoy~u}~wzvmmrmnd_o|wwz{{wsmhvzlfmx}xrzuofiw|idoxvz}zrilsng{pnvvuwzrcZvqyon}fitxoknvaX]_nwjkvy~xtjjdchotiaw|yy{yqarvbm}xb^mou}ywicbiwh{n{{k}vt~nmoqnhu\ajfamyo~io{n|rsfYMMcrlbum`nvzm~~vysyxsuvwupbafZ{ePTV[\MmZLZffZQiuvl}r{|l[Yqq}ktvv~jp||qrvnu{{zkmVdb`dSoc\cosiVg}omzs~tnorlrijttfUSex|ktbyq}{zm`nuwobUld^[J`YUSfnhS_ufzmzzuztywtzl~sfdh}wrs}x|w}wryy~yrdv{|n_}wlfXfkaWkxsaewctnsxnlkspwn}ur|akyj`]Wj}qstkzuvk[hzrr|xnVure`OVb[M]oi]\o`lok~rpn~zqoulj`oznz}~|m}}{s{qbi~{cupn\[in[`uthdqnfwd{vld|xxwtr{|ur^qoadX[}n|zrxrz}np_[owuy~ze`xihZOWg\Sfn``boatgqrjuz~op~lpia|}rxzz~~y}l}wjtj^m}|{hw{pn]Zis_dumfioqjwe~{ke~|xryxqpaljbgY_r{~ytwmzy|~c|t\^ny~tqjarhh]RQieWdj\ddojpnozjs}}vulxlrod{|zvny~|}|xkr{~xy{pbq`lz|trownpdZ_xmbnlaolwnupvvev|syy{ygkdibld_{y~pwuxts{{w{hcf^mym~ygjghffZOZsc]g]]ljtosu}vm{|{ouoopynsn}|p{~{}|tksyzwru]p~dn{wurwompk`Xszhii^lqqxpxxir}}uypcklddond|{vpn}pvtyu}{qj\{obr{sycqk`ghaRYvl`bY\olswoy}n}{~i~qku~tz}ju|}y{|{vilytozrlaq}gu|tshlrma[y}mi`]pto~o||}jx~w{~v}p^ps_hupl{wis}|vsmw{ovzifezlny~wzc}g_liaQhymd[Vgtiyssvswvpqhm~}v|so|x}xwyodnvkm{hghwrq}lvewso\myna[k|nvznstr|~xt|z}p{mce`ttnuqjx|{{kqypkjdloqoyyg}u\omjVeyujYSdvjp{ltxwx{xnnh}|y~vpv~~wsz}scm|pke~gdqlqt{{s}h{xuaqr]Zm}nt}outuzzwpw{~{wxoif`tpr~ryppq}}z|juspiheugntwu~pycsqn[kyznWTgwjm{mwyvz~~~u{}ystg|x{uwuq~z{n{|xdlylmb{l_xfkwyxo{zzfszaYl}sn~s}vtwzx|mp{ztrozr^rqt~kz}}ssptrop|pqfww\ykbwytyorsudhw|zbRausgxvwwpz~{vr|u{{jszwvx{xuqlw~z{z}oftlief{^mu\q}w{{sm|s\aw}os}x}mu}x{wjow}~mtvwmfsovh}~yt{m|wv}nusjmdxoa{ea}zy}|ytuteqw~zaVgxqju}uwj|un|oz{quw|p|x}uppvzx{wwznipdgbduckw[p{ysq}w`bw}rq}~wjry|ziju|zlp}nrlrqyi{wtssv}y|{psodiamrcsp\z~~tzrwgqwz~l[cwunoz{dy}{kr}l~szxx{xwx{s~y{{rusxupspjnb_b^jketlby{{yn}~nboxrrxb~{qcrzyy~|c~ulwsr~lz|xr|uy}xy{xtuqrp`gaekljuemtwzpxiqzyvccvyqmysnlmj}~sqrxx{vwx}}zv{yvqqvvnllkpa\a]eilmse}vzyo~sgqxsn}|by~rboz{y}~d{yg{xqo{~vr}z}z|yuz~wonovm]g_ffplqlotw}swix{z}ugjzwrl}tlm}klquoyxx|~u|}}q|wtznqwtjfhqqZa]`bjqjrl|z}qz~qn|}vpuxwf|~kd{yxtiqjuvvu||rw}}|u|uuv}{qikvy`dbbdhvhpmw|vylt{{yplx{tnp||zhysi}~~|p|lz{zwz}{{qt|isovvlbcqx_`_^bbvhlqrrz}wu~~wpr{yktpfx|zyxlwwf}{usuysxyyztxmyu}{pfgy}bfabcdxgiro}lz}zwtu}yslsyunssm}~}uz|l|u}{w~zyypux|guqwti_cxx_d]a_cvdfsm|r{z~}wnwyssp|pkzv|zxrrwhx}xowvtzww|tv~kw}zoce{fiabbbwjbtlvn|zvw|ztks{ovo}up}y~~zt{qw~s|zz}zx}rp}|hu~twuk_^s~ff^^`]qn]qpow~z{xosmwsu~unxvuy{xpqrk}~qsyv{wzz}z{rzvp}z{sf_nqjf^d^kuagwk}|tvu}wom||qpzpzsz|t~zpzryztx{x}~~~qvx}{iv}vvqdZ`zwggZ`]ark]trtxx}wmz}h{uu{ss|oxyzznmum|oyw||{x|{{t{vo~{xnb]npnc^c_jtef{pyxutxnn}xtl~ryu~zp~~|mvxu{wy~x~xtuzxwnl}{uocY[twjjZ_]_lqbn|u~wzxmw}|lr~s|tt~pqw{{uhutssx{y|yxzxv|vu{pc]e|vtm_jflwyj{|{ys~zupT{|kdmhcwuxtz~r}ocv~}wrslo~ul_TPeukqcagfpywoyy~v|s~{}rssxz|j~zz|oiogk|zjm|szx}ww`dve`ZbYisj`TNVonnm\cafnulo~v{ygfiawfUchc|xgrkw}}|tz|umusij|otroth_`u~{pptv|}msruxwpfh{rfruqtfxyt~zlcguhqqszxrddtmahYirdUKHWhcnaX^]dipjnz~|}oa_nhjwiwropnnj}z|||}{ts{p|hzmjs~|kzpwnc`l~y}putz}}}zys|~ythdqyhmwm|~nm{y~shgvmgz||n}|tvgclyhrkexq]OJUfaniZ_]celqjyxw{|z|sfbofav|qxsxsnj|vwz}{tsysuly{okqvzlzytpcao{vrutxy}~~yrvt~uifrzhpul{zsl~xzrkmzjfqqr|~{wieknt}q{wn}w_QO^dasf^_^bbhpjvqvuu}}{}}tjjtb`im{~|}||nn|stw{rsw~ttsy{pnrqorpzxsecrxt~uvtvuz{xnmwxlhr|jrtkxwxnx{urmp|lgkg|xx{mhljhl~{|xzkXR_e^qkab_a`copmzo}wq}{~ztmlvj_f`u~{zn}vqt|vrvy~sxyy}~sosskjpzs}ldlypxxtuts|{w~skr|tkn|toykrwvyovonnzxhncj~y~}|rikmfch}~~hYZhadthgcab_errpwv}~~ut}}sljovdee_w|zuuqtvtv{zxqx}yyqpvsjepzt~mfqxoz{vvsr{~z~y{smuvmq}ttzjsuu{r|xijn{vjqcj||}{y{zohkoicf}|q`^jbdtjjhec`cpyq|}xy{yw}uwkmkapye]dqvxyhqz{tqwy{~uwr{{|y{{ol|sioud\c~Z^_cdcjy}u}z|jp|xwyxrlt~q{ypnsgfiptpygpxz{zxjrzqjs~xxeXcpwzyqojjr|d`yxpkYcbcmkl~wber}zllv|{vssts|}q}wsfQRgp|nbXRTamihsznxz}~{xnw{zu~|o}mlwzxqqkfs]bzplnou}ym_hxp{zmfj}vghb^lpv~xqowzwsfkptjiqpkys]_p~tyyeipxyvsqp|ny|x~}szzvp|f\[T_kpwjabmungz|i~w{vq{}|~u{|rmrlvvz~zkuu[n|nikpy|te`sps~tmhrrcfcgnk~upr~}xw{lfq~~vmrysqzj\g{vu~kflrwvttrsytyx{x~|t~v{ruu\[Z]ed}wkhnxwgqls~y~{|zpt}u}~~z{qmmwpnwqy}cj~ufgnx{se`plq|tojozcdhjjdzzss|{vzndjzvz}syp`hzsx~jgjossstsrz|yrzwqv{x|}zy~}wy{_\`b]Zu{tpu}|humw~~||{u{zps|w~~{}yiqzlfl~vkmzfdmxzrdcogqzrplo}~eakpg`tv{wv}}|xwrfgqyyvwghwqx~lhilpqqttqs}nwyoo{|~~x|yz{xhZbg^Ujpx~xzspvu~}|}|z{s}~{}urw{}{~~~|x|mh}sfeqyqwscgszujbnhhxtqpout^esp_ksq}y|}yrrnhkqv}xwwjqsrujjilnoruspr{htmqyxx~v~zx~|aXfjY]mk{}vyy}||}{z|~o|uyvuxyz}}}~zs{fh}qggt|wxtdhuysggpcjwrrqqt}s^dvobqqq|zunkmknqu|{uzrspstllkrw}y~pr|xv~}{wnx|qiv}{xz}jYfp`cspefp_jtgs~mqtsvvwxs~}}zrsn^sqebk|~yxmV[hfZZ^ajn]Uipbmrn}|lxtdiorvx|~`Yc|~nc]XQ]oXXondcmzyvuuiq~|xtvt`]rpk|||tmhjxpq[Ufn]Vahkkjo}x}vsz~sl~zap}xtzolk`STkrzvnfbd]LWg]eleo|~yx|{~ww|qvjkxrcmf[do{|qads^Wikebjt|}t{}rkrsniwx~wvwibvvvjddint~ohrxeXclmjgmyozsu{tnxhs}{yvc`_YS^qo|}tmlfW`hcnidpz|yz}vzsv|}qx}hl{fcm`^hq{uhrsbcklfgnu|u{zxz|plpngl|vywvvjkvt{|wgdgkouqrzxa\kqmffy~xsqtpuy||rz~srx}{{~qda\TWjiovppf`gepmais|}zy{trrx}~wxrhv||pfob\ahpxtxxnljmkhlqvv{xzt{vmmlfiwoq|vytnqt~ukgjkkmw|z~l_ktnedv~zwts}qnprsv|y|zyv{{{|xjd]U[f]g|wxsieiuj`fowz{yz{~rsry|zz~~vjw~vytorb^_aelx{zxmoommps|ux|qxzqlidktgl{x{|tmt{qyqjlmkjpyxflwrfeuyvwyt{omnnmnt~|vw||~}~sg_X]fY^q{}vgj{padjrvyyyz|~vzwpvzzxz~pqxutuf__``clzwottrqrxw|w}ro{xngchtiesy}yplst|mlnmjmrz|wktypgpzr}xvzqjlmljlt~ytyx}qbZYeaWfr|weu~ldhmrvxyzz{vtpvyxy{~}yrtx|}wo`_`aadm{xsw~njvwi^[eiZ[fn|njru}wvj]\agjej~ztxx{xmt{uo|z~qmruwx{oUppdfr}w||~v{~nfjxrejhqy}kz}x}uq~pe`bdb\lvmmomptkeotnq~xs~prx|}~yntjo}potzulvypxynwxickuf_hpw|yi~~ml{vlhgg`]pskoonrvmisuotyko}sx~sX_st{||zv|v~vlw~p`\hk[bp|~{ujjuxusnagvokmjhmnddllispi|vsy}~}|~~wtaXtu{tv}nl{zh\`lc^ny{{nzsmv|zwldtxoqrnovsjmqnrvioptz}|zyz{yrogS`~|xylr~r_Zfh]hx~~w|w|ujs|~}zqdlxompmimrkejlnvnksrx||zxxyyurp\]|vty|nkyyfYbj^ct}{}r|~|ou~~|vhhxtotsnowukjnowrhw|youz{yvtuurnn^Tn{{{vmv}n]`kaar|{~vxxkp{~xietrmqpkiptjdhmvsgu|~pty{yvttusrteXnxxv}vkp{p^^ja^nx}{||}~pt~{kfutotuqms{shioyvgqypqvywsqqqpnqcUg|}|{pq|ucaka_nvyzykpzzziftqmrrmiowpcdmysfq{rswywsqqrrsve[lyxx}xmnysbdj^_lrz~}~|nv}z|jkvqouvqmt}vggr~sgr~wpquvtqomnnqsaXhz}}~}sqzwhhl_amqy~z}xjryu}|jitolrsninxvean|sfp||truwuronnoswf\jz|{z}~zqmtvigj^_jnu|y~~~|nu~y|olwqntwsnp{}mcn~xhpzzuortrpmkjjnseYdr}~yqsyqknb_kpuy~~z|{kmzxvsjtqkptrkjr{q`dwzikw}~sruuromkkmun]cq~z}~}yqmrrklc[enrzvx||}~~rm|{|ntwnpvwqmq}|jcsqju}yuopqpmjhggmn][ivzqpurpk^botzv~|{||zx{ugp~~{qmvpkptqkjr{racxxjp{tqsrpmjhgjqh\gt}|~~|zsklpom`Zgqwut~|zz{|z{}ol~}ovypqvwsnox}oam}slx}yonomkhecbgk]\kx~}tmossm^`pyuwzxwwvtwuhnunwtkosrmilvwg^nynq~zqponlhecckj^fw~~~|{wnfioqfZdt}zov|xvuuuuzsk|st|sotwtolqzwfcvwoy~slkkifb_]aia]n|}~xmhnusb_q}yq{yurqqptvjowoxvlnrrniiqvm_hvpt}smlkieb__hi`j|~~{{ypddnui[fwxnq{~zurpqqtzsnsx}sotvsnlowvhestr~}tlhgfc_\[ag_bu~~}xldlytadv|vox~|vronnovsjwsr{slorqlijptkblrp{|rkiheb_]ajdbt~|zzxmadtvc^o|zxzlqz{wronoqxxmvxvypqutqmlqvqhlrpzzz{rifdb_\Z^fa]n}~~}teev}i`o}~zopy|xrommnuvjqws}xnnqqnjimrphjnmx}{xnhgeb`^ahc_n}~{{{sdar{h^kw{wnmv{wronnqxwlszy{qrttqnmottonnmyxv|ukecb`]\_e][kx~vgexjbny}{qow{xsomnqxsgpwywoprqnkkmpromijyyxzohfeca_dh^^ny~|||tebu|h`kt|zyplsywsonorzuir{}|ssutqonoruurjixws{ynfcb`^]ae[Yityzkeuodmv~~{vmsyytpmnqxtgn~z{{qqrqomkkmqurget}s{~ujfdba`ch_[iuz}}}ymbm|qdiqx}wxmmtwtpmmpxxkm}|vtutrponnqwyndpps{vjc`_^]_d_Vapw}~uhj{ykkryzslrwvrnlntxmiwywqrrpnlkjkryrbg{vqz|shca`_`feZ_ox~}}}wkdoynint|yyxljqtrnllpxtjs|vtusqonmloy|lbrmoxvja]\[\`d\Wft{~}uijwwnpu|yuklrtpljlswmkzxxrrqomlkhho{vcdzyms{uha^]]_ee\`r}|||xnektqnrw~yw~zpgiopmiimvvmt~{xttsqonlijtubkphpvoc[YXY]daZew}}}xnipvsuz~x{~zogjonjhhowsmzw||srqomkjhehv~marnjtwma[YZ\ch``r|zzxqiipqsx{zt}{ytidhlkhhktxqvzyutspnmkhfo~|gisfirpeZVVX\dc\h{}|{wpkort{w{~zyqfdjkighoxtqw}{srqnljigcfvodtmgoum`YWY]eh`ex{zyvpkmnnw~vv|vwshaeiighmwwq|~}wutqomljffrygnodhpncXTUY`f`_p~|{zupppnvzwwvwncbgihhluwpwzwsrpmkjhdbl}|ij|uhgprh]WW[bic`o}{zxtppniqxt}}tsvoc`ehhhktwpv~zwusommkgdl~mjyvhdkpi]VUX_f`\j{}|zvstrjq{wutwsf`dhiiltunt~yutqnlkjeck||liwxkfmrl`YX\ch`]l{}{yusuoenwv|rqvrf_cgijnutlu{ywtpnnlgfo~|nlwviejpk_WVZbe[[jw~~{wvyqfoyz~srxui`bgikourkszwuromljfdm{znktzmgjqod[Y]dg^\jw~~}zvvyrcj}xx}rotuk``eikouskr}zxuroomifnz{qnv~wsfgvzrmiljgkpszvtwx{zyzz~yx||}ryeptYdszvpvxw}~xpt~zvvgax|}w{{tqztkdjljpvu~|w}ytxrvvminu{{yt~x{yiqi_rvouw}{y}~aiwynnuzqpwsot\`ivpcelptbiuh}wlrvxy|x{s\Ug|}~kjkZabn{xjom{w}uqxupuckgqx~zv||}{|t{vq{vyhhiboukpwpxqskxqsxhhyrqq`jipq|~}v{wv~o_liq}|kyt|pdfc_YkgalhXcdalqv{u~s~vtobceWcslwzuzrt|x{wu~qsuzrtmfnsn||ylyzvstir~}~}uqvllqab|skptpz}jks`Ze]amv}vvjWftqs{sdonbdgjkmgsyhktgluox~ukune|z{spnnjh^`wwvqsxhr~u|syy}}wvm{wednt}|~~xy{ustmfsy}zquytxelphuykknx{{qq|pfka]nmxzv~eaeZczzswuhphgoi[`m^cyqfojr}wpv}t{xu|}yzvhniWM`^e{{}~}nw}y}zu|witthfdsy}}w~pxx|~uoqzsq|yyry}{wnyumw{pwmpzvgin\evfX__r{{{zjom`dsuqq{hjagsj`hytxn_pzvpx|s}vy~{|wvulitiZZjjtyo|~xyozwv|yyz|ryuqqbptrl|{x~zuu}{wglmgppu|~viol]osljdvypm}xxc\ptn|yuw~~nnjUarednq{pv|ujbplmtkqpfmwpwox{vuo|z|}tvwk]f_Zggvyzxywz|rszjrxhh^kunj{}}uy~|wpvotjk~~w}}t{|~tgyz||umu{krkmna^kgpqsz{y{wmXb{yzpwpqreqiqooxqhrxzzkzxrksoiy|~ohfui_We_kui{~x|q|grum~o|pm{b_alxq~ptqz|t~mnxlt{pvlpwimjqrryrqxmjvfgkvjqv}rs}plcZsxfYt~}{fnqejlncqz{bmuxvlht}oly}wu{{|xwmwgSbV_Ylz|qv|pxtqwgshqsrslwwsjz~ujsnk|ronnuzuztpsk}bdpzvtd~trslai^bt{~wp|qy{k~xwoPu|qlkurjmvry|pkww|kkqdjd|~}{ssunq_adRgm`yozsu{ywss{yovrjuwx|w}}{xwt|s|luukmibk}{~fweld{|l~x{|dzx~olncnqps}}txrnX\wt}||utzxmxqoyqxeu}psr_}fnd{|yzz{s|ofqZYbV`zmvz}|~{v|rsyxxotjhtu{pw~v{|oy|{wz}ntkgiszzx~nqmmyvzmy{|wgmlcngpgo|v{}xzt|zg[yptvl{x|pxsoxt{kxsstdolfvxrzuyxxtjpbV`VUs`irzx}wqy{u|w|omvtvfzyy|xu~~{z|mokjfqplmx|tsn{q{lsywkvpophq`gty|z|jdvrmj`k~~{{u|yvnw|lnod}jghyynsx~y}tvxf`eTehXY]w}u||x{}~wmrwujgttlws~}{wyz~vwpuntnvnlizrw{s|}y|mvqyqpmli\ghqm|y|}y{}fv~steanmps{z|{pusmoh{rkg|tv|ls~|{v{tei`apZUS`oir}y~z}y~xw{zrjvthifm|xy}|}{~sutwqxppkundnrx||lxp{tupsrbkfmgns{yz|p}yodki`dgunz}zzlpizoli~tt}jp|||{yonhlye^Wdh]apuz~||uqrsyyztmhztyubcw{}tx|yqnpkc^Uesoszz{}~{{tn~wrsfswqhyqnvy~}|{qrznqlvmegb[iumvv|{~wzqtuk}wozph|{xy{s}s~nwxr}lwwhnneprlstoy{yznnwvlrm^rxfisq{~~ty~rryn`fUYlc_uvz{~~|u~zwpzxlkvmp|wyxzz}umuqdlf^_bfqtm~xzsszmvvfuw{sgmty{{||y~zkpr\eugcmfq|}v|sjunpwut|wtyiyw~w}w~{p{{{dbdedpbWjngz~x~wh}wuytxsmjvkmwlvwu~rszwynyqdicemmgnxqwqt{zvvnzs_hjfmv}v}ryzz~xrmsfhkYZptxvu{vy}qrz|pjn`kym{{|zz|{p{whkf^`eomofoxqy~x||~lk~rllupw~uz{~z||okscgzo`e_ckmip~rwvstuznnwpstk{v}}puvmiskol\dj^cnju}xvyjwoqkw~wms~wxjd{v|{x|ztotiliaji`Vf`dyy|{s|whoqllgvv|}~y}}owvq~}xq|wub\ovmxmfh~}}{txrioajxfgbr~z}|}vmxqnjjukmelrgdmoy~}~otxpqosqmwtm|vptpbslc_Yjic`qzw~st|y}{ssyquhmxwlkvm~~uzr{zkqhjk`]f`iho}zuxssmx}suvcm{~zy}|szxxqermh\dZVmtcfgs|{|syuvymzpsrq|xq|~x}wts}wkhzzqsjg`rggmo}}xvuviwqdc`uwpl}}vy}wpxwosjsqdbljo`ituu||w}s}ormvtjjqou~|w{nvyhf_ovnfmxpse[n}x|vqozrmgncl|lqqzvnsukdXW[VPVZhjhlv}vs|ztwrsrswvqrbuvkv~nku}z~zyfejutxzcctfuwfpht~uo~oywwu{eqdpq{z{}uqeq~kcui{vfvxxpo}|swstjysm|gyzzb}a`njo~lpvg}nUgVr{acvsyv~z|~}mkzbmps\ql||wszrlkqsvqtxXvptsfvv\ov]_Z`cQ\YVr]_solw{}ox~s~g{u^eYi^i||y~}nzztxzzzuyecsurnd|n^VTYcXVNoiYmvounv~v|ttmi`}c\ZYm_xv{zz|~}qoxrZm~|yepyd^_YacVW[vZeuprr}orz}wqsy_mi\fUdik{y{y}wxufpxf\yw{cqogc_VkbTTjrVpromypsvstusns[vx``gZpgyx}z~|{~~lcqrffxrftkid^Wo^UUonXvyrxnup~tzrstlo_wqac]Zxoy|yxz}~{z\`vqjjvmiqlhbZYnRUcvcYyv|ulw|ozu|yvuvcgwj`c[n|w{qyxx{gXmwoozy}{gjiqkcRfgOajrYdtq~qn}tsx{o~{r~udopgg`^{z|w{z}{{~{|qwV]uquqypigstfXUoRTlqgVnlzzptuu{~tww|ihnijh_m~}}{~}u~~|}ny_Tlqss|yldj{o`RkaIjqp]bluolzyw{o~|tqfggmkbj~}}{~}~}zw|xlpgThrqxstgd{thVflMftib[gp~qk{{xwvur}}vmfcmnekxzv~zy~ylk~nXcmnwo|lczjWeoP^wfh[anshu{xs{qq|~{rd_mrelvz~rx|zji{nYcjmwnoczk[hoUa{bgZ[ougr|~tvppzx{vc^pqdnr{n}~y{|ikyk[chotnph}k^mnWf~^fYVo|qfv~|rxmrzw|xb_ttirq}~m}y}{{~llwn`bbnsntip_kk]c^e^Rn|tgqzow|mqyu~|d[ruirl}lu|x}{kjrncaaoup{hudpmcad`eOhzsgnzls|}s~ryt|~hZoxmuny|~p{t|zsvynjooid^hun}i|jnmhbxrYkT^yulgoow|~oxvtxsZewpurvv|zxo|syxoxojklkh`bunzquqlqign|[dcUtwqgysiz|xpuvs|b\ptsxp}~}wmvwuhrpjhhike\otso|~}munlmxqYkYbytljjpuy}twtovq\dts|s~z}|{{xpzq}nteoijgekladypwx{xqsipsxd]iYrxtjwugz~x{|w{vtp|~i]ksy~s}}}~vqwzo~}qfejghccmm`mzttzxturjvuvaah_uuqlnhy}yzy}ytop}ye_mt}z}}}v}qz}nxtu]cdgh`dpmbxyxzxuwnm|ur_eghvtoqhowww|xusmt}sbdqyzxwyyvstutuhsXbahc_jtil~v{~u}|ywlw}pk]iiqurn}vfz{xr{|nupp{{mbir}z}|u~{r}snv|wm_\_eh^aqsi{xzuyzppvnganqttovhpx|zqppsmv{tgem}zzsyy~sws}wusinX]`h`]kwmv{ys}{}vokm`iwssprpkzzkyhvot{xmeiutu~ut~sp|qznux\Z^hc[dvqt|uv{|}xp~nmfbzvrrpvi{{{znzduqtzxphgptu|uups~xsuqrvbY\fd[asstzryy{~{q~qjm_z|opnzkz{|wrtdqtuzxqjglvuzttq|x|uwqrsseY\fdZ_qtvxp{z{{ssho^|~opnyn{|}ussdpuw{wrlgl}tuxrvqy|xtxorvoh[^gcZ^prxso|{z{vqhq`onpxq}|}trwdpwz{vrlemzsvvqxswurzlrxjk\]fbY\nrypn}|y}xvfsb~pnoys}}~swshlwz|vsogjytxvqxwruo|lm}gl`\ecZZjrzqk|}xy|dsgxsnn{v~|}s{qohv{}wsqig}xv{wpv}oxk~}qeihi[cc\Xdoywh|w}zinppzpk~}w|}~uxqzeoz}xsrnewxxxqsrwkt~yaxv`m^`d^X^lw}h{}zx|tgtotjx~y}~~ysvzmhv~{tsrhpyx}y|to|}n}qk|jebgi]c`ZYfqsp{t}~jnuxomz{}}rx{w}xil{}wstpjxtuyou}uv~}ir{y^uw\lc`b^Y_jzm{u}zhsy{jwyy~~xqxw{xsfq~{usunqww|xvo{{pythxzp\|k\lba`\Zco~tuw}~uiv~~xj}}w{}~ssvy{tses}yttvovtv~~sq~zpxnh{yzh`}c^kcb`\]guz}rx|rj{}snxu~}zotr~wspfx}xtwvsxrt|pvy}{uy|zhmvv]mw[djdb^\bly{ry}}mo~ly{sx~}sprvoujj|{vuytxt{v||vr~vwzy|oguwxj]vjZhjc`]_gtsuzwj|wwo~ts~xnsmxnuft}xtyyxxqzv}|ryuz}zwvvhn~zvr]mr]`mgb^^enysw}nr|~o~wpz{nsmzivlk{zuwzx{ns~uwxv{{r|kjx}tvbfrf[jmc_]cj~su}vnxszxov|oqmslrsix{vvzz}n~s|xwyt}o|}mn~vuytdlwjb`dg{yxypxxz~yqy}|{|yznenu|q{w}mwv`c~swhjnm_aodZUZ`s~re|pia{lzqtxwrhqqtnqrlxmr{wrplpks|}sYWsndOUTXNPcYPNUZnvy}vpzuz~ypz|{xmfd\}ksum}rdvmopnurv~}qnv~ygszi_dsqvmqgeypdagl~mgq}mzyfhhmljcZdy|rekbkqesmhnkiilob}~|{xcW[j|uudaZN`\NIMRbhotwzoq|t{}zttoiddgYszz|julkmgoqu{zpkoopg~{lbcluy~tnterzlcgkyuhix|njvrlf[\oxgjgc~~kjxnjnllmsdkn|zi[Ybm}}fl_Zh^PNR[fet}}toryvswxqokhdjb^|{zwtxioigot{~wlkrnkjz|tfbgnuzpovit|ngjp~}}qij|ok~und[`swglbh~{mhypgjkmptds}nuztdY[em{hnh]jeVSVaffx{|vrtuusux{qihgelfc~uv{{jpjelt~xmjolwphqwrfbipt|}{wlxro~wlmr}y}uno{|d|}rg]^m}}kmgcyzufpyhdhloxms~~z~rknoeY[gqyqgpfcmcYZaje{}s|xwvysxv}q}ze`cekphzpzonndhq}~qkm|topkjopgbhsvz{{ms|rwuqs~vyyrt|hrxl`^iypnj`uyxmhzpaekpzrv~{~ztpkegbY\ityxiqremmb`emf{u|zzsyrxt}pv{e[aenqll~qqndhq~pkm}vnioijldblvwxv|prwvyuw||y|uvsvjv{k`bmz}orffxvynizq`dltzp|z{}{kolbc\X`nuyzwmwwky|wx}pnngjdojbcesslqw~{s{nxxb`ipyqi^a]X^izyomvyyiq|swurv~x}|ny|{z|uxvwo{yrtziU}XIP^infiaXkknpemxg`ku~s{{wp|x}qoronms}v`e}o]Pfhiqnlhflxrgnvum{{rqt}wqjz~|syyrgpzx~i_td^hsre\\fnip[^qfddekuxunwqo{qq}z~zxf_t|{yuoceTQa^bf^_l_V_lqfvwn~}xvqvy}utt|umuhcw}|{zslebhsm_exlduqkkowtyrny|y{|ms~wxyqfviellgs[Wph^^airtpgp}xsn{wjy~}x~}zulhjwye\iccif^ggX[ipetwkvy{{qpvpszy}ouubhwlegptf\vxaorllov{}wwqtqx~}voyx~uwmtvmnrgqmTdreZ]epurifur}zpr~sj}v|}~zlnknzbjkdgmi_ifZ`ojj|pmw}uxxywtrms}vxnuudkyngjrtd]}ubpomnsz|z|~xqnxr||~yxoyv}{prsy{surgumXcshY\fqvsiitm~zpp|wj{u}{~~}wfmqmippgippbfla`njmtpw~}spw|qvio{w}wlnwniskkrvm]v~gmnmou|~zywqfwxv|~w|tu~vzmjt|yxwiqub^mr_Xanvvoisls{rms~ts~uy~}}{whbvuxspwmjnunbjncili~}rvz}uln~uuliuz|uxmiryoz{pmqutdkqlmlou}|wzvtcpx}}~}u|u{vxmeo|{lpwibgthX^mvwqkrjmzsno||tv~|z|xvg^u{wwv{qmpxtehrjjij|swy}~}|zsjj{~xumhtx|yp~vmip{u{||yoilry{tpt}vuo^pwx|smtlxyqnhzruwz~vo}wotb^bkzpdkx~}uwzo~~yqsyunp{zwplpv{~uzmm{~reXbnif`q~qrtuwyz|zrhszx}vqlwrbes|}wy~sygfy~jacbf^Y`hsyvopy}xzgh}sy~|n{rq~xpgwz{~zos~vdedSQ^hjegl^j}|zwtqw~wx{}uqv}zulqytesy|pwqaUerefhhijlooi`gzo~|zy{|miu~{v}ztkho~zm`birupihqzrtubcu{ml~~{xs~~yrg|z}~wtwtv|jbimlfjgZkwvvusnr{ut|~vopy|xmq{~rlwuwn^puhiigefimni`iyo|xty}tls{|y~q~xnghs|igmuxrjhovosucbo{oeu}|zv}y~|ygzy{~~}~}yyrn{mlonimk[fttuvupnw{sy}zzrnrzzroxznywsygmzmkljfceimkccw}tt{}q|}{~uqw{y}tw|ulgkuzkmv{yqklspmwlafrxjfyys~{zqn}y~}{|~||zmtspqnlrf]msstvtonx}uvw|z}}wqptz{tq{}rp|xu|juymnnkfcdiljchxyxuw{r~x{twzys{|{xrlinwppx}{snnsmmwkcfoxoeu~x|q}|vq|z~zz~~|y{{pvtfnmjged_Zbqphk~{|tjp}|v~~}urtm}ns{qqrpjdbfkkfguuxyow~~{~|px}y{{zyzhioegxyopiq{~zusvqkupbadmqgfxvjq{uws|zvjdplmz~shsyrnoqyvfnurrssngempd\x}{x|{znfjs|sqd\nurqv||~xt|rqutnfa`_ZSSdn}snr|okeegijjkmosxru|~wnhf`^rxsuux|umzurnhq~xjvqbjuzzxvx|ridg__zwqjhq{n[nvotz~xhi`bfiqsikzxxw|}}sz}}st{uib_]dngr}on|uxbu|kfd`_hyycivvy}~~|yy{nmxupse`cektqm{{neiy{l__h`fyofq~yvy~yoxzx~|oilk\h~~ztptspwmn}}mgaagf^dnlfi`Zo|zhdfhjotz}ztv~turxtjlnbotnsv]Ohlbeltxyyxurt}}wsvvst{~vsmjmnfk|ohjlpvjcqk_h||ww|wpywow{qzrlstfoullywv|{xssz|wqnuyolsroqdaszzz|pmnliffkpqq|zy|ukoiYds{iatqihhhikmpppxzwsliloowptyrp{f_^_agszuzgds|ztrv|wuzs{}qt|kdnofs{w}tmyyzxxz|y}rpumdiosvigy~prvtwvpkhlswytrzv{}uwq`fsxvitwrqonlklljfi||vssrjs}{|xqr|~vyvhfeb`bkx|}mq~yrpsoitxqx}u~}npsefsvyv}ytolmpmuvxzncfkqj]l}n}|jjmmjgiov{u{ur{zskoc]mu{}mjnmquvusrssqox~{{xvwxsn|{|{tklw|ux}wpeefdcemwxuyzyztq|xosz~~xrzrtrekvvw|zrljklfo}{lkt|req|}~o}kghgdacjr{}{~w}qeeYTfrzzxumprqnllorrrzw|uoosyyu}tqz|sz|j|m^^cgjnu}}woz{z|xs~~sswzyunlxvtwko}~yvonqvsvxt{shn}|ko{~~~}|~xtyljlllmptw}{y}y|nibXgw}z}}nmrrojhilnpx{uqsxxrz}~xrwxu}pvxc[\`dhpy~qr{}zx{yu|{~}xqt}yrpdfx{}u~wv}pggmttwwpt{sei|swumvifilmoruw|xv}uosumh]Whx~|ysrz{wspprss{~|vvqtxupzxx{{vt{{lwtcZZ]`eksy|{~vt~uwz|||xqrzyuj]gvz|yrt~zjabimly~zzlqypznr|ndbeilqvz~~ynglokaT^s}{}kqyyuqpqsswzss~uv{|uz}}wu}x|no{yod`acfkqx|~xr}~trtuuwyuqxxfiy~zw||wzlhkmiq}tq|rz~}xz{pihhijmpvzopwwiU[krv|~mnwytpnpru||xvsusls}xx~yw}zywxzvpe]Z[\`fmw|{zzz{zy{|vor~sbjwyy{vtzzt}zkfhe`kvsx~|z}uz|zzrjgffghipymkv|jU[hkmqxzw~xtssu|y}wysrngnuopx~~~y{xrqi^XVVX\bl|xwwyxwy{ypmxxaeqtuw{~~xtu}oedb\frqt~{uyyrvumgfghjlp}||zpfkzv^Zgnpsw}vx|wtssxyyxw{wumoyuqv}~}}{|~rqtla\Z[]`fux|ytvvuuz~{rrugpxxxz|{{w~~xzsjf`]jolr|x}||syzqheefgiotim|u][fjlpu{vu}}ywwx~}yztohmwsou{}|{|~{~mhoj_XWX\`fv{|{yxz}{qlzufnuwxy{~xzvry}ujd][hokox{~z~nqxticbcegm||z{{thdqvaYagjntzy|}ywv{~|yx~tmfivwrv|{xx~p`dibXUV\bivzz{ywwz{ukm}{jjswz~|}y~~~vnnvxphb^jvtu|yx}vpkuyqifgjmr~}yvwxukclvj`ekotyzx~~zvuy~{{|sjlxztuz}}}~~uyzvbcki_XY]civz{|{z{~zqq~}ootwy|z~w{~}{souyrg^\jtqszux~{oisxqgcdgkr{yyytjdkpebfilrx}|z||~~y}ynfnxtqtxz{|}}~w|u~k\aif\VW[ajz|}}zyz}|votztpstuwz|~{~womtvm`W_mmlryxxwhjuukc`bflz~~zxwxvofgjecffglrw~}~}|zw~~qejvtptx{}u|s|o]\fi`WUY^gw|}|zxy{{wrsvsvywvx{|~z{~~~~zrmsysdYaljhnuzz|xzkkvzrgcdfmz{{}~|yxxyxsnmjglmihjnrw~~~{rfmtnknrux|v|xsb_hldYTUYbr{v{}}~}yxtrz}wttvwz}z|y~woqxueX^fcafmrx~|}miqytib`civ}uv}{zzyuqnfclpjffilpv}~zzwgjqlgimpsw||}vxg]aih^TRT[juqr}}~|{slu{trstvy}z~}||rlqvn\Yba^agmsz{ujirwpe``dp|ys|~~|yxxxvtrk^bpqiegjnszyysioqkjmprv{~wwrd\_hh_VTXaqwqv~}}~~~~}qjywuuvx|y|x}~}tlpvo`_eb`cinsz{xnjqxujcbgr|xs{~~||zyxyxwwvn^`qumhgjnsy~}yxlopjiloqty}~ywwi^\chcZUV_owqtugqzttuw{x}xx~~wmioqe_dc`bhmrxxpr{{tnpyuw~}|}|~|}|{yyxxy|{ngyv}lhpy|urpnmoruwy}}wxr{xmfchrvqlkp|}uvxsqsuvvwyz|~pu{susjn|||}|yv{|{|{w}{xvwyzuntysonu}}wrsyvv|~}zwuv{{zyyyzz|sm{miv|vwxpkpuvwz}|wx~|}|vrrqpooomjinuy|{|wtw~~|us{toljjkmoqwzrgn}{zz{{xrkmtnfgr~xpklrx|xpmu{wrnkjpwwroqy}vquxwtqpqv~}~vwywzshen~zxzzyy{|{wtuyyz{vqpqpoonmjikpry}}yw{~{vqps|wtrqqqtyujiv~zyyz{zunourjfkv~|zvqlloqyvqv{wromjlsvtpqw{vruxwvtrqsz~~~~xwzy|wlgjt~~}{zz{zwsrtwz{uppqqqqqpnmopns}}zxyzvrqwzwutsvxsjkt}}zxyz{zuqtxtlikqx|~~~}zurpnkqzw{{vrpnlmrvusty{vtxyywvtrru{}}~yy||~xnhhmv}~|{{{xurrv||vrqrsrrrqpopoknx}zz~~zvroqv|~{xwyzvons{~{yyyzyurtxtnjimrvx}~~~}|yvsqniju}{vtronptvuuxzvtwyxwvusqqtxx|}z~{{}yqjghnu}}|{xtrrx|ysrrrrrrrqpppljqz}zz~}zwsonpv{~{{|ztpqu{}|yxxxywsrvwrmjknswz~|~}~}}|zwtrpkglw{wvtqoqtvvvyxuuwxxwvtrqruxz|{~~z{{woigiow~}{xurrx|ytsssssssrqqplkr{}{z}|yuqnmou{}|}{vrsvy}}{yyyywtsvvrmkknsx|}~~~|{yvrpnjgkv}yxwtrruxyyzzvuwxwvtsqppsw{~}}ywwtmhfhmv~}{yutw}|xutttssrqpoolkpy~|}}}}{xuqnkjms|~~~zvvwy{}}{yyywtrturmkjlrx~~~}|{ywurolkigjt|zywutuwyzzzwuvwvusqpoorw|~~zvttqkgfhmw~}{wtw{|yvutttsrqooomlpy~}|~{zzxuroljjmt|~{xwxxz||{yxxvtrttqmklnsz}}~|{yxvspmkjigkv}{zxvuuwyz{yvvwwvusrpopsw|~|yutsojgfiox}{wvx||ywvuuutsqppollrz~}}~}{zywtqnkjjms|{yzyz{}}{zyxvttuspmllotz}}{zxwurolkiggmw}|zxwwy{|{xvwwwutrqooprv|~|yusspkhffiox~{xy{|{ywvvutsrqpomknt{~}}}zyywtqnkihims|~||{{{|}|{yxwuuvtqnmlmpuz}~}{zxwurpmlifeipy}zxxz||{xwwxwvusrpooprx~~|zxutspligfgkqy|zz||{yxwvvuttsrqnlnrw|~}|~|zzywurpmjihjnu~~||}}|{zywvvwusponmorv{}~~}{zywvtrpnkgfglry}{z{|}|yxxyxwvusrpoopty~~}{yvuurnkhgfhlrz}|}}|{yxxwwvuttromnpsw{~}~}{zyxvsqnlihhiov~~~~~}{zxwwwvtrpnmnorv{~~|{yxvtrpnliffhlry}|}~~|yyyyxwvtsqponpuz}~}{yvutsoligffhlsz~~}|{zyxwwvutsqnmnpsw{~}}~}{yxwusqnljhggjow~~~~}{zxwwwvsqpnnnpsw|~~~}|{yxvtsqomjgefimsz~}~~|zyyyxwutrqpooqvz~~~~~}|zwussqnkhgffimt{~}}|{yxxwvutsqonoqtx|}||}}|zxwutromkihghjpx~~~|{yxwwvtrponopsx}~~}||{ywvtrpnljgffimsz~}{zzyxwutrqpooqu{~}}}|{ywurqpmjhfffimt|~}}|{yxwvutsqonoqtx|~}||||zwvtrpnljhgghjpw~}{yxwvusqponoqtx}~~}|{zxvtrpnljhfefimsz~|{zywvusrqpoprv{~}|{{zxvsqpnkigfegint|~~}{zywvutsqonoqtx}~|{{{zxvtsqomjigfghkqx~}{yxwvusqpoopqty~~}|{zyxvusqomkihfegjnt{~|{zywvusrqpppsw{}|{zzxvtrpomjhfffgjou}~}{zyxvutsqpopruy}~}|{{zywutrpnljhgfghlry}{zxxwusqppopruy~~}|zyywvtrpnljigefgjot{~}{zywvusrqppqtw{~}|{zywusqpnkigfefhkpv}}|zyxvutrpppqsuy}~}|{zyxvtsqomkigfffimry~}{zyxvtsqpppqsvz~~|{zyxvtsqomkigfefhkou{~}{zywvtsqppprux{~|{zywusrpnljhffefhlqw~}|zyxwusrqpqqsvy}~}|{yxwusqonkjhgefgimq|}~~|qsvwtvuuwoqonu{}mtzlfhizobqos}zz{~|zYjslz}rnjqoqxgjrzpwy|{}uiriot^creeob]lhsv|uz{{~zs{syj|pa{wfcwwtzuqr|}yqgguvVdpki^cil~~xzytiosyltlgrvj{rzttvlqtvgmt}jote[qwxo`zsuuo~zendrxlkukov~}izhmmglbdsj`koaj}}z}yzvveqsjyt{zcv}}r{st{f[p~juqvzrv{yztvulyy}}al~w~}~qyw~|rwxnoy{{vOryyyonqs~w{}zr~~hc|m|imw}|b}}k{~{sr}nguo}vw~~sYvktx}x|z}}xx~{}qjtfhxtVQjyuplvkrirxq~lkda}~yzyzlu|_zxrwzwzWkds{|hVeepqdinoop{|rxuckalto{tqpnp~r~uxw~}dUeauu[\knstpgoxdpwszwfjuUwrx|pxusm}~}nus~qK^ek}aqoytnlipsi|}xpxq[vocuzzwtrolvzyzqtzw~~|y^Mkergbsqutohivdu{rsxxcnvczvvz{tqn}|ztvc{{x|oLeos_lpurnm`qqlyxnq~ph|olxwxs~rujkyuwpz}{{V[vlycilpwtnfiokw}ss{}ltpg{sttprntqu{}sj}xbRrsu}uemtswrpjvnstivnusbwuryxrsrgrwzjx|nKjro{hqwzzvwlnloy{mo|pmtcl~{wt}lupr|pzjyx}{~wHcwru}mt{xrxurqmjuxjkwpoyclzwvxsynk~rwqtu~{|zM\qnu|sqvwsqmlfowqiwqjxhm~zy{uy{qk|muuwyzwU[wpuywovtusvnhktrkywnwpm~uvy|v{qhyzsz}v{wv}{~aTnmqu|o|}typvsnmuwow|lqvj~xst~s{vhuywuzxsxvlSknlpsuy~vywtopsptsksgx|pp{x{|vju~p{x~tytyRanhkx}t|sxuqpsomy{iojmsmu|xyom~o|z}xz|{|rv]Xqljpw~|wxurorqjr~shnfz|ns|z{qh}xty~y~u{qyqoOipmo}z}~vvqqotjlw~jpjospx}||wjnn~~}}}~zwu}qu\Xrsnu{{{xrrntrmp~xkqhx~ot}}{{}qdy~ry~u}p|xp}wPduqs}z~~zzssoxooupmokuly{|xzhit|y~w~~ynxophQlsrx{}||xtppvmrxjnkpoo||{wvfrv|~xz}~}wuotlo~\Vputy||}vwotsns|zhplw~lq|z{xseyyz~}uzylpngrxV]tvwu~|{txntnpvuhmk~|kx{|{zzkg|x{t|t~}gphhwkTkzv{y~{ywxoulsynklsrnyx|yucsx~}{|{~zsmjmhmw]\uzvv{}t{rusov|ilj{mvyxzx{kd~{~u{u||dnjhtlVj}x~x}yv{qvmqxpjjqsozs|xsbry~}y{{}yuigkhot]^v{vw|~s|turptyijj{|m{uwzz{he~||s}yt~vbkgkugYm}v}}yxzrvorzmkjtovzs|woay|}u|yvz~chgismZeyuz|}~u~rvpsvqijqurp|xuapz{yyzzwvifhhpq]atxt{}vvusstxilo}znryz|ydhz|~tz}wvnejgnr`]nun}}w~ztsts{hko{}nrw|z{ef{}t|ww~seihlrb]ktj~z}tsss~jjnzn~ttz|fc}y~t|vx|tfiilqb]hqf~|~utur~linwp}wpyh`zzyv~vy{xggjkof]eqftzxutsyqhmttx~kzn]r|w~x||vy{ylfiknj]amgky}utuuwilr~{skz|t_j|v~|x{~{v{ypfgklm`_ild|wtvrljpwqspz~e`zzyu}}}s{ztjdjkme^dnct{|uwtwsintxwi~zp]n{y}yzz|}uv{uodeklj`akhg|wuxs~kksyqpr~|{bb{}z{u|}zq{xqjbhjke`dmcv{uwvwuiou~yvh{{q^l{{}{xz{zwr{rnecijibbjkfyuysnjswsumz}f_w~|{u~{x{~pwxnladijgbengq|vvxs|kltzrkr||xad}|~~u~y{w{}~mxsli^fiiediph}{uxvwwjnu|{ugwyr_k~~|v~~wzv{}xmynje^ghiefmqk|}tys{rjqvvzyf{xk_r~w{xwv{nrvik_`hihfjrnu}xvys~mltyrlo{{xce}t}wxsx{{jwogh\dhighmsm{szuxvkpu}zw|exwo`n}yw}~vury}pmwgja]hhihkrqtyuzrnltxsnlzyyde{~t|vxqvzyiwmfi[dhigjorn|t{tzulrv~xyyfxwlaq~wz}~}wsqx~kouck__hghimsnzwxys}mouy}u~iqx|tbi~|u{~vvow|rjyeie[ffghlpor|v}rqnuxv}pkxyxedx|u|vwntzxhxjdkZdffgkoon}t}s}untw~yzvhwx}iar{v~~}xxpqy}iupan\afefimnku~uzyosw}|yxhuw~k`nzw||}yxppy~jss`o]`fdeimli}v~wy{qtx|~yyjrwl`k~zx|{}{yqoz~krv^p`_fcdgkjfyx~xw}rty{yzlqw~o`h{y||zzz}xsmx~pmz_me\fbbfjjer}|}tusyy{zpnv|tcdv{xz}x{}xvlu|vi|dgmZebadjjdmysysxz~ztmszxfap{uzw~|xymq{{hxn`q\bdacikfg}{xrn{ojoyxh]hyxzmn}kjpbb\Xfnrehv\og]fabhmi`gvki~b\cjaRTell}rykqyxlt}}ptqoyyy}k_f|{z}xrypmjo}w{~mdo}zkdputrabZXemobepVkc[c__dg^Vf|}leas}qqobPO^ffwkz|odq}}qxv}ssyxrpofSRix~tz~s{otthfjrwkqw^`vpkcZdlod`qVcgWa][_c^Vhym``fxs`W`khwqvy|y~tdo}ts~y}juknea`^URl}zzxzywl~ymgls{}nlz{ue^rpoablqpaniWp__b^_de\c}xq|na^iw~~n^_lms}p~w~|{ik|zpyvpr~hlf^]_[Uj}~uyu{jw{phluztmvxyrk_qrqeakqreiqWmg^d__dgad}ykxoc`ky|sb_korq{wyz{lj||}qwuuliie\\^^Xk|t{}u{js{pjmw{vnvv}wrl`rrsfblrsgjqXni_e_`eicgtjwmdbn|~sdbmovq|~v{y{jl~}~|qxvpp}hjb\\`]Yr~}~ty}wyhwzqkpyzuox{u|rrgauuuffpusfpk[sebd_agi`mmpvkdfrpdgoo|yt~zv|{vfq{|vs}z|izuhh_\_aY_z}}wzw{|pn}vpmt|}}qr|~w{xrq^fz{{qfltvnit_hqbfa`ejdawvkxqidjt{lgnoxpz}w|z|giv}ryyps|lkc]_b[Vl|}{vy}~vl}ztoqv|tqx{z{|tu__nzknvysjteesfgc`dje^pz|m{wnggm|sknpvr}zx{{leo}uwyvn}qmg_`c_Sboux|ly~xspszzquy~z~vyiYdstow{zow}tqt||q|wy~|}|vrv~~ro_d}yh[ZdbhfS[gxv}xr{}}tridfgZYjsw^nmhh\\mljfin}y{w{z{n}uwuqu^\i{xc_yp\UPMS[XP`gy}zwwnz}wrpu~sn]mo^\a]g]NXdsn~yytyzwswrigklagu|jfdzw^^jgebejzo|uppmwvsxzvwydfr{rngdluh\TW]XRaew~}ruxzr~|xw|yndajettmlembRZdrmxszrkouxy~wmjnpgkz{zlcjn{slvrnijnzpx~rkjit{vzzwv}ifrkcehlszncbfcZgkx~w}qsz{ry|zx}pe^\lnu~tslpoZ]fttsvxvkksx|wnhkpli{wqmbku{lvwsposz|w||ukhfm}z|wxr|vgq~n``hqy}rgaeh`bprsyup{zp~~}|~qb\Yhxywtplvf]gr{q~~tzxzlhnxyqiioqlyzkndixoqyutruzrvwkfdh{wxsy}lq}|}p`^ht~vkdfjfdstsuvoz~o{~qb[Ygz|ztqlwl_gq|sys{uzmgmxzrjiosoyzinfk{rqzxwuw|rt~vkdcg{xyszos~y{o_^iuxmfglhhvuqttoy}p}}n`ZZj|}|xsozmbjs|ry~tvuykgny{rjkruq~uimem{rv}zywz~ps~|sidbj~~yxs~~nu~w{k_amxynhloinwv~ovpoz~wuxi_Z\qy}~zrv{hfmwyp}yxrztiiqzypknusumnidp{v}{z|vyww}wnfccs|x~|vxuox{{wf`fpyxomqplvu~sstkry{t~re^Zhutyvrfkqzqt~vuw{nimuzvnntus~uombhrx}}}|p~s|yrieamxr}zwymt{}~ndelry~vrutowuy~wtujmru}x}wkb\dplxzzikoxsn|x}vu}rklsvyy|{rotvs{~}rsddkpywzvof^Y^lfizyohcx|}}zr_fu_ptp~w|wnuliopq{{uumyu{vrulgldf\fqqrkxxomsz{}xug_fuxyyjqzc]vjbkjgb__mslwxhf}|{z{zm]_r{nm{olsuihl`chjmxmmnrv}yl_tvdkonjgtohhotvvq|wh^amx|yikm|soldjhd_\\lliuxpen~}n^[hxwrvuhij^aefj{{rfkpw||xqgc|ux|xpkwrjiotwvov|tf_cpyx|~}~oaksyykomhc^^lpjtxpgn~}zzj^]k|uxxlimaafijx~phiry}{wzqie{|v|tjtvmjmuxyqyvvuh`cq|x{}}}tw_huwmlmid`]fslq||{rlk~~ttma^j}xuxrhnh`gjlp~tqqdpz|wu|~sljutz~xklwqklsy{wq|ntlddp}zw||zpu|cev||ujljfb^brqoyz|}tpm~smncak~}txuimlbfklnzwk~vdp|~|wt~vztnmuvx{mkwsmlsy|yo~lqmefq|v{|y{po{fex{yklkhc`brroxzy}uqn}}|{qjmecmtwtinmbfklmyvj|ufr~{wu}txtpnywz|lmxsnntz|vn|jqmfhsyuyyvy~lqydi{xllkhd`ftpoxxx|uqo~}v}kjldep}vyrkqjchkkmzrn~ohv~~}yuvz}sxsomwwisyrnpvzzoqskrkfjwtvwvt|xjxpcq~tmmkgcbnsls{u|ztmu}||szgnicfuzyxmpqeeijjrymxzhpz|~~{wt}y|uwwpjp}np{wqptyzrj~jrpgfozwtwwsw~ouxeku}pomjfckskowwz~wnm}~}qjnmdbkz{{qqxrw}|y{}{}{o|}{zxv~xco{usgbuxdevwrorwxr`kxtv{lor`Y[heguko{zv~romjfkxuxmiznle^qok}~}hjyrs{q[^n|yi[T^casonz~ro~|{xz~ed{wfm}n^ktqnnrtp_\z~|x|xfkxwjjnenohsy}uzuqmlv{u~iavnj}ho~{z|~zm_u{~wywl[[jq|{pkrnnxpt|~wnu|y~xg[mvpeswrnnpphYc}|~yshds|yz{qxsox|yy|xsnnxwr{~raf~vvku{yzzvg_{{z{~neYapt~vszuu|syuox{x}}~x{td]rxrftxsonpohYe}~vnecvyy|sxupy}y{|xtpoxysz}y|qbgzsmrzxxxth^x}z{~kcYcvzxszyv|vyvqz}{wz}ztusg_sz|{gqyupopoj^a}~vjecvyu|vuxqy}|{wtqnu{tv}rvrgfr~wlz|wuusl`n~}{lb^c{zst|wz{w~~zu|}{zwwx|vlpkepunivxsnnnlf`{~}}zieetzsxztyuw|vtror{wsz}porljuvlt~|wtsrnej~|nb`e|zts|{z|w~~|x~{zywu|wx|~wglmjsvsiuytonnmidy|z~ziegvzsv|wxvw|vtsprzxrx{okqonxuls}|vsrqngl}{~obbh{vt}}{{x~|yzyxvu|~uvz|ueknlxwsjvytpnnmif}w|wgdhzztx~yyvz|vtsqt{uqxzljqoqwylu}{vrqpmfp}}}z|lbcn|vw|zz}zyyxwuv}zrvx|nemmlznoyytponlej~|v|qdcjzv~zwv~zvusryyptx|whnplwvtnz}ytrqogd~}~y}wgacv|x~{y{v{}yxwuz}ssxyzghnip~zmx{xsqpngawvzyhaarz}yv}|~ywvsx{rrxylkpjl{}ny}{vtsph_q}|}~ma]k|}y|tuzyxvz}trxylhmgg}px}{vtrph^lxx|na\g||v}{y}zxvx|tpwysjplfv~pv~}yvurl`e}{ve]av~y~wpz}zywx}wpux{whkkdoxu}~zvtrmbazu{xg\]o|}xyw}|zxw|ypsxz~mlogj}q{~{xvtpf]o{||pa\hz|y}sr~~|zyxz|spvw|qflhduvy~yvtrk`f|sztcZ`t}}w|}v|zxx}wotwz{jkngo{s|~{wvsoc_t{z{}n`\l|}~z|rt~{yxwz{qpuv{oejhgywy~yvtqk`h{qwtdZavw{}w{yxx|wnrvw|jhmipsz}{wuroe`r}yv|pa]mx}ttzwwvy{rmrtw}rcgjiz{w}}zvtqlcf}|oruh]`uywyzxwvzyonsty}ndkmptv|{wtrojbl}|qvuh`ix{yu}vutuyukmpqwwgbknxuy}zvsqojfwz~rksocar~t}}~{vuuwzqkoqsztdhpsysyzwsqolfj|~~ppwmdj{w|xussswukinnswjakqzvw{zvsqplhv~z{~rhpqgdr}tz|uttvyqimopwufgqv|rxyvrpomhk}~|}onvpgl{v}yurrswtihlmqvjaks~wx{yusqpljz}xz|pgpqgevs|{tttvxohmoqwsehrxztxyurpomho|~|zmovnfoxy{y}srrtwpgilmstfbmtwz|yusqojl~~w}ylhrndg}{t|xttvyujjnosxmckr}wwzxtrpnigx{{tksthfxu}w}xsstwujglmpvobemw}z}{xuspkgu}y{}shnqe`os~z~~wvwzynjnprxteelt|y{zwtroico||~ympuiamv~}vw}utuxxmhmnpvsdaho}~{xuqkdn~z{wjkrg\f{v{yxzxx{{qjoqrwxibgm}{||zwtqkbg{~}}~qmuo`dx}zxsyuvxzrikooswl`civ}zxtnffx}z~}qhon`]o}~u}v~yy{}xllqqtysdbhr}}|ywsofbo{|ymoth^j|x~uu|wvwzynimopuvh_ck|}zwsldj}~|z{nhpl]`s~~}w{v}yy{}ukmpqtyqbbiv~}{yvsmecs{{wlosg_n~w|tw|wuwzxlhmnotug^cm|zwrlek}{y~zmgol_buv{w~xxz|ujkoprwrcbiw~}{xvsnfdr{}z}xkltkanx}~vx~wtuxwmfjmmruj_cn~|ywsmfk}||w{~zoelpectt~xwvwzvkhlnotuhahu~|zwusojenzzy~znhqrgluzwzrruwpeejjmsqdbl}}{xvtpkjw~{vvzzthfpnfqxv|~yttwwmehklpuodgt~{yvtsqmhl~y{|vz}{qhmvom~s}~y|rpruqfcgijpsicl}|zwvtrnkvy~utxyuieorkr{s~~yssvwndfijntrggt{xvtsqnjm~zy{ux|{rhlwros{~{}roqupebfhjpsjdm~|ywutrnlxx}~ttxythepsluys~xrsvvkcfijnuqfhw{xutsqnjpxyyty{ypgmwqrs}}{zqpsumcbghkqrhdp|ywvtpln~}x~zsuyxqfgrpl{|xuqvqrnst{|{www{~wrjrxlqlc^WW_iqt|xnz|nj|uml~|ptsxyrxj\Oej[Z\akpzknmlxqknot~ugby|{y}difXb^]fklozs~v~uutpqkSUmeja_kvsjxmu{vww|{o{rwibw}t{x~}vnhjecUO]rtlvzkcesz}|o}z{t]ckyzm_bgc_`mg[ekuy{zu{qfXaacz|u~{q|ymnk~psrqcflrs~}sxwuvqdry}jffeb^ywxy}zfhagnvnZiiolstvikovvqxjtqtsyw~swt}rv~yjn`n|~}wuxyw{xpyuykw~zcjjrvt~{|u~yuqdrytqonrcphjsq~x{ophwzwz~|hf[R_b{{xotuaj]oxjory}xi~}nwt||}a_S^ywp~lxxyrxhmhfkrwv{x|||y~}disttvxowvozx~zuylwihlxr}~|wpn]bdq|wrozlmvsqcysvtvp}}~yrckgid}y~nqppu}{zquplfujkw|}z}|qkjcgurysckay~rs{zxgyzzvs~}}feWZm`iy{~jqssrntiqtx{x}|x{yq~uw~nbhcjnvyzxq||lrfwzfaeukvw~}~wnokgpun{tk|~~py{}{xqrcipx~xwqy~hnoja^vpqporvsu}rv}|u}|johtqpidbgkuzyqtrkk}zr~jn}uwmx{{ysqgzj\]tvozuvxvx{}{}|vuwhoz~z|x{imd_ant|u{xnrwhngsplovq|~}|qtpb_jdnx}ttwv}sqstghkrwz{tsq~u~l`vv~ywxtxzz~x|v~xkk`swjo|vtrkhebfuwu}mfj|qq~m}qwxs|~~|sthYWhfgzx}|stwzwzvvxtgpvqw|z||z}x~pjllcit}xurso{khy~s}wlm}sy}ojbejlzz~zylx}miihir|l{~ql}t{q|qbuenw|}t{sqgppfrdmjfvywomf`f[\qroz~ut|r}qkgirixx}ozsol{ga|yy{{o}r~u{}zqvtlspus|{v~mtpfejvgsyrp|cnxj{~sbsvlwv{~qhpeWkf]c}~urtvq|urqzokxrz}x~wlrkbfhp}swkr{z}v|xiwyfk~~}~{~}lrvytxubh{xzwm|utysktfcdm|yy|||tr}rknd_eyuzxtyuvxpxuder}wuz}|ujwqfjhdmzz~yzpmxwvypdq|q~ssvswwz{gbhkrxwwury|uvrimlnz}|xz|zipkf`g[aqwvyor}pu{om~qmt}{xutnojefgaeyu~yyuvidqukswnv}phljmpfn~x{{tukjhmy{oq}wrtsrfh]\`oys}vtt{vs~rkpwy}}|~un{xowsciqdZvz{~v~~qhl|kexxt~qyzmpifk]_c~~wy|ulrrpz|ujw~z~z}{t|umnbVX^p|}t{y||n||lruqv{t{~wtyur|pjyt``v}w|zwyrhdxzeivpyzx}rtshpjZXeysz~}uryxx{x|sjurr~yvyuooe__cosuqwztzpsroroky|yvmqpozq[evrqv~~wztlkucnwo|{z{ruujpaWWkscr~vuzwy|x|rmwnu{vy~}yx}rtqhgeckjr|{|{}s{~yvwlrtkl{zvxxlz~p{m`rrkev{~x|tm{}ijzoq~zo}}|w{otp`[`p`Zwx}~|}y~xmwqismrty|vxwmjjgifiqlxz}zw{opxojqv}zxlys|uaquocgol}}vnxlj|sr||hr}vttugfasbTdtp}}yw~q{sztei{w~~~mnudliagbgkx}~wxm~rcryzt~r}jzb{zmdaqhfn|{wv{zmzx~{vlqxlry}}u}wbalyZVhgdt}wvy~ztpnvxpswqz~z}osted_bq_[p|wxruysrxwxlxyy}ypw~fkej`fbfyuwkuvpxqczys{|oyv{xsoragrl`jwav|tu|vjneykdyx~{sssnvsqxjsXjworl~~{up~jrkiist~xw}|kopahkf_plwxxlqvqvwy}zk{wrh`{b_dafk}yy}mrztnqyi|{zuulskgbh\[luvolqp~q||mk|}~|}{rvqtcfg[hZpu{|t|twpppvus~}~tnlmtr|payoksesp}}w|j~nfjcd}yv||~uzsopnoff^brrpzt~u{ynrkvpsx}|zsxf{ra[bm_qtznn~sv}wiwqiyi}ozu~oqokbfjfcowy~ysm~}~cyzxt}r|}klt\a[`q\cg}~w{}wryqpwtjy}~ww~vpg{pphcpfgn|xzz~h~|efhvmy}|{~t{|suyphsjcjmekzt~zu|~rnuuhpz{}{ulncbmk_wuoah}{z~znwrjl^otvwpmtgffifhimq}t{}k{~wzly|{x}urvekc[paWYqyt~z~zzvwvvmw{w{xv~|wj~yqogldcemnu{{~uzpfh|qk|oy|{{xysrsqclocaoemst|xuvwmmous~w{p~lfiyknwsjYpxv{xzsx}ikgqlks~z~rtvpeikfekfhtvo{uq{on}rs}{}zp{qgg]slWUbqiw|~~yx}ooxwq{x~|~yoz|yhllbbjgbkv~w|xknvn|kvuqyjhf`hqfpon{zzjtvlhytu}pq}xqioq~{mbzoklrm|nkncyxs|xjqrlrz{{xywxuLfegbd|sx}~|u_qod\NN_wmefomkyt|ymy|{}ij}hpfzvzyyyvtrq}~mbnpko|edjqrxitkxko~umkd}y`lfZqytxw~t[S^l}|ntcYalTVSigcmjiu|u|}k|bgunx~ywx{}pw~v}{wk]g~op|ffankfpci|lkzcrzoquwcpyX`c[mz~~wve]YXjq{nhk^^QdgZkbkxrpvt|rtjlniyuq~t}swyyilkbw~|yki`tq_obhxoilxhr}{ru{fhcdgXgt|~{g^aUeo|xwtu`^T^qTd``tysryplvmvkj{}xsvq}yz|rgj\lu~ugca|eiifstnpyr^utybvm_fa^nx~}}yp[fYZdt}vxrb_TscUb`jrux|iqymptls}wnwv|txvyybkg^muqkcpy\igmsssu}lfzvy{sfzf`fcbqx~|~{|dYeV]eu~zld`\x]Xbepuvv~fn}motjxsps|{vttw~u]geeqzrlfu^acnrsxv{ihxx{{}pdukfiicty}}|yvfXdV`hy~sd_[vdT_cns{||frz}ppyotwm~ty{qt{|sv|x]dcbt}woincacjpszx{q^|y{zwtdqjfhrety|yy}xnrzoU`Y`mywme\luV]`lqw~rq{r}sqx|ryvt~pr|xpzks{iZhbr{tng|uZbhrsz}w|bq}y{{uuiipieqom~|z}upistWW^\pyxqfbf|dZajsw~i~{mwustt~t~rswvtrvzciwpYdcsyniw^^eqty~w}hk}}uxzurjemljrul|~po`mv]T]^s|{vicf}lY`jtwg}zmsuvtu~v}qu}zwtrtw]evoYcdt}ol{`aiqqyx~gm|~uwzspiekmivxpzof^ms[Y^ew}}zkfl~hXbntxzh~ywotwxwt~yzus|{~vlvq\ixhZcgxxmqz]cots}~zy`z{{t{|rofgkoi}oy}ywsx^csjT\_kw~vgjy{]\kss|}kx||ysquys{y}t}z{{yx}yiwbart]]dn|pq}k]lsry{{hh}}stwqlfiolvvkz{nzf`pt\W\coz~jjwk[jsqw~om}{{xqrwu{qww~y~|}w}~jwh^nwaZahqwsu_mvqv~zkd~wqzrpiinnsyg}v|~pwnamwdWZ`fvyrixv^ftps}ugv|}uqtxvo}s~wyu~~qor_gvlZ\ehx~rigxtr}ysaw|}pxttnhjplzkp{zy|oxdesp[W_amxzmtm_rtpyyjr{x|zrpwv~{p{yv{{v}y}jrh_mveZ^ei~}|ugozsuwmc{zl|tumgjoozfwxx}xptbfsmYV_`qx}mzndwsq|~vhwyz~}yqowvws~xv|||v}vzhqf_ltdY_fk~|wirzruwlezzk{tumgioq{hyzx~}|xmradpn[V`aq{}nytexurzujr{u|zqnuv{r{s|ysztxjmh]hsgZ]hjupp}su~yndyz{mtuuoggoq}nu}{}}wzipc^jqaW_el|trisyswyokp{|tnpw{ss{|wuxz~|zqrfl]`np`[hk|v~l{xtxrgjxvi~}ssjelqy{ow}x}xwoii[boj[[hh}ntm|tu}}riyvt}{womvy{}xt|{zr|y}{}msej`\iqg]fowzyqy{twuifuyhvstlfjqxpw|y~|~xqpgi[`mm_[jjo{o}vu{sjt}yozwplty~|zsy{p{w|y|kqeh`[hqi^hqw|{t{{twtigtxgwrtmfjrz~sw|w~z|tpnggZanl_]lkq{t~uw}~qjy}|up|zvomu{{xv{{wpwwyxwioeh]]kqg_lo}yvxvxogl~sve~{sskfls~yvw|tz{~nqjia[foh\dkpzyw|zuwvlmw~m|y{tmowystnw|szuymkjgc[combcon{~~vw~xjhzrykotuphgoy|s~y|v{y{}tnojf\amma^jfx}~vw~|nl|x}tr{|wols}xvzxrs~tzxvqjlie\`lnc_lg~xx||ljvuwrjwvsjfmw{sy|}yxy~}zwmoni^`knd\hcx||xxzplu~w|k{zrkozxz}vyyoz}vvzstkkli_]goh^ggq|{zxrjno|gzuwoghr{tt|~x{t}}yyxqmomc^enj^afex|ywxmotqu{}wnks{x}x~zqs{zsyvrqijme]`kne_jd{z{oksxsyfzwvmfivzsw}z~~s}zyvuokpk`_gni^edlw{zwvmqrnyz}wmluzz}wyotywrytoogjmb]almdbkd{z{~nluvsxfzwvmfjwztx}{}~rz|xw|ssohpl`^fnkaffmy{{wxmpq~qsz}xnkt{{}y}ppvuqvtkogfnd]`johcmf|{ypkq|n{fz}vxphiv}uz|~y}qvyxt{tnqgkoa^cmnefkh{y|pnxwv{j}{{rlp~{xxxkrsqpukkkbkk^^eoogmmsw|pbcozdof`wjjf]\mg[drTSRN^XOS_hheplyzuyt{}}~`Rsvhoq}ymrtu}vz~ebfxuioehpc`frwtw~||~~mwwhhgk{sfgqrrxg~{wrc\koUXjh]XJVUJLWbdaiht}{}|vdU[{xzxhjmnwzpzx~xt]`kxqvkkwkgmy}o|z}jhfixpccl}nnscxsolbaqzs\R`p{tmZe^RT\efcjevxz~{|svzlg^Ydqqprxxo|u|{un[clv~}s{jpzkjq{|wppqjq{odgr}ktnhyqpkcdw~qlUWbq{oeraY\ejhhkfzw{z}mzrke[Zk}sto}z{tsvvvc^elww{yh}uknv~~x~nw~{sqlzxielzulwgswqpgah~ur_SZcsiwq__ckkilduv}y~}z{sxypl`X]yvvpx~zwq~x}xxj]adnz|zk{}mnt|}vrtwwvmz{mflwymwlqyttkbbvyvgUWYfwrz~gdekmklcnv{|~{||z~}zv|tqgZWi}ytt{zr{~zyxs`a_eqwvtspsz~wyxqwr}}quuiks{qssnxwvrg`i|z~}ws]WV[i|twjikpooic|sxxx}{~w|zuobX[rw}{s~wt}{yvzj``_gtz~orsv}~s~~rurt~r}~rjnvzquqrxwwpeaoz{~xwmYWU\l~{wnmpsrrgi{tv|zv~{{~}wzwtnaX_tw~zs~~vv|{vvxfa__ivwotux}s||zpuov~sskpwzrtqsxwwpecry|}{stjXWU]m{zqoruuuik|tt|zy~u}{|{vvurmbZ`uy{txv|}usxh``_ivz~pwwyt}v{wnspss}vmpvztsrrvwwqhdq}|}~zpplYVV]mvtrsxxypiu~ux~zvw|y~{yusrpme^`|rkemzzyuywc`btte{oixruzzlppx{svop~vv|{zz~tfrt{xtdUbrXPfQ]rddgpw{{o{}}{{|yzbambocmmfef~|y|vyyd_ft}kv|fwy~~otzzzn~okketwpmry|xvxyzzwokv||{zgU\ltap[Vqeadjrwxlswuyzsyyrjelt~noqgedyx|vwz}mnqbbjr~t{k}uumj{zvpnfsvokpuyvqttsttqpy|uhl`Xcnsie|mhinuyykv~vquvr}~zzqnljirwyynij{~wzz{joobejr~sk}umoin}xvnkwvpmsw{vpwusutqq|~}{kfj[[do~}ft~olmsx|ukzwyouss}}z|ypoliitw}umhtz~zv}}qjtiaeiu}wtv~~mnkhuxyxkrxtopuy|qszsuusor{xelcW\cr~ylypnqw{zkv}u}oqtq{{z}}yspojei{~~}rkp}}}w|yyhsmabckzyr~rnnhqrq~|oqyvqptw~sp}uvwtnlwzhohYXYdyrvrrw||ls}uwrntqyyqwyrrlfbm|ypo|y{yjpsdb_bp~|s~{mojmrhywoxxtpsu}{l{{txvqkoyz}{pjp_XWYi}}wtv{uk~zr||lqrt|pu|w~ttqjcdqwwoy|}yyvhukba^dt~y{rklhqlhtuzxtsuwunwuxupkqv{{imk[XV[l|yvy~qp}xq~xkpowzmy}sqroicfrwxr|}zzqiuic`^fv}z|~njjisijtv{xtsuxrnvuxuplsv}{fjhZXW\m|y|rr~xq}yjnnvzmy}q|opmiehsxzs|{xufsiba_gu{{|xoegfqljwv{yw{~us}|yz\\aTTX`qxqlr|sbbbNNQXe\f}~zxusrnnljmzkh}pl_klU_aX[\cr|}~~rztaaaktnzlbp{okT`madhhhmuu~}{sy}wxt_id`ekwrhqqbWc[OUYhkeyvmt}m|ostvyyikhrlcmVQ]TUX\gu{y}{{}vuyv|idhp|{a^i{g^qd`dfgiqqyx}sztjo}|~~dlmgmr{oej{zhlgUVZhnes~rkuq}svy{}yh\gpxrydVaZY[]frywz{v{uw{u}ldhq~}p^bpxk}ohlllnsqy~v}qxsip}}}|clmhmqyxkfoqvn\]`ophw}qlwnrux{~}wsd^mr}yf^f\]^`hsxw}yxzuxxu{jdhu{}|m^esusplnnnpso}yxxpwqju}}|wepkjnqzvkissyk]`gtlj{{|lnx~q|sxz|xxoaepp{bgd]_^akuvxw}wtzu{wfgn~}x{f`iurppponqnqtqsvmozwllohklq|rjmy|{zeadqqfr}yrkqxrvwyz{yxjfokuoik``^^eotv~{{|vw~{z~lglz}rnbelxzwtsrookkszuqxpoytxtmrijiktzols{zpfgstemx~z~wlosyx|xyzy{yyz}skqkl}npeb_\`jps{~}|xvz|yvijvrvzgehozxwusplfvut~ovvpxwxwumigdemtv||yuysntts|~yigtw\X`lv}mz~v~iszqphu}|v`hj^_fiewvxqlr}s~}odeiq}vabdtmX\XYc]aqywzsrnebnyuy~sUXvuss\YkdWZ_gpyyxtpr~}x{~x{pe_k{qjbbbaefquonqxwuurqbh|~xzhysa]kdY_md_kkowot{xurv}}{ynpwzxdbhiloqznk~whffgjq|z}zxliaRm~mjc]^[\ahlrwv|{~tmr|{tksws]Tw|nz|ttvutlk}|op}vjtvtvglyzstuuzm_n|wkqqb_kujgrvz||{m~~i^`rt{nbXwuwojhbcbacimpwuyzzznjux}psuWO_ug}{mlnpojamynhryiflfjmq~{~~k]b{ukrh\`onbipsvwxiivh]ev|~piaX`g{{xmkdbb__dhjqqpuputlmy}xtfkgTUhsvpqrqmbfwpfkui]dcitv{}~}yonf`jw{tddqsfipsvwv}ibrkahwz}z|cZZXep~wrkffcbejlrrpuoruop|}{ys}|_dfX[my|tttsodgxqgjuj]cekvxz||{}}|uklfdoy}wghuugkrtwwv}gcsjbky||~x}w_YZ\jrysjggccfjmsppvnrups~{|xsu[eeX_q{}vvvunclynfmuf]dgpvy}y{zz|y|qjlffs{uhnyqhosuwwwyaitgdm{z{~xw}oZ[\blq{rjigdeikptmuuovtpuztx|g`k_Xbu|xxwshfvuihrr``gltr|xyywy|zzzmmkeiwqmxxjmstwxw{kctncfp~~}x{v|zc[_ahhuzoljgfhkounrzquxrqx}xu{~ramfXZfz{{zvketwkgpue`hmsmqxxxvwz}|zspphfmy{r{|nntuwxxzrdsrecht~|u|uz~l^bdhcgtnmighknupn{usyuqsy{}u~|z~eln^X]k~~}zrfozphlvo`fntpjz{vwvuvz}w|psnggowxxvmsuvxyx~~hkwlddkwuyvu|xc`eih`n~sqmjikmsulv|rwztruwz{xx}reqi\Z`o~ymhvwkhowi`jqullxvvttvy}yvwpsmhjqvz~spvwxyyyyfpvjdfmy}s||st|s``fkfas}sqnjjknutkx|rxytsvw|~zzw}mepf[[brylkywkiqvgaksukowvvttux}vutnqmilrx{sqvwyzyyyfoukfgoz|r{zqqxr^]elhcuurolklouukw}ruyutwy}|yw|nalg]]dt{ojxyminvj_hrwnoxuusstvz~up|ujnmjnu{~wqwxyzyx||ijumghp{~su|qmrs`Xajmgtwsqmllnswmp}tqwwvy}~{xwx~}z}t_cia`gu~ujq{rijsq``mwvp~~uttrrsuzxlqwihmmpy|~rtxxzzxx}qdorkjp{vp{rjjpfUYfpos{srollmqwqjxyntxx{{~{|{v|~~~|wwvb\hebivymn{vkhnse]ivzt|~ussqpqrvwkjujdkos|}ssxxyyxw{tdkrmmr|wnw~rhgmgUUdrtutrpmmmpvsiuzoqxy}{{}{{ty|||zuttc[ffekxzmmzvkgmsf\hw|u}~urrpooquuhhtjckpu~tuyyzzxwzselsnns}~umx|ofeleTVgtsw~trpnmnqwpiwynry{~z|||xsy{zzwssq`\gffnzxmq|tjhord^kz{u|srqpooqurektgdmqw}swzzzzwwzofoqmou{oo{wjdgl`S\mtp{{usqonpvwkn}vnvz{~y|}svzzzyvrsk]bgdgo}~snz{oiksn_ct|uv}xrqponosvjespdhorw}ww{{{{zxzwjkromow}smx{offliXWgrnoyvtqpquypk{}psyz{|{|~utzzzzwsspcafdchrwoy}rkkssdbq|uq~}}sqpoooswnesvhgnprux|y}}}}|yzyolrpllqz}tmv|qhflm^Vdqlix}yvtrru{tkxuqxzzyv~|wsy{zzyussibeebcjv}rwxnlpwmal{yov~urqoooqwsflyofkopqqzz}~~~{yzvnpqnkmt}zop|wlghnhX\mpgl~}zwutu{{np~ruzzyuv}}svzzzzwsspfcecbdlyys~smmtvhds}to{~tqponoswmerykfloppp|~{yztoppnlnv~~vms{sifineX`onfo}zwuuw|ylr}qu{zxtw|zrvzyyxurqnfcdcben{xv~smnuugev}sp}~~sqponotvjdrxjfmpqpq|~zyyuoopnmow}ulrzrhdgleW^oohq}zxvuw|ymq~rtz{zvx|zruyxxwtpomfbcddgo|yttmmsvjcr}uq||sponmmqukamwldkprss{~{xxvpnponpw~|vloyshcdigYZkrkp~zxvuu{|ol|tqx||yx~{}rqwwvvsollhbbdfip|}tzxolouociz{sy~xpnmllmrobcrrefotwx~{|~|xvvrnnpprw|xoisvkb`dh_Vbsrqzxvutw|tjszpt|~}{yuotvutsokihcadgkq|uv|qklrsfev~wx{|pmlkjkooc^msgdmuz||{~~|xuutompqsx|xphpulb_afaV_rus{xvutw{vjo}pr{|y|unrutsrnihgeachms}vu|qkkqshduxyz}plkjjjoob]kshcmv{}|{~|xuutomprty{wnhptja^af`Watus{xvuux|tir|ps||x}smrtsrqlhggeacinuux{pklrrggx~w{|zoljjikol__nrfdow{{{}~{wtuuomprtz~ztjjtqf_^bf]Xhuru{ywvw|{okyxpv~|{x{oottsrojgghd`dinvzvvnlotofn}zv{tmkjjjnpe\gtnchrxxy}~zvuwtmnqru||wniqukb_afdZ_pqoz~{yxx{~uktrs{~{wzrntutsqmhfjh`afjoyxzqnoutikzztzyollllori^esreentsr~|wuyxompqrxypjqwnd`afg]]loks~|{{}ymsvqy}zu{}}votvvusojgjlc^cfjq|{~upptwojv{tvsnmllnrnaaovkciqrotzvx|ulnpqtz|ulmwtibadhd\doklx~}}}so{rt{|vt{~qqvwvurmggmj__dgkt|{sprwwmnzxszuyqhosojs}rq|xw}zw}~v\\fb][\biebowtxxuuy~znn{|tz}xoecdffdaemjcflosy{wvqprxxsxzyob]`bZV`moffotsr|yu|xw~zw}x{qih`XVW]b`^gnlq{v}|}}tt}~kk}~slgc`]_gf^`fjnt|{|vux}{}rkw{qmi`Y^imebiopov}rq}|{{qp~|rg`^`ed`dllnv~{ryzw~}qfj|uojedikdafkotz~|yzww{~{{mhvyuoebjqmfipssu}vq{}{}|{|soo|{qhdcfifelppv}~uv}wz~xpij}ytojfimjdgmquz}{y}|yxz|~yoiszvqidhppiiotuv}|wsz~||~{yqno{}tlgfhkiglprv|}vv~yy~}vojl}zupkhinlghnruz~|yy|}zy{~~~~vnjt|xtlgjpqljptuv}~{wt{}}~|vpnp|~unjhilkimqrw|{vw~y{~ysnjn|wrmklpmhjosvz~zyx}~{{|~zslkw~ztmjmrqllquuw}|yvu}}~}|{snmq~wpmkmolkoqtx|}xuy}{~~|vqljq}xsnmpqljmqtw{~|yxx~~||~~|vojmz|uonrtplnrtuy~~}zwtv~|}~vpmlrxspoqpmnqruy}~zvu|}}~~xsnijvytqqspklpsux{~|yxvx~}~~xrkiq~|ustvsnnrstw{~}|{xusz~||xsollvyussspnpqtwz|~~}{vtw~~~zupkhn{{vtvtnmprtvy|~|zywuz~~ztniks~|wvwvroqssux||{{yvsu}|}zuqmjnx{xvvtqpqsvxz|}}{xuty~~{wsniiq}{xwwsnoqsuwz||zyxuv|~~~{vqlilu~~zzzwrqsttvy{{zzxusv}|~~|xsoljoy}yxwurqrtvxz{|{zwtty}~~|yuqlhir~}zzytpqstvxz{{yxwuv|~~~|xtojimu|{zwsrstuwyzzyxwtsw}|}~~}}|yuqnkjpz{zyvtstuwyz{{zxvtty}~~}~}zwsokhjs~~{zyurrtuvxz{zxwvuv|}}~~~}|yvrnjimv}|{yustuvwyzzyxvtsv~|}}}|{zxsoljjpz|{zxutuvxyz{{zxvtuy}}}}||{xuqnkijr|{{xtstvwxyzzxvuuv{}}}}}|zwtqmjimv}|{xuuvwwyzzywvutv}|{||{yxurnkjkpz~{zywuuvwyyzzyxvtuy~|||{zywspljikr~|{zwtuvwxyyyxvuuv{}|{{{zxuroljjnw}|{yvuvwwxyyxvuutw}|{{{zxvspmjjlq{}{{ywvwxyyyyxwutuy~|{{zxwurnkjjms||{xuuwwxxyxwuuuw{}{zzyxvspmkjkox}|{xvwxxxyywvutuw~|zzyxvtrokijlr|~||zwwwxyyyxwvutvz}{zyxwuspmjijmu~}|ywwxxxxxxvutuw|}{zyxwtroljikpy~}{xwxxxxyxvuttux~~{yyxwuspmjijms}~}{xxxyyyyxwuttvz}zzywvtqnkiijnv~|ywxxxxxxwuttuw}~{zyxwuspmkiikqz~|yxyxyyxwvuttuy|zyywvtqoliijmt~}{yyyyyyxwvuttv{~{zyxvuspmjihjox|zyyyyyxwvuttux~}{zyxvtroljhilr||zzzyyyxwvttsuz~{zyxvtrpmjihjnv~{zzzzyyxwutstw|}{zywvtqnlihhkqz}{zzzyyxwvtttuy~|zyxwuspmkihimt}|{{zzyxwvutssv{}{zywvtqolihhjow~|{{{zyxwvutstx}~|zyxvurpmkihhkr{}|{{zyyxvutssuz}{zyxvtqoljhhinu~}|{{zyxwvutstw|~|zyxvtrpmkihhjpx}|{{zyxwvtssux}~{zxwusqnljhghls|~}|{zzyxvutssvz}zyxwuspnkihhinv~}|{zyxwutsstw|~{zxwusqoljhghkqy~}|{zyxwutssuy~}{yxvurpmkihgimt|}|{zzxwvttstv{~|zxwutqoljhghjow}|{zyxwutsstx}~{yxvtrpnkihghlrz~}|{zyxvutstuy~}zxwusqoljhgginu}~}|{zxwvttstw{~|zxvuspnlihghkpw~|{{yxwutstux}}{xwusqomjhggimr{}|{zyxvutstvy}zxvtrpnlihghjnu~}|{zxwvtttuw{~|ywutromkigghlqx~}|zyxvutstux}}{xvtspnljhggims{~}|zywvutstvz~|zwusqomkigghkov}|{zxwutstux|}{yvusqoljhggilry}|{yxvutstvy~~|zxutromkigghjnt|~}|zywvttsuwz~|ywusqoljhgghkpw~|{zxwutstux|}{xvtrpnkihggimsz}|{ywvutstvy~~|zwusqoljhgghkou}}|zywvtttuw{}{xvtrpnkihggilqx~}{zxvutstvx}~|zwusqomjigggjns{~|{ywvutttwz~{yvtrpnljhgghkpv~}|zxwutstux{}zxusqomkigggilry}{zxvutttvy}~|ywusqnljhgggjnt|~|{ywvtttuw{}zxvtromkiggghkpw~|zxwutstux|}tnpkgswv{}|x{yvuvqupstsrz{|xnc\UT[[`\UPZ^k{}|yxytmhed\_\[_`_fnp{{wk`[Zjs|{ocnzocveRHIOQS_bjh]Wiv}|{xvotwuv~ww|{mcovm\XYejlrhZeypwwqmmmdhhruhsz|x|{{pijmltjdlqnusz|}~cb~pi[OKBU`QZeSUj~yrm}pwo^Zbdoweankkln}~~ywbuveTfe^|z{y|txvoizxvhg|}p~|{qelttmsw{}xs|{yggrt^Wb{wk|qtico`hd\UPst}xgkw{lrbyzjYXijivrWhjaimph|vos}go}kjqdqnxmavuxyzvuuovpnmot|||yp{ylz{}vvya[rhaae|mrmwgd_^W_pUcx{vd||wfoqdb`u{siye[q^knrcfoyy{woze|r|sni{z_j~t|rjkkfkzrp{x|{tt|x|yopsVa}udsgvsamrb^bXVxrYp~{iv}oguu^`alxok|Vmhctwu_xty|{|x}y{ogh{y~tjtg`||t|ijog}|qwjt}xrrz~ztl}XYuyaskuvahre^f]Vwz\k}km~rgqza]`f~ysjZhmat{~ctst}v{vynl`|vvmmi[qxlkrmswg}s}xqrz}uskyVWrw_rkzueksfcka[zv\n|hl|qgt}`__i|}vqYoghu}|e{nwzwxuyo{fcwy~ujm]Yt|lotr}wrh~s~{nw|y|~~ptpmU[wk`qmozhqsfmoaei^uxbrz{mhz^d_ryoz[u_tuqm}k{u{s}}wru_oq~xtewnT^w|~ylru|v{ht~p{}v{i~}xsqq{}[Wix]llzuwpnxokukcwu]j{hd|vqiwedchu~xu^sclv~}jjxyyyw}yowfg}ruzriktVUqwyv|stwylltv}viz~t~vnux}_Wbw]ejwvpzu|wlyoity`gwl^wsukuogihs}qhqggzu~j{mt}z~s|zrukfyxrzsmht\Rb{qs|~zxv~}uf~n~{ruysyv~ktw{hX[ri\io}k||oyyoqzkbo~}^ivr~rkhnhnstfx[zs|qr{i}xy{v}qrfq|quvojnhSTvoqo{y{xzzkpot|~|h~z~~tyuivwu^W_t^`iyvp}qyuxzihry\oquyqp~joinusups]q|nytm}yx}xyrohv{pttolodSUzmlqy|y{jt~}mwx|hx}}wxshvwo[Wbs^bj|vv~rzy|{mks{\optzsqnrlnutwru]qzoyvl}y|}}wzrpgtzqotnloeURsmkqvz}}|oo}~qr|x{iwyu~tervkZT]rb`j||vuz{rmqbgrl}uoptnmoxl\{ywsukzzxsqqgr|vkroloj[Rdullw|xz{iw~lyt~{tr~{}u{~~whfvp`UUhn^huww|zrrwx^qjyxtx|trmkx{n}nesypqr|zzwzuqkjxymmrlon`VV{nlz}||~nt|ynt}r}kx}~|n~yy}{vkaqr`TScrbhr|u{vsu_nmszwutunks|tyx`wzsvo{y}ywwqmhvxohrloocYSrqmzxz}rqz{pszr{lz{||}k{wvywsj`ps]SScrcjt|w{yvv`omu{ywvvpku~q~tcvwrtqzz~}yztqijyynhskrn`YUwqk~~{~yotzwos{o}ou}x||zl{tvuuphbtoWSShmcl|z}{|vzybsk~}yzzupi}nfquuwovx~|w|rqeqzwhkrluf^U^~xnpr~}v|}kzuyptwrssuz}lsurusrldhy_QPZqeio{{~||tfmpq~yxytjrryb{vtuqxz}{}tthkyxpdulum^ZUszqju|wzny}}uqs}|n~{xr~uw{qpvrvrslidzfOPTmeflz}utnlsp|{{xnnw|a~vtzpwz{~|vvkfxxvbsprq\\Qiyuiyznx~sqw}}tqxoxsvwxtw}|ltpwrtlldpxTROcjbiwox}zwitn|}zvh{tmk~t{ptx~}~|{utcpwxjfxlxc\UYrwqmizx}lz{v|rryp}xz~t|usy~qopqwrthlbylPRRidekyvpw~|mto}{sizhr}vpuy}~xvrbrtvekxnx^[R]rwqs~g{y}~n|ywzssur~u{{t|}tqx}mnmquprgla{jQRTjdgmvznw~puq~|tk|kqwpty~|~xvraprufhynx_\TZpxuth{z|nyy}x|tr~wq|wy{ux}~vouznkkmunrematsSTShghn|vq{{rvq|xi{zrkyrsv~zx~{twdjsrm`ynxiZXVlv{so||~}ss{x}{~vqx}ov~u{wuy{qpv~xgkhrnpifid}`US^lgoxrvw{usu}|pn}ju|{rszxztvnapnq_nvqw]\Tcs}z~~n}}}oyvwyss~rr~szxtzy~smtyz}giemplmbl_ymVWZmiouysxvut~~tkoq}rsx~|{xutrammpbhyoza\V_q}~~m~~{pwv}xztr}sq|syytxz}ulsx~u|ghdkpklal`wqXX[ljqwytyyvusmoq~}sry~}xx~tvoankp_lxqy^[Ucr~o|~pwu~x}yst}qstxwszw~}}rkrxxsvegbmmlibla{jYW_lkt|sux{uzos|nxwsr|~}q}{sxgemkl]wswq[YXiuq}v|iiikwtqtuozyrzx|xzvzp^]ffs}mkilxqvfmfhuWOL[[agvomp}|wtxmqvzrvu}{jrmq`iwou]XUdr{h_utrjmnyx}~x~v|{~z|zxdYek^jeWTVUfbh_bf_u`TR_djq|yq}z{meq~yk{wotqv~v{|vrw}taNzu_kv~z{v}vvpj|uhjjr{wz|wvu~tw|yytxxy|{|}rgY`fvwih^knnndqfvt_[aloyuzyi\cxietwjra\Z{uouuvfdamowvlwxt{lgnmqbw}yv`WU^fvtp\l|~~|xynfUSZmwmaVb[^SSYPbTGDPT]emg`ne{sxmgrvzu{}{|l_]`grmeRp|zv~}z{qpwrncovfdahovmmsmxsryr|mwrsvqumk\_cyvvshfsouiosm|pcbmq|~}spc`mtxwxsc^atttvpecamnqxj{~uuzhilmndz|ys_UV]hyxp]v}~~{{{ppgcUU\pzrf[e`bXW_Ub\NISXckphbsc~xnzqju{~{zu{zo]VY^nqn\is{|{ykuyrgfxmebdktsrspprxpv~rxsmuqusnnmie]fmt}srdlrsujwru~pfktz|~lnvoel|t}t}ne^iuxuxlgcemsn|ym~|swxgkjokh{yp^SX^n}}rh|}|zxqmee^`V_htqb]fbeY_b[f`RQ[_msvfloh~}ol{rrz{y{~vxcRRUbtwpfzt{|}uj|zpdoykhainzo~mrnwstzznyirmw}poikgjbgmy}tukhsrxot|t}|nlvz{iezwtlp{yuhee|{wyojfemqqv{n}}rwyhkjnlh}~wraTX]nvl|}}{s|s~{mha`]aZclywhemgy|wkklqokXgua_|z|~}owy|}tqzyys{siqi]baidm{wgckqqr|kx}lk}w{z|}}utx{xuzx|xqqtwsmevynrpcicfkxvxmdos}xo}zz|~ms~tppjhgenqvqzrz{ptxijjpqntflqswwqor|u}wrzysuv}x~u|~q~yb]XY_i~d`]dmnaXnoZ^~x}sqr}~v~w}~uw{t|x|ztz|z}wvv{~{w}ndcnt}}sj]bcpdjv^__ieknrfeq]hlt~ytrqrxqrqvtmmvnfiZW]bjku{xz}p{nyqquoi~t{{vjihnuddjhlibmg]__fcgw~qsg_gmtyrz{udfm{}xw|{wyyw~~~oleRSS\agxzj`sn\Z{uw~lkjvy~zxzq~uvy}sux}rys}y|}z~zy|~~n_^epu~zjiirpdxi^_ggioph_pb_lny|wqqmwtsry|qqnopejcW[^hjn{|}wwsv~~qpprgr~qzppnwuefnkmgeqe`^ageiz}otfdirqp|xncdly~yz}|xyyw}wvhgaQRT`fm{qhysc[{xu}lkisv|x~w{qvqu{rtvzqww||}~}z}|{{o[Z]nvvlopyiqwc_dkippn_in[gor{|sqmpxststnqlmhch[Y\eosytpvrvqilmnj|yqqqzqcismleiqfd_fhhn}pvhklzs}mvzdabp|y}xz~|{{wwskg[_WOT[ks|np}tbbwyylljuw}vxxrqmsvosuxq||z{zwt}zs^VXevrqqxxjyrbbklotpfare^mpt}yrokvutsyylnphh_ebZ^cqv|{~xusinngklnk~vuu}vggwqlgitjgafjjmpwlmmys}l{s~}wd`ao{{xtm||{x|zokbha[_hx~vuzqagz~ukfcihj]jhatl]]qxxw{{gckheggdczwo|zymnzz~uwqcQOQcm|}zwrvtjswx~ypbom[comu|rpkt{{}~wytnptikn~wyrbTp~wwuow{||zwfhmfighctx~~~of{{plmzrogknon|pwrrr~}xvsspq|pwq`bmnxxrenyhiz|~z|t|mhelb`_ju|iqwxyxkicglqqk|x{~pyzqryskhtojceklmwtvvst{xpqqrro^WT\irxstmwv~~xjl{meuz}{~zwuu~}{ogb_findnws~nm|~|l`kjklgabxtjs}~~{unx}uqkssvvw{}}zwuzwkx~uwxx~wk_on^ausvzvmu{}}|{m~xhcfmb`]ipvwyx|pngkotsl}~s|{t|~vzqo{wp{wqifmlnowourrtv}riztnopbYUXdktmv}{~sz|}pj{ugm|y{rzywsymjaeflgcstv}ugrz}~}}yvdbljpkf^mymhv}z}vs}zrqwwy{zytt~z|~v}qlzy||xjaqm^`uqswsjrwzyy~|wj}ve`eldc`lryxv|tsknputn}w~}w|oszm~ysq}zq{{ungmlpm}msstrwyzsequmjmf[XVcjtqq|{{|yzju{peXX`ejfprqbn|hbetpqpwq|zql|tttx}{zxnkhV_fkpkgf|tr}nnfkhqw||{}~zxut~~sojow}wzzzrw~ypxy}z}vpyjfptono}lwkjqkeihcd_delgdrxw{uiu|nmvw}vpj{ysyx~txy||yzwty}{zsxzzzpgnp^fkruma\nh]_vqszulux|z|}xn|jdmslhclnttr|||xztywvh_Ypnfd]_^fef[ord^fl|rnrw~z~tg_hg^[_X[_l}~|z|}wxwutgwi]d~inttowvn_gsni^n}qlcetzyqrik|v~zw{wqpzq|{~x~v{w}~xfamkop~}ng^dgnidlqosvktx|xty|}xujlo{qet}p}|thhou}wz{vrsnogYTFL\m~nmcU^ajf_Vdrg]cqet}tpurvu}{zmqva^nw~v|ou|{uttzxfh|t}xnoiiaa\\TTg[LK\``[`jnqo~wjs}synclwpcd]bdiq{}xuUGRZfpyyngkhaWabZTOT_]V[VWTV_gmfit{t{yx|~}{mjq`afvz~r_\hndilt|{og[`ahefefklg^g\\ckph_^ttibrsj||qroomorprj|lsrlkspli~s|rtsk\Z]`cbeae]dqdTYijjcjqutsugn~{}}}ux~poippv~}x{{~o{tYIT^fio~tzxqvsnenrid^]ek^`\[YTZ`g`al|x{v{ssz{{uy|rzyj`am`SQOX[gr~zoqtvwsuqtstfeg\_blha[m~yru|}~}~~xsoet}~uqvznqrx}vdnf\[cnnmp}xhgfhiff`d^eri[cuz{szw~wqrrroxx~z}{vpdps^MYgrwz|~wyuqir{urmmq}qmkhhbhlvrpw{zzy||yz|vzzppy{s}}~}pc\em]ZY`hmw~~}|w~qxuoqx}tjg|wnxvvw}fbqx}x{~}xuuuqtopu}{{l_kd^_mwwu}vwtxwxurvoy~p`jvywr{{~uh__ne[Z]jnz~|}{s|~}|wxolb\jkYShy}wyrnks{nnjljhmsysu~z~~|zwwwunctxwzy~suv{}~{|ouyy{rg`atrijmy|yx~vuxzpgu~ujjwlisyolnmrt|{{xrgu~z~}zv{yuxtsw}z~xiusoo}yzx}|}zw{u{r_gqsngnormryujxznfewnecfmntu}ww}|ywrz~vvlkvs_`r~wmicnl_[WZSW\hklu~|jgtokmyzwqwx|yz{}um||of^juheeqv~~}yyodmkikxxrjuwq|ty~vvqrosnnmfnuiXeq|}~~}{w}}}xgsupmz|sqlpnqmntt|xhr{yu{|~y~|nyxp{}vle^aukc^eilqu|w{{~}{wwopvoZbnz~}~zurvlefd_adkeho|knu~yfnvrjrwsnp{sy}wlc[mk^WY_aimxx}xuywoqvmb^oslbgtoks}uvrrqqsnrnmqtb[gpxv}||z~xz{~{h^gia^ijjj~vyxwvwh\gnskmqvwu{~zm|vr|ukg]btkc^finsz~z{xwqrlijediiW]ky~vpmetqg`ab]_aiehnojr~on{vw~zwu~wzww}vmj_jxnd`ijpt}~qv{vpwri_iuphcosnkxyvwsvuyvx{xv{yfktz|tuuopqxsuzzu~niswllsqop~}~w|}|xykajqumpsxww}s}|}tpdi{tidlmqtz~|}wmt|vyztqrmiilZZerxz|urgswlcbfacdnlnu}rvwmw{u|zxt}}}~owv~~ujcZSfi`X^eiqv}|w~zy~vmiz~xop{{tt}}zwwvxrxwuryrenx||z{yy|{{u~}|xwq_ansintsry~rmu}~w{}~wx|xok^jxqfdllqrxvv}}y}tyt~zt~~zxqplmfhifbgi[am{~~yq~silkghkqmqwvnw~liu}rrvsprx}~u}y{pqzska^QXjg^\gksx~{yphs}yqlvyvnx{ywrroqkmoniloafp~|vzpsrnoqvrw}vlu~}yxutq`_nxosxxxsnu|}vz{{~~s~xou|voif[gwtjjsu{|}tn||sqy{unxwvrmlijejlkellcjvts{ogkgediihnw|jeu}pt{}{w}tv|}|zuq|zsjf]Wiph`hlrx~}zzvmdivsmfmsulpzz}xywzvv{|vryols~}s}{nppllnsou{{mt{zxicp}srtsrzz|pkpxxswy}{}zwqk_jvrdeikpswu|~xpr|sw|wr{{|usppljopkckfbht|~~{ou}xkjlijlrot{ostkszttpnq~w{}w{~|sx~wpheVZil_[bdkoww}{to||srw|zovz}yutstouxxlmpijqzz|y{ruqqotstzvjy~}xzrdbrxmlihhw|{{z~~{yvzqof]itn`cdhkorqz}yquzquy~unuxyrplmihmoj]db^alru}|}toplkjolqvmi|wll~trmkm}~xyzz{~zqpzundbWP]haV\^ejrvzzsls|ztmqu|qmtxzttqsoqwzshomkmw{}x{tpqmmlpnrwjew~|{xvsvkabuwpollqyx{|}}~{~wwzqpg_jvreghlotvv{tmq|ztlnqxpglpsmlhjggorobhjiku|{zwookkinlovrfv}rn}|xrqp~|z}~xvw|z{|}z~|xw}upz{umieX]kpdbfipt{zvpmy|yposy|oqv}zvutuqx|}qlrppt~~{rw~zmlk}~~xpu~uvruypswylp~scj}wpkiilp}{]luppvy{~{hstlzrsf[hl[]jiaciknmosnvlnx{y||yvazte`{w~z|}mc`xpvivmcjyxnu|j||hpnx{miixsx~wo]ogaixrdspupqsim{}vptqyiwsqxwnits~~xwv~srxsx|zztu}}s|qTL\c}nssdXWQ^slewwqzppjrkvuu|eb{pqpmoxyuslsrhywt|~su]]}z|}u~v}t]frs|agl_\cVORRQ]c\pnTY\[kwvx|yw}~xpgpu{cfnckklp|x}y~~}qZKYayxynqx_Y`YWaRRYYdhc_sj_jg_jov~kdmiuy}rvrq{vn{zl{ux}xkmeO[b^siQcfhhkpqlbuufjuforgkopfpb_tthomixnfhqjtyn~okqluwxogdhdtz~~xxqi^biXV]P\jimjXMbhfzqsru}vvz|ehqjgpeni`mmgv}~~dZTM_vyuhj[fsfPQVF[l]UYXeia_intuj}vt|{||{llvlskv||{pq|m{wmpedXYZ\_cuihsagzs]d^fsojmzlnd^wruyhhquhslhnecmpv{z{lc_q}w}~|soyh^ebitib\Vfg\UmstpZOmtvzvstx|r{|tt~qrf}}thvpdhi`jbgzwv{ytt}uo\Mbehjznqv_eqecic]`e\`^_ia\nu|xmtkuv}y~o}|senf]ttso\\[HMb]Tdj|mvlqvdleqsifjahprzhlbhwmhonrlbtrghvqiwpW\cq~xta_Yelf`vpyo`b^dcbgsejY`nmwn{uo{wt{ukn^jhb\^pkbbvswxk|z~orfx~xkpk[e_eqimoyjfh\a\cka[X^a]djnl}|ijkvw|}s}xtrkoyror|nr|y~hn\[a`d_dnswyolojhxlrhotgb_rs|enaelakezuimsansz|kYf|zv~}z}x~|}d]cxk]humyytxy_Z\ek]hknkeViulo~twztyqzpii|rpzrm]ppmspy|z~puwlfofbdQV`p|ysh^va`aca^fdilSnpvoao|}xneyiux~tyrw}}qwv}{r}t|wrcR]VUVP`ky|yz~msquqnzt{ehtptvqdjocusdjblnmrftmxnhpkx}|}|vdnk`e_dnmztztgtekjhrsuyiihixv~}xyp|tunonm|}w{dckgk^gthqyqzpzrkhZlr]^VOZezt{mw~somigjnn]piedbqkhusv~cbhvx~~~ryv}ulxxv{s{xx|{vwpigSQQVY[ajl~|y~|}|}x}l}{onhu{pqlhobhgchnnmkqjj~yf^ikr~u}~y|~~}t|ic\elahvqxnzsrlop|}uyaglu{szpvmqtppu|pp{}ql{slhcljbkdxwyy{ptkribnmh[XWdk|zprwz{sq_pqko`cnfghp}rvnhgt|x~{pttmt^o|zw|zxtxlzk`X\aYWc`i[b}wyyvfmijxpgzk_^ctljztsjdx{sms`hk}|wzrutq|wwvpvjmllefk]jy}q~w|vtrtuq~z|wwxvx|~{ypuoy}ofkf]d[[ubacuw}tsre{tc[^ssdig\`Ww}iowxhfsfadZk{mooyxfnt|uvyovoyhkn{yy|{|uwxzss{qq`gXZX^\R_goi~{vtfkxptmslorkmmvdeoxjm|xolZZuhkkz}~||vturtnn{vjrurmUmrkoz}}tjqnt|ptlm|v|jj{~~plqZafo_bfjrp||t~ltynckiwbfinp_cEYmw|y{|{sk{{qf^rqyyo}~yc]lrzmzsoesjZfrmwv}x~}hWfuyakrhlJMpmswcts~pe{spbookq|ryj\ztolvbzxewtljd|z|x~u~ky|v|uwowzoovvmxa`kodcwh{w|ghyzxxz~xj}zgk{{o`\hk[c[cvnkx~|{hmywgsbhr^Zgmkhc\^f\f~{op~mfnwnhaexqlxnq{{{~}zso~ohxvhsuvxy{qo~~zvuqekrapiVSRNZWYkrfs}vnujzznlpmluv[jp_\gat{nglkn}}z|tqvu|f^pvntnqsohnriwsbqygy{{en~{r{v}vfdq|}qso_gsbloiv|s}{~{}iqqgfjlln`fmb`qia\Q_kpkzxqwuqvyenyer}uqvuvx}t}z{}im~~ilwgryq{{}xjhlmye\ifSNWGUlh_oo~xkvrou}iysrshrj`qsheuiivo\gm|~v{k~}zxv~~tppkj|slv`[vrW`_`hd]jsp~yygk\^md\`oiagzvpoi}~v~v~umeqaXpv]WQWpphbie_`Zovp}upuo{~zvzfr{otqoyt|nnw{t{|}{}{|~~turjsthdw}toTLai\cY[^nkp~rl}t}zih^n{phpys|n]qwlbosp}ruj|kj~zjqq{ws{w~hr}{xn`hragbdf`eql{}~|us|v~wr|ihfgnh\ghjqn|wsl|md{pxoeYifXcfnhSOSWkhqrunv~rz{s{pkyzy~xrwu|ykyotnz}zyp|~}tx~~zurhblnikd\cN^XYZXgeaitu~vkumtujflfvisw|nolfj~yo~ov~~yttw~}}jguodIDKO]UPsws{x{zvwxhorsw^O^afVWTKf{hargqyjvruloj]`MW^UKZcqpQYvskm~yszp|}y~w}sjclpu\Oqsgqky~or}rqrozv{{yu|yuyv{kqmxkdV[h^ZdfUZgZi|gaoxo}yudw~rw_~~v|}{~qdm[\qlpmvmanXCPJ:VfGPiQPlxqu`[xyxpjvmsztpghoiolvg~~dfxzzrz|}pm}q`rub_Zi~|z}sx{ruiWt~qsyoƫn_at^Ztls}mx|bld_g]QKSk]ZYWSPm`[ttuiY[{whpmhlsa\tkupcs~_^kildvUgfelkjuqZvvkpwsnplnuz~{mzqzjL[g\Qdobwjp}zkoejnb]XaW\bmRkmObxrw~xf_xi{|esltorvrrjq~{svysju|~qwu}shvxooticjdotpvx|}u|y|zzvysnvz~vĴvtkUongbjv}lyx}sy|c`dgZGhXTXOHbkbskdzcAbtgxrdggqcgetf]qsdf\sjh_ebpq{ol}h_itpuuqbsbwqp{w~{~igmZWWe\Xg_m]vorjnndQlbN^vR]c^olo}y}]`~{y}mcxs~suttfwpntstz}wq|ooqxz}cf}kUenfu~{uzv|rv~tz~|j|~|~}{triws`fmlbbhwsnzkUgs_RypWWLX_`anygcrbSezlwde[jonucfzhPdomheft^fvictmknesrlu|jbhagts||~~uxaXia]Z_M\YUof~ynvucXumabxv]OVhxmqy|o~mb|}stsul}q{uma{y~uqrex|p~{g|xu~_Zw{e`lus~}vvtmyvpwsr~us~Ź|mgvjngYejVdx}qxjryji~b\MRfqi\f~g\i]]lmroZhmofuahncgljenrjkZsysejyqeWmxphrjgYrffssyssjf|gebakZUL\UWrqywuw}cmtqmtngeaj|mr{nyql~wbmukyr}mtuvuo|{{}u{x~ct}rbwjPbyj_dqt}{zsoqut{}ct}}myur~mlhuu[UjoqzxskqrcpZh[[x~lWhzquiessykx`^evoemql`\`jbmy^ycnyjv{ghottgvxakc`Ywzlpk|q|y{yi{wiQdZ\SYfVYK`kqzvyvv{jqfiz`bganvnrv}q}xzu~svu|kou{pz}tl{{n~xqnvrXfcbw{vtfr~{}l}touw~lzuttejkfi^fugTcp|xlllh]d]iqns]bnqo]ipwxjwpiltfcktshk{crjfu]spswoprf`pefu|fc`Xkx}wmutzzrqxpch]m_deQaZYPZhswu{}lcy~ttyxzqrupjyxyvptq}vls|xur{oyxl{kvusx`US_rtusfw}{lyx~vwlgzq}}}uyvenpwjtq_ckhmy{wpqktulpu|ljjlyy]kq}pplmemurmYdpg\rmcwXuxr{rdiuuvuttqp^`T[kxn{ywyx}yzko{|YXS^[ZeMaWT`dizv~yuy}jn~op|y{lv{gxsszum~{spx|ho~u}gw|ztklchdlyolfs|r|t}omywy}zyz|~}wx{vdegrafki_[\chxy}svpsnitpc_lwtlbnn}unojlqqywapbloZtkstuw]]lkkotoseYhdguent|s{}}yzwz}s}w}zruufj^s`X\O_TQS]`k}{wtszztz~zoo~ssxrmxqnq{iqywxk~l`V]Xewok]tyxw}x}egmpy|w{{{||y}~{~|wyyzv{vtmq]]cnrnpxlurti||t}|blpvz}oppvw^egirienZvqw~oryrow}|miqmo]W\\fywecryu|~z~xpxtpzxwkdrof`XYVtXXXIbicerjjrwpmst}zsvptqvx||seuqtw||~emwswilkc|{npcl}}zu}~w{}rz|v{wsj}r}u|}yqvwuodi^jsiaT^iff}rzusu{t{qvizxo^wsldyzvz{yuwajgbmdvoxyohdem{zcmldxmgooovxvz~{tz}}|pvt{}ujm~iWbrruig`RlTVXN]a_`lursv~~}ujk~~~n{osy{}wqntwy|mofgjZgoe~{jw|{}}yu~{uokmomsvvw~vnyx{yzxrgq|mhpl{wpwdebbimxxm~u~~ww{p~w~lbq}{|r`qmkpyss\hr}x}jqw|zuvowm^rhdk^`er{oou{}zz|}x|{|jqusyz|vk_erpqjaZ^be[]kLc]K^dmvvici}zxzxzzsyy{tglo{|{u~}omgx|y}fbleynoq{wzuw~}q~kuszruqr}qev|n{zux}bclkooddifp\X^cpwl~q~}}|rw}nt|x|wlyr~}vr}ruk`djsj~}spmtokytlw]a~u|yk_^qz|wz|rtfdn{unytozunxi]X^nuujTeQUfPSU_hlmmekxt}}vuux}~}vwz}{urzyi\omni^kdszzyxov{w{mzfupw}zyvmeky|}uwqmohysvX_u~jaZ^qlnopp{lkxs{rzrmv{iphwrs}mruvxyfupxwjunlr]eogrkjh`kwvtq{{oyx~swymmyvgkcctwoXMUahvfQeJUhbejnf__hqx}zw}xtpvq|qontwxr|nyi\hjswrrw~zwvpeoqsyuvxqhlpswhfj{rx`kudfRCLdx~og^Lbfdsx~iv~zrpun}gruhr|}s}{xxffiurgrrywwqr|qyzy~wwxripqvqyytmdemvxcf}jSL_zkEG4EGIT^nui`fm}}y~qx{vwotz}zpqy|~|xrrrlz}hprZkzrlXXZbtt[fc\pl{wwpssquz|totwswoa^co|q`]hogzcTlWPUUbz{oirhvzohqyr|usvxuib\c}pmcRckfbaWXVTjgioiklY]ha_U`phujVU\jzvk||v}zyrowz}vljVWLA??MrqtnyoeVNSXY\aejcsvnuw~yyzp}qu~z}}qzzpqxerkdyrjlmVY][[Peeesof_\\jyl]mm`tvlnjhmniknup[iUJ^ZTNSeztjncu~mwt||pgotvsiovrmdc`][_ddNR`VhvgdhRXjmmhqe^kdgkry{smqrqjzuo{~h[E@LRVTXgydopffd^WVSYjvak|ev}w~w{srdm|xo}}}l`qfjrp~yysiqZRalldp_WcipohdcojWitbgfacjush`_cytVdSEXcdcgkry}ws~~qx{y|lYcjnrv{svz{|uaVW`d^nh[ipbbbZ\^b_hziec\^k|x}jl~qhptx{y{xqv|jhX=BGJS^\qlcbhone_atj\zsku||y{v|p{}usv~{iwz}{mYob]is|osg_\dc^sk_`cedlj^jfPfyozt`X]kvxoietlW`TSVVWW_qyvup}|ou}xptg`^eyz~~xqh^d^[wp]hp^\dhopfUakdurhcj~ytxrs{tv}quqmlkw}|oZ^TNVRKITThumppswjbxfZzyz{rqvxyzyv~y~szybo}qeafmZXfghZmzp~wrqq|q}s|{uoruqqv|}m{kthw{ybpjfsuqhgnegpeitkuvmg^aihhoffp_bgwjNLuhJW`i~x}|~~y|}~sdoyv~szwo{vmktz}yt}ru~r}}hYpicRbrquwtqqoums~hmqjosvt|o|}cemornkmr~sch\^mqZPbfu|ycrwu||xjfanm[idenf`n`S`mshom\ckrungfsq_f|risoor{zutxt{ciwzy|{~zu]LQSTW^j~~`riT[afibTRXdeewni|}syyuvy}|{}z|tgorvz~}^W_dp}~vfabikcZYfhOZn][bjmjid`__^y}bns\Yjx|ocelaeiUT]iaZm{}{|x{~uXjfapwlpnaed]Z_d[lq`^bfgmn`enY[ytwpdeo{yvooqgmov{{z{xb\dTOSPT[jbsvg^^fihgb_f`fwfwpnw|zn}|~z{{tuuuy|}hgcZchmvpfghjndXjbIajclne]ZZbif]cyodlkfciuxtsolcZda`Z_o`ax{{n~wuxW[nsuztlxj_dfioiS\eZemkfcjf_ggfsmo|wunoy~vsifgt~xuz}qwzfTXKKXbaaohv~vtrjb_]cno_fzsho|{snu|~~|{{~|ytobmz||xceXWkwmq}xxvqkgkc\h]^g]bjonc[^chnehsidehksxriddmsa`^Ya[ajko{xy}}gyaPapw~tw|ujejoqefj^ajvq]cj]]dj~xjnjglx~xzyuqxn`kuz|}~~lowgcaFAIPXbkz}z{}uhehowlhsqghvyyxsnnkt|{|~sfpv~z|}zzykllVUbmddzxo~{v~z}vspe^cc_Y`eXU\fqumfhpqor\\i]^flz~yyvqt|ztviX`UPPSY\hz}kuaGWVn|rrwrmxzsks~~ytxzsymleb^_lz}}}x|rlqd]\]aevlZ_~iWIKPOYabdgfhmg^`suu|kovmr}vhjndefejojqx{ws||phstxqafx_Q^TMQNLLMT^UJWc\TdkifbfmnnrrshltZYilgdm{~zuyztzvpkkrkon`_RKVJEbZ{kqUIz_SNJcQZx|]TpmjTdz}dvmba{vme~zqxwmzqCKR8rY~n}gy}smvt_XgTR-KslX\qib]vke\vl^`ZN6djUonX~UTQsm_c~nme^Ybblwyitlp`xjWn{ǛʱwkvYD6M=MwmtXQQvg]vnVOj]`EEh]qv|wewvmtinyr{d`_5PfQnybzv~}{ưzshjoawf;$hаjwhaPql]U^fNXV\;DVARqcaXT{ogfrvecPT=Zwxgzvpkq}wrykcXW]AVtΰofUHcjRi{rk<[t^ggN]ZMmz{ww|uqh|f}cT`A8e@9Kp͸z~{wvz}u|xuw_2Ykjr}ms]_hX[_}a\_dRRhQSi[vyoevhmdg~~imwRWR]KXcnytzuoe_`yencTU7IYiaobVxgrv|VlsqoU`aM_mi~}pzdoi~iftqcvlnMBnN?Bdȟquzwu{lozxvuxX+PUJ[kp|w|rspaft{X\a@CUCd`^^{fsYv~ezjqqqP[Vdn{}swkudhwhjxk¬trm]eW6@IGBwϼrxn\_i\fZQ]=I?Nhaiwsxzu|s{|~erhLHNS[sw~vxz~yudi}MAN9FSdӝsitlWm[[LQu^FSMJI||cztk{pdfuMPRB@;p|~{sqr|sxlbqRLTPMjwhcQ|qFQi]YQVqaZXzyz}xqo~_}]\HTq9/IQH{zizr[ib{{hm^Q]IFMPjpgzongss[pi``[Xasq~xczfc`X]M^pYsoFg_gf||}~f{Z{VUupjl_RcX1K3GQgx{yxrihp^bgSR]^sw~hxToRVtisnvsq^q`][\byp}mpf^qrk|llgHU-S9&QW{̸|}sreh^ZobC^DYQfc^u~oi{rvzsigiV\`T`nwscixzy~zoyfiQBR\DahR8fe~þ~~nvcfhLX8`N08a^tv~{t{sucdXNb^CfWow{~z~~nabvuf`rZWAWSTet°vph`X|SARgNj{lJou}{z|yuxjnh^hBL0PU5Btˬ~zl~j~uy}mme`PEMKNhq|Ȼ|hYqzezYymhZ`ncr|{}}lwkrvX`Kpb;;\JMry`oxomb]\h_ĵvmqg`eSHK=Df`osoz~nphYZa_p{{rw^cVkLUx`iVXl\^Su~wunhlfQh|a{qqZVeJ@M-3/[yhvշrosknq___Qg|kmqexU\kpnltr^oi\cYS`sunrs]snj}yuperLE3GQ)DOIĵywu_iqS^\DKM}|`kzzwsou{o__aYa_Xfhlluvz~~z|gcVqsI@^Q?_fJ:bft{õxl|mSNKmV8JmZpyzosvqzrfjWNaRKdSYc~v{x{|~voacmeaSm]TBQWQenużmdmiPftSf~rRk}{~|z|hkz_afD<4SY;Duz~í{i{yi{ptw|s|qduh``OBEINciyzqp}fyo_gsivfmXRLeXEAW`?GprzTsǶyz}iqoxhdztx¢|qxul\~fI:I?OV`ojpnkn[XYQwv]uvixqpncnUiueWXSMDhtn{yi}Vy{spxfhXhZI[7(<*3rZatٿŽɯ|~m`q`Udvtgi~ds]vq[nM[VxfVwepUM~wvhotXzlwnTxhpQQGGOfsjbv}yztu}ypspzzcWZcSVk[LTQg~{õzrppsrfhblipsXPUMrc;(2QB0Gab_N´{rsvuZl~piri~pqsmajyoW[nSZ]kb|qeW]w`XqzuwıyycIPP[njVc`i~ls\rttfzbkwylvp~|dq]eqlvnnu|aZty|~fcZdprodG_k]iot{tudowzyuz||uzxv|ek]p\fO>[P>Xklx~he{źc?9}XZ?4RXZmpn\rgf|quynpnxkplfWt}woX{}^gynl{zfObpV7Rebbpsr_`qyrphn}~cynsst\`>H6jθƩi\eYONI^VHWKJNN}_n}axQXjbb?[urnbM_XuzsqIb`ln[hj|x^nXtdirhcf^_[qgppcW^sirysŷs{ƗutM"; 9HS秌q`sbV3??5cMGcM~idMKzX|n9Lx{uMFPequ{ew9QZFrZklqtjpLfTQu^r`čk\a_k^ydmYK|brĎ|yv̋{Ǿٰej#:DA@p|Ų֘xhmt_9DR;=h;b`W|c^>qZVV7j}kq}DFXintnQ>pVVgg}vnpwxhy[ZQkDbjf_}z]clfw^|Cjd|v}|my}ȸyuƹ֟}aI L=(CIxȘ{}fxwT8VU7LU@hT^ydSHyVf~H=tzdwyDJ`myszFP|[bco|g|trljsWMRcAfjj_wafribtCsguyultzͰ{zuǸ՜wa{?!O>2GMę}e|wV9YW:PW=aL_{dVGblH:o}fy{HNbvvvzKO{]fflylqu}n`mQyKCX8`qoiĿ|hfvruiIllvz}zzku~{|rºңvZpHBF2QNқj{}f;U^@Eh9YQO}h]DvqdY1_|ikWS_sv^Gxmdsarwvm|tyUuqOZ\0K9L}u{y͒ttkmisvZWt}xo|pr~Вxz{ì¼oy\]_ 'O9U^sǪ౓iuTAfRow`y[^{zwG_}aygtwk|r|~_ZvWCu|16B5v~г͵sqgsv}rwNztrxro~|ysŮp}{|Śn‘tisv[Qa1JFQrkdxe?^[@W^7Qa:)@0mؽ}|yk}i}vSqqwvxiyz{s}}r|Ģm|kfcmUN]5HKT}nǗh|jHbcFYd6N;Sh]K~yK1`zdwjitp|VZ}evkktmzr|dOkR:jyb|ngm~Rizeizmpzlo}tWWiG?uk%26;ܭvlmm{um\uos~giuɎi}fwokqzI[PNYN!4MEnǰ׬zx`YpUQAFE@qgKtxf1Pxoklofut}kYzi}bf|mogviNeX=Z@"8)eψsayt|[tssuxrbyoĮlynvvŒeueQTUMWY.(JBJYϪ{gmuYe{@OBTngNX7_{iqxhiegr|ke~hj_~hp{kmhQdS@e|8#4)k|{xˉu^sp`vxvm|q|p`ygðnulwta{x\PBIHXZ8)E:cy[zãƧivq\wjBTAlndXJ?jygxnner`swimziuv^}{fvmsicQbLAmu/'2/vzvu_qq|bxs|ist}l^|fŦiui{q_xqY}G?CGXX6+E:lyaxɥlys_{jDTCpndWJ@j{k{nrirbqvmmyjyt[|eqmnedM[J>fw4%41w~|Ljx_pqdrvvl}h}o\sipokooZvqsPuR6AASX>*DBb`ǧƳssxbtITHcpmQY:`|qzzqviomyug{kf_ii{_efJPL:UzN$71g֘{ikq~mhzlp\y^d{{eoa~qd_tqYXn49:HWO28OOwԶjxkgdMTKq^^|@Hsxtmiy|ipwrlavct\st^W@N<>jp503QRvßpqpe|MUIwnkNM?h}}{vst{qiyn}q[{cj`fyY\RXE5QX~wĤ¤sqsfQWLwooMQ@hvxw~siyo}q]zbi[hvXZ:C:;cwG4DLٽyiswfnszdw`{gZpn{{lf`v`rNhw`a=fI0:AUWD8TZ|ؿprok{SXPphPIGr|wt|nnxwmar`oQuiZQ7A5Eoo<:C_תsmw}ycsnbbsz^^zz{}~|ei`~z]XQuceLHf58;KYR;AXdyѱnvlziYWfwxWhhAYzltjxsfgxecya]|X_>;:9\wV4BGďrwzijswf|^}gYkhtypgb|~]jLgo_^GVVB6LT{sԺxw~iihxwRRNpwyx{r|sbr_fw|sLrlV]896GjvP>F]ͱ{~ijo~^v^aWgyvdmtuwifvZhdFXw~hS^4[U7=DUYK9LVlwy{okguR{[Lipp{ynfxa`rxvQbwQa@56?ay`CLVuʾ}|reppmmWziX^tbspqigmwpNuIHfzzsO]B?e?:?O\YDGZmvΰzxvlkxkVtNX{{wutxgei[esvdHv^UV357OsyUNTzտx|zlo[FDNkbURerzxv|moXgtgfiftifdkvpfm^rvv{ulsupeuoxqn_\zt`Rjn}`cfnngohq~lqj{y^tk}}vupwih}jjnwow~p}}iW9Prnp}yy{ykzm_}{]tw\nrwtK+Ivɻt{ygHY[_zt{mwmf}{eiz}bn_}{ip|vstXO-8n˥m|lyv{psg}sywmR>>{ٝWWR@Yj^fycThdQdoleTzn~Xux]z}ymk~u~mwgLH6/fǺxpmvwwiu|zyS;66uܱokNZk]^scHZ\FP~|g`^LjjqXn~xZtxpfzvyijzaJH=/]tk}xtwhx{p~qO<:"3mزžytT\m]^tdEWZCKz{f\\Jgfm]py\qunezxwkk{dMJ?0XvjyxmtetzĪq~qP>;"3eҲĖ~wY`nZaucATU=L}{bXSGhz`mf{w\v{kf|zzhn{aML<2Wx«rl~xnnmd}n}ŤumPF>%7`yǩƖw[gmVgx[?XR:Sw^VNHkqUqks^}}hiygty^QR=7Yqƨrrvyhogg|vjĝwmRJ>'9Zrɛ|cpoWly[>WN7TuZPFGknQmsua~ii}}ity_SR?9UmȮvqxximfdyrf~šwlTMC,8UmХhqsWm|^=ZR9RtYMCDjnOjwxb}~jh{kuzaXXF=Sh{ȳyqxtjjjbzsezyĥwpVNE19Phԯrs|[k~k@UX:H|{[J@=brT^}curhxvmp{eXWK>OcwǾsnxap^{ncpwu{tXPJ77Kb~־}tdc~uHNaA>p`J?7Uu\Uim|iqwrm{jZZQCM^qţx~l`|~`pocd~vux^PK=8HZw̤xxZy_CdR:XmO?2AnoRryd}|pkszktt]YUGKZkķzypohk_pbYu}ù{oufMLD8EVoҹ|bitJVeBCu}YC52Yza]im~mpv}nmwdWXOHXe|~kb|bmygZ^¬mloUHH==Tf˧~Zvz~wzoefbD]rmfapiedercWqlsz^Ubrf_krr\gzuxywp[VVRgbp>a}qa\KXcWcWT^Ytt\Me{xnfxiwisXp}ce{|g`lqmyjvuYwUzsleHeWa`f`gs}eS~tUaooN]X*TXaidaab8Iv~l[ukhgxcthtrwp}UU{mu~waR^|pf\{vti{{y[@\gMoìzdU@U]TgtwDbNN[ey]\_{y|iwY\EO\V_w{{ri]hnrpiy}|neuuq_|rfPD]iep`epOTkJ|;T2>lOvwcjMzxcyieYkRhxy{nvZNqc`}tm_mwqyyƓgrl<]SI}x|hxgeet}jhgX=`fbLUiWpwyc{Yvn:erEXDs\}jRknmsxu|vkqjxdsy|v̡}]QYSXTzs_tRNugGDoDQtvOH{utyo}~bveh[Smfcnji^kcMnhMmxprqq~yskxrGdomrXnlcreb`ePWS]oJV`xcapeqYd{JIATrf{ikhYhgwuupswmntzogpwnVMHk^iiWk^oitpXnmw`Gqbfxgdwef}dVkb`Wir}~qtS_XJzshue[uzmx{pskrwci?e}Yp|~l~bJYu\XUbR^yZdwI_ZHFVtT\zy}__ar[d}}|oxvkpbak}dM``P]nsqSYb]fgFzp_h\]sfkxgiemdhYjbZbhvd^CcSNaj}}}}xo|}қ}xqGFyiywrt}syhgcYje[CciUVZ\ym[RLpiRsry}rwxqheaYff{z~u{izytf}w{epLQ\d]pn\kRK{{fRQqe`f|gRmqeYobdTsx}|pthLqlPMR~to}ts~rwc{wIKplskktwmjSdkkMcXIVQK|LJdxcSqzt_Tu{qcP^gm`~orpmtq}r}YRP^XRxyv}pzy}fnksoX@\D|~{ZMPEHWtjn~x}g~}soVW]hsqk}}itnG.tkUS{oxrhvdU9E[fazvefkwrr~~mzurNDU7EozfWo}xwv_Jf}vnzryj|kFEi{uWbvoYNowko~cF?ms~catmrѦ²T9Eɟ~e>IOB-+XhXQqu|nwuZ=N}yUcodqejHVkNj|lqhcHO|}cezxuZFo~dʵüvO;YsϗzgULA2\Q8JeUwiccs|rX=:mTTyfk|jrki}rSZrykxfFgo[|rUfk֧[bl[B`pҵpgpG0Yb==mVcd_[dhlZB.V|yXJzt\}{sukPox_Xup–nV[{\zy{]`qʨNKedG\nyÜype;QmH;moTo^`]ZbZK/IpssbHx`qzzytE_wiTtkofVaofZy¯TC`hKUmlǡpqDNqS9duR|x``]YaZN/AiqplHtclxyvyE\wkRpi~rkYcjhY}|YC`iIQhcĢv{LTvZ:avT|{ba]Y_YO/=bmmqIrfiwxt|}GZwkPjewwm^eegXxóZGfjFOb]~{Qb~^gi>0bYy~qusb^qxKQkk]ld~iChs{yV>m}[n_Ww^|y~upt`xɻҺgWkY"UD_ivyXVwkxeefdebBCdqcut`foZ]SSdmwXOzny~in~ewȟ]aiYzǢ~VCWW+6cdLb^V|]}qhd~pr`{l^zi[]jnptaI`yja]SfUA6~zelnqaz}~}wp}g\jjYam{|w|q{tnp}Zcn}narY3]de_\zyax}¤wqg4.RpGbgeXa|}T,4xOfnVWsptnSet`HndjoyolrfoujJ^jezqwU|o~~z}su_WuqlmektŠ̎gSDXelaE4AVXgWksz{wMY_D`tqU{|yn}sfKSX[NjNexaarzRb`fP_y{̬ſo]`;>ZaASI(9TkaLrhyuwRFSplPaxekkpjmU]m{kfmMI3ryxu{|tnXg{n׶ßqzU/(>I`j˷{b|ljAhdFYcqJ7y]_awfT][xd|}oime}ztR9Fbx`mrb{zbuukxvSƹžB?9',W`SWqiapfT_WVThXG0&@Pi]sylornjZSeoSObzxtv_Snyv[fT=4j`gf}Lqz{W[LofTniLT]JCcg`lrg|atskm[e`kVO8az~vqnjvm|{n^X1":\z\~iY<\\aQ\{c[HJ::hXdSxs|TO}o~gY>RZUlykhzzsVw~mczvȸz~F$Gk]`y|rwdZk]PGbfL[@8Dj}wmwqlh`{jxh~~z^kkCEG:Guv~z{ypzxsrgqYAQIID]ȟ~xrmTiibW]mxQ/1fiO\l~{e}x~m}\rRaTLL/AkzomyY]YceQð\yELCNAMouϸvv^ai|xebSS[FU6HlTaFm|ui^{kguldrzqzkP8R{wvxyy}kpfqqVP~R-/6-8xໞ|`tkh|g^VeHWUSBVcei|shnn~tifynk[R[2BhdztmmsupmiYnzsY;1YAEKVudwuwXuvSDFbkJ5677=w}xsy{j_xXqa?ULSYu{qu{xTez|qʧtihuZWX< Cڳ|}nrzgc]jyXQE7cIJOT`rl~hq|i|tm]5WiN/.DOcq^_ojzphWI<=@O;IϨwjfh[RodL]zcY[lT:L~qsor{~yy\[xhPNV<_nh~geqPjb`nyzĶxb|rWA6k?>Zkr|iolfbatuNPU[[\b9xwtsobfm`af`lnqcgrabjkY[yxpynigr|GkjB%PdPNhĢ^soTpxKU5`g=Y_qr{bg}o}zbXynJ;K[cn{yszq|ypz|dy~}pUTHC?>J_PvT~[YTaSC/DXbeznu\u}ubw{xsmPUtc>4LT`lnrt_Vj`HO[^MXsj~azo}jnnZMAGDVLNOm}{mpo_h~~{1Of9;)I]^atwj?`gSJbd_nTa{|soy}vtfLZaH@KeiapĒwuaYk[Uxrwid}UFVm9<:@Lbz~Ɨ~tjqYUA72Zi[aXXgznvMXSCER_RVni\gtcj~}yŢpl|wxzojm[+-N]ZYsڢdY\JTVSZoplj~hrsvqa_ptiE0+)@NZûvVyucbgt~zutqllaKJB;UlaWWR^ibü~ix~pnliabry{|pxopiduw]G6HcfKROS}pkl[Xfipyt}znmljmaI+Q\DD-3BHZy˲qVn}uxilq^}||yyv_fuIYcUSZfb`o~}eUfgvt_pXe}tyfT{mS=@QLG?>IVjwسûYlmd^PQQW_rdyiwxX9Lafddojd{qk{vxmhnzrmjvxy|h_[QWova:5<2Vf^K_{zjjtnQ~[enfKIdP=NXsrpbhwwb[_~n{κĺhid^dOx_disjgun~{_tl}a`\Pn`6QxrQ}~yevwghNCF2PP]DAj{oirkvs|Zbkt`jk{|⮥Ůq\ogtydoUWmS]q\hlX?QhZA[ESeNO`}teyZgag]cW:WlQRmuV}^{`Pkpr|o}Ŷά|opnjj|v[n\eru~ēwd^sVcLe_SgziBloc^o`oxoVVZJDJNR>iZad]q{n^epqzgl֬z_RxcUdu`zuVdwq[h}VGBWcLbdUej|quRo{~d{RJZSc5RY]u\j[onp{deoxs~wwz|ӿmolo_R{p_v^jlzw\x^EThIGYqiIbp~dbmvmhqiw};-?YG7Yeavk~v|{f[d`mţ͸easXYkvkakyZXYpsBbnwhZLNnzKQtu[pr|cHliP@GO/Q`q^|rjtxftLkyfmIJ˺oTysXPs~ZcXTyxRZkpULZn^idHfqlLPlqi?G^RZLQFb~^uXw\bugnh~m{ɲdb`b]Hkzr^UpkaY]vckJZtjktzYkr`x`fqkNNPOQ9H[smxgaRnvpyz~qgkwvҰ̵UjTKiVQmyWgnW^oyreSfeSS\OKog]rrK\ifT@LZQb~Y\vkjvoxd~|gWdvdawײƜ}sleg~[aXQjl\vojre|ǿtjuvYD.6JkY8Ffd[lz`X^gZOJDWMW|\Fut{a^ziW^y{xojljo{~s^TudajW[uj[\e~leĵz\|^XOOLVZXU^eMYkni`geQcYBT_taNq{seewxzx|VcfwfriθâkRmvfM]YIrm[nuqbgAim^V`XcxyS?r~wmy[LMb|jY5caRgut^}wvu{vryq`mVGbz^Evw{X_{nvnoMhitoZN_YO{|uXpvMB,PiaLS}yLcbt}zph}vp}bybeWxfCsqk?Wz`ovf}^bJZ^[]lm}SifWBO?SidLtwVo~wm~v_zj^nuWPQzh[sjrNtzor­ztecaT\`QO_qwAoejtFLKB^aMcmq^Puqej|x~ww~zT^\`tdIhhrrV\{q~sx||~tmINfl_djo~d\Z\=GE]ziSvyt|Miyy}xu}bo|pj|h²ml\XQs}TN~p~eM|rqįznzjiVN^aZcedqnN~][kEOLCdnXk}Zb}\kkr~~l|XNE`xbFjvi?Y}~twthgVdl_\lpjoOvicH@;>iy[P|||fN~}~wvqsp{jvmzbZEPvqWjqppSYr~}sy~hcSfq^OXehzZb|\YQKCducXw|}tV}x}xzygc|li~b|UPGZ|iI_w~{OL{zĦr{xu\aia]dkgpM]r[SJJ@]m\Ns~tyXt}txmdup]zy_QAPpiTalnqMOzp|nq_kyiW[knzTerg[PHIikVR|~kP|uu}ur}jdvq~}sczVRLf|hOclmnP^r{¶t|w\gpbWbkjtLi}jjWH:Enp]Rt{|k_{}w|sujlhatuYKFm|]E\yioeIb{up{xcnrgaltoqLp{urUREMpiRMzz~_U~{{~xb`gukwrvqTXSMMU?Q^\C}s{zy׿Żv{{zlL^y`rKjssywhgR[bc`LppaN_y{wgukpplc}pmvsl|WzYdePa58Cgdq~oahc|spr|[Yj`E^cpzv~nJX}cgbomgqk\mszl|||}foTcyYc}X~udqpqH8qdV[rjc~~{n~MCKf~wkoaUslp|w_c\^wxzm}}ghllL}q^Q|_ǥptSֵ^z{ӪïUEZjp[V6qQɤpivkUVUXyP5oNP,8xxqEAy]>@YYL:Lc_yxPIykfl}wsvza@J_qaYBkYjxtsr|i^qaLadee}~o`rϽxm̗rs}Y5SXI=Daxfc~\Gmsknn~uxwmCFYqd[CZaK~{usw}T~vuDrf]ibqph_{¸kˣwxwo{m=4C\XLFXJC8uz_}OzKZtpwfk}uU@MdkYNDmBvʯ|zv`qn]Lq\i~ccwti^|~~ȿzoŽppz[37I^PI5XSL΢}xzqQnhd0VolaEBgrH?LWGA@kjtQnLcyv{ckxuxJ>KdcTGMl@˦}|yZnUR}~h[qu`atjc]|wus~{|wlnuT/3EXID7_RU΢|pXpli3Sjh]DFjtI?ITDAFnlyRrNc~zzajuqzwI9E]aSJLsF̭~zazp_Lx~k[n|a^oja_~xntrtggoY-,;RID;]dOө}Vfw?Eed`IE`R@AQDBCcU}SZ~ujyqwtmqyW5:L^QNHt_iȻ|sd}|}Ibzyr]cg\cn`bmsizhi{~wd_dc9#-DPFGM{Wؾ~cniwb8XbaTDSygG?KLBFfit_dRm|~aiuiird92>WUOMl{ZĜ_rWRrsr_^xo\Zj_`hxlq|lvlmzur_Z\bA!&9NEIMf|ľĜjhqtn;Ra`WEQspK@IODIbsZmRi}_g|~~ughmf;0:SVQQi]Ơbr^Omoo__xp]Yi`blzjoygrihupl[X[_?!%7KCITfhtoym>U_^TGXykL?JLDMqmx_eUnwz_fzyzmdfm^509RPNPv{c™{fuTSllkZb~iZZg\cuqgu|[_lonfWW[Y0!(@IEIb]ſشfn\D\]]NNf]ICPHJXlatZ`~ucsnnwusdfilJ02BQIN]_̰htsKahi_[qy`Ua_\h}ypjtlap`njjZWY_F$#/E>CM{ds÷ɣqwxFU^^UL_}mQDMMGRzhs_f\tspbzhxvwifioY62:MFHPzciνo{zOZdfaYmeW^`Zeznxj~sq[x^khi[X[`M)$+@:=Fq``ºϪxOT^^XOb}vXHLPHSui{Xo]psxZetsvjeiob<36JFDImjUɡzsy[ScccWfjZXaX`xgiwzy~Vz`fhh`W[^Z5%%7;7?\mKݹwyjO^]^RZreRISJPbh^mahv`qolsrpejlnN63>H@FXvNy~ѵow}Q[`c\\s{dV]\Zhq}kvlnjWu[gdeXWZ_N,%(;69Dk\Wկ_U`_]Td|aPMTLVprtXy|anu{Y{imopkciliF51?D@GbrMϭqutQ]]aY`xuaT]X\oqsopmmbXoZb_`TVZ^I+$(95;JpY`ÿѮcW_^]VhdROUNZwsw[w~cnvzYwjjnniagjhH50=D@IbwQϱrw}S[]`Z^tycU\Z\mq|iqizi|gPsW^[]RSW[M.$$65;Jpf[ֲrW^]_We{kXMVPZroglfi~|sbdtdjhh^cfiS815D@I\~`pϽt}`TZ[[WkjYV]Yhh~enlnvMc[VXWTKRUV:'".::Hd~\§~^[]^Z[pzcRUWWjpbrdrmtU}bece]\bf_?3/?BGWzxaƣ|wttTXV[Vcyp^S\Xc}wtofgyogxTR|dQTQRHORWC*$)::Ibg}ȩh[\\\ZnfUTYXkwe|xdpn{zTtdcab]Y`daC4/=DGXxb¾Ȧut{VXUZVbwr`T\ZdvwleevkduRNxbOQNOFMQWC+%*;;LghĨi^\]\]s~gVWZ\rsererkrRzab^`YY`e^@40@BK_xgŸx|urUWTXUezm[S[Xh|mp|agzahoGXxYONMKFNSU;*%1;?Sraغda\`\g{vcU\Ydtyjik{tq_]s`a]^W^bfR;26CBTobÿɱd\VTU]szdQOOY{jjHa}``tyjKknsuiZ_fofNGHXXe{turx_yno^STX]c|v^lsa]?^pj{}|]q{ujlrxmPEANLVkkio~guedejlzg`[UpxPagar^kbOqkVPSO701BERjle}zh~|tm[[]dij]TKeY`~i_otzSqksy|zdYTadl|Ŀbi~X^iVs_FGFNQf|p]QSMa_\ykXe{nxtGSq^eu~aOGPUXm`~}yiOH=Lvqr\AHYu{[alFDnaW^dmjqruaLDGPPcz[|z}ylxwzne`ejsnlhlr{x|htU4YcUfv]J@FAI]oRLp`vhitg{qt][Yadxt^POJcxso^jv]myv{|lckprqgduµ}hxvRJCIKYoq]LMHSsmrTisX\llivS@jm_jtcWR\Zikq|vrwwpUECA_|wZGPbznUfe=Kp^Y]elltuw_NFLSVk|Xtxtmz}{pgafkvlkhqtwunamN0Wi^lygUIOJSguVNt^ohhqgyn}b]Y`btu_MOMfow`gwud^}tjisrtwtiyyymhRJHNShz~fRIKMjs~]Xs}eVasv\je=LwpqyubX[acydwnmnrx]EADTz|tULVj}|_ThV6Wtefdklpvxu^RKUWbyr]ntw|zxrjcknyhllros~xUY_;5jwvfWQVSdvxQbn`rzkrztfxsvc[Z`dxhSLQ[uplalpzWoriosxgpm~}v|n~_UKPRato[JMOdpqTcoW[hxY`jH?ryla^gg{k~}wkgik{v]GCJ[zxZPYj}x\ThW7Vxkjflnsz{xbWOX[g}n]jnw~zytkdlowimorinyiM[Z6>sy{m^\__rtOvgbvqkq}jpn~mbY]`l~vaNQUvíjpoUZez|aksM=pw||zf[Ybdzf{uxfwz|oly|qgfjrs[PJ]mYZvs[[i}Vk|hmzqhbmovwx{urdvl{ia`iriTJU^ZvhcnwrjEbqf^gk{zwx`WvvhYNrmayg`]fm}eWV]j`w|e]i}|uj@V}rg_hjxtjtvwhq}pzyvfMDGqoXeyx{rgQIUhkeyhCW}x{|vj_fhsudtquk[ewilqhaiorabb~ts|ozl>?mu~ydUSW[p{iKve]o~|~vnZWasydriyrg^dix~hRONervt_equeY}ztsy|qhXTf}wrfe{gXMNU`u|iTOMXzrfb{v^]h{kn{^?^|x~qgno}olvw~lpz|yqwzu[IGJlwr[KS`v|h]rjDJtspqy|mbdipz]uhvwn\\i~tq}zodio}~jhgy{}ru~hpsN7^wx{k`dbqwS\v[_ux{ypcSZcx}neyjoe_glu_RRWxsl`iw~v\c}~m}kt~wwmfXZkw{hmk]PRXdvygSPP`reb{t^^h{~flx[?avmstnmusot||zotuq[IKPrz}wcOU^r|xi[nnKBm~zzzsifnp_t~egyxzvpgao|yurxlgovriltvznug]m_UoQ:]fIrwpUtWf{o`mKDMPMn{rq|zb|_`cyq`rxj{~uuiYia_afalxx}blvsyxvR{{yyhsjg}vģľomwQVf.2DWzƫƯd`xfbdgO_kT`|lv}Xfj\XoJ?DbV72EpW{xxnufgcinoxprvvybMXumYfqo`ũ}v{owoug^njf||xloiN?ED?[wyxf{k_WhsRF\iYcy^QotdfnZm_XVKVmyzwlsqjlFvuT^ygx}y~Yb`O^fDNfj}ƭvpownq\fxmzzts}pktŹxrmUZ?RorpWouaW\E_FMXaZhvw{gn_n~dIatmtvvjy{numN]QUTob}qvz}tu|hz|z}n}}tvqvrmQoL5K1BL=vsfصijzsa_qZpx\_kVeycWu`ZUJaMBQ~Yszj~qw]_prrtqlxlmJgpOMRW@M{}cwjvu}gsxxjrtnhq}q|mr]~y_iAVa]P?HWJp~vġkdZTz{O\twqpM~VsZU_KMGkngjlx~nXl}ibuzu]qiwrjye^ml_ZISw{^szp~ut~x~gyih\bviɡ}zyxxvuuwIE`FT[7MG~xŵ}{ru~cyhoteX[pahUER\AVdubwz~}}zp}sjs{kguz[gysmK[tn\b]H7a[<6Mndi]xqokwxzjw[`wwTOe]qvbcouhba{eyuh~tVajcVubi^GCehpxwxvvcjkecqil^yt|yqktcj~cbmqXWIQa]F7SUvxkȳtsmx~ndovvduas}r}xpumhcd|o^Vga7FVORcjƶ~zk}nqxktwlscwfeskxg|o}p{p{{vlh|pXosko]dVLdTHYWa~umi}yremu\firv{zv}vmulgxg{v]MVSXURMTWIR;Iv}vǟxn|ktrdYH\tlUBZiyohlfhunky`dbHsoaB2SscZbwkoɶ~qzpp\[zhvlpcz}\~{xkk_mknH[|[PYXJKP=:XZNVXaitdѵs{d{pvrpobWvj}}org|vdhsglpffiZVA>_\_EKzzyx~pamx[b}g|gtrukzxoz|{k}`^aAfm`O5Hb`LMUG8MQCJoĩvdm{Tb|kia{u|dm{qvokWV\REl\KJKsjehmzv_dLJRir^dt\UQVXgPgsr`sjbUM]Y]mpe_jjedbaGXYFIyjUdcyy|}|`Td_Uyt}xozmtsvvrnv}s~w^K'uwUZehj~uw[|uwwidgiXpuv~{i4_UZQRabWYrZyuwppug^pabZZMSzyv©uxosxxyfhuk]g~vf@cW8.7SZm|iqs_{h`h^OhmcbKSgqa~kf]dOFP^V^Kluawk_\cM]XJctqzzr}vhdXsiwzmpsaf^nZYc\I@RI3=@[ozw}{qrt|}|[owprxyy}tuqy||tyij\b|}yxy~w}|mtthlr}}xnos[c[ymRJWKe}}ia_ve][JA`?De[hgZIJXrafs|gsk1HHIrwmyj`jpotgmbKPclgWLgWt{{ZdxzxnhS\vcknj^^LV~zzhhW;Qh~jNHV^VYssq|̰t|lmv{kvVB>?KdVjvh]txdpjZjjmdOpyVA=DTknxH\YOhzztv}q{z|vmuvlYOJmrrsONJJ]Z^h\fmznqozh_^V`u|iPFS\bsglVJ_yflkpuzslesqsw^TjZdnqnibOUhuwzgbktm{y~t|pxsytoyfNP?Xzuiptjskb`be~zwojr^pqbcfjt|~eOFDStlzv_|nnelvbqrvvd?@EMc~yiuyxtvbilnfpq|}mzWb\QOTShbfwjIThZjsuaUjſjcffecdqwmbaahyw|npuiko{bo|}uxanrruzzzzulSZQS_a~w^didimu|Zxu|}znhpjc|uqZCHb]ulvfhd[aolqyzxr~{xuuWbt]`VWjxy|ro[HKZ_rwqz~ù{zekqfka\z~i]dJVhuzqx~rss]oybg}rwinr|uZ_\REGKltszrk[cmcqrnbt{|~uskSYY^hrjgl_Zewweee~xjxsxm}u\ejwmodc`]CXl_lwu`g{gUeizo{ryzvnyoquvwqvvbW[TQSqrdynpmjeb_ory|`gq\UcMSfdmptot}e^XY`iqz}le]UWqgoxtxuuX]Vbz|wypcrqjah_e~}pbLJKAET]ltmv|ocgdh~ju{|ve_u_]hledp{n^k`^twssisr{rc}wraniqc~p]ejddV[h[dqxeejo[Yh}~ie}uogjrt^{h[d]NPas~uegacjinidyvmjoTCKdQQ^ardsgUVXg{|w¿t`XZ_Ych\xjgù|lMKjVUW`rxv}ull_gPZ~vvmruxuquwW@t_pvzjk]Wn~fY\ht}|bt|y~r|tm}jKU]Qg|zzvwxyuzw|kvtP-Ucox~{ow{xz~oatixkfy}]<|r[eW\{yjczzm]ypuyujdm]eokyxqvuni`:?xsprq~vqqr_e|sdV@Qzoc]]RFg\KimokkooUcubNRnwwxszvjmedf_W`KBY|r}}kvpwuiTD=$:nm\RXD>IRQ`VQjegkWPjg~}wwji[GO8.Su}w~yx}s}qdLAO5ErlopbYR]KHKGHOZ_GDwwo{fdey}hrmdeodMLk|ow~}eg{vyWNd[@CijTfzWP_\`gih`Na\:;Pbs{zzta{iki`RGSjB>c{{ltysvycfWH=D<+Rsǿi|s^RQLHE[bOYZfhW`xu~y{yys~u|wuqVZeTO:A[p~~rwtu|}{o`YI=6Jp{}h`YHa_MRQJIOHRXknk{iailrv\hsf`aUGQc|{rwdtĿug\acDLR]Wmu_hlp_Vd``fe^VN_PCbrx~~z}mZrrXUPD68M_Troy{vzwynVXC,,7AGfǻu_}ZWXSJFQ_GH]b\kyywwnfbm{vmc^XA5Z\JW}{|tspqrptn{cb^SNKK[UTjgfQQgRFEELMCgqtsp^W[]ZbP?QS]c^q{wyzr|ptlf_RA52DCL\hȷxeozplU[mhbZUSOLb_d|{zx|p^TGFKV\RHp|uz^Rv|e|nidMF]PNgyw|ڷxe\Pfy]X^`bdclX:Ysptvrz{mf{o9Fl]VJ^t_fvp~HrϜqctub]l|sjnqLDaxr\\iYLbEvzl[O\SHKRcd]{q}rb{d)&_nivjhlovuj|`k~w_e|xlȪ{no`^\Y\[[g^Vmɴod=$Dto]B7;ETX\cdgiJI[oneWKffVY[Z`]T_[kǵz||j{Ƚ~mVEXo\JD/5<1?av{osk{{^[^YNE@H72P_wvpeey|[^{||}[VqۼlYUPOU`p\?d|gyjXQYQ17Njqjt|rjstXDOfYEZw̾tz}WFAAEFIQ61Rlrq|q_mbK_ywkz~vrl^M?GR, JȰt^\keUZQ6BR_jmptWEhppx|woirjE=U|twd]\btwk~Ǻsh_eQ7Ecñ{utmae]UZ^luun\DUaZ]QTdq~~rĵ|igccggmscknvtdfbUN/+@\ecmosxz|`flnlfugiiehmk`Rf̲zwxnnpzlSan{~|w\BZiz}w\SXN>G[obShulVq`UYZRLKWJ9SfsǾ{}|l|kVfxЮuZND??BS^72\zwlziWYaF;K^}of`snlrt^FSgTToԴ{f[[]\c_BLg}lX_rUGUl|nywm^_ytpi[K@GM70Ewȯn[LYeZXK5FYgrvwylboot~|vs}w[\iƷ|roo{}|ŸkVH?D6.MxwpYZqsyzmT\l^bgUJUaqfThmeddgjmuddv][dcI7Rsmlvz||~j^u~~oR_lVNNJBBP]C;jĬy|uv|e\wkvfYSW<-\x_Y]cZP`veb}_zygeaXPP[KElºrxtc{vbzzddnlffred̼g\SNLIP_MA]nn^V_`NFO@Ad|y·xpgca]LBTVh˱~wkULJGJG.;]wxy{}}paZ``lu~ywwffyuyb\VH8/7AA`˳vd[gqnZD\y{wnvokz}tjeno`s|t|k_[Y^kzkfľq{pS>7A@7W~ǿzsnligfJ@qxtiS]o]ZggOFVonhʺtooqpsyfj|tdG5BXD=c}o_hu{{ms}`ps^WTLA=McNKzøwhn}zmonZim|vj\TZaMWǼ|hbdnkZdmbzn]v{jZOC95@C7Q}{|jl{mYMNNN[[VxļnaZTRPR]WXl}ypcY^`XZONpzzsasqWMHBADADFdtd]Z^X@Omrgotqog\UTOIj}zwvjs{}zb\TG;7CEFqɲxhZ[koM=YnxwsodZua[lsnimzplävmhfiq^bbZe]C48B4>dà}{y}mJ[{fawl]bleMIcn`r®ugbccel\Pq}s_HFa]I]{pcluwz}db|foq\VTOFBOeWIaijxq}v^jx{ysh\W_\DFb|iaakobc`]w~x{o`TLMWM=Rqxwnrjxup`MKQZeVRoûumhechjZdrs}xm`QQ[]U;12XtȻ½vsbWiu~pidXbhdbjq\[pvojjmtaaj]efSCGH4HYL1Iuνrlp_L]q}fmurog``gW=T}{qu}zmp~tv}iYOD;=H@8W÷zlk|p[ft~tbr{bUY^_dph^tuollmvyhru[KIME:ARR[wķssfb}}vzZV\YPLTaY\xĪumimvtS^x|`akaLCKVKPp³~tVf{eYjfRRWK53Mc_nŪ~rmjhmgUj{tlfWDC^mY\x~mq|tyhsfOGA829SaPZǵopztgfZJ_xpdz{rpmf`cqo^juqu~ymsrqkdtpaP@4.4EGGhƿ~tkpmoq^mvjXKLS`ojivic``aismt{r^NBDNTWLSvmpj^qoZQOMPX\YRiĻqihojXh}ek}f]WNECIHFjmhusl}}`VQIBFUZZ{thhzp^ssfybIKQMKScbcκ{qllpcY{v_PX]OBFQHMkdij`piSNSQ@4F\\nqliiodUl}rlfYJF\kajnit|yopkmUC=7/-9SZUeǻ|{x`^vwxxnlkf^\fo`Zmzpnt~|ukbv{krkc_O=24BG>Puƻwrdc{tagzrlfTGM]pmdzzqmllqwjoyq_Q@7DUXDB_{qsthyt_VSOOZf\EU{y}vkhn`O_tcm|jd_VPRYLAcu~{r}i{aWPHDKVMNn{qm~maq}qjcJHLKLW_RUoķ~vssxe_wl^bibX[XHPiw\c}zegudQNRQFdzszzmzfYNGGRUHPq{qkuyhgqy}wee~}dLACGP^bV`|~}tq|n\UZ_]]UEOh}xafuybdqaMGHIJFFEF`ƿytvxfXj}uxrmd[X[Z]sskswmsndLC=53;LOSk|úò~yq`p{k[`c^[bmf\jzsjglv^Tsu{z]PWXH=AMIF_}ɳhbwgs|lcgdQDPgge|nfefkl[]}{o{kZRG6/@\[Rd}|}{~~hYTNHK]rj\kuks}ytlWXo{bej_XVPJLXbWSmÿwq_hk`G&'+& EiiXd:TsBIL^k{pqpi3@wxwulz`afXQFQ_tn̍``sfhrldtxµpif\_YWVd{e^38mZ[sY~wgprub_hk|beLWil!.ehbe{qmg}cuxXNguodUWNmqhT}ƘvqQ>V{wxvz|`JVnlKI]]`oϫhFF;nhV;,&:Euy{niCfag]^wzljmomiuuudkch}_jo_]ީq~myskdJZKVv͹ʸyK3(5\h̉ttvWgu~qnglg|{TDwu|m@;C1:-@Wfw}[wgl[:iY9CPu^txn~~zmliwHRL?6"mܼ`mj[ER_dgrtRTGK2>dYjyDSqO[]klFSICVc||srii^fqkuzt}ѺfOM7!=IjsgMyYGPPiN@b]_HGj_{ksileZrniazZ[U^Qhz}xjx{cOlfuȲ_PQ"7V6Rn`xbt{zroJRRI:Dgnpt|otcpLH{^TFKcINqo~pķzy~trZdlwr}³mpSO5)S\Ľ~zfZ\`3;C0Sut~oqroc}ybs90:NWxȯrpnwpRrfhYYz~nuz~nbcU`^K4=Y;6Pzŷ»xs}ovw^mqwr|sRXvjD=A7CSWmƭmdYeN_kFYln]~nzxtwk`hghyqSUPgoRc[D$Bcfu|~jvjKD8daN]ir~r`cbZadSKSNTfdpvxvatop}n_jRBDDaJ$&RKW}ʿDzwxvxiCaLWu_k|p`{kPkuStRU=59[|s{jywhnvkV[s{|wNRUjVO9PPLN3DX1H_p̙gizaa]XZYii}{|yzrujmE3Uf]NVi?Xpf˵znispdbwrfutg]AdeY[75EATuyź}uryrHI}aehvqwzuVO]Hjs:=9XmZvsxawttst}uq}tlem]X`I@e]Y:)a_ux~e}pbUhfSpoqz{zpNndks]fbGPN>ljqlwzce[j~y{zzsb\hLK>CV34INS]õy~xvljJ:h}yyz|{i|mgntf^zaV\EPNb}yk~lqqueht}~gkKGaL7:'MY3LaxѪ}hynn_XXhwoz}tuq_qXLZlvZObPTFQ|szxearewww|uivmfL9kmk^32NM^Xp̷rxh\;hiUem||m}iidm`ToODbU:*MVDYyz{lmfxcb~}hynteQVlJ?pwk=&ZZR]\i¼Ů|dxrRR\Qlc]}pifazhKNQO?]fuctphTD`r`o}fj^^@KZ`Q>O4?Dd]eѬlOxyt{}~mudVisZaf[6MXKUef}˿~}zY]gpZvz|x||^T]D=H8D_5#"Ki_zęҷȞdt\hd~nzg~QDFjbWx~jQ6borw{zxsS_oej{ot_`s|uANh^`bHEO0=Jfa̾t`iI@[翩ȵjsSIUtEEYfmRgndsskxhflpz|t{swg{v;a\rh):=4Vss{{vu|rxf_X}aO0U[ZoGsxrywjhx_^il\i}b{ѫnHQQ\Q>K}]i~\uPzxroTWZFSEtjslwkunz]vsXgqaws{xqKEJ{o[JK_o?7Q/;IQxzt_~ch\Tqe`o}zjrfY?6@_xʹpNPGpVDGHW`Zetg=uo]kxqFWV@DRJnscvf\z`o[zdrbya}amqW7Lhȵz^YQq{JN[ojcjtq@R|rb`emkLDWHH^XY}u^wP[VZ~fRdu~qnkwl;@Tdɺoa]}QUattybm}~}{|~wUrN=S[23BJi{Ƿi]d[9F[b^myziD|pigsj_KTQQSlLhs|v}ftydw^p\~}kfcydeyN[wc:LLbsıua`zZYknovnvxxu~uzXt_CZc:0BKivƴtfi}NViogt|yo?i}rk``lbVKQVZTt]mnr]tsWgZiof\i{x`QJjf:EO_nrmxoTcv|}xYu||xty|]Vd19VI)P[zĮxghNSjzx`|ut{|y|w|slc=\8-R^SRCA][}ʼ}t~w|lZjvtZpp_Vdopkxysurcwwmzb{yjyrzaeSXTCUe\MUjcoyuxyk`}rl~yigxzvl}zqiZw}d_gdfNSAN@;Q]RIZioĶ||zb^qz]hppgX]m|iw{}vhlwnvfdiprun^`Q^ILafZRjj~uv~xyq_fv^z}pfr{yeuwgtVeylYg`gRPFFI8H\[OTnhȹ}{eZputjYyspa^o}txv|tnfx{zpq`{mjqnoY^OZLH\h`Vhpxz{{vvt`bsbv}tho}}}zhqzj{wV\riU_[`QIFCI9F[`VXsmȼ~}~i^qyupY}trc^n~uyw}wrg}}qn\uzgfmhiVZOZMK_kdZnr~y~~wvp`eo~\xy}qfn~~{zftzd~zoO[k`Q^X]MIEII=M`cY_uoøe`xowg\wuo`apu{|zmntyc_usckkjdXXUZJQcja[sjyyxwe^mzrvX{zlfs~~yrd||xiyaOdgWX_WXHHFM@@T`\Sii}}pbik}Xzwykahzz|{y}xzg}nw[ltidofg[UU[PJYfeYflq|xso_ej]tz}qdiz~~~|~yzexgxmN[cZR_VUMDFMC=K[]S^ijzgkmcoz|pbctyy||~}k|r}\fpjbogc_TV^SKVdfZ_ic{vvbe~k}gf{|sdbq|y}~~~jrmxvsQS_[R\YQRFFRI>GW]VUf\mj{wwv]|xg`k~v}~vqyh]lldjoae\Sa\MO]f`Xg[~|{tg`l|k{Wz{l`f}u{}}|wfi|wdMZ\VU`RQO@MQA@LYZP][h³|jpmhp~ufdtv}~~q}z_bjgbmh\cTSdULR`e]]f\ջ¹zrnNO^u\agN}vqlTL]vut}`VXVfnmgcwUC=lPOUOnsgky{uslpt}woqhpiwbmMOXqoZ`diykfi}yrtvmq}vtuh]ZY}~l}llmqorphUbvxrgZ_^n}zzvm5(7jpN@'@I=EUgkendqzog}{utmPR~yxy\Z^`w~q|[Yj}|ãy_4?\rgkNBEA\_JGVsq_wXrqn]S^{}r}qXYY_nrdznwnYJ);Wv~ih}ielzzzynqǸˮªuycYLUz~cJFAMp\UULioou^pdaP?pöa\SQg[FIYoZ\aHhf`^UXlx|oujyeVXVlspjd}zvrX`MO=<]vfprzry;ʳdam\]\eŵ]TMOtmZ^Patitbdb[X@Qcq{{khjuqvri~ibVVSLPztxot~lqs~|}yzwkPO%+6Nr{x¯zpUMXGbst{}ej\_x}|}lcnx|[rtw~f^ci~q|yxkhxs`ctZQVOH[U_lMfYAGRamrsjagtktny|}i]fVADEUn~xe^{{]oiVae_lwoäspunx|x{spǵtt\RY\N=FP<n{ˮsY`U>??H[jh\{hQ}o\UWgyuxgmsVT[Xdug~|^UDBcyy{ywywpkt~{m_Wt}uz{fdyVFBSsɧzWVRM^^Vtzzyw~y^]IXpxzuoyw|}vv~qogL@EuktzeehntzsvUE;6[{|wqfe`VNQ`Z_tWabMXH7/Gmky~v~toz^Qe]PVXct~wmgX}gVTa}hhmk{unbZ>2:oǻ_dgOKJLZhj[osKnv^WXh|{sleu^Q[[fyjvrx]SIEfy~x}|wrw}{to_Yw{wywy]VpWIH\}ʫa^\Yle[vzyxwws_^K[ry|so~w|~xx~xigaK@Pk{yhiiovzjgKF6Ae{sqi_W]`UniRhWNUA47^il~z|o{vR]gUTUWftwiz}Snw_VWl}ion{w|u}x\^J74[zбymw`TPLUci_g{Ua|j]W`q|qyftmRXZdxgivseZN@Wm}~zst}tyt}vd]vz~trlsxv]Zr^MGRlʵrlhjyd_vxzzzwpg]IXfmuqyy|uu}tx{ijcNCZuuɴuwkidl}|{~{|laSF0?Ug}tg`bV^w[[lTUVC8JaXivxumSi_SRNSdolkn^}wcWWf{~qtvquxwq_`L9Babwӷh`UR]ggavqXu~l`Zboueyym}iU[]rr\m{}upgaGBQaҾ{wpqxzh^omtzrplkvwt\HI~{orusyukhdM2.4UpojtvPco\ab_Z[^Tj|bor}mO}}}|{}qz|yzlovwk~pE02Vwstyh~pahZEDRKhx|Veh[\XZj{[BM~¾eKZS@LXszgwiVar|zop~mmeH3>D[ŨtvojbgswqwpniWSb}|ldm{~yW( :eùw\ub[bb`_cYapd|sclaNTlmtrphenxwr|bjr[B7DiŮpormuqpnUEUilZQ3"7QiػwYgYOLFJWa_evi`x{hZZl}vdkt{j{{_PM@&+KoͰtok|ehdQRow}x}f\fW@8IpѶdTVbrZUgloqt}d`eXBNf|u|zjmn[jZ?@4$6^qϯwskgnwwumu{kgwywnLDC2-NxüzsrnieaRcw]Zn\NUJB[v}k|wlja_glfcl^HRYJBOrӼst{q~ziomX[u}yehfA74%1_~ήseo]WQKP[_]fn^Znn`\i{wl`gwogvwuqmvhF=E>6Ryřpxyl~t]c]Ukxsx|vnrdJKTKESwؽ]W\pnU^jkmmtiSZ_NMg}j{vj]tsSU[=26-9eѺ~xrjmvyv}smuqv}}~uyjC9D>9XxwsojcS`u^Sg\FNJE_y~kwthf]Z`e`^bVEJVOKZ|һwu~s{frubf}yqyY][8/3,@mб{qsb]UNR[]]ggZZjla`pvwg^f{dgrqpkiq];>K?@_|oqrl^g_dŵsxcXiedeeirxx{xfV]{|{o~kZcwnj{gIlISet~jy]AVjZQGC]kjw~y||}XIgPQY[dt||}lYliSVdshG2dhd\DMXXm|ul^TeysrhbettlpŴ`IJRyqSDHVC9XaRVdp|wzytrn[hkPR\Ym|nPgxb[ZW\cbgoow||]OöeM03M@2EUCHXVergp|vwokc^ckmsytutukjmeTmutsnĻue`UU\kjyskivw}kqc\_MV|«z~jO)7v}YN\ajpywkov`TbRBHYP4RwtifgvsNPfYUi}~uxÆLQlhTfvvw~t`UXfvupg|}ifk`;MkUVdT[hcdgklnzg]upja\acx~]Qmv|ƼsOWrp|eY[`gns~i~fR?6D\tgjR@PUaqgnzlaMHNeɼhSXXTҿWSoeW[cjpqr}{MCcYLXjz{m\fdJQ^dxunoddWVI?=CYuzosm{zyzsythv~v|³ïl[W_rĦgkghiPJQMQe|iWA86G?Zsgyc`epȯkZH?J]{~g`c[_ptl`KEO;)4JE@[owxrlsfCVrjgmprrpsvNZt`JFKXiqt~uas}{ztoL9EWSa}kYSPPPPXhV8UiSDBFMPHTrj[dudP\cnwhn~je]NA5;J^yrkƾƧuQbY5(3QyطfPXXb`PYedeln]HG?722ANYchfhfZegl~|x{{oxlYJSI9Im{}ypilbXLQcvz}osuh`_\KF\\SSGJR:->SMQhruurspVqldehmsyauj[`qw~wvXSD'(I_fbPg]KKRY^]]hhB:]]GCLZeb]w}cXekRSiz~ljc[S[owk}g@O\E7AWp{zu^fjqmX\hggmqePNPI?9BKT]eitxqp_f^GNmyzwvphnz{[E@8+$2Lhy|~smlgX^si\SACI50J_^o{j~{}mWqwa\jw}jpyyu||hYA6?2'=Y^nixj^ZZ\]\fq\Gb|l\]fpqj~puyfvvprhWS_oupqv}}xwz}}qHJ_Q::J_pwjjt}zfl}g]ebQGLU`nzwr_b_ILdfhoo|w{xpv~ypuxZFJF3)3DZv}ovneTZ`MNa_Xk~z{~~c`yuYMPY_^qq{}jYY\bo~|}n`IDG3,?DC`ģxttwwza[v~gXX]a\g}ui{}nSRWD/0=Pk{yibndXhqfs~~`IXfSADR`gt~y`^ohSMPS\jwx}mmyhcWLZ\NZg]dyttxz{{hxwpsvqlz}hV`]C5:DWpuyq_`hXSaYP`r~mbwre`bjt|nh}hUU[^[no}~{our]Y\bm}}r]MSKMb|¬|pnbYGDQJJ[ZVj}|nskikops|pRI\k[KNY`_nvttmfjpzuk^JLQDIXU_~}qlmoqzwad{n_afe\krlu|fYknky}hLP`O;YQBDRezʵ~m\cvzqbct{xwrnnqu{waTSVfnc^bch{bd}|dXYalvs|~u{|p^[np]QLA14N]]TWozxv}olgct{}zs|t|~vfMF_jWIMYj{}taYkzvfZfv|{zgU\^?6HM]Tfrp|pxtt]}h^]lekghdN^qdShgolhz{bhy~zqdvgawyh_G63HOS\W`KK`bLXin}vǨuqhXjagvs{om]FWg]Yux~vyhg}|ywrpļj6>KSGT^h\~pWNvr`iouxwbS8itԳjT`okqsozʸŭzgohN(P[K̴vZZQT^lZNO[VJ;=DTMIVa`lz|bNYeahoqxhW?@xî}ZXrukishwzIJ}qgym\67cOkȖd[ZTZigWSW^RD>COYIW\aYpRKux_`hmrpVH1iٷgUcqgonly̺yygm~s]F.\[Xɪv^aV[fl^YU_[MDGM^OT]_UyzYFbb[cknuZL1M`sW^qdfla~ξx}hfwy^O-MbQùce\\end]W^aRFHJ[UN]]Wf~~bFSiX]hjuaM78˵|\\urc_j[r|öxleq}|x]T3GcMymlc^gnibj|ZD:A<;GSDFvSrs_jy|aE+jghɥydwor}i^_i}_\9Y}zϾǷoaws_]\a^H.2\TgϜ}~x{gaee\uhXFsjqmamwh[:Dq~jSFfmc>>KBhofƭaxjhmqefqqcƮƸg}ts][?VaM{ʲr}sjkn|}UD\H7#?gX:BjG~wy\Fo_gzpN13isoϬhijnbjb|ro˾mu`LlnSDK>(G=YҬ}]sjvjjm_LOVVtfV8Xx{|{vmdn\KiiOewɟ~tgwvvuyvu±ǿrovniouZ>'j\MbU}wWIG2G=R`Qkn8[nvcZeL~iakv|W:K~lMjzڵƾsk}rvyJrnRaIQB.@LweUb|vwx`PS[m`Wal_`;M|{_gxj}xmnvnP:{c^Zd~pd\Tk_^§{nqgYS\cqgD+JlL7[iڼôn`jbdpnn\ibgd-gdlju|sniMaH[KBZdubdxttgmv~v~wxWdֿɚrs}mzmfikmX?-jaYVfaNI8UEo|nIXlxjU_NUOXdssWznohW[BDgRvy{VupiaVYhF@IXgaL9[ufUsxзwtj_xhhiihla{zux[;N)NG8Uk~ϾppWHK\fdZ_kaiRWznrhvmcea]|qdORPN@3B~wmol^Skz}ncXf?56DSO?-Lmk\x°whZhRRMLHOpuzsM~klwbGX5_YB\rnxfY^pyxmt}{os}|vyfe]_xgT;?:6)!?zxumɫagHPuVnvzbzttlW\[@;=P^\J;Zspc~ӳ{~nz`cb_f}crcU[_:V_NMM6P}mɻw{k`ct`\@Ngxxtk}spo}aMiQIGFAYR94e}{xȷsVju|khaxwxvwMwCLV>+8\@&3K`]˛мj|viykhdkX\|pp_iCSM=iU>$LY`Zqikmigctj{xdGCjX>I4)FAf|vrƳӨvrrot[;xqhpuRixSGVeZL.+Gypknvstvyvrc[zpYcd|÷ígeWB2QVN4/.eqdih~¿thQkYMWWLlg_oeonKiY\kUQINE`w~}ȸ{jikUUv^cf}uRjs\=S^<2(VTqnsĹ{ela[\vJikKiy~||udPww`zqbcqG*[e^^yzwu°spkRSqpssi{yZ]_OE51WL+,VRatvUbÿyfzxcfWslsmN\\pqhrORY?+MnUdrǾҾptz|vZhwUll~p{fgS]t{R7AIMPE LT]bué_X~~ig|pr~zyikyaKR?@JZF=auiqkow`\{wjnmn^YczcJNPJ:S&A>sS[lqzmertz{Xt}G42:0>}hxtur_~yllfZq|yd{qmM5A_LxӶeYv`ews|vrnuxoo]`jzk{]gqmJGvŸoYe^[BHgrlfbgTr~VpQfcP__Y@Mrl][QFFEnshXs|\SfuFh]rz}tqtr^YYYacgcMrjTdisj[z||lyqXRfyÎèŸhf`IW=gis}pjICI`[jauaL[W@Jn}_=[Qt|znENYhdNmfq~{m\ex{uYro}`~t{eUhg[wwx~ɽms]_jrp\vi~l}{fpxaispysͥ~~waMYM;L|pblhdpNNNBM?jmt[M][[9It}m___FDWJ]KqyszbUyiqh|~snrjynzzzJN^r}xv|jVe`bPe|{}nmdĨj]IX;RYLLIw۵ol_Pfzb]^fOXCo~Щrkpw{\YIjr[VL#3MH9CVM=JU[XsQ~l}k~pceSIIYF<@PS|{uwwwn]Ogxlk|~tvu{js`h_Xck]6phqzĠ||v}jlaaZNEAVnq`I_cnnfupZc\it]U~sfgq_Z^ni=6ctl¬ͦupv~~[}o^[ftmhwzdjv[dnyaJb{meKpeRIXfJ26r~uuਢzboeb`NLE`sjS_o}}sUxc|_h`acsiLOal`lpwm\qdJCce]}į£uyl}yciRZelpvxVf{|z˚nXoqPNSd`\blun:qrABKaqP9']~̦ۑ̐yxWsm{|sTJD^sytldmupv~wW]s~vNFRqhnwVCTD37nskƢy^e|noavYdilo}zUiyv~Z[fTSY\^kihQ4{aPaftv_PJv}sݸ័okvokr|wxrrgS<>EX[[kejvqcz~|ouypvyzfIay_hOglUT\F;Ct]uțwsj}uXWx{zRui{ovhlë{_qkGKLNFKgu[{G[g;KZbk_L@8(/_un\p}o`hx[iimvrNd~jzjQm]TSTL[z[f>ByW\dkfdWRVpp}y}ձronjlqp}ukQIRbd]]j[tty`xwryzzjrwzjYHkacKkk`SREE[]WͲü{ilZg|mUu_vdm_tpd\QU\NNZw\_vBhM2/%5csn~`t}iSp`calx}eE^ygeOnbQPSE]|[bA8x^VVgWXSQVfkwxȔywjnlptxubV^ordhg`\}aprfkrhlsn[Ka_bRN~kYLLI\zeVj˾Ť{~mogcw]lXwbhcb{ipr]Y`bP_jg@r^I`;=OoceYK?CQ{ҰӨ~vqavZR]`Zrk^~~xu|so_IozWr]G=,0';c}ufvcJmeZZiuv_DTymxcMgeMGN>WxZ\F+rdRI]OMPPYep}ƬС~lnom}p|lbeq~jsneSlnw\\}sehl{y\QIzhZ[AmofHNO^xxbeϯ~|~tq{gfkxv`sY}{_k]f{yesi`Zh_WjhGezX|[\u^Up˪{}znkyt{bjimf;6QUZU?PsVOulv^hvdnrN=e}h``uxza^aglyzde{mjutXT=1xpxb}faKy¼R6Dzrj`sxuerrm[dSDG`rueN@F(c~rzmfjvtqyy|Zw{~TQc^QF;^³~rhw|fyqzͭʟxdaqrgO8=;=|}{yyvxlnZ2uqd[4HTVNH;nkQTVVIJry^lTSwgaxǧulyrwfa]a`9(DSWULXva^wxkgppzpO;S|qok|wqTucry|nbukbcx~lXNM3r}eglp\s{~W7+V{z}ͩ{xvwujcfMCJdnhXDEB?}qiroz{up}uNok>IY\RSVyzupexwwdgT^wob~uh\o~jQc|Ig^kr}}\_mob[^kwPmq}kuid[[cyQc_gusWTdu]H]dkbͧ~Njssnt{lauztjbhk~rkwwmenm_c1A}pR2jglznsmXtnTm|rÆ[PVL\M7+-Jjb;IovWTau]vPysYexdV{e{xkx~XKEb|u~{yn~qp|}xY|vrdzsd@8Yl^a_NSjnd?NJY|`wX]goyVT}veLb[_^gZrR6ohuX^ybTqruzt|dNSQoe{ޮe2dd[@dsJHPg]SjSERpmunrrruqgmikyh{ielp\TRdVP}tsvyMO~wxrnǤmmP7Hq{P>L_mT:IQLW\jNveKI__gSgdUjzh\nQmufqN?aɤ{l~|u~j}ptfexxlrsoYG{e753S{lYptgcTZP\Zyw|o~nm{m|quyu\bzp̬tqiLB\Uhlft_NOhRN~zS\SMg\ETwtznVzvilwVkilzvzs`vdbRMeq~o~jYomx}azívh]bK2AXoʯ|VsbGCAlmgvuRMrpc~xol~r|r[_hg{nubVYO^NpxldNlymڧk\{|p{{z|pudbC8UNIUzsJBW7W}osxiZhiztvzg]qjjcS`Kirlwl_mmmgMieUH`\\²|[y4I~srXZZCdwphʮlKftcskcWwwivlvs^crenUXa`z}bWfbp`kzwswhHgܛVXn\bh_Wlzqqyur]IMR8AmYzŞWqSNfp[Z{W2;BJtz[kIdtt`}hn\sM2b[hwuÛv}}nj[yzoPXOy˩~anhB -8>`wwֲt}s~TDqqZs]1L4>{iWi~`r}nr]~[vr{sN)Tnzp~ikwokVl}xl[S`K`ity`|xgdgQr®{jlvhF_A5K6pkfĨɜ{~cys]]hg;J|f46?[pbrc]stgtdpdb9E]^jcƞwstw}~t`{tcveyžxY|ik]tG62RaGnªv_rpRcbji__@K3r^fxqqv]~ipytdILQIE`ȏwrwlqg|f\kw±Uqdo\?]i;=M]tn̷sv}]_X^bL~hECU\_urtumW`zibo{\8aXbgzwx~ipiuaXtcXUbRPH?J8^yгcz[OYeNDmYQOllzmvi|lpwyfYe]narI>Sg|u~ngqlx]|kn\vdj[]jdG$BWP`vǩtkQUHjag\VJAywz`|uuv|]kZ^cfXOagbxz{{~zv}iv~gVT[]5\\`^Ypzqnwp[}wg[zbHPDXKJXFKAB\kgw~`vhhkVW:[rinnv_Xmojkn[sVhjdnbvxƯyl[X]d~|pzyw}wLb}pmaWLckM-(@bH1+x~׵ʠƪy{ghS\mt{}}~oTffgL*DP[gCB\e_s~~eb]xe^~tz{N^mPZNfsJP0SNIgcp˙oqRLPZwfeniltpi7W~hIIS_L(D}qj~x{xyped]dtyu{~r|OZ`mV;$!6_gUOwtpŸշo`tapvbJZzxhj]w|ZMZu_YAChLe]hmzϽxkZcj{zakowiv`sE2_wb=1.OG,*SbjirǷҸkSqwwz}iNqcdT9AQWh`H^t{||jLswZ_ibIQygttkzUVOkdOG5lKkzx}rż~ɩpxy|me{bfiw~|vDtgNQADC=DJK2Dgfo~̷̱wjhurZHplhd~gxnj`|r^b=ubCXRbYcoz}tmkwxtblZn}\4AwrM139N3$@c]mlӴͯ|}{oY^_m{wv~ovwbWDLY]fWH\doo|Ơupa_lrdEWsuZ{h[oUVZeSb?Ju7);S]jvĻÕymw}}bqy}ds~bx}ZXmݪet{Q6ZnO7Cv[=Ua{|w^e2&hWkQGV?emwvѼ·ya[h}\dqzoOLe?mj_zlqa=b^_Qaxpogz{xjpUIbrfPZq̤`CIa6:W?]>EJ^nit^dlnhMf]TZ3Q^hVX}}{akwedrUE]WB99ebqxlgoyUqr\c\oo{Ĭӡz~}]Qeecimko|ud[bYG=gZfo|i]|vXgsx{n`]gN-MiaT=;omi{\Pz{pujf[s\hnvgnƩ~cextxvhmq{i^pO`P^_O[WZKS{ccwuYUzadnxwV?K@4>Hu_rr~u}s~fmas׻fa}ofpi_Vu{`a_}usrpJJ9\L]ree{j|m{ubow{Z)FtiKHK{}ht~petur\HeUc{hs~zXKhlnr~}xgr]g\kiBSafTW{wXbqpbh|hXSbfNEU\RNSvtvs}qpu~brSw}Ǥ˚ob|r\`jkb{u\dqvaNJLzikmvnlvfWuqgosv|yp@'KfZGPc{fjuyw^\xnpvkbsOzrtʭ®}wv^n~vvk_|rqvvsn{hUm^eEEfveFNybgkiTsyw]aelZKTWVWdv{pyyoctvtous[enORgwgb}hZUYuZ[KtrgrvupzjSrzjotttwU,LyrD>Moizjnvse]nyjsz^sTg}zwwǩ{`czvumzbt}rwƘsjsgUxu|Z?ZifTJjn[dhiUkylb^ZeZNLHXapz|zxzpy|kx}_js^_`NSef_~_|bOQimiK]ziupe[lapriYmun;=iyTCSloize~mfvqv}cml[~hmyy~aSryoiWaywxIJ}XnyqGXrwiWS|aXftsedfWPXaV]WU^_mxm~tn}rsnqmzyZ`Sksfrv{y\W_[nz`[qxsW^Z^`N}emyqsu~vIKYbM=ZW]{|`xv~zo}}ytd~eesdpv»vX_kixlbnzmz{vjwzwgQPilS^suno[Kwzhr~vVziUekfIA\_|ymszyux}xxxpu~r~}nqmd\Yzzfupog\[gxf`tskkr\[\Rydk}sq{dwvtQESjXPkedeqqzq~wwvc~kt|bo{zɥvVUzpoo{}ksvl{|znwzptTRknO^{mfmZEn~nxtW~nQ`jcSF\_xrr|z|}wsmyuqtŷìytwochigSkzjsrfwufcms_wpkm|gO~kI^_gtyYn|kzcGGiqWjqhnnozpzequun\xxkÿz~aLivm}ysqqvhz{ywgeRctUM|tYdaDb}zu~Vu|VXja\P`_o{p|~tkpsf{vĸ{grxs]]jtVctlqqbm~tntz`|qhmpMqqJSRfy~PbfuiNDhzansp~suoyq|dny{pYvs`suybMknl{vuzqxvj~|alYmtQQqP`[Hj}w~rY~zVZh`Z\lYqwtsjsk~`ws|nphti[VvrReiltj`uyokqoiyeS]KNJsoIuqhtaNI{mfqoxywzot[x_kpudd˴xutz}oV\q\srs}{px~kxwlqfey_IrUO`K\yvt[tfVea_Ww][wz}v{ksjnv_floijmn`QgR^agrl_n}u~xnuksnU|eNLAe|NjueqeYEum_njyw{}jv[zaihqd^ȸxstxwpZ_pOiip|vnzkzqoupo`OyRMXMavos`}i\h`^W}XUlryy}zkvlg~]b_o}uirj`LmuM\Xgqg_r~xorvl}g^[SIClw}zV{omqeVMy[chk}{q}zn{yc~x{^{yfl\gõs{vtmUigJdcqyok{{m{hmtv}ZW~PPQOluipeofmb\YWVdnuyzyi|o}jypszjg|v>j|svfSgnVikznytlvepqb`fYc}jrn{_idhYTgjhhwqjkoxisb}kmwsu~waxvalbkH_nVitTxWbX{}~lyuejqi[c~mtokxRMQLQMtWomzxq||ku`|zaryiLhapaXkYbgjna~~x{`~gqbrb}tV~|eoeo[bkbUcvmglwn~|}|mxztwuvs|uz}~ylwhmksH\_KdkK|XeWtswygqtf]iivz{vsr]\SIHQvZj}f|u~x|g~evkQkxsuQtilWQo`^bcl]rttlj}kieuk}Npy}iq``ngYXmfjjwxnuu{{w{c|quwyx}lw~jrkuRXmLL_Ed]^Znlǯ~rnpg`ykoxjmxlWtMKIkd\o]zt}{jtmitSmglmbrpsdK\hYj`l\appgjoifi}pjW~ypYkfdUmkeaxq~~l~x|ozbrt{n}iv{omnu^Qo\JWDIdVTestüzs{tjyp`oxiruuY\UQmjVswVs|srqcoWhe[Z}os|mPZhUaYk][hhfdyuumr~qoXvy~enehWnlifrvfyktr~lgoy{py_mr{sxtrs]\q[HRASyWOLllqy|tqdlqofpvqgbWa}kYv{jVys{rnbhS{`XX}vmoVfeVZWcM^`i_kzry~yp{zej}iwyuurjbvhlh{gbnxspinjrztxs|~x~n_lisj|~s^rnSJJ@piMDRwoaygjppp^rqirfvgb}ej{qPh|k~ztx~}ghZnk\St}ijx{jjv^_WaKLU]b`vmtsuvy~uhljv}y}~nrrkzl]hmhdkefhzszt{zxcleocyy}~yn~x_MMEnkOCOoeWjv\wzzubtyhZba|pqoquRfufwu}|nvx{kiawp`Xx|e`muvtmjafOJNTXXqiqomjuzìsnmt}zFRzhshRUv_^yeE/JTgpt>XH>Zf]hrijKXzŨɭtwU#aixq[{cPljUqgN8ScczǸJ3xaE?D=P5Ellm{j[vtiopuhpcYXj{$V_xy{bpmQRsvp~3tVShJQTQqb]vr}}kSyoGy}qh}qlunqŸsWaqԱv|JPEMB//faQL]Vv}sZ{dmnvPOaeR82a6bznvo|y|rZ`om\tYzozhIKjDv^`v`>LJNK0Q}ayhĬкvcnhªjw~}rVH`fjlV]OV?WLGT>~OlczR}b]S]\;LNTB2.H;S}mvq^uvpjy|k]Xvbtv|Y]^\nEE}^zkzsslddfgpojowb`hyƻaj_cg2KiGhEqvZlmnsggdrSN][Z@>I_Kxwp|j{sKp}avPxmyvpjrrgNJ`sflaj}eIZShc:owkgÞƠ}njox]hgoVQRx}b[]WjA5hGXGP}IrjoRoRYS_P2EFP559dMz{s{fqncp|eswu[[fwm}YfcpsEj}d~_pivweby|bwz`wv~_cjwc^bͮ̿vhmfyVDwYcSZUu~^~^genaJJ14FmQywzey|c~|h`jvcVV~~qglhv`Vrvfvqcmwc`dwlx~_k|ww~zgUbngTXxŭƥy|rxjNzqe_VbstazkiihkFHS_F==i]lqo|vuxvbdmrWv]lv{yoO[ecHEUdpy`gcifMvqtg}uxjhsrsx{wznKT_`EDVivxnniKkt^[GeXlqYb~e\^ZaC9ER@0/VVUizvrjku^dprUOZiuxrrnVvrq`tvgtq\Wx~q}rltiixstuvTWclSKRpå~dstoU[zoe~mokpaGQ\W<7NfJn|yw|wzs`tg_nm}hy~twu{\Q]fQ??i`i{urolm]bzwcpw|neps²srwvuupuaJU`U?=^oa{vi[zkZ[]dmoVj~k`a^cF?KU@01ZLV}e|tylkr^alpUKVbzwrby|sbj|enyrYToetqltl~ycpymolqZLXcTDIuryβvu|dyd}{xcxopmpQOY^F:AiMjm{z~{yuhuu^\xqcvprqmNQ\\D;NrTzzurk`{vjqs{ha}uyr~ir~mlilXEOWL;@kmkèzokv^j_gpiTizmab_cJ?IQ?18bO_kwnl|ky}y{]XchSIYh|tjz{ij}sfgps\Tfh~txf\ob[yyjdfecGLX[IHhrտx{ofxjirmmmeKQZVA=]nVy}||wojmht_{o]d~yiihi^DLUP?Cluh~zztmnt|zzlu}scgǿtmrwkXlzo`c^bK@KUIBSr˾xp{xc[rlaSmvj^a]`EBKP?8MrU{}xri{nixqspoSU`bRQst}tszwnqv~}~~v^eniXXu~vxiqg^p`N[oj[^\aSBNYTM]϶tm{{n_vxjoimTLUZJBW{]}{~{{qotfZ{j\Wqug`c``EGQSEFki~zruzuvjqysdiżrhjo`PbogW\W\I>JSKF[s̼}x|l^vk^Vovi_d_bHFPRC>\uY|{|jrbh~~nnnngOV_[PZƽ~yusyth|v~x~i]fj]TilvurhxTov^NLchZU[Y[CFRULQ{|ԾssdomqnpcOV\SFPxcsz~|tr{j^mj[Rgqg[c]aJDNRFB`}bw{~rryiounagºrdijWK]i`S\U\F=GMCA_eɹ}|dk[^svfghfcILSN@Dkb`w~xpszh]n|ugpjo[OX\RLdgômxjlxy}yy_`gcTUztj~vjyaZvfSFTc`P[V\N?HPICWhǹȵv~ni{xqyqv\U[[LHfpXw~qzr^|xaQWkm\a`a[CGMH>Hp`k|w{ul~|viorf^sl|y|^ry`OM`fVU[UY@?HH=Ahkb|mk\ewwenkleNRWOCLpYhs{orwe[kxqdqho\OVZPJbaoxhfyvu~v|c]ccVTsv`wlvhTmkRBGY]LUVVU>BKIBNwjtȻȻ~thtp}tykX]aWM]zZ{x{}|tbj}hUN^j`XdZbLBJMDA]qVs|mm|}mhonbanu~pZqoWGJ[^MUVSU=@HHAJril}pj]fvvfslohQTYSJXw\pv|omv`Vcqk`odm]MTYSPgeryzgar~to}q|g[acZWp_uymm~mR]kTA=NXLLWNZE@JOKPsk|~lk{sw|s{a\baWZyvdzs}r\qt\KM]bR[]X^EFNOJTxokrtfm}s~}ghmjdny}}n~bVndK=FUSFWOUQ>ENMNdkþxv|e\hunfuiscTZ]WVn_~hpkWRak__k`lWPY]Y_pnp`aqxjsvox_\ba[bvkzu{q|xdru]Ka`F7=LPCSPSXCISUWjzɽò~rfp~yps|q^cfa`uf{uvx]bv`JDS]RT_TaNFOSQYy}hqtcfv|o||xgfljgqzz}|{k|y`QhaG:AONDWMVTAIQRUmmyy|e]juljxjwfY_a\_zcz|dr~eQP_fYegalUT[^^k|||oh[drpgznuq[_b__saxz|tsvhiwhNQeQ:5CNDJWL]LEOTVbs{jm{~q{z~eeifdrm{||t}d\tgNCNZTPbTaVGNRRWsatb^hsivyr{bYWW^uyfeh}~uqxmkzobDM[nl]XPOhaqpajopuoyilw|kvzjl~z]j]iR\}|x}ixxvy{yrzimnkmgzb[aoynw~mn}|pl`Ykoriyu{qk|pUK@@d_@KAKSDMVY^tdvqt|{zsqxm\Q_n~|uzwk~u}z_hxlkyŢ|WDR\l[h`NFabNGSefg}p{v_]XT[xijzuvudsomxtwzaARYrŬu\\n[HFT_YipdtaTRNO^~td|gzxqskbufq|uzenhQ8CVPUk~rmpoqtu~|ɱ_SMM\̞zt_bfWkghx~fdsfQD]_SWiyvuumpqqwbly|mf^J\frtp}ieq~{utqsdc_H/1QV[ptc`][bvdJ~oXmwrjh`Umj{u}mmz{yl\[[f¢}tv{hu}~p{vfWRFJkpùoZfnXHLY]ZqgdoWPPR]uiqmgwztpqdgsbtvth\fXF8Tifk{vtuv|l|xquiQOTb~{sane^qjp~wagm]KKih_boxq|t}pssu}|`cqum`]VRswqwxght|x|rsuzfRXM=1Kjmtrjgdfs}T``^nqjdcWdxrrujozxytxv^]amtxomlaij`ROJLqyzeguaOMX^Znj_nZQRUaxmkrcsyuopcfs`pvr{~dYbWH=Xomp}|zzzkzwȽx|y|hpeQSZkžwgvhevouuakk\KQmh`eqxrw|tuuymer`lne[ZPZwup~rfkwy|wstyxr}{pUTUF78\jkxxuoqɻrbSMc\jr~~qbpxnlmy~l[fu}zz{maz{{xsh[kVy[domc^XNgipti]piEB_jbyndeht~mcmmrirgWFXi``m~~iVb]aovqokbz~xixwywztst~˶sTSRmSM[VL@Sf^^l~~umfoumktwoidWimldOZ\e}|hxoaa`iz|rz}ve]k`zyscpxwmWGNqʼnqmfZPK>NVQq}}jZkmdl|{sqnsus`O_[q~~o^_tmdl~zv}|ĺwZ=ERSd{bVNMUfcDn\]gjbZPAOMLoz|hnpcTMbaUYixzyyd[SXk}wki|n}z|}ʢo^FJTQ~Ƿt_JUYIEQafqow{g_YXcwx^nluvojcXkgdmWIZZXhsnjn{viyyleuhusu~tzq[OIRjy̭uiWYbPeuy}zvhT^g\]l~ztrs~j~{naO[]]obtuggt|~|ybH=PRUklaZ[foTLsV_fe\UHDTFVszvjtmbRVg_V\kuywrbZV`vy¡xkq~nw~udUBMXXŶzgT`cSNWcgsmv{h`[\i{w^ojqtnibZmjd|{hTFZa`mztqu{gx{~vkcvnuxsvvt|nXOKWqǻ~rd^n]by{u~wiXUhgckyzxvv~wttx|vi_QSid~{il~vmr~~~|rr_N;Fahs}ogdkvsOaeS[`\SL@LYPk}nmujaS`nd^eorztqyf\Zaw{ul}us|{ook]QHDakxxgZjhZW_ghy}gvrc^]fzufggoqkg``uin~puj[LMiru{wwrsrx}undlutz|rrxxxqcm[PPZtͦyoblr`r~tuzlaR`ronu~~}{zivjnne[TOjtxuk}us{{z~~vfi\NAFfszxqms|{WZmRW\[RKBM_Tj~pnwmeXapg`clnupkvf^]g~}wpvtrndebWMFIhn~mdq|vzoeehtb_{\_ghc]LM^Ztsszyjjsh_S^vy{u|rhs}{vrmyceltrgb_ns[fgYUWe|z}pTmX]fb`mh`SSknmtxouuux_dki`ZQ_mc~nem}y{sepkqtgnj_UPhtv˺Ŭq_nk:5=A?=8DXM`{|yuiTTbcirvrvsqvolqqq^ffn~zpfx}okopje^g}v»`NTYkfV`RHEGTb^CfgW]b`XODSSMn~qwwlbVfojn{xmpĹyrim~pzws{yԵ{fPTTNwzp\K8@G>>IV]oyclsf^XZepbVg^dhd_XXkabwcWehl}yuzo{lryickyzpÜyk[MBNF9R`hswoflj^QBMQKQ`nsn{uqovni~{uk][gYgso}ztyw~wqkyqoUSZW`xzk`]cgUH`Zd`edbyurpqsszo~|{teizghagglqkw{zy~d}{zmXQ\JSzo\eboroaVVY[pwbjn_pd~}ounqchz}gy}b`wvsgmqvyyzlu{oh}lk~tu|YOfgPVjvpqVnqlrpget_[]hng~}tu`vn}vbn|sdtwo~owumh~{ppvg{xuj~~dwy}{poz~}up}bK[s{c`hjw{kcuqqc]Zj|c^goy_i{ssbdv}erps{r|rxkppmkunf~}yg|ov|yezvy{UR`zskb~qwzgls{s_UXgpZ[mrfZv~{m`e}o_y{wzsvrn|r{nkuk[k~{lh{rsx~|}~{uqUXvwjtk||xsdfvzfYJ]ndUxooX`vl|fditwv~xqu|ttilmn]ax~iuxwp~y}tpdYepimlw~yylge}kTUdnQ]jmalnvwhlxfr~zi{l~wxqpsrkY`s{lxuq{vtou~tj|`^nlerc}|pbgykMhniPsjq_jewtgt~jvqy{{~n}v~urjqs|m]i~tz|{z|gryo|~lkl_`jefie~}`i}lYpmjMr}eqbjhw~t\u{mtum}~pu|x{~zxds~jdfxq}xy{gsvvxifvj`blhmkl~_kzk[ploVo^gdadzzn`rytql}{wo|}~}sZkommwz{vyyitx{{oeoha]hglsw|hk~{s[knl^j}[dk\g||rdmtsqs{j|z}y||Zd|{ppouwxwwwl{{w~xscljdadet|zvgz{w]kkilnykYm^Zy{xpl}vk|r|usv}nu~eXl|utzwz}zxm}lyvxn~vjjcfha`m{~gxygklfhwssddmUn~upy}zjuxo|ywuxnovu\dwyszw|{{}omvw}rxf{usji^dne_lyjwu~otpffz{qk_pXe}|wr}|}cm{muzynkqyaaw|xx~{wm{{nuuuw|xeupplgX`qlaf|zoxqswsfbzjpap`c|ysty|cm~quv|x|rkoxhgt{}uytro{pzrtxxvepmlifT_rpam|{uwm~t}tidblbmeitvrwz{`o{swrrz~olq|qkhr{y}|qx|nyurywwr|fmklkaRatqat{~sszusgku`ndmlpsuq~}{vbxx|}oxgxpnxwqlep|y{iutxz|qq|wofhjko]Rftliztntu~pjzhbnantouuuy~ki~{y|~iyh|qqszrohgozwxo|zuu{n}{}ujbfkpgT\lqftr~}puyvmr_licwvqur{vyhzz|rvuatwqszwrodfxypwuzs~o~s}{{vqe^gnm[Wbokmnnrvw}qnl`q_ipsqzwmry{wxlzcxuswzpsneh~tzsywtv|q~u}}umsaainfXZgoirhywtyxlufes\wkqqw|nz{p~qlixutyusulcoyqwxts~|xr~}tm}ju_`hn`X]jooqdzq}xp~ehs^~mos{wr}{|p~{woivwvxqsuncs{~vyvssx}|q~qgxgv``hl]X]inwrfzmxr~hgubolt|vw}}o{yz}qhtyxwqrtoev{~{|{}vpsuxn~~m}dz`td]gj]X[hp|sh}~m{{vmcsi{ujqw{}z~qwxxuhm{{ynpushs~}||yworvtpunwhz~]mk^di^XZdozk~mu|wtclrx}lm~{v}|}~rvrvqpew}|potwmq}y~{w{nn{oz|l|soqkg_ne`ga[Z`k{pwmx{zzlcqz|wh~yt{{ysun~hvhj{~smtytp{vu|~slyrpq~||n~~yjxq^em_cb]]_fvxmswz}tfj{~i{ypw~y~ttmthqocvwnryxs{s}t||vmwrn}yz}~pz}xkspd]leca]_aft|qruz~xlfwnyynsz~sslpmkteo~xory{w|q|t||{|ynwsmx||z|~ryz~vpqkh[khc_]`bev}srt{~yogvp|wjt{|pthrmiugnworz|}{owyy}x~yq{~qmwxyys{x~qsngjYjmd]\`dgyuqs}}yoj~wtsix}xpsezjjvip|tqt{|usry|twtyomwpvx|x{oyehh[mlaZ]aei}upu{ymww|{z{lj|qtng}hlvitzsrv{l|t}|xv}w{slo|m{w|}y}rtu^kb^pl]Z^ccq~{sp{~{vnv{|~shuvptewtfsskwvssx{uqr|}qz{yxnmrzqzw|}}}{xo~ebm\gsdZ[_bhzx~ypv}|t}~x{xjmznuim{mhxnpvtrux~k{{|ut}~||qmn|{myz}}y}ozw]hh]nq^Y\abqw|vq|~{xt}rhttosew|xjkynptssvzuqw~~ov}~womouzs}w~|}z{wom\jf_rl[Y]aftpts}~qyliznslh|xximzpnrsuwpz||zov|tmlqtwwyxz|v}rrh\ih_ql[Y^aisotp|tjjinitn`}|ujl||krgm~y~kcmt{voqvxy|yqu{}tquyextlgp}~xz{t|mr|fZfldutechjtvsxw}{|ujzqt|znVdrufaknbsos{{ypsy~rmlq~jisxyzwwr|osk^bpgoylfkp|~{~qlb_n~~vqrvovd}{sijxosehrehdXnv|z~~}vr|uf^ixnrqg_]Ye]]n`SM^`ZgcYZ_ipg|~~uisbZ^X^~rvrds}}wqv{m{vuviikuqfcbovrqg~{vnyzq~qhl~xx{uyyr||qox{vpnp|zdsrgzrhcmywpj\ld\eidxyz|nd_eifpaz}{maV_bXjh\ROaf[ef_`hsiw|x|}r^i_SYccpmq{~zxrypktwjggn~whbakpl{gr~visyqwpiwxz}zunt{x{yuqqs~imoqsugcmw~xuj\ld[allpw}|~kb_gbbsaqueUa`\oh_XQ^m_^jfckrg{xu}~|l`j[SXeinsw||{ztunp}zrgfgptgcfqgnxbuqhwqy}xqlzww}~|pnu~xttv~upimztochsz}|xwahl^\conqx|z|vichgYjh]zt^^d[nnd_XVgm[`liiqfr}ytxz|zveobWU^hfo~~}}|}yqxuptgefm~ylfireiudgtjunz~zuot}p}{}rpt}ut}wx{vvgiuyrdisy{|x|zdnna^bnpht|t~{y}{ojpf[iaYj|fiebvphc]Yfo][klmmbu|xxuypw|wnuf[X^he`rxx~|rquyz{ugefn}|pjntdipees~u{xnukz~{wsrpt{ztrty~uh||z|lc}}szwiirwxxt|~iqqe`aktkeuutzxzv{sq}xlid\qumigcbpo\cpolW^ifrknt{sl{xuz]ig`_blukev{zvjeuzi{ogb_dypltleqjlkrujtx|vw{fpYSV[bh__~iitwyqppmilz}ujgjuujx~x}lbhkcNENFMQVljamvxkh~}vtrnkouhcszoZegd|{ssuy}wuwpmrv`SOT^[MXkju}{ywwz|wk`tgo{hYSXfyriqhpvrtw~|`hlitjdaa^]ip||yuv|pfrzhjlihjlnrxqotvp{zfZ[i}t^`TS`Z]lg_ovvn_rzutstqklsfarv_`mfs}yyy{|tutonptx{ka_dkeX`uvyv{vstx||vha}}foqeZXctkqlgz~v~w{|quiapjvunidchtku{w|ux}}lmuwbdnnmmnowrszxu|{vul_[dvfe\Rai`amhfvzzxclxuuuwwqhlrffvjcpio~|{zzpfqsonprujfhmne]o{o{~vpqw|}xldv{pkii`\ds}oumgy|u{}~wowjgphr}voienmosyxz}}qrs|{d_otqmlm{wx|~u}~tkjb^fumn]Xgof]hmjtzvftwtvx{{tijtnhphoqfq}zxkdrvpkip{ropqqhaqvj}tnry}|tiovsvidhcbkuz~|wwhpyq|~y{vomirgcs|skk~hzyq{~{|uvut{u`dvxpjfr~}{xifgbcksy||m`jsqa]koox{|kuxtuy|~ymgqxnjhttdiv|xveoztiaey|}{xwrgkxhvoqx}|vmutq~obijgkprt}|ls|lszyqgowd^iv}svmwzov{w{ytxwgfw|shcpvv~x|{kfkhfijltumtzwf[hspszz{zo{ytuz~{pho|vgf{vdgoyz|kmzxk^`om|}{rl|zl{}|xppw||vqzulycenmt}liquo]Wksnryzz}}xfkyik|~}xnn|limtliy|~}{\^yUg}}|tp|xu}~}}{zrpqmt{y}nsy}vd`t~z|xzvY`}ojlqsqkdj}wommuply}~~y}|onuqjmu|yy{vr|zocbdoynrd[cjpl\Wlxrpsyy~|v}y[jxkmzvnv|{v~~l_cfemwqnjghljdfhqsjr~wqsx}}yupzc[hu}~rx~uk{|uQXmgm|wj`ftlkk_gnhlzxs}xynjplbisqp~z|}{~qyvaOYm|yggkmmeX\qwmim}u}xz{spx|a\ssrz}tv}zvhfh]Xdos}vokmrqg_p~lgt~zsprvxvy|kqwq_[owv{wr|qnscQamrykfsrkuo`gsrs{qx}tx~}sfbkmcgtw~|}vpmnj]Qa|qjlmmlf^cvzmgsvzyvz}vonsm`hot~yv~{}xf[`f][jw~uonsys^dxfmx|uqpqrrulmopj]d|}y}z{|rkjc[aeqrmxulyxgbqzxx{}pvyou{{re]epjblw|u~pmhgcX^ywrrqomkfdr|qgs{r}zvx}~zupnmhikgr{}{tdY_hbZdvysrw}t]iwhlv||xtqponnyvmojllbg|}~~}zrkd_gb^qw|ptwgdv{wx{uryomvzwl`]isi`hz~|twrmegd\e||zxspoojiuymmvou|wvy|}{xuqlektdcu}z~yk^]hk]Wf|y||fg}{nkqwywtrpmkkwworkjokeq~~yqdapfUdwwz}ofsvtx~ttxkluyvmc_htn^`tvzw}zyrhikbbq}zutuqkqxqqqiw{wvxz{zywtkbrzb]nz}~||zws}rbf{ykzsnqms|ztomlljgcdsuu|y|xlmiqzzw{|~ymj}pSfz{y|sRPxv[NLVgoc[kznl{~}zuz|wxu~whgha\ciieYbvyurqrstuvxxrbg{m^s{uv{~m^pv`TT^bUL_mel}vmmis{vsqnifp~x|qtqn|zqhnwzrfu~}}|xkX`th^or_^WTh}ndbhl`Vfnekvvv{wwzw|y~}xmx}sdblqdUartqonnnnprsrgV`wtjt}{~yjoliyxnhjmeWakgq~qrtkv~|ywurlir~z~|zj_ksxtnxzgq~|zyyywjVYptmpvusgZ`canvniinocclho{zxzux{}}w|z}}sgssdevw_]ovutssqonprrlZWn}}z~||||tgmwu|zpiefjgbfgorp|sywwwvrmn}y}|{~zm^fxrk|tjz|xutttn\Tgx}}{ymjeZ`oouwplhglokidl}|{~~tt~~xy}|x}tw~~thq}oco~oaluvvvvspmmopm^Xk{}~wrmem}}yqlgcflmial~qr{~zuvxxtprw~{srxxl`j}wlwyoy|wrqrqk[Ylw~{mf_Yhuv{xspkhjrvl`m}zow}x|y{w{poxzphxshr}pkruvwxwtollnoh[`sy~}~tldcu~}ytoiehqvh^txo~|zuvxwtr{yx|{~novsedu}vq}vx|}~~ysppqnbYgrtwj`Xartw}yvrlin{ycbz~~{oq}}z|x~~yyvkpwqgr~ss{vswvvwyyvrnmnoi\aqsy}|~ym`_pwv{wqihs}m\nxo}xxyxuuww|{~qmtrdeqsz|w{{z~}{|~ytqqrn`\jnm{~~o_Valkq}}xqlq}dd{~yls|}}~|zv}zzykmtmfpwx|zxv|~xuwyzwsonoog\dplq~{~o^]looy~wokuu`lyq~|xyyvwvv}{}xmopffonr{vz{z}~{vrrrnb]knhq}|zfW]jilxxqp}sdr|on~|||z~vz{z{tjllflut{{rzxvxzzvroooj_`ooju~}{y}zfYcnmr~woo|pfssv}xxww}~sy~|||wkigdmrowzo|{y|~}zurqpi]bpnis|xxzeWakkr}yrq~ult~ylq{yyyuz}{yyz}wjdderyxnx|wxzzwsponh]bsrmt|}vrz{iZcopwyqoywos{tvyvuv}tv~}{zzyz}{od_aozx|oqzy{{yvrpnh]`qunq~z}{pryp_anrw{tqw{uvx~~|pnwuv{wu|}zxwvtstwsf^^oxl~}wwyxuromi`^p{vt|}x~|nkstfdqvz~{ups{yvzy{yuxssyxsz}zyxwvrruvk^Zkzkxyxxwurpmi_]o{vsyw|rjosjhswz~|wsv|yw~|y~}}~}sp{tsxxsy{xuutrnlptn`Zknx{wwwurpni``syw{wx}phkqlmvx{~}zvrvztvy~xx{srzvtz{xvvvtolpuo_Yl{ny|wvutrpmg]au}wuzwx~rikonsyx|~{wvz{syx{}|~ypv{sr|suyxtssspkintn][szs~|wvutrqmd]i{|wx}vw~ynghkowxv}}zvx|uq~y~zvzsvzsyzxuuutpkkqujY_xuvzvttsrpi^^p{vtw}vyynhhluzvv{z~}sw}y~}~~ypuvs{svzxtsstqlhkrq`Xj~yyvuutsnd\iyxtv{zu{~{qhceoxtpw}{~uqz{wv~uywu{{wuuvuqlkqtiY_r{y{}vtttsph\`qvqqu{wv}|rgciwyqq{~rxy}~}vnv~zu}}sw{xusttrmijpqcYet{~wvvvuod]hwuqsy~vw}~}vk`^kyumq|wp}y~vt{zyuz|xutuurmjlqoa]isy|utttrk_]lvqosx}vv~yna`p~xpuwry}~yoq|zzttyyurrssojginlaajr{~wuuusk_aqwrqv{vu}~{uj\[o~wpu~tqz|{sw~tu{zwsstspkhilleekqz~vsssqi^`pvqquy}xsz~zpa]pwyvr{y~}wos|{}}rrxytqpqpmieehigjnqzytstslabrzutx|~|ru}~{ywpbYg{zwoyxz|tv|tqxzvrpppnjfefhjotsw~|tqqqlb`nzwtvz|}vq{~|{xm`e|}pu{vzzrpyw~smswupmmmlhecdehqzxwxsrrofbo|{wy|~~zqv|}ywwumabv~|ps~~vx~~vt}x|umswuqnmmlifddehs|w|yqppmean|zvw{}}|~~st~}{zzsggx}quvuz{sr{twqkqusolkkjgdcccfux~|trqnfet|xy}~~}~~tu|~~}{xvvvoegwzpvwtz}uwwxqlsvtpmlljhfedbgxx{zspojbfv}xvx|}|{}~ux~{zzxpio|ws{usywpxzsvzkmstpmkkjhedca`i~}x~{urohdo}}ww{~~}{~|v|{}}~|ywvvrihq{~rt||wzywpow{{{|ttrnokgemc_\Z^hmlw}vwpppst~vrnqw~|zd|w\X[aroh^\clqpxwy}ywvz}|jl|}wu}{}zy|xspxknzs]qwptmqtwt{zvz{}~{ipvf]q{|~{x}xqkjpl^t}qpymix}hq`Vbolrpqyzsfitwgw~{{x|qjkty_mu^\eeaik~}m}y|}pafouhfrW[aGKWZVWMUg{w|y]ncdz}}|}|}jfnrok[i{{wljw_ngf}{umcqyupofyr|zu~p`bd~{icnw{vq~}|oZfv|~zl|ussdfenp~nswstxk_ksvyv`jfoabfYg}~togmixljdeZV_OM`f^l}uu}yyxhmfga~wx~udlq][f`Sfnzq{nqnh[gxmhyxa_lpu}|skqqv~jhwjcv}kmuy}xsxeitccw|rylursvmnruntwd\ll\jvhYc_a\nnqw{y{nmkgk~{xfgb^U_gbckic~zxyuntvmuqvsz}}{yx}{w}xsu^eofZmrr{uwzwrnk^gtwdmns{|zuflt_jtx{x{qh~ts{yf`frfj{~}nkzobszhdpkheyrooq_kxp`nomoia`~~zzahbb\ttqxlng`Sgvoltuz|ywurrymfox}{~y|{jk~tfkt_[g}}~xy{ilipiomb_poavvp{ys~urrakxwlur}ps~zsskdeYXjs{|}nhz~mq|tzrm\kwnfuwb^hnjuotq|uy|yuwxvkwkomqjztsymumplrii|||}~zqn|o_nr`dwvy||~zyz~zxpdowkbjmzjv}oevmjbvumqrdnuvgyykg|ypuq|wrvn^imbgpkwsxo|kfqrqwptosdm{whnlnuxeihpyy~yv{~sgkkdlhtxkjilsmrmnvtutvxxvkduuzszy{{vyvg[ahtWQkqn~ws~ojnlcl|ken~xi}vrv~wtwx|vwlmqjz~vymiZifcwrmikolrrps`qmoltw}rsvihhfhijwz~z}~}ujno||][iosy~{~znnn{vos|kwyqxx{ioezhpspx|u}prz{uuorr~rlyggiqyzqpwpwdzwzugpezvaZZ]okn|}~|}vx~zrzzojog^wtw{jwvrksilhgd]~itgbw}pu}rhpt}}}osmhyp`hWUjaaqtgsp~xtv{|nsxuisyfru|t|xvt~w{z|nglsapu`htxztyxq}r|wtpwx{potoazyfinipxvzzz~wkkojwm[djh~zuf|ok|hjxchiotrx}nosax{wzw{}t{m{^mldgg\rsun~}vx}}~w~zs|||rmwngskZqyfvwzyz}vtq{tm}ifugdli~~z~i~{xvzqryyh{sndcsoklr|{|v}xppqln`bser||xxuprj]uhnjj{qrumk~m|st{zposgfcpjW^mnxsn|t{ut~{t}vt~{mxuozgX}ilnxzzy~w|kpwqiibf]bxsq|~rortz~zzihutujsspjh}}owv~t~u~yvwxmsbmg]kku}~}w{pfll_jwxp{~uyji}wtspmuu}|v|nnlbcvm\htnxm]|vzv{|o{rmsehqig^v||uxyxytxnoxggmivbmsih}wytywyjvvv|kqmknnsjgy}v~~y}~x}pncijccliurwyxexkggcuxkxxj~{q~|pp}nyy|v}sjjhqpabsnneWjww~vwo|ys}kmreg]p}yx}v}v~x|vyxnmsut_heccnps}zq}}mtry~s|{ztdwhurwws{~szrzr}z|cgfztdYTXc[jho}|jlozyfx|uxmgy{xhaulr{vtwrzzjuxysx{zwo\\vslivvz~~krbdm`ptcZ[^ixwoz|suzx}~v{xfxpnxnlhkky{`|{w{tvys}|px|kpouacr~u{yx~~z}yqv}yhqvbhl`U]br~wu}swr{tt|uvyyzzykvicswvttr}{ntt~|i|mfzhgsejxa_ustvsstr_nqeuwjeh]nx~lzuw{yyq|owrtnbZalxtgWsx}j}~uwtmgnlrvlooykr~pzspxiujbwlo_vpgtj_o}}yk{xwdovrheskeutxyyvszwwywvdh~mkfcifu_n~u}q{lu{vmpyvnlyrzwkluz}zryxpjrm[PvtXVc]izyyx{s|wyu}sxogjutjwnqw|u|}~}jtpvzignjbimdbsoxxuiwwlprbtvkk}wr|m|z~w}|v}rqwvhswpkpaZqfcjrx}vzv{|{uo|{oruquyiur|wz}|puq~nh|wll{hnyiPeumfsw|t}y~~lr}wkop\f~key|l~~}}v{~{uzumt}pnhbqgj][huqp|{v|gvpytoiytlzwy~x{}pv}rx{p`neZ_aVblho}w~xq{{oiqsprquyl|}~{|~{n{uuleqrflb\cm`fq~z{{||iwnrnhyxnsyqyscxx}z{tpw|pprtlvaaoe_bum]mx{{xwtzxmrytoqf|tvvs~yxnvswks|pu{z{jXkxi_omlhxwy~m~ykxp_nmgnhh{~x|x~wpxxmohlvgg^bin`gtxyyy~urzywtm~jlrrsyup|twm~wgdsaacXbkf`mwt{vmjmhlf^nmg\Z]V`rujnuhrurm{~|}vv|}nlyXT_hqgeo{vkjqs]Su|~~}q~|g{y}qcbldnxirx]|dgr{w{{}x~wrzwf_ouh`fvrc_yv[~bmpvmabuu`lzdo~wx}}vt|uhm~{mlWmztw}v}~qmhzfxuqousrhphgu~iau{xytuvuYt|{kZb|dLf{jqn`yj{{y}rwub^da~uvz}`hcWbiaV^RyjYX]_[cUm]`knjTq{ytusdzssk^yxcywiq|u~|op{rbcdi]RW_u~pzfceydfXh]Zgq\idfkotf}}dhws}xy}znuhwx\kuwwlzwUa{qqiiok~{uglqvaUVouxspn^Zfy`\PqrIWjcUcX]dq]Zq{k[ntorsu}zqy_v|sw{dw{|xy{|cZernVNQto{vh`ze_`qRgwjdmcdv~_f{kk}uq|yt{|vh{jpytxvgwnSpwqkwta|Ÿ}hanzo]SV~s|x{r~m_[u{[TatjI]m\_eYYstT`ps`lvxunz|sx|~~q~v`z|{tweyu}xmu~]S^mdVQOs~xmcygVsxtWaqdmqc`|fiw{juvoy~y{|z}}ogqxv|xxiotZnrul}rwlw{sulYaqk^]T{qrui[pzgGmnh\Qe[ej^Ule^joblm}sx}{oxvrivw}r|pwwu{}}j_vlQO_cZ_Tn}nzcq|{Xdin\cdjyn`gmpwmnzvyyupn}vemoytipiomrmumn|zxdqw`V^gcgcl{`}wbdsq^O~f]bVX^qj\Yv|lekdd~~n|u~zorwxvuw}tyrxsgv}|xp\bk[PR\[fckgni{uo[y_p`\f{viay}rrkjsx}v~{u`q{jon}}{mi{p{opirrc}x|xdimb\Z__niv`zfgsjfZvpUh^P`smaZq|wni_dpuyyzfzv{yxwzuwlzrcvzpxk[`^[WTT[jgymmtwqonw^qgVq|uif{yobpszss}z|k_qwpstu{msoynnb{xlczzx|{neg`da[Xempuq}zgsmgjotgWlYTppj]gt{zp`Ztzkquki|z~xz}tyloujnzvufyvoa`YX`YQRfdvyxvwyop|{xiesZm{vngw}q`kyt{w|z|z~r_iywutrutwj{vm_vtjduw{yxzpje[gg\Rbfn|z{~y{owlhr{lmZhbZrmk_kqxt^Zuzoq{{~ljw|vyu}gp|qjusuy}tivrnedUWc^NRa`urzyqr~rscsfqwvnkxyt^jyxsxx}y~tefrsyvr~{~y{i{~p^qpjh{urwtzvqnfWclbR^bkzt}v|pkunki^jeokmblqs~eXn~}t{|n~u~{ukmwzxophvrmrzuo|rxnmlhgZM]eZM\[nusustqterxvpsiwvykbwyko{x~ogflsr}ulgenliuztq~vqpmn]Tcm`Wb_ww{zv||pnngo^hznikdtpr~f^r}|x|ui~l~{uojnzz|sqjqoo{qv~w|{|zpeeegWKVe^U^Ztwzzxv|kyliznqj{wvqfv|spuk||xyplfdov~wmqfkikws{~zzkhhmaQXgj`f_u~~}su~tp|ejp\{fkbsuovtdnz~zoy}jxq|~vuohmrnolnwryxotixk]^d_MLXeag_k||sy~yjznqvqisvxqs}~wpp|pu~z{zqpofay}|}nz{omghqzwwxyoouzdaggVRZijrhnyjyyuyzdlphvlbkzrrvxory|{uk|uywq|~~tuvof|wxtlkuyq}owanetaX_aRLR`gshk}n|}oozsvgqyxzzu|~umyy{x{mtz}znprlbuz|~}~qx~urhhsvp}szhrixi^edWSXdn|luxiuxy}jhtu|q_pztsrqr{|{{nmrz|s}mt}{qtxpj{|y{{vkl{v~qzvn~oejcocY_YONU^mxhz{xq{~pp~tg{|zxvs{}}lrpwr|iq|smqshkty~s|vxyphmwt}vuylukjsfadZUU\e{vq{mov{xjm}xfiywvqmo~~z~pknqnwxiv~rrvumvsy}||pmyuvx|zo}|sgurbgk^_YQOSXjxkyw~sx~yoy{j|||xsp}ylrk{l~nk{smpsjnmu~r~x~v{tkpvq|{~{vzovyqeqlebYUUYd{rw|xrqv~|om~tioxxvpip{{knirms{iq|qpusqtm|~}||uq}utyxyr{zrmopi_lfaWQPRUhum|s|wv|s{yp||}yqm|wlrgjvwgsunornrknsy~s{yqrwpuryysxovkdqldYVUW\stxu}trz{n~q}xpxwxrih{~{mlme~jtwiv~uprutykxyv}wyxrwmvx~||zotfpg]lk^RPQSZpn{}tyvux||~|}vln~mqlj}lqxjszrnpqswfxv{~xpzzwz}upsl~z~~|t{gpn_mrdWUWX_sryxryvzxw{zxxrhg{{injf~}pjxooytpqtx~lz|}s{~}wqt}yov~w{}y{woycem\aqdTPST[nmzvz~|w}|xmj{nonf{}wirvmrroorunsy}|}nsy|wppvs{oz~}|}p~pani^pq^VW[^opvsny{yuldopiobryypgwtnqrrux{u}sryzspsz{pzwz}z~ytzkws]aj]aqbTSWZimv~w~vt~yrhowkrcpxwwfpznjopsu|s~t|polahZW_it|{rlko}yy}}~}}~|}nfggqpt{zz~lqZmrmqxvxj{tmfm~yr~wwv|zk~y~||zoxiflwxwyyq|xcrufbptkxwg`bdpltyy{nxngj}w{oyqjtyhdw|ma\esfajwhek^]bo}tmmo{u{rww~xqrvwka\c{z|m\q]WrtjaYWcrnplfzwzuu~mqvvx|mz~~~x}stzphouzncmoeji\WWac\vyw}xwwrmvvur{xmkjpv~zrwtuuqtkdvp{qwyc^xp_g[UX`qsigivosz}ypu~zxuxxjb^`moypamzqcXVamxoqjdxst~|roktw|}nzxrr}rsx{~plruttvsuqimd\Zd`\tsx~ywtnjstzxyzzxokimz}~xqx|tvyy{iipbr}}jarfhYVWarrhfjx}{jp}y|wry{vr}}w{t{mf``gv}xrp|ziZXcmu|{puhewpqyvzuhpw}o|tk{v}rruy}tqvxtngm{mnof`ga[rou|xtmho{zpvxszqmkmu|}rv}~qwzpitcdugwpo`XW\k~zmght{sze|zttrw~vkt|~{w{~~yvkdbemt{|}~uzg[`jqvysvtcrtmqzxxrgoysvlpzywrryywsptxxsk`qomtmhk]erkyyrjhoz{itsqvpmnsyz|}~tz~opx|jnucgsu{|zvb[Z_m~{pjkwwozjvomowwityu}{|s|qiddiqsv{}|z~pbemrtvqzxguumovuwzkiuqwpry|srwwjiovxupdl}kowrqacsiswmhlt}rfmwsomou}}z}x{z|yjlwlhwkis||wwqa]_gvyqnuzmw}tsw|heo{~rp~zw}vy~||pyqulekqrspqpmvi``k~~nerrmysz|}xx~}qrm]Vbpy{yol{xw}seunjxxpmkip~~uqnlnpvzuxs{n|~n]OXZWlhblr{~{tqgeju{wxyecmsr_fuvq{s|pktweQIJMVckigo}ryvsvstwwuostv{kb_h|}qtppzv}gipyvVR[aa_WZe_u}pl|nhwllx{ma]`gr}snpt{{~rfcnvm]^j\\cfkrx~op~l~|neelw{zwtprj\ijslrv||txidekwmdabhnkc`hxyoyoluxxwuokywp|re`bnz~xox~}hclinputmb]eZa}y}~pr{lyrjs{uhaachpxpqu|zxvhbfson{jdhhhimt~snsy}wmjox{zxxwyn^gcgxtw|yn}oheeip}qnosvoe^bpztyuit~~{vnlzutviccjv|uzs{}}igf^q~~wifhVavy}y|wu{t~plu|wlfdddfq|vu{xu|{mfflw~{|w~topmheelwts}zz{tpt{|yy{}qcj`bw{||zwlumhdadyz{x|xkaak{x|yvzkpxomztu}phfiqxysvt~|xxpjhZdx{upr^^psv||wy|~yxmsy~{rlhfcagqwz~wxukghmtxu{|yyvqiddnxysww|xx|~{xy~}ikg\jz~vwpw|slf`\e~u}~{ohhswsvz{~}krwntyn}{pjilquytv~{|vvmmdWdu~yxyzvbisru|}v|zvxpuy|}ztokgc_hszz{||vkggjowyy}}wogelv|}xv}zqz~~{wx~loh\hx{r|t{{tmf_Za}x}xpnuwp~v{}{|wmz|psylwvnklory}z}zuz|t`_ioiWP`hbaggnynp}}}p~~|vsvopslagv||z|iqbz~~youylrsoy}wxw{{~sq{tcizyrsty}y}{lqjjmmkgcssnkmpfdp}~z{{uy~|~xx|w}{t~qjoypil][enqiXXkqhcdkyqm}~z}~ycz{{tq|y}wngqw{wpljhgjlfabcle\fpuvrmlrz~v~|hhzxusp}|oWozxwmb]lsikb\dc^dosrqtz{py||tvzqo{~{yx}t^]q}gdimmfWSdof\\hshn|yux}yte|~~uvy~rqshcnw{|uolnpk`Zjr]Zfosrnjkqwzzu{ik~v{stz|{~caqryrgmxmnp_\ghdioppsx{po~yyupx}spy}wxx|~z}n]dxvlnoolbW\moaYbpgjzxssy{}}mvzyzyw|rpwsfemqvqruteVixbYblpokhhkpstvqjy{~xtyz~~likiqz}sz~puwd\gnjjlmosxvimxqu~}snwyotx~|sxxz~uddu~~yywtpi`_mrdYdlclyvpou}~|}|wysv|yxtpx|ncflxzvyx{|lWh|h[`hmmjgfhkmo}}w}znt}x{}x|ttkcksxvyqacqtnjkmqwwjjtpu{~xvywzoc{tiovxyy~{{xxn`drvsv|wrmfhw|txo[jY[iw}~~}{zuv|ojvzysffprcX^o{s}nseWnp]UTVX[]^fxxjoqryxpv~umu||yryoiwlhp{~}tbVTY`hdY_bZ^iooicgvvim~w|y}~~~}|~vsqbVX]UQUMUhjfceiortuwwtlusfr}|ywx}{rjuyect~wuq]P\c^WTY^```aa`_g}x~~vvynhty~}|}~}}{swrjbUVi]ENfwrt~uv~{wr[]w}pc[Zanp[Klyizzj`jfYVNN]lmnx}y~rjly|ustnj|x[Zr{qfacku|~~niYUertmd^]cjcQSinlwmbZ[jxd]``an}~zxwor|}p{~tjeit{o[M_lXLYlw|}|yw~{qaWU\_X]wyw{ypmpstrmgcfwxqrh\[flgfsz}{|z{~t`Parg_k~{}wqx}lei_\gsvria^`hkb^owz~xsnjfci}{xxk`_lxww|{ytppx}rfsxqkggkqx}yg]pzl`duqqujit}yogbcjplm|~qz~ulhfdb_\[e|{ujjt{slr}xu{yy{yc_ruibhw||~~x{tuxpfmj_dpy|xqlhgji_^bdw}yxvtpkjx~{k_`lrll|yssyumy~iq{zuqnnosy~m[bokc_i{|z~qhmtxunf`]`jqrxz||qvvnkjhd]W[mrltztnmwuq{~ytonpw~nm{zskhs~|xwmdi`QS]isxyyvsrsokddywspmgabs~zomw}umt{{yoyyhmrolkllmqxukuyrkaaluvw{xumotwwvtqkhjnokeu{~jjwzqiilmke^aookx{sottjr~}}vrrw~|lmvrolfjx~||rlriZW[afjnrrposxwhbxzxvpidmvnq{tqwuq~|vv|zyvuxvrpmiecfny~woy~xwrihqwwwy{}yysfehknptvupmqzxff|nr~~rgccc_ZZfkdm|}xx~ulsvz~ztqsywpzxopneepy}|ypfkpdZ[^bfjpuuqmqzv^^xzuutpjkuukr~yros|~up|}{~~ut|{x{yurqplgegmuwolwwotxqms|w{rgeeefgkopmjppl~|~poyykcaa]XYcd[dtz{{|ww~~{ytnkkqz~wtstzvmq{~|o`bi_UV[`eksy|yss~rbr|pkjifityor{ww|{w|wvppyxplmopnlmqx}wq|tpwzpinx}~xv{okkkjknrtrlhr}jryulkt}ymecb_^goges|}{zz~yx~|zwsqrw{vmu}qjr|zrs~~lcki][]`bdjqvwsouom|}qljgfovmht||zxwy~tl{zokkkjhilsxvpzyos|{piox||{zovtieggggjossnjo~rq~wonuxnb\[Y[fnfdq{}|||}~vwyy~xwwtrprvxqkv|oflw{toxw}kcje\\^``bgnstpmstu~~rjgehrthfqvvuuvx}oh|}pkjjiggjoqlm}wqwyps|wrulcbba`afmssqqz|}womsvmaYVV]if]fsz~}wzx{ztrqonosvtnv~pnvwqx{v}tefe\Z]`abfnuyyvx||}{ywlfehsymgqxyz{}~~}zscrxpnnnmmnqrlm~zrt|~qlt|||rjihfbaekpqppx~{|~{toszwmc^^foi_eotw{sv{~}zwtrpqpjerynmt}yps~~|rqj_]^^\[^fnstu{~~~sjgkutfclqruy|~~yszlx~snmkjjjkici|xru|uknwz|{nfffc_]`fknnpx{v|{rouxpe]]eog]bknqv|sq}y}xvtqpome_kzvljnw~}sow|}wvma]^^[YZ^eknqw~{|y{oghrviafklmrw|}~wzrr~}smkjiiig_^p~ztuzzqt{tgccb^[[_ejmpx~yy{qmsvpd\_jk_]floszuw{|{urpppplccs}voosyyqt~zwvzyk^\__^]^cjorw}{zsw}{phjtviekooqu{xxtt{yqnnnookcbtzttw}~sou}zjefea^^aehkow|tryoovxoecmpd`hmorw~~v{tqppplb^lyunmoszxquyt{yf^^_^]]afkot|}uzrv|ynhmsiaflmnqw|~~y~{}}xokklnmf`k|}vtuw{~rns~vypc``_]\^behkrzwmtvljpsldgng_dmoqtz~~unlmnld\etunkmpt{|vz}noo`\\]\]`dilqyv{}rlqvrjkog^biklot{~}{~skijmlf`k|~xvyz}~sr|qqsc^]]\\_bfimu~zpwymgjqoikne_gprtx~|}wolmold_kxuonpruzvw|lnqd`__`aeilou~~u}{pjnuuqspd`hmnnqv||wpnoplcdt}wtuxy{}rr|owqfa^]\]`bdgnx{po}zojoutttk`dmpqsw~yx~vommkc[crrkjmoqtz{tzvo{zmd`^^_adgjoy}tzwmkqvwwqc^fkkjlqwz||~z}}sonni`brxroquwy|ws|outib^[Z[]^_bjuukm{}rkmty{xj`elnnptz{y|xpmlg^Ydnjdeimorxx}wr|{qga^]^`bcflwxs}xnhmu{|ra]dihhinswy|~y}~xqomg_bquomptxz|yrs{|vne^[Z[\^^aistkmzynjpzobelpppty}wz|{wqnjaZbnmedgknpry}zwy~}zrjc``bdefjs}zrw}tkhmy~l`cjkjjlptvxz|zy~wy}|~zxunkuzqnoqqqsv|znemztwyz|ysommoomjjorjags{l~{uz~vrxz}{zyvu~n^h~||y}yrnwypmnquw{|hcw~~z|{|ztrrtutstx|umqzxmq{torw{~eWczvuxwz|x{|xqnv~zqnnoonllnnlip}zz|~~}}|vnhnzutuuutqmgfo~zootwxxxzzzzywrkktxrjmz|~|{xtmgb`adm~{uqrqlmrsojijlnnosxvnlquuuxzyy}y}{sh`djjhn{xtz~~zuqsy~~zupkoy{upoppnkhghlpv~wpqplhilpv{ywvtrokgis~}tqtwxyz{||{zxtlhmttqqv}yvsnha\Z^fq}|wtvuolpuuqnnoqqruywpmqtsrsvy{~~}xpe_afgioyzw{}yutx}}xrnrzzuqpppnkhffjpx}}soomieeiou~}{ywuspmnu|{vuvwwxyzzzyxvqkimqqqrv~|yvrmg`\Z^gr{}xwyvomquurpopqrtwxtnossqpqtwy}~ztlcacddhoy|}~|xttw|}ztopwzvsqqqpnlihhmtz{|wrrqmhefims|}zxvtqprxywvvwwwxyzyyxwtoloppoprw}zxuqlgb^_dlqt}zy{xqnosutrqqrrtwyuqruvtrrstuw{|wpiggdbcflw}zvtvz|zuqrxyvtssssqomkknsuss|zwwuqmhffhjox|zwutuwxwxyxxxyz{zzyxuqpqqonmmpv}{xtpkfcacgiio~~}~{uqqtvvussstvxyurtvvusrrrsrty}yrmjiebabdjv~{xwy||xstxywutttsrqomlmqsqns}{xwvsnjgeefhmu}{yyyxwyzzxxxyzzyyxvrpqqommmmpv~|yvrnjebbegfgp~|wtsuwwvtttuwxwssuvutrqqqrrtw}~{vqmkhdaaceku}zxy{{xuvyxvutttsrqonmnqsqpt}~ywwurnjfeegjnu~}|{zwwy{zyxxyyyyxwvsrrromnoprw~~|{xvrojfccdggip{~zvuuwxxvuuvwywutvvvtrqpqrtuw|}zvpmkhcaacgmt|zyz{zxxzzxwvvuusrpommorrru{~zwutqmieccejou|~}zxy|}|{zzzzzyxvsqqqomlnqsw|~|zxurnjfcabdgkpy{ywxyzzyxwxyyvtuuutrpoopsvy{}{xtpkigc``bgmt}~|{{{zzzzywvvutsrpommnpqsvz~~|xusqokhebbdhnu{}yy{}}|{zzyyxwvsqqqollmptx||zxvspmifcabdgjqy~{yyyz{zyxxyxvuuuusrpooprvy|}{yvsnkifca`chnu}}|{{{{|{ywwvvutrqpnnopqsv{~}}zwtsqnkheccdhntz~{{|}}|{{zzyyxvtsrqommnqtx|}{ywuspmifdccdfjqy}{z{{{{zyzyxvvvvutrpoopruwz}|zxuqmkifcaacgmt{}|||}}{yxxwwvtsrppopoprvz~~}{xutrpmjgeccehlqx~~~}|{{zzywuttspnmmoqsw{~|zywtrolifedccejpw~~~~}|{{zywwwwvusrppoprsuy}|zxuromkhdbaadglry~~~|zyyxxwvtsrqqpoopsvy~~}{xvutqolifdccegjow~}|{{zywvuutrpnnnoqsv{}|zywuspmkhgedbcfjov~~}}|{zxxxxwvtsrqpppqruz~}|zxvsqomjgdbbbdhlry~|{zyyxwvutsrrpopqsvy}~}|ywvusqnlifeddegjpw~}|{{yxwvvtrpooopqsvz}{zxvtrpmkigecbdfjou|~~|{zyyyxvutrqpppqsvz~~}{zxusqomjgdcbcdhlqx}|{zzyxwutssrpooqsux|~}{xwutrpmkhfdccdgjov}~}|{zxwwvtrqooopqsvz~~|{ywusqoljhfecbcfjnt{}|zzyyxvutrqpppqsuy}~|zywurpnligdcbbdglqw~~|{zyxwvtssrpooqsvy|~~~}|zxvtsqoljhfdccdfjov}~||zyxwvusqpoopqtwz~~~~}|zxvtrpnljhfedccfintz~|{zyyxvutsqqppqsvy}~~}|{ywusqomkifdcbcdglqw}~}|{zywvutsrqppqsuy|~}}|{zwutrpnljhfdccdgjou|~|{zxwvusrqpppqtvz}~~~}{yxvtrpnljhfedccfinsy~|{zzxwvtsrqppqsuy}~~}|zywusqnmkifdcccdgkpv|~}{zyxwvutrqppqsux{~}||zyvtsqomkigfdccdfjntz~}{zyxvusrqppprsvxz}~|zxstmqooqjj`a_^bblpxsyvnv|yz|rkavoxw~|}wz}wvy|ty}}~q{wgR[fuce[[gXbntqujtsmofstqj}|vfpyzqlrpyzwkixqsystmyxw^Zf~hnsv}}isleholgeqqrbm|}p~||zosndmpXwtc`ajnksox{v~z{{vkq~lgroojfv}k{x{x|tv~lurqvhWoZ]xZ\[bv|~{xqdkrors`enx~q}xw}txloyz~~rnbq}zmx}sgxVezlkfwr`ai~wpvcZdxsiqp|}y~vixg_ts{y|plwx[bgiytry{x{i{vad~___gkqn]}xl~elys|u~mzsv]htwlstv}zajsljkswwvky_Ysil[xa^uhfqgMibZwwyts|n{k}}vbdv~zzi{sp|~y|{tp}ptom^vzlpq_no^_vGkP``[vzxxxqk~~jlzwclu}moxr}vzww_kj_uo~yexpdvqSpjO{^Wk]eyow{nykwzl|}y|ix~spkisy{s{fWlbrqrd}nnjf`wZiuPil\mrsvxb~wo||jp{s|}u}hswy}~nZ\g^w}bt{knhafnWtn`ifhyzmuwom~~zy{}kvcozzwx|xsfm~ryxrfWjnew{_{oldjjd^d~`gjbl|wqxb|w|js`oowv{wwpwwyyz}uucadn_rmurgpkjbbTynamcpmzzy|sjwzu|]}vfnuuxz{urwpw~|yvjb]rjghxiiljieYmw]tlfiw{za|ts~ch|dlpzz|q~rzzz~|{yocYhhhkvpluekkb[{cgqfmqz{yzfj{n{zr_ldsz~|v~r|t||xtyhS^rhups~nphkih[wm^sbmsurz~u]qzz}dwpdo|{x}un~svxwxxlUTlgp{nsukjjhWszUifoptruy{\{uz~hwuenwuyut{u}{}ssvpWSlbjpusslbc_p|Wecnqssw|{evzzjowjhky|qupuw{wuquaScbgnyy{skea^o~Zejmmwztv}eq~{gryegg~vwyqtuwtosv_Uc_fszy~uoebcmagdoqv{wv{}c~xw{x}cqwghhqwruov~xuqtx_Qaa`vv}tulbarbifpptzsy|x`u|v{y~hrtimh}pu{qpuyxqqts]S`^^qzvqdbofdftplxwwwx]wsxy{kkxkoj~qu|np|zw|vppvaP\]\n~xsbep~gbhopjtvwvybsw}w|zsixlofwxzxjz{|}uwnmuiTY[`m|usgdj|q^gmuityut~md~z{yzxcxoigr~qpx|{qnjvvWS\^h|zujbkw{cfgvprvxvzvar|{zv}ipriijp}zovzwy{okn{dQZ]ds~wtgespagtvowywv{dmuz{ytzqgtkkizxzpxy{~rvjguqRW\^ixkco~fenyoqw|tvqc}q|xwt|hlrnlms{zmt~zvu{lgeubQX[ct~~vfhwtajurlvzwruekvwy|xzreropkzz~qt||jxtd`hqXT[bk}{oeoyndmxmnw{tssdwoxz{uzlironkz{mz}wfyia^nmSWalt~yleu|{gesumuyzuvje{oz|xuthmmooywxr{u|~hpr_`ft]U]ir{|ten{vcm|rov}xvscunvzxrwmgnmpp}o{y~}{xdte`_plV[cqu{mf|~jgzxosz|uthiwoxzsstglmsq}~tr}uvfnk^^gr]Y\lsy~sgwtet{npy~tsmd{{mt{wtvikpqrx}|l{wz|neq_[_tdW[fr{ykq~{hn{qpu}wqodq~qn{|rvojoqttl}{~~utbqa\[pjWZctx~{okki{ros}zsqdm}tmz~tvqjnnrt~qz}y{qxaob[\onY[brt}qjoh|uqr}tpfl|vmxsttjjmsr}tvvzo{cme^\kp[Z`qq~tjqi~upr}uqgkywmu~tusjjlrq}su}v{q{cnd^]mp[Y]nouotkuqs~soflxvkuturkjmqr|qw}x{qzdod^\mpYV\mlxpul~trr}toekwwktvttnklqs|stu{nyene\\jq\WZmi|pzi~vqqzvoejwwnrwuuokkqsxwt~t{lyhkf\\gr^WYkh}o~k|xqrwypfj|ywsm{uvqkiqr|y}p}s~~ovngj\^brfZXhjvtzowqsu}sjhutxj}~tvqmhnqxzq}}wzz~wpuem_]^pm]Yanmzuzrsusvmfprzjsuvsohkqv}}tv|~szlwhke]]hsbZ[nitqzstxzrfixxtug{turmhos|~p|t{~z|rpqfk][`qj^Zgnp}x{usvqujfpozittvuqils{~tvz}sx{|ishiaZ\grd]_pkvs~zssu|rfiwyqyf~}tvtohpuq|~uw}wzzrjodh\[^noc`htquttup}wmen|owpiwvvskktzzrzq{wyuxjlied[[bsmdbrs~z{{{}rvruhhsl|ettvuriovsyzvr~|t~ytrglfh][^mtidkxswxuvr{znemyotrexuvumkt|zsyoxuwtujjigcZ\dtogfvt}~~~|svqtfhr|j{cvtwwsirzs{yst}yt~vrngjhf[\apskfqwwy|swpwjep~izlkvwwvknwuuvyqz~{s{zpphhhh]Z]jtmgmyrz~uvrx{ndmwosvc{wxxoluysz~pw{{sx|pojfgi`Z]gtpijxr}wvtv~rflvtozb}}vxwqjs||t}}ouzzsv{pmlfgkc[]fsqkjwrzvvttfktxl|cxvxxriq{~t~zptx{qv~}rnti`ahvvnm{wyuvs{qy|xpdssvusqtwv}|v|rutmdv~nmegod\\cnmhgtpmnuukjki~ymbityoeyxzzsfgk{{{jZivfROXNILUbc__kfy{yxvznu}zogcov|mfilkwuvrkvvkkigco|rlvjbcjuxsr|x}ufac]rrfZ^ixudydn}tvtm^_gyyume_Ze||jo`PNR]a]Yc_hz{~}xvv}v`Y]nsvspnpzrsim~r}lgffdixzp{xhgju{zu{{{~~yxopenyoa[en{hpsc|ywvte^dr{{vfa][^pyx{d[Y_ef`bf_xv}}{|}s{wxiYYdttzvtn{uvpjstzgfcddn|w|puiioy}{xxy|r||pqetym_^hryfunh}xxwrc_gxzna\YZbuv{}f_]dijehfb}x}~||z}}t{x|ufWZhxyzvsn~vxplut|~wedacdq~w}oxllq{}ytxo{}qrfszpb`iryisqhzxwvse`h{~l]YW[eyxvkb`flollld{{|{}x~}yuy|z{}yshYYh{vrnuzwtlpzu}}yzfb_bfqx~l~onq{~otowruio|ugahpynouhvywwthai|~z|kZWU\h||qqechnrqqpg{~}yy|v~xvx|zxzvqgZ\l}vsnv{xumqyv{ywxda^agtx~lsru}~ymtnztwiq|uhcjpxpqtjwyxwthcm~~uxdXVV_mywrjhmrvtuoi|{u{xx~{|vz|vy|wtodZ`u|vsnx{rovzuztypaa^cjyunttyz~~pprl{ytjx|rffmtwotpoxxywqfft~{}vvp[XTYcurqmmrvyvvhuzw}yw|rxyx~~|w{yvrk^\i~{wqz|qnjjpzziy~lko{y{w}qt{{ut}vdzxlpipvznb^h|ymlmim{~p_mqlcgurxyrqtzkjjmvwil~tfnngkfuukehvo~{ravmcflsqprrw{~}tr}qdr~rs}fehovupZXX[cs||nfl{}fj{vnsnox{vwuôo{yxvka^fw|rd`iwt~mcZipozry{spvziifgo~z~{ztdbofqxstdo}~}ol_o}wvwyxsswx||snwzq|xz}ghpos~qi`[\fqvovpxrgdjuwxwusoxzvu}pzx~zuofdmuynnwqvu{}yia[d~{|yxps{lgebfr}~~vuicsmjzvuopbi|}~~ztyyz~~unq}}stxw~rftrnu}sofdhrvtn}m}mgip}w~s}~lsxws|uo}w~zusmdktyztzzstx}re^\s~~wrmyuhhccjx~w~rfhuio}r|xqkapvt|x{~{sov|yq}y{nlyrn|xtngfmuwptrrxlgkt||{sxkrwuu~qty{}yutndpw{zw}yw|u~uzoc]`z~vnlzrhhcem|~u|rgjxlqstpjbs~~~tt~wz~{tqx}wq~x{om|vn}yuoihovxqtrpxlimw}||r}zjputusuy{{wstres}||x}zw~r~puob]a{w}pixtiiefm|~t{}slhztq}t|~woner}}}yo~zw}~xtxvpz~vvwl}qy}vrkinwzupyg}|okoyx~sv~mlrttys|yzurswhqz}|vq|mood_b{zysgvvkkhhn|tx}toj{zr|v|{wppht}|}zm~{v|yvzuq|}uvznrz~wsliowytpwgz{omr|z~tv~mkrtvyu{zxsqvzhv|zxo|}kmnd`gxzpgwtkliiq~s}|uol~zt}uz~ssojy}}~toyw}~zx}{sr{w{wrq{xrlksyxptnk}xppv{|qzzjmrs}s{x~}xts|vh~wvquhpjbaqvgoyolkhkurrr_\abirceuy}{vrihask|rw{|yx{~i`uu}u}fjyrpqnov|{usnuryhbhjr~rr`]xkhjtu^mxlqwzxvv{v|tswwh\d~nl|uqrpr|sfsrxni`^j^X`dlxkiy}up_do|y|kX]{}ygmt]]mgdebbjtxvwtxmkwyvrjps|yy}oY]xz{tYhreioqommpjtvo}mpobZetuzwwtt}zjep|kdm_V\`irdbqvz}~vtpm^buu|xtbV^yzw}d_ngcc_^dnsrs~szynkrxylqu|zu{tn][nmppmqsqnmnhnwlwolqf]ax|q|wwsqw}ngk}nun]^bhti`nux{}}yttse^k||x~|~suj[Zo~{u`mmeea^ajpqqyvutmny{~rnsxs}|wtgYcvk}oquuqonkgy~nm|yiomb]m|syxwuqry~wkirzrxj^aeptdeqvy||~tqup`bqux|voqdZbwofrkffa_clppr{{tu|rnqypot|}ttsrc[i}|n|psvurpoii}{lm{ufmkaass|xxuqrzz}tkkxzsyk`chtudhswz}|}pouoaeut~wyqilb[g}qhrlhgc`dlppryxts||spuy~rns|~t~mnre_nmrswwtrpjh{|ljwvdgjccvvzyxvrrx~~}vuztmp|~qyrbbgsxhgrwz||zqirtghwyzw~vwrafc^h~zhqoiifbckppqwvspu{vtxzywmqyt|~hgqlerm~wtwxwtrlgx~nhrwebiffxzxyxwsqv|~|ytouuquqwvebhtzkhrwz||ypeqvkmzyx~v|rr{o]bcan{krpjjgcdkopqvssps{xw|{yxnr{u|zcermjwnxuxyxvrjh{{lhrubaigkyz~xxvrqvz{z}yuqltutyszuedjxxhktwz{zxjeuulq~tzsynqxg[cdex}rlkkmjmqotuxyv~\ZbXcq|}y||}tbarfiwremss}xuqa`_]`fikptqvtx{ytkp}zbXz_]cinqrvztzmiqmxuejsu~ori\SMNTY\bihpsw~{}{v{xcUxskmrwzz||n}y{zumc^qrlvzknz{unvxj_[^acglhnpp|~zy}}ru|zpqeXv{vsssqs}wl~|tlfv}u||kkuwsntzqe^^``eifors|xy{|w}vyxpqdTn}p~yzxtmc\kyu}}moz{pmrx~qjiiilniprp{}xvy~}tuy~unqfUk}zwwxl|~{ukbnynkuw}yort|ogeeehlfntr~}yy{zsz}ww~zrriS`q{{zwqg\c}w|smx|ujorypmlkmpjnupx~zwx|~yyu~y}xpqmW]}zx~lx||}|wnbd|}wjrx{pqs~ynihginijvsx{yzzts}u|~}spp]Tuxw{{zumb\r{ynq{~lipyvomllpnittq|~zwy|{xwx~y{rmpfUl~{{vmz{{ysi_mzrkuzzmrzwnkjjmphoyt{{yzyrx}zu~{~vmllZ\v|~zzxsk`a{zz}ns}yhit~tomlnrmivur}zwy|{|xy}y~~|vmingZu|}wnyyyvqhar}x}rju|vluwolkkorip|uz{xyyu~}~{t}y|~{xpghl`byzyxvsldf~zxpq|xiiz}snllmrogtxqz{xy}zw~v{|ywrjekoew}}}nyyvvtqkfr~vwxjq|znwxolklotmm}yw{xx{{~ytxxw{yvrlccmli|wxvtroijzv}tnz}wll}tnmlnsqhs{rx|yz~|w}uxyvsngckun|~~~oxytsrqmiu}tvykp}zr|xqnmnrvmn~zv{wy}~}xtyuuwurnhacpqp|xwtsrplpywso{~}zump{snmmpuohw{ry|y{~zxxtwvsokedpwrxp|vqqqplk}ytxujswswqooqwukuxyyxz}yz{t}zqturnjd`htpyx}}uttrolxwy}os||zxrkwxronotuin}wt}~zy|x}~suvspmhciusxru|rqqpmhs~vv~|mmzzqx}vsqrwynp}w~|yyzz~wuy|qstqnkfadoop|{wttsoiqzyso{{}{ysim}vrpquwlk}|s{|yz}}~z|suvtqojegqpquutrrpkemxwply}znp{wuuz{ppw~~zyxuxvyzprtromhbdlij}}yvvsmen||tp|z}zref~{wtuyzmn}u{}zzyw|~~tvwusqlfgnlkvvurrpjahzyslx{{mj|yy}~spy}{yvrzx~xx{pqtrpnjdcihez}}wwunei~}zoyz}{tg`s{xw{}rl}wy{zxu{}utwvtrnifkmgw{u}ysrqlcbv{y~{mrz}~sgs|{~yo{~z~{xst|y~w}~sosspolgbejem~ywwsjds}sq}y}{xoae~zxz~zmsv{~{yvuzruvtrpkfgmkmyxvqqoiai~~zzvlvx{nh}}|vq|{}zwryyz|x}zonqpnlidbgkivxvuqigz|rrzy}{yvnbj}zy{yltv{}{yvx~wpstqomiegopsyxuppoicm~yyvlux~zok|}vq}y}zxu|yw}w{xlknmkigcbhpq{wttrkk||}to}zv}~{yxvqgl|yxz~{mpvw~~|{z{|}wnpqnlkhegqxz{w|wooomhnzwz{lpwy~~}xp|{yo{w{~|{y~zs{~xywkhkkhfecbity~wstson|{zvmx{ty}|ywwwumo|yxz~|nowu|~}}}~{|}~ukmnljihfis}{wzwnnpnjqyvy{mouw~~}}~zt||xo{vz~~}|{yrz}xxtifihfedcdlx~vrttpqzztmywsx{ywwwxwot|yx{ylrvu|~~~x|}{pilmjhhgglxyw|tmopmkw}wvzwkr|sy~~}|}~~xv~}~sq|v{~~}||ts||xwnefigeddcgp|~tsusow|y|}op~rtzzxwwxxsn|yzsm{}tx~~}}x~}tjjmkihhgiq|}zy{pnonjpyvx~}om|tu|~}||}~yryp|wy~}{yyry~zxqeehgeedcdkvwstrnr~{{tn|tsy{ywwwwsku~||wmxuw}~|zx~vkjmljiigglv|zrnnlgm{xyrm{uu|~}|||{vmxzr}xy}yv~{sz}ypffjigfeccgqzxtsojp~|~vp~tuz|zywwunepxp{wx~}yv~yvkkonkjigfhq{~|tonkei{{yzunzuu{~}||{ztjq~t}{y~ytztx{rgfjjhgfdbdlv}|uspil}}~{qzwty|{yxwuoeh}qx{v|~zuyz|ymjnolkjheflw~zqnlfet|yz~|ptysy}}||{zvmjwxy|{uuxt~~wkehjiggebbfq{xtrlis~}vs}svz{zywvskdrwrxw~}wtxsiknmkjigegp|}wpnjdj|{yzypyutz|||{zytkou|x|ztxuu}sgdhigffdbcivwsqkky}|ttzrvyzxxwvskgxusww}}xww~}pgilkjiigfit}vpmjfn{yz~xoxtsx{{{{zzvnstzvz{v{tr}}rebfgfeeedelzwsqmmz}{}vq}zqswxwwwwvqlyvp{xt{{yux~pefjjhhhhhku}{yqnmin~|xwz~{prtpuxyyz{||vvtvvv}z|uow~te_ceddeefhn|ytrpoz|zz~wpxypquvv~yxrnrlka[[[cfxwvz~|}x_eja[]W]^cqy~v|lythalysy~}swwy}znpwuxibwxlknhjiglvp{|q}}wlsrsovsc|~yfSpjcgx|yp{phrtkotyvjxhvvkoquls}}}{|~e\{wfbgUWXc]Vaoj~rxydYg~{swjffrmknmgY^bwmdhtpojywwlpxtoqtw~xw_\g{vg|~uilrnpmlyedeimqryswii~|~zyqkaz|usk]mhqostzs{yzwwwjejhws}wnj]ino~~rjqgkb^vqyqdnuzxzkrkhv|xz~{s]mjnws{mrqipv~vwqzovpryhbgXnztw~|~~~ntww}ln[ftdllu}u{|p{rhmjqxp~~z{snfcg`koutrvckf]hcenzzzsup~|{|zrnfS^`k~w{qz}kmmc~xnpnxrhqolh^}x{~pegZv}sp\mzwtquoqumknrrny}tswufZix~xw}ztpxhmnlniyzltpowokp~|}x~z}l`danryvtq~xp{~zue|nkunskgri}zuzrrxptjzxirdfoorw~}vxywrjtl_kkw~|}sdg___r~y~}jhh]wqdcexvp}j}|x{y|}{~qr]hmY]c|}qzzuxozlmqoonupnkxmx~~zu~{uqthnl|}tzsisuyq|tsuj}lheuoer|lljh`cw{vts{zig~z{zqwv{u|pjqq{~z~~xtiTlxu{uztxywtx}muvxlnthbh^u|}}|{xulpinrqpigpifqzvzjzvkhws|}uuers[VTly|txxlpnwjmotwu~x{wpnv|}~}vq{~u{jd`ehezyrw{qmpex~hearsgm|{u~~z~}qfnieowwvi|wwttyvjnhpiuy{}yv{ydhwruy|wqtqvxsmu|wzmd`njde~}}xv}{r{}~doqqlyyv{~yugnx|yutvpnlamtjhw~~^Wm_Z_w{o{|itqtoyo~{{syw}yxutyttggmb`im}npwwemgyilsvxkxvsn}~|wz{ujfefYVnz~yxssto}hjv~elktq|{z|z}tzptslrk[ptuw{y}ywwmajs_ezy}~}s{xw}vmfkgpq{jlzyrgypqpq{zzvq|v}qkjknU[env~xsr|v~uyz~umy`qkqgpz~z~yxzpked\fvz}|~{{{wv{}m|pqjwyyt}~xx{{vyrchdgd^ytv}{wp~kkjpz|{xo{uw{|}t{xq^\\dgz{y~}yv|vsfrqcnsxervv~{x{s}~}uzni]pnuks~}{z}xpmtposthlvzwxztzv}tn|heTdwq{x{t}tqpnx{rnkjjqy~~|vveed`inqux||sxrojv|}smldlm|s}wvwxtjmuoianr{}{{msi}oqz{htwwf|z~|}v|thaYoh]bw~}}mlmr}yttopp{mgs~x|{komkjrklhcr{tsqz|vppmajltwwpxtyorzvrclkor{orm{olyshxuas{uxgi`uh\\nnsutv|~zxvwomyifgp|z~}}yntwqnqonl^kvv|wuu{ztvphhkpv||{vwq}srzudfgdiqvy~~pwp~}nny|l~zcoy~w~njdvoYTekgzz}{~}}yqzvnutegf{pxz}vxyvpvsqqd_mmktwvpuxqlmnrvvz|{sw{}m{qhlcajkkx|ztuwntusrf|}zuv{wxphk}fY[odgx}}ww~trxlicjzmj|vx|vvupon`ekfk{z~wz~uwyxlmqmqov}|zy}}ymyxgjpZfihkz~}}krxswwst}vjxx}}|}wgk|}YXiv^bzr~u|xvr{ufmevkjqpj~}{s}|wss{ntnqjrd]q|znqx}lqssfjk{pv{gp{uaehdecno{tystquv}zt~mupsnrv~yplr{na]wbZimkj}w||sp{|p|}prbxo~x~zw~}|xlvi_i[Vxgbmx|uwpvtqpturo~qz{q}zwscz|lsf`eeptvyw{supjuqlfwpt{zv{pm{{ohnt^mqkgf~uwuuittold{wsyuyiksjmngnlnhTqyq}z~qnzplqdvwy||vzwlxfgnd]clknu|yt{x|zwst|whwx||xy{ortknc[xfSbewxy~svntx{lpspttz~zy}yylv{nbqga^\rmt{}|hxkngs|ltz{n}}wxtwkoklf\mfdxox{~}ztznpqoppyw~}wmytji~tn}{y_[{pprm}~|l~irpayriih|~{|z~xlvlohmdaaolawzn~sm{mnrrzpz|wwqwdnw]]Tckcr}x~||}urow{rfzvry~~~x~nt|ggdqd`eiqnv|jlsus|ug|{~~}}}otwydfi`ecSqxfnx~z~{syqxqpvrqp}vv{tlzty{fgxpnncjpkvx}qxqhqd^gytu}}~}uyqzqulnnok[inpiy~p~t|tnsotkxv~~}sxlqkbYepffstvdi{s{}tlxrejmp{zwzuonmom_hci`mnrzyytvhqyzyq|xu{rjuocbY]u`\\ou{y}qzvuoyyny~|||uxv~ftytum_kiafm{q~xynwohdswjoy}}yyy|ryssnvjdjjf`mpnsxyywuzy|}z||xvrjn{ynTl}pos~~xnhn~zlssyuj[iqiz}hfqzcmqzvyy|}{~tq{}~^lptcpusudytys`qrnv{vbswzs}pvlipmdyrznyr~~zwszo{qz}ypwknsxiyok~w|{{utz~rRes{eUgc`jXaWx^Q[hxo}x|trrr}n~qbi{sopwqnqxjpwxnga~vqh{naaho\eYurmrnmw~hxvl}qloznZsoVTdh|{|jiYh]a{}l~dau\V\hV]Visby|sw}xqzudxc`qovy{sztuz|ssemsh}dwogjmchdc{gqxmk|znmvew}rmuvb]wbWdje~rdYZgYt||~Udl`cf_Z_Wyhn{mpw}q{uueofrwnxx|o{vz~~xvgexgwlowkpnldcVyjctkhpyqwthf}yjrxtYwjX`mjuu|zg[[mYg{feo_ge`Y`Sri_xlkvytoy~frdozt|vulxq{tuwvhiwersr|qtmjghVwh\nehmvpuxjf}}qwvv`zi]cniq~u{}|kZ`lYhqjnvhjb`[^StcYjeqw~{sr}~kskmvstuslvpvuvyaesco{}wwznlefZzpXjahmuuwtoc}uyy~u]ujaeonf}zwz}|{~s\[gXcq~{oynuif`aTmpTf_js|}ik}xnsu{j}rpzmuq~z{}~japfhx}}~vqoj_hZcbclry{x|z[}x{}t{udhqbihwdvz}|{{ysy}hWa^Ylsy}wttjld_[{bYdbqr|nx~{xm}orn~wvxz~mwwqtt|swx_gnes~~svpjavvTd^int{zvt]~{}{yuuqvapngjjyez~w{ypnu{bU`\bry}w{sklb_a~`Yaett}j|ytmzpvnwzvy{nxyuxuyxlpu[cjhxvyqidxzVa^jos|{u~s_{|wzvulr`knjlkj{y{y~ielzcS_`gv~x{xmqeab}kWbdsr}oryyvivrxruv}qr~yv}~ryegu|`_ijw~{yvhgoa\aiqozx{x\zxsywykqddliojt}z}}}sg^cufR]bkx|v|{ouicg|tXaftryqm}wuvhssxtyxs|q~zu|m|u`drz``jo|}ztfitc[amqnyz{u^{xpvxxjpeeklqou}yz}xp}b^dtbT`epzzv|rtfdnpZalws{ju}|uvsjsszt~~y||pyy{xyi~kaevr[cjv~~|{pfp~|_]fsnq~y{id|yow|sknbhjrq|s{zjvo\_krYZajruyvnajw~e]guttthv}~tymoqwx}vz|urq{yu}msu`blyb^fox}}wgn{l\drpnz{xn_|{ps|xkqgehnrtrw{|pnu^^dt`W]enzx~ytdix~o]dttq}uhxxuyqnpuxzv}}xosxzu|pnvabjye]clt~zip~q]fuqny|wl`{{~pq}ynsjfhmpsov{{pot_`gt^VZdiux}uen}r^hwrq|}rixxvzrmntwyt}zovv}t~{rluabiyg]_hpx~mqyaevrov~vlaw}}rl||psmfglqrp{t~|xjwb`dtgWX_ik~}zkj{dewtqx|shx}ry{wnmqwwx{}}nz|y~~x{yx}gwgadtq]^apmvlobtupqxqck{zkrurrifgpp|ypyz{vlrm^`js]YYgfzzxhx~wapyrs}ylkwsx{snluv}s}ynyvs|xysir`afvi]]gossqkh{sqswmcqxxixrspieiprvwv||}s}hqf]_kp\Z[kgzwh~~xduyss~wjnvpxzsmkuww~yn{vr~{}tuqgn^`duj^^irvtqoi|srrwkbotxhsssqjeiquyywy~x|oyhlf[]gra\]nkxzlx~~it|styxkk~{{jwztojrw{}}mzyztwu|zltem_]`prcbhxtznzi{urq}ynbktwlhuqrmggqv{{u{u||nskggZ\dsg`_op}x{ov~ot~suvxkjyw|i~wyvqjrx}}nx{xtv~tz~wiqek^]apsgel{v{p}n~usq}ymblqvlgurrnghry~yv{uy{kqhhcY]fsgbbtp{|o}p{{tuyvhm}}wzgwyuojuz~zn}x{oyxvv}nklfh[^dupgetx~yxxvrtqugermycrrtqnelt|t}{wxw{|uingi\[_noeajus~ys~vuws{nhuq~mqxywtknw~quuuq~{r~yvtgmgi^\`ntjflytuvtup~ylco~lwkgutsqghq{|wxz|tv~wwimii_Z]jqgbfsn~txvws}pgrq|sj{yxvllu~~tuuvo{~zr{ztthkij_\_lsjdiupy{uwq~yldo~lxmfuusqfgozzxzyzu~v}vujkkk^[^jpf`eokx~vys|ohsp|sj{zywkks~|vvuwox{yrzyrsihkl`\_jrjdgrm|wxs{|odn{nttbxutsiemwx~{x|~s|}u|~tumikmb\^gpjbcng|yyuzthq|vu}fzzxpiqy{{t|{nuyzsv|rpngine\^eqngdpl{}wxsvgju|j}druvtpdjq{{wztv{}wv~wqrjgoj]]`myxx|wyzqemptltk|pjz||{rt~yllkdkp~xt|}w~|pomenr`UOezgfoi}g]}bMVcueaoVosostogp{|zsu}uyw~~pSFSz{b^T]{lwtfmspkul~po~x{xkgxycbptpucr~t{khnrqowvllm`ffRNXoxuwpv^cnfcfq`XhPenjmniaiuw}xmpzz~{|q_eUFNc~{mjws|{zw||rhvw|szs}}o}hfo{qytylj~sxndjlmjptjcj[ZgXU_r}vrwqdkzwrt{s^o]armpqoeisz}x||nr||~~mlgP\YMXkyrw|{zvy~tkyz|ryuzo|v|hhs~t{x{ql~tzoejjkipsh`kZXi\[fwxnvsfq~wsu{rap_dspstpgkvy~vyznt~|||}xfiaK^ZS`tyzzz|zs{qo||zt{t{u~xytvfkw|xw}os{tzjghiikqpbbkS`j\am~{tnynfy~wxz~lio_orsuumho}vu|vsov~{}|{y~|nblTQdVYh~w{}{|}~s|lwzwz~wu}}yovlem{}~{zozszqfigihori^n^Vob^fvymxucox}~xjtflutwwrhlxuysu|xmpx}z}zzx}~tbn`Nf\V`s|~w}~}skrv{|}yy~|~vpsncfq{|ryszsfigghorj^ocVqe]cqzozwakpz~qwkovvxxrilxswrtzwllqwz|yxx}~scsaRk\T[lv{|ujppv|{|}urrpcbirxyt{ugifggorl_qhVrj^alz{rz|cgkqxzsrwxzzukku~s}znwvznjmqy{wwv{}vdpmPieVXdvw}}z~x~nnpo~}{pxnrf`cizwy|kjhffmrpagtVisb`fssrcisocaiqxttww|zssynu{|yvy|o`qojQWxniinqwxzrp~~|vvwpv~paghohffg}y}vu}{~rslf`gwwzcsquy~twwus}ggf_nupghpw{xwxz}unotmzxuudVWk``qa[[agnprfjz{yxsy}|qeghqwvib__v|qwonvxwuvig^Z^n|ymzx{||fp{tnj_krneekquuqrwwz~}xlfjut|ysg\RR_vzpthegkqstig{wu}yun}{~~qb]gsyzniduuyuouxxqzxge^Z_o~yn~z{zuvdlssektsjgkqvxtpzyy}}zogjwy|x~~{n`YQTczn}ojkntxynh}vtx~|v}um~z{ob^jw~|pievvzvpuyxnxvfc][arzp~~~~trsbovtfluskimrvzso|yx||xnhlyz|xxx{g\VQWi~~s~rnoqw{{lm|vrw{xu}po{}}vj`apx{oii}~v|urywqmzoda[\fwzq~{}xpulbx}{phrvrklptx{nswy|{tkiry{{yqzr`ZSR\qv}tqrv|~wiz~xxyqwyt{yjyy~}ype`grwwoiwx|zsv{{xjuvfc]Z_n|{w}xzxqsr`mykqwunlosv~rmyw{|wnimut|xqwwd]VPUgzzutv|zju}zs}ptwty{irz{|~{shackm~tmyz}|uw}y|itwhe_Y[hu|z||xyysvs_hw~otywpnpswrmzw|}xpjlpm|ypzwf`WPR`q{~zxzyix|xr|nrvt|{hq|{z}}ujbbfd}zr}|wxx~iswjfaZZdpvw|xvwswvaerytvzyspqsvvi~uz}zrlkniz~zqvzjb[QPZhsy}|z{uuqroy}}uqqutqhns}kipl_ioYZh`]\XXanwy}z~xlmlmte_owvfmk]^iq^k|pqvwtomplq|vq|{lyqeb\X^mzqipnhb_Zig[_dgtnamv|~mqz~{toqqrkip{sprg_oiT`f\\YTV`krs{uy}xrut{lp~g_lzorkSgqdhmmifdfaoywz}sin{sumjdbjyzliwsg^idVY]coe[hqw~tkw}zvxvyyf]n}wiulU`cZYVQS^ipq}|wwzruu~psvcfw}`mzjjnnjgfgbo{uxvzqho|o|umkfdkyslp~ugmm][_dpk]isyxnxt~zxxyx|yse_pptw^^g^\ZVV_krtzyzyz~oprytq~{wii{fh}pjmomjhjfmt|zpvqjonxvmlhflytpvyilqa[_dqn`ju{||zpzr~~|yzzyvrpeburtx`_g_][XXalrsz~x|{|y}nnqztswyxkofjrknpnlkkfp|s{vmtpkt}nxsmliho{}~ut{yjoqa\`htlbnw}w{wr~~t|}~|z{x{ooldhsyt_fg__\Y\fnrt}{x}{~{zwlotqyzu{tkv}dxpmpqomlifyur~nmsnm~sswomlhir}|{uwtlum__dqtdgsx~zu~qvr|}{zwsuloifu~ypifjkfinkjkwwrsx|qouyy{}R[skgknmmmjesvnupgonlyv}vttsszxsvnf[ddVT[jsghswz||{umxu`a|u}pbQU}tltgajffgdbgmpouwrmgq||{ugtqacksz}||cmwosvvusmdpwdYcxzyzrz{wrhan{kacn|{xlttdafsvd`efkvtsqyth^]|s_`\V_kky|tl~m]WWWW^bbhir{ywzyzvdlsr}ykyrowybva^]Xeuj`erlakqpxwj~volovzz~||zYVxbRY_dikkr}pap|qkqy}suyowtvpsyw|q\m{eUORVX]cbhkmy{wv|wosjetvzx{z~uyxkv~lYTdcUTai[Yegjwyxxxmuvrtxz}nhd[ixomhggffpta]qsfflt|hn|{|t}v}s{~sohj{{ngeb`ddajimwvst{zjhqkjx~w|uaszvkjuk\[fj[[egmywxwsvr{xtwy{~qaeiep}{vsqnmvwb_tthhnv|enzszu{~qy~mnms~smkhfjhenlnyyvw~~xifqomy|t~q^p~nlxo`]fm_Zejo{yxxpvv~xtvxz~~~p_coov|{wtspntzi]pxmkpv|gg}s~~uwrt~mlt{unkigjkdmqlv|zz{vkcowsy{wxs\lqjwsc^dneZdkq||xyov{~xttwy|}}zo`ctw{||xutros|m^p{qmqv|~~ge}r}}tusr}}mmxuoljimlensnw~||ytjcpyvz{vyo]oqnzsd`gpe\enu|ywov~}wtuwy}z~~uk_gy{~zxvtqw|i`uzpnrw|~|~yckxsyrvptykp}vqommqjgusp{}}|}vqfeuyv~}r~eb{~ou|ncbloa^jr|x}qoy|vuvwz~xyqe`o{{|zxtu}vbj|voptx}~||lcw~s{~ss|vozpju~xtrqtqgrxqw~}{wsjbmwtx}uyn`qvxvhdksh^gqyxxuls~~yvvwyw|uj_hvw~}xw}{fh{xporvz}|}pcqu{trzynwshp~~zwuxtjs{rv}yxulbitptvxobo}{mhovj_hr{uwujp{}y{zxxx{v~xl`frqx}z}ij|ypopty{{}qep~v|urzznvvhlz|{}ymuvv~~xyvocfqnoyv}~tdl~slpxqbfr|wtykkx|ww}|zyy{v}zqcbnpq}qhx|soorvz{|wgk|}}zzxrvqq}}lgt~|~sq}u}yy{wrgalpmvs~}~~jft|rovzlcny~tzqgp|zux}}{zyz~{v{uk`fqpwmo}zspqtxz{~ofp|xury{ntvgiz|rx|x}w}xupdcoqo|~t}|}wggx{rqyyjep}|t|}nfszuy}}{zyzyvwrh_gst|nq}ztrruxzz~~mgpw~try{nstei}ryx}w~wtoebots}~t}{|uggw}sqx{oeo}~u{~peqxz}}{yyz~zt}~uqj`fv{sp|}wtsuxzz|ogmw}uruqo|~wig|tty}wzxsphalxx~u{}{z|~}{~vhgttqv|tgm|vzsfo{z}}zyxy}{r{|sokbewvq{~xutuwyy{~phmw|uqt}qn{|wihtuz}~wzwrphbmz{~v{}zyz{zz}thiw~usx}thov{}qfs{z}|zyxy~xr|yxpnibi{ut||xutuxyy|zmiq~w|sqv~|no||}sfms|{zv}tqnedr||}w~~{xxyzyz~{mgm~{tu|}pjv{wyjg}yz|{zyy|sxw}~rolebp~uy~{wutwxy{rjlyx|wrs{ulwz~wje{xx~~}v{vrpibky{~x{{xwxyyy}}pgiuyw|wksw}|ndtxx{|{zz|uuw{tomf`izyz~}yvuwyz|tkktz}ysszwmuy~wiat{z~}v|xsqiahuy~}y{~{xvwyyz~}oghr|{ynux{lbs}tuy{|||uw}v|tpmf^eu|}|~zwvwyz}tlksz~zttzyntx~xi_o{~}~w|ytrkadrx{~||z}~{xvvxxz~~qhhn~~rty~~pblsrvz{||xt~~vywpnh^_oy~}ywwz{}ynlo|}||~vtw~qoy{{o`e}zy}yx}vsoe`kwzz~{{}|yvuwxy|wkgit{r|}{xhcwyqswz||~tz~yt~|rnld\dt||ywxz{smmr}z{uuzzosw}}wi^lyzw|zusncboy}}z{{|{xuuvwx}}sihkwzs||vfe{zrtwz|}~}s|}vs~ypmkc]fw}yxyz|rmnszzuuzzos}w|~|vi_m||w|ztrndbo|~z|yzzwtstuw{|riikw}t}}|xidx~uuxz||}~rx{vqzzplkf_dw~~}zxxz{~tnor~z~{usv}}ro}vx~~}{wnbi}xy|trphbl|{~~~}xwxvsqrstx{tjjmuuz{ylevyvxz{|}ruz~upxyolkhaew~~~{xxyz}tops~z~{tsu{|rn{~tw|~}}|{wnck}wy{trpicm~{}}~wvwurpqrtxzriknxv|~|xjgzyvxz||}{qwy}|royvmkkgah|}~}zxxy{|qoqu}yxssv|zpp~ysx|}||{ytjcr}v~xsrofes}{~|~{uuvsqpqruzwmilp}~x|}rfm~wvx{|}ur|yvns~{qkkjcap}~}zyz{~uoqrzy~}vsuz}vox}tvz|||{zvmchx{{usqicl~~y{}vsutqpqrtyyohknvz~~uhh{wuwz|}xr|x}xor}|rlkid_i}~sprqpqruz~}tjjhit}yvw|}whwhfmuupy|~}wusnhmuw{|xx}{nnisuplkmrwtnw}wlkuwouzv|wtosxsrrqompwxqpuwwxz|xssqpuvv|z{~|uuqgmxrrofbkx|uou|~zux|wurkaajsy~tpnn{sjffinnhlvxtv{~{sgahpppy|xi`ckr|ysnmrunjmpqrsux|}vomjgkruzqdbhjkwynnv|xpouywssz{vsplc^dow{~vogdiouxsqstplrwutw{}~~}{vmdclqpt~}vi^\eowyttxvnlprssuwz|zsomjhmsv|vh_bhkq~zstz}wprwyvsv|~yuspkc`gry|zsldcjqyytstuqnsvuux{|}|{ytkdelrtyyqf\\gs|yuuyvonqsttuwy{xromihmtz}sf^aipx{uv{}xrrvxvtv{|xtrojcaht|voibbju{vtuvsprvuuxz{{{zwsledlty{und\\gwzvuxxroqstuuvxyxsnliglv~xoe]_jv}vux{ztruxwuuy{xtrokfbhu|slgabky|wuuwvrsuvuwyyyywuqlfelv~xrkc]^j{{wvyytprtuuvvwxwrnljhmx{tlc^amz~xvy|zusuwwuuxywsqnkfdkx~vnidaco}~ywwxwttvvvxyyyxvtpkfgoy{uohb]ao{xwzysqsuuuvvwwtpmkiip{|voha_eq~~zy{|yutvxwuwyxurpmjfgo|~zrlgcags{yyzwuuvvwxyyxwurnigjr{|vqke__gu|z{{xssuvvvvwwurnmkilt}|wqkd`aju~|}~|xuvxwvvxxvsqolhfku~{tnieaclx|{{ywvvvwxxxxwusplhinu|}wrmgb_cmy~}~zutuvwwwwwvspnljjpx}ytmgbaenx~zwwxxwwxxvtrpmjgjqy~{vpkgbbgpz~|ywwwxyyxxwuspliilqw}}xtojd`airz}xvwwxwwwxwtqpmkjnsy}ytoicaciqz|yxyxwwxxwusqokiinty~|wrmidbdks||yyxyyyyxwvtrnkjkosx~zvqlgbaelt}{xxyyxxxxwusqoljlpuz}zvqkfbbfls}|zyyyxxyxvtsqnkilqvz|xsnjfcbgnv|zzyzzyyxwusqnkjlpuz~{wsnjeabhov{yyyyxxxwvtrpnlkmrw|}zwsnidbchnw|{zzyyyywvtrpmkjmsw}~|yuqmiebcipy}{zzzzyyxvuspmkknrw}~{xtplgcacjrz|zzzyyxxwvsqpnlknsy}{xtplgdbdjr{}{{zzyyxwusqomkkotz~|zwsnjgdbdkt}}{zzzzyxwvtrpmllotz~}{yuqmjfcbelu~~{zzzyxxwusqonllou|}{xuqmifccelu~{{{zyyxwusqomllpv|}|ywtplhfdcfmw|{zzzyxvusqomlmpv|}{ywsolheccgnx~|{{zyxwvusqonmmqw~~}{yvsokhecdhox|{{zyxwvtrpomlmqx~~~}|zwtqnjgeddhpz}{{zzywvtsqommnrx~}{ywtqmjgdcdiq{~|{{zyxwvtrponmosy~}|{yvspmifdcejr|}|{zyywvtrpommotz~}|zxusolhfddfks}}||{zywvtrpnmnptz~}{zxurnkheddflu~~}|{zyxwusqpnnnpu{~}|{ywtqnkheddgmu~}|{zxwusqpnmnqv|~}|zxvtqmjgeddhnw}}|{zxwusqpnnorw|~}{zxusolifdcdipx~}|{yxvusqonnorx}~}|zxurolifddeipx~}|{zxvtsqonnpsx}~}|{ywtqnkhfddfjqz~}|{yxvtrponnpty~~}|zxvspmjheddfkrz}|{yxvtrqonnquy~~}|zxvspmjgeddgls{}|{ywvtrponoquz~|{ywuroligeddhmt|~|{ywvtrponorvz~|{ywurolifddehnu}~|{ywutrponprv{~}|zxvtqnkifddeinv~~|{ywusrponpsw{~}|zxuspmjhfddfjpw~|{ywusrpoopsw|~}{yxuspmjhfddfjpw}|zywusqpooqtx}}|{ywuromjgeddfkqx~|zxwusqpooqtx}}|zxvtroligeddglry~|zywusqpooquy~}{zxvsqnkigedeglsz}|zxvusqpopruz~~}{zxvsqnkifedehms{~|zxvtsqpoprvz~|{ywurpmjhfedehnt|}|zxvtrqppprv{~|zxvtromjhfedfinu}}|zxvtsqppqsw{}{zxvtqoljgfeefiov~}|zxvtrqppqsw|}{ywusqnligeeegjpw}{zxvtrqppqtx|}{ywuspnkigeeegkqx}{zxvtrqpprtx}|zxwurpmkhgeeegkqx}{ywutrqpqruy}~|zxvtromjhfeefhlry}{ywutrqpqruy~~|zxvtqoljhfeefhmsz}{ywusrqqqsvz~}{ywusqnljgfeefimt{||x{xs}x}vrnnfb`\[\U\\ZV]^V^bgitzwsustsxmmkh_\[]gtyyootqz|}yxqfa\Yestpjaljor~nmjlkptsx{{}~zvtgYWX^YXKOZ^ZRU\l{dYlyVRPTXafiv~wwkpwpj\`bcemx}wop~sfUTdnk\\huy~r|^Kn~m\R\^adnss}|iq~rut{ukdfpvwpkq~o|ttfM}nz{yooli{ua[k|lmqaYV\GHRAT^aVHAIZasxons~|vz|dz~syxt|d_etrMwkXwq}y|jlnwpwdpiptsf\X^vUyykwwrkxhTonmeHXZbeUTdĘpZl`Boi=A@}sawny|zj~wynnzvbuu[pdTU,EmTjsqo^|lfbcxg\jej@?b^`zxY\ZNTum]ytuy{`eV_cXwiu|xdyjzav~skZs}rлǦplpNM3@G9Nzv[\Qfycj}o?`d\YQ:a^Vkttfzow{qopdsyrldpZ:ee@]ukj~un|{xuovkg_}v[h{jqH,Znx֪z|qyZ_pdiUegKWbdW7QKAUn`qc]Lpwylm~iP`X^IFev|vkszrtseqtDz}}s|eQSL^TD_yʽvf]QnnSbtvb=apZ]]XNqYTcx~{zs~vvp}lu]R\C6_U9JTƳlv~|z|n}~shdv|``c^EFHU|ΰsxua_rihlV^wmxcOVfaMdocr}|swspcrxuwrit~iQefUTR9nr̡|ykjwz|xkkcs__kNE&$]b|yhyhxsiZlyZtc_naZOim^xk\ys\lzieqX~xemagdXBHibwl^kdm~o\}|itwgWGg72AD-^xqèrn}xqyr{xjlyhUlR?A0tbeugf`tc}}}ibtoenlWZhapvyqjl|cm{ng|hxup\yb\vbW(QQM`R{~{zon}SdLBTF6QRJ|bjt~zw`ywo~|nlr\OhDZ`Wltxm~~}rl}w|reieqUHZJSHNGdŵzlwGVTRnLpnjF?mUlgbnq|yv|~msYh6^m<;=kZ~vsoqrmm~ztkVJVRGPYT^ʴ{vo`gs~oJxnfhH`]\_`X[{}tf~Wg`[MnVXqcV3flrm\dfc\n|vx~maf[JR\HUsb֫d{ct{run`L\a[`mfjm{b^naYxpg{Olu_hFR^Xdltsv}pak`zzf[u~wzo\pKC; _N>Foǟ¥ekuxq~vkmr\_me\~qmx^mcqcg`yqb~srjcFHSXWo{aqhqmvbyb|cmFj|K;9V4B^^TJq|zepqKU7O{VSZw|a}gy}|m\krnnwh`g`Qbsoǟzxi{uxv]hu}zsbeYqtTqug?;\KQBAkt{ybcH{ySESgD_uvc]shfs|x}}sjskXf]=G4fuwyuvkx}x{ur|r~XmnnNQ`QPMA1G`wʳ}qjg\yuXw~qMMpdi\YrwyyyqoUS=mlD6HaFgzs{r~ah\khuutnXBIOMMYRWmuuɩġ|q`j{za[sffgaN\q}{t`[T^QhmI]laB;gmvzv~heSxiYgr~~s`gqoovidi\GOOEWl\dlǶzq~{qTV^ebrrskf[j]s]n{^LoneY@X``lwp̝{xluxebtq\b[pljƕqo{n_yxdlWVE8_h\nq{zrj|Zsxl`_b}q{skiltiZUTqrFKL9DWpv~ռu}nre\|phvnzqlqtiTMSY@he'9B>iP]ɱkeYHLpj_~xns~vwu}]wd_o^vpij_YwtTaoKoɔyqkeuyhgnusnpT^pzpmdd{`ThR@O?Pd<;acj~{erkcsqbSJhpiqo{~|onhZc\RgVGDVYWw~urn]tqu|qs_ZejRYYV3Wk/Dpb`wrƮ}odw}lWvDejkuyjpszk}|ahcat]=JK@OHOi|Ųxnbtm]{cpt~{acUSuT\zcP:KPHcilgy̥pjqwm~gnkp{q~}|mrxlRvc=STM`3BUZKFKjؿijskdWoZ[Wp}mxeq{yo~~fS]|nUnZRucZizkzx}pbsn{vMSjqwzudx}i_WVkfEIL507+[]^ï˔wkjuNc]Oy|ttnwcy_yoYPVqSVVSFhdi|xw{~{{z~wqnvplkpn\f|J7OMfYD^^V43?r|¿ε|{fr~WfoQKJqhkn}yme}iXdA]tdVfgRZ_swtu^ot}Ym}vxipzn{mnjkygJOXHCC=aIPulq~Ǔlekk~dWuuvvv^vi_|kQJNfIMILJ\kINqxni}qto\kaxlmmm{|qihcM_fyjC\`aC?;Yvaeȱheva`^|jx{~t{fYerVgLKd_V_veb[b}}r{~]Wlr[[n|wfiyzhukiw}f`\T9;)FQ^g[vxO6elpgn[^si|ytZxKAX^P{Uxxjj~~wUVdOywTBx~i[`Xr`wzybWWvufrīr|{ˠ~hݧ]h"!=3.vmݤǠaiYmsMn[[-BKJ3[YHevQsdZ>PYwq6G|ojhZbhx|nUa5OsUPrZgnm|h}[VJcdIDmyY_Yn[kjcOvivŠw}nbtssʾҏaix+"GX-WiܙzxeUN}Sdj_2?\T=:kC^|`acbOQ".D<{}yhNkftw`n}pcnrz^ez~crqi{[|v}RT:IBKU\3.CTQЭrvs\~p`]IBSF\kpMx|T1ctocxzxpfqv{ehusrj\vk_up\UhTAMX$*>8q̈zpzReer~~bkxpcxe~a`uqƎekqdramtUtk6H@JR_>,;NL|jöҽw_vvf\^CPOMvqZ_m3Ruuiypcfyxqfrzlg\gvf{hlJbWF@rr4$68Qئufm]jm{idryo|pZ}rZjiscnd|k|WtoPH;@ALYV12DPXuϪryaymcjSITHjluMyS7dyypx}znprxkjvvvk\uizZrk\I]L?J}_,);8n|Γz~qbeir~dgutxhZ~g[lhlcl_cmWvsbQ|@==BKZQ06KTdqͦtydwkcqTJSHtjuKzO8f{}xy|stsxmkvvzi]thwVnfZBSD;Hzd2->>v}̓znjfjsfertvj{X~hZjj|p`g]cpPxvieDvG5:=HVX87K\fЬwbtlelbMTMfnwSd^7[{}kq{~virysk_~eoWs{Zd>HB:=lwE1?GeҨwgbmo}sbkun__oyvYcwt{}bcalqgOd^k=d[099FR^E;LchĖżѸhoogiqQRQ[wt`Sk;S{~ns}}}ioyrciuel{YiVc<@@8@Ubqápsp{h_boxuLsISx{prozzfrpbfpwOnyQe@656FjzZ@DPr{ʩnvwwxbbmnx]^f~lT]mb~uqpseabtfRfCVs~aVa0\[9:=LX^J>H]mҳxtquedfsaWcGamorzuve~q_gs{s]vlP5$1SvhV{iOMgsnvi5ZGnV8K+BcuwZINii~qgkSnjwju^Ko}pṵµ}~Y$LCjL5R/Dd}|`T]fq}o~iwVozZKiwTq]Gg}ǓGd[~\MqM\xg\]adzx{\ihL*Wsh~Y{gNjӬ~Lb]~_T]ktiimmx|pH>m}Ua^s6WP2Hf|vw|tƟ|{Zcd{eUjj|_SPXTvT[]M!Nyf}aXf~̤}yqsrZVRG>vnxtNZe2UhzlyS`uĢɹyp`i|zLWd^7Yp`pk9EXueijgQYoicmshpy`i{qppvaUngtyIAQgi}ZivgAbg|dxQb{uĚȶg\p{{kQbnWh۫hreLCeVJPahXZ|~jmne^coT_dblcCMeS[}pa~^{cqsA=tgsztowawy~c|ox{ʼa`n[Q)GkdsȽw~jZuUGmg1UTIbRsUkzdb,{~XzquQYcg{rp|xsxnaaeIOR[lơgoZepslo{uh͖ƝtMM>1^<7ȥ͏wuamgSr\Qg[dupoe~iWKPtbBgjqnlqWbd;eed|uqyYefYGbkxxholu}}nvmljyɥǧqqaQBKMEnf^p~Z[qb=ipIUHU}mnimnK`kajnzp|\_TdnktrhqIPp>Nwil_yujl~}vsxts]G4ORCPoȢkt^danaKdwef\v{iUJea[[LwfL}myn:Pe_f^popnjQWsBcwmw{rdo|sim`dtūkm\EE_I;TtknuMTZCXFZsen|qd>eO\z][zuZdYY||z|wJ_dTIT][uuo}~yvz”{tvYUdJEnYZ^ğ~w|eouU]ondWyona`jURj^SLbggmoJomIYVio}jQdjXNS{pw~x}}~{zemzYdzy|kNcOT@9mhiȫrqT}\GDcy`\yGPzqo\WU]or~zbLbntrg}r|mjpVLeA*zv]fqyolu{n`NgrgK3WŦsc|j_qbuhogt]RaarBDlO@imd|MLDeqiyijtZm[J\U`~p~msvqojtytwcXPW\;Jae˫qik[R{x_jjQqwm{m>JqH`tg]h^peyywmTSYHQbYJLylwt{}zeQC740Hg\(Omdwkg|k{scko`^yhC_s|z3iďC?[g{{w{vnfRxuvvnVWih||cP[w~n`Ukb@qkxƽ+k]=EI]eclz|pYyxXpɶoqwoty`ktdodLZp].ysvkplivxXun^kavoVXYsjq{_qxmrűweL&rXTFDTcjc>OULmRNai\EHBfmr{~\msiay\wsm_X^Aoo}acm_tchuueRXKqzĞ|h_M@SB~`Zb`\_A6nJ6FIOYPwsD7A-Klm{{\j{}mlyoicg_NbQ{z|r[y]lw|ti\jUhƱĨ}YTVWC]V|pwg]\Z7d\6DY]cN_tC7E66hqz{c_xi~uj}]_emTc`y{ytr|`_i}ocpj[ǟ}QOTaP]eʵnyg\U_?Uk=A`hkXN|F7EE2ax{||mWyerzkYZao^fi«zy}wrbygjun_mn]ʠxKJP_Ucmͷnzj`WdATmBEdmmXIzC5CF5_{~}nYydp{k|{SV^mbkoī{zytdxinql^lo_ȡpFFL\Vkrжp{oe^j@ZmBKemkTJt>2BB7d|~i[wcv{m~y|sOU\i`spŧ{|{^iuwwb\njcëÿxbAFNZWqrͱvsifm?jeETnqjLSd74E>=j}~cep`}usz{vxeMU]ebvq|_j|m\]m`nɳx{tzP@FPU^rwí}wit^GyTK[pj_AlM18C4Ms}{Z}ij|jvswz~TPW`Ϯ|x{|iuwuphqrtxaX\pi|oJBfSaZvg^_lnS-*D3>:3R[UXi^ewtVUvfsENxx-:O`_iV{vz{jjufp`^xp^cA@UdejiccTgw}jT=pM>GNEavx{ɞeMNL_?55CH.@Ucal[l}rq|zy|higeqpri~μ~lgX_^p_K`ovr{h{uutazotym`UB1_ʯnIFU;=5CI_F@Vbca_L{xWNOaytzyyjsuym~|mlxսntpdݺpchj5+CKZk{}{y>=djoUV@JdmuZ`k}ž_.EV1:AFaryWpt|:pqxhetxyqc[Z[ixa?N`ydfW{TWkwyrcS2XontzNPw~kîȤ[X2(SeaCB(BON4Ep}yvg#WaC_vNj~kirbhlé{WMdp`hQILcqnqkv|{mn}[rĦ|omudCNZouCKZIu[|u^butypQSgfai\gjbvrXjzdokeuRS6Ajo~VrykvaròzKgsx\/DHWhܰiEoxF8"lp`jsvwODu\N^yhYqm|}sW]uaKhy]J8J|ze|pgoZslsp[r|m}rpmboӿv[G@AJkΝbioRWYZtu\dn\MYR\aYgO9ERYqaT`ybdt}~u}mkuuYmzTgs|z|jZqyLTyi~ufea>Ou`ٯyU;k{RXj~^jS~sjzu}c4=_KRyqZcI|lpgPQxsidacCYKdg[so{fbxtX}w}clԴwlXSy\_CFVlêydk_cS^VZGSbeeF7U{yf^aRQO^tbzmcl{r^Zuh}pYbpfwYYOd}M{nort{zpS"(ڦ{plmr}pLDggYgZcQXrA`_AJedpk]Z^^y_Y~qlNq{Y6Bik]vzvsxwkY|ou}~rxxfWVQAADnIWyi`Y^VWsoYbrkkwa;=]{}{V_Qnx{}zbiDKmo~pwqvzKpjh~Zq|yvpyƤzk\O|F4Rmp~lthh{WohQO[p}wXei^UDDg9Hxko~oV?mhQjwb`qhVU]SPűy{\yuyw\[}rzhG'@XTZSlthRRukbdrlTcEm_Vlfs||f`e}{t{Srngx}yicsfOax}qiwjSviby|wgq{wsvymquO6<_s~qz{xdftvvmaTWqoxkvxq\Qfl^UZeuzhd{uyeNVm~ptZh}~|~{Nr{d^h^G8=]iC7P\an`goveW]>ZeamutzzxtuxqerzutzrXU\d_Vl\xunt[jvpqiymgsbctyzt\USVUOOUAH{rxwckjgWO`pvoYW^aizxblwccwxvwlfjH[qhkl{^x||vvrwyyfhcY`ZTRc}a\MLon\inlʽwr|jpywm[bvVtjzvyrevtvu`ryY[e]M7>un`izwvTj~nwsx{vXowri`[diWD7Cftv~wxphu~xpYor~o`o~z|cyvvyw}|i[[^]JOmzYlvxovt]Hbspwplsvd[mzhdegK?KJup~~tt~wTIeokt{kp}xxbl}}eSkyg`ZUQk|`b@9pf|olcj|yjscncMteOX=94.=GWnr{g]{dY||y|{xp|zimjqpggca`f^S\dizp`tpmf`nrk^|}s|jqao_[ZTZa[J6;^jgt{tkwxVGZfUPiof_\_rlQ{nXYu}q`dxltiqz}}}|tosn{f}umaUV[`x}aM@=R_\^fzztvxhowv|wvuywlYdxuorsUNoYMTPAFk|vs{|v{}ic^WTa{tub^obk}jjx^[^\\VUegesxa{\lweekmq{zkabmxt`v``xthVB7HX_vȭ_ji_cy~~gavo\aid`X_x~kXHC96`~zm|uqqfoxu{qeyzdavsdXU[WVYP;AaeypxylYUqrpqp~|pntohnoiiiiO^zWOmtvwypjtwcQQj}yxtkhotw~f_`>VpZOIGa}~qOTvonrkebo~wqbPT|y{rVm|{|wkQ:Y}~wcl~j~yqqxvzuYgsgtdRKEA7@]meK;Qei}et]d}~~ytzwsytrbm~|ufXZcbcZQWsy~rep~g}jbjrv~ge|hX[lrnfSLNJKPWU2O{}tsqiacnnkpgdkernOX|sZfZGjf\s{~rqrtkgyyemg_]Y`dIMTR`xfSY<@]ig_kxlkĹȤzrvxssp]ixxoto_ZrwpnXJGJEKZjsmpz}twy}]\wy|ohlim|iBd{delfcgc^TJLIPo}vl~|{kugdj\]tr}oe_Xdzy}vz|ubWSjtudkuwssnndgs}âwdlz{mbxpaiz{q_XC=Nhxt[1@jkeigyzpPctB(.>[civnĢjfbE?`lmqdd[]bha\a~q}qokYQc{emq`t{f^Lv~wmxorvlͪ^BFhnjH.6D;-7GIe~zemwu{]f|aW^zn{tbsy~tbZiʼnY[fjmo{uqmww~s{jecOa}dXd{}þɽôgRLcntlNCodAH^c[8Jsxji[r^Kjlh~{bmmrgZ]uv˽vlp|`W[k~||cūyaţtwlmb;3pmpħsvpjpkXdaJUhmXH@{[^Svksp_kewhu|~u|osfX`Dphcur~u~~|S{soYU~hxzwuqANq?KUey{{Vg^hOBBH_||ZXQU\basEc|h}hKw{cbt}mRnsrZ`gvkS^Ųlwo}}rz~mjt~{K":leMGp|un^D^uTN\m{LT@ktK^gx}~qbg|oz_~pxge`tlI\d_bnzjeU}^kz{p[zsΦ}}xof`a]K\K_|{uuuqDLzZp_qzl`K1^hQ\w}\izowprvaWtm_m^]_Gd_y_Olffngmy~}eךtocUYqsvrKazRL\nϹqwvuX4+-KTV[RR\bt|aGklxydmlp~hYwowlQ;hkX^h{ID_|ó͕cpmY^YThry}zr`nf^Ωwt~qQgyfM3Fb5Dhrʹٸ̰vVbaZW`ʽuqlgfYOI_}nbruiqy~|rfu]QofMXfirJcmFK;h}åzks|~tO[`eykxkfXXScSV}\<:]blRL~ۥl~}}cZzOJV~iimgqhiL\wh7%(Azrbiu~n_rghQZyz]rwqwhVq`_d_zjRCC6<`ʫzktuyqmWAbl\mv}xn|rTph[ew~hOogCHNgu}lsp^~K>Mf~sp`mDBrTLX[H-e]\JVĶެkwq{dbro]u{qz\WXqqdhhabksPKdOO>rzjo̦sxfrviX~gosyegx~_b[PEB3'4Qq|pϱ{rZr}hdigRVyv^|led`pihQsvhpVWPT`h`Zwijv{nw{Kttog||vnI{jWLnQ[vwR+nuTLSeȡ¾~ylUmgNT\p~oomQm{yW;d|G3G`[;Wvlǟwop|~dnkav{tv~p|~WOKTgnZS_cc`TFJ(UeZU[ϻlssjL_wdqw{~|mnul^anpvR7kM\^OO`zo}juq_yYPk}|]e}Vr~XOKYrTcKi](7ARVZe~{ȵȤrputprvSps}opXmanxc@`ucbOfUWgdGDr~ɱxlupjM|smpuyDrlZOCklre9(PXD3Cdnc^ּɤ{lquwb[`iryv|gjjhVOL_irgefTNakzeM}ƶhw{^Vzpzajt`z{fb`c[UT]PJRipbE5P:T~a{ry{l]8fcbvhq|ZIxkURU{xYR-pgOgp|kugccn~diju~]~kdfGHVS8/W[^MJeJGTnp_{Ĵ³ĭʎ}y~}xnmjry}{~NHy[fPb|sX6%Ug`~ͪl\|qt|ZlTl|xwmiEjfKQD>i[zk\f{UNŷg]ds{r{EHYktzto|}kiLyf^`vf{}uy^M]o_MZPve`|[Ɏ{ޠwrߨz|npj_rB|olbskyxf]]XpW$oGE1)muxo?@y>@_w~FPlStoXHQ`}hIŶ[OLQhNP~|}ve}rKx{qe`Sbktwurl>yibIuGXrdhğ֡pso峋}yx˕rjw~VJqoxri`i}rkhbU_w.Ph@NR~y|}\+#eZ9Kmg5m{LaPKSf~LWȜjXUQ_uo[dd|woqgpXslh]YUxe{wxqp^U`xN]^GzmmcŐvΒt~rܨqu|{f{f]Cthiat{znhg]qi(l[GI!]xxuL 1yR=SmxT;xvjObKOYpvMeȚmZWYxq~iccmvvjnafgqk`XWZ~m}uvouR\byLaYDmlcsȓ~py٭rvvyboe[Frcb`ypjg]tk*jcJU"PwzsO$0u]@Ki{rT;{mtHfONXq|Xạv_\[wvxuZuczroga}vXm`SUWt~rtppaLgybLbEq|ik}őʝs|~淐vxtzz^cmSSqca`vqff_po-cpIb,CryuT).rfFIfrpW;hyDjSQ\qaa̫d`c}yv|Vdynmcvbzv[p_QW_zvtrx\Ph|fK`Gx{hh{ŞwณqwlwrY[|eYRo_`etiidzk/siQb)Jt~mM'9~bEOhu|gNDsnjIfTV`}}_lȢ|eemklcvmtvg_xv]bpykZUWmy~ttrHrdWUtQRrlzfk{ӭƔfsujaR_pRpnY|kbevqljrHKRjP-_wv]7+axSC[iumY?p`}Jhu`V^mi\úvjnoUg~{lo[gaozTtcUYeztt|_Tl}rGpz\M|{h{|gw~}ܼȧjvxgxgOQrpUdxMrfiuvvz]Dbde/Op}v_@,T\ETeokWCdayWT~i[_llX|tvlYky|msY\}z^k{O|}h\]hyyfUr{zGhxZKy{gwzfvz}vڿɦguugxfMPn~{hOcnJtjm}~}\Wbph4Uq{r[<3a~YFVckdSDt^|QYk`co~aT}~sXkwwlpX]zt[mtMyk_bq~}f^t~}IcsXNyzfssexrp¨̧ky~tethKJh{zhO]qFvtjm{oUsmvWtVR^ecVLaphtAlzlfm|rW^v\o}|npcNXq~r^Vx_Yv~ngnb{r{M`zygSZyhq{~vjjxof|műě}i{|qzj`lzgH?QenjZK\rIypww_maF]opbMBX{[S\baVMavcyC^~qkp~y^^zYpv{ml~hNPeuyo^TtkPtwlrll}~WUn}xiWW{kmuzuify}VoǴwrflxxi]dtiJ;I_jj^NWxQkt{ycopJXlodRFXcW]ccXP`|_zGStmseb|Zutxkk{hML_nsj[VvkQr|rxkr~[VlxtfVZ~lltwqgisxRoŴtkfis}{rdZdrfH:GZecWL^vNurhtkM]mnbPJbaY_daWQlofuA^}spw{chs\qvshm}{`JN_lmaT\{[_wz|veuV[lsl^Vgykmrridvp`]unǽ}~Woisxsh[[joX>;K[aYMNpfPu¯s\TdmhZMV{r^]bd\T]\x[Brzrtl_zyay}q|xjhulOHVeleWSpnMmx}qxeUdombV_nkprkemnsO{yj~vckzgovsi\Xeo`E9DR[VLJhlJo~}nV`ki^QVu}d^ac]V]`ti?f}uu}m]pwinpxwjgs~pSGP_f`TQmoKj}vykVbmlaW^njmojclmsNwsdywblzhmrpgZXen_D9BOVQGIhfGlp[dmj_U^~}gbde^Xf_yeBjww~|f[q}gtrw~|tihu~nTHP\a[PRojIhyqYaji`W`oilmhcnkuLoo`qvgghkrog[WcnbG9?LSOFFcgEviaenmcY^{neefa\fetsE^~yw|}jZgyuiuv}}vkgr~u[JLV]ZPOgpJniwz`^fhbZ]wvjjkhciurRZ~s_dq|Xnglnh]V^kjR<:CLMFBUmMWsppcjni_\ozjfge__x}bYHp}wyu`\x|csx}ypgjx}jQHNX[RKWr^Mgzw^agf^Zfqijjecsg~tJe~~j\lsi_heihaXValdL::CJHBFaiEilwoekmg_byykhhe`erhRLs~z}r_`}w`~quxtkejx{gOFLTVOKZtZQ|hxv^`fd]Zhohhhcbtc}qGa~~~}i\k{qg\faee^US_jcK:8@GFAGbkHiovvgjlgacy~mhge`fvdZGk~xeazxbypptqjcgtzkSFHOSNKXscLh~{c]cc^Ycshfea_meozJRw~o_eipQh^ab\TQZhfQ<7>FGCF_pN^xqjjlicdwphgd`ezaaFg}idyxdtpmpngbfszkUFHL^nsqdlwsmnzsxv~sba`[Xd~l`^^\^qeu}Q^pytaxqvt~r[NJSdc[jlE[_Wpvqpyxu\U;;@CMjzkhjjit{qaTyzrn\xz~}~lREKeywwvMH}nWpmqj`^\XZmpiijjulmcm{]oWhurvvspw{`MIR_gjugL{Zg}||hwnspg]RO]zlcaa`f}gzPa{}Y=6@Wl}Yw~PSgiegp{}pactsXjtjmb`]WUa|oda``e|j~PVrzsmov|zzwxrh|~{s_Y_iqxg|zxU\pc{ofh{z`PJHFJ_{Qbj>Acqpmnpne`mwxtg{}~{wy{`IAFS`nflh~xxr|{{yrp{}ywvzvSSntlfeikkqǾmm^Tmbcdbafs{qZHADJPZpsRxcbzuuz^opd|x{woiqqd_^^fjW_tr¬w[C9P{}qeWhVngiwoeup{z~\odaDOeDAP`Zl_k[:T1;ERIHWJMpKfQag`z_OERmhfPmI^TQeL|jxpxdz`ovhwsy{xkwc[jk|iTzrz\Zurbq_cngfy|emyxeur}~YLSFNVvwuklUT:SpQFSTZRm[bhJk~jSci_ya]DeVAKbVX]xsyeixPlbableum}kpxukj|INJXQ~xc_hgqVz{uuu}lftt}SZ/Dk<1Xȸ_tZkic?W[LK]bQamVHkUJPuRDZ@ZyU:?m_5q|k~i~ntShxu^|up{wv}{yjfsp2@|o~nt|ku~tjomirn~ngbrt~zswyr«ël\z\JSQHN԰yhvyEaSCkfI/StFYrgDyvmjKrohYpQKVUIHpf`yxw`~^i]lhh[gvgxpiof`NN^[cqwb^`vniy\t{u|zg|sz}Ǘu[`wD,H8csrlɮv~[iq[caeOWdkI`ibXxaPeeTQlOH@LpH26d\Fl{~~q|cgkWvO;j`p{sLvvesYKs^CNY@G\eamotwdn[~fYYqg{}{qwsjhnC\DWTluuv_n}zpyo|wwv~lΎ~~w~b]cf1KK.9SO}zxūѫv~]uqh_YsX[qk\_kMXxYYdgSLJ_aCGRqil}ftst|~uvgUsEI`^@C`i}Ysdv{zhpcqruiwjoc~p|z|z{vsjeROu``]?SUZc}Ǹmz~dRXjbPqvfrN_xr`ebLcTCOJ]ixtmuyqTqfxr{hmoawvqZ[i_NfPDer`iref}ovkuptw`q|azwwuot{zoqxaMLOH[VM.`mOCVzw|woth}~htyrsjZegT8Z\W>byobksr{sxm_e{aaspq`zxu}p|^vuryVNU`[H@RqV_ģ|sdikiOevUgniY{r|_e{WIbj^dvlprjrl_n`xs~j~xzvnta\_fWBEI7`ag{lvknp}ww|vy|tptty~~rdkn]o}VUXPAMFG3dhakt~ykzglqdoyqgrmhyRSmZV3;Nkfik~vvwyoyx{~tracsxWRC^~YKW`V`|éruq{uvffbYk}h]|s[bj{x`x^V[we`lsrWlxW0GlpjfNya[v{fwglowfI``THVk\ap^w{vxqqn\Xuagynuut^`odeMQBR\Dfptlw}h~pquwxduxwks~nu{ygsktqiriFkM\UG@3AUSgksl}ʣ÷qpvrpzqm]elsvuvXlm`^kRUTXnuu{x||xygvvh{VZjSJIJP\L:b{nwwmyyg~shwmtnv|rswUylmj~igNZvgUfrWB9IbH4R_|qy}ļo|}br}tr]pm\ihmQLjVa}}ih|{bytiw{{~n_|vT_uww_W^db_dZFChn}wm~~~bmwpg_atp|kjy~{~zrvfct_gtmwhoQ[j^YeBL^aQTMO[xyϲ}nnxlkisdr{[RWA^u[dE_{{rp|ungzst~g_cc{qdHVe|`yptl~xzjunkypto}wcUbv{|dykr]m]UhV^WVX^WE\fBS/HaVUcpwkdtmnQ[kfgzgxwswz~tdw{|f^MisMUXbi\_LZQYmsthnwy{tt{eyqn[wjn~waU`cnxvtrk_fmRPapmZ\VcfceZC5KMLdJNm]fmjmxͧyuli~y||cpq|d_pQrwm{vky|g|yyf{qzvwqqmi}rmwv~}ihmc|_pmnzxypm~YZj\ufsu~vqgfz`wu`IM`XRj]T@F@]_?APHZTN\WUwҠvvqpdvw|{a~c~rx{~ygjk~~ibmvnPffcpjihpuqzznxxq{||}°dGNnmg=-F7@JKGOuyzxy{~vfszOYmNXV[ZPecvvcjpjjyG^ZE]r|~©tsgz̸|djMLM@TGO`i]PZJ[{RjbNQJOFXswyrruynsxinghmu_r^Njlsjgumrx`[;J;:8<]klUB`E4@Whmw_n{~zf~iyufik|vto{edHPdV^giƸyy{pr}ttwhkn`Y^pif\OYQ[Q??RoPUW4_ZQSORdrj~x~gidlyjur~mTZE@QO_znrrte[VT`xbese~}w~ͫűm]YWRBi~°drcaThtlzo~_[mQTWbdR`ksik[[rf|xe^bfqqoaOS]mokƬv|s}u~xq{gX[GaXWrpxqUF;CFFV?CCIGRdBN\GI65ZowztgmiZivvs[esutv|x}ǽxte8MD42AZslo`^womg`iiOfnYjbUYcsujleo^WdggmkzmsldkZM[iT^jns}np^q_jljsou[m}o~}z~|oxjkξg}vwvdYa_`g^^R\WNMBI}}wzvykm{stbnkec[Xiz}qaTc}yn~|ua^V.IQ?J@P¿xq\S`tpe`IbwkXgSEWU>RNIk|{mWW[`od]NSlquihyY^mJLajdkuɱ}ulptOX]ZUVnҾwpqao_LPGBWWOVL@Qj`^aowxmgloy|tt}v`fW^MOewsyzsqs}kz}hvo{sryu{qhobh]\C7==HTL}wzxmmeS\[Zdmhy~t|q[y~{piovYzxUjcj~Ź||~s~u{ZypyeNcN=RTR{vkaYW^TK_PWiIPhVXbm^cacxokmryeyqs~wkm[a{LUS:??HI]rvjn||~}vx|odYG7>D8?lv{{uhjqhrz~fsjsod;Iwv_YvP`r[Weznkwb`fOcYf|r]fkw}dh{l{ύwtoz|tzrobz~tz|}xaaurwsnmgkS::cpjPZkgvrof}wwwifunpNdteiv~}wpqwˡwGMuġsYXT]tujgir}h~qj~jZ_D;Gc]m|lkeapu~t{{VOFF<[bQ_CY|[bdhcndORYjtŮ}bTVkӼhoMC[TFNVPsra_\d^MQ5BC>P]j{w{epqtaag?C53Yfeu|Zoh^Y[hl}qxlzwn{^C?YTX{ʲvoafkmtrSTKET78=-57H=Jzquruz}{sez|zajXQTKSOWwd|wVm{}y{xhnmffg|ũó_d^VUYlڬnYJ^pahZOYknO]T/>02:9Jo}|zxozpWaC6UD=HMnpmo_U\p}xqnnt|gg{ɼl}\AGJEIcntspWbibPDBFgOCY8:JSQObowy{}xm~_bnJBFA::Qr|}yzq|hmlo~uuvdlzȦɤgZJP;Bb̸ukkoq_C]`VKDQ2)/2LBBg~lort||rsu~tUPMII:Fulkmz}~yfafceil|˸o~TVTJP]o̮zobfr]fm``e^GZM#DL8(4==LEI~z}s~xnfvq_s\JW[VZ^c|kllqkbpqlfl|ų}fir<@ZWZbu˷ö}f[Yty_a[YhiT_\;8I<:GQisrzkX^D/4QTKf{|~mkfm|y~utmv~xjhUS6.6DS_ûbwqejdXLJMKPSE>@JYfl{vömaePGK5NSQajmr|uzmTX]^M[o]prs}pykdkyyxs~rj|xnqwqkmqqlbJ[wULi`V`inwwBC\fjmqraqzx{k~wuwy~}\kxU`psv|yvǢlarpruvdUp}eitwxtkjmwbww}{]HlrwjfhaKUUPT?LSGSbylkv{tqlnnh_Vjzomk{}|sVB^~Ǖ{vzzhhxn[`lopovvvbdILuưsdbRQ]gQN];?MFPQP[lrmo\l}{~ll~idrr\fmYt|obf|hq|nqeu{mrertaQU{Ĺdzv^PJV_=JPJUD@ACO[\VdnZkuixpn^lnYZrqkrptvpagq[z}{y}ks}|gryzí|sx~|qppW[cSRdbq˴znj__eSKOV^c``f_bfMUaObwsqubuxmnjbZXV[cN^nmzwxn[kudrljy~lWUND;8J_fvrXP`M=>BFZYK`jfdkxrxzwqmmp}Vszw{|zucTnnPEPdYfe{}[]fghlr|tzy||ztrmfV;D_TZbioV@JgYILSXTNG`ajq{zocWjj_fsg]qtqgZThrZ}}pvzwzqxxopéxuytgZTd_FHEOoxƻóyxxg^oVL`fga\^d^Oad^jbq{}}~}fth\YNGKMDA95Vwy\yupslqoraUkcT\ba^pwĈ~{yq~dy{glwyvvY>fw^cncqvrv~xwy}e8Wyqhb\TdfSVowr{rxl4Xͩ{utwz{pnO\|eZXUI7]wwd|iacsfWWWWVQOhjIxq|q^Q56xdWaXJjqkptxzws|xaxpdtpqtr}̼uv{hlnmg]V\PKrį̻uHEYEbv_P>)/9CB@Yd_WV_SX~q_qrNZzna]YRG:-8Uiµ|{ŶzcS]dxƦ|kOBC1+,((;UO^xx|vvvs`\UH85A@U}zzytqtwvohsxzr~kphV\ks©}sh_`ZROPNPRCe~ePXLKRZ~rg]u|ȭ{lc^Q:#!8CGx{cilL=PM=AEGL<;e|zmewqoo`[luavpluy|omdN3-0:mºrkfgePMgS:8?@&(Z~bSejPDcgfu]nnwtqgc]Oʲ~gZjiYX`hQD`z{_vxkcmnUT{ufohZVR]tpn½vol_L;6?3*Fk}of^]`\KVZ=Hg{{snhUQgikd[ntkfoygkĮztpsxwx|uzn]`N6>?.?`}y}}ww}~{cl}zm[jp[UVPEFOFLVVoƿnwyeemqpuhVkob\\RCZvfandWjwy|ib~ldtwcXYVL?76@>+Gyʿ{flwfnl{wj[SR\RD`̶mXQMKIEMfY9ZtvcrzaRPWaQHfdrkaxt\RQ]U;A]j]fҸ}b][XSLLSA3KlwnrsmkiaN=UdDJrqzom­zqg_UH;5CVQ[Ǯ~pWUeXGNP9=Yktslgkp^g~|unlxum~Ǽ|uhd^]l{nry~yqZOF;11=;>b͹}uooolcZ^n}|tc\qqcoo\_gcgsnsŶ|ngc\YY[^e]]½|gJKOFML\jrtkfffin`XythZ]rgSPPK>9I]Z[~ö~w~opsy}mk{updRFEV[IkyjrkVNVe[Tgy~nw}`~p\[ZO@79LQMk~{|yhgcro^vwY`i^OISkqwοŨ{g]VSRMMcp[jzpq\MXT9/FDf°}q^]no_JSq~{sb^bcond\\esmjƯrligfi|oa|~WMYL1'*8?5BhȺgYo[hveTR^`H@XnkaxľvkjigefoiVc~{mgaWD4IdPIk}nx~{vzpez~~ZYndQIFB:57LaVT{ijw|syyef~lp|ld_XPKQ^[Ub|vlcessclqgvtyzxhWRLFDMTIMh}vnjlu~n[`nb__KBKOSagauǼ}sjfcbfaTg}~y|pl_JKWSSMH^xuoiyrZNJC74CQKDZ˺xr_ZZ_`LAXozqkzwwridhsjRiyrzoj|uwwcfOJG=1,3B@:YƵwfmtRYuye\ymU^ibYWbogax{kc^^^]f}z]jv[S_V>8FRILjǷ|~r_et_`rjWONTZLB\pgoļ~mikjhmo^[sx}{h_XQH>5AWRUqnn~v|uu|l^WQIB@FU]fržser}spj[g{ustoie_YQKLWffhô{qhcfsxndf}xr}n[a[H;68COJMiqnwa]mgRQYI3:K\jhsϺvogb^\ag[X|x|skh^H?UieXc~r|~zxyzvhOTeW@73/'&9]gXrϽ}~wgeoq`ayu\umfe`XV_rtcprhhtwfg|tXgiI=:4-.;QWZwĻǾ|wre\nwbdzytkYSjyr[MX^[^nǼvldbbahw}z}rpycP=9DA9H[]j~|||}zyl[`ocRJFCISPYpy{fXWY[df[c|ywp|rc^YSNQXak{flyyrkrznXNJE=9>N`dx·ueatygby}teYix]JPRKCCNdss˿zld^[]l|cr{sZbhTCCPdhex}zyx}~dp{nXM]`K>BMB/:\vyȮ|ohda_end]ursla]YK;?csad~olx}}wY`lZG>:4/1Cewmyzlw{lfok_kv`rvida[X\l|xtzlc`jvlgwyxyaY`bW@2,((2GSSfy{}{i]lunk^LMV\hxyzsia^]_dlinqqxdXK84DKOVUd~}twubWem[LGD?@Paa^kõmghnth\loco|f[WSKHP]\Piqk{yyodlUOME>=HVUSqzse]ojQ^v|viUYxxSDOTNKRdpls˯{tqnqs`}|bQ[aOBHXYP]x~~~hbz~t_UcePA=BH>1D`bc|Ƿwmjigkn_Ug|sojcYQ]smfxolzuv}hfjYH@:4.0:MZ_fyĹ}t}xk\g{|wxuplgb[W[gnedp{|ofaco{wlemyyzgaaQ@76>LPIUrϾývdwnbpxici_IGVfrngyyoidbbfkaUlsn~}hYSH3+@TRBC^z|lpwbWSNFFWojR_¹uysffmkXUj|lWnuaYVQKKVc\J[quuzs_wsVJGA;=UB Y}[kyerqt`szzbYRixtxw~ex~Ytphmfgp}vsģspxnw]j_lv|˻ɓvggH[jRa{kq^?orq]DGcWfxwze}~fWtyfmhimOq~^PZB@zqbxw{Rf}aqtp{¦ndj_df<5`cn|ӫ}wpPOG4IQHB@dchTO\OPVUm[tncsT/o]_Xh{ogreOléyk^ingrmowlkus}vu`C)=LFQ\ka|aRg_8_uLVP;Y]Tyv`|bh_dhWh}w|lvXQndUl}wYaXWUzvauhvlqɧ{iqWK^_Byt|QFyp^mjR]ualRMUEQ_Zkc{mztpor[Pq\Obb;`]M:9jm]лʡhvqy}my{}||xtw\3]WES]]|uiDXOA?:VPDcw`PxkaptYuezxsnc{sf[S``HWp{~q_~kapvX~eVafzɬysxngY\Nhspʭgk[HG<\aIbyqK4is]kzzuzqwyanXbjXcYpxh}q_FgWHXrew`ixvǽÞokphbzQ;B6WoiɑjSpYLUUaNMkd`DA^HNBWoesf}~h_\aVnu{suPdvu{outbmwsu}|sr}lk~wyLFP3@@YdnںŬ|erqwUWlZ\rmBc}VOFR}~wdZ}`gbn[lnsklkZkuvhogWdgutwy}~tp}ʮfzmlcmtnsJ?ZgfZnjllglci\Dh[;HH_wiwmw[{}iko_jvwdXGHkrHnsӬvfgmoalghrztx̥{v]xh[P:EMc^GƯopdyc_`gmd~~r[?crthz||ocxxe\e_ng`ke[yw^W\rm[|IJy~kq}j}m]lwqr͵y~WZZu88IL]VyĩpciqIBC\cYq~mGgmgzy}oskYgvoI`nrYfwjRJMXNXjо|ykneqzlq{wi~orxMLL=CJj̫|{^d[]cO[aBE?IVevw~seksoekTijcgBX_e`Lussp{i|hyr~vmy[QYSfvoXTdUdl{tatcnUMuylRSGhXRgSxxsxyjfmfcM{rqiXOGX_\qkũfibfxlhrҺ\|ZX[ZwYV0 @AZoĥuxZabl`md\quc@6uvj{e_fhhvxsprb^hsC<8b~h}mxv\mtxyqŖjhqj^=Xy{c(.Kd~w~og`mwWRFTnNI^q`p~^t^r[OWMYkuwrfNMKamĜ~kfmltcv|yfjVwvaY`n]CJ=D:X̨{kytx{^h\h^gf>JHX}}|q|]bkknajPWQBK_Nbyvuy{p|{vrqqrp{Ěwrc{tVdhc]O<,ENaa̼zwi`RfmpxgIbvozrlvkhjtXcmh^ra8C@Ohbjųysuzjkv|x|veU_kZv|tSWycRO>ZbYsow{cfhecAB_y^qu|lkubfei`crjkdZEVe^XƗ|ixvyerpnti[}uu?[qjQI=T^Ggz´~~aymUUVGyXbeqzxv|u}yagpRdkvmGKeabZrzyl|\zgjymtS}y{zdhq_NZ``D0KEHZXqtw۱uivx^_gvkd~lwo]MpsbjbkpZwc6DbPG}htm{wzib}nrY[na9eoDSF&GC;sntzپvtjkFLtnnyyygiYaLjqOr}fgNy\Ldpel~~rer~j|k]vnmxQahj\KgXPP8CFIjx}}pstSa]KEtld|^ngjiYdtig\jSD=Kontwiu^wcyPwhjsaZG]\LX^gW"ERFZ{orүk{mZ`[nqjkv|tZ]vWPca@l{83>BnwnɣȨs{x}lqimmnopw_]^EM:N\?Vxa^Qq||k}q~fOjq~{~ygvqXEQ<7cU8<4II8?q}Ȱȯvwpgjxkr||hin_NkvaUsyokM_x]`ifa|spwyoxZPicf}{rX_rpfU@V[NZFD:6V_pzqxhguiOhwok}ruiqcO^X]]\w[QG_sdmzpdvjgd~uk{fxefWaeIGRXY7CGB60>6BkSA8S}}~qrĤîĢwkinsrtfxavakxMftyv~f^|tlru{h6>E7HL]?Tk^~wud~Kq~qYG.&?{zOjrkjzq{UptSt|YWpe|SmhjkihJNy]CKLwt|bbgjykiavodw^Y]W|شnwjIpydogu_vr`ɹX~r~uiǙd|}~iV+WcơqjkelUlC1D5GFM(/W\X`h_N_iwpŧ`ִɮsvevrcno|}gjǵouT~~kqOP=HEJPXG@?\Meo`njKOWdf7mjnkZ\wxii]YovxfPWhcIp`Q}pr~[|ud^RXmZa~t}xzha`em}t`ǘ}ǜypsgyylgjsvhdVyb\~qd`0QIMMID5-Eq8JWM`VGIX`g0%Pg1[Zgxiiqz|pEr{xhpu^a_BZw|hw~whabfpyrzvci[by}gf~npsxs[mGz`;N^T~yoTOlYLmgRZtCKoeYnvpXhpnptnoh`aSL]kmvj~l~sw|um{vijjUIv[Tlep|}z_Sd|[s}lWmr{xtuypmobyf^iuXFKxNXi_~~~|ZUuoVtwe_yUDnc`Y|qhWY~qjnnqis`x\Ye{}}q|xu}nsyqeuvvwo|_NgoUfh`{w|zw]hijm|Wkfrutz{rqwyzjhf_rU@?u|OR`[nyĪ`QsoQiqcYqT>hdzbR~wmbeyzwylwazUQ^uzv|luttyu|k{yvuqfuoQC^iR_a^|qRc_dzziy}Vno}xim~mvmr_pZZUfG6?yuQXcb|{VQycUltghxUUzwdevk`luwqrlfm_iLLcw|rru~phxxk|bm_s_JHygaiio{gS}}bwxu`oy||{niy~~v^xxkgf[cXe`C=aiZbgeyY{bmzzkzlOk{}tVrxf``wxuuouguk{^R^w{w~|lv}v^vx{spsmpqQHcv^_d_v|y[who{uy\si|~yzxdm~p|}brqvee__Zb@7LnSV\Zxw^ufhr{mumPc}|v\jnikw|ntpu`KTlv|}y|qn|gyzqlljflIAXsZY_[xu|Zudktu~u]ts~~~pYczwarmpbXZYUW63NjUT\\~|`{gltu}q[o{gmmil|{{ztwipmp_EPgq}zzq~dqu|miejaiIDY~d^cavuscwmqx~gtwt|x{}{[byrz~_c|iq`dTcU_@9J{]VY]ktx|xvyzahvnamfhwyx{vynourvONeq{zxwqrkczt`xeoUFN~i]Y`^vzuvm|ptjgzl}uwgWjymu\vxuroQbXZN69]fVOZU|u¹usxzl`tsmgnnw}~~yotuveEQemtx{}yn|gs{skdobdEAU}bWZ\ho}wuxoqozgp|o~z}|{ZQgs|}~qm]unqhmqH^QVC2:dfYTaZ~õxwy~rlxujnozy~yzrlnpr{cDTfpvp}bov}pe`kb`EDZj]aalqy~v}}txsltxm}ytwwwx~aSivg}kSi{mlifrL\XYJ7>bq`VcZ~uü{{ukxp{almuw{z|wpqsx|vPSiry~~tnhf~ywv]ndeLCP{o_[c[z|v|{{zvq~jnxytk~twxyv}|kObpyyew}sUgyslodpQTXVJ5:XtbU`Ztrĸy~vulwndrs{z|{~vnoowuuPPfov||qli~xuypYfa_F@Oxp_]c^|z~uun|~lrwxn~vz|qunyv{eMamvwf~kSeu}jii`eKQTUC4?aue[g]xʾwvucps~txv}mnipuspNYjtxuxbl}v|pvd\efZDH`o_f_mpszv}rwnxkfyrt{wyyvpqm|szZUhqv~ueyzXWhxtfned]NVZS<;Nvn]``bz|μ|t|mmpssyywxynsk}rz`Qenuzmmgxyytp`bidJETxub_`Zyutq}x~q{ksk}rgwt{}x{}nvh{pucM_gnp~d}eWgvyinj`_QOYW=7Ei|o^[_Xxz}u}t|m}yy{}owf{ptcM`hoqttiwz~ynlb\hcJB\tziwuUfnhZct]pe\przlJD=bt{p~u}{qkzqI6I}\UPJt`SlK=K^jhWvƸz\R‚F9Rqh}wkwsTXXkkneuZ;C|[NBokZ{fUfxq^gklp|krv]{wT<+;lԟaVddSaOfsmaq~||kvwPAQthTutXseIUjvweyQS_ynpd`sTyxpz|yupqOOWetå¼ro>!.dbfk?HJ&)?NTEMjf|smdutVR]cxot}^{]opx}sc`>-6F[ɳ}mrystX\yv̻dkkM=Wcưan\LfUT]hZUZg[V`HbPIA)253-C^wvj{vnsTUZfgfifQW]9XX=D`u[^p`rkObxxs}y|Y[xdXw{xv}j}{z}zn|claguɲjQ_<4WADcȾ|rkrPE]edTck`yqcpcLkqO^fislq{fwin{u}zw}ivgOfE@B@Si{ѵty~s^jvrmkgDRnV^}ǯuvnajbclrcY]gUYaA[O;E>FS\wt~tqv~}}xaZi=ReKVv{rwyYayzv}yxgtLNR.78AXnDzzo|eV[`fdhgYKfDEgKFX{i\|{hgtXVq{xo|pxdRuoVrww~sy{z~~wsseikir|ȳ|ubI_@0ZHF`ùt{_McjgZnk`zqcnfOoqM^_fvptykrmquvzv~zgzaRgD>EDO_rƲyuojUskZowzm{|qtr{{gudO^wdhg\_kla{hcmo}yxtrj||immqmlh\FbQ?o`S`{ǩzX?at=+MUR{|{u~{vex\QhJIVTX]h`hkNQVadnql_uhx}}ntamkp|w{q{¾_ACndC6=91OA;]IJ\\]\_~i|yvxuxvmXshM|sbkmLNS[w{mVt{zxoyr{|uwr}vt˽kEZt÷{f\PLIC/IO.\`JM_pyzscLfm\LT^Rp~nuvk{qvxpt^OWovqlYlkPnjViokjh~ŧynqvZB;QPoz}zp`WeZUzaT[IXoug[Z`d\QSgr~ytwelyVboPWeaa`xa]{{uqrqc]df}s|yx|m~{|wmfYIB\wĴi[lMBZB8KKFAHtxkzqnpxhUp}xvqpnqpiWroPz}jng|v`LN`Zzsvvxqv{s~}yysmNX~ŨxpkcNNhCLnZPYjryuiKSj\PCXVXv|npzoy}lp}lu}sokeXPo~ljd^yd\rtnit}ó~uwYkbO@Gcf|wg`n`a{_^ZI\mpaWUZ[[MUuv}wsq`quTdoRXliec~yyad|wtutgdlh{wv|n}raXUTSKnĸqbvaH^W=NXOHIn{jwrihnmXk{vrmkhkmjZfyVkur~~[ho^WRrwyx~r~{~~{yqzrvjej^^Ŭzroj\Ql[Hml\]jqwxmOId[UIUi`o|yytf{pqs~vrlsf__bfYxtju_ww^n~vop}umIX\PPQvthrtezkdcMWhnaTOQV`VT}|xqm\nxX]pYUongb|{sqwlm~xvwvkkrkqw~rtqvaSNOY]VŷppaThZDX_TKVzqkxmggni[y|zqojgeijcZrpYxwxfVnd_W_z||qywzusisxmmyvhbfj_x~{wn^jqRcwibjqvztZF__VPIdeeuyxdyum~~vyuetse]\`lZi}n{|}vl`ZYgxbhyosvuumS;T[UUMkxwin`tt|vcmzsieinzfayrjY?M^^ecD?ZYNIer_lneejrfh}t_ncIox|}w\`jk^QKOWiZ[ƸcjulP^XMLmzjy|truyigmupj`TMJP\ylh|wns{ta{zymˠgXjϠe_S@Nbmhdeluolud|w|m{ra[vzhutkimsgiqaY]mrqtx}{eSmpe`N_icnx}cmronqzmxͷ|Y>Vdlm[or^lphfinb[~ezwqh]Y[^by|z|}}gPfodcSbvrwvysrv``kqh^Z\br`N{w|jYq{l|}{s_LBCL\ĮtWfp`\HL`Y]jqdepmjhk~~vYWcke\VX_phOznUfwl{lxrvxsrwr`tlszyrhccfhw|mW_\]bqĿwz~wh^Y[fiEX{kovgOUn`[ulkzm[a{nhytnmrugmuzk_[\boh`xrjcPamdlvly~}z{~|waE<]dezxppqeYuxZpzkjf^SPQSWl|{z{~}iTirefUXroozpnusswumtztjcchwpOryp\otwuj[J?@IXtecvibXEWaV[dtkWehihinz{gT[fiaZX]ix[[qXVwyvyv~z{~tjlyxulcbekt}wvvw}RMVYcpп}yka^aojFamm}yjXDVm`_thdsi[fyhizxsrw{oruwsj]TV`nmg~xolXcvmjqgs|qzgT>9by{|wtvrbodgue_\TIGLU^n~zzzyx|}pYexlmeXpzmoth\jq{Ȱos{yqjglz^hp\kİm[I32CVbUYryuyspbURMA2*,6Lcn}ij|qpeWixibt|gnsssvʱÿv\:0M_fɶvgif`UA960&")DLXdrzc|iadikllp|y`fogfbWE/6_v}sprqmnxgYd]B>OI3;O`sȥ~{voheisiKBXeWMSYYP;2M`YV\ktcYfs~jspelukXSUTKFJZsvl½nf~|yum\B4Njnu~z}toqobX_lbK@@?711;Magd}x{rh{||rfsmbpqVNX`hsĦrat{[HB=3+,8Qot~phXFN\NDU\D>IPSW^frmk|now~|o||xxtgO?Tnnp}wlmldZW\iy|xzeir_OYW:19>CJWhzvxz_R`uqc`baU>/CUNJRf~}p{uyeXWTKA?GZsɼudm{netv^Zekot~ĭyhpze[VO?&.IMSdq\]oiOBDFC>?GWinj|ucgwm_lqZT_fimt~sck|{viz|d^nlO>=<6,(-=Tdi¸ypdQRee[hs_U^ccbdir~}ms~{pYBI``[aq|yxzwnggo}}}veZgiVS\I49@CFMYkup~xtupaIH_eZX_r~r~|q{x\RQMD;9ARcckt}zlmvxvuw|qek{yg\XSE-#9KIKYrƬpneVWXSKGKWegay|r`\kj[_cK>EJJKQ\mzzyePWmmddnn[gu\?662*&*:SiożòqaivkfqgSV`cdglu~|{}~g^duve[ZWK74PdehtƻnlgXZ^\XX_m}x~vjVNZ\NQUA9EOU[etĹso{zvwraLQhj`^ct}mvs|~~yhVd~qWPSSNIKXl}~~xn`eyxr|xccnsuv{rfgvrc\YN:/E_dgsˮ}orYTUQJEHUekak}xlyzmakvkglZJQZ`dkvxs{{zvhTWpyrptx^_vkI99:75;Le|ǿǹyfaooeicMJTY[\`fn{}x{omyzib^S?4I`bahuuht]Z^\XV\k}{yo^OU_URTA5@MW`m}ûrko~oda[K9A\eabjz|qY`wgF9::66=Ohzz}rcevwrxm\cqy}j`_kseWROE48Wlmr|˿|b^y{]MPUTRT^p~{u|wumbRJX_X[UBAOY_eo{~uuwc[o~xx~x_QhsU<79858D[r{zƽ|ofrz{xc]hoppsx}}{yvuxoecjzxh^ZQ>4H`bagspgadc_]cr{wl\LP\VRN80::ASgpm}¿xkq~jbmvxxz~oa[[ijZLG>, 2KPPXg¶Ǿq}_WWUNJMYgg^lw|rj]PUcca[E>ISVY_jw~|saUewtlkq}qYDTfN1)++*,6Kbkmľ̶´{kn{{xq[T_ghggkpy~}rgdfu|ob]UD9I_`[^h}Ưn}iadd`]`lxxmuvtg^QBCSXWS@9EQWZ_iv~~wo]MWif[WYh}vyoYctUHHHC@DQahcoƼ}pn~mairspmorw}z{ugdbm{scZSC3;RYTU]pñýywr^[[VQPXdi_^x|~vm_VannjXFJV[\\ajt~zsfRPckbYX_rv|bSiuZ@99733AL]hef½ym`fw~}n[]ksutvz|h_ZVcm`QJ@/,ATTRVbyͻļtoaa`\Y\gsqfm~xofXQ]kneNBKW\\^emw~{yk[_tzqjio~xkSEZiS912215ATdef~Ϳvt|d_jssqqux}vmjem|veYO>5DZ\XY_oywyebb^\^huxnlv||mcYK>CSZT?.5EOTZcp|vhVWkumfdhxwaP^qaE:998;FXghfyŸ~pkzy`Zfoqpptx|{xzxdYVOVfdTH?1+>W]\aj}·Ϲ¸tpfQFQNVfRU`o}vl|v_tXVP?OefhY\c[ZdldalnvcXWe{r^lf`^qv|mfssijpkYaknsRnܢXMQQo}}|nozsr~w{qge{”fYQFDکrdTjz{nur[Z]g^m}}~xqrq}ZPZXXN[zyWdssh^qtypembNNVbhvo}}p~yv~{zj\chjQ7b;}~yynmycKELPNfgiylgjoj]dqVCZcdZJ\r~qs}vir~[}tjtvxlmtWJMds~q~clqyhO=>K_HA߾w\MDSO[_S]\LNXokad|l_R[oskRJ`h{k|tnnib|eiknhh|lPL\yzo|±bgzoQA7X]:bÓy}~zszjREU[YZEENAΧ~w{vnnbOI`VWD7AC81>bslV~stt}nfvx_P]bnnl|k[|rybkrla`ylQKa|mtӾåaque;FY9TҬuz|qhpz^IU_SJ48GC5'=\we\njv~eh{sXPUghz~f^hj|oyzk`gdSMq~zml϶w`{u]8PU7fġpyzlftq\I]_TA/8GC3(D]tXdigx~el}mRPTr}f{||qaYsi}uqfp~^QP|xyyn̲ϼre|qT5TO:s澡s~|nl~s`Mc`WA35=\yh[JDuҜcwilnfp~pwsfpvt̰ÉaibL@Ppou`QLUmmqvhűciv_k~lS~tznt׫{ZVQtwmPMjet[LICAQpYfȱdQT_cuz~gedWeovdyPmxxT3chGS_zyoS\nKT:ump–vϹppmmysfm{{ioyw|ÿ~ctfgVO@Odvp]cMB?Jcjvqjž־lswXbyp]Cj`ci\}cuihlLHEhooSKnaufWOLN]hlؼg[[ei}yuzkw}uzɨƠl@clFLUhj]GE^=C2Zuq׭ͨxxtnc~edn]X[jggzws{uXgbe\UGMcs{fi_RRSjzmƶ}Q{ukfkyke|oOrbkj^kF^jkd3)?KY`trkúwpeWlTZUO{thgw~mEep_Z_eFch[RAq?7djzuqxqiQo\~{]™^\V_dYM:X\54CcP`vkȶΞ}pz`fUrp~aPqpJ\wz^rWZqoejjhXvqeWNLGXWephҶ¦{uedeotmXsmmtPeZZWa=Cb]G=FW7Kiv{̺ĕrwvzMmz]diYkr{hkuumpRbcOZMkKFF^P\wu~hyxu~nV}nfyKZ²zphgiiTikIFeid@@<0VPdS}ʺзunxsZ_p_[jh\si~twdnjtW\HS[c`DYiH:bwvzbu{r{gibum~x~zv\KfqNHNhrQO/;6Serp]ķ~ba|qtqW\l||m~_q[vc{qARn~eSfcDSf{t^~`zqkoixtqm_qlfxxd`a`@>SA\A]Q*3Tthlǩʢ|jii~Zbgyg`u}vsSYicV=\~z`VRQ;YidvaƬwt_ut{mn}\Xy|yyy~djiw]A]YiGWUB/,]r^Piǯs}vyoj]\{|}cjwyyrckss[KekVdcsQBQVrZ|wiynwhukzpxNU^J^GfcUXXN4/XeVcd}yco{zq`eyyhvxxo]qfMYsz[fdHXLsjVZrd{~v\YzxqZQ|tt{t~_u\qUKZSOBYeH.5ObQgt}Ĵx{nrPQtak~qQcnb^p{avYjL@`deUf{}yfz~n}heoee|}uyxpekkY\eXDV|_EC[mK^M|xoWns{wnq~stbfgYEc^[YdqZT\VOe}km{|m~jv~qkvxxTWfZD0Tn`MML8;NPTU~ɿĽŖxt|lamyyut~|uurKq]mYXvjN+GtpTN\inūn{w|z^^lsqn~ypl`drlXFTPJS`c1M>BIBnvwl˯zpwiuzdyjlZ[u]d`^`qqZ=HZ]in]tywh^|yrh|uvcZtpxdiq\JLX[RUXD]F@LMN]vҾy`tvw{nϴr`cbWXStER^dv~}iw|rbvixwlxI{iJ7CkV@=SA 2]UR8selv|[n|wb֟n\obqelqF4QPh{hOblasfLLVfTyawPs|tmoncMb|vi\]kkqQUlcSSTcisq}pf~hoWU}{jf~hqhicYlzbzvTxy{vs{3K3;_R@z~r|zatt~jy{n]xxbvtntՠœv|[OW6yID`O-6RKQM'\A\Qo_IYrgti}_TXJlq]`mQPAWXPoxwm\ae\Hahn|L}wz`ha4/Y|}eZldpYiqtdWPssprywuyjΧ|tnvu]LFX\L^pZAaOWI2GvkNIOK:T{cp{{sVFw]~m}|x{]kTjfexSKbĬzegWhLtlnrSe`fXDZtwxsNmۦ~mvn`PB2@!Ew~qv}xh[yr`OFqg]\bibJ?pzjmyc_UFuX_ntq^UusqbeVVozugfeyiyonomklVjsIIW]mnztYXjxvcwbvntmnVyʲ~kx~~uwwX|q\SX]J9P¼שouuvyu\dXFD]}pRRV`pzaDD[yv_f[N:HPZDY}mg|}s[Fv}t_gpg[y|ck|hj;_`Hfvp{b|cTWy{sztt}agsY\n~țĠ{h_jmiV9MFNrotfwZNkvPBfmdP%/rx{Z9I~{fJh^h_2~_geipyr?8Kht_VGhyq_aqprveahqyQyS`KVavwSd]ZKBff~ģuhSo{Yr]yxu}gsmMpcizz|x~{vhhWCFYONP[KF`]ɛǸsraEz{zmRCzyd=|mWPP_\Z{CHePVNKCHhog]q|konqzVxVYicM`W>4Qk{q[o~Yevu{^^b{gxt|]GhsmbկwûdyePCJ7gdFBE>AWmpwŲo|ifjw[ssomdAIvzUK{zocelvvF'[]I]pb|uzmiwcjx^kVMPQY}ALkUU:Im{Ωg[bwtxtV]f}rbbin_cyͳv}ny~SqN4,A[tjC4>>8Clq}ٹnh|hUo}ugMjuIE_]mou|o|dobmsfkbd\l{wWIRXdYlz~yr^y\g|qU_~izrz`K]|e[`fȑ~wPdwf]JMHMRWN9JLKWVlsϺnqwhpYIy||zhnX[j\F;ykODPQn{~v~yzt{zhisn|p``ZUfnrSMYYc`rzfƢ{enTi}jSglohi]hPdgx{Q`oa[FKLPYX>-CGLShxײpcho{}kkk`ohb\@4:RrxWne`jgofx~dF@FOh}Y\Wg|w|zzȡcMpsammZSgzrp^`joleulflzѝx}z|ihnV~yFRTYegR61@6-=9NIHmËp͸ԲͷU`g_txcXX7:hv\QJX[s}ptb]xrnbItxaJDOZnnKEHMlv{ʧ^keYicd{W]h|ole~jemx؟wrlysqmxq~|j|aa\SXR?+2W[Tecv{pn’fΕ{oϛld}v]^wuustndwD?Ys]VtfuvbchvpfUxz~P8?crzf8128Q\ztnY\|w]tiCGajWNPeȣr|~{_xo^yrcPB=[bR36RMJWYpuocɥϦͻϽZnnQ[qbbZqxccuTUgyzuxr{ycb^v|c\^GQfOabHH]]cL7DK[agǹ}xZ\jm|bcsdlrXcrtikr||Ķykrgifqj{^~rp|yabvd_TLUB6/Ujdgmx}m䤩zlqӳnvbf{rfsxqrENh~ht{}sijauo_Y{qpR67h|~a6,3;GKl}n_b}}[jtd@LZ`XQRdx{VtYXyv^C85[f]<9EBKYgsniWǘįӬvcm[moa_\y\wiUUpvuvx|yt|Qy~qo_aLGbQNgq]EV`f]FDP]ccxužszZciykXhsuU}fcdeeiu{s}Œokjldfnzfa~ijuwXYzocYYMWH>8Neeejv}tn׷v}ƾ~txu|j{yKQhujmv{]{{erxqTRuot\<5`j=+,;?=\~sni}Vn_lNPYUVTRaUqpfTkyjG3-OlgP8;:HVjqgbL]ַϽqvhlqhbZwqc\Ocwnqww|~ze]jydiXD`ZLWpziYK`fhSLM\fan|\Ѿwqu^bpfOmvfUff[Xdkolzʲmcgl[jk~[gye\nmLaq`]RSMYF@AT_bbftstqkиudxxPYnidr|Yy|lnxoMLpfzpkW16KOPQ[Rat^`zkrtxjwǔt{m]Xmz{p|c~xoueXlejyls|m|rhwn{_KTiqod|jrwrjPinQ_bi|eToenjFKbUk~_8Sss}|}t{r\=nfe[cqVkgn_lhdrzeɩsR\Ԋ0*:ARU_tnt|ypy?p~sYRf{ppl|uRC}wpbVXqSo~{no~\jysitsm{ucNc{YbЮ[GQr{fT.1*evxl\`tgnbtmLkT6Y`Dg}nZ\^o~xdpsnCVakɞch}h_iw{{nouʡk|z©xeYEMEAiywV@EU71Xqwg7C[CbJt{jZO^qcx^gtjypvye[^?JbWptuxsumj|tgj`]p|[N4Obŗ||ckz\zOjY.6VcgV@]tlZXOUicvhkrp^\x~\gy}ggpq_NQ_}vϵrjutnqi}lr~̥xTBLR9FxǺv|VmfdofMfvdZ\K[ZTnX`EPau}_g~rmu{fszUMWiuqPUd_Yn{zmhmryuxpzxyĪöu`aidN@xsjalqeIIuzvxlwLGE@`Nu}s]D@]rjiw`8R_hzy|gh]rdcv^o^yr{waznjqwiYx͸mdXrZlIOgPaЬffemx^~mKTRe`IUxf`ktmTUrg~bRMXisfxulikWrnn]LRjVo_zx}ytixdnx¹¢y~gYYWI1/c١hidRb^JG\uuX0CBIfPqcUix]rv[NW\wefnmn^YmOOcwmrsw}nnyl{ry|sP75->;CrZutp~v]hyY\?Zp`VKLI=8k{UmX{xupqyWQXFi[msmstyn|m|eVrykuxŶdrEXQB^lvgq`[SYwzd_o\JF?EG>ZolbNCfqz~}q~a\xd\RTPBBoŴo|`xzxpuz^n`~ftxmV<9edLhnCAXfZ:Qf[yxslLQazgvkyPVrqzcgt]crsVcb/Otq´bhyagy~umaf~paxð{qfYpW=_TT9Jc[Kh~vjyqZ}yj|ywysqUq_XUV{~Pok`s+ϩm==EK=A[qsT|nm`eq}tJThknz`xsgxvOwSTcpca]qX}rjfc|ypgnrxcP|r·ũuP;oN@=KI[mZAmFW^HMHg^SF;jpvnrjPzk{eooy~TRSWs_^u~F]{]hzvp|Wb^Enq̭ȩ|kZeIRZJůcODOUS':~fYPb`E5lY1,5'etjnŚqLtvrvuxxpmjJ]v`zwX\guyj~mix[~jthM˦lήŹxa]giFH__||~mmlvP2c^PI\]R;jX@M`6KjkhrU}xwr_wykabji_mPxuz|nv_zfsdohrUbެ̾ϲ~||e`aSI6QY˺hdra`]X7esOFmxHIvZ9>N5<v`Mpk{xsyTEPZgZqtznuk}\~biivomزƵvbfVKbtqQmq~tq|]^gsIcgI?`tc>MoHQcMAxro}[UkdywwcrvzvX^jlUpytxuVyvmpysnn[Ѯ~oqX>I]gVoo¾kkW[ch;czgQltJJl9.JBCyp~z^a{][vtwfvfSYbe^pq}s}g|cekiy_mǭpw·iiJ@TgbTvw|pmztMuoaK`k`=SX8ET8Gv}vrp{tUntmukvzup~\KZpphvs}~f{uZadqbôobjLFKVNWqů~ypbkTOxeWGsrS2_tN=<6$PruvqNwtywzyyvumfDJZh[mryyfrxspf_Saadt_dW;G]hWp}ɿ|qilzIfk_M_rS24l]AEWCCq{qw]\wi~o{i|xk{hP`stfww~y|`v\zt`ihnZsȳ}}xmvVLVaUU^q~xuqyNHiYRHvtW=kwK8CC8_spqtY~{k~utsz{ztSRXaVfevpn}Wzyhhqdh[gķzhgS@LVRD\cxwpo}zW}ogIcq\CY|YBFG1HnrnYgz{tszxpuVJ[j]V^d}umlqaxafh\ȸ~úxv_hLFU\P\Ph|zHXpbiWbC9fgE@]83qUeycKwvi{dh\a[9SfsNGEdŃ}~{}}YoaUzпwkze@8Uh\Tkl||}ChiiLBkt4eqYgM@=YxWn~k~tqpg|^cf\R\SKtUdp|p}qv}{VxkV]dy˧Ȯ}hbka;MX@QFQֻmtw~P^kS?BfS1KXFTooyav|nvPw`h`h:bqD@Zkiwyokyx|aoˠ~xtmgcW\K`\>?dm|]R}QYwfFNgJVLEK[vVn~{prwSvWO]QWL>Zrqapmmbbjkz`myq{ϫĨuuoqqnTSs^5AR]gmVîjsntY}fQKZyOa[^Y^ds}hSdtbSpf{|c;5om\oġ{|rku~{}_ixgzwPO^lnWAHD7;IcľxomxkGrsT]OscGGOghb}mqdlx\OYheaGF[bovkhxdOubDXonMqj\Zbl1=6Oouĺq`yTHANmjM]VBRrl`amoi]ic~rhRos_Q,^dYaϸq{nttjv{gzrqeolJaa<4E?C8+Rϥ~kH_}bgswwGW>wznaxjrS{p{UFDW_]PNgiosp~daqdoq\Ux`\Ģ|sg|~ur\JZJ.0LjtyoѼĬxyvooI`z`uIS__RBQwy`wk~{uqSN{rXMOtcTmeuk|~lZeds|}f{u|lLj_IPNB/=TBG8d£ŤoltwsjcsmNGVnyzttc[hr{jgsgr[@|b[;2]gjcNxugQsyggt|mlhFriUU7(#;Wacfʮ|}akjPT\cNJnaYQwiz~}nxSbpngeWOWEEV~{~}s[fymAb}moŦtlmwlg|yyvlnoL(=]0(Wվ͟xfuq]rjcTPayRtR}IoiE9oDKY"I*?dprrʷwƧsmlr`gnpO[txw`qXKbp\KU@2s{~¸|jeoXTmj9de[s|{FV}wOAPVa]g_g]ɭy~\YRWrb\kbyvwI@tw`7ZO@*$HjX3Gˉv_`]QhptfZn{~u}~y`VD=Zqi]Br]^wy_^~|vXLIlUNsz~bKd[n}P/OmR'.DEQSPWp{żĶšvkj||}Tnigri~kB~xE\iSEA2Jla;8ppc~`glpz}glZ|y}ffkgRI;.Q`[LL'JVS~t}ʨfxzaQJXZRvlr_|xxsjQ_yJ=DNYTYOvn^tjdrpWowX|{]jub?jxmBNdU6"$>sn@Ysf\o{[Hxz~jvxlyT<=<[c[lVd}}qzbYai}w}ìǭ̴td_V\YB8jhʞu^f}luuaTRUx^glVf99DESL=Fw~pot}lRm~dtnkvWNMRr_|~oqyyqbVix|u{eF=?GHKy}tsy[O~vur{|PhXbjHXRVXVRqsWZyh{y{sy}qpE3EOcjnvwuqjf{[qtxtwU==>R;Xgb{cyuxS`p[^tNhrd59vm`b}z~~jrqfd}z~_9J_nOab]vmxqnnyccx~s~regC2N]V0GJNhȨ{{epf|p[yed^`H]kewjyx~mkunc|aoUQ_`P6W[atf|ziydmSrjuSB@EB9_doc~tLn}oVtxToy\-Pxkgrx{{rvufmvz{{wv{U@I[^Phgnjxwv`zy]z}ztja]]:/CYU@NYGOr¯ȯpjszan~q^qrnxgE`zmvkn~vvzkt{xkQ}h]]KHU]P`¨oqyu^xumR~{}jrzs{]IiIG?27NYQe}ɸ{lpe[xk|T:nw~rntw}o{|odgyUWJDPhdUexzvuk~agVx_y}~h}~xxacf[N@_XBPSa\Mϫelw{fSiWXihpjm{tgs~zhjOcpNEyS4K8Xn{uww{kXN}qh|\qUh\kwQfV'[[:Rfcdǻtza|lVhpHFr`ky}`vtdlgi]_QMhh`Wbttuyyrkmfqcxt|T}qpn^RFc`JSPXX4Y][~жr~rbxbZe_mi`zzm|daitVC{gK^Ipzwrrem_Uppujx}~gjewZUlEH;ScNLqsz~fv}zkxkiom{e{nurcmtdwvMNxeY^I6FXHbduylrwRkcUSRyvrwqywvip`Vi]\IPdV][yy{ssg~vWg{pt{ylytgkv\NUNV:CXH9JQD{º}vns\Znfqh~qidoRciMG=]`LMrqup\|~p}ghpos\}wystpc}sd|xpGLukgaI7HVFZYo~wżlolW|bYPbznxtuu|uqsYVdY`J\`WZ[zzs}yqpwwxXt~tpuy|oruufwsVWUPK6RQA3E>Ov¶Ķx}qXeeglfq}eh`V[SCZiUEZrloV^z}{rdnjq]lyks|ougwkq{wXFkshjVB>WDMOXjbpɶ{mr]xp_V^{mrws~xxrzdWcVaQ[fX^Vnnau{w~s}]qymdv|wsuzn{x\[]XP;TPA-82BvufnuĽ}a]`hmopzzp@dgciwhLBigJorW:%/YBR{[}yh}{jgxvcpnyabPsvj{djeioQ>pfWpVzhvnmg`rccrixoz||oYpq~aVVbhǟyv{lEetUhUXbmuhplpnucG^_mWBDCkDqziqm}uwxw{Tlfsh^wms}}YknxgJMFvWy}r|gba^bb?Ov\eg[rxqui}}}qu~|~X^hmkJLEqjovunmmMHr\VZ@tvJj|_kpbbcafADRXZ792XPI_~l~~pk}inmix{}YVOttirsmmmVMzodmVdsl~fbZz|fxjzdfyy|vzv}aWiltSOKlzh¡}gVvfnSzZwrrwosovYM`dlKD;Z^Fe|o}w|yzzi_st\`wz{{eYikoLE?bcRvooihfTMypfjVf{rlfq~sq|x{u{]UcfiGB>d`Y}yq\W~od`Mz|OymxaizmcgbiMFUZ^=71UN@zYvpqnmorfux|ZQKml[~zvqbY{olYb}yjz}eZWuu]|{pff}ro}qtpvaP`blODBcnUĩȮwjzw`dw~tnswsxhQadmQB>Wa@|fnu~z{~vnbyyb~isynwywyoSaclT@=PhC}yy|~uvjdSrnq]rqp~ugdof{yrlxptnqOSYaW::DlJnxwft{tabtVoq\rzoelflMLU\X96:aCQzZy~s|{unw~~kaknqQIJpd_}tifyqae}xz{ftvdUTpwY{qjkl}wnbziikifITXbR>>UtRʯǹuo|zh|yhzsztxY[`g^B@LnIge}}zukznobxyfw{mvnuZQY\]?9@hU\s~~xmfg{peh|p|o`aivwqzqd}khkfgGMQZM79OrPèzn~how\on\p|ocmdlQKSXX;7>fNYg}x}xpuwv~x|mV`ahPELptbĹvqm{iqn}vn}biktePRk\~zrjzq]~jeUlyte]f]eHGNWT=AVbӹüzj}{ix~o{pxaU]`cGBJr\bq~~tqvundtvrcgxdmgj]FPRZD:Aij[pnm{mrtyukrt}m[`}krufneWpxta_c\`BDHRI7=ZxZǫymvaoiZq~{keoemPMQYT<HMWB>MxppŴħu}zloo|uxnU\]eOEMqg\ywx|zshkvj\]uwr]jce^DJLUC9CjhZwwz{trs|qq{hnpyfY_kulgvgZUmplU_][Z=CFQB7@enZǾwql~pd`x}ydpmkkOSU^L>CfgPx|}wruhe}~ivqpnQUW`ODMrq`øwqotihpz{y^bclYMTvo]xx|tm~`]{k\OMdhdO_YZW=CFQ@9Dlh_ǭ}|ooqz{x\`ahUIPrhWw{||vlgxi\Zpuq\jeccFJLTC8@dbO|~wunxljwiklueY_~|cunbxdVOekiT_^Y^@ACM@5?`fM|nth`v~~jtvowYWYaTEJfkK|p|~muj_s}}joujuXSU]UEJdwTxjwmasttsi^agdPQd|Uxq}xzizpWexaSCP_bUPaP_M=BHJ:>SsUp~ŷƼ|ltvyx`cehTQ^|_es~x|jiudUWkojYl`dbFHJQABIF9@[pM|yr}n_l{son}lY[^_MOazWjp}rs~l\aswpcwhojPRU[LKZ{fdxmrd`t||k|yt~a^_f[QZutSsx|x{wg}}hRfqYJ>MY[LQ]M^I=BJJ?HbzXƸķĺ{ks~uy{bdfiYXfhh{zymcxcRNagfUg`\fHFHPGBPomT~|mxj`q}q{updfkg\d|`|~mqZcxaO@KX\ON`M]P=AGKAI`|\vzyrbfw|ukqxv\]_cVVehd}uijYVhnl\pieoTQT[SQ`xb}krcZltwgzrjsrrwdep_rj`^ott`L[mYH:BLBFg{ljstpnopuyo}{wy~t`npkmmkikvq}}qhYQX`dlz}qvnqrojegssbk}yyx}kispha_eptkg{xlboxyz{xtvztmfZYcgioxcot_ZZVNE@FRJHd~~zz{{ny}~~zvtz~kq~~zqkkeXPC=J[iyʽh[}bXZ[WRNRbfZfwnsyuomnou}eeqqnmq}~˼xrr|ket}~|xz~zvrimx~z_ofRNOMIEFTb\`~{~vqoptysuarkfgfb^^fpbS_lpsxyy|}sm`\hryw[`~jgjkgb`hundu~x~|yy|ntzuoloyuζ}xz{gl|{xzxnh]U[dfipw}syogpcb`ZSNQ_aVcxqw~}yy{~{vqyyzywxwvxrrod]TKSbmyſp_|eWVVSMIKVXHLbqx}z}}||}sr}|vpmqvsd`|wstjfu}~~xqfjswzzflZVTOHCERZPXxxsrrxjhuwrmjmso`Yxwxuqnq|~jdrzzzytnnmd[RGKV_hvp^{sddfda`dsxjm~~nkvwsoot{ykj»~jcmrqpokimplie]aknpwdTq~`RQRPLJMY[KPj~z{~yxy}tn~|rmy~}yuwukcYMOX]cphYwpddge`]`jjWUhx{sijpollot}rq}~ysoprjYU}{wyql{{pqxz{zf~p\VTNGABLPBAYp}}|q[Mkyifhfcbgtyh_kuvvwtprrkd\POV[]fsj|olnnkiku{kbq|zy}pdnrngbac_QEaz}|~xoi\VZ]\^fp}tY_v^UTSNIHOYPDRj}|hozx}}ggrusqmhde`VPG?FQYcr´ºsil][ZVQPVb_NPdrzwnouuqqru}mn{~|xvxyp^Zzq||rqxzz~iRbePKLKHFJU]RMay~~u}}vcO^slmmjfgpyn]botuwwvwyulg\UZaelwnlynmmjfekvp_btzprwwuuw{oo{}ytqrsk[[{r|~{||ung\Z`dejr|q]nv`XXUPMOYbWO`w|p\fvwxvtv~mlw{zxuplmh_YPHMW^gttgqa]\YUSXccSQcs|vtz{xwxysmy~zvwyte]||ls}~|}~yrmd`gnsyv\bpVIFB=9;FSOHYttz~p^dtsrolls~xecouvutqoqnfaZSYdltj_}pa^_^]_guxjj}zwyxsonns|v`[gnnllotpc_rx}~{uofbiorwnXet]TSPLJMXbZRby{~~}|jy{yvqmmt{n[]gkjihdcd^WSKGP\eprruhdb^Z[cnhZ_rzrtyywwx{}imxzxtsutiZa}{{wt|ulnuy|y]Rmy[ICA=:;CRWLQivb]vrrpmms}|h`iqqpomkkia[ULNW`gr{nohgc__doqb]l|uqtsonmnt}u_[gnnkjlni[[{{undbhmpv}cShhSKIEBBHU]SPd{|}i_{}wvrnloxyfY`higfcaa`ZUQJKU_grrogda]\alo`Xet}|rnqrpopszlhv~~{{{ra]~ry~ysjgmqsxy^PgcOHFC??FSWJH\qq\Utsnnliinyxg]gqtuwvvwvpjd[Z`ejr}xjngeb^^dno_Wds|wsvvsrrtz|galstqmmkbRNpxqfbehimt|o_szd[XTONR]aTKYkx}wbUm{uutqpt}n^bkmlkiggf`ZTLHNU[co~vvjfb][^gm`RYit|~~{nv~yvskZL_wwzuleglnqxoWXyv[KFB>;>HSOBG[m{p\`}{{xvw~mfouvuusssohd\TU[`enytl~lec`]_fpo_Xeszwsttqppqwwb^jrspmkh^MIkqn}qdadb_fnz|oaqvjifa`bjn`PUbkrzwpyuahxligcbenvpbbnvy||une\Z]^`dlvlt~|pjknnnqx{lgq|ykXRlxvy{{|}}wjo{y{}zsoruvx}vhtwmifcbfnsk`esnep{mbgsz{zywqcV\{{qopoory}pmu{~zuohgkosx{|kdca_afnoe_hs{vkfirw|zqlhb\WPMPUZ_elvy~pcisiecaadjqnehs|zrns~zz{qfj}}||~~{wjaZURTYYPKR\chmquy{yvrmlpstvx{{w~xnixwrnigjszyy{vrlilquy~~|smhjt{wxvsnjf`VNVm{wmfeddehnroggmrtvwxz|{wtplnrvz~unifeejnmfgow|~tleaagry}~xog`YWY\_bflt{ztu||tjguyojigghkpqkiov{~}wrorz|~}|yskl|}}{y{vnf`]\^]VRW]bgkoswyxusonqtuwxz}yvz~~}ztmkx|uqmjikqvvx|xtporw{}vojfir~zvqmibYV`qxrlhhhhjlqrmiknqrstuxywurnnptvy|}~~|||~~|~|xusrtwxtqu{wqkfcdhnqwyqiedeefhkpuvrrv{}}|zwqjhp}yqmkjjjlpplilquwy{}~~zuqmnt|ztt~|zyvtstwz}{upmlib]^`cegjnqttrpnnprtuvwy|{wuwz{{zxvqkjrzvtrpopsvvxzwxz|~|wqkgglt~{uoh`\blrokhhhijlopmjjmoppqsuvusqonpruwy|~~~}}{zzzwtux|ysnjgegjlow}volkjjjjmprqoqtwxxwurmikszytpnmmnortsqqtwz|~}yusty~~yuw}xwurpoprux}yusohddefghjmpqqpommoqstuwy{{yy{}~|xtsy}zwusrrsuvx~}zz|}~~|zxvrmieeipy{vpieelqqnkjjklnprrpprtuvwyz||{ywvvxz{|}~|}}|{z{|}~|||{xvx{}~|~|uokgdcdgkou}xtqppoopqtuttvy{{|{zwtru{}yvuttttvwustvxyz{{||zxurruz}zxz~}{xsommllnquz~}zxuqnnnpqrsuxyyxwuuvxyyz{|}}{zz|}}||zxutw}{wtrpoprvx{~||}|zyywusqomkhfeglt}~yuqpuyzxutssstuvvtstuvvwxyz{zxwvvwxzz{|}}|ywwwwwx{}~~}|{|~}yvvyyuojfcbcejou|}{zyxxxyzzyxyz{{{zywtsuz||yvutttuuvuttuvvwwwwvusrqsw||{}~}}|zywvtqmkkklosw}}ywvvvvwwyzzzxwvvwxyyyz{{{yyzz{zzywustwz{yusqpoprux{~}~~~{yxwvtrqonmkjjlpw|xvx{|{xwvuuvvwvutuuvvvwxyyxwvuuvwxxyyzzywvuuuuwx{}~}||}|ywwyxuqmjhghjnrw}}|||||{zz{{{{zxwutvyzzxvuuuuuvvuttuvvvuuuusrppruz~||~~}{yxvtqnmllmnquy~|{zyyyyzzzyxwvwxxyyyzzzyyyzzzzyxvttuxywusqonnopsux}~{zxwusqpnmkihhkou|||}~|zxwwwwwxxwvvvwwwxxyyyxwvuvvwwwwwwvusssrrstuwy}~~~}zwwwvtpmjhgfgilpt{~~}}}}}}||zywvxz{zxwvuuuuuuttstttttttsrqonoqtx}~}{yxvtrpmlkjjjlnqv{~~}}~}|{zyyyzzzzzzzyxxxyyxxwvtstuvvtrqonnnnoqsw{~|zxvtsqonlkjhgfginsy~|{zzzzyyxwwwwwwxxxyxwvuuuvvvvuuutsrqqqqqrtvy}~|yvtssromjhfeefgjnrx~~}}}||{yxwxyzzywwvvuuuuutttssssssrrqppprvz~~|zyxvusqpnljihghijmpty~}}{zzzzzzzzzzyyxxxxxxwwutttvvutrqqppqsuwz~~}|zywusrpnmkjihgffghlpv|~}|{{|{{zyyyyyyyyyyyxxwwwwwwwwwvvutssttuwy|~}{ywurponmligeddefilqv{~}}|zzz{||{zyyyyyyxxwwwvvuutttssrstvy}~|zxvutrqomkjhgfefgikosw|~~}}}}}}}}}}}||||{{zzxwvvwwvtsrqqqrtvy|~}{zywvtrpomkjhgfeeeefgjnsy~~}}}}}}}}||{zyyyyxxwwvutssrsstvxz}~}{zywvtromlkjigedccdfhkoty~~~~}||{zzzyyxwwvvuttssrrrrsuw{~~~}|{zxwusrponlkihfeddefgjmqu{~~}}}||{zyxwvvvutsrqppqqsuwz~~}|zyxvutrpomkjigfeeddeegjnsx~~~~~}}|{zyyyxxwvuutsrqqqrstvx{~~}|{zyxwutrpnlkjihfedddefilpty~~}|{{zzyxwwvuutssrrqqpqrtvy}~~}}{{zywvtsqponlkjigffeffgilnrv{~~}}||{zyxwvvvutsrqppppqrtvy|~~~}}|{yxwvutsqpnmljihggfffggilpty~~y|{}w}tlfZgfcps~|}wyrnh^kinuw{sv~y}~}upgaoo|sfc[_SRPQW`s{cEKbG`xvy|fP[rwvxvb]cf|zzteih^UEIMXalyywkw|bMFJPQ[]_\__az{dQLo~{{{yt{s]\]v|thduy~{yzqc^mosrs~qbxz`K`~vtopmhgnz{utyvz||z~pe}~|wwo^b^[gloVDQm}y`Wwpprp^vqyo\pvWaydcmoeWg{x}pekOhjrypdQ[{wjwo_l~{zp[gyikg8SufSd~xvyyjYV]^\usuwz{dht]{nnlcqq[Zirs~rwr{sttSuZuy{ruw~d_dAWMUdjaKShhXT\ZHDr^Qav~o{ko|mmq^XeTeDdscapynNh``vioznrq}|r|veO_~{t{rzUuYHRj|kEftg|h|wvfqZ\\v`}|jIhrjQe}mbl\}}o\pxHQdxrdss{jshpqpx{uvierPbR[TU]cmezz{usXsmdasv|||hrgUlgOQplcghr~xrbd}r|¯|^pRPrupqofxZGTVv^mmz|[SbM=D[daJaQ]gwU]uzegmzysqor~[]MTUQ}}cqy\tn}~mxz|vvqt~_tnmy_Lrl^fzwy~]Y\f]HXk}iiddaqaxci|kyYol]UOm}fapuoZ~vZb~Ykb_nl`s{dmspxjxvyherZzggE,GQ`G?k{xal~vXduverygSUitt`l{vpyqozm]Yex~j|{rvl]`pw`šaeR`scfIcqYJTfgS=MM}|n{cKfxpnggfvs^{zj~t]anwsug_kwksq{t_Xwqmvjhmslzu`qo\L|_[`[QS}`lnTQ}~qjYv|~xpu}{PWsvpRP}zmlc]Okweednu{k{kFfyj^g~vdrhw}xqzd}b8TTF1.ebhpm|pw{|qiquz}}qix{bW^_{p~s|rchpjblix}~o~{r~[>b}rqz~vtkIIjmNSCXqi{dLGuyvscabgkp~Ztp]{pȶ~pwoixwryqbRbgWMon|vswmi_azwinYr{}RVuoi\QEWuabYlm|ppyiYvuz}egvwzǠeqvdTocQajfVsweZRx~nHrot}{kni{e~gmwszwv|g}_sq]A-JoeSMI[i[qgV~wwxd{fjOqzsupi|xt}w`wtiv_Wnsa^pvz|}xqo{uffmouttiJqe\[OUcxrrjZjud_xi]{f\z}zzhtfacOBX|uw|ynjpz\W~otmM^mhY\hWcybZHttcrn~ptjuftw}vxsoitsx{rpxęw\dyjj]OKx{kU|{xyO`pyo}vyte~mwquzxwjfz|VdhEHleA2BSWGqzowv}joowyff_gbdlzZzzpxqUkn~zvq{g[|obls~|t_e}qcpV|`cUPL_xoZa|siv>r{ssb}d]x}zk}uolmx~~x`IM]ejt~^~{{|}hsmjjierg\XhQ[}lOmssjpyrZo|kl~rr~z{ymv[yvzn]hpm`y{qsrzcX~mvm~{Takhqruy~{ryszVxs~kXTti>4;;8J}nl||wsbqzkp{{|Xglb^_tq|zqr[kypgdjkyuObvlorrjxvow}y|d_~_swk^_lpaZo{rAq[_Xt~l_wpzwukhs~}rjv|lhiaZWjpY|hoZvh{zhmwVTbmTevccuox}dQqr{mq]gn{~}~nuu{{~yu}dlXzj{Ŧxkpmepgo~WW|}pq~pWKV`hqshqq~pwqpuls{[Y}fRPI=3Ub_efoi|pjgpv}Z]{vgkvufhutpu~rbduel|myohmwxnUnezp}}xurfijpw~jX_pzHg[hjefhaXmgU[fqxnxrkqzucm~tgkj?hr]wqjtrwvtY\jgg]Nk|khhHTy|zonkoylqrnc||zZqmq]czjuswcyvt~x\z_fhZ]pylnwxrt~v{qZ{gtxsegxOJVZOWoYVFWlovls~zxwj}iwixwa`o}upygqo^fr`}wfvYl{qvkti]sVT[ttw{}mk{~onux{|tX{[li\fs[D]iZ]\U\~qtqsxwsqrwShtO\dkrw|zzos{}uqfaghcossqv~e\sxnqc}}vt}~[dt|qhu^P~rmoajj`Zt~zzxbr}||jgo_by|obalx{ywpbgnu|y~vhXchZNDGnjdH[utyrSoxsyqs~}jwxto||vruw|~|dzvtv}opul_xsitxm^L}x`acfjw{xqeosQepzkV_n[FgaQUY[dw|s{{~yvt~tlu\eh^b]_jmwwzh`{cYY\k~t\{jLguwzoszop~ytz^h|vn{vx{z{ubz]dV]gf\[tzr{k|x}buqbeyzpupaajqu`olnrtgnuki~dZ]]Zgr\e[^||wvtgZhs{|nsxt|ucquXf~zzuqsvkijvy}vpdv}}r~t\{nVX_hqzwih{zsty|`}kseemcMQvxn_MFKd{ue~rvuou{~~Rkw`opifltrlru{uwzuricyzqq|UZ|tnoW}z|uxuwusmt~lPkwzeOPRQSkvchy}{vnrt{}vt|s]fyqemtZzqvxy|{ordsu\bo]WV]{smPKst\GNq|wwsg}}{phvxzcvnvpjw|um{|tp{q}ybmlq\bh[W\fomdaekuqubk|yb_abak{oRL\aqvfscjox~{y}mtp`egox}ve[an|na{yxohkv{qds\d~rs~^ktms}{tzlx||onvx_milmbd\NFXwvbYUWl}|x~wvzr`lzlh}T`koyxx}{tokwr^j{sjbbwtyq_tyvvwiTObv|~szrztznvx~Yf}}u__bekvsyxz]qx}nY}|lnrpjgcZV[ceelvi~jxzmic]c}vYUa_hzp_Mou`cot{aw{piovsidfimpmaqx~}p|vqx}ovbcw{xiS}xljnvxqrx{sk~~rg[{qugRRX\_l{ygXSTYkxx{~m}xwqhrwRtjcmrx}pkvxnoidfxr^aqxuo[ur\IKe}}{qljjpztuw_cjvlgc^]kymkxx}cmsoy`rxgbfny|nZPRX^eqcS}{|iimmlwxng^ajkdev{~zk]e{pwrt{{qq|taX^kqrm`Ro|~fn}vryodm|skanrvuuy|xtw~~z|w~lru{xasmws]UPKOgz_OKQfznw`n}}vsw|~{u^omj{rt||smpuy}rnmikzwdmvy}df}u]KNbutcog^w~yyuy~~{rejiz[R[dl{y{|v}~~e\smjggkmiea\WXcdPnlqmb_duqjkvgot]d{ubV[r|~{sv]}~yj_[]djfYhssupken~n{fg{lr|ht~yifrxmjpxtm~vyqY}wtlZVUTWew|tjd^\gyifr]d~u{yy|jtq{}r|rdcltyysfnoiilwvyysum_vzk\\jwxsqqggsZb|}{wx|}qbr{fYdbXh~sqyuou|}pfvkknprncWV^fikgJTykfsy}~}wqqxtyzU^{rqdX`vyutvsvsio{xnnrpi^RJesqxf^airz|syrXxshu|snqpmmmr~uyxbgj~iWPS_s~l]W]mdcaK[s~{ro||z{oyuwtuskgimnf_zx}vpruovqtgpye[cww`Qa[Sxtnpwwt~}thts~tmk^Yrywtu~zs~spuxpdXOKKZqkkgS_jqxzunrvU\txv|y^Oe}srrk|{zsmvxrklprpeT]xkjugacl}]oqfmqy}evy}yqzn\]dflyu~{~ukwzzkXMYvS>ISWWQGDTqrlmuwfm~tg^o~{pdg~g_tziZTPS_nw{zra`bDLqupnnpv{{vmb\hxxt{bPYt{xi\Yg~z_r}mutfZSONQ\dZpxxutvwrjgkuzh]fw^HK_giwv^Wh[Vywswoedfo~~qzy}yq~u~vkknr|~ob\jvfak{zuz`bwpmpz}eX`_U\txvy~~vm~}cQJOazzrov|tgYKAFVgs{zyx{uryzmvuy{u}snoxxc[d|zssdLJ`vxk`mmTcth_`hpvwqgbchow~wqnp|dR]n|}k\]lzntvsuymZPPZkscjs~zpfdiqvwuvvu~vg[X^pnbjzkQj{tqrv||uolsxypvvysaZ]i{whbjxfajyx|~j}tqqrrokif\Xnf}{~sfi{~uqfYWh~dar||r_KEOaovwpgr|q{~||w|~j{pjhho|ysrxsq|}dNVkqosytipt\dtg`_elnhbagt~{|wmjlt}|qgglpw|pimx{{oxrxx_Yempwwfrmqxsiglqsohq{w}w~~wxhckyzsrqnn_cxnmpsurjfiswyqtprylc\^isrjderzvmq}ynxn{ztsttmbZ\gyo|v|xqxzvrqw}fT`{velrrnh`Z]fmpqlccsi`oiv~jaajv|vh`dvyx}sidghky~f\mych|vspke]WW]frz{ypmt}}rcZ_tzypio~nk}wmvhgmjbppswz{{{ywwwvrldaux~oowvyxnnxrblwgj|}topqld^^etx{vqvonqwypaVVawmdx{qvkezsia]^drzyr|y{ub_iowou~~vhYS\n}{o`\lfSj~xko|zsntsqtyvk_Z_r~o`]h|ulpxsW[{xy{zrdWPS`r~vuzvv~yj_^g{xtlkq}}ws\rtf^fzwc{|tliox~|pdmny~rknwudhujjvx|cX{sn{~rf^\^dpzttwtxpgt}uqqx}k[SZoomyv}|enqfbdkuvhs|vy~y|ywx}uf_g{n_WZfs||plscQi|trwulu}xy~|}}{obkm^Y_o}tfbhrzsnyuw|sokmtni{puxjipyukhn{yjci|zrrbiPhtrry~vpnorvzxzrlknstmcpq{xmfbfq~g]j|{zkqncsqipzwmnurg``ivxjswqopng`b}|}gafoz}rklta[~jcqofaaelqrokiioxxiu}omrspq}jabkzzvz~srtri^Zdpmvk_YY[_adgf_`tiwwmhhkoxseiy}}{pigea]_jops_X^gifaadkuzo]n~~rgbhtwpqjhmyojrqfbjure_aegfddiq}savxxxh^[[[\^ivgaaht}{pkigglu|meisq_U`nvywgb|szpd^]^_am{tundgxqkkjgfpqkihfcadlvjm{u{wfhrpfcm~qign{~ufZXZ^bfm~|{lfdc`\Z^iw}okx~ysnjggovonvyvsidccdgks}oqwpc]_bgmuslymtxrpokffzukkr}zqg^_nzvq~zrle_^air}p{so~vruqg_\[\`u|pijs|{wy{qpsvvtrwypecjojhwxk}prx{}}{wqlgc`_i|qbh|{y|wmilquvtr{}tolfa_bkyt|ysx|}|ywvqe_grs{{y{{w{}bV`lmhcck~u{tmf`\]blyvo|~|wtsrnjs~}ylegnsrnijxv{nnvscY^kyvi}zttuwyxuqoonmjl~{zzrfdluvkcl}}sg_^do{zls{yww~xd\dlh^Zi|{}zz}~wswzrorvzzywx|vkcete\wquwxuojgilmicg~zyz}|{}t|zlddjqssrs}|ukfeipvsgr||||zunhfjonbZpxxsklme`foomxt}rhccgnpe_}vo{}rmnprqoms{~}oc]_fmqrrw~|reissmnnei{|~xphcbdhihhw~us}}|mb_bglqtswytpnpqi^p}zofhmgZV]i}z{vprz{|}tb^hrvwv||yvutsnmyzunf_\]`cfp~uoq{x~raXX_flor|{|uqswsc`~zpg`^^`cixvv}~q`VYfqmaax}yvtuvm\`{xu{~rb\`gjnvu{}w{h[WZ_beir~~~}vlkzx\ay}ynbYWY]ai~}tz~m_Z]aegku}}p\fzv|{pdYW_ihaoxolpz}xzp]\glgdjst_kqluyl`ZYY[]f}sps|w|uh^[\^aelz|ptn`rsqy|qf_]]^_jzv}sx|qf__``cl{l`tvfgnw}yj[[eg`XYk{~yvy~yuw}uvyupnpqqqr}wtbcir~vht|pwzrjd_[^pyy}vz}v~nkt}}yxz|}}}qe_ckt}xgopjqz|uoje_]jwwxz~qrz{uwnb`dlu}zjatwgl{~umptqjda^_hx|}uxwwysupffpqcaxnaagmrttqmieb_`nwp|{ty|v|qfr~smmqxyk_n{f_bgknpqlbYZelmx~otxxssk`rxssx|wd\o~zqidfmqqnkjjhdakqkw~|w|~z{v^czyuz~nbsmbadhklkihhifbeuwwtou||zx}|c\ryx||rbhvfabhsxn^Ybjjcanlgry{wxvzn[g{~uYUvjbcfghfddgjkgdkufmux|zutzyai}{}|xj^nuhfhiigdbdikdYZvmepwy}|y}}~m\hx}|rab{a]kwtib`bfhhggqscirtw~x{uru}dar{}ug]mxlllkhd`^_beeei{hdtvs{ztrw~{mpwx|}q`\vqlmnkfcflj_WYcrxeiqqpv}|zzxquk`lvy}|tjm{|pmpqnkhc_\\_bejzsgnrqqyvvpqx~dcpyzfYjvpqsqnic^\\_bfn|wlv~vmo{}u}snt|s|wahvz{wb[qtplfemupbXX\`commrpmq||qy}truz~~}~qco{}~d\s{ompstqjb[WXZ]bqzknror~zy~~wux{}|{~]Vqp[_yukkpstqj`YZbie]gzosutsxz|~}yotyvv{~gfwnYc|e^fsyvmd][ZZZauwovzxw|yz}xwxxwtruxcfyp]g~ofjpvxuog`][YZavrdiu{}xw~|xvvuuy~~xg]jralofjrwuk``gkeZU]tpny~z~~xw|~}{{zwsor|obnwfi|fagnsutoic^ZVV`w{ko|uu|~||}|wrnr|{jbp}lfxud`elqsrmhc]XV]qj]nuv|yqmtxlmvr`_u}jj}qinsmffmpmga\Y[j}okyv~sqw||zxz}~zskhouhYc|{nwoccglqtsplgc^[arzlp}{toswywuvy||wngk{kV^xuoldeinsusi^X]filvylco~}pq}rglyzqlpvlYZskh|uhbdimnljgea\]ixudcs{stwvtsuz~wpouubUeuopc`bfjlkigfc_[`ryonqvyuwwussx~wljsmRQk}nu{i^or_X\][VQS]n}|}}vlqzsqlx~sldrqhjku~|oSUpeY]_`blyc{~qhdYtjnd_`hvvodjzf|~zsnnjlYgkt~xzxxk~{gxpixri|yr|vXDUqsxkktw|p{{ovvoXt|\i`js}xvrv{ylxuyxrYdn`]zroYZea]XA?V^JSpril{zyxll~|t~{ogM:Dmzpw}v~uu|gpn{zxs{vxl~hYYhkz|lfavmlk}vi_`qXUXe`urj}]Wmtxyt}twysUX]piyyzadSgbSos{{iiQ[W|{mgejdvnz^ftpoqxUrxwqnlk~wyovvztygwaixm}d[rkm{ynacmlzTMGYZoyutw{fo{pkexv}c{zr{iaOTwlesoq|x|}~xwku}pjspq}vWjsfXdV]TfbLRb|zzg~kmk[bvw~aehwx|~m}zdX[P^QZdtm{ig_nctc]bpvz]trizigr~eXYfktht}gti_}z{t{~zt}whX^\fzvsh\iI@Gdrtfw_{y{j]b|v~qx}kKL^hi|p{t|}ss|zwpitap{r~sxhmyWhjbQZ\_`ZbSdtpt~rxd|zyhjn}yxmqsx||wrtwnyjXgdJFjolxxqycSayhjp~u{svitjare[dkV^p~{r}~}lddmfooxmMN[e]t|c\UgeVftfhpwixlxvmx{qe||lU``JOvemx~mq||poqy}s]qktnz|niR`kf_jlULRtgX]oqt}tft{ntws~zmavwrrd{hUZQ=fw`wyxjfgxstxq[stvqthg\VTgsiqvoe{ne~|yr|xyqweu}zverfNN]iqzwe`eWUvfn|zsmerdctzw|wknbbhKW}i_qwnysoiluoyyrzyrmon\\zt`]W[\e_JQclmo{utwrmlfiuxmpm|{}~v~|rhmbSXDDksxt{vt]fsfltk_dc`ieTf|}~{i`u|{zqtpem|wkjym\huk^oxwza^~oc{xmpxyupugh}n^jum^d\\eVYp|on~~x~rj~vwsp}xvqeyx|w}odqvbPSf\KZr|sumzz~w~nYg{ymnzypsz}u|zcdqkSKPepag{uvsppmvmmburfky}tlrphuukp|xgqjr}mrr|{u}ot}tkygcfks}rh}|xnsw}t}}pw|dZovrxmrz^djugRL[dV`zzei}}eZy_kpv}piztmaQVikdokl~urrmhuwoxufevzzs~|zyppsr^hpdX`l]Qf{qjkuxo|~~zh\o}x}r\\{xgnmhj{mtzklr{u~{w~j{y}~{aewrhdqsgms{ml|qnrmuposjs{zwawne`ZKPgrhnsq~y|wwysr|utongozhery}{{llkbVgqUu{j||y~pe{`hrvxrwoqz|yzpz|w|}rxooqpdSX`Y[}u~yfuls|pgzzlfospy}l[ilnunvuv{tn|pwfvf|x{cl}whnf^[iyx{z{~~oq{}tn^zpo}jo{|eb`bZZpzeYu{rw~onyxkh_hslm|yxno{~jkoxqce|r[{nktpt}vyvfi}zzw}n{yv{|uwqwuef}{kle`IJdtghv{}z{rqp}w|ni|gfrrbn~ogz_rkhz~t}wxx}||wz{tjyy`de_boyexwpp{}{inzsnyis}hjudflup]`jmp{{|wv{yyeougrcWu}fikwt|uvtesrsvmpp|~|pzxtecwqs}rldpjz||~|}}n|{qqqa\VZTbkbRj~r||z~}gl{wo`ovym|vizai~t{}zl{~qylu~yty}qwwc^onteiwf~}sv}xudxup{qo~yvdburqxoeQaz~ktzyv||v|sxzsrkrwfusgekZckzzw~miji}mi|oumoulpfwsp{zf|{}}nxrxzrmt`]hmjNR`e^sz|~~yxyzqrpwtqkmlu{wwml{qumrluyr{opzwxsllvxlxs]kmloqhwy|vycxuiwmlzojvlfalqfpsh]stxpnipqlkqzcYgibsrvba}{vl|yxwktnz{txxg|hlvznrxuuy{|s~l}~r`dxoth`ZNbnj_ndkz}xvz}mz|zdvqgxogyslvr`lozqzyx~v}t{w}lsdfzg_exeXa||~}{wyq|yqroumqbkwww_foof}|qm~}{}|}v}yui{}~pkuf_jxgj^dln|zuu~nwzyir|t~tgwi||rc|sityr}{~z|lttlo|p\c\j\\hiW]suti|wtqyyvu{trmxpyg_liqtv`j~y{}v{|q{x}|xts}qhjqhUjidiznqx~x{rz||qag}sytoq`n}~knovqw}{~}{z~mzzy}|uqjhypjklT`hv}mz}~pwqnxvutxvx{{yk{xq{mhs||tx}m{rqksyidfWfchdRZcilpa~wq~nyttsnt{qouecr~lqenqmyx~{sv{vmmujtx\b^iugahmi{}z|moupr}yjujxqpxqi|~h~~}smwy}mqxvwiujyu`T_agwlykp|{{lyvqm{iv{jtuevtpuvsz|yx{szuwv~l]\j^ee]bSguf\|phy|rtnt~wssjf{wspo\lku{ny}|||wyuvylzaxobm`maej[Yl{||lulvnumk{sf`{gtruku}yv|o~q|yvydj_Y`qeikgwm}v}x|y|pn{ytzrt|ouqqwljni{~p~w~y|hioebjfYdZrmXeyhbtss{qu~qxv{slzrxe_kclslwfry~y|x}vriumtqomhucf]Uechqudusyv~rlvws{bsykl}ysoeyo}tq{rmxx{}xkh[qohek\ilo}iiy}~~wu{|l~y~~zsvtsb`pyx|yt~|~zwv{itdrqe^c[jv]hiickmzoitj}wu}z~yzt|ziqfchobpdm~xxzx~nmxf|~ogtxomlXe\ksdZ_]bwp}|uywycmqto{yqhwpnudsqs~rrr}}{vxeptnykbcjbugbimxrzs|x~np|~u{cgropytry}|}zux{xn{hoj_btf]mjo\fuwjqkgym|xml|v~xz}ttdtnhei\pyuvjwy|ylqk~v|lp{nvwpgqdtoaeWS[d^tir~ufo{ntoygpvrtvcpeqz|vvz}~}{{{qy}rknpgelaXedxcfrx{u{~xvwsfuizzqltm{|wy~z~sywpu`puo_dhpc]xmnqqkxoot_kkp||}zyosxitjbcrowhrlq|~x}yvz{yr{xqbvpr|koqstllbR_ZX[aXnpysusypjmqlukswsmudw|vtloxt~}you}qyqhtk`WX^tYc{onpsxs}xvx~}v|nzqzpmswq~kz~{uzv|}fxvtp`im^Xukttiqwvww^j`g||~~{w||~~m}jhoosp`khry}wxm~oejgmxetmlyzxhWfT\^WS\_uj|qyhp}lnqf{qpsso~yyionloys~}{~m~wtt|gj[WcfOepgpaisxupzu|~}}x|nzurnga}w}w~~t|z{{whfziY`hjzfquowxojgZupt~zzz}{~zk{mz{fbulgtn}}oyx}trnihndooe~z}}vim]]fRZWYcn\k{y{yk|vkidzmnxls|irkbpmknqu~tm}pow]\odS\deiTgjhpspz|{}}xz~~zryoaatnru|~}}|q}y{}gyeffkllexlo|mlhehtfxujwvx}|u~xugtwidevrvlx{jrqkgibw}wwrpokp\^cSfi]Sagsfmw|njmlj{gs~}~yq`thdkfix~~~zpqn}ic}i^^fc\P_bXldemv|zzkwzz|}zx|yyaiqobdqnp}x|~wwvxv~qwlpyrlmjo}foi`iqtzsfyjmsjbivx{s{xkipxq~tzt}s{~s|lrliltuxoymprqmmZnr^ZYd`UXyrz{qwqmnins}ytwpbtccqvslkt|ytw~|t|kocniZSVQ`cRggnz||igxiqutw}ysrozrtdepqcrki~w{w}ywwxtorwroongt^^pnv{ywxevq]__mqglrm{{wwtyu~rty~y|zus}sqmuvy{rtybrtoqqpzvfkYdfUR_cr|l{uuuolqqx{uwxuxhe{puldp{mxu|~x}zgta]ZVTVPa`[wvwvsmrcjwfpwzzzv|arvlb`_uli|x{s{yvuy~{|qwsng`Yldh}wyzzyzbgcYoj^fwxx{oz{wwwuojxs}xx{qqzpv~vnhewgivns|{lXtpSW\befh~qxyqvtw|~}qq}uwxwxzps^qwmfl{wwu{x|{{xzvdxsquhnx{~fv{tiqtx~}~v}tqtv|_Xsigmmr{wv|v~zoghksq}nu~|shsxg{}|wuxvvz|voji|kosqpofrqgmo{|nlvkvnrx}|vnjki|xn}zeluuvbgbYWenyel~|}~kx{mx||yso}iernzt{ums{tzvf}hraRVTV^dqgnvquyy|vplktyodqo|xyx~|t~ixy{v|bbih\U\xrZr||}mighkrq|m~~topq~w~{|~a^{vxvtk`YU[uks}dxuogpwokt^err}rsononzwwrTcp{{iejlaVo|htqosvvykpxywoheapk[pvqysmsiWq{knmnmifs_arorv{qxtsykdjpyqw~tz|wttsemmmzyicll]joippyelsuvwu{n{quyuqonor|z~mmm`inyqfacfsnzxyxwkkyukeamr\jrvyrspot{t|siwocxy~tdgpnxe^rpqtw|slkgdcbevhn|v{y}~x~un{lrrip}xme]goZjsuzlsockqtvtn|{uwzsp~~{{~znYhfjtzobckxr|ubuqwxwvuvgay|tvspqtz{rz|wu]kzywwvutr|o{us|nf}okeccans`t}ux{wvooo}iyz{w}~shaqj]qsu|su|ededbej|hpu~yv||xymr{h[iflvukebeudjwygtvnwwvutyigroyuq{xywlorW_iiuvrtvtq~~zwv{sr}uxvrmdmxmxtr~uwwzzt}zkdwzfv{}{yv~eqx}wyyicdcabdxym}~~qtr{tsstuuwgxwvy~qheeukby|eowddehmsrxfh{uxqpxvvqyzqiq]Ugiqxqlgejxvu{{tivwvurmkvb_w}wwzp}}zpgaanZXpz|~zx|vp|vvztttmd`fvba{zyy}ohiksij}}xqqxgu}v{fvrbdcdfjvnlzx}wuyzxrwwvrnt|bdor}vojfdp}m{|zmdypgptqe]rghv{wssx}yv~wj`ZdePar~vsompvau|y~zz}utoha^nqd{}rvsrlf_[Yig_y||ywucu|w~ndcjqlarsn~yuw|u|oknpoln{jewy~wlfsyky|qbutdgknpos{bdvy{upv|syzwrmhllRbxuqmmpv~{{zykj|tmabnnql]v~uy}u|uld^YXgcXs{}vl}wz{wske`^`j~toxy~wzxv|lhd`^_l|c\o}umt|iu{lzokun``k}}aiwz}wsqrxvyuwtolitkUeqzxrv~{tq}|zveq~prtrlfese\rz{xuy~z{xtmdZ^pggps~|{|~rs~{{|}ywtaktma^q{kzsshea^\_sndx~zpwtir}|ebdgjmvrp}}~wsr}v~qyiijlniig[ozsz}uprvzgqyeclrnitjZluzywusu~t}yvrkdckXVnywqv}|||}unuqlfb`js`i}|une^bkvjQg}~kxmk|rgaciq{l}|{s|lgfffiq~i^mpt{yyz}wfvuhlopppzgeryzwttvvp{rvth[^uxX\mw}|~|}{s{qquofaapl[m{yz{~rvpi`Z\mf]s}~{m}wogdb``i{ro~xxxxt|iejpj\athgtsv|}xqu{vxxcfkopq}jnywyws{xysnwjlnnliqmU^mqyzx~yjlzrsrpmksm]u|yyxx{szpc_fkeiaVm}xzgx{mgc`_duof|{yx|uha\Z\evkcv~yoqz~icccejwm]s{v{{ynw|rsj\YboybXjrx~zx~~ht|ppqqons|f_qyxv|}xk}sqojb]akYXo{~xpuqnha]jskt{{}{~yzychnfXTbrdisr~w|gba``dtqu|sxqw~rs_]]^`cqvcjy{}yxt~pj}sfgkoojnpi{~~xsrw}{luy`\cgdajeTdv~{|{}wju|rqojffqj]r~xr~{~p|yle_YVZjd]xttshb^blw{dc{ys{dvseYUX^lyhj~{yl{vecdfjp~mo~zwwyngwnbcdcbdqnXbv{z~{jowqsma]jzam}xuuw{}tqvlkjc[V\j_Yrxw~uvnic^]iwjmy}tzvu~w|f^ZWVYkugnyzpyxvqbfooeau{oz|y|s}yt~f[]abcjwk_ox|{quhw}mknpppv}hdwusyzkf|zkhfc^\dfYm~rzk`clpmskav~{}urf|se^YVV`odd|}wkc`_agxms}~}qztq~o`]\]bkwiRey}is{uj`bmzocsz~}zwyxdsxkhhfccjnXWkvrpwurniittak~{|wz~{{ouxjd^VT]us]bq|z}~notmb_k|rl~~uvsu|f][ZZ_nyhhy}x|yqvfdfikp~~ilwx~{zzx{wlk{pdehga\fkdntt{zrudhpropym_n{}{{|s{|qhxtjfb]Y^h[Vl{~w{qkgdepzlnysxp{eZWZcimgVd}~nmtfabgo~lq||wxokzo`^_adkxs_gtz~lnvllmmmq{p\j{yxzvgpvmg\SXjzjTbtstyvsmgelxldw}zy~xn{pc]WST_mc`t{{ujfddiwxmty~v~unwirr`^ee[Taulhv}{jdgjloymfu{~}wtwwm}mcsvhcdedems`^r~}qktomjgemtjr{z|~||qn~dUV_dbfhZbzznrukfccgv|nvuw~w}pm{q]URRU^psdm~{xwyjghkpxt^o}xuxq|r_cxuj]RS^lzq_k{lovnmmllq{n_n}wy}{zodq~qheb^]eqe`vxqvkf`^dxtgs}{tviplbedZSVhqekz|~lfdehqsy{swktxffreWUWY]fuo_iwowxoprohixxr||vsruvyslj{z`U\cddkqb_sy}povokhefpsci~~zus|z~ymqzh`[XY`pqfuzu{ue`dlswxkf}|}q}h\ro\SQU]lwidu|rojkmpwoo~{{yt{}p_`qj^\]]^cneUf}rvlb`k~o`o~~vvwz}t~}ralslgc^Z]in`e{x{qhd``hwuhs~x}u{qz}own_ZYZ`n|o_gt|{|p{}qqtoeduwr~}|~}xyspxm[XZ\^dqo\^nv|{swvttsswwfpv~wtxw{tj_lymb^[WV^lhguxx}rdhqsorufgzzu|}sm}pejk_ZXY`osfmzz}kcbcfp~zip|~~s|{jnzna^`cglo`Vnxl|sebitugs~~}}|l]jsh`_^]_gkZVhv{xwspmpz}lo}~vw{~xt~}{ysghyucYSQVeyv\[o{t~yvoebjyyjq|s{}{~t}z~|pr}p`ZZ[`kzvgp}|qvuifgimusbjw~r|}yqdnzpgec\W_rpgnuy}rinstszpgv~zjy|qe_pyk`\YVXbj^[n~{|smjimzxs|}~~~vku}~~}xkcoq_TU]egij_e|qp|iaaem{pkx{{~yusxuw|mdqte^^`dkw{jfvqk{rkjjjmvveh{{|}}uhg{}l^TPYjzv^]qvn~{uqmkp||mtwzwuodhwp_VRQT^mmak}}rkjkp|jlzt}zy~yiq~yk\amgbd`WUcxvlv|rfegjnxqep|}xsu|si{xi`owldccdhsxjfx}pnulhecgu~vw~}}x~xmmyoYT\cddki]g{|~xp}wnjilus}~{strpx{}}ynahreVQQTZhumbm{w{qoqtw{yij||~xusvtn{}vk]]t}lYPS^lz{ihxqn~~rlkjkpysbhyz}|{yyodn}vica_bkwpgvyr~xib`dqrbp}|s}}j]gokf_WSZjqdfw|tlkmq|tx~twziqwi\cmbWUVY_jreYfx|}wytnfgxyqw|~~wssu}ur|~{wusmnuj[[adfkupah{}xo{rkhegowndqxq}tuw}|qlzpc]\]dr{ojuy|~xtoimtutwuks|xzwg^kwaTQSZfrm^dsz}|zursuy{mv|yzq{yoaYgpe\YXY\fi^`w~mceo}~fcsxz|vvx{qnw}v_]qvmfa__gsqdlv~~pRhp\[G=LG7GOANeYVppcwn{|c~{uyyormB*fbZiamuah[MnfqM6zG5,5I<:USUƳ˖hdfRWtlfGgkhZhjpqarqvtq_`gjJWT#HaSqtf~agҲˡcaȰoC$-(?T7iKOoj+MrOyf|dJZcrWXfshMnjGn]>SYGʲseu|qpcjxbWwēzyKpeZLUwyiMQWjZdiNNeItI<|_y}wZppe|bz^dNcd@L^A{|itbZmwoUcRo^Huۛ]u*#bc]~ш[dWi]fhTAlIYX_p`yi]t}vZywb8Va}¤}xtuhRYN59iokxRtebgel\xa8<OwzuxoQkomydQ`SVxK8O\Vviќ}gktdw[Fb}Žrned`dRA&mnU}oahcY]zB>U]ak˖gVcz^]ucJ>`˲~rcgbdjRB[K7TrçTq|idof_jmo>;5(x~zTKowcyQnmWL[~i7AZ_uxt_q{^yjhMMyӧqtzG\LYV9;U?2l}z~Sniix_guv_;L3TJmtov_yd]OrT7P`gӧ|d_Vn|ZSP_=\cĩ}safqXzf`ZD٩grw9XIVQ67[LAN}u@Woc`qZYcObu^:I^mĽwlxYjZaKiMUˤxyy]P=SIYC0EbBTqėt|ojcsfS[KAJXxQXxx]aXm\dwhDF\grgzTVqRVJWRCѨv}}dd=WO^O;FkQXmɡͪqmcnfPVIaHNW|ɧokcpeVUOBIgrpYa}R_PpfgriMFRbyt{nSTfQbMQUKέxz~qo_ARU[L=GfRVQ̫δqmdne\TN?DkdvgWZx~G_DhdbkgQBL]smxaWh]icNcSֹ{ximy^@GPQG6;YQLBpŭoncmg`]PKDuiwnldQvEjoilj[GKZogrcNYV_kA]TtҾxrlp~dPEVSO>AX`XGdĸГtscngekJOINI=7GZXHFʱĨ~sdiifuOVF_dtrlv|Y]Khpgee]JKfc}vZOMXofBbjs˺ly]{sXRATKF=GYg_E}͸ɐuoakbpcMQJ|ogjukzxs_mAOfk_aaVDYifǮ|YQTj\O{u˧rli^VU?@K@;:IZjNQѽraeceSWRgkpux{ubiD[ph_ceSLjeqdOCUpusKZmeqYpxMX=JHA=HWmvRxݻm\f]nvNWVvjk{zuyxzj|rc}X?Vl_ZafRYpiŽteQEb{vwMsrǹ|bvzNxeEO4E>:9KXvqVٯ{dZb[wnT_hpq{wo}toyTC]n^]fmUiqyŸ}pyxXCAgytnnJqgcfWRLL:IfwkgtSnea~zaV|PGN:E<>J_ouܨrXZYgaZtf}qxwy_ji~beI?^dU_qleupŻwo{oSA]}shyisvzy[uunKs`>K?;;4ATcx޶ZYXbq\pvtuyfkfqb`>Wi\[ouhtkvfwnY?Ovp_lqf}py]ottPnjEIK<@6BSc}ʟ^ZXbs]jzjruxcc^xVe>Jb\UitiofǴyl}qfHQwwbkzmprdmsrRhkIAM<;19L\xyϛcZXcxdjlx|zhg_VmHJc`VitnlbɲrlxleGQsqZdvpkifouoYljOCRA=3;N\zԟd]Yivck{}ltzrdcYQjIF\\Sfnnc_˳rwyqkQ\xr\h||kgluzvh\ldP?PA7-5GWrrМf]Zmwhp}rzrig[TnTH\`Tfosa\˳nwvkkRZqpV_wyl\rrwxi`ndYAPJ934HUrrتq_\lvlkwquocdR|Tc[BR\R^kscV˹wz|ms^asu[`vyyXztuxi^na\CGO70,@Ljiӵ}_]gxulxxywclUqiZkKL\Y[kupSoiod]jr]UhsWnt}vrrZpd^Q@UB5/=Kgmz̠i_b|xo|yyvz|_gVZ~PeXBPXTdp{VnɮopmpemtjVcmn\|z|jxZhjXZ@GN5/0CVniͲx_^pxw|~ywnahN|hVkOFVY^np[ƽ~xyvgkjgmkZTjnXoz{|{knkWt\ZS>QG52=Pmn˧o^eyzxztz|ZdSVUYcCFUXdv`vŰt}minnpogW]rZ|{ysarXbmQZH>P=23CZtnf\l}|t|tuYgLizR`bCHX_meuy|xfeknoh^Tajs^|yvsg_mQkdOZFBS=8>Pl{~ǿyc_s}ospcV]EppJ_Z>GYctpŻtogfqtre]Yoojl}wsm[baRrUOU?EN7:CZwxóqv\e}wzqzZ_PV~eLiQ?NblyȾ~|~sxccettk\X\|xcu~y~~pm^WeQbjJUQ@NK[mŽr{wtaeh}qY[awwvr}yvqgQUXMheHNVDDN=GRrt´vh{n}kue`JSqrxYSjI:Skp|wr_aeyrYW^~xmyqsxswfPRWJghMLZL@OCISps¿~m{}q}jrgaFQmmv`NgM6Lh|r}{tbdk~w[Wa~h~vryuzeOTUJkfMIYN;ON^aaƮzz~txpI]ocov`QbGeiVLJ^R7DRWf[wx|xu]NmgfsvWY^CFkwd\`sx_WlzrY{jYer]IQ:_dUNI[^FFclxfw~xw}wYQga\lvbOdWNj|}fW_qjdt}qgqpOUm|yZHK1Kc\PKOaXBTmyrqƻ{zw{ytOag^bswXXiW[~~ypZVd{tei}n}ve~ZJ`t~jJM89]`UOLXbOHgx}kŵxy{|xV[f_[kxeMebVn~qzcV`v}lizwsnqlJSn{rTLA/T^YOMPaZGYvoȹz}|~weYib]dwtT[m]e{|}p~hXZnqjtvktjyOJgw~u\ME.N][RON\`MRss|{{|~|}wiZj`\_svYQla`qv|tym][ovmvvlznzWHbw|x`RG/JZXRNMV`QMlrx¯}{z|{~zn`oc`_ryaNkhaktyuun`Zn|wnupi~{psZH`wzvaWE0LZXTONS_TLi~o|İ}{{zx{{kfpa_^pw_Jih`brzuypd^s{yrxml~{~ss\Jbyzub[B4QXVTNMQ\SJeyj®z{|{w|knucbaqydKgmb[oyxvqf`syyswgjyw~wl}aK]wxtd`C4PWTVONN[XM_whű|~{}zw{{kpwd``kwjK]qdUgzuujbqz{xygiyt~kykPXtwtffG5OVQVONKWZOWrg~Ŵw{|{}u~nr}kadiwrUTsmWZ{s}ymfl~|x{zkavpynnsXPivriiU3HVPTTOKQ^YSlkuĽu|q}ztlq`acpucLhv`Nyx{qkiyx}~u_sqr|gteR^trlic8@UQOUPMK[_U_ml±yu|~ztzg}}g`divqXWyrRczvuumjo{x}ffxk|ofp\RdpjfkO2NRMQUOLPbb[ikþǤs{~~p|xyolr``dlujSegO|trpllwx~w`tqnfikWWjmfhf:?TNLTTOKXhcakqön~~nu~eyl^cgqvhVra\x{nnlmnz}xpcyls~`ggVVfe`i[3FQKKUSON`ojgmôĹ{n{mxqva~|g\cfrvh[|]k}xzhkjnq|~|{kjzi{y\geUWe_aiM4NNIKWSPRiunjqɦrosprviksc^gjwvffy^tqaijqu}{{zfuqkiXi_SW`Ye_;?RIIPXQQ\vzpinxlx{m|tayj^agmytdvjn|vfciotz||~mnxhw~[]iZR[Z]hL9OMGJVVRTj~zjqʥvmvoowzeptd^hkvzoj{isp[flvw|z}ukvkmgShdTSYVgUU\^YNKJMXge[r{||z{vz{riax~wwsqw{sw~gmoko}vfix}qzyrrnikltr^MbpO/EU[\XMMMR^ld_||{xytzyn`a|~}vxtu|}p{tbnkhotdl{yrvtrlgkltnYLflD1KV[\XNPQYeqdh~}|yvws{wfYh~~|vzwz~wpfcnfgr}ncpsxqupjfkntfPQn\6;SV[[UNSU`mna}|~zvuut}~qYXu}~~zx{z}rwq^hkciyzhfw}qxsumfhkpo\J^lH4IUX\[RRW\hrgj~|wsvsw{aQg}~}w||~~vrz`amddqqcnq|~pvphekmqdPQlV8BTTZ\WPWZdomc|xrsus{mNZ||~~yy~~zte]jhaj|yggyvusttkdimpkXMda@>QTW\ZQU[bknb||ztrwsxuPUw}}~{w~~{wh^ikagx}kdtxstrvlehnon\O^cEAOTT[ZRRZ`hkbv}|sqvuv}{SPr}~{v}}~|zk^hmbfvoco|xsuqwnfgpooaS[bIDOUSZZSQZ^ff`t~~}trxwv}}TRu|}{v|{}~~~i`jmbfvobnyvttqwnfhqppcW[^KJQURXXROY]b`^vó~}tryyw~|SUw|}zu{{w}}}jckndgwqcjttvtqwogisqqf[Z\OOSUQWWRNX\_[]uô~}usy{v|YSs|}zvyzt|~|mckogdtuefprv~tquqhhrsqk`ZXQSTUQTWSNV\]YZr÷~}vsw}v{_Rn||zwwzr~}z~rdjnjcpzjbkowvrstjhpupne\TSVWTRQVUPS]]XVlĺ|~~{su|yvmRc|{{yw|rw~z{xfhlldizqcejtwtrungktqojbSOV[UTOTVSQ[^ZSeľ|}~tsx|tz|YYr{|zyzvq}w~~jfjkhcqzkafl}|usssiiptnniZIR]ZTRPUVSWa]UZzı}}zrtzxriUbwz{zz}q|~yxqegiidfwuf`etxursohjrpmmeNFY`WSPQWWU^c[UkŻ~|vqtzss^Xiy}z{||yq|ux~hdgffbizsd_f|}vvrslhkqmll`DG^aUSOSXZZde[ZzŲ|zspswossZZjy|{|xw~yrysccecdak|rb^izvvqqjgjojkkYQairuuy~yu{x{}{~tkijosoihebfga`n|opuqkkihptokmmoph\WSOS\bl{{fL:8G[fntvw~}wx|xzwjginssligddhc^grottmkjgjsqlmppqk`WUPPX`gv}oT@8@Scjrvw{yvw}{|{ldhlrupihfcfe^bwvorvplkhfnqmmqqqncXUQOU_er}uZE:=M_gouwy~zu~x{}y}mbfmsvsjgfdde^_s}xpswsmliejpmmrsqneYUSPT^eo|x_H==J\elswx|zt{z{xo`emswukgfdbc]]p}zrtxvnmidfmlmsuqneZTSQU^fp|x`I@>IZdiquvywrz|}wn_eovyvkfec`aZ[p}zuvzxpnicdkkmtvqldYSTRV_hr}w_JB@JZcgottutoy~~wn^eqxzwledb^^YZp||wxzzrnibahjmtxqldZSTSV_iq}xbLEBIWbemssssnwwp^bqx{ynedc^\YXl}|zy{|uojc_ejmtyske[STTV]iq{yeOHDHT`cjqsqqnux}t`_ox|{sfdc_ZYWg~}}{z{|xpld^`hlszwmg^URUU[fowzlVJGFO\bfosqpor~}zzd[gv||xkdda[YW`{|{{{||tng_\djqy{qhaXQUUXalsyq]MJHKV`ckssopq~zl[^pz}{rfed^YY[o~}y{zz|ypkc[]gnw}yle]TRVV[fputfTLKIOZaepurprx|}v`Wdu{|ymefc\YZe~{|x{zz|vnh_Y`kt|tibYQSVW^jqsm]OLKJR^cjtvrrv|}lYWhw||wkfgc[[_ozvxzyz{tle]Xbnxrg`WPSVW_kpofYNMLLU`dnxytv}y}ycUWjx|{vjhid\]eyy~swyxyzrkc[Yer|pe^UOTUW`kmj`UNOMNWbgs{{v{wnZR[pz}{tjjib\bo{zvryxxzyoh`X[lxzjbZQOUUYdlidZROPNQ\elx}zyyyxcSRbv|}ypjkh_^i{x}}qtyxx{ukd[Was}se^VORUU]hjd]VQRQOVahr}}y~~v~jWQYn{}{vlkjc]eu|ytqyyxzzog^WZm{{i`YQOUUYdkd]XTRTPR\fmy~z{wzp\QTex}}yqkkf^aqywqw{xz|sh`XVfxoa[TOTWX`je\XVTVSQWcjt|{xzyt^STau}}zskjg^^o{~yrv|zz|viaXTavrb\UPSXY`if[XXVWVQT_gpzzw|yx`UT^r}}zulif^\m~ztv}|{|xjaXS^ttc\VRSYZ`ifYWYYXWQR\emvwu~{x`VV`s}}yukgd\[nzvy~|}xi_VR]tsb[WSU[]bieXV[[ZXQPYcjsts~w`XYas~|yukeaZZn{yz}}yi^UR[rtc[XUU]_cieWV[]\ZROVagorq}|bYY`o}}yvmeaZYk{z{~}zl^VQXnvf\YVV\`cheWT[`^\TNS^elppzfZZ_k{}zvpfa[Yg{{|~|q`WRUg|zk]ZXVZacffZQY``^XOOZbgnpvn\Z]eu}{xtjb]Yayzz|}}vfYSS^u}raZYXX_cee]PT_c`]SMT`dkoty`Z\alz|ywqe_[^pywz|}zo^URXi~xk\YYX[bdd_TNYbc`ZPOZcgmr}l[Z^dq|{xvmc^]f~~tw{||vhYTT^s}tdZYYX^cc`XMP]ec_WOS_ejqyzbX[_fu|zywkb_bqvpv{|~zscWTXdy{qaYYXX_ca[RJQ`fc`WPWchmur]W[`hv|{zwkcbiz|onvz{}yqaWV\i}yn^XYXW_a]VMITbhd`WR[gkq{|iXW]bky|{{vidfr|tiowz|{vk[VYaq}thZXYWY`_XOIKZgid_UVajmvq`VZ_ep{|||sgfm|{vkhryz~yseXW]gyypaXYYW\a[QIGPbkhd\U[glq~xgYX^civ||}ylfkx|vmelw{|{uk\W\dq{shZXZXYa^SIFK\jlfaWWajmx}k^W\afp{|}|rfiuvnfgt{|}voaWZbk{~ul_XZZY_`UIEHUgnic[V]gksmbY\belx|||tghtvmgfr{}~vodXZajw~vncZ[\Z^bVIDHSenkd]UYchnod\\beit{{{vhfswlgeq{~voeXYait~voe[\^]_cWHCHRdold]UV_ek~of^^cfhryzytgetwkggs}umdXZbis~|unf]^`_adVFCISeolc]TT[bh}}oga`efgpxywqeeuwjghs~tlcXZbiq|{tnh_`cbbdWFBJSdpmc]TQW_dz|pieaegflwxvrgdtyjfiq~vle[Ybinx{uojb`ddcdYGAIRaooe^UPS[au|}sjhcfgfitwvrjcq~kdhn{xme^Y`hmt{vplfadfdd]J?FP\lqi`YQPW_m~zxkifdgfenwvsnflocekv}pgb[^fkowwqmjccffd`O@AMWfqnc]TOS\gy|niieggehtwupki{xdaho|vjd_\djmrxtnlhbegeaWD=FR]mrja[RPWas~~xtiihegfdlwwspkrl^air~}pgc_`hmnsvplkfcggb\M=>KWdqqgaZRS\i~yxmhjgfgeepxwsqo}{bZbjtzmec`dknnttnlkecgf_VF:?NZhsqgb[TVbr~wxxhfiffgdfszxutur[Xbjuwkeecgnonsrmkjdcfd[P@8AQ\ktqhe]VZh|}txpegjfggdiw{xvw}gUXdlx~rhefekonmrokkibdf`TG::GWbpuoie[X`r}xs{zieijfgfenzzxx|u[R\gp|zmfghioolnqljkgbfdZL?7>O\htunicZ[j}suoegliggehu{yx}dRVckw}rhgjimpmjomjkkdef^OC8:HYcpwrkg]Ybx~}wr{thfklggeenzzx|nVR]hq~}wkfjllpniknkkmhdgcSE;8BT`kuunjbY]q{{rwwkfknigfdjvyw{sZQ[go||wlfjnlpnhhmkknkfheVE<8@Q_hsuojcXZlzsvwmhkpkgfdfrxvyw^RYfny{wmfiomonhekklooijgXE=9?O^fqtpicXWiyuwwojlqmgebdoutxv_T[hozzulfjpnomfcjlmqqklhWD=;AP_fosng`UTh~yvxwqlosnfdbclrrxwaV\ipzxtlfjponleahlnrtomiXC=BKZcforkb[Uazz{y|wqsrtvodba`foumaY^iqx|rnlkpwunia[alpvzuncO<:@EQ_dirriaZZp|yz~yqqsruukcba`ir|xg]Y_kry~yommntztlf^Zcmqvzsj\G8;BHUbflusic]c|zz||xymprsuuiccbblvqc[X`lrz}wnnoqw{skd[YdmrwypeUA67=HNXdjq{zplp||x~}y}tlktxwvshedbeutfb]]fprutnmtx{~ykaZV\jrwztbOA:>HPXahnwyrmq|~z}||tnntyyxtlfdbdqwjebaforsromsy|~znc[X\isx{vfSF@BJRY`gltvrnr}|~|topuyzxtmgdbdpxnifdhnqqpnmsy|}ync\Y^jty{vfTHDGNUZ`ekqsqnr~}{sqrwz{xsmgcadpyqmihjnppomnsy||wmc][aku{|vgVKGJPV[_ejoqpot~{trtw{|ytnidbdo{tpljjnppnmnsx{|xof_]ajsz|wjZOKMRX\_dinppot~|ustx{|yupkfcdm}wsollnoonmnrw{|yqha^aiqx|xm_SOPTX\`chloppt}}vstwz|{wrnieekyyurommoonmmqvz|ztld`afnv{zrdXRQTY]_bfkoqru|~xttvz||yuqlhfit{wtqnnnonmnpty|{wpicbekrxzuk^VTVY]`cfjnqsu{ztsux{|{xtpliio||ywtqononnmorw{|ztmgcdhntxwpe[WWY]`ceimqsvz|vssvy{|zwtpmjmv~zxvspoonnnnpty{{xrkfceiouwulb[XY\`cehlpsvy~xsqsvy{{zxurnmq{{xvurponnnnorvz|{wqkfdfjpuvria[Z\_behkosvy}{urqtwz|{zxurppv|xwvurpooonoqtx{|zuojffhlqttof_\]_behknrvy}}xsqrux{|{zxusqt{}ywwvtrpooooprvz{{xsmifgjnrtqkd_^`behjmqux|~zurrtwz||{zxustx~zwwvusqpooooqux{{yupkhhilqtsngb`acfhkmqtw{{vsrtwz{||{ywutw~{xwwwusrpoooqtwz{zvrnjiilorspjebbdfikmpsvz~}xtrtvy{||{zxvuw}{xxxxwusqpooqswy{zwsoljjlorsqlgddegikmpsvy}~yustwy{||{zxwuw||yxxxwusqpoopsvyzzwtpmkklorsqmifeghjlmprux|~zvtuwz{||{zxwvw||zyyzywtrqppqsvyzywtqnmlnprsqmigghiklmortw{zvuvxz{||{zxvvx||zzzzywusqppqtwyzywtqonnoqssqnjihijklnoqtvz{wvwyz|||{zxwvx||zzz{zxvsqppqsvxyywurpoooqstroljjjklmnoqsvz|xwwy{|||{zywwx|}{{{{{ywtrqpqsvxyywusqpopqstspmkkklmmnpqsuy~}ywwyz||||{zxxx{~{z{{{zxusrqqsuxyyxvtrqppqrssqomllmmnopqsux|{xxxz{|||{{yxy{~~|{{{{zywtrqqruwyyxwusrqqqrssrpnmmmnooprsuw{}yxxy{||||{{zyz}}{z{{{zxvtrrrtvxyyxvusrqqrsssqonnnoopqrsuwz~~{xxyz{||||{{z{|}{zzz{zywusrrsuwyyxwvtsrqqrssrpooooppqrsuwy|}zxxyz{|}}||{{|~~|zyyzzzywussstvxyyxwutsrrrrssrqpoppqrstuwx{~|yxxy{|}}}}|||}}{yyyzzzxwutstuwxyyxwutsrrrssrqqppqrrstuwxz}~{yxyz{|}}}}}}}~|zyyzzzyxvutttvxyyxwvutsrrsssrqqqqrstuvwxz||zxyz{|}}}}}}}~~|zyyyzzzywvtttuwxyyxwvutssssssrrrrsstuvwxz|~}{yyz{|}}~~~}~~}{zyyzzzyxwutuuwxyyxwvuttsssssrrrrsttuvwxz{~~|zyz{|}}}~~~~~}{zyyzzzzywvuuuwxyyxwwvutttttssrrsstuuvwxy{}|zzz{||}}~~~~~~|zzzzzzzyxvuuvwxyyxxwvuuuttttsssstuuvvwxy{}}{z{{|}}}}}}~~~|{zz{{{zyxwvvvwxyyyxwwvvuuutttssttuuvvwxyz|}|{{||}}}}}}~~~|{{{{{{zyxwvvvwxyyyxwwvvvuuutttttuuvvwwxyz|~|{{||}}}}}}}~~}|{{{{{{zywvvwwxyyyxxwwvvvvuutttuuvvvwwxyz|~~}|||}}}}}}}~~}|{{{{{{zyxwwwxxyyyxxxwwwvvvuutuuvvvwwwxyz|~}}||}}}}}}}~~~||{{{{{zzyxwwxxyyyyxxwwwwvvvuuuuvvwwwxxyz{}~}||}}}}}~~~~~}||{{{{{zyxwwxxyyyyxxxxwwwvvuuuuvvwwxxyyz{}}}|}}}}~~~~~~}||{{{{{{zyxxxxyyyyyxxxxwwwwvvuvvwwxxxyyz{|~~}}}}}}~~~~~~}|{{{{{{zzyxxxyyyyyyxxxxxwwvvvvvwwxxyyzz{|}~}}}}}~~~~~~}|{{{{{{{zyyxxxyyyyyyxxxxxwwwvvvwwxxyyzz{|}~}}}}}}~~~~~}|{{{{{{zzyyxxyyyyyyyyxxxxwwwvvwwxyyzz{{|}~~}}}}}~~~~~}||{{{{{{zzyyyyyyzyyyyyxxxxxwwwwwxyyzz{{|}~~~}}}}~~~~~}||{{{{{{{zzyyyyyzzyyyyyxxxxwwwwwxyyzz{{|}~~~}}}~~~~~}||{{{{{{zzzyyyzzzzyyyyyyxxxxwwwxyyz{{||}~~~~}}~~~~~}|||{{{{{{zzzyyzzzzzyyyyyyyxxxwxxyyz{{||}}~~~~~~~~~~}}|||{{{{{{zzzzzzzzzzyyyyyyyxxxxxyzz{{||}}~~~~~~~~~~~}|||||{{{{zzzzzzzzzzzzyyyyyyxxxyyzz{{|||}~~~~~~~~~}}|||||{{{{zzzzzzzzzzzzzzyyyxxxyyzz{{{||}~~~~~~~~~~}}}|||||{{{zzzzzzzzzzzzzzzyyyyyyyzz{{|||}~~~~~~~~}}}|||||{{{{zzzzzzzzzzzzzzzyyyyyzz{{{|||}~~~~~~~~}}}|||||{{{{{{{{{zzzzzzzzzzyyyyzz{{{|||}~~~~~~~~~}}}}|||||{{{{{{{{{zzzzzzzzzzyyyzz{{{|||}}~~~~~~}}}|||||{{{{{{{{{{{{{zzzzzzzzzzz{{{||}}}~~~}}}}|||||{{{{{{{{{{{{{{{{zzzzzzz{{{||}}}~~~}}}||||||{{{{{{{{{{{{{{{{zzzzzz{{{||}}}~~~}}}}||||||{{{{{{{{{{{{{{{{{zzzz{{{||}}~~~~~}}}}|||||||{{{{{{{{{{{{{{{{{zz{{{||}}~~~~~}}}}||||||||||{{{{{{{{{{{{{{{{{{{||}}~~~~~}}}}}||||||||||{{{{{{{{{{{{{{{{{{||}}~~~~~~}}}}}|||||||||||{{{{{{{{{{{{{{{|||}}}~~~~~}}}}}|||||||||||{{{{{{{{{{{{{{|||}}}~~~~~}}}}}}|||||||||||||{{|||{{{{{{|||}}}~~~~~~~}}}}}}|||||||||||||||||||{{{||||}}}~~~~~~~}}}}}}||||||||||||||||||||||||||}}}~~~~~~~~}}}}}}|||||||||||||||||||||||||}}}~~~~~~~}}}}}}}}}||||||||||||||||||||||}}}~~~~~~~~}}}}}}}}}}|||||||||||||||||||}}}}~~~~~~~~}}}}}}}}}}||||||||||||||||||}}}}~~~~~~~~}}}}}}}}}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}}}}}}}}|||||||||||||}}}}}~~~~~~~~~}}}}}}}}}}}}}}||||||||||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}||}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/assets/packed/MUS/mus.idx b/applications/SprPoP/assets/packed/MUS/mus.idx deleted file mode 100644 index 9da64422f19d3d178c425d1cd3d9649295ed2e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 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

    21+V9`U)BQlrqN9Z3rbRrV=m#9yGL+zv6G zZmfTTj7By9!<0sIikt6dp;=HGHQz8y34qY_*)p^W>1WR!OdA3=Z=eb9#>W>mUmpm2br#RKcufh*YPcK{s%W*NroW>-Y~5;rz~NE_-hShdoR} zTHq9G$=2Y?To%fzu(kDY;3er`d5FJmGOx#)#nd--FD-A8Yxp(DwC~1c!p{DC ze}4dIjx98ZzYa2;|02=(<&xj1_zq>^{8FEn z`aHip-=7@>Dqbk}+>6G0b%H>T*lT^BUpzFwefx&ex39>ohzcostSzhAl5}fQU&_GG z@`2DGW`R7Vl0u9g>`O_PuNNC;!e5>%VtqOBdw6_)czk_A`t%HW^tOmC-p@1?T9s4C zECzy+n*wQBVnt%IEyT>LYkHTG=e-+sB4>)<*RKLH@OyZCczD*@|N8KN@5#`ChsQ@; z{J%Us;0-iVN zt)Ly%Ytb^Z-|>U-E%xX$YmOhfJv}`j@Brcy{?q6KKO#zJUSD!wg~MRwLm5EJwkHOR z;G-NALJpbuxEtu8=MiWYna}~Xc=#PBBrG1&8`5R}Tl5M)$Dx-q!4KF$ap3n2fB`&U z@$|wJ|8e#_JS!LwBM%Qbq3G8m@g*j3S`WDuu}uzGe@#KlX%PWE@ypK^%(x;vs%0AlfWtW;LI`)bjWM zArL?(pFpRyN8kvNzz1R#Xv9_C!@vhFi^32b6v@TVs0V0xQbpmM@|B{&O419p7~HCt_`xg)nA$(Xk82-dkn10C zg1cCaU>+1aGNOPQ4SnKD#z6so{(u18)QDE>BAjoui|S``7^vWV2(T!I0BWLQQbVyx z76%a`ehmDBdROdEy=JhK5J2vFTuho?!s&V^I6%&TpTM&O_&q#QprM8+!R+N0@_^}# zpu=H?p5%iTpvwUSq@cb$KR%L!@%RV?CvspfrY+hyMi1Q7xl|ETj8{IyS1Tmgwg0kP zdt5JUDta*v5tAB zN0DOH2+n7W+Nc*aggrL2iTzr7rI#ziL@&jsUKkA?$#MGwhspk7hZo0BLqa)#hU1GE zLXBuK!q7_9nr1kw*(wIn+(T$RdKg4Dv?fP!5^{(E!;a=cC>Ki%xnh9>uM;43V1Miy|8)1`PTUj}kpj;!j)GOow06p(<_%@5b4nLgz{4@rbO!^Dt z&>02>P0ni?)BzOWp#Aj39-g6bM1pX~k3e^N(WmGo zHk3q(jK8V<)Jy!R*SI;OM!n=y`I4zu-dfghF#?6t5Slb5ovFK{Z`Ifn4*{3m-1 zVw?=kKddd-gkh-skQ^9IIh-*jM+VXng!aoTL?Lw8n=7XUiB?6iamcv;;&HviiXt_% z&sbxHtLY^&Hh*D1dUSdz1Kg>X?M<(C|4y&wZ3QhsplS_)`qp{_#XGo^Y7s{>w7vD^I|Bf729D4CvL3 zv7sQ)x(L(ZFWg{Mp#xf;UJ-hfL)$3_{F03E;OdG|p=Tf=rWmNi55h2b$T3!U|3F!h z!?-39n~#=HP^p%3z-%Me^n$b4FZ^^K?DWDo(+jgWM@%oqZB5R~`Uk^2{&;MAOG!Q?>LCyyb)AI|AZt1(lwKN1B~)p&ZU=IU;~d`vLTLei3#Ne+~;W zo+)$!!kYz@VKk&tItU~cLW3qD!DGbGeJFk6xrP&z{dq-`PAyMF8=tckbFvJ-YFdBwY9EbDZGOAh(MK5E31%_~P8j!5|nvx%nt3KP~0Pp7PNT!Zi$> zY*yvAK?SZigs|VB7jC5eu9w>Eqn=GK1%zL&mzs$K98Wpi{FeAp$fcg&{q{G%{B$W{ z8*={a;g63$LD8T7^vH8_4nM~q$Y3-u9$d$<24h{YbqB+$`N)L=F%4KSvpD$ZfB

    Ia1v?fMn@>x!~{>LL-K>RPqnLp;f^=(pgsA1}dN=0Al5+uIozC{)D>xSceaI+7h*Y(iURR7-mh7QDP)Fgm^sEdzlIUR8IH?5Qy#3sY7Isx zC5Jo5yoh4auGLd6oG6P`XHn&4^GFh}n-5Jf=u1|(OWgR!bC80vfdx-0<05q!JV|@z zjSmjH1Fj;0hu;}%=*%9HSmlYiyuF6FF!RMI1t<(xs%y@POs4VrlOS#B;7y(~cB%~0@ zsoUGlOd|LrTf6wt0Jij6g_3oEuGjL9GJh$Bo~GOK+Mk% zpufbN_?;Q{^$z&FgZzdop={)^GJqI`Hq1|R($E{y4Yk0B>M0MG~17Hb$!+qQ93L&kU@SM zs75t96_|>I??INp!wtW5TqL?f@d2UO)w#6=Vg#@-lO5TpRe{7F_^TjG8(^ey52Dq8 zwjzcrViQs+EbD;mKwA%MoJed6Ea{V`(p(Oe7W_iPC;zTK70cmWn8%TSC@B0|pyei` zO8~C)ndbJAD3SkNGJR?vTz8P=GG(DpBG#HGSda*y>l5`I&5M!`NuTD=W^Pw1hlYvil@K4g`owBV24TrZVJG^0YRR*RyC+^J>YAWycMM6f2I= jkWernG>UOC=6R$a1Z|^^G{@XY2H2?G4 zn+MK+zj^ zYTePLunH8f$Odh6JbJ(&!N}=(1EdS(fdE}?uLZsG_Jtv0HRN0Ns;f-1#B9T`Ga_bN z=e6NPY9bCtDeHeZ393Tq|(O_8&A%5kT9fI z`&_NAqHxI9wErK4Y+Y&h-KQ?AU#tQJxk^-4wF4%jmF>(&r1y1LMEeD7*y-(pU$YxI zu|#jNE9z`8#*+;fnv;;-FaVCZO4}3ELZc1b1T2k#y3T_h< zL=#@tt1a;T;daz*->$raL1};gWe?+28+7LP4O_j*_E`0pk8QO{-|>^gnSBk1H@|+|{g`syT0Uw3H<|{V913LoU+#&)TwiD8XM!OtPV)e7<$(BTZZAKn)q^f1A zP(+V(?$s)TFs{mX9rjr5Jx_vGq){RxSEeteJ&-t|nRNhPdeQ|4C~tFHF~HIQOqlwY@PTk{KY!p(0YhLkpe_wAm>Var8~~n6*V+ ze8^z~s$zm%hA(9;M|3Wh_A8Q5O`7Zxh5W!4!IHb~?jQ1F>5R=9&Pd4ouUbe0r&_DCbU(-~4D z5udQH>?^pLTRO}!-aXcjo)X)Nrbg8&VJ$-xq7m=Xd`{Vq1n^`Ar8uDMAwC?0t)+mQ zuoy5k&E&LJD@^u)|Cm+6e>ZFk5;MGPFA7#~wC2#tm)Q)GW&{R2G`_(7HbKD83wE}I zBQyXUp{yT977`RPV9yNRlYO2mA)KH6gT&~C%jIOL{{=yAVjDgAaDL>Zx&ph9RBF$B z!m&B*9mWyW14o?UwqeZiA=FBFrm*Dq@~nfvi$U Ma5d%oCWFo1-C*+m`g!+RV Zls~I03Qgk2qny}d->qvAHtn%I_61^UwKo6& diff --git a/applications/PoP/poc/res/shadow/sk3.atl b/applications/PoP/poc/res/shadow/sk3.atl deleted file mode 100644 index e2a92c1aef621cd224cccedd3703d19330173d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7287 zcmd5>%ZeN~6fJK;AP|US8|<++gTdfkmR{x$0@>%=>e*f0(=%S>SF+DO|4=#S+1MGLO zwrzWac|hC5+8u$R9rPy$$F99V4SHzjbFMfJ7`h-9L3ekn+Sn0l2Zo7u*FGdnN*omS zaNo8M#{i|&w%sUfp69j=Y@`YxiCQpelIF`GI-J{i4wF*Vae7=J%SK)41KeY@hJ{HW3D+PLO7NBWO-PR)BQC=#e zHiUHD1v$e#uxI<++%$WZrN~N{S2Po*Q5C}W3ga~Bwk(8HLjmmxo%1^A_ApE+FN21R zm>!{`3K9ajQOId9FMmV>OMY2OQLBTZ<0MY7#9T zsFm+o20o#+S>#Zp!5!!cgF9i+-p;%(Qy1rcxQ{;1fEe>0S+yBSuaDFlhLO@EDd>Sj z7IfRZYf9)@-)hy14i6|_=bC4hwe!~+Lg4PcHa{S!T(uPg!tzuxr}8=15ai-Rb!&Q7 zw7fQT-DtZGGl%=NG%;fbRVLkY2h<;vi&P$ts457mMfo`~xBw6@nh^AuYXXMu$cwY- zK*WH-+#Izk@PoS4i^6zbOCzg`M%gQWQ;A`zgc8e`OC*YO66-LY(qi!$N>Kzegi$dF zv&FxhofAC>q{%bqYJr&eQL*>pHD~!lEm_UBG z-A@3FhJz~pgePp=vf!j(NDP`5q;xvzeZHQkfPC5As<9Z&aCKm?SP+Bf*48F>D-Ojn>5!z*E!fJl)J6ufne(9lTStsO+_olUpKc+ zJn!~->ehwU;7c4CXtRhFHFzxsiWfphF6&BmaZ9qjY999n`A{(4R~k$zTcZ6@>&=XC zW_7$Ay7UcAB7qMsbgH%{ga-%IYVu7sGV`7t- z>)hp3!iJLKASWWIx#Qn*_nj|x|DXY`R(UnH(e#DPL0O0Zi2hC5p@ z+9k7Z7_ksl42NvNpX@uwlxVMz&^3djLFDqh30F9QQ~7WgubPifv)T2Z=r$2mr8nzi zG7M!z^S7!D_86anyhlO|oUB;K4~w?nC}yH)o*iL3M7UUNd45P{wIZB1b~MWn@*6^M z?~Z`L*Ae$B&yjv)@MNJ=Trk`Ynu)`^_D_Y(6#nLeGbk^E5wYCTpz5T_-dr?HOA8UkO_T|0&nM>8`EW z!MJYNPBQQd&P{3CLCwv1!DvC`ObA@=jP7MhKx$1aR9@vWmSd9@@Dp6~`vb4ntcqxr z#6UUoJA~%6lN&~Q3SRV83R~6m@FQUKn?q!XB1##ODk$f!4fQ0+Rsjy8&T2!;KM=G@ QW(+SS{7n=uNS?(01vt@WlmGw# diff --git a/applications/PoP/poc/res/shadow/sk4.atl b/applications/PoP/poc/res/shadow/sk4.atl deleted file mode 100644 index 358078e538ef9a1ea9045b4ccbd3083bbd85aa61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10075 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 Q>hca8yS<<|=WP}J4^cU|OaK4? diff --git a/applications/PoP/poc/res/shadow/sk7.atl b/applications/PoP/poc/res/shadow/sk7.atl deleted file mode 100644 index 65d80bba0f17de74b5459079cbaa593dbab38797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4330 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 ArvLx| diff --git a/applications/PoP/poc/res/shadow/sk9.atl b/applications/PoP/poc/res/shadow/sk9.atl deleted file mode 100644 index a69cacfdb4a165bb22cc9422236050640fc46072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8118 zcmc&(OOD(&5S14J62J(IECK|!0o!AH;f0YLAvXw+8|5TyiQSSW>YmGFm38i+yjMjQ zi)yiF5X1?AX_2f~AAahQ(){|%&p&d*4N^Qn0h!DrI59vo{g!oTD z%TP_rS56ee{H}TewyY;{Ki$;E9=T;4-rM4L-Ce~&H=sF~N1VxE6V^R?Z+SBv%=&d? zrdXgJkxAje4Q0zz5LN1fld!9#B!sBTI_l3%T1t+@qoWlfhMIclu-f*+;ZRcmjd(<* zpChReIbAeR{=#u(!w@zlgyd{xoVH&JjYklnh|*8aS~s=fc&v;F;a~<9q*0oFZ$axA zGL=Tj*c5GcQ8<}B6l%m4D}pFVUzlP&o#t8DOT)C`8(AQ?Cb9>{ou)(S#Z53=UX&qh z!nod^g*8xs%r1khibAmRbJgt|ESD6Ln%3&`956!W`B)O! zf$#m-41va~bn{NEjy17*tAeq$M5VvMBd@!UT>&*~4ec8L_#ES?6S}JPsuuPW_Yf1V z>Msqv86>hYzI9WmVmpv8yTv&fT>3{CM343W!8B^ILTcP zWTqHclbJ1s$YbFixvXW*q=u%OQMB&Q59tLFV@qbxT^Nx>1u_E((HFT2ugkg{9B~Pq z37Y|>{YVk+nhLb4si{Z5zS5<`&IQFOz*P!=pkGY=W)j^P@B2}{Fvu|5uzbeKOI}fL z)}EBy46}%KZvP8=UZ}`|v2E@T&1x8F6R1jY(8-3nfgkU|rhNlgQ+NkXn`! zq}qp@&@yDR!#v6$H!%4Y)#4i1Q-0*`-=`x$qUE;i_su0pV=_X@EONcKOTg-hw;+EF z5>G~=nxybt-n%xQBx8|V$dH91Kix=ZcSF<*kxzT#4?=xLY-xES-d!8zsgVko#8u@3 z722G+EC}Izx!fxVWIRm|sg6Mw45}CHKeJnn#^E?m)0zETMqJa`uL*+LMsDaA2HVG? zsymH+B>hyl6$bJ)wjd=ilqB%SlZb_`5gi+6d=Hc;`d$Oli1-ms`x%rpSYhD@2C3kp zlrX3;Y&w%JG)QKY@)K%IbvEgj{jAaq!e*|76-im`PFgAACYQ$6vOv$@%?JPOfDOjL-H;D%ae=o! zh$z(~6%cJ|0Q3uY^4}6sN8(8IvUhZEK~9kxM-BQ=z$HmjTE;In*YE(boA1CQPDS$j ZfRLS73_CF$*W%6F?&fj}c%_}W>u*twIhOzc diff --git a/applications/PoP/poc/res/skel/g0.atl b/applications/PoP/poc/res/skel/g0.atl deleted file mode 100644 index aef7dfd300b1ac9e232d1e653b49e819a88e24cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8267 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 diff --git a/applications/PoP/poc/res/skel/g2.atl b/applications/PoP/poc/res/skel/g2.atl deleted file mode 100644 index b3e1ddb4367d849f9186fa9b6f19351063e1510e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9347 zcmeI0J=vV+XJE2I!B3Kh!0l%+*#-5)uBXNl+ zGJ!K5`|)d!@3~h|e*Wo)@4vkM`}ODb`r*x+>-yu1$9wF*ef9bd`(IzbykP(Jn+M~+ ze5?D9kGJH0|4z^7@b&s|{r$gM9}l|uq|Bz+N3NTu6_97g=sBV|-ZPfJ)amr|(Q9R2 zXKU?A2dVQVlRCFjgE}tiP8#iKZjM5RfTO`nhOD*Ys=gzJhRD!4$S~#r3Npb3d}o?f zvdu%?UZJ>Wr3BJK*v6I!LkJU4c11-PIcq4DUzF2f2e+aEV7Yvn+b25G_dGd!Pnhlw zIlbARREWj4x0}9ltz%g7(e7pThzLRLalL=eZ~d&N&et9FGI+MNK;$|R38Q8KvC&K} z4;SV}#JMH_3%ahYSdBwK|8IV@1zBG-)0zI37>1({ei94EAWc4}0JKbXIphvoax;yqw4dHeQvzdmx z8heQ@VK|<(d0U559fXtP0N4ye>%Uwt&-q(a>+SYp#LfoP6lc~!m04Qx%{8(&+buPF zvpppimrZ%e#Fy4o!sy>>{l@Y89R(9?-+QH8tiJb!=I@bk#hDMRFOK3X2P;{K3MkPR ziS}XW8=dQP5<%c6)H7(r0~*9|De>aiEqIj5M30dWPFUp2u_sW$|5HFqmU76$QVlI! z0BXZeLb0I|GhD_p=<6P-$7FU;9D&SBWn@EOGJ!9QBjWMAf4LhP8XS|0A2A~|c=WRJ zjL2|(bAV}!uT$jM3xTa6)J$qhCkNjz^86$uZo#Ij0Wh#s(R|$EVP#Q1z)mK&Mn&d? zf*K42sU3ERw<+@4m5L3N2@+zdSv^9$m&zKr5VPxPe>aTZybQbWQpe8CDnLCv6B1>w zU5m66n%gllggxT}Ytl0-W-$wzPngf&`7%zM8a{@$@R6i(>W7#di0a~88{K`}WPp7B z&dVq`2#kb7n>xSCZ$qAxMBWN3&R4C^K*@kmf)lx+!$l7L)VRV11S_Y75EsK-4g zuZQV`oc^Fh29-4Eh@DbhnD9zL^Xkdm=3_Vr(o9fS1j0a?4unrUOeqYWBTB=Nx*@@^ z8mK2A>hVf7j*}x!jzoAI4adwl&^h={OItJX>N{pOS_t23VUV(F`R=4d{Y%3pg$gIk z$;6DA$=UA=uDL8Jk&-&OFKqar9C#?Ut07j%tiwN<0H&j_`{C zTV+i`4s>aGi13dyn%gl@VL2340jhd0R)SHo%!k$RNHC33NDpX<@_1lbkK7vq#!>e= ws~H+qv5;XqEglvMdAjcrbR$7aCSCT1am7_T5f|e~#y*%0n=X(m6gwpT0S-dqApigX diff --git a/applications/PoP/poc/res/skel/g3.atl b/applications/PoP/poc/res/skel/g3.atl deleted file mode 100644 index e13458759b5710da4915ebb307f727b4098515bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2633 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 BD_j5o diff --git a/applications/PoP/poc/res/sound/s0.bin b/applications/PoP/poc/res/sound/s0.bin deleted file mode 100644 index 9dc621d..0000000 --- a/applications/PoP/poc/res/sound/s0.bin +++ /dev/null @@ -1 +0,0 @@ -{{yzyz}}iG0!#=]t_PLI_q}}R]g`E*JG^Ƽc9%.GME5( !A[{ǻ|zkdkgnmZ\K:/4<>Snw|}mUVRH8-4NoX[x˹u|o{y`MXvqmQKabl|yȰξbcszif_x}ib_aNK[aoz~i[P7JowfD4OfjZOQS\lx}wpxflearvsq|~|lenkJBVw|wxpprWVg|tfPWtxZc~||^o}}sS\ns`X]nt~jhnmulhXY[`u~pjnqlqzraOKKUWYiosxtgbturk^YR`s~~{up{xtxtpzmhovyw~yvxxivtoy|ypuglwxwnlz{}{}yqvxyyr}rpy}wzxpsu||~|zuqkopopnsuz{|{vnmpu{swstuv{ljsxxuhvw||t{~}xu{}|xwzyrqv||zz~zxuqty|vv|}zz{uswuuwtonsx|~|urtyyux~~}|}{}xvtyyqinnptx}{zz{|zvy}z{|||~~tx|}||||{zxwyxz{tqx~}~|ustx{{yxz}|||}}}z{|~~{z~}}}|~~|zw|~}y{{}}{~~}zxzz|{{z~~}}~}}z~~xuy}~~}||}}{{|yx||z{}yxyyxy{}|~|{{~~}~}||zz{}}~}}}~~|z{{~||}yxxy~~~~||yzz}|}||~~z{~}{|{yy{~~|||}~~}}~~~~~}}~~~}}~~}}}z|}~~}||~yy{}~~}|~~|{}}|z}~}|}~~~~|zyyy{|}}zyzyxy{||zxz|}~}~~{{~yy{|||~~~|}~~}|{|}~~~~~}||{{|}~~}}~~~~~~}~}||~}y{~|{}yxy}wx~vttzyy}|z}{|~wwzztv|zsqyzz}~}}|trxtkjvwty|~|wt{tjnzurvy~vt|xx~wpt|ulnyuopxww{~~tnuxibq{tv||{|y~olt~{srx}vrw{z}{y{|poxunqzxqysu}rr{upt|{x{}||{qs~rlr~|stzxw|voxpks~}zwwy~z}uuroyxv|~~~xv|urwymjswnq|uywnr}ljuphn{zvv{~kjykZi|qsx}{~qozzigpk`cxyjk{zs|vfh{yrswvpuzptvnuxtw~{wxtqx}mjsnah}wgfwvt}rrzscl}tbbtwqm|wysjsmY`z|urnw}tvvjqj[bxxqpoy{svvouoch{wrqv|uz|twtjm{urryxt|tpu~mhn|sf]omgupqlXU}lcqqix{rwi[bzvjdrnizvnvdYe~}tniw|oo~kkxx]Xlzujk{rzslvlW_{yrhotn|mit~`R^|tm^ppi~jh{w_Qjxshd~|jrzloo[]uuphprkxwhnfWa{{spkw~mlrgngYd|{tll{nv}jhzz`Znzqgoum|oit`S_~ri^qidag{kVFpkRLpX^~xw^_zfS`lT_|~uyk^g|xmfu}icxljwjW]u~{qaqpg}sgokXaw|tfrvpkguaR]{um[kof{^kgQIl|ufR}z_dyjtiTYx|xhktgrxlpm]`ruldoohzwhljU]vvk]pfd}pgoeVfyje}{holjuz_[j|rebpai]dqmPPhvh[dgScheumOZzzk\oeVlwhmmVcz{upopbcw{TNljLMlnjhkrYaVPmiLVrhiqzsnwmfro`iz`\p\Wj`Oa[IUymZdtoeezoPZubL[uwciuxnncawsaj~d^l]Re_TcXPbjU^lfW^|TOknO]ukdft|lelgZft]f|pasvjqa\mSKcaQcxjUbwgITygJGmw^Yexzfbwr]f]WijZbxxdcrgUa[Rgkbmztioy\Q\{PF^gP]kd[dzUX{bTb~hV]{p[_ucHY[Kbl`mvrrwa\lkIZxu[YjYThaDPhFGrzcZWfiYmi]o[E\{xgUUvvUIk^RbxgnxxLFwǮ[9LsZlt^ixďSFTH=Xwl\TXxpRU|aQf]F^{oXWk}[QbiLVa\o]RfWKd}_assdkzcHKuY8BvaS^d{iVU{—RNYȵ_=TiyUS[]IM|qG=hӯ]EQul]]v}c[o_G[zEIgkR[upJSo{HDUĀ>5RƨmGHWreLPl„RNe̲kHNfrNA`UCZ[FW{JG^|WN]hZ\zUOdd@OpaKdq^D]r_I6_`D1fĚlGW`hSVxϯfOQˇNIY[GLrnG>b}B>dΦ\9iةK6IqŃMCOxFOgeW[{hY_oND_̽k5CsS7KmĮb3@meB\pyQfr~tdYkhRPexSAHzB8GzvVK[mSV{Ȱ{\JhgUaX?T˾l45`ƜMERq_RZgiOIdʠJ8WcMIrͶhzکX1Wvf\aTcIRڕV':a9&dzLgf``Url?1oN*JȨ{^Ub^ujT^ʟV2F~;6`•iVZgmaZtyE?gܧP1Mĥ~]Xicyi^cԜX3Eڄ>1bȖkXjphm^rI4]_2;vdUebfx^Y|²^;8w8(Y—ujWcPvfOZmJ7fL,PԤkc[o^iy_PƮb@FzӁ:5gəcHNZgjJHhӥW4BӁ::_ȝiGL^{iLS|υA(R^,BvʻSNama\fμyB2iܯa5F|ƳQOhuv][o͟S/9؎9*Qţd?TkqfQZv݂=#GV4&s̈́YG`jtkQ[k;9nܠN3TɣqVVajcRc®j;Bz͎I8Zr[_fpfWfY@Ny5@nĠVG}B?W̤YG?gcJPiϲfI4dͭ^GFqмnOEj¡aM[vƳrPB\ìoJGcſW9IU?QŎT=UƯi@LmÇTAD|K@Ktՠ`F9k̙WGQtԷ}X:Q½WDRPKcҒ\Q(bǮmS9^؞dM=}DGcΦiQIZwQOZĽlPENͬ[DRhΆ_=>~ʟd@@p̱qJDlTMg˦eOMfΨ]@JgāY<@\HQƋV@SȷoADb˛bI5]ūhJ8^_A,q݌G9O۶sT@R}SKW{L;Da4@\\; yX;auL0W̪_DWwxH>Sѿo<@Y֢S>$fбY>9kת\<@ˆGAaΨkJFbëpKLa|Lvӯk?=oUEUu˫aB6]ѫY>@a}]*6ڐY5;{b8>̂BD\ר\E8cӮUzÏ^MOyҠc9:wѝW5=txK3OzDCHV12~L5bɩ^>MlvE9SqC=Y֣d>3lӳoA5^ƇM9TijqDLhǏR?DӐM8CwڽyO'IʈR5GӕS5Iv@C`Ѧ]E0[νeB/NiK%Nk>:Zݞ\>:rΣW?IgӺbD4YұX=F^}T+2ޏO-=ղe>:lƛ\ETrƳqC?_ϴi>FeԞ\?.mбiB7aѸnCDa֮sK0RLJI3EΕF8Kѻb2KpǕOCBs˟YBEg~O6KľQDV͕P9IŁ?;T˱oJ5I]CK~˒U8L~GCdɦiJLcxTQYtK6Jh@EYܟl;*m׵pA*XϔO9FRO]~ҟF<8E4KwӀ[-0٦`92g|A8\ʭb;NmƒMBEϗN>GrϿmH5^˶nF>\×_CJufQWlnJF`ƯkFLg˒Y>C~ϗV=Fqƾ\@Aq¦pMB_˹jFBsכR6Z~վyOEA~ǞbI<_ʽpI5\ͪaBNjM?EϒG9GtĺqHG>]MIs֤Z=EԎP=WʳyPELskKF]¶lDCaȞYEUoQ>OďTQo|vhw]G\D(NZd~sb;lmKK{oCNqqko|e~oqaTbgn|mowk[ateSc|mvʺ|Mfmeg{sloWabtnwo;b}v\oxY{Ȟh[kMRrkc`Pynd_5ifRof^wws}jJMlznZ\oz|}wozwzxu}j<@f{}nWc_T]daYC,8XgF-Odtrp|ýǚjj<=qt}}NWR'Cm|ZN~lXsv{pstRSvs|KLffF8RVM>)M\KIdzkhn~}hsxsxnwhp}xtn{kJYlP@VzeYܧϹeHv`ocoUjgNTYph{}vvovUN:0^p[H9}cTT`acz}tplg۱m}w~y{~QEd|}xdeZwihnObtgsplnogn{|or}wqaJ=X|T(QwjWtaVtkJ–x_fl|w|s{uysvmpƣiGc`qs=~ngU?tbC?BtNq^fSmJr_Ty~|opvjrkafPzzs[r~aWgwkv|qck_}֫tYsiu`UifgHQ~KEe7\\FIzkqrqc@xbV6_}NdqNycOfxvztgTPlo`t|i]=II~BS}julgwq[Lny[i}gyocef[VkŤdU]PAAO|~dxzi_rRi_sewwpUZW}tkeaVK>8y|_̐|ub`gxv~ix}kP\Rgzjs}qs^orpaayzSWxMS}unl_|eVCaj^jsjlzl\RcdB>NNnodo{xe{xxitnLD\tuguxwkеʥ|l]o[aSV^T5[sM[F[Y}czrzQFSx^Swsprò̸wvy\cjJ:CPmxOK^_n_LTKLiv~|fgyam{t0AfS:=EfJ!7OnRB9AzfsuNJu|~o\TFDIOKdj|o{oMnr|qcbwJNo~ia[VNaqiMavdgis{viqyv\Xn]Xk}e\UuaknO_Slq-8_OwtXiZYgH|qIefXvySktpl`egp\kYTxh`\||yoxsaTkryyvriXdlt`bm~iTdleztrypn~bri~tjmp{axzy}|SrbWdut:BA^LTtPWj}hQzfew~}{mpaEUtlmhmjRAepqlitdf|yw~^Wgvk_`ctsvj]umM_qx~hZxwxm~o]|ztxsmOa{rez~Zm}yfe|{|kn~ok{fme_k[p||pjonlz^juawŶsl]UYcg~~ns}uy|wUGa{}bptFCojOYZnzjmurnfsdlcpu~ylhX}fqzc]{1JU`C[~zigqrmbaxha{gdxti{uJJ}sqrzjhrekk[n{jxfhvaklgpr~nVQvzm٦yjVKsgl6XRHkScsR^Oniftkr`̗¤{vpypvvkmp`FQ^qghmnzr[lvn~qq]RiX@JyM9WRxpbdKRVhsci|zt`iG[\ttyyyXw}idt{amot}bXt~jI^v`a{ngyz||wZLaUKValagf|}{|{tcloplxn{fU\p}rX_twit~p{]de_jdcjadyjr}usnahzxyw[E{^kzxWlqv{tgt~Vhl{p~lxtuqwmRGRbldG\jtp]ons}vwyhax[T~_`|yegnjpwqp]elgkv}mmN_oo_hsxqv}f}u|}fvxsuUTmobab}~f[lyWly~on|qswzt{woke{vtyywufj^XY_ibq{{yw}~iQGJQb|xont~|oyes}]NSUfwn{wyobPaIDAVk]9Bdyy_cnYnKTz~cdkQSqsvnjqu{q|zm^hnYkwqn^]qYgslr{wl}~~srlrvX`au|nht~ix~n]byhxkxp}~oa^jzokid[yw|uty}kpu|va_sgPJVeinnvzeZhu~z|r}}|YZjojojltr{~jjzv{r}l||lY}y|~x|Vjmbb[sq{mqrguhMVe\n}|xq{ubyv{s{~sxnrqUQdvu{wohv}uhh{wcsq~g]k}wldewuqpkqoo|w~z{wwjslhnm||oux~xrux}~Nc|{i]OhdVQM\aWY]brv|orwztolz|x{{{irrcrztj]i}wts{|oXm~nit{zm|u}borye[ozs`_jibnr}tXnSIyuy|}nmc\swn}xkr~utxyuvdarymbio}qfcfw{rlj{}tllus~|gkx}|mj~fsrnutysvwt|}wxu|wp]K\nmz[r|vfsx|rox\WI5Nfn`S`ywsuvnkrvysvu}}v|~~|vxyyrzxrqtzz{vxkWiujMGcvo_fxz{wu|tzx_d{sttyju|ojis~rv}y}xc_hrz~|w~ri~okqyvq{{|{z~nhhc^bprimpbdjz{pq}yhbnnseYk{t~~wxbtnqvvfp_fmhmc}anpvq{vzostqmzz~~t|ru}~kjsuririjuqkowtim|xrr~yz}{~y|zts~xlrcheit{z{~vy\j~nvwwsmthgxnwkx}ysm~ztvzzmmwxr{wvz}}~{zoendbv}pbi~uq~|ry{xdl}tvzz||{ux{vspprkmtotw{v}}yxvvtkqgf^cYgkdmonu{{|}qkx}~v{}ztz~}zzswy{}|rpysssz|zx}~xvyjbmkejlqxux}z~~mt~txx}{}}{{rt|zvmhzqp|hstypq{}}z}srp{xovjoegelowmpmirzwuzy~|xfwohpw}em}ertd|vz~~yiWYikpxss{~vlw~|n]lwnnkl}x}qxsv~oz~||t|~|}p}}~~uuwjhppkqant|wo~{wznlmw{i`jpfdd]gmafs|tbmxxv|~{{es|wtsrlyyt||{~yxx|{|sjzsqymw}gmpvthwn|ivoyvyyzwnxuvkwpqrgqq|zyzqxy{|ttvqssjghekyvsvt}u}wuqs~}y|uw{{z{~}}tspgfpnw~uvxz}}}sx|yy{}vyyz{kvylwvlr~zz~|{zw|wvy}yvtxsmrtz|xxtx~ywytr{z{us|{||}zxz|}zpl}}~}y~xzyyzwz}ytw{sn}|x{}}{yt{||y}}}z{y{z~wswxw~{pw{y|yw{}|zz|}{sux{wv|}|{x{zw{}|z{|}~|wu}x~yu{yvwx}yxy}~z~}zy{z}|}z||{||}{{}{}z|}}~|wxzzywwyyyxx{|~}xvy}zy{}ztuxz~}~|{}y|{}}~}~}}}}z|{|yxxvvx|y{|z~}}{|}||||z~~}~~~}~~{{~z}~~}~zy{{|}}~}~{{||{{zyz}{}}y~~|~}~}|~z|~|}||~~~~|~~|{}~}~}}~~}~}|~}}}|{~~~}}~~~}~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~z|}ypaRpfgcNryNOm{kMI^n|mctv|tsQexMNxYFkaAMzhL\ePer}omfZmmsn[\h_djYxFQsq]cY`irze|hXl|WebZh|}lfmjVA8?JVbrxrorsusosobSP[ky̾˺`DDR\[\ev}w|}rb\fnXZf`KFWmvuvxvojmmeepxfiwsc^c`RE=756647BXuÿsfbdhms|wommmoxy|{m^\eomb\cllb^epy}{qf_``\WUX^bel{ú÷xmfb_`flppnrx|~wePA=<703M^grxm\^xzzȻԵмɺs`_soI9IhmPFZsyun`QO]lpk`TR^lka\_``egb[[`eksreZ`p|ysxwtihp|sa^jrrqmaU[ozreZW[ixtbY`efnvsgbjrvz|uot}smw~pfdgnsqhgknorxwojq|yvv}{qr|wonqsohb^[_imh][cillh``dlkhe`]courlmt}y|ywvqlnrollnkhkjqmhijpwxpijpuw{yqou}xokox{riimnnrskfint{xpu}|~z{{stvyywrjimqssqlefnsnihilsyxqooooqxyngmv{|yrmt}{|}~|yrlmpqomligjorpkhiovwpgflrwyxtruz{wz|xvvvy||xx~zux}}zxtpsz{vqqttv{{vtttwz|xrv|}yy|~~|yvvwwursuuuvwutsrqrvxyz}}}}zz}|{}}~~}}{ywy||{wtrtxxsopqrrrqnnqtv{{y{~~||{zxxzzzywuwy{yvuwz|~~{y{~~}{zz|~}|}}||}~~|z|~|}~~~x}~}}vns}}phbyok~cX{giswUXw|yumhqpU`}|hspioqsk^j[JX|[kh,)Wsn_RUwnCV}znzcubtvleiowG[hov`9Hn`O5Qͺw߭G4.KbetqvYVA"']hvɳm?5EgptikY29~ȺdyԻwzfFT޿wFHuylhpF#&fldȷTHUHgY\ybAXsttuam\*-]\`hax:Grv}B@/yOcǒ}ടʹȜUg|voN\",]VHGwFTsd`s|{`B7IozjB9XhjHVXAas^l|LU˽wTPJAXtѫu]Kcƶ|nscFbu> 3fB1Wgal|Y&<~RR[v=30Fhlf9elN!PϓUlmᣆȬ~o}|S)2`ytgfuoM$;Zlr]Vl]3HXd|pfsv`gqzvsy{~siwɹԺſrjgrV@Kh_|vY`yxJ..;Xcwc\KWdsoz]FaL1FW55X_dsr^WbAHx|I[JCě}}~^`؜U)Nm'*hs/?sh`fxc23cΜǯÎ`RgwhgRBRdnsvu`D$(`}wbND?>9QZu`509;AsVeͻˬ~ʹМqx]iy`VicG_qi[M[kpf[Z`hpqfpsWayZ@7>OXNOrzgbpmnxz{w}WKmiNIblsf\PB<.1GMhcKCSjodes{XENYYbif^gr~~nƼyrzxyws{[JOSaxwTE=Gf|uSH[rw^EAJT_pnt~tzwt}xsvsį{jh[Y\ff]]lyw{xiW:Ikwrmztqldi_R[go|tkgkmpvzvyxy~yaU[joquya]hpwstteZ[dhj|prpgmxustYJYojkov{y{xwx}|xe[Xatw{z{uk[ZfnpgikcU[caMHEBT[NJUsyrx}~xyzutuu~zyypt~}|ocejov~urphdqvzwfuxkuwabskbgywityykwoowtnne\UV^hmehr}yfV\nzfbaVC9=Oi}vmdPBN`p{vgaaeuzsmlpuy|{{xi[]ppp}tglzxyplnqmg]Xar}ps~q~~ydVSYYcrxt{u_Z^]nxsh[OKSUWTTguyyy}zxtmifnt|{yz|~yuv}|l_o}zwus}|zv{~xmhp~qbVQW^`XWURTU`lilgr|wcamgc]_ev~sxycXewxwzo\TLDBGIJU`jnpzwh`jyyqikxsqysotqcev{nfoytou~vqk`ixu~|ou{zfmurloff^_kme^QXfqonvwhjidiyqib]]dq{~vg\W]luutmyups}~~zqrx|wjmv{tkiir|}vzttw~vji~~yov|rklks~}}}~zyuy}yrlmoqi^baag^OP[dbK22DSY\]`hnmnojgpyzxukfba`fv~~|nor{yy}}s}wztt}wx||trvz{sllllihhmvvnjegmuyxullw|wvz|zyxztkhf^^eefe`cr~yxzz{xpks}{|{olr~zowsw~xnknvth`dqoc]gonquxodahnlmjllnmjedeny|yuqnkhoxtkjlpw}~yonmmmozzuztlmnwsqt}wxz|~{z{~ws{}wz}~ssv|yyzw}}|{~|v}}z~{w{zqru{{trtyxniov{}yv|{}zw{ytx{zz{xla]gw~|zmotuwxz~xsvmn|{x~njhlpkZ[fkjljfijebglz}xvx|{~|ystw~~yyvtw{wprtzvrv~|{spy||~rhmty~xssvw{wx{yywumpqswz||qmtxwnot~}}yy|x||wodgprry|tpswz}wtz{yz}{sov~zvuxxvuojlloz{}~z}ypls~~unlnpmlorru~wv{~zupmpvy~z{|~}xz}{xxzttx}{vuz{wtw~}|}zxxqtz~}~~z{{|}znljhmpvyxtmjjknrruxz}~yxwx|~zzropx|wzzyxvy|~zz}}wrw|yqnjgjpqsy~~~xy{}zqptwxvy~|xy{tlnuy{|truyts||www{~|{~xtruxxxrkflx}vosy|wrrtz~rmlqw|~ytvwxtzxpjjjlnjlkgebbeknllsyvswz||}}||wtyywywrsv|~{|{y|}}truvxvsstvsqvzzxqlmsx|}{xvy~~}}~{}|z{}{~}zz{}tnntyy|~{y~z{~}}{upu}{yxy}zvzzpjpxyrnopou|~|{}}~yy~}urty}|wuz{|||yspuzzz|unpwzuomrvvsusrx~xw~}~}zy||zxtonpu}~xy~|yusw|~~|yz|~~|}{|}xy|}xy~~~}~|{~}}yyy{~z{|~~x|}}}}~zz}~|}~|}}{y{|{{|}xv{}{zyz{}~~}}zyyyvv}~~~z{{z{|~}xx|{|~{|~{{}}{~~}}}{wtwz|~}~yvtw|zqptutwyzz{||{|~~}|zxxyzyvtv|}zz{{{}}||{ywuuwyyy|{x{~~|~~{z|~~~|zz{{}~}}}|}zyz|}|}~~~~}~{{}}{{|}||}~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s2.bin b/applications/PoP/poc/res/sound/s2.bin deleted file mode 100644 index f7044f3228d7b6e63d396ef4d3f7ec90ea33f6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 bz%2>flE5tq+>*d83EYyvEeZU8mB9Z3&~w8P diff --git a/applications/PoP/poc/res/sound/s4.bin b/applications/PoP/poc/res/sound/s4.bin deleted file mode 100644 index 50c3438..0000000 --- a/applications/PoP/poc/res/sound/s4.bin +++ /dev/null @@ -1,5 +0,0 @@ -vwwxxz}{vspmjhfdb`_^]\ZYWUTSRSUWXYYXXUQLHEB@>@DHMQVZ_aabcbba`aabcdfhjiihgeb^[ZYXW[_chmsy~xrlea]XTVWY[^adgfedc`]ZWY[]_djosuvxywusrqponopprtwy|~~~|zwvvwwy|Ŀ|zwtvwy{}}{xvtvxz|~|yvroliklnpsvy|}}~}zwtpmifdfilpv||xusrrqrtvxyzz{{{zz{~}zwtrqonlkjhhhhhhggfffgghjlnoonnkfa\XUQNLKJIJJKLOSWZ]_adfgikmpruuuuusrpnnnnnoqrtx{~xqib]\[ZYZZ[ZWTQNMLKLNPRTUVWXXYYYXWVVVWWZ^bgkoswz}~{xvutsrsstuvxz{}~}{xuqmifdb_]\[ZYXWVUVVWWWXXXWWVVVWWWVUTSPMKGC?;730,++,,/37;>@BDEDDCBBA@@@@@AABCDEFGIKMOQSUXY[\^_`bcegjlptx|~{yxwusqnlhd`\ZXWUVWYZZYYXWUTRRRQQPONMKJHFFEEDDEEEEEEEDDCCCCCCEGIKORVY\_behjlnoqrstuvxz|~~}|{yxwwwwy|~~|ywusqqqppruxz~ytpnkihiklnqsvwwvvuqnkgc`\YXWVVWXYZZYYXVTSRRRRSUWY[]_`a``_^]\ZYYXWXZ[]_aceffeec`^[\\]^`bdfedcb`^\ZZZ[[\^_abcefghjklnopqrstuuvvtsqpnlkijlmoty~~}{zxwvttuvwwwwwvtrpnnmllmmnnnnnmmlkkjjiijjknqtx{~}|{z|}|vqmljhhknpsvx{|}}~}{xvspmiijkloty~}|{z|~}}}}}}}}}{yxvuttstvwxyzz{{|||}}~~~}}}|{{zxvtrpnljjiiijjkjigfedcbbdeffeca_\YVTUVWX[^acdfghijkkllmmmmmmnnoqtx{}~}{{zy{}{xvsqnkfa\WPJC=:742468::::97420//./247;?DIMOQTUTSRQPONORUW[afkortwwvtsqpnmllmmmllkkklllkkjihfedccbccdegjloty~~|ywvtsqoljheb_\ZWUSQOMKJIHJMPTX^cilmnpnligfedcdfhjmoqsuwy{}}~~~}}|{{zzyyzz{yxvtrqomoprtvxz|||}}|zyxvtrpomlklmnoprstsrrqpnmljhfeeeeeedddba`^\ZXWUSQPONMMOQSVZ_cghjkllkklmoqtw{{tnnmmmrw|{yvsrux{~|yvronoqsuz~zupkfb][[\\\]]^]\[ZWUROLIFBAABBDGKNOONNMJHFDCBAAABBCEGIMQVZ^bfjmpsvvvutplgc`]ZWXXYZ\^`bdfhjmqtxz|~{xuplgca_][^acgmsy~~}|{zyyxxxvtsqpnmlkihgfeedfgijkmnonnmmlkkjhfdca`__adfimrvyxwwuqnjhgfedefghhhhgeca_]ZXWWVVWXZ[]_`bccccb`_]]^`aeinrttuutrpnnopqsvz}}{yw{}zwusqoonnnprtvx{~|zwurpmkiihhimptx~}|zyyyyyyxxwtromkihhjlnprtvvtsqolifc_\YWUTRSUVXY[]_``abcefhknrvz~{vusrpu{}{yxxyyyzz{{zzyywvutrqpooppqtvy{||}}|{zz}~{wtrqonopqrrsssqomlkjihgfedba`____`bdfhikmnnnnnmmllnoprtvxyz{|}|{zyxwvvwxyyzz{zxusplheb`^\[\\]]^_`_^][YWTRPONLMNOPQQRSRPOMLJIGILNQUY]accdec`^[[[ZZ\^acddefffeeefffgijklmnoonnnljhfdba__```bcefhiklmmnnmllklmnprtvxyyzzz{{|}|ywutruwz||ywxyy{~~}}~~~|yvsstuwy|~{wsokheaaabbdgillllligda]YUQNKHEC@><841-)&"!#%'+047889851-*(&$#&*-18>DJNSW[]_abdegikmoqtvy{{||{ywtsrrqrtwy{~{xvtrqqppqrstvx{}{wrnkosx}}|}|wrnifedcbccdddeeeeffghjkmnpqpnkid^XSNJFBBDEGKOTY]adhjklmlkihhiijkmnpqqrstuwx{}}zwurqonmnopqqpppmkhfc`][YXVUVVWWYZ\]_`bcegijlmoppoooqrsuwz||z{{|yqmifbgmsy|wurpnoqrssrrrmhc^[XUTY_eku~|y{}wphc`^[\`cgmt{~{wvuuttttttssrrrssuwy{|vrmieddccegikmpruwxz|{{zyyxxwz|~{xurpnljihgfedcba`_^]\[[ZYXXWVUTRPNJFA=83.*)*+,/26:::9851,(&$" "$&(+/36889:853000//37;?BDGJKLMNPRTVWXZ[\^_`cfhklnoppqqqux|~}{z{{||zwusmhc^XRLGDA><==>>>>>><:8789:;=?ACCBBBAA@@BCDEEFFFEEDDDDDDFGHJLORSRQPNKGDBBAACFILNOPQPOMLJIGFFGIJNRVZ]_acb`][YXWVX\_chmsx|~yurnmoqsuwz|~}|{ywusrssttuvwxwvusrqppoonoqrtwz}~~~}{zywwvvuuttsuxz}ysokgcfhjmt{}ytqppoptw{{vspmlnprv{|wsnlkjikoswz}}{yy{|~ztojefhkmrx}ztokgb^\[YXWUTSPMJGC?;77888<;:9741-*('%$&(*,.024578:;<=>>==<<<==>@ACEGIKMPRTX[_begjllkkkklllptx{}yuqnljhgggggghhggfeca_][ZXVUTSROKHD@;612234:AGNT[agggggc`\YWVTSSRRRSTUVY\_adfilnqtwz}{wsnid``__`dhlpuz|yvroljhfdba_^\ZXVTQOMLLKLORUWYZ[[XTQNJFB?><;:987765433333445543210/./02369<@CGKORTVXXWUTRQPNOQSUY]bfkpuz~~{yvuuuuvy|~~~}ztoje`[VSRQOOPPQQPPONMLKJJIHHHIIHGFEC@>;97523467<:752112258<:7543212468;>ADFIKMNOOPONLKJIIHILNPSVX[]_acccccdefhkosw|~{ywxxyy|~|zyxwvvuuutsrqomkheb_\ZWTSSSSSTTUUUUUVWXY[]`bdefgfedccbbacegikmoqqqrrqpnmmmnnqtw{|}~|zxwwvuvxy{~¿}vpid`\XWWWWXYZ\\\[[]_acfjnrux|~|yvsqomkmnpruy||xtpkfb]YVROMJHFCA>;72.*&" "&*.13467889:<>@BEGJMORTW[_cfjmqtvxz|~|xwutsrrqqpoonnooooppprtvxz|~~|zxvspnlkjijklmopqqomkiea][YXWWXZ\]^_`_\ZWURPMLMMNORUXZ[\]\YWTQNJGEFFGJNRVZ^aeeca_[VQMJHFDEGJLPTY]^]]\ZWTRRSTUY]bfkotx}ÿ|xupkgb^ZUQNKHEC@><9753211013579;=?@BCEEFFGHIKLORUY\`cgjmptwz}~yuponmlosvy{~}|ywusqomljihfdb`^\[ZZ\^`begjmnprssttsqomkgda__``bfkptw{~~~|zxvw{~~xrmhb]\\[[]`cfilortvx{~ſ¿yvrolkigec`^ZTNID@=98:ADGKNRUYXWUTNG@840+'+/48?ELSX]afimpsw{~{vsrqpqrsttsrqponlnruy|~|ywtqnlllmnt|}{ywurpmknqsvy{~}zxuqmifdba_]\ZYYXXXYZZ[\\]]_`abbccccccb^[WTPMIGIJKMQVZ^djpw}ypgb`][]dkrx}}ywusqqrsttsrqqppopqrtuvwyxwvupjd]WPJCBBAAFMSY^bfkhda]XQKEDDCBFJNRTUWYVSQNLJIGGGGGKOSW]djprtuwwxxy}ĿĿ|vohb[TNGC?;8889:;=?ABCDEEEDDA>:741-*'%"!)19AFJOSRRQQRRSTY_djnsw{xvtqmiebccdfnv{rkfb]]_behmquz~~|zxvuttsrqqponnmnopqqppolheb`^\ZYWUSPLIFDB?>?@ABEHKOSW\^_`a^YTOID>96778:@CEGKPTX[]`b_\ZWTQNKNPSV[`eilortvxz|~}|yvroljhfdcbaa``_____]ZWTRPOMORTWYYZ[XTQMLKKJNSY^bfjmnnnnnoopqrtuxz}}xtrpmkpv{yxwww~}|ywurolifb_[YWVTTSSRQPONNNMMNOPQPONMHB=71,'" !"$(,15:@EKLMMNKHEBAA@@CGJNSY^djpv{~~}{zz}}yusrpnnnmmmllkhea^XQKEDBA@HPYajs|}}ulfc`]\_bdghijjhgecba``cehjmorsstttssrrsstvz}~xrlf_YSMJHECHMRW^elsvx{~|zywsolhea^[[ZZZ^adhov}~}|{zxvtrojfa\WRNJIHGFFEEEDCBAAAA@?=<:864479;?DINQSUWWVUTUWXZ^chmqsuwwutrqqpooonnprtwxz|~{xurpnlilpsw|{vqrrssx}}wqkihhghjkmnpqstvwyyyyyzz{|~~||{{{zyxwtqnkgc_\XUROLJHFFEEEEFFFDB@?>=<;98766666655532001346:?CFJMQSTUVVSPNJFB=:741////0134679:??@ABBCDDCCBCEFHLRW]cioux{~¿}{ywvusqoljgc_[WRNIFDA?=<;99887788999::::9986420-+(&$" !"$%),047:>AEINRVZ]abccdddddgknry}zwtrpmkjjiiiihhgfedb`][WRMIEB>;9753210..//024689:;<:752/,)&$#! &,26:?CFHKNOPPQSUVX\`dhknqtx{~yupljhgefhikkkjjgc_[UPJE?93-)&# !"#$&'&&%$$$##$&')*+,-+)(&"#(-39>??@@><:9;<>?BDFHIJJKLMNOPPQQPONMNOPRVY]`bdggfdb`^\YXWVUVWXY]bglrw|Ŀ~|{wtronpruy~ytplgghijmptwwwvutrpnnnnnljhfa\VQLHD??>>=AFJOTY^cbba`[WRMKHFDFGIJLOQSUWXZXWUTRPNLMOPQTX[^adgiiiiihgffhjlnsw|}|zxvsqnlifedba`_^]]^^^`bdfghijiihhggffghhiihhgd`\XTPLIGFDCDDEDB?=94/*%#   - !&+06=EMSY_ehjlnpqrsuy}}|zywuspmjgeb_\ZWTPLHC>94/*%   !(/47:>?@ABBCDEGILOSX]afkpty~zvqnlkiilorux|{vrnjfbabcdfimpponmhb[TOLHDEHKMPSVXWURPKE@:51,('(()/7>ELSZadegigeb``__^adhkorvy|~~~~~}{zxvttwz~~ytomjhfghiiklmnpqrsttuuvwxyyzzzyxwxyz{þ~~}}|xndZTNHBFIMQ[epyysonmmmpsvy|~}vojgebcfilorvy|}~|zvqmhc_ZVSQOMMNOPSX]behknnljhffedfiloqqrsoje`\XTPOOOORUX[]_ac`]ZWQKD><:86:50+%  -  #(/7>FLPTWXWUTRPNMNQTX]ciotx|}yuqmkjihkpty}}yuromkikmoqsuxzyxwvspmjigfddeefhjlnprtvvwwwwvvvxy{|~~{xussrrsux{}|{zxtokhfdbacdfimrw| \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s5.bin b/applications/PoP/poc/res/sound/s5.bin deleted file mode 100644 index ad44575..0000000 --- a/applications/PoP/poc/res/sound/s5.bin +++ /dev/null @@ -1 +0,0 @@ -xqjfb^Z[]_aeimqqqrromjgggffhjlnmllkgd`]ZXUSUWY\dlu}|void_ZZ\_bfkptvwxyxvtssstux|{vrmmmnou{|qg`ZTNOPQRUX[^__``aabbdfgiklnoooookhea\WQMLKKKNQTX\afjmqtvtrpnid_[XVSQQQQRSUWZ_dintz~}|{}|yvspnligfecbbbccfimpswz}{zxwqke`[WSOQRTUY\_bdfhjkklljhfdb`^]_acehkoqonmkfb^ZYWUUXZ]aejnrtwz{||}}|{zyxxwwwwwvutsqpnmkihfeeeegjmprstusqnlifc`__^^__`aaaaaabbcccbbbaa``aabbbaaaa``abdefhikmpruwy|~~~~~}}}xsrtuwy{~~|zwtqnljighhijkmnpppoolhd`\WSNMLJIKNPSVZ]aabbc`\YVTRQOOPPPRTUWZ]`ceghjjjjjklmnqsuwxyyzzzzzz{{{|}~}zxwvuuwz|}yvsqopruwz|~|zyxwvtsrqonljhfdcbaa`aaba_]ZWPJD>83-*+,-048ACDLSY`dijqzzphd]YRND><697=COXajmtrw}zxrrnkknie`\XVRPKGA?BFQUZffkmpszzsmkihgijjhfida]XUNJGHJMUY_ehmpu{xspnlorrsppmkga\WPNLORVY^_ehos|~{yxvvtvvuqnnjfebYUXS\]fimwx{~ywxtslffddcbdfhijloquuz}{vqlmnomilnponnotuz~~xtqrpprpofebdgkmnprw|~|wspmkigcdfjmptw~}yvqlgda]XVWUTQNKKNSY_dhjjlosy~yuqpmnlnonkhhac]_[XUTRNNNNLMNQRTUTSVYZ\cfs{xwuwwrjfddehgjigfeffheaXRLKKLJGHKOTY\`dhmrx~~zvsqrpnhd`]ZXUSRPMHFFHLPRQQTY\cmt|~}zz|{~wzxyusogd`_YWRQMOS\bjoptt}yuttuwvsqmhea^ZURNJHFGILORVX[`elv}}zvqnopsrsqnia_]`eiotx}vqkiopttrlgeabafdeehlt~~zvrnje_ZWWZ[\\]]_acfgfdeghnpsw||zurptronlmghgfgfhe_^WWRTWW_ajllqr{}~|z{{~|{{{{z|{yxvututuvuuyy{~~|wrmhdbciptutrqppolhda__beinsuwz}}|}~}ywtrmjihhlmmkhgghfda`aaaceghklnrttsuux|~}{yxwutusux~}{xvuusttuusstuvx|~~~~{z|~|tpmnopqomlhhhilosvusqopux||{xusttxz}}|~}~||}|yvspmjgda_^adhlosvxxvusrqonoqsvz~~~|zyz{|~}{xvvwvwvvupnllmnprttuutussrppmknqv{}}}~~~~~|{|}||{}|zxvutvvuttsrnjhffgijklmnonnonooppprsuvwvvwvwvvwwxz~~{z{~~|zvsqpqsuvutuxz}}{{z{}}{zyzz|}||{zzzxxx{{{|}~~}}~}|{|}~~~|xttsrqonmnoqqpnllmoponomkllmopopopnpqtx{|~~||{|{{z{zwvututuvz}~~~~~~}||||~~|}~|{zyz{}~~}zxxy|~|yxyz|~~}{yyz||~~~}|zwrnommnpsw{}|{z|~~{xvvwz{{|{|}}~{yurssvx|||{{{|{zyyyyxy{~~~~~}|zyyz}{xxz}~~~}}|}~||}~~}}}~~}~~~~~~|{zxxyz}}}{ywvwxz{{||{xusqrqpruwy{~~|zyy|~~~}|{z{zz|~~}~~~~|~~}}}}~~~~~~~}}|{{zz{}}}}}~||{{{|{}~~|}||{{~~||}~~~}}{yxwwwxy|~|zyzz|~}|zyxx{~~|{{}~{ywtrqqsvxyzyxwwy||{{z{}~~}}yyxx{~~}}|~|yxx{{xwvvvvvwxzz|~~|{}~}{{zzzz{~}{ywwxy{|{{z{{{{{||~~~~~~}}{yxwwusssvy{}}}{zxyy{}}{zwwvvwxy{{~~}yurrrttvy|}zyxy|~~~~}zxyzz{z{}~~}{yzyyyyz|~~}|yyyz|~}{zyxxx{|~}|||{|}}~~~~~~~}|~}}}}zwvvuuvx{}~~|{||}~~|zyxxy{~~||{|~~|z{|~}{{z{||||{|}}{zyxxyz|~~~~~~~{{yxxy|~~~}||}}|||{|}~~~}}~~}||{}~~}||{zyzzz{|~~}{zyyy{}~~~~}~~}e@(")%(/6DcwbN>3..16;@FLRY\V[he[[]`cfjmortwz|~¼~wrsqnrupmquoe]VZ]ZZ]bgeemnnpopsvusuuuuw|{zyz~}|~~|}zvvwxywwxuuuvy}~~|uokkiffjllmomgb_\^daWZffcfhhgbadbcedeecacikkllmmnqsqv{{yywwurtusw{}}|yuronopruxz}|xuqmkklkkloruy||}~|{{|}|zzyxwwxy{}~~}|}~~|zxvtsrpnlkkkjhgffghjlklllmnoqqponnnopomjhfcaaa``a`bdgjlmopqppomjgea^ZWWWWWXYZ]`bflptx||zxvtrpomlkjhijklnqstuxyyxurponpqsuvy{|||}~}{yvutstuwy{}}}}~}{yyyyyyz|}}zxvuvwxyyyz|~zyz|~|yvplhe`[TOMNRV[_dfhhikkkjihhhiknmllmorux{|}~|{zzxtrpnmlkihhhilpsuuuuuuvwxuqnic_ZWVUUVZ^bglqtwyxvsojfb_\YWWWY[_ejosuw}{upmlotwx{|}}|}|zz{|}}}|||~~~}|zxtqmklnqstw|}|||{yxwxyxwwusppqrrruxz|~~|zwspppppprssuz}{zz{}{xuuvwxwutv{}xvuutsqonnpsvyzz{}~~}{yuqmkmoruy|}|||}~{xsqooqvzzvsplhc_^]\]]ZVUVWZ]bdfjlmnprrsssssssttuvx{|~}ysmkllkkmrw|~{wsponosx|{unigda`aadgjmqx{xutux{~{xsnifdba`_^]\^`cfkpuwxz|}}{ywvwxwvwvtqomlkkkjjkmoruwz|}||}|zwutuuvwxyz|}~|zwspljhfefhjmpuzzuonnlkkkkkkllnopoprtutsrrrrqpoliecbdfhhjkkjklnnnnnmmnqtvvwwxz}~|zxurqsuvvvwxwvvvvusrpmkjhfc_[YXXYZ[\]_aabceghijlmnpsuwz|}~~|{yvspppprrsuw{}|{{{z{}~{wsokhhfefiknosvy||}|{yunhd^[XVTTVVX[`eiloruuwxyz{||{zxwwwxwtrponmlllkkkkklmnmmnnnmljihgecba`aabdgjnqtwyzyxvutrpljhffgjlmprtuvwy{||{zyxvuutttuuwxyyz{||~{yyxwwxxwwx{|}~|||}~|ywusrstuvxz}}zwrollllkklmmmnnprrtuvx{|~{vqmjgdbba_^^^^`abaa`^^^_``bcddegjlpuz~|yvtrrrqqqrsuw{}~}}|{zyxtrpnoprsuwz|}|yyyyz|~}|~}|{ywvvw{|{zzz{z{|}~~||}}}~|zxvvxz|||{{}~|{{z{|}{zyy{}~~~}|}||}|{zyyxwvvuuuvvwxz|~~}{{|{{zyxusttvy{~}|||{yvttuvwyzz{{|~~~~{yxwwwwwwwuuuvy{{|zxwvwxxxvtrpppprsttuuvvwy{|||{ywvvvvurqpoprtuuttuvxyz|~~{xvvusrrrrstuwxyyxxxyz{{{zxvustuuuuuvwy{|~}}{zyxxyz{||z{||~~~}|{{}~}zyyyyyyxwxz}~}{yxwwxyz}}{zzz{|}}{z|~{xwwz|~~{ywvtsqonmnnnnnooooppqrtttsrrqqsuuuuvvvwyz|{yz|~~}yyyxwvvuuvw{}|{{zyyyz|~}||}~}|{ywutuutuuvwxyy{|~}zxusrqqrtvxz|~}{ywusqonnoruwxyz|}}zxwwxxyyyyz|~~|zxvtrpnmnnnnpprsuwz|~~}|{zzyyyz{zzyxxxyzzzzzyyyyyzzz{|||}~~~}~~}{yxxwvvuwyz{|}~~}||}}}|||{{||}}}~~~}|||}}}~~}|}|{zzyyyxxxyz{||~~}}}|||{{{{||| \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s6.bin b/applications/PoP/poc/res/sound/s6.bin deleted file mode 100644 index 20ad5a4..0000000 --- a/applications/PoP/poc/res/sound/s6.bin +++ /dev/null @@ -1 +0,0 @@ -~~}}}|||||||{zzzyyyxxxxxxxyyyyyyyzzz{{|||}}~~~}}|{{zyyxxxwwwwvvvuuuuuuvvwwwwxyyyzz{|}~~~}|{zyxwvutssrqpppooooopqqrstvwyz|}~|zxvtsponmmmlmmmnopqsuvxz|~}{zxwwvvuuuuvvwxyz{}~~}|{zyxwwwwwwxxxyz{}~~}{zzyxxxxxxyyyzz{{|}~~~}}||{{{{{|||}}~~~~~~t}}barkKLfkZWr{xw}vtwwqmmmha^_]YWZ]^_bfijjlnoopruwx{~}||}|||{zywusrqpppqrqqqrsrpppooopqrrtuvwwxxxxyxwyz{{}~~}|||||}}||||{zzyxxxwwwwxxwwwwwwvvvvvvvvwxxxxyyyyyyyyzzzz{{|}}}~}~~~~~~~~~}}}}}}}}|||{zzzzyyyyyxxyyyyyxxxxxxxxxxxyyyyyzzzz{{|||||}}||}}}}}}}~~~~~~~~~~~~~}}}}|||||||{{{{{{{{zzzzzzyzzzzzzzzzzzzzzzzzzzzzzz{{{||}}}}}}~~~~~~~~~~}}|||||{{{{{{{{{{{{{{{{|{|{{{{{{{{zzz{{{|||||||||||||||||||||||||}}~~~~~~~~~}}}}}||{||{{{{zzzzzzzzzzzzzzzzzz{{{{zzz{{{{{{{{{{{||||}}||}}}}~~~~~~}}}}||||||{{{{{{{{{{zzzzzyyyyyyzzzzzz{{{{{{{|||||||||||}}~~~~~~}}}~~~~~~~}}}|||{{{{{{zzzzzzzzzzyyyyyyyyyzzzzzzyzzzzz{{{||||||}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}||{{{{{zzzyyyyyxxxyyyyyyyyyyyyyzzzzz{{{{{{{|||}}}}~~~~~~~}}||||{{{zzzzyyyyyyxxxxxxxxxxxwwxxxxxxxxxxxxxxxxyyyzzzzz{{z{|||}}~~~}|||{{zyyyxxxxwwwvuuvuvuvvvvvvvvvvvuuuuuuuvvvvwwwxxxxxxyyyz{{||}}~~~~~}||{{zzyxxxwwvvuutsssrrqqqqqppppqqqrrrrssssttttuuvwwxxyz{|}}~~}|{{yxxwvutsrqpponnmmlllkkkkjjjkkkkkkkllmnoppqrstuvwxyz{}~~|zywutsqpomljigedcba`__^]]\\]]]^^^__`abdeghjkmortvxz}|yurolifc`]ZWUROMKIHFEEEEEFGHIKLNPSUX[_bfimquy}{tmga[TNHC=840,)&%$$%&(*-048<@EKPV\cjrzſ}rg[QG>60*%!"&+18?HR\gq|Žwmc[SKE?:620.-.037@CGKOSX]chntzĿyqh_WOG?82-($" !$'*.28>DKRZcluľzqibZTNHC?<:87789:<@CGKPV[bhnu|~xrmhc_[WUSQONNNOPRTWZ^bfjnsw|}yurnlifdba`_____abdfiknqsvy|umu_AHTTFEVconl}Ҫ{~wjmg|jqvj\Z]UVNJLPTPT\bnt|}zyy}{qgfeiu~yi\RLOWbqrdVMLOXfu{naXUYcqsg_]akxpcZY^huyj^WW[ftzla[[`jxzl`[[`lzuf]YZbm{vh_[[bm{rf]X[blzrg^[^eq~xlebdjtuia^`gp|tjc`bgp|xngcejr|zqjggjr|{rkhhkrz{slggkpvvpljlqxzsommrx~zsnlmptz|wqppruz}xp{sm}|zwsrqu||wstootwz{tspmswy{urpopux~}wtrqsvz}ywuuy|}yuttvz~{xvvwz|yvvwy}{yvuvx{}zwuttvx{~}zxvuuvx{}{{{|~~~~~~}|{zz{|}}|{zzz|}~}||||}~~||{{|}}~~||{{{{{|}~~}}}|||}}~~~}}~~}|{{{z{{|}~~}}}||}~~~~~~}||{{|||}~~}~~~{~~~~}~~z~|~~~}~}}~~~}|~}{}{z~~~~||~}~~{~}~~~|{}~}}}x|~x|vx~|||}~}~}{{}}~|~~~}~}~}}{|~}}}{z||~|{||{}}|z{|~|~z~{x~|~{yz~{~w~~|{|z}w}yw}|uwz~z{~~}zx}|}|y~{}~zz|~z~~}}|}}}~}{}||~y|~~|~|z~||}~{|{yz{z{t~~|xxy~xu}|{qvy{r{~~~yyx{|{}s{~x}ox}||y~yw|x~{}~}~||}~}y~~}}}}}}y{}}w}}}z}y~xyw{wr|xtxklkhowvoqt|~xkwourzzrixvxqy~~yt~wxwz|yr}tw~usyv}|xzp~ux}}rz~}|t~xu~tzwv|s{x{{x~{vqnmlnt~{{ny^[sdiqjtovop|euzpwku|r|~qwjzuqyszyj{}x{owy{hx}olglasfy}cultzXqzrxk{ylyv~`avrv_v{xywZfryuyw~~pxeucygyh~xyvgi~o{qywv~{zpyxqwtu{ko}hzf{akfpueqvwlrvyltwvalHzeoy~gprt^d{p~bfuga[va~uab`hp{wynzsr{pzlwfiv~ht|zxu{x{|}~}r|i}sxbyl~t|co|tivor}pskkvq_[u`wuomxvizqsp~wT{mw|fqqe_xgUtx|V{no{sxot~tlou|}mw||sidnzvi}}z~pquohxk}{mrvrimjwpvznxw{r]tsuyzzg{wlz~_{yrwbvquqqirzrayxwzmukvbsirjuvykbletmnx}~yikz~{n}kowrltk_~fyozbw|t]ZrKtoV]`xl_lxTqlrevo{nkmy~dzosnm}_~wI{kxthsqszpo~vx{}h_}t^_slgwzvew|uhjfjhzbw~k}{uomxx|xkpl\vgK~xivpvprqr~y{gzpo|~xrzys{qno~xqhui{}jkq|zw|}{yu~y}mtzsk{uwy{nvlrh~ry|qpxutnstvolavtqhett|jv}qwV~eiisw}wlvivrnxr}rthzxgw||~rv{|}qg|bh}}~znk|e{|xxejxuynutrvq]}ztupyotxvwzhpfqu{y{rzudyrv{ptnxvxyx~n{yy{ozyz{|s|yv}|z~}{{z}v{~|z}~}|~|x{~~}{|w~ys||{x~zx}{|y{x|~zz|{~}~{~q{~}~}w|~|~~{{w~~|{{}|y~yzz{~zy}~~~~}~z{||}~~~}~|}z}||}{~|~}{}~}~|}z~}|~~~x}y~|z~{~~~~~}~~~~}|~~~|{~~~}|~|~}~}~}~}}~~~|~}}}~~|}~~~~y~lp{|tqq]ytaeqkUMYbny\ax|ujivojkuvrzp~zloxlf{xoYenqz}uoqltreT`gbv}er]UbkycOmkctw[v~buIi{LTejiWTp}|v~ym^ltlxzty{wfLivprtrk]Xc|yr~z~sqry{n_`qvjdnwt~vltqelmjxtydqndqrvpW~daurrsyvcn`khXUclfzők~XRle\{xb]p{neZcryy}x~|srwwlwqXd{tpqbtd`8Hmxyn`wǭs[TSeoUb{pql\kogn{`U`jxhknmy|gyvvqoox~vhzsy}q^Rl~zkhhgnlmlgovzwxz|}t^lUL~gpzm[^}wynat|aUf}yrw}tt~tot}{t[tqg~{rclniz{~ysz|{sqypitz}}zw|yxwqy||y|whn|}yy~~xt~x{}rjnv{~{xz{vqrywtw|}zy{xyuvxry~ztx~~y~~}zy{xz{}~||{}~~}~~}}yv{~}}xx}~~{w|~}}|~|{~z}z~y{~}}|}}{|~}~}}zwz}~zz~}~~|{~|~~yy~~zyz~~}}~}{wz}y}}~}{~{z~}}{{~}~|~}}~~~{~~~}}|}~~|~~~~~}~~~uvmgfe~{gcgTUKex}uRIf[dfSOhҊI2KpYW]h͓A'A^=\ďW)&WϹxE6\Z;EpБI8`tGAerINmVW|X:Rznjn[Hg~hfvlroneSY}vbnw}~Y^u^bhftmwy|ff}x{}uyo`rvt}qvy~wkyti|shxzz}u{v|}wrhp{l]gpgrkjxzzuqnrxisxvtihk_swkfskeiu}cfh]cofWnrjfne_swmk~oepqdilhwztzvqw~qp{xx{zz}vuu|xowwu|~xs}{{x~tu~yvwzvw}vu{y}~{z{yr{{{~}{}}~}~~}}xu||xy||}}{~~xw|z{~|y|~{}|{zz|{zx{~{uw{|}~}}xy}|z}zy}~{yz|}{~xx}|~~~}~~}~~{|~~~|~~||~}}~~z|~}{}~{~{{~~}}|}~|||}~}~~z{|{}}}|~}{|~|}~~~{z}~}~{|~}}}~~}|{{~~}}~~~|}~~~~|}~smrr`bOGg^Drpqg,)IIJO3>TmjEUbӵb/P~qw›j]}ݸe" "^{XcuƓE *LŖdTmˈxYmqLAHE~Ćfz~eu4JfcQpr_^apmP`mi|jrpxfvTPɍdvcSObğ|zrdto_O=^}{~m|hJQr~jWlƼwmJ>SjwncqvxW7#@yljzn\HKd~u[Yuepmizyqs|vberyfohah^N_x|x`o}qgq{~zig{iUUtarrfdvzx}rzwsvys|qxyzrjcg\[q|vwrrx{jczsxwm^Xs{|~}~zlrnjbli^fu~tpx{n_l}yps|wjm}|pv~zwyy~xnmvyyv|usvusvx{pl}z{{{~~urxtnx|~wtvyvry{wsuz~~upw~{sqw{vtw}pgt~usv}{}|xz{zwux~|{~~|}|y|}z{ywwvz}~}~~yvxyvuzz{|z~~{y{{wx|}wyrpty}~{try{|zuw{}}~}~~{wuu{~~}zz~{zz}}ztv|||}|~xv|}}}{zz|zx|}}wtv{|}{xxy}}~|~|{}z{}~|~|zz~~}|~}}~{~}}~~|{~}|}~~~}~wx{}}}z{}~~zwqlndmam[jpoo^|kfuobv|`oomklmmllnjj||vtxwx|}~{wx~}zy~~~~|}}{xxy{}}zy{|yy~}{zzy{|}~}~~}~~~}z}~{x{~{~}||~}|}}~xxwwz}z|}~~{wvx~~~{xz}~|}|yy}}|{zz{~{vrqqsy~yvy~|z{~}|{yxy|{yz}}zy{~|}~|z|~{yz|}|}}}}}|{}~~~~~|{z|~~~}~}{z~~~}|}~}}{|~~}|}~zxy|~|{|}}||~}|~~~~~}}|}~~~}yxz|~}|}~~}|}}}~~}}~}}~~~~||}}}}}}~}~}}~~~~~~~}}~~~~~}}~~}}~}~~~~}~~~~~~}}~~}~~~~~}|~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s7.bin b/applications/PoP/poc/res/sound/s7.bin deleted file mode 100644 index f7a69cc..0000000 --- a/applications/PoP/poc/res/sound/s7.bin +++ /dev/null @@ -1 +0,0 @@ -}}}~~~~}}}}|}jeq}|z|yrryyux}{xqjq}|{uf_`^[f|zyv_NXf[LNQKY~htr[K=,(ǁ:g̝aFeC]^%ja;Z½O)ۙKA]Tsp!C}ƭyUUi~fLF`ʨ\=;OalsiWTamqz[1-L{ǬoI2;füX.$:b|zҠ_1%8Z{umq|~o^V`}uYQXemh\SWktXQ`}|w_C5?arfmiVUkw]RZpkQELa{ykhqzƦo?.9CI^uzw`SkhjyykhvzlkxebpzpkdfwstvjRMo~}vjfs}lfeeiqpd^k{yf]mq=*DoɹjUXx¶nadg_TQUc`;;^}o\SfƗo]cry~zWAKow\J=:ETf}rmq|jYZlzaTS^qq`Z]ht{dC5FiaB8Gayza[ltehu\LYu}jaepskdi~mUQ_qyozxh`gqvwzhQO]ktvqmqwxrlmz{oms||wz~znaY[clrvzshehlmpzsel|xtor|wgdm{xoszzrlp~vuxyxuqrwyshag{pho{}vrszyswzrns~lfimnlhgmtvtpoyytx||{|zy~|vtvwtrrtvvvtsv{}wngfn{zuv|aMXp}~wjjtrhimlsoillp|{quzhXlwkn}z~F$Bijkuã~vt[Tpi3;[ceq|ûqr|vS,0LXbq`tӶod{|WHA2:^vx|fn~xpr];1DZl{}{ֵ~lQ6"$C]_`ltx_A@KS\jtztP?EP]kpowhB,&1NgfbjntĬnJ4?bvvzzjfydF8CUg|}|hO?^}yaX_oxmXMSk|igpvo_OGJ\t~{|}sf^^gr{|rhdhs}zvxzz|~|vmfeipx}z~neiw|k`]ezzpr}|eSOZpsdajm`bp|kaeuxe^fzs_V\po``m~j\Zfx}qkm{vfdkxrijt{tsw~xplms{zx{zohhoz}upqz~xy}tpqqwznpmWYtgOaW7GʼnF6b^?`|R8NZJupQIoRS~_D:icbaȃhm^y73Mcf_Ukz}wV0IINoYgq`XXZom||fTi|smt}|obUb~~sdl~}{qxrjqmelupnwvso\PJKZlzzwol|}i]YTUafdkqqu||xbYVR\ox{woljm{~wssuy~|unh\W^fr~yjb\RQYeoyuqmlgbbackw{zzxvvyuqlklnrv}~|~zyxuttw{}{z{~{wy}}xrnov~}zyyxurswzyurnkkklow}{ysnlqtx~|xtstvz}{wtwx|}~~{www{||{|~~~~}|}|{{|{zyzyyyxwvututssrpooonnlkjkjiiijjjkjjjiiihjklklnopqrstuuuuttuvwyyz{|}~|{{~}ytrrruuoloolkhghihfeeedgihfedfhhiijlmjghkntvutsrqquvwxxz|zvu{~{|zwttrpqolpqqphcgknmjffgdbdgomlkkjfbgknnllmnkfgkrvqmmppppuxvsposuvv{~~}zwttw}xtsqonnpmidceimonkgedeknkcZ[djigeglqmjnsz|yuw||{zvvvzzsrrokeceig_^flnd]^didY\chd]]gsvpmouxwy|||wruy|vrvwwtsuyxqkpw}~zqr|~~wurniclqtxsry|{|~|y}}~vonnlc]][[VRX\WNMWeuxruy{vlp{uhilsmaagf]RRY__]`iqvxvxotmcad\YV_daS>AOWbXYlifa]irunlvz}wuynjkrsnigd\TW`kttty|uokryz~{}{jco}}j\]^^VOZdkh^gpme\^k{}qswz|yĺȷy}mTEIVWH>:4. )30!&::7/3FVYOISX^YXr{lyyyprzylmiheetxx}wtoq}~~syshjnwjWH;0)#1:;/ 2DURQ[ihd]y˼Ȼxs~xYXQNLEQbeaQRZUH>DOVWD1W_bPPzwKVamransVbѶzp}|mtrd_z[XdhoinsZL?BQ]lhWGHRJIWmvwwwpT@AFKSTemjuyh`ON^btr`GDLXlgm~henzii\^eYm|ziUSKQccxdo޽ͿŪƯrc\TYZjpX:'5IO_e}zhXceaZ[}^X]fniqweJ69@BLUm~mUVcgqw·›{|{mVH,% "-9FDN\}t}ʹ~oxtvTH9:PRZRFMIQk|}_fhqna\NH>'/OxĺrtyR7CQ]XMOE7$"D]ffr`Zlqalv{ueZftduK?UhvbSD>;2P{mlUC]zǺƸvtrVrnfaiFBcoXT\\YEYxusun^:A^l{wtZ.GlqkqtmZioIG]sumpmdOX_@QpcSU[P@Xrs{s79UhV+'$(Euʠ_\|s`fňe|nF 5byj;Hp|c-/Pso\ryweqĴ˶tbntZ7+Zɲe-0]P331),Uw}snhֳN-@ex`@BNULBLa}bvpqqXK_{aiyqmYmyVNl\qokUB>2IeinnYMAUxorVZVglmydO^o}|xznkloybr~naj^ae^TpeoyuusviZbdRI7.02NMKwsz]KQBDUagOI0Dchzkntp[^~|g[XL]XYx{yssr~wrskecf`eyx|}~yxg]\RRV^pz}o`epsi`r{jhjasrla^USPQopmbl||zx{}~pjbejp|t|{{piclokcu|qtzuyrn|{{}vilpuql~}s|h^ct{w}|wngjlp}|yklrumt~yyskovz|~~yiqpyyqx{}wifi}{}ytpkorz|{skmxzvy|{z{ttsxz~rkrx}{zz}}njlw}~quruuu|}|ynpuwz{yzsuxzz{}y}~iow~|}z{vlpr}~xotxzyx|yztqu}|{}~}~usx|}|~|}tms||~|}qru|}}}otz~~v{~}|y|wrw{~z}|xty}~{z}}}qrz~~}}wtwz~~~xtx}|{{||vx{}~|vx{}|~}vsw~}~{vx{~}}~~uw{|}~~|}zx{~~~~zy{~}~|wx|~~~zz{~~~|z|~~~~}{|~}z|}}~{z|~~~x{}}}|~}{|}{}~|~~ww|{|}{~{|}~~}{z}|}~|ww~z{}}~}xzy|~~{||z{yz~}z|zwz{{~}{}}w{z~~~~{||~}yz|{x|xxywy{}~~}}|~{}}~}}}}}~y~zx|}}}yxy}~||xx~|x{|{}{y}zz~vvxxswx}~|y~{||x~|xy}}}|}}y~z{}z|z~~{}}}{x|t~|}}}}z~||{}~x|~}}||}ztsvzwr~w{}}t{|wx}|wy~|wmsxyzvz~~|~zzx}~{~bbexzhy{iyvwz|x|~sy~|{w}yz~ru|z{t{vn~}wszx}stv{{wxy|~~xrwupx}{}|~u|~|ls}}r~pqs|{yylu|xtwyrvusbywvvup}jqglxysxyzu}r}xx}{||}xuyxyz~|zsmutyytq{wzvz|hxwwvty}|{xtvym|xz}wq~p{~{}|vy|{~||xz{}{{yryvxtn~w}}x|zyn}pryn}xl{rlvxn}rz}|nvwdurn|zspvrtyxpz}~vmr}{{vtjf`{sfwdxzxww}jhup}waXztxl{q]quq}jpxvRp}amqZH?mxoWkh{urzb+1zoO^vVUdwNȎP]Lgqcը*M;buGfƩ?C|RloplҔ4[j%gWRl[i%gn>-]kUYr^e_KX{pUcy]QO.DxdGZikr|پuMKcu{ursw͹{m`^k}}tlgYKMZfg^VMELduvrph`affW>/-8Q\VSX[Zns{x}|}ɿs_[`cfims{~xpgZL=1/7<@DHMXaa`_VOUYVW^gkpw|xwvx{zrmljec_YVUSTURNKHHIMU]doy}vplc]]ZWWVVVVWWTRQNJGECBBCBDGDEMPOSYXYZ\]Z\bcdlw{}}~yttv|~~xsttxyrrx{ww{{~x{ytpmg_[SR]^WVW[VICDED@<9?LQB>QWMPTONOTOG\gWTZ]fqsstvn\]pxsoXRW^fq}}sswy{{xvtty{~{w{~vojhd]\bghjmoruy{ywz|ytvz{yxwy{{yxzyxvrsuspruwxvuxytrsonuz|~xrwxuwyy|~~xsojfhjlnigjmosxywvusqole^YTOMORUY]^_bdfkrxzxwvwwupkkprsw}}}{xvtqnjhhfcdb`dedjrv}yvvvvwwuw{|}~}~~~~|zyxvsokga\WQKFCCDHIGEGJNTY]diihhgilmkjnommoqux{|~|xtpnnoponmptx{~~}||{{}}yvwwvvvuttuvxyyz||zxurpmigfcbbbbb`aba_]]]\\[ZYXWXZ\_a``dfgknljlnprtx~~|zyxspopnmlkmmkhfffec``chha_bcbcgiiihghmrstw{}~{z{|{|~~||{y{||}~}~~~|yzyy{~}~}zxxxxwwxwy{zyxwvxyyxxyxwvwyzz{zxvsqqqpooonmkklkkkklnqsuwyyzzyxwxxvwyxvuw|~|{zyxyzyyzyxywuttrqpqqrsqponmkigedbaabcdegjnoqtvuvxwwxxy{|}~~}}~~}}~~}|zwuttsrrqpqpooqrponnoooopqrrtvyzzyz|}}}}}~~}{zxwvvvwxwuuuuuuvvvwwvwwwxxwxyzzz|~|yxxwvvtsrponmkjijklklnoonpqqrstttsssrsrstuvxz{|{{{{zyyz{{|}~~~~~~}|zxvuusqqpoooopqrssrqpoooponmnnmmmnmnoprqppqppqpppoonnoooopqrssrqrsstuwyyxwxwxyxy}~~}~}zwtqooruwy{zwutstuvwwwutrqppqrtuuutsrqpqsttsssrrqonmmkjjknrtw{~~|zxyz}~}|{|}~~}}|}~}{zz{|||{|}||~~|zxvutsrssrqponmlkjiijiiklllmnopppppoonmkkklmprtvvwyyz|~~~~}|{{{zyyxxwvvvxxwwvvutsrrqqpooppqrtuvvvwxyyyyyyxyzzzzyzzz{{||||}}~~}~}|~~~~~}{z{|}~~}|{{yxxxwyzzyzxwwwvvxyxwxyyyzzyyzzyxxwwxxxxxxyxwvutsrrrrstwyzz{}}}}|{{zzxvuwxwvvvuttuvutstttuuuvvwxxxwwwxxxyyyz{|}}}||}}}~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s8.bin b/applications/PoP/poc/res/sound/s8.bin deleted file mode 100644 index 4a4da05..0000000 --- a/applications/PoP/poc/res/sound/s8.bin +++ /dev/null @@ -1 +0,0 @@ -~{~{{~{{olftRq``gՓurIkb?=* ,T/ ob;jtG_Ŷkc̰ũP5qPBLw9ZvrP=A8P^boаth8]t`hafd^Y5&^]t}]Hwgr{lHCRB Q{aJju;jvdqw^R#Br'AwCkBsmӺǵynyOPQ)):+bnGRȵw^2[flfejpveW;45=CVAqpRˉjpʦqx7,\ANMY|SybRBjf}wzklJPJW>R(q/mov͠w͖jrgM22;Z0IKPVdYB/g[F@l|szëȬrz|wwvHOhC_|`fks`XZlPf[[qq~y}gZpyimfoxd\T]\fwsyzvnwhTdWLTR[qdowzm}|{mSmw]cJLiwYQhiftdzhhV@^L`mQ^Xy`ph8\_ujx}}zow~zzvaN\`mqdapzvvl[`jfeilwz{grnv|vzyrggW_za^xwjlsygknogkmp~plujRrlHTV1WYUNcWM^_ejvxkiyvyhe~zspOV`e__vvwuohdkVP\i_SWYTXmefzeZ`NJUi_cjdy{r{qblyWqz{v}n`jXcsqrgyuirpfiV>@C5Gd@EfQIeerƽqlkJOf_]krr{v|peuvibYPTTPcnsjYZ[U`qbp|nrx|qidRMPQdld}uur~|w\opYYQSSO\n|{ntx}snaiQMOUZbdq{rle\S?@RUYdlwx_fdYrslu|pqzndS\LJZekzzrdMLBNtkwQByPSttoXRnjhjSiiSmѧz~nlrrj}y\lÜU|]LSqql[bgb|f=xqr=vSAYcktPo.dvm_fc{Ldkbpk`~qA`o7qvfx|ilvOL~eo{]_\WIVB[jZ{eYgSvqIv{{yjr0;uY;$0TVPcy[uTjJMlIvj;^uhuMev|\XРcmdjAdcix]uqTO]^`Y{xv˚r}yyzimVc`r}d[``~RpVrtyvxnw~sG{ʈ>xsVfxUr^IleyNT=R#Yr~{zmRam|nik|ll`|r}tyuyƉ~uyuiayg@[|eKp{uF?zeyq^LtinosldRYkokvn{bbnt|mi{fnqowiWapIcURGUuhtZLb8viOm_|bhPribhm}yjv~Wpog}{ĬÑywnw}byzuxy`xmmw}f}i}}{ywm}xmvz_~mdgw`hZ|WnMSyYdkv^n}U|wz}mvolo^nwqqWkpd{lglgvhgBP|z}d`Zye^q]PyXq~HqriM_j>crL{A{exLdX{PwQh]PzYkuY_qag}Y}ul[UliQoZedY|ot`fu~nrm|kbw|woqa|uvnzlr{pz{su}j}ydym{tpyv{czhwowtw}xfhNrk}oalfLhseJ=FJDMx{A\e^q`ka]dVSUW[fqSOGDz_jmXO3ZuPGUKa7=QO~xt@H,Faz[}}|R5dFTE4pYXmz{ZelfMM[Zmhb[mVoRzTz|}wnm}{~tK{yx|~~ew}jt~Qþh{yrnnw~{rwy}rxzuzzehq~~evrdVqup]baxjdWt`gyykejz|_ofythik~zzvxyzuvvn}uu~ss{zry}|s~~}tcajs|~qw~z}z|pdqzbbvy}|znjvjn|xaQvyx|wtx||yq~t~~tj{j~u~t{}{z}zx~kjqnf[uxp^l}|pfcsvfqzskzop}lTRnto|q|xtwk}tp{ikn~y}mfsut}|wrv{|{sxvnrxoux|nq~wuyw||qx~~t~~}yz||tzs~rrps{}}|vwpr`omiflyz}x}z{no|rs~txuvs|pfks||~y~wu}v}z~|rwuu}y~voj{xz{|{wyyvv|}|~|~zz}zwu|~}|v~~}~~}|w{wx~x~}z~{u{yf|cuza_czv^yxtgerbixw}ok~ytzl`p~hiwrs~z|{w~z{u|mzvw|~xyr|_x{lw|~spzuzxxuxz~xv|w{}|xuvyy|{w|{|{z}}}|xz{{y}~}}{}~|{{}|vyzz}x|{ux}vsxn{zswvx{y~umkfhurlhglvgg}oi^w`o|vyikpzjzxnq}xz|~}}|{z~|x~xz{xv|~|~zzoyz||}}~{}~~{~||x|z~y{xw||}z~~z||}}~|~}~|{}||||~~}||{~}{||}~{||}xy}|xz~}~||{~}~}}{x|~}}}||}~~}~~}}~z~~y~}~~~|~~~~~~~~~}~~~~~}~~~~~~}~~}y{}~~~~~~~~~}~~~~~~}~~}~~~~~zz|}}|~|}}~~~~~~~~}}~~~{|}z|}~~~}|}~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~|}}}~~~}~~~~~~~~~~~~|{{{{{|}}|~~||}{|~~|{{}~~}||zvsrsuxz}|xwxz|zyyz|||{zxyzzyxvtssrqpnmlmooosx}yvvtqmd[VW[_dgkljgffeimopsyz{{{}~xuvwvwupnqtrrrpmjjlooqrsstvz~~}}~~zurruy{yursx}~}~~||~|~|z|oux}}}}vtnkghinw}|}~zsvrsy}~|~}}{}|yx|}~yxtsonppssptxz~~}|}{{zuqrwzz|~y|vpptz|}~~}~}yldflpv}zz}~~{snikptxyyz~{xwkig`adl}ywzo`W[hqrty~}zxyn_Zblszvqsy|wssvwcL=>JYqykdfkotzytxsianx}raWY`o|trnv|iZ[pvk\[wi\[cnt{uqoeclkp}wljwq[Waz{ePSgtimx|}ne_]\[j|~toqu|xjlqyvbKFMn|jgr|uwr|~pm}~xtxyurvw{tikgdemmu}|vrmpiehdl~yqot}|tqnpyx{zywtpopxyqnljmrx~xvrjhmmrwtxznkt~wrz}~{{iduyt{rv{upw}saYSJiieqxtxx~pwxhc]]mm_VMOkwT<7Ikzpx~spon{`VVXavzmf_^[[_gw|~~{roowwzrknns~su}|xiekm{wswy}snx~wofaitpqtsv}{nefiwrlf__trhnpd`zlp^N_|y[Sct~z}x`Vi{z^RYjty~uivtsx|b\mwzywv^Ycxm[ey}aTZlg_o|Z=An}nkx|jai|z~wsorvs{wzi_ipttocajkmv~yhZOWeunqyv|rqbZcrhX]kmtkqw}here}rkvstnovuࢢsfbfnqn~GOax~}}tztzuqno}sY]|_TkBJetp{yefYWdcmiebyqz`R^|ycmvXBUsxy|zholyxg{pq~edRtz_J+Npk^_OV|yalqKrv}k{|mj_M5HsqS_acqvrZV_vx}lo{aSZtlein{n_jwhs~~xknag?3<[qO83[eJgrrmbpGhYNw|Htqnۥy~{{sa=44>=Qmv|wU;.<_bnO +Vӭyp{fhywywzri]UYTJSY\|nwgZ}ֶzxi|mj}ovMICUcj[[n{hOtdTko}uww~nkp{{uwlnt|mnw{uviboxydYq|v`ix~{h[]SNE+2=" &1Halnwұ|npmxttjkia_DF7B;38WQc|wYOdixzw}tTUvzuoy{|shcYcry|w{ƽ|uhRB@BHJEK\y}ngjVQ\__mujefloulfe^ZSSfmosqwbgolmjnlnow\Lfuqr~~j\UYfrzq_eiuofopw}}unkg\Z^eq}gabehkjmpy~xs~srvtgljtzx{s~zot~wuyUHOfn|x|momd\^pnsv^qs^LLWeeiou{n~~zhlnkjrz~uj_epqu{wmpxy|||}uxy}sy}rmkcackpicljnokhuytzqqcjjleq~yrxzzzqjldefhkqqx|rlttio{}}ywyrt{zqsskfkpt}zqq{}~wogWOR[ejhosrukpriakpnwx}xtzyonoimukfa`]dirpu|yyyzsy{urysjjifmppqmhdcgnpx|~|~{txxy~~yvtvz~~~z|wu|zwtvzx{p}{}|zyspllmnyxvz~uligeiiimopqv|{vvy}~xnjggjmptyyyyzz{{y|}}}wyy}}~}zwx}x|{xwvtuww|{zwtrpnmpqsusolmkkkiffhjmruwwvvx||xwxwyvsqqnkklosyyvvwy}}|{ww}rjdaainqpsvvuxyxy{~|{yyz~{yzyz~|wtqtz|yzxz~}zvtssqpopokjnrtw|~z{ytxz{zrnklnrux|wstux{|~zvsohdbaeipu}~{z{z|}|yututpmkjkmoopppppqsuxz|zxyy{~~|{yxvxywtqnmoqssuvvvvvvvuvvy|{xvx{~|{{zzxvuuwyxwvvuvx{|{{|}}|}~~~}||zxvtstuvx{~~{xssssuvuuvvvvvuvuuttvw||}}~}}~~{ywvwz|}~|{z{}~zwtrrsux{{z{|}~|{zyyxwwxxy{~}zzz{|~~|yyxy|~}}}}}}||zyyyyxyz|||||{z|||~}|}~}~~~~~}~~}}|{zyyzzyyz{{|||||}~~}}~}}|||||||}~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/s9.bin b/applications/PoP/poc/res/sound/s9.bin deleted file mode 100644 index 6f7f476..0000000 --- a/applications/PoP/poc/res/sound/s9.bin +++ /dev/null @@ -1 +0,0 @@ -~}|z{}~|yxy{~}zwwy||ywx|}zy{}|yy|}{{}~|zxxz}}|zwutux|~~}}|{z{~|zz|~ywtsrsw{~|||zyz}}{zyyz~~~~yutv||vrqonorx}{spsvwz}zvx|}xsswy|zusv{}yz}{ussstuwxxurnmnmmnqvz}~{yyxvvx|}}xtrty~tlhioy{tomqywnjjp{zqjgktwpknvyqlnu~|smmr|vpnr|~ulgiq|~xod_akxzrnqzyrrxzogekvxogdisxokmu~wpnry~umjls{~ulghox~tmlqz{tqsyvmggmv}{qkjpyvnkoxwmhir}xmfgmxsgcgqwjejtqiiq{xmglwxlb`ix|sg`bn{tjeitxvurqyulow}|nhhhhp||g\cott{~oecixskjihlw~|~{vv~{{ztvztpw~~qfjxyqlgis|pkr~~zspruyyvvyywvvwvw}~}wsv}y}z}{{|ysquvts|zppuwqjlwztvzzwy~{{}yppw~|wsvyvtuyysruzxohly{tsvvpmswsywt{~x{oehsy|{upjipxmo{{|xnnyvf^amyri`Z_q{pkr|||}}ukb^br{necflt||qhejs|zsppryxrkkv{|qlmpwtkeck{uf\atyj`cmws\V`p~jdhkmv|z{seey}{o^Xh|bU_w{pmkhgo{zslkvvrqkb^dqqb_huzppv~uebn{z~ycQZ|qimztebk{wmfgoz}rhfp{~}~{x|zuppy{qfcm}xhVQ^uxoqz~ytlegwrmssh]b~seamxoaVXlo[MPlyrbL@OttVGQmvaTS`tjWTao~|ikuqiq~ttqf`ksmlgXQ`suzq_Wfx\Xi|wnprrzzsj^^t|ri\R]{uhXLTokSQhhT[n~e\fnnnz|f_gpqpxtmuxu~srtq|ystrdTVoyxwjUQgsZQf}fVdlZaywcaozzxsmt{yst}~plqx{}rjoutqwyhciot~|nkllrzne]\m|meXKKe~vaOSpl^guyu}xrtl_`ysYKYyy`PWr}hevw|yu~rw}laj}pqz|m\[m{zrr~men{|us}||qtuuocgqtrum^]flotwqsrnp~||ypio{uy{sik~ytozw|txzxxr}yspvwpkqvlnohagy{vundh{zpc[cyyePIUnz[OYm~ladpx}unhaZ]m|scY`tngnpdeoz~|k]]iuz{w}yps{sy{~{nhpwhgr{xrv~lhs~{lfpzwjdo||k_g{zqw~mouksrkpn]MObuvliu}ta]j|wovsktux}zvovyrxqddpy{z|qtywomwrdcovsournxysz|{nku~wrv~ysy~tpu~{v{~rnt||yy}|rlr|zxyvrpty~}}||zz{}}zz}~}xwy|xpmt}~~ssz|yz~{rjkpttuy~{yvtsw~}~~~yrpv|uqsutpowzuuxyxvx~||}{x|}yqljmqsrpppmga][^dinrw}|zz}~}}xttvunhdee`[VYbjmmmoqnf_^fs~wpot~}yx||xtszviabhnmjehq{yohgknnigiotw|}yssx}~ztmhfghec``chovzxsoosxxtpkknv~~~~|xutx}{{xqpt|zspokc\Y^gqvuqqyzqprtsrrx|phhnv}}sh`bn|ypjhhgdbelsyzl`[^hzpeemwtifhlqsu{|vla_ht~}nd_blw|vwtaSORZesymdadm{wlgimomknwzoiiigddhoxzmeceijhhmuui`[Y[ahnt~vsv||pnrzyrooljhhjq{}|unmortqjedkt{zoffmw{wsu|tnnsyxqhekxzngfgfcabjuyz|nglstqtz|{~|uoiiu|ywuuvzuqrstwz|~zsot}rlosqmjhfglt{~}ymc^ZWZdsrg^WST_qtd]XRKGLYgopsz~wokijknrw|}|}}|zy|{tnlotyzvrswyvsx}}}}yyytleaafr~{pd[X\cijlpu|zqhdcfkpw|yz}|sf``aaeoy}yussx|vuy~}~|unlnu||wsswywros|ywvtsxzssz~wpnpqqrw~}urstsqrtwyzyxz}tt}}}zngfjoruywd_fqvrkghp}vomptx{~{okq{}uopv{~~~~||xvtqlgefjpwyrnlnrtvy||yusv{zussuxy}~{{zsmhddhov|{yyxwy{{xsoou}tqw}|ukegoy~~sos|yzxpifinrsrv}sga`ciry~|xxz{xsposy}wja\]agox}{||xwywsnmr~wneaaeoz~yuw|yrmklptvx|~zvssvz{vsruwwxz|}||}}vnkmrvy}~|zxuqkefqtpoliec`bkw}vstx|}|wsru|xttuvwxyxwxy}{usuy|yrljq|~~}{yy{}~|xuuxzxtppt{|vsuz}}|{|{yxxyywtqquz|}|~~}|~|{{zwspqtxz{}~~~}zxxyzzyy{~~zwuuvxyyyy{}~{yy}{ursvz}~{yy|~}|z}~{yyz{{{{|||{zywvwwvspnosy~}~~~{yxvurpnnooooqsvy{||||}~~|zyywuttvxz|~}|{zyyyzzzz{{{||}~~}}|}~|yxwwxxwvuuvxz{{{yvuvwy}~~~~}||{{{{{||{zywvuuvwxyxwvvvwxyz{|~}{z{{}~~|zwwxz{|}}||zzyyxwvvvvwwxxyyz}~~~~}|zzz{||}}||{zzzyyyz{{{|}~~~~}||||||||| \ No newline at end of file diff --git a/applications/PoP/poc/res/sound/snd.arc b/applications/PoP/poc/res/sound/snd.arc deleted file mode 100644 index b543331b24dbfdd6d32a43250b45fca224d705bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164352 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 Ya6JOoBXB(e*CTK}0@ow(-@^#}-#OdI3;+NC diff --git a/applications/PoP/poc/res/tiles/0-0.png b/applications/PoP/poc/res/tiles/0-0.png deleted file mode 100644 index e0ed9f1ef4f9ae0e45006c41ca6da78a7a4bfc67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDLGFU$B>FSZx1pu0(nge|JUbv dIDnWS@SaVFSZ?75(9xz}y>~K~5 zf@6@t(TkSFH@@Gr9G VkbF1cS`^SW22WQ%mvv4FO#tv_G^zjq diff --git a/applications/PoP/poc/res/tiles/10-0.png b/applications/PoP/poc/res/tiles/10-0.png deleted file mode 100644 index 9592e3daae9207a283e3f186c9bb24d5f37ae35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmV--0*L*IP)l+j z%NJjKSYfy@L@F>wQ$a%ePbF><{@IOIF7AQd90o(%_4x4nz`6H#{@imumvjF-{3HNb z2*jWsP7J>kvUp@eEf@sDmXyHHiAnTcyn;4)=ij!;Da20u5k2DJXSJ@IK=-M0uxzY> zBuQFZB6u4WvIFi1VXTrJNQ5H#3G517L(S2{c>_K^?ZX;(9gnMAd-18KS3d!h#XM)g zk5o!)H?6clNqy5#Km@GNfMsSglw^v>%6Jkc^NPh4sB~_}+h`Y$-#mPb)y^G@D`0Cp ziLd=}{u++;$6;&m6jeY{{{{3Z76}u&I!FK{01{v%01^-kBLR?rU>FI21O&rK03;w7 zMgkxK!7vg42?&Of0A_L5z73C#)oW!a()Q1bzK@JzxV=NGCqj3$`2H5>{Ig~`N{mMA zyB9(s%BFI_cTe{Bw(0b`JKt|z0XnWKZA0+4c7fG#Jo*#wTBn9 z$bUZrnY04QP=a4+rRV~z(13||@A3KB3+xF7@VuoJ$j(hQXJ=-3Df$+aJ2qkb)gWZQ z56joDMVYk+>gu!}S#mOYBS-h!Ll{1NIbTGKgsE zFfcMQG7uw9bq6?hO=QrFh`~^VOPuNs;1m|YstA`j)g3SpfN4N%9d!T_UA9WcOvY19D>qYfBgz%=RrhEWF$Fkl*W0K=#Q1{g4n zI)Gu+0Rs$}MjgN~>VN?TOe5X_EXbTiRt5~BI=XPaoShScc1$9MrVn@TFuXW_nn5EZ z63oA}U>1X3LK>1mUW(sV_=5${u>X|6%=joY%5;<-3N}gVe5pdkxdc2xe!A(Tk5JM*T+1Q_lf>8qGeSYE4x3V;fL3b0fFRDfq# zDgY|LGb|MV72p|`3V;gm3`+$-1$c&~0-yps!~XXIf~AX3RgckLZulH4kk}zCDUd^hV9I^QiU?UQv?`;h<$_tR^+_893vjQJfCD?X6l@#aj2#!Q= zof`9Vb6^FAw5GcS`1Y|G(_|H%f<5+SAhI_lE?~$G8RBvbwzaH?n+V9Qd-pT3wV5JDt%Fs_ZAHNE-HFT*lm z*u{s86^hKqv4H=+BWS)?NVbTh`%Q&$Zn)6=6YIJqlr*zAxY2dFSZ!b6sG8k|$J9Y`Q zEZni~R0!+*-p12!cE;+9O`l!J&LN=S(7?dR#Da^_=x;FZ9@GBJmr9;MLm50>{an^L HB{Ts5`^X^_ diff --git a/applications/PoP/poc/res/tiles/14-0.png b/applications/PoP/poc/res/tiles/14-0.png deleted file mode 100644 index 0cc421ce38db5cea8e15e9976e5a2b3ff4dd5c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsm-1)jv*Cu-cC20Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/15-0.png b/applications/PoP/poc/res/tiles/15-0.png deleted file mode 100644 index 9bf07093e23ecde8ae1f757c4ca0d211a28d627e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%U{1&i}*qoag-SeSVyC?gsZ^02sle zgr<+|+_$_GzkXf{7CejP8$dXFpq*0TWqk>h?-j^8+D>vq{Vixw6hiDEA!84(O_0Ur zS_eS!AP4J$lF{E+!{sK`!`Kjc1k$ifSbYn&r(D4L@GLWfMm-EWu^X%<;p~A(>^je2 zS^?E~Ke{`v!N%4R(eixQJNhi+A!Hc1xCJ96<2C|A($K6py=28L0tg8|$nC$6e*(rv zdY2cVz3D7If2bqz@YgOly9QbB3@jvB>+mAJCf>L-xYgKaq6JOx-izfSrhlIY#DMYm49~O@+iehKvW5 zO;G(*a@S7lG%yE_Hv&19hmUr?8RO3pxOCk^$ng(ybcvRj@B>;N87Gt9`osyu? z^qCbgP9tg0RS1MOFd7Z`Hq>EuV@o~kzmP%g<6Q3KPfdD$d zL1ARxAeGz<3)3{orjeVLCX$t|ZE^mZ&Svy7JwfODu>XC(&;NJ+=REws3;-KAl#u-? zKh)1j@N3l?5O6HQHGt5*F*`Sn_RcE28*W5dX&3FY*{rm0{8JAI5g{|}9M*XTtxg6W zHI~C)x)ETQ#lGHwI}nK^C@!c&T+Bgq=r1}gxC6k>jLV3PDqS{V@a+R=BKOj|Iw&17 z|G3qA1ny#~!-T160}St*U>IqJtBV&>l1{AcA+%b|@RX=fn0pKB!*`>lt#WMv#9}{$ zs&~*jTTXl)SX%&cJR}OI2fbdCh_d~9#|*TzokT`z6$*22B4$I0)7_E3X5icR z30N$1v>p2DGx4(`W7%aHi{1qaRJKX?l ze6YI=Q)fZy8;yw2JhZl-qMp?6eiN~8B*h=Y{rY|McHB7j917VM1O=wSIHsrOmCa_u z#N_!FY(P^V1aeFed)H0l#fP7Olp7X^X91!nUMjHa%IF&)A~a_M@u95r^%|1m=l zs7zjf)gde-o7UBV8DN;Duw*IylQ4~U!_{RSG?B&Fl~ax0fm$dPT58#u#=4;hNPx_L z6F!)9uvq7)n_~Ne^UDz7VjzpfY&T+EW)_ph1z^z7aui=?jI=#FI|WaP5<-C+eWpXh z4Uo&?X?9+|s)kaYNav~KNf0Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/18-0.png b/applications/PoP/poc/res/tiles/18-0.png deleted file mode 100644 index 0cc421ce38db5cea8e15e9976e5a2b3ff4dd5c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsm-1)jv*Cu-cC20Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/19-0.png b/applications/PoP/poc/res/tiles/19-0.png deleted file mode 100644 index c7dc66421b917e093cc1fabde0edbdca1d211858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsp+0Bjv*Cu-d^3vd)R@;IdIm6 z2=mUFE`Es(d>rRKe>}v$?sa9&EXmTFQLk4Y|9ku$bidV$iR8w_`B6RsS*$0UBs%-q4HWg}yT!;KZqds+3i zeBZ=&9I-zr9koj(!EGDM0iY8ZJYD@<);T3K F0RZqyP?rDz diff --git a/applications/PoP/poc/res/tiles/1A-0.png b/applications/PoP/poc/res/tiles/1A-0.png deleted file mode 100644 index 7fdc838795d8867deb212aecc661325cb6b5cf97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsi~eWjv*Cu-d^3v+u*?C9GINC zW_HV@gBmlRd~4!VV2#lGkj;5&`h*ir?5}st{c)i1&FQY!;sOV zK~lJ3Kl_#2@hfc-o``h>?p0uvJ=DW_;6C#z=@YsEi));jq*{P#SZ0KpPl#UN_Op$} zgu_^kfzx1hp2BvA-cP)o83JiO3_=NEcOCK?XZ;n9sXe8V;D0ej0_Z>nPgg&ebxsLQ E0F78nwg3PC diff --git a/applications/PoP/poc/res/tiles/1B-0.png b/applications/PoP/poc/res/tiles/1B-0.png deleted file mode 100644 index adae927213217795790097854f8042c1a81f11ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsp+0Bjv*Cu-cH@fdBi}(S@h%a zPb!-E8>Y-WQhhhKz(pZIaPPHg6$u;oIOaTm{`<+j+W6y_&o!Qidj0K^7{M5#aArkgUZeCa zX>A3kmPFQoMuWv{yIAuw^4BzQ2)2njupa7>dLg!>)BYg8`6`tJ*QUasKqoSIy85}S Ib4q9e0EKE$Pyhe` diff --git a/applications/PoP/poc/res/tiles/1C-0.png b/applications/PoP/poc/res/tiles/1C-0.png deleted file mode 100644 index 4f4b7796b6a1ab16d586fe02ce4cf76c4c5f5631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsXk8^$B>FSZ>JvQWHuCFE=@XJ zr25?_u`*8eo%TW1BRU!nX13RT*FZE8i!0I?hrjJ27fw_JoR diff --git a/applications/PoP/poc/res/tiles/1D-0.png b/applications/PoP/poc/res/tiles/1D-0.png deleted file mode 100644 index a1e1fdf39f2da7fa1d5d6ee942a5c429afad9657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsa8)H$B>FSZ?7KYY;X{8z9_M5 z&DtZ2x8}unsao(nc~GCuE6?)$!i3Lz-kqyn>X^OO|NQ&CsjV{^1O?KVzI<<(B~x9$ z_F}_P-HZ)~d>S}7KEG$qD(Z>8kO);G5;i&cP7|N@8J3O)1K|Z5X30DjD~U){b6{zi k$FVdQ&MBb@0ES>l3;+NC diff --git a/applications/PoP/poc/res/tiles/1E-0.png b/applications/PoP/poc/res/tiles/1E-0.png deleted file mode 100644 index 1a18c880183c03c2d74bdd55ee725b8dd83614f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)@DS=wH5L6nvBHeCsQ3l-YOpn?*l7wF?kf+Xx?5ZJ2( zy+9$6eh7v&O(PazQkZ_|jXp$zFI#JIpUvCUVpH7Cht41F&i|Y}=RCi=d)S5Z=m5mQ zQIh)6?{DUke9hJ4VBjpq8$e3!{D_Pp5W0tsp)g+5ozuo0t&J$P6lwj+qV@2v+dlsQ zhdZvoYjdD;I6Ngt*6VT2djwg31ebOkLfzV}SxJ-;z*18laxE#7plB?H`u59OzrpQ; zqd>_WfSjv6z(dkp9)Yt!!3no-UI29JyFmOE^AzKn9RdIX00Mvs00;oiVgdjHfU}qY zfB@huCIBD+IEx7Y2msDv0ssPlv)F$RAWfPlLt(VOc}l+T%OG6KY~6)CFt<&+;6Zr91H2q=qx3LkN4&K6ObOHsH}^h5-`7F=^YYc?pM4y_?&LnHDc*<%_dfD!N%p`h4|yfuf|1Dh>;dBcsO(CN zf$7xKejpbAg?Ky>r`Iv$8I0s*rboWPq|Hf&&kkTyVKE+mctu`qJ%uZ0#FSaA=p24c z{?5R2Tt<807*qoM6N<$f~}8CHUIzs diff --git a/applications/PoP/poc/res/tiles/1F-0.png b/applications/PoP/poc/res/tiles/1F-0.png deleted file mode 100644 index 92f75ea4aa0a8aa25869f74fd0b0dbe128a4af3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmV<40U`d0P)6#f4DmmzlhGC04<%7a0XUx?M*x)3j)<_@4IV4|yS zqYl6Vm>32aFpWBZVblQw446h8z%c570R~K?4qzB{zyJfLQ3o)LI$(eS)2IU&MjbG~ zfN9hL45JPhV8Ar$0ESTq3@~6CR1VNz)WZ;mG%5}Prc3*YG6-26v3f8Zz{bqX@b~{e zhEp#dF$`D~XRL9bh3T52jB(e@L<6WH|s43P%_Sfq(!1)5Za2 z5^@YojEoE?&_V&(LeLc7?|*-3;{aS~ftQV);m(IQVD{#_*BBTX7#V2h0815F!TTTO zreT`dAle8uE{Q8Cu4zs>Iy3R^lxa>xX!C;JAMU(!-h21n-#zEP`EU;fKnWJbXMQAC z6Iq$uHK!0XSQgDT0DrAhF7Cx6aW58R%eZ{l4?(+aH5Y+t=^`q+`fxuk61R^FkX7II z*C$^GF#BZ*alUS#DGJs`2E^BB3LJNACyi09WB`Yq?Ah6bL$mY9Z|lM(fuH69q_Sls zS2Q9^7z|T=UCjb00i-^CiKGB`c-ojlQ{sO&9*cX?+&@Y-Us-22479XxHzr(j0H-{h zN&D~q326=h901FrIRJ0~EQ{sY^gc%%aIhvm zbNoLzGq?I&y1W9pQi(%*?2ua7v>squx=3F3wzVL~_5vq+L>E-304NGH&0wgc&D;3# zFj4B6m?8FQPZx4sQ7DifdlWi+9u!I?+DFF0qbQO>(eN1Rdxn0bfXVH}ipJHQ&lE0f zj0}h^S18f+VT9NIE5irryMMgvrfnbPvG=*$oFnPxKwcP_KXzPNZjy9<&sS{K3yLBuCXNoG}YH5ON zVF5_5X+c>>HyJN8GKlmSIN2e#s8Y3X0LtGLuhs4Ltq@bZCIDML@*n6c0Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/4-0.png b/applications/PoP/poc/res/tiles/4-0.png deleted file mode 100644 index 49356c3124b6a8d43047b0590d2c41de262765fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmV3_HEN2vLb(YewXS z5-f48)HEgi(PrAJ=!O<+n_vlw3G!?X`Sn76`D>)at_2|q`32gI z!}vTpiP(shvV_kPuvqQ5QmThW9SPaL0}^$wOqiImBJ)-=ttY3g$S!Qb<@D{4MIa$+ z6+M0so>uzL!zC8ycR)g~Jq$S@vZQc%5b1S9kqU_$+~9T{n&=g*sa`sy)H*Pztb%4)mMH zpvu)D;Zzmw*7nfxo0T2(mwxJ{XBeNbAgiDS>Wfd2oL39Oz?X#!^qWT!wA{xz;N_u2 zLFR4zXLY= zOarx~wg-*vgBTf`!jt@c$Wnzt*Y*J~IzHm-lx5B$FAbky8XkAnlhZc3bCSHv0s;Qs zFb7E3vW+%D&npb5Ekr*jBC%4lNt$)wiOi( uMhJoe7mh@^ETE9O=PaAoRDenPcfJALlI3F1`=~bn0000JDg)oye&9)*jw9BGyVrskXZp_KuG+iH}c7o>rFns6Cob&(9`M#N#j{;x> zi{dkvLFExv%q6>OK!at`YyxH#Lv+Txo5#%3@)GKp&qeQ*%lAU8D_9`0i6od87ve%{WguZTrrlrK(~xBqqX z1pvtj8_f9+5AlHN?Syp!%B!BBweuZ`dta!rZmpAbYv80b5V<9fPGefKk zux7PA$^U=%C!{$5Z~!ce<^aF}uq>Jb00+RbXbu1z0L!8|0B`^-i{=2p0kABZ0{{oW zvSFz{*&((Gm&l0ASls~PXrU&#CwMelDLY>mIUPZ~F!vhERt;faM9!$^Z$jL1AMyBz^=UJqm zeTZb{^s<}DUcc@gpK=GUhcpZ3>G=cM(Lfx?XhMEj8@iu=#FmY&NIx6^yA=Xdmqac5 zM#Ys~hz|3_4S5XqgnJQilXTwN})llWGX3i7MnBo+#IP+W+`$cHI3+*es{SU5S@qCggc zjB_odW5VN6v*2QO@ygq;~4>4q~N9fa07`vk6U6 zD9aDS{*4^8HSckC6d%Gh8-n{tQ$#6$)fNq-GtChSelS^ znN-?A5HEBStR~@%U|OJHDVS)uQ@pR+m`pQL_g(b;FZMj&_dR>wAJ6xE@5TFw0NBB! zIQla(e3qBR;}cszz_SS70G!jY+3cvPAAn)_JH#A8ZFM^2Q8MpU;K@@X{Qbn}XwSpx zQ@ha6sNeL(mjOKQ{DKqtJD8twP>$r}Q18A1)7UKD_I$;=o^b>ONN~Me?cEBP%~nK4 z_@nKi2FLQYqq3^cy8yw#Qeya}r)!f`7u9WV@p$xevfLQFqj_auw7A&|}`UX;|7)P^X*9G97cf>f&@~#NrE~%8m z)iM>TYx^01DzzP1Susf183avs94Z_K+kSpx)Z96MkPs=0DJ)Rn!^bIB#k!hwL`5z? z@K!2FRQ6Sdy&@t4@mY$Y zl1PY04~%}EfwuUCD~7DL`0VT=n(hvwY&#LstJs{RSs;;*g|C9FqV5002ov JPDHLkV1jh;f_4A^ diff --git a/applications/PoP/poc/res/tiles/7-0.png b/applications/PoP/poc/res/tiles/7-0.png deleted file mode 100644 index e090d766713e506b320e7e669356dcc96ca50703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 825 zcmV-91IGM`P)M$WKu!7V=UC?eSGYE_V+2(L1IXz zS(zlMl_{x%p(Ke@Q!9vxH$7L>)(1`sX;>g-lb8NZX*VzFU-Ai{$~p z15g&r1AqshES3iV4?tNg4*(v3vREDfJOE`07lO8?QB;@rlUUbfKzO7NiIbHw>`j!e zx$(V{9&%^68O8FcS)#lWjhz{5Zo1rKcE!ZcYcVrz#=(?896J%>C~zn> z5Pdo$7zW5Ih=qqljN<$bOih}|-05tN9Kk!h@wj3D^)*9a7zUZ=ccG_i0w$A%)Df-( zz`cArI|}{*o=_&$IsnXOD}qA3kd-4x`E4EY3Ke9#o$5f=g(x&P3`5&Gj=5R0BhP)cV&66r$M2WoW??6UZY(~H zPCK6YVVZ}{YR4XhFY+&Ha3ozu%oj_z5`7Q`h;k)o90N!8#Y00sh<`-OhXO~hi} zVncCh0z_f~Y&JW3-Wb3N7~~ejqPz189+mgwW!*yv9 zJK8mR62E#eg2>%l5f(J=QpU$;8>-cko?%WJ@kpk_Sak9<oI|u{}F6Bp)wdgosoIF|& zo81o8nFvxhJjw^{ZTf#7Lua%WN0l316M$7!S*3mfHt7c;A4^Z500000NkvXXu0mjf Det>Jc diff --git a/applications/PoP/poc/res/tiles/8-0.png b/applications/PoP/poc/res/tiles/8-0.png deleted file mode 100644 index 0cc421ce38db5cea8e15e9976e5a2b3ff4dd5c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsm-1)jv*Cu-cC20Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/9-0.png b/applications/PoP/poc/res/tiles/9-0.png deleted file mode 100644 index 0cc421ce38db5cea8e15e9976e5a2b3ff4dd5c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVsm-1)jv*Cu-cC20Lf3yW%mzc<$bSzl%SwwqQ>&l)v+unXV;8}D|V`)N)eO!BfWqn1;d;w?f z158O3m5nQsRnEG7zr63hzxzj?M)78&qol`;+0KaZqZU6uP diff --git a/applications/PoP/poc/res/tiles/A-0.png b/applications/PoP/poc/res/tiles/A-0.png deleted file mode 100644 index 85e7a559fd3916beef1f9156bd7627b25666d481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmV;+0yO=JP)L-72XqcK5*~3=l*{8{yz7fd+)PFoyhd0*<>bT-4t}XgJJ9ptq|Zm8SK0`)ojZfoNm`(Qp)74wk~z z)i1q(`?(J#+gCzWya+*G2(f5fn%8iO-cB$4&d+#b@nAGC29Mp3wcA!e5`lOufnm=G zPTsGheYe#|hheS-$kax^V+d+pK{8NOu14Pr-<%fzNx=Eki{h=zlL3WNj(JOR@v$!` z%@EWyRQwV&x7FhR`w~hGk-Q=om<9o32p0esU<}~`-~x;xTmW2vF@y_%3owRo0dN7v z5H0{Nz!<^>zy%m1PwiaZ+=@c|Qa}LW6LHj>uSB62Y5 z7mz7rI6nD%cF6Sw4=z|ye{WxUf$OiRz_OCXboo={nF8w4d;|wZ5&9ISBI9FG)7gU$p>{(ec@zfh4~(v6~@R zrXWx*%t`hILCF3!)K+Tf9FmCGYAZC~YsC|E$tG7IKMGEV%qCEM)`*^meP}uMh_=-Y xM!J7>xf<=KIIVmXp_1fJya9z5%r%@Q`S}g~$K^002ovPDHLkV1jraN(=x1 diff --git a/applications/PoP/poc/res/tiles/B-0.png b/applications/PoP/poc/res/tiles/B-0.png deleted file mode 100644 index 1c698b4400ba25899f294c219fa37338dc67bc1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDNj!q$B>FSZ!b6sG8k|$J9g={ zC@z|JI)rt8Z{z7VJ7e|5rq3>9=MYeEXkcJuV!_2|^f#E-!nD7z_q{F9PzFy|KbLh* G2~7agvLK)U diff --git a/applications/PoP/poc/res/tiles/C-0.png b/applications/PoP/poc/res/tiles/C-0.png deleted file mode 100644 index 15824da12d9e38b7a8746482d4e44e7727a08ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2d_FfeO*x;TbZ%y~Q0(?>W^;`sm1 zQBl)2u(UWi=w?l1OPc7)6Mcn&)%2pqqzyAp2sDc%}elAj4~Yi4w{Vt+o}=d*A8{hIxi_h(yvNoLsaK+y2}#6|Y! zyg%K(H{J1oaZ5hq$3v5!v46cFe&x`iV@yfeoKEN7HucV4Tgg(Ty>Ef<GIp`c>>TdV3B%Y2_jHp=Td7liE6k>atH@4VV} zhHcHn`PUg|^1iW^{jj$%p{|AX)OnGa{s*ibTUTj|8c6kg+4DB?a!k%N+Xp*ub1Tn1 ztYI^O-`ia~!ZI?s`j_8l&Vm&|+b=%eUnMN$$k4=aUVvz_Bfa_DBQcXFA(waTU&U@z zUoNFRIdsBm(f>AuZ+Y(~HGU18{o-Ju`3tF};>R0iUAg;bL&Sq}p6xsjeSc|7xT!r9 zea<{z`Csv*xb_;ufXnO#Jco?0PPpay(QL7ZaPwmW-S~BONV=m4J?|tSz|9}Ax zlV8iD=urJ-YCNZfGtR7bOo-Bu5%H_oV_xpp@LRjScYTjqrtX!;wP}(%vN{WWzBO+? zCHlB_v4*Gak$uNKSM2-6S9nx&#tV7pv!$|1o33oR({}OXQdTDawuP~md)8flYtVBx zB3NQwj&!C*f1tzkrK}qjBwqfp{66_*r{=BBj~yRczLf}0>C~E4qxfhki&uZ9LVwr= z>&y37&pm(MAmPLxXBQQvU2iUK|K_YB+HAV<#rij_%8yP7_paY1XY!=R<+iZxAw9SA z=MM|I`Ux4Pk?!QK_khopR8T-$be$K#{vJ6PAZp1IFES9R?d>veCBzb(m|IbXhx zWBS^>jvY(frf*A5+t(R;k4r;1^n%Kr_Qz@I9&eU}IH?F;-2Fx)%Q3c0Rb^XHOKe9| zVbQF-8_Sxa43wHK^mtf3+nCHe@0fT)YUB@D-euRPvhG^Ed(GU{DmV6L#ufWJPSX3@ m|6I2vJ1)3UG&Z&M4^#Ja!IDnR9dm)1hr!d;&t;ucLK6VMc8H?@ diff --git a/applications/PoP/poc/res/tiles/D-0.png b/applications/PoP/poc/res/tiles/D-0.png deleted file mode 100644 index ae6fc2f1331ad600f2cf198a591a1794127f93d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)vS;Y{|#e>_PMDU^&gra!!Qbj>U4?e(ySG@@F zg$FM^q!a`}E7n%AV8x^j^f;Hv&$aCb0cQwr0r|%yx$+Pi^hQ9EP|RBhZ7~qsw5oan9>oLm{7x1ZW^=f< zI|;?_Mbk#T`maFtdtr2&c$mCZvB`faK&cI@`0#w1pMYH`f+!w-0#gqrP#aSD2;^pF zaraa&^se>Q+XYtMLT~5Uxoudmpm!ypu5PKG!1m#z`0xINLz}t}tG(?wR`cVdTVHMf*8+_xU zaRgh34u6lAZdi`Gh=xdKtR!zXb@U&&iu|X~P-=XLAKMIn{rr+Pl%KwVKs<=an@?Cg z+5Z@Ubs@N6_f^2)#5?CygkO^%s?92+E!Nq zi4bV9pkw}OFpVa2?y!rNnLBC6KBRn5-+~%QM8d~RmgUMkpQ`|o32W<^+xDOJfdh2e z@15?07IT04-=VHqhG%^vET*N~!3S}wT%2gbc+W5z6XCxWF!q`l@41iEwll0W_O&~< kljvgcJiKNCTxS2u7wSx;pdb(PZ~y=R07*qoM6N<$f*Fn^LI3~& diff --git a/applications/PoP/poc/res/tiles/E-0.png b/applications/PoP/poc/res/tiles/E-0.png deleted file mode 100644 index a468fe6cb8fb303c14d1c1a206a47f24114830aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDKAeK$B>FSZ!b6sG8k|$J9b&P zC@lI{pSr5){ILV6-|nmv?>>EY2Qv$YfPzB<10xeI#sPJSz-LUoEe-E~15IV{boFyt I=akR{0HL%bCIA2c diff --git a/applications/PoP/poc/res/tiles/F-0.png b/applications/PoP/poc/res/tiles/F-0.png deleted file mode 100644 index 5251ccbed9ad59f139df2ae5032af996a62a9eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmV5!w5qTNQecMJ zi%A=WbfJbJ4n?M=j^P6>l_o7~rkK|aPkFmF8o2Q+JU_S>&V78}@4PnW697nHh-&_p zH_*f+`K_@1AYcq(Eud01YN9isiPXvM?fc>ok(ar00-~1}Qg2saRZRh5Eud01Tn-1C zb4ulQ{Q1-H4brZhfXLSXYk{Mt`)mbRK$v9Z0tyHiL%0CA0AmOj02g2k;R4_Sj3HbA zT!1lz3xEqShHwFJ0mcw604}iF1yqYyOe8q0-w}KEB(~@yJ%0N9ZVXeVK7?f-SXMG+ zeET=s|4++j&7){9u0%#dl}8}I9Rc)OF3R{b1H*Wnaq4dYB^yHmV4MC#d)rxd8TL6V zLbFm3k^8HLbVq-Po-Oy+Ho*MwDFi{lo}xTxB16$teib&$EZhz!^d%>t+4ZLmwSd1a z$a4ggyzhL8t#MK4uWiKM!d&=;1i+A%FAFU2s;UlIEjMACwxH*FJw}_KA^cc6G*LQO zCqJS!{~Qh)uHauLyLy(cn7Exzd>NiVrtun7Yu8}J*pBhGZh796Xp{8lD7}dABWXyg zD8{|yAJtt$u)^M=hA@?nPiq0`1j6ozX)e z@j@Y8kZ)@Y7;bEX+v!3|bvZ|d>D&MCpBm@p(&7Gu1_gw4BmVyyK!eLvA*!s{FLi^li%^YI)3CBDI0%nXju zt!B(Fg1;^p>J96ugsAqS->7}oL7NFbnZEyep002ovPDHLkV1iVeR3!ia diff --git a/applications/PoP/poc/res/tiles/tile00.pal b/applications/PoP/poc/res/tiles/tile00.pal deleted file mode 100644 index 1ca55374597e1ecc7d068fae9833794a86c8d1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 ocmXYl!3_W~5P}?%A>Gn)Ngt?~B$bQ)(GyG$AQNT_OrLJc137LNaR2}S diff --git a/applications/PoP/poc/res/tiles/tile01.atl b/applications/PoP/poc/res/tiles/tile01.atl deleted file mode 100644 index 854bd57342ecb08e1012fe43319711421d60ebd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmWFza5Q9OpaWo3aA2g1MWp#ffx&@6ghC)X3I;R;#74nr2#kinXb6mkz-S1N5dr`< Co3Gjc diff --git a/applications/PoP/poc/res/tiles/tile01.pal b/applications/PoP/poc/res/tiles/tile01.pal deleted file mode 100644 index d15dee2e4a7ac6cc687b3bfa691ff026ae304b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmXYlF%bYD3Fd<+)?{Bp*pic#(hP6O$aaRp6q*F1&CWVjs;F HYJKPeZ#f$4 diff --git a/applications/PoP/poc/res/tiles/tile01.raw b/applications/PoP/poc/res/tiles/tile01.raw deleted file mode 100644 index f406d72..0000000 --- a/applications/PoP/poc/res/tiles/tile01.raw +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/applications/PoP/poc/res/tiles/tile01_merged.pal b/applications/PoP/poc/res/tiles/tile01_merged.pal deleted file mode 100644 index 350006da77d206341480e161af587a306ff0ea9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmZQzU|?7Q#2{h?l(7QD2?3Hofsl|8hW|hu@*hY8aY)F2Apbv*52S&ZgM)*C!QuzQ ZiU)rfL_|awDyFSs2uP`5&@i%L001^a9`gVI diff --git a/applications/PoP/poc/res/tiles/tile02.pal b/applications/PoP/poc/res/tiles/tile02.pal deleted file mode 100644 index ac7c0f1e01f61e516e1c51748f1c35746d8c3d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmXYt>r2yN6vsa>uUj*BbDQ~_OXsGU8Kileb@W^zZi$B8LhgDfw8ZYyW54I zW#sl6L)X94c43-=LL(!0eh?UX&+*zY`Xe@mZ!VJ>|3`1)3nyEyV%M6a->PU^$7J)8 zc<_tr`hJ}5Hu_SFw1%cI+w1U0UQ%qZ(i8uTF0YWT!MB|2e~rrCJL%*Sc}UCAvXnckMa7Kz2^2tUJMbWmb)$sTs`G(?Gv&SNNXVk>VX`DBZ5VvhLz z4fIAkR%Zh`T>(M$fsUT1xP9FOV;?zI)k)&vZ$hydqSwBmc>)+qHPO*3^Q_PmNXza{ Fa0qMWZQ}p{ diff --git a/applications/PoP/poc/res/tiles/tile03.atl b/applications/PoP/poc/res/tiles/tile03.atl deleted file mode 100644 index e91004b76eae611cad7ab54e33ca7f9677e1f7b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmeIw!3}^Q3aADyLh(+;3&rimg1Cf;%Pt{A zTjr}*$t94TKadc$$9HSlbVLw)JtG`iI@6Uw0@6b^8^{#y(QaGLD%{@ z{>k4cRtM&iDqbWdW3TVPJF-BQ-ASISf$-WH?(R=Cf7`)YQP1Gs9iE=gSj&Bc7LTyG z8ySk+)A{R|oT5sUJO|bNUvYhyB-iPsZ|f4fFNCG67L)3seen>z(S#c8rgc6-@8$)1 zC7Ysvpnc(h@X9I1*D5+gru;L9!BT)v`f-LvNYUy@Gn&aT*)SEm>D#`PKI+gZSu)cN zL(vCX=J#kA|4C(d25q_`Z?5>bbV5>!hBwvk@lX9B_~kFd(MQTVMls|TVkxbmZtMrH c&It;=ZKP&o%Itpf-vtP-o?=$35X=Ag4~+$9$p8QV diff --git a/applications/PoP/poc/res/tiles/tile05.pal b/applications/PoP/poc/res/tiles/tile05.pal deleted file mode 100644 index 33830483186523f5979764d9987f898966ec8a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmXYp|0^7D9L8T<4tHG~ciiD7Uv`);cb(n1FL6%39b2~hVAq9HlA^URt)v+uA|gd? zHnX)$5wjLX+b<}7vrYSNZl9~Y>v^8{^VIVIge9UB{{MudMo5-{5Q2z=h)9(XA|ic6 zdZ`l8>pA;N!~7;1Lly>$9ZRsEs+V&(o=9|q zpN-?4SjA|qpzYHcq3?f4NYawy@zK2U8UKf4GVN|2t?!Xh?v(ov$gnwS5C5RNcL=3g zgCahGl)OTj{iNpAitIL_O4ZBm3EjuP@hyME+BrZ>tb)MaCE4ye0=wsEbId$``xW=- zEQu*P?l$>pT-+kRzLn~+McglDD17)-Zv3Kg;XT3qE3~-jtu(g}XK#_Vgu zH8L$XFG$p;5%X<-R_hpUL{vocR z`;;0CxE~B-b+u91(aE*dbx!H^gkHQv@w9W=;gG$*skt5}{PsOcyO+e)59}9%Slis3 z@m@eIuc6YE;u{^KqPC9C*Kbhk%enb;pU|@@db3NEDGFCUWHC3la6Wbw&&Wgizwco4 z2WUv&!qU=;SpCM};a|#acADf@MQ1iM@aupRCslO6TR>+r5&QI+WNsHzqm%BrdHFYqO0A~4H%5G83uApf XXMKL+o7>ofArjj;6t{=y;zy1F5Q}jQ diff --git a/applications/PoP/poc/res/tiles/tile07.pal b/applications/PoP/poc/res/tiles/tile07.pal deleted file mode 100644 index d3ba12e714ace35967d437e028c4afb293e870bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmXYs-AmJP6vjWg_U1Czez`f+<;z@ZzO1%tGIPGnsdJUumyxd2g%_d_B#2&Eghh~1 z8KMPJH%U&5ys@lQoR~pLh?V7kv%Z54e9m*8!?`#QKunTsvHwFXX@u-@A%q|y5ecah zArjIjq?am5R`g(-{9prFXHH>umZ3Ff;JrJFb0A9e?-xuZMRaa2(=hV@NBE+=bJDRg zPiSElTYWXh8-29An&$H71u`p7Qa^Q{6jds9Pw(Lx>PM4)nD*s4%%>|b+VeR(dV{j- zU07TdSlpF}wYNmRf28n20Be<-(Bdqfv70ER4gxQp;2exne5H-x+zegcR!GZKP-!*P zJ|3rL;x;ya4Gs|^yzvfGu^pYs$kiXKbbNSC;iYE0<0F*!ML49_q0(vT`4y-8XB@p^ z!jNU=h%JZS{VnWmEi}EHB)j??;rJ42LmCFF1^qFF?!66q|7=mz9wf5!iBz>3l}3&K z*#vokT6~Z0;D7#*?DHOaes6MZcO9K_ROZd2ptX_QIxn4H-^(ADuzFmG)i=0@2W7?+ Lcy0}mm8!R%|vUF-0t`97`#=QEtVBo0U6} z3%PN)aU~-E&3sor^}O%aY>IPa;<-#IDBFS&gx^iiw*g z+BOFX-L2w17^6U^V)}Lky{iIcv6{$h3X8vv@^%}ZWFL8Q85O=7+{?X`ILaBhieVpb z#(xr`X2MNpI*9bRj>cSsb-=;w(*|mzj@aie@`8Nk-qR?wO4J4&3XKx~=?w9o1H#W+ RRQA>qe%Zp(SBJH~o(ld{s%%=njFdL^n*r7>t1+Dc1z??(Q8x5iQC;N)uD+ rFf*#KsupHdUgc`xoP+V9+%MjHQa+j2L_Y+U7&&sLix*Se2x;d7=%poL diff --git a/applications/PoP/poc/res/tiles/tile0c.pal b/applications/PoP/poc/res/tiles/tile0c.pal deleted file mode 100644 index 4ea9a759b1b3c5be924e94fc8bf7e7448f09f967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmXYt$!}6&6vcn_F~8OjkTN`mQYZpe(-bUN?0}&Il-g3iBDI!6ZBjc)V`Ab$H!e*y zF)lPFy3qx?Zd|B|t~6?lb@so(kHnjtbM85ddvh;9Q=(1H|4p-Pgk%{AA!td6mQ)EL zTGF?qmnzY&y}xyGw=#6c?Pw=m1joEwdRu1U$rQeno1KFy^N%L*rQHNF8t0!E=`TmP z@^h6=r-j|`Rn#M9Dl*^uQztebrf_#0|FDProiQSXAj6G8>|rb3As3N+kc|&Z6z`wG zEBAFM9n9RzlDV3|*kxd4zl3M7o6+k-B-Z-zB%EkTCu?s6o1d16&W7-va#MLxWc)@N zN6bd)@g%A30Zvq+EIuo6`QrsthXtKcVfywcp`4#%B7!4o!)!CL_2nYfmkY$^LL}FZ zqc`i&nG|+^tYWd7>2#@B{fBA%su7p>1Ws$Lzbj)<^>n#acD_|<{I0S1G*5UUK)lq4 z$!cWt^D?zp=TP*APz(xZALIy6_AvJ_N6(1H_SY3T-$ZI_0Gs^B(V1R)vpzQ7FHwIj L7`c`tdo#^Hx4mfc diff --git a/applications/PoP/poc/res/tiles/tile0d.pal b/applications/PoP/poc/res/tiles/tile0d.pal deleted file mode 100644 index a6144a103771ae71397b4114a1d69ca6adc6a91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmXYn+bhFy7>A#=nQe@u9UM1Xvn$zb<`4@Bs~zjtwq|C#pwwi^1(P#dl2UG6aWfZ` zxL3F#MRNLY=DYIN^ZC5b+Y3+L6bDI?C<~;rXn`b^g_nhk7F4GAo1sc2 zr=!=1#bdI09C3cM(Ec0~qZM9DJoI{A6eszpjXlg-bt+*Fii{JAw5+ z@=tNhZUgb-5yrDlCYN1g&L(j9EkqB!Y&<70yA0R{o7sL%qEss=e5a|?YuNipv3egx itJB~NS@Es7i5+=ax(OqbLGCup+Cz-a;TH0bG5!GBPg1u4 diff --git a/applications/PoP/poc/res/tiles/tile0e.atl b/applications/PoP/poc/res/tiles/tile0e.atl deleted file mode 100644 index 114a61f4d20c290fcd1c9d23ed7f00263c24d044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 xcmWFza5Q9OpaWo3aA2g1MWp#ffx&@6Y7~ryz-S1JhQMeDjE2By2#mN8006)3(b@n2 diff --git a/applications/PoP/poc/res/tiles/tile0e.raw b/applications/PoP/poc/res/tiles/tile0e.raw deleted file mode 100644 index 10116ff..0000000 --- a/applications/PoP/poc/res/tiles/tile0e.raw +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/applications/PoP/poc/res/tiles/tile0e_merged.pal b/applications/PoP/poc/res/tiles/tile0e_merged.pal deleted file mode 100644 index 1dcf99d34c09c768824d344589fa8c78bc731443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmXYlAr62r5Cli|0o7 diff --git a/applications/PoP/poc/res/tiles/tile0f.pal b/applications/PoP/poc/res/tiles/tile0f.pal deleted file mode 100644 index 32fde773752d20cb9194d6e9b3fe755ca03884c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmXYt+bd!H z9Nl%HjtVCuFP;>$hTf5UUX41K{^(}wvXzn-CUTrQGVKY>Z&fk1>ZaIZprXmb+(reP z7cFSxB8bu|`1Y%f_s4ZSuQuTkY0Pg{@%d*1MvIo&Pi3U%#`E>OiT=qVL{An9WeBbs zGftPDnKciwi7JxxksRK7u~_2>3VuZQ8#~?s8@A$PzMM9oRE07p`xKU@P+FTxbgYuS z>kf|od0E(bNu(y6?WbyeKv^)mn~tqLx==y@ diff --git a/applications/PoP/poc/res/tiles/tile11.pal b/applications/PoP/poc/res/tiles/tile11.pal deleted file mode 100644 index 6c1b7051a86cc26d5f49ac0f8fed0f0667a56624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmXYl-7AA}7=|y_OnW!-`EJa|!P;=Z=G~0VXTH+VmS2mcwgXa{B9bD-kppKtk|>H7 zwX!71!45d_QI7E6ynZWBUH5%o4}dNyg#JJDf(V)NA%wt?2t&3+2t&FdUAClfzn>}I z^7F(d-PjZ}nonhCvm3jugqNpTN-ZXWnuD#iF79vQ>}~h3p4JF13YGD2>4a*^cafO%=dee?Bz5|$#y~kCs(IY=0pnzyAcK= PE(UuW_uVBV6o(%$otMTo&8bt9IUS>!Bc0CXblRLQh@$vB4ma9JOd0 z^dTxXh!#1bXd@*e2r3Htu*F)J|HfXS1JCbr;2eOeq$$<^q1r4$s$2*mXh=juxOAD?DeubgDaYvIS60*}k%ga#~xeO5M?Q)Eu{vcEmWrK}gX zqk{(vCx{N(81$H!PJ8&UE-)Fi>}?fjQ7M?a806iPG!~ru|edsv=}u_SZi z_+bupXizB?bjmxmy!k2r8`?EYjJeQhlo<6|e!VR+e5{Kz(QfYDi1P4Of|%b$T51d4*9n@L!@s-*+npVW>oV@qBSqpa3Y%k#V(=h)RW8`Y?(B~*&XRM#Y zSO{;CmA%J_h8oRD7>4^>5B>OX*Fb~rQ#|uaxpi>mH6KZ2RM^ElU~cusZnZ729~=#be9+N qCD6{dp)T5rt>`4j??ZlEW+VHP!`O2qPpcWX`1~dLRLi^e5*s&c`DW+< diff --git a/applications/PoP/poc/res/tiles/tile16.pal b/applications/PoP/poc/res/tiles/tile16.pal deleted file mode 100644 index 4f0b5369a47bd970256b40849d9d1b7b9dc76d40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmXYt?`zUg6vjV8XX@6Px#^rvXU@3|Y_n~qn~F}|G&ghYySbnKsMZ$MyC9;7UiE{Z zprR;ZP!#zph@cniC)Fx~AgV?GjUAy2&w1`SoclcY9Ds_T7ApTQm0F@ml!BrtR0T>^ zSfD6X$*YnJ3u@=sgrARuQe3~!fGqtffv&gUF8mET>7_?f>_(vFSYbRlM@@96Ko3RN37AuaXU2Ka- z-qXj!RFuRi%!ps)UQV3obnBGB|OID9ye1i zH#<}+9*j?tb#-$slHhhcg+^+ZBir&fty;}zndfO{8lz6fkHRV!gAwk;)0_~UyNNVLtq!e9&6kBTX3=^n3xDXRp}OvnwROxZ{kUMaasf4-Yc>V z={V9#*sk-j<({L#TtRtiF+RJOc$t~DdH5Q<^>k$qa#sgGRMaC-!Nls9pS890^KRR;j3HP6oB3JS`97dg##$E3TKjOBnrT`NrFN*ji drovo&)nO-}j6X2K*n+{lF}aw->UxlwMEl#3}M ziBhzN<`ByHznSmKTc787pSSno0f-2a68T>u$sh?82T77h2&9B?fg~kFPKYdAketuZ zFY(|LU6yV%at#?W1y#A#ShGslZrPzS$H79~BAWC}j=N4Vs*ObbcYK6?FlCzAZQH}9 zw~?A6!D3wa!@iI1~0MibWS+Q9D_RY&@n0 NJZ3MK(iL8FBY*MMUxxqy diff --git a/applications/PoP/poc/res/tiles/tile1c.pal b/applications/PoP/poc/res/tiles/tile1c.pal deleted file mode 100644 index 482365784567ea501e6537db77604b123df6774d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmXYs+bhEX6vsczW#-Z{_d6{~44W~w+9>2!0VPYv~?lT0I2`C8BFN za6Qs%8eyaPl;N^z^5Ts2myFX@I7ncC3X|;G(yL_N%)aY^#+)`*>UKD6e?q5;Wz06m zN#`rA`Ms!v!o)It(hiezahib6o31cU{O5)d5_Ei4Ge)xa-D zJ(ogg$M z3`sbyG8@@*J@3&ak6HUQTrOly{`;aF4JNeLLIKfpiAQ1 z{mF&rTkd(GAl1%J*Bu&FBzkQ;XZ;^Usr7g}ZwU`oaq0QNmQl}Ct(W1-6*A6^y=uF^l(X-I1`}9K zO_&T;yj>yI!-sfWK{lpNu$rBmr(ZZ&(O3xVvlqXkvB5w-cFS;YRPH7S`;sIli(F*h z7#mn(s5?R_^U7kNfV<7dxM!7Y^opQ&4Wq$AVfmizxhk2NG7*28MEHo~%?DZ?Zd&Y} zRCYcw8*SX=f5cr}=f0@szq!nQ$iJCpdk0QiI~J3Jt!RbO{y4e$8mZ|Lr>Q6WJ+qvp Mo++wFM*3p>0W@|=(EtDd diff --git a/applications/PoP/poc/res/tiles/tile1f.pal b/applications/PoP/poc/res/tiles/tile1f.pal deleted file mode 100644 index 185a9edf955bfa49f1ba6530067ecfc2782c87ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmZQzU|?7Q#2{h?l(7QD2?3Hofsl|8hW|hu@*hY8aY)F2Apbv*52S$@1S%45Fcd_e zV$f9yU|?tEVPIkAV33nAWpFYpXOIy$W^lErVPI$DWyp;9K%87N|DTVnl(GaEy+=VAt4ZV85zz%2}J7PSoWk`@d>PLml#1XLI- PbW<24M06PJjf)rn!Fet} diff --git a/applications/PoP/poc/res/title/t0_0.atl b/applications/PoP/poc/res/title/t0_0.atl deleted file mode 100644 index f65d6e5e4de1f47156bd6e375a058578f0d5dd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t0_1.atl b/applications/PoP/poc/res/title/t0_1.atl deleted file mode 100644 index 015078175884c10fd31ea640c1e6c4385919bebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 K6@D*UrvC@_7F$XH diff --git a/applications/PoP/poc/res/title/t0_2.atl b/applications/PoP/poc/res/title/t0_2.atl deleted file mode 100644 index 506f97fdce2cc568b27146df288c5d7b7369e510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t0_4.atl b/applications/PoP/poc/res/title/t0_4.atl deleted file mode 100644 index 76b82fede907332d0bf79e16cb4b913aa92081e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcIiL2kq_2qcp2^x!)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/title/t1_0.atl b/applications/PoP/poc/res/title/t1_0.atl deleted file mode 100644 index f65d6e5e4de1f47156bd6e375a058578f0d5dd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t1_1.atl b/applications/PoP/poc/res/title/t1_1.atl deleted file mode 100644 index 015078175884c10fd31ea640c1e6c4385919bebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmcJWeU{^>l1Hr%TedSRb1l7tH#?Yf-bQBs|IFO`3qUxty1J|18Jr~{KoD^iK_Kk< z_kaJ_AIs(cKmE_;fB#q*=wHhpm-mP1EywrU;o$pmxgFQbzVFxTb-!43x!x$hUC3Pb z{YKSJ!z-Y6WYdtbi0vJZzZP+Rd1I= zoiE4j1=)M9t~P!ze#iu>kfga4jUV{nXCI_wzu;5eXc@svq5>i-{z4XsqA(?td9?g~ zy?!2xP)YY=A#=MQC{_GuWMgTh8)|(7!Q+v9jbyov95K!9U*vVCz3_Pfh)!rzDOqf# z@f+m_P?4HO@SBmnd&M&lU-1K9*;=7H`N^@&(HzZQ@kN;kjXHj!K?nh=*l90l=~|W!(p7b8|J-A*HB=1}acEy7QuzfSx-?}= z!HHj$$0k*|_)W;5_Kt|h)l6BPbb5cITP^#AA7e~jur>ohUY|VT??;|E55FEcnyIon zl-dDcbBQUz<+_QF_VDv2_))toi$JWfP&RcGQL$?s=CM#hxqQ8$OwT*D@@k%rW(yR{ zP&8^HWH0FzDewGFWMbng_==yl_2p)GA{$e~+$#X5xlgrx^6H?NxBadXicL{8^?+v8 zPA!{KpssYiY-oDiH~7(Z*MIkY!>!Su)-{9}>@|hqY87MJVU3ybDX_ML;A9ipq#b?C z04H@-(Mf&~ZTt$#;5U%HzXhO&w?F6S^q|1gK#Vfs6J2HSAEvNv@?#08k=~B*1Exwl3kxyf z8KBEt)F0D))Sun1^E;8fEM}Vjz7SMqEw^IIr3a=FJT9w(M~5hgV5(ZOlUM09h~`So z-}WTbstU4)U(J6kRRFjw&VS3YZnuLF68{CDij%~}h+0;9wi_>Vs_w%%m3e}*Kpka7 z+J^zQfJu~$u|-*6qWMg3_^*K4lDSyT?;j^Ub6GGecUf`oZZf}UMgUxK@Ky zl-^~Nx9f*ygQeyv}A=Hq)(E4V75@#esk}?!Ssdn=tcw~+dlB7J6%+x7n z5plH<3)A9htv5A*MqiS(jChCNMdu}i$Np%HKXb#A{uHIUu|xhu-kXg?rCI#@a>cwX8h!bmlYWk3&U1 zG9@*&$s_jhd_G$J)+_B)j1{N06q++=p$0OV$x?Q%v^b|@I z;g=rkQcesJ^Qr)@srS9M$+Tl=iXx-4&ev_Bpa1QS_~jpfX?Zim|4;E*94 zhBbQY#$nRG*FL$lN~J(=&*v43@8wq0fQsS3SR(FIlMv!q{K0%sG28wf}e8 zpIz}}vcq!rrvDm3TvV3%xzQDAk<6T_OCAvwSfVIem7U*;{nee?S0&yx!tc5q#qT1& z3eCjgRr5nGZ}X3?@Aq>uthtr)m>vd}?j78g&)egP@p@shx~hf)qo=yT@0|4pg7E14 zCS-0}iP6Oj*=~RJC^~!_Bmq#G)VAqQ`wXxgx^R|7N+j%MUY9TFMz>Fl&JzBySnkQ4 zD!lhm?y3P+BEI15=HZ7_c_u!WPhMlvi6y4Y#ExX6Dk1yC`bg-IBJW78hp~o6DRo0b zPCYdQ<#ZIr{!U~v>+c`t8o%^pV}_eLvqb;(VU+!~H(#VE!IDwECO@ZMp~w+BF6T>b zYOcj^x%(k)ONqWNPbfOwnV`LGspwFvU#nU-o*fQ1sDawpp58=fiVHW1x@6sf%fwLd zRbyILN#Xq)`+s0+)TV$-S*ApU$iry-O2`~TCxikm;uWzbuqWz2ZG+;QZy=Z-`va!8 z9Pf855CeQH>#{%V!&Jd$oK{;~qB19K(cEK#%=<+Q(UJ=$L%CSxlE?MTE*|Wf(aR6u~S^+W`3LK>Y(+>Z_A#{mY~+`y!_Wu5TZk68h{pm zSEFsvacD_asuxp@sZ$#B)BYxYat=Rs@fT_`HMen2|D~WFR8Ep> zO+?29>p#aKH97kQZyPoLb$$Y4o;sB+0;PZFH}C(s0DN8ld4Er?kTu8Vz3z%^^xnrT ziMmXsLJ7$>9$$wyJ*e3HLS)NII{1p;-k9mOykG>NZqAlw&3~4_57^q^vaKsRbmiq& zW7o+2*jRB1&a%U|M+a)@BzAunK&jGgsM<6?`NbB$egA8HHnYz4-w7};7y?9U+A#!U zV*|yHHD}4vj$JQ*t-$^#ZxbbGj6*j?LYy{B7`kx^#0RtVbM3rBi6p;gA=2Vick#vI37EfEZ{QjWP zt<&`W(aQDOcs}PnktwI~&}#hl^*O*Wz>UYLFtW2nPwRsDo$|6G4LyS>29>!FeC!&46mkMJ-S#08 zn}qDVOljG;!C3(|bnS32{E8p|i{voMWMo?DxjxtGbuvG7igub_%)|v>Bj8S+FAxlP z@QOI4m(8rqf8OMW{`fQ0!98240<0gxI9OvKm5vS<;M0<(cJf;=AKVW^LULQ6B(|0e zKls~QnO~yco)heZwGodI^Q7dS+RQ-h`qQAm2SqD!4uo&xYKHb^*?|4O@k|BEA^i|NKs_l0~bQQx=O%mquHck?hj2PUI(+ zkQLzdalhll7Z-!tpfpG}PAXrm!aqF@>yuTbGDCG$!50QPaOXE6OAOX9%!D5Y@#(fn zJPdAxTkNmOGR_x(+C)oQ7J7gV8I!aaGVz<(5QqM=m$DUoy8sYS9y>o?BU(eabxC11 zX!Zki*L(PJ!v~5c6(x6}wI;cJ>UeJf(PWzY%0LL~f#x5p1%X1xE7 z&8+YX{KVhJN`9I(_T5TyqOaKko1W82>6sbJ^|aO0ZG5|tw~An_MF=Cf#+aDu&g9(kYrSOd)9E+Yc z^nuV0E=v#RuNQx&SAxb%MM0sful5&Poaett^0yBSAOX7*blukyx}$ij=!O0oHz{f~ z`{QBzIzrJ}F}7d|RHP($(3dfsq>*t*EdW7CB$--TFTO&T`#U}^C~b>}%xHgG*EB4C z^ZfTE{{Hy!s2EhTnvAdXg(=Vv$G3F(VlODHbCa^LpQ-G0gP7%N;{L9_AF_{qsPEfu_dtRL&! z`p8FyHEr13Wy{}6cFwnX!}b*LqzArV>-J4|29=+Z^z~n)nt%WI7regr*&inMLjUUb zvT!yAH|NG~AbAinox0qO!dzJEsisNp`Ay}=^<(2R@TE2_>ehs6tx&FoGZpom-rm?4 zl&^QdZo)@ldy28X-_|w!W@O3tL)I_9+vodffz1TvcfQEEVV60lX~c>UWH_3ySl1VV z7Ucgdu+`|VpRv70E*=Z_;x!#pkHL!l;{$SW%e<);J#};V{9_e%KJ8fFFMaE~t;ny_ z$~jH?;h*uF0cH}6{pI1SLh)-F$j~J>4_L z7sn>d#jisvHGIFCn|{u()5^Ivv*!Iji+?fS<*qOFrv-L?c^fVb;YX(bizP1n>>#fR zFifLtT*al0%#(RlwmQnu_teqQ#=Uj5X$XU_=vfXz@i}o0ejVR$=}NzUx&QYM_`MIY zDhL}uh69J+i7)!FhUwuKbaAQT(vNaU0xoP5Z_Eiz zbVi&h@#Uz|**VXDEirU$pbmalLvPX-U-~6adj2~91>S!We-&a9t4WMv4A$w9d$8|H zowHFp`TrA4U3=K2t{>Vyd9OC+8g`O!6VY K6@D*UrvC@_7F$XH diff --git a/applications/PoP/poc/res/title/t1_2.atl b/applications/PoP/poc/res/title/t1_2.atl deleted file mode 100644 index f5dbcb648e3a3d0e7816c40cb229c3009bf80953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 BM*aW* diff --git a/applications/PoP/poc/res/title/t1_3.atl b/applications/PoP/poc/res/title/t1_3.atl deleted file mode 100644 index 721abaee3582d4287fee6c480c848a0952fdd528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t1_4.atl b/applications/PoP/poc/res/title/t1_4.atl deleted file mode 100644 index 76b82fede907332d0bf79e16cb4b913aa92081e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcIiL2kq_2qcp2^x!)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/title/t2_0.atl b/applications/PoP/poc/res/title/t2_0.atl deleted file mode 100644 index f65d6e5e4de1f47156bd6e375a058578f0d5dd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t2_1.atl b/applications/PoP/poc/res/title/t2_1.atl deleted file mode 100644 index 015078175884c10fd31ea640c1e6c4385919bebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 K6@D*UrvC@_7F$XH diff --git a/applications/PoP/poc/res/title/t2_2.atl b/applications/PoP/poc/res/title/t2_2.atl deleted file mode 100644 index a7e40b973f4f215bacfe8f6627f60d2a30011cd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 CN@X|z diff --git a/applications/PoP/poc/res/title/t2_4.atl b/applications/PoP/poc/res/title/t2_4.atl deleted file mode 100644 index 76b82fede907332d0bf79e16cb4b913aa92081e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcIiL2kq_2qcp2^x!)eI>sOylat2%e&@qG-ZFVP${=~4TY)p1uq_CX=ClKKL6nLfma>adf%HX))`b_`k{2}pWYJDhrx-6cF0NsLf_?pcn^3@g? zxM?s*lO9zfb;i?EkN8jTd68Xsbr-~XXemIJr~^>&Iu@J|;YL3f4`=Kj5u<51G7UL| zJQ>1MFIozYe?Gb3AjLk_OB^a^B;xvbMbt*;6DuS68{yz(#w`8}IJlFQWuxM9nNmTm L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/title/t3_0.atl b/applications/PoP/poc/res/title/t3_0.atl deleted file mode 100644 index f65d6e5e4de1f47156bd6e375a058578f0d5dd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t3_1.atl b/applications/PoP/poc/res/title/t3_1.atl deleted file mode 100644 index 015078175884c10fd31ea640c1e6c4385919bebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 K6@D*UrvC@_7F$XH diff --git a/applications/PoP/poc/res/title/t3_2.atl b/applications/PoP/poc/res/title/t3_2.atl deleted file mode 100644 index b86535ad049c37481cda1989b30bfee806298f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/title/t3_3.atl b/applications/PoP/poc/res/title/t3_3.atl deleted file mode 100644 index f7b5ca053f177a87f8210393a26246f7ecac0d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 L$W8yDUuyOP1;-_9 diff --git a/applications/PoP/poc/res/title/title.arc b/applications/PoP/poc/res/title/title.arc deleted file mode 100644 index 3cf9f3355b43a7f35396ed55d7db1064bbdeb282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260608 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%0AV)jhTuLD6zj-Zofa# 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 R5N}|(FhPOg!-o%GIRN#e5U~IN diff --git a/applications/PoP/poc/res/vizier/g0.atl b/applications/PoP/poc/res/vizier/g0.atl deleted file mode 100644 index 4a8b0bd043ffa2ee80b4e898d382edfa0174ede1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9711 zcmdU!O^)0)5QWc@6GK?sjTvOd0|)Xhh!{maikJ=`3=efjI~>g9_Uhr{28yIY?B{O-+Lp8vRc|BmOo z@9)*V`QhO;+rQr4tN*tj-+W-3<<;TkVVaH;%7DM)fa)*|s0;)DhT-mT3!)Ta{jw7A z(40Uj7C%{CN6o_KVr@~PF{vh?rgw7Ad4vsO*C!t82vV@u|Kb=%(2YO*s{)*sb$lYWVc>P}3{v8Mh!Jx~%$w5M@C3p%Y2EO~`~4 zoJEwIp*oT?bRvmuL!q4z7Yz}8b4#uUECJkx&|vk=;cfNZZo>bQ<{4#us>85_;C2qj zp3GBLCPI6dmzwD#nWAg3^f}C>noN-y2I*X{nC3cj9mi=pUjXG9N0|u|n#OUw zK7zUQ7`qXW8OIYDrqegfWGp;ga3(UI#gJm+$XqfrIs>uM2vejwAmtiIwfcvYY!@^2 zHP{OsOSaDF%C5N6O9eUHXo|v-;hhSxx((J=DItP?UOpXSXqUQ3uk>q+eyJ8I%_98kCr! zw!Z3v%uKa)1DVvF>bD@w9av5R;V1kTNz6Ju&c$)D+2%YOU5;9ZJFK97L=BrjfCxziB$w^tMf-+TOM;s_kssgpQkz z0cMA5Uclr9+$PHHT~J)WdE~6ZZ1?}!6X(pLX7j@;UU-g-w`q|HkU7shLA>8P7%axQ z272P>_C<{BfYw~*+~|nFVTDPEGiH@EkTB=OSQi|CPFXVv@nKy4W|Tq485fQ|nR6ME zo3brEafbQy7<=N(xf-N?;&iHICMC;08jL$n#~*<+gJo9T&BaX4-LHWZvoWQcV`?QPmeUW zGA=!Q4}6rMd-2DD0LbEW;8P2Mkq@p#p##uJdjR)FDadKl9EyN?3Xqmx0@45xNP%Kq z0#X#`02omK^C1EzU>cSIBWbNNp$I_307V@DoE0#SEx2bXqYWAWoz>U#e6u8hS~|alUqWqaYB8fL;|Vl^QtN z%cKo)l_-$jHmf`-3_E4Vkm$R9PJ-Opykx%6xKbA0R zPT-_BK)4kj%WEb;bbkoZ+?$QI2+6R?;HO~yHlc*#Gh}lRgx@c?4`j%hyzZ3_q<-b# z6;nx&BU;-gWnRo+Vv37l`5EN)BdW1mN?E=LDOnKWLZ;N!A)2NC(vzp8NkQs5B`;fo z0I+a93o{R*dl-FAVa!r>I~zuB zSd(dUFW3b4L;R1-54&D9Hk10bZ_h4+UfDS972L(a1$J<9jLi#nU)h+xQ{kz-J0N5B zY`(GkBsI8UX9EgbkS}vO>wFIin~-tx>De}vF&dgCFVp8vqz%Nc2W?%1d1K+Y8Hp diff --git a/applications/PoP/poc/res/vizier/g1.atl b/applications/PoP/poc/res/vizier/g1.atl deleted file mode 100644 index 39fbb21970e4c383c604dc9fc5c3c02498c25428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10732 zcmd6tO^)L>5QRO90LdoEBAWn>Y>fE@vd9gR8w8k5uGOAtw+#!>1?GNPD)nAfkwuD> z*oY?>Ei8)l=@rRtK9$`4@vlFB|Nijxk1vOZcduR@4nKYO@D}I4e|Uey`JW$;Z*czY z=i_Uf|M*4EAAdcP`*QriI7awzcz0Mfj_Y+Jm_ygh-EwbeozJ*<)Pw!ECRlJnFE?=W z%v-EaDph9fcnZ*vb(Xf@U7rn;Nz7>0VZTN! z9^PM_Bf@qS=VfdAuegpuRos?8CDd)~w6zsDT9s>Vg<@vp_Aw+Lw~``5??RHkKOFDt zBfVTN?N_&G+?73J2w{!1mdPqhM<)J6&brlWnTXIr0-&3=_<I%n6YOGo=n7A~W|r?W(gB zu4{YlqFW4NcBJH0!{ae8O@1<+`Mf?1}At>A0L&&}NL1_BHJFa%qV}fY&m)-g~UL5 zfb<*l*rfc4;t-5xtz}e%NV(DT4y|)NojI07#Ee3vt5Rv)iU|c%ONFk4i*a+aOGc5> zS8|qlpnOQFN)!qZ%3QfCh0zF>p$UO$^=e!o(A2?0?YWACOM%?l|0_i)d)kx+7xK9^ zV_0*SQYn8D6qtleZf!*j_`SxhDb#lvq8<#i=xSYD?@00ex0R&q8_LK+dGm$QMF$K( z&|wO$`FhATeE^&14NJ+JdJA%D!@;sYl#m+<2Z&wGM(L{N5H<%u*mtG%3KQyJLxhS- zav7LKWgt~SVX-n3I_Vzan!|yPSCfpD*9`L`+*k>ijF)a^;?C?&oCqy(Ihqa`p81+$+@r%Y=D@q4Fz*y zz7`et`X=OJnlIU58We=&umy$`nklReWgHTzSr|Dqs_py+?$_rkL5>ziQ;!tnU&o)&Ro*gLaNSoBIC4$<8AU0x&!ffwy4si&= zn2z`U6H2v0-_&J);nKFncq3NSjENHKkRMi2}ZFV zwlZc{E5%fbRbR@5hEav>ND<<1+Ftq>yxK|TzAY1xzb_WSR-WTRS@|K&xpx=D8Z)&ml*pvOI_Jc?Dz)5&=ilMZ`qkZQ%X zZ;U#H??3xmIu0FHMHNp1#FTOuRazX#9|Sh179}R?U%5ugrRvAPq7RFwCu)@x{a99j z|5_k%e+o1xJOrY>3tdv`#+%Oo%yRz`kSTY{!d>kGl&0LG=+8(w3*M5^J_%;~?{c78 zN2%K)tS^Hb5JGuWn;@{F`fk#I_9-v7n-aOxit^miZm}xg_Z`7To*_ff3m!+yzsmB3 A`Tzg` diff --git a/applications/PoP/poc/res/vizier/g2.atl b/applications/PoP/poc/res/vizier/g2.atl deleted file mode 100644 index 5c8405c04be04b80953b6c118c6f18b1f4b47797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9865 zcmd6tOKu!D5QfLA1X*R_1PH7EhG4^h76x*J+#o*<$_8q5b=Bzy9*=;mfDL4>#{#yf_?w{O09*=Kp?o^M?6f-(SCF z{^t*`r2n6vt|b5O=hxEz$Mu!;bA~sEcZcQKrpwsOE@Rvnb{WDz^_|{I>SBuU8DgiC zu6_*5)a|kab2Dohi(jo`iAvBsry>itaKb0jLE`QjFl88siEQCQj*BjHL%iq0&;t zD^{C`reH5XFwHF!B$%6}5OdO1Jw`cojG^U#%2Hd&VB6Ey zjcl7&b>&vgZNngzR@9Df>SC^Gi>h}>QG3%ih%IB*h=mf;cm+3vK|cZoX^l~4`WomX zgnD^+|BSyhKGkQQ<4rb7oG0wxi`;Tqpahj5Yaey*bTaj0#%BC2sV=I^%DIj3Odo))>zL&qjD}c0B(^M6JZPE8G{vwF)Ip%RN~At5 zqn72vN6~l>I+bFL?mozYb0YIF4dZ~30%J{+V9ldJ($``+FE@ubhlO9-z4TPfg59_0 zi@UGSP*?DG?Lwo>jv-aLzB5z97}EXciWxCV$YD@c#Cp55mI-Fo}k+9PL3KBh6Ypg7$1W~xSb zloMtWhSW4UVrIyQuW72HM=+g@o*dOs#Ykm@0Vo((q0Tx1PKeIt9R`NxWm_rGRiyR2 z*-`*fjHs5edWmizmB}9C3+*xr?VY?htvv>o22OAz=Q1%PN1x8rAqXZL+t4VpZNYlP z)Aix)7dwXyd_fTY`=6Pw4Vgf+FR=dO#ZdFt`*f(;2b7pJA6A&!6SuS(C4f9?OVYGr zc;x`OnYBaCZfi!|K}mRoL|kNV*_X|ciiDFR;tO4^AyYTeHvFD1Ava_?X^O0>4O3#t z7?)CLvZ}4iHlc!Hke>mGyF$0!)$OAY3YjTy3G)1z2s*tfep$O(zRo_34sV(Rm@ zcEdCbc?uj^lM~D%YOP^4#c^N)!Au+xhw5O_p7KdcO|X>RR+e9=L3`6wZ}FzntAt)X z_5J4FGR=7h(~T%x_&!u0({|nZnJrkNM|8 zc?>hyEijoIj1~8E3RIMau>@_prmHcZEpowlPp6x#aHdyqhKf`Cit~FqaDI4mp%7Bd zJ>&pbVRC?5Veqc5-I`$PbsbKATqI1lG&dtpfl?IAAbKfLGqMmX4uwP{6;`UEI(2Hx zo~UAmP^ygNiY%c7b5~hfVI1N>E{1!&v@U~&0{RT96IgDP)Bwh>+hw_Wt^y%Z6RzXa z1j3ZnKl%Q$T7gguJF_nkdXdO&UR@Y90s$v@#}YN^A|GvtEEk9(yd(xU1fs=afymUO zfBt&{0o?VbFAx!ijou0bFj*>Iorgi0r`h2R^aR4jFuY)HMi!bgjNK`f?&@+vq)_)2 zwHn*>+hAKhx6CZ6kK{kONAW z%XilB=7OE9QLm(~2XoljOq;NtXJ}m1{@IXjw?im}@iPSVP*P z%eUtSR54-PR=-0wjWu>cE@s%8Cbx}bs>`UUJ|h02Up)1&kt-tHBHeX_O$}0DkZS8q zO_4q$g2uDV$6xJy-P;)K(Pnu;_46UbquA|vW6bj3uDad?x<7UyGW-FQHN@7$fb``V zgzcQ$)Hx}|^dHIezaC^t`t>0nF11wZkqMuHvKLAy5~M=4(#`ftkqRisp`Ci*jCTXb zWc$J&R+EBN3Y-raULcg)x28~Y$lsOZEhSeG>$`{w)2oOzRL+dXZBms#tI(bnJ5U}t W1kvA4ki+6ooLivh34|q=l>Y(0*I3^G diff --git a/applications/PoP/poc/res/vizier/g3.atl b/applications/PoP/poc/res/vizier/g3.atl deleted file mode 100644 index 6b6aff33cc6b47b0b46d7b22555b6eed79b11b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3283 zcmchZJ#HH@5QQli0Sp9g3`n&ByKtK$xS!W_~1-FY09A(CE) zJT90*jyr%ur8|(V)c_yrncJ zD#L@Qtx~7ciDQ_NRskId281mm=v4@4&dMO<4NH;(ff|y#kStAPoEds-L8*T}X9y+5 zII^amc3~GXACo-p!gI(ID=Oymxu6?8ay`Aq2uxmbgQB^VhKK@Y4CQPK&AE=HbYdJ> zJq_f(Y?~aHDrXkK71L%>{HAm^d**u1S&4viCt0JcCYfFdu;*HwM)FkEF@lx%=pV(P zoIVXs;MPF1EF26@pxAnAb#~EgDx=T3<_E1zJ?gAd#s+rx;qfoEV22EjFHy>X`%05n zm5CfksemT?w946*TvcB#$L?@-%|IaHX+q$R5gWKI*b_m(B<9TNBpKLF>g7VC+(;{n);unjnoyx8 zt&Id*Tkx6%R$lp_}7qyIX9St-G?7eY16JueTPn zb#&V?ljJ5VSXnREm{qlwncY$ba9t(|pe=Ezl?_Hs|g{8_&48y#Nsq*N%+NCHZXBVy7g%%@Ft5b6(Dn+eMNw0iCV-yuP z=vhxPr4hH4T0kY5%71fEl}#ox=OZpSDH^b9fGTf2`{EUqGF34#8Ct&lR##OOxF*HR YE>%r-Vpo{%q@CWWrOPx# diff --git a/applications/PoP/poc/res/vizier/g4.atl b/applications/PoP/poc/res/vizier/g4.atl deleted file mode 100644 index 36515a470e90e15d75784ff6d0e3eedb367db598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmcJN&20iP5QPm_jub!voKgZEL`pkp!U)^3u(TDWCg;8Rad3c@IAjp=+s|)i$Lslc zKfP_k|Ho%I>^GYbzPHC6SH>aiL%)gZwRiqC3ga<~@qC_b{T{_T^aYf&CwA5cc^xs6 z)ngpBfLIDBk2k340g`uSPcE%Bm}1Y_3lcRV9LpHW8ybvz3^ZY@EQXXtY0Hr?J2jYg zA7et#NptN$K==u&e#U%B7ou7RTG(eRAdUnWv&41e)wPrqbJR6+JW_~lnGl(QW7tgt zHT&kLo2Gx;pP?V>IkhRIK_!(+RivUSC)U-f{IJgTHe zBn59w*S`|&=!V?jn(XcbHuOAi%W@8?h8+gLT)^jl7@X4ERPC- HB1`W-C(#_@ diff --git a/applications/PoP/poc/res/vizier/vizier.arc b/applications/PoP/poc/res/vizier/vizier.arc deleted file mode 100644 index ffb7818a137cb90c983773b55ac6f3c418106d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36352 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 diff --git a/applications/PoP/poc/room.c b/applications/PoP/poc/room.c deleted file mode 100644 index 798728a..0000000 --- a/applications/PoP/poc/room.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * room.c — вся логика комнаты, ОБЫЧНЫЙ HOME-файл (без --bank). - * - * 2026-07-15/16: изначально была банковская (--bank 1), сначала в W3 - * (huge-дефолт), потом пробовали W1 (--memory big) — оба варианта - * упирались в проблемы (W3 конфликтует с gfx_blit_part/atlas_load, - * которые сами трогают W3; W1-банк несовместим с CODE=W1 — трамплин - * сам бы уехал из W1; --memory big тесно — CODE+DATA+BSS ~20КБ, не - * лезет в один 16КБ). После замены sprintf() на ручное hex-форматирование - * пути (экономия ~2.9КБ — sprintf/vsprintf тянули за собой заметный - * кусок форматирующего кода, единственный потребитель в HOME) всё - * снова влезает в W1 обычным HOME-кодом — банк ОКАЗАЛСЯ НЕ НУЖЕН. - * Так проще: gfx_blit_part()/atlas_load() (трогают W3 транзитивно) - * теперь просто обычные HOME-функции, без всяких W1/W3-танцев. - * - * gfx_blit_part пишет ПРЯМО в текущий банк (видео-ОЗУ + теневая копия - * при GFX_BANK_NORMAL) — перманентно, не через sprite_t. Вызывающий - * код обязан позвать room_draw() на КАЖДУЮ из двух страниц дабл-буфера - * при входе в комнату, иначе heal спрайтов увидит фон только на одной - * странице. - */ -#include -#include -#include "room.h" - -/* 32x64 на тайл: 3*64+8=200 — сходится с разрешением DOS 320x200 - * (8px внизу — под полоску жизней/строку текста, не часть игрового - * поля). Уточнить точнее, когда будут готовы настоящие ассеты. */ -uint8_t room_row_h[ROOM_ROWS] = {64, 64, 64}; -tile_atlas_t tile_atlas[32]; - -int tile_atlas_load(const char *dir) -{ - static const char HEXD[] = "0123456789abcdef"; - char path[64]; - int i, count = 0; - - for (i = 0; i < 32; i++) { - /* Вручную, не sprintf("%stile%02x.atl",...) — единственный - * потребитель printf-семейства в этом приложении, тянул за - * собой ~2.9КБ форматирующего кода; формат тут фиксированный - * (2 hex-цифры). */ - char *p = path; - const char *s = dir; - while (*s) *p++ = *s++; - s = "tile"; - while (*s) *p++ = *s++; - *p++ = HEXD[(i >> 4) & 0xF]; - *p++ = HEXD[i & 0xF]; - s = ".atl"; - while (*s) *p++ = *s++; - *p = '\0'; - if (atlas_load(&tile_atlas[i].at, path) == 0) { - tile_atlas[i].loaded = 1; - count++; - } else { - tile_atlas[i].loaded = 0; - } - } - return count; -} - -void tile_atlas_free(void) -{ - int i; - - for (i = 0; i < 32; i++) { - if (tile_atlas[i].loaded) { - atlas_free(&tile_atlas[i].at); - tile_atlas[i].loaded = 0; - } - } -} - -int level_load_room(level_t *lv, uint8_t room, const char *path) -{ - FILE *f = fopen(path, "rb"); - uint8_t buf[ROOM_TILES * 2 + 3]; /* fore[30]+back[30]+start_room/pos/dir */ - int i; - - if (!f) - return -1; - if (fread(buf, 1, sizeof(buf), f) != sizeof(buf)) { - fclose(f); - return -1; - } - fclose(f); - - for (i = 0; i < ROOM_TILES; i++) { - tile_t *t = level_tile(lv, room, (uint8_t)(i % ROOM_COLS), - (uint8_t)(i / ROOM_COLS)); - t->type = buf[i]; - t->state = buf[ROOM_TILES + i]; - } - lv->start_room = buf[ROOM_TILES * 2]; - lv->start_location = buf[ROOM_TILES * 2 + 1]; - lv->start_direction = (int8_t)buf[ROOM_TILES * 2 + 2]; - return 0; -} - -/* _bgi_blit_rows_raw держит ОДИН DI на весь блит (см. её шапку) — - * вызывающий обязан резать блиты выше 16 строк на чанки, иначе окно - * DI слишком длинное (риск сорвать кадровую цепочку IRQ/CBL). Наши - * тайлы 64px высотой — режем на чанки по CHUNK_H строк. */ -#define CHUNK_H 16 - -void room_draw(level_t *lv, uint8_t room) -{ - int row, col, y = 0; - - for (row = 0; row < ROOM_ROWS; row++) { - int x = 0; - uint8_t fh = room_row_h[row]; - - for (col = 0; col < ROOM_COLS; col++) { - tile_t *t = level_tile(lv, room, (uint8_t)col, (uint8_t)row); - uint8_t type = TILE_TYPE(t->type); - - if (tile_atlas[type].loaded) { - uint8_t count = tile_atlas[type].at.count; - uint8_t variant = 0; - uint8_t is_var; - - if (count != 0) { - switch (type) { - case TILE_SPIKES: - case TILE_GATE: - case TILE_TAPESTRY: - case TILE_TAPESTRY_TOP: - case TILE_CHOPPER: - case TILE_POTION: - is_var = 1; - break; - default: - is_var = 0; - } - variant = is_var - ? (uint8_t)(t->state % count) - : (uint8_t)((room * 31u + col * 7u + row * 13u) % count); - } - const void *img = atlas_image(&tile_atlas[type].at, 0); - uint8_t sub_y; - - gfx_w0_map(tile_atlas[type].at.page); - for (sub_y = 0; sub_y < fh; sub_y = (uint8_t)(sub_y + CHUNK_H)) { - uint8_t chunk = (uint8_t)(fh - sub_y); - if (chunk > CHUNK_H) - chunk = CHUNK_H; - gfx_blit_part(x, y + sub_y, img, variant * ROOM_TILE_W, - sub_y, ROOM_TILE_W, chunk); - } - gfx_w0_unmap(); - } - x += ROOM_TILE_W; - } - y += fh; - } -} diff --git a/applications/PoP/poc/room.h b/applications/PoP/poc/room.h deleted file mode 100644 index ee26e91..0000000 --- a/applications/PoP/poc/room.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * room.h — отрисовка комнаты из тайлов В РАНТАЙМЕ, через спрайтовые - * атласы (см. пересмотр PORT_PLAN.md §4, 2026-07-15). - * - * Один атлас на ТИП тайла (0x00..0x1F) — лента из N вариантов - * (кадр fw x fh, fw=ROOM_TILE_W, fh=высота ряда, где тип реально - * стоит). Для типов, где backtable — настоящее состояние - * (gate/tapestry/chomp/spike) — вариант = state; для остальных — - * простой псевдослучайный выбор по позиции (свой приём, не алгоритм - * оригинала — просто чтобы плитка не повторялась один-в-один). - * - * Загрузка "всей лентой — копии одной картинки" на старте, до - * появления настоящих вариантов — нормальная стратегия: движок/API - * не меняются, когда картинки заменятся на настоящие. - * - * Фаза 1 (PORT_PLAN.md §5): анимированные типы (факел/дверь/шипы/ - * дробилка) НЕ рисуются вообще — просто не грузим для них атлас, - * room_draw пропускает клетки без атласа. Анимация через отдельные - * sprite_t поверх фона — Фаза 2, см. §7 плана. - * - * room_draw() зовётся ОДИН РАЗ при входе в комнату, не в игровом - * цикле — бюджет кадра не затронут (gfx_w0_map/unmap на тайл — тоже - * разовая цена, не per-frame). - */ -#ifndef ROOM_H -#define ROOM_H - -#include -#include /* atlas_t, atlas_load/free, atlas_image, gfx_w0_map/unmap */ -#include "level.h" - -#define ROOM_TILE_W 32 /* ширина колонки, px (10 колонок = 320) */ - -/* Высоты рядов, px — измерено по реальным тайлам подземелья - * (PORT_PLAN.md §3: ~20/60/62) — ПОДТВЕРДИТЬ при подготовке настоящих - * ассетов, значения приблизительные. */ -extern uint8_t room_row_h[ROOM_ROWS]; - -typedef struct { - atlas_t at; - uint8_t loaded; /* 0 = атласа нет — тип не рисуется */ -} tile_atlas_t; - -/* Индекс — TILE_TYPE (0..31). */ -extern tile_atlas_t tile_atlas[32]; - -/* Грузит "{dir}tileNN.atl" (hex TILE_TYPE, 2 знака, напр. "tile01.atl" - * — Floor) — какие есть, те и грузятся. dir — префикс ПОДКЛЕИВАЕТСЯ - * как есть (без добавления разделителя) — файлы на диске лежат ПЛОСКО - * (см. соглашение других examples: "name.ext" либо "a:\\name.ext"), так что - * dir обычно "" или "a:\\". Каждый файл — ОДНА лента (idx 0) из N - * кадров fw=ROOM_TILE_W x fh=room_row_h[row] (row, где этот тип - * реально стоит) — готовится toolchain/png_strip.py + - * toolchain/mkatlas.py. Возврат: число загруженных (0..32). - * - * room.c — обычный HOME-файл, БЕЗ --bank (см. шапку room.c за - * историей: банк в W3 конфликтовал с gfx_blit_part/atlas_load, - * банк в W1 невозможен при CODE=W1 — трамплин сам уехал бы из W1; - * после чистки sprintf() всё влезает в HOME без банка вообще). */ -int tile_atlas_load(const char *dir); -void tile_atlas_free(void); - -/* Нарисовать комнату (room 1..24) — только типы с загруженным - * атласом; остальные клетки пропускаются (в т.ч. все анимированные - * типы в Фазе 1 — атлас для них просто не грузится). */ -void room_draw(level_t *lv, uint8_t room); - -#endif diff --git a/applications/PoP/poc/tools/build_room_palette.py b/applications/PoP/poc/tools/build_room_palette.py deleted file mode 100644 index f74a7a8..0000000 --- a/applications/PoP/poc/tools/build_room_palette.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -""" -build_room_palette.py — сводит kid.pal (уже собран -gen_kid_placeholder.py) + Floor + Wall тайлы в ОДНУ merged-палитру -room.pal, грузимую ОДИН раз через gfx_pal_fload (см. poc.c) — экран -показывает Kid и тайлы ОДНОВРЕМЕННО, значит их "свои" цвета обязаны -жить в одной палитре (см. --seed-pal в toolchain/png_strip.py). - -На вход — только типы, которые Фаза 1 реально рисует (room_draw -рисует только загруженные атласы; Floor/Wall — единственные твёрдые -типы с нетривиальной картинкой заглушки, см. gen_tile_placeholders.py -draw_floor_like/draw_wall_like). Остальные 30 типов из Фазы 1 -исключены полностью (не грузятся, не рисуются, PORT_PLAN.md §5) — -добавить сюда, когда понадобятся. - -Перезаписывает res/tiles/tile01.raw/.atl (Floor) и tile14.raw/.atl -(Wall, TILE_WALL=0x14 — room.c ищет "tile%02x.atl" ОБЯЗАТЕЛЬНО в hex, -не decimal!) с индексами палитры, согласованными с kid.pal; пишет -kid+floor+wall.pal рядом с kid.pal (poc.c грузит её вместо отдельной -kid.pal). -""" -import subprocess -import sys -from pathlib import Path -import os - -HERE = Path(__file__).resolve().parent -PROJ_ROOT = Path(os.environ["SPRINTER_ROOT"]).resolve() -TILES_DIR = HERE.parent / "res" / "tiles" -PNG_STRIP = PROJ_ROOT / "toolchain" / "png_strip.py" -MKATLAS = PROJ_ROOT / "toolchain" / "mkatlas.py" - -ROOM_TILE_W = 32 -ROOM_ROW_H = 64 - -KID_PAL = HERE / "kid.pal" -OUT_PAL = HERE / "room.pal" - -TYPES = [0x01, 0x14, 0x03, 0x13, 0x0E, 0x0B] # Floor, Wall, Pillar, Torch, Debris, Loose -# (2026-07-16: временное ограничение до 2 типов снято — корень -# вероятностного "снега" найден: tile_atlas_load()/room_draw() трогали -# W3 транзитивно (через atlas_load/gfx_blit_part) ИЗ БАНКА, который сам -# живёт в W3 — конфликт. Обе функции переехали в room_draw.c (HOME), -# см. её шапку.) - - -def run(cmd): - print("+", " ".join(str(c) for c in cmd)) - subprocess.run([str(c) for c in cmd], check=True) - - -def main(): - if not KID_PAL.exists(): - sys.exit(f"build_room_palette: нет {KID_PAL} — сначала gen_kid_placeholder.py") - - seed = KID_PAL - for t in TYPES: - base = f"tile{t:02x}" # room.c ищет "tile%02x.atl" — hex, не decimal - png = TILES_DIR / f"{t:X}-0.png" - raw = TILES_DIR / f"{base}.raw" - pal = TILES_DIR / f"{base}_merged.pal" - atl = TILES_DIR / f"{base}.atl" - - run([sys.executable, PNG_STRIP, raw, pal, png, - "--canvas", f"{ROOM_TILE_W}x{ROOM_ROW_H}", - "--anchor", "top-left", "--seed-pal", seed]) - run([sys.executable, MKATLAS, atl, f"{raw}:{ROOM_TILE_W}x{ROOM_ROW_H}:1x1"]) - seed = pal - - import shutil - shutil.copyfile(seed, OUT_PAL) - print(f"build_room_palette: итоговая палитра -> {OUT_PAL}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/poc/tools/build_tile_atlases.py b/applications/PoP/poc/tools/build_tile_atlases.py deleted file mode 100644 index f085ef8..0000000 --- a/applications/PoP/poc/tools/build_tile_atlases.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 -""" -build_tile_atlases.py — собирает tileNN.atl для всех 32 типов тайлов -из applications/PoP/poc/res/tiles/{TYPE:X}-{N}.png (см. -gen_tile_placeholders.py). Для каждого типа находит ВСЕ файлы -{TYPE:X}-*.png (сколько бы вариантов ни было — 1 заглушка или много -настоящих), сортирует по номеру варианта и собирает через -png_strip.py + mkatlas.py. Типы без ни одного файла — пропускаются -(room_draw их и так не рисует). - -Запускать заново каждый раз, когда добавили/заменили картинки в -res/tiles/ — атласы просто пересоберутся. -""" -import re -import subprocess -import sys -from pathlib import Path -import os - -HERE = Path(__file__).resolve().parent -PROJ_ROOT = Path(os.environ["SPRINTER_ROOT"]).resolve() -TILES_DIR = HERE.parent / "res" / "tiles" -OUT_DIR = HERE.parent / "res" / "tiles" -PNG_STRIP = PROJ_ROOT / "toolchain" / "png_strip.py" -MKATLAS = PROJ_ROOT / "toolchain" / "mkatlas.py" - -ROOM_TILE_W = 32 -ROOM_ROW_H = 64 # см. room.c room_row_h — держать в синхроне - -PATTERN = re.compile(r"^([0-9A-Fa-f]+)-(\d+)\.png$") - - -def run(cmd): - print("+", " ".join(str(c) for c in cmd)) - subprocess.run([str(c) for c in cmd], check=True) - - -def main(): - by_type = {} - for f in TILES_DIR.glob("*.png"): - m = PATTERN.match(f.name) - if not m: - continue - t = int(m.group(1), 16) - n = int(m.group(2)) - by_type.setdefault(t, {})[n] = f - - if not by_type: - sys.exit(f"build_tile_atlases: нет файлов TYPE-N.png в {TILES_DIR}") - - built = 0 - for t in sorted(by_type): - variants = by_type[t] - files = [variants[n] for n in sorted(variants)] - strip_raw = OUT_DIR / f"tile{t:02x}.raw" - strip_pal = OUT_DIR / f"tile{t:02x}.pal" - atl = OUT_DIR / f"tile{t:02x}.atl" - - run([sys.executable, PNG_STRIP, strip_raw, strip_pal, - *files, "--canvas", f"{ROOM_TILE_W}x{ROOM_ROW_H}", - "--anchor", "top-left"]) - run([sys.executable, MKATLAS, atl, - f"{strip_raw}:{ROOM_TILE_W}x{ROOM_ROW_H}:{len(files)}x1"]) - built += 1 - - print(f"build_tile_atlases: собрано {built} атласов " - f"(типы: {', '.join('%X' % t for t in sorted(by_type))})") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/poc/tools/extract_room.py b/applications/PoP/poc/tools/extract_room.py deleted file mode 100644 index 0027782..0000000 --- a/applications/PoP/poc/tools/extract_room.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -""" -extract_room.py — вырезает ОДНУ комнату (foretable+backtable, 30+30 -байт) + стартовую позицию уровня (start_room/start_pos/start_dir, 3 -байта) из level-ресурса формата "res20NN.bin" (SDLPoP data/LEVELS/). - -Layout подтверждён структурным разбором: файл начинается СРАЗУ с -foretable[720] (24 комнаты * 30 тайлов), затем backtable[720] — без -заголовка (applications/PoP/docs/POP-DAT-FormatSpecifications.pdf §3.4 -+ декод байт 2026-07-15). Тайл tileOffset 0-9 = верхний ряд, 10-19 = -средний, 20-29 = нижний (см. level.h level_tile()). - -Смещение start_room/start_pos/start_dir НЕ сразу после links (как -предполагалось изначально) — сверено со структурой level_type в -applications/PoP/SDLPoP/src/types.h (маленький структурный факт, -порядок полей, не объём кода): fg[720]+bg[720]+doorlinks1[256]+ -doorlinks2[256]+roomlinks[96]+used_rooms[1]+roomxs[24]+roomys[24]+ -fill_1[15] = 2112 -> start_room(u8), start_pos(u8), start_dir(s8) -(2026-07-16, подтверждено на res2001.bin: start_room=1, start_pos=0, -start_dir=-1 — согласуется с links[room1] и решулось эмпирически -через таблицу room-links, которая идеально легла на смещение 1952). - -Использование: - extract_room.py LEVEL.bin ROOM OUT.dat - -Выход: OUT.dat — 63 байта (fore[30]+back[30]+start_room+start_pos+ -start_dir), формат level_load_room() (room.c). ROOM — 1-based (как в -файле/level.h); start_* — общеуровневые (не зависят от ROOM). -""" -import sys - -FORETABLE_OFF = 0 -BACKTABLE_OFF = 720 -ROOM_TILES = 30 -START_OFF = 720 + 720 + 256 + 256 + 96 + 1 + 24 + 24 + 15 # 2112 - - -def main(): - if len(sys.argv) != 4: - sys.exit(__doc__.strip()) - src, room_s, out = sys.argv[1], sys.argv[2], sys.argv[3] - room = int(room_s) - - data = open(src, "rb").read() - if len(data) < START_OFF + 3: - sys.exit(f"extract_room: {src}: {len(data)} Б — меньше ожидаемых " - f"{START_OFF + 3} (foretable+backtable+...+start_position)") - - base = (room - 1) * ROOM_TILES - fore = data[FORETABLE_OFF + base:FORETABLE_OFF + base + ROOM_TILES] - back = data[BACKTABLE_OFF + base:BACKTABLE_OFF + base + ROOM_TILES] - start = data[START_OFF:START_OFF + 3] - open(out, "wb").write(fore + back + start) - print(f"extract_room: комната {room} из {src} -> {out} " - f"({len(fore)}+{len(back)}+{len(start)} Б); " - f"start_room={start[0]} start_pos={start[1]} " - f"start_dir={start[2] if start[2] < 128 else start[2] - 256}") - - -if __name__ == "__main__": - main() diff --git a/applications/PoP/poc/tools/gen_kid_placeholder.py b/applications/PoP/poc/tools/gen_kid_placeholder.py deleted file mode 100644 index fb5dca1..0000000 --- a/applications/PoP/poc/tools/gen_kid_placeholder.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -""" -gen_kid_placeholder.py — временная ЗАГЛУШКА персонажа для PoC. - -НЕ используем графику оригинальной Prince of Persia (авторские права -Broderbund/Ubisoft) — PoC проверяет управление/коллизии/движок, не -визуальную точность (applications/PoP/docs/PORT_PLAN.md §5). Вместо -этого берём уже лицензированный спрайт-пак, который в проекте и так -используется (examples/rpgwalk/conv_sprites.py) — -third_party/16x16-RPG-characters, один персонаж (индекс 0) той же -раскладкой: 12 кадров (dir*3+frame, dir 0=вниз/1=влево/2=вправо/3=вверх, -3 кадра маятника на направление). - -Замену на настоящую графику Кида (если/когда появится легально чистый -источник) пользователь делает сам — вне этого скрипта. - -Выход: kid.raw (16×192, 12 кадров) + kid.pal (EGA 16 + цвета спрайта). -""" -from PIL import Image - -SRC = ("../../third_party/16x16-RPG-characters/sprites/" - "old-style/02-bard.png") -CHAR = 0 # какой из 8 персонажей листа берём - -EGA = [ # B, G, R, pad — как в libbgi/bgi256/_bgi_mode_set.c - (0, 0, 0), (168, 0, 0), (0, 168, 0), (168, 168, 0), - (0, 0, 168), (168, 0, 168), (0, 84, 168), (168, 168, 168), - (84, 84, 84), (255, 84, 84), (84, 255, 84), (255, 255, 84), - (84, 84, 255), (255, 84, 255), (84, 255, 255), (255, 255, 255), -] -BASE = 16 - -im = Image.open(SRC).convert("RGBA") -assert im.size == (192, 128), im.size - -colors = {} - - -def px(x, y): - r, g, b, a = im.getpixel((x, y)) - if a < 128: - return 0xFF - key = (r, g, b) - if key not in colors: - assert BASE + len(colors) < 0xFF - colors[key] = BASE + len(colors) - return colors[key] - - -bx, by = (CHAR % 4) * 48, (CHAR // 4) * 64 -data = bytearray() -for d in range(4): - for f in range(3): - for y in range(16): - for x in range(16): - data.append(px(bx + f * 16 + x, by + d * 16 + y)) -open("kid.raw", "wb").write(data) - -pal = bytearray() -for b, g, r in EGA: - pal += bytes((b, g, r, 0)) -for (r, g, b) in colors: - pal += bytes((b, g, r, 0)) -open("kid.pal", "wb").write(pal) - -print(f"gen_kid_placeholder: kid.raw 16x192 (12 кадров), " - f"kid.pal EGA+{len(colors)} цветов ({len(pal)} Б)") diff --git a/applications/PoP/poc/tools/gen_tile_placeholders.py b/applications/PoP/poc/tools/gen_tile_placeholders.py deleted file mode 100644 index 54ac170..0000000 --- a/applications/PoP/poc/tools/gen_tile_placeholders.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -""" -gen_tile_placeholders.py — ЗАГЛУШКИ для 32 типов тайлов (не графика -оригинала!) — простая процедурная геометрия (кирпичная кладка линиями, -плоская поверхность и т.п.), чтобы визуально читалось "это стена"/ -"это пол", пока не готовы настоящие ассеты (см. room.h/room.c: -tile_atlas[TYPE], вариант 0 — "index"-картинка на тип). - -Выход: applications/PoP/poc/res/tiles/{TYPE:X}-0.png — 32 файла, -32x64 (ROOM_TILE_W x room_row_h), RGBA. - -Для твёрдых типов (Фаза 1: Floor/Wall/Pillar/PillarBot/PillarTop/ -BalconyL/R) — функциональная заглушка (см. draw_wall_like/draw_floor -ниже); Lattice-типы (0x19-0x1D) — узкая проходимая колонна той же -кладки (draw_lattice_like, см. reference-скриншот оригинала); для -остальных (декоративные/интерактивные, вне объёма Фазы 1) — просто -цвет + подпись, этого достаточно для отладки конвейера. Empty (0x00) -— полностью прозрачно (ничего не рисуется). - -По мере готовности настоящих ассетов — рядом кладутся 0-1.png, -0-2.png и т.д. (следующие варианты той же ленты), см. room.h. -""" -import colorsys -from pathlib import Path -from PIL import Image, ImageDraw, ImageFont - -W, H = 32, 64 - -NAMES = [ - "Empty", "Floor", "Spikes", "Pillar", "Gate", "StuckBtn", "DropBtn", - "Tapestry", "PillarBot", "PillarTop", "Potion", "Loose", "TapestryTop", - "Mirror", "Debris", "RaiseBtn", "ExitL", "ExitR", "Chopper", "Torch", - "Wall", "Skeleton", "Sword", "BalconyL", "BalconyR", "LatticePillar", - "LatticeSupport", "LatticeSmall", "LatticeL", "LatticeR", "TorchDebris", - "Null", -] -assert len(NAMES) == 32 - -WALL_LIKE = {0x03, 0x08, 0x09, 0x14, 0x17, 0x18} # Pillar/PillarBot/Top/Wall/BalconyL/R -FLOOR_LIKE = {0x01} # Floor -# Lattice — узкие декоративные каменные колонны (см. reference-скриншот -# оригинала 2026-07-16): Кид физически проходит МИМО них (не полноценная -# стена на всю ширину тайла) — колонна той же STONE/MORTAR кладки, но -# ýже тайла, с прозрачными полями по бокам. (col_w, align): -# align: "center"/"left"/"right". -LATTICE_LIKE = { - 0x19: (14, "center"), # LatticePillar - 0x1A: (18, "center"), # LatticeSupport — потолще - 0x1B: (10, "center"), # LatticeSmall — потоньше - 0x1C: (14, "left"), # LatticeLeft - 0x1D: (14, "right"), # LatticeRight -} -# Плоский однотонный цвет БЕЗ текста (не через антиалиасинг шрифта) — -# держит "своих" цветов в палитре по 1 на тип, иначе объединённая -# палитра (--seed-pal) быстро упирается в лимит 0xFF (см. -# pop_tile_atlas_palette_merge в памяти). -FLAT_LIKE = {0x13: (200, 90, 30, 255), # Torch — тёплый оранжевый - 0x0E: (110, 90, 70, 255), # Debris — серо-бурый - 0x0B: (140, 120, 60, 255)} # Loose — тускло-жёлтый (плита) - -STONE = (150, 150, 158, 255) -MORTAR = (90, 90, 98, 255) -GROUND = (120, 100, 80, 255) -GROUND_TOP = (170, 150, 120, 255) - -out_dir = Path(__file__).resolve().parent.parent / "res" / "tiles" -out_dir.mkdir(parents=True, exist_ok=True) - -try: - font = ImageFont.load_default() -except Exception: - font = None - - -def draw_wall_like(im): - """Кирпичная кладка — просто ряды прямоугольников со смещением - в шахматном порядке и линиями раствора между ними (обобщённый - геометрический приём, не стиль конкретной игры).""" - draw = ImageDraw.Draw(im) - draw.rectangle([0, 0, W - 1, H - 1], fill=STONE) - brick_h = 12 - brick_w = 16 - row = 0 - y = 0 - while y < H: - offset = (brick_w // 2) if (row % 2) else 0 - x = -brick_w + offset - while x < W: - draw.rectangle([x, y, x + brick_w - 2, y + brick_h - 2], - outline=MORTAR, width=1) - x += brick_w - y += brick_h - row += 1 - - -def draw_lattice_like(im, col_w, align): - """Узкая колонна кирпичной кладки шириной col_w {out_dir}") diff --git a/applications/PoP/poc/tools/kid.atl b/applications/PoP/poc/tools/kid.atl deleted file mode 100644 index 6eff625b7fc673fa937d8c4811041f70e3ee2170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3332 zcmd5;TTTNp3~c}T$Zk)<5x4;o7v^Tm%=nqzm8uG;8Uc;t@ndW!5{+y1c)_d3ra_oQbj?c&VbGEUf;xy)p40L#oeMDA-(i#-jzSnHgxy^ diff --git a/applications/PoP/poc/tools/kid.pal b/applications/PoP/poc/tools/kid.pal deleted file mode 100644 index 0eeb4322b6326591fc72f2a9c012b92987df728f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmXYlK@Gq_48!~^fPxv2fGn)R*ke-XllE{D2VmsH{9}&9^hm-=)|O=T)orONxE|(y G>25yI2^)C; diff --git a/applications/PoP/poc/tools/kid.raw b/applications/PoP/poc/tools/kid.raw deleted file mode 100644 index 7c51c15..0000000 --- a/applications/PoP/poc/tools/kid.raw +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/applications/PoP/poc/tools/room.pal b/applications/PoP/poc/tools/room.pal deleted file mode 100644 index b965cf3702efa0517f7b7501ef5f603a028f11d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmXYlp$&jA6hxow0M%$T3Q>(ld{s%%=njFdL^n*r7>t1+Dc1z??(Q8x5iQC;N)uD+ rFf*#KsupHdUgc`xoP+V9+%MjHQa+j2L_Y+U7&&sLix*Se2x;d7=%poL diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md deleted file mode 100644 index 449c613..0000000 --- a/applications/PoP/roomtest/BUGS_CLOSED.md +++ /dev/null @@ -1,3744 +0,0 @@ -# roomtest — архив закрытых багов - -Сюда переезжает всё, что **закрыто**: подтверждённые фиксы, снятые -диагнозы, осознанные решения «не делать». Открытые баги — в -[`BUGS_OPEN.md`](BUGS_OPEN.md), текущие задачи — в -[`TASKS_OPEN.md`](TASKS_OPEN.md), закрытые задачи с протоколами — в -[`TASKS_CLOSED.md`](TASKS_CLOSED.md). - -Файл существует не ради истории как таковой: половина записей ниже — это -разбор КОРНЯ (odd-pixel арифметика `char_x`, подстановка тайла нажатой -кнопки, баг кодогенератора SDCC), и он экономит часы, когда похожий симптом -всплывёт снова. Прежде чем заводить новый баг — грепни здесь по симптому. - ---- - - -## CUTSCENE-SKIP-HELD-KEY. Катсцены схлопывались в один кадр (и финал — в чёрный экран) — **ЗАКРЫТ 2026-08-25** - -**Наблюдение (пользователь, 2026-08-24/25).** Сначала: после 14-го уровня -вместо финала чёрный экран. Затем, после первого фикса: во ВСЕХ сценах -(8, 9, 12 и финал) показывается один кадр — и сразу следующий уровень. - -**Корень.** Все сцены проверяют «не просят ли пропустить» через -`kbd_raw_any_down()` на КАЖДОЙ итерации, начиная с первой. А клавиша, -которой закончили уровень, в этот момент ещё зажата: в финальную комнату Кид -ВБЕГАЕТ (стрелка удерживается), дверь уровня проходят на ходу, чит Shift+L -тоже удерживается. Удержание засчитывалось как запрос skip. - -Первый фикс (ждать отпускания перед сценой) проблему только сдвинул: ждать -безусловно нельзя — потерянный break-код вешает игру намертво -([KBD-STUCK-WAIT](BUGS_OPEN.md#kbd-stuck-wait)), — а с таймаутом в секунду -сцена всё равно стартовала при зажатой клавише и гасла на первом же кадре. - -**Правка.** Детектор ФРОНТА (`intro_skip_begin`/`intro_skip_requested`): -пока со старта сцены хоть что-то зажато, skip не взводится; как только всё -отпущено — следующее нажатие сцену прерывает. Применён во всех четырёх -местах: `intro_run`, `pre_princess_animated`, `intro_pv_animated`, `cut_run`. -Ожидание отпускания убрано за ненадобностью. Залипший бит в худшем случае -делает сцену непропускаемой — она доиграет сама, игра не встанет. - -**Проверка.** MAME: переход 7 -> 8 читом (клавиша удерживается) — сцена 8 -отыгрывает целиком, видно сидящую принцессу и мышь; финал (уровень 14, -комната 5) — принцесса поворачивается и обнимает Кида, затем мышь, затем -текст HAIL. - ---- - - -## GATE-SAFE-STEP-SHORT. Перед ОТКРЫТОЙ решёткой осторожный шаг вдвое короче — **ЗАКРЫТ 2026-08-24** - -**Наблюдение (пользователь, 2026-08-24).** Идя слева направо к поднятой -решётке, Кид делает лишний мелкий шаг: чтобы подойти к краю, Shift+вперёд -надо нажать дважды. - -**Корень.** Длину осторожного шага выбирает сам `safe_step` (seg005:0604) по -числу из `get_edge_distance`: последовательности 29..42 — это «шаг ровно на -distance пикселей». А `dist_from_wall_forward` у оригинала ПЕРВОЙ строкой -отвечает −1, если тайл — ворота, сквозь которые можно пройти (seg004:0A18: -`if (tiletype == tiles_4_gate && !can_bump_into_gate()) return -1`); минус -единица уводит разбор дальше, где открытые ворота опознаются обычным полом и -дают `distance = 11`. В нашем порту этой строки не было: расстояние честно -считалось до створки (у ворот `wall_type = 1`, «стена справа»), край -классифицировался как `EDGE_WALL`, и шаг выходил коротким. - -**Правка.** Ветка возвращена в `dist_from_wall_forward` (pop_map.c), -проходимость берётся у нашего `gate_passable` (это и есть -`!can_bump_into_gate`). - -**Проверка.** Хост-набор `tests-host/t_gate.c` (новый): на одном и том же X -открытая решётка обязана давать то же, что чистый пол, а закрытая — остаться -`EDGE_WALL`. Со снятым фиксом набор падает ровно на симптоме: `d = 9`, -`EDGE_WALL` вместо `11`, `EDGE_FLOOR`. - ---- - - -## GATE-SUPERPOSITION. Кид остаётся в тайле опустившейся решётки — **ЗАКРЫТ 2026-08-24** - -**Наблюдение (пользователь, 2026-08-24).** Кид встал в тайл решётки, пока та -была поднята; решётка опустилась — Кид остался внутри. Дальше он «в -суперпозиции»: лицом влево рисуется ЗА решёткой, лицом вправо — ПЕРЕД ней, и -уйти может в обе стороны. То же самое — при попытке проползти под -опускающейся решёткой в присяде. - -**Корень.** В оригинале выталкиванием занимается ОТДЕЛЬНАЯ функция кадровой -цепочки — `check_gate_push` (seg004:0833, зовётся из play_kid_frame, -seg000:1241, между `check_bumped` и `check_action`). В нашем `kid_phys` её -не было вовсе: `check_bumped` ловит только движение В препятствие, а -«препятствие появилось вокруг стоящего» — случай именно `check_gate_push`. - -**Правка.** Порт добавлен в pop_map.c и вставлен в `kid_phys` на своё место. -Условия оригинала сохранены: срабатывает только в позах «стоит на месте» — -разворот (action 7), стойка (кадр 15), присед (кадры 108..110); решётка -ищется в своём тайле И в тайле слева (створка нарисована у правой грани); -перекрытие обязано быть обеими гранями и в этом кадре, и в прошлом; толчок — -5 пикселей влево (решётка своя) либо вправо (решётка левого соседа) + -`bumped_sound`. - ---- - - -## GUARD-DROPPEDOUT-CARRY. Страж идёт в челюсти: `droppedout` пережил границу уровня — **ЗАКРЫТ 2026-08-24** - -**Наблюдение (пользователь, 2026-08-24).** Уровень 4, комната 22: страж без -всякого повода идёт навстречу Киду и гибнет в челюстях; если Кид спустился -рядом ниже и челюсти остановились — страж проходит сквозь них и сваливается к -Киду. Воспроизводилось несколько раз, но ТОЛЬКО когда на 4-й уровень -приходили ногами, через дверь 3-го; при отладочном старте прямо на 4-м -(`make LEVEL=4 ROOM=22`) сцена вела себя правильно — страж стоял, боя не было. - -**Корень.** Единственная ветка, которая двигает стража ВПЕРЁД при -`can_guard_see_kid == 0`, — `guard_follows_kid_down()` (seg002:0806), и гейтит -её флаг `droppedout`: «Кида спихнули из боя вниз — идти ли следом». Флаг -взводит `start_fall` (seg006:1123, у нас pop_map.c), когда персонаж срывается -с уступа В БОЕВОЙ ПОЗЕ (кадры 150..179) — то есть обычная концовка боя со -скелетом на 3-м уровне. В оригинале его гасит `set_start_pos()` -(seg003:028A) при старте КАЖДОГО уровня; в нашем порту (pop_start_level, -roomtest_cold.c) этого сброса не было, и флаг переезжал на следующий уровень. - -Дальше всё сходится: `can_guard_see_kid` считался ПРАВИЛЬНО (в живой сцене -прочитано `1` — чомпер в луче даёт «вижу, но не пойду»), но активная ветка -при 0 уходила не в «попятиться» (`move_down_back`), а в «идти за упавшим -Кидом», а она смотрит только на пол впереди и внизу — чомпер ей не помеха. - -**Правка.** В порт `set_start_pos` возвращены сбросы оригинала: -`pop_droppedout = 0`, `offguard = 0`, `knock = 0` (fall_x/fall_y уже обнуляет -`kid_init`). - -**Проверка.** MAME, сборка `make LEVEL=4 ROOM=22 POS=0`: флаг взведён -отладчиком (`pop_droppedout = 1`), затем меню -> RESTART LEVEL -> флаг снова -0, страж стоит. Само старое поведение вживую НЕ переигрывалось: причина -доказана кодом (в оригинале сброс есть, у нас его не было) и тем, что -единственный путь стража вперёд при `can_guard_see_kid == 0` гейтится этим -флагом. - -**Урок.** Меж-уровневые флаги проверять поимённо по `set_start_pos`: -симптом вылезает НЕ там, где флаг взводится, и не воспроизводится отладочным -стартом с нужного уровня — именно потому, что тот стартует с чистым -состоянием. - ---- - - -## PAL-SKEL-GUARD. Скелет (уровень 3) розовый — палитру набора затирал kid.pal — **ЗАКРЫТ 2026-08-24** - -**Наблюдение (пользователь, 2026-08-24).** Уровень 3, комната 1: поднявшийся -скелет нарисован розово-телесным вместо костяного белого. Кид, фон и факелы — -верные. - -**Корень.** Все пиксели спрайтов скелета — ОДИН индекс 3 его набора -(`SKEL/res751..res778.png`, проверено гистограммой), то есть слот `0x93`. -Палитру набора `pop_guard_load()` заливал ОДИН раз, сразу после атласов, а -дальше по маршруту загрузки уровня шёл `pop_pal_level_load(1)` → -`pop_pal_game_load()` → `gfx_pal_fload("KID\\kid.pal")`. `kid.pal` содержит -ВСЕ 256 записей, включая диапазон стража `0x90..0x9F` с запечённым цветом 2 -(`pop_pack_guard.py`, `COLOR = 2`), — и он затирал палитру скелета. Слот -`0x93` цвета 2 = `(FF,79,79)`, ровно тот розовый, что был на экране. Тот же -механизм ждал Джафара на уровне 13 (`tbl_guard_type == 3`, палитра тоже из -файла набора). - -Обычный страж симптома не давал только по случайности: у него цвет -переставляет `pop_guard_set_palette()` при входе в комнату (enter_guard), то -есть ПОСЛЕ file-load. У скелета и визиря `curr_guard_color == 0` (seg002:186) -— пере-установки нет вовсе. - -**Правка.** `0x90..0x9F` — такой же ДИНАМИЧЕСКИЙ диапазон, как тайлсет и Тень, -и обязан доплачиваться после каждого file-load логической палитры. Добавлен -`pop_guard_pal_apply()` (pop_cdraw.c, банк 4) — пара к `pop_bg_pal_apply` / -`pop_shadow_pal_apply`: набор со своим цветом (скелет/Джафар) берёт палитру из -своей таблицы, обычный страж — последний `curr_guard_color` -(`guard_pal_cur`, его пишет `pop_guard_set_palette`). Зовётся из -`pop_pal_game_load()` и `pop_pal_level_load(0)` ДО snapshot, чтобы правильный -цвет попал и в снимок для fade. `pop_guard_load()` больше не грузит палитру -сам, а зовёт ту же функцию. - -**Проверка.** MAME, сборка `make LEVEL=3 ROOM=1 POS=12`, `pop_leveldoor_open` -взведён отладчиком, чтобы скелет поднялся сразу. Скелет белый; цвет пикселей -на скриншоте `(255,255,242)` — ровно запись 3 `pop_skel_pal`. - ---- - - -## GRAB-BELOW-ROOM. Зацеп за кромку НИЖНЕГО ряда при пролёте вниз не работал вовсе - -**Наблюдение (пользователь, 2026-08-12).** Уровень 7, комната 14: по сценарию -уровня Кид спускается с ряда 0 на ряд 2 через зацеп — виснет на кромке кнопки -`(0,2)`, отпускает и в падении цепляется за кромку `(2,2)`. «Пытался много -раз — Кид летит и не цепляется ни за `(2,2)` комнаты 14, ни за `(1,2)` комнаты -15». При этом вис на `(2,2)` с последующим перелётом на `(1,2)` **работает -стабильно** — то есть сам зацеп в падении жив. - -**Корень.** `do_fall` (порт seg005:0030) не давал ряду персонажа выйти за -нижнюю границу комнаты: - -```c -else if (Char.curr_row < 2) - inc_curr_row(); /* «следующий ряд ВНУТРИ комнаты» */ -``` - -В оригинале `inc_curr_row()` безусловный, и `curr_row` доходит до **3** — ряда -«за нижней кромкой»; `get_tile` для него уходит по `links.down` в комнату снизу -(`find_room_of_tile`, seg006:005D). Ряд 3 нужен не сам по себе, а потому, что -`check_grab` целится в тайл **спереди-сверху**, то есть в ряд `curr_row − 1`: -только при `curr_row == 3` целью становится ряд 2 своей комнаты. - -С залипшим рядом 2 происходило вот что: пока Кид летел вдоль нижнего ряда, -`do_fall` каждый кадр уходил в ветку «достиг `y_land`», где `check_grab` не -вызывается вовсе. К моменту, когда переход в комнату снизу открывал окно -зацепа заново (там цель — «ряд −1», уже реализованный `g_above`), скорость -падения успевала дойти до `fall_y = 33`, а `check_grab` требует `< 32`. Окно -закрывалось **по скорости** — отсюда «летит и не цепляется никак». - -Второй дефект, найденный там же: ветка `action == ACT_MIDAIR` в `check_action` -стояла ПУСТОЙ заглушкой с комментарием «frames 102..105: check_grab — K4». В -оригинале (seg006:0619) это первые четыре кадра падения, где `fall_y` ещё не -разгоняется (`fall_accel` работает только в `ACT_FREEFALL`), — самое широкое -окно зацепа. У нас его не было. - -**Фикс** (`pop_map.c`): `inc_curr_row()` теперь безусловный внутри ветки -`curr_row <= 2` (то есть 2 → 3 разрешён), а сама ветка «достиг `y_land`» -гейтится по `curr_row <= 2` — при ряде 3 ни `in_wall`, ни `land` звать нельзя -(тайлов своей комнаты там нет, `get_tile` отдаёт `WALL`-сентинел; до -`y_land[4] = 244` дело не доходит, `check_leave_below` переводит в комнату -снизу на `y >= 211`). Плюс восстановлена ветка `ACT_MIDAIR` с кадрами 102..105. - -**Подтверждение.** -- Хост-тест `tests-host/t_grab.c` → `grab_below_room_edge_window_exists`: - сцена комнаты 14 + переход в 15 по `pop_fell_out` (как в главном цикле). - Карта исходов по фазе X и задержке Shift **до** фикса — сплошные точки (ни - одного зацепа), **после** — окно из 8 фаз X при задержках 0..5 кадров. - Тест проверяет и играбельность: зацеп обязан удаваться при самом - естественном вводе (отпустил вис и сразу зажал Shift). -- Живьём в MAME (мост, 2026-08-12): Кид повис на кромке `(2,2)` — в памяти - `frame=91 y=55 row=0 room=15 act=6`, на экране держится за правый край плиты. - -**Грабли теста, стоившие часа.** Первая версия сцены засчитывала как успех -ЛЮБОЙ вис — а Кид на первых кадрах падения цепляется обратно за ту же верхнюю -кромку, и тест проходил даже на сломанном коде. Признак цели пришлось делать -позиционным (`went_below` + `curr_row == 0` после перехода). Вторая ловушка: -кадры спуска `seq_68` идут с `action == 3`, то есть «дождаться падения» по -одному лишь `action` нельзя — ждать надо ВИСА, и только потом отпускать Shift. - ---- - - -## BUG-CHEAT-FIGHT-1. Чит `+`/`−` в бою: Кид остаётся в режиме боя и теряет управление - -**Наблюдение (пользователь, 2026-08-07).** Если нажать `+`/`−` (ROOMNAV, -переход по комнатам) в момент, когда Кид вытащил меч для битвы, — в новой -комнате Кид не управляется: нажатия стрелок игнорируются. - -**Корень (прочитан по коду, сверен с seg005).** Чит ROOMNAV -(`roomtest.c:576`) телепортирует и сбрасывает позу и HP — -`enter_room()`, `kid_init(SEQ_STAND, …)`, `pop_kid_hp_reset()`, — но **не -трогает состояние боя**: `Kid.sword` остаётся `SWORD_2_DRAWN`. Диспетчер -`pop_control` (`pop_ctrl.c:578`) при вынутом мече уходит в -`control_with_sword`, а там единственный выход из режима боя — - -```c -if (Char.frame == FRAME_171_STAND_WITH_SWORD) { /* seg005:987 */ - Char.sword = SWORD_0_SHEATHED; - seqtbl_offset_char(SEQ_92_PUT_SWORD_AWAY); -} -``` - -Стража в новой комнате нет (`can_guard_see_kid` = 0), кадр после -`kid_init(SEQ_STAND)` — обычная стойка, а не 171, поэтому не срабатывает ни -`swordfight()`, ни ветка «убрать меч»: `control_with_sword` каждый кадр -не делает НИЧЕГО, и ввод не доходит до движения. Заклинивание вечное. - -Это баг **нашего чита**, а не порта: в оригинале телепорта между комнатами -нет, и в режим боя без соперника попасть нечем. - -**Как чинить.** В ветке ROOMNAV телепорт трактовать как выход из боя (то же -самое, что делает `pop_start_level`): `Kid.sword = SWORD_0_SHEATHED`, -`holding_sword = 0`, сбросить `offguard`/`guard_refrac` и состояние стража -(`pop_guard_reset()` вызывается по входу в комнату — проверить, что он -обнуляет `Opp`). Меч в инвентаре (`pop_have_sword`) при этом НЕ терять. -Второй кандидат на ту же болезнь — чит `K` (убить стража) в момент, когда -Кид в стойке с мечом, но не в кадре 171: там оригинал сам доводит до 171 -через `swordfight`, так что проверить сценарием, а не менять вслепую. - -**ЗАКРЫТ 2026-08-10.** Сделано ровно по плану выше: ветка ROOMNAV после -`kid_init`/`pop_kid_hp_reset` гасит состояние схватки — -`Kid.sword = SWORD_0_SHEATHED`, `holding_sword = 0`, `offguard = 0`, -`guard_refrac = 0`. Меч в инвентаре (`pop_have_sword`) не теряется, только -режим боя. - - - -## BUG-LOOSE-BUTTON-1. Упавшая плита не нажимает кнопку — **ЗАКРЫТ 2026-08-10** - -**Симптом (пользователь, уровень 4).** Плита `16(1,1)` падает вниз, в комнате -17 ничего не меняется: кнопка цела, щебня нет, ворота не открылись. - -**Корень — три слоя.** - -1. Порт `loose_land` (seg007:11E8) у нас вообще не звал `trigger_button`: и в - своей комнате (`pop_map.c`), и в комнате снизу (`roomtest.c`) он только - клал щебень. -2. `pop_room_col_landing` (pop_level.c) считала площадкой **только чистый - пол** (`t == 1`). У оригинала площадок семь — `tiles_1_floor`, - `tiles_2_spike`, `tiles_6_closer`, `tiles_10_potion`, `tiles_15_opener`, - `tiles_19_torch`, `tiles_30_torch_with_debris`; на всём прочем кусок просто - исчезает. Кнопка в набор не входила, поэтому плита растворялась. -3. Сигнал `pop_loose_fell` взводится в момент ОТРЫВА плиты, а по нему главный - цикл и щебень клал, и кнопку жал — ворота начинали открываться, пока плита - ещё в воздухе. - -**Механика оригинала (важно, интуиция обманывает).** Плита не «постоянно -давит» на кнопку. Нажатие ОДНО, но с `button_type = tiles_14_debris`, а это у -`trigger_gate` отдельная ветка: возврат 2 → `animate_door` доводит створку и -ставит `curr_modifier = 0xFF` → ворота заморожены открытыми навсегда, обычный -opener их больше не трогает (`if (modifier == 0xFF) return -1`). Сама кнопка -съедается: тайл становится щебнем. На closer — быстрое закрытие и тоже -щебень. На факеле остаётся отдельный тайл `tiles_30_torch_with_debris`. - -**Фикс.** Набор площадок расширен до оригинального; `pop_trigger_button` -зовётся в обоих местах с правильным `button_type`; посадка в комнате снизу -переехала с `pop_loose_fell` на новый сигнал `pop_loose_exit`, который -`mob_tick_one` взводит, когда кусок ушёл ниже поля комнаты. - -**Осознанное расхождение.** Оригинал через `mob_down_a_row` продолжает -симуляцию куска уже в нижней комнате; у нас он там не летит, а садится сразу. -Задержка получается «высота комнаты», а не «высота комнаты плюс путь до пола -внизу». - ---- - - -## BUG-GATE-FF-1. Ворота, открытые навсегда, нарисованы открытыми, но непроходимы — **ЗАКРЫТ 2026-08-10** - -**Симптом.** После BUG-LOOSE-BUTTON-1 ворота `23(0,9)` рисуются поднятыми, но -Кид в них упирается. - -**Корень — перегруженное значение.** `gate_modif` (pop_map.c) отдаёт `0xFF` -как сторожевое «тайла нет за краем уровня», а `trigger_gate` ставит тот же -`0xFF` как живой модификатор «открыто НАСОВСЕМ». В `gate_passable` стояло -`if (gm == 0xFF) return 0;`. До сегодняшнего дня значение в игре не -возникало — ветку по щебню никто не запускал. - -**Фикс.** Ветка убрана: она мёртвая (нас зовут только когда тайл ТОЧНО -ворота), а `(0xFF >> 2) + 6 = 69` и так больше любого `fph`. Остальные -читатели `gate_modif` трактуют 63 как «открыто» и правок не потребовали. - ---- - - -## BUG-TORCH-CHOMP-1. Чомпер стирает пламя соседнего факела — **ЗАКРЫТ 2026-08-10** - -**Симптом (пользователь).** Комната 23 уровня 4: факел есть, огня нет. - -**Корень.** Пламя рисуется в ячейке ПРАВОГО соседа (`x = COL_XH[col+1]*8 + 8` -= 232..248, `y` 33..50), то есть в тайле чомпера (0,7). `pop_chomp_redraw` -начинается с `pop_heal_off(224, 2, 32, 64)` — восстанавливает запечённый фон в -`x 224..255, y 30..93`. Пламя в фон не запекалось и рисовалось в -`GFX_BANK_SPRITE`, поэтому heal его съедал; вдобавок `pop_redraw_needed` идёт -ПОСЛЕ `pop_process_trobs`, так что стиралось только что нарисованное. - -**Тупик, в который я сначала свернул.** Вынес отрисовку пламени в отдельный -проход после `pop_redraw_needed` — стало хуже: пламя легло ПОВЕРХ челюстей -(правильный z-порядок существует только внутри общего обхода тайлов, где -`draw_tile_anim_right` идёт до `draw_tile_anim`), плюс проход индексировал -`trob_code[i]` параллельно `trobs[i]`, а `pop_process_trobs` в конце уплотняет -массив — индексы разъезжались, и чужой trob рисовался как факел (пламя из -головы Кида). Проход откачен. - -**Фикс (подсказан пользователем).** Пламя ЗАПЕКАЕТСЯ: `pop_torch_draw` пишет -в `GFX_BANK_NORMAL` (видео-ОЗУ + ОЗУ-копия). Это безопасно именно у факела — -все девять кадров лежат на общем канвасе 16×18 и упакованы `opaque=True`, то -есть кадр полностью накрывает предыдущий, протухнуть в копии нечему; и факел -всегда задний план. Тогда heal чомпера возвращает огонь сам, а челюсти -ложатся поверх — тот же z-порядок, что в оригинале, и без лишнего прохода. - -Пузырёк ЗЕЛЬЯ так нельзя: он ползёт вверх, себя не накрывает и требует heal — -`pop_potion_draw` остаётся в `GFX_BANK_SPRITE`. Столкнуться с чомпером в -одном тайле зелье не может. - - - -## BUG-GUARD-IX-1. «Зависание» при бое со стражем — затёртый IX главного цикла — **ЗАКРЫТ 2026-08-10** - -**Симптом (пользователь, уровень 4).** Дважды подряд при ручном входе в -комнату 18 со стражем игра «повисала»: картинка стоит, управление не -отвечает. Нажатие «2» ненадолго возвращало движение, потом всё повторялось. - -**Диагноз — НЕ зависание.** Главный цикл всё это время крутился (маркер -верха цикла тикал раз в кадр). Стоял отладочный стоп-кадр: локаль `frozen` -в `main` сама собой становилась ненулевой. - -**Корень — однобайтовый выход за границу локального массива.** У `main` все -локали лежат по `IX-1..IX-19`, и IX затирался: вместо `0xBFFA` в нём -оказывался `0xBF00`. Признак железный — в теле цикла обязано выполняться -`SP == IX-19`, а по факту было `SP=0xBFE7, IX=0xBF00`. Дальше `main` читал -`frozen`, `dbuf`, `front/back`, `dead_frames` и edge-флаги читов из живого -стекового мусора. - -Виновник — `check_chomped_guard` (pop_map.c): - -```c -uint8_t flags[COLL_N]; /* 14 байт в кадре функции */ -calc_coll_window(); /* окно СТРАЖА -> win_lo/win_hi */ -get_row_collision_data(Char.curr_row, flags); -``` - -`coll_row()` пишет по `flags + scan_off`, а число байт берёт из -`win_lo/win_hi`. `scan_off`/`scan_left0` выставляет `coll_scan_prepare()`, -которую звал ТОЛЬКО `check_collisions` — путь Кида. То есть ряд стража -писался **по смещению Кида, длиной стража**. Диапазон записи -`[kid_win_lo+2 … kid_win_lo+2 + ширина_окна_стража − 1]`; при обычной ширине -4 он уезжает за `flags[13]`, когда `kid_win_lo > 8` — то есть **когда Кид -стоит у правого края комнаты** (взаимное расположение Кида и стража ни при -чём, стража даёт только длину). Сразу за массивом лежит сохранённый IX; -затёртый младший байт и превращал `0xBFFA` в `0xBF00`. - -Перелёт в отрицательные индексы был невозможен: `scan_off = kid_win_lo + 2`, -а `kid_win_lo >= COLL_C0 = −2` из-за клампа в `calc_coll_window`. - -**Почему не ловилось раньше.** На уровне 1 (комната 3) бой идёт левее -середины — запись оставалась внутри массива. Ничего не портилось, но флаги -стража всё равно читались по чужим смещениям и с иксами Кида: тихо неверные -данные, без последствий (чомперов там нет). - -**Фикс.** `coll_scan_prepare()` в начале `get_row_collision_data()` — теперь -запись всегда ложится в `[win_lo+2 … win_hi+2]`, а `calc_coll_window` клампит -окно в `[−2 … 11]`, то есть индексы гарантированно `0…13`. Заодно чинится -сам расчёт: `scan_left0` задаёт x колонок, и чомпер-коллизия стража считалась -по координатам Кида. - -**Как ловилось (приём на будущее).** Детекторы `ix != 0xBFFA` на границах -фаз `PROF()` с починкой IX в верху цикла: игра остаётся живой, а первый -сработавший детектор называет фазу. Дальше — инструкционная трасса MAME -(`trace file,0`), включаемая на подозрительном вызове и выключаемая сразу -после, со стопом только на плохом кадре: в файле остаётся ровно тот вызов, -где IX испортился. В хвосте трассы видно `ld sp,ix / pop ix`, достающий -`BF00` вместо `BFFA`. См. memory `z80_profiling_method`. - -**Проверка.** Бой со стражем в комнате 18 уровня 4 (пользователь) — -детекторы IX висели без починки и не сработали ни разу; `make -C tests-host` -— все 5 наборов. - ---- - - -## BUG-GATE-SEAM-ROW1. Решётка в шве не анимируется, если ворота НЕ в ряду 0 — **ЗАКРЫТ 2026-08-10** - -**Симптом (пользователь, уровень 4, стартовая комната).** Плита нажимается, -ворота физически открываются (Кид проходит), но визуально с решёткой ничего -не происходит. Отдельно: чёрный треугольник над воротами (верх решётки под -ковром) статичен, тогда как в оригинале он ездит вместе с барами. - -**Корень.** Зонд на `pop_add_trob` показал `room=8 tp=19 type=1`: плита -комнаты 1 открывает ворота **комнаты 8 в (1,9)** — соседней комнаты, видимые -через ЛЕВЫЙ шов (бары ворот в col9 рисует col0 соседа справа). Наш -change-driven редрой шва смотрел только один байт `m[9]` (ряд 0), а -`pop_room_redraw_seam_left()` перерисовывал жёстко `draw_tile(0, 0)`. -Изменение приходило в `m[19]` — сигнатура его не видела. - -На уровне 1 та же связка комнат 6/8 работала только потому, что решётка -соседа стояла в **(0,9)**. Тайлсет ни при чём: в подземелье просто не -попадалось ворот в ряду 1 у шва (и треугольника не было — над решётками -всегда потолок). - -**Фикс.** -1. `seam_sig` — массив на три ряда, сравниваются все три; накопленная маска - изменившихся рядов живёт в `seam_rows` и переживает оба кадра - дабл-буфера. -2. `pop_room_redraw_seam_left(uint8_t rows)` берёт маску и перерисовывает - только помеченные ряды — не все три, чтобы не платить каждый кадр - анимации. -3. В маску добавляется ряд ВЫШЕ (`changed | (changed >> 1)`): верх решётки - (`draw_tile_anim_topright`, seg008:0568 — маска 68 + кадр - `DOOR_FRAM_TOP`) рисует не сам тайл ворот, а тайл над-справа от него, у - нас `(r−1, 0)`. Без этого бары ездили, а треугольник над ними стоял. - -**Проверка.** Уровень 4, стартовая комната: нажатие плиты — решётка шва -поднимается/опускается вместе с верхом (пользователь). - - - -## BUG-GUARD-COLOR-1. Страж и его полоса HP — всегда одного цвета — **ЗАКРЫТ 2026-08-07** - -**Симптом (пользователь, прогон уровня 2).** Комната 4: страж не того цвета, -что в SDLPoP, и полоса его HP тоже. - -**Корень.** Оригинал держит ОДИН набор спрайтов стража и подменяет 16 цветов -палитры: `redraw_screen` (seg003:255) зовёт `set_chtab_palette(chtab_5_guard, -&guard_palettes[0x30*curr_guard_color − 0x30], 16)` ПЕРЕД отрисовкой комнаты, -где `curr_guard_color = level.guards_color[room−1] & 0x0F` (enter_guard, -seg002:184), а `guard_palettes` — ресурс 10 из `PRINCE.DAT` (7 палитр × 16 -цветов, 6-битные каналы). У нас `pop_pack_guard.py` брал `COLOR = 2` -константой (цвет стражей уровня 1) и запекал одну палитру в слоты -`0x90..0x9F`. Полоса HP рисуется тем же атласом — отдельного бага не было. - -**Фикс.** -1. `pop_pack_guard.py` выгружает ВСЕ 7 палитр в `pop_guard_pal.h` - (7 × 16 × 4 = 448 Б, записи `B,G,R,0` — формат `gfx_pal_load`); - каналы масштабируются `scale6to8`, как в `pop_pack_kid` для `kid.pal`. -2. `pop_guard_set_palette(color)` (`pop_gdraw.c`) заливает 16 слотов в ОБЕ - палитры дабл-буфера; `color == 0` — не трогать (так и оригинал). -3. Зовётся из `pop_guard_enter` сразу после чтения данных комнаты, то есть - ДО отрисовки — как `redraw_screen`. `pop_level_guard` цвет отдавал уже - давно, его просто никто не использовал. - -**Грабли, стоившие итерации (записать на будущее).** Первая версия передавала -`gfx_pal_load` указатель прямо на таблицу — а таблица лежит в rodata -БАНКОВОГО модуля, то есть по 0xC000+. `gfx_pal_load` отдаёт указатель в BIOS -(`$A4` через `rst #0x08`), а BIOS читает только `#4000-#BFFF` (корневой -CLAUDE.md). BIOS забирал мусор с чужой страницы, палитра уезжала в тёмное и -страж становился НЕВИДИМЫМ. Лечится копией записи в локальный буфер — стек -гарантированно в W2. - -**Проверено в MAME (уровень 2, ROOMNAV):** - -| комната | цвет из уровня | что на экране | -|---------|----------------|---------------| -| 11 | 1 | страж сине-фиолетовый, полоса HP синяя | -| 7 | 3 | страж оранжевый, полоса HP оранжевая | -| ур. 1 | 2 | охра, как было (регрессии нет) | - -Цвета сходятся с таблицей `pop_guard_pal.h`: цвет 1 = (72,145,255), -цвет 3 = (255,80,0), цвет 2 = (170,48,0). - -**Смежное, НЕ входит сюда:** палитра КЛАДКИ уровня 3 (в оригинале зелёная) — -другой механизм и другой ресурс, заведена отдельной задачей -[L3-COLOR](TASKS_OPEN.md#l3-color). - ---- - - -## BUG-SWORD-GHOST-1. Переход комнаты В БОЮ: Кид прячет меч и дерётся пустой рукой — **ЗАКРЫТ 2026-08-07** - -**Проверено в игре (пользователь):** «вроде проблема не воспроизводится — -всё корректно». Замер на замороженном кадре: оба персонажа в комнате 2, -ряд 1, колонки 4 и 7, `Kid.sword = 2`, `Guard.sword = 2`, луч видимости -прошёл, счётчик уборок меча за прогон — **0**. - -**Симптом.** Кида вытеснили из комнаты 3 в комнату 2 в бою, он спрятал -меч; страж вошёл следом, и дальше Кид «отбивался» без клинка. Зависимость -от расстояния между Кидом и стражем в момент перехода: близко — бой -продолжался нормально, далеко — меч убирался и страж не шёл, а в -промежутке страж приходил, но меч оставался в ножнах. - -**Корень — мнимая стена за краем комнаты, а не боёвка.** Ложным было -`can_guard_see_kid`. Луч видимости (`check_can_guard_see_kid`, seg003:688) -идёт по тайлам между колонками Кида и стража, а колонка считается из `x`: -`floor((x − 7 − 58) / 14)`. На всём диапазоне `x` 0..255 это даёт `col` -от **−5 до 13**, то есть колонка регулярно уходит ЗА комнату. Оригинал -такие колонки резолвит через `find_room_of_tile` (seg006:005D), гуляя по -`roomlinks` на любую глубину; наш `get_tile` знал соседей только на две -колонки (`−2..11`), а дальше отдавал `TILE_WALL`. Луч упирался в эту -мнимую стену, `can_guard_see_kid` падал в 0 — и `control_with_sword` -(ветка «противника не видно») штатно убирал меч. - -Тот же ноль не давал достать меч обратно: `control_standing` зовёт -`draw_sword` только при `can_guard_see_kid >= 2`. Отсюда и «драка без -меча», и зависимость от расстояния — на самом деле не от расстояния, а от -того, вышла ли колонка за кэш. - -**Артефакт (регистратор в памяти, снят с живой сцены).** Брейкпоинт тут -бесполезен — баг ловится руками и редко, поэтому в код были временно -вшиты байты «кто убрал меч и почему оборвался луч»; читались после сцены: - -``` -src = 2 control_with_sword, ветка «противника не видно» -why = 2 луч упёрся в стену -tile = 0x14 = 20 = TILE_WALL -col = 12 ← колонка стража ЗА кэшем (было −2..11) -kid_col = 8 guard_col = 12 -``` - -**Фикс.** `pop_map` кэширует `fg` соседних комнат слева и справа ЦЕЛИКОМ -(по 30 байт, раскладка комнаты) и резолвит `col` от −10 до 19 в реальный -тайл соседа; за этими пределами — по-прежнему стена (у оригинала там -следующий `roomlink`, у нас край кэша). Данные забирает сама -`pop_map_set_edges(left, right, up, down)`, читая уровень — отдельной -копии в приложении нет. Заодно `gate_modif` перестал читать за границу -массива модификаторов: openness ворот на дальних колонках берётся из -`room_modif` СОСЕДА (`pop_gate_modif`, им же пользуется луч). - -Цена: **+48 байт** в W2 (кэш 6+6 → 30+30), код W1 даже уменьшился. -Комнаты сверху/снизу оставлены как были (`above_fg` / `below_fg`): по -вертикали `curr_row` за −1..3 не выходит, мнимых стен там не возникает. - -Попутно вернули строку оригинала, потерянную при порте: `control_with_sword` -сбрасывает `holding_sword` для живого Кида (seg005:980) — от неё зависит -индикатор HP стража. - -**Регресс:** `tests-host` — все 5 наборов зелёные, характеризационные -трассы Кида не сдвинулись (`[phys] ok: 1723`). Новый набор проверок -`char_tiles_resolve_across_rooms` в `t_char` держит резолв колонок -−11..20 в тайлы соседей и стену на краю кэша — чтобы кэш нельзя было -молча сузить обратно. - -**Почему в SDLPoP не воспроизводилось** (пользователь пробовал): там этой -границы просто нет — `find_room_of_tile` уходит по `roomlinks` сколько -нужно, и луч никогда не встречает мнимой стены. - ---- - -## BUG-GRAB-1. Прыжок с места через провал в 3 тайла: зацепа нет — **ЗАКРЫТ 2026-08-05** - -**Проверено в игре (пользователь):** «зацеп работает». Физика была верна с -самого начала, чинить пришлось клавиатуру — [BUG-KBD-5](#bug-kbd-5). - -> **Итог 2026-08-05.** Физика тут ни при чём — виновата клавиатура. -> Зажатый Shift снимался автоповтором зажатой стрелки, поэтому к кадрам -> 102…106 (окно зацепа) движок видел Shift отпущенным. Полный разбор и -> фикс — [BUG-KBD-5](BUGS_CLOSED.md#bug-kbd-5); поведение Shift в MAME -> проверено замером карты `_kbdraw_down`. Осталось подтвердить сам зацеп -> живой игрой; версии 2 и 3 ниже проверять только если он всё ещё не выйдет. - - -**Симптом.** Уровень 2, комната 9. Перепрыгнув на (1,1), Кид должен -вернуться обратно: разбегаться негде, поэтому он встаёт на самый край -плиты, прыгает с места и **цепляется руками за (1,5)**, после чего -подтягивается. У нас Кид с зажатым Shift всё равно срывается. - -**Что уже точно известно (и не надо перепроверять).** - -1. **Физика прыжка у нас совпадает с оригиналом кадр в кадр.** Сверено по - логу SDLPoP против трассы харнесса при одинаковом старте `x=95`: - - ``` - кадр 16 18 22 23 24 25 102 103 104 105 - SDLPoP 95 97 105 112 121 126 128 130 131 133 - наш 95 97 105 112 121 126 128 130 131 133 - ``` - Совпадает и по `y`, и по колонке/ряду, и по приземлению на 107–108. - -2. **В оригинале зацеп срабатывает на кадре 106, а не 102..105.** - `check_grab` зовётся из ДВУХ мест: ветка «в воздухе» в `check_action` - (кадры 102..105) и `do_fall` (seg005) для `actions_4_in_freefall`. - Успешная попытка из лога: - - ``` - GRAB try f=106 x=135 y=166 col=4 row=2 fall_y=18 - GRAB probe x=127 col=4 through=0 front_above=3 modif=0 - GRAB can_grab=1 - GRAB OK dist=9 - -> f=91 x=136 y=181 col=5 row=2 act=2 (повис) - ``` - Наш `do_fall` (`pop_map.c`) `check_grab()` из этой ветки тоже зовёт — - то есть структура на месте, расходится что-то внутри. - -3. **По харнессу зацеп у нас РАБОТАЕТ**: окно стартовых `x = 91…95`, и - короткий шаг ставит Кида ровно туда (91 после первого нажатия, 95 после - второго). Зафиксировано тестом `t_grab`. - -**Отсюда главный вопрос был: почему харнесс говорит «работает», а живая -машина — «нет».** Расхождение между ними и оказалось уликой; версии -выдвигались по убыванию правдоподобия, и сработала первая: - -- **Shift не доезжает до движка — ПОДТВЕРЖДЕНО, это и была причина.** - Харнесс подменяет клавиатуру и потому этот путь не проверяет вовсе, а у - нас есть история проблем ровно с «Shift + стрелки» (KBD-1, BUG-KBD-3/4). - Замер в MAME: при зажатом Shift и зажатой стрелке бит `LSh` в - `_kbdraw_down` стоял в нуле. Разбор — [BUG-KBD-5](BUGS_CLOSED.md#bug-kbd-5). -- **Сцена харнесса не равна комнате 9.** Там изолированная комната - (соседи — стена), а в игре слева комната 8; кромки шва участвуют в - `get_tile`. Проверять чтением `Kid.x` в момент прыжка: попал ли он в - окно 91…95 вообще. -- **Расхождение в `check_grab`.** Наш вариант зовёт `determine_col()` - там, где оригинал зовёт `load_fram_det_col()` (перезагрузка кадра + - колонка). Для Кида это обычно одно и то же (`cur_frame` в фазе физики - принадлежит ему), но проверить стоит. - -**Инструменты готовы.** В SDLPoP включена отладка (пометка `DBG-GRAB`): -`JMP` — покадровая трасса прыжка/падения/виса, `GRAB try|probe|fail|OK` — -вход в `check_grab` и причина отказа. Снимается поиском по `DBG-GRAB`. - -**Найдено попутно, отдельным наблюдением.** После касания площадки на -кадрах 107–108 (x=140) оба движка снова падают, но X расходится: SDLPoP -уводит Кида на 134 (колонка 4), мы — на 141 (колонка 5). Похоже на разную -отработку `in_wall()` у стены (2,7). На зацеп не влияет. - ---- - ---- - -## BUG-GATEMOD-1. Ворота стартуют закрытыми, хотя в уровне открыты — **ЗАКРЫТ 2026-08-05** - -**Проверено в игре (пользователь).** - -**Симптом (пользователь, 2026-08-04).** Уровень 2, комната 13: решётка -между (2,5) и (2,6) обязана быть ОТКРЫТА в начале и захлопнуться, когда Кид -нажмёт кнопку (2,4) — после этого назад дороги нет. У нас она закрыта -сразу, кнопка бессмысленна, проход не работает. - -**Корень.** Модификатор тайла в ФАЙЛЕ уровня и модификатор в РАНТАЙМЕ — -разные величины; оригинал переводит их при загрузке в `load_alter_mod` -(seg008:198E), которую зовёт `alter_mods_allrm` из `load_level`: - -```c -case tiles_4_gate: *modif = (*modif == 1) ? 188 : 0; break; -case tiles_11_loose:*modif = 0; break; -case tiles_10_potion:*modif <<= 3; break; -``` - -Наш `pop_trob_modif` портировал из неё **только зелье**. Для ворот -`bg = 1` — это «открыты» (Table 8 спецификации DAT), а в рантайме открытость -измеряется высотой подъёма 0..188; мы клали в рантайм-модификатор сырую -единицу, то есть «закрыты на 1/188». - -**Фикс.** Ветки ворот и loose дописаны в ленивую инициализацию -`pop_trob_modif` (`pop_trob.c`). Ветка СТЕН не портируется намеренно: у нас -`pop_bg` считает связи кладки по типам соседей прямо при отрисовке -(`wall_modifier`), сохранённый модификатор стены не читается. - -**Что это ещё задевает.** Решётка (0,9) комнаты 5 уровня 1 тоже имеет -`bg = 1`, то есть обязана стартовать открытой — Кид сваливается в комнату 1 -именно через неё, и она захлопывается у него за спиной. Закрывает её -стартовый триггер `do_startpos` (seg003:167): для уровней с -`tbl_entry_pose == 1` оригинал ВИРТУАЛЬНО ЖМЁТ кнопку комнаты 5 (0,2) — - -```c -// Special event: press button + falling entry -get_tile(5, 2, 0); trigger_button(0, 0, -1); seqtbl_offset_char(seq_7_fall); -``` - -Замер в SDLPoP (лог по кадрам): `gate(5,0,9)` идёт `188 → 148 → 88 → 8 → 0`, -шаги 40/60/80 — это `gate_close_speeds`, то есть быстрое закрытие -(`trigger_gate` вернул тип 3). У нас этот триггер портирован, и закрытие -работает. - -Полный список ворот с `bg = 1`: ур. 1 комн. 5 (0,9); ур. 2 комн. 13 (1,5). -Остальные ворота уровней 1–3 имеют `bg = 2` → 0, и для них ничего не -меняется (при модификаторе 2 и 0 и отрисовка, и `can_bump_into_gate` дают -одно и то же). - -**Побочная находка: чит обхода комнат отматывал мир.** После фикса -пользователь увидел «ворота снова открылись», пройдя `+` в комнату 2 и `-` -обратно. Причина не в воротах: `ROOMNAV` звал `pop_trob_reset()` перед -`enter_room`, тот обнулял `room_seen[]`, и `pop_trob_modif()` перечитывал -модификаторы из уровня заново — то есть чит откатывал открытые/закрытые -ворота, выдвинутые пики и нажатые кнопки. Пока ворота с `bg=1` ошибочно -стартовали закрытыми, откат был не виден. `pop_trob_reset()` из навигации -убран: она обязана только телепортировать, исходное состояние даёт -перезапуск уровня. Замер, который это показал: `room_modif` комнаты 5 -после `+`/`-` = `00 00 0B 00 09 00 08 01 00 BC` — последний байт 0xBC = 188, -файловое значение. - ---- - ---- - -## BUG-GUARD-DEAF-1. Страж не оборачивался на вернувшегося Кида — **ЗАКРЫТ 2026-08-05** - -**Наблюдение (пользователь, 2026-08-05).** Уровень 2, комната 11, идёт бой -со стражем. Страж **выталкивает Кида в правую комнату 22**. Кид заходит -обратно в комнату 11 — страж стоит на (1,1), **повёрнут налево и Кида не -видит**. Предположение пользователя: это часть большой задачи «полностью -переделать поведение стража по образцу Кида». - -**Диагноз: большая переделка тут ни при чём, корень маленький и точный.** -Само возвращение стража в исходную позу — ПРАВИЛЬНОЕ поведение, порт верен; -не хватает ровно одного сигнала. - -Разбор по SDLPoP: - -1. **Выход Кида из комнаты «усыпляет» стража — так и в оригинале.** - `leave_guard` (seg002:02F5) складывает стража обратно в данные уровня - (тайл, `x`, **направление**, skill, HP), а `enter_guard` (seg002:0112) - при возврате поднимает живого стража **с УБРАННЫМ мечом** - (`sword_0_sheathed` + `seq_77_guard_stand_inactive`) и обнуляет - `is_guard_notice`/`guard_refrac`. То есть страж после возврата ВСЕГДА - неактивен и смотрит в запомненную сторону — у нас так же - (`pop_guard_enter`, `pop_guard.c:127`). -2. **Дальше решает `autocontrol_guard_inactive` (seg002:0876), и он Кида за - спиной ИГНОРИРУЕТ.** Кид вернулся справа, страж смотрит влево → - `char_opp_dist()` отрицательна → ветка `else if (distance < 0) return;`. - Единственный выход из неё — флаг **`is_guard_notice`**: «Кид нашумел». - При нём страж оборачивается (`move_4_down`). Направление в - `check_can_guard_see_kid` НЕ участвует вовсе, так что «не видит» — это - не про луч видимости, а именно про этот флаг. -3. **У нас `is_guard_notice` не взводится НИГДЕ.** `grep` по всем исходникам - roomtest: объявление (`pop_guard.c:20`), сброс (`pop_guard.c:47`) и одно - чтение (`guards.c:171`). Присваивания `= 1` нет ни одного — флаг мёртв, - поэтому неактивный страж не обернётся НИКОГДА, что бы Кид ни делал. - -**Где его взводит оригинал** (это и есть объём фикса): - -| место | событие | -|-------|---------| -| `seg006:633..641` — `play_seq`, опкод SOUND | звук `SND_SILENT`(0), `SND_FOOTSTEP`(1), `SND_BUMP`(2). `SND_DRINK`(3)/`SND_LEVEL`(4) — НЕ шум. Главный источник: шаги бега/приземления | -| `seg004:05F1` `bumped_sound` | удар в стену | -| `seg005:185,195` | мягкое и среднее приземление (**только `charid_0_kid`**) | -| `seg006:1294`, `seg006:1734` | Кид обрушил loose-плиту (зацепом и наступив) | -| `seg007:766` | нажата кнопка | - -У нас опкод SOUND в `play_seq` (`pop_kid.c:426`) просто съедает байт -аргумента — звука нет, и флаг вместе с ним потерялся. Именно эта строка — -90 % фикса: `SND_SILENT` называется «silent» потому, что звука не издаёт, -**но стражи его всё равно замечают**, и в `seqtbl` он стоит, например, в -`ready` (доставание меча). - -**Ожидаемое поведение после фикса.** Кид возвращается в комнату 11 бегом → -первый же `SND_FOOTSTEP` взводит флаг → страж оборачивается и достаёт меч. -Стоя на месте, Кид может подкрасться к стражу со спины — это НЕ баг, а -механика оригинала. - -**Оговорка (не проверено вживую).** Разбор построен на том, что страж после -возврата неактивен (меч убран, кадр 166). Это следует из кода -`pop_guard_enter`, но в MAME не снималось; если окажется, что меч у него -ОБНАЖЁН, то работает другая ветка (`autocontrol_guard_active`, где -`can_guard_see_kid == 2` направления не спрашивает) — и тогда корень другой. -Снять при фиксе: `Guard.sword`, `Guard.frame`, `can_guard_see_kid` сразу -после входа в комнату. - -**Фикс (2026-08-05): все пять мест портированы.** Опкод SOUND в `play_seq` -(`pop_kid.c`) взводит флаг для звуков 0..2; `bumped_fall`/`bumped_floor`, -мягкое и среднее приземление, обрушенная плита (все три пути `check_press`) -— в `pop_map.c`; щелчок кнопки — в `pop_trob.c`. Заглушка `is_guard_notice` -добавлена в `tests-host/stubs.c` (автопилота стража в наборах нет). - -**Проверено в игре (пользователь, 2026-08-05):** тот же сценарий — страж -выталкивает Кида в комнату 22, Кид возвращается бегом — **страж -оборачивается**. - -**Что осталось «как в оригинале» и багом не является:** подкрасться к -стражу СТОЯ по-прежнему можно (шумит движение, а не присутствие), и после -возврата в комнату страж всегда поднимается с УБРАННЫМ мечом в неактивной -стойке, повёрнутый туда же, куда смотрел при выходе Кида — это `enter_guard` -(seg002:0112), а не потеря состояния. - ---- - ---- - -## BUG-JUMPWALL-1. Недолетевший прыжок проходил СКВОЗЬ стену — **ЗАКРЫТ 2026-08-05** - -**Симптом (пользователь, приёмка уровня 3).** Комната 14: Кид на (0,8) -лицом влево, прыжок с места — пролетает сквозь кладку и падает в комнату 13 -на (2,3). Обобщение пользователя (оно и оказалось верным): «если Кид -прыгает, недолетает и должен врезаться в стену и упасть ВДОЛЬ неё, у нас он -летит по свободной траектории, как будто ему никто не мешает». - -**Корень — упрощение в `check_collisions`, про которое там же стояла -оговорка.** Оригинал (seg004:0004) каждый кадр считает флаги перекрытия для -ТРЁХ рядов (`curr`/`above`/`below`), а `move_coll_to_prev` (seg004:00DF) в -начале следующего кадра выбирает из них тот, что соответствует ряду прошлого -кадра. Так «прошлые» флаги остаются настоящими и на кадре СМЕНЫ РЯДА. - -У нас ряд был один, и на смене ряда `prev` заполнялся тройками («уже -перекрывал всё»), что подавляло бамп на этом кадре. В падении ряд меняется -почти каждый кадр, а переход флага 0→1 на стене приходится ровно на него — -поэтому удар не регистрировался и `bumped_fall` (который и гасит `fall_x`) -не вызывался. - -**Как ловили.** Не в MAME, а на харнессе: набор -[`tests-host/t_wall.c`](tests-host/t_wall.c) — комната 14 уровня 3 с -подложенным дном шахты, свип по всей ширине стартовой плиты (x = 177..196). -Из 20 стартовых позиций 4 давали проход сквозь кладку (Кид оказывался в -колонке 4 при стене в колонке 5). Первый вариант сценария (одна стартовая -X, из центра плиты) БАГА НЕ ПОКАЗАЛ — отсюда свип. - -**Фикс.** Три ряда как в оригинале + дословный `move_coll_to_prev` -(включая условия ±3 на заворот ряда при смене комнаты). Цена — 3×14 -`get_tile` на кадр вместо 14, банк 3 +115 Б. - -**Чем проверено.** `t_wall` зелёный; **все 1723 существующие трассы -`t_phys` не изменились ни на байт** — правка поведение-сохраняющая для -всего остального. В живой игре подтвердил пользователь: «ударились и -падаем вертикально вниз». - ---- - -## BUG-SEAM-WEDGE-1. Клин кладки в пустом углу (2,0) — **ЗАКРЫТ 2026-08-05** - -**Симптом (пользователь, приёмка уровня 3).** Комната 18: в тайле (2,0) -нарисован кусок кладки, хотя по данным там пусто. - -**Корень.** У тайла (2,0) «сосед снизу-слева» — это колонка −1 ряда 3, то -есть тайл ЧУЖОЙ комнаты (`room_BL` — левая от нижней). `load_rowbelow` -(seg008:368) резолвит его через `get_tile_to_draw(room_left, 9, 0, …)` и -подставляет стену ТОЛЬКО когда такой комнаты нет. Мы клали стену -безусловно, а `draw_topright` для стены рисует угловой кусок — он и был -клином. Для комнаты 18 диагональ — комната 13, её тайл (0,9) пуст, значит -рисовать нечего. - -**Фикс.** Ряд «снизу» стал одиннадцатибайтным: `[0..9]` — колонки комнаты -снизу, `[10]` — тайл (0,9) комнаты снизу-слева (дефолт «стена», если её -нет). Затронуты `pop_level.c` (заполнение), `pop_bg.c` (чтение), -`roomtest.c` (размер массива). - -**Проверено** в MAME: комната 18 уровня 3, клина нет. - ---- - -## BUG-LOOSE-3. Чёрный бар под упавшей плитой-потолком — **ЗАКРЫТ 2026-08-05** - -**Симптом (пользователь, приёмка уровня 2).** Комната 6: Кид сбивает -плиту-потолок (−1,2) — плита падает, но на её месте остаётся чёрный бар. -Два уточнения пользователя оказались диагностическими: - -1. «бар попал в фоновое изображение» — Кид прыгает поверх, уходит, бар - остаётся → чернота лежит в ОЗУ-копии, и heal возвращает её каждый кадр; -2. «когда возвращаемся в комнату после выхода — бара нет» → статическая - отрисовка комнаты рисует всё правильно, виновата ЗАПЕЧКА. - -**Корень.** `pop_ceil_bake_empty` стирал полосу потолка чёрной плитой -(`bar`, банк NORMAL — пишет и в ОЗУ-копию) шириной 64 px, а восстанавливал -только ДВА тайла ряда −1: `(−1,col)` и `(−1,col+1)`. Но куски тайлов -рисуются ВВЕРХ от своей нижней грани и свисают ВПРАВО, поэтому в стёртую -полосу попадает графика и соседа СЛЕВА, и тайлов ряда 0 — их верхушки. -Незакрашенным оставался прямоугольник ~13×3 px. - -**Замер (он же метод).** Плита роняется без игры — записью -`pop_ceil_modif[col] = 1` в отладчике MAME (это ровно то, что делает -`make_loose_fall` для потолка). Дальше попиксельная сверка скриншота -«после запечки» со скриншотом «комната перерисована заново» (выйти и -вернуться): различие локализовалось в прямоугольник **экранные x 230..255, -y 47..52** при полосе потолка y 44..52. - -**Фикс.** Запечка восстанавливает всё, чья графика попадает в полосу: -ряды −1 И 0, колонки `col−1..col+1`. - -**Проверено:** та же попиксельная сверка после фикса даёт **0 различий** в -полосе; пользователь подтвердил в игре. - ---- - -## BUG-RJUMP-1. Разбег-прыжок не берёт провал в три тайла — **ЗАКРЫТ 2026-08-04** - -**Симптом (пользователь, приёмка уровня 2).** Комната 1: Кид с разбегу -обязан перелететь колодец с (0,5) на (0,1) — у нас он долетает до колодца и -валится вертикально вниз. Комната 9: то же с (1,5) на (1,1). Обобщение -пользователя оказалось точным: **провал ровно в три пустых тайла наш Кид не -перепрыгивал никогда**, а провалы поменьше брал. - -**Почему «никогда», а не «иногда».** Суммарный `dx` последовательности -`seq_4_run_jump` (кадры 34..44) — 62 пикселя при ширине тайла 14. Это -ровно 4 колонки и меньше половины тайла запаса. То есть перелёт трёх -пустых тайлов возможен ТОЛЬКО если оттолкнуться почти точно от кромки; из -случайной фазы бегового цикла он не получается никогда. - -**Корень.** Оригинал именно поэтому и не даёт прыгать откуда попало: -`run_jump` (seg005:0AA8) перед стартом **выравнивает Кида по кромке**. - -```c -short xpos = char_dx_forward(4); -short col = get_tile_div_mod_m7(xpos); -for (short tiles_forward = 0; tiles_forward < 2; ++tiles_forward) { - col += dir_front[Char.direction + 1]; - get_tile(Char.room, col, Char.curr_row); - if (curr_tile2 == tiles_2_spike || !tile_is_floor(curr_tile2)) { - pos_adjustment = distance_to_edge(xpos) + TILE_SIZEX * tiles_forward - TILE_SIZEX; - if ((word)pos_adjustment < (word)-8 || pos_adjustment >= 2) { - if (pos_adjustment < 128) return; // ПРЫЖКА НЕТ - pos_adjustment = -3; - } - Char.x = char_dx_forward(pos_adjustment + 4); - break; - } -} -control_up = release_arrows(); -seqtbl_offset_char(seq_4_run_jump); -``` - -**У нас этой половины не было** — стояла заглушка с честным комментарием -«оригинал выравнивает Kid по краю пола (нужны tile-запросы) — это полировка -K3; K2b просто запускает run-jump». Полировкой это не оказалось: без -выравнивания три тайла непроходимы в принципе. - -**Две тонкости, которые легко потерять при порте.** - -1. **Беззнаковое сравнение.** `(word)pos_adjustment < (word)-8 || pos_adjustment >= 2` - означает ровно «`pos_adjustment` НЕ попал в `[-8,-1]`». Ветка - `pos_adjustment = -3` недостижима: `distance_to_edge ∈ [0,13]`, - `tiles_forward ∈ {0,1}`, значит `pos_adjustment ∈ [-14,13]`, а туда нужно - `>= 128`. В порте она записана как мёртвая, с объяснением. -2. **Отказ НЕ гасит `control_up`.** `return` выходит из `run_jump` до - `release_arrows()`, поэтому Кид бежит дальше с зажатой «вверх» и пробует - снова на следующем кадре. Именно так игрок и ловит фазу — просто - удерживая клавишу. Если погасить, прыжок у кромки станет одноразовым и - почти всегда неудачным. - -**Фикс.** Тайловая половина — `pop_run_jump_align()` в `pop_map` (там живут -`get_tile`/`distance_to_edge`), диспетчерская — в `pop_ctrl.run_jump`. -Разделение то же, что у `pop_jump_up_seq`: pop_map правит `Kid.x` напрямую, -и `pop_savekid_state` эту правку намеренно не затирает. - -**Проверка — на харнессе, а не в MAME.** Сценарий -`phys_running_jump_over_3tile_gap` в [`tests-host/t_phys.c`](tests-host/t_phys.c) -(комната с провалом в колонках 2–4). Было: прыжок со старта в кадре 34 при -`x=165`, кадр 44 приходится на колонку 3 — провал, падение. Стало: Кид -пробегает лишние 5 кадров, выравниватель ловит фазу, прыжок стартует при -`x=149`, кадр 44 даёт `x=87, col=1, row=1` — приземление на пол и бег -дальше. Остальные 8 сценариев набора не изменились ни на байт: правка -трогает только ветку разбег-прыжка у кромки. - ---- - - -## BUG-FALL-SWORD-1. Отход с мечом в провал: не та последовательность падения — **ЗАКРЫТ 2026-08-04** - -**Симптом (приёмка уровня 2, комната 4).** Кид с вынутым мечом отступает -от стража к дыре от упавших loose-плит. Наблюдение пользователя: он -«проваливается раньше времени», летит **с клинком в руке**, и падает **по -другим X**, чем в оригинале — «почти на целый тайл левее». - -**Разбор.** Сверка `seg006:1044 start_fall` показала, что наш порт -пропустил ТРИ вещи из оригинала, и все три бьют именно по этому сценарию: - -```c -void start_fall() { - Char.sword = sword_0_sheathed; // (1) меч В НОЖНЫ - inc_curr_row(); start_chompers(); - ... - } else if (frame >= 81 && frame < 86) { // (2) срыв при приземлении - seq_id = seq_19_fall; // после прыжка вверх - Char.x = char_dx_forward(5); - load_fram_det_col(); - } else if (frame >= 150 && frame < 180) { // (3) кадры С МЕЧОМ - droppedout = 1; - if (Char.direction < dir_0_right && distance_to_edge_weight() <= 7) - Char.x = char_dx_forward(-5); - seq_id = seq_81_kid_pushed_off_ledge; - } -``` - -У нас все они падали в общий `else` → `seq_7` (stepfall). Разница между -`seq_7` и `seq_81` в `seqtbl.c` и объясняет ВЕСЬ симптом: - -``` -seq_7 stepfall : dx(1) dy(3) | 102 | dx(2) dy(6) | dx(-1) dy(9) | dy(12) | dx(-2) set_fall(1,15) -seq_81 fightfall : dy(-1)| 102 | dx(-2) dy(6)| dx(-2) dy(9) | dx(-1) dy(12) | dx(-3) set_fall(0,15) -``` - -`set_fall(1, 15)` против `set_fall(0, 15)` — **горизонтальный дрейф**: в -`seq_7` во время всего свободного падения `Char.x` уходит на 1 в сторону -КАЖДЫЙ кадр. За два этажа падения это и есть тот самый «почти тайл». -Оригинал в бою падает строго вниз. - -**Сверка по числам** (лог SDLPoP `DBG shot`, кадры 102..105): - -``` -SDLPoP: 102 x=155 103 x=157 104 x=159 105 x=160 ← +2 +2 +1 = seq_81 -у нас: 102 x=151 ← seq_7 -``` - -Обратный счёт: у SDLPoP в момент решения `x = 150`, дальше -`char_dx_forward(-5)` при `dir=-1` даёт `+5` → 155. У нас решение при -`x = 152` — то есть **по самому правилу срыва расхождения нет**: обе -позиции лежат в колонке 7 (`dx_weight = x + 14`, кадр 157 имеет -`weight_x = 14`; колонка 7 — это `x ∈ [149,163)`). Двухпиксельная разница -— фаза отхода (шаг отступления `dx(-3)+dx(-2)` = 5 пикселей за цикл), а она -зависит от RNG стража и между движками совпасть не обязана. «Раньше -времени» — это не срыв не там, а seq_7 вместо seq_81. - -**Что подтвердилось попутно.** Старт уровня 2 у нас **байт в байт** как в -SDLPoP: `frame=15 x=107 y=118 dir=-1 col=3 row=1 room=5`. Таблицы кадров и -`seqtbl` вынуты из оригинального бинарника, так что расходиться могут -только РЕШЕНИЯ движка — искать надо всегда там. - -**Связь с [BUG-LAND-SWORD-1](#bug-land-sword-1).** Тот фикс (`land()` -даёт `seq_63` при вынутом мече) остаётся — он есть в оригинале, — но для -Кида он теперь почти недостижим: `start_fall` убирает меч в ножны, и после -приземления кадр 109 разбирает обычный `control_crouched`. То есть -настоящий корень вечного приседа был здесь, а не в `land()`. - -**Метод.** Пустышка `pop_dbg_trap()` в резиденте W1 (идея пользователя): -брейкпоинт на банковый код ставить нельзя — 0xC000+ это окно, куда мапятся -все банки, и точка ловит чужие функции. Оставлена в `pop_state.c` как -многоразовый инструмент. - ---- - -## BUG-CTRL-FRAME-1. Геометрия Кида считалась по кадру СТРАЖА — **ЗАКРЫТ 2026-08-04** - -Самый неприятный класс: не косметика, а неверные РЕШЕНИЯ движка, причём -плавающие — одна и та же поза Кида давала разный результат в зависимости от -того, в какой фазе анимации находится страж. - -**Симптом (приёмка уровня 2, комната 4).** Кид под сплошной плитой (1,6), -справа от него дыра от упавшей loose-плиты. По ↑ он то прыгает вверх -впустую (упираясь головой в плиту), то пытается зацепиться — но **не с той -координаты X**, с которой запрыгивает оригинал. Наблюдение пользователя, -оказавшееся точным: «похоже, дело в страже — в комнатах без стража то же -самое рисуется и работает правильно». - -**Замер (брейкпоинт на входе `pop_jump_up_seq`, состояние снято в момент -решения).** - -``` -_Kid frame=15 (стойка) x=156 y=181 dir=влево curr_col=6 curr_row=2 -кадр 15 Кида (kid_data.bin): dx=0 weight_x=3 -pop_gframe (кадр СТРАЖА, image 17): dx=-1 weight_x=8 -``` - -Считаем `dx_weight()` обоими кадрами: - -| | кадр Кида (правильно) | кадр стража (что было) | -|---|---|---| -| `dx_weight()` | 156+3 = **159** | 156+9 = **165** | -| `m7()` | (159−7−58)/14 = 6 ост. **10** | (165−7−58)/14 = 7 ост. **2** | -| `curr_col` | 6 | **7** ← намерено | -| `distance_to_edge_weight()` | **10** | **2** | -| ветка `jump_up_or_grab` | 10 ≥ 6 → шаг назад + зацеп | 2 < 6 → `jump_up_plain` | -| результат | x 156 → **160**, `seq_24/8` | x без изменений, **`seq_28`** ← намерено (A=28 на выходе) | - -Обе строки «намерено» совпали с предсказанием по кадру стража до единицы — -диагноз подтверждён, а не выведен. - -**Корень.** `cur_frame` (`pop_kid.c:200`) — ОДИН глобал на всех персонажей -(так и в оригинале), его владелец — тот, кто последним прошёл `load_frame`. -В нашем кадре последним тикает страж (`pop_guard_tick`), поэтому к моменту -управления Кидом там лежит кадр стража. А `kid_cur_dx/dy/flags` читают этот -глобал напрямую, и через него считается ВСЯ геометрия управления: -`dx_weight` → `determine_col` → `distance_to_edge_weight` → -`get_edge_distance` → выбор ветки в `check_jump_up`. - -Оригинал страхуется явно и симметрично: `play_kid_frame` (seg000:1209) и -`play_guard_frame` (seg000:1246) сразу после `loadkid`/`loadshad` зовут -**`load_fram_det_col()`** (= `load_frame` + `determine_col`, seg006:0144) — -ДО `control()`. У нас этого вызова не было; в `pop_ctrl_tick` стоял -комментарий «кадр не перезагружаем — play_seq в kid_tick сделает это -следующим шагом», и он был неверен: `control()` читает `cur_frame` РАНЬШЕ, -чем `play_seq` его обновит. - -**Фикс.** `pop_load_fram_det_col()` (`pop_kid.c`) — порт связки; зовётся -после `pop_loadkid()` в `pop_ctrl_tick` и после `pop_loadshad_and_opp()` в -`pop_guard_tick`. Вторая половина связки (`determine_col`) выполняется -только на ветке Кида: `determine_col` у нас существует лишь для него — -`pop_map` работает с `Kid` напрямую, а не с абстрактным `Char`. - -**Что это объясняет задним числом.** Плавающее поведение прыжка — кадр -стража меняется каждый тик, вместе с ним `dx`/`weight_x`, и `distance` -Кида скакал через порог 6. А «голова Кида поверх плиты (1,6)», с которой -начался разбор, — не баг отрисовки: Кид просто оказывался в позе, которой -в оригинале в этом месте не бывает. - -**Урок.** Любой глобал, который в оригинале «принадлежит активному -`Char`», у нас обязан перезагружаться на КАЖДОМ входе в окно `Char` — иначе -между персонажами течёт состояние, и баг проявляется только когда в комнате -есть второй персонаж. Здесь такой глобал уже ловили однажды: см. запись -про кэш кадра отрисовки в `load_frame` (`pop_kid.c:342`). - ---- - - -## BUG-LAND-SWORD-1. Кид навсегда застревает в приседе после падения с мечом — **ЗАКРЫТ 2026-08-04** - -**Симптом (приёмка уровня 2).** Страж ударил Кида, Кид потерял HP, -провалился через loose-плиту на этаж ниже — и **сел в присед, из которого -не выходит**: клавиши не действуют вообще. - -**Что показало ЖИВОЕ состояние в MAME** (мост `mame-z80`, чтение по -адресам из `roomtest.noi` — окно застало багу в момент): - -``` -_Kid frame=109 x=144 y=181 dir=-1 col=6 row=2 action=1 room=4 - sword=2 (ВЫНУТ) alive=-1 curr_seq=0x2037 -_holding_sword=1 _can_guard_see_kid=0 control_x/y/shift = 0 -``` - -`curr_seq = 0x2037` — это внутри метки `softland_crouch` -(`SEQTBL_BASE + 1736 = 0x2036`). Смотрим `seqtbl.c:916`: - -```c -LABEL(softland) // seq_17_soft_land - act(actions_5_bumped), SEQ_KNOCK_DOWN, dx(1), frame_107_fall_land_1, - dx(2), frame_108_fall_land_2, - act(actions_1_run_jump), LABEL(softland_crouch) frame_109_crouch, - jmp(softland_crouch), // ВЕЧНЫЙ ЦИКЛ на кадре 109 -``` - -То есть `seq_17_soft_land` **не заканчивается сам** — он крутится на кадре -109, и вывести из него может ТОЛЬКО `control_crouched()`. - -**Корень.** `control()` (seg005:252) до `control_crouched` при вынутом -мече не доходит — раньше срабатывает ветка - -```c -} else if (Char.sword == sword_2_drawn) { - control_with_sword(); -``` - -а `control_with_sword` (seg005:964) в мирной обстановке -(`can_guard_see_kid < 2`, под ногами не loose) умеет ровно одно: если кадр -== 171 (стойка с мечом) — убрать меч. Кадр 109 он не знает. **Замкнутый -круг: последовательность ждёт control_crouched, а диспетчер туда не -пускает.** - -Оригинал такой позы просто не допускает — `land()` (seg005:176): - -```c -if (Char.charid >= charid_2_guard || Char.sword == sword_2_drawn) { - Char.sword = sword_2_drawn; - seq_id = seq_63_guard_active_after_fall; // боевая стойка -} else { - seq_id = seq_17_soft_land; // присед -} -``` - -**У нас этой ветки не было** — `pop_map.c land()` ставил -`SEQ_17_SOFT_LAND` безусловно. На уровне 1 не всплывало, потому что там -меч подбирается поздно и падать с ним особо негде; на уровне 2 меч у Кида -**с первого кадра** (`have_sword = level >= 2`), а в комнате 4 страж стоит -в одном ряду с двумя loose-плитами — сценарий собирается сам. - -**Фикс.** Порт недостающей ветки: при `Kid.sword == SWORD_2_DRAWN` -падение на один этаж даёт `seq_63` (боевая стойка), а не присед. Ветка -`charid >= charid_2_guard` нам не нужна — наш `land()` работает только с -Кидом. - -**Почему не задело падение на ДВА этажа** (`seq_20_medium_land`): там -`jmp` в конце нет — 29 кадров приседа и автоматический подъём -(`seqtbl.c:934`), поэтому оно развязывается само. Вечный цикл только у -`softland`. - -**Урок на будущее.** Симптом «персонаж не реагирует на управление» стоит -диагностировать не по кадру, а по `curr_seq`: адрес прямо показывает, в -какой метке `seqtbl` он завис, и дальше видно, кто обязан был его оттуда -вывести. - ---- - -## Проверено в MAME 2026-08-01 (ревизия L1-TRIAGE) - -Три бага стояли как **Critical** с 2026-07-21 и по исходникам выглядели -закрытыми, но переподтверждены не были. Прогон в MAME (roomtest, `ROOMNAV`, -чтение `_Kid` через мост) закрыл все три. - -### BUG-1. Боковой переход через ворота: Kid проваливается на row 1 — **ЗАКРЫТ (не воспроизводится)** - -**Был симптом:** при проходе через ОТКРЫТЫЕ ворота в соседнюю комнату -(через шов) Kid оказывался на ряду row 1 вместо row 0. - -**Проверка 2026-08-01, точный сценарий бага.** Комната 6, Kid на ряду 0; -осторожный шаг на кнопку (0,2) — решётка room8 (0,9) поднимается; удержание -← через открытый шов: - -| момент | `room` | `x` | `y` | `curr_col` | `curr_row` | -|--------|--------|-----|-----|-----------|-----------| -| на кнопке в room6 | 6 | 97 | 55 | 2 | 0 | -| после перехода | **8** | 181 | **55** | 8 | **0** | - -Ряд и Y сохранены, Kid стоит на полу ряда 0 (скриншот `triage_06.png`). -Провала нет. - -**Заодно снят и сам диагноз записи** — он был неверен. В записи стояло: -«Y/`curr_row` при боковом переходе НЕ репроецируются, в отличие от -`check_leave_below`». Это не дефект, а **точное поведение оригинала**: -`goto_other_room` (`SDLPoP/src/seg002.c:390`) для направлений left/right -меняет ТОЛЬКО `Char.x` (±140), а `Char.y`/`curr_row` трогает исключительно -для up/down. Наш `check_leave` (`pop_map.c:1402`) делает ровно то же. -Реальной причиной симптома была, судя по всему, кромочная коллизия — её -закрыл `char_x_forward_edge` (см. BUG-SEAM-PINGPONG ниже). - -### BUG-2. Возврат из комнаты назад: Kid отбрасывается обратно (ping-pong) — **ЗАКРЫТ (не воспроизводится)** - -**Был симптом:** после перехода в соседнюю комнату попытка сразу вернуться -приводила к тому, что Kid снова закидывался в ту же комнату — выйти нельзя. - -**Проверка 2026-08-01.** Шов room2↔room3 (ряд 1, без ворот — чистый -горизонтальный переход), с намеренным разворотом СРАЗУ после пересечения: - -| действие | `room` | `x` | `curr_col` | -|----------|--------|-----|-----------| -| старт в room2 | 2 | 86 | 1 | -| держим → | **3** | 122 | 3 | -| сразу держим ← | **2** | 195 | 9 | -| сразу держим → | **3** | 85 | 1 | -| сразу держим ← | **2** | 183 | 8 | - -Комната меняется РОВНО один раз на пересечение, туда и обратно, без -осцилляции. Механизм на месте: `pop_leave_timer` (порт `exit_room_timer`, -`pop_map.c:112,1553`) + `char_x_forward_edge` (`pop_map.c:365`). - -### BUG-3. Climb-up на тайл-кнопку: неправильная окклюзия — **ЗАКРЫТ фиксом от 2026-07-28** - -**Был симптом:** при подтягивании на тайл, верх которого — кнопка -(opener/closer), Kid рисовался ПОВЕРХ кнопки вместо того, чтобы быть -перекрытым её передней гранью. - -**Почему закрыт.** Запись требовала: «трактовать нажатую кнопку как -floor-тайл в climb-overlay, учесть подстановку из `get_tile_to_draw`». -Ровно это и сделано `tile_code_drawn()` — `climb_overlay_tile` -(`pop_bg.c:1346`) берёт ПОДСТАВЛЕННЫЙ код тайла, а не сырой. То есть -BUG-3 — дубль пункта «спуск с кнопки (room8, кромка (0,6))» из раздела -«Исправлено», заведённый до фикса. - -**Оговорка, чтобы не выдавать желаемое:** покадрово в MAME снимался СПУСК -(кадры 148..138). Подъём идёт через ту же ветку и ту же таблицу -`FLOOR_LEFT_OVERLAY[fidx]`, поэтому отдельного дефекта тут быть не может, -но визуально направление «вверх» не переснималось. Если при сквозном -прохождении (L1-PASS) увидишь Kid поверх кнопки на подъёме — заводи заново. - ---- - -## Косметика окклюзии — закрыта кодом, список отставал (сверено 2026-08-01) - -Четыре записи от 2026-07-22 висели как открытые Medium. Каждая описывала -недостающий кусок порта; каждый из них с тех пор написан, но записи никто не -снял. Ниже — что именно закрывает каждую. - -### BUG-CEIL-1. Прыжок вверх: руки Kid рисуются ПОВЕРХ потолка — **ЗАКРЫТ** - -**Был симптом:** при прыжке вверх (SEQ up, кадры 67..79) руки/голова Kid -заходили в полосу кладки у потолка (row −1) и рисовались ПОВЕРХ неё. - -**Чем закрыт:** `ceil_over_kid_tile()` (`pop_bg.c:1275`) — порт «нижняя грань -потолка и кадр плиты-потолка идут в FOREtable», т.е. поверх персонажа. -Зовётся из `pop_fore_over_kid` (`pop_bg.c:1575`) и из fore-прохода стража -(`:1607`). Комментарий на месте прямо называет причину: «иначе руки -прыгающего Kid лезут на кромку потолка». - -### BUG-CEIL-2. Тряска/разбитие loose-плиты в потолке (row −1) — **ЗАКРЫТ** - -**Был симптом:** loose-плита в ряду 2 верхнего соседа (room5 (2,5) → потолок -room6 над (0,5)) при прыжках Kid на (0,5) не тряслась и не разбивалась — -loose-состояние соседней комнаты не тянулось. - -**Чем закрыт:** отдельное состояние плиты-потолка `pop_ceil_modif[10]` -(`pop_bg.c:547`, ведёт `pop_map`) + пара `pop_ceil_shake_draw()` / -`pop_ceil_bake_empty()` (`pop_bg.c:815,827`): дрожание рисуется на текущей -странице поверх фона, а провал «запекается» в ОЗУ-копию, чтобы heal его -сохранял. В полосе у потолка виден только НИЗ плиты (`draw_tile_aboveroom`), -всё выше режется клипом `POP_YOFF` — как в оригинале. - -Из этого следует, что и запись «требует персистентного per-room modifier -соседей, это Фаза P0 gates_spikes_plan» больше не верна: понадобился не общий -механизм, а один массив на 10 байт под конкретный случай. - -### BUG-CEIL-3. Анимация ворот стирает потолок над ними — **ЗАКРЫТ** - -**Был симптом:** при анимации решётки шва полоса кладки у потолка НАД -воротами пропадала — чёрный `bar` по col0 стирал ряд −1, а redraw его не -восстанавливал. - -**Чем закрыт:** `pop_room_redraw_seam_left()` (`pop_bg.c:793`) больше не -трогает полосу потолка — `bar` идёт с `POP_YOFF + 3`, а не с `POP_YOFF`: -низ полосы кладки на room-space y=2, бары ворот начинаются с y=3 -(`gate_top_y = dby − 62`). Приятный побочный эффект: отпала необходимость -перерисовывать `draw_tile(-1,0)` на КАЖДОМ кадре анимации решётки — то есть -фикс не только косметический, но и вдвое дешевле прежнего. - -### BUG-OCCL-1. Тень дальней колонны перекрывает Kid — **ЗАКРЫТ** - -**Был симптом:** Kid у (0,4)-(0,5) частично перекрыт тёмной штриховкой — -боковой гранью ДАЛЬНЕЙ колонны, которая окклюдить персонажа не должна -(over-occlusion fore-слоя, рисовавшего fore футпринт-тайлов без учёта -глубины). - -**Чем закрыт:** разделение слоёв по признаку из оригинала, а не по нашим -соображениям о глубине (`overlay_mid_tile`, `pop_bg.c:1367`). Ключ, -подтверждённый трассой оригинала: `draw_tile_right`, `draw_tile_anim_right` и -`draw_loose` кладут спрайты через `add_backtable` НАПРЯМУЮ, минуя -`ptr_add_table` — значит правая грань левого соседа («шахматка» столба 93, -blueline, грани пик/loose соседа, кадр loose) **всегда** рисуется ПОД -персонажем. Через `ptr_add_table` (→ midtable при `draw_other_overlay`) идут -только «floor B» 42 при левом соседе-поле, `draw_tile_base`, -`draw_tile_anim` (свои пики) и `draw_tile_bottom`. - ---- - -## BUG-DOOR-CLIP. Подъём по лестнице двери уровня: нет обрезки по правому косяку — **ИСПРАВЛЕН 2026-08-01** - -**Был симптом (найден пользователем сразу после L1-EXIT):** при подъёме по -лестнице за дверью уровня (кадры 224..228) силуэт Кида вылезал ПРАВЕЕ правого -косяка проёма. По высоте обрезка была корректна. - -**Причина — недопортированная половина `clip_char`** (seg006:1231). Для -кадров двери оригинал ставит ДВА клипа, у нас был только первый: - -```c -if (frame >= frame_224_exit_stairs_8 && frame < 229) { - obj_clip_top = leveldoor_ybottom + 1; - obj_clip_right = leveldoor_right; -} -``` - -Отдельная ловушка: комментарий в SDLPoP говорит «frames 217..228», а КОД -проверяет `>= frame_224_exit_stairs_8`, то есть **224..228**. Портировано по -коду. - -**Почему именно обрезка, а не fore-слой:** створка и косяк уходят в оригинале -ЦЕЛИКОМ в backtable (`draw_leveldoor`, все `add_backtable`), то есть рисуются -ПОД персонажем и перекрыть его не могут. Единственный способ спрятать -поднимающегося — срезать сам спрайт. - -**Фикс:** -- libbgi: `gfx_blit_cols_part_w(..., uint8_t maxw)` — обрезка СПРАВА у - колоночного блита. Для column-major это ровно уменьшение числа колонок, - то есть внутри ядра механизм уже был (так же клипается край экрана: - `w = _bgi_maxx + 1 - x`), наружу не было выведено. Тело блита переехало - туда, `gfx_blit_cols_part` стал тонкой обёрткой (maxw=0) — тем же приёмом, - каким `gfx_blit_cols` уже обёрнут вокруг `gfx_blit_cols_part`. Работает и - при flip: первые `maxw` нарисованных колонок всегда ложатся в ЛЕВУЮ часть - футпринта. -- PoP: `pop_leveldoor_right` / `pop_leveldoor_ybottom` (порт одноимённых - глобалов) пишет `draw_leveldoor` в `pop_state` — их читает `clip_char` из - другого банка; `pop_clip_char_right()` отдаёт границу, `kid_draw` - превращает её в `maxw` и уводит эти кадры с noclip-пути на общий. - `kid_lw` (прямоугольник heal) тоже сужается — стираем ровно нарисованное. - -**Проверено в MAME:** `pop_leveldoor_right = 176` — ровно -`(draw_xh<<3) + 48` для двери комнаты 9; `pop_leveldoor_ybottom` = 112 у -закрытой створки и 69 у поднятой (сходится с формулой оригинала). -Отрисовка подтверждена пользователем на живом подъёме. - ---- - -## BUG-SEAM-PINGPONG (#4). Пинг-понг drawn_room у шва с закрытыми воротами — **РЕШЁН 2026-07-22** - -Настоящий корень найден потиковой трассой ЖИВОГО SDLPoP 1.23 -(lldb-брейкпоинты на leave_room/bumped/safe_step с логом Char + -char_x_left/right; fixes выключены = vanilla). Прежние гипотезы оставлены -ниже для истории — они НЕ были причиной. - -### КОРЕНЬ (подтверждён трассой + исходником) - -`set_char_collision` (seg006:0723): `char_x_right = obj_x/2 + 58`, где -`load_frame_to_obj` (seg008:1728) считает `obj_x = 2*char_dx_forward(dx) - 116` -и **добавляет +1** для кадров «чётного пикселя»: -`if ((sbyte)(cur_frame.flags ^ obj_direction) >= 0) ++obj_x;` -(бит 0x80 флагов кадра XOR направление; вправо: +1 если бит НЕ стоит). -Деление `obj_x/2` — C-усечение К НУЛЮ, поэтому при `e = x+dx <= 57` -(obj_x < 0, зона левого шва) поправка +1 даёт `char_x_right = e+1`, а при -e >= 58 формула сокращается к чистому `e`. - -Итог: Kid, осевший после отскока от ворот шва на x=57 (frame15, флаги 0x43 — -бит 0x80 не стоит), имеет **char_x_right = 58** и порога leave-left (<=57) -НЕ достигает. Наш движок считал передний край как `Kid.x + dx` без поправки -→ 57 → ложный leave → пинг-понг. - -Эталонный цикл SDLPoP (нормализовано по трассе): стойка x=61 → тап вправо → -safe_step(d=0) → step, на первом dx(1) x=62 → bump (edge-триггер) → align 61 -→ seq47 dx(-4) → **x=57** (скрыт за кромкой) → кадры 50/51/52 (cxr 61/60/58, -у всех бит 0x80 снят, e>57 — без сдвига) → стойка cxr=58 → leave НЕ -срабатывает; тап → safe_step d=3 → x=60 (1/3 видно); тап → step1 → x=61 -(2/3 видно); тап → bump → 57 … по кругу. Char.room и drawn_room НЕ меняются. - -### Фикс (pop_map.c) - -`char_x_forward_edge()`: `e = char_dx_forward(dx); if (((flags ^ (dir<0 ? -0x80 : 0)) & 0x80) == 0 && e <= 57) e++;` — используется в `char_front_coll` -(коллизия/bump/edge_distance) и в `check_leave` (порог ухода). Плюс порт -doortop-гарда leave-right из leave_room (тайл (9,row) = doortop → правого -выхода нет). `pop_leave_timer` (exit_room_timer) оставлен — он реален в -seg002/seg003. - -### Симптом (как выглядел) - -Kid стоит за решёткой закрытых ворот шва (левый сосед room8 виден в кромке -room6). При удержании/нажатии ВПРАВО экран пинг-понгует между двумя -состояниями: -- **A**: показывается room6, Kid у левой кромки за решёткой (спрайт на 2/3); -- **B**: показывается room8, Kid у его правой кромки. - -Эталон SDLPoP: drawn_room **всегда остаётся room6**, Kid осциллирует у -кромки (1/3→2/3→отступил→по кругу), в room8 экран НЕ переключается. - -### Инструментальный диагноз (watchpoint на pop_leave_dir) - -В момент лишнего свитча A→B: `pop_leave_dir=1 (LEFT)`, Kid **frame=15 (СТОЯ, -не transient!), Kid.x=57** (до репроекции +140). То есть: -- `char_x_right = char_dx_forward(kid_cur_dx()) = Kid.x + frame15.dx = 57+0 = 57`. -- Порог leave-left (взгляд вправо): `char_x_right <= 57` → срабатывает РОВНО на 57. -- Грань ворот (где их держит коллизия) = **61** (`wall_dist_from_left[1]=10 + - coll_tile_left_xpos=51`). Между 57 и 61 — **зазор 4px**: Kid НЕ удержан - воротами (d=61−57=4≥0 → check_bumped не бампит), но уже на пороге ухода. -- Kid оседает на 57 из-за recoil отскока: seq_47 = `act(bumped), dx(-4), - frame_50, 51, 52`; SEQ_DX(−4) двигает Char.x на −4 суммарно; frame_50.dx=4 - компенсирует ТОЛЬКО точку коллизии НА кадре 50, но при возврате в стойку - (frame15, dx=0) `char_x_right = Char.x = aligned−4 = 57`. - -### Что было ИСКЛЮЧЕНО (сверено с исходниками SDLPoP, НЕ причина) - -- Формула char_x: `char_x_right = obj_x/2+58 = Char.x+frame.dx` (seg006 - set_char_collision) — совпадает с нашим char_dx_forward. -- Позиция грани ворот: `get_left_wall_xpos = wall_dist_from_left[1](10) + - xpos_in_drawn_room(x_bump[9+5])+7 = 10+(184−140)+7 = 61` — совпадает с нашим - (`x_bump[−1+5]=44`, +7, +10 = 61). -- Порог leave: SDLPoP leave_room looking-right `char_x_right<=57` — совпадает. -- Данные кадров: frame_50 (image=49,dx=4,flags=0x67) и frame_15 - (image=14,dx=0,flags=0x43,sword=9) — БАЙТ-В-БАЙТ как в SDLPoP frame_table_kid. -- seq_47 (act bumped, dx(-4), frame 50/51/52) — совпадает. - -### Почему точечные фиксы НЕ работали - -- Гард в check_leave (подавить leave на закрытых воротах) — это ОТСЕБЯТИНА, - не SDLPoP (в leave_room такого нет); откачено. -- `exit_room_timer=2` (порт seg002 exit_room — РЕАЛЬНЫЙ механизм, оставлен как - pop_leave_timer): блокирует leave 2 кадра после входа в комнату. НЕ спасал: - положение Char.x=57 **устойчивое** (Kid стоит), а не transient. - -### Задел, который НЕ понадобился: порт coll_room + отложенный drawn_room - -Трасса показала, что в эталоне `Char.room`/`drawn_room` вообще не меняются, -поэтому план S2/S3 для этого бага не потребовался. Остаётся заготовкой под -стражей/двух персонажей в кадре: - -1. **Раздельные комнаты.** `Char.room` ≠ `drawn_room`. Уже есть `kid_room` - (S1) + рендер-смещение `pop_kid_set_render_dx(∓140)`. -2. **Коллизия по Char.room через coll_room (seg004, S2).** Портировать - `check_collisions` → `get_row_collision_data` → `get_left_wall_xpos`/ - `get_right_wall_xpos` → `curr_row_coll_room[]`/`_flags[]`, - `bump_col_left_of_wall`/`bump_col_right_of_wall` → `check_bumped_look_*` → - `bumped()`. Тайлы — из РЕАЛЬНОЙ комнаты колонки, НЕ из снапшота. -3. **Отрисовка по drawn_room**, персонаж со сдвигом ±140. -4. **Отложенная смена drawn_room (seg002/seg000, S3):** `leave_room` → - `goto_other_room` → `exit_room` (`next_room`) → `check_the_end`. - -Реализовано на 2026-07-22: S1 + `pop_leave_timer`. -Память: [[pop_seam_room_model]], [[sdlpop_odd_pixel_char_x]]. - ---- - -## Решено НЕ делать - -### OPT-1. Хирургический редрой левого шва (ворота соседа) — 2026-07-22 - -**Возможность:** `pop_room_redraw_seam_left()` (pop_bg.c) на каждое изменение -openness рисует `bar(BLACK)` по всему col0 + **полный `draw_tile(0,0)`** -(стены, `topright`, `wall_pattern` с `prandom()` — десятки блитов). Реально -анимируются только бары решётки — `draw_gate_back` (~9 `env_b`). - -**Стоимость:** seam-блок (синий io_border) занимает ~30-50% кадрового периода, -**но только пока openness меняется** — во время открытия и медленного -авто-закрытия (~5 сек после схода с кнопки). В покое — 0%. Замерено в MAME: -брейк на `_pop_room_redraw_seam_left` (0x5A54) срабатывает ⟺ сегмент дорогой. - -**Приём** (heal НЕ годится: печёные бары устаревшие, поэтому и стоит -`bar(BLACK)`+redraw): `bar(BLACK)` только по полосе баров (x=0, -gate_top..gate_bot) + `draw_gate_back(lmod,...)` + дорисовать статику тайла -(0,0), задетую полосой. **Пиксель-чувствительно** — обязательна выверка в -MAME по кромкам. - -**Решение:** оставляем как есть — стоимость транзиентная, в бюджет -помещаемся. Делать, только если упрёмся в кадровый бюджет на сценах с -воротами. - ---- - -## Исправлено - -- **Спуск с кнопки (room8, кромка (0,6)): Кид просвечивал в щель, ближняя рука - срезана до одного пикселя** — ИСПРАВЛЕНО 2026-07-28. Две причины: - (а) не был портирован `clip_char()` (seg006:1749) — верхняя обрезка спрайта по - `y_clip[curr_row+1]`, когда тайл над головой стена/пол; сделано - (`pop_clip_char_top` в pop_map.c + `gfx_blit_cols_part` в libbgi, heal чистит - уже обрезанный прямоугольник); - (б) `climb_overlay_tile` выбирал ветку `draw_floor_overlay` (seg008:1E3A) по - СЫРОМУ коду тайла — а нажатая кнопка в `get_tile_to_draw` (seg008:240) - подменяется на floor/stuck. Тайл-кнопка не проходил тест floor, уходил в - `draw_other_overlay` и закрашивал Kid ЦЕЛЫМ тайлом вместо узкой кромки - `floor_left_overlay[frame-137]`. Фикс — `tile_code_drawn()` (одна подстановка - на все слои). Проверено покадрово в MAME (кадры 148..138). **Этим же - фиксом закрыт BUG-3** (см. выше). - -- **Шов ворот жёг 50% кадра в покое (закрытая решётка)** — ИСПРАВЛЕНО - 2026-07-22. Причина — **баг кодогенератора SDCC z80** (memory - `sdcc_z80_cmp_store_a_bug`): `if (m[9] != seam_sig) seam_sig = m[9];` - компилировался в `sub (seam_sig)` (A ← разность) + `ld (seam_sig),a` — - сохранял РАЗНОСТЬ `m[9]-seam_sig`, не `m[9]`. `seam_sig` осциллировала - (напр. 25↔231), `m[9]!=seam_sig` истинно каждый кадр → `draw_tile(0,0)` - каждый кадр даже у неподвижной решётки. Фикс: store-до-сравнения - (`seam_sig = g;` из чистого `g` ДО `sub`), подтверждён в .asm. Прочёс всех - модулей PoP: других случайных compare-then-store нет. - -- **Пики: 2×полный `draw_tile` на кадр анимации** → хирургический редрой, - 2026-07-22. `pop_spike_redraw`: `heal_off` уже возвращает всю печёную - статику (база 127, пол, грани); поверх анимируются только два острия - (`SPIKES_FRAM_LEFT` в своей ячейке + `SPIKES_FRAM_RIGHT` в соседней). - Заменили 2×`draw_tile` на 2×`env_b` — пиксель-в-пиксель тот же результат, - в разы дешевле (шахта из нескольких пик больше не съедает полный кадр). - -- **Отрисовка нажатой кнопки (0,2)/(0,3)** — ИСПРАВЛЕНО. Причина: `fore_tile` - (pop_bg.c, fore-слой поверх Kid) рисовал переднюю грань КНОПКИ (bottom_id - 149) поверх уже нарисованной грани пола (43) — «остаток нажатой кнопки». - Фикс: `fore_tile` применяет ту же подстановку нажатой кнопки, что и - `draw_tile` (opener→floor / closer→stuck при таймере связи >1). Плюс - `pop_button_redraw` — wipe своей ячейки + правой грани (дальний угол в - 0,3), низ строго yb+64 (не залезать в стену ряда 1). - ---- - -## НЕ БАГИ (кривая картинка, но совпадает с оригиналом — НЕ чинить) - -- **Кадр падения с мечом: голова/руки поверх кромки пола — САМ РЕНДЕР верен.** - Сверено с SDLPoP v1.24 (2026-08-04): там кадр падения выглядит один в один. - ⚠ Речь ТОЛЬКО о виде кадра. Расхождение по X, которое было отмечено здесь - как открытое, разобрано и закрыто: [BUG-FALL-SWORD-1](#bug-fall-sword-1) — - дело не в моменте срыва (он верен), а в том, что мы играли `seq_7` вместо - `seq_81` и получали горизонтальный дрейф `set_fall(1,15)` за всё падение. - - Механика точки веса, чтобы не разбирать заново. У стоек с мечом она - ОГРОМНАЯ: - - ``` - кадр 158/170/171 (stand_with_sword): dx=0 weight_x=13 - кадр 157 (walk_with_sword): dx=0 weight_x=14 - кадр 15 (обычная стойка): dx=0 weight_x=3 - ``` - - `dx_weight()` = `char_dx_forward(dx − weight_x)`, а при взгляде ВЛЕВО знак - меняется — точка веса уезжает на 13 px ВПРАВО от `Char.x`. Замер нашего - кадра падения: `x=151`, взгляд влево → `dx_weight = 164` → `m7(164)` = колонка - **7**, а (1,7) — дыра. `check_on_floor` честно видит «под ногами не пол». - С обычной стойкой (weight_x=3) вышло бы 154 → колонка 6 → пол. - - То есть с мечом персонаж «стоит» на 10 px правее, чем выглядит, и кромку - переступает раньше. Данные кадров у нас совпадают с `frame_table_kid` - (seg006:127) байт в байт, `swordfight`/`back_with_sword` портированы дословно - (включая `control_backward = CONTROL_IGNORE` — один нажим = один шаг). - Чинить нечего. - - **Важное отличие от остальных записей этого раздела.** Там (труп стража, - падающая плита) картинка кривая, и совпадает с оригиналом лишь потому, что - оригинал сам так рисует — артефакт порядка midtable. **Здесь картинка - ПРАВИЛЬНАЯ**: Кид реально уже за кромкой, и спрайт перекрывает её ровно - настолько, насколько персонаж туда зашёл (наблюдение пользователя, - 2026-08-04). Геометрия и рендер согласованы; «неправильно выглядит» — - только если считать позой то, что видит глаз, а не точку веса. - - ⚠ **Не путать** с тем, что БЫЛО нашим багом рядом: расширение футпринта - перерисовки под клинок (`redraw_at_char`, seg003:0430) — его не было, и меч - оставлял след/лез поверх столба. Исправлено 2026-08-04. - -- **Голова стоящего Кида поверх падающей на него loose-плиты.** Комната 12: - зацеп не удался, Кид остался стоять, сбитая плита падает прямо на него — - голова рисуется ПОВЕРХ плиты. Сверено покадрово с SDLPoP v1.24 (2026-07-29): - там ровно то же самое. Артефакт оригинального движка (порядок midtable), а - не наш баг; «починка» увела бы от эталона. Отличать от соседних случаев, - которые БЫЛИ нашими багами и исправлены: вис/подтягивание на кромке плиты и - падение вместе с плитой — там плита обязана быть поверх Кида. - -- **Ноги стоящего Кида поверх головы лежащего трупа стража.** Комната 21: - страж убит, комната покинута и открыта заново (у трупа своя запомненная X), - Кид СТОИТ на одну колонку правее тела — его ноги рисуются поверх головы. - Проверено в SDLPoP (2026-08-03): там ровно то же. - - Корень — устройство движка, а не наш порт. `set_objtile_at_char` - (seg006:13F3) приписывает персонажа РОВНО ОДНОМУ тайлу, и ширина спрайта на - выбор тайла не влияет никак; дальше `redraw_needed_tiles` (seg008:1B06) - обходит тайлы рядами 2,1,0 и колонками 0..9, и кто позже — тот поверх. - Стоящий Кид укладывается примерно в колонку, поэтому у него это незаметно, а - лежащий труп занимает две-три колонки, но «принадлежит» левой. Всё, что - стоит правее, перекрывает выступающую часть тела. Механизма «широкий объект - участвует в нескольких тайлах» в оригинале нет — сверено с - `draw_objtable_items_at_tile`, `sort_curr_objs` и веткой - `tile_object_redraw == 0xFF` (последняя про оверлеи пола, не про персонажей). - - Отличать от того, что БЫЛО нашими багами в этом же месте и исправлено - (BUG-DRAWORDER-1): колонка трупа считалась из тайла вместо X, ветка - `actions_1_run_jump` не была портирована, окно fore-клипа затиралось стражем. - Если когда-нибудь захочется «починить» и это — минимальный вариант — брать - тайл по ЦЕНТРУ габарита, а не по левой границе; но это осознанный отход от - эталона, и в других позах порядок поменяется в обратную сторону. - -- **Комнаты 13, 18, 24 недостижимы в обычной игре** — свойство ДАННЫХ уровня 1, - не наш баг. Обход графа от стартовой комнаты (по `res2001.bin`, links @1952) - показывает: у всех трёх ссылки наружу есть, а на них не ссылается никто - (24: `L→9`, но у 9 `R=0`; 13 и 18 связаны только друг с другом). Признак - «комнату выкинули из компоновки, связи не почистили» — несимметричные ссылки - ровно у этих трёх, у остальных 21 симметрия полная: - - ``` - 13 L→22, у 22 R=16 | 18 L→15, у 15 R=12 | 24 L→9, у 9 R=0 - 13 R→16, у 16 L=22 | 18 R→12, у 12 L=15 - | 18 D→19, у 19 U=12 - ``` - - Следствие: в 13/18/24 возможен «мусор в шве» — наш рендер кромки читает - крайнюю колонку соседа ПО ССЫЛКЕ, а сосед этих комнат соседом себя не - считает. Приоритет багов в этих трёх комнатах — низкий (в игре не видно). - ---- - -## Проверено в MAME 2026-08-03 (прогон уровня 1: 11 наблюдений → 6 корней) - -Сырой список наблюдений с обхода всех комнат разобран по корням. -Проверка — MAME + мост `mame-z80`: чтение `_Kid` по адресу из -`.sprinter-cc-roomtest/roomtest.noi`, `ROOMNAV` для навигации, потиковые -трассы, скриншоты. - -**Оговорка о полноте проверки.** Каждый корень закрыт тем, что его СОБСТВЕННЫЙ -сценарий больше не воспроизводится; сквозного прохождения уровня и поиска -регрессий в соседней механике автоматика не делала. Чек-лист для ручной -перепроверки — в [`BUGS_OPEN.md`](BUGS_OPEN.md), раздел «Ручная перепроверка -фиксов». Особое внимание — порту `check_collisions`: он переписал ВСЮ -горизонтальную коллизию. - -### BUG-LVLSTATE-1. Уровень был немутабельным — **ЗАКРЫТ** - -**Симптомы:** выпитое зелье / поднятый меч / разбитая плита возвращались при -возврате в комнату; иногда кувшина нет, а пузырёк над ним крутится; в -комнате 15 раз в 1–2 с мигал контур кладки. «Первое остаётся, остальное -возвращается». - -**Корень.** Уровень лежал в EMM-странице только на чтение, `enter_room` -перезаливал `room_fg[30]` из неё при каждом входе, а персистентность держала -таблица переопределений на **8 записей** (`OVR_MAX` в `roomtest.c`) — девятая -и дальше молча терялись. Второй хвост: `pop_trob.c` брал тип тайла из -СТРАНИЦЫ (`pop_level_tile_raw`), поэтому заводил trob зелья/меча там, где -предмет уже поднят — отсюда пузырёк без кувшина и мигание от `animate_sword`. - -**Фикс.** `pop_level_set_tile()` пишет тайл ПРЯМО в страницу уровня (порт -`curr_room_tiles[…] = …`: `do_pickup` seg006:1671, `remove_loose` seg007:0EB8, -`loose_land` seg007:11E8). Таблица `ovr_*` удалена. Эталонная копия -foretable — в той же странице по смещению `0x1000` (страница 16 КБ, данных -2.3 КБ). - -**Проверено:** комната 22, зелье (0,6) выпито → выход в 23 → возврат: кувшина -нет, пузырька нет; ROOMNAV ставит Кида уже на (0,6), потому что тайл стал -полом. - -### BUG-RESPAWN-1. Респавн не перезагружал уровень — **ЗАКРЫТ** - -**Как в оригинале:** цикл `play_level` (seg003:57) на КАЖДОЙ итерации, в том -числе после смерти, зовёт `load_level()` — уровень читается заново. - -**Фикс.** `pop_level_reset_tiles()` (восстановление foretable из эталонной -копии) в `pop_start_level` рядом с `pop_trob_reset()`. - -**Проверено:** после смерти от стража зелье в комнате 22 снова на месте. - -### BUG-DEATH-1. Смерть от меча не доводилась до конца — **ЗАКРЫТ** - -**Симптом:** страж убивает Кида, тот «воскресает» на месте и его убивают -снова, по кругу. - -**Корень.** `hurt_by_sword` ставил seq_85 и обнулял HP, но `Kid.alive` -оставался −1, а `pop_kid_dead` (по нему главный цикл делает респавн) взводил -только путь пик/падения. В оригинале это первая строка `control_kid` -(seg006:0CD1): `if (Char.alive < 0 && hitp_curr == 0) Char.alive = 0;`. - -**Фикс.** Порт этой ветки в начало `pop_ctrl_tick` + `pop_kid_dead = 1`. - -**Проверено:** страж в комнате 21 убивает Кида → респавн в стартовой позиции -уровня (комната 1), цикла нет. - -### BUG-GATE-ANIM-1. Ворота в отрисованной комнате не перерисовывались — **ЗАКРЫТ** - -**Корень.** `pop_process_trobs` продвигал модификатор ворот, но пометки -перерисовки не ставил; ворота рисовались только при полной отрисовке комнаты -и в `pop_room_redraw_seam_left`. В оригинале `animate_door` (seg007:0522) -заканчивается `draw_trob()` (seg007:01E6). - -**Фикс.** Вид перерисовки `POP_RD_GATE` + `pop_gate_redraw(row,col)` в -`pop_bg.c` (wipe зоны решётки в ячейке ПРАВОГО соседа + `draw_tile`), пометка -из `pop_process_trobs` (текущая страница каждый кадр, обе — на последнем). - -**На уровне 1 это ровно ОДНА решётка:** room5 (0,5). Все остальные стоят в -колонке 9, их бары рисуются уже в соседней комнате — там работает -`pop_room_redraw_seam_left`. - -**Проверено:** кнопка room5 (0,4) — решётка (0,5) поднимается на экране. - -### BUG-COLL-1. Bump искал стену только в колонке переднего края — **ЗАКРЫТ** - -**Симптомы:** пробегание сквозь закрытую решётку (комната 12, room5 (0,9)); -влёт внутрь стены на длинном прыжке (комната 6). - -**Два корня.** -1. `check_bumped` брал ОДНУ колонку — ту, в которой оказался передний край. - Для решётки в col9 окно этой колонки всего 4 px (201..204), беговой кадр - его перескакивает — бампа нет, а `check_leave` тут же уводит в соседнюю - комнату. Оригинал (`check_collisions`, seg004:0004) считает флаги - перекрытия для ВСЕХ колонок ряда и берёт колонку с переходом флага 0→1. -2. Наш guard `action == FREEFALL || MIDAIR → return` в `check_bumped`. В - оригинале таких гардов НЕТ: `bumped_fall` (seg004:04E4) специально - разбирает `actions_4_in_freefall`. Отсюда влёт в стену в прыжке. - -**Фикс.** Полный порт `check_collisions` + `get_row_collision_data` + -`is_obstacle` + `bumped(delta, push_dir)`; колонки считаются от −2 до 11, -чтобы решётки СОСЕДНЕЙ комнаты (швы) бампили как свои; гарды в `check_bumped` -приведены к оригинальным (только вис и подтягивание). - -**Проверено:** комната 5, бег вправо в закрытую решётку (0,9) — Кид упирается -(x встаёт на 60 в системе комнаты 1 и дальше не растёт). - -**Остаток:** экран при этом перелистывается на соседнюю комнату, и Кид в шве -не рисуется — отдельный баг BUG-SEAM-DRAW-1 (модель straddle S3), см. -`BUGS_OPEN.md`. - -### BUG-STANDUP-1. Вставание из приседа у стены роняло сквозь пол — **ЗАКРЫТ** - -**Симптом:** комната 5, падение с кнопки (0,6) на щебень (2,7) с уроном, -присед — и при вставании провал в комнату 6. - -**Корень — лишний guard `if (Kid.action == ACT_BUMPED) return;` в -`bumped_floor`** (в оригинале, seg004:0520, там `if (Char.alive)`). Цепочка: -вставание двигает Кида на 1 px в стену → бамп → `bumped_floor` прижимает `y` -к полу, отменяя `dy(−2)` из начала `medland` → наш guard возвращает -управление вместо `seq_47`, `medland` доигрывает свои `dy(+1)`,`dy(+1)` уже -ОТ пола → Кид НИЖЕ пола → следующий бамп читает беззнаковую разность как -«высоко над полом» → `bumped_fall` → выпадение вниз. У оригинала `seq_47` -обрывает `medland`, лишних `dy` нет. - -Найдено потиковой трассой + временной диагностикой (колонка бампа = 8, тайл -после разрешения = 14 щебень, ветка = `bumped_floor`). - -**Заодно** убран полу-порт опционального `FIX_STAND_ON_THIN_AIR`: у нас была -взята только его первая часть (кадры вставания 110..119 требуют пол), без -парной правки seqtbl (`dx(1)→dx(0)`, `dx(−4)→dx(−3)`), которую применить -нельзя — seqtbl извлечён из данных оригинала. Вернулись к ванильному -`seg006:909` (только кадр 109). - ---- - -# Вторая волна прогона 2026-08-03 (вечер) - - -## BUG-KBD-5. Зажатый Shift снимается автоповтором стрелки — **ЗАКРЫТ 2026-08-05** - -**Симптом (пользователь).** Прыжок с места с зацепом (уровень 2, комната 9) -не выходит: Кид прыгает, но за кромку не цепляется. Дальше уточнения, -которые и указали на клавиатуру, а не на физику: - -- «отпускаю стрелки в полёте и жму Shift один — зацеп есть»; -- «жму Shift не сразу, а когда бо́льшая часть прыжка позади — зацеп есть»; -- «зажимаю Shift, потом стрелки — прыжок есть, зацепа нет»; -- в SDLPoP та же комбинация в том же порядке работает всегда. - -Обобщение: **Shift работал в одиночку и не работал вместе со стрелками.** -Ровно то же ломало и осторожный шаг — игрок держит Shift, тапает стрелку, а -Кид на каком-то тапе уходит в бег (это же поведение раньше описывалось как -BUG-KBD-4, см. ниже). - -**Замер (MAME, `roomtest`, чтение карты `_kbdraw_down` + breakpoint на выходе -из `in a,($18)` в декодере трамплина).** - -1. Зажать LShift → байт 2 карты = `04` (LSh взведён), поток `12 12 12 …` - (Shift автоповторяется сам, пока он последняя нажатая клавиша). -2. Добавить ↑ → байт 46 = `20` (↑ взведена), **байт 2 = `00` — Shift снят, - хотя физически зажат.** -3. Добавить ещё → байт 46 = `30` (обе стрелки видны, 3-key rollover в - порядке), Shift по-прежнему `00`. -4. КОРОТКИЙ тап ↑ при зажатом Shift — Shift выживает. Это и сбивало с - толку: бит сносился, но тут же восстанавливался, потому что после - отпускания стрелки Shift снова становился «последней клавишей» и его - автоповтор `12` взводил бит обратно за ~30 мс. -5. Сам поток при зажатом Shift и зажатой ↑: - - ``` - … E0 E0 E0 75 E0 75 E0 75 ← ни одного F0/12 - ``` - -**Причина.** Декодеры (`_irq_tramp.c`, `kbd_raw_poll.c`) делали из «fake -shift» ДВА вывода, и второй был неверен: - -- обёртка `E0 F0 12` / `E0 12` есть → Shift зажат → взвести бит ✔ верно; -- расширенный make **без** обёртки → Shift отпущен → снять биты обоих - шифтов ✘ **неверно**. - -Обратный вывод опирался на «клавиатура обёртывает КАЖДЫЙ расширенный код». -Замер это опровергает: клавиатура MAME-Sprinter (`pc_kbd ms_naturl`) обёртку -не шлёт вовсе, и уж точно её не бывает на typematic-повторах — а повторы идут -непрерывно, пока стрелка зажата. Значит каждый повтор снимал реально зажатый -Shift, и к кадрам 102…106 (окно `check_grab`) движок видел Shift отпущенным. -Отсюда и «работает, если нажать Shift позже»: бит успевал постоять несколько -кадров до ближайшего повтора стрелки. - -**Фикс.** Обратный вывод убран целиком — расширенная клавиша идёт обычным -путём и о состоянии Shift не судит. Прямой вывод оставлен (обёртка, если -клавиатура её всё-таки шлёт, подтверждает «Shift зажат» и стоит дёшево). -Состояние Shift теперь ведут его собственные make/break `12` / `F0 12` — -они приходят всегда. Заодно ушла ставшая ненужной переменная -`_kbdraw_fakesh`, и оба декодера стали короче (трамплину это на пользу: его -клавиатурный блок упирается в диапазон `jr`). - -Файлы: `libc/irq/_irq_tramp.c`, `libc/kbd/kbd_raw_poll.c`, `libc/kbd/_kbdraw.h`, -`libc/kbd/_kbdraw_state.c`, `libc/kbd/kbd_raw_sync.c`. - -**Чем платим.** Потерянный при Rx-overrun break Shift снять теперь нечем — -модификатор может залипнуть до перенажатия (это старый BUG-KBD-3). Размен -осознанный и решён в ту же сторону, что и раньше в `kbd_raw_sync`: **лучше -залипание, чем отвал** — залипший Shift игрок снимает нажатием Shift, а -сорванный посреди игры Shift в PoP стоит жизни. Вероятность overrun'а сильно -снижена дренажом FIFO опросом из главного цикла (`kbd_raw_poll`, KBD-1). - -**Проверено в MAME после фикса** (карта `_kbdraw_down` при `roomtest`): - -| действие | LSh (байт 2) | стрелки (байт 46) | -|---|---|---| -| зажать LShift | `04` | `00` | -| + зажать ↑ и → | `04` | `30` | -| держать 5 с (автоповтор идёт) | `04` | `30` | -| отпустить Shift, стрелки держать | `00` | `30` | -| отпустить стрелки | `00` | `00` | - -`make size-check`: 70 программ, роста нет. - -**Осталось наблюдением, не багом этой задачи.** В карте изредка остаётся -взведённым бит в PLAIN-половине для кода стрелки (напр. байт 14 бит 4 = -`0x74` «Right без E0»). Это потерянный префикс `E0` — след старого рассинхрона -FIFO. Игру не задевает (движок читает `KBD_RIGHT = EXT|0x74`, то есть -расширенную половину), но если всплывёт — искать здесь. - ---- - - -## BUG-KBD-4 (+ BUG-KBD-3). Shift: сначала залипал, потом стал отваливаться — **ЗАКРЫТ (с поправкой, см. BUG-KBD-5)** - -> **Поправка 2026-08-05.** Вывод «клавиатура обёртывает КАЖДЫЙ расширенный -> код, пока зажат Shift» оказался неверным, и построенный на нём обратный -> вывод («расширенный make без обёртки ⇒ Shift отпущен») убран — он ломал -> Shift вместе со стрелками. Разбор — [BUG-KBD-5](#bug-kbd-5). Проверка -> «пять тапов стрелки подряд» ниже проходила не потому, что вывод был верен, -> а потому что между тапами бит восстанавливал автоповтор самого Shift. -> Актуальное поведение `kbd_raw_sync` — вариант 1 (модификаторы не сбрасываем). - -**Симптом (вторая редакция).** Залипание ушло, но появилось обратное: при -зажатом Shift второй-третий-четвёртый тап стрелки отрабатывал уже не -осторожным шагом, а бегом. Для PoP это ХУЖЕ залипания: игрок рассчитывает -на короткий шаг, а Кид убегает в яму или на пики. - -**Почему обе прежние редакции были неправильны.** Это был размен между -двумя способами «починить» потерю байта при Rx-overrun SIO (FIFO 3 байта): - -1. исключать модификаторы из сброса — потерянный break Shift снять нечем, - Shift залипает навсегда (BUG-KBD-3); -2. сбрасывать всю карту, как DSS (`KBD_Receiver_Overrun` в `KEYINTER.ASM` - чистит и `KEYCTRL`, и `KEY_FLG`) — залипания нет, но Shift сносится - каждым overrun'ом (BUG-KBD-4). - -Причина, по которой вариант 2 бил так часто, замерена: при зажатом Shift -клавиатура обёртывает КАЖДЫЙ расширенный код служебной парой, поэтому тап -стрелки — это не 5 байт, а 10, и overrun почти гарантирован. - -**Что нашлось (замер в MAME, watchpoint на порт данных SIO + чтение карты -`_kbdraw_down`).** Эта самая обёртка — «fake shift» — и есть решение, а не -помеха. Клавиатура шлёт `E0 F0 12` перед расширенным make и `E0 12` после -его break, и шлёт ТОЛЬКО пока Shift реально зажат. Проверено обоими -шифтами: правый обёртывается своим кодом `0x59` (bit 1 байта 11 карты), левый -— `0x12` (bit 2 байта 2). Это непрерывное и прямое свидетельство реального -состояния Shift — единственное доступное, потому что опросить состояние у -PS/2 нельзя, а typematic повторяет только ПОСЛЕДНЮЮ нажатую клавишу, то есть -стрелку, а не Shift. - -**Фикс.** Оба декодера (`libc/irq/_irq_tramp.c`, `libc/kbd/kbd_raw_poll.c`) -читают обёртку в обе стороны: - -- увидели fake shift → реальный Shift ЗАЖАТ → взвести plain-бит (бит кладёт - общий писатель: достаточно обнулить префиксы, и он попадёт в plain-половину - карты как make; в расширенную половину не пишем — это не клавиша); -- расширенный make БЕЗ предшествующей обёртки → Shift ОТПУЩЕН → снять - plain-биты обоих шифтов. - -`kbd_raw_sync` вернулся к исключению модификаторов — теперь это безопасно: -состояние Shift подтверждается независимо от того, что съел overrun, а -залипание снимается первым же нажатием стрелки. - -**Побочно найдена и исправлена своя ошибка** в новом коде `kbd_raw_poll`: -после `bit 1, a` в `A` лежал `pending`, а не скан-код, — обычные -(нерасширенные) клавиши декодировались бы из мусора. Оба декодера приведены -к одной логике. - -**Раскладка трамплина.** Клавиатурный блок перевалил за 127 байт, а `jp` -внутри трамплина запрещён (код копируется в W2 побайтно, абсолютные -само-ссылки сломают копию). Поэтому префиксные обработчики переехали вплотную -к своим `cp`, а посередине тела стоят три ретранслятора (`tr_kbd_hub`, -`tr_hub_notkbd`, `tr_hub_dss`) — до них дотягиваются `jr` и сверху, и снизу. -В `kbd_raw_poll` такого ограничения нет, там три перехода стали `jp`. - -**Проверено в MAME:** - -- Shift зажат, пять тапов стрелки подряд → `LSh` остаётся `04` во всех пяти, - `ovr = 0`, расширенная половина карты чистая; -- штатное отпускание Shift → `LSh = 00`; -- искусственно залипший Shift (бит записан в карту отладчиком) → снимается - ПЕРВЫМ же тапом стрелки; -- `make size-check`: 70 программ, роста нет. - - -## BUG-RESPAWN-2. После respawn стражи остаются мёртвыми — **ЗАКРЫТ** - -**Вопрос из отчёта:** «после respawn — должны ли оживать стражники?» -**Ответ по SDLPoP: да.** Цикл `play_level` (seg003:57) на КАЖДОЙ итерации — -в том числе после смерти Кида — делает `load_level()`, следом `pos_guards()` -(seg003:83), а затем `Guard.charid = charid_2_guard; Guard.direction = -dir_56_none`. То есть стражи — такая же часть данных уровня, как тайлы, и -перезагрузка файла возвращает их всех. - -**Корень у нас.** `gstate_init()` (живая копия таблицы стражей: тайл, -направление, мастерство, поза трупа) вызывался ТОЛЬКО при загрузке уровня. -Рестарт возвращал тайлы (`pop_level_reset_tiles`), но не стражей: в `gstate` -оставался сохранённый `leave_guard`'ом `seq_hi != 0`, и `pop_guard_enter` -поднимал стража трупом с `guardhp_curr = 0`. - -**Фикс.** `pop_level_reset_guards()` (тот же `gstate_init`) + `pop_guard_reset()` -в `pop_start_level`, рядом с `pop_level_reset_tiles()`. Туда же уехал -`pop_loose_mob_reset()` — настоящий `mobs_count = 0` из `start_level`. - -**Проверено в MAME:** комната 21, страж жив (`alive = -1`, hp 3) → убит читом -`K` (`alive = 0`, hp 0) → Кид убит стражем → респавн → возврат в комнату 21: -страж снова `alive = -1`, hp 3. - - -## BUG-DRAWORDER-1. Кид рисовался поверх тела стража — **ЗАКРЫТ** - -**Симптом.** В оригинале Кид проходит ЗА телом убитого стража; у нас — перед ним. - -**Три разных корня, найденные по очереди.** Стоит того, чтобы перечислить: два -первых захода были неполны, и каждый следующий кадр от тестера вскрывал новый -слой. - -1. **Порядок задавался ролью, а не тайлом.** Мы безусловно рисовали - `pop_guard_draw()` → `kid_draw()`, то есть Кид был сверху всегда. В - оригинале никто не «поверх» по определению: оба персонажа попадают в midtable - при обработке СВОЕГО тайла (`set_objtile_at_char`, seg006:13F3), а тайлы - обходятся строго — `redraw_needed_tiles` (seg008:1B06) идёт рядами 2,1,0 и - внутри ряда колонками 0..9; кто позже, тот поверх. Совпали тайлы — решает - `sort_curr_objs` (seg008:203C): ниже по `obj_y` = позже. - Фикс: `guard_over_kid()` в `roomtest.c`. - -2. **Своя же регрессия: Кид полез поверх передних столбов.** Окно fore-клипа - (`pop_fore_set_clip`) одно на всех, и его ставит каждый, кто рисует - персонажа. Пока страж рисовался строго ДО Кида, к моменту - `pop_fore_over_kid` в окне оказывался Кид и всё сходилось само. Как только - порядок стал переменным, при «страж поверх» окно оставалось СТРАЖЬИМ, и - fore-проход Кида отсекался целиком. - Фикс: `kid_fore_clip_restore()` — окно восстанавливается явно, а не - «по счастливому порядку вызовов». - -3. **Колонка трупа была нулевой.** `leave_guard` сохраняет тайл как - `get_tilepos(0, row)`, то есть колонку 0 всегда, а `enter_guard` у нас брал - `curr_col` оттуда и следом перетирал X запомненным значением. В памяти это - было видно прямо: `col=0` при `x=95`. Оригинал (seg002:180) выводит колонку - ИЗ X: `Char.curr_col = get_tile_div_mod_m7(Char.x)`. У живого стража - незаметно (X там сама считается из колонки), у запомненного ТРУПА — ломало - порядок. Колонка нужна не только отрисовке: на неё смотрят коллизия и - `check_can_guard_see_kid`. - -4. **Ветка `actions_1_run_jump` оказалась не «упрощаемой».** Сначала я решил, - что её можно не портировать. Кадр в движении показал `ACT=1`: в беге - оригинал берёт тайл не из `curr_row`/`curr_col`, а из нижнего ряда и ЛЕВОЙ - колонки ГАБАРИТА (`char_bottom_row`/`char_col_left` из `set_char_collision`, - seg006:0723). При беге вправо левая колонка меньше `curr_col` примерно на - тайл — потому бегущий Кид и уходит за объекты справа. Отсюда «некоторые - кадры бега рисовали Кида поверх тела». Считается для ОБОИХ персонажей: - `enter_guard` ставит `action = 1` и стражу, односторонний учёт дал бы - перекос в другую сторону. Тонкость: `char_col_left` берётся по НЕ - утоньшённой границе — поправку THIN оригинал применяет только к `*_coll`. - -**Проверено в MAME:** после возврата в комнату у трупа `col=5` при `x=135` -(было `col=0`); Кид слева от тела — и стоя, и в кадре бега — рисуется за телом; -передние столбы снова перекрывают Кида. - -**Остаток, который НЕ баг.** Ноги стоящего Кида поверх головы трупа, когда он -стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один -тайл при спрайте шире колонки). Сверено в SDLPoP: там так же. Подробности — в -разделе «НЕ БАГИ» выше. - - -## BUG-LOOSE-2. Осколки только от одной из двух падающих плит — **ЗАКРЫТ** - -**Симптом.** Комната 12, соседние падающие плиты (0,1) и (0,2): после -пробежки осколки появляются только на (1,2), на (1,1) — нет. В комнате 7 -(плиты 0,5/0,6 → 2,5/2,6) обе дают осколки. - -**Корень.** Гипотеза автора отчёта подтвердилась чтением кода: Кид уходит в -комнату 15 раньше, чем долетает плита (0,1). Наш падающий кусок был привязан -к ТЕКУЩЕЙ комнате — `pop_loose_reset()` на смене комнаты звал -`pop_loose_mob_reset()` и гасил всё, что ещё летит, а тайл под куском читался -из карты отрисованной комнаты. Кусок уничтожался, `loose_land` не случался, -щебень не клался. В комнате 7 обе плиты успевают сесть до ухода — потому там -и выглядело правильно. - -В оригинале `mobs[]` чистится ТОЛЬКО в `start_level` (seg003:88); `do_mobs` -(seg007:1063) прокручивает все куски независимо от `drawn_room`, `move_loose` -работает по `curmob.room`, а `redraw_at_cur_mob` (seg007:132C) сверяется с -`drawn_room` лишь для ОТРИСОВКИ. - -**Фикс.** У куска появилось поле `room` (`curmob.room`). На смене комнаты -зовётся `pop_loose_mob_room_changed()` — сбрасывает только heal-историю, а -полёт продолжается. Тайл читается через `mob_tile_at()` (своя комната — -`tile_code`, чужая — `pop_level_tile`). Приземление в покинутой комнате пишет -щебень прямо в данные уровня: сигнальная пара `pop_loose_landed`/ -`pop_debris_at` обслуживает только текущую комнату. Отрисовка и -`check_loose_fall_on_kid` (там оригинал начинает с `Char.room == curmob.room`) -— только для своей комнаты. Настоящий `mobs_count = 0` переехал в -`pop_start_level`. - -**Проверено вручную (2026-08-03).** Автоматикой гонку воспроизвести не -удалось: мост MAME шлёт нажатия рывками, и «уйти из комнаты раньше, чем -долетит плита» через него не набирается. Подтверждено живым прогоном. - -Это ровно тот случай, ради которого заведены host-тесты: на уровне логики -проверка занимает несколько строк — заспавнить кусок, сменить комнату, тикать -до приземления, проверить щебень в данных уровня. Стоит первым в -`../docs/host_tests_plan.md`. - - -## BUG-SEAM-DRAW-1. Кид, упершийся в решётку на шве, не рисуется — **ЗАКРЫТ (не воспроизводится)** - -**Как было заведено.** Комната 5: Кид добегает до закрытой решётки (0,9), -решётка его держит, но экран переключается на комнату 1, и в ней Кида не -видно — он стоит на `x = 57..60`, левее кромки комнаты (col 0 начинается с 58). - -**Проверка 2026-08-03.** Не воспроизводится: Кид упирается и встаёт на -`x = 61`, `curr_col = -1`, `room = 1` — и в комнате 1 РИСУЕТСЯ, за решёткой, -как и должен. - -Почему сходится: при `x = 61` персонаж уже внутри системы координат комнаты 1 -(`obj_x = 2*61 − 116 = 6`), поэтому никакого straddle-смещения не требуется и -обычная отрисовка справляется. Отрицательная `curr_col` тут не противоречие — -это правило `get_tile_div_mod_m7`: `(61 − 7 − 58) / 14 = −1`. - -**Что осталось за скобками.** Само переключение экрана штатное: `leave_room` -(seg002:423) уводит вправо при `char_x_right >= 201`, а левая грань решётки как -раз 201 — оригинал в этой позе тоже перелистнёт. - -И остаётся теоретический остаток: при `x <= 60` (`obj_x <= 4`) спрайт уходил бы -за левую кромку и обрезался. В текущей сборке Кид туда не встаёт, поэтому баг -и не воспроизводится. Полное лекарство — довести модель straddle (S3 в -`../docs/room_model_plan.md`): держать `Kid.room` отдельно от `drawn_room` и -рисовать со смещением ±140, как `xpos_in_drawn_room` (seg004:0405). Пока -поводов для этого нет — заводить обратно только по живому наблюдению. - ---- - -# Прогон всех комнат уровней 1 и 2 (пользователь, 2026-08-07) — ЗАКРЫЛ ТРИ РЕВИЗИИ РАЗОМ - -Результат прогона: **крупных багов нет**. Тем самым закрыты и переехали сюда -из `BUGS_OPEN.md` три накопившихся хвоста — чек-листы ручной перепроверки -фиксов, таблица обхода 24 комнат уровня 1 и таблица сырых наблюдений прогона -2026-08-03. Всё, что с прогона 2026-08-07 осталось открытым, — три записи -уровня 2 в [`BUGS_OPEN.md`](BUGS_OPEN.md) (BUG-GUARD-COLOR-1, -BUG-GUARD-SPLASH-1, BUG-CHEAT-FIGHT-1); ни одна из них не мешает играть. - -Сырые формулировки пользователя лежат рядом: [`bugs_level1.md`](bugs_level1.md) -и [`bugs_level2.md`](bugs_level2.md). - - -## Ручная перепроверка фиксов (2026-08-03) — ПРОЙДЕНА - -Шесть корней прогона 2026-08-03 были закрыты автоматической проверкой в MAME -(мост `mame-z80`: чтение `_Kid`, потиковые трассы, скриншоты) — этого хватает, -чтобы показать, что конкретный сценарий больше не воспроизводится, но НЕ -хватает, чтобы поймать регрессии в соседней механике. Отсюда список сценариев -ровно в тех формулировках, в которых баги были заведены. Прогон 2026-08-07 -прошёл все комнаты уровней 1 и 2 и ни одного из этих симптомов не показал. - -| # | что проверялось | ожидаемо | -|---|-----------------|----------| -| 1 | комната 22: выпить зелье (0,6), выйти в 16/23 и вернуться | кувшина нет, пузырька над пустым местом нет | -| 2 | то же для комнат 14 (0,5) и 17 (2,3) | так же | -| 3 | комната 15: подобрать меч (2,2), выйти и вернуться | меча нет; кладка на дальней стене НЕ мигает | -| 4 | комната 12: разбить плиты (0,1)/(0,2) и потолок в 16, выйти-вернуться | остаются разбитыми, проём не закрывается | -| 5 | комната 17 из 23: разбить (1,5)/(1,6), выпить зелье (2,3), вернуться | всё остаётся | -| 6 | **после смерти** зайти в те же комнаты | ВСЁ восстановлено (в оригинале смерть = `load_level`) | -| 7 | комната 12: разбег в закрытую решётку (0,9) с полушага | не проходит насквозь; перелистывание экрана штатно (см. BUG-SEAM-DRAW-1) | -| 8 | комната 6: бег справа налево от (0,9), длинный прыжок (0,6)→(0,7) | не влетает внутрь стены | -| 9 | комната 5: с кнопки (0,6) падение на (2,7), присед, вставание | остаётся в комнате 5 (проверено трассой: `fr=111 x=177` → `seq_47` → `fr=15 x=173`) | -| 10 | комната 5: нажать кнопку (0,4) | поднимаются ОБЕ решётки — (0,5) видно на экране, (0,9) проверять из комнаты 1 | -| 11 | страж (комнаты 3, 21) убивает Кида | смерть доигрывается, респавн в стартовой позиции уровня; цикла «убил-воскрес» нет | -| 12 | клавиатура: долгая игра с Shift+стрелка | ↑ и Shift не залипают; осторожный шаг не превращается в бег | -| 17 | **[BUG-KBD-4]** долго играть Shift+стрелка, много тапов подряд | Shift не «отваливается»; если однажды залипнет — снимается первым же нажатием стрелки | -| 18 | **[BUG-RESPAWN-2]** убить стража (комнаты 3/21), умереть, вернуться в ту же комнату | страж снова жив, стоит на исходном тайле, HP полные | - -Отдельно смотрели **регрессии от порта `check_collisions`** — он трогает всю -горизонтальную коллизию: бамп в стену на бегу и в прыжке, осторожный шаг у -стены, проход через ОТКРЫТЫЕ ворота, разворот в проёме решётки, переходы через -швы (старый BUG-SEAM-PINGPONG). Не всплыло. - - -## Обход всех 24 комнат уровня 1 — ЗАКРЫТ прогоном 2026-08-07 - -Инструмент: `#define ROOMNAV` в `roomtest.c` — `+`/`-` (цифровой блок либо -`=`/`-` основного ряда) переключают комнату по номеру (1..24, с обёрткой), -Kid ставится на первый пол. Номер комнаты — полосками в верхнем борте: слева -десятки, справа единицы (`||` `||||` = 24). Инструмент остаётся в сборке: -он же нужен для приёмки уровня 3. - -Таблица заполнялась по ходу отладки и осталась незакрытой на 19 строк из 24; -её закрыл ручной прогон всех комнат уровней 1 и 2 (2026-08-07, крупных багов -нет). Ниже — то, что таблица успела зафиксировать: это не «отчёт по -комнатам», а разбор корней, полезный при похожем симптоме. - -| комната | статус | что не так | -|---------|--------|------------| -| 1 | пофикшено | падающая плита (2,6): правая грань видна через пол (2,7) и перекрывает его переднюю грань — `mob_render` брал ряд соседа из `m->row` (счётчик, уже ушедший на ряд вперёд), а не из координаты | -| 5 | пофикшено | прыжок в решётку: Kid оставался стоять на 6 px ВЫШЕ пола и без приземления-приседания — от `bumped()` (seg004) был портирован только хвост (`seq_47`), не хватало `bumped_floor` (прижатие Y к полу + `seq_46_hardbump` на кадрах прыжка 24/25/40..42/102..106) и `bumped_fall` | -| 9 | сделано | дверь уровня (1,3)-(1,4) рисовалась чёрным проёмом: не был портирован `draw_leveldoor` (seg008:1D29) — створка (слайсы 33 + верх 34), лестница за ней (99/144) и анимация подъёма по кнопке (`animate_leveldoor`, seg007:05F1, modif 0→43). Спрайты 33/34/99/144 добавлены в атлас явным набором (render_room.py дверь не рисует) | -| 12 | пофикшено | вис/подтягивание на кромке loose-плиты: плита рисовалась ПОД Кидом. Не хватало двух кусков `draw_tile`: (а) `draw_loose` кладёт нижнюю грань плиты И в foretable (поверх персонажа), (б) `draw_tile_base` подставляет верх плиты из `loose_fram_left`, а в нашем midtable-оверлее стоял голый `base_id` (у loose он 0). Голова Кида поверх падающей на него плиты — см. «НЕ БАГИ» выше | -| 15 | сделано | меч (2,2) не рисовался: тайл 22 в draw_tile_anim не был портирован. Добавлены отрисовка предмета (chtab_1 id 10/11 на draw_main_y−3), подъём по Shift (check_get_item/get_item/do_pickup: присед → seq_91 pickupsword → меч исчезает с пола) и статус `pop_have_sword` | -| 13, 18, 24 | недостижимы в игре | свойство данных уровня, разбор — «НЕ БАГИ» выше | - - -## Сырые наблюдения (прогон 2026-08-03) → корень - -Одиннадцать формулировок с прогона свелись к шести корням; все шесть закрыты -и проверены в MAME — разборы выше по файлу. - -| # | наблюдение (кратко) | корень | -|---|---------------------|--------| -| 1 | кувшин выпит, а пузырёк рисуется / кувшин возвращается (14, 22, 17) | BUG-LVLSTATE-1 | -| 2 | меч возвращается в 15 / мигает контур кладки | BUG-LVLSTATE-1 | -| 3 | комната 12: пробегает сквозь закрытую решётку (0,9) | BUG-COLL-1 | -| 4 | после respawn плиты остаются разбитыми, зелья выпитыми | BUG-RESPAWN-1 | -| 5 | плита/зелье возвращаются и БЕЗ respawn (12→16, 17, 22) | BUG-LVLSTATE-1 | -| 6 | комната 6: длинный прыжок (0,6)→(0,7) — влёт в стену, респавн | BUG-COLL-1 | -| 7 | залипает ↑ | BUG-KBD-3 | -| 8 | залипает Shift | BUG-KBD-3 / BUG-KBD-4 (поправка — BUG-KBD-5) | -| 9 | комната 5: кнопка (0,4) не открывает решётку (0,5) | BUG-GATE-ANIM-1 | -| 10 | комната 5: с кнопки (0,6) на (2,7), присед — провал в комнату 6 | BUG-STANDUP-1 | -| 11 | страж убил Кида → Кид воскресает на месте и его убивают снова | BUG-DEATH-1 | - -Вторая волна того же прогона (вечер) дала ещё четыре наблюдения — BUG-KBD-4, -BUG-RESPAWN-2, BUG-DRAWORDER-1, BUG-LOOSE-2, — все закрыты, разборы выше. -Тогда же закрыт как невоспроизводящийся BUG-SEAM-DRAW-1 и заведён -BUG-GATE-PASS-1 (он закрыт ниже, 2026-08-09). - ---- - - -## BUG-GUARD-SPLASH-1. Нет «брызг» при попадании по стражу — **ЗАКРЫТ 2026-08-07** - -**Как было заведено (пользователь, 2026-08-07).** При попадании по стражу -должен рисоваться сплеш («звёздочка»), чтобы игрок видел, что удар дошёл до -цели, не переводя взгляд на полосу HP. У Кида такое есть, у стража — нет. - -**Корень.** `draw_hurt_splash` (seg006:16CE) в оригинале зовётся ИЗ ДВУХ -мест: `draw_kid` при `hitp_delta < 0` (seg008:1643) и `draw_guard` при -`guardhp_delta < 0` (seg008:1654). У нас была портирована только первая -половина — `kid_draw_splash()`; для стража вызова не было вовсе, хотя -`guardhp_delta` считался и уже использовался. - -**Фикс** (`pop_guard.c`, `pop_gdraw.c`, `roomtest.c`): - -- флаг `pop_guard_hurt` — симметрия `pop_kid_hurt`: ставится в - `pop_do_delta_hp`, когда `guardhp_delta < 0`, снимается главным циклом - после отрисовки (стража могло не оказаться в отрисованной комнате — - тогда брызги просто пропадают, как в оригинале); -- отрисовка — ВНУТРИ `pop_guard_draw`, между спрайтом стража и клинком: - `draw_guard` кладёт брызги в objtable сразу после стража и ДО клинка, а - порядок записей задаёт порядок рисования. Заодно это решает fore-слой: - `pop_fore_over_char` в конце той же функции накрывает и брызги; -- спрайт — `chtab_5_guard` `obj_id = 1`, то есть **image 1 нашего атласа - стража** (`res752.png`, звезда 28×26): у `add_midtable` аргумент - `obj_id + 1`, а `get_image` вычитает единицу обратно — тот же off-by-one, - что расписан в шапке `pop_pack_guard.py`. У Кида это image 218; -- смещения — три ветки оригинала: кадр 178 (chomped) брызг не даёт вовсе; - 185 и 106..110 (смерть/падение) — `obj_y + 4`; 177 (пики) — сдвиг НАЗАД - на 5; иначе `obj_y − 11` (у Кида 15: `((charid == kid) << 2) + 11`); -- свой прямоугольник heal по страницам (`qx_l/qvalid`) — брызги живут один - кадр, но стирать их обязана та страница, в которую рисовали. - -**Побочно исправлено:** `pop_kid_hurt` взводился при ЛЮБОЙ ненулевой дельте -HP, поэтому зелье здоровья (+1) давало Киду и брызги, и красную вспышку. -И `draw_kid` (seg008:1643), и `flash_if_hurt` (seg003:785) смотрят именно -`hitp_delta < 0` — условие приведено к оригиналу. - -**Проверено в MAME (2026-08-07)**, мост `mame-z80`, уровень 1, комната 21, -живой страж (HP 3/3): - -``` -bp 51BA ← адрес снятия pop_guard_hurt в main: срабатывает ТОЛЬКО - в кадре удара, то есть уже после отрисовки брызг -key k ← чит «убить стража» = guardhp_delta < 0 -→ state=stop PC=0x51BA, guardhp: curr=0 max=3 delta=0 hurt=1 -bp 8BDF (_gfx_set_visible_page) + out ← домотать до флипа страницы -snap ← звезда нарисована поверх стража -``` - -Следующие два кадра (обе страницы дабл-буфера) — чисто, следов брызг нет. - -Приём на будущее: снятие флага сделано **по факту** (`if (pop_guard_hurt) -pop_guard_hurt = 0;`), а не безусловно — это и экономит запись каждый кадр, -и даёт готовую точку останова для отладки в MAME. Условные брейкпоинты -мост не принимает (`bp ADDR cond` вешает плагин), поэтому точка останова, -срабатывающая сама по себе только в нужном кадре, — рабочий обходной путь. - -**Цена:** `_CODE` 24 179 → 24 209 (+30 Б резидента), BANK4 (`pop_gdraw`) -2407 → 3369 (+962 Б, банк занят на 20.6 %, свободно 13 015 Б). - -**Цвет брызг** зависит от палитры стража (слоты `0x90..0x9F`), поэтому он -изменится вместе с [BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1) — -отдельной работы не требует. - - ---- - - -## BUG-GATE-PASS-1. Проход сквозь закрывшуюся решётку — **ЗАКРЫТ 2026-08-09** - -**Приёмка:** смоук-прогон уровня 1 (пользователь, 2026-08-09) — с проблемного -`x` Кид больше сквозь решётку не пробегает, пинг-понг у шва не вернулся. - -> **ВОСПРОИЗВЕДЁН И РАЗОБРАН.** Сценарий: уровень 1, комната 8, ряд 0, -> `Kid.x = 170`, лицом ВПРАВО, решётка шва (комната 8, колонка 9) ЗАКРЫТА. -> Разбежаться вправо и НЕ ОТПУСКАТЬ клавишу. Кид проходит сквозь решётку и -> убегает вглубь комнаты 6. -> -> Ниже — новый разбор; всё, что было раньше (гипотеза про x > 205), не -> подтвердилось и оставлено в конце для истории. - -### Корень: история флагов коллизии индексируется НЕ ТАК, как в оригинале - -Сняты две трассы — наша (брейкпоинт на резидентном `kid_tick`) и оригинала -(SDLPoP, собран с `POP_TRACE=1`, печать в `play_kid_frame` + маркеры в -`bumped` и `exit_room`). Стартовая позиция совпала до пикселя, поэтому -сравнение построчное. - -**Оригинал:** - -``` -LEAVE dir=1 x=61 cxl=184 cxr=201 room=6 смена комнаты — ШТАТНАЯ -BUMPED dx=-2 push=-1 x=63 tile=4 col=9 и СРАЗУ бамп о решётку, откат -KID f=15 x=60 act=0 col=-1 room=6 drawn=6 сел за решёткой, стоит -``` - -**Мы:** - -``` -x 170 -> 196 бегом, col 7 -> 8 -> 9, НИ ОДНОГО бампа -x=198 -> room 8 -> 6 -при удержании ВПРАВО доезжает до col 1 комнаты 6 и бежит дальше -``` - -Смена комнаты в этой точке правильна и у нас, и у оригинала: `leave_room` -(seg002:423) вправо блокируют ТОЛЬКО `doortop`-тайлы, решётки в списке нет, а -порог `char_x_right >= 201` совпадает с плоскостью ворот -(`x_bump[9+FIRST_ONSCREEN_COLUMN] + TILE_MIDX + wall_dist_from_left[1]` -= 191 + 10). Оригинал полагается не на запрет ухода, а на бамп СРАЗУ ПОСЛЕ -перехода. - -**Почему бамп есть у них и нет у нас.** `check_collisions` (seg004:0004) -хранит флаги так: - -```c -row_coll_flags_ptr[tile_col] = curr_flags; // индекс — колонка В РАЗРЕШЁННОЙ комнате -row_coll_room_ptr [tile_col] = curr_room; // и рядом — НОМЕР ЭТОЙ КОМНАТЫ -... -if (curr_row_coll_room[column] >= 0 && - prev_coll_room[column] == curr_row_coll_room[column]) { /* только тогда сравниваем */ } -``` - -То есть история привязана к паре **(колонка внутри своей комнаты, комната)**. -Решётка комнаты 8 и до перехода, и после лежит в слоте 9 с `room = 8` — -переход 8->6 историю НЕ рвёт, переход флага 0->1 виден, бамп срабатывает. - -У нас массив `coll_prev/coll_curr` индексируется колонкой ОТНОСИТЕЛЬНО -отрисованной комнаты (−2…11). При смене комнаты все индексы уезжают на 10, -сопоставить прошлый кадр с текущим нечем, и `enter_room` вынужден звать -`pop_coll_invalidate()`; тот ставит «прошлые флаги = уже перекрывал» (3), то -есть ПОДАВЛЯЕТ бамп на кадре входа. А к следующему кадру Кид уже за -плоскостью ворот — перехода 0->1 не будет никогда. - -### Фикс сделан 2026-08-09 (вариант B — сдвиг истории), ЖДЁТ ПРИЁМКИ В MAME - -Рассматривались два пути: - -- **A, дословный порт.** 10 слотов + параллельный массив номера комнаты, - индекс по колонке разрешённой комнаты, бамп только при совпадении номеров; - `pop_coll_invalidate()` тогда не нужен вовсе. **Не взят:** оригиналу - хватает десяти слотов только потому, что он перебирает узкое окно вокруг - Кида, а мы намеренно считаем все четырнадцать колонок (FIX_COLL_FLAGS, - чтобы не оставалось протухших ячеек) — при таком переборе колонки −2/−1 и - 8/9 сядут в одни слоты 8/9. То есть A тянет за собой ещё и сужение окна. -- **B, сдвиг истории (сделано).** Индексацию оставляем свою, но при - БОКОВОМ переходе историю не выбрасываем, а перенумеровываем на 10 слотов: - `check_leave` двигает `x` ровно на ∓140 = 10 тайлов, координата грани - (`pop_x_bump`) едет на те же 140 вместе с габаритом Кида, значит сами - флаги инвариантны — меняется только номер слота. - -Реализация: `pop_coll_shift(int8_t dcol)` в `pop_map.c` сдвигает -`coll_curr/above/below` (не `prev` — его на следующем кадре всё равно -перезапишет `move_coll_to_prev`), освободившиеся слоты = 3 («уже -перекрывал», бампа нет — ровно то, что в оригинале даёт несовпадение номера -комнаты). `enter_room_side` зовёт её сразу после `pop_map_set_edges`: -`side == 0` (ушёл влево) → `+10`, `side == 1` (вправо) → `−10`. Переходы -вверх/вниз и все прочие входы в комнату остаются на полной инвалидации — -там колонки не сдвигаются, но тайлы под ними уже из другой комнаты. - -Расхождение с дословным вариантом A записано в `../docs/impl_diff.md` (D-1). - -**Осторожно:** это сердце коллизии, вокруг которого разбирался -BUG-SEAM-PINGPONG (см. `BUGS_CLOSED.md`). Приёмка: - -1. Комнаты 6 ↔ 8 уровня 1, закрытая решётка, **обе** стороны. -2. Мелким шагом (упереться) И с разбега (не пройти насквозь) — сценарий - выше воспроизводится с `Kid.x = 170`, комната 8, ряд 0, лицом вправо. -3. Пинг-понг у шва не вернулся (экран не перескакивает туда-сюда). -4. `make -C tests-host` — прошли все 5 наборов (2026-08-09). - -**Инструмент для сверки готов:** SDLPoP собран с трассой, включается -`POP_TRACE=1` (правки в `seg000.c` play_kid_frame, `seg004.c` bumped, -`seg002.c` exit_room, чтение переменной — `main.c`). Сборка на macOS: -`make CFLAGS="-std=gnu99 -O2 -I/opt/homebrew/include -Wno-implicit-function-declaration" LIBS="-L/opt/homebrew/lib -lSDL2 -lSDL2_image"` -(в системе нет pkg-config, штатный Makefile без этого не собирается). - ---- - -### История: прежний разбор (гипотеза НЕ подтвердилась) - -**Статус: наблюдался один раз (2026-08-03), воспроизвести не удалось ни -тогда, ни прогоном всех комнат уровня 1 (2026-08-07).** Заведён, чтобы -наблюдение не потерялось; закрывать нельзя — ни как исправленный, ни как -«не баг», пока нет надёжного сценария. Оговорка: BUG-GATEMOD-1, из-за -которого решётка стартовала не в том состоянии, с тех пор закрыт, и -наблюдение могло быть его следствием. - -**Что наблюдалось.** Комната 5: Кид стоял НА тайле решётки (0,9) -и ждал, пока она опустится. После закрытия пошёл вправо — прошёл в комнату 1 -и упал на (1,1). - -**Что уже измерено и в чём загвоздка.** Сразу после наблюдения повторить не -получилось: в том же месте Кид стоит на `x = 196`, `col = 9`, и решётка его -ДЕРЖИТ — то есть штатно. - -Арифметика оригинала объясняет разницу. `is_obstacle` (seg004) ставит -плоскость блокировки в `x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX`, для -колонки 9 это **x = 205**. При этом «колонка 9» по `get_tile_div_mod_m7` — -это `x ∈ [191, 205)`. Пока `curr_col == 9`, Кид гарантированно левее -плоскости и обязан блокироваться; чтобы пройти, он должен оказаться **правее -205**, то есть уже на дальней стороне решётки, — и тогда уход вправо законен: -решётка закрылась у него за спиной, в оригинале она блокирует плоскость, а не -весь тайл. - -Отсюда рабочая гипотеза: в момент наблюдения Кид стоял правее 205 (успел зайти -по тайлу дальше, пока решётка была поднята), и поведение штатное. Но повторить -эту позу и снять `x` пока не удалось, поэтому гипотеза НЕ подтверждена. - -**Что снять в следующий раз** (без этих чисел вопрос не закрыть): - -1. `Kid.x` и `Kid.curr_col` в момент, когда решётка уже закрылась, а Кид ещё - стоит на её тайле — до шага вправо; -2. модификатор решётки (openness) комнаты 5, тайл 9 — `can_bump_into_gate()` - считает её препятствием только пока `(modif >> 2) + 6 < char_height`, то - есть пока она опустилась достаточно низко относительно РОСТА кадра; -3. `Kid.x` покадрово на самом шаге вправо — где именно перестал блокировать. - -Быстрый способ снять первое: отладочный стоп-кадр (**1** заморозить, **2** -продолжить), затем чтение `_Kid` из отладчика MAME; подгонка позы по пикселю — -читы `[`/`]`. - -**Возможный корень, если гипотеза не подтвердится.** Проверка идёт по колонке, -которая на шве уже принадлежит СОСЕДНЕЙ комнате (`curr_row_coll_room[]` в -оригинале); у нас межкомнатная коллизия на шве — исторически проблемное место -(ср. закрытый BUG-SEAM-PINGPONG). Второй кандидат — `char_height` в -`can_bump_into_gate()`: если он берётся не от того кадра, решётка может -перестать считаться препятствием раньше времени. - ---- - -## BUG-TORCH-CHOMP-2. Застывший чомпер накрывается пламенем факела — ЗАКРЫТ 2026-08-10 - -Симптом (уровень 4, скриншот пользователя): пока чомпер щёлкает, всё в -порядке; как только его анимация кончается, пламя соседнего факела ложится -ПОВЕРХ челюстей. - -Регрессия от фикса [BUG-TORCH-CHOMP-1](#bug-torch-chomp-1): там пламя -перевели на ЗАПЕКАНИЕ в фон (`GFX_BANK_NORMAL`), чтобы `heal` соседнего -чомпера не съедал огонь. Аргумент «запекать безопасно, кадры пламени -самонакрываются» верен для СОБСТВЕННЫХ пикселей факела, но не для чужой -графики в той же ячейке: пламя рисуется в клетке ПРАВОГО СОСЕДА -(`x = (col+1)*32 + 8`, seg008:560), и если сосед — чомпер, огонь ложится на -его челюсти. Пока trob чомпера жив, `pop_set_redraw(tp, POP_RD_CHOMP, ...)` -возвращает их поверх каждый кадр; как только анимация кончилась и trob -умер, возвращать стало нечем. - -**Как это устроено в оригинале** (и почему у него бага нет). -`animate_torch` (seg007:0241) заканчивается вызовом `set_redraw_anim_right()` -— он метит `redraw_frames_anim` у ПРАВОГО СОСЕДА (seg007:0101). А -`redraw_needed` (seg008:0178) рисует помеченный слой строго в порядке - -``` -draw_tile_anim_topright(); -draw_tile_anim_right(); <- пламя ЛЕВОГО соседа (факела) -draw_tile_anim(); <- СВОЯ графика тайла: челюсти чомпера -``` - -То есть челюсти возвращаются поверх огня **каждый кадр факела**, независимо -от того, жива ли собственная анимация чомпера. У нас пламя рисуется -напрямую из `pop_process_trobs`, минуя механизм пометок, — этой второй -половины не было. - -**Фикс** (`pop_trob.c`): после `pop_torch_draw` метим правого соседа -`pop_set_redraw(tp + 1, POP_RD_CHOMP, 1)`, если там чомпер. Одна страница: -факел анимируется каждый кадр, значит обе страницы дабл-буфера получат свою -перерисовку по очереди. Порядок сходится сам — блок факелов стоит ДО -`pop_redraw_needed`. Код соседа читается в том же префетче кодов тайлов -(`trob_rcode[]`), чтобы не свапать W0 второй раз за кадр. Банк 6: +104 Б. - -**Осознанное расхождение** — оригинал метит соседа БЕЗУСЛОВНО, мы только под -чомпера. Безусловная пометка = перерисовка тайла каждый кадр на каждый -факел; слой `draw_tile_anim` рисует ещё пики, зелье и меч (seg008:0644), -поэтому теоретически «застыть под пламенем» могут и они — заведено открытым -в `BUGS_OPEN.md` (TORCH-ANIM-RIGHT). На уровнях 1–4 такого соседства не -встретилось. - ---- - - -## T-2. Idle-skip — **ЗАКРЫТ 2026-08-08** - -Сделан как шаг 1 задачи [DRAW-COST](TASKS_OPEN.md#draw-cost) (коммит -`a25ce58`), и шире, чем формулировался здесь: пропускается не только Кид, а -ЛЮБОЙ персонаж, у которого с прошлой отрисовки этой страницы дабл-буфера не -изменился ни один вход отрисовки, — включая труп стража и ждущего стража. -Условие «обе страницы уже получили это состояние», которого требовала эта -запись, выполнено само собой: снимок входов хранится ПО СТРАНИЦАМ. - -Замер: комната 1.3 с трупом стража, Кид стоит — 210 % -> 116 % кадрового -периода, ноль вызовов `pop_heal_fast` за кадр. Контракт — шапка -`pop_cdraw.h`, разбор и что делать дальше — `TASKS_OPEN.md#draw-cost`. - -Связь с T-1 сработала как и предсказано: пока Кида не перерисовываем, heal'а -нет, стирать пики нечем. Но T-1 остаётся открытым — трогать пики -безусловно мы всё ещё продолжаем, когда Кид рядом ДВИЖЕТСЯ. - ---- - - -## MIRROR-FG-STALE. Зеркало и снимок комнаты — **НЕ БАГ, закрыт 2026-08-11** - -Заводился как краевой случай от [L4-MIRROR](TASKS_CLOSED.md#l4-mirror): -`place_mirror` (`pop_trob.c`) пишет тайл зеркала в ДАННЫЕ УРОВНЯ -(`pop_level_set_tile`), а коллизия работает со СНИМКОМ комнаты `room_fg`, -который `pop_room_load` делает при входе в комнату. Опасение: если тайл -поставлен, пока игрок УЖЕ в комнате 4, снимок останется старым и зеркало -будет невидимо для коллизии — Кид пробежит сквозь него, тень не родится. - -**Проверка пользователем (2026-08-11), чит ROOMNAV:** нажал кнопку открытия -двери, телепортировался в комнату 4 — **зеркала не было вовсе**; вышел из -комнаты и вошёл обычным путём — зеркало появилось и **непроходимо, кроме -правильного прыжка**, то есть коллизия видит его корректно. - -**Вывод: сценария нет.** Тайл ставится в момент, когда дверь ДОРИСОВАЛА -открытие (`animate_leveldoor`, переход `pop_leveldoor_open` 0/2 → 1, 43 -тика анимации) — телепорт успевает раньше, поэтому «постановки при игроке в -комнате» в этом прогоне не случилось вообще. А при обычном входе комната -рисуется целиком из данных уровня и `room_fg` снимается заново — графика и -коллизия согласованы по построению. - -**Решение пользователя:** телепорт по комнатам — ОТЛАДОЧНЫЙ режим; в реальном -прохождении дверь выхода стоит не в комнате зеркала, игрок физически не может -быть там в момент постановки, и зеркало с тенью появляются всегда штатно. -Чинить нечего. - -**Если симптом всё же всплывёт** (например, появится мод/уровень, где кнопка -и зеркало в одной комнате): лечение — обновлять в `place_mirror` не только -данные уровня, но и живую карту (в `pop_map.c` уже есть внутренние точки -записи `g_fg[tilepos]`, нужна публичная «поставить тайл в текущей комнате»). - ---- - -## SEAM-BUTTON-STALE. Кнопка в шве не меняла вид при нажатии/отжатии — ЗАКРЫТ - -> **Симптом (пользователь, 2026-08-11, уровень 5).** Кнопка нижних ворот -> комнаты 24 стоит в шве: в комнате 11 это (1,9), в комнате 24 — (1,−1). -> «Нажали её из комнаты 11, она проанимировалась — зайдя в 24, она ВСЕГДА -> нарисована нажатой, хотя по статусу отжимается. Не нажимали, вошли в 24 и -> наступили — ворота открываются, а визуально кнопка остаётся отжатой.» - -**Корень.** Change-driven редрой шва (`seam_sig` в `roomtest.c`) сравнивал -`room_modif` колонки 9 соседа. У кнопки `modif` — это ИНДЕКС LINKLOC, -константа уровня; само нажатие живёт в `doorlinks2` -(`get_doorlink_timer`, seg007:0BB6 — младшие 5 бит). Изменение в сигнатуру -не приходило НИКОГДА, редрой не заказывался, и шов оставался нарисованным -таким, каким был на входе в комнату — отсюда оба симптома сразу. - -Видимой разницу делает `draw_tile`: нажатый opener рисуется как ПОЛ -(порт `get_tile_to_draw`, seg008:253 — `pop_room.c:256`), а у пола правая -грань есть, у кнопки её нет. - -**Фикс.** `seam_row_sig()` (roomtest.c) подмешивает в сигнатуру ряда бит -«кнопка нажата» для тайлов `0x0F`/`0x06`. Оригинал шов в этом случае не -перерисовывает вовсе (`get_trob_pos_in_drawn_room` возвращает 30 для чужой -комнаты) — осознанное расхождение, записано как D-2 в -[`../docs/impl_diff.md`](../docs/impl_diff.md). - -Цена: резидент +200 Б (`_CODE` 24 739 → 24 939), куча W2 1795 → 1595 Б. - -**Проверено (пользователь, 2026-08-11):** «кнопка теперь отрисовывается -правильно в обоих случаях» — оба направления — нажать из комнаты 11 и войти в 24; -войти в 24 поверху и наступить на кнопку, стоя в шве. Картинка кнопки -обязана совпадать со статусом ворот. - ---- - ---- - - -## BUG-POTION-STRIPE. Узор паласа пропадал на месте выпитого зелья — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11, уровень 5).** «На стенке паласа есть -узор — синяя в цветочек полоса, она запекается в фон и должна быть всегда. -Но если на её фоне Кид (или Тень) выпивает зелье — полоса пропадает.» -Воспроизведено в комнате 14 (два зелья в ряду 2, колонки 4 и 5): после -каждого глотка узор исчезал в ячейке СПРАВА от выпитого тайла и **не -возвращался даже после выхода из комнаты и повторного входа**. - -**Корень.** У оригинала `curr_room_tiles` — это сама таблица уровня, поэтому -`curr_room_tiles[curr_tilepos] = tiles_1_floor` в `do_pickup` (seg006:1671) -виден всем в тот же миг. У нас `fg` живёт в ДВУХ местах — буфер отрисовки -(`g_fg`) и EMM-страница уровня, — и страницу правил главный цикл ПОЗЖЕ в -кадре, уже после `pop_process_trobs`. - -В этот зазор успевал проснуться trob поднятого зелья: код тайла он читает из -страницы уровня (`pop_level_tile_raw`), там ещё зелье — и `animate_potion` -крутил фазу пузырька поверх только что обнулённого модификатора, -`bubble_next_frame(0)` = **1**. Модификатор оставался единицей навсегда -(`room_modif` персистентен, `room_seen` не даёт переинициализации). - -Дальше срабатывало правило самого оригинала: для ПОЛА в паласе `modif == 1` -означает «узор не рисовать» — `if (num == !!level_type) return;` -(seg008:499, у нас `pop_room.c:322`). Отсюда и «не лечится перезаходом». - -**Как подтверждено (MAME, чтение памяти, а не рассуждение):** буфер тайлов -комнаты (`0xA342`) после подбора — `01` = пол на обеих позициях, всё верно; -а в модификаторах на позициях 24 и 25 стояли `01 01`. - -**Фикс.** `do_pickup` (`pop_map.c`) ставит тайл в странице уровня СРАЗУ -(`pop_level_set_tile`). Тогда trob того же кадра уходит в `default` и -снимается (`type = −1`), модификатор остаётся нулём. Дублирующая запись из -главного цикла убрана. Тем же фиксом лечится МЕЧ: там `animate_sword` -делал `--mod[tp]` из нуля и получал 255. - -**Проверено (пользователь, 2026-08-11):** «узор теперь на месте». - -**Ложный след, для протокола:** первым подозреваемым был `pop_floor_bake` — -после подбора он чистит `bar` шириной 60 px при 64-пиксельной колонке, и -уцелевший хвостик узора в 4 px выглядел как его подпись. Отвергнуто -перезаходом в комнату: полная перерисовка идёт мимо `bake`, а узор всё -равно не появлялся. - ---- - - -## SHADOW-FIGHT-L5. Кид и Тень вставали в боевую стойку в комнате с зельем — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Тень выходит и пьёт зелье -штатно, но если Кид успевал подняться в ряд 0, пока она пьёт: (а) Кид -доставал меч, (б) Тень тоже вставала в боевую стойку и **рисовалась -спрайтами стража**. - -**Корень.** В `pop_check_can_guard_see_kid` (порт `check_can_guard_see_kid`, -seg003:702) первым множителем стояло `Guard.charid != 0`, тогда как оригинал -пишет: - -```c -if ((Guard.charid != charid_1_shadow || current_level == 12) && ... -``` - -То есть ТЕНЬ — боевой персонаж только на 12-м уровне; на 4/5/6 она Кида «не -видит». Это не косметика: `can_guard_see_kid >= 2` разворачивается в оба -симптома через одну ветку `control_standing` (seg005:352) — Кид достаёт меч -сам, а Тень с `charid 1 < CHARID_2_GUARD` и убранным мечом идёт в -диспетчере `pop_control` ТОЙ ЖЕ веткой, что и Кид; с кадра 150 боевые кадры -лежат в атласе стража. - -**Фикс.** Порт условия целиком + возвращён пропущенный множитель -`Guard.direction != dir_56_none` (им оригинал гасит выключенного -персонажа). Константа `SHADOW_FIGHT_LEVEL` в `pop_guard.h`. - -**Проверено (пользователь, 2026-08-11):** тень выпивает и уходит, боя нет. - ---- - - -## BUG-LATTICE-DOORTOP. Чёрная дыра на месте арки у ворот — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Уровень 5, комната 12, тайл -(0,9): чёрный квадрат вместо арки. - -**Корень.** `draw_tile_base` (seg008:622) начинается со СПЕЦСЛУЧАЯ, которого -у нас не было: - -```c -if (tile_left == tiles_26_lattice_down && curr_tile == tiles_12_doortop) { - id = 6; // Lattice + door A - ybottom += 3; -} -``` - -У `doortop` своей базы нет (`base_id == 0`), поэтому рядом с аркой пара -«арка + верх двери» рисуется ОДНИМ спрайтом 6, опущенным на 3 px. Без -ветки тайл не рисовал ничего, кроме полоски `bottom_id` 85 (32×4). - -**Фикс.** Ветка добавлена в `pop_room.c` (draw_tile) И в -`toolchain/render_room.py` — последнее обязательно: `pop_pack_bg.py` -собирает атлас по обходу `render_room`, поэтому без правки скрипта спрайт 6 -просто не попал бы в `pop_env*.atl` (см. memory `pop_atlas_dynamic_ids`). - -**Как найдено — методика, годная для любого «не так нарисовано»:** - -1. `./prince megahit --screenshot-level` в SDLPoP рисует карту ВСЕГО - уровня (комнаты разложены по `roomxs`/`roomys`, клетка 320×192). -2. Вырезать нужную комнату и совместить со снимком MAME перебором смещения - (у нас совпало на `crop(101, 50, +640, +192)`, масштаб 2×1). -3. Разница по порогу яркости даёт карту расхождений: до фикса — белый - прямоугольник ровно в (0,9) и 1892 пикселя, после — 995 (Кид, факел, - статус-полоса, то есть динамика). -4. Что именно рисует оригинал в тайле — трасса `POP_TRACE_BT=1` (печать в - `add_backtable`, `src/seg008.c`, выводит room/row/col/id/размер). Она - сразу показала `id=6 w=32 h=63` рядом со «своим» `id=85 w=32 h=4`. - ---- - - -## BUG-BELOWROW-WALL. Жёлтые треугольники в шахте падения — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Уровень 6, комната 3 (шахта под -комнатой 1): в нижнем ряду под пустыми тайлами (2,4)-(2,6) торчат жёлтые -треугольники. - -**Корень.** `load_rowbelow` (seg008:368) при ОТСУТСТВУЮЩЕЙ комнате снизу -подставляет РАЗНЫЕ кромки: колонкам 1..9 — `tiles_0_empty`, и только левому -краю (тайл из `room_BL`) — `tiles_20_wall`. У нас `pop_room_load` забивал -стеной все одиннадцать позиций `below_fg`, а стена в роли соседа снизу-слева -даёт `topright` стены — её грань и лезла треугольниками. - -**Фикс.** `below_fg[0..9] = 0`, `below_fg[10] = 20`. - -**Проверено:** комната 3 совпала с картой SDLPoP — 300 пикселей расхождения, -все они силуэт Кида. Опасение «не пропадёт ли законный треугольник в (1,3)» -снято тем же сравнением: грань стены в колонке 3 и скос у её основания на -месте у обоих. Оговорка пользователя: эталон брался из `--screenshot-level`, -живая сверка в SDLPoP — потом. - ---- - - -## BUG-BALCONY-RIGHT. Правая половина портала не рисовалась — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Уровень 6, комната 18: «закрытый -портал показывается некорректно» — у арки балкона нет правой половины, -решётка обрывается, справа чёрный провал. - -**Корень — не в движке, а в УПАКОВЩИКЕ АТЛАСОВ.** `id 12` стоял в -`FORE_ENV_IDS` (`toolchain/pop_pack_bg.py`), потому что в `tile_table` он -числится `fore_id` ЗЕЛЬЯ (0x0A). Но зелье рисуется из `chtab_1` -(`add_foretable(id_chtab_1_...)`; у нас `pop_potion_flask`), а в `chtab_6` -под номером 12 лежит ПРАВАЯ ЧАСТЬ АРКИ БАЛКОНА 32x62, и она идёт в -backtable. Из-за списка спрайт уезжал в `pal_fore.atl`, а `pal_env0.atl` -получал дырку: `idx 12: w=0 h=0`. Движок берёт правую грань соседа из -env-атласа — и не рисовал ничего. - -**Как найдено.** Трасса оригинала `POP_TRACE_BT=1` показала в спорном тайле -`BT room=18 r=1 c=7 ch=6 id=12 w=32 h=62`; дальше — чтение каталога -`pal_env0.atl` напрямую (запись 12 пустая) и `pal_fore.atl` (она там). - -**Фикс.** `id 12` убран из `FORE_ENV_IDS`; в env-атласе он занял своё место. -Дифф комнаты с оригиналом 1151 -> 375 (остаток — Кид и пламя). -**Проверено пользователем:** «портал отрисовался корректно». - -**Урок:** список `FORE_ENV_IDS` собирается по `tile_table.fore_id`, но -`fore_id` НЕ значит «спрайт из chtab_6» — у зелья, меча и пламени он -указывает в `chtab_1`. Прежде чем вносить номер в этот список, проверять, -из какой таблицы спрайт берётся. - ---- - - -## BUG-MOB-MULTIROOM. Плита не пролетала несколько комнат — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Уровень 6: плита (1,7) комнаты 6 -должна пролететь НЕСКОЛЬКО комнат и упасть на кнопку, открывающую решётку. -«Плита просто падает и ничего не открывается.» - -**Корень.** У оригинала кусок живёт в списке mobs и спускается ряд за рядом: -`mob_down_a_row` (seg007:1387) из НИЖНЕГО ряда переводит его в комнату снизу -(`y -= 192`, ряд 0), и так сколько угодно комнат. У нас кусок на границе -комнаты ГАСИЛСЯ, а «переход вниз» подменялся сигналом главному циклу — он -искал посадку в комнате снизу через `pop_room_col_landing`. Для колонки 7 -комнаты 7 (сквозная шахта) посадки нет — кусок исчезал. - -**Фикс.** Честный `mob_down_a_row` в `mob_tick_one` (`pop_room.c`); -приземление в НЕ отрисованной комнате сигналит комнатой и тайлом, а щебень -и кнопку ставит главный цикл (порт `loose_land`, seg007:11E8). - -Путь в этом сценарии: комната 6 (1,7) -> сквозная шахта комнаты 7 -> кнопка -(2,7) комнаты 11, а она по LINKLOC открывает ворота (1,9) комнаты 18 — те -самые у портала. **Проверено пользователем:** ворота открываются. - ---- - - -## BUG-MOB-STALE-PAGE. Улетевшая плита оставалась на одной странице — ЗАКРЫТ - -**Наблюдение (пользователь, 2026-08-11).** Сразу после предыдущего фикса: -«в одном из кадров дабл-буфера осталась падающая плита». - -**Корень.** Чистка прошлого кадра куска стояла под гейтом «кусок в -ОТРИСОВАННОЙ комнате»: `if (here && m->prev_y[pg] != MOB_Y_NONE)`. Как -только кусок уходил вниз через `mob_down_a_row`, гейт закрывался — и след, -оставленный им на этой странице, не стирал уже никто. - -**Фикс.** Гейт убран: `prev_y[pg]` — след ИМЕННО НА ЭТОЙ странице, стирать -его надо независимо от того, где кусок сейчас. Плюс `clean = 2` во всех -ветках гашения, чтобы дочищались обе страницы. **Проверено пользователем.** - ---- - - -## BUG-CHAR-STALE-PAGE. Тень застывала на двух страницах в РАЗНЫХ позах - -**Наблюдение (пользователь, 2026-08-11, редкий — пойман дважды).** Уровень -6, комната с тенью: «Тень застряла в двух разных кадрах в разных позициях». - -**Замер в отладчике (состояние было живым).** `Guard` = кадр 15 (stand), -x = 0x51 — то есть персонаж В ПОКОЕ. А слот отрисовки `pop_cd[OPP]`: - -``` -страница 0: x=25 y=85 w=34 h=38 valid=1 <- ЛЕЖАЩАЯ поза -страница 1: x=41 y=78 w=12 h=41 valid=1 <- стойка -``` - -**Корень.** В `pop_char_draw` (`pop_cdraw.c`) прямоугольник и `valid[dp]` -пишутся ВНУТРИ `if (w && h)`, а снимок состояния для пропуска перерисовки -(`cd_sig_make`) брался БЕЗУСЛОВНО, в самом конце функции. Если спрайт -кадра нулевой (пустая запись атласа), блок рисования пропускался — `x/y/w/h` -и `valid` оставались от ПРОШЛОГО кадра этой страницы, а сигнатура -обновлялась на текущее состояние. Дальше `cd_quiet` видел `valid = 1` и -совпавшую сигнатуру, то есть считал «на странице нарисовано ровно то, что -надо», и слот залипал навсегда: `heal` не звался, старый спрайт оставался. - -**Фикс.** `cd_sig_make` вызывается только когда кадр реально рисовали -(`if (w && h)`). Без снимка слот не будет «тихим», и следующий кадр -начнётся с `heal` — старое сотрётся само. - -**ОСТАЁТСЯ ОТКРЫТЫМ (в BUGS_OPEN):** почему спрайт кадра оказался нулевым. -Фикс убирает залипание, но кадр, для которого атлас отдал 0x0, всё равно -не нарисуется. Подозрение — конкуренция за окно W0 между `atlas_image` и -чтением данных уровня; проверять трассировкой маппинга. - ---- - - -## BUG-CHEAT-IMM-1. Кид залипал в боевой стойке без меча — ЗАКРЫТ 2026-08-17 - -**Наблюдение (пользователь, уровень 2, комната 4).** Кида с мечом сталкивают -ударами с ряда 1 на ряд 2; страж падает следом и оказывается у него за -спиной. Кид встаёт в боевую стойку, но: **меча в руке нет** (не -отрисовывается), и **к сопернику он не разворачивается** — на клавиши не -реагирует вовсе. «Иногда Кид успевает развернуться, а вот сейчас не успел». - -**Два симптома — один отказ.** Диспетчер `control()` (`pop_ctrl.c`, -порт seg005:252) уходит в `control_with_sword` только при -`Char.sword == SWORD_2_DRAWN`. При `sword == 0` управление проваливается в -обычные ветки, а среди них для кадров стойки с мечом (158/170/171) нет ни -одной — каждый кадр не делается НИЧЕГО. Отсюда и «не разворачивается»: -разворот к сопернику за спиной (`SEQ_60_TURN_WITH_SWORD` при -`char_opp_dist() < -4`) живёт внутри `control_with_sword`. - -**Корень — наш чит бессмертия, а не механика боя.** `hurt_by_sword` -(`guards.c`, порт seg002) перехватывался читом в самом начале и -**безусловно**, не глядя на меч, ставил `SEQ_74_HIT_BY_SWORD`: - -```c -if (Char.charid == CHARID_0_KID && pop_immortal) { - pop_char_set_seq(SEQ_74_HIT_BY_SWORD); /* ← без проверки sword */ -``` - -А `seq_74` — это анимация «получил удар **В БОЕВОЙ СТОЙКЕ**», её кадры -(150..179) все с мечом. В оригинале в неё попадают ТОЛЬКО из ветки -`sword == 2`; безоружного там убивают (seg002, дословный комментарий: -*«Being hurt when not in fighting pose means death»*, `take_hp(100)`). -Чит подменял эту смерть выживанием и оставлял Кида в кадрах с мечом при -`sword == 0` — состояние, которого в оригинале не существует и для которого -у диспетчера нет ветки. - -**Как доказано** (важно для метода — гипотез было три, и две неверные): - -1. Кодоген `draw_sword` проверен по `bank5_pop_ctrl.asm`: `ld hl,#_Char+12 / - ld (hl),#0x02` — store меча на месте, версия «SDCC потерял запись» - (ср. [[sdcc_z80_cmp_store_a_bug]]) отпала. -2. Watchpoint на `Kid.sword` в MAME: `0 → 2` при доставании и `2 → 0` в - `start_fall` проходят штатно (`start_fall` меч гасит и в оригинале, - seg006:1102). -3. **Решающее:** с ВЫКЛЮЧЕННЫМ читом (`pop_immortal = 0`) тот же сценарий - даёт корректную смерть — то есть порт совпадает с оригиналом, а баг - живёт только под читом. - -Грабли метода, стоившие времени: ловушки прошлой сессии печатали -`b@0x992A` **без** префикса `0x10000`, то есть мимо логического вида Z80 — -`charid/frame/dir` в той трассе были мусором, отсюда ложный вывод «записей -в `sword` нет вовсе». И ловушка на `Char.sword` бесполезна: `Char` — -переключаемое окно, у стража меч вынут, поэтому `2 → 0` там происходит на -каждом переключении окна. Ещё одно: `pop_char_set_seq` пишет -`ld ($992D),hl`, запись 16-битная — байтовое условие `wpdata==0xDC` не -совпало бы никогда. - -**Фикс** (решение пользователя: «повторяем поведение оригинала, наш иммортал -работает только во время боя, с мечом»). Спецветка чита удалена целиком — -она оказалась **избыточной**: под бессмертием `pop_take_hp(1)` и так -возвращает 0, и обычный путь сам приводит к `seq_74` с сохранённым мечом. -Осталось запретить читу действовать в безоружной ветке: - -```c -if (Char.sword != SWORD_2_DRAWN) { - uint8_t imm = pop_immortal; - pop_immortal = 0; /* чит не действует вне боевой стойки */ - pop_take_hp(100); - pop_immortal = imm; - pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); -} -``` - -Глушится именно вызов, а не `pop_take_hp`: тот общий с физикой (падения, -пики, чомперы), и там бессмертие обязано работать при любом положении меча. - -**Подтверждение.** Пользователь, 2026-08-17: «всё сработало как надо», -проверено обоими концами — «во время боя удары, пропускаемые Кидом, урон не -приносят; если Кид без меча — смерть с одного удара». То есть чит в бою -работает как работал, а вне боевой стойки поведение снова совпадает с -оригиналом. -Взведена регресс-ловушка на сам инвариант: Киду пишется кадр стойки -(158/170/171), а `Char.sword != 2`. Условие смотрит на `Char`, а НЕ на -`Kid`: `ldir` копирует байт кадра (0) раньше байта меча (12), поэтому по -`Kid` ловушка слепа ровно в тот тик, когда меч теряется, и ложно срабатывает -на каждом законном доставании. - ---- - - -## LEVELDOOR-PALACE-CLIP. Кид скрывался за кромкой дворцового портала раньше времени — ЗАКРЫТ 2026-08-17 - -**Наблюдение (пользователь, уровень 4, обход после оптимизации фаз).** -Порталы, через которые Кид входит на уровень и уходит на следующий, в -подземелье и во дворце РАЗНОЙ ширины — дворцовый шире. В анимации ухода с -уровня 4 на 5-й Кид убегает по лестнице, и его контур обрезается не правой -гранью портала, а раньше, «как будто он прячется проходом». Диагноз -пользователя сразу верный: взята ширина подземного портала. - -**Корень.** `draw_leveldoor` (`pop_room.c`, порт seg008:1D29) считал правую -кромку проёма без дворцовой поправки: - -```c -pop_leveldoor_right = xh * 8 + 48; -``` - -В оригинале строкой ниже стоит (seg008:1429): - -```c -leveldoor_right = (draw_xh<<3)+48; -if (custom->tbl_level_type[current_level]) leveldoor_right += 8; -``` - -Это значение читает `clip_char` (у нас `pop_map.c:2668`) как правую границу -клипа персонажа — отсюда ранняя обрезка. - -Расхождение было **осознанным и отложенным**: в коде стоял комментарий -«+8 у palace-уровней (tbl_level_type) — на уровне 1 не применяется». На -момент написания дворцовых уровней в порту не было, и условие не дописали. -`tbl_level_type[4] = 1` (`pop_level_cold.c:52`), то есть уровень 4 — -дворцовый, и на нём это наконец проявилось. - -**Фикс.** `if (pop_palace) pop_leveldoor_right += 8;` Флаг `pop_palace` -выставляет `pop_bg_load(set)` из того же `tbl_level_type`, который читает -оригинал, так что эквивалент дословный и рассинхронизироваться не может. - -**Найдено попутно, НЕ починено:** -[LEVELDOOR-STARTROOM-WIPE](BUGS_OPEN.md#leveldoor-startroom-wipe) — в той же -функции оригинал в СТАРТОВОЙ комнате кладёт затирающий прямоугольник вместо -лестницы (и там своя дворцовая/подземная разница 48/39 и сдвиг 2 px), а мы -рисуем марш 144 безусловно. Заведено отдельным багом. - ---- - - -## SHADOW-STALE-FRAME. Тень мигала между двумя РАЗНЫМИ позами на страницах дабл-буфера — ЗАКРЫТ 2026-08-18 - -**Наблюдение (пользователь, 2026-08-18).** Уровень 6, комната 1 (Кид и через -большой провал — тень). «У Тени на двух экранах отрисованы разные позиции — -одна стоящая, одна бегущая; увидел сразу, как вошёл в комнату. Повторяется -нечасто, но очень неприятно». Гипотеза пользователя — «в один из экранов -попала случайная позиция Тени» — оказалась дословно верной. - -**Улика (живое состояние, снято через мост MAME до перезапуска).** Слот -соперника `pop_cd[POP_CH_OPP]`: - -``` -стр.0: x=41 y=78 w=12 h=41 valid=1 <- кадр 15 «стойка» -стр.1: x=25 y=85 w=34 h=38 valid=1 <- ЧТО-ТО ДРУГОЕ -cd_sig[OPP][0] == cd_sig[OPP][1] == { frame=15, x=81, y=118, dir=0, charid=1 } -``` - -Обе страницы «тихие» (снимок совпал с живым `Guard`), поэтому ни одна больше -не перерисовывается — мигание навсегда. Прямоугольник страницы 1 -восстанавливается однозначно: `bx = scr_x(obj_x) − w` и `top = obj_y − h + 1` -при `Guard.x = 81`, `Guard.y = 118`, `dir = 0` дают `dx = 3`, `dy = 4`, -`flags ≥ 0x80` и картинку 34×38. В таблице кадров ровно одна такая запись — -**`frame_tbl_guard[36]`, то есть кадр 185 «страж мёртв»** (`image = 33`, -`dx = 3`, `dy = 4`, `flags = 0xC9`; 34×38 — это размер `image 33` в атласе -КИДА, что сходится: набор спрайтов выбирается по `Guard.frame = 15`, а -`image` приходил из кэша). - -**Корень.** Оригинал грузит кадр В САМОЙ ОТРИСОВКЕ: `add_kid_to_objtable` и -`add_guard_to_objtable` (seg008:22F0/2324) первым делом после -`loadkid`/`loadshad` зовут `load_fram_det_col()`. У нас `kid_frame` / -`pop_gframe` были КЭШЕМ, который наполняет тик (`play_seq` → `load_frame`), а -отрисовка брала готовое. Кэш отстаёт от `Char.frame` у всех, кто пишет кадр -мимо `play_seq` — например `do_init_shad` (`guards.c`) кладёт тени -`frame = 15` прямой записью. А `pop_gframe` в этот момент держал кадр 185 -убитого стража с прошлого уровня: после смерти соперника `pop_guard_tick` -выходит по `charid == 0` РАНЬШЕ `pop_load_fram_det_col`, и кэш не трогается -вообще, сколько бы комнат Кид ни прошёл. - -Само по себе это моргнуло бы один кадр. Смертельным его делает **пропуск -неизменившегося кадра** (DRAW-COST): снимок `cd_sig` пишется по -`Guard.frame`, то есть страница запоминает «нарисован кадр 15», хотя на ней -чужой спрайт. Тень дальше стоит, снимок совпадает — страница не -перерисовывается НИКОГДА. - -**Фикс.** `pop_char_draw` зовёт `pop_load_frame()` сразу после -`pop_loadkid`/`pop_loadshad` — там же, где это делает оригинал. После этой -строки `image` однозначно определяется парой `(charid, frame)`, то есть -снимок `cd_sig` снова описывает ровно то, что нарисовано, и расхождение -«пиксели против снимка» становится невозможным независимо от того, кто и как -испортил кэш. Цена: +3 байта в банке 4, кадровый бюджет не трогает -(отрисовка и так пропускается у «тихого» слота). - -Заодно приведена к оригиналу ветка «кадра нет в таблице»: `load_frame` -(`pop_kid.c`) ставила `cur_frame.image = 255` и выходила, НЕ обновив кэш -владельца, — то есть вместо «не рисовать» рисовалась прошлая картинка. -Оригинал кладёт туда `blank_frame {255,0,0,0,0}` (`get_frame_internal`, -seg006:507). Выход из функции теперь один на обе ветки: +46 байт резидента. - -**Проверка (MAME, уровень 6 комната 1).** Брейкпоинт на трамплине -`___sdcc_bcall_ehl` с условием `hl == _pop_char_draw` и действием -«записать в `pop_gframe` кадр 185 и продолжить» — то есть кэш травится -ровно перед КАЖДОЙ отрисовкой персонажа. Слот при принудительной -перерисовке (`valid[0] = valid[1] = 0`) остаётся `12×41` на обеих -страницах, `pop_gframe` после кадра — снова кадр 15. До фикса та же -подмена дала бы `34×38 @ (25,85)` — ровно числа из улики. - -**Что осталось невыясненным.** Не удалось воспроизвести САМ МОМЕНТ порчи: -вход в комнату с заведомо испорченным кэшем (подмена `pop_gframe` в соседней -комнате + возврат читом обхода) самолечится — метка «фон трогали» от -перерисовки комнаты стоит на обеих страницах, и слот честно перерисовывается -следующим кадром. Значит порча случилась в кадре, где фон НЕ трогали, и -конкретный путь остался неизвестен. На вывод это не влияет: фикс закрывает -класс целиком, а не найденный путь. Ловушка на будущее, если симптом -всплывёт снова: `wp <адрес pop_cd[OPP].w>,4,w` — сработает на первой же -записи «чужой» ширины. - ---- - - -## BLUELINE-NOBLUE. Кусок синего узора на стене там, где оригинал его не рисует — ЗАКРЫТ 2026-08-18 - -**Наблюдение (пользователь, 2026-08-18).** Уровень 6, комната 1, тайл (2,3): -у правой кромки левого блока висит небольшой кусочек тёмно-синего узора, -которого в оригинале нет. Диагноз пользователя («первоначальная отрисовка -фона, фикс не должен повлиять на скорость») подтвердился полностью. - -**Корень.** Полоску рисует `draw_tile_right` (`pop_room.c`, порт -seg008:0666) — её кладёт ПРАВЫЙ сосед стены: - -```c -case tiles_20_wall: - if (tbl_level_type[current_level] && (modifier_left & 0x80) == 0) - add_backtable(chtab_6, 84 /*wall stripe*/, draw_xh + 3, 0, draw_main_y - 27, ...); -``` - -Проверка `& 0x80` у нас была, а вот значения, которое она проверяет, — нет. -Модификатор стены В ФАЙЛЕ уровня и В РАНТАЙМЕ у оригинала разные: -`load_alter_mod` (seg008:1216) переводит их при загрузке комнаты — -`*curr_tile_modif <<= 7`, то есть единственный бит уровня («no blue», -авторский флаг «не рисовать полоску на моей правой кромке») переезжает в -СТАРШИЙ. Наш порт `load_alter_mod` (`pop_trob.c`) ветку стен пропускал -НАМЕРЕННО, и в комментарии это было записано: связи кладки мы считаем по -типам соседей (`pop_wall_modifier`), сохранённый модификатор стены «не -читается вовсе». - -Ошибка в слове «вовсе»: у модификатора стены ДВА независимых смысла, и -из соседей выводится только один. `noblue` проставлен вручную в данных -уровня и не выводится ниоткуда. В комнате 1 уровня 6 стена (2,2) имеет в -файле модификатор 1, то есть ровно «без полоски»; без перевода отрисовка -видела сырую единицу, `(1 & 0x80) == 0` проходило — и полоска вылезала. - -**Фикс.** `case TILE_WALL: *m = (uint8_t)(*m << 7);` в порте -`load_alter_mod`. Перевод одноразовый, при первом входе в комнату -(`room_seen`), — кадровый бюджет не трогает вообще; +24 байта в банке 6, -резидент не изменился. - -**Проверка (MAME, уровень 6 комната 1).** Попиксельный диф скриншотов до и -после: изменения ровно в боксе `(344,199)-(358,206)`, 38 пикселей — сам -артефакт и ничего кроме. На подземных уровнях изменений нет по построению: -полоска целиком под `if (PALACE)`. - ---- - - -## SPIKE-BAKED. Выдвинутые пики консервировались в фон и оставались навсегда - -**Наблюдение (пользователь, 2026-08-18).** Уровень 7, комната 19. Пики стоят -в `(0,6)` и из-за изометрии частью выходят в ячейку `(0,7)`. Выдвигаются -корректно все; **прячутся корректно только те, что в `(0,7)`**, а в `(0,6)` -остаются два вида мусора: куски остриёв на фоне дальней стены и белые точки в -дырах пола. Пользователь сразу указал и на класс («первоначальная отрисовка -фона, фикс не должен повлиять на скорость»), и на причину («в `(0,5)` не пол, -а кнопка») — оба попадания верные. - -**Артефакты, снятые в MAME на живом кадре с мусором.** - -| что | значение | -|-----|----------| -| `pop_t_bg[6]` (живой modif пики) | `0x00` — пики УБРАНЫ | -| `pop_t_fg[0..9]` | `03 04 13 0F 01 06 02 04 01 03` → `(0,5)` = `0x06` closer-кнопка, `(0,6)` = `0x02` spike | -| мусор на экране | x 198..215, y 63..88 | - -Модификатор нулевой, а пиксели пик есть — значит рисует их не живое -состояние. И `pop_spike_redraw` каждый кадр делает `pop_heal_off(192, 62, -64, 40)` — ровно поверх этого прямоугольника. Мусор переживает СВОЙ ЖЕ heal, -а heal восстанавливает ОЗУ-копию фона: пики в ней и лежат. - -**Корень.** Кнопка при смене состояния метится `POP_RD_FLOOR`, а это -`pop_floor_bake(0,5)` — ЗАПЕЧКА, то есть рисование в банке, который пишет и в -ОЗУ-копию. Запечка перерисовывает свой тайл **и правого соседа**: - -```c -pop_t_bake_rest = 1; -draw_tile(row, col); -if (col + 1 < 10) draw_tile(row, col + 1); /* <- это пики (0,6) */ -``` - -`pop_t_bake_rest` для того и заведён — «в фон кладём состояние ПОКОЯ», — но -читал его ТОЛЬКО `pop_loose_frame`. Кадр пик считался прямо по месту, -`(m & 0x80) ? 5 : m`, в ЧЕТЫРЁХ слоях, и ни один флага не спрашивал. Так -выдвинутая пика попадала в ОЗУ-копию, и дальше heal возвращал её вечно. - -Всё сходится численно. Окно клипа запечки — `x 160..219` (ширина 60 от -кнопки), спрайт пики — `x 192..222`, `y 62..88`. Пересечение `x 192..219` — -это и есть наблюдаемые 198..215; а `(0,7)` начинается с 224, за окном -запечки, — потому там и чисто. Правая часть пики живёт только в видео-ОЗУ и -честно стирается. - -**Фикс (`pop_tile.c`).** Порт `get_spike_frame` (SDLPoP seg008:08A0), которого -у нас не было, — плюс наша платформенная оговорка про запечку: - -```c -uint8_t pop_spike_frame(uint8_t m) -{ - if (pop_t_bake_rest) return 0; - return (uint8_t)((m & 0x80) ? 5 : m); -} -``` - -Все четыре слоя (`draw_tile_anim`, `draw_tile_anim_right` соседа, fore-проход, -mid-оверлей) переведены на него. Заодно `pop_chomp_pose` тоже стал отдавать -позу покоя в запечке: у чомпера ровно та же схема, а рядом с кнопкой он -встретится так же легко. - -Одна точка вместо четырёх лечит ВСЕ пять путей запечки сразу, включая -`pop_room_draw` — вход в комнату с выдвинутыми пиками тоже консервировал бы их. - -**Цена.** Резидент +28 Б, банки без изменений; в кадре — один `call` на слой, -и только на тайлах-пиках. Скорость не затронута, как и предполагал -пользователь. - -**Проверка.** Пользователь прошёл сценарий вручную на пересобранном билде — -мусора нет. - -**Урок (записан в `pop_tile.h` над `pop_t_bake_rest`).** Флаг «сейчас -запечка» обязана спрашивать САМА функция «кадр по модификатору», а не -вызывающий слой: слоёв отрисовки у тайла четыре, и забыть один слишком легко. -Для новой анимированной ловушки это теперь обязательный пункт. - ---- - - -## DIED-ON-BUTTON. Смерть на кнопке не ломала её: решётка закрывалась обратно - -**Наблюдение (пользователь, 2026-08-18).** Уровень 7 начинается падением, и -если не зацепиться за кромку, Кид разбивается на `(2,1)` комнаты 3 — а там -кнопка открытия решётки. В оригинале решётка после этого открыта НАСОВСЕМ, -у нас отжималась. - -Баг был заведён ещё при закрытии -[BUG-LOOSE-BUTTON-1](#bug-loose-button-1) как «`died_on_button` (seg007:776) -не портирован», но оказался ДВОЙНЫМ — до недостающей функции ещё и не было -пути. - -### Половина 1: физика трупа выключена целиком - -```c -void pop_phys_tick(void) __banked -{ - if (pop_kid_dead) return; /* <- вся цепочка, включая check_press */ -``` - -У оригинала `play_kid_frame` (seg000:1231) гейт ровно один — `Char.room != 0`; -весь список крутится и на трупе (по «жив/мёртв» разведены `check_spiked`/ -`check_chomped_kid`, и то через `resurrect_time`). Ранний выход выглядел -безобидной экономией — «труп не шевелится», — но `check_press` на мёртвом -персонаже делает СОВСЕМ ДРУГОЕ, чем на живом, и именно это выключалось. - -Отсюда наблюдаемое: кнопка получала РОВНО ОДНО нажатие — в кадре самой -смерти, потому что `pop_kid_dead` ставит `land()` уже ВНУТРИ цепочки, после -раннего возврата. Решётка приоткрывалась и закрывалась. - -Снято в MAME до фикса: Кид `frame 185, action 5 (bumped), alive 0`, тайл -`(2,1)` = `0x0F` opener с модификатором `0x12`, openness решётки ползёт -вниз 146 → 112. Кадр смерти при этом проходит все проверки `check_press` -штатно (`action == ACT_BUMPED`, флаги кадра 185 = `0x49`, бит -`FRAME_NEEDS_FLOOR` есть) — то есть путь был закрыт ровно одним `return`. - -«Труп не шевелится» держится и без него, тем же, чем в оригинале: кадр -смерти не двигается сам, а уход из комнаты и сотрясение отсечены ВНУТРИ -`kid_phys` (там свой `if (pop_kid_dead) return;` перед `pop_check_knock`). - -### Половина 2: сам `died_on_button` - -```c -if (Char.alive < 0) pop_trigger_button(...); /* жив — нажатие на 5 кадров */ -else died_on_button(...); /* мёртв — кнопка СЛОМАНА */ -``` - -Открывалка превращается в обычный пол с нулевым модификатором, а связь -дёргается типом «щебень» (`TILE_DEBRIS`) — у `trigger_gate` это отдельная -ветка «открыть насовсем». Любая другая кнопка становится заклиненной -(`TILE_STUCK` = 5). Тайл пишем и в страницу уровня (переживает выход из -комнаты), и в живую `g_fg`, с пометкой на перерисовку своей ячейки и правой. - -Инфраструктура была готова давно: `TILE_DEBRIS` и ветка «насовсем» в -`trigger_gate` написаны ещё тогда, с комментарием-ссылкой именно на -`died_on_button` — из-за чего механизм и казался реализованным. Опасение -старой записи, что нужен «тайл заклиненной кнопки в атласе, а его там нет», -не подтвердилось: `pop_tile_table[5]` (stuck floor) заполнен и уже -рисуется — на него подставляется НАЖАТАЯ кнопка-закрывалка. - -### Половина 3 (вылезла сразу): таймер связи переживал рестарт уровня - -Пользователь поймал на первом же прогоне: **до первого падения кнопка -рисуется правильно, после — выглядит нажатой с самого начала уровня**, хотя -логически не нажата. - -`died_on_button` ставит таймер связи в 5 и заводит trob кнопки — но тайл к -этому моменту УЖЕ пол, и trob умирает в первом же обходе -(`default: type = -1`), ни разу не уменьшив таймер. У оригинала ровно то же -самое, только там `load_level()` перечитывает файл ЦЕЛИКОМ, а наш -`pop_level_reset_tiles` восстанавливал одну foretable. Остаток `dl2[18] = 5` -переживал респавн, а `pop_tile_code_drawn` рисует кнопку нажатой, пока -таймер > 1. - -Фикс — восстанавливать в рестарте и LINKMAP. Отдельная эталонная копия не -нужна: в странице уровня LINKMAP остаётся нетронутой, игра правит только -ОЗУ-копию `pop_dl2`. - -**Проверка в MAME (полный цикл).** - -| момент | тайл `(2,1)` | `dl2[18]` | `pop_kid_dead` | решётка `(2,6)` | -|--------|--------------|-----------|----------------|-----------------| -| труп на кнопке | `01` floor | 5 | 1 | `FF` открыта навсегда | -| после респавна | `0F` opener | **`00`** | 0 | `00` закрыта | -| второе падение | `01` floor | 5 | 1 | открывается заново | - -Плюс попиксельная сверка кадров: решётка, до фикса стоявшая опущенной, -поднята. Цена: резидент без изменений, банк 3 +193 Б, банк 8 +22 Б. - -**Осталось невыясненным.** На СТАРОМ поведении openness решётки замирал на -112 и дальше не убывал, хотя `animate_door` (совпадает с seg007:0522) обязан -досчитать до 0 и снять trob. С фиксом сцена так не воспроизводится -(решётка уходит в `FF`), проверить нечем; если всплывёт где-то ещё — это -отдельный баг, к `died_on_button` отношения не имеющий. - ---- - - -## GUARD-RESPAWN-COL0. Страж при возврате в комнату телепортировался в колонку 0 и падал - -**Наблюдение (пользователь, 2026-08-18).** Уровень 8, комната 24. Первый -вход из левой комнаты — страж около `(0,7)`, стоит. Кид уходит вправо и -возвращается — страж уже «в `(0,-1)`». Ещё раз туда-обратно — страж на -`(0,0)`, идёт биться, падает на два ряда и разбивается. Второй сценарий: -вход из комнаты 23, страж на `(0,7)` неподвижен; Кид уходит влево и -возвращается — страж падает на `(2,1)` и разбивается. - -Формулировка пользователя — «страж, если не может биться с Кидом, не должен -менять позиции; иначе он будет ждать Кида прямо на входе, и тот не успеет -достать меч» — совпадает с тем, что гарантирует оригинал. - -**Как это устроено в оригинале.** Позиция стража живёт в ТРЁХ полях данных -уровня, и колонки среди них нет: - -- `pos_guards` (seg003:0913), один раз сразу после `load_level`: - `guards_x[room] = x_bump[(tile % 10) + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX`. - То, что лежит в `guards_x` В ФАЙЛЕ, оригинал ВЫБРАСЫВАЕТ (в комнате 24 - уровня 8 там 255); -- `leave_guard` (seg002:02F5) при уходе Кида: - `guards_tile = get_tilepos(0, row)` — колонка обнуляется НАМЕРЕННО, тайл - несёт только РЯД, — и `guards_x = Guard.x`, то есть настоящая позиция; -- `enter_guard` (seg002:0112) при возврате: `curr_row = tile / 10`, - `y = y_land[row + 1]`, **`x = guards_x`**, `curr_col = f(x)`. - -Носитель колонки — `guards_x`, и только она. - -**Что было у нас.** `pop_guard_leave` тайл обнуляла верно, а -`pop_guard_enter` считала X из `tile % 10` — из колонки, которой там уже нет. -Запомненную X брали ТОЛЬКО у трупа. Значит после ПЕРВОГО же выхода из -комнаты живой страж возвращался в колонку 0. - -Численно: тайл стража комнаты 24 = 6 (ряд 0, колонка 6), ряд 0 = -`13 00 00 00 0F 01 01 01 01 01`, то есть **колонки 1..3 ПУСТЫЕ**, а в -колонке 0 факел. Телепорт давал `x = x_bump[5] + 14 = 72`, а 72 по таблице -деления — это колонка **1**: страж оказывался над дырой, падал с ряда 0 на -ряд 2 (щебень в `(2,1)`) — два ряда, смерть. Оба сценария пользователя -ложатся сюда ровно, включая «упал на 2,1». - -**Фикс.** Два места, оба — приведение к оригиналу: - -- `pop_gstate_init` — порт `pos_guards`: при загрузке уровня `GS_X` - считается из колонки тайла, а не читается из файла; -- `pop_guard_enter` — `Guard.x` берётся из запомненной ВСЕГДА, не только у - трупа; колонка, как и раньше, считается из X. - -**Проверка в MAME** (уровень 8, комната 24, три входа через `enter_room`): - -| | room | x | y | col | row | alive | -|---|---|---|---|---|---|---| -| первый вход | 24 | 156 | 55 | 7 | 0 | жив | -| возврат | 24 | 156 | 55 | 7 | 0 | жив | -| второй возврат | 24 | 156 | 55 | 7 | 0 | жив | - -Позиция не меняется, страж стоит на полу. Host-тесты — 5106 проверок без -расхождений. Резидент без изменений, банк 8 −15 Б. - -**Что осталось невыясненным.** Наблюдение «страж был в `(0,-1)`» отдельно -не воспроизведено: телепорт даёт колонку 0/1, а −1 требует `x < 65`. -Вероятнее всего это кадр уже НАЧАВШЕГОСЯ падения (при падении X сносит), но -доказательства нет. Если `(0,-1)` появится на исправленном билде — это -отдельный баг. - ---- - - -## SEAM-FIGHT-FLICKER. Бой у шва: комната перерисовывалась то одна, то другая - -**Наблюдение (пользователь, 2026-08-18).** Уровень 8, шов комнат 24/18: во -время схватки со стражем экран постоянно переключался между комнатами — -«драться очень неудобно». Отдельно пользователь заметил, что уходит Кид, -даже когда просто держит «вверх» (защита), и предположил верную причину: -стойка защиты не одна, Кид периодически проходит через обычную. - -**Корень.** `leave_room` (seg002:0490) запрещает смену комнаты не только на -развороте, подъёме-с-зацепа (135..149) и вставании из приседа (110..119), но -и на ВСЕЙ боевой анимации — кадры **150..162** и **166..168**. У нас были -только первые три условия. - -Разрешены при этом 163..165, 169 (`begin_block`) и 170/171 (`stand with -sword`) — то есть уйти можно, но только на «легальном» кадре. Цикл защиты -(seqtbl: `readyblock` = 169 -> `blocking` = 150, петля) как раз проходит -через 169, а между атаками Кид возвращается в 158/170 — отсюда и ощущение -«стоять в защите нельзя». - -Побочный эффект известен и в оригинале эксплуатируется — **Trick 35, -«retreat without leaving the room»**: определённым ритмом «назад» кадр 170 не -наступает никогда, и Кид пятится из комнаты, не переключая её. В SDLPoP это -чинит `FIX_RETREAT_WITHOUT_LEAVING_ROOM`, по умолчанию ВЫКЛЮЧЕННЫЙ, — мы -портируем оригинал. - -**Сторона стража проверена отдельно, расхождений нет.** `play_guard_frame` -(seg000:0F48) ухода из комнаты не содержит вовсе (ни `leave_room`, ни -`check_leave_below`), физика загейчена окном `Char.x ∈ [44, 211)`. Комнату -страж меняет только через `follow_guard` (у нас `pop_guard_follow`) и -`check_guard_fallout` (у нас `pop_guard_fallout`) — оба портированы. - -**Проверка: покадровая сверка с SDLPoP.** Пользователь добавил в SDLPoP -вывод в конце `add_kid_to_objtable` (seg008:1679); мы навесили такой же -(`pop_dbg_kidobj`, см. ниже). Окно перехода совпало КАДР В КАДР: - -| | SDLPoP | наша | -|---|---|---| -| | `tilepos=10 frame=161 col=-1` | `tilepos=10 frame=161 col=-1` | -| | `tilepos=10 frame=160 col=-1` | `tilepos=10 frame=160 col=-1` | -| | `tilepos=10 frame=157 col=-2` | `tilepos=10 frame=157 col=-2` | -| | `tilepos=10 frame=158 col=-2` | `tilepos=10 frame=158 col=-2` | -| **смена** | `tilepos=18 frame=169 col=9` | `tilepos=18 frame=169 col=9` | - -Прогон уровня 1 комнаты 3 (1779 кадров): за весь бой комната сменилась -ОДИН раз; 34 боевых кадра прошли за краем комнаты (`col<0`), самый длинный -непрерывный прогон — 17 кадров, и комната при этом не переключалась — ровно -как в трассе SDLPoP. - -Прогон уровня 8, шов 24/18 (1433 кадра, 360 кадров с мечом): внутри боя -**4 смены комнаты на 387 кадров** — то есть примерно раз в 6 секунд, и это -настоящее выдавливание, а не мерцание. Все четыре пришлись на РАЗРЕШЁННЫЕ -кадры (170, 164, 170, 165); ни одной смены на запрещённом кадре во всей -трассе нет. Кид подолгу держался на `col=-1` и `col=10`, комната не -переключалась. - -**Инструмент (оставлен в дереве, выключен).** `pop_dbg_kidobj` -(`roomtest_cold.c`) + резидентный буфер `pop_dbg_obj` (`pop_state.c`), -включается `#define DBG_KIDOBJ 1` в `roomtest.c`. Считает то же, что -`set_char_collision` + `set_objtile_at_char`. Вывод забирает брейкпоинт -MAME на резидентном `pop_dbg_trap`; сборщик — `collect_kidobj.py`. - -Грабли, стоившие времени: - -- `#define DBG_KIDOBJ` сперва положили внутрь `#ifndef PROF_BORDER`, а - `PROF_BORDER` задаётся ключом сборки — блок не выполнялся, трасса молча - не включалась. Нужен свой `#ifndef`. -- Знаковые значения через выражения отладчика MAME получить не вышло: `b@` - связывается слабее `+`, и `b@ADDR + 128` читает ДРУГОЙ адрес; скобки не - помогают. Зонд печатает сырые байты, перевод — в сборщике. -- Кольцо `clog` не потребляющее, одинаковые строки от повторов не отличить — - в строку добавлен `totalcycles`, по нему и склеиваются чанки. -- Замерено: один зонд с коротким `printf` — **98 % полной скорости** - эмуляции, играть можно (в отличие от четырёх зондов профилировщика). - -**Осталось невыясненным.** Поле `cols` (`char_col_left..char_col_right`) у -нас систематически на единицу меньше, чем в SDLPoP, и дважды дало `0..-1`, -чего в оригинале не бывает. Все поля, которые считает ДВИЖОК (`tilepos`, -`frame`, `act`, `col`, точка перехода), совпали полностью — расхождение -только в величине, которую выводит сам отладочный помощник из ширины кадра -`pop_cd[].fpw`. Подозрение на паддинг кадров в атласе -(`png_strip_padding_tradeoff`) либо на мой пересчёт переднего края мимо -боевого `char_x_forward_edge`. Проверять отдельно. - ---- - - -## MOB-NEIGHBOUR-ROOM. Плиты нижнего ряда пропадали без кадров падения - -**Наблюдение (пользователь, 2026-08-18).** Уровень 11, комната 14: Кид бежит -по ряду проваливающихся плит, они трясутся и «падают сразу полностью -пропадая, а должен быть промежуточный кадр». Догадка пользователя — «для -плит на 2-ом ряду мы рисуем только тряску» — оказалась верной по симптому и -почти верной по причине. - -**Корень.** Порт `draw_mob` (seg007:13E5) был неполным. У оригинала кусок -рисуется НЕ ТОЛЬКО в своей комнате: - -```c -if (curmob.room == drawn_room) { if (curmob.y >= 210) return; } -else if (curmob.room == room_B) { if (ABS((sbyte)ypos) >= 18) return; curmob.y += 192; } -else if (curmob.room == room_A) { if (curmob.y < 174) return; ypos = curmob.y - 189; } -else return; -``` - -У нас на этом месте стояло `if (!mt_here) return;` — «чужая комната: считаем, -но не рисуем». - -Почему страдал ИМЕННО ряд 2: кусок спавнится на `y_loose_land[row+1]`, для -ряда 2 это **191**, а граница ряда `y_something[3]` — **188**. То есть на -ПЕРВОМ же `move_loose` он уходит в комнату снизу и у нас переставал -рисоваться мгновенно. Ряды 0 и 1 летят внутри комнаты, поэтому там всё было -видно. Промежуточных кадров ровно три — пока `|y| < 18`. - -**Фикс.** У куска появилась отдельная ЭКРАННАЯ координата `draw_y` (своя -комната / +192 из комнаты снизу / −189 из комнаты сверху, `MOB_Y_NONE` = -не рисуется). По ней идут отрисовка, `prev_y`/heal, порядок относительно -Кида, пометки соседа и оверлей; отбор в проходе отрисовки — по `draw_y`, а не -по комнате. Ссылки вверх/вниз кэшируются (иначе `pop_room_link` мапил бы W0 -каждый кадр). - -Вторым заходом пришлось поправить `mob_overlay_neighbour`: ряд там уже считался -по `draw_y`, а габарит спрайта и вызов `pop_mob_overlay_tile` остались по `y` — -для куска из соседней комнаты это расходится на 192, и пересечение с габаритом -тайла считалось заведомо неверно (порядок переднего слоя). - -**Цена — и урок про то, ЧТО именно дорого.** Замер 13/23: - -| секция | до | первый вариант | после гейта | -|---|---:|---:|---:| -| работа | 880 272 | 898 578 | **888 984** | -| зелёная | 419 562 | 445 248 | **427 242** | -| циан | 380 202 | 379 818 | 378 864 | - -Первый вариант метил «фон трогали» по ПРОШЛОЙ нарисованной позиции -безусловно. У куска, видимого из соседней комнаты, она отличается от `y` на -192 — объединение прямоугольников растягивалось почти на весь экран и тянуло -за собой лишние перерисовки. Гейт `m->room != pop_t_room` вернул 18 000 из -26 000. - -Я сперва списал рост на клипованный блит (кусок у кромки по определению -клипуется, а клипованный путь дороже: 14 088 против 10 422) — замер это -опроверг: дело было в пометке. Остаток +7 680 в зелёной (+1,8 %) — -собственно отрисовка трёх кадров на плиту; зелёная остаётся ниже растрового -кадра 430 000. - -Host-тесты 5106 проверок без расхождений (`pop_room.c` они не линкуют — -проверка визуальная, в MAME: уровень 11 комната 14, отделившаяся плита видна -три кадра). - -### Продолжение: в мид-оверлее не было переднего торца плиты - -Пользователь тут же нашёл следующий слой (2026-08-18, та же комната): правый -конец падающего куска рисовался ПОВЕРХ соседней плиты `(2,6)`, хотя торец той -плиты при этом лежал поверх куска — то есть порядок был противоречивым в -разных частях перекрытия. - -Сначала я проверил, не нужен ли клип объекта: `add_mob_to_objtable` -(seg007:1161) ставит куску `clip.right = 40`. Оказалось — **не нужен и в -оригинале не работает**: клип применяется только если -`chtab_flip_clip[chtab_id]`, а таблица (`data.h:196`, -`{1,0,1,1,1,1,0,0,0,0}`) для `chtab_6_environment` даёт **0**. Поле -выставляется и молча игнорируется, так что «клипа нет» у нас — верно. Пункт -MOB-CLIP-RIGHT можно закрывать как несуществующий. - -Настоящая причина — состав мид-оверлея. У оригинала это `draw_tile2()`: - -```c -draw_tile_right(); draw_tile_anim_right(); draw_tile_base(); -draw_tile_anim(); draw_tile_bottom(0); draw_loose(0); -``` - -а у нашего `overlay_mid_tile` последнего вызова не было. У loose в -`pop_tile_table` `bottom_id = 0`, поэтому передний торец плиты рисует ТОЛЬКО -`draw_loose` — и в оверлее его не рисовал никто. Добавлено; кадр берётся по -живому modif, чтобы дрожащая плита осталась дрожащей. - -**Осталось невыясненным:** в `overlay_mid_tile` по-прежнему нет полного -`draw_tile_right` (есть только случай пола, спрайт 42) и нет -`draw_tile_anim_right` — то есть анимированной правой грани СОСЕДА (пики, -ворота, loose). Симптома на это пока не видели; если всплывёт «правая грань -соседа под персонажем/куском» — смотреть сюда. - -### Вариант B: порт корзины 30 (2026-08-18) - -Реализовано то, что разобрано в коммите `272cf8f`. Кусок, у которого ряд -объекта вне 0..2 (`y_to_row_mod4` даёт −1 и «выше потолка», и «ниже пола»), -считается объектом ТАЙЛА 30 — а такие оригинал рисует ПЕРВЫМИ, до всего -обхода тайлов. Два следствия: - -- `defer = 0` — кусок идёт под всем, включая Кида (раньше сравнение рядов - давало обратное: «−1 обходится последним» читалось как «поверх»); -- оверлею отдаётся ориентир **3** («раньше любого ряда обхода 2,1,0») - вместо сырого −1, и в набор перекрываемых тайлов добавляется **своя - клетка** — у куска в обычном ряду её перерисовывать нельзя, там объект - вливается в midtable уже после частей своего тайла. - -**Замер 13/23 (3032 кадра, зонды фаз + детализация зелёной):** - -| секция | тег `mob-order-B-start` | после B | дельта | -|---|---:|---:|---:| -| работа | 888 984 | **913 848** | +24 864 | -| синяя | 159 804 | 159 810 | +6 | -| зелёная | 427 242 | **440 418** | +13 176 | -| циан | 378 864 | 393 000 | +14 136 | - -Период кадра не изменился: 4 растра в 23 кадрах, 5 в двух — как и до правки. - -**Зелёная вышла за растровый кадр** (440 418 против 430 000) при цели -400 000. Детализация показывает, где именно: - -| участок зелёной | максимум | -|---|---:| -| `pop_loose_tick` целиком | 185 826 | -| — из них `pop_loose_mob_tick` | **168 180** | -| — циклы по тайлам | 23 736 | -| — `check_loose_fall_on_kid` | 5 868 | -| тробы + `pop_redraw_needed` | 337 800 | -| шов и прочее | 11 964 | - -(максимумы взяты по разным кадрам, поэтому не складываются в общий). - -Основной кандидат на возврат этих тактов — задача -[HEAL-WIDTH](TASKS_OPEN.md#heal-width): heal'ы кусков и плит берут ширину по -клеткам, а фактический след — 58/57. - -### BUG-DBGSTART-LEVEL. Отладочный старт ломал переход между уровнями (закрыт 2026-08-20) - -**Симптом** (найден пользователем на сборке `make LEVEL=6 ROOM=1 POS=18`): -Кид проваливается в комнате 1 шестого уровня, уровень меняется на 7-й — и -Кид появляется не там: приземляется в комнате 1 на 2,8 вместо того, чтобы -продолжать падение по своей колонке. - -**Корень.** Отладочный старт (`DBG_START_ROOM`/`DBG_START_POS`, -`roomtest_cold.c`) подменял комнату и позицию БЕЗУСЛОВНО, а -`pop_start_level` зовётся не только на первом запуске, но и **на каждой -смене уровня**. В результате на 7-м уровне стартовой становилась -отладочная комната 1 вместо комнаты 17 из данных — и спецсобытие «вход -падением» (`set_start_pos`, seg003:0196: уровень 7, комната 17 -> -`goto_other_room(3)`) не срабатывало вовсе, потому что его условие -сравнивает именно `start_room`. - -Само спецсобытие было портировано и работало; сломан был вход в него. - -**Починка:** подмена применяется только пока `pop_current_level == -FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекпойнт) отладочную -позицию сохраняет — ради этого она и перебивает чекпойнт. - -**Проверено в MAME:** после провала на 6-м `pop_current_level` = 7, Kid.room -= 16, то есть спецсобытие отработало (старт в 17, переход вниз). - ---- - - -## CUTSCENE-LTR. Переходы story должны проявляться слева направо — **ЗАКРЫТ 2026-08-26** - -**Было.** Полосовой переход (`transition_ltr` оригинала) стоял только на -«In the absence…»; «свадьба» → титры возникали мгновенно, а промежуточный -титульный экран отсутствовал вовсе. - -**Стало.** Переход выделен в общий `pop_screen_present_ltr()` (pop_ui.c) — -им пользуются story-переход интро, титры, таблица рекордов и титульная -картинка финала. Восстановлен и пропущенный шаг `show_title()` -(seg000:2045): между «свадьбой» и титрами показывается композиция с -логотипом и Jordan Mechner, тоже полосами, и лишь через 0x78 тиков идут -титры. - -**Грабля, которая стоила отладки.** Переход копирует страницу -акселератором, а тот читает ОЗУ-копию. `GFX_BANK_SPRITE` (NOSHADOW + -TRANSPARENT) в неё не пишет, поэтому переезжал один фон без текста (так вышла -пустая таблица рекордов, см. [HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). Всё, -что должно проявляться ВМЕСТЕ с фоном, рисовать банком -`GFX_BANK_TRANSPARENT` — прозрачность та же, но копия обновляется. - ---- - - -## PV-MUSIC-STALL. В сцене с принцессой звучала только первая реплика — **ЗАКРЫТ 2026-08-26** - -**Симптом (пользователь).** «Музыка после открытия двери для входа Джафара -пропала» — дальше сцена шла в тишине до конца: не звучали ни реплика входа -Джафара (m53), ни его ухода (m52). - -**Корень.** Регрессия коммита `4086dde` («убрана промотка кадров»). До него -шаг постраничной подкачки стоял БЕЗУСЛОВНО в теле кадра сцены (плюс там же -вызывался `pop_music_service`). Тот коммит перенёс шаг «в паузу кадра» — -внутрь цикла ожидания тика насоса — и одновременно ввёл правильную защиту от -промотки (`if (snd_done > snd_want) snd_want = snd_done`). Вместе это и убило -подкачку: пауза в этой сцене почти не выпадает, цикл ожидания выходит сразу, -и шаг не вызывается. - -**Замер, который это показал** (адреса статиков `pop_music.c` вычислены от -public `_pop_mus_page` по смещениям из `.sym`): - -| | до фикса | после фикса | -|---|---|---| -| `ld_next` (прочитано страниц m53) | **0** за 20 с | **11 из 11** | -| `mus_ready` | 0 | 1 | -| что звучит | только m50 | m50 → m53 → m52 | - -**Фикс.** Один безусловный `pop_music_load_step()` в кадре сцены (шаг в паузе -оставлен: он бесплатный, когда время есть). Страница стоит 33 мс против -кадра сцены в 100-133 мс, а шкала работает по факту прошедшего времени, -поэтому сцена от этого не разъезжается. - -**Ловушка отладки, стоившая ложного диагноза.** Пока машина стоит на -брейкпоинте, значения в памяти застывают — картина «`busy=0` при `next=3` из -20» выглядела как обрыв чтения с ошибкой, хотя это был просто стоп-кадр. -Прежде чем толковать значения, проверять `status`: `state=run` или `stop`. - ---- - - -## FINAL-BANKCALL. Финал убивал программу: прямой вызов в чужой банк - -**Симптом (пользователь, 2026-08-27).** Пройденная игра доходила до -таблицы рекордов и умирала: программа исчезала, а машина следом вставала -намертво (`di; halt` по адресу 0x0000) либо уходила в reset. Из Flex -Navigator и из голого DSS — одинаково. - -**Что оказалось не при чём** (проверено, чтобы не искать заново): Flex -Navigator, звук и CBL (с выключенным звуком падало так же), потоковое -чтение победной темы, второй `open` поверх открытого файла, фейды с -клавиатурным диспетчером, чтение архива PV, межбанковый вызов -банк 10 → банк 11, переполнение банка (самый полный — BANK8, 15376 из -16384), утечка манипуляторов (`_fd_open_count` = 1) и утечка ссылок на -IM2-таблицу (`_irq_refs` = 2, как задумано). - -**Как искали.** Бисекция ключом `HOF=0/2/4/5` (пропустить таблицу целиком -/ только `hof_load` / без фона / без фейдов) сузила место до -`hof_draw_rows`, а точную инструкцию дала ТРАССИРОВКА MAME на узком -участке: `trace` включалась брейкпоинтом на входе в `pop_hof_show` -(0x44AB) и выключалась на процедуре завершения процесса DSS (0x1E56). -`history` для этого не годится — её 250 записей забиваются обработчиком -прерываний, пока процессор ползёт по мусору. - -**Корень.** - -``` -CD42: ld hl,$B8AB ← _gfx_bank -CD45: ld (hl),$58 ← gfx_set_bank(GFX_BANK_TRANSPARENT) -CD47: call $E503 ← ПРЯМОЙ вызов; по карте 0009E503 = _pop_text_map, банк 9 -E503: rst $38 ← а в W3 стоит банк 10, там пустой хвост (0xFF) -``` - -`pop_ui.h` объявлял группу `pop_text_*_mapped` БЕЗ `__banked`. Пока -`pop_hof.c` лежал в банке 9 рядом с `pop_ui.c`, прямой `call` был верен. -Когда `pop_hof`/`pop_config`/`pop_pal` перенесли в банк 10 ради разгрузки -банка 9, тот же `call` стал уходить в пустоту. Процессор полз по 0xFF до -0x0000, где ловушка DSS ставит B=0x27 и сворачивает процесс: закрывает его -файлы, возвращает контекст (байт 0x1E48: 2 = шелл, 3 = наша программа) и -восстанавливает страницы родителя. Именно это выглядело как «W2 подменили -у нас под ногами» — на самом деле подмена была уже уборкой трупа. - -**Фикс.** Группа помечена `__banked`; появилась -`toolchain/check_bank_calls.py`, встроенная в `app.mk` и валящая сборку -(проверено намеренной поломкой). Правило записано в `CLAUDE.md`. - ---- - - -## FINAL-HOF-GARBAGE. Таблица рекордов заливалась знаками вопроса - -**Симптом.** После фикса FINAL-BANKCALL экран HOF рисовался правильно, но -с началом ввода имени строку заливало `?` во всю ширину. - -**Корень — вторая мина того же класса, созданная первым фиксом.** Курсор -рисовался литералом: - -```c -pop_text_draw_mapped(POP_TEXT_BIG_DARK, x, baseline, "_"); /* ___str_3 в _BANK10 */ -``` - -Пока `pop_text_draw_mapped` был в том же банке, литерал был виден. После -пометки `__banked` трамплин на время вызова переключает W3 на банк 9 — -указатель показывает в чужой банк, функция читает оттуда байты до первого -нуля и рисует их знаками вопроса. Сходится и с наблюдением пользователя -«сначала рисуется правильно, потом мусор»: строка времени берётся из -локального массива (стек, W2 — виден всем), а мусор начинается с мигания -курсора. - -**Фикс.** Курсор строится на стеке. Вторая проверка -`check_bank_calls.py` предупреждает о таких случаях (проверено: на сборке -с возвращённым литералом даёт ровно одно срабатывание). - ---- - - -## KBD-ARROW-PHANTOM. Залипшая стрелка вешала ожидания насмерть - -**Симптом.** После игры (особенно 14-й уровень — он почти весь проходится -удержанием Left) текстовые экраны переставали прерываться, а «новая игра» -вставала намертво: `pop_new_game_load` начинается с -`while (kbd_raw_any_down())`. При этом ввод имени в HOF работал — -он опрашивает конкретные коды, а не всю карту. - -**Корень (подтверждён дважды: 0x72 24.08, 0x6B 27.08).** Стрелка идёт по -проводу как `E0 6B`. При переполнении 3-байтового FIFO SIO теряется -префикс, make садится в PLAIN-половину карты как код нумпада (0x6B = KP4), -а break приходит уже с префиксом и снимает бит в EXT-половине. PLAIN-бит -остаётся зажатым навсегда, `kbd_raw_any_down()` отвечает «да» вечно. -Доказано вмешательством: запись 0 в этот байт отладчиком мгновенно -перевела состояние 5 (LEVEL_LOAD) → 6 (PLAYING). - -**Фикс.** `kbd_raw_keypad_as_ext()` в libc: `kbd_raw_sync()` переносит -биты голых кодов нумпада в EXT-половину и гасит в PLAIN — make и break -начинают работать с одним битом. В PS/2 это и есть одни и те же -физические клавиши, поэтому нумпад заодно стал управлением (7/8/9, 4/6, -2 и 5 — вниз). НЕ лечит обратный случай (префикс потерян у break) — там -бит стоит уже в EXT и выглядит как реально зажатая клавиша. - ---- - - -## F10-GAMEPLAY. Выход по F10 не работал в игре - -F10 проверяется в idle-хуке, а хук висит на `gfx_wait_vsync`. Когда -игровой цикл перевели на пейсинг по лучу, он стал ждать через -`pop_wait_edge`, который звал `kbd_raw_poll` напрямую — хук не вызывался, -и F10 в геймплее умер (в заставках и меню работал). Фикс: `pop_wait_edge` -зовёт тот же `pop_idle`. diff --git a/applications/PoP/roomtest/BUGS_OPEN.md b/applications/PoP/roomtest/BUGS_OPEN.md deleted file mode 100644 index 9934154..0000000 --- a/applications/PoP/roomtest/BUGS_OPEN.md +++ /dev/null @@ -1,1149 +0,0 @@ -# roomtest — ОТКРЫТЫЕ баги и незакрытые оптимизации - -**Здесь ТОЛЬКО незакрытое.** Всё закрытое (и, что важнее, разбор корней) -живёт в [`BUGS_CLOSED.md`](BUGS_CLOSED.md) — прежде чем заводить новый баг, -грепни там по симптому. Сырые формулировки пользователя с прогонов — -[`bugs_level1.md`](bugs_level1.md) / [`bugs_level2.md`](bugs_level2.md). - -Приоритеты работ — в [`TASKS_OPEN.md`](TASKS_OPEN.md) (закрытые задачи с -протоколами — [`TASKS_CLOSED.md`](TASKS_CLOSED.md)), а не здесь. Правило -проекта: механику сверять с `../SDLPoP/src/` ДО кодинга. - -**Ревизия 2026-08-11:** файл вычищен от закрытых записей (правило «в `_OPEN` -только открытое»). Уровни 1-4 приняты smoke-тестами; крупных багов нет. - -| ID | что | тип | статус | -|----|-----|-----|--------| -| [SPRITE-ZERO-W0](#sprite-zero-w0) | кадр персонажа изредка отдаёт спрайт 0x0 (залипание уже вылечено) | **редкий** | открыт: нужна трасса маппинга W0 | -| [GATE-FORE-KID](#gate-fore-kid) | Кид в проёме ворот виден поверх решётки | окклюзия | **фикс есть, ждёт проверки в MAME** (2026-08-13) | -| [FORE-DUP](#fore-dup) | передний слой тайла рисуется дважды при перекрытии объектов | оптимизация | открыт: **сначала замерить**, потом чинить | -| [TORCH-ANIM-RIGHT](#torch-anim-right) | под запечённым пламенем застывают не только челюсти чомпера | **низкий** | открыт: на уровнях 1-4 такого соседства нет | -| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | -| [BUG-SPIKE-1](#bug-spike-1) | пики залипают выдвинутыми рядом с Кидом | **низкий** | маловоспроизводим: ни сценарием, ни попиксельной подгонкой X не поднимается | -| [BUG-CHOMP-JUMP-1](#bug-chomp-jump-1) | прыжок с места вплотную к чомперу: кадр с отступом назад | **низкий** | маловоспроизводим: на повторе не поднялся; на пререлиз | -| [GRAB-KBD-TIMING](#grab-kbd-timing) | зацеп в падении срабатывает менее стабильно, чем в оригинале | **после всех уровней** | открыт: подозрение на клавиатурный модуль, не на физику | -| [GUARD-ENTRY-DEATH](#guard-entry-death) | вход в комнату вплотную к стражу = мгновенная смерть (не портирован `bump_into_opponent`) | порт | **фикс есть, ждёт проверки в MAME** | -| [BUG-SHADOW-SET](#bug-shadow-set) | Тень на 12-м уровне дерётся спрайтами СТРАЖА: SHADOW.DAT у нас нет вовсе | порт | открыт, разбор готов | -| [PAL-L1-AFTER-INTRO](#pal-l1-after-intro) | вход в игру на уровень 1 после интро — игровая палитра не установлена (чёрный экран) | палитра/fade | открыт: воспроизведение нестабильно, корень не установлен | -| [PAL-DUNGEON-STALE](#pal-dungeon-stale) | переход 3→4 (подземелье→дворец): остаётся палитра подземелья | палитра/fade | открыт: КОРЕНЬ ЯСЕН — fade_in восстанавливает из протухшего снимка | -| [BUG-CORPSE-AIR](#bug-corpse-air) | труп Кида висит в воздухе, когда убившая его плита улетела вниз | физика | открыт | -| [LOOSE-ROOM-CHANGE](#loose-room-change) | расшатанная плита не доваливается, если Кид ушёл в соседнюю комнату | порт | закрыт 2026-08-13, кроме [LOOSE-SEAM-ANIM](#loose-seam-anim) | -| [JUMP-FLOOR-LEGS](#jump-floor-legs) | в прыжке с пола ноги Кида рисуются ПОВЕРХ кромки пола, а должны за ней | окклюзия | **корень найден и починен, ждёт проверки в MAME** | -| [MOB-CLIP-RIGHT](#mob-clip-right) | окна и узор кладки рисуются ПОВЕРХ падающих плит | окклюзия | открыт: корень найден 2026-08-13 | -| [MID-OVERLAY-LAYER](#mid-overlay-layer) | оверлей кромки всегда поверх плит и персонажей (у оригинала — midtable с сортировкой) | слои | открыт: нужен разбор архитектуры | -| [GUARD-FALLOUT-VICTORY](#guard-fallout-victory) | страж, выпавший из комнаты, не засчитывается убитым | порт | открыт: две строки | -| [KBD-STUCK-WAIT](#kbd-stuck-wait) | потерянный break-код клавиши вешает игру НАСМЕРТЬ в межуровневой заставке | клавиатура/клин | открыт: диагноз полный, чинить не сейчас (решение пользователя 2026-08-24) | -| [L10-BUTTON-DEBRIS](#l10-button-debris) | ур.10 к.1: плита упала на кнопку (1,8) — щебень есть, а решётки закрыты | кнопки/ворота | открыт: **не воспроизводится**, проверено многое (см. разбор) | -| [LOOSE-SEAM-ANIM](#loose-seam-anim) | плита в шве (col −1), уроненная в прошлой комнате, исчезает без анимации падения | **мелкий** | открыт по решению пользователя: «пока пусть будет так» | - ---- - - -## L10-BUTTON-DEBRIS. Плита, упавшая на кнопку (ур.10, к.1) — щебень есть, решётки закрыты - -**Наблюдение (пользователь, 2026-08-24).** Уровень 10, комната 1: Кид стоит -на кнопке `(1,8)` и роняет на неё плиту `(0,8)`. Кнопка превращается в -щебень, но решётки, которые она открывает, остаются закрытыми. Важная деталь -из того же прогона: на 10-й уровень пришли **телепортом Shift+L**, а не -проходом. - -**Ожидаемое поведение (оно же оригинал).** Плита, севшая на opener, жмёт его -ОДИН раз с `button_type = tiles_14_debris`; у `trigger_gate` это отдельная -ветка «открыть насовсем»: `modifier >= 188` -> сразу `0xFF`, иначе возврат 2 и -`animate_door` доводит створку до `0xFF`. Ворота с `0xFF` заморожены -открытыми, обычный opener их больше не трогает. Сама кнопка съедается в -щебень. Разобрано в [BUG-LOOSE-BUTTON-1](BUGS_CLOSED.md#bug-loose-button-1). - -**НЕ ВОСПРОИЗВЕЛОСЬ** (2026-08-24, отладочный старт `make LEVEL=10 ROOM=1 -POS=18`, MAME): Кид стоит на кнопке -> решётка `(2,7)` открылась; удар головой -роняет плиту `(0,8)`; кнопка стала щебнем; **решётка осталась открытой** и -после ухода Кида с тайла. Пользователь тоже не смог повторить в этой сборке. - -**Что проверено и совпадает с оригиналом:** - -* цепочка кнопки — ровно две цели, обе в комнате 1: `(2,9)` и `(2,7)` - (`bg = 20`, терминатор цепочки — бит 0x80 в LINKLOC, как в seg007:0C09); -* `trigger_gate` построчно равен оригиналу, включая обе ветки debris; -* `add_trob` дедуплицирует по (room, tilepos) — как `find_trob` оригинала, - двойных записей на одни ворота не бывает; -* `animate_door` гасит анимацию при `modifier == 0xFF` и доводит тип 2 до - `0xFF`; -* таймеры связей в файле уровня 10 нулевые (не «jammed» 0x1F); -* `pop_dl1/pop_dl2` перечитываются из файла при каждой загрузке уровня, а - `pop_level_reset_tiles` восстанавливает LINKMAP из эталонной страницы. - -**Живые гипотезы (по убыванию правдоподобия):** - -1. **Ветка `return 2` (створка ещё не «полностью» открыта).** Визуально - решётка выглядит открытой уже при `modifier ~ 140` (проходимость считается - как `(modifier >> 2) + 6 >= высота кадра`), а мгновенный `0xFF` требует - `modifier >= 188`. То есть глазами «открыто», а по коду — ветка с - анимацией; её в MAME поймать пока не удалось. -2. **Накопленное состояние после телепорта Shift+L** через несколько уровней - (у нас уже был такой класс: [GUARD-DROPPEDOUT-CARRY](BUGS_CLOSED.md#guard-droppedout-carry)). - Отладочный старт сразу на 10-м даёт чистое состояние — и баг не всплывает. -3. Кнопка была нажата/отпущена ранее в этой же сессии, и падение пришлось на - момент, когда trob кнопки уже умер, а таймер связи ещё не истёк. - -**Как ловить в следующий раз:** как только симптом повторится — сразу -**QuickSave (F6)**, не выходя из сцены. Сохранение везёт с собой LINKMAP -(`pop_level_qsave` пишет `pop_dl1/pop_dl2`) и модификаторы комнат, то есть даёт -ровно то состояние, которое сейчас не удаётся собрать искусственно. - ---- - - -## KBD-STUCK-WAIT. Потерянный break-код вешает игру насмерть в межуровневой заставке - -> **Решение пользователя (2026-08-24): не чинить сейчас.** Записан разбор и -> варианты; вернуться, когда дойдут руки до клавиатурного слоя. - -**Наблюдение (пользователь, 2026-08-24).** Нажат Shift+L (чит «следующий -уровень») — игра встала намертво: картинка прежнего уровня, реакции нет. - -**Диагноз (снят в живой сессии MAME).** Программа НЕ рухнула и не потеряла -кадровые прерывания — IRQ приходили штатно (вход по вектору виден в -`history`). Стояли в `pop_pre_cutscene_show` (pop_intro.c:949), в его первом -цикле: - -```c -while (kbd_raw_any_down()) { kbd_raw_sync(); gfx_wait_vsync(); } -``` - -Цикл намеренный: клавиша, которой закончили уровень (тот самый Shift+L), не -должна тут же сойти за «пропустить заставку». Внутри — `gfx_wait_vsync` -(опрос бита 5 порта #FE), он отрабатывал нормально; не выходил ВНЕШНИЙ цикл. - -Причина — залипший бит в `_kbdraw_down[]`: код `0x72` в PLAIN-половине карты -(то есть **keypad 2**; стрелка Down — это `E0 72` и живёт в EXT-половине, -байт 46). Состояние на момент разбора: `_kbdraw_active = 1`, -`_kbdraw_pending = 0`, `_kbdraw_overrun = 0` — то есть штатная страховка по -Rx-overrun не срабатывала. Гашение бита отладчиком (`_kbdraw_down[14] = 0`) -сразу вернуло игру к жизни: заставка прошла, уровень 2 загрузился. - -**Чем бит может залипнуть** (разбор `libc/irq/_irq_tramp.c`): - -1. **Потерянный break при переполнении FIFO SIO.** Приёмник глубиной 3 - байта; когда прерывания запрещены надолго (загрузка уровня через ESTEX — - ровно момент Shift+L), пачка `F0 code` не помещается. Защита есть - (чтение RR1 → `_kbdraw_overrun` → `kbd_raw_sync()` снимает held), но она - срабатывает, только если SIO успел выставить сам бит overrun. -2. **Разъехавшийся префиксный автомат.** `F0` (break) и `E0` (ext) — отдельные - байты, состояние копится в `_kbdraw_pending`; любой сброс между префиксом - и кодом переворачивает смысл, и break декодируется как MAKE. Ветка - «fake shift» (`E0 12` / `E0 59`) делает это по построению — она гасит - `pending` и пишет код как make даже у break-формы. -3. **Make и break у разных владельцев канала.** Пока `_kbdraw_active == 0`, - байты уходят DSS. Клавиша, нажатая до `kbd_raw_open()` (или в момент - close/open), даёт make одному владельцу, а break — другому: снимать - нечего, бит остаётся. -4. **Держащий вход эмулятора.** `set_input ... frames=0` из MCP-моста держит - клавишу нажатой, typematic шлёт make повторно (наблюдалось: погашенный - отладчиком бит возвращался). Это артефакт отладки, а не игры, но именно - он мог создать исходное состояние в этой сессии. - -**Варианты решения.** - -| Вариант | За | Против | -|---------|----|--------| -| **A. Таймаут в циклах ожидания** (ждать отпускания не дольше ~1 с, дальше идти) | Дёшево, локально; снимает КЛАСС отказа «вечный клин» независимо от причины; заставка от лишней секунды не страдает | Лечит симптом, а не причину: залипшая клавиша дальше продолжит «нажиматься» в gameplay | -| **B. Анти-залипание в `kbd_raw`** (гасить биты, которые давно не подтверждались typematic-повтором) | Чинит класс причин целиком, помогает и в gameplay | **Модификаторы typematic НЕ повторяют** (обжигались: `kbd_overrun_wipe_modifiers`) — значит Shift/Ctrl гасить нельзя, нужен список исключений; плюс хранение «свежести» на 512 кодов дорого, придётся огрублять | -| **C. Ужесточить страховку по overrun** (чистить held не только по биту RR1, но и по «подозрительным» ситуациям: длинный DI, возврат из загрузки) | Бьёт по самой вероятной причине (1); дёшево по памяти | Эвристика: можно снять РЕАЛЬНО зажатую клавишу (Кид перестанет бежать посреди разбега) | -| **D. Ничего, считать артефактом отладки** | Ноль работы | Если это не мост, а SIO, то на железе получаем намертво зависшую игру — худший класс отказа | - -**Если возвращаться — начинать с точной причины:** лог байтов SIO в -трамплине (кольцо на 32-64 байта + дамп по клавише) и повтор сценария -«Shift+L во время дисковой загрузки». Без этого выбор между B и C — гадание. - -**Смежное:** `kbd_raw_fifo_drain`, `kbd_overrun_wipe_modifiers` в memory — -там уже закрытые случаи залипания того же битмапа. - ---- - - -## CUTSCENE-LTR. Переходы story через экран TITLE — ЗАКРЫТ 2026-08-26 - -Разбор и что именно добавилось — [`BUGS_CLOSED.md`](BUGS_CLOSED.md#cutscene-ltr). - ---- - - -## PV-MUSIC-STALL. В сцене с принцессой звучала только первая реплика — ЗАКРЫТ 2026-08-26 - -Разбор — [`BUGS_CLOSED.md`](BUGS_CLOSED.md#pv-music-stall). - ---- - - -## GRAB-KBD-TIMING. Зацеп в падении срабатывает НЕ ТАК СТАБИЛЬНО, как в оригинале — РАЗБОР ПОСЛЕ ВСЕХ УРОВНЕЙ - -> **Решение пользователя (2026-08-12): отложено до готовности всех уровней.** -> Механика работает, это вопрос ощущения, а не проходимости. - -**Наблюдение (пользователь).** Вход на уровень 7: Кид влетает в комнату сверху -и, пролетая мимо края пола, МОЖЕТ за него зацепиться — но получается заметно -реже, чем в оригинале. «Похоже, это проблемы нашего клавиатурного модуля». - -**Что уже сделано и почему это НЕ закрывает вопрос.** В ходе разбора -[GRAB-BELOW-ROOM](BUGS_CLOSED.md#grab-below-room) восстановлена ветка -`ACT_MIDAIR` в `check_action` (кадры 102..105 — начало падения, где `fall_y` ещё -не разогнан): раньше на этих четырёх кадрах `check_grab` не звался вовсе, то -есть окно зацепа было короче оригинального. Это должно было добавить -стабильности, но саму гипотезу про клавиатуру не проверяет. - -**Куда смотреть, когда дойдут руки.** Порядок именно такой — сначала -измерить, потом чинить: - -1. Снять, ЧТО видит движок в момент падения: `pop_ctrl_shift_held()` покадрово - (Shift зажат заранее — читается ли он каждый кадр, или FIFO SIO отдаёт - состояние с пропусками; см. memory `kbd_raw_fifo_drain`, - `kbd_overrun_wipe_modifiers` — оба прошлых бага были именно про модификаторы). -2. Сверить с оригиналом ширину окна по кадрам: у нас `check_grab` доступен на - 102..105 (midair) + весь `ACT_FREEFALL`, как в seg006 — расхождений в коде - быть не должно, значит расхождение либо во вводе, либо в темпе игры - ([L1-SPEED](TASKS_OPEN.md#l1-speed): игра идёт на ~39 % быстрее оригинала, - а окно зацепа отмеряется В КАДРАХ — то есть по времени оно у нас короче). -3. Хост-тест `t_grab.c` уже умеет мерить ширину окна (карта исходов по фазе X и - задержке нажатия) — на нём и проверять «стало стабильнее». - -### Протокол замера (написан 2026-08-12, чтобы следующий заход начался с фактов) - -Пользователь связывает с этим же и «двойные срабатывания не вовремя». Прежде -чем трогать драйвер — доказать, что он вообще виноват: **сегодняшний случай -«Кид ходит как с зажатым Shift» оказался артефактом MCP-моста, а не драйвера** -(`pause` освободил 6 незакрытых входов, которые плагин переустанавливал каждый -кадр; как только они отпустились, драйвер снял бит сам). То есть break-коды -драйвер обрабатывает верно, и ложная тревога здесь стоила часа. - -Что мерить: - -1. **Поток скан-кодов**: кольцевой лог в трамплине прерывания - (`libc/irq/_irq_tramp.c` / `kbd_raw_poll.c`) — байт кода, флаг make/break, - номер кадра. Читать из MAME по адресу буфера (`mem`), как читаем `_Kid`. -2. **Что увидел движок**: `pop_ctrl_shift_held()` и битмап `_kbdraw_down` - (адрес — из `.map`, для roomtest 0xAEF9) на тех же кадрах. Расхождение - «код пришёл, а движок не увидел» = потеря в драйвере; «кода не было, а бит - стоит» = потеря break (то, что подозревает пользователь). -3. **Сцены**: бег с отпусканием, разворот, вис + отпускание Shift, падение с - зажатым заранее Shift (вход на уровень 7), быстрое повторное нажатие - (проверка «двойного срабатывания» — typematic, см. memory - `kbd_overrun_wipe_modifiers`). - -Что считать нормой: каждому make ровно один break; между make и видимым -`kbd_raw_down()` — не больше кадра; при удержании typematic-повторы НЕ должны -доходить до `pop_ctrl` как новые нажатия (диспетчер ждёт фронт). - -Отдельная гипотеза, которую замер тоже закроет: окно зацепа отмеряется В -КАДРАХ, а игра идёт на ~39 % быстрее оригинала ([L1-SPEED](TASKS_OPEN.md#l1-speed)) -— тогда «менее стабильно» это не клавиатура, а темп, и чинить надо темп. - ---- - - -# С приёмки уровня 2 (2026-08-07) - -Всё найденное тем прогоном закрыто, кроме двух записей ниже -(`BUG-SPIKE-1` — уровень 2, комната 6). Карта содержимого уровня 2 (что где -стоит по `res2002.bin`, какие кнопки какие ворота открывают) — в -[`TASKS_CLOSED.md`](TASKS_CLOSED.md#l2-pass), по ней видно, «механика не -сработала» это или «так и задумано». - - -## BUG-SPIKE-1. Пики залипают выдвинутыми — НИЗКИЙ ПРИОРИТЕТ, МАЛОВОСПРОИЗВОДИМ - -> **Статус 2026-08-05, вечер.** Пользователь **повторить не смог**, а замер -> (ниже) показал, что чистый пробег по убранным пикам убивает штатно. То -> есть в смертельности бага, похоже, нет вовсе: наблюдался частный случай — -> пики, УЖЕ выдвинутые полностью (h = 1), для бегущего безвредны и в -> оригинале. Запись оставлена открытой ровно из-за визуального расхождения -> со скриншотом SDLPoP (у нас острия торчат, у него убраны) — см. конец. -> -> **Как получить состояние нарочно:** подойти к пикам вплотную (выдвинутся), -> отступить на полшага, НЕ выходя из зоны срабатывания, и пробежать по ним. -> Пользователь пробовал и это, и попиксельную подгонку X читом `[`/`]` — -> не поднялось. Вывод для будущего разбора: состояние **не чисто -> позиционное**, одной шириной габарита его не объяснить; следующий -> подозреваемый — момент, в который `process_trobs` застаёт модификатор -> относительно кадра Кида. - -**Наблюдение (пользователь, 2026-08-05).** Уровень 2, комната 6, пики (1,3): - -| действие | что происходит | -|----------|----------------| -| длинный прыжок с ряда 0 на пики | **смерть — правильно** (путь `fell_on_spikes`) | -| пробег по ряду 1 прямо по пикам | **урона нет** | -| после уборки пик | **на экране остаются белые остатки остриёв** (в оригинале чисто) | -| прыжок на месте, стоя на пиках | урона нет | -| просто стоять на выдвинутых пиках | можно сколько угодно | - -**Замер (MAME, чтение `room_modif` комнаты 6).** Пока Кид стоит на тайле, -модификатор пики (индекс 13) = **0x8E**, то есть «пики ПОЛНОСТЬЮ вышли и -идёт обратный отсчёт». Дальше вся арифметика сходится с оригиналом: - -``` -is_spike_harmful (seg007:1178): 0/-1 → 0; <0 → 1; 1..4 → 2; >=5 → 0 -check_spiked (seg006:0658): убивает при h>=2 на кадрах бега 7..14 - и при h!=0 на кадрах приземления 43/26 -``` - -То есть **при h = 1 (пики уже вышли) бегущий не гибнет и в оригинале** — -смертельно только окно ВЫДВИЖЕНИЯ (модификатор 1..4, h = 2). Наши -`animate_spike`, `start_anim_spike`, `is_spike_harmful`, `check_spiked` -сверены с seg006/seg007 построчно и совпадают дословно. - -**ВТОРОЕ НАБЛЮДЕНИЕ (то же место, сравнение с оригиналом).** Кид уронил -плиту-потолок и спрыгнул вниз; пики выдвинулись и «спрятались не все — часть -артефактов осталась». Скриншоты рядом: -[наш](bugscreens/l2-r6-spikes-ours.png) и -[SDLPoP](bugscreens/l2-r6-spikes-sdlpop.png) в той же позе. У нас из-под -щебня торчат белые острия, у оригинала пик не видно ВООБЩЕ. - -**ГИПОТЕЗА «ТРИГГЕР СРАБАТЫВАЕТ РАНО» ПРОВЕРЕНА И ОПРОВЕРГНУТА (замер -2026-08-05, MAME, watchpoint на `room_modif[13]` комнаты 6).** Чистый -пробег по УБРАННЫМ пикам убивает штатно: - -``` -запись modif=1 : кадр 11 (беговой), x=112, curr_col=2 ← пики пошли вверх -запись modif=2 : кадр 12 (беговой), x=117, curr_col=3 ← Кид уже НА тайле, h=2 -запись modif=3 : кадр 177 (frame_177_spiked) ← напоролся -``` - -То есть `check_spike_below`, `check_spiked`, `is_spike_harmful` и тайминг -выдвижения работают правильно, и «раннего» триггера нет. - -**Настоящий корень — пики ЗАЛИПАЮТ выдвинутыми.** Пока габарит Кида -накрывает колонку пики, `check_spike_below` каждый кадр зовёт -`start_anim_spike`, а тот при отрицательном модификаторе переставляет его -обратно в 0x8F — отсчёт до уборки не доходит. А выдвинутые пики (h = 1) -для бегущего БЕЗВРЕДНЫ по правилам оригинала. Отсюда обе жалобы: пробег -по уже вышедшим пикам не убивает, и они же остаются торчать на экране. - -**Что осталось выяснить (и это единственный открытый вопрос).** Код -`start_anim_spike` у нас с оригиналом совпадает дословно, значит оригинал -тоже удерживал бы пики, стой Кид там же. На скриншоте SDLPoP в похожей -позе пики УБРАНЫ — то есть его Кид стоит чуть левее и его габарит колонку -пики уже не задевает. Разница в 2–3 пикселя посадки, а у нас такие -расхождения по X уже ловились (см. заметку в BUG-GRAB-1: после касания -площадки SDLPoP уводит Кида на 134, мы — на 141). - -**Как закрывать:** инструментировать SDLPoP (печать `char_x_left/right`, -`left/right_checked_col` и модификатора пики каждый кадр), проиграть ту же -сцену — падение плиты-потолка в комнате 6 и остановку на щебне — и сверить -с нашей трассой ПОЗИЦИЮ КИДА после приземления. Если позиции совпадут, а -диапазоны колонок разойдутся — виноват габарит (`kid_fp` против -`set_char_collision` текущего кадра); если разойдутся позиции — это отдельный -баг посадки, а пики — его следствие. - ---- - - - ---- - -# Оптимизация отрисовки (записано 2026-07-29) - -Не баги — план работ. Оба пункта про одно: у оригинала пометка тайла к -перерисовке стоит копейки (бит в таблице, которая всё равно чистится каждый -кадр), а у нас каждая такая пометка превращается в реальный heal (копию из -ОЗУ-копии акселератора) плюс блиты. Поэтому буквальный порт «перерисовываем -безусловно» корректен, но дорог. - - -## T-1. Пики: перерисовывать по причине, а не безусловно - -**Сейчас:** `pop_process_trobs` зовёт `pop_spike_redraw` каждый кадр для -каждой живой пики в комнате (порт `redraw_21h`, который `animate_spike` -вызывает вне всяких `if`). Это корректно, но лишнее для пик, до которых -Киду дела нет. - -**Надо:** перерисовывать тайл пики, только если -1. **сменился её видимый кадр** (шаг выдвижения/уборки), ЛИБО -2. **её кто-то стёр** — а стереть у нас может только heal, то есть тайл - попал в прямоугольник `kid_heal` этого кадра. - -Это и есть модель оригинала, просто выраженная флагами: `redraw_at_char` -(seg003:0576) каждый кадр помечает `set_redraw_fore` тайлы персонажа, причём -**объединение текущего и предыдущего** прямоугольника -(`MIN(char_top_row, prev_char_top_row)` и т.д.), а `animate_spike` помечает -свой тайл. Итог = {тайл сменил кадр} ∪ {тайлы Кида}. - -**Как:** слой Кида и так считает `cL..cR`/`rT..rB` в `pop_fore_over_kid` — -пусть публикует их (плюс предыдущие, как в оригинале), а цикл trob'ов -сравнивает `tilepos` с диапазоном целочисленно. Никаких пересечений -прямоугольников (см. память `manual_hints_over_auto_detect`). - -**Приоритет:** отдаётся почти бесплатно ПОСЛЕ T-2, отдельно не окупается. - - - ---- - - - -## BUG-CHOMP-JUMP-1. Прыжок с места вплотную к чомперу: кадр с отступом назад — НИЗКИЙ ПРИОРИТЕТ, МАЛОВОСПРОИЗВОДИМ - -> **Статус 2026-08-08.** Наблюдение пользователя на приёмке L3-CHOMP: Кид -> стоит вплотную СЛЕВА от чомпера лицом вправо, прыжок с места — в анимации -> проскакивает кадр, где он «чуть отступил назад», и только потом идёт -> прыжок. В оригинале прыжок идёт прямо с места. **На повторе в тот же -> заход не воспроизвёлся** — отложено до пререлиза. - -**Что уже установлено (чтобы не разбирать заново).** - -1. **Это НЕ анимация.** `seq_3_standing_jump` (SDLPoP `seqtbl.c:382`) - состоит только из положительных смещений: - `act(run_jump), f16, f17, dx(2) f18…f22, dx(7) f23, dx(9) f24, dx(5) dy(-6) f25`. - Ни одного отрицательного `dx` — отката в последовательности нет вовсе. - Значит отступ даёт `bumped()`, то есть физика посчитала въезд в - препятствие и выровняла `Char.x` назад. - -2. **`is_obstacle` для чомпера у нас совпадает с оригиналом** (seg004:037E): - препятствие только при `modif == 2`, причём именно `== 2`, БЕЗ маски - `0x7F` — то есть окровавленный чомпер (`0x82`) в ванили не бампит вовсе. - Проверено, расхождения нет. - -3. **Прямая трасса прыжка отката НЕ показала.** Ввод «UP и RIGHT - одновременно» (mame bridge, `key UP 24` + `key RIGHT 24`) даёт чистое - движение вперёд: `x` 148 -> 155, кадр становится 178 (перемололо). Ни - одного кадра с уменьшением `x`. - -**Главная гипотеза — ПОРЯДОК НАЖАТИЙ.** Если ↑ приходит на кадр раньше →, -то `control_standing` уходит не в `standing_jump()`, а в `up_pressed()` — -вертикальный прыжок с зацепом, а он **выравнивает `Char.x`**. Отсюда и -«отступил, потом прыгнул». Проверять надо `check_jump_up` / -`jump_up_or_grab` / `grab_up_no_floor_behind` (seg005:0836 и далее), а не -прыжок с места. Внимание на `can_climb_up` (seg005:0828): там у чомпера -ЕСТЬ спецкейс (`seq_73_climb_up_to_closed_gate` при взгляде ВПРАВО) — он у -нас портирован (`pop_map.c`, ветка `TILE_MIRROR || TILE_CHOMPER`), но именно -вокруг него и стоит копать. - -**Как ловить.** Брейкпоинт на резидентном `_kid_tick` с -`{printf "f=%d x=%d act=%d col=%d",b@Kid+0,b@Kid+1,b@Kid+6,b@Kid+4; g}` — -одна строка на кадр, адрес `_Kid` из `.sprinter-cc-roomtest/roomtest.map` -(после КАЖДОЙ пересборки другой). Плюс стоп-кадр `1` в момент отступа и -чтение `Kid` из памяти. Метод — memory `z80_profiling_method`. - ---- - -## Заметки (отладка) - -- Тестовые клавиши осторожного шага: **J** = шаг влево, **L** = шаг вправо - (эмуляция Shift+стрелка), см. `pop_ctrl.c` `KBD_DBG_STEP*`. Первый шаг в - сторону = разворот (как в оригинале safe_step), движение со второго. -- Читы (`pop_cheat.h`): **K** — убить стража, **I** — бессмертие (toggle), - **S** — выдать меч, **Shift+L** — следующий уровень, **`[`/`]`** — сдвиг - Кида на пиксель по X. -- Респавн после смерти — по **↑** (или авто через `RESPAWN_DELAY`); ставит - Kid в стартовую позицию УРОВНЯ (`pop_start_level`, порт do_startpos). -- **ROOMNAV (`=`/`-`) — тоже наш чит**, которого в оригинале не было, как и - `S`. Все они со временем съедутся в общий блок читов, разрешаемый в - настройках; пока просто включены (`pop_cheats = 1` в `roomtest.c`). - Известный баг этого чита закрыт — [BUG-CHEAT-FIGHT-1](BUGS_CLOSED.md#bug-cheat-fight-1). -- Комнаты **13, 18, 24 уровня 1 недостижимы** в обычной игре — это свойство - данных уровня (разбор — «НЕ БАГИ» в [`BUGS_CLOSED.md`](BUGS_CLOSED.md)); - приоритет багов в них низкий. Аналогично 23/24 на уровне 3. - - ---- - - -## TORCH-ANIM-RIGHT. Под пламенем могут застыть не только челюсти чомпера - -Открыто 2026-08-10 при закрытии -[BUG-TORCH-CHOMP-2](BUGS_CLOSED.md). - -Пламя факела запекается в фон и рисуется в ячейке ПРАВОГО СОСЕДА. Оригинал -после каждого кадра факела метит этого соседа (`set_redraw_anim_right`, -seg007:0101) и перерисовывает весь его слой `anim` поверх огня; мы метим -только когда сосед — чомпер. Слой `draw_tile_anim` (seg008:0644) рисует -также **пики, зелье и меч** — если такой тайл окажется справа от факела и -будет в статике, пламя накроет и его. - -На уровнях 1–4 такого соседства не встретилось, поэтому расширять пометку -(она стоит перерисовки тайла каждый кадр на каждый факел) заранее не стали. - -**Как проверять:** поставить факел слева от пики/меча/зелья в тестовой -комнате и дождаться статики; либо пройти уровни 5+ и смотреть на клетку -справа от каждого факела. - -**Как чинить, если встретится:** там же, в ветке факела `pop_process_trobs`, -добавить в `trob_rcode`-проверку нужные коды и соответствующий вид пометки -(`POP_RD_SPIKE` / `POP_RD_FLOOR`), а зелье — переставить в порядке обхода -так, чтобы оно рисовалось ПОСЛЕ факела. - ---- - - -## FORE-DUP. Передний слой тайла рисуется ДВАЖДЫ при перекрытии объектов - -Найдено пользователем 2026-08-10 (вопросом, а не по симптому — картинка -верная, страдают только такты). - -**У нас.** Fore-проход зовёт КАЖДЫЙ рисующий по своему прямоугольнику: -`pop_char_fore` для слотов Кида и соперника, `pop_mirror_draw` для отражения. -Окно клипа (`pop_fore_set_clip`) у каждого своё. Если футпринты двух -объектов накрывают один тайл, его передний кусок рисуется два раза. - -Когда случается: -- **Кид и отражение** — ВСЕГДА (стоят на одном тайле зеркала); этот случай - создан фиксом fore-прохода над отражением 2026-08-10; -- **Кид и соперник в одном тайле** — то есть весь ближний бой; -- Кид и падающий кусок плиты. - -**Картинку не портит:** куски переднего слоя идут прозрачным блитом-копией, -операция идемпотентная. Портило бы при XOR/mono с накоплением — таких в -fore-слое нет. - -**Такты тратит,** и в самом дорогом месте: fore-проход исторически самая -тяжёлая часть кадра (memory `pop_fore_layer_cost` — было 78 % кадра, окно -клипа и кэш кладки дали 3.2×). - -**Как устроено в оригинале — дубль НЕВОЗМОЖЕН по построению.** -`redraw_at_char` (seg003:0427) ничего не рисует, а только помечает тайлы -своего прямоугольника: - -```c -for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row) - for (tile_col = x_col_left; tile_col <= x_col_right; ++tile_col) - set_redraw_fore(get_tilepos(tile_col, tile_row), 1); -``` - -а `set_redraw_fore` (seg007:0550) — это `redraw_frames_fore[tilepos] = frames`, -ПРИСВАИВАНИЕ. Два персонажа на одном тайле оставят там ту же единицу, и -единственный обход тайлов нарисует передний кусок один раз. - -**Что делать.** Механизм пометок у нас уже есть и прямо назван портом этой -архитектуры — `pop_redraw.h`. Fore-слой остался единственным местом на -прямом вызове. Приведение к оригиналу: `pop_char_fore`/`pop_mirror_draw` -вместо прохода ставят пометки, а один проход в конце кадра их разбирает. - -**СНАЧАЛА ЗАМЕРИТЬ, потом чинить.** Это самый горячий путь, и окно клипа -(вместо перебора тайлов) в своё время дало 3.2× — переход на пометки может -часть этого вернуть назад. Замер: брейкпоинт на листьях fore-слоя со -счётчиком, сцена «бой в комнате 3 уровня 1» и «Кид на тайле зеркала, -ур. 4»; сравнить число нарисованных кусков с числом уникальных тайлов. -Если дубль мал — оставить как есть и закрыть запись. - ---- - ---- - - -## SPRITE-ZERO-W0. Кадр персонажа изредка отдаёт спрайт 0x0 — РЕДКИЙ - -Всплыло при разборе [BUG-CHAR-STALE-PAGE](BUGS_CLOSED.md#bug-char-stale-page) -(тень застыла на двух страницах в разных позах). Залипание слота вылечено — -`cd_sig_make` больше не берёт снимок, если кадр не рисовали, — но САМА -причина нулевого спрайта не найдена: `atlas_image` для валидного кадра -изредка отдаёт запись 0x0. - -Подозрение: конкуренция за окно W0. `pop_char_draw` маппит страницу атласа -(`gfx_w0_map(pages[page].page)`) и держит её до `gfx_w0_unmap()` в конце, а -внутри этого окна успевают отработать `cd_splash` и `pop_sword_draw`; рядом -в кадре W0 маппят чтение данных уровня (`pop_level_tile`, `pop_level_set_tile`) -и mob-тик. Если какой-то путь размапливает окно раньше времени, чтение -заголовка спрайта даст нули. - -Как ловить: watchpoint на порт окна 0 либо счётчик «w==0 при непустом кадре» -в `pop_char_draw` с записью кадра/страницы/idx в отладочную ячейку, дальше -читать её из MAME. Симптом редкий (пользователь поймал дважды). - - -## GATE-FORE-KID. Кид, стоящий В ПРОЁМЕ ворот, виден ПОВЕРХ решётки — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -> **Портировано 2026-08-13** (повтор нашёлся на уровне 10, комната 7, тайл -> (2,6) — подтверждено чтением памяти MAME: `Kid.room=7, curr_row=2, -> curr_col=6`, код тайла `0x04`). Сделано так: -> -> * **решение** — `pop_gate_over_char(ch)` в `pop_map.c`: персонаж стоит на -> тайле ворот текущей комнаты (колонки 0..8; девятая отсекается, там бары -> легли бы в соседнюю комнату — у оригинала это `Kid.room != room_R`); -> * **отрисовка** — `draw_gate_fore` в `pop_bg.c`, точный порт seg008:1153: -> только прозрачные куски 51 + ломти 52, без непрозрачного 50 и без -> хвостового `DOOR_FRAM_SLICE` (фон под барами уже нарисован). Зовётся -> ОДИН раз на персонажа за кадр, не в тайловом цикле; -> * **тесты** — `tests-host/t_char.c`: `char_gate_covers_char_standing_in_it`, -> `char_gate_ignores_neighbour_tiles`, `char_gate_ignores_other_room`, -> `char_gate_never_in_last_column`. Отрисовка в харнесс не линкуется, -> поэтому проверяется именно решение — ради этого оно и вынесено в карту. -> -> Расхождение с оригиналом (осознанное, в `docs/impl_diff.md`): оригинал -> спрашивает жёстко про `Kid`, потому что foretable у него одна на проход -> тайлов; у нас fore-проход идёт по персонажу, поэтому спрашиваем про того, -> кого рисуем — страж в проёме тоже уходит за решётку. -> -> Шовный случай (ворота у СОСЕДА слева) работал и раньше — он ниже. -> Банк 2 +601 Б, банк 3 +92 Б, резидент не изменился. - -Нашёл пользователь 2026-08-11 (уровень 5, комната 24, верхние ворота): -Кид стоит на тайле ворот, а решётка рисуется ПОД ним — он виден целиком, -хотя должен быть за прутьями. - -**Как в оригинале.** `draw_tile_fore` (seg008:0D15) первой же строкой: - -```c -if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - Kid.curr_col == drawn_col - 1 && Kid.room != room_R) { - draw_gate_fore(); -} -``` - -то есть когда Кид стоит ИМЕННО на тайле ворот, их решётка дорисовывается -в **foretable** — поверх персонажа: `draw_gate_fore` (seg008) кладёт спрайт -51 (низ решётки) и дальше вверх кусками по 8 px спрайтом 52, до -`gate_top_y`, прозрачным блитом. - -**Что есть у нас.** Портирован только ШОВНЫЙ случай (`pop_bg.c`, -`pop_fore_over_char`): если футпринт зашёл за левый шов и у соседа слева в -этом ряду ворота — их бары перерисовываются поверх персонажа через -`draw_gate_back`. Случая «ворота ВНУТРИ комнаты, персонаж на их тайле» -нет вовсе, отсюда симптом. - -**Почему не чинится одной строкой.** Правка идёт в `pop_fore_over_char` — -самый горячий путь кадра (memory `pop_fore_layer_cost`: когда-то 78 % -кадра, окно клипа дало 3.2×). Добавлять проверку надо так, чтобы она не -стоила ничего на каждом тайле футпринта: условие дешёвое (`тайл под -персонажем == ворота`), но рисование — это ещё один блит на кадр, пока -Кид стоит в проёме. Плюс нужен свой расчёт полосы (`gate_top_y` по -живому openness), а не готовый `draw_gate_back`, который рисует ЗА -персонажем. - -**Проверять:** уровень 5, комната 24 — встать в проём верхних ворот -(колонка 1 ряда 0) при частично поднятой решётке; прутья должны -перекрывать Кида. Тот же случай — любые ворота на уровнях 1-3. - ---- - - -## GUARD-ENTRY-DEATH. Вход в комнату со стражем вплотную = мгновенная смерть — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -**Наблюдение (пользователь, 2026-08-13).** В некоторых ситуациях (особенно -после телепортов) Кид, входя в комнату, сразу оказывается чуть ли не в одном -тайле со стражем и немедленно погибает: меч ещё в ножнах, а безоружному любой -укол смертелен. - -**Что в оригинале.** Стража при входе НЕ отбрасывает — проверено по SDLPoP: -`enter_guard` (seg002:0112) ставит его ровно в тайл из данных уровня -(`Char.x = level.guards_x[room-1]`), никаких проверок дистанции до Кида нет. -Ситуация «вошёл вплотную» возможна и там. Защит четыре: - -1. **`bump_into_opponent` (seg003:08AA)** — главная. Безоружный Кид - (`Char.sword == sword_0_sheathed`) при вооружённом сопернике - (`Opp.sword != sheathed`, `Opp.action < 2`), лицом к лицу - (`Char.direction != Opp.direction`) и `can_guard_see_kid >= 2`, на - `ABS(char_opp_dist()) <= 15` не получает укол, а ОТСКАКИВАЕТ: `Char.y` - прижимается к полу, `fall_y = 0`, `seq_47_bump`. -2. Кид сам достаёт меч — `control_standing` (seg005:0351). -3. Страж поднимается в стойке покоя с мечом в ножнах — `seq_77`, ему нужно - сперва заметить Кида (`autocontrol_guard_inactive` → `move_down_forw`). -4. Вплотную страж не колет: `autocontrol_guard_active` при `distance < 12` - (или `< 8` с убранным мечом) разворачивается/шагает, а `check_hurting` - требует `min_hurt_range = 8` для безоружного противника. - -**Корень у нас.** Пункты 2-4 были портированы верно (`pop_ctrl.c:288`, -`pop_guard_cold.c:107`, `guards.c:553`), а **пункт 1 не портирован вовсе**: -в `kid_phys` (`pop_map.c`) между `determine_col()` и `check_collisions()` -было пусто, тогда как `play_kid_frame` (seg000:1238) зовёт там -`bump_into_opponent`. Без отскока дистанция успевает вырасти в рабочий -диапазон удара 8..29 — и первый же `move_6_shift` стража даёт -`hurt_by_sword` с `take_hp(100)`. - -**Сделано.** `bump_into_opponent` портирован в `pop_map.c` (рядом с -`bumped_floor`) и вызывается из `kid_phys` на штатном месте. Резидент не -вырос, банк 3: 11066 → 11156 Б. Опциональные фиксы SDLPoP -(`fix_painless_fall_on_guard`, `fix_jumping_over_guard`) намеренно НЕ -портированы — оставлено базовое поведение движка 1989 года. - -**Проверять:** войти в комнату со стражем вплотную (телепортом `+`/`−` или -`Shift+L`) без меча в руке — Кид должен отскочить с `seq_47`, а не умереть; -падение на стража сверху по-прежнему безболезненно (это оригинал, не баг). - ---- - - -## LOOSE-ROOM-CHANGE. Расшатанная плита не доваливается, если Кид ушёл в соседнюю комнату — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -**Наблюдение (пользователь, 2026-08-13).** Уровень 10, комната 2: в (2,9) -стоит плита, которая под бегом Кида должна разрушаться. Если Кид пробегает -по ней и уходит в правую комнату, плита не успевает разрушиться и упасть — -переключение комнаты обрывает алгоритм. - -**Что в оригинале.** loose-пол — обычный **trob** (`make_loose_fall`, -seg007:0EF6 → `add_trob(curr_room, curr_tilepos, 0)`), а `process_trobs` -(seg007:0000) крутит ВЕСЬ список каждый кадр, независимо от `drawn_room`: -`animate_tile` делает `get_room_address(trob.room)` и работает с таблицей -той комнаты, где trob живёт. Фаза лежит в `curr_room_modif`, то есть прямо -в таблице уровня. Поэтому брошенная плита досчитывает до -`loose_floor_delay`, `remove_loose` убирает тайл, `add_mob` рождает кусок — -и всё это без Кида в комнате. Ровно так же ведут себя `mobs[]` -(`do_mobs`, seg007:1063) — их список чистится только в `start_level`. - -**Корень у нас.** Падающие КУСКИ (mob) чужую комнату умели давно -(`pop_loose_mob_room_changed`, [BUG-LOOSE-2](BUGS_CLOSED.md)), а вот ФАЗА -тряски/отсчёта жила в `pop_loose_modif[30]` — массиве ТЕКУЩЕЙ комнаты, — -и `pop_loose_reset()` при смене комнаты обнулял его целиком. То есть -плита, брошенная на полпути, возвращалась в покой. То же для плит-потолков -(`pop_ceil_modif[10]`). - -**Сделано** (двухуровневое хранение вместо переноса всей механики в trob — -`pop_loose_modif` остаётся быстрым массивом отрисовки текущей комнаты): - -1. `pop_loose_leave_room()` (`pop_map.c`, зовётся первым делом в - `enter_room_side`, пока карта ещё описывает СТАРУЮ комнату) — сдаёт фазу - всех loose-тайлов в персистентный `room_modif` (это и есть - `curr_room_modif` оригинала) и заводит trob на незаконченные. -2. `animate_loose()` (`pop_trob.c`, case `TILE_LOOSE` в `pop_process_trobs`) - — досчитывает фазу заочно; на провале ставит тайл в EMPTY - (`pop_level_set_tile`), кладёт в модификатор тип уровня (`remove_loose`) - и рождает кусок через новый `pop_loose_mob_spawn_at(room, row, col)`. - Пока комната ОТРИСОВАНА, trob снимается сразу — хозяин фазы - `pop_loose_tick`. -3. `pop_loose_reset()` теперь не обнуляет, а ЗАБИРАЕТ фазу новой комнаты из - `room_modif`: вернувшийся Кид застаёт плиту на той же фазе. -4. `pop_loose_forget()` — старт/рестарт уровня: забыть фазы БЕЗ сдачи - (у оригинала всё сносит `load_level`). Без него первый же `enter_room` - после `pop_trob_reset()` занёс бы в свежий уровень дрожь из прошлой жизни. - -Резидент не изменился (20569 Б); банк 3 +451 Б, банк 6 +181 Б, банк 7 +62 Б. -Хост-тест `phys_loose_survives_room_change` (`tests-host/t_phys.c`) закрывает -передачу фазы. - -**Проверять:** уровень 10, комната 2 — пробежать по плите (2,9) в правую -комнату и вернуться: дыра должна быть на месте. Регресс: комната 7 -(две соседние плиты подряд), комната 12 плита (0,1) → уход в 15 -([BUG-LOOSE-2](BUGS_CLOSED.md)), плита-потолок, рестарт уровня после смерти -на дрожащей плите. - - ---- - - -## LOOSE-SEAM-ANIM. Плита в шве исчезает без анимации падения — МЕЛКИЙ, ОТЛОЖЕН - -> **Решение пользователя (2026-08-13):** «пока пусть будет так». - -**Наблюдение.** Уровень 10: Кид расшатывает плиту (2,9) комнаты 2 и убегает -вправо в комнату 7, где та же плита видна в шве как (2,−1). Плита -доваливается правильно (см. [LOOSE-ROOM-CHANGE](#loose-room-change)) и с -экрана исчезает, но **мгновенно** — без дрожания и без падающего куска. - -**Почему так.** Заочный досчёт (`animate_loose`, `pop_trob.c`) сознательно -не рисует: комната не отрисована, а фаза живёт в `room_modif`, мимо -`pop_loose_modif`, на который смотрит отрисовка дрожащего кадра. Исчезновение -видно только потому, что провал меняет ТАЙЛ, а по этому событию -(`pop_neigh_dirty`) главный цикл перечитывает кромку и перерисовывает шов. -Падающий кусок (mob) рождается в комнате 2 и честно летит, но `mob_tick_one` -рисует только `here` (своя комната), а комната 2 — не отрисованная. - -**Что надо, если браться.** Шов — это НЕ обычный тайл: чужая колонка 9 -рисуется внутри нашей колонки 0 (`draw_tile`, ветка `lcode == 11`), а -дрожащий кадр берётся из `pop_loose_modif[row*10 + (col-1)]`, то есть при -`col == 0` индекс уезжает за границу массива (для ряда 0 — в −1). Значит -анимация шва потребует не «включить рисование», а дать чужой колонке -собственный источник фазы. Заодно там же чинить и этот выход за границу. - -**Проверять:** тот же сценарий уровня 10; в оригинале плита в шве дрожит и -роняет кусок так же, как в своей комнате. - - ---- - - -## JUMP-FLOOR-LEGS. Прыжок с пола: ноги Кида поверх кромки пола — ПОЧИНЕН, ЖДЁТ ПРОВЕРКИ - -> **Корень (найден трассой 2026-08-13).** Проход оверлеев в -> `pop_fore_over_char` обходил **только два крайних ряда** футпринта: -> -> ```c -> if (action != 2) other_overlay_tile(rB, c); /* опорный */ -> if (rT != rB) other_overlay_tile(rT, c); /* верхний */ -> ``` -> -> Это буквальный порт `redraw_at_char2` (seg003:0645), и в оригинале он -> верен: там `char_top_row` и `char_bottom_row` ВСЕГДА соседние. У нас между -> ними появляется дыра — `char_footprint` форсит `rT = rB − 1` (голова торчит -> в ряд выше), а затем окно fore-клипа расширяет `rB` ещё на ряд вниз. -> -> На спорном кадре трасса из MAME дала `rT=0 rB=2 cL=0 cR=1 do_ov=1` и **ноль** -> вызовов `overlay_mid_tile`: ряды 0 и 2 обошли, ряд 1 — тот самый, где стоит -> плита пола, — пропустили. Отсюда и подсказка пользователя «глубже в падении -> плита рисуется правильно»: там `y_to_row` даёт уже 2, ряд 1 попадает в пару -> крайних, и всё сходится. -> -> **Фикс:** обходить ВЕСЬ диапазон `rB..rT`, сохранив правило оригинала «при -> `action == 2` опорный ряд не трогаем». После фикса трасса на том же кадре: -> один вызов `overlay_mid_tile`, исход для (1,1) = «нарисовали», коды тайлов -> `curr=3 left=0` — байт в байт как в отладочном выводе SDLPoP. -> -> Пилларный оверлей, который «работал и раньше», к этому отношения не имел: -> это `fore_id = 95` из отдельного fore-прохода, а не midtable-оверлей. -> -> Банк 2 +28 Б. Хост-тесты (6 наборов) проходят. - -### Разбор, по которому искали (оставлен: метод пригодится) - -**Наблюдение (пользователь, 2026-08-13).** Уровень 10, комната 1, прыжок с -пола. В оригинале нижняя часть Кида скрыта ЗА передней гранью пола, у нас -рисуется весь Кид поверх неё (за передней колонной он при этом уходит -правильно). Скриншоты — в переписке сессии. - -**Состояние кадра (снято из памяти MAME на замороженном кадре, сборка -2026-08-13):** - -| поле | значение | -|------|----------| -| `Kid.frame` | 103 (`frame_103_start_fall_2`) | -| `Kid.action` | 3 (`actions_3_in_midair`) | -| `Kid.x` / `Kid.y` | 69 / 127 | -| `Kid.direction` | −1 (влево) | -| `Kid.curr_col` / `curr_row` | 0 / 2 | -| `Kid.room` / `cur_room` | 1 / 1 | - -`pop_y_land[2] = 118` — то есть ноги на 9 px НИЖЕ уровня пола ряда 1, ровно в -полосе его передней грани (`draw_tile_bottom` рисует её на `63*row + 65 = 128`). - -Тайлы комнаты 1 (`room_fg`, прочитаны там же): - -``` -ряд 0: 01 01 00 00 00 00 00 00 04 0B -ряд 1: 04 00 03 13 10 11 13 01 07 0F -ряд 2: 0C 01 03 01 01 0F 01 01 04 03 -``` - -Кромочная колонка левого соседа (`lcol_fg[0..2]`): `04 0C 04`. - -**Что УЖЕ проверено и исключено.** - -1. **Гейт `redraw_at_char2` (seg003:0645) портирован верно.** Сверено строка - в строку: наш `do_ov` в `pop_fore_over_char` даёт то же множество поз - (захват 78-79, `action` 2/3/4/6, `bumped` 102-106, начало подъёма 135-136), - и climb-ветка 137..144 тоже совпадает. При `action == 3` оверлей - ВКЛЮЧАЕТСЯ — дело не в гейте. -2. **`draw_other_overlay` (seg008:1492) на колонке 0 не сработал бы и в - оригинале.** Обе его ветки требуют пустого соседа: `tile_left == empty` - (у нас `lcol_fg[1] = 0x0C`, doortop — не пусто) либо `drawn_col > 0` и - пустой тайл ЧЕРЕЗ ОДИН слева. Значит окклюдер — НЕ он, и наш порт этой - функции здесь ни при чём. -3. **`pop_tile_code(row, −1)` кромку читает правильно** — из `pop_t_lfg`, а не - «стена всегда». - -**Две живые гипотезы, проверять в этом порядке.** - -* **Это вообще не отрисовка, а физика.** У нас `Kid.y = 127` при уровне пола - 118 — Кид «утоплен» на 9 px, и ноги торчат ниже кромки просто потому, что - они там и есть. Проверяется дёшево: снять `Char.y` у SDLPoP на том же - кадре 103 той же последовательности. Если там 118..120 — искать надо в - seqtbl/`fall_speed`, а не в слое фона. -* **Окклюдер — другой тайл/другой механизм.** Тогда нужна очная ставка: - прогнать SDLPoP с трассой (`dbg_shots`-fprintf в `draw_other_overlay` и - `add_kid_to_objtable` уже стоят в нашей копии, см. memory - `pop_pixel_diff_vs_sdlpop`) и сравнить СПИСОК тайлов, попавших в midtable - на этом кадре, с тем, что рисуем мы. Гадать дальше по коду смысла нет — - два прохода по seg008 уже не дали ответа. - -**Проверять после починки:** тот же прыжок в комнате 1 уровня 10; за передней -колонной Кид уходит и сейчас — это не должно сломаться. - - ---- - - -## MOB-CLIP-RIGHT. Окна и узор кладки рисуются поверх падающих плит - -**Найдено прогонами 2026-08-13 (уровень 13, комнаты 16 и 23).** - -**Симптом.** На падающей плите проступают элементы ЗАДНЕЙ стены — узор -кладки, а на ряде 0 и целое окно. Плита при этом цела: элементы ложатся -поверх неё, не стирая. - -**Корень.** `mob_render` (`pop_room.c`) каждый кадр вызывает -`draw_tile(r, m->col + 1)` — перерисовывает ЦЕЛЫЙ соседний тайл поверх уже -нарисованного куска, чтобы спрятать его правую часть (спрайт 42 лежит в -столбце `col+1`). `draw_tile` кладёт всё содержимое тайла, включая декор -пустого тайла — окно и узор. Ряд берётся из координаты куска, поэтому на -ряде 0 перерисовывается тайл с окном. - -Правка [#6](#) (клип перерисовки окном коридора heal) сделала артефакт -ЗАМЕТНЕЕ: раньше перерисовка размазывалась вокруг, теперь попадает точно в -прямоугольник плиты. - -**Как в оригинале.** Такой перерисовки нет вовсе. `redraw_at_cur_mob` -(seg007:1094) зовётся ТОЛЬКО из `loose_fall`, один раз в момент сбития, и -лишь ставит пометки на тайл и соседа. Правая часть куска прячется -собственным клипом объекта: `add_mob_to_objtable` (seg007:1161) задаёт -`clip.right = 40`. - -**Что делать.** Портировать клип вместо подпорки: - -1. выяснить, во что превращается `clip.right = 40` в наших координатах - (у оригинала `obj_x` в удвоенных единицах: `char_x_left = obj_x / 2 + 58`); -2. блитить правую часть (env 42) с ограничением ширины — примитив с шириной - есть для персонажей (`gfx_blit_cols_part_w`), для env надо посмотреть; -3. убрать `draw_tile(r, col+1)` и окно fore-клипа вокруг него; -4. вернуть коридор heal к 64x32. - -**Побочная выгода:** уходит по одному полному `draw_tile` на кусок за кадр — -при шести падающих плитах это шесть отрисовок тайла. - ---- - - -## MID-OVERLAY-LAYER. Оверлей кромки всегда поверх, а должен сортироваться - -**Найдено разбором 2026-08-13.** - -`overlay_mid_tile` (`pop_bg.c`) выполняется в проходе ПОСЛЕ персонажей, то -есть безусловно поверх всего нарисованного. В оригинале это `draw_other_overlay` -(seg008:1499), и он переключает таблицу на **midtable** — -тот же слой, где живут персонажи и падающие куски (`add_mob_to_objtable`, -тип `0x80`), а внутри слоя всё сортируется по `y` (`compare_curr_objs`, -seg008:1572). - -Следствие: узор из оверлея выигрывает у плиты, даже когда плита ближе к -зрителю. Пока у нас нет сортируемого midtable, точечными правками это не -лечится. - -Связано с [BG-ONCE](TASKS_OPEN.md#bg-once) — там та же техническая -сердцевина: привести наши слои в соответствие с таблицами оригинала. - ---- - - -## GUARD-FALLOUT-VICTORY. Выпавший из комнаты страж не засчитывается убитым - -**Найдено разбором 2026-08-13** (при проверке чита `K` на Джафаре). - -У `on_guard_killed` в оригинале ДВА места вызова: - -| место | что | -|---|---| -| `play_guard`, seg006:1494 | HP кончились — **портировано** | -| `check_guard_fallout`, seg002:264 | страж выпал из комнаты — **НЕ портировано** | - -Наш `pop_guard_fallout` (`pop_guard.c`) просто гасит слот. Значит столкнуть -Джафара в пропасть на 13-м уровне можно, а выход на 14-й от этого не -откроется — расхождение с оригиналом. - -Правка: позвать `on_guard_killed()` в ветке «не скелет». Мешает только то, -что функция сейчас `static` в `guards.c` (банк 1), а `pop_guard_fallout` -живёт в резиденте. - ---- - - -## LEVELDOOR-STARTROOM-WIPE. В стартовой комнате за входной дверью рисуется лестница вместо черноты - -**Найдено разбором 2026-08-17** (попутно к фиксу -[LEVELDOOR-PALACE-CLIP](BUGS_CLOSED.md#leveldoor-palace-clip) — то же -`draw_leveldoor`). - -`draw_leveldoor` (seg008:1D29) в приподнятой створке различает две комнаты: - -```c -if (modifier_left) { - if (level.start_room != drawn_room) { - add_backtable(..., 144 /*level door stairs*/, ...); - } else { - short leveldoor_width = (tbl_level_type[current_level] == 0) ? 39 : 48; - sbyte x_low = (tbl_level_type[current_level] == 0) ? 2 : 0; - add_wipetable(0, 8*(draw_xh + 1) + x_low, ybottom - 4, 45, leveldoor_width, 0); - } -} -``` - -Смысл: за дверью, **через которую вошли на уровень**, лестницы нет — там -чернота, и оригинал её ЗАТИРАЕТ прямоугольником, а не рисует марш 144. -Ширина затирки дворцовая/подземная (48 против 39) и подземная сдвинута на -2 px вправо — то есть здесь ЕЩЁ одно расхождение подземелья и дворца, помимо -уже починенного `leveldoor_right += 8`. - -У нас (`pop_room.c`, `draw_leveldoor`) стоит безусловно: - -```c -if (modif) - pop_env_b(144, x, ybottom - 4); /* лестница (комната ≠ стартовой) */ -``` - -— условие названо в комментарии, но не реализовано. Различие стартовой -комнаты у нас есть только в логике входа (`pop_leveldoor_enter`, -`pop_map.c:1166`), не в отрисовке. - -**Когда видно:** только пока створка входной двери приподнята -(`modif != 0`) в стартовой комнате — то есть в анимации входа на уровень и -если дверь снова открыть. При закрытой двери `modif == 0`, и обе ветки -ничего не рисуют, поэтому баг и не попался на обходах уровней 1-4. - -**Что мешает сделать прямо:** у нас нет понятия wipetable — нужен чёрный -прямоугольник в проходе backtable, то есть либо прямой `gfx`-fill в -`draw_leveldoor`, либо запечка. Проверять на уровне 1 (подземелье, ширина -39, сдвиг 2) И на уровне 4 (дворец, 48, сдвиг 0) — иначе поймаем только -половину. - -### BUG-SHADOW-SET. Тень в бою рисуется спрайтами стража - -**Симптом** (найдено пользователем 2026-08-20): в бою Тень выглядит не -Кидом. В SDLPoP она Кид всегда. - -**Корень.** Набор спрайтов выбирает не charid, а поле `sword` САМОГО -КАДРА: `load_frame_to_obj` (`seg008.c:1752`) держит `chtab_base` жёстко -равным `id_chtab_2_kid` и прибавляет `cur_frame.sword >> 6`. У всех 241 -кадра `frame_table_kid` эти биты нулевые, у всех кадров `frame_tbl_guard` -— `0xC0`. Тень берёт таблицу стража для кадров 150..189 (`seg006.c:533`), -значит идёт через chtab_5. - -Дальше и кроется наша ошибка: **chtab_5 — это не «страж», а «соперник -уровня»**. Он грузится из `tbl_guard_dat[tbl_guard_type[уровень]]` -(`seg000.c:1117`), а `tbl_guard_type[12] == 4` → **SHADOW.DAT**, и это -графика КИДА в боевых позах (палитра SHADOW.DAT побайтно равна палитре -Кида; у GUARD.DAT там серая рампа под перекраску). - -**У нас** `pop_guard_load` (`pop_cdraw.c:98`) разбирает только типы 2 -(скелет) и 3 (визирь), а всё остальное — включая тип 4 — уводит в -`guard_names`. SHADOW.DAT в ассетах отсутствует, каталога нет, в -Makefile правила нет. - -**Починка** — часть работы по атласу Тени, см. -[`../docs/shadow_atlas_plan.md`](../docs/shadow_atlas_plan.md) Ш0/Ш1: -довезти SHADOW.DAT и запечь его во вторую половину атласа Тени. Отдельно -чинить смысла нет: как только Тень поедет своим атласом, ветка выбора -набора для типа 4 исчезнет вместе с проблемой. - -**Оговорка.** `pop_guard_set_palette` для типа 4 звать НЕЛЬЗЯ — она -затрёт палитру Тени палитрой стража (`curr_guard_color` у не-стражей = 0, -`seg002:183`). - -### BUG-CORPSE-AIR. Труп висит в воздухе после падения плиты - -**Симптом** (найдено пользователем 2026-08-20, ур. 12 к. 15, старт с -`POS=15`): Кид встал на проваливающийся пол (0,6), плита обрушилась и -убила его, но ТЕЛО осталось лежать на уровне исчезнувшего пола, а плита -улетела дальше вниз. Труп висит в пустоте. - -**Где смотреть.** Кадр смерти — `actions_5_bumped` (см. seq в -`kid_data`), а гравитация в `check_action` (seg006:05CD) для действия 5 -включается только на кадрах приседа: у оригинала есть отдельные фиксы -`FIX_DEAD_FLOATING_IN_AIR` (кадры 177..185) именно про этот случай — -значит **в оригинале 1989 года труп в воздухе тоже висит**, и SDLPoP -чинит это опциональным фиксом, по умолчанию выключенным. - -**Отсюда вопрос к решению**, а не сразу правка: чинить ли вообще. Если -чинить — портировать `fix_dead_floating_in_air` и записать как -осознанное расхождение в `../docs/impl_diff.md` (мы уже отказались от -двух других опциональных фиксов SDLPoP в `bump_into_opponent`). - -**Приоритет низкий:** ситуация возникает только когда труп остаётся на -проваливающемся полу, играбельности не мешает. - ---- - -## BUG-SND-FIRSTRUN — при ПЕРВОМ запуске первый эффект слегка искажён - -**Симптом** (пользователь, 2026-08-20): после загрузки системы, при первом -запуске программы, самый первый звуковой эффект идёт с искажением; при -повторном запуске программы искажения нет. Наблюдалось ещё на тестовых -примерах CBL, до PoP. - -**Причина, скорее всего, уже устранена.** Аппаратный буфер CBL (256 -слотов) железо не чистит, а запись в порт управления сразу пускает -воспроизведение с нулевого слота — то есть первые 23,4 мс играет то, что -лежало в буфере раньше. При первом запуске это остатки после загрузки -системы, при втором — наша же тишина, поэтому и слышно только один раз. -Разбор — `../docs/sound_plan.md` §10.2. - -Лечение сделано в libc: `_cbl_prime` заливает буфер тишиной сразу после -включения (`cbl_open`). **В MAME проверить нельзя**: эмулируемый буфер -стартует нулями при двухдополнительном ЦАП, то есть там этот дефект нем -изначально — записи до и после фикса совпали побитово по огибающей. - -**Что нужно:** проверка на РЕАЛЬНОМ железе, первый запуск после холодной -загрузки. Если искажение осталось — значит мусор приходит не из буфера -CBL, и копать надо в системных буферах DSS. - -**Приоритет низкий:** один раз за сеанс, на играбельность не влияет. - ---- - - -## PAL-L1-AFTER-INTRO. Вход в игру на уровень 1 после интро — палитры нет (чёрный экран) - -**Наблюдение (пользователь, 2026-08-23).** После заставок (title → intro → -demo) нажатие клавиши в attract-demo начинает новую игру на уровне 1 — -экран ЧЁРНЫЙ при живом геймплее. При этом: - -- Shift+L с уровня 1 на уровень 2 (тот же маршрут через pre-cutscene) — - палитра появляется (закрыто быстрым фиксом `fade_in_pending` в - `roomtest.c`, маршрут CUTSCENE → LEVEL_LOAD → PLAYING); -- Restart Game через меню — уровень 1 с НОРМАЛЬНОЙ палитрой. - -**Контекст.** Маршрут demo_new_game (`roomtest.c` ~996): dispatch(NEW_GAME) -→ `pop_level_switch()` → dispatch(LEVEL_READY) → PLAYING. По коду палитру -там никто не трогает, а демо-ветка перед этим делает -snapshot+dim(4,0)+fade_in(4) — то есть к моменту новой игры палитра должна -быть яркой. Контрольный прогон в MAME (сборка с фиксом) демо и уровень 1 -за настройками показал ЯРКУЮ картинку — воспроизведение нестабильно. - -**Гипотезы для проверки (порядок дешевизны):** - -1. **Тайминг нажатия.** Клавиша, СОСКИПНУВШАЯ intro (intro_run абортится по - `kbd_raw_any_down`), остаётся в held-state и первым же кадром демо даёт - `demo_new_game` — но fade_in демо-ветки блокирующий и завершается ДО - входа в игровой цикл, так что в эту гипотезу код не верит. Проверить - трассой: снять обе экранные палитры (`gfx_pal_get` 0 и 1) на первом кадре - PLAYING. -2. **Снимок демо-ветки снят с чёрной палитры.** Если нажатие клавиши - приходится МЕЖДУ `intro_load_palette` (fload+sync+snapshot+dim(4,0)) и - `intro_restore_game_palette` — аборт оставляет экран чёрным, но restore - всё равно выполняется после... сверить фактический порядок вызовов - трассой. -3. **`font_ready`=0 в момент fade_in** — dim/fade молча выходят (guard в - `pop_ui.c`). Маловероятно (шрифт грузится в `pop_boot` → - `pop_menu_init`), но дёшево исключить. - -**Правильное решение, скорее всего, — этап B из -[`../docs/palette_plan.md`](../docs/palette_plan.md):** явный -«load → apply/fade» контракт на КАЖДОМ входе в PLAYING, а не точечные -fade_in в отдельных маршрутах. Точечно чинить только после стабильного -воспроизведения. - ---- - - -## PAL-DUNGEON-STALE. Переход 3→4 (подземелье→дворец): остаётся палитра подземелья - -**Наблюдение (пользователь, 2026-08-23).** Shift+L с уровня 3 на уровень 4: -pre-cutscene отыгрывает, уровень 4 начинается — но env/wall-цвета (слоты -0x50–0x6F) остаются ПОДЗЕМНЫМИ. На переходе 1→2 (оба подземелье) всё -правильно. - -**Корень ясен.** Быстрый фикс `fade_in_pending` (`roomtest.c`, маршрут -CUTSCENE → LEVEL_LOAD → PLAYING) восстанавливает яркость из СНИМКА, а снимок -делает `intro_restore_game_palette()` ДО `pop_level_switch()`: - -``` -pop_pre_cutscene_show(pre) → kid.pal + bg(СТАРЫЙ набор) + snapshot + dim(4,0) -pop_level_switch() → pop_bg_load(дворец): в палитры записаны - 32 записи ДВОРЦА (pal_tile.pal) -pop_ui_fade_in(4) → восстанавливает ОБЕ палитры ИЗ СНИМКА — - то есть ЗАЛИВАЕТ НАЗАД подземные 0x50..0x6F -``` - -fade_in по построению пишет все 256 записей из снимка — он затирает и только -что загруженный тайлсет. На 1→2 не видно, потому что наборы совпадают. - -**Как чинить (в порядке правильности):** - -1. **По плану (этап B `../docs/palette_plan.md`):** разделить «логическую - палитру» и «яркость» (pop_pal: load_* обновляет снимок ПОСЛЕ bg_load, - apply/fade только показывает). Тогда снимок на момент fade_in всегда - актуален. -2. Точечно: переставить обновление снимка ПОСЛЕ `pop_level_switch()` - (снять snapshot заново перед fade_in). Работает, но это ещё один пластырь - поверх модели, которая и так уже в трёх местах по-разному управляет - яркостью. - -**Проверять:** Shift+L 3→4 И 5→7 (дворец→подземелье, обратное направление), -плюс штатный проход уровня 3 через дверь (там же смена набора); после починки -сверить цвета кладки дворца с `pal_tile.pal` (таблица в palette_plan.md §1.3). - -**Решение пользователя (2026-08-23): пока не фиксить** — закрыть вместе с -этапом B плана палитр. diff --git a/applications/PoP/roomtest/CLAUDE.md b/applications/PoP/roomtest/CLAUDE.md deleted file mode 100644 index fc00c5e..0000000 --- a/applications/PoP/roomtest/CLAUDE.md +++ /dev/null @@ -1,104 +0,0 @@ -# roomtest — правила подпроекта - -Живой прототип порта PoP: комната 1 уровня 1 (композиция тайлов в рантайме) -+ Kid (анимация seqtbl, управление, коллизия, падение, зацеп, fore-окклюзия, -проваливающиеся полы). Действуют правила корневого `CLAUDE.md` и -`applications/PoP/CLAUDE.md`. - -**Главное правило (из `../CLAUDE.md`): `../SDLPoP/src/` — источник истины.** -Перед реализацией ЛЮБОЙ функции и по ЛЮБОМУ вопросу «как в оригинале» — -СНАЧАЛА прочитай соответствующий код SDLPoP и портируй по нему; не пиши -по памяти и не угадывай константы/порядок слоёв. Расхождение с SDLPoP = -по умолчанию баг у нас; ОСОЗНАННЫЕ расхождения (платформа/бюджет требуют -иначе) перечислены в `../docs/impl_diff.md` — новое туда же записью, а не -только комментарием в коде. - -**НАЧИНАТЬ С `NEXT_SESSION.md`** — состояние окружения, задача на -ближайший заход и грабли последней сессии одним файлом. - -**Что в работе сейчас — `TASKS_OPEN.md`** (доска задач: приоритеты, критерии -готовности); сделанное с протоколами замеров — `TASKS_CLOSED.md`. Баги — -`BUGS_OPEN.md` (только ОТКРЫТЫЕ) и `BUGS_CLOSED.md` (закрытые + разбор корней: -перед заведением нового бага грепни там по симптому); сырые формулировки -пользователя с прогонов — `bugs_level1.md` / `bugs_level2.md`. План -следующих уровней — `../docs/levels_plan.md`. - -Правило разнесения: как только задача/баг закрыт — запись целиком переезжает -в `TASKS_CLOSED.md` / `BUGS_CLOSED.md`, а в открытом файле остаётся ссылка. -Открытые файлы обязаны читаться целиком за раз. - -## Сборка и запуск - -``` -make # собрать roomtest.exe (упаковав ассеты через toolchain/) -make run # exe + EXTRA_DATA на дискету + запуск MAME (см. корневой док) -make -C tests-host # модульные тесты движка под ucsim_z80 (секунды, без MAME) -``` - -Логику, которую можно проверить без железа, покрывать в `tests-host/` -(обвязка — `testkit/`, там же почему прогон именно под z80). MAME остаётся -для отрисовки, банков, таймингов и клавиатуры. - -`MEMORY=small`, `--gfx 256`. Ассеты (`pop_env0..4.atl`, `pop_wall.atl`, -`pop_fore.atl`, `kid0..27.atl`, `kid.pal`) генерируются python-скриптами -`../toolchain/` — Makefile дёргает их сам при изменении. Данные комнаты — -`room1_data.h` (fg=foretable code, bg=backtable modifier); данные анимации -Kid — `kid_data.h` (генерится `pop_extract_kid_data.py`). - -## Проверка в MAME - -Только через `toolchain/mame_interactive.py` или MCP-мост `mame-z80` -(см. memory `mame_autotest`, `mame_mcp_bridge`, `mame_hdd_test_disk`). -Эталон комнаты — `../toolchain/1.1-2.png`. Пересобрал HDD-образ → MAME -ОБЯЗАН полный рестарт (`mame_hdd_rebuild_restart`). - -**Тайминги моста** (не ждать дольше, см. `docs/mame-autotest.md` §10): -старт `run_bridge.sh` → 6 с → `go` → 8 с → `keyseq d:{ENTER}` + -`keyseq roomtest{ENTER}` → 5 с → программа работает. - -Отладочные тумблеры в живой сессии (`roomtest.c`): -**1** — заморозить кадр, **2** — продолжить (разбор позы/окклюзии); -**ESC** — выход. Читы (`pop_cheat.h`): **K** — убить стража, **I** — -бессмертие, **Shift+L** — следующий уровень, -**+/−** — обход комнат (`ROOMNAV`). Не чит, а штатная клавиша оригинала: -**Ctrl+S** — вкл/выкл звук (пурпурная палочка в борте = звука нет). Уровень грузится по номеру -(`pop_level_load_num`), на диске лежат все 15. - -## Модули - -| Файл | Роль (порт SDLPoP) | -|------|--------------------| -| `roomtest.c` | Главный цикл: дабл-буфер (2 страницы + флип на vsync), tick→draw порядок слоёв. | -| `pop_tile.c/.h` | Общие ЛИСТЬЯ слоя фона — РЕЗИДЕНТ W1: блит куска атласа, чтение тайла комнаты, `tile_table`, метка «фон трогали вот здесь» (`pop_cd_touch`). Резидент потому, что их зовут обе половины слоя фона из разных банков, а `const`-таблицы банка из чужого банка не видны. | -| `pop_bg.c/.h` | ГОРЯЧАЯ половина слоя фона (банк 2, каждый кадр): fore-окклюзия поверх ЛЮБОГО персонажа (`seg003` redraw_at_char/char2 — один проход на всех Char), оверлеи кромки, кладка стены (`wall_pattern`), клип. `pop_bg.h` — публичный API ВСЕГО слоя (обеих половин). | -| `pop_room.c` | ХОЛОДНАЯ половина слоя фона (банк 7, раз на комнату/событие): полная отрисовка комнаты (`seg008` draw_tile), точечные перерисовки тайлов (пики, ворота, кнопки, дверь уровня, дрожащие плиты), падающие куски loose (`seg007` mob), загрузка атласов. | -| `_pop_bg.h` | Внутренний контракт между половинами: общее состояние + три тонкие `__banked`-обёртки. Там же расписано, почему рез прошёл именно здесь и сколько стоит. | -| `pop_kid.c/.h` | Анимация/движение: интерпретатор seqtbl `play_seq` + frame_table (`seg006`), окна `Char` (loadkid/loadshad), атласы Кида. | -| `pop_cdraw.c/.h` | ОТРИСОВКА персонажей — одна на всех Char (порт `add_kid_to_objtable`/`add_guard_to_objtable`, `seg008:22F0/2324`): спрайт, clip_char, брызги, клинок, heal; + полоса HP и палитры соперника. Там же ПРОПУСК неизменившегося кадра (`pop_char_skip_mask`): персонаж, у которого с прошлой отрисовки этой страницы ничего не изменилось и фон под ним не трогали, не перерисовывается вовсе. | -| `pop_ctrl.c/.h` | Управление: диспетчер `control()` (`seg005`) + ввод `read_user_control` (`seg006`) поверх ``. | -| `pop_map.c/.h` | Коллизия с картой + физика падения/приземления/стены + loose-полы (`seg005/006/007`). | - -## Порядок слоёв в кадре (важно для окклюзии) - -`roomtest.c` каждый тик рисует в СКРЫТУЮ страницу: `pop_char_heal` (стереть -прошлый кадр — по слоту на персонажа) → `kid_tick` → `pop_phys_tick` → -`pop_loose_tick` (loose СЛОЙ ФОНА — ДО персонажей, чтобы они были поверх -плиты) → `pop_char_draw`/`pop_char_fore` для соперника и Кида (кто позже — -тот поверх, порядок задаёт обход тайлов) → `pop_room_clip_borders` (чистка -бортов, гейт по флагу — только в кадрах падения) → флип на vsync. - -Отрисовка персонажа ОДНА на всех (`pop_cdraw.c`): слот выбирает окно -`Char`, набор атласов и heal-прямоугольники, всё остальное общее — как два -одинаковых входа `add_*_to_objtable` в оригинале. - -**Дабл-буфер:** у каждой страницы своя видео-ОЗУ и теневая ОЗУ-копия; heal -берёт чистый фон из копии ТОЙ страницы, в которую рисуем. Любой динамический -элемент (Kid, loose-плита, падающий кусок) обязан чистить свой прошлый кадр -на КАЖДОЙ из двух страниц — иначе остаток виден через кадр как **мерцание**. -Это типовой источник багов «остаётся кусочек» (см. memory -`pop_fall_debug_baseline`). - -## Ключевые memory - -`pop_kid_plan`, `pop_hang_state`, `pop_fore_layer`, `pop_fall_debug_baseline`, -`accel_vertical_copy`, `kbd_raw_fifo_drain`, `pop_check_sdlpop_first`. diff --git a/applications/PoP/roomtest/Makefile b/applications/PoP/roomtest/Makefile deleted file mode 100644 index b471b62..0000000 --- a/applications/PoP/roomtest/Makefile +++ /dev/null @@ -1,472 +0,0 @@ -# roomtest — проверка порта статического фона PoP (Шаг 3): реальная -# композиция слоёв (pop_bg.c) для комнаты 1. --memory huge --gfx 256. - -EXAMPLE := roomtest -HDD_IMG := $(CURDIR)/build/hdd/roomtest.chd - -# small: W1+W2 как единое 32КБ-пространство, DATA сразу за CODE (иначе -# CODE ~23КБ переполняет W1 и лезет в фиксированный DATA@0x8000 в huge). -MEMORY ?= huge # small-раскладка + банки кода в W3 (стражи) -# Резидента --w3 БОЛЬШЕ НЕТ: отрисовка уехала в БАНК 2 (pop_bg + pop_cdraw -# в одной странице — вызовы между ними прямые, если функция не помечена -# __banked). Так снято главное ограничение резидента: из банка его было -# не достать ни прямо, ни транзитивно, а банк→банк работает (трамплин -# сохраняет страницу окна на СТЕКЕ, проверено вложенной цепочкой -# банк1→банк2→банк1 в MAME 2026-07-30). Теперь в банки можно уводить и -# логику, которая рисует. См. docs/layout_plan_v2.md §2, memory -# sdcc_banked_call_rules. -# Банк 5 = pop_ctrl.c (MEM-BANK5). CODE и DATA делят одно 32-КБ -# пространство W1+W2, поэтому килобайт кода, уехавший в банк, — это -# килобайт, доступный данным. Кандидат выбран не по размеру, а по частоте -# вызова: диспетчер управления дёргается один раз за кадр на персонажа и -# горячих банк→банк переходов не создаёт (в отличие от pop_level, чей -# pop_level_tile зовётся из банка 2 на КАЖДЫЙ тайл). Шина control_* -# переехала в pop_state.c — см. там. -# --max-allocs-per-node: во сколько вариантов размещения регистров SDCC -# упирается на узел. У sprinter-cc дефолт 100000 (агрессивно, как fast-сборки -# библиотек) — на roomtest это МИНУТЫ на банк, потому что модули крупные. -# Дефолт SDCC — 3000, и для разработки его достаточно: разница в размере -# единицы процента, а сборка кратно быстрее. Замер (2026-08-05) — в шапке -# TASKS_CLOSED.md, запись BUILD-FAST. -# -# make — быстрая сборка (ALLOCS=3000) -# make ALLOCS=100000 — как раньше: минимальный код, для замеров размера -# и для «релизного» образа -# -# ВАЖНО: любое сравнение занятости банков имеет смысл только при ОДНОМ и том -# же ALLOCS — иначе сравниваются не правки, а уровни оптимизации. -# 6000, а не 3000 (решение пользователя 2026-08-25): сборка дольше секунд на -# двадцать, зато SDCC размещает регистры плотнее и резидент W1 худеет -# примерно на 150 байт — а это ровно те байты, которых не хватает куче. -ALLOCS ?= 6000 -# Build info не хранится вручную в C: ID и дата извлекаются Make из текущего -# commit. Переопределения удобны для воспроизводимой release-сборки. -BUILD_ID ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo dev) -BUILD_DATE ?= $(shell git log -1 --format=%cs 2>/dev/null || echo unknown) -BUILD_FLAGS := -DPOP_BUILD_ID=\"$(BUILD_ID)\" -DPOP_BUILD_DATE=\"$(BUILD_DATE)\" -# Единственный список банковых исходников: из него строятся И ключи -# sprinter-cc, И зависимости roomtest.exe. Раньше эти списки жили отдельно, -# поэтому добавленные pop_shadow.c/pop_sfx_cold.c компилировались, но make не -# замечал их последующие изменения и оставлял устаревший exe. -BANK1_SRCS := guards.c -BANK2_SRCS := pop_bg.c -BANK3_SRCS := pop_map.c -BANK4_SRCS := pop_cdraw.c pop_kdraw.c -BANK5_SRCS := pop_ctrl.c pop_tile_cold.c -BANK6_SRCS := pop_trob.c -BANK7_SRCS := pop_room.c pop_redraw.c -BANK8_SRCS := roomtest_cold.c pop_arc.c pop_level_cold.c pop_kboot.c pop_guard_cold.c \ - pop_shadow.c pop_sfx_cold.c pop_qsave.c pop_qsave_coldio.c \ - pop_level_qsave.c -# Банк 9 — оболочка: menu/settings/config/font, автомат, global timer, -# title, attract-demo и таблица рекордов. Здесь остаются небольшие редкие -# верхнеуровневые точки входа, но не рендеры крупных заставок. -BANK9_SRCS := pop_menu.c pop_status.c pop_music.c pop_config.c pop_app.c pop_timer.c pop_ui.c pop_title.c pop_demo.c \ - pop_flow.c pop_hof.c -# Банк 10 — единый владелец экранных палитр/fade. Он намеренно отделён от UI: -# его будут вызывать и игровой lifecycle, и все cutscene-ветки. -BANK10_SRCS := pop_pal.c -# Банк 11 — тяжёлая кинематика заставок: интерпретатор сценария и renderer -# story/PV. Так анимации не вытесняют menu/config из банка оболочки. -BANK11_SRCS := pop_cutscene.c pop_intro.c -BANKED_SRCS := $(BANK1_SRCS) $(BANK2_SRCS) $(BANK3_SRCS) $(BANK4_SRCS) \ - $(BANK5_SRCS) $(BANK6_SRCS) $(BANK7_SRCS) $(BANK8_SRCS) \ - $(BANK9_SRCS) $(BANK10_SRCS) $(BANK11_SRCS) -BANK_FLAGS := $(foreach f,$(BANK1_SRCS),--bank 1=$(f)) \ - $(foreach f,$(BANK2_SRCS),--bank 2=$(f)) \ - $(foreach f,$(BANK3_SRCS),--bank 3=$(f)) \ - $(foreach f,$(BANK4_SRCS),--bank 4=$(f)) \ - $(foreach f,$(BANK5_SRCS),--bank 5=$(f)) \ - $(foreach f,$(BANK6_SRCS),--bank 6=$(f)) \ - $(foreach f,$(BANK7_SRCS),--bank 7=$(f)) \ - $(foreach f,$(BANK8_SRCS),--bank 8=$(f)) \ - $(foreach f,$(BANK9_SRCS),--bank 9=$(f)) \ - $(foreach f,$(BANK10_SRCS),--bank 10=$(f)) \ - $(foreach f,$(BANK11_SRCS),--bank 11=$(f)) -EXTRA_FLAGS ?= --gfx 256 -I $(CURDIR)/../poc/res/bg --max-allocs $(ALLOCS) \ - $(BANK_FLAGS) $(PROF_FLAGS) $(BUILD_FLAGS) -# Профилирование полосами бордюра (см. PROF() в roomtest.c) — ВКЛЮЧЕНО по -# умолчанию, пока идёт работа с производительностью; make PROF=0 выключает. -# Каждая фаза кадра красит бордюр в свой цвет, высота полосы на скриншоте -# MAME = время фазы в растровых строках. -PROF ?= 0 -PROF_FLAGS := -DPROF_BORDER=$(PROF) -# Стартовый уровень (отладка): make LEVEL=9 — начать сразу с девятого. -# Дефолт держим на отлаживаемом сейчас уровне; для «настоящей» игры — LEVEL=1. -# Константа объявлена в pop_tune.h (её видят обе половины главного цикла). -LEVEL ?= 1 -PROF_FLAGS += -DFIRST_LEVEL=$(LEVEL) -# Стартовая КОМНАТА и позиция Кида в ней (отладка): make ROOM=15 POS=2 — -# начать прямо в целевой комнате оптимизации, минуя проход уровня. POS — -# тайл 0..29, то есть row*10+col. Дефолт — сцена 11/15 (Кид в 0,2), по -# которой сняты замеры в docs/perf_l11_room15.md. make ROOM= (пусто) -# возвращает штатный старт из данных уровня. -ROOM ?= -POS ?= 2 -ifneq ($(strip $(ROOM)),) -PROF_FLAGS += -DDBG_START_ROOM=$(ROOM) -DDBG_START_POS=$(POS) -endif -EXTRA_SRCS := pop_vflip.c pop_pace.c pop_sfx.c pop_state.c pop_draw.c pop_tile.c \ - pop_kid.c pop_level.c pop_geom.c pop_guard.c pop_qsave_io.c - -BG_DIR := $(CURDIR)/../poc/res/bg -KID_DIR := $(CURDIR)/../poc/res/kid -LVL_DIR := $(CURDIR)/../SDLPoP/data/LEVELS -# res2000 — attract-demo; res2001..res2014 — штатная игра. res2015/copy -# protection намеренно не пакуется и не существует в маршруте загрузчика. -LVL_NUMS := 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 -LVL_DATA := $(foreach n,$(LVL_NUMS),$(LVL_DIR)/res20$(n).bin) -# ДВА тайлсета: pop_* — подземелье (уровни 1-3, 7-9, 12, 13), -# pal_* — дворец (4-6, 10, 11, 14). Раскладка id у них общая, различаются -# файлы и палитра тайлсета (*tile.pal, 32 записи). chtab_1 (pop_pot.atl: -# пламя, меч-предмет, зелья) от набора не зависит — один на оба. -BG_SETS := pop pal -BG_PAGES := 0 1 2 3 4 5 6 7 8 9 -# Двенадцать атласов на тайлсет идут подряд — код считает индекс как -# set*12 + страница, а упаковщик печатает константы в bg_arc.h. -BG_ATL := $(foreach s,$(BG_SETS),\ - $(foreach n,$(BG_PAGES),$(BG_DIR)/$(s)_env$(n).atl) \ - $(BG_DIR)/$(s)_wall.atl $(BG_DIR)/$(s)_fore.atl) \ - $(BG_DIR)/pop_pot.atl -BG_ARC := $(BG_DIR)/bg.arc -BG_DATA := $(BG_ARC) $(foreach s,$(BG_SETS),$(BG_DIR)/$(s)_tile.pal) -# ВСЕ 28 страниц Kid — иначе кадры торможения/разворота/приседа (image>23) -# не рисуются (отрисовка пропускает незагруженную страницу). Палитра — -# ЕДИНАЯ игровая (env+wall+kid). -KID_PAGES := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(KID_DIR)/kid$(n).atl) -# Зеркальный ПО ВЕРТИКАЛИ набор (зелье инверсии, уровень 9): те же спрайты с -# развёрнутыми колонками. Готовит упаковщик, а не рантайм — разворот -# страницы стоит 0.59 с против 0.045 с на её чтение с диска (замер MAME -# 2026-08-12, протокол в pop_vflip.c). -KID_VPAGES := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(KID_DIR)/kid$(n)_v.atl) -KID_DATA := $(KID_PAGES) $(KID_VPAGES) $(KID_DIR)/kid.pal \ - $(KID_DIR)/sword.atl $(KID_DIR)/sword_v.atl -# Таблицы анимации (кадры+seqtbl) — отдельный бинарь в EMM-странице, его -# делает pop_extract_kid_data.py (не упаковщик спрайтов) — своё правило ниже. -KID_BIN := $(KID_DIR)/kid.ani - -# АРХИВ KID. Шестьдесят файлов в одном: замер 2026-08-25 — `open` 51,4 мс -# против 32,6 мс на чтение 16 КБ, то есть на одних только открытиях набор -# Кида терял три секунды. Порядок в списке = порядок индексов, а их -# упаковщик печатает в kid_arc.h (константы ARC_KID_*). -KID_ARC := $(KID_DIR)/kid.arc -# В архив идут только атласы. Палитру читает gfx_pal_fload прямо в -# видеопамять, а kid.ani — host-тесты своей файловой заглушкой; ради -# двух файлов заводить обходные пути незачем. -KID_ARC_SRC := $(KID_PAGES) $(KID_VPAGES) $(KID_DIR)/sword.atl \ - $(KID_DIR)/sword_v.atl -GUARD_DIR := $(CURDIR)/../poc/res/guard -GUARD_ATL := $(GUARD_DIR)/g0.atl $(GUARD_DIR)/g1.atl $(GUARD_DIR)/g2.atl \ - $(GUARD_DIR)/g3.atl $(GUARD_DIR)/g4.atl \ - $(GUARD_DIR)/g0_v.atl $(GUARD_DIR)/g1_v.atl $(GUARD_DIR)/g2_v.atl \ - $(GUARD_DIR)/g3_v.atl $(GUARD_DIR)/g4_v.atl -# Скелет — ОТДЕЛЬНЫЙ набор спрайтов (SKEL.DAT в оригинале): его грузит -# уровень 3 (tbl_guard_type == 2), кадров меньше (28 против 34). -SKEL_DIR := $(CURDIR)/../poc/res/skel -# Зеркального набора у скелета НЕТ: зелье инверсии — уровень 9, там обычный -# страж (tbl_guard_type[9] = 0). См. pop_pack_guard.py. -SKEL_ATL := $(SKEL_DIR)/g0.atl $(SKEL_DIR)/g1.atl $(SKEL_DIR)/g2.atl \ - $(SKEL_DIR)/g3.atl -# Джафар — тоже отдельный набор (VIZIER.DAT): его грузит уровень 13 -# (tbl_guard_type == 3). Кадров столько же, сколько у стража (34), но -# палитра своя, из файла набора: curr_guard_color для не-стражей = 0. -# Зеркального набора нет по той же причине, что у скелета. -VIZIER_DIR := $(CURDIR)/../poc/res/vizier -VIZIER_ATL := $(VIZIER_DIR)/g0.atl $(VIZIER_DIR)/g1.atl $(VIZIER_DIR)/g2.atl \ - $(VIZIER_DIR)/g3.atl $(VIZIER_DIR)/g4.atl - -# ТЕНЬ — свой набор, запечённый упаковщиком (наложение спрайта на себя со -# сдвигом; наш блит так не умеет, см. ../docs/shadow_atlas_plan.md). Две -# половины в одном наборе: sk* — кадры вне боя (спрайты Кида), sf* — кадры -# 150..189 (SHADOW.DAT, это тоже графика Кида, а не стража). -SHADOW_DIR := $(CURDIR)/../poc/res/shadow -SHADOW_ATL := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(SHADOW_DIR)/sk$(n).atl) \ - $(foreach n,0 1 2 3,$(SHADOW_DIR)/sf$(n).atl) - -# Четыре архива, а не один: имена внутри наборов совпадают (g0.atl есть и у -# стража, и у скелета, и у Джафара), а константы индексов упаковщик делает -# из имени файла. Наборы всё равно грузятся поодиночке — по типу уровня. -GUARD_ARC := $(GUARD_DIR)/guard.arc -SKEL_ARC := $(SKEL_DIR)/skel.arc -VIZIER_ARC := $(VIZIER_DIR)/vizier.arc -SHADOW_ARC := $(SHADOW_DIR)/shadow.arc -GUARD_DATA := $(GUARD_ARC) -SKEL_DATA := $(SKEL_ARC) -VIZIER_DATA := $(VIZIER_ARC) -SHADOW_DATA := $(SHADOW_ARC) - -# ЗВУКОВЫЕ ЭФФЕКТЫ — оригинальная оцифровка, приведённая к частоте CBL -# (10 937,5 Гц, 8 бит моно). 8 страниц по 16 КБ; см. ../docs/sound_plan.md. -SND_DIR := $(CURDIR)/../poc/res/sound -# Число файлов задаёт упаковщик (POP_SND_PAGES в pop_sound_tbl.h): с -# 2026-08-25 звук не режется по границе страницы, поэтому страниц стало 10. -# Список ОБЯЗАН совпадать: недостающий файл — это молча пропавшие эффекты. -SND_PARTS := $(foreach n,0 1 2 3 4 5 6 7 8 9,$(SND_DIR)/s$(n).bin) -# На диск уходит ОДИН архив вместо десяти файлов: `open` дороже чтения -# (51,4 мс против 32,6 мс на 16 КБ, замер 2026-08-25), см. pop_arc.h. -SND_ARC := $(SND_DIR)/snd.arc -SND_DATA := $(SND_ARC) - -# МУЗЫКА: записи DOS-версии, приведённые к формату CBL -# (toolchain/pop_pack_music.py). Номера — оригинала, чтобы игровой код -# просил трек тем же числом, каким SDLPoP зовёт play_sound. -# заставка 54 55 50 53 52 -# катсцены 26 27 35 36 40 -# игра 24 25 28 29 30 32 33 37 39 41 43 -# Нет только 56 (won, 115 с / 1,2 МБ) — финалу нужен стриминг с диска. -MUS_DIR := $(CURDIR)/../poc/res/music -MUS_IDS := 24 25 26 27 28 29 30 32 33 35 36 37 39 40 41 43 50 52 53 54 55 56 -MUS_DATA := $(foreach i,$(MUS_IDS),$(MUS_DIR)/m$(i).bin) - -# UI: два исходных шрифта SDLPoP в одном EMM-атласе. Файл короче страницы: -# хвост использует menu для временного snapshot палитры (без расхода W2). -FONT_DIR := $(CURDIR)/../poc/res/font -FONT_ATL := $(FONT_DIR)/font.atl -FONT_DATA := $(FONT_ATL) -# TITLE: четыре готовые композиции `show_title()` до story/intro. Каждая -# режется на пять полос высотой <=49 px, так что runtime держит ровно одну -# EMM-страницу во время рисования, а не отдельный framebuffer. -TITLE_DIR := $(CURDIR)/../poc/res/title -TITLE_SCENES := 0 1 2 3 -TITLE_PARTS := 0 1 2 3 4 -TITLE_ATL := $(foreach s,$(TITLE_SCENES),$(foreach p,$(TITLE_PARTS),$(TITLE_DIR)/t$(s)_$(p).atl)) -TITLE_ARC := $(TITLE_DIR)/title.arc -TITLE_DATA := $(TITLE_DIR)/title.pal $(TITLE_ARC) -# PV/INTRO: story и fallback-стадии режутся на полосы. Для настоящего PV -# intro есть ещё чистый фон `b0_*` и шесть <=16K actor-атласов: они остаются -# в EMM на время сцены, а не перечитывают полный 320x200 кадр с HDD. -PV_DIR := $(CURDIR)/../poc/res/pv -PV_STORY := 0 1 2 3 4 5 -PV_SCENES := 0 1 2 3 4 5 6 7 -PV_PARTS := 0 1 2 3 4 -PV_ANIM := $(foreach p,$(PV_PARTS),$(PV_DIR)/b0_$(p).atl) \ - $(PV_DIR)/a0.atl $(PV_DIR)/a1.atl $(PV_DIR)/a2.atl \ - $(PV_DIR)/j0.atl $(PV_DIR)/j1.atl \ - $(PV_DIR)/j2.atl $(PV_DIR)/h0.atl $(PV_DIR)/t0.atl -PV_ATL := \ - $(foreach s,$(PV_STORY),$(foreach p,$(PV_PARTS),$(PV_DIR)/s$(s)_$(p).atl)) \ - $(foreach s,$(PV_SCENES),$(foreach p,$(PV_PARTS),$(PV_DIR)/p$(s)_$(p).atl)) \ - $(PV_ANIM) -PV_ARC := $(PV_DIR)/pv.arc -PV_DATA := $(PV_DIR)/story.pal $(PV_DIR)/pv.pal $(PV_ARC) - -EXTRA_DATA := $(BG_DATA) $(KID_ARC) $(KID_DIR)/kid.pal $(KID_BIN) $(GUARD_DATA) $(SKEL_DATA) \ - $(VIZIER_DATA) $(SHADOW_DATA) $(SND_DATA) $(MUS_DATA) $(FONT_DATA) $(TITLE_DATA) $(PV_DATA) $(LVL_DATA) -# Образ HDD для MAME: ресурсы раскладываются ПО КАТАЛОГАМ (8.3, как в DSS), -# чтобы корень диска не зарастал десятками .atl. -# BG\ — фон (env/wall/fore/pot) -# KID\ — персонаж (kid0..27, палитра, меч, таблицы анимации) -# GUARD\ — стражи (появятся здесь же) -# FONT\ — текстовый атлас pause/settings UI -# TITLE\ — нарезанные композиции оригинальной заставки -# PV\ — story и Princess/Jaffar intro, нарезанные полосами -# LEVELS\ — уровни -HDD_PACK_ARGS := $(EXAMPLE).exe \ - $(foreach f,$(BG_DATA),BG:$(f)) \ - KID:$(KID_ARC) KID:$(KID_DIR)/kid.pal KID:$(KID_BIN) \ - $(foreach f,$(GUARD_DATA),GUARD:$(f)) \ - $(foreach f,$(SKEL_DATA),SKEL:$(f)) \ - $(foreach f,$(VIZIER_DATA),VIZIER:$(f)) \ - $(foreach f,$(SHADOW_DATA),SHADOW:$(f)) \ - $(foreach f,$(SND_DATA),SND:$(f)) \ - $(foreach f,$(MUS_DATA),MUS:$(f)) \ - $(foreach f,$(FONT_DATA),FONT:$(f)) \ - $(foreach f,$(TITLE_DATA),TITLE:$(f)) \ - $(foreach f,$(PV_DATA),PV:$(f)) \ - $(foreach f,$(LVL_DATA),LEVELS:$(f)) - -include $(CURDIR)/../sdk.mk - -TC := $(POP_ROOT)/toolchain - -# Упаковщики создают сразу ГРУППУ файлов. Обычное multi-output правило -# заставляло GNU make при `-B` запускать один и тот же упаковщик отдельно для -# каждого .atl/.bin. Stamp-файл представляет один запуск генератора; все -# созданные им файлы зависят от этого stamp без собственных рецептов. -RESOURCE_STAMP_DIR := .resource-stamps -BG_STAMP := $(RESOURCE_STAMP_DIR)/bg -GUARD_STAMP := $(RESOURCE_STAMP_DIR)/guard -SKEL_STAMP := $(RESOURCE_STAMP_DIR)/skel -VIZIER_STAMP := $(RESOURCE_STAMP_DIR)/vizier -SHADOW_STAMP := $(RESOURCE_STAMP_DIR)/shadow -SOUND_STAMP := $(RESOURCE_STAMP_DIR)/sound -MUSIC_STAMP := $(RESOURCE_STAMP_DIR)/music -KID_STAMP := $(RESOURCE_STAMP_DIR)/kid -KID_BIN_STAMP := $(RESOURCE_STAMP_DIR)/kid-bin -FONT_STAMP := $(RESOURCE_STAMP_DIR)/font -TITLE_STAMP := $(RESOURCE_STAMP_DIR)/title -PV_STAMP := $(RESOURCE_STAMP_DIR)/pv - -$(RESOURCE_STAMP_DIR): - mkdir -p $@ - -$(BG_STAMP): $(TC)/pop_pack_bg.py $(TC)/render_room.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_bg.py dungeon && python3 pop_pack_bg.py palace - touch $@ -$(BG_ATL) $(BG_DIR)/pop_tile.pal $(BG_DIR)/pal_tile.pal: $(BG_STAMP) - @test -f $@ || { $(MAKE) -B $(BG_STAMP); test -f $@; } - -$(GUARD_STAMP): $(TC)/pop_pack_guard.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_guard.py - touch $@ -$(GUARD_ATL) $(GUARD_DIR)/guard.pal: $(GUARD_STAMP) - @test -f $@ || { $(MAKE) -B $(GUARD_STAMP); test -f $@; } - -$(SKEL_STAMP): $(TC)/pop_pack_guard.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_guard.py SKEL - touch $@ -$(SKEL_ATL): $(SKEL_STAMP) - @test -f $@ || { $(MAKE) -B $(SKEL_STAMP); test -f $@; } - -$(VIZIER_STAMP): $(TC)/pop_pack_guard.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_guard.py VIZIER - touch $@ -$(VIZIER_ATL): $(VIZIER_STAMP) - @test -f $@ || { $(MAKE) -B $(VIZIER_STAMP); test -f $@; } - -$(SHADOW_STAMP): $(TC)/pop_pack_shadow.py $(TC)/pop_pack_bg.py $(TC)/pop_pack_kid.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_shadow.py - touch $@ -$(SHADOW_ATL) pop_shadow_atlas.h: $(SHADOW_STAMP) - @test -f $@ || { $(MAKE) -B $(SHADOW_STAMP); test -f $@; } - -$(SOUND_STAMP): $(TC)/pop_pack_sound.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_sound.py - touch $@ -$(SND_PARTS) pop_sound_tbl.h: $(SOUND_STAMP) - @test -f $@ || { $(MAKE) -B $(SOUND_STAMP); test -f $@; } -$(SND_ARC): $(SND_PARTS) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py $@ $(SND_PARTS) - -$(GUARD_ARC) guard_arc.h: $(GUARD_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header guard_arc.h --prefix GUARD \ - $(GUARD_ARC) $(GUARD_ATL) - -$(SKEL_ARC) skel_arc.h: $(SKEL_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header skel_arc.h --prefix SKEL \ - $(SKEL_ARC) $(SKEL_ATL) - -$(VIZIER_ARC) vizier_arc.h: $(VIZIER_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header vizier_arc.h --prefix VIZIER \ - $(VIZIER_ARC) $(VIZIER_ATL) - -$(SHADOW_ARC) shadow_arc.h: $(SHADOW_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header shadow_arc.h --prefix SHADOW \ - $(SHADOW_ARC) $(SHADOW_ATL) - -$(BG_ARC) bg_arc.h: $(BG_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header bg_arc.h --prefix BG \ - $(BG_ARC) $(BG_ATL) - -$(TITLE_ARC) title_arc.h: $(TITLE_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header title_arc.h --prefix TITLE \ - $(TITLE_ARC) $(TITLE_ATL) - -$(PV_ARC) pv_arc.h: $(PV_ATL) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header pv_arc.h --prefix PV \ - $(PV_ARC) $(PV_ATL) - -$(KID_ARC) kid_arc.h: $(KID_ARC_SRC) $(TC)/pop_pack_arc.py - python3 $(TC)/pop_pack_arc.py --header kid_arc.h --prefix KID \ - $(KID_ARC) $(KID_ARC_SRC) - -$(MUSIC_STAMP): $(TC)/pop_pack_music.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_music.py $(MUS_IDS) - touch $@ -$(MUS_DATA) pop_music_tbl.h: $(MUSIC_STAMP) - @test -f $@ || { $(MAKE) -B $(MUSIC_STAMP); test -f $@; } - -$(KID_STAMP): $(TC)/pop_pack_kid.py $(TC)/pop_pack_bg.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_pack_kid.py - touch $@ -$(KID_DATA): $(KID_STAMP) - @test -f $@ || { $(MAKE) -B $(KID_STAMP); test -f $@; } - -$(KID_BIN_STAMP): $(TC)/pop_extract_kid_data.py | $(RESOURCE_STAMP_DIR) - cd $(TC) && python3 pop_extract_kid_data.py - touch $@ -kid_data.h $(KID_BIN): $(KID_BIN_STAMP) - @test -f $@ || { $(MAKE) -B $(KID_BIN_STAMP); test -f $@; } - -$(FONT_STAMP): $(POP_ROOT)/toolchain/pop_extract_font.py \ - $(CURDIR)/../SDLPoP/src/menu.c $(CURDIR)/../SDLPoP/src/seg009.c | $(RESOURCE_STAMP_DIR) - cd $(POP_ROOT) && $(PYTHON) toolchain/pop_extract_font.py - touch $@ -$(FONT_ATL) pop_font.h: $(FONT_STAMP) - @test -f $@ || { $(MAKE) -B $(FONT_STAMP); test -f $@; } - -$(TITLE_STAMP): $(POP_ROOT)/toolchain/pop_pack_title.py \ - $(CURDIR)/../SDLPoP/data/TITLE/res51.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res52.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res53.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res54.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res55.png | $(RESOURCE_STAMP_DIR) - cd $(POP_ROOT) && $(PYTHON) toolchain/pop_pack_title.py - touch $@ -$(TITLE_ATL) $(TITLE_DIR)/title.pal: $(TITLE_STAMP) - @test -f $@ || { $(MAKE) -B $(TITLE_STAMP); test -f $@; } - -$(PV_STAMP): $(POP_ROOT)/toolchain/pop_pack_intro.py \ - $(CURDIR)/../SDLPoP/data/TITLE/res41.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res42.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res43.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res44.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res45.png \ - $(CURDIR)/../SDLPoP/data/TITLE/res51.png \ - $(CURDIR)/../SDLPoP/data/PV/res801.png \ - $(CURDIR)/../SDLPoP/data/PV/res805.png \ - $(CURDIR)/../SDLPoP/data/PV/res816.png \ - $(CURDIR)/../SDLPoP/data/PV/res851.png \ - $(CURDIR)/../SDLPoP/data/PV/res870.png \ - $(CURDIR)/../SDLPoP/data/PV/res901.png \ - $(CURDIR)/../SDLPoP/data/PV/res920.png \ - $(CURDIR)/../SDLPoP/data/PV/res951.png \ - $(CURDIR)/../SDLPoP/data/PV/res953.png \ - $(CURDIR)/../SDLPoP/data/PV/res959.png \ - $(CURDIR)/../SDLPoP/data/PV/res981.png \ - $(foreach n,802 803 804 806 807 808 809 810 811 812 813 814 815 817,$(CURDIR)/../SDLPoP/data/PV/res$(n).png) \ - $(foreach n,852 853 854 855 856 857 858 859 860 861 862 863 864,$(CURDIR)/../SDLPoP/data/PV/res$(n).png) \ - $(CURDIR)/../SDLPoP/data/PV/res952.png \ - $(foreach n,151 152 153 154 155 156 157 158 159,$(CURDIR)/../SDLPoP/data/PRINCE/res$(n).png) | $(RESOURCE_STAMP_DIR) - cd $(POP_ROOT) && $(PYTHON) toolchain/pop_pack_intro.py - touch $@ -$(PV_ATL) $(PV_DIR)/story.pal $(PV_DIR)/pv.pal: $(PV_STAMP) - @test -f $@ || { $(MAKE) -B $(PV_STAMP); test -f $@; } - -# Явные цели позволяют собирать ресурсы без `make -B`, который по смыслу -# принудительно пересобирает также libc, libbgi и само приложение. -resources-bg: $(BG_DATA) -resources-kid: $(KID_ARC) -resources-actors: $(GUARD_DATA) $(SKEL_DATA) $(VIZIER_DATA) $(SHADOW_DATA) -resources-sound: $(SND_DATA) -resources-music: $(MUS_DATA) -resources-font: $(FONT_DATA) -resources-title: $(TITLE_DATA) -resources-pv: $(PV_DATA) -resources-levels: $(LVL_DATA) -resources: resources-bg resources-kid resources-actors resources-sound resources-music resources-font resources-title resources-pv resources-levels -resources-rebuild: - $(MAKE) -B resources - -# Принудительная перелинковка только roomtest, без глобального `-B` и без -# принудительной пересборки библиотек/ресурсов. -relink: resources - $(MAKE) -W Makefile $(EXAMPLE).exe - -# HDD_PACK_ARGS содержит все эти файлы; make обязан подготовить их до запуска -# упаковщика и при чистой сборке, а не полагаться на старое содержимое дерева. -hdd: resources - -# sprinter-cc собирает все модули одним вызовом и depfile пока не выдаёт. -# Банковые .c берём из того же списка, что формирует --bank; любой локальный -# заголовок также обязан перелинковать приложение. wildcard намеренно -# широкий: цена лишней полной сборки ниже риска получить stale-бинарник. -LOCAL_HEADERS := $(wildcard *.h) -$(EXAMPLE).exe: Makefile $(PROJ_ROOT)/app.mk $(BANKED_SRCS) $(LOCAL_HEADERS) \ - $(BG_DATA) $(KID_ARC) $(FONT_DATA) $(TITLE_DATA) $(PV_DATA) $(LVL_DATA) - -clean-resources: - rm -rf $(RESOURCE_STAMP_DIR) - -.PHONY: resources resources-rebuild resources-bg resources-kid resources-actors relink \ - resources-sound resources-music resources-font resources-title resources-pv resources-levels clean-resources diff --git a/applications/PoP/roomtest/README.md b/applications/PoP/roomtest/README.md deleted file mode 100644 index 43afc35..0000000 --- a/applications/PoP/roomtest/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# roomtest - -Живой прототип порта Prince of Persia: комната 1 уровня 1 отрисовывается -реальной композицией слоёв-тайлов, по ней бегает и прыгает Kid под -управлением с клавиатуры. Служит стендом для переноса механик движка -(анимация, коллизия, падение, зацеп, окклюзия, проваливающиеся полы) до их -выделения в переиспользуемый код. - -Правила разработки и порядок слоёв рендера — [`CLAUDE.md`](CLAUDE.md). - -## Быстрый старт - -``` -make # собрать roomtest.exe (ассеты упакуются автоматически) -make run # собрать, упаковать на дискету и запустить в MAME -``` - -Клавиши в запущенном тесте: ←/→ бег, ↓ присед, ↑+→ прыжок, Shift шаг, -ESC выход. - -**Отладка рисования:** -- **SPACE** — тумблер дабл-буфера (в однобуфере баги рисования видны без - мерцания-через-кадр). -- **1** — заморозить кадр (`frozen`: tick/draw/flip пропускаются, картинка - стоит), **2** — снять заморозку и продолжить. Приём для разбора - транзиентных артефактов (тряска/падение loose, поза Kid): поймать - проблемный кадр на `1`, спокойно рассмотреть/снять пиксели — в т.ч. - удалённо из MAME MCP-моста, пока анимация стоит. - -**Читы** (`pop_cheat.h`; в релизной сборке выключаются через `pop_cheats`): -- **I** — бессмертие Кида (toggle). **Работает ТОЛЬКО в бою, то есть с - мечом в руке.** Удар по безоружному Киду остаётся смертельным — ровно как - в оригинале (seg002 `hurt_by_sword`: *«Being hurt when not in fighting pose - means death»*, `take_hp(100)`). Ограничение не косметическое: анимация - «получил удар» (`seq_74`) состоит из кадров 150..179, которые ВСЕ с мечом, - и подмена смерти на неё оставляла Кида в боевой стойке при `sword == 0` — - состоянии, для которого у диспетчера `control()` нет ни одной ветки, то - есть с намертво зависшим управлением - ([BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1)). На физику (падения, - пики, чомперы) бессмертие действует всегда, независимо от меча. -- **K** — убить стража, **S** — выдать меч, **Shift+L** — следующий уровень, - **+/−** — обход комнат. - -Эталон вида комнаты — `../toolchain/1.1-2.png`. - -## Модули - -- `roomtest.c` — главный цикл (дабл-буфер, порядок tick/draw). -- `pop_bg.c` — фон комнаты композицией тайлов + fore-окклюзия + loose-полы. -- `pop_kid.c` — анимация/движение Kid (интерпретатор seqtbl). -- `pop_ctrl.c` — управление с клавиатуры (диспетчер control). -- `pop_map.c` — коллизия с картой, физика падения, loose-полы. -- `room1_data.h` — карта комнаты 1; `kid_data.h` — данные анимации Kid - (оба генерируются скриптами `../toolchain/`). - -## Статус (2026-08-18) - -**Уровни 1-3 приняты, 4-12 прошли предварительный тест.** Работает: комнаты и -переходы, Kid (анимация, управление, коллизия/падение, зацеп/подтягивание/ -спуск, окклюзия), кнопки и ворота, пики, чомперы, проваливающиеся полы, дверь -уровня и переход на следующий, меч и бой, стражи с ИИ (включая скелета и -визиря), тень уровней 4/5/6, зеркало, HP и зелья, чекпойнты, дворцовый -тайлсет. - -«Принят» = пользователь обошёл ВСЕ комнаты уровня; «предварительно пройден» = -прогон по сценарию. Разбивка по уровням с найденными багами — -[`TASKS_OPEN.md`](TASKS_OPEN.md). Не сделано вовсе: звук, таймер/HUD времени, -меню и сохранения ([QuickSave запланирован](TASKS_OPEN.md#qsave)). - -**Что берём в работу сейчас — [`TASKS_OPEN.md`](TASKS_OPEN.md)** (сделанное с -протоколами замеров — [`TASKS_CLOSED.md`](TASKS_CLOSED.md)); открытые баги — -[`BUGS_OPEN.md`](BUGS_OPEN.md), закрытые с разбором корней — -[`BUGS_CLOSED.md`](BUGS_CLOSED.md); план следующих уровней — -[`../docs/levels_plan.md`](../docs/levels_plan.md). diff --git a/applications/PoP/roomtest/TASKS_CLOSED.md b/applications/PoP/roomtest/TASKS_CLOSED.md deleted file mode 100644 index b5a8e42..0000000 --- a/applications/PoP/roomtest/TASKS_CLOSED.md +++ /dev/null @@ -1,1377 +0,0 @@ -# roomtest — ЗАКРЫТЫЕ задачи (архив досок, обновлено 2026-08-11) - -Сделанное — с протоколами замеров, граблями и причинами решений. Файл -существует не ради истории: половина записей ниже — это ЧИСЛА (сколько тактов -стоил heal, сколько байт теряет клавиатура, почему `static inline` дорог) и -перечень того, что делать НЕЛЬЗЯ, потому что уже пробовали. - -Открытые задачи — [`TASKS_OPEN.md`](TASKS_OPEN.md); открытые баги — -[`BUGS_OPEN.md`](BUGS_OPEN.md), закрытые с разбором корней — -[`BUGS_CLOSED.md`](BUGS_CLOSED.md). - ---- - -## QuickSave - - -### QSAVE. QuickSave / QuickLoad — **РЕАЛИЗОВАНО И ПРОВЕРЕНО 2026-08-22** (коммит f4b4852, тэг v0.6-pop-quicksave) - -F6/F9 в roomtest. Формат снимка `'POPQ'` v3: заголовок -{P,O,P,Q,ver=3,level,reserved}, payload всех игровых переменных (Kid/Guard -через qs_char, HP, fight seed, читы speed/immortal/sound с range-валидацией -на загрузке), хвост = размер payload + XOR-контрольная сумма (старший байт = -инвертированный XOR). Носитель — файл на HDD: транзакционная запись -`unlink POP.NEW → bank_save_file → rename SAV→BAK → rename NEW→SAV` -с откатом; загрузка пробует POP.SAV, потом POP.BAK; при другом уровне — -`pop_next_level+pop_level_switch`. Сериализация через резидентные W0-примитивы -`pop_qs_*` (паттерн request-flag + `pop_qsave_process()` на границе кадра вне -Char-окон); сериализаторы добавлены в pop_map/pop_loose_mob/pop_trob/ -pop_guard_ai с восстановлением инвариантов (mobs_live, trob_drawn, redraw). -Дабл-буфер закрыт `pop_qsave_restore_room()`: полная перезагрузка комнаты + -перерисовка ОБЕИХ страниц + инвалидация кэшей спрайтов и HP. Три ГСЧ -(`pop_t_seed`, `trob_seed`, `pop_fight_seed`) — все в payload. -Файловое I/O — новые `bank_load_file`/`bank_save_file` libc (без правила W3). - -Критерий приёмки выполнен: сохранить, выйти по ESC, запустить заново, -загрузить — оказались там же; проверено в MAME. Полный разбор и формат — -[`../docs/quicksave_plan.md`](../docs/quicksave_plan.md) (теперь справочник). - ---- - -## Уровни: спецсобытия - - -### L8-MOUSE. Мышь уровня 8 — ЗАКРЫТА 2026-08-12 - -Спецсобытие комнаты 16: кнопка (0,7) открывает решётку (0,3), но с левой -площадки верхнего ряда до кнопки не дойти — между ними провал в три колонки. -Когда дверь уровня уже открыта, а Кид всё ещё в комнате 16, оригинал через -150 кадров присылает мышь: она пробегает справа налево, наступает на кнопку и -убегает. Порт по SDLPoP: `do_timers` seg003:0545, `do_mouse` seg003:0ABA, -`autocontrol_mouse` seg002:07EB. - -**Ассетов и отрисовки не потребовалось вовсе.** Кадры 186..188 лежат в -таблице КИДА (`load_frame` seg006:0293 — общий case), их images 130..132 уже -упакованы в `kid16.atl` (idx 2/3/4: 17×4, 19×4, 12×10) — `pop_pack_kid.py` -берёт все `res(401+N).png`, что есть в `data/KID`. Отрисовка подхватывает -мышь сама: `pop_frame_tbl_is_guard(24, …)` отдаёт 0, значит и таблица кадров, -и набор атласов берутся кидовские, и палитра (0x70) тоже. - -Что написано: - -| где | что | -|---|---| -| `guards.c` | `pop_check_mouse` (условие + рождение), `autocontrol_mouse`, ветки мыши в `autocontrol_opponent` / `play_guard` / `pop_check_can_guard_see_kid` | -| `pop_state.c/h` | `pop_leveldoor_open` стал **word**, как в оригинале (data.h:361): в него же считается задержка, байт переполнился бы через 255 кадров и обнулил признак «дверь открыта» | -| `pop_guard.c` | `leave_guard` не записывает в данные уровня тень и мышь (seg002:02F5) — раньше эта проверка отсутствовала вовсе | -| `pop_cdraw.c` | полосы HP у мыши нет (`draw_guard_hp`, seg000:1159) | -| `pop_tune.h` | числа события (уровень/комната/задержка/пороги X) | - -**Правило появления — мышь ОДНОРАЗОВАЯ (сверено с оригиналом).** Счётчик -живёт в `leveldoor_open`: 0 на старте уровня (seg003:97), 1 — когда створка -двери уровня доехала доверху (seg007:456, то есть Кид нажал кнопку в комнате -3), дальше `++` каждый кадр, пока Кид в комнате 16, и вызов ровно при -`== 150`. Отсюда три следствия: - -- второго раза НЕТ: счётчик растёт дальше, а сравнение строгое. Не успел - пройти решётку, пока она открыта — мышь больше не придёт; -- выход из комнаты 16 счётчик не сбрасывает, а ЗАМОРАЖИВАЕТ: ушёл на сотом - кадре, вернулся — ждать осталось пятьдесят; -- обнуляет только `start_level`, то есть смерть/рестарт уровня — но он же - возвращает тайлы и модификаторы, так что дверь придётся открывать заново. - -Значения `0x4D` (музыка уровней 4 и 6) и `2` (победа над Джаффаром, уровень -13) в ту же переменную к уровню 8 отношения не имеют — там счёт идёт -монотонно 1 → 150. - -**Чего в условии НЕТ (проверено грепом по всем упоминаниям `mouse_level` / -`mouse_room` / `do_mouse` — единственная точка запуска это seg003:545):** -оригинал не смотрит ни на состояние решётки (0,3), ни на то, с какой стороны -провала стоит Кид, ни на то, прошёл ли он её уже. «Кид заперт за закрытой -решёткой» получается САМО: находиться в комнате 16 двенадцать с половиной -секунд можно только топчась там, а стоит уйти в комнату 4 — счётчик -замирает. Обратная сторона той же простоты: вернувшись в комнату 16 с ЛЮБОЙ -стороны, игрок доигрывает накопленное ожидание и может получить мышь, даже -если решётка в этот момент открыта. - -Тупика при этом нет: провал в колонках 4..6 ведёт на нижний ряд комнаты -(`debris` между колоннами, а колонна — проходимый пол, seg006:0628), оттуда -низом через комнату 4 с шипами есть путь к двери уровня в комнате 3. Цена — -падение на два ряда, то есть −1 HP. Мышь экономит эту единицу, а не спасает -от тупика. - -**Тонкость, на которой легко сломать уход:** `seq_107` прыгает на метку -`Mscurry1`, стоящую ПОСЛЕ опкода `act(actions_1_run_jump)` в `seq_105` — на -обратном пути кадры бега проигрываются, а `action` остаётся стоечным. Именно -этим оригинал отличает «бежит к кнопке» от «убегает»: условие исчезновения -висит на `action == 0`. - -**Проверено.** Хост-набор `t_mouse` (17 проверок, единственный, куда -линкуется `guards.c`) — рождение по таймеру, замороженный счётчик вне комнаты, -требование открытой двери, нажатие кнопки на пробеге, разворот и исчезновение, -невидимость для Кида, необращение в «стража комнаты». Регресс проверен -откатом: без ветки в `autocontrol_opponent` падают две проверки ухода. -Живьём в MAME (комната 16 уровня 8, `leveldoor_open` взведён через мост): -мышь появилась (`charid = 0x18`), добежала до колонки 7 (кадр 188, x = 164), -решётка (0,3) поехала вверх, мышь ушла вправо и погасла (`direction = 0x56`). - - -### MEM-COLD1. Холодная половина главного цикла — в банк 8 (2026-08-12) - -К уровню 8 куча в режиме huge упала до **879 Б**. Убирать из `roomtest.c` -оказалось нечего — отладочное там всё живое (обход комнат, стоп-кадр, читы, -профиль), — поэтому вынесли в банк то, что отрабатывает раз на уровень или -только по клавише: `pop_start_level` + `find_start_level_door`, чит-навигацию -по комнатам и лейбл номера комнаты (`roomtest_cold.c`, `--bank 8`, `n_banks` -поднят до 8). - -Результат: `_CODE` 25653 → 24825, **куча 879 → 1707 Б**, банк 8 занят на 5 %. -Кадровый путь не тронут: за обычный кадр в банк 8 уходит ноль вызовов, при -смене комнаты — один трамплин. - -Что осталось в резиденте намеренно: `enter_room_side` и рабочие массивы -комнаты (их читает и главный цикл, и холодная половина), `guard_over_kid` с -хелперами (зовётся каждый кадр). Следующий шаг — [MEM-COLD2](TASKS_OPEN.md#mem-cold2). - ---- - -## Приёмка уровней - - -### ПОЛИТИКА ПРИЁМОК — решение пользователя 2026-08-11 - -**Уровни 1-4: smoke-тесты пройдены.** Полные прогоны (обход всех комнат -каждого уровня) делаются **по готовности ВСЕХ уровней**, а не по одному за -этапом — отдельных задач `L3-PASS`/`L4-PASS` больше нет. - -Основание: сквозные обходы дорогие, а половина находок на неполном наборе -уровней всё равно оказывается «механики ещё нет». Smoke (пройти уровень от -старта до двери) остаётся обязательным на каждом новом уровне — он снимает -блокеры, а не косметику. - -Уже сделанные полные обходы уровней 1 и 2 (ниже) остаются регресс-базой. - - -### L1-PASS. Сквозное прохождение уровня 1 — **ЗАКРЫТ 2026-08-07** - -> **Smoke 2026-08-05 (пользователь): успешный.** От старта до выхода с -> уровня одним заходом — меч подобран, **оба стража побеждены в честном бою** -> (без читов), выход отработал корректно. Ценность прогона в том, что он снял -> главные риски этапа 1 разом — боёвка, предметы, переход с уровня — и стал -> регресс-базой для уровня 2. -> -> **Полный обход комнат 2026-08-07 (пользователь): крупных багов нет.** Этим -> же прогоном закрыта [таблица обхода 24 комнат](BUGS_CLOSED.md#обход-всех-24-комнат-уровня-1) -> и [чек-листы ручной перепроверки фиксов](BUGS_CLOSED.md#ручная-перепроверка-2026-08-03) -> — обе уехали в `BUGS_CLOSED.md`. - -Приёмка этапа 1 и одновременно регресс-база для уровня 2: от старта до двери -уровня одним заходом — подбор меча, страж, кнопки/ворота, пики, loose-полы, -зелье, падения. Точки, где смотрели внимательно, — закрытая косметика -окклюзии (потолок при прыжке вверх, шов при анимации решётки, грани дальней -колонны) и подъём на тайл-кнопку (оговорка к BUG-3 в `BUGS_CLOSED.md`). - - -### L2-PASS. Приёмка уровня 2 — **ЗАКРЫТ 2026-08-07** - -> **Smoke 2026-08-05 (пользователь): уровень 2 пройден.** Из smoke пришли -> BUG-LOOSE-3 и BUG-GUARD-DEAF-1 — оба закрыты (`BUGS_CLOSED.md`). Следом -> прогнан smoke уровня 3. -> -> **Полный обход комнат 2026-08-07 (пользователь): крупных багов нет.** -> Открытыми с этого прогона остались три записи в -> [`BUGS_OPEN.md`](BUGS_OPEN.md): [BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1) -> (страж всегда одного цвета), BUG-GUARD-SPLASH-1 (нет брызг при попадании по -> стражу — **закрыт 2026-08-07**, разбор в -> [`BUGS_CLOSED.md`](BUGS_CLOSED.md#bug-guard-splash-1)) и -> [BUG-CHEAT-FIGHT-1](BUGS_CLOSED.md#bug-cheat-fight-1) (наш чит `+`/`−` в бою -> отнимает управление). Ни одна играть не мешает. - -Ниже — **карта содержимого уровня, снятая прямо с `res2002.bin`**. Она -осталась в архиве не как отчёт, а как справочник для повторных прогонов и -для сравнения с SDLPoP: если механика в таблице есть, а в игре не сработала — -это баг, а не «так задумано». - -**Стражи — 5, в комнатах 4, 7, 11, 15, 24** (skill 1/2/1/1/3, цвета -1/3/1/1/6 — цвет мы пока игнорируем, атлас один, см. -[BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1)). Заметить: страж -комнаты 24 со skill 3 — первый по-настоящему опасный. - -**Кнопки и что они открывают** (декодировано из LINKLOC/LINKMAP): - -| Кнопка | Тип | Цель | -|--------|-----|------| -| к.9 @ряд1,кол1 | RAISE | **дверь уровня** к.23 @1,3 — то есть выход | -| к.11 @1,1 | RAISE | ворота к.18 @0,9 | -| к.18 @0,7 | RAISE | ворота к.7 @0,9 **и** к.18 @0,9 (две сразу) | -| к.18 @0,2 | DROP | закрывает ворота к.7 @0,9 | -| к.13 @1,4 | DROP | закрывает ворота к.13 @1,5 | - -**Ловушки и предметы по комнатам:** - -``` -к. 3 loose@2,2 зелье@2,5 (здоровье) -к. 4 loose@1,7 loose@1,8 + СТРАЖ -к. 5 дверь уровня @1,2-3 — ВХОД (захлопывается за спиной) -к. 6 пики@1,3 loose@1,5 зелье@2,7 (здоровье) -к. 7 ворота@0,9 пики@2,7 + СТРАЖ -к. 8 зелье@2,2 (здоровье) -к. 9 кнопка RAISE@1,1 loose@2,6 -к.10 пики@2,2 -к.11 кнопка RAISE@1,1 + СТРАЖ -к.12 зелье@2,6 (здоровье) loose@2,8 -к.13 зелье@1,3 (ВРЕДНОЕ, −1 HP) кнопка DROP@1,4 ворота@1,5 зелье@1,8 -к.15 + СТРАЖ -к.18 кнопка DROP@0,2 loose@0,4 кнопка RAISE@0,7 ворота@0,9 зелье@2,6 -к.19 пики@1,4 -к.20 ЗЕЛЬЕ@1,2 — БОЛЬШАЯ СКЛЯНКА (+1 к потолку HP) пики@2,6 пики@2,7 -к.23 дверь уровня @1,3-4 — ВЫХОД -к.24 + СТРАЖ (skill 3) -``` - -Отдельно проверялось то, что появилось именно на этом уровне: -- **большая склянка** (к.20) — потолок HP становится 4, индикатор рисует - четыре деления, и это HP **переносится на уровень 3**; -- **меч уже в руках** с самого старта (`have_sword = level >= 2`); -- **выход через дверь к.23** вживую (кнопка в к.9); -- **смерть/респавн** возвращают на уровень 2, а не на 1. - ---- - -### Справка: связность комнат уровней 1–3 (снято 2026-08-05) - -Обход графа `roomlinks` (@1952, по 4 байта на комнату: L, R, U, D; 0 = нет -соседа) от стартовой комнаты — тем же методом, которым на уровне 1 нашлись -13/18/24 (см. «НЕ БАГИ» в [`BUGS_CLOSED.md`](BUGS_CLOSED.md)). Скрипт разовый, -в репозиторий не клался: чтение трёх массивов, BFS и проверка симметрии. - -| уровень | старт | недостижимы | признак | -|---------|-------|-------------|---------| -| 1 | к.1 (0,0) | **13, 18, 24** | ссылки наружу есть, обратных нет | -| 2 | к.5 (1,3) | **нет** | граф полностью симметричен, все 24 достижимы | -| 3 | к.9 (2,4) | **23, 24** | то же, что на 1: односторонние ссылки, обе комнаты **полностью пустые** | - -``` -ур.3: 23 L→4, у 4 R=22 | 24 L→2, у 2 R=7 - 23 R→22, у 22 L=4 | 24 R→7, у 7 L=2 - | 24 U→16, у 16 D=0 - на 23 ссылается только 24, на 24 — только 23; тайлы обеих = все empty -``` - -То есть на уровне 3 это даже более чистый случай, чем на уровне 1: там в -брошенных комнатах была геометрия, здесь — пустота. Практический вывод тот -же: **в 23/24 возможен «мусор в шве»** (наш рендер кромки читает крайнюю -колонку соседа ПО ССЫЛКЕ, а сосед соседом себя не считает), приоритет багов -там низкий, в игре их не видно. - -**Уровень 2 — недостижимых нет, но есть три КОЛОДЦА без выхода** (единственная -связь — вверх, откуда Кид падает): - -``` -к.10 U→4 пики(2,2) + пол — падение из комнаты 4 -к.14 U→21 шахта 2 тайла шириной, дно = обломки -к.17 U→15 то же -``` - -Это не баги данных: в 14/17 попадают только падением насмерть, а из 10 -(если выжил) выхода нет вовсе — так в оригинале. При приёмке не считать -«застрял» багом. - ---- - -## Уровни и механика - - -### L4-MIRROR. Зеркало уровня 4 и тень — **ЗАКРЫТА 2026-08-11** - -Пять шагов из шести сделаны и **проверены пользователем в MAME 2026-08-11**; -шестой (вид тени) осознанно отложен. - -| шаг | что | коммит | -|---|---|---| -| 1 | зеркало в атласе: `tile_table[0x0D]` база 75 / фронт 77, `MIRROR_ENV_IDS` + `FORE_ENV_IDS` в `pop_pack_bg.py` | `1b2111f` | -| 2 | постановка тайла: `place_mirror` в `pop_trob.c` по переходу `pop_leveldoor_open` 0/2 → 1 (`animate_leveldoor`, seg007:0457) | `1b2111f` | -| 3 | отражение (`check_mirror`, seg003:0798) — отдельной функцией `pop_mirror_draw`, со своим heal | `8f0362f`, `3913f1e` | -| 4 | прыжок сквозь зеркало и рождение тени (seg004:0239 + seg003:0798..08A9 + seg002:081D/1131) | `844fa6d` | -| 5 | клип тени слева `obj_clip_left = 137 + (mirror_column−4)*32` (seg008:1699) + новый примитив `gfx_blit_cols_part_wx` в libbgi | `8f0362f` | - -**Почему зеркало пришлось добавлять в атлас явно:** тайла 13 нет ни в одном -уровне статически — проверено перебором всех 15 `res200N.bin`, ноль -попаданий, поэтому `render_room.py` его не видит и на месте зеркала был бы -чёрный провал (memory `pop_atlas_dynamic_ids`). - -**Почему отражение — отдельная функция, а не третий слот `Char`:** это -структура самого оригинала — отражение идёт сокращённым путём -`load_frame_to_obj` + `add_objtable(4)`, без клинка, брызг, пропуска кадра; -гейтить всё это в общем теле `pop_cdraw` значило бы добавить ветки в самый -горячий путь. Побочный эффект — [FORE-DUP](BUGS_OPEN.md#fore-dup): передний -слой тайла рисуется дважды, когда футпринты Кида и отражения накрывают один -тайл (всегда, они стоят на одном тайле). Картинку не портит, тратит такты. - -**Почему левый клип сделан примитивом libbgi, а не «нарисовать и вернуть фон -поверх лишнего»** (подсказка пользователя): для column-major левая обрезка -стоит ровно столько же, сколько правая — колонка это непрерывный кусок ОЗУ, -меняются стартовая колонка источника и экранная X. Внутри это уже было (так -клипается левый край экрана), наружу не было выведено. - -**Отложено — вид тени** (шаг 6): в оригинале она рисуется ДВУМЯ блитами -одного спрайта, `blitters_2_or` на месте и `blitters_3_xor` со сдвигом +1 px -(seg008:1602); у нас пока обычная копия, то есть тень выглядит вторым Кидом. -Разбор, замеры и варианты — [`../docs/shadow_render.md`](../docs/shadow_render.md); -блочные операции акселератора под это в libbgi уже есть (`tests/accop`). - -**Краевой случай проверен и закрыт как НЕ БАГ** — -[MIRROR-FG-STALE](BUGS_CLOSED.md#mirror-fg-stale): тайл ставится в момент, -когда дверь дорисовала открытие, а в реальном прохождении игрок в этот момент -в другой комнате; при обычном входе комната и снимок `room_fg` берутся из -данных уровня разом. - - -### L3-CHOMP. Чомперы — **СДЕЛАНЫ 2026-08-08** - -Коммиты `dc0bd47` (анимация, отрисовка, смерть в челюстях), `4d4323f` -(передние зубья через `pop_fore_b` + ветка в `draw_tile`), `db4106a` -(перед чомпером Кид разбегается сразу, без осторожного шага — `safe_step` по -оригиналу), `1461ed5` (фикс регрессии, см. ниже). - -Портировано: `animate_chomper` (seg007:0448), `next_chomper_timing` -(seg007:0F9A — 15,12,9,6,13,10,7,14,11,8 по кругу), `start_anim_chomper` -(seg007:08C7), `start_chompers` (seg007:0F13) — все в `pop_trob.c`, -состояние в `room_modif`, как у пик и ворот. Смерть: `SEQ_54_CHOMPED` / -`FRAME_178_CHOMPED` + `check_chomped_guard` для соперника (`pop_map.c`). -Отрисовка — `pop_chomp_pose` (`pop_bg.c`) и холодная перерисовка тайла в -`pop_room.c`. Ассеты упакованы явным набором кадров (`CHOMPER_BOT_IDS` -101-105, `TOP` 111-113, `FORE` 106-110 + кровь 114-123 mono-силуэтом). - -**Грабли, стоившие регрессии (`1461ed5`):** `start_chompers` вызывается на -смене ряда персонажа, а у нас `seqtbl` читается ЧЕРЕЗ ОКНО W0 — прямой вызов -из `play_seq` переключал окно посреди чтения байткода. Вызов отложен через -флаг `chomp_pending` (`pop_kid.c`) и делается ПОСЛЕ цикла интерпретатора. - -Хвосты в багах: [BUG-CHOMP-JUMP-1](BUGS_OPEN.md#bug-chomp-jump-1) (низкий, -маловоспроизводим) и закрытые BUG-TORCH-CHOMP-1/2 (пламя факела и застывший -чомпер — [`BUGS_CLOSED.md`](BUGS_CLOSED.md)). - - -### L3-SKEL. Скелет уровня 3 — **СДЕЛАН 2026-08-07, принят smoke-прогоном** - -В данных уровня 3 стражей нет вообще (`guards_tile` пуст во всех 24 -комнатах) — единственный враг это скелет, и он не «страж из данных», а -**спецсобытие** `check_skel` (seg002:1044): в комнате 1, когда -`Kid.curr_col` == 2 или 3 и дверь уровня открыта, тайл `tiles_21_skeleton` -(комната 1, тайлпос 15) стирается в пол, а на его месте поднимается -персонаж — `charid_4_skeleton`, меч сразу вынут, `seq_88_skel_wake_up`, -skill 2, HP 3. Ещё два тайла скелета (комнаты 17 и 19) — декорация, они не -оживают. Атлас — `pop_pack_guard.py SKEL` → `poc/res/skel/g0..g3.atl`. - -Проверено в MAME: бой, падение в пропасть, окклюзия (2026-08-07); принят -smoke-прогоном уровней 1-4 (2026-08-11). **Этот же механизм** — -«спецсобытие порождает персонажа в слоте соперника» — база для тени уровня 5 -([L5-SHADOW](TASKS_OPEN.md#l5-shadow)). - - -### L3-CHKP. Чекпойнт уровня 3 — **СДЕЛАНО 2026-08-06** (коммит 0cd6b2d) - -`level3_set_chkp` (seg002:0665): флаг взводится, когда Кид уходит **ВЛЕВО ИЗ -комнаты 7**; `do_startpos` (seg003:141) по нему подменяет старт на комнату 2, -тайлпос 6, направление влево и снимает loose-плиту (комната 7, колонка 4, -ряд 0). Константы — в `pop_tune.h` (`POP_CHKP_*`), механика `hitp_beg_lev` -была сделана раньше в L2. - -**Тонкость, на которой сначала ошиблись:** `level3_set_chkp` вызван из -`leave_room` ДО `goto_other_room`, поэтому `Char.room == 7` — это комната, ИЗ -которой уходят, а не в которую входят. Поймал пользователь прогоном в -SDLPoP: смерть В комнате 7 вернула его в стартовую 9, а плита осталась цела. - -**Проверено в MAME:** вход в 7 флаг не ставит, уход влево — ставит; респавн в -комнате 2; после обычной смерти (без чекпойнта) плиты восстанавливаются как -раньше. Вживую в игре (не читом) — потрогать на приёмке уровня 3 -([L3-PASS](TASKS_CLOSED.md#pass-policy)). - -### L2. Переход на уровень 2 и его игра — **МАШИНЕРИЯ СДЕЛАНА 2026-08-04** - -Порт `levels_plan.md` §2 (шаг 1). Что появилось: - -- **Номер уровня стал состоянием.** `pop_current_level` (порт - `current_level`) в `pop_level.c`; `pop_next_level` больше не флаг, а - НОМЕР — `END_LEVEL` его инкрементит (как `++next_level`, seg006:662), а - главный цикл срабатывает по расхождению `pop_next_level != - pop_current_level` (порт `play_level_2`, seg003:0386). -- **Загрузка по номеру** — `pop_level_load_num(n)`: `LEVELS\res20NN.bin` - (fallback `a:\`), старая EMM-страница отпускается ТОЛЬКО после успешной - загрузки новой (нет файла — играем дальше на текущем). На диск кладутся - все 15 уровней (34 КБ). -- **Потабличные различия** (`data.h:840..848`) — таблицы по 16 в - `pop_level.c`: `tbl_entry_pose` (поза входа), `tbl_guard_hp` (HP стража, - ушло из хардкода `3`), `tbl_guard_type` (**−1 = стражей нет**, иначе на - 14/15 они полезли бы из данных комнат), `tbl_level_type` (тайлсет — - пока только читается). -- **`find_start_level_door`** (seg003:02E6) — на уровне 2 это НЕ косметика: - стартовый тайл (комната 5, ряд 1, колонка 3) — правая половина двери - уровня, и без `modif = 43` + `add_trob(...,3)` Кид материализуется внутри - глухой створки. Тип 3 = «быстро закрыть»: дверь захлопывается за спиной - за три кадра, как в оригинале. -- **HP через уровень** — `hitp_beg_lev` (seg003): рестарт уровня - откатывает HP к нему, пройденный уровень подтягивает его к `hitp_max`. - Заодно реализована **большая склянка** (`add_life`, тип зелья 2: +1 к - ПОТОЛКУ HP до 10) — на уровне 2 она есть, комната 20. -- **Меч** — `have_sword = level >= 2` (play_level, seg003:106), а не - жёсткий ноль. -- **Чит Shift+L** (seg000:698) — `pop_next_level = pop_current_level + 1`. - NB: `L` без Shift занят отладочным «осторожным шагом вправо» - (`pop_ctrl` `KBD_DBG_STEPR`); с Shift шаг тоже пройдёт, но уровень тут же - сменится — на практике не мешает. - -**Проверено в MAME (2026-08-04):** старт уровня 1 → Shift+L → уровень 2 -рисуется правильно (комната 5, большие колонны — новые для нас тайлы 8/9 — -на месте, дверь захлопнута, HP 3) → влево в комнату 4, страж на месте → -Shift+L → уровень 3 (комната 9). То есть цепочка загрузок работает -повторно, а не только один раз. - -Контент уровня 2 (сквозное прохождение, выход через дверь) закрыт отдельно — -[L2-PASS](#l2-pass). Цвет стража из данных остался открытым багом — -[BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1). - -### L1-START. Старт по данным уровня — **СДЕЛАНО 2026-08-01** - -Старт и оба рестарта (смерть, выпадение из уровня) сведены в один -`pop_start_level()` — порт `start_level` + `do_startpos` + `set_start_pos` -(seg003): комната/тайл/направление берутся из `pop_level_start_*`, направление -инвертируется (`~start_dir`), поза входа — из `tbl_entry_pose`. У уровня 1 -это «падение внутрь» плюс нажатие кнопки room5(0,2) — то самое, что -захлопывает решётку за спиной. Проверено: старт даёт room 1, col 0, падение -на row 1 — как по данным уровня. - -`#define ROOMNAV` оставлен ВКЛЮЧЁННЫМ осознанно: это наш чит, которого в -оригинале не было, — как и `S` (выдать меч), `K`, `I`. Все они со временем -съедутся в общий блок читов, разрешаемый в настройках (решение 2026-08-01). - -### L1-EXIT. Выход с уровня (дверь уровня) — **СДЕЛАНО 2026-08-01** - -Портированы: ветка двери уровня из `up_pressed` + `go_up_leveldoor` -(seg005:0482/0574) — в `pop_leveldoor_enter()` (`pop_map.c`, тайлы и -геометрия) и `up_pressed()` (`pop_ctrl.c`, только последовательность); -опкод `0xF1 END_LEVEL` в `play_seq` теперь инкрементит `pop_next_level` -(порт `next_level`), а главный цикл по нему перезапускает уровень — ровно -та точка, куда `levels_plan.md` §2.2 подключила загрузку уровня 2. - -Открытость двери проверяем по `modifier >= 42` (ветка `fix_exit_door`), а не -по ванильному `leveldoor_open`: с ванильным условием можно войти в ещё -ползущую створку. - -**Грабли, которые стоили отдельного разбора:** `go_up_leveldoor` сначала -писал `Char.x`/`Char.direction`, и оба присваивания молча терялись — окно -`Char` вокруг диспетчера возвращает назад ТОЛЬКО `curr_seq` и `sword` -(`pop_savekid_state`). Направление оставалось «вправо», а все `DX` -последовательности seq_70 отрицательные, поэтому Кид уходил ИЗ проёма влево. -Вывод на будущее: геометрию персонажа в этом порте меняет `pop_map` (пишет в -`Kid`), а не диспетчер. - -✅ Косметика тоже закрыта: BUG-DOOR-CLIP (обрезка силуэта правым косяком -проёма) — недоставало второй половины `clip_char` (`obj_clip_right`) и -обрезки СПРАВА у колоночного блита. В libbgi добавлен -`gfx_blit_cols_part_w(..., maxw)`; разбор — в [`BUGS_CLOSED.md`](BUGS_CLOSED.md). - -### L1-TRIAGE. Ревизия багов — **ЗАКРЫТА** (часть 1 — 2026-08-01, хвост — 2026-08-07) - -✅ **Три Critical'а прогнаны в MAME и закрыты** (протокол с числами — в -[`BUGS_CLOSED.md`](BUGS_CLOSED.md), раздел «Проверено в MAME 2026-08-01»): -BUG-1 (провал на row 1 при переходе через открытые ворота) и BUG-2 -(ping-pong при возврате) **не воспроизводятся**, BUG-3 (окклюзия climb-up на -кнопке) закрыт фиксом `tile_code_drawn` от 2026-07-28. Заодно снят неверный -диагноз BUG-1: репроекция Y при БОКОВОМ переходе — не наш пробел, а точное -поведение `goto_other_room` (`SDLPoP/src/seg002.c:390` меняет только `x`). -Список разделён на [`BUGS_OPEN.md`](BUGS_OPEN.md) (открытое) и -[`BUGS_CLOSED.md`](BUGS_CLOSED.md) (закрытое + разбор корней). - -✅ **Косметика окклюзии тоже закрыта** — BUG-CEIL-1/2/3 и BUG-OCCL-1 были -починены кодом ещё в июле, а записи никто не снял: `ceil_over_kid_tile` -(`pop_bg.c:1275`), `pop_ceil_modif` + `pop_ceil_shake_draw`/`_bake_empty` -(`:547,815,827`), `bar` с `POP_YOFF+3` в `pop_room_redraw_seam_left` (`:793`), -разделение слоёв по `add_backtable` vs `ptr_add_table` в `overlay_mid_tile` -(`:1367`). Разбор — в [`BUGS_CLOSED.md`](BUGS_CLOSED.md). - -✅ **Хвост закрыт 2026-08-07:** таблица обхода 24 комнат уровня 1 — прогоном -всех комнат уровней 1 и 2 (крупных багов нет), см. -[`BUGS_CLOSED.md`](BUGS_CLOSED.md#обход-всех-24-комнат-уровня-1). - ---- - -## Отрисовка и память - - -### DRAW-CHAR. Отрисовка — ОДНА на всех Char — **СДЕЛАНО И ПРОВЕРЕНО 2026-08-08** - -> **Итог.** Отрисовка персонажа сведена к одному набору функций над `Char` -> (`pop_cdraw.c`, банк 4) — как физика после GUARD-PHYS. Было два -> независимых куска кода: `kid_draw`/`kid_heal`/`kid_draw_splash`/ -> `kid_fore_clip*` в резиденте W1 и `pop_guard_draw`/`pop_guard_heal` в -> банке 4, каждый со своей математикой кадра, своими heal-прямоугольниками -> и своим проходом окклюзии (`pop_fore_over_kid` / `pop_fore_over_char`). -> -> **Основание в оригинале** (сверено перед кодингом): `add_kid_to_objtable` -> (seg008:22F0) и `add_guard_to_objtable` (seg008:2324) имеют ИДЕНТИЧНОЕ -> тело и различаются окном (`loadkid`/`loadshad`), набором спрайтов и типом -> объекта; `redraw_at_char` / `redraw_at_char2` (seg003:0576/0645) гейтов по -> `charid` не имеют вовсе — единственная ветка по персонажу там это -> объединение с ПРОШЛЫМ футпринтом у Кида (пометки перерисовки, у нас их -> нет). `draw_hurt_splash` (seg006:2003) разводит Кида и остальных ровно -> двумя числами: chtab/image и подъём `((charid == kid) << 2) + 11`. - -**Что теперь одно на всех.** - -| Было (два места) | Стало | -|---|---| -| `kid_draw` / `pop_guard_draw` | `pop_char_draw(who)` | -| `kid_heal` / `pop_guard_heal` | `pop_char_heal(who)` | -| `kid_draw_splash` / ветка брызг внутри `pop_guard_draw` | `cd_splash` (порт целиком, все три ветки кадров) | -| `kid_fore_clip` + `kid_fore_clip_restore` / хвост `pop_guard_draw` | `pop_char_fore(who)` | -| `pop_fore_over_kid` / `pop_fore_over_char` | `pop_fore_over_char(ch, …)` | -| `kid_fp_*()` / `pop_guard_fp_width()` | `pop_cd[slot]` (структура в `_DATA`, читается из любого банка без трамплина) | -| `pop_kid_set_render_dx` | `pop_char_set_render_dx(who, dx)` | - -Слот (`POP_CH_KID` / `POP_CH_OPP`) выбирает ровно то, что различается в -оригинале: окно `Char`, набор атласов и кадр (`kidp`+`kid_frame` / -`gp`+`pop_gframe`), heal-прямоугольники по страницам дабл-буфера. - -**Что при этом ПОЧИНИЛОСЬ (расхождения, которые и были ценой дублирования).** - -1. **`clip_char` у соперника не было вовсе** — теперь общий (в оригинале он - в обоих `add_*_to_objtable`). -2. **Клип полем 192 у Кида не было** (`reset_obj_clip`: `obj_clip_bottom = - 192`): его спрайт рисовался на полосе HP, а следы за него подчищала - полоса `pop_room_clip_borders` по флагу `pop_clip_sprite`. Теперь - персонаж режется полем, как в оригинале, и `border_dirty` остался только - у падающей плиты. -3. **У Кида не было ветки брызг «мёртв / падение 106..110»** (`obj_y += 4`) - — была только у соперника. -4. **`char_width_half` СТРАЖА считался по спрайту КИДА**: `set_char_collision` - и `check_spike_below` (`pop_map.c`) читали `kid_fp_width()` безусловно, а - `pop_guard_fp_width()` использовался только для порядка отрисовки. - Теперь метрики берутся по `charid` активного персонажа (`CD_ACT`). -5. **Расширение перебора тайлов окном спрайта** (клинок и брызги уходят за - габарит кадра) было только у соперника — теперь общее. Заодно оно - перестало быть четырьмя лишними аргументами: окно fore-клипа уже лежит в - `pop_bg.c`, и проход читает его сам. - -**Цена / выигрыш (ALLOCS=3000, замер до и после):** - -``` - было стало дельта -_CODE (W1) 24 881 20 524 −4 357 ← куча 2 023 → 6 333 Б (+4 310) -BANK2 pop_bg 15 310 15 045 − 265 ← свободно 1 074 → 1 339 Б -BANK3 pop_map 8 608 8 713 + 105 (CD_ACT — индекс по charid) -BANK4 pop_cdraw 4 625 5 905 +1 280 (сюда переехала отрисовка Кида) -итого −3 237 -``` - -То есть слияние двух копий дало ~3.2 КБ, но **главный выигрыш не в банке 2, -а в резиденте**: отрисовка Кида уехала из W1 в банк, и куча выросла втрое -(2 023 → 6 333 Б). Банку 2 при этом досталось всего +265 Б свободного -места — **под [L3-CHOMP](TASKS_CLOSED.md#l3-chomp) этого мало**, разгрузку -`pop_bg` придётся делать отдельно (свободные номера банков — 7+). - -**Проверено:** `tests-host` — все 5 наборов зелёные, трассы физики не -изменились (`[phys] ok: 1723`, тот же эталон; `[char] ok: 65`). В MAME -(свежий образ, полный рестарт): уровень 1 — комната 1 (Кид, кладка, -факелы, окклюзия колонны), падение на нижний ярус, комната 3 — страж своего -цвета с клинком и своей полосой HP, бой и смерть Кида. Артефактов -отрисовки и мусора на полосе HP нет. - -**Приёмка пользователем пройдена 2026-08-08.** Прогон вживую: отрисовка -персонажей, окклюзия и бой — без регрессий. - -Единственное наблюдение — **циан-полоса профиля (спрайты + fore) выросла**: -проход над Кидом теперь расширяется окном спрайта, как раньше только у -соперника, то есть перебирает на колонку-другую больше. Решение -пользователя: **в пределах допустимого, оптимизация — ОТДЕЛЬНОЙ задачей** -([DRAW-COST](TASKS_OPEN.md#draw-cost)). - - - -### MEM-BANK2. Разгрузка банка 2 — **ЗАКРЫТА 2026-08-08** - -Банк 2 (`pop_bg.c`) упирался в потолок: 90.8 % ещё до чомперов. Разбор по -символам показал, что он держит ДВЕ разные вещи — горячий fore-проход (каждый -кадр) и холодную отрисовку тайлов (вход в комнату, точечные перерисовки), — -а общие «листья» (`blit_b`, `tile_code`, `tile_table`, `wall_pattern`) нужны -обеим. - -**Ключевое ограничение платформы** (записано в memory -`sdcc_banked_call_rules`): писучие данные банка лежат в `_DATA`/W2 и видны -всем, а `const`-таблицы — в СТРАНИЦЕ банка, и из другого банка их не -прочитать вовсе. Плюс трамплин выбирается ОБЪЯВЛЕНИЕМ: пометить лист -`__banked` — значит заставить платить и горячих вызывающих (654 такта на -круг). - -**Шаг 1 — общие листья в РЕЗИДЕНТ** (`pop_tile.c` + внутренний `pop_tile.h`). -W1 замаплен всегда, поэтому и горячая половина, и будущая холодная зовут их -прямым `call` и читают таблицы напрямую — без дублей и без трамплинов. -Уехали: `blit_b`, `env_b/wall_b/fore_b/pot_b`, `tile_code/tile_mod/ -tile_code_drawn/wall_modifier`, `heal_off`, `get_loose_frame`, -`potion_flask`, `pop_fore_set_clip`, `pop_room_set_below/above` + таблицы -`tile_table`, `COL_XH`, `WALL_FRAM_*`, `SPIKES_FRAM_LEFT`, -`LOOSE_FRAM_LEFT/BOTTOM`. Заодно три функции перестали быть `__banked` — -минус трамплин на кадр. - -**Шаг 2 — дедуп внутри банка.** `wall_pattern` (808 → 394) и `wall_rnd` -(786 → 654): четыре ветки по виду стены (SWS/SWW/WWS/WWW) отличались ТОЛЬКО -набором кусков и числами в одной и той же серии `prandom` — сведены к -таблицам `WP_PARTS` и `WR_RULE`. Порядок вызовов `prandom` сохранён -дословно (иначе разъедется раскладка кладки). - -**Грабля, пойманная замером:** после выноса `tile_table` из `static const` в -глобальную SDCC перестала сворачивать `tile_table[10].fore_x/fore_y` в -константы и стала читать их в рантайме — `potion_flask` раздулся 115 → 265 Б. -Лечится макросами, которыми инициализируется та же запись таблицы (одно место -правки, дублирования данных нет): 265 → 230. - -**Замер (ALLOCS=3000):** - -``` - было после ш.1 после ш.2 -BANK2 14 815 12 460 11 942 (90.4 % -> 72.9 %, свободно 4442 Б) -_CODE 20 064 22 591 22 556 (куча 6793 -> 4301 Б) -``` - -С релизным `ALLOCS=100000` банк 2 будет ещё примерно на 500-600 Б меньше -(замер до разгрузки: 14 815 -> 14 176). - -**Проверено:** `tests-host` зелёные; в MAME комната 1 уровня 1 после дедупа -совпала с дорефакторным снимком **попиксельно (0 различий из 227 520)**, -комната 3 (сплошная кладка, все четыре вида стены и марки) — та же раскладка -кирпича. - -**Шаг 3 — ХОЛОДНАЯ половина в банк 7** (`pop_room.c` + внутренний -`_pop_bg.h`). Граница проведена по частоте вызова, а не по размеру: - -``` -pop_bg.c (банк 2) ГОРЯЧЕЕ fore-проход, оверлеи, кладка, клип каждый кадр -pop_room.c (банк 7) ХОЛОДНОЕ draw_tile, точечные перерисовки, mob, раз на комнату - загрузка атласов / на событие -``` - -Обратных зависимостей нет вовсе: холодная половина зовёт горячую ровно в -трёх местах (`wall_pattern`, `wall_pattern_reset`, `draw_gate_back`) — и -через ТОНКИЕ `__banked`-обёртки, а не пометкой самих тел. Тела остаются -непомеченными, поэтому fore-проход, который зовёт `wall_pattern` до девяти -раз за кадр, платит ноль. Общее состояние (`pop_loose_modif`, -`pop_ceil_modif`, `obj_row/obj_col`) — писучее, лежит в `_DATA`/W2 и видно -обеим половинам; `obj_row/obj_col` для этого перестали быть `static`. - -**Цена трамплинов:** полная отрисовка комнаты — ~40 вызовов через границу -(по два `wall_pattern` на стенной тайл), 26 000 тактов = 0.06 кадра РАЗОВО -на вход в комнату. Анимация пик/ворот — 2-4 вызова на кадр, ~1 %. Ровно -тот порядок, который был признан приемлемым при постановке задачи. - -Заодно удалена мёртвая `potion_bubble` (169 Б): её работу давно делают -`pop_potion_flask` (резидент) и `pop_potion_draw`, вызывающих не осталось. - -**ГРАБЛЯ, стоившая прогона: `n_banks` объявляет САМО ПРИЛОЖЕНИЕ** -(`roomtest.c`), а не `sprinter-cc`. Восьмой банк без правки этой константы -собирается и линкуется без единого предупреждения, `_bank_pages[7]` -остаётся 0xFF, и трамплин уводит в мусор: exe грузится, но программа встаёт -намертво ещё до первого кадра — на экране остаётся приглашение DSS. -Диагноз снят дампом `_bank_pages` из MAME (`FF EC ED EE EF F0 F1 FF` — -семь страниц вместо восьми), а не гаданием. Предупреждение об этом в -шапке `roomtest.c` было — и всё равно не сработало, потому что число банков -живёт в двух местах. - -**Замер (ALLOCS=3000):** - -``` - было ш.1 ш.2 ш.3 -BANK2 14 815 12 460 11 942 5 872 (90.4 % -> 35.8 %) -BANK7 — — — 6 035 (36.8 %) -_CODE 20 064 22 591 22 556 22 556 (куча 4301 Б — не тронута) -``` - -**Проверено (шаг 3):** -- `tests-host` зелёные; -- построчная сверка `pop_bg.c` + `pop_room.c` против дорефакторного - `pop_bg.c`: НИ ОДНОЙ строки логики не пропало и не изменилось — - расхождения только шапки, включения, три обёртки и удалённый мёртвый код; -- в MAME **8 комнат** (стартовая + 7 по `ROOMNAV`) сняты до и после и сверены - попиксельно по активному экрану 320×256: различия ТОЛЬКО в фазе анимации - (пламя факелов, кадр Кида), статическая кладка совпадает пиксель в пиксель; -- живой прогон: переход между комнатами, бой со стражем, решётка ворот, - окклюзия Кида ближней колонной — как на дорефакторном билде (сверено - контрольным запуском HEAD-бинаря с тем же вводом). - -**Что осталось в запасе, если места снова не хватит** (не делаем, пока нет -причины): вынести из РЕЗИДЕНТА холодные части — инициализацию в `main` + -`enter_room_side`/`pop_start_level` (~1.7 КБ), загрузчик атласов Кида -(~1.2 КБ), `pop_room_load`/`pop_level_load` (~1.4 КБ). Итого ~4-4.5 КБ -резидента, то есть куча 4301 -> ~8.6 КБ. Целиком `pop_level.c` в банк -нельзя: его `pop_level_tile` зовётся из банка на КАЖДЫЙ тайл — только -расщепление модуля. - -### CLIP-1. Аудит блитов: где клип не нужен — **СДЕЛАНО 2026-08-01** - -> **Итог.** Heal Кида и стража переведены на выбор ядра по тому же тесту, -> что давно стоит у блитов. Замер в MAME (счётчики `totalcycles` на входах -> `kid_heal` и `kid_tick`, то есть вся группа heal за кадр; комната 1, Кид -> стоит, стража нет): -> -> | путь | тактов на кадр | кадров в выборке | -> |------|----------------|------------------| -> | клипающее ядро (как было) | **26 200** | 149 | -> | noclip (стало) | **15 848** | 239 | -> -> **−10 352 такта на кадр, то есть −39.5 % с группы heal** (≈0.49 мс при -> ~21 МГц). A/B честный: оба замера сняты в ОДНОМ прогоне, вторая половина — -> с пропатченным в памяти условием (`jr nz` → `jr` в `pop_heal_fast`), то -> есть на той же геометрии и в той же сцене. -> -> **Размер: −362 Б суммарно** (не плюс!): `_CODE` 25 289 → 25 306 (+17), -> BANK2 13 792 → **13 676** (−116, свободно стало 2708 Б — это тот самый -> тесный банк из рисков `levels_plan.md` §5), BANK3 6512 → 6249 (−263), -> BANK4 без изменений. -> -> **Грабли, стоившие двух пересборок** (вынесено в память -> `sdcc-static-inline-double-cost`): первым заходом хелпер был `static -> inline` в `pop_bg.h` — и SDCC 4.5 И встроил его тело (181 Б) в каждое -> место вызова, И оставил отдельную копию в КАЖДОМ TU, который видит -> заголовок. `pop_guard_heal` раздулся с ~60 до 663 Б, итого +1091 Б в -> `_CODE` и +636 Б в банке стража. Лечится обычной функцией в одном -> резидентном модуле (`pop_draw.c`, W1 — из банков это прямой `call` без -> трамплина, как у `pop_sword_draw`). -> -> **Проверено визуально:** обычная ходьба, прыжок, спуск и позиция «за -> решёткой шва» (straddle — там как раз работает клипающий фолбэк) — -> артефактов и следов нет. - -**Ниже — исходная постановка задачи (что и почему смотрели).** - -**Зачем было сейчас.** Кадр занят на ~86 %; подготовка клипающего варианта -стоит ~5.6 К тактов на вызов, а общее ядро против линейного — 13 288 против -4 617 тактов на спрайт 32×3 (`libbgi/include/gfx.h`). Это самая дешёвая -оставшаяся оптимизация: не переписывание логики, а выбор ядра. - -**Что чинили:** - -- ✅ `kid_heal()` и `pop_guard_heal()` звали `gfx_heal` — **всегда с - клипом**, хотя `gfx_heal_noclip` существует и `heal_off` в `pop_bg.c` им - уже пользовался. Это heal 2–4 прямоугольников КАЖДЫЙ кадр; замер общего - ядра — 11 658 тактов на heal 22×22. Теперь все три идут через общий - `pop_heal_fast` (`pop_draw.c` + `_pop_draw.h`). -- ⛔ `pop_room_clip_borders()` (`pop_bg.c`) — `gfx_heal(0,0,320,…)`: - **оставлен клипающим осознанно**. Полоса шириной 320 не лезет в 8-битный - параметр noclip-ядра, а бить её на два куска по 160 нет смысла: гейт - `border_dirty` пускает туда только в кадрах падения, и выигрыш подготовки - тонет в цене самих 320×28 пикселей. Причина записана прямо в коде, чтобы - не «оптимизировать» повторно. - -**Что обязано остаться с клипом** (зафиксировано комментариями в коде): -- кромочные тайлы фона (`blit_b` в `pop_bg.c`) — тайл у края экрана режется - по построению; -- спрайты при straddle (`kid_render_dx = ∓140`, комната Кида ≠ отрисованной) - и при падении ниже поля — фолбэки в `kid_draw`/`pop_guard_draw`; -- борта поля (`pop_room_clip_borders`) — см. выше. - -**Что уже было правильно** (шаблон, который и распространили): блиты Кида, -стража, клинка и брызг спрашивают `pop_onscreen_cols()` и уходят в -`gfx_blit_cols_part_noclip`. Отдельный случай — `pop_kid_img_blit`: noclip -БЕЗ проверки, потому что единственный вызывающий (полоса HP) рисует по -фиксированным координатам; это тоже помечено в коде. - - -### MEM-BANK5. Разгрузка W1/W2 новым банком кода — **СДЕЛАНО 2026-08-05** - -Итог: `pop_ctrl.c` уехал в банк 5, куча 180 Б → **2298 Б** (после снижения -`--max-allocs`, см. [BUILD-FAST](#build-fast), — 2751 Б). - -Вопрос 2026-08-04: «надо делать новый банк?». **Да, и он лечит именно то, -что жмёт.** В нашей раскладке (`MEMORY=huge`, small-вариант) CODE и DATA -живут в ОДНОМ 32-КБ пространстве W1+W2 — карта сборки на тот момент: - -``` -_CODE 0x4100..0xAA00 26880 Б -_DATA 0xAAD0..0xB9B0 3808 Б -_BSS 0xB9B8..0xBADA 290 Б -куча 0xBADA..0xBB00 38 Б ← упёрлись сюда, добавляя отладку -стек 0xBB00..0xC000 1280 Б -``` - -Поэтому **каждый килобайт кода, уехавший в банк, становится килобайтом, -доступным данным**. Отдельного «дефицита W2» у нас нет — дефицит один. -(38 байт кучи не опасны сами по себе: malloc'ом мы не пользуемся, страницы -берутся через `mem_alloc_block`. Опасно то, что следующая структура -данных упрётся в стек молча.) - -Резидентный код по модулям (из `.sprinter-cc-roomtest/*.rel`): - -| модуль | _CODE | как часто зовётся | в банк? | -|--------|------:|-------------------|---------| -| `pop_kid.c` | 6287 | `load_frame`/`play_seq` — 2×/кадр (Кид + страж) | частично: холодная половина (загрузка страниц спрайтов, `pop_kid_load`) — да; движок кадров — нет | -| `roomtest.c` | 3893 | main-loop | нет (точка входа, зовёт всех) | -| `pop_trob.c` | 2526 | `do_trobs` 1×/кадр, но `pop_trob_modif` — горячий аксессор | кандидат, если вынести аксессор в резидент | -| `pop_level.c`| 2292 | `pop_level_tile` — из `pop_bg` (банк 2) на каждый тайл | **нет**: банк→банк на каждый тайл убьёт отрисовку | -| `pop_ctrl.c` | 2189 | `user_control` 1×/кадр | **взят** — дёшево и безопасно | -| `pop_guard.c`| 923 | 1×/кадр | нет смысла | - -Критерий кандидата — **не размер, а частота вызова и отсутствие горячих -банк→банк переходов**; `pop_level` показывает, что большой холодный на вид -модуль может быть горячим аксессором. Следующий шаг (расщепление -`pop_kid.c`) — в [`TASKS_OPEN.md`](TASKS_OPEN.md#mem-next), брать по факту -нехватки места. - - -### BUILD-FAST. Сборка 10 минут → 1:48 — **СДЕЛАНО 2026-08-06** (коммит 0cd6b2d) - -`--max-allocs-per-node` — во сколько вариантов размещения регистров SDCC -упирается на узел. У `sprinter-cc` дефолт 100000 (агрессивно, как fast-сборки -библиотек), и на крупных модулях roomtest это МИНУТЫ на банк. Дефолт SDCC — -3000, для разработки его достаточно: разница в размере — единицы процента. - -Итог: сборка с нуля **1:48 вместо >10 минут**, куча 2751 Б вместо 2298 -(на 3000 резидент иначе не влезает — замер: конец `_HOME` 0xBC69 при стеке с -0xBB00). В Makefile это `ALLOCS ?= 3000`: - -``` -make — быстрая сборка (ALLOCS=3000) -make ALLOCS=100000 — как раньше: минимальный код, для замеров размера - и для «релизного» образа -``` - -**ВАЖНО:** любое сравнение занятости банков имеет смысл только при ОДНОМ и -том же `ALLOCS` — иначе сравниваются не правки, а уровни оптимизации. - - -### DBG-CHEATS. Отладочные читы SDLPoP — **`[`/`]` СДЕЛАНЫ 2026-08-05**, остальное — оценка - -Мотив прямой: мост MAME **теряет нажатия при быстрой отправке**, поэтому -подогнать Кида в нужную позу для отладки автоматикой нельзя — именно на это -упёрлись BUG-LOOSE-2 и BUG-GATE-PASS-1. - -**Сделано:** - -- **`[` / `]` — сдвинуть Кида на пиксель влево/вправо.** Оригинал — - `../SDLPoP/src/seg000.c:1828`: - ```c - if (key_states[SDL_SCANCODE_RIGHTBRACKET] & key_state) ++Char.x; - else if (key_states[SDL_SCANCODE_LEFTBRACKET] & key_state) --Char.x; - ``` - У нас: коды PS/2 set 2 `[` = **0x54**, `]` = **0x5B** в `pop_cheat.h` - рядом с `KBD_CHEAT_KILL/IMMO/SWORD`; обработка — в том же блоке читов - `roomtest.c`, **по фронту** (`*_prev`, как у остальных), иначе одно - нажатие уедет на десяток пикселей. Работает по `Kid.x` напрямую: - геометрию персонажа в этом порте меняет не диспетчер (см. грабли L1-EXIT). -- **Shift+L — следующий уровень** (вошло в L2-машинерию). - -**Остальные — оценка, а не обязательство** (актуальный статус — -[`TASKS_OPEN.md`](TASKS_OPEN.md), «Отложено осознанно»): - -| Чит | Вердикт | -|-----|---------| -| **T — таймер** | **не сейчас**: таймера уровня у нас нет вообще (Фаза 6), чит пришлось бы делать вместе с механикой | -| **F — остаток feather-fall** | **вместе с Shift+W**: ветка `JMP_IF_FEATHER` (опкод `0xF7`) в `play_seq` есть, но не проверена ничем; индикатор без самого зелья бесполезен, а пара «включить + видеть остаток» закрывает ветку целиком. Перо — уровень 7, так что не срочно | -| **Shift+F9 — quickload с тем же уровнем** | **самое ценное и самое дорогое**: это сериализация `Char` + `room_modif` всех комнат + trob'ов + стражей (`levels_plan.md` §4). Даёт воспроизводимый регресс «вот кадр, где баг» вместо ручной подгонки | - ---- - - -## KBD-1. Shift + стрелки: нажатия теряются — **ПРИЧИНА НАЙДЕНА, ФИКС ПРОВЕРЕН** (остаток отложен) - -> **ПОПРАВКА К ПОСЫЛКЕ (2026-08-05).** Ниже «fake shift» подан как -> установленный факт («при зажатом Shift PS/2 удваивает трафик»). Прямой -> замер потока байт это не подтвердил: клавиатура MAME-Sprinter -> (`pc_kbd ms_naturl`) обёртку `E0 F0 12` / `E0 12` не шлёт вовсе — при -> зажатом Shift поток на стрелку ровно `E0 75 E0 75 …`. Значит удвоения -> трафика в связке Shift+стрелка нет, и мотивировка «поэтому FIFO -> переполняется» отпадает; сам ФИКС (плотный опрос `kbd_raw_poll`) остаётся -> верным и нужным — переполнение вызывает не Shift, а короткая жизнь -> импульса IRQ (пункт 3 гипотезы) плюс DI-окна графики. Разбор и следствия -> — [BUG-KBD-5](BUGS_CLOSED.md). -> -> **Итог (2026-08-01).** Причина — не наш код и не DI-окна графики: импульс -> запроса прерывания здесь теряется примерно в 44 % случаев, и трёхбайтовый -> FIFO SIO переполняется. Лечится ПЛОТНЫМ опросом: `kbd_raw_poll` повешен -> idle-хуком на ожидание кадра (`gfx_set_idle_hook`, новый API libbgi) — -> процессор всё равно проводит там ~42 мс из 60, крутя опрос луча. -> -> **Проверка в roomtest тем же счётным методом: 35 нажатий Shift+Home → -> 35 make, ноль потерь** (до фикса — 9 из 10). Боевой сценарий тоже: -> четыре Shift+→ подряд дали четыре осторожных шага, `Kid.x` 114 → 147. -> Цена: `_CODE` +170 Б, кадровый бюджет не затронут (опрос стоит в -> простое). -> -> **ОСТАТОК (ручная проверка пользователем, 2026-08-01): «стало значительно -> лучше, но иногда при зажатом Shift стрелка всё-таки пропускается».** -> Ощущение, не замер — счётчики на 35 нажатиях подряд потерь не показали, -> значит остаточная частота заметно ниже прежних ~15 %. **Задача осознанно -> ОТЛОЖЕНА до финальной полировки всей программы** (решение пользователя); -> сейчас клавиатура пригодна для работы. -> -> **Где именно осталась дыра — чтобы на полировке не начинать с нуля.** -> Idle-хук покрывает простой, то есть ~2/3 кадра. Оставшаяся треть — это -> занятая фаза, и там DI-окно одного accel-прохода доходит до ~650 мкс при -> допуске FIFO ~300 мкс. Пачка байт, целиком попавшая в такое окно, всё -> ещё может потерять байт — ровно «иногда». Порядок действий, если -> вернёмся: -> 1. Вернуть вызовы `kbd_raw_poll()` между блитами занятой фазы (они -> бесплатны; сами по себе не помогали, но вместе с хуком закрывают -> именно этот зазор) и при необходимости внутрь тайловых циклов -> `pop_bg` — тогда слепым остаётся только тело одного блита. -> 2. Мерить тем же счётным методом (см. ниже), а не на ощупь: скриптовые -> нажатия ровнее человеческих, поэтому набирать выборку от 50 нажатий. -> 3. Если и это не добьёт — остаются два рычага вне нашего кода: Scan Code -> Set 3 через BIOS `$EA` (убирает «fake shift» в корне, но в MAME -> непроверяемо — обратный путь к клавиатуре не разведён) и общий -> `m_irq_off_timer` в драйвере MAME. - -**Симптом (пользователь, 2026-08-01).** Залипаний почти нет, но при -УДЕРЖИВАЕМОМ Shift первые один-два нажатия ← дают осторожные шаги, дальше -нажатия ← не отрабатываются, пока Shift не отпустишь. - -**Рабочая гипотеза, с которой начинали.** Три факта складывались в одну -картину: - -1. **PS/2 Set 2, «fake shift».** При зажатом Shift нажатие РАСШИРЕННОЙ - клавиши (стрелки — `E0`-коды) обрамляется фиктивным отпусканием/нажатием - шифта: нажатие ← шлёт `E0 F0 12` + `E0 6B` = **5 байт** (без шифта было - бы 2), отпускание — `E0 F0 6B` + `E0 12` = **5 байт** (было 3). - (**Опровергнуто замером 2026-08-05, см. поправку выше.**) -2. **Приёмный FIFO SIO — 3 байта.** Пачка в 5 байт переживает только то, - что мы успеваем вычерпывать её по ходу. Потерянный make стрелки = - «нажатие не отработало»; потерянный break = залипание (его лечит - `kbd_raw_sync`, но ценой сброса всех немодификаторных клавиш). -3. **Импульс IRQ клавиатуры в MAME живёт 32 такта CPU.** - `mame/sources/MAME/src/mame/sinclair/sprinter.cpp`: `on_kbd_data()` - выставляет `m_irqs->in_set<1>()` НА КАЖДЫЙ принятый байт (то есть старая - запись в `docs/TODO.md` «MAME не даёт per-byte INT» — неверна), но тут же - заводит `m_irq_off_timer` на 32 такта, а `irq_off()` снимает линию. - **Если в эти 32 такта мы под `DI` — прерывание пропало насовсем**, байт - остаётся в FIFO до следующего IRQ (следующий байт или кадровый 50 Гц). -4. **Наши DI-окна длинные.** Ядра акселератора держат `di` на ВЕСЬ блит - (`libbgi/bgi256/_bgi_blit_cols_raw.c:47` — «один DI на весь блит»); - порядок цены прохода — 13.6 К тактов (`libbgi/include/gfx.h`), это - сотни микросекунд, на порядки больше 32-тактового импульса. - -Логика ввода (`pop_ctrl.c`, порт `read_user_control`/`safe_step`) сверена с -SDLPoP и корректна: `safe_step()` ставит `control_forward = CONTROL_IGNORE`, -и это снимается в `read_user_control()` при ОТПУСКАНИИ стрелки — то есть -повторные тапы ← при зажатом Shift обязаны работать. Не работали они -потому, что до нас не доезжал либо make, либо break стрелки. - -### ЧТО ИЗМЕРЕНО (сессия 2026-08-01) — гипотеза про DI НЕ подтвердилась - -**Методика.** Симптом «нажатие не отработало» переведён в счётчики, чтобы не -спорить с глазами. Нажимается **Home** — тоже расширенная клавиша (тот же -`E0`-префикс), но игрой игнорируется, поэтому Кид стоит на месте и рельеф -комнаты на результат не влияет. Брейкпоинты с действием -`{ b@ADDR = b@ADDR + 1 ; g }` (счёт без остановки машины) в трёх точках: вход -клавиатурной ветки трамплина, чтение порта 0x18 внутри drain-цикла, запись -make-бита для кода `0x6C`. Скратч-байты — хвост `ovr_tile[]`. - -**Симптом воспроизведён скриптом:** при зажатом Shift 10 нажатий → до -декодера дошло 9 make-байт. Без Shift потерь нет — ровно как сообщил -пользователь. - -| Прогон | make дошло / нажато | overrun | -|--------|---------------------|---------| -| игра идёт, `kbd_raw_poll` ВКЛ | 9 / 10 | 3 | -| игра идёт, `kbd_raw_poll` ВЫКЛ (патч `ret` в точке входа) | 9 / 10 | 4 | -| игра ЗАМОРОЖЕНА клавишей «1» (блитов нет вообще, значит и длинных DI нет) | **8 / 10** | 6 | - -**Вывод 1: наши DI-окна ни при чём.** В замороженном кадре, где блитов нет -и прерывания разрешены практически всё время, потерь НЕ меньше, а больше. - -**Вывод 2: `kbd_raw_poll()` в той расстановке бесполезен** — 9/10 и с ним, и -без. Причина понятна задним числом: шесть вызовов стояли В ТЕХ ЖЕ точках, -где прерывания и так разрешены. Вызовы из `roomtest.c` убраны; сама функция -в libc оставлена — она корректна и нужна как заготовка под «плотный опрос». - -**Вывод 3 (главный): байт теряется НИЖЕ нашего кода.** Счётчик чтений порта -0x18: 5 нажатий Shift+Home должны дать ровно 50 байт. Насчитано **49** — и -ровно один make потерян. То есть до процессора байт не доехал вообще, -декодер тут ни при чём. - -**Вывод 4: прерывание на байт теряется примерно в 44 % случаев.** На тех же -49 прочитанных байтах — только **28 входов** в клавиатурную ветку трамплина -(1.75 байта за вход). Байты копятся в трёхбайтовом FIFO вплотную к потолку; -одна неудачная пауза — и байт потерян. - -### ПОТОЛОК ПЛОТНОГО ОПРОСА ИЗМЕРЕН — приём лечит полностью - -`tests/kbdpoll` — программа, которая не делает НИЧЕГО, кроме -`kbd_raw_poll()` в бесконечном цикле (ни графики, ни vsync, ни вывода: -любая работа разредила бы опрос и испортила замер). Это физический -максимум плотности. Тот же счётный метод, те же брейкпоинты-счётчики. - -| Прогон | нажатий | make дошло | байт прочитано / ожидалось | -|--------|---------|-----------|-----------------------------| -| контроль: Shift зажат 4 с, нажатий нет | 0 | 0 | 0 (Shift сам ничего не шлёт — автоповтора у модификатора нет) | -| Shift + Home | **25** | **25** | **250 / 250** | - -**Ни одного потерянного байта.** Для сравнения: в игре при шести вызовах -за кадр терялся 1 байт из 50. При такой частоте потерь вероятность -случайно получить ноль потерь на 250 байтах ≈ 0.6 %, так что результат не -совпадение. - -**Вывод: опрос — рабочее решение, вопрос только в ПЛОТНОСТИ.** Нужно -опрашивать примерно раз в 0.5 мс (≈10 000 тактов), а шесть вызовов за -60-мс кадр давали один раз в 10 мс — в двадцать раз реже необходимого. - -**Где взять частоту:** логический тик = 60 мс, из них ~18 мс занято -работой и **~42 мс процессор простаивает внутри `gfx_wait_vsync`**, опрашивая -луч. Опрос там стоит ноль и покрывает две трети периода с запасом. -Остаётся слепым только тело одного accel-блита под DI (до ~650 мкс) — -разорвать его нельзя (см. «что НЕ делать»). - -**Почему нужна именно такая частота** (вопрос «PS/2 же не даёт больше 30 -нажатий в секунду»). Частота опроса определяется НЕ темпом нажатий, а -темпом байт ВНУТРИ одного нажатия и глубиной FIFO. Клавиатура выдаёт байты -со скоростью провода: 11 бит на байт при ~10–16 кГц = ~0.7–1.1 мс на байт. -Воронка — 3 байта. Значит между двумя вычерпываниями имеют право прийти -максимум два байта, то есть вычерпывать надо не реже чем раз в ~1.5–2 мс -(0.5 мс взято с запасом). **Даже ОДНО нажатие в секунду переполнит FIFO**, -если в эти несколько миллисекунд его никто не разгребает. Замер это -подтверждает: 1.75 байта за одно вычерпывание — уже 58 % ёмкости. В норме -разгребает прерывание; опрос понадобился только потому, что ~44 % импульсов -здесь теряется. - -**Альтернатива, которая убирает опрос совсем — уменьшить трафик, а не -ускорять разгребание.** BIOS `$EA` (`FN_KBD_OUT`, `docs/new/09-input.md` -§9.2) шлёт байт НА клавиатуру, то есть ей можно скомандовать: -- **Scan Code Set 3** — нет ни «fake shift», ни `E0`-префиксов: make = 1 байт, - break = 2; -- либо хотя бы отключить typematic (`0xF5`/`0xF7`). - -**Но проверить это в MAME НЕЛЬЗЯ:** в `sprinter.cpp` подключено только -направление клавиатура→SIO (`m_kbd->out_data_cb() → rxa_w`); обратный путь -(SIO→клавиатура) не разведён вовсе, так что команда просто уйдёт в никуда. -Плюс пришлось бы переписать все наши константы кодов под Set 3. Значит это -кандидат на «когда дойдём до реального железа». - -**Что сделано по этому плану (2026-08-01):** -1. ✅ Idle-хук в libbgi: `gfx_set_idle_hook(fn)`, вызывается в цикле ожидания - луча внутри `gfx_wait_vsync`. Приложение ставит туда `kbd_raw_poll`. - Полезен не только нам — любой программе даёт «качать» что-то в ожидании - кадра. Осторожно с регистрами: цикл ждёт на BC-таймауте, вокруг вызова - нужен push/pop, а сам таймаут в итерациях станет длиннее по времени. - **Важно про цену: это НЕ новая нагрузка.** Опрос ставится ровно туда, - где процессор и так впустую крутит `in a,(#0xFE)` — 42 мс из 60. - **Ограничитель области, если «постоянный опрос» не нравится:** потери - случаются ТОЛЬКО при зажатом модификаторе (замерено), значит хук можно - взводить лишь пока нажат Shift/Ctrl/Alt. -2. ✅ Перемерено в roomtest тем же счётным методом: **35/35**, потерь нет. -3. ⏳ Вызовы в занятую треть кадра НЕ возвращены: одного idle-хука хватило. - Держать в уме, если на реальном железе или на более тяжёлых сценах - (несколько стражей) потери появятся снова — накрыть блиты дешевле, чем - изобретать что-то новое. -4. ⏳ Ручная проверка пользователем — «стало значительно лучше, иногда всё - ещё пропускает»; остаток отложен (см. врезку в начале записи). - -**Куда смотреть дальше, если плотного опроса не хватит.** -1. **Драйвер MAME — НЕ ТРОГАЕМ** (решение пользователя: пересборка MAME на - его машине занимает часы). Для протокола, подозрение осталось: - `sinclair/sprinter.cpp` держит запрос от клавиатуры ровно **32 такта - CPU**, и `m_irq_off_timer` — **один на два источника** (`irq_on()` экрана - заводит его же, `irq_off()` гасит разом обе линии). То есть кадровое - прерывание способно обрезать клавиатурный импульс — правдоподобное - объяснение «44 % пропущенных импульсов». -2. **Реальное железо.** Если п.1 — чисто эмуляционный артефакт, на железе - проблемы может не быть вовсе. Проверять при первом прогоне на живом - Sprinter. - -**Про совпадение кадрового и клавиатурного прерываний** (вопрос -пользователя, 2026-08-01). Документация Sprinter: оба приходят с вектором -`0FFh`, различать по биту приёма байта в порту клавиатуры — «не пришёл, -значит экран»; совпадение возможно, но «исключительно редкий случай» -(в новой версии обещают развести жёстче через ПЛМ). То есть наш трамплин -делает ровно предписанное. Известный побочный эффект: при совпадении мы -обслуживаем клавиатуру и `reti`, пропуская кадровую цепочку и DSS — на -потерю байт это не влияет (линия кадрового остаётся взведённой и вызывает -повторный вход), но кадровый тик может пропасть. Отдельная мелкая правка. - -**Что НЕ делать (проверено, стоило времени):** -- **Снимать `di` в accel-ядрах libbgi нельзя.** Патч `di`→`nop` в - `_bgi_blit_cols_raw`/`_bgi_heal_rows_raw`/`_bgi_blit_rows_raw` прямо в - памяти **уронил машину в перезагрузку**. То есть режим «акселератор - работает при EI» из `docs/new/06-accel.md §6.6` в этой прошивке/эмуляции - недоступен — вопрос закрыт артефактом, а не рассуждением. -- Дробить DI-окна по колонкам смысла тоже нет: см. вывод 1. - ---- - -### L5-SHADOW. Тень уровня 5: крадёт зелье — **СДЕЛАНА 2026-08-11** - -Единственная новая механика уровня 5 (тайлов новых нет вовсе, см. цель выше). -Тень появляется в комнате 24, дожидается, пока откроется дверь, идёт к зелью, -**выпивает его** и уходит за левый край. Боя нет. - -**Как это в оригинале** (всё сверено по коду, `custom->*` — это дефолты 1.0): - -| что | где | суть | -|---|---|---| -| появление | `check_shadow`, seg002:0064 | при СМЕНЕ КОМНАТЫ: если `current_level == 5` и `drawn_room == 24`, и тайл (кол 3, ряд 0) всё ещё `tiles_10_potion` — породить тень | -| порождение | `do_init_shad`, seg002:0000 | `memcpy(&Char, init_shad_5, 7)` + `seqtbl_offset_char(2 /*stand*/)`, `charid = charid_1_shadow`, `demo_time = 0`, `guard_skill = 3`, `guardhp_* = 4`, `saveshad()` | -| данные | `init_shad_5` | `{0x0F, 0x37, 0x37, 0, 0xFF, 0, 0}` = frame 15, x 55, y 55, direction 0, curr_col −1, curr_row 0, action 0 | -| поведение | `autocontrol_shadow_level5`, seg002:1157 | в комнате 24: пока `demo_time == 0` — ждать, пока дверь (кол 1, ряд 0) не откроется (`modif >= 80`), затем `demo_index = 0`; дальше каждый кадр `do_auto_moves(shad_drink_move)`; при `Char.x < 15` — `clear_char()` | -| движения | `do_auto_moves`, seg002:1089 | крошечный интерпретатор: `demo_time++`, по таблице `{time, move}` выбирается запись, `move` = 0 nothing / 1 forward / 2 backward / 3 up / 4 down / 5 up+forward / 6 shift / 7 move_7; −1 = ничего, −2 = конец | -| таблица | `shad_drink_move` (data.h:866) | `{0x00,0} {0x01,1} {0x0E,0} {0x12,6} {0x1D,7} {0x2D,2} {0x31,1} {0xFF,−2}` — 8 записей по 2 байта | - -**Что из этого у нас уже есть:** - -- **механизм «спецсобытие порождает персонажа в слоте соперника»** — - `pop_check_skel` (`guards.c`, зовётся из `roomtest.c` в тике); тень - уровня 5 садится на тот же шов, только условие другое; -- **тень как `charid_1_shadow`** — заведена под уровень 4 - ([L4-MIRROR](TASKS_CLOSED.md#l4-mirror)): своя ветка ИИ - (`autocontrol_shadow` + `autocontrol_shadow_level4`), выбор таблицы кадров - Кида (`pop_frame_tbl_is_guard`), отрисовка спрайтами Кида; -- **питьё зелья** — `SEQ_78_DRINK` и `get_item` в `pop_ctrl.c` (Кид уже - умеет); тень «нажимает» те же кнопки через автодвижения; -- **зелья как trob** — фаза пузырька, тип в старших битах (`pop_trob.c`). - -**Что писать:** - -1. `do_auto_moves` + таблица `shad_drink_move` + `demo_time`/`demo_index` — - интерпретатор ~30 строк, кладётся рядом с `autocontrol_shadow` в - `guards.c` (банк 1). «Движения» — это те же переменные управления, что - заполняет `read_user_control` (`pop_ctrl.c`), так что `move_*` сводятся к - присваиваниям. -2. `do_init_shad(init_shad_5, seq stand)` — общий порождатель тени; пригодится - и на уровнях 6 и 12 (`init_shad_6`, `init_shad_12` — те же 7 байт). -3. Ветка `check_shadow` для уровня 5 — по образцу `pop_check_skel`, вызов из - того же места тика. -4. `autocontrol_shadow_level5`. -5. **Ветка ТЕНИ в `check_guard_fallout`** (seg002:0241): тень падает, только - если она в свободном полёте (`action == 4`), и тогда - `loadshad(); clear_char(); saveshad()`. Сейчас в `pop_guard_fallout` - (`pop_guard.c`) есть ветки стража и скелета, а тени нет — комментарий там - обещает её «вместе с L3-SKEL», но она относится именно к тени. - -**Чем подтверждать:** smoke уровня 5 — дойти до комнаты 24, увидеть, как -тень выходит после открытия двери, выпивает зелье (тайл зелья исчезает) и -уходит влево. Сверять последовательность движений с живым SDLPoP на том же -месте — таблица `shad_drink_move` короткая, расхождение будет видно сразу. - -**Оговорка по виду:** тень пока рисуется обычной копией спрайтов Кида, то -есть выглядит вторым Кидом — это [отложенный](../docs/shadow_render.md) -вопрос, к механике уровня 5 отношения не имеет. - ---- - -### GUARD-PHYS. Страж живёт по тем же правилам, что Кид — **ЗАКРЫТА 2026-08-11** - -> **Что уже работает** (решение пользователя: переносим физику на `Char`, -> без предварительных замеров — иначе третий-четвёртый экземпляр той же -> логики неизбежен). -> -> - **физика переведена на `Char`**: `pop_map.c` целиком работает с активным -> персонажем, а кто в `Char` — решают окна `loadkid`/`savekid` и -> `loadshad`/`saveshad`, как в оригинале (seg006:809). Два входа: -> `pop_phys_tick` (порт хвоста play_kid_frame) и `pop_guard_phys_tick` -> (порт play_guard_frame) — списки вызовов отличаются ровно тем, чем в -> оригинале; -> - **`take_hp` стал общим** (`pop_take_hp` в резиденте `pop_guard.c`): урон -> идёт тому, кто в `Char`, по `charid`. Раньше у боёвки и у физики были -> свои копии, причём у физики неверная — правила `hitp_curr` мимо дельты и -> про не-Кидов не знала; -> - **порт веток по charid в `land()`** (seg005:173): страж гибнет с двух -> рядов, тень падает как с одного, у не-Кида приземление даёт боевую -> стойку; `check_guard_bumped` (seg004:0522), `droppedout` + -> `guard_follows_kid_down` (seg002:09F8), `check_guard_fallout` -> (seg002:0241); -> - **`pop_savekid_state` снова полное `Kid = Char`**, а -> `pop_load_fram_det_col` пересчитывает колонку ЛЮБОМУ персонажу — обе -> заплатки существовали только потому, что физика знала один `Kid`. -> -> **Проверено:** `tests-host` — трассы Кида не изменились (`[phys] ok: 1723`, -> тот же эталон), новый набор `t_char` (32 проверки) покрывает ветки по -> персонажам; в MAME проверено, что игра жива (респавн, бег, падение, -> приземление). Цена: `_CODE` +80 Б, банк 3 (`pop_map`) 7973 → 8485 -> (51.8 %), банк 1 (`guards`) 2042 → 2156. -> -> **Проверено пользователем 2026-08-07:** страж СПРЫГИВАЕТ ЗА КИДОМ на ряд -> ниже — связка «ИИ + физика» работает вживую, не только в тестах. -> -> **`follow_guard` портирован и проверен в MAME (2026-08-07):** уровень 1, -> бой в комнате 3, Кид отступает влево — страж приходит следом (`Guard.room` -> 3 → 2, X перенесён через шов), ровно как в SDLPoP. Условия отбора -> покрыты тестами `t_char` (7 сценариев: пороги 91/165, «не бой», мёртвый, -> вверх/вниз, занятая соседняя комната). **Сцена вскрыла отдельный баг — -> [BUG-SWORD-GHOST-1](BUGS_CLOSED.md#bug-sword-ghost-1): при переходе в бою Кид -> прячет меч и дальше дерётся пустой рукой.** -> -> **Осталось (потому и запись открыта) — ревизия 2026-08-11 по коду:** -> 1. ~~`check_chomped_guard`~~ — **сделан** вместе с -> [L3-CHOMP](TASKS_CLOSED.md#l3-chomp) (`pop_map.c`); -> 2. ветки `check_guard_fallout`: **скелет сделан** (возрождается в комнате 3, -> `pop_guard_fallout` в `pop_guard.c`), **ветки ТЕНИ нет** — падает только -> в свободном полёте, `loadshad/clear_char/saveshad`; идёт в -> [L5-SHADOW](#l5-shadow) п. 5 (комментарий в коде обещает её «вместе с -> L3-SKEL» — устарел, это про тень); -> 3. страж, нажимающий напольную кнопку, вживую не проверялся (код — -> общий `check_press`). - -**Почему это была ОДНА физика, а не «сделаем стражу свою».** В оригинале -слот `Guard` — не «стражи», а все НЕ-Киды: тем же `play_guard_frame` ходят -**страж** (charid 2), **скелет** (4, ур. 3), **тень** (1, ур. 4/5/6/12), -**визирь-Джаффар** (ур. 13), **толстяк** (FAT, ур. 12) и **мышь** (0x18, -ур. 8) — `tbl_guard_type` = {0,0,0,2,0,0,1,0,0,0,0,0,4,3,−1,−1}, а -`autocontrol_opponent` (seg002:628) разводит их ТОЛЬКО по ИИ. То есть -второй экземпляр логики пришлось бы делать не один раз, а пять. - -**Гард по X: страж не уходит САМ — но его МОГУТ ПЕРЕНЕСТИ.** Поправка к -формулировке, которая была здесь раньше («страж не покидает комнату ни в -каком виде») — она неверна, контрпример дал пользователь: в SDLPoP страж из -комнаты 3 оказывается в комнате 2 вслед за отступающим Кидом. - -Разделять надо два разных механизма: - -- **своим ходом — не может.** Физика персонажа слота Guard обёрнута - `Char.room == drawn_room` и `Char.x >= 44 && Char.x < 211` (seg000:1252), - и никакого `check_leave` в его списке вызовов нет. Провалившегося ниже - комнаты убирает `check_guard_fallout` (seg002:0241) — вниз он не уходит. -- **следом за Кидом — переносит движок.** `exit_room` (seg002:03C7) - вызывается ПОСЛЕ того, как комнату сменил Кид, и решает судьбу стража: - - ```c - if (Guard.alive < 0 && Guard.sword == sword_2_drawn) { // жив и В БОЮ - if (guards_tile[kid_room−1] >= 30 || // в новой комнате - guards_seq_hi[kid_room−1] != 0) { // своего живого нет - if (ушёл ВЛЕВО) { if (Guard.x >= 91) leave = 1; } // страж далеко — остаётся - else if (ВПРАВО) { if (Guard.x < 165) leave = 1; } - else if (ВВЕРХ) { if (Guard.curr_row >= 0) leave = 1; } // всегда → не идёт - else { if (Guard.curr_row < 3) leave = 1; } // вниз → не идёт - } else leave = 1; - } else leave = 1; - leave ? leave_guard() : follow_guard(); - ``` - - `follow_guard` (seg002:039E) стирает `guards_tile` в ОБЕИХ комнатах - (0xFF — «стража здесь нет», чтобы он не раздвоился) и гонит стража через - `goto_other_room` в окне `loadshad`/`saveshad`. - -**Что это значит для нас.** У нас в `enter_room` (`roomtest.c:265`) стоит -безусловный `pop_guard_leave()` — то есть всегда ветка `leave_guard`, и -страж ВСЕГДА остаётся. Портировать надо сам `exit_room`-выбор: условия -«жив + меч вынут + в целевой комнате нет своего стража + он у нужного -края» и `follow_guard`. Пороги 91/165 — это «страж у того края, в который -ушёл Кид»; вверх и вниз оригинал не пускает никогда. - -**Чем подтверждать:** уровень 1, комната 3 — начать бой, отступить влево в -комнату 2: страж обязан прийти следом и продолжить бой (как в SDLPoP на -скриншотах пользователя). Обратная проверка: если в соседней комнате СВОЙ -живой страж — переход не происходит. - ---- - -### L6-SHADOW. Тень уровня 6 роняет решётку — СДЕЛАНА 2026-08-11 - -**Сцена (уровень 6, комната 1).** Кид жмёт `opener` (1,7) — решётка (1,2) -поднимается; он разбегается, прыгает через четырёхтайловую пропасть и -цепляется за порожек решётки, чтобы подтянуться. В этот момент тень делает -ОДИН осторожный шаг с границы (1,0)-(1,1) на `closer` (1,1), и решётка -падает. Обе плиты комнаты ведут на один тайл 12 (проверено по LINKLOC). - -**Порт.** Две точки, обе в `seg002.c`: - -- `check_shadow` (seg002:0090): условий на содержимое комнаты нет — тень - встаёт при КАЖДОМ входе в комнату 1. `do_init_shad` переписан под - таблицы (`init_shad_5`/`init_shad_6` — первые 7 полей `Char`, как - `memcpy(&Char, source, 7)` у оригинала); -- `autocontrol_shadow_level6` (seg002:1064): `Kid.frame == 43` (кадр - бег-прыжка) и `Kid.x < 128` -> `move_6_shift()` + `move_1_forward()`. - Это Shift+вперёд, то есть ОСТОРОЖНЫЙ ШАГ, а не прыжок; кадр 43 — - условие на КИДА, тень им только триггерится. - -**Звук** `sound_25_presentation` не портирован (звука нет вовсе); флаг -оригинала `leveldoor_open = 0x4D` не воспроизводим — чужую переменную -занимать незачем. - -**Проверено в MAME (пользователь, 2026-08-11):** «Кид прыгнул, зацепился, -Тень сделал шаг, решётка упала». Тем самым закрыт и остаток -[GUARD-PHYS](TASKS_CLOSED.md#guard-phys): нажатие плиты НЕ-Кидом работает -(`check_press` в `guard_phys`, без гейта по `charid`). - -**Фон комнаты сверен с оригиналом** методом из -[`BUGS_CLOSED.md`](BUGS_CLOSED.md#bug-lattice-doortop): 539 пикселей -расхождения, и все — силуэты персонажей (тень пока рисуется палитрой Кида, -см. [`../docs/shadow_render.md`](../docs/shadow_render.md)). - -**Цена:** банк 1 2755 -> 2877 Б, резидент без изменений. - ---- - -### Переход 6 -> 7 падением — СДЕЛАН 2026-08-11 - -Уровень 6 не заканчивается дверью: Кид проваливается вниз из комнаты 1 и -этим попадает на 7-й. Порт двух половин: - -- **выход** — `leave_room` (seg002:0504) для направления «вниз» на уровне 6 - из комнаты 1 возвращает особый результат −2, а главный цикл (seg000:0893) - разбирает его как `Kid.y = -1; ++next_level`. У нас это ветка в обработке - `pop_fell_out` (`roomtest.c`), и она ОБЯЗАНА идти раньше связи вниз: у - комнаты 1 сосед снизу есть (шахта, комната 3), и без спецсобытия Кид - улетал туда, а оттуда — в рестарт уровня; -- **вход** — `set_start_pos` (seg003:0196): на 7-м уровне Кид ставится в - комнату 17, после чего экран сразу переводится на комнату ПОД ней - (`goto_other_room(3)`: y −= 189, ряд пересчитать) — он влетает сверху. - -Константы `FALLING_EXIT_LEVEL/ROOM`, `FALLING_ENTRY_LEVEL/ROOM` — в -`pop_guard.h`. - -**Проверено пользователем в MAME:** «переход на уровень 7 сработал». - -**Остаток на следующую сессию:** влетая в комнату, Кид должен уметь -зацепиться за край пола, мимо которого пролетает — этой механики у нас, -похоже, нет (см. `NEXT_SESSION.md`, п. 1). - ---- - - -## HOF-ENTRY. Таблица рекордов — **СДЕЛАНО И ПРОВЕРЕНО В MAME 2026-08-26** - -Порт двух показов оригинала. `pop_hof.c` был написан раньше, но никуда не -вызывался: после финала автомат уходил мимо него в title, а на титрах экран -получался ЧЁРНЫМ. - -**Где это в оригинале.** `show_title()` (seg000:2060) показывает -сохранённую таблицу между credits и attract-demo — 240 тиков, переходом -слева направо, без fade. `end_sequence()` (seg001:5F1) после HAIL проявляет -титульную картинку (240 тиков), при подходящем результате гасит её, показывает -таблицу с золотой полосой ввода, принимает имя, ждёт 120 тиков, снова -проявляет титульную картинку и лишь потом дослушивает победную тему -(`while (check_sound_playing() && !key_test_quit())`, seg001:637). - -**Два корня, из-за которых экран был пуст.** - -1. `story.pal` — 256 записей, и запись 0x3F (цвет глифов шрифта, - `POP_FONT_COLOR`) в ней ЧЁРНАЯ. Текст рисовался, но был не виден. - Теперь генератор кладёт в 0x3F золотой 0xB7 оригинала. -2. Полосовой переход копирует страницу АКСЕЛЕРАТОРОМ, а тот читает ОЗУ-копию - (`gfx_copy_page`: «копируется чистый фон без спрайтов»). `GFX_BANK_SPRITE` - — это NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах - переезжал один фон без строк. Лечится банком `GFX_BANK_TRANSPARENT` - (0x58): та же прозрачность 0xFF, но с записью в копию — страница - собирается ЦЕЛИКОМ до показа, как offscreen оригинала. - -**Что появилось попутно.** - -- `s5` в архиве PV — фон таблицы: рамка story + логотип PRINCE OF PERSIA на - y=24 (`HOF_POP` оригинала — тот же спрайт res54, что и в титрах). -- Отдельный индекс палитры под фон текстовой рамки (`POP_PAL_STORY_BG`, 16). - `load_title_images(bgcolor)` красит его в #100060 на титрах и в #800000 в - финале; раньше фон был ремаплен в индекс 9, а тот занят самой титульной - картинкой (8265 пикселей), и подменить его было нельзя. -- Второй набор глифов в `font.atl` цветом `POP_FONT_DARK_COLOR` (0x3E). - У SDLPoP шрифт — маска, и `show_hof_text` рисует текст дважды разным - цветом; у нас цвет запечён в пиксели, поэтому «другой цвет» = другой набор. - Каталог SPA1 держит счётчик картинок в одном байте, поэтому тёмный набор - обрезан по '_' (32..95): 190 + 64 = 254 из 255 возможных. -- Общий `pop_screen_present_ltr()` в `pop_ui.c` — им теперь пользуются и - story-переход интро, и таблица, и титульная картинка финала - ([CUTSCENE-LTR](BUGS_CLOSED.md#cutscene-ltr)). - -**Формат `POP.HOF`** — 6 записей (как `MAX_HOF_COUNT`), имя до 15 символов, -XOR+инверсия в хвосте; версия 2. Проверено на образе: после ввода имени файл -128 Б, `PHOF`, запись читается обратно и показывается на титрах. - -**Что проверено в MAME** (сборка `LEVEL=14`, вход в комнату 5 читом обхода -комнат): цепочка HAIL → титульная картинка → таблица с полосой ввода и -временем справа → ввод имени → титульная картинка; на следующем запуске -таблица показывается между credits и demo. diff --git a/applications/PoP/roomtest/TASKS_OPEN.md b/applications/PoP/roomtest/TASKS_OPEN.md deleted file mode 100644 index 76f4304..0000000 --- a/applications/PoP/roomtest/TASKS_OPEN.md +++ /dev/null @@ -1,1511 +0,0 @@ -# roomtest — доска ОТКРЫТЫХ задач (обновлено 2026-08-11) - -Что берём в работу сейчас и в каком порядке. Каждая запись: что сделать, -почему именно сейчас, чем подтверждать результат. - -- закрытые задачи с протоколами и замерами — [`TASKS_CLOSED.md`](TASKS_CLOSED.md); -- открытые баги — [`BUGS_OPEN.md`](BUGS_OPEN.md), закрытые с разбором корней — - [`BUGS_CLOSED.md`](BUGS_CLOSED.md); -- планы фаз — `../docs/PORT_PLAN.md`, `../docs/layout_plan_v2.md`, - `../docs/levels_plan.md`. - -**Состояние на 2026-08-11 (сверено с кодом, не только с доской):** - -- **уровни 1-4 приняты smoke-тестами** (пользователь). Полные обходы всех - комнат делаются по готовности ВСЕХ уровней — политика приёмок в - [`TASKS_CLOSED.md`](TASKS_CLOSED.md#pass-policy); отдельных задач - `L3-PASS`/`L4-PASS` больше нет. Уже сделанные полные обходы уровней 1 и 2 - остаются регресс-базой; -- **[L4-MIRROR](TASKS_CLOSED.md#l4-mirror) закрыта**: зеркало, отражение, - прыжок сквозь него и рождение тени проверены в MAME. Хвосты — вид тени - (отложен, [`../docs/shadow_render.md`](../docs/shadow_render.md)) и - [MIRROR-FG-STALE](BUGS_CLOSED.md#mirror-fg-stale) (закрыт как не баг); -- **[L3-CHOMP](TASKS_CLOSED.md#l3-chomp) и [L3-SKEL](TASKS_CLOSED.md#l3-skel) - закрыты** (2026-08-08 / 2026-08-07); -- **тайлсет palace сделан** — `pop_bg_load(type)`, `pal_*.atl`, дворцовая - кладка `wall_pattern`, решётчатые тайлы 25-29 и в `tile_table`, и в - коллизии (`tile_is_floor` совпадает с seg006:0628). То есть шаг 2 - `levels_plan.md` закрыт; -- **libbgi:** блочные AND/OR/XOR/NOT акселератора (2026-08-11, `tests/accop`) - — задел под вид тени и под любые эффекты «поверх того, что уже нарисовано». - -**Обход уровней после оптимизации фаз — идёт сейчас (начат 2026-08-17).** -Оптимизация зелёной/циан фаз тронула порядок пометок и перерисовок, поэтому -уровни проходятся заново подряд: - -| уровень | статус | что нашлось и закрыто по дороге | -|---|---|---| -| 1 | **принят** (2026-08-17) | мерцание торцов плит/полов/кнопок (запечка шире копируемого прямоугольника); потолочный fore поверх падающей плиты (не было ряда −1 в проходе foretable); соседний пол под плитой (потерянная половина `draw_mob` — `set_redraw2`); залипший блеск меча (`trob_drawn` не совпадал с тем, что нарисует полная отрисовка) | -| 2 | **принят** (2026-08-17) | чёрные бары поверх стража — `bar` с `x + w > 320` заворачивался в соседнюю страницу видеопамяти (`dd40c24`); [BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1) — боевая стойка без меча под читом бессмертия | -| 3 | **принят** (2026-08-17) | критичных багов не найдено — правок не потребовалось | -| 4 | **предварительно пройден** (2026-08-17) | [LEVELDOOR-PALACE-CLIP](BUGS_CLOSED.md#leveldoor-palace-clip) — во дворце проём двери уровня на 8 px шире, и контур Кида в анимации ухода обрезался раньше времени (`89b603a`) | -| 5 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 6 | **предварительно пройден** (2026-08-18) | [SHADOW-STALE-FRAME](BUGS_CLOSED.md#shadow-stale-frame) — тень залипала на страницах дабл-буфера в РАЗНЫХ позах (кадр брался из кэша, снимок писался по `Guard.frame`, `085a198`); [BLUELINE-NOBLUE](BUGS_CLOSED.md#blueline-noblue) — кусок синего узора на стене: модификатор стены не переводился при загрузке (`af4e644`) | -| 7 | **предварительно пройден** (2026-08-18) | [SPIKE-BAKED](BUGS_CLOSED.md#spike-baked) — выдвинутые пики консервировались в фон запечкой соседней кнопки и оставались навсегда (`980d48c`); [DIED-ON-BUTTON](BUGS_CLOSED.md#died-on-button) — смерть на кнопке не ломала её насовсем: до `check_press` труп не доходил, самой `died_on_button` не было, а таймер связи переживал респавн (`6feab5d`) | -| 8 | **предварительно пройден** (2026-08-18) | [GUARD-RESPAWN-COL0](BUGS_CLOSED.md#guard-respawn-col0) — при возврате в комнату страж телепортировался в колонку 0 и падал насмерть: колонку несёт `guards_x`, а не тайл (`c40ae3f`); [SEAM-FIGHT-FLICKER](BUGS_CLOSED.md#seam-fight-flicker) — бой у шва перерисовывал комнату туда-обратно: `leave_room` запрещает уход ещё и на кадрах меча (`a498255`, сверено с SDLPoP покадрово) | -| 9 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 10 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 11 | **предварительно пройден** (2026-08-18) | [MOB-NEIGHBOUR-ROOM](BUGS_CLOSED.md#mob-neighbour-room) — плиты нижнего ряда пропадали без кадров падения (кусок в соседней комнате не рисовался, `ed5615a`); порядок куска относительно соседней плиты и Кида — порт корзины 30 (`4db60c7`) | -| 12 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 13+ | не начат | | - -«Предварительно пройден» ≠ «принят»: уровни 4-6 пройдены прогоном по -сценарию, а не обходом ВСЕХ комнат — полные обходы делаются по готовности -всех уровней ([политика приёмок](TASKS_CLOSED.md#pass-policy)). -Регресс-базой остаются полные обходы уровней 1 и 2. - -Критичных багов на уровнях 1-6 не осталось. Следом — регресс тактов на -23/13 (документы фаз: [`../docs/perf_green_phase.md`](../docs/perf_green_phase.md), -[`../docs/perf_cyan_phase.md`](../docs/perf_cyan_phase.md), сцена и метод — -[`../docs/perf_l13_room23.md`](../docs/perf_l13_room23.md)). - -Правило проекта в силе: механику сверять с `../SDLPoP/src/` ДО кодинга; -диагноз платформы подтверждать артефактом (брейкпоинт/дамп/.asm), а не -гипотезой (memory `defer_unexplained_quirks`). - ---- - -## ТЕКУЩАЯ ЦЕЛЬ: уровень 8 - -Уровни 1-7 играются (smoke; зелья уровней 2 и 7 приняты пользователем -2026-08-12). Уровень 8 **новых тайлов не приносит вовсе** (инвентарь -`res2008.bin` целиком покрыт уровнями 1-7), тайлсет — подземелье. -Спецсобытие уровня — мышь, [L8-MOUSE](TASKS_CLOSED.md#l8-mouse) закрыта -2026-08-12 (хост-набор `t_mouse` + живая проверка в MAME). - -Остаётся smoke-прогон самого уровня: он длинный и с возвратом через два -чомпера комнаты 4, а стражи там сильнее прежних (комната 5 — skill **7**, -это максимум из встречавшихся; 12/22/24 — skill 2/3/3). - - -### L9-INVERT. Зелье ПЕРЕВОРОТА — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Подробный план реализации — [`../docs/l9_invert_plan.md`](../docs/l9_invert_plan.md)** -> (задачи libbgi, задачи приложения, порядок работ, риски, открытые вопросы). -> Ниже — механика и обоснование решений; план исполняется по документу. - -Единственное новое на уровнях 9-11: зелья типа 4 на `(1,7)` комнаты 7 и -`(0,4)` комнаты 10 (сверено по `res2009.bin`). Уровни 10 и 11 не приносят ни -тайлов, ни спецсобытий — только дворцовый тайлсет (есть) и стражи skill 3-4. - -Механика оригинала (seg000:15E9 `toggle_upside`, seg006:1886): -`upside_down = ~upside_down`, снимается смертью Кида (seg000:1224, при -`alive >= 0`) и стартом уровня (seg003:38/188); второе зелье переворачивает -обратно. Управление НЕ инвертируется. Переворот у оригинала — чисто вывод: -`flip_screen(offscreen)` перед копированием прямоугольников на экран и обратно -после (seg000:939/946); полоса HP рисуется прямо на экран (y = 194) и НЕ -переворачивается. - -**Приём оригинала — переворачивать буфер на выводе КАЖДЫЙ кадр — нам не -подходит:** страниц ровно две (`gfx_set_visible_page` → ESTEX $54 SELPAGE, -бит 0), рабочей третьей нет, а переворот в видимую страницу порвёт картинку -(проход не влезает в vblank). Значит переворачиваем ОДИН РАЗ в момент смены -флага, а дальше рисуем зеркально: -`y' = POP_YOFF + POP_PLAYFIELD_H - (y - POP_YOFF) - h` плюс вертикальное -зеркало самого спрайта. - -#### Момент переключения — accel-копия экрана (ОСНОВНОЙ ВАРИАНТ) - -Решение пользователя 2026-08-12. Уже нарисованное переворачиваем не -перерисовкой комнаты, а построчной копией акселератора: - -1. **проход A → B с реверсом Y**: строка `y` читается, пишется в `191-y` - (смена Port_Y между burst-чтением и burst-записью). 320 байт в один burst - не лезут — две скобки на строку; -2. **проход B → A без реверса**: вторая страница дабл-буфера получает то же - изображение. - -Почему это работает на нашем железе, а не только на бумаге: **accel читает -ОЗУ-КОПИЮ, а не VRAM** (memory `accel_block_ops`), то есть копируется ЧИСТЫЙ -фон без персонажей, а запись банком `GFX_BANK_NORMAL` идёт и в видео, и в -ОЗУ-копию приёмника. После двух проходов обе страницы имеют перевёрнутый фон -в обеих плоскостях — **heal не меняется ни на строку**, он и дальше -восстанавливает правильный фон по фактическим координатам отрисовки. - -Бюджет: 192 строки × 2 burst'а × 2 прохода = 768 burst-строк. По нашим -замерам строка-burst стоит ~300-530Т (`gfx_heal_noclip` 22×22 = 11 658Т → -530Т/строку; у заливки линия 51-53Т, но там нет данных) — итого -**230-410 К тактов, то есть 0.2-0.3 логического кадра** (логический = 3 -растровых ≈ 1.29 млн). Перерисовка комнаты в обе страницы стоила бы под -миллион тактов И требовала бы vflip-версии тайлового блита — здесь она не -нужна вовсе. - -Что дописать в libbgi: `_bgi_copy_rows_raw` умеет только ИНКРЕМЕНТ Port_Y на -строку (`y0` + шаг вперёд, страйды патчатся SMC) — нужен вариант с -декрементом одной стороны (параметр «шаг Y» либо отдельное ядро -`_bgi_flip_rows_raw`). Перед реализацией подтвердить ДАМПОМ, что обе -страницы одновременно адресуемы в W3: `gfx.h` говорит, что страница 1 -начинается на 320 байт дальше (0xC140), но это комментарий, а не проверка -(memory `defer_unexplained_quirks`). - -Зеркало по вертикали стоит по-разному в зависимости от раскладки спрайта: - -- **row-major** (весь слой фона: тайлы, кладка, факелы, зелья, обломки, - двери) — бесплатно: внешний цикл идёт по строкам источника снизу вверх, сама - строка копируется вперёд. В libbgi такого варианта СЕЙЧАС НЕТ (флип есть - только у `gfx_blit_cols*`, и он горизонтальный) — нужна пара - `gfx_blit*_vflip`; -- **column-major** (Кид, стражи, мышь, меч — 34 атласа, 228 563 Б) — реверс - ВНУТРИ колонки, а accel копирует блок только вперёд. Нужны перевёрнутые - копии в отдельных EMM-страницах (реверс через стек `pop`/`push`, ~10 тактов - на байт). - -**Когда делать копии — решать при реализации,** варианты в порядке -предпочтения: - -1. **ленивый постраничный кэш**: страница атласа (8 кадров, 3-10 КБ) - переворачивается при первом обращении в перевёрнутом режиме — ~0.2-0.4 - растрового кадра на страницу, размазано по времени; реально нужны 5-10 - страниц из 34, и если зелье не выпито, не тратится ничего; -2. на входе в уровень, где в данных есть зелье типа 4 (скан `bg` уровня) — - вся пачка разом, ~5-6 млн тактов ≈ 0.3 с, пауза прячется в загрузку; -3. офлайн в `pop_pack_kid.py`/`pop_pack_guard.py` — рантайм ноль, но +228 КБ - на диске и +34 страницы всегда, а на дискете это заметная загрузка. - -Не забыть при реализации: зеркалить надо и heal-прямоугольники, и футпринт -fore-слоя, и клип (`clip_char`), и брызги; полоса HP и лейбл комнаты остаются -как есть (они вне поля 192). - - -### UI-SPRITES. Деления HP — из атласов персонажей в константы резидента - -`pop_kid_img_blit` (**334 Б в W1/W2**) существует ради двух картинок 6×5: -полосе HP нужен блит по image id из кидовских атласов, а те column-major, и -обычным `gfx_blit_noclip` их не нарисовать. Деления Кида (images 216/217, -`kid27.atl`) и стража (idx 0 в `g0.atl`) — по 30 байт каждое. - -**Решение пользователя 2026-08-12: положить их const-массивами в РЕЗИДЕНТ** -(~68 Б данных), а не подселять в фоновый атлас: резидент всегда ниже -0xC000, значит `gfx_blit*` их видит (буфер обязан быть вне W3), EMM-страница -не тратится, упаковщики не трогаются. Чистая экономия ~266 Б. - -Побочный плюс для [L9-INVERT](#l9-invert): страницы `kid27` и `g0` сейчас -смешанные — деления HP (борт, не переворачиваются) лежат рядом с брызгами -крови 28×26 (поле, переворачиваются). После переноса обе страницы -становятся чисто «полевыми», и постраничный кэш перевёрнутых кадров получается -однородным, без спрайтов-исключений. - - -### MEM-COLD2. Второй шаг разгрузки резидента - -> **Пункт 2 сделан 2026-08-12**: `guard_over_kid` с хелперами -> (`objtile_at_char` / `char_x_left_of` / `tile_div_mod`) уехал в банк 8 — -> куча 1005 → **1574 Б**. Зовётся раз в кадр, то есть цена — один трамплин. -> Остались пункты 1 (`enter_room_side`) и 3 (блок редроя шва). - -После [MEM-COLD1](TASKS_CLOSED.md#mem-cold1) куча 1707 Б. Когда упрётся -снова, в банк 8 переезжают следующие кандидаты (в порядке выгоды): - -1. `enter_room_side` — самая большая функция `roomtest.c`, зовётся раз на - комнату. Требует вынести наружу рабочие массивы комнаты - (`room_bg`/`lcol_*`/`rcol_*`/`below_fg`/`above_*`) — сами данные останутся - в `_DATA`, уедет только код; -2. `guard_over_kid` + `objtile_at_char`/`char_x_left_of`/`tile_div_mod` — - зовётся КАЖДЫЙ кадр, но ровно один раз: цена выноса — один трамплин; -3. блок редроя левого шва в `main` (`seam_row_sig` + разбор сигнатуры). - -Если и этого не хватит — следующим уходит сам кадровый порядок отрисовки, -но тогда уже стоит мерить, а не выносить наугад. - ---- - -## ПРЕДЫДУЩАЯ ЦЕЛЬ: уровень 5 - -Уровни 1-4 играются (smoke). Дальше идём по порядку уровней; уровень 5 — -следующий. - -**Хорошая новость по ассетам: уровень 5 не приносит НИ ОДНОГО нового тайла.** -Инвентарь, снятый перебором `res2005.bin` (fg & 0x1F): - -``` -ур. 5: empty, floor, spike, pillar, gate, closer, doortop_with_floor(7), - bigpillar_bottom(8), bigpillar_top(9), potion, loose, doortop(12), - debris, opener, level_door L/R, chomper(18), torch, wall, - lattice_pillar(25)…lattice_right(29) -``` - -— всё это уже встречалось на уровнях 1-4 и портировано. Единственное новое -на уровне 5 — **спецсобытие «тень крадёт зелье»**. - -| # | Задача | Что | Блокирует | -|---|--------|-----|-----------| -| — | [DRAW-COST](#draw-cost) | **кадр уложился в бюджет 2026-08-09**: 470 964 -> 425 600 тактов, период цикла 4 растровых кадра -> **3**. Дальнейшее — запас, не срочность | плавность на ВСЕХ уровнях | -| ✔ | [L1-SPEED](#l1-speed) | **закрыта 2026-08-19** режимами скорости (NORMAL = 4/5 растров, как оригинал) | — | -| — | [TUNE-1](#tune-1) | параметры движка → cfg-файл (сейчас `pop_tune.h`) | отладка таймингов и моды; берётся по мере надобности | -| — | [TUNE-2](#tune-2) | параметры СТРАЖЕЙ (6 таблиц по 12 градаций мастерства + HP) → cfg-файл | подбор сложности боя без пересборки | -| — | [SND](#snd) | звук: эффекты через CBL, музыка на AY | разбор готов — `../docs/sound_plan.md` | -| — | [MEM](#mem-next) | следующий шаг разгрузки W1/W2 | берётся по факту нехватки места | - -Сделанное — в [`TASKS_CLOSED.md`](TASKS_CLOSED.md): L4-MIRROR, L3-CHOMP, -L3-SKEL, L3-CHKP, L2 (машинерия уровней), L2-PASS, L1-PASS, DRAW-CHAR, -MEM-BANK2, MEM-BANK5, CLIP-1, KBD-1, DBG-CHEATS. - ---- - -## Ждёт ФИНАЛЬНОЙ приёмки (полные обходы по готовности всех уровней) - -Сюда попадает то, что уже работает в проверочном прогоне, но должно быть -подтверждено на сквозных прогонах уровней — потому что задевает механику -шире, чем собственный сценарий. - -- **Зацеп ПРЯМО В ПРЫЖКЕ** (`POP_ENABLE_JUMP_GRAB`, `pop_tune.h`, сделан - 2026-08-06, предварительно проверен пользователем). Почему нужен именно - финальный прогон: точки вызова стоят не только в `check_action`, но и в - ОБЕИХ ветках `check_bumped` — то есть код вклинивается перед обычным - ударом о стену. Регрессия проявится не в самом зацепе, а рядом: удар о - стену с зажатым Shift, осторожный шаг у стены, отскок в прыжке. На - уровнях 1–3 это надо специально потрогать в паре мест каждого уровня. - Напоминание: в ВАНИЛИ этого зацепа нет (у SDLPoP — `enable_jump_grab`), - так что сверять его с оригиналом «как есть» нельзя — только с SDLPoP при - включённых enhancements. - Прогон 2026-08-07 (уровни 1 и 2) регрессий рядом не показал, но специально - на удар о стену с Shift не проверялся. - -## P0 — делаем сейчас - -### CHAR-PARTIAL-REDRAW. Неподвижный персонаж перерисовывается зря: метка «фон трогали» слишком груба — ОБЯЗАТЕЛЬНО - -**Постановка (пользователь, 2026-08-19).** Проверять, нужна ли отрисовка -стража, когда он НЕ ДВИГАЕТСЯ. Если движется — лишние ~150 000 тактов -приемлемы: в оригинале во время боя число физических кадров на логический -тоже растёт на единицу. - -**Измерено** (сцена 11/15, чтение `pop_cd` из памяти машины): - -| объект | x | y | -|---|---|---| -| страж, спрайт | 257..284 | 18..56 | -| страж, клинок (накладной) | 241..261 | 31..37 | -| пламя факела (колонка 6 → рисуется в ячейке 7) | 232..247 | 5..22 | - -**Физического перекрытия НЕТ.** По x клинок и пламя пересекаются -(241..247), но по y расходятся: пламя кончается на 22, клинок начинается с -31 — девять пикселей чистого зазора. Пользователь увидел это на экране -раньше, чем я в числах: «страж полностью правее пламени, только меч может -пересекаться». - -**Почему тогда он перерисовывается.** Метка «фон трогали» (`pop_cd_touch` -в `pop_tile.c`) хранится как битовая маска КОЛОНОК по 32 px, отдельно на -каждый из ТРЁХ рядов по 63 px (`cd_row_of`). Пламя и клинок попадают в -один ряд 0 и в одну колонку 7 — и `cd_quiet` считает слот задетым. -Расплата: **148 302 такта, 23 % работы кадра** (85 524 спрайт с клинком и -снимком + 62 778 fore-проход) за перекрытие, которого нет. - -**Решение — поднять вертикальную точность метки.** Вместо «маска колонок × -3 ряда» хранить на каждую колонку ДИАПАЗОН y (`ymin`/`ymax`): 10 колонок × -2 байта × 2 страницы = 40 байт. `pop_cd_touch` расширяет диапазон -затронутых колонок, `pop_cd_hit` проверяет пересечение диапазонов. - -Проверка решения на обоих случаях сцены: - -- **страж:** клинок в колонках 7-8. В колонке 7 у метки лежит y 5..22 - (пламя), у клинка 31..37 — не пересекаются, колонку 8 пламя не трогало. - Слот остаётся «тихим» → экономия 148 302; -- **Кид в тяжёлой позиции:** пламя левого факела y 5..22, Кид y 15..55 — - пересечение НАСТОЯЩЕЕ, и он честно перерисовывается. Так и должно быть. - -Вариант с 8-пиксельными полосами вместо диапазонов тоже работает -(24 полосы), но 16-пиксельные УЖЕ НЕТ: пламя и клинок снова слипаются в -одной полосе. Диапазон на колонку точнее и не требует битовой возни. - -**Чего делать НЕ надо** (проверено расчётом, не повторять): частичную -перерисовку персонажа по пересечению и обрезку фона под ним. Обе правки -решают задачу, которой нет — перекрытия не существует. - -**Проверка:** замер 11/15 в обеих позициях Кида (лёгкая x = 99, тяжёлая -x = 106; разбор — [`../docs/perf_l11_room15.md`](../docs/perf_l11_room15.md) -§7), плюс визуальный прогон боя и прохода Кида под факелами: персонаж не -должен оставлять хвостов и не должен просвечивать сквозь пламя. - -**Место в очереди — [`../docs/perf_registry.md`](../docs/perf_registry.md), -позиция P15.** Смежное: P14 (fore-проход — вторая половина той же цены). - - -### HEAL-WIDTH. Ширина точечных heal'ов не совпадает со следом перерисовки — ОБЯЗАТЕЛЬНО - -**Постановка (пользователь, 2026-08-18).** Ширины heal'ов взяты «на глаз по -клеткам», а не по реальному следу. Сжатие до фактического следа даёт около -**10 % площади** самой дорогой операции акселератора; по оценке пользователя -5-6 % реального выигрыша. Задача обязательная. - -**Измерено** (каталоги атласов, спрайты плиты): - -| часть плиты | подземелье | дворец | -|---|---|---| -| верх (`41/69/70`) | 32 × 13-14 | 32 × 13-14 | -| правая грань (`42/71/72`) | **26** × 15-16 | **25** × 15-16 | - -То есть анимированный след ОДНОЙ плиты — `32 + 26 = 58` пикселей в -подземелье и `57` во дворце. - -**Что стоит сейчас.** В коде уживаются ДВЕ разные договорённости: - -- **60** = «свой тайл + свес соседа» — `pop_floor_bake` (там это записано - комментарием); -- **64** = «две клетки» — `pop_loose_shake_draw`, `pop_spike_redraw` - («ширина 64 = обе ячейки»). - -Для трясущейся плиты 64 избыточны: хватает 58 (подземелье) / 57 (дворец), -то есть **6 пикселей из 64 — впустую, 9,4 % площади heal'а**. - -**И обратная сторона, которую тоже надо разобрать.** Ни 60, ни 64 не -покрывают того, что перерисовка РИСУЕТ: два полных `draw_tile` красят до -**90** пикселей (32 свои + 32 соседа + 26 правой грани соседа, уходящей в -третью клетку). Видимого артефакта отсюда пока нет — содержимое третьей -клетки статично и перерисовывается одинаково, а трясущийся сосед накрывает -эту область своим heal'ом, — но несоответствие «heal уже, чем след» надо -либо закрыть, либо записать как осознанное. - -**Что сделать.** Свести ВСЕ точечные heal'ы (`pop_loose_shake_draw`, -`pop_spike_redraw`, `pop_chomp_redraw`, `pop_floor_bake`, `pop_loose_bake_empty`, -`pop_ceil_*`, коридор `mob_heal_*`) в таблицу «что рисует / что чистит» и -привести ширину каждого к фактическому следу. Ширины брать ИЗ АТЛАСА, а не -из номера клетки — они разные у двух тайлсетов (26 против 25). - -**Проверка:** замер 13/23 до/после (heal'ы — зелёная фаза) плюс визуальный -прогон комнат с плитами, пиками и чомперами: сужение heal'а — самый прямой -способ получить «недочищенный хвост». - -**Родня — [G8](../docs/perf_green_phase.md) (пометка соседа узкой полосой).** -Это две половины одной темы, и брать их логично вместе: G8 про ширину -ЗАПЕЧКИ соседнего тайла (60 вместо 28 нужных, да ещё `draw_tile` соседа -дважды на пометку), HEAL-WIDTH — про ширину HEAL'ов (64 вместо 58/57). -Числа там уже разобраны: 60 = 32 свой тайл + 28 собственный свес, и для -запечки САМОГО тайла 60 минимальны — сужать можно только пометку СОСЕДА. - -**Место в общей очереди — [`../docs/perf_registry.md`](../docs/perf_registry.md) -(позиция P8).** Там же собраны ВСЕ отложенные оптимизации из трёх фазовых -доков, отсортированные по измеренному эффекту, и разложена цена одного блита -(6 126 тактов фиксированной накладной на любой блит, независимо от размера). - - -### L12-SHADOW. Уровень 12: тень, бой, слияние — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-13: код написан, хост-тесты зелёные (45 проверок, -> `tests-host/t_shadow.c`), ЖИВОЙ ПРОВЕРКИ В MAME ЕЩЁ НЕ БЫЛО.** Для неё -> нужна сборка с `FIRST_LEVEL=12` и полный рестарт MAME после `make hdd`. - -План и сверка констант с оригинальными данными — -[`../docs/levels_12_15_plan.md`](../docs/levels_12_15_plan.md) §1 и §7. -Сделано ровно по нему: - -| кусок | где | порт | -|---|---|---| -| подъём тени в комнате 15 (условие «меч уже подобран») | `guards.c` `pop_check_shadow` | seg002:0070 | -| `init_shad_12` + вход ПАДЕНИЕМ (`seq_7`) | `guards.c` | data:0EFA | -| ИИ тени: ждать Кида / драться / сойтись / слиться | `guards.c` `autocontrol_shadow_level12` | seg002:1184 | -| «ранил тень — ранил себя» | `pop_guard.c` `pop_do_delta_hp` | seg000:1518 | -| «убил тень — убил себя» | `guards.c` `pop_check_killed_shadow` | seg006:2033 | -| таймер вспышки слияния (0 → счётчик → −1) | `pop_guard.c` `pop_shadow_timer` | seg003:0735 | -| меч исчезает при уходе вправо из комнаты 18 | `guards.c` `pop_sword_disappears` | seg002:0536 | -| появление плит в комнатах 2/13 после слияния | `pop_map.c` `floors_appear` | seg006:1063 | -| бесшовный переход 12 → 13 (комната 23, без двери) | `roomtest.c` + `pop_start_level` | seg000:0900 | - -Осознанное расхождение: мигания Кида спрайтами тени во время вспышки нет — -запись в [`../docs/impl_diff.md`](../docs/impl_diff.md). - - -### LOOSE-SHAKE-RUNS. Дрожание плит: пометки по сменам кадра, а не по кадрам - -**Идея пользователя 2026-08-13, на этап полиша.** - -`pop_loose_tick` на КАЖДОМ кадре отсчёта ставит `pop_set_redraw(pos, -POP_RD_LOOSE, 1)` — полную перерисовку тайла, десять раз за отсчёт. А -кадр дрожания меняется не каждую фазу: таблицы -(`POP_LOOSE_FRAM_BOTTOM` = 43,73,43,74,74,43,43,43,74,74,74) дают - - фаза 1 2 3 4 5 6 7 8 9 10 - кадр 73 43 74 74 43 43 43 74 74 74 - ^^^^^ ^^^^^^^^ ^^^^^^^^ - парами и тройками одно и то же - -С фазы 5 кадры идут ТРОЙКАМИ. Значит вместо шести пометок с `pages = 1` -хватит двух — на фазах 5 и 8 — но с `pages = 2` (обе страницы дабл-буфера, -иначе на второй застынет старый спрайт и пойдёт мерцание через кадр). - -**Выигрыш ~20 % работы зелёного блока и ТОЛЬКО на дрожащих плитах.** -Наивный вариант «ставить лишь на смене кадра» выигрыша НЕ даёт: пять смен -по две страницы — те же десять перерисовок (проверено арифметикой -2026-08-13, до правки). - -Вопрос к этапу полиша: стоит ли неочевидный код такого узкого выигрыша. - - -### BG-ONCE. Задний фон рисуется ОДИН раз; вместо чёрных баров — heal - -**Предложение пользователя 2026-08-13. Не делать сейчас — обязательно к -проверке и реализации на этапе полиша/оптимизации.** - -Суть: элементы САМОГО заднего фона — факелы без пламени, окна, узор кладки, -решётчатая кладка и что ещё найдётся — впечатываются в фон один раз и больше -не перерисовываются никогда. Ни один объект за ними оказаться не может, а -значит и возвращать их поверх чего-либо не нужно. Если такой элемент оказался -затёрт, это САМО ПО СЕБЕ сигнал об ошибке: либо бар/прямоугольник слишком -велик, либо что-то рисуется не в своём слое. - -Вторая половина предложения — и она про скорость: там, где мы гасим область -чёрным баром перед выводом спрайта, звать вместо бара **heal по координатам -бара**. Бар всё равно приходится потом закрывать фоном, то есть выходит две -операции; heal делает то же одной и сразу правильным содержимым. - -**Оценка: идея верная по направлению, но есть два известных препятствия.** - -1. **Узкий heal уже пробовали — и откатили.** В `pop_room.c` (`pop_clip_sprite`) - записано: per-спрайтовый heal не используется, потому что выравнивание - блока акселератора оставляет 1-2 px слайверы правой грани, и на одной - странице дабл-буфера это мерцает. Поэтому борта чистит полоса - `pop_room_clip_borders` с гейтом по флагу. Прежде чем менять бары на heal, - надо решить именно эту задачу — иначе получим мерцание вместо ускорения. -2. **Полный запрет «не перерисовывать фон» противоречит foretable.** - `draw_tile_fore` (seg008:715) кладёт в передний слой ГЛАВНУЮ ГРАНЬ стены - вместе с её узором — она обязана перекрывать персонажа. То есть запрет - должен различать «декор задней стены» и «передняя грань», а это ровно - различие backtable/foretable оригинала. Фактически предложение сводится к - «привести наши слои в соответствие с таблицами оригинала» — тот же вывод, - к которому пришёл разбор `overlay_mid_tile` (см. ниже). - -**Известное исключение**, которое надо не сломать: Кид, уходящий по лестнице -в дверь уровня, действительно уезжает за передний план — но он и рисуется -отдельно (`clip_char`, правая грань doortop; см. memory `pop_clip_char_todo`). - -**Критерий приёмки этапа:** пройти уровни с падающими плитами (13) и с -факелами/окнами (10-12) и убедиться, что ни один фоновый элемент не -перерисовывается в кадре, где его тайл не менялся; замерить кадр до и после. - - -### L12-SHADOW-SPR. Тень дерётся спрайтами СТРАЖА, а не своими - -**Найдено прогоном 2026-08-13.** `tbl_guard_type[12] = 4` — это SHADOW.DAT, -отдельный набор спрайтов (силуэт Кида), а `pop_guard_load` (`pop_cdraw.c`) -разбирает только тип 2 (SKEL) и 3 (VIZIER); тип 4 сваливается в набор -обычного стража. Ассеты есть: `SDLPoP/data/SHADOW` (32 кадра + `res750.pal`). - -Правка по образцу VIZIER (набор в `pop_pack_guard.py`, каталог в Makefile, -ветка в `pop_guard_load`), НО сначала проверить две вещи, иначе спрайты -поедут: (1) какую таблицу кадров получает `CHARID_1_SHADOW` в -`pop_frame_tbl_is_guard` — Кида или стража, и (2) сколько кадров в наборе -(32 против 34 у стража) и не выходит ли индекс за его пределы. - -Это НЕ полный «вид тени» (OR/XOR-блиттеры, [`../docs/shadow_render.md`]) — -только правильный набор спрайтов вместо чужого. - - -### L12-SEAM-POLISH. Переход 12 -> 13 выглядит коряво - -Механика работает (комната 23, без заставки и без сброса HP), но сама -анимация прохода рваная — замечено пользователем 2026-08-13. Полишинг, -берётся вместе с остальной шлифовкой переходов. - - -### L13-JAFFAR. Уровень 13: Джафар, победа, выход — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-13: код написан, хост-тесты зелёные (44 проверки, -> `tests-host/t_jaffar.c`), ЖИВОЙ ПРОВЕРКИ В MAME ЕЩЁ НЕ БЫЛО.** - -Своего ИИ у Джафара нет — это обычный страж (seg002:085A), skill 9 и 6 HP уже -лежат в `pop_level_cold.c`. Сделаны только события и данные: - -| кусок | где | порт | -|---|---|---| -| фора после встречи (`guard_notice_timer`) | `guards.c` `pop_meet_jaffar` + `autocontrol_guard_inactive` | seg002:0544 / 0736 | -| победа: белая вспышка + «выход разрешён» | `guards.c` `on_guard_killed` | seg006:1927 | -| выход: кнопка комнаты 24 при уходе ВЛЕВО | `guards.c` `pop_jaffar_exit` | seg002:0517 | -| гряда плит сверху при входе в комнаты 23/16 | `pop_map.c` `pop_check_fall_flo` | seg000:1317 | -| фазу со старшим битом на 13-м НЕ гасить | `pop_map.c` `pop_loose_tick`, `pop_trob.c` `animate_loose` | seg007:823 | -| сотрясение на 13-м плиты НЕ трясёт | `pop_map.c` `do_knock` | seg007:949 | -| плита бьёт и В БЕГЕ | `pop_map.c` `fell_on_your_head` | seg007:1218 | -| СПРАЙТЫ Джафара (VIZIER.DAT, своя палитра) | `pop_pack_guard.py`, `pop_cdraw.c`, `Makefile` | seg000:1092 | - -По ходу нашлась и починена смежная ошибка: цвет стража из данных комнаты -применялся к ЛЮБОМУ набору, хотя оригинал берёт его только у обычного стража -(`curr_guard_color = 0` при `tbl_guard_type != 0`, seg002:183) — скелета это -не задевало случайно, Джафара покрасило бы. - -Осознанное расхождение (представление фазы отложенного старта) — запись в -[`../docs/impl_diff.md`](../docs/impl_diff.md). - -**Не портировано намеренно:** `is_show_time` в `on_guard_killed` — это показ -ОСТАВШЕГОСЯ ВРЕМЕНИ, а часов на 60 минут у нас пока нет вовсе. - -**Что проверять в MAME** (`make LEVEL=13`): - -1. комната 23 (стартовая): плиты сверху сыплются ВРАЗНОБОЙ с первых кадров, - и они бьют, даже если пробегать под ними; -2. приземление Кида плиты НЕ трясёт (иначе гряда посыплется разом); -3. уход вправо из комнаты 3: Джафар виден СВОИМИ спрайтами и своей палитрой, - ~2 секунды стоит, не доставая клинок; -4. смерть Джафара — белая вспышка; уход ВЛЕВО открывает дверь уровня. - -**Что проверять в MAME** (по порядку прохождения уровня): - -1. комната 15: пока меч лежит — тени нет; подобрал меч, вышел и вернулся — - тень СВАЛИВАЕТСЯ сверху, а не стоит готовая; -2. бой: каждый удар по тени отнимает HP и у Кида; добить её нельзя — на её - смерти умирает и Кид (белая вспышка); -3. слияние: убрать меч (`Shift`+вниз), подойти — белая вспышка, тень исчезла, - потолок HP вырос на единицу; -4. после слияния в комнатах 2 и 13 (верхний ряд) под ногами появляются плиты; -5. уход ВПРАВО из комнаты 18 убирает меч из комнаты 15 (вернуться и взять - второй раз нельзя); -6. комната 23 — уровень молча становится 13-м, HP НЕ сбрасывается. - - -### L7-FEATHER. Зелье МЕДЛЕННОГО ПАДЕНИЯ — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-12: код написан, ждёт живой проверки в MAME.** Сделаны все -> шесть шагов ниже плюс синие пузырьки зелья «−HP» (тип 5) — они всплыли по -> ходу: пользователь напомнил, что такое зелье стоит уже на уровне 2 (комната -> 13, тайл `(1,3)`; ещё ур.8 комн.2 и весь ур.15), а цвет у него был красный. -> Хост-тесты: `phys_feather_fall_is_slow_and_harmless` (скорость ≤ 4 и HP -> целое против обычного падения с двух рядов). **Осталось**: проверить в MAME -> — ур.7 комн.1 (зелёные пузырьки, зелёная вспышка, медленный спуск в шахту) и -> ур.2 комн.13 (синие пузырьки, −1 HP, экран краснеет один раз). - -Зелье на `(2,8)` комнаты 1 уровня 7 (сверено по `res2007.bin`: modifier 3, то -есть `potion_type = 3` — «slow fall»). Сейчас `pop_proc_get_object` -(`pop_map.c`) для типов 3/4/6 не делает НИЧЕГО (явный TODO): зелье выпивается -без эффекта. - -Механика оригинала (прочитана в SDLPoP до планирования, правило проекта): - -| что | где в SDLPoP | значение | -|---|---|---| -| включение | `feather_fall()`, seg000:15F8 | `is_feather_fall = 1`, зелёная вспышка (`flash_color = 2`, `flash_time = 3`), `stop_sounds` + `sound_39_low_weight` | -| физика | `fall_accel()`, seg006:057C | ускорение **1** вместо 3, потолок скорости **4** вместо 33 (`FALLING_SPEED_*_FEATHER`, types.h:1435) | -| анимация | опкод `SEQ_JMP_IF_FEATHER`, seg006:586 | в seqtbl есть ветки `stepfloat` / `bumpfloat` — «плавные» кадры падения и удара; таблица у нас из данных оригинала, ветки УЖЕ ЛЕЖАТ в ней | -| длительность | `do_timers`, seg003:517 | ваниль: пока играет звук (или 225 тиков); фикс SDLPoP `fix_quicksave_during_feather` — таймер `FEATHER_FALL_LENGTH = 18.75 c` | -| сброс | seg003:189 (`start_level`) | на старте уровня и, по фиксу, при смерти Кида | -| вид склянки | `draw_tile_fore`, seg008:740 | типы 2..4 — БОЛЬШАЯ склянка (id 13) — **у нас уже так** | -| цвет пузырьков | `draw_tile_anim`, seg008:652 | типы 3/4 — **зелёный** (`color = 10`), 5/6 — синий, остальные — красный (12) | - -Шаги (в порядке выполнения, каждый проверяем отдельно): - -1. **Состояние.** `pop_feather` (счётчик кадров) в `pop_map.c` рядом с - `fall_accel`; экспорт в `pop_map.h` для `play_seq`. Длительность — по - таймеру (ванильная привязка к звуку нам не подходит: звука нет), значение - пересчитать из 18,75 с в наши кадры и завести в `pop_tune.h`. Сброс — в - `pop_start_level` и по смерти Кида. -2. **Физика.** `fall_accel()`: при `pop_feather` — `FALL_ACCEL_FEATHER 1` / - `FALL_MAX_FEATHER 4`. Только для Кида (`charid == CHARID_0_KID`) — так - правильнее по смыслу, но это ОСОЗНАННОЕ расхождение с ванилью (там эффект - ловят все, и SDLPoP чинит это опцией) → запись в `../docs/impl_diff.md`. -3. **Анимация.** Опкод `0xF7` в `play_seq` (`pop_kid.c`) сейчас БЕЗУСЛОВНО - пропускает адрес; сделать как в оригинале: при `pop_feather` — прыжок по - адресу (это и даёт `stepfloat`/`bumpfloat`, то есть отсутствие урона и - «парение»). Правка на 3 строки, но именно она даёт весь визуальный эффект - падения. -4. **Вспышка.** Сейчас цвет вспышки — булев `pop_flash_red` (жёлтая/красная); - расширить до кода цвета и добавить ЗЕЛЁНУЮ (`flash_time = 3`). -5. **Зелёные пузырьки.** `pop_pack_bg.py` уже красит пузырёк mono-цветом - (`POT_BUBBLE_COLOR = VGA16 + 12`, красный). Добавить второй набор кадров - 16..22 в зелёном (`+10`) под своими id в атласе `pop_pot` и выбирать набор - по `potion_type` в `pop_potion_draw` (`pop_room.c`): 3/4 — зелёный, 5/6 — - синий, иначе красный. Цена — 7 маленьких спрайтов. -6. **Проверка.** Хост-тест: падение с трёх рядов под пером — скорость не выше - 4, урона нет, Кид жив (сцена в `t_phys`/`t_char`). MAME: комната 1 уровня - 7 — выпить, спрыгнуть в шахту, убедиться в плавном спуске и в том, что - эффект кончается по таймеру. - -### L3-COLOR. Палитра КЛАДКИ уровня 3 (в оригинале он зелёный) - -**Наблюдение (пользователь, 2026-08-07, со сравнением карт VGA).** В -оригинальной VGA-версии кладка уровня 3 ЗЕЛЁНАЯ, а уровней 1-2 — серо-синяя. -В SDLPoP все подземелья одинаковые, поэтому по нему разницу не увидеть. - -**Почему в SDLPoP её нет — проверено, не гипотеза.** Механизм там ЕСТЬ -(seg000:1140, «Level colors (1.3)»): - -```c -int level_color = custom->tbl_level_color[current_level]; -if (level_color != 0) { - byte* env_pal = level_var_palettes + 0x30*(level_color-1); - byte* wall_pal = env_pal + 0x30 * custom->tbl_level_type[current_level]; - set_pal_arr(0x50, 0x10, (rgb_type*)env_pal); /* chtab_6 environment */ - set_pal_arr(0x60, 0x10, (rgb_type*)wall_pal); /* chtab_7 wall */ -} -``` - -`tbl_level_color` (data.h:842) = `{0,0,0,1,0,0,0,1,2,2,0,0,3,3,4,0}` — у -уровня 3 цвет **1**, у 7 тоже 1, у 8/9 — 2, у 12/13 — 3, у 14 — 4. Но -`level_var_palettes` — это ресурс **20** из `PRINCE.DAT` (только версии -1.3/1.4), а в `SDLPoP/data/PRINCE/` его НЕТ: там лежит лишь `res10.bin` -(палитры стражей). Значит `level_var_palettes == NULL` и вся ветка молча -пропускается — отсюда одинаковые подземелья. - -**Данные у нас есть.** В `../MSDOS/PRINCE.DAT` ресурс 20 присутствует: -offset 22790, **240 байт** = 5 палитр × 16 цветов × 3 байта (6-битные -каналы, как res10). - -**Что делать (когда дойдём до вида уровня 3).** -1. Достать ресурс 20 из `MSDOS/PRINCE.DAT` (упаковщику придётся читать сам - `.DAT` — сейчас все скрипты берут распакованные PNG из SDLPoP); -2. сгенерировать таблицу палитр рядом с `pop_guard_pal.h`; -3. при загрузке уровня заливать слоты **0x50..0x5F** (env) и **0x60..0x6F** - (wall) — у нас ровно эти базы (`pop_pack_bg.load_indexed`: `pal_base = - 0x60` для WALL, `0x50` для env), то есть совпадение со `set_pal_arr` - один в один; -4. `wall_pal = env_pal + 0x30 * tbl_level_type[level]` — для подземелья - (`level_type == 0`) обе палитры одинаковые. - -**Грабли, уже пойманные на цвете стражей:** `gfx_pal_load` отдаёт указатель -в BIOS (`$A4` через `rst #0x08`), а BIOS читает только `#4000-#BFFF` — -таблицу нельзя передавать прямо из банка (0xC000+), надо копировать в -W1/W2 (см. [BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1)). - -### DRAW-COST. Кадр НЕ УКЛАДЫВАЕТСЯ в бюджет — нужна оптимизация - -> **ШАГ 1 СДЕЛАН 2026-08-08: пропуск неизменившегося персонажа.** Комната -> 1.3, труп стража, Кид стоит: было **210 %** кадрового периода, стало -> **116 %** (500 772 такта при бюджете 430 000). Отрисовка перестала быть -> узким местом: персонажи в покое не рисуются ВООБЩЕ (ноль вызовов -> `pop_heal_fast` за кадр), весь фон — ДВА блита факелов (44 136 тактов). -> Механизм и почему метка позиционная — в шапке `pop_cdraw.h`. - -**Исходные замеры пользователя (полосы бордюра, до шага 1).** Уровень 1, -Кид СТОИТ — то есть НЕ худший случай, ни боя, ни движения: - -| комната | синяя (ввод+heal+логика) | зелёная (фон) | циан (спрайты) | итого | -|---|---|---|---|---| -| 3, страж УБИТ | ~80 % | ~20 % | ~110 % | **~210 %** | -| 2, стража НЕТ | ~60 % | ~20 % | ~60 % | ~140 % | - -Разница ровно в теле убитого стража: +20 % синей и +50 % циана. Труп -сохраняет `charid != 0`, поэтому каждый кадр честно проходил весь путь -живого персонажа (heal → спрайт+clip_char+брызги+клинок → fore-проход), хотя -его кадр постоянен до выхода из комнаты. - -**Что сделано (шаг 1).** Не спецкейс «мёртвый», а общее правило: у каждой -страницы дабл-буфера свой снимок ВХОДОВ отрисовки слота; совпал снимок, -спрайт этой страницы цел и фон в его прямоугольнике не трогали — heal, блит -и fore-проход пропускаются целиком. Покрывает и труп, и стоящего Кида, и -ждущего стража. Детали контракта — `pop_cdraw.h`, реализация — -`pop_char_skip_mask` / `cd_quiet` в `pop_cdraw.c`, метка фона — -`pop_cd_touch` в резидентном `pop_tile.c`. - -Грабли, на которые наступили по дороге: сначала метка была ФЛАГОМ «фон -трогали хоть где-то» — и выигрыш оказался ровно нулевым, потому что факелы -анимируются каждый кадр и гасили пропуск для всех персонажей сразу (замер: -597 684 такта, как без оптимизации). Метка обязана быть ПОЗИЦИОННОЙ. - -**Остаточный эффект от объединения прямоугольников.** Метка одна на -страницу — объединение всех правок фона. В комнате 1 два факела дают -прямоугольник x 40…88, а стоящий там Кид занимает x 32…44: пересечение 4 px, -и он перерисовывается каждый кадр (140 % против 94 %, если отойти). Если -понадобится — держать не один прямоугольник, а 3-4 отдельных и мержить -только при переполнении. - -### Шаг 2 сделан частично: ЛОГИКА (синяя полоса) 2026-08-09 - -Пользователь: «на стоящем Киде с двумя факелами на логику уходит 60 % -кадрового периода — недопустимо». Разобрано брейкпоинтами в MAME -(`z80_profiling_method`), сцена: уровень 1 комната 1, Кид СТОИТ вплотную к -левому факелу (то есть пропуск персонажа НЕ срабатывает — худший случай). - -**Калибровка, которую надо знать заранее.** Один такт `totalcycles` в MAME -— НЕ один номинальный T-такт Z80: у Sprinter на обращениях к ОЗУ есть -wait-state'ы, и замеренная стоимость выходит **≈ 2,4× номинала** -(`get_tile`: 574 номинальных против 1 422 замеренных). Считать бюджет по -таблице T-тактов из справочника нельзя — только мерить. Кадр растра = -430 000; главный цикл спейсится тремя `gfx_wait_vsync`, поэтому работа -СВЫШЕ 430 000 стоит сразу целый лишний кадр. - -**Что нашли и починили:** - -| правка | что было | стало | -|---|---|---| -| окно перебора коллизии как в оригинале (было: все 14 колонок каждый кадр) | `check_collisions` 60 888 | 50 940 | -| `get_tile_div_mod` — таблицей (`tile_div_tbl`/`tile_mod_tbl`), было `/14` и `%14` | 5 400 тактов на вызов, 13 вызовов за кадр ≈ 70 000 = **16 % кадра** | ~250 на вызов | -| разрешение ряда вынесено из цикла колонок + грань шагом 14 + `wall_type` таблицей | `check_collisions` 58 026 | 42 750 | -| `move_coll_to_prev` — `memcpy` (LDIR) вместо цикла на C | 14 байт за 5 514 тактов (390 на байт!) | ~1 200 | -| окно режется на непрерывные пробеги (левый сосед / своя / правый), пролог ряда вынесен на кадр | `check_collisions` 44 022 | **38 334** | - -Замер одной итерации перебора: **пустая колонка 750 тактов, колонка-стена -~1 700** (две 16-битные знаковые сверки граней — SDCC пишет их через -`jp PO / xor 0x80 / jp P`). Ловушка, на которую наступили: «быстрый путь для -окна внутри комнаты» не срабатывал ПОЧТИ НИКОГДА — Кид, стоящий в колонке 0, -даёт окно с −1, и шёл медленный сбор во временный буфер с тернарником на -колонку (1 340 тактов на колонку). Отсюда разбиение на пробеги: вопрос «чья -это колонка» решается раз на пробег, а `coll_scan` сам двигает `scan_left`. - -Самое дорогое было НЕ там, где ожидалось: `/14` и `%14` SDCC разворачивает -в `__divsint` + `__modsint`, а `__modsint` внутри зовёт `__divsint` ещё раз — -два полноценных 16-битных деления на каждый вопрос «в какой колонке точка». -Оригинал делит таблицей (seg006:702) — мы просто не портировали это место. - -**ГЛАВНОЕ: логический кадр уложился в бюджет.** Главный цикл спейсится -тремя `gfx_wait_vsync`, поэтому работа сверх 430 000 тактов стоит СРАЗУ -целый лишний растровый кадр. Было 470 964 (период цикла 4 кадра), стало -**409 956 + ~15 600 на ввод = 425 600** — период цикла **3 растровых кадра**. -Игра стала быстрее на треть (16,7 логических кадров/с против 12,5). - -Что дало последние тысячи (по убыванию): - -| правка | экономия | -|---|---| -| `pop_y_to_row` — цепочка сравнений вместо `/63 % 4` | ~12 000 | -| расширение окна fore-прохода арифметикой вместо перебора 10 колонок и 3 рядов | ~8 500 | -| `col_from_x` — таблицей (те же `POP_TILE_DIV`, вынесены в резидент) | ~11 000 | -| `pop_cd_touch` — развёрнутый цикл по страницам, `x+w`/`y+h` один раз | ~8 600 (зовётся с каждого блита фона) | -| `tp / 10`, `tp % 10` у факелов — таблицей | ~4 000 | -| пустой слот соперника считается «тихим» | ~8 200 | - -**Ловушка SDCC, на которой я потерял один прогон:** в `pop_y_to_row` одно и -то же выражение `t / 63 % 4 - 1` стояло в двух ветках, и компилятор поднял -деление В ВЕРШИНУ функции — быстрые возвраты не спасали, `__divsint` звался -всё равно. Лечится выносом медленного хвоста в ОТДЕЛЬНУЮ функцию. Тот же -эффект уже был описан в `pop_loose_tick`; теперь ясно, что это правило, а не -частный случай: **любое деление, встречающееся дважды, SDCC поднимает выше -всех проверок.** - -Приём, которым это ловится: брейкпоинт на `__divsint`/`__divuint`/ -`__divuchar` с печатью адреса возврата (`printf "%04X", w@(sp)`) — сразу -видно, кто и сколько раз делит за кадр. - -**Хвост подобран 2026-08-10.** После переписи `pop_y_to_row` в pop_room.c -осталось ТРИ места, считавших `(y+60)/63 % 4 - 1` вручную (927 в -`mob_tick_one`, 976/977 в `mob_render`) — сгенерированный asm подтвердил -пару `__divsint`+`__modsint` в каждом. Это ~16 200 тактов (3,8 % кадра), но -только пока кусок плиты в полёте — то есть ровно в самом тяжёлом кадре. -Заменены вызовом `pop_y_to_row`; в банке 7 теперь НОЛЬ `__divsint`. -Эквивалентность закреплена тестом `geom_y_to_row_matches_formula` -(перебор −400..400 против исходной формулы) — вызовы разбросаны по трём -банкам, и соблазн написать деление «по месту» возвращается. - -### Полная инвентаризация делений 2026-08-10 - -Способ (повторяемый одной командой из `.sprinter-cc-roomtest/`): - -``` -awk '/^;[a-z_0-9]+\.[ch]:[0-9]+:/{s=$0} /^\tcall\t__(div|mod|mul)/{printf "%-22s %-12s %s\n",FILENAME,$2,s}' *.asm -``` - -Найден **31 вызов в 9 модулях**. Прибрано три места, остальное разобрано и -осознанно оставлено. - -Убрано: - -| место | что было | почему стоило | -|---|---|---| -| `pop_cdraw.c` `calc_screen_x_coord` (2 вызова) | `x * 8 / 7` = `__divsint`, **2 400 тактов НА ПЕРСОНАЖА КАЖДЫЙ КАДР** | последнее деление в горячем пути; ~4 800/кадр при живом сопернике | -| `pop_guard.c` `guard_col_from_x` | `/14` + `%14` **безусловно**, мимо `POP_TILE_DIV` | единственное 16-битное деление, у которого таблица вообще не была подключена | -| `pop_trob.c` `animate_chomper` | `tp / 10` = `__divuchar` на чомпера каждый кадр | таблицы `TP_ROW`/`TP_COL` уже лежали в ЭТОМ ЖЕ файле, но ниже по тексту — чомперы их не видели | - -Приём для `×8/7`: **таблица** `SCRX7[1152]` (int8_t, хранит `x/7`) в банке 4, -индекс `x + 448`, результат `x + SCRX7[i]`. 1 152 байта, резидент не тронут. - -Два решения по дороге, оба проверены, а не угаданы: - -1. **Диапазон — весь, включая отрицательные.** Первая версия крыла 0..255 по - тождеству `8x/7 == x + x/7` с байтовой таблицей `x/7`. Ошибка: `obj_x = - 2*fwd − 116` уходит в минус, как только `fwd < 58` (левее `x_bump[5]`) — - то есть у ЛЕВОЙ КРОМКИ комнаты, а это не экзотика, и там мы продолжали - делить. Границы взяты из фактических данных: `kid_data.bin` даёт `dx` - кадров Кида −5..+10, стража −2..+10; при `Char.x` типа uint8_t и - `render_dx ∈ {−140, 0, +140}` полный диапазон `obj_x` = **−416..695**. - Таблица кроет −448..703, деление стало недостижимым (оставлено - страховкой на третьего персонажа / другой `render_dx`). -2. **Хранить `x/7` байтом, а не готовое `x*8/7` словом** — по тождеству - `8x/7 == x + x/7`. Первая версия хранила готовое, «раз всё равно - индексация двухбайтная». Собраны ОБА варианта, такты посчитаны по - сгенерированному asm: - - | вариант | хвост после проверки границ | тактов | байт | - |---|---|---|---| - | `int16_t` готовое | `add hl,hl / add hl,de / ld e,(hl) / inc hl / ld d,(hl)` | **132** | 2 304 | - | `int8_t` `x/7` | `add hl,bc / ld a,(hl) / ld l,a / rlca / sbc a,a / ld h,a / add hl,de` | **131** | 1 152 | - - Расширение знака и 16-битное сложение стоят ровно столько же, сколько - лишний `add hl,hl` при двухбайтном индексе, а обращений к памяти на одно - меньше — под wait-state'ами Sprinter (такт ≈ 2,4× номинала именно на - обращениях к ОЗУ) байтовый вариант ещё чуть выгоднее номинала. Итог: - байтовая таблица не хуже по скорости и на килобайт меньше. **Урок: - «двухбайтный индекс съест выигрыш» — гипотеза; она не подтвердилась.** - -Кодоген проверен глазами (`bank4_pop_cdraw.asm`): `ld hl,#0x01C0; add hl,de`, -16-битное беззнаковое сравнение — индекс полный, старший байт не теряется -(грабли `sdcc_z80_const_ptr_index_bug` обойдены отдельной -`uint16_t`-переменной). 131 такт номинала против ~1 000 у `__divsint`. - -Проверка таблицы: все 1 152 записи сверены питоном обратно из `.c`, а ПРАВИЛА -генерации (тождество + усечение к нулю) — тестом `geom_mul8div7_table_rules` -на целевом компиляторе: округляй SDCC к минус бесконечности, вся -отрицательная половина уехала бы на пиксель, и поймалось бы это только -глазами на левой кромке. - -Оставлено сознательно (НЕ трогать, это не забытые места): - -- **Хвосты за таблицей** — `guards.c:84`, `pop_bg.c:497`, `roomtest.c:163`, - `pop_map.c:412`: срабатывают только при x вне 0..255, то есть когда - персонаж в соседней комнате. Убирать их — это расширять `POP_TILE_DIV` до - −140..395 (+280 Б резидента) ради редкого пути. -- **`pop_geom.c:21`** — намеренный медленный хвост `pop_y_to_row` (см. выше - про подъём деления SDCC). -- **`pop_geom.c:52`** — `v % n` в `pop_rnd_fit` для не-степени двойки: - оригинал зовёт `prandom(1)/(255)/(0xFF)`, все три идут веткой с маской, - сюда управление не приходит вовсе. -- **Холодные, раз на комнату/уровень/событие**: `pop_guard.c:266/268/269` - (вход стража), `pop_map.c:310` (пробуждение скелета), `pop_trob.c` дверь - уровня, `roomtest.c:473/663/887` (читы и старт), `pop_level.c:131/132` - (имя файла уровня), `roomtest.c:976/977` (отладочный HUD номера комнаты). - Каждое — единицы вызовов за секунды игры; таблицы под них только раздули - бы код. - -Итог: **в горячем пути делений не осталось**. В банках 4, 6, 7 — ноль -`__div*`; всё, что видно в списке выше, либо за быстрым путём, либо холодное. - -### Замер в MAME: A/B со сборкой `ec3cca5` (до правок) - -Обе сборки прогнаны через полный цикл (`make hdd` → рестарт MAME → загрузка -уровня 1), сцена — **комната 1, Кид стоит, соперника нет**; скриншоты обеих -сборок идентичны. Фазы сняты брейкпоинтами на инструкциях `out -(_io_border), a` профилировочного бордюра, медиана по 60 логическим кадрам: - -| фаза | до | после | Δ | -|---|---|---|---| -| ввод + heal | 62 361 | 62 364 | +3 | -| логика | 79 878 | 79 878 | 0 | -| фон | 119 502 | 119 502 | 0 | -| **спрайты** | **129 568** | **127 510** | **−2 058** | -| РАБОТА за кадр | 391 258 | 389 221 | −2 037 | - -Счётчик делений (брейкпоинты на `__divsint`/`__modsint`/`__divuchar`/ -`__moduchar` с печатью адреса возврата): - -| сцена | до | после | -|---|---|---| -| комната 1, только Кид | **1,00 `__divsint`/кадр** (возврат 0xD3AA = `pop_cdraw`) | **0** | -| комната 3, бой со стражем | **2,01 `__divsint`/кадр** | **0** (82 кадра боя) | - -Всё сходится в одну картину: единственное деление горячего пути — `×8/7` на -персонажа, по одному вызову на каждого Char. Экономия ровно в фазе спрайтов -и ровно на стоимость одного вызова: **2 058 тактов** (документированная -оценка была ~2 400). С соперником на сцене — вдвое. - -**Чего этот замер НЕ показывает, и это важно:** - -- Период цикла как был 3 растровых кадра, так и остался — 2 000 тактов его не - двигают. Выигрыш ушёл в запас: до нижней границы 430 000 стало 40 800 - тактов вместо 38 700. -- Остальные правки (три `y_to_row` в `pop_room`, `guard_col_from_x`, - `tp/10` у чомпера) в этой сцене **не срабатывают вовсе** — им нужны - падающая плита, переход стража между комнатами и уровень с чомперами. - Их стоимость известна поштучно, но в бою я их не ловил. -- Работа в комнате 3 между прогонами **несравнима** (391 204 против 318 145): - страж живой, фаза боя и срабатывание `pop_char_skip_mask` от прогона к - прогону разные. Оттуда взят только СЧЁТЧИК делений — он от таймингов не - зависит. - -**Профиль работы за логический кадр СЕЙЧАС (409 956 тактов + ~15 600 ввод):** - -| блок | тактов | % растрового кадра | -|---|---|---| -| see_kid + ctrl_tick + skip + heal + kid_tick | 52 536 | 12 | -| физика Кида + страж + боёвка | 73 452 | 17 | -| `pop_loose_tick` | 27 438 | 6,4 | -| **`pop_process_trobs`** (два факела) | **75 720** | **17,6** | -| `pop_redraw_needed` + шов + skip_mask | 10 932 | 2,5 | -| **`pop_char_draw` Кида** | **56 250** | **13** | -| **`pop_char_fore` Кида + борта** | **113 628** | **26** | - -Синяя полоса (ввод + логика) была ~60 % → стала ~29 %. - -**Оптимизация закрыта по решению пользователя 2026-08-10.** Всё, что -осталось неcделанным, вынесено с замерами в -[`../docs/perf_backlog.md`](../docs/perf_backlog.md) — там же протокол «как -мерить», чтобы не наступать заново на wait-state'ы и на устаревшие адреса -символов. Что доделано после таблицы выше: `pop_cd_touch` развёрнут, -tp/10 у факелов таблицей, пустой слот соперника считается тихим, ранний -выход в fore-проходе (нулевой эффект, оставлен как порт), быстрый путь без -клипа в `pop_blit_b` (факел 41 778 -> 31 218 тактов). - -**Что осталось (запас на будущее, срочности больше нет):** - -1. **`pop_char_fore` 113 628.** Внутри: `char_footprint` + расширение окна - ~21 000, дальше шесть `fore_tile`, из которых два реально рисуют (по - ~32 000). Дальше резать — кэш «в этом тайле переднего слоя нет вовсе». -2. **`pop_process_trobs` 75 720 на два факела** (~31 000 на факел). Внутри - одного факела: `gfx_blit_noclip` 8 700, чтение w/h и клип 6 400, - `pop_cd_touch` (теперь дешевле), маппинг окна 0 и возвраты. Пламя - перерисовывается каждый кадр обязательно (`TORCH_ANIM_DIV = 1`, кадр - меняется), так что пропуск тут не поможет — только удешевление блита. -3. `pop_loose_tick` 27 438 при полном отсутствии падающих плит. -4. Одно `__divsint` осталось в `pop_char_draw` (`obj_x * 8 / 7`) — ~2 400. - -### Шаг 2 (СЛЕДУЮЩИЙ, назначен пользователем): ДВИЖУЩИЙСЯ Кид - -Пропуск закрывает только покой. Наблюдение пользователя 2026-08-08: как -только Кид побежал, циан-полоса (спрайт + fore-проход) вырастает почти до -**100 % кадрового периода** — и это на ОДНОГО персонажа. То есть цена -одной перерисовки персонажа сама по себе непозволительно велика, и её надо -резать по существу, а не пропусками. - -Куда смотреть (мерить каждое, метод — `z80_profiling_method`): -1. разделить замером спрайт-блит и fore-проход: у fore уже была история - 78 % кадра до кэша кладки (`pop_fore_layer_cost`), он и сейчас главный - подозреваемый; -2. fore-проход перебирает 2×2…3 тайла и в каждом разбирает кладку заново — - кэш «в этом тайле переднего слоя нет вовсе» снял бы половину; -3. расширять перебор ТОЛЬКО по накладным спрайтам (клинок/брызги), а не по - всему окну клипа: габарит кадра уже покрыт футпринтом + правилом меча; -4. heal + блит спрайта: сейчас это два прохода по одной площади; посмотреть, - нельзя ли стирать только РАЗНОСТЬ прямоугольников при мелком сдвиге. - -**Куда идти дальше в ПОКОЕ — там это ЛОГИКА, а не отрисовка.** Разбивка -работы кадра брейкпоинтами (комната 3, труп, Кид стоит; всего 500 772 -такта): - -| участок | тактов | % кадра | -|---|---:|---:| -| ввод + `check_skel` + луч видимости + `ctrl_tick` + heal | 65 862 | 15 % | -| `kid_tick` + физика + страж + боёвка | **260 022** | **60 %** | -| `loose_tick` + `process_trobs` | 119 562 | 28 % | -| `redraw_needed` + шов + спрайты + метка | 55 152 | 13 % | -| — из них два блита факелов | 44 136 | 10 % | - -1. **60 % на тик персонажей** при том, что оба СТОЯТ — первый кандидат. - Смотреть `pop_phys_tick`/`pop_guard_phys_tick` (банк 3) и `pop_guard_tick` - (банк 1): сколько там работы, которую неподвижный персонаж делать не - обязан, и сколько стоит трамплин на каждом шаге. -2. **28 % на `loose_tick` + `process_trobs`** в комнате БЕЗ единой ловушки — - явно перебор; разобрать, что там сканируется каждый кадр (список trob, - `pop_trob_modif` соседа для шва, `pop_room_link`). -3. Запечь труп в фон (как щебень: тело в фоне + fore-часть поверх Кида) — - тогда бесплатным станет и проход Кида ПО телу, который сейчас снимает - пропуск по правилу «слоты рядом». Предложено пользователем 2026-08-08. - -Мерить в ЭТОЙ точке (комната 3, страж убит, Кид стоит) — она воспроизводима -и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать -отдельно. Метод — memory `z80_profiling_method` (брейкпоинты с -`totalcycles`); полосы бордюра показывают только одну картинку из периода и -годятся лишь для раскладки по фазам. - -**Наблюдение пользователя на приёмке DRAW-CHAR 2026-08-08:** циан-полоса -профиля (спрайты + fore) выросла — тогда «в пределах». - -**Отчего именно.** Раньше перебор тайлов у Кида шёл строго по футпринту -кадра (`char_x_left/right`, seg006:1021), а он УЖЕ спрайта; расширение -перебора окном спрайта (клинок и брызги уходят за габарит кадра) было -только у соперника. DRAW-CHAR сделала его общим — то есть у Кида теперь на -колонку-другую больше `fore_tile` за кадр. Это не регрессия «лишней -работы», а недостающая ранее корректность: тайл, который спрайт задевает, -обязан вернуть свой передний слой поверх него. - -**Если fore-проход снова станет узким местом** (сейчас он в покое не -выполняется вовсе): расширять перебор ТОЛЬКО по накладным спрайтам -(клинок/брызги), а не по всему окну; кэш «в этом тайле fore-слоя нет -вовсе»; считать окно клипа в тайловых координатах один раз. - -## P1 — берётся в любой момент - -### PERF-SWEEP. Поиск узких мест по ВСЕЙ игре, а не в одной сцене - -**Постановка (пользователь, 2026-08-18):** «пока мы тестируем на регресс -только одну сцену; надо придумать механизм проверки узких мест по всей -программе — ручной проход уровня, в логи пишутся такты каждой фазы с -информацией, в какой комнате это происходит (возможно, в каком тайле Кид), -ищем максимумы по уровню и оптимизируем уже конкретную комнату». - -Сцена 13/23 закрывает ПИК, но она одна: механики, которых в ней нет -(чомперы, бой, мышь, зеркало, толпа стражей), в бюджет никто не проверял. - -#### Чем НЕЛЬЗЯ это делать — и почему - -Тем, чем меряем сейчас. Брейкпоинты с `printf ...; g` на четырёх границах -фаз роняют эмуляцию в проценты от реального времени — **ручной проход так не -сыграть**, а именно ручной проход и есть суть задачи. Плюс две мелочи, -которые уже стоили времени: адреса зондов надо переснимать после КАЖДОЙ -пересборки (`.lst` + база модуля), а кольцо `clog` переполняется — сегодня -первый прогон принёс один «покой», каскад успел вытесниться за 75 с -ожидания. - -#### Куда смотреть - -**Вариант А — тап на порт бордюра в Lua-мосте (рекомендую).** `PROF(n)` -это `out (0xFE), a`, то есть границы фаз УЖЕ размечены в железе. -`install_write_tap` на порт даёт колбэк без остановки CPU — накладные -несравнимо меньше брейкпоинта, играть можно. Главный бонус: **тап не -привязан к адресам кода**, переснимать после пересборки нечего. «Где» берём -оттуда же: Lua читает `cur_room` и `Kid.curr_col/curr_row` по адресам из -`roomtest.map` (их выдавать в маленький файл при сборке, чтобы не парсить -map руками). Пишем CSV: кадр, комната, тайл Кида, синяя/зелёная/циан/работа, -период. - -**Вариант Б — программа меряет себя сама, в РАСТРАХ.** Тактов Z80 изнутри -не видно, но нам они и не нужны: бюджет сформулирован в растровых кадрах, а -позицию луча видно поллингом бита 5 порта 0xFE (то же, чем живёт -`gfx_wait_vsync`). Разрешение ~1/256 кадра ≈ 1 700 тактов — для поиска -узких мест с запасом. Дороже варианта А по месту в резиденте, но -единственный, который работает **на живом железе**, а не только в MAME — -а такт MAME это 2,4× номинала Z80 (memory `sprinter_wait_states_2x`), и -рано или поздно сверяться придётся с железом. - -#### Что считать результатом - -Не «дамп кадров», а сводка: максимум каждой фазы **по комнатам**, число -кадров сверх 400 000 и сверх растрового кадра 430 000, и топ комнат по -худшему кадру. Дальше — точечная оптимизация той комнаты, как делали с -13/23. - -Смежное: сцена и метод — [`../docs/perf_l13_room23.md`](../docs/perf_l13_room23.md); -фазы — [зелёная](../docs/perf_green_phase.md), [циан](../docs/perf_cyan_phase.md). - - -### T-RENDER. Тесты слоя отрисовки: «в запечку не попадает транзиент» - -**Откуда взялось** (пользователь, 2026-08-18, по итогам -[SPIKE-BAKED](BUGS_CLOSED.md#spike-baked)): «такой сценарий (и другие с -пиками) можно внести в наши тесткейсы?» - -**Что есть сейчас.** `tests-host/` — это ЛОГИКА: геометрия, физика Кида, -`Char`, спецсобытия. Отрисовки там нет вовсе (`stubs.c` глушит все блиты -пустышками), `pop_tile.c`/`pop_room.c`/`pop_bg.c` не линкуются — таблицы -деления на ширину тайла в стабах даже продублированы копией. **Ловушки не -покрыты ничем**: ни пик, ни чомперов, ни `animate_*`. То есть SPIKE-BAKED -тестами поймать было нельзя в принципе. - -**Что покрывать.** Не «картинку» (её проверяет глаз в MAME), а инвариант, -на котором держится вся наша запечка: - -> при `pop_t_bake_rest = 1` ни один слой отрисовки тайла не выдаёт -> ТРАНЗИЕНТНЫЙ спрайт — ни своей ячейки, ни соседней. - -Он проверяем механически и стоит ровно того: именно его нарушение дало -SPIKE-BAKED, а до того — мерцание плиты, ради которого флаг и заводился. - -**Как.** Новый набор `t_render`: линкуются НАСТОЯЩИЕ `pop_tile.c`, -`pop_room.c`, `pop_bg.c`, а `pop_env_b`/`pop_wall_b`/`pop_fore_b` подменяются -**записывающим** стабом — списком `(id, x, yb)` за вызов. Тогда проверка -пишется в одну строку: «`draw_tile` при `bake_rest=1` и modif пик 4 не выдал -ни одного id из `spikes_fram_*`». Тот же стаб сразу закрывает и чомпера, и -плиту, и будущие ловушки — по одному тесту на каждую. - -Отдельно и дёшево — характеризация автоматов `animate_spike`/`animate_chomper` -(сверка полного цикла модификатора с SDLPoP seg007), но она НЕ ловит этот -класс: автомат был верен, врал слой отрисовки. - -**Чего это стоит.** Не одна строка: набор тянет за собой атласы и -`pop_cd_*`, а `stubs.c` придётся разделить (сейчас он подменяет то, что -здесь нужно настоящим). Прикидка — отдельная сессия. Место в `DATA_LOC` -проверить заранее: набор линкует ещё три крупных модуля (см. грабли -раскладки в `tests-host/README.md`). - - -### QSAVE. QuickSave / QuickLoad — ЗАКРЫТА 2026-08-22 - -**Закрыта** (F6/F9, POP.SAV + POP.BAK, коммит f4b4852, тэг v0.6-pop-quicksave). -Протокол и устройство — [`TASKS_CLOSED.md`](TASKS_CLOSED.md#qsave); -формат снимка и разбор SDLPoP — -[`../docs/quicksave_plan.md`](../docs/quicksave_plan.md). - -### L1-SPEED. Игра идёт быстрее оригинала (найдено 2026-08-01) — ЗАКРЫТА 2026-08-19 - -**Закрыта** режимами скорости (`pop_pace.h`, клавиша **P**): FASTEST 3/3, -FAST 3/4, **NORMAL 4/5 = 81,9 / 102,4 мс** против 83,3 / 100 мс у -оригинала. Условие боя взято буквально из SDLPoP (`seg003.c:363`): -`Kid.sword == SWORD_2_DRAWN`. Дефолт — FASTEST (решение пользователя). -Проверено в MAME: период ровно 4 и ровно 5 растров. Разбор и замеры — -`../docs/frame_pacing_plan.md`. Осталось из исходной формулировки только -сверить NORMAL секундомером рядом с живым SDLPoP. - -Исходная запись: - -Сверка таймингов: оригинал — `BASE_FPS = 60` при `base_speed = 5` тиков на -логический кадр (`SDLPoP/src/types.h:1373`, `data.h:869`) = **83.3 мс**, в бою -`fight_speed = 6` = **100 мс**. У нас `roomtest.c` ждёт **три** `gfx_wait_vsync()` -= 60 мс, и отдельной скорости боя нет — то есть примерно **+39 % к скорости -эталона**. Соответствие: 4 ожидания (80 мс) обычно, 5 (100 мс) в бою. -Условие «делать ПОСЛЕ CLIP-1» снято — CLIP-1 закрыт. Проверка — -секундомером по одинаковому отрезку рядом с живым SDLPoP, не «на глаз». - -### TUNE-1. Параметры движка — в конфиг, а не в код - -**Что уже есть.** `pop_tune.h` — все настраиваемые числа собраны в одном -заголовке: чекпойнт уровня 3 (`POP_CHKP_*`), отладочное окно решётки -(`POP_DBG_GATE_HOLD`), включатель зацепа в прыжке (`POP_ENABLE_JUMP_GRAB`). -Правило уже действует: новое «особое событие» или тайминг заводится ТАМ, а -не константой по месту. - -**Что нужно сделать.** Читать их из ФАЙЛА рядом с exe, чтобы менять без -пересборки — под отладку («растянуть решётку, чтобы успеть пройти») и под -моды. Формат: простой ini/`ключ=значение`, парсер на ~50 строк (числа, -комментарии `;`, неизвестные ключи игнорировать), файл необязателен — -нет файла, значит зашитые дефолты. Секции по смыслу: `[level]`, -`[debug]`, `[enhancements]`. - -**Ориентир — SDLPoP.** У него это `custom_options_type` (types.h) + -`SDLPoP.ini` + меню Settings/Mods; наши имена намеренно совпадают с его -(`custom->имя`), чтобы сверка оставалась механической. Осмотр его меню и -опций — часть задачи: у него уже разложены по группам стартовые -HP/минуты, номера «особых» комнат и уровней (шадоу, скелет, зеркало, -чекпойнт), тайминги ворот и пик, скорости, а отдельной группой — -`fixes`/`enhancements` (включая `enable_jump_grab`, который мы уже -портировали). Брать всё подряд не надо: переносим по мере того, как -константа реально понадобилась в игре. - -**Оговорка по памяти.** Парсер и таблица параметров — холодный код, -исполняется один раз при старте: кандидат в банк, а не в резидент W1. - -### TUNE-2. Параметры СТРАЖЕЙ — в CFG-файл - -Частный, но самый востребованный срез [TUNE-1](#tune-1): сейчас весь ИИ -стража зашит константами, и чтобы попробовать «а если он будет блокировать -пореже» — надо пересобирать. - -**Что настраивать.** Всё, что индексируется мастерством (12 градаций, -`NUM_GUARD_SKILLS`), — таблицы в `guards.c`: - -| таблица | что решает | дефолт для навыка 4 | -|---|---|---:| -| `STRIKEPROB` | вероятность удара | 61 | -| `RESTRIKEPROB` | добить из своего парирования | 5 | -| `BLOCKPROB` | заблокировать замах | 200 | -| `IMPBLOCKPROB` | то же, когда Кид только что пробил блок | 100 | -| `ADVPROB` | наступать | 255 | -| `REFRACTIMER` | «отдышка» после ранения, кадров | 8 | -| `extrastrength` | надбавка HP (сейчас зашита как `skill == 4 ? 1 : 0`, `pop_guard_cold.c`) | 1 | - -Плюс не зависящее от навыка: `tbl_guard_hp[16]` (`pop_level_cold.c`) — база -HP по уровню, и навык скелета (`SKEL_SKILL`) / тени (`SHADOW_SKILL`). - -**Формат — как у SDLPoP**, чтобы правки переносились в обе стороны без -перевода: секции `[Skill 0]`..`[Skill 11]`, внутри `strikeprob=`, -`blockprob=` и т.д. (`options.c:439`, пример — `SDLPoP/SDLPoP.ini:562`). -Имена ключей брать ЕГО, регистр игнорировать. - -**Чего НЕ делать.** Навык конкретного стража живёт в данных уровня -(`level.guards_skill[комната-1]`, читаем в `pop_level_guard`) — его в CFG -не тащим, иначе разъедется с файлами уровней. Переопределение «в комнате -N навык M» — отдельная надобность, если понадобится, то как явная секция -`[Level N]`, а не подмена данных. - -**Зачем это стоит сделать.** Прогон 2026-08-20 (11/22, навык 4) дал -ощущение «страж тяжелее, чем в SDLPoP». Сверка кода расхождений не нашла -(протокол — в `../docs/impl_diff.md` и в ответе сессии: дистанция, -диспетчер, три ветки ИИ, шесть таблиц, `justblocked`, `check_hurting`, -`parry`, `swordfight`, порядок тиков, откат seq_74 = −10 — всё совпало -побайтно). Проверить такую гипотезу можно только подбором чисел на живом -прогоне, а для этого их надо крутить без пересборки. - -**Оговорка по памяти** — та же, что в TUNE-1: парсер холодный, в банк. - -### SND. Звук — эффекты через CBL, музыка на AY — ЗАКРЫТА ИНАЧЕ 2026-08-26 - -> **Решение пересмотрено.** Музыка пошла НЕ на AY, а тем же PCM через CBL: -> записи DOS-версии укладываются в формат железа без единого преобразования -> в рантайме (`../docs/sound_plan.md` §4). Озвучены заставка, сцены между -> уровнями и игровые джинглы — 21 трек. Единственный неозвученный кусок — -> финал `won`, см. [MUS-WON](#mus-won). - -

  • 7#)(z*l6ONd$2cC!#VW9_ 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 E12e8Lxc~qF diff --git a/applications/SprPoP/assets/packed/PV/pv.pal b/applications/SprPoP/assets/packed/PV/pv.pal deleted file mode 100644 index ec99c2b3576d76a4da8fb78b842526ccbcbfb97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeH@5tqY26oo(NPgp4I4+s>3fk2^92owT=LNHJmSO^RR3c!eQHZT)o_J^D6H|g4c>M9BIu7KU*s7Bz>u}u;}FA z^`dRbX4g~H6XV-RqZ_}MR2|A(xvmD!NyS^cc=DKeCy!Xdw4xq9h#zJYv79aJE3ubG z1harNP^d*kyy{rzNAmi1=l{~b7#AVYPqhETAUU+}mcrbK%7G+&r0;vL<$7-BcE0nw qyZHGn{*$!EoGdQCTn+51Go6{xjnlpOxyuiXpShjM`Tnmzoxm5clc+HO diff --git a/applications/SprPoP/assets/packed/PV/story.pal b/applications/SprPoP/assets/packed/PV/story.pal deleted file mode 100644 index 1cb8dc0fcaa50cb344fd9401ff29b7c1119cf165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmZQzU|?`yP+({f2w+H1C}0pU0OEiN3<3oQ7#J2jU?@27fFXfFfT6*Ffnh>|08n)U f5N}|(FhPOg!-o%GIiSGM1VI0dg3%Bd$sqs$(kv1& diff --git a/applications/SprPoP/assets/packed/README_E.TXT b/applications/SprPoP/assets/packed/README_E.TXT deleted file mode 100644 index a867d67..0000000 --- a/applications/SprPoP/assets/packed/README_E.TXT +++ /dev/null @@ -1,134 +0,0 @@ -=========================================================================== - SprPoP -- Prince of Persia for the Sprinter Sp2000 -=========================================================================== - -A port of Jordan Mechner's Prince of Persia (1989) to the Sprinter Sp2000. - -The graphics are the VGA ones from the MS-DOS release, in 320x256 with a -256-colour palette; the music and the sound effects are the digitised -originals, played through the CBL channel. All fourteen levels, the title -sequence, the story screens, the intro with the Princess and Jaffar, the -ending and the hall of fame are in. - - -RUNNING IT ---------------------------------------------------------------------------- -From the DSS prompt, on the drive the game sits on: - - sprpop - -The game needs its data directories next to the program: - - BG\ background tiles KID\ the prince - GUARD\ guards SKEL\ the skeleton - VIZIER\ Jaffar SHADOW\ the shadow - SND\ sound effects MUS\ music - FONT\ text font TITLE\ title screens - PV\ story and intro screens LEVELS\ the fourteen levels - -If a directory is missing the game still starts, but whatever lived there -will be silent or invisible. - - -CONTROLS ---------------------------------------------------------------------------- -Running and climbing - - Left / Right turn, or run - Up jump, or climb up - Down crouch, or climb down - Down + Left/Right hop - Shift pick things up - Shift + Left/Right careful step - Home or Up+Left jump to the left - PgUp or Up+Right jump to the right - Up while running running jump - Shift while falling grab onto a ledge - -Sword fighting - - Left / Right advance or retreat - Shift strike - Up block - Down put the sword away - (Shift draws it again) - -While the game runs - - Backspace or Esc pause and open the menu - Space how much time is left - T keep the timer on screen - F6 quicksave - F9 quickload - Ctrl+A restart the level - Ctrl+R back to the title screen - Ctrl+S sound on / off - Ctrl+M music on / off - Ctrl+V show the build version - Ctrl+Q or F10 quit - -F10 works everywhere, including the title sequence. Any other key during -the titles or the story screens skips straight into the game. - - -CHEATS ---------------------------------------------------------------------------- -The cheats of the original, and they are on by default in this build. You -can turn them off on the Settings screen. - - Shift+L go to the next level - + / - one minute more / less - K kill the guard - Shift+I turn the screen upside down - Shift+W slow falling - Shift+S restore one hit point - Shift+T one more hit point (up to ten) - [ / ] nudge the prince one pixel - -Two cheats of the original are NOT here yet: R (resurrect the prince) and -H / J / U / N with Ctrl+B (look at the neighbouring room). - -Debug keys of this port, which the original has no equivalent for. They -all sit under Ctrl so that no plain letter is taken away from the layout -above. - - Ctrl+I immortality: off / in combat / almost everything - Ctrl+P speed mode - Ctrl+F freeze the frame, and unfreeze it - Ctrl+D debug bar: level, room, speed, sound, timer - Ctrl++ / Ctrl+- jump to the next / previous room by number - - -FILES THE GAME WRITES ---------------------------------------------------------------------------- - POP.CFG settings - POP.SAV quicksave, and POP.BAK the one before it - POP.HOF hall of fame - -All of them appear next to the program, and all of them can be deleted -- -the game will simply start from its defaults again. - - -WHAT IS NOT FINISHED ---------------------------------------------------------------------------- -All fourteen levels have been played through. The port is still under -active development, so rough edges do turn up; the ones we know about are -tracked in the project's own bug list. - -Missing against the original: the R cheat (resurrect the prince), the -H / J / U / N and Ctrl+B cheats for looking at neighbouring rooms, and the -screenshot key (F12). - - -CREDITS ---------------------------------------------------------------------------- -Prince of Persia was created by Jordan Mechner in 1989. - -The mechanics of this port were checked against SDLPoP -(github.com/NagyD/SDLPoP), which is the authoritative reading of how the -original engine behaves. The graphics come from the MS-DOS release, the -sound effects from its DIGISND files, and the music from recordings of the -DOS soundtrack. - -The port itself is built with sprinter-cc, our SDCC-based toolchain for the -Sprinter Sp2000. diff --git a/applications/SprPoP/assets/packed/README_R.TXT b/applications/SprPoP/assets/packed/README_R.TXT deleted file mode 100644 index af46062..0000000 --- a/applications/SprPoP/assets/packed/README_R.TXT +++ /dev/null @@ -1,130 +0,0 @@ -=========================================================================== - SprPoP -- Prince of Persia Sprinter Sp2000 -=========================================================================== - - Prince of Persia ठ 孥 (1989) Sprinter Sp2000. - -䨪 VGA-ᨨ MS-DOS, ० 320x256 ன 256 -梥⮢; 몠 㪮 䥪 - ਣ ஢, १ - CBL. ୠ ஢, ⠢, ࠭ ਨ, -㯫 ਭᮩ ஬, 䨭 ⠡ ४म. - - - ---------------------------------------------------------------------------- - ப DSS, ⮬ ᪥, : - - sprpop - -冷 ணࠬ ⠫ 묨: - - BG\ ⠩ 䮭 KID\ ਭ - GUARD\ ࠦ SKEL\ ᪥ - VIZIER\ SHADOW\ ⥭ - SND\ 㪮 䥪 MUS\ 몠 - FONT\ TITLE\ ⠢ - PV\ 㯫 LEVELS\ ୠ ஢ - - - ⠫ ࠢ , , -, . - - - ---------------------------------------------------------------------------- - - - / ࠢ - 릮 - - + /ࠢ 릮 - Shift । - Shift + /ࠢ ஦ 蠣 - Home + 릮 - PgUp +ࠢ 릮 ࠢ - 릮 ࠧ - Shift 楯 ୨ - - - - / ࠢ 㯠 㯠 - Shift 㤠 - - - (Shift ᭮) - - 室 - - Backspace Esc 㧠 - ஡ ᪮쪮 ⠫ ६ - T ঠ ⠩ ࠭ - F6 ஥ ࠭ - F9 㧪 - Ctrl+A ஢ - Ctrl+R ⠢ - Ctrl+S / 몫 - Ctrl+M 몠 / 몫 - Ctrl+V ᡮન - Ctrl+Q F10 室 - -F10 ࠡ⠥ , ⮬ ᫥ ६ ⠢.  㣠 -⠢ ࠭ ਨ ய᪠ 稭 . - - - ---------------------------------------------------------------------------- - ਣ; ⮩ ᡮથ 祭 㬮砭. 몫 -࠭ ஥. - - Shift+L ᫥騩 ஢ - + / - / - K 㡨 ࠦ - Shift+I ॢ ࠭ - Shift+W - Shift+S ஢ - Shift+T ਡ ஢ ( ) - [ / ] ਭ ᥫ - - ⮢ ਣ : R ( ਭ) H / J / U / N - Ctrl+B (ᬮ ᥤ ). - -⫠ ⮣ , ਣ . -Ctrl, ⮡ 㪢 ᪫ . - - Ctrl+I ᬥ⨥: 몫 / / - Ctrl+P ० ᪮ - Ctrl+F ⠭ ᭮ - Ctrl+D ⫠筠 ப: ஢, , ᪮, - Ctrl++ / Ctrl+- ३ ᫥ / । - - -, ---------------------------------------------------------------------------- - POP.CFG ன - POP.SAV ஥ ࠭, POP.BAK - ।饥 - POP.HOF ⠡ ४म - -  冷 ணࠬ,  㤠 - - 祭 㬮砭. - - - ---------------------------------------------------------------------------- - ୠ ஢ ன. த ࠧ, ⠪ -客 ; , , ᯨ᪥ - ஥. - -⨢ ਣ 墠⠥: R ( ਭ), ⮢ H / J / U / N - Ctrl+B ᬮ ᥤ ᭨ ࠭ (F12). - - - ---------------------------------------------------------------------------- -Prince of Persia ਤ㬠 ᠫ ठ 孥 1989 . - -堭 ⮣ ᢥ﫠 SDLPoP (github.com/NagyD/SDLPoP) - -ᠬ 筮 ⥭ ⮣, ᥡ ਣ . 䨪 - ᨨ MS-DOS, 㪮 䥪 - 䠩 DIGISND, 몠 -- ᥩ 㭤४ DOS-ᨨ. - - ᮡ࠭ 訬 ஬ sprinter-cc ᭮ SDCC Sprinter -Sp2000. diff --git a/applications/SprPoP/assets/packed/SHADOW/shadow.arc b/applications/SprPoP/assets/packed/SHADOW/shadow.arc deleted file mode 100644 index 1c0f9b1f375f9c247d91e831a452069dfdf31b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233472 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 Q?CW|0>GQ{5@lxRb15et$M*si- diff --git a/applications/SprPoP/assets/packed/SKEL/skel.arc b/applications/SprPoP/assets/packed/SKEL/skel.arc deleted file mode 100644 index be05df5a3d79a3dcc613ccdd6e6ffa3860356c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32256 zcmeI5zm8=`5yr1&V_B9Ek_ED*9oy?2dnHe{8H6T7NXQZy5fL#DKt>3NzyX9LWJrjF zry$`4NO%MuU|ru=f4ZvwoIbF3MqV+!GpDPoe)Uy#pL4Ir>+9VwfB40Vw=S2<8y_0PZcobxZ= zz54{~e|_i0N0|Tgy*v89|K#>FtTEn@UoUyNy*#_Td@aXUG7cI?_$dDJPtAzCN{9)dyHXD|< zP7o)MZhzx)uVI}Wff}0=xOXyGc_cL0UOx4aYA>(Uco9(|MPZU~C7%m(f>1=WrW#g; z!~p1ylE#F<3l3k_Sx@NEC;=u;(RlSpBvkyE17J>1cs-?9g&GRmx=DClh%<;jyIyUH zuq5Vd(lOHrigYpwHYqQjB7@mZa0t0WJMz_hMqit;N7fq(X>2?eQ)5rymQPcgbHC*? z#LJg=mrq`=pWIdl6aFyTVbKbI7z+5K*p7Sx0BSeC1E9mO`x~hx;(8v46l&*{+OEV^ zt;g4K+YN{wfFmn(aoy|&D5_O}ry=R7$_&V7*2SrS3%|L8+)nH%;;1zn?1Iz+&?30b z1>~HxizNVp4}hYJF6_7#RVeP4c_Z*@_M(#{y&zI+Cx}GP%~Ws>;9QQ!H%H>QRXMI# z1bFXWTt2$rciZDGUnRP^m)+@fm4;|J&MqoX4366+#wZ>si83&c0w9IUY-n_q4DG1j zr)y>JZj7?^g|fv`H0yY@g~w=aD@S=|aVqGlsjx?Z@#X!75snnE!XOwlbP|P26~`bt z!SQqsqn>)CRc76Pp(M{!Et*nu|&d1$6jux@9 z(9FAs`Tc`Zxh}kapKBB=-{P8ZD&Bp)Nz6QcqK zmy8)vML~$P7b*)aNuq6=`i@&uSmKK@K8_tgjua3akHe;*6Z2Kf`YPdov?c9)Bp_~0 z%-WCy-3_iQ4P~@rb~TovM~Jlqo3J9QPE`D;kYxf~m9p4@3Pmh^p;ESKMeD8$A4(LvQ!tF+k%`NAAty_PDMAx0lZjezNu&K6`SRz0hXwh8;>_Taej7 zd}y|itCemii%sK`jC*vYW|r>>e&T2Yr!_l?!pLF<6{j&$G!pK{`8Us390LFr+C6gb|o+3LZ;pMoS!|0Dh5^|d;Ihx`1;6Ml~4 z4{zOkiqCWW=AF-OK8D$n*Dg{huedlWcq4|kRT<(OUEHc_FADU1GS%{l3)ZP1(L!iO)heSomT7b)>dFxV?t9r2(#NSEyP~nz#Mm4!c5xMCal*KL z9$M5s^0}HB(K$!uZPxM!Hn zUc*AlZk%9FAnfi`sZC4V@>Y^?kXAB^LWH#~VyNEq%1D z-C*itK*rK?b~<=(FHRxVbblP;3KSt z^=<+yDPdC)*X*R~a@tZwM6`EI)(>3mOjGGBCJn3W9J5Ss0Xd_)GrwonGQRoNiTi#X z#!ElQ=$SLB4$XAb_EWE#u6h7SN z|L*vCzCXTw!_V`zKkw-o|D2~^d{;jg__Ggm{>jb9M6n!n3S;jLeLuk*ymvTrgpiqZkUH1sgh`!SsjiZ4)18Y_fb7Ou z(Xo^O>S_mK9>LBEvvKOchX zh_^tsTJ~H08mhaZ-emr45ODX*MPrHuL z(q^0>HVT^}=-{x6!yszEGH|d*K16m?hB^rPm^OkS0x~$qN_~^o9d}@u_drLCHID$i z9dvIARX~yfv_r39q{GvIE^a`M5B;D(0F*1ozzT>{dW^FKE@~)N6zGCXj2ey=T2m%m zGh>T*omsN_oZy}gv31ZR-GRD0=1mRZb_%mI4S6;85?#WuJlE!79iHkSoE#^B&0%Q$ zXV?GJLk>5_Eu1@`wA+b!qRJ$zy5<_$o9&jHz1f};i_NCIWa33@Dq-|bwZ7u``i_DL zw%5H@rWLi7DdxZ=zU))z;^naWunJO2q!G^W!V#`;9m-8$x;q^7^(cLWygiq{5M$)4s^%d-7 zoH5i|?H&RIL(QxX@l7F$5cQUiCR<6R2QetPkcpKuDhce)OO{Am=oYx%3JGPBEq`WR z6GF{djpXA!Nb9L7&`#&{?xqEbQ>s0_=F7uk4;OAj8@MGF!13t~N)Fx;;ym3(cegSS z-sFi4#C2Fx3U)Hi7;3Gubh{uJYG$>lS-J;A;h^5~@nb8g^dJTW7mCU=3O;t{B^Qux zfx&Xv1vjB4S)#+D;X|l7PC}Bvb8Cr%#d|P#JBL6!oj9;AwOg)_se!_Le68QL4b`K< zd_IpifG5x%!H}#5o&_tiI;(`_+}v7d*qvkD|pBtp-ScimyjbV48wQk zp<$Dv)sJPh)_G=Dl24o#Tb7gxC3Ui2?vR~$J0mnQ{?O}2aE+{7Fr3Q8(o02pOG->f zHO4n3o`Eq(_{D&&vL+!5x~wY!_{$m1?HH)A9Ez#{RlOH0!6;eg!)kaWm_{k23$#Re zTrjLh&J6+MsC%8&42`N-$grIj4-17n-RB6pk)S1$HhaLh;;Nm9i*ZWEZp?;F8^{%k z9TNBV;igCB?Fr!XU-qX_9U;11;ZD|qz<}}VKrN^PSP21XQtUnXK-eRm&!V9 zA$kj1jIg!8SQaA|2I)EqdCTU=O76k|NS1F>5L+dWxFDQ7nhl3mM34+2b8<=uV*VY8 z#124m84I9*02O3Wc7l^b0DH)XHY+NH+(37>vOu#m!aQBrWkPO!5Uyb?U<%9j7 z5Rx+O$g>A_--O2(&CJ~k5kDi>)OqgJ1MSWl3D90t)tsu%)ltR-$I(nGr~Bwh!1P;r zTWTW`a1~gv>0*NR#m$IYf8ivUK|WAM zCE9^%ETVt7Y|}LL5@CN_OjDv56tXNMEJNc;v|^g%8ffW&Pzil(N*_&6H{xJG;s_fC z*PX8e%5qrrf&<`3HwH$}Q6oxYL$K;Ds*)l{gytU;V0HxV(Pn_S?;ju^_3z~bz6N&k BD_j5o diff --git a/applications/SprPoP/assets/packed/SND/snd.arc b/applications/SprPoP/assets/packed/SND/snd.arc deleted file mode 100644 index b4c5a585efb5c8ab124969ad4e39aaa446a765b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164352 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 B6mS3l diff --git a/applications/SprPoP/assets/packed/TITLE/title.arc b/applications/SprPoP/assets/packed/TITLE/title.arc deleted file mode 100644 index 3cf9f3355b43a7f35396ed55d7db1064bbdeb282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260608 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%0AV)jhTuLD6zj-Zofa# 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 R5N}|(FhPOg!-o%GIRN#e5U~IN diff --git a/applications/SprPoP/assets/packed/VIZIER/vizier.arc b/applications/SprPoP/assets/packed/VIZIER/vizier.arc deleted file mode 100644 index ffb7818a137cb90c983773b55ac6f3c418106d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36352 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 diff --git a/applications/SprPoP/dist/MUS/m24.bin b/applications/SprPoP/dist/MUS/m24.bin deleted file mode 100644 index b880d4b..0000000 --- a/applications/SprPoP/dist/MUS/m24.bin +++ /dev/null @@ -1 +0,0 @@ -}~~}}{|w{|vw}~{{|~}y{zywuw|}y|~{z{yyx{w{zy{||{zvy~{{|zv{{vx~}{{}~{z{{yvux}|x}~~|~z{yyy{v{{z{||zxu{{{{zy~zuy}|{{~|||{yxw{|xx|~}{{zu|}}~}yw|x|~~|y||zz~}~~~}~|vy}{x{~~~~y~}~}{w~{|{||y}~z{}|}~|v}|wy}}~|zx|}xy~|y{yy~zyy|{z|z}zw|y|{~zy~|xv{}}ysy|vuz~}{x~{uw|~~~~}{~~{~}~~||xx{|~~~zxy{z}wx~{wz|{{~}}zy|}{~wvyz}y}y~|~wu||x}~xx}|~~xzyuuxvx|{|~x}|z{zx~}}~x~z{xr{uzz|zz}~uw}{xy|~yzuy|}|qu~{~~~~|y}~w}|}|~{|z{~~vx|}}{|z{~|~y}}tu}~xyvy~z}~~}z}}{{uz{xz~y}~}||}ww}xtz}}{y|wuwv}yy~xuuwwuwxxw|w{xo{xz|xy|vy}x{v||}|yw|~||z|zwvx}wwy{us~{z{|wmjprxx{|}x|u{|okonv}wsx{vrtrkxvxz}vsz~wx}tqsx||~xnmuwu~w{{xx~xwtor|}||}t~{{vxstu}}y|~|~yw~xvyxz{ys{}uz|{wv}{~}|zvruy{|{~~y{}xwvyt|xvq{xw}~v{xu}}uxzvuuv|x}y|xwxvwyz{xuxz~zxzz|v~}|tw{|w}t~{yz|{wt~{uy}x|wrt{}~{|zvv{zvvos{~su}|yty}{wwy}{v~y|~z{wtz}|}}xx|xz{x~zwysz{{zt|vuzwvx}z{{zyx{xzz{|w}~}qv~xw{v{~y}~}vzysqwx{y}~}{|}}w|yvswy}yp{u|wxw{r~}vs|~zvz{jwzttz~{s{utzww}xjikw|wy~{|z{zr}yv~~}~xxwqxxv}z~{vs}{~}t~~}}qmrvz~touzvwpu|~unwqprmlryz~~{}xuzwy}~}uv~iglkxzx{}snlutty~~|xw}y{x}}~{z||{xyufophw~}{wu~zvxrprllvv~{wzy{psvrpaaouyyz}xkmqiiv||{}vxz{{~y~zs}tvskjmpjnsv|y~x}}zzz{}knrggopxyyyvzwljmpgchrqu{{rqs~r{wrpmurs{|xw{txrrspsx~~upyvt{zy~}}|xt{{vxnuurqvuou||}}xxz|}~}oq~stubc[etwxzqovnkf`klt}~~}urxzorujegmquuw~xyuywlkrpu}|~y~wnvu{{{|}zyqnlnqohfqq|}~}z~}}}||zv||}|~u|{|tkc^`jt~vqjpmjlleesoo~}z|}vxlv}ztovtsrrqquzsy|x}ttwxtxxz|}yrxzswzsq|{t~zx~|ry}|zwnipvqu|xx~~zstty~~z{rq|~|}wfcbchmqyst|qdgfciirq~{xtowyrmlmqnkkryw{{z}}}|sw{qox}|~~}wz}~}vqxquqvsr{vvxwsppxnprwsz{}y~{z~v|~yyop~}}{~zwyy~y}piggccewzs|spvmelnfiu}ywlxvtlmwzxxvou}yrw|urx|zz|xz{}{u|~||zquwsxvprxxv{vz}~|zxz~wuyzttzzy~sz|z}z||xqruuwsu}}vx}yvzpsrmebbkz{nkqilgikkzzzxuojllmnmq~y~|z{v}unm|~xx~}zy|vw{qpulqmww{}{||{z{yzwv|rkq|{{{~z{u~{qwot{}~|xtrnkjsut}}}xpqupnv~}zz}~}zwssknqvxww{z{{spkmz{xx|z{wzxtsvzsu{tqqrliqurv~y}|upmx}uroy}y{~yxuvqnnrx~~{yyxuqnqwvpxy}ttsqxqwzzz}|||ysmlmoqv{}~|x|ujoupqx~~}x}zuwy|~|||unsqlrnwut}|}~pltrosyzy~wz~{x{rqsvz~~}{{{zx{susu{z}y}}xy||~}vy{x|toqstuuy}}ztnnxsifhtv}}}y{|ytstv{~|xstrljorontz}|~{u{|pjhqsr{y}z||~ysnmot||}}}{xywqtxvtx{{~~x|~~~~|xwwzytrqru{zx|~{ypuyqomlkr~{|zyyywwyxruumsosuntxz|~xv}vrqnls{||{zqy}vttsrqt|z||}|~~}}}}zzwpvuopzy{o|z~yvvvsppv||z~|xrt|sghleklq~{vtstx}~|ztmmrrnmqvyyz}}z}~~{xz~}qmqkoro{{}~x{}zvtrqruvr|}}zv~~~}|~~xrnkhs~{yzvt}~}}|{zxwxztv|w~{{xr|wqkhknmnvw}{zzyyz~~yywpuqrvqswxxxwuuxzw}|{yyz}~zrlmrrqu}suzywtuvvvwy{zy||}xx~~~}|}||ujgsvuy|zq}}xxuuxyyyz}~{y}}|ysw~xprnimgiopx}~}{z|~}{utusonswyyxxwssvow~~|wuvx{}|sssmstu}~y{{yxvuuvzz|~y~~uxzyyz|~~yrjmsmjrwyzx}zvwwxy|~}|~xz}yu}{wsooqqnmqx~}~}}}}}~}z}|y{uwxuwzzxvsqomkrxvz}}|z{}}yxywttx~wuuurqrsw|~}~wvvvvy}ztyyqmlknw||}tvtrsvz~{vqr|{uuwvqtrpvtsvz~}}}}~~y~~~{xxy{{yxuqmkhqvory{|~~|~~yy{~yxwuuuwz}|yzxxwtsuy{st|wolnnlsz~zyyywwy|zwqw}ywvustwywvwxyyz|~~|{|~ws|zz~}zyyywurminrkimqvz~~~xxwsrstw{{sx|yvtvz|x~{vrolmquy{z{xvvwy}}spxxssvxuxzw{|yxxwwvwy{~{}{z{}}{ywtqmiprigkmpty}||}}|~}|ywvwz|}|{x|}zvtux}}uw~ztstpmpnpx|~~}{z{}~wz}wsrrrvyzzz{||{zxvuvuz||}|x~wvxxz}{xvtplprkhhijmry}|}{z~~{wvuvx{|||~|vz}wvy||yxxxy~}z{vsqqqpmmpw~}{z{}zy~ytsrrvvvz|||}|{yvuspq|~~~xttw{}zwvskmvpjihggjou{}{yw~~}{zyyxy}}|{|~vrrw}}}{yyz{|}x||xvsstppqoosx~~~~~yrppruvvx{~}zxwqks|y{~}}~|xutwwy|yvqlqsmjihggimpu{|tv~~|{zz{{{z{}~zx}xsqtx{~~zy{{|}|zvttuutsrrstvy~|wrqssuy{|~}{wqntvsty~~}yvvvwxz|vmpxrlkjihghjnsw|~yz~wz|z|~~}|~}|}}|{ywz|xusstw{|~||~|x}zwttuttwyxxwvvw{zvttttvy|~yqs{tnorvz~zyyvvz}xruxqmkjjijjklnsx{|~|yvxz|~~~~}zuqx~||{yyxvy~}}~}}zyvw~zwvuvwxyz|}}|zxwxyx{||{xvx{}~~yv{}upoopty~~~~}||}|v|{qlkkkkkmnpqrruy~}~{wvvx{}xrqz}xwwy{}~~}}~||}}|wqt~{zywwxxxz}}}~~}|zvrs~~y}|{{}~~xxxsqppqty~~~~}{somlllmoopprrrtxzzy~~|}{yxwy}~xqu|yuuvwz~~}}~{sow|ywwwwxyz{||}~~~~}{wpr|~}}|~}}~{x|wusrqrsw{z~~~}|uqommmnprsrrqrsuust~|{}}zyz||us{|vrrrux|~~}~}ttzyuuvvwyyy{}}}}~~~}ztrxyuvz~~}}}}}~~|wyzwvusrrsuy}|{~~~~|{{wtqonnooqrsrqrrpnls~|{z||{{}zuy~ytrqruwy~~~~~zv{{tqqsvxzz{{|}}}}}}{vpvztpqv|}|~~}}}|xx|ywvutsrrsw{{~}zv|{xurpooopqqrrrrpmjkv}|{{{{zy{|{|zz}vrqrstvy|~}~}{}zsppsuvwz|}}}}}}}|xttzwqnnrv|}}~}{wu{~zxxwvuutttuw{~~||~~{vv~~}{xusqopqrrrsrpmjgmuutvy{|{z{}}|vsrsssuy|}{yxxrpoqsuwz|}~~~~}}zusz}wqnnnqv|~~~~zuv}{yxxxxwwvwwwwx||zz|~ytw{{}}|zxvtssrrssrqmihospoquy||}}~}xuttttuwz}|ut}}wsqppruy|~~}|xtu||wtrpooqu{{ux~|xwwxxyyz{{zzyyyz{|||z{|~{wz~zwwy{|}}|zyxwutsrpkgjqpkkloty}}zxwwvwy{}zy~}z{}zwtsstvy{}~|xsw~|wuuttstux|{~zvuuwxy{|}~~~}{zywts{}}~}{zutuwz}}zxvuspkinrokjjkosx}~z|~|{{zz{{|}~|yxy}}}{yvvvxy{|~~~{vu{}yvuvvwwwwxy||wuuvxz|~~}{wrqy~zwutuwz~|ywtoijpqmjiijmpuz}y}~}}~~~~~|~zxwy|}}|zxwwxy{||yuw}|xutuvwxyzzzz|~ywvvwy{}~~{upsz{z{~{xvuuvy|}ytnjospljiijlnqv{||z~~}~~}zy{xwwz~~}{yxxyzzyuv|~yvttuuwxyz{{zz|{xvvwy{}}ytrxzwuwz~{ywvuvx{~~ysmmsrmjihiikmpsx|{{~~}~~~}zw{}zxvvwz~|zxxxxwusy|wutttuvwxyyyxxz|~}zxwwxz}~~{urvzwsrtx|~|zxwvwxz}~yrotupkihhiijlorvz~}z~~||~}zvw}|{ywvwy}~|zxwvtru}}yvtttttuwyzzyyxxwwx|}zyxy{|~~zuv|{uqpqtx|~}{zxwwxz|ysuxtnjiihiijlnpsvz~{|~|~~{{|~|xuy|{{{{yxwx{~~~~}zwtppw}zvuttttuvwyz{{zywusry~|{{|}~~{wuz~ztqppruy}}{~}|{zzz{|}~zx|}voljjiijkmoprtwy||{{|zz}}{{|~|wv}}zyz{||||{{|~ytopwyvtttttuvwyz||||{yupow~~~~~{wx~zvsrqqruy~{z~~~~~}}}~~~|y|xsomlkklmnpqrstuvvuy|{{}}}}}xy{xxxz|~~wqsxvrqqstuwxz{||}}~}{wssy{xx{~}{xuy~zwuttttuwz~}|~~~~}||zww~|xurpooopqqrrrsssqpv~}}~{~{xxxy{~~~{wz{vqooprtwyz|}}}}}}{vtw|zvtuy}}zvu{}zxwvvwwwxy{~}}}}{wsu}~|zxvusrrrrrrrrrqolmu|}}~{yxxy{}|yy|}}wroooqtvy{||}}}}{yuv|}zvtsuy~~ytw}~{yxwwxxyyyzz{}~|{|~~zusx}}{{zzyxvutsssrrrqpljnuxwxz}|zyyz{}~zvz~xspoopruwz{||}||yvtx}{wtsrsvz~xw|~{ywwwwxxyyyzzz{}}{{{}}xtv{|zyyzzzzxwvutsrrqomijqutstwz}|{zyz{|~|wv|}xtqpoprtwy{|||{yvtv||xusqqqsw|}y{}ywwwwxxxyyyyyyz{{{|}{z{|~|wv{}zxwxz{{zzywvusrqpmjimrrpoqtw{}}|{zz{|~{wz~}||~zvsqppqsvxz{{{zwtty}zvtrqqqrtx}~{xwvwwwxyyzzzyyxxwwz~|{z{}{xz~|xvvwyz{||{zxwusrolikprommoqux|~}|||}{z~~zxx{~|zwtsrrsuwxzzzyvtw||xutssrrrsvy~{xwvwwxyz{{{{zyxvtsx}||}~|{|xuuuwy{}~~~|zxusokjmrpmkklnqtx}~}~~~~}{wvwz}~|ywuttuuwxyxwtty}zwuuuuuuuuvwy}~zxwwwxy{|}}}|{yvrrw}~}|~}yvuuuwy|~}zvqllprolkkkmoruz~|{}~~|}~{xwwy}~|{ywvuvvutrtz|ywuuuvwxxyyyyz|~}zyyyz{}}~~}|zwssx{yxy|~}~{ywvvvxz|~~ztoptsolkkklnpsvz~}||z}}{zz{}~|ywutrootzzxvvvvwxy{{||{{z{{{|}|{||}~~~~}zvtv{zwvvx{~{}|{yyxxyz{}~{vsvxupmlklmnpruwz}~~~~zz~}||}~|zwtpmnuyxvuuuvwxy{||||{zywuw~~}}}}}}|xuuz|yvttux{~{z}|{zzzzz{|}~~zwx{zupnlllmnpqsuxz}~~~~}~|y|~~}}~|xsolqvwutttuvwxy{||||{zwtrv~~~}|zvuy}|xusstvy}|y|~}||{{{{{{||}~~|yy}~ztqnmllmnoqrtvxz{|{|}||~~}~{{~~~~~~~}|}~|xrnpuwtrrrstuvwyz{{{zywspqx~~~}|zwuw}}yvtsrsuw{}zz}|||||{{{{{{|||{yy}~ytqomllmnopqstuwwwx}~{zz|~~~~|}|}}~~~~~}||}}xrqtwtrpqrstuvwxyz{{zxuqpsyzyz}~}{yvv{~|xutsrstvy|}z}~}|||}}}}}}||{{{zyx{~yvsqonmnnopqrrssssv}~|zzz|~}|||}~~}||}}}zuvywspoopqstvwxyzzzywtqrvyvuux|}zwux}~zwvttsstuwz}~}{{{|}}~~~}|{zxvv{~{xvtrqppppqqqqqqopt|~~}|{|}~|||}~~|zxx}|z|}yspnnoprtvwyzz{zywtsuzyusrtw{{wvz~}zwvvuuuvvwyz}}{{{|}~~|zwtu{~|{zyxwvutsrrrrqpommsy{{{}~~}}}~{wvz}xsqoopqsuwyzz{zywtty|{wusstvz~zy}~|ywwwwwxxyyyz{|}~|||}~~{wtvz|zyyzz{{zzyxvutsrpnkmrvwvwy|~yx||xusqqqrtuwxyyyxvtuz|{xvuuuvx{~~~|yxwwxxyzzzzzzzzzzz~~~~{wvy|{xwwxz{|}}|{ywvtrplknsutstvy|~~{|}{|~~|yvtsrrstuwxxxvttx||yxwvvvvwy{|yxwwxyzz{{{{zyywvw}~{xy|}zwvvwyz|}~~}{ywurollpssqqrtvy}~}~}~{yy{~}{ywutssttuvvutruz{zxvvuuuvvwy|}zxxwxyyz{{{zzywutw~}zz}|ywvvvxz|}~~}{xurnlossqooprtwz~}|}~~~}zxxy|~|zxvutttttutsrsx{zwvuuttttuvwy|}zyxxxyyz{{{zywtsty~~{z}|xvvuvxy{}}{xuqnorsqnmmnprux{|z{~~|ywwwy|~|zywutttssqrqz{}|~|}}{{~xz{{|wx{}}{wttqluvz~z~~}v{x~z|}}xtzrosx{xssvyur}xx|{qjmuyvrmefprjgpy}|~{vyw~wqyxwy}{x{xz}z{~|}~|{||omooy{sry}}}qox~mmit{}{yzy{zwmuzxymnmq|yzy~{twzyxxxr|}~tx}spyss}qm{vtuzzxzv{}xuxvx|}|{~}y~|zrqxx}|yzz|vop|yxv~t}}y|sxzvvz|~~wy~~}|u|~|}~||utswnrztozyw|~sr~~y}~{|}{uyuvw{||{|}||yxzuwynlupp}|{||{{zpt~xxuw|}~y{|~zy~vv{}~oiurlsokpuz||}v{|~y{vx~ux{sqtlpvppsjportz|v|z{xux{}|{v~{{wzxs{{v~}}}~|z{ur{|tl|wlsqkmswz|yxyzwywwmx}wxx{{yvttyiivwptpqxwy{}yyy{{wxrz}vx{v}~{{w~qmptnirtow~{{|s~zvzs|~}}y|~y|vu||xx{zy~r|}~suxqmmly{vxvpyvzz~vivzijleadhkmllxvz|ooztkkqvqs}}zrvypklemrwuxwqvqlnswy{x~}}uo|yx}z}}yvvwyr|xxzyxu~y}|vy~zsx}ww|xvvx~zlntthldekmprrpu}zsy|trplstkibbkkuy}uy|~yw{wwwz~wz{y|vsrt{}tw}x|xtuquzxsr{v{y|{v|~~{}~|zu~{tnmxvxvyupogaacdedjtourvsvxmfiskjnmfiqnnx}{zz~}stp~~z~~|wzspysxvz|{zronmjilwr{}|}wv}ztx~~zwvw{~tvnx~w{t{||~xyux~zvtz~xu{zsqsolwukcihfifoku~{{xx{zwqnnonnozz{wv~yvxsnrvpow||zy{~~xz}{zzzxptyoegolvw}{xtxywspqtuvw~}}z||xrolhfhqmsxz|}|snrrkksxyyz}z{vqwwqosuvutv~~||ysyymdhkgolvuy}xyxx~~~zuttsst|{~vs}}z}zux~{w{|xuuvskphv~{|}||y~{y~~}}|}~{zvs{yogjpkus}|{wrooppszy~~~tr{wturlkrqlovxvsrrtsjniu~v{{~~{yz{yzwvsyyrnvutzwzwx|urtojhhikpz{{{|y||}|vt|x}~z~}y|~zxx{~yv|{v}{tnpslrosxrx||{{zvpkqyqmrsommnoqwyszy{|}u{}vuwtoowyvywwx~|ryuruxz|}}unnwunjjuwz~z|}zy{}}y}~{}~zusstx~~{y}~yw{~~{z{{wllrutkqqnqtwxy|yuy{umfjtphdclklvt}tt{pruspoqtx~{}|y{|xv{|~}~}uqy|{{w|~w|||}|{{|vlqyqmflyxzqq{wmswwxv}~}z|vvspkiqsprzxpruxsqwuutruyqjsuy}|}yy}}}y{zzuuruwvyvy}|}rqnlnginks{w}}xz~|~ww}wr}xuuvx||w{}yv|~}~{ommx|zw}|}~vvvrvrhfmmepss}|z|w{npwqllpmhjkqy|stw{xyz|zxvy|xwz|}zsuv{v|wzyvss|}vqsq{sqzyls~ytx|yvwzwyr}zyrw}wrllnmqtz~{~|{}}}wx~~zxvitux}uswvpk|rstwytqqjnyurtqutk|ms}{zt~~yrvumjlrnwx{szoenkkghoz|}ssvrrtzz}{x}tktxrq}yz~vq~}vy{|x}xo}{|urkq|qlqjilbu{ujkx}sz|svyo|u{ro|wnp}xlplhjlmwyu|{ttnfo|qklonpwz}{|tuylppiquuy{zx{}}xmpwrlhhjkklnq{yy~}yzw{~~rpswxpx{w|nqup~{{~|~}~upnvztsusxogy|{xywunmroehtpszyz~}xsptld_ecekrytx||~yz{zqsrpqu}~~~pxjg~vpzyx{wv{}}~{stvqjegpwtswqp{t{|zyyz|~|{{rz}wwvyy}{}zvvxy~}vzwy|ysow}roy{yv~~~|vvrqmmgfqy~jcswo^`b_mmvw|}nuynswx~{yupsrw~~{ypwsywonottu||zpqzv~{q{zz}}||mswpjorpp|||~z{y|}y{~xwvenyqnryy}}|{qw{{uuyyvs}~svu|umqy{~vqrmp~zy|zwtlo~t{uvv~~~~zry{{zsr||xztrrt|}}|~{wu{~vzurx~~|z{wm{|{}~x|ysvtkrl{~~~qnngpzusznpx~~{vytudkikvrop{ysinvwyvyx}vxv|zyuvkqhpxzu}~yw|{s~~v~|{{~yonxpwvq{uszoupnjo~~yyt{rxyysu|||}|wtssyt~v}z}wumsyx~~vyrqlt{y}}~~~wzyzrnxuu~y~vvxsoejolilmcmirvz}~zso~t}z}|v||}uwyw~xwvu{wywrsslvqpurhtqeolnkltzu{lsuuovxz~v}v|zqosintquw}xrhonp|u}{}zyy}~|zpuys|~z}~zyoy{m|yw{~zxnliovxwmtlk}qt~~|}~zzs{ys|zuvx}xx{t}qrtyzx|xtrt|y|}v|yrwwooxijlkjhno|zns|fgkkfkpr{~u{yz~tpwoltqsx|prtnzzw|}{zwrtox}~z{yzy{{~xtyv|~}twwxtopipwtjim_qwku|~}}xxxy}}~|}xv{}}z|~|uxzvwrpnqurxv}{{yqxqlppgmofknrpovvo|{jlnooy{xuwzmkqhhqquy|vxzwkqsp}~{|~}zw{y~{~tpunnwuvx|~uyxx}}}|wxru~|omnauynv}~zsw{sqzuu}zys{|{~tsv{x{toutrsw|zy||svxq|vmrnprosv{zzoxymllmkty{xjtztmtsmw|}}|zz{w|xxyx{~~~~~|vyorqlwzzz}yyywuurzzpjkhrwuvzs~v}~z~{s|}w~z~yy~xzwpx{xwy~z{z~yy}uusq|niokmqtv|~}{vqpqq{o|~wlpojrxyz}wx{xzy||}~lzxqglkiv~{{uuy}|~}~zxspqvvvux|o~wpwut~|ywyy|yxw|x{tysoxzxw}|||xxrx{joonntv}xxxqkghhoyzxn}|qkpjkvy}{v{~{~|{}|{|z~~}wp}qpsmr|}~|||}y~z{z|z|w{yrohorprsw|{xuxyt|w~||vyxz|}vnsutrwvv{x{~|ssplvlmopptu|~u~unkllt{}uw}tnogfnsw||yplx}{|{|}}}{}z~}{sx~xqnlchpuy~}zyy|~yz||uvz{jq|stuw{|s{zxzvpw{}}zvyru~|rzsrtw~~}{pgjllmrpw}|zxwptvsqtsury}ozxjhggnpry}xt}wtwtigmqtz{tv}}w|{y{yzv}~{zxvu{x{xv}srvrhipv{z}}}}~~~|{uz{yslq}qk|wrtux{~{}vx|}}~yuyut}}}yu|z}yrxruy~|zmlnnnpnqyy|~{vvplrrkopqrr}~xumlknroy|}pv{pegknrxx~~~|wsv}~|z{vu}~x}|}{y~{~~y~u{whovnejpuy~z|}wuv{~~{yrxsvwuvw{}{{pxypsxzz{tuvruy{~yyvtvytzwkklnnolryx{yprwtossuwv{{|ojgglooy|{zkqxpegmrw|}~{xz~x}~{|{z{w}~zxy{w~~zw~uhmvrilry}z}|ypqxrwzuuux|swwx~}z}s||u}~|}}}~|vvvy~yy~roqrrsqqzvytmttprptszy}urnoryx|onvvlinsw{}~|yxy{v||z~{}~}}}zzsgfopiiov{y}wsvy~zyzy|~zqp{~xx}|xzp}~xyuutx}tqyzrnpqqrrtzxws|wvvtxw}zuqmnqww|xnluvomqux|~|z}~|{~|~~zy{}z~v}|ofdnqlnt{~|uqqz~yzzz|~{ss}}{|xuvwy|z}xwvtw{}ts|{tsttssryw}{ruzstptsx}~{vqpqvv|xonvtnnqtvy|~}~}~v}}|y}{~|{|y~~xv~ujcemnlpuz}~x}~~{ts}|{|~~}tps{{z{}}{wwvo{}w~|xt~wuvx|}~uqsvtponnmmttvxt|ztrvty|~{z}tolmnnu{~}wpllnomorux}|{yxywzxy}{|xvspuuy{y|xrzylhghlpruy||xy~}|wlv}{{{yy~~}wwvw{~~}{xyupuvz{v{{~{nw{wwxzy}zyvrsuqnlkmssu~|sx~spsruxyu{uqpqouy}utokmqppruz~}}||}xwuwtwvv{}{wsorsvzy{{uu|rjjfdiprtwx{|vsw{|vq~{y|{~z}zvwusx~}{xuusnmv}wwz}}vp{}{ywxwx~{wvqknqokjjorrw}x~suutxy}}x}ytpnmntv||xtsmgjqqqsv}}~|vxvtwvx{~}}wsnmqquwvxvpwxljjfciswy{|~wv~|}su~|xx|{~zyyzwty|yxuoq}{y{uyz{rrwvzywwxz{zxsmouuronrusz{zxqrsrwz~~z{wrppry|zwuohjruuvx}{~~}wwwuxy{~{vsrvvx{xxuqzvlkjgcgsz{|}~ux{{~w|~}~}|zwvvuru{ywns|}|yy}}xyuryzyxz|}yxvtoovyvrprtq|{vuww{}vzxsqrtz~yvtqkjrxxxz~|{xzx{}~}zvsruvvywuprzsljjifhs}x}{x~yxz|}xxxxvx}ypz}~yww{|~x{qnvyyy{}~{zywrqx|zvtuusxutww|zuyzwuvx~~zxvsnlsz{{|||xxyw{}}|xutwvxywtowyplkkjgis}|wz~{z{|xywwyywx|yqo}||yx{}{|{oov{zz{~{zxxwtpntywtsuqxywxxzvswyvtuy|~~}zxwuqlkrz|||{yywxz{}zy||wrprrsutrnoxrkjkkihkvw|z{}{z|~}~}~~|zvy{wyz{zxz{tox||~yvxyzzv|umpw|{z|~~y~|yyywsonsxwvvtv~xvvuvz}|rrvyvuy{~||yxvrnkls|}}{{z{}{ywtttuw{ywzytpqprsrqokstlkllkjjox}vt{yv{|~~}{}|zyvt}}wxzzzyxx}zsnq{|}|yyzz{~}v{|spsz~||||~~|{ww~wxxwspljotvust{}zzxxz|wrquxwxxz~~}zz~wwusoljlt}|}yyz{~|zvttstw{|vsuuqomnponmiksnijkkklnqzztx|xy~|}~~~{{{zxvrv~ywy{{{{zz}zspx}zy|zzy{}wu|xqqrx|}|{|~}{zvz{xyywtrnmpvyxvw~|~{ywxz}wsquyz{{}}z~|xxvtqonou}{yxy{~|xutstux||wssutrpqrqpmiotljkllmnqtzyu{zvy}}~}|yvrz~wwyz{|}|{}zrpz|{yy~|{{}xy~wsqqu|~~}{xu|xwxxwutqnovzyux}{yz}ytqrx|}~~~{yzxwvtsrqqt}|{z{}~{xvwxy{}}wrqtuusqrqokiqrkjjkmortv{}z|x{~|~~}zus|}wwx{}ut~||z{~|{{|~w{|trporz|wv~yyyzzzzxtsw||w|~}|z{~{vrry~{{|zyxwwvvtu}}|{|~~{xwxz{|~~ysquyxvttspjktqlklmoruxy{}~zxz~~{uw{wxy|~~~tx~z{{~~}|yztsrqrz~ztx{xxxyzzzxtru{{w~}~{wrrx}x}}yxwwvvwwvv}}{{|{xxyz{|~|wrorwxtrrokgnrljjlmpsw{|}}yy||~{vrz}wwxz}~zv~{~~}}}}~vz}ussrqrz~{vt|~xwxyyyzyxtrv{{~}|~|yurry~yxyxwvuuvwxxz{yxxz~~~|wuuuwy|~~}ytolqwvtspmhhqniiklnqvz}~}~yvx|}~~}{wru}xuwy{}}zyyv|{|}y}~}vu}yttttrt{~zvqv}wtuvuuuutsqquz}|~~|zwtrsz}yu{wttsrqrtwyz|{wvvwz}z}{vtstvy|~~||yupkjoturolgdkngfhjlosx|~~}|}}}vw{}{|{|xsqy{uuxz|}{vuv{||y~~{vqw{tstttstz{wsrzztttutttttssru{~z~zxwtstz{wv~{tssrqrsvy|}}xvuuwy}|x{|yusrtvy|}||~{xtpljntvsokfgokfgikmquz~|yyyvx|~|}~||wrt|xtvxz|~zurt~~}zx}~ztszystuvuuuz{wrt|wssttttttuttrtz}{~}{ywvuuz{uy~xssrqqrtw{}~}yvvvx{{xy|{wuuvx{|}{}zwtpmkmsvtojeioifgiknrw|}xy{yz~~{~}wrw|wuvy{~~wqt{x{~zsu{vsstuvvvy}wrx|vtuvvwxxyyxwusy~{||zyxxxz{v|xuuttuvx{~|}zyy{~|ww{|zyxxy{||z~|ywtrooswvqkgmpjiiknqv{yz|z{~~{yu{}wwxz}yqs|yzzuy|vssuwxyyz~~wt{{vuuwxyz{{zzyuqx||}{{{{z{zx~}wuuuuvxy|~{~{zz}}ywz}}|{z{||{{~{ywusqoquuqjhomihilosw|x|}|}}|ww}zvwx{~xpv}zz}vtzxsrsuwyzzz||uw|yvuvwyz{{{{zyvs~||~|{{{|{{~y{{wuuuuwx{}}}{z{}|xvx||{zyz{{y}~|zxvusqoqutoimpkiijmpuz~}x~}}~~{}w|~xwxy||tqz}{{}xrvyurstvxz{zy|yuz{utttuvwwxxyyxux}}~|{z{||{{~|y~|usrqqrtw{~~~{yxz}~zvtvz{zyz{{yz~{ywusrpnmorqkjolgghjmqv{~xy~}}~~{|~yy~zvvwy{~|vrw~}||{vqpwuqqsuvxyyyxz}|wx|vrrrrrsstvwxyxy}}|zyyyz{{{{}z|~wrqppprtx|}yxxz|{xtruyzyyzzyx}~yxvtrqpomlnpoknoiggiknsx}zw{{z~~|z}}}z~~xvwxz{}|xtt{}~||}xsnsvrprtvxyzzyxy{zx|{trqqqqqrsuwxyy}~~{zyyz{|}|{|~}{|tqpoooruy}|~|yxy{}}{wsrty|{{{zxx{xvusrqponllnmlqmgfgiloty~~yz}yy~{{}|}||}wvwxz|~|xtx~|~}||wqouuppqsuwy{{zxwyxz~ysrqqqqrtuwyzzz}zyyyz|}~}{{||~ztqpopqtx|~|~~{zz|~{xtrsy}}|{ywz{xwutsssrpmkllpsnihiknrw|{~~xx~~z}|{{}xwxz|~yv{~z|~~yrrwtpprtvy|~~}zwww}zussstuwxyzz{z{}{{{}}zyz{usrqrtwz}~{}~}}}zwuuy~~|zw||zxwvvvutrokijrtniijloty~~xw}~z{xy|yxy{~yx~y{xrtxsppruwz}~zvsvyvttuvxyz{{||z~|{{|~}yvyzusrstvy|~z|~|zxuux}|yw~{yxwwwwwusojgkutnkjknrw|xw|}{zv{}zy{|}x{}z{}urwvqpqsux{~~zuqxxutttuwxyz{{zz}{{{}~|wt{xtrqrsvy|{xz~}{yxuux}{x{{ywvuuuuutrmhenvqljjlosx}~{wx}|}wu~{yyz|~}xx}{}wqsvqnopsux{}~~|wrq|{vtrrrrsuvxyzz{yxxy{}~ztu{urpppruy}}xvy}}}|zxwustw}~zyzvusrqqrrrqojehrtnljkmpty}|~}xwy~~zvy~|zzz{}~~~}{xv}}}~zsqusnnoqsuxz{|{ytpu~}xurqoopqrtwxz||yxwxy{}~~{wsx}xtqooprvz~zwux|~|~~{zywvutux}}z}}wusqpppqqqpmhekrqnlllnrvz}|{{yy{~}yv|~|{zz{||}|zxvx~~~}}}wqsupmnoqsvxz{|{xsqx|zwurpoooqsuwyzzxwwxy{}~{vtz}zwtqppqtw{zwvx}~||{zxwwvuuw|}{zvtrqppqqqqpmhgmpoonmnptx|~{}{zz|~yx~~}|||}~~~}{xv{~~}}|wsvupnnprtwy{|}{xttyzyxvtrqqrstvxy{{yxyz{}{ww{zyxvsrrsvy||ywx|~}}|{zyyxwwwz}}}{xvtssssttsqnijnnnooopsvz~}}||}zz~}}~~}yx}~}{wvxupoopsux{|}}|ytvyxwyxvuuuuvwxyy{}{zz{}~{wy{xwxwutuvx{~|yy}}~~|{{{{zyxwy{{~{xwvuuuuuutrnjmolmpqqsuy|~}~~{}{|}yy}{yvxztpooqtwz|}~~|xuyzvvxyxwvwwwxyyy}}{z{|~~zx|{vvxxvvvwy||yy|}}||{{{{zywxy|{xwuuuuuutsplkonklorstwz~~~}|~z{~~zw{{xuvzxrooprtwz|}}|zvw{xtuxxwvvvvvwxyz~{yyz{}|xz}xstvwvuvxz}}{yy|}|~|{zyzzz{zywwy|xvtsrsssssqnknqmilpstvy|~}}}|~~||y{}{yvw|wsrx{upnopqtvyz{{zwv{{trsvvussssuvwy~~zxwwxz|}~~|yy}{tqruvuuvx{~~{zxwx|}{~zyxwwxxyzzyww{~xurqpoppqqpnklqojilqtvwy|~~|z}||~|{|~zx{}|{ywuu{}xsoszyronoprtvxyzywux|xrpruusrqqrtuwz{xwvwxy{|}|zx{~xrpqtvuuwy|~~|zyxxy|||{xwwvvwxyzzyvv}|wsqonnnooonlkosniimrvxy{}~~|yy}|}{{}|~yx{}|zxvtv~|vpntzxroooprtvxyyxvv{|wrpqtutrrrstuw}|yxwwxz{|{zxy}}xrpqtwwwyz|~~}{zyyy{}{yxwwwxyzzywvw}yurqpoooonmlnrsolkmsxz{|}}}{z|~~}{|~|z|~|ywuuy{vqotxxurqqrtuwwxxwwy}}yurruwwutsstuy|zyyzz{{zzy{~~zvsruxyzz{|~~|{zz}|{zzyyyyyxwvx}}yvtsrqponmmorsqonosx|~~~}{}}~|yxx{~zvsrtvwwvuuvwwxxxxwxz||zxvuwxyxwvuvx|~}||{{{zzz|}}{xuuvxz{|}~~|{zz{}~}{zzyxxwwvwz}|zwutrqpnnoqrsrqqruy|}|~}zyz||yvtstuvwwwwxxxxxxxxy{||zywwwxxxwwwxz~}||{zzzzz||{zxvvvxy{|~~}{zzz{|~~|{zyxwwwwxy|~~|zxvtrqpooprsssrstwz}}}~~|zz{}}zwuttuuvwxxyyyyyyxxyz{|{zyxwwwwwwwxz~~}|{{zzzz{|{zywvvwxz|~}|{zzzz{}~}{zxxwwwxy{|~~|zxvtsrqppqrsssstuwy|~~~}|{z{}}zxvuuuuvwxyyyzzyyyyzz{{{zyxwvvvvvwx{~~}||{{zz{{{{zyxwwwxz|~}|{zzz{{|~~}{zyxxxxyz|}~~|{ywutsrrqrssttuuvwy{}~~~~}|{{{}~}{yxvvuvvwwxyzzzzzzzz{{{{{zyxwvuuvwx{}~}}|||{{{{{{{zyxwwxy{}~|{{zz{{|}~}|{zyxxyy{|}~~}|zywvutssssttuuvvwy{|~~~~~~}|{{|}}{yxwvvvvwxyyz{{{{{{{||||{zyxwvvvvwy{~~~}}|||||||||{zyyxxxy{}~}|{{{{{|}~~}|{zyyyyz{|}~~}|zyxvuuttttuuvvwwxz{}~~~}||||}~|zywwvvvwwxyzz{{{{|||||||{zyxwwwwxy{~~~}}|||||||||{{zyyxyy{|~~|{{{{{{|}~~~~}|{zzyyyz{|}~~}|{zywwvuuuuvvwwxxyz|}~}||||}~~}{yxwvvvwwxyzz{{||||}}}}}|{zyxxwwxy{~~}}|||||||||||{zzyyyz{}~~}|{{{{||}}~~~~}|{{zzyzz{|}~~}|{zyxwvvvvvwwwxxyz{|~~~}||||}~|{yxwwwwwxyzz{{|||}}}}}}}|{zyxxxxyz|~}}}||||}}}}}||{zzyyz{|~~}|{{{{|||}}~~}}||{zzzz{{|~~~}|zyxxwwwwwwwxxyyz{|}~}||||}~~}{zyxwwwxxyzz{{||}}}}}}}}|{zyxxxxyz|~}}}||||}}}}|||{{zzzz{|~~}||{{{|||}}}}}}||{{z{{{|}~~}|{zyxxwwwxxxyyyz{|}~~~~}||||}~}|zyxxxxxyyz{{||}}}~~~~}}|{{zyxxxyz|~}}}}}}}}}}}}}||{{zz{{}~~}||{{||||}}}}}}||{{{{{|}~~}|{zyyxxxxxxyyyzz{|}~~~~~~}||||}~~|{zyxxxxyyz{{||}}~~~~~~}}|{zyyxxyz|~~}}}}}}}}}}}}||{{{z{{|~~}|||||||}}}}}}|||{{{{|}}~~}|{zzyyyyyyyyzz{{|}~~~~~~}||||}~~|{zyyxxyyzz{{||}}~~~~~~}}|{{zyyyyz|~~}}}}}}}}}}}}}||{{{{|}~~}|||||||}}}}}|||{{{{{|}}~~}||{zyyyyyyyzz{{||}~~~~~~}||||}~}|{zyyyyyzz{{||}}~~~~~~~~}||{zyyzz|}~}}}||}}}}}}}}|||{{{||}~}}||||||}}}}}|||{{{{{||}~~}|{zzzyyyyzzz{{|}}~~~~~~}||||}~~}|{zyyyyyzz{|||}}~~~~~~~~}||{zzzz{|~~}}}||}}}}}}}}|||||||}~~}}||||||||||||||{{{{||}~~~}|{{zzzzzzz{{{|}}~~~~~~}|||}~~}|{zzyyyzz{{||}}~~~~~~~~~}||{zzz{|}~~}}}}}}}}}}}}}||||||}~~~}}||||}}}}}||||{{{{||}~~~}}|{{zzzzzz{{||}}~~~~~~~}|||}~~}|{zzzzzz{{||}}~~~~~~~}||{{zz{|}~~}}}}}}}}}}}}}|||||}}~~}}}|||}}}}}}|||||{{||}}~~}}|{{{zzz{{{{||}~~~~}}~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m25.bin b/applications/SprPoP/dist/MUS/m25.bin deleted file mode 100644 index ec33c2b..0000000 --- a/applications/SprPoP/dist/MUS/m25.bin +++ /dev/null @@ -1 +0,0 @@ -t}vx}zx|zwq|q|urtsvo}~rz}v}v}~}z{n}yt}{yyzrs}rp~|wyzt{|~{x}uq{sxypzz||r~m|{s{|}v{zy~}{{|zwvrw}x{z}yn~|ny}}}t~r}|uyz{v{p}sxqz{~ursxys}zy~u~w||pus{yyzqvzqt~|~x~zw~}zx~ys|sw{rt}{ys~n|}xrzy|zy}|z{x}tqu~y~|z||o}|~~pz}}~wv|}v~|zt}p{wtp~~qyq~wy|p|y}v}|}~y~zzz|ox}wy{}xtw|xt~||}}vu{~yzyr~v{yuxy}vrw~t~vtz|~v}~|~wzztsrz{y|r{|z}sz}~~}{z{~x{~|v~ry|vo~{s{r~wx~p}||w|{zx}xz|ox}wz{}zv~uyyx|{|y~v|y~xty~s|xx{wt{{r~sw{}}w|{|~rr}xynj~kz}wpqkt~~uupxyw|{uss{}~~{p}~ztqzvl}|c}or{yuyyzwx}xzzneyr{tx~niks~tt{|yu~{~y{}xzq|vt}wzzp~yy}|xt~ywyrr|{y{z{~uzqvxkyx}qfzyqxtrr~}~v}}~{xwytvzpxh||w|qsy|tltvzxwssukpx}m{n{pzy|~}yk{z{}}{t|ylo|x|}{vz{yvw~{}qr}{xvs~uly{{x{~yq}n{|okqs{o~tz~z|pzlv|~~{|}z}vw~p{}}{}~{q~ttqj|sw|yvzyswsk|u{{x|z{vmz}}|~{wl|qy~twut}{{p{uzt}xvo~vg|y~oyrruk{{~wy}{vtt}|oyr|lx}ny|rn}v}t||~x~u~zxvx|{iy~|zxln~{zt{mp|~nv|{~|tquy{xnxx{{yvx|{}}{{}}{~~ryuw~vxqsiv~yxxprs|lwysy|mulzfpztu}iwrw}rsn~z{zt~~fz||y{kf~ruvywxzuyrusvoyuu{riu}}q{pw|xq~jyx|}vysy~wq~ruidz~~r~wxn}sk~{rr_u~hwozz}iozl~xz}kw~~}z{|q|mq~wuzq|yqrvzsip|rluovruyx}uukklur{uu}y}zrzz{ipdxulp|||zfpv}zs~~sxpqryoyxwxox}wcttrzzvnysv~wwv}|{~xtsz}|{~v}p|}}~wss~t|{|swt{|{vvu{n|vxn~n~pq|wmz~vwvpx{oxqw~on|mzu{x{~x~w{}n{sys{~t|ykw{~yvytytryyr~~hutxvs{{|nyy|}ww|{zzy{}xwvu{t~roowszusuv~}xrny{{zuz{xzhrnt}py|y{zzs~yuwv{s}{{zxvxxv|zoqphnj[ZYraZjcwsuu|z{ytnpsco[dxyxjhfmf_|~jy~siw}sfp}qjond`cytv|mefjieq}{yvzpzn{j|fmqSkr|x}~~yxm}k|l|vxsx~id^gagtw~wqzuvfzt^leszyzqpqzn}{tkdb\liuyv|rydj{lbqpp{zvg]WRisripfne^lX_o_nombak^~fapiiZ`hff[VlgNWqqiwwwznqv|qxjokpq\rmrfjmYllfrqtt|yssjqvl]`ktnl}|~vopXdxflktww|oo|uowu|vsmt|nubcxnpttyphkfnW]mngiu[f^gpanmascldsud{knfoxewzoxokqx{}}wrr|yvrsiso}oamlrv{u}wv~}w}lxwlo[tgeslsp~~zy{mn^WaNNVjnyiimqW[noietugvm_oie]]m_mbeubvusplseoyrdeai_Tee`WSXlpv}y~}ycnx{lh|srtuxrsismatjru^tovt|spoumeUbpjei}xouqy}v~juih\`rhv|}ppqimaTa`khz~r~}otvnxghtkk^or`lZinisinjmtn~xz{wtv~upq~vyv}{zrfnccmktlmwk}z|~ytyxusgrxpnt{|x{{vl}|yz}y~wy~qz{x~}s}xjmqxqfpj}wprw|um}~yzu|mmasygtcrxq}ruzp~yrwvjy~wkak|w~klqwvvrt}~nt}z}s~qgqyun{x|y~rfpvqnnsioykowkc]yzqpz{~xu}|slrfdttu{uxnamtfeik^bi\ch]SMfVYdN_^^kkdYekhtwwsp}~vxv~tp{wxsyy|~zxpxx|xwy}|t}{lv|l[dzhsogxru}zvty~~ns}ruw}uhXZUGO[eaZpk~||w~trzo`UkhYeYfoiosrhjqmwvk_jzqbt}mlo}{~~~|v|wkdi]Yfnqemrn}zyy}z~z}u{wxvmzttthnnr{xsm{zxv}ty|zvk_e`U^eia`shyw~|sqxxorzphjifmxnorh\Zpfcp`egamwmajjcoyrh^lrkft{pfdqqs{oo|z~y{w|}}v}}vxnhoqk^mmu{rtwmluzmnsutzvnvsaVhhSdc`kddqwqovsmurjckti_`mf^Zahbdmickusrznx|msmx|ru{||s~{nv||wleha[imdVcldvkv~qpzyjgktxihlsgbgkhp|qqwslslu}t|ywxsx~rpu~xy~}vtyo{rs|yz{|}{t|~~~~{{y~yt~owtnpjfmqlbstl}q|wrszukkmqy|trqkdmxgprhqsls~}z}~y~y{y|yx{ysv~|wqu{}xpcltujfptuohff`^b^TTibq{x}yzn}vt}xxzu|vv|xwvtzwxvsxzsitt}}|~~xzuwtv}wu|}y{~zxyvrq}xpr~yzxuz|xy~w}~|vzus{zufhnrphcedceb\Zhhawrx||zwxymihkqsmlohaipaek`djcbkmmqsomkebfvvpko}{wstsqvwx}}{||xzwz}~ytsokljcaqrm}|~}zxy~zurkgnr`ck_ckgfostwzvrpkghrpkddnnkgeb_cghnwwqx~rz~py}yzyw{}qnuwviglppkhifbcaZ[llfyqszz|xx{zuty~qpr{xnjjnuzvttpox}ox~uyzw~~yy|~{y{|{}ytw}~wy{y~zx|~|~~~tx~xmpuyxuturqqkfn|szy}|ssv|ulhhlqpmkihnwngusowwpsz}~{xyzsz~zvrnotvx}z}{|}y|xsmknqpkcbmqsidinplhgfeeb]^pyrx{{|||zy}z{~yw|}|}}{ztpw|~~ww{{xvuyyp|zs{}usxz|~}zvrpr|{tpy~zwstx{x{xwyt|~{xx{}zsihprpf^afihghigfc_cqqj{zt|z}{snorspmlkowuipvklsngkosxzwsmjmu~ztps~}yxz~~}zy}}~~|tnsz}|rorvwusrokf`_itlt}yvuz|pkumgqumjoty|}yuqorzysmhnuvtplhimqvwqmv|rvvt}}xpqwyvkefillllkgd_]eogevrn{{xwxz{}xwzyropsusrpqw~yq{|sxzuw||zy|{y|rqtxz{||zwsptx~}~~~xsw|~|rmmpstuvtpkffownpyw{yzzrmlnnljjmswoitumrzvqsx}~zvuxyrsz}|ytpoquy{wqu~xt}stz{yuqnnnke^\bhlibadhjkkjgc^Z_kohv{xwz|~|xrpx|w}|||zxxyu{wt||uqsvxyxuqpqw~}wrpv|}zwtux|~{srzzqv~unrx{{ywwvtoidgmome_^adfghgea^`jrkjxxs}{zzywutw|xqz}srzyroquxyxurru{~zut{~~~yz|{wz~}~~|{yvqkintxxrllmopqqojd`cnups{ry}srz{urtw{}|yvvx}~xrosxyxvsrsuxxtnpyyqwytx}xroquvtmgffhikkjhdbeosklzxrx~~zz|{wuutsstx~xs|wv~ytux{|{yxy~}}~{vtx||zrmmoruwxwusrx||vqpuxyunihjloppoljjqzyqy|y}yy|{vrpnmlmouyvor{yrx|vtvyzzwusux}|vpllquvtrqrtwxuppxzqpzwmkmonligfc`[Y]dikgb`adfghfda_cnwtu~}wuvxyz{zxuu{|~}|zz{wx}tw}|uqqsssrpoqv{{wropuy{zxwxz{ytnnvwnmvumimqssrqpmidachjje_\]_acdecbbhrvpo|y{~}||}{wzx}wvwxyxwwx|}yx}}~~~{{{vuwz|~~}zy{}yz~~{}ywyzzxvsqmhefkqutpljklmmkifceltsnw|~wzzwxz|~}}}{vvz|}|{yyyywrnryxps|ztsw|~~~}|yuqpswywrlhghjjjigefltsloz{tv~}}~|zyxy|~vwwv~}xvvwwwvwz~}yy}{|~z~xy~|xtqswzzwqmlmoqrrqpqv~}z~~|~}yurqtxywrmjijlllkihkrxuos}|vx|{~~zwuttux{|xqs||tt||wuuvvuttvy|{vpkikoqrqppqqpmjltwpmtwpihjkjhfc_\XWZ`ehhda`acdedb``dlpmlw~}ywwxyyxvuw}||{x{uz}xsrqqqppruxzxtomorvxxxxwwuqlkquqilsrkhilnnnljgdabeikjfa^]^_abbabfmsrlp{}xx~||{zzz{|~}{}~~~}~{yz}}xuuvwxxxww{|}xuux{|}~~~{xzx{wqppqpnljgdcejpstqmjiiiihgeeipuuqw{~~~zz|~~}|zxsopv{vps{{uqsvxyyxwtqoorvxwsnkiiijjjjkouyvpt}yx}~~}xy{w{}ywwvvwx{~}ywy|~zwy{uz~xttwxyxwuronoruwvsomlmnopqqty}|}yyz{{zxurpopsvwuplihhiiiijmrxytqx~xy~|zz}~|zz{}}wuz~ww~|xvusrrstvwtpjfefilmnoooolijpuskjoqjb_^___^\ZYXZ_dikjfdbbbbbaacgnuvsw~~}|}|xwwwwxxx{}y|xv{}yusrqqqsuxyxupmlnpstuutrpmijospihnqmgdefggfeca``cfiigda__`abcdglrvtps|~{~}~~||{|~~~}{ywwy|~{wutttuuvwz~|zurqsuwxyzzywuux~zuv{{tnjiihgfdbbcfkorsqnkjihhgggjoturqz}{wsqsx{vpqx{wrpqrtttsqpopsvxxuromlklllmptyzvrv~|y{|y}{x{|zyxyy{}}zwuvxz|}}}|ywtuz~|usx}{vrqqrrrqonmmpsuvuromllmnopsx}{|}{xwxxwvtrqpqsvwvsoljiiiijknsvvqos{|xuw|}||~~yx|{x{}zxwvuuvwwtplheefhijkkjigfinrqkhlpnhb_^]\[ZXWWY]bfiihfeddcccceimqpmoy~}}}|}~~}||}|zyxxyy{}~|}~xx}|ywuttuvxyywsomlmnpqqqpnkihlqqlghmplhdcdddcbaaabehijhfcbabbcegkpttqot|}z{~~|}{zzzzyxwvvxz}~~|yvuttttuw{}z~~{wspopqstuuutsrty}}wrrwwsmhedccbaaacfjorsrpnlkjiiijmquusrx~|yvsswzzupqwzwspoppqppoooqtvxxwtrpooopqsvz}|xvz}}|{~~yy~~|{{{|}|zwutuvxxxxwusrsw{ztprxzwronnnnmllklnqsuutrpoooprsw{~~~{}~yvttssrponoprtutromkjjkkmosvxuqqw}}yvx||||~}z{{y{|ywutssssrolhdccdfgijiihghkpqmfehkic]ZYXXXXXY[^bgjlmkigfeeefhkptvtty~{}~{z{{{{{zz{}}{zz{{}}}{xy}~{ywvvvwxyxwtpmlllmnonmlihhjnplfejnmiecbbbbaa`abegjjjhfeddeghkoswwtru}}}~}{~|yxwwwwvutuwz{||zxvtsttuwy}zz~}}}}{yuqonnoqrsttsrqsw{ztoostpjfcbaaa`aacgkoqsrpnmkjjjklosutrsz|ywvy||wqqvywspoooooonnoqsvxxwusqpppqrtx{~}ywz}}~}~z|~|{{{|~~{yvttuvwwwvusqqswzwqorwwsomllmllkkklnqsttrponnopqsw{~{}{}{wuuttsqpooqrtuuspnlkkkklnquvuqosz{xuux|}|}}}~z|~{ywuttttsqmjfdddfghiihgfgjnqnhehkjf`][ZYYXXXY\_dhjkkihggffghjmqsqorz||~zyyyyyyyxy{}}|{z{{|~{z}|zxwwwxyyyvspmlmmnoonmkihhkoojefkmkgdcbccbbaabcfhjkjhfeeefgikosvvsqv|~{|~}~{}|ywwwwvutttvxz{{zxutssstuwz~~{x|~~~}|{{{{yvspmmnoqrsssrqpruywrmmqqnhdbaaa``abdgkorsrqomlkkkkmpsvvtty}zxwz}|vqrvywronnooonnnoqsvxxwutrrrrsuwz}{y}~{{~|{{{|}~~}{xussstuvvutrpoptwvqmotusolkkkkkkjjkmprttsrppppqrtw{~~~|y{|wtsrrqqonnnprtttrpnlkkllnpswxurrv||yvw{~~~~~|y{~}zwtsqppqppmjgeddeghjjjjhghjnojdbege`\YXYYYZZ\^aeilnnmkjhhghhjmrvwvuzz{{xwwxxxxwwxz}~}|{{|}~}z{}zywwwwxyxwtqnllmmnnnmkiggimnkfeilkhdbbbcbbbabcfiklkjhggghiknquxyvtw~~~~}~}y|~zwvvvuutsstuxzzzxvusssstvx{~}yy~~|{zyyyyxurommmoprsssrppptwvpkknolfca````aacehlorsrqomllkklnqtwvtu{~{z|~ytswywsponnonnnnnpsuwxwutsrrssuwz}{y}|}}|{||}~~}zwussstuuutsqooqtvtompttqmkjjkkjjjjkmprssrpooooprtw{~}{}z{~yvttssrqpooprtutsqomllllmoruwurpty{xuvy|~||}ywussrrrqomigeefghjjjjihhjmolgdfihd_\ZZZZZZ[\_bfjlmlkjiiiiijlortsqs{|{|xwvvwvvvvvxz}}|zzzz{|~}|~{zyyyyzzywtqommnooonmkihikonjffkmkgdccccccbbcegjllkjihhhijlnruxxutx~}}~}~}z{~zwvuuuttsrstvxyyxvtsrrrstvy|~|ywz}}|zxwwwwwvtqnmlmnpqrrrponortsmiilmiea`__``aacdhkoqrrpomllkllnqtwwuuz||~yuuxzxtqoooooonnoqsvxxxvutttuvwy|~|}}~}|{{{|}}|zwtrqrrssssqpnmnqtsnklprpljiiiiiihijknqrsrqpoopqrtwz~}|~}~{xz~~{wtsrrqqponoprtuusqonnnnopruxywttx}}zxy|}z{~~|yvtrqppqqpoljhgghjklmlkjhhjmmidbdfea][Z[\]]^_adhknppnmkjjjjkmoswxww{~yz}|yvutuuutttuwy|}~}|zzzz{{}|}~|zyyxyyzyxurpnnnoooonljihjnolgfjmlifdddddddddfhkmnnmlkkklmoqtx{{ywz~}}|yz~|xvttttsrrqrtvxxxvusrrrrstvy|}{xx}~|~}zxvuuuuuuspnllmnoqqqqonmmprqkggjjgc`___``abcehkoqrqpnmllllmoquwvuv{}xwz|zvsqqppppoopqsvxxxvutttuvwy|~|~}||{|}}}{yvtrqrrsssrpomlnqspljmppmjhhhhhhhghiknpqqponnnopqsvy|~|y{~~}yz~|yvttssrqpppqsuvutrqoonooprtwyxtsw|}{xx{~}}|ywutssssrqoljhhiklmmmmkjiknolgdfhgd`]\\\]]]^`bfilnoomlkkkkklnqtutsu{|{~~zwuttttssssuwy{|{zyxwxxyz|~~}|{zz{{{zxuspoopppponmkijlookghkmlhfeeeeeeeeegilnnnmlkkklmoqtxzzxwz~}~}yz~|yvutttsrrqrsuvxwvusrqqrrsuwz|{xvz||~~~{xvutttuutrpnllmnopqqpomllnpoieehifb_^^_``abcehkoqrqpommlllmoquwxvvz}xx{|zvsrqqqqpppprtvxyxwvuuuvwxz}}~~}|{{{{||zxvsqppqqrqqonlklnqplijnomjhggghhgghhjmoqqqpooopqrtvy}~|{}|}{xy|}zvtsrrrqqppprsuvvtsqpppqqrtwz{yvvz|z|~}z{}}{xvtrqqqrrrpnljjjkmnnnnmkiijllhcadfda^\\]^_`abdgjmpqqpnmlkklmnqtxyxx{~zz}~|xutsssssrrsuwy{{zyxxxxyz{}}}{zzyzzzzxvsqoooopponmkiiknolhgjmligeeefffeffhjlnoonnmmmnoqsvy||{y{~|}{xz}}{wuttsssrqqrsuwwwvtsrrrrstvy{|zxx}~|~~|}}zwuttsttttrpnmmmnopqppnlkkmnmhddggeb_^^_`abbdfiloqrqpnmmllmnoruwwvw||{~}yvtsssrrqqqrtwxxxwvuuuuvwy|}|~~}|{{{{|{zxusqqqqrrqpomlkloqojiknoliggghhhgghikmopqponnnopqsvy|}{y{~{{~}zwvvvvuttstuvxyyxvutssstuvx{|{xwz~{|~{|~~|zxwvuuvvvtspnmmmnoooonlkjknolhfgjjgdbbbbcccdegilopqponnnnnopsuxyxvx}~~}zxxwwwvvuvwxz|||zyxxxxxy{}~|~}}~|{zzzz{{zxvsqppppqppomlklnpplijmonkihhhhhhhhijmopqqpoooopqrtwz||yx{|}|zxxxxwwvvwxz{||{zyxwwwxyz|~~{z}~~|{}~|zyxxxxyyxvtrppppqqqponmlmoqpliilnmjhggghhhiikloqsssrqqqqqrsux{||zy|}}}zxxwwwvvvwxy{|||{zyxxxyz{}}|~~~|{~}|{zzzzzzzxvsrqqqqqqponmmnqrqnklpqpnlkkkkkkklmoqstuttsssstuwy{~~|{~|}}zyyxxxxwwxy{|}}|{zyxxyyz|~~{{~~}}}|yz|~}|{yxxxxyyxwusqppppqqppnmlmoqqnkjmopnkjiijjjkklnprtuutssssstuwy|~~|z}~~|{zyyyyyyy{|~~~}|{{z{{|~}}}~}{{}~}|{zzzzzzywusrqqqqqqponnnpsspmlorrpnlllllllmnoqstuuuttsttuvxz}~~|z|}~~|{zzzyyyyz{}~~}|{zz{{|~~||~~~}|z|~~|{{zz{{{zywusrrrsssrqpoopstspmnqsrpnmlmmmmmnoqsuvvvuutuuuvxz|}~|z{~~~}|{zzzyyyz{|~~}|{{z{{|}|{}~}~}~~{{}~}||||||{zywutssssssrqqpqsuvspoqtusqonnnnnoopqstvwwwvuuuuvwy{}~~|z|~~~|{{{zzzz{|}~~}|{{{{|~|{~~}~~}}}{{|~~}|{{{|{{zxwutssssssrqqpqsuuspopstsqponnnnoopqstvwwwvvuuvvwy{}~}{z{}||{{{{{{|~~}||||}~}|}~~}}|{|~~}||||||{zxvutsttttsrrqqsuvvsppsuutrpppppppqqstvwxxwwvvvwwyz|~~}{z}~~~}||{{{{{|}~~}}|}}~}|~~~~}}~{{|~~}||||||{zxwutttttttsrrrtvwvsqqtvvusqqqqqqqrstvwyyyyxxwxxyz|}~|{}~~~}|{{{{{{|}~~}}||}~}|~}}~~|}~{z|~~}}||||||{zxwuuttttttssssuwxwtrsuwwvtsrrrrrrstvwyzzzzyyyyyz{}~||~~}|||{{{|}~~~}}}~~|}~}~~~~}|}|zz|~~}}||||||{ywvutttttttssstvxxurrtwxwusrrrrrsstuwxyzzzyyyyyz{|~}|}~~}||||||}~~~~~~}}~~~~~~}|}}{{|~~~}}}}}}|{zxwvuuuuuuttttuwyxvssuwxxvtsssssstuvwyz{{zzzyyzz{}~~|{}~~}|||||}}~~~~~~}}~}~~~~}}~|{{}~~}}}}}|{zxwvvvvvvuuttuwyyxvttwyyxvuttttttuvwyz{{{{zzzzz{|~}||~~}}|||||}~~~~~}|~}}~~~~}|}~{{|~~~~~~~}|{zxwwvvvvvvuuuvxzzxutvxzyxvuutttuuvwxz{{|{{zzzz{|}~~|{}~~~}}}}}}~~~~~}|~}}~~~~~~}|}~{{|~~~~~~~}|{zxwwvvvvvvuuvwyzzxutvxzzxwvuuuuuuvwxz{{||{{zz{{|}~~|{|~~}}}}}}~}|~~}~~~~~~}|}|{|}~~~~~~}|{yxwwwwwwvvvvwxz{zwuuxzzzxwvvuuvvvwxz{||||{{{{{|}~~||~~~~~}}}}}~~}}~}~~~~~~~~}|}|{|}~~~~~}|{yxxwwwwwwvvwwy{{zwvvxz{zyxwvvvvwwxyz{|}}}|||||}~~||~~~~~}}}}}}~}}~~}}~~~}~~~}|}~|{|}~~~~~~}|{zyxxwwwwwwwwxz{|zxvwy{{{yxwwwwwwxyz{|}}}}}|||}}~~|}~~~}}}}~~~}}}}~~~~}}~~}||~}{{|~~~~~~}}{zyxxxwwwwwwwxy{|{ywvxz|{zyxwwwwwxyz{|}}~}}}}}}}~}|~~~~}}~~}}~}}~~~}}~~~}||~}{{|~~~~}|{zyxxxxxxwwxxz{||zwwx{||{zyxxxxxyyz{|}~~~}}}}}~~~}|~~~~~~~~~~}}}}~~~~}}~~~}|}}{|}~~~}|{zyyxxxxxxxxy{|}{ywxz|||{zyxxxxyyz{|}~~~~}}}}~~}|}~~~~~~~~}}~~}}~~~~}}}~}||~~|{|~~~}|{zyyyyyxxxxyz|}}{yxy{|}|{zyyyyyyz{|}}~~~~~}}}~~~}|}~~~~~~~~~}}~}}~~~~}}}~~}|}~~|{|~~~}|{zyyyyyyxxyy{|}}{yxy{|}|{zyyyyyyz{|}}~~~~~}}~~~}|}~~~~~~~~}}~~}}~~~~}}}~~~}|}}||}~~}|{zzyyyyyyyyyz|}}|zyyz|}}|{zzyyyzz{|}}~~~~~~~~~~~|}~~~~~~~~}}~}}~~~~}}}~~~}|}~}||}~~}|{{zzyyyyyyyz{|}~|zyy{}~}}{{zzzzz{{|}~~~~~~~}}~~~~~~~~~}}~}}~~~~~~}}}~~~}||~}||}~~}||{zzzzyyyyzz|}~~|zyy{}~~}|{{zzz{{|}}~~}}~~~~~~~}~~}}~~~~~~}}}}~~~}|}~~|||~~}|{{zzzzzyyzz{|~~}{zyz|~~}||{{zz{{||}~~}}~~~~}}~}}}~~~~~~}}}}~~~}|}~~|||}~}||{zzzzzzzz{{}~~}|zz{|~~~}|{{{{{{|}}~~}}~~~~~~}~~}}~~~~~~}}}}~~}}}}~||}~~}||{{zzzzzzz{|}~~}{zz|}~~~}|{{{{{||}~}}}~~~~~}}~}}~~~~~~~}}}}~~~}}}~}||}~~}||{{{zzzz{{|}~~|{z{|~~~}||{{|||}~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m26.bin b/applications/SprPoP/dist/MUS/m26.bin deleted file mode 100644 index a6aa344..0000000 --- a/applications/SprPoP/dist/MUS/m26.bin +++ /dev/null @@ -1 +0,0 @@ -{vspooqsvz~~|{zz{}~~|zz{{xvvwy}{tov~zyyz{|}}uv~zvtqopqtx}~sqyxz{yspqx}tu|{|{|||||{}~z}wvwy{{zyyz|sqwqrvz}zyusw{ysqwxpr}||}|xzvuwyzzywwxy{|~tp|yux|{{}ww|}xrs{||}}ztop{~}}{z~~xuuvxxwutttuwxy{}~|uqw|{~}}|~~wsw~|zzzzyvqnowzwwxy|{wuuuvusrqpqrstuwyyuqt~|vu|{yyyxurnnt~|utuwz{wtssssrqooooprsuwxvrr{yvz~zyyxvronr|}~~urrtx}|wtrrrrrponnnoprtvwvsqw}wy|zyxvsonqy}|vqprv{}xtrqrrrponmnopqsuvvsquyx~~{yxvspnow}|xqpqty~{vsrrrrqpnnnopqsuwwtqs}zx}~{yxvtqnot~}{~yrpqsw}}xusssrqponnopqsuwwtpqz{x||yxvtqnns|}{}zsppsv{~zvtssrqponnopqsvwwtppx{x||zxwuronrz|{}zspqruy~|yvutsrponnopsuwyxtonv~{x||zxwurpnqx{{~zsqqrtx}~zxvusrpooopqsuxyytomt~~{x{|zxwuspopv~{z}zsqqrsv{|ywutrqpoopqsvxzyuomr~}|y{}zywvsqopu~~{z}{tqqrsuz~zxvtsqpoopqsvxzyvplq}~}}}yz}zywvtqopt{~{z|}uqpqrty~|ywutrqpppqsuxzzwqmoy}}zz~|zxvtrppry{z{wrpprtw|}zxvusrqpqqsuwyzwrmmv}|{y|}zxvurpoqw|zz~yspoqsv{|ywutrqqqqstwyyxtnlr}|~~z{|ywusqopu}}zz||upnoruz}zxwusrqqrstvxyxuploz}|}{z}}zxvtqppsz~|z{xqnnpty~~{ywvtsrrrrsuwxxvrmmu~|}~z{|ywtrpoqw}{z||tomnrw}}zxwvtsrrrstvwwvsomq{~|||z|{xuspopu||zz~xqllou{~|yxwutsssstuvwvtqnov}|~zz~}zvsqopsz}{z||tnkmry}zywvutssstuvvvurons~}|~|z|{xuroorw~{z{~~wpklpw~~{yxwvutssttuvvuspnqy~|}{{~}yvrpoqv}~|zz}yrlknt||zyxvuttsttuvvuspnpv~|}|z}~}{zz|~~}|}~zpifhnu|~}~~}{xtttvxy{zxrkd`gzyu~~y~unhccjwvzssuwvronsz~{|urqppqsvz~{ochyv{{~}|}{xu|ytqpppt}~|wwy{{wronpwzs~wpprtuwyzzzzywridn|zx}}{{}wspmklqxvy{wz~zutuy{{xy~zrklrusqqrrqmgciy~{{|~xop~}}|}}~}|tt{}unjjjlmot~{wsrw}{tqrqlhlu~}zy{~}x~{wyypquurruz~~{z~~|}{rkloppt{|vrmjgfgilqttnggp|zy{uqs|}xsrx~~{|~z|{vrooopponoomggq~~{wrorz}|~xrqw{upligginu{|xz|yvsruyuxzwspooonmklqz}z{|wsqqsx}yruyy~~|xuqmjhhlw{urtyztnlmmjilqutstwz{{{{~zz{z|~|xtrrstvwz}xx~xokjhfhpy~|ytpljiiknqrpkgku~{y}{ww{}xqoquvwz|wronoquxyvogdkx}zwsrwyv{}|{|~~zwy}}zvspnnoprttqnq}{tpqxyz}}zvrqomkjjpy~||}}{{{z|~zvttuw{}xz~|z{}~}zyxvsnjjp{zvvy|zsljiiimtyyvqnmnrv{~yu{|}yusqonou~{z~xromkknuyzxvtronmmoprqmgelz~}}{z{~{{|tmjknt|}zwtsrrtvxwrlip}{wtru}|tsy|ywy|wwx{|xvutssstuurmily}yxz}xy}}zvrolihlt~}zwuv|}wuvz|zyxxyz|}|xuz|xwz~zvtqops{~{xxz}|tlgfhmty{yurpnmmnrw{{vt{{~}yurnmov}}volmpuz}{xusrqqqpqqrrokfgr}{xwx||{~|smjkpw~|zxwvuvvwvrnkp}}yvtv|yuuy||{{{zyxy~~wssw}|xvuuuvwwupkjs}zz~xvz~~zvrolkms|~{xutv{~}xtsux~~}{{z{|||yurv{yy}yvsppt|~zxwx{~}wnigimsy|zxtrpnnnoqsvwvss{|xurpqv~~wpmmou{}yurpppqrttspkgit{yvvz}}{snmnpv{~|{yyxxxyzywrmls}zwuw}xvx|}{xvtttuw}{urrty|zxwxyyxuoloy}zz~~xx{}}{yvsqnmou}~zwvw{}ztomnqv{}||}~~{vrry|z{~~{xussv}~yvvy|}xrmjjknsx||zwtrqpqrstspmlr}|ywtstx}}|uqoopty~}yvsqqqsttrnijozsuy{{}ww|~w}skacjckqs|}{xqqjq|}y~txqqx~vv{{~txwuwstqyx{~yppnuz{uyzkj`\kz}vvmq|ztfjnlqv}|yr{~~rqukkjhvupxwstqtoqxw{t|{{t~zuxx~{~yu}xtloj_]Z`ckzyz~y|zkY\qyr~vqdhkgjpz~zwseg|zulfmkfgejhilelqspogn}~y~|ttpyymf_beky{}h_n{s~zyw}||jm{oncgjcadly~mgw{vovtmmkqquypny{wtsjmwx|~}}y~v{wljcmsnjcaadqswtjuziry~zsvwmorjedgryzeYd~trohonfebgjoxrous|z|zqqyxy}v}ytiotqrpomirrspeox`^^g|~x{z|wzsv{tmjjqusad}vuupwxpnknpt~{xzz}~vyvmkrolpt|sip}zoruqqswyv{wtwksme^]o|ssmqxslieiiv~vb_s{ljnktwqpnqsv~}~|~urxupqs~wgissunlmqwv|wnu{qbikc[S]go|~zqt}{vtprox}~nizmgjhsytrprtu}{yyusu}{wpkqoiijrx}jg}}wrqs{}y{~yintkeZ_bdp|yw~vjirrnnlnkptq{sqrgifqzxxwy||~|uz}xrwuoomsv~hat~uzuwzrkhhor}wxyw}{kowokacc_fqxtupvvsusvswysx~pqrba[cmmnpruu}zu}zpp||ytzyrrptv|piz}qxw{|tpnsu~|psvmkbdbZY_o~oi|wqvuqttywz}vxtv{if_dlkmqtzz|zv|||ytzyqompqu~~nfutdijq|ztqmpq{w{{qqillb\\etsk{~xzwrrsxx{wv}}zkmzgbY[caaeksv}|{{~zxtrtvywo~{ggfmz|ywrsqy~|{~qvxjicgi`YTU_lvm{~xvu{}~normb`ecacgqv{stklzsx{uplmoqzyyxrmhdftzz|z|x}}~szsohlpjc]Z\bvtkwxtwwvrort{~njtqhehdacemr|wg`s{}{xtssu~~}xsrjc`hnptvzyz}y}~w|{}tjovrhiolhea`_jtzoy}wvu|wwx|xo~vunkmg`_agjv}wdTZz}}~xuvvvv}~}|tvmfklkrx}wjk|zrpqmjkiidhjk|{jnxpolt{{|yxxy}xwvsqvsjgdimws^Zn~|~ywy~~||nwxpghgacht{~}vjh|~xx{unmosqusmryz}tjg^_onsyz}vlpokdl}}xyr}x{w|xwo[_v}}zzyysx}qooeda`ky~ribq|lktkiagzw|}xnq~winv}rqkl~wjotpurnsu~||rjcktompl~zvx~xd^n~|ipvzpyqujhjs|zpzzy|zxndhqv||pfk^bt~}sdm}{{{~ppyy~wy{zwyyzx}uvrukbbgmpns^bhyusps|zddrip~}u|y{}}trsxsiomfmqd`lry{sph[Uix{}ptruyzt||mjtuje^`o{|m~umlgj`]alye{tmnt}|ujau{qginv}xuocbsvskicgiy{ojguohmlrko{iiq~|xqxy}lnvwtyrpln}uvxwxxx|zwpnkjmy|svkgZcglv}fgllirwwruuwtz{t|wzu}w|{ytorqv~~}zv{zofkhlv~re~usjpshkrt~{dSfwot|r|wxxpuvptpjx|gzyrtqpkedhmql}ph_\Zjs~pcuyzyx||ysylgetmjntxzu{~|}|oojj\OPZd~kpzlmq|stzz}}lrx}}ukioszx||y}lty{w}ywqigjbety}efdhkffnvxu}ghdtytoprsns~zmlrww}qpnwztulnqkx||kfgkrz~vnyqlqwnjrsug}h_]emlqsy|rmeezwtllphv|xvtzvjgmqp}{tmusjroifhsmUao_[gw~q|zsmxtkotxswspnwplhe`impysuj`V]]buyubi|y|}yy{jmsrehmrwvw{}|~tmhih`SQT]l|mnoglwssw|}unzyvz~yrqnq{~x|ymcrqvsurjor~soebb`fnt~tzmgghdmrq|y|etznsw{{}~}{q{zsipxy~ztljptr~mvy~{}vkltwmrxib\jebm{|n\^ytquu{uy}wt{srzzy|vv{plyusupifkp~kd{rYXYiwppyywuuokpvzvmeotmfflsps{xrjgfZS\imaxyts}~~~zqdutrx{oiosvznjjegb^bjlwu{dbbkjkrt|t~qlq||{wxzzw{rft|vpt{|twxyvpnqjdcls|st|oahhbgpwooskgsvyz~{z{uunz~yu{wmsquto}uv~|unpy|ngmjbbfimowcVnvhoz~xx{v~rqwpox|zv~q~{qqrnknnpxzrcxtdXZcez{zoaruswxpqwz}rvkehgkljrwszprni_XUZdyfnyqqp{xvz~~rcmyyx~{okqy}|r~ssigjnlkfnty|uf^amacmz~z~nkfvtlrxzqvt~uglt}}ui|}x}nowutsyogen|trmzimoaeiwv}wkhifkemt~z~}wkdl{{xrsnxqms|vvpzynuqtuzmf}qlulgjmlqoYoq`^py~s~wyskzqlj|x{twzrpxumoodqoxyxdhc`\ai~~vmeqvukwzxru}~~ypnzkdlhklywzx~omwul\\UTevqxmshqzvrmw~yyojxujyzkomvz||veh~}thr{tqloksvyvpjcdejdp{{wrejnrhit~zp||udwlsxsszysiu~~yzx~sslgkxv{wr~vppkgltvsjbfkgcr{|xdVmvvttvwxsuzzv}ysvwp|rw~{vdqvquxfimrtxnlysVW]x~}~so{vwutnuonnxvjlp{wqmsxkt|~|suegdU\gxd^ltx~twx}t}wmlxvzomjekp}jhzrl`d`_f}}tuh`okgq}zvkxquwtvyqwxu|wqluzzkp}xsuxvnqqd]_niu~i}ooiiitru~}p~uwir{wz{mkkqxxtr{ttlw|ooukysrrnz~ujztuoghmphuzjansoz|~y{~|}wvusyxmounptxwwoxrmv~moriXW]jwyrpcutx{ujsvzv~txqkidrvwy|~}|uuvsje[]h}joxspfi{z{~werxusxpommxvqvhnrtptljp}y|~mc`hfentnnyyuw{~~~{|glsy}vyvotxqpvogbdvtxxsxrpfioz~zrwmnxmnxxi\_~zvuvzus{}|xxnl~wvyw}mbzxltsfhrtrzgvyf`fvzt~xx{nvvrlt|~~oit|wsq|uvygutfd[Y]qwh_s|{{twwwsn|~}{vz|mrheixzy~}ktyugfaZeoqxyemhhs}~u}~ynlxwmuzqqqsw|km{ikxwxnsmoxx}}vmea`jbl}|xthopupowx|uf~xlr|t|vkswxxtzqphegtuxuv~ynligmt~wwqgkmihwys`Vnxwwx{zxttx{ur~{vrt~wqzt|}ufw~uqutfikos{qt}qZZaz~}z{|oqxwttruqqv~xwulqv}yuswwow{~wt}qdd^V]mo_f|nvuvprsur|}uksz|zpniiquykq|sjaa]`jyxofeliowxtv~rkvoqppw}zqvu{zvkh{}pkv~|sstnu~}|rmj`_fhjzwvsmmlllrlsws}{njk{x||wrjkp|yv{xwqojlmz{zl~uyuiljmuy}ztxvijjggl|~laatvzuxy~}~xx{{rv{qvvtq~{u|{lsxyywtstimsvwurzkbTZcv~wxqcj{puwkm~z{~||jtykiyqpwvq}zrqwnimi\Z_ewav~nmjjv|nsyuw}ypawzs~~|oitxy~{ywlkohrtoiokp|seb\hheo|~|igkjnx|z~rovw{zsxu~xnqpx~xke[exowtz}qogalir{ot|smsjowdVezou~~vmp}s{zmq{ysnmuw~lk}yjquomsqqvl{wedfr~|u{wunt|sxsop}~zrkptrmn|{}~kwyndZ^^hzqh_p~xt~xv{~xw}|zwwu}vmijv{|z~orstnjaejkx{~{ifdcfs}vxljz~zw{x{wwt~xntsrux~xvvvs|}|ojb\echv}s{{o`lruwz{zrup|~wsptu~zzuvrjgnst}qq}}yxtldit{||wn|ojptjv}{iXhx|||~|uu|xz|xytpqyy{vsv|kszyxuxqkq{wzynv}c\Zctwvtrier|tnytsv}}}|lmlqy{w|v{pqm`Y[[qn`cu{nhv{z}wutnu}tlnlq~}wrslvmeeebvvoeZhd_roqzslvzvzwvzvzgk|tpw{quqjrxmkaZdgdytnypjmnfvxwvotmnhy}zyxudeguu{{oqhelrs~o|vy{x{qjopo{|zzvzpgijfqvjb_pmpvy~zpxuvxyypxtquw|q||{rsz~xsvtgmqmxru{k]WX^|uulgkusuyrputs|{{|vo~ooy}vyv}}vz~v{xnrh\[UXtxffruvskx|tsyrw~||tho}yw|powy|wttoytoptpch``sywwl_^ipgrzz~xwqogqvpy|x~|qfrx~zqvusqfn|qla]gqqtyyo}{nhnlhkzv}xynjegp{~xqb]cx|u|~xtofpz{~~wv|yry}vgotptwv~vqylhhcl~ulgpojftwvx}y|ysuyqssnw}xy{}|{s|trxsotnuun|p^_a^c|trfg|}||qyvptrt~|vyoovvspw|}|yzqpprcbfcdunxvimfgv{xw~z~ujosvrt}zzv}}stpztlpwtnwtot|~~vqhbdidryzxlhmjqtrwtr}rwzy~}sqns~wywtzphjorywnzz~vkijmv|}xxykptqn|}we_mvyzy}zwuy|yw~~xutsywwtx~|pxtrumqv{z}yqj|}ja[gz{vpsmhy|wttxvww~y|~|xspwwvvz||ttspi`]`tubcxrot~zzxy|tkjr{yuqvz||qlnussnhjw|wve`jggmywq|zvpqxz}}rt~ypw~~trt}}~sc`flnt||qp{nifhmy|rryrkwynkbjz{{|}}qnpvyzuzwz|xolklu|qmz|wtronsrgiwpkv~z{vzzxw~z~xuqstu~~wzv|~wxzttw{vxxy~yqytjb^[izzmgei{||~{wttx{zx}u|~wqmoyvzxsukgf^]i}}rmtutjdovy{|~}|mepzwzwupw~~tm~zosvqosiho}|}vc`deblr~{w}xtqowsr{nl|y~u{}~|tkos{zsdafgmqy~wowhiolnswxytqghpz}~qe]Yq~}|{ypkqpw{{|s|yvvv}wmjssu}{tpz{wsongepz}vniuqa`t~zytuxorzvwrprvs}zy}~~{vy}yxruuqnywu~j_`VWgz|sf`ixzwtqvtpy|}}{rmxwsqny||y{}znutkbc[Yevxp|yqiegsyx{uw}{~lm}|yto|~zurr~~uphj{mqwromjejsy}reab`goy~|wysqjloqnw~~~xpsyoqw}zw~|slihp||ujcefmy~{usyxmmkkruw}~qmicjoyobZ[o}}{xrqps{u|urtrx}usss}xt{yzuqnmglr{uot|wn]Wd|{rqutiu~usvopsrx}}}{szww{{x{xv{xuw{}zrec\T]mxe^q{txx~zutyvw}}xupky~}z{wtz}~||vwwlqpkhg`cn|{kghkins~vrwqtsqy{~zpkm|srxvxwqnst{widfhnqv~srxyppklpuu}tw~rmoy~wqlfbt}xz{vpqpv{{ur~x}yrtpqx|{qu}xrqmlquzwidmuppy~zw{yx}~ursvtxz~~{}ywtutuu|xls~rmca`jyyohfl}zxuqvz~~{|yxrz|tru||}}~~snnkkhddjx~ysxwsmmsz~~}|vil|z{yw|xoz{onoqtvqoov}|ogcfjpv{y}~qmousw}pr{~{xx{}spox|{~~tkgisv|}yt~wqlintz~yt}|xtsou~zna[j|{ytqy}|~vyts}~{utqt||rw{vuuutuuw|vsqr{thdmy{suyqoq~|xwvus~|z~xuyxwvu{}}}|~u}vmg]^dqyidkw|||}yy}{y~|~|yupq|yqtw{}|}~oturmibchp~{vmiimq{y|lmv}{x~}{w|~}ukn|qtxwxqnmmozmjfcjlr}vyuniquvw|{v|yvtw}|{rqjfm}xqmihouvyr~|tojjpwx}{yypjkmo|{lf\^r|zsquzw~~{~zyut{~xvoqxyvx~}wxqlmor~}vuuzxl\\gvyqsokjv~zyutxtv}{yvxytyw{~z|ztwuwxohaZX`lrdhszysv|xxywx||}xyvos~}ztrvx}}xruy{uttone``bkznidjinz~~wqzztruwy|xx{~umeqzuuwxrkkijuyniecglo}~ywv~wsppqovw{~x{sjlox}~rmi^`lsplimsuxwxyz}xwspruu{zw{{xskgikr~zladhmovzrttux}}ruuruz|~x{~}zx}wvxonppvoswk`X\bvunicj|}y{wrswuz}|zyuqxsv|{}}~y{yx}{xplg`[[^mznmwsqrsxy~}|{ztmt~yzz~ytv|~xplm}vrqnpkgffkshcbkns}yy~~sttttwy~yoqxzw}zy{ysqkho}|ungdluwvpr}ytnouu{}y{zqmmju~}voeX\q~}upr{}~y}vqv~~}yvw|~yt~xwspnppu}umhmvngfmzyuvxsqtyrsrru}}{y|wz}}zx{yyz|{{ypic]_dqxjdkz|{wvzz~ysow|vvw~}vplkigdfjqy{xomlnstu||xwzz~{slo}zrpqtrrpqs{~uniglnu~{tvwopqtvz|try|uw~|z|{xvplinz}}z{vqorwzuo{}|yupotx|yy~yroqrrz}|xoiadqy~ywzz{{yxuw|~|zx|~yy{xtvrqtyy~}pkny}ugbbl}{unlkt}zutyxy{||~|vwyywyzyx{|z~tpnjc_`g|~nkr{}vv|z{zy|ypjp|yxxx|{yuxvomnqljgek{|vjgmknxzuz|xrsyz|~~xqlw{rpvzwrqkluypghlnq|}wuxnmmloy{ys|yqmp{y~vqhacj|woortw}{z|~}}zwnnppu~zwy~|{toljnw~~wnedlqpx{xwtvxxyz|yxvxy{~~xuyw|~{}|wxywrrnr{xqxxha]^g{xphfo{z{zxxvx{~~{yy{vuywvwxz|z}~}{wv{}}xsnd`^[cvvruyvtoqxyz{|{}|rlo|z{}vvwywqnlr|wrtqkgfbesthfhjmuz~|}{~zwtswuw~~|~|vmrz|x|~xz{wsojekt{sigilqw{xwyyposrsvzztnijpz|xpe[Ze|}uoqquz}}{||wyy|zuqwxy}wsz~zwpnkioy{unmnoidfvzurpror}|ywusww}|~|y|{{||ywvtquz{}yla^Z\hz{pgdp|~~zzzxy|~{wtr~|vvtx~yvxw|urqneb`^et}|qkkkq|zux||xy|~yzy{vmjn|ysuuqllghoz|siefjnz{tpyxuttzzz|wz}|vot|~}~{vrledeo}zqllnt|vt}}|}zwuux~}}{~}tqnlnx{tkc\bluwtruy~{vsstz~}~{wz|{{ussstyvoqxvnd``m}wpjlmwzvvtww}~xv|{{z~~||{{{~vpkfa^_fx{njoy{yz}||~~uqv~}{{{{|yupsxqmmjifejvwlinosz}~|{zxxxz}vomv|~wuttrpkkpz|ulimru}}yrpyywtuuy{~}w{{uqov}{xtqibaex~}vstx{}xy|z}~~yyxxz~yv}}ytponpu~ypjdekqps~|ywyxxzywtwx{}~}~|xwvtusw{sqw|wlgbbes}ulioy}zxvw{~zxsrv}yy|~~}}}{yz}}{rolfedbfqyxz|ywru{~~}|~ypoxz|~}{|}wtrnsunomlllhkq~{olkmqx}}{}|uqqtsx}xrlu~|~|tvuturmjlqyqnmpvz~zyx~|tqpmqsw|~}y||vqmosz|{xwpf`]hzvttz|~ywz}z||vstsvx{zx}{trqolnsz{spmnptlgmzxuusot}||yyyy|~}zzzzz~~z|}}}zyvtwussw|{xzwkd_\do~|pilv~}ywx{z{~~}xuomt}zww||~}|~zxuvz~~xqtpkeb_clz}womptx{{y~|tox~|yy||}{yzwpjjvwrturoihhltyqmjinry{zxwrortvx||ywx~~vttx~{z}{xrkheem}{upmlqw{{x{|vqporwz~}zzvpkjnqz}xpd__gu|vstxx|}{|zxvz}zxvvy~~uw~}xvrnmqs{xqrwytk`_hv|snkjn~}zvyxx{|~~{{vx}wzz{}}||wwwxyxohc]Zal}wlmw{xxy}|~{ussy}zxuw{~{ytoov|tsolifbckwtlhjmry}{ywx~~zzyz}}~~}|~soov}zxwuuqlhimx}rkiins{yrs{|xxuvy{~{z~tposz|{vne^[by}vqosw{|zvyzyxzz{~yts}xuqoorzyrlefklkpz{urtsuz~yvtsv|~{z{}{{zxvww{xv|ynf_]bm|}qgekwzyyyz~|xx{~{ww{}{zw{ysoiea_cky{yyyvsqt{~|vu}}}}{{z{|upkm|~wuqoljghku}qkhkpx}yurv|yz{zz}}wqu{}yx{}yvtqmhhir}|tolnt{}urv}zxvy|~~{ysonnt~~xtnf^Zas~yusx|}xuv|}}|~~zx||xsqopruxniimqkfhrxsstqu~}wvuuw~~~{ww||yyvuuwx~|tkfa]bjx~rjku~}yy{{~{uqs}}{~}ywutv|tqlifbaekw~ysrtw|zw}~zwxy{|toiju}urpnmhhims{tqnnsv}~|zzy~vrrqtvy}|vruzzvvv{}xvusmjifhp}{xurrvz{xuy}xsrstv{|~zslkmpuxwqjcably~yxxz|}|}~~}||}wwxxy}}~{~|wtrmmorv}qnosvrjdgn}{vroqw~{xxy|{~{{wvutt{}~|yxvtsutx}yqlgb`bhvvrv{~{|~}zzyz}wsopw}{}~}zxvsqrt}|upnmkfedhrwqprrw|~z{{wsuyz}~~xtpmpz~ysrtsokjhmwztooqsw}{z~ysrppsy|{xx|upps{}xzytmib`ft{tstvy~~{{~{ytsttv|yy~{xtommpx|xvpifimpsz~ywttuwy~}}zz|}~~{yzyz~~|~~zxxxssrsyxsy|tjcacjyxqkkt~}||}~|yvvvx~}zz{{~}}~}zyvwz}|xrnhcabfr~{}}wtsuzztrs}}zz|~}xrnnsyvtqpkihhmz}tmjmpv~}vuz}xyzz|}zvty}~{y}~{yxtpmhfir{xqmoswxy~|yvuwz|~|zyz|usrpv}~zunh`\ds{usuvz|wvyy{zz|}xux}{xutttv~yrmnrslggnyzsonmq{~}zwwz}|||{}~~~{{{zx|xqkd_`eqvkipy}}}}|xvy|ywy{~zvssv|vqokgccfo}wonosz}{{yvv~~~}}}}{volr{yvtsokhhkuzqkjnrz~wrpw~zzz}{w{{wrtz~{ysnic`cm}wrorv{{z||{||{z{}~yxz|upnnow|vnd_^eovyutux}~yvuvz~~zwy~{zurqrsxzrqsuqjcbeq|tnils}yxwxy}~|xux~~{wwuuw{~tmgb^^bl~~uprw|~~~||~~ytu|}~{z|~zvqnlmv}uolidcbdm|voosu{~|{|}}}wvwvy|}~yslimv|wsrokhfektyqmorw||wut{ywtrsvw{~yy~xrmmr{yxtnic^_fv|wsuvz~{y{|xxwuwy{}|~ztmjhipx{uohcagnrv{zxwyyz}~yxx{}}|yzyyyxxzyvspmllryvrvzwmebbgr|wqnr||yxxw{~|xtqos{}|yvtqprvzwqlfaaadn{~z}}zy|~~~}||}||trv}|y|~}~zwrmkkp|zsonjgffgmw{trqtx|}|~{vrrsty~}vqmnv{{|yttqomjhhmtzusruy}{xy~~wtrqrtw{}||xronpu||xvqnga_dr}yxwz}~}z|~~~ywwuvy{~}z}{vroonouzwplkoqplkp|yussrw~}||}}~|{yyxyyz||zxuuuttwz}|}~ztlfcafq~}tor{~}xsqqv~}{}~~|||yvuuty~}tqplhfdemxyussw|~ywv{~}~~}|wqnpw~wstspmkilqz{tqpqt{zwx|xvvw|~~zuv||xvz}|zyvrniedgrzvttw{}~|{xwwwz~ywx~|wursu{}ztngcdkqw~zvuvxz~~|zyz||{||~||~|{{xwvvx{xssvxtnhfgp{zqkkp{~}}{|~|}}|{~|zz}}~}|z{z{~xsmifcdjv}xwwyxx|~~{wsv~|{z{|yuros~zvrplkhgjr~}soopv}~yvuu{~zuru{|}{xuspmhgjqz{sonqv}{vw|~{{{|}~~}|}|wsquz~yupjb]^hzzustw{{xyz{z|}~{wvy}xusqqsy|unjghjklr}zuqrsu|}yxvx|~{z{~|zxvstuyzz|zsjd`ahtxoikt}}{{z{~{ywz~|{}~}yusssw{xrlfb``fp}|{zwvv{}}~~}yy|}|||{{|}wplijt{vsnjfdcgnzyronrx}zwvx|yyxxy{}{vqptvvvy~{wsokfccfo|~xspptz}xvy}{xwxwy{}xqljlpy{upja\[ap}yutv{~}{z}~|{z{zz||}}|y{}vqmjikpxxpkijkkhjs~ytttux{xxxz~~{xvvtty|wtqnmmqw~|vme`^ajv~vopw}|{yz{}~zuqqx}ywsomlou{zsoiea_ahr~{wxz}~~~{|~{xwwy{~|wqkggn{ztqnjgdehnw{vtstx|~{zy|}xssrtvy|}xtsuwustw|{wtpmgedeju}ywvvy}~zyz}zvttuvy{~~wqljmqv|uqkd_bgq{~{yyz{~~~~}~~{yyyxz{{}~}~}xsqmlnrv}zqnpsrojgjq||vrqt|~{{}~|zwussu}}zwvtrstvy~xqkgdcdkuzx{xtrsz~|zvtrpos{xroljiggjp{}wstwz}z{|~{yyz}{wrnot{}xurqpmkjkoy{wstwz}zz~~zwuvx{~|xvy~~{vuuy|xtrnhc`cp}ywy{}}~}{zyxy{~~{y|}ywuttux~~wplihloprwywvsty~|{|~~~~}|}}~~~|zxyyxxyz}zvx{{vojfgkt}tnov}}zwuuz|{|}~~}~~}{zyxyz|~xtpliffjq{|xvx|}zxttx~}~|wsopv|xuspnljknu{uqqty~zuty|{|~~zwvv{~~|{|~|yvsokhggnx}xtsuy|}~|zyxy|}zxy{|wtttw|{vqjd`aiu~xuvwz~zxyy{{{|zxx~~{xusttv|}upnoqpkhjr|ysomov|zy{|~~~~{z}~}{xwvvvy~|unhcadkw}toqw|}}}~|zywx~|{|~{xuqoory{vplgcbdit~wrsuy}{yyxx|~}||}||~}xrmjmu}|wsplgedgozwqoptx}yvuy}zyyz{{}|xxzzwsqqw}|xtohc`_dn~ztrruz~}~~|{zzz{}|~~}|}{smjjlrzytld__cmvzvutw{}zyz{~~~}|||zzyxx{{wrmkjlqy|ussrpidcgp~}vqnow~{zyy{}}ywtsu{~zvqommptzxohb^^bjxzvvy}~}|}~{xvy~~||||~zuplihkr~zsnjeaabhs~wtux{~}|{{}{wvvwy{}zrmijov{}wrokfdcelvztrtw{~zwxz{yvttwwz}~{{|ysomnt|}wtoic_^bm}~zvwx{}~|zywwyz{}~xsnkjkpxyrlfddhlqw{yxwxz|}{z|~~}zyxxwwx{|xtqnmmqw~ywxwrlecejs|vsrw~}||~}ytrsw~|yvsqppsvzyrmhdbdgny}||~|yy{~}}~zvrnklqzysoligghkr|zvuwz}{y|{ywxz||wrpruy{{}zurolihginv|ywxz~|z~~{yxxy|~}|}{vsstv{zupkfcbeo{{yz{~~}~}|{{|~~}}yvsrsuwzxqlkmppmmow}xtsuz~}~}{zzzy{~|zyxvwxyz}}xsnkhgioyyuv{|yusuz~}|zyxvutv{ytonkihimu~yxxz~~{zxwy~~zwtqptz{vsrpnlkkov~{vuvx}{xz~{yyz}~{xuv{~~|zxz~|yvtplhdditzxxy|~|{zyyy{~}yx{~{wuttv{zvpkfegmsy~zwvvxz~~|{{||{||}~}~|zywvuuwz~|vtuwvqliiltwqmpw~|}~~}|{zzyz|~~~~}}{ywvvvx{}}vqkgedgp{}{{{{{|~}}|zwuuz~}}}|ytpnmpx~yuqlhgegmw{trsu{zwww{}~}}~~}wsoptxz||xuplhedhnwxsqrvz|zz}{zyz{|}~~~ytooqv||xrmf`]_hw{wttvz~}|||{z{{{|}~}}{y{}wqnkkotz|vojgfikns|{vsrtv{|zzz|}~~~~}|{zywwz{vsomlorx}||{tkdabhr~ysnov~~{{{|~|zwuv{{wsollmpv{|ungb__dmx~|zz|~}}}}}|{z|}{{z{|}~ytmhfgnzzupjfbacir~ytrsw|}{xwx}|yxwwxz{}|wrppsttvz~yupjfbachqyussw||yz~~|yxxxxz{}|uokjmryyrke_\_gu~zwvwz~~||}~}{{zzzzzzzy}~wqmjilpwwplkkkjiks~yursvz|zzz|~{yvutv{~yuqnmmptz|umfbacju~xssy~}}}~~zwuv{{wsomlmpwwqlgcbbgpz{yz|~|||||}~|{z|}~}wrlijowzuqlifefkr{{wvvy}}yvw|{yyzz}zvvxxwutvz{vqmhebben|{yxz}~}|z{{}~~~{urpprw|xqjeabgnu|}{yyz|}}}}|||||||}{xurrqtw{}vrqrqnkikox~xsru|~~}zxvvx~}{ywutuvxz~yrnigfgks}}}~~}zwvx}~{yvsqpps{}wrnkiiikpx{xxz~}zxy|}||}~ytqopv{~{vspmlkiknu}{xxz}~}}|zyyz}~{yyz}}zywvw{{vrnjfcchs|zz|~~~~|{zzz{}~}~|xutttvy}{tnjjjmopsy~yvvuw}}}~~}|{z{{|}}~|zxwvuuwx{}zyyywrmihjpy{usv{~|ywutw}~}{zywutttwz~{wsnjhfhmu|zy|}{ywux|}zxtpnnszzwtpmjhhkpyzvtvx}}zy{}zz{}~~zwuuvxxxxz}~{xtplgeegny{wtvx||zxxyz|~~~~ytppqsx~zupjdabhszvvwy|~~|||{{zz{||~~~}{{}~yuqonoqv|~xtqponkilr{{urqsx|{|}}}|||{zyyy{~{wtqonpsx|~woidbdjtyuux}~}}}~}|yxww{~~{wsolklpvytnidbbgoz}xvwz~}|zyzz|}||{|}}}wqmjkpw}{vrmhdcdir|~xtstx||yyz~}{zyz{{|}~|yyywspprw}{vqkea_aht{wtuw{~~}|{{z{|||}}|}}ysmkknsy~wqjdabgnv{wuuwz~|zz|}~~}||{zyxxz~|wsollmqw}}xvurnieeiq|}vrprx~|{{|~}zwvwy~{xspnmnrv{zqjeaacju}zy{|~}|||~~}{zz}~~~|wrmjikqz~xrlhdbcgnyzvux|~{xvwz~|{||}{vpmnqux{}xrmieddgmwzvuv{{xz}~}|||}~~~~|wsqqsx~}vpjd`^_guzxwz}}}~~~~}~~~~~||}~xtpooqu|~unhffhjmrzzwvvx|}{{}~|{yxy{}yvsqqsuy|zwsmifeipz~xssw~}}~~{xvw{|yvsrqqsvz~vpkgeegmu~}~~}||{zy|~vxtuttqxzz~|tmmdaafl{|tpy{xvms}}|{}{wzx{z{y{vged]]_en~toz}|{~~~~xmtyz~yyy{zxx{{}~~{skad`\\`fsso~|yxz}{}|ymv}|v{|yxxyy}uy{|z|mg`d_]\bixrpwww|~|{||znzyzw}|yvwvyzu{{ysjdae_\]dl}pstww}{{{~~vozzw~{xvwuyxtz{|{nicde^]_fq|mw}sxx|z{{~sr}zxyzxvvtyuuz{x}kicec^]ajvvl|xuxy|{|{~~rwzzw{~zxvutxsvy{wxjibeb^^em{qnvwy|}{|{~}r{xzw|~zwvttxrvy{~wtkgbe`^`hqnpuyy~}{{{|zrxyw~}ywvtvwqwx{~|xpjebd_^akuzjtu{z|{z{{ws}wxx}zwvtwuqvw{~yzmjcbc^_dnyujy}w|||{y|~zuuywwz|zwvtwsrvw|~w~|khaba]_gq~pk}{y}~~{zx|{zrywxv{{ywvtwqruw{~wxie_b_]aku{lnz|~}zyx|z||r}vxv}{yxvuvpsuw|xshc^a]^cnyxjq{|yxw|y}zrvww~{yxuvuotux|}zng`]_\_eq|uiu|~{ywx{xws|vwx}|yxuwspuuz}{{kf^]_\`hu}rkz~zxvy{yvuywwy}{yxuwrquv{~y}zid\^]\akw|ol~~yxvzyztwxxv{|zxwuxrsvx|yvgbZ^\]cnzzmn}xwvzy|szwxu|~{yxvvxruwz}xrf_Z^[^eq~xlq{xwv{x~}s~xwv~}{yxvxwrvw{~xnd][]\`hv~ulv~ywvw{yytywx~|zxwuxurwx|{x}jb[[]]blz}sm{}xwuy{zwu}ywz~|zwwuxsswy~yyxf`Y\]_eq~|rp{wvuzz|uw|{x|~{ywutvqtwzvzrd^Y^^ajv|rs~yvvv{{~t{||y~~zwvsstpux|t{~mb\Z_`eo{{qw|xvvw}||t|{y~}yvtqsspvy~zr{zh`[[`biszq|zwvvy~}yu}{{{wsqorpqw{tq|ud_Z]cfmxxs}yvvw|~wx}{|zuqonqorx}pr{pb^[aeir|vu~|xvwx}v|~z}}wrommpntzymt{la^\cgmv~tx}}zwwxy}v~{}{tpmkmonv|skvxh`^_gkr{|t}{}~yxxx{~|x~}z}xrnljmnox}~nlxue`^bjnvzt~}{~}zxxy|~zz~|z|vpljimnqyykozrc`_elrywu~}{}zyyy}~}y~}z{{toljjnns{ujr{na``hou|}uw~|}}zyxy}||x~}z{ysnkjknnu|qjvzia`akqw~{s{~|~|yxxy}{}~x||y{wqmkjknnv}}nlxwf`_cmry~ys}{xwwx|z}{y|{y{vqmkilnox~ymnztc`_ent|}wt}~zwwvy{y}yz|zyzupmkimmqywkpzpa__gpw~~|vw}|xvuuyzz~w|~{yyytpljjmms{tjryk`__irx~|uz~{wutuzy{~v~}{xzxsoljknnu|qjtwh_^`lsz~{u~~~yutsuzy||u|{xzxrnljlnow~}ojuue^]bmt|~{v~~}wtrsvzz~zu{zxzvqnljnoqy{lkvrb]]dnv~zx~~{urrrvz{xv{yyzuqnlkops{yjlwo`]]fowzz~~ytqqrxz|vx~{xyytpnlmppv}uhnwk_]^hqyz~~}wrppsy{~~t{~{yzxspmlmpqxqgouh^]`kt}z}{tqpqtz||t~}{yzwromlnqrz}mgpse^]cnv~|~|ysppqv|}yt~{yzuqnlkoqt|yjfqob^^gr{~~|{vroprx}wv~{yysolkkoqvufgql`_akvzzuqpqt{~vy~zywrnkjkpry~pchqi``dpz}yxsqpsw}~v}~yxuokiikqs|zjaipf`bivzxwsqruy|w}xwrlihhlquue`kndbfo{~xxvrrtw{{z{vuojgfhnsy{paammdeju|wxustvx}~{~yurlhefipu}vj_dolfio{zwxvuvxz}}}{}uroieefjrw{re^gqkhmu}xxyxwxyz}{|~|yrplgddgmuzwnb_krkkqz}|xz{xxyyz{yz|~~}vqojfdfipw}|tk`borlnu~|~{y{{yyyxyywz|~ztomieegksyzrh_errmqx~|~|z|{yxxwxwvy|~xqnmhffimuz~wpf`itqnt{}~~|{}{yxwvwvvz|}|vpnlhggjow{}voealuppv}|~|{|zxwvuwvw{~}ztomkhghkqx}{tlccpuprx|~{{{ywvuuvux|~}ysnnkhhilsy~zskaerupsy}~{{zwvutuvvz~|~xrookhhjnuzyriagstpu{}zzxvuttvww|{~wqonkiikov{xpf`itrpv}|yyvttttwwyz|vqpnjiilqw|~wod`ktqqw~zxxtssstxy|}y{vqpnkikmry}}vnbamtprxywurrrsvyz{x{vqqnkjlntz|ulabnspsy}wvsqqrsw{|yyzuqqmkjlov{{si_cpspu{|vtrpprty|wzztrpljklpw|xpf^eqsrw~ytsqpqsv{~}w}ysroljkmry}~vnc]gsssy~wsrooqtx}{w~xrqnkikmtz|tk_]jtsv|{trqopsuz~{x}vqpliikov|yqg]^muuy~ysrqpqtw|z{{tpnjhikpx~}vnd[apww}~~}vqqqqsvy}z~xqnkhghlr{zrj`Zeuy{~~~ztqrrsuwy}~{~uokiffinu~|wnf][jy|~~~xsrssuvxz}~}{rkigefjpy~yrjc[_q~~|}~}wstuuvwxy||vnhgedgmt}zuog`[dx||~~{vtvwwwwwxzz}|qjfedeipx}wrke_^l~{|}zwvyxwwvuwwx}~vmfdddgls{ztpid_bt~}{~|~zxxzywvutuvx}~rjddefjpv~}vrnhdah{~}||z{xyzxvtsrtuy}}{ngdefhmsyztqlgdcm~}|}~z~{yzzwusqrtuz~~}vlfdegjou{}xsplhees~~|~}{~{yzyvsqprtv|||sjedgilqw}{wrpkhehy~~|~|}~zyzwtrpprtx}z}~qiefhjnsy~~zuqokgek~~}||}zyyvsqppsvz~y~{oifhjlpuz}ytqojgfn~}}||xxwtqppquw}{xynigikmqv{|xtrnjggr~|}~zwwurqppswzyxwnjhjlnrw||xtrnjghu~|}~yvvtrqqruy}xyvnjjkmotx|~|xtqmjgix~|}|wutsqqrsx{}vzuokklmpuy}|wtqmifj{}|~zussrqqsvz~{v{uollmnquz~{wtqlifl~||~xtssqqrtx}yv}~uolmnorv{~zvsokhfo~{{}~wrrrqrtv{xv}tommnosw|~yurnjgfr}z{~{uqrqqsux}~wx{tomnnptx}}xtqmifhv}{y{~xsqrrrtwz}wzyrnmmnpuy~{vrpkhfj{~|yx{~vrqrrsvy||w|wqmmmnqv{~ytqnjhfn|zxx|{uqrssuwz}{x~~uolllosx}|wrolihhs}yxwy~~ytrstuvxz~{yzrljklptz~ztomjhhlzzwwwz|wtstuvwy{~yzvojikmqw||wqmkiijp|xvvw|}{}xuuvwwxyz}y{|slhilotz}xsnkjijmw}yvuvyz{|xvwxwwwxy|}|w{~xnigimrw}~ytokiijmrzvtvw|}x||yxxxwvvvxz|yvz{rjggkpu{~zuqmiikmrx|xutwyzx}zxyxvtttvy{~vtyxohfhnsy~~{vrnkikmpv~zwuux|yy}{yywtsstvy{{ssxulggkqv{|xtpljjlptz}yvuwz~|x{}zyxusrrsvy}wpswrjghnty~|yuqnkjkosx}{xvvy|{x~}zxvsqqqswz~}sosvpihjqv{~zwspmkkmrv{zxvwz}zy|xwurppqtx|ypnsunijmsx}|xuqnlklosx}}zxwx{~~z{{wusppprvz}vnnttnkkpuz~}yvspnllnrvz~|zxwy|~z}~yvtqppqsw||sloutnlmrw{~~|xuspnmmosw{|yxwy|~z~|xusqppruz~zqlpvtomotx|~}{wtrpnnnquy}|yxxz}~{{vsrppqtw|xolrwtonpuy|~~|zvtrpooorvz}|yxx{}}zytsrpqsvz~vnmtyupprvz|~~}|yvtrqpopsw{~{ywx{~|z}wssqqrux}}umnvzuqqswz|~~}|yvusqppqtx{~~{xwy|{z{usrqrtw{{smpy{vrrtxz|}}|{xvusrqpruy|~}zxwy|z{yusrrsvy}yrmr{{vsruxz|}}|{xwusrqqsvy||ywwy|y{}wtrssux{xqnu|{vssvxz|}||zxwusrqqswz}{xvwz}}w{{vsrstvz}~wpow}zussvxz||||zxwusrqqtx{~~zwuvz~{w|zusstux{~}vpqy}yustvxz||||zxwtsqprux||xvuvzyv}~xtstuwz}|upr{}xtrtwy{|}||zxvtrpprvz~zvttw{~vv~|wttuvx{}{tot{{vsrtwy{}}|{ywurpopsw|}wtstx}{tv{wtuvwy{~yrou{ytqruxz|}}|zwusponptz~zurrtywsx{wuvwxz{}~wpnv{wrqsvz|~~}|yvspnmmpv|}wsqrv{|us{{xvwxxy{|~{tmovxtqruy|~~|zvspmllnsyytqqsx~ysu~{xwwwwxy{}xpknvvsqsw{~}zwspmkjlpv~{vrqru{}wsx{xvvvvwxz|~|tlinuurruz~~|xtpmjijmsz}ytqrtx~{vu|zwvvuuvwz}ypihoutrtx}}yvrmjhhkov~{wsrsv{~yvw~yvuuttuwz}}ulfhqvttv{{wsnjhgimsz~yussux}}yvz}xutsssuw{zqieirvuvy~}ytpkhggjov|xustw{}yx}{wtsrstvy}~vngdktwvx|{wrnigghlrzzwutvy||yyzusrrstwz~{skeenwyy{~}ytokhfginu}~ywuuwz~|z{~xtrrrsux|xpidgqyzz||wrnjgghkqx}ywvvx||z{|wsrrrtwz~}vnhdit{{|~~zupliggimt{|ywvwy}|y|{urrrsux|{tmgekw|}}|xsokhghkpv~|ywwx{~|y}ytsssuwz~yslggny~~~{vrnkihilrx{ywwx{~{y}~xtstuvy|~xrlhhr|~}zuqmkiiknsz{ywwy|~yx}}xttuvx{~}xrlhku~|xtpmkjjlpu|{ywwy|}xw}{wuuvxz}|wqlimx~{wsomkjkmqw}{xwxz}{ww~{wuvxz|~zvqlkpz}yvromkkmosy~{xwxz~zvw~~zwvwy{~}zuqmls}~{xtqomllnpuz}zwwx{~}xuw~}ywwy{}}yuqmmv~}zwspnmlmnqv||ywvx{|vtx|ywxz|~|yupmox~~|yvspomlmorx~{xvvx|zusy{yxz|}~|ytpmqz~~}{xurpnmlnpty~yvuvy}}xssz{yy{}~~{xsomr|~}|zwtronllmpu{{wutvy~{vrt|~{yz|}~}{vrnmt~~}}|yvtqnmklmqv}yuttv{~ytrv~~|{{|}~}ytplnv~~}{yvspmkjkmrx|vtstx||wssy~|z{||}~~~{wrmknx~}{xuqnkihjnt|xtssvz~~zvsu|~{zz{{||}|xtokjp{~{wsokiggjow|vsstx|}yutw}zyyzzz|}zvqlhir~}zuqlifegkrzytstvz~|yvuz|yxyyyz|~}xsnigku|xsnjfddhmu}vssux|~|yvw}zxwxxyz}zupkhgmy{vqlgdcdipyzustwz~|ywx}ywvwwy{~}wrnighp}~ytniecceks}xttvy|~|ywz{wvvvwy|zuplhgjt|wqlfcbcgnw~wuux{~~|yx{zwuvwx{~}wrnjgglxztnidbbdiq{|wuvy|~|yx}~yvuvwy|{vqmigho|}xrlgcabelu{vvx{~~{yx~}xuuvxz}~ytplihjr{vojebacgoxzwwy|~{xy~{wvvwy||wsoljilvztmhdbbdjr{zwxz}~zwy{xvwy{}{wromkkny}xrlgcbcflu~zxy{~}ywy{xwxz|{vrpnllq{|vpkfccdhow~zxy||xvy{yyz{}~zvsqonns~ztnifcdfjqz~zyz}{wvz{yz{}|yurqoopv~xrmhedehmt}~zz{~}zvv{|{|}~{xusrppry|vqkhedfjow}zz||xuu{||}~}zwusrrqt{ztojgeehlrz}z{}{wtu|}}~|ywutssru~}xrmigfgint||z{}}zusv}~~}{xvuutstw{vqligfhkpw{z{}|xtsw~|zxvvuutuyytokhggilry~zz{}~zvssy}{ywvvuutu{}wrnkhggjnt{|zz{~|xurt{~|zywvvuttv}{vqmjhghjov~{yz|}zwsrv~~}{yxvuutttwyuqmigghkqx}yxz|~|yussx~|zywuttssty~xtpkhffhlrz{xx{~}{xust{~}{ywutssrsu{|wrnjgeeinu~~zxy|~|zwutw~~~~~~}{xvtrrrrsv~{vqlhedeipx|yy{~~}|zwuuy~}}~~~|ywtrqqqrtxztojfdcfkr{{yz|~}|zwvv{}|}~}{xurqppqru{~xsmhdbcgmu~zz{~~~}|zxvw}~||}~}zvsqoopqsw~}vpkfcbchpy~~}{{}~~~}|zxwx~}||}~{xurpnopruy{tnidabdks|}}}|}~~~~~}zxwy||}~}zvspnnoqsv{yrlfbabfmv~{}}}~~~~~}zxwz~||}|yuronnprux~~vpida`bhpy|z}~~~~}zww{~||~{xtqonoqtvz|tmgc``djs}{z~~~~}zww|~|}~zvspoopsux|zrkfa`aemv~yz~~~|ywx}~}~}zvsqpprtwz}xpida`bgoy|xz~|ywx~~~|yvsqpqsvx{~~vnhcaadir|{xz|ywy{xusrqsuxz||slfbabeluyx{~{xvy}zwtrrrtwy{}yqjebachoy~xx}}zwvz|yvtrrtvy{}~woidbbejr||xy~|yvv|}zwusssux{|~|tlgcbcgmv{xz~{wuv}~{xvtsstwz|~yqjfccejqyzx||yvtx|ywusstvy|~vniecdglt|zy~}{wuty}zwutstuxz}|slhedeiow~yz~|yvtu{}{xvtsstvy|~~yqkgeegkrz}y|~|zwutv~~|ywtsstuwz}~~}~wojgefint}{y}~|{xvtty|zwussstvx{}~~}}|tmifegjpwzz~~}{ywutu|}{xvtrrstvx{}~}|}zrlhffhlrz}yz~}{zxvuuw~|ywusrrrtvx{}}||}xqkgffint|{x{~}|zyxvuvz}{xvtrrrrtvy{}}||~~vojgefjow~yx{~}}|{zyxwvw|}zxvtrqqrtvy{}}|||tmheegkqy|ww|~}}||{zyxwwx}~|zxusqpqrtvy|}}}}zrkgeegmt|yvw}~}||||{zzyxwy~|zwurqpprtwz|}}}~xpiedehov}wux~}||{||{{zyxxz~|zwtqpopqtwz}~~~~vngdcejqyzuuy}|{{|||||{yxx{~|yvsqooprux{~~|skfccfls|~xtu{}|{{{||}}|{zxy|~|yuspooprvy}yqidbcgnv|vsu|~|{z{{|}~~}|zxy}~{xurooopsw{~wngcbdipyzusv~~|zz{|}~~~~|zyy}~{xtqoooqux|}ulfcbeks|ytsw}{zz{|~~}zyz~~{wtqpopsvz~{skebcfmu}wssy|{zz{}~}{yz}zwtqpprtx|ypidbchox|vst{~|zzz|}}{y{|yvsqpqrvz~~}vngccejr{zusv}}{zz{}~~|zy|{xurppqtw{~~~ztlfccgmu~yutw}{zz|}~|yy}~zwtqppruy}}||xqjeceipy}xuuz~|{z{}~}{yy~|xurppqsw{~|{zunhddfls}|xuw}}|{{|~~|zyz~zvsqopruy~}zyxrlgdeiow{xvy}|||}~~}{yy{|xtqpopsw{{xxupjfegls{~{xx{}||}~~}{zyy}}yurpnoquy~}xvvsniffiov~{yy}~}}}~~~}|{zyy{{wspnnosw{zvuuqmhghlrz~{yz~~~~~~~~}|{zyyy||xtqnnnqty}|wtttplihjov}}{z{~~~~~}|{zzyyy{~zuqnmmorvzzustsokijmry}zz}~~}}|{zzyyyyz}{wsommmpsx||wsstrokjkou||zz}~}}|{zyyyyzz{~}yuqnmmnquy}zusstrnkkmqw~~{yz~~}|{zzyxxyz{{}|wspnmmorvz~}xtsttrnkknsy|zyz~}|{zyyxxyz{{|~~zvrommnpsw{~|wtsttqmklpu{~{yx{}|{zyyxxyz{||}~}yuqommnpsw{zvssutpmkmqv}}zxx|~|{zyyxyyz{|}}}|xtqommnqtx|~zustusolknrx~{xwy~}{zyxxyyz{|}}}}{wtqommoqux|}yusttrnkkntz|ywwy}{zyxxyyz{|}}}}}~{wsqnmnoruy}}xtsttqmkkou|{xww{~|zyxxxyz{|}~~~}}~zwspnmnorvz~|xtrssoljlpw~}zwwx|}zyxxxyz{|~~~}}}zvspnmnpsw{|wsrrqnkjmry|ywwy~|yxwwxy{|~~}}}zvsponoqtx}{vrqrpmjjms{~zxwwz~zxwwwyz|~~|}}zvspooprvz~zuqpqoljkou}}zxwx|}ywvwxy|~~|}}yvspoopsw{yspopnkjkpw|yxxy~{xvvwxz}}|}|yurpooqtx}}wqooomkjmsz~zxxx{~zwvvxy|~|{}|xtqoopruz~|upmnnljkou}}zyyz}}zvuxyy|}}|}yvuqmnqsu{xsolkmljkrzzxz||~{vuxzz{~}{y~{xwsonoorx|wsmjlkiiox~{y{~}~|wuy{z{}}}~{x{|zzvqnmmnu{xpjjjihmu{}z|~~~xvz|z{{{{}~{yz|}xrnkklr|}tlhghhmtx}|~~~~{y|}zzzzz|~|z{zsnkjjpy~xohefhnsuy~~}~~{}~{zyzy{~}|{||tokiinw{~|sjedgnstw{~|}~~|zxyy{~|{|{}~vokihmtx{~vlgdemssuw~}|}}}zxyy{~|yy{{~xplihlruwzyojedlqssu{}|~}~zyzy{~}zwxzzzqmjhlortv}{snhejorqsy~}|~}zzzy{}|yuwyz~~~tplilnpprz~~vrlhilppqw{~|~}{{{z|}|xtvxy~~xsoklmnmov{yvpkjjlmpvy}~}~|||z||{xsuwx}~|xrnnmmklsx~|ztpmjjintw}~}|~}}{}||xsuvx|}|vqpnmjjptz~}xtqlifjquz~|~~|}}|xsuvw{~}{uspnjhnqw~{xupkefnrx}~{}}~}|ytuvvz}~|zwspkhlosz~{ytnfdint{||~~~|ztuvvz|~~|~{wsmhkmpw|~}xsjdfipx|||}zuuvvy|~~|~{vpjjlmty}~}wofefjsy}~|{}{vuwux|}~|}ztmklkqvz|}{tkgeenuy|}}{~{xuvuw|}~}}yrnmkntwz{~zqkgchptxz}{|}yuuuu{}}~~}wqommsuwz|~wpkedkotx{~|{~~{wuuty}}~~~|uqnmqttxy}|uohdhkoux}~|z|}}yuutx}|}~~~~ztqnqsruwz~yslfghjptz}z{|{vutv|{|~}~~}xtpqsqsuw|~~wqjigfkpv{{z{~~xvtu{{{}}~||wrrsprsuy|{unlidgkqx}|zz|zwuuzzz|{}~}zustppqrvz~yspledfltz}zz{}yvvzyy{z|}~~xvuqppptw~}vtpgdcfnv|zz|xwzyyzy{{{xwqonnqt|zxskfbciq}}{zzy{yyyxzz}~|yrpmmorz}{wnibaely~{z}{}zyxwyy||tpllmow}zrkdbbgt}|{~~{zxwxw{~~~~wqkklnuz~|unfdaeox}}~}{wxxw{|||{~zrlkjlsw|~~ypifbdks|~~}~||xyxwzzzyx|}~tmlilqty{|smiddhmw}~}{~~}yyx|{xokdh~}s~{~{vf}zy{}|w|r~|nl}zzs}qe~}ffgfmu|z|idzy||vn{~vjosot{zxut|kq}|{syflvrijfnyz{~o^m~zkx}~}pystov}|uq}~}ne|}wprb{r~|mliszyyyytb^z~{wwl}~}xqwtrzzuwtxtei}rnmjzsyqmpvvu~}rj\fvusv~|}ztu~yvxyur|z{rkbrmnnv~vxvsrtutuxmc\qrvv~|{|vs|{|{ywsszunfc}kqq|~xwswustsxrj_`pzx{z}~rvzyvuqw}{pkbkykvr}}tzuzrrsr|lf\l|s|x{z{xq{}vvsq|x~~lhcy}vouu|}yuywqsqr{}ic`y~{uz|z{~ss~{vvqrvyifi|vpt{{ww~xtrrovzvfch}zt{~z~{rv|yvspxu~tggq}tox|}~t{|vtrop}xrfepvu|}~yo{~{ytqrs|phjxor}|{rxwsoosu~oghyqy|}tn{|uqqv{q|mil~lw~}tswxnnpyzu}lhk~q}~zmt{zpqr}su{kjqymzzp{wslpruy{jhs{q~~sm}ztpruqxxjkzvm|~trtompwt|xhk{vpwpqurpsy~q|uhp~nnxtvxqons{trgpmu~ytqwwurqu}|s~ojt|gw~zwt}rsopt|w}lirzj~}zwtruvqruyw{lkv~si~~{zvwssppvzxzihw~sm|zxwtwuvqpywxygk~~{on{z{ywz|stnp{wzucm}}ou~wxxwvz|wvnr|t{qcs{zky{x{zzv~yvqmr}uzkct}zowwxyvt{xqnq~}uwig{{vnwxz|vwytolq~ttfh~}xr}vvzwrxyuojr{rsen{up}vz|vt{ttkivxqqcs~tu{uzwss{vtijwtrogz{pxzy{vss}tphl|sqmizzq~zywtpr}uohl~qqom~~vp|zvtouzrmgp~ornm|wr|vtpmxxrlgt|nunpxuq{vton{tqjizynujryutwtplo~tqil|vqvkwwrvwuomqroipuqsjy~wsz}urmkrrnkqvrrm}{ts||vqnlv|onlsuppl~zuuzrnlk{{oomtspqovtuzrokm~woplxppopuvw~vpmipuqolzmqot~tvx~upmju~sqnm~}lqmw}uw||rokkxtrlozkqo|zsw{rokn{~tqkrwkpp~zt{~xqmkp}toktujqsws}}wqmmr~rmlvsiqtwvzvolnsqmmx~qisw~uwyuonpt}~nmn{~oity~u{xsmopv}|mmn}}~ljw}|t~wsnqqy|ymmp}|ilx|v}vqnpp}}wmmq}zhn{zw{wqpqr}tmlt~wfq}zyzvppot~tmlw~|tft~zzyvqqpx}rll{~{rgv~{|xtpopz}qjn~}xphz}z|xuqor||~oiq{woi~~zvtons}}~ljtxvnk~yvuopu~}{ilvvwmn~yvsmpt|xhnx|uwkr|z~wrnqu{~sho|zvvkv{||vpnov{}qjqxvulz{}|upnnyyzojt~xvum|~|~ztoln}xyokw|xvum}{~xsnjpuymmz|xwtm~{vskiruylp||wxro}yvrhjtyuwls~|xyps{yungkvwwvmu{yxowx{tlglzuwunv|yvoy|w~}pigm~uxunx~~xvo{yxynigpsztn{}wum~~}xytmggrt|qp}{wsl~zwzrmfiu}v{os}zwpn~~|yw}pkfjv|xynt~zunr~|zwv~okhjy{wxntxrnt}{zvy{mkgj}zwwlw~urny{zxu|xmlflvwulz|srmzzww~unkeouxrn|yrqo}{yvxtpheqtxpq~}wrpr|{xwytnffssvos{wqrv|zwwxtlfgv}qvou}zupsy|yxwyrkegzzqvox~{ztqu{{zxuzojdi~wpvo}}{yrsv}z{xu|~miblsquq{{xrvw{{uu}zlgbpqrtt}{{vsvw~|ztvwkddspstx{{yvuwx~}xtvuicfv}osv{z{xwuwz}wtvsgchz{ntx|~zzxxtx|{uswpfcj~zmvy~}zyyxtz}zusy~meclxmxz|zyzwt{}yts{~~kedpun{z|yzzuu||xts~~{ieduso|z{y{ztw}zxrt~xhegzrq|{zy{xty~zxrv~~ugei~~rs|}yz{wtz~zvrx}}sfem}qt}~y{{vu{}zurz|{qffp|qt~~y{yvv}|yts|zzpfht|pu}z{xvv~{xtu~xxofkw{pv}zzwvv{vtvvxngmz{oy}{ywvvyutxtwlhp}zn{}zxwux~wtuytwkjqxn~}zxwtz}utu|{tvjlsvp}xxus}{tuv~xtukmutq|xxttxtt~y{yrw{snxu|z}{rfbzsz{vzxt~omomrxp|_ruqptyzqw~zh~zqqpxuwq`xomtx{pzwjg}xrrzyl~gqsmlr|ytxytcy{vtyolsfpmnwyqswghxyvxgz}omwrms{suwvm_x~}stqm~xnsppzwrvyq_cqsg{ytnzsluysxwrj]rxqpo|wnzxtsvqrtl^crqo}}sp~utwuqsnf\m|mrt~xr|wwvtsq}~vjb_slty~~~otwztror~mi]llvt~~}vqyz~wqplz|tic_snyw|{}~pu|tqlp~mi\mmws~{ytp{wpnnw{vkdc~wqxt}z{msslkoy~ofcntvvzx|rk{{omls}zzhffy|qyt{zyjvslnlwqggjurvw{~~}nl|~ymnjt|y|jkgvqvr~~~~vju~}qmkkxrijkwqtx}~~zooz}xqmhs{}mkgrqpt~|zsotytojm||xlkj{zlry}|spnz{xskjsx}rkjorlw}|usqpxzokm{w{kkhx|it{|vqsn{y{vllqw~uihjqjy~~yrropw{pnmzv~mjev|js{|trqmy|{vmlpx|xhejrky~vssoqzzrnlvx~pedvymp}yssopyywpmp~~z{hbl~uku~tuqor|xunlsy}safvyrl}wutorwxyrlmxx|fan|ykr|tvpps~xyoln|{u_fs{uh}vvsnrwwzsmkvw{ham||mo|vvpprxzojlwu`fr~xi|wvrprvz{vlhuyxk`j{|om~wtpqr}y{pikuudcpykxzvrrqt~zvkft{tpah{}smxssrqz{zpfjuti`oyot|tsuqsyvkfsrscd{}vm~xsuspx~wqfj~wro^oztp~stwqryukeqptea|~zqxxrwtpvurfiz{pq^m|ynsvwpq}ztlforsia{}ssytxsottrfhw}nram|m~twvpp{|smemuolcxupzvwrosuqhguopgk|o{~xxuqoyrmejxmoguwp{xvrprypietqmmj~{rw}{wsqnxsnei|kqjqwq~ysrnp|okdtslrh|zus~usplwsnfi~lrmnxr}yrrlooketvmshzzwrtrnktumgk~pqnlxszyrpkm~okgsznrjw{vs~uqljryljkzunolvuxzrnjkqlkppolsztu}vnkhr|lnkwzkpl~uvw{qlhisnmmplnpztv}vmjfs~opiu|iol{uux{pkfjwqml}qinpzsv}vnhgrtpjr|iknyut|ysjfk{~qmkyrenp{rz{xngho~wokn}hiov~tvztihixpnixsdnoys}|znigmxnjo{hhow|ux{ulgguqljwrdlq~xv|yrjek|{mkp}ylepyzxx{wnffprkmu|ueiu|yx{yujdgy}kmo|yocqyzzwzzpfclrkot|wfhw{zxz{wjcdw}lnp}zpcqy~{yw}}{qf`ktlou}wihw}zxx~|xkacu}omq}{ren{{ywy{se_k~ylowwmfv~~yxu~|xk_cs|~rls|{tgl{{xuwztc`i|{|lowwpet}yws~}xk_dpzukt{{vjiz~{wswzscah{z~npwysfp|yts~wkaco|}xmt{|wmfw|vrwzreafzz~row{uhk|yrs}ulban{znr{ypes}trw{ph`ey{|vnv~}vjg|yqt{tnd`my|qpzzreo~srw}pj`dx}yznt|vld{xquztod_mw|unx{tfk~tsvpl_dvw}oq{wocxzstyvof_ky{xlv~|tii~vsuqlactw~qnzxqft{usxzng`j}|zzls~}tmh~xttskcdqy|tlxyrip{vsynhchzx{np}~unh|}yttwjfdn|yvlvzqlm{wrzoiefwxyqn}~uojw|ztuzkidkvxlt{qnl~{xs{qkgduywtl{~uplt{zuv}mkcitxnr~{qom~zxu{ulhcr{tuly}upnt{yvw~pkch|tvpp~zrop~zxwzzngco}rumw~|vopv{yxx|ujdfxvsro}yros~yyxxngckqtov~zwosw|yzw{~yiecuxoto{yspw{y{xvogbhprqv|zwpuw|{zuz{idasyntq~zytrwy{|vu~qf`g~qptxzywsuw}xsw|ib`p{mtu|yxvtvy{ts|td`e|snxyzywvsw~~wqt~jaan~mty}{yxxsuyyspzuc`d|um{y}zxyvrwz}unr~~ja`nnu{|{xyyrswyomx~vc`e|xo{y}yyyuptz~skq||l`bpst|{{yzvqpvwmmvzwd`iz|qyz}~z{xsnrz~pko~{zo`epvr|x||yuomw~ulktxyebjxqwz{~}{vqlrz}pkn~zzqagoypzx~}xsmmw~vmjuwyhcjvrsz{zunlqz~qkn}|xtdgo{{nwz}wplmvxmktxxmcktto{{zrllo|rkozvwffox}mu}~}vmllvznmsxxqcjqtl||zpllo}tmoxuyhelv~ls~}tmllv|pmr{wtcgo~uk{~yolko}uonwtsokos}jsngoszs{~amtsoutzrp}tlt}iimtszyYwsmlsv}pyzq~xdy~rsrv}or]pkms{~qzt~mawptzlo^plow~wq}rudcyvv}tj|ld~qnnu|u{|ryqbi~|vzmiynk{ojo||s{svk[nrugqxsrurns|vs}zzpf\w}ougwystwsmvyru||upb^}~opf~zut}usowvr{}so^azmoizxvsrqzxu{slYcwmonzuvstvztu~qfXluoqsxsyuttwvx}}}qdXquppt~urtuwxxy|n^Zy~rpsy}sv~vwwxyvz|i\_}}trt{~}pw~xxvxvtwye]e|~rru~~yn~|xutyuvvuc_iz}pru~xpyxuwzpxxoa^o~z}otx|uryytxvn}zicawz|}puy|ssxxsyroz|idb}{{nu~}{rvxwuxotzxgbd{~yoxzsuxwwtmwvugai}zo{yptxxtoo|zsufcn}xn~~xmxvxqoq~tuvdcr|to~wk~ywmorpwrbfx{rssj}zrlpsm{pdh~~ot~|mn|ymmpw}o|ndi~ouxls{uloozyr|kbl~muslwyrlnpxr{icr~iw|pmztpmnsvu|eduye}}vpnqqmottxxbhw}sf||uqp~qrmpts{sbjykj~~xupsyrpmovu{pci{~gn~~zwtqxvrqomyvzmaiyet~{xwts{vsrkl~tyj_n~wd||xxvts|supiosze_r}seywvuurtxmip{uw_au|ojuvuxtrwwjjpxur]e{{np}uuvxqtxsijqwun]hyot{ttxvoyvqihtvsk[m}xowysvyrp~tpggwsrh]u|znzwsywpq}sneh{pre`|}zkuuysnrxsldk~nqbf~xk~txwqntvsidl{moaltn|vytpmvuqgdoxlndp}rq{xwrolztofdtvkneryqt|yuqnmrneezsjofuwqw~~wsqlnplcgplpfzvqz~urojq}njammnof~|vq~|srnjtzmibr~lqmhzvqysrlkwwlgdv|lrjmyvrvspkk{tkfhz~zmqiqxususnjlqjfk|~zmpjvwtv}trljopjgm~~zlokyvuxztpkjrnjho~~yjon|tv{zsokkw~lkiq}whqp}sw}}yrmkm|}lkit}sgsrzsy|ypllo|lkix|phtswt{|xnllrzlki}|~mjuutv~|vlmmu}ykjk|}kluw~sy|rkmoy{wlin|{jmt|{s{{olnp||ukis{yinuxt~xmmmr|tkjwzxhmw~wutmmnt|rjly~zwfn{{wv|rmmov|pjn{|yudqzxwwrmmpx|njn|zzrbu~{wzurmnq{}lkn~y{mby}{v}srlor~|kknyyie}~{vtqlos~zkjpywfi~zw}tolou}xjhsxtel~zy{snmow|vghx~urep}{zzsoloy{sek||sqdu~{{xsnlpzyndnxrqdzz}vsllpzzieptsofyvrjlo{{{fgs}sumi}yvpjknzveiwztull|{uojin~ysfl{ytulo{{snhfqzwreoyuvjr{y}qmdetuxofs}yvvhx~yzyqiafxsxmiu}zxsg}}v|wpeag}sxmlv}{xpiyuumb`i~sxmmy~}vnj~uvrja`n{syln|{tmk{txoh`asxuzjpytkm~wtz~lg^dwvxwhtwshq|vt~yke_hzv{tiv~vqgv}ytuvjcai}v{qkw|tng{~{xsxsicbjwzoky{rmh}zvr|phdcmuynl{zpli{yusniebptxln~~woll~{xsvljcbtsxjq}tnkp|zwty}ljadx{svit{rnkv{zvu{zmi`g{xstjw~yqnm}zyvw{ymg_ivsqkz}wonpzxww|xle`ktrqm}~{vnot~yxxw~~wjcanrrpn~yumqw|yyyv}uhcbqpqoq|xsmty{yzxw}sgbcumqotzwrowzzz{wx~ofadz}kroy}yvqqy|y{zvzmfaf~zjrq}|xuqszy|zv}~kf`jvjsszwtqu|z|yx~|ke`nsjtvxvtrv}~z|xyzjdarpjvywvsrw}{{yzxibdwnkw{~wussy}{zz{~~wgbg{~mmy}|wtss{}zzz{}~uebj|lo{{vtts~}zzzz{}rccnzkq}zvtts|y{y{z}nbeqyjtyutsu{yzx}y|jbguxjwyutswzzywyygcizvjyxutszyzwxxvfdktk{~wuss{yyvzwseen~sm~}wvst|}xwu|}uqefr}rn{wusu}|wuv~yspdhv|qp{wttt{utxurodky}orzvtstystyqsmen||nuzvtrtvruzotlgpzmxxvspw~sttokgflntotvlWn_\lyen|x{tPe]Xcovtixkho|Si][kq{ti~wuwwTk`Zcouq`pmq~xUxccigs{izpstYte_eruzm\vst}sYzlkdaojxlq|r_v~kfhtuxjY~xs|zo\tur^_m~hwoqzqbitnkvqwxkXy~s|~um`pw\bk{hxuqyqaa{voxowsnXss~x{qlcm{^ejyg{|zsy}r`^~tymwsoYoswxolfk}cgjygw|tx{s_^wymw~xqZjt~zxuonjj}hgjyir}uy{t_]zulv{zp]fv~xyspplhkekymm|xz|u`]~}qntx|oacy}wypqrogodlx|qh|{|}~tb]v~nppw}ofa}|zxyortqfwrcmxyvd|~~yre]olrmw|nja}yzxnruseoscnyxza}yrh\hlskvznnbw{vnswudhvdpzx|a{zqj[cmsjuyprdv{upuywbdxeq{z|cu{|}rkZ_prksvrthz~w{srvzwabzhr|||zfox~{tk[]splpttvls}xzstw{va`}kr}y~xkiwxvj\\vmnnswxql{ywrvz~uc_|ps}yvodvxxj]\ykokq{zvg{ytsz}sf_suszytsa~xxyi`^}{jpiq~|zc|yqu}pj_j|txzst`|{z}xzicaw}joiq}b}~xnvom_bv}v|~ssaxx}zxyjgdr~jnir|aywlxno`]yzu}{trcvw~xyymkhmlkkt|duwkypoaY}wuyupguw}vyyrnmkoinx{gpxmytobWysuwvokuy|vxyxsqjriq|zllzqxxnbYpruvwopu}xuyy~wskw~tjtxpi|xw}na[hqu|vwpuuttyy|ummwmwwuezw~na]crvxwwryvrsz{vlexpzuxbux~na_atwtxwt|uprz}wlazt}uzap{obabvxqyxwwpp{yk_|x~vybk}}qdbdzxoyz{yqoz{j`|{wweg{}rfdg~vnx|~{|to{}hcwyytheyx}shfjtnw~~xvoz|gemyzpkcwu{ukhmyrows~yp{{ggey{mmctsxvmjouppvo}{q{zig_|{zkodsrxwpmqrpqvm~|s|yle[y}xjpg}rs}xxsorprrvl{~v|xncZv~ukpjzssxyxuqrptrw~lx~z}xp`Z{vrmpmwvrtywxsrpvqxzot~}zo^[t{w}qoopuzpqzwzusqxyryvro~~|n]\oxxzpooss~noyw|vspp{rzsuk{l^\jvyvqpovrloxw}vsmj}s{qwg~zi_\gvysrppwrkpvw~wsjfu{|rve{z~h`\eyxqsoqxrlquw~wrgew{yutew{|{h`]c|upsosxsoqtx}xpdez{vwqgsx}wj_]brrrotxu|sqsx}ylde}}{uyoio~x~tl^^bprqouxvuvpty|zieeu|~vymlk{y|rn]_cpspowxwo~zpty|zfgco}{xwmnhy|zrp]_c}qsopxywj|pvz}zdiaky{unnfx~wso]`exusoqxzvi}qwz}wdj_hy|sonf~zuuo^`fuxrorx{ti~rx{~vfj_e|{}qqmf{}tvoa`gq{ppsy|qk~sy}tjh`cy}|qqlgy~uvncahn~pquz{omy}uy~~rme`a|w{qqkiv{vvngaikprvzznps}xz}qqcb_uvyrqjktywtnjcjhzpsx|yorn}{z{rtac]owytokmswxsonekfurtz}wpsj}~zztvac]jzxvokprvxspsikdquv|~trtg~{xvvcc]f}|xxnmssvwrrvmjbnyx}rtsf~}wyuea^dzwynnutxusuxrh`m}z~~qvrgx{v|th`_dxwyppwvzssx{wh`k}}rwphrwu~rla`ewvytsyyy|qt|}|hajz|twnkltuqnbbhvvyxvy|s~quibhszwvkmirt~rpeek|wwy}{y}o~rvkeelxzuiohqt|sqhimywxyy~m~uxlicfw}tgoiqtwtrkmpvwxzz|lxzmlabw~sgnlstsusnpqtyy||xm~|}on_`y~rimp~vtnvtrsrs{z~~tpz~rn_^}|~qjlt|zskuvuuts~{qsu|un_^w|plkw{~riuxywvrw|nuq{ym`^r~zpnlzzphsz|xwqq}lwm~z|jb_o}wrpm{znhr|yxolmxjz{}ic`lvsqo|znip}zymkpvhwz|}hdbkutsq|{njo{ykj}sshsv~{iedjuutu{}ojo}wik|woiptxjfej}uuvwz~}rkotily}zjjn~sulffkzwuwyyx~ukpqjlr~{gll{u~snfgkxwty{xr}wlqnljlzfmjywzrofhk}xxtz|x~n}ynr~lnfg}welixzvrogikzyxt{}y{l~yos}}kobe{tgljy{rrohijw{wt|}zwmyqt}xmn_d|rhkk}zosnjijt~vt|}zroytu|spk^b}~qjjl}xnslkhjqvu{~xosyxwv|psg^ax}|rjimzuorklgjl~wuz~vnurxzw}{ovd__t}xsjiowtpplmhjg{ywz~rnwmy}x}wqvb`]pvujipusromoiiby{xz~oqvjyz|sttaa[muvjiqtusnmojg_w}yz|nsshz|zqvqca[j~vvjjrsxsnnold^v{{ynupi|xqxme`[h|xvkkss|toppma_s}{vpunk|~vsykh_\f|yumlst|sorro_`o|sstllvsuxjj^]d|ztomtuuspssp]bj~|qvrkmqqxvkk^]c~{tqnttpsqtup\dez|pxokmmrzslk__c~{tsptsmtsvvo^eaw{qzmlmkszqnkaadz{uvrtqlvuwxnbf^s{rzllmjvyppjccev{wyvtomxvyzmfe\n{uylklj}ywnqjffgs|y|ytmp{xz{lkd[j{ywmkkl{|tmqjiiin|{~|sks|~~z{zloc[e|}tnkjn~{rmqllklj}~vxjXvxvxttgzlj]cnsagko}Gyqkchkz|n{zgni{n\[X[lwtWgvTZ]humlxllmfKslolzyvzpww}gobU`t`T}zlxlich{o~ro~YUosmt{v~{{uu|yo{c}nfr~n[h~}q|ugdt{~izrvbRg{kwv~xz~xy}dml|wa[o}twtxomq{~zmyxua\xprzzu}{opxxog{|radz}zupzjx~~qor~xe[`u|y~~r{|xnt}vidg~u{xsh}zuu||n~}}yifivsx}{vmzss|qjyyihp}xumrls~wou~zt`dm}|w~wvrvt~xlu~zugiq{~wlqnoo{uk|tifwv~|}ttvtjoyid}{whizuwtwver}ih|k`e|zzz{zxrp|xdg|kgkx|trusqoxphpghf}wxsux~unm|~ddl|glk}ywy|njp~{ijo|}qbcdxuqy~uzp{yfgt|~pichs}uxuz|ss{twyvis{qdZkvznruwvvrqjhmw|mdbw|{rv~yqtzsqmtkw|{{b^Y{wplz|y{~twmpb}{vfc\rtqt}|wvnw}oqswitdZ\sxjs{z|zqxqjtzmkc}qebnxzn}}|zpkztns~rld|i]^lxrm}~zyu}wpyxjbhx{zjdgo|qqx}uxrqj~tkvttioy{gaaq~vtuuuzxvkyil{jm[q}vwhljyz{xwxxyskj|mpwor\u}ylff`yz}suz{{xutzpt}}jfX~vw|moje~s{rwuuwpnr{nozona~w~{pl_ansqx{uut{qhrqidZt}vnhl|qut|uopvwlvrqg]}|v~vqeaftnvzw}yx}uolkZ_}r|ytihk}nqsvzsznyspos`i}tzoaalpoqx||l}zhr{jlVlwv~phku~qqu{}zxd}p}yqo[s}r{rhcfu|mpz~k}ytumcWzqqmjmyrjqw{{tf|zyrid}tpicg{wmqvxjzvv~olcb}~uwnlqvotzwoirqje~wwvofiosmu|uo{~pmc`}~ssjqsikv{xppwtietqfmnnqy|or}wpodf|xmuuoux{euvvsfjxulhuv|ovf}tul_m~smo{ypiszxc}ndu~pjnwxts{weuvfe{}~vtx}|rvzmdyxij{~xumlt|~ty~nk|yqeh~rpr|~nt|tjpuljnpp{xu{vlt~zyiih}t{zx{vurgv{{mlhysprt~w|{~wk|xwhdgtsu{xtuyztpmlfntrux{v|~zyrqztaeu~w|yx}xulp}qciwxwvrvvw}z{~|rsz~f_d|{zvzx}yrwzsntjghwwwwu|sy{wqt|u^dj|ysyz}okr}tcjnvuwuwtxyq}~}qru~xm]em}zwz{zstqszirsremrw|vtvrqo}x|zotpuyddjs{||}xvvus{niiryzhmjw}s}qtrprrywv~spkuxwsde`}twsvxwtkk{}hlfy~|ljg~yrqmomr}vukqf~}|syqddeyzzyvw|xqutaiavtijhyzopmnnwx}|uujnfxu~i`_essqsxy{nly~ihgi{niel}mplmrtqz{mpir|{rvdb_m|s{vz|{v|xy|wafcxyvkges|{nlnktutp}}hqiz{y~m`Z]vtrpt}zzq~zss|}pbod|ugde{nnkrtopm~}rlwg}}y{zg_`btwz|xunxz}~|fgkb}|kgfhzsimqvssnn|nupgv}rb][g|otx|zypswpv|~ugrfg~zleeqtlstupnhw}zryhl|t}jc^ctvvxwly|y|}skm^m|njem{~yhouuwqsg}utdpzyxga\iztzz|~wyhss{~~snn`q~sjit}{qvtxvmncxurburzreahr~~z~wshz~nmf\z|ukirwpptw{sqnkxwka{w|medlp}{yxqq}uz||mqfb~ysqvwzww|zppit~twheyryjhktx}{ymzton^c~oqry{rqy}xqum}sci{zxjmmtw}w{o~~~qsjbn~y{v|zx|{vquiwwkfqnyrnoq}z}{m~qocat}xusxxxswz{uvwo~wjgyyrpnuxuz}xqyokfj}~{yx||~{tyoq|sojmtvyqprzvqwqnhekwvx|vvsv~zyyp}y}plpz|prruq~zr||kqfmu}z{tyz{xsmzrukqu}v~rqrpyvxpysonfmuzytu|wvqu~{yrp|yppy~trlrvw}rp~~|otmko~|y|z}v{{tgmu|qnqy}upmnvzxkq{pxgil~uru}}yqt}{kktnpnslmoxv}lpt{}sxtenmyz{|yx{|rdks|uknmx}rjlnw}yykrwvzicblytsw~|~tuw~xlhtzqifrnllrutxnqwz{zvwccdww{}|zy|x~yubmn~zfif~zvqhnqrvvx~mxntyjZ^`zrxxy|xzypqx{yqjukreehzonpnopnz}xsxmxtvc_blx{yvty}wtzyxkhmj|zigjs~utkrmopqqy|sspkssn\\crxytwvxs|rkryz{hqhl~ygikvxqojjinmznxgsxlvh_fgx~~yvttpusw{~pbl^yv~mjnlw|pnmjmoqp|~ynr`yspsaabezxtsvvwu}ulox}kik_}|pmjlpoijjkov~n}{kn[ckstzhM~lXUYl}xzw`gr{udafQFN_w||{vwcZsoyuoVhVTbyy~z|tdh|yw{hhx^MRgz}mwm^Vlvwzv}idxtc\jywx{{rmdj~xvqikhRYr|lxc]Sh|rxugnqrcpxw}wyzhfcf~~x~moprbgy{qy\]Sjm~w~~nboq}p{}}wy}xhb__}z|qqr~znnz{}wxt[_Uin|{|zqhbpwwu}l]Z\|~}t~{{snuyry~}|qwc]Sgsy~tpjbizwwv^V\}wy~|z{tmxty{ouiUPd|y}|tslcd~~{y{aT^~~v}yvzztjwzxquoPRdy|wwwnca}|yxaO^xyss{zvkv|xusqOWdw}syuldc~z}{`N^v}~ot~{uks}x|{rrTYcz|rytoff{~|ycR^sxpw}{uoq~{|{pm[Xc|~|uswtnffo}}qjV\qrrv{|vslz|t{jhbVcxzxuwuvnidg{~}kqY[ontszzwsexxpfghWcrzvwxttnlagv~jq\]opvszyxmbxtrjhkX_q{ywvrrqj^hw~mpd[ovvttxwheuss|}qfn[]ryx~uyppqd`k~|~{pnhXoyyvtqyqfhs}vr}zwfq]_nytvxyloj_bl{tmh[nxw~xrrujghv~xu||{zjm`]evuv}umkc`cp}{hj`fuxtspkhfmx{{w~|igfWduzu}roc`^es|z}~cn_cuzqtjgfgos|t~~gfgTcs}x}tm_]^ip~yyyz~cm`bvssiedikqzv{}kdfU`w~rj^[bim~zvuy}egd_xvpibfjfs{vvz}}q_fVa|oj]\dcl}~stwfcf^{{xmibiecr}utx}|t\fZd|oj]_a_l{rrvh^gb{zzkifjacp}usv|v^b`ex}qg`a]^jy~qoxm[hiw|~kjjf_bm|wqv|v`]hetztef`Z^fw~so|qYioqzjmla^`jzxpy{wdZndqyyfk^Y]dv}sp}uZhqmvnol``^g|zxq|{uh[peny|}kl\Y\bs|vs}v_frlt~upk``]ez|wt|~{tn^lhm{vpj\ZZ`q|xw{~whbpnu{}oia_\dyvx{||tscfmm|~rwg_ZX_p~|zy~zq_lrzywohd_\dyw{y|{tvi_qnxr}gbZW^p~|w|x_gwvtqgf]]fxz|x}{vvn\rptu|heZU_p}w}|ccyrtvhfZ^hx}x~~|xur]pqq~ywlfYUap~y~}javrx~{jdX_hw|y~}~zutajrr~~tsfXVao{~{|p`pt}ylaY`hw|{}|}{tthcrus~ycXW`o~zz{vahxvn^[`iv}}zy|utm\ryu{~aZX_n~v{{z`b}to]^^hu~vw~vtoXq|xw~a\X_m{r||za_~v}o^_]hs|sxxtmYn}tze]Y^kxr{~vd^|zur`^]esxsx{rl_jpvk\Z\j}utzqi^z}mvc_]aq~tuv~}nldflso\\Yhxuuy}nn_x}jxf`[`lwtvu~{kmhflqs_[Xeqwvyzopds}jwl_[]duxwx{wmmnfqoxaYX]lwyx~zpqinlwq\[V]s{yxw~{upnse|vn{aYUViy{u~{qtklowr\YOYp|wvyvusrseyzpydXQSf~yu{~{vslkust^UNVo{wtsttvtqhrpthTPQexww{}|ypphznv^RMTpyyqpruzrqkkoqkRQQe~xvtz|xnqg}}kv_QMUnzxoopxzqqkhpnkSPSexxutx}vophw~krbPPWi}vpmqywromg~~tilUPWbtwvsx}vonkrkmfPSWdtqltxusmog}~yelXRZ^rvury{vnmnpmhjSVUb|tqnuutrkoi~|{cj]UZ\oxut|zumlproekYWT`wtrqustqknn{|}efdWX[l|sw|}zumjrutbkaVT^svsttrsolmty~}hbkZW\i~sy|{{umjsywbkhUU\oyuvrrrnlmyw|m`n]U\f{u{z{|tnju}~~yeimVWZk~wxqsqmln|x{sanaV\cyy{y{|uolt|}zkgoZXYhyxqtpmmo{{~ywejfX\axzx{|vqns}|zqeoaYYf{wstomnpy~{xzkfj[Z`wyxz{vspr}|yvfkgYYewurnnoqwxwzqcl_Xauzyyxwurr{}yziglYXe}xvomooru|wwyvbkbVbt|ywuywsryy{mdnYYf{yvmnpprtzwxxyehdVbsytszxusx~z{rck\Zfz|ulopqrtyyxxzhddYbrxrtyywsw|{ucf`[fy~rlnprru{zyyyzm^d\arvqty{wtu}~zxc`d\fwonnqsruv}{z{zzpZc`artrty|xurzzyc\g]fuoomrssss||{}{zqXbcbqusty{xtoz{wdZh`esqonqrsps|{}}|xoZ`gcoysvyywpoz|sgZhdcrspooqonu{{~}~uo^]jcm|~txwxtlpzzqkZhfao}}vrnmoknvz||~}rpb]kckv~xyuunkq|wqm^ff`jy|{smkiiox{z{~zsqg]iefr{xtoikr}wrpbag]fx|qngdho{|vzzxuql[hebq|yrigiu~zxstc\gZdw~qlbcfq|zuwwyvunZee`oxogekv~zyxwvdZd[cxrjbagrzytsvxywn[_e`ounfdlt~zxxyztgV`]b{qhbaiqxzqptx|vo]Ygapsoefkq}~wwx|{siS]`b|rhbbinvzoosz~vo^Ugdqtoghioz}vvx~{skTYcezugddhlt}xnns|}voaSeiqvojhgnw}vuz~zsjWUfhwyhgffjqzwomt|{vmcSboo}ypngfkt}vv||yrj[Rikt~~iifdioyvpmu{zwlfU`sn|{}rqfeir}wx|{yrj`RhmqznkfdhmxwqmvyzvlgY]upzzvrgegp~}yy|zyrjdUeppwtlfcfkvzrouwyvmh_\rsx|yrieeo}~{{zzxqkg[aqp~v{lfcdjvsqsvyunie\nwvy}rkedn|}{z{xqljb]qrzx|mhdciuvsruytojj_h{vwsnfen||z{wqmli[ovv}xqidbiuyuquwspkmdc|xxuqffn{~{|vqnlm^kxuvujdaju~wqttrqmoiayz~|wqffn{~{ztrpmpbfwuwzjc`iuxrrqqqnomas{{{pggn{{xsrpnpgbtx{}~kb`iuzspoqqpoodk}y~nhho{{utsqppl_p{zlabhu|tmmqrqqlkr{kdmr|xbN_{rjhSVy|yusa[r~pSkwwrofSgwmfZg{ytUI|pddch`Zr}z}uieuvw{]Q{~lhnxxhi~~txrhbiz{zrmSWyg^agbcq~{}jfipx|j][qipoelzvi_hn||yj{r\^bvc_gdjy{}cekly}xs~uqpixiqtou{x~z^kjn{ilow{fefsvjnhkuw{kshjq}zmtw{qojz|xwsy{{}nfjci{wpsejp|rhkx~sjbiv}zqpcbwsxszy}sv{xuxv{}n{qnoakitsar{{ugy~|yklptyx{upfWh{jwn|zs}~vrmnsujj]_txi~kn~yxqgoqlinmrqi^frvvw}{|xwysnhywx}gaakwys}jq~y~xpnwrkkdf{gb`dv|{w|yyqw~y|sg\mru\ghqpr{kz~zpnn~}nlbbw}rajdpxy~{zwyyxu{lYbywgfomwqzup{w|ullu}w~ub\gxjjjkuw}z}zsvstvu\^mutcgmr{mytmv~xmgqrzf\ep|~kllm}w~u}yruuk{~h`fuxmxgprtzk}hi}vlpnrqbdjx~z~gmgo|xmx}ttujsqc_h}kttepo{~{oqwaw{mjgi}hgfo}ruglm|x}{myvumopgdq}jyogouzvtrmf{wqfeurkfgpysfkpt~wwwuzyklu{ocgtzlxkgsvt~jjnnxk^m|vphdkwvlfoltoy~z{wmjw|{jcj|ylzjowpwaqrqr`dtvzqggn}uhlki~~gyz~rjsytfdovozfomqraynvzg`itvyheisyx~hlgtrnxvjovzmjkxmsxgmm{khxkz{peimzxreimxx}hhiyqtyynmsuzolkxpyuekt~zihtq~vkjgmuljkpzztahq{~|qs}pkqp|{wqko{qznbpw{z{hj{u|vnliey}rrmlr|xnboq}z}iw~unqpu~{njpmxfdrs{x^s}sypokeovwqhjsu~fgnr{wf~qplovkitzitblrz}|ob~xsunoflzwzlik{~sxejl}|sq{wqml{ofh|rkqdlt}wmlusuqijrz|thfovqucjwzxuw}zwnjvxgdphkqbq~wzqoptsiiorvochtmwrbu}vv{w|rjry~~rcgr~brjg}~~yir{oxmlnlt~sgcktkxhlz}}pxylpqv~wgcfytfsju~}}~~zfvystongjtvnggkzlvmt{}mutqppuyqgalpfwow{w{}rb|xqwpgcg|noedtrm|mwz}tm{wyokjtsqafzeo|ozux||}yeiryvj_]p{pmdnzjxxmvx{lxw|tkbi{uidn~ygywouwywwocsx}r`Ucuyqmlq~}k{rjzvwm~y|pabo}ypkitui~olzxwz}xoqe~y|eWZhsuonsxwm}gr~~}uwwm{yecfrtsjot}ooygv{zzz~yqtmj{p]Y]qtuoom|porh}}yuw{tvynechysqmmr~lntm{}{wzttttms}sh]Ydxtwoiqilrp~wpxy}szwrngfn}qsilz}bptp}zxqpvswk|rqf[]izwtgkwy_ssxwmryz~qnulhhqwtlhtp`ysx}zontvvvmnpb]_rwwjip|lczu|mou{}|t{ptkhiyuogow{hg}u|}qlqtwvupzpna\dxtojntzgh~xrnqx||{syqskgoykjls~~ugnutloqwvxtnwok^^jwlomqz~wfpyyqprzzvpvrrikpy~fmnxxvevuyoopsxvzlpsog^bj|yjpmu~|xex~wqpuz|nwstnjjoqinq}ztf}z~rqnquxxvhzqoc_`nqopqy~tg{wprv|}ym~rsmjgvmknv{rkxwsqntvyurlpmb\`xqppu|}rl~}vqux|xxqrskflljozzro|tvsorwyxruook^Yhoorx}sq||{suvzyx|rqpffuiks}}{stvuwppvxystwn~ngY^qkru{suwxwxwxu|{r|okcl{}gpu|rxsyspuwwuqytrylaYev}{mwv}qzx|zyvutvvyvmffrulswp|uwpuuvtrtzq|sg\]h~~xsvw|n}{}~wurty}wqiektupsy|m~uuuvstqtuzumc\_n|yuuw}|m{{tqqwyzjggl}uptzym~tyvsqpqsuwfc\c{~wuuwvm~~~wpnsv}xzgifspqs}rqxyzrpmorr}uud`\o~str{ot~yqlpsywrhgl~mpu|owz}uokmpry|uoc^evqru|{oy}skmnv}vogkuyjrzzzo|}zqjjmny}wuiadkzynuw~{zmvljkruvhkqwolv||zynyvjiilu|~pz{cffn}qruz}}vr|okgnzp|xkrqy~}krx~{|uxvoihhrx{}zq}tfffp~qty}{v~~vmejs{~}zq~xoqqv}zzmw|}z|xxqnhgmrwwzyrqeffsw~pz~~~z~x}|shhmtzxwstoon{r~vr{|||wqtlijlqrvuxidaj{vxwz|~}~y|zojhnqu{t|pmkt}uw}}y{{~~w|ssnjhkjszv|zb_es}zy{}wz|~~y|xnhijny}u~hkpxywy~yyy~~{szsumifdlw}t~pZckyzx}xyz|}x{|vkhdgs{urfpst{{yx|~qwwwrle_eqz}t{b]isyy}xzy|}~~}t|rjabkv{w}kks{v}}|x{{}xpwwqg]aivyqr_boz{vyzz{}|zzx}yob]eo|wszjox~vz~{zz|~xxruwl`^dn|rmp^iu~|yt|{||{~zx}|zwf^`iuntyjuz|yx}|yz|wyyvurc__ht}~hpmaow~ry}~}{|yv|}ym``cnxyjzwnx|w~w{yywx}x|{ria_bmwvgsjer{|s|~{|xvzrf``gq{tm}vqzu|zzyuw{yvlea`fo{}siujhv}xv~~|yty|yld`bkt{sous|}p~|~zut{}znie`bjs}||qkwhlwzs~x~ytv|pkc`enx~{}qrswz{}m~vsx}zhibaemv||noxgot|~s|{|vv{~nj`bhrz|}oxsxxvp{sv|zxhg`dhpw{~ltwhntyx|~yuz|mf`ejty}}o~svysuwuz}ythdbfjrv~}nxugnxw{~{vy||kdbfluz|r~qv}rx{uxzwqedefkqy}pzqeq|v|wwz|vifcfmt}}szpzoxwy~ywlggdfkr}|ozlgutxwx{}qkebfmw{sut|~o{yw{t{~ijecflv~woxhlww~|vxx{pkbbepzvusx~zwzwxr~zlibbdoxqothp~{xwv||pg__gs{qvt{{}~xw~~rzje__gr|josiw~yxvz|kc\`jul{~uz|x|zttga[aivzespn}yzvy}ug\[bm|vl{}wz|{~w}lc[]bn~ofvqyzyyy|{~~l_Z]du~qp~v}zy|}x~d^[]fv|jh{v}wy}{yyy~a]Z_lz~}nvzwzwuxwr__[bmx}xdrwy{~~yusyo_]]gpz~}~yn~t}vprz~v}i`_agox{~{qg{}xv{snsz}h^`diquz~}xtz|wxnmt{vszeacdhns||ynjyxwtnnt{zzbcdfjms|}vyz}}}}pmovmwvdgdeflv||yjp~t}}~xpnpzu}scfefemv}t}y~~uonr{wm{rffdbdpx~|tgr|x~xtpou}t~pdfdbfpy}q}|xtppv|}to~oef``hs|xpcw~}~ywtqsw{vkee`cjt~xmyxsrsw~}}rujfa^dlx~|vhd~~vxttsyxz|gd_afny}pqxxutsy{}|rzzfb^agr{~zpck~wyvttzx|wb__citz~xoxxyvsuwy|r|v`^_dlv{|skdt}xzvtuxu|p\_afnv|yvpzzutsu|{q}m\_ahqx|xolf}{~|{zussyt{g[`ckqx}{ywr~|xurqwxrze]`dlszztpljx||xtps~}tua]afmszzz{xx~|wsns{uqta_bhovzwtqmqy}|wqnwyqp_^cjovxy|}z}{uoow~qnq`_djqwxxvsov{}{tnq{tnn^_flqvw|}|zqnszkmo^aflrwy{wvrz||xpou~nol\bhmrvz~~}wopv~{gol_ehmsw{|xzrtjnps{~{vwosysxsqsvy~\R{VO[eWWapwsw|mzhm{qnkr_VrZXb^Y[u~vx{i[fuaz}ukizsJWk`YVXcsonjqytyruuv}ylTVpeeh`ThsceppzjjxrsvrqymU\bqXeigfapzommgcmmlo|yjQSanhas_^el{wq~ed_hxsv]WJUy~lzcbaq}y~vbppqxz~z}xidHNp|qrdqjsqvbbbcffxusrsURE[o}xaggqxxzna]dv{v~}}xr_@Kbt}neeh|pwaiprqtlws{y~kgS@I`jorot{t|qsfajrpk}qoqwsSLNa}ihen|yymbbai|{snts}ukoJCAZppfqxtkummsvwugp|{uyvVL@\ultrt~}xnrmbelsefatyx~rtu]MQI\~}njt}t~tz|pnddtubu}ytxyr^G@Tyswmk{htnfgntzun_VcppyvvYYFB]}z|xuqcx}sfewxtgmorw|pmhgRJVrzkm}z|gfafi|w\]Zjvvymo|ueYBCViyxdensvrwy~yqfh^x~owwqfLG^u~{{nwqvqhdlxs``dUadpsu~~she\TQYbz~tmykqlpnr}ood_opzz|x~~|{bMKV_{~z{qrioakv}q]gSRbit{vw|yfeYOTclu}jngi{vysvymbwef`gzwq}wzsmc^V[h|rysi_ipvtjiNWS\}nquv~rufYPYZZ]tu]ghjcjoZccqwwyxonddca]~ws}gtqorvwz_hfYUJWxwnpw~ypk^fhf^STv}yzkl`i~kue]^\gx{x|~srni`IQzwhmeh|vcn[RMVc|qr|wrfaggejUYjqyobekvweiaeZ^j}}rzpqvgGS_lsyxons}{qvn[VLT^y}tmupnpof_CV`mqj`fnxyfXTTkzyuuqx~vnTYQe}kij}gp\^[T]go~uqlp~}q\LTIZuxwlu|~zg]W[gr}}uos{_ROK_tzrqpz{qw^[SYipn}x~yt{||qkY]OIZp}ulrz~y`c`cmtx~tur}ceJAKmnwx}jyta_adgckuyvux|{iQUBKWo}~|~wzmb_estxw~{|zzqlmJIOitpq~sw`]bljmgg[ozt{|d`Y@CKloqxslpljhppstrkmYHMRg~z{}thebinqna]smz|yuns^kUGHThq}pmnwzsmo`dvzw{|rv[OFMe~~pymogntqifVgjh~~olr}og`FHNXhvy{nwsxuttmZokqv|mxs_TPTarxvfdfwzsqaP]Rgznpvqs]PHIRj{mvksxysnZ`pbsyxwtyaZV[Yam~|ooilrtvx\^YO]irltsoo`XNQWak{}yxhon~xlVcW\q{}}uf^VRWcotwsnumqvuucXhTVZjspmurwcYQVY]_fhwsqps}hbcR^bt|v}rrc\VYX]gnsijw~zsZbXJU\mtpwye]TSS^ebb~zjwv|s[ja^_`r~x~togceb\VO`{{xvinwv{rfkQPOQd|v{y~npe]WZ\ZOhzrpqmziceSY\fv}useea_`ZMdj~tywuwyvwbjf\ZOPcz{vtxlj]add_PKc`yz{oo}qu`UUV]rvuvyolgc_JKdfvxqp{sdl\XRU[jt}x~|wi_bbadRX[Wq}xvv{yspacZX]povmjrvn`DPPWs|ts~}zowo_XPRVgx~urypljfc[IZV_lv}tsv{|i`XT_js{yxyylmtrnbTXGQcy}xtltbf`YX[dmi|ztrjissmVOTHR`y{y|~phVU\do}x|tstwy~vpYVPJT]t|z~wwq_bUXdhifawv|~uqpunfYaRJLWnv{lncadflkkvsosxs^`HDCTwntid\^ebgdj|xx}upqu~wbW[GOP[q|xqjccnnmbo|{|}zw}~{gjkNJERjv{fcelmnicTdlwqrrwdd[EFFYvuxzzsupkfb_wr{wvq{fl[LOQZmzlhdimqraYh\iv{itxs^lZNKQ[lxxsorz~snYYgc{~~|{ot\SKNXm{xqsoqvtliUbf[kx|mkrskeMKP\cnyqvv}}ysXd`\k~}jqna[W\\`mzklkwzujT_QVi|~vs{sxcVNNV`lzw}voz~xbWgY_m~~rw`ZW`eddlg}ttuxztyeabPS]syt{upq__V\_^ahhsnp{caWLZou~ucb[_a`hecqw{xmXf[TVduwy}uj[VWcfbg\c|ywvyzkkTQTe{~pzfiffig^]Mf|~vsu}iebMNUixv}he[[^^beVmpsyuxlmcWVZjzywcc_irlfXKb`t~z}}wks]SNS^qqohicdf__NSlfu}wu{trWQO_n}xqlfchjefPX[Xo||~ikh[\TY`ly}{ii_`ilf\H[UYo~{~|p\SOXexwwjqlmojfTGZR_m~{|}ms^ZSU_houn}q|tnbbgcdVW\MXcu~}~gg[X[eqwtonifmwsjNRMEUhq}vc_RUYboppsyntqnnkd\KYRT[bquhaU\elrht~wwkgnpmbY_GFM]tyq|ghe^\]_dZrzxqqkjrsmXTUFMRcv}ytaXZ_goh~wussuxrkX]TJNN[o}ydg\\dhi`Vpny|{w|vpnrndYeUKILZnxvxlfdad^b{yzuoos{}nacKHCJ^vwxqk^]cbe\fpfuursuz}{q\[]KSOS[k}{ysjhnliYgll{}xuvxucniSNAFVjmnkkllf^Rcajvwumqw|ycjWIKEQdr~|yromg^^pflr~uzsboZSRMPZdw{rlhhnsr_\aT_f|tyuz~}lcoZTMIP^gwzyxx~xlV\`[mtz|ursYTMKRajrtz|ussspiWhbX_cvvpozmmgRPQW]chhl{{w}u^hYT^j{hrlb]XXXZ_`suuqy~ziYdRS_l|zy{}t}h[RPU\emdr}x~j`jYZ`n~|rwa\Y`feb`Sjy}{|}yzihgTSWeyqqtcd]^`^]]Xw|~zw}om_OSbts~yfe_acbe_Vomx}~~q_i`ZZ`lvrq`^\djeeZWkgwy{bXT\j|r{jfjkmmc_NWhgyqmkUTVeqyqrpkgecc`cVcgdpvzra`\eouieciqrlbPZTYo|mzj][X`irowrglopoibTN`]fs~m_Y\irw{y{pmnmnih[\^RYfunr_baciklqmxpkhknrnfSYUO[nzqj`^cgtzzmlovvuoaPZRRZjwo^\[cnnrjn|rzyrrqsplg[XbRSXg{zvqojiigkdxtmlovxt_]ZFIPiz{nhb_beglfy{y{}kknwzyrfQYSOV[kztqhflmmgdyu}~|utssqf^jVLHM_uyrhjhhjfeZatr~}pnmquywc\]IJJXk{wlggdgaqvq{zuw{}yp]b\MQLS_pokechomeXgdguvyuvuvuk\j]PMISapz~{wsldZYmju}tuvz}rflTLHFScrytjehhg]el`fm|}rqqzyc`dOSQRX`jtu~{wtwsjYbb_kv|yxtdonZVHEMXjwwvsrqqj_Ud^ajq|{ppu{{jq^NNIN[enkt|xun`_m_ben}~req^XXRPSV`b||vonqusbbcSZ^myz|{{mku`[SKMV\fgpZb_Xeis~swt\YQMQY]^_{~ytsqi]ncZ[ZfvytzmsiYXUVY[[X_xx{wgmVSY_pylynfaYRSTURf{yy}zf`hUY]blyyz}zxj^URRZabXgljznoo[[Y]k{{wwb`\_aa]SH`ep|}}|krhTTT[l}}nxvhi_]ZZ[TSnhmw~swdUV\fs}xzid\^aadWScWdtrgrd^[\`js||toda^ejfcPTbXgwj^TW`o~xmjkjlld^KV_XdsuuqZXWblrxvprsqnjgggdaTc_W_mx|kibdhksrxnheiptpcR[NLZrrrc`[`glwqytyrfkqtuogUO^V\dtxkecjppujyvrrqpmj[_cPQVh~u{fefilmjjayqkhmrvunX^YKS_v{{wqmjhkljurrz|zuhS_VPV^n~}hcbgorrgevow|oqrxxsoaYhWSV^m}}|ux{zvnhZexw~xtvxxzfbgNKM[n}yqmmlkii`qtowsjjr~|v[]\LT[fs||xvxyyuj]nijx|um\ldUTSYdqonpvvrn]Ykfozytnrxz}rcmXLMTcs|~{sl\eqgov~}|gbhUSWZ`flsvwooprtm]hg]fr{zy|}xraim[VUV]eou~}{~xeVebdq{~{ujtjWRPT]djj{zxsmh\aqfdgo}ztv~|ogo_UWZ\abcd{~vehhZ^fv}thmvh`ZTQSU[i~z|}yrdZfd^ekt}xuvvurzt_URQW^a`i|~~vifrh``do{wpul_]]ZWRNPe|{xusqikn^Z\cr~}xrnrzrg_XRRRT^t}|ykmi]_dkrw}{znaZWTVTQXiqxvohgrpd`]`hq|~}yw{via`_[WQO[kqz|ziZX[eqzyzzrjd[SOJM^lpwwnmoe`bdgils}yuw{mb\XVXWZdffny|}od^[^gm|}sy}vzp_u|oojdztwvssiiilj}~|}}}k^}rpwsttmkolr}vuyxxvt\\x~mbcffq|tuwvs}|~r]\||pk`PIcyqkoz}|y}ufivz|sjq}xtshfwwxrgRIUhutusecjibUVYS\mw{x||puxy|~{_]emutzxnz~ydPQXmzlQ@GTew~vkx{xwuztsykbgj~svzqls~t]Za]dnppjpsd^[VRQ`kfluvqktxmouuvz|opohpxz|}{t^SKFNgyeZWRYn|}{zt{|vu|rg^e{{umfg|ywicjolhqzqhgc[U\fccknoowzpnrqrw~mlrsrv|yhbWHCNj|~tp_PZgrzwywuw}wd^hx|zy|jah~|lklhjoxvopj_]ahc_ghdht~vmqnjn}uuoms~~qjdTHFUfowc^[\j{{pqy~ujfnpu~~uvuifm||xtghpyzptteadmlbeg_bjwzqrlcisuioz|sn\OMOV[lvkdVWkunt|}~vtqkjv|zvntqmqqq}qily|uuslggppkmg``frrpumccn~uov~|weXQVWOZkt~p_X\s|wt}}yz|y}ocklnu{omx}suwimzwrow|vzvklnutkrnbaeqpiroeafx}{zvw~|{oaYZ\POX_m~k_^iv~|}y{xxjdcdky~vnv}~yoiipxxyyxyxtkt~wqnolahrnkhjjaist{{~|x~w|~uvkag[TQIT[lkepkt|zzxxrf]`^r|{tzzvpndekw~twwyss}trnokjsnhhdffiqmpzzz{xryuonleVPQMOaxupojq~vzxzrjgXXgpvt|uupz}kjh[k|rx|t~}swtmzvonekd]onklk~}wxo|~qoyk`TNUJQiqpljq~z|t~}plhY_ihnpyrmpy~xokfbmx|{wx}vy}xtwzkikgcckldgpv~|{yu|xtrkYVRLTXamsrepu{wxwxjciabdeurxuhspzywfhphou~v|vww|z{pkodjlafcfnl~~u~yig^XQJZ\Xesvjmt{~{{}|~vkgmeZ_flou}~zpfjw~slmpjep{|~yv}x|tinpkb[cecr{{nabYNWVY_`r|{shm}{{y{z}xpuhed\cdm|txz~}~{xihvsz}y~vtvhloku|{{t~|wzrssgg`W^bnxx|wiZXXYTR_egtump}}|xw~wz~vjfgd]cqusrvyw}utsikswvrzslmnpo|~y{{yv~}llh^XSbnkxwi`V^ZOWV^jq~swu}~zuw|~|ywnl_adeonquinw}zwwhfliptx~urnenuz}|}}uof\ZY]ekuz~vke`XVWSRZl|vt~{xtx|}|vxse_^imfmqliix{opf`hmzyt|shhk{|z|~lc`\bX]omt~}vpkfSVXMRZm~}vyzuzz}|zw|~txob`akkelihklw}wpob]gryuuxohjpyy|z~{lbdc]Y]fkswymaYQROSckx}txw}{|}}x~unmcegbjfbhgrso~~zlid_ottzprpiqloyrx~~z{nhk]]ZVfn}xidTNRS_agy|xty}yzv|~~{nkkig_`e``gptmoy|}tifhinqtuopurmgkqntyzvje[XYWi|z|ve_UJZ]Zabt{{z~zsw|x{y{mhtib]Xd]_pmokizzzvfkqfknqwmu|njcfpjxzzgaYYYXo|}}ypg_UQ[\X\cqz|y{~{~|x{z}|vqnpi\[Z]cdkkhkjq}rpmogboqsxuypdgdkvv|h\^U[chyz}yrl]_XT[V^fkuu||vw|{v|nhg[]X[kfdgdlglyxkifajmv}sqogfbkxsu{yn`ZX^dbly~{tjgb[PPZ[bo~~vz{~wzztdadY[beja`hdkqu|vobdf^lwwwkmpdkoqxqwvukY`_\a_q}~z}|npdZTJUZasw}yzy{{x}{zsk^`_`f`dhabdksnuzof^acgpprqikoqrnsyuxtokb\YZ^ao}ztg_UPJRgnt~~v~xz}uvt||ywlg[]habdcicdojmop|}xgaZbkbiolnhoxoqqqzw~|svn[ZVU_f{~}kdWOOQ`kq|vt|vyurv|zvmgd`bcbb_dkkijkljszvlb`acedfikqqquroou~xohXQSYir}xaXRPXVbrr{{u|znuux{pokjh\bc[`bmrfjidlpynpgea]gb^hluslupkquyplYOT[inwxdXVVVU\hox}|}xnq{|z}~|tormf_[]]`hmpnecdju}ypprf`_]a_gsrrnilkpyz{~rf_RX`cps{~z{uj\]USWTbpz{|xptz||w}xuvjf]S[^ekhok`cepwx{zstreaYYbemrprhdkouuw{y|mfb\[]dloy|yzuqe[URRS`u{~z{x}}yzyxrj`ZR[fdgfgi`enoux|zqpc\[[knlrmlgbprospyzyymhk]Z_amp}|z~z|u`YPNSTiy||v|w|z{|~uod_XVacab`fgellmruxnkb]]donkmljfgmlhjmtzztoj^V]cmxz}}u`SRMT]fvy~|wy{}rw}yrlg\_[[b\`ccokgjfou}xikd^felmfnlkofhhcjkt|nh]U^cq}}z{sbURPZ_amv}{xx}zst{wmhdb\UZ]_chpndcfluwmfgfeedjkjproh_cgfnv|}qcaZXgqz|z}y|ojYRXW\]au{xzxxqy}plla]SR^]eljne`fhv~xsfikaa^enjrunj__ggqwx|uga_[emrxx}~|}~tld[XVVZ_j{~{uvw~}}}|}uldZURTbikkhjeajs{|tskgd[\_essqpgd^^mqrvu}~wnc_fadmoxy}z~zpkk[TUS]bqxx|tx|x{{qg_UUR[ihkjfjgiqr{}|yxsd`]VY_lvqplfecirruuvsjeed`bioy|z{wtmeYPQUaoz~~ywsrxx}}o_ZTX\^hjfhgopjpty|~}rl]VXV_hlvoijfkjisrqw{}zpnfad]alu{|~{||{ohaPNU_nszyvrjqz~}uc[YZ][afehlptnlnr~~vm`TV[^chopjkmmkhjnou~}}{qib^^_jx|~}zzth^WOWahsx|{~}snmn|ysk^`\Z]X_ghqpqrgir|}xiaXU^]`ffopnrlkhbjqwrj`Y`blx|~y}{te][VZ_eoq{|}yqoqt|}wtpg`[YWU\hoponmght|sjb^Z[^^afowsolfb`guz~}te_[blmv|{|yzng^`]W^ahqy}wsryuy{{ywxh^YRUV^nnomhkilz~ytlidY[[[civ{qme_`_kuvzz{oe`aknnuvz{|}|{~}vnhebZVY_ity{{zvw}}~|ueXTQU\bkkhiglpqx}ywtjbVV\]itxzmfc]beirqtzzvpfigkoksxz~}~vy{}y}wrpeaXQZ`lz}~~zyst~zsbWUS[^^fffiirrotx}uh^SU\cotvvlfcbeccjmsz{vsnkggkmr{|wwwx~}~z{~xpe[XTXenwz~w}ysut}zohYV[Z]Z\ffjporlmy~~vg]XR^hkrpsrggfbb\cmp}vzsjfbjpr{qtwx||{pdYZX[glrvyx{}wsuu}ypka\\YYXZcjoqnmlltti_ZW[dhjnqtqlhb]\_it|yukbbfpy|}xupv~}~}rf_Y^aailqy}y~vury{~{vmmdZYTVY\kqoohlnpvld[]YZbckqt{sid\]^du{~{rmbacl{|||wwtu|xtjc^_dabglu}ztuxzxz~|yvrmaWTSW^emomjimu{she_ZUT]dkv{zrf`^_gmv|}wjfaakqy|xyxx{x{~{~xooide`cc`iq|yvytvsrz{|yni]RTV_femnillv||~rleZVOP]gtzyxlbabilmwz}{lcddhlrzxw{}~zvyy{~|wolnlgb`aaep|}wuqoos~{ti`XSZ_cfehkkquy~}sf^RMLTfpvzuqjdhijmlu|ypfdifinpyz}~|vpw{~zsrnpqhd][cfq|xtnlps~|uh`]X\^`c`ckotuv{y}xi]QLOUcmsvrrpkjhhigo|{smhgffhmwysns~|vssurpj`[[cnry{omlry{|qiaba[^^]`bmurtrtz}}i[TOTW^loqtsvogfacgnxujeeago{{rpntywvyypnf]\^iqqvy|yporxyy|wpkgfa[YX[afosqons}}~yi\WVWW\fmrwywnd`^bjr}~tiaabjwzvqqtv~{|{xngd]`eionpw{zsxyyzuyxrqid_UVY]ghlojlnw}}wia_WVUYhpy}wrg]]^fnpy~{qc_chu||wusvtsy|zsifdceegjjow|{xvvuy|yrh`[VW^dgffijls|yrf_VQTZhw||tke\]cgkkp{yme_got||~wxwsqlr{~}~urkfkgdcaimq}~zvrww|ype\\X[bbdaahjpwzxh]SPUZjxzyqkhabedfflyyohciorvz~~|xqlinz|zvrplkha_ahpv|vstu{~{ne_\`_`a^_`doruwy{lZTQT^gsxtsmjkdca_eiu~smjejmpy}~xoikkw~yxturif_\afrzy||~xrsv}{yphc_dc^]\_bensqrt}|}qaVRT\agpstrppja^^bir{unfaelt~xpkimt~|wyytla^]^hqx{xz~|uqx{|ztrlffdcaZ\^aiknqmrx}||sj^UWWZ_cotvysoh__bhtx}qh`[dnysolntu}|{|upe[\_fnry{x}|zwvxwwtoomkgba^Z]ciljkmmt~{|yoh`YUTV[cpz|yrlf`cjqvzwk`ZZgv|sqsrtuz{xpg`Z`fipsw|}{~{turqqnrohd^]_^eiikfgmr~~|{umj_UROU_jy}zukhgflorvw{o`ZZapz|xvrqqr}~wpgc``dgjns|}wqoortspjb]\aefhhfddlu|~zumdWMMR^kt|zrmjlnlnopu}}mc\_cjw{~~vsmlqyuokgga`edjs|}wnnquxrnh^]^diffdadfmvz~}zneWLMS`jpwvqomppkkjlt~}ogcbbfpw}unikr|}uppmha\^bjvzupqwyxrid__dfhf``aekmswz{|}zm`WOQZ`imptqrsonhdhlwsngaablxqkjnx~~yvume]V\doz~~yywz|yvledcefdd_]`djjjoryz{tg_ZVY\afjpuwupkgbcirzyoe_^cpwnkosx{zti_YW`lsy{}}|||uqkfihec_``^ehggcjs||{~zrhba[XZ]ekr{xsleecfnrw{zmb\`fu|xpprqtv{zqe^ZZdlpuv{~~{xtrnkkgb_]`cegfcaaht}zsnid[UW]fovzvmhdehjmopv{jb]aku}{xrpnntzznh`^_ahkovz~~|yvwtuoif^]^`hhdc^_afv}~|wtlc[SU\fruvtliginljklt~}ld`dlqyunkkrz{qkfca]`flu}~~{wxyxrg`^]_eijd_^^bhq{~~|~~wocZVS[fnsqookloooigkq}uheeglowzojko{~xpmg`\X_jr||zz}zri^]^aghhf__`cjlr{~{}}{qf[WVZcimolnpqrpnkgjq{}tkfcchny}umkpx~|ztlc[WXap{|y{~{ukc\\ceffdc`afhjkoy}zz|~{th_YX]]bgilmqwusplmlq{}vib_^fo}yuprxz}qg]UW\iv}~{{|{vmea^beddbbefhihhhp~z{~ysjb^\]]]`cioswwsolmruz|qc[[amy{xxwwyz|}xj^XW]eoy|~~||}tniedaab_achmjhgceky~xokfca]][Yahqvuurlmouzy|~~teZ[`mw~|~{vvux~yk`[[_cirw}}{tpnkga]]]`fkolgcadmx|vollhb]YXY`krvtpnmntwzzxzqf]]eltz}}vqsw~unda_^acjt}{zxttnf_XY]bjlljb`agqx}wtqopib[UX]eorspklnswvxvsy|picdgkruz~yrot{{vqke_\\_hv}{|~{umbZVYbgjjgeaafkpv~}zwwwsof]XW]ejopmkinsstrqrs|{rojfgiov|wsqqz}~|zwlb[VZ`m|}~{rf]ZX`ffgdcdcfiimq||||~yqja\[]eijlkklmrronlosx~yskddhpz{utux{}|{z}xk^WV[epz}xyznf_]^`cbabcgiffehp{~}wleb^acfhgilmqpoojjlpx{|siadjt|zwx{yxxwyzwi\XX_hmty|xuxyoidb`]]^`cgkkebafp||sjedcdccdehmrsqkiijntz|{~~qhcclv~}{|||yttvy~uka[]`eilt{{xvx|tnkd_YW\_eklke_`do}zrmgghda^_fipuspheikqwxzxzrjfelty|{|{xssw{wohb```benyzy{~|vpg^XTW_fkkhea`enxysnligc^[]clrusnifgntwxwx{umhjlosuxz}}wuuw~~{ztole_]\ahs~~vkaWUU[fijieedfmryzvrpnfa\WY^hrssojiinuvwww|yrmlmkmorx}~yvx{~yx{ywsmc\Y\do{~{{|}qd[UV[`fhfffillorw~~ywvpi`YWW]fmrrnlkmpquutw{}vsplkhiov~yxy|xx{|{||}xph\X[bnw~|}ww|vh^ZY\]`cbdhlpnmnpy|yrj`VUX]dinpmnoqrqqqrw}~|xrlhffmw|yz}}zxy~~zy}zqg^Y\dlsx}}{zvv}~ulb_^\\[\aekopojinw{sh^XV[_bfhlopttqokmrxzsleeioy~zz|~zzz|{z{zpfa^`eiorv{{yxz{upid_ZXVYahnonkghoz{pf_[[]^_aelsvvsnjgks{zphegouz}|zx{}|z{}~~ungedcdfinu|~|}}|xvoe^VSUZekmmighjt}wngba][\[`hqyyuphghnw|uliiouvxxxz{}zy|}}{y~ysokjfa`agoyymaXSTY`fihfehlqw}~uplhb[WY]epwzvojfhlqvwx|ysnoqsvtuwy~~zwxz|vux|{yvuoic\]ait{~{wj]WUX^`ccceglqrux}yvqg_WTY`ktwwrljilmmpqu|~xvttsrrruz~{xvvz}wstz~z{}|wof_[]emuy{~z{~{{ti_ZZ[]\\`bfloqoou}zqf[VU[elrtssonnmkhiot}zzxtqnosw~}wuvx~zutu}}||~wnd`^`gmqstz~wy}|}~tme`^[YWW]cinnnmmt}|pe[WW\dimoruttrmhefmv~|ysnlnt{zvtw|~{wvy|}~wnfbbegklmqw}zy|~~xqmg`[VTVZckmmkjnr}sg_ZZ[]bejpuzysngdfkv~xrkjms}~xvuw}~|||{}|||woiffihghiov~}}~}{xtoe\URTYaikkiims|xmd`][YY]clu|}xpiefls{xojhjqx~|ywxz|~~||}}zx|{tpljkjigdfks}~|y{||{tlbWSTY`cghgilt|{tlfb[WST\fr{}|ulijnsw|zohgiouy|zxz{~}{{zz~zuv~~ysooonlhfceks|{wuw}~xndZUVZ^abcehnu{}xtne]UOOVcox|zvqmoqstvzyoigknruvxz|~zvwzytu|}vrpqsplgccfluz~yttw}yod^ZZ\]^]^diqvy|}}{th]SMOUbmtxwvussrqppuyqlkmnnprw}|wst{yux~{ustutpjdadjpuxyz|xtv{~vngca^\ZXY\clruwx{~vi[SORY`joruwzyurnkntztrnlkjlrz~xssv~}zy|zxxyvrmecchnprssv{}yy|~zsojhe^ZVTX^gnpqru|~tf[UTWZ^ekqw|~zsmiiow~zunighnwyusvz~~~~~}~}~}ztmhdeilonlnqx|yxuspjcZTTV]cgkklpwyof^\YXY[clu~|ulhgksy|sjegmvzwvxzy{{{~}zz}|vnihhklkkijnt|~~|yy{zwpg^WTV[`bcdglt~~wpjd_YUUZer{~xqkikptvzyohejsz~{{{zxutw{zux~yrmjlmkjgfhkrwz{yz|~{zz|~wnc]YX[]^]\agoy~yuqg^VQU\hu{}ztqnmooppt~wmiinuy|}~~ytpqw}}wtxwrpnonifdfjotwvuuw|~zz}~uld_^]]\YXZ_hqx}{ui]TQT]hqxxwvttrpmklr|xplmnqtv{~wpopw{xvz}xutsokfbdgmstusrtw~~|||tlgddb^ZVVY^hptx{wl_VSU\djptvxyzwplhjq{|uqolkmpv~xqoqw~|z{}{yxuoidbchnstrpqsy~~~xsokjhe`YUUX_flprv}~znc[VWZ^bgmty~~{umjkpz{wqkgeiq{zursx{}}}}~~|wqibachorsrpquz~~{vqponlgb\VVY_dgjmqy|rha\ZYXZ]dnx~yrmmrx}uld`bjvywxyyyz{}~zric`cimpqqqrw}}~~ytqprrnib\YX\`bddfmu{tmgd_YVTW^iv~ytqquy|ync^`gr|}|zxvux}{|{ridcdhklmmquz~~|z}}wrrsttoib]\]_```_bju~ytqnicZSPS\hs{~|xvvwxyz{zmc_ahox|{vrrv~|{}{qkgggghghlry}~}zxy}{utuwvrmfa_`cb`^[\ajvyxwvsldZQPT]hpwyxxy{|ywvv|zmfceilrw{yrprx}z}zrnlkgdccgnv|~{xvw{{xyzyuoidbceda\YY]dmu|{xz|ztkaXRSYahmqtwz}~|wrqu~zpkighimu}|tpqv|}|}{vtpjd_^cjrxzyutux}|xqjgfgheb]XX[ahlrw}|{|zqg^YXZ^bfinu{{wqory}vqkfdfnzwssvyzz{{||vne^\`hotutsrtx{{zy|zrmjjkjga\YX[`dfhmv~}ulea`^]^^biqz{uqpqw|zqhbcit}xvwwvutx{~tja^^dkoqpqsuxzyvstz~vronomhc][\]`aaacjv~xrmigd`[Z\cku|~{vrqsuxz|{nfbemw~{xtqprx~}qhbacfikknqvzzyuqps{{wtsroke`^^`b`_\\ajwyuspokf`YX\cnuyzwutuxyxwx}{ngdgou{~wqmnry}|}rkfeeddegmsy|zuqnpt|}zyxtnhb_`bdd`\Y[`jv}xuuusnf^YW\dmrtuuuwz|{wtu{}rjhjmpsx}xqnotz~}z{~wpmjeb^`eltz|{uqprw{}}{umea`befda[Y[`iqy{xvvxunf]ZY]dimopsvz~}{wsuzwqmkjjlpx{spquz{{zy{|xtng`\[ajsz|{xttvy||~}vnfaadfgea][\aglqw~}yxyxvpg_[[^adgikou|}yww{|wsnifdhpzyuuxyyxvxz~{tkb[Z]fpvzzxxx{}|{z|xogcbegfd`^^`cgilov|{{zuoga^^`aabcgmt|}zy{~yric`dlw}|{{ywutv{xmc\Z^elruvxz~}ywxxpifffeda__adfggfiq|~ztlfbabaa_]_eluz}}zyz~}tja_clv}}ytrsv|znd^]`ehmpsx}{vtxxqmkigc`]^aehhecbfp|yqjfeeeb_\[_fouxyxwy}~sibafmty|}vqqsy}xnfbbbcdfkqy}wttyyurpke_\\_ehigb_bhs~~unjijie`[Z]ckqttstx|{qjggknrux}yrqsw{{{{{~vplhea_^bjt}~xttw|~{wqha[[_dhheb__emu}zsponlhb\Z]cimooopu{}~xronlllnryzustwyxvux}}xvpib[Z]dox|}zwuuxy{}vlc]\_dffc`_`djoty~yvusoic^]_ejklkkosy~~}zz}{xuqlijnv~|xwwxwurqsz~ype]XZ`iqvwvuvxxxvuw~sib`acdc`__bfhjknu~}|xskda_bfijhhilrwz{yxx{}wpigjqz~|{|zwsonpu~ynb\Z]dimpqtvy{yuqot|qkfedb`^]_bgihggktxphcbcfhggefjpuwwvuvzvnihlt{|upmnqw}xmd_^acfgjotz}}yrnnt|uolhd_[[]afiifcdiswngddggfdcehmsuusqsv|unjjouy{{|~|upnptxz|~ypiecbaabfmu|~ysopu~{vrld]XY]chjhebcir}xoigggfca`ciostrporx~~uomnpsuuvy}|vrqsvwwvx~ztolhd`]]bjt|~zvssw|}xof]XX\cghgdcejryzrmjigc`]]ahorrqnnqw~~vqoprqppqu{~ywvxywurrx{xusoha[Z_fpy}}{yyy{}~~ti_YX[`dfeddglquy}wsplga\YZ_gmqqomnrw||wsrsrpmlnrz~{z|}{xsppt~}{z{xskb[Z^fnuyzz{}~}|wkb\[]`ababeiorsuw}}yuph`YWZ_glnnmmoty|}~~zvvvurokilrz}}~}wrnou|}z{}~{ulc]\`flpsux}~zy}wmea`__]\^agmqrqqt{yqg^XW[afijjlnswyyxy|~zxyyvqlijnu{~}|}|upoqw||{~{tjd``cfijlqx}wx}~vpkgd_\XX]cjoppnnt}{pe]Z[^bdefinswxwtsu|}}}ytnjjntx{{yy{~xsrsuxz|~~xpjfeeddcejr{}xvy}xuqkd\WUX_glmlklowxme`___``aflswxuqoqv|vpllpuwxwvwz~~xvuuwvuuw~ysomliea^_dlu|~}zwwy~~{si_WUW]dhihhjov}tmhfc`]\^dlsxwtomot{~wrpqtwxwttvz{xwxyxuqoqx~zwutrnh`\\`hpuxwvvwz}~{pd\XX\`bccehnuy|}vrnhb\X[aiqvvsonosx{}~ztstwxxvssvz~}zxy{}{wqllr{{yyyxtld][^djoqrsux{}|{|xmc^\]^^]^`elrvwxz}wpg^XX]emrtsqpqsvwvvz~xuvxyxussuy~{xxy|~{tnlmt}}zz|}ysjc_^bfhjjlqv{}}zwxwohcb_\ZX[`gosttuy{qf]YY^fknopqsuwvtrrx~zxyzxtrqtx}~{wvx|~ysnmpu{}|}~xqidccefeefjpx}~{xvxysnjf`ZVUY`inqqqsxrg^Z[_bfhjnrwzyvqoqv}|{xuqopu{~~|xvvy~}xtrqtuwy||wpkhghgecacipx}}{wwy{xuqjaZTTX_glnnosyvkc^]^^_adkry|{vqnpv~|vqmlntz~~{wvwz~}ywwwxwutu{{upmklljfb`bhow{|{yy|}|{{wpf\VUX^chjkmry{rjea^[YY^eox||xsprv}}voiilrx{|yvvx|~~{yy{}|yuqqvysomnoolgb`bhouxyyy{|{|~~zsi_YXZ^acdfkrz~wqlf`YUTYbmvzzwtsuy}~umhhlrvxxwwx{~}zxy{{toot}wqooqrpkfbadjorttuy}~zz}{sib]\]^^^_cjr{{xsjaWRRWaksvwvvvy{||}~tlijnrtttux|}zvvy~ysopv~}vqqrsrnidcehlnooosz}{}yrjeca_]ZY[bktz~~vl`VRSZbinqsuy|}|zxy~|snmnoppprw|~zutv{|vrrty}{vtuusojfdfillkijmt||upmkid^YVW\entxz|ui^WVX]afimsy}|xttx|vsrpnllou|zutuy~{wuuvxyz||{zyuojgfhklkgeeipw|~}|}|xusroiaZUUYahmpsv||pf_\\\]^bhpx~}wrqt{}ysnjjnu}zvuwz{|zxwwxzywuuz|wpjhhkmliebcgmruvvvy|yyyyune\WVY_cfhkpxwojeb^[Y[blv}|wsqsx~xpjhls{|yxyzzxutux{|{vrqu}zrljkmnmidbbejnpooqu|~{{}~{tkb\Z[]_``cjr}~ytpjc\WW\epx|{xutuxz|}umjkpw|~}|||}}{wsqsw{~|xroqwwpmmoomieccfillkikpw~~}yqic`__^\[\ajt~}zumbZUV]fouxwwwyzzywx|tnlnruxyz|ysppsy}~{uqpsz~wrpqpnjfddgjlkhfgjqy~}wpkgfea]YWY`jt{xncZVX^ekortwz}~{wtuzwqopqqrsv|yspqtz}|yussv{~yvtsplgddfjmmjfefkrx|~zupmlkic]WVY`hpwz~{pe]YZ]adglqw}}wtty{vsqolkmrzztrrvy{zwuuwz{||}~{yvpjecdglnnkgeglrvyz{~xspppplf_YWY^ekptx}tjc^]]]]_ckt|zvvz}ytnheflu~}xvvxyywvvwz}}{yx{~yrjdachlonkhhjnsuvvx}}vrpqsrnha[Y[_dgims{}umhdb^[XY]fq{{yy}~wnfbcis|}{z{{yvssvz~~{wvy{ridbdilmliiknqssrru|}urqstsnha^^_bccdgoy|uqmkg`ZUUZdox}~}{|~xneaciqx|}}~|wspqv|}xvv{{qieegijiggjnqsrpnot||vtuvuqkebbcdca__enz~yvusoh`XSU[emtxyz|xmfdfkptwy|{uposx}}yvvy~zqliiigfdehmrtrolkou~}zyywrmheegge`\[^fp{|zzzvpg]WUY_florv{|~vnjjklmosxwqoqvz|zxvwzytqolgc`aekqsrnjilqx}~ytmihijjgb\Z[bjry}~|ulc][\_begkpx}z{~xsqnkiimu}ysqruwvuttw{|yuohb^_djopnkhhjosuwz}uokkmnlhb\Z\aflpt{xphcbaaa`aelu}{yz~~ztmhfjq{|wuvvurpprw|~||}ulc__cilmlihhknoooqwyronppnic_]^adfgjpz{tnkihea^\_fox~~{z{~|rjfgmv~~}|{yupmlouz~~|zz~}ribacfijhghjmnnljjnwxtrsrpkea`acccbbfo{}wsponje_[[`hqx{{zz|{qigipv{~~~yrljlqw{|zxy||rjedfffedfimppmhfgnwzxwurmgdcdffd`^_eo{{vuttqkd]Z\bipsuvx|~{rljlpsuwz~yqlkmrwyxwvy~}unkigda`bfkqrqlgfhnw}zvpjedegihd_]^dnxzwvwvrkc^\^chkmorw}~~|upnnoooqv|{sonpsuuutuzytqmic^\_elrsqmihkpuz~xpiddfikie`]_dksy}yyywrkd_^`ceggimt|yusqnkijow~xtrsttsqqty}{xsld][]ckpsromlnruwy}zqiedgjkiea`afkosw}~|{wrkeaacddcbdiqz|zxtniefkt}{yxxwtpnosz}wne][]cinoonoqsuuttw{qjffhjifcabeikmnqw}woiecdeec`_agpy|vngcdjs{~~~|xrnlntzyoe_]_cgjkknquxwtqpu~{rljjjhfcabfikkjimu}umhfghgd`]]biqw{|}~vmfdgmsx{|}~wpllpvz}}}}yogbabdddeintxyvqnou{uqomiea`aejlkifglv{rljjkjgb^]`flqtuw{|sliilortux}zrmmosvxxxz~uojgfca^_cjqwxuqmmpx~zwsmf`^`eilkhddhpzwqonnlhc_^aejmnnpu|xroooponosz|uqoqsssrsv}{vspkf_[Z^fnsusolloty~yqha_aeijhecdgnuz}wutrnicaadhjkjilqy|xwvurnllqx|wtstsqnlns{}{xri`ZY\cjopnllmprtuxvlebcfhhfdcdhmqsvz}zvpjecdgjkigfhnv|}}}zvpkjnu|}zyxxuqkhinv~zpf^Z[`eijjjknqrqoot}tlgfggfcabeimnooqx|tlfdfikkifdfkrw{||}{tnklqx|~~}||}}ztmhgjpw}yof`^_bcddfinrtroklr}~uoljhea_`chlnmkkow{rjffikkifdeinsvvvx|yrnmptxyyyz}{slhilqvy{|xpidcca`_`djquurmjlr|zvrnhb^\_djmmkiinw|rkhhjkifddfkprrrrv|~xroprtuutux~{tnkloqssux~xrnkhea][]bjquuqnlnt{|xqia\[_ejmljijowuolkjifbacglpqonos{|vsqrttsqpqv}~wsqqrrpoos{~yusqnic]Y[`hpturpprv{~vlc][^chjjiikpv|{tpnkgb_^agloomlmryyurstutqnmot{~zwwwvsolkpx{xwwvsme]YZ`gmqrqqsvz|}~yne_]`cefffhmsx{}~{wrle_\]aglnmkjmry|vssuwvtolknt{~~|z{||ytnjjnv|xwyzzvne^[]afjlmorvz}|{z~zpgcbbcbbbdipuyyyz~}ulc][^chkkjijotz}yutvxxvqmkmrwz|{zz|zrlikpw}~ywy|}{ume`_aceffhmsy}}zww}yqlhgda^]_dlrvwvvxvja]]`eghggimrwyyy{~xvwyywsomnqvxxwvw{}wpllosvy{~|yz}}xqkfeddca`bgov{{yvtxytqnic]Z[`hostsru{rhb`bcdddehnsvvusuz~{{|{xspnptwxvtsty~~xspoprrrsw~}}~ysolkjgc^[\aiqvwussv|}zvof^YY^eknoopsyzpjgfecaachntvtqoqv~}xsqrtxyxurqsx}|wtrssrommqy~ytrqqokd]YZ_flpqpoquz}uja[[^cgiijmryytplgb^^agnsusomot{ytrtw{{yurqtx|~}zwuvwvsojhls~yvuvwuoh`ZZ]bgijjloty|}~|rha__accceiov|~ztld^\^elqsronosx|~|vsuy{|zvsrux{|zwvvxzzwqkghnv{wvxzyume_]^acddeglrwzzyz{qjfdca_^_cjry|}|}vlb]\`gloonnpsvyyyz~yuux{{zvtsuy{{yustx{}{vojhjpv{yxy{{xrkebbbca`_afntxywvxztolie`[Z\cksxyyz}wlc^^bfijklnrvxxvuv|zwxyzxvssuy||zvsruz}~{uplknqtvx|{z{|{wqkhggfd`]\_fntwwuux{xurmf_YX[bjqtvvy~zofaabcddfiouyzwtrt{~{zywtqpqvz}|ytrrvz~~{vrpqrrrqrv}~}}|ytolkkkjf`\[_emsuuuvz|{zxrjaZXZ`glpqsw~ulgeca_^`eltyzxtrtz}zvplloty||xtrsvz||zvuuvwuronqx|wrmllnomhb]\`elprrsv|}|}~|vmd]Z\`ehjlpv~zsnje_ZX[ajsxywtsv{{tnijnty{yvtsuy{{ywuvx{zwrmknv}vpllnqqnhb__bgjlmnqw~|}}wnf`_`bcddhnv~zuog^XUY`iquuttuy~|slijotwxvtuwy{{xusux|~|wpllpw~|tnmnqrpkfbacfhhhhkqx|umhedcb`^`enxzqf\VVZahnpqruy}{qlkmqstsstx{}|xtqrv{~}ytomosx|~zspprrplhedfhhfdbdjrz~xrnlkhd`\[_gqy{pd\YZ^cfikoty~}{z}ysppqqqppsx}}ytpqty||yuqpqtvwwy}yvuusplhfgijifa_`elty{|}yussqnha[Y[bkrwz}wld_^_`abejry~~|xvx~{xvtqnmnsz~ytqquxzyvsrrtvusrsy}|zvpkggillid_\]binrstw}zxxyxslc\Y[`gkorv|}tmhfc`]]`gpx}}zvtv|~ysmkmszzvttvxwurqruwwuqnot}yqkhiknnje`]]aeijkmqx}{|}}xqha]]`cfginv|wsoic]Z\bkty{yvuwzwoklqw}~{xwxyxvrooquxyvqmlpx~vnjjmookfb__bdeddejr{~~|vngcbbcbabfnx|yri`ZY]dmsvvuvx{~unlnsx{{zyz|}{xsnlosxzxtomnsz}uomnoolhdbcdfec``cjs|zsmjhgfb_\^dny|ti_ZZ^ejnprtx|}{{vpoqsuvvwy}}wqmmpuxyvrooqvz|~~vrqppmieddgihea^^cjsz~}wronnlhc][]clv}vkb]]_cfhjnsz|yy~xtrrrqppsx~~wqnnquwvtqqruxyyxz~zvusokfccfjljfa^_cjqvy|zuqpqrpkd^[\bjqw{yogb````achpx}zz~}yvtqmjjnu|ztqqtvvtrqruxzyvtuy|zvqjdbcgkmlhdaaejortw|yspqstrmf`]^bhmqtyzrkhec`][]clv}~|||wqjffjrz~zwvvwvtqpptx{{yursxyqicachlmkgdceilnnoryxsqrturlfb`behjknt}ztpnkf`ZWY`jsz}}|}yqidejqx|}{zyz{yvqnmpuz|{wsrtyzqhcceikjhfegjllkjkpxxttuutojfdegggffjr}~zwvsng^XVZajqvxy|yoheglquwxy{~~ztnlmrw{{xtstw|ypifghihedegkmmjgfipy{yxwtpkhhijjgcacis~}||zvne\XY^dimpsx~wokjlopqruz~vpllpuxxvtsuy|~~}}wqmlkiebacgknmjecdjrz~{vplijlmlic__dlv~{tjb^]_bdfhlsz}wrqponlmqxxrnnpstsrqrvz}}{yz}}xusojd`_afkmlhcabgmsw{yqlkmopnic__cjqv{woheddcbabgnx~~~|yvrmjjowytqqrrpnmnqv{}|ywx|~{ume_^afjljfbacfjlnqv}tonorrojdaadhloqv}zsnlkifa^^bis{~}~}wojils{|xwvusokijouz|{xvw{|sjb`aehiheccdghhghluztqrsspkfddfhiiils~}wtrqokd^\^dmty{{{}~umjkpv{}}|{{|{wqkggkqvyywuvy|ridcdffecbcfijhecdju|wvutqlhfgijjgeejs~{xwwvqjc]\`fmqtvx{}tnlnruwxxz}~xpjghmruvutux}|slhggeca`bfjlkgcacjt|zwsmiggjlmjfccir|{yzzwqjc__bfjlmpu{}vqpprrqrtx~yqkiknqsrqrv{}}}vqnlid`]^bglnlgcbeks{~yrkgfhlnnjfcchpy}||{wqjdabdffggkqz~xutsqollnu||upnopqponqu{}{{~zwtqle_[\aglnmifehlrvz|skfehlonkgdeiouz~~|wqjfdeffdbbfmw~zyxvrmigjqy}xusssqnkkou||z{~~||zvof^[\`fkmkihilorsux~tkggilmliffimqsuw||uojghhhfb__clu}}|}|yslgfipw}~|zyzyvqlijnu{}zz}~~~ypf_\^bfhihhjmqrrppt}tmjjkkjhffhlpqqqrx{smjjkkie`]_dlty}~~yrkgglqvyzzz|~~{unihkpvz{{z{~~|}xoga`acdddehmqsrommr}~vqonlifddhlpqpnmqxxqmmnolhb^^bhmrtwz~wpkjlorstuw|zrkhinruvvwz~}{|}unhfedb`^`djpsrnkjmuzwtojebbflpqoljms|~vqqqqnida`cgjlmosz{uqppqqpoptz|uokkmpqpqsw}}{|ytpnkgb]Z[`gmpplihkqx{tleabfkooljikqx|xvvtojecdgijihimu}ywwwurnlmry|vqooonmkknu}~}|ywvrld]YY^ejlkhggjoswzzpgccgkmljhhkpuy|}zvpkgfhkljgeeiqz~||}}zuoklpw}{wutsrojgfipy}}}}yri`[Z]bfggffhknppqu|wnhghjjigfhlptuvw{zsliiknnkgdcfmtz~~yrmloty||zxxxywrlfceksz~~~~}~zqg`]^`bbbbcgkoonllr|wplkkigddfkpstsrtzxpkiknomieceiotwxz~~}wqoosvxxwvx{}}yqjedgmswyz|~|}xphdbba`^]_cinpolikq|zurokgcabgmrsrposzwollnonkgdehloqrsv|{vrqsuutsrtx}zrkggjmprsuz|{}~xqliheb^ZZ]dkoqnkilr{|xsle`_bhnrrpoos{zrononkhedgjmonmnsz~yuttvvuroorw}{uollmnnmnqw~||~|wspomid]YX\cjopnllntz~wof`^`floponpt{wsqolhdbcgknnljkowzvttvxwtpllpv||wtrrrpmjils|~}}yvtttrnf_YX\bhlnmmnrw{~{qha_afjlllmqw|~yvqkea`chlnmjhiov|wssuxywsnklpv{}|ywwwxvrmhgkrz~yuttvwuog`[[^cgiijlpuz||}}rjdbdfgggimsy~zrjc_`dimmjhgjpw}ytrtxzzvqmlnswxxwvwz|{xqkgglsz~{vstwyyunf`^_acccdglsx{{yy}|sliggfdbcgnv{~}|}|qha`bgjkiggimswy{}~wttwzzwsonpsuvussuy}|voihjoswyz}xuuwz{xrlfdccba^^agouyywuw~ztqnlgb_^biqxzzyz}zngcdfhhgefinrtutvz|xxy{zwtqqsvwvsppsx}}xrmklnpqrtx~|xwy{|ytokiigd`[Z\bjquusrtz|zwrkd^\_fnsvvvw|vnjiihfddfjossqopu}~}~}zwtsuxzyvqnnrw|}{vronoonmlns{||}~|xtpooolg`ZWY_flnnnorxxof_]_ejnpprv{~wspmidbbflqsrolmqy{vtux{}|wroorwzzxurqrrqnjghnw}xtrrttqjb[XY]bfghhkpv{vld`adghijmry}xrkd``dkprqnllou{|wtuy}}ytqqsvxxusrsuvtpjeeiqzytstwxuog`\[]`aaacgmty{{|~tlgeeeecdgmu}|rib`bgmppnlloswz|}zutw{~~{vtsuwxvsqpsvyxtnheflrx|~|vttwyxtmfb````^\]agouxxxy|upmkhea_afow}}rhbadhkllklnrvwwwx}yvvy||zwuuwyzxtpnpty{ytnihjnqtvx||wuvxyvqlhfeec_[YZ`hotvvvy}xuspjd_\_enuz|}}tjedeghgghlquwwtsu{|yyzzxuttvz|{wrnnquy{xtollnppppsx}yxxywtokjjjie`ZXZ_gnrttuy}{zxtme_\]ckrvxy|ypjgfecabdjqvxwtrty|{zwtpoquz||wronquyywtqpqsrqnlns{|{{yvqljkmnmib\Y[`fkopruz}|}|xqha]^cimpsv{~wqmie`]]ahpuwusrtz{vpllouz|{wrppsvxwurrtvwuqljkqy~ztnjjlopnic^\^bfijknt{}~yqicabegikmrz}xsme]YZ_gostsrsv|}unjkouyzxurrtvwvsqqswzzvpkilryzrljknqqmhb``bdeeeglt}~xpjfeffedeiq{~wmc\Y[ahmpppruz~|smkmruwvustwyyvronqvz{ytnkkotx{|~xqllnppnjfcceedb``emv~{upmlkieb`bis}wlb\\_dgijlotz}~}|~zroorttsrsvy|{wrnlotxzxtpmmpsuuvx|~vqpqqpmifeghhea]\_fow|~|wsrrqmha^^dlu}tjcaaccdegmsy}}zxy~zvuutrpprw|~}ysnmosvwurpoprssqqsy|xwvtqlhfgjkjf`[Y\biosux}}ywwxvqib]^bipux{zqligdb``dksy|zwuv{}zvrnorx~~ytpoqstsqonpsutqnmou~~|xrlhgilnlg`[Y\`ehjlpw{z|}{umea`bgjmpsy{vrnhb^\`govyxvtuy~zsnmqw}{vsrstsqnlmptvurmklry}unihjmomhb^\]`bbbdhoy~~yrkfdefgghkq{|wog_[]bjqtuttuy}xqnoty}}{xwwxwuqljjnswwsokkntz|smjkmonjea``bb`^]`fpz|vpljiigebchq{yoe^\_djnppruy}~}wqpruxyxwxy||zuojikpuwuqnlnrvyz{}|tomnonjgdcdeec_[[^fpyytpoonlhc_`foz|qga_adghjlpu{~|{~ytstuutstw{{unjjmqtuspnoruvvuvy~}vsqpokgdcehihd_[Z_fnuz~}wrqqsroic_`env}~tkeccccbcfmu|~{{~|xvutqnmot{}wqmlorssqooruwwurqtzzxvsojebbeilkga]]`flqux}|uqprutqkeaaekrwz~wpkhfc`]]ahrz~||}{xtnjikry~}xsqqrsrpnnptxzxtqpry~}{wqic`bfjlkgb``cgkmory{tqqtvuqkfcdhloqtxxtqnjd^ZY^fpx|}||~{tmgfjqw||zwuuvvtplklqvzzwsppsy~yqhbacgjkieccegiiijnw{ustvvsnjggiklllnu~zxvsld]XY_gotwxz}|skghlrvxxwwxzzxrmiimsxzxtqqsw{}}}}yphddfhigecdgijifdfmw}xwwvsokijlmljhhlu~~}ztlb\Z\bgloqtzzrlkmprsstvz}~|vojhkpuwvsrrtxz{zxy}vojiihgdbbdhkkidaafoy~|xsnkjlopnjfdgnxzrib^_adfginu}xsqqqqooptz~xqkiknqrqpprvy{zwuv{{urpnkfb__chkkhc__cjqx}|unllorrojecels{~vnheeedbacir{~{yxuqnlnszyrnlmoonllnrw{{xusu{|zxtnga^_chkjfa^^bfkorwwpmnqtsojfdfkptw{ysomlie`^_emv}~~{tnklqx~~zvrqqpnjhgkpvzzxtsty{tkc__bgihea_`beghilt~uqqstspkhghkmooqv|xutsoib]]ahpwz{{|yrllouz}|zxwwwupjfdgmsxywtstx}|ricacegfdaabdffdcdis~wuuuspliikmnmlknu{zzyvpha]^ciostvy~xqnorvxxwwxz|zvnhddhnsuusstx|~}|}{rjfeffdb``bfhhfb`bhs|zxuqliilopolihlt~||}|wpga_aehklnrxysqrstsssuy}}woiffjnqrqqsw{~~|yx{{toljhea^]_dikjfa_bir{~ztnihjnqrokhhlt|~|wohdcdefffinwzvuutromnry~yrljjlnonmosx}~zwvy~|wtqokf`\[_djlkgcbdjpw|}umhfimqrpliimsy|vpjgfggecacis|{yyxuqlijov|{uqoooomjjlrx~}zvux}~{yxwtog`[[^dikjheehlqtwzvmhgimppnkjkotx{}{tokjjjhd`^`gqz}||}{wpjginu{}|yvuuusokggkry}~|xvwz}}zzz|{xqh`\\_dghgffilpqqru|wniikmnljikosvwwx{yrnmnnmhc^]`hpw|~~}~}voihkpuxxxwxyzytnheglsy{zxwx{~~{xxz}~xpga^_bddccehmpqpmnr{xqnmmljhginruvtstz~vqopqplfa^_ciosvy~}{tnklorssstwz}}yrkffiotvvvwy}~zwvy}}vnhdccca_^afkpqokjls}zvsqmhedgmruurppu}{usstsoidaadhjlmpv~xsqqrrqpoptz~|unihjmoqqqtx~zwvy}ysnkjhd`\Z]binomiginw|wpidcflqsspnosz{xxxuqkgffhjihhkqz{xwxwurnmotz~{vpmlmmmlkmqw~~zxx{~zvusqnha\Z]bgkkiggimsx|~vnhginqrqonpty}}{wrnkkmnmkhgiow~}}}~}ytpnoty|}zwsrqqolihinu{}{z{}}zyyyxsme`]^bfhhgggjnqtux}~uolmoqqpnoquy{}}ztpooqrqmjhimsy}~}xspqtwzzywvvvusokhhkqw{|{zz|~~|zz{||yskebaceffeegknpqqru|~wsrrrponoquxzzzz~~xsqqstsqmjjlquxz|~|wtstvxxwvvwyzxtokijnruwxyz|~|zy{}~|xrlhffffeddfjnqqqpqu|{ywuromnptxzzyxz~}wtstuuspnmnpsuvwy}~{wvvwwwvuuvy{{yupmlmprttuwz}}zyy{}~{wsolkjifdcdhlprrqprv|}{wsonoruxyyxxz~~yvuvvtrpooqstuuux|}zyxyyxvtstwz||zvspppqrrrsuy}~|zyz{}|zwtrponkgedeimprrqqsw|~zuqopruxyxxy{|yxwvtrppqstutstvz~{zyyzzxvtstvy{|zxvutttsqpqtx|~}{zyz{{zxvutssqnjgefimpqrrsux||wsqqsuwwwxy||zyvsqpqrtvutttvz|zyyz{zxvtsuwy{{zxxwwwusqpqswz|}|{{{||{ywvuuvurokihikmopqrtwz|~~yvttuvvvvxz}~zwtqqrtvvvttuw{~~{zzz{{zxvtuvxyyyxxyzzyvtqqrtwyz{z{||}|zxvvvwwvspmkkkmnnoprux{|}~{ywwvvuuvx{~{wsrrtuvvuuuwy|~}{z{||{zxwvwxyyxxxyz{{yvtrrsuwxxyz{}~}{ywvwxxwuspnmmnmmmnpsvyz{{}}|zywuuuwz}~zwutuvvvuuvwy{|}~}||}}|zyxxyyyxwwxy{||zxvtttuuvvwy{}~~}{yxxyyxwtrqpponmllnqtwxyy{}~|ywuuvy{}}~~}zxwwwvvuvwxz{{{|}~~~}|{zzzz{zyxwwyz{{zxwvuuuuttuwz|~~}{zzzzzywutssrqomllnpstvvwy{~~{xwvwyz{||}}{zyxwvvvxyz{{z{|~~}|{{|||{yxxxyz{{zyxwwwvutstvy{}}}||||{{yxvvuutsqommnpqsstuwz|~{yxxyzzz{|~~}{zxwvwxy{{{zz{}}|||}}}|{yyyzz{zzyyyyxwvtstuwz{||||}}}|zxwwwwvusqonoppqrrtvxz|~~|{zzzyyz{}~|zxwwxyz{{z{{}~}||}}}}{zzzz{{zzyyzzzywvttuvxyzz{|}~~}{zyxxxxvusqpppqqqqrtvy{|}~~}|{zyyz|~|zxxxyzzzz{{|}~}}}}}}|{{{{{{zzyyzz{zyxvuuvvwxxyz|}~}|{zyyyyxvutsrrrqqqqrtwxz{|}}|zyyz|}}{yyyyzzzz{|}~~}}}}|{{{{||{zzyzz{{{zxwwvwwwwwxz|}~}|{zzzyyxwuutttsrrqrsuwxzz|}~|{zz{|}~~|{zzyyyyz{|}~~~}}|{{{{{||{{zzz{{{{zyyxxxwwwwxy{|}}|{{zzzyxwvuuuutssrstuwxyz{}~|{{{|}}~}|{{zyyyz{|}~~}|{zz{{||{{zz{{{{{zzzyyyxwvwwyz{||||{{{zyxwwvvvvutssstuvwxy{|~~}|||||}}~~}|{zyyyz{|}~~~~}|{z{{{|{{{{{{{{{{zzzzzyxwwwwxzz{{{||||{zxxwwwwvuutttuvvwxyz|~~}}||||}~~}|{zyyz{|}~~~}|{{{{{{{{{{|||{{{{{{{zzxxwwxyyzz{{||||{zyxxxxwvvuuuuvvvwxy{|~~~}}||}~~|{zzz{||}}~~}|||||{{{{{||||{{{{{{{zyyxxxxyyyz{||}||{zyyyxxwvvvvvvvvvwxy{|}~~}|||}~|{{{{|||}}~~}}}|||{{|||}||{{{{||{{zyyyyyxyyyz{|}}||{zzzyxxwwvvvvvvvvwxy{|}~~}}}}~}}|||||||}~~~~}||||||}}}|||||||{{zzyyyyxxxyz{|}}||||{{zyxxwwwwwvvvvwxxyz{|~~}}}~~~}}|||||}~~~}||||}}}}|||||||{{{zzzzyyxxyz{{||||||||{zyxxxxwwwvvvwwxxyz{|~~~~~~~~~}}|||}}~~~}|||}}}}}||}}}||{{{{{zzyyxyyz{{|||}}}||{zyyyxxxwwwwwwxxxyz{|~~~~~~~}}|||}~~~}}}}}}}}}}}}}}|||{{{{zzyyyyyzz{{||}}}}|{{zzyyxxxwwwxxxxxyz{|}~~~~~~}}}}}~~~~}}}}}|||}}}}}}||||||{{zzyyyzzzz{{|}}}}|{{{zzyyxxxxxxxxxxyz{|}~~~~~~}}}}}}~~~~}}}|||||}}}}}}||||||{{zzzzzzzzz{||}}}|||{{zzyyxxxxxxxxyyz{||}~~~~~~}}}}}~~~~~}}}||||||}}}}}}}}}||{{{zzzzzzzz{{||}|||||{{zzyyyyyyyyyyzz{{|}~~~~~}}}~~~~~}}}||||}}}}}}}}}}}||{{{{zzzzzz{{|||||||||{{zzyyyyyyyyyzz{{||}~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m27.bin b/applications/SprPoP/dist/MUS/m27.bin deleted file mode 100644 index 2db2ee0..0000000 --- a/applications/SprPoP/dist/MUS/m27.bin +++ /dev/null @@ -1 +0,0 @@ -|vplnqvz|~~~ztrrrrrsuwxx}~}|zxvwytsvwwvuuvxvsxxwy{|}~}vvussrrsvzz}|yvvuutqqtqpssstsstvvswxuwxxwuutuvrptrppprssrpttqsuuvvwxy}{}~{zyyzywtuvqqsrrrstvz{|~~{zxvvwwtvzxwyyxwvutuspssrrsuxyyxz}yx{yyyyxz}}|}|zxwvqqrpooqrtsrsvsqttsstuvz{{~zy{{zy{}~~{|}|{{zz|}{~}~}~}{zywwxwux{yxzzxvtsrsoloonmnpstssvxssvuvvvwy|{|}~}}|~~}|{{{}|{{~~}||~~{yzyxvuuturrwyvvxwvtsrrtnmpponpruutuxytuwwxwxx{|z~~~~}~~||||}{|{{~}|{|}~}|}wyxxwuutttqtyxvwwwvstsurmqrqpqsuvvvw{wuxxyxxyz|{||~~~}|||}|{|z}}|{||~~}|}yxyxxuuutursxywwwwwuutuuoqssrrtuvwww{zuxxyyxzz||{}~~~|}|}|z~}y}}|{||}~}|}zwyxyvvvuursxzxxxwxuuuvwprttssuvwwwx{{vxyzzxzz|{{|~~~|}|}{z|y}}}{{}~}|}~yxyxzvvvuvrtz{yyyxyvwvwwpsuutsuwxwxy}{vyyzzyzz|zz~|}}|}|}zz{z}}}z|}}|~xyyyzwxvwurw{|xyzyxvxvxuqtuvstvxywy{}xvyx{yyzz|y|~~}~}|}|}|y}z|}|{~~|~}x{yzxxwvxsty}|x{zywwxwxrrtvwsvwyxw{}}wxyyzyzy{{x~~}~~}~|}{}|y~z|}}}~||y{yzxxwwxsuz~|y|zyxyywwrstwwtvwzww|}|wyyxyyyx|zy~~~~~}|}||z~{y}{|}}}~|}z{yzyywwytv{|y|{yyyzxwsstwxuwwzxw}~}yyyxyyzx|{x~~~~~~~~{|}|z}|y~~{|}~|~{|yyzzxwzuvz~~y||yyz{xwtstwzvxwyyv|~}zyzwxzzx{|y}~}}{{|}z{}y|}z~~}}}}}zx{wvz{~}|}}y{|wy|}z}{z|}|yxwww}~|~~}~}y|yvz~|}~{xz{xwzwvz~~y||y{}}ywvuux{xxwxxty|zywwssvvsuxtw|~~~|}~|{xuwxutxvuz}~||{~|z|~}xwvuuy{xxwxvv{||zzxuvyxvzzx|}{zyx{~{zyyxuz|{zywstwwsvxux~|{{z|~}|||y}~}yx{|yz}z{~|~|{}}|{{}|xwvuv{zxwwxtw{{zyyuswxvuzwx}~}|}~{}{y|~{z~|{~}}{|{}~yz~}z}zy|~|wvvuu{{xwvxuv||{zzvtwzwuzyx}~}}~|}}z}|z}|~~}|z{z}~yz}|y}zy|~|wvvuu{{xxwyuw}||{{wtxzwv{yx}~~~~|~|z}|{||~~~}|z|z~}yz~{y}yy|{vvwvw}{yxxyuy~|||{vuy{ww|xy~~}{z{z}{~~~}~}~|z~|{{y|y||xz~~yvwwuz~zyxywu|}}}}zuw{zvz{x|~~~~}}|~z|~z~{~~~}{{{{|zz}~x}{x{~xwwwv|}zyxzwv~}}}}yux|yv|zx}~~~~~~~}}}}y}}z}{~~~|{z{{~yz~}x}zx|}xwxww}~zyxzww~~}}}xux|yv|zx}~~}~~~~}~~}~}|~y|~z~{~~~}{{{|}zz}x}{x{xwxxw}zzxzxv~~}~~zuw|zv{{x|~~~~~~}~~|~~{y{y~z}~}~}}||}z~|}y|yz}xz~{wxywz|zyzzv|~~}vv{|wy}xz}~~}~~~~~}}}~~{~{y}{z{{}}~|zz||z{~}x~zx|xwyyx{zy{xw~zux}{v|{x|}}}~~~~}|}|~zyzz|z|}}}|~{z}{z|{y~xy~}wxzyy~{zz{wzxuy}yw}yx~}}~|}~}|}|~}~}{~x{~y~}y~}}~|~|~~|~|{~z}|z{}z~}|}|x~wx~~x|}x{~|~}|~}|~||}z|~z{}{}}||}x~xx}yz~yz|}~|{|~|~~{{{zz|{|}||~y|yw|zy~zz|}~|{|~|}~{{{zz}||}||~z|zw{zy~zy|}~{{|~~|}z|zzz}||}||~z{zw{{x~zy~||~{{|~~}}z|z{z}}|}||~z{zw{{y~zy~||~{{|~~|}z|zzz}||}||~z{zw{{y~zy||~{{|~|}~{{zzz}||}||~z|yw|zy~zy||}{z|~|~~{{{z{~|~}||~y~xw|yz~yz|}}{~{|~|~||z|~z{~|}|}}y~wx~x|}x{}|}||||~||{~y}|z|~{~}|~}y}wy~x}|x|}|}|~{~}}}|z}y~|z|~|~}|~|z|wz}x~{x}||}{~{~}~}|z}y~{z}}|~}|~|{{wz}x~{x}||}{z~}~}}z}y~{{}~|~}|~{{{w{|y~zx~||}{z|~~}}z|z~{z}~}~}|~{{{w{|y~{x~|{}{z~}~}|z}y~{z}~|~}|~|{{wz}x~{x}|{}{~{~}~}|z~y~|z}~|~}|~|z|wz~x~|x|}{}{}{}}}~|z~~y}}z||}|~}z}wyy}}x{}{||{|{}|||y|~z|}}|}~zxx}y{~xz{||z~z|~|~}{{{{{~}~}||~{}yw|{zyx~{{}zz|~}}z|y~{{}~}~}|~|{|w{~y~{x||{}{}{|~}|{}y|}z||}|}~zxy~y|~xz~{||z~y|~|~~{{{{{~~~||{}zw||zyx~~|{}zz~}~}}z}y~|{}}~}|~}{|wz~y~{w||{|{|{|~}~|{~y}}{}}}|~~z~wyy}}xz}{||{|z}~|~||z|{|}}|}zxx}z{~xy~{{|z~y|~|~~{{z{{~}|}{~yx}{{yx~{{|zy|~|}~{{z{{~~~}||}zx||zyx~{{|zy~|~|}z|z{{~~~~}|||zw|}zzx~~{{|zy~}~}}z}z|{~~~~}|||zw|}zzx~~{{|zy~|~|}{|z{{~~~~}||}zx||zyx~{{|zy|~|}{|z{|~~~}}|~yx}|{yx~{{|z~y|~|~~{{{{|~~|}|yx}{|~xy~{{{z}y}~|~|}z|{|}}|}{~xyz}}wz}z{{{{{~}|{~z}}{}}}|~~{}wzy~|w||z|z|z|}~}|{~z~|{}~}|}||w{~z~{w||z|z}z|}~~}}{~z~|{~~}|}}{w{~z~zw}~{z{y}y}}~}}{~z~|{~~~}|}}{x|~z~zw~~{z{y~y~}~}}{}z~|{~~~}|}}{x|~z~zw}~{z{y}z}}~}}{~z~|{~~}|~}{w{~z~{w}~|z{z}z|}~}|{z~}{}~}|~~||w{z~{w||z{z|z|}~~||z}}{}~}|~|}wzz}|wz}z{zz|z~}~|}~{|{}~~|}|xy~{|~xy~zz{y}y}}|~~||{||~~}}}yx}|{~yx~{z{yy~}~}}|~{~||~~}|~}{w{z~{w||z{z|{{~~~~||{}~{}~~|~|~xy{}}wy~~zzzy}y}}|~~}||||~~}}}zx}}{~yx~~{z{y}y}}~}}|{~}|~~}|~}|w{z~{w||z{y{z{~~~~||{}~|}~}|~}}xz{}|wz~zzzz|z}}|}~|||}~~|}}xy~||}xy~zzzy}y}}|~}}|||~~}}}yx}}{~xx~{zzy~y}}|~}}|||~}}}yx}}{~yx~{zzy~~y~}}|}}~{||~}}~zx|~{~yw~~{zzy}y}}}}}}~{}|~}|~zx|~{~yw~~{zzy~~y~}}|}}~|||~}}~zx}}{~yx~{zzy~~y~}}|~}~|||~}}}yx}}{~yx~{zzy~y}}|~}}||}~~|}}yy~||ytosxzuuwz~{wutptvtvusot|{yvu{zyyxvppvttvwtswzvw|yy}~yxvrwwuvuqou~ysrnpusrsrqknsrtuurtxztuyutwzxswupsvvqopqpvvqonqqqyzz{zvsx}}}{{zx|{tqoqppxxxyxsrx}~xz}{{{zvwzztvxsswzwswuruxxtsuvv}|wvvyxy~xv{~|{y~|{~|x{xtvywrqrrrxwrppsrs{{||{uty~|}|~|}|~~~||~~~{w{{~zw}|yyx{}wy}{|}|xx{|vwyttwzwrvtpsvvqprsrxzurruvv}~~}xuy|}z}x{{}{vy}|zvvuu||{|{ztsyxxyyutwyusvtqtxxstvqruxtrsutx}yutvxw|{vx}|~z|zy}}{}wv}{~|vttsw{yzzyvqvxvwxvsuxxsuvrswyvswuruxxtsuvv}}xvvyyzyv{||yyz{|{vw~}z~yutssyzyzzytqwwvwxvsvywsvurtxzvuyutwzxuuwwy}ywx{z|~xw|~}{z|x{z|yuz}{{~wttrtzzyzywrsxwwxxuuxyutwtswzzuxxtvy{wvwxx}|yxz{z|wz|~}y}yy~|{{vv~~}z~zussrxzyzzyurwxwxywtwzxtwwtvz|xw{wvy|zwwyy{~zyy|{~~xx}~}zzzx}}{|wv|~~z}|vttrw{yz{zvrwywxyxuwzyuwxuvz|yw{xvy|{wwyyz{yy|{}yx|}{y{x|}{|wu|~~z}}vttsw{z{{zwswyxyzxvwzzuwxuvz}zx{ywy|{xxzz{{yy||~yx}~}~zy~zy}}{|wv}~{~|vuttx|z{|zwsxzxyzxvx{zuxxvx{}zy|xxz}{xxzz|{yz}|~xx~}}~yz~~~~yz||{vx~}|zvutu{|{||zuuzyyzzxwz|xvzwvy}}y{|xy|}zxyzz}zy{||{wz|~{x}~~}|x|{}yv{|}yvutw|{|}|ytw{yz{zwx{{wxzww{~|y|{xz}}yyz{{}zy||}zw{|~zx~}~}|~~yx{}|z~~|}~|xwuw{zz{{xuz~~}~{z{z{{xxzz|~xv{}|{~yxvx|z{|{yuz~}z{}|xwxxy~zxwzz{}wtx|{xyvrx||yz}vttsv|{|~~|x{}~z~}}xutsu{{{}}{wz~|z|}|~xtv{|xywsv}~|{{wwvx~~~zz~~~~xx}{zztv}}}{y}zutttz}|~~~zy~zy~~|}xx~{yyy}}z~}|~}~}}}}}~~{z}}}}wtw|{wxurw|}z{yvuuw}~~~y{{}~z||zzz|{~}|~~{}~}|~~{{|{}|yy{{}{utx{ywxtsz~}~z}yvvvz~}y}|}z{{z|{|}}}|~|{~}{|~|z{{{}zxz{{}xsvz{xxwsv~|||xwwx~{{|}{|}{{z}{~|~{}}{|~}|{}}zz{{}{yy{z}{uty|yxxtt|~|ywww|}z~~}||{~{{z~~z~|~{}}{|}}{}~{z{{||yy{{}|vtx|zxyut{|zxxw{}z~~~}||{~{{z~~{~|~{}}{|}}{}~{z{{||yy{{}|vuy|zxyuu|}zxxw|}z~~~}|{{~{{z~{~|~{}}{|~}|{}~{{{{}{yz|{{uvz|yyyuv~}~zxxx}|{~~~{}~z}|{z{||}}}|~|{~}{|}{{||~{y{||~xuw||yywty~~|yxwz~z}~~~{~~|z|{z}{~}~}}~{|}~{}|{|||}zz||}}xuy|{yyvu{~{yxx{~z~~~~}{~~{z~|{z}{~}~|}~{|}~|}|{||}}zz||~}wuy|{yyvu{~{yxx{~z~~~~}z~~~{z|{z}{~}~}}~||~~|}}{|||~{z||}~yux||yzwuz~|yxxz{}~~~~~z|~~|y}|{z{||~~}~}~~~~~~~|}}xy}|{{wy|zyy~}{}}~}~~~~}}yy|}{|xy|zzy}~{}}~}~~~~}}{x{~~{|yx}~{zy{|}~~~}~~~~~~|~}yz}~|{{xz|{zz~}|~}~~~~}}zy|~}{|yy}{{z||~~~~~~~~~}}~|y{~}{|zy}~{{z{|}~~~}~~~~|~}yz}~{|{y||{z{}|~}~~~~}}~yy}~|{{y{|{{{~~|~~}~~~~}}zy|~|{|zz}{{{}~|~~}~~~}}{y|~|{|zz}|{{}~|~~~~~~~}}{y|~}{|zz~}|{{}|~~~~~~~}}~{y|~}{|zz~}||{}~|~~~~~~}}~{y|~|{|z{}||{}~|~~~~~~}}{z|}|{|z{}||{}~|~~~~~~}}zz|}|{|z{}|||~~|~~~~~~~}}~}z{}~||{z|}|{|}}~~{{|}~z}{{{~||~}zwwz|~~x{z~|}y{}~}{||}}}~|~|y~{~~}z}|y}yxy~}~~|zyy{|{|{}}{||||}}{yzz|}zv|y}~z|~~|z{}~}|~|}}~~zyy~|}{}}z~u{|}}|{{{{|z{~~}{~z{{|~z}|~{u}~|~|~|{~|zzz{{w}}x~}z{yz~~zvwz||{zsx~~}}}|wx|}~{t{yw~zxyx{zy||zzuwyswystv{|tuww{zvxy~xwyw|wvzz{}xz{swxtvstz~~z}~yzvr||vw~yyyw{xvyxy{uy|x~~xwrt|~~{z|}{}yuv{wwwv|wwzy{|txws{|z{yz}~{vry~~}y}w{{xutzwx{yz{uy|x~|vvux{ysuvtwwx|tu|yyyy}~yx{yy|wxyu}~z|xw}~ttwuxvqy{{ywusy~wv{zz}xw{tz|xywx|y{}zyvpy{z~}}xy~zuxxw{ww{uz~zxuu|}uw{z|}w}~{uy~|x|}zx}}yztt{v|~yyvv~~z{|wxxt}|sszwwzz~xtyyy}yz|w|}z{wv~|wz}{}|v{}ss{xvtqu~~{}ywytvyu}||vv~}~vx{x{zvx{ywtqw|}{}}xxvs{{yzvx~}wz|xzwuztz}}yvz}z~~x|~~~x~zy|xwsv|x{{x{ww}w{|xyvwy}tuxuz}z|tw}~{vy~|x|{z}wxzx~~vt|zsw{vxvs|x{}zzww~zxy~{}}v|usyx{~~~||{xxx}zz{{|}vu}~}x{wy~v|zsy~zxtyz}zu{yyzsw~{y}{}{w~}s|xs}{|xyvy~zxyu{ytuvuxz~zw~~uwz~|}}~vx{|xv~swywvxvwxst~u}yt|zx|}zv~~~xz~}|x|~~xyvmv|}x{xwzvx{qn{yy~|{~|wwz{}z}{|vpz{xwy}xw}vwzqqqszyuruyyy|xsuzy}}xrvw}~|{}wssw|{yzvspvyzwu}vt||{wopwwv~~wy~~vzxzy}~x}~y{{usy~|wwpnyuu{sv||}}|zwxuy~~}y~}~z~|||yxyopx}~}~yuy}|zrrrtzxvvxy|}}}|z}x}wt~}}{|}xw}}zuow|zyvwuxzw|vt}y~~|zwzzwv}}||x|}{yz}|zqvwv{xuz{z~vmuzv{|{~|z}x|~|{wz}{}~{|ztv~u|{ttrsy|wv}~}xtvy{}yxz{xwz|{|xux{}yz~{zuv~|toy{{{qqx{}xu}{}}~{{~~z{yx}zwwywv}~{zx}tu}x{z}squ{~|~|qx{}~w|w~y{~|yzwwz}{wtvxyz|~~|qsxvz{}suyyx~{{~zz}~}w{|{y}~yuyvuzy{x|zv~qtrrz|~|}xvvz|}qvywyz~|z}|}yy~x~ytz{vrwu{upsw~|u{{urrx|tz|z{uy{srxywvr~y}|}|}t|t~xtrvz}{wlpzppzuwuu|}r}}|zz{}s|yv{x||quxz{u|{~|utoo~}s{}xxuxwk{{}|y|zz}zw|xxu~ss|vz}{~xops{~}v}ttqsv{xxz}vk}}{zu|{vwx{zqy|z|tsz~{~{}xqt|tqzuwtu~}rz}{}~xwy}}s{y~xzsuz{|yx~{wuoq|{z}xvtv~|nl||z~~~w~z~|yw~x~w{sy~{tyxqrxz}zoyxsqnv~y~|zv{yow{{}zz{x}z}wu~y}wzvsnvzxv~vpw~zlw|y|zt~{tu|x{}u{~owyt{u}ztwtp{~{~wfkolklfp|}{wyho{tsvkgrssuuu{x~y~zvkdoqpo}~u}whoqmnpjmvvqryju~qq}{wytr{zxsvwkv|tdhsqpqljwuop}tp}v}}}ztwyvxqpzxvuqlzyokuxy|ys}|wxxsstorzx}z}xwwjqurqqmowwxzv|woxxwxvt{{xy|xz~}u~zyvmrwsuvzmw~yoovutokluwyyyyz{{vxz~~{z~||xvv{|}|wv{~{ty|{z|rmwwtx{qu||y|px}vjmtooromwxyx}yo|zot}|||vw~ztw{{~zx}|x|v|~~u{}yy~xtywvvsjowvvx~u~ztsxussolrsvtuxr|{rs{xsttq{}~yy}~}{wx}|yyvv~}~{~ty{wvvor}}zxuszwqoussywnv|{zx|rx|vmotqrwuqz~~~{t}v{||{x|zx}|}~zz}}~{yzt{~||ztz}~|vx}yuwvusojrwwvw~x}~{utxusurltxzv{|v}w|}utyuv}{~x~|zs{|wxztx~y~xw{wuvsq|}zx|zqxyuoqutyzrr|}|y~yu}yusvutxyty{}x}zx~|y{}z~{z{|||w}}~x|x||zzxy}~z}xvzrvwtsrlqxxxyz{~ywzvuwsmv{zx{~yz|{tv{xv~}}{~{y~xy~yvzyt{y~xxyuuxuv~z{z}xr{yurvxyzxsx}|y~ww{zwswvvzzv}|zz{|~yy~}x~}~|~|~~xy~{z}~{{|x{}x}~{|}v|uwztstppxyz{}x|wyxuvuou|zzz{~{yuw|zw~~~~~{~~yy~~{{|xvz{u{|zyzvvzyx|{}zzxs{zwtw|zxyvy}}z~wv}|xuyxw{|xyz{{z|xz|v~}}~|}~xwz||~|x}y|~|z~z|wxzusutqxz}~x}yyyuuusv|z|z}}xwwx{|x|~}}}~{x|~}{ywy|xy~}xyxvy~yw|}}y{vw|zxx~|wy{x|~~|z|tz{wwzyy}|{~zz{~{{{z~~xy~z{|{~|{y~|~}{||wz}|~~~}zz~{~~}}~~~~y{}zxw}wvzyxx}|}zuz{{y|}}{y}~z{}xw{{}~yy{zwsuuvz||}}w~}xyxu{{yz}wy}{z~{|xy|yxzyx{}z|yvxy|wz}yvuvwxxvt{~~~wz|yxyvtvusz{yy|{~zz}yz}{{xsvzvw||}|}~vuzyxz{wz}||~y|~|}~}{~zy|}|~{{~|||tsvux{{{y|wy~}xwzyz}}~}~}~}}|}}~{z}}zzzx~}}~||}~{z||{|{~~|}xwxzwvxzwz~|yuz~{yyzwvxxx|{||~}~}{|~z}}|~z~~y~}~|}}}}{ww||}|}~~}{y{ysuz|{z|x}~}}~~usxyw|}}{{|yzxz|z||}}|~yy|z||z|}{z||yxy{{~zx~}~~yzxxyzywx{yzzxy{}{{{ywy|zz{}~~}~}}~}}~}~z~~}z~}}||}~{zzvw{|}~|~}}{zzwsx}|{{|z~~ytw|zy}~~{||||yz}}{|z~}~{x{}{}~{z~~~|y|{yz|}~~|y|}zxzz{zzyx||z~zw||~~|{{{xx}|w{}~~}~~~}~{|{}|}~~}~|~zyzww{}~{}}|zywuz}||{}|~}xvy}{y}~}{|}}{z{~}|z{~~~~yy|~{~~z{~}|y{{z|~~{||~~~yw{|{z|yy|}|}yy~|}}{{{yz~{v{~~~~~~~~}}~|{{}~~}}}}zyzyw{~~|}~~ywxxy|}}{}}}{xxz|}z{}}}{~~|{{|~~~~|{}~~}{y{~}}~}{~|~}|{y|{|~{|~~~}{xy}|{||{{}~~yz}~|~~|{{{z}|xx}~~}~~{~}|}||}{}}}}zxzzx|~}~~~yvxzz|~}|~~~yx{{{}{z|}}|~~y{|}}~~~~}|}}}|{z{}~~}}~{~~|{y{|}{{}}zyy}}|||}{|}z{~~}|~}{{|{|{yx{~~~}}~}{~{|~|~|||~~|{|||~zy}~||y}}}~}{}~~~|y|~~}~~||~~~z{~~}|x{~}}}||~}z{{|}}}}|}~}{|}~}~{|~}||}~|yzz}~~~||}}~|{}~}}~~|z}~~~|z||}~|||~~~{{|}~{y|}}|y}~}~~{{~~|y{~~~~}{}~zz~~}{x|}~}|}|~{z{}}|~}}|}|{}~~~~{z~}~|||~zy{|}~~~~~||~~~|{|~}}~}z|~~}{{|~~{{|~~~~~~}{{~|z{~~}~}z|}}~}z|~|zz}~~~~||}~{y|~|x{~}~|}}}|z{~~|~}}|}}{}}~{y~~~}||}|~zy{~}~~~}}}|~}{|~~}}{z~~}}|{|~y{}~~~~~}{{}{{}~~~}z{~~}}|{|~~zz{~~~~}|{~~|{{~~~zz~~}~~}|}}}zz|}~~~}|}}||~~~~yz~~}{}}}}yy|~}}~|}|}{z|~~}~z|~~~}|}|||yz~~~~}}{||{}~}~}}z|~|||||~}zz|~~}}}{}~{{|~~~~z{~~~}~}}}}|zz|~~~~~|}||}~~~zz~~}{|}}}zy{~~~}||}|z{~~~~{{~~~}||}|~~zy{~~}}|~}{{~~}~}zz~~~|{|}|~{z{~}~}}||}}z{}~~~|z}~~~}|}}}~{z{}~~~~~}~~{|}~~~~}y{~}{|}}|zz{~~~}||}~}{{~~~~{{~~~~}|{}}~~zzz~~}|}~~{{}~~~|y|~~~{{|}}}{{}~}~|||}{z|~~~~y{~~~~|{}~}}yz|~}~}}}}|z|~~~yz~~}|{|}~zz{}}~}||}{{}~~~~{{~~~}}|{|}~zz{}~~}||~~{{}~~~|y|~~~~|{|}~|{{}~}|||~{z|~~|y|~~~}|{}~~{yz}~~~}}}~~{z}}|y|~~}{||}|z{}~}}}|}|{|~~~~|y}~~}|{|}~{zz}~~~}}|~~{z|~}|y{~~~}}{|}~{z{}~~}||~~|{|~~~|y|~}}|{|~|zz}~~~}|}~{{}}|y|~~~~||}|~{z{~~~}}|~~{{}~~~~zz~~~|{{}}zz{~~~}|}|z{~}~z{~~~~}|||}}zz}~~~}|}|{|~~}y{~~}|{|}~}zz|~}~}|}|{|~~~}z{~~~}}||}}|zz|~~}|}|{|~~~}y{~~}|{|}~}zz|~~~}}|}{z|~~~z{~~~~}|{}|}|zz}~}}|}|z|~~~}y{~~~}|{|}~}zz|~}~}|}|{|~~~z{~~~}}||}}}zz|~~~~|}|{|~~~~zz~~~}{{|}~{z{~~~}||}z{}~{z}~~}}|{}}~{z{~~~}}}~}{{}~~~{y|~~~}|{|}~|z{}~~~~}|~{{|~}y{~~~~}||}}~|zz|~~~~}}|{|~~~zz}~}{{|}~{z{}~~}||~~{z}~~|z|~~~}|{|}~|zz}~}|~{{|~~~y{~~~~|{|}~}{z|~}~}|}|z|~~zz~~~}}{|}}~zz{~~~}}}}{{~~~{z|~~}|{|}~{z{}~~~||~~{{|~~{z}~}}{{|}|zz}~~}}|~~{{}~|y{~~~~}|{|}~|{{}~~}}|~~{z|~|z{~~}|{|~~|zz|~~~}}~~{{|}|y{~~~~|{|}~|zz}~~~}|}{{|~~|y|~~~}|{|}~|zz}~~|vppsuux{}~|ztonnooqvxxz~}yxwyz|zvtvxvuuusqqsvwyzz~~|vqopoprvxwz|xurqrstvsqqsutuutrprtvvvvuvvwxyvpnqrrqpommnnppmmnrsuy|}|}~}zwussrsqmlnpqsx{zz|}|{xtstvvvvtuuuwxytoqtutttsstuvxvttwyz|~~}}}|}}|vrruttsqpnopqspnnpstw{}||~}z{~~~~}|{{|}~{yz{~~~|||~~}~~}}|yvuvxxwvuvvvwwwqnorsrrqoopqstrpqtvwz~~}~}|~~|~}|zyxx{|~{zy{{yyxvsqsuuutsttuvwwrnorsssrrqrtuwussuxxz~~~}~~~{}~}{zywwyz|}zxxyzxxxwsqrsuuttsuuvxxuposuuuttrstuxxutuxy{~~~~{{}}{zxwvwy{}|yxxzyxxwurqsuuuutuuvxyxspquvuvuttuvxyxuuwzz|~~~~~~{|~}{yxwvxz{}{xxxzyxxwurrtvvvutuvwyzxsqswwwwvuuvwyzwvwy{{~~~~|{|}|zywvwxz|}zxxzzyxxvsrsvwwwvvwwyz{wrsvwxxwwvvxy{zxwx{{}}}~~~{{}}{zxwwxz{}|yxy{zyyxussuwwxvvwwyz{ztsuxxxxwvvwyz{xwxz|}}}~{{~}{zyxwxz|~}zyz|zzzyvssuwxxwwwxy{|zvsuxxyxxwvxyz|yxxz||~}}~~||~~|{yxxxz|~}zyz{{zzzwttvxyxxwxxz{|{vtvxyyyxwwxy{{ywxz|}}}||~~|{yxxy{}}zz{|{z{zwttwyyyxxyy{|}{vtvyyyyxwwxz{|yxx{|}~}}~|}~|{zyy{|~|zz||{{{yvtvxzyyxxyz{}|yuuxyyzyxwxyz|zxxy||~~~|{|~}z{}~~~}|{{}~}{z|~~~}}}~|}}{zz{||xvy}}{z{|~}zyz}}~~~zz||{{zxwxyz{xvuwzz|~~}~||}}~zyz}~~~{wwyyyxwvuuwxywuuwyz|}|}~|||}~~zz{|{zywwxz|}|}}}~~~|zxwxz{~~|{|~}}~~~}{||}~|yxy{{|}||~}}}~|{}~}}{zzz}~|{}||~~}|}~}~|z{}|{zxwxz|~|}}|}}}~}|~}{{}~~{y{}~~}|zz{|}}zyxz||~}|}}|||}}zz}}|{zyxz}~~~~~||~~~|z{~}}~~}xxz||{{zxyy{|{xwwyz{}~{{}||||~}z|~~}|{zz|~~~||~}~~{z|~~|}~~{wxz|{{zyxxyz|zwvwzz{~}{|~~}}|~||}~}|{z{}}|}~~~~~|z{}~~~}|}~}xwy{{{zyxxyz{{xvwyz{}~~||}~}}}~||~}|{{|~||~}~~~}zz|~~~}|}}~~ywx{{{{yxxxz{{ywwyz{}}|}~}~}|}}|{{|~~||~|~~~~~}zz|~~~}|}}~~zwxz{{{yxxyz{|ywwxz{}}|}~~~~}}~}|{|~||~~|}~~~~}zz|~~}|}}~~ywy{{{{zxxyz{|ywwy{{}}}~~~~~}}~}|{}~{|~~|~~~~~~|z{}~}}}~}xxy{{{{yxxz{|{ywxz{|~~}}~~~~}~~}|{|~|{|||~}~~}~~{z|~~}}~~{xx{||{zyxyz{|zxxy{{}~}~~~~}~}|||~~|{}~|}~}~}}~~{z|~~}}~{xy{||{zyxy{|}zxxz{|~~}~~~}~}|{}~{{}~{|~}~}}~~~{z|~~}}~{xy{|||{yyy{|}{xxy{|~~}~~~}~|||~|{}{xy|~}}~~}|{zyz}|~||{z|~~{}{}~~~~~~|{{|~~~~~}~}}~}}{{{}~~||}{}~~~~~~~}||~~}}|{{zyyy{~~yz~}{yyz{~~~~~}|{zyz~~|}|{z{}}|~{}~~~~~}|{{}}~~~}}|~~}||{|}~~||}{|~~}~~~}}}~~}~}|{{zyyy{~~yy~~{yyz{~~~}|{zyz~~{~|{{{}}{~{|~~~~}|{{~}~~~}~~|~~}}||}~~}{|}{{}~}}~~~~~~}}~|{{{zyyz}}yz~~|zzz|~~~}|zyz|}|}|{{|~~~~~||}{|}~~}{{}}~~}~}|~}}}}~~~{{~{z|}}}~~}~~~}}~}{{{zyyz|~zy}}zzz|}~~~}{zz|~|~||{|}~~~~}||~{|}}~}{{}}~~~~||~}}}~~~}{{~|z{}}|~~~~|}}~~|{{{{yy{}~yy}}{zz|~}~~~}{z{}}|~}|{}~~~}}}{}}{||}~}||~}~~~~}|~~}}~~~|z|~{z||||~}~}|~~}~~|{{|{zyz|~{x{~|{z{~~}~~~}|z{}~{~~|{|}~~}}}|||{{|~~~||~}~~~}}||~~}~~}{{~}zz||{}~~~~||~}~}{{{|{zz{}~zx|~|{{|~}~~~~}|{|}~{~~}|}~~}|||{|~{{{|}~~}}~}~~~}||}~~~}~~}zz~}zz{{{}~~~~|{~}~}|{{|{{z{}{x{}|{|~|~}~~~|{{}|}}|}~~~|||||~|{z{}~~}~~}~}|||~~~~}~~{y|{z{{{|~~~~}{}}}}|{{{|{{{|~}yy}~}|{}}|~}~~}|{|~~{~}|}~~}{{|||~|{z{}~~}}}~|||}~~}}~}{y|{z{{{|~~~~}{}~}~|{z{{{{{|~~zx|~}|{}}|~}~~}}{|~~{}}|}~~}{{|||~~{{z{|~~}~~}~||}}~~~}~}zy}~{z{{{|~~~~~~|{}}~}|z{{{|{{}~}yy}~}|{~|}}}~}}||}~}|}|~~~|{{||}}{zz{}}~}~}||}~~~}~~~~|y{~|z{{{{}~~~}{|~}~|{z{{|{{|~~zy|}}{}}|~}~}}}|}~~{~}|}~~|{{||}~}{zz{|~~~}~}||}~~~}~~~~~|y{~|z{{{{}~~~}z|}}~|zz{{|{{|~~zy}~}}{}||}}~}~}|}~}|||~~~|{{||}|{zz{}~~}~||}}~~}~~~~}zy|~{z{{{{~~~~~~|z~}~}{z{{{|{|}|x{~}}||}|~}}}}}|}~{}~|}~~}{{||}~~{{z{|~~~}~~}||}~~~}}~~~~~|yz~}zz{{{|~~~~{{~}~|{z{{|{{|}{x|}}|}}|~}}}}}|}~~{~}|~~~|{{||}~}{zz{|~~~}~~}||}~~~}}~~~~~|yz~}zz{{{|~~~~{{~}~}{z{{{|{|}|x{}}||~{~}}}}~|}~|}~|}~~}{z||}~~{{zz{}~~}}||}}~}}}~~~}zy||z{{{{}~}~~}z|}}}|zz{{|{|}~~zy}~}}{}||~|}}~}|}~{~~|~~~|{{||}~~{{zz{}~~}}||}~~}}}~~~}zy|{z{{{{}~}~~}z|}}}|zz{{||||~~zx|}}|}}{~|}}}~}}~{}~|~~~|{z||}~~{{zz{}~~}~}||}~~}}}~~~}yy}~{z{{{{~~}~~~|z}}~}|zz{{|||}~~yy}~}}{~wsqonorv{~|~}xsoonnnruy}~|{zzzzxuutssuxzyz||zzxvzxwzzxvusvy|}zywtpniinrrpnnpppqtvyyyyz|{uswzyvursuvusrqqqqqrpoopqrtxyy}~}{wsvxywutuuuvy{~||}}}}|{|{yxtpswzzwvwvtqqrrtuvvwxvrty||{zx{~}}|}|{zz{zuty|}|{xxyxusqrsssttrrsuwy|~}|}}~~~~~{}~~}}yy~~|y}|z{|||{zvtttuvxzyxz{{zzwux{{wsqrrqnoprtuwz||xtwz{z{zz||{yxz}}~~~~|~zxxxwvvvvwwxy||ytv{||}}|~~}zwuuvxyzxuuuuvx{|xwxwuutrvz|{xvxyyxxyy{{|~~|||}~|yxxy|~zxyzzyyxz}{zxwwxvutsstwxurtutrrpquwusqqrtvwwtrrsvx~|{~{yxy{zvvxyxyyw{|{|{zyzzwurrtvz}||~{wtrmnswwsponnnnqrstuwz}~|}~~~|}}||~|{xvz}}|yvvwz|{zz|~}y{~{xuvwwvtrrrstvxvvsrrtxzy{~~}yz~~}}}}~}~zz}~~~}{{}~|}}yuwz}|{yxwusrttutrpqttqqw{|{{yy{{zyz{zz{||zz{|}}~~~yw{~}|||~}~}}|xx|~zxz{ywwyyyxvusrrsssuxyx{|}|{vuy{{xvvxvtrtvy|}|xz}|}}|{z{}}}~}}}~z{}~{xwyywtssuxy{{{zwtw{}~|}~|xtsvyzzzzyzzz|}}yyzzyzzxz~}|~}zy{|~}~~|zyz|~zzyyz{|zwx{{z{|{~~zyz{zywwxwwx{}{usvwvvwvy{{xvwy{}}{yvwwx{~|~~|yyz}~ytuy{z{{|}{zz{}~zuttvx|}{yvsquz|zvstuvutttwy{|~}{{}~{zz}~|yy~~|yvvy{{z{|}~|~}||ywz{{wtssuxz}{xvvwwy}~zx}}~{|}~}{~~~~|}||~~}z|~}}}~{yy|}}{}~}~~{||y|zuttsrvz~||}}}|yyz}~~}|{|yxwttuz~~~~|z|~~y{~}zwxz{{{z{}}}~~zvvz~|yxyxyzzzyzyvtw{}zwuuy{{{|}~~}xtuwzz{z}}}~}}}}~{xy{~~||{xwvy{{}{yxy|}}}xrsx||{{}}{yzzzzz}|yy~~~|yxz~~zwz{{{|{{||zyyz}|{yxwuuvz~~}}~||}|}|~}~~}|||~{vx}~~~}~{zy{}|zxvx{}|xwxyyvsrtxzz|{{~~~~{{z|~}}}zx{~~|||zzz|{z|~~~}~~|{}}zvtvxz}}{xxxxwx|~|}zxv{~}}~|{{|~~~~}|~~}~~~}|~~{{{}~z{ywz|yyz{|}zxvwxxz{zz|~}{wx|{y{}}zwy|~~{yz}}~}}~}~}}}~{|}|}{{zz|}}||~}yutvz}}xuv{}xxxxwy{~~|~}zx{~}~zxy|~~~~|~~xxz}}{xvxz}|{{~~zx{}{yxyywwz{~~~}zx{|yz|~~}{xz~{z{}}~{z~~}~~~z|~|~~~}{z|~~~}~~{xx|}{|~~}}~}~|yyz|}~}}~}{ywvy{}~|zz{~~~~}}~~{z{~yy~}z|}~~|~}}|{{yz}~}}z{~~|yyy{~}~}|{wx{|}}}~|xuuxy|~~|~~~~~|||~}}~~~~~}}~{{|~{~}{|}}ywx{}~wy}~~~zvvxz}}{{{||zz|}zz{~}~|{||}}~|~zz~{zz}}}|||}|||zyy}~{||}~|zyz{yy|{z~{yy}}||~yxzz|~{}~{}~~}}~~~}}~|||~~}}}z{}{}|wuwz{~|vty~{||||z|}}~~}{{~~ywy|}~}~~~~~}y{~}zwy~}zzz{}}||}~|{~}{||}zwxz|~zxz||{}}|yy~{{}}|~}z|~~~~||{{}~~~}}}}}}}{xz~~||}}}~{y}}|~}~~~~|xy|~zzzz|~{z}~~}~~~~~{{~~z~||~{|~~{{~~}}zz|}zyz{{~z{~~~}}~~}}~~}}}yz~||}|{}~~}~}||}}{~~~yy{}}y{}}{{|}|~~~}|}~}}||}}z|}|}~}yx{~}~~}|{{~zx|~{xz}~~}}~||}~}{|~}}~~|}}{{z{~}{{}}}~xz~~z{zz|}||}||}}~}{}}~}~~|~~}}~|{z{{|{xz~}~|}{yz{{}}zz~~}~}~~}~~}|}}{}}z{~~~zyz|}yx}~~~~~}{z}}}}{yz{~|{{{}}{|}~}}}~~}}}}~~~~~~|{{~~yz~zx{~~~}~||{{|z{||~}{|}}}~||}{}||~{}~|~}|y{}~|yz|}}}~~~|yz}{{}|{}{z}}|~~}|wz||}|z|}xx}~~~}}}|~~zz{~~}}~}|~~}}|}~~|z{~}~|{z{}~|yz~~~~}~}{z}~}~}}zz~{~~~~|z}~{{{yz~{y~|zz}~}|{z}{yz}~}~~~~}~~{z|}}}~~|~{yz~yw{~~~~~}yy|}}{yz}~~~~~~}||~~~|}|}~~z}~~}~}zz~}}|||~}z}}{{}~|||{{~{yz~|~~|}}}~|x{~}~{z{}}zz}zy{|~|zz{}}}{z{}|}}~}~|}~{|}~|yy}|{~~{{|~||~~~|zz|~|||{{~|y|~~~~|~~~~~~}~~||~~~}{{~|z{~~|{|~~~~~}~{z{}|||{~}{}~}{|~}}|~~{|zx{~~~|{~|yz}{~~|z||z|||~||}|}}~}~|yy|{{}~}}|}}|xz~~~}zy{~~~}}|z{}||}~~~}||}||~}{|~}|zx|}yz|~~~|y{|z{~~|}}}~~~}|}~{z|~}{|{}}{z||wx}}||~~}{y|~}zz|~{z|~~~}{|~{|}~{{~|x{|z{}~|xy}}}~~{{}}{{}~}~~~~~~}~~|{|~|}~||}~}|}}yx{}}~~~}}||}|z{~~}~~~~||~|}{z}}}~zy{~~}~~~{z}{z}~zy{}~}~|{||z{~~~}}~}~}~~~~~~}{{}|~~}}}~}~~zwy}~}||~}||}~}}{z||}}~}}}~}~|}~}~{y|}~}{z}~~}}|||}|z|}}}zy{~~}||||||{}}}~~}}~~zxy|~zx{}~}{z}zxy|~}}}~}{||~}}|{}~}~~~~}}~~}~zz}}{yz}}|{|}~~~|{~}}~~|z|~~z{~~}~}{z}~{{}}}~z{~}}~}}}}~|zyz}|z{~||~}||}~~~~~{xy|~}{|}~~|z|~}~~~~}yy||{{{|}yx{~~~}}~~}~~|{}|~||~}}}}{|~}~}}}z{}}{y{{}|{|~~~~}}~}||}~}}~{z|~}~|{|}}|{{}}~}yz|zy|~}zz{}~}}}~||}~~|}}{{}}}~{y{~~~~}|||~~ywz}|z{~~}}}~~~|{{~~~}||~~~}~~~~zzz|~~}||}~~}yz~~zz{|}|zz|~||}~||}}|}~~~~~}~}|~zyz{}~yy}~}||~}yxz|}|{|}}|}~~}||}||~~{{|~~~}yz|}zx{}}}|}}|}~~zz|~~{{|}~}{z{}}}}}}|}~~~|{{|~}|zz~}zz}~|~~~~}|||}~zyz|}}~}}}~}vomoqrtux||wrolkmqsux|{{{|zz{zxuqpsuwwwwvtsrty{}|{}|xvwvurqrux{~xtrpnoquvvvvtplmqwyywvvwwvvvwvuuvtsrrqonnnopqromlnswz|~zvsrrtvxxwtpnnpty~~{xz}~~}|{zxttvuttuvvusopsvwwtstwyxx{}|xwz~~}yvwz{zxxxwvtstutqqqqpprstwyz{|}~}||~}yy|~~|yz}}|{z{}~}|{|||{z{}|{|}}}~zxwxyvuvvvvvwxwsoprrrrsuvvtrsux{|{yxwwx|~~}}~~|{|}~~zvvy{{{|~~|zyy|~}xtrqsux{|{ywvtqonquwwuttttsqpquxzz|}|yz~~~~{y{~~~|zxz~~{wvvwxwxyzzyxvuvvvxxvuvvtqpopsuwxvsqqqrtxz{{{{yxvw|}}}~~~~~}}~}}|}~~{wuvwzz{||yutssvy{{yvtrrsuwvtrrtuttuwyyzzywwy{{zxz|~}|{|||~~}~|{{|{yz|~~|yxyyyxyyyyyyyxvtqpqtwyyz}}{xwttuwy{|yvuuuwy|}{yvvy~~~~~~}|}~}~~yvy{|}}}|yvsstwz{zxvusqsw{~~}|{xursuwvwxyzzzyyyxxxxxxyyzyyz}~{{{~}}}{yxz|~~}|{zyyxvuvwxxxyzzxy}~{xxyyvuvwxyyz{{yustvwxzzzzzyyy{}~~}}|zyz}~~~}|||}}|yvvxyz|~~}~~{yxz}}zwutuwz}~{zzyvutuvyzyyzzyxutux{}}|}}|}~|yz|}{{|~}zyyyxvwz|}}}|zwvvyzzzz{zwtrruwz{zywwwvvy}~~~~{yxz~|{|~~}|{|~}zyxxz{}~~|ywvuux|~|ywvwxyywwvwxxyzzyz|}}{yz}~{z|~~{y{}}{|~~~~~}~}||}}}{|}~|zzyy{||{zyy{}}}yurruwz|~}zvtw{}{zzyyz|~~{yy{~|zz|~{zywvvwxz~~}zwwz|~}}~~~~~}}}|zywvz}}zxwyyz}~|~~zwuuvwy{~~}zxx{~~|zywvwz~||{ywwxzz{z{|||zwttvxxy{||zzz{}~~~}{|}~~}zyyz|~}{xtsux|~}||}~}}~~~}{zyyz{{{yxwvvwy|~~~~|{|~|{{}~||~}{|}}}}}{yxxyzyxwwxxxwuvz}~~}|}~{z|}z|~~{yz{~~}~}||}~||{zzz{zxuuvxyzzyyxyyyz}|zxy|}}||~}}}~~~}~~}~}}~{wwwx{~~}zxwvvwyzz{{zzz{{{}~}}|zyz}}{{|~~|}}zy{||yz~~}}||~}|zyyz{||}|||zwutvxz}}|zyyz|}}{yyzz}~}||}~}}~~}||}~~~}~~}~~|{|~~zyz{{|}}|zxwx{}{zzzz|~~~~}zxvx{{zz{{}~~~|{zyz{}~|{z{~~~|}~}|yxz|~~}{z{}}}|{{}}||{{}~}yvvy|{ywwxz}}{yxy|~~~~~~~}zxy|~|yxxxy||yxz~}}|{zz|}~~}~}|{zzzyzzyz{|{zxx{~}||~}~}~~||~}{zz{|}}~~~~~~~}{{||{{~}{{|{{{||{yvuwy{||zz{|||~|yy|~}||~}|~~~~~}|}~~}}}}}~}}}~|ywvwz}~}||{zxvwy|~~~~~}}~|yz}~|{{|~~}|}~~~~~}{{{}~{{|~~~}}||~~~}{xxy{}~}zxwwxz}}zy{}~|||||}~}}~~}}}~}zy{}~}~}|}~~}}|~~{{|~}{zyz|}}}|zxxxz~~~}}|}~}{{{zzz{|~~~}~}zxxz}~}{{~}~~}}~}}}~~~}|{yz{|||{{|~~}{z{}~|||}~~{zyy||{yxy{}~}|{z{|}}}~~~~~~~}}~|ywy}~}~}{{|~~~~~|z|~}~~~{z{}}zyz}}}~{zzz{~}~}|{z{}~~}}||z{}~~}{zzz{}~{zyz|~|}|zz|~||~}}}}~}|}~~~~~}}|}}}~||}~~}{yy{~~~~||||}}}~}~~~{zz}~}~}{yz|~~~~~~||}~|zz~|{zz{|~}~|~~}{{}~~||{{{z|~|{{{}~~|{zxy}~~}{z|~~zz|}|}~~~~~~}}~}}|}|}~~~~}~||{z{{||zz{}~}~}}{{{{{{~~~}|{}~~~~~}|yxy{}|}~~~~~|}~~{z|{zy{z|}~}}}}{{}~}}|}|{|~}}|||~~~~~}|{z{~~||~|{}}yy{}~~~}}~~~}~~~}~}|}}}~}}~|||zz{|}zzz{}}~}}~|{{{{|~}{|}}}|ywxz||}|{|~|{~|zyyyy}~~{}~~~}{}~|}}}zz|}}|zz{~~~~}}{zz}~|~}||}~~}yy{~~}}~~~}|||}}~~~~}}}{|{}~|zzy{~~~||}}||||}~{z|~~}}}|yxy|~}~{{}}zz}~~{zyzz|~}|~~~~||}~~||||{z||~}|zz{}~}|zyy|}}}{{|}~~{z|~~~~~~~~~}|~}}}~~~~||~~}{{z||zzz|~~||~}|||{|~~|{}~~~~|xxz}}}~~~}||~~{y|~~~{zz{z}}~}~~}|z|}~}||}}{|}~}}|z{}~~~~~}|yy{}{~~|{|}~|y{}~~~~~~~~~~}|}~}}~~~~~~|{~~|zzz|}{{z|}}~}}~~|||{{|~||~~~~~}zwxz||}~~~}{|~}{z}~}{z{zz~}~}~~~~~|{}}}}~}{}}~~~{z{~~~~~~~~~|zz|||~~||}}~~zy{~~}~~~~~|~~}}~}~~~~||~~|z{z||{zy{~}}}|~~}||{{}~||~~~}~}{wwy|}~~}{{}|z|~}{zzzz}~|}~~~}{|~~}}}}{|||~~|zz{~~~~~~}zyz}~|}}|||}}}zz|~~~}~~~}|~}~~}~||~~|{{z||{zy{~~~||~~}||{}~|{}~}~}|xxy|}}~~||}|y{|~~|{{{z|~}}~~~|{}~~|}}~|{||~~~{zz}~~~|yy{||~||||}}|z{}~}~~}||~~~~~{||~|{zz|||zz{}}~|}~~}|{{}~||~~~~~{xxy||}~~~~|{}~~|y{|~~|{|zz}~~~}~~~}{|}~}|}~~||||~~~{z{~~~}~{yz}~{|~~|}|}}~{z{~~~~~~~~}{~~~}~~|||}|{zy|~}|{yz~}}~}|~~}|{{}~}|~}~~}{xwy||}~~}{{}}~|z{|~~|{{zz|}}~~~}|}~}}~~|}||~~}zz|~~~~}~}zy{~}{|~}}||}}zz}~~~~}}|}~}~~~~|}|~~|{z{~~|{yy|~~~~|}~}{{}}|}}~~~~{xwy||}~~}{{|}~|z{|~~|{{zz|}}~~~}|}~~}}~}||{|~~~|zz|~~~}|yy{~|{}}||||}|z{~~~~~~~~}|}~}~~}|||}|{z|~}|{yz}~~~}|~~}{{}~||~}~{xxz||~~}}{{|}~{z{|~}||zz|}~}~~~}|}~~}}~}||{{~~~}zz|~~}~}zyz~}{|~~xsnoqqruw{|zxvvvvvvvttw}{yyzysprssqpqqrtuvy{}{upmlnrvxy~}zwtrruvsqvzzvroljjkmoqrsttssuuwz}ztqrrqpnmmmoqrrsuwz|~~|yy}}|{||{yuspoprvxxz~~{vspmlmopqsttsssssw{|xsrtvvvvwxxz{||}|}~~}}~{vtvxxvvy{zxvvvvwyywusrruwz{z}~{zz{}~}}||}~zz}|yz|{xxy{~|yyy{|~}}~~yxz|zwwyyyzz|}}}ytonrttstxzzyyyz{|~}{yvuvx{}~~|||~{z|}zxyz|}{yvuuvwyzy{~zuuxxustvwxyz|}~}zuplnstssw{}}}~~~~{xwxy{|{}~~~|~}zyyz}~|yvtrrsuwyy{}{vuwywtsttuwwxyz{|}|zxspqvxwwy{}}||||}~{xwyz|}}}}zz|zwvwx{}}{xvttuuuwwwz{{ytrtvvtsuuwxxyz{|~|ytpquxwwy{~~~}zxy{}~~~}~~~{{}{xxxy{}|zwusstuuwxy|}}{vtuwwttvwyz{{}~|yspquxwwz|~{xzz{||}~}}~~~~}~}zyyy||{yusqrtuvyz|~~~{vuwxxuuuvxyzz{{}~}|ytsvz{zz|~~~}~}yy{{|}}}}}~{{}|ywxxy|}|ywutuvvwxx{||zwtuvxwvwwyz{z{|}}|wssw{{z{|~|yz{|}}~~|||}~}}~~~||~}zyyy{}|{xvtsuvvxy{~|xvvxywwxxz|||}~}{wrsw{zy{|}yz{{{{|~||||~~}~~}~|{zz{}|zwusrtvwyz}}ywwyzxxyxy{{{{|}}{xuuz}}{|}|yz{{||}}||{}~}~~~}{|~}{yxxz}}|zxutuvwxyz}~~|xvvxyxxzzz||||}~~|yutx|}|{|~~zz{|||}~||{|~||}}~~}}~||~}{zyz|}|zxvttvwyz{~{xwxyyxz{{|~~~~}{wtv{||{|~}z{{{{{}~{{{{~}|}}~yttvz|}}~~|}}zz{zz{|}~|yxxxxww{~}{ywwwx|~zuqprtvwz|~}|~~zz}~}|{{{~}yvvy{{ywvvy{{zyvsssuwxyz}~}zwvvxyy{}}}~~}}|{|~{xuqrtvwxy|}|zz}}zxy{|{ywvwzzyywtstvxz|}|zyz|||~}~}}}|yxxwz~}|zywx{{zxz||yutuwxxy{||zxz}~~~||~~}ywwy{}~||~~~~}~~||{zzy{}zvuutvz}~~}{zyyy|}|z{}}zwuvxzz{|}}{yy|}}~}}zz{}~}}~}|||zzyxxx{~~{wuutuy|}~}{{zzz}~}{|~~{xuuxzyyz{{ywx|||~~}{{|~~}}|}~~|yyxwwxz}|yutuuvz}~~}{zzyz|}{z{~|ywvyzyyz{zxwx{||}{{}~~}}~}{zzyxxy{~{xuuuuw{~}{{{{|~~|{}}zxwx{|{{||{xxz}|{|~~~}{}~~}~~|}~~|zyzyxy{}|xvuvvy}~|{{{|}~~||~}ywwxzzzz{zywwz~~{{|~~~|{}~~~~|}~~|zzzxwy{}~zwuuvwz~~|zzz{|||{{}}zxxyz{zz{zxwwz~~{{}}|{}~~~~~|}~|{zzyxy{}{wuuvwy}|{{{}~~}}|}~zxxy{|||}{zxxz}~{z|~~~~}|{}~}}}||~}zzzzyy|~~zwvvwy|}{{|}~~~}}}{xxyz{{z{{ywwy||z{}~~~}|||~}}~~|}|z{zyxz}{wvvwy{~~{zz{|}}||{}~zxxzz{{{{zxwwz~}{z}~~|{{}~~}}}|~~{{{{zy|~~zvvvwz|~|{{}~~}}}}yxz{{}|}}{ywy||z{}}~~~|{{}~||}||~}{{{zzz}~zwvwx{}}{{|}}}}}|xxzz{{{|{ywwz~~{y{}~~}~~|{{|~~||~}~~}}}||}}yxxy|}||}}}}{yy{z{{||zwvw{{yy{}}{|~~}}~|yxy{}~|{|~~}}~}}|}~zxxx{~~}|~~~~|yz|{||}}{ywx{{yy{}~}{{}~~~}}~|zxy{|~~|z{~~}}}}||}{xxy{~~}|}~~|yy{{z{||zxwx{{xxz|}~{{}~~}}~|zxy|}|{|~~~}}}||}~zxxy{~|{|~|}|yy{{zz||zxvx{{xy{}~~|{~~}{ywy|}~|{|~~~~~}||~|ywwy|~||~~}~{yz||{|}|zxwz}~yxz|~|{{~~}~~|{yxz|}~}|{}~~~}}}|}|yxxz}}||~~}~zyz{{z{|{ywxz~}yxy{}~~|{{~~~~|zyxz}~~}|{}~~}|{}~{xwwz}}|{}}|~~{yz{{zz|zywx{~~yxz|~}||~|zyxz|~~}||}~~~~}}{|~{xwwy|~||~}~|zz{|{{||zxx{~~zxy|~}|{}~~|zyxy{~~|||}~}~~~~}||}zxwx{}|}~}}zzz{{y{{zxwy}|xxz|~~~~~}||~~~~~zyyy{}}}}}}~}~~~}|{|}zxwwz}~||}~}~|zzz{zz{zyxx{~{xz|~~~~}}~|zyxy{~}}}}~}}~~~}|{}|yxwwz~~|}~}|{{{|z{{{yxy|}zxz|~~~~}}|}~~|yyyy{~~||}~~~}|~~~~}|||yxwx{~|}~~}{{zz{zzzyxxz~|yxz|~~}}}}}}~~~~~zyyyz}}}}~~~}}~~~}|{}|zxxwy}~||}}~}{{z{zzzzxxy|~{yz|~~~~~~~~|yxyz{~~}}~~~}||}~~~|||~}zxxwx|~}~~~~||{{{{{zyxz|~{yy{}}~}}}~~~~~}zxyz{}}||~~~|||~~~}|}~zyxxx{~}~}||zzzzzyxxy|~{zy{}~~}}|}~~~~~~}zxyz{}}}}~~}||~~~||}~}yxxxy{~}}~~}|{zzzzyxxz}~{zz{~}~~|}~~}zxy{{~~}}}}|{|~~~}||}|xxxxy|~}}}{z{{zyxy{}{{{|~}~|{}~~~|yxz{|~}||}}{{}}~~}|}~{xxxyz}~}}|zyzzyxwy||{{{|~~~|}|{}~~|yxz|}}||}}|{}}}}}||~{xxxy{}~~~~~}~|{yzzywwy||{|||~}~|{}~~|yxz|}~}||~~|{|}}}}||~|xwxy{}~~}~}|zz{zxwy||{|||~~}|z|~~~}~}zxy{|}}{|}~|{{~}}}}||~~ywxy{|~~}~~|zyzzxwx{~}{{|||~~~}}}zz}~}~~|yy{|}|{|~~{{|}}}||}{xwxz|}~}}~}~}|yyzywwy|~|{|}}}~~~|z{~~~}{yy{}~~{{}}{{}~}}}||~zwwx{|~}~~~~~|zz{ywwz~~{{|}}~~~{z{~~}}}{yy{}~}z{}~|{|~~||||}~zwxy{}~}~}~~}{yzzxvx{|{{}}}}~~~}}zz|~}~~|zyz|~|{|~|{|}||||}{xwxz|~}}~~}~}|zyzywwy}}|{|~~}~~~{z{~~}~}{zz{~}{{~}{|~}||||}}ywwz|~~}~~~~~}{zzzxwy|}{{|~~~~~~|zz}}}~~}|zz{}}{{}}||}~|{{{}}zxwz|~~}}~}~~}{yyyxwx|}{{|}~}}~~~|z{}}}~~}|{z{}}{{}~||~~|{{{}}zxwz|}|}~~~}}{zyyxwx|}{{|~~~~|{{}}}~~}|{z{~}{{}~~}|}~~|{z{~~|zxxz}}|}~~~~~}|zyyxxz~|wronprty|{xtqprssstwz}}zwtsrrtvxyxwurqpnorvz{|~|yurpmkjklot||z{{zxvspmlmpsvurqrtvwutsstssuwxyxwtrponpstvutsuuutuxyyxy{|}~~zwtrqqooonnmnprw}}{{|~}yvvwxxvtsssrrtwxxyxvtsrruxz||{z{||{z}~~|||}}~~}|{|~~}}|{{||xtsruxzxusrpqrrrrsrqqsux|~~}~|{{|~}}~~~}|{ywx{}}{yvutrsuxxwvvvvvvwvsqprvzzwutrrtuttuutstux{~~~~~~~~~zxxvtsuxz||zxvsqqppqtvvttuuuvwwurqruz}{ywuuuwwvvwwutvxz~}~~~~~~}~~|xwvtrrtwy{{yvtrppppquvvuuvvvwxxvtsux|~|zxwvwyxxxyxvuwy|~}~}~~~}}~~~~zwvusqruxz{{xusrqqpqsvwwuvwwxyzywuuwz~}zxwwyyyyyzxvvx{~}|~}~~~}}~~~}xvutrqsvy{{zvtrqqqqruwxwuwxxyzzywuvy}}zxxxzzyyzzxvwz}~|}~}~~}|}~~~}zvutsqrux{{{xtsrrrrsuwyxwwyzz{{zywwy|~|yxyz{zzz{ywwz}||~}}}}|~~{wvutrsuy{||yusrrsstuxyywwy{{||{zxxz||zxxz{zyzzywvy|~||~~}~~}|~~|xvutssvy|}|yusrsstuvxyyxxy{{||{zxxz}}zxyz{zyzzywwy}~||~~}~~}|~~{xvutstwz|}|ytrsstuvwyzzxy{|}}|{zyz{~|yxyz{zzzzyww{~}||~~}~}}~{xvuttvx|}~|xtsstuvwxz{zyy{}}}|{zzz|{yxyzzzzzzywx{~|||~~~~}}~|yvutuvy|~~|xtrstvwxyz{zyy{}~}|{{z{}|yxyzzzzzzyxx{~|||~}{wuuvyz|~}}}~~yurrsvx{}|zyyyyxxwvutwz~~|zxxxy|~}{{zyxxwxz{}~~~~~{zyzyxwxyxz{}}|zz|~~|zvtstuwz|~}{wttvxz|~~zzz{{{{zz{{{zyyz{}~~|{||{|~}{z{|~|zwvvwy{~|xvwy{}~~~~~}}||~}{zzz{}~}}}|}~~~~}zxyz||||{|}}|{zz{|}~}zyy{|~}ywxz|~|{{{{{{zzyyy{~~{ywwwwyz{{|{{|~~~~~|zyz|}}~}|}~~}|{{{|~~~}~{z{}~}yxy{}}zyyyyyyxxwwxz~~{ywvvvwyz{{|{|}~~~|z{|~~}}~}|{{|}~}}}{{|~{xxz|~~~{yyxxxyxwwwwy||zxwwwwxz{||||}~~|{|~~~~~}{{{|~}|}|{|~|yxy|~~|yyxxxyxxwwxy|}zxwwwwxz{|}}}}~~|{|~~}}{{{|}~}{||{|~}zxy{~~|zyxxxxxxwwyz|}zxwwxxxy{|}~~~~~}|}~~~}{{{|}~~|{||{|~|zxy{~~~|zyxxxxxxwxy{}}zxwxxyyz{}~~~~~}}}}~~}{zz|}~|{||{|~~|yxy|~~|zyxxxyyxxy{|~|ywwxyyyz|}~}}|}~~~}{zz|~~|{{|~~|{}~{yxz}~~|zyxwxyyxxy|}{xwxxyzzz|~}|}}~~~}{zz|~~|{{|~~~|{}}{yxz|~~|{yxwxyyxxz|~{xwxyzzzz|~}|}~~~}{zz|}~|{{|~~~|{|~}{zxy|~~}|zxxxyyyxz||ywxyz{{z{}}||~~~~~~{zz{}~|zz{~~~~~}{|~~|zyy{~~}|{yxwxyyxy|~}zwwxz{{z{|~~||}~~~}{zz|~}{z{|~~}}|{|~|zyxy|~|zzz{{{{}~{yz{}~}}~}~~|{z{|~}{yyz|~||{{}~}{zz|~~}{zyyz|~|zzz{{{|~~zyz|}~~}~~}~~|zz{}|zyyz|}|{{|~~|{{{|~|zzyyz}}{zzz{{{||yyz|}~}}~}}~}{zz{~~{yyz{~~}|{{}~}|{{|~~}{zyyz{~|{zzz{{|~~zyz{}~~}~~}}~|{z{||yyy{}}|{{|~}|{{{}~}{zzyz{~}{zzz{{|}~{yy{|~~~}}}~~}{z{|~}zyyz|~}|{{|}}|{||}}{zzzz{}~~}|zyzz{|}~{yyz|}~~}}}~~~~}{z{|~}zyyz|~}|{{|}}|{||}~|zzzzz{}~~~}|zyzz{|~~{yyz|~~~~~}}~~~}{z{||yyy{}}{{{|~~}{{|}~}{zyzz{|~~~~}|zzzz{}|zyy{}~~~~~|}~~~}|{z{}{yyz|~~|{{|}~~|{|}~}zyyz{{|~~~~}{zzzz{}~|yyy{}~~~~}|}~~}}|{{{}{yyz|~~|{{|}~}|{|}~|zyyz{|}~~~~}{zyyz{~~{yyy{}~~}}}~~}}}{{{}|yyz|~~|{{|}~~}|{|}~}zyyz{|}~~~~}|zzyz{}|zyyz|~~}}~}}}|{{|~|yyz|~}{{|}}~~|{{}~}{yyyz|}~~}}}}{zyyz|}zyyz{}~~}}~~}|}||{|~~{yy{}~~|{{|}~~}|{|~~|zyyz{|}~~~}}}|{zyz{~~{yyyz|~}}}~~}|||||}~}zyz|~}|{|}}~~}}|{}~~{yxyz|}~~~~}}}|{zyz|~~{yyy{|~}}}}||||||}|zyz|~}|{|}~~}|{|}}zyxy{|}~~~}}}}{zzyz||zyyz{}~~}}~~}||||||~}{zy{}~|{{|}~~}||{|~~{yxyz{}~~~}}}|{zyz{~~{yyyz|~}}}}||||||}~|zzz|~~}|{|}~~}||{|}~|zxxy{|~~~}|}}|zzz{}{yyyz{}~}}}~|{||||}~~|{zz|~}|||}~~~~}||{|}~|zxxy{|~~~~}||||{zz{}|yyyz{}~}}}~|{{|}}}~|{zz|~~}|||}~~~~}|{{|}~|zxxy{|~~~~}||||{zz{~{yyyz{}~}}~~|{{|}}~~|{{{}~}|||}~~~~|{{{|~}{yxxy{}~~~}||||{zz|~zyyz{|}~}}~}{{{|}}~}{{{|}~~}||}~~~~}|{{|}}zyxxz|~~~~|||||{zz|}zyyz{|}~}}}{{{|}~~|{{{|~~~~~}||}~~~~~}|{{|}|zyxxz|~~~~|||||{z{}~zyyz{|}~}~}{{{|}~~|{{|}~~~~}}}}}~~~}~}|{{{}}zyxxy{~~~~}||||{{{|~{yyz{|}~}}~}|{{|}~}{{|}~~~}}}}}~~~}}~~|{z{}~~{yxxy{}~~~}|{{||{{{~|zyyz{|~~}~~|{z{}~~|{||}~~}}}}}}~~~}}}{zz|}|zxxxz|~~~~}|{{|{{{}~{yyz{|}~~~~|{z{}~}{{|}~~}}}}}}~~~}}}~|{z{|~~{yxxxz|~~~||{{|{{|}~{yyz{|}~~~}|{z|}~|{{|~~~}}}}}}}~~~}}~~|zz{}~{yxxy{}~~}|{{{|{{|~}zyyz{|}~~~~}{z{|~}{{|}~~}}}}}}~~~}}}~}{zz|~|zxxxz|~~~}|{{||||~~|zyz{|}~~~}|{z|}~|{|}~~}||}}}~~~~}}}}{zz{}}zyxxy{}~~}|{{{|||}|zzz{|}~~~~|{z{}~|{{}~}||}}~~~~~}}~~yussstvxz|{wtqonmnpty}~{ywxyyyxwxwvussrqqrtx{}|wspnnnprtwz|}ytpnnoqsssromkklmosuwxxyy{|{zxvtttuvwxwusrqonmmmnpqtw{}|zxwvtrqonoprtvxz{|~~zwusssuwxyyyyyzzzywuttvwyz{zyxxvuuttuvwy{~~}||}~}}}~}{yvtttuvvvvvuutttssrqqrsuwyz{{|}}|{zzz{|}}|{{{|}~~~~~}|{yxvttuvxyyxvtrpopqrtuuuvvvuvvvuutstvxy{||||}~}}}}~}{{zz{|}}~~|{{z{|}}}|{zzxwutsrqrsuwwvusqpopqsuvwwwxxxxxxwwvuvwy{|||||}~~~}|{zz{{|}}~~|{zyyz{|||zyyxwvusrqqrsuvwwvtrqpprtvwxyyyyyyyyyxwwwxy{|}}||}~~~|{zzz{{||}~~|{zyyyz{||{zyxxwutsrqrstvwxwvtrqqrtvxyzzzzzzzzzzyxwxy{|}~}}}}~~|{zzzz{{|}~~}|zyyyz{||{zyyxwvutsrrstuwxyxvtrqrsuxz{{{{{{{{{{zyyxyz|}~~}}}~~~~|{zzzz{{|}~~}{zyxyz{|||zyyxwvutssstuwxyyxvtsrsuwy{||||||||{{{zyyz{}~~}}}~~~~}{zzzz{{||}~~|zyyyz{|}||zyyxwvutsstuvxyzyxvtsstvy{|}}}}}||||{{zyz{|~~}}~~~~~|{zzz{{||}~}|zyyz{|}}|{zyyxwvutttuvxyzzywusstvx{|}~}}}}}|||{zzzz|}~~}}~~}~~|{zz{{{|}}~~|{zyz{}}~}|{zyyxvuutuuvxz{{zxvtttvx{|~~~~~}}}||{{zzz|}~~}}~~}~~|{{{{{||}}~~}{zz{|~~~~}{zzyxwvuuuvwxz{{zxvttuwy{}~~~~~}}}||{{zz{|}~~}}~~~}~~|{{{{||}}~~}{zz{}~~}|{zyxwvvuvwxy{{{zxvttuwz|~~~~}}||{{zz{|~~}}}~~~~|{{|}~~}|{{{|}}|{|}}~~}zxvuuvx{~~|zxwvvwxz}}|{{|}~~~}}|{zzyyyyz|~~}}}~}}|{{}}|{{z{{||{xvtstuxz|~~~~}}||{zyyxxyzz{zyxwwxy{|}~~~}|{zyxxy{}~|zyyyyyzz{|}}~~~}}}}zyyz|~~}|{{zyxxxyz{{{zyyyz|}}|{zyz{}~}|||}~}|{zzz|~}zxwvwwxyyz{|~~}~}}~}}}}~~}}}~}|{zz{|~}|{z{{|~~~~}{zzxxwwwy{}}zxwvwwxyz{|}~~~~}{zzz{}}|zzzz{|}~~}}}~~}|{zyxwwvwxy||zxwwxyz{|}~~~~~~}{zz{|~~}{zyyz{|}~~}||}~}|{zyyxwwwwxz}|zxxxyz{|}~~~~}~~|{zz{|~~|zyyyz{|}~~|||}~~}|{zyyxwwwxz|~|zxxyz{|}~~~~~}}~}{zzz|}~}{zyyyz|}~~}||}~~}|{zyxxwwxy{~}{yyyz{|}~~~~~}}}}{zzz{}~}{zyyyz{}~}||}~~}|{zzyxxxxy{~~{zyyz{|}~~~~}~}}}~}|zzz{}~}{zyyyz|}~~||}~~|{zzyxxxxz{~~|zyyz{|}~~~}}~}|}~}{zzz{}~}{zyyz{|}~~||}~~|{zzyxxxyz|~~{zyyz{|}~~~}}}~~||}~}{zzz|~~|{zyzz{}~}}}~}|{zzyyxyz{}}{zyz{|}~~}}}}~}||}~|{zz{}~~|{zyz{|}~}}}}|{zzyyyyz|~|zyyz{|}~~}}}}~~}||}~|zzz{}}|zzzz{|~}}~}|{zzyyyyz|~|{zzz{|~~}}}|}~~|||}~|zzz{}~}{zz{|}~}||{{|}~}|{|}~~||{{{|}~~|zyz{|~}}||}}~~}}}~}|zyyz|~~}|{z{|}~~}}|{{||~}|{||}~~}|{{{|}~}{zyz|~~}|||}~~~}}}~~}{zyz{}~|{{{{|~~}||{{|}}{{|}~~||{{{|}~~|zyz{|~~~}||}}~~}}}~~|{zyz|~}|{z{|}~~}}||{{|}~|{{|}~~}|{{{{|}}|zyz{}~}}||}~~}}}~}{zyy{|~~}{{{{|}~}}|{{|}~}|{||}~}|{{{|}~~}{zyz|~~}|||}~~}}}}~~|{zyz{}}|{z{{}~~}||{{|}~|{{|}~~}|{{{||~}{zyz{}~}|||}~~~}}}~~}{zyz{}~|{{{{|~~}||{{|}}{{|}~}|{{{{|}}|zyz{}~}}||}~~}}}~~}{zyz{}~|{{{{|~~}||{{|}}|{|}~~}|{{{{|~}{zyz{}~}|||}~~}}}~~}{zyz{}~|{{{{|~~}||{||~~|{{|}~~}|{{{|}~~}{yyz|~~}|||}~~}}}}~~|zzyz|~}|{z{|}~~}}|{{|}~}|{||}~}|{{{|}~~|zyz{}~~}}||}~~~}}}~}{zyy{|~~}{{z{|}~}||{{|}}|{|}~~||{{{|}~}|zyz{}~}|||}~~}}}~~}{zyz{|~~}{{{{|~~}||{{|}}|{|}~}||{{{|}~}|zyz{}~}|||}~~}}}~~}{zyy{|~~}{{{{|}~}||{{|}}|{|}~~}|{{{|}~~|zyy{|~~}}||}}~~}}}}~}|zyyz|~}|{z{|}~~}|{{|}~~||||}~~}|{{{|}~~}{yyz|~~}|||}~~}}}}~~|{zyz{}~|{{{{|~~}||{||}}|||}~~}|{{{|}~~|zyy{|~~}}||}}~~}}}}~}|zyyz{}}|{{{|}~~}||{||~~}|||}~}||{{{|}}{zyz{}~}|||}~~}}}}~}{zyyz|~~}|{{{|}~}|{{|}~||||}~}|{{{|}~~|zyyz|~~}|||}~~}}}}~~|zzyz{}~|{{{{}~~}||{||~~}|||}~~}||{{{|}~}{zyz{}~}|||}~~}|}~~|{zyz{}~~}{{{{|~~}||{||~}|||}~}||{{{|}~}{zyz{}~}|||}~~}|}}~|{zyz{|~~}{{{{|~~}||{||~}|||}~}||{{{|}}{zyz{}~}|||}~~}}}~~|{zyz{}~~}{{{{|~~}||{||~~}|||}~~}|{{{|}~~|{yyz|}~}}|||}~~}}|}~}|zyyz{}}|{{{|}~~}||||}~|||}~~}|{{{|}~}|zyy{|~~}|||}~~}|}}~~}{zyyz|~~}|{{{|}~}||||}}|||}~~}|{{{|}~}{zyy{}~}|||}~~}|}}~~|{zyy{|~~}|{{{|}~}||||}}|||}~~}|{{{|}~}{zyy{}~~}|||}~~}|}}~~}{zyyz|~~}|{{{|}~}||||}}|||}~~}|{{{|}~}|zyyz|~~}|||}~~}}|}~~}{zyyz|}}|{{{|}~~}||||}~~}||}}~}||{{|}~~|{yyz{}~}}|||}~~}}|}}~|{yyz{}~~}|{{{|~~}||||~}|||}~~}|{{{|}~}|zyyz|~~}|||}~~~}}|}~}{zyyz{}~|{{{|}~~}}|||}~}|||}~}||{{||}~~}{zyy{}~~}|||}~~}||}~~}~{vrommnquz~{wtqoooprtw{~~|ywuttttttutrqonoprtwy|~~zwusssstuwy|~}zwusrrrsstuvwwwwvutuvwyz{{zzxvutsrqpqrsuvxxwurponoprtvxz|~|{{zywurqoooprtvxy{}~~{yxxyzzzzzxwvutsrrrstvx{|~}|zxvvvwxz{}}||}~}{yxvtsrrrrrsrrqpppqsuwy{|}~~}}|||}~}{{|}~~}{{zzzz{||||zxvttstvwyyyyyxwutsrqpppqrssssrrrstvxz{}~~~}}}~~~~|{yxwvvvwxxyyxvtrqpqrtuvwxwwvutsrrqqqrstuuuutttuvxz{}~~~}|||~~~|zywvuuuuvwwxwvtrqppqrtvwxxxwwvutsrrrrstuvwvvuuuvxy{}~~}|{{|}~~}{zxwvuuuuvwwwwvtrqppqsuvwxxxxwvuutsssstuwwxwwvvvwyz|}~|{{{{}~~}|zxwvuuuuvwwxwvtsqpqrsuwxyyyxxwvuuttttuvxxyxwwwwxy{|~~|{zz{|~~~|zxwvuuuuvwxxxwusrqqrsuwyyzzyyxwvvuuuuvwxyyyxxwxxy{|~~}|{z{|~~~}{yxwvuuvvwxxxxvusrqrsuwyzzzzzyxwwvuuuvwxyzzyxxxxyz|}}|{zz{}~~~|zyxwvvvvwxxyxwvtsrrsuvxzz{{zzyxxwvvvvwxyzzzyyxxyz{}~~}|{z{|}~~~|zywwvvvwxxyyyxvtsrstuwyz{|{{zzyxwwvvwxyz{{zzyyyz{|~~}|{z{|~~~}{zxwwvvwxxyzyywvtsstuwyz{|||{zzyxwwwwxyz{{{zzyyyz|}~|{zz{}~~~|zyxwwwwxxyzzyxvutstuwyz{||||{zyxxwwwxyz{{{{zyyyz{}~~|{zz{|~~}}}~|yvuuvxz|~|zxvtsstvy|~}|||}~~}|{zyyyz{|~|{zz{}~~}}}|{ywusssuvxz|}}}}||{zyxxxyyz{{{zyxwwwxyz{|||||{zxwvvvwy{}~}|{||}}}~~~~}}|{{{}~|{zz{}~~}|{zyxxxxyz{{{zyxxxyz{}~~}|{yxxxyz|~~}}||}~~}|}}}{yxxxyz{|}~~~~~}||}~~~~}}}~~}|||}~~|{yyyz|}~}|{{{|}~}|{zyyyz|~}{yxwwxyz|}~~}}~~~~~~}{zyz{|~~}|{{{{}~~}}~~}|zyyxxyz{}}{yxxxyz{|~~~~~~~~~}~}|{zz{|~~}|{zz{|}~~}}}~~}|zyyxxyz{}~|zyxxyz|}~~~~~~}~~~}}~~|{zz{|~}|{zz{|}~~}}}~}|{zyxxyy{}}{yyyyz|}~~~~~}}~~~}}}}|zzz{}~~}{{zz{|}~}}}~~}|zzyxyyz|~~|{yyyz{}~~}}}~~}||~~|{zzz|}}|{zzz{|~~}}}~~}{zzyyyz{}~|{zzz{|}~~}}}~~|||~~|{zz{|~~}|{zz{|}~~}}}~~}{zzyyz{|~~|zzz{|}~~}}}}~~}||}~~~|{zzz{}~~|{zzz{|}~}}}~}|{zzyzz|}}{zz{{}~~~}}}~~}|||~~~}{zzz{|~~}{{zz{|}~}}~~}{{zzzz|}}|zz{{}~~~}}}}~}|{|}~~~~}{zzz{|~~}|{z{{|}~}}~~}|{zzz{|~}|{z{|}~~}}}}}~~}|{|}~~~~~~~}{zzz{|~~}|{z{{|~~}~~}|{zzz{|~}|{{{|}~~}}}}~~~|{{|}~~~~~~~|zzyz{}~~}|{{|}~~}}|}~}}}}~~}||||}}~~}{zyyz|~~}||||}~~}|||}~~|{zyyz|}}||{{|}~~}}}}~~}|}}~~}||||}~~|{zyy{|~~}}||||}~~}|||}~~|{yyyz|~~}||{{|}~~}}}}~}}}~~}||||}~~|{zyy{|~~~}||||}~~}|||}~~|{zyyz|}~||{{|}~~}}}}~~}}}}~~}||||}~~~}{zyyz|~~}||||}~~}|||}~~}{zyyz{}~~}|{{|}~~}}}}~~}}}~~}|||||}~}|zyyz{}~}|||||}~~}||||}~}|zyyz{|~~}||{||}~}}}}~}}}~~}||||}~~~}{zyyz|~~}||||}~~}|||}~~}{zyyz{}~~}|{{|}~~~}}}~~}}}~}|||||}~~|{zyy{|~~}|||||}~~}|||}~~|{zyyz|}~}|{{|}~~}}}}~}}}}~~}||||}}~~}|zyyz{}~}||||}~~}||||}}{zyyz{}~~}|{{||~~}}}~~}}}~~}|||||}~~|{yyz{}~~}||{||}~~}||||}~}|zyyy{|~~}||{||}~}}}~~}}}~}|||||}~~|{zyy{|~~}||{||}~~||||}~~|zyyyz|~~}||{{|}~~}}}~~}}}~}|||||}~~|{yyz{|~~}||{||}~~}||||}~}|zyyz{|~~}||{||}~}}}~~}}}~~}|||||}~}|zyyz{}~}|{{|}~~}||||}~~}{zyyz{}~~}|{{|}~~}}}}~~}}}~~}||||}~~}{zyyz|~~}||{||}~~}|||}~~|{zyyz|}~}|{{|}~~}}}}}}}~~}||||}~~|{zyyz|~~}||{||}~~}|||}~~|{yyyz|~~}|{{|}~~}}}~~}}}~}}||||}~~|{zyyz|~~}||{||}~~}|||}~~|{zyyz|}~}|{{|}~~}}}}}}}~~}||||}~~}{zyyz|~~}||{{|}~~}||||}~|{zyyz{}~~}||{|}~~~}}}~~}}}~~}||||}}~}|zyyz{}~}|{{||}~~}||||}~}|zyyz{|~~}||{||}~}}}~~}}}~~}||||}~~}{zyyz|}~}||{{|}~~}||||}~~}{zyyz{}~~}||{||~~}}}~~}}}~}|||||}~~|{zyy{|~~}||{{|}~~}|{||~~|{zyyz|}~}||{|}~~~}}}~~}}~~~}||||}~~~}{zyyz{}}}|{{|}~~}||||}~~}{zyyz{}~~}||{||}~}}}~~}}}~~}|||||}~}|zyyz{|~~}|{{||}~~}||{|}~}|zyyz{|~~}|{||}~~}}}~~}}}~}|||||}~~|{zyy{|~~}|{{||}~}||{|}~}|zyyy{|~~}|{||}~~}}}~~}}}~}|||||}~~|{zyz{|~~}|{{||}~~}||{|}~}|zyyz{|~~}|{||}~}}}~~}}}~~}||||}}~~}|zyyz{}~}||{{|}~~}|{{|}~~}{zyyz{}~~}||{|}~~~}}}~~}}~~}||||}~~}{zyyz|~~}|{{{|}~~}|{||}~|{zyyz|}~}||||}~~}}}~~}}~~}||||}~~|{zyyz|~~}|{{{|}~}||{||}}|{yyyz|~~}||||}~~}}}~~}}~}}||||}~~|{zyyz|~~}|{{{|}~~||{||}~|{zyyz|}~}||||}~~~}}~~}}~~}||||}~~}{zyyz|}~}|{{{|}~~}|{{|}~~|{zyyz{}~~}||||}~~}}~~~}}~~~}||||}}~~}|zzyz{}~~}||{||}~~}|||}xtponnpswz{xvsrrstvxz{|~}|||}||zxwvtsrqrrstuwyz{||~zvsponopqsux{}|xtrpoooopppooooppqsuwyy{||}{zyxwvuvvvwvuusrqqpppqrtwy{}~}|zxvtrponnopqsuwyz|}~|{zxwwvwwxyyz{{{zzyxwvvwxxyyzzyyxxxxxxyz|~~~~}}|zywutsssstttttssrrqqqqrstvwyz{|}~~~~~~|{yxwwvvvuuuutsrqpoopqrssttttttttttuvwxyz{|}}~~~~~~~~~}}|||}}~}}|{zywvuttssssssssrqppppqrstuuvvvvvvvvvwwxyz{||}}~~~~~}~~~~~~~~~}||{{{{{|||{{zyxwvutssssssssssrrqqrrstuvwwwxxxxxxxxxyz{{||}}}~~~}}}~~~~~}}}|{{{{{{|||{{zyxwvuttttttttttssrrrsstuvwxxxxxxxxxyyyzz{|||}}}~~~~~~~~~~~}}|||{{{{|||{{zyyxwvuuttttttttttsssstuuvwxxyyyyyyyyyyzz{{||}}}}~~~~~~~~~~~}}|||{{{{|||{{zzyxwvvuuuuuuuuuuutttuuvwwxyyyzzzzzzzzzz{{{||}}}~~~~~~~~~~~~}}}||||||||||{{zyyxwwvvvvvvvvvvuuuuuvvwxxyyzzzzzzzzzzz{{|||}}}~~~~~~~~~~~~}}}||||||||||{{zyyxwwvvvvvvvvvvvvvvvwwxyyzzzzz{{zzz{{{{|||}}}~~~~~~~~~~~~~}}}}||||}}|||{{zyyxxwwwwwwwwwwvvvvwwxxyyzz{{{{{{{{{{{{|||}}}~~~~~~~~~~~~~~}}}}}}}}}}}||{{zzyxxxwwwwwwwwwwwwwwxxyyzz{{{{{{{{{{{||||}}}~~~~~~~~~~~~~~~}}}}}}}}}}|||{zzyyxxxxxxxxxxwwwwxxxyzz{{{{||||||||||||}}}~~~~~~~~~~~}}}}}}}}~~~}{yxwwxy{}~}||{{{||}~}||{{{{{{|||}}}}~~}{zyxwwwwxz{}~}|{zyyxxxxxxyyyzzzzzzzzzyyyzyyzzzyyyyyyyyzz{{{||||}}}}~~~}|{zyyxxxxxxxyyz{|}~~~~}}}||{{zzzyyyyyyyyyyzzzz{{|}}~~~~~}||{zzyyyxxxxyyyyzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||{{{zzyyyyyyzzzzz{{{||}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzzzzzz{{{{{|||}}~~~~}}}}|||||}}}}}}}}}}}}}}}}}}}|||{{{{{{{{{{{{{||||}}~~~~~~}}}}|||||}}}}}}}}}}}}}}}}}}}}||||{{{{{{{{||||||}}}~~~~~~}}}}}|||}}}}}}}}}}}}}~~~~~}}}}}|||||{{|||||||||}}}~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}|||||||||||||}}}}~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}||||||||||}}}}}}~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}||||||}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~yuqpopsvz}|zwtrqqqrsux{~|{yyxwvuuuuuutuvvvvvxzz|}|yvsrppqrtwz}}{xvtsrqpppppqqrssttuvvvwwwxwwwwvvuuttssrrrqqqqrrsstuwxy{|~~}{zxvutsrqqqrrsuvxz{~~}|{zzyxxxwwwwwvvvvvvvvvvvwwwwwxxxxyyzzz{||}}~~}|{zzyxwvuutsssrrrrrssstuvwxyz{}~~~~~}}|||{{zzyxxwwvvuutttssssssssssstttuvvwxxyz{{|}~~~~}}}}}||||{{{{zzzyyyxxxwwwvvuuuttttttsssstttttuuuvvwwxxyyzz{||}}~~~}}}||||{{{zzzzyyyyxxxxwwwvvvvvuuuuuutttttuuuuuvvvvwwxxxyyzz{{||}}~~~~~}}|||{{{{zzzzyyyyxxxxxwwwwwvvvvvuuuuuuuuuvvvvvwwwwxxyyyzz{{{||}}}~~~~~}}}|||{{{zzzzyyyyyxxxxxwwwwwwvvvvvvvvvvvvvvwwwwxxxyyyzzz{{{|||}}~~~~~~}}}|||{{{zzzzzyyyyyxxxxxxwwwwwwwwwwwwwwwwwwxxxxyyyyzzz{{{||||}}}~~~~~~}}}|||{{{{{zzzzzyyyyyyyxxxxxxxwwwwwwwwwxxxxxxxyyyyzzz{{{{|||}}}}~~~~~~}}}||||{{{{{zzzzzzyyyyyyyxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}}~~~~~~~}}}}|||||{{{{{zzzzzzzyyyyyyyyyyxxxxxxxyyyyyyyzzzzz{{{{||||}}}}~~~~~~~}}}}|||||{{{{{{{zzzzzzzzyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}}}~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzyyyyyyyyyyyzzzz{{||}}}~~~~}{zyyz{}~~|{zyyxyyz{|}~}|||{{{z{{{zzz{{{{{|}}}~~}{{zzzz{|}~~}|{{zzzzzzzzzzz{{{|||||||||||||{{{{{zzzzzyyyyyzzzz{{||}~~~}}|{{{zzzzzz{{||}~~~}}}}|||||||||||||||||||||||||||}}}}}}~~~~~~~}}}|||{{{zzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzz{{{{|||}}}~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{zzzzzzzzzz{{{{{{||||}}}}~~~~~~~~~~~}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~}}}}}}||||||||||||{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~~}}}}}}}|||||||||||||||{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~yuqppqsv{~|yvtrqppqsux{~~|zyxxvvuuuutttuvvvvwyz{}~|yvsrqqqsux{~}{xvtsrqqppqqqrssstuuvvvvwwwvvvvvutttssrrrqqqqqrrrstuvwyz|}}{zxvutsrrqrrstuwxz|~~}}|{zyyxxwwvvvvvuuvvvvuvvvvvvwwwxxxyyzz{{||}}~~~||{zyxwwvuttsssrrrrssttuvwxy{|}~~~~~}}}}|||{{zzyyyxxwwvvuuutttsssssssstttuuvvwxyyz{|}~~~~~~}}}}||||{{{zzzyyyyxxxwwwvvvvuuuutttttttttttuuuuvvvwwxxyzz{{|}}~~~~~}}}|||{{{zzzzyyyxxxxwwwwvvvvvvuuuuuuuuuuuuuuvvvvvwwwxxyyzz{{||}}~~~~~}}}|||{{{zzzyyyyxxxxxwwwwwvvvvvvvvvvvvvvvvvvvwwwwwxxxyyzzz{{||}}}~~~~~}}}|||{{{zzzzyyyyxxxxxwwwwwwwvvvvvvvvvvwwwwwwwxxxxyyyzzz{{{|||}}~~~~~~}}}|||{{{zzzzyyyyxxxxxxwwwwwwwwwwwwwwwwwxxxxxxxyyyyzzzz{{{|||}}}~~~~~~~}}}|||{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzyyyyyyyyxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}}|||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}}~~~~~~~}}}|||||{{{{{zzzzzzzzzyyyyyyyyyyyyyyyyzzzzzzzz{{{{{||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~|zyyyz{}~~}|{zyyyyz{|}~~}}|||{{{{{{{{{{{{||}}~~~}|{zyyyz{|}~}|{{zzyyyyyzzzzz{{{|{{|||||||{{{{{{zzzzzzyyyyzzzz{{{||}~~~}}|{{zzzzzzzz{||}~~~~}}}}||||||{{{{{{{{{{{{{||||||||}}}}}~~~~~~~}}}|||{{{zzzzzzzzz{{{{||}}~~~~~~~~~}}}}}|||||{{{{{{{{zzzzzzz{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~~}}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||{{{{{{{{{{{{{||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}wsqpprtx}~{xusqppprtvy|}{yxxwvuttuttttuuvvwwy{|}~~zwusqqqrtvy|}zxvtsrqqqqqqrrssttuvvvvwwwwvvvvvuttsssrrqqqqqqrrstuuwxy{|~~}{yxvutsrrrrrstvwy{}~}||{zyyxxwwvvvvvuuvuuuuvvvvvvwwwxxxyyzz{{|}}~~~}|{{zyxwvvuttsssrrrssstuvwxyz{}~~~~~}}}}|||{{{zzyyxxwwvvvuuuttttsssssstttuuvvwwxyz{||}~~~~~~}}}}||||{{{zzzzyyyxxxwwwvvvvuuuuutttttttttuuuuuvvvwwxxyyzz{||}~~~~~}}}|||{{{{zzzyyyxxxxwwwwvvvvvuuuuuuuuuuuuuuuvvvvvwwwxxyyyzz{{||}}~~~~}}}|||{{{zzzyyyyyxxxxwwwwwvvvvvvvvvvvvvvvvvvvwwwwwxxxyyyzz{{{||}}~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwwwvvvvvvvvvvvwwwwwwxxxxyyyyzzz{{|||}}}~~~~~}}}|||{{{{zzzyyyyxxxxxxwwwwwwwwwwwwwwwwwwxxxxxxyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzyyyyyxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzzz{{{||||}}}~~~~~~}}}}|||{{{{zzzzzyyyyyyyxxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{{zzzzzzzzyyyyyyyyyyyyyyyyyzzzzzzzz{{{{{|||||}}}}~~~~~~~~~}}}}|||||{{{{{{zzzzzzzzzzzzzyyzzzzzzzzzzzzz{{{{{{|||||}}}}~~~~}{yyyyz{}~}|zzyyyyz{|}~}}|||{{{{{{{{{{{{||}}~~~}{zzyyyz{|}~}|{zzzyyyyyzzzzz{{{{{{|||||||{{{{{zzzzzzyyyyyzzzz{{||}}~~~}}|{{zzzzzzz{{||}~~~~}}}}||||||{{{{{{{{{{{{|||||||||}}}}}~~~~~~~}}}|||{{{zzzzzzzzz{{{|||}}~~~~~~~}}}}}}|||||{{{{{{{{zzzzzzz{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~~}}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~}}}}}}}}}||||||||||||{{{{{{{{{{{{|||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m28.bin b/applications/SprPoP/dist/MUS/m28.bin deleted file mode 100644 index 6b1396f..0000000 --- a/applications/SprPoP/dist/MUS/m28.bin +++ /dev/null @@ -1 +0,0 @@ -}{{zyzz{||~~~~~zxwvvwxxyyyxxwvusssssuwy|~z|~|{{{||~~|zxwvuuvvwxyzzxtolrzzursuy|}||||}~yz{{}~~}{zxwvvwxyz{{zzyyxxxwwwvvvvvwz~~|{zzyxxxwxz}}xsru}{snkjjkklmmmmmot{~|zxwxz~{z~{vqnrz}{yxxwuurprxzxvvwxy{|~~}{xvw~|{zyz{~~}{z~ztmptru{|zxurokq}~{xvutuwy{}}z~{zzz{{||||}~}|toy|xxz~}|{|}|w|}|}~}zvqw}yvsrqpoooqtx}~}}}}~||}z{{vpjhw}xsomlklmopqrssuvxxtx~{yyyzzzz{{||}~~|||~wov~wsqruz~|xusrsrnltspppqrstwy{}}wt~zyxxyz{|||{|}}x{~~~~ztwwpmmosy{ums}vrpopqsvxz|}~}|yy~zwuuuvwxyyyz|~~z}ywyrmmotzz~|}}~~}xsnw~yusqpppppponoquyy{}z}|{{|woo~~xsokihijkmnopqrtuspv|wwwxyyyz{|~~~~~}|{xu~~~yt|tniggkpv||yssyuqqqrrrstvy{}~}xrr{xwvwxy{|}}}}||}zu|~|zzz{}~{w}|urqonnpty}u}ytqppqrtvxz{|}~}~{vqlo~{xwvwwxyyyz{{zw{}z|~wrnllmqv}~zuolw|xurpoopqqqqpppppmoz}|{x~}||~z{~xsoljjjklmnooprrqnuzuuvwwxxz{}~|wrmtzv{tnifdehlqw|~}~yxwvvuuvxz|}~~{wqqzwvuvwy{|~~~~~|yyt{}zyxxy{|}~~|yzxvusqppruy~}xvuuuwxz{||}~|}}wqjiz}|{{zz{{{{zzz{|{wz}}~{|}xtrpppqtw{~zuokt|wtqpoopqrrrrrrrrnltwtvy}|x~~~|wsqpoopppppqrsrnszwuvvwxyz|~{unq|yxz|{v{upmjihijknqv|~}}}~}ysp||xvvvxz|~{}|vx~{yyyz{||}}}~~z|{zxwvvvvwxz|~~~}ztnkv}ywuuwy{}~~~~z{~~~}|}zxvvvvvvwwy{|wqlr~yusqqqrsssssstuuqouxsrsuwz~z~~~}|{zxvz~{yxwvvutttuutpt{xvvvwxy{|~}wqr|wttux{zv}yurpnmlkjjjlosww{ztq}|xvvvwy{}}~x{~{yxxyz{{{||}~}z}||{{zzzzzzyyyyyxvt~~zuomy}wspoopsvy|~|~~~{|}{zyyyyyyxxwwxz}}~ysov}xurqpqqrsstttuuuqpwxsrrsstvy}}~}~~{wtpljp~}|{zyyyxurw{wvvvwwxy{}~{vqv{vsrqrtwz~}xw~zvtrqponmllklllkoy|||vv|xvvvwxz{}~|~{{yxwxxyz{{{|||yx}|||||{{|||||{ywtplju}ytop}}xtpnllmoqtwy|~}~y}}{zzzzz{{{zyyxxwuu}}wt|zvtrqqqrsstttuutqqxxtsststtuwz}}ytojfjz~~~~~}zw{zxxyyyyz{}~~{vrw|xtsrrstvx{}|xw~zwutsrrrqponnmkhjrrrtx||{{yxxxy{|~}|z~|zyyzz{{{||||zx~}||}}}}}~~~|zvrliq{{xwwy|~yupq}{wspnmmnopqsuwz|}{~z|~|{{{|}~~~}}|{{zwty~||~~z{xvuttuuuuuvvwvssy{wvvvvvvwxz{}~|||xsmhiu~|yvuuvxz}~~}}}}~}xsv{xvuuuvxyz{|~}xv|ywvvuuutsrrqqokkqrooqsvy}}}}}~|zwty~}}}}}|||}~~{y~}}}}~~~{wqkp{|wsrrtw{|wrp{~yvsqpppppppqsuwxvz{{}||}~~{w{}{{|}}{yxxxxwwwwxxxutz}zxxxxxyz{|}}~~~~}zwu{vpjjv}ytqonoqtwz~zuw~zxwwwxz{{||}}}xv~}zxwwwwvvuttttrnmsspnnopruy}~|xuqns~~~~~~{y~}}}}~~}xrnr}}xspooprvz~}wsr}{wtsqqqqqqqqqrsrpt|}|}z{}|||}~|y}~{zz{{}~}{{{zzzyyyyxut{}yxxxxyyz{}~~~}|yvqp{~{vpkn{~ytpljijkmpsvy|~yuz}zxwwwxyz{||}}}~}{{}ww|ywuuuuuuutttsqmoutpnnnnoprux{{wrmkr~|{zz{{|}~~~~~~}zy~||||}}~|wqov~xsommmnprux{~}xsu{wtrqqqqqqqqqqpnlqxvuvxz}z~|{{{|}|z~|{{zzz{|}~~|z{~~~}}|||{yvw}~zyyyyyz{|}~~{xtooy|yxyz|~{vqmq~{vqmkihhijlnpsvxzz{{x}{yxxxyz|}}~~~~~}zz~zz}zxwvvvvvvvvvusoqwurppppppqsuwy{|}~}{y}|xsnkr~zxwvvwyz|}~|{~~~~~~}ysqx{vrponopqsuwxz}|wx~{xvutttttttsssqnqwvttuwxz}}}}}~~|~}}||||}}}||zywuss}~{z~}||||}~~{wrpx|ywvwx{~}ytoq}~yuqnlkkkkklmnprttu{|~|||}~}||{~|zzyyyyxxxxxwssyzvtssssstuvwxyyyyxvsu~{vrnq}{xvuuuwxz{}~~|wsxzwtsrsstuvvwxy{}~}}{}{zyyyxxwwwwwursyyvuuvwxz}~~~~~~}{zxuspmmt~zurx~zxvvwy{}zvrr}|xurponnmmmmmnoppot{}}~}|{}}||{{zzzzzxuuz{ywvuuuvvwwxxxxwvtqnoy|xtps{xutssstvwxz{}~}}xuy|xvuttuuvvvwwwxyywy}|{{{zzyyyyxvsuzzwvvvvwxz|~}~~~}{ywtqmjip}~~~~zvu|~zwvuuvwy{}{vsv}yvsqponnnmmmmmmkkouutvx{}~|ywy~}||||{{{zywuv{{xwvvvvvvwxxxxwvtqmjmv}|zxxy{}}xtrx|xusrqqqrstuvxyyxy|xv}|xvuttuuvvwwwwwvusv|}||~~}|||{{{zzxvtw|zwvvvvwwxy{|}~~}|yx}~}{yvsokhhp{|zxvvvwxz}{ww{xvuuvwxyz|}~{wtx~zwtrqpoonnnmmmliimrqoprtvy|~|zwtru~}}}}}}|||{yvx}}yxxwwwxxyyzzzywurmjlu{zvtsstvy|{wuz~zwusrrrrrsstuuutu|~~yx~~{ywwvwwxxyyyyxxvtu{|zyz{}~~~}}|ywy~}zyyyyyyz{|}}~~}{yvtx~{xuqlignz~|yvtrrrsuwy{}zy|zyxyyz{||}~~~yvx~{xvttsrrqqpppoljmrrpopqsuwz}|zwsppy}zz~|{{{{{||}}}}|{xuqllt|{xtrrrsux{~zwz|ywvvuuutttuuussx}}}}~}z~|{zz{{||||||||zww|~|{z{{|~}~{|}||||}~~|zvrt~~{xtokhmy}zvsqpppqrtvwy|~~|~||||}~~~}{xy~{yxwvuttssrrqolnssqpppqstwy{~~}zvroov~~~||~}}}}~~|zwrnmu||yusqqqrtvy{}}z}|zyxxwwvvuvuurqv{{zz{|~~|}|||}}~~~~~~}{xx}}{zzzz{|}~~}|zxwz~~~~~|yuqt}}|||}|xupljp{}zvsponmnnoqrtuwyyy{~}}~~}{~{y||zywwvvuuttsqomptspooopqrsuwxz{||{zxx~}yvropy}{yyyyz{|}~~}{}~~~~~~~|zvropx~|xtqpoopqrtvwy{}~}}{zyxxwwvvvusqqvyxvvwxy{}}}}}}}}~~~~~~~|zxz~|zyyyyyyyzzzyxwusqqv~{xtrv~|zxxxyz|~|yuqnnu~~zvspnmlllmmnopqrrru|}{~}{z~~|{zyxxwwvutsposvtrppppqqrstuvwwvusrry~{wsqrz|yxwvvwxyz{|}~~}{~~{xtqsz}yvsqpppqrstuvwxzzzz~}|{{zzyxxvtswzxwvvwxy{|~}}}{{~|{zzzyyyyyxwutrommq{~{wtw~{yxwxy{|~|xtqpv}yvsqonnmmmnnoopooqw{{{|~~|zy|~}||{zzyxwusuyxvttsssttuvwwwwvtroos}{wttz~{yxwwwxxyz{|}}}|}}yuu{}zwutssttuuvvwxxyxw{~~}|{xwz}|zyyyyz{|~~|{~~~}}|||{{zyxvtqomklt~{xy~|zyzz{|~|xtsv}zwusrqpppooopponnswxxyz|~~|zxvy~~}}|{xvx{|yxwvvvvwwxxxxwvtqnlpx~}|{|}~zwv{}{yxwwwwxxyyz{zy{{ww}}zxvvuvvvwwwwxxxvux}~}{y|~|{zzz{{|}~}{yx}~~}}|{zxvtqnkijr|}{zzzz{}~}z{}{zzz{{|}~}yvuz{xvtsrqppoooonmklqttssuvxz}~|{xvtsx~~}{yxz~}zyxwwwwwxxxxwvtrolkox|zxvuuvxz|{xy~{yxwvvvvvvvwvuux}~~~{xz~{xwvvvvvwwwwwwvtsw{{zzz{|}~~{{}{{{{{{||}}}}|{ywuu|~~}|{zxvsplihkt|}{ywutttuvwyz|~~|}{zzzz{{|}}~~~}}~}yww~}zwutsrqqpponmljkprqppprsuwy{~}{yvsqqv~~~~~~~~~~}|zy|~|zyyyyyyyyyyxwurolkpx{yvtrqrsuwy{~}{|}{yxwvvvvuuutsru{|{{{|}|z|}{yxxxxxyyyyxxwutw{{yxxyyz{|}~~|{z{~~~~}}}}~~~~}{yvstz~}~}|zwtqnjilt|}|yvtsrqrrsuvwyz{|||~}}}}~~~~~||~{yy~{yxwvutssrqpnlmqsrqppqrsuwxz|}~~}|{}}zwtqpt}~~~~}|~~~}}}}}}~}}|zxvrnmpx|{xusrrstuwy{|~~~~}|{zzyyxxwvtuz||{{|}~|}~}}}}}}}}||{zxvx|}{zyyyzz{{||||{zywvv|~{xutx~~~~{yurnkls{~}{xvtrrrrrstuvwyyyy|~}}zz~~|{zyxwwvutrporuusrrrrstvwxz{{{{zxwx}zvsqs{~}}}}~~~}~|yuroqx}|zwusssstuwxy{|~~}||{zyxvvz||{{{|}~}~~~|zxz}~|{zyyyyyyyyyxwvtsrrw}yvuy~}||}~}zwtpnou}~{yvtrqqqqqqrsstuttx}~~}{zz~}||{zyxwvtrruwvtsrrrsstuvwwwwvusrt{~{wusv~}{zzzz{{||}~~}||~|zvsru{~}zwtsrqrrstuvwxyyyy{~}}|{ywvw{|{yyyyz{|}~~|{~~}{z|~|zyyxxwwwwvutsqpnmou~}zww||{zyyz{}~~{xurqsz|yvtrpoooooooopoopsxzzz{}~}|zyxz~~}||{zywuttwxwusssrssstttttsrqonqx~~~~|ywvz~|{yyxxyyyzz{{{z{~~{xuux~~{xvtsrrrssttuuvvuuw{~~}|zxz}}|zyyyyz{|}}~~~}{zy|}|~~|{zyyxxwvvusrpnlklrz~~~~~|zz~~|zzzz{|}~~{xutv|~{yvtsrqpppoooonmnquwvwwyz|~~}|zxvvw}~~}|{ywwz|zxwvvuuuvvvvvutrpnmnt{~}|{z{|}}zx{}{zyyyyyyzzzzyy||ywz|zxvvuuuvvvvwwvvuuy}}}}~~||~}||||}~~~}{yxy~~}||{zywvtqoljjnv}~}|{||}~~|~}}}}}~~{xvw|}{ywvutssrrqqpomosvvuvwxz{}}|zxvtty}{z}~}{zzyyyyyyyxwvtrommrx||{yyyyz|~}{|~}|{{zzzzzzyxxz{z|~|zyyyxxxxxxxxvuux{||{{|}~~}~|zxvw}~}|{ywuroljimu{~}|zyxxxyz{|}~~~~~~|yxy~{zxwvutssrqpnmorttsstuvwy{}~~}{yvtrsx}{|~}|{{{{{{{zzxwtrolmry{zxvuuuvwyz|~}~}|{zzzyyxwvvy}~}}}}~~|{~}{zzzzyyyyyxwvttx{zyxxxxyyz{{|||{zyxy|~}|zwutw}~~}|{ywuroljkow|}{ywvtttttuvwxyzz{{}{vy|{}}zwuuuvwy{}~~|wqoqnjhgfdddfhknqtvxyzyvu~}zvxzx~~|~}~{ywvtpnlllnpsuwyzzwpfj{}yz|}~|y~{}~xzskdgnkknoonlmnpsuwyz{}~~zy}w{}vtrnkmrwxvtttuvwxxwsu~}wohes~{{{|~}xw~{y{||{zz{|}}}|zxwusomvzx{~~}zwtrqpqu{~wz{{~||sommov~{vrpmkgnyyz||{yxwwxy{{|||}}|wu}|xzzzyyxxxyxwtqmifeehz}~zwtssuz~~~~}|zwuqlhdaiy{zzxvsponnnooooopqqnkssoqsw{{{tmifk{wtrpnlkjijjhcgmjiklmnoprtwxyzzzyvrko~||||}}~~xs}~xtyvqpqtx~~yridnwrnkjklmoqstuvwwy{||y|{vqw~~}|||}}{w|~}~}{zyxy{~~}{zzyzz{{zywtqmicao~|ywvvvwyz|}~~~{{{{|~~wu}}~~xqkfcl|wtqomkjhgggiigelpnnpstvy{~~y|wv~|xqptnjijmrw}~{vogguytqopqsvy|~ysnkw~|zzzzzzyyz{|}zyz{wusqppprux}}ytor~|{{{||}}|{{{{zxsvytrstvy}{uz~ytojeabt}{yxwwvuuuuvvrt|zxyz{|}~|uu}yxwwwxyz|~~xt{}|{{{{{{zywvusnjooiijmqv|yt}~zyyyz|~{wrnjn}|||||{{{{{{yvz|{|}}~~{uy{wusrrrsvy}|xsmkw|xvtrrrstuuuuuuutppwuqrsux{}wu~|zz{|~~yupljt~|{ywvuutpntwsrstuuvwxz|}~}ytpy~zxwwwwxz{~~zupq}{zz{|}~~~}||zwrtytqrtwz}uv}xutstuvxz{|}~~~|zvpkjv|zwvvuuuuuuuuurrz{wxz{|}|}{yxxxy{~~{wrmhm~}ywtsrrstuvvvvvvtqnsvqopqsux{|vpv~zyyy{}~ytnjk|~|{yxwutssrplnvtqrstuvwxz|~}xrrzvtsssstvxz|zv~~}{ytpuvpnoqsw{yt{|xuttuwxz|~~~|xtojfhy}{yxxxyyyzz{||{x||}zwusrssux{|xsmjs|xurqpppqrrrqqqqpljqrmmnorux}|x|xsnjfk~~}|zyxwwvtosyvssttuvwxz|}~~~}|ysnq{vsrqqrtvxz}{x}||||{zyxwvusnlrrmmnqtx}|w~ywuuvxy{|}}}~~{~{wsnjp~{|uzzusrqrsuxz~~zuoigt~yurpoopqrsssstuutpqyxutvxz~~||wsojgp~|{ywvvuuqntxtrrrstuwy{}~{vqz{yxxxz|~{uu}{zzzzzzyxwvvurmntqnnpruy~xx|wutuvxz{}~~~zuqny~~}||}}}zy~~~yu}xtrqpqsuwy|~zvqlo}zwvvvwxxyyyyyyyvrw{xuvwx{~y~}}~~zwrnjfgv~}|{zyyyxwst|zwwxxyz|~|vw{ywwwxz|}}xt{~{yxxwwwvutsrqokhnplkkmptx|~z|zz{|~}ytolo}}||}|||||||zw|}}}~~}wru{uqnmlmnprux{}xrq||ywuttuuvvvvuuusopvurrstvx{{{}}}~}zwtplhfo~~|yw}{zzzz{{|}{urz}yvtsstuwy{~}xst|yvtssssssrqqpolhkqnlmoqtx|~}||}~|yuqmmw~}}|||||{{{{yvv}~zyz{{{|}~}ysr{yurpooprtvz}~ztqt}ywusssstttttttspnswtrrsuwy|}y~|{z{{}~~|yurnkm{~}{wx~}zyyyyzz{}~|xst{xutttuvxz|~~zury|zxvvvvvvvuttsqnlrtqpqrux{}|||}~~{wsoln|}|{{{{{{{zzzzxvy}{{||}~zuwzvsrqqrtvy{~~ytry}ywutttuuuuutttsootvrqrsuwy||z~}}~~{xtqmko~|y|~|{{{{|}~|wsv~zvtssstvxz{}}xv~|zyxxxwvvutssqmlrspoprux{|yvrnkp}z}xsw}xtrppqrtwy{~~yts||ywuuttuuttttttropvvsstuwz}~{xuroljx~{yyxy~{vrw~xuuutrrrsuwxz{zyxx||tr{}xtplijpuutssttuurnorngfjligghkotyw}|x}}vwrifdcdgjmqtvvtmp~wolt|{vronoooz|obgzurstuvwxvpuxqqpmkpwvuuuvwxx|}zvvwxy|~~{ywvu~vsoklx}{yy~ulheszpkiijkmnnjrsostsrx~}{~}|zwu}}{zyxxxxwsnidccsxrppruxz}~{z||tkdcw~vpkhfddd`^gdcffecjrttttroiq|ywwwxyzyvsy~x{|}~}xtw~|xtt{r{|{{}xqhjysommlllmhkrmoqqnmr{|||}ztmz|xwwvvuusqpx}wqjp~wsrrsuvxy{x|}~}zut}{u~umdl{snjfcb`^Y^a\_``^]bkmmoomhew}vwx{}||vq~|{{}~{|}zvrr}xs|{{}~~yrkds{smjhgggggdmnkprsrqwyy}{xvz}{{{{zxsmgcvyrpoprtuwxxw}~{wu}wy}vnfau}wspmkihebkhgjjjhgkuwvvtpgmzttvxz|~~}zwy~xrr||}~~{wsr{~sx~xvwxz||wpq~yusrqpplmuqqsttrqu}ypz|{|||}}|zwtv}||||{xsmfj~}~yspprstuvxux|}~|yusyzq|~vnq{vrnlihbdkefhhhggjsxvurmfswttvy{~}zy|wqx}{z{||}~~z~}|{yvssyz~yuow~yvtrqqqlqvqstuuvvxys~}}~}zvv|~|{{{zwsnicnzvxwrpqstvxz|z}ztmxzvromkfkmhiijkllmt{zwsliz}vttvx{~}ywx~}}~zvr}{~}~|}}yuq}zwuttrnvwrttuvwxx~|st|zyz|}~|yvuv~zvqn}~|zzzz{|~}|~ztq~{zuromifmjggghikllqxxtphn~zuuvy}}}xx~|{}}}~~|yups{{xusrsopxttuvwy|}~x}yx~|yupjo}wx{yxxxxyz|y}|}ytov|y{yvtnrvpqqqrsuvvyyrm{ywvxz}yx{ws~~|{|}{xxy{}zy}|{zz{|||{xvt}{zxtz|wyyzz{}~~ww}|}~|xrw}|{zwtpkizzuvyxvvvwwxwu~|}||{z}{{}}xw||xtolsomnnnnoqqqtyxqio}ysrsuwz~ztz~}||}}{yuqs}~~~~~~~{|~|{zyz|||~|~|{{{{{zxurx||ywuqryuuwxxxy{||~ys}|z{{}}zupy~{ywvtqniek~zuqrvuttuvvvtx|}yvr{{y~{wslormnoooopqrrswumhv{sqpqsux{~~{uqy~~{yxyyxwtqo{~~}zzz{|~{y~}~{yxwwwxwvsqp}z}|yvspvwsvwwwxy{{{|}tszwvwxz|~~}{wqqy~~|{zwtpmk{{vw{|zyyzyxv~}|{|}}{wtsyvz{vplrokmmmmmopqppsrjlzxrqqrux|z{~}{wtu~}|~{xwwy{|~~~|wy{w}|yvuuuvvusqor{vx|xvqpxutwxyy{}y~~~wz|~}zwsnjm{wsrx{zxxxxuw}}}zyz|~~~|zvrw~xtw|uuzusuuuuwy{|zxxxqy|wuuwy}{~}|}|yvrw~}|{~ywvwxz|||||zv{xtz{yvvwxyyxvur{}}y{||~~|}~}x|yy|xtojr~{wtrw|{yyxxty|}|}|yxz|}y~yzy{~xwwvvwy{}~|xvtrzvtuwz~~|z~{xtp}~|}}z{}{{|~}}|x}~||}}}|{xvt}{~x~{}}~~|}~|z}vv}yupkix{xvsqu{{zyywu~}~}}~}zy|xx~y~|wwvvwxz|}}{vrowwtstvz}~xw}{xtpr{y}|zz{|~~~~~|x}wux|{zyzzzywtrv{zzy|z{|}~yw|{|~z~{su~{vqlq~{ywvx~~}|x{{wz{yyz}~}yv~~yvu|zz}vutttuvxz{{xrkl}ztrrtwz~z{|xuq}~~{tqy|ywwxyz{{zyuu|wrruyxvvvwvtqnm}{xv||w|}xyz|}~}v|~~zvx}xrljz}ywusrtz|zxus{|y{}|to{|wvuvx{}~{~}zy|}}}}{yvrt|xuu||}xxxxxy{|~~}yrlvzvuuvx{~{xy|yuqnq~}|~}}|unl}}xussstuuutrotvpnnquusrssrpnls|{~}}{}~zu~}}~|}utu}}xrmio}zwusrqsxzxuqu{vwy{|}}vnl~xusstvxz{||zy{{z|~}zwu|yy~|zyyxxyz|}|zunk{}vsssuwy|~~ywv{}yvqmkw}|{z|}y~~~yrjl~zwvuvvwwwvsszvsrqswxwvvvtqoo}|{~}{{|}}~}vv|||}}}zussy{vpjhu}zwusrrqrwzxtqxzvyz|~xpq|ywwxz|}~~~{}}|z|}{xuv|yx||{zzyz{|}~}ztmo{vsssuwz|~|}ywux}yuplm~~~~}~~}umq|zxxxxxxwvrvzusrqquxxwvuspnq~|}|}}~~}vz|{|~}zwutwysnp~|zyyyxx{~yx}{}~ypu|yxwxz{|}}|y~}|{zy~}{xvz~|z{~}|{{|}~~zunt|xuuvx{~|yzzvrv}ums|zyyyxxxwurwyttrqptyyxwusqnu~}z}zwx|vqv~|{{{{zxz~~z{}|}~wqx|zxxyz{{||zy||{zy|}{xu~~|{yu~}{{|~}{zyuq{{rmw|~~|zyyxwwvurrxvssrqpsxzywusqp}|yww}zuq}}{zz{{zxx||y~~{{|}~|tr|||~~{yxxxyzz{{x{~|}}|{~|yz~|vy}}|zz{}}zy}|wqr~woq{yz}|{zzyyxvswzvuvutsv{}{yvsqu}}zwttz}vqt|zxxxyywvvyyz{yz{|~yszzz~}{zyyzz{{yx||}|{{}|yw}|~|vt}{yzywwxz|}~~~|zvuz~wrnw~|tqz{vx~}{zyxwvtqqxurssrqprwywtqnn{}~{|~}{yvssyztq}~{yxwxyyxvuwy~yyz{|}{tu~{uv{}zxvvvvvvusw}yxyzyxwz~zwtv}zy{~}~~~{vqv}vuxxvvwy{|}~}|~{xw{}wqs~~}~|vot{vqtz~|{ywvutrpmruppqqpnnpuvtpljp}{{}z~~{xuuyytw|ywvvwwwvtssyywxxyz{}|vry~vprxzyvuttsssqqxyvwxxwvvx|~|wsrz}zxy~{vu}wvyzyyz|}~~~}~~{xvy{tpx}||}~~|yz~yroxzqlow{{zxvusrolmsqnoooonmnsusokkw}|~~~}zwtsv~~xt}~zxvvvvwvuspq{~xwwwxy{}}yss}}smntyywvttssrpszxvxyyyyxy}~yvv~{z{vx|vuxzzz{|}~~~|~{xvw}{tr~}|||}~~|yyxqr|ypklt{~}|zxwusorxtrssttsssvywsop{~}}~|yvtu{xw}zxwwwxxxwuqq}zyyyz|~{uyvont{~}|zyxxvty{{|}}~~}|xz|x||v|}wtw|}}~~}~|yx{|vv~~{|{tz{rllr{~|{yurxzvuuvvwwvuvyxtpt{~}}~|ywvyz}~|{|||||{ytv~}}}~zwvpnrz~}{zyxuu|}z{{|}~~}}{x|x}zw}xuw||z{~y}xu~yqkjoy~|zwssyxtttuuvwvttvvrpz{~{ywx~}~|||||||{xty~~~}||}|wx{snlow}~|zxwuru{yxyz{|}~}{{||yy|yy}}ywy~~|yy|~|{~~~|zux}tmihmv}~|zwtptwtrrsstuutrrssps~~~|ywtuz}|}{zzzzzzyxttyy{{zzz{|}}zvs{}uokimuz{zxvtqpvxuvwxyz{|{yyzzx{}{y~zwuw|~~~}{|}{xuuwzy~{zz{|}~~~|y|~}yts}wpkhglu|}|zxuqqvtqrrsssttsqpqrr|~}}|~~|zxvsqquy|}zxwwxxxwvtrvwuyzyxxyz{|{yvrvysnkjnuz{ywurorwutuwxxyzzywvwy{}{{w|zwutuz}}|{{yx|}}~~~}|zxurqtw{|zyz{|}~~}z{~}{wty}upkihmu|~|zwtqtvqqqrrrrssqonoqu}{~|{|~}|zxurposx}zyxxxyyxvtvyvvz{zyyz{|{zwts{~wrnkjmtz{ywtpotvsstvvwxyyxvttw|}~}yx}ywutvz}~}|{yy}~~~~|zwsqsx}{{|}~~}{~}}~zvu}{tokhhksz}|zwsrvuqqqrrrsssrommpz}~~}~~}{xuqory~|{zz{{zywvy{vvy|{zz{||{yvst~{vqnkjlry{zwtqqvustuvwxyzzyvssw~~{}|zyxx|}{}|xtpqw~}}}~~|}}}yuwztokihjpx}}{xttxusrssstuuutqmmr}zvqnnv~}|||||{xw||wvx|}||}}}|zvsw|wsomklqx||zvsuywuvwxz{|}}|yutz}~|{{z}|~ztonv~~~}~~}}yuzztpmjijow}~zwy|xvvvvwxyyxvsonu~zvpkkv~}}}|||zwy~{wvx|~~~~~~|yus{|wtqonnqx}~|xvz{xxxz{|~}zvt~~}||{{|~}}ysnmy~~}}}xwytqnlkkow~{y~}yxwxxyyzyxvrnmy}ytojk{~~}}}|zx}{xwx|}{wsu~zvsqonnpv|}{ww{yvwwxz{|}}|zwsu~~}}|{{{z{|~|wqmo~~~}~~}~}xuy|vroljijmu|~|y{}yvuuuuvvvvtrnko|~{wrlip}||{{zxvx}zwutvz|}|{zxuqpy~yurpnlkkntyzwuxxtsstuwxyzyxvrqy~}~~|}{zyyyyz}|{~~~|xsnku}{zz{{|{zy~~|{z|~{wst}|vrnkihggksz{yx|ytssrrrsssrpmjju|~~{xsnijv|{yyyxwutyzvtsstxzzyxvspmq|~ytqomljiilrwxuvyurrrstuvwxwvsqs~}~}|zyyyyxy|~}z}}||}}}~~}|yuplm{{yyyyyyywy{zyyz~}{wsqv~xsomkihggkqxzy|}xuttsssttsrpmko}~|~~~~}{yuqlim{}{zyywvtv{yutssswzzywurnnu~|wtqpnmlkklqvxwzzussstuvwxxwvssy~~~~{zyyyyyy{}|{|{|||}}}}{xtpmr}{zzzzzyx|~|{{z{~~{wts|~xtqomkjiikpwz{~ywvuuuuuutspnnu~~}{wrnkr~~}|{zxvz}zxwvuvx|}|zwspqz|xusrqponmmpvxz}|wvuuvwxyzzywuu~}|||||{{{}}~~~~~{wsqx~~~~}|{~}}~yuv~zvsqponlkloux}{yxxwxxxxwusqqz~zupow}{z~}{zyxxz}|xtpt}|xvtsssrponpsw|}yxxxxz{{{{ywvw}}~|xtt}}}~~}xuy}yvsrqpomllmrw~|zzyyyyyxwusqu}yuqs}}z{|{zzyxy|~{wrpw~zwutttssqonnqv}|zxxxyz{{{zyww|~||~{wty~}{~~~zvu|{wtsrqponlklpv~|{zyyyyyxwussz~{wsqx}{y}|zzyyxxx{}|xtprz~{wutssssrqonmpw{yxxxyyzzzywvx~~~~~~}{zz~~~~~~}zwtu~~~}|z{~}}}}||}{wtx{wtrqqponmlkkoy|{zyxxxxwvtrqu~}~~}zwtqu~}~~|zxz~|zyxxwwvwyzytpov|{wtrqqqqqpomkkoy~{ywvvuvvvvvutu|~}||||||zxwy~|{{{{{|{{ywutz~~~}|{yx|}|||||{z{}~|xtt||wtrpponnmkjhioz~|{zxwvvuutsqpqz~~~~}{~~}|{xursz~{}}{yx|}zxxwwvuuuwxvqnqy{wtqpooppponljipy{yxvuttttuttsrv}||||||{zwv{~||{{{{{{zxvtv||~|{yxx}~{{{{{{zzz{|zvsw~~yurpoonnmljhghpy||{zxwvvutsqpot~~~}|~~|zwtrv|zz~}{xy}|yxwwwvuutuvtpnt{zurpoooppponliiqxzzyxwvuuuuutssy~}}~~}}{xw}~}|||||{zwutz{{}}{yxz~}{{{|||{zzz{yutz}xurqpppoonlighpx{}}|{zyyxwusqqx~}}{xuty|yy||z|}{zyyyyxwvvvtqqx}zvsrqqrsssrqnkkrxz||{zyyyxxwvuv~}zz~~~~~~}{yvv}|z|~|z~~}~~~|{{zww~{wutssssrqolijqw{~~}|{ywust}|yvv}}yx{~}}|||||{zxvvtrt|{wutstuvvvuspmnswz}~~}||{zyxvux~{|}{ywy|z|}|}{zyw{{wvuuuutsrpmjlquz~~}{ywtsv~{xvy}yxz}}}|}}|zxutsrw~zvtsstuvvvuspmpsuy}~~}}|{zywuu{}|~|zww||y{~|~~~~~~{xwvw~|xutssttsrqnkjnprw}~}|zxuss{~|yvw~{xwy~}|{{{{{zywurpps{~zvsqqqrsstsrpmnqqrw{}|{zyxwutsv~|z|}|~~}}|{zxvux}yxy}~{z~|{{{{||||zwtsty{wtrqqqqqqpnkiknnpv|~~}|{ywurrv~~~~~|zxuuy|xvuw|}}~{yyxxxxwvtqnmow}zvrpnnoppqqqpnmopopvz{{zxwvtsrsz}|~~~~~}}{zz}}zy|}}|{zyxwusu|~zxvw||z{~|yyyzzzzzywtqqu}}xtrppoppponljknnmpu{}}|{zxvtrt|~}~~}~~~}~}}~}|zxvtu}{xutv{}}zyyyxxxwuspmlqz}ytqonnnopqqpomnqpnpuy{{zxwusrru~|z}~~~}}|zy{~{xy{||{zyxwuttw~{xwx{||~~{zzzzz{{zywsqqw|wtrqppppppnlkmomloty|}|{zxutsw~|}~~~~}}}}|zxvvy|yvuw{}{{zzyyyxvsplmt||xtqoooopqrrqonqronotx{{zywvtssx|z}~|{~}zz{}~~|{zywuv{|zxy{~~}{{{|||||zxtqqx|xusrrrrrrqpnmppnlnsy}~~}{ywuuz|~|zxx|}{xwwz~}||||{zxuqmnu}}yurqqqrstttsrqturppsx|}}|zxwuv|~{}~~}|}~|zxww}~|zz{}}}~~~~}|yuqrz|yvtttttttsrpprrpnosx}~{ywx}}zxy~|zxxz~~~~}}|{yuqnow}|yvtsrsttuuutstwvsqqsx|}|ywvx}z}~}||~~|zxwy}{z{~~~~~~~}{xtrt||ywuuuuuuutrprtspnorw}~|yx{|~|yx{~{yxwy|~~~}}|zxtpnry|{xusrrsttuuussvwurqqsw|~~}{yvv{{z~~~|{{}~|zxvv|~|zyz}~}}}}~~}|yvsrw~}zwutttttttrqqstqonnqv||zxx~}}~~~{ywx~|zxwvx{~}|||{zwtqnouzzxurqppqqrrrrqsvurpoorvz}|{xvuw|y|~}}{zyz{}}{ywutx}{yxwxz~|{{zzzzzywurpsz|{ywtrqqqqqqponpspmlllouz}}|zwwz~|~}}}|||}}{xvv{|zxvuuvy}~}|{zyyxvtqnmrwwvtrpnnnoopppopsurpnnnptx{zxvtuz}zz}||}{zxwxy{{ywtst{~|zxwvvy|~}{zyyyyyxwurpqv{zxwusqpppppponnrrolkkloty||{ywx}}~}||~}}|{{|~~|zwvw~}{ywutstw{~|{zyyxwuromouwvtsqonnnnoooooqutqpnnnpsxzzxvuw|z|}|~}{zywwxzzyvtsv~}|zxwuuwz~}{zzyyyyxvtqpsy{ywvusrqqqqqponqtronmllosx|}|zy{}~}}~}}|{|~~|zwvy~{yxvuttvz~}|{{zxvspnrxxussrqppppqqqpptwvsrqpopsx{{zwwz}{~~~}|{yyy{{zxuuy~}{yxwwz~}||||{zxusrv||ywwvuuttttsrqqtvtrponnorw|}}{{~}}~|yy}}{zxvvvy~~|zxtqquzyvtstssssssssrswyxvtsrqqtw{|{yy~~}~}|{{||{yww|~|zxwy~~~}{yvsty~|ywwwwwvvvvutsswxusrqpoprv{}}|}~~|zz~|{ywvux~}zwtqsx{yussttttttttssuyyxvutsrrsvz{{z{~}|{{|{ywy~|zxwy~~}|zxusv|~{wuuvvvvvuutsrtwwusrqqppruy|||~}}~}{z|}|zywutx~}{yvsqu{{wsqrssssssssrrvyxvuttsrrsuxzzz~~}|{zyyyyxx|~}{yvvz~}||{ywussx}|xussuuuuttsrqruvusrqpoooqtxz|}~~~}|{zz{zyz~}{zxwustz~}|zxurqsxzxtqopqqqqqqppprvvttssrqppqtwyz|}~~}|{{zxwvwwwwy~~}|zyvuv{}|{zyxvtrquz|yurqqssssrrqpprutrqpoonnnosvy|~~}}~}}||{zyxxyyy}}|{zywvtsv{~}|zxvsqquzyuronnpppppoonosutsrrrqppopsvxz~|}}||{zyxwvvvwx|~~}|{zxvuw|~~}|zyxvtrqrw{zvsqpprssrqqpopstrqpponnmnoruy}}}~}~~}}||{{zxwwxy{}|{zywutsw{~~}{zwurqswzxtqnmnoqqppoonptusrrrrqppopqux|}||~~}|{{yxwuuvwz~~}|zxvvx{}~|{zxvtrqty|zvsqpprstsrqppruusrqqpoonnnqty}}~~~~~}}|{zxwxy}~}|zxvttwz|}{yvsruz{yuronnprsrrqppsvvuuttttsrqpqtx~~|{}~}}|zywuuw{~}zxxz{|~~|zxussv|}{xusqrsuvvutsruwwuttssrqpoopsx~}~~}{yxwy~}|zxuvxz{~}zwttw|}zwtqppqsuutsrrvxxwwwwwvutrqqsw~|{}~}|zwuuw}~{yy{{|~}{xvsty~~{xvtrrtvwwvuttwyxvuuttsrqoooqw}~}{ywwz~}{xvwyyz}}zwtuz~}zvtrppqtuutsrtwyxwwwwwvutrqprx~|{|~}{ywttx}zy{|zz}|zwtsv{~}zwusrrsuvvutsuxxvuuttsrqpnmnqy~}}~~}}|{ywvw}~|zxxyyxy|}zwuux{}{xvsqpoprssrqqsvvutttttsrponos|~|{{~}|{zyxwuttw}~}|||{zz|}zxvtsux{|zxvtrqpqsssrqqstsrqpponnmlklou~}~}~~}}|zyy}}wx{xuslcgmhdhmrvy|~xsojjt|{|{yvtrqqt|}xss|~|~}ytrrv{~y}}~}}|xu|{tqolhfntsssrohgv}|||}~~~{u}wstz}ywrpn`Xcw{medhkswzvqwqkx~|}{ywwyzzz{{yxvtrsy|~}w}{wy|zqhnlm{tpmicig^fa`bbdglsy~~z}yxwvust|~}vy~}z~}~zzuswnoy}~{yxxy{{zww{~ytnmrrkj||wrldajifijlnpns}{|tksvkgkzy{|y||}~~}~{}}{xtmfltu}||wszuonp{~vl\c|rhc^]\_bfjloqsqztvteZV`tysdbi`[ZZZ\`ekqvyxsnxrltvsvyzyvtx~}w~|wtw}yuuuwxxxwwvwtwznd`t~tkgfgifholjlmiruty}}vngdfr|}}{z~|}zyxtov{y}{~|zwsrvzofs|nki`]^`cegjmqqoxyx}vvui`YW\jzmhkgbbdfikoqqkp}vttust}~{{|}}vx{~zpn}}x|{{||{yyzzuz}z~tjw{xywqljklmlhltmjrppruy~xurpnmq|~|wy}zuoslv}{wtwvsunf^cebbbcehljnvstux{||ypiea]\bq{rpupmllljfbs|vsrsux{|xy~~}{~z{zoft}{{|~|~|{{{wu|yxyz|~yokouvspnnoqofrvmmnprv{~|zywtpou{vqkz~~|vkev{srw~|tmghnzqlhfbbifcdedbllkoqsvz~}yx}}}zqmid`^`etz}|tnh_esnjjlpswz|}}|y~}}~}|z}~wnl||xwonoty}xr~{ytzytuuwxz~|tlimv{xurqmotklsqmorux||~|yvrmk||phm~xuttvz}{}|vmy{nfjnmt||rg[atzyrmjjifafic]cgbdfhkosx|}x~|{}|{wplgaY^bi|}|ogtriedehmrvy{}~zx~}|{~vly}vlglljnsw{yw~{}}y}vvutttvxzzzxvtt|xtppu|~xrwtqrplqvstvxyxupw~{stunr~voq}xsnkkmpuz~||{rmjefqsu{xmiwxleemuwurpnmjf_emcaccdeimrvz|{xs~~z|{}~ujgka]]cqr|ynigghknrvy|~}{~|~}vpopx|upliegppnrvzyysry{~yxwvvvvvusokfm}~yuvx~ywwwwut|zxuoky}{|yvsrwuwslhhiknrvz~~{ss{tpooompyyz}xnd^]er|~zwtqjlkcjieefilpruwvqo~}|~}u{y~xnjgcacl}~{zspprstux{~}}ukan~upnnnmilutrp{~{xwz~|{zyxvsojd`o}ywwyx|x}~{{nn~xvw{|zxy}sssmklmnqtyzzwv~~zxwwwtpv~x}{smiebdmy|uzwqnhhpomnopqpnhozxy|~{~}~{spmljjlu{}{yyy{|y}uml|vrtyzwtrqqqomotzww{}~zvqke]_tytpmlnsx{{~um~{ursvzzusv}yrouupnoqspv~xwqs{~zyyysn}|{vsokgejtz~zvuspmrwrpnjdaqytrqtw{w|zxxz|{{{wtroliily~~yz}wwpxxpifjryzwtssrmqquwtwz~}~}|rh`Zhtnieddfimquy{|xz~{{trtvy|zqh_a|~{yvqsxtqmlutsvy}~x~yurpqw|xsxyqs|}}{wtpleerz}{yywsquqf_hsmhghkoty|{~~}vuuwxy|~~~{zvqjaZety}}~~xoq~vqmifefmuzyuorwqomqxvw{zvomcftpib^[[]`dhkosutz|utz{xy{|}~~uldkvrrx~}|zvsvtuupqrtuy}~}{xxxwutu{|z}xvvtrx~}~}wqtpilt~~ztkekuqieddfimrvy|{ut{zvvwxxww|pefpkcahu|vtyzxpnmmkihkquw|xssssqqx~|}~~|x}|vkdusic^[Z[\_behkknyzyz~|z}~~~~{up|ulfdju}wty|xuttuwz}{|y}}}|zwuvx|yxxwuu{}xvtrx|wspor|~vnrwtqjffgjloruxz{{yt||{ywy~|yxux|}{tsxzqjdaafq{w|{trwwtsrqomho{}}{yxxyzyxzur~uw~rpme`_^^_`begflsrux|~~s{~voiedgp{~yx~}z{|~{z~yu{|}}|ytpspit}zxy~zzqknqnnopqsuxwz~x~|y|y}~{{}|x~vnkjihjoz~yv}|zvv|{xwtptspt{~xttv~}~~ulfiida`_`baajmmorvz~ysoligfku{~|xsz~{xw|{wrlbd{}zyz}|{~|xuqpvwsrrssqx~||||}xw|{{|~}}uvxsqpnlkmt~{tx~~~~}zwzww|wtrpry{tnu{vwy~{top|vqlfeigca_[`fdehkosx|}}xzztqnkhgfiyxqp}}{z|~}{xvyxpidnyutupnosw|wnq}|zwsuzvrmpwttvy|{su|wtuz~{xy~{|}z|ytu{zurpnkfm{xu}{zz|}~~~|utxwvusrsxyqv}totwuvz~vlix}xtpmgcfg^\b_]^_bejoswz|{ws{~zv|~zvw{wrnkddiip|}zysxzurrsvz~~|zxustwwrjlz{tmfejkjlpsx|}v}yx~|wsuuwtpqqrtvy{}}|yuqyzxwutsv}~|zx}~|xss~}}}}zx{~ysmkpmjpzxw~zwuvwz|~}zxz~zyyywvuxzyy|vspnqz{z{~{t{~uprx~~zwsojc^ij`^]^^`cgkoqqpmq}{zts}zwz{smqohfflv}ss|tqqqsvz}~|xqkedi{}unjfcaemmlnqruxssyyx||yussstuvwvtqnozw|}zyzywvuv}~{vpv}{{|~~z}zzysomlmt~}{xwwxy{}~~|{unjv|wvvvvuz~}|~unjjpz|wqnpheigcbcegijkjhfq~}zxxx|~vx|v{ztqnlknu}zz{wvwy{|~~yrjact}~|vqljjigejqplqz|~}zz}{z}zxwvurplip|zxvx~~~|wx|u}|yz{~{{wusqqrx}}}}~vqy|}~|{{vrnmov~}~~xsnijonlkjjhfbcqywutvy}~~}{xwvttu{{y~~xpjq{wqopttspnmlljgjuwtvy~}~ytplgfs~{yxyzzyx{~|}|}ux{xxz|~}|yvsolknt{~~~~{}|vtv}y|}yvroorv}|ywtqnqsokfa]cppmmnpsw{~~~~~}zwsomp}}|xsruzsmhfinstrpnlijmmqttvy~||zrjejx{xussstvwxyzxwz~}}~|~{xxy{}~|~|wrle_]i}~{{}~zwttv{~~{}~zvrmipw{}{xupmni`_jlfccdgkoswz}|}}}}}~~{uohjuz}}~~~~ysqz|uokgdcdinqpljonjiimtuvy|}uponw{vrnkkkmoqsuvwuuz{~~~|ww|}{z{{||{z~{yzwng`bmqoqv}}|~{zyxwwz}{z~}|ywv}yssuomov}}ztlccnrjd`__adgkoruwxz~}}|z~~towzrmlqy||~}~~~~zvs{}xxvpljhfccehkrtomllkkmtyxwwvux~untzrmjhhhjlnprrrx|yww||zz~|zy|}|{xzzsonjowslfcdjt|}z~~|zyy||ytpq}xtqoot|}vnmsqnkea`acegjmoqqw~{~}|{xyrmkkow~|zwtu}xrquuqnljfbbkqrtsqqqrrqrwwqnu~zywqmkkklmopoqy{yz|||}zuz|{tmky|tmhdbbgoy|~xuvss~{ywvw{y}~tlgjlihhhjkmmnv|{|~|zvtrrsw~{wtpw}{yvsswwspjknjilsxzzyxxvsmjnz~||~wsvvronnnnlryxyz|~|z~|wry{ywrlifdcdjs{~xqkv~|{|~}yvuvx~xtokkopmkkkhksuuwz|}~||zxvuvzzton{~}||{zxusuvrutokiikry~~|xtoikuz{xuvy}zw}zttwurokkrsrtvy{~|z{|z|}zwsuyrorrnjgecbbiy|ysu~~zwvwy{}{tlit|ywtqmoroiglnlmnqtwy{||zwrny~|yvqqy}zzuou{xwvwxyyyywsmrzxspnlkjkouyxsmkuysmkpssux{|w~zurtsnpqnmnoqtw{}}yuv}{zzz{}{xuqnoz}yvsolnpniea^cfgox~~|{|}}zyysrvvtstuwxx{xqszxstx}}zwsnklqqkhhiiklnpqqpnlo|}|{{{}~{vxytsw~{tnt{wtrrrstvwwvtuyvqswurponljijkmv}ysnkiimtvvxz|}}wqs{xrooopqsvxyywtt}|z~}}}}}}~}wrnkq~|ywutsrpmlnnhhjebbekt~{y}xspr~|xtqpswvttsrx~~}vpmot{~ztprrrpljiiijjjihfgq~~zwx|~}|}}}|}{xutuzzw}{vsrrsstuvuuz}zxwutx{yvtplfaes{zvronnnnotyyxw{~|}xwzyvtuuvvvusqu~{zy||~||yrox}ywvuvvvvutqljsunjhgfhls{zsqz}zywtsvyvtz|{|{wtrrv{{uqqtromkjhfcadq||{yxwvuy}}}{xwx{~z||zxwvwwwvw~}}}}}|{z}{tnhkrrpqtvvvuuutssvy}|}}{zxurpw~}~~{urx~zxwwwxxyyxwttwsqttqonnmnpty}|}~}{yurx~{{|~{yxx{~zvssurmhda_dqwwuttuvwwww{~}yurqrv}zy}}{yxwuy~}}~{xxurwzvplkmrwzzyxxvsrx}~~~zupqz~|{{|~{w||xvvuvvwxxwuy|yvtqswwtrpmjggp}zy{}ywzyx|}}}~|yvu{|xronle__iqqonmmnprsuvvutzyrlgjx}zwy|zuuzzxyz{}zsovysnkjjlpvz{zwtxyvsv{|||}|~}|xsx~|xutuwy|~~}}{|{xutssssrquzywwwvussvwsnhbajruy}|yvuw{~{}{xuuy}}}}~~}{z}~xwzyx|~ztlecdkqplhfddegikmoppptxy}woms{zxy}~|yusv|{wuuvwxz|~~~{xtw~~yywspnlkjknruvy|yutrqrvyxvutrrvztz{vrqqrtvy{}}}}~{ywxz}xuvyxtrqomouvtuuvwxxwurrqmgjpojghnv}|ywutux}|zyxwx}}zwtt||wuvy~{tmggpwvohdb``acdfhiintussuz}}{xx{|vqnotz{wwyy{zxvwwyz{{zxuu~|wrsvwtrpnljimw|{zxvutrpqttplks~yusttvwxzzz|}yupoy|zwuwzwspsvustuwxz{|{yuojlw{tmhedfks||yurw~~|zz|zuu~zxvwz~|wsx|tonlhdcbbcdeefmrrstvwxz|y{}yytpnnqw~{x{~}}|{zwtx~|zxwy}}zwsonsstx|}|{ywtpkjkmv}~|{{{{{z~zut||yvwy||ywwxy{}~}zvqsyzyxsolkjkmrz}||zts{~|yuttvw{zsmjlligeedcelopqsuxz|}}~~{{wtqpqty}~}zvt{~|{}|xyzvrqrvz}~|xtojfhv~{z{|~{z{yzy|~}~yx|}{z{|}~~~}zvu|{urtutqonmnosz~|}~zx}~}~ztnjkv}ytokkmliebfjjjlnqtwy{|{yuu{}yurpmnw{vw~}~~zx|{wurqpruwwupkjqyyvwxwvvwy{~}~~~~~~{wst{yyz~|yz~~}|{{zywtrw~{xurqrvvsqnkinuy}~}}zy{}}}}yrmnw}~}zwsokhhhhiheefgilorsttsppw~~~}}~|wrnorrsx~|wvy|yxxyz|}~|{}}|}|xurpmkjkllmr{|xtpmmqrrqrtuvx~|{zzz{{{zxvtt{{ywvvvy|}{yz}~{xurorz|ywvuutsrrturmmonlmqw~zvw~|{{|}zwwy}~}}}||~zx|~yvtvy|}|zwsojgkolhfeefhiklmlkkqz}zwx{~~~~}||{xywrppqu{{xz~zxwxyz{|}~}}|zyz|yurnjfbbhu~}yuqnljjmqqpoory||}|{zyxvtsrw~{{}~{zxwutty~}||~}xsqv}}ywvuuvwwwvtrprwvqnlklnrx}~|z}|ww~}|z{~}|{yzurqrvz}}|xtstpkkmmjiiijiihgiqyyxvuuuy~{}|xutssvz|}~|{{{|}}}}~}zz{{wqkfdhqvwxxvtqpnmkknppswwxz}~|ywtrry~|{z{}{xvx||{xxy|ywwxyz{||{zvuwxxwtqonmmnquxz|~~}~{wtrrtx{}}|xtpoprrpmkifdhqwwvuuvxyy{}zxwvwx{~~~~}|xuusonrwwtrstwxwvtsqnklsyyxxz||xtrt|}|~~~}}{xz|{{{||}}|{z|}{xttvurnkhfefkt}}}zvtsu{}zvrpppmiffjostttuvwxyzzyy|{wsrsx}|zxxxz|zustrnjecdjs}{vqmighmqsux{~{yvsqpr{}xuvvusrrtvz~~{xxxz}{yxwwvvvvwwxy~{wspnnqtwxxz~zxwwxz~||~{yx{{{~vojfeehlqtxz{zvplkmmllkkidbgu}ztrrsttuw|~~}~~~~~|{{}~~}yvsrsux|~}~ywx{~~}{{zyz~thdr~wkfefghggfdb`_eqsonoqtx}xmlytqonnnnoquuppwtoprv{zpxxrqqrtvxz{{{xu|~vtvyywvuvutrokqzuqoqvyzyyyvy{wwy}~x{|xvtqmlkiiikkq|wvvspmklqvvsng]htkgfhjlpsvxyz~}|z{}|~}|{zz||||||zwso~}{z{~{x}{tmr}rjb^[]bgjkjig`cgcjnnmorw}zou{upnllnprrrqqowzrtssrsx~vyxxxuuuwyz{{{xw{z|zxwy}~{wrjc\j}zvsrrrswz{ysz}y~}{yz|~~|v{urruwurolidmppx{{yxwwwvvvrgcrofdcefimqtvxxytx}}~wml~}y|~}|skzxohb^]^`dhkmjfmieggjmqsw{~~x}|x{upmlmorstuurnvtuzyxvwy|yvvy|}}}||||w|{~~}}}}~}wmc^pwpnmpqtvxyxxwwvx}{~}vv|zyxxwxzzwpmslknrv{xpgp}skfeegjnqsuwyyv}z~t{ysqsx~}}tu}uqoljhgeddeigltnmmlkkmsy}~~|xr}~xsqpqstuvwxsv|vvvw{~}z}||~~z~zsohl|wngbadjpvz{|||vy}{{s{|{z|}~~}{z{w||tsqpptywp{zqolkjkmopqsuwuu~|{}~~|w}|}wrqru{zsxrmknppnkiheajmlpqqqrstuvz{yrr|z{~}ywuuuuuvwvs{zwyyyyz}uw{tkeuxqic_^`diotx{zx}yz{|wv~zwvwy{}~~~~yw~{{{yvuuwz}x~}tnklopppppqqqovyvy{}~|tv~}zwvvwy{ysw}xtqpnnoqromfgkefimprtvwxwuqljywtstvz~|xyzyxvuutpuytwxyz{|~zu{xx{}~}xqjsxqmjfb`__abfkopz}y{{{z|~vo}yurqrtvxz{|zx}xz{}}{zzzzzyxuy~yuronorsrponjmsoruwxy{}~}{yur~yxx{~{|}|{zyxxy{{yrp|xtrppqqponomlpkghggilquyyxtnfkxtrpooqsw{~~~{yz{{xvpqwssuvwxz|~|xuxuttvz~}xrknyrkfccdcb``_`^epqvz|||}~z~vy|yuqooqstvvwty{|}}{{~{voky~}|{ywvusstutolrpmqrstvxz{zxsniszurpqty~~}~~{yuu~~yry~ytqpoprsssqniotppnljijlptxxtmjwxojiloprtwy|~y}||{w{ztvvwwxz}|us|ywvvwz}|vpkwysnjfdceghfc`[cdcjpvz}{~{ytpqsssstuuts|}z~|rq~{tsuy|~}zwuqvzsrrsssuwyzxuqkhx|zxurppqsuy}{}z{~|trxtqpqrtuvvvsqxtprtutsrssssrpkr{solkjmrwyz{|}{}z~}{zz|~}v|{wx{}~~~xpoytpmllkjighjfejebceiov~v~}x|{vsrsvxxxwsu~{{}~xwrpqu{~x|{xzyxwwxyyxuqmgk{upnortuuuvwyx~~x{{wtsstuvwxxtx}xwvutvz}}|yupidt~xurqpqqrsuy|}zy}}{}zv}zxxz~~yqy~xspooopoonlicjojigffhlry}{}|}u|zyxvtvyxt{|xy{}{y}wustvy}|zz{||{zxuqkfbr{vqnkjjmruvvvtqz}|}{zvtuvuuuuuvts|{xyyzyzz{~zrhkxtnlnpstvvvuttvu||}|{{}{t|}zyzz|}~}xqu{uqnmnoopppojjoihklkjijlnqtvut|zy{~|{{|}}|zyvtpu}yxxyy{}~z}{{zyxxxxy|{z{|{wqkd_gxwrnjhgghijlorsotxsux{|xurr}wsqruwvutrouxtvxyyz{}}}{ywqo{zpjggimqtwwwusopxwy{{||~{y~}}|}~}vw|ywwxy{}~~~~vr{uqmllmnnnnkjqokkjjkmnnnmkifcl~}|zzzz{~zwuvy|~~|zusyvtxzzyy{}|w~}zyz|~~}{zxwu}}zxvrkccrwqlheccdegijjjinxusuuvx{~wpjn}zxvtttuwvrsyutvwxyz|~}yrmx{tnkihilosvxwurwwrsvy{{{|}|{xury|{}~|y}{{xwwxy{~|{~y~|wvtrqpppponkotooponmmnqsroib_lspprvy{}{xwwy{}~{~zxxxy|~|wzylk|rida_^]`gr{|wpoyyqqsux|}rnyw}|vm`_ruhb`abdddflqmhabmkffhkotzgo{cjs{~yuqmnz{njoga_`bglrx|{m_xxrsw|{z{ps|wuvx|}w`Ruug`_afjnruwtq|}yxurz~~sx{zz{}|ysz}qt{vuuwy}~wrxvynu{wvx{wndbypjhghhjlnjjvututqyv|{{zxtpwz~ywuvwy{{yvsqojj~{yz{|~~z}yrkbfzsmhdaa`aZ\fccdc`gpopqssqleu|xuvy|~~{txy}{u{zw|uytphrzvsqonnnnhmsoqqqns}||}}vr~}}}|zuos~~zyxxz}~}{wtomhu{xwxyz{}|zrkdtzsniecbba[cebddebfqpopqqngh|~yvvxz}{tu~~~zwu|xw{{wsnlzvsqonnoljsqoqqqos}}|}~|yqx~}~~}zuor}{xxxz|}|yuplhj~xvvwxyy|~||~wphkysniecbb^_gcbcddaeppnoomibq~xutuwz}~}ytt|}}~|xs|{w|u|ytpkw}xurpnmmniptoppqpnr}}{||zsq~}}}}}|ysop|zwuuvxyxurmheuzuttuvwxz}}{}}|unizytnjfdca^ffbdddcadopmnmkcfxxsrrtwz|~}ysr}|||}~~yts{wwz}}~~~}|yvrop}xvsqpopmmvsqrrrrpr}{|zwow~||}~~~}ytop}zwutuvwusojei~ytstuvvxy|||yztnq{upkhfe`bjeddeeeceornnlhan{tqprtx{~~zur||||||}{wrz|y~v}|}~}||||zxuroy~ywtrqqqmrxrsssttst~}|zup}|}~~{vqpz{xvuvwwurmidqz~zttuvwwxz}{~zzuo|~xrmjhfahkefffghhhpuqolfdvzsqqtwz~}xtx~||}zvr}~z}|}}|||}|zyvsq~zwututqyzvvvwxz{y~{tu~~zurt}zxxyywuqmheyy|}xwwxxxz}~}}~|wt}wronkgonjjijlopmqywrnfj{ytstwz~}xu~~~{vu}}}~|{{{{{{zxwtw~zxxyvu~{xxxy{~}{s{}ytq|{{zywtqmhjz|}zzzz{|~}|w{zvsrlmtomllmorsqqyxrmfr}xtsux|yt~|yt{}}z}{zyzzzzyywvt{zzzuz{zzz{}~xt~{sq}{zyxvsolgsyy~{zzz{}|~~{w~|xurlstoonoprtusryyrjjz|ussuy}vv~~}zwt|z{}{z}zxwwwxxxwwvtv}||yw~{|{|}}uz}}~zqu~|zxwuspmij|ww}}zyyz{}{|~|y}|}yvppvqppopprtusrxwngr|vrpqsw{|uy~|{||}|{yws{}xwwy|}~~~{vz{|yutsstttttssr~|zuz~z{{||}~~xt}{|}~vrx}zxwuspmjgt~zut{|yyyz{zx~|}~~~~~~}{yx{{uputpqpppqsuvtqutjkyzsqpqswz~ywz}~{zzzzzxvsszvuvwz{||||{vwxuywsqqrrsssrrqt|xw~}z|||}~~wz|{|~}uvwz~{ywtqokhj}|ytsz|yxyzzxy{z{}~~}}~~~~}|zx}{}|utytrsssstvxxvrttkr}xsqqrux|z|zz|{{{zywurx}~xutuwyz{{{zwtyuqwvrqqrssssrrq{~y{}}~y|}~}wzvw}zwtqnkhp~|yvtz~{yzzzw||yyz}|~}~~~|{y}}wy{vuuuuvxy{{ytsspz~xtrstx{~zx}|{zyvtr~{}~xvuvxyzzzyyvu{upuwtrstuuttsss{|wu~zvsokiw~|{yvy~{{|{x}}zz{~|~||~z~yxxxyz{}~~}wsrvyvtvx||x}{ywtt{x~~ywwxyyyyyyxsw{upsxvuuvvvuutsv~~}xu~{wrnjl}|{zwx||}zz~x||yz{~|~~|~~{zzz{}~~yqp}~yvuwz}|x~|zxvryysy|wvuvwwwwwwtqxxsnpwwuuvvuutsr|{|wt{zuplhs|{{zxw}}|{w}{ryywwy{}~~~z{}{z~|{z{{|~}vmq|wuuwz}|w|}zwtqp}tlyyussttuuuutorxsplnuvtttutrqorw{vsz}xrlgi|{ywwwut{~{yvv}{}ul}zussuwz{}~~}y}{wy~|zw~|zyyyz|}~yqjxwtstux{~~zv{~{wsoluxni|wsqppqqqrqnltsnmjkstrrsrqomly|wyurx{uoieq{xvuuussy}yvsy}yz{}{pm~wsqqsuwxzzzwx|yxuv}}}~}|zww}~{zzz{|~|wnm~}vsstvx{}~yux}yuqmm}~ujlzurppoooponknsomlijqtrqrqpnloz|zvsv{tniiz~zxvvvvusx}{uu||yz{}xnq}vrqqrtuwxyxuz~zyxvu|~}}{yv{~~|||}|vot~wttvxz|{ww~ytplq}sjp{wtrqppppomkqrnnmkjpvusrrpnlt}|xuu|vojo~{yxxyyxuw~}vx~{z{}~xpv~xusstuvwyyxv}}zzzxw|~|zx}xs|zxxy{}~zy{vqnw~tmu|~zwutsrqqqnmsroponmqxxvtsrpo{{wv}~wqmv|{{{||{xx~y}}|}~xs{|~{wuuuvvwyyvw~|z{{{y|~|zz~xx~{{|~}z~{vrp~|sqyxz~{xvusrrrqmotqppqpoqxzwusrpr}yw|~wqp~}{{||}|zy}~|||}~vx~yy{xwvuuvwxxuz}zzz{{z|}{y}}x~||~~{}{vquyqvztv}~{xvtrqqqnlrsoopqqpqwzwtrpow|ywz}vpv}{zz{{|{yxz{~|{{|~yu}}uu{}zwutsstuvst{{xyz{{z{~|yy~yy}{}}{{}~|y{xrp{}tszwoqy}{yvtrponlilqnmmnoonouxuronp~{wuxysr{yxxxyyyywtuz{xxyz{}ztxxppwzwtrqppqqpouyvvvwxxxy~~zxv|zv~zw{|zz{}~~{xy{tos~~~wrx{rkmw|zwurpnmkignnkllmmmmmsvsollu~zwuwwrx|ywvvvwxxwuqr{xvwwxz|~{ut}~tmltywtrpoooomowvtuvwxxxx}}yvv~}wxxvz|{z{}~}~{xxzsp{~~~{|{tt|yoijs{{xvspnljfiolkklmnnnmrvsnkm||xvv~wuzxvuvwwwxwupq}~xwwxyz|~~ytx}skjqyxusqpoonlrwuuvwxyzzy|~yvz}|w}yvz~}|}~}~zx|{tt~{}ztxxogfpz|zxurpnkhmpmmmnopqqoqvtolr|xvzyz|zyyyyyyzzxrs~{yxy{|~yu|}umioy{yvsrqqonuywwxy{}~~||{x~|y|xz~zz}vz}zu}ypifmy~{xusqmkrrpopqrtuurquvqnwzvw{~|{{{{z{{{xsv}}{z{}~}wv}unjmx~|yvtsspqyzxyz|~~|}z~||~z{zx~}yxxxpifjw}yvtqlntrppqrtuwvsqtuqq~{vt{~~|{{{{{{{{xuy{~~|{{}~~zuy{tmikv||yvtsqnsywwxy{}~{}|}{~{{yvz~|}{v|}unheit}~|yvsolqspooprsuvuroqsqv~ztrw~~|zzzzzzzzxtvyw{|zyz{}~~~|ytt~}wpkhjs{{xurpmmtutuvxz|}~~{xy|{|}~{yy}|wsv{|~||}}{uwxpjecgr{|zwspklqnlmmnpqrsromnpr~|wrpt{|ywwwxxxwwtsxutxzxwxyz{zywspw~xrmifhqyyvrpljosqqrtvxz{|{xuvz~}z~{yxx}~|{~ytpsy~{zz{}~|~~}{vt{{tniecfpy{xuqmjnokkkmmopqrqnklpx~zvqnqz{xwwwwwwwusvxsswyxwwxyyxvspq{{uplhfgowxurnjkpqoprsuwyzzywttz|}}|zyy}~}{}~ytopy}{zz{}~}||||xtu~ysnifdfnx{yvrmmqnlllnopqrrqnkkq{vqmny|zyxxxyxwutyytsvzyxxyyyxuros}~yuqmjhhnvywtplnrqpqsuwyz{|zxtt{}~}|{~~|{upox}|}}~~~||xtyytokhfflv{{xtoqspoooprstutsqmks}xrmlx}|{{{{zyvw|{wuw{}|{{{{yvrpw{vspmkimuzzwrorusstvxz|}~~}zvt}~~}wpnx~}xu|zuqmkhgjs{}zvruvrqqrstuvvvurnlv~yrlkx~}}|||zwz~{xuv{~~}||zxuqq{~zwtrpmklsz{xsquvttuwy{}~~~}zwu|vpm{~~zvw~ytqnlihiqz}{vuxvsrsstvwwwvtrnn{}wqkk|~}||{zxw|}zwuuz~}|{zyvros~|xusqomkkqy{xstwustuwy{}~~}|yvx~ztnp~~~}}~{wtz|wspmkhfhpy}zvxyurrrstuvvutqolq{tnjp}|{zzywtx{ywussx||zywuqmmw}{wtrpomkiipwytrutqqqsuwy{{{zxvu}~~~~}|}~{vpmv}{{{{|||{z}|z{}zurt~{vromjhfegnwzvwyuqpoopqrssrpnlmx|wqllw|{yxxwussxxutrqqvzywuspljpzzwsqonmljhhnuvstuqoopqsuwyyywutx}}}~}|{}|~~}xsnq||zyyyzzyx{}|{yz~}zvrpx}xtpnkjhfdfluxwzztqpoopqrrqpnlkq~{uokp||zyxwutquyvtsrpptyywtqmjjtzxtqonnmljhglsvuxvqppprtvxyyxvtu}~~~~~~}{}~}xspv}{zzzzzyx}}||zz~}zuqr||wspnmkigeejswz}zusqqqqrssrqnmnw{vqnv}{zywutxzwvutsruz{xurmjmwzwtrqpppomjikqux{wsrrrtvxyzyxwvx~~~yut|~}||}|{{~~}|~~zvrv|yusrpomkhgipv||xvuuuuvvutspor~|wrrz}|zww||zyxwvuvz}{wsnkqz{xvtssssrpmkkou|~zwvuvwy{{|{zxw|~zvx~~{}zusy}yvusrqomjhimu~~{yxwxxxxwvtrqw|wsv~}zxz}|zyyyxwvy|{wrmmt{zwutttttsqolkmu~{xwwwyz{{{{yxx~}yw}~}{~}xtt|~zwutsrqomkihku}zyxwxxxwvusqr|zvu|~~|yx|}{yxxxwvvxzytolowzwusrssssrpnkiku~}zwvvvwxyzyyww{||}zxz~}|{y{~~~~~~}|~~ytrw~}zvtsrqponljgfjv~~{yxwvvvvutrqpv{wuy||}{xvx{ywvvvvutsuwupkkrwvrpoooppppnlifkw|zwutttuvvwvvuw|y|~~~~|zww~}|~|{yww{~|{{{{|{zy{|zuqrz|yusqpooonljhedkw|{zxwvutttsqpor||yvw}zz~|yvuyyvuutttsrqrtrmimuvrommmnooonmjgflvzxvtsssttuuttty}zy}~}}}}~}}|zxvz{z~}{zxvw||zzzzz{zyxxzxspu|{wsqpooonmljgddlv{{zxwvuttsrpopv}zwvz|yx}~|xvwzyvuuuuttrqqrpljqvuqommmnopponkggmuyyxvutttuuttsu}~{z~~~~~~}{yww~{z}}zxvz}|{{{{|||zxxywsry}zvsqqppppomkheemtz||{yxwwutsqpqz~{xx~}yx{~zxz|zxwwwwwvurqqpmmtwurpoopqrrrrpmiioty|{zyxxwwwvuuw}~~}zxy}z|}zy}~}}}~}{xxwuv}|yvtttttsrpnjghmry~~|{zxwusqt~|yzzxz|z~~|zyyyyyywtqppnqwyvsqpqrsttutroklpsx}~}|{zzyxwvvz}zy|{|~z{~~~~~{xvvuy|yvuuuuutsrokhjmpw~~}{ywussx~{y}{xy|}~|{zzzzzywtpnmntyxurqqqstuuuusomopqw}~}|{zyxwvv~}{xy~zz}z|~}}}~}zvssv}~zwuttuuutsqnjjlmov}}{yvtrs}|yz}yvw}~|~|zyyxyyxwuqmjkpxyvrpoopqrsttspmnpopv|~~}{zxwuttx~~~}{ywvz{xy}}yy}}{zz{{|}}|zvqory~zvsrqrrrrrqokiklkmt|~|zxvsqqw}{xx}zwuv|{|~{xwvvvvvutqmigktxuqnlllmnopqqommoolmtz|{zxvusrqs|}~|{~}|{zxvuv}yww{zxz{yxwxxyzzzxvrnms|zvrpoooppppnlijlkilsz~~}{yvtqps|~{xwy}yvtuz~|~}zwvuuuuttrokffmwxsolkjklmnoponlnpmkmry|{zxvtrqqv~~}{{}~}{zxvuty|yvvz~zy|{xwwwxyyyywtplmu~}ytqpoooppponljlmkikry~~}{ywtrrw}{xx|}zwuuy~~}zxwvvvvutrojffoxwsolkklmnopppnnqqnlmqx||{ywusrsz}~~}{}~|{ywuv|~{yxz||~|zyyyzz{{zxuqmnv~}yusqqqqrrrqpmmooljkpx~}{xvtu{~|zz|zwvx~|zyyyyxxvtqlhiqxxuqonnopqrssrpqttqonqx}~|ywutv~~~~}{xwx~{yz~~|{{{||}|{yvrnow~~{wutssttttsqoprqnmmpw~}{xvx|z|~{ywx|~}|{{zzywuqmikrxxurppppqrsttsrtvusqprw}}{ywvy}zxwz|zz}}|||}}}|{yvrory}}zwuttttuuutrprtrommpv}~{xw{~|{~~|yww{~}|{{zyxvtpljntvvtrpoopqrsssrruwusqpqv|}{xvv|~~~{yww}|zy{}|{{{{|{zyvsppuy{{yvtssssttsrpqssqommou||zxx~|z{}zxvvy~|{zyyxwvspljkqsttronnnnopqqpprvusqonpu{~}{yvux}|{}}zxuux~|ywwy}}zyxxxyyxwuronrwxxwusqppqqqqponqsqnlkknt{}zxw{~{yx}~|zxuttw||zyxwvvtrpliinrqqqomkkllmnnnnostrponmoty||yvtu{~}{zy{}}{xutu|~|zxvuwz~{ywwvwwwvtromotwvuutqpooppponmorromlkkmry~~|ywy}zxz~|ywussuz~|zxwvvusqnjikqrpoonlkkklmmmmmpttrponmnrx{{yvuw~}|zyz|}zwttw~|zxvtuy~{yxwwwwvusqnmqwwutttrqppppppnnqtrpnlkkmqx}~|zy||yx|~|zxvtssx}{zyxwusqnjjnsronoonmlmmnnnnosvusrqonorw||zww{~|{{|}{xuuz~|zwutw~~|zyyyyxwtroouyxutuuutsssssrpqtvtrponmnqw|~|{~{z}zxusrv~}|{zxvsollqutpooqqppppqqqprvxwvutsrqrw{}|zz}||}}zww}}zwtv~~}||{{zxurpqw{yvtuvwvuuuuusrswxvtsrpoopu{~~}~|||zwtru~~}|{yvsomotwtqooqrrqqrrrqqtxyxwwvusrruz}|{|~|{||ywy}zwtv~~}|{zywtqptz{yustvwwvuuutsruxxvusrqpopty}~~~|~|yvsqu~~}{ywtqmmqvvspmnpqqqqqqqpquxxwwvutsrrtx{||~|zzzzxx|~|yusw~~|{zyxvtqopvzyvsqrtuuttssrqrvwvtsrqpooorw{}}}~}|}~|zwtqqw~}|zyvtqmlnsvsplklnooonnnmmptuttttsrqppswz{~~}{yxwxxwz}|yvstx}}{yxwvtrpnnrwxuronoqsrrqppoorttrqqpoonmnqvz}~|{z{{|~}|zxusprx|}|zxvtqnklputqmjijmnnmmllkmqssrrrrrqpooquy|~~}{zxvuvwx}~~}|zxusux{~~|zywvtrpnmotxvtqnmnprrqponnostrqqpponmmmpuz~|zyz{}~}{zwurqtwz~}|zxuspmlnsuspmjijlnnmmlllnrsrrrssrrqooqty~~}|zxvuuwz~}{xutvxz}}{zxvtrpnmqvxvsqnmnprsrqpooqttsrrrqqponnptz}zyy{~}{yvssuwy}}{ywtqnmpuvtqnljkmopponmnqtttttuuutrqppsy~|zwuux|}zwwxxy|~|zxvsqoosxywusqooqtuutrqqtvvuuuttsrqonory~|yy{}{xuuvvx{~{yurooswwuspnmlnqrrqpoptvvvwwwwwvusqprx~{xvuw~~{yyyxx{~|zwtqopuzzxvtrqqruvwvtrswxxwwwvvutrpnnpx~{yx|}{xvvwvwz~{yurpqvyxvtrpnnoqrsrqpruvvvvwwwvutrppry}zxvvz}zyzzyy{~~{yvsqqswyyxvtrqpqsttsqqrtutssrrqqponmnrz~}{yxwx}}{ywwxxxxz}}zxuttvyzyxvtrqpqrrrqpqrttttssssrqpppqu}~|{yxxz}{zzzzzz{|}}}{ywtsrsuwxwvtrqpoopppooopqqpoonnnmmmmorw~}|{zyxwvwz~~|zyxwxxxxyz|}}}|zxwvvwyzzywvtrqqqqqqppqrrrrqppppooopruz~}|{zyz{~~}{{zzzzzzz{{{zywvtttuvwwvtsqponnnnnnnoooonmmmmmmmnprv|~}|zyxxwwxy|}|{zyxyyyyyyz{{{{zyxxwxyzzzywvtsrrqqqqqrrrrrqqppppppqsuy}~}|{{{|~~}||{{{zzzzzzyyxwvuuvwwwvutsrpoonnnnooopooonnnnnooqsuy~~}|{zyyxyz{}~}{{zzzzzzyyzzzzzzyyxyyzzzzyxwvutssrrrsssttssrrrrrrstux{~}}}}~~}}||{{zzzzyyyxwwwwwxxxwvutsrqpppppppqqqqqppppqqrsux{~~}|{{zzz{|~~}||{{{{zzzzzzzzzyyyyyzz{{zzyxwvuutttttuuuuuuuttttuuvxy|~~~~~}}}||{zzzyyyxxwwwxxxxxwvuttsrrqqqrrrsssssssssttuwy{~~}}||{{|}~~}||{{{{zzzyyyyyyyyyyzzzzzzyyxwvvuuuuuvvvvvvvvvvvwwxy{}~~}}||{zzzyyxxxxxxxxxxxwwvuttssrrrssstttttttuuuvwyz|~~}}|||}~~~}}|||{{zzzyyyyyyyyyyzzzzzzyyxwwvvvvvvvwwwwwwwwwxxyz{|~~~}}||{zzyyyxxxxxxxxxxxxwvvuttsssstttuuuuuuvvvwxyz|~~~}}}}}~~~~}}|||{{{zzzyyyyyyyyzzzzzzyyxxwwvvvvvwwwwxxxxxxxyyz{|~~~}}||{{zzyyyyyyyyyyyyxxwwvvuutttttuuuuvvvvvwwxxy{|~~~~}}}~~~~~}}}|||{{{zzzyyyyyzzzzzzzzzyyxxwwwwwwwwxxxxxxxxyyzz{|~~~~}}||{{zzzyyyyyyyyyyyxxwwvvuuuuuuuvvvvvvwwwwxyz{|}~~~~~~~~~~}}}|||{{{zzzzzzzzzzz{{{zzzyyxxxwwwwwxxxxxyyyyyyzz{|}~~~~}}||{{zzzyyyyyzzzzyyyxxwwvvvvvvvvvwwwwwwxxxyz{|}~~~~~~~~~}}}|||{{{zzzzzzzzzz{{{{{zzzyyyxxxxxxxyyyyyyzzzz{{|}~~~~}}||{{zzzzzzzzzzzzzyyyxxxwwwvvwwwwwxxxxxyyyz{{|}~~~~}}}|||{{zzzzzzzzzzz{{{{{zzzyyyyyyyyyyyzzzzz{{{||}}~~~}}|||{{zzzzzzzzzzzzzzyyyxxxxwwwxxxxxyyyyzzz{{|}}~~~~}}}|||{{{zzzzzzzzz{{{{{{{zzzzyyyyyyzzzzz{{{{{||}}~~~~~}}}||{{{zzzzzzzzzzzzzzyyyyxxxxxxxyyyyzzzz{{{||}~~~~~}}}|||{{{zzzzzzzz{{{{{{{{{zzzzzzzzzzzz{{{{{|||}}~~~~~}}|||{{{zzzzzzzz{{zzzzzyyyyyyyyyyyyzzzz{{{||}}~~~~~~}}}|||{{{{{zzz{{{{{{{{{{{{zzzzzzzzz{{{{{{||||}}~~~~~}}}|||{{{{{{{{{{{{{{zzzzzyyyyyyyyzzzzz{{{{||}}~~~~~~}}}}||||{{{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{||||}}}~~~~~}}}||||{{{{{{{{{{{{{{zzzzzzzzzzzzzzz{{{{|||}}~~~~~~~}}}}}||||{{{{{{{{{||||{{{{{{{{{{{{{{{{|||||}}}~~~~~~}}}|||||{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{|||}}}~~~~~~~~}}}}|||||{{{{{{{||||||{{{{{{{{{{{{||||||}}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}||||||{{{{||||||||||||{{{||||||||}}}}}~~~~~~~~}}}}|||||||||||||||{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}|||||||||||||||||||||||||||||||}}}}}~~~~~~~~~}}}}||||||||||||||||||||{{{||||||||}}}}}~~~~~~~~~~}}}}}||||||||||||||||||||||||||||}}}}}}~~~~~~~~~~}}}}}|||||||||||||||||||||||||||||}}}}}~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}}~~~~~~~~~~~}}}}}}|||||||||||}||||||||||}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}}|||}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}||||}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m29.bin b/applications/SprPoP/dist/MUS/m29.bin deleted file mode 100644 index ff23415..0000000 --- a/applications/SprPoP/dist/MUS/m29.bin +++ /dev/null @@ -1 +0,0 @@ -s}ux}zw}ywr|q|tss~~ttp|~ry|w}v}|~|y}|nvvzzyzow~ps}~~t|vw}zx|zwq|q|urstuo}ry|w}v~~||y}}pxs}{yy{pv}rq}u{xu|}zy}ws|rxyst}|q|n}|zq}~~w|w{~z|~{tx|q{|xzz~vqzuq}{|{~t~vyuzvt|r|xxyyv}nzwsxy|{x}~|y{x~tqu~x~|z||o~|~}p{}|}wu}}v{{}u|p|vup{}rwrv{zq{z~v~|w|}v~wp||xy{~uww~uv~|||~x|wzv}uu}ur}zxv|p{{uqyz}{x|~}|zzwuqt~y}}z|}r}z|{}r}||~~{x~~v}}}v~qz{wo}}syswy}p~||w}{zx}xz|ox}wz{}zvuyyw~||}xu}~|||rz|wuxzsww}r|wr{|}u~{z~vz|x~}mqzv~p}mzzxwo{mqw}znj{|uz{u}|x~t{wgw}}}ftvs{sv{vy{{}{q}wtwt{zr{puriny~qrt}~v{t{x{w~tznzswmu}{lyykuwwz|yw}nz{yqqrys|~vvk~ow~{xu~zszv|iyh}sz|vslu~n}v|vt}szuyxx{zwurprmt{}owkxue}v}zzw|{}u~xyp{umz~xov{q{{i||v|ntu{{zrqymk}t~n~{{xqv|rxvxz|{wzwx{qy~xsyvyryuu}}{|yx{xyzxxzz}|tzypx}k}v~tl~x~vv{ouywx}}~vo{su~o|s{}~|~zyq|stw|pws|lyylsvusm~v}|~xvtwytzw}v{xytrxt{y||}~~vuxz{}}wky~{uuxyqv|h{|~yrtru}yw~qtw|pfv|{tu{x}m}yv~yzy~~}p{x~~zqxsy|yryrytztm|ujsuzkzo|zlowvw{wlss|}jq|nryy}wqx{xwzZvyuk{xsr|x|zupzunqwqwzrly{yxlrm|tyoxxn}uvz~u{uzs}~zz~l}wvnpuu{fy|px{uym{{uzxy|oittkn}txz||xqswqzul}{wtjx|yx}syzyr{lucks{wyzrvytiurxowlj~xsu{jr}~vt|tt~{nnzv~{xjvs|xvstl}xkljnyuxyz}vquysysuw~zrmt{ws~svstzyy~rsuwzrzu~tvsqr|}sxzyxv|yz{}|wzwt|svt{wr{szrs|u{||{}sv~syszw}q~o}yrvx{y~s|yqsy}vukuz}|y}~tz~srv|x{~t}}n{utq~szwyyuz|{u~{txyos~ow}xzqw{tz~qqwz}vpsz~}zozwu|{~w|~~|tx~~mt{ypxhhgae]LiodZXawohswyvvr|xs{rxwkqsldntm`qtz|p~pztuz{muTbzektv{u|~{vsryokoirkustwllmhnrZ[c}zw{v}t}x{w|q{~m|zWfhib`pvr{~roz_gdnojs[[bct~||nz~ygYVefgbv~}}~xqsowrjsp_muu}~nk~s`|zrdpmnxw{nkfciqWPS[VORYkj\]x{Wpz|z~twqstmo~|s}xzhu}o^gnmbgWU_bZntkx~|joqi]bnfY]aujb{}wwwjsdbeoxoxyiokrvxmrwlwqvrnoxcem|uhsm{ltsop~dydfnrlpudYbydlqwpixrjvxmjoz}uqu~xdjzrdabjjT^ndp}xuzqjx~~wx{~uymontiwpdl~w~zudenaTjoj{}xdh}novv]lw|urnr}|~sxtujon_WecZabmhdcptanromc_mrnxzyosumzwj}ouzpdotgfg^ohUpnhow{|}{uhaifZT\ipT\s{wvqp~}wpsdXYnjkm{|qtv^Yk_`cpzx~y|rxv~z}sxw_jcjlkj^almiopx}posxt}~ynlxzx}xptehlbc_[hj]mjfqzzxlpppllq~mcx||vs~{{~sslx{rxm{qmutvlsx~zos{wrmzu|~z|u{sfgohjyw}zr~tuuzwllcio^vqkokqptozzztniqpgzs{zryymjip}f^gmnnnillddr~jqxw~wz~y}v~xuu|{m}{szsttjsvprrmnmd]djX`]X^[edY]bagihspit}ul}y|{wts}{qot{yrty}ztourv{t~~z}qx~z}{s|}les~joqmsmqohrssvw|zur}xhac[WUWasgdviqz~|qywshoomlgec_ecdmuvvpk}zp|{}}{|zu~{qpod`\]esfjwgt}{yt|{{~xywus~hwrsspzysrinv}t{wn~xw~z}suofba^ik_qmdsqz}z{}~upp}}{zymkrw}~{wsl_kwfgpcfcfpijmcelsnmafsnclstrknkp{xuqz~|pyzwyz~~{|}w}~}uqporwymywqzquzvx}y}|wt{{zut}xigootwx~|skz~ks|oqhelmpkhjjoknmu~ujqutsonifhihajmh_qjgsmtsmiqxqtsz}vwqs|{urmca`jgg^iteqtqzwsx}{{sggfjmigcind_cdmxopqsgjzol~x|y}z|{~~wwt}{{x~ozxz}||{}{}z}}{~yzzx}~rp~tjt||wtihfhknjizllzt~yzww{ylkrw{xspibtteqpiqjirx{qsy|zsuw|w}x~~{~z}kkpokja]a`ecd_opgwst{{~~~{{}{||{}wzx}zvpxu{~yw{}zso{vp}vr|usz}~x|{}ztvv}tnu{~}xuqyxwvyy~||}zx}|mnvzwtjhjii`__hb[nmlwwtxz{ytz}|xxunosyyuyrmemufgqeimegntsprprhdgmvskkrvwtpmouptwy}}~{x~xxzzyslomsqlirvhrypy~xtux|~}xqru{xzwuuw|szqytmptuoponmfhksxupswzzupiljgijvuhlxjirjmvvqsqrxw~}{tms~}pkpvwvpkkfje]^kncpunw|wutvzwyrsz|}vontysjhkrwstpljmxpm|ws}zuz~~||zsr~u||zz}}{~}}~~vqv}qlqwyytprpsnffsxnyy~xuz{rmnruqrmijmukdtqirohlsvtxxxxrsy{}}~y|tuww}||tpuzte^`egfa`eglhcguvly}t||}~}{ysy|~xvx}|yysrty{os~tu}wsv{{{~{{vpsz~urx}|xtuwuy|{xuy}{}}xpkovwodchlmkgiggg^^gofjwrr}{xx}{{||{z{usuxuusorv{umxymswomrwwz{wummry|wrsx~|yzyy~~~z{x|~|z||~zy~videikjhllmnggqxnp~xt|~zxz~~{xx{y{{y~~ywqrutwvtsnnsz|ww|}xxutwwztlrznlvqnu||{xx|}xqov|yohimpqooommgcjsojy}u{{yzzxzzzuw|{tppssrsnou|zpv~su|vw|{x||y~{rqtxzyyyvvrlp{{s}}vrv}xplnruuturqmgjuwox}}~|~vsssqqomrxwllwrjrvpmptvyxwvrsz||zu}}pszsov|~~|}}tnlqtnc[Z]_``bcceaalunn{yrz}}~}|~y{}zx{~~|vqw}w|zzywxvv}twxr{}vrtvxzxwuqsx~zuuy}~{yyxz~}vvtyztx~}}}{zunjlruridcfhiiihec^_infftupx~}~~||{y}}wxxxvxz|}zywuy~{wy~~~~|zvx{~~|xty|}}}}{zy|{}}|yz{|vtvyvmd`_`bdgigfdckurlv|ts{}{{}~}|}~}{zzzxutrtz}}~vs{|qq{worx|}{|~}}zuqrw{zuomnoqqsromjjrxro{xy|}{xwutuuw}|swzszzutvxzyyywz|{~~~}xtty|zsljknppqqomjks{vs~}vstx|{unklnprssqonow~yu}yvtrrrsy|wor{vnu{wqpruwwvwwy~|}xqpxwlmwuoouz{{||zwrkeehjf_WUVY]`ceeeehrxrp{~vv~}y|yz{y|}wuuwyz{{ywuy}~}{yxxy}zu|wt{~ysrsuutsssv{~}xtsw{}}}}}}~~ztqw}wpv|uoquxxwxvsqlgfinokea`acdefeddeltsmt}x}~}|{|~}|||~~|~~{xy~|vrsuwy{{yxwz}|}~}x~~x~{|~~}vsx~yqw~ztuz~{wqkhillha[YZ]`cfffgjqxvot}ztw}|}{zzz}~xx~ts{{sptxzz{{zxurqsx{{vqnmnpqrqooot|}ww~~|zz{|yv~xu}~xuuvvuuvx|{xwz~}xx{v~zuvz|}}}{xtpmnquuqkgfghjkkjijowzus}~~~}~{wttw{|ysommopqqonnrz~zv}~|zyz{}~wrv}yqu||xtstuuvwy}}z{~}{volpvriltsljnruvwvsplgefiif`YUUVY\^_`bfnutor||uu{~z}wwz}~~|zwvx|~zvtuvwwwvuv{}{|x~|vyzussssstux{}|xtrsvz|}}}||zvqpv{vnqxwqmnqrssqoligfimomida`abcccbcgnsqlp{|ww~~}|ywy|~yusrstuuttuz~z}y}yz~{{||}~}xrorxvnmuytporuwxxurnjhhjkje_[YYZ\^`acgnvwrpx}ysu|}xw~~xrrtvwxxvtrppsw{{xtpoopqrrqru{~yy{y~wy~zwvvuvwy{|xuux{}~~|xtty~{ssz|vqpqstttqoljikoqqnjgeeffgggimsxxst}}~}{|}~~}{xvtsvy{{xtpnmnnoooqtz~yy~}wu{{uv}{yxxxy{}|yxy{|||zxvrmihmroghpsojilnppolieb`abdb_ZWVWZ\_bdgmtywrr{zvxyz|vuvxyyywvtsux|~~|xuttuuvvwy~z{{wz}yvuttuvxz}}{wsqrtvxyzyxvsomqwwqloutnjijkkkjhfdcehkmkhebaabcdeglsz}zy{{ytpoooqrsqjhnsqjhmrrolkklmpsx}yusrolhd`][\_``]ZVSRRSTUW\doz}sg~jv}|{vqnkjijkmopolihilptwz{|||z{~zuojebaa_[VQNNNOQSVY_fmpoox|rkm~|wtqppqrsrpmkknrvy|~~~||~~~vomqzzuoiehoqlhkqsokhfeddefggfc^ZXXY[^_```_^]_elmihowyvtvx|~~vsuvsokihhiklnppnjfddegijjjihfddiopkhmtwtqqsvxz||}~|rnqvurv}}wqmifeefffd`\YWXXYYYXUSOKJLRTPKMUYXUUWZ]_````acfjmnmkkkmptx||vqmkklnoqqpnkheeilh`]aec^ZXYZ\]]^_`chmrvwwwwxz}~}xz{vrppsx|{vplifdb`][XTQPSXYTNPUXUQMMMNNNNNNORUY\^]\\\]_adgkqx}}}~||}wpljlnjc_bggc^\[\\\[ZYYZ\`cddc`___abdgkpvzzwx~{wusrrsttsqooqoh_Z]`^YTRQQQQONLJJKMNMLIGFFHJMPUZafihegnutqptz~}~|skea^[YXVTTUX[]^]\ZYXXYZ\^bfjkhfhpvurrv{}xusrrrstuuuvy|{uoou{|zwusrnkhc_\[[\\\ZWTRPPPQRTX\_`]Z]diifeinswz|zww{~~zxxz|}|zyxvsoid`][YYYZ\_bb_[\bgfb`bfjmopqrrrqpoprvz~ytppqpjddjqsrpppponlkjkmpsutrmiea_^]]^`cec^ZZ_b_ZX[_dhknqtvwwvvvx{~{tnllmoprstuxz~~zsnnstpjhjmoqqqqqpnljiiknqsuuuvwxyzywuuz|~~xtqmigdcceimruvvtrqqrtw{~z{~|uolnopqpppomligfgiloqrrsstuvvurprx}}yx|{xvuvvvusrrstuwxz~~{yvsokgdccegiiiihhiijigdcfmpnjkqvyzzz{|~~{yxwuqmhdbaacfintz}|xw{|~}{zyywusqpopqqpnlnuzyuruz|{ywvuuwy{~~|ywwwy{zvtw}zwusqnjecfjje`afijhgfffgilnopomlkloqtwxyzzy{~{trvyvqorw|}vrsvvqkjmpqomlkkkmoprrqomllnqsuwxxxxx{~xvvwwwvwwxxxwwx{~~{spqstqnljiiijklkifc`___`aaa`_^^_djljgjrwxwvvxz{||{{|}~|zz{}|yvuttsqoljijlnprsssrppswzwrpsxyvrqqrtuvwxz}|{z{{{{{{|~~}|zwsniecbccccca`^]^bfgc_afjifddeghikkmorvz}~~~}}}~}{zyywustz~|yxwutsqoljhimpnhfinomigghijjkkmnrux{{{zyyz{|~|wqmlptrnnsz~|yuqmiecdghd_^bggda``````_^^^`ceffedefhjmquy}z|~|zzz{}xuvwtniedcbbbaaacfilmmmlklmnpruy}}~{|}{xspmlklnpsuuuuuwy}}}vqmkjhggeddegikkkigfeefgiknrvvtqsz~{{}~{yxwvvtspnmnpswz}~{ywtrpppqrrpmkigfffghknqqnklrvurpswz}|wqkfcaaabbcdeegjpx||{~}yvsrrqomjgeeeeghjmprqmijnqnjhkoswz}}{zzzyxwusqpquz{yvx~{yxwvwxz|zurty{xtsux{}~~|{z{}}||{ywuqmjgfikidadknnlmorux{}{vsuyytportvxxxyxwvtsstwz}|zz|{volnpokgffhikmoqty~yuuvxxwwvutrpnllmpruvwxxyz{||{yx|}zyy|~yttxxuojgeca_]\[\_bfjmoqswz~~|zzz||||zyyyz{{{zy{{wtrolifdccdfhjjjjjloruy~~}|||{zwsruzzvstx|}|{zz{|~~~}|zxvsrqqqqpnkhecbccehlqvyxx{}zvsuz{wsswz{zyxxxy{}~|{|~~}~~~|ytpmjhfedegijgdejqrqqtz|yy}{vuw{|{zxwwwxyz{zyvsqppqrstttsrrtx}}z|}{{z{|||ywtsqqpppqrsspjffijeaadimrv{}|{z{{{zxvttuwz}~|wvxzwqnmoqrstuvvwwxy{}|||||{yvsqppqrstttsrqrvz{xuv{~{yyz{||||}~{|{usstttsqpomkihgilpuy|}zxwwwxxxwvussuy|zvtw|~{ywwxyzzzz{|~~zyz{{zywurolheccdfhjkmnprvy{}}~{ywvvtsqomllnrusootxywtssssssrqqqsuwyxxwwwyz|~||}~|ywwwvvtrpnlllmnnmns{|{~~zvtsrrrrqqrsvy{||{zzzz{|~~~|zxvtsrolhfhmonklqw{}|{}~zwuttttttstuwz|}|{zyxxyyz|~~}{zxvqmiilmjedgkmnnnpruy}~|zyxxwvuuvwy{{zywuttttuvx{~~{xx}|z{~~}~}zvrruvrmjlnomkjihikmorsttttvx|~{xvtttuvvvtssrstvwy|{xx|~{wvx{~|{|~}yuqnljiiijjjiijlpty~~|{zzzz|~~|~~{{}~}{xurqoonnmkifcaabdfhjlnopsw~|z}}zz|~~}}}}~}{yxxxwwvsplhfedeeeeedcceinrrqsy|{zwxz|}}}}}}|zxwwy{~~~~}zwsnkhgfedcb`^\[]`decaekppopqtvx{|~}{}~{ywwxyyyywvsqpqssoigilkgdcdefhjlnquz~~~|{{|||{zxvsrrturlikmmiebaaaaaabdfjnsvyz{}|z|{{~~|||}~~~~|{ywxz|zuqruuqmigfedb`_^_`befggffgiknquy~~~}zxvvwwxxxwvutux|}zvw{}|xtrpomkgeb```aa`_^\\]^`cfjnswxwv{}{{{}}zxwvtrpnmlmnnmlifdba```bdgjkigjpvwvw{}|{{|~~~}|{|||~{zzzzyxwvvwxyyxvsqnljihgghjjhdachjhefimqux{}}{{{|}}~}}{zz{|z||zyyzyyxwwwyz{{zxvsqonmlkklmlhcacfe`]]_bdeghjklmnprv{|zyyyyyyxxvvvy}~zz~}{{zzyxvuttuwxyxwuttttuuvwyzxsnlnokeaabcdefghijjjjlnrvy|~}|||{zyxxy{|~~}|zxwwwwwxy{}|xuuxzwspprssrqponljgffgilnprsuwy|~~}|}}}}|||}}||{{||~|yx|~{wttuvvvusrpnkheddefghhhhhiklmmlmpw||{}~}||{{{zzz{|~}|zyxxxxyz|~}zvvy|zvssuvwwvutsqnkihhhjjkjiihhiiigeegmqqopu{~|zyxxy{}}}|{{{{|}~zz}~{wuvxz|}~~~}|zxvvvvvtrpnlkjihfcbejlkhinrtuuuvwy|}||||}~~~}{z{|}}}|zyxwvtrojhjllhddfiiihghikmpsvxzz{}~}}~|zyyz|}}}|{zyxwvsplkmomheehigecbaabceghhhhhikorvy|}||z{}~~}{zyz|~~{xvwzzvrprsspnkigeedddb`^\ZZ\^`cfhjlnqu|}|~~~~}|ywx|{y{}~}zwurponmljheb`__`acefghhikpuyywy~}~zz}~}zxwvvuuuusqmjhgfggffedbaabfihfeioqqqrtwz}|{|}yy{~~}{yxwwwwxwvtqnlkjjjjigfdb``cec_]_bdca`acegikmosw{~}||||{zxuqomllllkkjhfeehjkgddgigda`___^^^^_beimprtvx{~|yvuuuvwwwwvuttuwyvqoprqmifdcba`^]]^`bdefffghjlorvz~|{{|||||{ywvvxzyuqqtusoljiihgedcccefggfedccdefikoswxww|~|{zz{{{{{yxvuvyzytrsvvspmlkkjhgeddeeffeca_]\\\\]_befecdiopoorw|~{zyyzz{{zyyxxz~}zy|~~{wusrqomkihgghiihfeccbbbcdeghgda`dgecbdhlpsw{~}{zyxwusrqqqrrqpmkhgeddccdfgfb_`dfebacfikmoqrtuvwy{~|||{{zyxxyz{{{zxusqponmmnoonjffhjgcaaceffggghggggikoswz}}{zzzyxxwwwxyzzywurqponmmnopokgfijhdaabdddddccba`_`behknprtwy|}|{yxwxyz{||zyyxxxxxyyzzxtonppmhffgijjjjkjihfedefghhggghijlmnnpu|}{zxxwwwxy{|zwtuxywsqrstutssqpnlihgghijjjiiiijkjihhlqsrqty}{z{~}zvuvwxxwvutrpmkihiijjihgffeedc`^^beebadhlmnoprux{~~~}yy|~|xvvwyyyzyxwvtrpoopqrrrqponnmlifdehifbbdghgfffghjloqssttvx{~}zyz|}~~|zyxyyyxwusqponlkhefikjgegjkkihgffffhiiiihhjlosvz}~}||}~}||{zyxtqoqsrnkjlmmkigffffgghhgeddefikmoqrsuwz~}}~~}||{zyvspqttplkmonljhgfeeeeedb`^]\]^_`aabbbcfjnpoosx|}}~}{{~|xvwxxwtrpnmlkjjhfc`^\\\]]^^^^]^_cgihfhmqrqqqsuwxz{}}{z}}{|}{yxwvutsqnkhedddeeedcbbbcgihedgjkjhhijkmnoqsuy}}||||||{yvsqpoooonmljhffhjifbcegfcbabbcdefgilosvxzz{}~}|{{{|{zxusqppppoonljhggijhdabeeb_]\\\\\\\\]_bdfghhhikmoqtx|~|zwussssssssrpoopstqmlnonkgecb`_]\[Z[\^_aaaabcdfhkmqtxyxwy}|{zzzzzzyywvvx{{xutvxvspnlkjigedcbccdcb`^]\\\]^_begihgjosttux}~}|}|xwy{yvsqpponmljjjjkkkjhfdcbaaabcefgecdhkkjjlpsvy{}~}|}|xwy{zvsrqponmlkjjkklkjhecb`__^__aba_\\`cb`_acgikmoqstuvxz}|yxvusrponnopqqpomlkkjjiijjjhd`_ab`\[\^`bdfhjklmnnprvy{}~|zyxxxxxwuspnmkjjiijkkifcdggeb`acdeeffffeeddehjnprtvxz|}{ywvuttttuurnlmonjgfghhhggfedba_^_`bdegghijlnopporw{}||}{yxwvuuuvwvronprpljijkkkkkjigfdbbbdefgghhhijkkjiilpsrqrvz}~~~yvvxvsonopqqqqqqpnmkiiiiiihfecbbba`_^_cghggkostuvwxz|~sqtpifc`_a_\\[YWVSQOONOQQQRRQRTUVWXWY_dhijnuz~~|~~}|}}}||{zz{{||{yxxy|rwgv{wqlkjga[WVUSPLIGEDEEGHJKLMPTX^djouzzxz{zvttwz|~zh\avvcWQOQX]^]_dhkkkjjhgghgffec`_^^____`___^`cfhfefjnnnmnprtvy{~{qdXOJKS`ny~xoe\UOKIHHJNTY[[^chlmlmoqstuvvwxy{|||zyxvvuuuvwyzzyww{~~||~|zxvqh`[XWUUYamz|zyxxxy{}~}{y{~~|ywxyyyyxvutromlkklmmmmmmmmnnnlklortrqswz{|||}~|xvuvw{~yvutttttsrqqppnligfhifb_`aa_][YXWVVWWWVUSSSTUWY[]_`abdhlppoptxyyxxz{|~{wvx}{vqmifdba`_^[XUSQPPPOONNLKJJLNOMJJMPPOMMMNPQQSTVX\_cfhjkmpsvz}zsmifefinu}xqlie^XUUUSOLJJIIIHHGHHJLMNNMMLMNOPRTWZ^__`bhlnnpsx|~zria]YTNJJLQXaiqyzslf`[WTRQQRSSQPQUYYXX[^adfhjlmnnooprux{}~~zvrnid_[WTQOLLPZdls||zzyyxwvuuuuutsrqswyxuvx{{{zxwwvvvvvusqpnnopqstuvwwxz~|yvtrpnmmptz}{xusqoooonnmljhghijifdeghfdbbbbbbbccdfhjkllllllmnpqsvxzzxy|~|yvuttvz}zxtojfdb`_][ZYYYZZZXWUSRQPPPPQRTSQOOSUUSRTWZ\^`cefhijlnquy}{tmgcaacgkqy}xtpmic]XWWUQNLMNOOPPQQQPPOOPQSTUVVVWXY[\]^_bgmoprw}~ytokhc^XSRTWY[_gpy~zvrolifc`^]\[ZXVVX[\[Y[^acddefhilnprttttuwy{~{vrnkhd`[WSPNNOQTW]gqz~|zwuromlmmnnoooonnprttrpruvusrrrssssttuvxz{|{{zz{{|}{xtqnkhfc`]ZXWX\aiqy}{xwvvwwvvtsrqqpppppqqoliikkifefhiklmnoppppqrtvwyyyyyyzz{zyxy|}ywusrqruy~xtrqponmkjhgeca``abbcbbaaaaaa_^]^aca_`beggghhikmortuvwwxz|}wutrmjikoty~zvrlhdddb^ZYZ[ZXVUTTTTTUUUTSRRSTUWYZ[\]^`bfjlklpuxyz{}zvrnjgda^]_cimot{}wrmjgecba`^^][[\_`_\\^aa`_^_``abcegilosvxy{|~{xtqmhc]XSPMMNORVZ_ekr{|zxwvvvutrqonnnnnoqsttrqruwwuuvxz|}}~{vtsrojea^\ZWVUUVY]biou{~|zxwwwwxxxwvvuuutrpoprtrpoqstuttttuuwxyyyyxxxxz{|}}}}}}}~}|{{zwsomnnlihilotx}{xwwvtqolkjiiiihgedcbccdefggggghjlmljjlnnmkkkllmnopqtwz}x|z|{{|~ytulca_ZVWUSSSRQQQQTWWVUWZ^___abegjlnqtw{|ywutrqqponlkjiijkot{{bhy_fqsvx{{yvvwxxwxxy|n]mV_lv~}yvtsrplhedc`ZURQQRSTVX[^`ceimrx~~{xuronnonmjijmmlkklpsvxxvrj`XWby~yy|{xuqonnnnonoooqqrpnje`[TLKSalmg_XTTUY]bhmpswz~}tmhfjt~yutsoic_[XVUX\bgihea]YVRMIFDCCDEGIJLORVYYXY\`aa``abcdfgijmosuxy{|~woidaaelv{tnhaYTQOMJGECCCCCCDEFHJKMMNLOLRIkueWSRTXYbklqz~}}|}~yurqqsuxz{zwsmf_XSONPSY`is|~vcg{hZcjqw|yywslihimry}tja[YX\aglswyyyxy|tkyywxyz{{zyxwvtsssstuvxzzxtnieehmu}wv|vuw||vmaVPUcsz{xxyywrmjlr}}|}{zyxwwxxyz{}yusqomkihgjr~vpkgecbbbba`^[XTPMLLNRVXXXXUSSW^ejlmpsx~vlc\Y]fwzurpoppqqqpnkheccefggffefhlptx|~{wsrtx}{slfa__dlw~xtqooprstsoh^QF@DP^inqrsroligfeeefhknqux|~~}||||{{||}~ztqqoib_bju}{yxx{~yncZSMGBAFP`p~xqkfgjic_]]^adhknpponmlmoqsuxz|}zz}{tmggp{vqonpuz|xtpnkjihiijjjjjihhiknqtvvvuvvxyzxwyyqha\YZ_hs}vnheddefghjkjigffinqnha][Z[\]]^^__`aabcdefhikmoruy}~{}|zwtrrsw}{urqsuxyz{{|}~~{}~~}{yuohcbdb\RLLXiv~}|}~}{yxwwwvvutsrqooooonjebhy~zvqmhc_ZVSRSUZ`flqtutrpmkihhikorturpqvxtqrw}~}}}}}ztnmvsha\ZY[`hr~|wtqonmmnnonkg`YUW[YURQQRSTWZ_dinqrru|{upjeb`achnuz}}|{|{smq~}}}~~}{yy{~{xvsolhd`]ZZ[]acb^WU[kwytpoqsvyz{{{{||}~zy|zwvwxyzzyxwvtrpnligdb```behjmr||{{}}zvsokfa\XUSUYalxzuqmkjjkmpqqokgfghigefjoruvwwxyz|}~~|zwurponnnnmjd\X]isrmjkqx~}zxvtsstuvvvusrrrsuwz}|xtplihkqzxu}~}{xuqnljihhhhhiijjklnoqssroljlppmjijmptxzzxvvz~|ywxz{||{yxvutuwz~~{xuqnljijlortvvrkcbo}{zxvusqpnljhfda_[XTQNLMPW`ku}~}}|{zywvutsstuvxyzxsonw}yvtrqonljils{~~}xwxvpkiijif`XRT^fgedju~|ywtqnkhedcbba`^\ZXWVVVWWYZ]`einppnkkptvvtsux|~|zwtqnljiiikmpsvy{||||{{zywrkfit|z{~~{yxxxwusqppsy}{zxwusrrrrrplhhq~|{zyxwutrqpnmlkigc_\]cimosy~|{ywvttssuwyzzxtqt~~}|}~~}{xtpkfb]ZWX[`ir{}|zyxwvutrqpnnnopqpnkknpmjhikoruy||ywtrponnnnnkheeo~|||zz{}~|ywtqnlklnt{~}|wst}~{ywusrqonnmllkkkjjjjjjjjjjjiiiiiiiiijlmopomkkoqngb`dkprsvz}{xusrponmljihhhjmptvvtqpw~{vqonnnnnmlkjigfdcbbcflt~}|zvssstuvxz}{}~}}~}|{zzzzzzyxvvyzvx}~|zwurolifc`]YVTQONMMNOQTVWY]gz|zxwusqomkihggffffggghijklnpsuwwussw{{xvvxz|~~yutuxxurruy}~{z}zy{}|wspopqrstvwyyxuqprutpmmqw|zwtqnlkklmoqqqqsuuqmq|}zwurpmkhfda_^\[[[]^adhloswz}}|}|}~}{ywusqnljhfeddefhjkjgb][bmvwrmjjlnpqqqppprv|~~~zuokjkjf`]]_ciou{~}||{{{zzzzyzz{}~|{{|}{wsqrsvwxyxxwvusrpomkigdcbbejrz}{zzyzz{|~~|xrmnv~}|{zyxwuttsrqponmlkkjihhhhhiihfc`afjkklotz~{{{|||zyxvutttuvx{~{ww}zxusqomkihfeddefilqw~}{ywusqomlkklmpswz|{vneclzxqmnqvz~|zxvusrqppqqqqqrstuvvtqptxzxwwz}}|~}yvtsttssrpomkigeca_]ZXVSPNLKKMQYbmw}~~{xwxyz{|}}}~~~~~~~|{yxwvvvwxz|~|yy|}|zyz||y{}{ywusqomkihfedccbbcdfhjkljfbafp{}zvtqnljigggghjloqssqmiglw}}zurponmllkklmnpruxz}}}{yz{}~~}}}~~~{wuvxxtpkhfeddccbbbcdfhjkkhd`ahs{|xsqqsv|}{ywtroljgdb`^]]]^`bfjpv|}|{zyxwvutsrqponmllkkkklllkhebbdfeb`_`begjlmmmkheehnsx{~}{zzyz|~}xw||xvwxywsolkkklllmmoqsvy|~~|zxvtrqponnnoooomlmpv{|zvqmlpz}|}~|{yxvusrqqrtx~}|zxvusqomjigecba``abcefhhfc_[]eowywuvy~~}}|{yxwvuuuuvwxzzzyvttwyyvsqqrrssrrqonlkihfedccccccdddb_\YXZ[[ZZ\air{~|{}yutvyzxuttuvwxyz{|~~{xvsqonmmnprtvxyyvsqrz~}zwurpnljhfedcbbbaaa``___`adhnu|~}|{zxwutrqoonnnoqruwzzzwspqv}||~~}{zyxwxyz|~}|{zxwusqomkifdb_\ZXWUUUUWY[]_`abceeb_^cluz}~|zyxxwvutrqomkigfdcccccdegikmorux{}z{|xvutttssrqonlkjiggffgghhgecabehhecbbcdeefhkou{~|zwusqonllkklmoquy}~}{yxvtsqonljigedcbaaaacdfghhfb^Z[akrusqonopqrv{~{yxwxy{~~{xwxyxuqmjhgffedba`__^_`acegiigdbdkv~{xuuvxyxusrsuwxyyvtstwwurnmmmnnnnnmlkkjjiihhgfedca_^]\]^bflqvz|~}|{yxxwwvvvvtqnkkmpponnqtwz{|}~}{xuspnmkjihhhiklnqrsrokgglt|~|xtrrtvxz{|}}}|||{{zywtqmkkmoomjgeeeeeefgjmsy~|{yxxwwvutrpmkknruvvvwxxwurpry|z{|~{xy||xuttuwxyzzyxwvtsqomkigeca_][YXVUSRRQQQRRTVWZ\_bdfgghioy~||~~{xuttuuttsqpomlkjjjjkkllkjhgilpssrpppqsuwy{}|xx~}zxvtrpomlkjjjihgfc`^^`dgiihhhhhghlpqpooqv|~|{{{{|~}|zyxxxxyy{|}{yxyzyuqnkjiihgfedb`^\ZXWVUTTTUWY[^`aa_[XVYakrsqnkklortwy{~~|zxvtrpnligec`^][ZYYYZ[\]]^_cipx}~}zxx|~|zywutrqonmlkkklmnnmljhhjjhc__adfgfeefgijklllkjiiijlosx}~}{ywutsrqqrrssrqonpsxzzyy{}~}{zxurnjhhhihea_^^_behknprrolgdejrxzvrnlklnpsuvwxxyyyxxxwwvvutsqponmmorv{~|zxvtrpnmkjjiiijkmoqssspmihkr{|wssv|~~~~}|zwtrrtuspmkjjjklllmmlkigc`]\]^^\YVTSSSTTUUVVUUUUUVWZ^dks{~||~~}yvsrqqqqqppoonnnnnnnopqqrsttuuuuuutttttuvwyz|}}}||||zwttw~~||}}{ywusqpnmljihhggfffggghhijjjihhjow~~}}~~{yz~}}~}|{{{{zyxvutrpomkihfdcb`__^]\ZXUQNLLMPQPPOPRUY\_aa`]\^dlsvuqnmnqv|}{zwusqomkigeca`_]]\\\]^`bdgkosx|~~~|zxvtrqonlkjjiiiiihfda`aceeca``acdeffffgghilorvy{~~~~~{wtrrstttrqqrtwy{|}}~|zxvtrpnkigeca_^\[ZZZZ[\^adfijjhc^ZY]emrqmhedehkoswz}~~~}|{ywusqonljihgfffghikmnppnligglt|~||{zzyyxxvtqnllmmlifdbbaaaa``_^]\[ZYYXXWWWWWVVVVVWWWXYZ\^afmu~~zvqpqtvusomkklnqsuwyz|}~~}|{zxwutsrqppppqrsuvwxwurnkkntz~~|ywvwxzz{zzz|~~{xvuttttsssssrrrrrrrqqqppppqruy}|ywvvvwxy{}|xwy~~|{{|~}|}}zwuuttssrponljigeca_][YXVTRPOMLKJIHHHIJKMPSW[_cgijjhedfks{~}|}}~~}{xurpoppomjfdcbbbccdefggijkmoqsvy|}zvttttspmigeddddeefghijjihgfgjlmljgffghilnrvz~~|{yxwwvvvvwxy{}~}|{yxvtromkigeca_][ZYWWVVVVWXZ\]_``^\XUTW]ejllihhilpuy}~}|{zywvtqmjfdccddb`^\\]_bfilorssrpnot|~}|{zyxvsqonoqrqnjebacddb`___``abbbbbbbbbaa``_^\[ZYXXY[]aejnruxz|}~}||{{zxvspooqssqonopruxz}~{xvtsrrqpponnmmmmnopqsstsqniedejqvwuqmjiijlnoqstuvvvwwwxxyzz{|||{yvsrrstttsstw|~|zywvttssstuvxy{{{{zyxwvspoqv{~}zxvvxz}}zxxy{{yuplhghjklkieb`^]]\[[ZYXWVUTSRQQQPPQQRSTUWY[]_aceghiiikqy|xvuttssrqonmljihgfffffghijkmmnmlkkmoswyzz{|~|{|~~~}{ywutrpnlkihgffffghijlmnoonlkjjkllmljiikou{}|{zzzyyyxwvutrplhea`_``^[XTRPNNNOOPQRSUWY[^`abb`^[Z\bjqvwusqooprux{}{xvtromkigeca_]\[ZYYYZ[]_bfjnsw{}~}zwuw}}{ywusqonlkiihgggfeb`]\\_acba```````abdgiigeb`__`adhlptx|~~~}}|||||}}}}|{yxxz}}}}}}|zxvtsqonmkkjihhgeca_^^adgijjihfda_]]agnrsqnkihijloqsvxz{|~~}|{zzz|~~|zxvtrqonmllllmmopqsttsqnkhgjpw}~}~~}|zwspmmmmljfc`_^]]]\\[ZZYYXXXXXWVUSQPPRTVWWVTSSTUWZ^bgmt{|zxyz||zwtrqqqqqqqqqqpppppppppppqqqqqqqqpqqqqqrstvxz|~}yvssvz}yvtssuvy{|~~}|{yxwvusrqppoonnnnnnnnoopppppponmoty~}~|zxwvutsrpnljhfdb`^\ZXVTRQONMMLLMMNOPQQRRTVZ_cffda^\]ahotwwutuw{~|{zyxwvutrqomljhgedcba`````acdfhknqtw{}}{z{~}|zyxvtsqpnmllkkkkjjhfdbbceggfdcbbbbcccccccdfhkosw{~~|{{|~~}|zz{}}|}~|zxvtqomkigeca`^][ZZYYYYZ[]^_aaa`_\ZZ\afjkjgedehkmoprtvx{}}zvsqonmmlllkkkkklmnoqrsttrpnlklpw}|zyxxxyxwuspmkkllkheb`^]]]]]\\[[ZZYYYXXXWWWVVUTTSSSTUWZ_djpv|}zxwwyzzxtpmllmpsuuutsssstuvwxxyyyyxxwvvutssrrrrrsstuvwxxwurnkhhjotwwuqnlkklnpruwxyzyxwuuvwyzzywvttttuvvwwwwwwvvwxz|}||}}zyz~~}}~~|yuqnlkkkkkjjigfdb`_][YWUSRPONMLKKJJKKLNOQTVY\_befggfdcbdir{|ywuuttttsssrqpnligdccdefgfdcbbcegilnqtw{~~}|{zzywuspmjhghikkkjihhijjkjjjkmoqqoljiijknptw{~~~~~~|{z{||{yvsoljhfedcba_^][ZYXWVVUVVVWYZ\]^___]ZXVWZ`gloonlkklmpsvy|~~|zwusqonlkjihhggffdcbaacfjnrtuuutsqpprw}{ywutsssssssrpmid`]^`ceda]ZWVVXY[]_`abccccba`_^^]]]^_behlptwz}~|ywtstuwwvtrqpqrsuvwxyz{|}}}}}{ywtrpopqqpoljhgfghikmoqstttrokgddfjpstsokhfffgikmoqrtuvwxyzz{{|||}}}}}}}||{zzz|}{zxwvuuttuvwxz|~}ytqoquz{ywxy|~{wtrrssrpmjhggfedb_][YYZZZXVSPNMLLLMNOPQRTUVXY[\^`bdfhiklmnnoqv}~zwusrrqqponmlkjihgffeeeeeefghikmoqstvwxxy{}}xutw|~}}}~~}{zywvtsqponmlkkjjkklmoprstutspnllllmmnqtx{~|zxwvvutsqpnmkjhgfecb`^\YURPOOPQRRQPOOPRTWZ]`abba`^_afmswxwtrpooprvy}~|zwusqomjigedba`_____`acegiloruxzzzzyy{}{ywusqponmllkjhfda_^^_aba`^^^^`bcefffeca_]]^acfgijlnpruwy{|~~}}}~~}||}~}||}}~~~~}|{zxwutrpnmkjhgedccbbbcdefghiihhfedcba_^^aehjkihfefgiknqtwz|~~}{zxwutsrrrrrrstuvwwwvtrolklotz~}||}}zvsomlllkhea^\ZYYXXWVVUTSSRRRRRSSTUVWXXXWVUUUWZ]`dfilpuz~}}}|{xtqnmmmnopqqrrrrrrrrrqqqqqqpppppppqqqrsstvwxz{|||{ywtrqrv{|xspnopsvxxxxwvvvvwwxxxyxxxxxwwwwvvvvvvvvvvvvvvvuttsuw{~{xusrqpnmkjhfdb`^\ZXVTRPOMLKJJIIJJKMOQTW[_begiihecaachnuy{{ywwx{|zyxxyyxvtqnkigffeeeeedeeeffghikmoqsvy{~~|{|}zwtqponmmmmmmmnnnnmljhgfgikkjhfedccccccddeghjmoruwyz||}~~~|}~|{{{||}}}}||zyxvtrpnljigeca`_]]\[[[[\\]^_```_]ZXVUW[`fknonmlkkkkmorvz~|yvsrqqrqpnljhgghikmprtvwxxvurppqu{~}}}~~}{wtokhfeefggfca_]]\\]]]]]]\\\[[[ZYYXWWVUTTTTUVX[^bglrw}|ywuvwxyxvutsssssrqqqqstvwwvtsqpoooppqqrrrrssttuvwxxyzzzxvsokihimqtvurokiggghikmoqsuwxz{|}}|{zyxyz{}~~|zxvutttuwz}zvtux}~}|zyxvtrpnligdba`_^]\[ZYXWVUTRQQPOOOOOPPQSTVY[]`bdfgggeca__agnv~~{xvtsrqpponmllkkjjjjihgfdcbbcegjlnopprsvy|~~~|{zxwvutssrrrqqppomlllmoqssrpmkiijkkjhgffhjlpswz~~~}}}~~~|{{{||{{ywtqnljjiihfd`]ZWUTSSSSTTUVWYZ\^_abccba^\ZZ\`flqttsqommmnprtvy{~~|ywuspnljigfedcccdefhjlnprtuuuvvvwwvvwy}~|zxvtsrpponnmljhfdccdeec`\YWWY[^`aa`_^]]\\\\\\]]^^`bdgjnqux|}zyxyz{{zwusrrrsstuuuuuuuuttttssssrrpomkigggikmnopoonmmlkigdbabejosttqnkihghikmoqsuwyz{}~~~~}||{{{|~~}|{zyxxxxxyyz{|}}|{ywtrqsv|}zyz}}yvspooonkhda_]\\[\\\\[ZYWUSPNNNOPRSSRRQPQQSUWZ\_bdgjloqrtuuvwz~{xvtsrqqppoonmlkkjihhhgggggghhijlmoqtvy|{wutvz~zwutuvwy{|~~}|{zyxwvutssrqqqppqqqrrsssrqpnlklnqtvwxxxyz{}}zxvtsrqpnmkigeca_^\ZYXWVUUUTTSRQPOOPRUX\_accb`_][[\_djpuxxwvtrrsuw{~}|zywusrpnlkihgfeddddefghjlnprtvwxwwutstw{~|zxwutsrrqpomkifdbbbcdddb`_]]]^^_``aaabbbcccddegilptx{|}}|||}~|zxxz|~~}|{|||}}}}}|{zyxvusrpomkjhgfdccbaaabbcefgijkkjheb^[ZZ]bhlnonligfefhknqtwz}~|{zyxxwwvvvvvvvwxxyz{{{zxvtqonorw{}|||~~{xurpoonmkhea^\[ZYYXXWWVUUTTSSSRRSSSSTUVWXYZ[\^_acehmrx}|{zyyxwutsrpommlllmnnooppqqqqqqqqqqqqrrsstuvwxyz{|||{zwuronnpsw{}}|zwutsrrqqqqqrsuxy{{zyxwvvvvvwxxyyzzzzzzzzzzzzzzyyxxxz}~~}|zxusqonmllkjhgeca_][YWVTRQONMMLLLLMMOPRTWY\_bdfhiihggfgjmruxyz{}~}||{zywtromlkkkkkjhfdcbaabcefhkmoruxz}}||~|zwutttttsrpnlkkkllmmlkjjijlmnnmkigedcccdefgikmoqsvwyz{{{{{{|||}|zyyz{||{zxvtrponmmlkjigfedba`_^^]]]]^__`abbba`^[XVVW[`ejmonnmmmnpruwy{|}}~~~}|{zywvusqnlkiijlnprsttuuuuttsrqpqtx}}zxuromkihhhgfda^[XVVVWXY[\]]^^^^^^]]\[ZYYXXXXYZ\_bfjotx}|zxwwwxwvtrpooopqrtuvvvutsqpoooqrssrqonmlllmoprtvwyz{{{ywtqmkijlpsvwvspmjhgfggijlmoqstvwy{|~~|zyxwxy{|~{wuvx}}{zz{}}|}}}|zvqmheb```aaa`_\YWTRQOOOOOOPPQRSTUVXZ[]_aceghiihgeca`aejrz}zwusrqponmlkjihgffffffgghijjkkkkklnquy}}zwuuw{~}{zywvutrqqppppqrstvwxxxvtqmjhhjlnpomjgeddfhlptx|~{ywuutttttttsrqomjgda^\ZZZZZZYXVUTSSTVXZ\_abccba_^]^`ejotvwvtrpnmmnoqsux{~~|zwusqomkjhgfeedeefgikmpruwy{{{zxurqqty~|zywvusrqpnlifdbaabceeedba_^^]\\[[\]_```_^\ZYXXYZ]`dhlpuy}}}}~~}{xvuttttttttttssrqpoonmmllllllmmmnnnmmllllmopqpnkgb_^^aejmopomljijjkmoqtvxz|}~~}||||}~}||||||}}~~~~~|zxurpopsx}{xtrqponliea^[YXWVUUUUUUUUUUUUUUTSRQQQQSUX[]^_``abcehjmprtvwy|~}|zxvtrqpppppqpppoonmmllkkjjjjjjkklmnoqrtvxz|~}{yxy{}~}{zywvuttttuvwxyz{{|||{{{zzyyxxwwwvvvvvwwwwvutromkjkmortvxy{}~{xusrponlkigfdb`^[YXVTSRPPOOOPQRSUWY[\^_``aabbbcccdehkortuutssstwz~}{xvtrqponmllkjjiiiiiiijklmoprtvxyz{{zxwuuuw{}|{yyxwwvvuuuttsrpnligfffghhgeca_^]]\\\\]]]]^_acehkmpsuwyyzz{|}}{ywvuvvwxyyzzzyyxwutsqpomljihgfeddcccdddeefffedca_^]]`cgknoomjhgghjmprtuvwxyz{|}~~}{xvtsrrrstuvxyz{|||{ywusrrsv{~{xurpnmmmmmkifc`^]\[ZZZYYYXXWWVVUUTTSSSSSSTTUWY[^aejnsw{~~|xuqnlllmopqrrqpnmlkkkkllmnoppqrstuvwxyz|}}~~}|zwtqommoruxzzywtrpnnnopqstvwwwwwvvvwyz|}~~}|zyxwwvvwwxyyz{{||||{||~~||~}xtpligfeeddcbba_^][ZXWVUSSRQQQQQRSTVWY[]_abdddcba___aekpv{~|zxwvvvuuutsrqomkhfedddfghijjjjjklnqsvy{~~}||~~}|zxvtrpoopqstuutrpmjhffghjkkjigedccddfgikmoqsuwyz{||}}}||||}}~~~|zxwutsrrssttsqomjgdba_^^^]]^^^__`abcddeeedcb_][YY[^chloqqpnmlllmoqsvx{}}{zxvutrqqppppppqqqqqqqqrtvxz{{zwurpqsw|~~}}||{zxvsokhecbabbba`_][ZYXWWWWXYZ[[\\\\\\[[[[\]^`behlptx}|zyyyzyxvsqommlmmnopqrrstttttsrpomlkklmoqrsttsssssttttsqomjihjlptwyxwtqnljiiijkmnprsuvwyz{||}~~~}}|}~}{zz|~|ywvuuutsqnkhfecb`^\ZXVUTTTUUUUTRQONNNOPRTVX[^`cehiklmlljigfghlry~{xvtsqpponmlkjhhgfeedddeefgikmoqtvxz|}}~~~}}||{{z{|~}|||}}~~}{zyxwutssrrqqrrsttuvvvvtsqonnmmlkigffgiloruwy{||}~|ywusqpponnmlkjihggedcb`^\ZXVTTTUVX[]_``aa``_^]\[[[]`ekpuwxxvtrqpopqruwz}}{ywusrpnmljiiihhijjlmoprsuvvvvutttux|~}{zyxvuspmjgecbbcddcba_^]]^^_````_^\ZXWWWY[]_bdegiknptw{~}{{{{}~~}{yxvvvuvvvvuuttsrqponmlkkjjiiiijklmnoqrsssrpnjgc`_^`cgkoqrqoljhfffhilnqtvy{}~~~}{xusqpqtw{~{xvutsrpmjfb_][YXWVUUTTSSSSSSSTTUVVWXXYYYXXYY[]`cgjmopqqrrrsvy|wtpnlkkkklmmnnnnnnnnnnnmmnnnnoppqstuwxy{||}}|{ywutsuw{}yvsrqrsuwxzzzzyxxwwwwwxxyyzzzzzzz{{{{{{zzyxwuspommnprtvwxyz{|}~|zwusqponmkjigeca`^\ZXVUSRQPPPPPQRSUWY\^acegghgfdb`_`cglqvy{{zywwwx{~}zxwvvvvvutsqnljhgfeeffghjkmnprtvxz{}}~~}|zyxxy{~~|zxutrqqqqqqqponlkiiijjkkjhfdb`_^]]]]]]^^_`bcehjmpsux{}}|{|}~~~~}{zxvutsrrrrrrrrrqqponmlkjihhgffffffffgggfedb`^\ZYZ\_dhmprssrqonnmmnoprux{~}zxvuttuvwxxxxxwwwwxxxxwvutsstvz~}{xtqmkihgfdb`^\[ZZZZZ[[[[[[[ZZYYXWWVVUUUUUVWXZ]`cgkpty}~|{{|||{zxvtsrqpoonmlllmmopqqqponmlkllmnpqsuwy{|}~~}{xvspoopruxz{zxvspnlkkklmnprtvwy{|}}}}|{zyyyyz{|}}}|{yxxwwxxyyz{|}~|yvspnmlkjhgeb`^\ZYXWVVUUUUUTUUUVVWXY[\^_abdeeedca_]\[\_chnsx|~{yvusrrqppoonnmmmllkkjihgfefgiknrtwyz{||{{zywvvvwy}~}||{zzyyyyyyyxxwvutsqponnmmmmmmljgda_]\]^_bdgjmpsuxz|}~~}}~~|{yxwwwwwwvusqomkihhhgggfdca_]\[[[\]^`acdffffecb_^]^`cgkorttsqomlkkklmopsuwz}~|zxvtrqponmmmmnoqrtvwyz{{{ywurpnnorv{~}|{zywusqnljiiijjigea^ZXWVWXZ\]^^]\[YXVVUUUVWXY[^`cgknsw{~~~~~}{yvtqonmmmmmmnnnnoooopppqqqqrqqpponnnoqsuwyyyxurnjgdbbdgkosvwwutqpnmmmnopqstvwxzz{|||||||{{{zzz{{|~|zxwwy|}}~{xvutsrpnkhdb_^]\\\\\[[ZYXVTSQPOPPRTUWXYYZZZ[\^_acegijjjjjjjmpu{~|ywutsrqqpponnmlkjiihgggggghijkmoqtvy{~}zwuuvy~|ywvvwxyz{}~~}|{zyxxwvvuuuuuuuuutsqomkjjjkmnopponnmmnoqsvz}~~~~|yvtrponlkjihfecba_^]\[[[[[[[[[[[[[[[\]^`bdeedba_^^_bfkortuutssrrsuwy|}|{zyyxwwvutsrqpoonnmmmnnopqrstuvvvvusrqpqsv{~~}|{ywuroljhfeeffedb`^\[ZYYYZZ[\\]]]^^^^^^^_acfinrw{}{{{{zzywvuttttuuvvvvvvuutsrqponmlkjjiiiijjkklmnoooonmkhfdbbcdgjlnpqqpponmlllmnoqrtvxz|}~}|{{{{|}~~|ywuttux{~~}}}}zxwvuutsqolieb`^\[ZYYXWWVUUTSSSRRSSSTUVWXZ[]^`abdefghjlnpruwz~~{yvusrrqqponmlkjjjjjjkklmmnoopqrstuvwxz{||}}}|zywtsqqrsvz}~|{yxwvuuttttuvwy{|}}}|{zyxwwvvwwxxyzz{{{{{zxwusrqqrtvxy{{||||}}~}zvspnmlkkjjiihgfdca`^][ZXWVUUTTTTUVWXZ[]^`abcccbbaabdfimprtuuttuvy{~|{zxvtrpnmlllllmllkjiihiijlnprtwy{|}}}}|{zzz|}{zyxxxyyyyxwusqoljhgffghijjihgeca`__^^__``acdegikmoqsuwy{}~|ywutsstuvvvvusrpomlkjjiihhhhhhhhhiiiiijjiihfec`^]\\]_bfjlnpppoooopqrstvwxxyyz{|}~}}|{zzxwvuttstuvwy{|||{ywusqpprtx||xtqnljjjkkjhfc_\ZWVUUUVVWXXYYZZZZZZZYYZZZ[[\^`bdgjmqtw{~~|{zzyywvtrqonnnnoppqqqqpponmmmmnopqrstttttuuvvwxyzzzyxwusrqrstwy{||{ywusqonmmmnooprstuvxyz{||}}}}}|{zyxxxxyz{}~~~~~~||}~|zwspmigdca````__^][YXVTSRRRRSTUVWYZ\^_abdeefeedcbaaacfinsw{~|ywutrqponmlkjjiiiiiiijkklmnoopqrstuwyz|}}}}|zyyz{~~}|{zyxwwvvvvvvvwwwvutrpnkihggghhhhgfedcccdefhjmoruwy{}~~|{ywvuttttttssrqponljhgecbbbbbbcccccbbbaaaa``__^^^^`behknqrrrqpoonnnopqstvx{}~}{yxvusrqpoonnnooppqrstuvvvvuuttttvxz}}|zwurpnljihhhggfdca`^]\[ZYXXXXXXYYZZZZZZZZ[\^`cfimptx|~~}}}}}|zywvussrrqqqqqqqqppppppppppqqrrsttuuvvvuuttsrqponmmllmnopqrrrqpoonnnnopqrstuvwxyyzzzz{zzzzzzzz{{|}~|{yxwwwy{}}|zywusqnkifdb`^]\[[ZYYXXXWWWVVUUUTTTUUWXZ\]_abcddeeffggijmpty~|ywusqpoonnnnnmmmllllllllllmmnnopqrtuvwyz{|}}}}}}}}}~~~}}||{{{{{{{{zzzzyyyxxwwwvvvuuuttsrqpomlkkkklmnnoppqrsuwxz|}~~|{ywvtsrqonmkjhgfdca`_^]\\[[[[[\\]^^__````__^^^^_`behkmpqrssssstuwy{~~}|zxwusrponmmllllllmmnnopqrstuvvwwwwwwwwxz{~~}{zzyxwvtsrpnmkjhhgffedcb`_^]\\[[[[\\\]^_`abdfhjlnpruwy{}~}}}}~~~}|{yxwvuttttttuuuuutttsssrrqqppoooonnnnnnmmmlkjihhgffghikmnoppoonmmmmnopqstuvwwxxyzz{|}~~}}||||||{{{{zzyyxxxyz|~~{ywusrqpomkjhfecba`_^]\\[[ZZYYYYXXXXYYZZ[\]^`acegikmoqrtuvxy{}~|zxvusrqqqqqqqqqqqpppooopppqrsstuvwxyzz{{{{{zyyxwwvwwxz{||}||{zyxxwwwwwwwxxxxxwwwwwwwwxxxxxxxxwwvvvvvvvvvvvvvvvwxyz|}~~~}|{ywvtrpomlkjihgfeddcbaa`__^^^^^^^^__``aabbbccccccddfgjloqtvwyz{|}~~}|{{zyxwvutsrrqqqqqrrsttuuvvvwwxxxxyyyyyz{|~~}|{zyxwvvuttssrqqponmlkkjjjihhggfffffgghijklmnpqrtuwxy{|} \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m30.bin b/applications/SprPoP/dist/MUS/m30.bin deleted file mode 100644 index 4f8e3b7..0000000 --- a/applications/SprPoP/dist/MUS/m30.bin +++ /dev/null @@ -1 +0,0 @@ -~|{|}}~}~}}~}}{~|~|~|}}}{~|}|~}~||{|}}~~~}~}}||~}|~|~|}{}|}}||}~~|{|}}}}~~|}}}||~|~{~|}}}|~}}}~}}||~}~~~~}}||}||~}|}z}{~z|{}|}||}~}|}~~~~~}}}}|{~{|{}|~{{}|}{z{y~{y|}y~~{~z}|}}}}~}~}~~~}{z}z{||~~z~~y{~~z|}|~xzxy}xx|}zy~z{}y~}|}~~}||z{~z{z}~{{y~{x{}{y|z|{wyvz{wx|{xz|x|{z~~}}~|~~~~~}|~{y|}zzy}||}w{}yxz}yy{y|xwvv|xvy|zx{zy}x{~{~}}~}~}{~}zx}|zxy~|}zw}|wx{}xzy{|vwuy|vvz}yx{y||w}}{{~~}{|~y}xv||xxx||{{|uww|w|wzxyytzrv{~y{vz~ty{||}}~~y~~xuwyxw|z|z|ztxxzx{x{wzvxusx~|yzv}zs}}{|z~~}~}z~{{ztz~wxw~z{z}vuwzwzxyzwzt}~ruzz{yxvw|||~~~~y|yxw~|xx{}}|}}vxyx|y}yzxvysv}~xzvz|sy~yzy|}|~|~}~z}|x}tv}wvu{}yzwzwrvv~xxxvzvysxtsw|{{w{w}~~}~|{||}}y|{{z~|zz{}{~y|}{{u~vvyzzvv|uv|yy{{z~{{}|z~|}}|w}}vwy}ywuw|y|wuwsutzyxzrwwxts}vuuz~|}x}~z~~|~~~~}}}{|~|~~z}|}}}{{~w{}v|xzx{||wtyuw|{~|yyzzyv}y}}{~|{x}{x{xwyxzzt|{wvuuq{zusqv}wn|st|wz{w{u~}~{~zz}z{~|~{||y|{}|{~}{{}xt~x{uz}|xyq}ws|z{|wz}wux~~}~|~{}~|~y|wy|~wuyv~xx~tvvwus{s~}nsyyryynxzw~wx{|~}}}~x|y|}{{{z~|~~}{~{{y{z{vxywvv|x|~|puzr}|w|}{{~x|yx{|~{{~~|~zzu||}zwwz}{xqwyvwysztrywny{qutw|yt~y|}|~~}|}}~|||}|}}}|z||zy}~xwxwxyvy|rtusw{{yyvzx{zw|}~yz~~~{yz|zytw}~yt|zzwvyvwxwyr}{xrsvwuv}zz~v~w|}~}|~~||~~{{u|{{z{|x~{~~w|{~|xyzx}yv|stwtzw~xyv{yz{z}z|w}|u{yrv|{xtvxxyvutqrwzyuvvywtqs|}st|}}~~}~~||~~x|}}|v}zx{}|~}ywx}~|xz~~|yx|}sz~}ywx|t}}yxz|}|{y}}}}z~vz~|qt}zytuxyyuxtrqvzzwtwzwurszts}}{~}}~{}~}zy|v}{wz|~}|zxw|~|yx}~|zx{ux~~zxw{vy~z~{x~|}z}z}~}|}~ww~|vrz|ywtyxyxuvssuz{wwvxyvsqx}xsx~}~}~}~|}{|{|z|yw}{~z|yyz~}x}y}~{yx|xz}vxyw{{{{z}}|~~{|~z{z~||u}~uxuy|xvu|v}ypusvv}xu~rwytqsuxuxz~~z{|x~}|}{}x~}y{~zxx}y}u}z|zwzt}~zw~xy{~zs{uzv||}}xyy||~~x{xy~tz}}|xy{}|y}ytvwu}yu|wutuup|tqyw{|}|{{~~}~|{{|~zw~}~zwz}}|||z~}w||y}z{~|~xv{vvxy}{{v|w}{r|x~~}}z}~||t|{v}zx~{w}}yxw~zv{~rw|wpuxvuuv}yx~z|~|y}|}~{}y~~}}|{~~z|y}xxyy{x{y|syzy~{}}vwxu|y~}}~||wu}~{z~~}{|zxztuy{wtzx{}w}vwx{}}{~{vz{t{yt{x{~~}~{z}}xzw{}}}|~~~~z{~|}||}|}}{z}yyz{{xv}y}y}wwwwutz}}{w~zy|x~}~|t|{vwt{|tux{}zvuyxvvz~{r{{vvt{wv}~}~~zw}~~~~}{~~~|~~}t||||}~z{|~|~}{~|x|}{zx{~|zvsvtvsz~xz|{||y{~}~}|zy|~tw~|x|uy}wxx|zs|uptq{xqu~{}|w{v~~{||}v~{xw|yrxz}y~wy~~}{z}~|zz}wytux|~u{|z|x{zy{z{~~{~~{y|~yuvv}}~z|x}uv}~z{yvuowus|vw}~{||}{|~{|z~|~~~}z{~~|~{wxwy{y{|}z~}~|y{z{~z|uv|tux~}tz{~~vy}}||}{~~{~xzzxyz{|~z|xw|y{~|}utwusrv||sw}}~|{xx{~}}|}|y}{|||wzxt||~|z||~}y~z}~~|}wzyxvsy{yvv}y~z{{z}~}}|xxz}ywz~yy}yzyzx|z}}vxttswztzv|~~|~~y}}|~}zy|}~}||{zxy}ywxyzx}{zz~}~zxwvyvuvxyu~{}uv~~}|zz~~x}zv{}|w{{{{ywvz{{{rwyupxxw{v~~}w|}~}{{}~~yz|{}xy}{xwx}}}{~~}{w}}|u{wswvywvx|y~t{~}{z~~}~{u~xz|xzz|x}~zxyy{z~xwzrqyyvz}{}}||yx{~~~}|z}}}~}~}yy}~zz~~{|vy}z~~}{|}~|{}}{vutxztvxy|{z~vv{}|y~~~~|x~{t|zzzx|~~~xty{~}{twwqxxx{~~|~~}xz|z|~|w~~~{~{~~v}}~}y{y{{~~~~~w~{|}wwwxvtxy{vyz~|w~|{}~{zz}}~z{zwzyy{z{z|}~ywx|~{sxwtuv~~||}uw}{}~{|y~~~x{zz}||}{yzz~|z}|{{~{zyx{stv{}ux}~}{~|z~||w~}~{wy|{wu{x{z~|{y~z{|wxvry||~}}}ywy|{z~~~{{~|~|~~~}{{}z{{{y{yy}}}}}}}x~}}z}wwxuxxzyx~|~|~yzy{z{~{w{y|zuy||w{}}~}|{z|~~xxuw|{|}}~|~wyx{}|~~{|}~~~~~|~{}{{|~~{zzw}}}z~}{~|}zyzzvrw|zx{~{~|yz||||{{}~|}~zzyw|xv{{zyy|~}y}yx|w{{~~|}z~xt{zz{}~~{|~}}~x|{zwwx{~}~{|}z{~{~||ytvuyyx}~x~|x{|~~yz{|~}xw|xywx|wwy}|~}}{{z{x{{}}}}~}}yuzwy~{|yw|}~|{~z|}~}}|xz{z~~yy}}x~xzwvwuz{{}~zx~xz||}{~~zz{w}wwyt{zwxx|{{~}z{~z{|uw~}|}|yvv|ux}{|{x|}~}zy~}{|}}~~yz{|}~{z|{x|}{yxvx{xz{}|{{}xxz~|~zyyy|~~wtyxv{yz{xz}{z}yxvv{~}|xzwxww}z|{|x~~~y|{}}|x}|{z|z|}wy|z~~zzxzzzzy~|||z|zxy}{|{x~z|~~wwyvw{}zxy{~~~|y~|wxyy}~~{}}||wuyyz|||~}{yy}}|~{xz}||{y~}zzxz~|x|{z~{z}yzz|}zz}z~~{x{z||~}|{{{|~~~|wtxy{|x|{|~z~~{zy{xz~}zz|~}yww|xw~~~~{zy{}~}~~{z{||~}z{{|yvz}}|{~x|}}}zy{z{{|~~}~~|wv~~}||z|~{~~~xuxy|{x|~yy{~{{vy}}|{y}|}{wyxy|~~y{zzz}}~||{{{||~}~}~{||xxy{}~}z{|~}zxvz}~}zywzy{~}zyzz{||xwyyy~{}yy{{zxxy}{|z{~~}vv{|}|{{{{vz~}~{~~{|y{~|~||~}{|yzy{}~{{~}~}~yuwz~|~}|~~}zz|zz{~~|{vvz|}{wvw|z{|y{z~y{xz}{z|~{yy}}xy|~~zyyx}~~~||}|y{|}}|{|~{xwy{~~}}y|}zzwz{{}}~|~~vw{{z{ywwz||~~yvx}}{{z|{y}~}~xxy{~|{|}|~}}zzyw||}~~|yyw}}{~}}{}}||z}||}{|wwx{{z|z|~|{|z{{z}~~~{}~}yvxz{{~~~y{yx|}~~{xyzy{}||||~}|xyy|~zz~|zxzxx}}~~{zyv{z~}||zyz}~|z||{{xwyyz~~x{|{~~|{z{zy~xz~yxwz}|}~}z{wz|{}wvyx{~~}}~zyz{|z{~|zxzyz}~~~}~yvuy}{|}~~~yvy|}|z||}||yyvw{}zz~}~}z{zz{}~~y{{xyz~}}|~zyxw|}~~}~wtyy{}}}z{xx~}|}~}{{x||z~~zwvv{z{~{~{yxx}{|~~|}~~}yvwz~~z}~}}zx{{}}~}zz{yy}~~}|{{yxwz|~~||}~yuwz}|{{~}xvx||y|~|y|~|{}zywww{}~|z||{xy}|~~~~}|}~yxwy|{~}~|yzz~~~|y~|}|yz~yz|~zwwy{}{{~}}|xvy~|{|~yxxyzyz}~|}||||~~~ywxvz}~}~{z{~|y||~~|{~|{{}{xww{~||zz{|}{|}}~}yz}{z{~yxwz{z~~}{}~|wy|~}}}}}{xwz~|zz{|}~~|yz}~~}zwxxy|{}||{{}~}||}{{{~|{|}|xux~}|}~}|yy{~}{}~~}}yuy||}|}{yxwyy|}{|}~~|x{}~}||~~xwx~{{y}}}zyz~}~{yyywx|~}|z~~}|||}{|{~~}|{|~xyy|}}z||~|yxz}zy~~xuw}{||~{xwuy{}~{{}|||y{}|~~}}~|xy{}||{}z|||}~~~}~~}|wvw||~}}~~}xx|~{|{~~|z|~}{xxz}{z~~yxz{||~~|||xyz}}z}{}zvvv{{|~~}|~~|~}vwz}~}}}~}zxx}}|}}|}|||}~|~|xwyz|zz~~~~|xw{~{|{|z|{xux||}~|zyzzy{{||zzy}|{}|{wwwwz|}z|~}}}}uu|~}~~~~}xwx}}~~~}}{||~}|{}}}{zywyxz~|~|{z{{|}}|~}}zwwx|~}}~~}|zwz{~zx~~~}yxy|}|}||ywuw|||}~~~{wx|~~~~~yy{}~z|}}}{|~~|z|}~~}xwuxzz}{z}~|zy}~|{x||z}|zwwz~{|~~}zxy|~}~|x{}{~zxxz~||~~{vvw{}|~~~}~~|xy|~~~~~{zy||zz}}||}~}||}|{wvvxz{}{z{~|zx{{xz{~{{~|xxz}~|~~{|z{{{~|{y}~||~}zwy}~~}||~xwwyy{{{|xvy~~|{}wvz}{{~~~~}|~}{||{xwxwx|}~|{{~|{zz||yzy{~}}}|zx{|}|xx{}z{~~~zxy~{{{~zwuw{~zy|~~|ww{}~||}yww{~~~|~~~}}}}{}}~}|yxwxz|}~~~}{}}|{z{zyyz~~|}{yz~~}~}zxz}}}{}|{yy|}{{}|{vux|~}}|z||||{wy}~}}{}}xxx~|{~~|{{~}}~|}~{xyzy|}}|~~|{|}|zz~|yyz|z{}~{yx{~~}{{z|{|}|}|}~{xyz}||||~yxyzz{|~|z}~}}|{wy~}|{}wy{}||}z||~~{{|}}{zzz|{y|}|||~|{{}~|z{zz}}z|~~yvx}}}~~~|yyz|}{~}}|~yvx{~{||}|ywvy{}~}}}~}~~{w{~}}}~}yz{}|}}~|||{~{{~~~{{zxyy{|}}}~}zy{~{xx|~}{~zxx{z{~~{xwz{}}xz}}}ywxz|||~~~xvux{|~}|~yy{|~~~~|zz|}}|}~~{{|~}}~||~}zxvy{{~}}}{xx{}yyy}~|~}zyz|||~}}yxxz|~|y{~}~zxwx|~~~{}|vvvx|~~}~~}wuz}}{}~~|{y{}}~~|{|~||z|~zwwx{|{}~~~~{yxy{~|z|{|}}}~}zwz}|{}~{zxx{}~}{}~zvw{~{|}zwvw{}}{|~~~yvx|}||}~~xwy~~}~~}~}|}|{z{|~}zxyyyzz{~}||}{yxy~}|yx|~~}ywy}}{~}{yy{||z~}||yxz}|{~ywxz}~{{|~}xvy|~~~~~yxy}}{{}}{{~|z||}~}zzywx{|}|z{~|zyy|~wy~||~zy|yyyw|{~}|x{}yy~}}ww|ywsx~~~x|}}||}}x|}z}{}z{|~~~~|z~{}}w{|}xvz|zyzvy|yz}}|}wy~}yyxu{|x~}y{ww{~yy|z~zy}|xsx}~z}{~|}}|yyvu{}}zwxw||~~}~|{|z{{|}wvz|yx~}}{xxy{~~||w{~{}}xyuu|}}~~~y~z|~y{~{{vv}{yv|~w{z{z{{|xzvy~}~~|xuy{x}{|z{y~z~{|~yyz|xv{y|{xxx{~~~yxqy{|yzty~|~}~~wxuz~{}{{tuz{y|~||zw|{~|}|}vxy~|xr|zy|z{~}|zw{{}z|~|zxz|y{}||||y{z}||yryxw}~vy|v}}~}{|~zyw{~~xx{~{{||{}yx|yz~y~{su}y|ws}xy{y}}}xtt~~{{{xz}wyyy|zz|}}{}xrywx~x}x~yzz|}yw{~|}~vx}{}}|z|}yy{{~{~uwzu{~xu}w{|{~}~ytu~}z}}~{xy~{x|||}~|y~z|}vt{x{}w}{w}y|{{}zvu|~|y}xzwyyz{yz||zzsxyw}~xzy~{z{~~|wsv~}~vx}z{}}{}{|{{}x|~ww{u{yu}{}~|z{~|wxr|txs~{{zwu}|x||{ux~ys~|}~wy{yy}{~~zur|zz~~~{y~|xuy~||{}}}yu{{{~{uw}uz|u|~~~}z|}~wy}{}~wzxv|x~~}|z~z}wtsy}z}ytv|~{|}y}|{z~yy~x|w{}~vtv}v}{z}{{z~{z|{sov|z}}~}z~|~|{|vw{y~~zsx}wtyxsv}yy~~~}vuyu~vuws}||~}~yxtu}~zss|}zzxww}~y{}}{x}~}xzvuzvw{}zyuxw~z||vzvvst~{}yx{z~}}y{z}}{{~|}yuz}|{~|z|z}|w}~}zz~zstzv~~{~x}xszwt}xz{zy~{|{}}}~||z~~z||}}{}{|{~zx|yx{|~uxrv|}wz{z~~zz{}{zz||}y}|||~z|wy}}w~|wz|}z{xz~{yz{|utz}~{{yqw{zwzysz}zx}~|y}zzy{|~|v{yx~}yrty}{~}xuwsvz}z{~tux~{z{x~}{||ypx|~{vxww}~{|}|z{{{{{|}~|y}|xrsz{}}wx|}||}}rz|}{x|x{{~zyx}~~~wtv}vwvx{v}}}~}tyvvz~~w|}y|~~{{tu}~~}}|zz}ytyx{~|{us}v{wx{y}{zw|~~yv~}x}z~{~}wz}v~wz~{y}{|{z{x}~~z}{yy}{syuyz~{z}ys|}xyw{x}|qt}{~}yz{vz}z{{yxxrw}}~|{|z|~su}wt|}{|}|suzt}|{x}|ywr|wtz|yusu~{x|zuuzx~~yuw~~{ywuvz}{y~|~vyzz~y~wz{}z{t}~}|~wt~ytyz|xts}}}{zyyz||}z|~uwwt~}yzro{|uyx|}yz~~|x}|}|v}x||}y{xys}{~z||}{}}|y~x|zy}x|}y~{}yxv~{vxzx|~~{zwpy}|~~~ttwz}}y||qx|xx}~uwwzz}~zsyw~~{|wsu~vw~~|{||yyy{~wux~uov||}yzy{|{yy}{y{~vpyuw}z{vymt~}}z~w{w}|~}}}z|s|~y}~|~{u~ux{|}~|~{{~zwzw~~||{|}{plzv|}~}y|}vtzz}}wyv}~y~t{z{xv}wyvy|y{~|vy~~yz}z|vxw}~wvu{{{~|}|}z|||yyz~{~~zxvr{}zwz}z|yuuy{|~usv|~{{{xzyv|yxx{su}y~v{zvy}z~u}y}vw{|}vyx{}~|{|zv|z{}}yxz|y{vp{vz~}~z}wvwwy}~wtp}~}x|xr|w|vx~yrz~yv|~~|wy{y~uz}vx{}}vyw}}{{{|w}yz~{wzz}x}vp{uy~}|}{wwxww|~ztr||~y}wr~x|wx}yry|~}y|||~zyyw~}u~zvx{wxv~|~|~~x~}}xx}~}x{z~}vwtxu}y~{z{yxxxy~~vt|x||wr}x|xz|}zsx{}{}z|}zww{x||xw|}xxv~~{~~~|v|~wxz~z|{{wwwvu|}z}zz|zwz}yx~vw{vz~vs{y{x|y}yuw{||~x}~{vw~yy{}yw}}yww|~{}{v{~}xyy~z|{yyvxtv}|z}z}z|zw{|yyvzzwy~~uvyzzy{y~wvw||}}|x~}zvz~xy{~~yx}~yvz||||zw{{xy{}z|{x}vwtw~|z}~{{|{yw||x{|u|yzz~}szxzzzz{tww|{{y~zzv~wy|{yy}zxu}}||~~}z{|zw{}{|z{|y|svvzzz}~~z}wyx~zy~~yu{z}|~{u|~xz{x||{swyyx|{}zy{yz}xyx}|{y~}~~{xw}y~}}z~{|ysuyy{yuzytwyy~vv{z}}{{xw{{zyu~~yzy~~|yy~tvw{}|u~~}~}|yv|yy~~x~x}z~||z||vpxz{|v~zvzz|y}zwwz~x}|~|}r{~|~vywx|}}{t~{vu}~{wz|~|}zz||~~z~}w|~{~||zz}}{y~{sxw{|~|z{yvyy}~~~~xvt|~~ut}|yy{}}rwv~|{yy{~yu{}~zv~u{}~{z}}}{zz{}{}~zz}|~{~|xxs{z{{x~~~qtwy|{|ww|x~~}zyvy}vx~{tt|~||}|{uzx~yuz{z{v{~|}}|v{w{~{{z{y}}wsuz{{}y~{}}}|z{sx{{||z}~~{{yws}~|z{wuy}{{z|zyt{}~z~{|z~yv}|}~|{}|z~|y}~z}z}wwz}u|yxy|{z}wx{}~y{{|{z}yt{|y|}|w~yvty}yzy}v|y}~}z}}~|~uw}|~{{x~{~}y{~~x{}~xyx}wuy}{{ww{||z{vy~~x{y}{|yx~tvw}zzy{}}yy|z}~y}|~|{{z~}|yyy}~|}~|}|}|x}{}yvwut|z}~{|~}uz{z|wy~x}}~}wwywz{sv{}x{{}t~|||~~{~}}}{~}{{{~||w~yxy~~|}~}}|~~zy~{{yuwtwz{}~z}~|u{z|zw|{y|~~}~|ux{v|~xtw}yy{{{v{~|}|z{~~z~y{{|yz{wy{|{~}~~~|~|{{|xxtxt{z|~}{}yu{{~}xxw|~|~}~zs{{|w~xxuz~v{z|zz~}y~~~~{z~z}yx}}~~z~~wx{}x}~|~}}{}}}~~zwvuyw}z~~z}zwu}z{vw}{|~uv}|yz~{wzv~zw|z{||}zx~}|~yz}~u|}}{{~u{{~x~|}~|y|}wvuu{x~z||zyuv}zyy}y{}}||sy}}y}}wzyyyx|y}|~}w{~~}|}y}{}{v}}~~{||{v|||z|~~~}}|{|~~vvuw|x~||~yyty{zx{|z|{~}zt{}}~y~}v{x{}xy|y~{~|v~~|}|z|}~}yw}~~~|{}yw|}z{}~}|{||}}vwtw{y}|~}~yytz{{x{{{~{}~zs{|~}y~~w{w{}wz{y}{~}w|}{{|~}~zx}}~}}}~yw|}z{~~}}{|~|~}xxtwyz||~~{xuz||x{z|{~~zs{|~|y}yyvz}w{{zz{}z~||{}|~~|x{|~z~zwz|z|~~}}{{|~~{yuvu||{}~~yxz{~yzy}}}~{ty{{y|}wvy}~w{y{y{~}~|{|{~|~zy|~y{xx}{|}~~}~{x|~~~|zuvt}~{{|yz{z~z{~y~~|~{vy{~zy{vuz|~x{y{x{~~z||{}}~~{x}~y{yx}~{}~}}~~~zw}}~~}yuut~}{{|y{zz}z|~y}~~|ywy|~yz{~uvz}|y{y|x}}}z|{|}~}~zx~~zzxy~}{}}|~~yx}}|~xvtv~{|z~~x{y}}z}}z}~}|xwz}}y{{{uw{~yz{y{x}|}}|z~~|yy}}|}yxz}z~}|~|xz~}||vvtz~||z{xzz{z{}~}|~~ux{~{z{~~xvy}~w{z{y{~|}~~}{z~~}zz||zxz}{|~~}~{{{||{yvuw{~}{|}xxz}y}}~~~|~~yvz}}{|}zyw|~yx{{y{}}y~|z{}}~}zz{~|xy{{}~~}~|z}|~{yxuvy{|||zww~~{z~~}~}~|}~~xv{}|||{zyx}}yx{{z}}zz~~{zz}}{z{|~~zxz|~{}~~~}}zz~|~zyxtxy}|||yvy~{{~}~|}~|ww{}|||z{yz}{yy|{z|~y{~~{z{}}zzz}~~yxz}}|}~~}}}y{}|}zywtxz}~}|}xvzz{~~}}{~~|wx{}{||{{xz}{xz|{z|~y|~~zy|~~{{z|~yxz|||}~}~}z{{||{zwuvz}~}{~yxz~z|}}{}}|wx{~z||}zwz}|w{z{y||}~~{y}|{yz}zyy|{|~}~|~{{yz|||wvt{{|}z~{y{z{|{~|||}wyz}zz||zvy|~~w|zzy{~~|~~|x~}~}|zy~|zx{{|||~|{wz~~}}}wvtz{{}z|{{y|}{~|||}xyz|zz|{zvy{~~x{zyy{}|}~{y~}~~|yy~}zx|{{|}~}zwz~}}}xvt{{{|z||{z}~~{|||~~xy{|yz||ywy|~}x|yzy}~|~~{z}~~|yz~|yy|~{|~}~~~|yw{~|~|wuu{z||{{|z{|~|~{||~|xy{|x|{~~xwz|zy|yzy~~}~y{~~~~||x}~zyy~~z~|}~|{yx}{~zwtx|z}{|z|z~~||~}z||yyy|zy}{|xy|}~w{zzz{~~~~~~}x|~~||{y{yy{{}~}|~~yzzz{||xvuz||}z}{y{}{~~}{{~}|yxz}y}}~~||x{|yx{{|z}{~~}zy}~~z|y~xzy~~|~}~}|zx|z~~{|zxvw{||}zyy}~|~}~~z|}zzx{|{}~{}zy|}}xyz||{}}|}|zy}~{z|{|xzz~}~}~~|}~xy}{}{{yxvw||}|{~xz~~~}~}~~z}}~zyx|{{}~{}zz{~|xyz||{~|}}|yz}~z{{{{yz{~|~}~~|}~wz|{|{{ywvx}|}{|~x{~~}~~}~}y}}}zzx|{{~~{~yz{~{xzz{{{|~}|yz}{{{{{yz{|~~~|}~wz{z~|{|ywvx|{}{{~y{}~~~|}y}|~zzx|z{~}|}yz|}|wzz{{{~~~~}y{}|{|y}yzz|}~}}}~zyzy~}{}zxux{{}|{{{|~{}z{}zzy{zy}|}zy||~xzzzy{~~}y{}~}||y~{zz}}{~|~~|~{yxy|}{}{xuyzz|||~}|{~~|}zz}|zz{yy||~|zy{}~yzzzy|}~}z||~~|{z}{z{}}{~}~|~|yxy{}|}{xuyyz|||~~|{}||zz}|z{{yz||~|zy{}}yzzzy}}~}z||~~|{z~{z{}|{~~}}|}|xxy|||}{wvzy{|||~~{}}|{z{}{zzzx{|}~|zy|}{xzzzy~~~{z{~~~||{{}zz|}{}~~|~}zxyz~~{}|zvwyz||||~|{~~|}~zy|~}{zzzy|}~}|y{|~yyz{z{~~~zz|~~}{|z~z{z}|}~}~|}~~zwzy}~~|{|{xvwz{|}{|{~~}~}x|}~{{yzz{}~|~z{{}zxy{{|{~~~|yz|~{{{|{zz{}|~~{}~}}wzz{~~|{{|zxwx}{}{}z}~~~~~zy}}||zyz{|~~}|}z|||yxz{||{~~|{x}~|}z|{z{z}|}~~}z~}}zw{z}~}|{{{yyvz}|}{}z~~~}}yz}~||zy{{|~|}|z||{yxz{|||~{{x~}||z||z{{}|~~~|z}}yw{z~~|{{{{yyv{||}{|{~~}}y{}~~||zyz{|~|}|{||{yxz{||||{y~}}|{||z{{}|}~~}{~}}ywzz}~|{{{{yxwz||}{~{}}~}yz}~~||zyz{|~~}}|z||{yyz{{|}}{z|}}{{{~{{{||}~~~||~}{wyz{~}z{{|zwxy{{||}|}~|~zy|~}|{zyz|}~~|}{{|~~yzy{z{~~{{z~}|{{}~{||||}}{}}{xwzz}~z{|{{wyxz|{}|~|{~~{y{~~}|{{xy{|~}|}|{|}zzyzy{}{|z}|{{|~{||||}}{}}{ywzz}~z{|{{wzxy{{}||{~{y{~~}|{{xy{|~}|}|{}}~zzyzy|}{|z}|{{}~{||||}~}{~|{xwzz}}z|{{zwzxz{{}|~}~|}zy|~~}|{zxz{}~~~|}{{}~|zzyzy}~~~|{{~}|{|~|{||{}~}~||}{zwyz{~{z|{|yyyy{{||~||}|yz}~}}{{yy||~}}}}{|~~zzyzz{~~|{z~}|{{~~{|}{}~~~}{}|zxxz{}}y{{{{xyx{{{|~}~}}}zy|~}}|{zy||~~~}}}|{}~zzyy{{}}|{z}~|||{}|{|{|~~}{}|{yxy{|~~zz{{{yyxz|||}~}|}{yz}~}}|{x{|}~~~}}|||~~zyxz{}}~~{{{}{|{|~~{{|{}~~{|}{zxyz{}|y{z{{zyx{|||~~}}zz{~}}}|zx||}~~~~}}||}~|zyy{{}}}{z|}{|{|~{||{}~~~{||{yxyz|}~{y{z|zzxy||{|~}}|zz{~}}}|zx||}~~~}~}}|}~|zyy{{}}~{z|}{|{|~{||{}~~|||{yxxz||~|x{z{{zyy{|{|~~}}zzz~}}}|{x{|}~}~~}}}||~~}yzx{{|}~|{{~{|{{|{}z}~}~{||zxxy{{}xz{z|yzyz|{|~~|~{yy}~|~|{yy|{~}~~}}}|{~}z{yy{{~}}|z}}||{~}|}{|~~}|||zxxxz{}}yy{z|zzyy{{|}~}}|yy|~|~}{yx{{~}~~}}}}{}}{{yyz{}}~|z}~||{}~|}|{~~}|||{xxyz{}}zx{z{zzyy{{|}~}}|yz|~|~}{yx{{~}~~}}}}|}}{{yyz{}}~|z}~||{~~|}{|~~}|||zxxyz{}}yy{z{zzyy{||}}~{yz|}|~|{yy{|~}~}}}}}|~}z{yzz|}~}|{||{{}|}z}~~~~~||{yxxy{{~{xzz{{zzyz{||~}}zyz~|}~|zx{{}~}~~}}}~|}~|zzyz{}~~|{}~{|z~~|}{{~~}~|{{yxyx{{}}xx{z{{zyz||{~}~zzy}}|~|{yz||~}}}~}~||~~}zzyz{|~|{|~{|{||||{~~~~|{{zxyxz{|~}zxzz{{zzz{|{}~~{zzz}|~}|zy||}~}}}~~}~|~}{zyy{|}}{|~|{|{~|}{|~~~}|{{xxyx{{~~|yxzz{{zzz{|{}zzy|}|~|{zz||}~|~|}}}|~~{zyz{|}}z}~|{||~|}{}~~}|{{xxyx{{~~}{xyzz{{zzz||{~~zzy|}|~|{zz||}}|~|}}}}~~~{zyy{|}}{}~|||||}{|~~~}|{{xxyx{{~~}{xxzz{{zzz{|{~zzy{}|~}|zz||}}|~|~}}~|~}{zzy{|}~{|~}{|{~}}{{~~~~~}{{ywyxz{}~|yxzz{{{zz{|{~~~|zzz}|}~|zy{||}}}}}~}~}}~|{zyz|}~}{}||{}~}}{}~~~}|{zwxxy{{~~}yxyzz{|zzz{||~~zzz||}~|zy{||}}|~~|~}~}}~~}{{zy|}}~{}}|||~}}{}~~~}}{zxwyy{{}~}yxyzz{|zzz{||~zzz||}~}zzz||}}|~~|~}~}}~~}|zzy|}}~{}|||}~}}{}~}~}}zzwxyy{{~~}yxyzz{|z{z{||~zzz||}~|zz{||}}|}|~}~}}~}{zzz}|~}{~~|||~~}||~~}~~}|zywyxz{|~{xxyzz|{z{{||~{zz{||~~{zz{||}|}~|}~~~}}~~|zzy{}}~|}|||}~}}{}~~~}}zywxyy{{}~|yxxzz{|z{z|{}|zzz||}~|zz{||}|||~~}~}}~~|zzz{}}{}~}|||}}|}~~~}}zzwxyxz{}~}zxxyz{|z{{{||~zzz{|}~}{{z|||}{~~}|}~~}~}{zzz||~}|~|{|}~}||}~~~}|zywyyy{|}~{yxxzz|{{|z|{~|zzz{|}~|{{{||}|{~~|}~}~}}~~}{zzz}|||~|||~~~}||~~~~}{zxwyxy{|}zxxxzz|{{|{|{|zzz{|}~|{{{}|}||~~~|~~}~~}~~}zzz{}||}~|{|~~}||~~~~}{zxwyyy{|}{xxxzz|{{|{||~|zzz{|}~}{{{||||{~~~}}~}~~}~~}{zzz}|}|~|||~~||}~~~}}zywxyyz||~|xxxyz{|{|{{|}~{zzz{}~~{{{{||}{}~}|~~~~~}}}z{z{}}|}}||}~~}|}~~}}}{yxwyyz{|}~yxxxzz}{{|{|||zzz{|}~{z{{||}||~~|}~~~~}~}}{{z{}|}}~|{}~}|}~~}~~|yxwyyy{|}~zxxxzz||z|{||~|zzz{|}~|z{{||}||~}|}~~~~}~}}{{z{}|}}~||}~~}|}~~}~~{yxwyyz{|}~yxxxzz}{{|{||~|zzz{|}~{{{{|{}{|~}}|}~~~~}}}{{z|}}}~~||~~|}}~}}}}zxwxyyz||~~|xxxyz{}{|{{|}}{z{z|}~}z|{||||{}~}}}~~~}~}}|z{z}}~~}~}{}~}}}}~}~}|yxxyyy{|}~}yxxxzz||{|{|}}{z{z{}}~{|{{|{|{|~}}}~~~~~}~}}z{z|}~~}~}{}~~~|}}~}}|yxxxyy{||~zxxwyz||||{{}~|zzzz|}~|||{|||{{}}}}}~~~}}~{{{{}}}~~||~~|}}~~~~}zxxxyyy||}~|xxxxz{||||{|~}{z{z{}}}||{{|{{{|}}|}}~~~~}~}}{{{|}~~}~~||~~|}}~~~|zxxxyyz||~~|xxwxz{||||{|~}{z{z{}}}||{{|{{{|}}}}}~~~~~}}}{{{|}~~}~~|}~~}}}}~~|zxxxyyz||~~}|yxxyz{||||{|~}|z{z{|}}||||||{{{|}}}}~~~~~~}}|{{|}~~~~~}}~~~}}}~~~}{yxxyyz{|}~~|zyyyz{||||||~~|{{{{||}}||||||{{|}}}}~~~~~~~~~}|{|}~~~~~}~~~~~}}~~~|zyyyyz{|}~~}{zyyz{|}||||}~~}|{{{||}}|||||||{|}}}}~~~~~~~~}|||}}~~~}~~~~~}}}~~}{zyyyz{|}~~}{zyyz{|}||||}~}||{{||}}|||||||{|}}}}~~~~~~}}||}}~~~~~~~~}}}~~}{zyyzz{|}~~}{zyyz{|}|||}}~~}||{{|}}}}||}|||||}}}}~~~~~~}}||}~~~~~~~~~}}~~~|{zyzz{|}~~~|{zzz{|}}|||}~~}||{||}}}}|}}||||}}}}~~~~~~~}}|}~~~~~~~~}~~~}{zzzz{|}}~~}|{zz{{|}}}|}~~}|||||}}}}}}}|||||}}~~~~~~~}}}}}~~~~~~~~~~~}|{zzz{{|}~~}|{zzz{|}}}}}~}|||||}}~~}}}}||||}}~~~~~~~~}}}}~~~~~~~~|{{{z{{|}~~~}|{z{{|}}}}}}~~}|||||}}~~}}}}||||}}~~~~~~~~}}}}~~~~~~~~|{{{{{||}~~~}|{{{{|}}}}}}~}||||}}~~~}}}}||||}~~~~~~~~~}}}~~~~~~~~~}|{{{{||}~~~}|{{{{|}}}}}~~}}|||}}~~~}}}}||||}~~~~~~~~~}}}~~~~~~~~}||{{|||}~~~}|{{{{|}~~}}~~~}}||}}~~~~}}}}}||}~~~~~~~~~~}}~~~~~~~~}|{{|||}~~~~}||{{|}}~}}~~~}}}|}}~~~~}}}}}|}}}~~~~~~~~~~~~~~~~~}|{{|||}~~~~}||{{|}~~~}~~~}}}|}}~~~~}}}}}}}}}~~~~~~~~~~~~~~~~}|||||}}~~~~}||{||}~~~}~~~~}}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~}|||||}}~~~}}||||}}~~~~~~~}}}}}~~~~~}}}}}}}}~~~~~~~~~~~~~~}}||||}}~~~~}|||||}~~~~~~}}}}}}~~~~~}}}}}}}~~~~~~~~~~~~}}||}}}~~~~~}||||}~~~~~~~~}}}}}~~~~~~}}}}}}}~~~~~~~~~~~~~}}}||}}~~~~~}}|||}}~~~~~~~}}}}~~~~~~~}}}}}}~~~~~~~~~~~}}}|}}}~~~~~}}||}}}~~~~~~~~}}}}~~~~~~~}}}}}}~~~~~~~~~}}}}}}}~~~~~}}|}}}~~~~~~~~}}}}~~~~~~~~}}}}}~~~~~~~~~}}}}}}~~~~~}}}}}}~~~~~~~~~~}}~~~~~~~~~}}}}~~~~~~~~~}}}}}~~~~~~}}}}}~~~~~~~~~~}}~~~~~~~~~~}}}~~~~~~~~}}}}}~~~~~~}}}}}~~~~~~~~~~}~~~~~~~~~~~~}~~~~~~~}}}}~~~~~~~~}}}}~~~~~~~~~}~~~~~~~~~~~~}~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m32.bin b/applications/SprPoP/dist/MUS/m32.bin deleted file mode 100644 index 4dbae7b..0000000 --- a/applications/SprPoP/dist/MUS/m32.bin +++ /dev/null @@ -1 +0,0 @@ -}xuj[NSXYfhsx}~y~hkfr}z}zufjcUSlvtj_f`}{uqw|iuePnse^iceemxqwtnqr{svlqwqkwu{gtt~|{ntpzlpmorn{z}|stszyo^hijm{z|xwqm|{lr}vwotszxx{rxqjjkpks~jpahy}xd_\~pmomi|~z|r}joolqtrxw~v~ncelp|vzxx~~whtjwtwyy~{rmY[cvxagj^`ceblmreiimrktyzoukyur|yrwdgjirlwwvuvwtu{|oZ`Zpyq~tqqgq^b]foqhhmfzt~vvqkhfckv{{|wvzw~zxu}s|qz~vodZb`b`w}|mlgeajondrlxvpwtsxv~suj{s{wsvuxxxz{~xzr|~||}}yed`]hcqy}wnkixyyinerts}o~{sxttoy|u|ynofuiqjeulsy|||zz~un_gedSWZlxz~q|y}wy~x~x~twtxuwv|{~ty{}y}xr}q||trquxxv|{{xw~|jkibj\\m}zrtqitsp{lxvszwzu|~yu~ojdoakc]f\dhmrvy~}}~qcmmoZSLYbi{~|ryzv{xutq|w|{}w~vv}n}x~~r}}unvwp}nvuqytvqu~wkvknp`bkhoy}{vo{ouukvouwuxt~wy~}p{zqruepb`b[d_cdiy}t~rjoryg\R[TVeawsv{}y{xvpy|pz|}}ozrryq{xqxwn{nqqqysvrqzvmzqqxjlqhikn{vtuyjqmtwtxrxwwy~nsyyxowncg`hcbb_ksmz|wlqs~vf\`]P]SYcpxtzzz|{|ts{rpwzy}nxzujs{vu}pxwkqmxwuwpuznu{p}yqwrlnhnv{z~r~tmmmwsuvqy{rztmu{yv}tpkghmfgd`iig|{pntzue_fZV^OSUet|qv|}ruz}}wuzpuvzqwwkcnzux|ozwmnnxuvysvynx|s}w{soqjnst|x}uyqnpwrtwrwzr|qnwwt}|suokmpijibhhdwx{oox}xgaf^U`RPO[fl|~puqq{uw~~w|vuy~vtui`kxwyst|ponwutyxu|vwv|}yrqnjssvpzx~tsszutwuu}w~{sq|ys|~r~{rorvomoihlftxt~pu~~yjdjcV`WPOX_amz}yp{qpyrpyz|y~{z|~xssgbox{~|tzuv}qnqzvuxyu|y~x}zvtpjrsrir~x|xuyyxzwt{x}rytr|{syspxzttslmolyus|~vq~}wihma]dWQQ\Z\dnq}|qs{pvxlryqr{|{{yvqelw{xyqo{|s{rnvzwxzvuzy|xzxrnurlgtoktv|yy~}~uww|wwzovzpy~uqw}xyzwnqny|q{}}xnyqioh_ibWRZZY[aagssp|tuynoxplq}}~~ximv}{ysjsuo|wsyzvy{yrwv}y|zxszumfrlbfdey~{ww{||tvvlu{uqx{xz|}tuq|}t}{wnw}{rshblg_\aYZZ^XY`kwuz{{xlsypkrusz}ruuworjhx{wwyyw|xstw~}~}||xxxmktibcY\eq|}zz}}|rjuwrr{uuw{|uyy|vzy}ztww{xifnibdi^]Y_WUW`nkv{{msxsntrnqt|x~y}xwuidprrvz|y|xswz|y~zv{srwlcdZZ\`oz}}~~}zlrvroywtuv{rwzy{{z}x}vsiongelcd__\UY\gccstszvquynrnvqs{~w}|~}ugkqmlxzy}{tuxyw{|urzyjc_Z_Ydju|{yxuxxrxvpryqwuywqv}~xxy|}}qpvpgikagaf\VZbj`box|rw~yrwvquovnou|yt}z~vlpsnktqv||yyz~{||uqyylf]W_]jjpspwx|yuoqz~ws|{srwowu{}tw}x~{zz}~}{rpxwommbgahf]]ajecmrxtss}}xywnwrzuot}|}{rz}xmqxuosqmww~~~xrvynfaY_^injpjnom{~~vokxz}rw|zvxnquwz|~z|y{~{pmvyuttdhdeiadflfblrunzvt{|y||qvpzzsu||zws~}powxtvplup~}wyznc^[gekjemiifdp~zuoozz}w{|yy|osqvy}~|}xwu}pmuyvxukndkjcgmqgbjpqlxwzy~}y~wvzq{wwzz~ztqt{txyww{orrs}x~}~zkc\bjktfeihf^_luztomyy{x{~y{ttwnywxztpvxsvxwxzntplpggkrnhjkmists|w|~xr|u|ysyzx~~sop||zu{}x{suvpzvwvjadhhwokidc\[cimsyy}tmvvy~|zwuz~rsyrztsz}upsz}vu|~yxwowqsvkknrlinplerprvmtx}wuzt|vw~yy{~zypqvt}vs{{pzvv{sv{|tjlfiuoupg^W[cedifjyzzvvnzvnkvswus~vsw}}z~{svttxu|}unyrvysqrslhmqokrkrukmnr|yy{s~|{}~|wz}}w}}~xusm~sqx~uzuxywz{yzuuihvpuuofYX`edd]^kgx}|~qxxnhlu{~vzzq{yyz{yuz{yvo~z|~qwrs}wwzypklnonwrlsmmmlq{}{~v|z}zuz}{{~zy|ou~yqry}}y|s}~}~}xy~zxwlvvtwpkc]^`becZbbcrv{}zvwkhnstyxs}xx}xyytw}}vu{|zx~qv{y{}~vooqnozruthkmosxvssx|~|z|||{}ywxs{|urvyz|{s|y}}zz~|xzwq~uuoh`^beb``[ea`npu}}xx~yvolnqsspp}xy}|~zxz|y}{}}zy{yuzy}y||xvsppxqszojhlsyuomnvz|}{{{~}yys~|ywuqt{~|ztw~xvtxv{xpjc\^dgfaW_gakorz}{}tmmqtsrqjsyw|~~|z~~|}|ysu~xz{}{z{wrztowromjmtuoihqu~~~zy|{z{}~{upmry}~tvw|xyvzxvnd_`cege\_b`lqqv}}~ypjovwuojtrr{{~}~|vrsx~z{}|}|{|~rtwnmnoppnkhinp~}~{|}zz}yz{wnkox|}{v}zw}{}{zzuqhacfed`_h^^kpsuxy{}zwrqqtwumotmu|~|}|{~~}uquz||~{{}~}vztnlnsvqgdfkkp|z}~~xtx~||ywtpnrvyys|u}|~z|zunkkihf_]hdaggmruqpuz}wtvywttosvkryy~}}~{}||~yvvy{{xy|{}~vponqvtmdafdmyrtxx{~|}|vtttv~wqquvutsr{yx~y~zvqorrmhaaf`fkgfkoljkpt~zuw}~zrlwvotuvx{~~~|{~{|xx{xy||zytt~|~wqrtusokgc\huppppnnxzttql~}sosyzvolxwt~~~}}|~vqsuvuqddj_ckkkigghjklu~z~zy{~{rsupxyuvyxuz~~|wrytz|uq{ww}|wvxvokjja^moqqlhfiq}|wskt~}zustwzxnpupz~~~||~~uprxyvqjlgbhhjmnibejmnvvv|}~|yw}rpz{{yxvttz}~xx{yx}wt{tw}~~{uoifhbipinpmfafmsy~{zzvmxz|~wuxywvurwtmw}|{~{usuwxrltmdkkjkomiefkpyur~~}~wuyvyy}~xtvxy~|yz}x~zxz~~{|yyuw~|piffajwojhigddhosuvvtxu}yyyvuuuz}zuot|suz{~{{~~xwzyvusostlpomnnlklljiszt{|z}|v{{x{}{xxz{vsw{~}{vtz}vu}z~|~~wnfhfhtplkeaadilnqps{wvu~xvupmsy{|{ssxs{{}xz~}{uv|~xslswotwspqoiimomqsq|}wx|x|w~~}|z{~zuvwxtux|zv}{~}~uonlgoujjkhb[`hmnljrzx|z|}x}|xrnlov||yu{wr{{|}~yy{}~uovrszxyxsnkijmqwonywvvw~z~{z~}|~wvzzwysuz{||y{vzuprqowqjigea^_ejlggrpuzz~}|}}xpkmqtxztz}uy|~{|}}~|~}}{zwzspy{{{{ulkljmwsptoqtvx{}zx~}z}{}{uvzz~}ywwxzzwu~y~~{vuvpu~snmhb`accbecflfnwz~|z~|ztonpsrqq{yv~}{}|y{vzsq}wtvrrss|vkjjrz}zwv|v}}zwqjkwzik}zx~srz|vppv|v{uulizjhuytwyyxzsjo{~|ri`Y\dlpohf_Tcyvny}xuw}{oga[gkktvurpmpx~vzv||yutxy|okovz|~|{rihhhlu|xgn}y{vrx}{{}ysqqmiyvljq~zxlfrz}~{pefttvytlgefhgcXPUU^nv|zppx~ukgozy|}wv{~wsrpiw{unijqvxz{yrmkjjjliejfbba`cinsvyurzxz}zy}tuxlgjpt{~}|{wposvtv{uywx~xvqkbWUWWWWTY^Zhuz}~|wrsy}}woifkqutpwzv{ry||}x}z~{umkosx|zyvuyrinideiosrqsvyut|x{|zy}~zz{wzvxz{}|z}~}ytkeglrvv|}zrlheeec_enilsx}~xvvwz|uolllkkmjmpjpvw}~|zwuzvxzx|{z}}zsrqty|xqnsxwyywwxx{~|{~}yzrqtxzwplknswzxrmjklmortv~xuwuqnjiqorxvw||xwxy}|xrklpqniejpikopruyxvwxuw{v}ww{~ywxyzwsooruxwwurv|~}}x}xspsxvngfkkp~{vwtnhhnsrqos~|}{{|}{tlnrkrxxxwyyyyxxyrnnpsrnejmjppnprqruwwx}zu~{yy}zz{vqopsoszxwtrpry}zzxvturnihjjtxuwvtokkosvrmtxx|z~}vpsnmstwywrrvxxz}|srssrrmnnfnsrqqqnnrwx~y}}z}||~~|}yrmlpprytuxvplnsw}}zz{|yqmlllhrvptvupnopqrsptsq|}~xxzoosrsvwsonruz}w|~~zxxuqmtsknprtsollmpv~}{}xx{}zyz}||tpnmktztsttokkortvx~|}xolomktsqsqqonpsrplmwrpwy~{{~vuussstrqpnox|vz|yz}}yuottpurpsusnlmnoy{z{xx|zuuyxz|}~}uqoioywxtomklmnoomv~{~yrnlkvwstrnjkorssojqrqwvw{{{zz}xuttpoqsqqwuy}wvwz|tuwpuywtstrqpnnswt}{{{z|~}{utts{y{{ytmkvvvyvngglonmjjssy{xuskmyyxwqlhgmrsroormqyyxy|}~{|z~~|xuqoprswwpx|xvux|zzyswyzzytqrtsqvvry|{{{}~|xvwwsr{wz}~~{ztpywuvtpjfgloojiqor}|vtvrtzwyyumggilpsopvppvx|~|z{y}}uqqqqv|uuwvwwwy|zxywz|z{}|wrsvvzzswyux{}ztqtxw~|z{}~}{~}{{{y}utqnkiiijlmkppnw|xtuuw~vuurlhiklmnovttyxy}{|}~ytsrtyvx{trtxzzwtsu~~~~~|zwuu{xyzutuz~{vrrvx~~}{}~}|y~|x{~}zuqmhfilljhiqrnuy||wyxy{wromlmmllikvtu||{|~~~~}{wsvxrwzurpsxyupoty}~{{|zw{|y~zttsuz|xttwwx|{yz}~zx}{}}~zslhfilmlfgonrwwz~~}z}}{unknqqnkhmpqy|}~~|z}~~|yzutxttsqqttqnnsu}~{{}}}v}~yvstvvvusvyw~{vuz~~x}|z~|tkhijkkhhkgltuvx{{|~{uomprrnhlmjsy{}}yy{}}wvysqrstrommnonw~~~}~{}{yywvvvrpruuw}}wtv{}~{{xyzsnllkifjleinqsutsux~|xusqqrolokjprv{|{zyyz~~|{}|~~}{trpruvqjhkmksyx}}xxyzyvrnmqrt}zywwxy{yy|z}}ywuqmkehlgkkjnrsppruyzwxyvronspkopqsxzxyzzz~|z{y{~{urqrtsojgihnwuwzzyzzwy||wqmmmmy~|vtx{zxwu|}z}~}zzzwqjgkghnnllopppqsw{xy{zwontpqsqqstuwy{|~|~|zw}}|{ustsomkjhdowuwwussx|z{|xsonmlw|~}wtuy|{wtz{{}{y{{zwpjlhglmoonlmprsu|{~~{{{{zustorwvuuussx|}~~z~|{~{}}~|xusoighkhmsrvwtporw}{wtrrqow{y}~zxwxy{{xz{x~~yxz{yuprmgklloqpllptv{{z~}{xv{vqvyzzyvtuw{}|}~}}}~~}{{wpieeijpvporsqnosw{zrpswuz}xxz{zxy{{zyx}~x}~}~{zyywrvsmnmmmopnnmos{{y~~yw|yxzxy|}zvvwx|zxz|z{~}}{}~}}|ztkffihqupommmmortwxy|vrswy~xywvuwz|}|xv}}|{|~~~{xtuysstpnnnllnonpwvz}z{}z|}y~|{|}{yxxx}{x{~|ywz}~zx~}~~zsnjjhlropplhgjoqrrqv~~zxwwu}{yvrquz||{w{zy}{}~~}wtyuuxwspoljkmnpsotzxwwy}{~~{yz{zy}}z}|{|{}ywxz|}{x|z||wsqojmrnopnieeimonkpuu~}z|zx~}wrpruy{yx}yx~~}|}z{zzuxzyxvqljjjlqrlpsrstuxzy{~yy{||{z}~|zz}{|}yxyyywy}wy~~yvutorsppomifeegjjhlnmtz~}|||urrstvvw|yy||~}~|z{}z}|~wx{{{zxsmkkjnqnqplnqsuutsty|z{}{~|z{~{yzz|~}{yxuu|yy||~~~|xwwsv{vsrniffggeedhmimruz{~zvttssrqxzx}~}~|xyz{~{|}{{||yvspmmqnnsplkmqtspoptv|}{yyz~~{zzw~~|xtvyw{}}ywwu{~{zuoieeghgdagjinprv{}xvwwvtqouwx~~}{zywz}~~}~}}}{yxvsprnmqomlklpqnlmpqy}~{yyz|}|{{}z|}~wwzvy~~}{yv|}}ztlfeefggcegfmqrtxz|{vuxyxtpsus{~{xx{|{}{|}}zzzywxsmqollmmmlkkloru~~|zzzyvwy}~}{}}|}xx}}}|}|~~}|xslgfgffdfiehoruwyy{~zxwxxxsuvrw{zwvy}~~{{}|z{{z|yssokjjlmkgehoru~~|}}|{wtru|}}~}|{~}~}}~}|ytpnkigebfifjlnsvwvx{}||{ywvuyvtxy{{vvz{}|}~~~}}{{|yyxpljijkjfdflow|y|~|{|}{vrruy}}~~}}~~{xtrrplhcdgdhlklosstvx{~}~~|wsxyvyyyz}|yyy{}z{}~~}{{}}||}xrmkkjhfeeggoxvxyyyz~|}}yustuv}{}|z}|}zvvvusngfgcfjjkkklorsuz~~{wywv{zyyzyz}~}}y{~yx|~~|xz}{}{xtpnlhedffdkprvvtrsv|}zxvusu}~~||~|{~|~|{{}~yxxxvsmlidghhjkjghloqvww~~|~xvz{{zzxvx{~~|}|zy{||yy|x|}|yxuqkgddedjmlqsspnptw|{xwxvt{{|}~~}}|}|{|{{|~}|}|{zywsrrkijhhjjiggilqurvzz}}z{{{|}zwvwy{}}~~~{z{{zyyy}zy}~}|{{zumheecfnmmnoommnqsuw}}xvxvz~|}~}||}~~|y|}~~}|~~{y{}|ywtvuppmjjjihiiiiosrwwvx{}~||}|zyxxz}{}}}zxz||zvw}{{~~}|||xrlhgdgnnooljikmopqqu~{yxv{~{xwy}~z{~|~~~|yy{{}ytvwsttqnlkhhjkknpouwuvwz~}~||||{z}~}~}}~{xxz{|zwzzz}|{yupnmjhnnmnnkgfjnpqpqxz~~{{|{{}yvuw{~}}}~~}|{zz}|ywytvxvusokiijkoqmpttuuvy||~|{|}}~{~{|zyzzzzy|{x~|yurprqorolmljhggjmoopuvx|{~~~zvuvxz||}~~~~~zwx{~|}{vxyyxwtokjjkopnqporsuwwvw{}|}~|}|~}z{~|{zywx}zz}~ytrsutvxqnmjgfghhikkpsrw|~~|ywvvwwwy~~}}}~}yvv{}}}|{{zzzyvsomkloloqmlmpstsqsw}}~~{{{~~|{}~}zwvzyz~}}zutvvy}xuqmieegihgejonrvx|}yxxxwvutz||~}}}|yxwxy~~}||{yvurnnokmolkjknponnquy~~{zyz}~}{|}|}xwzwy}}}}}~{yxv|~|{xrkgfgggfcfhhnqrux{~{xyzywsswuy~}{xxxyw{}}~~|zyxwutqlnmkkjjjkkjkmnqz~}{zzzzyz{}|~|z{vx{{}~}{{}~~}y}~~zslihgfecfecilnprtux~|zzzyvsvtty|}ywwyxz}|}~}{zzyzyrqpljjkkkhfgilkry{~}||{zwuvz{|}|xzz{|~}{z{~~~~{uqmjhfcdgddgiloqqruy}~|zyvwxsuxy|~yvwxw~}|}}}~~}|{{}|wwrmkijkkgdcgiksvx|~||}|zvtsvx|~~}~|{|}}||||~~|wusplhddgefihimopqrux~}yvxzvwxxy|~}yxxx}}|}~}}|{~|~~z{ysnkjjigedegiqvvy{{||{||xusuvx~}~~}|}~~~|xvuuroiegfeijkkmnprtvy~zwyxx{zz{||~}||z}}zz}~}{|{||xtpljifddfhhnttwxxxx|}{zxvuvww~~~||}~~zwvvusokkgfijklmllosux|}|{|wx|||||zz}~}~}{z{}~~{}~|}~}ywtqnjecbfiiopptvvuux|}zvuvxxy~~}}}}}{|}zyxwuqpoiijijlmkklorwzy}}}y{{|}}{zz{}~|~}{{{{{|{||}|zxvtqkfcdfglpnoprrqsvy|zvuwyz~|~~~~~}~}}~}{z{}{ywtttonmjjjkjjjklquuxzz|}~}{|}|zyzz|||}zz{|{zxz~{|}{zywrlhffeknmonmlmoqstvw~zxxwz~~}{z|~}}~~~||~}zyz|}}yvwwstrnlkihhijjmoouutux{~}|{{zzyz~}~}~~~zzz{{zvxzy|~~~~||zvrnlifkmmoolihknopppvy}~||yy~{xx{}}}}}~~}||||zyyzz~yzyvwwurolihhijlljoqpqrtwz||z{{{{}{{~~~}~{z{zzxxzwy}}~~~}zvtrplmnmnonkhghklmlorsy~|~zwwxz||{~|~}}}}}{yxyzy{}}yxzyxvsokiiiknkkmlnoprtuux}~|{||~~z|}|}}|}~|{zywzzwy{}~}~zwuusqtropomjhhghijjnopuy~{xwxxxyz~}}}||}}|xvwzz}|{{zzyxtpmkjkmkmnkklnqrqqrv|~}|~|}}{z{}}{|~}{ywyzx{|{}~}xuuvuyyuspmigghhggglonsvy}~{yyyxwvv{}}}|{{{ywvxz}}|{{yvtrnlnlknmkjjlopoorw{~~~|zyy{}}||}}yy{y{~}}~|yxxw{}yxtokgghiihfimmruwz}{yyzzxwuxz{~|{zwwwzz|~|zxwvtqqmkmlkjjjkllmpux}}~}{yxyyyy{}|{{y{}~~}~~||||z~~{zxsmihhhhgfiijpsuxz|}zyzzywvxwy~~|yvvx{{~~~{zyxwvuonmjiiiiihhkosu}}|{zyxwuvy~{z||}~}}}~~}|yupljihgegigjmpsvwxz~~|{zyxwywvy{~}xvvyz}~}~}{zzzzusqlihhiigeeinpv{||{zzzxutuy|}}||}~}}||}}yuspmjgeghfhijmprrtwz~~}ussssspnmrvq{xronnortsyur}tikorttusneXUewoctxm~|~}vsux}yik}wvsx~{sqt|slttrstxz|}{uszv~}qvxspsuttlaZ_lz~wlgp|wtqokikimv~vor}}xusstuvzxnsznpzzw{vqqt|~{xuqi`XV^m{xkgo}{xwy|sjp}trw~}zwsru||uqnry{|}}}{xtsw|z~|wpoonsvwtne^\`hr}ywxwvsrnkllnry}wtwwxxxwvtrswxtty~{vux~~{wrlf_XYcmz{snnpsvw{~}|xvtsqpnpt{zwvx{}vpmnrw{yvu}ytpmieda^acglqtuvwwuurorstx|}yvqmjkotz}xtsqu}|yvuttwvy~~|wtrrqpnmnqsrrphedefhlrx}|unjiklt|~||}|zxwwwxwvsspkheb`_]\\]`djnouwxz}{wtqpprttuuuxwvwwwxzzzzz{{~~}}yvspmje`[Z\_dnruy{|||}~~~~yusqpqsuxxxwx{yzzyxyyxvvtstwuwxvtrrrrpnnqw|~~~z{zxwwvuuvvuxzz~{{yvwvsrqqppppquwx|}{zxwwwuttx|~zvsqmklhfedbacgjmopsy{~zwtqpqtv||zyzzyurrqnnlifda``acdgghmnnnoqsvx||xtstuuvttvtvyxyyyyz}}zutuuv{{tpjiijjovv~yut|{kkwrgfny{qp}lzozzpkhgjou~uq|{yz}ji|~hcxthejsy}|wuxvrnnwuenqgo}us}yyy}yxxvsonpwvdZ[cmqpib^\[^aahp|}ysnnxxqqv~}|{xwwwx~|tsy}xvuqsy}wgZXcpuna[Y\bhmoonkilpw|{uv{yvvy}}~|}skluztrrstrlgccdfpw|}umgb_^_afghkmry~vqnnqv{~vqpvunjiihfdcdiny}yvwwtuuuywmfbbinrux|}uonqv~ysollmmllnrv}wrrrqtwy}|z{zunid_]]_cfhhinoprrqpoopt{}yuuwx{{{}}}~}|xyzwvtsrruz~~ytplhghjlqttvuqmjgffffgkpv}wstsssuwz|}}}~|{}|{{ywuuwxyyvuusrsqomkjkosx~~~~}}ywtrpmmoosx{|{yvrnmnoonlnnmprrrrqqtx}|zz|~|wrkeda__`aabbceghjprv{}|{{}~}|}}yyzy{}~}{zyyvvvsrpmida_^]]\]][]_`bdfimt|}}}{{{{zxusrrsruutuvusrstvxyy|{xyxwwwustuwy||yyvrpnnmljilptx}yyvtstttsqpquwx||{|{{zyyyzzyxyvssqqqrstvy|~vzz|zwrsjce`aefilox~|otuhjsy~zupr~xwrqx}xrtrr~ynrrecluyvojfeiqyymt}{{ty{nhhiiijklmwxv|~tpt|tt|zrxvfhv|ug\YWWZZ[_gp{~vtx~~|qpu~yuu{xvzyuqr|smv~{}vnkmw|~ztmgc__bgnwwpr{sonpsuusqpnnsy~tt|wqopxwtx}qf^]]\`aa```bhox|tty|xwux~xtsw~xutsvyz{{{{}xpic_\YWWZ]`hpx|uqrx}z}~~~zwwx|~zxzyyyyxz}}zxvuuwz~|smjijkmonpqqrqoljjihijkqw}{wwvvvwyz~}{{|~wronpquz{~{ywuqqqpooonkhfdedcdcadgkou}}yxy|}{wuttwyy|{wtrqqqoppprtvwxwwxz||~~||}~{uspnnoooprvz}xtstrssstutrpooortsuvuvwxzzywvwwvwwuuvwxz~{vrppqrwxxyywtrpnmmnqwz}}{yxwuqnmmlnppqtvx|~xsolkigfdbaa`__^^^abcghiloty|}}zwspmnpprtuwyz{|}||||yzzvtrqpnkgda_]`aadefgjosw{}~}|zxutvvwz{{{|{zzxvuusrtsrqqrssrrrssw|~}zwtrpppqqsutxzz{|~~|yzzywvussrqqrrquwwupjb^`kfni`]RMV`g{yzvy{zimrzrpz}}}}n|yzsghv{tc|v}ympmnz~|biy}sqywy~zw[P_tz||zx|~onktvu|tyyze_swgflz{mfehq~z~}~xz|w|}~ttv]F\is|kaa\feips}xtwolow`[WWg~~{q^jrtt{uuuvy}xkkwvdTOXZejpxwuqtz~ha^XQ\gu{y~swfct{xx}ysp~}x{|thmtuw\WSPVlw|vzo__XIWkuu~pfozmlw{w{|zrgmlotw|~umljfuvkqsnmuruv{tuwtox|~xqsnjcfzqiicWV\_jwommhhvzmirogpz}{~{}|xyztrp}~ywvyy~yvy~zlkwn\Z_des{}zkcef`cklnqvz{{~tw{yw{~~~ypw{poqpxwlY_mdYZ[YWbhms|~pl|ykjkkdhjiiot}{wzytpm~{vqmj`cb`]dfqv{~pfdc\_deflpswomqvrqemullmkm{|xuuvuw~upnhlqtuy{zytqttsy|wwoogj~sevz}nq~pea_ZY[[X^dky|wsqnkoonpzz}|}yp}~{oijjr{{xogc_]_`^dmqzsstxssf]kre_][X[^ck}||vmyz~~xlf_YTPHIRXmtwqmgfd`\feokihmiieYYjldgryutsuw|{{vusstsswtskjgilrs~zyurqik}~}wypnx}~{|vr}}mca]XSQJX]pz~ttsrpqjsw}tnq}umoprv|}zztdca`]_Ycgmuquvxuwkedrn^\_cgnps}{|{xytwojmrif`XUQSch{~}pnkfaaZedlmlmnllj__i|~yxuorsrvxzsttqopjuu~vrt}qt||ztrmqgdj~~~z}vrkmwsc\^\Y^bhxz~rrqmjlfrpwxxyxwz{sytu|yiafhhnuy~xjikfac\egjomolkkl\X`llgkw{x{xw|}~zzx}sjs}~y}qvzrdY]^]aggtr{}vrrlfhafgeidfbdirin{s|zsginlnz~zv{ysvvx~}|z~ofy|~w{{xutpptrcr|v||}~uanrhg_cnpovsx{y|ypvvqstrzuywz{jtzlja_jpvzv{uqeiiddjhrnonnnkjpi`z~yx|xtzw{|xzwzustucrz~|hw{osnnxvpsprxv}~ymrqihjgojlmsy}wxz}|{eryklges|~}}{nruqrxw~zyy{|{||}}~wwsrlhkl]qz~zuzyw|{}|{ytquk^txrzvv~zuyy~~z}{vlrpjmqryv|{zn\lk_b_dw}|uncjjegjhmhhilnouxx~~tw}xw||}|ywroupcx}sxss}|}}{on}~stuljpqwvw~tnrlgklquu|r{~{wr|~{{y{ieupknlz||zqqxsptu{|xz~y{uy{}vspplhkqccxzy|vv}qqvpqwz|wy{|ws{zo}yrxsorsvyw|}|}uksqlnt{|{v{q`frnpnuy~umfmfadgknjow|{pvupsvxzsprtsnmsjaixvuozyw~yx|~}~|rxqjhilqosz~~}qvskmr{zv}rtxnmptyzwy||ytzwlgt|{yyuinlhjlpttzy{xvvtsojmoniahg`[ftur{}sjrpkklorontwzyuxxnnptwvsx|w|}okqlnvx~zvx{yx}~|srxqmk|{ouxu{}|kgmebbejos~zwpyvqonqropvvsklsld^nz{z}xw}urtx|zvzzlojefillhgqw~}tw|{v{}miqlmosutqu{{ysz}}~s{zxz}wwkmohimv{uzpkilnnjiljjcgjd_az~r{zmkngijopqpyuksommnomjlv{}~|vzr{}|rowssqtwxuuzy{w}{~tmutqu}wvjhkfkqw~vlpighlrrliopqjjqmjr~vzoksnoou{zqinkfdbfgghsx{y{{sx}qlgojgglturpy||ttwt{yq~}pkfppywkllgjkpmhbhifebnpq{}wokekjgkp}}~{uqosjihostruzx}{xzw~wuooojoryzyu|uvyojgrs{~}trnw~{wnihmjnmpsrnnqptr}~zsrmorqzv{wnjcd\^`gopmluy~|vsyx~}zz}wy~|~nq{{z}ze\bry^Xlvdanutikktus}nlx{h]l{y{ykinqtcZ[ntkljsw{}yi[\fq~~xz{la\o~rr~}ps}z|xyjeloktxscSbvwf`m~}tqyz~hbbwxzqpz~qojf_TSS`kvy||xwxl\[Ydkx|txxhefrzzyot|~|zyy{|tb[RYcp{xnhqrwwxypp}ssv~vztmmsjhovqhh^YSYfnrwuuxvsqvlacofc_fpv}{{sriaaokedfppurvxvv~~{z|vi]^ZY_hzx{xrp|xxz|yuzuleu{{}}tw|ng^]QKKPWX[bs}~}rkftrifku}}{qytnmtrwutqnns||ytrz~zound\XVQX]n}|wlxz}yuzriuuma[XUXTYZ]`o~{w}y~~sp{wsrxmusmfkonnipsspw{xxv}~zyzy|v|~wfbpkaWZY^fu||y{|}qppk``meWMROMJJSV]hx~t{ys|upuojjnurnmx{{utrwuzztlqtswswpg^dlbXT[\ipy}z~yvorqndeka\XZSSTYdmsvw{}{suv~vwljwsnfeafklqruw|{{}z|wtpsxy{qpomcfmea`msz~~y~}}yvpqilngYVb\ULMKMR[kpsu||~{}st{pefkjmjsy|yvuxsuomrqnpxtqjmqh_aneehrtvzx~|v{|uyvttrtg\aof\VW]]jqyz{xpusv|~vwojnwm`abheinx}{sssxyzwysrvsujfozwz{|~vy||{~~|vpqqqrid\Zaf\SSR]ckmuyvtx~z}}~ztvwrmmhkjqw~~~ytpkhlkuxvllqstllffr|wvuvpv{|z~~xsnv~}w~zty{wrinieimgbdjtrwwy|}|}~tsqyyww|}~{|xyuwmbhsnfbajlw}qsqpuyzts||ywuxqzzw{}z|ur~uvz~wsswutrtmikji\Zdibfghlijirzyru{w~}~y~xmpz}njimu~~okgjionoosssuqvsw{y|vqmvsoot~|{}tuspspry|w{{wzw{zuvx|tqmgjyyvsvnos{}xvyzrqz|yootx|{|}|{zysx}{wlpngenmgflyyxsywvqs~|w}~}{usz~{{{{yyxmlzss{|~rsnnouxrjmvsqiklfgs~vpffdilhlnru|}xw|xt{{w~~~x}~}~||{|qgq{wzy~~}wuzupqjejntpmnvx{r}ojmmroutlhlnnuqslihs|trs||{wy|zyuyy}xxxv}~y|qrwsoksyyw}|vxuyzzrw|zxtuotv}||qmnmruuqqpvtpnie`r}ztwwsv{|vtuzwwxzz|v}zyywtsrpx{~wqvwrjtzws}uourqijrsnkopsr}{uszvqmmcbejpoplmosrv~vm{y}~{zvvu|}tvwxzvsz|zw{ytxknqmkhpru|yw}zupqmkcdgeejqljhorlcduz}tsv}}xty~{{~qqnsstyumlsqwz{{rprwrvx~~qmmhnopmjmqunomoswtuvnsxyuv~|uyz|y{pmmnquvttpxxvtoln~v}~wnkipopoppr~wouujciihiihefelrxxrvzyx{sxxzvry~}y{{}|{{ux}}sz{umonruwr{ytjda``akmiagnpohmmjs}t{||zx|vuutqrjmpnmtzwus||vs~yx~tmknngfjtvqlqtu~}yw}{xxoqpz~~|ynlnioswuprw{vvuxw{wzsoprrlpsy{~{spusokfja^`dgknoqnx{}{u~~~}{wsq{|~~~|}vqy|~}~yx~xxvy}zv{|neb]abgdbhmlkllrpw~|||}~xxvojfigmuvqluzzxyxyrpu|uoedlmokquuv{sr}umnqvtzxw~}~volosnllx|yru{zttysmrsuxunrxyqh\Z]Y^dkkfhrxwyy~{xuw|yvx}~||wvysqryz~}}wyjipmegcbZ^filhikpw{y~}okeffkmjkptuwu{|~yyvssuqqmjggmmy~~}vllz|spmidijpz{ztu~wlhmprnquvw}~||vz{wz}~~~zsmhlg`Z``]Y[gjiemrw}|wzuzw}||ylmjjmtyvqv|~~yrskhirrhcega`_finty}xy{~xz~tpwvusplchkpnjkqu}}}~{}yrnqtxtsoprz|}{xwsvvrpwsmigegnnontw}}}|||zxxz~xvoprs}zz}x{y}~|||zwxw{|~xrkgdckmmc__cdaceghv}}~~~~|wvvuosrrnktwvrvy|~~xvtrmqokdiqqngiginvzzzxyv||xutx|}{{{|}ywurrwzvqotqokmrrw}~~{z~|usrvsqnux{~~yyw{vssohgljmmojgkpvtrt|~}}|vtx|~zzz|{}z}|z{xy~}~y{|}z|y}}||rnigfiihhekjjeehiqxzz}{vrrosuwtpnrvtvvxx}xtptrslfimomoorqx|}|yyzuusxxzyyvxxx}~|~zyuqvvtnswxvsttxz~~|}~wryxytquw{}zyzxtrgfggfknkiiqqtrv|}~zvv{||y||{||vuxuxz}zxy}}|xoomhkhifeglnkklppz}}~yupoorssrnsuxuwy||{wxwvsrmlpnonqru{|}vtxvwssqoppsuyyyx~~yxxwxqprxwxwwz{~|~{|}~~xz||yzwyz{|~zurmhicfikgfknqprsy{y{}~}y|{|tqrsqtxvvtz{}}~vvsokomjgekmnjoqrw}~{~~wxtqrqspopvvuuw{|{|wyxyxrpruqqprv{z|{zvwsolillpptqqv{}|}{zxrvvwxxxz~~~{zxzy{|{xx}|}{z~||wplkjilhffklmnmqsy~~|~~|vrsnqsuqqsuxxyz}wxusvtpjlkomkmpqs||~~~~|{}}}xxyzw|}~||{vvxttnptvsrvuy}|zy{{yvsyxvrttuz||}}|xrnnjkjmnmjnsrtuz{}xv{yxxw{}|{uwwxwyyuvy|z|{}~{wstpomnigjjllllqrx|}~~xuvrttqppsrvstwz~{zxwuxusqpppplpprx}}~~~~||z{ustruwyvwwz}~~}|}{xttrvustwwx}}y{{zxvvx{wxyxw|}~zvtqmknkmihmppnrsvzz|}zz{z~yyuuttwwtrxxxxz{~|wvstqrsnjknlmkmpswz~}~||}z{wutuppqrtuttyzz{yvwvuqssuusqsvv}~~~}~{}xsqsoqsrssvv{zz}~}{}|yyvwwyuwxy~z{xyy{xxvuxyyx|{~~}{zusrnponkkikonpruu{~~|{{}~|yvsstsuqruyxx{{~{zusrrrqrloqqopqqvw}}|y{zz}~{y~|zxyvwxtprusvuwz}zzyxuxurrtuvxuy{{~~{|{{xysqspopropqtxzz{~}zz{zwyx{|{y|~~zwyuvxwwvww|zz{~||{trppmponnlmoqortv{~~~|~{{}~yyvtvusrspuwwy{}~~|ywstsqqpoptrtuuux|}~~||ywvxvyyxz}~|yxwwvxttwwvwxx|}~xyxvxxvrvvvwxx{~|~|xwtrprnprpnorrvvy||z}zxwyz|~{zyywuvwtuuxz|z|~}xstpoopnnnnrrqquux~}{}|}||{~~~{xwtvvtusrswuwyz~{{wvvvstroqrtsvvx|~~~||yyvuvvuuwswz{}z{yxwvuuywyyyz}|zyyvxwuuxwwywy{~}zytrppopqmopqqtsuz{}}~~zy{y{{||~|xyxuxwusutwxxz}~{ywvrsspnmopspruuv{~~~}{{}zzzz}~~|~}{wvvvturtvvuwyx~}|wxwvvurrusssuvz~~~}ywuttusutsrvwvzz}~}{y{vuvxwyzy}z{zywxvswwxxyx{~~}zvstqppomoporrstxy~~|~|{z|z|}{}~|yxwuwwsttuuxvx{|}xyvuuuqpqopqqquvw}~|||y{{zxyxy||}}yxyvusstwvuxyz}{jfThqtqkqx}ton^nkkmophac~tswqg|nhop|tnbVN]RVfgqo}srptdZty}wr|x}}ysq_ckmerwq~~~yoehv~q{pt^[RW]Zcfecyzuema\Raew|k]lcilp{n}wy{}u}ueqfssx{w}kfhfx`UYww[MJJFSkeut|~~~z~ndbb_ihrdkjmk^a_ljqy}s}{|ztgQQVk~mztoptuu}|{ishoe_]elksvlZcZOTL]S`ackopusy{{cXYWmrohtag`djbk`fejbmfftnz}xrrlqtxhopqvikp|xz|{kqzlyoxtqxr~{y~t{vvvlbegq|xtnstk^j_i_XYcabhtvqvsskxnwlqrvtw{w~~}xw|}|}t|t}orhfmfs}}jqaljljennuoyp~{kviqlacnnmmpnbtkiusqo}yyqs|wxxzz~~kmeg_how{}qszqjlhijl}ztmljoqjro|svz}y~smynflojbnuzv[ecVbWOfn|z~t}}q|wzxqajijukn}}~r}}nuu}w{}zuw{~zpy{wm~tvjrkp]eYbVZ\b|~~{{v~zrikUhut~jvptojt~|xwwwhitgndkgav{~{t}qbca^fRXc^hozyz~{hmhlzzy|xrwx~n{vwmuxxwovwtxw|xztr~{yffvj|luywlprlwjpv|vx}|{~vjjphiggaXofv}z|}{zhpysp{}u}yrqwuw~u}}xtzvx~vmmehieeqd{zt|vzuv}~~tuys{qmibmfr}ru}ly~~|~ykxf`hqqynymo}vx|wvttzmvbpz{{y{xzyrrnyw{~zxuqwwwpxtvwzswgwlw}zkmqxwor{}zs}kbhn_YPXPQfq|{rztpr_jqniihojtwy{ov~|prs|x}s~~ss{xqegek[lc\_bw~vjhns|zwg`ddtux{w~slr{eQSY_swzxwvfWZ[]_Va[d_epto|p||xmpzvqv~uwqqlptzz{hx|xlo~z~t{|~z{txpopoxmcmqwluuw|y{mly{}|mW\bcglu{~xz|widmrqmuvwyrtq{~y~~}|~ot|mxy|n]aX]_r}~y|z~{}urj^hjlx~sbmtnqluy}iuxsvvsj[nhhnuw|~tu{tpfdhe}|sqx}yy{~~r~}}{pl~|tz{vxwyzsjtvzqnvv}z|{~utdZPVWMT]c\_qo|{pkzqyysffnkndgs{{yz~}t}xy}w~vmy|{qkv{yxulqyqwufhY`aburu~~}lvmvrkwupkiwx~{x~snggomuvsoet~wypw}~zs}|upg]f_^RWV`Wbdsu~uutzyotwyywy}{puplts}|ms}}z~tsxtgnet}}zojsyuvwxwtdpy~|~zgu}t}wuxqxvu~yznwpn]pvrxrtvhl||vm\q}{}|w}ytq}mgmp`g[lpmslqqo{rswtl_]chv{tkio~t}zrdio|lbbggtw~uy}~xqpkxvsdcemuz{zwu|x|okmzz~~yv}~|{vms}{yvjmq|{}nx~wqrj[YOBTkll[bcchjv{~uyojpupo^fmolq}v~w|ywzxxvw~wxvsnvoksyzhx|~umokqshZhtxwgtsvsryxw{sq~|uzxo}~wpsghf^armstu|{y~~xtw{u|jna``^TUYjrugjqu|wxxzquolqvv{|zmyy}pt~y||l{wuyusmltsr{|w|qwztlqkxzyzrsssuwx|z|ytrwpkmwwhpqmhnuxry}|vvy{~|rzzs~~|pppxrqsngru}skjkqghrt{ytzqgnouwv}u}ssx{uvs}|wqmjjegfkmz{nuuw{vxy}zyyrijswzchloe`figss|~tvxkx}}~|~qyvzyx{ml}w~q~}~rxyx~|naqcXY^eenibY_njkkk{nwlzwynevwgt{t|stj{sy}zusugxqrkitzwyz|tspj}|qmorqqvefmskbkkryuxz}z}~qqjtomppxtsskn~||~~z~{spjkumqj`ppkhdfign]`ewz}ynyrxztxxwvsq}{yx{x~{v{~}|uzfcjrzzxrqnytwx~}~xkrjnccdhy}{|x{~rqknsogpt|wytv}|toq|{yw~yxxv|pltnozel{y~twsdhmylmocnkmgg{o|ukuhizy}vxxwwvtmqcaqqrrxsv{ugoox|uogkcnun`ccc`ae^m}ywx~}uuxplvzxtruu|vzs{rx{~yz|rwxz|lqjai[TV`mlmphpjrnkw{zwvl|ttrvkt~~~yo}|~vxsmphfqwyuv~{|poz|}uryrpifcnuwrlfgghmi|~~~zlo~}zxlsprnnzywzzy~qtxfdfrrzcio_iflvd_qmkrvw}|~~y||ww|svwt{z{~xuy}{|}yv~xpq}ioqxwtynt}|ym{vz}n{}pcepmjgulino|ws~}y~qlll|xdxprtwtu~~z{zr{~onsnltpqrttu{~joomqtpmprqbgpypi}{v}qn~}s~}~}xz|ww~rqzyrcrxnijvwsquwy}{|x}{dnreY]a`Y\gpjfgmwspy~upusvo~{||w|zwu|rs~ox~x{}}}}n{yrljpl^h^dj_jyxlcmmlo~|~|zx{rx~zsqlombuwopotn{~yyzr|{xkpupgj~x_bc^acntysmr{|vy~}uxxw}xonypn}x}v{|ttnt}xoijm]nwtmefdfmnxzu~}n{zzwy{y~}|vryzqwzutxvvsv}}rvskxw{yomyxxso}uxw}|ohqswxxqlm`gpvkbkmfoy|n~zyzuqgsvz|srwwv{|{wxyurfplokvyxsoyv}wr}{|otz}ytonphiidehqtwz~~|zv}v~~~u}~snvsjdcktv~~z}ogWc^\dkflhce`imijpx{|up{{}y}twr|xxuytv|||wwvpvonkvnhhjefkkwynzuvu{x}jqmhoovx}}~|r}{x|~x{qvpu{y}pnnWb_eoq~~yv~o{zlrpzx}}yuvwwx|w|xtv|vz|{r}jonlskmrsj|v{w|wuu{{vmquuywz~wzsuv||t|{|{z{y|~y|vyzwltxzstrmmtxwrurusmjigehmvz{}~uxzrvr|||sunrotw|}|vwt~~{{{x}yrsuxoyvzmiodkstt{v~||}}z~~{{rzuowty|||}}teoggiimhgljhqfcorut{|w{~}zx}|~yyxz}||svw|t|zzzuqmqllisouytys~x|~z~~}ywwv}zttwyw{|}z~wvzw}{ytnjp`jqpvottvuyurumvvyx}{{{}|}~z|}y{vyzz}nvukkllss|yvzux}{zvwyxt|v}}tunnprx{}~~wwvx~{|z|ysx|syv|uz||v|wvpywotlslzmnnhmduttrwrwzy~{zqz{}}wq|opsnsxv{xz|rvy|~{ysswwylinlonotlnqkjtsr~|~~wutrtx}tyvxy~||~s}q|xqypmkrdofhedeell}pwv|y|z{wxyz}||x{y}x}us|w{{}wyxtlsqlzrnmltoq{yw|vsvutpvw||}~}|~yzzx~}}w~trsrxzzzx~|vunomoguktrrsuxosinjltvx~ss{ru}~u{zz~~}~y}~y~yzx||rrqqtuu|vx|yt}}{zynxnnvuv{wwtornhnppu{w|q|tv|vx~|~z|zy|zzyy{|xwv{qxswv~v}tt{npglfrppys{qpqofvu{{}}~z{t{sxssvyzw|x{zz}{xxz}}qzoglkutqrpirmjoqwx}~{|~y}{{z~}v||~xxrsmy{z}utrqqjbdbksqwtx{xvzz|~|~}{|}y}||}~u}x}tqtzuw~tovpmlq|v~tszrmqzyxwx~~|xy~xtxy}}||uznfjqq~pzs{tttjoswo|}wyzutys~z}~}~}~}yx}tw}w|~u}pss~~}~|ptvvtuvwwsulosq}xpooxz||{{z{osz~|xvupt}||yw{trnuntknyr}uqoou{wv{s|}}|y}{}|z~|xzqrv|~vtxzzvuovt{tolikvjgqrzw{xwvx|z|xvyxx{|xvvuszvsyvxskinwkjrnswznu||~yszws|~qyst{~mrw|}tzvwwyvvzwqqtu{w}npokrpqny|{uy|ssnrs||zz}|{{x}}xwz~}||wqlxvksswwvuntuys}wonrokss~zv|spmtu~~~x}vpw|zs{nvw}|{v|uy{{u{yu|uyuyyqzpikfkjttvx|wiukdhsz}}}||}w{zqxyxtz|wy}r{~u{}uuquvituxw}uwxjmfklkr|wx~nxooqvx~xytzz~}|yxs}t{{~{x~|z{russpz|v~wrjff``lqpvw{vyppoptr~{|~{vt|y}}~zwy}sy}~v}ytpoloomrwzwvquidjivvy}xxrqvnzz}}|zuzzy}}yzx}}v{y{viqllpyy}xzxjvhfjonqvxxt{vlotou|{}vt|||~||wvwvuw{{xzszrphjpty{}~woplhktw}wzvvvqoz{stw}y|~{|{~{}~wtvwxv~xyukpu}y}}stvkofnmouuuuzklorvtyz}|~~~~}xsytsw~~{sinps|||xztooootqouxtrttwx~~u{vz~~~~}}{|~{~|zyuzyz}srryyzutxuhhrrllrsswvnsvw|~vv~{x}~}ory~|zzsunouyvxzvyrtquxtpqwq{{vuv~~z}}tyxy|~{~|~}zwz}{~~vstuwsw}zvurnsryysqkpxuoty}zv}zwyxz|yz|suu|~zz~xrwywtts{z}|xxsuz{rvrsurvr{}}y~zqurrv}|{~xsx}}}}|uv}~|zzts}xnuyzwuvnmopovtrzzyw{zrty~v{||u}zy{{{{}ztv{sxyx}xssy{yx~vioomp{~||ys|wpu{ssyw{{~~x{~~}wrrqututuyyurxppijnu{ywy{srw{~{~}t~yy|~}ywvz|w}uotuqqx~{|{tutnkpuww|~zy|wtspty|~}vy~x~x|~z}||z|y~y~zy|yywqtmpqt{y{~|ounjjnyy{{v}xpxvyu|}~}~~z{~y~|{sw{rt|~}x}xsuotyuw|{tzrkmosxwz~wvuotutz{|{~~{}{}}~}~}}~y}yzyvw{}}~xqrnorzy}{{wsrolmsmtyzyxyvq{vy||}~|{zz{{}|xuyuwz|{zztopqvy|}{yootmpuxxxtvytwtzww}{z~}{}{}z}~tyuxy|}p{rlpuwuy{}t{ymrqopvw|x|sy{y|~~xz~y~~z}~}x|~{}~{|ssv{{}xuqpsu}}|yzwsqzzxtuywxwzyz|w~zxuy~{x~{}}}}}}xrtx~}zywwqtuv{}zzwrrw}txzxw}vtzz~xv{yw}yz{}otw}|syxx|~{}~|~w{{y~|turszzxv{z~xzvvz~~~zz}}{xz~}xt|}{w{{{uvxxz~~xpv{xy|~}~|{wz}yv}~{{wy}~z{}xxzw~z}z~|}}yuwwtw{}{}~wwz~{~|~~{xxyy}uu~|xw}x}zswvv{xwwy}}}yy|y|~||~}~z}zx{}z{y}{~uvtsw|}v|}xv||{~zy}xz{~~xswyw{}~|y|ssuzzz|yz{|}}z}|}z|~~uxxv{}zs{xoqv}}|~wzzx{}{z}}}zwy~|{~~}y{ssuz}}zyzrstz{~|vy~||~{~~|{~}x{}{||z{yvrsx{{z{wtpsux}~}xzv~}}~}~~~~|}{~~~}}~{z}wwxz~y|vpst{x|xryuzxy~||||yz~|z|z|y}|z}}}~~}z}{~~|wzuw|}vyrstw{|~|~wrwyux|z}vz{vy{yz~y}~}~}{||}{|~xxtvy||wywusyyz~~|~wt{vvxy{x{x{~}z{wzxxzz||~{x|z{{|{uww{|~xw{vxx~}yz{vwtx}zvywy{w}{|~y}{x}|{{~}x{~~|}z{~vxtwx}~wzyvvyz~y~wyzx~~||vx{ux{~x|wy{}}}~{~~|zy|~|yx{}~~{vv~{||x|y}{z}{|y}ywuxz{yz||uvz|}wz}~}x{{{~~~yw||{~}zzx{{|ywzyx||y~|uz|~}|~~xz}x||}~~|}zzwx||}~}~zzxvw}zxz{}}}~~}{~~~|{|{w{}}~||zywv|{{yy~~}~{||~}~{}~x}|z||~|}~|xv{}~|~{}~~}{}~{~}}vzzz{xwxy|~y~||~~{}~|{yx{v|}xxy~{~~}{~w{}|~~yw{|~~{~y|~}~yy~~}~|}||}{~w~|uxy{||zz{}~}}}|~~~~}~}~z|~zzx|~|~ywz~~~}uy~|~|}||~~~{{|}z{~~~}}}~}{vyz|~~ywxx|~~}{yw}{}{|~{{|~~y~~}~~||}~{}}~~z|{}|}~{wwz}~{v|xy}||}}w|~{zyyy|{~}x}vxz~~z||}~~}~y}x{|zvxyz~~||u|{zz~~}z}}xy{x{}w{y~~{}{|yz{{xy{~}~|||yy}y}{xwy}~zw{y{z|z{|~{}{u{yvx{|~{xx}|}z~y~|}}yy|}~~~{~x{|}zyv}~~||zz{}~}z|xw{x{y}||uvy}~~{}~~~|~~z|vy{~~~z{|z|}}~|}{}xzwz{~~|y{wx{~}v~wzz~{~~}{~}}{~|z{|}xy~|~}}|~|zu{|z}|}}{wux}~|~|z|}z}~zz~~||~y}{}~~x}{{~zy~|wv{zzz}~}~}}|z~}zz|~{zz{~{yy}~x~}~|~~~||~||z{|{{z{|~||~~~~}{}~||z||}|}~||~|~}~y~}}{}z}~z~~}}~}~~}~~z}z{|~~|}}|}~}~z}~~{~|}|~{x}z~{~}|yz}|}~~}~}~}{|~}~~~z|~~|}~{z||{~xz~~~~}~{x}~~|{y|~}}~~~~y{}}y}|}z{~}|}||}|}z|~|~~||~x||~z}}~~~}}}~{{{|z}||}~~z}}|{z|}}~~~x}zx{{~|}{{}~{~|~~{z}}{z}~~y~|~{{{{|~}{||}{|{}x{|~{ywz{z}~}{}}|~z{||||||}|}}|}~x|~xz|~~{yz|}}{~{{|}~}z}~z~}|}{}}|}|{x~}}}~~~{x~z{|}|}|ywy|~~~z|}~~|~~z~|}}~yz~{~}~}}}~|||{}~}~{~y{||xxx|}x~||~~~|}|}~}}}}~y|~~~~|x|{}}yzy~~|{{|~}}{{~~}{~{{}~~|~{|}z}zy{|~}{|~{}~~{~}~}}~|||~|~{}{}y~~}~~}~}}~|~}|}|{~~{}}}~~~~~}~~~~}~~~}~~}}|~}|~{}~}|}~~{~|}~}}{~|}~}|~{~~~~}~|z~y~~~~}}}|}|{~~}~|~~|~~}y}{|}{}~~z}}}y}~~~}{|{|}~}|~{{{}|}|||}~}~~{~~~~|}yy|~~z||||}~}~~~{}}~|~|}~|~}}z}}}~{}}{{}}{y{|}}|~}~~~~||{||{|}{|{}~|}}{|~{~~}}zzy}~}{~{xz{~y~~~{~}}}|~}}~|}~~}{z~}{~~~}|~~~{}|{}}y{||{~|z||~z|~}}|}~~{~~{~|||~~~}~{y~}~}|y~~{}}}}zzy}}~~}~}}}~||}z}~{~}{~}}}zz}}}|~}|~~~~|{{~|y{y{~y~||}||~}|~}}}}}~~}~|z}}z}~}~z|}~}|}z~~~~y|~}~~}~|~{{|~}}~~|~}{}|}~}~}~|~~~|~~~{|~~}}~}z~~}{~~}{~}}~|~~~}~}{}~}~}}~}~~~~~~|}~}~~|~}}~|{~~~{~~~~~z~~~~~}|{}~~~~|~}~~}}~z}~}~~}~}~|~~{}~}~~~|}}~|~|~}|~|~}}}~~~|~}~}{|~}|}~~}{~~~~{~}}}~~}~|}|}~~|}~}~|}{{}|}|}~~~||~~|}~~||}|}}|~|}~}||~|}~|}{|~{{|{|~~{}~~}}~}{~z~~~}~||~~}||{}|~~~|~~~|~}~~~{{~|{~{|}z|}}~}|}~|{~||}|}~}}}|{~~}~}}{~}|}z||}~|~|~~~}|{~{~~}~|}}~}|{{{~~~}}}||~}~|~}z||{~{~~}~~}||}z}}~}~}~|{}}~|~~~z~||~}{|}~z||}~}{~}{|~~~||~~|~|}~~}~}}|~}|{}|~~~~~}~{|~}|}~{~}~~z}~~}~|}|}~}}~}~}}~~}~}~~}|~~z~~z~}}}}|~~~}~}}~}~~}{~~~~}~~{~|}~}{}{}~}~~}~}|~~~~|~}}~~~~~}|~}~~~{|}}~~~~~~}|}}~~|}}|}~~~}}~}}{~~}}~}}|}}}~}}~}|~~|}~|~}}}}}}||}}}|~~~~}}|{~~~~}|}~}{}||~~|~}}~~~|}~~|}~|~}|~~{|~~}~}~|}{}}~~~~}~~|~~~}{}}~~~~{~~~|||~~}~}}~~~|||}~~}}}}~}}|{|~~~}}}}|}~~~}~}}}|}}~}}~~~~~~~}~{~~~~~~~~~|{}}~}~~~~~|~~}~~|~}{}~~~}}{~~}}~}}|~~~|}}}~}~~~}~}}}|}~~~}~}~}~~~}}~}|~}~~|}~~}~~}~|~~~}~}}}~}~|~{~|~}{~}~~|~}~}}}}~}~}~}{~}~~~{~|~~~~|~~~}}}~|~~~}}~}}}~~}~|~}}~~}~~}}}}}~}}}}~~~~}}{}|~~~|}}~|}~}~}}~~|}~|~~}~~~~{}}|~~~}~~}~}|~~|~}}|~||~||}{~~|}}}~|~~~~}}}}~~}}~~|}~}}~~~|~~{~}~}~}}~~|}}~~}|~|~~~~|~|}|}}~~}~}~|{~}~~}~}|~}~|~~||~}~~~~}}{~}|~~}}~~~|}}}~~}~~~}~}~~|~~~~~~{{~|}|~~}~}~~}~}~}|~~~~|}~~}~{~~~~~}}~}}}~~~|}~}~~}~~}}~~}}}~~~}~}}}~}~}{}~~~~|~~}~|~~~~|~~~}~~~~}~~~{~~|~~|~~|~~}~}}~~~~}}~~~~}{~~~~~|~}~}}|~~~~}~~}|}~~}~~}~}~~~~~}}~~~~~~~~}~~~}~~}~|}}~~|~~~~}~~}~|~~||}~~~}}|~~}~~~}~}}}}~~~|~~}~}}}}~~}~~~|}~~~~}~~}~~~}~|~~}~~}~|}}~~~|~}}~~~~}~~}~~}}}~~~}||~}~}~~}~~~}~~~}~~}~~|~~|~}~~~~{}~}~~~}~}}~~}||}}}}~}~~}~~~|}~}~~~~~~|~~~|}~}~~~~~}~~~~~}~}}~~~~}~~}~}}~~~||~~~~~}{~~~~~|~~}~{~~~~~|~~~~~}~~~~}~~~{~~|~~~{~{~~~}~~~~~}~~~}|~~~}{~~}|~~~}~||~~~~}~}|~}~~~~~}}~~~}~~}}~~~~~}~}}~~~}~}~~~~|~~}~~~}}}~~~~|}~~~~~}~|~~}~~~~~|}~~~~~}~~~~}}~|~~}~~~~|}~~}~}}~~~}}~~}~|}~~~~~|~~}}~}}~}~~~~~~~~}~~~}}~}~}~~}~}}~~~~~|~~~}}~|~~~~~~~|}}~~~}}}}~~~~~|}~~~~~~}}~}~~~|}~~~~~~}~~~||~}~~~~~~~~~~}~~~}~~~}~}}~~~~~}}~~~~~~~}}~~~~}|~~~|~~~}~~~~}~~}}~~~}~|~{|~~}~~~~~}~~}~~~|~~~}|~~}|~~~~}}~~~~~~~~~}~~~~}~~}~}}~~~~}~~~~~|~~~}~}}}~}~~~~~~|~~~}~~~}~~}~~~~~|}~~~~~~~}~~}~~}~~}~~|}~~~}}}~}~~}~~~~~~~|}~~}}~~}~}}~}~~}}~~~~|~~}}~}~~~~~~~}|~~~}~~~}}~}~~~~~~|~~~~}~~}}|~}~~}~}|}~~~}~~~~~}~~}~~~|}~~~~~~~}~~||~}~~~~}~}~~~}}~~~~~~~}~}}}~~~~~~}}~~~}~}}~~~}|~~~|~~~~|~~~~|~~}}~~}~~}|~|~|~~|~~~}~~~}~~~}}~~~}|~}|~~~~~}}~~~~~~}}~~~~~~~}~}~~~~~~~~~}~~~~~}~~~~~}~~}~~}~~}~~~|~~~~~~}~}~~~~~|}~~~~~~~~}~~~~~~~~}~~~~~~~~~~}~~~}~~|~~~~~~}~~~~~~~}~~~}~~~}}~~~~~~~}~~~}~~~}~}~~}|~~}~~~~~}~~~|}~~~~~~~~~~~~}}~~~~~~~~~~~~}}~~~~~~}}}~~~~~~}~~~~~~~}}~~~}|~~}|~~~~}|~~~}~~~~}~}~~}|~~|~|~|~~~~}~~~~~~}}~~}|~~~}|~~~~~|}~~~~~~~}}~~~~~~~~}~}~~~~~~~~~~}~~}~~~}~}~~}|~~}~~~~}~~~~|}~~~~~}~~~~~~~|~~~}~~~~~~}~~~~~}}|~~~~~}~~~~~~}~~|~~~~~~}~~~~~~}}~~}~~}}~~~~}~~}}~}}~~~~}~}~~}|~~}~~~~~~~~~~|}~~~~~}~~~~~~~|~~~~~~~~~~}~~|}~~~~~~~~}}~~~~~~~}~}~~~~~}}~~~~~}}~~}}~~~}|~~~~}~~~}}}~~~}~}~~|~|~~~}~~~}}}~~}}~~}}~~~}}~~~~~~}}~~~~~~~~~}~~~~~~~}}~}~~~~~~~~}~~}~~~~~~~~~}~~~~~~}~~~~~~}}~~~~~~~~~~~~~~}|~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~}~}}~~~~~~~~~~~}}~}~~~~~~~}~~~~}|~~~~~~~~~~~~}}~~~~~~~~~~~~}|~~~~~~~~~~~~}}~~~~~~~~~~}~~~~~~~}}~~~~}}~~~~}}~~}}~}|~~}~~~}}}~}~}~~}}~}|~|~~}~~~}}}~~}}~~}}~~~}}~~~~~~}}~~~~~~~~}~~~~}}~}~~~~~~~~~}~~~~~~~~~~~~~}}~~~~~~~~~~~~}|~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~}~~~~~~~~~~}~}}~~~~~~~~~~~}}~}~~~~~~~~~~}}~~~~~~~~~~~~~}}~~~~~~~~~~~}~~~~~~~~~~~}~~~~~~~~~~}~~~~~}}~~~~}~~~~~~}~~~}}~}}~}}~~~}~~~~~}~~}}~~~}~}~~}~~~}~~~~}}~~}}~}}~~~~}}~~~~~~~}~~~~~}~}~~~~~~~~~}~~}~~~~~~~~~}}~~}~~~~~~~~}|~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}~~~~~~~~~~}~~}}~~~~~~~~~~~~}}~~}~~~~~~~~~~~~}}~}}~~~~~~~~~~}}~~~~~~~~~~~}}~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~}~}~~~~~}~~}~~~~}~~~}}~}}~~}}~~~}~~~~~~~~}}~~~}~~}~~}~~~}~~~~}~~~}}~~}~~~~~~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m33.bin b/applications/SprPoP/dist/MUS/m33.bin deleted file mode 100644 index 117beed..0000000 --- a/applications/SprPoP/dist/MUS/m33.bin +++ /dev/null @@ -1 +0,0 @@ -}|{~|}|~~}~||~{{}|~~}}~}}||}}|~~|}{|{}|~}~||}~~|{|}~~}~|~}~||~||~|}}|{|}}~~}~~|~|~{{}|~}~~}}|}}}}}~|}|~}~~}}~}~|{~||~~}|~}{}|}{{||}~{~|}~}|}~~~}~~~~}|{|{{{}}}}z~{~}y|y}|x{~z}{~{{|~}|}~}~~~~}~{z~~z{{~|{}yz~{{~|~xyyx|yw|~{y~|z}y}~{{}}~~}~}{yz{zz|{}}y~{w{~|y||}|vywxzvx}|yz~z{zy}}~{|~{|~~~|~yy|}yzz~~y~zy}xx|}zy}|}xvxuyxuz|{y|}yzyz}|}y~~||~}}|{yz}{yz{z{~w{{wz}|z{}|{vxvvzvx{|zy~{x{xz|}{{~|~|}~~~{}~yzz|{zz}}z~zw|yx{|}y}|{ywwtxxwy{}z{~xz{w||}||~~|~|~~z~x~~x{wzy~}{|zvy}z|v{u}}xvst|w{|}yxxz}xyyy~{z}~}{}~~{|xz{xy{z{}zyu|||xxwz|}vvrx{x|}}w|~v}{wyy{}|z}z}||}~y{z{w|y}y~ywv}{|u}~u}|}{tur{yy{~{w~yx~wwyx}{||~}~}~}~z||w}|zxw{x~{z{yuz}}{x{x|xwtv}z|~z{x}~xzyz{z}}~{~~~~}}{||y|{{{~zxv|{|vzuz|{{stpwywy|{u{{u|xuwwy~{{~z~}}~{~xz{vy|wxtyv{|y~}zvx~{}xx{xwv|~~{}|{z{{~||}~|||}~{}}|~}|z}{~~~{u{{yzv~xw}{zssptxuzyzuw}vxzvuvvy{xy}~}}~zw|ww{uxwuvwzz}z|yu~z||}{|yyu~|}|~~~z{|}~~|~}z}{~~{y}}|z}z{}{yy~xxx|yw}|stqqxrx}xvvzyzwyyuvxwy|~y|~~~~~}}w{{u|vuywtwzw~|x~w~}w{yv|xx{z}|}zy}z}z~}}xt|xx}}~}|z{{t}~~|{{zztz{y}sqxoxrt~{zuwyz{x}tr{wv|yvz~|}}~~zzy{tzyp{|ttxwzxxxy~|z|}}uzx{}z~|v|}|~~w~x}|{~~{uz|x~}xyx{w{v}{yzwzv{ynsquxsy|xzyyzxyxtvwu|uy~y}z}xz}x{|su|vt{tvz}wx{z~|}|wtwt{~~|{z~x}|}z{}~wv}{|}~{|w}{|{{zxz{{yy|{pqltvw|wyvx}zwt|xsxstx~w~}}}~~{|~~|w~tyvzwwxy~w|}~~yy|~vvwy|~x}{y|yzw|}}z}{}}z|~~|~~|z~{y}}}|zz|xz{}zutuqyx{{zr~|uztursvqrz}{z|w~}{}}~|}||xwvozyxytts{}y}y}~{|z}}z}||vw{z{yzvx}{{~vz~}~z||~uy}}~x|rz{zxzz{|{~|{zqzvw}~|wz~{~|trqu{s|}w}}~~}z~~z{~~vyxxzxwxzy{vy{|~|wuw~~~y}}zut}}|{~}|~zvx~~}{|{yy}}|}{{z{|{w|}yvqrt{xy{~}yzxu{zxtoqxuy~xz~||}||~{zwyyx}|wyvzzzwx}}z~~|yuw||~{z~}wuz|{{~z~|xw{~~~|}|xz}~}~|z}|}}|~~~~{{{wtpuz{w}}}~yzxx|ywpruuwzzv}}{~~}{}}~y|z}yz|w~}wwzw{}uy{|~{}zws{}|~|{}{t{yz~~~||{||yyxy}||}vx|}}~}~yz~zz}z|}xtrpzzwx{}~x{yx|zuqxquxvwy~z~z}zy}z~}|x~y|xvxzvyu}z|{}|xtv|{~|||wy}v}~|}z}}~~|xzv|}zwtz|{~~yy|}||~}{}}~uspw}xy{|z}y{|xrwuqyuvx||{|{{~~v|{{z{}|zzww{w{}t{|y{|~xvt}~{~{~}yw~wz{}~|~|}}~yzxy~}x}t~{z~{yv|z}}v|yyy~}~yvp}}|zwxxovzywtw~|z~xy|~~~z{}twzx|xyz}zu{{}~yz{ur~{z|zwz|z}||}~|{vv{v}}}yywx{|}}{z{||~~}}}}{~}~~w~{qvtw}{}{zzyvt{y|{v}||~v{~||y~~tyyxzsv|xxutyyw{x|~ux}yz|y|yy~|w}}|z~|}~{xtyx{{tzy|~}}}{|~|{~|x~}zwqu}}}}{}|wvtxxx{}yv||yzwz{z{~}~{}|zyz{{uywuxsx~{zu~|zyzy||y~}xy}{~~}ywsx~z~}u}{{z}~zyx|y}z}}|~|wz|{~|w}zutou|wyyvzx{~v}~}yzyv|zvy~{}z}{{ux~y}|z|~zrx}}|}}}z}{}}}}}vtoy~~~|zz|{}z~yzzx|z|~~|w|{~|}}~{sz|xtvtvyx~xt{||wz}x}{w|z~{}{wx{}~~~ztwz}z{~~~wxzwv}yzxy{{{}}}vyrty||{xwxytw~||vyy|y}{y~|}|~~{}xw~~wwxtxu}|swx{uz{~||z|w~|y}~}}zyy|~{xx{}v{z~y~usv~y{w{~}}}}~~~{trr{|y}}}wyxyzz~}ww}yx|{y}|~}z}uvt}~}xuut{xxvw}yz}x}}z~}z|{}~wvz~~|~}~y}z}}{zy{~x|||vvx}{~|x{{}~~~}xuxuv{}|wywwy~~}|{{xuw~z~~~}||xt|y|wtyyswy|zuy{z{|}~~zy~xxw~~x|}}}z{x{|{zzzz{{~y}tv~}~|}z|}|}}}}~{qtw}|}}z~zw}{}}txv}~|}~{|}zxy{|x{wtuyzvxz}|{y|{z~~{|zz{}w|{{z}~xx|~{~xx~y}z}tuw}|~{||z~~}|{tsu}{|~~~~{|~zwxz~~{u{}w|~~}~}~~}wzy{~{tvv||x{x||y|y|x{~~||y|{xv{~~~}zy{x~|~}x{z}||~{~xxy~}~}|w{}~z~z}}~|ywxxwy}~{~ytwy|~}}}yzxw}{}|}}}}{y{~}zvwx{xx~}vv{{~~wwz|~{}}||wx}}}}zzy{|}{{z{}x|}z~~{xv~~yxz|}|~~~}{}|zrszz}|txx{{}~{||ztx~{}}y~~~}~y}|{yyxu}~uww|}ywzz}|}z}xw}{|y~~~}}}y|}~~{{xx{|||ttz}}x{z~|~}{~~~}}{|rsuzz|{xvz}xv~{|y{uz{}}~{~~~~yz~}}{uv{z{zwyx}~y{zw}{}}z{{|v{{||y{}~yyzwz{}}~yxtyz}y}~z|{{}~|{|}yvttw{}}z{|wxx}}}z|z~}|{wy}}}|z}~xyz}|z{}}xv|~~~~}w{xw{{|z}|ywx|{~}||{}yxyy|{y|ywtz}{{yzz}}{{}zvrw|}~}{{{wzw||x{}vxwy|}~yy}~|}}yyyz}|||z|~~~~}wwwy|{}|~~}}zywv~z{~}}|~||z{|wx{~~wzw~{|{x~}z~~{}}||~yxuz|}z}xu{z~~}y|{}zuxv}{|||yzzyxxy|~}{{}ywv{yv{}z}|{yyz{}~z|~{}||xxzy{||yyz}{z{}~y|}|{~}}xvx|}|{yxy{{|~~~|y{}|ux{|}}}}}vxyzvyw{}~}z~~~{yyzvwx}~}~xz}z}{z|~}~{}~zyz{y{}}yy~~z||z~~zz~~}~{|}}xxzz{{y}yxzz~}}yx{~zx{{~|~zwz|~~|yxx|~zwy~~{|wvxy}{|}{z{{|~}{{~|}~~~}{~}|||~xx~||yy~}|{||}}{}}zz}}{zuu{|}{z{yzx}}{z|~}{{y|~|}~z{y}~~|xy|}xwx~~}xvyyzx{|z{{}}~z}|~}~|{z~~|{xz~|~uw{}|}y|~}{z~}yy{}zstx~}|yxywy~~}|w{}y{{}{~}{z|~z}{|~{z|||~{{wyvw}~~xz~}}zy}~}}~{{|}x{}|{{~xvx{zy{}w|}}{zz~}wuv|}|zwxxyw~}zvw{zz{z}~~~~}z|{~|||~|~|x{{~~~|xtxz~}{}}|~~{vx}}}}{{}}|}~{w||~{yzz}{zy{|}}|~~|zz{yxu{}|wyyyyy}ywxz|xuy|~|}~|{y|}zz~{yz~|{xw{|zxy}~}}|zzy}}|}~|z}|zyx}z~}xxz}zzzz{z}}}}~}~}xuv}|}zz{wwx{{~ywx|}{ux||}}~~wz}yyy}}zy~~z}{||{yxwx{|~}z}|~|zz}~{~|}}}~}y{zy~}yxx|~{zwy|y}}}~~}}yvvx~~}}|zvw{}}~}|yz{{}|xz|}~}zz}}~yy||}{{{}||}~}yxvwwz~~{w|~~zx{}|}~|{~|{z}z}~|xv|yyy{~{z|}}y{}|vuy|~~~yzyz{y{zzz{}yyz}~z}~y{{~}|{|}}|z{~~}~|{wvxwz{}{z{}|{x{~zz}}{}~~}{}}{}~{yx{~z{}z|{z}yx}zxvx}}z||wxz~}}}{z||{~|vz{}|{|{xy|~|{{|~|z}}~|{}zyxwxz{|~|{}|~}}x{}~}||}~|~~~}~}}|~}|xz}~||wz||}~zzyzwx{}~~~|ywz{|}|}{{wz}|yyz~}|{{yz|}zz}~~yy{||}{{zuzzz|}{z}~|{y|~~|}}}|~~~~||{{zz}}yy{{~~|{{}~~zxw{}~}xy|}{w|}}}ywx||xx{~}z|~~{{{|}{|{~|xx~}~~}{zyzzz|||}yz~||{z}~}|~zz}~~~yz}}|xy|z{||}}|}{yyvvy~|~|}{|zvw}|~|xxy~~|yy{~~~{{}y|~|z|}}zxz~~||~}zz{zyx{{{||}zz}~~~~~~{{{}~~{yz~~|xw|}|}yw|~{|~|z~|vvx|~|}}xwxwz}~{{{z}|yz{}}}{~~|}~{{}~|yx|~}{}~~|z{wwx{~{||}|wy~~|}~|}z}{z{||~}~zxx{~zywx}{y}}~{|{vvw{}~~{zxwxx||zzz}~zxx{|z~~z}~{|}{~zxy}||~~|wwwy{}~~}{|{yxz~}|{~~}~|~}|}~}{}}zwv|}wywy}||}{|{uuy~~~}z{xxzz~}zzzz~zuxz}~}|z~}}{{|~|zy|~}{{|~}}~}{xxzyz{|~}}~~|{zwz~~}~~~}~|z||zww|~zyzy~~}~}|zvvz}}|~~{|zy{z|}}~|y{{}{vyxz~}~~}~|xy}|xyz}~}yy}~{zzyzyx{|~y{~}|xx{}}~||}z}}~{yz{}~z{zz~~{~}~~{xxw{}~}~|}{z{|}~||{{{|~|wwy|{|~yy}}zy{z|}xx|}}}yyxxzz~{z{}~zzy{~||~}|~~|||{|~~|yv{~{|{|~{|~{}{vty~}|{{{w|}~{||~}wwz|}yz||}}~}zyy{}{z|~zwyyyz|}{z|~{{{y{}}}|~~{{}~~}||z~~~ywz}||{}}~{|}z{}wvx}|}~~{{ywx~}|z}{xyy{}|{y|~{{}|yy{|}~}{y{~}{xyxy{}~{z|}{zw{}~~~~{{|~{||{}}|~|{z{~}||yz~~{|}|{}zyyz{{}~{xxxy~{zy|~yxwz}|{z}z{}}{zzz|~xwz}~}}yxyy||}|z}~zyy{~~}}~~~}|~{z||~~{xy|{yyy~}|}{}~zvuz|}~~zyy{yz~~}z{{~{vxz~}||~|{{}~~{yx{}ywx|}|yzzyzz}~}|}}{{|{z|}~|}}||yy||}{wvz~}yz{{~~}~~~}|}{vuw{|~|||zzxz~|{|z|}yzzz}~~~~|z{}|xy{}~~|{zxz~~}z{ywx{~{{~}{xx|}~|}|yzyz|z~~xww|}{|{z~|z}~~}xvvy}~~}{yzy||z{|}xxwz~~~{z}~~{{{z{|}|{zy}~~}ywvw{{~~|{|zww{~~|}~}{yz{wz|~zxx{||zy|~|z}|{{wwy}~}zyyy{|{}}~}wvwy~|||{}}~}zyxy|}}}{z|zxxxxy|}~~zyxx|~~~}}}|{zzyx|~}{yy|{{zy}~}|{|~~|~|yxz}~}}zyzy|}}}{}zvwx{}z}|zz}zxxy{}~~}{{~}{yxxvx{}{||zzx{~~~~||zyzz{}{}|z{~}{{z{~}z{~~{zy||}}{zzzz~}}{{~|xwx{~}|}{xz|~{xxyy~~|{z|}}{xxwx{|~|z|~{z{z}~}}}~||z{{yz|}}{|~~|{{{}~~|{}~|{zy{||}{z{zy}}~~|}~|xyz}~~}~}zzz|}}{yxy|~{xy~~}{xyyyz{~|{}~|||{~|{|~~||zzyw{~~}zy|~|{|||}~~~}{|}{{|ywy}~~|{zxw|~~~~~~~{z{|~||~{yz{~~}yz{{~}zyz~~}|zyywx|~||~|}{{}}}{{|}~}}{xyzz~||}yx{|}{y{}~~~|y|~}|~}xwx}~}}zxxwy}~~~|{~~{zz{}~~|~}zy{}~~}{{{|~|||{{{~~~}zxwx{~~~~}|xz}~||{||~}{yz|{y{z|zyz}|{yx|~~|{|~||yyy|}}|yxxxy}~~|{|~{xxy~~~}~}{z{{~~{|zy{|}}{zz~~{xyyz{|}~{zy|~~|z|}~{||zzxw{{~|{z|}yzyz|}~~~~~}~~~|zyy|}~|{yxxw{||}}|xxy|~}~~zxz|}zyxz~~~|zz|}|{zzxxy|~{{{z}}}{|~}}}|yxxwz|}}{y{~~zzzx{~~}{{}~zxy{}~~||ywxy{~}~~}~~}yzz{~~~}yx{~|yxy{~}|{zz|}~}zyvwz}}}~}}{z|}~}|||~|zwxyx{|~|zy{~~zyyy|~~~~{z|~}yxy|}~}{yyzyy}~~zzy{~~|zz|}~zy{z|||}{zz}~zxwwy|~}||z{~~}z{}{zxxyyz}~|zz}|y{z{||~}{z{~~{yy{~~|{zyxw}{yyz~~|{~|{zz}~}{zyz||||{z|}{xyxx|~~|{{z|~|{|~~|zzxy{z}~~{z{~{{{yz}~~~}|z}}~zyy|~}}~~}zxxxz~~zyy{~}|{}~zxy{~zyyz}|||{zz}}}{yyyz}||{z}}}}}}|}~|{{z{{z|~|~|{|}~|zzx{~~}~~||~|zzz|{}|yxzzz|}~~{zy{~}}|{|yxy{~~zyzz|}|}{yx{~~}z{{z}~~~{|{|~~|{{|~{|{{|zz{|~~|z{|}yz{{}}}~}~~}~{yxz||~||{{zwy|~~{zz|~}~}}{}~~{yyz}}zyzz}}|{xwy}~~~||{{|}~|}{|~}}|z{|}}}|{zyy|}}zxz}}z|{y{|}~~~~~~ywx{||}~~{yxwy}~{zz{|}}}}|}|zy{~}zzzz||zyxxy}}}{y{~}}zz|}~||{||~}}zyyyz}}~zxx{}~{{yx{}~}|~zxxy{|}~|xxxx{{zxy|}~~}~|}|z{}|zzzzzyyyxx{~{zyz~~{yx{}}~}}||}~}|zxz{z||}{yyy|zyyx{}~~||~|yxxz|}}{yxyy{zxwy|||~}{|~~~|{|}}{zxxyzyyxx{}{{z{~{zyy{}~}~}}~|{{z{{y{|}{yxz}}yzzy|~~}}|xxy|}|~~||zyzz}|xxxy|}~~|||~~|z{|{xwwyzyyyyy{~|||{|~~}{{yy|~~~~~~~}{|{zzyz||}zyy|}{z{{{~~~}}~zyyz{{~~|{{{{{~zxxx|~}~}~~~{yz|{xxwxyyzzyxy}~||zz}~~{zzy|~~~~}|~~}{yyzy{}}}{yy{}{{||}~}|}~zywy|}~~||}{{~}yxxz|}|~~|||zz|}~}{xxwxzzzyxx{|{z{}~~{z{z|}}}||}}{{yzzy{~~}{xx|}|}|}~}~}}~~zxwz}}~~}||zy}~zyyy{||~}{{}|{||~}~|yxwxzzxyyy{}|||z|~~}{{zy|~~}|}}~~{|zyzzz}|}~zyy|~}~}{|}~}}~~{yyz|||~|zzz|~zywx|~~}|||}~{z{|}}{xxxxyxyzzyy|||{{~~~}{zy{~}}}~}~~{{zy{zz{z|~{{z{|~}|{z}~}}}{yxz{|~~{z{{|zxxz}}|~}|}}~~{z{|}}|yxwwyzzyxwy}}|||~|{{{|}}~~}}}}}{{zz{xxz{}~{zxz|~{|{|~~~~~|yxx{|}~}|||{}|yyyz|{|~}}~~|zz{}~~zwwwyzyxwwx{~}}|{|~~~||{z{|}}}}}~~||{yxxwy{{{yxz|{|}|}~~}}}}yxx{}~}||{|~{zxxz{|~~~}zz|}~}zxxxxyxwxxy|~|zz|~}|zy{}~~}|}}|{zwwxwyz{~zyyz}}}}{|~~~|{|~|yyy|~|{{z|~zxwy{|}|{{|}~||zyxwwxxxyyz~~{zy{}~{zyz}~~~}}}~}zyxwxwx{{}}{zz}~||{{}~}|{|}~~~{zz|}||{{zxxx{}~~}}|{{{}}~|ywwwxxxzzz|~{{zz|~~{zzz|~}}}}~}zyywxxwz{{}|{{|~}|}{|~~}}}|{|~~|{{}~~}||{|}zyxz}~~~}~}zyy{}~~{wwwwyyz{{{|~{{zz}~|{{{~~~}}|||zyywxxwyz{~~}||~}|}{|~~|}~}|{|~}|||~}}||||~~{zy{}~~~~|yxyz|~~}{xwwwzzz{{zz}~|{{{|~}|}|}~|{z{|{yyxxxwwz{}~}{|}|}}|}}}}}}}}|||}~}{z|~~}}|z{~~|{{|~~}~~}zyxyz}~||{xxxy{{zzyy{~||{z{~~~~}~~~}{{{{|{yzxwwwx{||}{z|~|}}{|||}}|}~}|{|~~{zz}}|{yz~}|{{}}}~~~~}{yxy{}~|}{yyyy{zyyyz|}|zz|~~||~}|{{z{|{yywwxxyzz|~|{{}}}{y{||}}}~~|{|~}{{|~~~{zzz|~}{zz}}~~~~~~|zxyz{}~~}~{zzyyyyyzz{}~{{{|~}|{~}|{zz{||yxxxyywyz{}||}~|{zy{||}}}~}||}~~~|||}~~}{z{z{~|zy{}~~~~~~~~~|{yyyz}~~~}{zxxyzzzzz}}|}||}~}}}~}|{{{{|{yyyxxwvyz|~|{|~~z{{yz||~~|}}}}|}}~}{{}~~}{zzz||{{|~}~~~~~~~~}{xxy{~~|yxxyzzzzz{}~}|{{~}~}}~||{{{z{{zzxwwwx{|~}{{}~|z{zz||}}|}~~}{{}~}|{|~~}|z{{{}~}|{{|}}~~~~~~~~}zxxz{}~~~|yyyyzyyzzz|}|{{}~}|~}}|{zz|}{yxwwxwz|}~|{|}~{{{z{|||}}~~|{{|~}|{}~}|{{z{}~|{{|}~~~~~~~}{zyzz{|~}|zzzzzyyyz{}}|{|}~}}~~|{{{||{zyxwxxy{}~~}|}~~|{{{{||~~}}||{|}~}|}~~|{zz{~~|{{|}~~~}}~~~}}|{zzyz|~~}|{zzzzzzzz|~}||}~~}}}~|||||{{zyyxyzz{|}~}}}}|{z{|}~~}|||||~~}}~~~~}|{{{}~~|||}~~~}|}}~~~~~}|{yyy{}~}|zzzzzzzzz|~~~~~~~~~~}}}|{{{zzzz{{{{|}~~}}}~}{{{|}}}}}||}}~~}}}}}~~}}|{{|~~}|}}~~}}}|}}~~~~~}|zyyz|~~}{zz{{{{zyy{~~~~~}|{{{{||{{{{{{{}~}||}~~}|||||}}}}}~~}|||}~~~}|{{}~~}}}}|}}}}}}~~~}|{zzz|~}||{{{{{zyyz|~~}~~~}||||}}}||{{{{|}~|{|}~~}||{||}}~~}|||}~}|{{}~}|||||}}}}~~~~~~}||{{|}~~~}||{{zzyyyz|~~}}}}~}}||}}~}}|{{z{||}~}{{|}~~}|{{|}~~~~~|||}}~~}|{|~~|{{{|}}}}}}~~~~~}}}}||}~~}|{{zzyyyy{}~}}|}~~}}}~~~~}|{{{{||}}}|{|}~}||||}~~~~}||}}~~~}}|}~~|{{||}}~}}}~~~~~~~~}}}}}~~}|{zzzzzzz{|~~}}}}~~~~~~~~}}|||||||}~~}|||}~~}||}~~~~~}||}}~~~}}~~}||||}}}}}}~~~~~~}}}}}~~}|{zzzzzzz{|~~}}}}~~~~}}|||||||}~~~}||}~~}}}~~~~}|}}~~~~}|||}}}}~~~~~}}|}}~}|{zzzzzzzz|~~~}}~~~~~}}}}|||||}~~}|||~~~~~~~}}}}~~~~}|||}}~~~~~~~~}}}}}~~}|{{{{{{zz{{}~~}}~~~~~~~}|||||}}~~}|}}~~~~~~~}}}~~~~~~}}|}}~~~~~~~~~}}}}~~~~}||{{{{{{{{|}~}~~~~~~~}}|||||}}}~~}}}}~~~~~~~~}}~~~~~~}}}}}~~~~~~~~~}}}~~~~}|||{{{{{{{|~~~~~~~~}}}}|||||}}~~}}}~~~~~~~}}~~~~~}}}}}}~~~~~~}}}~~~}}|{{{{|{{{|}~~~~~~~~}}}|||||}}~}}}~~~~~}}~~~~}}}}~~~~~}}}}~~~~}|||||||{{|}~~~~~~~~~}}|||||}}~~}}}~~~~~~}}~~}}}}~~~~~}}}~~~}}}|||||{||}~~~~~~~~~}|||||}}~~~}}~~~~~~~~~~~~~}}}~~~~~}}}~~~~~~}}}||||||}}~~~~~~}}|||||}}~~~~~~~~~~~~~~~~}~~~~~}}}~~~~~}||||||}}}~~~~~}}}||||}}}~~~~~~~~~~~~~~~~~~}}}}~~~~}}|||}}}}}~~~~~~}}}|||}}}~~~~~~~~~~~~~~}}}}~~~~}}}}}}}}}}~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~}}}}~~~~~~}}}}}}}}}~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~}}}}~~~~~~~~~}}}}}}}~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m35.bin b/applications/SprPoP/dist/MUS/m35.bin deleted file mode 100644 index cdcd17f..0000000 --- a/applications/SprPoP/dist/MUS/m35.bin +++ /dev/null @@ -1 +0,0 @@ -~}|zxwvtrsqpqqqqqrstuwyz{}}~{ywusrpoooopqqstvxz|}~|zxvtrpnmkjhhggffeeeefffggijlnpsw|ypsu{~~~}}~~|{yxvusrqppoonnnnopqqrtuvxyz{}~~~}||{{{{{{{||}~{upor{~ywvvvwxyz{|}~~~~~}}}}}}}~~}xtrruz{xusqqpppoooooppppoooooooooooooopppqrsttvwxyz|}~{wsppqv|{wusqqppppppppppppppooooooooooopppqqrstuvwxyz{}~}yuplighjou|}yuqmkihgfeeeeeeeddddddddddddddddeeffghhijklnopqstvwxz{|}|xtqooquz}zxvvuutttttuuuuuvvvvvvwwwwxxyyzz{|}}~~|z{}}|{zyyyxxxxxxxxxxxxwwwwxxxxxyyzz{||}~}yvsqpquy}zwtsrpponnnmmmmmmmllllllllllmmmnnnoppqrstuvwxyz{}~}zwtpmigffimrx}{xtqnlkjihggfffffffffffffggggghhiijjklmnopqrstvwxy{|}~}zvsqooqtx~}zxxvuutttsssstttttttuuuuvvwwxxyzz{|}~|zyy|}|{zzyyyxxxxxxxxxxxxxxyyyzz{{||}~~{wtrppqtx}}zwvtsrqpoonnnmmmmmmmmmmmmmmnnnooppqrrstuvwxyz{|}~}{xuroljhghjmqw||yvsqpnmlkjjiiiiiiiiiiiiijjjkkkllmnnopqrstuvwxyz|}~}zxurpooqsw|}|zywvvuutttttttttttuuuuvvwwxxyzz{|}~~|yxwxz}}|{zzyyyxxxxxxxxxxxyyyyzz{{||}~~~{yvsqppqtw{}{ywvtsrqqppoooonnnnnnnoooooppqqrrsttuvwxxyz{|}~}{ywtqoljihiknqvz}zwvtsqponmmlllkkkkkklllllmmnnnoppqrrstuvwxyz{|}~}{xvsqpoopsvz}{zyxwvvuuuuuuuuuuuvvvwwwxxyzz{|}}~~{yxvvwx{~~~}|{{zyxxwvvuutttssssrssstttuvwwxyz{|}}zxvuttvxz~~}||{{{{{zzzzzzzyyyyyyyyyyyyyzzz{{|}~~~}{zxvtrpnmkkklnptx}~}}||{{{{{{zzzz{{{{{{{{||||}}~~}{yxwwxy{~~}}|{{zzzyyyxxxxxwwwwwwwwwwwxxxyyzz{{|}}~~~|{ywvtrqpppqsux{}|{zzyyyyyyyyyyyyyyyzzz{{{|||}}~~|zywwvvwxz|~~|{yxwvvvuuutttttttttuuuuvvvwwxxyyz{{|}}~~|{yxwvuuuvxy|~~}{zyxwwvvuuuuuuuuuuuuuvvvwwwxxyyzz{||}~~~|{ywvussssstuwy{~~|zywvutssrrrqqqqqqqqqqqqrrrrssttuuvvwxxyzz{||}~~~}{zywvuutttuwxz|~}|{{zyyyyyxxxxyyyyyyzzz{{||}}~~~||{{{{|}~}}||{{{{zzzzzzz{{{{{{|||}}~~~~}|{yyxwwwxyz{}}|{zyyxxwwwvvvvvvvvvvwwwwwxxxyyyzz{{||}}~~~}|{zyxvuttsssstuvxy{}~~|{zyxwvvuutttttttttttttuuuuvvvwwxxyyzz{{||}}~~~}|{zyxwvvvvwxyz|}~}}|{{{zzzzzzzzzzz{{{{||||}}~~~}}|{{{{|}~~~}}}}|||||||||}}}}}~~~~~}|{zyyxxxyyz{|~~}|{{zzyyyxxxxxxxxxxxxxyyyyyzzz{{{|||}}~~~~}||{zyxwvvutttuuvwxyz|}}|{{zyyxxwwwwwvvvvvwwwwwwxxxxyyyzz{{{||}}~~~~}||{zyyxxwwwxxyz{|~~~}}||||{{{{{{{||||||}}}}~~~~}}||{{||}}~~~~~~~}}}}}}~~~~~~~~~}|{{zzyyyyzz{|}~~}}||{{zzzzzzzyyzzzzzzzzz{{{{||||}}}~~~~~~}}|{{zyyxwwvvvvvvwwxyz{|}~}}|{{zzzyyyyyxxxxxyyyyyyyzzzz{{{||||}}}~~~~~}}||{zzyyxxxxxyyz{|}~~~}}}}}}}}}}}}}}}}}~~~~~~}}|||||||}~~~~~~~~~~~~~}}||{{zzzzzzz{||}~~~}}||||{{{{{{{{{{{{{{{||||||}}}}~~~~~~~}}||{{zzyyxxwwwwwwwxxyz{|}~~~}}||{{{{zzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~}}}||{{zzyyyyyyyzz{||}~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~}}||{{zzzzzzzzz{{|}~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~}}|||{{zzzzzzzz{{||}~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}||{{{zzzzzzz{{{|}~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~}}|||{{{zzzzzzz{{||}~~~~~~~}}}}}}}}~~~~~~~~~~~}}}||{{{{zzzzzz{{{|}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{{{zzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzz{{{{||}~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{zzzz{{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{zz{{{{{||}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~}}}|||{{{{{{{{{{{{||}}~~~~~~~~~~~~~~}}}}|||{{{{{{{{{{{||}}~~~~~~~}}}}||||{{{{{{{{{{{||}}~~~~~~}}}}||||{{{{{{{{{{|||}}~~~~~~}}}}|||||{{{{{{{{{|||}}~~~~~~~}}}}||||{{{{{{{{{{|||}}~~~~~~}}}}}|||||{{{{{{{{|||}}~~~~~~~~}}}}||||||{{{{{{{||||}}~~~~~~~~}}}}}|||||{{{{{{{||||}}}~~~~~~~}}}}}|||||||{{{{{|||||}}~~~~~~~~~}}}}}||||||||{{||||||}}~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}||||||||||||||}}}~~~~~~~~~~}}}}}}}|||||||||||||}}}}~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~}}}}}}}}|||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||}}}}}~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~}||zzzyxxxvvwwvwwwxyz{||~~}|ywtrnljihggffghikmnprtvxz{}~~~}|zyxvusrqponnnmmmmmmnnnopprstvy|wz{~}}}}}}~~~{z{}~}{ywvtrqonlkjihggggggghijlmoprsuvxy{|}~|wux|zzz{|}~~~}}|||{{{{{|||}~}xtqqtz{wtrqppoonoooooooooonnnnnnnnnnnnnooppqrstuvwyz|}~|xtqqrv|{wusqqpoooooooooooonnnnnnmmmmmnnnnoopqqrstuvxyz{|~}ytpliggjnu{}xtpmjhgfeedddddddddccccccccccccdddeefghhijlmnoqrtuwxz{|~|xusrtx}}{yxwwvvvvvvvwwwwwwwwwwxxxxxyyzz{{|}~|z{}~|{zyyxxwwwwwwwvvvvvvvvvvvvvvwwwxyyz{|}~}yvrppqty|yvsrqonmmllllkkkkkkkjjjjjjjjjkkkllmmnoppqrsuvwxyz{|}~~{xuqmjhfgimrx~|xtqolkjihgggfffffffffffffgggghhhiijkllmnoprstuwxy{|}~|yvsrrsv{~|zyxwvuuuutttuuuuuuuuuvvvvwwxxyyz{|}~}{zz|~|{zyyxxxwwwwwwwwwwwwwwwwwxxyyzz{||}~~{wtrppqsw||yvusrponnmmllllkkkkkkkkkkkkklllmmnoopqrstuvwxyz{|}~~|yvspmkihhjnrw||yvtrpomlkkjjiiiiiiiiiiiijjjjkkllmmnopqqrsuvwxyz{}~}zwtrqqruy~~}{zxwwvuuuuttttttuuuuuvvvwwxxyyz{|}}~}zyxyz}~}|{zyyxxxwwwwwwwwwwwwwxxxyyzz{||}~~{yvsqppqsvz|zxvusrqpoonnnmmmmmmmmmmmmmnnnooppqrrstuvwwxyz{|}~~|zxurpmkjijknrv{}zxvusqponmmllllkkkkkkllllmmmnnoopqqrstuvvwyz{|}~}zxusrqqrtx|~|{zyxwwvvvuuuuuuuvvvvwwwxxyyz{||}~}zxvtstuwz~~}|{zzyxwwvuuttssrrrrrqqqrrssttuvwwxy{|}~|{yyyz{~~}|{zzzzzzzywuxyuvxyyyyzzzz{{{||}}~~~}{ywusqonnopruy|~}|{zzyyzz{{zxvw{ywwxyz{||}~~}{zzyz|~~~}|zywvxyzyxvuuuvvwwxxxxyyzz{{{||}}}}~~~~}{yxvtsrqqrsux{~~}|zyxxxyz||||{zzyyyzz{{|}}~~}{zxwwwwy{}~|{zxwvuttuvwxxxxwwvvuuuuvvvwwxxyyz{{||}~~}|zywvvvvwy{~~|{yxwvuuuvwxxyyyxxwvvvvvvwwwxxyyzz{{||}}~~~}{zxwuttsstuwy|~}{yxwutsrrrrsstuuuttssrrrrrrsssttuuvvwwxxyyz{{||}}~~~~}|zyxwvuuuvwxz}~|{zyyyyzz{|}}}|||{{{{{{{{||}}~~~~}||{||}~}|{{||}~~~~~~}}|||{{{||||}}}~~~}|{zyyxxxyz|~~}|zyxxwwxxyzzzzzyyxxxwwwwwwxxxxyyyzzz{{|||}}}~~~~}|{zyxwvuttttuvwy{}}|{yxwvuuuuuvwwxxxxwwvvvuuuuvvvvwwwxxxyyzz{{{||}}}~~~}}|{zyxxwwwxxz{}~}|{{{{{||}~~~~~}}}||||||||}}}}~~~}}|||}~~~~~~~~~}}}}}~~~~~~}|{{zzyzzz{}~~|{{zzzzz{{|||||{{zzzyyyyyyyyyyyzzzz{{{{|||}}}}~~~~~~~~}||{zzyxwwvvuuvvwxy{}~~}|{zyxxxxxyyzzz{{zzzyyxxxxxxxxxxyyyyzzz{{{|||}}}}~~~~~}}|{{zzyyxxyyz{|}~}}||}}~~~~~}}}}}}}}}~~~~~~}}}}}}~~~~~~~~}||{{{z{{{|}~~}|||{|||}}}~~~}}}|||{{{{zzzzzz{{{{{{{|||||}}}}}}~~~~~~~~~~~~~~~~~}}}||{{zzyyxxwwwwwxxyz{}~~}||{zzzzzz{{||||||||{{{zzzzzzzzzzzzz{{{{|||||}}}}~~~~~~~~}}||{{{zzzyyzz{{|}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~}}|||{{{{||}}~~~}}}}}}~~~~~}}}|||||||{{{|||||||||||}}}}}}}}~~~~~~~~~~~}}}}}|||{{{zzyyyxxxxyyyz{|}~~~}|||{{|||}}}~~~~~}}}}||||{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzz{{{|}}~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~}}}|||{{{{{{||}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~}}}||||{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{|||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}|||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}|||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|{{{zyyywxyxxxxyz{|}}}|zwuqomkjihhghijkmoqsuwxz|}~~}|{yxvusrpomlkkkjjjjjkkkllmnoqrtvy}y|~y~~~~~~|}{{}}{zxwusqpnmlkjihhhhhiijklnoqrtuwxz{|}~~~~~yuv|~|{{|}~~~}}}}}}}}~~zurprw}}yvtrqqpppppppppppppppoooooooooopppqqrstuvwxy{|}~yurpqty}zwusrrqqqppppppppppppooooooooooooppqrrstuvwxyz|}~}yuqmigfhlrx~{vroljhggffeeeeeeeeeeeeeeddddeeeeeffghhijklnoprstvwxz{|~}yusrruz|zyyxxwwwwxxxxxxxxyyyyyyyyzzz{{||}~|zz{~}|{zyyyyxxxxxxxxwwwwwwwwwwwxxxyzz{|}}~~zvspoprv|~{xusrqponnmmmmmllllllllkkkkkllllmmnnoopqrstuvwxyz||}~~{yurnkhffgkpu{~zwsqnlljiihhhhggggggggghhhhhhiiijjkllmnopqrstvwxz{|}~}zvtrqrtx}~|zyxwwvvvvvvvvvvvvvvwwwwwxxyyzz{|}}~}{yyz}~}|{zzyyyyxxxxxxxxxxxxxxxyyzzz{||}~~{xurpopruz~{xvusrqponnnmmmmlllllllllllmmmmnnoopqrrstuvwxyz{|}~~~|ywtqnkihgilpuz~{xvsrponmlkkkjjjjjjjjjjjkkkkllmmnnoppqrstuvwxyz|}~}zwusqqqsw{~}{zyxwwvvvvvuuvvvvvvvwwwxxyyzz{||}~}{yxxy{~}|{zzyyyxxxxxxxxxxxxxyyyzz{{||}~~~|yvsqpopqtx}~{zxvusrqqppoonnnnnnnnnnnnnoooppqqrrsttuvwxyzz{|}~~~|zxuspmkjiijlpty}|zxvtsrpoonnmmmmlllllmmmmmnnooopqqrsstuvwxyz{|}~}zxvsrqpqsvy~~|{zyxxwwwvvvvvvvwwwwwxxyyzz{{|}~~}{yxwvvwxz~~{ywvtsrqqpooonnnnnooooppqqrsttuvxyz{|}~|zyxxxxyy{~}|{zyxxwvvuttssrrrqqqqqqqqrsstuvvwxyz{|}~~|{yxwuuuuuvvw}~}||{{{zzzzzyyyzzzz{{||}~~}|zywvvy}}|{zyxwvuuttssrrrrrqqqqrrrrsstuuvwxxyz{|}}~~|{ywutrrsuy}~}}|{{{zzzzzyyyyzzzzz{{||}}~}zxvtrqpqruy|}|{zyxwwvvuuuttttttttuuuuvvwwxxyzz{|}}~~|zxvtsqqqrtwz~~|{zyyxwwvvvuuuuuuuuuuuuvvvwwxxyyz{{|}}~~}{ywusqpnmmnoqtx{~}|zyxwvuttssrrrqqqqqqqqqrrrsssttuvvwxxyzz{|}}~}|zxwutsrrtux{~}}||{{{{zzzzzzz{{{{|||}}~~}{zxwvvvxz}~}}||{{{zzzzzzzzzzz{{{|||}}~~~}{zxvusrrrsuwz}~}|{zyyxxwwvvvvvvuvvvvvvvvwwwxxyyzz{{||}}~~~}|zyxvusrpoooopruwz}~}{{zyxwwvvvuuuuuuuuuuuuuvvvwwxxxyzz{{||}}~~}|{yxwuutttuvx{~~~}}|||||{{{{{{|||||}}}~~~|{zyxwwxyz|~~}}}|||||||||||}}}}~~~~}|{yxwutttttvwz|~}||{zzyyyxxxxxwwwwwxxxxxxyyyyzz{{{||}}}~~~~}}|{zywvutsrqqqqrtvxz}~}}|{zzyyyxxxxwwwwwwxxxxxxyyyzzz{{|||}}~~~}|{zyxwvuuuuvwy{}~~~}}}}}}}}}}}}}}}~~~~~}|{zyxxxxy{|~~~~~}}}}}}}}~~~~~~~}|{zyxwvuuuuvwxz|~~~}}||{{zzzzzyyyyyyyyyzzzzz{{{{|||}}}}~~~~~}}|{zyyxwvutssrsstuvxz|~~}}||{{{zzzzyyyyyyyyzzzzzz{{{|||}}}~~~~}||{zyxxwvvvvwxy{}~~~~~~~~~~~~~~~~~~}|{{zyyyyyz{|~~~~~~~~~~~~}}|{zyxxwvvvvwxyz|}~~}}}|||{{{{{{{{{{{{{{{{|||||}}}}}~~~~~~~~}}||{zyyxwvvutttttuvwyz|~~~}}}||||{{{{{{{{{{{{{{||||||}}}}~~~~~~}}|{{zyxxxwwwwxyz{|~~~~~}}}}}}}}}}}}}}~~~~~~~~}||{zzyxxwwwwwxyz{}~~~~~~}}}}}}}}}}}~~~~~~~~~}}|{{zyyxxwwwwxyz{|}~~~~~~}}}}}}}~~~~~~~~~~}}||{zzyyxxxwxxxyz{}~~~~~~~~~~~~~~~~~~~~~~~~}||{{zyyxxxxxxxyz{|}~~~~~~~~~~~~~~~~~~~~}}||{zzyyxxxxxxyyz{}~~~~~~~~~~~~~~~~~~~}}||{{zzyyxxxxxyyz{|}~~~~~~~~~~~~~~~~~}}}||{zzyyyxxxxyyz{|}~~~~~~~~~~~~~~~~}}||{{zzyyyyxxyyzz{|}~~~~~~~~~~~~~}}||{{zzzyyyyyyyyz{|}~~~~~}}}||{{zzzyyyyyyyzz{|}~~~~}}}||{{{zzyyyyyyyzz{|}~~~~~}}|||{{zzzyyyyyyzz{{|}~~~~~}}}||{{{zzzyyyyyzzz{|}~~~~}}}|||{{{zzzyyyyzzz{||}~~~~~}}}|||{{zzzzzyzzzz{{|}~~~~~~}}}|||{{{zzzzzzzzz{{||}~~~~~}}}||||{{{zzzzzzzzz{{|}~~~~~~~}}}|||{{{{zzzzzzzz{{||}~~~~~~}}}}|||{{{{zzzzzzz{{||}}~~~~~~}}}}||||{{{{zzzzz{{{{|}}~~~~~~~}}}}|||{{{{{{zzz{{{{||}~~~~~~~~}}}}||||{{{{{{{{{{{{||}}~~~~~~~}}}}}||||{{{{{{{{{{{||}}~~~~~~~~~}}}}}||||{{{{{{{{{{|||}}~~~~~~~~}}}}}||||||{{{{{{{{|||}}~~~~~~~~~}}}}}||||||{{{{{{||||}}}~~~~~~~~~}}}}}}|||||||{{{|||||}}}~~~~~~~~~~}}}}}}|||||||||||||||}}~~~~~~~~~~~}}}}}}||||||||||||||}}}~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}||||||||||||}}}~~~~~~~~~~~~}}}}}}}|||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}}||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~}{xwwtssrpqqqqqrstuwyyz}~|zxvtrpoooopqqstvxz|}~}{ywusqomkjhgfeedcccccccddeghjlnquz{p~uv|~}|zyxvtsrqpponnnoopqqrtuvxyz{|}~~}||{zzyzyyyyyzz{|}{upnrz{yxxxyz{|}~~~~~~~~~}xtrqtz~zwussrrrqqqqqqqqqqqpqpppppoppppppqrrstuvwxyz|}~~zvspoqu{}zwutsrrrqqqqqqqqqqqqqppppppppppqqqrrstuvwxyz{|~~{xtpliggjou|{wsomkjihggggfffffffffeeeeeeeeeeeffgghiijklnopqstuwxy{|}~~{wtqonptz|zxxwvvvvvvvvwwwwwwwwxxxxxxyyzz{{|}~~{zz}~}|{{zzzzzzyyyyyyyyxxxxxyyyyzz{{|}}~}yurppqty{yvutrqqppoooonnnnnmmmmmmmmmmmnnnoopqqrstuvwxyz{|}~~|yvspligefhlqw}}zvspnmljjihhhhhgggggggggghhhhhiijjkklmnopqrstuwxyz|}~|yvspoopsx~|zyxwvvuuuuuuuuuuuuuvvvvvwwxxyyz{{|}~~{yxy{}||{{zzzzyyyyyyyyyyyyyzzz{{{|}}~}zwtrppqsx}~{yxvtsrqqppooonnnnnnnnnnnnnnnooppqqrsstuvwxyzz{|}~~|zwtroligggilqv|~zxusrpommlkkkjjjjjjjjjjjjkkklllmmnoopqrstuvwxyz{|}~|zwtrpoopsw{}|zyxwvvvuuuuuuuuuuuvvvvwwxxyyz{{|}~~{ywwwy|}}|{{zzzyyyyyyyyyyyyzzz{{{|}}~~~{xusqppqsv{~|{ywvutsrqqppppoooooooooopppqqqrssttuvwwxyz{|}}~~|zxvsqnljhhijmquz~{ywvtsqpoonmmmmlllllllmmmmnnnoopqqrsstuvwxyz{||}~~|zxusqoooprvz~~}{zyxxwwvvvvvvvvvvvwwwxxxyyz{{|}~~}{ywvvvxz}~}|{{zyxwwvvuuttsssssssssttuuvwxxyz{}~~}{yxxxyz}~}||{{{{{|{xvxzvwyz{z{{{{||||}}~~}|zxvtrpnmmnoqtx|~}|{{{{{{||{zxx|{xxyz{|}}~~|zyxxyz}~}|zxxyz{{ywwvvwwxxyyyzzz{{|||}}}~~~~~|{yxvusrqppqrtwz~~}|{yyyz{}~~}|{{zz{{{||}~~}{zxwvvvvxz}~|{yxwvuuvwxyyyyyxxwwvvvwwwxxyyzz{{||}~~~}|zywvuuuuvxz}}|{yxwwvwwxyzzzzyyxxwwwwwxxxyyzz{{|||}~~~~|{zxwutsrrrstvx{~~|{yxvutssssttuvvvvuuttssssstttuuuvvwwxxyyzz{{||}}}~~~}}{zyxwvutttuvwy|}|{zzzz{{|}~~~~}}||||||||}}}~~~}|{{z{{}~~}|||}~~~~}}}|||}}}}}~~~~}|{zyxwwwxxz{}~}{zyyxxyyz{{{{{zzyyyxxxxxxxyyyyzzz{{{|||}}}~~~~~~}||{zyxwvutsssstuvxz|~}|zyxwvvvvvwxxyyyyxxwwwvvvvvwwwwxxxyyzzz{{{||}}}}~~~~}}|{zyyxwvvvvwxyz|~~}|||||}}~~~~}}}}}}}}}~~~~~}}||{{||}~~~~~~~~~~}}|{zzyyyyyz{|~~}|{{zz{{||}}}}}||{{zzzzzzzzzzzzzz{{{{|||||}}}}}~~~~~~~~~~~~~~~}}}||{{zyxxwvvuuttuuvwyz|~~}{zzyyxyyyz{{{{{{{zzzyyyyyyyyyyyzzzz{{{{||||}}}}~~~~~~~~}}||{zzyyxxxwxxyz{}~~}}}}~~~~~~~~~~~~~~~}}|||||}}~~~}||{{zzzzzz{{|~~}}|||}}}~~~~~~}}}|||{{{{{{{{{{{{{|||||||}}}}}}}}~~~~~~~~~~}}}}}|||{{zzyyxxwwvvvvvwxxz{|~~}||{{{{{{||}}}}}}}|||{{{{{zzzzz{{{{{{{|||||}}}}}}}~~~~~~~~~~~~~~~~~}}}}||{{zzzyyyyyyyz{|}~~~~~}}}||||}}~~~~~}}||{{{{{{{{{|}~~~~~~~~~~~~}}}}||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzyyxxxxxwxxxyyz{|}~~}}|||||}}~~~~~~~}}}|||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~}}}}}}|||{{{zzzzzzzzz{{|}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzz{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{{{{{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||{{{{{{{|||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||{{{{{{|||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||{{{||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}|||||||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}|||||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}||||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}|||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}|||||||}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}|||}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|zxwusssqqqqqqrrsuvxyy|~~}{ywusqpooopqqrtuwy{|}~{zxvtrpnljiggfeeddddddeeffhikmoruyrwwty~}~~}{zxwutsrqpoonooopqqrstvwxy{|}~~}}|{{zzzzzzzz{{|}~~xropw{xvvvwyy{|}~~~~~~~~zvsrsx}zvtrqqqqppppqqqqqqqqqqppppppppppqqrrsttuvxyz{}~}xtqppty}yvtsrqqqppqqqqqqqqqqqqpppppppppqqqrrstuvwxyz{|}~~zvrnjhgimsz{wsoljhhgfffffffffffffeeeeeeeeeefffgghiijklmnpqrsuvwyz{|~}yvrpopsx~|zxwvvuuuuuvvvvwwwwwwxxxxxyyyzz{{|}~~|zz|~}|{{zzzyyyyyyyyyyyyyyyyyyyyyzz{{|}}~~{wtqpqsw}{xvtsrqpooonnnnnnnnnmmmmmmmmmnnnnoopqqrstuvwxyz{|}~}{xuqnjhffgkpv{}zvspmlkjihhggggggggggggghhhhhiiijjkklmnopqrstuvwyz{|~~{wtrpoprv|~|zyxvvuutttttuuuuuuuvvvvwwwxxyyz{{|}~}zyy{~~}|{{zzzyyyyyyyyyyyyyyyzzz{{{|}}~|xusqpqsv{~{ywvtsrqppooonnnnnnnnnnnnnnnnoopppqrrstuvvwxyz{|}~}{yvspmjhggikotz~zwurqpnmlkkjjjjjjjjjjjjjjkkklllmmnoopqrstuvwxyz{|}~~{xusqoopruz}{zxwwvuuuuuuuuuuuuuvvvvwwxxyyz{{|}~|zxwwy{~}|{{zzzyyyyyyyyyyyyyzzz{{{||}~~|ywtrppqruy~~|{ywvtsrrqqpppooooooooooppppqqqrrsttuvvwxyz{{|}~}|zwuromkihijlpty}~{ywvtrqponnmmmllllllllmmmmnnnooppqrrstuvwwxyz{|}~}{yvtrpooprux}~|{zyxwwvvvvvvvvvvvvwwwwxxyyzz{|}}~|zxwvvwz|}|zywvuttsrqqppooooooooppqrrstuvwyz{|}~|zyxwxyyy|~}|{{zyyxxwwvvuuuutttttuuuvvwxyyz{|}~~~}|zywvtsrqqrrrst{~}}||{{{zzzzzzzzzzzz{{||}}~}{zywvwy~~}|{zyxxwwvvuuuttttttttuuuvvwwxxyz{{|}}~~|{ywvtrpooprv{~}||{{{zzzzzzzzzzzz{{{||}}~~}{xvtrqqqsvy}}|{zyxwwvvuuuuutttuuuuuuvvwwxxyyz{{|}~~~|zxvtrqpprtwz~~|{zyxxwwvvvvuuuuuuuvvvvwwwxxyyzz{{|}}~~}{yxvtrpnmmnorux|~}|zyxwvuttssrrrqqqqqqqqqrrrsssttuvvwwxyyz{||}~~}|zxwusrqqqrtwz~~}||{{{zzzzzzzzzzz{{{{||}}~~}{yxwvvwxz}~}}|||{{{{{{{{{{{{{{|||}}~~~~}{zxvutsrrsuwz}~}|{zzyyxxwwwwvvvvvvvwwwwwxxxyyyzz{{||}}~~~}{zywvtsqponnoprtwz}~}|{zyyxwwvvuuuuuuutuuuuuuvvvwwwxxyyzz{{|}}~~}|{zxwutssrstuwz}~~}}|||{{{{{{{{{{||||}}}~~}|{yxxwwxyz}~~~}}}}}}}}}}}}}}}~~~~}|{yxwvutttuvxz|~~}|{{zzzyyyxxxxxxxxxxxyyyyzzz{{{|||}}}~~~}||{zxwvutrqqppqrsuxz}~}||{zzyyxxxxwwwwwwwwxxxxxyyyzzz{{{||}}~~~~}}|zyxwvuttttuvxz|~~~}}}}|||||||}}}}}}~~~~}{zyyxxxxy{|~~~~~~~~~~~~~~~~~}{zyxwvvuuuvwxz|~~}}|||{{{zzzzzzzzzzzzzz{{{{{||||}}}~~~~~~}||{zyxwvuttsrrrstuvxz|~~~}||{{{zzzzyyyyyyyyyyzzzzz{{{{|||}}}~~~~}}|{zyxwwvuuuuvwxz|~~~~~~~~}}}~~~~~~~~}|{zzyyxyyz{|~~~}|{zyyxwwvvvwxyz|~~~}}}|||||{{{{{{{{{{||||||}}}}}~~~~~~~~}}|{{zyyxwvuutttttuvwyz|~~~}}||||{{{{{{{{{{{{{{{{|||||}}}}~~~~~~}}|{{zyyxwwvvvwwxyz|~~~~~~}}}}}}}}}}}~~~~~~~~~}||{zyyxxwwwwwxyz{}~~~~~~~}}}}}}}}}~~~~~~~~~}||{zzyyxxwwwwxxy{|}~~~~~~~~~~~~~~~~~~~~~~}}|{{zzyxxxwwwxxyz{}~~~~~~~~~~~~~~~~~~~~~~}}||{zzyyxxxwwxxyz{|}~~~~~~~~~~~~~~~~~~~~}||{{zzyyxxxxxxyyz{}~~~~~~~~~~~~~~~~~~~}}||{{zyyyxxxxxyyz{|}~~~~~~~~~~~~~~~~}}||{{zzyyyxxxxyyz{{}~~~~~~~~~~~~}}}||{{zzyyxxxxxyyz{|}~~~~~~}}||{{zzyyyyxxyyyz{|}~~~~}}|||{{zzyyyyyyyyzz{|}~~~~}}}||{{zzzyyyyyyyzz{|}~~~~}}}|||{{zzzyyyyyyyz{{|}~~~~~}}}||{{{zzzyyyyyyzz{|}~~~~~}}}|||{{zzzzyyyyzzz{{|}~~~~~}}}|||{{{zzzzyyyzzz{{|}}~~~~~}}}|||{{{zzzzyyzzzz{||}~~~~~}}}|||{{{zzzzzzzzzz{{|}}~~~~~}}}}|||{{{zzzzzzzzz{{||}~~~~~}}}}|||{{{{zzzzzzzz{{||}}~~~~~~}}}}|||{{{{zzzzzzz{{{||}~~~~~~}}}}||||{{{{{zzzz{{{{||}~~~~~~~~}}}}||||{{{{{{{{{{{{||}}~~~~~~~~}}}}}||||{{{{{{{{{{{|||}~~~~~~~~~}}}}|||||{{{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{{{|||}}~~~~~~~~~}}}}}||||||{{{{{{{|||}}}~~~~~~~~~}}}}}}|||||||{{{{|||||}}~~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}||||||||||||}}}}~~~~~~~~~~~}}}}}}}|||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}|||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~|zyxvuutsstssttuvwy{{|}{}{ywvtrqqqrrssuvxz|~}{ywusqomkjihggfeeeeeefffgijkmorvzyn~rsy}~|{{}}|{zywvutsrqqqpppqqrsstvwxz{|}~~}}|{{|{{{{{||}~{tomqy|xusstuvwxyz{|}~~~~~~~~~~}xtqqsy~zvsqonnnmmmmnnnnnnooooooooopppqqqrrstuvvxyz{|~zvrooptz}yusqoonnnnnnnnnnooooooooppppppqqrrsstuvwxyz{|}~|xtplhffintz|wsoligfedcccccccccccdddddddeeeeffgghiijklmnoqrstvwxz{|}{wtpnnosy{yvutssrrrsssstttuuvvvwwwxxyyzz{|}}~~{yy|}{zyxxwwwwwwwwwwwwwxxxxxxyyyzz{{|}}~}yurpopsx~{xusqponmmllllllllllllllmmmmmnnnoopqqrstuvwxyz{|}~}zwsplifeegkpv|~zvsomjihgffeeeeeeeeeffffgggghhiijjklmmnopqrtuvwxz{|}~|yvspnnpsw}~{ywvutssrrrrrrsssstttuuvvwwxxyyz{|}~~{yxxz~~}{zyyxxxxwwwwxxxxxxxyyyzzz{{|}}~~zwtqpopsw|~{xvtsqponnmmmmmlllmmmmmmmnnnoooppqrrstuvvwxyz{|}~}zxuroligfghlpuz~{wurpomlkjiihhhhhhhhiiiijjjkkllmnnopqqrstuvwxz{|}~}zwtrpnnprv{~|zywvuttssssssssttttuuvvvwxxyyz{||}~~{ywwwy|}|{zyyxxxxxxxxxxxxyyyyzz{{||}~~~{xusqpopsvz~~|zxvusrqppooonnnnnnnnoooopppqqrrsttuvvwxyzz{|}~}{yvtqnljhhhjlpuy~~{yvusqponmllkkkkkkkkklllmmmnnoopqqrsttuvwxyz{|}~}zxusqonopruy~~|zyxwvuuuuttttuuuuvvvwwxxyyz{{|}~~{ywvuvwz}~|zywvutssrqqpppppppppqqqrrstuuvwxyz|}}}{xvuttuwz}~||{zzzyyyyxxxxxxxxxxxwwwwwwxwxxxyyzz{{|}~}|zxvtrponmmnprvz~~}}||||{{{{{{{|||||||}}}}~~~}{yxwvwxz}~}|{zzyyxxwwwwvvvvvvuuuuuuuvvvvvwwxxyyzz{|}}~~|{ywvtsrrrsuwz}~}|{{zzzzzzyzzzzzzzz{{{{|||}}~~}{yxvuuuuwxz}}{zxwvvuutttttttttttuuuuvvwwwxxyzz{{|}~~~|{yxvuutuvwy{}~|zyxwwvvuuuuuuuuuuuuuvvvwwwxxyyzz{{|}}~~}{zxwutrrqqrstvxz|~}{yxvutssrrqqqqqqqqqqqqrrrrssttuuvvwwxyyz{{|}~~~|{zxwvuuuuvwy{}}||{zzzyyyyyyyzzzzz{{{|||}}~~~}|{zzzz{|~~}}||{{{zzzzzzzzz{{{{{|||}}}~~~|{zyxwvvvwxyz|~~|{zyxxwwvvvvvvvvvvvvvwwwwxxxxyyzz{{|||}}~~}|{zxwvutsrrrsstuwyz|~~|{yxwwvvuuttttttttttuuuuvvvwwwxxyyzz{{||}}~~}|{zyxwwvvvwxyz|}~}}||{{{{{{{{{{{{{{|||}}}~~~~}||{{{{||}~~}}}}|||||||||}}}}}}~~~~}|{zyyxxwwxxyz{}~~}|{{zyyyxxxxxxxxxxxxxxxyyyyzzzz{{|||}}}~~~~}|{zyyxwvuuttttuuvwxz{|~~}|{zzyyxxwwwwwwwwwwwwwxxxxyyyzzz{{{||}}~~~~}}|{zyyxxwwwxxyz{}~~~}}}||||||||||||}}}}~~~~~}||{{{{||}~~~~~~}}}}}~~~~~~~~}|{{zyyyxxyyyz{|}~~}}|{{{zzzzzyyyyyyzzzzzzz{{{{{|||}}}}~~~~~}}|{zzyxxwvvvuuvvvwxxy{|}~~}}|{{zzzyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~}||{{zyyyxxxyyyz{|}~~~~~}}}}}}}}}}~~~~~~~~}||||{|||}}~~~~~~~~~~~~}}||{zzzyyyyyzz{||}~~~}}|||{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~}}||{{zzyxxwwwwwwwwxxyyz{|}~~~}}||{{{{{{zzzz{{{{{{{{{|||||}}}}~~~~~~}}||{{zzzyyyyyyzz{||}~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}||{{zzzyyyzzz{{|}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{{{zzzzzzzzz{{|}~~~~~~}}}}}}}}}}~~~~~~~~~~}}}||{{zzzzzzzzz{{||}~~~~~~~~}}}}}}~~~~~~~~~~~~}}||{{{zzzzzzzzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzzzzzzz{{||}~~~~~~~~~~~~~~~~~~~~~~}}|||{{{zzzzzzz{{{|}}~~~~~~~~~~~~~~~~~~~~}}}||{{{{zzzzzz{{{||}}~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzzz{{{||}~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzz{{{||}}~~~~~~~~~~~~}}}||||{{{{{zzz{{{{||}~~~~~}}}}|||{{{{{zz{{{{{||}}~~~~~~}}}||||{{{{{{{{{{{{||}}~~~~~}}}}||||{{{{{{{{{{{|||}~~~~~~~}}}}||||{{{{{{{{{{{||}}~~~~~~}}}}||||{{{{{{{{{{{|||}}~~~~~~}}}}||||{{{{{{{{{{{||}}~~~~~~~}}}}|||||{{{{{{{{{{|||}}~~~~~~~~}}}}|||||{{{{{{{{{|||}}}~~~~~~~}}}}}|||||{{{{{{{{||||}}~~~~~~~}}}}}||||||{{{{{{{||||}}}~~~~~~~}}}}}|||||||{{{{{||||}}}~~~~~~~~}}}}}}||||||||||||||||}}~~~~~~~~~~}}}}}||||||||||||||||}}}~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}||||||||||||||}}}}~~~~~~~~~}}}}}}}|||||||||||||}}}}~~~~~~~~~~~}}}}}}}||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}}||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}|ywwussrqpqqqqqrstvwyy{~}{xvtsqooooopprsuwy{|}~|zxvtrpnljhgffeddcccccddeeghjlnqtx~uu|uy~~~~|{yxwusrqpoonnnnoopqqstuwxyz|}~~}||{zzyyyyyyyzz{|}ytppv~zxxxyzz{}~~~~~}}}}~~{wtrtx~|xvtsrrrqqqqqqqqqqppppppooooooppppqrrstuvwxy{|}}yurpqty{xvtssrqqqqqqqqqqqqppppppppooppppqqrsstuvwxyz|}~~{wsokhhimsy}yuqnljihggffffffffeeeeeeeeedeeeeeffgghijklmnoqrstvwxz{|}~zvspopsx~~{yxwwvvvvvvvvvvwwwwwwwwxxxxyyzz{{|}~}{{|~}|{{zzzzyyyyyyyxxxxxxxxxxyyyzz{{|}~{xtrqqsw}}zwutsrqpooonnnnnnmmmmmmmmmmmmmnnnoopqrrstuvwxyz{}}~}{yurokhgfhkou{{xtqomlkjihhhggggggggggggggghhhiijjkllmnopqrsuvwxz{|}~~{xurpoprv{}{zywvvuuuuuuuuuuuuuuuvvvvwwxxyyz{|}~~}{yy{}~}|{{zzzyyyyyyyyyyyyyyyyzz{{||}}~|yvsqpqsv{}zxwutrqqppoonnnnnnmmmmmmmnnnnooppqqrsttuvwxyz{|}}~}{yvtqnkihgikotz|yvtrqonmlkkjjjjjjjjjjjjjjjkkkllmnnoppqrstuvwxy{|}~~{yvsqpopruz~|{yxwvvuuuuuuuuuuuuuuvvvwwxxyyz{||}~}{yxxy{~}|{{zzyyyyyyyyyyyyyyzzz{{{|}}~}zwurqpqruy~}{zxvutsrqqpppoooooooooooopppqqrrsstuuvwxyyz{|}~~~|zxuspmkjiijlotx}}zxwusrpoonmmmllllllllllmmmnnnoopqqrsttuvwxyz{|}~~{ywtrqooprtx|}|zyxxwwvvvvvuuvvvvvvwwxxxyyz{{|}~}zxwvvwz}~}}|{zzyxxwvvutttssssssssttuuvwwxyz{|}~|ywvuuuwy|~~}|||{{{{zzzzzzzyyyyyyyyyyyzzzz{{|}~~~}|zxwusqomlkkkmorvz~~}}|||{{{{{{{{{{{{{{|||||}}}~~~|zyxwwxz|~}||{{{zzzyyyxxxxxwwwwwwwwxxxyyyzz{{|}}~~~|{yxvtsrqppprtvz}}||{zzzyyyyyyyyyzzzzzz{{{|||}}~~~}{yxwvvvwy{}}{zyxwwvvuuuuuuuuuuuuuuvvvvwwxxyyz{{|}}~~}{zxwvuuuvwy{}}{zyxxwwvvvuuuuuuuuuvvvvwwwxxxyyzz{||}}~~}{zxwutsssstuwy{}~|{yxvuutssrrrrqqqqqqqqrrrrrsssttuuvvwxxyzz{||}~~~}|zyxwvutttuvxy|~}||{zzzyyyyyyyyyyyzzzz{{{||}}~~~}|{{{{|}~~}}||{{{{{{{{{{{{{{{|||}}}~~}|{zyxwwwxxy{}~}|{zzyxxxwwwwvvvvvvvwwwwwxxxxyyzzz{{||}}~~~}|{zyxwvutsssstuvwy{|~~}{zyxwwvvuuuttttttttttuuuuuvvvwwxxyyzz{{||}}~~~~}|{zyxwwvvvvwxz{}~~}||{{{{zzzzzzzz{{{{{|||}}}~~~~}||{{{|}~~~}}}}}}}|||}}}}}}}~~~~~}|{zzyyxxyyz{|}~}||{{zzyyyxxxxxxxxxxxyyyyyzzzz{{{|||}}}~~~~}||{zyxwvvuuttuuuvwyz{}~~}|{zyyxxxwwwwwwwwwwwwwwwxxxxyyyzz{{{||}}}~~~~}||{zyyxxwwwxxyz{|}~}}}|||||||||||||||}}}}~~~~}}|||{|||}~~~~~~~~~~~~~~~~~~~~}||{zzyyyyzz{|}~~~}||{{{zzzzzzzzzzzzzzzzz{{{{||||}}}}~~~~~~}}|{{zyyxwwvvvvvvvwxyz{|}~~~}||{{zzzyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~}}||{zzyyyxxxxyyz{|}~~~~}}}}}}}}}}}}}}}~~~~~~~}}|||||||}}~~~~~~~~~}}||{{zzzzzzz{{|}~~~}}}||||{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~}}||{{zzyyxxwwwwwwwxxyz{{|~~~}}|||{{{{zzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}||{{zzyyyyyyyzz{{|}~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzzzzzzzz{{|}~~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}|||{{zzzzzzzz{{||}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}||{{{zzzzzzzz{{|}}~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}|||{{{zzzzzzz{{||}~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}|||{{{zzzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzz{{{{||}~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{zzzz{{{||}}~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{{z{{{{{||}}~~~~~~~~~~~~~~~~~~~}}}}|||{{{{{{{{{{{|||}~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{{{||}}~~~~~~~~~~~~~~}}}||||{{{{{{{{{{{|||}}~~~~~~~}}}}||||{{{{{{{{{{{||}}~~~~~~~~}}}}||||{{{{{{{{{{|||}}~~~~~~~~}}}}|||||{{{{{{{{{{|||}}~~~~~~}}}}}|||||{{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{{||||}}~~~~~~~~}}}}}||||||{{{{{{{{|||}}~~~~~~~~}}}}}}|||||{{{{{{{{||||}}~~~~~~~~~}}}}}|||||||{{{{{|||||}}~~~~~~~~~}}}}}}||||||||{{||||||}}}~~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}}|||||||||||||||}}}~~~~~~~~~~~}}}}}}}||||||||||||||}}}~~~~~~~~~~}}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}|zwvvsrrqpppppqqrstvxxy|~~{ywusqoonnoopprsuwy{|}~|zxvtrpnlkihgffeedddeeffgghjlmoruy}|rvw}~~~~~~~|{yxwusrqpoonmmnnnoppqstuwxyz{}}~~}||{zzyzzzzzz{{|}~xsqt|{ywwxyzz{|}~~~~}}}}}}}}~~zwttw|}yvtsrqqqpppppppppppooooooonoooooppqqrstuvwxz{|}}yurrsw}|yvtsrqqqppppppppppppoooooooooooppqqrrstuvwxyz|}~~zvrnkiilqw~{vroljihgfffeeeeeeeeedddddddddddeeeffghijklmnoqrstvwxz{|}~}zvsqqrv||zxwvvuuuuuuuvvvvvvvvwwwwwxxxyyz{{|}~}||~}|{zzzyyyyyxxxxxxxxxwwwxxxxxyyz{{|}~{wtrrsv{~{xvtsqppoonnnnmmmmmmlllllllllmmmnnoopqrrstuvwxyz{|}~~{yurnkighjnsy}yvrpmlkjihhgggggfffffffgggggghhhiijkklmnopqrsuvwxz{|}~~{xurqqruz~|zywvuuutttttttttttuuuuuvvvwwxyyz{|}}}{z{}~}|{zzyyyyyxxxxxxxxxxxyyyyzz{{|}}~|yvsrrsuy~~{xwutrqppoonnnnmmmmmmmmmmmmmnnnooppqrsstuvwxyz{||}~~|yvspmkihiknsx}}zwtrqonmlkkjjiiiiiiiiiiijjjjkkllmmnoppqrstuvwxz{|}~~{yvsrpprtx}~}{zxwvvuuttttttttttuuuuvvvwwxyyz{||}~}{yyy{~~}|{zzyyyyxxxxxxxxxxyyyzzz{{||}~|zwtsqqrux|~|zxwutsrqqppooooonnnnnnoooopppqqrrstuuvwxyyz{|}~~~|zwurpmkjjjlorw{~{ywusrqoonmmlllllllllllllmmmnnoopqqrsttuvwxyz{|}~~{ywtrqpprtw{~|{yxxwvvvuuuuuuuuuvvvvwwxxyyz{{|}~|zywwxy|~}}|{zyyxwwvuuttssssrrsssstttuvwxyz{{}~~{ywvuuvy{~~}||{{{{{zzzzzzyyyyyyyyxxyyyyzzz{{|}}~~}|zxwusqomlllmnquy}~}}||{{{{{{{{{{{{{{{{{{||||}}~~~|zyxxxz|~}||{{zzzyyyxxxxwwwwwwwwwwwwxxxyyzz{{|}}~~~|{yxvusrqqqrtvy|~}|{zzzyyyyyyyyyyyyyzzzz{{{||}}~~~|{yxwwwwy{}}{zyxwvvuuuutttttttttuuuuvvvwwxxyyz{{|}}~~}{zxwvvvvwxz|}|zyxxwvvvuuuuuuuuuuuuvvvvwwxxxyyzz{||}~~~|{yxvuttsstuvxz|}{yxvuutssrrqqqqqqqqqqqqqrrrsssttuuvvwxxyzz{||}~~~}|zyxwvuuuuvwy{}~}|{zzyyyyyyyyyyyyyyzzz{{{||}}~~~}||{{|}~~}}||{{{{zzzzzzz{{{{{||||}}~~~}|{zyxxxxxy{|~~|{zzyxxwwwwvvvvvvvvvvwwwwwxxxyyyzz{{||}}~~~}|{zyxwvuttsstuvwxz|}}|zyxwwvvuutttttttttttttuuuuvvvwwxxyyzz{{||}}~~~}|{zyxwwwvwwxy{|~~~}||{{{zzzzzzzzzzz{{{{|||}}}~~~}|||||}}~~}}}}|||||||||}}}}}~~~~~}|{{zyyyyyz{|}~~}}|{zzyyyyxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~}||{zyxwwvuuuuuvvwxy{|~~}|{zyyxxxwwwwwvvvvwwwwwwwxxxxyyyzz{{{||}}}~~~}||{zyyxxxxxxyz{|}~~}}}||||{{{{{{{||||||}}}~~~~~}}||||||}~~~~~~}}}}}}}~~~~~~~~~}||{zzzzzzz{||}~~}||{{{zzzzzzyyyyzzzzzzzz{{{{{|||}}}}~~~~~~}}|{{zyyxxwwvvvvwwxxyz|}~~}||{{zzyyyyyxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~}}||{zzyyyyxyyyz{{|}~~~}}}}}}}}}}}}}}}}}~~~~~~}}||||||}}~~~~~~~~~~~~~~}}||{{{zzzzz{{|}~~~}}||||{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~}}||{{zzyyxxxwwwwwxxyyz{|}~~~}}||{{{{zzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~}}}||{{zzzyyyyyzz{{|}~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{{{zzzzzzz{{|}}~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~}}|||{{{zzzzzz{{||}~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~}}}||{{{zzzzzz{{{||}~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~}}|||{{{zzzzzz{{{|}}~~~~~~~}}}}}}}}}}~~~~~~~~~~~~}}}|||{{{{zzzz{{{||}~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}||{{{{{zzz{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{zz{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{{{{{{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{{{{{{{|||}}~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{|||}}~~~~~~~~~~~~~~~~~}}}}|||||{{{{{{{{{|||}~~~~~~~~~~~~~~~}}}}|||||{{{{{{{{|||}}~~~~~~~}}}}|||||{{{{{{{{||||}}~~~~~~}}}}}|||||{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{||||}}~~~~~~~~}}}}}||||||{{{{{{||||}}}~~~~~~~~}}}}}||||||{{{{{|||||}}~~~~~~~~~}}}}}||||||||{{||||||}}}~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}||||||||||||||}}}~~~~~~~~~~~}}}}}}}||||||||||||||}}}~~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}|||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~}|{xvvtrrqppppppqrstuwxy|}~|ywusroonnnopprsuwy{{}~|zywusqomkihggfeeddddeeffghjkmoqtx|s}wv{~~~~~~~|{zxwusrqpoonmmnnnoppqstuvxyz{|}~~}}|{{zzzzzzzz{{|}~ysqsz|ywwwxyz{|}~~~~}}}}}}}}~~{wttv{~zwusrqqqpppppppppppooooooonoooooppqqrstuvwxy{|}~~zvsrsv|}zwusrrqqppppppppppppooooooooooopppqrrstuvwxyz{}~{wsoliikpv||wspmjihgfffeeeeeeeeeddddddddddddeeffghiijkmnoprstvwxy{|}~~zwtqqru{|zxwvvuuuuuuuuvvvvvvvvwwwwxxxyyzz{|}~~||~~~|{{zzyyyyyxxxxxxxxxwwwxxxxxyyzz{|}}~|xusrsuz|yvtsrqpoonnnnmmmmmmlllllllllmmmnnoopqqrstuvwxyz{|}~~|yvrolihhjmrx~~zvspnlkjihhggggfffffffffggggghhhiijkklmnopqrsuvwxy{|}~|xusqqrty~|zyxvvuuttttttttttttuuuuvvvwwxxyz{{|}~~|z{|~}|{zzyyyyyxxxxxxxxxxxyyyyzz{{|}}~}yvtrrrux}|ywvtsqqpoonnnnmmmmmmmmmmmmmnnnooppqrrstuvwxyz{||}~~|zwtqnkiiijmrw|~{xusqpnmlkkjjjiiiiiiiiiijjjjkkllmmnoopqrstuvwxyz|}~|yvtrqpqtw|}|zxwvvuuutttttttttuuuuvvvwwxyyz{{|}~}{yyyz}~}|{{zyyyyxxxxxxxxxxyyyyzz{{||}~~}zwusrqrtw{~|{ywutsrqqppooooonnnnnnoooopppqqrrsttuvwxxyz{|}}~~|zxuspnljjjknqvz~|ywvtrqponmmlllllllllllllmmmnnooppqrsstuvwxyz{|}~~~|zwusqppqsvz~|{zyxwvvvuuuuuuuuuvvvvwwxxyyzz{|}~~}{yxwxy{~}{zxwvutsrqqpooonnnnnnooopqrsstvwxz{|}~}{yyyyzzz~}}|{zzyxxwwvvuttttttsstttuuvvwxyz{{|}~~}|{zxvutsrrssstv}~}}|{{zzzzyyyyyyyyyzzz{||}~~~|{yxwx{~|{zzyxwwvvuuuttttsstttttuuvvwwxyyz{{|}~~~}{zxvtrqppqtx}~~}||{{zzzyyyyyyyyzzzz{{||}}~}{yvtsrqrtw{}|{zyxwvvuuuttttttttttuuuvvwwxxyyz{||}~~|zxvtsrqqsux|~|{zyxxwvvvuuuuuuuuuuuuvvvwwxxyyzz{||}~~}|zxvtrponnoqsvz}~}|zyxwvutssrrrqqqqqqqqqqqqrrssstuuvvwxxyzz{|}}~~|{ywutsrqrsux|~}||{{zzzzyyyyyzzzzz{{{||}}~~}|zywwwxy{~~}}||{{{zzzzzzzzzz{{{{||}}~~}|zxwutssstvx{~~}|{zzyxxwwwvvvvvvvvvvvvwwwwxxyyyzz{{||}}~~~}|{yxvusrqpoopqsvx{~}|{zyxxwvvuuuutttttttttuuuuvvwwwxxyyz{{||}}~~~}{zywvutsstuvx{~~~}|||{{{{{{{{{{{{{||||}}~~~|{zyxxxxz{~~~}}}}|||||||||}}}}~~~~~|{zxwvuutuvwy{~~}}|{{zzyyyxxxxxxxxxxxxxxyyyyzzz{{|||}}~~~~}}|{zywvutsrqqqrstvy{~~}|{{zyyyxxxwwwwwwwwwwwwxxxxyyzzz{{{||}}~~~~~}|{zywvvuuuuvwy{}~~}}}}|||||||||||}}}}~~~~}|{zyyxyyz{}~~~~~}}}}}~~~~~~~~}|{zyxwvvvvwxy{}~}}||{{{zzzzzzyyyyzzzzzzz{{{{||||}}}~~~~~~}}|{zyyxwvutssssstvwy{}~~}||{{zzzzyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~}}|{zyyxwvvvvvwxy{}~~~~}}}}}}}}}}~~~~~~}|{{zyyyyzz|}~~~~~~~~~~~}|{zzyxwwwwwxxz{}~~~}}}||||{{{{{{{{{{{{{{||||||}}}}}~~~~~~~}}|{{zyyxwvvuutttuvwxy{}~~~}}|||{{{{{{{zzzz{{{{{{{{||||}}}}~~~~~~}}||{zyyxxwwwwwxyz{}~~~~~}}}}}}}}}}}}}}}}~~~~~~~}||{zzyxxwwwwxxy{|}~~~~}}}}}}}}}}}}}~~~~~~~~~}}|{{zyyxxxwwxxyz{}~~~~~~}}}}}}}}}}}~~~~~~~~~}}||{zzyyxxxxxxyz{|}~~~~~~~}}}}}~~~~~~~~~~~}}||{{zyyxxxxxxyyz{}~~~~~~~~~~~~~~~~~~~~~~~~}}|{{zzyyxxxxxyyz{|}~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyxxxxyyzz{}~~~~~~~~~~~~~~~~~~~~}}||{{zzzyyyxxyyyz{|}~~~~~~~~~~~~~~~~~}}}||{{zzyyyyxyyyz{{}~~~~~~~~~~~~~~~}}||{{zzzyyyyyyyzz{|}~~~~~~~~~~~~}}|||{{zzzyyyyyyzz{|}~~~~}}}||{{{zzzyyyyyzz{{|}~~~~}}}|||{{zzzyyyyyyzz{|}~~~~~}}}||{{{zzzyyyyzzz{{|}~~~~~}}}|||{{{zzzzyyzzz{{|}}~~~~~}}}|||{{{zzzzzzzzzz{||}~~~~~~}}}|||{{{zzzzzzzzz{{|}}~~~~~~}}}|||{{{{zzzzzzzz{{||}~~~~~}}}}|||{{{{zzzzzzz{{{|}}~~~~~}}}}||||{{{{zzzzzz{{{||}~~~~~~}}}}|||{{{{{zzzzz{{{||}}~~~~~~}}}}||||{{{{{{z{{{{{||}}~~~~~~~~}}}}||||{{{{{{{{{{{|||}~~~~~~~~}}}}}||||{{{{{{{{{{|||}}~~~~~~~~~}}}}|||||{{{{{{{{{|||}}~~~~~~~~~}}}}}||||||{{{{{{{||||}}~~~~~~~~~~}}}}}||||||{{{{{{||||}}~~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}||||||||||||||}}}~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}||||||||||||}}}}~~~~~~~~~~~}}}}}}}|||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~}|zwwusrrqpqqpqqrrtuwxy{}}{ywtsqoonooppqstvxz{|~~|zxvtrpmljhgffeddccccddeffgikmoquy~xsux~~~~|{yxwusrqpoonnnnnoppqrsuvwyz{|}~~~}|{{zyyyyyyyyz{{}~|vqqv{xwxxyz{|}~~~~}}}}}}~~}yustx~|yvtsrrqqqqqpqqqpppppppooooooooopppqrsttuwxyz|}~{wtrqty|yvtsrrqqqqqqqqqpppppppooooooopppqqrrstuvwxyz{|~|yuqmjijmry~zvrnljihggfffffeeeeeeeeedddddddeeeffghhijklmopqstuvxyz|}~|xurpqsw~~{yxwvvvuuuvvvvvvvvwwwwwwwxxxyyzz{|}~~|{|~}|{{zzzyyyyyyxxxxxxxxxxxxxyyyzz{||}~}yvsrrsw|~zxutsrqpooonnnnmmmmmmmmllllmmmmnnooppqrstuvwxyz{|}~}zwtpmjhghkou{|yuromlkjihhggggggggggggggggghhhiijjklmnopqrstuwxyz{}~}yvtqpprv{~{zywvvuuttttttttuuuuuuuvvvwwxxyzz{|}~|zz{}~}|{zzzyyyyyyyxxxxxxyyyyyzz{{||}~~{wurqqsvz}zxwutrqqpooonnnnmmmmmmmmmmmnnnooppqrrstuvwxxyz{|}~~|zxuroljhhikoty~}ywtrqonmlkkjjjjiiiiiijjjjjjkkllmmnoopqrstuvwxyz{|}~}zwurqppruy~~}{yxwvvuuuutttttuuuuuuvvvwwxxyzz{|}~~|zxxy{~}|{{zzyyyyyxxxxxxyyyyzzz{{||}~~~{xvsrqqsuy}}|zxvutsrqqpppooooooooooooopppqqrrsttuvwwxyz{||}~~}{yvtqolkiijlosx|}{xwusrqoonmmmlllllllllllmmmnnooppqrrstuvwxyyz{|}~|zxusqppprtx|~|{yxxwvvvvuuuuuuvvvvvwwxxyyzz{|}}~~{yxwwxz}~}}|{zzyxxwvuutttsssssssssttuvvwxyz{|}~|zxvuuuwy|~~}|||{{{{zzzzzzzyyyyyyyyyyyyzzz{{||}~~~}|{ywvtrpnmlkkmoruz~~~}}||{{{{{{{{{{{{{{{{||||}}}~~}{yxxwxz|~}||{{zzzzyyyxxxxxwwwwwwwwwxxxyyyzz{||}}~~}{zxwutrqppqrtvy}~||{zzzyyyyyyyyyyzzzzzz{{{|||}}~}|zyxwvwwy{}}{zyxwwvvuuuuutttttuuuuuvvvwwxxyyzz{||}~~|{yxwvuuvwy{}}|zyxxwwvvvuuuuuuuuuuvvvvwwwxxyyzz{{|}}~~}|zywvutssstuvx{}}{yxvuutssrrrqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}}~~~}|{zxwvuutuuvxy|~~}|{zzzyyyyyyyyyyyyzzzz{{|||}}~}||{{{|}~~}}||{{{{{{{{{{{{{{{{|||}}}~~~}|zyyxxwxyz{}~~|{zzyxxwwwwvvvvvvvvvwwwwwxxxyyyzz{{|||}}~~~}|{zxwvuttssstuvwyz|~~}{zyxwwvvuuutttttttttttuuuuvvvwwxxxyyzz{{||}~~~}|{zyxxwvvvwwxz{}~~~}||{{{zzzzzzzzzz{{{{||||}}~~~~}|||{||}~~~}}}}}||||||}}}}}}}~~~~}|{zyyyyyyz{|}~}}|{{zzyyyxxxxxxxxxxxxyyyyyzzzz{{{||}}}~~~~}}|{zyyxwvuuuuuuvvwyz{}~~}|{zyyxxxwwwwwwwwwwwwwwwxxxxyyyzzz{{|||}}~~~~}}|{zzyxxxwxxxyz{|}~}}}||||||{{||||||||}}}}~~~~~}|||||||}~~~~~~~~}}~~~~~~~~~~}}|{{zzyyzzz{|}~~~}||{{{zzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~}}||{zzyxxwwvvvvvwwxyz{|}~~~}||{{zzyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}}~~~~~}}||{{zzyyyxxyyyz{|}~~~~}}}}}}}}}}}}}}}}~~~~~~}}}||||||}}~~~~~~~~~~~~~}}|{{{zzzzzz{||}~~~}}}|||{{{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~}}}||{{zyyxxxwwwwwwxxyz{{|}~~}}|||{{{{zzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~}}||{{zzzyyyyyyzz{{|}~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~}}|||{{zzzzzzzz{{|}~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{{{zzzzzzz{{||}~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~}}|||{{{zzzzzz{{{|}}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~}}}||{{{{zzzzzz{{||}~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}|||{{{{zzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzz{{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{zzz{{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{{|||}~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{{{{{{{{||}}~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}||||{{{{{{{{{{||}}~~~~~~~}}}}|||||{{{{{{{{{|||}}~~~~~~~}}}}}||||{{{{{{{{{|||}}}~~~~~~~}}}}|||||{{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{{||||}}~~~~~~~~~}}}}}||||||{{{{{{||||}}}~~~~~~~~}}}}}||||||{{{{{{|||||}}~~~~~~~~~}}}}}}|||||||{{{{|||||}}~~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}}||||||||||||||}}}~~~~~~~~~~~~}}}}}}|||||||||||||||}}}~~~~~~~~~~}}}}}}}||||||||||||||}}}~~~~~~~~~~~~}}}}}}}|||||||||||||}}}~~~~~~~~~~~~}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}}|||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~}}}|{|{z{{{{{{{}~z}~{yvsqomlkkjjkkmnpqsuwy{}~~|{yxvtsqpnmlllkjjjjjkkklmmnpqsux{v|zw|}zyxxz|~|{zxwutsqponmlkkkjkkklmnoqrsuvxyz|}~~|vst{}zyxxyz{|}~|wspnqu|zvsqoonnnmnnnnoooopppppppppppqqqrrssttuvwxy{|}~{wspnorx~zvtqpoonnnnnnoooooopppppppppppqqqrrsstuuvwxy{{}~~{wsokgeefjpw}|xsoligeedccccccddddddeeeeeeefffggghhijklmnopqrtuvxyz|}~{wsqpqty|zxwvvuuuuvvvwwwxxxyyyyzzz{{||}}~~{yxz}}{zyxxwwwwwwwwwwwwxxxxxxxxyyyzzz{||}~|xuqonnqu{{xurqpnmmllllllllllllllllllmmmmnnnoopqrrstuvwxyz{|}~|zwtplifddfjotz{xtqnljihggfffffffggggghhhiiijjjkklmmnopqrstuwxyz{}~{xurpopsw|~{yxwvuuutttuuuuuvvvwwwwxxyyzz{{|}~~{yxxy|~}|{zyyxxxxxxxxxxxxxxyyyyzzz{{||}~~}zvspnnnpty~~{xvtsqponmmmlllllllllllmmmmmnnooopqqrsstuvwxyz{|}}~}{xuroligffhkoty~|yvsqpnmlkjjjiiiiijjjjjkkklllmmnnoppqrstuvwxyz{|}~|yvsqpoprvz~|{yxwvvuuuuuuuuuvvvvwwwxxyyzz{||}~~|ywvvxz~~|{zzyyxxxxxxxxxxxxyyyyzz{{||}}~}zxurpnnopsw|~|yxvtsrqppoonnnnnnnnnnnoooopppqqrsstuuvwxyyz{|}~~}{ywtqoljhhhilosx|}zxvtsqponmmmllllllllmmmnnnooppqqrsstuvwxxyz{|}~~|ywtrpoopruy}~|{yyxwwvvvvvvvvvwwwxxxyyzz{{|}~~~|ywvuuwy|}|{yxwuttsrrqppppooooopppqrrstuvwxz{|}~}{yxwwwxxx{~}|{{zzyxxwwwvvuuuuuuuuuuvvwwxyyz{|}~~~}|zywutrqqqqrrrtz~}}||{{zzzzzzzzzzzzz{{||}}~~|{yxwvvy}~}|{zyxxwwvvvuuutttttuuuuuvvwwxyyz{{|}}~~|{ywusqponorvz~~}|{{{zzzzzzzzzzzzz{{{||}}~~|zxusqppqrux|~|{zyxwvvuuuuttttttuuuuuvvwwxxyyz{{|}~~~|zwusrpppqsvz~~}{zyxxwwvvvuuuuuuuuvvvvwwwxxyyzz{||}~~~}{ywusqonmmmoqtx{}|{yxwvuttsrrrqqqqqqqqqrrrrsssttuvvwwxyyz{||}~~}|zxvtsqppprtvz}~}||{{zzzzzzzzzzzz{{{{||}}~~~}{yxvvuvwz|~}}||{{{{{{zz{{{{{{{|||}}~~~}{yxvtsrrrstwy}}|{zzyxxxwwwvvvvvvvvwwwwwxxxyyzz{{||}}~~~}{zywvtrqponnoprtwz}~~|{zyyxwwvvuuuutttttuuuuuvvvwwwxxyyzz{||}}~~}|{yxwutsrrrsuwz|~~}}|||{{{{{{{{{{||||}}}~~}|zyxwwwwxz|~~~}}}}}}}}}}}}}}~~~~~}|{yxvuttsttvwz|~}|{{zzyyyyxxxxxxxxxxyyyyyzzz{{{||}}}~~~~}||{yxwvtsrqpppqrsuwz|~~}||{zzyyxxxxwwwwwwwwwxxxxyyyzzz{{|||}}~~~}}{zyxwvuttttuvxz|~~~~}}}}|||||||}}}}}~~~~~|{zyxxwxxyz|~~~~~~~~~~~~~~~}|{zyxwvuuuuvwxz|~~~}|||{{{zzzzzzzzzzzzzz{{{{||||}}}~~~~~~}}|{zyxwvutssrrrrstvxz|~~~}||{{{zzzzyyyyyyyyyzzzzzz{{{|||}}}~~~~}}|{zyxwvvuuuuvwxz|~~~~~~~}}}}~~~~~~~~}|{zyyxxxyy{|~~~}|{zyxxwvvvvwxyz|}~~}}}|||||{{{{{{{{|||||||}}}}}~~~~~~~}}|{{zyxxwvuutttttuvwxz|}~~}}||||{{{{{{{{{{{{{{{|||||}}}}~~~~~~}}|{{zyxxwwvvvvwxyz|}~~~~~}}}}}}}}}}~~~~~~~~~}||{zyyxwwwwwwxxz{|~~~~~~~}}}}}}}~~~~~~~~~~}}|{zzyxxwwwwwxxyz|}~~~~~~~~~~~~~~~~~~~~~}}|{{zyyxxwwwwxxyz{|~~~~~~~~~~~~~~~~~~~~}}||{zzyyxxwwwwxyyz|}~~~~~~~~~~~~~~~~~~~}}|{{zzyxxxxwxxxyz{|~~~~~~~~~~~~~~~~}}||{{zyyxxxxxxxyz{|}~~~~~~~~~~~~~}}||{{zzyyxxxxxxyyz{|~~~~~~~~~}}||{{zzyyxxxxxyyz{|}~~~~}}||{{zzyyyxxxxyyzz{|}~~~}}|||{{zzyyyyxyyyzz{|}~~~~}}}||{{zzzyyyyyyyyz{||}~~~~}}|||{{zzzyyyyyyyzz{|}~~~~}}}||{{{zzyyyyyyyzz{||}~~~~}}}|||{{zzzyyyyyyzz{{|}~~~~~}}|||{{{zzzzyyyyzzz{|}}~~~~~}}}|||{{{zzzzyyyzzz{{|}~~~~~}}}|||{{{zzzzzzzzzz{{|}}~~~~~}}}|||{{{zzzzzzzzz{{||}~~~~~}}}|||{{{{zzzzzzzz{{{|}}~~~~~}}}}|||{{{{zzzzzzz{{{||}~~~~~~~}}}}|||{{{{{zzzzz{{{||}}~~~~~~}}}}||||{{{{{{zz{{{{||}}~~~~~~~~}}}}||||{{{{{{{{{{{|||}}~~~~~~~}}}}}||||{{{{{{{{{{|||}}~~~~~~~~}}}}|||||{{{{{{{{{|||}}~~~~~~~~}}}}}||||||{{{{{{{||||}}~~~~~~~~~}}}}}||||||{{{{{|||||}}~~~~~~~~}}}}}}||||||||{||||||}}}~~~~~~~~~}}}}}}||||||||||||||}}}~~~~~~~~~~}}}}}}|||||||||||||}}}~~~~~~~~~~}}}}}}}||||||||||||}}}}~~~~~~~~~~}}}}}}}|||||||||||}}}}~~~~~~~~~~~}}}}}}}||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||}}}}}~~~~~~~~~~~}}}}}}}}}}|||||}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~|zyxwvvuvvvvvwwxyyz{|}~vzy}|zwurpnligedbaaaaabdegjloruwz}~}|{{{zzyyyyyyzzz{|}~}~~}}}~~xt{xropqsuvxwwxxxwwwvutsqpnlkjigfedccbaaaabbcdfgikmoqsuxz|~|}}|||}}}~~~~||{zzyyxxwwwwwxxxyz{|}~|xspopu{{wsqponmmmmmmmmmmmmmmmmmmmmmmmnnoopqrstuvwyz|}}xtqopsx~{wtqoonmmlllllllllkkkkkkkkkkkkkllmmnoppqstuvwyz{|~~{wsokgedfjov|}xtpligeedccccccccccccccdddddeeefgghijklmnpqrtvwyz|~}zwvvy~~|zzyxxxxxxxxxxxxxxxxxxyyyzzz{||}~}zxxy}|zyxwvuutttttssssssssssssssttuuvwwxyz{|}{wtpnlmosy~zvsqonlkjiiihhhhhgggggggggghhhiijjkllmnopqrtuvwyz{|}~~{yurnkhffgkpu{}zvrpmlkihhgggggfggggggghhhhiijjkllmnopqrtuvwyz|}~|yvtstw{|{zyxwvvvvvvvvvvvvvvvwwwxxyyz{{|}~|yxxy|}|{yxwvvuuutttttttttttttuuuvvwxxyz{|}~|xuromlmorw|}ywtrqomlkkjjiiihhhhhhhhhiiiijjkklmmnopqrstuvwxz{|}~|zwtqnkihhilpuz~{xurqpnmlkkjjjjiiijjjjjkkkllmmnnopqrstuvwxy{|}~|zwusrsux}~}{zyxwwvvvuuuuuuuvvvvwwxxyyz{{|}~|zxwwxz~}{zyxwvvvuuuuuuttuuuuuvvvwwxyyz{{|}~|ywtqommmoruz}zxvtrqponmllkkkkkjjkkkkkklllmmnoopqrrstuvwxyz{|}~}{xvspnljiijmpty}~|ywvtrqponmmmllllllllmmmnnnoopqqrstuvwxyz{|}~|zwusrrstw{~|{zyxwwwvvvvvvvvvwwwxxyyzz{||}~~{yxvvuuvwy}~|zxusrponnmmllllllmmnnoopqrstuvwxy{|}~~|ywvvvwy||yxzwtuvvvvvuuttttutttuuuvvvvwwwxxxyyzzz{{||}}~~|zxvtrqqqrtw{~~|~~{yyyzzz{{{{{||||}}}~~~}{yxwvwxz|}{z{{{xvtsrrrrrrrrssssssssttttuuuvvwwxxyyzz{{|}}~}|zxwvuuuvxz}~}{zyyxxxxxyyyyzzz{{{||}}~~~}{zxvuutuvxz}}|{{{{{zzyxwvuttsssssstttuuuvvwwxyyzz{||}~~}|zywvuuuvwy|~}|||||{zyxwvuutttttttttuuuvvvwwxxyyzz{||}}~~}|zywvtsrqqrstvy|~~|{yxxxxxwwvutsrrqqpppppqqqqrrssttuuvvwwxyyz{{|}}~~~}|zyxwwwwxy{}~}|{{zzzzzzzzzz{{|||}}~~~}|{{z{|}~}|{{zzyyyyyyyzzzz{{{|||}}~~~}|zyxwwwwwxz|~~~}}}}}|{{zyxwvvuuuuuuuuuuvvvvwwwxxyyyzz{{||}}}~~~}|{zyxwvutsssttvwy{}~}||{{{{{{zzyxwvvuuttttttuuuuuvvvwwxxyyzz{{{||}}~~~}||{zyxxxxyz{}~}|||{{{{{{{{||||}}}~~~}|||||}~~}}|||||{{|||||||}}}~~~~~}||{zyxxxxyyz|}~~}}|{zzyxxxwwwwwwwwwwxxxxyyyyzzz{{{|||}}}~~~~~}}|{zyxxwvvuuuvvwxz{}~~~~~~~}}||{zzyyxxxwwwwwwwxxxxxyyyzzz{{|||}}}~~~}||{zzyyyzz{|}~~~}}}}||||}}}}}}~~~~~}}}||}}~~~~}}}}}}}}}}}~~~~~~}||{zzzyyyzz{|}~~~}||{{zzzyyyyyyyyyyyyzzzzz{{{{||||}}}}~~~~~~~}}||{zzyxxwwwwwwxxyz{}~~~}}|{{zzzzyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}||{{{zzzz{{|}~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~}||{{{zzzz{{||}~~}}|||{{{{{{zzzz{{{{{{{{||||||}}}}}~~~~~~~~~~~}}|||{{zzyyyxxxxxyyz{||}~~~}}|||{{{{{{{{{{{{{{|||||}}}}}~~~~~~~~}}|||{{{{{{{||}~~~~}}}}}}}}}}}}}}}~~~~~~~~~}}|||{{{{{{{||}~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}|||{{{{{{||}}~~~~~}}}}}}}}}}}~~~~~~~~~~}}}||||{{{{|||}}~~~~~~~~}}}}}~~~~~~~~~~~~~}}}|||||{{||||}}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||}}~~~~~~~~~~~~~~~~~~~~~}}}}}|||||||||}}}~~~~~~~~~~~~~~~~~~~}}}}|||||||||}}}~~~~~~~~~~~~~~~~~~~}}}}|||||||||}}}~~~~~~~~~~~~~~}}}}}}|||||||}}}}~~~~~~~~}}}}}|||||||}}}}~~~~~~~~~}}}}}}||||||}}}}}~~~~~~~~~}}}}}}}||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m36.bin b/applications/SprPoP/dist/MUS/m36.bin deleted file mode 100644 index ef5ec94..0000000 --- a/applications/SprPoP/dist/MUS/m36.bin +++ /dev/null @@ -1 +0,0 @@ -}{xwvtrpomllkjjiiiiiiijkllmnoqrttuwxz|~}~}{zyyxxvuuttttsrrrrrssrrrrrrrqqqppponnnmmllkkkjjjjjjjjjkkkllmmmnopqqrsuvxy{}~|{~}}{zzyxxwvuutttsrrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrssttuuvvwxxyzz{||||||{zzyyz|~~~~~~~~~~~~~~~~~~~~~}||{||~~}||{{{zzzzzzzzzzzzyyyyyyyyyyyxxxxxxxxxxxyyyyyyyzzzzzz{{{{{{|||||||||||||||{{{{{{{zzzzzzzzyyyyyyxxxwwwvutsrqponnnnoprstuuuttsqponnmmlllkkkkkkkkkkkkkkkkkkkkkkklllllllmmmmnnnoooppqqqrrsstttuuvvvwwwxxyyyyzzzz{{{{{||||}}}}~~~~~~~~}||{zzzz{|}~~}||||}~~}}|{zzyyyxxxxxwwwwwwwvvvvvvvvvvuuuuuuuuuuuvvvvvvvvwwwwwwxxxxxxxxxxyyyyyyyyxxxxxxxxxxxxxxxxwwwwwvvvuuttsrqpoonnnnoprstuvvvvvutssrqpppoooonnnnooooooooooooooooppppppqqqqrrrssstttuuuvvwwwxxyyyzzz{{{{||||}}}}}~~~~~~~~~}||{{zzz{|}~~}}||||}}~~~}|{{zzyyyyxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxwwwvuutssrqqpppqqrstuvwxyyyxxwwvuuttssrrrrqqqqqqqqqrrrrrrrrrrrssssstttttuuuvvvvwwwxxxyyyzzz{{{||||}}}}~~~~~~~~}}||{{zzz{{|}~}}|||||}~~~}||{{{zzzyyyyyxxxxxxxxxwwwwwwwwwwxxxxxxxxxxxyyyyyyyyzzzzzzzzz{{{{{{{{{{{{{{{{{{zz{||}~~}|{zzyxxwwwwwwvvvvwwwwwwxxxyyyzzz{{||}}~~~~~}}||{{zzzyyxxxwwwwwvvvvvvvvwwwwwxxxxyyyzzzz{{{{|||||}}}}}}~~~~~~~~~~~~}||{{{zzyyyxxxxwwwwwwwvvvvwwwwwwwxxxxxyyyzzzz{{{||||}}}}~~~~~~~~~~~}}}}}}~~~~~~}}}}}}}}}}||}}}}}}}}}}}~~~~~~~~}||{{{{{|}}~~~~~}}}||||{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}~~~~~~~~~~~~~~}}}||{{zzyxxwwvvvwwxxyyz{{{|||}}}}}}|||{{{zzzyyyyxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}}~~~~~~}}}||}}}~~}}||{{{{{{||}}~~~~~}}}||||{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{|||||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}|||{{zzyyxxxwwwwxxxyzz{{||}}}~~~~~~~~}}}}||||{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}}~~~~~~~}}}||||}}}~~~}}|||{{{{{|||}~~~~~~}}}}||||||{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||{{zzzyyyxxxxyyyzz{{||}}~~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~}}}}||||}}}~~~~~}}|||||{||||}}~~~~~~}}}}}}}||||||||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||{{{zzzzyyyyyyzzz{{||}}~~~~~~~~}}}}}}}|||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~}}}}}||}}}}~~~~~~}}}}||||||}}}~~~~~~}}}}||||||}}}~~~~~~}}}}}|||||}}}~~~~~~~}}}}}|||||}}}}~~~~~~}}}}}}|||}}}}}~~~~~~}}}}}}|||}}}}}~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}{yxxy{|~~~~~~~}}||{{{{zyyyyyyxwwwxxxwwwxxyzyyz{||}|}~}z}~}||{{zyxxwvvusrqpponlkjihgfedcccbbbbbccdefghiklmopqstuvwyzz{||}}~~~~~|yxz}yvsrqqpqqqpppoooonmmmllkjiihhggfeeddddccccccdddeffghijklmnopqstuvwxyz{|}~~}}}~~~}}}}}}}}}}}}}}|||||||||||{{{{{{{|||||}}}~~~}|zxwvuuvwy|~}|zywvuutttsssssrrrrrrqqqqppppooooooonnnnnnnnooooopppppqqqqrrrrsssssssssssssssssrrrrrqqqqqqqqppppppooonnmlkjhgedcbbcdfiknopqponmkjihggfffffffffgggghhhhhhiiiiijjjkkkllmmnnoopqqrsttuvwwxyzz{|}}~~}|{ywvtsrrqrsuvyz|}~~}|{yxvutsrqqpooonnnnnmmmmmllllllkkkkkkkkkkkkklllllmmmmnnnooopppqqqqrrrrssssssssssssssssssssssssssrrrrrqqponmlkjihgggghjlnqstuvvvutsrqponnmmmllllllmmmmmmmnnnnnooooppppqqqrrssttuuvwwxxyzz{||}}~~~}|{zxwvussrrrstuwy{|}~~~}|{zywvutssrqqpppooooonnnnnnnmmmmmmmmmmmnnnnnnnooooppppqqqrrrssssttttuuuuuuuvvvvvvvvvvvvvvvvvvuuuutttsrrqponmlkkjjklmnprtvxyyzyyxwvvutsrrqqqpppppppppppqqqqqqrrrrsssstttuuuvvwwxxyyzz{{||}}~~~~~~~}}|{zyxvuttssstuvxy{|}~~~}|{zyxwvuuttssrrrrqqqqqqppppppppppppppqqqqqqqrrrrssssttttuuuvvvvvwwwwwwxxxxxxxxxxxxxxxxxxwwwwvvuuttsrqqponmmmmmnopqsuwxz{{|||{{zyxxwvvuutttssssssssssssssttttttuuuuvvvwwwxxyyyzz{{||}}}~~~}}}}}~~~~~~~~~}}}}}}}}}}}}}}}~~~~~|{zxwvutsssstuvwyz|}~~~}}||||{|{{{{{||||||}}}~}~~~~}|{zyyyyyz{{}~~~}}}||{zzzyyxwwvvuutttssssssssssstttuuvvwxxyzz{||}~~~~}}}}||{{zzyxxwvvutttsssstuvwxz{}~}||{zzyyxxxxxxxxxxxxyyyyyzzzz{{{||}~}~~}}~~~~~}}}|||{{zzyxxwwvvuuuuuuuvwxyz{}~~}}||{{{{{{{|}}~~~~~~}}}}}}}}}}}}}}}||{{zzyzz{|}~~~}}|||||||||||||||||||||{{{{{zzzzyyyxxwwwvvuuttttttuuvwxyz{}~~~}}}}|||||||||||||||||||||{{{zzzyyyz{|}~~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyxxxxxyyz{{|~~~~~}}|||||}~~~~}}}|||{{{{{z{{{{|}~~~~}}}|||||||}}~~~}}||||||}~~~~~~~}}}}}}}}}}}}}}||||||{{{zzzyyyxxxwwwwwvwwwwxyyz{|}~~~~~~}}}}}}}}}}}||||{{{zzzyyyzz{|}~~~~}}}}}|||||||||||||||||||{{{{{zzzzyyyyxxxxwwwwxxxyyz{|}~~~~}}}|||}}~~~~~}}}|||||{{{||||}}~~~~~}}}||||||||||}}~~~~~}}}|||}}~~~~~~~}}}}}}}}}}||||||{{{{zzzzyyyyxxxxxxxxxyyzz{||}~~~~~~~~}}}}|||{{{zzzzzzz{||}~~~~}}}}||||||||||||{{{{{{{{{zzzzzyyyyyxxxxxxxxyyyzz{|}}~~~~~}}}}}}}~~~~~~~~~}}}}}||||||||||||}}~~~~~~~}}}}}||||||||||}}}~~~}}}}}}}}~~~~~~}}}}}}}}||||||{{{{{zzzzzyyyyyyyyyyyyzz{{||}~~~~~~~}}}|||{{{{{{{{{|}}~~~~~}}}}}||||||||||{{{{{{{zzzzzzyyyyyyyyyyyyzzz{{|}}~~~~~}}}}}}}~~~~~~~~~~~}}}}}}}|||||||||||}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{|||}}~~~~~}}}}}}}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{|||}}~~~~~}}}}}}}}~~~~~~~~}}}}}}}||||||||{{{{{{{{{{{||||}}~~~~~~}}}}}}}~~~~~~~~}}}}}}}||||||||{{{{{{{{{{||||}}}~~~~~}}}}}}}~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{||||}}}~~~~~~}}}}}}~~~~~~~~~}}}}}}}}|||||||||{{{{{{|||||}}}~~~~~~}}}}}}}~~~~~~~~}}}}}}}||||||||||{{{|||||||}}}~~~~~~~}}}}}}}~~~~~~~~~}}}}}}}|||||||||||||||||||}}}~~~~~~~~}}}}}}~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}~~~~~~}}}}}}~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}~~~~~~~~}}}}}}~~~~~~~~~}}}}}}}}}|||||||||||||||}}}}~~~~~~~~}}}}}}~~~~~~~~~}}}}}}}}}|||||||||||||}}}}}~~~~~~~~}}}}}~~~~~~~~~~}}}}}}}}}||||||||||||}}}}}~~~~~~~~~}}}}}~~~~~~~~~~}}}}}}}}}}|||||||||}}}}}}~~~~~~~~~}}}}}~~~~~~~~~~}}}}}}}}}}||||||||}}}}}}~~~~~~~~~~}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|{yxwvutsrqpppprtwz{}~~}}}|||zyyyyxywwwwxxyxxyyzz|}}~~}{zxwusrqpponmmlllljiiihhhgffgikorvwrdivedlostvvvvvvwwwwxxxxyyyyzzzzzyyxxxwwvvuuuttttttuuvxyz{}~}{{zyxxwwwwvwwwwwxxyzzyxvsojfccgmswvrnifcbbbcdefghhiijkklmmmnnnnnnoooopppqqqrrstuvwxyz{|~}{yxxy|~|zyxwwvvvvvvvvvvvwwwwvvvvvvvvvvvvvvwwwwxxxyyzz{{||}~~~|zwuromllmoruy|~~|zwurpnlkiihgggggffffffffeeeeeeedddddddddddeeefffgghhiijjkllmnnooppqqrrrssssttttttttttuuuuuuuuvvvvvvvvvvvutsrpnljhfeeegjnrvxz{{yxvtrpnmllkkkkkklllmmnnnoopppqqrrrssttuuvvwxxyz{|}}~~}||{{{zzzzzyyyyyyyxxxxxxxxxxxxxxxxxyyyzzz{{|||}}~~~}}|{zywusqomkihhhjloruxz{{zywurpnlkjhggffeeeedddddddddddddddddeeeeeefffgghhiijkkllmnnoppqqrssttuuuvvwwwxxxxxyyyyyyzzzzzzz{{{zzzzyyxwvtsqomljiijknqtwz}~|zywutsrqpppooopppppqqqqrrrssstttuuuvvwwxxyzz{||}~~}||{{{zzzzzyyyyyyyyyyxxxxxxyyyyyyzzzz{{{|||}}}~~~~}|{zyxvusqomljjijkloqtwy{|}|{zxwusqonmlkjiiiihhhhhggggggggghhhhhhiiiijjjkkllmmnnooppqrrsstuuvvwwxxxyyyzzz{{{{||||||||}}}}}}||||{zzyxwutrqonmlllmoqtwz}}|{yxwvuttssssrrsssssssttttuuuvvvwwwxxyyzz{||}~~~~~~~}||{{{zzzzzyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~}}|{zywvusrpomllklmnprtwy{}~~~|{zxwutrqponnmmlllkkkkkkkkkkkkkkklllllmmmnnnooppqqrrssttuuvvwwxxyyyzzz{{{|||||}}}}}}}}}}}}}}}||{{zyxwvutrqponnmnoprtvy|~~}{zyxwwvvuuuuuuuuuuuuuuvvvvwwwxxxyyzz{{||}}~~~~~}|{{zzz{|~~}}|{zzzyyyxxxxxxxxxxxyyyyyyzzzz{{{|||}}}~~}|{zywvvuuuvwy{}~}|{{{zzzyyyyyxxxxxyyyyyyyyzzzz{{{|||}}}~~~|ywusrponnnooopqqpqqoonnlkkjiiihgghhijjjklnoqrrtuxy|}}~{ywuspnkigfdcb`_^^]]]\\\]]]^^_``abcddefghijkklmmnopqqrsstuvwxyz{|}~}zxvutsrsstuvvxyz{||{{{zywvtrpnmkihfedcbba``________``aabccdefgghijklmnoopqrstuvwxyz{|}~~|{yxxxxxyz{}~}}||{{{{{{z{{{{{|||}}}~~~}|{{{||}~~}}{yxvtsrqqpqqrsuvxyz{}}~~~~}}|{zyxwvuttsrrqqppppooooooopppppqqqqrrrrrssssssttttttttuuuuuuuuuuuutttttttttssrrqponlkjihgffgghiiiihgedba`__^__`abdeghjklmmnnnnmmllkkjjiihhhhhhhhhiiijjkkllmmnoopqqrstuuvwwxyzz{||}}~}|{zyxwwxxyyzzyyxwutsqppoooopqqrstuvwwxxxxxwwvvutssrqqpooonnnmmmmmmmmmmmmnnnnnooooppppqqqqqrrrrrsssssssssttttttttttssssrrqqponmlkjihhhiijklllllkjihggfffffghijkmnopqrrsssssssrrrqqppppooooooppppqqqrrsssttuuvwwxxyyz{{||}}~~~~}|{zyxwwvvwwxxyyyyxwvutssrrrrrrssttuvvwwxxxxxxwwvvuuttssrrrqqqpppppppppppppqqqqqqrrrrrsssssttttttuuuuuuuuuuvvvvvuuuuuutttssrqqponmllkkkkllmnoopppoonnmllllllmmnopqrrstuuuvvvvvvvuuuuttttttttttttttuuuuvvvwwxxxyyzz{{|||}}~~~~~}}}}}~~~}|{zyxxwwwwwwxxyyzzzyyxxwwvvuuuuuuvvwwxxyyyyyyyyyyxxxwwwvvuuutttttsssssssssssttttttuuuuuuuvvvvvvvvwwwwwwwwwwwwwwwwwwvvvvuuttsrrqpponnmmmmnnoopqqrrrrrrqqqppppqqqrrsttuuvvwwwxxxxxxxxwwwwwwwwvvvwwwwwwwxxxxyyyzzzz{{|||}}}~~~~~}|||||||}~~}}|{{zzyyyyzz{{|}}~~~~~~~~}}}}}}}}~~~~}}|{{zzyyyyyzz{||}}~~~~~~~~~}}}}}}~~~~~}}|{{zzyyyyyzz{{|}}~~~~~~~~~~~~~~~~~}||{{zzyyyyyzz{{||}~~~~~~~~~~~~~~}||{{zzyyyyyyzz{||}}~~~~~~~~~}||{{zzyyyyyyzz{{|}}~~~~}}||{{zzyyyyyyyzz{||}}~~~~}}||{{zzzyyyyyyzz{{|}}~~~~}}||{{zzzyyyyyyzz{{||}~~~~}}||{{zzzyyyyyyzzz{||}}~~~~}}||{{{zzyyyyyyyzz{{|}}~~~~~}}||{{{zzyyyyyyyzz{{||}~~~~}}}||{{{zzzyyyyyyzzz{||}}~~~~}}}||{{{zzzyyyyyyzzz{{|}}~~~~~}}}||{{{zzzyyyyyyyzz{{||}~~~~~}}}||{{{zzzyyyyyyyzz{{||}}~~~~~}}}||{{{zzzzyyyyyyzzz{{||}~~~~~}}}|||{{zzzzyyyyyyzzz{{||}}~~~~~}}}|||{{{zzzyyyyyyzzz{{||}}~~~~~~}}}|||{{{zzzzyyyyyzzz{{{|}}~~~~~~}}}}|||{{{zzzzyyyyyzzzz{{||}}~~~~~}}}}|||{{{zzzzzyyyyzzzz{{||}}~~~~~~}}}}|||{{{zzzzzyyyyyzzz{{||}}~~~~~~}}}}|||{{{zzzzzyyyyzzzz{{{||}}~~~~~~}}}}|||{{{{zzzzzyyyzzzzz{{||}}~~~~~~~}}}}|||{{{{zzzzzzzzzzzzz{{||}}~~~~~~~}}}}||||{{{{zzzzzzzzzzzz{{|||}}~~~~~~~}}}}}||||{{{{zzzzzzzzzz{{{|||}}~~~~~~~}}}}}||||{{{{{zzzzzzzzz{{{|||}}~~~~~~~}}}}}|||||{{{{{zzzzzzz{{{{{||}}}~~~~~~~~}}}}|||||{{{{{{zzzzzz{{{{{||}}}~~~~~~~~}}}}}|||||{{{{{{{zzz{{{{{{|||}}~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~}}}}}}|||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{||||}}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{||||}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{|||||}}}}~~~~~~~~~~}}}}}}}||||||||{{{{{{||||||}}}}~~~~~~~~~~~~}}}}}}}|||||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}|||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}|||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}|||||||||}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~}|zyxwvutsrrqqpppppppppqqrrrstuuvvwwxyz{z{|}~~~}{zxvsrpnmljhfedccba````___```aaabcdeffghjklmmoprstvvwyz|}~~~zxxusssqpqpoppoppppqrrstuvxy{}~~|{yyxwwvvvvvvvuuuuuttsssstw|syuu~}|{zzyyyyz{|}}{wyy|~}{zywvtrqpommlkjjiiiijkklmoprtvwy{}|}~}||}~~}}||{{{zzzz{{||}~{uqnnpu||xtqnlkjjiiiijjiiiiiiiiiiiihhhhhhhhhhhiijjkllmnopqrstuwxyz{|}~}zwsolhecdfjpv|~zvrnkigeddcccccccddddddddeeeeeeeefffgghhijjklmnopqstuwxy{|}~}yuqommnrw}{xusqponnmmmmnnnnnnooooooppppqqqrrsstuuvwxyz{|}~|{|~}|{{{zzzzzzzzzzzzzz{{{{{{{|||}}~~|xusrrtw|}zwurqpnnmmllllkkkkkkkkkkkkkkkkklllmmmnoopqrrstuvwxyz{|}~~}zwtqnkhfeefimrw|{xuqoljhgfeedddccccccddddddddeeeeffgghhiijklmnopqrstvwxyz|}~~|yvspnmmnpty~~{ywusrqppooooooooopppppqqqqrrssttuuvwxxyz{|}~}{yyz|~|{{zyyyyxxxxxxxxxxxyyyyyzzz{{||}}~}zwtsrrsvy}|ywusrqpoonnmmmmmmmmmmmmmmmmmnnnoooppqrrstuvvwxyz{|}~~~|ywtqnligffgimquz~}zwurpnlkjihgggfffffffffffgggghhiiijjkllmnnopqrstuvwxyz{|}~|zwurpnmmnorvz}{ywvtssrqqqqqqqqqqqqrrrrsssttuuvwwxyyz{|}~}{yxwwy{~|{{zyyxxxxxxxxxxxxxxyyyzzz{{||}~~~{xvtrqqrtw{~~|zxvutsrqqppoooonnnnnoooooopppqqqrssttuvvwxyyz{|}}~|ywuspnljihhikmptx|~{yvtsqpnmllkkjjjiiiiiijjjjjkkkllmmnnoppqrrstuvwxyzz{|}~~|zxusqpnnmnorux|~|zyxvvuttsssrrrrrssssstttuuvvwwxxyz{{|}~~|zywvuuvxz}~}|zzyxxwwvvvvvvvvvwwwwxxxyyzz{{|}}~~|zxvuuuvwy|}{zxwvvuttsssssssssssstttuuuvvwwxyyz{||}~}{ywtsqpoopqsvy}~|zyxwvuuttssssrrrrssssstttuuvvwwxxyyz{||}~~~|zywusqpoopqrux{~~|{yxwvvuuuttttssssstttttuuuvvwwxxyyz{{|}}~~|{ywusrppooprtvy}}|zyxxwvvuutttttttttttuuuvvvwwxxyyz{{||}~~~|{ywutrqpoopqsux{}|{zyxwwvvuuuutttttuuuuuvvvwwxxyyzz{||}}~~}{ywusrqpoopqsuwz}}|{zyxwwvvvuuuuuuuuuuvvvvwwwxxyyzz{||}}~}|zxwusrqpoopqrtvy|}|{zyyxwwvvvvvuuuuvvvvvwwwxxxyyzz{{|}}~~}{zxwutrqppoppqsux{~~|{zzyxxwwwvvvvvvvvvvwwwwxxxyyzz{{||}~~~}|zxwutsqppoopqrtwy|~}|{zyyxxwwwwvvvvvwwwwwxxxyyyzz{{||}}~~}{zxwvtsrqpoopqrtvx{~~}|{zyxwvuttsrrrrrrsstuuvwwyyzzyz{zz{zwwxvvwvsssssssppqqrsuuvy|}{}~}{zyxwvtrqomkjheca_\ZXVTSQQPQQSTWY\`cgjmqsvxz|}~}{xx|~zwusrqppooonnmllkjjigfecb`_]\ZYWVTSRRQRRSUVY[^adgknqtvxz|}~~~~}}|{{zyxwvutsrqponmmmmmmnoqsuwy|~~}{zyxwxyz}~}{zxwwvuutssrqqponmlkjigfedcbaa````aabdegilnprtvxyz{||||||{zzyxwwvuttsrrqpppoonnnnmmmmmmmmmmmnnnnnnnnmmlkjihgfeeefgjloqstttsrponlkjjihhhgggfffeeddcbba``__^^^^^^_`acegiknpsvx{}~}|{zyxwwvuuuuuvvwyz|~~~}}|{zywvutsrrstvxz|~~}|zywvtsrqponmllkjiihgfedcbaa`__^^^^^__`acdfhjlnpqstvwxyyzzzzzyyyxxwwvvuutttsssrrrrrrqqqqqrrrrrrrrrrqqqpponnmlkjiiijkmoqtvwxyyxwvutrqpoonmmllkkjjjiihhggffeedddddeefghikmoqsuwy{}~~}}}}~~~~~}|{zzyxxwwwwwwwxyz{|}~}}|{zyxwvutsrrstuvxz{}~~~~}|{yxvutsqqponmlkkjihhgfeedccbbbaabbbcdefghjkmoprsuvwxyzz{{{||{{{{zzzyyyxxxxwwwwvvvvvvvvuuvuuuuuuuutttsrrqponnmlllmnoqsuvxzz{{{zzywvutsrqqpoonmmllkkkjjiiihhhhhhhiijklmoprtuwy{}~~~~}}||||||}}~~~}|{{zyyxxxwwwwwxxyyz{|~~}}|{zyxwvuttssttuvxy{|~~~~}|zyxwutsrqponnmlkkjiihhggfffeefffgghijklmoprstuwxyzz{||}}}}}}}}}}||||{{{{zzzzyyyyyyyxxxxxxxwwwvvuuttsrqqpoonnnooprsuvxz{||}||{{zyxwvutsrrqppoonnmmlllkkkkkkkkllmmnoprstvwyz|}~~~}}}||||{{||||}}~~}|{zyxwwvuutttssssssttuuvwxyz{|}~}||{zzyyyyz{|}~}|{{zyxxwvvuuttssssssssssttuvvwxyz|}~~}}|{zzyyyyzz{}~~}|{zzyxwwvvuutttssssssssttuvvwxyz{|~~}}|{{zyyyyzz{|}~}|{zyyxwwvvuuuttttssstttuuvvwxyz{|}~~}||{zzyyyyyz{|}~~}}|{zyyxwwvvuuutttttttttuuvvwxyz{|}~~}}|{zzyyyyyzz{|}~}|{{zyyxwwvvvuuutttttuuuuvwwxyzz{|}~~}}|{{zzyyyyzz{|}~~}|{{zyyxwwwvvuuuuuuuuuuvvwwxyyz{|}~~}}|{{zzyyyyyz{{|~~~}|{{zyyxwwwvvvuuuuuuuvvvwwxyyz{|}~~}}|{{zzyyyyyzz{|}~~}}|{zzyyxxwwvvvvvvvvvvvwwxxyyz{|}}~~}}||{zzyyyyyzz{|}~~}||{{zyyxxwwwwvvvvvvvwwwxxyyz{||}~~}}||{zzzyyyyyzz{|}~~}}|{{zzyyxxwwwwwwwwwwwwxxyyz{{|}~~~}}||{{zzyyyyyzz{|}~~}}|{{zzyyxxxwwwwwwwwwxxxyyz{{|}}~~}}||{zzzyyyyyzz{{|}~~}}|{{zzyyxxxxwwwwwwxxxyyyz{{||}~~~}}||{{zzyyyyyyzz{|}~~}}|{{zzyyyxxxxxxxxxxxyyzz{{||}~~~~}}||{{zzyyyyyyzz{||}~~~}||{{zzyyyyxxxxxxxxyyyzzz{||}}~~~}}||{{zzyyyyyyzz{{|}~~~}||{{zzzyyyyyxxxyyyyyzz{{||}}~~}}||{{zzzyyyyyyzz{|}}~~~}||{{{zzzyyyyyyyyyyzzz{{||}}~~~~}}||{{zzzyyyyyyzz{{|}~~~}}||{{zzzzyyyyyyzzzzz{{||}}~~~~~}||{{{zzyyyyyyzzz{|}~~~~}}||{{{zzzzzzzzzzzz{{{||}}~~~~~}}||{{zzzyyyyyyzz{||}~~~}}|||{{{zzzzzzzzzz{{{||}}}~~~~}}||{{zzzyyyyyyzz{{|}~~~}}|||{{{{{zzzzz{{{{{||}}}~~~~}}|||{{zzzyyyyyyzzz{|}}~~~}}}|||{{{{{{{{{{{{|||}}}~~~~}}|||{{zzzyyyyyyyzz{{|}~~~}}}|||{{{{{{{{{{{|||}}}~~~~~}}}||{{zzzyyyyyyyzz{{|}}~~~}}}|||||{{{{{{|||||}}}~~~~~}}}||{{zzzzyyyyyyzz{{||}~~~~}}}|||||||||||||}}}}~~~~~}}}||{{{zzzyyyyyyzzz{{|}~~~~~}}}}||||||||||}}}}~~~~~~}}||{{{zzzyyyyyyyzz{{||}~~~~}}}}}|||||||}}}}}~~~~~~}}||{{{zzzyyyyyyyzzz{||}~~~~~}}}}}}}}}}}}}}}~~~~~~~}}|||{{zzzzyyyyyyzzz{{|}}~~~~~}}}}}}}}}}}}}~~~~~~}}}||{{{zzzzyyyyyyzzz{{||}~~~~~}}}}}}}}}}}~~~~~~}}}||{{{zzzzyyyyyyzzz{{||}}~~~~~~~}}}}}}~~~~~~~~}}}|||{{zzzzyyyyyyyzzz{{||}~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyyyzzz{{||}~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyyyzzz{{{|}}~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyyyyzzz{{||}~~~~~~~~~~~~~}}}|||{{{zzzzyyyyyyyzzz{{||}}~~~~}}}|||{{{zzzzzyyyyyyzzz{{{|}}~~~~~}}}|||{{{zzzzzyyyyyyzzzz{{||}~~~~~}}}|||{{{{zzzzyyyyyyzzzz{{||}}~~~~~}}}|||{{{{zzzzyyyyyyyzzz{{{||}~~~~~~}}}|||{{{{zzzzzyyyyyyzzzz{{||}}~~~~~}}}|||{{{{zzzzzyyyyyyzzzz{{||}}~~~~~~}}}||||{{{zzzzzyyyyyyzzzz{{{||}~~~~~~}}}||||{{{zzzzzzzyyyyzzzz{{{||}}~~~~~~}}}}||||{{{{zzzzzzzzzzzzz{{{||}}~~~~~~}}}||||{{{{zzzzzzzzzzzzz{{{|||}}~~~~~}}}}||||{{{{{zzzzzzzzzzz{{{|||}}~~~~~~}}}}|||||{{{{{zzzzzzzzz{{{{|||}}~~~~~~~}}}}||||{{{{{{{zzzzzz{{{{{|||}}~~~~~~~~}}}}}||||{{{{{{{{{z{{{{{{{|||}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{|||}}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~~}}}}}|||||{{{{{{{{{{{{{||||}}}~~~~~~~~~}}}}}||||||{{{{{{{{{{{|||||}}}}~~~~~~~}}}}}}|||||||{{{{{{{{{|||||}}}}~~~~~~~~~}}}}}}||||||||{{{{{{|||||||}}}~~~~~~~~~}}}}}}|||||||||||||||||||}}}}~~~~~~~~~~}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~}}}}}}}||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||}}}}}}~~~~~~~~~~~}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}|||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}|||}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~|xursx~zurpppqsssttttutuuwwxyz{{|}~~}{yxwuuuttux|z~}{wtqqwyvvuvvxz|~}}}~|zwupouqponnnooooonnnmllllmpuwxy{}}|x||{}}~~}}}}}}}}{vxslgeiryzuokiikmortwy{}xrprvz}|yvrppmnomnilnmortuvwyz{|}~~|~zxurplonnopqstuwxy{x{~xrrtz~{zz{~}{xusqomigkjlnquy}~xrqqtx{}}zxurpnmlkkjkklpuz~~|uttx|}ywuuvy|~~{zz|xsrtwxtka^WUVZ`ejlllkjiiijkmpsvy|vogbdir}xpjfcbbaefhjlnopoojilijknquy|{wsuy~}{zywwx||xzpkibcdjotwxxwuttuwz}ywz~zpfd^]_djptvwvtrpomlkkkkmpty|vkd``eltz}}zwtrrstvvwwwxy{}|zzzyx{}xuomot{|yxwwwvtqqpoqv}~~~}ywzxtqmoqv{}{|xtuxvpc\XPRUX^cgijihfedddefhkmpswz}uokkmsz|zxxwwusqonnprwz~|{zxxy{}~~||zx{zqpllnrw{~}|{{|}~~}|sohccdhntz|zy{xsruzytida^`bhmswyzyxvtqrsrtuwy{~|ujd_\_fjquwuspnmlllllkklnprtuvrtsqrrux|{{wxz~~{xwvy}~{vrnnqwzxqfd`]_bglptvxyyz{|{{}}vkfb]^_beiloqsuwwwvutsrrrstvxzy}~|}xoliikpw}~|{xyywwwxy{}||{z{}~xvqqrvx{|}|{yxwvvvwwwwvusssvz~{{~xqnihjmqvz~|zy{|~xrnmpqng][VUVY^chknooonmlllmnoqtvy|{rmiggimsw{|||}~~~}{yvuttuvwwtotpnnnpsvy{|}||||~{xy}wttqtw|}wroqwzrohfegjmpsutuxwxy{}||~|sifabbfjnsvxyyyxwvuuvvxy{}~yunfb^^^afmty||{yxvutssstuxz~}}}|}}|y{}~|{|~||~|xtollouwvnhgbcehmrw{~}wsruwvqkkgefgiknoppomkikiiijkmoqsvx{|~|{tojkjkpv}~}|||}ywttux|~xtrx||yqqomoqux{~~}|{{||}~~}}}}xttx}}tqnijkorvz}~{xvvwy{zwsqqstqhba[\]`dimqsuvwwwwwwxyz|~}}wtrpmllmqw|}xvuqpnnopruwxyuvwssrsuwz|~}~|{}}vojilooofc_[\]adimqsvxy{}~}~|snkeefilpsvxyyxvusqonnoqty~||zwojfcbbdhnv~~}}~}}{ttqrv|}|{z}{{zywvuvw}}xsomoty{ypolijknrvy|}~zxxyvqe`]XWX[^aehjklllkkkkklmopsuwz|~~xtomkjknt{~yurqqtx}|{{||}}{}}zzz{|}}|yuqpsx{|vrsopruy}|vrpquxwqhf_\\^cipw}{xvvvwxwwy{~}xnlgcdeilpsvwxxwzxwwwxxyz{}~xsidb`]\]`elt{~zwtrppqruxz||y}{yzy{}z||}z{}~|zyy{}~{|}{zxuqlgcbdimmhaa\Z[^aejnrux{~}}|}}~zole`_^`bfjotwz||{zxvtsrrqrqrvvwvw}|~|~~yrpmkjjknsz~}~}|{|}~}|xwqrsuv{~~}}|||}}}}|{zywwv~}xspnpsxzsnmhghjmquy|yusonmmnorvwvoge^\\]`bfilnopqqrrrrstuwyz|~{tpkhecceipy|zyzz{zzzx{wvuuvxz|}~~}|{{{{|||zxustw{~~xyxvy{}zvrnjhjouyzsomfdcdegjkqtvyz|~~{yxxy{~yttkjijloqtwyz{{{{{{{{||}}~~~z}zwuvz~wwplifecccehnu|~}}}||~|}~|xu{~}||{ywtplgddfknojjieffilptx|zuqnlmpu|}yxqnlkklmnoonprqqpqqqrrstuwxyz{x}yvvrqooopsx~}{yz{~}zvqrprvxwrtsqsux{}~zupmlosvvqrokllnpsuxz|}~}yuqmkjknsx{{troihghjmpruwyz{||||}}}}~~}~yww{}zxvtrponmnrv{~~{zyyz|~~{~~{zyz{|~}zyz}}}|}}}xsmgc`cijideb__`behlosvy{~~zvsrtw}}zwpomnoqsuwwxxwvtssrsuwz}{wttv{~{xxqolkkjklmpu{{xuuwyzwtxvx|}{ytwz{~}|zxuqmjhimqssnpljjkloqt{|ytomnqvz{ytpledbcdfhjlnopqqqrrrrsstuwxyz{zz}~ywtsrqqqrtw|~}}~~~~}~}{zxxwwvusqonptwyusvrstw{~|{wsnjghkmnjega`adhmrw{~{vqmjjmrz|{upomnoqsuuw{z{|||||||}}~}|}xvrokhgffefgjmrx~~|{|}~}z{yx{{}~~{ywurokfb^]_cgigdf```acfjnqux{~ytpnpt|{ypjgeegjnrvy|}}|{yxvusrqrusuturuzx{{}~~{xvw{~{vusrrrrstux{}{zzz{}}}{z{|{zytsrxy{~|x||}}zuqlhfjoqtqpqllklnqtwz~}xrmgcabhpw|{wwpligghikmoqrtuuvwwxyz{|}~~|}{urnlkjjkmpuz~}|{zzz{}~~|{zzyyxwurqqty|~{~{}~}zvspmjgfgjosuqqoigeddekmoruwz|~ysnklpy|yutsstuwxz{||}}}}}}}|||{zzyxu{~~}yuqopsx{zxztpnlkkkkllmpsx}}{yy|~~~{||xyz~|zxurokfb_^`ejmjmmiiiklpsvy}~wpidbdkv~ytqnmllkoooppqqqrrrsstuuvwwwu{||~~~{z{~zywvvvvwxy{}~~}}zxutsonnqtwwuxvttuxz}|xtokhhjortqsrnmlmnoqrtvxz|~ztnidbchqx~}xvrqqqrtuwxz{||}}}}}}|~~yuqprw|~|ywvtsrrqpptwy~}~~|}}~}}|{yxvvw{~~|~{{z}{vpje^^_`dgheiebbbcehjmpsvx{~}wqmklrz~{wvtttttttttssttuwy{~~{y~{{zy}||}}~~~}{xurpprvy|yyztrpppqrstuvx{~~|ywsqopsuxwx}{}~~y{|xyy||zwtpmifeeimqqnrnlkkkostxz}|unhddgoxzz~{vtrqqqrpqrtuwwxyzyyyxvuusqqpmmtsuvy}~xqnlmmnoqrtwz}~|{zyy}}||{ywtrpnlkihgfhjotxwz~zvols|xtw||~~zxwz|}|z~zyyxwsoow|xrppqrttwzz||}~~|~xspqv|}|xvuqt{|wspmkjjow~zwrsvssstuvy{~|ywtrnje`]^clsuusrrqruvwxww}{|}}~|zz{{}{yzzzz~|zxvusrpoljhggjnrvuvxsqonmmmnnpqrssttsrrrtx~~}~~}~|yuqnoposvz|}xxwqporv{}{{|}{wvvrrsux{~~}|}}}|{zyxxxyz{|}~}|||~zuonlknqtrtwrqooopqrsuvxyz|}~}yupkgefjpw{~~|zzyzz{|}~~~|yvtqommmmnpsvy}~~zwvrswtutttttsstux{~~|xusqrtx}|yutuy|}xuoklhfdcccdefgikmortwy|~~zyx~|yvusrrqrrstuvxy{}}{zz}|yyz|}}|yuqmjiiknsw{}~}}|{{|z~|zwtsuy}zxvvvwy{}zwuuwy|{~{ywusrstuwxyzz{~~~~~{wspoquz}{xyvrpnlkjiiiijjklmnopqrqy|}}|}zuqnnqv}}yvrvywyyzzzz{{|~~zzxsplkknswyy~{xvtsrqrtvy}~~~}ywtqonnoquy~~~~~~}{ywspljjlqw}}zwtrpnmlklmpsvx~}|z~~yrmifefkpw}}xtotvw{}~}{zzz|}~~|zvronnqv|}}|||}}~~~}zyy{~}ytrqnorvz|{}yxvvuuvwwxyz{|}~|vqmlmqv{}}yvsqomkkjjklnprsuvvvutrqoovvx}{ywvwz}zyyz}z}yxy{~}~}ysomnrx~|zxwwwxyy~~}}|{zzyxxxxxwvswwssqqrty}xtqpqtw{||{xuvwuvvwxyz|~~wrmmqrw{|~zvrokigeddddefghiklnoqrttvuw~}~~|{yxvtrqpopsw||xuronnoqsttsqpprvz|~|{{|~~||}|yvtrstx{~~~}{yxwvuutssrrqqptvuwxz|~|wspprw}}|{zyxwvvuttttttuuuuvtv{yz{{||}~|ywwy}~|zwtromkjijknrw{~|z{{}{~}}}{xuuu|~ytokhfgiloorvqpnnoqsuwy{|}}}}}~~}{{{}~~}|{{{{zzxwutrtutuuvvwvvsw{xyyyyz{{|}~}}}|zxuvxvvwxyz{}~}||{{||}~|yvsponprvz}{{xvvw{~|xurponnnnnnoopqsux{~}yvsrtw{}~|zywvutsrrrsuwy{}~}}}~|{{{{||||{yvtrpoopqvz{}}~~|~}|{zzzyyyxxxwvutstvy~~||{}}|}}|}~~vsromnnopqrrrrqqpppqqrstuvwxxx{wxwxz}~~~}}}||{{zzyyyxxv|~}~}~}{yxwvutsrqppopqtw{}|y{|z{{}~}zxxy{~~}|yxxxz{~~zwspoorv{|wtrsuz~zywxyz{|{zywvywxy{~|zwusrqqppqqrsstuvwyyyzy}{ywuttuwy{}}{x|~|}~~|zxvstsonkjijlqv{~}|zyxxxxxxyzz{}~|upkjkotxz}zvspooprux{}~~}zwtpmjiiknqrz}|zyww{yyzz{{|||||~~}|{z~}{zxwutsssuwz}}}}{{zzzz{{{{||||{zyxvtsssvxzz~~}zyxyy{}~|y||}}~xurqsuxzy~{vrmiebaabdhkortuvvwxz|}|||||z~{{zywvtqonmlmoqux|~{y~}}}}}~~~~|zxvtrqoooprv~}{yvtqommorw|~}{zxvuwwuutttuvwy{}}|zzz{~~}}|zwvuuvwxyyyyxvtsqpqrtw{}zywvvtz{z|}~{yvspnlkjiiijklmoqrtuy~}{ywutsssux{~~||~~~}{ywutstwy}}}||||||}~~~zuqopruvy~~~~}}}}||{zywzzwwvvvvwxz{}}~{}|zyxy{}~{zyyy{|}~~~~}|yxtuxttsrrstux{~}|{{zyxwvutttuwz}}}|{zzyz~~~}}|||~~~}}}}~~{|yvuuvwy{~~|zxvuvxz}}}zxutsrrrrstuwxz|~~zvsqpoprtvvv}|}|zy|~}~}}{zxwutru{z}~~~}|{zyxwvwx|}|{zz{}~~~}zwspnnoqty~~~}}}}~~~|xutuvxx||{zyyyyyzzzzyyxwwvvuvwxz|~~|yvsrqqqqoosnmlmpswz|~~}|zyxxy{}~{}|}}}}|zxxxy{}}{}~~~~~~~~~~}|{zxvuttvy|~|zywwvw{z|}}}}~{zz{{y|~|xsqnljihgggghikmoqtwy|~~}~~}}~}zvrnjhfffhknpsuvvww~}{z{~|zxvtrpnmlkkklorw|}{ywvvwz}|{zz{|}~~}{zxy|zzzzy{|{z|}~~{ywvutssrrsvuuvvvwwxxyyzz{{|}|||~}{wurponmmnnoooonljgekkknqtx|~~}}|{zxwuuttuvwwxw|}~~|zwvvwz|}}|{zzzz{{|}~~~|}~{zyyz|{yvusssstvwxz{{|||||{{z{}{zz~~~~~~~~~~~}{zz{|}|~}|}~~}~~~}}|{zxwuu{{z||}~~~}{ywusrqqrtvxy{|~~~~~~}|zxwuuvxz}~|zywvvuuuttttsstuw{~~~~~~~}{yurpopruwx}}{zyxxwwwxxxyyz{{|}~}zwuttuvxw}|}}~~}}||||||||||{{zyy|~}}|{zzzzzzzzyxwusrqqrtty~~|yurolkkmptvz~~}}~~~~}~~{yxyyyxzyvtsrrrstvwy{|~{xvuuuutyxtsrrstuvwxxxxxxyyzz{|||}}}||z|}{{|~~{xtqnkjijkmpsuwy{|}~{wtrrsuy|~~|zywwvvvwwyz|~|zxyy{|}zxvtrpoqpnnnnnooqrtvwy{}}~~~~}{zxwvuuuuuuvuvux~|~~~~|zxvuttssssrqpomljjjlnqtx~}}~~~~~~}|~~~}{zyxwwwwwwwwxxxyyyyyy|}{{y~}}~~|{yxwvuutsrqorwtutuuvwxy{|~~|zxvtsstvwyz}}{wtrpooqsvy|}{xvvv{~|zxwvvwxz~}|{yxwwvuuuuvwxz{}~~}}|{zywvuttuwy|}~~}||{}}~}|{zxwuuvxz}}{yzzxwvwxy{|~|zxwvvvvvvutsqnkgecceinsw~~}~~}~~}zxvvvvw~}|{zzzzz{{{|||||||}}}~~~~~zxvvvvwvx}yxvvwx{}~}||||}}~~~}|zxvtttuwy{|}{zyyyyzz{||}}}||{zzyzz{}~|zwtqnlkklnprsyyusomkkkloruy|~{xtrpnmmnrrsuwy{}~}}}}}{|zzwsrqrrsttttsrrqqqrrstvwxyzzz~|{zxwutsqponmmnorux|}|zxvusrrtuwxx~}yxusqpppqrrsttttssrrrrtux{}{ywwvwxyyzzzzyxwutsrqrvuvwwz~}}}~~~|zyyz|}~~~~|zywvuttssrrqqxyyz{}~~}|{yxwutrqponnnpqsu|}{ywvvz}~}{zyxxwwwwwwwwwuy}zzyyyyz{|}}~}}}~}|zyxxxxy{|~}{zz{|~~}|zxvvxusyxvvuuttttuuuvwwxyzz{{{{{|~~}}||}~}{yxwutrqpoooqsvz~}z}}|{{{{zzyyxvusrqppqrstvwy|~{xutssuwy{~}}{|~|{ywvttuwy|~}|{ywuspnllkmoqsx~~}}}}}~~~{xvtrrqqrrrrsstuwwx~|ywutsssttwyxxwwwxy{}~}|yvuuvx{~~{{{xwwwyz{|zxwvuttttuuvwxxyyzz{{|}~}{yxxyz|}}{ywutssssstuwy{~~}|||}}}}}|{zyyyxy~{ywusrqpponmlkjiiijlnqtz~~~~}{ywvuttttuvvwx|~}}~~}|{zyxwvusrqpoooopqsw}{{}~~~}{{zyyyyyyyyyyyyyzzzzzzz{~{xvsqnmkjiiijklnpqstttsrpuwvwxz~|}}zxz}zzzz{{}~}{{|yxvtrqonnmnnryyz{||||{{zzzz{{{{{{{{zzz{|~~~}{zyxwwvvwwxy{}~}{zyxxwwwwwvvvuuttsrrqqppvyxzz{|}}}|{zyxwwwx|}}~~~~~~}}|}|zyxwvuttstuwy}~}{zyxwwwy}|zywvtrpomlkkmoqsv}}|zywvuuuuuvvwxy{|~~}|||~~~~~~~~}|{zyxxyyzz{{zywutrqppor{ywwvvvvwxyz|~~~~~}}}~~}}}}~~|zxusqomkkklmopwxvvttssstuvwxz|}~~}}}}}~~~}}zxvttsttuvwxyzz{{||~~|yvtrqqrstx}zywtrpommlmotvxz|~~|zyxwwvvvvvvvwxxyz|}~{ywxyxyz{}}{zyxwvvuuuuuuuuvvwwxy{{}~~|zxwvuttsssssttuuvwxyyzz}}xtqnlkkmortwz|}}|{yvtqpqpnnovyy{|}~~~~~|zxwuuu{~}}}~~|{zzyyxxxwwwwwwwwwvvuy~|||}}~~}}||{{zyyxxwwvutv}||~}{zzzz{|~~~}|zywvutsrrqrxxwwvuttvutuvwy{}~}||}}{zy|}~}|zyyxwwvvvwxz|~}{zxvtrqonmmmnoqtx|~~~~~~~~~~~}}|~}{zyxxyz|~}zxvvzxvuttttuvwxyyzzyxvsrrolkjkmptx|zwussstvw{~~}}}}~~~|zxvtrpommlmmopsuwy|~|{yxxxxyyz{{|}~~}zxvutuvxz{}{ywvuuvy~~}|~~}|{zxwutrponnnprtwx~~|ywvuuvxy{}~~}||{{{||}~}zxyxwxy{}~{yxvutttttuvxy{}~|zyyyyz|}{xurpnlkjjijjklnpruwz|~~}}}~}zxvtsstuvxz{|}}}}}||~~~}}{ywvvvvw{wsnkhedcccemopsvy|~~{wtrqpqqrttx{wussuuvxz||wt{{}zyxwvuuttuvxz~{xurqonnmmmnoprux{|tsy{~~~~}|{z{~zursx}~zuqonnoqsvy|~~~}~~~}||}{}|xtpkhhky}yvtsrqpoooquvwxz|}~~~}||}}{{zzzz{~~}|{{z{|}~~zxvuvy~~ytpnnu}~zwurqomlklmjihhhikmpsz|{|{{zzzyyyzzzzzzzzzzzyyyxxwww{||||}~}{yvtrqqrsu{~||||||}~~{wtpnmmt||yvtttuvvwywurpmlkkltxy|}~}}||||||}}}}~}zxvwvuuvx{|zx{}zzyyxxxwwwwwwxxyyzz{{||}~~{wspmpuw{|xuromkkkjiijlnpvyxxxxwxxyyz{{||||}}~~{yyy{|~}{ywvvvvwxy{|~~zwssussv{~|||}~{wsomkpsrtvxyzzzzyxwvutsssssttuwy{~}{{{xwwxz|~{yvy|z{|}~}|{zyyxxxxyz|~}zz~{{|~|xtpmkihhkoqsuw~~}|zyxxwwwwwwxxxyyyyzzz{{{||}zwusrrrsuwy|~}|}~~||~yusruy~}}}}|{yvurmjlomoqtx{~~|zxvtrqpppqrtwz|}|zxwvwxwwxz}~}|zyxvtsrqqpqrux{~{yy|zwwwxz}}zwtrqppquuz}zywvtsqqpqqstvx{}~~}}~||{yyyz}~|{zyxxxxyzz{}~{yxwyz||~~ytolklpu{~|{~~yxvvwxyy{|||{zxvsqnlkjklnrvz~~|{ywutrstttuwz|~~~}|{zyxwvvvwy{}~}}zxvutuvx{}zwusrrrsty}|{zyxxxwxxxxyyyzzzzzzyyxwvuv{}|~~{xxwuuvy|}{yxvuuuuuvwxy{}~|zxxy|ztpmmnrv|~}|}}~~~}~{xvvvvwy{|~~}|zxvtrqqrsux{~}||{{{||}}}||{|}}|}}~}|{{zyxwvusrrrrtvx{~}{z~}zyxxxyz{}}{xvutttw|zyzywvuttttttuvvwxyz{{|}}~~~~~|yvtrqsvx{}{xwvutttuuvwyz|}~}}}}xsnigfgkqw~{xvuuuvxyz{{zywvsrpooprtw~~|zxvuuvvuvx~|ywusqppqrtv}~|{zyyz{}~}|{{{|~|zxwvvuuuuvvvwxxyyyzzzz~|zyy||zxvvvvwxz{}~~}}~~zvspoprv{~}~}|{xvtrqqpqrx|{|||||}}~~~}|{zzz}~{yvsqponoqtw{~}|{zzz{{}}zwuuusrrrstvxz|}~~~}|{zyxwwwxz~}||{{zzzzzzzzz}~}~~~}|zxuromllnrv{}zxwvuttsrrrrrsuwy~~~~~~~~~~}}|{zyxvutu{~|zyxxxxz{~~}|||||}~|{yxvuttttuvxy{}~}|{|}||{{zzzzzzzyyxwwvy}|||}~~}{zxxwwwxy~}||{{zzz{{||}~~|zyxwwy}~}{yvspmkjkmpuy~~|zzyyzzz{{||}}}zxvuttsttuwxz|~}{y|~||~}{yxwvvvwxz}~|{zxwwvwwxz|~~|zyxwwxzzyyzzz{{{|||||}|{ywvutsstuwz}~|{zyxxwwwwwwxz~}}|}}~{xvuttssrqponmnprv{}{xvtsstuwy{}~|{zyxxyyz{|}}~~~~}|zywuxzwwwxz~~|zyyyyz|~}{zzyyyz{|}~}{zw|usqnmommmlrpmmmkkqrruw|}|}}~{zyz|}~}}|{zywuronotw{|u~}}{xzwxz}zwsokgefkonqnmnoqrtz{~{qgcnxplmnpruvuz{}|ywy~{zzzzzz{~~|~}z{~}{ywsnlnutqolmmpptxz}~wogbbhv}xtprsu{}}xuy|vqliijlmmmmpw~{ywrvtvyz}|yusy}zvutrnjjqtomhggfgjjlnpruvy~|zvvx~wuyvqmihhhhfda`cjpoonllhilnpruwz}}xplihkjklnprsuuy|}~}}wutwz{vsoljlqy|ywqlc`c`bcfimqtx{}~}zvw}yvyy|}wnggmnqtux{ywusrqrsttvzz{x|}}~~xst}~{zxy{}yqpsy|vnhfgeefffghijlnoomjkswvupstvy{}~wuqommot|}vnmtx||vvtuvxz}}tkcafq}~xusrsuwz{{wrnqtolecfgjmopuwy{}}}|||}}~~~||zxutvy{~vokortvomjfffghjlnpsvy{~}vmkkkpw~vqrxurmfggggeghhjknpsuxyw{|zyy{~~{|}~~~{|wqnigfffghikmortwww}~|wrnllou}{wspqssvwyzzzyxvqqronmns{~{wqmnsspmjkmpsvy}ypjluz}vrnlkjjkllnoppmqpstuxy{}}~~zvyytrnow~~~||ywyvspmmqwywvqnjfbakljieghknqtvy||vqljmry~|utvuvwxyz{{|}zy~|{yyuplihinv|y{|wnecegb`[Z\_cfjmpruwyz|{~}{xuspnljihkntu~}yvw~{ytttuuvutpmnov}{|~|x{}smhinkhc^^]^_`acegilorsvyw~~z{ywwx{xuttttspnnjjov}~|z~}|tqrwx||rnkjkmoqsuvwwwvstpruuxx{zy{xwwy{z{xxxz|~}yvw~zwvrnkkovzywqsqqrstuwxz|}~~|yx}skgjllnmsx~~}}}|}z{yx{yxwyxyyz{|~}|xsqvtsssxxzxvvvxy|}~ywvxzzxvssrsstuvxyz{yvtx~~~}yvz~vqlhda`adlvxqqpkigloqsqppqrrrqtuuwtuz{~~{xsnjjoy~|{{zzzyvrnksvutoonossvwy|~~~}}}|||{{{zyxwx|yxytqlknnnlhfeeedhjlnpppwx{}}wvvy}xuyyzxrpnmpqrtuwy|||~}}}|yvuw{}wyz{{xwutpqpnmlkjglnqux|}}|~|zxvtspqu|}zxzxxxxyz{|~~~}}xy{}xv{}|}~~xtxy{||}wvussrsrrnpsqssuvwxz{|{~|ywx~~y{{|~}wwzyytppsw~~zywvz~xux}~{xxxxxyyz{|~}rmmlihfekt|}}~|vsvwvusrsvy{}}{xwy}~~~|{yzxwvuvy}}{{~{snmrrrokkklmoprsuwz|}~{vtonllkkloqt~|y{}z}urqqqrsssssrppqu{|}~~~~~~~~~~wsuttrlkijklmoprtvxy~{urqrsuwyzzuwurpnnosz}|}|wsppsvtzywyz{}~~~}{xtruzz|yxyz|}{wwy~~~{xusrrqqqqqpptuuwtt{{|~~}~{zvrr}}zwwx|z|~xwutstrruuutspoqwx{zwxy{{~|utussonquz~}z|{zzzyuz|{}~}xux}{}zvvuwy||}|snkjlpv~~{wqlkoqstqstwyz~~ywtsqomlklru{~{|~}|tlknruvxutstvwz|~~}~}||zyvtrqrx~|xspsvwxrqppqpruuwxz{}}|zzyyywvyxxxxyxxtuz~}~~womjnsuxxuuuwxz|}~{~}||}~~|{{y|zvqllqv}||}~|{y{{yzz{|~xvuvvwxx|}~xtsuxxzvsrqqqsstrsxwyz|}}{zyxwvtronq{}~{z{~{x{{{wvvvvvyz{}zyzzxuux}|ywvvvvtrwvwyz{}~~~|zyyz{}}}zvstuuskihjov||ysuuyxttstsvwwwxyy{|~~|upopssvuux{}zxvv{}}zyyyz|}~{||zyxxvuxuusvz|{yyyxqmjhjkklmoqsux{}~}xvw|}zxusrqppnsx{zyx{~{zyz{}~~|x~}}|ywvuutwzy}|wywwx|{xuwxwxwvutssstvxxy{vuv{}}~~|{zwy|}~}}}}}}}}|{yusov}}~}|||~~{yy~~zwvw{|~{xwvvuuuvvwxyzzx}}|}}yvwy~|wqqtx~|zvrqs{}}}~~~zwux{~~wutttuvuy{ywqohbbciow~~|xy~}zwwx{}{yyyyyw|}}~|zyxxz}|}|{{{zxuqoquwzurrrrssswz{}}}vqnmlkjjiijmpu{~|zuqnmptwz|ywwvxxyw{~}~~|zwttrpox}{xtpquvzwssrsstxwy}}vpljijkmoqstuuusrolqqsx}||}~yvtttutu|z~{yxy~}||~~{xutsvtutwxxz{}}~{{ywwwxxyyyz{|}}~}{~}{yy||zywwtrvuxwxyz{|~~|x}|{~}{ywtpljnsz~~|{}|{zyy|{|}~}{yx}~|tqnnoprtwy{}|~}|{}wsttxwstvy}}|x~}ywv|x}~}zy{}{uqrqrux|}zuuvx}}xtqppqrsuvxy{}|xtpnmoruz|}|y|~||||||{|~{y||yzwwvvvvutwvwxy|zxwuw}~xusttuuvwxyzz{{|{y~}~~}zvsqoprwz~{wsmkjgmot{}}|xvwx|~}{yz{|}~{wutsssttuuwxyyzx}}|~{yxz}|y{wuyxwxwwwwwxz||y|z}}zwxy|~}|}}~~{ysonpv~~{yxwvvvvwxxzz{y||}~~|yxvuvx|zwrttrttvxz|~~zupllqy{||yvtsv|}zx{~~ytrrtw{~|}}zxvuuw{}}}z|~~{yz{}zwttvtuwz~}yuqvw{|wvtuuvwyz{{zxz~|xtrqponnmmmoqtwzz~~|ywvvxyz{yvtrpuuvxz|~|wwvy~wvrtwwz{||{zywusroovx|xy{~~}|{zzxz~~yvv||xxwwwxyyzz{{{zytz|z|}~{xvsrsuz}}zywurwxxzz|}~}{|~~~~~{wzwvxz|~~~}{{{{{|||{{xw}}{zyyyyzzzz{{zyx{~}~~~|~~}}|{zz|{xtrqwy{}|zyuy|{}}}zwtrut||xzxz{}|ytvusuy~{wpniddhmw{|~zvuy~||{zzyyyxxwyzx~|{|||||{|}}}~~~~~~~}{xvtvwy~zyyz{|}~~}|zurprsxxrpmmlmorvz}u{~}|~{ywuutuvwxyz{z|{|xvspkkihkory|}~~zz}{zzzzzzzzzz{{{{|{zvx~|zvrnlpxyvvrrqqqpmlomorv||tqpoooruvy{~}}yuuwz}zxusqqrtx|}yyxyyxwusstx||~~}z}~|vvuutsvuuuvy|{uw{xsrrtuvwyx{~yrommllkkkjkmosw{}vqrsuw{xusqppprtvxyw|}wt{|yxxwvtqnkhhjox|{yz{}}yy~|vuttsswuuuuy~|xz{sonmnnopqrtvxz}~wpnlnqswwtsrrtx{}|{{z}~}}||zz{~|w{~ztsutttttttuwy}~|ww~|zusssstttuuuuuyzzysnoxytqoljkgfffhlqxyurqruy~~~~~~}}|{{zz{|{xy}{utqsuxyy{|}ztvz|xvpnmmmmnnopqsvzyx}|zwvuuuvvwxy{{}|wspljkilmqutvxz}{{{zzzzyyyxxxwwvvvxy}~}{zxtpmpxzxwssrrprrooopsv{xtrqptuvxz}~yy{|~z||yxutrrqrsuy}~yxwvtsrrsvy~}}}}y{}|~~{x{|wvusuwuuuuvxz}zzz}{uuuvwwx|}~}z~zwpnmmllllkklmort{}}{wvwzwxtqpnnmnnpqsuvuz}~}xuvy~~zwwvurpliggjou~}|}}~~zwx|zutsruvuuuyy{}~{xrpooppqrsstvwyz|~~{}{~{wqnpquxutqpooprt|}|z{~|{zywwx{|{yz~zyvtsstttsstuvx|{yz}|vutttttssrsuttw{{~}}}zwutrw}{ysonkmljigghjnsx~wutwy}~}||{|{{zyxvutux}{||uwuvzyzz{|}~~~{xusyyxvponnooppqqrsx}|}~zxwwwwwxxyyzz}xrnjllmostrrqsux{~~}|zzyyxxwvusrrsux{~~~~}|{zywtqnpwyzzutsvutsrqqqsvz|xuvxwxy{}|wty{xvuttssstux{~zxusrrsvy~~}{}}|}|y|}}~~}}|~xvuxwvvvvvwwxz||||{zyz~~zwz|zztqonnnnnmnnopty|~z|~yywtrqpooopqsuwxzx}||wux~}ywusoljhjkpwz~{ww|~~xutwvuxzyz{}|}}}vtrrrrstuvwyz|}{vwzxzvtxywusqponoosy{|}}{zxwvxz}|xx}~xwuuuuttttuvx{}~zz~ywuttssqtututy{|~}{zzz{|wux{zysonpmlkjiiikoty{z{~}||}~}}|{zyxwtsqqrx||zwyzyzz{{|}~|{}{}}}wtswyyxrpoopppppquwy}|ywvvvwwwwxxy}~~|~}zsllnnqusqonmnprvz}~}}{yywvusqonmnqty{}~{}~~}}|{zyxvsonpwy{yvxuutsrqpoppv||xyxwwxyz||}}xwwzvsrqqqqqqrtvy|{urpqsuz}{zwvxwwxxxvz{{}~|z|}vwwuuttsrqppqtx~}{{{xz|{}}zvty{zyronmmlllkkkkouy}}yy~~xwsponmllllmnprtvwv|}~~~yutx}}ztqnlkkllqrqstw{}xuv{}}{tutswwwwxyz{~{x{}||vsrqrrstuvwxxyz~~ztqtz{zwtrpomllllptvz~~~yxvuuwy||~yx{ywuuutttssstuvwz{}|}zy~ywttrrutssruxxz{}~}|{z{||xspsvwxqrpnmlkjiijlpty~~|{{{|}|~}{xwtsponprz|{}{{{{{||}}~~~~~|{wy}}~{wtrvxz{utrrqqpruuvxz}|yxxxxyyyy|~}yxywysssuwutqpnnnoqtw{~}zxvtrpnmmprx}~~}y{|}}~}}||{{zyxvsppvx{zxwvusrqpqvw{}|{{{||~}~zwtsrrrssstvx{~|wuuw|}|{ywxyxyyzzzx}}}~{z~~~|zwwvutrqpoprw|~{wtwy{|vtrqppoonmnvvx{~~{vtrppoooopqrtvwyyx~~|zvtuyz}ytqoooqutrqqqtw{~|~~zwuyy{|yxywwwxxxyz|~|z|}{ywvvvwwxxyyz~}~zvssv}~yurqponmmnrrux|{ywwyz~|~zz~~zyvvuuttsrrrrsux{|{{xtvvutssrvwwxy{|}{|~~|{{{|}~|xsonqttxvsqponmlllmnqtz~|{z{{|}~~{|~yvsrpooqqx~|~~}|{{{{{{{{{zyxxwxv{~}||}{yusrvwz{usqqptttuuvxz}|zyyyyyyy}}}~~~|wssuu{{{xutqpnmmmnoqtwz}~~}yvtqonmnoqwyxxxwvrw|z{{|{{{zyyxwuspnpyz~zywvutrqoqsruwz}~}|{{|yzzz}wtrqqqqrrstuwy|||}}}z{~}{ywuuwvvvwwxxxu{{{}}~{yx|{ywtsqpommmosw~~~yz~|xutwxz|vsqpoonmmsttvx||wsqponnnnooprsuvxwx~}|yvsqruuzvsrruwusqonmoqtx|~|yy{z{~}yvtww}|ywwwwwwxxy{|{y{||zxwwwwwwwz}|~~|~~|{yxwz|~{wsqpnnmloqqsux|}{yz{|~{z}~}{xwvutrqpooorvz}{}~|}ywvutstwvwxyz||}{{||{{|}|yvroloqx}wvsrponnmmmnty|}|{{||~|{}~~xtpoooqv{zzz{|~~~}}||{{zyxwwxz|~}|~~|zwtruw|~yvuwvuuvvwwy{}~}|{zzz|~~ytpqt~~zvsqponnnopsuy|}ytqonnosxxyxxxwwvv|}|}}}}}||{{zywuutsxz~}yxvtrpsqpqrtvz}{wwx{zwtsrrrrrstuwy{|xwz}~|ywuvxvwwwxyzzzx~~~|xwy~{xtqomllmpu{|~~|{{}yvtvx|ywtrpoprtttvwz|}{}|wtqpoonoopqrtuww{}{~}{yuqnnqszyx{zxvspnmllnptw{~}{xyyy|~~yvsw~}zxwwvvwwwxyz|~~zx{}~{yxwwwwz{{||}}}}}~~~}|{{||~{yyz{yuqonmlmpooqrux{}~|~~}}}}}~~}{|zz}~|zvusqonlllnqv}~{z||~{xvtsruvuuuvwwxwwtvzxz{~~|ywtrnljntw|wurqonmlklpqtw{~||{{{{|}~|yxyy}ytqppsvwyvvuuvxz}~}}|zzyxvutttvx|}}}||{z{~}}|{zxusruvz|yyuutttuuuvwy{|~}|{zyy}}||~|zvuszyurponnnnnoqsvx{~~xtqppquxvvutssssswtx{z{{{{{zzyxwvxvtsswy|zwusqqronmmnquz}zy~|xvssvy{|~~}~~}|~|sp}z|~}ysux~||wxwyyyxxwwwwwvuvt~~|{{|~{{~tt}vux{~|{|wrptyttoliku~|{{}xtuleddeefghijkmquuwtwz{~}zwrory~vmn{{y{~{v|}{~~~|||~|z{|uru~}wyyyz{{zywx~{usw{vslgechotz|}}yoop}zphhjlkhfehmsy|~yyzxyz~zwttv}xrrwurqlllnstuvwyz|}~~}zwrpz|z~|}~ztps~xprvqqmkkklnrx~{vw}yrnkihiijlnnpnptuy{~yuu{zw{{}yuqnt|urtw|}{zz{}~z|}~~}~{vvuw}}{yz}z||xupljihghjouy}{phgsyrqrrplklmqvw{~||{{|~}{yxx{|x|{vslkllnprsuwxz{}~|wxttv|}~}|zz|~{vrru~wpiddfjiklosyyqps{wromlklklijnnqtz|}{vty~yuw~zxy|}{vrqwztnqtw|~}||}~~|}|{yz{|}~~~|zwvxz{uqt~|tmkjjihgggimrw~ymdcir~xvwxwtqolovy}}}}~}}~|{{}|wpmlkjnnoqrstuz}}~}{~|{yxx{~zsqsz~|xvvy{zurprx}vu{umgddeghikmpuz|xtsrtzywrommijmmpsvx{}{vppyyyzy{~|z}{yy{|{wrqt~~{xsqux}}|{yx}}~{}xvvwxyz{{{{{z}|zxvywxtuxwzzussnlkjihgghkoty{~|}yxtoigjr}|}}|uqqnqx}~~}{xwy|zyxwx|wqqqooomoqqtuwy{}~~|~}}|~ztrqsuy}}yutuxzztlps{|wy~{zyxytqlgfeffgiotx~~{xvuuvyzvonpoqruvyz|}~~}~|vrqwvstoquz~}z~~zz|}|wqllu||~zvrtw|~z}|~~wsuvuvwxyzz{|}~~~~|wx|~~zsmotwvvqmkjihhhjmptuzwuuwwupljms|}zvvw{|wst{~~|w{}|xqmmu~|zxvutssssrvwy{}~~{|yvtrrrtwz|~~yvtuwvyxsvz~yssrtwwtqliiikmptw|}~|{yyyyz||zuwwwxyz{|}~~~{wsqvxwvoklorw{|{{zumhksz~~{xx}|xvvvwwy|xwvvuutsqrttz~|zxyz~soica_`adhmrw|~{{~wrqsy~~{wtstvzy~~}~{yvuuvx}||yyroqrstuvwxyzz||~~}{}wv|zzwvtqmjijmqrrpqx{xz{sieddegjmqw~~{xsttvy~~ywvvwxxyuvywxxxxxxxy}|{yuuv~~}|}~wxxzyvttyzuqnruwz{}}}~~zz||vuuuvvvvuutttuv{{sry}xskgdbaabdhlrw}~vu{yrlkou{}ywtw}~~~}yy~zwussv{~}ztssssruuvwxyz{{|||zz}}vrnnprtrokhjlptwwvu{~zy||}vqnihghikmpty~{vqqrstvx{}zyuyzwxxxxxxyyyyxvsonq|}{}}~zyzzzwuuy~}{vtqsxz|}{vtuuvwwwvvuuttttuvx}}{|}tqpppolgdbbfginrx~~yy{yywtspnosy}yzxz}~|zwssw~~~{xvuuvwwwy~zxwvvuutuxyxz{|}~~}z~}~~xplkloqttsqnllotx{zxrx}|{vsuvtsokjijlosw{{usqqqrsv{|~|~{{zzzzyyzyyxvsnlntvsqsuy~}|y}}{xtqqu~|z|~}yvuu{xuttuuuuxxwwwwwwwwwuz||sljjnppplihhikosx|xsnpruusqrv|~}~~ztqryzwwruz|}zwtqnmpy}||{{{{zzzzyy}}~||tplkklortutrpopsv{{|zxz}xvtssuuwvpnmnoswzzwtsrrrsux{~|{z|}{{zxupnnturqmnnsy|~}xqkjr|~{xxz|~|||~{xwwwwwwxxxyyzzzzvy{{~xupmjikopsronnoqsxz}~y|~tpmnpsuxvtvzztqwzusnnnqsy}~xpkjpvvywxy{}}~~}}}}}}}|~xsnkkmnqtwxywvtsrx||}zz{{{z{zxvuvwwxurqrsvuz|zwvtssrstvy}~}}|zvqnnsurpjiijlnr|~~|vqmqtoppty||zyy|}{yxxxxxxxxxy{vyzy{{~}zxusoomkmquwzwvuuruz{~xtv|yurpopsvxxwvx|~{y}}wskhghjlprw}~{uprtppllorux{||}ytpnmnqux{|{xqqrrvxzyx{}}|{|||zwvvyyxxuvpqvw||xvutsuutuuwy}|xrmnuysojgfghjlortz~{xtux}vmgadiqw{{zy{~|{~yz}}{zyyz{|||zx{yzzz{|~~}|{yxvtrpoqu{}zuvuvx{}zx}yvsvwxwurpopsvyyyx||yz~voifdddhkmquy{wtu|ypkfgilptx{}~|z~ywxz~|wsqqruy~zzusrtwz{{{z}~~{zz|~~~wxvvy{zvuwvvvvvvwwy{}ztrv{vplhhghijklnqtwzzqmrz{wqida`clsy}|vu{|{zz{~~}~~~|y|{zzyy|}}~~}}|{zzxvuv{}~{yyz{~}|wroppty{yvtqqsw{~~}{yx||xrpmkihhhjlpuz~wqrz{xwoljijmosvz|}yy}yyyxy{|}}z{{}}|~|xusrtwz|{zyxw{}{~{yy|~zywwuxwwxxyyz{~~xy}zvqljiikmlmmoqswz~{vvroolqnlifehmu||wv|||yz|}~}~}~~}}||||}~}{||w{~~}|z{|~ztrqrtuw|{{ywuvx|~{yttssqomlkklnrv|}z}ztqmmnqppnoqsw{~~|z}|wwwy{}~~}}~z~~~~|{yustvy||zuqqz~}}zxvxzyxwx{z|}~~yrqoonnnnnopqsux|~wneceioqnliikqy~z}~zxsrsu{~~~}}||{zxvvu{|xxz~~~~}ywtssstuww{|zzzzyzy~|sporuuutsrqqrsuy{~~ypljlnpttrrrtvz~|z~|{usstuxz|~~}}~~}{xussttsqorvuxyz~}}||}||zyyyyyyyyzz~|~}yvsrqqppoooooquwwzy{}~|rkdbcejotsqoorx|urqrtvy{~~}{xtposxwyuuvx~}{z{~~{yvv{~zxwywvtttuwyz{}zxsvy{}wsqrsuvwwwwvvvvwuw||xtpnkjknorusrtxz|}|{~|zsqoqttvwz}~~~~~|yupmljkqwtrmlouz~yutw~|xxxxxxxxxxyz{~~||ywutssrrrssttutuz{zxuqlfbbdkpwywuuw{||{wussssuvy{}~|ytpnpurrnklquvx~{zz|}~}xtv}}~}zzz{{zyxvuuuwy{~|{xyuwz~yusstvxz}~}|{wvyx{}}zxzvuo~~{z|{zyuqpppqqx~|xy}ywuvyyxxuvwyy{}||}~zrqtz~~}|{||zxqij{|wrsvy}zidxthb__bgmsvuspopu}yt{}|~|}}vxsrstvwxyzz{}~~zy||zyxtohejx~zvolklnoqsuxz}vij~th`\]cjprojfglu~~}zx||xux~{}~zxwvuuuuvwyz}}~zxxttw}~|xwutqnjio|}{tsrrsuvxz|~rhl~rgaaflppmifglt{|}zz}~zvty|y}}zxvutttuvxz}~zzyuvy}ywutqnkls~zsrqrstvwxy{rjp~riddglppmiginv}~{{xz~zvuz}~|{~{ywvvvvvwxz{||yzxutx~}zxvtqnklu~ytrqrstuwy{}|pks~skffjnqplhgiov{{yyvy||xtu|~}{{|zxvvvvvwxz{|zwxvtuy|xwuspmjmw~yutssstuwx{}xnku}sjfgkoqplhgiov|~zxxvy}{wtv~~{y{}zywwvvvxyz{|zvxtsuz{xvtroljny}|wtrrrrstvxz|ully|rkhimqrplihjpv{}xxwvx|{wtv}zx{~|zxwwvwxxzz{wvwssty~ywusqnkjoz}|utrrrrstvxz|~skm{{rljlorsplhhkqw{|xyvuw|~zvtx~|yx{|zyxwwwxxzzzvvwssuz~ywusqnklr|~}{vusssstuvxz}|rln}{slkmqttqmiilrx|{xyuvx|}yvuy}{yy}}{yxxwxyy{{{vwvssuz~}xvtsqnlms}~~{vuttsttuwyz}{qlp|tnmosvurmjjnty}{xyuvx}|yuuz}{yy~~|{yyxyyz{|{vxvssuz~}xvtrpmkms||}yutssstuvxz|yplq{snnptvvrnkkouz}zzzwwy}~zvvz}|zz~|{zyyzz{||zwzvtsuz~}xvtrpmlmt||~yvuttttuwx{}ypls{tpprvxvsnlmqw|{|zwxy}}zvv{~}|{|~|{{z{{}}}zy{wutvz~~|xvtrpnlnv||~yvutttuvwy{~ypmt|uqqtwywsomnsx}{}zwxz~}yvw|~}|{|~}|{{||}}~zz{wutvz~~|xvtrpmlow|}~ywuuuuuvxz|~xpnv|ursvyzwspnptz~|}zxy{}yvw~~}}|{}~}|||}~}}y{zvutwz~~|xvtrpmlpx{~}xwuutuuvxy|~~unmx{ustwyzwspnpty~~|~zyx{~}yvw~~}|{z}~}}}}~~~}y{zvutvz~~~{wusqollpxz}{wvtttuuwxz}|tnnz{usuxzzwspoquz~}}~yyx{~}yvx~~}|{zz}~}}}~~~}y|yvttw{~~{wurpnklqy{}zvuttttuvxz|~{rmp}zttuy{zwsooqvz~|||xxx{~|xwz~}}|{zyz~~~~~~~~|y{xvttw|~~zvtqolkmsz{}yvutttuuvxz|~xpmr~yttvz{{wspoqvz}{}{xxx{~~zww{~~}||{zyxy~~~~~~~zy{wutux}~~yvtqolkmuz{}wvtttttuvwy{~~volsyuuwz|zwroorw{}z}zwwx{~yww|}~~}|{{zywy~~~~zz{wutux}~~yvspnkjmuy{|vuttttuvwy{}}tnmu~xuvx{|{wsppsw{|{~{yxy{~zwx~}~}||{{zyxzz|{wvtux}~yvsqnkjnvy|{vuststuvwy{}|tnmw~xvwy|}{wspqtx}}|zyxy|zwx~}~~}||{{{zyx{~{~{xvtvy}~~~yvsqnkkovy}zvutttuuvxz|~{snnxywx{}~{wsrrvy~}~{zyz}~zwx~~~}|||{{{zyy{{{yvuvx}~~zwtrnlkpvy~zwvuuuuvwyz}{snoxzxz|~~|xtstx{}{zy{}~zxy~~~}}|||{{|{{zz|}|ywuvx|}~ywtrnlkpvy~ywvuuvvwyz|zsnpzzy{~|xutux|~|{z{}{xz~~}}||{{{||{zz}~|zwuvx|}}ywtrnllrvz~ywvuuvwxy{|~yrnr{{z|}yutvy}~|{z{}~zxz~~~}||{{{{|{{zz~}{yvuvx||}ywtqnlmsv{}yxvvvwwxy{}~}~xrns|{{}}yvuwz~~|zz{}}yx|~~~}}||{{{{{{{zyz}{yvuvy|}|xvspmlntw|}xwvvvwwxy{}}}}}vpou}{|~}yvuwz~~}{zy{}|yx}}~}}||{{{zzzzzzyy{|}zxvuvz|}|xurpmlouw}{xwvvvwxyz|~~}|}~ztopw~{|}yvuwz~}}|zyz||zy~}}}|||{{zzzzzzyyy{||zxvvwz||~{wtrollpux}zwvvvvwxyz|}}|||~~ysoqy}|}|xvuxz~|}{yyz|{yz~~}||{|{{zzzzzzyyxy{~|{zwvuwz|}~zwtqnmmqvy}ywvvvwwxyz|}~|{{|}~xrory~|~|ywwy|~}|{yyz|{yz}}~{|{{zzzyyyyyyxxy|}}{zwvvwz|}~ywsqnmnsvz}yxvvvwwxyz|}~|{{|}}wros{~}|ywwy|~}}{yy{}~zy{~}~~{|{{zzyyyyyyyyxy}}~{zwvvw{|}~zwtqnmnsv{}xxvvvwxyz{|~}|z{|~|vqot{~~|ywxz}~~~{zz{}|z|~}}||{{zzyyyyzzyyxy}~|{xvvw{|~zxtrnmnsv|}yxwwwxyz{|}||{|}|vqpu{|yxyz~~~|zz{}|z}~~~}||{zzzyyyzzzzyyy~}{xvvw{|{yuromnsv}|yxwwwxyz{}~~|{{|}|vqpv||yxy{~|{{|~|z}~~}|{{zzyyyyzz{{zyz~{yvvx{|{yuromotw~|zyxxxyyz|}~|{{|~{uqqw}|zyz}~|{{}~{z~~~~}|{{zzyyyyzzzzyyz~{xvvx{|{yuromptx~{zxxxxyy{|}}|{{|~ztprw~|zy{}~|{{}~{z~}}~||{zzyyyyyzzzzyxz~{xvvx{}|yuqnmqtz{zxxxxyz{|~~|{{|}~xsprx|yyz}~~|{{|~{|}|}~|{zzyyyyyyzzzyxxz~zxvwy|}{xtpnmru{~zywwwxyz{|}~}|{{|}}wrpsy~{yyz}~}|{{|}{}~||}~}{zzyyyxxxyyyyxwx{~}zxvwy|}~zwsomnsv|}yxwwwxxyz|}~}}|zzz{}{uqpuz~{yyz}}|{z{|~|{~}||~}{zyyyxxxxxxxxxwww|~|ywvwz|}}zvromosv}|yxwwwxxyz{}~||{zzz{}~ytppv{}zxyz}||zzz|~~|{~}{|~}{zyyxxxxxxxxxxwwx}~|ywvwz|~}yvronptw~|yxwxxyz{{}~~{}{zyyz|~}xspqw}}{yyz}||{zz{~||~|{{}~~~zzyyxxxxxxxxxxwwx~~{ywvwz|~|yuronqtx{yxxxxyz{|}~~{|zzyyz|~|xsqsx~~{yz{}}|{z{|~||~|{{}}~{zyyxxxxxxxyxxwwy~{ywwwz|~|yvronruy{zxxxyz{||}~}{{zyyyz|~|wsqtx~{z{|}~|{z{|~~||~|{|}}~{zyyxxxxxxyyyxwxz|zwwwz{|zvrport{|{yyyzz{|}~|}{zyyyz|~|wsqty~|{|~~}{{|}~|}}||~~~|{yyxxxxxyyyyyxx{|zwwwz{}zwsppsu}|{zzzz{|}~{}~zzyyz{}{wsrvz|||~~~|{|}~}~~|{{}}|zyyxxxxxyyzzyxy{|zwwxz{}{wsqqtv~||{{{||}~z~}zzxyy{}~{vtswz}|}~}|{|}~}~~|{|}}|zyxxxxxxyyzzyxx||zxwxz{}zvspqsw~}|{{{||}~z~|zyxyy{}~zvssw{}|}~}{{{}~~}~~|{{}|{zyxxxxxxyyyyxxy}~|ywwxz{|yusqrtx~}|{{{||}~~}y~{yxxxy{}}yustx}~}|}~~}{{|}~~}}{{{}~|{yyxxwxxxxyyyxxy}}{ywwxz||yurqsuz}|{zz{{|}~~}|y}yyxxxy{}{wtrty~}||}}~~|zz{|}~~}{zzz}~}~{zxxwwwwwwxxxwwwy~}{xwwy{|{xtrqtv|}|zzz{||}~~~~{}yx|xxwxyz|~}zvsrvz}{{||~|zz{|}}~~|{yyz|}}}zyxwwwwwwwxxwwvwy~|zxwwy{}~{wsqqtv~||zzz{{|}}~~~~~}z|xy{wxwxy{|}yurrvz|{{||}{zz{|}}~|zyyz|}}|zyxwwwvwwwwwwvvwz~|zxwwy{}~{wsqruw||zzz{{|}}~~~~~|z|wzzwwwxy{||xussw{|{{}|}{zz{}}~}~|zyyz|}}{zxxwwwwwwwwwwvvw{~|zxwxz{}~{wtrrux|{zzz{||}}~~~~|z|w{zwwwxy{}|xtrsw{|||}|}{z{|}~~}}|zyyz}}{{yxwwwwwwwxwwvvw{~}zxxxz|~~{wtrsuz~|{{{||}~~~~{zzw{yxxxy{}~~{xtrtx}}||}}~|{{|}~~~}{yxxy{||{yxwwwwwwxxxwvvw{}{yxxz{|xursu{~|||||}}~~~~{{{x}yyxyz{}|xusux~}|}}~~|||}~~}{yxxy{}}|yyxwwwwxxyxxwvw{~{yxxz{|xurtu|~}|||}}~~~{{zy}yyxyz|}|xusvy~}~~~|||}~~~}|zxxz{}}{yyxwwwwxxxxxwwx|~{yxxz{|xusuv~}}|}}}~~{{yz|xyxyz|~~{wtsvy~}~~~|||}~~~~}{yxxy{}}|zyxxwwxxxxxwwwx|}{yxxz|~|xutuw~}}}~~~}yzxz{xyxz{}~}yvttwz~}~}~|||}}~}|zxwwyz}~|zyxwwwwwxxxxwvvy|}zyxy{|~{wutvx~}}}}}~~~}|yywzzwxxyz|~~|yuttx|~}|}|}|{{|}~~}{yxwwyz|~}|zxwwwwwwwxwwvvvz}~|zxxy{|}zvttvz~}||}}~~~~~~}|zxxvzxwwwyz|~}{wusux}~}|}|~|{{{||~~|{yxwwyz|}|{xxwvvvvvwwwvuvw{}~{yxxy{||yvtuv|}}||}}~~~~~}}{ywvvywvvwxz|}~|yvtsuy~~|||}~|zzz||~~~}|zxwwwyy|}|{xxvvvvvvvwvvuvw{~}{yxxyz|~|xvtvw}}}|}}}~~~~~}|{xvvvyvvvwxz|~}{xussvz~|||}~|{zz{{~~}|{yxvvwxy{|~{zxwvvvvvvvvvvuuw{}{yxxy{}|yvuwx}}}}}~~~~~}}{zwuuvxuvvwyz|~~}zxuttwz~|}|~|zzz{|~~}|{yxwvwxy{}~{zxwvvvvvvwwvvuvx{}{yxxz{}~|yvuwx~~}~~~~~~~~}{zwuuwxvvvxy{}~}zxuttx{~}}|}|{z{||~~}{zxwwwxyz~}|zxwwvvvvwwwwvvvy{}{yxxyz}~|ywvwy~~~~~}|zwvvyxvwwxy{}~~}zxutux|}~}~|{{{|}~~}|zxwwwxy{~|zyxwwwwwwwwwvvvy|}{yxxzz~~|ywww{~~|zxvvzxwwwyz|}}zxutuy}~~}~|{{||}~}{zxwvvwxz}|zyxwwwwwwxwwvvwy|~|zyyz{}zxxx}~}|zwuwzxwxxz{}~~|zwvuvy~~~~~}|||}~~}{yxwvvwx{~|zyxwwwwwwxwwvvwz|~|zyyz{}zwxx~~}{yvtxzwxxyz{}~|zwuuwy~~}~}|||}~~|{ywvvvwx|~|zyxwwwwwwwwwvvwz}}{yyyz{|ywxx~}|{xvtxzwwxyz|}~}{yvuuwz~~}}|{{||~~}|{ywvvvww|}{zxwwvvvwwwwvuuwz~}{yyyz{~|ywxy~~}}{zwusyywwwyz|}~~}zxuttxz}}|}{{{||~~~}|{yxvuuvww}~}{yxwvvvvvvvvuuuwz|{yyy{|~{yxy{~~~~~~}}|{zxvsrxwvwwyz|}~~}{ywutuy|}}{~}{{z{{}~~~~}{zxvuttuvw}}|zywvvuuvvvuuttuwz~|zyyy{|}{xxy|~~~~~~}}|{zywursywvwwyz|}~~~}{xvttuy}~||{~|{zz{{}~~~~}|{yxvttttvw}|zxwvuuuuuuuutttx{~|zyyy{|}zxxy~~~~~~}}}|{zxvtqsyvvwxy{|}~~~|zxvttvz~~|||}|zzzzz}~~~~~}|{yxvttttuw}|yxwvuuuuuuutttuy{}|zyxyz||zxyy~~~~~~}}|{zxvtqtyvvvxy{|}~~}|zxuttvz~}|}}|{zz{{~~~~}|{yxvtttuuw}|zywvvvvvvvuuttuy|}|zyyz{}|{yzz~~~~}}|{yxvtpuyvwwyz|}~~~}|ywutuwz~}|~~}{{{{{~~~~~}|{ywvttsttx}|zywwvvvvvvuuttvy}~|zyyz{}}{yz{~~}|{zxvtqxzwxxz{|}~~}|zxvuux{~~|~}|{{||~~}{zxvutstty~~|zyxwvvvvwvvuuuvy~~|zyyz{~}{zz|~}}{zxvtqyywxxz{|~~~}|zxvuvy|~}~}|{{||~~}|zxwutsttz~~|zyxwwvvvwvvuuuwy~|zyyz{~}{zz}~}|zxvsrzywxxz{|}~~~}{ywvvvy}~}~}|{{||~~}{zxwuttts|~~|{yxwwwwwwwvvvvxz~|zyyz{~~}{{z~~}{zxvrs{xwxxz{|}~~~|{ywvuwy~~}~}|{{{|~~~|{ywvttsss}}}{zxwwvvvvvvvuuuxz~|zzyz{~}{{{~~}|zyvuqs{wxxyz{}}~~}|zxvuuwz}~~|{{{{|~~~~}|zywutssss~}|zyxwvvvvvvvuuuvx{}{zyyz{~}{{|~}|{yxutptzvwwyz{|}}}|{ywvuux{~|~}{{zzz{~~~~}{zxwutssst~~|{yxwvvuuuuuuutuvy|~}{zyyz{~}|{||~~}|{ywusotyuwwxyz||||{zxvuuvy{~|~|{zyzz{~}}}~}|{yxvttssru}|{yxwvuuuuuuuttuwy~~|zyyyz{}|{|}~}|{zxvtrovyuwwxyz{|||{ywvttuy|~}|~|zzyyy{~}}}~}|zywutsrrqv}|zyxvvuuuuuutttuwy~|{zyyz{}}|}~~}}|zywvsqowxvwwyz{|||{zxwutuvz}~}|~|{zyyy{~}}}~}{zxwussrrqw||zyxvvuuuuutttttwy~|{zyzz|}||}~}}{zywusqoxxvwxyz{|||{zywuuuwz~~}|~|{zzzy|~}}~~}|zywussrrqx||zyxwvuuuuuuuttuwz~|{zyzz|}||}~}}|zywusqqyxwxxz{||}|{zywvuuwz}}~|{zzzz}~}}~}|{ywutsrrrz}}{zxwvvvvuuuuttuxz~|{zyzz|~}}}~}|{yxvtqszxxxyz{|}}}|zywvuvxz~~}{{z{{}}~~~|{ywutsrrr{}}{zyxwwvvvvvuuuux{}{zzz{}~}}~~}|zywutqt{yyyz{|}}}}|zywvvvy{~}|{{{{~}}~~|{ywusrqqr|~}}{zyxwwvvvvvuttux|}{zzz{}~}}~~~}{zywusqu{yyy{{|}}}}|zywvvvy|}~}|{{{{~~}}~~|{ywusrqqs}~}}{zyxwwvvvvuuttvx}~}{zyz{}~}}~}|{zxwusqw{yyz{||}}}|{zxwvvwy|}~|{{zzz}~}}}|zxvtsqqpt}~}|{zxwwvvvvuutttvx~|{zyzz}~~}~~}|{yxvtrpwzxyyz{|}}||zywvuuwz}~}}|{zzzz}}}}~|{ywvtrqqpv~}}|{yxwvvvuuuttttwy}{zyyzz}~}~~~}|{yxvusqpwyxyyz{|||{zyxvuuuwz}}}{zzyyy|||}}|zywusrpppv}||{zxwvuuuutttsstwy}{zyyzz~~~~~}|{zywvtrpqwxxxyz{{|{{zywvuuux{~}}~|{zyyxy|||}~}{zxvtrqpppx}||zyxwvuuttttssstwz~|{zyyzz~~~~~}|{zxwusqoqxxwxyz{{{{{yxwuuuvy{~|~~|{zyxxy|||}~}{zxvtsqppqx||{zyxwvuuttttsstux{~|{zyyzz~~~~}|{zxwusqorxxwxyzz{{{zyxvuuuvy|}}|zyyxxy|||~~}{zxvtsqppry||{zyxwvuuuttttttvx}~|{zyyzz~~~~}|{zxwusqotxxxxyz{{{{zyxvuuuvy|}~|{zyyxy|||~~}{zxvtsqpory||{zyxwvuuuutttttvx~~}{zzyz{~~~~}|{zxwusqpvyyyyz{{{{{zyxwvuvwz}~~}{zyyyz}||~}|zxwusqposz||{zyxwwvvuuuutttvy}{zzzz{~~}{zywutrqwyyyzz{|||{zyxwvvvxz~~~}{{zzy{}|}~~|{ywusqpotz||{zyxwwvvvvuuuuuwy}|{zzz{~~~}|zywutrrwyzyzz{{{{{zyxwvvwx{~}{zzyy{}|}~~|{ywusqppuz{{{zyxwwvvvvuuuuuwz~}{zzzz{~~}|zywutqsxyzyzz{{{{{zywwvvwy{~|{zzyy{}|}}|zxvtrqopvz{{{zyxwwvvvuuuttuw{~}{zzzz|~~}|{yxvtsqtxyzzz{{{{{zyxwvvvwy|~|{zyyy{||}~}{zxvtrqopwy{{zzyxwvvvuuutttuw|~|{zyzz|~|{zywvtrquxyzyzz{{{zzyxvvuvwz|}zxvvwy{~|uojiijkprrtutplqy|{}{zz{{}~|wuzxy{|~}}~}|{yxz~vqnptsmkda``abcegjmopoootwpjdccefhoux}~zsttvzxrx|vpljjnuyuqonjouy|xwz}}{~}|||}}}{xupnrzytsprtx{~~vlkvtic^\ZYZ[\]_behknoqrwz}~zzxvtqnkkmrz|yyxyxy|~{vtr{zphfjwxojhjmrvxxwtqnljigjv}{xwyxwvttz{xx{~zxvy~uontvpolmorux|~|}yttogb\XWWWXYZ\^acechlnsw{}wtuxzy||usqpoopqsuwyzzy{vmfcfpxngccfjosssspmkkloqu|z}~}}}zwsporz~{{zspt|}z|{vromkigea][^dlnkkefjkorux{~|z{|vtw{}yxttuwxxvuyzyxxxxyz{ukgm|xld__aeiklljfdbbeimpz~vqmlnu~}yxwwwxy{}~}}xx|~}yust{xsmmjihhhhhijlnqsvuuzyyxx{|~}{{|}}~}}{ywuu{~~zx~yvtsrrrtz~|wvz{qieflu{xungc`_adhiovz~}}zy|zwvuuuvwxxyxvrps{~~}{|}vssw~rmhecba``abdfhikoqrryz}}{xwwvuspnkjkpy}{zzzx|}{wuu{~xrpqw}vrqsvz}~}{wsokhfjny~|yzzyzzyvvy~||}yx{{toovzxxtuvx{}xrkeb_^]]]^_`bdfhjioruy|~ytstwutvy{ywssrrrstwy|~xqkijpyvollosvwzzwuqonoquw{~|{~~yx~}~~~~}{ywtssx}{~{{z~~}|xuspnjfbachmlljgheimortwy{{|ywwy~zxvz}|{yvvwy{}~~||~ywuuuwx|~tllr}~rkggjmqstspmiffgjoru||wspnory}}|z{z{|}~||~{ywwy}~vvrrppoonnnooqrtturrtrty|z|~xwwwwwvusqnnsx}uqooprrw}}{wvy{pklrz|}{uqlieddfilmuz}~}|xvwzzyzyzz{{|||{yvvy}}{wvw{~{rolkjjiiiiijiknortttz{}~~yussrrpomkiilrxx{zyyy}~zurqty~{ux{}~xspqu}zwwz}~ysmhfjpxx~~{{{yyyyyxvwz}|~~{|~{xtrsy||}xxy{}}}snjhgfeedddefgikmnmtvx{}~{wtrrturqorw|||{tuusttuwy{~~}{{|}}|{~ysnklpyvssux{}zvtrruw|~~~|xuv|~}|||{zxwuuw|{wy~}}z|~zwtplhginpoplkklmkorsvwzz|~~}|zxvuux}wx~~~~zxxy{}~~xvuvwy~vons{|rnmosvxyxvspnnoqux{|yvurrsx~~|zyy{|zwvutsssssttvwxwvqquw{xx}~ywuuttsqnopsy|{spnoosy|~|yzxy~vruy|~{xtpljhhjmqtv~}xutz||||||}}~~{z|~zwx{}uronnnnnnnmqqsuwxzzz~wrponlkigfgkqx}~}y}{~xqoqv{}ywutrx||xtrtx||}yrlikqwz{~~}|{{{|{zxx{}}}~}{yvttz~~{zz{{wpmkjiihhhhhijlnprsryz|}xtoopsrpnjlouxy{xvqtutvwz|~{yyz~|xx{|z~~zuplkmt~}vvv|}zwuuvz}}zxutu||zyyxwvutuy~~xuv{xwvz{|}~zupmklorrspljjjklmlqttwxx}~~}zyxvtrqrvz}}{{xzz|}{z{|}{wvzzzxrrrsw~~|uqptx|yrpqtwz{{yvspoopqw|~{wuz}ywusqqqtz}~}}{~}~||{yxwx{}zxxwwwvvvvvutsqopov~}~{}||~~|xvv{|}|vsqpomkmlnsy~ytvwuuommmswz~}{xwvvz{{xx{~}|}~}|{zwspmkjkmquyz}zvssy{~~}~}~~~~|{}}~|xvvy}|~~wtrrrqrprtsuuwxz{}{}}xyzyzsomkjhfeeglqwz}}}yx~|{xxsrvv~~~}{xurppprs{~}yurru~xroptvz|{}{~}||}}}|zy{~~~~}{xvv{~~}z}~~xspnnmmmmmmnoqsuvxxw|~yrqqsqrmjikptvzzxxvswyy|~}{{z}yvvxx{{w{~~~{xtpmmpx}~{zy{}}|zyvuuy}~}{zyyxxy}~}}yz{z||}~~ytqqsuwxtrpoooprrsqwxxy{~}|}zwvsrppqtvyx{|~}~~zvsvw{|wuw~|z{|}wsrtu|}||~yz{~}zwvtuz}|wuv}~zwvuttux|}|{~~~~}|x|}{|{{zyz{|{{zzzzyyxvustuzy~|{}|}}~~|yvtxy|}wtqnoomnquzytpqrsvrpqvx{}~{yvtruxz}}yxy}~~|yusqpqsvz}}zwtuy}~}}}{|ywwxz~|~~{ywvutwwwxxyz{|}~}~~{vsuvvxrnlihgfgjntwz~}}{~}|xsqrt{zw|{z{{{zxuromlmoruv~~|yurptz}ywwwwzyyz|}|~}|||}|{yyx~~~|}|yww{~}{}}}~~}{z|}|||xurqppppppqrstuvwxwy~~}yxxvyvtsrpkhgilqsuywwvvvtz|}|yx{{~y|~|xtrsstwuuvuy{xwspmlnt|}~|{z|}|{zywvtrswz}zywvvvwz}{xyxxxyzz{{{||}}~}|y{wwxxzyusppoopqrsssqvwv{|}|{{~~yvrqnnmoqstw|~}xz}||xsposuxzx{}}zxvvwy{~|}zxuutuxz~yyz|~~{xtvxy|}{yyzz{}xusrrsuy~{{y|}{zyyyyyxuzzyyxxxy{}|{{zyxvtrqruz{{{{x|z{|}}~~~~}{yvtsvw{|tqqnmmnrv{~{wqmjmosxsvwxz{|zyvtqostw{~{xxz~~~|yvsqqqsvz}~{vssw||}{z{}~~}yxvvx||z|~~|xxzxyyzz{|}~~}~|wspqrtxrnjhffgkoux|}~}vokmtx~|zzyxvtqnlkkmqtx{z{ytruw}}{|{||yyy{}}z||~~~{yx{}~~}~zxy}~yyz|{xusrrrrstuvwxzz|~~}wqoqu}{ztniffhlqsxzyzz{{|{}yvvz}}yurqrruvuvwxzw{{vsonmpv~{~}}}}|{zywusrvy~~|yxwwyzz{~}zyxyyyyz{{|}~~~}~~{{{{xusrqqqrstuvwvuy|~}zy|}zvrolllnqt|~}z~~|yvrooqv}zwvuuwy|}}yy{wxvxww{zuwy|z{yz||{|~~~zzz||xusrsvy~~~}~}{yxxwwxxxxwuyzxyxyz~}|{ywusrswz}~|wv{zz{||}}}~~}}{yvsrtux|vronnptx|~~|yurnkjlpt||zzzzywurooqqtw{{ywwz~{xutsstwz}}||~xutxz~{}{ywwx|~z{{wvuuvy}~{z|~}~|{zz{{{||}}~~~{y|z{||yvrpnoprvolhggimqux}{~~zuqnnos{z{zwwtrpmkiijmptwyywzwrrssx~ywuvwy|~}~}}{z|yxy}||}~|zyx{{}|~}~~||{yvuw{}zwyz||yvuttttuuvvww{{{|{y|xsporvyyqlhghkorvzyyyzz||}|}{xuuuz{~zvsrrqqsqpprtvwwsttnmlnry~|~|{zzz{}}|{zyxwvtrrvx|{ywvx~}ywxxz~{ywwwwxxxyyyzyz}|{z~~~}yy|{xutssssttuuvvvus|}|~~}zxwyy}|uqmlkmptz~~}}{}{zxvspnrvw}{xusrrstvxyxxtvywxttv{}ywy}|||}~|{|~{wtuvx~zwutux|zxwy~|zxwwvvvwwwwwwtyzxyz{~}{xvttvy{~}zxt{|z|{||}}}}}}|zyvsqrvy|wtrrsvz|}~}zxvsqommor{}{xuroqppsuy}|~zwvwz~}|yxwwxz}|yxxx}}{{{~~|zxvvxz}~|wxzvwvxz~~|~}~~~~~|xz|z|~|zxvspnnoqwrommnqvx}~zwutttwxvx}~{wtpmkjijmptwz||zuwwtuw|~{yxxz|~}~~{zy|}~}{yy|~zy|wvvy~{yyz}}{yyxxyyyy{~}~~~{xvtsrvxv{vpmklortz||}}~~}|zxwwzzvsrqsspppqsvwxwvpqqmnpv|}|zzz{~}|{zzyxwutsuw||z|}{xutx||zxxwxxxyyyx{}}}}|z~~~{z|~zwvuuuuuvvvwwxvyx}}~}ywvwvzyrollnsy~~~~~|~|{zxwvtsuttz|xusqpqrstuvwwxuwzssrw|{xx|~}}}~}~zvsqrtv}ywvvy|{vts{|ywvuutttuuuuuutrwxwxz}{xuttvx{~|zxwtvtw{y{z{{|||||{zxvrrssty|wutvy|~~}|}}}zxvtsrponmmrx||xupopnnprvy|~}xuwtsuy~{y{~{xwvvwx{}~{xspoqt}~}~~~|~|}{xvtttwy|}{xvtprusuw{~|z~~~~~~~}}|zxuvtu}}}|{yxwuspmllmpuqooqtvy~zwtttvx{yvsuzz~yupmjhhhjlpsvxyxusqsssw}~{{zwuuuwy{}~~~|zyx{|~~~|ywv{{~}}}}~}}}}|{xvrputx|~{ywxz}~{yxxxww{{{|}}}|~~|yxxxxxzusrqvsooorsx||}|}}~}~}}|{zxwux{zzxutvspnmnprtvvurojlnmqw~}zwvvw{~||{zzyxwusrtuy~~{xtsww{}{yxwxwxwx|{||}}|{y~~}yxvvuuvvvwwxxx{zx~|yussqvvppptx|~}|{zyxxvyzyxw{~|xtrpppqrstvxyy{usuqtw~|{|}{xurppqt|{zz{~|yvw{~zxvuuuuuuvvvwwvvsxzy|zxwyz~~|{zxwzyvy}{||}}}}}}}}|y{xusssx~{||~}zxwvuuuuvutsvxy}{utsppqtvy||ytrvtvy~|{|~|zyz{||xuqoorv|xutuwx~}|zywutqtwvy|~~|zwwyxx{}|{{zyxwurpmmmqxwwwyz}zwutvw{~|ywxwwy}xsoljjkmpsvyzzxywspuwy|{|}zxxxy{}~}{ywyy}}yyz}}~~}}}}||{zywtrpqyz~{yz{~}|z{~}~~~~~}~}{yyyz{~~zuqonnuvtuvx}~~}|||||{ywxvvv|~zzxspnmmoqsuvvtromhlqsy{wsrqruwy}{{zwpkkmmorux{}~~zvsrruz|~~~|{x~~zzwux{~{zvuutsrpqu}|}xy{{wq{rfc``acdfgijkmnoqqqnqtuwy{{{~}~{z{{{||||||||}|{vrropu|zumnoquy~|nb`m{oc\VTTW\bhnsuvvsngihhknsx{~}zutxy|}~~}xrlhkw|uqmkjjjklmoprtuwwwsqpmnrx|zxwtuvwwvttx|{w{}wonxwohea^\[ZYYYZ[]^`a_efilnqssx{~~|~{zxwvvuuvvwxxwrqqoqw~xrttw{zpgcgwzphb_^_cgkorssqnhcedehlqvy{{ywqsvwz|||~{xsojin{|xuqpnmllmmnpqsuvwvrsqnosy}{zxvwxyywuu{{y}~wop{ypkgda_]\\\\]^_`b`bggkmprsuz|~}|zywvvvvvwxxxwrtqprxwtuuy}wngci{zqid``bfjnrtutqngffegjotx|{{~zvrvvy{}}}~}zvrnkkq|{vsqonnnnopqstwxyvstpootz~||zyyzzywuv}z|}~voq~yrmheb`_^]]^_`bbdaehilnqstv{|{||zxvttsstuvwxyvtvssu|{sttw{}umgelyqiebbdgkpsvwvtoijggikotw}}~|usuuxyzzz{~{wsolmv~{vtrqoonooqrtuwxyuuupppu|~~{zz{{zwuxz}~{soswqmifdba`__``bcdcbhhkmpqttx{}}z}|zxvuttttuvwxxtvustw~~wrtsw{zrjdfqxpjeddgjnruwwvsmijghjmqux}}zsttuwxyyz|~{xtpljo{~~yvtsqpppppqstuwxwrtroorw}~~{zzzywtuz{z|}~wpoxvqljgecbaaaabccdbdiilnqruuy|~|yy~|zxwutttttuvvtrusrsy~|rqrsw{~umgdix~vnifefimqtwxxvrkkjgiknrvz~~}wrtsvwyyxvy|xtpmms}~ywutsrrrrrstuwwxusurpptz~|{{zyvuw~y{|}|upq}}urnlihfedddddeeecgijmoqstuz{}}}}ywx~{zxvutsssttvvwuuxuvx}}|{vprquy~{smgfm}vpkihilptwz{{yunolkkmoswz~vttsuuvvww{}zwsomow~yxvuttsssttuvxxxtuurqquz|{{zxuux}z|{~zsps|wspmkjhggfffgghffkkmoqsuvw|}~~|yxz|{ywvutttuvwxxtxxwwy|||{uqrrvy~yrlhhpvqlkjmpsw{}~}{urrnnnprvy~~vwtuvwxxxx|}zwtpoqz}zywwuuttuuvwxyyyuxvtrrv{}}|{yvuy|{}|{uru|xsqnmkjjiijjkklikonqruvxxz~}zy|}{yxwvuuvvxxyxv{yy|}}yz|yyrrsty}}}xrmjktwrnmmorvz~~wwuqqprtwy}xxuvvwwwvwz}zwsru~~{zyxwwwwxyyz{{xx{wvtux}~}|ywv||~|~~ytrx}zvsqonmmlllmmmmjopqstvwxx|~|zww{|{yxwvuuuvwyy{xz}{||zwzyyvqsrux}}|zupkjmy~wronoruy}|wyusrrtvy{{ywuvvwvvvx{}{xtrsx}}zzyxwwwxxyyz{{wyyvutuy~}|zwvv}~~z|z}~|wst}|wtrponmmmmmmmnllpprsuwxyy}~}zwvw~~~{zxxvvuuvvwxyzw{{z{|{xwzxwropptw|~y|~xrnjjq{uqonpsvz~zxxssrstwz}yyuvvvvvvvx|~{xurqs{|{zyxxxxwxxyyzzxvzwutsvz~}{zwttw}|~yzyy{|~ytrv{wtrqoonnmmmnmnknqpssvvxyy~}}~~~~}zxurru~~|{yxwvuuuuvwxy{yy~|}}{vsuvutoporuy~|zw}{upkiktzuqoopswz~z{yuustuxz}|zvvuvutstvz|yvssw~}|{{zzyzzz{|{|yx{xwuux|~|yvttz}~~y{xz{}~}xssx~zvtrqoonnnnooonlqrrtvxxzz|~}~~~|zwurrw~|zyxwvvuvvwxyz{y|}~~ytrutusnporuz}}{xyzupkjmwytpoprux||~ywvvvxz|~zxxwwvuttw{|yvssx}}|{zzzz{{|}||y||yxuvx||yvttz{|zzxz{}~~xtsyzwusqpppoppqpqoputvwxz{}|~~~|zwtrsx}{zyxwwwwxyz{|}{~xsqtsvrpppsv{~}{x{zuplkozztrpqtw{~zzxxy{}zzxxxwvusuz~{xvv}~~}}}}~~~|}{zxxz~~zwuw{}}|{z{|}|wst{{xutrqqqqqqrrrosvuwxz{|}}~~~}~~}{zwuqpqx~}{zyxwwwwxyz|}~ztopqrupqpruy||}zxw~}xsollr|yurqrux|}{zzz{}|{yywvuttv{}zwvw~~~}}}~~|}|{yxxz|xutxz}{{yyz{|~zvsv|{xvtsrrrrrsssrpvvwxy{|}~}~}}~~}{zxuspps{~|zyxxwwwxxz{|}~|}vqnpprroporux|{yywtv|}zuplkmv}xtrrsvz}~|{yyz|}~{yxwvutstw|}zxuvz~~}}}}}~~~~~z}}zzxwx{|yustxy~|zywxyz{}~|wtty}}zwutssrrrrsssprwuwxz{|}}~~~~||~~}|zxvtqopu|~|zyxwwwwwxxy{||}{}wqmmoospppptvz||zvvvtrw|}|wsollpz}wtrstwz~~|{zz|}~|zywvtsrsv{~{xwx~~|~|{yyz}|yvtvzzzzxwyyz{}~~{wtv{}zxvuutttttuttquwvxyz{|}}~~}~~}{{}}~}}}}|{zyxvtqonovz}|{xxwxwxxyy{|}~{upmnnoroqortwz}~{yuuurqx{~zvqnlms|}xuttvy}||{|}~~|zywvtsrtv{}{xxz}~~}{zz{~|xvtwy|~{{xxyzz|}~~zwuw{{yxvvuuuvvvvusyyyz{|~~~~}{|}~~}}|{zyxvtrooqwz~~|zzyyyyyz{|}{uplnmqrqrpsuy{}}{xuvuru{|zvronou||xvuvx{~}}~}{zywvttuw|~{yx{}~|{z{~}yvuxx}}|{xyyz{|}~~zwuxz|zxwvvvvwwwwuv{y{{}}}}|zz|~}|||{zzyxvtrommpv{|~{zzyyzz{|}~xrmklmrssssuwz|~~}{yvtutrx|~}yuqnnpw}}ywvwy|}{ywutstw{~~{yy}}|{}|xuvxz}}zyyyz{|}~|xuux{|zxwvvvvwwwwty{z||}~~}~}{zz|~~}||{{zyxwuspnlmrv}|}zzyyyzz{|}|uokklnsqsqsuwz|}~}|{ywtrurrz||wspmmry{wuuvy|~~~|zxvtsrtw|~|yxy}|{{}}yvtvw{~{{wwwxyy{{|}~}zwuwz~}zxvvuuuuvvvusyyz{|}~~}~}{zyz}~}}||{{zyxwuspnlkmtx|{{yyxxxyzz{}~~xqlikkpqpqortvxz{|{zxvtqpsosz{~yuqmlnt{}yvttvy|~~~~}{ywusrrsvz}~~|yxx|}|{|~|xuuwx}}|ywwwxxyz{|}~~~~{wutxz}zxvvuuuuvuvsuzxz{|}~~~||~~|{ywwx{~}|{zzyyxwvutrpmkijntyz{zyyyyyz{|~zsnihklqrrqrsuwyzzzywvsroprov{}|wsommow}}yvuuvy|~|zxusrrtw{~~|yxx}~}||{wtuwy~||xwwwxxyz{|}~~~zwtux{}{ywwvvvvwvvty{z||~~~}}~}{yxxy{~}}{{zyyxwvtspnkjjpt{z}{zzzz{{|}zsniijmsssrsuwyz{{zyxvtroqrqz{{wspnnqw~~zwvwy|}{yvtsstx{~|zyz}}}|xuvw{~}yyxyyzz{|}~~zwuvx|}{yyxxxyyyxv}||~~~~~|zyyz|~~|{zzyxwvusqnlklqt}|~|{{{{|}~}xrmjkkquvvuwxyz{{{yxvusqosqt|}~zvspooty{yxy{}~|zwusstwz~~~|zz{~~|yvwx~|zyyyyzz{|}~}zwuwx}{zyyyyzyywy~|~~|~~|{ywxx{|~~}{zzyxwwvtsqomkjmqv||~||||}~|vpljjlsuvuuvxyz{zzxwusqpnrpw{}|yurpopv{~{yxy{~~{yvtsstxy}{zz}~~~{wwwx~~zyxxxyyz{{|}}~~}~~{xvvxz~}{zzyyyzyyv{~|~~~}|~~|{yxwwx{|~~||zyxxwvutsrpnkkkoryz|}{{{||}~}ysnjjkmstuttvwxyyyxwusqommpowy|}yvrpnosx~}zxxz|~|ywusrstwy~}}|zz{~}~~|yvwwz~}|xxwwwxxyzz{|||{}~~~|ywvwy}}|zyyyyyyxwv}||}}~}{|~~~}||{ywvuvwzz~|~zzxxvvuutsqonljjkps|}z|}{||}~~~zvplikkquvvtvvxxxxwvtrpnnkmoqyz~{xtqoopuy|yxxz|~}zwusrstwy}|~~~~~}|zyy{~~|xvww|~{xxwwwxxyyz{|||{}}}{xvvxy~~|{zyzyzyywx~|}}~~}{}~~}}|zywvuvxz{~}}{zxxwvutsrqomkjjmqu}}{}}|}}~~~~~yuokjklsvwuuvwxxxxwutrpnmloou{|~{wtqonpuz}zyy{}}zxusssuwz}~}|zyy||xwwx{yxxxxxyzz{||}}|~~~{yvvwy}{{zzzzzzw|}}|~~~}|zxwvvxz|}{zyxwvvtsrpnkjjmpx~}~}~~~~~~zupljknuwxvwwxyyyxwvtrqoompry|~~{wtqporv|}{z{}}{xvtssuwz}~}{yyy||yxw{{zyyyyyzz{|}}~}}~{xvvw{}|{{{{{{zy~~||}~}|{ywvuuwx|~~}{zyxwvusrpomkjjnr{}|||||xsokklryzzxxxyyyxwutrqponnqu|}}yvspoosw~{{{}~{xvtssvw{~~}{zxxy}{xww}}zyxxxxyyzz{||}||~|ywuwx~}|{{zzzzxz~}||}~}|{zxvuuuwy|~~|zyxwvutrqomkiikot~~~~|{{{|~zvqmkkmtxyxwwwxxwvutrponmlmpw{}~{wtqonpuy~|zzz||zwtsrsuwz~~~~~~~~}|{zxxx{|ywwx~{yxwwwwwxxyyzzzzz||zwuvwz}|{zzzzyyw|}~~}|{|}~}|{zxwuttuwx{~|zyxwvutrqpnljijmpw~|~~~~}{yyxz{wsollmpwzzxxwwwwvtsqpnmlkklpxz}~{xuronoqv|~|zz{||ywtsssuvy~}|||||||{{zyxwwx||yxxz}zywwwwwwxxyyzzzyy}}{xwuvx{~||{{zzzyx~~~~}{{|~~}|{zywvtttuvwz|{yxwvutsrqomljjkor{}}{yxyxzzvrolmmryzyxxwwwvutrqonmllkmsz{~~{wtrooptx~|{{|~|ywusstuvz~~}}|||||||{zxwwy||yxx}}{yxxwxxxxyyzzzzyz}{ywvwx~~}|||{{y{}{||~}|{zxwuttuvw|~|{yxwvutsrpnlkklot~~{yxxx{zvsommnu{|zzyyyxwvusrponmmlow{|}zwtrppqux~}}}zxvtttuv|~~~~}}}}|{zyxxz||zyy~|zyyyyyyzzz{{{{z{}{ywvwx~~~}}{}|||~}|{zxwuttuvv}~~|{yxwvutsrqomllnqw|zxwwwzyvspooqy}}{{zzyxwutrponnmmmr{|~|yvtrpprvz~~~~{yvuttuv~~}}||||{{zywwwz|{zy{}{zyyyyyyyzzz{zzy}~|zxwww{~~}}|{~|{|}~}}|zyxvuttuuw~~|zyxwvutsqpnmllor{~{ywvvwzxtrooot|}|{zyyxwvtrqonmmlmlt||~{xusqppsw}~}~|zwutttuw~}}||{{{{zyxwvvx{~}zzx}~|zyxwwwxxxxyyyyyw}~|zxwvwx}~}}}||z{~|{{|~~}|{zywvusssuux~|{yxvutsrqonlkkmpt~~|ywvvuvyvspnopw||{yyxwvutrqonllkkklv{{~~|yvspooptx~||}~}{xvtsstty~}|{zzyyxxwvutttwz|zyy|zxwwvvvwwwwxxxxwv~|{ywvvwy~}||{{y}}{z{|~}|{zyxwutssstt{~~|zxwvutsrqonlllorx|zwutttvxurpoprz~}{yxwvutrqonlkkkklny{}}zwurpooqvz~||}~~|ywutstt|~~}|{zzyyxxwvuttux{|zy{}{yxwwwwwwxxxyxxwx}|zxvuvwz~}}||{z|{z{}~}|{zxwutssstt~}{yxwvtsrpomlklor{|ywutttwxusqpqv}~|{yxwvtsqonmlllmlr}|}zwurpoprv|~~|ywutttu~}|{{zzyxwuttux||zy~}{zyxxxxxxyyyzyyw|~}{ywuvw}~}|}~|{|~~}|{yxvutsstv~|{yxwutsqpnmlmpt~}zwutttwxvtrssz}|zxwutrponnmmmonw~}zwurqpqtw~{xwuuuw~}|{zzyyxwvttsuw}~|zz~|zyxxxxxxyyyzyyw~|zxvvvx~}}{{|~}|{zywvttsssx}|zyxwutsrponmorx}zxvtsstwwusrst}~}{yxvusqpnmmmmmnoz~~~{xvsqppquy|zwvttsy~}|{zzyxxwvutttvy}{z{~|zyxxwwwxxxxxxxww}|zywvvwz~}}|}|{{|~}|{zywvussrssz}|{yxwutsrponnnqs{~{yvusssswvtsrsv~~|{yxvusrpomlkkllloz|}~{yvtrpppsw|~~~}{xvusts|~}|{zyxxwwvutsstwz~~~|{z}|zyxwwvvvwwwwwvvuw~~~~}}{zywvvwx|~}|}~|{{{}~}|{zyxvutsrrrs}~~|{zxwvutsrqooopsw~{ywtsrrrtwuttttz~|zywusrpnmlkkkkllr||~~|zwurqopqtx~}}~}{ywuttu~~}|{zyxwvvutssrsuw{~~~~|{z|zyxwwvvvvwwwwvvtz~~~~~~~~~}|{zywvvwy~~|~|{{{~}|{zyxwutsrrru~~}{zywvutsrqpooqty~{ywusrrrtwutttv}~|zywusrpnmlkkllmmv}}~|zwurqppruy~~~{ywutsw~}|{zyxwwvutsssuw~~~}|z{}{zyxwwwwwxxxxwwv}~}|{yxvvwz~|{{|~}|{zywvutssrx~}{zywvutrqpooqt{~|ywusrrruwuutux}{yxvtrqonmmmmnnpz~~~|ywusqpqru{~~|ywutt{~}{zyxwvutsrqrtw~~~}|{~}{zyxxxxxxxxxxxvx~}|zxwvvw{}|{~~}|{zyxvutsst{~|{zxwvusrqpqsv}{xvtsrrsvxvvvv|}{ywusqonmmmmmnot}}{yvtrqpqsw~}~|zwvuu}~|{zyxwvtsrqqruy~~~~~|{{~|zyxxwwwwwwwwwwuz~}|{yxvvwx~}|{|~}|{zxwutsrru}~}{zxwvusrqppqty}{ywusrqrrvwvvvx~{ywusqpnmllllmmnu|~}{yvtrqopqtx~~}|~}zxvutw~~}{zxwvutsrqpqsv|~}}}}}|{|}{yxwvvvvvvvvvuuu{~~~~~~~~}}|{zywvuuwz~}}}~|{{|~}|{zyxvutsrrrw~}|zxwvtsrpoopru|~|zwusrqqqsvwvww{|ywusqomlkkkkklmpw|~}|ywusqpoprv{}}~||}}zxvuty~|zywvusrqpoopsv~~}||||~||{~~{yxwvvuuuuuuuuusu{}~}}}}}}}|{zyxvvuvx|~~}~~|{{}~}|{zyxwutsrrry~}|zyxvutsrqqrtx~|zxvtsrqqrsvwvwx}|ywusqomlkkkklmmry|~~}{yvtrqopqsw}}}~||~|zxvuu{~}|zywvutsqpppqtw~}||||~||{|zyxwwvvvvvvvuutx|~~~~~~~}}|{{yxwvuwx~~~|||~}|{zyxvutsrt{~}{zywvutrrqruy}{ywutrrrrtwwwwy}zxusrpnmmllmmnov{~}{ywusqppqtx~}}~}{xwuw}~}{zywvutrqqqrty~}||}}|{|}{zyxxwwwwwwwvvv{}~~~~}|{zywvvwy|||~}|{zywvttsw}~}{zyxvutssuw}~}{ywutssssuxxxy{|ywusqonmmmmnopry|~|zxvtsqqqruy~~|}~{ywvz~~}{zxwvtsrqpprt{~}|{{|~||{~~|{yxxwwwwwwwvvuv{|~~~~~}}}|{zyxwvvw{~~||}~}|{zyxvutssy}}|{zxwvutstux}|zxvussrrsvxwxy}~{xvtrpommllmmnosy{~}{ywusrqqqsv|~}~}|}|zxvv{}~}{zxwvtsrqppqsv}|{{{|}||{|zyxwwvvvuvuuutsw{{}|}|||||{{zyxwvvwx}~}~}||~}|{zyxwutsstz|~}|{yxwvutsstvz}|zxwutrrqrsvxwxz~|yvtrpomlkkkllmnty{~~~~}{ywutrqpprtx}|}||}}{ywuv|}~|zywutsqpoooqsx}|{zzy|}{{|~{yxwvvuuuuutttssxz{|{|{{{{{zyyxwvuvwy~}}~||}~}|{zywvutsrv{}~|{zxwvutttvx~~}|zywvtsrrrrswyyz|}{xusqomllkkllmnovy{~~~~}|zxvtsqppqruz||}||}}{ywvy}}~|{ywvtsqpoooqtz~}|{zyy||{{}}{yxwvvuuuuuuttstyz{}|||||{{zzyxwvuvw{}}~||~~}|{zyxwutssx|}~}|zyxvutttvy~}{zxvutsrrrtwxyz~~{xvsqonmlllmmnoryz~~|{ywusrqpqsv|}}}|}~|yxw{}~}{zxvusrqoopqu}}|{yyy|{{{|{yxwwwvvvvvuutw{{}~}}}}|||{zyxwvuvx}~~~}}~}|{zywvuttz|~~|{zxwuttuvz}|zywutsrrruxyz{~{xusqonnmmnnopqv{|~|zxwusrqqqtw}}}|}|zxy~~~|zxvusqponoqu~}{zyxy{{{|~|zyxwwvvvvvvuuuy|{~~~}}}}||{zyxvuuvx~~~}}~}|{zyxvutv|}~}{zywvuuvx}~|{yxwutssssuxyz}}zwtrponmmmmnopqx{|~}{yxvtrqpqruy~|}}|}~{yxz~}~}{ywvtrqpooprx}|zyxwy{{{}}{yxwvvvuuuuttstyzz}||||{{{zyxwvvuvwz~|~}}~~}|{zyxvutsw||~}{zywvuuuwz~}|{yxvutsrrrsvyy{~~{xusqonmllllmnorxy{~~~}|{ywutrqppqsv{}{|||~~|zxw{}}~}{yxvtrqpoooqt|}|zyxwwy{{{~{yxwvuutttttssrtyxy{{{{{zzzyxwvvuuvx}~}|~}}~~}|{zywvutuz|}~}{zyxwvvwy|~|~}|{zywvutsssstwzz||yvsqonmlllllmnotyy{~}}|{yxvusqqpprtx~|{|||~|zxx}~}~}{ywvtrqpoopru~~}{zyxwwyzz{|zywvvuuttttssrrvyxy{{{{zzzyyxwwvuvwy~}|~~~~~}|{zywvutv{|}~}{zyxwvwxz~~}}|{zywvuttssstwzz}|yvtrpnmlllmmnoqvzy|~~}|{yxvtsqqpqruy}|}}}~|zxz~}~~}{zxvusrpppprx}|zywwwyzz|}{zxwwvvuuuuttstxzy{||{{{{{zyyxwvvvwz}~~~~~}|{zxwvux||~~|{zyxwwxz~~}|{zywvuttttuxzz~|ywtrponnmnnoopsyz{~~~}{zxwusrqqrsvz}}}}~|zy|~}~|{ywusrqppqsy}{zxwvvxyz~}{zxxwvvvuuutttuzzy{}|||{{{zzyxwvvvx|~~~}|{zywvv{}}~}|zyxxxy|~~}|{zyxwvutttuxz{{xvsrponnnnoopquz{{~~}|zywvtsrqqrtw}||}}~|zz~~}}|zxvtsqpppqt}~|zywvuvxy{}{yxwvvuuuuttssvzyy{|{{{{zzyyxwvvvwx~~}}~~~}|zyxwvw{|}}|{yxwwxz~~}~}|{zyxwvuttstvy{|}zwtrponmmmmnooqvzy{}~}|{yxvtsrqpqruy}{|}}~|{yz~}}~|zxwusqpooprw~|{yxvuuvyz|}{yxvvutttsssrrrvxwxz{zzzyyxxwvvuuvwz~}|}~~}|{zyxwvux||}~|{yxwwwx{~|}~}{{yyxwvutssstvz{~~{xurpommlllmnnoqwyyz||{zywvtsqpppqsv{~|{|}~~|zy|~}~~|zxvtrqpooqsy~|{yxvuttvyz~~|zxwvuttsssrrrqswwvxzzyyyyxxwvvuuuvx|~||}~}|{zyxwvvy||~~|{yxwwxy|~}|~}||{zyxwvuttsstwz|~zwtrpommlmmnnopsxyy{}|{zywvtsqpppqsw}~|{|}}|zz}~}~~|zxvtrqpopqt|~}{yxvuttvyz|zywvuutttsssrruxxxy{{zzzyyxxwvvuuwy~~}}~~}|{zywww{}}~}|zyxxxz}~}~}}|{zyxwvuttttwz|~{xusqponnnnooprvzz{|~}|{yxvusrqqqrtx~||}~~|z{~~}~~|{ywusrppprv}{zxvuttvx{}{zxwwvuuuttssswyxxz{{{{zzyyxwwvuvwy~~~}|{zxxy}}}~}{zyyy{~}~~}||{zyxwvuttuxz}}zwusqpoonoopqrsy{{{}~}|zywvtsrqqrsuz}|}~~}{}~~~}{ywusrqpqsx~|{ywvtstvy|~|zyxwvuuuttssstxyxxz{{zzzyyxxwvvvvx{}~~}|{yxx{}}~}|{yyyz|~}~}||{zyxwwvuttux{|yvtrponnnnoopqtyzzz|}|{yxvutsrqqrtw|~||~~}{{}~~}{zxvtsqqqrt{~|{yxvutstwy~}{yxwvutttssrrrtwwwwyzyyyxxxwwvvuvwy~~}~~}|{zyxww{}|}~|{zyyy{~}||~~~}|{zzyxwvvutttvy|}zwtrponmmmnnooquyyyy{{zyxvutrqqqqrux~|{|~}|z{~~}}~~}{ywutrqqqsv~~~~~|{zxvutsstwz}{yxvuutsssrrqqqtwvvvxyyxxxwwwvvvvvxz}}~~}|{zyxwy}}}~~|{zzyz|~|{|~}||{{zyyxwvuuuuwz}|xvsqpnnmmnnnoprvyxyy{{zxwvtsrqqqrsvz~|{}~~}|{|~~~~|{ywutrrqrtx~}|{yxvusssux{}{zxwvuttssrrrqrvwvvwxyyxxxwwwvvuvvx{~}}~~}|zyxxz}}}~~|{zyyz|~}|~~}||{zzyxwvuttuwz~|yvtrpoonnooppqtxzyzz{{zywvusrrqqrtw|~}|}~|{~~~~~}{ywvtrrqrtz~}{zxvtsrrtx}~|zyxwvuuttsssrtxxwwxzzzyyyxxwvvvvwx}~~~}|{zyy|~}}~}{zzz{}~}~~}}|{{zywvutttwz~{yvtrqpoopppqrsvzzzz{|{zywvutsrqrsux~}|~~}}~~}|zxvtsrrsv}~|{ywutrrrtx~~|zyxwvuuttssrsuxxwwxzzyyyxxwwvvuvwy~~~}{zyz}~}~~|{zzz{~}}~~}}|{{zxwvuttuw{~{xvsrqpoooppqrswzzzzz{{yxwutsrqqrsuy~||~~}|}~~~}{ywusrrrsx~}{yxvtsqqruz}{yxwvuttssrrrrvwwvvxyyyxxwwvvuuuvx{~}~~}|{zyxz}}}~~}{zyyz|~}|}~}}||{zyxwvutttux}|yvtrpoonnnoopqswyxxxyzyxvutsrqqqrtw{~}{|~}|{}~}}~}{zxvtsrrsu{~~~}{zxvusrqqsv|}{yxvuttssrrqqqrvvuuuwxxwwwvvuuuuuvy}~}~}|{zyy{}}}~~|{zzz{}~||{}~}}||{{zyxwvutttvy~{xusqponnnnoopqtxxxxxyyxwutsrqqpqrtx~~}|}~}|{{~~}~~}{zxvtssstw}~~~~~~}|zywvtsqqqsw}}{ywvutssrrqqpqsvvuuuwxxwwwvvuuuuvwy~~~~}|{zyy|}}}~}|{zzz{~}||~~}}||{zyxwvutttvz}zwusqpoooooppqrvyyxxxyyxwvusrrqqrsvy~}|~~}|}~~~}|zxvutsstx~|{zxvtsrqqsx}{yxwvuttssrrrruwwvvwxyyxxxwwvvvvvxz~~}{zz{~~}~~~}|{z{|~}~~~}}|{zyxwutttv{}zxvtrqpppppqqrtxzyyyyzzywvutsrrrstv{}}~}|~~~~~|{ywvtttvz~}|{yxvtrqqqsy~}{yxwvuuttssrrsvwwvvwxyyyxxwwvvvvwx|~}|{{}~~~~}|{z{}~}}~~}}|{zxwutttw|~|ywusrqqppqqqrsuyzzyyyzzxwvutsrrrsux}}}~}}~~~}|zxwuttuw|~}|zywutrqqru{}|zyxvuuttssrrrtwwvvvwxyxxxwwwvvvvwy~~}|{{{}~~~~}|{{{|~~}}}~~}}||{zywvuttux~}{xvtrqppppppqqruyyxxxxyxwvussrrrrsvy~}~~}|||~}}~~|{ywvuttuy~~~~~}|zywvtrqqqrv}~}{yxvuttsrrqqqqtvuuuuvwwwwvvvuuuuvx{~~~}|{zz{}}}}}~}{{{{}~}|||~~~}}|{{zywvutttvz|ywusqppooopppqsvxxwwwwxwvusrrqqqrtv{}}~}||{}~~}}~~|{ywvuuuw{~~~~~}}~~~}|{yxvusrqpqsx}|zxwvutsrrqqppqtuuttuvwwwvvvuuuuvwy|~}|{zz|~}}}~}|{zz{}~}||}~~~}||{zywvutttv{~{ywtsrqppppppqrtwxxwwwwwwutsrrqqrstx|}}~}|||~~~}}~}|zywvuuux}~~~~~}|zyxvtsqppqsy~|zywvuttsrrqqqsuvuuuuvwwwwvvvuuuvwy~~}|{{}~~}}~}|{{z{~~}}~}}|zyxvutstv|~|zwutrrqqqqqrrsvyyyxxxxxwvutsrrqrsux~~~~}|}~~}}~~|{ywvuuvy~~}{zxvtsqppqtz~|{yxwvuttssrrrtwwvvvvwxxxwwwvvvvvwz}|||~~~~}|{zz{~~~~}|{yxvusstw}}{ywutsrrrrrrrstwzyyxxxxxwvutsrrrstvz~~}|}~~}~~|{yxwvvw{~}|zywutrppoqu|}|zywvvutssrrrruwvvuvvwxxwwwvvvuvvx{~}|{}~~}}~~}|{{{}~~~}}{zywutsstx~|zxvtsrrqqqqrrstxyyxxwwwwvutsrrrrstw|~~~~}||~~}}~~}|zxwvvvx}~~~}|{yxvtsqppprw~~|{yxvuttsrrqqqruvuutuuvwwvvvvuuuvwy}~}|{{}~~}}}~}|{{{|~~}}}~~}|{zyxvutstvz}{ywusrqqpppqqqrtwxxwwvvvvutsrrrrrtvy~~~~~}}|{|~~}}}}~~}{zyxwwxz~~~~~~}}~}}|zyxvusrqppqsy~|{yxvutssrqqpppruuttttuvvvvvuuuuvvxz~}|{{{}~}}}}~~}|{{{|~~}}}~~}|{zywvutstv{~|zxvtsrqqqqqqqrsuxxwwvvvvvutsrrrrstwz~~~}||{|~~}}}~~|{zyxwwx{~~~~}~~~}|{yxvusrqppqtz~|{yxvuttsrrqqpqsuuttttuvwvvvvuuuvwy{~}||}~~~}}}~~}|{{{}~~}~~}|{yxvutstw|~|zxvusrrrqqrrrstwyxxwwvvwvutssrrssux|~~}||~~~}}~~}{zyxwxy}~}|{zxwutrqppqu{~|{zxwvuttsrrrrsuvvuuuuvwwwwwvvvvvwy|~}||~~}}~~~}|{{|}~~}|{yxvtsstx}}|zxwutsssssssstvxyyxwwvvwvutsssrstux}~~}|}~~}}}~~}|zyxxxz~}|{yxvusqpopqv|}|{yxwvuttsrrrrsvvvuuuuvwwwwwvvvvvxz~~}}}~~~}}~~}|{{|~~}|zywutssty~~}{yxvutssrrrssstvyyxxwvvvvvutssrsstvz~~}||}~~}}}~~}|{zyxxy|~~}|{zywutrqpopsx}~}|zyxvuttsrrqqqtuuuuttuvvvvvvuuuvwx{~}|||~~}}}}}~~}|{{{|~~~}|zywvtsssv{~|zxwutsrrrqrrrrtvxxwvvuuuutssrrrrsuw{~~}}||{{|~~}}||}~~~}{zyxxxz}~~~~~~~}|{zywvtsqpopqtz~~|{yxwutssrqqppqsutttsstuvvuuuuuuvwy}~}|{{|~}}|||}~~}|{{{{}~~~~~~}|{zxwutsstw|}{yxvussrrqqrrrrtvwwvvutttttsrrrrrtux}~~}}||{{{|~}}|||}~~~}|zyyyy{~~~~~~~}||zyxwusrpoooqu{~~}|zywvutsrrqppprtttttsstuvvuuuuuuvxz~~}|||}~}}|||}~~}|{{{|~~~~~~}|{zxvussstx|~}{yxvutssrrrrrrsuwxwwvuututtsrrrrstvz~~}}|{{|}~~}|||}~~~}|zzyyz|~}|{zxwutrqpoprv{~~}|{yxwvutsrrqqqsuuuutttuvvvvvvuuvwx{~}|}~~}}|}}~~}|{{{|~}|zxwussstx|~~~|{yxwuttsssssstuwyyxwwvuuuuttsssstuw{~~}}||}~}}}}}~~}|{zzz{~~}|{zywutrqpoprw|~~~}|{zyxwvutssrrqrtvvuuuuuvvwwwvvvvvwy|~}}~~}}|}}~~~}|{{{}~}|zxvtsrsuy|~~}|zywvuutttsssttuxyxxwvvuuuuttsssstvx|~~}}|||}~~~}}|}}~~~}|{zzz|~}|{yxvusrppoqty|~~~}|{zxwvuttsrrqqsuuuutttuuvvvvvvvvwxz}~}}}~~~}|||}~~}||{{|~~}|{ywvtsstvz}~}|{yxwuutssssssstuwxxwvuutttttsssssuvy~~~}}||{{{}~~}||||}~~~}|{{zz{}~~~~~~~}|{zxwvtsqppprvz}~~}|{zxwvutssrqqpqrtttttsttuvvvvvvvvwy{~}|||~~~}||||}~~~}||{{|~~~~}|{zxwutssux{}}}{zxwvutsssrrrrssuwwwvuttsttsssrrstux{~}}||{{zz{}}}|||||}~~~~}||{{{|~~~~~~~~}|{zywvusrqpppsw{}~}}|zyxwvutsrqqppqstttssssttuuuuuuvvwy|~}||}~~}|||||}~~~~}||{{{}~~~}|{yxvtsssux{}}|{zxwvutsssssssstvwwwvutttttsssrsstvx|~~}}|{{{{|}}}|||||}~~~~}|{{{{}~}|{zywvtsrpppqsx{}}}}|zyxwvutsrrqqqrtutttttttuvvvvvvvwxz}~~}}~~}}||||}~~~~}||{{|}~}{yxvtsrsuy{|}|{zywvvuttttttttuwxxwvvutttttsssstuvy}~~}}||{|}~~}|||||}~~~}}|{{{{}~}|zyxvusrpppqtx{}}}}|{zyxwvutssrrrsuuuuttttuvvvvvvvvwxz~~}}~~}||{{|}}~~}||{{{|~~|{ywutrrsvy{|||{zyxwvuuutttttuvxxxwvvutttttsssstuwz~~}||{{|}~}}|||||}~~~}}|{{{|~}|{zywvtrqpopquy{|}}|{zyxwvuttsrrrrtuuuuttttuvvvvvvvvwy{~}}}~~~}|{{{||}}}}||{{{|~}|zxvtsrrtwz{||{zyxwvvuuttttttuwxxwvvutttttssssstvx|~}}|{{{{|}}}||{{{|}~~~}||{{|}~}|{zywvtsrpoopsvz|}}}|{zywvutssrqqqrsttttsssstuuuuuuvvxz}~}||}~~}|{{{{{|}}}||{{{|}~}|zywutsrsuxz{||{zywvuuttsssssstvwwvuutssssssrrstuwy}~}||{{zzz{}}||{{{{|}}~}}}|||}~~~~~}|{zyxwutrqpppqtwz||||{zyxvutssrqqppqsttsssssstuuuuuvvwy{~~}}||}~}||{{{{{|}}}||{{{|~~~}{zxwutsrsvyz{{{zyxwvuuttssssstuwwvvuttssssssssstuw{~~}||{zzzz|}||{{{{{|}~~}}}|||}~~}|{zyxvutrqpppruxz{||{{zywvuttsrqqqqrttttssssttuuuvvvwxy|~}}}~~}}|{{{{{|}}||{{{{|~}{zxwutsrtvyz{{{zyxwvvuuttttttuvwwwvuuttssttssstuvx{~~}||{{{|}}}||{{{||}~~}}}|||~~}|{zxwvtsqpppruxz{||{{zyxwvutssrrrrtuuuttttttuvvvvvvwxz}~~}~~}||{{{||}}||{{{{}}|zxwutsstwyzzzzyyxwwvvuuuuttuvwxxwwvuttttttttttuwy}~}}||{{{|}}}|||{{||}~~~}}||}~~}|{yxwutrqppqsvyz{{{{zyxwwvutssrrrstuuutttttuuvvvvvwwy{~~}}~~}||{{{{{||||{{{{|}~}{yxvtsrsuwyzzzzyyxwwvvuuutttuvwxwwvuuttsttttttuvxz~~~}||{{{{|}}||{{{{||}}}}}}|}~~}|{zywvtsrqppqtwyz{{{{zyxwvuttsrrqrstuttttttttuuvvvvwxy{~}}}~~}}|{{zzz{||||{{{{|~~}|zxwutsrsvxyzzzzyxwwvuutttttttuwwvvuttsssssssstuvx{~~}|{{zzz{||||{{{{{{|}}}}}}}}~~~~}|{zyxvutrqppqruxzz{{{zyxwvutssrqqqqrtttssssssttuuvvvwxz}~}|||}}||{zzzzz{{{{{{{{|}}|{ywvtsrrtvxyzzzyyxwvvuuttttsttvwvvuttsrrrrsssstuwy}~}|{{zzyyz|||{{zzz{{|}}}}}}}~~}|{zxwvtsrqppqsvxzz{{{zyxwvutssrqqqqsttsssssssttuuuvvwxz~~}||}}}|{{zzyyzz{{{{{{{|}~}|zywutsrstwxyzzzyyxwwvvuutttttuvwwvuttssrrssssttvwz~~}}|{{zzz{|||{{zzz{{|}}}}}}}~~}|{zywvusrqppqsvxyz{{{zyxwvvutsrrrrstutttttstttuuvvvwwy{~~}}~~}}|{zzyzzz{{{{{{{|~~|zywutsrsuwxyyzzyyxxwwvvvuuuuuvwxwwvuttssssssttuvx{~}||{{{{|}}|{{{zz{{|}}}}}}}~|{zywvusrqpprtwxyzz{zzyxwvvutssrrrsuuutttttttuuvvvvwxy|~~}}~~}|{{zzyyzz{{{zzz{|}|zxvusrrsuwxyyyyyyxxwwvvvuuuuvwxxwvvuttssssttttuwy|~}}|{{zz{|}||{{{zz{{|}}}}}}~~}|{zxwvtsrqpqruwxyzzzzyxxwvuttsrrrrtuuttttttttuuvvvwwyz}~}}}~~}|{zzyyyzz{{{{{{|}~|{yxvtsrstvxxyyyyyxxwwvvuuutttuvwwvvutssrrsssttuvxz}~}||{zzzz{||{{{zzzz{{|}}}}}~~}|{zywvutrqqqrsvxyyzzzyxxwvutssrqqqrstttssssssttuvvvwxy{~~}||}}}|{{zyyyyzz{{{{{{|~~}{zxwutsssuwxyyyyyxxwwvvuutttttuvvvuutssrrrsssttuwy{~}|{zzyyz{|{{{zzzzz{{|}}}}~~~}|{yxwvtsrqqqrtwxyyyzyyxwvuutsrrqqqrsttsssssssttuvvwwxz|~}}||}}}|{zzyyyyzz{{{{{{}~}{zxvutsssuwxxxyyxxxwwvvuuutttuvvwvuutssrrrssttuvwy|~}|{{zzzz{||{{zzzzz{{|}}}}~~}|{yxwvtsrqqqsuwxyyyyyyxwvvutssrrqrstttttssssttuuvvwxyz}~}}}~~}|{zzyyyyzzzzzz{|}~}{zxvutsstvwxxxyyyxxwwwvvvuuuuvwwwwvuutssssstttuvxz}~}||{{zz{|||{{{zzzz{{|}}}}~~~}|{zywvtsrqqqsuwxxyyyyyxwwvuttssrrstuuutttttttuuvvwwxy{~~}}~~~}|{zyyyyyyzzzzz{{}~}{yxvtsrstvwxxxxyyxxxwwwvvvuuuvwwwwvuutsssssttuvwx{~~}||{zz{{|||{{zzzzz{{||}}}~~}|{yxwutsrqqrtvwxxyyyyxxwvvuttsrrrstuuttttttttuuvvwwxz|~}}}}~}|{zzyyxxyyyzzzz{|~}|zxwutsrsuvwxxxyyyxxxwwvvvuuuuvwwwvuutssrrssttuvwy|~}||{zzzz{|{{zzzyyzzz{||}}~~~}|{zxwvtsrqqqrtvxxyyyyyxwwvutssrrqrsttttssssssttuvvwwyz}~}|||}}|{zzyxxxxxyzzzz{|} \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m37.bin b/applications/SprPoP/dist/MUS/m37.bin deleted file mode 100644 index 6f0fb38..0000000 --- a/applications/SprPoP/dist/MUS/m37.bin +++ /dev/null @@ -1 +0,0 @@ -|ys|}v{~z{}n}{~v|}}x~|}yxywymzxz}~~z{{w~zvv~s}vv~~v|{u|ynyyql{uznmt|xjy}v~|x~s}}so}z~~yzyzx}z|jr}w{yw|{vx~~xpzzuz}t}rx}}yqotqy}~~w~z{}so~~}}toggywwy~{wuiiy|~~~}|{~~uzzypqqwst{~w{rs}~tmmt{yutpusv{{|}~xzovtvzz|zr{}~uwtuv{{zqpp~}t~{ru~{vw~z{v}}}yrqzsyxwnhortxxqsvpw{|z}~~wv~}{{~}wy{monv|u{}}z{tmpvwu{krpvxlkt~z{{~|~zpqz|{|rrzgluzz{vxztvsqsypy}svx}}t|{nlklnq|~rq{}{~}||{trnw|}sw|uxu|z|}xt}yu{zsjk}rgpstt{{yuy||~y}{qw~{xq~||||ytsust~}~u||zysswxpuzutuypyqmt|}~{z~z||||vptz~wxp|pltyxvtpwwruyyn~}{kryynx|xqokllr|wtz~y}yx~xxut~~z|zv{}}}vz|z~y~z{~txwozvoqtmuyzx}}{x|}|y|~}}rqvvs~y}wyxwvsuszx{~z~{zx~zpws{yrr|xlqw{|~y}~z|zy}~}~~ysx}}vqx~wz{zyvuztw{xvwv}wiu}}wyyoy{wpooy}}~}}|~pty|wzvv{xrxrzz~{|yy|wz}{zxrsnnyrjry|~~~xtz}}}|yyworyz|utrvv{{~{wvzy~~rpytyyvp}}ttuww}}|yv~y|~{ovs{|v|{w{o{{r}}zy}{zrxvytvssvwwyx}}~yz~xzuupsrrz|zsyxyyxytrv}xmtzpxvqxwwvyuy}xy|}~|w~}{vy}zx{v~|||~y~r}{|z}~zz|~{u{{nzmzzqsy||{y|xy{xtwx{{|~x}|{zxsy|~y~r||utu{~st{x|xzrvyutyyx|w{}|}z{rwwx{y}}puv}|~s}~{||y}z~uyx~xsvqnt{~||}v{}}~~w~{}x|trsz~vy}yx{vw~|||vxq~~wpquru~vz{yxz||{{yvxw{z|{zx{{|owys{{yy{{~{{w{vzrqxurx|}}{~{y}{z}urvtvyzvzzz~{zz~{uvvx~}~|qx{{zt}sq{~|yxzytz|{|}}~{{x|y{vyu{~||q}x{~v~|xy{}{tw}xzs{yqrz~}~x{{}||uvuvx||v}zv|~~xvvu{~pq{xyr~mzxtz}||x}{xx}~~z~}u|ytvzz~yx}}}w~{x}z}|sy}|xtu~tsurt{}~~|~}{wz}}yusv{}wzvt~}zx{vxvzy}}~xqvx|orv}~y{||{{t}~w{zzz||y|y~}zvzx{z{vt~|}~{~zwz|u~~orxusz~~}zw}}~tuuvvutw~{~y|u|rwzx~yy~vzsx{os{|{}|xt}}~~~|}|{~{y|}u}v|}z~}yz{|~wuz{}~wqwy{~zyzvt{|z~x{z}xvvvz~|||u~|{|~xu{t|xx~zwuu{hy}pt}~z|{y}}y|zy~zuzz{|}}}|~|}y~~wut|}urz|~~}zw{zw}tuwrsy~}x}|xwxxwty{sz{{w|v{}wy~}wu|zzvwxoz~}{z{}~wvzz|||{|y}z|{{~xy|~yw~uw~~z{~}}|yux{yzvsvywtw{t{}}~}|{xxvstz~}}~{zy{w|xw~zv~|~x{zn~zlr{~~~vyy|{}}~~}~~|~}yz}y}}{}~zyx{}tv|{|zwtw}v||z{yx}~uy}~~zz{||z|vx~~~}y~uwur~y{}zwzyzrn{mrw}|w{}y~xzy{{|zx{zz|}~|w~ws|zvtx}|~~}~~}}~{wwwvtz~{}}|}~xzutruoew{~~~vx}|~{swzpw|zsq{s|yztwvsovsvgooruy}o|w}z{}xv{ptztnv}zuknrsiupquyz{~ysxv}~txzo|~vsvoqzoiv{u~yxqxp}tzzq}yuy}svnr|s|xmrzu|zvxu~zl}swssgpxpr|vt}~~}|~stu}tswrursxxrzzmwlu}yxytvptxvr{}tr~|t{{qy{~~pw|lz{yyvrmu|{xxzvl|r{}~~}~}ny~lzphswzuqyxvtow{y}}|{~}uz~tquymspwvsrtut~|w|y}}{|{y{xtxz{|ywyyzzxyyu~v}uouz}qlzqjtsnszkv}wz}}uuninnjly{{~~{{~qqz||y}{vxz{wt|zwytpvzsy}{y|{rxxmrzwvtx}mwuu{pu{|}y{{morvuuns{qqzqzio~zz}utxpquwux|svwr}~w~|u{rz}xyzqn}jpyrlt{ry~}zy|x}qouppw}yy|ynuyuz{}z{zvyvxvzuxss|~qs|mt||w}|ptwsqpojq}yx|rpz~vq|}|}|{qw{||~uzxv|vyrjzx}~wx~x|zzwu|}y|}}~yxv}xo{yx|yx}uopij{}xsllhywlt}s~~~}v{zz|qwxysuzxvzxwuqpju|||u{|~}}~wz}}n~pxljqrv{xsy}}hy|~|u{|~ozzw{tz}|xwpzzu}sorumwz}||{v{v}}vip|xv~lx{y~xtxmz~|svtu{w{rtger{|zwnx{zrs}z{}}|v}z~~wryyt}zrsvls}}~~~nlwu|yxzvzvqy{z}rm~x~~z}y~{{}~xwr~{{rkru~}wrjmx{|t~vw|z{odv{y{~yv{iiruqq{{trw}{~~}w~~vy|u~uu{ytstrwuxti~y{zyzyqvqoyvtv}y{~zuvz}~}{}|{v|zp{}{mx~lfjkmmmm{rlr|zsu|{u{~}tpomflz{}zzyyw~|u{||voszutvtuts~xty~zzw|uv|t}s~}z|zouuvv{zzvw~|z}{w~~}xkzqzyvpigffjuyppy}~rt||}~sxtrp~mlrrlp~}{z|{}}~}krwoqutorrpxs|mw~~xyytzy{yx~zwrrry}zx|x}~y{vlw{}vnyuliijhozx|~~vr|}wz~}vxnmprpnu|}xy}|w}yyzwswxvqkjtu{uvz}}ytvryzy~x~sy~}|xuuwxy||}}r~|wr{ql{zrnkijkhx}utt~zy|yyv}w{xnmopuv}z}|zv{}~zzvoy{wwvqmuz|yx}x|}v}}}~|}s~t|xxxz~{|~{}~}}|u||wny|vv}|skggpr|~{y{}|~rs|w~wzwzuvwu}~|z}y~yv{{||uwsuyzxtqs}zvsw|}||}}y{yx~|~zx{~}~~~}~zw{|uxwu}ssytpmmy~vy~}}~tw~zsu}}y|ztxy~}|{y{v||~}}}st{|zxtvx|xxx{|wyz|xzzr~w~~~~{}}~|~~yr{|{~~{~zywz}{vtoq{~z|ut}~}y~|z{{|x~yz{wz~~vz|x}~|yzxz{x{zz|}yxz|yy|zyz}}|~|}}}}|~}|~|xzyr||y~rx~{wwxv|}}{x}|zwy}|~|{yz||{||}y{|{zx~wz}z~|ysw}}v|~|wyx~~~z~~}zw{v|{}~~~}~}~|}vv}y}~~{{{{}|zv}~||||}}}|xz~}{~}z|z}{yz|||}xw}xyx{xy{{~{z}|zu}~x}{y~{||y}}{|{~~z|{|~~{}}z|y~v}z{uyzu{{}{yu|~}{}|}~y{z}x}}~|}o~}yv}~y{tutrxivrlx~{yr}y{vwwo~~qoz~}{ts}w~xux~snr||wq}|v~}|qusv|sxzv}uytq~wu}}{x|}|wy~o}vryqwvz~ty{~zt~}~~yuzzyxnvwt{||}w~v{~tqrqq}~{|vy~zw{wkp{}~~nkt~{xsju~}|}~}yz|{~xwz{yryt}vvvvyq~~mw|}xy|zuw{|y|{}wwz{yyx{ts~zzvvx|w~{}sxz{xtxs}y{uvypnyy{zt}qpvw~wqprppy~}xyvyxr{ynr}wy{|z|~w{qsp{ztvqx{q~szuwxkz{q{uxzxpjmw|}xtx|pzvy|uow~~|{zz{zznw}tu|so}zy}~~y}qrqrvvpu~}v~|~w~ttnjspnwwzznu|}}y}tr~rxvlluxt{||z~y{jo}wzqyusx{}y~rztxvrzpz}zyv|x~~vr{ruuw{ywoiwz~{}}yxjzxs}nozwu~}xtzssvhlzs}z{yss}yt}xvs}xws{vyuszptyuzxoqz~}y|}|yvv|qvxvvr{}z}}yw|qr|swyu|ut}uyzpvzt|zqw{~v|v}ymsynkv{t~~ry|~s{y~yztvus{vrz~|~y{z||y{lqyyvsx{{~}wwvyxrwuvu{}y|zs{xsv}~~}xrt}|z|wxtzz|x|sy~q|vx||}}uqokru|zxzy}{xs}{ts{vy}zwy{t{~y~wx|qs{|}|~rv}~v~xwytw{syyyv{{z{{uxv{~xv}|}vyv{~vs|}vxn{rs~|}wwpzjmxt~}zu~wq}v|~~}s{z~}z{xv}w|{|}~~xyysuy~{ow|~~}}}yuzv{txo~yw~~~y}|}y{~}stz{|{{vvw}zz}t|{z~tr{zxz{z~z{zozxotp{zv|x|}w{yw~|}xv}}{}p}}uw~yw|zow}|z~r}xt||||{|zwtx|rz~~{}~}||~y~xx|tt}~~{yz~ws}|wpxty}~x~|~z{zu}rmxv}{|~~v~uv~~~zy||s~~{}}~v|{|~~}}~uz}wyyy{}n}|||~}zxxzyxzzs~~x}{yx}}|v~}uux|~z~z|s}}xvzv{|rn}zv|~~||{|syytxtz}~w}{~|}vy|{z|zv{|r|{x~}~yzysx}xw|}s~|wz|z}wu{uvymz}}~~~~y~x~{y{|rv~x|x{sxyz}ruuwyy~|~|x{{v|~uuz}y{{u|}vty}zv}{o{|~xx}}z~zsvwy{vp}zqv|vuw|vyv}{{x{{z~~z~w|||yx|y~~|}vw|}|qxzrzzxmxr{~~|z{|z{ywy{{|y}~tz}{{tz|xwy~z|yt~ywxy{zqz{}u~zwy~qt}s{z~o~}~}}|~z}~vvw|~v|~}{zx~{~~s{yxswxxu{wx}~~xt}}y|||x~}~|zuy}}t{|~yuzzq{|tz~~|rpw~}ro|wuzwvz{|yv}y|q{z{vz~xx~|u{|{x{z}{yxx|{ss}vyz|{zo|wn||~v|ztyqyy{uz|||u~~}|y}wr}}t{~||yxv}{rvztz{{}yw~zyu}yzzy{xxz}}y{~z|zwqxz~{{|yyyy~vx|z~{ww~lr|wx|~}}|~x{~s|{||}x~~w}|t|y{~~~yyw~~|yv}}{tnv~|prvvxv~w|t~xy~t}zw|{z~vvy{|qw}vxz~x~|}{}{zzrwx{wyx|xvvou{{|sxt~stx{|xwyx}wz~|{|||}xxvxwv}}ytvxxqxwysz|}||x~|z{~}}|y~~txx}wz|~w~{qt}|yy~wxy~~~wvy|}}zuqjz}yx}{~yxy{{~~tz}|~{~}xxzv|tyzxy~|x{xyq|{y}uwrpw}vots}vzy|~}u~{w}~{|}s|~|tuw{ypw}x|yz~z|~w}}{z{trw|vuw|zzpqwz~||}sz|w~qv~|}xv{{v~y}~~x|}|z}{~|xz{wzv~{xpsx~xsxvxt{~|~|y{}|}vv|{z}vwz~|~|w}ts{v{}wx~~|}~~~wvv}}}{xqmx}x~~z|z||t{}~s}}|}|{|~uwyzttzywxyy}yz~q~}zvouttxyqur{v|~~||x~{}y}~{wv~{urty~y}sty}{yzz|}}|xz}{{~|xsu}ytw{{oozz~~{|}ww|~p{ztsx~~vx{}y|y|{y~}|yuu||~~{{~xuotz~wyv|}sx}~|r~|}~x{zx}}yuwz~{}{x{~||wxzyzzv~z|xvuz~{{tqr|z{~yx~|uwvz}y{}||xu}|}oszxvvzy|vz~yukrzwvttvr|ww~|y}{~~y{|~~yxyusrux~yysux~xx~z~{~sz||~}~zwuz|xtyw|js{z{|}}}|{ytz{xypsywuw|}t}{y{{yzrx{z}xqsrw{}z}xz}rvz~{~~{x{yyyvyx~zxwy{~{{||z{|xx}}|xx}~|z{}{{zvux}~}|wswsy~}{xz|wxz~{~wz~~|}yxu|mtxwux|{y|y|~~vmo{|wqwuu{pw~}z}}{}x|}~{}zqqrtvz}~}wvvuz~|x}}yu{~y~~|zyyzz{wxutpv}z|}}~|{~~{ux~v|~tpszuw|x~uw~{{}}}ytz}}|~vmruw{zzx~ypy|}{x{~wxwz}x{wxxyz{y|{~x}}~zu}|{w{{|}ywz}~xvtx{}~|zszxu{|yzzx{{{~|zw{~}}z|twtrvywx~~{}xzzytmp{}urxtzup{||{y{x~~~~yoortvxyuxywy{}{~|{}y|zz||xxxz{yzyyuyvu}}~~|{~|~rz}v{{|uqry~xvy|}tw}~~~|wy~~~~ylowwyxy{xsy~~~z~}vwx|}~{}~xtwyyzzw}{x~~v{y~v{z|yv{}}|uttx{|}~yw||wz}|z|}{{~z}}||yx{~~|{}sz}wvwzy|zyw{x}{usor{}tuuyzpv~{~xy}y{~~rmptuwu|xx|zy}zz~~||~{v}|{ztux{~{y{{u}{|vz~}{~}r|{xzzxtssx~|wt{sx||z}{{y~wmpyzyv{|sv{~~yyvy|}z|xrrw{{{vz|~wz|wz|xz}{v~}~{}}urtx{|{~{w{~|x|z{}~~}~{x}|xxy{~{{}xzuyzwxz~~~zx||xxtutsy|xvt}tpv}~{x|}{}~~}|zrnrvwuu|wz|{zxy|}~|z}v}}|tpsz|y}x|{w~wy~|}~~wz|y{x||ttuvztytux{}~ww~v~{vos{|vwx~uux{}w|}xx|}|z~}sprz}}xwy|xw{}{z|z~~x~{~wqqw{}{{~~xz|}zzx}|{}~u~|~{uw{}z|{~xoy|yx|}z}|z}x{~wsvyvvy|wv}rqvz}}~|}}xvuqrvxuty|z{{}|~~w~z}~y{x{~upov~z|{~{t|x{{|{~}|~x|yz~xsuxx||~w{wvwy{~{~vv{t}zyxts{|vxvvxyz}~x|{xy|{|}~|soqw}~xxx|wx{{|x{}}xrpu{}{y~~~x{|}~y|z|zvz~}~|utx~||{~pr{~z{{|~}{z||~~w~~ztsx{xuw}w|xqux{y~}~ztqtttvytvw}|}}}z}~{~}y~xx|toou~|}{{t||{{z{~~~xx{yz}xtvzz{z|{tyzzz~{~xu}yu|wwyxty{xxv|xz{{}~{|zyz|{~}|{zsoqv|~xzx}wz|z}zy|~~wqquz}zz||z}~|~~{{{v}z}}~xsty~{}z}qt|}~~{}}xy~~w}~|}|vtu{}yrz|}|suwz|x~~~~{|ynpvwvyvvwz}}}|~~}z{v|{toot{~||u{}{z~|~~ztz{y{}~yvw|}{yyqz|{z~}{~zw|t{~~ytw{|wwy{wz|wz{|{~|yz|~{~}vusqtw|zzyzxy|}{|||~{x}}xsruy}z{|}}z}~~~{~|~|}zy{}~xttx~}|}{|utx~}z|ywy{|~~zuuw|ysw{xswxy{z~z}zvmoxzywuxv~|{~{|}{{y}}uqprw}~}wx|~{{~|s{~|y|}zyy{~~x|~qs{}{{~|}}z}wz~z}uty~xsz{z|sw||{|~{z}}yqsuuvxx{{y~vv{|}|z}~~z{wzwutuwzzy|z~z|}~~|x}{~|x~z{{~yutvz~{}{xyvv|{z|{x~{}{}|yuvy|zvtywtwyy{~yz~{~yqmt{|wvyw}yxz{{{~}zwrqsvz}}yz{~}~}|zw}~z{}}zyz|}{z||st|~|}~}}}|w{{~{utzyrzz~yqw|}|~~|{~{opvxwwuz{{~tv{}~~{~|zw{ysstvxyxy}{}y}~xy||t~{zw|~xutvy||}|~yz{xx~}{||y{y}|z{{wux{}~zys}~vwy{{~~|xzz~}}xrot{}wxyz~vx|{{z~{|}wqqtwz{|y}}|}~{~zz{{{{}~zxy{~||{}wv{~~~|zw{|{~zvuz|tx{yqv{~~}|~}~|pnuzzwsy{~~tv{~~~{}~|zzxqptwyzvy|}zy~zy~}}s}yv{{tstx{}}|~|}x}~{y}}}{|t~|{x|{xvwz|~{}xx}xyz|}~zx{y|~}|xvrrw}yxyzvv}||}~{z||}~}}~xrrvxzyzz~|z~}|~}{zy}|}~|wux||~||{xz||~~}}w}{|y~}xvw|zwvutv|~{|~~{~xppx|{tux}utx}{{{~{}{qnrxz{vw{}yw}~z~}v}~zwyzsqty|}z{~}zw|~z}|~}}yt~}zx|}wvwy|}{{~z|vuz{|~{z{{v}|~xvwvuxzyzyzsx}z~z{~{~|}zxuruy{yv|z|zzy}}{yyz~~wstz{~~{}}zz|y{|~~z|}}y{ywy{~|wxxvvw{~|}}x|z||vqsz~xtuxxtvy}~z}{}}~~vpntz{xuxz|vy}~~}|~{}zzz~wqpu{}|x|}vx|}|~}~~ww}|~yy|{uux{}}y{~~~rsz}}~~~||~zv}{}wuwzywvx{zztw{~{{}y~{~ztttvy{zvz||}~z|z~~~{~zvzztrv}~}|{{z{x{~}~|y~~|y|}xx{~~y{{wxxxz}{}~xzx~{xuty}ywux~vuwy|z~~|}~~}xrorx{xuxx}wy|~y}||{|~~yrprx}}xz|yw{}~~v|z|{xz}~xtuz}~{x}~|qt{~~~|~~}~vz~{|{uux||xsx{|xvy|~}{|}~y}{~zrqtwz|zwz{}}}{}~~y|ux~ytrv}~|||}y{}~}~wy}~{y|}yy}~~|}xw{{zz~}{}xy~w~}zyxwx{yzwy|vvxz|}}}}~|zwtqsw{wvxy{xz}~~}yz{}}||{vqqty}|x{|xy|}}~}y|{x{xy{~zutw|~}x{|vsw}~}z~}wx}{|{~|vtw||ttz}ywy|~~|}{{|}~}y}{}}rosx{|zx{{}~|~y}uw}~xtsw}~{}~~{|{~~|s|}~z{}{y{|}tx|}{{|{~~yzy{yy{{yxx{zy{uvxz{}~}~~wuutuvxwwxx~yx{}{~|xz~{xtqqux|zy{{}xz|~z||{{yxx{|~~|xuux}{x{|wuv|}|z~|w}{||{}xtuy~zsux|vy{}|~zz|~y{}xpou{}{xzz{~z}}}y{xyyutvz~}}|~~}|}vw~~{|~{z{}~vsy~~||~~|{||||{~{xz~~zuw||~trvyz{~~~{ssvxxwuuxw}yuy|~~y}|vzztqqswyzx{zyyz}~xz~w}|zux{~~|yvuvy}~zyz}}zxwy~~z|yw~{{zz~~xtuy}}wvv|vy|~~~|xz~z|}|tpqx}{w{z~y|~}{~~{}{||z{{vtuy|~}~}~}}}}}w{{~}z}{zz}}vty}}|{{~~}z~~}{y{|uw{~urvz{|~~~uquz{zutyx}zux|~~{~yx}}vqrtwyzw{|}zz{}~}z|yx}yvz}~zvuvy{}|z|{{|{z{{}|v{~{|y||xvwz~|{xxzxz}}yz}|z~}~|wttx|{y}|y|}~}~}{|{~~~}}~~{wvx{|}{~}|~}~z}z}|{~}zz{~zxy~~}}}y}}{z{}xy{xvx{}~~}}}~wsv{}{wwzzzwz}~~~~~{{~}vstwyzyy}|z|}~~|~w}~~yy|}xvwy|}}{~||}}}{}~}~wz~{}{{}zxxz}~}~|z~{y{}~{{}{{~~|ywwx{z{~|~z|||{}|~~}zwwz||||~~}{}~~|}z}|}{yz|~~{z{~~}~~z~}}~|{|~{|{||yxz|~}|}|{wvz||yz{z{xy|~~}~~~~~yuvxzzy{}|~{|}~~~{}||~|xwx{}}{}||}~~}~|y|}}|}{yz{|}|~|~}yz{}~}~|z}{zzzzz{~|{{|}}|}|~}{yxz|||{~}~~|}~~}|}}~}zy{~~}|||~~}~~~{}}}||~~}~}{~{zz{}||~}}}zyy{||||z~~zz{}|~~~}ywxz{zz}|~}||~~}|~|yxy{}}|~}~|}~~|||}~}~|zz||}|~}~zz{}~~~}{~}{{||{z{~|~}{|~~~|}~}~|zyz{|||~~~~~}}~~~}~~|zz|~~~~~~}}}~}~}{}}|}~~~~~|~||||}}|~}~~|{z{||~~z~{{{|~}~~~~~~{zyz{{{~}}}|}~~}}~{yy{|}}~}}}}~|~{~~~|{{|}}}~~{{|}~}~||~~}|||||{||}|}~~~}}}}~}zzz||}}~~~~~}~~}~~~|{{|}~~~~~~~}~~}{}}|}~~~~~~}}}}~}}~|~}|||||}~||||}~~~~}{{{{{|}|~}}~}~~}}{zz|}}~~}}~~||~}|||}}}~|||~~}}|}}~}||}}}|~|~}}~}~}}~~~~}{z{||}~}~~~}~~~~}~~|{|}}~~~~}~~~|}~}}~~~~}}}~~}~}}~}||||}|}|}}~~~}~~~}|{||||~|~~~~~~~~~~~~|{{{|}~}~}~~}~~}~|||}}~}~}|}~~}~}}~}~||}}}}~|~~}}~~~}}~~~~~|{{||}~}~~~~}~~~}~~}|||}~~~~~~~}}~~}}}~~~~}}~~~}~~}}}}}}}~}}}~~~~~~~~~|||||}~}~~~~}~~~~~~||{||}~}~~~~}~~~}|}}~~}~}}~~~~}}~}}|}}~~}~~}~~~}~~}~}||||}~}~~~~~~}~~~~}||}}~~~}~~~~~}}~}}}~~~~}~~~~~}~~~}}}}~}}}~~~~~~~~~~}||}}}~~}~~~~~~~~~~~~||||}~}~~~~}}}}}}}~~~~~~~~~}~~}}}}}~}~~~~~~}~~~~~}||}}~~~~~~~}~~~~}}}}~~~~~~~~~}~}}~~~~~~~~~~}~~~}}~~}~~~~~}~~~~~}}}}}~}~~~~~~~~~~~~}}}}}~~~~~~~~}~~}}}~~~~~~~}~}~}}}~}~~~~~~~~}~~}}}}~}~~~~~~~~~}}}}}~~~~~~~~~}~~}}~~~~~~~~~}~~~~~~~}~~~~~~~~~}}}}~}~~~~~~~~~~}}}}~}~~~~~~~~}}}~~~~~~~}~~}~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m39.bin b/applications/SprPoP/dist/MUS/m39.bin deleted file mode 100644 index e18ccb9..0000000 --- a/applications/SprPoP/dist/MUS/m39.bin +++ /dev/null @@ -1 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||||||||||||||||||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{|||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{{||||||||}}}}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{|||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}|||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||||||{{{{{{{{{{{{{{{{{{{||||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||||{{{{{{{{{{{{{{{{{{||||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||||||{{{{{{{{{{{{{{{|||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~}}}}}}}}|||||||||||||||||||||||||||{{{{{{{{{{{{{|||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~}}}}}}}}||||||||||||||||||||||||||||{{{{{{{{{{{{|||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~}}}}}}|||||||||||||||}}}}}}}}}}||||||||{{{{{{{{{{||||||||}}}}}}}}}}}||||||||||||||}}}}}}~~~~~~~}}}}}||||||||||||||}}}}}}}}}}}}||||||||{{{{{{{{{|||||||}}}}}}}}}}}}}}||||||||||||}}}}}}~~~~~~~}}}}}}|||||||||||||}}}}}}}}}}}}||||||||{{{{{{{{{||||||||}}}}}}}}}}}}}||||||||||||||||}}}}~~~~~}}}}||||||||||||||||}}}}}}}}}}}}}}}}|||||||{{{{{||||||}}}}}}}}}}}}}}}}}|||||||||||||||}}}}~~~~~~}}}}||||||||||||||||}}}}}}}}}}}}}}}}||||||{{{{{{||||||}}}}}}}}}}}}}}}}}|||||||||||||||}}}}~~~~~}}}||||||||||||||||||}}}}}}~~~~~~~~}}}}}||||{{{{{||||}}}}}~~~~~~~~~}}}}}|||||||||||||||||}}}}~~~~~}}}|||||||||||||||||}}}}}}~~~~~~~~}}}}}|||||{{{|||||}}}}~~~~~~~~~~}}}}}|||||||||||||||||}}}~~~~~}}}|||||||||||||||||}}}}}}~~~~~~~~~}}}}||||||{{{|||||}}}}~~~~~~~~~}}}}}}||||||||||||||||||}}}~~~}}|||||||||||||||||||}}}}~~~~~~~~~}}}||||||||||}}}~~~~~~~~~~}}}}||||||||||||||||||}}}~~~~}}}||||||||||||||||||}}}}~~~~~~~~~}}}||||||||||}}}~~~~~~~~~~}}}}||||||||||||||||||}}}~~~}}||||||||||||||||||||}}}~~~~~~}}|||||||||}}~~~~~}}}|||||||||||||||||||}}~~~~}}|||||||||||||||||||}}}~~~~~}}}||||||||}}~~~~~~}}}|||||||||||||||||||}}~~}}}|||||||||||||||||||}}}~~~~~}}|||||||||}}~~~~}}}}||||||||||||||||||}}}~~~}}||||||||||||||||||||}}~~~~}}|||||||}}~~~}}}|||||||||||||||||||}}~~~}}||||||||||||||||||||}}~~~}}|||||||}}~~~~}}}|||||||||||||||||||}}~~~}}||||||||||||||||||||}}~~~}}|||||}}~~}}|||||||||||||||||||||}~~~~~~~~~~~~~~~~~~~~}}||||||||||||||||||||}}~~~~}}|||||}}~~~}}||||||||||||||||||||}}~~~~~~~~~~~~~~~~~~~}|||||||||||||||||||||}}~~}}|||||}}~~}}|||||||||||||||||||||}~~~~~~~~~~~}}}}}}}}~~~~}|||||||}}}}}}||||||||}}~~~}|||||}~~}}||||||||}}}}}}|||||||}~~~}}}}}}}}~~~~}}}}}}}}~~~~}|||||||}}}}}}||||||||}}~~}|||||}~~~}||||||||}}}}}}|||||||}~~~~~}}}}}}}~~~~}}}}}}}}~~~}|||||||}}}}}}}|||||||}}~~}}||||}}~~}}||||||}}}~~~}}}}|||||}~~~}}}||||}}}~~~}}}|||||}}}~~~}}|||||}}}~~~~}}}||||||}~~~}}||||}~~}||||||}}}}~~~}}}}|||||}~~}}}}||||}}}~~}}}|||||}}}~~~}||||||}}}~~~}}}}||||||}~~~}}||||}~~}}|||||}}}}~~~}}}}|||||}~~~}}}||||}}}~~~}}}|||||}}}}~~}|||||}}~~~~~~~}}|||||}}~~}||||}~~}}|||||}}~~~~~~~~}}||||}~~~}}||||||||}}~~}}|||||||||}}~~}|||||}}~~~~~~~}}|||||}~~~}||||}~~}}||||}}}~~~~~~~~}}||||}~~}}}||||||||}}~~}}|||||||||}}~~}||||}}~~~~~~~~}}|||||}~~}}|||}~~}|||||}~~~}}||||}~~}}|||||||||||}~~}|||||||||||}}~~}||||}}~~~}}||||}~~}|||}~~}|||||}~~~~}||||}~~~}|||||||||||}~~}}||||||||||}}~~}||||}}~~~}}||||}~~}|||}~~}|||||}~~~}}||||}~~}}|||||||||||}~~}}||||||||||}}~~}|||}}~~~}||||}~~}|||}~~}||||}}~~~}|||}~~}}||||||||||||}~~}||||||||||||}~~}||||}~~}||||}}~~}|||}~}||||}~~~}||||}~}||||||||||||}}~}|||||||||||||}~~}|||}}~~~}||||}~~}|||}~~}||||}}~~~}||||}~~~~~}}|||||||||||||}~~}|||||||||||||}~~~~~~}|||}~~}||||}~}|||}~~}||||}~~~}}|||}~~~~~}}|||||||||||||}~~}|||||||||||||}~~~~~~}|||}~~}}|||}~~}||}~}}|||}}~~~}|||}~~~~~~}}|||||||||||||}~~}|||||||||||||}~~~~~~}|||}~~}}|||}~~}||}~}||||}~~}|||}~~}}~~~~}||||||||||||||}~~}||||||||||||||}}~~~}~~~~|||}}~}}|||}~}|||}~}|||}}~~}}||}~~~~}~~~~}}||||||||||||||}~}||||||||||||||}~~~~~~~~~}|||}~~}|||}~~|||}~~}||||}~~}|||}~~~}~~~~}||||||}}}}||||}~}|||||}}}}}|||||}~~~}}}}}}~~}||}~~}|||}~~|||}~}|||}~~}|||~~~}}}}}~~~}|||||}}}}}}||||}~}|||||}}}}}|||||}~~~}}}}}}~~}||}~~}|||}~~}||}}|||}}~}|||}~~}}}}}}~}|||||}}}}}}||||}~~}||||}}}}}}||||}~~}}}}}}~~}|||}~}}|||}~}||}~~}|||}~~}||}~~}}}}|}}}~~}||||}}}}}}}||||}~~}||||}}}}}}}||||}~~}}}}}}}~~~}||}~~}|||}~~}||}~|||}~~}||}~~}}}}}}}}~~}||||}}}}}}}||||}~~}||||}}}}}}}||||}~~}}}}}}}~~~}||}~~}|||}~~}||}~~|||}}~}||}~~}}}}|}}}~~}||||}}}}}}}||||}~~}||||}}}~~~}}||||}~~}}||||}}~~}||}~~}|||}}||}~~}|||~~}|||~~}}|||||}}~~}|||}}}~~~~}}|||}~~}|||}}~~~~~}}||||}~~}}||||}}~~}||}~~}|||~}||}~~}||}~~}||}~~}}||||}}~~}||||}}~~~~~}}|||}~~||||}}~~~~}}||||}~~}}|||||}}~~|||}~}|||}~~|||~}|||}~}||}~}|||||||}~~}|||}}~~~~~~}}|||}~}|||}~~~~~~}||||}~}}||||||}}~~}||}~}||}~}||}}|||}~~}||}~}|||||||}}~~}|||}}~~~~~~}}|||}~}|||}~~~~~~}}|||}~~}}|||||||}~~}||}~}|||~}||~}|||}~}||}~~}||{{{|||}~~}}}}~~~~~~}||{z{|}~}||}~~}}}~~}|{zzzzz{{|}~~~~}{zzz{}~}~~~}}~~~}}~}{z{|~}|{zzz{{||}}~}}}~~~~}}|{zyyyz{}~}}}~~}~~~}{zyyyyyzz{|}~~|zyyyz|~~}~~}}|}}~~~~}{zz{|~~}{{{{{||}}~~}}}}}}}}}|{zzyyyz|~~~~~}}}~}|zyyyyyzz{|}~~}{zyyy{}}}}~~}}}}}~~~~|zyy{}~}|{{{||}}~~}||||}}}}||{{zyyz{}~~~}|||~~}{zzyyzz{{||}~}{zyyz|~~|||~~~}||}}~}{zyyz}~}||||}}~~~~}|{{|||}}||{{zzyz{}~||{|}~~}|{zzzz{{||}~~}|zzyz|~~|{{}~~}}}}~}{zyyz|~}}}}}~~~~|{{{{|||||||{{zzz|~~}|{{{|}~}|{zzz{{||}~~~~~}|{zz{}}{z{}~~~}}}}~}{yyy{}~~}}}~~~|{zzz{|||}}}||{{{{}}|{zz{|}~}|{{{{||}}~~~}~~}|{{{|~~{zz{}~~}}~~~|zyyz|~~~~~|{zzz{{||}}}}}||{|}~}|{zzz{}~~}|||||}}~~~~}}~~}|{{|~~{zyz|~~~~~~|{zyz|~~~~|{zyz{{|}}~~~}}|||}~}|zzyz{}~~}||||}}~~~}||}~~}||}}{yyz|~~~~~~}{zz{}~~}{zyyz{||}~~~~~~}}}~~~~|{zyyz{}~}}}}~~~~}{{|~~}}}~}{yyz|~~~}|{z{}~~~~~~|zyyz{|}~~~~~~~~~~~}|{zyyy{}~~~~~~~}{{{}~~}~~|zyz|~~}~}|{{}~~~~}}~~|{yyyz|}~~~~}~~~~}|{zyyz|~~~~~~}{zz|}~~~~}{yy{}~}}}~}|{|~~~~~~}}}}}~~|zyyz{|}~~~}}}~~~~~~}|{zyz{|~~~~~~~}{zz|}~~~~~~}{zz{}~|||}~~}|}~~~~~}}||||}~~|{zzz{|}~~}||}}~~~~}|{{zz{|~~~~~~~~~}{zz{}~~}}}}~~|zz{}}|{{}~~}}~~~~}}|{{{{|~~}{zzz{}~~|{{|}~~~~}}|{zz{|~~~~~~~~~}{zz{}~~}||}}~~|{z{}~|zz{}~~~~~~~}}|{zz{{}~~}{zz{|~~|{z{|}~~~~~~}}|{zz|~~~~~~~~~}}}~~|zyz|~~~}|||}}~~{z{}|zz{|~~~~~~}}|{zzzz{|}~|zz{}~~|zz{|}~~~~~}{{{|~~~~~~~~}|||}|zyz|~~~~}||||||}~|{{}~|zzz|}~~~~~}||{zzzzz{{}~~|{{|~~~~~|zz{|}}~~}|{|}~~~~~~~}|{z{}~|zz{|~~}~~}||||||~~||}~|{zz{}~~~}|{zzzzzzzz{}}|{|~~~~}{zz{||}~}}}}}~~~}~~~~}{zzz{}}{z{|~~~~~}}||{|}~~}~~|{zz{}~}|zzzzz{zzzz{}~}}}~~~~~|{zz{|~~~~~~~~~~~~~~}{zzzz{}~~|zz{}~~~}|{||}~~~|zy{}~~}{zzz{{{zzyz|}~~~~~}}~~|zzz|~~~~~~}}{{zzzz{|}~}{zz|~~~~}|||}}}~~~~~}zz{|~}}~}{zzz{{{zzz{{|}~~~~~~|{|~~{zz{}~~~~}~~}|{zzzz{{{{}|zz{~~}||}~}}}}}}}~~}~~}}~~|{{{|}~~}}|{zz{{{zzz{{{{|~~}}~|zz{}}{z{||}}~}}~}{zzzzz{{{z{}}{{}~{z{|~~~~}||}~~}~}||}~}|{{{|~~~~~}{{{{zzz{{{{z{|~}}~|zzz{~}||{{{|}~~}}}{zzzz{{{zzz|~}}}~~{zz{}~}||}~}~}||}~~|zz{|~~~~}||{zzz{{{zzz{~~}~~~|{zz{}}{zz{}~~~~~~}{zzz{{|{zz{}~~~~{zzz}~}||}~~~~|||}~|zzz|~~~~|zzz||{zzzz|~}}~}|{zz|}~}zzz{}~}|~|{zz{{{{zz{|||}~~~}|zz{}~}}|}~|}~}||}~~|zz{~}{|~}{z{||{zzzz{~}|}~}}|{{|||}|zzz|~}|}~}{{{|{zzz||{{{}}}}~}|{{||}~~}~||~~}}~~~}|{{~}zz|~~||||{zzzzz|~}|}~~~}}}}|{z{~~|z{}}|}~~}|||{zz{||{zz{}~||~}}}|{{}~~}}~~~~}~}}~~~{zz{~~}}}{zzzz{}~~}}~~~~~~~}|zz|~||}~~}}~~~~}{zz|||{zzz{~}|}}{z{~~~~}~~}{zz{~~|zzzzz|~~~~~~}}}}~~}{z{}~~~~~~~~}{z{||{zyzz|~~~}~}zz|~~}}~~}~~|{z{}|{zzz|~~~~~}}~~}{|}}~}{{|}||~~~}}~~||}}{||}|zzzyz|}|}~{{|}}}~~||~}~~||~~}||}}}~|{zz|~~~~}||}~{z{||~~|}~}{z{}}||}~{z{}}}~}|zyzyz}~{{}}}}}{{|~~{z{}~~~~|{}~~~}|{}~|{{}~~~~}{{}~zzz{|~}}~}{zz{}}{{}~}zzz{}}{zzzz{~~~||}}{z{|~~{zz|~~}~~||}~}{z|}|~~~~}|{|~~~}zzzz|~~}}zzzz}}||~~}~|zzzz}}{zzz{}~~~~~~~~~|zzz{~}{zz{~~}}~~}~~}|}|z{}~~}|{|~}}~|{zz{}~~}}~{zzy{~}~~||}|{zzz|~|{zz{~~~~~}|}~~~~{zzz}~|zz}~~~~|{|~~||}}}~}{{|~~|{}~}{z{}~}|}~|{{z{~}{{|||{zz|}~~~}|{z|~~~~~|{}~~||~~}{zz}}||}~~~~~}|{{~~~~|{{~|{{}~|{{}~||}}}{{~}||{{}~~}{{}~}}|{{}}}|}~||~~~~}{{}}zz|}~}{|~~~~~}||~}||~|zz|}}{|~~|{{}~~~~|zz}~}}}||~~~~|{}~}}}|||}}|z|~~~~~|{{|}~zzz{}}~~~~{z|~}~~~{zz{|~||~~|{{|~~{z|~~~||}|}~~~~}~}}~~~}|}}|}~~}zz}}{{|~~||}~{zzz}~~~}}~zz}~~~}~~|{zz}~~}{z{}~~}~{{}~}|{|||~~|{}~~~}{|}|}~|z{}~~~~|{{}~}{{}}{zz}}||}~||}~~~~~|{|~~}|{z}}{{|~~~~}|~|}~}|{{|||~{z|~~{z{||}|{|}}}|}|{{}~|{{}~{{}~~}~~{z|~~~}|{}~zz{|}~||~~~}|{}~~~~~{{}}~}{zz{{}}{z|}zz{{|~~||~~}{z|}~||}~}{z{}~~~}|{~}{{|~}zz|}}zzz{}}~~~~}}~~~{z{||}zzzz{|{{}~}}|zzzz|||~~{zz{|~}}~{z{}|z{}{|~}|}|zz{||{zz{~~~~}~~~~~~{z{{{}{zzzz~}||~~{{|~{{zz|~~|}~|zzzz||{{}~~~}~~z{~~}~}{{}~|{zz~~}{z{}}{|~{z{zz}}|{z{~~~||}}{z|~|zz|~~}{}~|zzzz}|{|~~~~}|}~{|~~}}~|z{}}|z{~~|{|}~}||z{~|zz{z{~~~~}|z}~~~}|}|zz|~{|}~}{{~~{{{zz}~||}~~~{{|}~~~}{{}~|{{}~||~~~}~~}{{~}{{}|z{zz{}~~}}}|~~}~~||}}{{|~~~~~~|z{~}||{z{~~~~}~}zz{|}~{z{|}~||}~~~~~~~{z|||}~}}~~|{{z{}~~||~~~}{{|}|{}~~~}zz}~~}{||{{~~}~~~{z{{{~}zzz{}~}~~~~~~~~~}z{}~~~~~}{{~~}|{{}~~|z|~|{{}~||}~~~~}|~}z{}~}{{||{}~~~~|}~|zz{z{~~{{zz}~~~||~}||~~{|}}}|}~}zz}~}||}~}{z}~~{z{~}||~~~~{z|~~|}~}|z{{{{~~~~}{{}|z{{z{~~~~|zz}~{z|}~~{z|}~~}{z{}}}{{}~}~~~}z{}~~}}~~|{|~~|{|~}zz{|~~~}{zz{{}~|{{}|{{zz|~~}|~~||~~}zz{|}~{{}}zz{{}}||~~~{z|~~}{|}~~||~~|{|}~{zzz{~|zzzz{}{{|~~~~||{{|~~}{|~~~{zzz{~~|}~}}~~{zzz{~~~~~|{}~~}{{|}~~}~|z{}~{zzzz|~{zzz{~~|{|~~||~~}|{}~~}{|~~~}}~|{zzz}|{|}{zzz~~~~|}}|~~~|z{{|~|z{}~{zzzz|~|{zz|~}||}~}{{~~}}~~~{z|~~~}{{}}|{z{}~~~|z{~}|{z{~~|z|}}~}{z{{{~~|{|~~~|{{{z{|}}|~~|{{}~~~}|}~~|{{}~~}{{}~~}}~}{{}~}|{|}}||~}{|~~|{}~~{yz{}}{{{{{}|}~~~~{{{{z{}}|{|}|~~~~}||}~|{{}~{|}~~|{|}~|{|~~~}}}~}{z|}}~~~}~~~~~}zzzz}|{{{{~~~~~~{z{{{|}}|zz}~~~~}||}}{{}~~||~~~|{{||}}~~||~~~~|zz}~~~~~~}|}|{zzz}~}|{{}~~|zzzz{}}}{y{}~|{|~~|{|~~~~}}~}{{{{|}{{}|z{}~~}~~~||~}|{}}|{zz|~~~}||~~~~{zzzz{}~}{z{}}}}~~|{|~}||}~~~~~||}~~}{{{{|}{{}}{|}}|{|~}{z|}~{{|~~|{|}}}|~~}}~}~~{zzzz|}~|z{|}|{{|~~|{|~~|||~~~}z{|}}{{{{}~||}}}~}|{z{}~}zz{|~~||}~}~~}}}}|{{~~}}~}{zzz{}}}{z|}}{zz{}~||~~|{|}~}{zz{|~||{{|~}~~~~~~~}{zz{|{zzz{~}}}~}|}~~~}{z|~}|}|{zz{|}|{{|}}{zzz{}~~~|{|}}zyzz{}}}|{}~~~|}~~{zzz{~}{zzz}~|{|~~{z|}~~}}~~}{{{||{z{}}}{zzzz}~|{|~|zzzz{}~~}}~~}{{|}~~|zzy{~~}{z{}~~~|{|~}{{|}||}~}}~~~||}}|zz|}}|zzzyz}~||}~~~{zzzz{}~~}~~~~}zz{|}~|{{z{~~}||}|||}||~~~}}}}{z{}~~~~}}~~~}|zz|}}|zzzz{}}}}~~~~}{zzzz{|}|{}~}}~{yzz|~~}|{|~~~~~|{z|}}~~~~}~~~~~|zzz|~~}}}{z{}}{zzzz{}~~~~~}{zzzz{|||z{~}}~}{zzz|~~~}|}~~~~~~|zz}~~~}||}~~|zzz{~~}~}{{|}|zzzzz|~~~~~~~~~|zzzz{|}|zz{~~}~~|{zz|}~}}~~~~~~}}|z{|}}}~~~|{{|}~|{zzz}~}~~|}}}{zzzz{}~~~~~}}~{zzzz{|}|zz{}~~}~~~~~~|{{|}|||~}||~~||}||{|~}{zz{|~}|{z{}~~~~~~}{zyzz{~~~~}||~~{zzzz{||{zz|}|||}~~~~~}}}|{z|}||~~~~}|zz{}|zzzz|~~~}|{{}~~~}}~}{zzz{}~~~}||}}zzzz{|||zz{||{{{|~~}~~}{zz}~~~~~||}~~~}{zz{|~{zzz{}~~~~~}}|~~~}||}~~|{zz{}~~~~}|||~~~~|{zz{||{zz|||{zz{|~~|zz|}}}}~~}}}~}}}|zzz{~|{zzz|}}|}~~}~~~~}}|||}}|{z{}~~~~}||}~~}}}|{{{||{z{|||zzzz{~~}{{|||||}~~~~|||}{zz{~}|{{{|||{}~~~~||~~||||}~}{{}~~~~~||}~~}|}~}||||{zz{||{zzzz|~}~~}}}|{{{|}~~|{|~~|{z{}~~}|||{zy{}~~}}}}~}}~~{{zz{}~~~~}|}~}|z{|~~~~~}{|}~~}|{{{|~~|yxxyy|~~~~}||}~}|{{{{zyy{}~||}~}}~~|||}~~}|zyyz{|{z{|~~{z{{{yxwwwxz||~}}}}~~}~}|zxxyz}~}}}}}}}{{|}~~}}~~~~~~|zz{|||}~}~~~}}~~~~}|}~|zxxyzyyyyz{}~|zyzz|~~}}}~|{{{||}}||~~|{zzz}|zzzzyxxyz{~~}|{||{zz{}~|{|||||{zz{}~}~~}}}|}~}||~}~~|zyyz||}~~}~~~~~~~~~~~~|zyz{{zz{|~}{{|~~~}}~~~{zz{{zyz{|}~~}}}}{yxxxy{{{{{{{|~~~~~~}~~}{zz{}~~{yxxy{}~~~}~}||}~~}}~}|zz{}~~~}}}}~}}~~}~~||}~}}}{yxwxxz}~~|{zz{||||}~~~~~}|zxxyz|~}{zz|||}~|yxwwx{}~~{z{|||{|}~~}~~~}}{ywwxy{}~}}}~~}|}~~}}~~~~~~}|{zz{}}}|}}~~~~}~~}{zyyy{~~~}}||{{|}~~~}{zzz{|||{zyz{}~|{z{||||{zyz{}}}~~}}~~~~~~~}}}}{yxxyz{{z|~}|}~~~~~}}~}||}}}}}||}~}}|}}}~~}|||}~~~~~}{zyz{}}~~~}~~}}}|{z{|~~~~}zyxxyz{||}|zyz|~}{zyz{|||}}}~~}}~~~~}|{zz{}~|zxxwwxyzzz|~~~~|{{}~}{z{||{|}~~}~~~~}}~}||{{|~~}zxxxy{}~}}|||zyxxxy{|}}}~}|{zzz{{{z{|~}|||}~}~~}|{{zyxxz{|}}~~~~}||}}~~~~~~~}{yxyz{~~~||||}}~}|{|~~~~~~}}||}~~}||}}||||}~~~}|{zzz{{zyyz}~~}}||||{{|~~}|{zz{}~~~~}||}~~}|{|}}{zyyyyyyxwy{|}}~}}}}}}}}|{|}~~|zzz|}~~}}~~}|}~~~}~~~~}~~~~~~}~~{zyxyyzzz|~|yxwxxyzzzz{}~|||||zzz{||}}}|}~}||~~}~~|zyzzyxxyz||yyyz{}~~~~}}~~|{zyyyz{||}~}|||}~~}|{|}}||{|}~}}}~}}~~}}~}|{{|}}{{{{{|||{zzz{{z{|}~~{yxxyz}}|{||{{{|~~~~~~~}||~~}||{{zyxxyyyyyyz|~~~~}{yxyyz|~~}}|||{zzz{}~~~|{{|}~|||}~~~~~~~}|{zyxxyz|}~~~|zyyyzzyxy{|}|||}}|{{{||||zyxy{}}|}~~}}{zyxxxy|~~|zyyz{{{|~~~~~~~~}|{z{{||{yyz|~~~~~~~~}||}}}||{{{{}~||}~}||||}~}}~~|zyyz{||{z{|||zyyz{}}{zzyyzzz|}{z{|}}}}||}~}||}}}}}}~~|zxyzzyxwwy{}~~{yxxxz{{z{}~{yxxyyz|}}~~~}||}~~~}||}~~~~}zyyzzyxxz|~~~~}|zzyyzzyz{||}~~~~}|zyyxxxy{|}}~~}|{{}~~}~~{zyyz|||}~~~}{yxxz|||}~}{yyz{{{|||{zz{{{{|}~}}}~~|{{{|~~~~~|{{{|}}||}~~~}||{zzzzz{||||{{zz{~~}}}|yxxz|~~}|||{yyy{}~~~}|{{|}~~}{zxxxyyz|}~~}}~||{zyyyyyyz{|}~~~~|zyyzzyxy{~~}~~~}|}}||}~~|{|}}}~~}|{zyyyxy|}||||zyxxz|}{yxxyzzyxxz}~~~}|{|}}~~~}||}~~~|{{|~}{zyyyzzz}~|yxxy{||zz|}}{zyy{}~}}~|||||}~||}~||||||||||{|}~~~~}}~{xxyz{|{z{|~~~~~~}}}|{yxy{}~{yyyxyyz|}~~~~}||~}zyxy|}}||}}|}~}||}}}{ywxy{{zyz|}~|{zyyyyz{}~~~}|~~}{z{}~}{z{}}||}~{zzz{}}|}~~~~}||{zz|}~~~||{zzz{zxxyz{}}}~~~|{|}}{{|~~~}}}||}}}|}~{yxxz{|~~}|{yyyyz{{{|||{zz|~~~}~~}}~}~~}}|}~~}|}~~}{z|}}{{|}~~}zyxxyz{|~~}|~~~}{yxy}~}zz{{zyxxz~~}}}}}~~}}}}}}}~}{{}~~|||~}|{yyyyyzyy{~}||}{yxxy|~}}}~}~~~~}}~~~|{{|{{}~~~~|{|}~~|{|~~~~~}~~}}~~~~~~~{yz{{zyxxz}~~}~|{||{|~}}~}{{}~}}}}~~|{{|~~}|~}zxxyz{{zz{}}~~~~~}}~~~~}}{{|~~~~}|{||{z{~~~zxxy{~~~~~~~~~~}}~}}}}~~~}||{zyyyy{}}~~}||~~}}~~}|}~~||}}||}}~~~|yxxx{}}}~~~}}}{yyz|~~}{zz{}~}~~~~~~}{{|}{zz|~~~~~~~}|~~}|}~~}|~~}~~~}{{|{yxxz}}}~||~~~~~}~~}}~~{yyy{~~~|{}~|yyxxz{z{~}}}~}}~}~~~~||||}}||~~~}{z|~}}~~}~~||||~~}|}}}}|z{|||}~}~~~||}}{xxxy}}|}}~~}~~~~{|~~|{z{~~{yz{|~}|}~~~}|||~{xxxy|~}|~~~~}~|{|{z{~~}}~~{|~~}|}}~~}~~~}{{}~~{{}|||||~~~~}|~}}}~~{{{zxxyz}~~}{}~~}zyxy|~~}~~}~~~}~|~~~}~{zyxz|||~}}}~}}~~~~}||~~|}~}~~~|zy{}|{{}~~~~~~~~~}~}zxyz|~}~||{{}~~~~|zyz{~~||{{|}|{}~}~~}~}{z{~~~{zzz{|}|}~|}}}{y{}{z{}~~~}|~}~|{{}}~}~~}~~~~|{}~}{zzy|~~~~~|||}~~|}~|}~~|zzy{~}|}~}~}yxyyz{{yy|~~}}}~~}~~}{|~~{{{|~|{}~}}|}|}~|{}~}}~~|||~~|}~~||}|z{}~~~}{|}~}z|}|zzyy{}}~~~}{{{}~~}}~}~}{|{|~~~}~~~~{zz{~~|~}{{|~~~}|~{yxxz|{yy|}}}~}}}~}~~}|}~|zz}~~|~~}{{{|~}~~~}}~{z|~~{{|}|{||~|~~}|}~}~}|~}|~}zxxxy{|||||~||}~}}~{{zz|}||~~~||~||}~}}|~~~~{{zz{|{z|}}{|}~}~}~~}|~~~~|||~~{y{|zxxz{|~~}||~}|~~}~}{{z|~~}{{z{|}||}}}}}}}zyyz}}}}{z|}~}}~}}}}}}}}~~~|yxwwxyxw{~~|{||~~~}}|}~~~|}~~|}~|zzy{~~}}~|{}|zz{||||z|~~~}~~}|~{|||~}z{||ywvuxz{~~~~}~~}{{{|~~}~}|||~~|~~}|}}zy{}~~||}~~zyyyz{zwy|}}}~|||}~~~}}~~|{||}~~}{yyzxvw{}~~}~~~||~~|{}}||}}~}~}}~zyxy{|zy{}~}~~}~}{yyxx{{{|{|~}{||~~~|||{|~}}|xvvuxz{z{~~}~zzyy|~}{}~||~~~~}|}}|~~{xxxx{||}|||z{}zxxz{|~}|~~}|~}~}~}~~{{{z{}|yz{zwvvwy}}~}}}~}zxyy|~~~}}~~||{|}zz|{yxy{|}~}~|yywwyzyx|~~}}~|{|||~~||}}}~|{}~|zzyz}}}|yxx{{yz|~~~}~}z{|{yz|~~~}~}~}|~~}zxxwwyyxy}||}|zwwvx{}~~}~|}~~|{{z|}}~|{|}zz{||{zxwxxz||zz}|yxxxz{zy{}z{{|~~|z||{xwvvy{|~~~|yy{zxy|~~~|}~}|}|{|~}|}~~zxyxz{zxxz{zyyyz}~~~~}}}|ywwwy||~}~~|z{{{~~~~|zyzzwwy|~~~~zwwwx{||z}~~}~|zzy{||zz}~~}||}|yxxxy{{|{zz|~|{{}~~}{z{zxwz}~|{|}{{}~}}zwwvwy{zz}~|{|{yxxy{~~}}|}~}zyyy{}}~~}~|zz{zxxz||}|zzzz{|{z}~zwvvwy{z{}zzzz||{yy{zwvwwz}~~~~|zz}}{|~~}~~|{|}{yz|}~~~~|xwwvxzyxz}}{zzz|~}|}|ywvvx|~~{|}}{zzy{}||{yxz|zz{}~}}~~}zzz{|~}{|~~~|yyxxz{yz}|{|{xvvvx{}~~}|}}{|~}zyz{yy{~~~~}||}|zz{|{{ywxxy{|{z|~~~~|{}~}{{{|~~||}|yxwwy|}|yxzzxy{}~|{zz|}}|}~{xxxx{||{~{yyxyzzwwy{zyyyz}~~~~~~}~~}~}}~~}{y{{yy{~~}zwvvwz{{z|~~|zz{}}{{|{yyyy|~~||}}{yxwwz{{|{z{~~||}~~}~~~}}||}}|{~~}ywwwy{|{|{zzzxwwxz}}|}~}~~}}~~~~~||}~|{|~~~}~|z{{ywy{|}}{z{{|}|zz}~}}}~~}|{|}zz{zxwxy|}{zz|}{{}~{{{|~~~~||}~~}~~{zz{|}|z|~{wvvvxzyy{}||{{z|~~~}}~}}}|zy{}}{|}~~~}zyyy{}}{{|}|{|}~}~}}~}|}~}|}~|{|{|~~~~}{|{ywvvw{}}~}}~|{}~~~|||~~~~~~~}}|zyzz{}}}~~}{|}}{yz{}~~~}}}{{z{~~}|||~}{|~~~}zxyzzyz|~~~|{zz|}||~~}||~~~{yz||{zz{~}~}}}|}~~~}~~~{|}}zyz{~~~~}{{||{{~|zwvwxz|{z|~|zzz|}}~}|}}~~~~}~~~~}}~~~~~|||{||{z{~~~~~|{|~~~}{{|~~~{z{}}yyzyxxyy{}}|}}}}|}~~~}||{}~~}{{|~~|{~~}}}~~}{z{}~~}~}zxy{|~}{|}}||}}|}~~~}|zz{~}{{~|zz{|~~||}}~~~|}~}}~~~}~~}}}}}}}}|{|~~~||}}{zzzzz{{}~~}|~}|||}}~}}~}~}}}{zzyz}~|{|||{{}~}}}}~}~~~~|zz{~~}}}~|}|{z{|}}~}{{|~|{{|}~}||}~~}}~~||}~}|}|zz|~}zyz}~~}|}}{{zz|~}}~}|}~|zy{}~}{|}}|~}}~|{{|~}}|||}}{zzzzzzyz}~}{|}|}~}{|}~~}~~}}~~~|}~~|z|}|yxy|}{|}}~~~|{|}}}~~|zz{|{yxz||{zywx{|}~~|||}|{zz~~}}}{}}}|{zz{~~~~~~~|z{}~~}}}~|z{||~}z|~~~~~}}~~}|}~}}}{{{yy{}~}|||zyy{}~~~}}}}}}~~||{|~~~~~}{z|~~}}~~{xxz|}~}~~}~~}zz|}}|||~~~~~~}||~~|}~~~~||~~{z{~~~{xvvwxz{|~~~zxx{~~~~}{{|~||}~~}||||zyyyz{{|~~~~~~}{|~~~}~~~}~~}~}}{ywxz}|z{|ywvvvz~~|z{|zyxz|~~~~|z{|||}~|zz|~|{z|~~}}}~~}~|{{zz{zy{}}}{{}~}}~|yz}|xwxz}~~~|yxzzyz}~}~}zy{~~~||~}{{{}~}}}|{{||zzz{{zzz|}|||}~}|{xxz|}~||~~|zz|~~~~|yz}~}|~~|zxvvvy|}{{~~~}{zzz{{}~|z{|}}~}{yz{|zxwz||zzyxz}}~||~}||{z|~}~~}}}~}|~|zwxzz{|{xvxxwvxz|~~~}{xy{}|{{||~~}||~~~}|zyzzxy{|~|{{|zxxz{~~~~zyyz{}~|z{}~~~~}}~}{z{{wuvwxxxxz{yyyxwz~~|{~|~}~~{z{}{xwy||{zxustuvvx{~~}~}}~~~|{zz|~}|}~~~}~|yxz|zxwxyzzzywwyyxxxyzyz}~~~~~{{}~}~~|{zyvtuxyxvxxurrrsw{}~||~}~}~~~~~~}~~}|zxwxyzwvvvuuuttwzzyxy}~{{|}~zxy{yvtux{{{{yuuvvuwz|}|}~}}}~{{}~~~|||}~|zz{ywuuvxwwvtsuwxy{|{{|~~~~~~~~}~}}~|ywy{{zz{{xvtrrtwyywx}}|}|{|}|}~||~~}|~~~}||ywwy{{zxyxwvvvw{}}zwy|}}{z{}~{{{z}~|}~~zwuwxxxywttutssvxzz{~~}}|~}}~~{yy{|zzytrsstvwxyyy{||{{}}}|{z|}|||ywwwxyxwzzxxwvux{{yx{|z{|}~}~~~~~{z|||}}yxxz{ywwwtssrsw{}|z{~|{|~~~}||~}{zz{||{zwwxxvuvwwvwz{{{z{|{|~~}}~}{}~{{{{~~|}~zyy{||||yvvvwwxz|{{}}|zxy{{z||{}|{{||ywxxvuuttwxxwuw{~~|{|}~~}~||}}}~}~}||~~|||zwwtrsvxzxvy|}{xxyz|}}}}}~~}~~|yxy{{yyxuuxxxyz{{zz{|}|{||z{~~~~~{{}}|{{}~}{|}{{|yutvutuwxyy|}{{}|{}}||~}}}{|}|{|zxwwwx{|{xvxz{zwvxzz|~~~|}}}~}}~}{|~}~|z|}~}|{|{yyxvwy{{yx|~}zxxxy|~}}~}|{~~}~~|~~}zvtuuuvwxyxwyzzyyz{{{~}{{}~}~}|~~}}~zyzyxxxxwvwz{zxxyyxy|}}|~~~~~~~~~}{|~~|z{zwuutuy|}|zz}~}zxz{{}}}~~}}}}||~~~~~~~}}zyyxvvxzywvx{}}{{{z{~~~~}||}{z|~}~~}|}~zxyyxyz||{{|{zxvwxwwz}}}~}{|~~~|~~}}~~~|||~~{yyzz{|}|zy|}||{{|{yz|{|}}zxy|}{yz|~~|zxvuvxzzwwz|{ywwxy{~~~~}}~~~~~|{||}~}||}}|z{}~}zwxzzyxwwxy{|{{|}|||~}||}~~}}}|xxywvwxyzz|~~}{z{{y{~~}zyy{~}zz|~~~~}~{zzyz{|{zyy{zyxx{{{|~~|{{|~|yxy|~~}~~}~}}{yz|}|zz}~|ywwwx{|{{||yxy{|}}~~}~~|{|~~~|{zzz}~|}~~~{yz{{~}{{{yxxyyxxxy{|}~~~~}~}{zzzyxy{{zyxyxwx{}~}{z|~}{{}}{{||{}~~~~|}~~}~~~}zxwxxxz{|||{xwx{}{yyz}~~}||zyz||zxx{}~}{zzz|~~}~~{yxyyxxz|}~~{{{|~~~}~~~{{|~~|{}~}zxxxy|~~}|zz{{yyz{zz{||{{{|~~~~~|}~~~}|}~}}{{{zxz{{||{xwxyzxvwz~}~~~}z{||}~~||}|{}}ywwxywutwyzzz{z{~~~}}~|z{{{zxwwxy{|{{|}|{{|{zzz{}~{{{{}~}~~|}~~~~~}zyxy|}|{{{yxwxxwwy{|{{}}{{|}~}}}}~~~||}|{zz{|{|~~~|{{|}{wuvx{|||{{{|{{}}~~}}~~~|{{zy{|}}{z{}zwwy{|{zywvwyz|~}{{~~~}}~{z{{|~~|{{zyxxyywvvwyz{~}}~~~~~}{{|{{}~~}}|{zywuuvxxwxywuvwx|~}~}{{|~{yyyxxz{||{zxxz}}{yy{}}|||||}}|}~~~}}}}|zz|}}}}}}}}zxxzzwuuvy{{{zxwxzz{}~~}}zyyz|~~~}|{{||zzzzyxyyywwxz|~~~}|~~~~}}~}}~}}}}||}}{yyzzzzz{yvuttvy|~}}~}|}}}~~|{|}~~}|}~~{xwwyzxvvxzzyyxwxz||~~~~|zzz{}~~~}||~~|xvvxxxxwtstttux{~~}}~|{{}~}}}~~~}|{{}}{{{zxwwxyxyz|}||}|yxyz{~~|{{||~~~|{{z{}~}{zz{{yxxxxxxyzxwvvvx{|}}~}}~~||}~~}|}~~}{yz||yxy{}}|zyvuvvwx{~~||{|~~~|zz|~~|{{|}}|zxwwwvuvwxxy|}~~}|zyyzyz~~|{yxxvuvwxyyzzxvuvwz}~~~|{}~~~~~~~}||||{yxwutsssuwwwwx|~~}|z{{|~~~|yxxz|~~}{xwwyxvtuwz|}}|zyzzyz|~~}|}~}}}}||}~~~~|{{{zxxy{{zyxuuvwwxyzzz{}~{z|}||{{}~}|{{|zxxyzz{|}|zxwwwyzzyy|}}}}}~~~}}}||zy{}~~}{ywvvxyzywvwz{|{|~~}}~|yxxxy{{||~}|{|{xvuvwxxxwvwwwwxz|}|~~||}~}~~~|{|~~|yvuuuuuvwwwxyzz{}{zz{|{{{{zzyxy{}~~}{zyxvvvwwwxyzyyzz{}}|}~~~~}}~~}~|yyz{{{||zxvvvwy{{yy{}}|z{}}|{||}~~||||}}}}}}~}}~|zxxz{{zzxwxyyyz{{{z{||}}~~}~}||~~|}~~{yz}~~|{{{zzz{zyzzzyxwxyz}~}}|{{{zz{{{zyz}~~~|yyyyxwwwutttvy{||{|~~}}}~~~~|{|~~}~}{zxxxyyxvvxzzywwxz|~}||zxvvxy{|||{|~~zwvwxxxwvuuvwyz|~~}}~}}~}}~~}||}~~~|{{{yxyyyyz{{zz{|||{{{z{}}|{zyzzz|~~}~}}}~~||{{{z{{ywvvwy{|{{{}}{z{|~{z|}}|}}~~}}|}}}}~~|||{{|||~}{{|}|zxxxxz{|}}zyyzz|}}|{|}|{zz{|}~}}|{zxvtttttuwyz{|~~~}|}}{zz|~~}~~~~~~{z{||||||{z{zyxxxxxy{}~}zxwwvvx{|||}~~}}}}~}}|zxxwvtttuwy{{{|~~~}}}}~~~~~}ywwwx{}}|{{}~|{zz{}~~~}~{yxyz{|||}~}|}|}~~}~~|ywwxyxyzzzz{}~~}}~}}}}{{|~}{yxy{}~zyyz|~~|{zyy{|}}|zyy|}}~|zz|||{{|~~|zyyz}~|xvutuvxxwuvy|}}|}~|{||||}~~}~~|{{|}~~|z{}~}}~~|yxwxz|}}}~}||~~|{yyzyxxxz|~~~}}}}}}|wuttuvxyzzz{}~~}}~~~}}~}|{|}~|zyyz{|}~~~~}||}~}|||}||}~~~}}}}{{|}}||}~~~~}}}~~}zxwwz||{z{|||{z{|~}|}}~~}}}zyyyy{}~~}}~}}~~~~~}}|||||{yyxxyz}~~||}}|{z{}~}}||}}|{{}~|zxvwxxxyyyyxxy{|~~}{{{|~~}~}{{|~~{zz|~~}~}}~}}}|||||{{{{|}}{zz~~~~~~~~}{zzz{zyz{}~~~~~}|{{yxwwwxxy|~}|zz|~~|||~~||}}{{|~~}~~~~|yz}~~~~~~}}~~|zyy{}~~|yyz{}}}~}|{}~~{zz{||}~~|{{}~~}|{z{|}~~}|zyy{~~}{z|~~}||}|{z|~~~}zxyz{zxvvxy{}~~}}}}~~}{zyz||{zyzzz{}}}}~{xwx{||zyxxx{}}}}}}~~}{{|}}}}}~~~~~~~~~~~|zxxz{{|||{{|~~}}}~~{yyyyz{~}|}~}||~|zyzz|}}|yxxz{|}}}||}~zyz}~}|||}~~~~~{{|~~|{}}|||}}{zxyy{{zzz{}~~~}}|}~|{yxwxz|}}zyyz}}|}~}}~~~~}||}~~~~|{z{~~}}~}}~~}}}~~|{{|~~~|zxwwxzzzyxwvwy{}~~}}}}||~}{zzxwwxz}~}}~|zxyz{{{|||{||}~~~}}|{{zyyz}~}}~}}}~~~}|zxvwy|~~}{ywy|~~~~|zz|}}|||~~{zz|||}~~|{z{|||}}yxy{}~~~~|{z{|}~~~|zyz|}~}}~||~|zz{|}~~|yvtux{}~|{{}~}~}ywxxyyzyy{}}}|||}~|||}}zxz|~~||}~~|zz{~~~~|{|}~}}}}~~~~}}}}{xvwxzzzywvutvz~~|zyz|~}{yxxxyyzz{|~~~{xxz}~|zxx{}{z|~~zxxyyz{}~~~}}}~~~}|zxwwy{||{zyxy{}~}~~~}|zyy{~~}|{||{yyz|~}|||}~~|yy|~}|}}}~~}zwwx{~}}}~~}zyyz}~}}~~~}|{{{{{{zxwvwy{}~~~}||}~~}}||}~{xwwvvuvwz~~}~}{yxwxz|}}~~}|zyxz~~~|}~~~}}}~}~|ywvvvvwwxxxwwz~~|{zzyxxz|}{ywvuvwyz}}||}~}|||{xvwz~~~|{|}|zz{{{|}}}~|zz|~~|~}||}}|ywuvxz{|}}|zz}}|}}{{{zyxy{~~{yxxxyz{}~}|{|~~|}~}{zz|~}{z{{zyz{~}|z{|~~}||}~~}~~~~~~}}|~|ywwxz|}|zxwx{~~}||}~~~}{zz|~{vttuvwwxy|~}~|ywwxz{|{zzz{{|}|}}}~}}~~~~}~~~}yvtstvxz{zzyyz}|zxxxxxyz|zwutuwy{||}|zyz|||{zyxxy|~~}}}~~|}~||}~~|||}~~~~~|{{|~~}}}~~{{}~~~}}}|ywuuvz|~~~~~||}{yxyyzz{|}}{yxyz{{{|}~}|~}{{}~~~~|{z{||}|{{|~}|zz}|zyyz|~~}|}}{zz}}zz}~}}{yxxz|}}}}|zxy{~}|}}|{zzz{{ywvvwxwxy{}}|}}~~}|zxwuuwxz{{|}~~~~}}}~}||~}}}~~|{zyxwvvwx{}}}{yy{}zyyyywutuxzyxwwyz|}~~}zxxy{|||zxvvx{}~~~~}||}|zyy{}~~|{{}~~{zzzzzzyxyz}}{|~}|}~~|zzyyyxwwy{~~}{yz|}~}||~~~~~{z{}}zwvx{}~~||}|z|}|~}|{{|}~}|||}~~|zyz|~|{}}}}~}zy{}~}|{zzz}~||}~}}|zxwwxz||zwwxyzyyz{}}z{|~~}{xvuttvz|}||~~~~{{}~}}}}}~~~~}~~~~}||||{ywwxz{|||||}~{ywvuuttvz||zyy{|}}|}~~~~|zxwy{{zxwvvwy|~~~~}~~}~~~~|||||~~}zyyz{{{|||||{{{|}~}|{{{}}zwvvwxyyz|}|||||||}~}|}}}~~~}{{|}|||{zyxy{}~~~~~}|}}{{}~}}~~~}|{zy{}~~}|}}yx{}~|{{||}~~|{{}}{{|~|zyyyyzzzz|}|zyxxxy{}~~{zzzyxxxxwvvwz}~~~~~}|{|~~}}|{{}~{z|}|}~}{xwxz|~~}~~~~zwvvvwwvvx{~~|zz{|~~|{|~}yvuvwxyyzzyyz}~}|||~}}~~{ywx{}}}}}~~|{{}~|}~|{{{||}}}{xwwyzzzz{~}|{}~~~}~~|{{{}~}yxxz{}~}|zz{}~~~~~~~}}~~~}|zzyyy{~~~|zz|}||}~~|zyy{~~}|||}~~}|{{{zz{{{|}}{yyz|}}}|}~~|ywwxyzzzyxwxy{}~~~||}~~~|}~}~~{zz{|}~~~~|}~~}|zyz|~~~~~~}||~~~}}~~}|zyxxwxxyyz|~~}~~~}|||}|zwutvxzzz{|||{|~}}|{}~~~~}}~~~}}~~~~~~|zy{~~~~}{{|~~}|zyxy{}}}{zyz|||||}~}{{{}~}}||{{|}}|zyz{}~~~~}{z{|}}|}~~~}{z{{{{{|~~~}}~}|||}}|zwwy|~~|{{{|~~||}}|{yy{~~|{{{zz{|~~}}~~~|zxxyz{||zxwxz}|{{}~~||}}~~~|{|}~~~~~}~~}{zzz{|}}|{z{||{{{}~~|zzyyxxxyz}}}}~~~~}zyyz{|{yxwxz|}~~}||}}{|~}~}}}~~~|zz{}~~~~}{{|~~}|{zyyy{{{yxwwwy{}}}||{{{{{{|~}|{{zyyz|~~}{yyz|~|{}~}~}|~~}|||}}~}{yyz{}~~|||~}zxwwxxwwvuuuvwxyxxyz{|}~|{zzzzz{}~{yxyyxxy{~}}}~|{{|}~~}}}}~~}||~~~~{{{}~~}zyxz}}{z{|}}~~~}|zwvuuuvwxyyxwvwyz{zyyzzz{|}}{ywvvwyzz{}~||{{{||}~|zz{|~~~}|{|}~~~~}}~}{zz|~~~}{xvwy|~~~~~~}{zxwwwxyyyxusrsuwwwwvvwz|}}|{zz{|}}}~~|zxwwxyz{|||||{{|}~~}}~~~~}{yxwwxz|}~~|z{}~}|yusstuvvusqppruxzzzzz|}}|||||zyyz|}}{xwwwxxyz|~~|{}~~}||||}~~|zz{{{zzyyy{}~~|{|}~~}||{zyxusrsuvxxwutstwz||{{{{{{||||{zyzzzyxy{~}{zz{{{{z{}~}||}~}{|~}}~||}~~}}}}}~~}||||~~}|zzz{}}}}}~~}zxwwwxxxwvusrrtwyyxxxyzz|}~~~}}||||}}{yxwwwvvwy|~~~}}~~~~|}~~}|{{{zzzzyxxz}~}~~}|zxussstssrrrqrtvy{}}}||}~}{zxxxyz{{{yxwwvvvxz|~~~}}~}}}}~}~~~zwwxyz{{{{{|~}{z{|||{zyxwvtssstuvvvvvvxz|~~}|{{{|~~|zyxxxxxy|~}{zyyxxy{}~~}||~~~~~~~|zz{}~~}}}~~|zyyz|}}}}}|{zxvutuuvwvusstwz{{zyyz{~}|{{{{z{|~~|xvttuuvxz|~~||}~~|{zz{{{{{{zzz{}|{|~~}}}}|zwtqppqrstttssuy|~~~}}}{zxwvvwy{{{yvutuvxz|~~~~~|{|~~~~~~~}}{ywxyz{|}}~~}~}zyyyzzzzyyywtrqqsuwxxxwxyz|~~~}}}~~|zyxwvvvxz}~~|zyxxyzz{|~~~}~}}}}~}||}~~}}~}|zxwxy{|}}}|zxvuttvwxxwvuuvxz{{||}}~~}{zzzzz{|}}|ywuuvwwwx{~~}|||}}~~~}{zz{|}}|zzz|~}{z{|}~}}|zwusrqrsstuvvvuvx|~|ywvvvvvwxyyxwvvwxz{}}}}}}}}}||{|~}{{|}~~|zyy{|}~~~~~~zwvwyzzyxwwvutssuvxyzzzyyy{~~}}}~~~|zxwwwwwwxy{|}|{{zzz{}~~~~}}~~}}~~|{{{}~}~~}{xwvxz{||{zzzyxwvvwxyyxwvuvx{~~}||}}|{{zzyxxy{||{ywwwxxyz|~~}{yyy{|~~}}}}|{{||}}||}}~~|{zz{|{{zzyxwvtsstuvwwwvvwz~~|zxvuttttvy{{zxxyz|}}~}{{{|}}|{yyz}}||}}~~~~}{{{|}|ywvvwwwwwxxxwvuvwxyzzz{{{|}~}||||||{{yxvutuvwy|~~}}|||||}~~~~~}}|}~~}}}}}}}}}}}}}~~~~~}}~~}}|{ywvvwyz{||||{zyxxxyyyxxxxyz{}~~}}|||}~|{yxwwwxy{|||{zyyxxyz|~~}|{zyzz{}~}}}~~}}}}}|{{|~~}|{|}~~|zxwxy{{|{zyxwvuuuuwxyyzzz|~~~}zwuttttuvxz|||{z{{|}}{zzzz{{{{|}~~}}~~}{{|~~~{wtstuwxyyyyzyyxxxyz{}~~}|{|~}{zz{{|{{ywutuuwxy{}~|||}~~}|}}~~~~}|zzz{|~~~~||{||}~~}}|zwutuwz|}}}~~~|{yyyzz{{zyxxxy{}}|{{{|~~|{zyxxxxyz|}~}|{zyz{|}~}|||||||{{{|~~~~~~~~|{{{}~~}}~~}||{{zz{}~}{yxxyz|||||{{yxvvvxyzzzzyy{|~~~~~}|{ywvuuuuvwz|}}}||}~~{yxyz{|||}~~}~~~}~~~}}}~}{yxvuuvwyz{||{{zzzz{|}~~}|{{{|}}}}|{{zyyyyyxwwwwxy{|}~~}~~}}}|{{{{{|}}{zyy{||||{{zzyxwwy{}~}|||{{{zyyxxwwwy{||||{{||}}}}|{zyzz{{||}~~}||{{{||~}}}}}}}}}}|}~~}}~~||||~~|{{{{{zyyyyz|~~~~~~~}|zyy{}~~}||{{{zyxxyyyyyyyyz|~~}|||}}|{yxwwwwwxy{}~~~~}{zz{|}~~~~~|{|}~~}}||||}}}~~~}|{zxwwwy{|||}}~~~}|{{||||{zyyz{|}|{yyxxyz{{zyyyzz{{|}~}||||}~~}}|||}~~}}}}|{zyxxxxyz{||||{zyz{}~}{zyyyxxwvuvwy{{{zz{{}~~}|{{{{{|}~|{zzzzz{}~~~~~}}~~~~~~~~|zyyyyyyyxwwxz|~}|{||}~~~~}{yxwwxxxxxyyz{|}~~~}}}~~~~}|{zyxwwxy{}~~}}}}}~~}}}~~~}~}{zz{||||{zzyz|}~}}|{yxyz|}~|{{{{{{zzzyyyyzz{zzzz{{|}}}|{{{{|}~~}|{yyyz|}~~~~~~~~}}}~~~|{{{|{zxvuuvxy{|}}~~~}|||}~}{yxwvwwwvuuuvxz{|}}~~~}||}}}}}~~~}{zyxxxyz|~~~}}}~}zxwwwwwwvvvvx{}}}~~|{yxvvvvwxyyyxxz|~}|{zyyzz{{|}~|{{{{|}~~~~~|{{|}~~}}~~|{zzzzzzyyyyz{|}~}{z{|~~|zyyyzzzyxwwwxz{|}|||}~~~~~}~~~~~~~}{zyxxxxyz{|~~|{z{}~|zyyxwwvvvwwxz|~}{ywvvvvvutttuwz|}~~}|{{{|}|{yxwwwwwxz|~}|}~}}}~~~}|zxvutuuvvwwxy{~~}|zxwvvvvvwwxxxy{}~}|zzyyz{|}~~~|{{zzzzz|~|zxyz|~~~~~~}}}~}|{yxxxxyzzzzz{}}}}}~~}|zyyxxxxxxxxxyz|~~~~}}}}~~~}|yxvuuvwy{}~~~}|zyyz|~{yxwwwwwwwwwxz|}~}{xvuttttuuvwxy{~~|{zyyyz{{{zxwuttuwy|~~~~~}}||}~}}|zwuttuvwwwxyz|}~~}}|{yxwutstvwyzz{{}~|zyyyxxy{}~~}{yxxxyz{}~|{yyyz{}~}}}|||{zyyxxyzz{{|||}~~}|}}~~~~}{ywwwwxyzzyyz{}~}|{{{|}~~}{xvuuuvwxz|~}}~~}}||{{zzyyz}~}|{|~~~}|zyxxxxxxxxxxz{~~|ywusstuvvwxyz|~}{yxxxxyzzyxwvuuvwy{}~~}}}}~~~}||}~~~}|{zzzyxvvvvwxyzz{|}~}}}~~}|zywutttvwyz{|}~}{zxwwwxyz{|||{zyyyzz|~~}|{yyyz|~~~~~}}}~~}|{zz{|||{zzz{||||||}~}}}~}|zyxxxxyz{||||}~|{{{{{{{|||{yxwvvvwy{}~}|{{{{|||||{{z{|}~}{zyyz{|}}}~~}}~~|{zyyyyyyyyz|~~|{ywvuuuvwyz{{|}~|zxwwvvwxyyyyxwwxy{}~}}}}}}}|{{|}~}}}~~}}}}}}~~}{{{{|{{zyxxxyyz{|}~}|}}}|{{zyxwwvvwy{|}~~|{zxxwvvwxz|}~}||{{{{|}~~~~~}|{zyyz|}|{zzz{{||}}}~~}{{zz{|}~~~}}}}}}~~~~~~}}}}~~}}{zyyz{|}}}}~~}|zzyyyz|}~}|zyxxxxyz|}|{zz{{|||}}}}||{||~~}|{yxwwwy{|}~~}|zzzz{{{{{{|~~|zxwvvwxxz{|}~{ywuuuvwyz{|{{zzzz{|~~||{{{{{{{|}~~}}~~~}}|{zzz{|~~}||||}}}|{zzz{|}~~~~~~|{{{|||||{zyxxyz{|~~|zxwvuvwy{}~}||}~~~~~~~~~~}|{zzz{}~~|zyxxyz{||}}~~~}}}||||||}~}||}}~~|{{|~~}|{{{|}~~|{zyyyz{|~~}{zyyy{}~}||||||||||}~~~~~}}}}~~}|zywvuvwxz|}~~}}|||{zyyz{|}~~~}{zxwwxz|~~|ywvvvwwxz|~~}|||}~~{zyyyz{||}~~~~~~~}|{zzzyzz|}}}}~~~~~~~~~}}}}}~}|{|}~~}|{zz{|~~|zyxwwwxy{}~}|{{|}~~~}|{zzz{|~~|{zyyxxyz|}~~~~~}~~~~~~~}}~~~}|{zzz|}~~}||}~~|||}~~}|{{{{{}~~}||{{|}}|{|||||}}}~~~~~}}}~~|{zyxwvvvwy{}~~}}~~}|{{zyxxxyz|~~|{zyzz|}~~}|zxxwxxz|}~|zyxxxy{|}~~}|{{{{|}}~~~}|{{{{zzzz{|~~~~~~~~}}|{{{}~~}}}}~~~}}}~~}}|{zyxxz{}}}}}~~}||||}~~|{zyyyyz|}~~}||{zyyyz{}~~~}~~~}{zyxxyz{|}~~~~~~}}}}~~~~~~~~}||}}~~|{z{{|~~}||||}~~~~~~}||||}~~~}|{zyxwwxxyz|~~~}}}~~~}{zyxwwwwxz|~~|zyz{|}~}{zzyzz{|~~~~~}|zyxxz{|~~|{yxyyzz{{{||}}}}}|||{{{||~~~~~}}}||{zzzz{}~~~~}}}~~}}|{{{|}~|{z{|~~}}}}~~}|{zxwwwxyz{|}~~}||{zyyz|~~~~~}|zywvvvxz|}~}|||||}}}}}}~~~~}{zyyz{}}||{||}~~~~}|{{z{|||||}}~~~~}}|{zyxxxy{}~}|{{||}}}}}~}|{zyxwvuuvx{~~{zyyyz{}~}|{z{|}~}|}}~}|{zzz{|}~}|zyxwwwwxxyz|}~~~~~}|||}~}|||~~~}}|{zyxxy{|}|||}~~}|}~}{zyyz|}~~~~~~}{zyxwwvvvwyz{}~~}|{z{{}~~|{ywvuuvwy|~|zyyz{|||{{{|}}|{yyyy{}}|{{|~~~}}}||{zyyyzz{||}~~}|{zzzz{|~~|{{{{|}}~~~~}{zyxwvuuvwz|}{xwwxy{|}~~~~~}}}}~~}|{{|~~}|{z{{}~~}|{ywvuuvwwxy{|~~~~~~~~~}}}}~~}|{{zzyyy{||{z{|}~~~~~~~}{ywwwy{}}|{zyyxwvuuvwyz{|}~}||{{{|}~~}}~~~~~}|{yxwvvvxz}~{yxxxyzzzz{{|}}{yxwxy|}}||}}~~~}}||||{zyyyyz{{||}~~~}||{{{{|~~}|{{|}~}|zyyyxxwwwy{~}zxwvvwyz|}~~}||}~~}{{z{}~~}}|||}~~}|{yxwvvvwwxyz{|~~~~~~}}||}}~~~~~}}~~~}}}||{zz{|~~|zyyz|}~~~~~|zxwwxy|~~}|{yxwwwwvwwxyz|}~}{zzzz{|}}~~}}|}}~}|zyxxwxy{~}ywuuwxz{{{||}}|{yyyy{}}|{{{||}}~~~}}|{{zzzzz{zz{{|}}}}~}|zzzz{|~~~~}}}}~~}|{{{zzyyyz|~}zxutuvy{}}|{{|}~~}|{|}~|{{{|}~~}{{zzyxxwwwxyzz{|}~}}||}~~|{zz{|~}||}~~}|||~~}}~~{yxyz|}~~}|zyxyz}~~}}}}~~}{zxwwwxxxxxy{|}~}{yyxxyz{|}}||{|}~~}|{yxxy{~|ywuuwxz||}}~~~}}}~~~}|{{{|~|zyyxyy{|}}}|{{{{{{||||||}}~~~~~}{zyxyz{}~~~~~}~~~~}}}}}||{{|}~~}~~|zxvuvxz}~|zzz|}~~~~~~}{zyyz{|}~~}|{{{zzzzzzzz{{|}~~~}|{{{|}}~}}||{{{{|~~|{z{}~~}~~~|{{|}~}{zyz|~~}~~~}|{zz|~|{{{{||||||{zyyxxxyzz{{|}~}zxxwwxxyz{|}}}}}~~}}~~~~~}|{zzz{}~|ywwxz|}~~~~~~}}}~~~}|||~~|{zzzzz{|}~~~~}||{{{{||{{{||}~~~~~}{zyyz{||}~~~~~}}|{zyz{|}zxwxz|}~}}}}~~~~}{{{}~}|{zzz{{|}~~}||{||||{{{{|}}}|||}~}|{z{{|}~~}|}}~~}}}||{zzz{}~~~|zxwxy{}~~~~}}}~|{{}~~}|{{{{|}~~|{{{zzzyyzz{{{{{||~~}|||}}~~}}}}~~~~~|{zz|~~}}}~}{yyy{|~~~}~~~~}{zz{|~}|{{{|}~~|{zyyyyzzz{||}~~~~~~{zyzz{|}~~~~~~~~}{zyyz{~~~~{xwwxz|}~~}}}~~}~~}}||}~|{zyyyz{}~~}}|{zz{{||}}}}}}}}}}~}{zyz{|}~~}~~~}}~~~}}|{{|}~}|}}}zxwwx{~}||}~~}|}}|{zzz{|}~~}{zzzzz{{{{{||}}}}}~|{zz{|}~~~}|||~}}}~}|{{}}||||}~{yxyz|~~~~~~~~~~}|{|~~}|zzzzz{|}~~}|{yyyyz{||}}~~}zyxyyz{|}~~~~~~~~~~}|{zz|~~}}}~}zxwwy{}~~~}||}~~}~~}{zyxxxyz{}~~~}|{{{{|}}~~~~~~~}}~}{yyyz{|}~~~~~~}}~~}||}}|{{{|~~|zxxy{~~|{{|~~}~~}|{zyyyyz{}~~}|{z{{{||}}}~~~~~~}{zyyz{|}~~~~}}~~~~~~||}~~}||}~~}|{zz{}~}{zzz|~}|}~~}}~~}{zyxxxyz{|}}}|{zz{{|}}~~{yxwxxyz|}~~}}}~~}~~|{{|~~|{{{|}~}{yxy{}~|{{|}~~|{zyxwwwxy{|}~~~}}|||}~~~~}}~~|zxxxyz{}~~~~~}|}~~}|}~}{zyyz{|~~|zzz}|{z{|}~}}|zyxxxxyz{}~~}|{{||}~~~}~|zxxxyz{|}~~}}|}}~||~}|{{|~}{zyyyz|~}{z{}}|{|}~}{zxwwvwxy{|~~~||{|}~~}}}~|ywvvwxy{}~~~~~~}|{|}~~~}{zz{}}{zyyz{}|zyz|~}{zz{}~}{zywvvvvxy{}}}}}~~}|{|}~}zxwwxy{}~~~~~~}|||~~~~}{z{}~|zyxxyz|~~|{{}~|{z{|~~~}|zyxwwwxyz|~~}||}~~}|||~|zxwvwy{|~~~~~}|{z{|~~}{yyz|~~|{zyyyz|~|{|~~}}~~}|{|}}|{zyxwwwwxz{}~}}~~}|{{}~}{xvvvxy{}}||}~~~}|zz{|}~|zyyz|~~|{zzzz|}~|||}~}}~}|{{|~~|zyyxxwwwwy{|~~~~}|{{{{|}~~|zxwwy{|~~}}}~~~~~}|{{{}~|{zz{}~}{yxxy{}}}~~}||}~}||}~}~~}|{zzyyyyyyz|~~~~~~~~~}||{{|}~~}|zxwwy{}~}}}~}}|||{{z{|}|{zyxy{}~}|{zz{}~}||~}|||}}~~}}~}}}{{{{zyxxyyzz{|~~~~~~~~|{yyz|~~}{yxxyz|}~}|{{||||||||}~~}{zyyyz}}|{{{{{}~}||}~}|}~~~~~}}}~~||~~}{zz{{zzyyz{{{|~~}}~~~~~~~~}}|{zyyy{~~{yyz|}~~~}{{{|~~~}||}~|ywvxz|~~|{{z{|}~}|}~~}||||}}}}~~~~||}~~}}|{{{||{zyz{~|{|}~~~}}~~|zyyz{}~|zyyz|}~~|zzz{{}~~}|{}~}zwuuwz~}{z{}}zz|}~~~~}}}|{{{}}}~~~~}}}|{{{{{zyyy|~}}|||~~~}|{zxwxz|~~~}|{zzz|~{yyy{}~~~}~~|yxwwwz}~}|{z{~~}|zz|}||||||}}{|~||~~}{|}~~|zzz{{}}||{zz|}~~~|zyyyyzz|~}{z{{|~}}~~|{zz|~~~~~|ywvvx{|~}{{{|~}{z{|~}zyyz|}~}~~{zz|~}~~~~|{zyz}}zyy{}~~~~~|zyyy{||}}{yxy{~~~|zz{||}~~}|}~|{zywvvx{~}||}yxy{}~~~}{{{z{~~{yz|~}{{{{{{{|~}zyy{~}{yyzzyyz{{}~}{zz}~|}|zz{}~~}~~}{z{zzyyz~~~~}~~{yy{~}{z{||}~~~{yyz{~~~|{|~~~}}~}zyzzz{|}{zyxyz|}|z{~}|}}~~~}}~~}||}}}~~}}}~~}{zxxxz|~~}}|{{{||||zyz|~~}{xxy|~}~~~~~||}}||~~{yzz{}}zy{{{z{||||}~~}||}~~~}|}~~~|{}~||~|{|}}~|ywwz}}|{{z{zyy{|}~~~~~~}zy{~}{|~~|zzz|~|{z{{{zzyyz|}zy{}~~~}~}}~~}}~~~}{|}|}}|~}~~~{zz{|}||}~~{yzzz{||~~~~~}{z|||~~~~{yy{~|||zwvxyz{{{{{|~~}}}zyz}~|~~}{{}~~~}~||~}~{z{|zy{~}~|xvvx{}~}~~~~|~~{{||~~{yyz{z{||{yxxyyy|~~|{{}~|{{}|{zyz||}{z{}~}}}|}~~~}{zyz}}}~|{}}{wwwvy|}|}~}{{|xwyzz|}~}yvwyz{||{z|}}}||||||{z{}|zz{{z{zz}~~~}}{xxz~~{{}}|||}{wwyz{~~}~~~}~}{{~}}|{zxwz~|zxvuvy|~}zz|~~|{}|{zxwxzz}}zzz{~~|}~}zzywx}~~z{~~|ywvx{~}|~~~{|~}|~~{zyyxvvy}~yxxxz|||}~~~~}|}~}|}~~}||yuux{}{{}~||~~~~~~{zyy{}|{||}|{|zyyyy{|zxz~~}}}{wvvx|~~~|zxx|~}|{{}~zy{|}~}{yxxz{}}|{{}~}}~}}}{z||zz}}yz{}~}|~~}~{|}|zz}}}||~|{}}|xvwy{~}{z{{yyz{z{~~||{|~~}|wuvyzyz{|}~~{|~~}~}}||~~|}}}}|{}|z{~~~~}}}|}~~{wv{}|~}|~~~{wuwyxwy|||}|z{|~~|z||{{{~~||}}}{zywwxz}}||~}~|}~~}z|}~}|~~~~}}}~|zy{|{{~~ywz}|{|~~}|}~~}~~~|{xxyyz||yy}~~~}{{|~~}zy||z{|{|}|~}zxyxwz|||}}~~{{~|}~{xwz}~~}}~~~}{wwyz}}|||{||}~zy}~}}~|{}}~~|yxxxwxyyxz}~yvx|}}|zz{{}|xvwvrruxz}}{z|}z{~~}|{{|}}|{|~~|{zzxxz}~|{yyzzz|~~zxyxx{~}|yyyvrruwx{|||zz~}{|~~|}~{{}|~|xurruxyz}~|~|}~|z|~~~}~~~~|ywuux{|}}~~zwxz}ywxxyz{zyxutwwvx~|{}~~{{zyz~~}}}|||vrsrty|}}zz~|{~~}~|{|~}{{||{~}|~~|{|~}|zyywuy|~}yyz|~|{xw{{vtsuvx{|{y|~|{{{||{~}{z{~{trsrpsx{||}~~}{}~||~}{}||}{}~zz||z{}~|yzz{{|}|}{xyzy}~{|{xz{{|}~{wuusqrvz{|z{}|~~zxyz{|}xtsrsx{|y{~}}|{z}~~~~|xz}}|zyxy{|yz|zy{{yxy{}}zz~yuuttwzzz{}}}}~~}}z{}|xwz|}}|xttvxzyz~~}}~~||~~~|{|zy|{|~}|zz|{z|~yy{{z||zzy}}}~}|~~}|~|~~{yvuux{zyy{}}||}~~~}~}|{{{{}}{wtvwuttx|}|~~}}~zwy{z{}~~xwy{{|{{|z}|}}y{~|}~|}~~}~~{xy~~zwuvwvuwww{~~~~}{|}{yxy{zxyy{|}zwxxwwx{|~}~}{|}{y}~}}}|}~|z|~}yz{{~|xx}}}~~~~~}~}~~z|}}~{}~||xvxyz{yy|~}{|{z||{z{|zyyz{{|||~~zxtv|}}|z{}|zy{|{}~}|}~~|{~~{zyvtx{yy}~|{|~~~|~}}~~|}}~}~~}~~|{{zww{|}|zz}}z{|}{z~}zzwuy{{}~|zyvuvy{z{~|}|zzywwy}~}{~~|{{zzywtuxx|~~~|}yxz~~}zz~~}~|zz{{wtx{|{|{|~~|~}z{||}{xxxvstvy}}yxy{}{yzyyyy{~~~~{xwxxwx|~~}|||||~{|~}}}|z}~}|}~}{yx{~~{z}|z{~{wwz}||{xutuwy{}}||zyzz{|{~}{zyz}|}~}~{vusrtz|||}{{|~~|{}~~{z}~~}~|~~~|z{{}}z{{z{~|zyz~|{}}xuutuz}|{}|wuwzz}~zyyzz{|}|~|zxwvvuswz|~~~~~}{yy{~~}~~}}{{~~{}~~z{~|yxy{|}}{yy{~}|{wssuusuy|}}}z{|{z~}}{yz|~}~~~|ywvwyyyzz}}|~~~||{}~{{~~~|~{xx|||~}|~}}|}|{~{yz{zyy{zxvtttuy||z|~|z{||~~}~~}}~|}||~|y{zxvuuwyxy}~~{{|}~}||||zyz}zvxz|}z|~}}~|y{{{|}zvwyxuvwxzz{~~}~~{yz~~~}~}|}}yz~~}~ywwxxxywuux}~zxz||}}zy{|}~|{yy{}zz{}}|yy{ywwustxxvuv{~}~~~~}~~~}}~~||~~~|z||{yz|{xvy{}~~}z{}|{{{{}~}zxvx{}~}}}~}||zwutvwwvuwxwwz||}|z{~~|~}~}}}}~~~}|{z{}||xttxzyx{~}|{yvwy{{{}~~}|ywy|~~|}~{zyxwxwvxzzywuw{}|||}~}|z{~~|{}~}}|}~~{}}zyz||zxwwwxy}~zyywwxxxz}~~|~}}}||}|}{||yvuwxwxxwvvwvwxyz}~|}~~||~}{y{|{|~~~||{}}y{|{xvwz~}~~zuvz{z|~~~}~|zz||z|~~|zxvttuwxzyuuwxzzyz}|{{{{|||~~zxz{}~}}}~}|{yvuwxy{}{ywwvux|~|{}~~~{yy|}{|~~}}|xvwwxyxy{zxxxxwy{|}~~}|~|yy{~~~}}|{{}}}~~~~}}~{{|}|zuuxy|~ywwxwwxy||}}|~|z{|~~~||||yxwvy{{yvuwxxtux{|}~~}{|}}}|zyyz||}~~|{z|}~}||zyyy{}|||ywy{|{z|~~}zz|{z{~}}~}zyzyvvxzxxxwvvvy|||}zy{}{yz{{{|{yz|~}}|}~~}~~{yxyz{||~~|{}|zyyxwy{||}~~}}~{{{z|}{|||~}|zyxy||ywz{zwvwy{}~~}|{{zy|}{z{~}||~~~}y{~~~}}}}||}{yz|}~}}}|zyzz{yvwz|~~~~}}~{y{||~}~}|~{{{{{zyyxutwywx|~~|yyxxz||{zz|~|{}}yyz|}~~|}~~}{|{{}}~~}|{zyyzzz|~}}~|{{{{~|{|}}~~{{}}zwwyyywuwxy|}}~}yxywtvy{{||||{|||}}}}~~~~}}}|zz|}~~~~~}}}zwvwyyy|~~}{|}}~{z|}}||{xx{~~}}}|z{{zxxz{zy{}~~~~}{{|xwuux{{z{~|{|~~||~~~~{}|{{|}}|~~{{|~~}}~}{zywuvz~|{yz|~~|~~}~~zzzy{}~}}zz{{yxxxxz}{yz|~}|{}~}zvuvxz{|~}zz|}{z}}z{~~~~~}}|{z{}~~~|}~||}~{{{zwwz|~}{{|}~~{xwz}~~~}|zxxxy{zy{|{|~~|{}~zuuwwuvy}~}{z{{|}}}}~~}}~{wx{~}|~~|yuuy{{~|z}~}||}|zxxxyz{}~||||{zz{|}~}{z{~}{{{|}}yvvwwx{}||}~}|zz~~~||~~|zy{}~}~~~~||||~}{ywxxz~zz{||}~~~{wxy{||}~~|z{}}|||{{{zzyy{}}{|~}||zxvvz}}{{zzzz{|~}|}~~}{~{yz|~}~~~{|~~~}~~~~{{}|z{~}~}{}~}~~|{zzy{~}}~}zz||}~{yz{|{zz|~~~~|{yxwwwxyy{|{yy|~}|}}}}{||zzz|}|~}|~~~}~~}}zy|~|{}~~~}{|~~}~~zz{{yx{~~~~~}|{~~}{{zxz|}}{z|~|}~}~~zwwy{zyyz||{|}}~||}~}{|||}}~}}~}{|~}~~}||~}||{{}}{}~}{{}}~~~}{yy|~||}~~{z{|ywwz|||}}{{}~~~{{zxxy{{zxz}~~}}~~||~~}|{~}{{zy{~~}}||}~~{z{~}|}~}|}||~{{|}}}}~}{|~~}}{ywx{}}{{|z{z{~|{||yvvxyyz|{|~~}~}~~|||zz{zwy|~~}|}~{{{{z{~}||{z}~}{}}zy{}}||~}~}yxz{|}}~|yy{zxz}~{ywxzywx}~~}|}~}}~}{zyxy{|}|}~}}}}}|z{{z{~~}}}{y{~}}}|{{||z|~yxz|{yz|~|zywvw{~~zxxxxx{|{}~~~~~{{|ywwy{||}|z{~}zxz~~}|{|~~~|z{}}|~~}zyzzz{}}zy{zwvxz}~|{{yvuy{|}~}}~~~~}zyxvxzyxx{~~}}~}zyz|~{{}}~}{{zz}}|}}|zz|~|zzxuvy{zy|{{zwwz{y|~}~~}|{{yvvxzzy{~~|}{yy{}}}}~~}~~|}~~~|{{|{{}}~~}||||{yzzxuuwxxy}~{xx{||}|}}|~}~||yxyzzywx|~}|}~~~~{{{|}~~~}{z}~}{z}|z{|{zzwuvxyxww|~}||{z|}|{}~|}}}~{wxyzyxxzzzz}~|~~}~}z|~~{{~}}|{}~{|}~~~}}zxzzwwxxxxx{||}~}z|}|}}{|}~}{{~}~}zxy{{xvx{{yxy|~~~}{|~}z|~}{}~}}}z{}}{|~~{yxvvxyxuuxz{{{{~~}}~}|}}||}~~}}~zyz{|zy{{yxy{{{|~|}~||}|z{~~~~~||}}|{~~~~zyyxvvwwxwwyyxy{~~~}}}}yy{~~~{}~|zxz|{yvuwyy{~zz{zy{|}}|}~{{}~}{}}~}{zvuxzzyvwzzywxz||~~||}|{{|}~~~~~~|{|{zy{{yxwwwwvz|zzyvvz}}||||~~~{{~~~}}{xwxxyxxyxwuuwyyy|~|z{}~~{|~}|~~}{yz}}{ywwwwy|}~|zzyxy{{{|||}~~||}}}~~{wvwyyvuxzyvuuwxy}}||||||~}}}||~~~~~}}}|{zyywtuxz|~|xvxz{zyz~~~~~}~|{}~}{{}~~zxxxxxy{{yvvxxvw{~|z{}~||~~~~||~~~~~}}|z{}}{xwwwvvxyz~}{xwxxwwy|}}|}~}~~~~}|}~}~~{{||ywx{zyvuuutwz{{~}~~|}}||}}}|}}}|{{|~}|}}|{{{zxwyz{}~~{xy{{zxy|}~}}~|yy{|}|{{ywwyywvvvvttvz|~}||zz|{yy|~}||~}{z}}~~{z{{yyzxxz}}~~~}|{zyxz{zyxz|}}~~}~~~}{zzzz||~~{ywy{{yxwwvvyzz|}}~~zyzzz|~~}|}|{}~~~|zz{zwwzzzz|{{~}z{{{zwwxyyxxz{|~}}|}~~}||||}~~}|}|zyxxxvtuwxz}~||}{|{xy{}~}{|~~~~~{z|}|z{~~|zz{{{}}{{}~}||~}|}|{zz||zxxz|{|~~}~~}{xx|~~}{z{{yxvvuuvwxwy}~~|yxwvxz{zy{~~}|}}|||}}~~}}~|z{}~}}}{yy{~~|}}~~{{||zxwwwwy}~~}|~}|~}|||zz||~}}}||}~~~}}}|zxyzywwyy{}}||}~~|{zwuwz|||}~~~~~|{~~|{{zy{}|{}~|zyz|}~~~}{z||zwuvwvvy|~}}|zy{|~}}~|}~}|z{}zyyxxzzxxz{zz{|}}~}zxyzzzz{~}zz{|}~~|{{}|{{||{zz}}|}~}{|}{|~}{|}}|{yywvy}~~}z{}~}~~~}}~}~~{yyyxvwyyz{{yy{~~~}yvwxxxxz{{{z{{{||{~}}}}|~~|{{zyz|}~~~~~}}{zzywvxy{~{|}~}}~~~}}~}|}~~zz{}}||~}{zyxy|}||}}||{}}}}}{yyyxwvy|~}|{|}}~~}}}}|z{}~~~|}}}zxy|~}}}~}|{zxvvxyyz}~{{||{yz}~}|}}{{|||}~~~}zz|}}~}{yxz{{yy{~~|{{{zyz{||{{zyy{~~}|zyzz{}~~~|||}~}}|{|~}||}~|{{||zz{{{~|||}}|~~~~~~}~}|~}{zy{|{{|}{zyz{z{}~~|ywvxzyxwxzyy|~~|}}}||~zyz{|||}}}}}{{|~}}|{|}|z{|||~||~}{{||}~~~}|z{}~}||}}{z|}~}||~~{z{}~~}||}{ywxyyzz{{z{~~}}|}~~~~|{{{{|}~}~}}~}{{{{zz{{{||{z{~|{||{{{{{{{~}~~|z|~~~~|{{yxy{{{|~~|}}}}{|}{yxyzzz{||~}}}{y{}~~~}~~}|}|yy{|}||}~~}|{{z|~}}~~||~~}||}}~~~~~~~}~~~|{|}{yxy{~~}~~}~~|{zxwwwwvx{}}~~~}}~~}{{||yxxxyz{|||~~}~~~~{yz|}|}~~}||{z{}~~}|}}|{{{{|}}||}}}}~~|zzyy|~~}{}}|ywwxyy{}~~~}~~}||{z{{zy{}~~}~~}|{z|~~}|{{{{{~~~~|zyyzz|~~~~~}{{}~~}zzz{{{|{yyzyxy{~~|{{yxy|~~~~~~~|zzyyzzzyy{}~}{{||{|~~~~}|~}}}}||}~}}}~~|{{|{{{|~}{{zyz}~~~}zxxwwyzz|~~~|yxxvuuwyyxy|}~~~}~~{yy{}~~~~}}|}~}~}{{{{{|~~~~}{{{zxwxyz{|~~}}|zywx{}~~}zxxwwyzzyy|~}}~~~}~~~~|zz{}~}}|zz{}~}~||{{~}|{{zywvuvwxxxy}~~}||}}~~}~~~~}|zxwyyyxxyzzz{{{z|~~}~~~~||}~~~~~||||}~~~~~}|{zyzyxxyzz{{}}{z{|||}}|}~~~~{ywvvwvuuwyyyyz|}~}||{{|}|{|}|{}~~}}~||}}{yxxxyywvvy{|{{|}||}}}~~~}|{xvvxyyxyzzz{{|||~~~~~}||}~}}}}}~~~}}}}}}~~}~~{yxwutuvvvvwyz{}~}|}~|{{{zyxxyzywvwxyz|~~|{||{{||||~~~}}{yy{|||~|yxwvwyyxwxz|{{{}~~||}~}|}~~}zyyxxwwwwwwwwxx{}|{yxwvvxz{{z|~~}~~}|||}~~}~~}|zyzzyxxxxwwxyzz{~~~~}}~|{}~~~}}~~}||||{yy{}}|{z{|}}zxwxwxyz{{|~~~~~~|}~~}}~~|{}~|{|}}}|}~{yxyyxwvxyywwxy{}~}|{{{{{||zyyyyz{|}~~~~~}||{zy{}}{xvvwxywvxyz{zzz{{}~~~~~}|zyyzzyyy|~~~|zzz{{{|}|{{{{{{~~}}~}zyz{{{{{||{|{zz|~~~}|{|~}{{|}{zyyzyz|~{xwusssttuwxyyz|~~~~{{|}}~~~}|{zyxy{|||}~~}{{|}|zxxxxy{}}~~~~~~~~~{zzzyyyyyy{}~}}}}}|}~~}||}}}||}}}}}}||}}zxuuvwwvvxz{|{|}}~~~~}|||}}~~}|{|||{z{}}|||~}|{zyzzyyyyxxxz}~~~|{{zxxwuuwxxxy{~~}}~~}}}}||}}}~|zxwvvuvwwvvwyzz{}~}|zxxxyxxxyzz{{}~~~}|zz{}}||{{{|~~}}|||||{yxxxxyzzzz{~~~~}}|{{{{zyz|}~~~zxvvusqrtuuuvxy|~}}}}|zyxxxxxxwx{||||}~~~~~}|||{yy{|}~~}|{zxyzzyxwxz{{||}}~~||}}{z{}}|{z{|}~}{yxwvuvwwvwxzz{}~}~~~}}||||{zz{|{zz{{{{{zz{~}{{|{zyyyyz{|}~|yxwvvwwvvvwxyy{}~}}~~~~~~}}}|}~~~}{xvwwvuttuux{}~~|{{zzzywvvxxwvvwyz{~~}|||{{|}}|}~}|zyxwvwxzzyyzz{||}~~~~{zzzz{}}~~~|ywvutrrrsttwz}}{zyxvvwxwvwxxyyzzz{}}||}}~~~}{zzzzzzzyzzywwwyz|~~||||{{zzyyy{~{yxxwvuuuuwz|~}{zyyzz{zyyz{{yyyyyz{}~|{zzzzz{}}{ywvwwwwvwwwwvwxy}~}}~}}}}~~~~}{xvvuutuwy{}~|{{{{yxwwwvvvvuux{}~~~|zzz{}}zyxwvwwwxy{|{zyyz{|~~}{zz{|~~~}|zxvtrqrtvwy|~~|zyxyyxvvwxwvvvwxy{|~~~}}~}|zyzzzzz{|{zyxvvx{~~~~}{zzzz{|}~}zxwwvvwxz|~}||{yyz{{zzzzyyyyyxy{|}}~|{zz{}~~~}|{zxwvvxyyxwwwwwx{~~~~~~~~~}}~~~~~~~|zxwwxxxxz{|}}}}}}|{z{{zxvuuvvwxyz|}~~~~}|{{|~~}|{yxxxwvvwyz{{{{zz|~~}}~~~~}}}~~}}~}|zxvuuvwyyzz|}{zzzzyyyxxwvvuuvy|}~~}}}}}}~~||||}}|zyy{|{{{||{zzz{|~~}}|{|}~~~~~~~~}||}~}|{{{{{{||}}~}{zyyzzyz{}|{zyyyyz|}~~}||~}|}}~~}}}}|zxwwwxxyyyz{|||}~}|{|}}}~~~~}zyyyz{|~~}|||zyyz{||}~~||}}}}~~}|{ywvvxyz{|{{{|}~~|{}~~~~}{zzz{zyxxxxwwxz{}~~}}|{|}~~}}~}|}~~}|{{{|~~~~}{zyyyyz{{|~}|{yyy{{zzxxxwwxy{}~~}|{{||}~|zyz|}}}}|{zzz{{|~}}}~~~~~~~~}{zyyzzz{|~~}||}~~}~}|zyyyz{||}}||{{|}~~}|{}~}}}}}}~}{xvvwxz{}~~}~~}||{{{|}~}{ywuuwxxy{~~|{{zzz{|}~}{|}~~~}}}||{z{|||||}|{{|~|{{{}~~{zzyzz{{zyxwwwy}}{{|||{|}~}||||}~~|{zyyyyyz|}{z{zzz{}~|{zyzz{{zz{||||||}~~~}|{z{{}~}}}}}|{yy{}}|{{{{}~}}~~}~|zyyxwwwyz|~~~}}~}|{zyyz{}~~}|{|~~~~~~~~}||}~~}{yxxz|~~}|{|}}|{{|~~|{{{zywvttuwxyz}|zz{{|||zz{|}~~|||}~~}{{|}|||}}|{|~~|{z{}~~}~}{yyzz{{{{zzz{|~|{{{|}}~~~~}|{{zyyyzz{{zxwxxyz{}~~|zz{{|}~}}|}~}zxxz{}~}|}~~~~}|{{|~|{yyz|||{{z{|}~~~~~|{z{|}~}{yxxwvvwxz}~~~}|{{z{|}~~|zyxz}~}{yyy{{|}}}}~~~~}|||}~~~||}~~}}~~~}|||}}}|}~|{zxwwxzzyvuuuuuvwy}}{{{{zyxvvwz|}~}|}~|{{|}~~~|yxxz}~~~~}||||}}}|zyyz{}~~~}||{|}~~|ywvvuvwxyz{{zxwwxy{}~|{{{zz{zzzz|~~{z{}~|}~|zyz|~~}|}~~}}|{{zyxwy{}}|{z{}|z{}~~|{zyxxxyz{}|{ywvuuvx{~~}|{{zzyyyyz|~~}|}~{ywuuwyz{|||}~~|{{{{||||{{|}~~|}~~}}}{{|~}{yxxwvuuwyzyvtttuvy{~~{xwwwwwvvvwy|~~||||||{ywvvxz|~~}}~~|{{|{{{||{{{}~|{}~~|{{}~|zwutuuttuwy{|{yxwy{}~}ywvwxyzzyyz|~~~~~~}}|{yxxy{~~}|{|}~|zzz{{{zyxxxy{|}~~|zwxz}~}|{yyxxwwxyz{||{ywwxyz|}~{zyyzzzyyxxxz|~~}||{yxwvutux{|{{{|~~|zyxxyz{{|}|{{{|~~~~|{{}~~}{zywvuuuuvxyywwwxyz|}{wuuvwvvvvwwxz}~{xwxxyyxwvvwy|~~~~~}||{|}~~}|{zyz{~~}{zz||{{{zyvtstuuttvy|}}|||~}zvuvwxyz{zyy{}~|{zz{|||{yxxy{|}|{{}~}|{yxxz||zxwwxz|~}}|{zxwx{~~|{zz{|{zxwxxxxxxy{~~|{{{{|}~~{yxxyz{{yxvvx{~}zyxyyyxxwvutux{|||~|zzyyxwxz|}}}|{{}~~}}~~|zz}~}}~~}{yxwvutttuwz|}|{{{{}~~{wutuvwwwwvvwz~}{xutuwxxxxxxwwy|~~~}|{{{|}~~~}||||}~|zyz|~}{yyzzzxvutttttuw{~~~~}|}~}{wttvyzzzzzz{~~}|{zyxxyz{||{yxxy{~~}}|{yyz{||{z{{|}~~}}||{zxwxz}|zyxxxyzzywvvvwxy{~}}~~~~~~}}}}~}zxxyz{||{{{|~}|{zyyz{{zywutvz}~~~|zyyywvvwy{}}}}~|zzz{{zzz{||{yy{~|{z{{}~~|zyxxyzz{}|zzyyz|}|yxwwxxxxxxxy|~}}{wustuvvvvvuuwz~~}||}}{zzzzzz{|~~|zz{}~{{}|{{|||zwutstuvwx{~~~~||{{|{yvsstvxyz|}~~|zyyyywuuvxz{|||||}~}}~~}{{{}~}||}~~~~~~}}|{ywvy}|ywvvwxyyxvvwy{}}~~~~~~~}~~~|{zz{{|~~{yxz|~~~~~~~~}|{zyyz{{{{zyxz}~{zyxwvvx{~}zxxxyyzz{{|||{z||{||{{{||~}|{{||}|||~~{yyz{|}}}~zwvwxz{||{zz}~}|{zxutstuvxz{{z{}}|{zzz{~}{{{{{|}~}{zyz}~~~|zzz{{zyxwwxxyyz|~~|zzz{{{yvttwz|~~{z{{{zyxxyzywuvxz|}||||||}~~~~~~}|}~||}~~}|||}|{z|~|zwvuvxz|||{{}~~}}}|{yxyz|}|{zzz{{}~{{|~{z{}~~~}~~|zxxz|~~}{z{~~}~}{zzz{{{}}zwwxyzz{{|~}{z{}~|{{{|~}}}}}}||~|zyyyyyyy{~~}{zz|}~~}}|||~~}~}|||{ywtstwz|~~||}|{{zyyz|}|}~|{{}~~}{zz{}}{zz{}~~|zyyz{{{{}~}}}}}|||~~|{yyyz{||zyz}}zxxzzyyyyzzzywwy}}|||||}}~~}|}~~}~}||}~~~}|~}}~~{ywwxz}}}~|zyxxwvvvxz|}|{zz{|~~|zyz|~~~~~}|{|}~|zz}~}}~~~~~~}~~}~}zwvwy{}~~~~~|{{{~~}}~~}}}}|{|}~|yvuuvwxxxz}~~~||}~~~~}}}}|{}~}||{{{zywwy{}}}}{{{zyyyz~}zxy{}~}{z{}}}~~~}{zyz{|||}~~{zz{{{zzz|~~|{zz{}~||~|xvwyzzyyz{}~}||}~}|{{|~~}||}}}}~~}|{|}~||~|{}~~~|}~~}||}~~~|ywvvvuttuxz}}}|}}~~~~~~}}~~~~|zyz|~}}~}zyz}}}}}~~~}}|{}~{yxy|}|||}~~~}|{}}}}}}{yxxyyxvtuuvwwxy|~|||}}~~~|||~}{{}}}}~~|zyz|~~}~~~|zyyyz|~}|{{|}}|yxx{}~}}~~}}~}{zz{{{{zyz|}|{zyyyyyyyz}~}}~~}~~~|xuvxz|}~~}~}|}~|zyyy{}~}}}}~~|zyyy{~~||~}}{zz{|{ywuuuttttvz}~}{yxyz||}}~}zyz}}}~}{ywxz|}}||||}~~~~~~|{|~}|}|zz{|}~~~}|{zywustvxywutvwwwwy{|{{||}|{yxyz|~~{{|~~}{{{}~}{z{~~||}}~|{{}~~|zzzzz{||zyy{}~~}}~~|{zxwxxwvwy{}|{zyxxxyyz~~~~~|{{|~}zwwy}~~zwwy|}|zxwxz|}|||{zzyxz|~~}~}}~~~}|{zxwwxyyzywvutstuw{~~~~|{{zyxwvvy{}~~~~||~~|}~~{ywutvx{|}|{{|~~~~~~}}}~~{{~|yy{}|yxwvvtrrsvyzxvvwwxyz}~zxwxyyyxxxxyz}~~}|||}~~|zxwx{~~}}}|}~~}|{zzzzz{||{|}|{||}~~~~}~~~~|zywuvwwuuvx|~~{yxxy{{|~}zyz{}~}|zxx{}~~}{{}}|{xuuvy{|{xxxy|~}{yxz{|{zyz{|}~}zz}~~}|{zyxvvvvwy{zxwuuvwy|~|zyxxyyyxvttvx{~}|{{{yxvvuuuuw{~~|{|}}|}|||}~~~||~~}}~|{{~|yxwvusqqrsvyzyyzzz{|~zvttuwxxwxyxxy|~~~|zxy{{zyyxxxz|~~}}}||~|{}}}|}|{zyyz|~}{yxy{}~{zzzzzxuuvvvuuvy}~|{|}}|}~ywwxz|||{ywxz{|~}~|{{zz{yvttvxz{zyyz}~}}|{xvwx{}}|z{}}~~}~~|{{{|~}|}}~}{yxvuvvuux|}}{yxyy{}~{ywuuwxyxvtstw{~{zxwwvuuuuuuuuy}~}}~}{{||{z{}~}~}{z}}}}|zyxwuusqqrswz|~}|}}~yvsrtvwwxzyxwy|~~}|{xvwyyxxxxyyyz|}~}{z{|{|}~}||{|~}}~~|zxvxz}~{xxxyzzxvwwwuuvw{}}~}|~~~~zwuvy{||zxxyz{~~~|zyxwxyxvuuuvyz{|}~}}|{zxvwwz}~}~}|||}~~|||{z{~~|{{{}~}{ywuvwvvx}}zzz{}|zwttuxxxxutvw||zyxvutstuuvwvtw|~~|z|}|zz{}~}|yz}~{{|zyzzywvsrrsvy|~~~~~}}}}~}zwustvwwx{{zz{}}|zz{{xvvwwwxxxzzzz|~}{z{{z|~~~}~||~~}{wvwz~|xwwwz|{xxyxwwxy|}{|~~}~~||~|ywvxz{||{{|}|}~~}}}~}zyvuwyxvvwwxz{}~}|{{xvwwz}|zyzz{}~~}~~|z{~}~}zz{|~|ywwzyxy|}{zz|~~~~}}{vstwxyzyxyy|~}zyyywutrstuwyxwz~~{{}~}|}}|z{|||~~}}~~|z{~|{|{yy{|zywuuvwz|}~~~~||}|||{zyvuvwwx}~}}}~}}}zzyyz{zwwxwvvxx{}}~}}~~~~{{||{}|z|~}||~~~~zxyz~|{~~zxxwy||{{}|{z{{}}{{}}}}|{||}~~|{}~|{xy{|~~}}~~||~|{~~}}||~~}{xuuwxwxz|{{{{}~}~}|yxyy{~}|zwwyz|~~~}~}|{|~}{{{~|{||zy{}~}{{}}{{}~~~}}~|xvwyz||zzzz}~}||}~{yyzzxwtrstvz||{}~}}zyz{~~}~}||}}|}|{{}~~}}}}zyz}~~~zxxxz|~}~~}~~|{|}{|}|||zzzyyzzy|~~~}{yzyxyxy{|{yyzxvwy{~}}~|~~|}~}~~~|zz}}||~}||}}zz}~zzxy|~}|}}|yyzyyyxxzz|~~||~~~~}~~~~~||}~zy{||{||}~|ywwyzyz}~}}|z|}{}~~}{}}~~~~}|}~}|{wwxy|||{z{|}~}}}~}~|z{}~~~~{zzzxwz||{|~}}~{{||}}|{|{|~~|zyz}|zyz{zzxuuvx|~~}~~~~||zxyz}|yyz|~}}~~|{|}~~~|~}|}~{{z{}~}}}{||{{zxy|}||}~}}}{|~~~{}~~}}{yxvvxxy{}|z|}|zz|}}|~}|~~|}~|}}|z{}||~~~{y{}~}|||~~}~|wvwwwwvuwy{~~|~~|{|~~~}~~zyz{zz||}}{{|{z{~~~{y{||{}~}~~}}|zz}~}}zwxy{~}~{z{z{}}|~~zz|}}~}{|zyyywvxzzyz|~}}}{{|{|~~}~~|ywy|{yz|~}~|yxxy|~}~~}|yyzz}~{yxx|~~}~||~~}}~~~~~}{{|~}{}~~}{{{zzywwy{{{}~~}~~~~}|}}zywtvwx|~~~~||}~|}~~|{}}}~}~||{~~|}~~}||z{}}~~~|{|~|xvwwvvutuwy}}}}{{|{{|zz{{}~|{|{yy{|~~~}z{}~~}yyyz~~~|}~~~|yy{~~~~{z{|~||{yz{{}~}|}zz|{zzwwyxyyxvuxyyxy{~~|zzzz||{yz}~~~~~zwx{{{}|{zz|~~}|{||~}~~{z|}~|}|{zxz}~}|}}~~~~||||zx{{{z{|{|{zzxvwyzz|~}}}}~}||{{|~}{|}~|{wuvwz~~}~|{{yx{~~~}{z{|~~}}~~}~~}|}}|}~||~}~~||zxxz|zxwxwvvttuwz}|}}yxxxxxxwxyz|~}|}|zz|~~zz|~~~|xvuuy|}|~~~~{y{~~~~~}}{yzz{~~zxxxwwutvwxzzxvxyyxy|~}yxxwxyywwy{{{}~}zz}}}~~}{z|}}|}~{xxx{~}~~~~||}}~}|{z{}~}~~}~~~}~}~~|zzywvxyxxyz{}}{{ywx{||~~|zzyz|{zzxxz}}{|~~}{xxz|~}~{yyxuux{|}}zz{{~~||||}~}|~~~|{}}|||{zywvwzyxyyywwvuwx{|yzyvuvwvvvtvxy|~~~}~~{z{|{zxutssvyz{~~~~~}}~~~}zz{}~ywwwvvtrsuwz{zxy{{{{}|wtttuwwuuxyyy{}~~~}~~|{||zyz{zxwvvx|~~}~~~}~||}~~~~|}~~}||{{|{{|}}|{yyywuvxwvwyz}~}|{z|~}}~zwwwwzzyyxwx{|{|~}|{|~~~}|{ywwwustwz|}{z{|~~~~}|{yz{{}~|~~~~}{y{~~~~|||{zyvuvxxxy{|{{yxyz|{xwwuttvvvuttvw{~|yxxxwvssrrsvwx|~}{}~~}~~}|{~}}~{xwwvuusrstw{}||~~}~~~{usrrtvvuvxxxxz}~~}|{zywvwyxwvuuwz|~~~}||~}}~~}||{yyyxz|}|zzyyzyvuwxwvwx{~}}~}yvuuwyzzywvx{{|~~}}~|||zzywvvwtstvxz|||}~}}}|{zxxz{}~}}||}}|yy{|}~~}|{||{zyvvwxxy|~|z{{}{xwvsstvvvvttvy}}ywwvvutrrrrtuvw{~|z|}}|}~~}{z|}}~{yxxxwvtrsuw|~~~|wtrqsuvuvxyyy{~~}}{zyyxwtuwwvvvvwyz}~|{}~}}|{||zzxwy{}~{yyxyzzxvxyxwxz}~}~~}~}zwuuvyzzzyxz|}}~}~}|{{{yywvuwwustwy{~~}}||{zxxy{~~~~|{{{{}}{z{|||~~}|||}~}|zxwy{zz}||{|~|zywtstvwxxvvxz~~~~{xwwvuusrrrsuvwx|~{{}~}|}~|}~~~~}{{}}}}|zzzzyxwuvwy|}}~~}|yvtssuvvwz||{}~~}}~~~|zyxxxxvtuwwvvvwy{|~}||~~}}~}||}}|zxxz}~|yyyy{|zyz{{z{|}~}}~}|||}}||~}zxwwy{|||{|}~}~~~~|{|~~}|{z{|zyxvuvwvuvxz|~~~~}|{yyz|~}}||{zyyz{}~}|}~}}~|{{}~|||~~|{|}||}~|||}~}}~|{zvuuxyzzyxyz|}||}{ywwwvutrrstwyyy|~}|}~~}~~~}}}}~}{{}}}}}~}~~~~~~~|{{}}||yxyy{~}||}}}|yxwuvwxxz}~}}}}{{zzzywwwwxywvvwwvwxy|~~}~~||}~~|}~~}{{}~||}|zyy{}~}}~}}}}{{|||{zz{{|}}|}~|{zz}~~~}~~}~~}|{yxy||{zzz|}|{ywwxzyyz{||}}~~~||}~}|||{{zxxy{}~~}zyyz|}~~~~~~~}}~~|{{{{zz|~~}~~~~~~}zyy{{||zzz{|~~}||{zz|{yxyyxwuttvwz{{{}~~~}}{z|}|zzz{||zz|}||}~~~}||~~}~}{z{|}}|}~}}}||~~}||}}}}{{zzz{{z{~~~~|zyyxxwvvwwyzyxxyzyy{|~}|}}}}~~}||~~~~~}~~~}{z{~}|||~~{yyyyyyxxyz|}}|}~~~~|}}|{{{zxvxyzzz{{}~~}|zz{|{{|}}}}|}~~~~~|{{||{{yxy{}~~~~|zyxxz|}}~}}~}{yyyywwy{{{|}~}|}}}|{zzz|}~~~~}~}{zyyz{{yyz{{zywwxy{}}|~~~~}}{z|}}zyxy{|{{|}}}}~||~~}|||}}|{|}~~~~|{{||{{zz|~}|}~~~~~~~}||~~~}}~~{zyxwwvuvwxz{{{|}}|||}~~~~~}}~}|||~}}~~}}}|zz|~~{xwxxxwvvxy{}~~~~~|{|}}}|zzzzzzywwxyyz{|~~}}~|||}~}}{z{}~}}|z{|}}|{z{|~}}}|{yxxyz{|}}|}}}}|zyyxxxwvwyzz{}~~}|zyyyz{{zz}~~}}|}~~|{yxy{|{|}~~|zyyz|}}|}~~~~~~|{|~{yxxz{|||~~~~|{|}}}||}~~}||||{{}~~}|{{||{{zyz|}}~}}~~}}|||~~~}}|}~|zzzyxwuuvwz|~~~~}}~~}~~~}~}||}~~~~}||~~}}}~|{|~~~}|}}|zxwxwwwvvxz}~}}}{yxxyyyyxxxyz{yxxyyyz|~}||}}}|ywwxz}~~~~}{{|~~}}~~}}||{zyyyz|}~~{zzzzyxwxxxxxwwxzzz|~}{yxwwwxwvwz{{{{|}}|zyz}~}~~|{zz{||{|}|{z{|~|zzyz|}}~}}}}}|{|}}}}}~}|{{zyxz{|||{{|}|{{zz|~~~~~}{zzz||||{{{}}{z{{zywvvxz}~}}}{{|{{|~~}||}~~}|}}|}}|||~~}|}~}{zyyxwvuuwy|~}}|yyyyyyxwxxyzzyxyyyyz{}}|}~~}|yxxxz}~~~~|z{|}~~|{|}~~}|{zxwxy{|}}~|||{{yxxyyzywvwyyyz|~}zxxxyyyxxz{{{{|}~~~|{yz{|{}~~||{|}}}|}~}|{{|~}}~|zyyz|||~~}~~~~|{|||||}~~}}|{zz||||||}}}|{zz{|}}}|{{{|}|{zzz|{zzz{{zxvvwy|~}||{zz{}~~}|z{|}~~~~~~}}~}|}~}}}~~}{{||{zzzyyxwvwy{~~||{yxxxxwvuuvwyz{z{||{{|}}|}}|{xvvvwy{{|~~}|}~}}~~}}}|{yxyz|~~~~|{{zywvvwxzzyyy{{{|}}zwvvwwwvvxxyyyz|~}|}}|}~}||||{{|{zyyy{~~~}|||}}~~~~}}}|{{{|}}}|}~~}}~~}||{yyzzzyz{|~~}||}~~~|zyyz{{{zxxyzzz{|}}|{yxyz}~}{zzzxwxz{||{z{|~~}|}}~~~}~~}|{|~~~~~~~~~}{zyz{z{{||{zyxy{}}{zywwwwvutstvxz|||~}}}~}|{{zywuutuwxxz|~~~~}~~}}~~~}|zz{}~}{{zywutuwy{|||}~~}~|xvuuvvvuuvwxxz{~~}~}||{{zyyzzyxxxy{}~~~~~~~}}|{{yxxy{|~~}~~}|||{yxxyyyz{}~{zxxxyzyyxxyz{{|~~{zz{}~~~~}|{zyywuvwy{}|||}~}{zz{|~~}}}}}|zz{{{|}~}|zyz{|||}}{z{|~}{zxvuuuvvutuvy{}~~{zzyyxvtsssuvxz}~~~~}}~}{{{}~~~}||}~}{zyxwvuvwy|~}ywutttttvwyyyz}}|{zzzyxyyxwvvwy{}}~~}{zyxwwyz|~~}|{{zyxxzzz{{}|zwvwyzzzzyz{|}~~}}}~~~}~~~}{ywwwvvwxz|}}~~}{zyyz|~~}||}}|{yxyz{|}~~~~~~~}|{{|||}}|}~~{ywuuvwxwvuvxz|~~~}{{zyxvtrrstvwxy|~|{|}}~~~~}}~~}|{|}~~~}}~|{{{{zywwy{}}yvtstuvvwxzz{|}}}~}{zzz{{ywwwwvvwxz|}~~}~|{{{zzyxxy|~{zyz{{{{||||}~~~~}{yxxy{||{{|}}}|}}}|}}}~~~~~~~~~|zywwxyxwxy{}~~~~~}||{zz{|~~}}}~~}|zzyzzzz{||||~|{{}}}}~~}~~~~|{{zxxxxyzyxxxy{}~~|zxwvuttuuvwxy{~~}}||~~~}||||||}~|||~}|}~~~~~~~}||{{{{|}}|{yxwwwwwxz|}|{|}~}|{{{{{zzzyxwvvxyyyyy|~~~~}|}}||}~}|zyz{}~~~|zz{|~~}|~~~~~}}~~}||}~~}|{{|~~||}}}~}|}|{yy{}~~~}{{||{{{zzzzz{|||||}~{{}~}}}~}{ywwxz|}}||~}zyz{|~~}~~~}}~~}|}|zz{|{zyxxy|~~~~~|zxxyyyywuuwy{{z{}~{z{|~|zyz{|}|{zz{{|~~~~~}}~~~~}{zz|||}}~~}{zyz{{zz{||}|zz{{{zywvwxxyyz{zz{|}~~~~~~~~~~}|{{}~~~}zzz|~}{{|}~~~~}}~~}||}~~}||{{|||~~~}}~~|zyzzzz{|{zyz{}}{|}~|{z{{|~~~~}~~}|zyyxxxz||}~~~}||}|{zzyyyz|~}|{{|}~}}~|{{zz{||}~~}}~~}}}{yz{{{|}|{zyyyyyyzz{}|{zz|~}|{{{zyxxy{}~~~~~~|{{|~~}{z{~~}~~~}~}}~}~~}|{zz|~~}|{zxvuuvx{||z{}~~|{|}|{|}~~}{|}}}~~~~}{{|}{yyz|~}~~~~~~}{xxyz||{|~}{yz{|||zwwxyy{}~}|{{{~~}|}~}}{yyyz{|{zyz}~}}~~}|zwuvwy{}}{{|}}}||{{{|}}}~}|{zyz{}|||}~|zzyz|~~}|}~{xxxy{~~~~~}}}}}}}}}}zwvwxyz|~}|~~|{{}}}|}|zyyz{~~}}~}|||~~}}}~}||~~~~~{xxwwvwyzzz|~}}||~~}|||||~~~{zz{}~}~~~}}~~~{{{{{|}~~~~{yyyxy{}~~}}}}|zyz{|{{{{yxwwwy|}}|}~~~~{zz||||~~}|{z{}}}{{|}}}}~~~|yxwvvy{||{~~}|}~~~~~|yyyz|~~zxxyzyxxy|~~~|{|}|}}}}|}~~}|{z|}}~~}{{}~}}~}|~}zyxxy|||z|~|~}|{|}}}}{xxzz{|~~~||}}{{}~~~~~~}||}}{{|~}{zyyz{{ywwz}~}}~~~~}||~|{{|}}}~~~}|~|{{}~|{|~~}}||~~|{~~|{{{|}}{z|~~~zxxz||{{yvwxxy{|||z|~~|{{||yvvx|~~~}{||zz{|~~~{zzzyzzzyy{~}{|~~}}{zz{{{}~}}|{zwuuwzzz{|{yz{{~~|~}}~~~}}|zzz|}{zz{~~}~~~~||}}|z|~~~~}zz{}~}|}{yzzyz}~~}|~}{z{}}~~}~~~}}~~|yyz}~~~{z{|{|}~~{z{|{zz{}}~}}}{z|~~}}}}|{}~~~}}~~~~||}|yyy{}~|}~~}~~}~~~}~~}}}{|~~~{z{|{z{{xvvvvx{}}{z}~|}~|{|}{xwwxyy{|{z|~~~||~}}|{{~~|}~}}|{}~~}yy{}~}||}~~~}zxyyz}}~{xvwxxyzxvwyyz|}~}}~|zyz|{xwx{|||}}}~~}~~|}}|}~~|{|}||}{xxyyz}~~}|~}{{}~}}}|z{|}~|{{||{|}|z{{z{}~|~|yyyy}~}~~}||~~}}}{xy{|}~}}~|z{}}~~~|yyz||{{|{z{||~~}}}~}~}}~||}~~~}|{wvwwwxyz{z{~}}}|}{xxz{zyxwuuxyz}}||~~~~~~}~~~~}||~~}}~{{|}}}~}{z{||~}zz{yy|~~~~}}}|yxxvuvvvx|}~||~~~|{||ywwyzz{|{yxy{|~}~~}~~~~}}{xxxwxz}~~|}~~~~~|yzzz|~}}}~}|yxy{{|~~}}~~}{z|}}~~}}~}{{}~~|yyyyx{~~~~{{{z{~}|~~|{{||{||ywxyz{~~||}~~~~~~|}}zxxwwz{|zwy|~}}}~~}|{||{{{xttuuvz}~~~~}~|{}~~|zy{~}{z|}|}|{}}~|{{z|~}||{|~~~|z}}xuuuuwy{{{z}|||{xxy{{zzzxwxxxz~~~}}~~}zyzyyz{{zz}~~|z{{{{~~~||~|zzyy{~}|}}~~~}}|zz{}~}||}~|zzyy{|}|{|~}|}|{|~~~~{z{}~}||zxxyxx{}~}|~|{|}|z{}~~~~}}|zz{||zy{||{zz|}}}}~~}~~}|ywwwuvxyzyy}~~}{|||~}{z||yxy{}~~|{|}}}~~}~~|{}}}~~}|~~~}{zxwxz{zxy}}|}~||~}{zz{{{z{zwvwwxz|}|{~~~}|}}}~~|{}|||{z|~}{yy|~~~}~}}~}|{{{~~}~}}~~||}||}~~}|~}~~}|zyz|{xxz}~~}{||{{}~~|z|~~~~~~~}~}{~|{{}}}}}zwxxxz|}}{{~~||~|yxy|}~~}}|}~}~{z|~~|zyyy{~~~}|}{yyyxy{zywwz}}}|~~|{||}~}ywxz{{{|{zz{{|~~|{{|~|{{|~}|}}~}}~}}~}|yx{}}|{|}}}|yyz|||{zxvxxxy{||{z}~||~~}{{}~||||}~|}~~|zz{|}~~~}}~|}~}}~~~}}~~~~|{|||~~}~~~~~}|}|ywxy{{|}}{z{{|~||}{|}}~~}}~}}zxyyxxz|}|{}}}~|zz{{{z{{zz{|}~|{|}~~}{{{z{}}~~}}|{|~}{{|{z|}}{yy{{{zz{{|}{{{{}~|{{{zz{zxwxyz|~~~|{|}|zyy|~~~~}|}~}~~~~|}~~}{z{{|}}|}|{|{xvvwwy{||zz}~|}~}~~{{}~~}}~~~~}{|}||~}~}{zzz|~~}zz{|}~}~~{yz{{}}|}|yxy{{zzzxxyzz|}}||}~~}}~}yxyyyz{{zy{~~}~~}}{{|}||{xvvxy{}|{|~~~}|}~~~}||~~}}|{z{}~}||}~~}{{{{|~~|{}~|yxyy{}~||||}~~}{zwvwwwy|~~|}~~}{yy{|||}|zyzz|~~~||||}}}~~~}{xwwwwxz{{z{}~}}}}~{{{{|~~~}zzz{|}~~~}}~~~~~}}~}}~{z{{{|~~~{{{zz|~~~}~~}{{{||{{{ywvvwy{}~}}~~~}||}~~~~|{zyz{}|{y{|}}}}}}~~~}}|zwwvvwz|}|}~~~~~{zz||~}zyy{|zyy|~~{{{|{|~~~}}~}|{zz}~~~}}~}}~|}~zxwvwy{{{z|}}~|zz{||||zxxyyz|~}}~~~~}}}~}}}|zyxxyz{zxx{}~~||}}~|{{{|}}}|||{{|~~~~~|z{|~}||~~|||{{}~~|{~|||{|}~}||}zz{}}||zwvwwwxz{|{{~~|||}|zy{}~~}}~~}{z|~~|{z{|}~~~{yyxxxyzyyy|~~~{z{{{|}|||zxwxz{||}|zz{{|~}|}~}~}}~~~~}|{{}~}||~~~~}}{zz{{zyz|~~}~~~|{{}}|||zxxxxy{}}||}~||}~~~~}}~}{{|~}{{{{{|||zyz{{{{{||~}}~}||{}~~}||}}~}|{{|{yyz|~}{|}}}~}|}~~~}~}|}~|||}|||{ywwwwx{|{yz|~~}~~}}~}{yyy{|}~~||}~~~~~}}~~}|{zz|}}~~|{zzz{|{yxy{}}||}}{z{{|~~~|yxxyzzzzxxyzz{}~~~~}~}{z{|}{yz|}~~~~~~~~}zz|}}|{|}}|{{}}}|{xwwxxz{||{|~~||}~~}}~~|{{|}}~~~|{{{|}~}{|}~}zyyz{}~~~~~{{|}}~~}}{{||}~}zxyz{{|||zz{{|~~~}}}~~~}~~~}|zxwxxxyzzzy{}~}}||}~~{zz{{{zzxxyz{}}}~~~~}}|}~~~~}~}}}~}|||||}~}|{|||{zz{{}}{{{{|}~~~|||{yyxwvvwxz|}}}}~~~~||||zyyz{|}}|zz|}~~}||||~~~~}}|zxwwwxz{|{z|~~}~~~~|zz{|~~}}~~~}|zyz{{}~~}}~~}|{zz|~~~~|}~}{zzz{}~~|{z{{}~}{z{{{{{ywwyz{}~~~~~~}~~{yxxxyz{zxx{}}}|||}~}|||||{yvuuvxz}~~~~}|}}~~}|{|}~}||}~}{{{{|~}|~~{zzz{~||||}~~}|}~|yvuuvwxz{{{|~~|zyyz{{{{yxxyz{~~}}}~~|yxxxxyzzzy{}~~}}}~~|zzz{{}~}~~|zyyz{~}}~~}}}~~}}}||}~~}}}~|zzzz{}}}}~}||{{|}~~~~|||}}|{{ywwwwxz|}}}}}~~}~~~~|{zzz{{{zy{{|{{{||}~~}{ywwvvwyzzz|~|{{{}~|{{||zz{|~~}{{{||}~~}}~~}}||}~}}~~~~}}}zxwvwxyyyy{}~~~~}~}|{{{{{{zxwwxxz{}}}~~~~}~}{zyyz{{zxxz|}}||}~}{zz{|~~~}~~~~|{{{{|}}}}~~~~~|{z{||{{|}~}|{{{{|}}}{|~~}}}~~}|}~}|}}}}|zxwwwxyzzzz|~~}~}{z{}~~~~~~~~~}{z{|}|{zzz{}~~|zxxxxyyyxwy|}~~}{{{||~~~~{yxy{||||{zz{{|~~}~~~~~}|||}~}}}~~~~~}}|{{{zyxxz|||||}}}{{|}}|{zxwwwwxz{{z{}~~~}}~|{{{||||zyz{{zzzz{}}|||||}}||}}{{{{{}}|{z|~~}~~~~~|{{{|}~~}{yyzz{||{zz|}}|||}~~~~~}||}}}}}~~}{yxwvvwxxwvwy{{{{|~~~~}}}}|zzz{|~~~~~~~~~}{{{|{{zzzz{}|zzyxxyywvuwxxxyz{}}{zzz{||{z{~~}}}||{ywvwxxzzzzz|}~}||}~}}~}}~~~~~}}}~}||}}|zxwyyyyxyz|~~~}zwvuuvwwwvvxz{{{|}}{||}~~}{zzzz{||{yy{{{zyxxz|~|{{{|}}|{z{}~~}}~}zzzz{|||{{|}}}|}}~}||}}||zyxxxxy{|{zz{}}||{{|~~~~}}}||}~|yxwwwxxwvvwyzzyyz{|}{ywwxyz{}}}}~~}||}~~~|{{|}~|zzzz{{{yxxyzyxwxxz|~||{{{|||{|}~~~~~}|ywvuuvwyyyxz|~~~}}}~~}}~~~~}{yyyz|~~~~~}|}}}{zyyz{}}zxwvvvwxwwvxyzzzzz{~|zzzz|}~~}~}zxxyz{||{z{|}}|{{{{|~|zzzz{|}}||}~~}}}~}{zzz{||{{{}~}|}~~~}|ywuuvwxyzyy{}~~}|||}~}}~~~~|zyxxyzyxwwyzzzyyz{}~|ywvvwxzzzz|~}{zz{|}~~~~~~~~~~|zyyyz{{{{zz|||{zyyz|}}|}~~}{{|~~}}~{xvuuvwxwwwy{||||}~~~~~~}{ywwwxyz||}~~~~~~~~|||}|yxwwxyxwvvxzzyyyz{}}{zzz{||||}}zyxxxy{{{z{}~~}|||}~~~{zyzz|||{{|}}}}}||||}|{z{|~~~}}~~|yvuuuvwxxwxz|}}}}}}~}||}~~|{{{{{zyxyz{zyxxy{}|zxxwwxxxwwy{}}~~~}{zyz{|}}||~~||}~}zxwxyz{{zyz|~}|{{{|}~~~}|}~~}}}~}{zyxxxxvvwyzzzyz{~~|ywvvvxyyyxy|~}}}~~~~|zzzzzzyxwxyzyyxxy{~}|{{|}}|z{|~~|zyyz{{zyyz|~~}|||~~~}}}|zyyz{|||{z{}~~}}}}~~~}~}|{|}~~}||~~{xwvvwxxwuvxz{zzz{}~}{{|}~~~~~~~~~}{zz|}|zyxxz}~{yyyz{zywvxz{zzz{}|{{{|}}|{{}}|}~~{ywwwxy{{{zz|}}||{{|}~~}~~~~~}||~~}}}}}{xwxyzyxxxy{~~{xwvwwyyywwy{||||}}||}~~~}}~}{zz{|}}{yyz{{yxwwx{~}}}}~~~}{{}~~}||}~}{{{{|}}{yy{}}||{{|}||}~~}zxxxz{}}{z{}~~|{{|}~}~~}|{|~}zxxxxyzyxvwyzyxxxxz~}zyzz|~}}~}||}~}~~|zzz{}~~~}~~|z{{{|}|zyyz{zxxxxz~~}||}~~~|{|~~}||}~}zwvvvxz{zyy{}~}{zz{}~||}~|zz|}~~}}{|}|zyxwxz~{yxwwyzzywwy{{zyyy{|zz{|~~~~|zxyy{|}}|{{}~}{yxxx{~~~~~}|{|}~|}~}|{|}}{{{|~~~|{|~~}{zz{}}}~}ywvwxy{||zz|~}|{{{}~~~~|||~|zyyy{||zwxz{{ywwwx{~}ywwxy{}}||}|{{|}}|{|~}~}}~|zyzz|~}{z|}}|yxwwz}~}}}~||~~|{||}xvvvvxzzywy{}}|{{{{~}||~~{xwxxz}~~~~{zyyz~~~{yxxyz{{ywxz{{yxxxy||zzz{}}|~{xwwxz|}}{z|~|{zz{~~}|~}}~}zzz{}}~~}|||}}|}~}|}}|{{|~zwvuvwz{{yy{~~|{{{}|||}~~~{zzz{}}{yy{|{yxxwxz~~~{yxwxz{|zy{~~}}~|zz{|~}~}}~||}{xxyy{}~}{{~}{zzyz}}}~~}}}|||}zxwwyzzxvwz||zyyz{~~~{xvvwxz||{{~~~~~~}||}|}~~~{zyyz||{xwy{|zyxxxz~}{{{}~}{|~|yxxxz{|{zz}}|{{{}~|{}}{|~~{zzzz|~}{|}}|}~~~~||~|||}}ywwvwyzzxwx{}|{{{{|~}|||}~~}|||~~{y{}~|zxxxy|}||{zyyz{|{xwz|}}{{||~}|{{|~}|~|{|{yxxxy|}}{z|~|{{{|}|}}~~}||}~~}|{{||zxwy{{zxxxxz~~~~zwwvvxz{zxx{~~~}}}}~}~}||~}{{{{}~~|yy|}|zxxxxz~}}~}}~}{|~~}}}~}{zzz|}}zxy|~~|{{{|~}~~{z{}}yxxyz}~~|z|}|}}~}}|||}}zzyxy{{zwvx{{zxxyy|~~}{{{|~}~}}~~||~~|zzyy{~~||~|{}}{{z{}~~{xy{|{zyyy{~}|}|{}~}~~}~~zwwwxy|}|zy|~~}{{{{}}|}}{{~~}~~~}}|~~}yz||{ywwwx{~~yxxwxz{zxwy{|{zz{|~|}}}~~||~|{{{{}~{{}~}{yxxxz~~||~~~~~~~|}|{||}}||{|~~{z|}}|zz{{|~{{|~~}yxxxxz}~}z{~}|{{|~||||~{zzz{|}|ywy{{zwwwwy}~|zzzz|}|~|||}~~~{{zz}~||~|{|~|{{{|~|z{}}|yxxxx|~~}|~}|||~~zxwwwx{|{yx{~~}{zzz|~}{{}~{zz{|~~~~zxxxwz~~}~~{zyxy{||ywx{|{yxxxz~|{{{}~}~{yyyz|~~|{~}{zzyy}~|{}~||~|}}}~~~|||{}~}||~~{{~|zzzz}~~|xvwvwz|}{yz~}{{{{~~~~~~}}|{{z{}~~{xz||{ywwww{~~zyyxz}~~|{}~}~|{|{}~~}||}{|~{{||yzzz{~}{}}{yyxx|~~~~}}|||}}yxwwxz{{xwz|}|zz{z{}|}~zxxxxz}~~}{{yz~~|{}~~}zzyy{}}{xxz||zxwxxy~||{{}|}zyyxxz}~}{{~~|{{{}}{{}|{|~|{{{{~}~}}}|~~~|}}{{{{}~|xwwvvy{{ywy|~}|{{{{}}}|~}}|{}~{z|~~{yxxxy|~~~||}}{{zyz|}|yz}~|}}}~||{{}|}~~}~|{{~}yxxxy|~~|z||{{{z|}{|~~}}}||}|zyy{|{xvy{|zxxyy{~~~~zxxwwz|}|z{~~||~}|~}||z{}~~{xz||{xwxww{~}}~~}|{|~~{y|~||}}{yyxwy{|zxy|~~|z{{{}~{{|~|{{~~{{{{|}~~~}{zxxy{{zwwz||zyyzz|}}~||~{zzyz|~}{}~}~~}~||||}~||{z{}~}zxz|}{xwwww{~~~~}{z{~~}}}}||}~{z}~}}~~~~~{zzyy|~~|z|~|{{{z}~{yy|~|yy{~||||}}{}}zyyyy}|{|~~|{zyz{{yvtwyywuuvvw|~~}~~{zzyy{}~|z{~~~~}~}z|~~|ywxwwz}}~~}{yz}~||}||{z{|}|ywy{{zxwxxy}~~~{xxwvwyzyvuwz{yxxxxy~}|||zz|~|zzz{}~~~}|{}~~{xx{|{ywxxx{}}}{|~~|yxxwxz||zxz}~~|{{{{~~}~~{z{}}yyyyz}~~{xz|}{ywwwwy|}}~}{yy|~}zz{}}}}}~|}~|||}}~{zzz{}~~{z|~{{{{|}{{}~{yxy|}}~~{yyzz|}{~~{zzyy}|{|}||~|||{|~~}ywxzywutttuy||}~}||}}}~{{zy{}~}zy|~~||~~}}}}~}}{zyxy}~~|zz{}~{zz}|{{z{|}zy{||zxwwwy~{yyxxz{{yvwyzzwvvwwz~}|~}{z|~~~~|yxxxy|~~|}~}~}z{}}|yxxxx{~~}|}~{wwwvxz{{yxz|}|zz{{|}{|~~~zxxxxz|~}{z|~~|zyxxy|~~~~|zyz}}{yy{}~~|{{{|~}}~|{{{}}{{z{}~~}z|~}||||~~}~zyy{||||yvvvvx{~~}{}}||{|}||~|{}~{{{{}|z|~}zwvuuuy{{||{yy{~~||~|zzzz{}}|zz|~~|{{{|~}|||}~~}||{~~|z{}~|zy{}~~{yyyy{}~~{z|~~|yyyxy}~}}{zzyz||{xxz{{ywvvvx}~||~}||~~}}{wvvvwz|}{z{~~~~}}~}zzyyz~~}}}~}ywvuvxzzywx{||zyyz{~{xwwwx{||zy|~~|{{zz}}{yy|}zxxy|||}|ywwxy{~}}~}}|}}|{{}~|z{~}|||}}{{}}||{xttttuxzzyy{~}}}}}~}~||}|zzz{|}|~~{zyxx{}}||zyxz|}{z{}{yyxxz}}|yy|}}|zzz{}}||{|~}~~~||~}{z{}}}}}zxwwwx{||zy{~~}{zzyz}~}~|{zz{}}|yxz||{yxxxy|~~||}~||}|xvuuuvxyywx{}~}|}~~~~}|||~}}~~}ywwvvwxxvuvyzzyxyyz}}yxwwwy{{zxz}~~}||||~|{}~|yxyz{{{{xuuuuvy{|zz|~~~~~~~~|z|~~||||}~~|xutsstvwwuuwz||{{||~~}~|yyxy{}~~||~}||||}zyy{|zyxz|~~~{xxxxy{{{yxz||{zzzz{~~}||}~||~|{|}~}}|xvvvvxzzywxz||{zzzz|~~~~~||{{|~~|zz|}}{yyyy{~||~}||~|ywvuuvxwvtuxz{zyz{}~~~~~}}~}~}yxxwwyyyvtuwxwvvvwx|{zyxyz{zxwz|}|{{|}~~{zz{|{{zvtsstuwxwvwz|}|||}}||~~|{{{||xvuttuvvtrtwxxwwxy{|zyyxy{||{z|~}~}~||~~{yyz{|||{ywwwwxz{zwwy{{zxxxy{~~~~~}}}~}{|~~~~~~}zwvuuuwyxwvxzzzxxxyz~}}||}}{{}~~|{zz{}~}}~|ywvvvwwwussvwwvuvwy}~~~~}~}}~|zyxxyzzxvvxxwutttux|~}|{{||{ywxz{{zyz{|~~~~}|zwtssrtvwvtsvxyyxxyz|~~}|{{|~{ywvvwwvtrsuvvtttuw{~{zyyz||{yy{}~}||}}|{|}}||zwuuuvxyzywwyzzxwwwwy}~|{{|}||~~|z{~~}|}}|xwvuvwxwuuvyyywwwwx{~~~~~~}|}~~}|{{{|~{xwwvwyywutuvvussstv{~~~~}}~~~}}||~~~|{zzz{|{ywwyyywutttwz||}}||}~~~|yy{{zyxxyz}~zvttssuvutrtvwvuuvvx{~}}~~~|||}~|{zzzzxutuvvussssux|}~}}|}~~}{z{|}|{{{|~~|xutttuwxxwvxzzywvvvwz}~~~~~~}||}~~}{z|}}|{{{|~~{zxxxyywutvxxwwvwwy}}}~~~~~~~~|{{{}|yxxxyzyxvvwxwutsssuxz{}}}}~~~~}}}}}||~~~|{|~~}|{{|}}|zxyz{yxvvvvy{|||{zyz}~~~}~~~|zyxxy|~zxvuuvvusrtvvutttuwz}~~||{|~}~~}|||~~~~}zwwwwvtssstwz||}}||}~}|}}|zz{||ywvuvwwvuuwyzyxxxxy|}~~}|z{}~~~~~}{{|}|zyyy{~~||{{||zxvwxxwvuvvx{~~}~}}~}}}~~~}~}|{z{{{ywwxyywvuuuwy{{{zyyz|~~}~~~~~~{z|}~}||}}~||{|}}{{|}|zxwwwy|}}}|{zz{}|{z{~}|{{}}|{zywtstuvutttuwz}~~~}||}}{{z{}}}{|~~~~}|||~~||}|zwutttwz{|||{{|~~~~~}}}~~|{zzzywutvxxxwwxx{~}{{{||{{|~}||}~~~~~}{yyyy|~}||}~}{zz{{zxvuuvy}~~~~}}~~|zz{{}~}zyzzzywwvvxz|}}|{yxy{{zz{~}|~~~}~~}|}~}|zzz{~|zyyz{}}}|}}{zyy{}~~}||}~~|z{|}}~~|{{|}~~{xwxwvtsstux|}~~}}}~~}|}}||||}{zyz|}}}}~}}~~}}}~}}}}~~~}{ywwy{{{{{zz|~~}}~~|||}}zxyyywvvvwy|~~}zyz{|}~~|{{||}~~||~~~~}{zz{}~~~}}}~~|zz|}}|zyyxy{}}~~~}}}ywwwxz|}}}~~~~~}{yxwxy|~~~~}{|}~}{yyz{|}~}~~~||}~}|{{{}~}}~}{zzz|}{zyyz{zyyz|~~~~~}~~}}}~}|}~~~}|zwwwxz}}zxvutux{|}~}}}~}~~~|{||}~~~|zyz{{zyyz|~{yyyz|~~~~~||||}~~}|}~~}~~}|zyz{}}||}~{zzz{|~~}}~}~~}{yxwvx{~~}}|{{ywvvwy{}~}||}~~}||}~~{zz{|~~~}~~~{zz{|{{zzz|~}||}}zxwwwxyyxy|~~}{{|}~~}}~|||}||{xvvwy|~~|{zzz}}|||}~~}}~}}~}|{{|{ywwyzzzz{|}~~~}}~~|ywvvwxyyyz|~|zy{|||{{{{}~zxwwxz}~}|{|}|zyxxxz~|zyxxyzzzz{~~~~}||||}~~|{{}~}}||}~~|{||{zz{}~|{zz{||{zz{~~}|{|}~~~~~{wtsssuxyzz{}~~}||||~}zyxyy{|}||}~~~~~~}{{||zyxwxy|~~}}~}|{zzzzxvvwyz{{|~}||}~}}~~~~|yvuttvxz{{}~}|{|~}|||}~~|{{|~~~~~}}}}~~}{yyyyyxwwxy|~}}~~}zyxxxyyywvwy{|}~~{{|~}{zz|}~}}|zyxwxxyxy{}~}|{zyy{}}{zyyzzzxwxz{||}~{yxyz{}~}|{|}~}|{{{}~{zz{|}}}{zzz{|}}|{z{|||{{|~~}~~}~|ywvuuutstwz|}||||}}zyxxyz{{zz|}~~~~~~~|zz{|~~|{yxxy{}~~}}~~}||}}~}{yxxyxwwwxz~|zyz|~~~}}~~{yxwwwwwuuvy|~~}}~|||}~~}||}~}|{{|}}|{{|}~~}||}|{yxwwxz}~}{yxxxyzzzyxxzzyyyy{~}{yy{}~~}{z{|~}|||||{ywvwyzzz{||}~}}~~}|||{yxxyzzyyyy{~~{ywwwxyzzz|}~~}|{{{}}|{zxwwxyz|~~}|}~~~|{zz|~~~~~~}||{{zwusttuuvxz|~|{zzzzyxy{|}}||}~}{yyyz{|||}~~|{{}~~~~}||}}{yyz{|~~~}||}|{yxwwx{~}|{{zz{~~~~~~~}{zyyyz{zxwvwxxwxz|~~}|}~~~~}|{}~~~}||||~~}|||||{zz|}~}|{zzz|}~~~~}~}ywvvwyzzyxyz{{zyyyz|~}}|{zz}|{{|}}}|{{|}~~}{{{zxwvwx{}}}~~}}}~|zyz{{zzyyz|~~|zzyyyxwvwy{}}}}}~~zvtttvxz{{{}~}}}}|}}||}}~~~|zyyyxvtssux}~~~~~~|zxxyz{{{||~}{zyyz{{{zyz|}~~}||}}}||~{yxwxz{|||}~~}|{{{|~~~~~{yyz||}~~|yxwxyz{{zyyz{{yxwwwy}}||}}}}}|{|}}|}~~}}}}~~}}}}~~~|zz{{{{{{|}~~}||}~~|zxwwwwwwyz{|{{{{|~~|{{|}~}{ywvwxz|~~~}~}{yxxy{}}||}~~}}}~~}}|{zyyz{~}||||||{ywwxxxxyz|~~~~|zxvuuuuuvy|}~~~~~}~|zyyz|}~~}|}}}|zywvvxy{|~~|{zz{}}|||{zyyy{}|zxxyz{{{zz{{|{{{|~~~~|{z{|}~~~}|||{{zyxwx{}~~~}}~}}~}{yyz||xvvvwyyyyz{|||{{{{|}~~~~}|{ywvvvx{}~~}|}~}{{{|~~}~~~}{zyy{}~~~}||}~~~~~~}{yvtuwyzzzz{|~|{{|}yvuuvwyzz|}~~~}||~~~}}|{yxxxz|~}{zz|~}|||}}|zz{{zyxwwx{~}{zyyz{{zxvssuwxy{|~~~~}~|zyyzzzz{}~~}|||}~~~}{zz{~~{yxxxyzz{{|~~|zzz|~|zyyyyyyz|}}|{{{|~~|||||{zxwwwy{}~}{yxxyz{|}~}}}||~~|zxwvvvwy{{{{{|}}~}ywuttuvvwwy{~~}|||||}~}|||~}||}}~}|zyyy{}~~|zyxvvvwxz}~}|}~|zyxwuuuxz}~~~}|}}~~|ywvvwxyyyy{}~}{z{|}}|{zzz{}~~~{ywvvwxyzzyyyxvutvx{~~~|zxxy{|}}}}~~}||||}}{yxxxyxwvwxz{|}~~~}{xwxz{||}}}~~}|zxvtttuvwxy{}~~|zxxy{~{xvuvwxxyz{}~}ywuuuuutstuwyz|~~||}}{{|}~~~}|zyxwwxxyzzz|~~|ywuvx|~~}}~~}}~~~~~~|zwvvvwxy{}}{z|~~{ywvvwwwwwxyz{|}~~~}|||||||~~~|zxwwwwvvuuwy{{zywvvy|~{yyz|~~~~~~}}~}|{{zyz{|}{{{|~|{zzyxwwwxxwwxy{~~}|}}{zyyyz{|}yvutttuutttvy{}~~}||}~}zyxy|}|ywuuvx{~~|zywvtsstuuuuvx{}{yyz{~~||}~|ywvvwxxxwwxyz{|}}}}||{||}~~|{{}}}|}~~}}~~~}}}}{ywvvwz~}{zzyzz{{zyxvuuwxxxxyz{~~}||}~~|{{|~|zyxxxwvuuuvvvwyz|}~}||}~~{yxxyz{|}~~~||||}~~~~{zz{~~}{yxy{}~~}{yxxyxxwwvwy|~}}}|}~{yyz}~{xvvuutssstuvvwy|~|{yxxyz{|~{yxxz|~|yxy{}~~|yvuuuutttuwy|~}|{{zyyz}~}~~~~}{yxxxwwvwxxyxxxy{~|{{}~}}|{{|~~}|{{|}~~~}|{z{|~~yvttuxz{{yxwwwwwwxy{}~~~~~}||}|{ywvvwwvuttuwz}~||~~}|zxvvx{}~}}|{{{}~{xvuvx{}~~}}|zyxxxxy{|}}~~~|{{|~~~}{ywusstuuutuuwz~}|||||{zxwx{}~}|||~~{yxwxz{|||{ywvttuwy{|}}~~~~~~~}|zyyz{|}}{zyz{|}|zxwvwxxxxxxy{}~|{{}~~~|{{||~~|||||||}~~~~|zxvuttuwy{|{ywwwy{}~|{z{|}~~~~~~~~~|zz|}|zyyxxwvvvwxy{|}~~}}~~|zyxxxxz|~||}~|{{||}}~~|{zzywvuvw{~~|zzz|}~~}}||}~~}}}}|{{}|{{{}~~}{yxwvutttuwy{|}~~~}|||||||{{{zzyz{}}{z{}~}|}~~~}zxvvx{}}|zxxxyz{||||}~}||}~~~~}}}}}{zzz||ywvwxz{|{{zzyxwxxz|~~~~|{{|}~~}}|}}~~|{{|}~~}|{{|}~~}}|zwusstvy{{{{{|}~~{yxxz{||}~~~~{zyyz{}~}{yxxxy{|||{zz|~~}~~~~~~|{yxwy|}{z{}~~~~}|{|}~|{{{{|{zxwvvwy{~~~}}~~}}|}~~|{{|}~~~}~~}|{zzz{}}}|zwvuvxz{||||}~~}|||||}||{zz{|}}|{{z|~~|zz{|~}|{}~~~~~}|{yxwxz|~}|{{{|}~~}}~~|||{{|}~~~}}}}~~|{yxwvvwz|}}|{zz{|~~{xwwxz|}}}}}~~~~}}}}}~~~}|{zywuttvy}~~|zyxwxy{}~}}||{zyxz|~}}}~~}}|||||||}~{yxy|~~~~~}}}}}}~~zxy{}~}}~~}||||{{{{{||{zxwxz~~}||||||}}~~}|{z{}}{yyy{|}}}||{{{|||||}~~|ywxy{||{{{{||||}~~}~}zxy|}||{{||}~~~~~}zyxy|}}}}}||}~~~~~~~}{zz{||}}~~~|zxwvwwyz|~~~~}yvttvxz{||~~}}}}}}~}}}~~}}}}}|zywwwz}~|{{{}~}zxwxxy{|}~}|||}}~~}|{zzzz{|~~}}~~}|{{{|}~~}{yxxz{}~~}}{zyz|~~{yyy{||||{z{||}}}||||}~}}}}|zxwwwy{~~}|||||}~}|}~~~}|zzyz|~||}}~~}~~~}zxwwxy{|}}|||}}|{{|}~~~~~}{zz|~|yvvwy{|}~~~~~~||||}}|{zyyz{}~|{zz{}~}}}~~}||{zyxwwxz~~}|{{||{ywttuwz|}~}{{{|}~~}}~|zyz{}~~~}}}~~~}|{|~~|zyyyyz{|}}~}{yxxxz}}zxxyz{{{{||}||{z{|}||||{{zyxyz|}~}{xwxz}~~~~{yy{~|zxxxyyz{{|||||}~}|zxwvuuvwxy{}}||}|zyz{}~~}|{{|~~}|}}~~~}|{z{}~{xwwxyz{|}~~}||{{z{}~~|{}~{xwvvwxy{}~~~}|{yxwwxxyzz{|~}||}~}||||||}}}}|{zyz{|~~|zyxxxz{|{ywvuvwy{}}|||{{{{}~|{zyy{}~~}|}~|{zyyyyyxxxz|~~~}|{{|~~{yxwwxy{|}}}}}}~~}||zywvuvwxz|}}}|zyyz|~~~~~~~~~|zwvvwy{|||}~}zxwvvvvuuuvwz|~~~~~~}{zyz{}~}}}|{zyyyyz{|}~}{xwwx{~~}{zz{{|}~~~~}|zwvuvxz|}~}~~{xwvvwxxxxxy{}~~|zz{||}|||}}~~~~~}{zyxxxwwxxz{|{ywvvx{~|||}~~~}|{{|}}~~}~|zyyz{|~}|}}{zzzzyxxxxyyz{|~}}~}zxwwxyz{|}~|ywvuuuuuvvwz|~}{{{~~|zzz|~~|zxwwwxz|~}{yxwvuttuuvwwy{~~|yxxz|~}{zz{{|}~|zxxxxxyyyyy{}}{z{|~~||}~~}}||{{|}~}}}}~~}|{zxwwwxz}~}}~~~}|zyxwwvvwxyyzz|}}{{{|~}|{{{|}~}{zyyyxxwvvwyz{|||{{{|}|yxxy{|}}}}}}}}}}~|{{{|}~~|{z{|~}||}~~|{zyxyyyyxxyz|}|{{|}~~}{ywwxz}}zxwvvuuttuvwyz|~~{yxwxy{}}{yxxy|~~}~}zxvuuvvvvvwx{~~|zyxxxxy{~}|{{}~}{yxxxxxxxxyz{|}~~}}~~}{{{||}~}}~~}}||||}~}|{yxyz|}zxxy{|}|{ywwwxxyyz{|~~~~~}|{{{{z{{}}||~~~~~}|{zxxwwwwwwxz|~}}~|zyxwwxz|~~~~~~}|{{{{{|}~~~|zxwy{~~|{{zzyyyz{|}~}|{zyz|~}{z{|}}{yxvuttuvvvwxz|}|{zyxwwxz}~~~~~~}}}}}~|zzz|~~|{yxwvvvwyz|~~}|{{zyxwvvxz|~~~~~}}}}}|{zyxwxxyzzzz{}~~~~}{zzz|}}|{||}}~~~~~~~~|ywvvwyz{||{zyyyyz|~~}|{zzz{{{{zzyz{}~~~}}~~~|{zyyyxxxxxz|~~|ywvvwxz|}~}~~~}|{z{{|}~}{yxwwxy{}~|{{|}~~~~~}||}}~~~}|{{zzz{|~~~~~}}~}zxwwvvvvvwy{}~~}}||{yxwwxy{}|{z{|~}}~~}|zyyz{}~}{zyyz{|}}}~~|{{{{{{zyxxxwwxy{~|zyxyz{}}}|{zzzzyzz{|~}}}~~~}||{{{|}~||~~~}}|}}~~|zxvuuvx{|}}||||~}zxwwxxyyyzz{{{{{|}}|zyyz{}~|{zzzz{|}}~~~}|{zywwwy|}{yz{|}}}}|||||}~~}||{zywvvxz}~{zzz{{||||}}}|{zz{}~|{{{|}}~~~}|{zxwwxy{|}~~~~~}}}||{{{{zyyyz|}zxwxz{}~~}~~|zyyy{|~~~}}}~~}|{zzzyyyyzyyxxxy{~|zxwwwxxy{|}~}||{{|}}{zzz{{|}~~~~~}||}}|{{|~~~~~}{ywvvvwy{}~{yxwvvvwxyz{{|||}~}|zyxxxxyz{}~}~~~~~~~~~|{|}~}|{zyz{}~|zxxxy{}~~~~~~~~}}}||{zyyxxxyz}~~~}|{zzyyz{|}}}}}}}~~}||{{zzz{}~~}||||}}}}~~~{zz{{|||||||}}|||{|}~~}{zxwwxz}}}}}}~~~~~~~}|{zz{}~~~}{zyxyyyzzzzz{|}~~~}|{zyxwvuvxz|}~}ywvvwyz{|}~~|zz{}~}}|{yxwvwz}~|zxvvvwxxyz{}~~}{zyyyyyxxwwxy{|~~|zyyz{}}~~~}}~~{yxwxy{|~~}|{{|||||{{{|||{zyz{}~~~}}|||}~~~~}{zzzz{{|}~~}||{|||||{zzzzz{|}~~~}{zyyyyz{|}}}}}~~~~~~|{yxwxyz}}{yxxyz{}}~~~}}|}~~~~~~~}}}}~}|{zyyyyz{}~~~~~~}|{{{{zyxwvvvwwy{}~|ywvuuvxz|}~~~~~~}|{|}~|{{{|}~~}|{{z{{|~~}}}}~~~|{zyxwwwxz|~}zxxwwxxxwwwxxyyz|~~~~~~~~~}{zyxyz|~~~~~|zxxxz}|zyyyzzzz{{||}}}}}~~}|zyxxyz{|}}~~}}|{{{}~|zyyyz{{{{{{{{{zz{}~{yxwxyz{|}~~~~}}}}}}|{zyyz}~{xwvwwxyz|}~}{zzzz{|}~~}{{{{}~}|{{zzzyyyyxxwwxy{~~~~~~~~|zxvuvwxz|}~~~}~~~~~}}~~|{zzzz{|}~~}}}~}|{{{{|||}~~~~}{zzz{|~~{yxwwvvwxyyyyyz{|~~}|{zz{|}~~}|zzzz{|~~}}~}|{{|~}{zxxxxyz||}}~~|zyxxxxxyy{|~~~~~}{zyyyyz{|||||||}~~~}}|||}~}|zyxyz{}~}}}~~~}}}~}|zywvvwxz|}~~|zyyyyzz{{|~~~~~~~}{zyyzzzzzyyz{{|}~~}|{{||}}}}}|zyxwxy|~~~~}}~~}|zyyz{|}~~~~}||{{{zzz{|}~~~~}{yxwwxxyyzz{|}~~|zyyyyzz{|}~~}{{{|~~}}||}}~~~~}{yxxxyz{|}~~|{zyxxwwxyz|}~~}||{|}~}{zyyzz{{|}~~|{zzz{{|}}}{zz{}~}}~~|{yxxxxyz|}~~~}{{zzyyyz{|}~~~~~~}||||}~|{{zzzz{|}}~~}}~~}||{{{{{{|}~~}|{z{|~}{zz{|}~~~~~~}|{{zz{|~~}}}~~}|{zz{{{||}~~}|||}~}|zyyxyyz|}~}|zzyyyyyy{|~~~}{zyyz{}~~}|zyyyz|~}|zyyyyyyz{|~~|{zyyz{|}~~}|{{{|}}|{{{zzz{|}~~~~~~}{{{{|}~~~}|{zyyz{}~}}}}~~~}{zzzz{{{|}~~~~~~}|{zzzz{|}~}|{{|}~~~~~~~~~}|{{zzz{|}}~~~~~}|zyyyz{|}~~}|||}~~}|{{|~~}}|||{{||}~~}||{{{{{|}~~|{{{|}~~~}|{zyyyyz{|}~~|{zyyyyz{}~~~~}|{||}~}|{|}~}||{{zzz{}~~}|{zzyyyyyz{}~~~~~~}|{{zz{{|}~~~~~}|{{zzz{|~~}}}|}}~}{zyz{|~~~}|||{|}~~~}|{{zzzzyyyyz{}~~~~~~}~~~||{{{{{||}~|{zyxxyz|}~|zyyyz|~~~}}}}~~}}|{{{{{{zzzz{|}~~~~~}|{{zzz{{|}~}}|{zyxxyz|}~}}}}~~~~~~|{zzz{|~~}}||}~~~}|{zzzzzyxxxyz{}~~~}}}}}~~}|||||||}~~}~~~~}|{zzz{{|~~}}}}~~~}{zyyyyz|~~~~}|zzyyyyyyyyyzz{|~~~~~}}}|||}~~~}}||||}~~~~~}{zzyyyz{}~}|{{|}~~|{zzyyyz{}~|{zzzzzzzzzzzz{{|~~~}}|||}~~}|||||}~~~~~~~~}|{{zzyyz{}|{zz{|}~~~~}|{zzyz{}}|{zzzzyyyyyyyzz{}~}|{zz{{|}~~}}}}~~}}}}}}}~~~~~~}}||{{{{|}}|{z{|}~}|{yyxyz|}~|{zyyyyyyyzzzz{{}~~~~~}|{{zzz{{}~~~~}|||}}~~~}}|{{zzz{}}{zzz{|}~~~~}}|{zyyyz{|~}|{{zzyzzz{{{{{{|~~~~~~}}|{{zz{{|}~~~~|{{{|}}~~}}}}}||{{{{|}}{zyyz{|~~}}~~~~}|{zzzz{}~~}|{zyyyzzzzzz{|}~~~}}|{zzzzzzz{}~~|zzzz{|}}}~~~~~~}}||}}~~|{zzz{}~~~~~~~~}|{{zyyyz|~}|{zyyyyzzzz{{|}~~~}||{zzzyyyzz{|}~|{zz{{|}}~~~~}}||}}~~}{zyyz{}~~~}}}}}}~~~~}}||{{zzz{|~~}|{zzzzz{{{||}~~~}|{{{zzzzzzz{|}~}{zzzz{||}}~~~~~}}~~~~~~}|zyyyz|}~}||{||}}~~~~~~}}||{z{|~}|{{zzzzz{{|}}}~~}|{{{zzzzyyyyz{|~~|zzyyzz{|}~~~~~~|{zzz{|~~}|{{||}}~~~~~~}}|{zz{|~~}|{zzzzz{{|}~~~~|{zzzzyyyyyyz{|}~~|{zzzz{|}~~~~~~~|{zzz{|}}|{z{{|||}}}}}}}}||{||}~~~}}|{{{{||}~~~~~~~|{zzzzzzzzzzz{{|}~|{zyyz{|}}~~~~~~}|{zzz{}~|{zzzz{{|}}~~~~~~}}}}}~~~~~~}|{{{||}}~~~~~}|{zzzzyyyyzzz{{}~~|{yyyyz{|}~~}|{{{|}~|{zzzz{{|}}~~~~~~}}}}}}~~~~~~~}|{{||}~~~~~~|{zzyyyyyyzzzz{|~~}{zzzz{|}~~~~~|{{{|~~|{zzzzz{{|}~~~~~~~~~~~~~~}}}}~~~}}}}}~~~~~~}|{zzzyzzzzzz{{|}~|{zzzz{|}~~~~}|{{|}~}{zzyyyz{|}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~}{{zzyzzzzzz{{|~~|{zzzz{|}~~~~}}}}~~}|{zzyzz{|}~~~~~~~~}}}~~~~~~~~~~~~~~}{zyyyzzzzz{{|}~~~~~}{{z{{}~~~}}~~~~}}~~~}{zyyyz{||}~~~~}}}}}}~~~~~~~~~~~}|{zzzzzz{{{|}~~~~~~}{{{{|}~~~~~~~~~~~}|{zyyzz{|}~~~~}}}}}~~~~~~~~~~~~~~~}|{{{zzzz{{|}}~~~~~~~~|{{{|}~~~}}||}~~~}|{zzzz{{|}~~~~~~}}}}~~~~~~~~~~}}~~}|{{zzzz{{|}}~~~}}}~~~~}}||}~~}}|{{||~~~~~~}|{{zzzz{|~~~~~~}}}}}~~~~~~}}}|||}~~}|{{{{{|}}~~~~~~~~~~~~}}}}~~~}|{{{|}~~~}|{{zzz{|~~~~~~}}}}~~~~~~}}}}||{||}~}|{{{|}}}~~~~~~~~}}}~~~~}}~~~|{{z{{|}~~~~}|{{{{|}~~~}}}~~~~~~~~~~~~~~}}||{{||}~~||{{||}}}~~~~}}||}}~~}{zzyyzz{|~~}}}}~}|{zz{{|}~~~}}||||}}~}|{zyyyyzz{}~~~~~~~~~||||}}~~~}}}}}}~~~~}}|{zzzz{|}~|{zzz{|}~~~~}}}~~}|{zzyyyxxyy{|}~~}||{{{{{{||}~~~~~~~}}}~~}|zyxxxyyz|}~~~~~~~~~~}||{zyyyz{}~~~~~~}}}}}}}~~~}|||||||}~}||{zz{{|}~~}|{zyxxxwwxyz}~}{zz{||}~~}|{{{{{|}~~~~~~~~}||||}~}|{zyxxxwxxz{}~~}}}}~~~~~~~~~~~}|{{{||}}}}}}~~~~}}|}}}~~~}}}}}||}~~|zyxxyz{{|~~}|{yxxxxxxxyz{|~~}||||{{{{|||}~~~}}~~~|{yxxxxyzz|}~|{{{|}}}}~~~~~~}|zyyxxxxz|~~}}}}}}|}}}|||}~~~}}}}}~~~}}}||||}~~}|{{{zyxxxxxxyz|~~|zyyyyz{}~}||||||}~~~~~}}}}}}~~}}|{yxwwxxxxy{}~}|{z{{||}~~~~}||{zz{{{{{{|}~~}}|}}}}}~~}}}~~}}}~|zxwwxyz{|~~|{zyxxxxxwxyz|}~~}|||{{z{{zzz{|~~}}~~~~~~}|{yxxxyz{|~~}{zyzz||}}~~}}}|{zyyyyxwwy{~~}|}}}}||||}||}}~~}|}~~~~~~~~~}}~~~}|{zzz{zyyyyyyxxy{~~|zyxyyyyz|~}}|{{{|}}|||}~}|||||}~~~}}|zxxxxyyyyz|~~}{yyyz{{{|~}|{yxxyzzzz{|~~~~}}}}}}~~}|||}~~~~~~~}zxwwxyzz{}}}|{zxxxyxxxyz|~}||||zyyzyyyyz}}}}}}}||}~~}}~~~~|zyyy{{||~~}{yxxyz|}}~~|{z{{{zyyzyxxxxz}~}}~~~}|||}}||}~}||}~~~}|||}}|}~}}}||zyyyz{{zz{{zzyz|~~|zyyyxxxz}~}}|{z{{{zzz{}~~}||}}|{|~~~~}}{yxxyyzzz|~~~}}|zyxxyz{{{}~}|zxxyyyxxy{}~}~~~~}{{{}}}~~~~}}~~~}}~~~}zyxxyzzz|~}}|{yyzzyxxy{~~||{{yxxyyxxxy{~}|}}}||{{}~}}~~|{{{|}||}}{xwxy{|}}~}{yyyz{{zyz{{yxxy{~~}}~~}||}~}}~~|{{}}}|{{{||||~~}}}|{yxxyz{|{{|}}|{{|~~~}{zzzyxxy{~~~}{yyzzyyyy{}~~~}|}}}|}~}zyyz{}}||~}||}}|zxwxyz{{{}~}}|{ywxyyxxy{}~~~~|{|}}|~~}~~~}|{{}}|||~~~}{yyyz|||}~~~~~|{{{{zzz{}~|{{{zyxyyyxxxz}~}}~}}|zz|}}|}}|||}~}|~}zxxy{}~~~}}}|zxxxyz{{z{||zzz{}~~~~~~~~}~~~~~|{z{}}||zz|}|{|~~}}}|{xxxy{}||}~|||~~~~~|{||zyxy{~}}}{xyzzxxxy{~~~}}~~}~~}~~|{{|}~}|}~~||}}||yxxxz{|{|~~~}{yyzzyxyz}~~~~~~~||}~}}~|}~~}|zz{||{|~}{{{|}}||}}~~}|||~~}|{|{yxyzzyxyz}~}~~}{z{}}|}~}}}~~}{}~}~~|zzz|~~~~}}~}|zxwxyz|{z{}}||||}~~}~~}~~}~~}|{{}}}|{z{}}{|~~~}zxyz{~~}}~}}}~~~~}}~~|{{{}~}}}}zyyzyxxxy|~~~~~~}}~~}|}~~|}~}~~}|}}}}{yyyz|~}}~~~{z{{zyz{|~~||||~~~~~~~}~~}|~}}{zy{|{{|~~}}|}~~}|~}}}~~~}|||{yz{{zyzz}~~~~}{{~~}~}}}~~|{}}|{{|}}|||}~~}~}~~}|zxxxy{}|{}~}}|~~~}~~~~}||}~~}||~~~}|{|~~}}~~~|z{{|~~}~}}}}||~~}~}||}~}}~}|yz{{yxxy|~~~}~~}}}~~}~||~}|||}~}~~~~|zz{|~~}~~|~~}{{{|~}~~~}zyz{}}~}~}}|~~~|zz|}|{}~}}}~||~~}~~~}~~}~~}~~~}~~~|z|}}{{||~~~~~}~}~}}}}~~|y{|{yyz{~~}}~}}~}~~~{yyyz}~}|~~}}}}~~~}~~~~~~{zz{}~}~~}}}~}~~~~}|||~}~~}}|}~}|zz|~||}~~}}~~}}~}{{}|zyzz}~~}{||~~~}~~}~{|~}{zzz}}|||}~~}|||~~~||}}}|zxyy{}~}}~~~~}}}~~|{|~}|}}~}~}{}~}{{|}~~}~~|{|~}{|~}~}||}~~~~}~}}||}}{xz{zyxyy}~~~||}~~~~{{{{}~|~~}}}~~|{|~}~~~~~}zyyy{}}|}~~~~~~}}}|}}|~||{{}}||{yy||{{~~}~~}~~~~~|~~|{{{~}~~}zyzz|~~~}~}z{||zyyy{}}}}~}~~}}||}}~{{|}||{xxxy{~~|~~}}{||}~~~~~}}}~~}}|}~{z||{yyz|~}}~~}{z{}|z{~~}}}~~~~~}~|{{z{||yxz{yxxyz~~~~{{}}|{||~||||~~}~~}}|~~}|zy{}|{}~|}~}}|yyyy{}}|}~~}}}}~~~~~|}~~|{}~}zzzy|}||{yy{|{{}}}~~|{|}~~~~|||~~}~||~}}|zxyyz}~~~}}~}zz||zxyyz~~~}}~|~}|}}~}||~~}{{}}zz{|||{xxyy{~~}~}~~}}{yz{|~}~~}~}||{|}}zy{{zxxy{~}|}~}}}zy{}{z|~~}}}}|~~||~~~~|yzyz{|zxz{zxxyz}~~}zy{|{yz{}~}}}~|~|{{z|~}}{yy{|{{}||}~}}{xyyy|}}|~}~|{{{}~~~|}~|yz||zyyyz}|||zy{}{{}}}~~}}{yz}}||}}|~}|~|{{}}||ywxxz}~}~~}|}~|yz|{yyyy|~~}~|{}~|z{{|~}|}~}}|zz{}{yz|}||zxyy{~~~~|}}||{xyyz}}}}}{{zz||zxz{zxxxy}~}||~~}}{z{}|{|~}}|}{{}~}|~|{|}|}{xyxy{|zyz|{yyzz~}}~}zy{{zxyz{~~}~}{|~}{yzy{}|||yxz|{z|~|}~}}}zyyy{}~}~}}~~~|zzz{}~}~}|}|yxz{zxxxy|}}}|z{}~|}~}|}~}}|zyz}|{}~}|~}{{|}{z{||||yxxxz}~}~~}|}~|zz||zyzz|~}}~~{z{}|zzzz~}|{}}||{yz||zz|}}}|zzz{}}}|}}||zwxyz}~~}}~~}zyyyz{{yxz{zxxyz~~}|}~~~|{|~}|}}}{}~~~}{z|~||}}{{|||{yxxxz||zz|}|{{{|~}|}~|yyzzyxyz|~}}~~|yz|{yxyx{}|||zy{}{{}~}}~}{zz{}~||}~}}|yyyz}~~}~||||yxy{zxxyy|~~~}||}}~}||~~}|zyz}}{|~}|}~}}|zz{}{yz|}}}zxyyz}~~~~~}~~~{{}}|{{{}}|{|}{yz|{zyzz}~}|{}}||zyy||{z|~~|{{|}}~}|}~}}zxxyz}~||}}}|yxxxy{{yy{|zyyz{~}}~}|~~~|{{}~}}|z{}~||~|{||||zxxxy|}|{}~~|{||}}|}~}zz{{zxyz|~}|}}zxz{zxxxx{}}}|{z|~}|~~~|||}~~||}}}}zyzz{~~~~}|}}{xy{zyxyy|~}}~~}}||~~~|z{}}|}}|{|}}||zy{|{z{}}}}{yzz|~~~~~~~|}}|}}~}||}|zy{|{yzz|~}|}~}}|zz{}|{}}|||}}}~~~~}~~~|yyzz}~~||}}||ywxxy{{zy{}|{{{|~~~~~||{}~}}|{{}~}}}|}~}}{xyyz|~}|}~}|||~}}}}~~|{||{zz{|}|{||{xyzzxxxxz}}~~||~~}~~~}}}~}|}~~~|zzz{}~~~}}~}zy{{zyyz{~~}}}}}}~~}}}~}|}~}~~|{{|}}|{yy{|{z{}~~|{{{}~}~~}}}~}||}}{z{||{z{|~}}}~~|{|~~}}}|||}~}{|~~}|||~~~}{{{|~~~}||}}|{yxxxz{|{{}~}||||~~~~}|{}~~~||~~~~~}{zz{|~~}}~}|||~}}~~~}}}~|}~~}{{{}}||{||zxyzzyxxy|~~~~~~~~~~~~~~~~~}~}{{|}~~~~~|{|}|{{{|~~}~~{z{{}~~}}}}}~~~~~~|{{|}}}|zz{}|{|~~|||}~}|~~~~}}~~}{|}}|||}~~~~}}~}}||||}|zz||{z{{}}|||~~}}||}}}|zxyy{}}||~~|||}~~~~}}}~~}}}~~~|{{|~}|~~||{{}~~~}{{}~}}~~~~~|||}}||{||{yz{{yyzz}~~~~}~~~~~~~~}}~}||}~}}}~}~~}|||~~~||}}}}zyyz{}}|}~~~~~~~~~}|{{}~~~}|{}~}}~~|||}~~||}~~}}}~~~}~~~}}~~}}}~~~~~}|{{{|{yyz{zyyz{~~}}}}~}|}~~~~}}~~~|zzz|}~}|~~}|||~~}~}{{{|~~~~~~}||}~~}|}~~|{zz|}}||zz|}||~~~}|}}|||}~|{{}}{{{{}~}}~|{{|}~~~~~|{}}|{{{}~~~~~}||}}}~~|{{|||{yxyy{}}|}~~~|||}~}~}|||~~}}~}~~||||}}{z||{{{|}~}~~}|}~}~~~~~~~~~~{zzyz{zxxzzyxyz|~}}}}|{|}}|||}~}|{|}~~}|~~||{|~~~~|{|~~~~~}zzz{}~~~~~~~}|}~}{{|}{zyyy{|||{z{}}||~~}|}~}}~~~}}}}~~|}~~}|||~~~}|}}}}{yzz|~~~~}}~}{z||{zz{}~~~~~~~~~}||~}||}}{z{|||{yxyy{}}}~~}}~~~|zz{|}~}|~~}}}~~~|{{{|{zxz{zzzz|~}|}~~~}|}~~}~~~~~}~~~~|zyxxyzywxyzyyyz|}}|||zyz{{zz{|~~}||}~~||}~}{{z{|}}|{{{}~}~~}~~~~{zzz|}~~~}}}}~~}||}|{yz{zyxxxz|||{z{|}}}~~|||}}}}|{|~~}~~~~~~}|}~~}~~}{{|||{yxyz{}~~~}|}}{zz|{zzz{~~~~}|~~}||}~}||}~~}|{{||{zz{|||zyyz{}~~~}||}}|{yyyz|}}}~~~~|zzyzzzxxyzyyyz|}||}~~~}||}~~~}~~~}|}}}|zxxxxyyxxyzzyyz|}|{{{zxxzzyyyz}~}}}}}|{|||zyyy{|||{z{|}}}~}~~~~|zz{|}~~~|{{|}~~}|||{zxyzzxxxxz||||{{}~~~}|{{|}||{z{}}}}~}||~~}|}}|{{{||{yxxy{}~~~~}|}}|zz||{{{{}~~}~~|{|}}|{{|~|{{|}}|{zz||zz{|}}|zzz{}~~~~|||||{zxxyz|}}}~~~}zyxxyzyxxyzyyyz|}||}~}}~~~}}~~}}~}|||||zxwxxyzyxy{{{z{|~}|{{{{yxxyyyyy{~~}||}|zz{{zyxxy{|||{z{}}}}~~~}{{{|~~~~~|{{{|~~~~|{{{zxxyyyxxxy|}}}}|}~~|{z{|||{zz{}}}~~}||}~~}|{{||{zz{||{zyyz{}~~~}|}}|{{|}|||}~}|}}{z{||{{{|~}|{{|}||{zz||{{|}~~}|{{|}~~~~}|||||zyxyz|}~~}}}}}|zxxxxyyxxyzzyyz|~}|}~~}||}~~~}}~}|||||zyxxxz{zzz|}|{||~}{{{{zyxyzzyyz{~}||||{yxyzyxxxy{||||{|~~~~|}}~~}~~~~}{z{|}~~~|{{{zyxxyyyxyz|~~~~~~~~~}|{z{}}}|{{|}~~~~|{{|}}||zz{|{z{||}|zyz{|~~}}~~}|}~~~}}~~}||||zz{||{{|}~|{{|}}||{{|}||}~}|||}~~}}~~}||}}|{yyz{}~~~~|||||{yxwxxyyyxz{{z{{}~~~}|||~~~~}}~~}|}}||zyyyz{|{{}}}|||}}|{{{{zyyzzzzz{~}|{{{zyxyyyxxxy{}}}}|}~~~}~~~~}|{{|}~}|{|{zyyzzyyz{}~}}}~~~}}~~}|{{|}~~}}|}~~}|{z{|||{zz{|{{{|}~}|{{{|~~~~~~~~~}||||{z{|||||}}|||}~~}|||~~}}~}|||}}}|}~~}}|}~~}~~~}|zz{|}~~~}|||||{yxxxyzzzz{||{{|~~}||~~~~~~~~~}|zzz{|}|||}~}|||}~||||||{z{||{{{}~|{zzzzxxyyyxxyz|~~~~~~~~}||}~~}}}}|zz{|{{{{|~~|{{|}}}||}}}|||}~~~~~}|{zz{||||{{|}|||~}|||}~~~~}}}}}|{|}}}}}~}}}~~}~~}||||||{{|||{{{}~|{||}~~~~}||||||zyyyz{|{{|}}|||}~}}}~~|{{|}}}||}}}|{{|~~~~}}~~~~}}}}~~}|}~}|||}}{{zzzzyyyzzyyz{~~~~~~~~~~~~~~}|}}}|||}~}}~~~}{zzz{||||}~~}}}~~~~}}}}|{zz|}}}|||}~~}~}|||}}}}}~~~~~~~~}}~~~~~}|{{{{{yyz{zzzz|~}|||}~}}}~~~~~~}}}}}}{zzz{||||}~}|||}~}}}~~~~}||}}}|||}|{zz{|}}}|||}~}}~~}~~~~~}}||~}|{{{{{zzz{{{{{|~~}}}~~~}}~~}}}~~~~}}|}~~~~~}||||||zyyz{||||~~~~}||}}}}||}}|{{{|~~~~}}~~~||||||{{|}}||}~~~{zzyzzyxxyzyyyz|~}||}||{|}}|||}~~~~~|{{||}}||}}}||{|~~~~~|||}~~~}}}}}|{{||{zyyz{|||{{|}}}~}|||}~~~~}||||||{{|}}|||}~}}~~~}|{{|}~~~~~~~|{|}}|||}}}|}~~}}}}}{{{|||{yyyz{|||}~~~~~~|{{{{|||{|}}}||}~}|{{{{{zyz{{{{|}~}~~~~~~~~|zyxxyyxxxyyyyzz|~}|||{zzz{{{z{{}~}||}}}|||}|{{z{|}}}}}}~}|{|}~~~~~}}|||{zzzzyxxxy{{||{{}~~~~~}|{{|}}}}|}~~~~~~}}}~~~}}~~}}|}}~~~~}|||}|{zzz{}~~~~}}}|{{{|||||~~~~~~~~}||}~~}||{||{z{{||{zyzz|}}}~}||}}|{zzz{||||}~~~}}~~|{zyzzyxxyzzzz{}}}}~~~~~}}}}|zxxxxxxxxyzzzz{}~|{{zzyxyyzzyz{}}}}}}|{{{|{zyyz{|||||}~~~}|||}~}}}~~~~}|{{zyxyyyxxxyz{||||}~~}|{z{||||{{}}~}~~~~~~~~}}|}~~}}}}|{{|||{zyz{|~~~~}}|}|{{{||||}~~~~~}|}}}}}}~|{{|}}||{{{|{z{||||{zz{|}~~~~}||||{zyyyz{|||}~~~}{zyxyyyxxxyzzz{}}}}}~~~~}||||zyxwxxyyxyz{{{{|~|{zzzyxwxyyyyz{}}}||||zzzzzyxxyz{||{|}~~~||}~}|||}~~~}|{zzyxxxyxxxxz{|}}}}~~~~}|{zz{||{{{{}~~~~}|||}~~}|||||{{{{||{zzz{}~~}}|}||{|}}}}~~~}}}|{|}}||}~~|{{{||||{{{||{{|}}}}|{||}~~~~~}|{{{{{zyyzz|}}}~~}}}}|zyxxxxxxxyzzz{|}~}}}}~}}~}||||{zyxxxyzzyz{||||}~~|{zyyyxwxyyyyz{}}||{{zyyyyyxxxxz{||||}~~~~~}||}}~~|{zzzyxxxyyxxy{|~~~~~~}}}|{zzz{{||{{|}~~~~~||{{|}}|{{{|{{{{|||{{z{|~~}}}}}}|}~~~~}}}||{{||||}~~}{{{{|||{{{|}||}~~~}||}}~~~~~~~~~}|{||||{zzz{|}~~~}||||{yxxxxyyxxyz{{|}~~}~~}}}~~}||||{zyyyz{{{{|}}|}}~~|zzzzyyxxyzzz{|~~|{{zzyxxxyxxxxy{|}}}}~~}|}}}|{zzzyxyyyyyz{}~~~}}}}|||||{zzz{|}}||}~~~~}|{zz{|||{{{||{{||}}}|{|}~~~~~~~}}|||{{|}}}}~~}|{{|}}}|||}~~~~~}|}}}}}}}~~}}}~~~~~~}||}}}|{{{|}~~~}||||{{yxxxyyyyyz{|||}~~~}}}~~}}}}}|{zz{{||{|}}}}}}~~}{{zz{zzyz{{{{|}}{zzzyyxxxyyxxyz|}~~~~~}}~~}|{{{zzzz{{{{|}~||||||{{{||{{{{|}~~~~~}}}}|{zzz{|||{{||}||}~~~~}||}~~}}}}}||}}~~~~~~~}|||}~~~~~~}||||||{{|||{{|}~~~~~~~~~}|||}}~~~~~~}|||||{zyyyzz{z{||}}}}~~}}}~~~~||{||}|||}}}|||}~~~~~~~~}|{{{||{{{|||||}~}{zzyyyxxyyyyyz{}~~}}}}|{{|||||}~~~~~~}|{z{{{{{{{|||||}~~~~~~}||||{zzzz{|||||}~~~~~~}}}}~~~~~~~~~~~}~~~~~~}~}|{{{{zzzz{{zz{|~~}||}}}}}}~~~~}~~~~~}|||}}|{zzz{||{||}}}}}~~~~}||}}}|||||{{{{|}}}}}}~~~~~~}}}}}}}||}}}||}~~|{zzzzzyyzz{{{{|~~~~~~~~~}}}}}}}}}~~~}}}}}}|zzzz{{{{|}}}}}~~}|||}||{{|{{zz{|}~~}}~}||||}|||}~~~~~|{zzzzyyyyzzzz{|~}||||||{||}||||~~~~~}~~~}|{{{||||||}}|||}~~~~~}|||||{{{{{zzz{||}}|}}~~~~~~~~~~}}}}}||||}~~}|{{{{{{{{|||||}~~~~}}}~~~~~}}}~~~~~~~~~}}||}~~~}}}}||||||{zzz{||||}~~~~~~~~~~~||{{|||{{|||||||~~}|{{{{{{{|||}}~~~~~}|{zyyyyyxyyzzz{|}~}|{{{{zzz{{{{{|}~}||||||{{{||{{{|}~~~~~~~~}|||{{zzzzzyyyz{||}}}~~~~~~~}}}}|{{{|}~~~~~~~}|||}|||||||||}~~~~~}}~~~}}||}~~~~~~}}}}~~~~~~~}||||}~~}}}}}}||||}|{{z{{|}}}~~~}}}}}}|{{{||||||}}}}}~~}|{zzzzzzz{|||}~~~~~~}}}|zyyyyyyyyzz{{{|}~|{{zzzyyzz{{{{|}}|||||{{{{{{zzz{|}~~~~~~~}|{{{zzyyzzyyyz{|}}}}~~~~~}}}||{z{{|}}}}}~~}}}}}}|||}}||||}~~~~}~~~}}}}}}}|||}~~~~~}}}}~~~~~~~~~}}|||}}}}}|}}}|||}}}|{{{||}}}}~~~~~}|}}}|{{z{{||||}}~}}~~~~~~}|{zzzzzzyzz{||}~~~~~}}}}|zyyyyyyyyz{{{{|}~|{zzzzyyyzzz{{|}~}|{{{{zzzzzzzzz|}}}~~~~~}|{{zzyyyzyyyz{|}}}~~~~~~~}||||{{z{{|}}}}}~~~~~~}}|}}|||||}~~~}}}}}}|}}}}}|||}~~~~~}}}~~~~~}}~~~~~~}||{|}}}}}}}}}}}}}}}||{||}}}}}~~~~~~~}}||}||{{{{{|||}}~~~~~~~~~}}|{zyyzzyyzz{||}~~~~}}}|{zzyyzzzzz{{{{|}~}|{zzzzyyyzzz{{|~~|{{{{zzyzzzzyzz|}}~~~~~}|{{{zyyzzzzzz{|}~~~~~~}}}}}||||{{z{{|}}}}}~~~~~~}}||}||{{||}}}}}}}}}}}}}}}|||}~~~~~~~~~~~~~}}~~~~~~}||||}}}}}}}~~}}}~~}}|{||||||}}~~}~~~~}}}}}|{{{{||||}}~~~~~~}}}}}|zzyzzzzzz{{||}~~~}}}|{zzzzzzzz{{{{||}}|{zzzzyyyzz{{{|~}|{{{zzyyzzzzzz{|}~~~~~}||{{zzzzzzzz{}~~~~~~}}}}}|||||{{{{|}}}}}~~~~~~~}}||||{{{||}}}}}}}}}}}}~}}|||}~~~~~~~~~}~~~~}}|}}~~~}}~~~~}~~~~}|{{||||||}}}}}}~~~}}}}||{{{{||||}~~~~~~~}}}}}|{zzzzzzzz{{|||}~~~~}|{zz{{{zz{{{{{|}~~}|{{{zzyzzz{{{|}}|{{{{zzyzzzzzz{|}~~~~~}|||{zz{{{{{{|}~~~~~~}}|}}|||||||{{||}~~}}~~~}}}}}|||||{{{|}}}}}}}~~}}}~~~}||||}}~~~~~~~~}}~~~~~~~~~~~~~~~}}|{{{{{{{|||||}}~~~~~}}|{{{{||||}}}}}~~~~}}}}|{zzzzzzzz{{|||}~~~}|{{{{{{zz{{{{{|}~~}|{{{{zzzz{{{{|}~}|{{{{zzzzzzzz{{|}~~~~~}}||{{{{{{{{|}~~~~~~~~~~~}||||||||||||||}~~~~~~~~~}}}}}}||||||{{|}}~~}}~~~~~~~~~}|||||}}}~~~~~~~~~~~~~~~~}|{{{{{{{{{|||||}~~~~~}|{{{{{{{||}}}}}~~~~~~}|{{zz{{zzz{{{||}~~|{{{{{{zz{{{{{{|}~~~}||||{{zz{{{{{|}~~}||{{{{zzz{{{{{|}~~~~~~~}}||||{{{{|}~~~~~~~~~~~~~~}}||||||||}}}||}}~~~~~~~~~~~~~~}}}}}||||||||||}~~~~~~~~~~~~~~}|{{||||}}~~~~~~}|{{z{{{zz{{||||}~~~}|{{{{{{{{{|||}}~~~~~~}|{{{{{zzz{{{{||}~}|{{{{zzzz{{{{{|}~~~~~}||||{{{{{{{{{|}~~}|||{{{z{{{{{{|}}~~~~~~~}|||||{{||}~~~~~~~~~~~~~~}|||||||||}}}}}}~~~~~~~~~~~~~~}||||}|||||||||}~~~~~~~~~~~~~}}|{{{{||||}~~~~~~}}|{zzzzzzz{{{|||}~~}|{{zz{zzz{||||}}~~~}|{{{{{zzz{{{{{|}~~}|{{{{zzzzzzzz{|}~~~~~}}|||{{{{{{{{{|}~~~~}||||{{{{{{{{{|}}~~~~~~~~~~}|||||{||}}~~~~~~~~~~~~~}|||||||||}}}}}}~~~~~~~~~}~~~}}||||||||||}|||}~~~~~~~~~~}}|{{{{{{{||}~~~~~~}}|{zzzzzzzz{{|||}~~}|{zzzzzzz{{|||}}~~}|{{{{{zzzz{{{{|}~}||{{{zzzzzzzz{|}}~~~~~}}}||{{{{{{z{{|}~~~~~}|||||{{{{{{{{|}}~~~~~~~~~~~~~~~~}}}|||||}}~~~~~~~~~~~~}}|||||||||}}}}}}~~~~~~}}}}}}||||||||||}}}}}}~~~~~~~}|{{{{{{{{||}}~~~~}}|{{zzzzzzz{{|||}~~~}{{zzzzzzz{{|||}~~}||{{{{{zz{{{{{||}~~}|||{{zz{{{{{{|}}~~~~~}}}}|||{{{{{{{|}}~~~~~}}}}}|||||||{||}}~~~~~~~~~~~~~~~~~~~~}}}||}}~~~~~~~~~~~~~}}||||||||}}}}}}~~~~~~~}}}}}}||||||||}}}}}}}~~~~~~~}}|{{{{{{{||}}~~~~~~}||{{{{{{{{||||}}~~~}|{{{{{{{{{|||}}~~~}|||{{{{{{{{{{||}~~~}}|||{{{{{{{{||}~~~~~~~~}}}}||||||||||}}~~~~~~}}}}}|||||||||}}~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}||}}}}}}}}}}~~~~~~~~~}}}}}}|||}}}}}}}~~~~~~~~~~~}}||||||||||}}~~~~~~}}||||||||||||}}}~~~}|||||{{{{||||}~~~~}}|||||{{||||||}~~~~}}}}|||||||||}}~~~~~~~~~}}}}}}}}||||}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~}}}}|}}}}}}}~~~~~~~~~~~~}}}||||||||}}}~~~~~~}}|||||||||}}}}}~~~~}}||||||||||}}}~~~}}}}|||||||||}}~~~~~~~}}}|}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~}}}}}}}|}}}}}}~~~~~}}}}}|||||}}}}~~~~~}}}}}}||}}}}}}}~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~}~}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~}}}}}}}}}}}}}~~~~~~~}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m40.bin b/applications/SprPoP/dist/MUS/m40.bin deleted file mode 100644 index 9f0761f..0000000 --- a/applications/SprPoP/dist/MUS/m40.bin +++ /dev/null @@ -1 +0,0 @@ -|vrpqty~}xurppqtx|{ywusrqqqppppppqqqstuwy|~yurpqsw{}yusqppqstuxz|}~~}|{zxvtsrqqqqrsuwy|~zxusqqqruw{~|zxvutsrrrqqqqqqqqqqqqqqqqrrrsstuuvwyz{}~~|{ywutsrrrrsuvx{}~}|{zzyyxxxxwwxwxxxxxyyyz{{{|}}~~~}|{zywwvutsssrssstuvxy{}~~~~~~~~~~~~~~}}||{{zyyxwwvvutttsssssttuuvwxyz{}~~~~~~}}}|||{{{zzyyyxxwwvvuuuttttttttttuuvvwxyzz{}~~~~}}|||{{{zzyyyxxwwwvvvuuuuuttttttuuuvvvwwxyyz{|}}~~~}}|||{{zzzyyxxxwwwwvvvvuuuuuuuuuuvvvvwwxxyyzz{|}}~~~}}}||{{zzzyyxxxwwwwvvvvvvuuuuuvvvvvwwwxxyyzz{{|}}~~~~}}||{{{zzyyyxxxxwwwwvvvvvvvvvvvwwwwxxxyyyzz{{||}~~~~}}}||{{zzzyyyxxxxwwwwwwwvvvvwwwwwwxxxyyyzz{{{||}}~~~~}}|||{{zzzyyyxxxxxwwwwwwwwwwwwxxxxxyyyzzz{{|||}}~~~~}}|||{{zzzyyyyxxxxxxwwwwwwwxxxxxxyyyzzz{{{|||}}~~~~~}}|||{{zzzzyyyyyxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~}}|||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{||||}}}~~~~~~}}}}|||{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~|zyyz}~}{zyyyz|~~}|{zzyyyyyyyyyyyyz{{|}~}{zyyz{}}{zzyyyz{{|}~~~~}||{zzzyyyzz{|}~~|{zzyyz{|}~}||{{zzzzzzzyzzzzzzzyyyzzzzzzzz{{||}}~~~~}|{{zzzzzz{||}~~~~}}}}}|||||||||||}}}}}}~~~~~~~}}||{{{zzzzzzz{{||}}~~~~~}}}}||||{{{{{zzzzzz{{{{||}}~~~~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{|||}}}~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{||||}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||}}}}}}~~~~~~~~~~}}}}}}}|||||||||||||||||||||}}}}}}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}||||||||}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~|vrpqty~}xurppqtx|{ywusrqqqppppppqqqstuwy|zurpqsv{}yusqppqstuxz|}~}|{zxvtsrqqqqrsuwy|~{xusqqqrtwz~}zxvutsrrrrqqqqqqqqqqqqqqqrrrrstuuvwyz{}~~|{ywutsrrrrsuvx{}~}|{zzyyxxxxwwxwxxxxxyyyz{{{|}}~~~}|{zyxwvutsssrssstuvxy{}~~~~~~~~~~~~~~}}||{{zyyxwwvvutttsssssttuuvwxyz{}~~~~~~}}}|||{{{zzyyyxxwwvvuuuttttttttttuuvvwxyzz{|~~~~}}|||{{{zzyyyxxwwwvvvuuuuuttttttuuuvvvwwxyyz{|}}~~~}}}||{{zzzyyxxxwwwwvvvvuuuuuuuuuuvvvvwwxxyyzz{||}~~~}}}||{{zzzyyxxxwwwwvvvvvvuuuuuvvvvvwwwxxyyzz{{||}~~~~}}||{{{zzyyyxxxxwwwwvvvvvvvvvvvwwwwxxxyyyzz{{||}~~~~~}}||{{{zzyyyxxxxwwwwwwwvvvvwwwwwwxxxyyyzz{{{||}}~~~~}}|||{{zzzyyyxxxxxwwwwwwwwwwwwxxxxxyyyzzz{{|||}}~~~~}}|||{{zzzyyyyxxxxxxwwwwwwwxxxxxxyyyzzz{{{|||}}~~~~~}}|||{{zzzzyyyyyxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~}}|||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{||||}}}~~~~~~}}}}||||{{{{zzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~}{yyy{}~|{yyyz{}~}|{zzyyyyyyyyyyyzz{{|}~}{zyyz|~~|{zyyyzz{{|}~~~}}|{{zzyyyyzz{|}~~}|{zzyzz{|~~}||{{zzzzzzzyzyzzzzzyyzzzzzzzz{{{||}}~~~}||{{zzzzzz{|}~~~~}}}}}|||||||||||}}}}}}~~~~~~}}}||{{{zzzzzzz{{||}~~~~~~}}}}|||{{{{{zzzzzz{{{{|||}}~~~~~~~~~}}}}}}|||||{{{{{{{{{{{{{{{{{|||}}}~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~}}}}}}}||||||||{{{{{{{{{{{{|||||||}}}}~~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}||||||||||||||||||||||||}}}}}}~~~~~~~~~~}}}}}}}|||||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||||}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}|||||||}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~|vrpqty~}xurppqtx|{ywusrqqqppppppqqqstuwy|zurpqsv{}yusqppqstuxz|}~}|{zxvtsrqqqqrsuwy|~{xusqqqrtwz~}zxvutsrrrrqqqqqqqqqqqqqqqrrrrstuuvwyz{}~~|{ywutsrrrrsuvx{}~}|{zzyyxxxxwwxwxxxxxyyyz{{{|}}~~~}|{zyxwvutsssrssstuvxy{}~~~~~~~~~~~~~~}}||{{zyyxwwvvutttsssssttuuvwxyz{}~~~~~~}}}|||{{{zzyyyxxwwvvuuuttttttttttuuvvwxyzz{|~~~~}}|||{{{zzyyyxxwwwvvvuuuuuttttttuuuvvvwwxyyz{|}}~~~}}}||{{zzzyyxxxwwwwvvvvuuuuuuuuuuvvvvwwxxyyzz{||}~~~}}}||{{zzzyyxxxwwwwvvvvvvuuuuuvvvvvwwwxxyyzz{{||}~~~~}}||{{{zzyyyxxxxwwwwvvvvvvvvvvvwwwwxxxyyyzz{{||}~~~~~}}||{{{zzyyyxxxxwwwwwwwvvvvwwwwwwxxxyyyzz{{{||}}~~~~}}|||{{zzzyyyxxxxxwwwwwwwwwwwwxxxxxyyyzzz{{|||}}~~~~}}|||{{zzzyyyyxxxxxxwwwwwwwxxxxxxyyyzzz{{{|||}}~~~~~}}|||{{zzzzyyyyyxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~}}|||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{||||}}}~~~~~~}}}}||||{{{{zzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~|zyy{}}{zyyy{|~~}|{zzyyyyyyyyyyyyz{{|}~}{zyyz|~~}{zzyyyz{{|}~~~~}|{{zzzyyyzz{|}~}|{zzyyz{|}~}||{{zzzzzzzyzzzzzzzyyyzzzzzzzz{{||}}~~~}}|{{zzzzzz{||}~~~~}}}}}|||||||||||}}}}}}~~~~~~~}}||{{{zzzzzzz{{||}~~~~~~}}}}||||{{{{zzzzzz{{{{{||}}~~~~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{|||}}}~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{||||}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||}}}}}}~~~~~~~~~~}}}}}}}|||||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}||||||||}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~yu}usxwz{{rut}y||wvvz|q{x|~zw{~~~~x|suxgnt~|zgxzhuv{zwvp~zlh{uh~powpw~}zw|q~m|vpnys}}pgqsj{{|~}pw~zqgt|gvzi}rsx{w{{wy{zogklvyi}p}t}{}w~so|zthl~omltvqu{v}{zqfiuvjr}jo{ox|uztwyiswsjhzwh}vl~rrvvy|gio|}l~sgq|}rlyrtuqynjvuofq~lqlwvqsxtwnglww{llw}}zhruoupsvgqvsji|xj~xmtqutz~~uv{jlryns|}|nlxpsspwpgtrnhtnsowzrrvs}zq{tinwwox~}zisvptrqxiltqkj{|j||mvrsuv}|wq}qmr|tqy||qjyqrtqswgnqniptmupurut|{ru{lou}qt}|{kpxpttpwrgqpliwntpv|truu}zzpw{os|}ptzyuhvuqttpypgomjl||kznz|tsuz}|ywnzxpvypv{zriyrsssqzlipmjoxl~|nzstu~|~zwun}urx}wqx{{om{pustq{kjmkjtunyo{uvw~{{yvum}xv|{vpvxwlozpussq{jkmkkvspxp{uvw||savw{mwsvphndp}wfffwbf~yyzrz|px{||zxx}~heefl~gsve|momwvuh{kyyn|~rgtgx|rrvr}~~|`yq^on`Zqzq{vzoryuclaiiyt[tplrtoky{w}txrufhohamyztszm~nx{msdryvvny|xpawxugs{xxmpnooto|myyq}vtvs]u~rhxt|uru}{urowlyq}{s|zwoyw~~{}}}ts^k]jvxzgqutumvvxzulnlrk{{~}w}q}y}}xlocmfq~vw{wxlpuclrq~{~sbrp|wnx}{z~z~s{oivigqemv|r|qqyohinwozri~wrwrm|yx{~xut{p_pcivx~v}tjljl~rpym^spppq}wu|~}}}w|{i~xyyz|wyqsiojtrttjfofoxahxq{}}zvpuu~uq~wwy}snod{rrubfseqy]e}}qvv~x~~xwrewo]p{o{rsiqpxh_pkets`m|~tuvsvowzouodhn_n}wx{vukkqneot\n}zw}urwmsxy~{tuuaru`yu~v}}~tiupd{s\uuxxusrxsx~x{~{{vxfvpfy{uwyqy~xn~}sses}v{pkzor~w}z~{|yxzh}zqypzbkx{ylk}|xuo}qyzo{xs~|w~}{zysh|{r~|~~fsuppif|~kng}xzwu|z|n{wv}xtxuzuhnkqmwhryzxuyz|k|wwxyly{~tuvmy}v~xitdMirs}xvzZapX^[cy^lkgvpz|xt{yz}pzsvbt~xlnzv{pqkhlgshpppy|vvsmvrnovmjdfk~|^jrog|~p|iru{o~ks|qxntv}~yk{spjuwxkspqU]zlgplywn||xyz~n{}hqp}vquy|nmqb^vwnc`eeY}z|xusvygtyrpmsnzv{uutmocbtQbu`vzz{{{ozessrksjbpkotjtr|~}u~irfeuu~wymuvrnZuyzwceoytj~sknjw|vpulyy|w|u~szjrodf_ivysy|vrmy{pwnptyrlrl|py{z~sstdjoneZlpnxy|x|cqku~xzxtqxu~kx{v~|ttg`bg^pwmtymozhdi\wuqrnywx~{|yv|}|t|krn_ghszwywd]`epimgnmojq{o~zrtv{mz||vvxz{x|wjgcbmegh`ineyyr`y}qyt~xuuvtup}z~os~pokgklrfck_apv~fiwosuwxtofpnenmtvtnhsqqxnkwmloop^dpilw~uqd^mjlnv{wxjo}khkjt|psu|xiryhvsk}{yutysrwijkv~ru||umlmllartx|jxtyqq~{z{|ysvusuleqyyxe|xxh{}uy|uu|~~kiuzrfyvybSlncUYt_hl}s{|j|~vjvze{~~y~~l{grldwxpeRhd\X_pdflk~fqu|vpnWbcxlwywerpp[bwacb`vf^i`^ntul~{rv~x{z}}|qz{}{xz|urrZlsk\jlm{ltuprtgspyx}y~|z~gmhigS\`b\Z\UF^j[Sqt^w|s{~~}|~}|{zveu|jz}hiquqUdiekovg^yuji~w{~vszxr}d}seurjVgj[hk]YQ`g]Snqft~g{|yp}~x{vz~krwp{wuxltmerqmh\onoew}pw}z{x}yt{utgstfT]chagysrv{mntivo{ltwuzt}~rwl^[dwxtzq}~wnmkjitceicndYa|l`{q~{mnlipriq~v}vyqq}}}t}toj|sfo}hw~vbkcw{}~|}tu}ohusruki|m_`ryp~yvq}tsrwymkwqtp||wn~tffyy~zmuq`nthc^We\N\c_Tpqk}wt}y}zzvrswwkgd_d[\xym~|tyuuss}vkw}tnvwn|ovquft~zn{mbqjeiakrpuzzxtv|mq}uxqhc``W\jcilimbewkjztzlriysv|u{{tyxk|}u|s~zxkit{pyyu|qmsuuzw|~q{trwux~tjvqpzypr{|}q}}nyrvqjl~nx|vyytuqhrsyzxwv|xbkppbi\c_Wfmofptgwznlzxzzzpupwy}qsrzhqpelgivsj|nxtqv}z|{yw}rqtvkcicxqs}ru~esuqkunklkvulzjxvuswyzwwywonmldkji]lhb]^kuk`uzn|{v|{wy|yn{{ufwsqlgozupxwy}|v{{u{mqr~uqsusv}}|{}z|w~ojy|vhvosutwuty{wxoutp{yq|}ysus|ihmqkjpgockurdlrr}x}y~}pq}}{ty|~u~ysqusnrxvltvyzypw}iu}~|r{|ygslzxqtxrm}{n{mrxrvv}wl|~y}~s|}pwpxosyur~}zy}zhsrvgqukjhpwqf{zfq|~{y}{|~wryt{z|z~|~s~~isyuvrutki{yoq}x~q~~rxn~~{wuvu}l}{mrtknpntpd{}rzz~}~|}}u}q|ozwvztr~p}vwilpnrkqwtmw~wu}~}u}~sxpxutpr|{ykzr{lfsputx||y|z~~{~|~{w|syywtlft}u{|ym}x{}zmypnuw{}uvz|vz{xyx{v{|yytqmir}|vzy{wwv|v~qytmu|xq}|y|{yxpwq|wrlx~|mvzx{x}~y~wvtttv|uzxzxxum}{usdpelpqmgglx{}y|}{|}vsw}sx{|yvvr|yzisrn~~yussu|mzwz}sy}sov|tyxy}z}~|yqp{unjqhx}{wtr}~{}~ttxpt~~y||{~z|t~uyyuom}stfunv~wy|vzp|z~~yxqxw|uuznmqu}ku~qx{tsp{~o{|}y{yry}t|}v~tqrt{pwwx}wws}}nnsmxzzxpn||}zzy~r}py{y{|wwvvwz{~}rnys{~{ts~{y~nu~|yyy|tuxzxqvix{rpnqxyy~{x|~rkzqx~{y~w{}~vu{}{w|o~zuux~~x}zwuztlcqlszyupnxy{~wzur}{{y}vsy|{v}{{{ukvov}~}zx{z|upxy}urpxqlsvxu|rxuw|{zu}zy}zwohvsz{yvu}|xwxw|||yxy{xzu{wswvvmfrmtwvvsq{~~}v}~oox|~{xwx|{||||x~||pkusy{|{wy}~uloy|yvyw~}}x}{txtsv{}t~x~}{wzjlut|~}{x~|szy~xzy{usuz{yywz|z|ttfmoowyvqnuy}|~|s|zzy~yy|yz}}~zxktsrxywtsz{x~zt|t|s{xtyqyyutwz}y~~w|~~|uqeoopvwvuw~}|}x~xyyx~vyuvy{}yuz{z{tpk`jjmrrpor{xw|}yx{vw~{{x|yz}~w{~~xtqfnorxywuxty|ysrysuy|{tryt|{utwz}y~zrt|z{~uqpfnqrx{{{y~{yxxz~xu|w~wuuxzw|~wsrzxy|vonclpqx||{|~ux}~xvvzy~{x~y~xvwz|{{zu~wxntyx}ww|zus~q~{tyyvrxtt}{tqsvwvzy}p{~yyooww{}~~z}zwxw{zxswvswrswzzz{s|vvniqpty{yx}}~wz}{vzzxuwyxsuyuyxz}|~{vsksuuz|}|}vx|ysq|o|sptusptqw~ywy|~}v~tsiltty|}}~|y|}vrzr{}rvwxuyxv||}s|~tslgpruz}}~uw{~~xtvyuvwyywy|x}{|~~||vu~}~vrofntvz}}}}tty}yutuzw||{{z|xy|}{x{r||}~ysrhkrty}~xuy|~yuwy}~|z~{|~yxyzz}xp{~~{rqiisuw{~{vz~|y|y|}}z|yx|xwyyyzz}ry}}}}trjgquy|~wz{~}xz{{y{zw}xvxyzz{{qw~~~~|trlgpux{|}}~z}{}}|xyzywyyv~yxyyyy|{rv}}~~trlemsuy{||}|}~yzzvwyywxxu~xvwxyy|xsv}}~~|spjdkruy|}}||~yy}{uwxywyyv~zwwwxy{yrv|||}zqoidmsvy{}z|}xz{|uxyyxywu|xwxxxyyyou{{|}zrpidmtx|~zz|w{z}uwxywzxv}xwwvvxvy~nw|}}}xrqjgpvz~y{|w~wtyyxwyvxzvuuuuyt}|ny|~ysqijsy}~y|{vw{txyyxyuz~xttuuv}syr}~yurjnvz~}z}{wxxuxyxxwsz}xuutuvuvuzvqjovz}}~}|z~zxywtwwvvvs{|wvvvwxwwxyvpimuz}~}}||z}zxyttvwvwvt{~ywxwxzzwzwuoinuy{||}}|{~~yw}ytuwwvvvu}~zxyyy{zvywsmgmtx{||}|}z}~yvyttwyxxwv~|yzyyzwvw~wsngksy|}}}||y|zvyxuxzzzyw~|yyxxyvvu~wsngksx{||}z}y|{wyzvz{|{{x~{xxxwwtxr~~xsohiqx|}|}|y{~xzw{|||{x{|xwvvv|t~}p|~ytpjhpvz}}~}{|{}wz{|zzwy|xvvuuywypy~{tqjgnuz}}}~}}|}}wxz|{zww~}xvvuuw{trv~{vrlgksy|}}}{}y{|vyzzyxu{yvuttu}rxo|~~}wsnghpw{}}~}~z{uxyzyxvwzwuuttxuwnx}~}}ysoifluz~~}|z}wvyzzyvu|}xttssu|rrr||}|ztqlgjsy~}}xy{uyzzxwu{}xutsss|~o}un{|}|{vrmgirz|}xytxy{ywtx~yussqrxqyzmy|}|{xtpjiqz}|y}{uwyzxwuv~yusrqrvtu|lw}~~}zurljqy}|z||uwyzywuv}yussqruut~nw~~~{wsmkpy~|~{z~~vwxzywtu|zusrqsvxtpv~|wtnkox~||y}vvxyxwuu|zvttssvztqv~|wsmjox~~|~{y~}uvxzywtu|{wuustwyuqw~}{wsmjow}~|zz}uwxzyxuw~{xuutuxxvow~}zvrlinw}~|z{|uxz{zyvx{xvuttxuw~oy~~~|yuqkiox~}}y~{vz{|{ywzzwutsu{s{zn{}~}|xtojjqy~}}~z{w{|}{yw|~yvutsu}q}vp|}~|{wsnikrz~|}{}}y|}}{xw}}xutssu|qrr}}}|zvsmiksz~{||y|}|zxx}|wutrsu{qqs}}~|zvrlhksz~{|zy|}|zww}{wttrsuzrpt}}}{zvqlhksz~~~|}zz{}{yww}zvtsrsuyr~ot|}}{yuqkhksz}~~{|zy{|{yww|{wttrrtzq~qr|||{yuqlhkry}~~|{~{x{||ywv|{vtsrrt~{p}rq|||{yvrlhjqy}|{}}x{||ywv{{wtsrqs|}o|so{||{zvrmijqy~}{|w{||zwuy|wtrqqrypyxmy{|{zwtokjpx~|}wz{|zxux~}xtrrqrvst{mw|}|{yvqlkow~~}xy{|zxuv|~yurrpqt~xq}os|}}|zwsnknu|~z|}wz{{yvuyzvsrqqs{~p{vo{}}|{yupllrz||vy{{ywuw}}xtsrqrwtu|nw}}}|zvrmkpx~~{~yxz|zxuv{zvssrrt~zq}qr|||{zwtoknu|~z|}wz{{ywv{{wtsrrs{~o{to{|}{{xtokms{{{w{||zxvy}xusrqrxqxymx{|{zxupllqy|~~x{|}{ywy~~xusrqrvst{lv{|{zyuqlkpx~~~y{|}{ywx~~yusrpqutr{mt{{{zyvrmkpw~~z{|}{ywx}~yurrpqt~uq{msz{{zyvrmkov}}{z|}|ywx|~xurqpqs}vp{mrz{{zxvrmkov}~z{|}{yvw}~xtrqpqt~uq{mszzzyxuqmkov}~z{|}{xvw}}xtrqpqt~tqzltzzzyxuqlkow}y{|}{xvx}}wtrqpqu~rsykuzzzyxuplkpw}~~y{|}zxvy~{vsqqpqw}ovvlwzzzywtoklqy~}}y|}|zwvzzvsqpprz|nysnyz{yyvsnkmsz~}~~z|}|yww{yurqppr|yo{ppzz{zyvsnknt{}}|z|}|yww{~yurqpqs|xo{oqz{{zywsnlnu|}}|z|}{yvw{~xurqpqs}wp|or{{{zzwsnlou|~~{{|}{yww|~xtrrqqt~wq|os{{{zzwsnlnu|}}|z|}|yww{~yusrqrt}yp|pr{{{zzwsnlnu{|}}z|}|yww{zvsrqrt}zp|qq{{{zzwsnlntz|}~z|}|zxx{{vtsrrs{|o{soz{{zzwtolmsy~|}~z}}}{ywz|wtsrqsy~pxwmxz{zzxupllqx}~z}}~|ywz~}xtsrqrvstymuzzzyxuqmlpw|||}~|zxy}~yusrqru}vp{oqyzzyxvrnlou{}~{|}|zxx{{vsrqqsz{nxtmwyzyywtolmry~~{|}}{yxy~|wtrqprv}rsylsyzyywuqmlpw|}{|}{ywx|~yurqpqs{wnzooxyyyxvrnmou{~~z|||ywwzzusqppryzmxrmvxyyxvsomntz~~z{{{yxwy~{vsqpprx{nuvktxyyxwtpmnry~{{{{zxwx}|wsqppqv|prxlrxyyxwuqnnrx~|{{|zxwx||wtqppqu|qqylqwyyxwuronrx~|z{{zxwx||wtqqpqu|spympwyyyxvronqx}}z{{zxwx{|xtrqpqt{soynpwyyyxvsonqw}}z{{zxwx|}xtrqprv|rpynpwyyyxuronrx}}z{{zxwx||xtrqqrw|rrymqwyyywuroorx}}{{{zxwy}|xusrqsw|qsymrwyyywuqoorx}|{{{zxxz~|wtsrrty{ovvltxyyxwtpnosy~~{|||zyx{{wtsrru{yoxtmuxyyxvsonoty~}|||{zyy|{wtsrsv|vozrnuxyxwuromotz~~|||{zyz}zwtsrtw|upzqnuxxxwtrompuz~~}|}|zyz}zwtsrtw|tpzpovxxxwtqnmpuz}~}}}|zyz}~zwtsrtw|tpzpovxxxwtqnmotz}~}}}|zyz}~zwtsrsv|upyqnuwxwvtqnmoty}~}|||zyz}{wusstw|uoyrmtwxwvtqnmosy}}}}||zyz|{xusssv{wnxsmsvwwvtromosx|}~|||zyy{|xusrsuzynuvlqvwwwuspnnrw|}|||{yy{~|yusrrtxzpsxmpuwwwuspnnqv{~}||{zyz}}yvtrrtx{rpypmsvwwvtqonquz~}|{{zyy{~{wusrsvzwnwtlquwwwuspopty}~|{{zyyz}|xusrrtxyorxnotwwwvtqoprw||{{zyxy|}yvtrrswzsoxqmsvwwwurpoqv{}{{zyxy{~~zwtsrsvzvnwtmrvwwwusqpquz~~|{zyxyz}~{xusssvyxnuwmptwwwusqpqty}|{zyyxz}|xvtssuyyorxnotvwwvtrppsx||{{zyyz}|yvtssuxypqxonsvwwvtrppsw|}{{zyyz|}yvtsstxzqqxpnsvwwvtrppsw|}|{zyyz|}yvtsstxzqpxpnsvwvvtrppsw{}|{zyyz}}ywtssuxypqxpnruvvusqppsw{}|{zyyz}|yvtssuxypqxonsuvvusqppsw{}|{zzy{}|yvtssuyxorwnnsuvvusqopsw{}|{zzz{~|xvtstvywnuvmosuvutrpoptx|~}||zzz|~~{xvtstwzunvtmptvvutrpoqtx|}|{zz{}~{xvttuxzsowrmqtuuusqooquy|}|{{z{}~{xvttuxyrpxrmqtuutsqooquy|}||{z{}~zxvttvxyrpxqmqtuutsqooquy|~}||{z{}}zxvttvyyqpxqmqtuuusqooquy|~}||{z{}~{xvutvxyrpxrmqtuuusqppquy|~~}}|{{{}~{xvuuvyzspxsmpsuutsqpoqtx|~~~}|{{{}~{ywuuvxztowtnpsuuusrppqtx{~~}|{{{|~|ywuuuxzvouvnosuuutrppqsw{}~}|{{{|~}zwvuuwywpswpnrtuutsqppsvz}~}||{{|}}zxvuuwyxqqxrnpsuutsqppruy|~}|{{{}~~{ywuuvxytovunortutsrqpqtx{~}|{{{|}~|ywuuuwyworwpnqtuutsqpqswz}}|{zz{}~}zxvutvxxqpwsmpstutsrqqsvz}}|{{z{|~}zxvutuwxsovtnortuutrqqruy|~|{{zz|}}{yvuuuwxtntvonqstttrqqrux|~}|{zz{}~~~{ywutuwxuorwpnqstttsrqrtx{~}|{zz{|~~~|ywutuvxvoqwqnpstttsrqrtw{~}|{zz{|~~~|ywuttvxvoqwqmpstttsrqrtw{~}|{zz{|~~~|ywuttvxwppwqnpstttsrqrtw{~}|{zz{|~~~|ywvuuvxvoqwqnprtttsrqrtw{~}|{zz{}~~~|ywvuuwxvoqwqnpstttsrqrtw{}}|{{{{}~~}|ywvuuwxuorwpnpstttsrqrtw{~}|{{{|}~}{ywvuvwxtotvonqsttsrqqrux{~}||{{|~}{ywvuvxxsovuoorsttsrqqrux{~~}|||}~}{ywvvwywqpvtnorstsrqqqrux{~~~}|||}}{ywvvwywqqwsnorsssrqqqsux{}~~}||}~}{ywvvxywqqwsnorsssrqpqsux{}~~}||}~}{ywvvxywqqwsnprsssrqpqrux{}~~}}|}~}{ywvvwywqqwsnorsssrqpqrux{}~~}}|}~}{yxwwxywqpvtooqrssrqpqruxz}~~~}|}~~|yxwwwxwrpvuooqrssrqqqrtwz|~~~}||}~~|zxwvwxxsotvpnprssrrqqrtwz|~~}||}~~|zxwvwxxuosvqnprsssrqqrsvy|~~}||}}~~|zxwvvwxvpqvsnoqrssrqqqsvx{}~}|||}~~~}{ywvvwxwrouupnprssrrqqsux{}}||||}~~}{yxvvvwwtorvqnoqsssrrrrtwz|}||{|}}~}|zxwvvwwvppvsooqrsssrrrtvy|~~||{{|}}}|zxwvvvwvqouuooqrsssrrrtvy|~~}|{{|}}}|{ywvvvwwrosvqnprssssrrtvx{}~}|{{||}}|{ywvvvwwsorvropqssssrrsux{}}|{{||}}|{yxvvvwwtorvrooqssssrrsuxz}}|{{||}}}{yxvvvwwtoqvsooqssssrrsuwz}}||{||}}}{yxwvvwwupqvsooqssssrrsuwz}~}|||}}}}{zxwvvwwtoqvsooqrsssrrsuwz|~~}|||}}}}{zxwvvwwtorvrooqrssrrrsuwz|~~}|||}}}}{zxwvwwwsorvrooqrssrrrsuwz|~~}||}}~~}{yxwvwwvrotuqopqrsrrrrsuxz|~~}}}}~~~|{yxwwwwvqpuupoprrrrrrrsuxz|~~}}}~~~~|{yxwwxxuqqutpopqrrrrqrsuxz|~~~}}~~~~|{yxwwxwupqutpopqrrrqqrsvxz|~~~}}~~~~|{yxwwxwupqvtoopqrrrqqrsvxz|~~~~}}~~~~|{yxwwxwupqvsoopqrrrqqrsvxz|~~~}}~~~~|{yxwwxwuqqutpopqrrrqqrsuxz|}~~~~~~~~~}{zxxwxwuqqutpopqrrrqqrsuwz|}~~~~~~~~~}{zxxwxxuqpuupopqrrrrrrsuwy{}~~~~}~~~~}{zyxwwxvrptuqopqrrrrrrsuwy{}~~~}}}~~~}|zyxwwxwspsvrooqrrrrrrstwy{}~~~}}}~~}|zyxwwwwtpqutpopqrrrrrstvxz|~~}}}}~}|{yxwwwwuqptuqopqrrrrrstvxz|~~}}}}}}|{zxwwwwvspruspoqrrrrrstuwy|}~}}|}}}|{zxwwwwvtpqutpopqrrsrssuwy{}~}|||}}|{zywwvwwuqptuqopqrsssssuvy{}~}}||}}|{zyxwwwwuqpsuropqrrsssstvxz|~~}}|||}||zyxwvwwuroruspoqrrsssstvxz|~}}||||||zyxwvvwvrpruspoqrrsssstvxz|~}}||||||zyxwvvwvspquspoprrsssstvxz|~~}||||||zyxwvvvvspquspoprrsssstvxz|~~}|||}||{yxwwwwvspruspopqrrssstvxz|}~}}|}}||{yxwwwwurpruspopqrrssstvxz|}~}}}}}||{yxwwwwurpruspppqrrrsstvxz|}~}}}}}}|{yxwwwwuqpsurppqqrrrrstvxz|}~~}}}}}|zyxwwwwtqptuqopqrrrrrstvxz|}~~~~~~}}|zyxxwwvtqqutqopqqrrrrstvxz|}~~~~~~}}|zyxxwwvtqqutqopqqrrrrstvxz{}~~~~~~~~}}|{yxxwwvsprutqopqqrrrrstvxz{}~~~~~~~~~}|{yxxxwvsprutqopqqrrrrstvxz{}~~~~~~~~~}|{yxxwwvtqqutqppqqrrrrstvxy{|}~~~~~~~}|{zyxxwvtqqttqppqqrrrrstvwy{|}~~~~~~~}|{zyxxwvtqqttrpppqrrrrstuwy{|}~~~~~~~}|{zyxxwwurqsurpppqrrrrstuwyz|}~~~~~~}}|{zyxwwwurpsuspppqrrrrstuwxz|}~~~~~}}}|{zyxwwwusprutqppqqrrrssuvxz{}~~~~}}}|{zyxwwwvtqqturpppqrrrssuvxz{}~~}}}}|{zyxwwwvurprusqppqrrrsstvwy{}~~}}}||{zyxwwwvuspqttqppqrrssstvwy{|~~}}}||{{yxwwvvusqqttrppqrrssstuwyz|~~}}|||{{zyxwwvvtqpsusppqqrssstuwxz|}~}}|||{{zyxwwvvtqprusqpqqrssstuwxz|}~~}}|||{{zyxwvvvtrprtsqpqqrssstuvxz|}~~~}|||{{zyxwwvvtrprttqppqrssstuvxz{}~~}|||{{zyxwwvvurprttqpqqrssstuvxz{}~~}}|||{zyxwwvvtrprttqppqrrsstuvxz{}~~}}|||{zyxwwvvtrprtsqppqrrsstuvxy{}~~}}}||{zyxwwvvtrprtsqpqqrrsstuvxy{}~~~}}||{zyxwwvvtqqstsqpqqrrsstuvxy{|~~~~}}}|{zyxwwvusqqttrppqqrrsstuvxz{|}~~~~}}|{zyxxwvusqqttrppqqrrrstuvxy{|}~~~~}}|{zyxxwvusqrttrppqqrrrstuvxy{|}~~~~~}}|{zyxxwvusqrttrppqqrrrstuvxy{|}}~~~~~}|{zyxxwvusqrttqppqqrrrstuvxy{|}}~~~~~}|{zyxxwwusqrttrppqqrrrstuvxyz|}}~~~~}|{zyxxwwusqrttrppqqqrrstuvwyz|}}~~~~}|{zyxxwwusqqttrqppqqrrssuvwyz{}}~~~~}|{zyyxwwvtqqstsqppqqrrsstvwyz{|}~~~}}||{zyxwwvtrqrtsqppqqrrsstvwxz{|}~~~}}||{zyxwwvtrqrttrqpqqrrsstuwxz{|}~~~}}||{zyxwwvusqqstsqpqqrrsstuvxy{|}~~~}}||{zyxwwvutqqrtsqqqqrrsstuvxy{|}~~}}||{zyxwwvvtrqqttrqqqrrsstuvwyz|}~~}}|{{zyxwwvvusqqstsqqqrrsstuvwyz|}~~}}|{{zyxwwvvusqqstsqqqrrsstuvwyz{}~~}}|{{zyxwwvvusqqrtsrqqqrsstuvwxz{}~~}}|{{zyxwwvvusqprtsrqqqrsstuvwxz{}~~}}||{zyxxwvvutrprttrqqqrsstuvwxz{|~~}}||{zyxxwvvutrprttrqqqrsstuvwxz{|~~~}||{zyyxwvvusrqrttrqqqrsstuuwxy{|}~~}||{zyyxwvvusqqrtsrqqqrssttuwxy{|}~~}||{zyyxwvvusqqrtsrqqqrrsttuwxy{|}~~}}|{zzyxwvvusqqstsqqqqrrsttuwxy{|}~~~}}|{zzyxwvvusqqstsqqqqrrsttuwxy{|}~~~~}|{{zyxwwvtrqrstrqqqqrrsstuwxy{|}}~~~}|{{zyxwwvtrqrttrqqqqrrsstuwxy{|}}~~~}||{zyxwwvtrqrttrqqqqrrsstuwxyz||}~~}||{zyxwwvtrqrttrqqqqrrsstuvxyz{|}~~}}|{zyxwwvtrqrttrqqqqrrsstuvxyz{|}~~}}|{zyxwwvtsqrstrqqqqrrsstuvxyz{|}~~}}|{zyxwwvusqrstsqqqqrrsstuvwyz{|}~~~}}|{zyxxwvusqqstsrqqqrrsstuvwyz{|}~~~}}|{zyxxwvusrqrtsrqqqrrsstuvwxz{|}~~~}}|{zyxxwvutrqrttrqqqrrsstuvwxz{|}~~~}}|{zyxxwvutrqqstsrqqqrsstuvwxy{|}~~~}}|{zyxxwvvusqqrtsrqqqrsstuuwxyz|}~~~}}|{zyyxwvvusrqrstsqqqrrstuuvxyz|}~~}}|{zyyxwvvutrqqstsrqqrrsttuvxyz{}~~}}|{zyyxwvvutrqqstsrqqrrsttuvwyz{}~~~}}|{zzyxwvvutsqqrtsrqqrrsttuvwyz{|~~~}}|{zzyxwvvutsqqrssrrqrrsttuvwyz{|}~~}|{zzyxwwvutsqqrssrrqrrsttuvwxz{|}~~}|{zzyxwwvutsrqrssrrqrrsttuvwxz{|}~~}|{{zyxwwvutsqqrssrrqrrsstuvwxz{|}~~}|{{zyxwwvutsqqrssrrqrrsstuvwxy{|}~~}||{zyxwwvutsqqrssrqqrrsstuvwxy{|}~~}||{zyxwwvutsqqstsrqqrrsstuvwxy{|}~~~}}|{zyxxwvutrqrstsrqqrrsstuvwxy{|}}~~~}|{zyxxwvutrqrstsrqqrrsstuvwxyz{|}~~~}|{zyxxwvutrqrsssrqqrrsstuvwxyz{|}~~}|{zyxxwvutrqrssrrqqrrsstuvwxyz{|}~~}|{zyyxwvutrqrssrqqqrrsstuvwxyz{|}~~}|{zyyxwvutrqrsssrqqrrsstuvwxyz{|}~~}|{zzyxwvutrqrstsrqqqrrsttuvxyz{|}~~}|{zzyxwvutrrrstsrqqqrrsttuvxyz{|}~~}|{{zyxwvutsrrsssrqqqrrsttuvwyz{|}~~}|{{zyxwvvtsrqrssrqqqrrsttuvwxz{|}~~}|{{zyxwvvusrqrsssrqqrrsttuvwxy{|}~~}||{zyxwwvutrqrsssrrqrrsstuvwxy{|}~~~}||{zyxwwvutsqqrssrrrrrsstuvwxyz|}~~~}||{zyxwwvutsrqrsssrrrrsstuvwxyz{}~~~}||{zyxwwvutsrqrsssrrrrsstuvwxyz{}~~~}}|{zyxwwvutsrqqrssrrrrsstuvwxyz{|}~}}|{zyxxwvuutrqqrsssrrrsstuvwxyz{|}~~}|{zyxxwvuutrqqrsssrrrsstuvwxyz{|}~~}|{zyxxwvuutsqqrsssrrrsstuuvwyz{|}~~}|{zyxxwvuutsrqrsssrrrsstuuvwyz{|}~~}|{zyyxwvuutsrqrsssrrrsstuuvwxz{|}~~}|{zyyxwvvutsrqrsssrrrssttuvwxz{|}~~}|{zzyxwvvutsrqrsssrrrrsttuvwxz{|}~~}|{zzyxwvvutrqrsssrrrrrsttuvwxy{|}~~}|{{zyxwvvusrrrsssrrrrrsttuvwxyz|}}~~}||{zyxwvvusrrrsssrrrrrsttuvwxyz{|}~~}}|{zyxwvvusrrrsssrrrrrsttuvwxyz{|}~~}|{zyxwvvusrrrsssrrrrrsstuvwxyz{|}~~}|{zyxwwvusrrrsssrrrrrsstuvwxyz{|}~~}|{zyxwwvusrrrsssrrrrrsstuvwxyz{|}~~}|{zyxwwvusrrrsssrrrrrsstuvwxyz{|}~~}|{zyxwwvutrrrsssrrrrrsstuvwxyz{|}~~}|{zyxxwvutsrrsssrrrrrsstuvwxyz{|}~~}|{zyyxwvutsrrrssrrrrrsstuvvxyz{|}~~}|{zyyxwvutsrrrsssrrrrsstuuvwxz{|}~~}|{zyyxwvutsrrrsssrrrrsstuuvwxy{|}~~}|{zyyxwvuutrrrrsssrrrssttuvwxyz|}~~}|{zzyxwvvutsrqrsssrrrssttuvwxyz{}~~}|{{zyxwvvutsrqrsssrrrssttuvwxyz{}}}|{{zyxwvvutsrqrrsssrrssttuvwxyz{|}~}||{zyxwvvutsrqqrsssrrrsttuvwxyz{|}~~}|{zyxwvvutsrrqrsssrrssttuvwxyz{|}~~}|{zyxwwvutsrrqrsssrrrsstuvwxyz{|}~~}|{zyxwwvutsrrqrsssrrrsstuvwxyz{|}~~}|{zyxwwvutsrrqrsssrrrsstuvwxyz{|}~~}|{zyxwwvutsrrrrsssrrrsstuvwxyz{|}~~}|{zyxxwvutsrrrrsssrrrsstuvvwyz{|}~~}|{zyxxwvutsrrrrsssrrrsstuuvwxy{|}~~}|{zyxxwvutsrrrsssrrrrsstuuvwxy{|}~~}|{zyyxwvutsrrrsssrrrrsstuuvwxyz{|}~}|{zzyxwvutsrrrsssrrrrsstuuvwxyz{|}}|{{zyxwvutsrrrsssrrrrssttuvwxyz{|}~~}|{zyxwvutsrrrsssrrrrssttuvwxyz{|}~~}|{zyxwvutsrrrsssrrrrssttuvwxyz{|}~~}|{zyxwvutsrrrsssrrrrssttuvwxyz{|}~~}|{zyxwvutsrrrsssrrrrrsttuvwxyz{|}~~}|{zyxwvvutsrrsssrrrrrsttuvwxyz{|}~~}|{zyxwvvutsrrrsssrrrrsstuvwxyz{|}~~}|{zyxwwvutsrrrsssrrrrsstuvwxyz{|}~~}|{zyxwwvutsrrrssssrrrsstuvwwxz{|}~~}|{zyxxwvutsrrrrsssrrrsstuvvwxy{|}~~}|{zyxxwvuttsrrrssssrrsstuuvwxyz|}~~}|{zyxxwvuutsrrrrsssrssstuuvwxyz{}~}|{zyyxwvuutsrrrrssssssstuuvwxyz{|}}|{zzyxwvuutsrrrrssssssstuuvwxyz{|}~~|{zzyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrssssrssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssrrssttuvwxyz{|}~~}|{zyxwwvutsrrrrsssrrssttuvwxyz{|}~~}|{zyxwwvutsrrrsssrrrssstuvwwxz{|}~~}|{zyxwwvutsrrrsssrrrrsstuvvwxyz|}~~}|{zyxxwvutsrrrsssrrrrsstuvvwxyz{|~~}|{zyxxwvutsrrrsssrrrrsstuuvwxyz{|}}|{zyyxwvutsrrrsssrrrrsstuuvwxyz{|}~}{zzyxwvutsrrrsssrrrrsstuuvwxyz{|}~}|{zyxwvutsrrrsssrrrrsstuuvwxyz{|}~~}|{zyxwvutssrrsssrrrrssttuvwxyz{|}~~}|{zyxwvutssrrrsssrrrssttuvwxyz{|}~~}|{zyxwvuutsrrrsssrrrssttuvwxyz{|}~~}|{zyxwvuutsrrrsssrrrssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssrrssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssssssttuvwxyz{|}~~}|{zyxwwvutssrrrsssssssttuvwwxz{|}~~}|{zyxwwvutssrrrrssssssttuvvwxyz|}~~}|{zyxxwvuttsrrrrssssssttuvvwxyz{}~}|{zyxxwvuttsrrrrssssssstuuvwxyz{|}~|{zyxxwvuttsrrrrssssssstuuvwxyz{|}~}{zyyxwvuutsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutsrrrrsssrrssttuvwxyz{|}~~}|{zyxwvvutsrrrssssrrssttuvwxyz{|}~~}|{zyxwvvutsrrrsssrrrssttuvwxxyz|}~~}|{zyxwvvutsrrrsssrrrssttuvwwxyz{}~}|{zyxwwvutsrrrsssrrrssstuvvwxyz{|~}|{zyxwwvutssrrsssrrrssstuvvwxyz{|}~}{zyxxwvutssrrsssrrrssstuuvwxyz{|}~}|{yyxwvutssrrsssrrrssstuuvwxyz{|}~~}|{zyxwvutssrrrsssrrssstuuvwxyz{|}~~}|{zyxwvuttsrrrsssrrssstuuvwxyz{|}~~}|{zyxwvuttsrrrssssrsssttuvwxyz{|}~~}|{zyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvvutssrrrrssssssttuvwxyz{|}~~}|{zyxwvvutssrrrrssssssttuvwxyz{|}~~}|{zyxwvvutssrrrrssssssttuvwwxyz|}~}|{zyxwwvuttsrrrrssssssttuvvwxyz{}~}|{zyxwwvuttsrrrrrsssssttuvvwxyz{|}~|{zyxxwvuttsrrrrrsssssttuvvwxyz{|}~}{zyxxwvuttsrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttsrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttsrrrrrsssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrrsssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuutsrrrrsssssssttuvwxyz{|}~~}|{zyxwvuutsrrrrsssrsssttuvwxyz{|}~~}|{zyxwvuutssrrrsssrsssttuvwxyz{|}~~}|{zyxwvuutssrrrssrrsssttuvwxxyz|}~~}|{zyxwvuutssrrrssrrsssttuvwxxyz|}~~}|{zyxwvvutssrrrssrrsssttuvwwxyz{}~}|{zyxwvvutssrrrssrrsssttuvvwxyz{|~~|{zyxwwvutssrrrssrrsssttuvvwxyz{|}~}{zyxxwvutssrrrsssrsssttuvvwxyz{|}~}|zyyxwvutssrrrrssssssttuuvwxyz{|}~~}|{zyxwvuttsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuttsrrrrssssssstuuvwxyz{|}~~}|{zyxwvuttsrrrrrsssssstuuvwxyz{|}~~}|{zyxwvuutssrrrrsssssstuuvwxyz{|}~~}|{zyxwvuutssrrrrssssssttuvwxyz{|}~~}|{zyxwvvutssrrrrrsssssttuvwxyz{|}~~}|{zyxwvvutssrrrrrsssssttuvwxyy{|}~~}|{zyxwvvutssrrrrrsssssttuvwwxyz{}~}|{zyxwwvuttsrrrrrsssssttuvwwxyz{|~~|{zyxwwvuttsrrrrrsssssttuvvwxyz{|}~|{zyxwwvuttsrrrrrsssssttuvvwxyz{|}~}|zyxxwvuttsrrrrrsssssttuvvwxyz{|}~~}|{zyxwvuttsrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttsrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttsrrrrrsssssstuuvwxyz{|}~~}|{zyxwvuttssrrrrsssssstuuvwxyz{|}~~}|{zyxwvuttssrrrrsssssstuuvwxyz{|}~~}|{zyxwvuutssrrrrsrssssttuvwxyz{|}~~}|{zyxwvuutssrrrrrrrsssttuvwxyz{|}~~}|{zyxwvuutssrrrrrrrsssttuvwxxyz|}~~}|{zyxwvvutssrrrrrrrsssttuvwwxyz{}~}|{zyxwvvutssrrrrrrrsssttuvvwxyz{|~~|{zyxwwvutssrrrrrrssssttuvvwxyz{|}~}{zyxxwvutssrrrrrrssssttuvvwxyz{|}~}|zyyxwvuttsrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttssrrrrsssssttuuvwxyz{|}~~}|{zyxwvuttssrrrrsssssttuuvwxyz{|}~~}|{zyxwvuutssrrrrrssssttuuvwxyz{|}~~}|{zyxwvuutssrrrrrssssttuuvwxyz{|}~~}|{zyxwvuutssrrrrrssssttuuvwxyz{|}~~}|{zyxwvuutssrrrrrssssstuuvwxyz{|}~~}|{zyxwvvutssrrrrrsssssttuvwxxy{|}~~}|{zyxwvvutssrrrrrsssssttuvwwxyz{}~}|{zyxwvvuttsrrrrrsssssttuvwwxyz{|~~|{zyxwwvuttsrrrrrsssssttuvvwxyz{|}~}{zyxwwvuttsrrrrrrssssttuvvwxyz{|}~}|zyxxwvuttssrrrrrssssttuvvwxyz{|}~~}|{zyxwvuttssrrrrrssssttuuvwxyz{|}~~}|{zyxwvuttssrrrrrssssttuuvwxyz{|}~~}|{zyxwvuttssrrrrrssssstuuvwxyz{|}~~}|{zyxwvuttssrrrrrrsssstuuvwxyz{|}~~}|{zyxwvuttssrrrrrrsssstuuvwxyz{|}~~}|{zyxwvuutssrrrrrrssssttuvwxyz{|}~~}|{zyxwvuutssrrrrrrssssttuvwxyz{|}~~}|{zyxwvuutssrrrrrrssssttuvwxxyz{}~}|{zyxwvvutsssrrrrrrsssttuvwwxyz{}~~|{zyxwvvutsssrrrrrssssttuvvwxyz{|~~}{zyyxwvuttssssssssssstuuvwxyyz{|~~}|{zyxwvuutssssssssstttuuvwxyyz{|}~}|{zyxwwvuuttsssstttttuuvvwxyzz{|}~~}|{zyxxwvvutttttttttttuuvvwxyzz{|}~~}|{zzyxwvvuutttttttttuuuvwwxyz{{|}~~}|{{zyxwwvuutttttttuuuuvvwwxyz{{|}~~}}|{zyxxwvvuutttttuuuuuvwwxxyz{||}~~}|{zyyxwwvuuuuuuuuuuvvvwwxxyz{||}~~}|{zzyxxwvvuuuuuuuuvvvvwwxyyz{||}~~}|{{zyxxwwvvuuuuuvvvvvwwwxyyz{||}~~}||{zyyxwwvvvuuuvvvvvvwwxxyyz{||}~~}||{zzyxxwwvvvvvvvvvvwwwxxyyz{||}~~}}|{zzyxxwwvvvvvvvvvvwwxxxyzz{||}~~}}|{{zyyxxwwvvvvvwwwwwwxxyyzz{||}~~~}|{{zzyxxwwwvvwwwwwwwwxxyyzz{||}~~~}||{zzyyxxwwwwwwwwwwwxxxyyzz{||}~~}||{{zyyxxwwwwwwwwwwwxxxyyz{{||}~~}}|{{zyyxxxwwwwwwwwwxxxyyyz{{||}~~}}|{{zzyyxxwwwwwwwxxxxxyyzz{{|}}~~}}||{zzyyxxxxxxxxxxxxxyyyzz{{|}}~~~}||{{zzyyxxxxxxxxxxxxyyyzz{{|}}~~~}||{{zzyyxxxxxxxxxxxyyyyzz{{|}}~~~~}}|{{zzyyyxxxxxxxxxxyyyzzz{{|}}~~~~}}||{{zzyyyxxxxxxxyyyyyzz{{{|}}~~~}}||{{zzyyyyxxyyyyyyyyzzz{{||}}~~~}}||{{zzzyyyyyyyyyyyyyzzz{{||}}~~~~}}||{{zzyyyyyyyyyyyyzzzz{{||}}~~~~}}||{{zzzyyyyyyyyyyyzzz{{{||}}~~~~}}||{{{zzzyyyyyyyyzzzzz{{{||}}~~~~}}|||{{zzzyyyyyyzzzzzzz{{{||}}~~~~}}}||{{zzzzyyyyzzzzzzz{{{|||}}~~~~}}||{{{zzzzzzzzzzzzzz{{{|||}}~~~~}}|||{{{zzzzzzzzzzzz{{{{|||}}~~~~}}|||{{{zzzzzzzzzzzz{{{{|||}}~~~~}}}||{{{{zzzzzzzzzz{{{{{|||}}~~~~}}}|||{{{zzzzzzzzz{{{{{{||}}}~~~~~}}|||{{{zzzzzzz{{{{{{{|||}}}~~~~~}}|||{{{{zzzz{{{{{{{{{|||}}}~~~~}}}|||{{{{{{{{{{{{{{{{|||}}}~~~~}}}|||{{{{{{{{{{{{{{{||||}}}~~~~~}}||||{{{{{{{{{{{{{{||||}}}~~~~~}}}|||{{{{{{{{{{{{{{||||}}}~~~~~}}}|||{{{{{{{{{{{{{||||}}}}~~~~~}}}||||{{{{{{{{{{{|||||}}}}~~~~~~}}}||||{{{{{{{{{||||||}}}}~~~~~}}}||||{{{{|||||||||||}}}}~~~~~}}}|||||{{||||||||||||}}}~~~~~~}}}}||||||||||||||||||}}}~~~~~~~}}}}|||||||||||||||||}}}}~~~~~~~~}}}|||||||||||||||||}}}}~~~~~~~}}}}|||||||||||||||}}}}}~~~~~~~}}}}|||||||||||||||}}}}}~~~~~~~~}}}}||||||||||||||}}}}}~~~~~~~~}}}}|||||||||||||}}}}}}~~~~~~~~}}}}}|||||||||||}}}}}}~~~~~~~~~~}}}}||||||||}}}}}}}}}~~~~~~~~~}}}}}||||||}}}}}}}}}}~~~~~~~~~}}}}}}||||}}}}}}}}}}}~~~~~~~~~~}}}}}||||}}}}}}}}}}}~~~~~~~~~~}}}}}}||}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m41.bin b/applications/SprPoP/dist/MUS/m41.bin deleted file mode 100644 index d71a464..0000000 --- a/applications/SprPoP/dist/MUS/m41.bin +++ /dev/null @@ -1 +0,0 @@ -~|seY]dcpp{~xybb^gtzu{}|osnb_t|ueoh{rm{|q}zktfUp}pgqpnqsx}r}}~xlsp}t{ov{qmxy}qsdkhw~ykon~lply|~yy|s]d|_cevt{xsohw|nu|~yslrr{zxyotkddejfo{}pxhq{e^Yzygeheeyyy{vpxtmllhsx~sjlsvutlqnow~zz{}|w}vozqz}}z{u]X[l}hrpeilmksqsbhaheajwovrfkdxs}}}yu|ivpvww~~{zzvx}i\XUfitovek`fibjaeejesow{vupnju|wz|ykkrxw|w~w}~}ytx{zg_XZ[i}~xsoikqsgilhrefozz|ypvxvyxv~|x}vw~}sv~~t~|y|~}rggX`VWlzt{rvjpntmqpsvx}z|w|{|ywz}z|ryp}zw{kzvt~xx|sy}}micaXW]cquuq{nmx}{|{x|~}|~z|{{lovqrptri{sxz{}{|xzx{~omj`fUQ^iqzztwr}~yu~z}yv|utozltmfqfnqty{{|wyt~zz|}osjl_[V^gf~vv~zyz|z~{}}zyx{v|~uwqurkuelnl|}}ww{y|zx}}{zrxtlsbZa^\em|{w}xr}{|~wzux}||{uzuioekjhljxz{wz~z{~x~rxpskb]`dWgdo~|}xy|}{{|t{}}{wtzrzojrdqy}w~ywxx}t}yy|tt{mvqejh`c_iu|~}{|vzv}~~zy{}zu}z||xpqonumojjuup}}}yv{wwyswkednc`gZek}}}~~x{~z{|}suu~~x}lpndpuuq~~zyzvzw~~~w}r{|r}tlphbb\ckr{{wxz~zu}y~}xw|y~y}yvqsvopkgpnl{}~{|z~uwyuzpgfnc_fX]`q{yw~y}zv}{uvvstxiosojuzz~yvyx}{rv|pzzpslfgabihrm|zx||z{vy~~yv{y}|{|yww|utskkmesxu~w~yxwzuxvljpk`k_ZZcpuy{{y|~|wy}xsuywrzlntoiqtw}{zx~|~zwxrx}uwnffb_hhler~~{y~v}u}~}{y|x{||~}z}wuumlmgttp|y~zy{zvxxnntjaj_[Zeilw|wy~z~{~w}z}y|u}{~~orvllpps|}|{yy|z}v|p{zyyonkdcjhd\lnpwyzy~zy{|{|}y}~w~~|~}xnqkmvjq}~zvzz}|xzvowwiok_[`e`dkpux~}wz{{t|z~|zw~~wtyrptrptwtz|}v{xw}{zopnkdjkg]fh`kvz}wxux|~}z{}x|}}{}utqt}oqzx}x}}zz~x|}{rxviqqe_ehccecblr||x}}|y{uwxz|~{|~tvywtvvpy|v~vxux{rtsqlrmd\gbYadfw{y|}}z{|}wzz{t||y{zt|}qxzzwqy}{z}|w~y~unxtlgmecbe^Z^ex{~}~wz{uz{x|{~y~w|~z||y|{tzwo}yzxz{rtqplvsjblf\_\\hkv{{}~}{|{sw|u{}yz~|~w}xnsqwv|}~y|~wmuuomunifge[[[hhh}~}yzzvyx}|yzwyz|}z|~}|}ylpzz{{{{w|y|vwnqunfkj^]_[dbgjv|}{|vyu}t{~|u~}y{~}~y|xwwuuts}z}z~|xu{vnqtkmeh`]_djaes~z~}zz|xvz}~uz{www{z|qwzvuz|~yz~wwlssmjspa^]^gafcox~~w~}xv~yptu|y|y||w|w{vuroyzz~~y|xx~xpsulqkoc[]ci__ksyy|{y}v}uty|~wu|zx~xyw~tw{wt}}}||}z|urslgmqfa_[gcfdgrt||z}}xxurruy}z{zy||zzz}puvru~~~}yzuvimhlla`ajf`hmqlx{zx{{ru{x{ury~y{xwz~w{xt~}}}u~y~xuxojorhcc_g`dffpouut{~yt|wtrty|~ty{}|~}}||w~svvru}~}wu}~|mrknlddeh_]fklftw~x|vzuv~z~{zyt{{xz{}vz}ux{yz}}|ywxxrmrpfcbhlae_hooqlo}x|~|uvs{zwzw}vz~{{{v{uqv}wu{~w{vsqiqhfjpk_`fjcflkyw}||wxz~vszy|{xy}xsvw||uys~{|}y~xv|wv{zmgdfoglealmnfblw||}|y}ust}~u|t}ytz|x}||v|{y}ystx|}{|}swmiiomdddfbglfpkpyy}vzyswzyx}~{z|sru||}wyw|zwzwx~~skhmpgpiimjlecjoqv{z~|{wt{{}s|~}{~~|yuyy{~{~|y|xssy}xzy~qortmhkkf]gfej`fko|}{y}wtvwtu}|zwsux||z{zy|{zx}zuorrjqjnsoh`ailkopl|}||{xzv}}}yt{}yyzzz}xzz~zvyv}y}|wtuoghllejgendbbckv~~}zxzytoztx{{zx}vxy}w{~}{~~wyzy~~ywz{mroirsriaemnmkbkoq||xy{~yqpw~}}wtx||{}~|~~}|zyxzx}~zpkkkhhpcehbecdlttu}vsx{vw|s|yv||~~yyuzywz}{xx|}}{y~~swomrpoiefhknldmknz}~}}wx}trx|}|~~zsvyyx}|z|}~}~{x~{~tkklhhsjmk_bceinnnr|zwvux~qwxqtx~z{z~|s{}z~~xvy{z~|}xyv}xmrrpigkolijckkesvzzz}||wsuy{|{x~~wssuw~y{{}}|y{~~|vsnifnhgpga`ckrqlms~|z{zuuz{}rrrt~x{xx{}}{}|~~|yyx|~z{x}}twspicflpniajoiqstz{|{vv{~|zxq{~|}yzxtr|}z}{||}z|~~zuttokskipifc`emolkoyv|z{|yy{s|}trrv{y}~x}zuu{{}}}}zx}|v|v{zsjhjmnoiagdgrrrw}|}|}}sry~~{su~v}ytvyxx~w}}}|~|z}|~yxwurupfnkefhikkkkmqpn|}|zz{~|wzvsru{{y~xyztu}}~z{~|~xx}~x}|zskjnnlkgojalppqqqps{~}{z|~~vryrt}|xvv{tv~{{||~wywuwxw}|pspheeinmfejpnhsss}~{|~}vvxyz{zwv|}}{}}|wux|{|~{|{{|}w}}wuusrohdnjejjnqrmilps}~|~|}x|~rw|z}|{{yw}{~|vwy||~}~~~~zxwyyu{pjjilqqlgfliiqiltw{}vuy}~yuuy{x|~yy}~}{zw{}z~z{||~~}yvx{wrmipkkrmijmjfegkq~~}tyvxzz{}~||}z|~vwtv|}z~~z}yyz|sljlnnmllleepkglprqy|y}{vvzsv|~|vv}{u{||z~~zy|~zz}~~|tiomenqqoljhhhffqsqz|{}yyyuty{{}z~{vtxz||}~y{z~|w}yvtpqsojknodelhlnljkpy~}}~|{{xqyyv|{}~tyzw|{{}z|~yvz}ysuokpnopog`cghiqpq|}~ww}{wsswz|}|yx|||~~~~}|~~|}~z}{xuuvsolikohklbhnolinu{~~~y{~swzsw~|z}~}}{~u}{xz{{~}{|~zrxuiopnnqoidaehpohtwu{}}}~wqqrsx~xvw}}yy~}z~}z}}|yvxxy|yoklmfgqiegkmjjnuz}~~}~yzyz|svyz|}}|uyxy~{zz}|~~~}}|{w|{svrnnlifffcbnsmttruw|}}~xsrssz}{}{x{~yy}{{}~}vtvz|yvpmohfmhjligimrtuwuz~{u}vvxyut{y}~z|}|{~}z}|}~|}~ws|xszysppkeegfeigjtpmpv|~zxwvtrw}v}|}||~}~}|}w}}|~}~~|{wy}{vvunfniekmkcaipsspr~}{v~zz|yvtuz|}vz~}}}}}y~{x||x~|zxrkfdcehokdnpmllqy}{vxxvuysu|{}}{|wy|yy||z}||}{zyzxmolfikliffjoqmirstwz}wqrwy}|}~|vuy|||}{}{|~zu~~}}ukhgdenjgkfhkmosvvxxuwy~ty{uvz}|{~{~|w~~}{~||{{|z|xuznjmkhfgjjhljlslpyz|{}|xvxzyxw{zqnprw{wrtzztvwg[[oyuh[esqe`eo|}xx|}uijwtquk{|xxurss~}trzzwwv|||tf]`pzq`]fs|k_aemv~usspopqqnkifq{rxrhjz{pv{{}{z}}reZ`hm{veYWex|rklhfuxxysuqqvokms~xupy~slmu~xuuw|yvxz~{}}plidbgpwyreWYflz~}}{x||}ywxz}|ysmuusuuvzzvuvytmx}|w|vs|~zvsnjhfhjqqt}woh_Y[bipv}}|xuuquzvxxwvqptnquvy{ytw~}wsuxvkmqmptwvruzyunc`\S^ioty}~~tvxvuvwvx~|xvwvutstz~z{}}~}vqqtuv~~u{xpkige`[]bjkjw{{}}~~}zwvtolousr~}||zv~|yz}{yxvqigka]_aeijhjou||}~}~~|zztssilpotyzxz{|~{{~{rnigihc\[adaiiirx~}yxv{yw~xqpruuqljkoqs|{|~wrjgjcefabfhebdhkr~~~}{vruyyupmtulnonorutuy||~uonmmkheba^ajedjnoqy}xy}uw|vrlkptqljmpkr{w|}|slqkfmlhdbbaabcgrrw{wuvyywnjqmospprrqtvxy~{}yropnihhjd]ffdhiijlt~~~xvzvutsqstrpnokmtsy}~{z~{rrnimmmnkd`bdcciijuy|zwyzyyuuvmrwurpolkouw}}}|zvsnjjmhehbdijfcfkqx~~xuuwxvqprtskorms{}{{}}tpsomnmg`^adglfjpnqw|}ytyzqsuwxwrmllmrz|x{|yqnnniinebfihedhloqsz|zxy}~zsqtvorqlpruwvy~}|}xxtsqpmifa_bjfejhils|yzy{{vuwvpkjklr{y}}{y|~wqrnhnlhifeddfhjllm{~~|{{}}{xuurrxpnqrqqv{~yyxtqmhfgfceifllffhls|y}{v}|ywvsqnkkqqq|}{||}}zwokoiilkfachkkifhqry~zz{zqqxsssqomnv|~|~|}wrlhfffhg_gkhggkpux|z}~~}ztooqpnrtovzzz{~}~xnqmhjkjfabgkljgppp{|yy}ytwrrvvsnnquy}{z~|}xohgedhnhfighhikprsx|}}}}vpoppstmrurvz}~~}vwqjkkigggggiigllktx~|{|yw}vqtvuqnpstvx{~~xqkhefjeijdcgknpoorw}|zvtqopwxruuqqsz~}y}vpnliddhjhfeiplmsuw{~xy}xwvttsstttspw~z}wtpkimjgnkfcbhmollouuyzxwvrquruwqpqsx~~||}xxsniggjkjd`hiippruxz}|{yz|ztpruvuspryw~}}~zxuppkglihhffillkkonpz||xwxxyzrw{uropsvx{}|~~}~|umijjkkhgjeioonnpopv|{|~~zusvyxtnqsox~}{}|||zz{qoqjhghihffilmhlrpw~|zy}}uwwuutsuvttx~~{|~}xrpomjfhledjloonkkmqv~|zxwwxxtvuqvxz~~{zzz}~~}}zuunkiilnlfdhliinknsy}~~|~}~vtuvvvsrrv{y~}~|yxuqokgmliliikmjggjlr}||~~zvstyrrvvw{}{||z{~}||rmjjklkifghgmmimqsuz~zzvtwzzurrutt~~||}~}}}yrkhlghnmjjlkihhimtu|}{}|uu{wxyvvvvvxz{|~~|~ytomnmjiijhbimjmnoopw~}{xvwyxvtutqw{{|~}|{|}|ztmolhlmlkieegijlstu~{wytu{{yxxvtwz{|~}~}~|xuromkhgilgfjhlpqoorx~}||}|zxwwxwquxu{}~}||}||}~|wrsmhllkmnkfdgjkppoxz}||{w{{{zxtqqtx}~~}{zxwwtnihhjfjlfhmpomotx|}|}~zvwzztxvtw{~~~~~}|||~}||ywztoolkjjhfddflsprwvw{{|{||z|~|vsrssz|~~~}zyyyywqljkgeljhijlmnpsuwx}}yxzwy{uvxxxz}}|{~~}}yw{xtwronliggfddklmsqqtx~|zzxusrsv{z~~~|~z|{|~|xtpnjfkihkjgfhmpqrru~~|vz}xxxxvuy|~}~{}{|{}zuplhedfghkglronnqu{|yxwusvvt{~~|z|~~~}~~{yxvmkmhhkljffjnonkout}{||y|{xustx}~~~}}~~~{|~|zunigfehkffkklmnquvy~yvwxxzyuzzy|}~~~}~~}}~|~~}|{|vrrkjkkigffhkmlmrpt{z{}}zvuwxy{{}~~||}}~~~}}{vnihgglkimhgiknpqqsx~zxwy}wwzvvy}~~}{}{{}~||}}wywnmmkhgijihhhnolrvy~~~||zxwwxxwx}}~|{{}~}~zuqlhgjghmjgfinqqoptyz~|yz~{|}wvuw|}}y|~|~||{}}|x|zutplhefikjhelpnstuw{~}yy{{zxvsy||~}~|}}{~~}zvtrolmjhlkihghloopquvw~}{|xy~{xvwy{~~~~||}~||}}}~yy}xwwsmhghijjfgjiotuvyz{~|xwz|{yuxzx}|~~~~||}{~|xwusqqlgkighijkllnqtss{}~~}z~|zxwwyyy|{|~{|}}~}|{|xyywrlihihhgkmhlqstuutvz}{{{|zvywu{~~}}~|{|~}}|~|~|wuvuuxrnnigfgjljhjosqsxw{~}~}yyz{{zywx}~~|zy{}|y{{yurpmjieejihlmptusrtvy~~}{zy{}wz|{}~~}}|{}}z}~{xvvyvsuojhgikljhhlmousty|~zxz||zwwx{z}||zy~~~~~}|zwuutqlhgkijnlklnnmnpsw|wz}y{|{{}~~~~~}~~~|y~~}}{|~~}zz}zy{vpkiijiiiijgkqoqtvwy}|}~|yxyxv}~}~{yy{{|}~}}}zzzzwskikfimmmlkjklmmqvv~|~}{~|zyxwy|}~~z~||{z}|{~~~z{~ywtpnmkhhjkfhlknqqpqtz~}|{{{yuzzz~~zyyz{|z~|z{|{yurrkkmllljfdgjknsqv|}z}~}zwvwz{~~~{}~~}{{|~}~}}{ywurnjhhkihkhhmppnosw{{{|}xx{wy|~~~yxyy}}|}~~~~~}|zuwtmnnllmlhfefinomsvv{~~}yutuvy|}~}||~~}}||}}}{zzzyunjjjghmihjlmlmpsvy{~{|}z||wxz{|}||yx{}z|{|}~~|{x{zuuqmljhfffeflonttsux~~}zwuuuz|}~|zy{~~}{{}zyzzxtqmlhgkiikjjjmprsuuw~}yz~{yzyxwz~~|{~{}~}|{}~~~|wxzvwxtpnkhffgfgjiosrsux}}{xxwvvyzy|z{|~~|y|}}~|{{{xusqlhkhgjkjggkprssu|~|y}{{|{ywwz~z{~||}~~~}|{|xzzxuqlgedegjlhmppqrtx|~~yxxxwyxv{|~~{z{|}||}}~|}}|zxwvvpmmhhjjjhhiloqprww|~}y{}|xvvxz}~~~~~{{{}~||~}~{y|{zywqjgedejhiljlortwxy|}ywwx{|xz{yz}~}|zy}~{~}||}{yxyvstnjjjhgghijlmoutv|~}||}{yxyyyyy~~~|{{|~{{~}~}|{yupliggjijmjhilprssuy}zwz|y{{xxy|}{y~~}~~~|{{|~|{|yxztqoljggijjhfjonrvx{|zyzzyyww}~|{{}}}||}{}~}zvspkjkgikiihilopopsvw}~}{}ywwx{~~|y}z{~}}}|{|~z{}yxvrlhghijifhlkpsstvwy}}z{}|zwuyyz~~}{{}~{z~~|}~{xwvsrqkkmiihhhiklmorqu{}z}~|{yyzz{|~~{{yy{||~||z{zvplkjjiggjghnprsttux}|{|}|xy{x{}}~~|z{}~{}}{~~|}|zywvwtmnliiijkjhikoontvw}}|{zzzyxx{~|~~{yyz|}}||}{xtqnljigilijlmoqqoprv{}|{yz{wy{}~}}|{||z~{|~~|}~~{yxxzyuupkihhjkighlnmrssx||{{|}{xwx{|}~}}|zzyyz~}}|{xvtrnkgfihilllnqqpqrtx|yz~{{|{{|}~}~~~|}z{}}~}}}~~}}zxxzvwvqmjijjjihijjosruxz{~}zz||zxwyyx~}{z{zy|||~~~{xvvutpkhkihlllkklmnpru|~{y{y{}|{||{|}~~z{~{}~|z{~}~|||xzyurnkjihghjjglopsvwxy~~}||{zyzxw{|~~{xxyz|||~~~zxxxvtollgikklmljjlnpsww}~}z}~}|zxvwy|~}~|{}~~|{{}~|{y{ywusqnkhghjhiljmqsssuy~~{yz{{wyzx||zyxy}}{~}}~|zzyxustnklkjkjhffhkottv{||}}~~~{xvvwz~|}}|{{{||}}}~|zxwvtpkihighliilnppqtwz}|z{|y{zxz{}~~|zyy}}}}{{}~}~|zwwxsqpmllkihgffjonruux{~}}{xvuvw}~|{{|}|{y{}~}{{{zvrnlkgikijjjjkmprtvw~}{z}{yzzzz|~~{z|z{~|{{}~}}~z{}yyxsomjgffffhkkprqrsw|}{yxvvyyz}zyz|}}zz~}~}||zwurpjjkijkjhgimoppptz|{}}{|{zxwy|~}{~~|||{|}}}}~}|~{z|zxtplhgffgighnnoprux|{yyyxyzx{~~|{||||z||z~~~{yxwsnnlijkjhfgilnnotvx~||}}{xwxz|~~~~|~|{|}~~|{|~}}}}~|zxsmigffhkhjkklnortvx|{yyyzzwy{z|}||{{z~~{~~|{}|zyzwssokkkjihhiikllqrsy}|}}|yxxxyz{}~|{{|~}{z{~~}~}|{yuplhffihikiiknqstuwz}{yxz}z{|yyy|}{yz}{}~}||}}zzzvwvpnljhfgiiiijosrvy{~}|zzzzyxxx}~|{|}}|{{|||}{zvspmjhjihlkiijmprrtv{}~|zy{yz|zyyy|~z{}{~~}}|||||}|{wyxtsqmjgghiihgknotwx{~}yxyzzyww||}|||{{|}z{~~|yvtqnlkgijiiijkmoprtww}~}~}z}}{yxxz{|~|}{z~~|{||||~|z{xwwtpkhhhhihiljnstuwxy{{zz{{yvxyx}}{z{}|{}|}}}~{wvutssnllihhijjjjmpssv{||||{{zzzzyy||~~~~~|yxy{}~~{zzyvroljihfgjhimortutux{}|{{zy{zx{}~~~|z{|{{~|{}~}~|zxwwwsqpkjiijkihhknnruuy}|{{{{zxwy|}~~~~}{zyy{~}~~}|yvtroljgikikkklnonoqtw~zyystuw}|uwyqonmmnot~rsxw{~xkius[fyjYfuulbbddipz}yrxn}ljox|uqtzr|unnqruvspomvquv~}qgemuxqb[_gqx{zzz{~z~~}zmoyxqmlmnopu|vt~st|~wqor{|z{vnmp{wf]amvvpfbcbeimsz~vryvlkorz{urty}xvvxyyzzxusnkr{ut{~th`adjsxzxuqnnrvzyz~zz~{wronnmnpqpqssy}vv{zuoouyxnjkqx{xphb_ZZ\\`bddflt~vpory~zwtwz}xuqosz{|zwyzzxxz~~xqnifcb_\\^agntz}xtsvvw|{wwuw}{zvtvwyz|~~|tmga^^afgkonoqrqonnopru{}~{zzwx{~~|}~}yvtrrty~~{wspnkijkghhggggecbaadfeinry}}}}{yvuvyzz~|zyxvsqqponnotuuyz{}}|zxvwvuxwwy||xutqprppqsuwz}{xuqonpoqsqrrrrrsuuuutvzy{||||{xvsqnoposwxz}~}{wtsrppqqrvyy}|zyxy|~{xzxxyxvutrpnmllpqt{}zvsplhecb_acbcdcbbdfhjlmsy||ywvutttvvx}~{yyyxurprpppnkhda_^^^_aaflnrv{~}{zyz{zz}~}~}zvsrsssrrttuyzzzzyxy{}~}~}wrpkkkknsx{{xslijqzthiu~rgemw~sp~{j{vht{ursuzx{|{~yedwydawtgbgmrttplloy~}~}yuppysck~lbn~{~~uv}u{||vspmhddhotzxk_WXakqoib]Z\_`eltzyxyuoqw}{~{}wspmlowvqrx|zwstw{tdWV`ori_XW]fnuy{|||||~|}|tryzursw}~|qjjsxttw{}|yvtroqtvz~}yrkfb__afijmoqu|wqlklpv{~~vont~|tonoqrqqqtuz~zz|yzyxx{}sjd_chlpsvyzzz{}~}uomot}ytqrtvwxy|~}xuvuvyz|~zz{wunhc_[Z\_cfghkpqsuutsqpqtz}zwy{|~z{|||||}~|{zzwtutqpoooqv{~{vqlhffhjoqrutqnlklnopsx{{urtrrrsuwxyyzzxwxvvvusstvxyyvvwuuvtroljknrv|zwvtrqoprrw|~}{wvurommnooompppsuttsrqsv{ztpicc`_^^^___abeegkmqvz|}|zy{}~|{xwyyz||}}{yxxxtrrnmljgc`_^^]]^`^_bcdfghlqy|{|zzzyywtqpqqpqqoprsrrrtuwyz}~{{{yxwurqrtvyzwwvsrqqrrrrtx{|~{wwurrrrrqpoqsuuxwvxxyxxxxyyyxzxuusrrrrrsuy}}sogca]\\]ekr{~}wmffoy|zxohht|ml|}pnu~uvo}}lz|xxxzy|xx|xstuwyvi[]pt`Zn|ykekt{~~xtuxwvvqlnx|lrypzyvxyppwxt|uwunkhecbbchnuvmc\\fs{|wpkjmqu{~tmmr{wqqv}{tu~tlq}ytqsvz{x||wurtwxz{yrg]\guzskfdjqx||vqnqzukio~~ytsv|}ww{wutrqpnkhd`afjry{ysmfcbceinpuz{|uqnlnsx}|wvz~xtrpnnopqrsv~zwtrqnmnmmmpsvvrld]X[biry~ztonqx}{xvwxy|}~yusrsqruwz~~xwyz~~zupkda^\\]^`chmrwz|}|{|~}~~vrqoquxz{{|}~}{zzvvwwxzzz{|~}yupkgc``ciorwxwwwvtstwz~}ysnnklptwy{}~~~}}~zyyxwwvsrqrsvxwxxutsrrrrty}~}z{{zyywtqpopsuv{~}{{xutqpoomllmorwxy{ywwwwxxy{}vplgba_\\]_`bdgjlorx|}}{yyxwwx{~}|~{{{zyyyyxvtrqqmjhdb`^\\\\\_cdgiijlpuz~}|zwvtrqqrsssrqtttvvuvwxxzz{{}}|}{xusqqpnmmnnosstuutstvwyz||wuurpppppruwxyxy{z{}|{zzxxwvuuutuvtsrqrtvwy}~{yvrponnopquxy{}}}{ywurqpppprsswxy~}vtqlikumpf\YOKUak~yxylszwnmx}~lt{~v{~{phl~nxuyzupz{iq}{wrw~uxvq~z_Tfy{ttnuxyzxv{x{qoqv{glyulnu|uukkptz~vsyz{vlizpdPRfwwhhcggchenv|x}|~}}zv|yhgdcovvzqmfs}~~wtmsw~x}qhupb^hhlljnlkhjoruqmkd\fp{yqp{xtru{zsrqvzqu~sx|y{y{hfa\arx|tnjr|}zwk\]Zj}}rmpjsuz{w}~yx}swqnkjmppou}|~wttplz|x~z}zwrsz~{}{~xolngdksw~}{rfihfjs~yyvoqzz}}~zy~xskipq}~{{xxvrqvsor~}uqoqtpotwqqrpnnfimorwuusnuupkkkqspr{||}{||w{}yz~{~}{xypiffmmlmlflqpnru|{z~|tssruvtyztqtokilowtqsvnnqy~~}zrqrkc``bjip~~zsrpkgljggkjpiehplnorw~}~~|y{}{ttxuprvz||~zzxz}~y{xsrz|zvwnkjnx~|{zuspsv{}}|zwrpkikg_\__iir|zvqsrnkqnuokmustsu|}xwsv||vrnpmhdkismlkohieeijlmkkegghhw{}z}yutqzzzt{~vqkic[PTQ]dm{}ztromdhghiaaegde`eilpqx~~{~}~|{ryy~{{}|xxqwwwzuspnott|{wsunoiny|xwpnlkx}wrokgbXU\]npz{{yxvtnwszurrvuusmuw}}z{{|{qqonlkclhoommpmmkemlmoiiknrzx~tsqrnphqy|{urmfd[^gkyx~wwsnkiblflgeeigifbmr~y~}}y||z{||zwwmuqvwuvvtttltstzvzusnnjnflv{~|yxz|~}~}~rwwtxpijifjkmyw}yywsoqiqmonjllmosozy|uyvmqsru||wtwuopfgiflgiedae[_dcotv{z}wussrvsp|~|~|y~||vzstrefklmslsqsxzxyummhei`c\^]`cooxx~yx|rqvut~||zxrzsxuurokojhsuy}ytsmolmpslx|y}z|wmsnnskny{y|tttqwx~~~w|{ttrmsknjmou{~swrntmktxz}z~|ptuomnhngihihdbiiix|z}wzwrroqnmoslw}~{zqwsv~x|{zqrqoux~}uyulkifjceemrxzvzvnrnntmo|tzztvuqtlnnrpno{|z}vrpmlfdjlhux~}}}{xwuurnntllst~}}wzuuy~~}}xuyqknknnkpv~wsukijdhkgtrqwqmnhhe`cdgfgr|||}|}wurqmiksmqvu}y|{{wsxxrz~~vwsrqlqxw{wmmljnjov~}|{}~wqvqlokltrz~|v|vwtsslmpvwy}}~}~uokjhdeniipqz{~{zx||~{srturmtxv|{xtsnpv{{vy}v{zrqsu{{|~}vpurkmjlvx|{}zqwunnnmleektz{~{{}||skjllifmjgmnryvz{}yvxxxty|xussnkpttrr|{~tqty|z{{||utuvtmnrknqt~}}utxrrsrqnlu~{vlhjjh``fbeghoww|wx~wuuvwtmlnors{{{{xqorturw~}{}~twwrw}utxwsilnmsw{|}ptvpnmmnnq}~~~~{xyyunmomjcilghimv}zy{yqsx}y}vuuutofemquszy|vu|x{|}zuorvtqjry}}}yzrvwqsu{yusuvskfgcd_bfchlv}{zy|vuxqstwwsns~~v~zyxwtngfoswss{{}|z~z~}zv|}{zzwqosrtpw~y{~~zxysotpuyxztpqrwulcffhdajkqy}}||{yqyvuuw}~~}}uwysrllifbjqrrnzyxuwqwxrrqvtoipuz|||ywxutmvyvuvoqpsog^`b`a]hpz~|~~zyrsntsnqs~}{y}trmppmilqotqx|}z|z|wwwrvuxuqmu~{zzxvr{z|{wyu~~zxvsrvqsoppmfehglkx{zwvtytwwu{{}{yuonfifjljdenqyu{}~~wuw~yx{tsrv~uvyysfej~d]oyb\fqmeggsw}{wvqnp|ngp~yxxtmqs|{ka^oxuigdcil{|w{pcgjy}rs{~xjiurs}uutzwtotzz|zpsrngfio~}e\fzp\Xhuw|vmu{vmfkuxyyvwxvxtthbYY_gnszuwsyyvptvxvqhfadjrz}~}~xvqmkny{zvtw{}woc]`gvzthlkoqqwvxx|vvv}||yvkqttmighny}|~}vxoh^Z`bcgtzz}upmjqokdhggdfpv~yzpolljjjijisu|{}{rjo~}z{~}wmkg_`cr|~twwztttx}yumqqokkpt~ty{{|vunmf[ZX\XUUbm{zyspnoojlkw}{w{||xztsqxz||{rnjpptz|y|}{w|z{vz|{vojjdcZ\`jz}}}xu}}~{}{utyy~z}ywtstrpfd_c`]]ZY]ox{}}~wvsuv|}}wtpspxwxtrwvqkppx|~{ttrrrnvvtjijid_b_go|~wyxvujmllhkjd]X_ZZUWZZ]huy~z~~~zzwyx}urqvzumiqr}|{{}|rhlnmplojhfhea_^efsz{zyqnhklnlje_b_c\\]`gmpq||~z|~z||ywrtrvqpkmrrvtsq{~wpjjppsifhlkgfchgsz|spijfekjf\]]_XWXX^bpsrqvwx~~~|}}|{wzyuolspsotzz{{}{{|xprmhfonkdckjicgglr{~|{z~}{mnlkmkoidbgfb^^ddpuz|zsry|yz~x|xz~~zzzqtstsrmgjlqkmqxwurtqplojjmjnkmlqv}{~||yqiiikldcaeba]\]]gmssxvplr|yyv~}}|uz||toorsopntwyunonmsqkbgjnkeiknp{}|w|}xu{}|wwwxv|}||xqkqpngdmmkdffhktyw|xxuuuvuu{{}yyxxz{yv{zuxvusswqljpnmhlpq~{twruvzwmgmtpojosy}~}uuyx|}{z}ztwuqmmkcfeigcacejqoussopvumiqu}z}}{z}|}|~x{{|xvrvvuqnppw}wtoqptupmlljmilklx}{x~xvv{uwpnolrvyutu}}}z{}ulmnsnkkmlnyz|z}vux|}snnyz|{vuvwtz|xvy|{}|wpsyxvimrrmiijmq~~~}w}~|ws{ytlqsux~~y~wrsrsqyyvouz{yv~~}yvvz~wlgomlfejjotywysqqsysqooosvwslstxz|z|zzyutvytpnrq{{}yxyxxnqtxtmhlqu~~|~uxw{z{~ukhkhooomjprvqsu||ywutsmpnrz~{v~~zuu{zusyqpnnsx|ywt{|}yv|}xzxxyysonotnljkkluz}|}|~yx|{zwvs|}~}xuolrtvmlrvtpqswx~~yz}zxpuxulijknp|}~|wtwwvmorvvroijjnkqyzwt}|~|}|zorzyxnqtuy~~}}}wpvyvtqvuuz}yy|z{wumnpkginhfelpnklstxxzwpruwvwu{{z|ujgmkpstuquy~zyx}~wuvrxyyslmorlljlqz~||w|}}}}y}~wqrqtutnmhorpqossz||}~wsovvutrpmw}|zyxrlptrsrphebelqtmov~~}}~~xz}~}uxzysstwwx~z|}{z~|uz||uuvy|{||zzvnkhhfopk``ikmfkpsxw}}|x}yxzyzvxnmniflsqnlu{{xywxurruvompwungmqr{||yy}wwv~|x|}{sqrlqsvrkjnrmootx~~}~}suwywpsu{~y|srtvrorheeffghijhrtxy{~}{|ytu}|}wvtx~~yw~ywuy|z{|y}z|{~{wmlifijlfeikgffhnmz~}|~~|}{xqljkhnqnffotwquz{{yutywsiostsnsrpt|{y~~zstv{{y}vxzxt}{vwsqqwtnjpxunhopu}yx~}zuuyv}~{xxzzwvskbfbbgjlc`fpppou{{vx|~xxy}~~z{}z~ysrvwwyz|u{~}~}~vqnminmlebjknhfehnx|{}~}qplkkoqlijmlnkpst|}wz}~xqpuuqomrqy~||{}wtw{wwurjnnox{ysv|~vrkdkZ_nt~~}{pyrbjhfpq}}u}qf}zgcf`qx|~ures`gvvtkkjuueelnbhv{{}y{}uryqkfeabpqz}timgpsw~~mvzssfi{xy|qww|~z~x}wr]b~slo}|~norro{yucX[bgu~uswvnnprs}tsijdgwvposi[ikkxwrhs~xzzt||~j^QMavwyhd\VU[_`l|ypnheiwx~rkmz{vsx|{}zxysvqqxjflumgy}vvqZUNPjvmkkuv~y{ugjhbaimhoy|{wtg_[a_bjo~|}vzyuxwypjtjho{zz|mY[[e~{ppmnhhxnhgjjbtusuomhfir{tzsj_]Z`hhoyu}qu{x~uxwyxvwlszv~}|tricW^gi~|xvofnh^eehZfjhicbc_em~wnikkmnmxquu|yuzsyy~xy}w{zwyslyv{{xth`VSKN[`x|rvxmqmsekmiknmj_acuts}z}rnnswuz}vtz~w|x|vy~|{~zqslxrt}vqg_SOHPcfxpwvuz||~|{tggbrswr~}xrhilpwxywwuumogejpsp{y~zysvytrojcWZV_mo}wzxqx{zpom}vzzwmllnsuy{~xlkaclmicmkjoozu~~zxxy{|z{vupjjjje\^Ufqy}xuuz||~}wwsuzvwturwz|vuimsoibf^ijrrprqqpttlsp|{xyt{tqca_a_QRRQgk~}y~}{xlmbrsw}~urzu~|pivwslijirozssmljqxnjmjysx{||xnea]`[SXLV_fz~mnijrjz~~}xlyt{zuseowttmldony{xttut|wmrhqqsyz}y}wmkglj[_VS]Zmy~xvlvlt{x}~y{xxyxy{|igrnneb]cin{{ztsox~rwts~vx~}{ysxnvyxpqmjmb_cV`_kzwzqtvqx}~{x{rzw}kqrmngc]dbntqjjijwtq{sxwy}{zvztltrled`edX`\[dapxzrskury~|}y}plqt~s|yzvngdhdpsrllehqikogqnx}uqtofegcg^S\TVY\muxrnfnisx{likq|zxyupjllkz}wrqhkoclokqlx{~wwytmljgk_U[PX\bou|wpfkiw{{~okjpwsxrtrokppmz|xvumosirtpuq{|y}{zx|xx|tjjkjpeZbY_ckvz~vlrq}|zvy|tpoxxu{srpkgkicqwssuopuflspxvz}}{{uwupslcbedmi\bY\fp~pqq|~~yuxw{{syrtwzyusmginenvroqkfkbamluy~yvxmsnc]_]cfV[XVcoy|ljlw|{yxxlwwmnqz|xxsmqvkoysopkelc]hfnt}||yuwre^^Y]cX]ZT_l~w~pllu{z}yxktumptw}zxzwprwmp{wtvsjnf_hekr~~|w}}|twrfa`]bi^d_Xanvqpy~ww~|ymyzuu{x{vttojqtjq{xxxqjofdkhqzyty{vvyqumdbb]ce^i`\fwxtv~tw}}z{wo{wuw}{tstoltqgptpsslhlbiljr|vtwxs{uqqd^]ZWa_`i^`ly~vt|}t|v}{uwknupry|zzwpryniroqurggd^gaep~xy}{ytul^\\YY_YcaX\l~~}{xrrz}|{|~wuqitomqz|zzus|zntvsyxpgg\ceahu~|y{|w{xwgca_Z`\_eYWcu}}spw{{yz{ottmnuz~zywvqytsvpw{xmldekcep|~|utxty~x|nbaa]^a`kd[^p{|vy}y{xx}{tpxpou}|xwqp|wnsooy{vnkaihciyxuuvr}vvtb_]_Z__fk_Ydu~{w{}yuz~}|vwmstnq{}zxou|urtjqvxoib`hbam}|xyvu|sxpb^\[V[Zee[Yhuz~~|wxz|v{y|~|vukrnhmyz}~{r|wxvkruwnkbbg_^ly}|w{w{}w|pe_]ZUY[hd[Zhsz~{}y|z{~x}x}xumrkgp}|~|s{~w{xntx{rndeh_]kx~}ztxu{{tzpha_]Y\^kh__ir{~~}~|~~x}v{}xxquojq~|ypw{vzzouvzrpggkdanz}}zruqu~xqvojc_^XZ\klefov||||{svpqz{{uxswqjoz}ruxtvzoppvrojgmidkw~}usqp|zproidZ[UWWfnkktv{tvz~|rtqltuyqspsrjj|~yvyutzrqpstmkfjgchsz{vvq{|sqoih\]VVU`kkkuv}suw}~turlrsxpppuukiy~{x{vv}wwrsunlgkiejrv|~wvpy|trpkna_XXW_jknzzuuw}||ssqlqqyrrsxxnky}{z{vv}wyssupomplhntv~w|zvtnwyssomnb`Y[Zdmos}uuy}x|oqmloqzqqr{zpo~}yzxqtzv{qttrpopkjsuy{s|zxrnutopikka_X\]gmow}zss{~wxmoiliptnos|wouy{upwwxynsnonqnilwt~yw{{qrtponhnfbZWZ^fim||uqr}}{tnlhkgsqnnvzrlvz~}tt{y~uppnpprkgpsr~~t{}zrvsqslmnfbVY\cfhr~}~spvz}rokpjouporzumrw}xsz{~ttorruogjsoy~tu|~vvuprpmrji]Z]bffkyzytu~{{vqlnmitsrqy{spvv~|su{~yvpqtvvmisrt|{ryy{ttomqlqnmgY\`ffgs|}xtx~y}rlhogkrrru{xptuzxquxvtlqtyulmtpy{wuxzxvrlnnlpjm`X[bfdixz~ury}|zqjknelnqptxupur}wquy~yrjptxsimqpyyuxw}zwqknmmnio`Y\cebiwy~vtxz~{sjnmflkpqvxuruq~wsv|~|qiouytlpoqxvuyu~|xpjmmqokqb[]eebjxzyvyy}{tjnmgljqtwywvwr~ystyuiow|xprpryutwqx}woiklqnjrg^^fifky||xzy~}ztjlmglgntxzyz|u~xrquzjlt{zttrs}wvvqs~yogfhnngpkb_fkhjx}}zzz{~z|vmikdjegqwzz|z~~ytqp|~}~mgnx{xwvr~zz|wto{|rgcdjpflmf`bjkju|{||zyx}}}}wpijcifcmvzy{}}zusoy}{qhjv{yxwp{zx~xunx}vidchqgkmhdcjlktz|z}~{yx~{{~|xskldjhbjv{y{yutpw||ukjt{zzyq{{y~}ytmv{xicafqilmkiflnnuy}y}{yxz{zxsnkckhcjx}{}vttqyz}tlkv|{~zs}z{~|{rmux~vga_goiolkjimoqxy~~w}{yvywwvqnhbkfcky~z~tssqxv~}sllw||xu~z~~||ootx~se`^hkinilkjmotxzyv}yz}y~wuvuppdejccmz{y|rtruwwxqknwz}ty{{}{otu{}od_`jhmlimljknut~uw|w|y}~vuwtsmbjfcer|yyxtvuyu~~upkqxzxtzx~|{~tsuv~xib^gjlohlnkhjqtuzv{xx~}zzsvvttfhjeekyzw~uvuzvyyuoouy~}txv{~y~}zqusz|qf`ciiqkjnojhmtq}vwx|~z}|tqvtwoekgefpzyyztuwzs~~xuoouzzxxw}y}wuttzxmc^eflpikppihpsrzux}y}||~|~qqttwjgheegryx|~xuu{wt~zwsoot|y{vx{y~wxtuxvlb`fdonhkqoghrqvxux|z||~~|}}ppsuviifeehqxx}|yuv|ut|xwtpns|~y|ty~zx}yytuwumcbecpmilsqghrpxxux}|{|}{}~oorvvkkfegiovz~|{uv}uu{xxwsnq|~{~ux}zw|{zuuutoececpoknuvljsryzvx|{{yyqmpvwnngfikov|~~ut}vtxvxxwpo{}wx}zv{|~{|tsrqqgdeanpmnuyrltu|~ww~{z}{vuklrxppieimos{xryxrvsvxzuov}}x|{xx}{~wsqoqmef`ipopt{yqtw{}yvz|z{~u|znimwrrnfhmppw}suysvqsw{ypq}}y|{xwz}z{urmnphhafoort{}vuwz}|wz|zy}u{}qikwstrghnrqtvvytwqrw{{sq{|{{ywvx~}z}wsmmqlkcfoptv|~zxwz}|z{~~zw|uz}}sjivtvujjotrtxwxuxq~}xwwtuxztz{yqjnspmdkvzi[[c]jvz~x~{oyvceiv~|~~^[{xqrjekmxxtv]RcHTjsxla[VX]bjq|wjnusnqq}xvrnprqox|}iX[^m|zl_itpjinjhp|qUFY]QTcokkeabfipy}vrpc^jx{rjgwx|xy~w}~~pe]eijmuzrkqnux~yqkgs~}yojpzfNIMk{h]ghhjffknqtzkdabaV`k}xghoox}sjhuvyywxtprvtimov~|srjmyyx||gOJIVwtpnfga^bhiiq{v|~|sf^]`f\[clseidhlpx~xpliu|z~{{xz||ssmip~pVJIJ^|zmgaVSX[[\jllttri_]^hi^cerslidfehqxzsuxrppr~~{y|snpiks~scLJIOfuobVSWWSXgekoqof__cnhcefvwskigdhpuumt{yvwuz~wy|}ujklinx}sl[IJJUl|vh\YZYS[ggnqusjddhrkhgiy}xoolhltywqw{}z{x|~}}uz|x|xpdijjr||skgWIKM[r~qebcaZakmuvzxnifjsmkhk{|suqmqz}x}~~z{yy{u{zuwx|}zsl^eimw}tldcWKNRavymiihafos{|unjjrnokn}xzwru~~}xwstzv~|stsw~x~zzvqk\aio{{yunh``ZNQVf{vponhirw{rkhonqqq~{}}wwzusolwyutqry~|~vy||zurrmk^\gp~||vsnid^\]TW\k}vssolsvwohklqwv~}z~upmkfs|yuqot{~{zxvyyxqmmjja[fqy|w~tojeb]Z]X]bo{wurouvypgijq{{|}sliicq}{wqnry}zxyvvvvoiighb]gqy~~{uz~smga_[Z]\chs~zxtrwvzqhihq~~{phggbp~~yrnqy}yx~xwuutlffehb`hsy}}}~ysy{}}qjc^^Z[^^hkw}yttwvypgigswmefdbr~{sory|xy~yxttrjdcdhadiu}z||}}~wsyx}{oh`\\Z]^bln{~ytxwx~xniihx~sicfafs|spuyxywz{npqhkdlpebcin}x{~|vxwvsifamh`^b_av~}vz~zzri\i|xp^T_]fs}xumqyt|{smliY_gdk`er|~||{{z{v|zsaUa_db[ijlw}z{{upnhq~t}}ppe^_bht~tuxymx~uuknkbahjbbhs}{~~vlws{}usg`bhc^bfgly|~|z|upkkw|s|}}vrj`]^`eu}{|t|y|}yx|zmlmg`dgf__dq|q~~ws{{wumb]bb^Y`cms~~~||xoifpv}x|~yplbbb^mn{{w}vy}}w{|skfe_c`ipegl{|~~|zpttuqlecd`ld\`gik~}w||unoivz~ypjb_Vbdqy|wxuuwz|w|pljh_\f`ghqw||wzy{tv~qndbW`daffnpu}z~}zyuprs}vw~xxnh_\[cyuxy~w{qikjjbc`kmeo|~y|}y{zvnwswsjcZZYhbcnxx}y}}pmnuv}|vsoxwgd__Xhrwyrw}~~quhccb][ifkis~}z|zvokmylg_^SZdchgs}{xw}xslep~{}x{riwqn`TZ^flyrx{}xrrddYX^chjtoxvyz}x|xvglqokWTTXZalpv{yxuwxqkqz}w}qpjlhlcb`gnsvrxt|tv}}uhfZ]Xafqwzw{wzs||nnkhdhi`^W]\fhrz}uw|{|vvxyu|z{z|~tqmlhb`cnly~|zuuxv{xxqeb_cb_mn~wkruzwzwxvqoihca[_Z\fi~~zzwwrszs}~{|xzrelbhb^fp{z~{{z~~xrk]dY\]hkuzytyt|~xuuwwgibedUWV`^ryy|rztx|}yrw}~|}{xrrhjafg_f^m}twoy{x{xxfj_`]Sclw{wut}wy~s{qrlkc_h\^OP`htzw~zv|pwvuvvx|z|}{tuxk_gehca]io}~sy}{ptsh`YXZcfxyzsqsv|u}rvnbidea\SUU^q{~xxqpux~|x}{r}z{xtmldallhghl~|yzsvuvv}vwqcZZYeqp~vtthx{|wrlmhaiifa[Wc`hw{{stuu~wy|vzyv{ytjmaaf]danu|~{xzv|~lk\ZYYdk{z|smqqtywtlp`^cZ\RXZhp{zursw|yxx|y}wqxbjdid`j[lnul|sysz}qtbb]_aYoq~swyt}sywoymkedcejV_PVeu{x}v~|n|sxz||vv|~wzgq_[cdlabgqxxzyy|myo`cYSanj}}}uroqw~}ynrl[a`a\UR_]o{}|y{sxypzn|zz{pruurreha`kegkhryzx~vtpin_W^^ewu{sxnu|~upiceahg]WWTnpr}y}mu{uy|ywxwxuxxujjagk]mg`ktyzxxvwn\_\_\dn|zzxrqwx|xtjdbeW_dYV[be}}}vwquswxtxrr{rswkk_^Zdneplu~y}zyxnyia_`_Yns~{rom|p|khic_Tb_`[^fl~yrsrytyy~svtumpltqbcXfegsjm~uy{twzckca]Ybq}~qknsryxlucdXWf`a]U[r|vsxrrolq|vs{loorj_QZd^ryq}vxzvvujmm]e_gouzxqtmostsorm\P_XZidais}~uqvmuyqr|~|sfhhitpd\^Vhrk|y~vxus{}uotloX\kdnu~}nrjcnvmqsj[d][`Wdcet|~}~szsdmk{zrpkhsaccYVXikv~vtvp{rmjjf]mltpvouukmokxsjf_[TXXalmyo~}xsuzlomzzu|mcengefccZ`kk{{wuutvxzynoeffgju|{xknqgfmomgmncWXXbisrvxy}zphkqryyv}|tqkfb^a^b`Zcwv|w|txwpsidqkdiru{}~zytqurqjqtfned]OXbdpqpqx}||kpnmltswppqaaa\]ie^dem}y}twztv}lmoffbiyx}|~uxppjdgnrgqaV]W_pgpsy~{|sqjrliqpvu~pce\Zeach^[ity~}xssostjle`hmz~~{y~yqznkjmkmg]h\Ubbcjp~}|~molhhhr~{lr_V\dchkd]`o{|ztyrvusldnjmwu{~z}mipdlmtfblab^agiplr~{|vmuhejv}qrfc_gfjl^aa_jx|{}q|s|ttqceeint~|}ysqsnoetijqah_RYekixwu|{lifees}yacg__meZg_ajrwx{tsykuritkikhmx}wsunlmm`nl]ob[`^cgkls{yuy|hjh`jm}{ynjhia[gbab\bY`n}utzpvqttijjqpz~vkgikieurjkadZW_joluyy{{zzhegjjquqfjeZ[]_\acbkpzppstt{yuofmnx}yrpmlmdgjlfdg__]hut|~z{|||qkcjlm}z{yoggd`^]gddibfoz{potouztvppnqxxuqlghjikiomfid[`ampy}u|zw}tnlikir|yz}qji[YV[_bgino{wvornoorrnvxw}}~~xrwrikebgdhdfdeacqsy~yysronilqlqy{{utngdc`X]_\aetvx}~}{slsqnqt~vqtxw~|uqilgfehfgh__^gibgwz{zttpvnfhpmw~yzobZ[cZW]dakpz~}z~zlionkru}xs||}}vsj_][hfcag_afinip|qqulroplcjz{ywvpqh\`^bZTalnp{||xzyurfguzwz|v{u|uqysjhg[caig[`hgbghq}qjw|xqqfmktv~lhjc[\\[ccopps~u}zxkkilwxx~~~}~ux}|}g^ed`^cajbiidbjoxsqozwqonmwwxy}z}uynlf\VYYbnmpovxyurlurmpo~{ww}{zvxpshfh_Y_`gnfebdrrz~uzwongoplkv~wwsswi`YV`[]aqkszwxoqqjgnup}~p~|ssnlrfa\Xeba^jaeim}wz~}tnrukunwqfv~zv}tofiYZ[[eYasxyzx{u}rxnaouywyx}zvrxnh`i\_`cm[_mnmgls~ufsvulkitw|}y|zx}gejfaYY[hfu|x|q|~smjrss}uzx{~xvwxrxb_jgf_aajbmtllvy{ysvxtyklloxytnseflb\c`mtlqoy|qnlk}xvys|z{w~sungkcdnfakfnrfgcfv~~xuo{tsgmpsr|y|usua]YUbdjixt{y{}oloooswyq}}suuohpc]^Yfileoomwv|tvrtq~ruoq|n|wzptvsheg_hapoeux~~~}~w}xtl{mp|vuz|~qtmknje`j`liqvbkqsus{~q{uk{{|smmz}w}~~vi`fcg`aiyu}zs|~}~|{oz|}o{vs||uuuxpvuw{zyx}z{rlsu`oohmbdlsq~y~yoj[jfimcu{|xtlz|yz|won|u}vr{zs|pjqghnvs~}x}qwfabi_nsvroiirr|q|v|tnttwnkdblv|}z|ri}orwiywtz}uy~kpvpy|ytqo{|jlmuvfgk[hsrspewyv}}~sxxokvv}|xmhenm~uvuunfnoxrr~xv{ypiklfkr|~yiz}uuyqrhafjhzzwpwy||qpr`idqu{{rgsr}~~}uvktqp}pu|sw}}vfofbhoy~|sz{}w|tusvxkemcqs~vovy}zsxlpiiim~u}risozw}~wtprmqwo~wzy|phcfe_uytmwyv}~xtqobkasx{}}xyy~xsrcicmzry}wkjyyt~vt{ylzqt{u}{~}lnkeeji~}u}zr~{|s{u~sopimvw|zz{uvz{sjoidk{tuyqenu~xyz~t}smowus|~zqlgbdddv}}}txqt|w{yzyrmrfj|uw}}|{}yusdkff|mv|knsw~wy}~tzrvvw{oyz||}nwkej]lx{wyur}{zt~zrxrppyvt{~ryyzvrgggcxpyw~zfi{{~}w|tmqvzp}z{}nooe`_hm|}yppw}yp|smwjst{w}}}w}~pgl_opmyxsovx|{{|{zxuruxv|y}vo{hfdZiyz}rt{}}zt{ytvzyu}zx{w~v}~~~|}~k_hbintw{jlt}}tuuvuvwry}xntjdZ\ot~|xulxx~tx|utuyts~||z{wzz|jkdaratx|~~vux~~y|yt}yn{s}y|zsuukoYcswzwttz}~~xs|my~xu{x|t|t{yzed_dlfx|{pyw{~vvzyrp|qzszrfl][n{twskt}y|vu|swu~stw~y|{~zwpnahliuw|xy{zzz{wsq}~|{v{lko\ctu~}ywyus}w|}s||~uvz~{|v}y~}||ywlmh[klnzpzz~~u~~rvvzx|{uxfhg]ksz}uqosvm}y}my|u~|uy}up}x|wytw|zupkalgpzzwz~}ps~xr}v|vu}ilkgus}qquovqs~uxusuw{zztyy||uyvrqku`dgry}}z}}}|xv~vxst|v~vmrictxy~x|rsjrvhm|y{vz{ssv|w~}{|x}xrotrrwkjgwzw}w~|~xzyuw|y{ywpqelvu}}zuqns|nn}vvr~|sy{~wux|{{oxtwpgmfp||y~wz{zxsxqv~{}z}zkphg{wz~zxupouktv}}}w|xyx|xxu}w|qz|suyqs|qsphgmwsy~x{zp~uvsy}y~ynqrft{{{qwsfvpi{yz||z{tw|}x~xy{yx~{zqrswrs}qrvdlfjqy{{xwmqox~z{mzmptt~y|ysklomqqu~z}ysxtzwvx|{|wszpozqrur{milpnu}~y{z|n|~tr}~tprlmsy~zy|svslsos{p||~wwzxwx}{y}{h~~urxzyvr}zjcgqns}yww{xvuz~|wsyjkon~|ywxsstgsutv~|u}}|x||u~|{~}{moyvvsryvmsbgkmp{|zztv}|tw{yx|urqmqnu|}|qptgnunu|{}xxtvw}vvywzmu{ywnssvrv{kdbrpkzyzmzyx|vsw|y}qruuw|{~}z{vmmikvqny{~|{}yrwzus{wwpz{~vnomq|ls|pgisvryzts}z{uvxr~wnttr~}|zvzplqipusuy~|ww{uxz|p|~~}qkzssspop|uuzwnonqs~wut~{z|yuuuszxvrpvz{vxjsnvslpy~zzyz}zws~}wsksq||rsrsnsqy}rrnksqy}r{~vyvuu~}ym}vquz~wy{zsmksqklv||}~uvzrvu|}seqvz{yzukriksq}ytoomt|{~vzzrw}~ynu}rvyq~{|tpxzqqmlsmgw~{zzssq~su~{lkx{xr~tvomeimuurwvqu{|}~zvyvx~}vr|xy~xxvoosyzohmxrjsz|wovs|xy}tjqtyvpuyyjkjipt~sx}wxv|~}}wvzxqv{zxt{y|y|r\U[VT]kr{|vzz}wxz~~{opllh^Wdq|muxXUz{{xrzp|tqkopxz~zmblzzwpxreXWnw_\ju}qss}wy{xprjjggm~|tfhw{ihn~mdci}raantztormlyw||wptrupuzony}xpfvld\[^jyytvpovwzpq||ypwu~e\\uxtzskmrfdbklhiytuutxmroi^Y_]\coy~x{~usnknr{oliruoouv}xo``hnzobZZkpwtvxsimcXSVcgk|okssz~~veea\_o}|xy{uvlkhorpry{zvpmiqy~uqoxwpqmd\gkvyz~xzwkfcnoknzgZ^`l{{~}|{xu|zxmuuz~vvorvrxtlggffj{zthb`lv{~~thlpto||y{ynor~vr|}~tc_cblr|x}|puy|yxvrusvxommemjjh_X[_js}pkgjqrrypklowqd_dhffxy}}zsyxoryu{yw|w~}~vxspxyvvhkggfagtztkmiepqxyutvuvtyxt{wpimslbbhonrwmsqth`dq||{|~}}zxptkgupnieijns}}ypkgdi_`ingn~wxrsvyw}rg_U^c_fdwxrnlxpkruv|{~}p{|}z}zzvsqlfa\cn{}p]ac\hiosnppkdgr|zxwt|xmcvz}}lpsty}yt{wjalmv}~{z~xpty~~w}{~twuqpwq{}{owwuufgfktwpx|{{sbbYVZc`YY_hputmmwxf\ef{ywzourzsegasnecm~v{~xlgbtslchupgf`X\ege`eojcenl~xlnww~yqjq{}vu{|~uutti_jni]bffv}sls|wndo{zshl~~z}{zh^[_dx{lnqqjf`]kvyrqvwsq~}nlwz}vochrywxtkcbZcnkzylkvy}rqr}smdf]fek{|}tvoh_bZ`p{xw{qijmalzwp_UY]o}{|szyyxv|~tumhXP[gqwvomnpztjntz|w|y{ux{tum`WNW[fijovt}wyx~jjdkovqt|www~yvztvz}|ruxjjp}}sligapx{{ypxnnknkszqhXalw|}kkh{{zwwpwskadZZ_eho}vutvjnukjglbfvt|~u{sn_eo~}xrqszpjquvznko|}{jparxmz|z|kzrpkn][rjjks~~vqxvjokrfnzqoq|zyyk}v{{}~x|r_mbcV]bblmizrurvs}qvptz{quy{sr}urw{{}sce\dlqlyx||{|uykntb\e\lsuy|ytqwv{rx~}zt{}wwru|ktzyx{|}yxvxtr}xtiokm|y~y}vxpemcigjfdjmkw{{}uiuv|~wvibpcdbry{|xv{|wzrx_d`^_oiowx}{zolwo}qy|t|{yy}z~}ktqiejmb`ghew~p|vwgextzwlhvwxuwqnts|~|my{hi|x}}u~~xkh]kotv}uvy~vquwygTapzwy~x{|z~vstwosnjpv~ynyvhfr}ndeq~ssv}wzuuu|zqiYO\i{~~zsgo~yqjdlx|wqjhmwjho|}}wrsvogox|ha\`\cokibXYYfggkxqlgigjsrwvpnnof`ftvurvtkc{|yvxj`]W\alx~{geow{}~~|smqsu{tndrwxyzwrmi`edbnp|~r{~}qgh|}~z|dU^hhlz{z{zvxyxvnid^UZmn~wo~uzruz{~nsujtuwoq~vx~xs{|hgnojalnipts|po{ux}yxs|{pgX]cgxty{tdlw|vqnojorina`^_ors}z}|rn_m|r{{xvnYVTVkl|}xkw}tzyjnz{uqjusruhce{~yspmorp}}~{ty|rfiitqtrrontx}xyxs{{x}xy~y~ws}ywm\hkjqgm]RXUZ`pmz}xgtuwkgdg[\cftnwywt~uyz}z~wo}xssmfbluqz~wsffmnhjl||{ntpsnrsls|wuvykebmnuurenpijhuuv~yqoj_ejgrrppng_mjxuz~xpow}zz~{}}~yu~pxyzw{wzpgkbkbY]`b\ryyywzsv|qsjxytsyyzzx||zz{s{~w{vmnacX[X`lx|~~~|jmwzwt{|t~zpmuswm}yyzvywptpjc]gxw{ykolknvowwqpskn{yzorlqw{xlik~~{{nemnsuoy{vvtw}vlolimrli{|}}|}|wvsiY]iilfk|{qltfrz{sqrfopds~~~swfamv||n`[x|}{wnt|ythll\gro}}vgdy}}}cclz{tsdgsyrejjjytwztywsxsx{snpn|xvrztqf[`|{rgix}}xqfoxlerptjOQeoZZf[SKGA@OQ_tswu{vu}yxsfpvnllofmj]dpwvniw{|~~xxwvi]^o{||zzylfninwxsfecotmszzub\`ZRWjuqpsmyukpvpee][ew{saYSWenw|uqeledjsjlfhiuoYbfut^V_bgnz~~tyz{pmoy}hgfqfehccXPYY\`y~}p`^YWSXppq}knhjvqnps}vlvvy|lnvqzzgdjphjrx}{obhdmywz{}ufkoie]fsjjefu|zxv{zzwgS[\\Z`mtxogxy}}kkp|xszy{z}s}|uqq~~z~zspqrvicdnxz}}|zwxvp{~z[UUSUZprxqlkovmgfip_`eqvquottx||}{xsfsr|yzomtsujnigsxwss{y~srvssv{t|nntupv~}}~qqvvwq{slhlleeWXW]n{|vlgkmsjphbmotr}yvpnlyncbgy|{x{{wwump}xohee[brxxmlery|~stqrov}}x}pnku{v~zu}~zxy}{zwwxx}msnrzvwtvvvvoow{{x~}~nnglneq{rumgd^ahfmk}}{|oqhkzxyx~vmsrwnuv{zyuq{ymoswts|}kaaaijz|yz~x{tig[d]TajniaWSdcmgdajouy}upnrqvpqiv||yqrospijklji_]mkw{w|y~~~mejYW`chbb\o||zv{mnthg^eamvfibbuvuproed`h_\]gktxo}srtzxplphrnv~}~~~|}yq_kfds}xty|{~}xwwuumfXchc]X\W\^r|}tvw~o{{}ux|xrxy~}|ztekhw{}{rdkmyykghhnim{otvuulrl{qpcgz}wws~y{xz~umnv~q|yw|zyv}tnzwx}hoienoy{wolsxuspssgrsfjcg][`dvz{zyjrxrjqx|yn}{yywwy~}{rqkfevu{}kqfiljtrmdcaiwvk`]Y`\Shkku{}~{{rhtx}}vw|{kuyrjrv|riqlrjhccniszwz}x{|z}rtkqoltpia_V`oniinu~|tvxzhbkmutopzwgqtjbhkryhchhts{y}~|x{uuvpsq}||{n|zu}rqgolgpqpqxq~~z~r{|tkrovujelkV[^XS\gy|tt}x~vzggmqz~|{}vngmrtxotnimj{}{~vmtseqtttu~zxtryvwiols{vs~}y{{z~qlw{xzsko|zusx}x|usujdjt}suzrrvus{ti{|rszlpvuvqwtokbfantfos{wutw}rw}~~stmx|smoulsulorlswz|ywuvurzvfq|yxuidj]_bbhhpsw{y}yx|~z{upppr{~mkrxzpnlmj^oxzsw~{z|~vpuz~}|upvqoonltq`dmjji`\faku{~usy}wz~yypmnlky{v{hcjtytvx}~wx}tv|vt|tqmjyz~z{|}}vtuqonkmxsgpz~~z}|w|rqwztx}spj\ZZWVfhnwlo}}}y~ofkolmy{}y|~{utrs|~zllqcddfjor|u|ss|~wo}ulouwu~y}umsxx~|x{wvyr{wpoonvpo{wrt}|yu~|yuromr}{r|}|}ywxxzy~stmsvms~~~~vhitqna^clozuw}vw{wsyy{s{~rt~zyutoobcifjnrv~}}zysmjsieoyvtwztkdtz{vztwxts}|rlx~~yshmnt{vuwwmrwv}tu~wr|}xvvunn|yprlluupe`W`]U[mru{wuvvpvyyloz~~}{tjirs||{|{~{spqttmclpjs~wyxwmvxuvlsyzrnhjwrp}zw{{|xjiif`ffql]U]fnqy{zx~|xvuv{|wx~uqoy~~z}zyv}~{nfgfaZgkflmk||{}wtyw~{tmkmjinuww}{qz~vtntrxvnkkdefluz}}y}zy}v~~~plnsoo|zpyxon|tvy}}smilhsvlmsjjktu{~{}u~{wqwx{~}||yutufbpwmmrz|yxtq~ylfnyyzztnizvfn{{qs|yujgyvo{vn|}pzwnh^gijbcbcgdh}|pjy~kWPGOSRXjv{upko{wmrx|~ljdfi}ywj_iq||l`fywqipvpnpfmsyy{}tpqlw{|}~~}}updZOSRTe}mTQRX[mmiklzwujijszsq~~}kYZn}tvqrywxv{xjfYZ[]l}ypqnovw{tp{ztig_`_krv|z~}z{uf`PCId{x|wx~}~}vgckkpjnvy|yl]\QSUVdt|~zpgjin||vp~pkaa`mxrlloko}}}|~yz{oqlemzpsoswsqz|zjg\\ZZhxzmfkip}{uja[ggopv~ztvvwhgimipzwklc[dxuhf^a`hmhjlsk`dkp}z{qogbls{{}|yzvnozxvtywv{|wsqoekmy{w}yrspy}|}zveac]Xdtohd`d`mmmow|tpz~|phcYYel}~umqtp|}wlsx|{zyx{{y}tppqnnv|xffaYYfu~vmmhhroqs|zpott|zxtjjbY^emvqwtwx|zrr|z}xxlkjkggsxz~vtrpion{zzv}|wu}||}uwifhc_fpz{tnh\Yahz|{pdihomgkhhnlrsqoa`aea^emkroyxxvvorrv~}z|}y}yyqdc]VW_inu{}zzyy||yztmsxz||zwxk`_aa\]knv}~|twow{yxqmlflkouicagihlmgndbb_^dlss~|{wmims~}sglirvookjpqy{{sqsywrv~{|~{|~~xy}}~~}~qnha_cgjm|}}zs~~zv}~|xompxyqvt}wvzz{{zicbc]W\bcoks~ynqlhrstpjkikpmzyurvz{}|ursw{{|wofegs~voso{}ytlilmunrqd_`c^Y_bdmfkqssvuofmiisw|xtwvyzv~{vwxvzwzxplc\\^``gttzyyzuvv}ttte\Y[VPUZ_mkr{||x~}uursrksqolkkjnunssmmd^_bdbhts}|tldbcm{}y|t}xqrt}zx~tmikjdflm{{{~zy}|yxtt{vuwnneZY]_`dw|zx|xqkijo~~z}vxqs~wmkksununga``\\dfv}}x|{~{wxx}suwtwwvsrz||}~tquxwv|rifgjz~stllvx{rhffosnvqlgdc_]a`lqpsoov{|rnqjoorwtqsu|stvsx{{xv}~{}znfikkixyuvx{|wspwysxpkd`\XW\]nuy~y|xy|xuuw}stsotwvqntsuzswtibegdaor|z{|wkiimy{x|vsr{|{zxtqmhijixy}yy}y|}zxtyuyyruoc]^`\^mr}}|z{oeddkqs~|||xtt|x|zsqlf_[_\cqs|~{~~}{}tv||vwzy~~zqnppiqx~}zrd\]_ikw}xtyz|qkflpnvpnnke__a]joszvs{z||~~}w{|vzv{w{xogfgcbmq~~sqry|}z|sllrnurmljd\X[W^hkvxv{~|zpqv|xqrrs}x{}xqonmgopxpihjqny}}{|~zuqyy}~~}tmnlhssy}xu|~}||~xtw~yuwqyzuxtmfb`ZZacs{sonutt~||~~}~~wv{x~xxxrf`b\`fhrsqs~~xx}}}{zzvspioot{{}|xla]]eagooty~wyzy~|}~wlijcjknusnpy}~|z~zz}}wxz}|vqmgb]cakw|~~zrnpvpxzy|{vnqnovpooog[YXS\]dmnou~x|~|yupiflhr|{{{qicekenprx~|uwtv{{|ynkjemkqxwuw|{w{usw||xvnotqvtomjd]Zb_jv~|uopvpwww|~|~|{uvrrzwvwyujdc]ddhrttx~~{xyxv}{~}}woiolq{~}|x|{y|x~{smgcjfkppx~}wypnfkljsvuvy|~}{usy}yx}|tzwz}xuuri_cddqx}zuosqqvrw}~{}{{zxvnuustuuofc\`dcmsv{{|}~|uiklkuz|z}|}x}~~yu{w~}nbb^_adgrnknokjutywgmkpqzxihjirlfdfdfcbf`^^jgp||q^Zaqbrz}{|~rhgUZbjsy{vzrt{}|{~ykijpz{{vtr~}txqztx{tvw{zzytutyqu|ttpbYUOQWdn~xsp}~xthg_XXJHKIXgiihnvtu~tgl{~|ty}yw~yysnjjefhdv~zyqgkkrstst}~||uejkxpXMENfvyzx|tuyvrr{xvuluvjf]_gv~}|skipms{{zrq}{vznmwzyx~|z}ulsolslig_XXflrxwz{~{{yoslw~sfdqtzokrw}}~uoz{zsjbXNMXW[\Zadcdeku{z{qrvtvwuy}zxwzohlep}|z~w~wsx}zsqgm{~rjqtywtqqostg`fho}}lghqzwomyvneggfmc`^\VT`_^XXakojeeqxus{vusopx}~}}pllqpmtms~~vqyw{|uwvtzqou{vkmgipvp}}tovw|y~}y{o_]cmr~}pd_delhb\PH@JNRQT_gqkimx~}~}}~qsqoba`^krwqzyx||{|wvlb_g{~wotxttnx}v|~}~v~x|kfdfjq}}xts{snqquolc`^^ijmdhnwwvr{|zu||~x{wwu||yppqxvrsysodcbp{vz{ssjpquqowz|qiiop{{~{{{~|yv}prrnqpvga_dp{umty~{ylf^Yacg_ho{uts~~ywux|zu{}|xvlibi|~~yztnabjqvxvihbiovsksr{rst}|~}tx}|x|{{vwyvur~|x|uzogiiqx}|uu{wmnltw~tvz}~}z}~|v~~{xonrvyxsq}yvjgel}yt|xznkuz|}yijgjjomepp~}qnhljyzy~z{|}y}~wywxy{z~|usn|rlohoksmihdp{sx{rqllltjot{~{uz}xwns~}z~xmpkrxuytq]]imrxsfhdfhtpmspxqoovyy}~~vyy|qxvuxsswz}xuoqvzww{vxmmhkx~}}wwustvy}}}y~|{{~}xsmtux}znx~slniuxw{rfqxz~nhiiinshnmwrrjlhu|u~}vw~zywx|~~x{vty|w~{utm~xmmgplnlkjeov~x~wxurszput{}}vwv~xuktz{}zpto}{zz}v`empt{ofigdhtnsqt}srkmn|{w}|||xvy}}{ytysywquxt~~vtm{{rur{wvsplfqx}{~wwzwtz~~xyx|z~|zultuv{}ntwprm{~zzzjtz}tkmjhmvoqlr{tslkgt}u}|sszxyxttz~y{|zsx}v~{vtn|{olfolkjkhclpu|z}ztv~xyuw}|vtr~~{}{vlsux{ztvt}}{llqsv|sgkjefrqtqp{usljit~w{z{~yuv}{x}{x{v{zrsyru~xvnu}qnluxtrrqflqu}~w~}}wu}{wvzzz~zz|qqvtw~zlx~urtt{}yov|uopkgpxvulsxvrljiy}x~zqputzwppy}w{{{txzs}yuso{yoihomhhmhenns|y~~}wxxv~}wuq{~}{w}~z}{osttzuyvx{zxqsvw|{mlmifnuuumvywqkhj|wuwu|yrsz}wz}|{xy}uptvmyzyvroxvlhktupqwnkrqwz}}wy|wt~{z}|x~}wz|qtvtx{mx}vsx{{}|ruzxsrliny{ynqwxsmiiw~|}yqkooxxonvxy{|tswnv{wtpntxoggmojhpmhqptz}yyyv}yvsx~}}z~~ytw{|v{sturu}t|y|z|vuv{z}snnjhlwzxnpx{tnihuyqsryzpqyxx|~|vw|vpntkq~wuurorvmfgmsqpzvpvsu{{~yy}ztz{yzz~xuy}~v{}rvusv}|px}zu{{wtyzvsmloz{oqxyrmikx~|xoikmxvmpxxz}}|{trskwvvsonrtkfimqjlumnrpu|z}|{|}y~ytt~y{zz{~~}~|suw|wuztwrsv~xu~|z}xv}}~yrpjjks}}rlt|wpkhpz|zoonv{onu~yu||yy}wrlqkm|urtppqtofgipqnzxrvrtx{|||{v}zwx}y~wvv|}v~}tvrrt|zrz}{v~}zu}{xqonr~xos|wplioxxwkhhoxnjpx|u|{~|}~zqtol{wtvqpnrphhiopitslpmps}}x~}}z~{wt{zxx{x}~}}tutzys~|uvqqrzys}{}x}xskllq~vlr}xrmjpxz{pmmt|olpxzs{z}{yvmpljyvrtpqorqhhgnqlwyrtpqs|~y~~||x}|wv{|w{}{ywty}v~uuqqqx{ty}~}v|y}srsr~}rr~{tojpwzzpihlyqims~sz|||vttlw{twtspprlihkrlqwnnllmu|w{}}{zsw}uvvuw{|}{}zssrzvuytsppr{wu|}}~vmpntxnu~xsmlsx~yzonlv}ompyzt|z~}|ynrmlyvsurqoqqkifnplwyrrppq{}z~}||w|~wuw~uy~}z~|vss{vyyurpot|xx|~z{~~{svrzypyytkmsx}yxmjgsykknzyu|z}}|supozwuvusopqkigoqmwxpnlmnz|z~~~|xrx||usuux}~y{xyxspoxuvytrqor{yx{}{orpt{ot~yumlsu~~wypmks~snqyv{{}z|{ponitvstsrnnqnkgkqmu|vsqrqz}||y}uz~wvtwx||y{}z{{wspwwv~wrqop{{z|~}svuv~rt{wnkrt}xyqlhn{rlowvz{|x}}}srqluwttttpnpnkgkrov|vqnomw~}~|yzqvz~}vsrxy||~wz{wwwtomutv|upqnr{z{{~qtqv{pu}yukmst~|wwomju~sqr}x|{}}z}}zoplkstsstrmmpokgnqpy|vrqrr}~|{xt|}zwsx~xy}|zv~~~~ywyyvpswu|ztppmv{{||wuwuvq{|yqjqsxxxsoklzvnnsxxz{~x{|}urqmrvuuuvqnoqnhjqpv}xrnolu|}~zzqxz}|wssxx{}|w{~{vvwunnttx{tnpls{{|y|tvszxpx|xripsvyxtplkyzqps{yz{~z{|~wqpkostttvqmmpoiipou{yrnpmu}~~~~z|t{}}yuuxwz|{w{~{wwzxpqvu{|tnpkryz|x|vxv~zrz}ztkrtv~yxuqlkxwnlo}yvxz|~zz{~xsrnrvwwvxsoorqiiopv|yrlnjpy{~z{~sx{|}yus~ywx}x{~~}xvxxpmrsx~|umnkoxy|wzwxuz|rv|zvkots|{xurnju{soo{}xxz|}~z{|tsmnrtvtxuomorlgmoszzulmmny|}|~|wv}||ysz~xv~}yx|~~zvvzwortw}{qnnktx{{v|xxxzsz|{slssv}yxtrlmywplp}ywvyz}{y{xtqortxwwztonrsjinpw{zsknjox{~y~}ux|z}{ws{{wv}yy{~}yuvztmprv|}zomlktx}zv|yxx~wrxzyqkrru{xwsrlnxwros{xw{{~zx{xtpmpquuuxsnlqriimpw{{sknkrz~{}~uw|{~|yt|~zw~{wwy{|yttzvnqsw~|qmnlty~}wxxw}{sxzztlqssyxwssnmwysop|}yvyzz|ww}ytpmopuwuzvpmpunimov||xnomox|}||xu{y}}{zty{w|wwxy|~zusyxnopu|~}smnkrx}x~yxw{zrtxytkoqqwwvssnluyuqq}zvyzz|vv|yupmnnsusxuolotmilow|}ynnmpy~~|wu{y}~}|u{}y}~{uvvx~|~ysrywnprw~~snomuzxxwx|zsvxyrlqqrwwvssnowxups~}yuyxzztw|wtnmonvvvzuolrulkmqz|}vmomsz|}}~ux{y~{|xu~{z~~yuxv{~|}wru{snprz}~znnlov{{z|yw{~}tsuxvlnqosvvstqlsxwrpz|vxzx~wt{zvqmomqvsxwqlnupjlnw|}zonmow}}}ww{y}}}|v|}y|{uwux~|ysrzvnpqy~}qnmmuz}w~ywz}xtvxxonrpsvwttsmrwwtov~|vvyv~~xszzwrmonqxvzztnnvrkmnw|}|pnmnu{~y~yy|z}}}|w||x}|vyvz}ztt|wppqz~~|pmlmty{v~zy|~xtuxxposqsvxuutoswwtow}vvyv~ysz{xtoqnqxvzztnnvslmnw}}}qmmntzy~~{y|{}y}y}{}vyvw~}vt{zrqrzuonmsx~v{|x{}{wvx{tqtstvzwvwqswxwpt}}}wswuy{sv{yvoppowxz}yrouxponu~~wnnmswy{~z|}|~~{z{{|~}zxyv|zux~wsru~|pompt{yw}zy}~yuuyxqrtstvzvxvrvwyuqx~}x||wywzsha_fb\[`lpqukdcfjlurjpx~|~w}vicccca_`fojhlljjljinntunrufwjppr|yuqmptpwrcjxpvz~z|{xx}xx{t_ayq`Z\bj{|sjhabijproklusonp}zxy~~|}yt{wnnnnoligkqnnsvy}~|xxx}xv~ylfgca\`egt}~~qmlrzujiw~|vrt|ti`\f}yk_U\djkhljjrsvywqow|xxy~xtrqtqfejrwxz~xvxxwy}z{vtz}z|||}vyupe^^X^dfklhcfomjimz~~{soq}~z~}vc\[`ht~o^]__]X\]^jotywrpw{vsrx~}|sicbdgoohiow|{||xwupovy~}zw|}y{~~}}~zx}}|ury||urrmsxz}}xsv}||}|vqotwqfYY^go~ykifc[TVQT]`fgd^^fgcaalqqqgb_cgmvsnpv}~}}}yrrvwzxsnkprvxwvsw|yz{{|}{xz|}~zz{wrilrvuptrs}|wvywrpqzyqkg\Y]emv|wvsmb`\X^aege_[`ec`_gqrtoheglpy{tru}}{}}y}}~ytmqsuxxxtv}}~}wwy{{}~ythfjlmgijiry|~}zsrvwrnnu|wpki_[^djq~|qnjdjmprpieinkhfmwy{vplmqt}xuv}|yz}vx{}}~~xwxxx~ylgikjbcbajpvzzurx}|zw|wvxx~uppvvqmlr|yuokjb^_dhlxyvsnswz|ztnqvtqnt~~vqquwzvv}|xw}~xvvwu{~skllkca`]cjpstqlouvtpuxrpssz|uomsvrmkow~~}~z|}~yuqkkf``chks||ztv{}vv{|yuw}wswx}~xuz~yvyxutuuw~~rpopkdc__fkqrqkiorrnnw~ysmopszwpkmttpklr{z|~zz~}{yv{|{zuslijcabfkoy~zv{y{|x}~wvyz|wu|}xw{{trruvz~trrslfe`agmrspkjorqmnw|~}wpknorxtnjmssplnu}~y{}}~~xx||}{ywsxyyxtqjhhcbdins~{w||~zxwzz{vt{}zx}{zwspmwy{}zwxxviokenpsztmjru|xl{vz~yslnitvpncepmjgms|}~xtuv{}xuxp{zzwvsx~uurfhh`^fnxzy}~yyuu|zspquvxs}y{}mpnt~xyurnolpnlvswwttwwtypuy}yochnmzphe_ostqqrx~~}{vv}~}w}{p|wv{smiuw{zmoedjillorz|ytvs|~|xqq{w||~royppvtzwu}|umiojwzuyrjlyyvts{}}{tpojgrqgjcmuqfiwy{xvwtnw}|xptxzzuutsprwlof`kidbqx}~~xuzq|}uhlvz{|}voqptssy~wxyxlrrknnv|~{tv}xuovw~wzqfbijnljgosplt{{}}~~~zzx~ywttsvzsuskcopponjgjgelwy}|vyy~zutxx|z{u~~~z~wurrpr}z{|qjjqv~}xwusoyqqu~|pgnqmojiblnpnlju{~~uzyumxvopvy|xoinytsmmeggghhfp~}vtxzzxumo}yqy~||}vlxurjostoonov~wrs~usuy}~xrijcnqmdagqypmq{xy~{|~{sqwxrmqtzsqjkkrvpicceqlkjvv|vpvu~zrx~xwqx~u{typrlmsz}w{wstt|}yvtwwyvxtyzy~nmjqlkgbeorqnorq{~|zyxrstyurnmvoxolnurmkdbejkmjonzzqsu||~vtwzyurx{~vxwsqsqojy{|{tuwxzxwzyzuswt{yzupkljmij]iqquhop~wzryysuxxkpjpsqpnkonolkb^kgrihlywwn{z}~oqxy{txzzyw|~wpnwuupjv~~~uxqyzy{zz}~uvw{t~wumfgkolm]eoqrsot|xywvywsztplplrqkndjjrlncZeinqmozz{msyz~xpz~{{}~z{vs~}}~qmtvxtvp}xxwvzw~wyzvxysvyrpodjlokhdjrkusyz~}txvrvltpqmrmimjhnigonmhd]iipst~yyqsxt{r|}y|z~}xyys|txsptruqxr~~{vtvww|{{yzz||swrgmflikgfefsrr}zz{{{~uptqswqquiiokhkdichkjmheeftpst|~ttyrrvtyz|~}~{~|zyuxvzywtvuprwuyt{}|zsy{y~~~|}|}wz{~{xtehebknnggrtwuyyx~~~xzworosrhlhiqliaagknlmf_kkrrq~w{pnst{tx~|~}}~vx~yzsvvuux|snroyutzxyz}qx}y}y|~y}smiailjlfksvvxwsz|}~tsnosnoidpqlfafiimoidgfkopxuurnsruyxxyx}}uuz{|ywuqp{|utmnsqwuq}}twz{yzzx~~xznflkhgkonntyrpvv}zvosnotjjommjijhejoggidignvloywtsqtw}zpt{|}|w{wx~~~vmrzyutpqpmtrqz{~y}y||yz~{|uqqheglvojrsoopux}~|~xwuoopnqqhimpqgekfghhjhhkmlnqr~vquw{{rt|{{wy{|}yu{xntwrsqtvqooovysr||{~~~}~|y~ykfhmspnollnosvv}~~~|uqmnvsjhisulihcbdilmjjhgookt}vwv{vszyuvuz}~{y~{w{z{uxtqmluwxqnnpytns{}|y||}~wmklrlntkhhmttywx}{}vqpqunklmsoomca^bkmplhggmlpt{{ywpu|xsmv||}{yzx}||xuzzsmgmsyvroprrpts||}}}wwprnkmnnhdnryxwww~~xzwssokomrllqlg_]deonlkfhgkvtyx}squvzrmvz}|}{vw|~trzzxlfnnvsquqsmkvw|{}~|w|yxollhljhmoywvyux{{~yumhopsnkkkkb_ddjjkmihghrwytyxtttuqtvx{}wx{||uutvxmmlorjqvttlmow~{}}x{z}~upjhidonqvryyvxt}|~{mmkorooggjcicfiajlikfmmrwvy|~{uurkxx|zu{{}xxxvwttqnunrmfpstslpnsz~|y~y|z}~|skkdfoqwopxuwww}~|}zsoknppkihaikijadgejilnllqyx|}zukst~}rz~~~yrvtusxpoznzjconptqpvsqyuu~y{~wzq~zwplmkounrqjpuwx}|wrmrpxjikZgjoqfadedjnkmkfjrxyrxptws}z}y|}}|rtxwvnmu|onlinlgmnpywrwwux{zyzttnlrttqpqhov}{r|w|~}{~}xrkgsjjkappabb\djmpjhiip|zq~xuyw|vzzvy{{{|ox}pnnrutuunkgjqvwrqpnztv{|x|z~}orrhuqhmlpkwvxxu}z}peikkponqghlihcakfhogginfv{{~{yqwstuxuv~~y~yrvwwmwvkqhfilmnumrnnzz||{z|zo|omphmrtsnvztnsx|otwkmonojglfe[dg`egjirrjt|zzty{v{vot{~v{ywuv|tgyurmhiinptttqljvs{z|~x~{~}ppglmrthnsujrwsx{{ywvhkrnrdijlokhjb\afgjtgoqwvqz~{}u{ywqsrwy|qxsuxzppmlhekkqntmmqmr|z~}y}{wlkkjmqltqom}|u{uy|~z}trrqlgmgekjne`Zb`chnmtsssu}xwvq{|yws~|wt|wvuqkpoh`jjkoqoq|qzqt~~~||z|~qtroocinrnqwvt|zx|uz~zptgkoiaihnj__`e`nfhmowstz}z|yzzuszxxxw~ztuu~yqontjnedafqrrrrxty}s}v~yzusoqimgohp}u}w~yw}w{yzqgosiocdddij`\`hiqikti|~v|qu|{|u}x~|{~kvtu{xokirql]eii{r|uvxwxyxzzsw{uljjpektqzxvy}}}{v}|xrnkmqplXcdjgbiaigpniuxxssvzy{y~{|~vkwq|rlnpnembfnn|~tywy}}~zv~spqpjmsmwq{{uu}y~|wyv|kqlqiga^ieirgfjlrluqxv~|z~|s{ysy{x{~z}xxmtxqvyopotkmhhwqzyvtz||t~x~||{}|tqnimvuknrx{vx~|x{rl`_[T_clrts{xvyz{y|zr_c`ccp~}}ohirumlkfokhgiltsqofcbi\afdyzrr}|{|{wt|ltw~o`eotwuz}{}jfffzx{~~yjoql`shcmx}~xxmgacccppovxz|urv~}stxx~|tjghmy}{rxuqsgdpuutvss|z~w|tdgpmutqqtwx}xy{wjkimz|vmsx{{}l_WTr~vig`hyy}tokigsypwyzzyzuqlifklv|y||xqqmisspvv~}wqx}~uu{s~x~xvsgb^ZV^jcfmmvumhlv}}{oprlv|{wdUXWetiahlkmfcecbgvtpxu{}vnluuz}z|xqmjjnnqt|zz}}xuxporkhhkpvxxttxyywyuuvr|w}ywqjhpysz}}w}zxvmrrpz}ttwj[QX\qojmpng_X[TRU`_]eenmf[\fiqruwwuqrqtptx~~~|vuuqljmmpx~{xyyyvrzzyrsuy}upqp|zpmu{{zsu|}rsrtqxyt|{}~rfcmd\TYduxtuy|sl``WRT\_\abknh_[egru{~~uwvzutz~~}xyywqwssw~~xyww|{~}~ujnq{}}ymelr}xtwnpt~~|~}yxlopsu|x}y}||swrvxja\id_Z]jz}}}|xkld^^bhgjluuogcmoz{y{z~wu|}{~wz{yxrgnv~|xhbjn}wuolnfjktww{t{z~wwurhppsy|y}||pkqiroc\\kdc[ap|~rshhglrqrw{wmptxz~{}rx|}~{r{vmepz~xdghqzqrhicadfopqv{tquu}svttjjqow}}{z~~}y|}}temjitgbYehec[iw{xrnpmwywzytxvz}}~vs{x}qw{uqclvkhkm|qsjeb]b^jomp}}xtnrozyrsstmhqms{~|y}wy{}~}}~|wfkkfrhe[bhedXcr{vqtoy~{}~x{x{}}}ur{w~~}quyvq`is~qooq~rukea_a\iokp}zvrmomyw~osstjhpjry}|{z~xyx}~{|z}|wfnlgrih]bggdVan{|wuwp||{{x{}~~vr{u||}rrxvs`epx{ttrwyrgb`d]hplmzzutnokvw~|ppsslfojpx||~{wyy}wz{|y}{x|{jlpepkja^ggjX\js~yuyqy}}}x~z~zpyvy}z{wlsswh`msxzr}~x{mfagabqpkt~vwroloxy}~vlrrpelmkuz}}w{~{zyw|{x||u{|{vgqiflhi]aekeXeoy}vyxr~~{yx{}|ssyu~v}yzqkptvceqv{zs||{ndci`hspmw}vwqnkqx|{|qmqrmemloy|~~v}}}}zwx{{y|{r{yzsgpfehfg[_enf[jr|}v|yu~zzwz||rtyv~~sxuwphmswghty~{s}}}}qedkcitrmv}vytnkow|{zqkoqmemmq{~w|~|zwx{zz|z~rvxxugme_ccf][bnmalv~w{}u{yxwz|trzx{rqrtqfhqzokv{|sy~}vhdmfhtups|wyvnkmu|zxqjmpnfmnq|x{|yvw{y}~||x{qs~wvvije\_bf^Zaoqgpzx}wzyxwy|ut{zz|omorpfgr{poy~|sz~whgofkvvpt{wzumlnv}ywojlpmgoov~w}~~xtxzx|~|zvz}ms}yturgiaZ]bd]Zetpku}x|z|zz~ww{{tx{~|zvkkorldixyot{yu}sflmgrvuowxw{pklpz}vsljmqjkop|~zx}{uuzxy|~|vv|rlxztrtmgf[Z_eb[^oulqy{{z{|yvx}wvz{~yxmhmrogft{rrw~~v{{jlqjqvxqsyw|skmmwwtnkkqljonz}zw~wuzxxz~vuyujtxtrtphg]X^dc][ltnot}~~z||{wx}ywzz}zxnhnrqhetzrqt{y}}loslswyrsxx|qkmnx~vsojlqlkmnyzxv~wwzywz~vuxsjtvtrtrig]X`ed][krllpzz}|}xx~zxyy||xphnsrkdrzsqqy||}qpuosw{urww}tjnmuwsqljqolmlvy|~xt|~ywzyxxvtu|wiptsrrtkg`X]debYfrnllv{{~}{w}}zzx~xsiiqrqfjywspu{||ovtrvy{rtw{{mmno{ztspimqnmlqxy{tx}|}wyyyvz|stu|oiqqrprrhd\Wadf^\nromoz}{~|xx~|{zzz|uofjpqodozwtpy|}{rxtuw|{ruw|ylnnq}ystoioroolty{|tz}||yzyyv{{ssu{mionrorqgc[Xbdg__psror}{~|ww}}|y{y}~~{smdhnppenzxwrz~}~txvuw|}tuw}{mnnpzzstqinrrqnt{}uz|~zzyzuy}sss{phmmpooshb\W_chd^nwvttz|{~yu{}}|zzy||{}rlddlnqgjz{{vz}vxxvw{wuv{}pnopx{stsknrttpt|xy{~zzxzuw~tsqzrhlkoonsib\W^chf_oxyxvz{z}yu{}|{yxzz~z{pjccjmqhl{||w|}xyxww}xuv}|pooqyzsuskoruuqv}w{{}{zwysx~|srrzoiljpmorg`ZW_djebsy{xyz{{~ww{~{}}vxv{{yvlfafkpofr|}{wyzxxy}wuxxnoot|wsvomqtxtrz~}v|||xyws~~vspvvjkjlpmsmc]X\bhjajxzzvzzz~}zvz|}z}}xwvw|x~zngbcinqgly{|v}||zyxzvv|qposyyswrmqsxuqw|v}~}}}yxxr{}ytpsxlkjkqmspd^Y[afkbgtxyu{|{z~}|wz|~y~}|ywuw|y~{ngbdhnqgkwyztz~}{{y{vw{rqpuzytxsnqsyupv{u}|}~~zyyr}~yuquynljlqntqe^Y[`fjbfrvwry}}|{}}wy{~x~~|}zwuu|y~|phbcglqhitxytw|~}}z~xv~trpux~|twuoqrxwptyuz}{~~|yzry|vrryqlkiqosth_ZZ_dkdcntwsu|~}{~yzzz{~~{wvryzzvjdbeipmgovywt{|~~{|}vzysqrwz~xuyrpqu{tqv||u}{~~yzwr~~yupuwnlhlpoupd\Y]`hjcgquwry|~|{~~yz{y}~||||wtrzx{}rgbbejqkhrwzvv|}~~{~|u|xsptw{}vvyqqqv{srw~{w}z~}~xzur~~~xuouunlglpotoc[Z]`ijdirwxt{}{{}~zz{z~{{{{vspxwz|rfabeiqmjqw|yx}~~{|~uzxtpsvx|wuysrqu}vsw}~w}{~{}~yyvp{}~xuoruokfionsqf\Z]`hmgirx|x|~|y~~z{z}~||}x~|wsnuwx|uhaadgqpkqx}|z~~|{vwytpquv{xtytrqt~ytw}x}{}z{}ywvox|}yvoqtolfgnnrrg\Z]`hniksy~{~}|y}~{{z~z{|w}{wrmtvx{th`adhqpmrx~|~~{{uwxupruvzvuytsqvyux~y}z~~yz}xwsoy~|{xtnqsnkdhmnspe[[^aknjnt||~{z~~}|{|~xxy|yunnuuyypd`cdlsoot{|~}~z{s||vsotuwyuwxtsr{~vwy{{|zzx{|wwos|||ywpnspngelmqsl_Z]_enllqw~|~}~y}~~}}zz{{w{zwqlsuxztg`bdhqpnqw~}}~{}ty~xuptuvyvvyutqxxvw}z|z|xz~wwqqz}|zxrnrqoidkmqsnaZ]_cmlknt|{|~~z~~}z~z{|x{zxqmsuy{uh`bdhqonpu|{{||uz}yvquvvyvwyutqx~wuv|z{z|x{~xxqr{}}zysorrpieknrtnaZ]_clkkmrzyz|{~~z~{{~x{{zsmruy{vj`bdfoomorzzz{}~~wx~zxrtwuxwwyvuqu~yuu|zzy}xyzxsqx}}{zvorrrleimqtqf[\_`jkjknwyy{|}}{|~~~zyzz{wnotw{ypc`ddkpnnov{y{{}}v||zvrwvvxwyxwtqz}vuv|zyz~zv{~yvpsz}}zzsprrqhflostnb[__dllllqyy{{|{~{zyzz{umruz|yoccefoqppqy{{||}{v|{zuswuvxxzyxts}}xvx{zxz}yuz|yupsz}|zzrqqsrigmpuuoc]aagnnoos{{}||~|~{yyzy|vnruz|zqedghpsssrz}}}|~||v{{zwswuuwx{{zvt|zwx}{xy|ztx}xuprx|}yztpqrtkgmpvvsh_cdhpqrqt}}}}}~~~}{x|yyx{ypquy}|uieiipttutz}~{~}uyz{xsvvtwy||{xt{}yx}|xy{z~ulmtrnlimt{~zzsnoquokpt{}|tmqqrxwwvw~~~yxz~}}z}~{w~|{xx~}||wy|vtxuyzxxu{~{ysvy}{~~|vz{|yuyyz~~z}yxz~xurrwunhlsponlrx|}vrruyqpuy~vqutvzyzwy~|{ux|~~|zss{{xxuxyyyzvz}vyyx}{{yx}|{ww{}|}~{rsuv|~~{|x{{tkhoqmmjlrw|xxtmlmsqkpsy}}xpqsqvuvurxxxuty{||vrx|yyvw|wwv||vz|yxzw|{{{x|||zw{}|~}}~|squv{}~{~{|~yqkquqqnnrw|xvtmllqrmpsy}}zqprpttturvwwvswy}{~xsy}{{xx|~wvv|}x|}zyzw{z{{x|||zwz|~~||}ssuvz{~}{~{}zrntwttpqtw{wvsmllstortz~}yqpqossturvvwvsvx~|~~zuz|}yy|~}wvv|z}~{xzvzzz{x{||{wz{~}{}~vruuxz}~z~||}vptywwsqtvzxuuonmrvqtuy~}{tprorssusuvwxsuw|{~}~xx~~|y{}}ywwz||~xzwxzy|zy|{}yx{}~~|{{sttvz|||~{~{tryzxxstuwzuvsoopvvsvv|~|yrrqpsruusvvxvtwx~{}}}x||z|}}~xxx||~~}yzwyzz|yz{|}xz{~~{z~yrttwz}|}~{{uszzzytuuwyuvsppqxwuww}~|xrsqptsvutvvywuwy}{}}}x||z||~}~yyx|}}zzwyzz|zz{|~z{|}~{y|}~zrttw{~~~{~|wtz{zzuuuwyuwuqqqwxvxw|~}zutsqttvwuvvyyvxzz}|zz~z|||~zyy{~{{xyzz|{z{{{{}}~{yz}|}~{stuw|~~{}|xtz{z{vvvwyvwvrrrwywyw{}{vutqutvwuvvyzwy{~z}}z{~{||~|~zyy{~||xyzz}{{z{||~}}zx{|||}ysuvy}{~~|xv{{|{wwwxyvyvsstyyxzx}}zvvssutwwvvv{yxz|{|}~~z~}|}}}~}zzy}~~~|zx{z{}{{z}~{}~~~~~{yx}~~||||utvv{~}}~{wy}{~zxyxzxxyuttwzx{y{~|ywvsvuvxwwvy{xz{~~}{}||}}~}~}~{zy|~}|xzzz}{{z|{|}~~~~{yw|~||||wtvuz}}}yz}|~|yzy{yxzvutvzy{zz~}zxwsvvvxwwux{xyz}~~{||}~~~}}{zz|~|x{zz}{{y|~{|}~~~~~{yx|}||||vtvuy|~~~}z|~}}{{z{yyzvvuwzz|z{}zywtvvvxwwux{xxz|~~{|{~~~~}{{z{~}y{{z||{yz~{{|~~~~}~{ywz}}|||xtvux{~}~||~||{|{z{xwvwzz|{z~|zyuvwvxxxvv{xxy{~{|{|}}{{z~~~~zy{z{|{zx}|{|}}~~~|zxx}~}~||{{uuuuz|~~|~}}||z{{wwwy{{~{}~{{xuxvwyxwuy{xyz}~}}{|{~~~|{{{~~yz{z||{yy~|{|~}~~}}{ywx}}~}|{{yuvvvz}~~|~~}|z|{xxwz{|~{~~||xvxwxyyxuy{yz{~~}}{|{~~}|{{{~zz{z||{yy~||}~}~~~~||{yww|||}|{{zvwww{}~}~}}z||xxxy{||}}}zvyxwyyyvy|z{|~~|~~{}|~~}}{{{}~{z|z{||zy}}|}~}}~}|{{xwvz{{}|{zzvwxw{~}~}{||yyxz{|}}}}{wyxxyzyvy}{||}|~}{}|~~}}{{{}~{z|z{||zy~}}~}~}}}~{{zxvw{{|~||{zyvxxx|~~}{}|yyy{{~}~~~zwzxyzzyw{}{|}~||||}|}||{|}~z|{z||{x{~|}~~}}~~|~|z{ywvy{z}~|{zzwwywz}~||~{zzz{}~}~~}xyyxzzzwy}{|}~}|~}|}|~~~}|||}~z{{z{{{yy~|}}}~}~|~}z{ywvx{z}~||zzxvywy|}}|zzz|}}~yzzyzzzxx|{|}~~}|~|{}{}~~}|||}~z{|z{{{yy}||}~~}}}~~|~|z{ywvx{z}~||zzwwxwy|}}|{{{|}~~yzzyzzzxx|{||~~}|~|{}{}~~|||}~{{|z{{{yy}||}~}~}~|}|zzyxwx{z|~}|{zwvxwx{~~}}{{{|}~{z{yzz{yx||{|}}|}}{}|{~~}}|}}}{|{z{{zx{}{|}}}~~}}}zzzxwwyzz~}|{zyvwxwy|~||||}~~z{{z{{{xz}{|}~~~}|~~|{}{|~~}}|}~|{|z{{{yx|||}}}}~~~}}}yyyxwwzz{~}|{zxvxxxz}~||||}~z|{z{{{xz}|}~}~}||}~~{{}|}~~}}|}~|{|z{{{zx|||}~}~}}~~}||yyywwwyyz}}|{zywxyx{}~}|||}~{||z{{{yz}}}~}~}|{|~~|{}}}~}}|}}}{|{z{{zx{}|}~}~}}}}|||yxywwvyyy}}|{zywyzy{~~}}|}}~{||{{{|zz~}~|}}|{|~}~|{~}}~}}|}}}{|{z{{zy|}|}~~~}~~}}}}||{xxxwvwyyz}}|{zywzzz|~}}}}}{}|{{|{y|~}~~|}|{{}~}}{|~}~~}|}}~{||z{{{yz}|}~~~}}}}}}|{|zwxwwvxyy|}||{zxx{z{}}}}}~}|}{|||zz~}~|}|{{|~}~{{~}}}}}}~|{|{{{{yy|||}~~~~}}~}}}}{|zwxxwwxzy{}||{zxwzzz}~}}~~}}}||||{z}}~||||{}~}}{{}|}}}}}~|||{{{{yy|||}~~~~}}~}}}}{|zwxxwwxzy{}||{ywwzyz|~~~~~}}||||{z}}}||||{}~}}{z}||}}}}~}||{{z{yy{|{}}~~~~}~}}}}||{wxxwwxzy{}}|{zxwyyy{~~~~~}~}|||{z}~}~||||||~}~~|z|}|~~}}}}|||{zzzxz|{|}~~~~~~}~~}}}|{|ywxwwwyzy|}|{zywxzyz}~~~~~~||||{{~}~~{||||}~}~}{z}||~~}}}~~||{{zzyy{|{|}~~~~~~~}}}}}|{{xwxwwxzyy|}|{zywyzz{}~~~~~}|||{|~~~~{||{{}~}~}{z}}}~}}}~~||{{zzzy{|{|}~}~}}~}|~}}}|{{{xwwwwwyyy|}||{ywy{z{}~~~~~}}||{|~~~~{{{{{|~}~}|z}}}~}}}}~|||{zzzy{||}~}~~}}}}|~}}||{{{xvwwwwyyy|}||{zxy{{|~~~~~}}}}||~~~{{{{{|}}~}{{}~}~}}}}~|||{zzzy{||}~~}~}}}}}|~}}||{{{wvwwwxyyy|}||{yxz{{}~~~}}}}{}}z{{{{}}}~}{{~}~}}}}~}||{{zzyz|||}~}}~}}}}|}~}}|{{{yvwwwwyzy{}}|{zxx{{|~~}}}||~{z{{{|}}~~}{{}}}~}}}}}|}{{zzyy|||}~}}~}}}}}}}}||{{zwwwwxyzz{}}||zyx{{{}~}}}||~~{{{{|}~}~~}{{}}}~}}}~}}}|{{zyy|||}~~}}~}}}}}}}}}|{{zwwxxxz{z{}}}|zyx{{{}~~}}||~~{{{||}~~}{{}}}~~}}}~~}}|{{{zy|||}}~}}~}}}}}}~~}|{|{xwxxyz{{{~~}|{yxz{{|~~~}}|~~|{{||}~~~~|{|}}~~}}}}}}|{{zy{|||}~~|}~}}~}{{zyzz{{|}|{zyxxyz{}~~~~~~}|{zzzz{{{|}~~~~}~~~~~~~}}~~~~~~~}}|{zzyxxxyyyz{}~}xuy}zyyz{{{{zyxxxxyz{|~~}}}}~~~}||{||}}~~{{~~}||{{||~~~~~}ywvwz~~}{zyxvutsrsstvwxyzzzyxxxyz{}}||||}~~~~~~~~~~~|{|~~}|{zyyzz{}~~~~}{yxwxy|~}{zxwuttttuvwxyzzyyxwwxy{|~~|{{{{}~~}~~~}|{}~}|{zyyz{|}~~~~~|zxwwy{}}|zywvuttuvwxyzzzyyxxxxz{}~~}|{zz|}~}}~~}|{|~~}|{zyzz{|~~~~~|{yxwxz|~~|zywvuuuvwxyzz{zyyxxxyz|}}|{zz{|~~~}~~~|{{}~~|{zzzz{|}~~~~~}{yxwwx{}}|zxwvvvwwxzz{{zzyxxxyz|}~}|{zzz|}~~~~~|{{|}~}|zzzz{|~~~}~~~~}{yxwwxy|~~}{yxwwwwxyz{{{{zyxxxyz{}~~}{zzzz{}~~~~~|{z{|~}|{zz{{}~~~}}~~~~~~~}{zxwwwxz}~|{yxxxxyz{{||{zyyxxyz{}~~}|zzyz{|~~~~~~}{zz{}}|{{{{|~~}}~~~~~~~~~~}|zyxwwxy|~~|{zyxyyz{||||{zyyxyy{|}~~|{zyyz{}~~~~~~~}|{z{|~~}|{{{|}~~~}}~~~~~~~~~~~}|{yxwwwxz}~}{zyyzz{|}}}||{zyyyz{|~~|{zyyz|}~~~~~~}|{zz{|~~}||||}~~~}}}}~~}||}~~~~~}||{{zzzzzz{|}~~|zyxxyz{|~~~~}|{{{{{|}}~~~~}}}}}~~}}}}~}{yyyz|~|zyxyz|~}{zzz|~|{z{}~}}~~|{zz{|}~|zxvvvvxz}~~~~~~~~~~}||{zzzzz{}~~|{yxxyz|~}}~~~~}}}}~~~~~|{zzz{|~~~~~~~}{zyyz{|~~|zywvvwy{~}{zyyz{}~|zyxxy{}}{yxxy{~}||}~~}}}}~~}{zyyyz|~~~~~~}}|||}~~}||}~~}|{zyyyyyzz{{|||}~~~}{{z{{}~~|{zz{|}~|{zz{}~}|}}~}||||}~~}{zzz{}~|{zz{}~|{{|}}{{{|~~||{{{|}~~~}|zywvvvvxz|~}|||}}~~~}||||}~~~~}||}~~}|{{{{{|}~}{{{|~~|{{|}}{zz{}~~~~}|{zyyyzz{{||||{zyyyyz}~~~~||||}~~}}|{{{||}~~~~~}|||}~~|zyxyz|~}|||}}|{||~~~~~~~}||||}}~~}|{yxxxxyz{{|{{{|}~~~}|{{{|}~~}{zyyyz{|~~}||}~}{yxyz|~}}}}~~~}}|||||}~~~~~|{zzz{}~~~}|zxwwwxz{|||||}~~}~~}||{{{||}}}~~~~~~~~~~~|||}~~}{yyyz}~}}|||||}~~~~~~~~~|zyz{|}~~}{zxwwwxz{|}}~~~~~}}}}}~~~~|{zzz{|~~~~}~~}||||~~~}|{zzz|~~}}}}}~~}}|{{{|}~}~}{zyyz{|}}}|zywwvvwxz|~~}|||||}}~~~~~~~}}~}|{{{{{|}}~~~}||||}~}|{{|}~}}~~}{zyyyyzz{||||{{zzyyz{|}~~}}}~~|{{{{}~~~~~}|{|}~}|zyxxxy{|~~}|{|}}{z{|~~|zzz|}}~~{zyz{|}}{ywvuuvwxyz{|||||~~~~}}}}}}~}}|}}|{|}~|zzz{}~~~}{zyyz|~~~}}}}}}~~|zyyz}}||}}||}~~}{ywvvxy{}~~}{zxxxyz|~~}}}~~{zyz|~~~~}{{{|~}|{{zzz{{|}~~}}}~~}|||}~~}}~}|{zz{{|}~|{yxwwwwxyz{{zzzz{|~}~|{{|}~|{zzz{}~}}}~}||}~}{yxyz|~}|z{|}||||}~}||{{|}~~}}~~}~}{xwwyz|}}|{zxxwwxxy{|}~}}}}~|{{}~~~~~}||{zzzz{|}~~}}}~~|{|~~}|}~}|zzz{}~}}|||}}~~|zywvvwxz{}}}|zxvvwy}}|{zzz{|}~}~}|||~~|{{{|}}}{zzz{}~~}|{{{{|~~~~~~~|zyy{}~}{xwvvwyz{|||{zzzz{|~~}}}~}||}~~~|{zz{{|}}}}}}}}~~~~}}}}}~~}}~~}}}~|zyyz{}~}}|}}~~}|{{zyyxxyyz{||{zyxwwy{}~~}|{{{{|}~~~~~|{{|}}{yxxy|~~}||{{{{|}~~}}~~}|}~|zz{|}~~}|zyxwwxyzz{{{{{zzz{{|}~~}}~~|{|~~||{{{{||}~~~~}|{{{{|}~~~}}}~~}{zzz|}~~~~}|zyxxxxyz||}|{zxwvvxy{}~}}}}~}}}}}}~~~~}}~~|{|}~}|zxxy{|~~~}||{{{|}~~}||}~~}|{{|}~|zyxwwxyz{{{{zzyyyyzz|}~~}}~~}~~}}||{|||}}~~~~}|{{zzz{|~~|||}~~}|{{|}}~~~{zxwwwy{|~~|zwvuuvxz{|||}~~~}}}~~~~|{|}~~~}|{zxxyz|~~}{{{|~~~~~|{zzz{}~~}{{|}~~|{{|}|zwvvvxy{}~~~}|zywvvuvwxz}~~}{{{~~}~~|{{{|}~}|zywwvwxy{~~|{|}~|zyyz|~}|zzz{}~}|||||}}~~~~~}|{ywvutuvxz{||||}~~~~}||}~|||~~}|||||||{z{|}~|{zyzz|}}|{|}}{zyz{|~~|{{|~~~|{yxxxxyz|}~~~}|{yxwvuuvwxz|~}||~~}}~~~}}}}~}{zxxwwxyz|~~}}}~}||{{{||}~~~}}}}}}}~~}{yxvvvwxxyzzzz{||}}|{{{|~~~~~}|{zz{|~~|zyxxy{}}|||}~~}}}}}||{{zz{}~~}{zyxxyz{|}}~}}{zxvuuuwx{|~~~~}}}~}|||}~~~~}}}~~|zyyyz|}~~}|{zz{}~~}}|||{{{{{{{|}~~}|||||}~~|zxwwxy{|}}{ywuuwy|~~|{{|~~}}~~~}|{z{||}}}|{zzz{}~}}}}}}~~~~~~~~}|{{{|}~}|{z{|}~~}|zyyyz{||{zxwvvwy{}~~~~~~~}~~}}~~|zyyy{|~~}{{z{|~~}|{{zzz{|}~~~}~~}|{|}~}|zxxxyz||}|{zyyxxyyz{}~~}|}~}{zyyzz|}~~~~}}}}}~~~}{zzz|~~}||}~|{zz|}~~|{yxxxxyz{||}}}}}|||{{||}}~~~~~}||}}~~~~}|{{zzz{|}~}}|}}~}|{z{|}~~~~}}|{||{{{{{{|}~~~~}|||}~~}|{{{}~}}||~~}~~~}}||{{z|~}|{zzz{|~~|zxvvwx{}~}}}{z}{zzzz{|}~~|{{{{|~~}{{zzz{}~|||}~~}||}}}~~~~|{{}~}}}}~~}|{{||}~~}||}~{yxwwy||ywuuuuwxz|}}}}{zyxwwxxyz{||}}}}}||{zyyxxz||{z{|~}|{{}}|{{|}~|{zz{}~~|{zz{|~~~~{xuttvy}}|||}}~~~}{zxvuttuvwy{}~~}|{yxxxxyyyzz{}}{zz{}~{yxxy|~~~~~~}}}}~~~}{{{|}}{xvuuvy}~{zzz{|}~~~}{zxwvuvvxy{|~~~}|zyxwwxxxyz{|~~}|{{|}~~~~~}{z{|}}}~~|{zz{}~~}|{{|~~~}~|ywuuvx|~~~~~~}}|{zyxxxwwxyy{|}~~~}{zxwwwwxyyz|}~~~}}~~}zxwxz~~}}~~}{{{|}~~}}||}~~~~~~~~|zxvuvx{}}}~}|zyxxxxxyyzz{|}}~~~}|zyxwvvvwxz|~}}|}}~~~~|zyy{~~}~~~|{{{|~~}}}}}}}~~~}}~~|zwvuvx|~~~}{zxxxxyyz{||}}}|||{{{zzyyxxxxxz{}~}}}}~}{zyz}~}|||}~~}|||{||}~||||}~}{yvuuvy~~~~}{zxxwxyz{|}~~~~~}|{zyxwwwwwxyz|~~~}}~~~|zzz|~}}||}~~~~}}}}}}~}|{{|}~~~|zxvuux{}|{zyyyz{{|}}}}}|||{{zzyxxxxxyz|~~}|}}~}|zyz|~~||{||}~}}||{{|}~}|{{|}~~~|{xvuvwz~~}{zzyzz{|}~~~}|{zyyxxxxxxyz{|~~}}}}~}{yyy{}~}}}}~~~~}}}}}}}~}|{{||}}}|zywvvxz}}|{zzz{{|}}~~~~~}||{zyyxxwxxyz|~~}}}}~~~~~|zyyz|~}||||}~~~}}|||}}}~}||||}}}}|{ywvuvx{~~}{{{{{|}~~~~}}||{{zzyxxxxxy{|~~}}}~~~~~~}{zyz{~~}}}}~~}}|||||}}~~}|{z{{||}||zywvvxz}}|{{{{|}~~~}||{{zzyyxxxyz{}~~~~~~}}~~}{yyy{}~}}}~~~}||||||}~~~~}|{{{{||||{yxvvvxz~~|{{{||}~~~}|{{zzyyyyyyz|}~}}}~~~}}}~~~|{zzz|~~~}}~~~}|{{{{|}~~~~~~|{zzzz{{||{zywwwx{~~}|{{||}~~}|{zzyyyyyyz{}~~~~~~}}}}~~~}|{zz{|~}}}~~~}}||||||}~~~~~~}|{zyyzz{{{{zxxwxy|}}|||}}~~}|{zyyxxyyz{}~~}~~~}|||}~~~}{zyz{}~}}}}~~}}|{{{{|}~~~~~~~|{zyyyzz{{{zyxxxy{}~}}}}}~~}|{{zyyyyzz{}~~~}~~}||||}~~}|{zyz|~~}}}~~~}}||{{||}~~~}~~}|{zyyyzz{{{zyxwwxz}~}}}}~~~}|{zzyyyyz{|~~~~~~}||||}~~~~|{zyz{~~}}}~~}||{{{||}~~}}}~~}|{zyyyz{{{{zyxwwwy|~~~~~~~}||{zzzzzz{|}~~~~}}|||}~~~}|{zyz{}~}}~~~}||{{{{||~~}}}~~}|zyyyyz{{|{{yxwwwx{}~~}~~~}|{zzzzzz{|}~~~~~}}|||}~~~~|{zyyz|~~~~~~}|{{{{{|}~~~}}}~~~|{zyyyyz{{{{zywwwxz|~~~~}||{zzzzz{|}~~~~~~}|{||}~~~}|{zyz{}~~~~~}||{{{{{|}~~~}}}~~~}{zyxxyzz{{{{zxwwwx{}~~~}|{zzzz{{|}~~~~~}||{||}~~~~}{zyyz|~~~~~~~}|{{{{{{|}~~}}}}}~~~|{zyxxxyz{{{zzyxwxy{~~~~}|{{zzz{{|}~~~~~}|{{{||}~~~}|{zzz|~~~~~~~}|{{{{{||}~~}}}}}}~~~}|{yxxxxyz{{{{zyxxxz|~~}||{{z{{|}~~~~~~}|{{{{|}~~~}|{zz{|~~~~~~}|{{zz{{|}~}}|||}}~~~}|zyxxxxyz{{{{zyxxyz|~}|{{{{{{|}~~~~~~|{{{{{|}~~}}|{z{{}~~~~~}||{{{{{|}~~}||||}}~~~}|{yxxwxxyz{{{zzyxyy{}~}|{{{{{|}~~~~~~}{{z{{|}}~~}|{zz{|~~~~~~}||{zzz{{|}~~}}|||}}~~~~|{zxxwwxyz{{{{zyxxyz}~}||{{{{|}~~~~~~}{{z{{|}~~~}|{zzz|~~~~~~}|{{zz{{|}~~}}|||}}~~~}|{zyxwxxyz{{{zzyxxyz|~}|{{{{|}~~~~|{{z{{|}~~~}|{zzz{}~~~~}|{{zzz{||}~}}|||}}~~}|{zyxxxxyz{{{{zyxxxz{~~}||{{{|}}~~~}|{{{{|}~~~}|{zzz{|~~~~~}|{{zzz{{|}~~}}|||}}~~~~}{zyxwxxyz{{{{zyxxxy{}~}||{{||}~}|{{z{||}~~~}|{zzz{}~~~~}|{zzzz{{|}~~}||||}}~~~}|{yxxwxxyz{{{{zyxxxy{~~}|||||}}~~~}|{zz{{|}~~}}|{zz{|~~~~~}|{zzzz{{|}~}}||||}}~~~~}|zyxwwwxyz{{{{zyyxyz|~~}|||||}~~~}|{zzz{|}~~}}|{zz{|~~~~~~}|{zzzz{{|}~~}}|||||}}~~~~~}|zyxwwwxyz{{{{{zyyyz|~~}}||||}~~~~~|{zzzz{|}~~~}|{{{{|~~~~~~}||{zzzz{||}~}||{{||}}~~~~}|{zyxwwwxyz{{|{{zyyz{}~}}|||}}~~~~}|{zzzz{|}~~}}|{{{|}~~~~~}|{{zzzz{|}~~}}|{{{||}~~~~~}|{yxwwwxxyz{|{{zzyyz|~~}}||}}~~~~}{zzzz{|}~~~}|{{{{|~~~~~~}||{zzzz{{|}~~}||{{||}}~~~~}|{zxwwwwxyz{||{zzyyz{}~}}||}}~~}{zzzz{|}~~~}|{{z{|~~~~~~}|{zzzzz{|}~~}||||||}~~~~~}|{zxxwwxxyz{|{{zyyyy{|~}}}|}}~~}{{zzz{|}~~~}|{zzz|}~~~~}|{zzzzz{|}~~}|||||}}~~~~~}|{zyxwwxxyz{|{{zyyyyz|~~}}}}}~~~}|{zzz{|}~~~}|{zzz{}~~~~}|{{zzzz{{|}~~}||||||}~~~~~}}{zyxwwwxyz{||{{zyyyz{}~~}}}}}~~|{zzz{{|}~~~}|{zz{|}~~~}|{zzzzz{|}~~~}|||||}}~~~~~}|{zxxwwxxyz{||{zzyyyz|~~~}}}}~~}|{zzz{||}~~~}|{zz{|~~~~~}|{zzzzz{|}~~}}||||||}~~~~~}|{yxwwwxxyz{||{{zyyyz|~~~}}}}~~~}|{zzzz{|}~~~}|{{{{|~~~~~~}|{zzzzz{|}~~}}|{{{||}}~~~~}|{yxwwwwxyz{|||{zzyz{|~~}}}}~~}|{zzzz{|}~~~}|{{{{|~~~~~~}|{zzzzz{|}~~}||{{{||}}~~~}}|zyxwwwwxy{{|||{zzzz{}~}}}~~~}{zzzz{|}}~~~}|{{{|}~~~~~~}||{zzzz{{|}~~~}|{{{{||}~~~~}|{zyxwwwxyz{||||{zzz{|~~~}}}~~~}|{zzzz{|}~~~}||{{{|~~~~~~}|{zzzzz{|}~~}||{{{||}}~~~}|{zyxwwwxyz{||||{zzzz{}~~}}}~~}|{zzzz{|}~~~}||{{{|}~~~~~}|{zzzzz{||}~}||{{||}}~~~~}|{zyxwwwxyz{|||{{zyyz{}~}}}~~}|{zzz{{|}~~~}|{{z{|}~~~~~}|{zzzzz{{|}~~}|||{||}}~~~~~}{zyxwwwxyz{|||{{zyyz{|~~~}}~~~|{zzz{{|}~~~}|{{zz{}~~~~~}||{zzzzz{|}~~}}|||||}}~~~~~}|{yxxwwxyz{{|||{zyyyz{}~}}}~~}|{zzz{|}}~~~}|{{z{|}~~~~}|{zzzzzz{|}~~}|||{||}}~~~~~}{zyxwwwxyz{||||{zyyzz|~~~~}~~~}{{zzz{|}~~~~}|{{{{|~~~~~~}|{zzzzz{{|}~~}||{{||}}~~~~}}{zyxwwwxyz{||||{zzzz{|~~~~~~~}{zzzz{|}}~~~}||{{{|~~~~~~~}|{{zzzz{{|}~~}||{{{||}~~~~}|{zyxwwwxyz{||||{{zzz{|~~~~~~~|{zzzz{|}}~~~}}|{{{|~~~~~~~}|{{zzzz{{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{|||||{zzz{}~~~~~}|{zzzz{|}~~~~}||{{|}~~~}~~~}|{zzzzz{|}~~}||{{{||}}~~~}}|{yxwwwwxy{||}||{{zz{|~~~~~~~}{zzzz{|}}~~~}}|{{{|~~~~~~~}|{{zzzz{{|}~~}||{{{||}}~~~~}|{zyxwwwxyz{||||{{zzz{}~~~~~}|{zzz{|}}~~~}}|{{{|}~~~~~~}|{{zzzzz{|}~~}||{{{||}}~~~~}|{zyxwwxxyz{||||{zzzz{}~~~~~~}|{zzz{|}~~~~}||{{{|}~~~~~}|{{zzzzz{|}~~}}||{|||}~~~~~}|{zyxwwxxyz{||||{zzyz{|~~~~~~}|{zzz{|}}~~~}}|{{{{}~~~~~~}|{zzzzz{||~~~~}||{|||}}~~~~~}|zyxwwwxyz{||||{zzyzz{}~~~~~}|{zzz{|}~~~~}|{{{{|}~~~~~}||{zzzzz{|}~~}}||{|||}~~~~~}|{zyxwwxxyz{||||{zzzz{|~~~~~~~|{zzzz{|}~~~~}|{{{{|}~~~~~}|{{zzzzz{|}~~}||{{{||}~~~~~}|{zyxwwxxyz{||||{{zzz{|~~~~~~|{zzzz{|}~~~~}}|{{{|}~}}~~~~}|{zzzzz{|}~~}||{{{||}}~~~~}|{zyxwwwxyz{|}}||{zzz{|~~~~~~|{zzzz{|}~~~~~}|{{||~~~}}}~~~}}|{zzzzz{|}~~}||{{{||}}~~~~}|{zyxwwxxyz{|}}||{{z{{}~~~~~}|{zzzz{|}~~~~}}|{{|}~~}}}~~~}|{{zzzz{{|}~~~}|{{{{||}~~~~}}{zyxwwwxyz{|}}}|{{zz{|}~~~~~|{zzzz{|}~~~~~}|{{{|~~~}}~~~}||{zzzzz{|}~~}||{{{||}~~~~~}|{yxxwwxyz{||}}||{zz{|}~~~~}{{zzz{|}~~~~~}|{{{|}~~}~~~~}|{zzzzz{|}~~}||{{||}}~~~~~}|{yxxwwxyz{||}||{{zzz{}~~~~~}{{zz{{|}~~~~}}|{{{|}~~~~~~}|{zzzzz{|}~~}||{{||}}~~~~}|{zyxwwxyz{||}||{zzzz{|~~~~~}|{zzz{|}~~~~~}|{{{{}~~~~~~}|{{zzzz{{|}~~}}||{||}}~~~~}{zyxxwxxyz{||||{{zzzz|}~~~~~|{{zz{{|}~~~~}||{{{|}~~~~~~}|{zzzzz{|}~~}||{{||}}~~~~}|{zyxwwxyz{||}||{{zzz{|~~~~~}|{zzz{||}~~~~}||{{{|}~~}~~~}|{zzzzz{|}~~}||{{||}}~~~~~}|{zyxwwxyz{||}}||{zzz{|~~~~}|{zzz{{|}~~~~}|{{{|}~}}}~~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{zyxwwxxy{||}}}|{{z{{|~~~}|{zzz{{|}~~~~}|{{||~~}}}}~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{zxxwwxyz{|}}}}|{{{{|}~~~~}|{zzz{|}~~~}}|{{|}~~~}}}~~~}}|{zzzz{{|}~~}}|{{{||}}~~~~}|{zyxwwxxyz{|}}}||{{{{|}~~~}|{zzz{{|}~~~~}|{{||}~}}}}~~}|{zzzzz{|}~~~}||{{||}}~~~~~}|zyxxwwxyz{|}}}||{zz{|}~~~~~|{{zz{{|}~~~~}|{{{|}~}}}~~~}|{zzzzz{|}~~~}||{{||}}~~~~}|{yxxwxxyz{|}}}|{{zzz{}~~~~~}{{zz{||}~~~}}|{{{|}~~~}}~~~}|{zzzzz{|}~~~~}||{{||}~~~~}|{zyxwxxyz{||}}|{{zzz{|~~~~~}|{zz{{|}~~~~}|{{{{|~~~}~~~~}|{zzzzz{|}~~}||{{||}}~~~}|{zyxxxxyz{||}}||{zzzz|}~~~~|{{zz{|}~~~~}||{{{|}~~~}}~~~}|{{zzzz{{|}~~~}||{{||}~~~}|{zyxxxxyz{||}}|{{zzz{|}~~~}|{zzz{|}~~~~}||{{{|}~~}}~~~}|{{zzzz{|}~~~~}||{{||}}~~~~}|{zyxwxxyz{|}}}||{zzz{|~~~}|{zzz{||}~~~}|{{{|}~}}}}~~~}||{zzzz{{|}~~}||{{{|}}~~~~~}|{zyxwwxyz{|}}}}|{{z{{|~~}|{zzz{|}}~~~}||{||}~}}}}}~~}|{{zzzz{|}~~~}||{{{|}}~~~~~}|{yxxwxxyz{|}}}}|{{{{|}~~~}|{zzz{|}~~~~}||{|}~~}}}}~~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{zyxxwxxyz||}}}||{{{{|}~}|{zzz{|}}~~~}||{||}~}}}}~~~}|{{zzzz{|}~~}}|{{{||}}~~~~~}|zyxxwxxyz{|}}}||{{z{|}~~~~|{{zz{|}}~~~}|{{{|}~~~}}}~~~}|{{zzzz{|}~~}}||{{||}~~~~}|zyxxxxxyz{|}}}|{{zzz{}~~~~|{{zz{|}~~~~}|{{{|}~~}}}~~~}||{zzzz{{|}~~}}||{|||}~~~}|{yyxxxxyz{|}}}|{{zzz{|~~~~}|{zz{||}~~~}|{{{{|~~~}}~~~}|{zzzzz{|}~~}||||||}~~~}|{zyxxxxyz{||}}||{{zz{|}~~}|{{{||}~~~~}||{||}~~~~~~~~~}|{{zz{{|}}~~~}|||||}}~~~~}|{zyyyyyz{{|}}}}|{{{{||~~}||{||}}~~~~}||||}~~~~~~~~~}||{{{{||}~~~~}}||||}}~~~~~~}|{{zyyyzz{||}}}}|||{||}~~}|||||}}~~~~~}}|}}~~~~~~~~~}}||{{{||}~~~~}}||||}}}~~~~~}||{zzzzz{{||}}}}}||||}}~~}}||||}}~~~~}}}}}~~~~~~~~~}}||||||}}~~~~}}}||}}}~~~~~~}||{{zzz{{||}}}}}}}}|}}~~}}||}}}~~~~}}}}~~~~~~~~~}}|||||}}}~~~~}}}}}}}}~~~~~}}||{{{{{{||}}}~}}}}}}}~~~~}}}}}}~~~~~~}~~~~~~~~~~~}}}|||}}}~~~~}}}}}}}~~~~~~~}}||{{{{{||}}}~~}}}}}}~~~~}}}}~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~}}}}}}~~~~~~~}}|||{{{|||}}}~~}}}}}}~~~~~}}~~~~~~~~~~~~~~~}}}}}}}~~~~~~}}}}}~~~~~~~~}}}|||||||}}}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~}}}~~~~~~~~~}}}||||||}}}}~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~}}}|||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}|}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m43.bin b/applications/SprPoP/dist/MUS/m43.bin deleted file mode 100644 index 86024ba..0000000 --- a/applications/SprPoP/dist/MUS/m43.bin +++ /dev/null @@ -1 +0,0 @@ -}}xtrp~~|}~jxnpzliwot{l_}t~Y~t|g~\vw|vrw}ooqb~yygsxzrv^o|gvfewpfhutscku|v}qrsxgv{}{nsrozvxs{xlnssmn|}z]cyrppc{rpu~unoz~lgzotxyy{~jsuwmnums}Yf}q[d{qqphtmwpu|}{kylpvywuk|psnWP^urajTzfkqegyylsvq^Ti|gt}uy`ysouhmtyy|v~hx|i|z{y~brgo}~glvkywS\u~rjsrtvrlcpdnqrfa|rk]s`{pvws}{qsoYtucwv|mmql`g~t\`da~npy~p|yt\glx`R[i|xzqpo|{}|sokxt}|uu|ye`sz_ggw|w|rz~jp|rzi]^{bryxtuxxqukbefhb^z{kszpkq}_nltrr|jxomtuv}}}uo~ssxvintQVy|sm{uqhpw~xcUOTaQkczku~v~si|}u|t~xjpp~yw~|jkv|}vj~fhxhhja~{{yn{mkusqtrcYildo}p}~nx~yvvz~qlfx}zxdex|vXl\yd^ewtXLh|wo`h|u_WandRf~zuv~}{]spyyndvx}}[cx\as~~vwjev{~v_{~`mpt}vg[\iq\pc~xtnl}|x~vl}v~~zumv~q[caxukqLq{mfxrgq~wky}j]PHRb]kwmjzo|}hcs|r|wvyqnjhc_[zdjc`jfRj}xafwewh\gppv~{iqtoqwyu|yf|lv]^uvrjeyj{m~sffjt|rz{mr}bJHW[J^s|ps{r|ynvooyhhklg^Tihso`Qwotx|xmkq{{qb`owgndiwp|}xyx~n}}~~}yunvthtRrtitehmmbS[xvsm]c{|un`Xqxyp}{xp~x{di~yrqqk|~sjksx{vlbrv_wjy{sxu~g[u~mlkb^ho^_~vfqi{{uwzy~mnw}}vnfppn}QcjoyhcrzkbnusuYLYcTch|vixvk}v{vi~nzw|ovrpmjjb_dvjtx^o{wmfqiqsaew~q{~p}y}yoitpo}|}~kv}n{lfmw}shgiewy^~ncoxz|qsug_n{ukg]JXpp~yv{qqz`nvr~|xslcdb_ZZksfaemiu]k}qsxwrgbnueoearzzrl|uuy~|}|~a]r_zdqzxeVRUg}{{hg|u_bumtvsotghutxxz|sxuntvolid\[o{|yfhwkm}vdi{xbW^m|oh~u}{w~|ox|}~urvxfbgiifgnxdjtVsxoz~~zmpqrthkdRfym{iuiw{|}zwppmmtutoyuutrr{w\bk}[rvqrnpt}jj}wlu{{pez|yxli~~tx|vwxokjqz~|upr}uzii|}vacpsrtrklxyeU^q}zgZlyq}vmykt}zpqyh]VTU_uqk]i}lw{w~z}}kfisuzu{|qzv{|sjl{hs}|xs}z~~vw|~{upkT]ywo[nwdckysqyszmi|sjts{mpstxl|s|fwrktwtoliebi}~|iupnftmXYjtmfirshg~zxj~|{xt}xrvvzw}|skkmops{|_gn`}yxzrkoxz{rcfruh{r}|c~uwtq~rvtt~utonuooz{mltmgdgonzsy]`xfeoy~y}wut~}x{|vvzzwuvvw{}zyy{vwpr}~~xlefikkox}pqqp~{~~zzxsrsk[Xmtgspf{w}}{|yy~z|{m{~|uollms{pbbbix{or~ynktyoou|nfutwxr{uu~yx~qn|ywzuwqxz~ywulut_lyoels{|xrrxxxwndrr~ngvz{}yyryv~ubh|~qd]\dtwgrsny|xpfclusmnpkk}wyw}x|sqy~{~zyzpruhgmtz|ykQTu~|ymnww~j^kouvemxq}wd}}nntzwz{qyz}|s{gykxxu{}tpt}{_m}nxioxx{ln{ysyy|rj{y~{xx}yw}uov{zrzuwxrqooqrtw~|nxvn|qv~ysnhis}}smkiqp}zmwnqrjn}uxxz|s{yrnljgbexywgg|z}}~{vw~xru{urw{rouhsuzzz~~vzzsou|rp~~t~}yyxvvywnqzqnv~|{{~xfg|vt}mizxytyv||vsu{l}zv~v{o{xlmswwvwzxrctlw{y~rgdlyn_ftoruzx~vxxu~tuxw{yx|sy~w|zvw{|wpgduzjm~yxxvuzztx|vws|y}o|uvzrvynuspu~zwvngznh|zxvlioxkh}wvsgp}~{op{|s|uyuxu~yrnr|vsyx}xuy~~tjgluyc_qwml~xtsu{yjbg|qzory{uvz|t|}sqw{n|ywt~uy|vx}|vqoq|uh|xumltufpzptzkqzzqv|t{}uzuot~~lxsv}~|{zy}|xwpkr{rsx~~~poz~u{s|vl{|~yzz~~{}yp{n{zzqeiw~~~xqs}z{sawyz|xtpmnu~ncmzvv~w{{|ywy}t}s{ysrv}}tqrrokhfjv}xw|{{~~xssqu{om~}nr}zz~tty~|~qp|z|y~}}{|}l]rx{wlqxrptpftxmq}xlhj{~}vx~z{v|wnx{t~{wtrrwtkqyjn{zy|somownbm|xu}}pywx|lm}ohn{y}}qu}zorynghp|to~~~|yzyxvtu{}lp|xsztrjyw}xsy~us}~zr|tx}rnqy|neiv~qmzwsvuu}nuzst}}}u|pmow{{|ss~tpt{{tvpm{vmy}w{}|{xusrpnq|wel{uoy{r}||{z~wrz|tx|vq|Pfnmn`c`xvpodq~qqzro{pmqko~~zp^qx^Zzlncfleq~zwy{mv}zs~hi{y}ygqucsuqqtm{{j_hkp~o}sv^Rxefs`fpoz~xupkuqqupuf{}}x~}~ugowk^Rp|~yjxgdi}sqqz}xxydayhjzs~SQsvvb^}[\Wkxoks}sx~t|xn|~rzijh\|x[pziqU_Mrbgz}r~cp{oow~zxypZ[yprstqR`t}|ozmshZywzzxkpqlw~mtvVYxnchgmt~tydIVir]QseukcyUdwwslsyaKebh{wwtl]Q_rdXimetcxojwnjkcvgd_`o~yyfz~tit~t]swv}kn}}}x{|t^Zrueymnsyvzrww}rqrt}t~cexy||kqss~tdtxknekseVjj[|pozsc{ch|w^_rtqgWweu}qhbmx^Qrux~pqk|vpsxwcw~]U[S[Qz~zpsvrywobr|ymm|lfwv}|zxm}x}pyezgU]mx}{cr~bar\P[f_]jis~iucwq`cwyyxn|{op}u_qsd]ScnlTUnYMg~unyraffhrewk`w|ke~}e~|zwu}oqsW]Zww}zwvzrmkrcbtzkfka\Ndp\ylkpk}o|}u}jqs\tr|}aP\SolgWdwgttlvxkq}vvxzqTSPV_k}~{|rz|qhatuuh~rkx|llrsqimoirZeyxbXpzwrYawj_zwbinw}vtoysz~~}f`x{mgtnojyr{_]bt{sssow|xyzp_h~rupllT`xcWt{t~|}vzs~|nxnrfrt^TXyx{eb]zqmnyvfi}~_jmhZRqow^ufesttmxwt~vvqumytlu[^X[noobgpui`pnemiguuxrgceuy{wquznj~zfky~p^|mmWn~rtgwaouspuzntihxkO_mWSueo}m|okqwofzv|lc~efy}ps[\z{krx{tvgtr{u}ngtw{emnbnyqShz`gouyyt~l~}uj|s{gxtpm}b{hosegm~kkhvuns}|m{xfy|UYvtr{~}rz{upyskmlbaqwi[syi||jt`iXc{sk{onpg|zqvu{jV{hn~z~qd~qCV~ppp`T\vu|h}ssssuwyc{scu~\iulp~~{\tQrxug]kuzy|uhxz}u|cc|iywptpuYnNsio^mxiTf}nllrle}qxslwpspPbnd{j|hjvST^i_Ocz|kVssUijr[Yjr~ka`\a[bcanlzhamqfk~|ruYhttdYen}tm{yy|rflzqmt{oj~yzquo\dzh`a~ptt{u~uv|~pv~xmeaqap{qwytmkgogqh{hddq|aXq}^j}z}yplry|lbz~xfzztsr|}txslrotfxUHjroq|sfjvtyxdWNP_X`q||ylv~ui|}yrmkm~{{utyhm{oud]ugk\x|tqeqpiohjtxk^jm^d|vx{tt{lzx|yrxpspasz|pcyzuYulx`V\qoUCV}}~x\\vtecnzter~x~ro{encvy~tjyzU\{[^p{|zy|zpkvz^uxrw~ep}ftwofep|jxg{}}vrn|u~}yy~}v~i^l}zoTW`{}qvPrqht}rhszuf|oaREQgejzeo{s}zecv}nyr{}~zxvwxuohlj~v]mjlpdNezdeyj`|f`heiwnyxo~uxz}}{x{j{dzpX]y}wmjsktzxzncafnx}tp~flvbUWeg[tny~t~}nuvzxt{dtrdgie]\Zs|n}n`Ziem~pt}vuphw}}vjiz{peo\yhyx{lswiyru}{sriojpqXtqtjorkZQ^}qrgVi~{r^]|wzzwyxw{udqvtjolyuheq~{xr|jZ|l}{rywyv]YzwlmbZ^ns`gob~spsu~t{syglz}splusv{Qmtyp_aquh^i{rpub[gnbvetokzrf|z}yznltvwnwrmeitbhi|s|~dismcamzkvn^jyzuztx}{{sigqywz}gp|p{lbfu}uojed~e~tgo{zqtyj_oztqtnWaz{}rzwxei}o}x}zytziegha\evsmjjvq|bg~~|~ty}|umiurue`tyzto{y~~tw{zx}x~|jbuelp}o]U]l{{xlctvt}{stjr||qm}owwv{~pxwmmz{zulhoz~w|tjnlz~qgm}}h]^fys}zx~{~rr|w}qpy|ibehgbiw|or~boyx~yu}}u~u|onxvtlxk|{|{}u|~kjuzr}kqzzxuv}derql|~{rlr~njx~y~~z~gw{vyxvqopzulzwqzwxq{vumpuz~{~{py{lrpz}unkpzr``gsqu{{{}sp}tt{vx}tzuy}yqkfabr}uik~{tmm}o{sx||}wqnq|~vw}{ziu}twwty{{z}w{~u_gklroz~vsvzk{tlmptypryo|z}wqs}f|~qiu~zrov}}wvxp{rfbhswoghq~zsu|s|~v}wpt|}~~{wu{yqllorsxnqqm|szuw|wqmutntrqr{z}|zz}{xplxwtsnuqk{ttxw|~r{up}ontr}xx|tysrz~vvrlkowxvy~vpwutvq{oysx~{uuyxzrs{x}toosvrf`j}~tqt}|}}{uv~}{t|t{owvvtrrtxqmmwsu~qlwzwzowt}ot{xuy~t|zy}y|yruslrnt||{||nnzoywu|||xs{|t||k~x||rlowsjq||uu||{tzt{wnhpyswum}{}|smknrtqotxqj~xt|x}xxzzxqt}~~rzyosoxn}uq{_fcRh~zwwsnbfzpc`{wb|{zxxxVqvwi~vuXzywz}rap|xghwhs|ttTpsk|obqhi|k|wzxhyyyfyw~wmo^sstzvkomstrdxm|oxvtXuR|}^ed~hs]Qkk}{py}xzuzgwqk~stqj}xaX{ysa~ooy}zzexz{yt}{opaY]zn[]kckrtyom|azldbks~fivygj[_|tunbhoqvt|vq}{W^yseptwv\ckp|mlolyaYw{qvry~_~_Xm}~Znwefigwusju{z\tndjuvusl}xiVmwm}xu}urjpe`g`wzwt_lejpvxm}]|sm}}}{z|jbzvnmn}w{yv^vyzvewxp~yshzl|y~wj|[o{vv~snvVefSy{rtrtgdzytrqv|qr|sosb|{]beT^|wfnpvlhw||xq}x{rihhoi]wlXvs~qlv{csq\thwoi{zrxy~||zp}rhXTTcluZQykvzu|{zkffytvswzrmvdkse~yu|z~yXanozc^xzmxypjvZt~lzkyxy{}mp|ppvwTxgvpmqyp_|sp}t\]~|gk\Z_fx~}yz|wzy~po[\^eszifhfoeu~pxl|zmnxwdwyyldyyn~}tkzudfpsgqr`vvvsdmtmt{r|}xtp~}mx}zprz]xxxgrom_hr}rWmwyu{reuhg_Gn|q\qrzj~x~}}veyukY\kneqp\o~mr~ls~||frqivrq||x~}vzz~gylyqimz{a\^sr\folrp}mp}utvyjwyyil|hq~rUfmdik[dfk{esv^crXkpqfooz~u~yxvndn~pcg`koqtok|~kZnv\rvx{v~qlrjslms}sv{hcrw}smwzpmak{zze}po~|u}{~|}n}`rri^Wdtvhxltzej{lr]^`d|_vzz{|{mzt~pv~hklgnl^lwbbx}|qv`okohg~{ss}}|znv}uq}~iuhs~wc[enxkmtx~pvxp}zqoxprqw}|kvz~hm{s{{ywwjivrtqhyxptvn~tv{|ufsSjjb~jvsxq~i~dgwttnRbwj}x}xpfkk}jx~yzo}qmxtphwpsr}|p}z`^{nj~lnl~oyjqvy~w}zq|zxqyv}yipybfhboyqn}ujxxk~jejtahgghovnwv{vul|os{p|||tinf`x|xsvvw{V^yyevyuqz}z|w~uuvuz|v{ufmxlkwxrsds}n{kw|v{zw{vq|ps|xs|lyf`qsncltks}}chtixx]l}}|l}zptsz|iq~wwznja^zzyrnn~xamgwqxpxw{x{{nul_~l|}~u|}jp~|ys}zcjv}{`dw}vww|}zwscory~kmxlshgklzv\ghosypriw`gxiqs{}|v}ou~sm}s{jp|uf_inu~z|uiqkj{ax{y~}sts~vz}wru}r~o{|ynfotorx~{wqj}uzwqtdkxnv}z|{vx}u}tz{~}xqywnhvwsuqu}v|xicms}uzxww|xqi{xna|~uolsshl~xwur~[f}zz|zty}wrky|icnrr~t~qdovlxp|ywvsmgqztp}uuxp|qyw{{eqvlio|yc]rseflsnhjwrs[lwxwxuvvottupu}ympolwv|{yqskvovt{zs}}ssytn{y{lo}ugj~mfznk|v~~hZozyyvzuvxuu}vxypoqryruzqt|vrz{}zrsuct|ux~{xxxu~wozrro}machcer|pqcsympwx}~n{z|}zx|zz|hw{vy~su{lsqp~|snkk{ysxxo}tzznncu|w}sol{tdbsxli}}z~tlZcn~~yv|z}~nxgtpd||xvmmefjo}ys}~pwtvow~{}rtypzuw}ogvrjvtfsrssitxmin|vw|yv}}{~|xzv~w~uil|znnr|tp`ntt~t}xyx{x{xwvpjm{yt`akprqos}x{r~zyvw~xes{}ztuwyzxzubn}yqt|}{}{wwu}}xxzrbpwuwlrymrnxwr|sw}qovqc_l|ndmxu{qoy|m]uwutwrwq{sxmtjxxjtyllorvx|~~qhjr}vu~wxwyymv~tjv~~}v|okywvprtkruwpxsx|zruy{y}ywv|rj}qu|}ump~yeblpgpx~}wz{}}zzwzm{qpqyrdjeXZcjlmqx~y|ysuz|{z~yjt}z{}zphq}q{v~s|tq{~ytxsrvqzzryzpompluykckit}{}}{zvolryyxwv{|zvuyvm_wxw}w~xpnoontskthcrg_kyrqzi_fpxy|z{yvx{~}|fopt|upvwvs{y{shorkcif_fovyux~yqlq{z~vtu{}rw}unoy}tjis~}}tqy{rzw}|w~nptskdernemkdhsyvqlo~lrw{octwoorpllyzq}u~xvx{voryvz{swxruuyuzoko{qmsvu|vzxoigit}|zwutlppffglv|tz|{xy|~rqutru~}yuftwjiqvicmeao}}~{|zxxytsxvvv{xmyxtyzz|{ywy~xj{|x~zonrvxkools{{ht~tzwrqqrsqyzx{ykjw{xottqqyseany~ylkv}xzzs|wu|trnjojWZedelnklmw~~prtvqvvwqkm}~xzty||{yyuuyst|}vrx~wmkoxqfgkvztu|}vrv|~skpyvrslijkuroxww}rggjnu~}|wafrjbdowngpkfr{o{}wz~oeuyrtxzwqmsotvx}qggou|~ohjhkqyznsk|~wne`iw~v}}st|nsvlmrsu{xnlovx}~{{zy}qrqx~tz{~zow}rxvpja`ha[lxwwwurln~~s{x}ypztlkihpwz|y~vqmpxxy}~vz|smkntvtvu|~zz}~ywzokpxwpov{ujfa^_ai|nwy}x~spty{wnmz|js{sllqvn^cnlu|z}k{|qsz~uwxy}ptvlmqrsv|gj|~y|ymnrrrx}{yz}|mszep|wsolgju}{||wlhmu~ryzmjnt}|snllr|~}|yy|~y~}x}v{|s~xurkini^k|}wttsr{}zwz~~}vy~zov}vyvqrtz|zzy}}|}~{vwzy||}ruyrlikqxxwvsw|wssw~yw{tx}vibgprqpkkmpxgo~rsxrkmsurnrwglsohfjsvlk{~}{u{q|}z~~|nfqshgloqt|wmx|}{ocgmpwytuvvwy{|}inz~vkbfp|~wx~xz{spsyvglrkhowzsqstty|{{|~~~~xtx{~{}vltysldeopo{z|n{|zxy|}zy}prztlkpz~xuyxoqwzssuv|vplikq{{xzppyvnprjdelrrokefjnw~q~ww{{}xmgpvv}}xrptywjh{|szuswz~|xy|~{y|~toxugdipz~qt|xu|~ztsy{|~|yx|wsmkt{|wsnmqw~}wss{tkjknu|~rnxvmmw~{wplosvz~|p|{~|}{yt|yvppy|u}~zwt{~{zyzu~unkmt~{rr{}ru}wyu{wot}~zy{||ns|rliikq{zurmkt||xtzzpq||yxricadjsxvstw{|uw}xt~|xsmks~y||xsnmqx|wxvw}~~{{~~pfmnecjuxlqwxz}ztvx|{wuqmqvrvsrv{{tpory~~xwx|{y~|uy}usstx||qelvqoy~ywutuvuvz~tov~|vy}slx|vojp|~~nv{tonpqv{|x{ykmvwv{{t{rnwxuvzzy~|s~zupkiny|ytu|~z|}zw{|ojsxwpgbadjrxwspqvyytr}yxqotzzv||xuw|{u~{zy{}xwwwx|wuy~znmtoegs}vz|ppx}~z|wstwcisssy~|wsswz}~}zz~yxsw|{vy~rlkkkouxrku}vr{ztpnou~sr~s~~tv~{xw}zy|z{w|}}~~{wsokjnuzsry|sp}x||rmtz||||~vvvpljmv{wtnnwwu|~zrlpxvnsynifcciry|}yw~wvvnjlt||y}}xursz{{|~qp}|~}zwvx~{}|mcjojjtxqwxw|}os~|}zrmjmzyfmzyuw|~}{yxwwz~{{}|}{{sszzusqqswwofmxvuz|}}{wuuvvx|~z|py~||}~~vns|}yuu|u}yxxuokjlptx~~|x{znp~|u}{rrv|zvw||xy|{zvrqtz{vv}|wvt|}}zvru|zliv{qgcabgpz~}tks~{z|tsvzvor~|~~|zz{u{|u||xustzzvuy|zojrwqqvzwu}voqz|}wrysrv~d^n{zx{~|xxy{{xy{zy{xpx~}tqvwoljiiouwqq{}yw{~ytprzyx~~vz{z~{ru~~}}~~uqqqqqrqppt}xrt{|uy}|svyuru}}}}}~z|zrnmqy|uonry{{y{{}|wqloxypq~umjhfhmu~{pqx~zsxzuqrvwrs~zwwyzx~vrtz}usyy}{z{~||}~wibkttsspnt}}vruzuq}|rmowvihxywy{|~}xrnqtux|~{{|t{yvw{}xtsqqty{skqyux|}zxvvwzzzt|~|}~xzxx{|}~~}|~}yolllllnqvz}zx|~uzyz{t|yrv~~zwxz{~ssyvuwy|yvx}zsy}~~}~}{wtsv|{qmrsmgdcekt~{phq}~|vx~}z|~xony|x}}zxx{}yz~vu~}ywx{zwuuxxrjlx~yqkkv{tqty~{}}w{zuv~znfixxvxyyyyxvuvvsuzxowvrtz}wqnljkpwzuq{xru{~~{wuw~|~xx~||vyvrx~x|{mghkosutsu{~|wrs{~ykq|zttz}{yz|}|z{wxzx}{vssv|vruy}y{|wvxz{zvqmmrwvqqttpmkkmqwwr}zxtmquvxxrlq~~||~{|wqpv{wvx}{w~~}~}{{||vjep}|sjjv~uqt{zv}}tor{|rnmp}{uuy}|uqpopu|~zy~zt|{xyzzzzzyvtrqrv||slvvruy{zxvx}~}z~z{|v{}y||zz|~{{}~qfcfjlnpry}~{yy~rr~ytv{{xvtuy~sr}z~||}~}{}|z}uq|~|~|{zyywusrru{{qggkkhginuymp~}}xzvot|}tou}|~|xvvy|yz}ysx|{{}}ywutuwtno||lfp{wvxz|~}xv|~|zxx{trspr~wsty{zvrsusqtz}wvwvwy{|}|ytomlmpw{zvz|tsv{}}|{{~}zyqu}}|~z}}vvz~||~z}z{|w}reaelsvxy|}zy{~}yusy{opy~{wwz}}zyy{{zz}zw}{qtxxxxzzz|zvvz}yxy|{wuuvxxvsolox{pfipqpprtx~tsyv~}tjny}snr}~~xssw}{z|}}{}~y~|zyyytllv|sgiu{uppt{~yz}~{xx~~pkrxyzwpqw{{wsqmijqz{vv{~~zvuxyyvttux}~zwz~xtuxyxwx}zwxsxzy~|~}yw||wvw{~~z{}vxukcbhnrru||{|}}{xwz{{zvw~ywy|~~|yutw~}vx}{sv}{wwzzz|wvy}|{{zxvvvutqpt~}n``hlmnpt{xnt|{wx}wnp}xuy|}wssw~~yy|xu{~zxusstutrw}ynlswusuz||{{|~}urz{usu{wot{~yw~~uqswwsoopoorx}~zy{{xyz{{zxvwyzxtpnoqux|{}zutx{|~yt{|sqv}|}~zzttz~~~|{{~{~yx}{zwwvmdafnsw|yvwz}~}yvw~|uos}{vuwxxwwxxx{{x|~qnu{~}yx|~||}}|z{{vsqqrturnjmuxpdaiqtwy|{vz}{yz~znjs}{srw~~{xvvyzxtw|~~zx{}w{~{yxz{yuruurrwwsqrvz~|vv~~xvuw||nip{}ysswxvvuqlkqx~}wtu}}xzzurrtvvutvx{~~ut|{vuwyy{zyxtwzw}{}~}}sqxzwwz}}tkmniddjorv{}|{{||}}{z{x|}{ut}xstwz||yusv}{z}wqw}zywvy|}}|ywwwutrssqnmrxypd\ajqtx|uv~yutwzxqpy|y}y~|zwsqtz|wuy~}{||tw~zwussvz{xtsvyzuonsz~}zyz}}vswzrnqzrnu}x|}vsssqoomlpuz}|yvwqpx}~{vssuwwurqrtvx~zw~zuux|yrw}vsuyz|w|qry|zz{|~}~~{{|slnqnihkqx~yvvxz{|zy{~}sqzyuuwyxwvwz{z~tmqzzvvwwy}~zvrppqttqmmoppmeafqy}zsv|yxxz}{ursttx~}{wvvvx{}ysrw}|yz~y}~{xxy}}shht~zojmswyz|}~~zvx|tprzsjlu{}yromoqqmkmqvz|}{wttztr{{vsqqsuwxz|}zrv~wuvz~~xv}xstw{yw~|try~zxwzwhcioolknt{~{xy{||{{{{}||{vwzttw{|{xx{zz~|}}vqv}{xtru|~}zxvuutsssqonppppng`blu|xt|~|yurrvzzwstxz~}vsrrtw{zvvy}}{|{w|{wtstx}xliusjkrz~~|zyy{}}zvw{yros}zpqy{uw}~yrmlnmjinuz|}|{xvvz{oow||xtrqsuvvuuvwy~zv{xuw}|tv}zuuwxz}}|y|~uuz~~{yxz}{y|}}vjdiqsolmt}~zxwwxy{|}}uqv{ustvvtsv~{y}zrqx}}zywuu{}{{|{xtqnnoponmnkhhkjffny~rq}{ywussw}~xnjq{wrqsx||wqptz}~|zxz~{}~}|zy{|lepvmmsxzzyz|~~{wvy~zrnnwqjnwxz}sllppnnqtwyzzzxuuyyrsy}}{xtqonptxz{|ytwzwz}vxwtvy{}|y{~}yy|~|{{}{{}{ma_hqspnrz}yvvy|}|{|~{|}yvw~xssvxxxy}{wx~{y{~}yvz~|vtw}y~zywurqqrrrpmmnnkhkooiejuyry}zyyxvsons{ynmx~uppswxvstx{}}|{{{~zz~zvuvy~~sjo}}rnqw{}}{zzzzyvwz~xsrvuot}wrw~~vmkmlijou{}|zxwvw|wqquwvtrppqtwxyxy}}yz~yz}vx~}wrswzzz{}|~~~}}|zxvx|uqu{~ukdenxyusw|}{zzyyxxy||vtz{vuvutu{|z}}yy|ysrtvyxtru|~yyyxvsqoonmmopkdaelomkq|{oo}zyxvrpr{vjlw|sorw|zustwz||}}|{|~~|{||zyy|ynkpwxvsrtwxwvwz}|xvz|zvrpt~ynmu~xty~umjjikoswxwwvvvwy|}}}~|wtuxzywtqpquy|}{wy}|}tqx~vrswzzz{~ww}}}{zzz{}{st|}zqhbfpxyyz{zwuvxz{{z{~}~}|xy~}wuuvy}yvy~yutx}{uruz|zwvy|~}~ywvspoprrpmmonhcdjqtqmoysmx~zxwwwuqnovwoq{~~vqrvxupqv|~}||}||}zz}}~}yvux}~wppuwxyywvvxyzz{{zxuty|ywutwxopx}uruzysnkhhjnsx{{ywvvy|~}}|smmqssqooqvy{z{}{~{vy~vppuy{{yy|xy|uyzxwwy}{pox{tnhfhqy}}|{yxyz{{yxx{~wsu{~zvssuy}}zz}~zvw{vootwvtvzyutsrqpomjiknmfa`dlsutu}vq{~~}}||zxvuspmpxzrpu}zsrvxvssuxxxyz||zz|}|}{zzzz{|wwwsquz|zxwwvvxz|zwvz~tpnnouvopx~xvx||xrlijouyzywutuw{|{ww{|tnnruutrpprvy|}yz|utz|vtux{{zy|{svyw}yxz}wrv}{xrmhehpy~yvvvxy{|}}}~~~zuu{}wssw}~xw{~zvtv|zrpuyyy{}{urpnmmnomlmmic`agpx{yw{xpt~zwutttrnmqw{{xww{z{~~zvuvtpnrx{||{||{{|{{~||||{yxz~~xtx{wqrz{wvwy{{zwssx~xpmnsz~plq{{tprvxuniimqtvxyxwvx{}zww}wmhjnppoprvz|||{xtxwposwzzyxy}~x{vt|~ywwz~xrw|wromlknv~wvxz{{yxy}|usxyuuz}|wx}~zvstyvmknpruy}{urqqrqnkikmkea_agox}}}{rt~|zyyxwvspnqv{|}~|yx{~z{~}zwurruyzzyz{}~~}}~{xuvx{{wz{phmx|wuuvwxxvwzshfjr~vnow~ztppuyvnijotxywussuy}}xttzypklprtttuvwy}}xyuqv{xrorvyyyxxy~{zzw}zwx||x{~{vssrolnx{wvwxwwy|zvv|yvy|yz~}zwtrtx}|uomnqu{|uqonnmlkmomgb_`dkt~}|xpmv~|xvtssqoorvvux~|}vsw}~ztporvxz|}~~}}|~}|||||zyxxy{~~xtx~}slnxzvuwz{yusv|ymfhq~wkjszqkmtxtnlnruuuuuvwy||yttx~vmggjlnpruwz}}{{sv}~xqoruxyyxyz~zw{|yy}|}~||upopqpnpz}xwy{{{z{|~{uqu}{xz}|wuz{wttv{yrlikqx~}upnoonkhijid`_adiq{~xpq~}{yvttuutpnnruvv{|y{yuw}{toptxyxxxz{{||}||~}zvuw||zwmls~}xvvwvtrtzyjacm|rkoyzrmpwzwqoquxxwussux{zvrrvy{zumhgjmpsvvvv{~z~zvz}xpnrx{{yxxy|}{|}{~~|}~~wsrtutpns~{yyyxxy|~~{wtv}{|~|yy||yvutvy|}}{vokls{~{~~wqnmlighlmic__bflvvlhp}{ywusrqommquursz~{}~uqt|zroruvvx{}}}||}wtvy{{ywwy}~xv{xpns{|xwxywttx|{pgen}rjlv}tljotvustuvusrsuy{|zurswz|}yqiddhlptvwy}zx||vppruwwwwx{}}}~}{{~~{wrprtvust{}{zzzz{~||yuvz}xvx|{wtstvxz|~|tjeiqy~xrpomkjjkgb__aeiow{mel}yvsrsutqoquvrrw|wxztsxysswyzzz{|||}~vtw{|{xvuw|zw{~vqpsx}zyxuqqv~zphgqtjks~xqllosvxwvvvuuttuwzzwttuvwwyytmgfjouxyyz~~||}xpklqvyyxxy{}|xvx}|zutvxzzyxz}|zxwx|}~|zyz~{y{}zvttuvwwvxzysljnv|~{|~ytqnkiilliebbeint}wgbn}zxwvvtqootwvssx}}|uqszzuuwxxxy|~xstvwwvuvy~}wtx~{ussux|}zxvttx|}wrmmuwnlr{}wrnlmquxyxwusrrtw{|zustvvwxxwrkfehnruwz~xrqsuwwwwxz|}||~{wvy|tu}|uppruwyz|~~~~zyz{|}~}zyy}~|~|zyyzzyyz{zuolmrw{}}}}|~~{wtqonoomifdehmrw~zlht}}zxwvvuuvz|zwx}~yusuy}}yvvxzzz{|}}}~zyz{{zzz{~|xw|}xwwwwy|~|ywuuy~~yurqt{|rlnu~|xtqoorvyzxvutsstwyxurrtuutstsqmjjmquxz}|uqqsvwxxyy{|{{|~|xutv|~ts{{uqpqtvy{}~|ywwyz{{|}~~~~}||~}|{{|{yxwxwtqopsvyz{{{}~zxxyzxvspnmnnmkjjlptztjm{}|~~|{zxvuvz||yx{{xutvxyxwxy{{zz{}~zyyyyyz|~|xvy}~zwuvxxyz}~}{xwx{|vrqsy}rmov~}yvsomoswxxvtrrrtwzyvssuvvttttspmlnqtw{|ursuvwwwwxzzzy{~|yvtuzupu~ytqpqsvx|~}|zxvvwwxy{}~}}~~~}{yxwwvsqpqrtuvwx{|yxxxywusqppqpmllorw|vnoy|zz|~}{yyz~~|~|zwvuwxyxwy{}}}}}~}{{z{{}~~{wux}~|xwwyyyyy|~~}{yz|~xsrt{unmrz~{wuronpsvwwusrrsuxyvsqsvvusssssrqprux{~}}ztrrstuvwxyyyyy{~|zxusstyvqu~~xsqprtwz~~|zxvtuvwxyz|}~~~}|zwvutsrrrrstuvwy|~~{ywwwwwusrqqqonnpsw|{spu}yxy}~|zz|}}~{ywvvwxwuux{}~}|}~|{zz{}~~{xwy}~|ywwyzzz{|~~}}|vqps{xpnqx~{xuroopsuutsqqrtvxwtrsuwwutssttsssuwz}}~yuttuvvvwwxxxxxz~|zxvttux~~tqv~xtqpqsux|}{xvtstuuvwyz|}~}{ywvutssssssstuwz~}|}}{ywvuuuutsrrrrqqqsw{xrqy}ywx{}||}{ywuuvxxvtux{~~~}~~}}~~{xwz}~{xwxyzzzz{|}~}|}{uqqv~uoot{|ywtrqqrtuutsrrtvxxurqsvwvtsrsstttuwy|~~{vtttuuvvwxxxxxz|}zxvtstw|urv~~xsqpqsvy}}zxusrstuvwyz|}~}{ywutsssssrrssuwz}}|zy{~~{yxvtsssssrrsssrsux|{tqvzwvx{~}|zxwvvwxywtsvz}~~}~|yy{~|yxxz{{||}}~~xtqrwvpptz~{xusrqrrstssrrtvwwtrruwxwutttuvvwxy{~~~~zvutuuvvvvwwwwxz|{yvusstw|xst{|wsqqrtwz}~|zxusrrstvwxz{|~~|zxvtssssssrrstvy|}|zy{~~|zywvutttttttuttuvx|{tqt}zwvwy}~}{zxvuuvxyxutuy}|yxy|~|zxxyz{{|||}~~{vsrv}{sprx~~{yvtrrrrsssssstvwxvsrsvwwvutttuvwy{|~~|xvtttuuuuvvvvwxz|}ywusrsux~wsu|}xurrrtvy|~~}~~~}}{zxusrrstuwxz{|~}{ywusssssssrrsuwz|{ywx{}~}{zxwvutssssttuuvvwz}~wrry~yvuvy}}|{zxwvuuwxywutuy}}zy{~~{yyy{||}}~~yurrv}}uqrv|~{xvtsrrrrrrrstuwxvtrsuxxxwvuuvwxz{|~~zwuuuuuuvvvvvvwy{}|yvtsstvz}usw~|wtrrsuwz|~}}}}}||zywusrrstuwxy{|}~}{ywutssstssrrsuwz{zxwx{}~}{yxwvuttsttuuvvwwy{~}vrsz}xvuvy}~}{zyxvuuvwxywutvy}~{{}~|zz{|}~|wtsty{trtx}~{ywuttsssssstuwxxvsstwyyxwvvwwyz{}|xvuuuuuuuuvvvwxz|~~{xutsstw{|usv}~yvtsstvy{}~~|||||{zyxvusrrstuwxz{|}}{ywutssssssrstvxzzyvvwz||{yxwvuttssstuvwxyz|ysrw{wuuvy}~}{zyxvuuvwxyxvtuy|~~|{}~|{z{|}~~{wtsuz{usuy~~{xvutttssssstvwxwussuxyyxwwwwxy{|~~zwvuuuuuuuvvvvwyz}|yvtsssv{wsuz}yvtttuwy{|}~~~}{{zzzzyxwvussrstuwxz{|}~~|zxvuttttsssstuwyzxvuvy{{{yxvuuttsstuvwxy{|~ytrv~}yvuuwz}~|{zywvuuvwxyxvuux{~}|}~|{||}~{xutuz~wttw{~{ywvuuttssstvwyywusuwyzzyxxxyz{|~}ywuuuuuuuuuuvvwy{|~}zwussstx|~wsu{}yvutuvxz{}~~~}|{{zzzyxwvutssstuwxy{|}~}{ywvutttsssstuwyzywuvxz{{zxwvuuttttuuvxyz|~|vsty{wuuvx{~}|{yxwvuuvwxyxvuvy|~}}~}}~~zwttvzxutvz}{ywvvuutttuvxyyxvtuwyz{zzyyz{|}~{xvuuuuuuuuuuvvxy{}}zxutsstwz{utw|}zwvuuvxyz||}~~~}|{zyyyyxwvvutsstuvwxz{|}~}{yxvuuttttsttvwyyxvuuwyzzywvuutttttuvxyz|~zusu{{wuuvxz}~}{zyxwvuvvxyywuuvy|~~~}}}~~}yvttw|}wuux||zxwvvuuuuuvwyzywuuvxz{{zzzz{{|~}zwvuuuuuuuuuvvwyz|~~{xvtsstwz~|vtv|~zxvuvvxy{|}}~~~~|{zyyyyxwvuuttttuvwyz{|}~}{yxwvuutttttuvxyxwutuwyzyxwvuutttuuvxy{}~|wttxzwuuvxz|~}{zyxwvvvwxyyxvuvy|~~~{xvtux}}wuux{}{zxxwvvvvvwxzzywvvwy{||{{{{|}~~|ywvuuuuuuuuuvvxy{|~}{xvtttuwz~~wtuy}zxwvvwxz{{|}}~}|}~|zyyxxxwwvuuttttuvwxz{|}~~}|zxwvuuutttuuwxyywuuuwyzzyxwvuuuuuvwxy{}~}xttw~{xuuvwy|~}|zyxwvvvwxyyxwuvx{}~~~|yvuux|yvuwz~~|zyxwwvvvvwxyzzxwvvxz|||{{{||}~{xvvuuuuuuuuuvvxyz|~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m50.bin b/applications/SprPoP/dist/MUS/m50.bin deleted file mode 100644 index 7f679a5..0000000 --- a/applications/SprPoP/dist/MUS/m50.bin +++ /dev/null @@ -1 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}~}~~~~~~}~}}~|||~}}~~}}~~}~}}~~}|}{{{||{~}~}~}}~~}}~~}{|{zz{{z}~~}}|}~~}}}}~~~~}~}{{|yzz{z{~}}|~||~~}|~~|~~~~}}|{|zyyzzy}|}|}}|}}}||~|}}~~}|z{zyzyzy|||||}{|}}}|~}}}~~~~~}z{{yzyzy{|||{}||}}}|}}|}}~~}{z{yzyzyz|||{||{}}}|}}|}}~~}{z{yzyzyz|||{||{}}}|}~|}}~~}{z|yzyzyy|||{||{}}}||~|}}~~}{z|zzyzzy|||{||{}}}||~|}}~~~}{z|zzyzzy|||{||{}}}||~|}}~~}{z|zzyzzy|||{||{}}}|}~|}}}~}{z|zzzzyz}}|{||{}~}|}~|}}}~}zz|yyz{yz}||{}{{}~}{}~|}~}~~|y{|yyz{y{}}{{}{|~~}|~~|}~~}~~~|y{{yyz{y|~|{{}{|~~||}|}~~}~~~{y|{yy{zy|~}{{}{|~||}|}~}~~~{y|{yy{zy|~|z{}{|~||}|}~~~~~{y|{zy{{z|~}z|}{}~||}|}}}~~}{y|{zz{{y|~}z{}{|~}|}|}~~}~~}{y|{zz{{z|~}{{}{|~}|~|}~~}~~~|y{|zz{{y|~}{{}{|~}|~|}~~}~~~|y{|zz{{z{~}{z}{{~~|~~|}~~}~~~}|yz|zz{|z{~~|z||{~|~}|}~}~~~~~}zy|{z{{{z}~|z||{}}}}|}~}}~~~}{y{|zz{{z|~}{{}{|~}}~|}~~|~~~|yz|zz{{z{~~|z}{{~~}~|}~~|~~~~}zy|{z{{{z}~}z||{}}}}}}~}}~~~}{y{|z{{|z}~}{{|{|~}~}}~}|~~}{yz|z{{|z|~~|{|{|~}}}}~|~~~~}|yz|{{{|{{~~|{|{{~}~}}}~|~~~~}|zy|{{{|{{~~}{||{~}~}}}~}}~~~}|zy|{{{|{{~~}{||{~~~}}}~|}~~}|zy|{{||{{~}{||{~~~}}}~}}~~~}|zy|{{|||{~}{||{~~~}}}~|}~~~}|zy|{{||{{~}z||{~~~}}}~|}~~~}|yy|{{||{|}z|{{~~~}}}~|}~~~}{yz|{{|}{}|z|{|~|}}~|}~}~}}{yz|{{|}{}~{z|{|~|}}}|~~~~}}}{y{|{|}}{~~{{|{}~~|}~}|~~~~}|zx{|{|}|{~~{{|{}~~|}~}|~~~}}|zy||{|}||~z{|{}~~|}~}|}~}}|zy||{|}}|~z{|{~~~||~}|~~}~}}|zx||{|}}|~{{|{}~~||~}|~~}}}|zx{|{|}}|{{|{}~~||~}|~~~~}}|{x{|{|}}|{{|{}~||~}|~~~~}}}{xz}{|}}|~|z|{|~||}~|}~~}}}}|yz}||}~}~}z|{|}|}~||~~}~}}|yy||{}~}}~z||{~~|}~}|~~~}~}}|zy{}{}}}|{{}{}||}}{~~~}~}}{yz}||}~}~}z|{|||}~||~~~}~}}|zy|||}~~}{||{~~||}}|~~~~~|~}}|zy{|{}~~}|{|{~||}}{}~~~}}}}|{yz}|}~~}}{|{}||}~|}~~}}~}}{yz||}}~}~~{|||}||~||~~~|~}}|zy|||}~}~~{|||}||~||~~~~|~~}}|zy|||~~~~{|||}||~||~~~~|~~~}}|zy|||~~~~{|||~||}}|~~~~~|~~~}}|zy|||~~~~{|||}||~||~~~~|~~}}|zy|||~~~~{|||}||~||~~~~|~~}}|zy|||~~~~~{|||}||~||~~~}|~~}}}|zz}|}~~~{}|}|||~|}~~~}|~}}}{yz}|}~~}{}|~||}~|}~~~~||~}}}{y{}|}~|{}|~{|}}|}~~~~|}~~}}}{y{}|}~||}|~{|}}|~~~~~|}}~}}}{y|}|~~~||}|~{|~}|~~~~|}}~}}}{y|||~{|}|~{|~}|~~~~|}}~}}}{y|||~||}|~{{}}|~~~~~|}}}}}{y{}|~||}|~{{}}|~~~~|}}}}}{y{}|}~|{}|~{{}~|}~~~||}}}}|y{}|}}{}|~|{}~|}~~~~||~~}}}}zz||}~{}}}}{|~}|~~~~}{~~}~}}}{z|||~{|}|~{|~}|~~~~}{}~}}}}{y{}|~}|}|~{{}~|}~~~~||}~~}}|zz}|}~{}}}|{|~}|~~~~}{~~~}~~}}{z||}~||}}~{{~~|~~~~}{}~}~}}|z{}|~}|}}{{}~|}~~~~||}~~}}|z{}|~~|}}~|{|~|}~~~~~|{~}}~~}}{z||}|}}}}{|~}}~~~~~}{~~~}~~}}{z||}|}}}}{|~}}~~~~~}{~~~}~~}}{z||}||}}}{|~}}~~~~~}{}~~}~~}}|z||}||}}~{{~~}~~~~~}{}~~}~~~}|z|}}|}}}}{|~~}~~~~}{}~~}~~~}{z||}|}}}}{|~}}~~~~~}{~~~}~~~}{z||}|}}}}{|~}}~~~~|{~~}}~~~}{z}|}|}}~|{|}}~~~~|{~~}~~~~}z{}|~~|}}{{}}~~~~~{|~~|~~~~}z{}|~}|~}{{~~}~~~~}{|~~|~~~|z|}}~}|~}~{{~~}~~~~}{}~~|~~~~|z|}}~}|~}~{{~~}~~~~}{}}~|~~~~|z|}}||~}~{{~~}~~~~~}{}}~|~~~~|z|}}~}|~}~{{~~}~~~~}{|~~|~~~}z|}}~}|~}{{~~}~~~~}{|~~~|~~~~}z{}}~}|~}{{}}~~~~~}{|~~|~~~~~{{}|~~|}}|z}}~~~~~|{~~}}}~~~~{{}}}|}~~}z|~}~~~|{~}}|~~~~|{|}}|}~~~{{~~}~~~}{}}~~|~~~~}{|}}~~|~}{{}}~~~~~}{{~~|}~~~~{{}}~|}~~|z|~}~~~|{~}}|~~~~}{|}}}|~~~{{~}~~~}{|}~~|~~~~}{|}}~~|~~{{}}~~~~~}{|~~|}~~~~{{}}~|}~|{|}~~~~~|{~}}}~~~~|{|}}|}~~}{|~}~~~|{~}}|~~~~|{|}}|}~~}{{~}~}~|{}}}|~~~~}{|}}|}~~}{{~~}~~}~|{}}~}|~~~~}{|}}}}~~~{{~}~~~~|{}}~}|~~~~}{|}}}}~~~{{~~}~~}~|{}}}|~~~~|{|}}|}~~}{{~}~}~|{}}}|~~~~|{||}|}~~}{|~~~}~|{~}}|~~~~|{||}|}~|z|~~~~}}{{~~}|}~~~{{}|~|~~{{}~~~~~~}{{}~~|~~~~{|}}~~|~~{{~}~~~~~}{|}~~|~~~}{|}}~}|~~{{~~~~}~~}{|}~~|~~~}{|}}}|~~~{{~~~~}~|{|}~~|~~~~}{|}}}|~~~{{~~~~}~|{|}~~|~~~}{|}}}|~~~{{~~~~}~~}{|}~~|~~~}{|}}~}|~~{{~~~~}~~}{|}~~|~~~~{|}|~~|~~{{~~~}~~}{{}}|}~~~{{}|~|}~|z}~~~~}}{{~~}}}~~|{||}|}~}z|~~~}}|{}}~}|~~}{||}}}~~~{{~~~}~|{|}~~|~~~~{|}|~~|~~{{}~~~}~}{{~~}|}~~~|{||}|}~}{|~~~}}|{}}~}|~~}{||}}|~~{{~~~~}~~|{|}~~|~~~{|||~~|~~{{~~~}}~}{{~~}|}~~~|{}|~|}~|{}~~~}}{{~~}}|~~|{||}|}~}{|~~~}}|{}}~}|~~}{||}}}~~{|~~~}}|{}}~}|~~}{||}}}~~{|~~~~}}|z|}~~|~~}{||}}|~~~{{~~~~}}|{|}~~|~~~}{||}}}~~{|~~~~}}|z|}~}|~~~}{||}}}~~{|~~~}}|z}}~}|~~}{||}}}~}{|~~~}}|{}}~}|~~|{||}|}~|{}~~}~}{{~~}|}~~~~||||}|}~|{~~~}}~}{{~}}~|}~~{|||~~|~~{{~~~}~~|{|}}~|~~~{|||~~|~~{{~~~~}~~|{|}~~|~~}{|||~}|~~{{~~~}~~|{|}~~|~~}{|||~}|~~~{{~~~}}|{|}~~|~~}{|||~}|~~{{~~~}~~|{|}~~|~~~{|||~~|~~{{~~~}~~|{{}}~|~~~~{|||~~|~~{{~~~}~~}{{~~}|}~~~{{||}|}~|{}~~~}~}{{}~}}}~~|{||}|}~}{|~~~}}|{}}~}|~~}{|||}}~~~{|~~~}~|{|}~~|~~~~{|||~~|~~|{~~~~}~}{{~~}}}~~~|{||}|}~}{|~~~}}|{}}~}|~~}{|||~}|~~{{~~~~}~~}{|}~~|~~~}{|||~~|~~|{~~~~~~}{{~~}}}~~~{{||}|}~|{}~~~~}~}|{}}}}~~~|{||}|}~}{|~~}}|{}}~}|~~~~|{||}~}}~~~{|~~}}|{|}~~|~~~|{|||~}}~~~{|~~}}|{|}~~|~~~~}{|||~}|~~~{|~~~}}|{|}~~|~~~~}{|||~}}~~~{|~~}}|{|}~~|~~~|{|||~}}~~~{|~~}}|{|}~~|~~~~|{|||~}}~~~{|~~}}|{}}}}~~~~|{||}|}~}{}~~~~~~}|{}}}}~~~~{{||}|}~|{}~~~~~}{{~~~|~~~}{{||}~|~~{{~~~~~~~}{{~~~~|~~~~}{{||}}|~~{{~~~~~~}{|~~~|~~~~}{|||~}|~~{{~~~~~~}{|~~~|~~~~|{|||~}|~~~{|~~~~~}{|~~~|~~~~}{|||~}|~~{{~~~~~~}{|~~~|~~~~}{{||}}|~~{{~~~~~~~}{{~~~}~~~~}{{||}~|~~|{~~~~~|~|~|z~}}|}~}|{{{~~{}}}z~}}~}~|z~~~~|~}}}|z|}~~|}~~~z}~~}~}|{~~~~|~~}z|}|~||}}~|}~~}~~|}|~~~~}~}~|||~|~|}}~|}}~}}~~~{{z|~~~}|{{|~}}|~|zz~~~~~~~}}|{|~}|~}}|{zy{|~}~|{~}|}|}}~|}}~~}{}|{z|}~}{||~}}~}}~~|~}~~~~~~~}~~||}~~}||}~~~}~}~}|~|z{{}~~~~|}|{|~~~~}}|{{}~~~}~}}{{|~}}~~~|zzzz}~}~~||~~~|~}|~}}}|}~}}|{|{{{~}{{}|~~~~~|~~~~~~~}~~}}~{|}{{|~}~}}}|~{z||}~~~~|}}|}~|}}}{||}~~}}{{{|}}}~}{z{z{~~~}~}||}~~~~}}}}~}~||}|}z{{{z}~|{~}}~~~~|~~}}~|~}~~}{}|{}{z}}~~}}~|~{z}}|~~~}~~{|~}}~~z}|z}~|~~}}{z|~}~~}~{y{||~}~}{}~}~~~}~~~z|~~}|~}||{}zz{|{}~~||}}~~}~}~~~}}~}~|}~}z|}|}~}|z}~~}|~~~|{}}|~}}}~||~~~z{}{||}~~}~~|y|~~}~~~}~|zz}}~~|~{|~~|~}|z~}|~~~~{{}zz|}|}}~}~~{~}}}}~}}~}||}|y|}}~{|{{~~~|{~~}|}~||~~||~}|~~~~}{{}||}|~~~}||z|~~~~|~}zz}~}~|}~~{{|}~}~|z}~|~~|z|{y|~}~}|{|~}}}|~~~~~|~~~~}{}}zz}~~|z||~}~~~|}~}}~}|~~}}|~~||~}}}}|{}~}}}||~|{|{}~~~}|~|{{~~~~}|~}}{|~|}~~~}|{~~~|~~|z|zz}~~~||}{}~~~~|}~}~~|~}~|{}|zz~{z}}~}~~}|~|~~}~}~||~}||~}}{||}~~~}}~{}}z|}|~}~||~||}~}}}|~||}|~}|~{}~{}~}~~}{z|z{}||~~||}~}}}~~}~~~~}|||||z}~{|~|~~~~|}}~}~~}}~}|{~~~||~~|}}~|}{~}{~~~~}{|}|~~|~~z|}}~|~}{}~~}zyz{}~~~}||~~~~~~||}~~}||zzz|~||~~}~}~||~~}~~||{{{|~|{}}~~~}~~{~|y|~}~~~|{z{}~}~~{}}~~|~~~{|}y{}|~}{zyz}|}~~}|~}}~~~|~{z}}~~}{zzz|||~{{~~{}{|}}~~~|zzz|}|~~{y|~|z}}}||{}~|{|{|||~yy}~}~{|}|||{{~~}~~{{|{|z{}z{}}~|{~}~}|z}~}~}z{{{{z|~~{z||~~}}}~|}{~~|}}{{|{{{{~{z{{~~}~|{~}|~||~~~{|||}{{}~~{|z{||}||~}||}{}~}}~||}{{}}~}}{|~}|}}|~~}}|{~}}~~~~~|||z{}}~z|~}~}|~}~}|}{|}~~~{||y{}}~z||{~|~~}~}{|{~|~~}{}|{}}|~~{|z{~{~}}~{|~{{~~~}~~~}~{{~}|~~~~}}z||{}}}~{}{|~~~~}~}~~z|}{|~}~~~|y~{|}}~|~}|~}}~~}}}|z}}{}}~~{y}}~}}}|~}~~}}~~{|~||~|~~~z{~}}~|~{}}~|~~~}~|~~{}}|~|}{}~~~~}{~}|~~~~|~~~~~}}}|}{||}}|~|~|}~|~~~~}~~}||~~{}|z~~|}~}{}}}}}~~~}~}}||~|}~|}~~~~{|}~~|}~~~~~}}~}~|~|{~|{~~~~}|~~~~|}~}~~~|~}}}~~{}|z|~}|}}~~|{~~}~~~}~~}~{|}z{~~~}}|~|~~~~}~}~}}~||~{z}}~}}{~|}}~~~~|~}~~|~|y{}}~~~~||~|~~~}}}~~||~~|}}zz||~}{~~}}}~~~~}~}{}}}~~}||x}|{}}{~~|}}}~~~{}}|~~~~|}yx|{|~~||{~~}}|}~~}}}|~}{{y}|z}~}xy~~~~}~|~||~|~~~~yz~{|}~}~}{z}~}}~{{}}}zz~~~~}z|}z~~||~y{~~}|~~~}||||~~}}~|{}}zx{|{{|||~}}}}}}~{|~~~|~}~y{|y|}z{~~{zz~~|}~~~~||}}}{y}}{|||{z}}~}{{}}~|{{~~~~}~~|{}|y}}~{y}||||~}|~~~{|~~~~~~~{}}zx|~||{|}}||}}}~~{}~}}~}y{|y|~}|~|~|{{~}~}~~|~}}~}~~}~|}}{y}~}~}{{{{~|~}{{}~||~~~|~}{z~}|}~~~|zz~{|~|}~}}}}{~}~|{~}zz~}~~|{{{}}|~~~}||~|}zy}{{~}|{}}}~~{~}~}~}~~~~~~~~|{}|z}}~~}zz|}~}}~}||}~}~}}{}~}{~||}}~}}{{}}{|~{~|~~|~~~|~|}~|z|}~}~~||~}~~{~||~~|}}}~~|z{}z}}||{||~}~}~~}~~~}}~||}}z{~}~~}z{}}}|}|}}~}~}{}~|{}~{~}~{}}{}}~||}}|||~~}}|{}z{~~|}}||}~|~~{~~||~~}|y{}z|~|}}{~|{~}~}~}}~|~~z}}zy~~~~~zz~~|~}~~}~|~}~~{{~}{||}~|{}}}|~|}~||{~~}~~|}~z|~|{}}~{}~}~}{~}||}~|~~~|~~{y{|{~}}~}~||}}}}~~}~~}}~~{}}z||z{~~}zz~~~|~~}|~~~~~{z}|{|}~~}~{z}~}}~{|~||z}~~~~||}z|}{|~z{~~~|}}~}{{}}}||~|yz}{|}~||}{}~~|}}~{~~~~|{}zz}|z}}~~{z}}~~{~~}~~~}~|z{}||}~}|}z{~}}{}}|{~~~~~}{|}{|~}}~~}y|~|}|}~|}}|}}~~{~{xy~{~|~}{{}~}|~||~~~|}~}z|}zxz}z}~}}}~}~~~}~}}~~~{~}}{~~zy{}|}}|{|~}~~}{~}~~z|~~}~|zz|~}~~}}z|~~|}~|z~}}}{~}}~~{y{}{~{}{}~~||{~{z~~~~||~~}|}|yx|}z~}||~}~||}{~~~}}~}|||yy}~|~}{z|~~}}~~|~~~}|~~{}}zz|}}}|~}{{~~|~~|z~~~}~~{}|}~}{z|||~~|~~{}}}{{z}}~}{~~}}}|yx}}{~}|z~}~{|||~~~}~~}{}~|xz~}}}}~{z~~|~}|~~~~}~~z~|y|~|~|~|||~~~~}~|{}~~~~}|~~|}{z|}{~~}~~}}}}~}}~~}{}}~||}~}|zy{}|~~~~|||~~|}~|~~~~}}~~}}~|{xz}}}~~{{~~|}}{~}~~|}}|y{~|~|~}{|}~~|}{~}|}|~~{y|}{}~|~|{}~~}|~}{}~~~~~}|~~~|}zy{}{~~}~||~~~~|~~~|~~}~|~~~|~}{yy||~~~~}{}~}}}~||~}||}}|{z}}}~~}}z}}~}}|{}{~~~}~}zx}~|~~||{}~~}||{~~~||~~{~{x{}{}~|~~||~}~|~}|~~~~~|~~{}~{yz|||~}}{}~}~}~}}{~~~|~~||}|zz|~|~}}{|}~|}{~~~||~|~~{y{~|}|}}{{~~|~}z}~}~}{{}|yz}{|}}|{~~~~|}~{}~}~~|~~{|~|yz}||~}|{~~}~~}}||~~|~~~{|~|zz}}|~}|z}~}}||{~~~|}|}}zy|}|~||z}~~~|~|{~~~|}}|~}zy|}{~~|}{}}~}|~|{~~~|~~}|~}zy|}{~}|{}}~~}|}{~~|}~||~|yz}}|~}|{}~}~|}{~|~|}}zz}}|~|~|{}~~~|~|{~~~~|~|}~|zz}||~}|~|{~~~~}|~{|~}~}||}}|yz}||}}~|{~}|}~{}~}}~~{}}{y{~|}|~}{|~~|~}{~~}}~{~}{y|}|~~|~|{|~}~~}}{~~~}}~~|~}{y|}|~~|~||}~~~}~~}{~~~|}~}|~|zy|}|~~~}}||~}~|~}|~}}}|~|{y{}|~}~}{|~}}}{~~}}~|}}{z|~|}|~}{|~~~|}{~~}}|~}{y{}{}~|~}{|~~~|~}{}~}||~~{y{}{}~~}}~||~~~~|}~~|}~~~~}|}~{zz||}~}~||}~~~}}||~~|~}|~|{z|}|~~|~}{}}~~|}{~~}}|~}{y{}|}~|}}{|~~|~}{}~~||}~|yz}|{~~}}||~~~~~}}~||~~}~~}|~}zy|}{~~|~}|}}}~|}{~~}}~|~}{z|}{}~}~}{|}~~|~~{~~}||~~{y{}||}}~{{~~~|}~{}~~||}~|zz}|{~}|||~~}~~}}~||~~~}}}~|zz||{~~||{}}~~}}||~~|~}|~|zz}}{~~||{}~}~}|}|~}~}|~}zz|}{~~|~|{}}~~||{~~|}}|~}zz|}{~~||{}}~}|~||~~~}~}|~}zz||{~~||{}}~~}|}|~}~||~|zz}}{~}||{}~}~~}}~||~~~}|}~|zz}||~}|~|{~~~~~}}~||~~||}}{z{}||~~}}~||~~~~|}~{}~}}|~}{y{}{}~~}~}{|~}~|~}|~~}}~|~}{y{}|}~|~}{|~~~|~}{~~}~~|~}{z|}{}~|~|{}}~~|~}|~}~~|~}zz|}{}}|~~||}~~~}~~}|~~}}~|~}zz||{}~~|~}|}~~~|~}|~}}~|~}{y{}|}~~|~}||~}~}~}{~~}}~|~}{z{}|}~~|}}{|~~~|~}{~~~}|~~{z{}||~~|}}{|~~~|}~|}~~}|}~|zz}||~~}|~||~~~~~}}~~|}~~}}}~|zz|||~}|~~||}~~~~}~}|~}}~|~}{z|}{|~~|}}||~~~|}~|~~~}|}~|zz}|{~~}|~||~~~~}}~||~~~}~}|~}zz||{}~}|~||}}~~|~}|~}}~|~}{y{}{}~~|}}||~~|~~{~~~}|}~|z{}{|~~}}~||~~~~|}~|}~~}}}~|zz}|{~~}|~||~~~~}}~||~~~}}}~|zz}|{}~}|||~~}~~}|~||~~}}}~|zz||{}~}|~||}}~~}|}|~}~}|~}zz||{}~}|~|{}}~~~|~}|~}~}}~}zz||{}~}|~|{}~~~}|}|~~}~}|~}zz||{}~}|~||~}~~}|~~||~~~}}}~}zz||{}~}|~||~}~~}}||~~}|}~|zz}|{~~||~||~~~~}}~|}~~~}|~~|z{}{|~~|}}||~~~~|}~|}~~}|~}{z|}{}~~|}}|}~~~|~}|~~}}~|~}{z||{}~~|~}|}~}~|~}|~}~~|~}{z|}{}~~|~}|}~~~~|~}|~}~~|~}{z|}{}~}|~|{}}~~}|~}|~}~~|~}zz|}{}~}|~||}~~~~|~}|~}~~|~}{z||{}~}|~}|}~~~|~}|~~~~|~}{z{}{}~~|}}|}~}~|~~|~~~}|}}{z{}{|~~||}||~~~~|}~|}~~}}}~|zz}|{~~||~~||~~~~}}~||~~}}|~}zz}|{}~}|~||}}~~}|~~}|~~~|~}{z||{|~~|}}|}~}|~~|~~~}|}~|z{}|{}~||~||~~}~~}}~|}~~}~}~}zz||{}~}|~||}}~~~|~}|~~~~|~}{z|}{|~}|}}|}~~~~|}~|~~~}|~~{z{}{|~~||}||~~~~~|}~|}~~}}}~|z{}|{}~}|~||~~}~~}|~|}~~}}}~}zz}|{}~}|~~||~}~~}}~||~~}}}~}zz}|{}~}|~||~~}~~}|~~}|~~}~~}~}zz||{}~}|~~||}}~~~|~}|~}~}|~}zz||{}~}|~||}}~~}|~}|~~}}}~}zz||{}~}|~~||}}~~}|~}|~~}}}~}zz}|{}~}|~~||~}~~}|~~||~~~}}}~|zz}{{}~||~||~~~}~|}~|}~~}|}~{z{}{|~~||}||~~~|}~|~~~~|~}{z||{|~}|}}|}~~~|~}|~~~~~|~}{z||{|~}|}~}|}~~~~|~}|~~~~}~}{z||{|~}|~}|}~~~~|~}|~~~~}~}{z||{}~}|}~||}~~~~|~}|~}~~|~}{z||{|~}|}}|}}~~~|~}|~~~}~}{z||{|~}{}~||}~~~~|~}|~~~~|~}{z|}{|~}|}}|}~~~~|~~|~~~~}~~{z{}{|~~||~}||~~~}}}~|}~~}}}~|z{}|{}~||~~||~~}~~}}~~|}~~}~}~}zz||{}~}{~~||~}~~}|~}|~~~|~}{z||{|~}|}}|}~~~~|}~|~~~~}}~|z{}{{}~||~~||~~~~~}}~|}~~}~}~}{z||{|~}{~||}}~~~|~}|~~~}~~{z|}{|~}{}}|}~~~~~|~}|~~~~|}~|z{}{{}}||}||~~~~|}~|}~~}}}~|z{|{{}~||~~||~~~~~}}~~|}~~}}}~}z{}|{}~||~~||~~}~~}|~}}~~~~}~}zz||{}~}{~~||~}~~}|~}|~~~~}~}{z||{|~}{~~||~}~~}|~~}|~~~~}~}zz||{}~}|~~||~}~~}|~}|~~~~}~}zz||{}~||~~||~~}~~}|~~}}~~~}}~}zz||{}~||~~||~}~~}}~~}}~~}}}~|z{}{{}}||~~||~~}~}}~|}~~~}~~|z{}{{}}||}||~~}~|}~|~~~~}~}{z|}{|~}{}~}|}~~~~~|~}|~~~}~}{z||{|~}{}~||}}~~~|~}|~~~~}~}{z||{|~}{}~||}~~~~|~}|~~~~}~}{z||{|}}|}~||}}~~}|~}|~~~}~}{z||{|~}{}~||}~~~~|~}|~~~}~}{z||{|}}{}~}|}~~~~~|~}|~~~}~}{z||{|}}{}~}|}~~~~~|~}|~~~~}~~|z{}{{}}||~}|}~~~~|}~|~~~}}~|z{|{{}}||~~||~~~~~}}~~}}~~~~}~}{z||{|}|{~~||~}~~}|~}}~~}~}{z||{|}}{}~}|}~~~}~|~~|~~~~}}~|z{}{{}}||~~||~~}~~}}~~}}~~~~}~}{z||{|}}{}~||}}~~~|~}|~~~}~~{z||{{}}{}~}|}~~~~~|}~|~~~~}~~|z{}{{}}||~}|}~~}}}~|~~~}}~|z{}{{}}||~~||~~}~~}}~~}}~~~~}~}z{||{}}|{~~||~~}~~}}~}}~~~~}~}{{||{|}|{~~||~~}~~}|~}}~~~~}~}{z||{|}}{}~||~}~~}|~}}~~~}~}{z||z|}|{}~||~~}~~}|~~}}~~~~}~}zz||z|}|{~~||~~}~~}}~}}~~~~}~}z{}|{|}|{~~||~~}~~}}~~}}~~~}}~|z{|{{}}||~}||~~~}~}}~}~~~}~~|z{}{{}}{|~}|}~~}~|}~|~~~~}~~{z||{{}}{}~}|}~~~~~|~}|~~~}~}{z||{|}}{}~}|}~~~~~|~}|~~~}~}{z||z|}|{}~||}}~~~|~}}~~~}~}{z||{|}|{}~||~}~~}}~}}~~~}~}{z||z|}|{}~||}}~~~|~}}~~}~}{z||{|}}{}~||}~~~~~|~}|~~~}~}{z||{{}}{}~}|}~~~~~|~~|~~~}~~|z{|{{}}{|~}|}~~}}}~|~~~}}~|z{}{{}}||~~||~~}~~}}~~}}~~~~}~}{{||{|}|{}~||~}~~}}~}}~~}~}{z||{{}}{|~}|}~~~~~|}~|~~~}}~|z{}{{}}||~}||~~}}~}}~}}~~~~}~}{{||z|}|{}~||~}~~~|~}}~~}~~{z||{{}}{|~}|}~~~}~|}~|~~~~}~~|z{}{{}}{|~}|}~~}}|}~}~~~}}~|z{}{{}}|{~~||~~}}~}}~~}}~~~~}~}{{}{z|}|{~~||~~}~~}}~~}}~~~~}~}{{||z|}|{}~||~~}~~}}~}}~~~~}~}{{||z|}|{}~||~~}~~}|~}}~~~~}~}{{||z|}|{}~||~}~~}|~}}~~~~}~}{{||z|}|{}~||~~}~~}|~}}~~~~}~}{{|{z|}|{~~||~~}}~}}~}}~~~}}~|z{}{{}}||~}|}~~}}}}~}~~~}~~|z||{{}}{|~}|}~~~~}~|}~}~~~}~~{z||{{}|{|~}|}~~~~~|~}}~~}~}{z||z{}|{}~||}}~~~~|~}}~~}~}{z||{|}|{}~||~}~~~~|~}}~~~}~}{{||z|}|{}~||~}~~}|~}}~~}~}{z||z|}|{}~||~}~~~~|~}}~~}~}{z||z{}|{}~||}}~~~~|~~}~~}~~{z||{{}|{|~}|}~~~}~|~~}~~~}~~|z||{{}}{|~}|}~~}~}|}~}~~~~}~|z{|{{|}|{~}||~~}}~}}~}}~~~~}~}{{||z|}|{}~||~~}~~}|~}}~~}~~{z||{{}}{|~}|}~~~}~|}~}~~~}}~|{{}{{|}|{~}||~~}}~}}~~}~~~~~}~}{{||z|}|{}~||~}~~~~|~}}~~}~~{z||z{}|{|~}|}~~~~~|}~}~~}~~|z{|{{}}{|~}|}~~}~}}}~}~~~~}~}{{}{z|}|{~~||~~}}~}}~~}~~~~~}~}{{|{z|}|{}~||~~}}~}}~}}~~~~}~}{{||z|}|{}~||~~}~~}|~}}~~~~}~}{{||z|}|{}~||~}~~~}|~}}~~~}~}{{||z|}|{}~||~~}~~}|~}}~~~~}~}{{||z|}|{}~||~~}}~}}~}}~~~~}~}{{}|z|}|{}~||~~}}~}}~}}~~~~}~}{{|{z|}{{~}||~~}}~}}~}~~~}~~|z||{{}}{|~}|}~~~}~}}~}~}~~|z||z{}|{|~}|}}~~~~|~~}~}~~{{||z{}|{}~||~}~~~~}~}}~~}~}{{||z{}|{}~||~~}~~~~|~}}~~}~}{{||z|}|{}~||~}~~~~}~}}~~}~}{{||z{}|{}~||~}~~~~|~}}~~}~~{{||z{}|{|~||~}~~~~|~~}~~}~~{{||z{}|{|~}|}}~~~~|~~}~}~~|z||{{}}{|~}|}~}~}}}~}~~~~~~|{{}{z|}{{~}||~~}}~}}~}~~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~~}~~{{||z{}|{|~}|}~~~~~|}~}~~~~~|{{|{{|}{{}}|}~~}}~}}~}~~~~~}~}{{||z{}|{}~||~~}~~~~|~~}~}~~|{||z{}|{|~}|}~~~}~|~~}~~}~~|{||{{|}{|~}|}~~}~}}}~}~~~~~~}{{|{z|}{{}}||~~}}~}}~}~~~~~}~}{{|{z|}|{}~||~~}}~}}~}}~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~~~~}~}{{||z|}|{}~||~~}~~~}|~}}~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~~~~}~}{{|{z|}|{}~||~~}}~}}~}~~~~~~~}{{}{z|}{{}}|}~~}~}~}}~}~~~}~~|{||{{|}{|~}|}~}~}~}}~}~}~~|{||z{}|{|~}|}}~~~~|~~}~}~~{{||z{}|{|~||~}~~~~|~~}~}~~{{||z{}|{}~||~}~}~~}~}}~~}~}{{||z{}|{}~||~~}~~~}}~}}~}~}{{||z{}|{}~||~}~~~~}~~}~}~~{{||z{}|{|~||~}~~~~|~~}~}~~|{||z{}|{|~}|}~~~}~}~~}~}~~|{||{{||{|~}|}~~}~}~}}~}~~~~~~}{{|{z|}{{}}|}~~}}~}}~}~~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~}~~|{||z{}|{|~}|}~~~}~}}~}~~~~|{|}{z|}{{}}|}~~}}~}}~}~~~~}~}{{||z{}|{}~||~}~}~~}~~}~}~~|{||z{}|{|~}|}~~~}~|}~}~~~~|{||{{||{|~}|}~}~}}}~}~~~~~~}{{}{z|}{{}}||~~}}~}}~}~~~~~~~}{{|{z|}{{}}||~~}}~}}~}~~~~~}~}{{||z|}|{}~||~~}~}~}}~}}~~}~}{{||z{}|{}~||~~}~}~~}~}}~}~}{{||z{}|{}~||~~}~}~}}~}~~~~}~}{{|{z|}|{}~||~~}~}~}}~}~~~~~}~}{{}{z|}{{}~||~~}~}~}}~}~~~~~~~}{{|{z|}{{}}|}~~}~}~}}~}~~~~~|{||{{||{|~}|}~}~}~}}~}~}~~|{||z{}|{|~}|}}~~~~|~~}~}~~{{||z{}|{|~||~}~}~~}~~}~}~~{{||z{}|{}~||~~}~}~~}~~}~}~}{{||z{}|{}~||~~}~}~~}~~}~}~~{{||z{}|{}~||~~}~}~~}~~}~}~~{{||z{}|{|~||~}~~~~}~~}~}~~|{||z{||{|~}|}}~~}~|~~}~~~~|{||{{||{|~}|}~}~}~}}~}~~~~}{{}{z||{{}}|}~~}~}~}}~}~~~~~~}{{|{z|}|{}}||~~}~}~}}~~}~}~~|{||z{||{|~}|}~}~}~}}~}~~~~}{||{z|}{{}}|}~~}~}~}}}~~~}~}{{||z{}|{}~||~~}~}~~}~~}~}~~|{||z{||{|~}|}~~~}~}~~}~~~~|{||{z||{|~}|}~~}~}}}~}~~~~~}{{|{z|}{{}}||~~}}~}}~}~~~~~~}{{}{z|}{{}}||~~}~}~}}~}~~~~~~}{{|{z{}|{}}||~~}~}~}}~~~~~}~}{{||z{}|{}~||~~}~}~~}~~~~~~~}{{||z{}|{}~||~~}~}~}}~~~~~~~~}{{|{z{}{{}~||~~}~}~}}~}~~~~~~}{{|{z|}{{}}||~~}~}~}}~}~~~~~~}{|}{z||{{}}|}~~}~}~}}~}~~~~~|{||{{||{|~}|}~}~}~}}~}~~~~|{||z{||{|~}|~}~~~~}~~}~}~~|{||z{||{|~||~~}~}~~}~~}~~~~{{||z{}|{|~||~}~}~~}~~}~~~~{{||z{}|{}~||~~}~}~~}~~~~~~~{{||z{}|{|~||~}~}~~}~~}~}~~|{||z{||{|~||~}~}~~}~~}~~~~|{||z{||{|~}|}}~~}~}~~}~~~~|{||{{||{|}}|}~}~}~}}~}~~~~}{||{z||{{}}|}~~}~}~}}}~~~~~~}{{|{z{|{{}}||~~}~}~}}~~~~~~~|{||z{||{|~}|}~}~}~}}~}~~~~}{||{z||{{}}|}~~}~}~}}}~~~~~~{{||z{}|{|~||~~}~}~~}~~}~~~~|{||z{||{|~}|}}}~}~}~~}~~~~|{||{z||{{}}|}~}~}~}}~}~~~~}{||{z||{{}~|}~}}}~}}~}}}}}~~|z{|{y{}|z|}|}~}||~~}~~}}||}}}~}{|}|}}}}}}~}|}~}~{~~|~~}~~|zz|{{|yz~}|~~~~~~{|~}}~}{|}|yy{{z{|{|}|{{}~~~}|}{{}~~~}{|~}}}}~}}}}|}~~~}{~|~~~}~~|zz|{{{xz}}~~~~~{|~}}~|||||yy{{z{|{|}{{|}~~}~~|||}~~|{|~}}}}~~|}~}}}~~}||~}~~~}~~}{{{||{zy}~}}~~~~~~}|}~}~}||}|zzz{z{||||}{|}~~~}}}|||}~}{||}}}}}~~~}}}~~~~||}~~~~}~~}{{|||zyz}~}|}~~~~~}}}~}~~|||||z{{{{{||}||||}~~~}}~|||}~~}{{|}}}}}~~~}}~~~||}~~~}}~}|{|||zyz}~}|}~~~~~~}}}~~~~}||||{{{{{{|||}}|{}}~~~~}~|||}~~~|{{}}}}}}~~}|~~}||~~~}~~}|||}{zyz~~}|}~~}~~}}~~~~|||}||z{{{{|||}}|||~~}~}~~}|{}~~}|{{~}||}}~~|}~~~}||~~~}~}|{}}{zyz~~}||~}}~}}~~~~~~}||}|}|z{{{||{|~}|||~}}~}~}{|~~~}{z|}}|}}}~}|}~~}~}||~~~}~~}{|~|{zy{~}{|~}}}~~~~~~|{|}}}{{|{{|{{~~|||}~}~}}}|{}~~}|z{}}||}}~}|}}~}||~~~~}~~||~}{zyz~~}{{~~}}~}~~~~~~|{|}}}{{|{{|{{}~}|||~|~~}}}|{}~~}|z{}}||}|~}|}}~}||~~~~~~~||~}{zy{~~|{{~~}}}~~~~~~~|{|}}}{{|{{|{|~~|||}}}~}~~}|{}~~}{z|~}|||}}}|}~~~}|}~}}~~}|}}|zzz}~}{{}~}}~~~~~~~~~~}{|}}}||{{{|||}~}||}~~}~~}~~}||}}~|z{|}}|||}}}}}~~||~~}}~~}|}}|zz{}~~}{{}~}}~~~~~~~~~~}||}}}|||{{|||}~}||}~~}~~}~~}||}}}|z{|}}|||}}|}}~~||~}}~~}|}}|zzz}~~}{{}~}}~~~~~~~~~~}||}}}|||{{{|{}~~||}}}}~~}}|}}}}{z{}}||||}}}}~~}}}~}~~~|}}}{zz{~~~}{{}~}}~~~~~~~~~~}{|}}}}||{{||{}~~||}}~}}~~}}|}~}}{z{}}||||}}|}~~}}|~~~~~||~}{zzz~~}{{}~}}~~~~~~~~}{|}}}|{|{{||{}~}|||~~}}~}}||}~}}{z|}|||||}||}~~~}|}~~}~~|}~}{zy{~~~|{{~}|}~~~~}~|{|}}}|||{{|{{~~}||}~}~~~~}|}~}}|z{}}||||}}|}}~}}|~~~~~~||~}{zy{~~}{{}~}}~~~~~~~~~|{|}}}|{|{{|{{}~}|||~}~~~~~}|}~}}|z{}}||||}}|}}~}}|~~~~~~||~}{zy{~~|{{}~}}~~~~~~~|||}}}|||{{|{|~~|||}~}~~}||}~}}{{|~}||||}||}~~}}}~}}~~}|}}|zzz}~~}|{|~}}~~~~~~~~}||}}}|||{{{{{}~}||}~~}~~~~~}||}}}|{{}}}||||}|}}~~}}~~}}~~}}}}{zz{}~~}{{}}}}~~~~~~~}||}}}|||{{{{{}~}||}~~}~~~~~}||}}}|{{}}}|||||||}~~}}~~}}~~}|}}|zzz}~~}|{}}}}~~~~~~~~}||}}}}||{{{{{|}}||}}~~~~}}|}~}}{{|}}}|||}||}}}}}~}~~~}}}}{zz{~~~}{|}~}}~~~~~~~}||}}}}||{{{{{|~}|||~~~~~~}}|}~}}{{|~}||||}||}}~}}}~~~}~~||}}{zz{}~}|{}~}}~~~~~~~~}||}}}}||{{{{{|~}|||~~~~~}||}~}}{{}~}||||}||}~~~}|}~~}~~}|}}|{zz|~~~}{|~}}}~~~~~~~~~||}}}}|||{{{{{}~}||}~}~~~~}|}~}}|{|}}}}||}||}}~~}}}~~~}~~||}}{zy{~~}|{}~}}~~~~~~~~|||}}~|||{{{{{}~}||}~~~~~~~}|}~}}|{|~}}}||}|||}~~}}}~~}~~~||}|{zz{~~~}||}~}}~~~~~~~||}}}}|||{{{{|}}|||}~~~~}||}~}|{{|~}}||||||}~~}}~~}}~~}|}}{zzz}~~}||}~}}~~~~~~~~~}||}}}}||{{{{{|}}||}~~~~~~~}||}}}|{|}~}}||||||}~~}}~~}}~~}|}|{zz{}~~}||}}}}~~~~~~~~~}||}}}}||{{{{{}}}||}~~~~~~~}||}}}|{|}~}}||||||}~~}}~~}}~~}|}}{zzz}~~}||}}}}~~~~~~~}||}}}}||{{{{{|}}}|}}~~~~~}|}}}}|{|}}}}||||||}~~}}}~~}~~~}|}|{zz{}~~}||}~}}~~~~~~~~}||}}}}||{{{{{|}}||}~~~~~}}|}~}}|{|~}}}||||||}~~~}}}~~}}~~||}|{zz{}~~}||}~}}~~~~~~~}||}}~}||{{{{{|}}|||~~~~}||}~}||{}~}}}|||||}}~~}}}~~}~~}|}}|{zz|~~~}||}}}~~~~~~~~}|}}}}|||{{{z{}}}||}~~~~~}|}~}}|{|~~}}||||||}~~}}}~~}}~}||}|{zz{}~~}||}}}}~~~~~~~~}|}}}~|||{{{z{|}}||}~~~~~~}|}~}}|{|~~}}||||||}~~~}}}~~}}~}||}|{zz{~~~}||}}}~~~~~~~~}|}}}}|||{{{{{}}}||}~~~~}}|}}}|||}~}}}|||||}~~~}}~~}}~~}|}|{zz{}~~}||}}}}~~~~~~~}|}}}}}||{{{z{|}}||}~~~~~~~}|}}}}|{|}~}}||||||}~~}}}~~}}~}}|}|{zz{}~~}||}}}~~~~~~~~~}|}}}}}||{{{z{|}}||}~~~~~~~}}}}}}|||}~}}||||||}~~~}}~~}}~~}|}|{zz{}~~}||}}}}~~~~~~~}|}}~}||{{{z{|}}}|}}~~~~}}}~~}||}~~}}|||{{|}~~~~}~~~~~}}}|{yyz|}}|{{|}}~~~}||{zzzz{}~~}~~~~~~~~~~}{zzzzzyyz|||}~~~~~}~}}}}~~~}}||{zzz{|~~|{z{{zyz{{{{{{{{|}~||}|{|~~~~~}|{{|{zyz|}|||||{{zyz{{yxwwxxxy{|}~|{{|~~~}|{||||}}}}|{zzyxxy{{{zz{}}~~}|||{|{{zzzzz{~~~}|{z{}~|{{||||}~}}~}||||}|||{{zzz{{}~~|||||{{}~|{zzzzzyxyz{{|}~~~~~~}|{{|}~~~}||}~}{yy{}||}}}}~~~~}|||||{z{{{|~~~~~~}}~~}~~|{{{zzzz{|||~~~~}}}}|~~~~~}~~~~~}|}|{zzywutuwyyzyxy{}~~~}~~~}~~~|{|~~}~~}}~~~~~~}}~~|||{|}}{ywxyyxxxxyz|~~~}}~~~~}|{{zyxxz||{zzzyxxy{{zzzyyz|~~~~~}|}~}|{{{{{zyyy|~~~}|{{{{yyz{zxwwxyxxz{|}}{zz|}~~}||}}|||}}{{{zywxz|}|{|{|}~~|{{|~~|||{zz}~||}|zz{|}}}}}}}}}}}~}~~~}~}||}}|{zyzzz|~~~||~~}{|~~}}|{z{zyyz}}}|}~~~}{{|||}~~}}~~|zzz|}|}}||}~~~}}}|{z{{||{|}}}~}|}~~~}||}{zzzz|~~}~~}}}|}~~~~~~}~}~}}}|||{yxwvvwwy{{yy{}}}~|{|~}~~}|{{}~}}~~}||}~}}~}}~~~||}|{|}~|zzz{{zzyxxy}~~}}~~~}~~~|{{zxwwy{|}}{zyz{||{||zyz|~~~~~~~~}}||}}||}}|z{zxxy~~}{z||{{{zzyyz{zxxyyy{~}}}|{zzz|~}}}|{{}~}~}|zxxz{}|}}|{|}zz|}}}}|{{|~~||}|||{zy{}~}~~}}~}||}|{zyzzz{}}}}~}}}|}}||{zyz}}|}}}~~}||{zz|~}||}}|{}}{{|~}}|}}{yz|~}{{||}~~}||~~}~~|{{zy{~~~~~}}}|~~~~~~~~|}||}~~}~}{yxyzzxvxzzz{~~|{|~~}{{}~~|{|}~~~}~~}|{{{|||~}~~~~~}}}|}~}}}}~~~{{|zxxz~|}~}~~~}}}|}~~|{zzxwyz|~}{z|~}|}}{z{~~~~~~}|||~~||~||~~~}}~~|z{zyy{~||~}}~|zyz|}}{yyxxy|~~~}|}~|{{{z{~~~}}}|~~{yz{}}|}~}}}}~}{{|}}}~}||}}~~~||}}}~~{yy|}~~~~~}~}||||{z{{{|||||~~~}||~~~~~}}|zz{~~~|{}~~~|{zz{~}}~}{|}||}~||{{}}z{|}}{z{zz|~}|{|}}~||{zz|~~~}}}~~~~}}}~~}}}{{|~~~~|yy{||ywxyy{||{{}~~|{|}~}{|}~~|~}|}~}{{z{}|}~}~~~}}}||~~~~}||}|}{zy|}{|}~~~~}~}}|{{}}|{{zyzzz}~~|{}~}}~~}}~~~}|z|~~~}{{}~~~~||{zz{}~~~~~{y{}|{{yxx{~|}~~|z{}|}~}}~}}}}~{||}}{|~~~~~}}|}~~}~||}}~{{}}||~~||}}}~~~~{z{}~~~}~}~}|{|||}~}~~|zz}~~~|{{~~~}}|}~~|{|}zz|~}~~|{zz|~~~{{||}~}}{z|~~|}}}|zz{zyz~~}|{{|~~}|zy|~}{{~~}|||}~~|}}|{z|~~~|}~~{{|}~}zyyxx{~{{|}}~~~}~{{~~|{|}~~}{y{|}~~||~~~}}~{z}~|{}~~}|{|}}}~~}|}}|}~}{z{~}||{{|||}~}||~~~~~~}~~~~}{|}}~~}|{{|}~~~~~~~}|||{{}~~}~~{{|~}}|zyy~~~~~~{|~~|}~}{{|}~~}}~~~~~}~~~~}zz}}~~|~~}}}~}}~}~~{z||||~~~||}~~~~~~~||}~~}~~}~~~~}}~}||||~~zy|~~~}|{}~~~}}~}}}}||~~}|}|{|~~}~~{z|}|||{|}}}~~~~~~}{{}~~}}zy{{zy{~~}|{|~|zz~|z{}}{{|~~|{~~~|{z}~||}}||}~~|{{{yxz}|||~~{z||}~~}||}~~{z{}~|z|~~~}}~}{{|~~{{~~}||zz~}}~}{|~}{{~~~}}|{|~}{{~}~~}~}|~~~}~~}{|~~||~~}}||}~~~}|}~~~~~}}}|{{~}|}~~|}~~}}~~|{|~||~}}~}~~{{~~{|}}}}{{|}~~}}}~~}~zy{||}}}~~~}~|z{{{{}}z{}}{{}~~|}}{|~~}~|{|}}|{}|z|}~~~|{}}{{}}|}}}|~~~~~}~}}}~~||}~||}~~}}{z{}|}~~||}~}}zyzzzz}~}~~~~||~~|}|{{|~|{{{}~{{~}{|~{z|}~~}}{{}|zy}~~~~}~}||{z|~|~}}}~~~}||}~|z|~~~~~~}~}|}}~~{|~~~}~~{yz}~||}~~{|~~}~~}|}}~~~|{}~~z{~}~}~|{}~|{|||~~{|~}}~~~~}}~~}||}}~~}~}|z|}~~||}}~~~}{~}}~{z|}}~}}~|{}~{{|||}|{|}~||~~}~|z{{{{~~~~~~~}z{|{z|~zz|~~{z{~~|}~{{}}}}|z{}}{|~|}~~~|}}{}~{{|~~||}|}~~~}|~}}~~{{|~~~~}~~}{z}|}~~~}~}|~}zzzyy|~}}~}~~}}~~}||}}}|z|}{}~~|}~~zy{}~}}z{}|{{}~||}}|zz~||~~~~~}~~~~~}{|~~}|~~~~~}|}~~}}~}}~}~~|zz{~~}}||}|}~}|}~~}~~}|}~||~|{}}}~~~|{}~~~}|{|||{z}}|}}|}}|~~}|}||~}}~~|{~~|}~~}||}~|z|~~~~|z{|}}}}|~~}~~~}{||{z{}}}}}|}}}~~}|{yz}~}~~}~}}{{|{z{}{{}~|z{|~~||~|{||||{z{}}|}~}zz}~~}~|{|}~}|{{~}|~|}}}~|z{}}|}~~~}|~}~~~|{~~}|zxx|~}~~}~~~~}~~~~~|{|~}}~~~|{~~~~~{z{}~}}{z||{|~~~~~~}{}~|z|}}}~~}~~~}{z}~~{{}~~}~||}~|{}~~~|}}|||~~}}{{}~}~}{|}}|~~}~~~}}~}|~~~||~~~~~}}~}~}}~{z}~|||zy}}}~~||}~}}||}}||}~~|}~}|}~}~~~|{}~~{z{|}~|}}{{{|}}}|}~~|z{||{z~}~~~~}}}|}~~|zy|~||}|}|{}}||{z{}|}~~|{{|}~~}|~}|||{|~|{|~~~~{yz|}~}{|}}{z|~}{}~~}}}}~}{{}~}{|~~~}|{}~}}|{}~}~}zxz}~~~}}}}~~}~~~~~~~}}}}~~~}zz|~~~}|{}~}~}}|{{{{}~~~}|}~~|}~~|~~~~}}~~}}~}}{y{}|z{|}}~}{|~~~}zz|}}}}}~~~~~}|{|~}{{||{}~}}~}|~~~~}}~~|{}}}}}|}~~}}}|{}~~}{z{~~}||}~|{{}}|}~}|}}|}~~~}|}~~||{z{||~|||}~~}|}}~|yy{{{{}}~~~}|}~}{|}{|~}||}}z{~}|z|}{{|}~~}~~~||}|{{~}~~~}{zzz{~|~}}}~~||}~~{|~~~~}}~}|}~{z|~~~~~~{{}~}|}~|{}~~}|}~|{|~~}}~}|}}|}~~~}}~~~~~}zzz{}~}~~}~~~}|}}~~}}|{z{~~|{|}}~~~~}~~}{|~~|}}}}|yz|~~|zz{{|~||}~}~~~}zz{{|~~~~~}|}}~}{{{{{|||}}||~~~~~||~}{{|||}|{|}~}|~}}}}~}~~|{}~||}~}{{{||}~~}}}||~}}~~~}~~~}|{z{~||~~~~~~}}~}}{yyzz{~~}~~}~}}}~~~~}~~}|}~}|{}~{{}~}||~{z{|~~~}{{||{{~~||~|{zyz}}}~~~~~}~~}||}~~}~~~~~}}}~}{|}~~}}~~~~|{{}~|||}}{|}~~|||}}}~~}~~}|}~||}~~~~|}~~~}|}|zzzz|~~~~~~~~}}||}~}}}|z{~~~|{{|~~}{|}|{|~}|||}~|{||}|{{{zz|~}}~}}}}~~|zzz{~~~~~~~~~~~{{{{z|~||~~||}~~|{}~~|z{{{||{{}}|}~~}{{}~~}~}||}~~|{z{|~~|}~~}|}~~||~~~}|~~~}|{|~~~}||~}|{yyz~}|}}}}~~~}~~~~~~~}|{}}}}~}}}~~~{z{}~}}~{{{{{|~~~~~|{|~}|zy{~}~~~~~~}|{|}~~||}~~~}|}~~~}}}|{|}~~~}||~~}||}|}~~}{{|||}~~~~}~~}||}~~}}}~~~~}~}}~|z{~}|{zz{~~~~~~}}}}||}}}}}||~}~}{{|~|z{|}~~||}~}|||~~~}}|zz{{zz|~}|||}}|zy{}}~~}|}~~}|}~|{{z{~}~~||}~|{|}~}|{zzz|~|{|~~~~~}zz{}~~~||}~}|{{|~~|{}~}~~}||~~|{|~~~~}|}~}}~~}||}~}}{yy|~||||}~~~}|~~~~~~}||}~~~~}|{|~}|{|~~}~~}~|{{{{|~~}}}~}{|}~~}|{|~~}}~~~{z{}~~|{{}}~~||}~~~}{zz{|}~~~~}}~~}||~~~~}{{{|||~~~~~~~||}}}}||}}~~}~~||}~~{z{}~}|{{}~}~~||||||}}}}}}~~~}{|}~}{{{{}~}~~}}~~}||}~~~}{yyzzz|~}|||}}{z|}|}}{{|~}{|~~}{{|~}||}~~|}}}}{{{zzz}}}}~~}zzz{|~}}~}|||}~}{{}~~~~}||}|z{}~~~~~~~|{}~}}~}{{}~~}~~}|{}~}||}~~}{{}~~~~~~~}~~~}~~|{{|}~~}}~~}}}~~}||{z{~~|{|}}}}}}}}}~~}}~~~~}}}}~}zz{}}|{{{|}}|}~~~}}~~}zyzz{}~~~~}~~~|z{{{|~}}}}~~|{|}}}{z{||}~||}~}||}|{{|}}}~~}|}~}}~|{{||}~~~~~}}~~~~~~~}}}~~~~~~}|{z{~~}~}}~~}~|zyyzz|~}}|||}~~~}}~}|}}|{{}~|{|~~||}||}~~}}~}|{z{zzz}~~~~}}}{zyz{~~}}}~}|{{}~~~~~~}}}}{z{|}}}~~~~~|{}~}}~|{|}~~}}~~}}~~}||}~~}{z{}~~~~~~}}~~~}}}~}|{{{}~~~~~~}}|}~}}||{{~~|{{|~~~~}}||}~~~~}~}||}}|{{|||{{{{|~~}}~~}||}}~|zyyz{~~}{{{{{}~}~~}}~}{{|}}|zz{{|~~|||~~}|}~~|||||{|}~~}~}}~}|{{|}~~}~~~}~~~}}~}}}}|}~}}|{{}~~~~~}|}~|{zyz{~}|||||}~~~~~~~}}~~}{{{}}|}}~~~~~~|||}~~~~}{zzzz{}~~~~~|{|~}|{zz{~~~~}|{{|}}}|}}~~}}}}~~}|||{{{|}~~}||}}}}}~|}}}|||}}~~}}}~~~}{z{|}}}}}~~~~~~}}~~}{{|~}||{{}~~}}}||}~~}}}||~~~~|{{|}~~}{{{|}~~}~}}|}~~}}||{z{{{{}~~~}|{|}~~~}{zyz}~~}}}~~}}}|{{{}~~~}}~}{{|}|{zzzz{~}||}~}}~~}}}|{zz|}~~}}~~}|{|}~~}||~~||}~}|{z|~~~}||}~|||~}|{zz{~}||||}}}~~}}}~~~~~~}|{|}~~~~}}|}~}|}~~~~~|{zzz{}~}}}~~}{|}~~}|{z|~~~~~}{z{|}}|||}}~~}}}~~~~~}}|{zz{|}}}}}~}}~~}}}|{{|}}~~~~~~~}|z{{||||}}}~~~~}}}~~|zz|~~}}||}~}}|||}}~~~}}}}~~~|{{|}~|{{{|}~~~}}}}~~~~|{zz{{{}~}|{{|}~~}|zz|~~~}||~~}|}}|{{}~}}~~~}|||||{zzyz{~}|}~~~~~~~~~~~|zyz{|~~~~~}||}~~~}||}~|||~~|zz{|~~~~~}}~~}~~~}{|}~~~}|{{}}||||}}}}|{|}~~~~~~~}|||}~~~}||}~~}~~~~~~}|{{z{}~}|||}~}||}}}}}}}||~~}}~}{z{|}|{{{|}~~}}}~~~~~~~~}{yyz{|~~~~~~~~~}{{{|}~~}{{{{{{z{{|}~~}}}~}|}~}{z{|}~~~~}}}~~~}|||}}~~~}~~~}}||}~~~~~|{{{|~~~~~~~~~~~|zzzz{}~}|{{{|}~~~~~~}|}~~}~}|{|}}||~~}}~}}}~}}}}|{zzzzz{~~~~~~~}}}~~}{zyz{}~}}}}~}|||}~~~~}|||}|zz{||}}~~~~}|}~~~~}|||}~~}~~}}}~~}||}}}}|{z{|~~~~~~~~~~~~}}}}}}~~|{||~~~~}}~~}||{{{}}|{{|~~}}}}|||}}}}~~}}}~~{{{|||{{{|}~~~~~}}|}}~}{zyyz|~~~~|{{{|}~}|{{{{{zzz{|}}||}~}|}~~|{{{||}}~~~~~~~||||}~~~~~~~~~~~~~}}|||||~~}|{{{}~~~~~~~~~|{zz{|~}||{{||}~~~~~~~~~~~~~~}|{|}~}|}~~~~}}}~~}}}}|{zzzz{|~~~~~~}||}~~}{zzy{}~}}}||||}}}}}~~}}|}}~}{{{{{{|}}~~}|}~}~}||}}}}}~~~~}}}}}}}|zzz|}}}}}~~~~~~~~~}|{{}~~}|||}~~~}}}~~}}|||}~~|{{{}~~~~}}|{{|}~~}}}~~}|||{{{{{|}~~~}||||}~~~~|{zyz|~~}~~~~~||{{}~~|{{{{{zyyz{|}||}~}}}~}|||{zz{}~~~~~|||}~~~~}}~~}}~~}{zz|}~~}}||}~~}|}~~|{{z|~~}||||||}}}}}~~~~~~~~}|{|}~~}}}}}}~}}~~~~~}|{{zzz{}~}}}}~}|{|}~~}||{z{}~}|{{|}}}||}}~~}}}}}~~~}|{zzzz|}~~}}}~~~~}}}}|||}~~~~~~}}{zzz{|||}}}~~}}}~~}{z{|~~}}||}~~}}}}}~~}}}}~~~}|{{|}~~~~~}|{{{|~~}}~~~}||{{{{||~~}|{{{}~~~~~}|{z{|~}}}~~}}~}|||~}|{||{zyyyz{}~}||}~~~~~~~~}}}|zzz{|~~~}|}}~~~}}|}~~}|}~~|zzz|}~~~~}}}~~~}||}~~}|{|~~}|||||||||||}~~~}}~~~}|||}~~~~~}}|}~~~~~~~~~}|{{{{{}~~}|||}~~}|{|}}}}}|{{|~~~~|{{|}}||||}~~~}}}~~~~~~~~~}|{zyyz{}~}}~~~~~}||||}~~~}|{zzzz{{{|}}~~}}~~}}}~~|zz{|}~~~~}}~~}}}}}~~~}~~~~~}||||}}~~~~~}|{{{|~~~~~~|{zz{|}~~}|{{{|}~~~~~~~}|||}~~~~|||}~~}|}~}}~~~}||||{zyyyz|~}}}~~~~}}}}~~}|zzzz|~~}}}~~}}|}}~~~~~}|||~~|zzz{||}}~~~~}~~~|||}~~~~~~}}~~}}|}}|||{z{|}~~~}}}~~~~}}}}}}~~~~}||}~~~~~~~}||{{|~~|{{{}~}||||||}}}}}~~~~~|{{|||||||}~~~~~~~}}}}}~~~~~}{zyyz{~~~~~~}||||}~}|{zzzzzzz{|}~}|}~~}}}~~|{z{{|}}~~~~~}|}}~~~~~~~~~~}||||||}~~}||{{|~~~~~~}{{z{|}~}|{{{||}~~~~~~~~~~~}}~~~~~|||}~~}}}~~~~~~}}}}|{zzzyz{}~~}~~~~~}||}~~~}{zzz{}~~}}}}|||}}}}~~~}||}~}{zzzz{{|}~~~}}~~~}||}}~~~~~~~~}}}}}||{zzz|}~}}}}~~~~~~}}||||}~~}||}~~~~~~}}||||~~}{{{|}~}}|||{||}}~~~~~}|{|||||||}~~~~~~}||||}~~~~~}{zyyz|~~~~}|||}~~}|{{{zzyyyz|}~}||}~}}}}~~}{{{{{{|}~~}|}~~~}}~~}~~~}|{zz{}~~~}}|||}~~~}~~~|{{{|~~}||{{{||}}}}~~~~~}}~~~~~}|||}~~}}}}}~~~~~}}}}|{{zzz{}~~}}}}}~}|{{|}~~}|{zz|~~}||||}}}}}}~~}}||}~~~}|{{zyzz|}~~}}}~~~}}}}}}~~~~~~}}|{zyyz{||}}}~~~~~~~}|{{|}~~~}}}}~~~~~~~~}}}}~~~~|{{{|}~~~}}}|{{{|}~~~~~}||{{{||}}~~}|{{{|~~~}~~~~}|{zz{}~}}}~~~~~~}|}~~}|{{{{zyyyz{}}}|}~~}}}~~~~}||{zzz{}~~}}}~~~~}}}~~}}}~~}{zyz{}}~}}}|}}~}}}~~}|||}~~}}|||||||||}}~~~}}}}~~~}||}}~~~~}}}}~~~~~~~}||{{{{|}~~}|||}~~}|{||}}}}|{{|}~||{|}}}}|}}~~}}}}}}~~~}||{zyyz{}~}}~~~~~}}|}}~~~~~}}|zyyzz{{|}}~~~~~}}}~~|{zz{}~~~~}}}~~~~~~~~}}~~~~}|||||}}~~~~}}|{{{|}~~~~~}|{{{||}~~}|{{{{}~~}}~~~~}}||{|}~~}|}}~~}}~~~}~~}||||{zyyyy{}~}}}}~~~~}}}}}}}}|{zzz{}~~}}~~~~}}}}~~~~}||}~}{zyzz{|}}}}}~~~~}|}~~~~}}}~~~}}||||{{{{|}~~~}}}}~~~}}||}}~~~~~~}}|}~~~~}||||||~~}|{{|}~~||{|||}}}}}}}~|{{|}}}|}}}~~~}}}}}}}~~~~~}|{zyyz{}~~~~~}|||}~~~}|{zzzzyzz{|}~}}}~~}}}~~|{zz{|}}~~~~~}}~~~~~~~~~}||{{|||}~~}||{{|}~}|{{{|}~}|{{{{|}~~~}}~~}}}}}}}~~~~}||}~~}}}~~}||||{{zzyz{}~~}}}}~~~~}}}|}}}}|{zzz{}~~~}~}}}}}}}~~~~}||}~~|{zyzz{{|}~~~~~~}}}}~~~~~~~~}}}}||{zzz{|}~}}}}~~~~~}}|||}}~~~~}}|}~~}}||||}~~}|{{|}~~}|||||||}}}~~~}|{|||||}}}~~~~~}}|||}~~~}}~~}|{zyyz|~~~~~~}}|}~~~}|||||}~~~~~~}~~~~~~~~~}}}}~~~~~}}}}~~~~~}}}~~|{zyz{||}}~~~}}}~~}}|}}~~||{{zyyyy{}~}}||}~~~}|||}}}}|{{|}}||||||}}~~}}||{|}~~~~~~}}}}}~~~~~~}}}}}~~~~~}}}}~~~~~}}}~~|zyyz{||}}~~~}|}~~~}|}}~~|||{zyyyyz}~}}}|}~~~}|||}~}}|{{|~~}||||||}}~~}}|{{|}~~~~~}}}}}~~~~~~~}}~~}~~~}}}}~~~~~~~}||}}{yzz{{|}}}~~}|}~~}|}}~~||||{zyyyz}~~}}|}}~~}||}~~}}|{{|~}|||||}}}~}||{{|}~~~~~~}}}}}~~~~~~~~}}~~}}~~}}}}~~~~~~}||}~~|zyz{{|}}}}~}|}~~}}}~~||||{zyyyz}~~}||}}~~}||}~~}}|{{|~}}}}||}}}~~}|{{|}}~~~~}}}}}~~~~~~~~}}~~}}~}}}}~~~~~~~~~|{|}~~{zz{|||}}}~}|}}~~}}~~~||}}{zzyyz}~~~}||}~~}||}~}}}{{|~}}}}||}}}~}||{{|}~~~~}}~}}~}}~~~~}}~~}}~}}}}~~~~~~~~~~~~}{{|~}zz{||{}}}}~~||}}~}}~~~~|}}}{zzyyz~~~|||}~~~}||~}~}{{|~}}~~|}}}}~~~}|{{|}~~~}~}}~}}~~~~~~}~~~}~~~}}}~~~~~~~~~~|{{}~~|zz{|||}}}}}||}~~}~~~~}|}~}{zzyy{}|||}~~~}|}~~}~}{{}~~~~~~~~|}}}}~}}|{{|}~~~}}~}}~~||~~~~~~~}~~~}}~~}}~~~~~~~~~~~}{{|}~~{z{||{|}}}~~}|}}~~~}~~~~~~~|}~~|z{zyz~~~|||}}~~}|}~~~}|{}~~~~~~~|}~}}~}}|z{|}~~}~~}}~||~~~~~~~}~~}}~~}}~~~~~~~~}~~~|z{}~~~|z{|}|{}}}}}|}}~~}~~~~~~}}~~}z{zyy|~~}|||}~~~||~~~~|{}~~~~~|}~}}~~}|z{||~~}~~}}~{|~~~~~~~}~~}~~~~}}~~~~~}~~{z{}~~|z{|}{|~}}~~}|}}~~~~~~~~~}~~|{{zyz~~~~||||}~~}|}~~~|{~~~~~~~|~~}}~}}|z{|}~}~~}}~}{|~~~~~~~~~~}~~~~}}~~~~~~~}~~~|zz|}~~}{{|}{{}}}}~}|}}~~~~~~~~~}}~~{{{yy{~}|||}~}~||~~~}||~~~}|~~}~~}}|z{|}~}~~}}~}{|~~~~~~~~~~|}}}~~~~~~}~~~|zz|}~}{{|}|{}}}}~~|}}}~~~~~~~~~}~|{{zyz}~~~}|||}}}~|}~~~}|}~}~}}~~}~~~}}{{||}~~}~~}}~|{|~~~~~~~~}|~~~}}~~~~~}~~{zz|}~~}{||}{{}}}}~~}|}}~~~~~~~~~}}~~{|{zy{~~}||||}}~}|~~~~||~~}}~~}~~~}|z||}~}~~}}~|{|~~~~~~~}|~~}}~~~~}~~~{zz|}~~}{||}{{}}}~~~}|}}~~~~~~~~~}~}{|{yy}~~~}|||}}}~|}~~~}|~~}~|~~}}~~}}{{||~~}~~}}}{{}~}~~~~~~~|}}}~~~~~~~~~{zz|}~~||||}z{}}}~}~}}}}~~~~~~~~~}~|{|zyz~~~}}|||}}}}|~~~~}|~~~|~~}~~~}|{||}~~}~~}}|{|}}}~~~~}|~~}}~~~~~}~~}{z{|}~|||}|z{}}}~}~}}}}~~~~~~~~~}~}{|{yy}~}~}||||}}~|}~}}|~~}~|}~~}~~}{{||~~~~~~}}~~{{|~~}~~~~~||~~}}~~~~~}~~}zz{|}~|||}|z{}}}~}~}}}}~~~~~~~~}~}{|{zy|~}}||||}|~|}~}~|}}~}}~~}~~~}{||}~}}~~}}}{{}~}}~~~~~|}~}~~~~~~~~|zz{|~~||}}{z|}|}}~~}}}}~~~~~~~~~}~}||{yz}}~~}|||||}~|}~~}}|~~}~|}~}}~~~||||~}~~~~}}~|{|~}}}~~~~~||~~~}}~~~~~~~}{z{|}~||}}|z{|||}~}}}}~~~~~~~~~~}~}||{yz}}~~}|||||}~|}~~}~}}~}~|}~}~~~}|||}~~}}~~}}}{|}~~}}~~~~}|}~~}~~~~~~~~{zz{|~~}|}}|zz|||~~~~}}}~~~~~~~~~}~}||{yz~~}~~}|||||}}|}~}~~}}~~}|~}}~~~}|||}~~}}}~}}}}{|}~}}}~~~||~~~}}~~~~~~}{z{|}~}}}}{z{|||}~}}}}~~~~~~~}|||zyz~~}~~}|||||}}|}~}~~}}~~~|}}}~~~}|||}~~}}}~~}}~{|}~~}}~~~~~}|}~~}~~~~~~|zz{|~~~~|}}|zz{||}~~~~~}~~~~~~~}~~|||zy{~~}~~}|||||}}|}~}}~}}~~~|}}}~~~}|||}~~}}~~~~}}~||}~~}}~~~~~~||~~~}~~~~~~}{z{{}~}}}}{yz{{|~~~~~~}~~~~~~~}~~||{zz|~}~~}|||||}}}~~~}~~~}~~~}|}}}~~~}|}|}~~}}}~}}}~||}~}|}~~~~~}{|~~~}~~~~|{z{|~~~}}}|zz{{{}~~~~~~~~~~~~~}~~|||zz{~~}~~}|{|{}~}}}~~}}~~}~~~}}}}}~~~}|}|}~~|}~~~}|}~||}~}|}~~~~~}{}~~~}}~~~~~|{{{|~~}}}}{yz{{|~~~~~~~~~~~~~~~~}~}||{z{}}~~}||{{|~}}}~~}}~~}~~~}}}}}~~~}|}|}~}|}~~}|}}||}~}|}~~~~~~|{}~~~}}~~~~}{{{{}~}}}}{yz{{|~~~~~~~~~~~~~~~~|||{z{~~}~~}|{{{}~}}}~~}}~~}~~}}}}}~~}}}|}}}|}~~~}|}}||}~||}~~~~~|{}~~~~}}~~~~|{{{|~~}}}}{yzz{{~~~~~~~~~~~~~~~~}~}||{zz}~}~}}|{{|}~~}}~~}}~~~~~~}}}}}~~}}}}}}}|}~~~}|~~|}}}||}~~~~~|{}~~~~}~~~~|{{{|~~~}}}|zzzz{}~~~~~~~~~~~~~~~~|||{z|~~}~~}||{{|~}}}~~|}~~~~~}}}}~~~}}}}}}||}~~~}|~}}}~}||}~~~~~~||}~~~~}~~~~~|{{{|~~~}}}}{yzzz{~~~~~~~~~~~~~~~}|||{{}~~}~~}|{{{}~~}}~~}|}~~~~~}}}|}~~}}}}}}|{|~~~~}|~~}}}}||}~~~~~~~||}~~~~~}~~~~~|{{{|~~~}}~}{yzzz{~~~~~~~~~~~~~~}}|{z|~~~~~}|{{|}~}}}~}|}~~~~~}}}}~~}}}}}}}||~~~~}|}}}}}|||~~~~~~~}{|~~~~~~~~~~~|{{{|~~~}}~}{yzzz|~~~~~~~~~~~~|}|{{|~~~~~~}||{{|~~}}}~}|}~~~}}}|}~~}}}}}}|{|~~~~}|~~}}~}||}~~~~~~~||}~~~~~~~~~~|{{{|~~~}~~}{zzzz|~~~~~~~~~~~~~}}|{{|~~~~~}|{{|}~}}}~}|}}~~~}}|}~~~}~}}}|{{}~~}}}~}}}|||}~~~~~~}||}~~}~~~~~~~||||}~~~}~~}{zzzz|~~~~~~~~~~~~~~}}|{{|~~~~~~}|{{{}~~}}~}||}}~}}}|}~~~~~}}}|{|~~~~}}~~}~}|{|~~~~~~~}||}~}}~~~~~~}||||}~~~}~~|zzzzz|~~~~~~~~~~~~~~}}}|{{}~~~~~~~}|{{|}~}}}~}||}}~~~}}||~~~~~}}}|{{|~~~}}}~~~}|{|}~~~~~~~~||}}}}~~~~~~~||||}}~~}~~}{zzyz|~~~~~~~~~~~~~~}}}||{}~~~~~~~}|{{|}~~}}}~}||}}~~~}}|}~~~~}}}|{{}~~~}}~~~~}|{|}~~~~~~}||}}}}~~~~~}||||}~~~}~~}{zzyz{~~~~~~~~~~~~~~~}}}||{}~~~~~~~}|{{|}~~}}}}||}}}~~~}}|}~~~~~}}}{{|}~~~}}~~~|{{|}~~~~~~~|||}}}~~~~~~~~}||||}~~~}~~}{zzyz|~~~~~~~~~~~~}}}|||}~~~~~~~}|{{|}~~}}}}|||}}~~~}}|}~~~~}}}|{{}~~~~}}~~~~}|{|}~~~~~~}||}}}}~~~~~~~}|||}}~~}~~}|zzyyz}~~~~~~~~~~~~}}}|||~~~~~~~}|{{|}~~}}}}|||}}~~~}}|}~~~~~}}|{{|~~~~~}}~~~}|{|}~~~~~~~||}}}}~~~~~~~}||||}}~~}~~}{zzyz{~~~~~~~~~~~~~~}}}||}~~~~~~~~}|{{|}~~}}~}|||}}~}}|}~~~~~~}}{z{}~~~~~}}~~~}{{|}~~~~~~}||}}|}~~~~~~}}||}}}~~}~~~|{zzyz|~~~~~~~~~~~~}}}||}~~~~~~~}|{{||}~~~}}~}|||}}~~~}|}~~~~~~}}{z{}~~~~~}}~~}{{|}~~~~~~}||}}|}~~~~~~}|||}}~~~}~~}{zzyy{~~~~~~~~~~~~~}}}}||~~~~~~}|{||}~~~}}~}|||}}~~~~}}}~~~~~~}}{z{}~~~~~}}~}{{|}~~~~~~}||}||}~~~~~}}||}}}~~~}}~~}{zzyz|~~~~~~~~~~~}}}||}~~~~~~}|{{||}~~}}}~}|||}}~~}}}~~~~~}|{z{}~~~~~}}~}{{|}~~~~}~}||}||}~~~~~~}}||}}}~~~}~~}|{zyy{~~~~~~~}~~~~~}}}}||~~~~~~~}|{{|}}~~}}}}}|||}~~~}}~~~~~~}|{z{}}~~~~}~~}{{|}~~~~}~}||}||}~~~~~~}}||}}}~~~}~~~|{zzyz}~~~~~}~~~~~}}}}|}~~~~~~}|{||}~~}}}~}||||}~~}}}~~~~}|{z{}}}~~~}~~|{{|}~~~}}~~}|||||}~~~~~}}|}}}}~~}}~~}|{zzz{~~~~~~~}~~~~}}}}}}~~~~~~~}|||||}~}}}}}}||||}~}}~~~~}|{z{|}}~~~~~~}{{||~~~}}~}}}|||}}~~~~}}}}}}}~~}}~~}|{zzz{~~~~~~~}~~~~}}}}}}~~~~~}|||||}}}}}~}||||}~~}}}~~~~~}{z{|}}}~~~~}|{{|}~~}~}}}|||}}~~~~~~}}}}}}~~}}~~}|{zzz{~~~~~~}}~~~~~}}}}}~~~~~}||||}}}}}}}}||||}~}}~~~~~|{z{|}}}~~~~~}{{{|~~~}}~}}}|||}}~~}}|}}||}}|}}}}}}}|{{{{|||}}}~~~~~~~~}}}|}~~}|{{|}~~~}}|}}~}}}~~}}}}||{{|}~~~~~}}~~~~~~}|||}}}}}}}}~~}}~~~~~~~}}|||{{{zzzzz{|{{}~}}}~~~}~~~~~~~~~~~~||}}}||{{z{}}}}}||}~~}|}~~~~~~~~~~}}~~~~~}}~~~~~~~}}~~}|}}}|||||||}~~}}}|||{yxxyyyzzzz{~~~}}}}}~~~~~~~~}}}|{{z{{zz{}}}}||||}~~~~}}}||{{z{{|}}~~~}}|}}|{yyyz{{||||}~~~~~}}}}|{{{{zyyxxxxxxyxxxz|~~}~~}}~~~~~~~}}~~~~}|||||{zz{{|~~}}~~~~~}|{zzz{{||{{|}~~}~~}}}}~~}}}}}}}~~~~~}}{{{{{zzyzzz{{{{|}~~~~}|{zzzyxxxxyzzzz|}|||||{{||}}}}|||{{{|||{{{{zzzzyyyyyyy{{|}|||}~~~~}}}~}|{zzyyyyyyyxyyxxyz{{zzzzzz{|}}}~~}~}}|}}}}}}||{{|}~}}}|}~~~~}}||{zzzz{{||}|{{|~~~}}}}}}~~~~~}~~~~~~}|||||{zz{{||||{zz{|}|{{|}~~~~~~}}}|{zzzyyyyzywwxz{{zzzzz{|~~}}}||||}}|{{{||{{{{zzz{zzyyzz{{z{{}~~}||{{{{zzz{{{zzzzzzzzyxxyz|||{||{{|}~~~~}}}}}~~}|||}~~}}~~}}}~}||}}~}}~~~~~~~~}}|||{{{zzzzzzyyz{|}~}~~~~~~~}}}~~}}}}|{{|{{{zzyyyzz{{z{|~~~}}}~~~~}}{{{zzzzyyxxyz{||{{{{{{|}}|{{z{{{|}}}}|}}}{{{|{{{{zzz{{||{{|}~}|{{{{{{{{{zyxyyyyxyxxxy{}}}}||||}~~~~}}~~~~~}}~}}{{{|||||{{{|}~}~~~~~~~}}}}||{{{{||{{zzz{}~~~}||||}~~~}||}~~}~~}|{{{{{||{{zz{||{{|}~~~~}}}}}|{|||{yyyz{zzzzyyz|}}}|{|{{|}~~}{{{|||~~}|{{{{{zyzzz{{{|{{|}}||}}|||{{{z{{{{zyyz{{zyyyxyz{|||{{{{{|}~~~~~~}}||{|}||||||||}}}||~~}}||{||{||||{{|}}}|{{{{|}~~~}}}}}}~~~}}}~~~~~}||{{zz|||||||{{||||{}~~}}|||}||}}|{zz{{|zyyxxyz{||{{{|||}~~}||||}}}~~}}}||{zzz{{{{{{zz{{||{|~~}|{{zyyzz{|||{zz{||{zzyyz{|}}||{|||}}~~}}|}~~~~~~~}}|||}}}}}}||}}}~}~~}}}|{{||||}}|z{{|}|{{zz{|}~}}~}}~~~}}~~~}}|{{zz{{z{{{{z{{{||~~}||}||||}}}}|z{|||{zzzyz{|}}|{|||{||}}{{{|}}~~~}}|{{z{{{{||||{{||}}~~}|{{{zyzz{{|{zyz{{{zyzzzz{}}}}||}}|}}~~}}~~~~}|{{{{||||}}}|}}~~~~~}|||{{|||}}}|{{}}~}{||{{|}~~}||}}||}~~~~~~}|{{zz{|{{|||zz{|}}~~}|||{zz{{|}}|zz{}}}{{{{{{|}}}|{|}|||}}}|||}~~~~}}|{zzzyz{{{|}}|{||}~~~}|{{{zyz{{|}|{zz||}|z{{zzz{|}||{}}||}~~~~~}|||{{||||}~}|||}~~~|{{{{zy{{|}~}|{}~~~}}}}}|}~~~}}~~||}~~~~~}|{{{{z{|{|}}|{{{|~~}|||{zz{||}}|{{|}}}|{{{{{z|}}||}~}||}}~~~}}~~~~~}|{zzzz{{{{}|{zz{|~~~~}|{{zzzyy{||}}|{{}}~~|{|||{{|}}||}~}|}}~~~~~~}|||{||||~~~|{|}~~}}||{{zz{||}~}|{|}~~}||}}||}~~~}}~~}}}~~~~}|{{zzzz{z|}|{zz{}~~}}|||{{zz||}~~}||}~~}|}}|{{|}}||}}||||~~~}~~}}|{{{zz{{|}}|{z{}~~~||{{zzzyyz{|}}|{{|}~}|}~}|{|}}}}~~}}}}~~~~}|{{{{{{{|~~|{|~~~~}}}||{{zz{|}~~}}|}~~}}~}|{|}}}}~~}|}}~~}}|{{{{zz{|}}|{z{}~~~||||{zzzz{|}~~}}|~~}~~}|{|}}}}~~}||}~~~~~}||{zz{{z{{|~~|{z|~~~~~~~}|{||zzzyz{|}~~}}|}~~}}~}{z{}}}}~~}}~~}}|{{||{{|}~~}{z|~~~~~~~~~~~||||{zzzz{|}~~~}~~~~|{|}}}~~}}}~~~~}}|{{||zz{|}~}{z{}~}~~~~}||}|{z{z{|}}~~~}|~}}~~|{z|}}}~~}}~~~~~|||{z{|{zz|}}}|zz|}}~~~~~~}}}|{{||zzzzz{|}~~~}~~~|z{|}}~~~}~~~}}}||}}{{|}~~~|{|~~}}}~~}~~~~~~~|||}|{z{{{{}}~~}~|{|}~~~~}~~}|}|{{|{zz{|}}|{z|}|}}~~~~~}}}||}}|{z{{{|}}~~}~~~}{z{}}}}~}}~~~~~~~}|||{{|{zz|}}}|{z|}|}}}}~~~}}|||{{||{zz{zz{|}~~~}{z|}~~~~~|}}|||}|{|}~~}}|{}|{|}~|}~}}}}}}|}}}{{{|{{}}~~~|{{}~~~~~}|}|||||z{|}}}|{{|~|||}}}~}}}}}||}}{z{|{{|}~~~~|zz{~~~~~~~~~~~~}|||||||{{|}}}}|{|}||}~}~}|||||||}}{z{{{{{}}}{z{~~~}|}}}}}}||}}}}}}|}|{{|~~}}~~}|}}||||}}}}}|{{||{|}~}{z{~~~~~~}||}}}}||{|}}}}}|}~~|{{|~~~~}|~}||||}}}}}|{{|{{|}~~~|zy{~~}}~~}|||}}|||{{||||}}|~}{{}~~~}|~~|{{{{|}}}|{{{|{{|}~~}|zy{~~~~~~}}}~~}}}||}}}}~~}~~~|zz|~~||}~~|{}|{{{|}~~}}|{|||||}~}{zz~~}~}}}||}~}}}}|||||}}~~~~}~~}{z{}~}|}~~|}}{{{{}~~~}}|||||||~~}{zy|~}}}}}}|}~~}}}}||||}}~~~~~|{{}~}||~}|~~|{{z{}~}|||{{||||}~}|{yz~}}}}}}||~~}}~}}||}~~~}}}~}{z|}~~|||~~||~}{{{{}~~}}}||||||~~}|{y{~}}|}}|}~~}}~}||{|}~~~}|}~|zz|}~~{{}~~||~}{{{{}}}}}||||||~}}|zy|~}}||}}|}~}}~}||||~~}}~~|{{}~}{|}~~|}|{zz{}~}}}|{||||}~}|{zz}~}}|}}}}~}}~~}|{|}~}|}~}{z{|~~{{|}~~~}|}}{{z{|~~}}}|||}||}}|zz{}}||}}}~~}~~}|{{|~~~~}||}~|{{|}~~|{{}~~~~|}|{{{}~~~}||}||~~}|{z{}}||{|}}}}~~~|{{|}}||}~}{{|}~~|{{}~~~}}~|{z{|~}}~}|||||~~||{z{}~}||}~~~~~~|{{|~}|||}}{{|}}}|z{|}~~~}|~}{{{|~~}~}||}}|~~||{{{}}|{{|}~~}~~}{z{|~|{||}}|{|}}~}{z{}~~~~}}~}{{|~~~~}||}}}}|{z{{~}{{{|~~~~~}{z{|~~~||||}}|||}~}|{z{}}~~~}}~|{{|}~}~}||}}}}{{{{|~}{{{}~~}{z{}~~|{{|}}||||}}|{z{}}~~~~}~~}|{|~~~~~||}}~~|{{{|}~{z{|}~~~}{zz|~~~~}{{||}}|||}}|{{{|}~~~}~~~|{{}~~~~||}}}|{z{|}~|zz{}~|zz{}~}~~|{{|}~}|||~~|{{{|}}~~~}}~~~~}|{}~~~~}||}}~}{z{||~}{z{|~~}{z{|}}~}{{{|}~|||}~}{{{{||}~~}~~}~~}||}~~~}||}~}{{{|}}zz{}~~|{z{}~}}~}{{{|~~}||}|{{{||}}~~~~~~~}||~~~~}||}~|z{||}|zz{}~}|zz{}~}~~|{{|}~~|||}~|{{{||}}~~~~}}~}~~}|}~~~}||~~{z{|}~~{z{|~}{zz|}}~~|{{|}~}|{|~|{{{{||}}~~~~}~~}~~}}~~~}}|}}z{|}~|zz{}~}|zz{~~|}~|{{{|~~|{|~}{{{|||}}~~}}~}~}}~~~}|}~}zz{|}}zz{}}|zz{}~}}~}|{{|~}||~~{{{||||}~~}}~}}~}~~~}|}~}{z|}~}{z{}~|{z{~~~}}~~~}|{{|~~}||}}{z{||||}~~~}|}~}~~~~~}}}{z|}~|{{|}}{zz{~~~~~|}~~}|{{|~~}||~}{{|||||}~~~}}}}}~~~~~}}~|z{|~|z{|~~|{zz|~~~~}~~~}|{{}}|}~|{{|}|||}~~~}}}}}~~}~~}~|{{}~|{{|~~|{zz|~}~~}}~~~}|{{}~~}|}~~|{{|}|{|}~}}||}}}~~~~~~}{{}~}{{|~|{zz|~|}~~~}}~~~}{{|~~|}~~}{{|}|||}~~}}}}~~}~~~~~~}{{|~}|{|}}{zz{~}}~~~}~~~~~|{|}~}}~~}|{|}}|||}~~}}|}}~}}~~~~~~~|{{}~}||}|{z{}~|}~~~~~}~~}|{|~~~}}~~||{|||{{|}~}||}}~}~~~~~~|||~~|||}~{zz{~}|}~~~}~~}~~}||}~~~}}~}|||}}|||}~}|||}~~}~~~~~~}|||~~}|||~}{zz|}|}~~~~~~}~~}||}~~~}~~}|||}}|||}~~}||}}~}}~~~~~~}||}~~}||}|zz{}~||}~~~~~}}~~|||}~~~~}||||}||{|}~|||}}~}~~~~~}||}~}}|}~}{z{}||}}}~~~}~~}||}~~~~}}}|}}}|||}~~|||}}~~~~~~~}||}~~}}}}}~~{z{|}||}}~~~~~~}}}~~~~}}}}}}}|||}~~|{|}}~~~~~~~}}}}~~}}~}}~~{z{}}||}}~~~}~~~}}}}~~}|}}}}||{||~~|{|}}~~~~~~~}|}}~~}}~~~}{z{~}||}}~~~~~~~~~~}}}}~~}}}}}}||{|}~|{|}~~~~~}||}~~}|}~~~|{z|~}||}~~}~~~~~~~}}}}~~}}}~~}||{|}~|{|}}~~~~~~}||}~}|}~}{z|~}|||~}}}~~~~~~~}}}~~~}}}~~}||{|}~|{|}~~~~~~~}||}~}|}~}{z|~}|{|}}|}}~~~~~~}}}}~~}}}~~}||||}~~}||}~~~~~~~}||}~}||~}{{{~~}|{}~~}|}~~~~~}}}~~~}}}~~}||||}~~~}|||}~~~~~~~~|{|~~||}~}{{}~}|{|}}||}~~~~~~}|}~}}}~~~}|||{|~~~~~}||}}~~~}~~~|{}~~||}~|{{~~}|{|}}{|}~~~~~}}|~~~}}}~~}||||}~~~~}||}~~~~}~~}{{}}||~}|{|~~}|{|~~|{|}~~~}}}~~}}}~~}||||}~~~~}|||}~~~}}~|{|~||}~|{|~~~~}{{}}{{|~~~~~}|}~}}}}~~|||||~~~~}}||}}~~~}~~}{{}}||~}|{}~~~}|{|~}{{{}~~~}|}~}}}}~~}||||~~}~}}||}}~~}}}~~{{|}||}}||}~~~}|{|~~|z{}~~~}}~~}|}}~~}||||~~}}}}}||}~~}}}~~{{|}||~}||}~}~}|{|~}{z{|~~|}~~}|}}~}||||~~}}}}}||}~~}}}~~{{}}||~~|||~~}}~}|{|~~|{z{}~}|}}||}~~}|||}}}}}}}}}}~~}}}|{{}||}~||}~}}~}|{|~|{z{}~}}}}||}~~}|||}}||}}}}}~~}|}|{{~}|}}||~}}}}}|{|}|zz{}~}}}~|||}~~}|||}}|||}}}}}~}|}}{{}}|}~||~}}}}}|||~~|zzz|~~}}}||}~~|||}~|||}}}}}~~}|}~}{{}}|}~~||}}}}}}}||}~|{zz{}}}~}|||}~}||}~~}|||}}}}~}||}|{|~~}}}}|}~}}}}}}|}~}{zzz|~~}~~|{|}~~|||}~|{||}}}}~~}|}~~|{}~}}~~}|}}||}}}||}|{zzz|~~}~~|{|}~|||~}|{||}}}}~}|}~}||}~}}~||~}||}}}||}~|{zz{}~~}}|{|~~}||}~~}{{|}}}}~~~~||}~|||~~}}~~}|}~||}}}}}}~}{zzz{}~~~~|{|}~~}||~~|{{|}}}~~~~}|}~}||}~}~}||~|||}}}}}~}{zzz{|~~~~}{||~~}||}~}{{|}}~~~~}~}|}~}||}~~~}||~~}||}}}}}~~|zzz{|~~~}|{|~~}||}~}{{|}}~~~~}}~}|}~}|}~~~~~}|}~|||}}}}~~~{zzz{|}~~}|{|~~}||~~}{{|}}~~~}}~}|}~}}}~~~~}||}}||||}}}~}{zzz{|~~~|{|}~~}}}~}{{|}~~~}}~}}}~}}~~~~~}||~}|||}}}~|{zzz{|~~~|{|}~~~}}}~}{{|}~}||~}}}}}}~~~~|||~}||||}}~|zzzz{|}~~~|||}~~~}}~~}{{|}~}||~}}~}}}~~~~|||~}||||}}~}{zzz{{}~~}||}~~}}~~}|{|}~~||}~}}}|}~~~~~|{|}~||||}}~~{zzzz{|}~~|||}~~}~~~|{{|}~}||~~}}~~}}~~~}|{|}||||}~}{zzzz{|~~}||}~~~}~~~}|{|}~~||}~}~}|}~~~~~}{{}~}||||}~~|zzzz{{|~~~}||}~~~~~~~}|{|}~~}||}~~~~}|}~~~|{|~~|||||}~~|zzzzz{}~~~}||}~~~~~~~~}|||}~}||~~~~}|}~~~~}{{}}||||}~~}{zzzz{{}~~}||}~~~~~~~~~}|||}~~}||}~~~~||}~~~}{{|~}||||}}}{zzzzz{|~~~~}|}~~~~~~~~~~~}||}~}|||~~~~||}~~~}|{|~~|||||}}|zzzzz{|}~~~}}}~~~~~~~~~~}}|||~}|||~~~||}~~~}{{|~~}|||}~~}|zzzzz{|}~~~}}}~~~~~~~~~~~}}|}~~}|||~}||}~~~~}{{|}||||}~~|{zzzzz{|}~~~~}}}~~~~~~~~~~}}}}}~~}||}~~~~|||~~}}~~~|{{}}||||}~~}|{zzzz{{|}~~~}}~~~~~~~~~~~}}}}}~~|||}~~~~||}~~}}~~|{{}}}|||}~}|{zzzzz{|}~~~~}}~~~~}~~~~~~}}}}~~~|||}~~~~|{|~}}}}~~|{{}~}|||}~~}|{zzzzz{{|}~~~~~~~~}}}~~~~~}}}}~~~}|||~~~~|{|~}||}~}{{|~}}||}~}|{{zzzz{{|}~~}~~~~~~}}~~~~~}}}~~~}|||}~~~~}{{}~}||~~|{{~~}|||}~||{{zzzz{{|}~~}}~~~~~}}}~~~~}}~~~~~~}|||}~~~|{|}}|||~}{{|~}}|}~}|{{zzzzz{{|}~}}~~~~}}}}~~~~}~~~~~|||}~~~~|{|~~}||}~}{{}}}||}~}|{{zzzz{{{|}~}~~~~~}}}}~~~~}}~~~~}|||}~~~~}{{}~|{|}~|{|~~}}|}}}|{{{zzzz{{{|~~}}~~~~}}}}~~~}}~~~~~|||}}~~}|{|~~|{{|~~|{|~~}}}}~|{{{zzzzz{{|~}}~~~~~}}}~~~~}~~~}|||}~~~~~|{|~~}{{|~}{|}~}}}}~~|{{{{zzzz{{|}}}~~~~}}}}~~}}~~~}|||}~~~~}|{|~~|{{|~~}||~~}}}}~|{{{{zzzz{{{}~}}~~~~}}}}~}}}~~~}||}}~~~}{{|~~|zz|~~|||~}}}~}|{z{{zzz{{{|~~}}~~}}}}~~~}~~~|||}}~~~~|{{}~}{z{|~}||}~}}}~}{zz{{zzz{{{|~~}}~~}}}}~~}}~~}|||}~~~~~|{|}~}{zz|~}||~~}}}~}{zz{{zzz{{{|~~}}~~}}}}~~~}}~~~}|||}~~~~~|{|}~}{zz|~~}||~~~}}~}{zzz{zzz{{{|}~}}~~}}}~~}}}~~}||}~~~~|{{}~}{zz{}~}}}}~~~~~|{zz{{zzz{{{}}}}~~}}}}~~}}~~}|||}~~~}|{|~~|{zz|~~}}}~~~}{zzz{zzz{{{|~~}}~~}}}~~}}}~~}}||}}~~}{{}~}{zz{|~}}}~~~~~}{zzz{zzz{{{|~~}}~~}}}~~}}~~~}}||}~~~~|{|}}{zz{}~}}}~~~~~~|{zzzzzzz{{{}~}}~~~}}~~~}}~~~}|||}~~~}|{|~~|zzz|~}}}~~~~}{zzzzzzz{{{|~~}}~~}}}~~}}~~~}}||}}~~|||}~|{zz{}}}}}~~~|zzzzz{{{{{|}~}~~~~}}~~~}~~~}}||}}~}||}~|{zz{|~}|}~~~|{zzzz{{{{{|}~}~~~}}~~~}}~~}}|}}}~~}||}~|{zz{|~}|}~~|{zzzz{{{{{|}~}~~~~}}~~~}~~~}}||}}}~~|||~~|zzz{}~}|}~}|zzzzz{{{{{|~~~}~~~}~~~}~~}}|}}}~~}||}~}{zzz{}~}|}~}{zzzzz{{{{|}~~~~~~~}~~~~~~}||}}}~~}||}~}{zzz{}~||}~}{zzzzz{{{{|}~~~~~~~~~~~~~}||}}}~~}||}~}{zzz{}~}|}~}|{zzzz{{{{|}~~~~~~~~~~~~~}||}}}~~~~}|}~}|zzz{|~~}|}~}|{zzzz{{{{{|~~~~~~~~~~~~}|||}}~~~~~~}|}~~}{zz{|}~||}~}|{zzzz{{{{|}~~~~~~~~~~~~}||}}}~~~~~~~~}}}~~|zzz{|}}||~~|{zzyzz{{{{|~~~~~~~~~~~~}||}}}~~~~~~~~}}}~}|zzz{|~~}|}}|{zzzz{{{{|}~~~~~~~~~~~}|||}}~~~~~~~~~}}}~~|{zz{|}~}||~~}|{zzzz{{{||}~~~~~~~~~~}||}}~~~~~~~~~}}}~~}{zzz{|~~}|}~}|{zzzz{{{||}~~~~~~~}|||}}~~~~~}}~~~}}~~}|zzz{|}~}|}~}|{zzzz{{|||}~~~~~~~}|||}}~~~~~}}~~~}}}~~}{zzz{|}~~}|}~}|{zzzzz{|||~~~~~~~}|||}~~~~~~}}}~~~}}}~~|{zz{|}~}}}~}||{zzzz{{||}~~~~~~}|||}~~~~~}}}}~~~}}~~}|{zz{|}~~}}}~}|{{zzzz{{|}}~~~~~~||||}~~~~~}}}}~~~}}~~}|{zz{|}~~~}}}~}|{{zzzz{{|}~~~~~~~}|||}~~~~~}}}}}~~}}~~}|{zz{|}~~~}}}~}|{{{zzz{{|}}~~~~~}|||}~~~~~}}||}~~}}~~}|{zz{|}}~~~}}}~}||{{zzzz{|}}~~~~~~}||||}~~~~}}|||}~~}}~}|{{z{{|}~~~}}~~}|{{{zzz{{|}~~~~~~~}|||}~~~~}}|||}~~}}~}|{zz{||}~~~}}}~~||{{{zzz{||}~~~~~~~}|||}~~~~}}|||}~~}}}~~}{{z{{|}}~~~}}~~}||{{zzz{{|}~~~~~~}}|||}~~~}}||||}~~}}~}|{zz{{|}}~~~}}}~~}|{{{zzz{{|}~~~~~~}|||}}~~~}}||||}~}}}~~|{zz{{|}}~~~~~}}~~}|{{{{zz{{|}~~~~~~~}|||}}~~~}}||||}~~}}}~~|{zz{{|}}}~~~~~}}~~}|{{{{{{{{|}~~}}~~~}}||}}~~~}}||||}~~}}}~~|{zz{{|}}}}~~~~}}}~~}|{{{{{{{{|}~~}}~~~}}||}}~~~}|||{|}~~}}~}|{zz{||}}}}~~~~}}}}||{{{{{{{|}~~}}}~~~}|||}}~~}}||{{|}~~}}}~}{zzz{||}}}}}~~}}}~~}|{{{{{{{{|}~~}}}~~}}}||}}~~}}||{{|}~~}}}~}{zz{{|}}}}}}}}}}}~~}|{{{{{{{{|}~~}}}~~}}}||}}~~}}||{{|}~~}|}~}{zzz{||}}}}}}}}}}~}|{{{{{{{{|}~~}|}~~~~}}}|}}~~}}||{{||~~}|}~}|zzz{||}}}}}}}}}}~~|{{{{{{{{||~~}||}~~}}}}}}}~~}||{{{|}~}}}~~}{zz{{|}}}}}}}||}}~~}|{{{{{{|||}~}||}}~~}}}}}}}}}}}||{{{|}}|}~~|{zz{||}}}}}||||}}~}|{{{{{{|||}~}||}~~}}}}}}}}}}}|{{{||~~}|}~}|zzz{||}}}}}||||}~}|{{{{{{|||}~~}||}~~~}}}}}}}}}}||{{{|}~~}}}~~|{zz{{|}}}}}|||||}~}|{{{{{||||}~}|||}~~}}}}}}}}}}}|{{{{|~~}|}~}{zzz{||}}}||||||}~}|{{{{{|||}}~}|||}~~}}}}}}}}}}}||{{{|}~}|}~}|{zz{||}}}|||{{||~}|{{{{{|||}}~}|||}~~}}}}}}}}}}}||{{{|}~}}}~}|{zz{|}}}}|||{{||~}|{{{{{|||}}~}|||}~~~}}}}}}}}}}||{{{{|}~}}}~~}{zzz{|}}}}||{{{|}~}|{{{{{||}}~~}|||}~~}}}}}}}}}}|||{{{||~~}}}~~|{zz{{|}}}|||{{{|}~}|{{{{||}}~~~}|||}~~}}}}}}}}}}|||{{{||~}}}}}|{zz{{|}}}||{{z{|}~}|{{{{||}}~~~||||}~~}}}}}}}}}}|||{{{||~~}}}~|{{z{{|}}}||{{zz{}~}|{{{{{|}}~~~}|{||}~~}}}}}}}}}}|||{{{||}~}}}~~|{{z{{||}}||{{zz{|~}|{{{{{|}}~~~}||||}~~~}}}}}}}}}||||{{{|}~}}}~~}|{{{{{|}}}||{zzz{}~}|{{{{||}~~~}|{||}~~}}}}}}}}}||||{{{||}~~}}}~~}|{{{{||}}||{{zzz|~~|{{{{{||}~~}||{||}~~}}}}}}}}}||||{{{||}~}}~}|{{{{{||}}||{{zz{|}|{{{{{|}}~~}||||}~~~}}}}}}}}}||||{{{{|}~}}}~~}|{{{{{||}||{{zzz{}~}|{{{{|}}~~|||||}~~}}}}}}}}}||||{{{||}~~}}~~}|{{{{{||}|||{zzz{}~}|{{{{||}~~~}||||}~~~}}}}}}}}}||||{{{||}~~}}~~}|{{{{{||}|||{zzzz|}|{{{{||}~~}||||}}~~}}}}}}}}}|||{{{{||}~~}}~~}|{{{{{||||||{zzzz|}|{{{{||}~~}||||}}~~}}}}}}}}}||{{{{|||}~~}~~~}|{{{{||||||{{zzz{}~}|{{{{|}~~}|||||}}~~~}}}}}}}}}||{{{{||}~~~~~~~}||{{{{||||||{zzzz{}~}|{{{{|}~~}|||||}}~~}}}}}}}}}}||{{{{||}~~~~~~}||{{{|||||||{zzzz{}~}|{{{||}~~}|||||}}~~}}}}}}}}}}|{{{{|||}~~~~~~~}||{{{|||||||{zzyz{}~}|{{{||}~~}|||||}}~~}}}}}}}}}||{{{{||}~~~~~~}||{{{|||||||{zzyz{}~}||{{{|}~~~}|||||}}~~}}}}}}}}}||{{{{||}}~~~~~~}|{{{|||||||{{zzyz{~~}|{{{||}~~}|||||}}~~}}}}}}}}}||{{{{||}}~~~~~}||{{{|||||||{{zyzz|~~}|{{{|}~~~}|||||}}~~~}}}}}}}}}||{{{|||}~~~~~~~}||{{{|||||||{zzyz{}~}||{{||}~~}|||||}}~~}}}}}}}}}||{{{{||}}~~~~~}|{{{|||||||{{zyzz|~~}||{{|}}~~}|||||}}~~~}}}}}}}}}||{{{|||}~~~~~~}|{{{|||||||{{zzyz{}~}|||||}}~~}}||||}}}~~}}}}}}}}}||{{{|||}~~~~~~~}|{{{|||||||{{zzyz{}~}|||||}}~~}}|||||}}~~}}}}}}}}}||{{{|||}~~~~~~}|{{{||||||{{{zzyz{}~}|||||}}~~}||||||}}~~}}}}}}}}}||{{{||}}~~~~~~}|{{{||||||{{{zzzz|~~~}|||||}~~}|||||}}}~~~}}}}}}}}|||{{{||}}~~~~~~}|{{{||||||{{{zzyz{|~~}}||||}}~~}}|||||}}}~~~}}}}}}}}|||{{{||}}~~~~~~}|{{{||||||{{{zzzz{}~}}||||}}~~}}|||||}}}~~~}}}}}}}}|||{{{||}~~~~~~}|{{{||||||{{{zzzz{|~~}}||||}}~}}|||||}}}~~}}}}}}}}}||{{{||}}~~~~~~~||{{{||||||{{zzzz{|~~~}}|||}}~~}|||||}}}~~~}}}}}}}}}|||{{||}}~~~~~~~}|{{{||||||{{zzzzz{}~}}|||}}~~~}}||||}}}}~~}}}}}}}}}|||{{||}}~~~~~~~}|{{{||||||{{zzzzz|}~}}|||}}~~}}||||}}}}~~~}}}}}}}}||||{{||}~~~~~~~}||{{|||}|||{{zzzz{|~~}}}||}}~~~}|||}}}}}~~~~}}}}}}}}|||{{||}}~~~~~~~}|{{{||||||{{zzzzz|}~}}}|}}}~~}}||}}}}}}~~~}}}}}}}}||||{|||}~~~~~~}|{{{||||||{{zzzzz{}~}}}|}}}~~}|||}}}}}~~}}}}}}}}||||||||}~~~~~~~~||{{|||}|||{zzzzz{}~~}}}}}}}~~}|||}}}}}~~~}}}}}}}}||||||||}}~~~~~~}||{{|||||||{zzzzz{}~}}}}}}~~~}||}}}}}}~~}}}}}}}}||||||||}~~~~~~~}|{{{||||||{{zzzz{|}~}}}}}}~~~}}||}}}}}}~~~}}}}}}}||||||||}}~~~~~~~~}|{{{||||||{{zzzz{|~~~}}}}}~~~}}|}}}}}}}~~~}}}}}}|||||||||}}~~~~~~~}|{{{||||||{{zzzz{}~~~}}}}}~~~}}}}}}}}}~~~~}}}}}||||||||||}}~~~~~~~~}|{{{||||||{{zzzz{}~~}}}}}~~~}}}}}}}}}~~~~~}}}}||||||||||}}~~~~~~~}|{{{||||||{{zzzz{|~~}}}}}~~~}}}}}}}}}~~~}}}}}|||||||||}}~~~~~~~~~}|{{{||||||{{zzzz|}~~}}}}~~~}}}}}}}}}~~~~~}}}}||||||||||}}~~~~~~~~}||{{{|||||{{zzzz{|~~~}}}}~~~}}}}}}}}~~~~~~}}}}||||||||||}}~~~~~~~~}||{{||||||{{zzzz{}~~}}}}~~~}}}}}}}}~~~~}}}}||||||||||}}~~~~~~~~}|{{{||||||{zzzz{|}~}}}}~~~}}}}}}}}~~~~~~}}}}|||||||||}}}~~~~~~~~}||{{||||||{{zzzz|}~}}}}~~~}}}}}}~~~~~~~}}}}|||||||||}}}~~~~~~~~~}||{{||||||{{zzzz{}~}}}}~~}}}}}}~~~~~~~}}}}|||||||||}}}~~~~~~~~~}||{{||||||{{zzzz|}~}}}}~~~}}}}}}~~~~~~~~}}}||||||||}}}}~~~~}}~~~}|||||||||{{{zzz{|~~}}}~~~~}}}}}~~~~~~~}}}}||||||||}}}~~~~~}}~~~}}|||||||||{{zzzz{}~~}}}~~~}}}}}~~~~~~~}}}}||||||||}}}~~~~~}}~~~}}|||||||||{{zzzz{}~}}~~~~}}}}}~~~~~~~~}}}||||||||}}}~~~~~~}}}~~}}|||||||||{{zzzz{}~~}}~~~~}}}}}~~~~~~~~}}}||||||||}}}~~~~~~}}}}~~~}|||||||||{{zzzz{|~~~}~~~~~}}}}~~~~~~~~~}}}|||||||}}}}~~~~~}}}~~~}}||||||||{{{zzz{|}~~}~~~~}}}}}~~~~~~~}}}||||||||}}}~~~~~~}}}}~~~}}||||||||{{{zzz{|~~~~~~~~~}}}}~~~~~~~~}}}|||||||}}}}~~~~~~}}}}~~~}||||||||{{{zzzz{}~~~~~~~~~~}}~~~~~~~~~~}}}|||||||}}}~~~~~~~}}}}}~~}}|||||||{{{{zzz{|}~~~~~~~~}}~~~~~~~~~}}|||||||}}}}~~~~~~}}}}}~~}}||||||||{{{zzz{|}~~~~~~~~~~~~~~~~~~~~}}}||||||}}}}~~~~~~~}}}}}~~~~}}|||||||{{{zzz{{}~~~~~~~~~~~~~~~~~~~~~}}}||||||}}}}~~~~~~~}}|}}~~~}}}|||||||{{{zzz{|}~~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~}}||}}~~}}}||||||{{{{zzz{|~~~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~~}}||}}~~}}}}|||||{{{zzz{{}~~~~~~~~~~~~~~~~~~~~~}}}||||||}}~~~~~~~~~}|||}}~~~}}}}}||||{{{zzz{|}~~~~~~~~~~~~~~~~~~~~}}}|||||}}}~~~~~~~~~}||||}~~~}}}}}}|||{{{zzz{|}~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~~}||||}~~}}}}}}|||{{{zzz{{|~~~~~~~~~~~~~~~~~~~~}}}|||||}}}~~~~~~~~}}|||}}~~}}}}}}}|||{{{zzz{|}~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~~~}||||}~~~}}}}}}}|||{{zzz{{|~~~~~~~~~~~~~~~~~~}}}|||||}}}~~~~~~~~~}}||||}~~}}}}}}}||{{{zzz{|}~~~~~~~~~~~~~~~~~~}}}|||||}}}~~~~~~~~~}|||||}~~}}}}}}}}||{{{zz{{|~~~~~~~~~~~~~~~~~~}}}}||||}}}~~~~~~~~~~}}||||}~~~}}}}}}}||{{{zzz{|}~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~}}||||}}~~~}}}}}}}|||{{zzz{|}~~~~~~~~~~~~~~}}}}}|||}}}~~~~~~~~~~~}}||||}}~~~}}}}}}}|||{{zz{{|}~~~~~~~~~~~~~~}}}}}||}}}}~~~~~~~~~~~~}||{{|}~~}}}}}}}}||{{{zz{{}~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~}}||{||}~~}}}}}}}}||{{zzz{|}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~}}|{{||}~~}}}}}}}}||{{zzz{|}~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}|{{{|}~~}}}}}}}}||{{{zz{|}~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}||{{|}}~}}}}}}}}}||{{zz{|}~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~}||{{||}~~}}}}}}}}||{{{z{{|~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}||{{||}~~~}}}}}}}}||{{zz{|}~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~}}|{{{|}}~}}}}}}}}}||{{z{{|}~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}||{{{|}~~~}}}}}}}}}|{{{{{|}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}||{{{|}~~}}}}}}}}}||{{{{{|~~~~~~}}}}}}}}}}~~~~~~~~~~~~}||{{{||}~~}}}}}}}}}||{{{{{|}~~~~~}}}}}}}}}}~~~~~~~~~~~}}||{{{||}~~}}}}}}}}}||{{{{{|~~~~~}}}}}}}}}}}~~~~~~~~~~~}}||{{{||}~~~}}}}}}}}}||{{{{|}~~~~~}}}}}~~~~~~~~~~~~~~~~}}||{{{{|}~~~}}}}}}}}}||{{{{|}~~~~~}}}}}~~~~~~~~~~~~~~~~}}||{{{{|}~~~}}}}}}}}}||{{{{|}~~~~~}}}}~~~~~~~~~~~~~~~~~}}||{{{{|}~~~}}}}}}}}}||{{{{|}~~~~}}}}~~~~~~~~~~~~~~~~~}}||{{{{|}}~~~}}}}}}}}}|||{{{|}~~~~~~}}}~~~~~~~~~~~~~~~~~}}}||{{{||}~~~}}}}}}}}}||{{{|}~~~~~~}}}}~~~~~~~~~~~~~~~~~}}||{{{{||}~~~~}}}}}}}}}||{{{|}~~~~~~}}}~~~~~~~~~~~~~~~~~~}}||{{{{|}}~~~}}}}}}}}}|||{{||}~~~~~}}}~~~~~~~~~~~~~~~~~}}||{{{{||}~~~~}}}}}}}}}|||{{|}~~~~~~~}}~~~~~~~~~~~~~~~~~~}}|{{{{{|}~~~}}}}}}}}}|||{{|}~~~~~~~}}~~~~~~~~~~~~~~~~~}}}|{{{{{||}~~~}}}}}}}}}}|||||}~~~~~~~}}~~~~~~~~~~~~~~~~~}}||{{{{{|}}~~~~}}}}}}}}}}|||||}~~~~~~~}~~~~~~~~~~~~~~~~~~}}||{{{{{|}~~~~~}}}}}}}}}||||||}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{||}~~~}}}}}}}}}}|||||}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{||}~~~~}}}~~}}}}}|||||}~~~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{||}~~~~}}}~~}}}}}|||||}~~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{||}~~~~}}}~~~}}}}}||||}~~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~~}}~~~~}}}}||||}}~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{{|}~~~~}}}~~~}}}}}||||}~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{||}~~~~}}}~~~}}}}}|||}}~~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~}}}~~~~}}}}||||}~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~}}}~~~~}}}}||||}~~~~~~~~~~~~~~~~~~~~~~~}}}|{{{{{||}~~~~}}}}~~~}}}}}|||}~~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~~}}}~~~~~}}}}||}}~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~}}}~~~~}}}}}|}}}~~~~~~~~~~~~~~~~~~~~~}}||{{{{{|}}~~~}}}}~~~~}}}}}|}}~~~~~~~~~~~~~~~~~~~~~~~}}|{{{{{{|}}~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}|{{{{{{|}}~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{||}~~~}}}}~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{{|}~~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}||{{{{{||}~~~}}}}}~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}||{{{{{||}~~~}}}}~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{{|}~~~~}}}}}~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}|{{{{{{|}}~~~~}}}}~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}||{{{{{||}~~~~}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{{{||}~~~}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{{|}}~~~}}}}}~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}||{{{{{{|}~~~~}}}}}}~~~~}}}}}}~~~~~~~~~~~~~}}~~~~~~~~~}}||{{{{{||}~~~~}}}}}}~~~~}}}}}}~~~~~~~~~~~~~}}~~~~~~~~~}}||{{{{{||}~~~~~}}}}}}~~~~}}}}}}~~~~~~~~~~~~~}}~~~~~~~~}}||{{{{{{|}}~~~~}}}}}}}~~~}}}}}}~~~~~~~~~~~~~~}}}~~~~~~~~}}}||{{{{{||}~~~}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~}}}~~~~~~~~}}||{{{{{{|}}~~~~}}}}}}}~~~}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~}}||{{{{{{|}}~~~}}}}}}}}~~~}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~}}||{{{{{{||}~~~}}}}}}}}}~~}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~}}||{{{{{||}~~~~~}}}}}}}}~~~}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~}}||{{{{{||}}~~~~}}}}}}}}}~}}}}}}}~~~~~~~~~~~~~}}}}}}~~~~~~}}||{{{{{||}}~~~}}}}}}}}}}~}}}}}}~~~~~~~~~~~~~}}}}}}}~~~~~~}}||{{{{{||}~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}~~~~~~~}}|{{{{{{||}~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~}||{{{{{||}}~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}~~~~~~}}|{{{{{||}}~~~~}}}|}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||{{{{{||}~~~~}}}||}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}~~~~~~}||{{{{{||}}~~~}}}|||}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}~~~~~}}||{{{{{||}~~~~}}|||}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||{{{{||}}~~~~}}}|||}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~~}||{{{{{||}}~~~}}||||}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||{{{{||}}~~~~}}|||||}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}~~~~~}}||{{{{||}}~~~~}}|||||}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}~~~~~}}||{{{{||}}~~~~}}|||||}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}~~~~~~}}||{{{|||}~~~~~~}}|||||}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~}}|||||||}}~~~~~}}}||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}~~~~~~~}}||||||}}}~~~~~~}}}||||}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~}}||||||}}~~~~~~~~}}}|||}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~}}}|||||}}~~~~~~~~}}}}||}}}}}}}}}}~~~~~~~~~}}}}}}}}}}~~~~~~~~}}|||||}}}~~~~~~~}}}}|}}}}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~}}}||||}}}~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~}}}}||}}}}~~~~~~~}}}}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~}}}}}}~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m52.bin b/applications/SprPoP/dist/MUS/m52.bin deleted file mode 100644 index ed44f97..0000000 --- a/applications/SprPoP/dist/MUS/m52.bin +++ /dev/null @@ -1 +0,0 @@ -{uqprvz|xtrpqruy~~{ywusrrqqqppqqqqqrstvxz~}ytrqqtx}|xusqqqrstvx{|}~~}|{ywvtsrqqqqrtvxz}}zwtsqqrsvx||zxwutssrrrrrrrrrrrrqrqrrrrrrsstuvwxy{|}~|zxwutsrrrstuwy|~~}|{zzyyyxxxxxxxxxxyyyyzz{{||}~~~}|{zywwvutsssssstuvwxz|}~~~~~}}}|{{zzyxwwvvuttttttttttuvvwxy{|}~~~~}}}|||{{zzzyyxxwwvvvuuutttttttuuuvvwxxyz{|}~~~~}}}|||{{zzzyyxxxwwwvvvuuuuuuuuuuuuvvvwwxyyz{{|}~~~~}}||{{{zzyyyxxxwwwvvvvvuuuuuuuuvvvvwwxxyyzz{||}~~~~~}}||{{{zzyyyxxxwwwwvvvvvvvvvvvvvvwwwxxyyzz{{||}~~~~}}|||{{zzzyyyxxxwwwwwwvvvvvvvwwwwwxxxyyyzz{{||}}~~~}}||{{{zzzyyyxxxxwwwwwwwwwwwwwwwxxxyyyzzz{{||}}~~~~}}}||{{zzzyyyyxxxxxxwwwwwwwwxxxxxyyyyzzz{{|||}}~~~~}}}||{{{zzzyyyyxxxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~~~}}}||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzz{{{|||}}}~~~~}}}|||{{{zzzzyyyyyyyyyxyyyyyyyyyzzzz{{{|||}}}~~~~~}}}|||{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}|||{{{{zzzzzzzyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~}}}||||{{{{{zzzzzzzzzzzzzzzzzzz{{{{{|||}}}}~~~~~~}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{{{||||}}}}~~~|zyyz|~}{zyyyz|~~}|{zzzyyyyyyyyyyyzz{|}~}{zyyz{}}{zzyyyzz{|}~~~~~}|{{zzzyyyzz{|}~~|{zzyyz{|}~~}||{{zzzzzyyyyyyyyyyyyyyyzzzzzz{{{||}~~~~}|{{zzzzzz{{|}~~~~}}}}}||||||||||||}}}}}}~~~~~~~}}||{{{zzzzzzz{{{|}}~~~~~}}}}||||{{{{zzzzzzz{{{{||}}~~~~~~~~~}}}}}}|||||{{{{{{{{zzz{{{{{{||||}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{||||}}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{||||||}}}~~~~~~~~~}}}}}}}||||||||{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~}}}}}}|||||||||||{{{{{{||||||||||}}}}}~~~~~~~~~~}}}}}}||||||||||||||||||||||||}}}}}}}~~~~~~~~~}}}}}}}||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}|||||||||||}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~wropsw|~yurpopsv{|zwusrqqpppppppppqrstvx{zvrppruz~yusqppprstwy{|}~~}|{zxvtsrqpppqrtvx{~~{xusqqqrsvy}}zxvutsrrqqqqqqqqqqqqqqqqqqqrrrstuvwxy{|}~|{ywutsrqqrstuwz|~~}|{zyyxxxwwwwwwwwwxxxyyyzz{{|}}~~~}|{zywvuutsrrrrrsttvwxz|}~~~~~~~~~~~~~~~~~~}}}||{zzyyxwvvuuttsssssssstuuvwxy{|}~~~~~~}}}}|||{{{zzyyyxxwwvvvuuttttssssstttuuvvwxyz{|}~~~~}}}||{{{zzzyyxxxwwvvvuuuutttttttttuuuuvvwwxyzz{|}~~~~}}}||{{{zzyyyxxxwwwvvvuuuuuuuuuuuuuuvvvwwxxyyz{{|}}~~~~}}||{{{zzyyxxxwwwwvvvvuuuuuuuuuuuvvvwwwxxyyzz{{|}}~~~~}}|||{{zzyyyxxxwwwwvvvvvvvvvvvvvvvvwwwxxxyyzz{{||}~~~~}}||{{{zzyyyxxxwwwwwvvvvvvvvvvvvwwwwxxxyyzzz{{||}}~~~~}}}||{{zzzyyyxxxxwwwwwwwwwwwwwwwwwxxxxyyyzz{{{||}}~~~~}}|||{{zzzyyyxxxxxwwwwwwwwwwwwwxxxxxyyyzzz{{{||}}~~~~~}}|||{{zzzzyyyyxxxxxxxwwwwxxxxxxxxyyyyzzz{{{||}}}~~~~~}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxyyyyzzzz{{{|||}}~~~~~~}}|||{{{zzzzzyyyyyyxxxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzyyyyyyyyyyyzzzzzz{{{{{|||}}}}~~~}{yyy{}}|zyyyz{}~}|{{zyyyyyyyyyyyyzzz{|}~|zyyyz|~~|zzyyyyzz{|}~~~~~}}|{zzyyyyyzz{|}~~}|zzyyyz{|~~}|{{zzzyyyyyyyyyyyyyyyyyyyzzzzz{{||}}~~~~}|{{zzzyzzz{|}~~~~}}}||||||||||||||||}}}}}~~~~~~~}}||{{{zzzzzzzz{{||}~~~~~~~}}}}|||{{{{zzzzzzzzzz{{{||}}~~~~~~~~~~}}}}}}|||||{{{{{{{zzzzzzz{{{{{||||}}~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}}|||||||||{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~~}}}}}}|||||||||||{{{{{{{|||||||||}}}}}}~~~~~~~~~~~}}}}}}|||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~}}}}}}}||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~zuqpquz|wtqppruy~~{yvtsrqqpppppppqqrstvxz~}xtqpqtx}|wtrqpprstvxz|}~~}|zywutsrqqqqrsuxz}}zwtrqqqsux{~|ywvutsrrrqqqqqqqqqqqqqqqqrrrsstuvwxyz|}~}|zxvutsrrrstuwy{~}||{zyyyxxxwwwwwwwxxxyyyz{{||}}~}|{{yxwvuttssrrrsttuwxz{}~~~~~~~~~~~~~~}}}||{zzyxxwvvuuttssssssttuuvwxyz|}~~~~~}}}}|||{{zzzyyxxwwvvvuuuttttttttttuuvvwxyz{|}~~~~}}}|||{{zzzyyxxxwwwvvvuuuutttttttuuuvvvwxxyzz{|}~~~~~}}||{{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwxxyyz{{|}}~~~}}||{{{zzyyyxxxwwwvvvvvvuuuuuuvvvvvwwwxxyyzz{{|}}~~~~}}}||{{zzzyyxxxxwwwwvvvvvvvvvvvvvwwwwxxyyyzz{{||}~~~~}}|||{{zzzyyyxxxwwwwwwvvvvvvvwwwwwxxxyyyzz{{{||}}~~~}}}||{{zzzyyyyxxxxwwwwwwwwwwwwwwxxxxyyyzzz{{|||}}~~~~}}}||{{{zzzyyyxxxxxxwwwwwwwwwxxxxxyyyzzz{{{|||}}~~~~}}}||{{{zzzyyyyyxxxxxxxxxxxxxxxxyyyyzzz{{{|||}}}~~~~}}}||{{{{zzzyyyyyyxxxxxxxxxxxyyyyyzzzz{{{|||}}}~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyyyyyzzzz{{{{|||}}}}~~~~~}}}|||{{{{zzzzzzzyyyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~}}}||||{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{||||}}}~~~~{yyy{}~|{yyyy{|~~}|{zzyyyyyyyyyyyyzz{|}~}{zyyz|~~|{zyyyyzz{|}~~~~~}}|{{zzyyyyzz{|}~~}|{zyyyz{|}~}||{{zzzzyyyyyyyyyyyyyyyyyzzzzz{{{||}~~~}||{zzzzzzz{||}~~~~}}}|||||||||||||||}}}}}~~~~~~}}|||{{zzzzzzzz{{{|}}~~~~~}}}}||||{{{{zzzzzzzz{{{{||}}~~~~~~~~~~}}}}}}|||||{{{{{{{zzzzzz{{{{{||||}}~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}}||||||||||{{{{{{{{{{||||||||}}}}}~~~~~~~~~~}}}}}}||||||||||||||||||||||||||}}}}}}~~~~~~~~~~}}}}}}}||||||||||||||||||||||||}}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}|||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~x|prnlx{mvqttp}mhjjt{r{}~zrzrznrt||zsl}~}{yt|uwtq{ifhhsxs{w}p{p|ov{rvp~zxtx}yytszryqurq{jghlzuxx~{}wwzzxo~wyx~spvtsuvrvsrvpuotzhiio~rw|~~yp|ruzz}{jomujtyqov~nstpunxwhkjsqw|}xvlpzq}vfuzgxxgvwrp|wluqruo|vjln{{u}|}~urofvxuri}si}oi{|spspovqussplmrt}w{|vnlhk|t{nslq}jn}{us{{lutrwrwonpzrwzrmlftztyl}zi|vhv~xturovruvq~xmosvyy~|{wolii{tyotnp~ll|}xv}zkvssvstrpr{~rvztlkgvxs~yn{j{wht~zxxppvruwp}{oquuyy~z~{yolhm|qyqxntlm}|yv~xlvstvsttrtzswz~~}tmkk{st|vsvmtiv~|y|}kutsuvpzqszrv}z}xomivxpz}~smz|jq~}{zppwstwqxrsuvv{zy|{tnlp}ovzwyuqtjw~~|ykxsutwo{tv}}ru}y|zpnkyvq|~yq|{y~rnprvvx{zwvq~w~~zoz}eirmns{~vp}nt~}hej[lmsivhN_Zjvkft|~zt~}{q~sxkwnljlw~{y~xkiw_ckaeetpen|m|nx|z|gf}uk~jzy|jqtphdeWe}tsqor|}~}nxxihtmvaq{gpity|p{{xbhpkwzlwm{}y|~shx}ovnq~sjfyi[pftp|ttwzxvuq|lu{}risrkxgv|spg|mq}xbigmcbupln|s}{s{wzq`spw|vwowwg|q|ijtttimwk]mzwy~~wpsnc`vxw{qvum|}wy~tqt~ph~wmktvcy}yr|x|o[ffzww~{xixxosp|woww|tvvmmq}tz|}xtx{w_d\mtf|jznqweov~tyv~xv}x}}vw|y|rruf_Vezh}}ljuizrs{yuwzwv|vty{{{s}sl\X_unsxysqvhtmmzvzqmsqxt~u~}x{{vyi^d}tqz{ue}p`xxiswsvtfvzzxpv|{x}ywuifgx~}ni{rhrrgfu{z~seotytny|z}xy}yzyqxo~yzoert`lzefzsy{jgussrmo}tzx{o|wqn~atggb_w|r[jniemnrywvtyluphswpv}rtnmgnqd`cSe^nmxvz{y~lt{vkqf~ogosmljl|uqswyzuZYVp_Ycgzz|joqbexiqowpxxtvyzuovvw[O[pphl|yr|q}szpr||}jhpztwm`qw|ry^bqz}h}f~}qsyq{zryimpxqngx_rjr}{x|upzvmoowvz~xzwys~yzzr~kooy{lgoblfftvikttuszyontsvwwqkmcllWoiy}]q}cuuhpiexzoyv~rny}~lsnxig^`jjnn}kwvzjuy}tvvprhwftzwvv||t|{yoxofu|xdzecf]pw{xquvqt}wilvy}~xyw{t{{y~{prhrs_arfhwkckffnwwps{~yzxoyyn|u|vw|fsu]s|npmldkilkjo`fovyqs|}{o[`pilqwk\utoovievhwigwlrwzkhomzsvrnorb_hmz{ld~ttwgkbkwauxmmpzxooy{|{okwmlnmyrrph|uvnicfoimxvlwzstxwzx~~~xz{vuyw}rl~w}qnfksghvnmnutowxuq~{vwvpzqxyu~tbrr{pzssrj}yspsfgxk~tut}zromyzz{xm`lksfu~z|sn~vly|qrz{}xnll|srxx{wxw_}|c~ywSQJ@Un[m{axnwislsqyht}oleZbj_pp~s{nqgiintqhr||vds}p|}zu~y~qwrjl[VWeb\\BHFL^bJqme{o{nx~v~pr{udlt_e]WcR]QMHZmwj|{mzm`NZg\vx}`w}[vqTfwuvvshfonwarxjnonx{x}qnrnrrh^TX]x{~|m~ppx|t}pez{trmcphovpq{uzxlprsrti|yjewVbkT^hh_szfeg_ll^loignvm~}}}ymi}zsj|klw^p}}{y{qrnsthrjizz~tuww}rnglixyvonn[\xos{}}s~xt|~}y~}wvql_R[jhnpvx~z~~qmv_cyb^uxsuzdoup{mouxxvz{zxxpn^mxr|q~qp|{ts|vvo}xwqu{jgtl|wwt~~zz{pjiq}chmo`c[dogw}u}yq~r~zpoi~atqn`^_kkkps}|vq~g|yoo|~{{ookvv`cvnps{b_xwy|~zn}vni~||tz}zmjntpblm]nn{gjwu{wyx~}}plsmutrtgrttndlys}~~uvvxzrplu|z||ywtz~|rzlv{uqijrsxwy}~omnanqqtuVaeksjm|~x|vq|~~y}~v{wtymnlxx~io{|zuj|}w|~fhrfkzyxsysrz~vwou~}{t{uyqpzwyk}{k}~y~o}jq|y}|xv||ystujstwwzzkn|jlvurtw|sqjwzr_fsotwbpxvv{{w|r}z|}yrpkook`ltowsvbbumk{}urw}u|tku|qghnfuplvt|oou{ysj}{pn}uklwupiabanqwpr{yfahowgdmfxnf\qtsz~sjwy~}yxs}z}vqptv{ronw~}yfkhtol`s{tvztoxt}~x}v|xpjnnn|ufwv{y{wy~~vziuz|ltr}nr{x|}spn|yss~zzxj|}y~xquowna`iqynjjo}zvi{}x}qxw{z|z}zwswzpluy|{pxszuhrw|}urrxrq~tkluwu~znzxoqmr}{}wnttyxxm|uvvxstyzyprzxvrlll||t}}uxsylkrwhtppzyvfutvzvqkxyi~yy||{uuxk|z|rnoqtwt~tvfrwsrmljsr{}{yx|o~ztosjzy~shp}qjpn~tt_epoqpvpzv~~r{xoy~zywzm{xt~uklt{rkmduoscfxt{{xy{y}zvx}|}y~u}tkkprrf`id{|xyt~tnr}{s}}yv}w}}w~p}|x~qdensvnhmmxyvyx}vtt|}z~~}~yry|{v{rysls{|zy~~uzupxtny~y{}uwz~~wmogyzzs~}znm~{oyrnmzyzx~ww|yxv}}}}v{{unlby|yqy|~yz}{{rt|}xy|q~up}upu}zx~t}}ww~|yvpi{~x{|yyt{rw}fqvuv|to~|pt~uov|z|y}zqngj}u~yw}|s|nz}ozz{yv|sw~yv{|{ytt|okmusoklalzw}{|z}rq{v~z~}xy||{rqznpvzwuriz|rtyz{tptizy{lsswy~q{{s{xxuz{{~w|uz~|u~}{~~vw{s|}px{}|~t~wy~wsry|vv}wzvsw|qv{|uphzx|}{zx{su|zz|{xx~wv~{|}{vtm{u~|{w|wx{zssvk{zmuyzz|mz~zut~xtqy}|vz{zvp{z~~yw~q~rvx||~n||vpwrppz~zt}zvtqt{ztmmip}x}}~|zt}wx|uy}~w~yyvznqx{tqoko}~{}{{~z{||vpulp|xwqsuv{ppz{u}~z{ztosy~{wrqs||uyvs{{quz~wp~|}}~y|~wzpwklnuurnkhzx~yywwn}~zzwz~~~{runpstqnljt~|{zx{~zzwsotmt|{}x|y}~~x~}t~losxvtqqvz}vyyv|t~}z{|xv~x~szop~kfiprpkln~{~~x}~yxy~x}wntiiospljjv~~}}yxzx|}{|r{~p|||t}|~{~n}ljmqpomny~|~w|~}sw{~~~{}qvyw|vu{iuwdbejkkjjp~zzz{y|~zwt|kt|ifhkkjikqz}xxst|~~wv{~~~xz~yxu~pvkgioppnow}{wvwr{||~~~|}rqxsz{toxjn{ieeknomnt|zxzwuv}y~}vs}ns~mjkoppopwy{{ts}}|xu{}}|}tuzxwvszpnpttsqrz|{uvwwx}z{{|z{ptxu|}ut~oz~kikoonmox~|u{u|y~~}~|r{}{x{~o{llnqpnlnz~~zs|~}qx}||}|t}}~u}|qwkklnmmln|~ys~~|qz}|||w|}uwrqklmllklr~{vs}~{s}|~zw}yr~vsojknnmklr~}~|vu{v~zw~{~yr}supkknmkijq}~~{uu|xwv}|~xssvnjjlkjhiq|}|vu~xwt{{~xr~srmiilkkikq~}|yxw~}yu|{}~wp{tpojkmkihjq}}{{yw|}~ytzz{}wozwpphjlljhhn{{|xvz~~yrwyz}zpvyl}uiiijiggmy{~~yw~z~}~{rv{z}~zrs|lxxhhikihgku{}x{{z{}||~~tsxy|zrn{nr|jhhjjhhjszyv{~|{}~wrwxy|~zulvuk|pgijkihjr{wv~x}||~ypsxx{}|wnpzkwxhijmmkkp{~x{|x{|{{}{sqwwy||xrlypp~njkmmmloxxxt{~{y{~|upuwy{|ytmywn~rjlnomlnvywuwzy{}~wptwy|}wnu{m|wjlmommmt{w}w{w{yz}~zsuyz|~}ypq}nxzklmnmllr}{v{yyx{zz||styz|~}ypp}ov{jklnnmlp{|vzzxy|{|~}ttyz|~}yqn{ot|lklmmllq{|vy|w{~||~}usxz{||xqm{pr{kklnmllpy|wz~z|~}|~|tswy{}|wol{os{kklnmkkpy|w{}{{~||~{ssxyz|{won{ntzjjkmlkkpz|x}}|{~|{}zrrwy{|{wno{muxijlmlkkpz~}zzy|{|~xrtxyz|ytlqykyuikklkjlr|}}}{x{|z{~~wquxyz{xskvwl{phklljjks}}~|}x||z|~|tquxz{{wqjxsn|miklkjilt~|}|}x~~~{z|~{tqvxyzzwqkyro{kiklkjimu~}|~y}}{y{~{spuxy{zvpkyppzkiklkjimu}|~y{}{y|~zsquxyzzuokzpqzjjklkjjow~|~x|}zy{}zrptwyzzvokyqozkjlnmlkow~|~x}|}zy{}zsptwyzzvpjxso|nkmnnllow~~|}w~|~zxz|{sptwxyzwrkxvn|pkmnnmlnv~~||wyzxy{|uprwyz{xtltzm{tknnomlnt}~}}|y~w{yy{~~xrswyz{zunp|nxxkmnommms{~~{|zy|yx{~zsrvyz{zvpm{qs{llnonmlpx~{}w~{{y{}|urtxzz{wrkvwm|qjmnnmmov~~|{yy|zz|xrsvyzzytmp{mvwjmnonmns{~{~z{~{z{~zsqtxzzyuokyrp{lknonmmqy{}y|{y{}{tqsvxyyvqjuumzojmoonnpw}}zz|yz||upruxyyvrjqxkxsjmnonmou}}|~y|zy{~}wqqtwxxwrkmyluvilnonnot|}}}z|yxz}}wpptvxxwsllymswjlnonnns{}{z|zxz|~wqpsvxxwrlkynqxjkmonnnsz}z{}zxz|~xqoruwwwsmjxopxkknoonosz~zz|yxz|}vporvwwvrlkxnqxjlnponos{}~{z|yxy|}vposvwwvrlkymrwjlnpoopu|~}|y{xwy||vposvwxvrkmymtwjmoqpopu}~{~x{xxz|{topsvwxuqjpylxtjnoqooqv~yyzxxz}zsoqtwxxvqkuwmzqkoppooqwx~{~zxy{~yrprvyyyupkxto{nloppoorx~~~y}}}zxy{ysqsvyyyupkyspzmloppoorx~~~y|~}zxz|ysqtwyyyuolyrqzmmoponnqx~}z{}{yz|xsqtwyyyuolzqrzllnponnrx}}z}~{yz|ysqtwyyyuplyrpzmlnponnqw~}}z~~{yz|ysqswyyyupkxsozmlnponnqw~}}~z}|yz|ztqsvxyxupkvumznknoonnpv}}}~{{|yz{~{tpruxxxvqkrxlxrjnopnnot{~}~}z}zyz}|uqqtwxxvrloymuujmnponosz}~}{}zxz|}wqpsvxxwsmkxoqxklnponorx~~z|{xy{~~yrpqtwwwtpjtulyoknopooqv}~{y{yxz|{tppruwwuqknxltujmoqpopt{{{}yxy{~|vpoqtvwvsmjwqoylloqpppszy~{~zwxz}}wqopsvvvsoittmyokoqrqqsyzyzxxy|~yrooruvwtpjqwlwskoqrqqsx|}x{xwx{~ztooruvwurlnynuwloqsrrrw}}wwzy}zuvy}{|wwusmhfgmt{ysqsw{|{zxxz|sq~uvlgffgikllp|{zywqmijotxyxvux{~~z{~~{xxyzsn|sz}}}~}xvzzvx{}}}x~{vy|sollmqrrngbacghihe_^jbdk_adffghmt||wtssuutohcbfjmopoln|u{w{}~~~zx{zzx}{z|~zuuwz||{wqs~rx{oprsqqpty~|xvuvvy{y~xsstvwwtpkqwkusjmopooqv|~rzyp{vqnmoqtusnifhknpqpmjuwp}vrvxzz{}|}|yz{}|vpnoqssrojgrmhrheghgffintxyxusrtux|}|z{}~~}zur}xt~sqrtsrsuz~~||wq|rs{uqopruwwtojiknpqqoklxqq{qpsuvvw{~|zz{}~}ysnlmoppnjffphhpecdfeefintxyxvttvx{|z{}~~}zvtxvursutttv{~{|xq|ts|vsqqsvxxupljlnqrrolkwrozroqttuvy~~}zyz|}}ytnklmnnmjfeokepicefgfginty{{ywwxy||yy{|}}zws{}t~{stuuuuvz|{~}sx|qy{vsrtvxyxtolkmpqrqnkqxnvypqrtuuw|||yz{|}{wrmklmnnmjfgqhiqgefhhhimrx|}|zyyz|{xyz|||yvt}|tystuvuvw||{~}sy|qz|wutuwyzyupmlnprrqnlryovzqqstuvx|}~|zzz||{wrmkkmnnmjfhqjirjghijjknsy}}{{|~~zwwyz{zwts}zs~yssuuuvx||||t|{s||xuuvxzzxtpmmoqrrpnltwnxxqrsuuwy~~z~{yzz||zvplklmnnlifkqgmqhhikklmqw|}||~{wvvxyywtrw}sw}usstuuvz~}~wxux~zxvvxyzyvrnmnoqqpnlpxpszsqrtuvx|}}|zzz{|zwrmkkmmmligjrjjskhikklnqv{~}}~{wuuwxxwtqu|tv}ursttuvy~~wxvx~{xvwxzzyvrnmnoqqpnlqxoszrprttuw{|{~}{||~~|ytpopqrqpnlrwnsxpnoqqrtx}|z}{|}~~|xspopqrrpmmtvmuvoooqqruy~|z|||}~~{wsppprrqommvtmwuoopqrty}{{~}{xvvwxyxutsuwxywtqqxqmuojjjkkmotx|~~}{|}}ywwxxwtqmlmoqqqompxrpysoooppqsw{~~}{{|~|xuttsrpljlrjjrmjknpruzxyxw~}zyyz{||yvrqrstutrqu|uu}xttuvwx{}xtqqqqqpmknunmupkklmnorw{}}||}}{xsomllmmljhkrmktqlmoprtw|}{}}}~~~{wsqqqrrqonpwsnwuonopprtx|~~}yvuuvvusqryxpxysqqrstvy~zx|}{yyyzywtpmkllmmkjjpskpvpnnpqsuy~~~~~~}yurpppqpomlpvnnvqmmmnopsw{~~}~~{wutuvvusrszwrzytsstuvx|~yv{~|zyxyyywspmllmmmljkrtlqwqopqrtvz~~~}}~}|yuqooooonlkounmurmmnnoqtx||}zvtsttttrqtzvrzzustuvwz~|y~v{~|yxxyyxvsomllmmmlkmtsltwqpqrsux||}}}}|zwsponooomllrtlpvpnnopqsvz~}}~~{wtssstsrqrwzru|xttuvwy|~y|xx}}{yyyyywuqnmmmnnmllrvopxtqqrsuwz~}~}}}|{xtqonooonllqunnvsonopqsvz~~~}~~{wtsssssrqqvzsu{xutuvwy|z}yx~}{zyyzyxurommnnnmlmrunqxtqqrsuwz~}~~~}}}{xtqooooomlmstmpvronoprtw{~~|}zwtsssssrqsxxqwzvtttuwy|}{x|~|{zzzywtqonnnnnmlourmuvrpqrsuw{}~~~~|zvsqppponmmpupmutonooprux|}~{xusssssrqquysryxtsstuwy}|~}y~~|{{{{ywtqonnnnmlmruoovuqpqrsux{~~~~|yvsqppponmnrunnusonopqruy|}}{xusrrsrqpquxrqxwsqrrsux{~|~~}}|yvsqpppponnrvqovvrpqrstwz~|~}}}|yvsqpppponnrvrouvsqqrstwz~|~~}}|zwtqpppponnqvsntwsqqrstwz}|}~}}}|zwtrpppponnpuuorwtrqrstvy}~}|~}}}|zxurqpppoonotvpqwvrqrstvy|{~}}}|{yvsqpppponorvsouwtrrstvx{~~{}~}}|{ywtrpppoonnquuosxusrstuwz~~}{~}||{zxurqpppoonotvqpwwtsstuwz}~z~~}|||zxusqpppoonorvrovxtsstuwy|~{}~}|||{yvsqpppoonoqvtotxusstuvy|~{|~}|||{ywtqpppooonquupsxvsstuvx{~~|{}}||{ywtrppooonnquuprxwtstuvx{~~}{}}||{ywtrppoooonpuvpqwwtstuvx{~~}{~}}||{ywtrppoooonptvqqwwtstuvxz~~}{}}||{ywtrppoooonptvpqwwtstuvx{~~}{}}||{ywtrppoooonpuuprwvtsstvxz~~}{~}||{ywtrppooonoquuprwvtssuvx{~||~}||{yvtrpppoonorvtoswusssuvx{~|}~}||zxvsqpppoonosvrotwusssuvx{~|~~}||zxvsqpppooopsvqpuwtsssuvy|~|~}||zxusqpppoooptvqpvvtsstuwy||~}}|zxusqpppoooptuppvvtsstuwy|~|~}}|zxusqqppoooqtuppvvtsstuwy|~|~}}|zxvsrqppoooqtuqpvvtsstuvy{~|~}}|zxvtrqpppooptvqpuwtsssuvx{~|~~}}|zxvtrqpppooptvrpuwusstuvx{~}}~}}|{yvtrqpppoopsvsoswutstuvxz}}}~}}|{ywusqpppooprutprwvtsttvxz}~|~}}|{ywusqpppoooquupqvwusttvwz||~}}|{zxvsrqppooopsvrptwutttuwy|~}|~}|{zxvtrqppoooprutprwwuttuwy{~~{}~}|{zywusqppooooqtuqqvwvtuuwx{}{}~}|{zywusqppooooqtvrpuxvuuuvxz}||~~}|{zywusrppoooopsvsptwwuuuvxz||{~~}|{zyxvtrqppoooprutprwwvuuvxz|~}{}~~}|{zyxvtrqppoooprutprwwvuuvxz|~}{}~~}|{zyxvtrqppooopruuqrvxvuuvxy|~~{}~~}|{zyxvtrqppooopruuqqvxvuuvxy|~~{}~~}|{{yxvtrqppooopruuqrvwvuuvxy|~~{}~~}|{{yxvtrqppooopruuqrwwvuuvwy{~~{}~~}|{{yxvtrqpppoopsutprwwvuuvxy|~}|~~}|{{yxvtrqpppooqsuspswwuuuvxz|~}|~~}||{yxvtrqpppopqturptwvuuuvxz|~|}~}||{ywutrqpppppqtuqpuwvutuvxz|~}~~}||{ywutrqppppprtuqquwvttuvxz|~}~~}}|{ywutrqppppprutqquwvutuvxz|~}~~}}|{ywutrqqpppprutqquvuttuvxz|~}~~}|{ywutrqqpppprttqpuvvttuvxy|~}~~}|{yxvtrqqpppprtuqptvvutuvwy{~}~~}|{yxvtrqqpppprtuqptvvuuuvwy{}}}~}|{zxvtsqqppppqturpsvvuuuvwy{}~}~~}|{zxvusrqppppqsusprvwuuuvwy{}|~~}|{zxwusrqppppprutqquwvuuvwxz}}}~~~}|{zywutrqppppprturptwwvuvwxz|~}|}~~}|{zywvtsqqppppqsusqrvwvvvwxz|~||~~}|{zyxvtsrqppppqrutqquwwvvwxy{}||}~}|{zyxvusrqppppprturqtwwvvwxy{}|{}}}|{zyxwusrqppppprtusqswwwvwxy{}}{|}}|{zyxwutrqpppppqsutqsvxwwwxy{|~{|}}|{zyxwutrqqppppqsutqrvxwwwxy{|~~{|}}|{zzxwvtsqqppppqsutqrvxwwwxyz|~~{|}}|{{zywvtsrqppppqsutrrvxwwwxyz|~~{|}}||{zywvtsrqppppqsutqrvwwwwwyz|~~||}}||{zywvtsrqppppqsutqrvwwvwwyz|~~||}}||{zywvtsrqppppqsutqrvwy~xsqprw}{snmnoqtw{~{wtpnnmheehihgghikmoqsvxz}}{z|wrqpnmmnnnooppopqrsstvvsqrttrponnnopqstvx{~}xtplifdcdfgfhoux{~|}}||}}}}||{{{{{{zyxvuuvxvstvwxxyyzzzyyyyyzz{|~~~~~~~~~}{xurpnmkkjjlmliilnnnnoprtvxz|~}||{ywusqnljhfeddddfhklklquwxz|~||}}}|{{zxwvtsrrqqqrsutqqsuutsttuvwxyz{{{||}~~|{}~}|{zyxxy{zwvxzzyyyz{|~~{z{{xtsttsrponmkjihgggghjlnomnquvwxy{}~}{zxwusqponnmmnoomkmoponnopqrsuvwxyz{|}~~}}~}||{{{{}}|yz}~}}}}~~|zxxzyurrssrrqponmlkjjjjjkloqpoptvwxxz{}~}|zywutrponmlllmnnkjlnonnnopqstvwxz{|}~~}|{{zzz{}}|zz}~~~~~~|zxxyyvsrsssrrqponmllkkklmnprrpqtwxyyz|~~~~}|{yxvtsqonmllllmnnljmopooopqstvxyz|}~}|{zzyyyz{|}{y{}~~~~~}{zxyzyusstttsrrqponmmlllmnorsrqrvxyyz{}~~~~}|{zxwusrponmlllmnomklnppppqrsuvxz{|}~}|{zyyxxyz{|{yy|~~~~~~}{yyzzwttuuttsrrqponmmmmmnoqssqruxyyz{|~~~~}|{zywutrqonmmlmmnonlloqqqqqrtuwxz{}~~}|{zyxxxxxyz{zxy{}}}}}~}|{{|{xuuvvuutsrqponnmmmnoprsrqruwxxyz|}~~~}{zywvtrqponmmmnoonlmpqqqqrstvwy{|}~~|{zyxxwwwxyzzxwy{||||}~~}|}}{xwwwwvuutsrpoonnnnnoqrrqqsvwwxxz{}~}|zywvtrqponnnnopommoqqqqrstuvxz{|}~~}|{yyxwwwwwwxvttvxxxxxyz{}~~}}}}|{zyxvutsrrqqqrstsqrtvvvwwxy{|~~}}}}|{zyxwutsrrqqqrstsqqtvvvwwxy{|~}zvtrrsstvwwxxxxyyxvuwxyzzz|}~}~~{xwwwwvutsrrqpppqrtuwyzzwvvvusrqqsvy}}zyyxwutsrqppooppqstvxyxwy{}}}}}~~|ywusqonmmmmnnmklopqqqrstuwxz{|~~}{yxvusrqpppppnllnpqrrsuwz|}zyzzyyxwvvutsrrqqqrstuutsuxyyyz{|}~}|{yxwvvuuuvvvustvxxxxyz{|}~{zzzyxwvtsrponmllllmnoomnpstuuwxz|~~}}}|{zyxwvutsrqqqqrstsrqsuvvwwxyz{}~~~~~~}}|{zyxwwvvvvwxyywvwz{{{||}~{xxwwvvusrqponmmmlmmopqpopsuvvwxz{}~}}}|{zyxwvtsrrqqqqrssrqqsuvvvwwyz{|~}}}}}||{zyyxwvvuuvvwxyxvwy{|||}~~~~{xwwwwvutsrqponnmmnnopqqppsuvwwxy{}~~~}}|{zxwvutsrqqqqrssrqqsuuuvvwxy{|}}}}}}|{{zyxwvvuuuuuvwxwvwyz{||}}~{yxxxwvutsrqpponnnnopqqqpqsuvwwxy{|~~~~}|{zywvutsrqqqqrssqpqsuuuuvwxy{|}}}}}}|{zyxxwvuuuuuuvwwvuwyz{{{|}~~{yyyyxwvutsrqpooooopqqqpprtuvvwxy{|~~}|{zywvutsrrqqrssrqprtuuuuvwxz{|}~~~}}|{zyxwvvuuttuuvwvuuwyyzz{|}~~{zzzyxwvutsrqppoooopqrqpprtuvvwxyz|~~}|{zywvutsrrrrrssrqqrtuuuvvwxz{|}~~~}}|{zyxwvvuttttuvvvutvxyyzz{|}~|{zzzyxwvutsrqppooppqrqpprtuvvwxyz|}~~}|{zyxvutsrrrrrsssqqrsuuuvvwxy{|}~}}}}|{zyxwvvutttttuvvutuwxyzz{|}~~{zzzyxwvutsrqqpppppqrrqpqsuvvwxyz{}~}}||{zyxwvutsrrrrrrstsrrsuwwxxyz{}~}||{{zyxwvutssrrrrrsttsrsuvwxxyz{|~}|{{{zyxwvutssrrrrrsstsrstvwxxyz{|}}|{{{zyxwvuttsrrrrrrsttsrtvwxxyz{|}~|{{{zyxwvvutsrrrrrrsttsrsuwxxyz{|}~|{{{zyxwwvutsrrrrrrsttsrsuwxxyz{|}~~|{{{zyxxwvutsrrrrrrsttsrsuwxxyz{|}~|{{{zyxxwvutsrrrrrrsttsssuvxxyzz|}~}{{{zyyxwvutssrrrrrsttsssuvxxyzz|}~}{{{zyyxwvutssrrrrrsttsrsuvwxyyz{}~}|{{zzyxwvutssrrrrrsttsrsuvwxyyz{}~}|{{zzyxwvutssrrrrrsttsrsuvwxyyz{}~}|{{zzyxwvutssrrrrrstssrsuvwxxyz{|~}||{{zyxwvutssrrrrsstsrrsuvwxxyz{|~}||{{zyxwvutssrrrrssssrrsuvwwxyz{|~}|||{zyxwvutssrrrrssssrrsuvwwxyz{|~}}||{zyxwvutssrrrrssssrrsuvwwxyz{|}}}||{zyxwvutssrrrrssssrrsuvwwxyz{|}}}||{zyxwvutssrrrrsstrx~}|||||||}~~~||}|{||zxvuvx{~~}||zwutsrqqqrstvwz|~~|{zxwwvvvvuuw{~y|~~~|zxvutsrqqrrstuwy|~}||zxxyz|}~~yz~~}|zxwutsrrqqrsuwz|}~~zxy~~~~}|{zxwvutsrrqqrstttuwy{}}zxx{}|}}}~~~~~}|{zxwuttttsrrstvxz|~}{xustx~~}||{zyyxwvvvvusrrrstttuvvwxxz{|~}{yyxwwx{~~~~~~~~|zxwwvuttttuvwxz|~~|yvtrrsvz~|{{zxvuuuuuutttttttttuuvwxyyyz{~}|{yxwvvxz~~~~~~}|zywutsstuwxz{|~~{xusqrtx}}{yxwvuttsssssstuuuutuvwxxyyzz{|}~}|zxwwxz~~~}}}}~~~~~~}|zxuttuvxz}~{xutstv{~{xwuttttttsrrsttuuuuvwwxyyzz{{{||||}}{{z{}}{zyyyyyyyz|~~{yvuuvy||yvttvz}zwuttttttsssstttuuvwwxxyyyz{|}||{}~}}}~~|zxusqpnnnnnpqsvy|~~|zy{~~zyxzzvrpnnnnopqstvwxy{||}~~~~~~}}|}~z}{}|{zyzz{|||{ywvtssstuvxz|~||~|yuqnlmpu|}{yyyzz{||}}}}}}|||||}}~|wtv}}ywwxz|~}|zxwuttuvx{}~}~{xwz~~}|zxusppqv|~~~}}}}}~~~~~}|ywuuvy~~{zyz}|ywvwxz|}~~}}||||}~|wtrrtvz~~}}}}~}{yxy}~~}{zxvsqommosw|~|{yxwuuttvx{~}zxxxz}~}{zyyxxxyyyz|~}|zyyxxyyzz{|}~~}}~|yvtqonoqtx|~~}{yxwvvvvvvvwwvvvuuuuvy|~}~{xurqrtx||wsqrtvyz{{zzyyyyyyz{|~}||~yvuvx{~|zwusrqppppqrrstuvvwxxyyyyyyz{}~}{zzyz|~~|zyyzz{{zwtqopruxz|}}}}}}}~|wspnpt{}zwutsrqpppooooppqrstuvxyz{}~~|ywvvx{}{ywuttsstuvxy{{zxvsrsvz}|zywvutsrrqpppppqsstvwx{}}~~||||~~xsqpqsvz}}{xvutsssrsssstuvwyz|~|ywwz|~~~zwspmllnsy~}|{zyxxwxxxyz|~||}zz{|}}}~}~}zwtstwz|~~}||{||}~~}~~~{uy~}{yxvtsstux{}||~|vrt{~yuttuvwwxyyyxwvuspnlkjkmqw}zvuy|zzz|}~}|yvtstuwyzyxwutsstwz~~zupmns|}zwvuuuuttttsssrrrrrrrrssstuwz}~{xussvz~}|{{zyyxxwwwxxyz|}}zwutux{}zxwwz~{xusqqsvz~~|{zyyyyzzzzzzzyyxxxyz||ywutuvy{~~}|{zyyxxxxxxxyyz{|}~~zvssux}}||{{zzzzzz{{{{{zyxwwx{~}}}}|xusstx|}yvtttvxzzywusrrsuwy{|}~}xuux}~{ywvuttuuvwxyz{|}~~|zyxwvuvwz}}zwutrrqqqqqqqqqqqqqsuw{|zwtsrsvz~{xtpnnoqsuwxxxxxxyz{|}}xrnkjmrz~{yvtsqpoonnnnoopqstuwxy{|}~|zz}|xtqonnmkijlou~~{yxy|}xtromlkkklnt|~xrlhefjpv|~zwspnmlllmnprtwxz}|yokklnoqrstvy|}{{~~~ytqnmjfbacfijkkkmnnmlkklnrvz|~}~{yvsojd_[Z[]afkpty}}xqjhkrz}{zywvutsrqonorutrv|~~|yvtqpnlkihikosw}}{xvspnmmosw|~|zxwwxz}zupmllmnoonmkifcbeihgmssty~~~~|~~|zwutsrrssssrqppoopqtvy|~|zz{|{vwzutwursux|~|zwuttuwy|~{vqnkknszyx~{uwvsoljiihhijjkkjjjiijlptx|~~~}|{zzzz|}|xyztwwu{}{xvuttux|~}|{|||}||{zxwutuz~~}}~~{wusqpoooqtwz|~~~}}|zywtrqonmmnoppmlrpsvtz}}|||}~{zz{}~zvqmjhhiknprstvwyz||||{zxvuuxytxuwuruvwwxxyz{{zxvutvy}~|{zz{ysxxz~}}}|{z{{|z~}{ywtromkjhgffghlqv|}||}~~~}}zwusrqqqrtx~{{}|{}|xwuuuuuvwyyzyxwwy{~{xuux|~}|}~~}{|}~|yvsrrtuwwwvuuvxyzzxurpnnnpqrrrrtxuuwvy{xxyz{|}~~|xuttvx{|{zxwvuuvwy|}z~{{{z~}}}}~~~}{xtqonortvxy{}~~|xw{wx{{|zwtqnmlompy}{wtqpprsuusrpprvz}~~~}~|yvtux|{yxwvutsqomlstuxyzuutttuvwz}~}zyxyz{zxvtsrrstvx|~}}{{}zywy{}xussuwxxwvwy{}}|yuqonnoppqqqpolpsqssurux{~~|{z}}xtstwz|}{yxxz}~|{z|~|{~}~|xutuw{~~}}}{zz{||}}}}|yy~~~|zwutrpppvxvz||~}|zwuttux{}|xtpoquz}~}}~}zyy{|}}}~|zyyz{{{zzywsrwuvwtvyyzyyxxxz}|zxvvvvvvvwy|ywvvxz{zxvuvz}}yvuw{|yxy}~|{|}{ywupnsqssrwz|~ywx{~}|{{{z{|{vsrrrrpnnosz}{{{|~z||||wxxxxyz|~|{}}|~}{xvuuttqsyx||}|}~{xxy|}{zyzz|}~~{yxy}}{|}~}}}~|{z{{|{xtqopsx|}|{z{}~{wsrstwy{|}~}y~~{xutssrrqqqy{z~}{z{~}{yz}~~}}~}|||{{|}~~|yvttw{~|xtywwxux{{|{{zyyz}~{xvuttttux{yxy|}~|zwvx{}|||zyxwvvvwwvspmlmqw|}|}|}~{xusrrstuwy~}yvttuxyzxurrtw{}|{yxy{~~~}}}}|}}}}~~|zv{}{}}{z}}~~}|||~~{yz|{xuuwz|~}{ywuttstsuw~~~|{|~~||~~~}yvuwz~~}}zxxxyyzzyxvstzwxxzvvyyzzyyz{}}{|~}{zyyy{~||}}zxy{~|zyy{~z~}}~~~~|yvrqqtx|~~}}}~~~|z~|}~~~~}}~|yvussstv|}y~{xwwy{||zwtrtvy||zxvuvy|~{xwx{~|zxw~zyzy|vvwxyyz{}}~}zyy{}~}{xvtrqrrtw}{y~|||~{yxy|~zwtstvz}~}||~~{yxwwwwvusrszwwyx~zxz{||}~~}}~|zyyz|~~|{{}|zyz}}|}|{}~~{~}}~~~}{xurqruy|~~}||~~|{{||}}}||~~}}|zxvvvxz}yw}|~}}~|zyyz|}zxxz}}{zz|}}zwvvx{~}}~}~}{{z{{|}~}{z|~}zxxy{}}}|zxvtttuxzzu{~~}|}~~|zvsqprux|~~}}}{zzyxwwx|y{|{{~{zzz{}~~}}|zz|~~}{zyz{~}zyz}}{z{|~}{y}|}}yy~~||{{zxvtrqruz~~}|||{|~}}~|yxxz|~~~~}|{{|}z~|{zz{}~{xwwy}~|zz{|~~|z}~z~|zxyz~}||{{{}{~|~~|||}~|yxxz}~{ywwy{}~~}|{{{|~y~~~~|{}}|||~~|z}}~~|ywuuvy}~}|{{{{~z~~~}}}}}~}||~~{zz|}~}}}~~x~~}~|yxy|}{zyz|}~}{~|zxuttux|}|{{{{~x~}}}z~~}zyyz|}~~~}}}}~}|x~}}~}zxxy|}||}~~~~~}z~~}{yvtstuy}~}|||~~x|~{~}}|yxxy{|}~~}}}}~~|yx~}}}~}{yz|~}}~~|}~}zz}~}|zwusstwz}~~~~}~|~}}~||}}zxxxz{|}~}}}}}}{xv|{~~~}|}~}||}~~~~}{|{}yz{}~~}{ywusrstwz~~}|}{{|{{}}zxwxy{|}}}}|||{xuu~~z}|{|~}|{{||||||{|{|yyz|||{yxvtrqrtwz}~||~{~z~|{{}|ywvwxy{{|||{{{ywuv~|~~|{|~}|{{{{||{{{}z{~ywxzzzyxvusrrsux{{}{}}{z{||yvuuvwyz{{|||{zwvz}~|{{}~|{{{{{{zzz|y|{{wwxyyyxwvuttuwz}{{~{|zyy{}}zxvvwxz{|}}}}|zxvy{|{{|~}{zzzzzyyz{y~yzxxyzzyxwvutuvy|~~{{{{}{yyz}~{yxwxyz{||||{zxvw}~}}{z{}~|{zzyzzzz|z{zxxyyyxwutttuwz}~~}{zy{}|{{}}zxvvwxyyzzzzyxvvy||zz{}}||{{{||~|}||zwvvvvuttsstvx{~z}~{z}}|{|}~{xvuuvwxxyyyyxwvw}|}{z{|~}}|||}~zx|wuuuuttssssuwz}~|||}|}{zz|~{yvutuuvwxxxxwvuv{{}||}~}}|||}~yx{~yvutttssrrsuwz}~~~~}}|~~|{zz{}|ywutttuuvvvvuttv|z~}|}}}|||}~x~yyzvttsssrrrstvy|~~~}{|}{zyz{}~|yvusssttuuuutttw}z~||}}}||}~|xxyzvtssrrrrrsuwz}}|{{~~|zyyy{}~{xvtsssstttutttuy{}||}~}}}}yyvz~yvtsssrrssuwy|~}|~{|~}{yyyy{}}zxvttttuuvvvuuuw||}~}||~~}||}~}w|{w~}yvuttttttuvx{}~~}~~}|z|~|zyxyz|~}{xvuuuuvvvvvuuux}z~~~|||~}}||}~|x~{y~ywuutttttuvx{}~}~}~}~|z}~|{yyz{}~{xwuuuuuvvvuutuw}y~}~|{|~~}}}}}y~{y~yvutttssstvxz}~}}~}}}}|z|}|zzz{}~{xvutttuuuuutttv|z|}~|||~~~~~y}}w~~yvuttsssstuwy|~}}}~}|{}~|{zzz|~~{yvuttttuuuutttuy|y}~}}~~~~~zyxz{wutsssssstvx{}~}}}~~}}|~}{zyy{}|ywutssttuuuttstw|y}}~}~~}}}~~x{}v|~yutssrrrrstvy|~}}~~}||}{zyxy{}~{xutsrssttuutttux~y~}}~~}}|}~|w|yv~|wtsrrrrrrsuwz}~~~~}~{}~|zyxxy{}|yvtsrrssttuuutuw|}}~}}~~}|||}~~xx}uz}xusrrrrrrsuwz}}|{{~}{yxwxy|~}zwussrsttuvvvuuwz|~}|}~}||||}yv~vwzvtsssssstuwz}}}|{}}{yxwxy{}~{xvtssstuuvvvvuvz{~}|}~}||{|}zv}xw|wusssssstuwy|~~}}|{}}{yxwxy|~~|yvtssstuuvvvuuvy{~~||}~}|||}~zwwx{wtsssssstuwy|~~}|{{}}{zxxyz|~{xvtssstuuvvuuuvzz~||~~}}}}yxvzyvtsssrrstuwz}~}}}|{}}{yxxy{}}zwusssstuuuuuttv|{|}~}}~}}}~}w|zv~|xusssrrrstuxz}~}|}~|~~|zyxxy|~|yvtsssstuuuutttw}y}|~~~~}}}}~{w}yv~|wtssrrrrstuxz}}||}~|~~|zyxxz|~~{xvtsrssttuuttstw}y~|~~}}|}~{v|yv~|wtsrrrrrrsuwz}}||}~|~~|zyxxy{}~{yvtsrrsttuuutttv|z||~~~}|||}|vzzu||wtsrrrrrrsuwz}~}}}}|}~|zyxwxz|~|ywusrrsttuuuuttvz}z~~~}||||~xwux~yussrrrrstuwy|~}}~}|~}{yxwwy{}}{xvtsssttuvvvuuvx~z~}zvtvy|zrlheccehmt{|yyyyz{|}}}}}}|{yvrrw|w~xqliikov}}wplhfffghjklnqv~{}{xvsrqsvz~~zvrpopsx}}x|tpprttuttrqomljiijlnprsrqomkjijkmoqsuwxyz}|yvsqooopruy~~z}~}|{zyyz{}~~|ywwwwy|~|z~{}~}}}~|xusqpoooonmlkjjnswsnv|vv}~}}~xu|~uu}}xusrrrrrstuwz}~~zvx~}sv|wqpruvwxxxwvvutttvy|~~~}|zzyyz{}~{upvypnuvqmjihhggghikmptvxyzyxwwxz}~~~{xvuttuuvvvuutux}~w}|y}{xusstuxz|}}|{yxwvvvvxy|ywz{}{{{||}}~||}~|zxusqppqsuvwwuspmkihhhijkkllllmqx|xt|zz~{~}ywvuutttuuwy|~}{yxxy{}{wuzyt|~wstwz{|||{zyxvuuuwy|}{zyyz{|}~~|zyxwwwxz{ytnrxplsvrmkiiiiijjlmpsvy{|||zyyyz}}zxwvvvvwwwvuttw|~wz}x}}zxvvvxz|~~|{yxxxxxz|zv|yx~{yxxyyyz{|~~|~~|zxvtrqqrsuwxxwurpmlkjkllmnnnnnorx}{uz}y}||ywwvvuuuvwy{}~|zyxyz|~|xxyx~xvxz|}~~}}|zywvvvxz}~|zxxxxyz{|}}}|}}{yxxxxy{|{vpszsntxtpmllkkllmnortwz|}}}{zyz{}~{ywvvvvwwwvvutuyzwyz~{yxxy{}}|{zyyyz|~~xwwz|ywwwxxxyz{}~|~}{ywusrrsuwxyyxvtqomlllmnopppppqsy~}vz~z|~y{xvuuutttuvxz|~}{zyyz|{y}x|xx{}~~}|zywvvwy{}~|zxwwwxyz{{||||}~|{yxxxxy{|zupuzrovxtpnmmmmmnoprtwz|~}|{|}~}|}~~{ywuuuuvvvvvvuuw{zyz||zyy{}~|{zzyzz|~}ww}vz{xwvwwwxxz{}~}}~|zxwwwxz|~}|ywusssstuvvwwvvw{{~}|{{{|~~xu|~uv}}yusssssstuvxz}~~}}~~|zywvwxz|~~|ywuuwwvtrqpprtux}~~ytx{rpwwtpmmlmmmnoprux|zwyz{|}}}|{{yxwwwy{|~~|yvsqpoooppqqqqqsw}|}|||}}ysovyqr{|zxwxxyyzzzz{|~~|zxxy{}}z|z}yy|~~}|{{{}}{yyyyzz{{{{zzz}{}{~}|{{|}~{tt{yqu{yurpppppqrstwy|~~|}~}{ywusrrstwy{||{zxvuuuvwyz{|||{|}~}|||}~{vzyu{~zvtsrrrrrrstvxz|~~~|{yxxyz}~}{{|}|zwvutuuvvwwwwvwy~z~}}}}~~|{yxxwwxz|}|wsx}ut{}zvuttuuvvwy{}}{ywwwwy{|}}|zxusqppppqrrrrqqrty}{uz|x}z|y~zwvvvuuvvwxz|~}|}~~~~}{y{}~~~}{zxvuttuwy{}}}|zwvttttuvwxyyyyy{}||{|}ztw}wrx{xtqpooooopqrtwy{}~~}|zyyz|~~}|{|}~|zxwvvvwxxxxxwwx|}{}~~||}~}{zyyyyz|~~|vt||tv}|yuttttuuvwxz|~|zxwvvwxz{||{ywtrqpppqqrssssrsuz~x{~zy|}x}~zxvvvvvvvwxz|~}}~}|~zz|~~}{yxvuuuwy{|}}}{ywutttuvwxyyyyyz}~}|{{z{|~}xsx|ury{wsqpppppqrstvy{~~||||~~}{zz{|~}{ywvvvvwxxyyxxxz~}|}}||}~}{zyyyy{|~~{uv}{tx}|xvtttuuvvwy{}~}{ywvuuvxz{||{yvtrqqqqrsttttttux~~y~}~~~{xxy|xvvvvvvvwxz|~~}~~}{z|~~}|zywvuvwxz|}~}{ywvtttuvwxyyyyyz}~}|{{{{|~}wsy|tsz{wtrqqqqqrstuxz}~}||}}{zyz{|~~|ywvuuvvwxxxxxxx{{}~}~~}{zzzz{|~}wt{}uv|}yvttttuuvwxz|~|zxwvvwxz|||{ywusrqqrrsttuuttvy~}y}}~~~yy}vy~}yvttttttuvwy{}~~~~~|zxwwxy{|~~~|zxvutsttuvvwwwwwy}|}}~}||||}zvyxu{}zwttsstttuvwy|~~}}~~}{zxwwxz{}~~~|zxvtssttuvvwwwvwy~{~}~}||||~zvz~wu|}zvttsstttuvwy|~~}}~~}{yxwwxz|}~~}|zwvtssttuvwwwwvwy~{}~}|||}~zvz~xu{}zvtttttttuvwy|~~}}~~}|zxxwxz{}~~~|zxvutttuuvwwwwvwy}{}}~}}|||}{vyyuz~{wuttttttuvwy{}~}}~~~|zyxwxy{|~~~}{ywuttttuvvwwwwwx{~{~~}|||}~}xv}}uw}|yvttttttuuwxz}~}}~~}{yxwwxz{}~~}|zwvttttuvvwwwwwwy~{~}~}||||}{vx~ztz}{wuttttttuvwy{~~~~~~~|zyxwwxz|}~~}{ywuttttuvwwwwwwx{{~~}|{{|}~yuz~wu{}zvutttttuuwxz|~~~}{yxwwwyz|}~}|zxvutttuvvwxxxwxy}}}~~}|{{||~|vv}{tx}{xutttttuuvwy{~~~~~~|zxwwwxy{}}}|{ywuttttuvwwxxxxy{|~}|{{{|}}xu{}uv||yvtttttuuvwy{}~~~~|zywwwxy{|}}}{ywuttttuvwwxxxxx{|}||{{|}~~yuz}vu{|yvtttttuuvwy{}~~~|zywwwxy{|}}}{ywuttttuvwwxxxxx{|}||{{|}}xu{}vv||yvtttttuuvwy{}~~~~|zywwwxy{}}}|{ywutttuuvwwxxxxx{|~}||{||~|wv}{ux}|xutttttuuvwy{~~~~~}|zxwwxyz|}~}|zxvutttuvvwwxwwwy}|}~~}||||}zvy~xu{}zwutttttuuvxz|~~~~}{zxxwxy{|~~}|zxvutttuvvwwwwwwy~{~}~}||||~zvz~wu{}zvutttttuuvxz|~~}}~}{zxxxxz{}~~}{zxvutttuvvwwwwwwz~{}~}}|||~zvz~xu{}zwutttttuuvxz|~~}}~~|zyxxxy{}}~}|zxvutttuvvwwwwwwy}|}}}}|||}{vy~yuz}{wutttttuuvwy{}~~}~~|zyxxxyz|}~}|zxwutttuuvwwwwwwx|~{~~}|||}~}xv||uw||xvtttttuuvwxz}~~~~}{yxwwxy{}}}}{ywvutttuvwwwxwwxz~|~~~}||||}~{vx}yuy}{wutttttuuvxy{~~~~~|zyxwwxz{|}}|{ywutttuuvwxxxxxx{|~}|{{|}~~yuy}wu{}zwuttttuuvwxz|~~~~}{yxwwwyz|}}}|zxvutttuvwwxxxxxz}~}~}|{{{|}{vv|{ux|{xvtttuuuvwxz|~~}|zxwwwxy{|}}|{ywuuttuvwwxxxxxy||~}||{{|}~}xu{|vv||yvuttuuuvvxy{}~~|zyxwwxy{|}}|{ywvuttuvvwxxxxxy{|}||{{|}~}yuz}vu{|yvuttuuuvvwy{}~~|zyxwwxy{|}}|{ywvuttuvvwxxxxxy{|}||{{|}~}xv{}vv||yvutttuuvvwy{}~~~|zyxwwxy{|}}|{ywuuttuvwwxxxxxy||}|||||}|ww|{ux|{xvtttuuuvwxy{}~~~}|zyxwxyz|}}}|zxvutttuvwwxxxxxy}}}~~}||||}~~zvy~xuz|zwuttttuuvwxz|~~~~}{zxxxxy{|}}}{yxvuttuuvwwxxxwxz~|~~~}}|||}~yvz}wu{|zvuttttuuvwxz|~~~~~}{zxxxxz{|}}}{ywvuttuuvwwwxwwxz~{~~}}|||}~zvz}xu{|zwutttuuuvwxz|~~~~~}|zyxxxy{|}}}{zxvuttuuvwwxxxwxy}|~~~}|||}~{vy}yuz}zwuttttuuvvxy{}~~~~|zyxxxyz|}}}|zxwutttuvvwxxxxxy|~|~~}||||~}xv||uw||xvutttuuuvwy{}~~~~}{yxxxxy{|}}|{ywvuttuuvwwxxxxxz~|~~}||||}~~{vx}yuy|zwutttuuuvwxz|~~~~|zyxwwxz{|}}|zywvutuuvwwxxxxxy{|~}|{{|}~}yvy}wu{|zwuuuuuuvvwyz}~}{zxwwxyz{|}|{zxvuuuuvvwxxxxxyz}~}~}||{{|}~~{ww|zux|{xvuuuuuvvwxz|~}|zyxwwxy{|}}|zywvuuuuvwxxyyyyy|||unklostvyroorqkovvsw~}~}{{wrrsqppoprrorvw}||wupmkkmrw{~~wrvzutwwwsnoonnnmnprrv|{|~}zvtqpqolprqqruwxxvwyspqrvwqs{{xw|{z{}}{xyysqpnmmnquz|||{yvussuutx|{|}|yusppqonststvx{||{}~xvvw{{ux~}xy~~{~{}~vtxvtvtqpqsuvvuwvqqqoooqsx||}z{{xx||||~zyy|~zv||x|}z~~|{{zxxwvwwssxxy||vtyuoqsqrsqooqtvvuvyurrqppqsvz|}|{{{yy{x~zy|}}~~xwwvutsstspqvvwzystxsnqrprsqpqsvwwwxzvstsqrrtx{|~~||}zzzy~yx|||}~|vvvutssssroqvvwzxstxsorsqtusrrtwxxxz{wuusrssux||~}|}{z{x~yx{|||~~|wvvuttsstsopvvwzyttyupstrtvussuxyyyz|yuutsstux||}~|}}y}x|~{wz|||}~~~xvvutttsttqouxxzzvsxysruttwwutuxzzyz}|wvvtttuw{}|}|}z|yy~}xx{|||~~~{wvvttttttsorxyy{ytv{wstvtvxwvuwz{zz|~zwwutuvwy||}~||~~y}}xz~{xy{}|}~~~zwwvuuuuuurptyyz{xtx{wsvvuxyxvvy{{z{~~zxwuuuvw{}|~~|{|{y{x}~}zxz}}|~~}ywwuuvuuvuqrx{z{{vu{{utvvwyzxvx{|{{}|xxvuuvwy|||~~}{{}~y|~xy~|xy|~}}{xwvuvvvvvsqv{{{|yuy}xtvwwy{zwwz||{}~zxwuuvwx{}{~~|{|z{xx~|yy{~~}|xxwvwwwwwtqu{|{|zux}zuvwwy{{xxz||{|~{yxuuvwx{}{~~}|{{zzxx~|yy|~}|yywvwxwwxtqv|}||yuy~{vvwwy||yx{}|{}~{yxuuvwx{}{~~}~|{|~yz~xy~}}}{y{z{~~{{{zz|{x|~|{||z|{wx|}|zzzywvuvy~}{~{~zux~{}}~}{xxyywxvrsz}|{|vw~~yvxyz|~{xz|}zz~}zwvrprssuxvw~~zyxz{wtz{trx~~|~}~}x{~xzxwyzz|~zxz}|y|}{ywsrtvux{x{~~}{zyz}|z|~}z|~{xvutwxtsyzssz~}~}}}}~|}~}~}{wvxzx{}{}~~~{}~}~{~~||}}ywvvvy|zxy{{xy|zwuutvxvsy|utz}~}}~}~~ywy{z||}~~}}z{~~|}y{|~{y{|yvuvvw|zxxz{xx}{ywvuvyxtw}xty~~}}}~~~|xy|{{~}{~zy|~{|zy~|}}yz|{vuuvvz|yxz|zw|}zxwvuxzvu||vv}~~}}}~~}}~zxz}{}}~~~{}yz}~{~~y{{}{x{|yvuvvw}|xxz|yx}|zxxvvyzvw~{ux~}}|~}}~~yx{}z~|~|||y{~}{|y|}{~yy{|xvvwvy~{xy{|xz~|zyxvxzyuzxv{~}}}|}}~~~}~{wy}{{~}~z~yy}{}zz{}|x{}{vvwww}}yy{}zx~~{zywwz{ww~|vx~|}|~~}~|{~}}xx||z|z|{y|}}|z~{|}xz}|wvwxw|zyz|{x}{zzyvy{xv}~wx~~}|}|}}|{|~xw{}y~|~{{|y|}|}z}||~yz}}xvwxw{{yz||x}{{zyvy{yu}~wx~~}|}|}||{~|~~ww|}y~{z|{y}}}|z~{|}x{~}xvxyx}{z{}|x~|{{yvy{yv~}wx}||{}~|~|{}||vx}|y~{xzz~|{|z~|x||vvyyxzz{}zy~|{{xw{{wx{w{~|{|{|}~|~{}{}yvz~z{|}~|y~y||{}~{yz}zvwzx{}zz|}x|}||{wx{{u{xw}~}{||z~{~~|z~{~~xv{~y}{~}{z~{~~}~{}{yz|{}}z~~~|yz}|w~yy~|{|{z~}z}}}z}~~~w||y{~~|}vuy|w{~z|}|z{~~}~{||yz|{~}}~z~~~}yz}}w|zy~~}{{|z}~z||z|}x{~y{~|~vty}xz~z{|}x{}~}}}{~yy|||}}~{|~~~zy|~yy|x|~{z|y~}z{|{{|{xyy}~~|ztv|{w~|z~~y}}{~}z~zy{}z~}}~z~|x{~|wyz~|z{{z}}z}|~z}}w|}x{~~|~vty}xzz{|}w{}~~|}zyy|}|~}}|{{x|~zx}x{~{z|y|}~{z~~|{}~}w~{y|~~{}uu{}w|~y||{y{~~}}{|}xz}{}}}}z~yy}~x{{y~~}}zz{y{z||{||yyyy~}}xtx}zx{z|~w~||~~~|z~yy{}{~}}}z|x{~{w~x{~zy{y{}~|z}}|{}}w{y|~~||tv||w}}y~~}|xz~{~}z}{x{~{}|~~z}xz~}w~yz~~{y{zy~|}z~|}{~}~~w}|x{~~|}uu{}w|~y|~~{zy{~}~{}{xz~{}|~~z~xz~}w~yz~~{y{zy~}|z~~|~{}~~x}|x{~~||tv|}w|}y}~}{xz~|~}z}{x{~{}|~~z}x{~|wy{~~zyzyz|}|z}}|||}x{y|~~|ztw}|w~|y~~{|w}|}~~|~{yy|}|~}|||{x|yy|y}~}~yy{x~{z|{{}|yzyz~~|wtz~yzy{}~~y{w{}~~||}xz~|~~|}zyy~~x|zy}}|xyzx{~z}{{~}x|~x{~~|~uu{~x{~y|}~}zzx{}~~{}|xz~{}|}zyz~~w}yz}}{xzyx~|}z~{{~~x}}x{~~|~uu{~x{~y|}~}yzx{}~~||}xz}|~~|}zyy~x|zz}}|xyzw{~z}{{~}y{yz~~}vuz~yz~yz}}}y~|v|~}~}}{yz}}}~}||}{y}zy|y}|yxzw|{z|{~|}||yzy}~~~ztx~|x~|y~~}~{{w{}|~}{~{y{}{}|~~{~x{}x~y{~}zxyyx}|}z~{|~y|~yz~~~}vu{zz~yz}}}y}|v|~}~}{yy|}|~}||||x||x}y|}yxzxz|}|{}|}|}~y~|y{}~}}uv|~x|~x||}|yzw|}~||~yz}|~~|}{zy~y{{y~|}xxyw~zz}{|~}{zzz}~~~xty~{y~zy}|}y|~w}}}}}{~zy|}|}|}||x||x~y|~}~zxyxz|}|{}|}|}~y|y|~~}|uw}~x}|x}~||zyxy}~~~{}|y{}|}|~~{~y{~x}y{~~}{xyxy}|}{~{~|~y}~y{~}~}}uv|~y|}x{||{yyx}}~~|}|y{}|}|}~{~y{~x}y{~~}{xyxx}|}{~{~|~y~}y{~}~}|uw}~y|}x|~||zyxy}~~~|~|y{}|}|~~{~y{~x~~y{~}}zxyxy|}||}|}}}~z|y|~~~~zux~}y}{x~}||y{~w|}~}~~|zz|}|~}|}}{y}{y|y~|~xxyw}{{}{|~}{{zz}~~~~wv{zz~yz|{{x~{w}}~}}~y{}|~|||zz~y|zz~||xxxx~{~{~{|~z}z{~}~~~vv|z{}x{|{zxzx}}~}}}y{}|~|}|y{y}yz~~}{xxxx}|~{~{|z}z{~}~~}vw|z{}x{|{zx~zx}}~}}~z{}|~|}|yz~z|zz~|}xxxw~{{~{|~{|z{}}~~~wv{{z~yy|{zx}|w}}~~|zz}}}~|||~{y}{z|y~|yxyw|{|}{~}~}}{|z|~~}zuy~}y}{x}}{{yyxz~~~~~|~|z{}|}{}~|~y{~y}~y{~~}{xxxx}|~|~{}{}z{}}~~~~wv|{{~yy|{zx||w~}}~|{z|}}}{~}}|y}}y}y}}~zxxwz|}}|}|~}~z~~z{~}}~|vw}z|}x{{{zx~zx}}~~}~z{}|~~|||zz~{{zz|~xxxw}{|~{}~|{{z}}~~}xvz}z~zx|zzxz~w|~}|~{z|}|}{~~}}y|}y~}y|}}zwxwyzy|{|}}yy}z}~trssnnrwz{sptqqrspqw|{|}{wuuvsy|zzxrlpuvrturu~vsvsrsspqw}||{zyvx{uqnoqotxwxwqlnuwrstoqz|wzvtx|zqmlkkrsrtsrmmttuwyww|}|zxvuzywwusmmsrsuwtuz||~~xqsxxstsnqy{vyuuy~{sppoqxyyzyytu{{|}~{{}|~{~}~|wz|~yx|{ronmntttutsnpuuvyywx}||~~z{yyx{~y}}~|~}~~}}|~~~~|z}|}}usw{xtwrov~xxxsvz|unmmlqvtvvvsouxxz{zx{z~~}}|~||~~~|{~}yz{z}~zwxzx|~~|wppuxsrsnov}|uwurw|{sonnntwvyxxtryyz{}zy}~{~~||~}~{{}{xyzy||xvwyw{~}}zuopuwrssmox~{vxuty}|tpoopwxxzyyttzz{|}{z~}{}~||~}~{z}|xxzx{|xvvyw{~}}{vopuxsstnow~}wywty~~vqpppvzy{zzvtz{{}~|z}~{}~||}~}|z|}xxyyz~yvuxwy~}}|xqotxurupnu}yxyux}ysqrqu{z{|{yty||}~}{|{}}~~~}}||z{~~zxyyx}{xuwxw}~}}ztorwxstsorz}x{ww|~vrrrsz{{}|{ww}|}~|{~{}~|~|}|}z|~}yxyyyzwvxxy~~}zsptywsurou}|z{wx~}ussru{{|}|{vy~}~||}|~~~~~|~|~}}{z}|xyzy{}ywwyx{~~|xqqvyvtvqqxz{zw{zustsx||}}|yv|~}~~|~|~~~}~}}|||~z|~~zxyzy{xvyyy~~{uqtyxtvtpu~~{|yy~~wttsv||}~}|wy~}~|}}}~~~~~}~~|}|~}{{~{yyzy}}ywxzy~|wqtyzuvuqt|{}zy~xuttu{}}~~|xx~~~}|~|~~~~}~~~~|~|~}~{{~|yzzz}}zwxzy~}wrtyzvvvqt||}zz~yuutu|}}~}xy~~~}}~|~~~}~}y}|vw~{}{}~~~}||xvwyy~{}zvvuv|||~|zvw|||}}z{}|}|xvxyz}{}~~~wtsru{z{|{yuy|{|}|y{~~yz|yz||z}{xy||wwxxy~{xx{{}{y~}|~}~~zyyyz}ywwzz~zz}~}{zz~zx}~}}}{y|~|x{zxz~{{~zz|}yz{{}}z{~}~yy~}}}y{}|||~}}{~}{|||~yy{}{wxyx{}zxy|{~yz{~~~~~}}~~}}~~~|}~}xz~|||wz~zyxx~~zy~~~~~{z}~{x{zxz}~z{}yy{}{xxzy}~{yz}|~xz~~~z}~~~~~}~~xy}|{{wx~~ywww|~~}yw|}|}}{y{~{xzzxz}{{}zy{~|yyzz}|zz}|~yy~~}~z{~}}~}zx|}z{xw}}ywvvy~}~~}zwz}|||{yz}}yy{yy|}z}|y{~~zz{{{~{z}}~{x||~{y~~}}}|xz~~z{zvz~~|wvvv|~~}|xx}||}|zy|~{x{zy{~||~zz}}zz{{~}{{~}~yy~}|}y{}}|}zx{}z{xv{}~zwvux}~~}{wy}||}|zz}~zy|zy|{}~z{~|z{||}{|~~}xz|}|y|~}|}~~~xx||zzww~}~ywvvz~}~}zw|}|}}|z|~}y{|y{~~||{}{{||}~|{~~zx|~|}zy}||~}{wz~}z{xv{~~{wvvx}~~~|xz~}}}}z{~{z|zz}|~~{|}{|||}{}~~|x{|}{y}}||}}~|xy}~zzyvy~|xwvw}~~~}yy~}}}}{{}|z|{z}}~{|~~{|||}{|~~}xz~|||y|}|{|}~|xy}~zzyvy~|xwvw}~}yy~~}~}{{~|z}{z}}~~{|}{|||}{|~~|xz||{x|}|{}~}~|xz~~zzyvz|xwvx~~}yz~~~~}{{~|{}{{~}~{}}{||}}{}~{x{~{|zy~|{{~~~}zx{~|z{xw}~zxww{~{y}~~~|{}~{|}z|~}||~||||~~||~~~yy}}{|yz~|{{~}}~yy}{{{xz{zyy~}|~}}~}~~}}~~}}}yy}{{{xz{zyz}|~~}~}~~}~~~~|}}yz}~{{{x{{zzz}|~}~~~}~~}}}yy}~{{{x{|zzz~}|~}~~~}~~}}~yy}~{{{yz|{zz~~|~}~~~}~}}~zy|~|z{yz|{zz}~|~}~~}~}|~zy|~|z{zz~}{{z||~~~~~~~~|~|y{~}{{zy}~|{z||}~~~~~}~|}}yz}}{{{y||{{{}}~}~~}~}}zy|~|{{z{}|{{}~|~~~~~~}|~|y{}}{{{z~~||{|}}~~~~~~}}}yz}}{{{z|||{{~~}~~~~}}~zz|}|{{z{}||{}~|~~~~~~}}~{y|}|{{{{~~||{}}~~~~~~~~~|~|y{}}{{{z}~}|||}}~~~~~~~~|}}z{}}{{{z}}|||zy|zz}z{~|{~z}|~~zy~{zz||~~|zzz{||{{|||||}|{}}|yxz|~|vyz}y|~{z|{|}}~~|xw|{~~z~wx~~}}|yx|~{|z}z|yz~v|}z{wy{{yz}~vsx}v{}~}|z}}~yux{y}z~yyzzz|zy}}y{}t{{w}}xy~}}wty}uzy}|}z}}xz~}~y}{|}zxz}|{~}{uv~|v}{x~vw}~}~yrtz|{zy~~~z}wuzwyz|}y~}z~|}|wqs{usuw|~|~ww~|v}y~|yw}~}}vqw|tv{vv{}{~{|~ytx{x}ywx}~|}}xx~ty{v{~~|~|wry~vy{|~vz}}|xsw|yz~|{uz|xyuz}x||w|~~~~{wzvv||z}su{zz{su~}x{~~|y}}}~~~wu}z|zy~rv}|z}zx}yzyt||z~|xx~|~ut|v{||y}|z~{z}~~y}~||yuv}|}~~vv~u{~z}~zu{{}|y~~yx~||~z{{~{~~ww~v|z}}~x{{}~{zvqv}w{uv~|}~xww}z~{|w}|y~vrxvu|yz{z~~|}~y~wu}}w~{y}xv~}yzzz}{wz}yw~{}~}vy}sr|~wy|~wu}zx|y}}uv{~~z~wywx||~~||wuyxyx}||y|}~|zxywu{zy{zvo{}z{~us||{zx}~{~|~~|{}}|}z~xuvs~zvzzuy|uzu{}~~vx~}}~{y}~}~|||xy~{w|yv~~wy||wx}wy{~|vvzux}v}|ux~zwxx~{vz|~}z}}}z|||{|vy~}yzyuz~uyrq{}{}yvs}~~~~{z~}z{}t~}sy~z{~wqtwvxzu{xz~}|uwwwz}x~zuyz{~v{~y||uw~}~~{xuxw}}yyw{}{yruwox|w|}xv{}{}~yyxx|~|~~}yzvu}}}}|uzzvxwquxow||}xru}{z}wx{~|}}~|{uw~|v~sxwv||utuurt|}xux{z}x}vu~~||z~~y}yz}zu~}}}wwtv{}}xwvqyuuy{z}|z}}qp{|{|}y}}|{yz{|ztx}z{~}zzwu{wq}svzww{|z}woq|}~zyz|yx}vwvu{~wwyvr|x{ywyz|}}|wurpuz~yy~~~{{~vw{x~~|}|zxtx}vvvwwvzz|{qs|~vrw|~ztu~}zz~{rowyy|uy|xz}ysrtsyzyz~{tvzyy{}|wvz|}~}}~~~~|}~}wxu}~~~x|tx}w{ytstx~}{}}zv|{{zzurtz}{v{{{z}}vy}{uxxy|~{wvxss{zv}wv}y{~wv{{|{xzxzy|utzvw{z{|z}|~~|t|sq}|s~|z|{~vuqu{|{xv|ut}z~~x~|xz{w~wn|~s|{z}|}vzzv~{wu{~z{~{~|yy{}}|ozymvysy~{~~~~w|rx~~|z{|xxy|z{}wvyxos|y}~{{{~}tsxv~z|~{y}||}~xz{r{xx}uxw|{zy}zw~wzsry{{}|}y{{{yp}{}yzv{y||}~}z{~y}{vz~x|||vwy{~pyx{yy{~sy~z~|{{}~{{y~x}||v~{zzx||u}wy}st~|zyzvvy|~}yyu~||zz|~}~xyyt}uu|z~{}}~zxxxw{zwv{|w}{||}y{|}}~r~zy|y}u~|z{}w{|uwy{xxw~~|}~y{~}{}|t~vv}~xy{v~|ypy}~vx~|}|yt}z}|xv~|r}~tlsttyywxzsv{wbemnr}yy~uyzu}sx|igpolttluyxv}u~|mormknel{z|stxpwzxgjrkgqkfsyyuto~untsqswqv|zvtzqu{zkdmopusktxxs|ytuytotniwzvr{rny~{w~{~~u}|rwwtpsrpuyypxvu~yktytv|qr{|y{y|tsxxz~~yy~~~}}~|~|y|sszyuvwpv|{sxunw}zosurptpt~}~v{}|~~~{x}~y}|}}|zwzzy}}||vr}|v~yz~}qmurosvkq{}y{|qz{qssqossq||}xzxs{~uz|}zsz||~z~xwwxyyxt}z}yyywmqsssyqluzyqxsqxztrwvsszru|}xtzsxrsyvswys}|y}y~}yxzwxw}wrwxwywjqzyvv|twxuorqopsrmw}~yyyw}~{qtusszyv}z~yw}y~~{y~}}~}~tquxuwxrz~z~utyworsssvqlv{xpvvrx|xsxwtw~vu~~{x~y|xx{wvx|w}~z}~y|~|~|t{}{z~{u{~{txxyvuooxyyuzwsvwtoppqrvqt~y||wuwvwzxz}z~y}y~~~~~~xz}}|}{}|quxwuxws|~~{~zpuzuostttvpn{zvtzvt{zxzvx|~xy~|z}yyzxwz~x}~}y{z~}{||uz{|{{{vz~{txzyssrpyzzx{xsvzwprstsxuy}z~|wuxxz~w{}}{~|}}y|~}}{{}~wqxxwvzxu}~}~uqy{urvuutuqu{wvwzvw~yxyz|}w{~|~z{zyy}~z~~}~|}y}|}|{}wu{}}{}xy~~wy|ysrwrw{{yyzsu|zpruutx{x}}|{vzz}~zz|}}~}~y{~}y{||wtyywwzyw~|yuuz|vswvusvuvywxy|x{zx{}}~~x|~~~}yzzzz~~z~~}{zz}~~||{|tw~~|{}y{}x|ztrwxtz|{y{wt{}tpvvvw}||~|xx|~~}z~}~}~}}~|~{{~~|~}~}z|}||~||}|~z}}{y}~z}~~||~~{{|{|~|z|z{||z|y{~~}}z{~~z}|~{}}zy~}~w{}|}|yxvv{{ww}~}{wz{wxzxw|}~z|~|yy}xy{~yz{zy{~||~xx{wvxvxy}{}{~vx{{z{~}~zw}~}{{zw|~|{yuxwyx{z~||~{y}|uuuwxyzv{}~}}}~~z{|zwvusz|{z}|}{}}}|}y|~zz~x{{zz|}y}y{}~||}z}}z{~{}}|}xz~~|}~}~yz}{x|zz{z~}}}|ytx|yxzz|}~}|}~y|}~}|x{}~}~{}y||~~||}x|||~||~~~~zz}{zvxvw||{zzy}{ywxwz}}~z{~~}}~{yy}{z|}{zxyz{{{|y|{z{}x|~||yvy|xx|y}||~~}~xx}{z|~~|~}~~{}|z~}~|zx~||}|{{zv|{y{}z{~}}~{}}}|~~~|{{|{ywxxx|~}}{|~|zw{z|}~{x~}}~~~~~~}~|wzz}~~~~zx|~ywxyyz|}~{y{{|~zx}|{yx|}z~~{|}|~~|y{z{~||}}}|}~~~y}~}~}{x}~{||{zyxz~zx{}{z~}}|z~}|~||~|{|yxxzy{~~}}}{x{}|~~zx~}~{~|}~}zw|{}}}}~yx~~wvyzzz~~~~|z{|~zz~}{|zy}}~}}~}|~}|||z|{{~{}}{}}~|||~~|z{~}z|{{xy{{zxz|}{~|~~z|~|~}z{|zzxz|z~|}{y{}}|}|y}~|~~~{~~{{~yx}}}~~}}~zy~~xvz{{{~}~~{{~|{}~}{|{{|~}~}}~{|~}~|}|x}}{}{{~}~}~}~}~}z}}~}{{|{x{}yxy||}~~|~}{|}}{||{{zz|||~~~~{|z{|~}{~}z|~~}}|}}|~~}~z||y|}~}}}|}|{|~|xw{|{~|~{|{}~}|{{}||}~~~~~|z~~~~}~zw~}~|~~{|~}|~~|z~~~{z}{y|~xwz||}}|}||~}}~zzz{||~~~}|{z|}~~{|{z~~~}~{|}~~}~~{{~~|y}~~|}}~}}~}{z{}~~~}}~~~~~{}}~|xz}|}||~zz|}|~}|}~~{{~~}z{|{}{|~yx|~~~~||}~~~{{~~||yz~~}{}zz|z}}}}|||~~|z|}~~zy}}||}}||z{||~~~}}}~}~{|}}~}xz}~}|{}}zz||}}}||~~}z}}}~{z~~||||~{xz}~~~||~~~z|||~}x}~~|||z|}z{~}}|||~~~z{}~~}}x|~|{}}{~~yz}}}~}}}~}|{~|~xz}~~~~}{|~zz|}}~}~{~~{}~|~~zz}~}|{|zyz}~~~~}{~~}z|~|}{y~~}~|}{z}{z|~}~~~}{}~~}z|~~~}~{x~}|{}|{|y{~}}}||~}|z}}}zx}}~}}|{{y{}}}}~}}}|}~|}zy~}}}}{{{yz|}~~~~|}~~}{}~|}{z}}}}}{{~~{y|~~~~~}|~~~~}{}~}}~zz~~}|{|{|{y|~~~~|||}z{~~~~y{~~~~}}~{|~zy}~}~~~~~{}~~}{x|}|}}z}}yz||}~~~}}~~}{}~}}|z~~~}|~|{}{yz}~~~~}}~~}{}~~|}|y}~~}{|{{~}zz}~~~~|{}~|y|~~{y}~~}}|}}|~|yz}~~~~}}~}{~}~zx}~~{}|{~}yz||}~~}}~~}{}~~}|y~~}{}}{~{yz}~~~}}}}{}~|||y}~~}{|{z}}z{|}~}||~~}z{}~~|y|~}}|}}|~~zz|}~~}}}~~}{|~~}~xy}~~}|}|}~{z{}}~~~}}|{~~}~zz~~}|}||zx{}~~~}}~~}z}||{y}~}{|{z}}z{}}~}||~}{{}~}}y{~~~}||}{}~zz|}}~}}}}|{}}~zy|~~}}}|||z{}}}~~|~~{|}~{y|~}|}||~}yy|}~~|}~~{|}|~~y{~~~|||z|~zz}~}}}|~~{{}~~}~yz~~~}||}||zz|}}}}}~}{{~}~yy}~~}}}{|{z|}}~}~|~~}{}}~zy}~}}|}{|{yz|}~~~|~~}{}}}{y}}}|||{~{z{}~~}|}~~}z}~}~{y}}|{||||y{}~~~}|~}{z}}~zy}}~}}|~|||y{}}~}~~}~~||}}~~yy}~}}|}||{yz|}~~~}}~~~|{~}~~zz}}|}|{|~zy|}~~}|~~~|{~~}~y{~~}{{|{}~{z|~~}||~|z|~~~}y{~~}}|}}|~}zz}~~~}~~}{}}~{x|~~}|}||~}yz|}~~~}~~~}{}~}{y}~~}|}|{~|yz}~~~}}~|{}~}}{y}~}}{|{{|z{}~~~}|}~|z|~}~{y|~~}||}||~|z{}~~~~}~}}{}~~{x|~~}{}||~}zz|}~~~}}}{}~}|y|~~}||}{~|yz|~~~}}~}{}~}}~|y{~~}|||{}~zz|}~~}|~}{{}}~y{}~~}||}|}{z|}~~~~}}{{}}~zy|~}}|}|||z{}}~~~}~~}{}~~{y|~~}||||~}yz|~~~}}~}{|~|~}y{}~~|||{}~{z|}~~~}|~}|{}}~zy}~}|{||||z{}~}}}}|{}~~~{y{}~~}||||~}zz|}~~}}~}{|~}|y{}~}||||~~zy|}~~}}}{{~~}~~yz}~~}|{|{|~{z|~~~~}}~~{{}}~zz}~}|{|||{z{}~~}}~}{{}}~zy|}~~||}|}|z{}}~~~}~}|{}~~zy}~}}|}|||yz|}~~~}~~|{}}~{y|~}}||||~|z{}~~~}~~|{}}~zz|~~}|{|{}|z{}~~}|~}{{}~~zy}}~}|{}|}|z{}}~~}~|upopqsx||z~~yurqqqtvtsw{|vvwwwusqqqqrtrnprsuw|~~~~|wtsqruvttx|~zsnoqqqonlmnnqsqoortuwzzyxxy{{ywuvuuwwuqqsssqooprtw{{yy|~zxywvsqopqruyywx{~}{zyyz{wstuuvxzyxwwy{{yvwwwxz{xuwyzzxwwxz{~}|~~}~|zyxwxzyvrsuttrqqrtux||zz}~}||~~|{}~~{xz|}}{zyyyy{{xuuvwxy|zywwyz{xuuuuvxyvssuvvutstwx{~|{~~|z{}~|{|}}}~}xuvyyzxwuuutvxuqqsttvyyxvuxyzxvuuuvxzyvuwxyxvvvxy{~~|~~~|zy{}~|zz|||}}yttvwxwutststvvspqstuwyxwuwy{zxvwwwy{{yvxzyzxxwxz{~~}~~}{yz|}}{zz{{{|{wssvwxwutttstvuqprstuyyxxvx{|{xwxxxz||ywz{{{yyxz{}~~~~|zyz|}|zyz{{||zvsuvwxvtsstsvwtqqstuwzyywwz|}{yxyzz}~|yy{||{yyy{|~~~}}{yy{}}{yz{{{|{wssvwxwvttttuwvsqrtuwy{zyxz|~}zyzzz|~~{y{}}}{zz{|}~~~~~|yy{|}{yz{{{||ytsvwxxvutttuwxtrsuvwz{zzxz|~~{zz{{||z{}}}{zz{|~}}~|zy{}~|zz{{{}|yusvwyxwvtuuuxxursuvwz|{zyz}~~|zz{{}|z{}}~|{z{}~~}}~|zy{}}|zz{||}}zutwxyxwuuuuvxxustvwx{}{zz{}|z{||~|z|}~}{{z|}~~}}~}{yz|~~|{{||}~|xtuxyzywvvvvxzxttuwxy||{{z}~~|{||}~~{{}~~}|z{|}~~|~~}{z{}~}{{|||~~|wuxz||{zyzz{~~|yz|}~}||~~|{}~|zzxxyyvtuwy{~}{zz{{~|{{|||}{yyy{~~|{yyzzvtuwy{}}~}}zywwyz|~{z{|||}|yxwy|}|zz{{{|}zvsvwyywvuvvwzzxvwz{}{xz{|{yxvvvvyzwuvx{|~~}~~~}~|zxwx{||zy{{|}~|xuwy{{zyxyyz|~{yy{}~~|{|~}{|}}}~|xtuwyzxwvvwwy{zwwy{|~|}~~}yz|}~||{||}~{z{}~~}|}~~}~~~~|zxxz{|{yyz{{||yutwxzzxwwxxy||yxy{}~~}{}~~}|}}}~{{}~~}~|{{|}~~||}}|}|zxvxz{|zyy{{|}|xuvxy{zyxxyy{}|yyz|}}|~~}}}~}z{}~}}}|zz{||{|}}|}|yxwy{||zyz{|}~|xuwy{|zzxyzz|~|yy{}~|}~}}}}|{|~~|~~|{z{|}~||}}|}}zxwxz|}{zz{|}~~zvwyz|{zyyzz|~~{y{|~}|~~}~}}{{}~|}|{z{|}|{}}}}}{ywxz|}|zz{|}~~{wwy{||{zyzz{~~{yz|~}|~~}}}~}{{}~|}~}{z{|}}|}}}}}|yxwz|}|{{||}|xwy{||{zyzz|~~|yz|}}|~~}}}~}{{}~|}}{z{|}||}~}}~|zxx{|~|{{|}}|xwz{||{zzz{|~~{y{|~~||~}}}}|{|}~~}~~|{z||~||~~}~}{yxy{}}|{|}}~~zwxz|}|{zz{{}}zz{}~~~{}~}}}~~{{}~}}~|{{|}~|}~~}~}zyxz|~}{{|}}~}ywy{|}|{zzz{~~|yz|}~}{}~}}}~~{{}~}~~|{{}~~}}~~~~|zyx{}~}{{|}~}ywy{|}{zzz{|~~|zz|}~~}{}~}}}~~{{}~}~~}{{}~~}}~~~~}{yy{}~~|{|}~}ywy{}}|{zz{{~|zz|}~~~~{|~~}}}}~{{}~~~~zxwy|~~}}~~~~}|{{{{||||}}{|~|~|{|}~}~{zy{}~~{|}~~|||{x}||~~~~}~~|~|xxz{|{zyz{{z{~~{}~}{}~}}{z{}~~~~}{yyyz|}~}{z||{~~}}~||}}{zz{}~}}}|~~zy}~zy}~|||}~~{~}xwz{{{zz{||{|{}~~}z{}}|{z{}~~~~~|zyyz{|~}||zy|~|{~~}}~}||}}{zz{|~~|~}|~}yy~~zy}~|||}~~}{|xxzz{zzz{||{}~{}}|z|||{zz{~~~~~~|zyyz|}}}|{yz}~{|~~}~~}|||~}{z{|}~}}~|}~zx||z{~}||}~~~{}~ywyzzzzz{||{|{|}~}z{||{zz{}~~~}}zyyz|}}|{zyz}~||~~}~~~}|||~}{{{|}~~}}~|}}yx|}z{~~}|}~~}{~~yxyzzzyz{|||}~{|}}{|||{zz|~~}~}zzz{|}}{{zy{}}{|~}~~~|||}}{{{}~~~~}}~}|}{xy~|z}}}}~~{||xyzzzyyz||||{{~}~{{||{zz{}~~}~|zzz{}}{{zzz|~||}~~~~~}|||~|{{|}~~}}}}}|~}yx{~{{~}}}~~}{}{xyzzyyz{|||}~z{}~|{|{{zz{}~~}|zz{|}|{zzzz}~||}~~~~~}|||~~}|||}~}}}}}}|}}yx{|{~~}}~~~~~}{|}yyyyyyz{|||}{{~}}}{||{zz{}~|~~{z{{|}{zzzz|~}||~~~~}|||}~|||}~~}}}}~~||~~~zxy}~|}~~~~~~~~~|{~{yyyyyyz{||}~}z{}~|||{zzz{}~~|~}{{{{||zzzzz|~}|}~~~~}|||~~~|||}~}|}}}~~||~~~zxy}~|}~~~~~~~~|{~|yzyyyyz{|}}~}z{}~}||{zzz{}~~|~~{{{{||zzzzz}~}|}~~~||||~~~}||}~}|}}}}||~~}zxz~~|~~~~~}~~~~~||~{yzyxyyz||}}~|z|~}|||zzz{|~||}{{{||{zzzz{}~}|~~}|||}~}}||}}|}}}~||}~~~{yy|}}~~~}~~~~||}|zzzyyyz{|}}}}z{}}}|{zz{|~}|~}|||||{zzzz{}~}|~~}|||}~~}}|}}|}}}}||}~~~{yy|}}~~}~~~~||~|zzzxyzz||}}~|y{~~}}|zzz{}~||}|||||zzzzz|~~||~~|||}~~~}}|}~||}}}~~||}~~}zyz~~}~~~~~~}~~}|}~zzzyxyz{|}}}~~zz~~~}}}{zz{|}}{~~|||{|{yzzzz}~}|}~|||}}~}}|}}||}}}}|}}}{yy{}}~~~}}~~~~}|}}zzzxxzz{|}}}}yz~}}}{zz{|~|{~~|||{|{yzzzz}~}|}~||}}}~}|}}||}}}}||}}|yy{}}~~~~}}~~~~}|}}zzzyxyz{|}}}~~zz~~~~}}{zz{|}~}{}}||{||yzzzz|~~|}|||}~~~~~}|}||}}|~~||}}~}zyz}}~~~~~}~~~~||~|z{zxyz{||}}}|y{~}}}{yz{|~|{~~|||{|{yzzzz}~|}~||}}~}~~~}}}||}}|~~||}}~}zyz}}~~~~~}~~~~||~|z{zxxz{||}}}|yz~~}}{yz{|}|{~}||{|{yzzzz}~|}~||}}~}~~~}}}||}}|~~||}}~~|zy{}~}~~~~~}~~~||~|{{yxyz{||}~~{y|~~}}|zz{|}~{|~|}|{|zyzzy{~}|~}{|}~~}~~|}|{}}}}||}}}}zvqppppty~{xvvvrpqrqsw{|yxtsssqqssrrtvwx||z{}~}}xpmnpppppruw||zzzxwtqppqsrpqqpopqqqstuuwtposxyzzyxxuutrrrqqtusrsvxy}}|zxvtollmpqoquwx{}~}xutttuwustvvwxwvwx{{wuutrrstuvxz{|~{wx{|||{z{zzywwy{{{xxzzyxvttrqpnnpqrtxywvvxy{~~~~{z|~~{zzyyz{||}}~}~~}}}{yxwwyywxzzwurppqrtqmllklortvxyyy{yutwzzzzz{{{}}||}~~|{~~{zzzz}~}{ywuwyz{}~}{|{vsuyyxuqppoonllmmnsyzyy{{z{}|{|~}{yvtvx{}|||zxy{|}~|z|~~|{|{z|}}~}yspqswvsssqoqtvxz{{{{zvux|}}{yxxxyyxyzwuvxwuuwyyyzxz}|{}~}yy}}zxvxwuvusrtuutvxyy{zxxz{zzxustvyyvuusppqstwxz{}ztruz{{zxwwvx{|~~~}{zy{zxwurpprtw{~ywx{zzywutqrsrstuwzzxvvwxy|~{yz||{yvsstwzz}~zxvuwyxy|}|z{}|xvvvwxwxyxvxxwuuvvvxzwttwy{}{yywuvuw{||}}{||}~~||}|~}|||z{|~~}{zwxzzxy{|xtssttwxwxywuwwutuvwussutuwz|}{z|}~~~~{xy{|}}zz{}}}~|yxxvuwy|||{z{|yuvyywuttutrromoqsx~~~}}}}}{y{|}{{{zz|}}}|z|~}}zyxy{~||~}~~zursuvxwtttstx{{{}}||}{wx|}}~~|}}}|zxxz{zz{|zy{}~~~|}}~~}~}}zxy}yyzzzxwwusux{zyz|{{|{zz}~}|yvx{}}{{wrpsvwz~}zxy|}}|zyy{|~~}~}~}yy{{ywspqtx|{xy||}{ywvwxwuvxyxy{|zyz}~~{|~|wttv{~~~~|yxy|zz~~~zxyyzzzz|{zz}}|{}}}~yy}|{|}}~}~}|||}~~}}}}{ywwyzz||~|yyz{||z||xuwyz{~z{}||}}~~{z}}{|{z}ywx{|}}{z|||}|{y{}~}{{{{z{zzxy|}}~}{yy{|~}z{}|zwuw{|{|}zxy{}{yy{~~}}~}~~{yz}}|~~~~}{{~}zxwy|}}}~|{{xx|~yvvvvwyzz}~~|zz~}|}}}|zz{||~}}}|xy{~~~~}{}}zyyzzz|~|}}}~~}{|~|zxwy~|||~{{|~}|}~~}}y|}~}{yyyxz}~|}~}|~}{|~}|zy{|}~zvsqtux}~}}~~}~|}~|}~~~~~|~~}~~}}zy}}yvsruy~{yz}}|{xy|zyxwyxvvz~}z|~~}}~{wuw{}zwz|||~{zy|{xxxvx||wtuy}}zz}}xvvxxwz}~|vty~{zzz}~}}~}{}~}~}zy{~~}}yxyyz}}z{}|yy}|{|}~|zywwwx{~~yx{}ywyz~~~|zzz|~|{}||zz|}~|{|~}||zz}}||}|zwxyyy{~~}|xwz}}{zxvvtux{{}~}}}~||~}}}|}|}|}}{~~{z{{}}{ywy{{{~{z{{{~|}|xvwwxwwy{}||}}|}|}}~~zy|~{y|}{|}{{~}{~{y{~~~|z{}~~{z~}}}|{{}}|z{~~|zxvwxz{~~}}|||}~~~~~~}~}~|zyvtw}~}}}~}}}~}{|~}~~~}}~}|||~|z|{ywutx|~|z|}}|{}~|{|zxvwz~~}{}~|yx{~}~~~}~~zy|~|{}{}~|ywuvx||wuy{|}|~}zxxyyx{|{yz}~|||~~~}~~~zxz}~}}}zwy}}}{yyy{|}zz~}{|}}{{~}zz{{xy}|z}}yy{}~}|yz|}}~}}{y|~}}||{|||}||~~|{|~||zwxz|~}xx}~{zyxyx{{{~}||~}{{{~}{|~{z}|z|~~{yx{}~|{|||{}}~}|{yyy|||~~~~{z||{{}|}{z}}~}zzz{}}}}~~{wx{}}~||}|z|{|}|~~}}|}~~{zzz}~~}|xv{|{}~{zz{}||~{wz}z{~~}|z{|}}}|zz~~}}~~|{z{}~~~~~zxy{|}{}|{{~~~~}||}~}}}}~|}}}{|~~{{|}~}|{{{{}|~}~~{wwxz}||||}}|{||z|}~}~~~~~~}}}~}~~{vw{}~}zyxy~~}yw{}{z{z{}}{|~}~~|}~|~~||{yz|~~}{{}}~|{~||~}{{|~~}||z|~~~|{|~||}}}|||}{|ywy}~|~~}}}}~}|~~~~~|xy|~||}zy|~~}zz~~||{~~}|~}|~{vvx|}~}}~}{{~~|}|xwy{~~~|}~}y{}{||z|}{}~~~~|xxy}|}}zz|||||~~}}yyz{~~}{{}~|z~}{zzz}}~~~|{{|~~}~{{|~~{zyz}}~{{}}{{~}{zz{}~{zz}|}~~~~~~~~~{{||}~{yzzy}{{~}|~}}||~}|{{~~~yy}}{{|}}~~zy}~}|zxxx{~~~{{}~{|}|z}~}~||~~~~~~~~|||}|{yz{|~}zxw{||}yz|}~|z{{{}~}{~}~}|}~~}~}}~}}~zxy|~~|~~|yy}}z{|{y{|}|{{}~}~{z~~}~|{z{||~|}~zwy{|~~~|}~~~~||}{xz||}zy{~~~~|{}|{|}}}|}~}z}~zwvx|~}~~~|{}~}}}}{xwy|}|||~}{~~}||zz~}|~~~{wwy}}~~||~}{{zz}|yxy~~~}{{|}}~yy~|{z{|}~~~~~~~~|{z{}{|~|zz{}}~~~}}|{}~~}|zyzz}~~~|z|}~~~}}~}~~~~||~|{~~{|~|{zyy|||~~|~}}|}~|{zz~|||yx|~}|||}~~~z{~}|~|{zxy|~}}~|{~~|||{|~}{}}yz~~}|}~~}{}~|~}}~|zz||~}zxz}~|{|}~~}}{{|||{{{}~~||~{z|~}}}|~}zx{~~zwx|}{z{}~{y{~~|z|~}~{}~|zxy{}~}{yxy}~~}}~|||}{{~{zyz|~{z{~~}}}}~~~|}}{{{}~|{}{ywx}~~~~~{z{}|~|zxy}~}|||~~}~}{z}~|{~~}|~~~|xw{~}|}~}{yxy{}yx{~{{||{}}z{}||}~~~~}|~{ww|}~~}{|{z{}~|xx{~}|zzzz|}|}|}~}|~~~~}|~~|z|~~||}}~}}|yy|~}}~~}~~}}~~|{z|~|z|{yz|~~~}||}|~}}}~}|{|~}z}}|{{z|~~~}}}}}||~}|{}~{y{{yz~~}{|}~}|~}zxxz}|{{|||~}}||~}zzzz|||}{{}~{z{}}}|{}~}zz{|~~~zwx{~|{{}}z{}}~}|~~~}}~~~|yyyz}~}{wy}}||}~}|{|}}{|}{xy}{z|~~}|{{}~~}|zz|~}~~}~~|zyz~~~{yy|~}z|}zyz~~}|}~~~~}}|}~~}|{}~|{|}~~|zz|}}~~~~}zwwx{}zz|~~|{||{|~}}}}~~~~~~~||~~xvx}}}|zyz|~zwx|~|{zzz{}~|}~~}}~}~}}~|{{}}{{}~~|zz|}~}~~}||}~||}~~~|{z|{{}|z{}||}}||}~|{~|yy{~|{~~}}||}~}~~~~{z{}~|}|zy|}zy|}|{|~}~{rkijmqx|{zyxvurqqppqtx|~||}}|zvsrtuuuusrruwy{yy{}|zxututspnnrw{~~ytqommmoqqpqrsrppruvvxywtstx{{yurommmnrtttutrqqrsvyxxx{{vrrstromnpqpppqsw{|{|{|}~}|ywwxwutuuuutsssrtxyz{{|||{wvvw{~~~~~{xwy{|~~~~}}}~|yvvvuqnnpssrrpnopruz}}~~|{|~}|{{}~|{|{z{~}~~||~~~~~~}{zy{~~}~}zxvutux{zvqnmnoqrstuuwxxwvwyz{{zzz{{ywwz~~}{|~zwwy|~|zy{|{yxwwtttsrpoqvyxurpoprux{}}|zvsqrtvxxwvvwy{{|~}~~~~}{{{}{vrrtvvwxxwsqqstuuutssqqty{|}|ywusssuuuuuxzyxy{}|||}}~}|~~||~}}~|{}{ywwuvx{{yvuuvwvvvvvuvxz{zyxwwxyywwtqoorwz|}~{wvwxy|~}zxxyyyz{}~|zyxxwwx|~}{vttvx{}|{{yvtrqrtvxxxvwwvwz}|{{|{xvuuvvvvwyzyxwwwxz~}{zzz|{yz||~~}}}}{{zxwxzzyxwvvvvtssvyzzzyxvuwy{zyyyxvsrtxyyyxwvvwz~~~~}zy{}~}|zyyzzz{zxvuvyz{{|}{yxwwutw{|{wtssrstvwyz|~~|}~~~~~~~}{ywxz~~~}~{xvwz|}}}~~{z{{yyyyxwwwvtqprw{|zwustuy}}zwuwy{|zyy{|||}||~~~}~}{z{~}xtsuuxzzywtsuvvvvwwwwwwxz}~|zyxxxwxxz|}}||}}||~~~~}{|~|zz}|{}~~}~}{zxwxz{{xwxzyxwvvvxyz|~~~~|zyz{}}|zvsruy{}|zyy{~~{z{|zyxxz|}~|}~~|yutwz~}|zwwz|~~}{ywuuuvwx{}~|zz{}}}}~~}|{yvuvz~~}|{zyz{}|yxxz|}~zz{{{|}}{yxyyy|}{{{{{{zzzzxwwx{~~{{}{ywxz{|~~|{{|}~~~zvtvy{{{yxvuuuwz|~~|{z{}~~~~|ywwwwwxxxxy{||{y{~}~{zyy{|}{zz{|}}}|zyy{}|zzz{{{|}~~}~}}}}~~~|yxy|~~|ywwyzz|~}zxx{~~~~~}~|xwy|~{yxy||yvuwxyyxy{|||}~~~}{xx{}{{|}~}||}}}|zxx{~~|yyz{zzyyzz{|}}|}}|{zxwvwz|}}}}|{yz|~~}|}}|~}}~}{z|~~~~~~|{||||zz{}}{yxwxy{}}{z{}|yvuuwy|~}zyz}}{{}|{yxwxz~~}{}~~yuux{}~}{{}~~}{yxwwvwy|~||}||}~~|xttwz||{zyxxz|~~}{yy{}~~}|{|}~~|zz{|||||zxxyz|}~~{wwy{~}ywwxyyzzzzzz{}~}~~||~~~~}~}{{}}{yy}~|{{|}~}|{{{|{|~}||}|{{{{{z{|}{yvttux{~}}~~|{{{{|~}|{|~~~~}||~~~|zyyz{}~{yz{||}}}zwtsuwy{}}|zyz|~|zyzz{|}~~~|}~~~|||~~||~}|}}{{|}~}}~|zwwy{|{yxyzzyxxwxz|~~}~}{zyz|~~|z{|}~}~~~~}}~|{}~~~}~~~~}}}|zxxz|}}|zxwwx{}{{}}{zyyy|}}~~}}}~~~|zxvwx|~~}~~|||}|xvvxz|}~~~}{{ywvwz~}{|~}yvvy{|}|{zz{|~~~}~~}|{{{{z{}~|{z{~}zzz|}~~|{zz{|}}~|{yy{~{{{{zyyzz{|~}}}zz|~~{{|~}zz|}~~}|{{}}||}}}}}}~~||}~~~}}~~~~~}{yz|}{xutuy}~~~|zxxy{}{z|~}~}||}}~~{yyxy|~|zxxz{~~|{{||~~}}}~~|||~~~~~}}}~~||}~}|~}}{z{}~~|}}}}~~}}~~}|}|{{}~~|zz}~~~~~{xy{~~~|z{{|~~}|zy|}~~~~~~~|{}~~}|||{z|}~|zyy{~~|{}~~|||yxx{~~||{|}|z{|}}~~~~~~~}~~}|}~}}}{}}{{}|{zxwy|}}~}~~}}~~~~~~}}}|}~~~~|||~~~~~}zwwy|~}|{{{~~}}{zx{||}~~~}||{|}~~}}}|{|}}~}|z{}~}||{|}~}}~{zy{}~}||}~~~|yyz{|}~}}~~~~~~~}}~}}{z}|z}~~~|{zwy{}~}~~~~}~}}}~||}~~}||~~~~|yvvy|~~|zzz{~~|{ywy{|}~}~~~~||~~}}~}{{|{}}|zy{~~}}|}~}~|zyz{}~}||{~}~~}{yz{}}~}}~~~}}~}||{{~}|~~}~~~||zxz{}}~|}}}~||}~}~~|{{~~~~~~|yvwz}~}|{{{|~}{yx{|}~}~}{}~}|}}|z{|{}~}{yy{~||}}}}{yxz|}~~}|{{|~~}~{z{}}~~~|{}~~}}~}{~~{|}~~}|{xxy{|}}~~~~~~~}|}~}~~~}|{}~~~~~}zwwy}~~}||{{~}~}{y{|}~~~~~|z|}~}}}}}{|||}~}{zz|~}{{|~}~}zyy{}~~}|{{}~|z{{||~~~~~}{|~~~~~|||{}}~|{xxyz{|~~~~~~}~}}~}}}}}|}}~~~~{wvx{}}{{zz~~~}{xz{|}~~~~|{|~}}~}{|||}~{yz}~}{{}~}{zz{}~~|{{~~~~{zz|}|~~~}~}|}~~~~}}{|~~~||}}~~~}|{xyz{|}~}~~~~~~}}~~}}}~~||~~}~~~}zwwy|}~|{{z{~~~}zx{{|~}}{}~~}~~}z|{{}~{yy|}||}~~{yy{|}~~|{z|~}~~|zz|}}~~~~}||~}~~}~{{~~}{}|~~~~}|zxy{||~~~}}~~}~||~~}}}}|}~~~~}}}ywxz}~~}|{{z|~~~}zz{|}~~}{}}~}}~~}{|{{}~{yy|}||}~~}{yy{|}~~|{z|~~}{{|}}~~}{{}}~~~||~~~{||}~}|zxyy{{}~}~~~}}}}}~}}}~||~}~}}~|xwx{}~~}||{z}~}~}zz{{}~~|{}~}}}~}||{{}~{zz|~}{{}~~}{zz{|}|{{}~~|{{|}|~~}~}{|}}~||}}}||{~~~~}|zxyz{{~~}~}}~}}~~}|~~}}}}}~}}~zwwy||~|{{y{~~~~~{zz{|~~}|}~~}~}||{{||zy|~}{|}~}{zz{|}~}{z}~~|{{|}|~~~}}{|}}~~{|}}~|||~~~~}|zyzz{|~}}~}}~~}}~~}}}}~~}}~}|}|xwx{|~}{{zz}~~|zzz{}~~|}}~}}~~||{z{~}zy{}~{|}~~{zz{||~|{z|~~|{{}}}~~~}}{|}}~{|}}~}|{~~~~}|zyzzz|~}}~}}~~}}~~|}~}}~~}}~}|~{xxy{|~|{{z{}~~|zzz|~~}}}}}}~~||zz||zy{~}{|}~~}{zz{|}~|zz}~}||}}}~}xqnoopsvy}}{ywvuvwxz{{zy{~|{{|{vqrttsrstuvwxy|}~|uqmllosuvy{wsommopomrwywsrpooprtvwxxwuttstvyxroprqpoooopqrstvy|~~{z~~{ywvwxxvtrpprvz|}~}yvrpopqrstuutssrrvz{wrqsuuuuvwwy{{{}~|y{~~}|}~ztqsvutuy{zxwwwwyzywvtstwz||||ywwy{}}xy{||||||}~~|{|}~{xwwx{|~}~~yx{|{yy{||||~~}ysmmqsrqswyywxxy{|}|zxutuwy{z{~}|~~|yz{||zxusstvxyxz}~yuuwxusttuvwwy{}~|xsopttrruxzyxyyz{}~~}{xxz|~}z{}}zz{||xurqrssuvvyz{xtruwwuuvwy{{|}~~~{xsnnrvuux{}~}}}}~}zxz|}~~~{yyyz}|zwtsrstuwxxz|}{vstvwvuvwxzzz|}}~}{uposwwuwy|~}}~~~~{xxyz|||~|~}{yyyz}|zxusqrttuwwz|}|xstvwustuvwxyz|}}ysrtxxvwy{}|}}||~}z{|~~~}~~{{}}{yzz|~|yurqrsstvwyz{yvstvxwvxxz|}}~~{vrruyyyz|}z{}~}}|~~}}~~~~{yyy{|{zwtrrtuvwxz|}}zvtuwywxyy{|||}~}{urswzyxz{~~~{xzz{{|}~~~~}}zzzz||{yvtrstuvwx{~~}zvuvxxvwwxzzz{|~~{vtvz{yyz{~~~~~{{}}~||{|~~|{~}{{{|~~}zwtrrttvwx{}}|xuuwyyyz{{}~~~~|yusv{|{{|~~{{}}}}~~}|{|~||}~}|~~~{zyz|}|ywtstvwxzz~}ywvxyyy{{{}~~~~}zvsv{|{z{}~{zz{{{{~}}|}}~}}|{zz|}|zxusstvwyy|~{wvwyyxyzy{||}}~~}yvw{||zz{~~|zxy}~}{|}~~|{{||uqqtwy{}~}{z|}}{xurqrtvxyz|zyz|~~~{}}{|}}xvussvy{|{zxwwwz}}|{|~~{vrrrsttuvwvsrsux}~ytrtx{}~}}}yvvy{|{z{}}|{{~}{zyy|}}{z|~{wttuwwwxyywttvy}|xwy}~}zxxz|~}{|}}}~~~~~~}{ywx{}}||}~}~zxy{{{{|}|ywwz}zwwz}~{{}}{z}~}{xuuuxz||~|yxxz{{|~~~~~~|zxy|~~~}zyz|||}~~{yy{~}xwy|~|{}|zxy|}|zxuuuwz{|}|ywwxyz{~~~~{zy{~~~~~~~}{}~~~~|yyz~{y{}|{|~}zyy{|{ywtssuwy{|~|yxwxyz{}~~}~~~~|{{|~}}}~~|}~~}zy{~~zxy|~}zyz}~~}zyy|}{ywtstuxz{}|yxwxz{|~|{{}}}}}~|z|~~}~~|zz|}yxz}~~~|{|~~|yxy|}{ywuuvxz|}|xwwyz{}~|{|}~~}}~}}}~}}~~}zyz}}z{|||{}~|yyz||zwvttvwz{}~{xxxz{{~~~|{}~~~|||}~}}~~}zy{}~{yz{}~zzz|}~~{yy{}}zwvtuvxz|~~{xxy{||~{{}~~|{|}~|{|}~~~~|zy{~~zyz{~{{|}~~|yy{}}{xwvwxz|~|xxxz||~|{|~~~~}}}||}~~}}~~~|zyz}|z{|~|{|}~}{y{|}{wvuvwxz|~}zxxz||}}{|~~}{{|~~|}~~}{yy||yxz|~|yz{}~~|zz|}}zwvuwxz|}~{xxy|}}~||~~~~{{{|~|{|}}~~~~{zyz~}zxy{}|{|}~}|z{}}|ywvwyz|~~zxxz|}~~|{~~~~}}~~{{{}~~||~~~~}{yy{~}zyz|~||}}|~}zxxyz|~}{{}~}}~~~}}~zxyy|~}}~}}}|yz|||}}}{xwx{~zxxz|}}z{}~~}}~|ywxz{}~{{|~~}~~~}}~|yxxz}~|{|~~}}~|yx{{{||}{ywxz~{xwy{}||}}}~~}zxy{|~|z{}~}~~}}|||~}yxyz}|{|~}}~~{y{|{||}|zwwy}}zyz|}}||~~~~}zxwy{|~}{{}~~~~~}}}}yxxz}}||}}~{z{||||}|zwwz}|xwy{|~|{|~~~~|zxwz{}}{{}~~~~}}~|ywxy}|{{~}}~}zyz{{z|}{ywxz~|xwy{}~}|}~~|zxx{}~|{{~~~~~}}|{}~{xwx{~~|{|~|}}{z|||{}|{ywy|{xy{}~~~}|~}zywx{|~}|{|~~~~~||}zxwx{}|}}}}{z||{{||zxwy|zwxz|}~}|{}}zywx{}~}||}~~~~}||}yxwx{~|{|}}|zzz{{z||zxxz}{wxz|~~~~~}|}~}zyxy{~}|||~~~~~~~}|{~}zxwx{~~|{|~}}~|{{||z{|zxxy|}yx{}~~~~}}}~zyxxz|~}||}}~}~~}|}~zxxwy}~}|~~}~}{{{|{{|{yxy{~zwy{}~~~~}}|}|yyxyz}~|}}~~}}~~~}|||yxww{~}{|~~}~{{z{{zz{zxxz}|yxy|}~}}~~}}~{yyyz|}|}}~~}}~~~}|{|~~{yxwx|~}||~~}~||{{{z{{zxx{~|yy{}~~~~~~~~zyxyz|~}|}~~~}}~~}|}}zxxwy}}}~}~}||{{{{{zyxz|}zxy{}~~}~}}}}~|yxxyz}~|}~~}|}~~}|}~{yxwx{~|}~~~~||{zzzzzyxy{~|yxz|~~}}~~~~~~zyyz{}~||}}||~~~~}||}{yxxxz~~}|~~}}|{{{{zyxy{~}{zz|~~}~~}~~~~~{xxyz{~~}|}}|{~~~~}}~|yxxxz~~}~~~}|{{{{zyxy{~|zyz|~~~|~||}~~~{xxzz{~}||}}|{}~~~}|}~{xxxxz}~}~~}}|zzzzyxxy|~{zzz|~~}|~||~~~~{yy{{}|||~}{{~~}~}||}~~zxxxy{~~~~~~~|{z{zyxxz~~{{{{}}}~{|~~}zxyz{}~||}|{{~~~~}}|~~yxxyz|~~~~~|zz{zxxx{~}z{{{}~~}}~}z{~~~~}zxy{|}~{|}|{|~~}~}}}~~yxxyz|~~}~}|zy{zxwx{}z{{{|~~}}~}{|~~~~~{yy{|}~{{}}{{}~~}}}||}zwxyz|~~}~~~}{y{{ywxz~~{{||}~~}}~{{}~~~~|yxz|}~|{|~~{{|}}}}|~|xwxz|}}}~~~~|zz{zxwy|~{z|||}~~~}~{z{~~~}~}{xy{}~}{{}}{|}~}}}|}~zwwy{|~~}~}}~}{yzzywwz~}{{|}|}~~~}~{z|~~~~}{yz|~|z|~~|{|~}|||||~}ywxy|}~~}~~~~}{yzzxwx{}{|}}}~~~~~~{{}~}~~|zyz|~|z|~|{|}||||~|ywxz}~}}~~~~~}zzzzxwy}}{{|}}}~~~~~{z{}}}~~}{yy{}~}{{}}{|}~}|||}~zxwy{}~~|}~}~~}|yzzywx{~{z{}~}}~~~~}{{|~}~~|{zz}~|{|~||}}{{{|~~{ywy{}~}|~~~~~}zzzywwz|{{}~~}~~~{{|~}}}|{zz{~~|{{~}|}~}|{{|~~|ywx{~{vpmmov|}wtrrttqooquy|~~|~|zyzywtuxwvsstsstvy}~~~~|zyywutrpooptz~~zwtrpooonnmllllmpu{}}zurrrsuutssssstwxwwvspmmnrvxvuuwz}~~~~{xvrooprtuuuutrrrsv{~|zxvtsrruy}~|xtpqrtuutstvvvx{|}|{yvtuwz}~|zz{}}||}}}~}}~~~~|xurrpnmnqsvxxxxvuuuux|{|~~}~|zz|}|~}||||{}~||{|~|}~}{yxxxwwxxyyxwwxz{{{{{zwtrrqonpsvy{{zzxwvvvx|~~~~|{||{|~|zyxy{~}|}|{yyzzxvuuuttutvwvuvwxz{{||{yvsssqpqtx{}}|{zxwwwx{~|{{|{{}}{yxwwy{}~~|zzzzxwxywutttttutuvwvvwyz{|}}}|yvuutrrtx{~~|{yxxxxz~}{{|{{{}~}{yxwwxy|}~}{zzzyxwxxvtttuuuuuvxxxxyz|}~~~}|yvvvtstw{~~|zyxyyz|~}{{||{|~~|zxwwwxz|~~}{zzzyxxxxvutuvvvuuvxyxyz{}~~}yvvvusuy|~{zyyyzz}}|z{|{{|~}{yxwwwxz|}}|{zzyxxxxxvuuvwwwvvwyzyz{|~}ywwwuuw{~}{zyyzz|~~}{z{|{{}~{zxwwxxy{}~~}{zzzyxxywvuvwxxwwwy{{{{}~~|ywwvuvy||zyyzz{}~~}|{{|||}|zyxwxyy{}~~~}{zzzyxyxwvvwxxxwwx{{{||~}zxwwuux{|zyyz{{}~~~~}|{{|}}}~}zyxxxyyz}~~~}|zzzzyyyxwvxyzyxwx{|||}~~{xxwvvx{}zyyz{|}~~~}}|{{|}}}}zxxxyzz{}~|{{zzyyyxwwxz{yxxy{}}}~~~{ywwvvx{}yxyz{|}~~~}}|{||~~~|zxxxz{{|~}{{{{yyyxwxy{{yxxy|~~}~~~{xwvvwy|{xxyz}~}{zzz{~~}~{zzzyzzz{|||}~~|||}~}~||{|{zyzzyz|~}}}|zxxy{}~}zwtvxz}~}}{xvvvwwvwwvutvz~}{xvvvy{{{zzz{|}}~~}zxxz{{||}}~~}}}}~~~{xuttuwz}~|xvvxz}|||{{zzyywvw{~}zwvvvxz{{|{{}~}{|}~~}}|}}~~~|}~|}~|zwtttuwz}~zwvxz}~}||}{{{|~~~~}|{||}~|zz{}~~~}{z{{{|}~}{zz|~~}{yvuuvx{~}ywxz|~~~~}}}}|{{||}~|yxy{}~}|}|zyyzz{|}}|zyz|~}|yvvwxz}{xwx{}~~~~~}{{{||}~}zxwy{}~~~~|||{yxyzz{|}}{zy{}~}|ywvwy{~~{xwy{~~|{z{||}~|ywwy{}~~~}|||{yxyzz{}~}{zz|~~}|ywwy{}}zxxz|~~}{zz{||~}{xwxz|~~}|||zxxz{{|~~}{z{}~}{xwxz|~|ywx{}~~~~|zzz||}~{ywwy|}~~|||{yxy{||~~~|{{}~}|ywwy{~|yxxz}~~~~|zzz{|}~{ywwx{}~~}||{yxyz|}~~~}{{}~|zxwz|~}zxwy}~~~~~~~|zzz{|}~{ywwx{~}}|{yxy{|}~~}||}~|zxxz|~|zxwy|~}}~~~~~}~~|zzz|}~}{ywwy|~}}|{yxy{}~~}|}~~}|ywxz}~{yxxz}~}}~~}~}}~~{zyz|}|zxwxz}~}||zyxy|~~~}|}~~}{yxy{~}{yxx{~}}}~~~}~}}~~|zyz|~|zxwxz}~}|zyyy|~~~}~~}{zxy{~}zyxx{~~}||}~}}~~||}~|{z{|~}{zyz|~}|{{~~}{zz|~}{zyxz}}{zz{{{{|~}zz{|}}}}~}}{zz|~~{zyy{~~}|{{}}|{z{}~|zyxy{~|{zz{{{{}~{yz{}}}}}}~~|zz{|~}zyyz|}||{|~~}{z{|~|{zyyz}}{zzz{{{|~}zyz|}~}}~~}~~|zz{}|zyy{}}|{{|~}|{{{}}|zzyyz}}{zzz{{{||yy{|}~}}~~}~}{zz{}~{yyy{}~}|{{|~}|{{|~~}{zyyz{}{zz{{{|~~zyz{}~~}}}}~|{z{|~}zyyz|}|{{|~~|{{{|}{zzyyz}~~|zzzz{{}|yyz|}~~}~}}~}{zz{~~{yyz|~~||{{}~|{{||~}{zzyzz|~~|{zzz{{}|zyz|}~~}~~}~~~}|zz{}{yyz{}~|{{{|~~||||}~}{zzzzz|~~~}{zzz{{}|yyy{}~~}~}|}~~~}|zz{}{yyz|~~|{{|}~~|{|}}~}{zzzz{|~~~}{zzz{|}~|yyz{}~~~~}}~~~~}|{{{}~zxyz|~~|{{|}}|{|}~~|zyzz{{}~~~~|{zzz{|~}zyyz|~~~~~~}}~~~}}{{{|~}zyy{}}|{||}~}||}~~{zyzz{|~~~~~|{zyz{|}zyyz|~~~~~}}~~}}}|{{|~}zyy{}}|{|}}~}||}~}{yyyz{|~~}}}}{zyz{}}zyyz|}~~}}~~}}}|{{|~}zyy{}}|{{|}~~~}|{}~~{yyyz{|~~~}}}{zzyz|}zyyz{}~~}}~~}|||{{|}~{yy{}~~|{{|}~~}|{|~~|zyyz{|}~~~}}}|{zyz{~~{yyyz|~}}}~~||||||}~}zyz|~}|{|}~~}|||}}{yxyz|}~~~~}}}}|zyyz|}zyyy{|~~}}}~}||||||}~|zyz|~~}|{|}~~~}|{|}|zyxy{|}~~~}}}}|zzyz}|zyyz{}~~}}~~}||||||~}{zy{}~|{{|}~~}}|{|~~|yxyz{}~~~}}}|{zyz{~~{yyyz|}~}}}~||||||}~|zzz|~}|||}~}}|{|}}zyxyz|~~~~}||}|{zyz}|zyyz{}~~}}~~}|||||}~}{zz{}~}||}~~~}}|{{}~}{yxxz|}~~~}|}|{zzz|}zyyz{|~~}}~}|{||}}~}{zz{}~}||}}~~~~||{|}~}{yxxz|}~~~}|||{zzz|}zyyz{|~~}}~}{{{|}}~}{{z|}~}||}~~~~}|{{|}}{yxxz|~~~~||||{zzz|}zyyz{|~~}}~|{{{}}~~|{{{|~~~}||}~~~~~}|{{|}~|zxxyz|~~}||||{zz{~|yyyz{}~}}~~|{{|}~~}{{{|}~~~}}|}}~~~~~|{{{|~}{yxxy{}~~}||||{zz{~{yyyz{}~}}~~|{{|}~~}{{||}~~~}}}}}~~}~~~|{{{}~}{yxxy{}~~~}||{|{{z|~|yyyz{}~~}~~|{{{}~}{{||}~~~}}}}}~~}}~~|{z{|~~{yxxyz|~~~||{||{{{~}zyyz{|}~}~~|{z{|~~|{||}~~}}}}}}}~~~}}}{zz|}|zxxxz|~~~~}|{{||{{}~{yyz{|}~~~}|{z{}~~|{{|}~~}}}}}}~~~}}~~|{z{|~~{yxxyz}~~~~||{{|{{|~}zyyz{|}~~~}|{{|~~|{|}~~}}}}}}}~~~}}~}{zz{}}zyxxy{}~~|wsqruxz|}~}~{xspmllnqtx{~|zyyz{{{{zzyxxwvusqqqtx{~}xsppprvy|~xtomlllmnprsuvvwxxxwuuuwyzyzzyxvusqonmmopqrrssrqpprtwy|~}}|}}}|{yxxxwvtrqqsuy|~}}||||}}}}||{zywuuvwxyyyyxwvvtsrqrtvxyzzzzywvwy{}~|{z{}~}zvsqppprstuuuuvwxwvuttvx{~~|{zz{}}|zz{}~}||}}~~~~}|||~~}{yvtrrsuwxxwtqnmlmnprtuvvvxyzzyxwwy{}}||}~|{zzz{{{{zyyxyz|}~~~}|{zywusqppqsuwwvsqnmmnoqtvwxxyz{||{zyyz|~~}}~~}{zyyyzzzzyxwwxy{|}}}}|{zxwvtrpoprtvwwvsqonopqtvwyyzz{}}}|zyz{}~~~~~}~~}{yyyyzzzyxwwwxy{|}}}}|{yxwvtrppqsuwxwvtqpopqsuwyz{{|}~~}|{z{|~~~}}}~~~~~}{yyyyzzzzxwwwxz{|}}~}|{zxwvtrqprtvxxxvtrppqrtvxz{||}}~~}{{{}~~}}}~~}~~}{yyyyzz{zxwwwxy{|}}~}|{zywvusqqrtvxyywvsrqrstwxz||}}~~|{|}~~}}}}~}~~}|zyxyzz{zyxwwxy{|}~~~}|{zxwvtsrrtvxzzywusrrstvxz|}}~~~}||}~}}|}~~}}~~~|{zyyzz{{zyxwxyz|}~~~}|{yxwutsrsuxzzzxvtsrstvxz{}~~~}|}~~~}||}~}|}~~}|zyyyz{{{zyxxxy{|}~~}|{yxwutsstvyz{zxvusstuwyz|}~~}}}~~}}}}~||}~~}{zyyyz{|{zyxxyz{}~~~|{yxwutstuxz{{zxvuttuvxz{}~~}}~~}}}}~~|||}~}|{zyyz{||{zyxyz{|~~}|zyxvuttuwy{{{ywvutuvxz{}~~}~|ywuvwz}~}}}~~}{yvtstwz}~|{zzz{}~~|{zyxxxy{~}{zyz|~}zwvuvvwxyz{|}~|{{|}~}|{zyxwvuuvwxy{|{zxwvwy{~~|{zz{|}}~~~~~}|{{|}}|||||}~~~|{{{}~~}|{zzyxxxyz{}~~}{yxyz|~~}{zzz|}~~|zxvvvvxyz{|}~~}||}~}|{{{|}~~|zyz|~~}|||}~~}}|}~}|zxwwwxy{||{ywvuuuwxz{|}~~~}}~~~~~~}}}~~|zz{}~}}|{{{|}~~}|{{{|~}|zxwvvvwy{||zywvvvvxy{|}~}~~~}}~~~~~~~|zz{}~}|{{{{|}}}|{zz{|}~~}{yxwvvvxz{||{ywvvvwxz{}~~~~~~}}}}~~~~|{z{}~}|{{{{||}}|{zz{|}~}|zxwvvvxz{||{zxwvwwyz|}~~~~~}}}}}~~~}{z{|~}|{{{{{|}}|{zz{{}~~|{ywvvvxy{|||zyxwwxyz|}~~~~}}}}}~~~~~|zz|}~}||{{{{|}}}|{zz{|}~}|zxwvvwy{|}}{zxxwxyz{}~~~~}}|}}~~~~~}{z{|~~}|{{{{{|}}||{z{{}~~}{zxwvwxz|}}}{zxxxxy{|}~~~}||}~~~~}}~~|zz{|~~}|{{{{||}}|{{{{|}~~}{yxwwwy{|}}|{yxxxyz{}~~~}}|}}~~~~~}}~}{zz|}~}|{{{{||}}}|{{{|}~~|zywwwxz|}}}|zyxxyz{|~~}}||}~~~~~}}}~}{zz{}~}}|{{{||}}}|{{{|}~~|{yxwwxz|}~}|{yxxyz{|~~}}||}}~~~~}}}~~~|zz{}~}|{{{||}}}||{{|}~~}{yxwwxz|}~}|{yyxyz{}~~}}||}}}}~~~}}}~}{zz{}~~}||}}~~}}}~}|zyz{}~~}{{z{|}~}||{{|}~~|{{|}~}||{{||}~|zyz{}~}}||}~~}}}~~}{zyz{}~|{z{{|~~}}||{{|}~|{{|}~~}|{{{|}~}{zyz|~~}||}}~~~}}~~|{zyz|~}|{z{|}~~}}|{{{|~}|{{|}~~}|{{{|}~~}{zyz|~~}||}}~~}}}~~|zyyz|~}|{z{|}~~}}|{{||~}|{||}~~}|{{{|}~~}{zyz|~~}|||}~~}}}~~|{zyz|~}|{z{|}~~}}|{{{|~~|{{|}~~}|{{{|}~}{zyz|}~}|||}~~~}}}~~}{zyz{}~|{z{{|~~}||{{|}~|{{|}~~||{{{|}~~|zyz{}~~}||}~~~}}}~}|zyyz|~~}|{z{|}~}}|{{{|~~|{{|}~~}|{{{|}~}{zyz{}~}|||}~~}}}~}{zyz{}~}{{z{|}~}||{{|}~}|{||}~}|{{{|}~~}{yyz|~~}|||}~~}}}}~~|{zyz{}}|{z{{}~~}||{{|}~|{{|}~}|{{{{|}}{zyz{}~}}||}~~}}}~}{zyy{|~~}{{z{|}~}||{{|}~}|{||~~}|{{{|}~~|zyz{|~~}}||}}~~}}}~}|zyyz|~~}|{z{|}~}}|{{|}~}|{||}~}|{{{|}~~|zyyz|~~}}||}}~~}}}~}|zyyz|~~}|{z{|}~}}|{{|}~}|{||}~}|{{{|}~~|zyy{|~~}}||}~~~}}}~}{zyyz|~~}{{z{|}~}||{{|}}|{|}~}||{{{|}}{zyz{}~}|||}~~}}}~~|{zyz{}~|{z{{|~~}|{{||~~|{{|}~~}|{{{|}~~|{yyz|~~}|||}~~}}}}~~|zyyz{}}|{z{|}~~}|{{|}~~||||}~~}|{{{|}~~|zyyz|~~~}||}}~~}}}}~}|zyyz|~}|{z{|}~~}|{{|}~~||||}~~}|{{{|}~~|{yyz|~~}|||}~~}}}}~~|zyyz{}}|{z{{}~~}|{{||~~||||}~~}|{{{|}~~}{yyz{}~}|||}~~~}}}~~|{zyz{}~~|{{{{|~~}||{||}}|||}~~}|{{{|}~}|zyy{|~~}}||}~~~}}}}~}{zyyz|~~}|{z{|}~~}|{{|}~~||||}~~}|{{{||~~}{zyz{}~}|||}~~}}}~~}{zyy{|~~}|{{{|}~}|{{|}~||||}~}|{{{|}~~|zyyz|~~}|||}~~}}}}~~|{zyz{}~|{{{{|~~}||{||~}|||}~}||{{{|}~}{zyz{}~}|||}~~}|}}~~}{zyyz|~~}|{{{|}~}|{{|}}|||}~~}|{{{|}~~|zyyz|~~}}||}~~~}}}}~}{zyyz|~~}|{{{|}~~}||{|}~~|||}}~}|{{{|}~~|zyyz|~~}}||}}~~}}}}~}{zyyz|~}|{{{|}~~}||{|}~|||}~~}|{{{|}~~|zyyz|~~}|||}~~}}}}~~}{zyyz|~~}|{{{|}~}||||}}|||}~~||{{{|}~}{zyz{}~}|||}~~}|}}~|{zyz{}~~|{{{{|~~}||||}~~}|||}~~}|{{{|}~~|zyyz|~~}}||}}~~}}|}~}|zyyz{}}|{{{|}~~}||||}~~||||}~}|{{{|}~~|zyyz|~~}}||}}~~}}|}~}{zyyz|}}|{{{|}~zurqrtw{|yvsqpppqsvz~}zyxvtsqqqqrstuuuttuxy|~|yuqomlmorv{}zwtrponmmmoqsvxz{{zwutssttuvwxxxxxwvusrqqstvwxxxwwvvvwxyz|}zwtrqpqrrrqpoooprux|~|{zyz{|}~~|yvtsrrstuvwxyyzzzyxwwwyz|~~}}|{zzz{|}~~~~}||||}}}}|{yxvtqomllmoqrstsssssuwy|~~~~}|{{{|}~~}{zyz{}~~}|{yxxxxyyyyxvutttuuvwwwwwvusrponmnoqtvwwwvvvvxy|~}||{{||}~~~}|zxwvwxz|}~~}}|{zxwvutttuuvvutsrrrrsuvvwwwwvutsqpppqsuwxyyxxwwxy{}~}|{{{||}}~}|zxvuuvxy{||||{zyxvutsssstuuuussrrssuvwxxyxxwvutrqqrsuwyzzzyyxxy{|~}|{{{{|}}}}|zxvuuuwxz{||{{zyxwuttssttuvvutsssstuwxyyzzyxwvutsrstvxz{{{zyyyy{|~~}|{{{||}}}|zxvuuuwxz{||{{zyxwvutsstuuvvvutsstuvwxyzzzzyxwvtsssuvyz{|{zzyyz{|~~||{{{|}}}}|zxvuuvwyz{|||{zyxwvuttttuvwwvuutttuwxyz{{{{zyxvutttuwy{||{{zyyz{|~}||{{||}}}}{zxvuuvxy{||||{zyxwvuutuuvwwwwvutuuvxyz{{|{{zyxvuttuvxz|||{zyyyz{}~}||{||}}~~}{ywvuvwy{|}}}|{zyxwvuuuuvwxxxwvuuuvwyz{||||{zywvuttuwy{|||{zyyzz|}~}||{||}~~~}{ywvvvxy{|}}}||{zywwvuuvwxxxxwvvuvwxyz{||||{zyxvutuvwy{|||{zyyz{|~~}|||||}~~~}{yxvvwxz{}}~}}|{zyxwvvvvwxyyyxwvvvwxy{||}}}|{zxwuuuvwy{|}|{zzyzz|}~}|||||}~~~}|zxwvwxz{}~~~}}|{zyxwvvwwxyyyxwwvvwxy{|}}}}||zywvuuvwy|}{zyyz{}~}|{zz{}~|zxvuuvwz{|}}}}}|{{zzz{|}}{yvuttuwz}~|zyyz{}~~~}|{{zyxxyz{}~|yxwvwxyz{|}~~~~}}}~}|{{{||}}}}||{zxwvvvwy|~}|{zyxxxy{}~|zyxyyz|}~~~~~~}|||~}|{{z{{|||{zyxwwxyz{|}}}}}|{zyxwxy{}~}}}~}|||}~}||{{||}~}|zyxxy{}~~}|zyxxxxxyzzzzyxwwxyz{|}~~~~}{zyxxyz|~~~~~~~~}|{zzz{|}}}}|{ywvvwy{|}~~~~}|{zyxwwwxyz{{zyxxxxyz|}~~|{zyxyz|~~~}~~}{{zzzz{|}}}|zxwvvwxz|}~~~~}|{zyxxwxxyz{{{zyxxyz{|~~}{zyxyz{}~}}}~~|{zzyzz{|}}|{zxwvvwxz|}~~~~}|{zyxxxxyz{{|{zyyyyz{}~~}{zyxyz|~~~}}}~}|{zzzzz{|}}|{yxvvvwy{|~~~~~}|{zyxxxyyz{||{zyyyz{|~~|{yyxyz|~~}||}~}|{zzzz{||}}|{ywvvwxz|}~~~}|{zyxxyyz{|||{zyyyz|}~}|zyxyy{}~~}}||}~~}|{zzzz{|}}}|{ywvvwyz|}~~~}|{zyyyyzz||||{zzyz{|}~}|zyxyz{}~}|||}~~}|{zzz{{|}}}|{yxwvwyz|~~}|{zyyyyz{||}|{{zyz{|}~}|{yyyy{}~~}|||}~}|{zzz{{|}}}}{zxwwwxz|}~}}|{zyyyz{||}}|{zzzz|}~~|{zyyyz|~~}|||}~~}{{zzz{|}}~}|{ywwwxz{}~~}|{zzyyzz{|}}||{zzz{|~}|zyyyz{}~}|||}~~~}|{{zz{{|}~~}|zxwwwyz|~~}|{zzyyz{|}}}|{{zz{|}~~}{zyyyz|~~}|||}~~~~}||{||}~}|zyyz{}~}||||}~~~}|||}~}|zyyz{}~~}|{{||~~}}|}}~}|}~}|||||}~~|{zyy{|~~}||||}~~}|||}~~|{zyyz|}}||{{|}~~}||}~~}|}}~~}||||}}~~}{zyyz|~~}||||}~~}|||}~~}{zyyz{}~}|{{|}~~}}}}~}}}}~~}|||||}~~}{zyyz|}~}||||}~~}|||}~~}{zyyz{}~}|{{|}~~}}}}~}}}}~~}||||}}~~}{zyyz|~~}||||}~~}|||}~~|{zyyz|}~||{{|}~~}}}}~~}|}}~}|||||}~~|{zyy{|~~}}||||}~~}||||}}|zyyz{|~~}|{{{|}~}}|}~~}|}~~}|||||}~}|zyyz{}~}||||}~~}|||}~~}{zyyz{}~~}|{{|}~~}}}}~}}}}~~}|||||}~~}{zyyz|}~}||||}~~}|||}~~}{zyyz{}~~}|{{|}~~}}}}~}}}}~~}|||||}~~}|zyyz{}~}||||}~~}|||}~~}{zyyz{}~~}|{{||~~}}}}~~}}}~~}|||||}~}|zyyz{}~}|||||}~~}||||}~}|zyyy{|~~}||{{|}~}}}}~}}}~~}||||}~~}{zyyz|~~}||||}~~}|||}~~|{zyyz{}~~}|{{|}~~}}}}~~}}}~~}|||||}~~|zyyz{}~~}|||||}~}||||}~~|{yyyz|}~||{{|}~~}}}}~}}}}~~}||||}}~~}|zyyz{}~}||||}~~}||||}}{zyyz{}~~}|{{||}~}}}~~}}}~}|||||}~~|{zyy{|~~}||{||}~~}|||}~~|{zyyz|}~}|{{|}~~}}}}~}}}}~~}||||}~~}{zyyz|~~}}||||}~~}|||}~~|{zyyz{}~~}|{{|}~~}}}}~}}}}~~}||||}~~~}{zyyz|}~}||||}~~}|||}~~}{zyyz{}~~}|{{|}~~}}}}~}}}}~~}||||}~~}{zyyz|~~}||{||}~~}|||}~~|{zyyz|}~}|{{|}~~}}}}}}}~}|||||}~~|{zyy{|~~}||{||}~~}||||}~}|zyyz{|~~}||{||}~}}}~~}}}~~}||||}}~~}|zyyz{}~}|{{|}~~}||||}~~}{zyyz{}~~}||{|}~~}}}}~~}}}~~}||||}~~~}{zyyz{}~}|{{|}~~}||||}~}{zyyz{}~~}|{{|}~~~}}}~~}}}~~}||||}~~~}|zyyz{}~}|{{|}~~}||||}~~}{zyyz{}~~}||{||~~}}}~~}}}~~}||||}}~}|zyyz{}~~}|{{||}~~}||||}~}|zyyz{|~~}||{||}~~}}}~~}}}~~}||||}~~}{zyyz|~~}||{{|}~~}||||}~|{zyyz{}~~}|{{|}~~~}}}~~}}}~~}||||}}~}|zyyz{}~~}|{{||}~~}||{|}~~|{yyyz|}~}|{||}~~}}}}~}}~~~}||||}~~~}|zyyz{}}}|{{|}~~}||{|}~}{zyyz{}~~}||{||}~}}}~~}}}~}|||||}~~|{zyy{|~~}||{||}~~||{||~~|{zyyz|}~}|{||}~~}}}~~}}~~}||||}~~}{zyyz|}~}||{{|}~~}|{||}~~|{zyyz{}~~}||{|}~~~}}}~~}}~~~}||||}~~}{zyyz|}~}||{{|}~~}|{||{tnkiilqw{~}}|{{{{zxtw~}{yxwwwwxvqou}{uqqrux{~|zyxwvvvtrqx~zvtsrsstvvvuttttuwxyzzwuv{{vspppqrrrrqqqpqqqrsuwy{}}yvuy}|{zywvuutuuvwwwvvtrqsy~}{zwvx{{wtsssstttuuuuuvwxy{}{xvw{}{{|{xvuttttttssrrqqqqrstuvvwwvtsrruz~~~~~~~|ywx{~~}}}~~|{ywusrqsvy{zxusqppppqqqqqqrrrrstuvwxyyyxvuttvz}zxy{~||{{{{|~~}{zywutrponorvxxwurqpppqqrrssssttuuvwxyzzzzywvuuvz~{yy{~}|{zzzz{|}~~~~}|{zyxvusqonmoquxyxvtrqqqrrssttuuuvvwwxyzz{{zyxvuuvy~|zy{~~|{{zzz{{|}}~~}|{zyxvusqonnoquxyywvtsrrssttuuvvvwwxxyyz{{{{zywvuvy}|zz{}~}|{zzzz{||}}~}}|{zxwusqpnnoquxzzywvtsssttuvvwwxxxyyzzz{{{{zywvvvx|}{z{}~}||{zzz{{|}}}}}|{zywvtrponoqux{{{ywvuttuuvvwxxyyyzzzz{{{{{zyxvvvx|}{z{}~}||{{{{{|}}}}}}|{zxvusqpoprux{||zywvuuuvvwwxxyyzzz{{{{{{{zyxwvvx{~|{{}~}}||{{{||}}}~}}|{zywusrpoprux{||{zxwvvvvwwxxyyzzz{{{{{{{zzyxwvvx{~~|{{|~}}||||||}}~~}}||zyxvtrqpprux{}}|{yxwwwwwxxyyzzz{{{{{{{{zyyxwvvxz~}|{{|~}}|||}}}}~~~}}|{yxvtsqqqrux{}}}|{yyxxxxxyyzzz{{{{{{{{{zzyxwvvxz}}|{{|~~~}}}}}}~~~~~}||{yxvusrqqsux{}~~}|{zyyyyyyzzzz{{{{{{{{{zzyxwvwxz}~|{zz|~}|zyxwwxz}~~~~~~~~~}}|{zyxxwxz}~}}|||}}}}~~~~~~~~}}||{{{}}{zzz{~~}|zyxwwxz}~~~~}}|{zyxxxxz}~}}}}}}}}~~~~~~~~}}||{{{|~~}{zzz{}~}|zyxwwxz|~~~~}}}|{zyxxxxz|~}}}}}}}}~~~~~~~~}}||{{{|~~}{zzz{}~}|zyxwwxz|~~~}}||{zyxxxxz|~}}}}}}}~~~~~~}}}}|{{{{|~~}{zzz{}~}|zyxwwxy|~~~~}}||{zyxxxxy{~~~}}}}}}~~~~}}}}}||{{z{|}~}|{zz{|~}|{yxwwxy{~~~~}}||{zyxxwxy{~~~}}}}}}~~}}}}}||{{zzz{}~}|{zz{|~}|{zyxwxy{~~~}}|{{zyxxwxy{}~~}}}}}}}}}}}|||{{zzz{|~~}|{zz{|~}|{zyxxxy{}~~~}||{zyxxwxyz}~~~}}}}}}}}|||{{zzzz{|~~}}|{zz{|~~}|{zyxxxy{}~~}}|{{zyxxwxyz|~~~~}}}}}}}|||{{zzzz{|~~~}}|{zz{|~~}|{zyxxxyz}~~}}|{{zyxxwxxz|~~~~~}}}}}|||{{zzzz{|~~~}}|{zz{|}~}|{zyxxxyz|~~}}|{{zyxxwxxz|~~~~~~}}}}}|||{{zzzzz|}~~}||{zzz{}~}|{zyxxxyz|~~~}}|{{zyxxxxxz|~~~~~~}}}}|||{{zzzzz{}~~}|{{zzz{}~}|{zyxxxxz|~~~~}}|{zzyxxxxxz|~~~~~~}}}}|||{{{zzzz{}~~}|{{zzz{|~~}|{zyxxxxz{}~~~}}|{zzyxxxx{}yvuuvy|~~{xwuuuvwvspw~|{{zxxwvupiiqxursvz|yvtsssrqnnv~|zxvuuuuuuuuuuuvvutrnklsyxutstuvwvuttssssstuuvwwxxyzz{{zyvrrx~}|{{zyxxwvvuuuttsqonpv~}{xuqnlnsxzzxwvwwwwwwwwwwwxyzz{|}}~~~~~|zxutuy~}zwvwz~~||{zyxwvuuttttttuuuuuuuutsqpoorw}|zy{}{yvuvy}~|zwtqnmorvxyyxwvvuuttsssssttuvvwwxxxxwwutrqqrv|~|zwvwy}~~~~~~~~~~~}}|{zxvtqnlklosvxxwvvuutttttttuuvwwxyyzzzyyxwusrqsv{}zxwwy}~~}}}|||||||||{{zywuspmkklosvxxxwwvvvuuuuuvvwwxyyzz{{{zzywvtrrsv{}{ywwy|~~}}|||||||||{{{zyxwuspnlklosvxyyxxwwwwvvvvwwxxyyz{{{||||{yxvtstvz~~}|zxwvuwz~~}{yxwwy|~|zxvuvy|~}{ywutuwz~~}|{ywvvwz~~}|zxwxy|~|zxwvwy|~}{yxvuuwz}xsnljjlnru{}{yxyz||zw{~{xvuuuwz~~~}}||xsqw~ywwy|~}{zzzzywv|}yvsponnpsvyz{||||||zxtqqw}}yurqqpponmlkjihijloswz|}}~~~~}{xx|~}zxvtrrstvxz{{{{{{{zywvx}~{xustw|~}zwusrqppooonnnnorux||zyz~~~}}~~}~{ywvtrqonmlklmoruxz{{{{{zyxwwy}}}|{zyxxwwxy{~~|z{~~}|{zzyxwwwxz|}zwutux|~}{xvtrqponmmllllnpswy{}}~~}|{zyxz}~~}|||}}{{}~|{zyxwvvuttuvxz}~~}{ywtrqruy|}|zwutrqpponnnnnoprux{}~~}|{yyz}~}|{}~|{yxwvuutsstuwy{|}~}|{zxvsqqrtx{}|{yvutsrqqppoopprtvy{}~}{zyz|}||}~|{yxwvuutsstuvxz{|}}|{zxvtrqrtx{}}|zxvutsrrqqqqqrsuwy|~}{z{|~}||{zzzyzz{}}{{|~~}|{{zzyyzz|~~|{{|~}||{zzzyzz{}}|{|~~}||{zzzzz{|~~|{{}~}|{{zzzzz{}~}|{|~~}||{{zzzz{|}~}|{}~}||{zzzzz{}~}|{|~~}|{{zzzz{|}~}||}~}||{{zzzz{}~~|||~~}||{{zzz{|}ztonnrw}}yusrqrsuvtt}~}~~|zxwwvvvuurmoy|yyz{}|xvtssstsrt}}zxxz{||{zyxwvvuuuuuusrnlpx~}yvtrqpomkjkloruwxyxxxwwwwwwxxxvusu}}|{{|}~}{yxwvuutttsrqru}~|zwsqnnqw|}zwusrponmnpsvy{}}}}}}}}||{{yxvttw}~~}~|zxy|~{xvtrppqrtvxxxxwwvvvuuutsrqqsw}~|z{~}{zyyz|~}{ywuux|}|{zyz{~~}|zxusqopsw|}{xvsqpnnnopsuwxyyyyyyxxxwwvusstw|~|zxvvx|~|zyxwwxz|~~}|{yxvtrpnmmpty|}|zxusrpoooprtvxz{{{{{{zzzyxwvtttw{}{ywwx{~|zxwwwwyz|}~~~}|{zyxwusqomllosx{}|{ywusrqppqsuwy{||||||{{{zyxvutuwz~|yxwx{~|zywwwwxz{|}}}}|{zyxwusrpnmmosw{}}|zxvtsrrrstvxz{|}}}}}|}||{zywvvwz~}|{{|~~|{ywvwy|}|{{|}~}|zxwvwz~~}|{||}~|{ywwwy|~}|||}~}|zxwwxz~~}||||~~}{yxwwy|~}|||}~~}|zywwxz~}}||}~~}{yxwwy|~}|||}~~}|zyxwxz~~}||}~~}{zxxxy|~}}|}}~}wqnmosy~{wutsttvwvv{~|{{|~}{ywwxxy{|}ztt}zvvwxyzz{{}{xvuvxz|{yz{xvuvxz{{{{yxwvvuuvwyz{yvsu|{urpnmkjhgfgjmqtwxyyxxwwwwxz{}~~|z{~}{yxxyz|~~|{yxwvvvwxyzyxx{~|zxutv{~~{wspnlkjijknqux{}}~~}}}}}}~~~~|{z|}|{zyyz|~~}yvsqomlmnpsuwxxxxwwvvvvwwxxwxy|}zxwvvvx{~~}|{{}}{ywvvvwy|~~}|{yxvuux{~~{xuromkjjklortwxyyyyyyxxyyyyyyxy|}|||}~}|{}}zxvuttuwy{}~~}|{zyxwvtsrrtx{}|zwtromlkklmpsvxzz{{{{{zzzzzzzyyy{~~~}||}}zxvutstuwz{}~~}}|{zyyxwvtsrqqswz||{yvsqonmmnoqtvyz{|||||||{{{{zyyy{~~}}~}|{|}{xvutttuwy{|}}}||{zyxxwvtsrqqsvz|}|zwusqpooopruwy{|}}}}}||||{{zzyy{~~}}}~}|{|~~|ywvutuuwyz||}}||{zzyxwvusrqrsvy|}}{yvtsqpppqsuxz{|}}}}}}}|||{zzyy{}~}~~}|{|~}zxwvuuvwxz{|||||{zzyxwvutrrrsvz|~~|zxvtsrrrstvxz|}}~~~~}}}||{{zyyz}~}}~}|{{}}{yxvvvvwyz{||}|||{zyxwvutsrrtvy|~~}|ywvtssstuvxz{}}~~~~~}}||{zzyyz|~~~~~}|{{}|zywwwwxyz{|}}}||{zzyxwvussstvy|~~}{ywuttttuwxz|}}~~~~~}}||{zzyyz|~~~~}|{{|}{zxxwxxyz{|}}}||{{zyxwvutsstvy|~~|zxwvuuuvwyz|}}~~~~~}}}|{zzyyz{~~~}{{{|~~|{yxxxyyz{|}}}}||{zyyxvuttstvy|~}{yxwvvvwxyz|}}~~~~~}}||{zzyyy{~~|{{{|~}|zyyyyz{||}}}}}|{{zyxwvuttuvy|~~|zyxwwwwxy{|}}~~~~~}}}|{zzyyy{}}|{zz{}~}}||}}~~}|{zzzz|~~}}|}}~~}|{zzz{}~}}}}~~~}|{zzzz|~~~}}}}~~}|{zzz{}~}}}}~~~}|{zzzz|~~}}}}~~}|{zzz{}~~}}}~~~}|{zzzz|~~~}}~~~}|{zzz{|~}}}~~~}|{zzyz{~~~}}~~~~}|{zzz{|~~}~~~}|{zzyz{}~~}~~~}|{zyzz|~~~~~~}|{zzyz{}~~~~~~~}|{zyzz|~~~~~~}|{zzyz{}~~~~~~}|{zyyz|~~~~~~}|{zzyz{}~~~~~~}|{zyyz|~~~~~}|{zzyz{}~~~}}|{zyyz|~~~~~}|{zzyz{|~~~}||{zyyz{~~~}|{zzyz{|~~}}|{zyyz{}~~}|{zzyz{|~~}}|{zyyz{}~~}|{zzyzz|~~}||{zyyz{}~~}|{zzyyz|~~}||{zyyz{}~~}|{zzyyz|~~}|{{zyyz{}~~}|{zzyyz|~~~}|{{zyyz{}~~}|{zzyyz{}~}|{{zyyz{|~}}|{zzyyz{}~~}|{{zyyz{|~~}}|{zzyyz{}~~}|{{zyyz{|~~}}|{zzyyz{}~~}|{{zyyzz|~~}}|{zzyyz{}~~}|{{zyyyz|~~}}|{zzyyz{}~~}|{{zyyyz|~~~}}|{zzyyz{}~~}|{{zyyyz|}~~}||{zzyyz{|~~~}|{{zyyyz{}~~}||{zzyyz{|~~~}|{{zyyyz{}~~}||{zzyyz{|~|wrppquy~}{yxwxxywuv~}}}~||{{{{{{wqpy}xsrsuwxz{}|zxxxyzxvv~|zyxyyz{{||||{zzyyyzzzywsoqx|xrolkjjiihijloqtvxzz{{{{{{||}}}|zww~~~~~~|{zzz{{}~~}|{{zyyyyyywvux~|yvrqsw{{xtqnlkjjklnpruxz}~}{xxy~}{{zzz{|~||~{wtrponnoprtuwxyyzzzzzyyyyxwvuvy~~~}{yxwwxyz|~}{yyz}}{yxwwwxy{}~|zwussux{|{yvspnmlllmnprtvxyz{{{||||{{zywwwy}~}}}~~|zyz}}{ywvuuvwxz|}~~}|zxvtqppquxzzxurpnmmlmnpqtvxy{||}}}}}}}|{zxwwy|~|zzz}~{ywvuuuvwxz{}~~~~~~}|{zywusqooqtwzzywtrponnopqstvxz{}}~~~~~~}}|zyxwy|~~}{zz||zxvuuuvwxy{|}}~~}}||{zxwusqpoqtwz{zxvtrqpppqrtuwy{|}~~~~}|zyxxy{~~~}{zz|}{ywvvvvwxyz{|}}}}}||{zywusqppqtwz{{ywusrrqqrsuvxz{|}~~~}|{yxxy{~~~}{zz|~~|zxwwvwwxyz{|}}}}}||{zywutrqprtwz||{ywutsssstuwxz{}~~~}|{yxxy{~~~}{zz{~}{yxwwwxxyz{||}}}}||{zywvtsqqrtwz|}|zxwuttttuvwyz{}~~~}|{yxxxz~}{zz{}~|zyxxxxyzz{|}}}}}}|{zyxvusrqrtwz|}}{zxwvuuuvwxyz|}~~~~}|{yxxxz}~}{zz{}}{zyyyyyz{{|}}}}}}|{{yxwutrrsux{}~~}{yxwvvvvwxyz|}}~~~}|{zyxxz}~}{zz{}~|{zyyyzz{||}}}}}}||{zxwvtsssuxz}~~~|{yxwwwwxyz{|}}~~~}|{zyxxz|~}{zz{|}|{zzzz{{||}}}}}}}|{zywvusssuwz}~~}|zyxxxxxyz{|}}~~~~}|{zyxxz|~|zzyz|~~}}}~~~}|zyyy{}~~}}~~~|{zyyz|~~~~~~~~}|zyyy{}~~~~~~|{zyyz|~~~~~~~~}|zyyy{}~~~~~~|{zyyz|~~~~~~~}|zyyy{}~~~~}|{zyyz{~~~~~~~}|zyyyz|~~~~~}|{zyyz{~~~~~}|zyyyz|~~~~~}|{zyyz{}~~~}|zyyyz|~~~}|{zyyz{}~}{zyyyz|~~}|{zyyz{}~}{zyyyz|~~}|{zyyy{}~}|zyyyz|~~}|{zyyy{}~~}{zzyyz|~~}|{zyyy{}~~|{zzyyz|~~}|{zyyy{|~}|{zzyyz{~~}|{zyyyz|~}|{zzyyz{}~}|{zyyyz|~~}|{zzyyz{}~~}|{zyyyz|~~}|{zzyyz{}~~}|{zyyyz|~~}|{zzyyz{}~~}|{zyyyz|~~}|{zzyyz{}~}}|{zyyyz|~~}|{zzyyz{}~~}|{zyyyz|~~~}|{zzyyz{}~}}|{zyyyz|}~~}|{zzyyz{|~}}|{zyyyz{}~~}|{zzyyz{|~~}||{zyyyz{}~~}|{zzyyyz|~~~}||{zyyyz{}~~}|{zzyyyz|~~~}||{zyyyz{}~~}|{zzyyyz|~~~}||{zyyyz{}~}}|{zzyyyz|~~~}||{zyyyz{}~}}|{zzyyyz|~qxqv{qmylvqt|xkq|}}tsxw{{ryvq_sszy|qg}olrswnouotsciynkjqow{kgl|w|{W^ug}v{}xoky~qt|wrrytw{znt}rlr{wtqo]]vzfdefsrxfjlz}}sbt~ypuhjegji{}urnenwkrpzxv~mpvzrjZIUal{toeghfgulvnvwlxqvyp]im}upoqmwz~rq}roswyznz}x}srp}ghl`gt~xtpuhowtcj~xwtnmftkpzv~pyugn}~~vzzqw}mv{r}vvz|vyjpnn}~q^jnnzxq}tnuy{|~mtgoe^alpqtul^mlpz|}s{s~}||wqplo||yqpw~{tkxlqppv~rsopfec]kanfithls}~|{}z}zytuplshnww|n~yv|purtov{xirjnn__ggegjm_lnizx||t}s}v}{{wuspksp~yxzz{sosrn}x|osophb`]h[hadpfnpv{~x}yy~|~szsswil{z~r~txzw{vwqw}sjuiqm_cjcedimfvlltn}yx}t|y{~vxnjip}w~{{{y~s}nu{ztotothf`jd^hYffhrotr{}~}{y{sxz~|r|rhqvt}~y~wtz||vt|xitpoxigojed`h`kngvkw}yu||q{}}}znlmxmzyw}~|u{xxxypuotjeclkal[`abnlror~y{}}tsv~}x|qwuotq{|y}}xzmxpoxjkrkkjfnfmidqfpxzt||}yw~{{pmsviwnntx|~ty}ttvrxniiujin^b^ehflhmvmqz~~~sqxt~||x|sqrnxy~x}~xy{vq}qv|putlnjhojnbclbowvowx||zyzx}{wt{ylwjikp|zz}t|}yzyswohkvklsddaihdifgqjnzp|~}{w}s~|w|yuunruvwn~{z|z|wws}tuunpplsssjbm`cmmhptt}}{}~}y{xy|w|qxuiijtsv|z}xv|y{zpowtiulfdjmggf_cfctrq~wzzwvuwyzwryxxnozpw~y~|{|x~y|tprnlusreil`fmghooqxut}{{{|yz}}s}uliotoruqtyuy}}|qqzslxnhfnnijiaddbrlm{y|zxvsu||ysxyvlmxnr}zy~|~w{~|~urtrowxuhjo`bhacjlowwt~~~~}||zvy}v}}qlptopsspwsv~}w}zmvtkhoqkjic]`]kmhw{~{~{u|tr|}~}yw~zrjuoistr||}~|~zuutorxtkhrfbhcbhhjoupx{}}}}xw}}x}uoswpoppionzv|{|pyxoksrmllh`b^jjbpuzyu}w}ut~||~~~yxzqmwnirpqzyz{z~|zzxxrv{vlnsebf^cffhnuqz}t}}}vztyzws{vrqrnhmn|ys}zzu~wqryqqmnd`_clcdqtyqvy}|z~|v|y||z~zypvuhijgrsww}w{xs{xpmwofjedjeedmjpwqt}{}}vzutzx}}x|vurqdfgsvny~y~|{zvu|turtmeefoe`jlpinsxy{|~zz|y}stx{zsz{nlkgqnqow{y{vy|sr{rikehlhifojnqin{zx{|v~vuwu~|{yywjjisngrw{tw{|z}vyswmhgmqfgmnlckkrou~|z}~~}}}~suw{|y{onikpjokwxy|tt}~|ux~uopjrnljgoilibjuuu~~~yutsr}y{{xllltmgpuxosvwzt~}z~z}w}toosuhgmni`iemkoywu|ttu~}v~{vuqqvlogorrvpnz~|~}}|zpplttoqjtqplacmppx|w|~{|wxuyzzz}vssxtfinqkktpysy~zy~}|{ppsyrjoqqehheibloou{~~wy|vs{}}ttpyuqqjtrtrjoxzy|}{utr{stpltpqjagmllvsv|{~~zvtww}w|~tsu|uknpqhlpnulswuy|~uuw|slopndlihjbjkks~{vxy~~vx}wu{~~y~ywt}wutkrppngmwyw~|y|xtr|uwvqyutmdgmmkroqyv|{~{xxy|xu||xy}znnpoghpkuoqusv{xz{wx}ypsutjkngmbdffkx}xy{|z{zsvyzs}|xuz{t{qvxtpggqww{{tz{~zzuyoxwuofhopmqmjur}yxxx{|w|w~yy}|rruvmjphqlkqor{}z{{qqttknpirhghfisvstv|{}zty|{s}||}~{|u{pwyvqggptuzwr|v}{{{s||zrhjprqsjkplyyy~}|x}wv~}vt|yqrtskqojriloos{zuvw~{uwxupxnnoehfeksqosxvsvxtu}u}{}{y}xu}{yohlqrtwoxvs}y{~uy|{wonrtrtohqiqvtz}~{}}v~yrv}wuwxquwlqhehhnx{utvz~zxxupzutwkkjjmqnhim{{|~|yyyvxt{xswz~|t{{yrmqtrrristr|wx}~xz~~zrrxyvvplshnplpx~z{}x~}|wsw|~{{xvupyxrymihgltuqopyzxzyxtyynlikrvpjjnvpz}x{{{ys{|wvsuv|~~~zsqvyvtnhrkpxssx}zwz||}ztv|~|znpultrnostrtx{z~~~vty~~~|u~{u}xt{plhfkrropryts~vy|}{x|~uuqoswrljlqiqwt~{~}z~}uxrqqv~~|tsx||zsiqkkutuwxsqtwwvxw{wswmrvpnpqlmsxy}}{{uw}}ty}w~{|}y|}t~zrqnmpqljlsvnwvu~~yyzwsstvxwsrqumirkoz}}z|}||{}{{xxvuy}|z}~}uty}}{rrsgmpnrvvposxw|y}|}v{zowwutsnhgkps}}}yz}}u|xt~~~}~u|uqppsvsnlmtroxpox{{ww~{wvvz}yqnqvnlsjmuyzx{}}~utuw{~|z{}yxz||{suymprpqstpmmoqzy~v{}swurtvrkiklnyz~~|z~~|w~}t}~|y{{sssuxxrkkoojvupuwyxw{xuuw}zvsvsmtmhnprsw~}|}xuv{~xwy}~~xy}~{yts{rqupnpqnnqrqt{|||~xy~uy~yuutojhhioyv~y{}u{v{|{}xtposx{xurrphpqmsusrt{}yz}|ywvwqkwrlopompy{~ywux~{{yxyx||sr{stzwsqpkhjnoszt|}}{}ty|zyvrnnnmkrunz|}~{~x}{x}}~zwz~~z{wstxyussvmhrlksvuppx~~zy|~rptlnqokjmu~~}||}}}{z{}{t|~y||~~uyvpxxvvsmiijlpzwpz{yz{{z}}}zqjjllnsmqyvz}}uz~~|zvvx}~wwxyyzwwwzvmqlfknpopsw}||yy}wvzonttoijpuy~}}zz}{|vyzsx}}~z{ry{zyxsjeffhstrzvtx{~~||}xrnmnswlnsmms{||~{sqrsw|yy~}vsuzupxoimmkimswwyy{|}v{}rqprpmmpstts~}z~}xxtyzzz|}z}x{xxzytpmihkqloxqmnu}|wusplrwousmmms}~~}}xuttu~~}}{y|zy|wsyqmmkifhovxvpt{}y|xzytnnpssrqmt{x}x|tvvvsu~|}|zyzvpnnjhokjtrqpot|}{}zvwyvvwotwniimry~~|xwvsqx{u~~|{xqzxqttngfinsvupwwv|xuz{vomswwtmmvqv~|{z||xtrsyy|}zwssrqpsqgmniknrux{}{zwuuv|zovxspmnsutw}~wwzzx|xt{yz||}{rxsqtsqkgjopqpqzsr~}~|z{{ytrquxxqounqx|ux||vqsx|~~zqnoposwmnpkikpwyutyzzzyv|~uxsmooqsuutw}|wsuw~|t|{vx||z}~x|votvtomnnopmkwwrwx||~y{zwstwxuusqxrnwxy~zz{{wuvz||z~||~{tpoptyqqtiggiowzywy~||xvy|u{~tnnrvwsprvzz~}|yu}x{ysssy}v}|qqqrpnptsomjqrq{|y{}z{~}ztrv{|xpoyuputvw{~}~|~zvux{|{{ww|wutoloxrsxrlhknqstvxyu~~{~~tyzurnnuzxtswxr}}zz{{y|zy}vtux|}w}yxytpmoruvuljrllvxyyxz|~~~ogfcpz|wpq}}z{iiwjwzoqnpfhksj^bqzmcq{pjgrqmssy{ni{eyrhef`guv|z~vyjl|mfp~pu~mq{ojlnpvzp_etrkowzv|~}yytmsw`oxuvzy{}~orvzunjm{wpgovzyvsu~uiqy|~|}}re^bs}~st~tprjiqoeo~~}wquuovwqvtx|tmnvtq}vidlw}ujicagrwyz~ztwx|xxyyywmjouustvvw|t||zzyz||~{y}}~uijfiorvzukgee`fqnotzzvrrv{~}}{nllfmnjqsstrsx{|{{{{{wrlijjlsmmlgfdcbdfggnxstvrtywpokfccghotqwwtssw}qgcejmljebea_gfgkihjmqstyywmnncbegefnux{{uy~|{{~zrjemkekjecda^aeggkkluqlou}zsnifb`dkgmxttvwx{}}~~wohgkomjjkf^cc]diidbjrvvut}ptrllieccgpwxxw~zv~}~}rkojjolljd`]\^bgnhhtssrt{{plnmjilfinnpqv|}|}|yxvpnmlkiklcde`behhffksxyt{~zzrjoolecgkouwt}y~}~~~|yuumgmnlklg__aacmmimkmqtx}zrkiklqjgpmkpuy~}{}}~|urtwtoklophik__cccdimnpuuyzz~~snoplhgjnpqr{~y~|ztzxmonnomjfa^_`fhhrpjlrx}~~|xvqkltokmihhlv}}{{|~xuvyvmijnijngedeb`dlqqonw~y}{~}vuqlkklnmnnkv{y~~|~x{vuunklnkgggbciddmkjijs|~zvvupoqmrskijlqx|{}{}}~}{zzywrqlipkfjgb`adjornktvyzz|xpikprqnjnspy~}}}{z}|u{{vqnkigfgfhedjhiklmpuxz|}zzyzznnsnjghnrtx}|}~}|~yvxyqjpnkmljc_cgilmmsmoz||}~{||xsoottrjmqlry}~|yz~zy|{}z{ztmiklkkphchcachnqppv{y{}{y~wwtppnmmonms{}z|~~{|z~||ytskknmjhfegihekrmmrvz|zwy|~{yywtttproioqry||{|||~~{|}}}vmjjkmqllledcdjoplkqyvy}y~|{pmnqrqonptxw~~{}}}~|~|z}~~zytoopojilliheemjmqnouxwuw{~~z{~~ztpuvnoqqqtxwwy{z~{~|zxupnmtqlqldabeimoppqqs{wuz~~~xrosvsnlnrnt~z||z~zxxz~y{|wtqnllmoqoicijfnrrpprsttux||~yqutqtqnpqpswz|}|}|{~yuuuqnroptoliefiihkosmnxvxz{||zywtruvtsrrmputy|~~|}}}zz}~~}vyztmjlprqpiijeilnqromqvyy~~}xytovwtqpolntxz}}z}yyvvwwwqkqokjjjjjjilrrosory{zy|yxyyxspqsuomtqrz~}}}}}||~}yuvwunkmprqmnpghmkmqroklrv|}|x{|rqsttspmnpsx~~z}zvsszypspmnmmpmhghllmusnsx{zy}zwvx|{uqswtpsnnruz{}{}}zz|~}zwtsrqppqnpslkkjjkmnopor{|~x||wzvrtusmklnpz~~{~}|}~}}zx{vvwnjjlorrokknijqopqqtvz~~{zz{zwtrspuvnprsrv|{y||}}{}}ysrvxuqnmtpnsokkkihknnowy|~~~wy|xtrrqponotwu~|}}}{{}|||~zu{zsnlnrronnmihnklrspmry}~}{{|zpqvpppoonr{~~~}}|x~~zuux{ysnsqosrpmjhfgknqupr|zyy||}~}|ysnnoomptpw}}~~|||zwy~y{vutpprtsrstlhlggknollry}~{~{z}}vwtpttqllotz|y}xx~~|{{{{{xuvprvtssogdefgntpquuwyy}||}zsopssurntsrw{~~xuuvy~zwvxxurprtuppphikkklnprvzy|{~z}ypqsspmnruwz||~{~ywy{}|{~}{xy~urttttspkhhhkpnqtnmrv{~}|xuqoouxqttqqtz~~xvwww}~yutw||vstxuqvpjijigjostssw|{{{zwurrqqrstusy}~vwxwvx|}wz|yzwuuvtpnliglmkrtqootz}|{~~zxxxurvvswrnnpt|~~}zwutv{y}}{xxyzyvturtxrqplighlruuqr{y|~}|}wxxupnquvutqu{{y~{{ywusw}{|zv{{wtssrqqqnonjnnmoopt{}~|wuuvuxtqxwsqpsvy}zyz{yw{xu{|zyz{{zyz{ztpvsqrrnihknqtsswux}zwyyvqnqvxwssyux}}yz|zvstvz|}yx{{{xsonppprtlmpmmoruvvy}{xwvvzzsssqrqruxy{xuwyy|yuzyxz{|~}yvw{ysvsqttrolkmoppqxvsy|{wxvutsssuwuuxtv{~zx{|yutvxy{{~{{{xxzxroprruwqpnjijntxwvyzwvuyyvzupqsuvvuvy}{xx{zwyussw|}{z{xxzqorsropqpoolovtwyx{~}|{xtrtwwtssxysvxx{~|zxxxwxxxyww~|~{yxwtqonqwuswqlkkmqtuuuz{~~z{{uxytompvywvwz|{|||zw{}z~zuttv{~||||xu{zutrrpqrutqmlqoqwwvvz|}~|xutwyyvpsxuwxwxy{}~zvvy{{ywuyzz~}|yvuvvtrvuswsokiloqruwyuw}}yz{wvsqrvvutvwu{~~{y~zvssuxz}~|xzvwxuqoqtvvuomqmosuvvtsvy{{}yxyz{yuvtrwwuuuuuy~~ywy}~|wvzvx~~}xttvvvwsuyusronnmlnsvsuww{~}|||~{uuuvvutvwyvrxww~~~~{~|{yvvwwvy}||~xwyzwqpsvxwssslmpoqttqpty{}~~}|zx{xruwxwusqqty~|{{}~{y{vuxy|~}{ywvwz}vtvsrqrsspnnpsqtvprwzzy{|ywwyyuqswxsvvsvz~|wwxyzywwx}~{|xxwwvutuvwvtxtoqoopqqpoorx}}~yy}xwvsuwvsqrtv}~}}|z~}vxyxy||zxxwuy{y{xssstuvrnmoomturstvwy{~|ywxz{ywuvvuxtqtuwy~{xx{|zvuvyw{|{|yvtvyxwvtuytttonnnnoqsru|{}||~{{|wz{wttusqpqrw|}}~}x|~yzywvwxyz{{z|zv{ztqprvwvusrplppostrruz~{zzywwwwtqxwtuuutv}}{xx{}|zyzwu{zz{{yutvz{ytrxvuxvspnlkloqswvy~~}~xwyyxvsqrtutuzwz~}|}y{~{xwvstwyy|~xy{xwtrsuuttutmoqmpsusqsz~||zxxzysttruutrsv|~}}|{zyzz{xtywv{|{xwwxy{yuwtswvutrmklmpsywtyz{|}{y{yxxwrnorsuyvx}}~yy|{zyvtstwz}z{yttuuuuuuvxxrrpkmopqrtvz~zxwxxuxtptvusruy|}{{~~zy|~zwytsvyzxyz{yywy{ttwwvvupljklpvtwyvx{~}{ywwwtrpqsxytwxvx}}}}{{|{wsrrsv}}||wuuwywsrtxutwqmnnmmptwwy{||{vxysrqrsstvxz{|~~~{y{{y|xtvvuvxz|}{xv{yvwttuvtrpnmnrprwtrrv|~{zwtssqoswuxxuuvz~{yzzxvutuyyz~{xvuvy{ywvwvuxtqpmljlpuwwtw~}xzzvwvropsvwwwv|{y~zvvutrtz}~~zx{xy|xvuusrqqnnpmptssrrv{}}~}zvuvvuvtrwvrqruy~{xwwvtuxux~|{zyyyxxyxxsvyuuurljknqtusuww|~}~zvwwuqoquwwusyyz~{}zz{xurruz}~{|}xx{zywussttttsmnolmoqsux{}~zwvvvzwrvvtsrsuwx|{xxzzyzvuxvwxy{|{yy|}wuwstutrnlmopqqtwrv{}~~~}~{zyxvsrrtwwtvvtx|{wzzyustvx{{{|z{zz{zuqqrstxtprnllnrttruz~}}~{zxz|wwupprstuvwy}ywwy||wyxuuxz|}{yxz{y{wsuvusqppooonttruuw{}||}}|zwuuvvuttuxutxy{{zzywvvwwwwz{|}zxyyxusstvyuutmjjkosuutw{{~}|yz{wzztqpsuvttuy|~~~}{y|}yzwsrrv{}}|||zw{zuttsrrstsqnmqrqvvuvy{z{|~~zvtvxxvsrwvuwvwx{~}}{wvwyyxwuu{{|~|zxvuvtrswvvyuqmlmoprsuwvy~~}~xwyusqoqvwwvxzy|~|||{{|y{}xussuxz{{|}xyzxxwtrqruvvsnoqnqtuvvvx{}yvvwxxwstutxxwwxxy}~|wuwz{zwuxvw|}||{xuuwxvwuswtrpnmoppruywuzz|{z{wutssrstuwyvx}}~}}~yyzxvttuwwy|~{{zuvxwspqtvwvrsqmprsuvusuy|~zxyxxwuxtquwwwwvvy~~~~}zxxy{{xwyuvy{|}|yvtuvxzuuwutsrrpnmnqutwxvy}~~~zusstvussvyyuxyw{~}}}~zxxwwwvtux||{~zxxwwusstvwuuwqopoprttstvz~|zxuxytutuvwvssux|~|{||zzzy|xuwvwy{{yyxww{ywwsqrrtutpoprqrwtsux{{}|xvuvwvsrtvuxxuwy{~~}wuvxzywvwyyz~{yyxvuvwwvvuuxutspoopopqrsw~~|xyyvxvsrtutstuw}}|~}yy}zxywvwxxxxyxxzxz|wtrsuvusqppnpsrttttvz}}yxyyxxwvtswvstuuvz}zxy{zxvwxux}{{|zwuuxzywtvxuvvspnnlmprsuww|~{|}}~{xzywusrqrrrsxy{}{}z{{ywvvuvy{{|}xxzxvsrtwwvvvsnopmprrqpty}~~}{xwxyvruutuusrsx~~}|{{{{{{zvvxvy{{ywvwy{{wvxuwxwusolkkmosvsvzz{{|{{zyxwtpqsttwwuy{}|y}}{ywtrsvyz~|z|yxxwvuuuuvwtqrnmopqpprvz}|~~|z{{wwuqrttrqsvz~}zyz|{wywuwyzyxyyzzzy{xtwwvvurnllmottruttwy{~|zyxurpprtxuuyxy|~||z{zyvttuv{~{||xuuwyywuvxyuutnmmmmnqstvyz~~}{{zwyysrsssrruwy|~~~|{||y{wtuuvwxz{|{yw|{wxwvvvtqomlmqqrvustvz}{yxvutsrrwvuwutux~}zzzxutssuzz||ywvwyyvuuwvvxtqpnmlmqtvvvy~}yxyutsqpqsuvwyx|~}|{x{|wvvustwz|}|xyzxzyvtuusssqopqnrtrrrty~}zwtsssrtttxxuuvx|~}zyxwwwvuxww|{yxwwxyyyxxuuxussqmklnrtvuuz{~{zzvuvuqoptwxxwy}}yyzwxwusrtx{}|z{{wz{ywutrrrrrrqnqrqrstvx{~~yvuuuuwtruutstvy|~{wuvwvwxuvyyzyyzyxwxzzuuwtuutqmlnprttwxvz~~zvuutrppruwwvyzy|}ywyyvsrtvy{{{~zxyxyywtrsttuwropmmnqtvwx||xvutwxtutsstuvwxz~~|ywwxy{xuwutvxz{{zyy|zxxtsttsqpoopppswuvxz}|zxvtsssstuuxxuy{}~}xxxxvuuvwwxz~|{|zyyywtrrsuxuttommnpsttux}}}zyzyvwupopsuvvwz~~|zywx|zyzvttvy{{zzzzxz|wuuutrrsrponpsrtuuvy{|}|yvtuwvtsswvuwwxz~~|ywwwxxwwux|z|}{yxxwwvuuwxuvupmklnqrstvww|~|~}}{xzxurpqtuttuyy|~~~|{|zz{vtssvy{||}}yy{xxvtsrtuvurnoqorttttuwxz|~zwwxyxusuttvuuvwy{}zwwyzzxvvyw{}}|{yvvwwvvxvxxuspnmnnoqtusvzy|}~~{{yvtsrrtuuvwwvz|~~~~~|z}{xvuuvvxz|}{z|yxzyvssuvwvsqrnnqqrssrswz|~~{{zzyvvvruvvuuutvz|yxz{{zwxwuxz{{{zwwwyy{xuwvtsrqpoooqttsutuy{{{}{xvuutsrsuwuuywy~~|{xwwvvwvvx{~|||xwxxwutuvwwuuuooppprrqpruy}~}{ywyxstttuutstwz}||{{{zyzxvwxxz{zxwwvw{{xyvuttttronnqqrvtsuxzz{~}yvuuwvtstwvuxuux{~{xwwxxwuuvyz{~{zyxwvvvvvvuvxtrqonopqqstuy~~~|xxyvvvsstutstux|~||}}|zxz{wwwvvwyyyyyxz{xzxtrrsuvurqqqortrttuwy}{xvvvutstttxwuwxyz~~}zwvwyyxwwxwx|{zzywuuxyxwuuxvuvspoonnprsuz{~{zzvvwusrrstuvwz}~}}~~}yz{xzywvvuuwxyy{zxz{xusstuttssqnqrqtuttuy~{yxwvvvwtruutvvvvy~~}{yxxxxwxxuvz{yoeacp|xpqzwrewqjhirpkvw|wsotpjkssmnkm~tfyvifgkzfozaj|~ulzu|}ysmnxxf{|glx}{uns~~~nszznm|kmtvsmjtwkhnsphgv}g_s~~}|tmxvnnmihq{fex|st~{xvv~}qllllq}vfjyriku~rgkw|rgbbdgn{wwz}z}zljq|wnhgioy~|spt|}sknw|uqqsx~wrppszse`eowxzwpkilt||{}}qfcisvxyupnnt|~|}|qihovxzysniimqsssspjjmqx{yursvy}|xuoknqw~}zyy{~zussuwwvtrnnqtz~wogacefjkigfhlprtvyz{~xqkghijljhhilrwz|~~}wpkjllpspomklmnmllljmprwzzywxz}|yuqstuz}}||~}ywvuttsspptvy}}yuqlhgccedddegjmoqtvw|zuqmljgikihhhknqtx|~~}zwsooljmnmmmmnnnnopnmqsuyzzxwxz|}~~{yzxy|~}{{|~~}{yxwxxvvxw{~~~}}}xurpnmkfggeefgijjmptww}{wsqqojkjhiijlnpsw|{wusrrpnonnopqrqpoqssruuvz{{yxwwxyyz~||}|}}|{zzz{}}}~|zz{z{}{{}~~|||}~}yurqppqmkjfeegjlmnptxy}~ytsuyy|~{zz|}}}vvy|fqh}~||laxhl~}hwukkomgp}k|ymqsqr}wz}|zs}qkjkpxnsru{y{wuw{omzrpuuvztu}tbyxdgrxrfZ]pzm`dpxyvs||uszgekng_\hz}odfnttt{yjuxjfjjdaftrhhjjhmynm|sjisrq}{}}tt~|plnx|t|~~|xvtx|or{xpor}vkhr~wlhfdejqxxsmjjknz}x~xy|qnlknrx|{vqopsy{qnu|usppsx}|yxxy~ynjlrxzzvnigglrvwvrljnyyrrtwxvsmkijptuuspmoxyrnosvwvrnnlotwxvsmijpy}|yxxxyyxvvx{|zvv{~~zyz{||||}|}ytsv|~~~~}vpkiknoolkjefghhihgglt||vsrqpomnkijkllkjilrzyspoppqpoollnnpppnmnrw}~}||||zyy{}}}}{yvtux|~|{}~||}|{|~|xtpnmmmmlmlhhgeefffgjnu}|yuspopmkkihijiilpu|~ywutrqpqqnnnmmopooqsuz~~}}~~|yxyzy||zywvtstvxz|~}}}}}}{{zyxz|~~~zvsrrqponppmmkhffffhjmpv{~|xtuspqomkkkjkmpt{~{zzywtsusrrpooopqsuwz}}|{z{}}|{zyvwxvvusqprtvxz{~~}||{y{|yyxvttv~|~sr|vvnjukkkl{k~mhqiav}zzgxownuxxsi}ievsjzxwwz~{{yvxmsjhuxlynuznjmvletylimuxezsr~~}zkkywwznk{x~~~ssjo|{krsllokhlxrd_`bado~oiy|xvqpwtibbcel{~po~{{|trros|vlhhjp{zmku~}umikpw{zywqgcm}yuvy|~tljmqx{yyunghtvuz~~xpllpsxzxvrmkp||xxxy~}vplmqx~umhkrx}~|z{}xutvz~tnjmtz|yy|wqmlnprrnjhhkkmokhebchr|~ysonnlnnjheehox~xutttspnllnmpokjijnu~~}|||{zuolhfgjortuvy}~~~}||vrolklosxz{}~xurmkjjlmmlkkkjkjgfeeglsz~}zwtrolmkiihilqx~|xuttsrqqpmmnlkklmqw}~~}zxupnlihghknpruxz{~|zvrqnkijlptwz}}|xvurpnmmmlmmnmkkljjkjjjnsx|~}|xsrollllmnsx|}{ywutturpqoopoopsx}}}}}|zxqnlhgghjlnqtwyy|~~}||xsromlklnprvz~}xvurqppqqqpqrsppommmmmlnptvyz}}}}{vsqpooprux{|}~|{{zxwurqrrqqsvy}~|{{{{{yuroi~|xustzipyt~tzu}w{||s{zowwhwzj^aa^emqj|zlvlo~jwxj`ajqav}x{wxp|zxw|yy}yvuyoko|sjlv{xigwtaz}tylmjsvoptx|wsef|tu{vb^sruo{w}yszxt|xwtw~mj~yn_W[px~wpprqp}ns~sxopjsy~ujjkknudqx}y{vrsvu}|}uqpxzww}ytp~tlmqy}wtppyqz}~ymrtqxthf`cokquuxqq|{yvnljgddotsqus~z}zuffhfbow~~}yqlsnkgfjprqtxpjkrv{~yx|~vjaegdgqqtwz}ztuvmfddguyzusrpr}xqsw}zxqnb\^abp}~|zwwwsqvvooty}{|wvw~|{}uspimmjjnqvwqmturt|zvmllicnu{vrvnd`bk{}xvstnonhbigc_bcosuw}tnmt}}{vrnlks}{rtry}ywtjgjigjlkka_dkhjikpwvvtqq{vutpmif`fmrszxxvlhjjekr~vvrnkv{|wytptz|wtukh^[[`gpwwrsokjtszror}|~zx{|{wriljs{}zuuyzwz|y}uv|{~~ysmgihqx~z{lfgjlux|{z|}{uxz{vwvrpomiaabeiz}{qlpnqrs}{xpw}~yqelm|wonjkji_bbeicfijehejmntxzxvnlihmpuwvt{upq}}yuuxsmjnikgr}y~xvqoffeiw|yvqpppgnmuwtuwtrsoz}|~~yukoy~|xpmvt~xvswuzut|srifgadfgfnmvvuwqw{~}}{{}~|{~x~x{{z{ootpqkfjoxxvuvpssw}zx{z~~|x~{{vnkehx~|{ulge^hekd__dcc]Ygnuzvuypmkjkrnqtt|}}}xyvqyxzupjhfjjhw{}{pomov|~vuxtnqpu}y~srquv}wy~|{zxuv|~}wswr{xvtqtrollfvrrtosj^adbdeest|y|zt{y~}z}}rvqqxw~~}}rqosswnsw{z}}yzz|zutwy|}r{}urvvx~xxuoqqmqgmhhcaaiis}~}u~zuvllpjbghs{yryv||tokljilh]gmvy~}ty{wxztwnqortvuwqqzvwzqx|w|zuwpmsnpggdgn|x|yrtiglb^`[[hr~z{zyz{v{zvpslmy~ywxxxuqolfqu}{xzw{~v|wyz}|urzxruoryt}{z{yspptifaegoz|{}prnmpb\ddhz{{~y{~}tpxy}yyzwxuuleglfr|xzz~|strwvuwusopvuinqt}zwwx}~rqvqskims|}yxlnogfe^jv~wv~}yuususspov{yuwx~wurmhdcmmowty{~|uxy||xtxzwuysw}}{ss|z}ytuppqnv{zyzssw|{piolhhbdliv~z{v}{xz}utv}}~|rjhhdeqqlqvx~rusmotwwkfkomggsry}~~vvvw~|vs}vnorx}}~~vnntkefejwy}{{xvnrtsogkr{}x|}z}}phiikjjphirtw|x}~y~}~|wwwutsyz{utu{yy}~squz{vyxx|}}vyxy|wtqrsmkmgjmq}}|~~~~{~{~~{{zy~ytlhknmdcklqrs|{{urumqytrnourjhkoqu}}wtw{|{vtvy{xw|{y|ru{zqgnnow}~zz~~~ulyxsppsuv{z~{|wsutnjpojbdpmlmrx|{}||{tw~zpqx|xzwwyxyuifosxzw}~v~~|qryty|}vpmrupkfpv~~x~y{w~ytvzwuuvurkidcd`f`bfmxyyvuyzrtmorsqniitv}}tnkry~x~{{}x{{ztopnoir|vuq{wpu~{|uqrosw||uutz|phnppffjjnx}uw}xwswxvv{yww}vwpmlicituuny~}xwvxt{yvv~|tjnsu||xytz}~}xowx|uuwpsv{vkdhic_Zdgqz{}}}tuszummqy}~~~~wsqtrqnstqwv~~}~}~{xyx~y{uszyzrmjqy~xzzvnltty{{~|vxt~~xxtuxvzvvttlkhfjgvzzxtuzstonrw{~|xtphkgkoleckpvptz~zxnmhilhqyez{|{u~|fgkrhpwx}vip{zvutxtgcfkldj`^lsrysnvsyzwx|{n}{nbdo}xzttxwweaz|gqtjmjpwvyywwgszonnpqpcptkzqtyyzv|gowvzyy|vu|quzhctt_Xaeorxzxz|ut~yilw}zpyxuqzyrc_Z]ds}k\\ks|}}zxnst~tjejgotvy{zooq~}pagrxqqv~z|vnlpqz}~skd`fn{zrfouxuorttsxz~{~{~wpoks}|ubabcbisv{|tz|{y}}~x}yyt}{{}znjgkmqopgab`kyzvwz~njmjlnslgagechqxrqx{rpkqpmjnrt~~z{tvvzukjff^YZho|{|}~toy{ylinqpknea]``fs{{txzppikmqokdchdf_elv~wwsyxqrptqx~{}|}~}trptnhda^cu|~z~vryunmiqonic]]\Zegnnwyqpmoiiqpkbhhibbehp|{mowvtinrtx{|}zsktrohdhdelxz}|yssrwqrtpecc_acjddjw|ulropqoqiijmgd`ehlz}}z}{}wvquz{uxvxsmomqtws|~{x~{|}tovvvonkcb]^^c_^Zbkovw|}wposuvkikpmieehgtx~~~~vvsvtu~y|zxsvwtklimkvzvtuwty{~}~{w}|yykjjidhig`\ffjhny|{rowvrhgpolcgfhmwyy||zy~yx|z}yv~{{~z{z|wprusvvz~xz~~x~x{|||tvunfad`dcc[W[^b\`fr{|zvxnpqpqklknr}|~||{|||zwv~~w|~~zwyzzwv{wunnmluz||sms|wvr|}|yyqnnejnogaaefbbbjn}{|ujkornehjllwz{||zsx}}xuz~{xttvsu~wyvyvyxzzzyyuy|z{yyw~{wxx|~ymdhddadf_Y[a^]Xadjytmsxtrlqty|~~~wuyvz|{wz{{}{{vsx{yyx{rtvxztrrvw{uz|ukpu|~{}{~|ywnjmkonhecighbcfjr{|}{}wrqpnpkpno{{xt{|tst~zuwpmpkquyvtu|wxyywvy~y{|~|}{sox~|zxwzwx}~|swz~~wrmg`hjibYbef__aeht~~z{}vqwx|~~yx~sqqqpqywsnx{|xy|qtppry~wnnwvvprxx|yxzvurtsx{}wryz}}|xwwpmnrkhhjnjggllw{~}swy|yqmrw{~|{ruuyxz}sjgjgnoomkruyvy{|yxxv}|}yyyzyv{y~}}xy}{vvzrsqqv{~zwv~}~yzzrtoppohecgkddcffjtxz|{}|{y}z||ytqjmqsqhmrvrrsxz}xutpvuuppyytnqrvw{}}~vsvy|wtmmnqpr|~|v~{{xxv{{shirqpgimns{~}||z|v}~|yw|yz}y{|{zwskpnjgllgefoomiosw{}}ysv||uryy{{}}{phnnottwstx}|yy{xsuptwvqihimggeeksxw|zxsx}~||}urrrturnkhpoonloox~zyy|ysopvuvsros}{vt{yyxvoiedkotolrz|{{{~~yx||}utvuonnoqo{~{}yz}|zyy{~~yqmjjiprlaagijbfilp{~uz|{yv}}|}}srqlhntqnktyyuw{|yzutswuomoupibhjmuv{}~wvw|{uut|yz~~}ttsotuxqkjookkjps}~~}}}{rtuxsoqsy~yzz|xvvmjhihhgihgopttuy|~~||ytt{yysqos|~zx~~zxw{~~~{~{~~{qnkikjmgfhjfdcchgr|~|~~{zy}xsnomnsqjelqvrpvz}|zxsvxunipprmmomlt~}}zyy}{wqtuzxyztxyvu~~xxtsqwsnkowtnhnos{~}~|}xuy{wtqwu{{{{}zyvpffebgilgablpppqz~vvw|yvwy}~zzz~|{}vsrwwyy|zw~~~upmlimkjcbijmhfdioy}|~}tplklmqlkjmmopqwwzzvtxzwpnospomort}}zz{~wtrwvuurnjnnu{|wv|xtvywkks~j]b^Zgpyrgbn{jYbaesypw}yyjmz|ecpyu]Xb\o~~voylpzyqx{kfdmo}yqpimoo}d\}p{~z~vzirwmnqic]e^ahpznx{}{evtdmvx|{wvrppxwrqzqtvylpz|aLr{rliusw|pmpsgfrtzwh]^isqilofgcoz}zljwsopzmjg_isw|kqvu~{y{{}zcR]xjhnilhbifjt|vhlccj__ZRPWhswxqnv~jcusiniadajwt}rntqxzqxxww|tzpi_JJazulnrnsso|{~vjja^d``aqwwxrlkw}m_gzytumojessxw}yyywxxzy~ow~~wl^[NJZp}y~{{rtoojryqruvoovz}wwtxz{vxua]hx~|wqngkvq~~~}|wsv||v|y}~~tgbcTYjz|ttqso|yvwwulsssnknprot~{~xtzrsn_dr|yzxottr||s}||xzy}z~wwy}yufc\R`qzwttuuuoorrmwtvpkkmlhn{s}}wv}|~spipkckt~txqqw{{}y}yyzvtxyoiY]UOaszrsqowjkkqpo}xvkbfjhelzv~xvvrv||mi`je]ht{y|y~yysooldfY]UO`q}pmjivjjinmjwoog\afgfjunzz{ywuy}}nj^gfeuz{{z|xsmnmfh[]YP_lrlngtjjkmndtsto_`eeeanmy|yxzvrglupy{|yyutxsvsrnok^_ZY_Tcq||{nmalkkrszpz|yzhdifihst{wwwzwojtn|}y{}tuutxqqmmgfcVYWWaYis}z|lmblnp{w|~|qlqnqmtu|zws|vrgank~z~zz}~yzwsxplfgcgeVXUU`Zhrssdmkpz|u|zzrpslmiqr}zvpy{npfckjzy}~zsywysuyrmknkohX]WZaat}~vqckenvw}uy|mnmgifmo|wsoyxpsdfhlzty~zu~}y}t|}yqqnmsg]cZffm|vwjfjgvy{|pyrkrlhfehp{x}vuorzomk^fdt{ys}z~~~}||u~zqknkpracb^ebqz}ttekfkrx}wu~rttjibbctx|~vspippgna_bh|xz}|{svyslnkjrd\_U]\eq{sufcbaln~s|sovmjfbcpyyxrphmtjnh\`_pz~yu|xnmmhoiX_XZ\]inwtl_d`his~|rtyowsmmhdhvwyyupytouc`_iy{vwxoilijqc^_V[Yagnwzjeeflkztxw|spmgepx{}{rszpwsedds}z|y~}}}ouqhgjhno]^WUZ\fiv}~|hfgnps|z~}tsojjuv{|zxosumyqeads|y~zux}}~yzzqulddebigY\RTYakly|igjrsy|~ywrkmvryz{wmpnhtj`\cq|x~z~pu|wzz}{y}}tvkcba`ki]`SSZdnp}kfhqqt~{xupjmvpvzzxmmibpjc^coyyy|nqvrx{}{|~xznfggdmmbeWSZiuyoefnos|w}{vtpikvqq~wxwoljamleacmu}}~z|sqxsy~{~}|{~tjifbfnei`U\kz|vifosu}{uy|wuqifqogu{stuqll^ejfegow~|~zs{tu~y{}{}ufdb^^icifXXfx}~xymhnrsy}xx{xwsjcnofqxqqqoih\agehmu{}xqyrr}z{|xzsdcb]Yc`feWUdw~~{~|uxmflorwyvyxywohrsiqwrsqpkmaehfkrx}{urzqnzyw{{{w|sdca\W_\feYWfw~z~zv}unkprtyyxx{}}smvsltvuwutppdihfmw{|stynlz}usww{}v{maa_ZV]]jeZYiwzz}ystuvx~}zx}}}ppwpmvtxxuqqmflfgr|~|xnvukm~zurvs~ttuc_^_WYZaiaY_n|~}}xvywz|xx}|qvuloqovsrmphijdgvz}~{yqnwpjs~zstsv{sxob_^\UXYgf^\ht{}zwzxx|}v}wtwnjnjsusmmkeia_kww}}y{uktrhiyxuwuwyxid_aZ[[ekc]cky{z}}vyyswyvy||uxrkoknvspjlehc]brswzz{pptmhr~x|x}~x}sleec]^`li``goy||yv|ssv}|ry{yyxnlmfpttmlkija\hssv{}{qwunnzy{vzz{rncf_^]emgbght}vx|~vz}svwwty~xzsilheqstlnkkh^^nuxy{uyunr{}zzxxyuqkac\][glfciguxrt{|u}}stw}xvxz{rkngfpstjmknh_bsy~|~yuvqmsx~|yx~vvqrkaaZ[Zehcdjfuwqqyzt|}uuw~zyyvnqihnsulooskacry~|}yvvplrt|~{xw}vvqrnb`YZWafdfmgr~~zrqx|v~{yx~~|yxnrkjnsyoppunccqx{}{wvpkqrvy~zxt{{vunoqdaY[Y`ffhqlr|~usu{y~~w|}oomjllwpnnutidpv||~z~yyvwqkourw{{yrvwsrnjrhd[Z[^dgjvvv~}xts~}~}yvqkkgjdppllswnfnt{wvyuwuxrkowq|xx}|rturspjqkh\Z\_eglz|}}xrpz}~~|urjhfjblnjjpvognr}{u}~wwsvvytknwqzxxwwwsurlrlk_[_bfgl{~~xqpx}|}|trjggjakmjjpvpipp}{v}{xswx|tlsxt}vz}xxuquqormo_]`effm|}}xqqx||}yt|rjdhiakkllswrmrqzx~~vty|voxxx}u{zxwqotoronm\]agffr~~~~vpsxz}~~vx|{ohckeekmnovwqrruxy}~rv{~sqyv|{yvxy~xslnqnqjpgZ]dhdfvz~~}tpuxzy{~xpfildjjooswvsuq~|wzwpv{~xottw{zuzv{vnjnmqllo^Z_fc`kvy|zrtwx~~~wmhogijmrrvvtuotzy}~nry|rpsrztxyuyyqjlnqpiqg[[ce`cqs|ytwwz}ujnmiliqsuuttrmz}xxxnt|ypqntwtvxr}wnikmslmqd]_ge`iqv~zyyy}zrjoikiirtuttwoq{~zwwrmt}}wrqnyuw|yvrukhjptjqpf_bhecmr||zxw|~yojlfkegquustwnsz~~yvvpls}}wupozty~|vuukiirskrog`dhfenr|yvv}|{wnkjekcdousqsxnuy~}zwvrlr||xwpozuzwvwlihqtkrnjcdhffmp|~zvt}~z}}~{xqmjdkcakttqtzrvz}}{ywwnp{}z{tp{wzxv~ylhfntlqnlgdggflnz}wsz}x{{zxsnkckfagtxtu}xy~}~{{w~{rmv}|}zqzyz~{ry|~ogdgrlonkkffghmnzxyztwy{}xwwupodhjcdozxv~~yywz}}~vnqz{}~sxzz~~qvx~rfbbmkmmiljgghnnuxv}~ww|zyuvvrregjdckxzw~wwvyzy}vonuy|uxyy|svvz~tga_iimmhklifhootyu{yx~}{ztuvstffiddiwzx~wwvzxw{upnsw{uxwx~z|svuy|tha`igomhlnkgiqpvyw|zz{|~yqstssfhhddjvyxvuu{vwyvqoqv|}vyuy}y{}}tvtx{tiabhgqmjnrnhktqzxw}{}}z}zunrruqfiedekvxz~ttw{sz|wuqoqw{yzu}}x}~zxwuyyqh`ffksllqsmhosr~wx{~{~z|xqmqqvkggbdfmuw|}{utzxs|xwuror{y}wx{yz{vwywpfcgeqpkmsriirpxxvy||z}{~y~xlnpuqhibcdhoux{{yuy}tz{xwvqou~z|zu}}y}~~zxyxuldhdkrllqtmflop{}ww|{x|~|yrlotwmlfcegkrw|yywyx}yyyvpp{}{~ux}zxyywvsiggerpmottjgnmuz{wz}xz~zx}}pmpxuonefhknt{}zx{w{zyzzvos}{~|tz{xx}xwuuqhjdjrnoqvsijmoxxzx|~x|}xzomrztsngikmou~|~w|}w{wyz{vos|zzuzywy~|xurtpiickpopsxtkllqyx{y}y{~yzpmsztvngimnnv|w}zwytwz{vnszzzwyxvx~|ytqsqljclopqtxumnlsyy}z~zz~~y|rlqytwphjnoms}wnknqoqmhqrsrnv}g^\^`dmt{~pis^_uwxqmp~xsu~klwp|~f[Xfg_ZWTWkzo|}ylrrdkquntocq{~qu|wnXZ`acelwletmTs{z~~zwpio}zma`r~zwiebYX_mv{}wg`ribhcbfie]]m}vrqw~iir{|v|tiihpyogxuY_x{xqjcacqw{~|keZ`lzzx}pb[qyih_UUZ]_bnvsmeadhgdce^jx}{tv}|}qjypd\l}{slgegly{}~|{}}rddbmv|~|q[X`|urg\\bjmouu~wtjbaca^bkgpy{{vtz|~z|zrkx|}zpcacvwqonquwnnksw{xy~xbTXe}yldelsuvxt|zphhihdksnux||xuvzywwty~|xzrnwyolc_cj|zyyyzytouv|~~{~{|yux|}unYSZltmnvzz{wt~uopqnisupuw|}ywuz|rrnmsz{wvzpquw~~sgd]aeo~~}rquu}~yx|yxwttx|}yrpeUW^sztv|}|}uxvsvuomwrstw}|yxv|wpnhkqxxtxwpsrvywy~yic^]dht{ptsv~u|zxvvtrvv{wqmn]WYcz~z~{t~}vwxumsurtsx{yzx|~tqigkswtuyrsqrwtsx}{ofb\cdkutrsrx{y{zwusqtux|wsmqg[Y[j~vz~zxyxppvrtrtxwxz|{wogiouusxvssnttpry{ujf^`dfmv}qsqsxz~{zwurrus~}xtmlob\Y^o~w|}yxyumqrrspuwwz{}zmikrvttytvpourosyzqjc]ddhowvqqpsx}~}{xtqsss{vqjnla^Zbr|z|~~yxxqlpnsqquwx{}{nkmtvtwxvwoqspmrwwmj`]dekrztqopsx~~|ytptrs}zunglib_\eu}|{~~ywvnklkrpqvx{}~|olouvuxxxyorsnmqutlj]]cfnu~spnquy~~{tqtrs~|ytlejfc`^hw~~z}~zwtliigpprx{~~qmotvvyxy{pqqmknrqki\Zbhrztpnqw{}}vqtrr{~}zxsjbfcccakz{{{wskhgcnqtz~~toosvvzyz~trqmjlnoii^X`huurory}~z~ystsqxz|xwsj_``bggp}y}yskee_gpu}}}yroruvz{yysqmihikffaX^hw{ttrwx|xwyzyjwss}{vrqi\XW\bgvz}y}}|xnfhZftv}y}ztzqx{x|rnlgheha[aQUcs~{yyu}zzwouqszyumnhTVR\qpyvy{w|wsfqf_kx~}}{xwwuy~zslk_b`aib_Y`]nz~ynz}xx~~{zwksjlvqzuni^RJXbq|}{|zxyvcbl_jmx|{yysw{yzy}ojhdV^X[^Tclz}{}zxwzxt{|vy~otoskpninb\[UXnz~r{~xwhacehm}}|}xvxysyyoocdhb\[eYZckx}}|}z{vzz{uyjppltupoth_YYMZlv~xuz{tfaecjn|}v|rvy|w|jbddZUZ\VYbny|suzzx{wz{tvpjkrljnieVWVYcp~t{|{sjdfZjmu~yvz~~ysxnd\aaaX_bV^bv}z|z~w{w{wsplmaiotomp\YWVWkw}~{yr|vnl`eblz|y{txvwxvq_a`cWaaZbbls~y~y|{ywzx}uludgjsnrqhb_ZR^dwv{x|{tpjdbppy}w|wyyw{wiffgYVXZc\bk{~w|t}yq~~~~x~}suokmrlmiil[\S\Zm|~}{usnoeZifsx{z~|{uuln`c`]TZ__d[fxs|}wwr|}}y|unjrggjolgpadUKYantpw~yvdifhfitxr}{v{zpvgf`SUWYT`_fp~|{{{{ws|z~{{{~{htmii\gjjb^_WX^ltz~y{y|nlidjlpv~|yx~vrwunba\`V`^]`aguz}|x|~x||{{svlnceaehnqi_]XWhhu}z{{}vpqk`hfrzywtt|}w~vj_]Y]^V^]jjp~trxn}x~{uxwxuvkca_frhh]]_Q`fz}}nwqtojfdnh{~|xrzw{qp]`USUZZ^ply{|}~tvuu~|}vwx}{nna`_WcejYa_Wb^t~~}{swq{nriZjlsy|~{}mysttuoccTVOP[cpsxz~mksqty}}suvuspp^f[Z^Xe`aaY[huxlrnqjjdilsz~|xtxswlpqhbVMMXRgw}}}|}|wwrr{{~uzpzniobc[SR_^]fhahoz{yyzovxomicryu{xtu~tnrgad[VNXU`t~{}tmsqs}~z~{nsukrm``\XYb`]_^_hz}x~ttshlqblqvw{zvn}xrymeh]XNZZXku{}~vz}rqomz|||uvystudb`WUXY]]ddetpz~{z|txtlqpiignr|}vytovonpibVTTSblsz|{zsklov|{wpqwumh`Y\\Y[Y]_cnnz~~z~{|qinjorkpqvxz~}zuxxqqkhgaZVY]_k{}y~~yvirprv{uuzoro_\\WTV`aaeafrx~{{y}vtriongnrvw{wqxtvxqpoeWP\YWhotwyumqkip~txynwpaeb\ST\Z`f`iqrz|}zuurnpsnqnmnyy}wtsortmbV]UTcdm{~w{}vxurdixz}{tpwshf`ZR[_\^a]alrw}|~z~}}}xpikqsppnwwz{{~wwuxske[[WV\]jw}}}y|zv{rqejwy~ustqrnh^SZWWZ_eckonrzyyz{woksujljrswvpqzwqmf^UZYWbjtw}yu~zvihkpv{yvwntqhbX`\ZVU_afnotxz|~~yphkxnompos~}xr{umlhf[[\T`fprw~uxuvlsomrs}~|{qowri\_YWTT[bihgnq~yzxyulqkkinpry}|zqtzqrjid^`ZX^clqz{wypothjlx~zqnnpbhb\VOUT`mdnq}{uvptknliorw}|~wxmojhigc`]\_ihxvrrmwvpfkx|{|zwkqlef]ZQUYTdgaiq}|xxxwvtcjegrw{~~x}tnpgghigbbW_em~~wwmnorpeszyz}~tgkimgdWNVQUabijz}{qsq{pjicgsz~kmfdhjjhhd]cerv}zxrpsovkjss}|}}toekec_SZWU\T_bm}~uwpwrliadku~}yyskaeijlkf`a_nt~~~zqqimmpur~~}uvijlgfWZVQ\SXbertsunttqrbchly~}yymbfiimojej_eis{}~}}xwopgmulz~y}sjfed[c^V]QPV^jo{|tsomredlio~}yweghhmphajfegqtuzvoodmzoyww}v|yujke[d\X]SVSZ`cvv}tuxvvpnkhklqyyyurtnppdqwhjoje`jisyz}{uuhnmozuw|wotujo\bqadaUURXZdnmtwxtuljqokowow|{tuxrlrrfjjle_j_p{}z{rmwgquhtot{yws_fhah]\VMVP`fg~yz{gjqjpmtuwx|}uzysonmhrojpi]^qgs{~yroustrwvesv|{svpegdejb^aXPQ]S[wy~ywxwsvtvkhho|{wvxxcgnjcnldefitx~zsmmjmptvtt}}|yqus\dfc]`YUYWT]hn|qpntry}lgq|wz{ux}~uzlsnogdfgledsqv|}ztpprqossmwy|xt}nvzgnefd[WW_TNZddx|tt{ss{rjiposy|~wkvmlklfbmjaehrzx{ukjljjmr}xx~vrtesdbgdZS]XPOV^lz~yqsrrugkstntx}z}lvsnd_gcihjlhq}zyxtqwsqlrjnwwtxwt~homcdWZY[XOWV^dxy}u}{xq|pirsqjx{yzssskoemilmelflw}|}yqypulnmn{}xy~rnmknbhb\`^fUTTU[kyv~zwyzksxzplrq~~}uxoeagfumlnmxoy~}|vzzzyzjjap{pz~ywuwpsrjiZYZgeUZS_Zemuuvkfzpqovot|qxwreih`mfqftvtxtyvxm~sssokczsy}wvulnwnngZ^T`W]WT[\i^q~}{wbsursirpz{|ruxtnbj_ka`nrztwu}zx|mt|v|jfimoiz|zspgkmo]^Y\[N]^]]c]dzomnrjllxv~{xtzjmtoffa`lk|~~z}poqqrtopqtzpwyrsimhelca^WR`[_fjaft~us}vpmtrt~|wloqrrsigkn}uuww|}zxvrw}|tpmz}jyt{~~upigihdlm`[b`ic`]Zpnyv|ormqtuzuy~vuu~skf^iiruwz}{|ru|tzvossvnzqzyz~{urphnne`W^\^ffa`skuyy|qvosttxmuqstrxumeoltsix~x~wwovu{uuyvwltxvxovkkegqlhbg_eiY`chdgnlpwswtkqwuzwy{jogijiisy~}r|otwwxk|z{|mvrtonvwywvs}qiqcljflqqtx}{{}{yktkvyqoiuenw~zqxnyunkryyyzyu||~{zwsh}rulr}z||~te}ode\qqqqlzxyrqvmlyvvpzwttx{xgYpomodwx|ss|q}{vsgzugqmmegt{sprrv{urjz|{faqikhappuyuht~}{nkk`lz{tjwzzmrsyuq}umg`odfbnlcokxvgoxmzxqkvvptywmhuvxqoucuz~|}}xt\bd^k|yxkopyoww{fgm^e`mkdfsuuzqrqywxzxwpk|~tpr{tertsrvuoz|}x~zw}qfbbbjs}wv}qxoowxzmacf\]smkuuv}{{kjmtu~~}xwrvxrlutxspwspvwmz{u}xz~}rl`[mapuyoupvp}zzvilab`amjpvvv{~omwqy{{nxzqwvorp}tqsgwuuw{~{y}quud`Vhctzsuu|r{}zu{kc\_\`qn~~xt}{pihv{stqsz{letxzsvpwuqsvz~}z~}|{quqodZlbv~{|yvottvx{{tq\d\^oi{|mz}uiotu{poo}|snp{tstfruvz~}|~|}zyosiifXcisutvtzu}z}|sk\YWhgntt|wkkovv}ssmfynen}}{xxqv~z}y}|x}{zsutgiodbne|t|t|n{{~z{xk[aXdml~mwvruo|ry{zpiqwykv|}smmvr~yy~{v{}y|trm\k``dg~ru~}sx{~y}|sg[XWjduoottppy}s}{ongr|}}qot}tyorx}ux{}~zx|ztrstaglfnavys~wut{y{{}ubhVegf~{xxsxwqytwyy|rogxvznx}}zkqvsv~y|x~|~{t~icj^hd^vusvzt{}cd_Z_cpvz|ovunorz}y|wicsjywwz{uoz|}z}z|zxz~zxs{wtrechhf^nu|v~u}}tkieYf_dw{|w~wy|xzo{wrxwhdks~{zzuow{xu~z}~s}xr|vv}i]k[jd]jz{zx}yy{}gcbZ]Zntuyrtwopsy|}}n]giv{}}}~}kwy}zxytyp~~w|ymuyttbcdamgllvy|yxxu{hk`h``svx~zxxsts{}|vx~{v^jj|x~|~vuqsz{vz}wp}tmwxtbgcdfdpp}wywz}wyojYca_k}y||pxwmm~|yx~s|rc_h}||{{xvu~x|tuu~y{upsozy^_d\elrt}y}z{zwsg]e_fptxzuyzxn}~mxwitcfix}z}}r|{y|t}yn~{}yx~vqngmxued\[ge{x}sv|~syxmp[\heirz}ysstxzwsqjpvkabxyvznuxp|so{tw}|w{tigghzh]\Zfk}rx{vx}{slwf\fpvo|{wrvpw|~tksjkyrpkt|zzz{tp~zwsxxmz}x}}y|wjgidevqi`Zhqyp~}xw}zi{occkvvz{}xvmszws}oqmkzolmy{xxt|q~ytx{oruz}~}~~~pekegpigiU`t|}s~{zz|{mqre]nxt~~z~yqrq}{zspblsmsmy|}||vosygstt~zulhadcijifZbn|{}t|wvumzpabkzzy}}un{}t}u|yoqdhonmw}~zxwy~{~stnkqnz||~{y|uehf^^kaqiU^u}y{}xuwu{xmsngfs|x}}lovrxxuxuh^oooq|wzwzw{zzkrmqrp~~y|{xmjb_]egguhYc{}yvtwzxx~uzrnjpxx{~}tltwr~|xxxzgcrpusz}zr{v~z~|nppzpl{zx{}uknf]akinl^^kwwy}ztr{qfmqs{|x}|rr~}x}|~}vuogjkplvz~xyx~~uqgxrft|}ighgYdhepcWdx{zv{yvtvtnijqt{~~}t|sxy}}studkkgjssx~{{wrmntjfxzpeidc]c`mgb\ewy{~zzrxsu~phmpux}uz{usvy}|trqsjhdhqxw~r}{u~{qcsuiky|~|}|jchkZ[chqgaemzttvv{t{|tkqt||x~vvyqt{ryzxsuqpl`jz~x~vw~uy|ufsvnp{xz{t|~lfgm`Zaoug^cr~yyrw}{{vqvqr|wwy|u}zsvywyx{wwklled}|vy|r{}wnmtpmk}}{|{vy~rkcg]`[mscafm}~|vp{xxunuwrwy{~zvh^c_gqxeYY_n}qw{~}jq{eisvaT]vw}xvq^Setuafx~~~{pa_ekZi~sadhafgot~pu}kist^V^uxsowvv{jkn}wpsv}zxuzkn}xpk~qmrlely}jvov}uo|pcozuxkimtnt{xtfp|ylk{tcddguxtohg`hmx{touzzkq~{xpyw{pmfmjsxriakmnw{y~sveW]i~~}tz~sovqqmbdoo~{ngp||tjfgz|~{xifq{~yvec\bkhceblhggcabosptsku}}u|o\Z\lwwpw|rmvrsrfenlv}m_blu{~~|x|zrrps}nknifgeqnkifdaggdkmhs}xtppk{{ttzwqcej}yoxtll~|~}{|}oemv}vwyw{y~z~y{z}{qpmfcdh}||v{yvsoels}{okbdffaV\f{qtxrn}~|}{~z|souxsv{uympqtuoqyw{qlomoopidloo{{tqp}tje_hhnaWV^kmjqssnbjh`aqyzw|{xikkhs{}lkfggkibcnjnw}}x~}rqh_YZgp{x}}iaff]kx~{{{zxrrpokw~~~~|vuvtuv{xslY]c]c^eprz}}}x}~}wyx{{|}zmntqbklc_Vfszwyqqpqxovpz{wy~}{zttnqsr}x{vfjsvlsrqxlry{}~~yuojlvqmvnuz~}yunw{z|}zw|u}rfjuxz|zxxcbj^aftryvaZVcsrrxujbduouykpsuxp{m]\gutthtyvpq}tu{xt|{xg^\l~vfzd\q{i`_pyuwyraS[ziZs~zopk|xxw}{vmnnpsuo`chzx|ust~}pnuhv}wxonv{k]\SHWp}y}lbhohi}ysu{xz~odem|wtwknqz}{vqve_\ZUeqyzmu}xjny~rlrsvx~qmcklkXQLHT`w~y}{xxo||wa^jwpliurwwtx}|vkmgou}~`WXadstwzyy~wnfiffgzvqx}yvq~mux{x{}yxg`bnz{vlvzkfda]ikuw|pru}uuz~kgalw~qdcdhdoy~~w||yoyx|prllsxurz}zz{z~wpqe`d_g_bo}|umnptvrliZilp{y}nsqipvurvfg[h{z|rzwvt{wv|~wz{vxust{~wvxtxuq|{~xpicdmwheh`fjspxn^and\j^dgimu}{|rk}utunrnu~t{|zq~mpnxrrpiisurzupjm{rx|s|}wssqpz||skopvkbgceblsvtqgnl[kj|~wjwe^il_i}y~x~}wxzoo}nnop||zyuqmr`e`T^^bY]_dlvymvv{}xtqnzzzstxpu{}wslonstmbZ^kjoxxzy~y{}yxyzvur{~}qnzqucfY_b`d^c_khn|xz{|twywunqifnmyyztzvu}t~vxebnbhiocceit~xz}qZpv]utyyws{pdyttvuvysu~x]{|^l}}|yqssfrwj]_ig]UUg~{vccdlkqvw|xro{tjc{vdrvettla^jknkw}n]Xk~{}~unot{}qj`dlyzrp|wqimvsslc]\lr|s{|~s}ymlovyxxmaXgzypl{nejxvnt}~{|uyusumibelqsi]Ujs|sl}zvzbZ^kb`ur{}rlwzuxnlmtz{wguywonkdlx~truhkajjdtou~~}qvyu|rqhzvvpcbaYbgtqz~ws}~|zz~~oa_hmwu|wovxxpnkgrvsxxuymotj\s}}|~~yzwnqpq~~wz~zxpotr}|td[]`ffkwsjqqq{z}{rccmlmkmfr~nsop{ws{rx{vytr||rnefgajqx}wnywrljso|~t}xxh}yxy}|~ysr}~zpqounk{s}~|sk{x~qpiq]\hi~qwxokpzx~{{||{yxtmrrgw{{}wwv~{yrmsmufjrnmdhpx|sdZYWXYjwuvy~{prqptuxtx|z~~{{zx}phd]bcb``hr{y|ys|vyuxyzzvpflnfkfec_ah^ZTUTSnp|y}|{zzt{~z~}y~wx|}lmpvnspoh``\`QYb[qpxt|}yux{x}}||utxzzuehhtnozjjkmfag_njollsy~zv|}vyhqolkw{{xu~|sqlkwmz{wvisl|rrqkhrqu}{uvsrjixop]^prvxpilv~z}p|~nmidVQ^Yd||tpzuxe|lmyy}xl_sphzwqmx|xp|tos~vmhifkljkl||qy|}|~o_WL`qzzo}uz{zyvv~kYl~}q]woyqefmrgopsvnvxq|o{{p~|~|luvwrcaiz}xs}lkxze[ffo|o\av|rfeffs{u~r~mnpt~|diu}}ywuuv~v{{~peMKX[hs|plocfmktk`^kx|wuqwwvn~vv~~}}w|rmwtsxy}{pX^oz~rsmqzp]^lw}x~}skjehwu~~x|ysmhj||ghlvnzwv~wsouk`ahuz}ui]]`^ciy~lmls~qbfqw~}tg]P^cnsa_nyulmijhmkotinxvzxyy}{vww||rliuz~~mvw|{wwyi_ggjktusl^cpipmpdjohr~}~uo|~xwuwtmsf\^e{|x}}wtrw~pvy{vuvnhcpkks|{`\\VX]o}tk]gcboz|ytsdeq|syv}}|vuluvx~wutxqxwwwlikqy~uuwy{rpkckqy{xqmqsrrp}~zx~um|y|{qmwswz|y|}~xu~|z{wxxsfa`aehjUWTbgltsxulkef^jus~{}z~~wmo{nuomeclrqgbnlxsuggjefp}y{tyoagp|{vsj[VW]j{}|turkfae[gmlusqet}~oktvupltopidowxqirq{qljc_alqhon}}}qouu}~}}xusv|}xzt~{z~tilllhz~|vxztytuodmwvrfhcqmod]^_dj{zotwwrmosmyryvspiklzqpjovz}vx{~vipjjrn{z}mkxumheRR\]`Z`czxvry~xzy|~|{ovqyw}wzuvk|{trskkjwxvqnxzwvtzs]^]Zhj}{ry|{vrlirhl}{qxyrkoow}}~s~|{qxuzo~ywymkgorrjbihlgiky~nrtovn|v~ql]flq}{qktuztoditt|sjaedkst}ztvwqtwxuvxwyspp`[TZalkl|xvrosl|y|~}||trxzv|tmsddmpxtqfnu{ymegfmnlwlhnhnlzzvo{{yyx{}|{}p}t~}{~x|~|}ztjdl|yu}yssvhmqu{vrgppy{qa[[\edlw|}y~kqrmn^]X`cdyysvuxyyy~{~uvmvouv{}}v{qilgmle[V[]nrojrwvqy{tz~ujyz|y{}uv}sohfk}zntrqvzutqfdf^hmy{y}y}~sywzrsfkilxyzz|yz{{|~neqqjpv{ytyx~w~ysmm{uvtnnupqynhaYb`kvx~{zwsorzuwntqcmkt||tqnwwmyz|}}|}xq}}}}wkdgwmcc\Xaik|{~~t}{vpwww{szkmn~yww{|{rysnp{ppywt{|rrkqrtymyvxvz~~~sx{zzuz|yqhfu~txv{|}vsyw~ztundlms|}||qtvov~~}|w|votzktztqq|{z}~}~w~~xknkja^qhjru|zw|~xkoputtx{uojmstuzxptzwv{ketrgaYR\b[mx~zvnvx}wovyx~stwpu}}|sginplw~~yeils}zzzz}x|spvy~{nurlotsv|ni}}}x~|}vroloxoooixtv~vy}xgflnir~v}|xyx~wsww{|solZ_]Z_jq||x~{}||zs{{vzu{utvty}xt~|~sedgimmdsnacq~xxut}vnqps~{~~~w}~tpwpwtrwz|}~vqeoyolfhrzwwpy}yy{xny}|xoxxwqrxwzwv~~vne\ikljpu{|{{|~}}v{vzzqw|}|}{ulr||~x~ymr|wtrobghnlcflibnvxzy}|qr{qm}zzyxyyutpusm``Z_`W^mv{}y|~{lm{~{wusqirt|{vuwy}|omrsqt|~vtukrsvuqdhvsv~}usuusuywsqz|{txv~~vtvtjjlkrfXZjquy~~{{y{~usturuz{swxryz||~y|zy}y|seccc_dvwrxu|w~~|}}zqqttlrvzyu~uolilrlrkc\\\bepz|z|}x||vt{y{wmtx}{~zzyqzvnx{yqlnmoxso}|wv}||~}rvzwopnx{}w|vrxx}ytile`hla__nxyvzzxvsv||yy~}yy~tsytvuwrvqood_jmrprw~{umlsolee[]gpqnzxyyxztrgkv~yrb^mwfZ|fwj`jtwnw{~s`mrtxrt~yt{}}~xivwplkvqWO\jowx~nZnfjukZ]hph`XkvlZjx}}stv~|vlvofuo\[bbgr|~zce{xqq|{vfdcglr}vgggvyyxz~zxwxz{xu|xz{vu~sghn~zkjdcjiY^i{~yxqlv{sx~p]agu{vibhqqj^gn~yvmw}{ww|||zxy|~l_hx}nlqtxxzt|}vrilgmrpqv|cYdjyv{}rjqyxspfnqunjlovtt}|obZgnqrxvvnnkuvsyy{ymjx~~wmiemju}}kkjvxqoy|zqz{}yu{tkqr}vww~xlm~t{}}z{w|yuqpzuunle]]io{mhghhoxrxu||xwu~w{}qsszvv}uwvwurwsgfuzxwx|okniqt~}y}}v{~}~z~z}}ysu~{uxeb`jng_cff\^djpluukihkxwykfelrmjx~x|zytqjellkeknn{}wwvon`cbbbbc^_mq{{vrzxz}}zmhiojenu}~zyqy|txyxzt{tnnhdlqqjmrluuzwooroshjmqvz}xw}|vqspzrmflvslkmnhfkp|ztoktt}vkjnxxv~~}tncZ^a`Y\fdnqxxporpvkjlnty{tq{{|}}xuzx~{qv{utssllos}wpkqnvma]_ddcmr~xxw{ys|xuqhemtunw}~|}y}{wonrr}zmt{wssqphljq}|tpgfjhtmfekqsu~}~}}}wrzutka^fkicosz}|z~zonhmrxullsowyu~|zzwrmsn|~{swuzwqnqqotvw~z~~uz}{zoghoqjiqovty|toqrzrpliry}wpuuv~xrvv~rlrpllie]abcu{zytrvrxtvyy{}{mgiljaiiqvxzzzwvlpx~vvzw|uwz~y{~}wkqtsturkkrmz|uxqv|uolmkjpmnzy~}yu|{}|qikpsjnoowtx{vuu|{wu{vxyz~xy|z}}|~{tkrnp|ywqqnjvtrmnnlpunwyxzxy|y|w|tgabda[b_hmnwzz|~vv|xutpyu{|uvz~yx~xx{}ztrnlromwuz{|twtuzpfehkgiljuttwvuuy~{qu~zzux~ytlnq{zy|z}~|xwywpcfgclrzzrponofostuttsu|zomnngkjjusuwxzzvy{{sy{w{vx}zzzwuw{zshmkktyzywywowwyxuqllrmsuu|xw~{vzuvxqww|w~|ttvwszxzzrqs}wx|wuv|wx}~xlpoow{~|~}szx{}{wrqyuz|z{uy}}{|}ux|ukged_fdfqstssww}wu{~{zqvyu|yz}}}z}zy}{ulhmjnroxxsv~ww~|tonmhnqmxz{vqrrt}{zwz{yz}}{thdcmqowtvw{~y~wstowx|~|}yy{x~zuy{}{sxxrkfb\_gcnuz{vx|}||~~snmu|z~~{tx~wrsltvw}}zwv|rppimrrjbdfitrz~}|wy|v|~}zwups}z||{oheksr{xy~{|~yyqy{{~|{{yysw~{rttv}|~zx|}w|vqr{z{unrrqokg`dmlw}~|x{{x}zw|~~|u~~}}yru{|rijfktqx|{z~~~zyz}y|{{{vqinss}~wstw|w~|zz{|zxytywu|~{~yqkhpqv}x|~}xu}|~{y}}wyu~}wvurrqkb[ddksv|ystv~}||vpqxu~|xz~yxz}zvz~{}ty||}|~}~}|rrv}yoliitsx|}}~zz~z|zz~}wmouuyy}~{}~yyvpjdihkrlnszxv~{~}zvx{tsluxx}{zz{~}}{yxzxxuruwrgaihqwz~xx{~}~xv~~}zuwzy}z~z}|zqpsxulibdljpqprux{~|zz~|{wx~~wlpru|vsy|z}zux~zzwvrnrntytuz~{}~~zx|}{xy|zs|}~yyz}yxtprvsh`ebkpqtrnklwy}~~zw|||}y}~{}{~~~}xx}ywx}~xumiqotvtuz{{|zz|~|y}uruszuu~|}}|wu{zwspqllifnjikqtpput~}~yx~{}~||}}zz}~|urvzvihhgsuxxwxovhqof]`egx~unx}wylmtxzxsoqqlxtkelt{skg^ZWi{}i}lxtz}y|rorqxqrxxe[_kuxwk^fhrwwt~xmiglzv}yjkjxlT_yr{}vqpyoprwvsv|}upkhaga\d\doxvspgr}|qspktorkchzjm{umehlwzvtkhmy|tz~~}uqukmsv{jW]n~mgnuv{rjmgjh_ZUY\kwqwukmiaZ\fmxwkimlpt}}~omlfs~~}|xz~{~vmaRPevtnqjgf]dkotnlnopuxuwrmktx{zytvx|xpde_XQ\m|~{oj`_hihd^aeikv}rqhahd]U^ehompwxyzyw{zywwt{vzoefg`]bs|}{yrntusrlmrpu{{}y{nkst||~vj_Z[TRUhx~}xropsuuuqvolnvws|{wovu|x{nikllkskkortuuqru~|{|~uh\]ZWWaqvqty||z{ztrmwtuz}~wrprswk^RW\[^co{|{yty{{~yv{xshrw~}tuu|~vvqngonmmlmkssuy}xruu}}}wtvrvlaYaidefq{{yyqvz}y~|}z|w~ztnmqnwtw}~}{y~qg`fjaa_l{{{xnomrpru{~t{z|~{}{}wqpmokslf`elislkny|v{y~}prxwvlbfe\\W`m{~~~wzx|{~x|zxu}~zmmqmxneZ\`[^Y`k~|ypvu{{{{}~xwmsu|qtorz~y{uyqokmrirnpv}trv}|xonumvlbZ\fbe\am|vvmrqx~}~{x~s|xu{|zvpyqyse_\ibcYZhyy{rtqovtsy{{{~|}w{yv~~yyqtuyxpjbnimqhmnztvupy|~vgplqxjg^ga^YS_l~~{xp|~{z~yfklgrfcZ\^[_Wan|zrwrz}}{zrtq{}xw{{xlrkmw|~}v|{}tohkvjpkiovyvotx~}xzpjwnurgc[edmget}txwu|wzuzqwxvz{yksqmugdY]beh[etxtqwntxst}~{yyu~}zwxvtmwqu}vnuw{urkktiqpnsu~xxt~|qyntumkajinf_ozy}~yzz|~{q{~xy~~|}jfi_g`^XV]_f]ewyqvor~|y}}vsnt{}ypwxypwut{ztpwwvqwxyy~vfpjjmcbW\ajmgx~uvxq~~~}{ywyquv{yxz}}wzttefj`ga`XS\cofkz~vr{uy}yz|y~|yr|{~ty~{xrq{pooouu|yzry||~}vksgghee]bhtohvzu~}z}}|~}v{~||}}xq|xswtzyvz|uw{xudg`Y^Z]UW`knes|w}vs|rsuwrszt}{x~zqx{svqttx}{|~~zt~z{lhj`fcd]X^hrisxw{r{|ywww||z~}y}xwqttv{}|z{zv|wxmhlcfegc\`kwpuyv}v}{~~yw|uty{vqxv}uz|yru}rplqsuzzyuxyx||tmqfddfd]`jvnmx}ts}x}~}y{}z}~xt{y{|}zxw}v}~vmn`^_b_X[grjkv}|zwsv}}urtvrpwtz|uxy~usrvuuy}}|{{p{{x{sjj__bfaXXdnehs{yx}tz{yx}{z}~}y{yy|~|z}r|zvwphi``bgd\Zeqilv}}yx~~~vvz~wtv{xswt{w|}vw~vpmpqrvzzwvtzs{}yzulme`aec\Zerkipu||x}y}{}~wty{{}|y}sv{xyxnld[\`aZU^nkgmt|{{wuy|wsruuossv~~}tv~y~{spsvttw}|wzsp{zvwyrmh^^ehd\^mpiov~}yy}zxz{}~yy{xvx~}xx{vmxzustoge\Z`ed]Zhqkms|}{}~}stu~|wrqwvsvszw|{y{uruutv}{vzvy~}~uqkcdkkg_gwwsv{y~}{|}z}{{z{~}ytuwwx{vw{xowwttuskg]X]`_YWgqmor{~~}vwu{~yvsqxwsvu~w}zw{{|{{~vu{yxwytnh^]fhg_ctustz~~}wxx|ytv|yz}~|~xxzxvu}||tsu{vhnrppnofaZSYaca[guttv~www|}ztz}{~}}}yvyxwv{~vxzuqzyyxyvmg_]gijccu|{|~{}|~vyx|{vw~}}|{~z~}zsstsst~~~trryvjnpnomqic]V[abb[gwxzz{|z}{zwry|z{yy|~{xzyzx~~xz|uqurtrtsie\[dficew{zy|~|z|wtut~{yxpsyxzy~|{~}{wxwxuv~}}{qrszrhmmpporga[V`ejhdu~uwu}||ut{|}|}|~~xyyyxvxvu{znqtuwtyqhb[ahkkbn||}{{~{|~|}~susy~yzuqy|}|zyzyxwwu{wv{|opsrtqupgb[_fhjajz{}{xyx{xyuovz{zwx~~}|{z{w|wx|sqsruqurhc[]dfjagwyzu{}|z{tutwy{xqwz||y~~}||wztsw|omonsotqf`YZbfkciy{}xvvux{}xrxz|{xz{{zyyt}{vuy}poqrwsyujd\^fimbgvxyu|xxw{|~ysy}~zz~}zyys}|wux}pnppupurgb[]dgkadsvxszyxxzyzwotw{zuzx}}~|z{u}~xvyvqsrwswwkd_^ehmddtxytx}|xvvx~y{zrux|{vz|~}z|uz|trq{skmkqoquia[X_cjeapwyvv||uuv{{z|ssw{}ww~{~~z}yw{yv~|qsqvyw~vkf`ejppfpz{{w|wvvz~y}vrvyzw~x~~yyxq|~zuqvznllmsourf_Z\bhlbdruwrx~zwwz~y{yqsv}}vz}z}}zx}tusyww|qgb_ejqmeqz|zwy}|tstx~yvzsqtx}wu{z~~yzxr}}vrmrwljhjolrpd]XZ_fkbfty{v|}|xwz}z}~vxzz}}yz|yv{rqnuvv}tid`diqpir|~y~|x{ussw{{v{vpsv{v|w~~|z}|}xvwnuz}ysooxojhgomqsh^[[`gojgtz~z{zy{~~|wvx~}|~{w~zt{}srnsvsytga^aforioz{~|xw|spptw}zswtoqt~{ty~z~|{}}~yvxov|}ysmmuoigfnlpsi_\\ahqljv|ywy|{{xxy~~{}xu{wrzzqojpsrytha`chqslr}|~~|z~uw{tqquw}xtytqrv{w|x}}z||~xwvnx{}xuorxplhjqouth_]`entnp{~}}yw|}{}wwx{}~vz{ut{vqmktsvxnb^_cjsnlu|}~~z|u}vrosuz|uwxrss}xy}~~~}}~xzrt~|wqnurlifnopuma\^agqokt}{~zvz{~{{~xyx~~{}vu{vrxxrmiprsxre_`cgrplrz||~u{{vrvxz~xx|vut{zz}|}}{}wysq}~|{wrnutojfmoqvpc\^`fpplry~|||w{|~||yxv~|{~}~xw}xtzytokrtvzse_`bgqolqx~|{~w~{vquwy}xx{utrzxwz|}~{~xysr}~|xsmsrnidloptoa[]_cmmimu||{||vz|||{zxv}~{~~~yvztxzvqkquvzwjabegrsnpw~|~xy|xsuxx|yw{wurv{vxz}|~y{~xxtox}|{xtmqtqleiootsg\\_`joklrz|y{~}zx}||~{xx{|x}xx|zvnnvwz{readdkspory{|~}v~zvqvuwzvwytspzwvx}{}||x|xxqq{}|zxqmqqngbjmpsnaY\^bmljlrz{z}~yz~}}~|y}}w~~vwzytlntvyyocaeentqps{}|}t|}yuqvuwyvxyutq|wvy}{{zzvz|vuopy{zwvolpqogcjmqsob[^_dnnmou~}}~{|}{}}w}vwyyulmsvyyqd`ddlsqqsz~|tz}yvosssvuvxutpwyvwz{z~}ux~~wvpnvz{xwslnooibglpsqg\]acnqqqu~}|y~|~~|{~|vx~vsuvukipswxre_dekttttz~~z|svzwuortsvvvywvqx|xx|{z}|tv}~wupmtz{xxsmnpqldinrutj_`dfpttuw}|z~|}}}{}zuy~vtuwvkkquyysfaffmttut{~~z}~sx{yvpttsvvxyyvr{|yy|z{~{tx~xvppw{|yzsopqrjekouvsh_ceisuvuy~~y{}{}{||}wuz~{tuuxrjnsxzxocdhisvwvv~|{yu{zytswuvyz||{vx|y~|z}~vt|zwrnsy|zywppptpgjouxwoccghqvvvv~}}{||}}}y}xuywvvzwmnsx||uheiiqvwwt|~|}v{{|wuxvuxz|||wv|y|pkgcioouz|{jiqvy~q|{yuc`kv|ribl|jcjqy~z{sktyYkyt{~z|sqmtyrpwzmtrpt}~}wnlejtz|undh|uqnov~|xfqza`pzv~yv|wu}~vorx}ttzqqnikmsqousu|}|vqhesztux{|~{}leszhensrs~~yxxzwxwyvrrsy|{y||~{uwl`bqytmd^dnmhb[Z]begqsy~ulknsuulfkkmpnkb`hlsswsnx}~|xxumqzngcgswj^]gieb\]bjru~}}}xmnpqwwxur{{}|ud\^co}{j`ehc^XWZalntyxz{trswyvpc_bagknojpwywrsnq|}|xuuuyupu{xi_afq}wihnmiebflv~}stux~~|~~~}|zxpdXY`kywnsuokddhnwy}||{wxz{oknnuy||ux{zvprot}yvyzyz||tqprtzwsuyywula\clzuszzvrnqu~~}~}{yz{~|~sllhaX[fsx{|xqnqt}~||{}|tww{xuwvuprrt~}ytsuttty}z|zronqryzuuw}}~}|qoojc^fr|w~ztvy}~~~~zxz||}{{|zohhgc\`mz|~wtvx}~}xyy|~~upstuqstu~ztrsrrqwzx{yrnnqszzvuv|~|}}zx|~}wmkljdakw|y|vxz{}~~~~~}zx{||{~{wx}{yvkghgd_fs}wwx{}}~}xxx{{|yonqssqutyytstsrryxx{wqnpru{xutw}|{{zvv|~{{rkkkidfq}{}zxz||y|}~}yy{}}{{~}{wuy|yxqhhhgccnz|xyy|}~wwvxyyzqknqspssvxtuutrwyx{ysonrsyyvtt{}{{zvty}{{ulkkkgdmw}}xz{xz}}yx{{}zy~}|zvrv{xxrihhhdbjuyzz}~}~xvuwxxzrkmpsopqt}zvvwvswzy|ztoorryyvtsz|{{yvsx}{{vmlllgdktz||yz}|}}yxz{|zx~}|yurv{xysjihhdahp||}{~~~yvuwxxzslmpsoooq{}xxyyux{z|{vporrxywury|{{yvrw}||xpmmmh_fsx{{~}|sxyzz}}usuy~zvr}|{wypvuytihca`cfr~{|vxyzquvutupnxppnkuyx}~x{xvwzy|{ovpqyyyvzy|typr{wtvwnpkefany|}~wt|}{xzw|}||zuzv|yqlqtv}rrphigkgdcq|~}xwwsxz{|tjhwtqtlu}}{xu|}xwmtuqzxokz~|zprrv~{}zpfiofjfm~~|{~{{zo{|ry{}|uqq}}zpu|~{uvrmnvvorcbhh^^jq~{zyxvqxzthjioutuxxy~y|uy{xyztonsz~}vxzyvxtotnw{wlihcjkkov}~}yt|y{~{yz{{{w}{xxzuq|vwvpdfnnponjgdefory}}xwywsrutmqtvqzwx|x}~~zsqsrzv|zumuysqoqrzvrpvmggminx||z}|{{{uxt{~~x~}}}{ywowyvqqw|}qjiqoqmmhhebhjik~|urwqtsrgltvsruyz|yx}uqntw~vot{wnliostrpidjjlgpu~{yyt|{{ttqy~}{sqxzymmrytpihbkrngcd`nnpo{|nroyzvrqrpvsvw}~|z|}~}xrmqv|{vptt{uodhks{rqkmdjklr~zy~xvwsst{|~~}xsssw|umhtpwpjgjnjkcdbejrptuzrprtvzurlovwtr~{{~~~}}vulqvxsuv|qngdjptvrnicjmnj{~z{uxwyntx{|}zw|wutxyqofpsqomfihmjjabfgtknr}zpowr}sojsxywnv{{z~qtmnwzzytxxsnkhdtqyqjfhmoqgq}~vvv{y|mmu|y}z|wzxtywulojuqmnbehrloc]bgoslq|ukrtx|tkqw{xxnz{~~}~wrsqq~uyqsturmmakrtwrfhkqprkwuvy|{zomzw{~~{ytxntswoqljpllnefopnkf[feonpyzymrstyorrxswqr}z~~wvswlsyuvyruuqlmhksltkkhklnnl}~zwxuwtviq{{{~wzusyvowwqntkmhchdlmkfhb]hlrmo{|uutxwwrkuvywu}xx~{yopww|trquyvsjfnkrpnsgafkurvz~wsru|xsus}xwzv}~nloowuvolmqsiffbkhijadhiokqw|~xwuuvpssoxu|{sx}ruwtusywttyvklkglkssghghqtxxz|~}tqvyuxtpwu|{t~urporsyuliruljdbeajjckjfglvy{{uwrnttqrr~}tx{}{ysqrz}xsvtoqkjieqphmkikqz{u{~wtyuptrvspzyx}z|tpqswvnnromlefc^eegokfdiv|y~~|womqswrrzxx|z|}tqt{{xzuloqnmghkgjolllpwxv}~~}|~xqnmsxsqsu~zy||xtsuunpwqijjlibb_`lnhggltuz}tnmouwvvrs||y~}xuzzu{{qllqsokkddmmkppsop|~}}~vnkotutqnw{xz|}}{wvmnwuofemojda_ejfginqls|xx{~unpsuwysouyy}~yuyxuqkosvrmgdghkrsuljv|{wy~}~|~smqrsrrqswtwz~~|wlptrqhikonhecec`hjqpjnqsur}|uutvuvurrqw{~zxxttqsrrwtqkggbkruskmqsvqv}~{~vxsupnsuuolvy||}~yrtrqllqmokklhg_]ekrmmlilmrx}}}yystuttmt{~x}~}wtroxwwtruplhcjmtqmqoommxy|{{zomrsvpjou~{{{z~~|xsrhmrtshjomk`_`fnmnlhhdpvz~~tvsruquty{z}}~}wsnww}ypsrpnfkhllnrqqjfsx{yzzvosprpnpmux{zvzv}{wjkprxmjmlogbb`egmljlciovx||}zwpsqwxttv|}~w{pvuz~uwrmrmpkhffnosqgnpz~v}vwysppjpoqqtxvyws~xlqnurlrmjlghbcbdfglignkxzx|vrrqxvwrsy|zyytuut{rnwnulcffijwkpzoztr~~}t{~~|tyoioiqtomp|v|zwrurywkumfhfnhj`df_mggrmrlw~ywtoonvuwws}xyuvwvjowkogcfeicpryny~{}~|z{{zwyoumkqnsls}y{z~|}|}xfqvktedhfb_c[eibqjqun|}|}twquyzvt}v}|y}oxwqmjriqplkagdgyvzrtwz}~{||x|vmkmkwmltlmy}}}ygkrksonkaeflhba[hgrwjsuls~tqpnlu}{tz}w{yqrp|wlhnndnc_jjnrtyxsy}~~y~}tstnnlikxsrxzw}{|wvrojnjghbic_\_ccfpjt{qu|{}xyvus{rvzvxsqvqhiplhjebnjtrw|rptv~|}}y~{xmkfjpsqrvqyu{~~zz|ojookcgfihjicj]cfhqunst|vu}|}xqs{rqzs}xzutu}strvhimfhgjmkuwkuorpz~|}|~~~{{pmelgnvs}rq~z}y~~|~{|usrdhgkcdjiih\d_dlirr{rnt}~|s}you||uzwxtruxtkinimaniiunouzurlv}|z}|~{{{rsqmjjnxrszuxx}wvu}xsfhklbbldsgcdcgjggmrsnqu|u|wzzvzs{zv~y|ortw{lrlqpoldbmlprruortxqy|zvy|sxmqonlnnuyv}{rvx~}v~kimrhlgbfikp`cecjomjmjywx{}yxtx||x}s~y}zmqspyzlpksskfffixvvovruqv{zsx}}usmlqetspy}{uxx|y}w~|zullgrombbiiljgahfqifrtuzwzvz|}~{||x|~{jntszroooisdbkmuyux|ur|{|~}uxywttokwlrxurvu|w{}~xzxyzklmminbcgiqohglmimtoxqv{yuv|z~}~y~{vkpttwztksvkkkgrivxwtt}|{~|z~zttvjrqurnwtt{vx}~fkaYdbccljnz~txzz{s}ypwyinyxkjt~viggoz|ouuwtxvujvwz}o{}s~zix|rr~{gbblz~zgflrv{~qqsyypkgvzxutswk]mjw|vuljdq|v{wrmzwnpxlfgvzll`^kyuwwq}|lnriqoov}oaYxndlzyleffqtpr~mlq}xox|~}xux]XXnxnwxqncjnkobVRTU^uxs{zzuf\Ydrzmrrmegnvysfirx~~{~|sur[[]lx{xmg]bjhmf]_aci}z}ogluz|~|zzttz|~|iTUZeuh]bjikcWY[]btxpxzug_gmwzuwvqrvutsw|xuhimlnpzw}|sq~{z|kXX[e}mbgoqtndhiim|yxqytw{{{{|~{qp|ufUTU_wory{xpcgedhtvnuy}phqv~}yy|~ywiknmmmtlr{|yvyw{{zy{wqxyz~~pkzxl]YZ^}zrv~}oqpmq{zyxy}~{wy|{xz|~zmersfZRV[w|~rpohjqystxyovx|v{{|xxnkqorownjpttourqx}}wwvsv{|xqtyx}qfp{oeXY[n{|uxprv~}}y~}w{~z~{}roxt~~pedtkdWUYftwpnouxtv|tsy}vvxwwwvlrstsuxkmnvpmtmqy~{{tv{}vv}~~tkttvulcsulbV[by}{xxrvx~}~}~yzy{y}{mmvp|xk`brjeWV^mvxoppuzvwuvy~~prtqvyxqvsvw{zmmnyrptkpw}}|sv|yv}~thsrtrj_nqleX_h|~yyswv}y}{y~z}x~{|}nhskuwja[lih]Xdpyvqqqr|zv}{xyyy}pmrnt{}wzwty{~rolyxnvmot|tty~xyyhnsl{rk`dpkj\bn||xysxt{v}}}}y||y}zz}oeriosgaXhhiaZit|wrssp||w}|yyxw}}zmkrnv~z|wty}tpmzyovnqt|tuzwzyfnqjwni]allm^es~xwtyt|u~{~}x{{y}y~x|kfqenmf^Wfgl_^oz{vqvrt|w|{v{u|{wioqpz{|tw|}topussnsw|~rx|t}~tftkmsjgZejoi^mwxtxwu~ww}y}y|~x|}z}x{}vcmjenfeW\eji[iuytvwp}z|{yvuy{znlrnw~~~wu}ytn}|ruost~~}uvzvw~{hoogqjj^^hmn^gt|ztvzs}yu}xz|}x|{|{~yv{zfkmbkef[Ycik[cqy|uwyq}|{|zuux{znlrnv}~~xu~}wp~tupts|}}vwz~vu}{iopgnjk_]fmn]epw{sxzs~}~xv|x{||x}{{|}vv}{ygmkcifg[YbjjZbmt~uz{s~{}yvux{|pmrnw{}}wuzsvuput{~~xwy|vs~|}lnpfljlb\dmo^cmrtx|t}|zv{w}}|x}{~||}yr}z|ljnbeeh`W^hm]_jo~wyu~{zw|xvz|tlrnu{}}xt|w|zvqvuw~}~xyy}q|{~umshgjli]_irf_joxyvwz}~|uzx{|~yz}{}}zqvyzwing`cfg\Xamh]fmtw}x}}yxvwz{oprpz||vv~xxtsxuy}|{xzvq|{}ropefile\`mqcems~vyw~}||~|uzw||x|{z~|yov|wyuild^aee[Wbpiaiqxx}z~|yx}vuzzpqqs|}}vx~yyttxvy}}|xzup}{z|rnncbgje[^msgipvwyx||}~z{}uyw||w{{y}|w{nq|zuvujid[]ce]V_pogmt{y{~~yy{~wtv{spsr}~ywz|vtyww{yx~znx~zwzvlmd^chg_[jvolsz|x{~{|{zx~~vyw~|}wz|y{|vxnnxwssukgcZZad`W_qsmpwz|}xyz}wsu{trttyx{}vuyxw{yx}ynw|xvxvlkc\bhg`\lxrqu}|y{~y|z}yw~}wyx{{w{zxzzux}lovtsrtjfaXZcc`Xctsqs{|~zyy|~{wrwzttsxwz|{vxyxx}wy~soyxwvxskh_\egf^`swsswz|~y{{|wyzyxz||yy{yx|vvytjrssqrqgd\V_cc]Zmurrux{y}ztu{xvuvyx~xxzyxzxxzynuwwvvwmib[bghb]mwtss}~}}~x{y~xw~|zyx~zzzzyxywuw~wjprqrpsid^V]bc`Yitrqq{x{y~}vt|zxuu~zw~zzzzyzyyz{otvwwvyoic\cghd]lusqpz|}w{y~wv~|zww{z||{{yzwww~wkpprsqtjd^X_ceaZirpomy{y{y~~vu|{yvu}~zw~}}||{zzzz}ptuwyv{rje]cgig]jtrqmwz}wzx~xu||{xu}}w~}|{zxywv|{moqqtqvofaY]cddZdqppktyy{y~}~ztz{zxtz~~v}~|}yz{~usvuzw{xmh``ghkacrssnry{}yxxy~~|tx{{zux~x{~~{|x{wwwumqosrsujd]Yacga\kqqnnxyy{z}~vvz{{vu}{x}~|z}{zsutvyw|uke_bgjj_htssnvz~}~wxvz|}zsxz|zty~w}~{|v}~wvw~smpnsqttib\Zacha^mrspqz{zzz}~vvz|}wv}|y}~|z}{ystsuxv{tjd^afjkahuvvqx|~||wvuy{|zswy|{uy~x|~~~z{vywvt}umolqqqukb\Y_bhd_ltvus}~yyx}|~xuy{zw}y}~x|y|vsrrxuywld__ehmeftxzux~|zyutv|zz{suw{}vx~{z}~~y{vvwurzvlmjoppulb\Y^bhg`lvxxu~~zyx}{~yuy{|x~z~~x|y|usqqwtywkc^_einfhuy|w{}{yxusw|yzzsuw}}vy~z|}~}y{tw~wts{tmlipoqtj`[Z_cjgcowzyx}zxy~~|~wwy}zz|~{y~|x~}tsosvuzsha^belmemw{{w~}yz~vttx}|x{vsvxzv{x~~~zyxr}zvrvyomjkqotqe]Y]agkchtx{v}|yx||{wyzy}|~~w}x{wtppwtyxlc^`djogity{w{|{xwusw{~x{ysuv~|uy}y}}}~~|yyry{wstzrnjjpossh^Z\`ekdfqvyvy~~}zx}|}xyzy||x~y{xtppwuzymc_adinghrwzuy|}{xxusx{~x{xsuu~{tw{w|}}}~|zyr{{xsuyrojjqptsh^Z]_ekdeotwsw{~~|y~}~yzzy{|xzzzvqpwvzzpd_achnhgouxtvz}~}wyvsxz~yzztut|}uvyyz}|}}z{sw}ytsytpkippsul`Z\_ckfdkqvtty|~}y}zzy{z}~{{}y}xtouwx|ui``cemlglrwvtyzx{|xtuy{{x|vutwytw|w}{|}{zwr|{xruwrohkpqusg]Z^_gjdgntvswz~|z~{zzz|~~y~{z{wrovvz{re_acgnjhnsxvwz|~w|{xsvyz~yy{vusxxuw~}x}{{|zzur}~zwquvrngkoquqf\[^`hjfiouxuy{|z~|{z{|x}zy}zwpntuyzre_acgoljntzxy{}~wz{xsuxx|yx{vvswzvw}y|{~zz~zyuqy~}zwqsurnginotrh]Z^_glhjovzx{}}}y}~~||z~~yy|w{zxrlqtwzui_`cennlos{|z}}xw{xsswwzywzwvtu|wx|z|{}yy}{xuov}}}yxpqsrofgmossj^Z^`gmjkpv|{}|~y}~~}}zyy{wzyxqkqswyuh_acfoonpt|}}~}ww~zxrsvvyxwzwwsw|xx}{|z~xx}zxtow|}{ywprrqmehmotrh\[_`imlmqy}|}|z~}~~||}w|yxzywnlrtyyqd_ccipnoqw}|~~|~uz|yvquvvxwyywvs{zxy~{{{{vy~xwprz|}yysprqqieknrsnbZ^`dmlmot||~~z}~~~{~yy|wyyyqkqsxyui_bcfooops{|}~}~wx}zxsuvuxwxzxwsx{xw~{{z~}vx~yxrqx|}zzuprrslejnrtqf\^`clmmnqy{|}{}~{~yy}xzy{smruy{wkacegpppprz{||}~wy}zytvwvxxz{yxsy{xv~~{yy}|vxzxrrx}~{{vrsstmglouvrg]`admmnnpxy{{}}~~|~~zyz{z|vosv{}yodeghppqpqyz{{{~~~yx}{{vvxvxy{|{zuw}yv{{yx|}wv}{ysqw|||ysssvqilpuxulaaddlnnoovyzzz~~~~~}|y}{{z|{rrvy~|uiehhnrqrpu{z{y||}~w{||zuxwvxz}||yu||yx}}{~|xutty{{}{spsx{{zsmmmotvrmnswwwxy|}~|xz{xtrrsx}~}{|~|vv{}||~~zzy|~yttx|}}xqoopswvqotyzyyz{}}~zy|zvsrru|~~~{~|xz}|{zyx|}yy{xrpsx{|{tooorwxuqsx{zyy{~{}~{wttty}{}|vw{|ywvwy|yz{vrrw{|}yspqruxxtrvzzyy{~zxxz~}ytwz{yxxx|{vtvuomoswxxsmlmnrusoosvvvwz|}~~{wvvx~|xx{~yvy{zwvww|~zvvxwrquz|}|vrrrtxyvruy{{{}|{{|yz~{vw{{zxxy{|wuvwsoquxzzvpnnortsonsvwwx{||}~}ywvx}}xx{~yvy{zxwwx|}yvvxwtsw{}~}wsssuxyvsuz|||}|{{xz}zvw{|zyyz|~zvuvwtrsxz{zvpooortsoptwxwy|~{|}~}zxwy~{xx|}xwz|{yxxy}~}{wuwywuvz}|vsstvxxutw{||}~|}~zy{~~xvy||{zzz~~|xuvxxutw{||ztpooqstqorvxxx{~|{|}}zyx|~yxz}zwy||{yyy{~~}{xvvyzwwz}~ytssuwxvtvz|||~~}{xz|zwy|}|{{{|~|ywvyzwvx{||{vqppqstrpquwwxy|}{|}~|zy|zxy|~|xz}~|{zz{~~}{yvwz{yxz}~yuttuwxvtuy{||}~}{xy{}{xz}~}||{}~|zxxz{yxy|}}{wrqpqstrpquwwwx{~||}}{z|{xy{}}z{~}|{z{}~|{ywwz|zy{}~zvtttvxwuuy{{{|}~|xxz|~}z{~}|||~~}{yxz|{yz|}}|ytrqrsttqqtwwwxz}}|}~~|z{}|yxz|~|{}}|{z|~}|zxwy||zz|~}xuuuvwxvuwz{{|}~}~zxyz||z|~}}|}~}zyy{|{z{}~~|xtssstutrrvwxwy{~}}}}{z{~{xxz}||~~}|{{}~}|zxxz|{z{}|xvvvwxxvux{|||~}}}yxy{}|{}~}}|}~}{yz|}{{|~~~|yutstuvtssvxxyz|}}}}{z{~~~~{xy{}||~}|{{}~}|zyxz||{{}}ywvvwxxwvx{||}}|~~}yxx{}}{|~}}}~}{zz{}|{|}~~}{wuttuvuttvyzz{}}}}~}{zz|~~~~~|yy{~|{}~~}|{|~}|{yxy{|{{}~~{xwwwyyxwx{}}~~|{|~~}~|yxy{~~{|~~~}}~}|zz{}}||~~|xvvuvwvutwyz{|~}}}~}{zz|}~~}~~|zy{~}{}~~}|||}}|{zyy{|||}~|yxxxyyxwx{}~}{z{}~~}}}|yxy|~}{|~~}~~}|zz|}}|}~~|ywvvwwwuuxz{{}}}}|zyz|}~~~}}~}{yz|||~~}||}~}|{yyz|}||~~{yxxxyyxxy|~~~|{z|}~~~}}}}{xxz}}|~~~~~}{z{}~}}~~{xwwwwwvuwy{{|~~}}~}{yy{}~~~~}}}|zy{~~|}~}}}~~}|zyz|}||}|zyxxyyyxx{}~~|{z{}~~~}}||{yxy{~~}~~}|{{}~~}~|zxwwxxwvvyz{|}~}~~}{zyz|~~~}}}|zyz|}~~~~~~}|{zz|}}}~}zyyxyyyxxz|}~~|{z{}~~~~}||{xwxz}~}~~}||}~~}zyxxxxwvwxz{{}~~~~|zyz|~~~~}}|zyy|~~~~~~~}|{zz|}}}~~{zyyyyyxxz|}}~|{zz|}~~~}||{ywwy|~~~}||}~~|zyxxyxwwxz{{|~~~~|zzz{}~~}}|{yyz}~~~}|{z{}~}}~|zyyyyyxxy{|}~}{zy{|}~~}||{zxwxz}~~}|}~~|zyyyyxwwy{{|}~~}{zyz|}~~~}}|zyy{~~}|{{|}~}~~|zzyyyyxxy{|}~|zyyz|}}}}|{{yxwy{~~~}}}~~|zzyyyyxxz{|}~~}{zyz|}~~~}}}|zyz|~~}|{{|}~~~}{zyyyyyxy{}~~~|zyxy{|}}||{{zxxy{~~}}~}{zzyzyyxz|}}~~}{zyyz|}~~~}}|{zz|~~}||{{}~~~~|zzyzzyyy{}~~|zxxxz{|}|{{{zyxy|~~}}~}|{zzzzyyz|}~~~}{yyyz|}~~}}}|{z{|~~}||{|}~~~~|{zzzzyyz|}~~}{yxwxz{|||{{{zyyz|~}}~}|{zzzzyz{}~~~~|zyxyz|}~~}}}|{{{}~}||{|}~~~}{zzzzzyyz|~~}|zxwwyz{|||{{zzyy{}~}~}|{zzzzzz|}~~}{yyyz|}~~~}||{{{|~}|||}~~~~|{zzzzyyz{}~~}|zxwwxz{|||{{zzyyz|~~~~|{{{{zzz|}~~}{zyyz|}~~~}||{zz|~~}|||}~~|{zzzzyyz{|}~~}|zxxwxz{|||{zzyxxz|~~~~~}|{{{zzz{}~~}{zyyz|}~~~}||{zz{}~}||}~}|{zzzyyyz|}~~}|zxxwxz{|||{zzyxxy{}~~}||{{{zz{|~~~}|zyyz{}~~~}}|{zzz|~}}|}~~|{zzzzyyz{|}~~}|{yxwxyz{|||{zyyxxz|~}||{{{{{|}~~|{zyyz|}~~~}||{zz{}~}}}}~~|{zzzzyyz{}~}|{zxwwxyz{||{{zyyxyz}}||{{{{{|~~}|{zyyz|}~~~}||{{{|~~}}}}~~|{zzzzzzz|}~~~~}|{zxwwwxz{|||{zzyyy{}~}||||{||~~}|{zyyy{|}~~}}||{{|~~}}}}~~}|{zzzzzz|}~~~~~~~}|{yxwwwxy{|||{zzzyz{}~}||||||}~~}|{yyyy{|}~~~}|||||~~}}}}~~}|{zzzzz{|}~~~~~~~~~|{zywwvwxz{|||{zzzzz|~~}}|||||}}|{zyyyz{}~~~}}||||}~}}}}~~|{{zzzzz{|~~~~~~~~~~}|zyxwvwwyz{||{{zzzz{}~}|||||}~~}|zyyyz{|~~~~}|||||~~~}}}~~}|{zzzzz{|}~~~~~~~~~~}|zyxwwwwxz{||{{zzyyz|~~}}||||}~~}|{zyyz{|~~~~}|{{{|}~}}}~~}|{zzzzzz{}~~~~~~~~~~}|zyxwwwwyz{||{zzyyyz|~~~}||||}~~}|{zyyz{|~~~~}|{{{|}~~}~~}|{{zzzzz{|}~~~~~~~~~~}|zyxwwwwxz{||{zzyyyy{}~}}|||}}~}|{zzyz{|}~~~}|{{{{|~~~}~~}|{zzzzz{|}~~~~~~~~~~|{zyxwwwxyz{||{zyyyyz|~~}}}||}~~}|{zyzz{}~~~~}|{{{|}~~~~~|{{zzzzz{|}~~~}}}~~~~~}|zyxwwwwxy{{||{zyyyy{|~}}}}}}~~|{zzyzz{}~~~~}|{{{|}~}}~~}|{zzzzz{|}~~}}}}}~~~~~~~}|zyxwwwwxyz{||{zzyyz{}~}}}}}}~~|{zzyyz{|}~~~}|||||~~}}~~~}|{{zzzz{|}~~}}}}}}~~~~~~}|zyxwwwwxy{||||{zzzz{}~~}}}}~~~|{zzyzz{}~~~}|||}~~~}}}~~}|{{zzz{{|}~~}}||}}~~~~~~~}{zyxwwwxyz{|}}|{{zz{|~~~}}}~~}|{zzzz{|~~}|||}~}}}~~~}|{{{{{{|}~~}|||}}~~~~~~}|{zyxwwxyz{|}}}|{{z{{}~~~}}}~~~}|{zzz{|}~}|||}~~~}}~~~}|{{{{{{|}~~}}~~|zxwwvvwxxyyxxwwxy{}~}||{{{{{||}~~|}~}}}}~~~~}}||}}}}}}}}|{{zyyyyzz{|}~}xw|{yyyz{|||{zyxxxxyz{|~~}}}}~~}}||||}}~~{|~~~~}|{{{{{|~~~}zwwy|}|{zyxvutsssstvwxyzzyyxxxxz{}~}|{{|}~~~~~~~~}|{|~~}|{zyyyyz{}~~}}~}{yxxy{~~}{yxvuttttuwxyyzyxxwwxxz{}~}{{z{|~~~}}~~|{|}~}|zyyyyz{|}~~}~~~|zxxxz|~}{zxvuutuuvwyzzzyyxwwxyz|}~}|{zz{|~~~}}~~}||}~~}|zzyyyz{}~~~~~~~}{yxxy{}}|zywvuuuvwxyz{{zyyxxxyz|}~}|zzz{|~~}}~~|||~~|{zyyyz{|~~~~~~}|zyxyz|~~}{yxwvvvwwyz{{{{zyyxyyz|}~}{zzz{}~~}}~}||}~~|{zzyz{|}~~~~~~~~}|{zyyz{}~}{yxwvvwwxyz{||{zyyyyz{|~~|{zyz{}~~}}~~}||}~|{zzzz{|~~~~~~~~~~~}}{zyyyz|~~}{zxwwwxxy{{|||{zyyyyz{}~~}{zyyz|~~~}~~~}||}~}|{zzz{|}~~~~~~~~~~~~~~}}{zyyyz{}~|{yxxxxyz{||}|{{zyyyz{}~~}{zyyz{}~~~~~~}|||}~~}{{z{{|~~}}~~}~~~~~~~~~~}|zyyxyz|~}|zyyyyz{|}}}}|{zyyyz{}~~}{zyyz{}~~~~}|{{|}}|{{{|}~~}}~~~~~~~}}}}}}~~~~}{zyxxxy{}}{zyyyz{}~~|zyxwxy{}|zyxwxz|}|||}~}|||~}{zyyz|~~~~}}}}}}~~}||}~~~~~~}|{zzzz{{|||||||}}~~|zxxxxz{}}|zzyyz{|}~~~~~}}|||}~~~~~~}||}~~|zxxy{}~|{zz{|~~}{zz{}~|{z{}~}~}|{{{|~}{zxwwwwxz|~~}}|{{{zzz{{|}~~}{zyxyz{}~~~~}}}}~~}}}~~~|{zz{|}~}}}~~~}{zzzz{|}~}{yxwvvxz|~|{zz{|}~|zyxxy{}}zxwwy{~}}}}~~~~}|{zzz{{}~~}}}}}~~}}}~~|{zyyyyyzz{{|||}}~~}|{zz{|~~|{zyz{|~~|zyyz|~~}||}~}||||}~~||{{|}~~|{{{}~~|||}~|||}~~}||||||}~~~~~~}|{zxwwvwxy|~~}|{||}}|{z{{|~~}||||~~~~~~~}|{{zz{{|}}|{{|~~}|||~}|{{|}~~}}~~}|{zyxxxyzz{|||||{{{{|~~~~}|||}~~}|{{{{||}}~~~~}}|||}~~|{zyz{}~|||}}||||}~~~~~}|||||}}~~~~}|zyxwwxyz|}}}}}}~~~}}|||}}~~}|zyyyz{|~~~~}|{{|}~}{zyz{~~}||}~~~}}}}|||}}~~~~~|{zzz{|}~}|{yxwwxy{|}}}|}~~~~~}|{{{{{|}}}~~~~~~~~~|{{|}}{zyy{}~}}|||}}~~~~~~~~~~|zyzz|}~}|{yxwwxyz||}}}~~~~~}}~~~~~}|{zzzz{}~~~~~~}|{|}~~}|zzz{|~~}}}~~~~}}||||}~~}~~~|{zzz{|}}}|{zxwwwwxy{|~~}}||||}}}~~~~~~~~~~~~~~}||{{{{||}~}|{{{}|zyyz}~}~~}|||}~~}|{zyyxxyyz{|}}}|{zyxyz}}|{{}~}{{{{|~~|{{|~~~~~||{|}}{xwwxz|~~}|}~~}|{{{}~|zxyz}~~~|zzz|~~|zxxxyz{{zywvuuvx{~~|{{|}|zyy{}~||}}}~~~}|zyyxyy{|}}}}~~}|}~~}|||}~~~}}}}~~~~~~}|{zyxwwwxyz|}~~}|{zzz{}~~~|{|}~~~}}}}}}~~~~~}{{|}~|zyy{|}~}}|||}||}}~~~}{zzz{}~|zz{}}{zzz{|}}|{xwutuvxz}~~~~}|||}~}}~~~~~~}{zyxxxyz|}~~}}~~|zz{}~}}~~}}}}~~}|{yxwwwwxy{||||{yxxxz}~}}|}~~}|{{{|}~}|{|}}zyyz{}~~}|{|}~}}||}~~}{zzyz{}~}{{|}}{zz{|}}|{ywvvwxy{{||||||}~~~~||||~~}|{|~~~}|{{{{{||||||}}~~~}}~~~}{z{|~~||||~~~}~~~~}|{zyxwwxyz|||{zxwvwy|~~~~}}||}}~~~~}|{{|}~~}{zyyz|~~~~~~}|{{{{|}~~}|}~{zz{|~~|zxwvwxy{||||{zzyyyz|}~~~~|{{}}|{{{{||}~~~~~}||{{{{|}~}|{|}~}|{{||}~~~~~~}|{zzyyyzz{{|{zyxwvwxz|~~}}~~~}}}}}}~~~~~|zz{}~~}{zzz{}~~}}}~~}|{{{{|}~}||}}}~}|||}~~~}|zyxxxyz{|||{{zyxxxxyz{}~~}}}~~~~~}}}}}}}}~~~~~~}||{zzyz{|~}||}~}|{{|}~~~~|zyxxxy{|}~~|zxvuuuwy{}}~~~~}}}}~~~~}||}}}|||{zyyy{}}|{{{}~~}|zyyz{}}|||}~}|{|}}zxvuvwxz|~~}|zxwvuuvxz|~~~~}{z{}~~}{zz{|}~~}{yxwvvwxz}~|{{|~}{yyy{}~|{{|}}||{{||}}~~~~~}|{ywutttuwy{}}}}}~~|{{|~~~}~}{zz{{{{{{{{|}~}|{{|}~~|{z{|~~}{zzz|}~|{{|~~~}|{zxwwwxyz|}~~~~}|zyxwwwwxyz|~~~}||~~}}}~~}||||}~~|{zxwwwxy{}~}}}~~}|{{{{{|}~~~}}}|||}}}~~~}|zywvvvvwxyzz{||}~~~}}|}~}}}~~~~}|{zyz{|~~}{yxxy{~~|{{{|}~}}}}||{{z{|}~}{zyxxxyz{}}~~}{yxvuuuwy|~~~~~||||}}~~}}}}~~|zyxyz{}~~~}|{z{|~~~~}||{{{{{{{{||}~~}||{{|}~~|zxwwxy{}}}{ywuuvy{~~}||}~~~~~~}}}~~|{zz{|}}}}|{zz{}~}}||}}~~~}|{{{||}~~|{z{|}~~}{yyxyz{|{zyxwwwy{}~~}}}~~~}}}~}}~~|{yyz{|~~|{zzz{}~~}|{zzzz{|~~}}~}|{{|}~|zyxxyz|}}|{zyxxxxyz{|~~~}}}}}|zyyyz{}~~~~~~}}}}~~~|{zz{}~}||~}|{z{|~~}{zyxwxxyz{|}}~}}}||{{{{|}~~~}~}}|||}~~~}|{{zzz{|}~~}||}}~~}|{z{|~~}}}~~|{{zyyyyz{}~~}~~~~~~|{zz{|~~}}}}}~~}|||}}}}~~}|{{{||||{zzyz{{|}|{yxwwwy|~|zy}}|zywvvvwyz|~~~~|{zz{}}{zz{|}}~}{zzyz{|~~||||~|zyz|}|||}~~~~~{xvuw{}{yxwwwxyz{{|||{yxvuuuvxz}~}|{{{{|}}{zz{|~~}}}}~{ywwz~}|{{||}~~~~~}}||}}~~}||}~}zwuuux|}{xwvwwxy{{||{zyxwvvvwxz|~}{zyyyz|}}{zzz{}~~~|{{}|zyyz|~}{zyyz|~~}||}~~~~~~~~}zxwvwz~}||||||||{zyxwwwwwxxyz|}~~}|{zyyzz{|~~}}}}}~|zxxz|~|{{|}}|zzzz|~~}}}~~~}}~~{ywvvwz~~|||}~~}|zyxwwwwxyzz{|}~~}|zyyxxyz{}~}|{{{{|}}{zz|~~}}~~|{zzz{}~~~~~~~~~~~{xutuw{}||}~}{ywvvwxyz||}}}}}}}}}}|||{{zzzz{|~~}}|}}~}|{{{}~~}|{{{||}~~}|||}~~~}}~~}}~}zwuuvy}~}~}{ywvvwxy{|~~}|{zzyyyyyyz{|~~}}|||}}~~|{z{|~~}|{{||}~~~~~~~~~~}||}|zwuuvy}~~~~}|zyyyyyz{||}}~~~}}}||{{{zzzzz{|}~}||||}~|zzz|~}{{z{{|~~~}||||}~}|||}~~~~|zxwvxz~~|zyxxxyz{|~~}|{{zyyyyyyz|}~}|||}~}{yyz|~}|||}}~~~~~}}}~~~}||||}}}|zyxwxz}~|{zzzz{{|}~~~~~~~~}||{zzyyyyz{}~}}}}}~~~~}{zz{}~}|{{{|}~}}||}}~~~~~~}||||}}}|{yxvvwz}~|{zzzz{|}~~~}|||{{zzyyyz{|~~~}}}}~~~~~}{zzz|~}|||}~~}}|||}}~~~~~~}|{{{{|}}|{zyxwxz}}|{zzz{|}~~}}|{{{zzzyyz{|}~~~~~~~~~~~|zzz{~}}||}}~~}}|||}}~~~~~~}|{{{|}}}}{zxwvwx{~~}|{{{||}~~}||{{zzzzzz{|}~~}}}}~~~~~~}{zyz{~~}|||}~~}}|||||}~~~~~~~}{{z{{|}}}|{ywwwxz}}||{{|}~~}|{zzzzzzz{|}~~~~~~~~~~~}|zyyz|~}||}~~~}}}|||}~~~~~~~~}|{{{{||}||zyxwwxy|~}|||}}~~}||{zzzyzz{|}~}}}}~~}}}~~}{yyy{}~}||}}~~}}||||||}~~~~~~~}|{zzz{||||{zxwwwx{}~}}|}}~~~}}|{{zzzzz{|}~~~~~~~~}}}}~~|{yyz{~~}}}}~~~}||||||}~~~}}}~~~|{zzzz{{|||{yxwwwy{~~}||}}~~}|{{zzzzz{|}~~~~~~~}||}}~~|{zzz|~~}}}}~~~}||{{{||}~~}}}}}~~|{zyyyz{{||{zxwwxy|~~}}}~~}||{{zzz{{|}~~~~~}}|||}~~~}|{zz{}~}}}}~~}||{{{{|}~~~}}}}}~}|zyyxyyz{{{{zyxxxz|~~}}}~~}|{{zzzz{|}~~~~~~~}|||}}~~~}|zzz{}~}}}}~~~}||{{{||}~~}}}}}~~~|{zyyyyzz{{{zyxxxy{~~~~~~~}|{{zzz{|}~~~~}~~~}|{{|}}~~~}|{zz{|~}}}}~~~}||{{{{|}~~~}}}}}~~~|{zyxxyzz{{{{zyxxyz}~~~~~}||{zzz{{|}~~~~~~}||||}~~~~}|{zzz|~~}}~~~}||{{{{||}~~}||}}}~~|{zyxxyzz{{{zyxxxxz|~~~}|{{zz{{|}~~~~~~}|{||}~~~~}|{zyz{}~}}~~~}|{{{{{||}~~}}}}}~~~}|{zyxxyz{{|{{yxwwxy{~~}||{{{{{|}~~~~~~}|{{|}}~~~}|{zyz{|~~~~~}||{{{{{||~~}}||}}~~|{zyxxxyz{||{zyxwwxz}~}|{{{{{|}~~~~~}|{{||}~~~~}|zzzz{}~~~~~~}|{{{{{{|}~~~}|||}}~~}|zyxxxyyz{{{{zyxwxy{}~}||{{{||}~~~~~}|{{{|}~~~~}{zzzz|~~~~~~~}|{{zz{{|}~~}}|||}}~~~}{zyxxxxyz{{{{zyxxxz|~~}||{{{||}~~~~~~|{{{{||}~~~}|{zz{|~~~~~~~}|{{zz{{|}~~}|||||}}~~~~}{zyxxwxyz{{{{zyyxyz|~~}||{{{|}~~~~~}|{{z{{|}~~~}|{zz{}~~~~~~}||{{zz{{|}~~}}|||||}}~~~}|{yxxwwxyz{{{{zyyyy{}~}}|||||}~~~~~}|{zz{||}~~}}|{z{|}~~~~~}|{{zzz{{|}~~}||||||}~~~~~}{zyxwwxxyz{{{{zyyyz|~~}|||||}~~~~}|{zzz{|}~~~}|{zz{|~~~~~~~}||{zzzz{|}~~}||||||}}~~~~~}|zyxwwxxyz{{{{zyyyy{}~}}||||}}~~~~}|{zzz{|}~~~}|{zz{|~~~~~~}}|{zzzz{||~~}||||||}~~~~}{zyxwwxxyz{{{{zyxxyz|~}}||||}}~}|{{z{{|}~~~}|{zzz|}~~~~}|{zzzz{{|}~~}}|||||}~~~~}|zyxwwxxyz{{{{zyxxyz|~~}}|||}}~}|{{z{{|}~~~}|{zzz{}~~~~}|{{zzzz{|}~~~}|||||}}~~~~}|{yxxwwxyz{{{{zyyxxy{}~}||||}~~}|{zz{|}}~~~}|{zzz|}~~~~}|{zzzzz{|}~~}||||||}~~~~~}{zyxwwxxyz{{{{zyxxyz|~~~}|||}}~~}{{zz{||}~~}}|{zz{|~~~~~}||{zzzz{{|}~~}||||||}~~~~~}|{zyxwwwxyz{|{{zyyyyz|~~}}||}}~~|{zzzz{|}~~~}|{zz{|~~~~~~}|{zzzzz{|}~~}||{{||}}~~~~}|{zyxwwwxyz{||{{zyyz{|~~}}}}}~~~}|{zzzz{|}~~~}|{{{{}~~~~~~}||{zzzz{{|}~~}}|{{{||}}~~~~}|{zxwwwwxyz{||{{zzyz{}~}}}}}~~~}|{zzz{{|}~~~}|{{{|}~~~~~}|{{zzzz{||~~}||{{{||}}~~~}|{zyxwwwxyz{{||{{zyzz|~~~}}}}~~}|{zzzz{|}~~~}|{{{{|~~~~~~~}||{zzzzz{|}~~}||{{{||}}~~~}}|zyxwwwxxz{{||{{zyyz{}~}}}}}~~|{zzzz{|}~~~}|{{z{|~~~~~~~}|{zzzzz{|}~~}||{{|||}~~~~~}|zyxwwwxyz{{||{zzyyz{}~}}}}}~~|{zzz{{|}~~~}|{zz{|}~~~~}|{zzzzz{|}~~}}||{||}}~~~~~}|{yxwwwxyz{{||{zyyyyz|~~~}}}}~~}{{zzz{|}~~~}|{zzz{}~~~~~}|{{zzzzz{|}~~~}||||||}~~~~~}|{zyxwwwxyz{||{{zyyyz{}~}}}}~~}|{zzz{|}}~~~}|{zz{|}~~~~}|{zzzzz{{|}~~}|||{||}}~~~~~}|zyxwwwxyz{{||{{zyyyz|~~}}}}~~}|{zzz{|}}~~~}|{zz{|~~~~~}|{zzzzz{||~~}||{{|||}~~~~}}|zyxwwwxyz{{||{{zyyz{|~~~}}}~~}|{zzz{{|}~~~}|{{{{|~~~~~~}|{zzzzz{||}~~}||{{{||}}~~~}}|zyxwwwwxz{{|||{zzzz{|~~~}}~~~}|{zzz{{|}~~~}||{{{}~~~~~~~}|{zzzzz{|}~~}|{{{{||}}~~~}|{zyxwwwxyz{||||{{zzz{}~~}~~~~|{zzzz{|}~~~~}|{{{|}~~~~~~}||{zzzzz{|}~~}||{{{{||}~~~~}|{zxwwwwxyz{||||{zzz{|~~~~~~~}|{zzzz{|}~~~}||{{{|~~~~~~~}|{zzzzz{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{||||{zzzz{}~~~~~~}|{zzz{{|}~~~}||{{{|}~~~~~}|{zzzzz{{|}~~}}||{{||}}~~~~}|{zyxwwwxyz{|||{{zzyz{}~~~~~~}|{zzz{|}}~~~}|{{z{|}~~~~~}|{zzzzzz{|}~~~}||{{||}}~~~~}|{zyxwwwxyz{|||{{zyyz{|~~~~~~~}|{zzz{||}~~~}|{{z{{}~~~~~}||{zzzzz{|}~~}||{{||}}~~~~~}|{yxwwwxyz{||||{zzyyz{}~~~~~~}|{zzz{|}~~~~}|{{z{|}~~~~}|{zzzzzz{|}~~}}||{{||}}~~~~}|{zyxwwwxyz{||||{zzyz{|~~~~~~~}{zzzz{|}~~~~}|{{{{|~~~~~~~}|{zzzzzz{|}~~}}|{{{||}}~~~~}|{zyxwwwxyz{||||{zzzz{|~~~~~~~}{zzzz{|}~~~~}||{{{|~~~~~~~}|{{zzzzz{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{|||||{zzz{|~~~~~~~|{zzzz{|}~~~~}}|{{||~~~}}~~~}|{{zzzz{{|}~~}||{{{{||}~~~~}|{zyxwwwxyz{|}}||{zz{{}~~~~~}|{zzzz{|}~~~~}||{{|}~~}}~~~~}|{zzzzz{|}~~}|{{{{||}}~~~}}|zyxwwwxyz{||}||{{zz{|~~~~~~|{zzzz{|}~~~~}}|{{{|~~~}}~~~}|{{zzzz{{|}~~}||{{{||}}~~~~}|{yxxwwxxy{||}||{{zz{|}~~~~~}{{zzz{|}~~~~}}|{{{|}~~~~~~~}|{{zzzzz{|}~~}||{{{||}~~~~~}|{yxxwwxyz{|||||{zzzz{}~~~~~}|{zzz{|}~~~~}||{{{|}~~~~~}|{{zzzzz{|}~~}||{{|||}~~~~~}|{zyxwwxxy{{||||{zzzz{|~~~~~~}|{zzz{|}~~~~}}|{{{{}~~~~~~~}|{zzzzz{{|}~~}}||{|||}~~~~~~}{zyxwwxxyz{||||{{zzzz|}~~~~~}{{zz{{|}~~~~}|{{{{|}~~~~~}}|{zzzzz{|}~~}||{{||}}~~~~~}|{zyxwwxxyz{||||{zzzz{|~~~~~~|{zzz{{|}~~~~}|{{{{|~~~~~~~}||{zzzzz{|}~~}||{{{||}~~~~~}|{zyxwwxxy{{|}||{{zzz{|~~~~~~|{zzzz{|}~~~~}}|{{{|}~}}~~~~~}|{zzzzz{|}~~}||{{{||}}~~~~}|{zyxwwxxyz{|}}||{{zz{|~~~~}|{zzzz{|}~~~~~}|{{||~~~}}}~~~}}|{zzzzz{|}~~}||{{{||}}~~~~}|{zxxwwxxy{||}}||{{z{|}~~~~~}|{zzz{{|}~~~~}||{{|}~~}}}}~~~}|{{zzzz{{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{|}}}||{z{{|~~~~~|{zzzz{|}~~~~}|{{||~~}}}~~~}}|{zzzzz{|}~~}||{{{||}~~~~~}|zyxxwwxyz{|}}}||{zz{|}~~~~|{zzzz{|}~~~~~}|{{{|}~}}~~~~~}|{zzzzz{|}~~~}||{{||}}~~~~~}|{yxxwwxyz{||}||{{zzz{}~~~~~}{{zz{{|}~~~~}}|{{{|}~~~~~~}|{zzzzz{|}~~~}||{{||}}~~~~}|{zyxwwxyz{||}||{zzzz{|~~~~~}|{zz{{|}~~~~~}|{{{{}~~~~~~~~}|{{zzzz{{|}~~}|||{||}}~~~}|{zyxxwxxyz{|}}|{{zzzz|}~~~~|{{zz{|}}~~~~}|{{{{|}~~~~~~}|{zzzzz{|}~~~}||{{||}}~~~~}|{zyxwwxyz{||}}|{{zzz{|~~~}|{zzz{|}~~~~~}||{{{|}~~}}~~~}|{zzzzz{|}~~~}||{{||}}~~~~}|{zyxwwxyz{||}}||{zzz{|~~~}|{zzz{{|}~~~~}|{{{|}~}}}}~~}|{{zzzz{|}~~}||{{{||}~~~~~}|{zyxwwxyz{|}}}}|{{z{{|~~~}|{zzz{{|}~~~}|{{||~~}}}}~~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{yxxwwxyz{|}}}}|{{{{|}~~~~}|{zzz{|}~~~}}|{{|}~~~}}}}~~~}|{zzzzz{|}~~}||{{{||}}~~~~}|{zyxwwxxyz{|}}}||{{{{|}~}|{zzz{{|}~~~}|{{||}~}}}}~~~}|{zzzzz{|}~~}}|{{{||}}~~~~~}|zyxxwxxyz{|}}}||{{z{|}~~~~|{zzz{{|}~~~}|{{{|}~}}}~~~}|{zzzzz{|}~~}}||{{||}~~~~}|zyxxwxxyz{|}}}|{{zz{{}~~~~~|{{zz{|}}~~}}|{{{|}~~~}}~~~}|{{zzzz{||~~~}}||{{||}~~~~}|{yxxxxxyz{|}}}|{{zzz{|~~~~}|{zz{{|}~~~~}|{{{{|~~}}~~~~}|{zzzzz{|}~~}||{{||}}~~}|{zyxxxxyz{||}}||{zzz{|}~~~}|{{z{{|}~~~~}||{{{|}~~~}}~~~}|{{zzzz{{|}~~}}||{{||}~~~}|{zyxxxxyz{|}}}|{{zzz{|}~~}|{zz{{|}~~~}||{{{|}~~}}}~~~}|{{zzzz{|}~~~}}||{{||}~~~~}|{yxxxxxyz{|}}}||{zzz{|~~~}|{zzz{|}~~~~}|{{{|}~}}}}~~~}||{zzzz{{|}~~~}||{{||}}~~~~~}|{zyxwxxyz{|}}}}|{{{{{|~~~}|{zzz{|}~~~~}||{||}~}}}}}~~}|{{zzzz{|}~~~}|{{{||}}~~~~~}|{yxxwxxyz{|}}}}|{{{{|}~~~}|{zzz{|}~~~}}|{{|}~~}}}}~~~}|{{zzzz{|}~~}||{{{||}~~~~~}|{zyxxwxyz{||}}}||{{{{|}~}|{zzz{|}~~~~}||{||}~}}}}}~~}||{zzzz{|}~~}}||{|||}~~~~~}}|zyxxxxyz{{|}}}||{{{{|}~~}|{{{{|}~~~~}|||||}~}}}~~~}}|{{zz{{|}~~~}}|||||}}~~~~~~}|{zyyyyyz{||}}}||{{{{|}~~}||{|||}~~~~}}|||}}~~~~~~~~~}||{{{{||}~~~~}|||||}}~~~~~~}|{zzyyyzz{||}}}}||{{{|}~~~}||||}}~~~~}}|||}}~~~~~~~}}||{{{||}}~~~}}}||}}}~~~~~~}}|{zzzzz{{||}}}}}|||||}~~}}|||}}~~~~~}}}}}}~~~~~~~}}||||||}}~~~~}}}}}}}}~~~~~~}}|{{zzz{{||}}}}}}||||}}~~~}}}}}}~~~~~}}}}~~~~~~~~}}}|||||}}~~~~}}}}}}}~~~~~~~}}||{{{{{{||}}}}}}}}}}}~~~~}}}}}~~~~~~}}~~~~~~~~~~~}}}|||}}}~~~~~}}}}}}}~~~~~~}}||{{{{{||}}}~~}}}}}}}~~~}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~}}}}}}~~~~~~~}}|||{{{|||}}}~~~~}}}}~~~~~}}}~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~}}}}}}~~~~~~~}}||||||||}}}~~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~}}}}~~~~~~~~}}}||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m53.bin b/applications/SprPoP/dist/MUS/m53.bin deleted file mode 100644 index 378e098..0000000 --- a/applications/SprPoP/dist/MUS/m53.bin +++ /dev/null @@ -1 +0,0 @@ -~t|vx}zx|zwq|q|urttvo}rz|v}v~~}~{y~}nwuzyyzpu}pr~}u{wv|zy{{vq|q{vrtswn}~rz}v}v}}|z~pys|{xy{pv}rq}u{xu||yz}ws}qzxsr}ryoz{~p}|x}v~}x}~p~vs{yyzqw{pu}~}wxy~}w}|zt|p{wtp}~strx~{q~{z}u~~w{{rtsz{y|o{~}~py}}~wu}}u{{|u{p}uvq{|sutu}xryz~v~|wzztsrz{y|r|{{|s||}~zx~~v}|~w|p|yxqz}sutu}yq{{}u~~|vz{tsrz{y|r{|z|s{}}~}zy}~w}}}v}qz{wo|~sxtuz{p~||u~{zv}{{}wp||xy|~vy}u}{v{~|{~{~zx|xtxyo|yu|s}wu~p|{}x{{zzmv{fwusmvsyshuwx~nyyn}~{wzysz{e~~zj|tprn|o{}rw}u{vznv{wyxp|tstzr}{z~mwfxnyzx|u{|uzg}sw{zhk|nlvzyw|s{}xo}rg~wsq~n~vpypu{|~uzx~yr~xsjyrr}u{w|sktzyxzvyu~t~swtxsx{}ox{j{szsuo~quw|}yyvqqxvqhxyrwvw|yzv|}~totnwoxp}r~w|ovpyrx{tz{z{qz~x{q~w|~qxy|z{~xx}rs{yyrzv|~oyx}zwrxzwlsxi{yj{z~u~~}~}x|vxut~xqwx~wwy~xvywvx|wx}qwoupy{rw{{{wwyovw~{vxxpm||uy}qnw}|xws}}yzu{y}}y~}|}|rv}{yxuxus{unpnzqtwzumz~}q~qu}wj{x{vpx~}toywvw~{|w}u~}wy{rws|rwqyvw{y}~~xswsym}|~z}x~q{vlkdq~~}{xrujzp{uw}yvo~z}ztyvrl]||rgs{xqwrd}vv}{ziwy{fu|wvwo|tyqrzrr}~wl|p|z}}|wy|ws|yzut~w{usqw}}ryqu{rqw}~{jv{xgq~{jwq}z}snytipqu}roukw{~}yxxvos~mmpkrzsyby}mlovwz{p~zotg~mw}ywkpwwzo{~zz~z}{|~ufnwvsz|}ojmnsvxsp{t{r~ytz{|{|~gx|pq{ypw~xswyus}o{u{uy}xxzstqw}ot{o|kt}tzz{}z|zrvwzsw|v|~szml~}vx~~{{{}{|y}wt{{vvxoxxwzzz~w}yqw}rizmw}yyr|wxvy|z{}w|{y~}s}}|y}yzx}p||u{zr{zyxnx{rwzxy||zzzoy}js~vpz~y~|}px|y~}wqvz{ywy|xh|owzy~zSvqvaxUPXdVSWaostyvltblmdrp{}uxpxvjg[vcvlvbmanranez{pztopes~o}~e`_g|sltmorakfihl{}{wn}o~|rtvlfsuy}p|ys~ym}wu|}svjmisw[otmskjwtwuynmvpxotigymj}_t_es_or|tszqg}spZescx~sh^]]h`glodgywd_PVl]loRhaikpd]z]_bYaWdaibRNlpXuxiz|t|kwyruvqfcyoZb_cccf\jnazyvteurugbpjra{xwdahdvb[{yzuvthg^~}{~zqzsmqfjfntexywltijk`^eg[puf]h}uigZmncoZi{runhm}nqppruzq|lpxvmlx}}s}sw~yxueivlmcgxhxv|}~umtrpZpjrdkyd~xsc`WPTGYlb~}mnm`bik\hmdfrnglWao\dVaqgrdzml~opaa^WqtgWXbjXWe`a^avtuyiekvvrzvnrsznjaifbebpwgs{}yr||rha`foactoksx}y}u{omp]lpqjaswzzik]Z\]k__ou}|l{}nnymsqcutkbUpcoqesdx{wthnlv~zuxtlr}{{|z}xx}y}}yokaha]ksulh}~~souqxqhuzps|{q||m~~{z|~m{z{}qonepmpkaxywops}~szxu{|otwo]hreymxyo|txto}nsypxqmhfutqrpwvvylv}tuzuv~tjqjnvz~o}|vtxzpoxrbkvynsm`quoef~n{xty~{}{yuhpqkqw|q}zuylrwf]cmiek[\haTOa\QdXceZhml][cftynjw}{{wyz|szxo{{y||x{{|vyqrt|{ssy~rzkrxrgeygntgsjo~}mw{~yz}wx}{rsyzvkWSTKR\a^Rkt{~}owtfU[iZhg`jeivxrmumkwxuicztemzqio||}rw~r``aZhruj^ws~w{w|o|o~uvstzxqprmx~{yrx{qy~{{~msy}zk\[XTbnpc^tn~~xtwyvjnvk`hkmmrjeplc]nlZhaeoagundfpkjrojbjysjhvqjkrwpv~tnu}|zs~z~w{~|~~}lhf^foqnnyvpoq{rjp~{mlkmqzneqhYTjgZi_bojnzznjrloxrh]ene[^njd\blfkqlhovrttz}l{pwwls{xnz~yhkrure]d^Wbmnbhvk}vwyu||vzsgejqvfahvo`ekjn{xx}vmozwyz}{ytvrp|~uxxxyzosnwu|}v~}||}~}~z}wvtv~vnvyzrhfjhkvxmjv~rry{onvzmjjlntsnrslhvsfuolxwu}x|x{yystzyyzrqtkinsvwldptqbeorof\ZXU_ijet~xqxqv|v|ztu{s{~||}|v||utupt}~vu}}xwy~{vxyqwu{ur{~zz~}}wqmy{vv||yty}|}{xyzxuz|mjrtpbdilkfba^bhf`auts{{|~qpt{qhdchrqjkjdcmi\if`hidjpnnromomifq{uplx~|ywusx|z{||~~~zrwsz~xqpojkkd`o{s}{}xvw{~yurkdio^`kbfnigptsvzwtphdhsphaconjfda`fklrzvpwzp~}q|~||vsz~wmrxyrfhmolfdfcbfc]bqhlzny}wz}zzzwtx}wnou}unllpwwrrqptxp~zt}~x|~~zuz~~|||z|zut}~~|z~z|z}yx}|{~tw~}qpuxwtstroolhm{su{~|rrv~xnihjopmmkhkurhtsltxqqx|}zyzsy|yuolouz~wz|y|vrmknrsogajprkcgkmljigdcd`^kyq~{w}y}~y}xywy|~}~}{zxrr{|xwz~|ywtu{uuxv~zqrwz}~zwspr||vqz|xuvy||w|w{yv}|zvvy|zsignqqf_aegggijihd`drsk|xzz{rnmpsrpnlnvxkkumjsrkkquwxwusnkp{}yur|~zwy}{}{}}|}||{z|~|vopx||tlkmponnmkifdj{{~|wsqrwuilwpmuvopuz~~ytomqywqlhpvwuqmklotz}xszvz{w~}vmmstsibbfhijlmlidaiwtn}|t|zz{|}vtv}{tqqstrpqsx~{qxxxxwz~}{}zsv{}zqlnsuvx{}|zvu~|}{|~}}~{trx{{uljmprsuvusolp}xzvwz{tnlmoomllpwypq|xt}{wz~~zxx{ztpt{}{xtrsw|zv}wwwnqttqnkkllhc_ckoogaacfghijigegs|{{|z}tqrvxz||{xtqw|zxxyywuv{~tvxt|}uprvz{zwsqsxztrw~|ywx{~}uu}}sv~vpuz|{xvvvtohehmome__begjlmkhfjt{ty~{zzxvuuzvt~{tyztsvz||yvtuz~zvz{}}vvy|~}zz}|}|{z{~z{~|{~|xvuspkgjqvwrjgilnnmliebdnywu~tzvt}yuw{|zy{{tqu{}|yvtux{|wrv|u~|x}yrpuyzwnhghkmnonjgekuvnuzw{{{xvvuttv{}tv{ty|utvy{{zwvx~}y|~~~{|ztoqvxxrkijmprtuspnr|~||ytrvz|yrlkmorstsqnms|}tz}}|~zusrqppsx}|tu~uy{xy|}}{ywx||vpptxzxvuuwz|ysqy~wt}|rmprrpmkigc_\_eknkfcceghiheb`cmwvs~}}~z||uqpruwxwurps|}y}{zxxy||uyytz{trstuusqruz~}ytqsx}~~}{{|}|vqs{yprzxonquwwvusplgdgknnjc``behjjjhhnw|wu{{}zz{}|{z{}|~~~~zwy}|vrsuwy{{zwwz~~}}}~~~}wssw{}~}~}y|zx}snoqrqonljgddhnstqkgffghihfeflw}z{{z{ww{~~}|}~~|wsw~vyyw{|xsqtxyytnjijlnoomlnt|~ww}}~}{yyy{xu|zv{~xutuvuuuw{|xvx}~yv{|tx|usvy{{zyvsnkjnrtsnighjmprrqqt|}{{~~{wspquxywrmklmopqqpqu}}x}}|zxxxz}{w|y}{yyyxwuuwz{ytokknrtuvvwyzxsqu{ypovtkedfggfedb`^`djnokfcbcdefeeeiq|{~~z||~}}ywx|}wspqrstutsty|}||~zv{{tw~~ytsrrrqqsvz}{xspruy{|{{{{ytpotyumpwvoklnpqpomjgdehlnmieccdfhijjlqy~|w}~|||xuux|~}zurqqstuuuux~{~~~}|{{}zupoptwxzz{|{yutx~~vsy{tliijjihfdbabflprplhffffeeddhowyux~~|xtv|zuzyvx{}~~}{xustx{|zvqnmnoooooqu|~yu|}~{w|~ww~~yvuttuuwz~{wttvz|~~~~}{wssx}zrry{upoqsttsqnkiilprsplhggijkllnrz~y{}~zz{|}|{yvsrsvxzxtpmllmmnnnpu{}yu{}|}y~}|}{yxxwxy{|zupljknprsttttqonsyxqmsuphdcddcb`^\\]agknmjgeddddccdgnuwtu|yy~zz|z{}~}{ywwz}}yusrrrsssux~{{yx~}vw}}yvtssstvx{|{wsppruwxxxwvtpmotwsllsuqkiikllkigedehknnlifdeeghikpxwsuwy{zywuttstusmhgmpkegmqqonoqux}zvxwpfa__^]\ZWUTTWZ]][WSQPQSUY_hx`ynh}xolnokfa^\[[]_cgjlllmpv|tlhec`][XVTUX[^^\YVTRSUVX\bly{n}{x}xvy{xsomkkklmprsrpmlmquy}}zwvwwxz|wor{nhgikmnopqruvvtplmstnhhkmkea^\[ZZ[]^^\YVUVY]adgikllmou}||vuy{xvtojgkrrlilqsqmkjiiijkmnmjfcbbdgiklmmlkkmtz{wv}sjdbciq|yrrqkb_beeb^\ZXXXXYYYVRNKJKMOQSUUUTSSW]a^XY_ca]Z[^adgiknrw~}~~xspoooprttspkgdcccdcca_]ZXY^cb][`gifddfjlnprsux}zri_Y\gs{}tmiedb`]YURQRTVWWWWURPPSXXSNPUYVROOPRTTUVWY]bgknoooprux{yleglszyqkhggggfeca_^aegc]]bec^[YZZ[[ZZYZ\`dgiihghijmpsw|{qha\\`hr~}wrmhd`\XWX\^ZSQTWUOIFEEEEEEFHKOUX[[[YXWWWY[^bhorssy|xurppry{usqld]^bc_ZWWWXXXXWWX[^`bb`^\[[[\^`chmonkls{}{z}~ukb[WVW\bku~{ywqh`[XVUTRQPPRTWYYXVTSRRSTUX\aeeb`dlrpnotz}wqkfa_ags~xsnhd`^^_``_]ZWUTTTTUW[^`^ZX]deb_`dimprsuvwwvvwz~|wqjeba_ZSS[fnrw{{wrommljgb^ZWTRQPPRVY[YWYaikihkosvwxxxxwvuuw{|piihd^Z[_gpzztoligfgikjeaagkidbdgjlmnoonmljiiknruwyz{|}~}{rib\XSQPQU\eq}{xvutpjddilidbdgjmnnoonmkjhijmqtvwwxyz|}~|zy}~ysmgb][[]`dint{|xyyslgfhijjjiihfdb``adgjllmmnoqrrqnmpw{yuuz}{zxusqonmkgb]XTTUY`hr~~{xuqnkjjlptwyz{{{{{zxupmnsurmnsy|}~~wqkfb_^^bhoux}ztpmlmnonnlkjjjjhea_bgieaafjllkjkkmpsuxyyxwwxz}~{wtqomlje_\`ioru}}zxwuusqmihlppjgimpqpnnnnprtwxyxvuuvy|~xojkkf_YY]bhov~|ytojjnplfdfijheb`____abba_]\\^aehknopqqsx}|wx||yxyz|~}{zxtqnlklnqv}~vposuusrqqqrtvwxwuromlmnnooonmllotxxtsx~~|wrlfb`aejqx~}}{wrnkihhhhihfc`^]^_`bcccba`bgkmjgiossqooqstvwxy{~}xtrqpnlkkloty~}|zwsokiiijjkjjhgefinolhhnrrollmnoqqrsuw{}yuroljhdbemv|}xrmigffgggfecaacgie_]`cb^ZXXY[\^_adhmrvyzzywwwwxy{~vpnnlf`agouz}ytolkmnlfbdijhdbabcdeefgilpsvwwvuuvwxz}~|}|vnhghgda__`dipx~{{|ztnloqnjfcccccbbabdgilmmkjiijklnquy}}zy|{vqmigffgijkmpu{~xspnlkjhfffgiklkjhfedddegilprqmlqwyvtuy}|xtpmjgc_ZUQPQUZ`fnu{zurpnljhhiknpqpnkhfdbbabdgjljhkry{yx{|vqnkigedcbbdhpz~{wurqpoopruwvsopuywsqswz|~~}~~yvtrpnkhd`\YX[_b``eox}|yvtrqqrtvtplmrurnlnrtvxyyzzyxwvwy|{wrnkkljd]\`cdccfjpw}}}}}ztonrtrljkmpqrrsssrqoooqtx{~~zxxywofaaa]WQNNOQUY^dkt}}}~}{yxusqpqsw{~wuwxtnieb`^\[ZZ[^cioty}|yvtstvxyzzyyyyzzywtsv{}zvw|}xurpnkheb`_`aaa`_`adhmsz~{zz{|}}|{{{{{zyvssw{{wtv{~}~}{zxusponnmkhd_\YWVWX[_elqsuz~}{wttx{xspsvwvtrqppqrtuvvusstvx{~~~zyxxyyzyzz{}~~}yuokfb^\ZYZ\__^^dnvyz|}~xttx{{zyyz{|~}~~{ywvttttrlfdgihdbdinty~zxz||{xvutttvwxxwurqqqsuvwxxxwwx|~{}~}|||}}|yrnoqpjdbbcdefghjlnpsw}}|||}}}{xvtsstuvwwwvutux}~|xx}~|{{|}}}}~~~~~zvwzzuollmmljhgec`^]]_chotz}}|zxurpnnoqrttttsrrtwyvqoruurnmmoprsuvx|~}}~|yupkgcbbcfhjloquy}}zwuuwzxsprvxvsqqrstuuvwy{~zvtrqqqpnljhgggfeddhovyy||zy{}~zuuy{zwtssstttttuwy|~~||{{||}|{{|||{ywtrpnlie`^`dfcacjquy|{|}xutssssrqqrtvxyyxwuttttuvx{~}zy|||~|zvqljlmjc__bcba`abehmsx}}wtrqqqqqqrtwz|~}|ywutsrrstwz{zxy|z{{vnjjkkhecbbcehkosuwy|~}}}~}|{zzz{|~}~|}|vtuvvsoligeddddcb`_^`bgkpuz~}{zyyyz{}~{wx}~zyz}~~|{}}zwtrqponmkiea^\\]^`bcegilpx~|{zz{}~}yuuy|zvtvx{}~~}||~}{xvtrqqqpnlieb```````_^]\]afiigjqx{}~~~|zyz||ywutsrpmjfb_^_aa^Z[aegghkoty~}}~~~{xwvvvvtsqnkhghjhc^^bcb_]]_begknrw}~||}~{{~~|}}{zz{{{zywtrpprsoiefhgc_[ZYYYYYZ[^bglqtwy|}}|z|~~|zyyyyz|}}}{zyyz{}~~|zxwxzysmjlmjea^]\\\[[[\]`befffefgilpty{|}||}xtvyyuqnlkjihfdccdeffeca`_`abehmrx|}}~~|||}~~}|}{||ywvvutrqonnoponkheb`_]]]^aceecchosstw~|{zz{|}~~}|{zz}~zz~|yxwwvvutsrrsttsqnkhfdba`_`aa_[XZ^`_]^bglptx}~}}~~~~|zxxyz|}~}|{}~yvy|{xusstuuvvwxz|~~{xtromkihhijieabfigcbcegiijjkllmnqtz~~}y{~}zxwwxxxxxxy{}}{zyxxwwxy{zwrpqtsnihijjjihhgfedddgkotx|}}}|||}}||||}~|{zzyyz{}~|xttwxupmmnonmljigda_]\]_bdfgikmptwz{||~}zyyyyyxxxxy{}~~}{yxwvvvwxy{|yusuyyuqpqsttsrqpnkhfdddeggggggghjkkjilrxzyz~zxwwxxyyz{}~|zyxwwxz|}{xy}~|}}{xurnkjijkmmmmlllllkifcdhkjggkquxz}~}}}~~~~~~~|ywvuvwwwvtrqpnmkhdabefc__bfhijkmosw{~~~|}}{|~~}{xwvvwxyyxwutsrqokgdeghd_]_bbb`__`acfjmprstvy}}}|||~}zz~{z{}}|{|~~}}|zvronpplfcdeeb_][ZYZ[]^`aaaceinrw{}{yyz|{xxzzuomnoomjhfeeefgghgedccdfikmoqrsux}~{y{~~zvuwyywtrponmmmlkifc`___`aabbbbcfkpsssw}}~|yxz}}yuvyzzxvtsrqqqqpnlhecbaaa``_]\ZZ[_ba__cilllnqtx{}}~ywxz{ywusrrrrsssrpnlkjkkkkjhfc`_`a`\XWZ]][Z[]aehlptx}||~~|{{{|}~~|zxwwwwvusqnkiijjgb^_aa^[YXYZZ[\^`chlqux{}}{yxwxxxxwvtrppqsrniikljfca``__^]]^`begiijjlnpsvz~~}zxwwwxxxxwusrqruuqmlnpnjfdcba`^]\[\]^__^]\[[\]_aeimrstuz~~~~}|{{}~~}{yxxzzwroqsqnjihhhhggggghjjjheb_][ZYYZ\_bcccgntvvx}~~{xx{{xurpoonmljjjjkllkigecba```acdec`_cgigfhlptx{~}}~{yyxxwvutttuvvvtromkihgfffghfb__bda^]^`cefhjkmnopruy~~{|~{xwwwvvutsstuvvvtqomlkjihijjjgcabeea^]^`abccdddddefhlquy|~}zxxxyyyzzz|}}zwusqonnnopomiilpokiijkkjigeca_][[\^aehjmpswz~~~}}|{zz{|~~}{zxxwwwxyz{zwssvwuqnnoppponmkigecbbcefggghijkmnnnory}~}}||{{{|}~|yuuxywsppqrrrqpnmjhecbbbcddcbbaaaba`_^afiihintwz{}~|{{zzz{}~}zwwz|zwtuvxxxxwwutromllmnnnmljihgfeb_]]`b`]]`dfghikmptx}~}}~|}}~}|zxuromllmopqqppppoomkgddfgc_]_abbaaacehlpswy{|~|zxwxxyzyywvuttrqnjhikkgcceffedcbbcdfhikkkklnqux|}{ywwwxyzyxwvuutsqnjikmkgddfgfdb`_^^__```_^]]^`begilmoqsw}~~}{xtqprspkhijjifdbaaaabcbb`_^]^`abddeeeefjnppoqv|~|z{}|wsrstsqnlkjjjkllkigeddddeeedcbaabehgedhmoooprtwz}~{z{}}|zxwvuutttsqolihggggfedca``bdeb_`dggfefhjmoqsvy}~|z{}~}{ywvvuuuuusqnkjiiihhgedb`_`bb_[[]__\ZZZ[\]^_`ceimqsuwxz|~~~~|zyyyyz{{zxvutsttttsqomjiijifa^`a`^[YYZ[\\]^_adgikkkkklmnprvz~~|{{{{||{zywusstusokkllieb`__^][ZZZ[]^_`__^_`acegkosvwwy~~}{yxwxzzwsrtutpmkjjihfeddddefedba__^^_`acfhihgjoststx|~|zywwy{yursuvspmlkjihgfedeeffeca_]\\[[[\^`a`^]`egfegjorvy{~~ywxyyvsqpppppppppqrrrpmkheca_^]^_``^\\`ddbacfiklmnoppqqrsvz{yxwvutrqqqqrrrqomkihggffghhheaadfda_`bceffghhiiijknquy|~}|{{||}|zxvtrqoonmnnomifehifb``abbbbbaa`_^^^`behjlmoqtvy{{|}~}||||}}}|zwutsrqppqrrqnkkmolifghiiihhgfecba`acdfghhijklnnnnnqvzzy{}zxwuttuvwvtqqtvuqoopppomkigeb_]\\^_abccdeghijihhkoqqoptx{|}vpnighe]YZZXXXVTTRONKIHIJKMNNNPQRUXY[\^dkprtx~|zzyyxvutssttuuuvx}js_k{|ywtqlgb^]\YTNMNNLJHGGHILOSVZ]`chmsz~|{{{{zwsrtvvttux~saV[qo]QMLLMORW\]\]`dfgfdeeefhikllkjjijklmmmmlkkkmpqpmnswxxy{}|ti[NE@BL[m|tja\WUTUVWY[^bhmnmoswyyyyyz{||{{{{|}~~}|zxwvuuuvwy{{zxx|~~~yuqnjf^YZ_gpy}|{zzz{|}}{xvwyyurqqrrqponmkigedddegghhhhiijkjjijnqrppsvyzzzz{|}~~~~zxy~zvronmnnnmlkjihgec`\[\][WTTUVUTRQQQQRTUVVVVUVWY[]_`aabbcfjmmkmqvyyz|~xspoosy~vrnje`\YWVUUUUUSRPONNOOOOONLKJJKMLIGHKLLJIJKMNPRTWZ^chlpsvy|}vnhda`bfkrz|tlfc`\VQOOPNKHGFFFFFFGGIKMOPQQQRSTVXZ]adhjjjntxyy{~|yuof\WTPKGFHNU]fow|ztnhb^[XWVVXZ[[ZZ^beddeilorsuvwxxwwxyz|~~ytoid_ZURONNNOU`mw~|{z{{{{{{|}}}|zyy{|zvttvutrpnmmmmnooonmmmoprtuwwxxxy|}~}{ywvvw{}{zxuromlkkjjjihfeccdffc``bdc`^^]^^^^^__acefhhhhhhijlmortwxwvx}{wusrsux}ytsqmhc`^\[YXVUTTUUVVTSQONNMMMNOPRRPNPTVVUUWZ]`cehjlnoqsux}yspmic_^_bgms{ztnieb`^\XTSUVTQOOPQQQQPONMLKJKMORUXZ]_behkmopquz~~~zupkgb^[YUQOQW]bflu}{uqmkigeca`_^___]\\_cedcdhkmnooprsuxz||}}|}~}zupkfb^[XUQOMMNRV\cipx}|{ywusrrrsstttssrrruvusqsuvtrqqqrrrrrstuwyz{{zzz{||~}{|||yvspnkihgggggimrz~}{zxwvvvvtromjhgeedeeghhfefjlkihjlmnnnnmmlkjjjlnqsuwxz|~}wspoopquy~}yxwtokjjjihgfedb`_]\\]^____^^^___^\[]`bb``cgijjklnprux{}|ysmihjjiilry~zvrnkhd`\Z[[YUSSUUUSRQQQRSTUVVUUUVWY\^`bdeghkoswwwz|yuqlhd`][ZYYZ]dkqtx|xtokhfdcba`_^\[Z[]_^\\_cdddegilnprtvy{~|wsokgda^ZVROMLMPTY^ekqw~~{ywvvwwwvutsrrrrrstvxyxvuwz{ywxz|}~~}}~|xtpppmhd`^\ZYXYZ\`flsz~{ywuttttuutssrrrqpnllmppnllnpqqqqqqrstuvwvvuuuvwyzz{{{{{|~{wtstspnnptx}~{vrpqqomkjihhhiiiigfedddeeeeedcbacefebbehiihijlnprtvxz}}~vwqfcb]XYXUTTTRQPPRTUSRRUXZZZ[]`behkorv{|yvsolhedccehnt}pjmjxz|}|xvvvvuttuwzrXnvTYfr{{wsokfa\[[\ZWUUWYZ\]_aceghjmqv{|xtqomkfa`cgjlnqty{|{voeZPMWo}zvsokjhhhhhhhhjjkjifa[UPKJP\ionhb_^`chlptvvwxz}|ric_`hu}yrh]SMMOSY`ege`[UPLJGGFGIKNPSTUVVWX[]^][\^aa`___`acdegiloruxz|}|rjdachq|~umgc_ZTMJJIHEB@@@@@A@GUS[_efjbeYp{j^XQNOQVX[ny~{vrpoqv|~xqkfca`cfkrx}d`r^JOTY]aeinuy}xj]oqkv~yuqqponmkifeccceglsy~yt~{|}vsstvxyyxvtsrolf`\YY\`flry{|~~zm_VU_koke`_``^\[[_fozxrqtx}zxuonookbYRORXaku}~xph_WPKHGHHHFDCDGKQW]dimpsx}sjb^^clyznc[Y`o~}wrlhc`^_bfkmnopqtwz|~~}|{z{|}}{||||zwrnkjknsx~{rjb^]^`b`]XSQWcnuvvutromnpty~~}|{ywtqnid`[XVVX\`elu~}|}{xwy||tle_[YZ]cimnkhffhkosvyyzywvtpkd]XY^a`^^_acfjmqux|tibeoz}{wvx|{uqnkhgfgghijllllkklnqtvwuspmkihgghjnsy~zxwxyzyxtpnlllmkhc`co~~|{yxwwyzzyupjd__adc`\[\^aceghjklmmnooopppqqrrtvxz|{wtuy|xtstuutsrpnnorx~{xustz|{|~zts}|ywtqoljhfda^\[_hszzwssx~{ywutsrqqqolgel~}yuqlgc]YUSSTX]chmopomjfca^]\[[\]^_abcegjlnopu}~|~}zwtng]SPXhsuuw{~~{xtpmieb__`a`^YTRTXXVUX\aejnrvz|wsolkkmptx{}}|zxvtrqpmjikmjdfs~}}~}~|yvsqpoonligdccdfggdaajz|xuwywrmkjjjhfc`]YVSRRSW\biov{~~yvw{|ywx|ysnifddfimpstsplhecdgknnmkgdba```abdfjmoonnopqqnmotz|zwsokgb^ZWTSSTUVVV[i~}}}}|{ywuuuvwwwutssssuvxy{|~zwz|{yz~~{zz|~|{zzyvqmq~}|{zywvutrqpnnmlllmnnmkgddgjiecdfimprrpliilkgddhnt{}{xvuutttrpmkiijmpuz~xsw}zwtplhd_[WTQONORUZ_cgjkkjklosx{|~~~|{yxwwwxz|}|ytps~~{xusqrsvz}{vrqrsuvwwvvutttvy}|wof^ZYXSNMPV]cfffkx}~{ywtsrqqqpnkifecbbaaaaaaabbbbcdfimrvxxuqquy{zxvwz}~{yvsqomlmnpsx{|yuqnljihijkmmkga]bp}|{zyyxuqlhjnomnqx}{zyyz{}~ztpu}zwtqnjfc`]ZXWXZ]aglprrrty}}ywwxyxvux}~{wwxz{}~~|zxwwwwyzzytnjlu|{vrrpmklmoqrtuwyz{{zwusssvy|}}{wtqonmmllkkllnopqrrstuusporwywuux{}yuqmjgdccehmrx}}{|}}zxvutuvx{~~~|wrootyzxsokhkw}{ywvtsrqponmllkjihgfedcb`_]\[[[[\]][[^fmnmmr{~|{{{{|{zxvtsrqppppqrtvy|~}ytrx}woifdcccdefilpswy{{{zz{~{xxxyyzz|}~}xqkkszvuwz}{ywvtrponnnpruvwwusqtz~zxz~{xurnjfb_[WTQONNOQTX]afilmkhegr}{ywvutsrrqpppooonnnnoopqsuwxywtrtxzxtrrsttuttssstvwyzzz|}zxwuuuwz}}xx{wuvwtoiecbbbcdfjmqtvw{|zwusrqpqqsuvvvuuwwsnnw~{wsolheca`__abehloruwyzzzyxvutsssstuvvuropuyzyz|}}}}}zxurpmjgecba``aaa_[UONU`ijhfhmsz}{ywvtsrqomifeglprrsuz~}||{{{|}~~{xutttroieccdeeefffgiknruy|}yurpnmlllmpsvy{|zvqnr|~}{zxvtrpnmkigeca_]\[Z[\]`dinswy{}~}~~~}|||}~|~~{wtpnljjjkmorux{~~{yvtqnkifdbaabcehiif`XTZhv|zvvz}zxwutssssssrqqpppqqrtuwy{}}{ywz~~||}}|}~{vronlkjhfdb_][ZYYYZ[]_acdfgghjmqw~{~}ywy{zwsqqqstvwy{}~{wsppswxxwxz|}}zxx~}zwtqnkheb`][YXWWXY\_ciotz~}zx{}{ywusrponmmmnpqstsqlhfjt|}ywwy}}zz{{yurppqtwz}~|{zzzzz{{|{zxxz~|zyy{}~{{||zupligfdca_^\\[\]^__^[YY`ly~|zxvtrqonmllllmnoqrtuvwxxyz|}{xx}~}|zyxwutsqpomlkjihhggfda]YXZ\[XVVY]aflquy{{zyz~}|{zyyyyzzz{|~{vv|~zvqooqpnjgffhknqtx|~}|{zyxwvuuuuuutsqoorw{{wrmhfis|zusssuwxyzz{||}~|zxusqnlifda^\ZXWVVWY[^acedcbdmz~}|{{zyyyxxxxxyz{|}~|zwuvyzxtqpppqponmkigeca_]\[[\]_adgjmnmmmpsusqoosx~~}}}|||{ywtrswyytnjimrtutvy}}zxvtrqonmkjjjjkmpsuwxvspqv}~}zwtpmjgdb`^]\\\^_bdgjmprtuwxz|~}|zxvtrqoonnoprtvwwurlhipy~~zuqqrtw{}|{{}~|zxvtromjgda^[XTQNKJHHHJLPUZ_chlpuxywvz~}}zxvuwy{yvromllmmnopqrstvwxyzz{{{zyxwvuuttuvxz{}~}zupos}~~~zvsrqqponljhfdb`^]\[[\\^^^]\]binopqtwz}~|}~||~~|zxvutssstuwxz|}|{zxwutrpnljhfdb`_^]\\]^_aaa`\WQOR[ejjgeefikou|{wsqqrqnida^]\[ZZZYZ[\^aejoty}~~|z{}ywwy{{yvtstuwxywtqprtsokgfeeeeedddccddeghjlnpqsssssrrstwz}~}~~|zxvtrqonmmnnopponmoty}~~}{zxwusqomkigffeffhjlnqrsrnjfejrz|zuqnnpqtuwwxxwvvutssqomjgfhkoqppoprtvxy{|~~}|{zyxwvtqnkijmprqppppomiffks{~{xxy}~~}}}~{xx|~zvttuwxyzzyxvusqomjhfca^\ZXUSRPONNNOPQSVY]aeimpsuvuttv~zxxyzxuqnnmnnnmmmmmmnoprtwy|~~||}|xvuttttuuvwxz{}~~|xtpqw~}~~{yvtqomkihgfedcb`]ZYY]adghikmoqsv{~}|{{{|}~}}||}~~{ywwyzyvsomlkkjihgeca_\ZXVTSQPPPQRSUVWWVSPNQXbkppppquy~~|zxvtrpnljgecb`_^]]]^_acfilnprtx~~|{ywvtrqonlkjiiiijihgdbbcca]YY[_abccegknruxz{}}}}}~}{zzz|}~|{ywvutsrrrstvx{~~}{zyxxwwvusplifeeffeb`^]^`behjmnonlhcachossokgfefhjlmopqrstuvwyz|}}{ywtrpnljhfdcbbbbcegiklmlkjjmu~}|{{{{{{{zywtqpqrroligggggggffedc`]YVTTUVVTQPOPRTWY\^dkorsrpnllmqxyustx|wpkjkmnoqux|~~|{ywwwwyz|~~}{ywurpnljhggghkorw{wplmsyzwx||vsqqstvwxwusrpnlkjiiijlnpsvz}~yurpopqtw{ytqommllkkjigfdcb`_^^]\]]^__``_]YTOJFDCB@@@@DJRZbhlmmmnry~{xwy~zurqrtwy{{zwsojfda_^^_`acfhkmpruxz}{wttx~~~~|yuqnifb_\ZYXXWVTRQRTXZZZZ[^adfiklmnnoqsvz~}wspopsv|}|xtqooqtuvwx|~}}||{{{zzzzzyyxwvtsqpnljhgecbaa``aacdeffea[TLGHNW`ddb`adimruxz{||}|zwtromljiihhhhhiijkklnoqsuvxxwurppu}}yvtttuvxz|~~{vpjfccb_\XUTSTUUVVVVVVVVVVWWXXXYZ[\\]^^_______`bgmu~}{ywvtssssttsqnkhimtz|}|}~~~}~~~}}}||zyxwuutssstuvwxyyxuqmjjov}|{z{}~~~}}{vroljihhggghijlnpsvx{}~{wrnkiijknqtx{zvwzzurqqsux{~{zywvusqnkifc`]ZWTROMJHFDB@@@@@@@@@@@@ADINSY`fkoqrqopt|~~|xurppqqpnkigffghiklmnopqrstuvxz|~~{wrmigffeb^ZWVUVWY\^adhknqrsstvz~~|{{{{|}}{xvutssstuvwy{}~|zxvsqnkhec`^[YWUSRPONMMLLLMNOQSUXZ[[ZXURQSZbjmnmlmosx~~{ywtrpomkigd`]YVTUVXYXWWY\`ekqx}}|{zyxxwwvusqnmmoqrpmhdbcdeecbaabcdefghijklmnooppqppoonmnnprux{~}{yxvuttsstuvwxyyxwvwz~~~{zyyywsokhfdcbba``__^^^_`abdfghhgea][[^djmlieb`_`abdfhijjkkllmnoprtvxz{{{zyxyz}~~~}{ywutsrrrrstvwyzzzzyyyxvttw}~|{{}|xtpmllnoomjfc`]\ZYWVTSQONLKJIHHHIJKLNQSVY\_bfilnpqrrru{}ywvwwwtqnlkkkkllllllllllmmmnnopqrssttsrpnllmprsssssuwy{}}|yvuw{~|zxvtrpomlkjiiijkmoqsvxyz{{||~~}}~~|xurqpooonnmmlkkiheb_[XVUVUTQNJGEDCCCCCDEFGHJLNPRSTSQPPRX`hnqqpopqsvy|~|zxvtsqonmkjiihhhijklnqtw{~|zxvtsqpnmmlkkjigdbaadfhhgfgghiijlnruwwvusqppqrtvy|~~}{zzz{|~~{yxxwwxxxyz{|}~~}{yxvtrpmkjhfdca`_^^]\[ZXVUTTVY]_``_^][YWUUY_ejlkifedegjmptwz}~|zxvtsrppoooopqstvxyzzxvtsuz}{ywvutsrpnkgdbaaa`]ZVTRQPPOONNMMLLLLMMMMMLKJJLNQUWXXXWXY[^adhmrx~}zwutuwz||zyxxy{|~~}|{zxxwvvvvvwxz|~|xustx}}yvutuvx{|~~}|{zyxwvvvvvvwwxy{|}~~}}||}}~}yurprv{|xutstvx{}|zyyyxvrnlihgffecb`_][YVTRPNLJHFDBA@@@@@@@ABDFGIJLOTZ`eijhfefjqy}|{zzzyyxxwwvuuttsssstttuvwxy{}~|zyxvusrpnljhfecba```````_]\[\_beeeddefgijkklllmnprux|}yvtstuwwwwwwy{~}{ywusqomkigeca_^\[YXXWWWXYZ[]^`aa`^\ZY[`fknmjhhimqtwz||yuqnkjihggggggghijlnpsuwxxxvtrru|~~~~|zwspnllllllljhda_^_`_]YVSRQQQQQRRRRRRSSTTUVVWXXYYYYYZZ[\^aejov|}}~~}{yxvutsrrrrrsstuvwvurojgdeinsutqmjhghilnqsuwxxwvuttvxz{{zyxxxy{|~~|zxusqpqsuvvvuuuvwxxwuronosy~}{yyz|~}{zyxxwvrokhfeefffffedba_][ZXVTSQPNMLKKJJKKLMOQSVY]adhlorstsqporw}zxwwwwxxyyyyyywvtrppqrtvvusrqqqrtuwy{}}zxx|~zxwvvwxyz{{{{{zzyxwvutssrqponlifca__`bcddcccdegijjjkmptvvusrqqrsuxz}}{yxwvvvvvvwxyz|~~|{{|||zwspljhfecba`_]\ZYXVUTTSSSSTUWXZ[\]]\ZXVVX]dkqsssrrtvy}~|zxvtrpnljigfedccccccccccbbdfjotx{|}}}|{zz{~|zwusqonlkjiiiiiiigea]YVVX[]^\YVTSTVX[^acfhiklmnnnnnmmmmnoqsvy|~{xuqonnnnmkhecaaaabdeghjkkkifc_\[]aeijifc`^]^_acegjlnpqsuvxy{}~}{yxvtrqonmlkjjjjklnprtvxyyxvspopty}{xtqnmmnnligecbba`^\ZWVUUVVVURPNMMMMOPRTVXZ\_adfiknqsvx{}~~~}zwusrrrrrsssssssssrrrrrrrqqrrrsstuvvwxxxxwwxz}}xsolmpuz}~|zwtsrrstuvvwwwwwvuutrqponmkjihhgggfgghijkmprtwy{||{zyxyzz{|}~~{xvtsrqpnmkjhfecba_^\[XVSPMKJJKLMMLKKKLNPTWZ]_`a```aelsy}~}|zzz{}~}|zxwusqonlkihgfedddcddeeghjlnqsvy|~|zxvtrpomlkjihhggedb_^]^_acccbbcdgilnpqqqpnmlmnpsuvwxy{|~~}{ywuspnljhfdb`^]\[ZZZZ[\]^^__^]\[ZZXWUTTVY]`a`_^^^`behlpswz}}|{ywvusrqpoonnoopqstvwxyyxvtrqsw}~|zwsoljiiigea^[YWVVUUTTTSSRRRRSSTUWXZ[]^____^^_behknqsvy}~}}}}}|zwussstvwy{|}}~~~~}}||{zzyxwvutsrrqppppppqqrsttutsqnkhghkpuxywsnifddfilnppooooopqrsttuvvwwxxyyzz{|}}~~}||}~|{|~{wtpnljihfeca_][YWURPNLJIGEDCBAAAABCEGJMQUZ^cgjlmljhggiov~|yvtsstuvvvtromkjjjjklmmnopqrstuvxz|~~~}||}|{xuroljihhhhhhijklmnnnmlkjkmpsttrqpooppqqrrstuvxz}~~~~{zyyyyyyxwvtrpnljgeca^\ZXWUTRQPPPOPPQRTUVWWVUSPNMNQX_fkmnnmmmnoqsw|}zwtqnlkllmmlkihggikmptwz~~|xutsstutspmhd`][[\^_^]ZXWVVWXYYZ[\\]^^__````a`````_``acehlpuz~|zyz|~~~~~~}}~}{xvtsrrqqqpppooooooppqrrssrqolhda_`chlnnkhda`__`bdfiknpsuwy{|}}}}}}~~}|||{||||}}}||{{{}~yuqqsw}~zwtsqpnljhfda_\ZXWVUTTSRRQPONMLKKJJJJKLMNPRTWZ]`cfilnooomkiikov~|yvtssssrrrrrrrsssttuuttsqpopqsuxy{{{{|}~}|~~{zyyyz{{|||||{zzyxvutsrqpoonnnnnnnnmmlllmpruwxwusqqrtuutsrrsuwz}~}|{{zz{{||~}|{zzyywuspligeddcb`]ZVSQONMMMMMNOOQRSUWXZ\]]][ZXWWZ_elqtuutsrstvxz}}{zxvtrpnmkjhhgffffghjlnpsuxz|}~|zxvtrpnmkjjihhgfdca___`aa_]ZXWWZ\_accccccccdeeffgghhjkmprux{~~}|{zyxwvvutsqpnkigdcccefhhhhgffeedb`^\ZZ\`eiklkhfdcbcdfhkmpruwz|~}|zxwvtsrqqpppqqrstuwwxxxwutssuy|zvsolihggfda]ZXVUTTTUUUUTSRPOMLKKMNQRSTTTTUWY[^adgjmpsvy{}~|zyxxxxxyyyyyxxxwwwvvvuuttttssttuuvwy{}~{wspoqty}~zuqnmllmnpqstuvvwwvvvuutssrrqqpppppqqrstuvwyz{|||{yxxxz}~~~~~~~||~~zwsqomkjhgeca_][YWUSRPONMMLLLLLKKJJJJLOSW[_acdccbaabdiow}}zyxxxxxwwvvutsrqponmllkkkkllmnoqsuwy{~~~}|zywutrpomlkjjiihhgfdb`___acdeedcbbcdfghjklmmnooppqqrstwz}}{ywusqnljhfdb`^][ZYYXXYYZ[]^`abba_\YURQSW\bgjkjhedcdfilpuy}|yvtrqqpppoopppqqrtuvxy{||}|{ywutux}~}}||{zywtpmjhgggfda]ZWVTTSSSSSSSSSSSSTTUUVWXY[\]_`bdeghikmosw}~~~~~~~}|{zyxxwxxyzz{||||||{{zzyxwwvuuutttuuuvvwwwwvtqmjfdcdhlpstspnkjhhggggggikmpstuuutssstuvxy{|}~}{{{|~}{{|}{{zywtqnkjhgffdcb`^\ZXVTRPNMKJIHGFFFFGHIKMPSVY]adgjlnnnmllmpty}|{zzzzyxvtrponnopqqpomlkjjjkmoqsuwz|~}|{zz{{|}~}zxurpnmnnoonmkjihhijkmmnnmmmoqsuvvtsqonmmnnopqstvxz|}~}}|}}~~}}}~}}{xvspnlkihfedba_^\[YXWUUTTSSTTUVWXYZZYXVTQPPRV\bhlnnnnnoqtw{~~}{zyxwvutssrqpomljihhilnqtwxzz{||}}}||{{}~}|{zxwuspmkhfcba````_]ZWUSRSTUWY[]_`accdeeeeeedddddddegikorvz~}~}|{{{|}~~|zxvuuuvvvtspnljiiijklmnoqrrrrpnkhda__adhkmlkheb`_^_`acegjlnqsuxz|~}{zyxxwvvvvwwxz{}|yvtsuy~{xvtsttsqnje`\YWVVVWWWVTRPMKJIIIIJKLMNPRSUWZ\_adgjloqstttsqpooqu{}zxutsrrrrrqqqqppppppqqrsstuvwwwwwwwxz}}zwuvx|~{yxwwwwxxxyyyxxwvvutsrqponmlllllmmoprtvwyz{zywusssvy}~}|zzz|~{{yyvstttuuvwyz|~}{yxwy~~}}|{{ywwxz|}}|yslgcadhmnleZPJIMTZ]\VOHCABGMRX\`bccbcb`][ZZ\_ekpuwyyzz{}||{yxwvuutttsrpoljgedegmv}|wuw{}zxvsqomlkjjklmnpqrrpmiea][YXXXYZ\^aegijjigedb`_^]]^_behlptwz}~}~|zxwtrqommllmnoqrtuuutroliea^[ZYZ]`dhlnnkhd`][[]^``_]\ZYYZ\_bfilosvx{}~}|{{|~~||~~}}|}}~{wspnmosw{|ywutsqnkfa]XTQNKIGFFGJMPTX[]^]\XTQMKKLPTZ`dhloqsuvxyyzzyyyy{~|zxwwvvuuuttssrqqppoooooopqstuwy{}|xtpljijnrw|~{xtplhecaabcegjlnqsuvxyz{{|||}}}}~~~~~~}|zxuromlmoruxz}~{xusqpqqsuwz}|zxxyz|~zvrnkigedba`_]\[ZYXWVUTSRRQPPONNNMMNNOPQRSUVXZ\_behjmpty~}zwsolihgfghijklnopqrstuvvy}}{{{{{~~~}}}}}|~}zvrnjfcbbdgkptwxwtoic_\\^bfjnpqqpnlifc`^]]^_beimqvz~|xvuvy||wrmifffgiklmljgc^ZUQOMMNPSUW[]`abaa`__adinruvvtrqqsux{}}|zyy{~~|{{{{||||{zxwussstvxz|}}|{ywusqnllllnqtx}~ztnga\XWWZ^adeec_ZUPLJJMQUZ^abb`^[WURQPPQRSUX[^aejoty~~|zyxy{}~|yvrommmnpqstttssstuwz|~~|yvromlmosw|zunhb^ZY[^djptvvtrpnmmmoprtvxyz{{{||}}zxwvuvvxy|~}}}~{upmklpv}{xvuvxz{zxtpmjhgffeedba^\YURNKHFDCBBBDEHJMQTX\_cfilnopqpnljgffgkqw}}{xvsqppppqstuvwxxwvusqpnmllmnopponmmmmnprux{~|xusrqqpqqrsstuuvvwwxxxxxwwutrpnlkklmnpppomjgdbaacfjmprttuvvvvvvutssrrstvxz}}{xvtsssstuutsqoligeca^]ZXVTRPONNOQSVY\_bccca^[YWWY\_ceggffffhrv{{wsqpqsuxz||{xtokgdcdgkpty|~~}|zyxwwwwvutstv{~~xplmqx}~yrjc^ZYY\_cfhiihfca^\[ZZ[[]acegijlmnonnmljigfeefhlqx|{~|zz|~vqnptz|wsrsvy|}zvrpnlkjihgedcbaaaaa`_^\ZYZ[^chnsvwwusolifc`_^^`bfjouz~}}}}xtpnnorv{~}yvsrtw{~{yyz{}~~xrlgedefhjkkjjhgec`]YUPLIGEDDEEEEEEEEEFGILNQTWZ\^acegijklmnopruz|xtqolkjiijklnprtvxzz{{{zywvuttttuvwyz|}~~~~~~~~}}{ywusqnlkjiijlnpsvwyyxwurponmnpruwz|~~{xwuuvwyz||}}}}}}}}}|||||}}}~}ywvxz~|vpkheccdefhjkkkjhfc`\XTPMIFDBAABDGKNRUWYZ[\]^^^]]^`bglqvy{|{ywutsstuwz}~~}}|{{yxvtrpmkihfeeeefhjmprux{}~~}|zyxxxy|~}|{zyxwuspmiea]ZXWWWXXXXYY[]`cfilmoooomlkkkkmnpqrstuvxz|~}|{wvvuurmmmllfddcca^]]\\[YXVUROKHFEEFKQX`eilnnnnnnnnonoooooprtwy~~~volmsz{upoptz}xtsrqsuy|ysnjiikmoomljgc`]YVTQPONOPQTVY\^beghhhgec_[WSPOQU\enw}~zupoqw~zxwwwwwvvwxz|}~~}{xvsponnopsuwyz{{{zyxwvuuuvxzz{{{zwtqlhd`__aekqw{|yvroljiijmquy{|zvqmjijntz}|||}}}}}~|ywvwy|}{zzz|}~}~~wpid`^]]^__``_^][YWVTRRRQQRRSUVXZ\_adgikmnonmjfb]ZWWY\bhnswy{|~}yurpooqsvx{}}|zwtpkhecbcfjotz~{zy{}}zwusrstvx{~~zvqlhdb``abehkmoqrsuvwy{}}}{xuqnkgec`^]\[Z[[]_cfjnrw{~}{{}|ywwxz|~~|{yvspmjfc_\YWTRQPOOOPQRTVY[]_`a`_\YUQONNPTY^beghhhhhijknquz~}}~}zxwvvvuutsrppopprsuvwxyz|~~yuromkigda^[YYZ[]^_`__^]\\[ZYXWVVTSRQPPPOOPPQRSTUWY[^acgjnrvz~{xutssttttsssstvxy{|}~{wtqomkkjkkmnprtvxyz{zywurpopqtwyzzxuqnkhffffhjmorvy|}|zzyz{{}~}zxvtsrqppqruy~~{xvtsqpmjhfdccccbba_^\ZYXWVUTSSRQQPPPOOPPQRSUWY\^aceghhhgedccehlqv{}zwutsrqqqrrsstuvwwxxxwwvutssstvxz|}~~}|{ywutsrsuy~~~~}|{zyxwvvuuuuuuuuuuutssrqonlkigfeddddefhiklmlljjiijlnqtwz~}{zyyzzzzzywvtrponmlkjheb_\YVTRQQQQRSTUVVWWWVUTSTUX\bglpsttsrqpoppqsuwy|~|zxvtrpnmkjjjjklmoqsuvxy{{||{ywurpnmmosx}~|{yxwvvtsrpnljgedcccdcb`^[YWVWX[]`ceffffeedddeefggijlnpsux{~}{zyyxxxwwwwvvvvuuuuuuuuttrqpnmlkkklmnnnljgc_[WTSSTW[_cfghgfedddefhjlnprtvwyz{{||}}~~~||{zzzzz{{|}~~~}|zywwwy|{xusrqpnlifc_\YWUUTUUVVWWWWWVVUUUVWY[]^_`````aabdeghjklllmlmmosw}}|||}}}|{yxwvuuvvvwwwwwwwvuutsrqqqpqqrstvwy{}~zvrnlkloswz}~}{xurpnmmnoqrtvwxzz{{{{{zyyxwvvuuttuuuvwxxyzz{zyxwvutuvxyz{zzyxxxxy{~|xuromkigfdb`^\ZXWUTSRQPPPPQQQRRSSSSTTUWXZ\^___]\[[\_chmquwxyyyyz{}~|zxwvuttttuuvvvvvvvuutttttttuvvxyz|}~~~|{zyxwvutsrqpnljhfdbbbbdeeeedba`_^__`abdefhiklmnoopqsuwz~~||{{{{{|||||{zywvtrpnljhfdcba``_``abccdeedcb`]ZWUSSTVY\_bdeefffgghikmoruy|~}}}~}|zxwvuuuvwxyz|}~|zyxxz}}zwtqmkigfffedb_\YWUSRQQQQQQQQQQQQQQRRSTUWXZ\^acegikmopqrtuwxz|~~|zxvutsstttttttttttuuvwxyzz{{|||}}}}~~~~|zxurpmkklnqtwyzyxvtqomlkjiiiiiklnqsvxzz{{zzyyzz{|}~~|{{{}~ywusqswx{|unhb][ZYY[]]^^^__^][ZZWUSPMJGECBBDGLSZ`ehgd_[Z]cjpqplhgjqz}xtux~xspnnoqsvxyyxvtroljhfffgilosw{~}yvuvy~{xwzxpjggjotz~~{wrnieb__^^_abdeedca`_^^^_`bdfjnquwz|~~~~|{ywwvwy|~{yy|{wtpligecbbbbbcccccca```__^]\[ZYWVTROMLJJKOTY`gmswxywuspmljjkmorvz}~|{{{|~{wrnlklnquy|}}{xuqommnqtx|~xrke`\ZYYZ[]]]\[ZYYYZ[\^_acdefghijjkkkklllllllllmmnnnprux|}zwutrrrrrsstuvwxyz|}~~}{ywvtsrrqponljhfcba`adfilnopoonnnnnoppqqqponllkklmpsw{}{ywusrppoopqrtvx{~|ywvwx{~~{wrlgb\XURQQQRTVXZ[[[ZZYWVUUTTUUVWYZ\^acehjmoprstttttuvx{~}|zywusrpmljhgggghjmorvy||ywuuvwz|}~~~|{yxwvutsssrrrqqpoonnmlllkklllmnoqrtvxy{}~~|zxvtrqqppponmkjihhhhiklnpsuwyz{}}~~~~~~~~~~~~{xurpnljigedba_][ZXWUTTSTTVWXY[[\]]^^__``aaaaabcegjnrux{|}}||{{zz{{|}~~|zyxwvuutsrqpoonmllkkkkkllmoprtvxz}~}|{zyxwvutsrpnmlkjjjiihfdb`^\ZXVUTSSSSTUWXZ[\]^_abdfilorvz}}|{zyxxwvusrqponmlkkjjkklmnopqrrsstsssrqponmlkkkkklmmmlljjihhhhijlmoqrtuwxz{|~~}}|||{{{zzz{{{{|}}~~~~}}}~|ywuspnlifc`]ZXVTRQPONMLLKKKKJJJKKKKLMNOQTVY\^acefhijklmoprtw{}{yxwvvvuvvvvvvvvvvvvvvwwxxyyz{|}~~}|{zyxwvuttssrrrrssssttttuuuvvwwxyyz{{|||||{{zzz{|}~~~~~~~~~~~~}}~~}zxusqoljhfdb`][YWUSQPNMMLLKLLMOPRTUWY[]^_`aabcdegjmptwy{|}}}}}}~~}|{zxwutrqponnnnnnoopqrsuvwyz|}~}|{yxvutsrqppooonnmmlkjhggfffffeedcbba``___```aabbcdefhikmoqrtvxz|~~~}|{{zyyxwvutrqponmlkjjihhggggffffeeddcbbbbbdehjlnopqppppppqrsuwxz{|}~}|zxvutsrrrrrrssssssttuvwxyyz{{{{{||}~~}{yvtqoljiggfecba_]\[ZYXWWWVVVVVVVVVVVWWXXYZ[\^_acegjmorux{}~}|||||}}}}}|{{zyyxxxxxxyyzz{{||}}}}}|{{zxwvutttuvwxxyyxwvusrqqppppoooooonnnnnoopqrstuvvwwxxyyzz{||}}~~~~~~~~~~~~~~~~~}{ywtromkhgecba_^]\\[ZYYXXXXXXXYYZ[\]^_abcdfghhiijklnqsvz}~~}||{zzyxwvutsrrrrrstuvwxyzz{||}}~~~~~}}||{{{zzyxxwvvuttsrrqpoonmmmmmmmmmmmmllkkkllllllllllllmmnoopqrstuvwxyz{|}~~}{zyxwvutssqqyyxwvutssrrrrrrrrssrrrrrqpoooppqrsuwxyzyyyyyywvwxyywxyz|{z||~~}ywwz}yz~~zy|~|{yxwvuttssttuvwxyz{{zyvqnjfc```bfjnrtutrokgca`adhlquwxxvsolihghjmquz|}|{{{{|}}~~~~}|{{zz{{|}{wussuw{~zuplifffhjnqtwyzzywtqnjgdb``_^]]]]]^^__`abcdfgjlotwz|~~|zvspopsx~}|{zyz{}~}||}~}||||}}~}|{zxwvusrpnljihhhiknqtvwwurokfca`beinruvvtqnkhffgimptwz}~}|||}~|zyyz{}}zvtsrstvxz|}}|{zxuspnljhfedcbaaa`````````abcdefhikmortvy{}}|{yyyyy{|~}||}~}}}}~}{yxvtrqomkjhgffeefghikmoqrtuvvuusqomkihgfffghijkklmnopqrtuvxy{|~~~}~~}{zyxxwwwxxyz{|}}~~}}|{zyyxwvuutsssssttuvwxyyzz{{{||{{zyxwusrqpopprtvy}~}|{{zzyyyyyyyyxxxwwvvuutssrrqqqpppppqrrssttuuuvvvvvvvuutsrpnljgfdcccdefhjloqsuwyz|}~~}}|||||}~~|zxvusrqpomlkkjihhggggggggghhhiijkkmnopqrstuvwxz{|}~}{zyyyyyyyz{{|}~~}}}}}}||{yxvusqpomllkjjjjiiiiiiijjjkklmnopqrstuvwxyyzz{{|||||}}~~}|{{zyxwwvuttsrrqqppppppqqqrrsstuvvwxxyyyyzzzz{{|}}~~~}}|{zyxxwwvvwwxxyz{|}~~~}}}}}}}}|||||||||||}}~~~}|{zyxwwvvuuttssrrqqpppppqqrrsttuuvwwxxyyzzz{{{{|||}}}}}}||||||||||||}}~~~}|{zyxxwvuuttsssrrrrqqqqqqppppoonnmmlkkjjjjjkllmmnnnnnnmmmmmmmmnnooppqqrrsstttuvvwxyz{|}~~~}}}||||{{{zzyyyxxxyyyyyzzz{{{||||}}}~~~~~~~~~~~~}}}|||{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zzzzzyyyyyyyxxxwwvvuttsrrqqqqqqqqppoonmllkkkjjkkkklllmmnooppqqrrstuvvwxyz{|}~~~}|{zyyxwvvuttsrqqpoonnmmmmmmmmmmmnnnnooooopooooooooppqrsstuvvwwxxyyzz{||}}~~~~~~~~~}}}|||{{{{{{{{{{{{||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~}}}}}}}||||||{{{zzzzyyyyyyyxxxxwwwwvvvvvvuuuutttssssrrrrrqqqqppppooooonnnnnmmmmmnnooppqqqqqqqqqqqqqrrrsttuvvwxyzz{|}~~~}}}|||{{{{{zzzyyxxxxwwwwxxxxxxwwwwwwwwwwwwxxxyyzzz{{|||}}}}}}}}}}}~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}|||||||||||{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzyyzzz{{{|||||||||||||||}}}~~~~~~}}}||||{{zzzyyxxwwvuuuttsssrrrqqpppppppooopppppppppppppqqqrrrssssttttttttttttttuvvwxyyz{{||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||||}}}}}}}}}}}}}}}}}~~}}}}}}}}|||||{{{{{{{{zzzzyyxxxwwwwwvvvvuuuuuuutttttttuuuuuuuvvvvvvvvwwwwwxxyyzz{||}}}~~~~~~~}}}||{{{zzyyxxwwwwvvvvuuuuttttsssssssssssssssssssttttuuuvvvvwwwxxxyyzz{{|}}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}~~~~~~~~~}}}}|||||||||||||||||||||||{{{{{{{{zzzzzyyyxxwwwvvvvvvuuuuuutttttttttttttttuuuuuvvvwwwxxxyyyzzz{{{{|||||}}~~~~}}}||{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyzzyyyyyyyzzzzz{{{{{|||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||{{{zzzyyyyyyyyxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxyyyyyyzzzz{{{||}}~~~~~~~}}}}||||||}}}}}}~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||||||||{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}}~~~~~~~}}}|||{{{zzzzzzzzzzzyyyyxxxxwwwwwwwwwxxxxxxyyyyyyzzzzzzzz{{{{{{{|||||||}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||{{{{zzzzzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{{{{{{{{||||||}}}}}}~~~~~~~~~}}}}}}||||||||||{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}||||||{{{{{zzzzzz{{{{{{zzzzzzzzzzzzzzzzz{{{{{{{{||||||||||}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{~~~}{yxvttttuxz{}~|xvvw{zvvy~{wuwy}|zzzzzzz{|}~{xvuvx|}ywvwz}|xvuuvx{~}yvttuy~~xttx~|wttw||zxvuttttuuvvvvwvvvuuutttuvwxz}}zwuttvy|}ywutuwy|}{zyxxwwwwwwwwwwwxxyz{|~{xvuw{|xuvy}|ywuuvwy{}~|zywvvvwxz|~{xvvvwy|}zxvutttttuvwxz{|}~~}{{yywvuttttvwz}~zwutvy}|xvuuvx{~}zxvuttuvxz}~{ywvvvvwy{}}{ywvuvwz}~{xvvwy{}{zyxwwvvvvvvvvvvvvwwwxxyyz{}~}{ywvuuuvxz|~}|{yxxwvvvuvvvvvvvwwxxyz{|~~{xvuuvwz}|zxvuttuuvxy{|~~}|zyxwvuuuuuvwxy{}~|{yxwwwwwwxxyz{|}~~~~}|{zyxwvvvvvwxy{}}{ywwvwxz|~~|{yxwvvvvvwxyz|}}{ywvuuuvwxz}}|zxwvvvuuuuuuuvvvwwwwwwwwwwwvvvvvuuuuuvvvwxxy{|}~~}|{zyyxwwwvvvvvvvvvvvvvvvvwwwwwvvvvvwwwxxyz{}~}{zyxxwxxyz{|~}|{zyxwwvvvvvvwwxyz{|}~}{zyxwvuuuuvwxyz|~~}|{{zyyxxxwwwwwwwwwwwwwwwxxxyyzz{||}~~}}||{{zzzyyyyyyyyyyyyyyzzz{{||}}~~}|{zyxwwwwwwxxyz{|}}~~}}|{{zyyxxwwwvvvvwwwxxyyzz{||}}~~~}}|{zzyxwwvvvuuvvvwxyyz|}~~~~~}}}}}}}}}~~~~~}|{zyyxwwwwwwwwwxxxyyzz{{|||}}~~~~~~~~~~~~~}}}|||{{{zzyyyxxxwwwwwwwwwwxxxxxyyyyzzzz{{{{||||}}}}}}}}}}}|||||{{{zzzyyyxxwwwvvvvvvvvwwxxyyz{|}~~}}|{zzyyxxwwwwwwwwwwxxxxxyyyyyyyzzzzzzz{{{{{{{{{{{zzzzzzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyyyyyyyyyyyyyxxxxxwwwwwwwvvvwwwwwxxyyzz{{||}~~~~}}|{{zzzyyyxxxxxxxxwwxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwxxxxyyyyzz{{{||}}~~~~}}|||{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxwwwwwxxxxxxyyyyzzzz{{{|||}}~~~~~~}}}|||{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzzz{{{{||||}}}}~~~~~~}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzz{{{{{||||}}}~~~~~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~~}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~}}}}}}}|||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||{{{{{{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~yvuutuxz{|}~{zwutuvx{~|xvuuwy}|ywutuuvw{}~}zxvutux{yuux~yuuy{vttvz~~~~|ywutuwz~{wutuw{{xvutuwy|{xvuuvz~}xuuy~zvuuy}}{yxvvuuuuuuuuuuuuuuvxz{}|ywuuvx{~|ywuuvxz|~}{zyxyyyyxyyyzz{|~{xuuvy}|xuuwz~}zwvuuuvxy{|~}~~}|{yxwvuuuuvwy|~|zwuuuvwz}~|zyxvuuuuuvvwxyyzz{{{{{{zxxwvvuuuuvvxz|}zwuuwy}~zxvuuvxz}~{ywvuuuvxz|}zxwvuuvwxz{}~|zxvvuvwy{~~{xvuuwy|}|{zyxwwwvvvvvvvvwwxyyz{|}~~|zxwvuuuvxy{}~}|{{zzyyzzzzzz{{||}~|zxvuuvxz}~{yxvvuvvwxyz{|}~~}|{zxxwvvvvvwxyz|~}{zywwvvvvwwxyz{|}~~}|{zyxwvvvvwxz|~}zxwvvwxz|~~}}}||||}}}~~~|{yxwvvvwxyz|~~~}}}}||}}}}~~}{yxwwwxz|~|zyxwwwwxyyz||}~~zsponlmoprsu}~~}zxusrpppqtvz}yvuuwy|~yvsrqpqsvy|~|{zyyxxxxxz||xwz}vstyzwvw{}|{||||}~~}|}~zvtstvz~~|zz{|~yuqnmmptz{wuv{zvuvy}}{xusqpppqqstuwxyz{||}}}~~{xusrqrsvz~|ywuuuwxz|~}|zxvutttuwz}}zyz|zvssvy~~|{{{|}~}|{zyxwwvvvvvvwwyz|~|yvtttuwy|~}|{zxwvuttssstuvxz{}~~~~}|{ywvutuvwy|~{xvuux{~zwutstuwy{}~{ywtrqpppqsux{~}zxvusssstuvxy{}~}|{{{|~}zwuuuwy|~|{yxvutsrqqppqqsuvxz|~}{ywvuuuvwy{~}{ywutstuuwxz|~~|zxvutttvx{~~{yvtsrqqqrrsuvxyz{}}{ywutrqqpppqrtuwz|~}{ywutsrqqqqrrsuvxz|~}{yxwvvvvvwxxyz{|}|zwvvvvxz|}|{{zzzz{{|~}{yxwvvvwwyz|~~|{zzz{|}~}{zxwvuuvwx{}~|ywvtssrrssuwy{}|wurpnkjiihinnopqx||~|xtrpmlllmorux{~}{yxxxz||yvspnmmnoprtvx{|wspnmmptz~}~}wrpqty~~{vtrqqruy}~~|yvtttvy}~~~{zy{}|vpkikov}~zvtux}~zwtqomlkjjiiiijklmoqtvy|{vromllmpsw{~~|zyxxyz|~|zxvwwvuuvvwxz{}~~|zxxy||{}{wtsrstvxz}~{wurponnoprux|}}}~~~}|||||}}}~~~~~~}|zxwvtsrqpppqrtuxz}zupmkkmquz~~|yxwwy{}~~~}zwtrqppprsvxz}~|{zyxxxxxyyz{|}}~}zwtrqqrtvz~~|zzz|~~~~~~~~~}||{zyxwwwwwxz{}~}||||}~~}{zyxwvutssttvwz||xtqommnprvy}~|{yyxxxxxxxxxxyyyyyyyzz{{|}~~~}{zyxwvutttuvwxz|}~|{yxwvuttsssttuvwxyz{}~|ywusqqqrsvy|}{yyyy{|~~}||{{||}~~}||{zzz{|}|xusqpopqsvy|~}{zyxxxwwwwwwwwwwxxxxyyzz{{|}~~~}}|{zyxwwvvvwwxy{|}~}zyxwwqpppqqprstuy~~{xxxusqquuvwy{~~zwuttux|~}|{{{||}}}~~~|}}|{zz{|zvvzysrv}}}}|||||}~~{xvvvwyz|}}|zxvutuwz~{wrpnmnpruwy||xtqnmmpuz{xwz{urqsvz~}{xusrqpppqrstuvvwxxyyyyyyyxxxxyz{|~|xvutuwy}~}|{zyyxxxxyyz|~|yxy|{wtstx~~~~~}||||zz{{|}~~}{ywutttuvx{~|zwusqpoooopqrstuvwxyyyyzzzzyxwvutsrqqqrsux{~{ywwx{~}yuqonoprtwy|~~{yxwwwwxy{|}{yxxxxyz|}~}|{{|}}zwutuwy}~|{yxwvuttssssttuwxz||zxvtssstuvwy{}~~|{zxwwuuvuuuuuvvvwwxyyz{{|}~}{ywvvvwy{~|yusponmmnoqrsuwxz|}}{ywusrppooprtvy{~~}}|{{{{{{{{||}~~~~}||{{zzzyyzz{{|}~|zxvvvvxy|~|ywutsrrstuvwxyz{|}~~}|zywvuuuuvwxz|~}{ywutsrqqqqqqrsstuvvwxxyyyyyxwwutsrqppoppqsuwz}~}}||{{{{{zzzzzzzyyyxxxwwwwwwxxxyz{|~}|zyxwwwxxz{}~}{ywusrrrrsstuvwxyzzz{{{{|||}}}~~|{zxwvutttttuuwxy{|~~}{{zyxxwwwwwxxxxyyyyzzzzyyxxwwvuuuuvwxy{}~~~}}}||||||||||}~~~}|{zyyxxyyyz{|}}~~|zxvutrrrrrstuvwwxyyyyyyyyyyyyyyyzz{{|||}}}~~~~~~~}|{zyxwvuttssssstuvvxyz{}~~~~~~}}||{{{{||}}||{zzzzyzzz{{||}}~~~|zywvutsssstuuvwxyyyzzzzyyyyyyyyyzzzz{{{||||}}}}~~~~~~~~~~}}||{zyyxwvvvuuuuuvvwxyz{|}~~~}}}|||||}~~}}|{{{zzz{{{||}}~~~~}{zxwvvuuuuuvwwxyyzzzzzzzzzzzzzzzzzz{{{{||||}}}}}~~~~~~~~~~~~}}}|{{zzyxxwwvvvvvwwxxyz{|}~~~}}}}|}}}~~}}||{{{{{{|||}}~~~~}|{zyxwvvvvvwxxyzz{{{{{{{{{{{zzz{{{{{|||||}}}}}~~~~~~~~~~~~~~~}}}||{zzyyxxxxwwxxxyyz{{|}~~~~}}}}}}~~~}}|||||||||}}}~~~~}|{zyxxxwwxxxyyzz{{{||||{{{{{{{{{{{{|||||}}}}}}}~~~~~~~~~~~~~}}}|||{{zzyyyyyyyyyzz{{||}~~~~~~~~~~~~}}}|||||}}}}~~~~}||{zzyyyyyyyzz{{{|||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~~~~~}}}||{{{zzzzyyzzzz{{{|}}~~~~~~~~~~~~}}}}}}}}}}}~~~~~}||{zzzzyzzzz{{||||}}}}}}||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~}}}}|||{{{{zzzz{{{{|||}}~~~~~~~~~~}}}}}}}}~~~~~~~}||{{{zzzz{{{||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{{{{{|||}}~~~~~~~~~~}}}}}~~~~~~~}}|||{{{{{{{|||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||||||||}}}~~~~~~~~~~~~~~~~~~}}}||||||||||}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||}}}}~~~~~~~~~~~~~~~~~~~}}}|||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{{zzyyyyyyxxyyyyzz{{|}}~~}||{{zyyxxxxxxxxxxxxxxyyyyyyzzzz{|}~|}}{}~~}}||{zzzyyyyxxxxyyyzzz{{|}~~~~~~~~~~~~~|zy|~{zyyyzz{{||}}~~~~~~~~}}}|||{{zzzyyyxxxxxwwwwwwwwwxxxxyyyzz{{||}~~}|zyxyz}}{zyyxxxxxxxxxxxxyyyyyyyyyyyyzzzzzzzzzzzzzzzz{{{{||||}}}}~~~~~|zyxxwxy{~~|{zyxxxxxxxyyyzzzz{{zzzzyxxxwwwwwwwwxxxyyzzz{{{|||||||||||}}}}~~~}|zyxxxxyz|~~}|{zzyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{||}}}~~}|{zzyz{|~}||{zyyxxxxxxxwwwwwwwwwwwwwwxxxxxxxxxyyyyyzzzzz{{{|||}}~~~~}|{zz{|}~}}||{{{zzzzzzzyyyyyyyyyyyyxxxxxxxxxxxyyyyzzz{{||}}~~~}{zyxwwxy{|}|{zzzyyyyzzzzzzzzzzzyyxxxwwwwwwwxxxyyzz{{{|||||||||}}}}}}}}~~~~}|{zyxxxxxyz|}~}||{zzzyyyyxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyzzzz{{{{|||}}~~~~}|{zzyzz{|}~~}|{{zzyyyxxxxxxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{||||}}}~~~~}|{{{{{|}~~}}||{{{zzzzyyyyyyyyyyxxxxxxxxyyyyyyzzz{{{||}}~~~}{zyxxwxxyz|~~}}|{{{{{{{{{{{{{{zzzyyyxxxxxxxxxyyyzz{{{|||}}}}}}}}}}}}~~~~~~~~}|{zyyxxxxxyz{|~~}}||{{zzzyyyyyyyyyxyyyyyyyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~}|{{zzzzz{{}~~}}||{{zzzyyyyyyyxxxxxxxyyyyyyyyzzzzz{{{{||||}}}~~~~~}||{{{z{{|}~~~}}|||{{{zzzzzzyyyyyyyyyyyyyyyzzzz{{{|||}}~~~}|{zyxxxxxyz{}~~~}}}}||||||||||{{{zzzyyyyyyyyyzzz{{|||}}}}~~~~~~~~~~~~~~~~~~}}|{zzyxxxxxxyz{|}~~}}||{{{{zzzzzzyyyyyyyyyyyyyyyzzzzzzzz{{{{{|||||}}}~~~~~}}|{{zzzzzz{{|}~~}}|||{{{zzzzzzyyyyyyyyzzzzzzzz{{{{{|||||}}}}~~~~}}||{{{z{{{|}}~~~}}}|||{{{{zzzzzzzzzzzzzzzz{{{{||||}}~~~~~}|{zzyxxxxxyz{|~~~~~~~~~~}}}|||{{zzzzzzzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~}}|{{zyyyxxxxxyyz{|}~~~}}||||{{{{{{zzzzzzzzzzzzzzz{{{{{{{{||||||}}}}~~~~~~~}||{{zzzzzzz{{|}~~~~}}||||{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~}}||{{{zzz{{||}~~~}}}||||{{{{{{{{{{{{{{{|||||}}}~~~~~~~}}|{{zyyxxxxxyz{|}~~~~}}|||{{{{{{{{{{|||}}}~~~~~~}}|{{zzyyyxxxxyyyz{{|}~~~~}}}||||||||{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~}}||{{zzzzzzzz{{|}~~~~~}}}}||||||||||||||||||||}}}}}}}~~~~~~~~~}}||{{{{zzz{{{||}~~~~}}}}|||||||||||||||}}}}}~~~~~~~~~~~~}}}}||{{zzyyyxxxyyzz{|~~~}}}|||||||||}}}~~~~~~}}||{{zzyyyyyyyyyzz{||}~~~~~}}}}}}}|||||||||||||||}}}}}}}}}~~~~~~~~~~}}||{{{zzzzzzzzz{{|}}~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}||{{{{zzzzzz{{{|}}~~~~~~}}}}}}}}}}}}~~~~~~~~~}}}}}}}}|||||{{{zzyyyyxxyyzz{|}~~~~}}}}}}}}}}}~~~~~~}}||{{{zzzyyyyyyyyyzz{{|}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}|||{{{zzzzzzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzzzzz{{{||}~~~~~~~~~~~~~~~}}}|||||||||||{{{{zzzyyyyyyyyzz{|}~~~~~~}}}~~~~~~~~}}}|||{{{zzzzyyyyyyzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{zzzzzzzzz{{{||}}~~~~~~~~~~~~~~~~~~~}}}}||||{{{{zzzzzzzzz{{{||}}~~~~~~}}||||{{{{{{{{{{{{{{zzzzyyyyyyyzz{{|}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzzzzzzzzzzz{{{||}~~~~~~}}}}||||{{{{zzzzzzzzzzz{{{||}}~~~~~~~}}}}||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}||{{{{{zzzzz{{{{{{zzzzzzyyyyyyzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||{{{{zzzzzzzzzzzzz{{{||}}~~~~~~~~}}}}|||||{{{{zzzzzzzzzzz{{{{||}}~~~~~~~~~}}}}}||||{{{{{zzzzzzzzyzzzzzzz{{|||}}~~~~~~~~~~~~~~~}}|||{{{zzzzzzzzzzzzzzzzzzzzzyyyyzzzz{||}~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}||||||{{{{{{zzzzzzzzzzz{{{{||}}}~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzz{{{{||}}}~~~~~~~~~~}}}}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{|||}}~~~~~~~~~~~~~~~~~~~}}|||{{zzzzzzyzzzzzzzzzzzzzzzzzzzzzzzz{{|}}~~~~~~}}}}}}}}}}}}}}}||||||||||||||{{{{{{{{zzzzzzzzzzz{{{{|||}}~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzyyyyyyyyzzzzz{{{|||}}~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzzzyyyyyyyzzzzzzzzzzzzzzzzzzzzz{{||}~~~~~}}}}}}}}|||||||||||||||||{{{{{{{{{{zzzzzzzzzzzz{{{{{|||}}}~~~~~~~~~~~}}}}}}}||||||{{{{{{zzzzzzzzzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{zzzzzzzyyyyyyyyyyyyyzzzz{{{|||}}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzzyyyyyyyyyyzzzzzzzzzzzzzzzzzzz{{||}}~~~~~}}}}}||||||||{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{||||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{zzzzzzzzzzzzzz{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||{{{zzzyyyyyyyyyyyyzzzzzzzzzzzzzzzzz{{{{||}~~~~~~}}}}||||||{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{|||}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{zzzzzzzzzzzzzzz{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{zzzyyyyyyyyyyyyyzzzzzzzzzzzzzzzzz{{{{||}}~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~~}}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzz{{{{{||||}}~~~~~~~~~~~}}}}}}}}|||||{{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyyyyyyyyyyyzzzzzzzzzzzzzzzzz{{{{||}}~~~~~}}}}|||{{{{{{zzzzzzzzzzyyyyyyyyyyyzzzzzzzzz{{{{{||||}}}~~~~~~~~~~}}}}}}|||||||{{{{{{{{zzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||{{{zzzyyyyyxxxyyyyyyzzzzzzzzzzzzzzz{{{{{|||}}~~~~}}}}|||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{|||}}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzyyyyyyyyyyxxxxxxyyyyyyyyyzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyyyyxxxyyyyyyyzzzzzzzz{{z{{{{{{{{{||}}~~~~~}}}}|||{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzzz{{{{|||}}}~~~~~~~~~~}}}}}}|||||||{{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~~~~}}}}}}||||||{{{{{zzzzzzzyyyyyyyyyxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~~~~~~~~~~~~~~}}}}}|||{{{zzzyyyyyxxxxxyyyyyyzzzzzzzz{{{{{{{{{{{{|||}}~~~~~}}}}|||{{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{||||}}}~~~~~~~~}}}}}}||||||{{{{{{zzzzzzzyyyyyyyyyxxxxxxxxxxxyyyyyyyzzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~~}}}}}|||{{{zzzyyyyyxxxxxxyyyyyzzzzzzz{{{{{{{{{{{{{|||}}~~~~~~}}}|||{{{{{zzzzyyyyyyyxxxxxxxxxxyyyyyyyzzzzz{{{{|||}}}~~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}}}|||||{{{{{{zzzzzzyyyyyyyyyxxxxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~~~~~~~~~~~}}}}}|||{{{zzzyyyyyxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{{|||}}~~~~~~}}}|||{{{{zzzzyyyyyyyxxxxxxxxxxyyyyyyyyzzzz{{{{|||}}}~~~~~~~~~}}}}}|||||||{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzyyyyyyyyxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{|||}}}~~~~~~~~~~~~~~}}}}||||{{{zzzyyyyyxxxxxxyyyyyyzzzzzz{{{{{{{{{{{{{{|||}}~~~~~}}}}|||{{{{zzzzyyyyyyxxxxxxxxxxxxxyyyyyyzzzz{{{{|||}}}~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzyyyyyyyyxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{||||}}~~~~~~~~~~~~~}}}}}|||{{{{zzzyyyyyyyyyyyyyyyyzzzzzzz{{{{{{{{{{{{||||}}}~~~~~~}}}||||{{{{{zzzzzyyyyyyyyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{zzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{|||||}}}~~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{{{{|||||||}}}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||}}}}~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{|||||}}}}}~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~}}}}}}}}||||||||||||{{{{{{{{{{{{{{{|||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~~}}}}}}}||||||||||{{{{{{{{{{{{{|||||||||||||}}}}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||{{{{{{{{{||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}|||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}|||||||||||||}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zyxtqqommmlllllllllllmmmmnnpqqrstuvwxy{|~}|{yxwvuttssrrrssssssssssssssrrrrrstuwz~toppx~~|{yxwutsrrrqqqqrrstuvxy{|~~~}|{||{{{{z{{{{|}}zrrzztppqruvwy{|~~~}}|{{zyxwvusrqqponnmmmllllmmnnopqrtuvxy{}~{vsru|{wtrqppoppqrrrssssrrrrrrqqqpppponnnnnnnnnnnoopqrsttuwxyz{|}~~}yuqommosx~|xusqoonnoppqrsstttssrqqponnmmmmmnnoppqrsstuuvvvwwwwxxyyzz{|}~|yurommmosx}}zwusrpponnnnnnnnnnnnnnnnnnnnnmmmmmmmmnnnnoooppqrrstuvwxyz{|}~~{xurqpqtx|~{xusrpoonnmmmmmmmnnnnnnnnnnnooooopppqqqrrsstuvvwxyz{|}~|yvtrrrtw|~|zxwvutssrrrqqqqppppoooonnnnnnnnnnnooopqqrstuvxyz{|~}yuromllnpuz}ywtsqqppqqqrrssssrrqqpoonnmmmnnoopqrstuuvwwxxxyyyyzzz{{|}}~}zwtromlllnquy~~|ywutrqppoonnnnnnmmmmmmmmmnnnnnnnnnooooppqqrrsttuvwxyyz{|}~}zwusqppqsvy}|ywusrqponnnmmmmmmmmmnnnnnnooopppqqrrssttuvvwxyzz{|}~|ywusrrrtvz~}{zxwutssrqqpppooonnnnnnnmnnnnnnoopqqrstuvwxyz{|}~}zwtqnmllmpsw|~{ywutssssssssssssrqqpoonnnmmnnoopqrstuvwwxyyzzz{{{{|||}}~~|zwuspomllmnptw{~{ywvtsrqppoonnnnmmmmmmmmmmnnnnnnooopppqqrrstuuvwxxyz{|}}~}{xvtrqqqrsux|~|zxvutrqqpooonnnnnnnnnnoooopppqqqrrsstuuvvwxyzz{|}~~|zxvtssrstvy|~}{yxwvutssrqqpppoooonnnnnnoooppqqrsstuvwxyz{|}~~{yvsqonmmnpsvz~~|zyxwwwwvvvvvuttsrqqpooooooopqqrstuvwwxyyzzz{{{{{{|||}}~~~|zxvtrponmmnoqtvz}~}{yxwutssrqqqpppooooooooooooppppqqqrrssttuuvwwxyyz{||}~}{ywutrrqqrtux{~}|zywvutttsrrqqqqqqqqqqqqqrrrrssttuuvvwwxyyz{{|}~~~|zxwutssstuvy|}|{yxwvuutssrrqqqqqqqqqqqqrrsstuuvwxxyz{|}}~}{ywusqonnnnprux|~}||{{{zzzyyxwwvutssrrqqqrrrstuvwwxyzz{{||||||||}}}}}~~~|{ywutrqonnmmnoqsux{~~}{zyxwvvutttsssrrrrrrrrrrrrssssttuuuvvwwxxyyzz{{|}}~}{zxwutsrqqqrsuwz|}|{zyxxwvvuuutttttttttttuuuuvvwwwxxyyzz{{|}}~~}|zywvutsrrrstvxz}~|{zyxwvvuutttttttttttuuvvwwxyyz{{|}}~~~}|{zxwusqponmmnoqsvy}~~~}}||{zyxwwvuutttttuuvwwxyz{{|}}~~~~~~~~~~~~~~}{zxwutrqponmmnnoprtwy|~}|{zyxxwwvvuuuuuuutuuuuuuvvvvvwwwxxyyyzz{{||}}~~~}{zywvusrqqqqqrstvxz}~}|{zyyxxwwwwvvvvvvwwwwwwxxxyyyzz{{||}}~~~}|zyxwutssrrrrstuwy{}~}|{{zyxxwwwvvvvvvvvwwwxxyyzz{||}}~~}}}||{{zzyxvutrqponnmnopruwz~~}|{zzyxwwvvvvvwwxyyz{||}}~~~}|{yxvutrqponnnmnnoprsvxz}~}}|{zzyyxxxwwwwwwvwwwwwwwxxxxxyyyzzz{{|||}}~~~}|{zxwvutsrqqqqqrstvwy{~~}}|{{zzyyyyxxxxxxxxxxyyyyzzz{{{||}}}~~~}|{zyxvuttsrrrrrstuvxz|~~~}|{{zzyyyxxxxxyyyyzzz{{||}}~~~}}|{{{zzzyyxwwvutrqpponnooqrtwy|~}|{zzyxxxxxxxyzz{{|}}~~~}|{zywvutsrqppooooppqstvxz|~~}}|{{zzzyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~}|{zyxwvutssrrqqrrsstvwy{}~~}|||{{{zzzzzzzzzzzz{{{{{|||}}}~~~~}|{zyxwvvutssrrrrsstuvxy{}~}}||{{{{{{{{{{{{|||}}~~~~~~}|{zzyxxxwwwwvvuutssrqppooopqrtvx{~~}||{zzzzzzz{{||}~~~~~~~~~~}|{zyxxwvutsrqqpppppqqrsuvxz|~~~}}}||||{{{{{{{{{{{{{{{|||||}}}}~~~~~~}||{zyxwwvutssrrrqqrrsstvwxz|~~~~}}}}|||||||||||||}}}}}~~~~~~~}}|{zzyxwvvutssrrrqrrrsstvwxz|}~~~~~~~~~~~~~~~~~~~~~~~}|{zyyxwwvvvuuuuutttssrqqppooppqrsuwy|~~}}||||||}}~~~~~~~~~~~~~~~~~~~}||{zyxxwvutssrqqppppppqqrstvwyz|~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{zzyxwwvuttsrrrqqqqqrrstuvxy{|~~~~~~~~~}~~~~~~~~~~~~~~}}|{{zzyxwwvuttsrrqqqqqqqqrstuvwxz|}~~~~}}}}}~~~~~}|{zyxwvuuutttttsssssrrrqqpppoppqqstvxz|~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}|||{{zyyxwwvuutssrqqqpppqqqrstuvwxz|}~~~~~~~~~~~~~~~~~}}||{{zzyxxwvvuttssrrqqqqqqrrstuvwxz{}~~~~}}||{{zzyxxwvvuttssrrqqqqqqqrrsttvwxy{|~~~~}}}}}}}}~~~~~~}|{zyxwvuttsssssssrssrrrrrqqpppppqrrtuwy{}~~~}}}}}|||||||||||||||{{{{{{zzzyyxxwwvuuttssrrrqqqqrrrsttuvxyz|}~~~~}}}||{{zzyyxwwvvuutsssrrrqqqrrrsstuvwxy{|~~~~~}}}}||{{{zzyyxxwvvuttssrrrqqqqqqqqqrsstuvwxz{}~~~}}}}}||}}}}}}~~~~~~}|{zzyxwvutssrrrrrrrrrrrrrrrrqqqqqqqrstuvxz|~~~}}}|||{{{{{{{zzzzzzzzzzzyyyyxxwwwvvuuttsssrrrrrrrrrsstuuvwyz{|~~~~~~~}}}}|||{{{zzyyxxwwvvuuttsssrrrrrrrrrrsstuvwxyz|}~~~~~~~~~}}}}||||{{zzzyyxxwwvvuuttssrrqqqqqqqqqqrrsstuvwxy{|}~~}}}}||||||||}}}}~~~~~~~}}||{zyxwvuutsrrqqqqqqqqrrrrrrrrqqqqqqqrssuvwy{}~~}}||{{{zzzyyyyyxxxxxxxwwwwwvvvuuutttsssrrrrrrrrrrssttuvwxyz{|~~~~~~~}}}}}|||{{{zzzyyxxwwvvuutttssrrrrqqqqqrrrsstuvwxyz{|}~~~~~~~~}}}}}||||{{{zzzyyyxxwwvvuuttssrrrqqqpppppppppqqrrstuvwxyz|}~~~}}}|||||||||||}}}}}}}|||{zyxxwvutsrrqqpppppppqqqqrrrrrrqqqqrrrstuvxz{}~}}||{{zzzyyyxxxxwwwwwwvvvvvuuuutttssssrrrrrrrrrrrssstuuvwxyz|}~~~~~~}}}}|||{{{zzzyyxxxwwvvuutttssrrrrqqqqqqrrrsstuuvwxyz{}~~~~~~~}}}}}||||{{{zzzyyyxxwwvvvuuttssrrqqqppppoooooppppqqrsstuvwxyz|}~~~}}}|||||||||||}}}}}|||{{zzyxwvutssrqqpppppppppqqqqrrrrrrrrrrrrstuvwyz|~~~}||{{zzyyxxxwwwvvvvuuuuuttttsssssrrrrrrrrrrrrrsssttuvwwxyz{}~~~~~~}}}}|||{{{zzzyyyxxwwwvvuuuttsssrrrrrqqqqrrrssstuuvwxyz{|}~~~~~~}}}}||||{{{{zzzyyxxxwwvvvuuttsssrrqqqppppppooppppqqqrsstuvwxyz{|}~~~}}||||||||||||||||||{{zzyyxwvutsrrqppppppppppqqqrrrrrrrrrrrrsstuvwxz{}~~}||{{zyyxxwwvvvuuuttttsssssrrrrrrqqqqqqqqrrrrssttuuvwxxyz{}~~~~~}}}}|||{{{zzzyyyxxwwwvvuuuttsssrrrrrrqqqrrrrssttuuvwxyz{|}~~~~~}}}}|||{{{{zzzyyyxxwwwvvuuuttsssrrqqqppppoooooooopppqqrrsttuvwxyz{|}~~~}}||||||||||||||||{{{zzyyxwvuttsrqqppoooooopppqqqrrrrrrrrrrssstuuvxyz|}~~}||{zzyyxwwvvuuutttsssssrrrrrqqqqqqqqqqqqqrrrssstuuvwwxyz{|}~~~~}}}}|||{{{zzyyyxxxwwvvvuutttsssrrrrrqqqqqrrrrssstuuvwwxyz{|}~~~~~}}}|||{{{zzzyyyxxwwwvvuuuttssrrrqqqpppooooooooooooopppqrrsttuvwxyz{|}~~~}}}}||||||||||||{{{{zzyyxwwvutsrrqppoooooooopppqqqrrrrrrrsssssttuvwxy{|~~~}||{zzyxxwwvuutttssrrrrqqqqqqpppppppppqqqqqrrssttuvvwxyz{|}~~~~}}}|||{{zzzyyxxxwwvvvuutttsssrrrrrqqqqqqqrrrrssttuvvwxyzz{|}~~~~~}}|||{{{zzyyyxxwwwvvuuuttsssrrqqqppppooooooooooooopppqqrsstuvwxyy{{}~~~}}||||||{|{{{{{{{{zzyyxwwvutssrqppooonnoooopppqqrrrrrsssssssttuuvwxz{}~~}}|{zzyxxwvvuutsssrrqqqpppppppooooppppppqqqrrsstuuvwxxyz{|}~~~}}}|||{{zzzyyxxwwwvvuuutttsssrrrrrqqqqqqqrrrrssttuuvwwxyz{|}~~~}}}|||{{zzzyyxxxwwvvuuuttsssrrqqqpppooooonnnnnnnooooppqqrrsttuvwxyz{|}~~~}}}}|||||||||{{{{zzzyxxwvvutsrrqppooooooooopppqqrrrrrsssssssttuuvwxyz|}~}}|{{zyxxwvvuutssrrrqqqpppppooooooopppppqqqrrssttuvvwxyz{|}~~~}}}||{{{zzyyyxxwwwvvuuutttsssrrrrrqqqqqqrrrrrssttuuvwwxyzz{|}~~~}}}||{{zzzyyxxwwwvvuutttssrrrqqqpppooooonnnnnnnnooooppqqrsstuvvwxyz{|}~~~~}}}}|||||||{{{{zzyyxxwvuttsrqqppooonnoooopppqqqrrrssssssstttuuvwxyz{|~~}}|{{zyxxwvvuttssrrqqpppoooooooooooooopppqqrrsstuuvwxxyz{|}~~~~}}||{{{zzyyxxxwwvvvuutttsssrrrrrqqqqqqqqrrrrssttuuvvwxxyz{|}}~~~}}|||{{zzyyxxxwwvvuutttssrrqqqpppooooonnnnnnnnnnnoooppqqrrsttuvwxyzz{|}~~~}}}}||||||{{{{{zzyyxxwvuutsrrqppooonnnnooooppqqrrrsssssssttttuvvwxyz|}~~~}||{zyyxwvvuttssrrqqpppoooooonooooooopppqqqrrsttuvvwxyz{{|}~~~}}}||{{zzyyxxwwwvvuuuttssssrrrrqqqqqqqqqqrrrsssttuuvwwxyzz{|}~~~}}||{{zzyyxxwwvvvuuttssrrrqqpppoooonnnnnnnnnnnnnnoooppqqrsstuuvwxyz{|}~~~~}}}}||||||{{{zzyyxxwvuutsrqqppoonnnnnnoooppqqqrrrssssssstttuuvwwxy{|}~}}|{{zyyxwvvuttsrrqqpppooonnnnnnnnnnooooppqqrrsttuvvwxyz{|}}~~~}}||{{zzyyxxxwwvvuuuttssssrrrrqqqqqqqqqqrrrrssttuuvvwxxyz{{|}~~~}}||{{zzyyxxwwvvuuttsssrrqqqpppooonnnnnnnnnnnnnnoooppqqrrsttuvwxxyz{|}~~~~}}}}}}||||{{zzyyxxwvuutsrrqppooonnnnooooppqqqrrrssssssstttuuvvwxyz{|~~~}}|{{zyyxwvvuttsrrqqppooonnnnnnnnnnnnoooppqqrrsttuvwwxyz{|}~~}}||{{zzyyyxxwwvvuuuttssssrrrrrqqqqqqqqqrrrrsssttuuvwwxyyz{|}}~~~}}||{{zzyyxxwwvvuuttssrrrqqpppoooonnnnnnnnnnnnnnooopppqrrsstuvvwxyz{||}~~~~~}}}}||||{{zzzyxxwvvutssrqppooonnnnnooopppqqrrrssssstttttuuuvwwxyz|}~~}}||{zzyxwwvuutssrqqpppooonnnnnnnnnnnooopppqqrsstuuvwxyyz{|}~~~}}||{{zzyyxxwwvvuuutttsssrrrrrqqqqqqqqrrrrrsssttuuvvwxxyz{{|}~~~}}||{{zzyyxxwwvvuutttssrrrqqqpppopooooooooooooppppqqrrssttuvvwxxyz{|}~~~~~}}}|||{{{zzyyxwwvvuttssrrqqqppppppppqqqrrrsssstttttuuuvvvwxxyz{|}~~~}}||{{zzyxxwwvvuuttsssrrrqqqqppppppppqqqqrrrssttuuvvwxxyz{{|}~~~}}||{{zzyyyxxwwwvvuuuttttssssssssrrrssssssttttuuvvwwxxyzz{{|}}~~~~}}||{{zzyyyxxwwvvvuuutttssssrrrrrrqqqqqqqrrrrrssstttuuvvwwxyyz{{|}~~~~~}}}|||{{{zzyyxxwwvvuuuttssssrrrrrrrrssssstttuuuuvvvvwwwxxyyz{{|}}~~~}}}||{{zzzyyxxwwvvvuuutttssssssrrrrrrsssssstttuuvvwwxxyyz{{|}}~~~}}}||{{zzzyyxxxwwwvvvvuuuuttttttttttttttuuuuuvvvwwwxxyyzz{{|}}~~~~}}}||{{{zzyyyxxxwwwvvvuuuuttttttssssssssstttttuuuuvvwwwxxyzz{{||}~~~~~}}}|||{{zzzyyxxxwwwvvvuuuuttttttttttuuuuuuvvvvvwwwxxxyyyzz{||}}~~~}}}|||{{zzzyyxxxwwwvvvvuuuuutttttttttttuuuuuvvvwwwxxyyzz{{||}~~~~~}}}||{{{zzzyyyyxxxwwwwvvvvvvvuuuuuuuuuvvvvvvwwwxxxyyyzz{{||}}~~~~}}}|||{{zzzyyyyxxxwwwwvvvvvuuuuuuuuuuuuuuvvvvvwwwxxxyyyzz{{||}}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvvvvvvvvvvvvvvwwwwwxxxxyyyzz{{{||}}~~~~~}}}|||{{{zzzyyyyxxxwwwwwvvvvvvvvvvvvvvvvvwwwwxxxxyyyzz{{|||}}~~~~~}}}|||{{{zzzzyyyyxxxxxwwwwwwwwwvvvvwwwwwwwwxxxxyyyzzz{{{||}}~~~~~}}}|||{{{zzzzyyyyxxxxxwwwwwwwwwwwwwwwwwwwwwxxxxxyyyzzz{{|||}}~~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwwwwwwwwwwwwwxxxxxxyyyyzzz{{{||}}}~~~~~}}}}|||{{{{zzzzyyyyxxxxxxxwwwwwwwwwwwwwxxxxxxyyyyzzz{{{||}}}~~~~~}}}}|||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{|||}}~~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~~~}}}}|||{{{{zzzzzyyyyyxxxxxxxxxxxxxxxxxyyyyyyzzzzz{{{{|||}}~~~~~~~}}}}||||{{{{zzzzzyyyyyyyxxxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~~}}}}||||{{{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~~}}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~}}}}}||||{{{{{{zzzzzzzyyyyyyyyyyyyyyyzzzzzzz{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{zzzzzzzzzzyyyyyyyyzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}~~~~~~~~}}}}}||||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{|||||}}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{{{zzzzzzzzzz{{{{{{{{{{|||||}}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{zzz{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~}}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~}}}}}}}||||||||||{{{{{{{{{{{{{{{{{||||||||||}}}}}}~~~~~~~~~~~}}}}}}}}||||||||||{{{{{{{{{{{{{{{||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}||||||||||||||{{{{{{{||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}||||||||||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}|||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~trnihghkjjopnpspoqolllifeda`_]\[[[[\^`beiosx}~xrnkgfda`^]\[[[[[[\\\\]]^^`afls|fkq}yvrmjgdb`_^]]^_acfilptx|~{yvtrpnmllmllkllmopsvz~~i`qpdachouz~}|xusqnljgedba```aabdfhjmpsvz}zma\ctrg`]\^_adfiknoqrstuusrrrqoonmlkjihgffeeedeefghjknpsvy|~vmd^\_jwyqid_\ZZYZ[\^`bdeffffedca_^][[ZZ[\]_acehkmpsuwy{|~zrjc_^ait}unida^]\[[[[[[[[[[[[[[[ZZZZZZZZZ[[\]^_`acegikmoruwz|yrkfehnx~vojfca_^]]]]]]]]]]]^^^^^^^^___`abccefgikloqsuwz|~yrlhgjpy}xsomkihgfffeeddccbaa`__^^^^^^^_`abdfhjloqtvy|~yqha][^dnzyrlgdcbbcdegghhggedca`_^^__`acegijlmopqrrsttuvwyz|~ysle`\Z[`hr}ysmigeba`_^^]]]]]]]]]]^^^^^^__``abccefgijlnprtvx{}|unidbbeluxrmieb`^]\\[[[[[[[\\\]]^^__`abcdefhikmnprtvy{}~xqlhffjpy{vrnlihfedcba``__^]]]\\\\\\\]^_`bcegjloqtvy{~|tlfa^^bir}}wqmjhggggggggfedba_^]\\\]^_aceghjlmnoppqqrstuvwy{}xrmgc_^^afnw|wsoligedcbaa```__________```aabcdefghjkmoprtvxz|~~ysnifccfipxzuqmjhfdcbaaa````aaaabbccddefghjklmoqrtvwy{}}xsnjfedgkqy~zvspmkihgeddcbbaa`````aabbcdeghjlnpruwy{}|voic_\[\`gpz}xspmkjjjjjjiihfedba`___``bcegikmoqrsuuvwwxyyz|}~zupkfb_]\]aflt}|wsoljgedba``__^^^^^^^___``aabcdefghjkmnprsuwy{}~ytpkheeehlsy|wspmjhfecbbaa`````aabbbcdeffhijklnoqstvxz{}~yuqmjhghkou|{xurpnljigfeddcbbbbbbbbcdefghjlnoqsuxy{}|wqlgb_]]`dks|~zxutsrrqqponlkigfedccddfgiklnprstuvwwxxxyyzz{|~~zvrmiea^]\\^bgmu||xurpmljigffeeddddddddeeefgghijklmnpqrtuwxz{}~}yuqlifcbbdgkqx~zwsqnljigffeeddddeeefgghhjklmnoqrsuvxz{}~~zvrokhfefgjot{{xurpnljigfeddcccdddeffghjkmnprtuwy{|~{wrmida_^_aflt||zxwvutssrponlkigfeeeefgijlnpqstuwwxxyyyzz{{|}~{wsplheb`^^`bfkqw~|yvtsqonlkjihhgggggggggghhijjklmnopqrsuvwyz|}~|yuqnkhfddegkot{~{xvtrponmlkkjjjjjkkkllmnnopqrstvwxy{|}~{wtqmkhfeefhlpv||zwusqpomllkjjjjjjkllmnpqrtuwxz{}~}|ywsplhda^]]^aflsz~}|{zywvtrpnmlkjjjklnoqrtvwyz{{|||||}}~|yurnjgda_^]^_bfkpv||zwusrponmlkkjjjjjjjjkkllmmnopqrstuvxyz{|~~{wtqnjgfedefhlpuz|zwutrqonnmllllllllmmnnopqrrsuuwxyz|}~|yvspnkihgggikosx}}{xvtsqponmmlllllmmnopqrtuvwyz{|}~~}|{zxwurpmjfda`_`bejov}}|zxvtrponnmnnopqstvwyz{|||}}}}}}}}}}~~}{xurolifda`_^^`behmrw}}{yxvutsrqppoooooooopppqqrsstuvwxxyz{|}}{xuspmkhfecccdfhlpuz~|zywvutsrrqqqqqqrrrsttuvvwxyz{|}~}{xvspnlihfeeefhjnrw|}{ywvtsrqqpppppqqrstuvwxy{|}~}|zyxwvutsqoljgeb`__`beiou{}|zxvtrqppoppqrtuvxyz|}}~~~~~~~~~{yvsqnkifdcaaaacehkoty~}{zxwvutsrrqqqqqqqqqqrrsstuuvwxxyz{|}}~|zxusqnljhgeeeegikorw{~|{yxwvvutttttttttuuuvvwxyzz{|}}~~|zxvtromkihfeeefgilosx|}{zyxwvvuuuuvvwxyyz{|}~~~}{ywvutsrqponlkigeca`__acfjou{}{yxwvuuuuvwxy{|}~~~|zxvsqnligeca`__``bdgkosw|}}|zyyxwwvvvuuuuuvvvwwwxxyzz{{|}~~}{zxvsqomkigfedddegiknrvz}|{zzyxxwwwwwwwwxxxyyz{{||}~~~}{ywusqomljhgffffgikmptx}~|{zyyxxxxxxyyzz{||}~~~~~~~~~|zxvusrqqpoonmljhgecbaabcehlqw|~|zyxwwwwxxyz{|}~~~}}}}}}~~~~|{ywusqomkigedcbbbcdfhknrvz~~}||{zzyyyyxxxxxyyyyzzz{{||}}~~~}{zxwusqomljhgeedddefgilpsw{~~}||{{{{z{z{{{{{||}}}~~~}|zywvtrpnmkihfeddddefhjmpsw{~~}}}}}}~~~~~}}}~~}{xvtsqpnmmllkjihgfedbbaabcehlqv{}|{zyyyz{||}~~~}}}~~~~~|{zxvtrpnljigfdcbbbccegilorvz~~}||{{zzzzzzzzzzzz{{{|||}}}~~}|{yxwutrqomljihgfeeeffhjlnqtx|~~}}||||{{||||||}}}~~~~}|{zyxwutrqonlkihgfeeeeefhjloruy|~}}|||{{{||}~~}{ywusqonlkjjiiihhhgfedcbbbbcdgjmrw|~}}||}}~~~}}||{{{{{{{||||||||{{zzyxwvusrpomljhgfedccccdefhjmpswz~~~~}}}}}}}}}}~~~~~~}||{zxwvusrpomlkihgfeddddefgiknqtw{~~~~~~}}~~~~~~~}||{zyxvutrqonlkjhgfedddddefgilnqtw{~~~}||{{{{{{|}}~~}{zxvtrpnlkjihhhhhhggffeddccddfhknsw|~~~~~}}|{{zzzzyzyzzzzzzzyyyyxwwvutrqpomljihgfedddddefhjlorux{~~~~~~}~~~~~~~~~~~~~~~~~~~}}||{{zyxwvutsrqonmkjihgfeeddeefgikmorux|~~~}}|{{zyxvvtsrqpnmljihfeedccbbccdegikmpsvz}~}}|{{{{{{{||}}~~~}{zxvtrpnlkihggfffffffeeddcccccdfhknrv{~}}|{zzyyyxxxxwwwwwvvuuttsrqponmkjihgfeedddeefhikmpsvy|~~~~}}||{{zyyxwvutsrqonmljihgffeeeeefghjlnpsvy|~~~~~~~}}}||{{zzyxwwvutsrponmlkihgfeeddcccdefgijlorux{~}}|{zzyyyyzzz{{||||||{zywvtrpnljhgfeeeeeeeeeeeeeddddefhjlosw|~}|{zyyxwwvvvuuuutttsssrqqponmlkjihggfeedddeefgijlnqsvy|~~~~~~}}}||{{zzyxxwvutsrqponmljihgffeddddeefghjlnpsux{~~~~~~}}}}||{{{zyyxwwvutsrqpnmlkjihgfedccbbbbbcdefhjlnqsvy|~}}|{{zzzzzz{{{||||||{zywusqonljhgfedddddeeeeeeeeeeeefghjmptw{~}|{zyxwvvuttssrrqqqppoonmmlkkjihhgfffeeeffghiklnpsux{~~~~~}}}|||{{zzyxxwvvutsrqponmlkjihggfeeeeeeefghjkmoqtvy|~~~~}}}|||{{zzyyxxwvuutsrqponmlkjihgfeddccbbbbbccdegijmoqtwy|~}|{zzyyyyyyyzzzzzzyxxvusqomkihfedcbbbbccddeeeeeeeeefghjmpsw{~}{zyxwvuttsrrqqppoonnmmllkjjihhgffeeeeeeefghiklnpsuxz}~~~}}|||{{zzyxxwvuutsrqponmlkjihhgfeeedeeeffgijknortvy|~~~}}}|||{{zzyyxwwvuutsrqqoonmlkjihgfedccbbbaabbccdfgijmoqtvy|~~}|{zzyyyyyyyyyyyyyyxwvtsqomkjhfedcbbbbccddeeeeeeffffghjlnqtx|~}{zywvutsrqpponnmmllkkjjihhggfffeeeeeeeffghiklnprtvy|~~~}}||{{zyyxwwvuutsrqponmlkjjihgffeedddddefggijlnprtvy|~~~}}||{{zzyxxwvvutsrrqponmlkjihgfeddcbbaaaaaabbcdfgikmoqsvx{~~}|{{zyyyyxyyyyyyyxxwvusrpnljigedcbbabbbccddeeefffffgghjlnqtw{~}{zywvutsrqponnmllkkjjiihhgggfffeeeeeeffghijkmoqsuwy|~~~}}|{{zzyxwwvuttsrqponmllkjihggffeeeeeeefggijkmoqsuwz|~~}}||{zzyyxwwvuttsrqpponmlkjihgfeedcbbaaa```aabbcdfgikmoqsvx{}~}|{zzyyxxxxxyxxxxwvutsqpnljhgecbaaaaaabbcddeeeffffgghijloqtx{}|zyxvutrqponmlkjjihhggffeeedddddddddeefghijlmoqsuwz|~~}||{zzyxxwvutsrrqponmlkjjihggfeeedddeeefghijkmoqsuwy|~~~}||{zzyxxwvuutsrqpponmlkjihggfedccbbaaaaaaabbcdefhikmoqsvx{}~}|{zyyxxxxxxxxwwwvutsrpomkihfdcbaa`aaabbcdeefffgggghijkmorux{~}{zxwutrqponmlkjiihggffeeeddddddddddeefghijkmnprtvx{}~}}|{zzyxwvvutsrqpoonmlkjiihgffeeeddddeeefghiklmoqsuwz|~~}}|{zzyxwvvutsrqpponmlkjihgffedcbbaa````_```abbcefgikmnqsuwz|~}|{{zyyyyxxxxxwwvvusrqomljhfecbaa```aabbcdeefffgggghijkmorux{~}|{yxvusrponmkjiihgffeeddccccccccccddefghijkmoprtvx{}~}||{zyxxwvutsrrqponmlkkjihggffeeeeeeeeffghijklnprsvxz|~~}||{zyxxwvutsrrqponmlkjihggfedccbbaa```````aabcdeghjkmoqsvxz|~}|{zzyyxxxxwwwvvuttrqpnlkigedcaa`````aabcdeeffggghhiijlnprux{}|{yxvusrpomlkjiggfeddcbbbaaaaaaabbccdefghjkmoprtvy{}~}}|{zyxwvuttsrqponmlkkjihggffeeddddddeefghijkmnprsvwz|~~}|{{zyxwvutsrrqponmlkjihgfeedcbbaa```____``aabcdefhjkmoqsuwz|~~}|{{zzyyyxxxwwwvutsrpomkjhfecba`````aabcddeffgghhhiijklnprux{~~}|zywvtsqpnmljihgfeddccbbaaaaaaabbccdefghiklnoqsuwy{~~}|{zyxwwvutsrqponmlkjjihggffeeeddddeeeffghijlmoqrtvxz|~~}|{zyxwwvutsrqponmlkjihgfeedcbba```______``aabcdeghjlmoqsuwz|~}}|{zzyyxxxwwvvutsrqonljigedca``___``abccdeffgghhhiijkmnprux{~~|{yxvusrpomljihgfedcbbaa```````aabbcdefgijlmoqsuwy{}~}|{zyxwvutsrqpoonmlkjiihggffeeeddddeeffghijklmoqrtvxz|~~}|{zyxwvutsrqponmlkjihgfeedcbba```________`aabcdfghjlmoqsuwz|~}}|{zzyyyxxwwvuutrqpnmkihfdcba``___`aabcdeefgghhhiijklmoqsux{~~}|zywvtsqonlkjhgfedcbbaa````````aabbcdefhijlmoqsuwy{}~}|{zyxwvutsrqponmlkjiihggfeeeddddddeeefghijklnoqrtvxz|~~}|{zyxwvutsrqponmlkjihgfedccbaa``________``abbcefgijlmoqsuwy|~~}|{{zyyyxxwwvutsrqonljigedcba``_```abbcdeffgghhhiijklmoqsux{~~}|{yxvusrpnmkjigfedcbaa``______``aabcdefgijlmoqsuwy{}~}|{zyxvutsrqponmllkjihhgffeeeddddddeeffghijkmnpqstvxz|~~}|{zxwvutsrqponmkjiihgfedcbba``___^^^^^___`aabcdfgijlnoqsuxz|~~}||{{zyyxxwwvutsqpomkjhfecba``____`aabcdeefgghhiijjklmoqsux{~~}|{yxvusqpnmkjhgfedcba``_______``aabcdefgijlmoqsuwy{}~}|{zywvutsrqponmlkjjihggffeeddddddeeefgghijkmnpqstvxz|~~}|{zywvutsrqpomlkjihgfeedcbba``____^^^___``abcdefhiklnprtuxz|~~}||{zzyyxwvvusrqonljigfdcba`____``abcddefgghhhiijjklnoqsvx{~~}|zyxvusrpnmkjhgfecbba`___^^^^___`aabcdfghjkmoqsuwy{}~}|zyxwvutsqponmlkkjihggffeeddddddddeeffghijlmnpqsuvxz|~~}|{zxwvutrqponmlkjihgfedcbba``___^^^^^^__``abcdefhiklnprtvxz|~~}||{zzyyxwvutsrpomljigedcba`____``abcddefgghhiiijkkmnoqsvx{~~}{zywvtsqpnmkjhgfedcba``________``abcdefgijlmoqsuwy{}~|{zyxwutsrqponmlkkjiihggfffeeeeeeeeffghhijkmnoprsuwxz|~~}{zyxwvutrqponmlkjihggfeddcbbaaaaaaaaaabbcddefgijkmnprtuwy{}~}}|{zzyxwvutsrponlkjhgfeddcccbcccddeefgghhijjkklmnoprtuwy|~~}|{zyxvutsqponlkjihggfeeddcccccccdddefghijklmoprsuwxz|~~}|{zyxwvutsrqponnmlkkjiihhhgggggggghhhijjklmnoprstvwyz|~~}|zyxwvutsrqponnmlkjiihhgfffeeeddddeeeffgghijklmnpqrtuwyz|~~}|{{zyxwvvutrqponmlkjihhggggffgggghhiijjkllmmnopqrstvwyz|~~~}|{zyxwvutsrqponmlkjjihhgggfffffggghhijjklmnoqrsuvwyz|~~}|{zyxwvuttsrqpoonmmllkkjjiiiiiiiiijjkkllmnopqrstvwxz{|~~}|{zyxwvvutsrqpoonmllkkjjiihhhhhhhhhhiijjkklmnopqrstvwxz{}~~~}|{zzyxwvuttsrqponmllkkjjiiiiiijjjkkkllmmnoopqqrstvwxz{}~~~}|{zyxwwvutsrqpponmmllkkjjjiiiiiijjjkklmmnopqrstuwxy{|}~}|{zyyxwvuttsrqqpoonnmmlllkkklklllllmmnnoopqrstuvwxyz{}~~}|{zyyxwvuttsrqqpoonnmmlllkkkkkkkkkklllmmnoopqrstuvwxy{|}~}|{{zyxxwvuttsrqpponnmmlllllllllllmmmnnooppqrrstuvwxy{|}~~~}|{zzyxwvuutsrrqppoonnmmllllllllllmmmnnoppqrstuvwxyz{|}~}||{zyxxwvuutssrrqpppoonnnnnmmmmmnnnnooppqrrstuvwxyz{|}~~}}|{zyyxwvvuttsrrqqppoonnnnmmmmmmmmmnnnoopqqrsstuvwxyz{|~~}}|{zzyxwwvuutssrqqppooonnnnnnnnnnoooppqqrrsstuvvwxyz{|}~~}|{{zyyxwwvuutssrrqqppoooonnnnnnnooooppqqrsstuvwxxyz{|}~}}|{zzyxxwvvuttssrrqqqppppoooooooopppqqqrrsttuvwxxyz{|}~~~}|{{zyyxwwvuuttssrrqqppppooooooooooppqqqrrsttuvwwxyz{|}~~~}||{zyyxxwvvuutssrrrqqqpppppppppppqqqrrssstuuvwwxyz{|}~~}}|{{zyyxwwvvuttsssrrqqqqpppppppppqqqrrrsstuuvwxxyz{|}~~}}|{{zzyxxwwvuutttssrrrrqqqqqqqqqqqqrrrsttuuvvwxyyz{|}}~~}}|{{zyyxxwwvvuuttsssrrrrqqqqqqqqqrrrrssttuuvvwxxyz{||}~~~}}|{{zyyxxwwvvuuttsssrrrrrrqqrrrrrrssstttuuvvwxxyz{{|}~~}}||{zzyyxxwvvvuuttssssrrrrrrrrrrrrrsssttuuvwwxyyz{{|}~~~}||{{zyyxxwwwvvuuttttssssssrrrsssssstttuuvvwwxyyz{{|}~~~~}||{{zzyyxxwwvvuuutttssssssssssssssstttuuvvwwxxyzz{|}}~~}}||{{zzyyxxwwvvuuuttttsssssssssssttttuuuvvwxxyyz{{|}}~~~}||{{zzyyxxwwvvvvuuuttttttssssttttttuuuvvwwxxyyz{{|}}~~~}}||{{zzyyxxwwwvvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~~~}}||{{zzyyxxwwwvvvuuuuttttttttttttuuuuvvvwwxxyyz{{||}~~~~}}||{{zzyyxxwwwvvvvuuuuuuttttuuuuuuuvvvwwwxxyyzz{||}}~~~}}||{{zzzyyxxxwwwvvvvuuuuuuuuuuuuuuvvvvwwwxxyyzz{||}}~~~~}}||{{zzyyyxxwwwwvvvvuuuuuuuuuuuuvvvvwwwxxxyyzz{||}}~~~}}||{{zzzyyxxxwwwvvvvvvvuuuuuuvvvvvvwwwxxxyyzz{{||}}~~~~}}|||{{zzzyyxxxwwwwvvvvvvvvvvvvvvvvwwwwxxxyyzz{{||}}~~~~}}}||{{{zzyyyxxxwwwwvvvvvvvvvvvvvvvwwwwxxxyyzz{{{|}}~~~~}}|||{{zzzyyyxxxwwwwwvvvvvvvvvvvwwwwwxxxyyyzz{{||}}~~~~}}}||{{{zzzyyyxxxxwwwwwwvvvvvvwwwwwwwxxxyyyzz{{{||}}}{}|{z}{}y}|wyyw~zut{nwvozxnrvxkq{tnuvxwxyyxwklv}wknv|w~{||v~y{~}wy~o~stxvys|{q{ywyww|i~~rjm|zyjjuvho}ssnun{|wzr{y}xw~~xy}x|t}|ly|~xwptxx{zzts|ypnolxmnt|}rxsutmwxy~yuqqz~|~}{|w|r~ys|uwvqtwy}uzpxttkrxnhhm|lwqu|{x|z|~u~wx}~r~y||vzy~~x}zzvy|x}xxns||w{sw|q{qkv~zsmqrw~yznv}|}mnzkwtq}s}zxvtp|}zu}xvuv{p{|ttpwp|}fytor|~|sv{sq{ur|}t~|ztr{kq|x~x~~x|zqzy|nv{v~zq{v|j{rpgpuqdpqzdrnzvt{gwye|ztvkp|w~pmu|t{wjuqo{vrsyxrx{~wnrvr~mcum{vntzqqwq}wlxqwjqxyzrwoxwvx~mxz|sw}}v}zq}wy~m{xt}zwjigau~v~{~z`ikqxwuqtxw~ypuu}{|w~uv}~~ry|n|nuty|s~s}symwsurmouszr|~rqtzrvzrpvsgxwvmt~vmt|srszn}v~~jylvvs{ghwozvlxmkt~qzzsfqns{uw~yux|xvmmyvpxpsuy|rp~|rr|pnwu|g|ytilkxqyqnid}u{yz|osvs}|{{rkrtsrx~qks~}w}w|xtxz{xtjxv|vzyshjwuuumzz{xpuvpurx|tkxzw_mfZ|u~d{z{zo~wyvzqpu}x}gtp~tr}`vys{]pztpysztzqu{r{up{r|l|uuo~kxuprix^~z}vwvoyskty~l~jujnzoox}jl}ovx|nsyjmo~zujiqrwt`ukz{u}w}}~sv||yuxv{{ypt~uxpqw|xox|pskqwr|xmk~pj~|{z}~lytwkonvy~~vt{{zs{f~xxw}~lta|ostx|{obnict{qq|uukovt{\zny~umwz|~{putpx~gy~txrilxwru_}ziywhryy{~{pywydz|z~qw}vwroiorxpwrsw}uwpv{yrt|{||izsW~}x{i}{l|r{s~dyzujzu{phtlvr~iztmlzw{v~itiszr}vuupxrowsm}}s}iwzy{p~}tc~mz~ox|vzpeq{|jy[||xjurszpxwg}o}}yjuo~osltk}yjyu{fuvutvplvivunhq~t|uxsnxmw{ms{qzlzuvwkwzdvx~ld}byz{pyoxt~e}~okt{rsli|~~u||}coktvuqwc|etwt||{tomzgwz{l|ks}xufx{}vml~}yg{wqzlr}{zz{u~yuvs~r|we~oq{vytpzmmv|yfw|yjzgy|q}~zqrsoxksuxzww~~xx~xu~mgowvozdk{szx|z{pxqz}qt~x}kr}X}|~~mzr{w|t}stom~zgtlzyx~unz~rl~y}}q|wdu`|{|vn}y{o{xtrvm|s}wxzpyr}zpu{~w{t}wyttoosy}wsw|txvxw{thhsy{}w|s{yy}{m~y}xtvptfhluw~s|ovyc|wtxwsyqktus~zzuyq}}~xvtzj~n|pxrwvcvv~{u~yzyxvzvs}|fww{syw{c{u}qwxu~wl}}|t|ztx{}pzey{ly~lgzrrpqrwqzx|xnpx{{jrxgu}x~wqtzitr|pyywg{islxu|ozrtq|yxoyyvwxv|sy|u{{t|txys~sxttr~vrrwz~pvjl~x{s{you}ulkvyxtkw{yoyrfn|w|uz{~nwypkzz}||vt}rwiuvs}s{{}|tqo}}w}omvpw~n|~yz}{xpym}|qzvr{{}z|wyy{|}qy{z{swlnls{tqv~pz~||uu{k{|vjq{~zv|st{sz{}{zozi}np|l}|r|~nywzs{vuxzvzsywr}o~}|{to}{zy~|r{wtxvt}pzy{y~y~~vu|zqsy|vyt~uuu|ww~yx||x|~{{{|z}ssnvxt}zr|qiyp{xvsx{|p{|q|ursxi|v~tx~u~|}qv~wt{qvxwt~zr|}uu~xquyiwxzr|zym|znxvwtwy}~}w|uw{sqzsuz}~~i~qq~}}|xp}{w}}yy~{u}|uwu}pw{{wuuxp|{x{}y~zxvuy}{}{yur{zotuw~|uslssz}|sxy|vqq||~wvtzzy}p~~y|ww{|~w|svrpv{{}|wy~wn}zz}~}mhzp{s{y}}twvzxyxu{y{nz}z{{~u~o|}{uyrtzw~~}u~vx{zvvy||~xnu~ym||{vv~v~susz~|w~y~w~|y~wz}q~{~z{ly~i{{{u|z|~xvy{vzprupt~zzy~zxwt}yys|~{wvyrmvyvrtzyyot{zuy{xq~|}|vwtrt}~yyyyyy|y{wy~p|~q~|~|{}{}wt}}|w}|{jq|}zzvtyx~r~yt~uwxwwzz}z}wzs}{w~~~|uv~wy{pyx~xuypzzs|~{y{~tz|{{z|{q{v}xys||}ry~~~{z|~{x~uw}w|{y{|y~|szw}~}uzyzux~x~}u~pv}vr|}}|r||zvu|zt~{yxyt{}u|z|v||w{vo|wqqy}y~zuyy|{|}}}z~{|yyzvxvz{v}y~{~ys}v{z|~|r|~x}zy~y~txyp{q}~y|~{zyu|~~|uxzx|vxx{u{v|~z|~|~st}}{{{{st}tyw|y|uu~~}vvvyvx~}~|x~|}w}vpwz~~v}q{}w{}yw~}z~wu~|~ywxz}vt{{yz{|x~{w{w|~~zryrzt{vwvn|~~{yw~~u{~zw~{yvyv~wsyou{uvv}z{~|wx{}|{y}{{~t~x~x}xxt}stz|y|~yt|xzwz{~sy|~y~y}{}tx|~xt|uwwtz|}{}st}wzqz{|y||~zx|}v~}y{|~~vts|xw{}}v~~yywu}wz||~{xz}zxtzs}{}{z~|w}~~p~}sp}xu~~}z|x~|~{~~oz{{~{zz}u|}~y~{wwtyvzyxz}z{}x}y}yx~~w{z~vq~yjs{tyzw||y~~~|zz~}|u{~z~}w{{}ywwuzv|}z~rzx{}{zy|y~}r}u|~~|}~}zvwyx}|}}svv|y~p}|~syxvy}}~~u{}x}x}~t}y|vzv{~}szzr{~x}{~~zv~||}uyx~~u{w|z{z~t}|~v|y}z~~y~~|wv~~|~}~{~||}|t}~{~zz|y|y~|}vxw|{}|~yvz~y{}{{z|wv~w||yx}}yzxxyr{x{z~zy{v}~}|zzz}yw~x}}{{|y}v}}~{}vx}}{ty}~{~}|~~~}y}|{x}u}wy{z{~{~yv{wy{{{|{~}~~~x|~|~~|~~w{z{yy~~}}wy{}|~v{{y}~{{~yx|}{v}z}z}|}yz~{~{}s}}sxv~{}~}}}zv~~|~|x}x}}~~}}w|}s|~|w}vx|~}yw~}y|v|w~z~|z~~{zz~wq{w}|}w~}ywxz|~yw{wvx~}{wz|y{wu|~{x}yy~}}{v{}wv~w~{}||}}~}~yx~{~{}~{y~xy{~~}|z|zxz{zz{s|zyx{{|w{}}~|wwyy{|{w{~}uwzw~{|zzv|}}w{xwu}~yw{v}yvw~w{wu~wxyz{|zzws}|q}{uz|~z}}{|||xz~u~}wz}z}w~z|xyz~~{{~|{x{}zwz{s|}z}}vz}}}x|}}x~xv}v~x~zvyy~wwu{u}~vu~z{{x~~~~z~u|{~wx|r}z||v|wy~~y}z{{}~{z}xzy|q~yuuywx~|wzz~||zzuz~}zzwzwywy~}w~zxw|}~||}x|}tu}{z{~{s~z~~|}}{}y}|wz~z}{ux~xuvv}~~xq{x~|z~x}wvp~w{~}yyy~{vwxyzz}~||{w|x{y|~~|ztyzn}x~yyz~}~y{|}|y{u{}zz}p~{{~zw~|y}yz|~||}}zuyxx~~{yr||z}~z|}||~x{}{yu||z}|zzyx|u{v{~}~pzzux}~xx{w~{|}~~yt|y|zzy~zz~~xxyt~~v|v}~x{x}vz|wxv}~}{~y~w}x{}ow}}{}}yxy}~v{~z}w}~{|}xt~z{|}~s|{x~~ruu{~}x{v||z{||}z~~r{z{x{}~yxvy~xzrwz~|{}|}}}~~~w~}}||z{||{|~vr~}y|||vwy{}y~~|~{}~~|y{ty|z{~|{}}zz~yp}|}|y{||zz}wvvwt}uyz}}}~yyx|y|xuxzxy{zv||y}}~zzx~}|t|v{~~~z}o{|}|t~|zy{~|~~zwzv}w|}v{z{{w{vs{zq|w{~~|}y~{yzx~x~w{xzuywv|}zw|}y|ysz~xw~uyx}|w}}}}u|~|uz{w{{}zx~ut~}}{ywyyw~x|}~r|x}}{}|t|{z}~~~y|~~z~{{}vv~|}x}xy}vz~|}}|uzx}~|~}{}|z~~x}yx{|x}x~z|~}~u{|x}~{~x~v{}~}~}~|zxyrz}}x{v~v{|ty~~~}~sx}}|y{~y}yyv|zwzq~{y|{}w|{|{}y~y{z~|x|z}vyv~}|tu|w}|{|}|}|~{{~w~x|x|y}zxs}~xzw~~}|}{{{|~~v{|{~|v~z}}z|z|t~|}|xyzz~{|zw~}zx~|~{y{wz}}ztz~}z~zyt{|}~{y{w|t~|}~z||y~z}}{w|}|}}t||~z||}{~w}v~|xz|~z~|{z{w~zz|zy~~}wzxy~}}{}{}v~|}|}~}|~~ww{{y|~z}~x}z~yz|~|vt{~}}|{~}~}~~xu~x~}}}{~v|z}|{|{~}~}w}{~|wzy~z}}~xz||y}{t}z{z}~{x|z{z~|y~~|~}|wyz~~|}xy}~z~zx{wz}x}v~~~|}~{~z~}}z{||}}|{}|~zzy{||z|~~{t|~{|vyz~~z}}}~|}|wxzy}{~z}~~|r}~v|~~}v~{~|w}|{~z}~~xy}{|{|{|{x~t}|w}xy~}x{xz~}{{zzwy|~z~|}y}~yyz|{{|z{y}~y}zzy~|{w|}wz}{~~}}{y|~~~||u~~|}z~y~||}}{y||yx{zv}~x|}~z|}~{|{yw~y|~~{{{}|{|~~~|||z{|}}}y}~zy}~x}z}xz}|}{}~{|z{}~~}~v|{}|{||v~z}|vz~~{||w{{~~}||~z}}{~~z}z~}|}}t}x~x}|z{}|yu~}}{~|}~}}z|y}{}}~y~x|yz~|xt}~x{}{~y~~y}~|~~}~yz~|{v~|}{}}~zxyz}y{}{|||{zz{}~y{{s||zz}|~~}~}}zz|~z~|z}~~~}z|~~}~{}zy}{{{{~y~|v}y{z||{{|{}~}}~}}y|}{{|~z~}~~z|}~~yy{~~z~}{}x}}{|~~|{z}|||~}z}~xy~}}}~{~z}|y{~}~zw~y}y|y~}}yv{}y}|}||~w~{}}~}{~}}||}~}~z~~~~y|}x~|{|x~|ux}~{||~~|}{x~y}w}{{|y{x~|}|||}}~{t|~~~~}~}z~|{}z}~z{y~}{{{{}}~~~}~}y}}{}{x|yy~~}y}~}}x||z~{~|{~}|~}~}~|{~{|}}{|wz}z}z{~|}|||~||~~~|~|~zy|zy{~}y{}~|}~{}}{y|||~~{}z~z~{|}{}}||~{|~|~~|||~~{}~~y{|~|}~{}wz}yz{~|~~{~}|~}y{|{~~}{|||}~{z|}{}~|{~|y~}~~~|~}z~z{~}{zz{}|}y|~~{z|}||~|~~}}{z{}|~}z|wy~{|{~|y{~|{~}|~~|||~}}z{~~}}|x|}z~}y{~z{z~}~~~~}}~|}|~}~|~{}y~~}wx}~~y~|}z}z|}{|{{||z~z}~}xx~~~~{}~{w~~~~zy}}}}|{|}~}~{~zwzy}~~|{~~{~~xyw}}{|~}|z}|}}||z|||}|~|{}|{|z}~}}{~~|}}|}~{y{{~|~zz~}|{}|x|~}x|}{|~~~|y}||~}}~~}}{~zz~{}}{}~{{|}~~}~{{v}~~~|{~{|{y}y~||}z|}{}y}x||}~z}~x}}~~|}~}||~~~z|x}}y}~~}{{~~~~}||}|~|y|z{z}}}~{y|~~~|zx}}zx~}}~y|~|~}{x}y{~{|}~~|{}|~}}~}}}~{{~}}x}{z}~~~zzz|{|}}~z{~~~}||~~y}y~~}|}z{~}{~wzy{xz}|~}{zzz~~}zx~z}~~~}}}z~|~~~|||~~~|w~|}|z}~~~{~}|}}||}}|{~{|~~{~~}~|xzy~z~||{~~{||{~~|}}y{~{~z~~~~~~~{|~}|u~~~~z{{}~z{{z|~{~~{y|}~~~~}w|~}~z||~~{w}|}~~~y{~{}|~|x}}|~~{~~z}~|~~~}|{~z~~z|}}|}{}}{~}y~~~{}|{}{~}~z{{}|}z|{~~}|}|}}{|y|~{{}{~}~~~~}~{|~~~}|~}{{}|}|}~|zv|~}~~wz}|{|||~}~}|~}|~~~}}~|~{{|{{wz{|||~{~||~{||}z}~z~}}x|~|}}|||~~}~|}~}}||~}|~~|}}}}|}~~z}|z|~|~{}}~}}|~||}||}z}y~zxyz~}~{|}~z}{}~~{{}z|yz~wzzx}{~}~|}}|~~~}~{{}~|}~~~|yy}z{|{~{}~~~}}}~{~~{|y}~~}}|~~}}}|~~||~~|}{||}w{x|}~~~}}~}~{}|~~{}{~~~}}|z||}}zw|{}~{~}|~~|~|~~|~~}|}|{~~~~}~{|}~~}yy}}|~}|~~~|~}}{~~~~~|~z}{~~}yy~|z}|x{~w~x}}}}~~}|}y{{~~}|~~{~{~{~~~~|{zx|~{}~|}~~|~{}{~}{~{~~{}y}|~~~}zz~~}|~}}|{yz}|~}~~~}y|{~|~~{|~}~}}z~}}y}y}}}~z~|~~{~}|~}~|~|}{|~{{~~y}{}|}|}|{~|}|z||~~~|{}}~~}}|||y~|~~~~}~{||~{|y~}|z|~}|~||~}~|{y~~z|{~}{}||y{}~||~}~~}~~|{{|}}~y}~~|~|||z~}}}||}|~~~y}{}{~~~{~~|~}}~|}y}y}}~~|z|||~y~{~~~~~}{}~~~}}}}{||}~~{~{|~~~y~{~{y~z~|}||~}}}{}|~~z}~|{}~}|~|{~z~|||{|~}}|w{}|}|}z|~~}~}{y~z~|y}{~~||~z}~~~~}~|}~~|~{~}|~~~}{|}~~{~~~|{}~~~~~}||~~|~~}|z~{}}~}~}~~~}}|{~z|~}~|}z}}}{zz}~}~{}}}}~~}{z~}|}}~~~~~|z}|}~{{~|||||~}|~}}~{~|~|~}~~~~z~~~~}{}|~{|||~}}}~~}|}|x||~~|~}~~}~}{~|{{~}~{{}|||~~|~}|}}}}~}~~}}}}}{~z~|}~~z{|~~~}{{{z~~}|}|~||}{{~~y}||zzy}{~~~}|~~}|~~~{}~}~~~{}}~}z|~{{~}~}~}~}|~}{|~}}}}}~~~~~~z|}~|~}~|z~}~~~{{y{||~~}}~~}~}~~}}~z}}|~{||~~}y|{z|~}~~~{~}~}}}}~~}~~~{}{}|{}~}~~}}}~~}~{~~~~}|~}~~~}}}~~}~~~~~}||~}~~~~}~zz|~~|~}{}}||}~~y~{|~~~}}}~z|{~}}xzy{}~~{~|~~~|}|~~~}{{~~~|}}{~}|}}}}}{|{}}}}~}~~~|}~~~}|{~}}}~}|||{|y|z}~}}}||~}}}~}~~~z}}|}~{z}|~~~{~~|~|}}}~~~~~{~~|~~{}}}~~~~}~}{~~}}~~{}z~}}~~z~}{~~{z}}~~~z|~}}z}}}~~}~~~~~~~~}}}~~~}{}{}~{z|z}~}~~}~~~}~}|~|~~}|~~|}~{}|}}}~}}x|}~~~~}~|{z|~~}}~zz~~}~}}{~}~}|}{~|}|~}|~~}~~}}{~}}}~~~~}}||}}}}~}||~|}~~~~~~}}}}}~}}~~}~~~|}~z}}~|}|~}}|~|~{}}~}~~{}|~|}}~}}|}~~~~|~~|}|}~}~~~}}~}~}}|}~~~{~~~}}}|{~~z~{~~|z}~~~~}~~~}}~}|}{~|}|~~~~}~|~}~~}}~}~}}|}}~}}|}}~{~~}}~~{}}~}~|~}||}}~~|{z~~}~~z~}~}~}{{}|~~}~~||||~}|~~~~}|~{|}}~}~|~}|~~}{}~}~}~}|~~~~{~}~}}|}~}}}~}|~}~~~~}}~}}~}~~~}}|~}|}~~~~}{~|}}|}}~}}~~}~~~}|~}~~~~~~}~~~~~~|}~}}}}}~{}~}}}}}}||~~~~~~~|~|}~~}}~~}~~}}~~}{}}|}|{~~}}}~~|{~~|~}}~~~}~~}~}}}|~}}{~~~|}|~}}~~{}~|~~~}{{~~~~}}~}|}|}}|}}}{{{~}~}~~~~~}~|}~~~|}~}~}~~~~~|~~}~~~~|~||}~~~~~~~~~~~~~~~}~~~}~|}}}~}~z}}||~~}~}~~~~~~}}~}|~}|}}{~}~}~|||~~~}~~|~|}}~~z~~}}}~}~~~}~~~}~~~{~~}~}}|}~~~~~~|{|~}~}}~~~~}~}~~}~||~{}}{{{~~~~~~~~|}}~~~~|~~~~~~}}||}{|~~~~}~~~~}~~~}}}~~~}}|}~~~~~~~~|}~~}}}~~}}~}~~~}}}~~~~}~~~|}~}~~~}~}|~}~|~~~}}~~}}~}~|}~~|~}}~~~}~~|}~~|}}}~~~~}}{~~~~}~~~|~~~~~~~|~}~~}}|}}~~}|~}~~|~~~~~~~~~}}}}~|z}~}}~~~|~~~~}~~~~}}}{}~}}}~~~}~}}}~~~~~}}}}}~~~~}~}}}~|~}~~~~}~~~~~}~}|~|}~~~}~}}~~~}}}~~~|~~~~}~~|}~~~~~~~~~|~}~~~~~~}~~~}~}|~~|~}|}~}}~|}~~~~~~}~~~}|}~}}~|~~}~}~~|}~~~~~~~~~}}~~~~~~~}~~~}|}}}~~~~}}}}~~}}}~~~~~}~~{}~~}~}}}}}~~~~~}~~}~}~~|~~~~~~~~~~}~~~}~~~~}~}}~}|~~~~~~}}~~|~~~~~~~~~~~}~~|}~~~~~~}}~~~~~}~~~~~~~~~~~~}~~~~~|}}~}~~~~}~~~}~~~~~}~~|~~~~}~~}~~}~~~~}}}~~~|}~~}~~~~~~~}~|}~~}~~}~}~}~}~}~~}~~}~~}}|}}~~}}}~~~~}~~}}~~~~~}~~~}~~~|~~~~}}~~~~~|~~~}~~}~~~~}~~}~}~~~~~}~~~~}}~~~~}}~~~}~}~~}}~}~~~}~}~~~~~~~~~|~~}~}~~~~}|~~~~|~~~~~}}}~~~~~|~~~~~}~~}~~~~~~~~~~~~}~~~}~~~}~~}~~~~~~~~~}}}|~}~~~~~}~~~~~~~~~}~~~~~~~}}}~~}~~~}~~~~~~~}~~~}~~~~~~}~~~}~~~~~|~~~~~~~~~~~~~~|}~~~}~~~}}~~}~~~~~~~}~}}~}~~|}~~~~~}}~}~~}~~~~}~}~~~~~~~~~}~~~~~}~}}~~~~~}~~~~~~}~~}~~~}~~~~~}~~}~~}~~}~~~~~~~~~~~}~~~}}~~~~~~~~~~~~~}}~~~}}~~}~~~~~~~}~}|~~~~~~~~~~~~~~~}~}}}~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~}~~}~~~~~~~~~}~~}~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~}~~~~~~~}~~~~}~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m54.bin b/applications/SprPoP/dist/MUS/m54.bin deleted file mode 100644 index cad125b..0000000 --- a/applications/SprPoP/dist/MUS/m54.bin +++ /dev/null @@ -1 +0,0 @@ -~~~}}}}}}||}||||{zzyxxwxz}~~~~}|{zzyyyyyz{{|}~~~}|{zyyxwvvuuuuuvy{}~w~}rv|~}|{zyyxyyzz{}~{x}~}}~}||{{{{{{||}~~ztszzusrstuwxyz{{|||||{zzzzzz{{{||}~~~~~~~~|yxy~~~~~~zvssv}{xvtsrrrrrrssssttttuuuvvwwxyyz{{|}}}~~~}{zxwx{~|yvtssux}|zxwvutssssssssssttuuvvwwxyyzz{||}}}~~~~}{zxxwx{~~|yvtsstx}~{yxwuuttsssssssstttuuvwwxxyzz{{||}}~~~~~}|{yxwwx{}~{xvtsstw|}{yxwvuutttsssstttuuuvvwxxyyz{{||}}}~~~~}|{yxwwxz}}zxutsstw{}{yxwvuutttttttttuuuvvwwxyyzz{{||}}~~~~~~}|{yxwwxz}|zwutsstw{~|zyxwvuuttttttttuuuvvwwxyyzz{{||}}}~~~~}|{zyxwwxz|~|zwutsstwz}|{yxwwvuuuuuuuuuuvvwwxxyyzz{{|||}}~~~~~~}|{zyxwwxz|}{ywussstwz~}|zyxwwvvuuuuuuuvvvwwxxyyzz{{{||}}}~~~~~~}|{zyxwwxy|~~|zxvussstvy}~}{zyxwwvvvuuuuvvvvwwxxyyzz{{{||}}}~~~~~~~}}|{zyxwwxy{~~|zxvussstvy}~}|{zyxxwwvvvvvvwwwxxxyyzz{{{||}}}~~~~~~~~}||{zyxwwxy{~~}{yxvtssstvy|~}{zzyxxwwwwwwwwwwxxxyyzz{{{||}}}}~~~~~~~~}}|{{zyxwwxy{}~|{ywvtssstvy|~|{zzyxxxwwwwwwwxxxyyyzz{{{|||}}}~~~~~~~~~~~~}}|{zyyxwwxy{}~|zywvtssstvx{~}|{zzyyxxxxxxxxxyyyzzz{{{|||}}}~~~~~~~~~~~}}||{zyyxwwxy{}~}{zxwutssstvx{~~}|{zzyyyxxxxxyyyyzzzz{{{|||}}}~~~~~~~~~~~}}||{zyxxwwxyz|~|{yxvutssstux{~~}||{zzzyyyyyyyyyyzzz{{{||||}}}}~~~~~~~~~}}}|{{zyxxwwxyz|~~}|{yxvutssstuwz}~}||{{zzzzzzzzzzzz{{{{|||}}}}}~~~~~~~~~}}||{{zyxxwwxyz|~}|{zxwvutssstuwz}~}||{{{zzzzzzzzz{{{{||||}}}}}~~~~~~~~}}}||{{zyxxwwxyz|~~}|{yxwvutssstuwz}~~}||{{{{zzzzzz{{{{{||||}}}}}~~~~~~~}}}}||{zzyxxwwxyz{}~}|zyxwvttssstuwy|~~}||||{{{{{{{{{|||||}}}}}}~~~~~~~}}}||{{zzyxxxwxyz{}~}|{zywvutsssstuwy|~~}}||||{{{{{||||||}}}}}}}~~~~~~}}}}||{{zzyxxxxxyz{}~}}|zyxwvutsssstuwy{~~~}}||||||||||||||}}}}}}~~~~~~~}}}}||{{zyyxxxxxyz{}~}|{zyxwvutsssstuwy{~~~}}}}}|||||}}}}}}}}}~~~~~~~}}}}}||{{zyyxxxxxyz{|~~}|{zzyxwvutsssstuvy{~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}}}|||{{zyyxxxxxxy{|~~}}|{zyxwvuutsssstuvx{}~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}|||{zzyyxxxxxyy{|~~~}||{zyxwvuutsssstuvxz}~~~~~~~~~~~~~~~~~~~~~~~}}}}||{{zzyyxxxxxxyz|~~}||{zyxxwvuttsssstuvxz|~~~~~~~~~~~~~~~~~~~~~}}}}||{{zzyyxxxxxxyz|}~~}}|{{zyxwwvuttsssstuvxz|~~~~~~~~~~~~~~~~~~~~}}}}||{{zzyyxxxxxyyz|}~~~}||{zzyxwvvuttsssstuvxz|~~~~~~~~~~~~~~~~}}}}||{{zzyyxxxxxyyz{}~~~~}}|{{zyxxwvuutssssstuvxy|~~~~~~~~~~~~~}}}}||{{zzyyxxxxxyyz{}~~~}}}||{zzyxwwvuutssssstuvwy{}~~~~~~~~}}}}||{{zzyyxxxxxyyz{}~~~~}}||{{zyyxwwvuttssssstuvwy{}~~~~~~}}}}||{{zzyyyxxxxyyz{|~~~~}}}||{zzyxxwvvuttssssstuvwy{}~~~~~}}}}||{{zzyyyxxxxyyz{|~~~~~}}}||{{zzyyxwwvuuttssssstuvwy{}~~~~}}}}||{{zzyyyxxxxyyz{|}~~~~~}}}||{{zzyyxwwvuuttsssssttvwxz|~~~~~}}}||{{zzyyyxxxxyyz{|}~~~~~}}}|||{{zzyxxwvvuuttssssstuvwxz|~~~~~}}}||{{zzzyyxxxxyyz{|}~~~~~}}}}||{{{zzyyxwwvvutttssssstuvwxz|~~~~~}}}||{{zzzyyyxxxyyz{|}~~~~~~}}}|||{{zzyyxxwwvvutttsssssttuwxz|}~~~}}}||{{{zzyyyxxyyyz{|}~~~~~}}}|||{{{zzyyxwwvvuuttsssssstuuwxz{}~~~}}}||{{{zzyyyyxyyyz{|}~~~~~}}}|||{{{zzyyxxwwvvuuttssssssttuwxy{}~~~}}|||{{zzyyyyyyyyz{|}~~}}|{{yyxwvutsrrqqqqrsuvwxxxxyz|~|{{y|~}}||||||}}}~~~~~~~~~~~}|{{zzzzzzzzzzzzyyxwwvuuuuvwxyywros{unqswy|~~~}}|{zzyyyyyyyyzz{|}~~|{|||}}}}}}}}}}|||||||||{{zzyyxxwvvvuutsrqppruxzyyyyz|}|z|{zxxxxxxxxxxxxwwwwwwwxxyyzz{|}~~}|zxurommotx|}}{yxwwxyz|}~~~~~~~~~~~~~~}}~|{zyxxxxxxxxxxxxxxxxxxxxxwwwwvvuttsrqqqrtwy{|||}}~}{{|}{zyxwwvvvuuuuuvvvwwxxyz{|}~~~}|{ywurpnnorvz}~}|{{{{|}~~~~~~~~~~}}}~}{zyyxxxxxwwxxxxxxxxxxxwwwwwvvuuttsrqqrsvxz|}}~~~|{{}~|{zyxwwvvvvvvvvvwwxxyzz{|}~~}|{yxvsqpooqtx|~~~}}}}~~~~~}||}~|{zyyxxxxwwwwwwxxxxxwwwwwwvvvuuttsrrrsuwy|}~~|{{{}~|{zyxwwwvvvvwwwwxxyzz{|}}~~~}|{zxvtrqpoprvy}~~~}|{|}}|{zyyxxxxxxxxxxxxxxxwwwwwvvvuuttssssuvx{}~}|{{|~}|{zyxxwwwwwwwxxyyzz{||}~~~~~~~}|{zywutrqpprtw{~~~~~}|{{|}~}|{zyyyxxxxxxxxxxxxwwwwwwwvvuuuttsttvwz|~~|{{{|~~}|{zyyxxxxxxxyyyzz{{|}}~~~~~~~~~}|{zyxvusrqqrsvy|~~~~~~}|||}~~}}|{{zzzyyxxwwvvvuttssrsstuvxyz{|}~~vv~uv|~}||||}}}}}}}||{{{zzzz{{|}}z}~~~}|||}}}~~~~~~~~}}||{{{{{{{{{wqmsyrnrw|~|{}~~zvv||yz|~}|{{zzyyyyyyyyxxxxwwwwwwvvutsqrtwz{{{|}~}xvx|~}}~~}||{zyyxxxxxxxxyyyzzz{{||||||{{zzz|~|xtqnnosx{}}|||||}}~~~~}}}}}~~~~~}|{{}~~{xvvx{~~}|{zyyxwwwwwwwwwwwwwwwwwwwwvvuutsrstvxz|}~~}zxwxz~~}|{zyxxwwwwwwxxxyyyzz{{|||||||{zzz{}}zwtronoruy|~~~~~}}}}~~~~~}||{|}~|ywvvx|~}|{zzyxxxwwwwwwwwwwwwwwwwwwvvuutsstuwy|}~~{ywwy{~}|{zzyyxxxxxxxyyyzzz{{|||||||{{zzz|}~|zxusqooqsw{~~~~~~~~~~~}|{||~~|ywvvwy|~}|{zzyyxxxxxxxxxxxxxxxxxwwwvuutttuvx{}~~|yxwxz|~~}|{zzzyyyyyyyyzzz{{{|||||||{{{zz{|~~|{xvtrpppruy|~~}||||}~~|zxwvvxz}~}|{{zzyyyyxxxxxxxxxxxxxxwwwvvuutuvxz|~~|zxwwxz}~}||{{zzzzzzzzzz{{{{||||||||{{zzz{}~~}{ywusrqqrtwz}~~}}||||}~|{ywvvwx{~~}|{{zzzyyyyyyyyyyxxxxxxxwwvvuuuvwy{}~}{yxwxy{~~}||{{{{{zz{{{{{{|||||||||{{{zz{|}~|{yxvtsrqrsux{~~~~~~~}{yxwwx{~~}}}||||}~ztqz}soquxz|~~~|yyyz{}~}}}|||{{{zzzyyyzz{|}|wz}uuwy{}~|ywwz{yvtsstvx{~~yx}~yvvvxz|~}{{{}}{yxxz{~}{wtqsw}~zvsrrrtvxy{|}~~~}~~}|{|}}zwvuw{}zyxxyyz{||}}}}}}~~~~~~~~}}|zyxwwxzzzyxwwwxz|~~|zxxz|~|{zz{{||}}}}}}~~~~~~}|{z{{}~~~}|{{|}~}{yvtrrsvz}}{yxwwwxyzz{{||}}~}}}}~}}|}~~|zxvuvy|~|{{z{{{|||||||}}}}}}~~~~~~~~~~~~}}|{zyxwwwxzzzzyyxyz{}}{yxxz}~}||||||}}}}}}}}}~~~~~~}}|{zzz{}~~~}|||}~~|zxvtsstw{~~}{zyyyyzz{{|||}}~~~}|||}~~~~~~|{ywvvwz}~}||{{||||||||||}}}}}}}}}}}}}}}}||{zyxwvwwxz{{{zzzz{|~~|zyxy{~~}}}}}}}}}}}}}}}}~~~~~~~~~~~}|{zzyyz{}~~~~}}}~~|{ywutstvy|~}|{{zz{{{|||}}}~~~}|{{|}~}{yxwvwx{~~}}|||||||||||||||}}}}}}}}}}}||{{zyxwwvwxyz{|||{{|}~~|{yxyz|~~}}}}}}}}}}}}}}}~~~~~~~~~~~~}}|{{zyyyz|~~~}}||{zyxwvutttuwy}~}|||{{{{||}}}~~~~~zy|svz}~|~~zwwwy{~~||{{{{|||||||||}}}~|ww~}vsrsttuwxyz{{||||}~~}|{zzz{}{xx}}zwvvuuuuuuuuvxyz{{|||}}~~|{zxwwxy{~|xww{|zyxxxxxwwwwvvvwxy{|}}~~~~~}|{{|}|ywuuw{|zywwvvvvvvvvuuuuutuuvwxyz{{||||}}~~~}zvtuwz}}{zxxwwvvvvwwwxxxyyxvtux|{yxy{}~}|||}}~zz~}||{{zyyxxwwwwxxyz{{zxuw||zxyz{||}~yw|zqpqtx}~|{{zzyyzzzzzzzzzzzzzz{{{{{zxvuwz{zyxy||uoosy{zy{~}|{zyxxxxxxxxyyyzzzz{{{{{{{{{zzxwustvz}zvrprw}~|zzyyxxwwwwwwwwwxxxyyyzzzzzzzzzzyyxwwwwxy{}~}{z{|~|{zyyxxxwwwwwwwwxxxxyyyyzzzyyyyyyz{}~~~}|{z{}~}xustvy|~~~}|{{zzzyyyxxxxxxxyyyyyxxxxxyz|}~}|{zyyz|~{xtrqqtw{~~}}||{{zzzyyyxxxxwwwxyz{}~~~~}}|{zzz{|~|ywtrqrtx{~~~}||{zyyxxwwxxz{|}~~~~~~~~~~~~~~~}}|{{{{}~}}}~|zwusrsux{~}|{zyyyzz||}~~}}}}}}}}~~~~~~~~~~}}|{{{|~~}||{{|~}{yvtssux{~~}}}~~~~~~}}}}||}}}}}~~~~~}}{zzyyz{||||{{|}~|zwusstvy|~~}}}|||}}}}}~~~~~}|{zxwuutuwy|~~|ywtsrsvz~~~}}}}}}}}~~~~~~~~~~~}||{zxwvuttuwz}~|yxvvvwz}~~~~~~~~~~~}}}}||{{zyxxwwxxyz{||}~~|zyxxy|~~~}}}|||{zzyyxxxxyz|}~~~|{zzz{|}~~|zxwwx{~~~}|{{zyyxxwxxy{|~~}{zyxwwxyz|}~~|zxwwxz}~}|{zyxxxxyz{|~~}||{zyxxwvvwxz|}~~|zxwwxz}~}{zzyyz{|}~~~}}||{{{zzyyxxwwwwxz|}~|zyxwxy{~~~}}~~~}}|||{{{{{{zzzzyyyxwwwwxz{}~~|zxwvvwx{}~}}||{{{{{{{{{{{{{zzzyyxxwwwxyz|~}zxvtsstvy|~}}||{{{{{{{{{{{{{{{{{zzyyxxwwwxy{}~|zxvutstvy|~}}|||{{{{{{{{{{{{{{{{zzzyyxxxyyz|}~}|{zyyxxyz|~~~}}|||||{{{{{{{{{{{{{{{{{{{{{{zz{|}~~}|zyyyz{~~~}}||||{{{{{{{{{{|||}}}}}||{{zzz{|~~|zywwwxy|~~~}}|||{{{{|||}}~~~~~}}}||{{zzzz{|}~|zywvvvwx{}~~}}}}}}}}~~~~~~~~~}}}}}||{{zzzz{{}~~}{zxwvvvwxz}~~~~~~~~}}}}}}|||{{zzzzz{{}~}|{zxwvvvvxz|~~~~~~~~~}}}}}}||{{zzyyxxyz{|}~~}|{zxwvvvvwy{~~~~~~~~}}}}}}||{{zzyxxwwwxyz|~}|{zxwvvuvwy{~~~~~~}}}}}|||{{zzyyxxwwxxy{}~}|{zyxwvwwxz|~~~}}}}|||{{{zzzzyyyzzz{{|}~~}}|{zyxxxxyz|~~~}}}||{{{{{{{{{||||||||||||}~~}|{zyxxxxz{}~}}||||||||}}}~~~~~~}}||{{{{{|}~~}|{zyxxxxy{|~~}}}}}}~~~~}}||{{zzzzz{|}~~}|{zyxwwxyz|~~~}}}||{{zzzyzz{|}~~}|{zyxxwwwxy{|~~~~}}}|||{{zzzyyyzz{|~~}|{zyxwvvvwxy{}~~~}}}}||||{{zzzyyyzz{|}~~}|{zyxwvvuvvwy{}~~~~}}}}||||{{zzzyyyzz{|~~~}|{zyxwvvvvwxz|~~~~~~}}}}|||{{{zzzzzzz{|}~~~}|{{zyyxxxxxyz{}~~~~}}}}|||||{{{{{{{{{|}~~~}}|||{zzyyyyyz{|~~~~~}}}}}}}}||||{{{{{{||}~~~}|{zzyyxyyz{}~~~~~~~~~}}}|||{{{{{{{|}~~~}|{zyyxxxxyz|~~~~~}}}||{{{{zz{{||}~~}|{zzyxxwxxyz{}~~~}}}|||{{{zzzz{{|}}~~}||{zyxxwwwxxy{}~~~~~}}}|||{{zzzzzzz{|}~~}}|{{zyxxwwwwxyz|~~~~}}}|||{{zzzyyyzz{|}~~~}}|{zzyxxwwwwxyz|~~~~}}|||{{{zzzzzzz{|}~~~}||{zzyxxwwwxxy{|~~~~}}}|||{{{{{{{{{||}~~~}}||{{zyyxxxxxxyz|}~~~}}}}}}}||||||||||}~~~~~}}||{zzyyxxxxxyz{}~~~~~~~~~}}}}||||||}}~~~}}||{{zyyxxxxxyz{|~~~~}}}|||||||}}~~~~}||{zzyyxxxxxxyz{}~~~}}}|||{{{{||}~~~~}}||{zzyxxxwwwxyz{|~~~~}}|||{{{{{{|}}~~~~}}|{{zyyxxwwwwwxyz|}~~}}}|||{{{{{{||}~~~}}||{zzyxxwwwwwwxyz|}~~~}}}|||{{{{{{||}~~~}}||{{zyyxxwwwwwxxy{|~~~~}}}|||{{{{{{||}~~~~}}||{{zzyyxxxxxxxyz{|~~~~}}}||||{{||||}~~~~~}}}||{{{zzyyyyxxxyyz{|}~~~~}}}|||||||||}}~~~~~}}}}||{{{zzyyyyyyyz{|}~~~~}}|||||{|||}}~~~~}}}||{{zzyyyxxxyyz{|~~~~}}||||{{{|||}}~~~~}}||{{zzyyxxxxxyz{|}~~~}}}|||{{{{{|||}~~~~~}}||{zzyyyxxxxxyyz{}~~~}}}|||{{{{{{||}}~~~}}||{{{{{||}}~~}{z|~{{|}}~~~}||{{zz{{}~|{x|xrxy{{|||}~~~}z{|||}}~~~~~~~~~~~~~yuw~urrtuvxyz{|}~~}{z{~~}}}}}~~~~yutx}wsrqrstuwxz{|~~}{zz{~~~~~~}yvtuy}~{wusssstuwxy{|}~}|{{{|~}zwutux|~|ywuttttuvxyz{}~~}|{{|~|ywutux{~{ywvuuuuvwxy{|}~~}||{|}|zwutuwz~}zxwvuuuvwxyz{|}~~}|{|}|zwuttvz}~{yxwvvvvwxyz{|}~~}|{{|~~|zwuttvy|}{yxwvvwwxyz{|}~~}|{{|~|zxvttux{~~|zyxwwwxxyz{|}~~~}|{{|}~}zxvutuwz~}|zyxxxxyyz{|}~~~~}|{{|}~}{xvutuwz}}{zyyxyyyz{||}~~~}|{{|}~}{ywvuuwy}~|{zyyyyyz{{|}~~~~}||{||~}{yxvuuwy|}|{zyyyzzz{|}}~~~~}||{||}~|zxwvuvy{~~}|{zzzzz{{||}~~~}}|{{|}~~|zxwvuvx{}~}|{zzzz{{||}}~~~}}|{{|}~~|zxwvuvwz}}|{{zzz{{||}}~~~~}}|{{{|~~|zxwvuvwy|~}||{{{{{||}}~~~~}}|{{{|}~|zywvuvwy{~~}||{{{{||}}}~~~~}}||{{|}~~|{ywvuvvxz}~}|||||||}}}~~~~~}}||{{|}~~|{yxvvvvxz}~}}|||||||}}~~~~~}}|||||}~~|{yxwvvvwy|~~}}||||||}}}~~~~~}}||||}~~|{yxwvvvwy{~~}}|||||}}}~~~~~}}||||}~~|{zxwvvvwx{}~}}}}}}}}}~~~~~~}}|||}}~|{zxwvvvwxz|~~}}}}}}}~~~~~~~}}||||}~~|{zxwvvvvxz|~~~}}}}~~~~~~~}}||||}~~}|{zxwvvvvwy{~~~~~~~~~~~~~}}||||}}~}|{zywwvvvwy{}~~~~~~~~~}}|||||}~~}|{zyxwvvvwyz}~~~~~~~}}|||||}~~}|{zyxwvvvwxz|~~~~~}}|||||}~~}|{zyxwwvvwxz|~~~~~~~}}|||||}~~~}|{zyxwwwwxz{~~~~~}}|||||}}~~~}|{zyxwwwwxy{}~~~~}}||||||}~~~}|{zyxwwwwxyz|~~~~~}}||||||}~~~}|{zyxwwwwwyz|~~~~~}}||||||}}~~}}|{zyxwwwwwxz{}~~~~}}}||||||}~~~}|{zyxwwwwwxy{}~~~~}}}||||||}~~}}|{zyxxwwwwxy{|~~~~~}}}||||||}~~}}|{zyxxwwwwxyz|~~~~}}}}|||||}~~~}}|{zyxxwwwwxxz{}~~~~}}}|||||}~~~~}||{zyyxwwwwwxy{}~~~~}}}}||||}}~~~}||{zyyxwwwwwxy{|~~~~}}}}||||}}~~~}||{zyyxwwwwwxyz|~~~~~}}}||||}}~~~}||{zyyxwwwwwxyz|}~~~~}}}|||||}~~~~}}||{zyyxxwwwwxyz{}~~~~}}}|||||}}~~~~}||{zzyxxwwwwxxz{}~~~~~}}}|||||}}~~~}}||{zzyxxwwwwxxy{|~~~~}}}}||||}}~~~~}}||{zzyyxxwwwxxyz|~~~~}}}}||||}}~~~~}}||{{zyyxxwwwxxyz|}~~~~}}}|||||}}~~~}}||{{zyyxxwwwwxyz{}~~~~~}}}|||||}}~~~}}||{{zyyxxxwwwxyz{|~~~~~}}}|||||}}~~~~}}||{{zzyxxxwwwxxy{|}~~~~}}}||||||}}~~~}}||{{zzyxxxwwwxxyz|}~~~}}}}|||||}}~~~}}||{{zzyxxxwwwxxyz{}~~~~~}}}|||||}}~~~}}||{{zzyyxxwwwxxyz{|~~~~~}}}}||||}}~~~~}}||{{zzyyxxwwwxxyz{|}~~~}}}}|||}}}~~~~}}||{{zzyyyxwwwwxyz{|}~~|||~~}||}}}|{{z{}{yy|}xutvz}}{yxxxyyxvttuwxwvwz|z}~{xwvvwy|~{}}}~~|ywwzwux|~~~~~~~|{}}xtrsuwxxxyz{}}xy}xuuvwz|yst~~{u~}yyyyxwwvuuw~wsz}|xzyvxz|||zvw~|w{~zy|~{z}x|{{x{uu~ww~~u}~zz||spqwqw{y|~}~|xx||}~}{wxzyq}yy~{}xztsztvxoxutypn~~vwz{}x{{{~}~}xt{}yyuuw~xx{wvwtorzopwmy~|vkfjv|}x|qryv}{~w{qw}{xyz}}uznednvjgilsyprwzxz{|y|rs~|t}}wrrux|}yvxpizur~{ys|}xr{ut|xy}on}vwqttsu}unxw}{slw{wwu{~yy|}y{zvu{|{z}sar{ou|qhekt~z{}~v~|xuu}~z}rmq~v{xmkkffwxjmjmuyvq~xs}yw}||}ytw~~zgoxoopxzuvyt|vzyx|~|~x}sq}}{{v|pxxuwhhovwxtozw~vz~z|r~v}x{zqmprtszqpsoxv~~{yxy~xzvz||~wv~z}zml}wx}~{wkuvsxqwvnqq|xrxoz|}v|~zuxs{yxouqpjx|q~y{wzz{z~|t}~vwwww|~|~||~xy{~z|x~ut{{y{}}wtwqt|zwpwtx~ru{ywuy~tutu|rurnlnuu|x}wz{}|zy|}z{~x}|y{z{zv|uyu|{tx}~vwz}uv}{omqz|quzyqy{r}vrz~{|z~|wyyxutumwxz||~~}xwx{s|y}w}yr~~u{y}{}{z{s||~zznv{~|tywxsyxsy}wsy~{|~y~t{zy{u{}rpuvqjwzvw|wz{zz~w}~{y{x{z~|yx{vz}~{po}}y|~{u{{xmsw|tp}{xuzprwwv~~~|{|x{zx}zrsywlozy{}y|z}}w|~~}|s{~}v~u{~vzxsvxwsywyqu~~tzzqv|{xw~}|{~|{}}w|syxruupsvtokw{}t~}}u~}|}qr}vwx~|{||rv~|}tq|{lx{xvsw|zz}uywvw}{y|v~~y{zsqxvspz{}~~|{u|||~zz~|y~}~~ut}x{z{}zy{vuy{zsuzw{wytxqz{}wy{}rx|{{zzxrqsrqmz{w|}}zz}{~y}|}vsxzvuxz}y~{uu~~ztz||ryyxrq|vz~xytyw}{y{{}}yqwysqp{zz{v{|yz}x|w}wzxwyzuy{}yy~{yz}t~yzuvzyzzxz}uv}}}}{|zx{wxx|{qoxwrkrvwvz|}~|x}w}~}~zttwxrzxxxw}zwyvz||wvzwwuyv|y~~{x}}~~~{||~{y{}qt{ytluw}xzz}yz{t}z|}}{~wxxws|xxwz{z{~|y~{xx}w}x~}|z{z{}}z}wzzyxuv~{opxvpkutz}t~}}{|z~x{}|z{wwutpxwwvt|ywz~~||zx|ww|x~y{}~{zv||ywxsnw{vmwyzx~|}}w|yz}~yzy|}wytrpx{w{r~}~w||xz}||y~~}{w{~~wwzxyxur{wjovvprxt~yz||{z{z~~~zz~xwtpnq|vytu}~}zz~zv~{v~{x}}y{~}w~{zxvxrnvxuqzx||~}}~v}zy}~z}}|~{x|zvwronw|w|s}~{x{x|y~~|vz}zu{yvsrw{nmsusqyw}}}|y~z~}|~~~}~|yw||tsvpllwwy|r~}~xyxy{~}{~{yz{{|{xut{yortvtz}}|yxx|}zyz~z}~~}x{{yuw{xtvtplr{wwzx}x~|{~~|wz||}w}{zvsru~}qnrttv~y|}{{|w~}||~~||y{zvvzxrtvpkmyw|wt~zyz~~y|~yy~{~|}{wtwupsuwx|||x}v{~}z{}{{}|}w~xywuuzyqqvsmnyw|{t~y}z}~yx}~~|z|x{yuru}}snpstw~y~}}}zw|~~|}{}|}y~wwwuvzwoqurmoxtzwt|~~x~}z|zz{}~x|{xux}urrsu{z{||w{|{y}|x~||{z|wvvuy{tnsvrnswu}uw}{z~x{}~u{uzyuu{~xrqpqs~}|zxzx{}|||z|~}~}xuuwzyqnstpnusvzqx~|~~z~y~z||v|w|{wx~zusrsx}{yxxz{{}{x{~~~{}~|wtsv{ypnrtqovswzr{}|~y~~{|~zu|uyywx}}xtrpqv{~yz{yz{{~y~}}}xtsuzyqmqsqpvrtxqy{|}{y}}{vwy{yy~zvusrv~~{z}yyzz|yz~~~}}}~z{zztqsxyrlostqvtszsw~|}~~}}|zzwyuwyxz~{uusqr{{|}|}{yzz|~x}}~z|x{xsquzvnmpssuwqxws|}{|{~~~yw~xwzyz~~ywwtsw}{zyyy|{x~{|z}~v~|vyuqqvxsmnqstyvs{uv~|~~}~~~}w~v}}vtwxz~|wvurry}|~~|~zyzz~{y|}||uzvytprwwpkmqsuztuzsy~|~~}zz{z~|vuxz~{wwvtv}{|yxy{~~yyy~y|{~txtuvqosvsmlorv{zs{xv}~}~~|v~~x{|xsux{~|wvwutz}~}~~|yyz~}y}|{{|xsxrvtprvtnknqtz|tyyt|~|~~x}z}||vuy}~yxyxvz~~~}~}zxy}~}}y{x{x|{~zp|{qtuqqutolmptz~vyzt||}w|}z}y{wsv{}xvxwuy|}~~~~~{yz~~}~z{y|y|{yq}{rsurrutnlmpt{}tyxs{||~}x~||y{xtw}~yxyyx||}}}zyz~|{}z{|zzx{}zus|yqrursurmlmpu}{uzuu}}}~yy~x~~wzwsw~{wwxwx}{|~|~{z|||~|{zz}{~sw|xqrututpllmqw~wvyrv}~|}~~~x|}xx{yuz{xyzz{~y~~~{z}~z{}|{~}yx{y}}svzwqquuusollmpx~vxyrw~}~|w||x~wzyux{xxyy{}w}|~~|{~~{{~~}~zz{~z~~twyxspuwvtpllmpv}wxzru||~~|z|}u}uuxtu|~zxwxz|~x|~~}~{~|~~||{x|xwx{~~yz}rsutrlntuusqrpnq{pytu}}{|{{z}~wzyux}|xvxy{{x~{|}wuy}}zxy}~{y}}zz{~|yyswuvrntxwsmjikr}{~zsy~~|z{ztpuup{}urvuty|zwxy{~x{}|~z|{|z|~|z~|}~~||}~yvz|xpifhnxxqvyz{||yx}|~~|y{xzx}|{}~~yx}x}~yusuyztu}vs{}zwvvwz|zv{{svvsupntwsmjkns{yy}||}~}uvypu|wpquttxxvvxz}yw}}}|yz}{{y{~~~~{zzxrrwuoihkqywz|}}|{{y}~}}{|~~|y{x}x|}xy}x~zutv{|ruusz~~|ywvvvyzwv|xsxuruqntxtnlmpv~~z|}||}~|w{wqy}wqrwwvxxwwy|w{~z~{|}|{}|{}}zz~~~z}wxwqsxtmijnu~}|~}{{||}z|{~~}~~z}wzy{z}w{}xvw|ur~ysw|~~|ywvvvwxvu|ysyvrtuqsywqmmpu}}|}~|{{{}{yt|}ztrwzxvvwxz}}w||x~z{}y~|{~{||~}~||wxytuyunjknu}}}{{~{z~||~|}{z}}y|{z~~}yv}~}~zy|}sy}wux|}|ywwwvvvutz{txztquvsuyvpnorx|y}||ywx|x|~{vt{}yuvwy|xy|vx|z}~~{y~|}|}{~~}||{zvxzvvyuollouyw~{}z|}||}~{|yy|z}{}}~~|yv|{z|}|~w{|yxxz|{ywwwwvtssz{ty{vqswvuxxspprwzv}~{}ywvy~{~~{vy}wuwz|zz}vv}}{|}{~y~{{~~}}~}{y{~}wvyzwvwsonotxvz}}{}}~z}{~zyy}}|~}|}|zzwy|zy|~~|{}yzzyz{zxwxxwusqt|xt{{ursxxvwwtrruzyw~~z}~|{{~}}yx~~wsvz}z{~vu{~{yzx{}~}|}}}{~~}~~~}zwv{xy~{usv{{xvvpsroyx|~y}xzzy|{~{}|z}|}~tx~zvux}~~|zy}|z{|{zzzywtqqxysx|xsqtxurtxyyz|}x~~{sv}wuw{z{~}{x{}wvy~}{zuy~|zz{}|tw~}}{~wtuuonsx{|}~xv~{~}yx{{|}z}}}wx~wy~|~}}{to{~|}{xx{{wx|tsyyvvvvvvwwuroqywsy{wrorwwsuy{|~z|w~|usy}vz}{z{ywz~{uux}y}~vuy~}zyzz|~zt{}|}|}vqpstpouz}{~~}zwx}{x{y{~~~zw~{x{}}|zzwqv~{z||wywrx{xuuuuvwwvspqxvry|xtqrwyusw|~{|y}{wtv}~x}|{||zz}|xvy~}z~vvy}~|zz{{{|zv{}~{~}}wsrvvpnsy}~}~}yxz{w|x~~~x{|{z{}zyvtyz|}~~zx~utz|xttuvwxwuqqvwrv|{wtruyztrv|{~{}yxvvz~~~{}}}~|{}|yw{z}yuwz}}|zz{|{zzzz}|~~}~||{|xttwwpmqx}|}zy|zw}y~~~~|y~}z}{z}|ywwwxvyzywtx}zustvwxxurrwvqv|{xvtuy{wrtzz~~|}xyxuw{}~~~|{}}z{~~z|{vwz{|{zy{||yxy|}y{~}}}}{z|}yvtvxuont|||{|~yz{|~~~}y|zz}{y|~~~}yvuwzwt|~x|wuy}{ustvwxwurtxtqy}{xvuvy{xsu|{~}{zuxyvvz~~{}}|~}y}{wxz{{zyy{|{xwx}yy}~~~|}}{xy}yvttvwspt|~||{z~}~~}~y{zx|~{z~~||||yuru{{txzy{wwz}ytsuwxxvttxwqu{}}}~~~{z|}~~~}z|xqrxzxz~}~|{~||zvw}zttwy{{yxw{|qqu}~z}|~~}|y}}ywy{|yz|yy|~~{y}|{}|{{}~}zxz|rnsyywz~}}~|yvux|~zuqt|}uy|~|{~{z{~{suy||xxxvtx{}|}}|zz}}y{{tuzzwx|}|zwspos{}wv{}sqz~|{}|}}~{{}}{|zsw}~}|}~}z||wttxzy}{z||wsuxyyyxxx|{|zzzywttvy||yuv~xv~~}z{|tnry|~{y}}y}~ywz~|zz|~{yz|zwz}ww{}ywy~~zywtqoorx}~|~xv|~|{|~~y~}}~{z|~~|{~wty}}}~~~||{wuvwuu~}~zvwyzyyxwy||z}{z{zxussvy{zww|~wz~~||zqqwyy{~~z|{vx{~~}zz{|~~}~}}}~}{z{zuv~ywz}~yvy}~|{zxuqoorwz||}{|~}}~zz~~|{~~zy{||{}|tv{|{{}~~~~|xwwuqt~}}~yxz{{yxw{z~~~y~~zz{zwtrsuxyxww~z{~~~}~{rswxxy|~{~|wx{}}|zz{|}||~{z}}~{zzytu|~ywy}}xw{~|{{yvrooquxzz|~{y}~{{~|yyzzz{}uty{{z{}~~~zxwvrqy~|}yy|||zxy~|{~{yzyyzxusqsuwxwwz~}~}}}||xqtxxxz}}}{wy{}}|zz{||||zz}|~}zzzwsv}~yxy|~zx{~{zzxurooquxz{}|z}~~{y{~}zxxxxz~}usx{{{|~~}~zxwvsqx}}}z{}}|zz~}z~y|{wxyxusqqtwyxxy~|{zy{~zqqvyy{~~|yyz|}|{{{|}|{}}x}||~}{yyxtt{{xy{~~zy}~zxxwurooquy{|}}z~}}~}zy|}|xwwwy}}vrvz{{|~}~zxwwtrx~~{z}~}{{}zz|~yvwxwurqqtwxxxz~~{yxy|~wr}}zy{~zuv~z{}~~~{{~}yuw~~yvvx{}|xx{z}}z{||zxvuwyzyxy||y~~wr{zvvwxxwwz}ww~~}||x{~{|}~zy~}~~z|~ywxzzxvttvwwvttwxv{~{z{{vt}}{zxwwz~|uu~~zz|}~}}~~|{~|{|x|}{{|}}~}~{|}}~|z||wuwyyxvtuvxwvuwzzx~}xvvyyuu}}ywvy}~yrt~|z{}~~~~}}|}|z~}}~{{}|zz}|x{~}|z|~zuuwxxvuttvvuttwyuu}{wuw{xsw~{{}ysx{y{||||}~~}{|~z}~yz~{{{|}|yy{{{||x}}|{~zuuwyywvuvwxwvwz{ww~{vuwzwrv~|zy|~wrw~}zz{}}}}~~}~|z|}}}~~zy{{{}~zv{|yz~yttvxwvttuvvutuyytt}~|wuw{xsv}|~{tw~~{z{|||{|}~}{|{}~yy{{{{|~~zwxyz|~|w{~{z|vuwyyxvuvwwwvwz|wu}}|~|wtuyxst||{{~|uu{}{z{||||}~}}}|z~}}}}~}xwxy{~}xxzx{wtuwwwuttuuuttwzxsw}}~zvuxzvt{~}{vz~}{{{||{{|}~}|{}~}}x{~{{{z{|~}yuuwy||y~zy}wuwxyxvvvwwvuw{|xv}}zz|{wstxxuv~}||}}xvz}{{{|}|||~~}}}z~}||||~}yutvy}|z|wy{utvwwvuttutssuzzvw~}zz|zvsvzzw{~~~yy}}{{|||{{{|}}|z{zy{zzzyz{|zursuz|{x}zvvwxxwvvvvutvz}{x|}ywxywsswzwx~}|}~{y{}{{|}}}||}~~||}z}~||{{z{||xtrsx}~}}wx|vtuwwvuttttssv{{wx{xwyyvtx{zy~}{|}{z{|}|{{{|}|{z}}y{}zyyyxxz{xtqqv}}zxyvvxxwvvvvutux|}zy~{wuvwvtvyxw|~~~~~|z|}{y{|}}|{|}~~||~z||{{zyyz{zvrqu||yw~yuuvvvuttttssv{{ww}|xvwxxwx{yx}}|~~zy{|}|{z{|||{{~|y{|zyyxwwxzyuqqu|~|zyzwwwxwvvvvutuy}|xy~zvtuwwvxyuv}~}{}}xx{}}|{{|}~}|}|{|{{zzyyz{yurrw~{|~xz}xvvvvuuuuussuz|xuy{wuwyyz{xux}}|xx{}}|{z{|||{}}~yz}zyyxxwwxyxtqrx~}z|z}~zxwwwwvwwvuux|}yw{}zvtuwxyzvsv~~{||wx{}}|{{|}}|}~~{|~{zzzyxxyzyvrsx}|y|~y|}zwvvvuuuuuttv{{wuy~{wuuwz||xtw~}}~xwz|}|{{{||{{~}}yz~zxxxwwvvxxvrrv||z{|}|zxxwwwwwvuuw|}ywz~}{wssuxz|xst{|{yvx{}||{{|}||~~|z|zyyyxwwwxxurtz}{{|{~}zxvvuuuuutsux|zvw|}zvstw{~}wuz|}~xwz|}|{{{|{{|~~|y{|yxxwvuuuvwvsrv||{~}~}{yxwvvwwvuux|~zx{~~}}|zwsqrv{~{vv||z~|wwz|}|{{||||~|z}|yxxxwvuuvwvtty}}||}}|zxvuuuuutstw||yw{~~}|zwsrsx~|xz|{{wxz||{{{{{{{~~}yy~}ywvvuutssuvutv{}}~~~}{xwvvvvvuuw{~|y{~~}}||{zwspptzyw||z|xvx{||{{{|||}|y}|ywwwvutstvvuvy}}}}~~||{xvuttuuttuy}}yy}~~~}}|{yvsqsy}y|{|{wwz||{{{{{{|~{xz|xvvuttsrrtuvvy|}}}~}{xwvuvvvuvy~~{y}~}||{{zxvrpqv~}yz~zz|wvy{|{{{{{{}|y{}ywvvvutsstvwwy|||~}{||zxuttuuutuy}}yx|~~}}||{ywtrrx~z|{|}xwy{{{{{{{{|~zx{{wvuutssrrsuwxz{z{~|}~|ywvvvvvvw{~}yy~~~}||{zyxvsqrx{x{}z||wwy{{{{||{|~~zz~{xwvvutsrstvxz{zx{|{|}{xvuuuuuux{}ywy~~}}||{zyvtrt{zy~}{|xwyz{{||{{|}{xy~}yvuuutsrqrsvxzzxvz|{}~|ywvvwvvwy}}zxz~}||{{zyxusqsy~yy}|{|xwxz{||||{}~|y{~ywvvvutsrrtwz|{wvz{z|}|yvuuuuuvy||xvy~~}||{{zywtstz{z~}|~zxxy{{||{{|}{xy~}yvuuutsrqqruy||xux}z|~~{xwvvvvwy}~zwz~}||{{zyxvtssw|~{z}}{}{xwxz{|||{|~~yy}{xvvuutsrqrtx|~{vv}zy|}|yvuuuuuw{}{ww{~~}||{{zyxvutv{~|}||~zxwyz{||{{}~zwz~|xuuttssrppruz~~yuy}z{}~|ywvvvvwz}~{xz~~}{{zzyxwvuttw|~}|~{}}ywwxz{||||~zx{|xvuttssrqqsw|yw{{xz|}{xvuuuuwz}}yx{}|{{zzyyxwvuvz~~}{|ywwxz{||{||xx|}xutsssrqppqsx~~xxzy{}}{xvvvvwy}|yz~}~|{zzyyxwvuuuw{~~~~{|~{xvwxz{|||~zxz{wuttssrqpqrv||x|{xy{|{xvuuuux{~}zy|}}}{zzzyyxwvvvx{~~||}zwvwy{|||~{wy}~{wtssrrqqppquz}xz~yy{}}{xwvvvx|~{y|~}|~{zyyyxwvvvvwz}}}|{~}{xvwy{|||~|xz~|xutsssrqppquz~yz~yxy||zxvuuuw{~}zx{~||}{zzzyyxwwwwy{}|}}}~{xvwxz|||~{xz}~{wtssrrrqppquz}xz~zyz|}{ywvvwy}}yy|}{|}{zyyyxwvvvwy{{z{|~~~{xvwy{||}{y|~zwuttssrqpprv|{x{|yxz||{ywvvwz}~zxy}~{z}|{zzzyxwwwwy{|zy|~}~|xvwy{||~~zz}|xutsssrqppprw}~zx|}zyz|}|zxwwx{~~zxz~~{z~|zzyyyxwvvwy{{yw{~}~~~|yvwy{||~||~~{wtrrrqqponorw}zx{}}}{xustvy|}{vstx{~yvuw~|y{pow{}|zvtw}}yusuz}}{zyyy|~}}}vpmpvywrnllmpuyyvw}}y|~zxvutrrsvyzy{}~}~~yxyxwtsrrsuwy}~zy|||{|}|xxy|}{yz~yxywwvsqoopqpmlq{yw~~}yvvz}}zw}vz|}~}uqu{{x}umuwtsssv|}}}{{}}wz}rw~xuv{z{xs}zuzustx}|~}zv|pvxpqppry{wvuss||z|~}}~x}{uxxzyx|{uvxyzy~}{wsrrr}~}~|vuxs}trromqxtllnnmzx|x~~z{y|~z{z~vtxxuv}zuz~z}xxs}xvvxus~{|yx|y{~zv}uyu{~y~}||z}~~v}}{|yyy|~}v{svrzztvz|tv}xt{|y|z~sux}w}}{{{yz{|t}}vu|vss~~uy|}uxyxyxyooqxsmuytst}y~||{{}~{z|~}zxpsw}vs|~{}w{~ysq~}}|~}z||{xwyvvvvuz|}|~{{~y~|}~{|~}{wvtust~|yrz~uuz}|y|}y|zx~zxxy}}{xy|w~~~w|ynry}y||yw~wy{|yrxvsmszsswxvr|z}{|~~}}v}}|~wu{xtoy~z}{z}{|vu{z|{~~}y|yu|x~yzvz{w|~~~z{}~v{|{}~|}|~||}~{~yyt{vtw|{sw|zy|}z}x|xvz{xszvzz}~|~~{}~xqx|zy}||z{zyruywyw~vstzxrx{uswz|z{{{}||zz|~}~}z}vuvzuv~}z~}yzx||{y{v{}{vyy}zw~}zw}~||~{~yy{}~x|ywvzxts||vxxzuz}z~}|}x}zy{xzxz{z|}{~}|uv{xuxxxs}}~zx}z~wxsu|yus|{pry}x{|z}}{}z}~~~{y{uz}yst~|u{~{{~y~~z~~w}}{w|zz{{wv|uywzz~~|~x{z|~zw}|~{||w{x~xx||vzzz}~{~y~y}zsx}zt}z~{{~|~~|{}zsyywz~x}~x}yvyw}upv{zvxytww~}||}~x~~}|v}xztrups|upxxxz{xxvwtzzv}}{x~{upz{xv}~y}{}~{|yy}{w}}~|zv~|~}~~~{t}{xvz~z}}{y}|y|vs{}t{qzy{|x~~}v|{t~zyw{zv}v|~yyry{|nz|{wvvx}}}ryux}}y~ux~~}}}y~||s~mtsswu|y}|zy}~{}}tzz{zsu{y{{}|x|}}~uyyw~~~~|}xxxzwxzx}{}||{z}zvt}{y}{}}vz|{{vywwr{wy~|~{zx{|}yw~|{}y{z|vw||uz{z}vx|{}z|{|zz|~xy{y}}}v|~{{{wsyyt{yy~}z|z~z~w~~{w}{wvyz}~zy}~}z~~{~|vz{w~~{}~~zv~yryxy{{{~yyzyyy~}uy~yw~|~|{~~|{~{}uv{yv{zu{}~~~~}}yyuv~y{vyz}z~t}z}|~z{|z|zyxwvuwyuw|y|}}~~{zy~{x}xy~~{{~xz{wv{~|||{|~z}{}}v|}y~~ww~~}|}}y|z{{|~{}x|}z||{vwtr{~{z|}~|{|~}{|xz|tw}y~{{{}}zx~|{y{z{~vz~|yyz||}~~{|z}{x~zy|suzut|{v}|x||u||z|{~}|}zw}~{x|}|~}~}yzvwx|x||xtx}y}w~y~{~{|xz}|~x~}w{xqx|vzvw}~~}}|v|{v{xxywvv||}~zz{yw|yz{y~ytz~w~z~{{|{z|}~~{|ywx{tpvttxzzzz}y{~z}~zv}{z||{{|}~~yzwz|{{x}{y|{u{~~{}~z}txxrw|tust||{y~~~}{}}{~zw|wurzzw}{~zz~|z}~y{~{{}~|y}|y}|z{~|}y{wv|wqvvuzv||}~~}y{zy{x}}}x~zy~z{|z~|z~y{~w{vx|zz~|~ws}~}}||x}{x{|x~|uvty}}{~~~|}x~|}z|tqxwwu|zw~zuyw{{wyz}}|xzzyzzxzsw}}~~zx}~xxz|{txvvyyw{yvrw}ww}stut|}~}y~~{}|wvr~z{||{~|uwzurzyuupnvzvx}|vz|{}{y{zus{zzx~y{}}x|yw|~y|~q|uww|yuxzxz~}{}x{}~vvu~vxwt}yxs|~xxuzx{~{~xwy|ysutytz{sy|}~~{vy~xut{{xxyx~xy{{{}ywszyw||xyytpzwrtppy~{~y~~}{~{xyyxvt}y~sw~}{}{|yxwx}zzxxmswxszv{|}||v}}}v}{vv{yr|z~{z~|~}wzw{yoy~}zxsyuy|u|~z}~}~~}|}{x}~w}w}{{yz|}{~{}}}~sv{xxz}{v{y}}wsw}z}~xzww~{~~wxvz~{{ypxy}}z{~y|{||{{xss}sorwus|~z|~{~|~}||ww~}~}u}yys|}~~~~~}{{{yv~yoxy{ruxyy|y}~~z~xyzx}|s|~{{}yx|~~}~|{~~{{w}~~|t|~{vt{vyy|v~}yz~y~w|~xu||~|~w|}{x}yz~}~{}uwz}uzw{ty}xu{xu{x}}{}~x{y||}y}|szzuyty}x}x|zyy~~y|}vtwzs|{|us{|xy{~~{}{{}~usy~zu{w{}~}|{~|x|{}|||x|xyzxpw|{}yzw~~{~}yy}|vzzwuzyz}}|}~zz|suz}{xys{w~zsuz{zzy|}}~}~|w|yu{}}}y~y|~|z}|}}szzyswwwvvs}}ysv||}{z}{{z{{zzzw~z{~}u}x}~~z||zx~~y~}y}~zuyyrty{xv|xx}yz}}||u{wyt~}~~|{yz|w||{wywsyyoszxstz|{{~}}zy~{w{u}}vy||}|~z{|z||v|}}v~{rx{zyzvyw}~~yww}zvvywyzv|}}zy|}yw~z}u}{|{stxztwyxy}|y~~~yuuyxurvmvvwvpsxzx}~}yzzxy{xut|{wv{{~{qw~~~z~x~{}~~ywuy~|uz}|us|vnutqssvzznsywtssz~|~}}|y|zzyt~{w|y{u|zs|yp|}}v{{|}y|}}uvwvx}~{~}|vwqyxvpkuvysu|zvypu}yroor~~xrxxuuxxsyxwzzy}{uyttsxzqyv}~~{xrv~ty{uuzyvwsltxxts}su}rgvksjiqhkhzoprtsv{ys}|}|}wxxvyqsrnwv}}}v~{yvx}~|}z{zw{z|qku}|ynqzrkwrqemtjrovzkv}}|vypw{{~z||{v|}xy|suy{pu~t}}}}wy|x}{}zu}~}qntv|vnpzvyrpjl~{stkvxpy}~v{rv}|yuz}wxy{yxu~|t{xvtw{q~}zy~~t{|~~~~}|uy}~vmomvzzwwyxonoq||urnzvnux}xt{twu}ysv~~|}y~~{yzvvxvuq}{t}~|~{~}{|zy|}|pv}zoqlz~}zy|ytqnnv{qmpx}jlw{ws}qwwsxw~~{~{~u{|zuxwyru|t}w|yv}}~z|wsy{zuurvy~uyzxuritzwjqvytlv{xsztt}uv}{|}~wz~yw~z~{{}{zsrzy~}}|wz{v}~x~~|prw|{uxq~xz|v~usooz}qmxzympwyszztwuysw~{|~}x{~yyz~}}}|xp{x}zy{zz}{~}umvwztttt~{x}wuku{zloxxymqstp{wtv{zvy{}}~{{z}{zzzyzyts}{|~u~}|~x~{{x}pmuywqysy}~w{uunyzvipzwwqrvss~yxr{z~x}y}}x}||{vuzyxry{~{~z}~{{y}ysx~ukprxux}u~uxuwqvzzqjy}wroqwt}~wtt||y|}~|ty{}}}yxvz}yvv{}}{}|}|}zx~~~~uv{qosvvv~vzt{|tryyznvvrpqxuzyvs}y{y{~}|}wz}}~~}vsy}zwt||~z|{y}~{~}{ut{{rmntvu~vz~v|wpx{|rsyrtpuswyyr}{|zy~}}xxz{|||ysx{wur|y~||{y}z{}{|}|utxxqmnruu~v{w~wty|{qrypwsrpx~xxr~}z{|}xxyxxy|}xtx{yut~{|}z~zy|y|}x{|{vuxwroqsqw{t}x~vw{zwqvvpvsrq~{xu~}x{{}~|uyyxyzurxz{uy|y}{z~xz}|~|x~}xtuxwsqopoyxww~wy|{wv|usxrpuz{sx}xu}}{~wxxyz|}sqx|zv}y{|~}{~w~~z~{y|{vsvxwtroopyvx~|yy|zzwx|upyuov~xzsy~wu|}}w}y{{{}}srw{zv|w}~}~z|v|}~x}}{y|ywtuwtsroopztv}zzx{|zxz{~wowwpuy|uzxv~|||xyzzyz~uqvyyu|wz~}~z|vy|{{~{|vyywuvurrsoonwwvz}z|}|yz~~|svysr}{}xwzu{~{yz}{{yxx}yqrxzx}|x|{{}xx{~z}ytuvwttvsrtspotzs}~~~|~{zy~~zrwwpz~{~v|~uv~}{~y}{{yx|~urtxyyw|~x}~|x|z}z}~w}tvwvttsqqtrpnyxx{~}}zx{}yswws}{|zv{tw}|~}}||yxx|{squyz}~w}{x~~{y~y}~y|{}vyrtussurprsqoq{x~}~~~|{y}~{xsywwy}xxyu{~|}{|z|zyy|}wqrvzz||{xz~|xyy~|x~yv|tqqrqstqpstrqy{x~}~|z|{zvuyv~{{}v~uv~}y}~x{{ywz~|usswz}z}}~x{{yx~{{yz~w~|uyqqrrstqnpuuru|w~}~}{z~z{uyy|}y~w|xu|~y{xz{zxy}}wsrux}|}zx{{zy~x}|x~~y{t~|rqqqrtqnpuvst{w~|{z{vvz~ywzzu{~yyyx{yxy}}ytrtw|{~{xzzzy~z|~y~}~yz}u|zuqqqrsrmotvtt{v~||y{xu{~y~w{yv||yyywzzxz}|xtrsw}z}|yzzyy~y{~z}{}xzzw|yuqppstqmosusvyu~|~x{xv~{{|wxx~}|v}vx{zy{}zvtssv{{~yzzy{x|}|~|z~xzx|zwupppttomptuuyuw|~}y}ywy}zy~xzz~tvwzzz}}zwussx{~{}zyyx}x{~yy|yxw}wwuqpqusolotuuysx|~~y}{xz}xz~y{yuwwz{{}}ywussxz|}zxxy~yyxx|zxvwuvqpqtsolosuvyrw{y{}x|~yy~{|y|w}yux{{}}zwvtsv{~|{yxx}{x~}}yw}}zys~zswsppssolnquvztv{{z~z~~{w||zyzz}vvy{}~{xwust|}{|}zxx{~yz}}|uxy{rwstvqoqtrnlosvzys~~|~z{~|~w{}|~}w~y~zuwz|~|ywvtsx~z}|yxy~}x|{~xtz{zxp|{qttporsplmpux}ww}~~y}~}w~}}{x{z~}ytwz|}|ywwutz}{||yxy~~|x~{}~vt{x{up}xpstppssomnrv{~v|}~}z~{x~|~xyy|}|xtvz}~zxxwuv}|{~{yx|}~{yz~|ysu}zxzot~spsrpqsqnnpty|x~|{w|~|}{v}{{~{{vtx|~}yxxwvz}z|~}zxz}}~z|y|~}usy}w{to{yoqtqpsronorw~x~~~z~yy|}|v{|zzzxtuz~}zxxxwy}z}~~{yy~}|~{zy||~wsw}}wzvmx{rossqsspnoqv}z~~~{}|y~{||v{{y{yzuuz~~zxxxxz}y}~~|yy~}{}}{z~{|~wsv||w{vnwzsnrtrsrpnnqv}z}~|}|z}{|{v|zy{xzvty~~zxxxx{{x|~|z{|{}~|{}y|}vsw|zw|toxysnrttsronnqv~y}~|~}{||z~~yw|w|xxzvu{~}yxxxy|xy|}~|{}~{{~~~~{wzuty}~xy{qsxwrnruusqnnorxz|}~}|{~~{}xz{t}~rqtontwusstuxztz~~|~|}}}vt|~~{vrsw{~~{vyxortspkotutrqqpqvyv|}z|~zw|}x}}xywzwuy{yvuvwz{t{|~~{vy}}{yz}~}wu~zvwz}}w{zquvusnpvwtpljkoy~}}wtx}vpsupz~vrvvswzzwwwy{|uy~{}z|{~}|v~|yy{~|x{~|}xv{}yrlhhlv|}|~~|}~}|zxx~{{~w}xy}{{~}|}~}{z~}u|~xuuy}zsyynqy||{wsrsvyzzvv{trwtttoqwwrmklnt}~~|zxvv{}wzuq{|tosurtvvuuvx{yrz|~|{z{|{~~{}v}}{{}}z}~z{xsuyvpjikpx~|{}|}~}|zyx}{zxz{x|~|}~~|y{}v{{wux}~tt|rnu{|{xtrsuwyywuzwqwvsusosyvqnnpu}{}|zyxwzyzzqw~yrpuvuuvvvvx|}vv}~|~z}y}{|yxy~{{}~}{{zyyurvxsmlmrz|}}{|z|~|{yx|}{zxyz~~}y{}v{|xvx~us|tnty{zwtstvwwwuuzwrxvrttqsyxsoprwzz~}zyxw{z}ys{~ztqvywuvvwxz~|uz{~}{}~|}zz}|~yxz}{}~}|y~xxyuswxsnmpu~z}{}zx~|ywy~|}w}y|~~~~~|{|~ww{xy}zryxqrwzzwtstvwwvttzxryxssvurwzvrprv}}zw}~{xvux~~{v}}xsu{zvuvwy{|u{~y|}{~|{|yz~}}|~{~z{~||~~}{}}z~xwyxtvxtonpu||~z}|~}wy~zwvx~z{~z}~|~~|y||uz|z|}|~xwyuuuwyxustwxwvtrwzsw{vrswvuwyvsrtx{xwz{vsswz~~zvx~{vtvx{~}vy~yx~{{zy}x}}z{~~}~|}}~}{}}zzz|ww{zvwxtpoqvxv~}}~|vz~zvuyz|~}{}~{x~zv{ywy~{{wvxwwxwutuxxwurryysy|wsswyvvxwtsuxyv~|z{tomou{~x}}yx}~xstvx{ztv|wv|z|{|~zyz~~{|~|y}}|||zxy|}}{zz{}wox|{xyywtuxyv|~~}}~{|y~yvw{z{}}{}{z}ztuwy{xxz}vx{xwvustvxxvsprvqr}|wvz|ywyyxwy{xw~{rrwzwsoptz{{z~zuux||v|~vux{~}w~|~{{~}~wswwr{{yzxroponorspv}|}}}~z|{xy}zxz}xqx|tsvtrtw}}}||~usyzwuuttvxxvrnnuur|~zxz~~yx{{z{~|y{uuyyupnpuz~y|~~}zz~yvw{~xyytvz}zz}~|~~~}xroswty}{|~yrqsrrtuqt}|{~}~~}{~}zy}xvx|{tw|vuxvttw|}~|}vrx|yutstvxxvrnovts}{yz|y{}}~}z~|xwyzvqpsw{}~~y~~|{~{wx||w}wtvz}{}~}|~||}~{upouus}~|~{tsuvvwtqy{|~|~~~~}|z|~{uvy|zy}yxzxutvz~~||{ru||wsrsvxywsooutqz}{{zz}}y}|~zy{xtrsvy{||y|}~yy|{w~xuvy{}~~~}~||{|~~{upquqq|xuwyzxsr{~{~z}}~~||}{}xvwxz{|~}y}}yuuw{~{xtx}|wrruxzywrptuot}}||}{{y}~{{~~||yvuvxyzz|z}}}~{{~|x||vvwyz{{|~~}}|zz|~}ytrusmt|~~~{y{~}xqv}{y~~{}~||~}}~xwwxxxy{~||{wwy||{yux}}wsruxzywsrvtou|}|||~~{y~~{z}~}|zxyyzyy|{}|~~|}|w|}wwxxyyyz|~~~}}~}~zxz}~}zususmqz|}}~{||uw~|y|~|~||}~~|}zwvvvwwx{~{|yy{z~~xvx||wrsvyzxusuwqpx}}~}~}~}ywxz||z}~~}}|{yy|}x}~~|~}{wtz~xstuvxz|||{}t|~yz|}|yvuxwqu|}}z{}xy|~~}{yy{}~}z{}}}|{{|zx{u{}z{}zyyuuuutssw}~||}|}}~||~{y{~~}ux{{~yz~x}~|~~||}~~|yutvz~~{{|}}}}|{}~}|{yvrqsx}}ty|z{}~~}}}xwxz{yvtvunnw~}|}}yutw{}~yuvxyzzyxy~~|~xv~ytssrrrtx}|}~}zzzrmsz~|{w|zxz}~|{|}~~}~{zz|}}{wutw{~}|{}~}}|zwvsqqruzx|}{{~}}~}|{}~|xvxzywuvxsmrz~}}~{wuvy{{zvx{{{zxx{{~yu{zuttsrqruy}~}~}zz{unrx|~}y}{wy|~~|{{|}}}~{~|zz{}~|yvuvyzy}~{}~~{zxwtrpprw{}}}~{}}}|zz||ywxyywvxyrntz|}}|xvwxwv}|yz}~|zxy~{{}~~vv~~xuuusrqqsvz|}~~}|~{rqvyy{~|~yxz|}}|{zz{{{}{y{z{}~~|ywwxxuv~~}~|~|}{zxurppqtx{||{}|}|yy{{yxxxwwx{wpqwyz{~~|yxxwst}}~{}~{y|~y}}~|uy~{vvvutrpprtwyz}~}|~{rswyxy|}zyz|}}|{zzzzz|{w~|yz}~~|zxxxwtu|~{{~}~}}{{xw|}~~zvuy}|yzz{}~~{xy|}{zzwuyuu{{y~|{}~}}|{}z|w}{zz||z}yz|~zz{}{xyzyxwvvwxxww{{tt~ytrsuz|wty}~}~~|~}}~~|zy}}~~}}}{xzzz}}}}~~xsvzwtuvwvuttuvwwwx~~{z}~{zyz|~wx~}{yyz}~}|su||xwy|}}|{{|{xv{{wwy|~}zwy|~|z{|~{|}}}|{{}~||}~~~~yxyyvsswyyxxxz~|vz}}vw~}}wx}z|~~yxyz}}}zz~}{zz{|}}|xuvzwsvtrsw{|yqutpvvvv{{vw~~xvwzyw{}|{zz|~}|||{zyxxxwwx}~spv{z}{vv{woryzyz}~~~wrqqponnquz~~}||{wssz{xxyyrmt~~~}}~}}{ux~zvtuwx{~|}{yy{}}{}~~~yxxxxyz{{{ywuw|~{|~zywsmjmtyzyz|~wx{|{{|}~~~~{~}w{}}~|}|xxyz|~|z{~|{yyyy{~xvuutrqpqrstux~}~|~|z|~ytx|y~~}|{yxwvvwy~~xy}}{{{zyxxxuru{{xwxz|zxxxxxyz|}~}}}}}~~}~}|zwrnouyyvttxztquyzz{|~~}~~}~{zyyyywsrtvx|}|zwtssx}wttuuussrstuuw}~{|z|~xx}~|z{}}ysx~|{zywvw|~ysrtw{}}}}~~}||{yttz|xvvxy{~|{zywuttuuuuw|~zy{{zvvwvtpmouyywwz}zuuz{{z{|~}zyxuru}~~~}~~}ywwy{}xz~~}|yuqs|}wuvvvutttuwxz}~|yy|~zxz{wrt{|vw}}{yyzzzzzzzyxxy~{uuvvy|~~~~yy~|z{||}|vu}|z{||{zyxyyzz|{wz~zz}|{|xwwwurnnrx{{{~{z||~~~{wv{|yyyxwwyzzwuvy~zy~~~~~{vszzz{{{zxwwwwxz}~||~}~xtw{}}}{x{~|zz{{zzyyyzyyz~|z{{z}|y{|z{||}~~xyzwvvvutttuvwy|{x||{}~{{{zyvsruz}}}zz~~}}~}}}{wv{~{zzyxwxz{yvvy|}wsw|zz{{zyxwvvvw{~xx~~|yvux|~}{}}ytv{~}~~~~~}}|||{{}}yz{{|{vuz{xvvxz{}xu{~xvvvvuuuvwxy||~~{zzzywussw{}||~|wuy|}}}~}~}~}}}~}zy}~~}|{{}{yz||wpr|yvvwxyyzzzzz|~|~~}|ywuvz}}}~~zwz~|}~~~}||{{zyy{~xuwxww{{|{yyzzzz}}}}wv~{yyyyyyyzz{||~{|zvuuuuttsuy~z{~}z|}}}}|{|~~zxzzz}wu||zzzzyxwvvvw{|y}}{yxz}|wy~~|xxyzzzyyz{{{|}z|~|z|{xy~}zxxyyxy{~~|yw}{yyyyyyxyyz|}z}}~{zzyxwussuy|{w{}~~~zx|~{zzzzxxz}~{z~}wrs{|zyyyyyxwvvvx}}yz~|zxwx{~ww{~|}~}|{{zz||xy||yxz}yy}~{xxyyyz{}{vy{xwvvvuuuuvx}|}~zyxxwwvusrsw|}xy~~~~}{{~}~}{xz}}~~}}}|}}{uru{}|{zyyzzzzzyyz}~z}~}|{zxvttw|}xy~~~}yz}~~}|{zzzz}|xy|}{yy~||~zyzzzyz|zvx~~}{{zzzyyyyz}}~||{yyxxwwwvttw|{z}|||~~~~}zz~~{z{||{{|~}~}|{vv{~~}}|{{{{{zyyy{zz~~}|ywwz{wy~|{xz|~~}|{{{{}|z}}{{}{}|yxyyxxxy|~~{x{~}||{yxxxwwwwxz~|~~}{zzyyxxwutv{{z~}zy}|~~~||~|yy}|z{{|{{|}~{wvz}||}|{zzyyxxwwx|zy|~~}|{zyxvtv|}wx|~~{z|~~}|{{|}yz~~|z||yz~}zyzz{{{|~{wx||{{{{yxwwxxxyz~~~}}zyyxwwwvussw~|y|~{{|~}|~~|{}}{z~~||}}}}}~~}~zvvz|{{}~~}||||{{{|}{}~}|{zzyyxvuv|yz~}~{y{}~~}{zzz{~zxz~}|~|~~{zzzyyyz|~}~zx|~|z{}|{zyyyyyz|}|}~{zyyyyyzzxwx|~}}zz|z{}~~~|}}}~{y||{||||||}}z}zy}}{|~~|{{zzzz{~|y{~}}|{zzyxvuyzz}|||yz|~~~}}}~~{}}}}{}~zyyyyxyyz|~|~zy|~{xx{|{yxwwxxy{}|~}|{{zyyyyxvv{|}|y{}{{~~~|~~||}|xx||zzz{{||}~}{xz~~zxz}~}{zzyyyz}zz~~}||{zzyxvuuz{xz}~}}~~}}~{{~~}}}{||zzzzzzz{|~{|~zx{~{vtvyzyxwwwxy{~~|{{zyyyyywvw|}|~zz}z{|~~~~{|}{{|{y{}|||}}}~~|}~zy}}xvy|~~|{zzz{|~z|}|{zzyyyxwvw{|{~}}}|}~~}}~{|~}~~{}}{zzzyyyzz|yz{z}~yuvz||{yxxxy{~|~}||{zzzzzyxx|~}~zy}}zyy{}}}}}~}}}}~}yy~}{{{{|||}~}{|z||wvy}~~|zzzz{~{z|~}}|{{{zzxwy|~|{||~}|}~~~~|}~~}{}{zyyyxxyyz{~y{~zz~}wtux{{zxwwxy{~|~}||{zzzzzyyy|~}}~zy}}{{|}~~~}|~~}||}yy}}{{{{||}}~{~|y{}xvw{~~}{zyyz}|z}~}|{zzyyyyxwxz|{z|~}}}|}~~~{|~~||~|{{{zz{{{|~|y}~zx{yusvy||zyxxy{~}}}|{{zyzzzzyz|~~}~|z|~|zz{|}}}~|z|~||}{z}~|{{|||}}~~{||y{zwx{~|{{|~}{}~}}}|{zzyyyyyxxy{|zz}|}}{{|}~~~~|}}}|{zzzzzzz{~zy}|yy}~yutvy||{yxxy||~~~~}||{{|||||}~}}zz~~{yyz{|}}~~{{~~||}}z{|{{{{{||}}~~|||}ywy|}{{{}~{|}||~|{zzyyyyyxyz{{xw{|}}|}~}~~}{{zzzzzzz{}|z||xy}~ytrtwz{zywwy{}{~~}|||||||}~~{z|y{~|zyy{||~~|xvwzywuttuvvwxxyz}zz~|zz|}|zwutux|~{xwz}|yx|{w|~|}}|~~}}|zxxy|~{z|}|ywwwwxxyyyz{~~|}{xy}|zyz|~~}{zz{~~||~{{~}|~~{|~{{~|~~~~~~~}}}~||~~}zyyyyyyyzzz{~~{|~~|{|}}|{}}~}yx{~|zz{|{wuv{~}}}}}~}|zxx{}||}}|zxxxyz{~~}}~~~}}~~yvttvwyxwvvwy||zwxz|}~~~{yz~~||}|}~|{zyy{~}{zz{zyyz{zxwvvwwwxxyyz|~||}~~}|}~~~~}|}~}{z{~~~}{wuwz}~}|{{{{|||zyxy|~~|||}}|{yyyzz|~~~}}}~{xvuvwxxxwwxz{{yxxz|}}~~~{yz}~}||}}}~{zxxy{~~|zzzyyyz{zywwwwxxxyyz{|~~}}}}}}~~~~}}~}zz{{zz|~|yvvy|}}|{{{{{||{zyy|~~}||}}}{zyxxy{~~|{{{|}zxwwwxyyxxxz{|zyyz|}}}~~~|yy{|}||~~~{xwwxz}}|zzyyz{{{zxxxxxyyyzz{|}~}|||||||}~|yyyzzz|}zwwy{}}||{{{{{{{zyz|}}|{{|}|{zyxxy{~~|{zzz|~}{yxxxyyyyyyz{{zyy{||}}}~~}{yz{|||}|zxwwx{~}|{zyyz{{zyxxxxyyyzzz{|~~}}}}}}||}}~}zyyyyyz}|zyy{|}||{{{{{{{zyz|}}}|||}}|{zyyz{}~}{zyzz|~|zyyyzzzzz{{{zyz{|}}}~~~~|{{|||||}~|zxwwxz|}}|{zz|||zyyyyyzzz{{||}~~}}}~~}||||}~|{zzyxxy{}~|{|}}}}|||{||{{z{|}~}|||}}}||{zz{|}~~~~}{zyyyz|~~}|{{{{{{|||{zz{|}}}}~~~~~~~}|{{|{{{{|}~}{yxxyyz{|~||}}}|{zzzzzzz{{{|}}}}||}~}}|||||}~}{{zyxxxy{~~~~~~~~}}||||{{z{|}}}||||}}||{zz{{|}}}}{zyyyz{}~}}}||||||{zz{||}}}}}}~~~}}||||{{{{{|~}|zyyyyzz{}~}}~~}|{{zzzz{{{{||}}}||}}}}||{{||}~~|{{zyxxyz|~~}}||||{{{{|}}|||||||||{zz{{|||}~|{zyyyz{}~~}}}}}}|{{{|||}}}}}}}}}}|||{{{zz{|}~~~|{zyxxyzz|~~~~~~}||{{{{{{{|||}}}|||}}}|{{{{|}}~}{zzyxxxy{}~~~}}}|||{||}}}||||||||{zzz{||}}~~}|{zyxxyz{}~~~~~~}|||||}}}}}}}}}}}||{{{{z{{|}~~}}|zyxxxyz{|~~}|||||||||||}}}|||||||{{{{|}~~}|{zyxxxxy{}~~~}}}|||||}}}||||||||{{z{{|}}~~}}|{zyyxxyz|}~~~~~}}|||}}}}}}}}}}}|||||{{{{|}~~~}||{zyxxxyz{|~~}}|||||||||}}}}|||}}|||{{||}~~~}|{zyyxxxyz|~~~~}}}||}}}}}}|||||||{{{{|||}~~}}||{zzyxxxyz|}~~}}}}}}}}}}}}}}}|||||{{{{|}~~~}}|{{zyxxxxyy{}~~}}}}}}}}}}}}}}}}}}||{{{||}~~~}|{{zyyxwwxyz|~~~}}}~~~}}}}}}}||||{{{{{||~~}}||{zyyxxxxyz|~~~~~~~~~~~~}}}}}|||||{{{{{|}~~~}}|{{zyyxxxxyz|~~~~~~}~~~~}}}}}}}|||{{{{||}~~~}||{zzyxxxxyz{}~~~~~~~}}}}}}}|||||{{{{{|}~~~}}||{{zyyxxxyz{|~~~~~~~~~~}}}}}||||{{{{{||}~~~}}||{zzyyxxxxy{|~~~~~~~~~}}}}}}}}|||{{{|||}~~~}||{{zyyxxxxyz|}~~~~~~~}}}}}}|||||{{{{||}~~~}}||{{zyyxxxyyz{}~~~~~~}}}}|||||{{{{{|}~~~~}}||{zzyyxxxxyz{}~~~~~~~~}}}}}}||||{{{||}}~~~}}||{zzyyxxxxxyz|}~~~~}}}}||||||{{{{||}~~~}}||{{zzyyxxxyyz|}~~~~~}}}}|||||{{{{||}~~~}}||{zzyyxxxxxyz{}~~~~~}}}}}}|||||{|||}~~~}}||{zzyyyxxxxyz{|~~~~}}}}}||||||||||}~~~~}}|{{{zzyyxxxxyz{|}~~~~}}}}|||||{{||}}~~~~}}|{{zzyyyxxxxxyz|}~~~~}}}}}}|||||||}}~~~~}}||{zzyyyxxxxxyz{|~~~~~}}}}|||||||||}~~~~~}||{{zzzyyxxxxxyz{|~~~~}}}}}||||{|||}~~~~}}||{{zzyyyxxxxxyz{|}~~~~}}}}||||||||}}~~~~}}}|{{zzzyyxxxxxyyz{}~~~~~}}}}||||||||}}~~~~}}||{{{zzyyxxxxxyyz{}~~~~~}}}}||||||||}~~~}}||{{{zzyyxxxxxxyz{|~~~~}}}}}|||||||}}~}}~~}|}}}|zxxxz|~~}xsprw~|{~ytu|xtrrsv{}}zwvyvtx|}}~~{xzyvvwxxyy{}vx|}|~{x}}tt}urqqqqrsw|z|ut{|{}st|zxxzyxx}wvwtz~}}z}x||z|yz~~~uzyw}|xy{}{}z{}|}syru|w~snou|xrnuxz}zz~{xx{}w}{{}{~zty}~z~}}~}u}vvyw{{|ysyw||~xpqs|{t|~~|zyywwxxuxpouxv|t{x|~xvyzyxutxytv|uyyx|vt{{{x{yqt|ps|{{ou{|yuuw}}~|}}}|yyyv|wuqonxzw{z|z~s~{~xwxz~w{x}qyo~tspprrwuit|suvy{}qw~|uoytruw~pzsyty}{{v}wyzwmgnvzpmmqtvlx{zymqlqwwoy}v{~w{}|y}|y|wwml~|zzz~{}|nkjmus~}{qppuzymrtitzrtzrt|}~t}ps}|zzpk}x}|~x~vqjeeiswzvw|w}xupzxjyxu~|sv~}p|y~z}znxow~vwy}zw~|||~|tqoqvsxyyv~uuxvv|po|txqu}|y}yxp~zv|vxxqxx}y|~{~z}{{}||tuqyvtwvsuxrxnm~vvz{ty{trz~ovzz~x~ylr{xs}y||u~}{{{zvuspn{~|{rsyvuqwovwosxuy{vqz{{wv|y{zux}lkxyvz|{~{}}v~}}xyrlslz|~||vvuolupvxoqyqs}zuv~||u|ytyw{wy|nlrvuz{}|{}zumrnt{ww}wzurkumo|srusqx|xs{x~pyzzxxz{|wy{pu{uz|{~}~~{tptpnzx{|uwyvposlwwrqrkt{wqyyzxx~~{vxtvyx|}}}{}|~zxuorhquz||wywwmulq|truon{{w}wy|wy|ruwxz~~~|~~|~|z}uutpqlgwr}zz}|utwlyyvvow}y|yu}z{xt}vowzuz~}~|{}|x{xutqoskoyxy}~vxup}zvvvpyyutz{z{xyt|}uvyywx}}}{{{{{yzxwvruox|}y~|txtqwqvuqwzzv~|s}|xy}|vu{ytuywx{}{~}~{{}{}~z{xwsrul}{}z~}{qzss{vsutqxzyv}szyv{zts|zsqvxy{|{~~|w{wxspoup{|}{}y}ryuq{vsurnx}yt~~~sy~~xwyurrzyqrwz}|~|ryxtronso}~{}y}sysp}xpsqrz{yr{}}qy||~yw~xvru}ytu{~~~~xqwusqopsmy||{pxqu}vpqosy{wu}{t|}zywux~|vw|~|z}uqtqsqonpr}}}}}ypxqy}truqv|~yy{zz~wvt{~yux|~~|y~{}opsrqqmonx||~vxys~vuut|y}x{~y|uss||vuy}~~~|~|}}}z|z{wmrrrqmnrp~u|uz{vvsx}{x~zw}}~zzwtrw|zvxz}~}||~|{~~z~z|qsursspsq{~yyxu~vuusz}~w|}t{|~|w{urs||wvy{}z~}{~}}{~{xrvtssrrrs}}u|s|yutry{~xx~~vx|}|}x}vsqy|wtwy|{{~}~~}}{|{rvtttporqzv{tzyutrx{~yu~vu}}{}x{vsqxzvtwxzz}~{|{|rvutrqoqo|{{wzvx|utsw{|{t}~xt{}~z}{wyuru{yuwyz{}~|z}w}vsvusqnont}w|w{u~wutu{{}vx}|uy|}}x~xuu|}zxy{}}~~|{|yyzqutsrolnn|v{}w|x{{wvty|~}v~zw}}}z|wty~|wxz||~~}{wzvztptsrpmlls|tz~x|xvw~~zyxz}~|{}yut{~zvxz|{~~}~{||xxuyprsrqolnnxzx~~}}{{xvy~x{|w|}|}y~wtu||xwxz{||{~z}yxwuxqttssqnop~{}|~{|zxw{~w|{w|}{}~x}urt{|wvxz{|}~{yyyvxyquuutrpqs{{~{}zxv|~~v|~zw{|y|}x{urt{{wvxz|||{yyyvvyqttttroqs{|}{|zxv{~vz~}yvz|xz}w~{tqsz{wwyz|}}|y}xxutxpstssqprt||}{|zwv|~}vz}|xuz{~wz}v~|urt{|yy{}~~}w~~vwrtvosssrqpru{z}z~yxw}}}~u{}|xw{{~x}|x|vsw}}{{|~}~~|v~}~tvpttorrssqpryzz~y~zxy}}w~~xy|~}y{{zutz~|z{}|}|xv|~xstovqpsrrrpqs{~~|~{y}zz|x||zzy}wtu{}{z|}~|~}}}|tz{}tuppuoqrssqprw{~}}{{x}~yy||}w~{xzusx}|z{|~~~|~{~{wu~{}xsunurqssssqrt||{~zy~}{x{{xz~w}~vsu{}zy{|~~}~{|~|~{u||}tvptvqttttrqs{z~}{}~}w}}{xzz}zw~y{wtty}{yz{}|}|~}}uz|~uvrrwqstttrprxy~}{|w|}|xyz|{v~zyytsx|{xyz{{~}~|~wx{}vvtpwrstttrpqtz|||xz}|yxzz}v{}w|vsv{|yyz{|}||xu~||ztvouurtttsppr{~w~|~|x}|{x{z}xxy|xuu{}|zz{}|~}~~|{ty~z|tvqpvrsttsqopuv}}~~x{~}zz{|}w}~y}wtx}}{z{||~~{{}~wt|{zysunstqstsrpoqz}u~y~~}z|{~zx{|zvuz~|z{{}|}{~z{tv}yzutrmurrsssqops~yx~}z~~|z|{wzy}yuv{~|{{|||}||}zzsv|wystqnurstttsqrwy}{z~}{z{z~v{x~wtv|}{z{|||}z}|z~xrx{xysuppvstuvusrtzyzz}}zz{z}u{~x~~wtv{}{{{||}}{}|z~ysw{wytuqovstuvutstzz{z}|zyzy~}uy~w}~wtv{}|{||}}}{|}y~xrw{vxtupnustuvuusu{{{y|{yyzx~|tz}w}~wuv|~}|}~~~~z}|y~}wrwyvwsunnustuvuttv|zyy|{yzzy~{t|}x~xvx}}}~y}zy~~{uqwxuvrtmoustuvvttwyy{||z{y{yv~{y|wvz~}~~~~}y}xz~|xqryuussrkrtsuvvutvz~{z}}{z|y}~vyy|zvw|~~~~}yz{w{}{upuxsurtnmtstuvvutw~z{{}}{{zzzu}|x}xvy~~~~~~~~}x|wy|{wqqxttssrkrutuvvvuv{~|z|}{{{y}}uyx|yvx|~|}|~{}swvu}xsxxuvtunousuvvvuuyyz|}}||z{~vv~yy{wvxz~}{puxmnqmpoqljrrstuuttw}w}|~~~||wvvz~xy{z{{|{{}~|~}ywysw}{uw{uvvwsowxxyzzyy{~~|}|}ywyyyzyw}zt{}w}~wtuy|~vwrry~{y|wrrppglqpqrsrqrv}zu{~}~~ztrux|~}|zz}{{}~|vwwtx|}zv{|wxxysqyzz{|{zz}|~~}xwyyxyxx}yt|}w~}wtvz|~{svrry}}zz{wwvtkotstttsrsw}ztz}|}{ztruy|~}{z|{z||wvytw|}zwz~xyy{wqy{{|}}|{}~~}}}|wyyyyyw{|uyx{zvvy}~ttuqv|~|z}xxwwqmtuuvvuttv|uz||~~zz|}wssx|~}{{}~z|||}twwty}}yw||wyz{us{|}~~~}}|~|{}~~{wyyyzyw|{u{~w|~yvw{{qtusy~|y~}wxwxqnuvwxxwvvy~v|||~~~}y}xz|vsuz~}{{}}z||~|}tvyvz}}zv{|wyz}wt|~~}|z{}~~|wyzzzyw{{uz}w{~ywy}~xptvu{|y~|wxxyqpwxxyyyxx{v|}~}~~~|}w}}vz{vux~~|{{}~|z~{}}ysxxw|~|xw|{wz|}uv~{}}zz|}yxyzzzwx}xv}zw}|yx|~{srxvy~~z|ywy{wouzz{{zyy{zyz~}}~~{~xz~ww{xuw}~}{{}~}z||}|~{twzwz}}yw||xy|~xv}{~||zy{~~{xzzz{xx|yv}{w}}zy{~}{sqwvx}~{}zy{}yqv{{||{zz{yxz~}||}~~{~~w{}vx{xvx|}||}~}z}|~}~zsxywz}|yx}|x{~wwz{|}{yxy}~zyz{{zwy|wx~yx~|yy|~yqtwux}~|{z{~wtz}}}|{z{}~u~{z~~|{{}~||{y~zv{{wvy}}|}~~{|vw{wx|}zy~{||w~}y~{~}zxx{yrz}vqqxxt{|w{~{yz~~{}upvutx|}|~z}xu{~so}|uw|}|zxxy{{}|~z|zy}{xx{{tw}wzzxz{{|wqtwsuxyww||xz~yv}~}}{~{~}zyy{wu{zuxtqwwrwzwuwz|~~~}|}}}{|xtzyx|}|~{xwx|~w~ttwyxvutuw~|}|||z~{{~|zywuy|{{{{wpqurruvuty|wx|{tz~~~~~~{}~{zz|}z{w{}~}wy{uuzyvvy{}~~~~}|{|}|{|ux|y{~}vz{zyyz}|}vxzzxvuuvz~|}z~y{~|}~{yxwwx}}||{vptvstwwuv{zvy~xu{~~~{z}~}{z{}z{|z~|~|wzztw{ywx{}~~~}|{z{|||{vz}{|~ztyzzz|~{|vxzzxvuuw|~~~|~z}y{}~{ywwxy{}||||wquxuuwwuuz{vx}ytz~{z|~~}|{|~~y{~{}|wz{uw{zyz|~~~~|{zz{|}~{w|~|~~|~wsxz{}z|wyzzxwvvx~}|}{}z~~y}|ywvwy{~}}}}{urwxuvxwuw{yvz~vu|z|z|~~}|{}|y}|~zx|xuz|zz{~~}~|{zyz|}}~xy~|~}}{|suz|}~}xxz{zxvvw{~~}}{}~{}z{|ywvwy{}~}~~}xswyvvwwuvzzvx~xu{z~y{}~}|{|}y~~}|z}zvz}{{|~~}~|{zyz{|}~xy~|~~}|}{}tv{|~~yyz{zxwvw{}}}}{~{~z{|ywwwyz}}wsxyvvwvuw{yvzwv|z}z|}}|{{|{y}|yx|}|{|~}}}|{zyz{{||w{|{}}|}{}yuy|}~}zz|{zxvvx~{|}}}~}}z~{yxwxxz{uwzxvvvuuz{vx~{uz~{z{}}}{zz|~z||~~~y{~}||}~~}|~~}{zzzzz{}yx}}z{|{{~}{ww|}}~~{|}{zxwwz|{}|}}}~{{}{yxxxxzzuy{wvvvuv{zvyzv{{z{}}|{zz|~z}~}~}}~~~~}{z|~~|zxvuuuwz||{y~zz{zxvuvy|y~~{x|~}|z~}xrqz|{vx}zxxxww{|xy~x{~~}{z{|{zyy{vsz~}zx{}{|}ww|}|{|~~~}{|~~|zywvuwz{zzzy|x|~vuvvutrrsx~|vx}}zvz}}~}xsqqu{~}}}{vsxzwuvuuw{zvyyuy}|||}~~|||~}yurx{}}z|zuw{{zz|}}}}{z{}}|ywvuuwz}}}~wqtz~|vuvvutrrtx~|vx}~|zx}~}}~yurqruz}~~|wtx{xvvvuw{zvx~yty||{}~~}||~~zxvv}|~~{|{vw{|{||}~~}|{{}}{ywvuwy}}~z{}tpv}{}vvwwvtssuz{vy~}}|zz}|}~zvsrruy~~~{vuz{xvvvvx{yvz~wu||{{}~}||}~~{yxxz}}}|}yvz}}||}~~~}{{|}|zxvvwy|}}}zx|~xqt{}~yvwwwuttux~~ww}|~~}|z~~|}~~{wtrruy~}xuy|ywvvuw{zvx~yuz{{{}}}|{|~}~|zyxy~}}~{wy}}}}}~~~}{{|}|zxwvwy|~}~~~||zw{~yrt{~{wwxwvutuy~}ww~|~}|z~~|}~~zwtssux}}xv{|ywvvvx{yvzxv||{{}}|{{|~|~|zxwyzx{~~}}~~~}|{{}}|zxwwwy{~|~}|{}}xy~~vrv}~zxyyxvuuw|zvz~}~}zz}~|}zwtssux|{wy}{xwvuw{{wx~{vy~|}{|}}{{z||~~|ywv{~yz~~~~~~~}|{|~}|zxwwwy{~|}~}|{{~{x||tsy}zzzyxvuvy~~xw|}~~|yz}}|~|yvtstux|zw{}zwwvvx{zwy{vz||{|}|{zz|{~~|ywv|z{~~~~~~}{{|~}|zxwwxy{}||~|{z{}zx{}uty}{z{zywvvy~yw|~~|yz}~~|~~~|ywuttux{|xz~|xwvvw{{wx~}wy~|~{{||{zz{{{}~}zxvz{z~}{{|{yxxxyyz{}|}|~|z}~{{{{~~}|x~|z{||zyxy}~yz~~~~}y|{yxwwx{{{zzzzz{{|}|}||}~|||uqy|vuvwxwvvx}}wx}~|yy||ywvwz{zyyyyzz{|~~{|||{~}}~~vw|zu{ywxyyxwwy}|vv~|tsx~|zxxz{zyyyyyz{||~~}~}}}|}ztwzuz~wuvwwvvvw{~zuvztu{|zz|}|zzyzzz{|~|z||{}|||~~z|wty|xyxxyyxwwy|~zux||}{vrt|~{zz||{zyyzz{|}~}}}}|||}y|~vu|xv~|vuvwwvvvx|}wtz~|wsx~|{|}}|{zzzz{{|z{~~{}~|{{|zy}zuwy{|xxyyxwwx{~|vv~|z|~}{xrsy}{{|}|{zzzz{{||~}~|{{}}yzxuzzv}xuvwwvvvx{}xtx}}}wsw~}{|~}|{zzz{{{|{{}~{}~|{z|~~zy}{uw~y|}yxyyxwwx{~|vv~{z|~}{xrsy~||}}|{zzz{{{}~|~}}}{{{~|y{~wu{zx~wvwwwvvvy||wtz~|~|vsx~}}~~|{{{{{{|~}z{}|{~|zzz||yzxtx~z{xyyyxwxz}~yuy|z{~~}{uqtz~}~~|{{{{{{|~||~|~|{{}~z{{uw}~x}zwwwwwvvx{~zuv}||~ytuy~~||{{{{{}{yz}~{|}{zy{}~{y}~wuz}}zyyzyxxx{~}xv{~{y|}ztruz~~~}|{{{{{|{|}~}}{zz}}y{zux}~zzwwxwwvvx|}yuw~~||~ytuy~}||{{{|}{yz|~{|}{yyz}~zy|~wuz}}{yyzyxxx{~~xvz}{y{~~}ztqty}~||{{{||~{{|}}{zz|~}zz|vw|z~}xwxxwvvx{}{vu|~{z}~zutx|~}||||||}zz{|{~|zyy{}|xy~zux}|~zyzzyxxy}~{vw~~|yx{~}{wrrw|~}|||||}~{{~}}|zyz|~{xzyvy~z|xxxxwvwx|}yuw~}zz}}xtty~}}||||}}yz|{{~~{yxxz|zwx}~yvy|~zyzzyxxy|~{vx~}{xwz||zvrsx~~}}||||}~{|}||zyy{|zwx}~yvz~z}xxxxwvvx{}yuw~|yx{~}|xtu{}}||||}|z{~~{{~~zxwxz{yvx}}xw||~zzzyxxxy|}zvy~}|yvvz|{yuru{~}}||||~}|}||~{yxxz{xvy}}xx}|{{xxxxwvwy||xv{~|zwy|}|zvtx~}}}|||~{z}|z||ywwxzzvvz~{wz|{zzzyxxy{}|wx~}|zvux{{zwsty~}}}||}|}||{yxxz{yvw|~zx|}{}yxxxwvwx{|yvy~|ywx{}}{vtw~~}}|||~{z||z||ywwxzzvvz~{wy}|zzzyxxy|~|wx~}|yvux{{zwssy~~}}|}~~{|||~{xwxz{xvy}}yw|}}|yyyxwwwz||xv{~}{xwy|}}zutx~~~}}|}~zz|{z}~zxwwy{yvx|}ywz~{zzzyxy{}~yvz~|zwuw{||ytquz~~}}}~{z|}|~|yxxy{zwx|~zwy~}{yyyxwwy|}zvw~~|ywx{~~|wsty~~}}}~|yz|}{||ywwxzzwvz~|ww{~{{{zyyz|~}xw|}|ywvx|}{xsquz~~}}~zz|}|{yxxz{ywy}~yvy~~{zzyxxxz}}yvx~}|ywx{~~{wsty~~~}}|yy|}{|}ywvxzzxvz~|xw{|{{zyyz|~}yw{}|ywux{}|ysqty~~~}~{z{}|~|yxwy{zwx|~{wx}~}zzyyxxy|}{ww|}|ywvz}~|xtsw|~}}~~zy{~{{}~{xvwyzyvw|}zwy~}|{{zyy{}~{wx~~|zxuuy||{vrrw|~}~~zz}||~{xwwyzxvx}}ywz~|zzyxxxz|}zvx~}{xvvz}}|wsty~~}}~}zy|~{z}}zwvvxyxuw|}zx{~}{{zyyyz}~{wy~|ywtux{|{wsty~~}}~~{{}~{{~~{xvvxzxvw|}zx{}|zyyxwxy|}zwy~|zwuuy|}|xtu{~}}~}zz}}zz}}yvuvxywuw|}zy}}{zzyxy{}~zxz}{xvsux{|zvsu{~~}}}{|}z{~}ywvvxywux}}zz~~~{zyyxwxz}|yw|}{xvtvz}}zvux~~}}}{z|~{y{~~{wuuvxxuvz}|y{~|{zyxxz|~|yy~~{yvtswz|{xtty~}}~{{~~{{}}zwvvxywuw|~{y}~|zyyxwxz|}zx{}{xvtvz}}{wuw}~~}~|z{~{y{~~{wuuvxxvvz}|y{~|{zyyyz}~|yy~~{yvttw{|{xtty~~~~~{{}}{{~}ywvvxywvx}}zy}~|zzyxxy{}|yx|}zxutw{}}zutx}~~~zy{}zz}}zwuvxywuw|}zx{~|{zzyz|~~zx{}zxutvz||yuruz~~{y{|{}{xvvxzxvw{}{xz~|{zyyy{}~{xy~~|yvtvy}~|wsty~~|yy||z|~|yvvwyywvy}|xx|~|{{zz{}}yx||zwttw{}|xsruzzy{~||~~{xvwyzxvx|}zxz~|{zzyz{~~zxy~~{yvtvz}~{wstx}|yy||z|~|yvvwyywvy}|yx|~||{zz{}}zx|}zwttw{}|ytruz~{yz~|{}|xwvxzyww{}{xy}}{{zyy{}~|xx}|ywtux|~|xtsw|~zyz}{{}~zwvvxyxvw{}zxz}|{zzz|~~|yz~~{xustx|}{wssw|~zy|}{{~~zwvvxyxvx|}zx{|{zyyz{}~{xz~{xvtuy|~|xtty~~~zy{|zz}~}ywuvwxwvx|}zy{}{{zyz|~~|yz}zxustx|}|xttx}~~{z|}zz}}zwuvwywvx|}{z||{zyxy{}~{yz}zxustx|~|xuvz~~~zz||yz|~|yvuuwxwvx|}{z}|{zyyz|~~{y{|ywtrtx|}{wuv{~~}zz~{z{}~|yvuvxxwvy}}{{~}{zyxxz|~}zy||yvtsvz}~{wux}~~|z{}zy{}}zwuuvxwvwz}|z|}{zzyy{}~}zz~~~zwursw{}}yuuy~~~{z||zz|~}ywuvwxwvx}|zywwy|~}zww{~~~~~ytqsy}xvxwx|~}{||yvuy~wqqx|{vpns{|y|yvvvxz|}}|zywqnmnquwx{|wt~~}zzz{zyx}|zyyzxqlw}}~{{}}wwxwtww}{z}|{|{wqz{z|{~~w{x{}wxz}ysrx{|vw}|rwxu{qnq}}}|{||z~zx~|{wwlkks|wurtwszx||~}~}}{{vzuqmoz||zy}w~{rurx{||~~|}y|xxu}~~~z~~}w{zs{z}|wzux{xztxyvuwrw~x}~{|{{y{xuvoqxsw~vwwtx||}z~{~~yx|ttzru{y}~yz|}w}~w}}}{v{{w~z~z}{}~~{}||~~tz{u}}~z|zu}|w}x}xuwut|zy}|~|{z|y|zw{ywvswws{xpurrx{~~}|}|txukruv}}{{~xv|w|y|{x|{{xz~~vw|y~{x{{w{~ws~z{|y~{y~wsxtvwwx{z}|x~}{wy~}yzxxxwu|v{wvzy~|zz{z~z~~{}}|uzzqtxw~|~y{~{yv}yz|{{z}~}{|zzz|zz}~~|v|{w~|{|{}}|y~w{ywzuxywv~{||||tvyvy{~yxzvquxs{~tuvx|~x}}~~{~{uqtnq{ww}}|~}{}y}|v{{z{y||~z|~{xx|z||y|~|y|z}~{{}zvxys|~stst{yx~|yu{z||}~yxu{zuw}}s{~~}~}~{~z}}|y{w|}wtzzyzszz{}~~}~{~y{~xz|{x{{z|zz~}|{|y|y}}~xxytyywx|x}~xs}}{}zz|~}~{xyrw~vtvy|{xw}xyyx}zw|{}~}{}z{zy|xuytruu}~||~{x{ww}vwt{}zz{~{|~{~~~w|~~~|{y}~|z}}wyw{zuwwy|{{|y~~{}~tv~||zy|x|z~{}~xz{~}z{zw{}}~}}{{zx{uxtwwy~|zyzy}|{z~}||}z}|~{~{|}w}}srqyy|{suuy~~xw~{rzzztx{{{}{z~|~yx|z}{}{zy}z~~~|||wqy|yv{~~xzz}~|{}zuwzpssqp}z~~z~zyw}~|w{~~}~}|}vzwxy||zx}y~}}y}|zwvyxvz~yrw}|{|}~vv{}wqr|~{st{{w|{w|}zy|y}{|}~|x~{~yzwt{zyuv{}z~}~ywwxu{|y~|v{~x~}x{uwxxzyz{v{xx{wz}}|y{~~~{~x~sqrp{||~}y|y{yzx}|{x||}{}~y|~}z{}{}~yzruz}y~~~~~vyvxywuyy}~~{y}}}~}}ztywz}{{x||}z}{yw{~z{zz|~|}z{uvuyz{{{}{yz||z|{z}|~zz}v~~{~~|{y|}x{qy||~w}~~{yyz||ww~{||~z~}zyzzrwvv~w{}}~~z{{{y{|}|{z}}{x{}{}}~|~}zwwuxyy{z~|z{{x{wy|{}}{~y}}x|z|}{}uu~}{yx}~~}yzv~vvyzx~z{}}~z~~z||wxvt}yyz~~{}||}~|~~x}{zv{z{y}}~}}|ywwxywzyz~~{y{y}x{}~|}|yz}}~z{{z~z~~uv|zvv|{|}~{zzy}xv{{{y{}z|}}vwuu~vuv}~}}|{||}|z{~~zx~{xyw}~|}zyx{yywzz}w{|}}}z}}{|{z}|y{{~~~}z{{y~|}v}|yvx|wy|{{yxwy}x~|x}{~|{~yxvt~ztsx~{~~}~~{}x{|xwv{}z|~|~~{zy}{{xyy|wx|}{|~}~z|~~yz|}|~}|{z~~v}}zwwzttw~||||zzwy~{{x}}~|}~{yxu{sswzwz}~{}x}{xxu{zxz{}}{|||y{||vw|}x|~~|~}{z{|z{}|{|~~|}{{}}yzyzzssw{xxz~}|yx}~|y{~}{}||{~~{zxyyutzzvz}x~|}|}ywv|yw{~}|zxz}ssx~{|{wuwy|y}|xvuywx}zxzx|}{}|y||}z{~{{}{vrz|~{|{xv||zwvxxx}}{wz{yuttzvu{ww|z{~}~~}s~stx}zw~}}yy~~yxy|zs|v{|uv}{{zvx~}wx}v}~~}z{z{~{|x~{{xsvz~{w{~~~|zyv{ywx~}||wwttsqy{wy}{|}{}~{{|~}ywyy|v~{{}~{}|t}~vwvxzvux~}{|x}}z~}}~~z}~y}{{zwu|zqxxqyxw~}|z|}w{~vz}{y~|v|x{{|}ys{}x{}|~y~wwvu{}~~~}|}}}{uz~ry~wzxtz~z}~~}{~|y|x~{~||~~}~xw{wwyz|}v{v{~{{{~zz|{~|y{v|}|~~{{u{xw}y{xvy}w|{{}~{}{x|}~~|z}}|{|zzz|}vxzqrutzz|~z|}~z~{zw|}~|}|{xz|y{yutwsx{}~~zy}zx|}|~|}}{}}}y|y~||}t{{||xxzy|{~~|w~{x~y|w}}z}|y|}wz{|{}x||sx|y{x~|}{~}~~{{z~xy}x|~y{{w~wywv{zuy|x~zv}||z}ww{w~}y~{|z|{y}uryvwwy|~}~}~|}~w~z||||~}x}{wsupwvtww~{}~}}~~z~z~}~}{{}|}|v||{xvzxxzv}}x|y{xyw~zzz}{~{~}|}}~z~{w{zzyu{zyw}y}~~~}~z~~x{y|}}~{yz}wwv}}xv~}}{ry}~}{}zx{vw}yzx{~}z}z}{vywyxxzwzx~|y|y~~}z~}y~|||y~zuyvu~zrtqx{yy~}~}y|y~{~}}}~{yz~zx{{twvyztxz{~}~|zzx}~zzz~~~|}}~xz}|~vxyxuuwty{|}~}{z|z~{~|~~~~y{xwz|y|}xs}}{}yyyz|}~}z|v{{vvw}~}}x}ywwuyvyvtx{~y~}|z~yzz{y~~~|{|{ytxz{}y~|ow}~yyxw{{xrqzpx~v~pu|z|yy~}}w{{|{v}us}|yxtxy|zw{}|}}ux{}|y||zxq{vtrxxzx}|tzx{wtuzv}}|{z{}zyvxy~y{z}{txy|wy~~wtguu}}svxxywuxuylosw}tptwt{|{~{~z~ysvquvxzz~}}zxyz}|{otms||ypuvsvqtjsuoxvx{|qtz~zy~xz{}u~rtwwzy}~}}zxzysnwtt}{ps|srqwtwwkwyv|{ru}~t{z~vzy|~{t~roz|zw~~y}tusownu~~zu|}rptxryqpxvtwxqy~xv{}v|y}~~{u~xmqy~~~|~z~~~~yrsrquoy~}}wzrttvnvnr{srwtsyxy}}t}y{{|}wz~tmw~|~~z}z~~~tsunstv~zy}stvwpptmvxttyrv}{v}}yx}~z|{}}t|{tt|}z~~{|}~z}wvrmvu|v|zsvuwnxrq{trwvqwyx~{~v|zzxu}zsy}|~{}~~||zzyvsnstu|{wwwwqrwmvystums{}x|}|wx{wzt|{tsz{|}~|~~zy~{tsoowp{~z{vvwwowlqyutupp{~wy|t~y|{yszvqxz|}y~~~zw{usqosox~~txvyqwpo|wqtqq{~xv}t~z}zzty~xrw{{}~{~|~y{}wutotns~|vyy{quso|yqrspy}zv}s{~|y|zwv{ruyzz~~}~}}}y}xvtpoqo|y{{||wqyox|srspt{|v{|ww~z~~yxt{}wsxxy{~~}|~}u{{vuqmqlx|{{||rwtr|wqsrox|zv~~t}~{y{ytu}zuvxxz~}~}|~zu{xwsooqn}x~}~|yrzov|urrps{}xy}yv~~~y|zxryytwxz|~~~~~~ux{vuqnrns|x||}vuxp{|tssow||u{~uw}y~yvs|}vsxy{}~~}~uyxusqornw}z|}uwup}ztrrqy|{u|tz~z|wut}|uuyz|}~~~}~~~sywurpnqnz}~|}svur~zsrqr{||u~}s{~~y|wst|{uuzz|~}~}~~~~|}rvusrpmqo|~}~svvs{tssrz||v}~u{~x|wts{{vvz|}}~~~||{|qtusqpnrq}}~twvr{ttrrz|}v|}u{}x|vss{|ww{|~|}~~~~|zzzputsrpnsr~~sxut{utrt||}v}|u|}~|x{vrt|{vw|}{}}||xzwotsrqpost~szsyyutqw}~zv~xv}}~zzxurv}zvy|~~~}|y{v{rqtrrqorsz~~zuys~wtss{|wy~uy~}}~x}~vtrz}xw{}|}~}}yxvypssrrqosstyuw|vtsw}}|v}~~zv||~|yzvru|{wy|}}}}zxzuzsqtsrqoprz}{vztxutt||wy~}uz}}|~x}~vtsz|xw{{~||{zywwxotssrpors}u{u|{vut{}~{v~~~ww}{~yzxurx|ywy{}~}|~{}}xxuyqstsrpnpq}w{wz}wvtz~~}v}~~yv|~{~|yzurv|zvxz{}|}}{wytzssusrpnop{~z{zzxywux~}vz~{v{}||~x}vst{{wwyz|}}~|yxztxvqutsqonotxx}w|wvv~}zw~~}wy|}zz{xusy|ywyy{|~|z}|xwuzrttsrpmop}z{{|z{zxv{~v{~~zv{}z|~x|vsu{|xwyz|}~~|ywytwvqttsromotwz~y~yww~~|v}~}wy|~~y~{zyusx|zwxy{||~~~{y~vxrysrtssqnnpy}x{}z|ywy}yx~}|wz||zy}wtsz}ywyy||}{~~yzzvvrxrstssqnoq}|z~}}{|yx|}xy~}{w{{zz~x~~vttz|yxyz}}}{w|~xvtrwqsssrqnpr{}~~|||yx}~wy~}zw{{yz~x~~vst{|yxz{}~}{~~wz}wutqwqrsssqoqs~~~}}|}zy}~xy~}{wz{yy~x}~vstz}zyz|~~}{~|~vx|wtsovqrsssrpru~~}|}zy}~xy~}zwz{xy~x}~vst{}{z{|}{~~}}uy|~uurpvprsttrqsw~~}~}zy~wz}}ywz{wz}w~}vsu|}{z|}~|}~}}{tz{}tuppuprsttsqtz}}||z{w{}|xyz{}v||xzusw}}z{|~|}|{wt}||yrtmssqstttrru|~||{}~|w}|{wzz}yw~x{xttz~|z|}}||~z|tw~z|usqnuqrttttrtx~~|{xz}|yxzz~v{}w|usv|}{{|~}}{{}~ws|{zyrtmstqstutrru{~}|~|w}|{xzy~xw~x{xttz~|z{|~~|}}}zzsx}y{stpouqstttsqtz{~~}~w{}|xzz|{v}{yzutx}}{{|~~~||~z{tv}y{utrnurrtttsqsw{~}}x{}|yyz{}u||x|vtw|}zz{}}}{~z~|uu}yzwtsmtsrtttsqru}z~~{y}}zy{zvzx~~wtv{}{z{|}}}{~{{~wsz{yysunqurttutrqs{w~x}}|y{z|yv~zzzvuy}|z{{}|}~|~yzsv}xzuurnusstutsqrwy|{z}}zz{z~v{~x~~wuw|}{z{|}}~{~{{~wrz{xysunpurtuutrqt{wy|}|z{z{zv~{y{vuy}}{{{}|~z~y|{tt{xxvttmttstuutrrv}xy}}|z{z}xwy{yvuz}|{{|}|}}{}x}~yru{wxutrmttsuuutrsx{{}y}}{z{y~vxx|yuv{}|{||}}}{{|x}}wrvzvwtupmuttuvutsuzz}}y}|{z{y~~vyx|yvw{~}||}~}}{{|x|~|wquzuvttpluttuvvutv{|}}y||{z{y}~vx~x|yvw{~}}}~~~}{z|w{}|vqtyuuttqltutvwwvuw|}}~y||{zzx}~ux~x|yvw|~~}}~~}zz{w{}{upuxtustomutuvwwvux~||z||zzzx}|tz~w}yvx|~~~~~x{zw{|ztpuwsusunnutuwxwvvz{zz||z{yy~zt||w}xvy}~~~~~~x|wx|{wqpwustsskqvuvwxwvx|{y{|{z{x{~vv~yz{ww{~~~~~}zy{vy{zuoswststpltuuwxxwwy||z||{{zx~{tz}w~~ywy}~~~~w|xw{zwqpwtrtttlqvuvxxwwx|zz||{{{x{~vw~xz{wx{~~~~~~~xzzvy{ysotwrtsuomuuvwxwwwzz{{||{{yy~xu}{x}xwz}~~~~~}~zy{vx{ytoswrssuqltvvwxwwvy~z~}{}}||zy~{u||w~~ywy}~}}}~}|x|wwzzuprwsrtuslrvvwwwvvx|{z{}}||{x}}uz~x|zxy|~~}}~}}x{yvyzwrpvurtvxrv~}}}}{yx{~u|}}~~}|y{zy~}}|y}|x{~{z|vwyxsptwpnpywpuwwxyxwwx}w{{zyvxyyyxv{ztz~x}{xy|}}}}}|{}|~}}{x{ukkq|xuvqopppoqu{yq~z~}~~~~{||z~|yyy~}yw}}xy|}yvzvuxwsnosnmrxyty}{{{{zy{~||}uuuuuuruxrt{vw}zwwz||{{zywz}~}}~{tmnojls{{x~{ywurqsx{st|y~~|||zvtx{}||{}y}~}~~vwytuwuplprnqv|xu|~}}}|{{~|~xxwwvuswxrv{uy~{xx{}}|{zxx|~~zyyunilnkqx}x}|zxvuw{}tw}z~~~||}zxutz|||{}y}~|~~~vvyttutokorpsy~{u|~}}~~xwwwwuswxsv{vy~|yy|}}|{zyy~|}}wvurkhlpou}~y~}{yxwy}~tz}{}~||~}{xvuw~{}{||z~}~{txxsturmlqsqw}yw~}{}|xxxxwttywtzzv|~{yz|}|{zzy|z}yturnhjpps{{}~|zyz}yuz}~~~~|}~~}{ywuv|}}}{~z~}~}uvytstsnlptru||w~}{|yyyyxvtyxtz{v{|zz|}}|zzx{~y}yttrnijpprz|~~|z{~yuz|~~}~}~|}~~~}{xvuu{~~|~z}~|uwytttrnmrtqv}{y|z|{zzzyvvzwv|zw}~{z{}}|{zyx{{{}wttqmjmpns{|}|~~uz}y}~}|}}~}}}}~|zxvtv|~}|}~~~wvzvtutpmptqry~x~}~|{~~~}||{xvyzvz|wz}{{|}}|{zxx}y}{vutplkpont}}~~{tzy}~}||}||~~~~~|zwutw{}~|~~}vwzvtuspnrtpsz}y{~~zz~~~~~}|yw{zw{|w{}{{}}}|{yxx|~~y|{vutpllpont}}~|uzy|~|{{|{|}~}~~}|zxutv{|}~~wvzwtutqnquqryy~}|~}}~{x|}~}{wz|xy~yy|{|}}}{zxx{~~yz|wtsqmkoqnrz}wyyz}~|{z{}|{~|}}~}}}|zxvtuy}~~{uxzuttrooturu}~{{}}{{}xx}~}zw{|x{}xz~||}}}|{zxy}~{wurnmqrpu}~x{|ty|zyz}{{yw{xwwyyyxwutu{~~z||vx{wttroosuru~}u|~vsrsu{{ssz~~~~}zvxxtz~~}}}~~}|{z{~zyopqljjighnpou~}~uy{x~~|z{~{}yywv}wttsrrqppsz}~}|z}}}}x{{wuutrtyzx}u{{{}xtruytnrz}|}||{ytswwx}~}}zz}}|wxsmkjgfjpopx{~vtz{~|{}~|}ystxx}|zxvusrrsx|~|}y}~z{}yvvusty{y|}sw}{}ywx|yqsz~|}~}}|zvtwyy}~~}~yz}}~z{wqnljilqppx{~wtzz~||}~||xstww|~|zxvusrtx|}~}}z~~z|~ywvutuz{x|zryzy~~{y{~xru|~|~~}}|zuuyxy}~}}~}y{}|~~}~xrpnkkoqor{~z}ty}wz~}}|~~{vsvvw}~|zxvtsvz{|}~~|}}}}|}xwvuuy{xytu|ux~~|}~utz~|{~~~|xuxyx|~|~}~{z}|z}~xtromnrqou}z{yt~ywz~}~|~zuuwvw}|~}{ywutwz{{|}~|}}}~}yxwuvz{xz|svztw|~~vv|}{~~|xvyzy|~{~}~~{z}{z}zvtqnpsrpu}zzzu~zwy~~}~|}zttwvw||}}{xvux{{{|}~~|~~}}~zyxvvz|yy~ts}|uuz~yv{|~~}yvxzy{~|}~~}}{y{|{|}xusppttqs{~y~~uxxx|~~}}~}zvrtwvz~|}zxwwz|||}~~}|~}}zxwvx||y{~yqu{vx}~}ww}}~~}|xux{z~}~{{yx{}|~~|wusqruvsu}~z|uyzz~~}}}}}|zxtqtwx}~}{yxy|~~~~~}~}||~}zxwvx|}z{~xpt~yz~}~xw~~}}|{wux||~~}yyxx|~~~{wusrswwtw{{tz{|~}}|~~{zxvrquy{~}{zyz}~~~|}|}||zxwwz}|z~~|tpx}z}~}}}wz~}||yvv{}~~~yxxwz~~zwusswyvv||}~vv}{~~}}~|{yxvspsx{~~}{zz}~~|}||}~zyxwy}}z|~}vpvz{~}yz~{vvz|}|~}||~~~zyzz}~ysrz{y}}y{~ww|}~|{{~|x|}ywvurpty|yty}xwxyz{{||}z||}}|zxvw}}vrz|}vtz~}zy}}yxxxvtuz|~~|~|z}~~zz{{}wrquz}xz~~wrx~xxz|}|{{{}vx~|{zxuuz}|xuv||zyyxy{}xxyy|~|~{xvuuz}}|ux}|~trx}}zxwwvsrvyz}}z{~|{z}~|}|~zvrqtxz||tr|{vwy{|{zz|zvz}||zxuw|~}zwvw}~}||}yyyz~~~~{~zxvuv{|{{uz{{}|tsz|yxxvsswz{}|y{~|{z}~|}|~zvsrtxy{|us||wwy{{zzz|zvy~||{xvw|~~~{xvx|~}}zyzz~~~{}{xvuvz|{~}vx}z|~}~}usx~zyyxusvz{}}zy~~|{z||||}{vsrsx{{yswywxz{zzyz}}wv}}|{zwvz~~~{yxx{~}~}yzz||z~}yvuuw|}|zu{}{}}||}~zst{~zzywutx|}~}zz~}|{{~~||}~~~xtrru{~~ysyzwyz{zyxy||vw~||{zww{~~~|zyyz~~}~~zzz||z}}xvtux}~{v{~|}~~}{zy{|ysu}~{zyxuuy|~~zz~~}|||}~~||}|~{vsrsx~xtzzxyzzyxxy{~{vx|{{zwx|}~~|zzyz}~}}zz{~~{z}~{wutvz~yw}|}}}{yxxz{wty}{zywuv{~|y{~}|||}~~~}|}~||~}xtrsv||uw~yxyzyxwxz}|wv}}||zxwz~|~|{zz{}~{{{}{y|~|xutuy~~zv}~{{||zywwz{xtw~}~~zuw{~~~~~}~~~}{yy~{yz|~|}}{{|~~}wxzy{||||||z|{zyvtx|~||z}~yxy|~zz{~}|{zyy{}zv{~~wu~}|~}|~}zy}|zzyxvx}}z}~|{}~~~}}}}|~xtu{{y~}xzzv||yyzzywvx}~}{|{z||}~{{||{zzzz{{|}}||~~}|yy~~|{|}}~x{xrruy~yw||~}~}|zwvy|}~}{~~ywvw{~~|xvuvy{yx|~}|uv~~~}|{||yutssu||y{~~~}}}|{|~~~~~}}}~~~|z{~~}|~}{z{~{vvwxwwxz~{}{~}uw|~{{|ywvwz~||~}}}{xy~}{zz{~~|x|}xwxz{{{|{}}{}zvvyxuvy|}}ywz~~~~~}{y{~yvsrswyz}~{{}~{vy}xxyzzzz|||zz~|wuwzzyxwxz}}{zyxwwxz|{z|}~{z}{tqpooorw}}|}~~zxy||ywxz{zy}}xx}~}~}yxyzy{zwuuwyxvx~|yz~~}~{w|}{|{yz|{zy}}{}~}|{{zzyxy{}|{{zzyxwwy}~|z|~~{z{~{wvutssux{yuv|}~{xx{|zz|~~}}zwtsuz|zxttwzyvttuxzzxy~}xx||~}~~|~~}~~zutwz|||||{{zyz{||{{|}}|{|~~||}~|{{vuuutttvz|yuv|~{}~}~}}}zwvw{}{xuuxzxvuvx|~|~{}~|{zzyyxz~zwy|}|}}~~ytux{}~~}~~}||{zz}~}|||z{}~~|}xvvwxxyz}zy}~{{~}}|yxz~~~|zxwvwz}zy|~}zxwx{}}{|{|~zx~~~zwy|}||~~yy|~~~}}~}{zywuuw{~|~}||~~|y{|}}}zyyxwxy|~zy}~~|yvw|~|z}}{zyxxz~|yy|}ywvwyzxvx}{y|}{~{z{{{{|}}{~}yz}~}|{zyxxz|~~~~}||}~}~|||{|~~|zyxvuuvyzxuw~}{||{{|{z|~z{~}{yy{~{wtvzzywwy|}}|{}|z~|zzzzz|~~{|}|}~}wvy|~}~~}{{zyxxy|~|}~}~}~|}~{z{{{{|~{y|~~}zy}}{zzzyz}}}{yxxz}}{|}{}~zwvwy{{yz~zz}{{}}}}}~{xy{{yxz}~}{}~}}||{z{}~}|{zyxxxy}~}~}}~~}yz|~~}{zyxwx{}}zwz~}|zz}~}}}|}|}~}|{{z{{~~zxz}}zwvvxzzxy}||~{}|||||~|{}}}}}~~|y{}~}}|{{z{}~}}|{{{~~~~|{~}zz{~}}~{zyxwwy|~|yy~}{|}}}|{}{y{~}{zxxy|~|yy|~{yyy|~}{|{|{z{yzz{|~{xz}~}|}~~~|z}~}|}~||{zyyz}|{}~}}}~zz|~~}||{zz|~~zz~~~{xz}~}{{{{{}~~|zyxwwx|~{z}|yxxz||z{~}xx{}~}}}|||~}}}ywy}}{|~~}|{{|}|zyyxxxz|~||~|{{}}{|}yy||{zyyy{}~{wx|}|}||~~}~|{~~}~}|{zyyz||yy|~|xvuvy{{z}|}||}{{{{{|~~|~}zy|~zy{}~~}}}}}}}~}|{zz{~~~|{}}||~~}{y{~~{yyxxx{~|{|z{~}|||z|}|zyxxxz~~{{~{zz|~}{|~zz}|{~|||||}}}|yxz~~~~}~}~}|}~~}|{zzyyz}}~~|~}{{|~|{~~zwy|~~}|{{|~{y}~~~{yz~~~}}~~|}~}~}{yxwvvwy~|{~|yxy{|{z{|yz}}}~|||{{}~{}}~}zxx|||~}|{{}~~}{{zzzz|~~||~~{yz{}|z{}zz}~||{z{}}yz~~~|{~~}||~{{~~~}}~}||{zz{~|{}}zxxz}}{||{}|{|{zzzz|||{y{~~~~~~|}~}}~~}|{zz{}||~|z|~||}~}}z{}}}}|{{}}{}}z{~~||zzz~}z|~|{zyxxz}~}}}~{zz|~}{|~{{}}zy}}}}}~}}}yxz~~}|||}~~}}}~}{{zyyy{~{|}~~{{|~~}{}{yz|~}~}||}}z|~|yy}}}||}}}~}}~~}{zyxxxy|~~}~~{yy{||zz~~zz|}|~}||{|~|{~~}zxz~~~}}}~~}|{|}~~}|||{{|~~}~||~~{zz|}}{|}zy|~~~~}|{{}~zz~}|~~}|{}}{|~}}}~}{zyyxy{~~~||~}zzz}~~|~||{{|{{zz{~|||yxz~~}}}~|~~~~}|{{z{}}|~}{|~|z{|~|{||xx{}}}~}}}~}|~|z|~}|{}}{}~}||}~}{zyxwwx{~~~~~|{{|~}{|~{z}|{}||{{|~{{~}}~}{xwz~~}}}~~}|{zzz{}~}}{|~}zyy{|zyz}}zwwz~~}}|}~{{~~}{{}~}|~|z|~~|{z{||{zyxxxy{~}}}{yz|}|{}}z{~|}~|{zzz{}|yz~}|}~{yz~~}~}|}~}|{{{{}}}}{z|~}{yxz||zz}~zy{~~~}|||~}{~|{|~|{||yz}~}||}~}|zzyyyz}}}|z{|~}|}~{{}{{|{zzz|~~{|}}~{yy|~~}}}~~|{{zzz||||{}}zz{||{z|~}yxz}~~}}}}{~~~{z|~}{{|~{}~|||}}|{yyxxxz|~~~|z{|}|{||zz}|}}||{{}}z{~~|}~~}zxy}~~~~~}|~~}|{zzz{}}~~||~~{yy{|{yz}~{xx{~~~}}~||~}{{~}|||{}~}{{|}}{zyyxxy{~~~}}{z|}}|||{~|{~|{{{{}~{z}}}~~|yy{~}|}~~}~~}}|||}|||{||zyz||{z|~}zxy|~|~}}}}~}|}}{z|~{{~~}||}}}{zyxxxy{~}|~~~~}}~}~||~~z{}|{{{|~~{{~~}}~}{xx{~~}|{|~~}||{{|{{~|{|}zyz{|zz{~}ywx{~}{}~}{|~}{z{|{~~}|{{|}|{yxxwwxz}~|~}|}~}}|{}{z~|{{{{}~{z|~~||}~}{yxz}~}}}~~~}||{{|~}{}}{{}}zyyz{zyz|}{xxz}}~~~}~|{}~|{z}}z{~~}|{z{|||{zyyyyz}~}}||~~}~~{|~~z{}{zzz{}}zz|~~|}~~{yy|~}}~~~}||{{||{}|z{}}zyy{|{z{}~{yy{~}~~~~}~|{}~|{z|}z{~~}|{{|}|{yyyyyz}~~~||}~~|}~{{}~{{}|{{{|~~{z|~}||}~}{yy|~}~~}~~}|{{{{|}|~}{{~}zyyz{zyz|}zxx{~~~~~}}~}{{~}||~}{|~~}|zzz{|{zyxxxy{~}{|}~}|}|{{~~{}}{zzz|~|yz|}|{|}}|zyz~~~~~}}~~}||||}}}}{z|~~{yxyzzyy{}{yxz}~~~~}~~|~}|~~|{}~z{}~}|zzz{|{zyxxyy{~~~~~||}~~}~~||~{|}{zzz{}|yy|}|{{}}|zyy}~}~~~~}||||~||}{z|~~{yxyzzyy{|{xwy}~}~~~}|~}{{}}z{}~}|zzz{{{zyxxxyz}~}~}}~~}~~{|~}z|}{zzz|~~|yz|}|{{}}{yxz}~}}~~~~}|||||}{||z{}}zxxyzzyy{|zwxz}}~~~}||~|z{~|z|~~}|{zyz{{zyxxxxy|}~~}~~~|{}~{{~|{zz{}}zy{}|{{|}|zyy|}|}~~}||||}{{~~{z{~~|yxyzzzy{}|yxy|}|~}|}|zz{~{{|~}|{zz{||{zyyyyz}}|~~~~~||~|zz}{{zz|~}{z|~}||}~}zyy|~|{|~}||||}~{z}~{z|~}zyz{{zz{}|yxy||{}|}|zy{|{}~}|{z{||{yyxxyz|}{}~~~~~|{}}zz}{{{|}~{z{}}|{|}}{yx{~~|{|~~~}||||}|{|}{{}~{yyz{zyz||zxxz}~|}~~||~|{z}~{{}~}|{zz{|{zyxxxy{~}|~}~~~~||~}z{~|{zz{}}zy{}|{{|}|zyy|~}||~~}}|||~|{}|z{}}zyxyzzyz||zxx{~~|}~~}}}{{}}z{}~}|{zyy{{{zyxxyy{~~|~~~~~||~~{{~{zzz{}~~}zyz||{{|||zyy|}|}~~}||||~|{}~{zz}~~|zxxyzyxy{{yxx{~}~~~|}|{{~|z{}~~}|zyyyz{zyxxxyz|~}}~~~~}{||z|}{zyz{}~~{yyz{{z{||{zy{~~}~~~}||||}{||zy{}~}{xxxyyxyz|{xxz}~~~~}|~}{z|}zz{~~}|{yyyz{{zyyyyz|}~}~~~~~||~}z{~~~}~|yvvz{yz}~|z{}zxwx{~}|{}~~zwy}{zz{|~}|~~zxywuux{}~~~~}}}~{yy|}{z|~}|}~}wv{zwuvwy{}}|{|~}zxw{|{|~~ywy}zwwy{{{yyz{|||}~~~zww|}|||}{wvx}|{{||||{{{{{|~~~~~~~~|xxz~}}~~~{wvy~|{{||}|zz|}}}~~~}zxxy}~~~ywx{~}~~}|zz{||||}~~}~|yxy~~~}~|ywwz~~}}||{{|}}~~}~~~~~{yy{~~~~}zwwz~}}~}|{{|}}}}~~~}{yxz}}yxx{~~~~|{{{||||}~~~}~|zxz}~|ywwy}~}}|||||}}}}}~~~~|zy{~}zxwy~~~~~}|||}}}}~~~~}{zyz|~zxxz}~}|{{||||}}~~}~~}{yy|}zxwx{~}}||||}}}}}~~~~}{zz|~|ywx{~~~~}||}}}}}~~~~}{zz{~|yxx{~}|||}}}}}~~~~~~}{zz}~{yxxz}~~}}}}}}}~~~~~~~}{z{}~}zyxy|~~~~}}}}~~~~~~~~}{zz|}{yxy|~}}}}}}}}~~~~~}|{z|~~|zyxy|~~~}}}}~~~~~~~~~~|{{|~~}{zyy{~~}}~~~~~~~~~~}|{{|~~}{zyy|~~}}}~~}}~~~~~~~~|{{{}~|{zyy{~~~~~~~~~~~~~~~~~~~|{{|~~}{zyy{~~~~~~~~~~~~~~~}|{{|}~}{zyz|~~~~~~~~}~~~~~~~~}|{{{}~|{zyy{~~~~~~~~~~~~~~~~~~~}|{{|~~|{zyy{~~~~~~~~~~~~~~~~~~~}|{{|}~}|{zyz|~~~~~~~~~~~~~~~~~}|{{|~~}|zyyz{~~~~~~~~~~~~~~~~~~}|{{|~~}|{zyz|~~~~~~~~~~~~~~~}}|{{|~~}|{zyz|~~~~~~~~~~~~~~}|{{|~~}{zyyz{~~~~~~~~~~~~~~~~}|||}~~~}|zzyz{~~~~~~~~~~~~}}||||~~~}|zzyz{}~~~~~~~~~~~}||||~~}|{zzyz{}~~~~~~~~~~~~~}||||~~}|{{zyz{}~~~~~~~~}}||||}~~}}|{zyz{}~~~~~~~~~~~~}||||}~~}|{{zzz{}~~~~~~~~~~~}||||}~~}||{zzz{}~~~~~~~~}}||||}~~~~}||{zzz{|~~~~~~~~~~~~}}|||}~~~}}||{zzz{|~~~~~~~~~~~}}|||}~~~}}||{{zz{|~~~~~~~~~}}}|||}~~~}}||{{zz{|~~~~~~~~~}}}|||}}~~}}||{zzz{|}~~~~~~~~}}}}||}}~~~}}||{{zz{|}~~~~~~~}}}|||}}~~~}}|{{{zz{|}~~~~~~}}}}||}}~~~}||{{zzz{|}~~~~~~~}}}}||}}~~}}||{{{zz{{}~~~~~~}}}||}}~~~}}||{{{zz{{}~~~~~~}}}}}}}~~~}}||{{zzz{{}~~~~~~~}}}}|}}~~~~}}||{{zzz{{}~~~~~~}}}||}}~~~~}}||{{zzzz{}~~~~~~}}}}|}}~~~~}}||{{zzzz{}~~~~~~}}}||}}~~~}}}||{{zzzz{}~~~~~}}}||}}~~~~}}||{{zzzz{}~~~~~}}}||}}~~~~}}}||{{zzz{{}~~~~~}}}||}}~~~~}}}||{{zzz{{|~~~~~}}}||}}~~~~}}}||{{zzz{{|~~~~~}}}}|}}~~~~}}}||{{zzz{{|~~~~~}}}}|}}~~~~}}}||{{zzz{{|~~~~~}}}}|}}~~~~}}}||{{zzzz{|}~~~~}}}}}}}~~~~}}|||{{zzzz{|}~~~~}}}}}}}~~~~}}|||{{zzzz{|}~~~}}}}}}}~~~~}}||{{{zzzz{|}~~~}}}}}}}~~~~~}}||{{{zzzz{|}~~~~}}}}}}}~~~~}}}||{{{zzz{{|}~~~~~}}}}}}~~~~}}}||{{{zzzz{|}~~~~~}}}}}}~~~~}}}||{{{zzzz{|}~~~~~}}}}}}~~~~~}}}||{{{zzzz{|}~~~~}}}}}}~~~~}}}||{{{zzzz{|}~~~~}}}}}}~~~~~}}}||{{{zzzz{|}~~~~}}}}}}}~~~~}}}||{{{zzz{{|}~~~~}}}}}}}~~~~}}}||{{{zzzz{||~~~~}}}}}}}~~~~}}}||{{{zzzz{||~~~~}}}}}}}~~~~}}}||{{{zzz{{||}~~~}}}}}}}~~~~}}}||{{{zzzz{{|}~~~~}}}}}}~~~~}}}||{{{zzzz{{|}~~~~}}}}}}~~~~}}}||{{{zzzz{{|}~~~~~}}}}}}~~~~}}}||{{{zzzz{{|}~~~~}}}}}}~~~~}}}||{{{zzzz{{|}~~~~}}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}}~~~~~}}|||{{{zzzz{{|}~~~~~}}}}}~~~~~}}|||{{{zzzz{{|}~~~~~}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}~~~~~}}|||{{{zzzz{{|}~~~~}}}}}~~~~~}}|||{{{zzzz{{||}~~~}}}}}~~~~}}|||{{{zzzz{{||}~~~~}}}}}~~~~}}|||{{{zzzz{{||}~~~~}}}}}~~~~}}|||{{{zzzz{{||}~~~~~}}}}~~~~}}|||{{{zzzz{{||}~~~~~}}}}~~~~~}}|||{{{zzzz{{||}~~~~~}}}}~~~~~}}|||{{{zzzz{{{|}~~~~}}}}~~~~~}}}||{{{{zzz{{{|}~~~~}}}}~~~~~}}}||{{{{zzz{{{|}~~~~}}}}~~~~~}}}||{{{{zzz{{{|}~~~~~}}}~~~~~}}}||{{{{zzz{{{|}~~~~~}}}~~~~~}}}||{{{{zzz{{{|}~~~~~}}}~~~~~}}}||{{{{zzzz{{|}~~~~~}}}~~~~~}}}||{{{{zzzz{{|}~~~~~}}~~~~~}}}||{{{{zzzz{{|}}~~~~~}}~~~~~}}}||{{{{zzzz{{|}}~~~~~}}~~~~~}}}||{{{{zzzz{{|}}~~~~~}}~~~~~}}}||{{{{zzzz{{||}~~~~~}}~~~~~}}}||{{{{zzzz{{||}~~~~~~~~~~~~~}}||{{{{zzzz{{||}~~~~~~~~~~~~~}}|||{{{zzzz{{||}~~~~~~~~~~~~~}}|||{{{zzzz{{||}~~~~~~~~~~~~~}}|||{{{zzzz{{||}~~~~~~~~~~~~~}}|||{{{zzzz{{||}~~~~~~~~~~~~}}|||{{{zzzz{{||}~~~~~~~~~~~~}}|~{sonrw~|wpnpw~|zzzzqmojgnx}ug\_n~wtysi}W^vzvrolkmt|vw{tnkkovwu~wpqyxiadilqx{xrlnv{sprxzb\tkYW_iorssux~rklvzndcjsywtvqhgjnonmpxtjeiu{zz{|}eT]}|qnqv{~~ulkqupkkqzzqic`afp}~{~xrpu~vqonorx~}snr~q]Z_bkoc_`cfgebbiqk_bovx{wnjks~zxunpssrqqruz~{x{{yy~{nuxxpWVgp{}oe_^_flfZfk]drz{|}xtpij}|o|}qjiikp{zxwvw}~~wuty~hebNXiy}urqj\hj_pnejptuy}yyuom|}u}{zx~wy{vx~|vv~x{zytw}o{xwaiZS`n~~tjquftimyrprz|y||}o{{{yyz{vuxvy~qtytws}|ymqd\eXV\nsxvq{kt{zu~}x|ywxx|}r}~~ypjtymgpzuz{{uvssw{~~~w{ls^_fgknryu{rppv{w|z|w}{q~~}vsqv}{mmxvolov{zzuzv~ysttoeo]URWdw~zv{wx{||{|vvzux~tjoxqdgouvyp|yt}srsyxyzy{t~qvocmkjfacy~~xvxw|}yz}zy~wsw~}xy}ujryrjgkty~{v}}uywxuwqzlpra[W[emkrx|u}z}z|z~zzrw{xov{oehnqpnh{z{w~vtu|wz}wwyus{ogonkd\\o~}z{u}~z{~{wyuss}~{pv|ulgio|r|}x{|uyzy~~txs|npvhb]_dg`cy~y}xzyz{{z~q~z|v~uyylkoqoldt{vvyww}wv|z|tuxyiqrpj`Zdqru}~zyzy{vy|szqyyvtv}tlkmytqw|zxzv}xtszxpzmd``eib\h{z}{x~y}{{|t{ywx|~|onrurmcmtnx|xw}zw|{}sxyzioqpi`Ybmkhtzz||ww~t~|tuy~w~}{|~vpopxln|u|{~xz{w|vxt|sr}piefii]Wdrv{zyyyz{x{sw{~s~}{truvrkeunoxq}~vz|~~xqwnutqia`hh__kz~~{}wxtu}~{yxus{~}yuv{xjumvv}zwz}xyx~p|wnihkng[\ehhlw{}x}{{{|{{{vtw~~|{z|}ztluphvkw||~{z}}wv{ymtwvndajnd[]emty}~|wzv}~|wu{wwxzxy~||{mzpqwlx}zzy}}xw}{}p~|tqqtsh]ajic`eqyy~|~{y}|{~}qw}|wu}}}tquqtgvzxzy}~~|}uypuwvqkkpnc^`ddeeuv}ux~{tpy{v|y{~v{|xozujqx}}|{~x}xuysqsxxmcfljd`bhmez~w|{~tuvx{|yvv~}y~}zwy|mvtopv|~x|yyqwywpknvth`aca]Yfsoz}}zx{}|xv{ztw~|yy~wvyy}{mqtvuty||xy|wyuw{{qgjqpjedeh^eqoy|~|{uy~{~~{urzvuz{ytyvrryy{xyvwxwsoovyofdghd_^jaixu{x}}xtwxprx}~}~xs{y{rssroq{~}v}{zvwzxpkospjhjkdWgfhzyzxw}}xuv~}vvz~~}~v~ytsvzyvz~{xw{}zsmmvzrheeeb^ak_fki{x|~yvzxstwyz|~yuz}||vyxuolt|~|z{{z~~}xmipwunhhkg]fa`rms~zx}~~}urzxvxzzyzy}|y{{vns}z}wwz{xrpuxrjijid_bmb`lbm{z|}xw~~ursusryyrv~vxzysprz}z{~|v}sklrtspnlg[dh]iigrzt|}~z~{x{}xwz}|z{|~}|}}xpnvy~wvz|yusw{ujfgif`_kdbj_hux~|}}{z}{uvxxtsyz}tt}y~{z{{wrt|~wsw~~|{ulpvuqoopi\fc_ldahqy~z|wt}y{}tsvyzx|~}xnpyyyvwxwwz}rkijjhfkk\gi_imos|~zx|ssvvsq|}uzuzz~~~|ywy~xrqv{|~~~vtvvurqrpcci]fg^`ejms~z}s~{w~}xsuxyy}~y~~xsvz||}{{yvtw}qjihfelseeg^hnllqx}~}{xwxwx{p~{x~z~~}y~|}~xxupprtw||vwzuttqgln^gi`_`abfp||tyuz{~~vttttz~|w~~xz~|}}}|~yw||wtqmkjrrfpk_hlkijmomq~{zyusyzu|quz{~x|x~{z}{wuusu}|x{|ywofqqgnf^`b`]^grxz}}{zvvvsw}}||xut{x|wz{|~~{s}~~{|yvurlkttirneknnnnmhccm}|}~}y{zxtrz|}}|txy}xuy{|}~{zwss{zwz}ukqrgsse``baadjljlt}|txxpqsvy|zy{yuv|xzy~vv{~zyzywuvxknujmrnjknng`bks|{zz{}u~sy}}|~{{s}|uyvvyz}||}zz{t|}tmwpjsngea__bhmkfdhpy|w{{rpqqt||zzz|sxxztyv~~|zvwxvw~~nrsfnvuqnmlfacjquy~}{v~v}{z{|}|{}t}{txxxvuy{z{|~v|yzv|pjvphggd`ainlebdinw|}}w|usqoor|}{yvw~{u~vwz{}{vyzxwxzusyljqrrrqlfcdimpsw|}{|}sw}|ztqyxqyzxy{zy~}{~xw}~|u~ossiddedcdkokeacfku{z~vvvsqsy}~}|}|z}|xxr|{z{}|x}wz|wuv~yxokstsstqh^`iqsrtxxvyzx}~zuqr{}t}x{}tsvxx{~|~~}u}{x|s}wkgfeehlmheddddhr}{|~~~tqttsty~|wwzz{~x{wt|xxz{|xwz|~~{zv~ttutsqqpjdbfmqrqpmm}|zypnt{}zxw~trtxy}}{{}{z~t|x{vlgfddiqska_bcdgsvo~zyusuy|}zurrv{}}w}x~~|{|wuvvy|{}w|vv~}xvtnhegklmqsqjfrwq}z~xrrw{|{|~vysppszxxyy~~}v~|uqliilprnga^aeioketyv}{zwsvwqooqy~yu|wx{~ywwy~~~xy{zvrjeinqokmlfdomiv}~}xuvy{|}}}|y{|~yywsty}zvvy~||{x|vtsnkptsnjgc_ajrjcnmht}~~}|~zspops~y~~x~}xvx}|x~|zww}v{}skgintutoiefpibpuqt{vu{|{yto{{}vtvxvw}}yyxv{{}{wy~~{zwvwvvuohghgefmjcnmcjsz|{}~zvrory~xzyzrrz|w}}~|~~~}~}zxmjnpqstpe^kqfiokhipxyw|~xrq{|wzvvx}}zyxxz|~|x{x{{vwxwy~~wqkfegkpnceqibhqvyzwxwvvzzpv}zwtw}|u~z~{x{}y{~wspptusrqjejiclskfhkoy~~zpp|xr}yxvtw{vvxy|{xy~z{||wwy}~tkhgeiprfamkfjnquxz~|uux{}rt|vv~~ywyz|~{xz||}yyy}}|vtwvssqlgenqbdqoieeinwz|ytyzou|zz{z|ztsuzy{{~}xuw~}wnhgimqlfni_fosssutsz|xtyvq|zqw}vuz~~~|xx}z}}yy{|}xuux{}xspickqgflljiihlt{}yvv~pu}xuxxy|}zusvzwy{y{~}}{}|vspjjopeernbclrttrppqz~~}||xy~tou{~xux{wx{~{z~|y{xtv{}||wmfgomemqhbdgikqy}}~}sxzsz|xssx|~{wxzxx~y}{|{}{y}z{|xtssstndjogeijnrrnhhnv}|~vwrsy|}{{{|}vr{~{}xxy{zxux~}yohpobgsqibbglpstutt|{{|wvqppt|{vvzuyy~}|xz~zwxww{|oeoqffmpnknnjfgnuz|w~vwz{}{zzyx}}v{w{|wy|}{~w~|}xrtxpglpmifcagotsomnpvwv|tqrtx}ywy~sz}z~{y}}}yyxz~wnsqfekqroheeehkotwx|~|w||{yttx|zvyux}{{xx{yyy}{}wxwiounhiiigjprojgint}|~yurrw{||||~z}xu||xvw}}w||z|zs|ykhlnprpjbafkmmnpnn{xw~xtpou~yu~z{snqw}}uqlc]_iuwj_cu}taX^nzvsxolvqsyht|tkgjouvm{|ut|{y|{ux~vlbcq|qZQax}sf\[aq}yoprw||vmfcdkzwjtqmt}qv{wzxtwvc[`jw|se[aoxxspmcar{tvskjmoqsuwx~xlryqosy~xvwrq~|}{|{kfdemtxvnbYW_nxyurzvw}yx}snuzwwompuz~xvuuuz}vkpzvwxxxxwtpvvlkqplhiouyyvl`WYdpz}z|y{{xqn{~zvqmnppqrpmmt~{sztrv||nhpskjpxzzzunhec_\^cfir~}{~}{vqmls|xw~|vporw}}w|}wsu|ymm{|z{yxzzvqjb[W[fljeq}|~}uqootxrnz{z}}{zvt{}|zwy}vqkhhhe_XVZemggt}xz~vrtvwurojfjwyrv|~~~~||zsmieb`bd_^hjfhq}~|yz|~}zyxtpkkoqnkr}}xx~}|vommlmlg^W\gd\alpoqyxz}}||ysmlqsrnhdemwtq{}|}xrlijkke[[fka]ckqx~|xvvy~{trqpoorogkzzsu{~~xrppolje`agd^cigeegoy|xusqportsngforjnz}{{~~wrnmpsna]gi`]`eiknrtw|}{{|~yrpruvskemvuqtz~~}|}~|{yvtqlggmnb\fmkecehnx}xttvvtqqokkrsjiu}{yyz{~vrrrspfekibadefhhhkqv{{vruz{rhmtojpw{}}zvvz~~~ysoifltmbbjliebchnt{~{wuvy|zupnpvwlgpwxyyz}}wvxtkgnqe]`fihecccjtz~~}|{zxyxonuumiltz{{zwuw|}}zrllqrieklihggghlpquz|zyxyz{xrlpzzokrusqux{}ztjfosjb`chjhdbbejsz|}}~||~~voqywlhkosxywvwwz~{}}xpnttjelqmecehklopqrw}|{||{zwtswxqnuwurqsy~~}}pimqjddedegfcabflqw{|}||~rlu|umknqrsvwvx{||}~~}}xvxwmehoqnidejnpomnos|}|yusv}}qmu{xspprw|wmotmdcgigdcdddehknptyxswxsnoppqpnosvz~~{z~|~|yyrhlpnkihffkpqommpu}~|xuxsnu||xsrsvy~~yvyvkddfiif`^`dgijklmuztx|pmqttqonmnty{}|yw||{{~rostpkjklkjlnmllntwxw||xy{uxzyxvustwyz}~{}}}}|ywkghiiigc__cghgefjt|wxwpnruuqmjkmrx{{zy{~}{yx|ysnkjlopmjkllmprplrzv}ywxyyxxwvw{{v~{~}~}~|snmlkhfdcaadggecgqurt~zzwuttvtqmklnptvuw~y|{~|tqooprqmhhknpnhdkx}{z~~yyvx|}|ywuuy{x~}}~~~~yxvrolhfefecbccbemqkitzxz{ytsrponnpppsv|xw}~wsrrrsrokhjopkceosoqw||{z}}yvuux}zv|zy}}{|~}{{{xrlheegihdaadkpjchr{|y{}}ytqrrqpnnllt}x{~~}{wutqoonmlllfchpojjqy~~~}zwwyzxvv~yvy~}{|~|}}|}~|yslhfffgfb^akqldfouwz}||}}|xsoqtuspmmpzzv|{}}~~~{xuronopojdbiqngfiow|~|{{{zzyvpnz|yy{}~{{~}{{}~{xsmihhgfeddglkefmsuuw}~~}|zyvsqrtsplnu{yux|}}~ztpnmoqog_bnrlfgkosy}{{|~}yrns}{xz||||}}||~}z}|||zwtqligebbdjojcemssrsv{}zwwwwusssrrwzuos}|}~~~|upooonhcelmifgjmoqty~||zqnu|zwwy|~}{z{}~}}}~{{|zxvusrokgdcfnph`cnttsrux}~{yyzyvqprx}{snt||y{~|z|~~}~}zurqohbemohcehkkmnpsz~xsu{zspty{||zxx{}{|{{xwwvtrmgdflplddhmpqqqsw{~|{{||yusxuosz}~}xy{}|yy|~~|zz}}{wrkddmpjb`dhjihikov}}usy|topsx{{{zyxz}~|y|}zxwyywupllpphcgnommoqrsuwy~~}|zy|wtw{|{{~|~yxzz{{{zyy|~~|{~wlehopkebacghhfgimqw{}yu|~uppqsuxxxyzzz{}}~~y|~zyyywtstvtkdgnqoljmpsttuvy~}vu{}{{}zz~|zzzyyz{zyyz{{~|wmkpqkedddbcdeefhkmqv|z||vsrrsstwxyzzywx}~|{y~~|zyxwy}}shfkprqollnrsrrsvz~vw~}{z{~|~~}~~{xwvwy{|zxy||x~vrsvsjdcefecbcefghiknv~xvvutrqpquyz{{yx|{z{{}}~~|yvw{ymjmpponnnmnrssstwz{{|{{}|}}|z|}~}ywvvxzzywx~y|yux|wmfccdeeb`adhiiikpz}}utvwvsrqqswyzyy{|~z{|yz~~~{xz|sprsrpnnoponnpstvwwtry}}~~~~y{|y{~~{wvwxxyzz}{{xtx~wmfddddedbabfhhils|{vtuwvsqpqruxzz}|{xvyyz|~}}}||~vsvyvrommnqqpnorvwvror~}|~}}}z{{z{}~|zwvvvvy}y}{uyxqlhfecbbccccegimsyzuw|zyvvvvurqqqrux}{y~yy~zyyz{|}|~{tuz~|xsponopponorusmkq|~}~|{|||{{||}}}{ywvw{xv~{y~wrpnjgdcbbcdbabgnvxsos~~|||zvttuutrrqsy~y}|xy}zzzzzzz|}}xvz~zvrqpppppoooolimuzxvy~~~}{yyzz|~}{{|}}}|yvvy{x{~xutsqnhecbcddcbcjstnimv~~~~}yvuvvtrpqt|}z~{vxzvxz{yxwxz}|z~~{vsqpooqpnieeltvropt{|wsw~zxy|}|zyz}~~}{z|}xy|{wvwvtqlgedccccdiopkgjqw{~}{xvwwvtsv|}yyzuw|wuwy{zxwwxz}~~{wtqppqpkdahqsnjilpv{~}wqr{{yyyz|}|zz{|||}~ww}{xwxwurokhfecdfknmgdhotvxz~~{xvvvvw{|vtzzw}|yxwvwxyxwwxyz}}{vsrqpmhbcjppkhgjmpuz}~vru|~{yyzzyyz||{z{|~zux~~{yxxwusqmhedcgmqmdagosttvx}~~}zwvx|zrqx||zwwxxwvwyyxwwwx}}yusplfdgmnkggghjknqv|~wtw}zvwyz{{zyz{|{zy{wx}}~}{xvuutrpkgfhmpmfbdkquuvwy|~}}{xvz~uqu{~~{wuvwxwuuvyzyxxz~|xsngbdlqngcegiklmpsy~yvx~{vrswyzzzyyz|}|{}|{~{{~|}~}zwutsrpmjilpnhceimortvwy|~}}|{|xsuz~{}yuuvwxxwuuwxxxy}}zsjddjonidacgijklorw|ytw~wrqruyz{{zyyz|}~}~zy~}|||zwuttsqppqrmeaelpppqtvxyz}~||}~wux|~~~{}|xvuuuvwwvvwxz|||ulfgmolgdcbcfijklnqty{x{}vsqrrtwyz{{zz{~}||wy~}}}{xutsstwyuldcglpponptvxyz}ztw}}|}{xvvuuvwwutvzzy{tnmpqmgccccbbegijlnqu~}|~yvtrrrsuwyzzzy{~z~}yz~}|}}{xvvx||shfimpqqpooqtuvwz|}~~xx}~~~|~}}|zwuuuvwxwvx~xx}|vruywpidbcdcbaceghhjnu~xvvusrqqsvyzz{}}{|xw|}z{~~}}}|zy{wpmnpppoppooprtuvvvtsy}|y|}|}}}|yvuuuuvwy}yx|~xvz~~vmgdccccbaacfghkpw}~~}wvwwutrqrsvxy|}}~xuy|ywy|~~~~~{tsuvusrppqponoqstrolnwzz~{z|}}|{yvvuuwz~~yx{|wyxpjfedddcbaabdgkpvyvuz~zwvwvusrrrsvz}y||wvz|xwwy{~~}}zvwz|zvsqppqqpooqrplilt}|y||{{|}}}|zwuuvy}vv|{|ytpkhedbbccbabfkquuqns}}{ywvvvtrqqru|z{~zwx||yxwwxy{~{vx|}yurqpppponnmjhjqy|||~~|zy|}|}|{{{|}}|zxwy}xux}~|wsqnkgecbbbbbbfmtvrmmt|~}|zwutuutsrsw}{{{vuz{xxxxxxxy{~zwz~}{wsqpppppokhfiovyxvvz}zvtx~{{|}}{{{|||{zz|ywx|}}wtsqolhecbbbcdgkpspkkqx~}|{yvttttssv{~{{|wuz{vuwxxxwxxz}||~~|yurpooookfbenvxurqsx}~ytrv~~{zz{}|{{{|}}~{vv{}yutsrpnjfcbabdhmonkhkpv{~~}|{ywutuvwz~|ww{|vw}~zwuuwxyxxwxy|~|~}zvsqpnlidbfntspmmosw|}wrrx~|{zz{|}}{z{|}xuw}zwutsrpnjgdcdhmpnhcelswz|~~|{ywuux||vsv}|{~}ywvuuuvwxxwxy|}|yurplgccglpomjjjmosw|}yuuy~|zzzzzzyz|}|{{}xux}~|ywvutrpmigginpngbbhosuvx{~~}|zyz{tru{~||xvvvvuuvwwwwwz}xsnhddinokgffghiknrx|}xvx}zvvwyzzzzz{|||}}yz}}{}~~}|ywvvusqnmmpqmgccgkpsuuvxz}~~}~~wsty}}}yvuuvvuttvwxxz}{tlfdhnqnhcbdfghiknrw{|wx}|wsstwxyyyyz{}|~}yw|~}~~}zxwvutssttqkecfjlnprsuvxz}{vvx|~{|zvuuuvwvutuwx{~}}woihlpplgdaacefgikmqv}}yy}wsrrtvxyzzyy{~~}}xw|~}}}}{ywwvwyzyskdcglooopqstuwy|{vwz}}}~zwuutuvvvuux|{y}ztnlnrqmhecbabeghijlou||}~zvsrqrtvxzz{{|}{}ywz~}}}|ywvwy|~{ridfimopoopruvxy{|}~xux}}}}|zwvuuuuvvvw|}xx}|wrqsusoiecbbbabehikmpv~}}zwutsrrstwyz{||}{xx{~~~}|}}|zy{~~wnihkmoppppoqsuwxyyww{|yy|{|}}|{xvuuuvwxy}|xx}}wssw{yskecbbccbbdfiknryzvuttsrqrtvy{~~}~yuu{|z{~~|||}}~~wqnnoooooppppqsuvvtrrw|||z|}||}}|zwuttvx|~zxz~}wux|~{tlfcbbbbbbbdgjnsy}~|}{vuuutsrrrsvz~~|~{wux~|yxy{}~~~{trsuvtrqppppoopqrqnlnv~|{||{||||{ywvvx||wvz{xzzsmhedcbcbbabejpuxxtsx{xvuuutsrrtw}|z}}zvvy~|ywwxz|~}wuwz{zwtrqpppponmljikry~~|zyy}}|{|}}}|zxwy||vtx~~~|wsokgeccccccdhmstqmlpx~}zxvvvutssuy|z|~yvvz}zxwwvwxz}zx{~~{wtrqpppnkgedhnuyxwx{~~{wuw|}|}|{{||}}}||~|wuw|~~{wtrolhfdcccdfinqplijov}|vyy{{w}||xvqjijmw}qluzxy}~tnuif}x`aoqidegfehp{xuxt|nbhwzqlmvznp}}tpnotyzwutx~x{z|oc]cntocZ[erzzvstyywzykgnzwniilptx~zwprzztmhip|{wyyst}rccmutkdbfihfejq{{w{z}pgfmx~wqmlpw{wwyzyvuw{}{vtv}}w}{rg]Y[bkt{~{tmjmsz{vtvzytrrrqmjjnsvxz~}z~{vpkijpywrrw~wmbZVX]bcb`^_cir}wtvxz{~}ytqooqu|{vuxzxz~|xvtstvy|~}{uojgggfa[WY_hpwytpnnoqu{~{{{z||z{|{xtssuxz}|y{~vnhca_^agottromkihhhjnrw|{xy|}|zyz|yx{|yvtssu{{xtokifedcbcehllid`_aehjklpu}ywz~zvsrsy{uqomlkihhjkmptyzxy{||||||}zsnmpuvtqnnpsux{~zuojilrwxuqnmnoooonnoqsvy}|vrqqstuvxz}}|{{{yuokkosx|~~}yvtsstwy{zvqlkmprux{~~}~~zupib\[_ehhe`]\]^`abdgkqw~}{{|}{yuqnot|{ywvutromlllnpqojc][]acdehknrv{zxzwvqlged`a_]^dqz}sjprhjpvxzwttxuusihlrwwvvuqiaf{wrmck}wmgfjox~pclqx|khoy~vpmnwxu}}}{wuy}rxkmty{|}vkgmywmn{{t{~u|leehjjiimux{yuromns{yoy}rs}z|xj`^bhlmllkifa[UQTaqyuos}ytrru|{uztsyyvvz~unlmqtvxz{zxtnjjoyuoptvurpnnmmnosx}}xrlkoytorw|~~}zwvw{ywwxwtrpomkgdcfkt|}wqpsvx||vrrw}xvuutspmhc`do~~|vojgecbbdhoxzwvvwz~}xtpnrz~ywx}unjiiiijjijmquyzzwutx~}|~|xvvz~~}{yvttx~xsnmot}}}{{|{vnf`]\]_behjmnmkkkllmpv~~{yvsoljjms|}z{}yxx{~{xtniffhkllkkjjihffffeddgnx}zxvvvuqlihkpuy{}}zvsruy|{vpjd_\ZYYYZ]aiqz}}}~}{ywvuwyzzwqmmqvy|}~~|zxvtqonosx|}zvsqqqrtvxz|}|{zzyyxwvtrrv|ysrtwyyyxwxxwvvutsrrsw||xvtttttuvwz~xtpnlkjihfdcdgjljgeflu}}yuromlmnoqty}{}~~xqkjlopqoljhhgggfecaachouy{{|}~}|~~{ywxyxuqljlqvy{|}~|{tlg^[XVXY\dlvtf_cq|~|~wnfbguumwrjo|{xmrrvrrrv|yvtu}yxy}xh\eshT[vxlimtx{}|yx{zwy|}~|ytsxtiuwx{sr{silw|zvmz~phdb_]ZZ]dlqph`^dnvxuqooqu{|tmikt}pkox~y|whixwpmnpru{|}|zzz{}|rdZ[gsyvoigjntz~~}xttywjgo~|wuuvx}~ww|snllkieb^[[_fpy~}vld``dinsx}|yusqooqw{trvunjhhiijkmqw~|{zyxwvtrqpqsuvskc\[_ekorux|{tnlnu{vrppqrtvy}{yyzzyyyz|~}{|}~~~}zvqlgdcbb`]YY]emty}|{z{|}||~{xvvusrrstuvwxxwuuuwz}~|xuuy~~zsmfa]]`gpx||zvrommosw}|vssssqpqrsuvwxyyxwwxz||zuolmquy|}}}||{zwutstx~|{zyyxxz|~~{uolmquxz|}{yxvtsstvuqkggjpvz}~~~~}|zxwx|~||}~xphdcded`][[\]`behlpux}~|yvstx~~zz}}yvuttrqonlkihhggea\XWY\aeikmnpruy|~~{{~{uqnllmmmllmnpruxz{yvuvy|}{ywtqmighlrwyxuqonopqsuy}xttwyxtpmlmoprrssstwz}~zussuwxyzzzzyxxxyxxwx|~~zrrxyxswz~ync]]flu~vz|o|vntzu||s|tms~{utphagxydex~mjx|ps{{uwkan}|f^mvmqvz}jrxokmv}t{sksfmx~~~}}uszifmx|xwt{uuu|fhm{~fSfr|qkedobfsr{tqn}xst|yrkbcq}pnorwuodk~x|{{yimz{kmuslupse\_hgck~}{omlbVZjwyvvy|wxuxt}ogklurlvtpwxqou|}{sidyxlghtllki^QQ]k}}|wvzvyvtmrtfhk{~~}uuxpoosy~|tqbr|}~|vzwyt}{x~x~yt}{y}wrvehhq~swolkkxx|zw{mv~xvnltt~{~{zxr{khgkz~yoqlgmgvvqww{x{rxqx|~~wxpuun{x{vuxotstz~ux|xvwmwmkptxynm~yyqsrrzw{znyuxtswopnlxkigjnhoqrwly|{xosrt{yyrrr||uzsx|||zxjrmkd`bY[^c|}~~nvxtrikhce\f_[_ajlqyxyy}uyxw{z~{|z|w}vvw~xy{sv}xwnqvv}x}ykkjrxzyss|nmjopktzx{mmokg]_YSZZp}}xt}~vuxqsprxmqqwzzu}vxzzzpipnngkmgiglvjjjrsmtttqdonnkkuxxyt{niimsv{zyrvsnc[[UW`izzjmsomefgadajjcfhooouv~uxv{zwqutnpmw{qrt}{xxp}~{vyjfdjnr|}|uzonr~|{z~|yzywuhnmj`_dejtz~~psyvrlmoikirslnpvwy||~zxlw~snttphjicb`fnbaaiidjllict}zyv}rnmtxz{zt}~uy}}xueefc]^hlnuwupwsphghb_^bg]\]ehny}ruxxyzwrrr~unlrtnnuv{uvrnsriiox{yrno}xy}{|}xttrof_hlolswtstz}~~qy|{vrtskkksnilvy{|ztn{|xzxwmotuljmlggennc`ciffqy}}zxytmlotlknwz~y||wuuqmfqxzrturosx~~ykpuslggh`^_hhflz}xy|ww|zvnz~vtz{squuomktvkhmuw{~{ytjikphehqt{~{wx~}sorsommrtutyzzwtw|~~|}xlswumjkmeeivy|ztuwqklpoigx|}xlmrqhhig`]]ge]]hrw||z{vpquvlinuw|~zwswsqotz~zzupstqqtwoutnfddb\`jxxz~|}wsxvqmrrpis{u|ztvtqjinunlu{yxyollqidgqsx{}}~~vvz|snpsptx}}tvusmpw}~~~rvzxpnmqmq{}}xqtupjkppmsz|ytmqvrikkjcadommu{xxwyqkkplfgpprt{~z{ytv{{}rspojls~y{~ruywmkkqqt}{}|ztu{~smqtoklvyy|{~{suywnrqqjhmz}zyrgfjjc`eghmq|}|}sy~wxuxqoqvqklx|ywwwtpr{~vu~~~upvwpmry{wx~yokpjhfqz|y}~unqslhjgf`er~}y{{vwnknsnfelimlry{z}~~~vux{vv}}}xnrqsljnxzw{vtxysx}}~y}|y}|sqw}uklqnsv~~usyzppqrtt}}~vtqsjikme_biejjuz{}vv}~vuvvulmt||~zz}yrvssjgmxyvy~||rs}z}|{rruyqimvv}|{|~yrorsjkqv}||~x}worotliilhcdjeln{~{|{w|{xyvyrvuvzxnqkkecjw{wvy|{|~yrw}{rvruojlsrns}|{t{ztlotst{x{ypqnpj_`ee]Zcekw~z{v}~vmpwwmpmtvx{x|~toomoimv}wry{zu~|{tuwvsijryyzy|w~||wz{ulnv|{|upvzsrrmndeijdaisx}z~|}ztu{|swzy~xqssjdjhnjkqzzx}|~|zxwv~}wruwqruqslp|{{u||w|ww{xux}|zrmsxqliejb`bfeerzy|{tszwpnuxt|~{zqppigmlqigozzuy~{xzxz}spvyqrsswt}|}w|zuu~}~{}vz~xszuoouujjjjmbcjprw|~y|vvqx|uns|}~|ylfhjbgiggahsyvv~{{~uqmxzvznostzvt|}wjjkr}ydatsV`mnllmjoyw~stmotzkaz|~v~{moswywn^\mszma_fko|}~|ugam|}zv||zidt}op||xsusmts~xzqnnehck||ridgztj_\oz}~xmsvwogo~vyyswnt{zurm]PX^orosyxxsmrwvy}ytnrj`_ky~yv|{|rupgftyumy|}{{{sjfaZgqvzpmpsoluvx{ry}~zzysouvklchpv{{smcW]^`gfqyvtpknkcleijfen{|znkqjmgglggo{z{oltu{y{{||yqgba^bry|tu{qtqvzyztnqjilmux{vz|sf_^ZSXQY\`rzpsoopgnqpu~x}w{prvutzttlsrkpy}}t|||xv{~{y~xtipmbYZ``k|}}zr}{~yy{~wy~|txuqwqvrg_ac[U[Wafm{}|yyuupzwwmrwttwyrmvpsqls|~y~z{nntwvtyphmeif^[als|~{yvxumhlkgoecb^ZXWROZYhppy}~y{y|wu~|vrrupuomtou|wz~xx{nrlinttlijdja^c`_gv||uqpoiiqijd]gf_XZ]Yepr|xy}}|y}{z|~|{|vruowukgnuonsp|~}tvnpqkptqhhqige`jmqy}~{{ljlkhgla[`[`]VTW]`ktq{vry|}{{v}ssqnnprmnxu~y{xxqhpkjrlkijkjndchcpyzzz|}zx|~twnloroiibdj_ab`_grpu}tzvw~{~~yvw~|v}|xsxurrcjolhioou~vspktptthipsokoinsv~~{y|}{{oqrjnqmcai`b^W``bhnpmtpmywvx}z}~}}}~|~sqpnupijquy~tlmmhotjmginokgmmm|x||vv}~z}t}}|tvyq~}wyxoyvsqmklph`iafptsuxrpxt}xqv~w{wu{|{yxvx{|}xvx|{wuklshjigho}~xtquttwjqupooqos}{}{x}{xw}x~s|~zstvoytiimmhfb\ebjsqponikyppqow~~|u|zz|x~}}|vzytvilpmr||txsoqtpholprhhnpqzzuz{|yvus~|xwprsqr{upuq{{y~}ywyyvouwskkofryu|}wrsvvzrpzxy}ytztt}x|xsv{|tx}xxvx|yzxsqvvhjgdlrvy~|~~}|ysny{quqpu}|yy|}ytuvyz{vjxytxvwyzwvxv{wistpokihlnp{tvwpmqumjrmvxtwussvzvu{~}|{y~zzw|~zyrktmt~~~y|t||ummqoumisos}{}}xttyzuywhqpkputmmomwoluwz}{xyvvwprtsw~}|z{{|wsnu~u{{rptusy~vyrt}{urxyzxuvow|uzpnuwsknlftuw}}zx|~|uw{yqxwt}|~}xtwntvvywppwwmsppxy{yxyxrjtwnsmmosz}~y~ss{wnjlnpwoqnimptx}}pz{{z}}{yyx~sv{yzxuuwyy{|}z~wrtvtqnjrwt}wu|yutphgoejtojhmpqpfnvr}|uvxy~pt{w}|~xsswvqzthqnlsz{vvuxutzz{xwvqostorlnxqlnrqt||zxyy}}{w{zzuxxz~{roojqtpwolswupsqpz~|x|ulntsmrony|vzqnoppnnjhibikntwss~y{}y|yyzzuly|u{uuy}{{zx{}~sz}xytqstxy}uwrhfeddmoafkmomkntsx}yx{{zus~{}ux|xtsmdkndpurpqx{ys|}vzznrvtnhjlvqhrqqz}w}x|ysrx~{y{~~wsqnjmqorjhwuqpsuw|unwwsnopq~qtxrsqog`a^fhgqkhrz{y|z}{}{yprwvuzsw~{yxxy||}{~wu~}~|~}uxz}y{lhiefiib`lfjmgknrz~~wwz{}|}xzphhfckujimpuxvu|}z~qx~tpkmpokfqqm~}}||pqxwuwwntzp||x{ynpsspjhmxoirrrxwyyrrrqs~|~v}wmgeb^acfk]dpomnsv{uv|{vqrrzz|}}zyronrws}zy|xxnqpinng`dhgjdakls{}xzz~}}npmjknleilkrmkqtx~~}tussuojjlkv|~yr{}tvtkhkikxxuxx{u~{wqlosoqy~}q}}|{sy|vrkrzp}z~vxik|zoltncmoxyq|{td`qwr]_eawgRw`K^orwighj}z}~{q|yurx{likrwuoovuwx}wq~sy~~vaP[\ipq}}}syxuh\imx|~k]kj`\cwtupmzxkinunpmruw}wniity|~y{ecVVZ_lk\_eeX_hjw~~tvps{xstomxqt}vja^t~xu~~}y~~myyvf\]TXcrzwpku~{vnlmx|psrjqo\^_bZkyxxzvy|vmxz~zxtfUJNWnvz~prvkie\]RSZjonw~{twvrplnn{y{rv{xts}|~}|yxsst{wxtqsjXKHYbqznjpv||vwyrmvrsqik`^^hsu~znnphaY^]gsw}x|ztuwzvutv{x~{~}wrh\XUgp}tghknhepcfjupq|trtswljjxtpqjja_Y]efsupzz}zxtrnpwzztvxyx~{~xzsng\WVoytqpnllr`ablhgnknquyqur||}|ynieegdswv{x~y~xyvtx}{tu{oyzwy}{|rus~}mhgb\PNMSmv|{|ilhpjtxspprpggbuy|wsrruvwv{zxooy~|uz~x~}v|yvwz}tkmk|wzxid^\ZQRHVgny{z~~yxvjiiiwo{u{}{vy}~{~~zo~~}}}slkbiuwxtzpuz}|~}rqknxt}slhhh]YWObcqtumwwt|y|srvrts~||rqd]hlkdcdbnq||yw||uvq}|~u|v{||wqmhic]aU`go~~{{vvru~u{qxy{xx~v|tchmijdf\efqsqmllo||u}t{{{|~yzvpvsqfc^a`X^[[idv~ulpkyw}||}ps{zslvuvnkebhfqqsmlgnvmnmhun{}tvupigeabYSZNWX_qonhirjvz~{iqoyqvzstnnelks|{vrojrphsmpql{~v|ywpojigWVVP^[gqssfkmo}{x}{lrm{~xhoommiiepltyyuvqoxtqzqwss}~|{{~zyw|v~yqknkmjZ`^[ecpvxxluty~}z{{z{puuwlvsnlgdagamsspspqyomxr{w{zy}{wt{umrngcgflk\`[Zgix~z|nrqy}~yy{|zzrwvt|xsphcajeotqlnifmfdqmwxzv{umuqg`b_edRWUTbh{tufjls~||sywjmm~t|}wxqmkrkpyunmjfni_kiotw~{uywmbb^`fYXZR_fwtynjmo~}{|tsxkpr~ru{vzvpkqnn|{tstlpoajjksxx{~uvypedbcla\aW`hw}wprr}}xv}vvuvwrsvqsoignkkz}xvskoqclnpzz}vx~zuy~qqtldfcaja_f\ep|{sux~wr{~zwwuw{vvuorqkhnhfuuoonfklbnoqywx{wt|~nnod]\YZd[_e^itwwru~yt}|~xuwkqxptzz}ywxunosggssqrmchd]helty||ypqk^[]Y\bX`_Ycq}x~roq{zy~utsjwtnqzywxtpvvjrzvvvmeh\`hfnu~{~y}|tvjba`[b_ZbX[gy||pmtz}y|qqzrqs}}xtttps|tmvvvzwlkiakhkr|~~tuywuxzsdaa__f^ee\bqytuwv{y|zvo{vrt}wtsomwthnrpwyslmagjhozwvyxr{wtrb]]^[dbch[[h{~vrz|vv{uvkswrty~~zwtlszpmrmrwtiga^gcgsyy|wv{swl^\[YZ`Zd_U[n~|}wpry}~}xzwqjtolow{|zur~|qtrnuuqii]cc_ft}|y{}w~{zzh`]\V\]ah[T^q}~zxqux}{{}{ynmqkmuz{}}tuztyqrz{umi`gb^fx}wvxzxwzxgc`_Z`_fj]Wbr~{wyz~yy{{ortnq|~~|ywns|vtyptyzrnickdal}|wtvus~|rwsec`_X]]ila\iw~}~yuxyx}~xzqsrlp|yzps{uswlnswqlhclfai{yssts}qtqd`Z[TXYfmeakv|y||~|}twwu|z{tvnopil~}~ts{vrwmmsuqjg`hc^dv}wtwtssseaZ\UVValgbjs}w{z}yxyrzzzssqpsjhx|~ys{yu{vosuvlj`fgbbpz~|tvpywrulh_^ZVW\kjhnw}xzy~~zxtxpvy{wtuswojuz{ysz{v{xpstxpnfjlgfry}{zqsmu~wrulj`^\XY^mpou|wxyz|uqumrw{wrttzsmw|zyrwvrxwprqxrpikmijty~|y|stlrztophj_\[X[_nppytvw{{}sophnpwroquzso{}|xswtsyurpounmhkkilwz{|~vumsxqonhk^\WWX^knp}}rru~~|rpngmnwpnovxolz{y{uu{uvnornmjmignuww~}yvpxxrsmlk_]UXYdlmr}{rqw~{|qrkmnsxopqyulq~z|xsz{yzourqoomghsr|~xt~z{ssxtqqkpib\Y\_ilny}~wst{yuqpknkwtqqx|sny{zzst|zurtqrqrlhquu}rz{{votsoqlnofbX[]fjls~}usywzonhmhpvqru|vms{|}uqyy}zpsorrupiluq}vv|{{rttopnjpheYW[`gin|}|vqr|~|sokklfsqpovypmvx|rryzvronqsskfoqr~t{||uwroqkmmieWY\cefp{z~uqu}{spkohjroprywnptx{rw{wtmoqusjirnu{zu||zvvppqlrmmdX[_ddgu|}wsx}~z}snkqhlrrru{xpssyzrvyyulqtyvllsowyvtwyxvsmopmqkodZ]cgfjy}xtz}z{rkkpgloqrv{yswu}xpsvzvkptzwnouqzyutvwyuqjklkohof[]dhfiz~yuy|~{~~|sjhneijmquzzwzv|~yqrtzwhkqxxqpus{xxuvu}wphhkkogni\[bhfgx}{uwyz~vmflfghiptyzy|xy|trr{z|lhowzuptqyyy}svq}{tkfjkqhjnb\`ijhs|~xvyz}~yrhlhgjentyz{z|vrqw|thlu{ytvrx}wsunw~wlefhqkiphbaknkr~|}z{z~~}zytjkgfkdlv{|}}zurpu|wjku||yztyxttlr|}wkcceplipkeckpot~{~~|{z~|{~x}}wsiieejcjv}}}xsrns}yvjit}|{{s{ywukrz}xja`coiinigdlppv}z~z|~|zy~{~x{zvrkjbfhaiu|{|wsrnu{ztjhs{{{{r|}{yultyxia_cnhkljhflopw{{~w|}zxxz{ywrmjajeajx}z}vtsqyy~~rijv{{~ws}y|~||qovztfb_iniokkihlnrx{|x~xx}w~yxxvqpfelddo|}y}turtzyzqjoy|}~sx{y~}}xlru|}nd`bmjmmjmjjmovvwz|x~w}{vvvsrlckgcgv}z{vstsywvoktz|xu|y~}}qqtw~uga^hjkoimmjjlruwyv~yy}zxtvurrdficclz{x}tuswvxyslmuy~tyy{||qutz|od_ajhokimmihltr~uw}v{~z~vsvstncjgddozxxzuvvys|~wrmouyzuxv}|z~wtvu|zmd_ehkphjonhhosq|tw|w}|{}tsvtwlfkfefqywzyuvyys}xtoouzyxwv~{y~vvuuzxmd_ffmpilqqihqsszux~y}{{}{rqutxkhiffhrzy}ytu{xs~zxuqot|z|ww{w}~wwttwvmc_fdnpilrskistv{uw|~|~||yqmqrwlhheghoxz{tsyxqzxwvtoqz|yw}x}~}xxtsttoe_dajoikqvojsvw|tu}}{~}}wsknqwnihcfhltzuqwypvvuvvqnv}}w~~yy|{{vssrqi_c`epkkpxulqwxvuy|~z~v|zlknvrlkcfimqyzrt{rtutvwvoq~w{}yv|z{{yrrppoedbboonpx{sqyyzvx~~}x}vw~pikuuopfgkpqw~trztttswyzsp|yz|yvxz~z{{srnnpifcanpqsy~ytzz~}}xy}v|vv~~rihsvqsiglrsuvqytutqvz|vpz|{|yww}z}y|}trmkojhdbmpsu{|wz{}{~yy~}v|uv|~sigstrtihmssuwsxsvqpv{|vqz}||zxwx||y~vrlkolkcdmotv|}zy{|{yz~{w|uy|}sjhtsuujintst{ouv~wnonghloopqpyqe^U\coy~rrfovzsp}iWjzjdfbkkjq{}y]jXO[npnfY[bijfjqz||sulcgsvv~yxvtutspmz}~{yvspcjprux~l^_xvwolja_frvynORv|]TW^icciprnlrx|slmjgxwmllgsyvpyu{{~yshdaeio|{txs{qeclzokpspvfLMa{i\b`_fqxwstu{sojc\]c^k|xugemq}~odnsv~||smkjq{tvvywhghv}|x|kPITmuig][cnrqolm{ywticb`[Xbcbq}}ucddhs}~}}|xmjvu{|||yy{mfgj{~q^IMYvzpgZV[cecc^colnh_]__[\hfiuxihbfnvww{|qvwvwuv{~|rrxv|{~tedfm~zogVHP_|zm_Y\ba_^V^gfje]]ab]_khnx|pldgouusxwnsruvuxvuvu{|yn_chpvndbUKUdsg`aedcbX^ghmjcbff``ljqzwrjkryyvz|twuy|y|ytqr{~vl]ajsvmd[]WOZizohhlljk`bjlsqifijc`jks}~yopv~|}{zrmmz|~}|{ql]`lwzpf^UWZU_ouoloqqslfmpwxslllh_ejswux{pkgw|{z}|x|xnmb_mzy}vmd[RQ[[fuzuqsuvyvnqrz~xqnli_bgr~y{~yokeuz}{y{|vx{~~}zz~|uklfbp|y~{{}w|yqkcZQO[`m{|xuvwy~|tvt{|upli`afr}~}z||umkeuz{{xy~{uvwz}zvvzysilhfry{}xwzsw}}~vnibYPP\dt}zxyy{yxt||vqlg_bet{wxxpmjfwy|{xz}ztvty|xsswvohlikuy{{}uuvpvx{{skhaYOR]gy~|{{z}}zu~}wqle_cexwuttmmih{z|y{}yuurz}{uprvulhmiox{zy~zsuspuu{xojg`VOW^m}~}}|{xx{vpjaachzussokmfm}}~|{}}xvtr}~~yrorurikklsz}wzvrtorruztlif_SRYat~~|}v|~zvogadbo|vsqqkmifr~~|xwqw}~~upotrljglki}}ysr}zshtrnv|{rojd[TXXgxxy|}snh`iiuzsqhjnbecs~yyxupqy}wsnhqmimjwtoy|x}}|~~wnpqppu{slnbaYYedlv}~w~~rvredlw|yyvrypljhXZr~|zxtkpvzvyymmmh\jmmxz}{|}~|sjoknquzpliWNWUfpw{{}~knmhmer~rgnfklflees~{}|squ}rptmtonmghnus}xuwz~pqqncrtqqikaXT_ho|}~}vlhnggr~zqjkmfhifdu~zt~vvxxzrksnkmlghrrvyz~vvynrorrnotxigf`ST[epy|wijihem|{vmegcc`dfny{xv}rv}~pnokjdeenoxz~vyujmnkepnh`\\Z\[oz}}ywrngdrltrolndekbgiqs|u|xvsqvtoemmjmnqo{xuw|yrwnkedgkokqc^\\X[mx{~yz~ywfeggt|wohj_dcfntzxzvz{{syvv}}vghaekqvy~~~znnx|zpsgfdfehmddbd]]ft~}vsyz{okfo{y}woi]]Whmp{|vywnrwymg_lekr}~~}pqr{wwrkkjj_c`bf[``fc{~}szxqtqkaqt~~riccYYhjyv{|z{vsxnwur^acdlhx~ytyzqsglhab`aZg`a^Xdlz~|{svoujinnrw}}vkW[Z[]ju~~u}}qwmrokohe_ghsz~~y}mrtymmnegVW\_^[_^ijy{~z{pronnlsv}}~wrdd^bcekut{~~t}{tonnsjkfhiqx{wvmisokbb]`\`fc^\ahwu~}|{wsuswsiuu~{zmd_h^`fj~~}~}}|~z{~xrstxq^b\iqtt~~~wrkpuuypg_^\e_`cYd^hm|wujosmrmur}~qo^]\a`cvw~vwmmrorhh]jmt}w{pmo}von_cYZZa`\c[hcj~}~owtuuemov}|{yxcdXXbblqy~x}z}}qxrtvcf`adio|qrirsvnegZ`TVcab]]_kmz~uponlqrn|z~~{n`X^Y_lrx|w|xqollqpdjkimuz}z{jqolulh`YSYX_iebfhm|z}}|}yrprmuvrx{{{ih_`eaijtz~zwxpxvovfXhcnovy~unjvygpjX_^[a[^][idovmuqlomlm{}}}xwh^YWbdgrxysyinpiakgnqv~y~{tirvtyha\VUT]bd`mcjwn}x{xvqlxsumixx}{zwwvqoiYfYYhpzy{|}t~puuqk_celyyzx~|zkrfppfibdW[WSbfeekj|vvkiqkglzvtqtml`YZ]eivz~|zxiqnilmfguvv~uzz|uxok{jjfZ^YSU]afions|{|yu~rhvvnlrq|uvspupsxj`YZapr~yvyrt{pmnfjskw}|s{|{pigglscfgZSQTgdasjxzv~|mvielkyu~|~vvlnwfieW_cmp}y{sywuxjqojlmlhsyrqv{tyvmmnfhe^_RMSX_kpr|~u|vqrwlgguztuvqfmtrjlab`gurzv}y{yx{xqnhpqupix|~{xu{plpgifkg]XRXPZahoz}v{|zusuebpu{yu|~{{mononemgehcdt{{p}}uyqphssdfps}swpot|tyojdetaaVRSLRdio~}wsvzpkfghxz{z{zpjvohfjchqghrvu|~t~{{ytmbuxnqlmy~~wl{tyyhjfiacTS[RS\]ozzw{sz{qrkmpoky{}~|rlwmkiklqlfc`l~x{{q{sorgmjeipzztwupvhmfnhg[[OQYQUalty}{}q{pglhjfw}t}rnp`gemqjjhrs|{~sw{qqmvioppknz{{z|suuykgo]aZ\VUZX]Ylpq~{}pyr{tpo^qu|||wppkmvgwpfh^nnnyyoy||yx{emeipllyy~}ywpwkqkkkZb\Z[UXSZbxyx{ourn`hrl}~{thjmkohqdfoblqvy}~z|nqn^lsosvw~}}~u}vtgdb_\\aWY]UZ_kozr{xp|ztgkfk|y}xxxhpsqrhibmbdnbk}}q}tthbghvqpryuxpr{lhe`ceb\_MRYUck{uvwsmwimikwp~}wltenwfieodaieot|zzxzukbihqy~qn}txwko_Xib_`bUUZY`]rt}vzyttnxoewn|{}ss|onqkqdknim]etywz|wdommtxvsuvzuuyqoug]dhlib[VZWX]icuxvwxtmqsmidpswyssrpkgonjeembfsv{{y|}}upinrjvyux~ynnooi`fjfaW[TO\^cp~xrsvilunlosp||z}{rqk_imghkgakl{|yxw~yrqrkkupyus|v{yuoloa`jb[YWOTWZklvurusjnjkoak~tzyqrpg`fbllaouln{|u{{xwnvmdsrpx|sqwnkmj^]\`hYT^TSZko|{xfkulnu{onq{|tuq{wgni_akngot|}{}w|ol}yytlkltx}yppkpugin\X\d\]\_a`dly~onjmoptuws~~zppyvqokkgfhimo~zvsrw{yyvsljvwy}x{xlkotmmigb`]YYRZb^cuxzsohrojs{lr{~vrnnfflc`llgz~z{|wup{|rrzkgnnpw||zxspjkf`f[V]bR[^\\^g}|~pdmgfgjtxsyynpxhhkc`]_ltnww|vfsuspkmvpeuz|qxukisecj_YRPY]RRc`jrsqvqclnjpw{}{tidlrd[gagkz{zz~yopywktypqrzrqsv}tqh`glaV_Y[]fd\W]fp}|tzrnltw}zszy~~r{tqqxwjaaflusx}yxvt}xww|y{tkpisxktonmsth]Z\`f^^]Wddhuwknelsppzwr}yvuw{roi^hefkwlx|}ynuovyrmsmexx~w~rrqrukkgZ_YXZbQY^\dcssuodsnqngs{zyvzrmmvccf_d_ew|vv~ztwvj{xvpdkpkft|otojgpb^aUYQS``XUabqz~jlqkaiosy{yqqgerqe]eajkz~{jmutmpsrur}yrvqylkd^loeVYU[[ake_iqz|{r{ynitwy|sqmmopzqfiqs|vvxz|w{szzrxw{}puvt~|ojifjfsoa]ddjcYb]dnt|}~qosjtvxw{~txv{xijebmoqv{{}x~wq|ssutpvup}{zmqqqtfbaU]_a^h_epmxvxqnuhtstyoyy}poqqnrnfrlsrm~}xwtrlvrw{qvklz|{{ssnejihfl^ea`cX`hgejr~zpeqvsotu|}~~{~{v{otlgplgemr|qsfjwytwtx|zkvpspnggi||voo|xkg}ehniwuivnux|sy~z~~incqtxrxwdkks||u~vswrkvt{~qm~|u~uggzzoxlkqxvzlt|j^c]ekjnttv|gltqo|}wq{zunsqa_}|tpnt{t|~nlrmtgigctywyuunmyn~xppzxxnhgcdgjjpljpnzrzz~x{|~nfX__p{u~uvxz}~{{pnyebeacaldnq{|q|wummjv~|}~v||shgseoumsofmymp~~wyzx{xusn\\``r|xxy}yzqxxvkkaf[clemssswsx{npqt{~u}|xvoolrokrrifosqsz|{rupmcWQdhq~v~w|t~typki[[adgmpv}typrkgku~ux~tlkmnpptzdqosqx~pu{oxpbV^_h}~|wzzs|truoec`as_fqrspv{qqppv}y{v}mtqmrlyligxoo~|~xvsyyjlZU]\kyxryzx}mmjZ]Zmcfnyzpxztinmny|v{wvnmvoi|skrruuv{}}{rqvxsoh_]]`nvv~xy|ttqhf[kh`hjwppwrrnowtpuytxxrukrlkjstt|~zztt{sqja]^Odu~|}x}z~zuvgbcVfj`iwwn|{~hpqlqv~xtzvv~}qtsvnquoyn~wxzx~|~~ztltxekc_^Zgw~~y~}w|zqmg^]k]kjqzm}xwlsuvp|}qx|n{}}v}kslmtqsv~r~~u~zruxmldXcTUg{tzz~xyx`h^Xd^kjzy{ytpqqurqxujyuutwustqhxvs}ywzv{|~}tyrkpkgf]eb]kzx~~zv}wdibccbnn}wwwy{lnxtrw~~h{txwx{ooolwvxvxww|~}t}wzvvqlff]^]`lsxxz|w|ih_\h[guwy|z|kunpulu{v{lir|{p|uppnmyx|zzwz}}}{zwwpmshXi][jcpz}}xzr`a_ebmuwr~tzottrxvxvy{ymjus~}qvqslzq~{oyvsz}~z{w{onqoj]bZ_bfxv}t~~odfSfbdqzx~rxwtrout~}~y}tvtglru{}}ojrtn~yxqxzx{}uv}{qmperlU\^_fl}y|}z{nifYgiqs~{ypq~pqvqrwq}r|tqst{xy}ztqnuqy}qstv|x}x{}yqmolhso]]`bko{uu~}mpg^cbqvx}~}s|vrslur}q}t~lnsw|uv}pjswpztww~pw|~}~qlqlmoe]`Tfhm|z|hlhYbjrur~pyvtqqt~zuwuwsnpnv{wm|tx|{rn~slx}w|{odmjfp`^_\bhwy~}~uoo[`]lwsz}zzwuno}}syzmxqfpq~~}yuutu|zyssvnp||z{xz~qklhfocbaQ[fqzz|{zknf^^fuy~}|svxin{}~{}ttlwxjmr{}|tu|qr}}qkxrm{{}wxzjchhmlbj_Ubmy{xy}ztmdaelpyx}~yuokny|{~oprlfq{{yzyrpsoznywv}}~z|uoghmtiacXZ]txww}s{f]cbltzyxuuwql{yuzmozndmv|}{ox~{tsmrtpzztjkkamq]h^S\gqu}z{}{txi`]ijr{}w{rt|xy{wxqjvrhgi{wss{yovmlsmu{nlggdkhbd^YWfw{z{{}}{r}wb^emnv~zsrsxyw||svugppljp|ww|t{y{{snfrsnv|zlemf\gjdi^\`iy}yx~~u~l_jruux{}ynozpy|{}vvuoqlqpwxxvut{}}xveqvpu}}~mfklaajhp_V]rw|~{zzyzogdqvqy~z~unt|ttz}{wohsnhswu|}w~|w{~rrklppnzyujed`cbbqaY]k||}s{r}rikprt{{pq|ry|}}w|snilmkqwz~}z{zt{~ssgislhv|~}wj`bbYbajg^Yo|y{xvywsztummtz}}|qw|mqyt|yxnpdnsfl~~w{z{uz|vnojmklvzyy~xf`^__^Yjnd`n||~~qqyw~vvyuq~}v}ysywjpov}strsjntnl~~wzzysr}yrnntiky|~z{}yrjd``^c\hrkhnzvzwqv}ysxzxyuvzsuvnsntxqrwppnis|t||xvz}wijrogyu}{~~~okhe`Y\`nlmgn{zy}zqws|rs{wy|m`UOVUbluyy{wwnu}{yrv{|ysshdW^dej|wZfvwqvuuw}}okjt~{|pguy}{wtccns}tsogW\o{i_Y`w~tov|ws~~yvxrf^Znyz}tt|pyzw}|uwmWM]upjlpw}lksxyww}tkpnkuyqxz}wplsxjb[ekmxwqrsztsntxuu}}z|qfl}umkeg\^ZZY_jjitz{z|xmbWX\healzz|t~xnqnm{}vuuprskmoytmlnkxwlcjhrw~wtih\RPJLQfrv~wxxzv|jc_fiejyy}vrndenkt|uhjoprowyxy|qllemmr|{sueb\\]cnpq{yzthhhgf{uv{yr}|wrv}{y|xrtt{pnmrm`Zdituvtnjdjx||wunipsxzxu}~xunovs}}mgjmhgt|~~zulo{u{wml|rqkjikrea^b[RXl{|}tsohmrqvkoponmkc`hho{}tpkruoku~zyyqov}x}{xoelh^_lv}|qngigkunpr|xlmvztz|sqmlklkddqrx~qwssliqu}~|qigix}~nfgh_cy}t~tjhb]]dmis~wyszy{w}xpf]gd^cbw|wsltvqmqyy{~y|~wt}~yvpaah[ben|khg]aet|qpqlZalr|z{uy}wlrvyx{wrwzuiv|tha_hw{zrktq|}|yzvrrrprtyyurwnooenw}xut||{{umvm`bhe]icm{z}vwzwnu|uhllmsrqsofbbevxsyywz~{smw~~qkpw~y{|kp~phjeejx~{{ufo|mf{qi{sutmmosrvvu~~uZLJWd{mompmljqvxwirwvzuwz}{|riZXarws~|}tw}upq_]fz~h[apu||uqehpzwvntvxy{}~|yootss~wjdbispxnnpsqx}u}xgblehc]LTY\k~~rr{wifox{|l`aamffp|uuxtumb_QU_s}wqtt}tvxwsmsy|rpnw}{||lYKScuqspit~~wlb_lhh_anvww}wpqibdds}~oheelkzoqt|w{srtroo}}{|xspu|x}x}{hlsxvp{pbee]Rbcmhbj|rnakjrpn^bklh`_hfdgipwyyxyxr|~t{}vlvrx{slckyxrhotrryxstrwuqnxtukir}}zwuzruw}qmwr{zj`nkc^eevyrwvrik_bhesn}zsy~~{w{nfn|y~yymemsos|zqllm]`\Y[_gn}ntvlbmnlr|~~twz|uqr|{{tmmoomty}|wpupgsed`lllz~|mtupwoumpzv|vzwpqyuu{~ptyuhbe[luy|{|plvt}pikg]Vbiijy|{vxr}zvimjryqwzx|zu}zzo~}|{tnssyunijpu~wrjamkll|nivrzqtusoqmw~~~l{ljpkelms{||x}ywnmgfktok]_\gy}ypgpql`epxqmtwwzhmnlt~z|jgkvmSUboiZ[dwslrrwhdecmysgdkyvroiw}vvps{~pjbWco~~xu{oolrvuwrnjq~zsyn^^_bisyvpfhjiffhi|yt{vuqvwojbZ]VXWhzz||v{{xuuoiiilmw|yokuzhily|zvs|}{pww|{y~|rn\XTV]aqwrump}~gdotuaX]dw}|{yxx~}v{xtoqfU]\gkwz~yrwzvx}x{}rosiswv}xyyw|{jki`dkopbmy}|rv}x|ysztnqw~t`]cfqxzyhkklqzpprmssnokjlfd_iu||wbgpntpz~~}rccQVekx|yuljx|{qrq|zzzwssksthiYoyvuruqu|sx|uv{{rbVnennp{qwqvx{hu}{~{ym{rkuwjjfaWRWRV^bmomnuunimhci][fn}|}~u~{zw|t|ystccfdmp|y|jgflnptlx~~|swpivxlouqz}{{phrnprw{}oijajcinr}y~tiovlgkthl|mj\dhnpjyxxw}tvvy}wzu|rzsu}}{{u}gkgof^cWZ]dx}zxys|yxroz}wlrzxrv{{u{|yuz|eeaXS[eqjkpzl}~}np|~|||~}v{muvwwxy|{vuxvuyka\bdn}wzurkjltwptoknk||~xiqwsw|smhpswvutuulmhx|w}uhxvqjolzq}}ylorlzwSSel{|no~snkgitq||tu}ylc`ZZtutnk{ufsx}}y}vvzsrmgw}uvoxo]`lvv}x}{z|xxsmg]j|oupqx{mm\OKYcv~~mbfrno}~u{xzxgiml|}~xxvmacov}z|zx~|v}tt|xz~sfYPUijxvws{pd\^ivukWGWemwrwpdot}|qkjaW]lv{|yqlvsnm__di\Yimt~ytywgbmlv{qa^Zdtzlc`kpoqn}~yliphpzqy}}qp|vux~wyy}yvyq~z~rdZae`achqx{re[b`goz}s\aejwplrs~qfhd``lux|v~{u}qq|y~|ru{~twvvyumkq{{~|lc[VQO^h^nz~wtowxccd]XZdgjc\noig]SEQNNaszx|vkrv|yqbac_gs{sooidg}wou}ytzyzswwukZbfforxso`\a_SZ\fnw~z~y}ywmlz{~vwuklhmnu{y{y{uqjd]mjmu{tmkhci|psr~wtxv~}yrwplckv{s~y{{}wo\a`krywpdgbeervrxqmnqw|}qqqztvjfe\WYdltuuz|w}}vxvyxzx~wjsrtyvpmuvswnrqu~~||vqurtt~|~~tibeow|~uu~x|{kosehnroxurvvov|z|wxsjtx}}ld]caimnyzpgjhnm}zstu}}z~mqpokpz|ypoklq{z~v}yxoptqqp{{|txlix~xtxvtpqor~|{y|ww{xtpjv||kqntsy{uqq{ruj]`YXMbopvpvv{rqsyqbjjjuq{w}z{~smnu|xzrzsdeY_ljmlrdadfljsvytof_jhfiZdhpjpz|uotljipzusitv~}zwv~u|zgsw~v|}yxvwsygg_d][[_^`c`q}o}|qusihdoppcdjnqmklvlYb\__[lp~x~|zinncq|voup|mobj{z{vynigmy{wuxuzpn|yuysqrz}yhmkokibhrdcsw{x~wuv~|uz|~{|xwtpe]O]jnvyx|w|}z|kdwt{wmomtho|{svspjkpypckmu|~zzokttrumtvu{{wwzqpaaah}svql~yshuxsoy{|liyvwqmjn_eijl\bh_``jyxvpqsjvzx~~z}usotoh|zx~q|~usqk\hnidosv{iaomuojc_eZ_cmypz~{ror{ospou{v|}vx|u}uv{pkpoow~}~yz|~r}}}jpvoehjim\NWWcfmpsxqpsuqmqytyuujekdhhrxtwgr}wxnmohpxxywwr}|~wfmrxysu}kgtrkltz{|~{ytzyplwwvskktrqxnnhYabjq|{~zzyzuvqt~~xzy{y~~}eefgpldesmi{{{uy~~~rrtttlz|pksyyukhrvx|xuqgwrebfs{wuut}}vzyrphlims`cjpw~~xvwwtwor|ursqpcrvnrmnj]V_npy}z}{~zzz~{vv}x~~|x}rovjkpnojopqwxvyvrqpp{ypthlt{{pmllh\mppts{}uq~try|}sptzvz~|}wmegles}x}rqxox}z~~yztrqmlvniiX[ahf]_bkknwx|~|okpslr}sslpzxzyuu|uyuqqrpu{lesw{~yzuqx|w}tvrnpokoxpxqjuztw}xsnptv~vxob^da]hs}{{~u~~}zrsppsuz|y~zu~~ypqwzqrtjhg^bgik|xr}zu}y{|qqtu}}u|oirxx~|y~pw|yuqojluwtkv|u}|~|ro}xtifjqnoxvvyzz}qv|zxultwz|~vjmjdpo_]`fp~|vztvur}{}}~}~|tuoyrlryuqquph]iqtspy{voy~{xvmmtuzxy{olqkp{vx|vxxww}}{qxthqyxywvrrjw{{ytv}qoy~zz}|}vzztpvt~xjfqvsmjd^T[\eoou~}|{y{xyy~~ojqjes{|xz{xuvtmgpqpffbmupv}wsuvnmps~vjiuyzxzwsq~z~zuvt~|{rojigkqsmppffiu{x~ywxzusuvomz|~|wyzxx|ywv|nihg^\^drnhl{v}xxv~xvnnmqy|{~|zzxytqy|ulutrcaekmp{{{wtxry|qoxolmqoos|wq{y|}~vkpsqofe`hjtvqqwsx~|y~|y~yv~xt||v~|{ognrxqtu|}}xw{ssuufbg|njm|y{c_speoxqokx~sq|nhni{ush\^dffbmoihw~|}votm`XY[TMXemrwzmkmqs}tnzzucW`gtqmgnpoy{f^b}ihjorqwpghot}}~ynqlppzyvma_THJbyl`OFR\j}vwqhhvyxonsqnu}zvaZ`i|zmnmou{||~{haTRRevwwxtiht|}nkly|xkeajhdlyr|sbYIJSa{}x|{~yrpjhfqntu{yxl]UKKN`nwooonfm||rln}qgckhgu{h`ffs|{xpnhpu|}zsrxu}{yv|vk]TRWfq}{oonlfs|zh`W^flojpxv|yu{n_adht{roedfgt~ymcdb_ijrrmikiigv|~nhchmpy}~||pquyvz{sp|~|rtthhcjjswpqv~zry|{nfd_c`bqz~theg_gkqwtrvwywpd]]`cjz|{tturnw|wqjru|{sw|xszvhhgnsx~nkbc_Zdq~ttjhnpywstvuqo~teb`cceouptq|yrtvzv~zy~~zwy{svnddjrrw~|sihgplvzwx}z|uv~uzpligjdalrthcbbagvywoeiglma`dosqutpsfgga[_ejgqpu}pmkptq|zz{|v|{wyljaa_WXbly}{}zsuppvwx|y|{wvgfc[X]djn}~yswtouqpovvpmnhqonka]dlofjlghcggadku~vqosqp{ztlhkgrohgltvxz~vxvqpsxz{{x}||wryz}|vtjie]]dqxr||||xrrvts{~}vsvq}~yvz~zyyliaZVX\^crrzwqjpkgkgjlrtqrrlww||tpw~|{yrquymjmljszvqtltwronqqpvpnrigaZXZ\_`onquv|wojejlhnkpu|u|{}wnpvzvvyrvlfb[X[dw{|}~{w{xnrid]SNPSWZmv{||vztsw{|zxymmoltnechnnnuourjga]^ctx~pghkjmz~|~vv}{}{{yw||u{utpeadfhiy~~zzx|||x|rnptrqvnrpgb\Y]cwuuxumnrqs}|z~|{x{srxuyxwtpttmsllh\W[^acvx|tqw~}~uutqzxpnrww{~{tqru~~vnmonq{~zwuwlmomrsrnkrpotmpl`[]^]]mpw|wxwttprpkpggoxzy|}swrs|{ttvzx{xofdek{~~~|z}~yvzsuslneXUXYW`qv||yopw~}zztvmswtnnopoyuw|xqg`_^hot}z~{zysrpovv~z~y~~xz|yy{|qhhihcpw|yxtyy{wvvrv{tzxrh\XX[hl{wuv{wqomjmon|{|~~~~}y|w|ytxpc]]]X^ko~xx~}tx{zwwwuv}~qiihqs{|y|upkgcdhfrz~yxvqv{|unpmounrqh__`][gju}|{y{|vsw{y~~|{yxs{~z~{qd_^bjk|}{|}yw|zz}xx}vrrltqnqla[ZYTYcgw|~~~|z~~|qstttsronzx~~sigfmns~}~{vonqlryz}}uxzzxw}|tonlfmpv|z|vu|~uxxxzyvpqzv|{ytf[XX`^htv||{uuwqxz|{z}}|ww~x{zsjea^Ybcny{}yz{zy|z||vzvmjkqmw}~|w}~}ytrrkcce`ikq{|{~}wx{~ysnjfaihqz{|ury~yvv||}z{|tv{y~zmb]]daksv~}~utvpvwz}ww|wtljqmpojd_ZVR[\ety~}{}|xw~{xngemiowx|}{~xwxvmhkfkoq~{y||wqyx{~zvtojdjln{yy~wvx|yxtpsyxpjpmtxvuoe^Zacerv|uvrswu~}z~|xy|wmtstxtpnjd\afft{~~~yuw~{t{yxpinonwx~{}~{|{y}v{{vtuwrkkhjpozv{{}~zyvoehmkvzyvxwuvyz{uv}}txtz~}woh`deeoqy~~wvpquqz~~|x{~|{~xnrorvqmmjcZ`dfry}~|z~xqjnjmsry|~|x~x{sjkj]a__bej{z}opqrt}xhbant~off^ksuxzyzxswqogjaamiv{zuhb_uyws}|w__hrz}ghx~ypsnirlv{}woregp|wbn|cdq{y{skbebnvnopnniabfr~zrmiknyy|znkkcge^grvyzzvyz}x~{qjtpwzqkhllv|~|~}}quvs|lg\^dlx~p]RMirj_`\auzwuuxu{}oqrr~}}zvnlkqrz|{rwtnfggclihtyvovxtgeg`oz~||vkihfclrddfgstkcgr{}~~rroo~p^WZWlumqopqlmjeclxpqtqwrfZ\cfqttuoknrx{xwzzyklkikhhkrx|z{}xqy|y|t}}~vneadnilsr|}{w~usxqx|}uypeXTOWtsiinqneZ[XY^ge\a]dhgb_hjrtsssttwuyuvz~yx{{yuzpoplhglnrx|wsux|}~yyy{~}qga]oy}}z~|}}{rqpspupmy}ylbfmaWNRXlyohi]YX^\[_^fe^OOUZehruywrx}~zwyuwwopv}{wvvv|qqu||~}w|smorolpx~tumfhmtqvy}w||xxuzwy~~}~sgek`]UW[j{}{zonbdgmnhhgomkchos||{yy{}~xxu}yv|v}z}zxo`_arpntvzxolmiqs{{zz~}tzw}~zyuqejhmt|}z}{{{{xmrinn`XTd`^VT_qxypommqnnqzxukehhsr~z~~~~|}~x{}snahrskml|wvoih^`]dgfis{wvlqq}xty{|rxuw~~zwyxzsv~~~qisnyykd]haaZ[jv~|{qqrt~|x{|zssw|yyy{y}{x|ynwvrl_flymqrwvwkga`gfrtpr|xtqnqnxu}quutjdkfoy}{~t}}u~w}}|zilmdnb\RV`_cW^l|}ztzty}ww~uvowx~{{|v}wpwpqbboz~svn|wvuhf^c\_hdcouqsllhry}}souuunwtv||uxw|xtuxzyu}}~ohrhsslf^gdg[Zkv~|tysw}zyvyw}yy|}}ujrqte_kp|txs{{lf`fbhurnw}ttmnjqwwy}snutqejghsy|~x{{wzvv{y~|qktgmib\T\^eYWem}v}x|z}zty|yw|s|z}{}xntrtc^jpw~|}ohciacmhcmsnqmkfltz}}rmstqjtrs}~xyzzzwvwv}xxqx{vtkshnpok`egl^Wel{zu|uv~zv{zw}zx}~ykmouj^iltwvjcjfeuvpt~wwsmjlwz{ytlsutiljfpuxy{uz{xwtyx{}}z}~}{krmglfeXV[caT^fmz}~x}~yv~~sx|~vtzv~w|xzrkotubcko~|shhmelslfosnsnjgmt|{{omrtoirov~}w|}{zvxyx|zysvwr{}vkqfehjj__fnd[elv|v{y|xxz}vz|zvyz|qgjrsdhos~xuhjnepxuqz|wzrlioxwvllptnjoipuy{|xu}}xtxxx~~}{s}y{ukpfcegcWT]h`[gnv||}yxzruz}uwyx{|rrtvofhsxiipu~zxiiqinwtlntptpiiks{xwplnroionvy~}}wtwyvz{}vvrxqs~|xzymmf^`dg`[bpofmszw{~xx|{z}xx}}~rorvrhepwllsyx|~mjqinvwrs{w|vlkkt~ytmikrpkpou{|{u|~}xsvwux||x{pt~{wvujjd\^de]U\ljemu}|yy}~ytrx|wz{}~xukjpsmdeuyoqu{zzjnrltxwnprqvmgikv|urnkmsmlpp{~zzttxwvy~zxrqwwluyusvtki_Y^dd][juoot{|~yzy~zy}y}{|tkmsrldnyspry}{{tnuoqwyuqxw|ylmlr}ytpkipqmpow|}zsz}yuxwuv|{vy~nqxvvuvmhbZ]eeaW_nkilt{z{zzvsy|x{z}wqhirrnbixurqvz}xnurrx{xpsrvtgiio{wqomjprmomt{}w}xuxwwv|~}uorxzlnussrvoidZ\decYbrpnmu{{|{}y}}{|vlmtspelxtpmsx}{rxttw{yqtv|zmnmq|ytsnhoropmtyz~|wpw|}~zwyxwt{zuv{~ontsuswqhd[\efeZ^lkifmuz{||~zsy}z{x~wrigpqqfeturnpwxuxwux{trtwxkikkw{srpinsqpmpxyvy~~xyxxvy|pqrzqippsqrukf_Zbdg`Zjqpmmwx{~{zy|{|xrinrspenxurluw~~w{xxy|tuw~znqos}ytupjprrqnuy|yqx{||z{yyt{~{uvyqnrqurvuid\Zceh_^mnmhluw{||~tuz{{wzzzqkcinqncmvtsnxyy|xyz~vuw}vkmlpzwrtnipstrnuz~~v~~{zxys|~yrpszmjnnsosshc\Zbei`^nssps}}z|{~wx}||z{{}|}sngioqqelyywqx|y{zzyxuv}}qpprz{suskorutpt{ux~z~}zzxztw~}sss}ulomrqqvlc]X_djf_muurp{|z{z}xtx|~zy~yyy{{|oibcimqfjwyysy}}{zyzvv}|ommou}yrtrjnrwvqu{x|~~~|{wyrv~|sqoxphkipoptia\Y`dkf`nvxwvyzz~|wv{}}|~{xyvz|yynidglqqfnz{{u}~||{zzzuvzpqptzxsvqmqtyuqx}u}||~||xwxqz|xspt{olllrntsg`[[aflceswytx~~{z|}}uxyx}~~~}vwu|z}ricafkqjgtyzuw~}|z~~xu}sonpt{{stumnpwyru{xz}~~~|xzru~}uroxqjjhooquj`[Z_elgbnuxvvzy|~}wwz|}|}}zwwt{z{ukechlsngqxzwu}}}}z~zt{vqqsw}~vvwopqxzrsyyx~z|~~~|wysu~~|urpyunmjqqrvlb][_dkgbmswsrz{}{}~xyyxz~~|xvs{{|vjdbeipkeouxtryz||u|wroruz|tuwooovzrrw~yw|y{ts~wtpwtlkgnpqvnb[Z^bkhaiqusqy{}z|~zyy~}{~{~yywsx{zylecfjqphmtxvrxy~}|wx{tqswzzuzspqt|vquz~u|{||~~yxwp{~yvptxqojmsqvth^\^`gkcensupux{}{~yzzx{~|||~ytszy}thccejpjgntxssxz}}u}xtptuy{uuxqqov{rrv~zw}{}y{ur~~~yuovvnkflopupc[Z]ajjdhotuqwz{{~}zy{{~yz{{wrrzy}}rfbdflsljqvzuvz}{}u}xtpuwz}wwyrrpx}ttv{x}z|z|xysq}~}xtntuplgmqqvqd\\_ajkfipwxty{|{}{zz{|z{y}xspwx{}uhacdhpminuzxw{}}~uyyvqruvzvtxsrpt}wsv|x|{~z|~yxvpx}|yvoquplegnnsrg\Z]_hmijpw{w{}}}y~~~{{y~z{zw|{wqmuwy|uh`bdhrqmqw}|z}||uwyupruuzwvyusquyuw}y}{}~wy}xwsnw}|{xunpspleioptsh][_ajokkqy}z}~|z~~}{z~x}zx|{wpnuvz{sfaddjrompw}{{}|~tz}xuptuuxtuwsspxwuw~z|z}x{wwqpz}|zxrmrrpicjmpsocZ\_blmkns{{{~z{~}~~}y~~|x}vyzyslqux{xlaadfpropt|}{}~~|wv~zwqrutwwvywuqt~{vv|z|z}ww}ywsnv||{yvnpqqlehnqtsi]\_ajnllpx|z}~}{~~{{}xyy{{wnpux{zpcademqnnpw{y{|}zv}{ytrvtvwuxvuqr}{utyzzy|yx~{xtpv|}{ywoprrnehmpsrh\[__hljkmvyxz{}|~{|~~~yxyz{vmpux{zpcaddmpoopw{yzz}{v}|zuswuvxwzywss}|vuy{zy|xv|{xupt{}|zyqqrspghnrvum_]``hnlllsyxyz~~}}{~y}{z{|zqpvy}|ugbfelrponsyxyx||~w|}{xtwwvxwyyxuqy~xuu~|yxy}|vzzwqry}~{{uqrstlhmpuvrf]`aemmmloxxyx{}}~{~|zyzz}wosv|~|qeeghqrrqqy{{zz}|}{w|||vuxvvxy|{zuu~~xvy|yw{}xt{|xtpty}|{{srrutjjotxxre`ddjpppnszz{y}}~|}zz{{{~wptx~|rfgijrttrqy{{zz}|~{x|{|vvxvvxz|{zuu~~yvy|zw{|vsx}tuyzqj\UWVZaee`eolkgkgguwy{qsu~xhdb^`djmqrlpxskeimnrqtxxxqot|ssxfv}~tt{~vpfjw~ugq|trqvtqw}~}vqszZSldTUdt~yurqf`eksutkcfgkruxwyypsw~zqnnjjmqtuvqu~|zsksvsw|~wrkcbdnpls|}z|{~vwxvtrwxystwoqtxxy|q_PMcynigejiknsxplosyzyogkns|~|wpjqsrvuvw}qmlpv~zqnqry{vmo|z{~tmikd[_cknmg]]acknqqoxyyy|~|tha]VRZt}slh`_^egadjsyzvlhllrvvtmnqpmffbepswzz{{smklntqmqu{||~zuxy{~ypjt}wxy~}z}uruz{qkorx~xvxzrkc]]YUVhznf`_bYVY`ghf\UXY]cdfa`fgidedeqw{~|~xsrqurkjlprorsrsy{}~~~{}yqin~{yxz|x{wvuxyw{x{|~wuvx~ykfa\][VTaywomnd^_cihe\SUV[`beaagjmijijv||}||z}zsqquusttrsz~}}xoflz|~}xwqnkouonry{twx}~|}vsuv{~viea]_]XT\q}z}sllotspg^__bgimigmqtppooy~||zy|~{||zz||xpfgt~|ztnjiokfinxzytllnrwz~{w|}zxt{|vrsuy}{vkcb^__\VWhzvuv|~{vkghinpttnqvzyuvrw|}zxxsjdkz}zsngjmfdgnturkeginquwrrvz{vuqqy}}ysqtw|}}}{vqea`]``\X^q{z|zpnoquw{xsw{{yxu{|~{zutsohdo}}upjmngegnssphcefknrtonswxsrnovz}|{wrquz~~}{z~|zz||}xsnc_^\_`_]cv}|~ursuxz~|wy}~{yv{|~vtonpnjgpxslmpjggmssqkddeilptolptwrqmlrw{{zxsrv|}~}}zx|}{x|xxyzwqnd]][_bdcgw~zuuvz{zz}}{vy}syojpgnlv{vprx{lnopyvsjlentowpiqrrmokowoxpqvrqt}|{uvy}uvoz|~{{vvz~|xuyzvpm\^_acifit{|~xx{|}}||}qrx~}{|~|jongqmlqw~wwtxpnxuxwlcglowrrogqvyspfgtpxvqvqln|{~}z~~sxxx}xqpw|y}yvq|sno[^_\[ckk{~~zzxz}wz~sq{{yy~x}tqjknlrqmp|}qq~xxrnyyzwqqljjttrqirxodggjtvxxuqmvxtq~}}zov|}~z}xv{x{~nosswqph^]Zamollz~{{|t{z|zwvx}{}}~}oihljtllz~xsuqyvytlaillttqrstoptkkmurxvoppry~}zwzttw|{vjq}~~~~|zv|wuqqkg`Y\_``lmx~xwxtzxzy}mnoigilmtzyv}wtq|~{qkntooqslrotqmdfpnrqruyssw}{s{zxqv~wrs}y}|z}vpmxtoie]dbbdklepzz~}}vvusz|xwywlffiknns{{rx{zvplhmrsrjml|xqlnminrsuworv~v{|yx~}tow|~yuqpuuxv~zutvonih`a]`dgdcmu~zy~~yvtwz}{}x{~yvihfiflop}~}zxt|y}}rnptlsnmlrvupmghlrrnzrxru{wzx~|uouyxutr}}|twx|~ytqlqkl_a^`f`dgpr~y|z{sqzw~~}}}{zwnkngmfjms|wxv|}|{wnrmprsjkstykheomusltssvz}~y|{vsnsxzxxrt{{}{vpzwvnjnsln^[\]chfklwx~xvmtw}~~~~xx~~~nkgjlplkuv}v}w~~y|knlstwoelsttkejjtvumuou~z||ztqvquyrmu{}|nptxwuhjlnlj\W][lkrry~|yy{wlvt}ztw{u~pnfhgmpkv}~yzw|zzwnnqvwtmdtlqlhjhoptmruuzuwv{ttwmwvsvrq{~yylrtotimijeg\W]aiuuuy}zwuksy~|~ptzxzxkhlnmttuyz{rtosotprhesonqkgmssrxoyv~~~}{{vx|wuyvrukppwzzuurkuttmeihmkfbZcfipp{}~yztysoy~|~}xvuwxnijhpnswtx|~|wppmu{trnptijfaiovtsyvy|}uvty{|ystu}zprmsxt{sousuolkjmkng^d]cfiwss~y|{}pnrv}|{utz|spjdkgornzx~wpqvwuxpnqmphclilqr{}xx}{}xyz}xpw~{vtmqptztuzsqortninmfff_`^gninvz}|{}qrsry~}uw~xvslldekhnxwx~tw{rtuuvlprjmnifju{{y{wr}|{zzu{|vyusslsus}{uqovxsmnkfjgfc[ddaknsy|z}vysrty}}}{}|wutrsjdfcktqqt~zurqwztoonsshfgnzwxxqszx{zvtuzwpoopz~vssvzttthfghlieb_^dijsx~yz|ysuwz}z~z~~y|{wrptwsnhbhnmkqvztqtyyxrkswoihkqqu{zusqxxwyrqw|zsolsyuvvx{sswqicfkmlje[_dcksz}{~xy}wyxyxq{||{~~xz}z~znpuwvplgikekqz~zttwwxwvrrtlnlppjrxtvswx}w{~|zqtwzzvrprrmux}zstsnmdgjmokhc_`akqyyvzxw}|{tou~~{~{yxx}}yrrrwtqqpmfcjoz|{}}y|vtxyxokpotnklmrqr|{~~~|{vtzw{vvxusmipt~zvvpnjimhmlllhg`_jmvuxyu~|~tqutzxz|~|vv~~|ttztvpptrshbimvw||vtxy{qkorupmkgkks{~{}}zqv{||sszyvkjmqxyxuqngmpomhklhjddgknpx~||z}zvvttsq}z~vzz}|xqyy~slsttrkjfnptyz~z}v{wywsrmtrroijciuw~|{ttyzvtxuzsmmkqqwwrtjlopxjhkgkgkkdhhou{x}}zzwzxvujt{}z}zxww~}tzw~|psrrtlplikoqrzzwzyuswsrqspmmefmr~{}y{~|zzzwx|uvttrmnoqptvmrpqvookdihlnjdcikszu}}ywzx|umts}~}}~yoww{w}xrutspmrlsqhnfrsx|}rsqqutmnpemsm|syvyv~|{z~spsqqtrotrpmoryrjskeofsoiibbbplxz|}|y}y{syt{t}wxqq~u|}{t{uvmpoqrqwfiiauzrywt}zumppnrk}un|ms{zzz}{zwqmuztljgnqr{y|rmtmngpvhmcacdgaopzx}~y~wuqyrz}|}|x~zz|zw}u|zyfnnpntnckejvs~x{{s}}yyimlrppxhmsr|{{zv~txz}xyuxzvonnfs~wnjrlnjqhdijqkhf]mrv{w|w|x~q|ztxw|~}z|~{|ku{}xvuxwzrnnrzrpggijyty|wx|vvst|wqqoyoqloq|yx{zux~|xyxuvoposenpmytw}slkrzkgflekobhjglqt}xz}}y|u|xv||x~~~wzzytz{x{yrwrropuplljifiurz}youvrymvzplohkkwz{}zx~~}vwsqwtuyrjttqtmxrrpnspechecjpjukmmo|yy{}yy{{s|zx|}~~txq|yywvusomvrxotqsugnmnz}w}}squtnxsz{pxprkknqu|}yvz~uyuqjvutunmikuplvpznkkoi`ljmrnmjhxt}~}}uw}zz{vwt|~}|zx{zrwvt~~z}wlprvomqoqvoxklnr|~~x~ovru{qqvmropphkqxy}wrxwrkrrv}rtgqolqpurjilmigphmeqsltopzzx}yuu|t{wv~wv}uozxx~z}vrutpevovvovwssqit|}x{sylswqwoqppiqppwxxyupzlqttxojrjqsumhplvhkmmnonllosrvv}||{~y|{~usqv}}|}}z|tzltx}uuv{rsqnortytzpmqsux}xzzwsrpot|ymnmpmtv~}wtw~wvmj|oyqhjpvupgnojtznrloqomtopyuyt~{~|~}}|yps}v~su}y}~{oowz{}|wrwvtmuu{x|soopwlx|{uxxtmwtxsoplim}u~}pwwyzvtjowtvtnuqpqvjmrtxromoizontpsspz{~{{r{yuxw{{w{vxtryz|wvwszvoxsz~wsyyrmvr}xvhX\WXcacfjltmkmsy}{xm_jlpn|xngjmkru{{}nojenostss||~{nd`f\digvuxrnilyxwv|wzkyxfgmovx~xpmra^_\o~|{yijj|sZTu{dcsuh^_despeinrvoikt|x~~|qhfcem|~rx~}pswxulu~{r|zqv{~uxul|}niwwwrqwxzztlks|tqnmyspedmx~{{wcOMLkx|urom}{piihn{oinpz~xrr|~sxvsmpt{~|zupkh_dnjorr{{tfgsxulpmn}}}~td]XWYhk_cdhojc`jwx|us}tsnaOJU[ztieptvxmgfddlxmjnmxwnbbjo{|zztoqtvvv{~|xromadgbbcfluutptyzwoqvjllp}wrmijw{psty~xr}|{}{zu}~q__e\RMZd~~mhlstpg[ZSRVb_X]]gh`UQ\cqvwxwvu{|~y|}zuwifiiecfejt}zy|~zvrtzxq}wlgknuzv~{zsw~~}x~tvzv{z{{x}weUS`[XU_kwuv}xn_]SRU^_XZ[fhbWU_etx~|w~{}}{~pnornkoimv}xy~z~{p{|rjelst}~qmt|zwunsx|{|~t{}~xpwzy{y~}{~tprmum^QVb]]Ydq}vji]^_ggccgqmh]cgq|~|yvuu{quvqx~tm{togfo{zwglp}|zmohhkqwstx|pnswv|{|prxz}~y{}xxx}||ugmhlrbYP`a_\[kzurifikrmjmxxtkhnpzzz|zx}yv|~viuvqjajtjjmtyzlhb_dfpolo{{voino~~syz{qnvu~~zzxur}wv{vdjhitf^Q]b`_Wdr~xqmpnxvqt~zsnqqzzyz}{}xjstpj^hqnoovwzke^]aammhlxvsmikkzypxy{oour{yzzvr{v|sx}{~uclhisfaT^aa]San{sqsp||ux}wsttyyx|{}}zkosql[dnzvtsux{oe_^b]jmgiwuqnhjhvw~ouxypltpxzx}yr~~tzrvy{{{gklfrieXZabcS\jw}wswqzyx}uvr{|}v{~~z{qhqoq`^ksvyr|{jd^d_dpkfqxrrkjfmwz}tnvwuiqqr~~w}|uvwwurw{w|zsfpfjnfbU^ag^Uen~{swuty}|xuvwwy}z~~|wywifmoo^dovzyu|zkcaf_irlhuxrskjepv~||nnuvpjspv~v}tyvwstv|x|xqfobhifaU]bj_Zkszsyuuy~~ytvv}uz}|~{~|szuuhcjpqagsy|yu~}ncbh`jtnitxrtmjfnw}z{nlsupisrww~~uxxvrsvxx||u~}}sembbfccVYamh_nx}tzyt}{zvtvy~ww}~y|osrrk`fowijv{~{s~secjciuqjqysvpjfku|zyojptrjssxx|xw{vrsvvz{zty{{ueja]abcWWaomer|u{zv|zvt}ux|wyyymnoqj`eqyloy}{t~teeldlvskrwswpigku~xwljotpkts|w}wzytquvw}{zyqz~xzqfi^\_caWYetmkw}wyzxuv{uy~~w}zzsjlopfaixvmu{xwpdlkfsvqlvuuvlhhoy|wrjkqtlptwyy}wvqrvty}}{wztr~~xwwjgcY[`d]W^oskr{x~~x}{vv{ww|yzxvjjnqkadtynqx}}w~wgkngqvtlrutxnghkw~wsljnuonss{wy~xsrvuv{~|vwvnz}wvwnge[Y_d`XZlskow~{{~}vwzyvzzz}yvkinrmbctwnpu{yyinojswvmruuymhilx}vsmjntnoqsxx{ystwtv{|uv}tnyzvuwohdZY`daXZlqjms{~}}wxzzwz{{|~zwlgnroebrxpory~{mnrlswyppuuzohjju~vsojltpopq|~yv~}{tswvuxvuzxmuyvuvtjf]W_dc\Wgqlknx}wzy}yx~{}|~xqgjrqlakxtpov{}wmtppvywnstxwijjn{ytqmipsopov}~}ty~}xsvvuu{zsu{pnvuusvpgcYXbdcY\npmmr{|xzz}wz~}|~zulelqpjapytrqz|~~upvpsw{vostzthkjp}wsrliqspqoy}{t{}~|wtvuut|xrtz|mmsrsqtoeaXXbddZ_qrqov~{yzz}vz~}|yrkcjopkbpzwus|~~}yrvstv|yortzuhljo{xssnhqtssqz~u{}|}yuvuvsz~zrsv|ojporprqfaYWacg__qwvtw~wzx~~wv~{}~{qkbemnodl{{zu}|swutv{|rrtzxkkkmxyrspiouuusyw{~|~}zwwuvrx~{rst|pinmqoqrfaZV`dic`ryzxy~wyw}~wv~z{|}|yoiaelopen|||w}uxvvw}|srt{xklkoyxrtpjquxvt{w|~|}}~ywwuvqz~yrru{njmmrnrqe_XXaejbdvz|y}{wxy~~}uy~~x{y~}}tke`hlqlfu}}{y{xxvwyytrw}rkmls|}usummswyuv|w{|~|xxuvss~tsqyvjmkopotka\V]cih`ny{{xxxx}}xv|~}}xyx{}zxmg`ejooeo{||wzzxxx}vsu}wmmmry~wsvpmruzwt|v~|~}}}zzvvuq}}vspwyllkmqntnc]W\bhj`ivyzvyxx}}yv{||}yywz}zymfadiooemyzzu}|{zyy~xsv~wnnnsz~wswpnrvzusz~v|}~~{{wwuq~~wtpwxmmknrouoc]X\bhi`htwws|zyx}}zw{~{~{|zyvx}z{ngadhnpfjvxysz}}{zyzuu~zponsx~ytwsnqt{wrx}v|}||~|}ywwpz~zuqtzpmklrousf^Y[`fkbdquwsw}}zx|}~wz{{{~}~xwu|z}sicafjqkfqwzvu|}||z}~yszupnqu{}vuxpprx|ttz{w~{|}}}|vxsr~~wtpxvnmioqpvnb[Y]aiiaiswws{}{yy~}|xz}{z{~{xtu|y~|pfabflqiitx{ux}||y~xs|}tpnru{|uvwpqrz|tvzyy~z{||}|vxqs~}vspxumlhopqumaZY^bkicltyxv}~{yy}}|yz~|yz}zwsszx||pe`bflrkjty}xz~|}y}yrz~uqnqty|uvxqqry~vv{}x~z{z{||vwrp|}}wsnuunlglpoupc[Y]ajmfkuz}y}|yw|~|~y{|~y}{y|vsowwz|sf`aeiroksz|{|}z{{rw~vrnpsw{vuxsrrxyw{x~{~|yz|}vvsnz~||wtmrunkfjontqe[Z^akoilv|{|}yw|}}z{|~x|zx{vqovvy{rf`bejsomt{~}|}y|{rx}urmqsvzuuxssryyx{~y}z{xy||uvpo{}|{vrmssnjeknotobZ[_cmnjow~}}~|xy}~}}|{~}w~wz}xunpvv{ymb`cfnsnpv}}||ywr|ztpnstxxtxvsst~~wy}z||{xxz~yutmt}||xuootpmffmnssi]Z^`hpllsz}|~{w|}}||{~w|yx|zvpnuvy{re`cdkspnsz}~}~y~{ry|vrnstvyuwxttr{xxz|{|zywy~{uunq{||ywqnsqnhelnrtl_Z]_enlkpw~|~||x|}~}|{x{zx|zxpnuvz{se`cdjronqx~{|~~z|sz|wsottvxuxxtsr{wwy|{{{ywz{vunr{||yxqosrohfmostl_Z]_emkknu|z|~}~y}~~}zy{{x|{yqmtvz{ug`bdhqompu|{{||~ty|xupsuuxvwyutqxxvw~z{z~|vy~wwppy}}zysorrqjeknrtpcZ]_bllklqyzz|z|~~{|xxz{zvmqux{ynbadenpnnqy|z|||yu|zxsqutvwvywvss}}wvz{{y{xv{{wtos{}|yxpprrpggmotsl^Z^_fmklmt{z||~z~~~~{yy|xzzzrlruy{wj`bdfppoor{|||~~}wv|yxrrutvwwywwrt}xw{|{y|wu{zwsntz|{ywppqrofgmpttl_\``hnmnov||~~}z~~~|}xy}xyy{smruz|xlbdfhqrrrs|}~~~}{xtzyxsrutuwwzyxttzx{}{x{}wsyzwsnqx{{yyqpqrrhglpuupc]bcipprqv~~~{}~}}}}yw|xxx{wnquz|{rfdhhqttut|~}z~ztyyyuruttwx{{zwu~|yz~{xy|xrw~{vsnpv{{yyrpprsjhmqvwsg`dejrstsw~~{}~|~~||~xw|xxx{woruz}{sggjjsvvvu}~|z}~ytxxyuruttwy|{|wv}z|{vsuvz{qow~{yuruy|yvtmmouwoquy|{vkglkquuyx~|~}}{}vvwz|uyzzwz{yz~~|yqttu{{}}}|||}xxy{{tw{~yz{yz}~{uy{}wuvtzyqin~xrkkotwstqmos{wswz}ulnppxy||}~~~~{|y}ztwwux}||zuwzy}zpqssz{~~}~||{||yy~|}xqqmpsplnz~|ustvytsqlmovuorsxywqgikkrtwyy}z{y~~~yyuy|zuw|{||}zvwy~x{{~xoqssz{~|}{~~~{{~}~~~upplpsplnz~}wvwz|wwupqryvqsswxuphjllsuxyy|xyw~}yzvy|zvu~|}~~}xyzyzz~}yqrttz|{|z~}{}~}~xqqmosrnmv~}~ywxy}yyysssyyrsruxvrkjnmsvx{y}~~|wxvz}{{wv|{xu{|}~~{zz~zyyz}{urvuy}~|{z{|||~~{}tqplqsqmp|~~}wxx{}y{xuuv{vrsrwwuqlooqww{{z}|~yvwv}~~z{vx|zwv}}~{{{yyx{~}{uuxw|~z{y||||~~{|srolrsqos}~}xyy|}z}ywvw{vssrwwvrnrqtxy|{{}|~yvwv|~~zzuw{zxw}}~||{yzxz~}|wvyx}~{{y{}|{}z~}~|tqplqssqt~~yyx{}z}{xww{xttrwxwuqsstyy|}{}|~{wwvz~~zzvuz{zy~}}}~}{}zzxy~~}zxzy||zzz}}{}y||}~}|tqplpttsu~yyyz}{}|yxw{xttrwyxwsuuuzz}~|}|~{wwvz}~~yyuuz|{z}}}~}|~{zxy~~}zy{z}|{zz~|{}~~}y|{}}|zsqomrtutwyzy|}{|zxx|xvutyzywtvuw{{~~|||~zwww{}}}yytx{|{|~~~~}|~{{x|~}z{{{{{y|~~~}{|~~zz{z}{|wqrnotuvu||z{{~|~{zy{{xxtw{zyvwwv{{}}}{~}xxvy{~~~yzvvz{|{~~}~||yz~}{{{z~{{y{}~~|{~{y{z|||xrroosuvuz~{|{~}~||z{|yyvw{zzwwxvz{}~}{}}xxwx{}~}zzvvz{{z}}}y{~}{||z~~{zy{}~~|{~~zz{z|||xssoostuuz~|}|~}}{|}zzvx{{zxxxw{{}~}{}}xxwxz|~}zzvvz{{z~~}~zz~~}|||z~~{{yz|}~~|z~~~~{y{z|||zttpostuux~~}}}~}}~{|xw{{{yyyw{||~{|~zxwwyz}|{xuxz{{|}z}~~}|}{|~~{zy{{~~~{}}~~~~~y{zz|{{wtsoqtuvv|~~}}~~}~~||xz|{{y{yy}|~}{~}yxwxy|~~}{{wvyz|{|z~~~|}}{~~~|{zy{{~~~}z~}~~}~|y{yz{{zvtsortvwx}~~~~~~~}|x{||{z|yz}}~{~}yywyy|}~~{{wvy{|||{~~~}}~{~~~}{zyz{}~}}z}}~~}|}|xzyy{zzwtspruvxy~~~~~~~yz}||{}{z~}|~~zyxxy{~~}{{xvy{}}~{~~~}~|~}~{zyzz~~}}}}z{~|~~~~}||{xyyxzzzwttpruwyz~~~~z{}}|{}|z~~|~zyxyyz~~}~~{{xvz{}~~{~~~}~|~~}{zyzz~~}}||z|~|~~}|{{zxzxxzyyvutqtvxz|~z|}}||~{|~|~zyxyy|}}~~~}{zwx{|~||~~~}~|}|{yyy{~}}||{z~}}~~}|{z{xyywyyyxuvrruwy{~~|{~}}}~}{}~{zyyyz~~}~~~~{{xwz{}~~|~~~}|~~|{yyyz~~~~}|||z}}}~~|{z{yxzxyyyyvvsruwyz~~~|~~~}~~{}~|zyyyy~~~}~~~~{{xvy{}~~|~~~~|~~|{yyyz~}}}}||{z}}}~~|{zzxyzxyzzxvvsruvxz}~|~~~}|~~|{zyyz~~}~~~~~||xvyz|~}~~~~|~~}{zyyy}}}~}|||z}}|~~|{zzyx{xyzzywwtrtvxz|~}~~~~}~}}{zyyy}~}~~~||zvxz{}}~~~~}}}~{zyyx{~|~}|||{{~|~~~~}|zzyxzzxyzzxwvrsuwy{~~~~}~|{zzyz~}~~}~~~~||ywyz|~}~~}}}{zyyx|}|~||||z|}|~~~~~|{zyywzyxyyywwvrtvxz|~~~|{zzy{~}~~~~}~}~~~}||ywy{}~~~~}}}{zyyx{}{~||{{z{}{}~~~~}~|{zyxwzzxyyyxwwstvxz}~~}|{zzz~}}~~~}}~}~~~||zwy{}~~~~~~}~{zyyxz}{}|{{{z{}{}~~~~~|~|zyyxwyzxyyyxxxttwy{}~~}|{zzz~}}~~~}|}}}~~}||zxz{}~~~~~~}}{zyyx{}{~~|{{{z{|{}~~~~}|}{zyxwwzyxyyyxxxtvxz|~}|{zz{~}~~~~}}{~}}~~}||yx{|~~~~~}~~|{zyxy|||~}{{{zz|{{~~~}~~|}|zyxxvxzxyyyyxyvuwy{}~}{{zz}}}~~~~}}{|}}~~}|}zxz{}~~}~}{zyyx{|{~~{{{{z||{~~~~~~||}zyxxwxzyyyyyxywtvxz|}|{{z}}}~~}}{}~}~~}|}zxz{}~~~}{zyyx{{{}~}|{{{{}||~~~~{||zyxxwx{yyyyyxyvtvxz|}|{{{}}}~}}||~}~~}||zxy{|~~~~}{zyyx{{z|~~|{{{z||{~~~~~|||{zyxww{zyyyyxywtvxy|~~}|{z|~|~~}}||}~~}|||xyz|~~~~|{zyxy{z{}~|{{{z{}||~~~}{|{zyxxwy{yyyyyxyvuwxz}}||{{}}}~}}{|~}~}}||{xy{|~~~~|{zyxz{z|}~|{{{z|}{}~~~~~|{|{yyxwwz{yyyyxyyvvxy{~}||{{~}}~}}|{|~}}}}|}{xz{}~~~|{zyxz{z{}~|{zzz{}{|~~~~~|z|{yxxwvy{yyzzyyywvxy|~~}|{{}}}~~~}||{{~~}}}}|}|yz{}~~~~|{zyxy{z{}~|{zzz{}{|~~~~~|z{zyxxwvy{zzzzyyzwvxz|~~}|||~~}~~~}||{{~~}}}}|}|yz|}~~~~~|{zyxz{z{}~~|{zzz{}{|~~~~~{z{zyxxwvy{zzzzyyzwwy{}~}|{|~}~~~~~}||{z|~}}}||}{y{|~~~~~}{zyyy{zz|}~}{zzzz||{}~~~~}zzzyxxwvx{zzzzyyzywxz|~~}|||~~}~~~}}|{z{~~}}}}|}|yz|}~~~}{{zyyz{z{}~~{{zzz||{}~~~~}zz{yxxxwwz{zzzzyzywxy{}~}||~~}~~~}}||{{~~}}}}|}{yz{}~}{{zyyzzy{}~}{{zz{}}|}~~~~}zz{yyxxwx{{zzzyyzywxy{}~}||~~}~~~~}||{|~~}}|}|yz{}~~|{zyyz{y{|~~|{zz{}}|}~~~~{z{zyxxwx{{{{{zyzywxy{}~}}|}~}~~~~~}}||{~~~~}}}}zz{|~~}|{zyz{zz|}~|{zzz|}||~~}z{{yyyxxz||{{{zzzywyz|~~}}}~~}~~~~}||||~~}}}|zz|}~~}|{zyz{z{|}~~}|{zyxxwwxyzz{zzyxxwwwyz|}}~~~}|||}~~~}|{zyyzz{}~}|{zz{}~~~~|{zzz{||}~~~}}|{{{{{|~|{{zyyxyyyzz{|}~~~~}||{{{||}~~~}|{{{}~~~}}~~~~}}}}}~~~~~~}}~~~|{zyz|}{xwvuuvvwwxyyyyxwwvvvvvwyz{||{{zyxxxxyz|~~~}}~~}||||}}~~~}}}}~~}}~~}|{zzyxxxz|}{yxxwxxxyyzzyyxwvvuuuvwxz{{{{zyxxwwxyz|~~~}}}}~~}||||}~~}}}}}~~~}}~}|{zyyxxxy{}}{zyxxxyyzzzzyyxwvvuuvwxyz{{{zzyxwwwxy{}~}}}}}}~~}|||}~~~}}}}}~~~}}~}|{zyyxxxyz|~}{zyyyzzz{{{zyxwvvvvvwxyz{|{{zyxwwwxyz|~~~}}}}}~~}}}}~~}}|}}~~~}}~}|{zyyxxxyz{~~|{{z{{{{{{{zzyxwvvvwwyz{||{{zyxwwwxyz|}~~~}}}}}}~~}}~~~}}|}}~~}}}~~}|{zyyyxxyy{}}||{{||||||{zyxwwvvwwxz{|||{zyxwwwxyz{}~~~}}}}}}}~~~~~}}||}~~~}}}~}|{zyyxxxxyz|~~}||||}}}}||{yxwwwwwxy{||||{zyxwwwxy{|}~~~~}}||||}~~~~}}|}}~~}}}}~~|{zyxxxxxxy{}~}}}}}}~~}}|{zyxwwxxyz{|}||{zyxwwxyz{}~~~}||||||}~~}}|}}~~}}}}~}|{yxxwwwxxz|~~}}}}~~~~~}}{zyxxxxyy{||}}|{zyxwwxyz{}~~}||{{{{|}~~}}}}}}~~}}}}~}|{zzyyyyyyyyz{}~}|{{|}~~}{zxxwwxz{}}~~~}{zyxxxy{}~}{yxwwy{}}|||~}{zyyz|~}{yyy{}}||}~}zxvuuuvxy{}~~||{{{{{{||}}}}}|{{zyyxyyz{|}~~~~~~}}}~~~~~}|{zzz|~~|||}~}|{{{|}~}}||}~~~}~~}{yvutstvx{~~~~~}{yxwwxy{}}{ywvuvxz}~}}~}||}~~|{{{{{|}~~~~}}}}}~~}|||}}~~}}}}}}~~}|{zyxwvvwxz|~}}}}~}|{zyyyz|}~~}{zxwxxz}~~~}}}~}{zxxwxyz|~~~~|{zz{|~}{zz{|~~~~~|zyxxwwxxyz{||}~~}|{{|}~~~}|{{{{{|}}}}{zyyz{|~~}}||{{|}~~~~~|{{|}}{zzz|~~}||}}~~}|zywvuuuvxz|}{zz{|~}|{zz{{|}}}}||{{{|}~~~}}~~~|{zyyyyz|}~~~}|{|}~|{zz{|}~}|zyyxxyyzzz{{zzzz{|~~|{{{|~~|{zyyyz{|}~~~~~~~~~}|zyxyz{~~~~~}}||}~~~~}~~~~}|||}}~}{yxvvvvxy{|}}}}}}|{z{{}~~}|{yyxxyz{|~~~~~~~}|||}~~~}|{yyy{}~~~~~}|{{z{{|}~~}||||}~~~}{ywvuuwy{|}~~~~~}}|||{{{{{{{|||}~~}}~~|{{|}}~}|{zyz{}~}|||||}}~~}}~~|{{{|}~~}{ywvuuwxz|~~}}|||}}~~}|{zzz{{}~~}}~}|{{{|}}}}|{{{{}~~}|{zz{{}~~}}}~}|{{{||}}|{zxwvuvwxz|~~~}}}||{{{{||}~~~~~}}~~}{zyyyz{|}~|{z{|~}zyxy|}}~~|zz{|~~}|zyxwwxxy{||}||{zzz{}~|{{|}}|{z{{|}~~}|||}~~~~}||}~}zxvvxz|~~~~}||||}}{yxyz}~}~~{yyz|~|zyyz{{{zywuttuwy|~}{{{}}zxxy{~~}||~~~~|zyxxxyz{}~~~}}~~}|{||}~~~~~~~~}|zyxxwxxz{|}}}|zyxxz|~|{{}~~||{{{||}~~}||}~|zyz{|}}|{zz{}}|||}~~}|{zzz{}~|{{|~}|{{}~~}zxvtttvxz|}~|||}~~~~}|{|~~~~|{zyyyz{|}~~~}}~~}|}}{zz{}}|||}~~~~}{zyxxxxyz||||{ywvvwy|}}}~~}|{{{{|}~~|||}}{zz{|}}|{zz{|~~}}}}~~|{zyyy{|~}|}~~}{{{}~~|zxwvwxyz{|{{{zz{{}~~}||}~~|{z{}~~}||{{||}}}}||}}}~~~~}}}}}~~~~|{{{}~~|{{{|}~~~~~~~}||{zyxxyyz{||{zxwvwx{~~~~}}||||}}~~~~}|{|}~~|zxxxz}~~~~~~}|{zz{{|~~}}~~|zzz|~~|zywwwxyz{|||{{zyyzz|}~~~}|z{|~~}|{{{{|}~~~~~~}||{{{{|}~~|||}~~}{{{{|}~~~~~~|{zzyyzz{{|||{zxwvvwy{}~~~~}}}|||}}~~}}~}{{{|~~}|zyy{|~~~}~~|{{zz{|}~}||}~~~~|||}~~~}|{yyxyyz{|||{{zyxxxxyz{}~~~}|}~~}}~~~}}}}}}}~~~~~~~}|{{zyyz{|~}||}~~}|{{|}~~~~~~~|zyxxyz|}~~}|ywvuuvxz{|}}}~~}}}}~~~~}}~~~}}|{zyxy{}~|{zz{|~}|{zzz|}}||||}~~|{|}|ywvvwxz|~~|{ywvutuvwz|~}}~}{yz|~~~|{{{|}}|zxwvvvxy{~}{|}~}{zyy{|~}{zz{}~}||||}}~~}{ywuttuvxz{|||||}~~~~~|||}}||}~}|{{||||{{{|}~}{zzzz{}~~|{{|}}{zyz{}~|{z{}~}{zxxwxyz|}~~~}{zyxwvvvwxy{}~}|}~}}}}~~~}}}}~~~}{zyxwwxyz|~~}}~~}|{zzz{|}~~~}}}}}}}~~~}{yxwvvwxxyyyz{{|}}}|{z{|~}}~~~}|{zzz|}~|zyxxy{}~}|{{|}~~~}}}||{zzz{|~}|zyyxyyz{|}~~}|zywuuuvxz|~~}}~}||||}}~~~}}}}~~|zyxxy{}~~}|{zz{}~~~~}}|{{{zzzz{{|}}~~}|{{||}~}zxwvwyz|}}|zxvuvxz}~~}||}~~~~~~~}}}~~}|{zz{{|}}}|{{{|~~}|||}}}~~~~~~~~}|{{{|}~~}|zz{|}~~|zyxxyz{{{zywwwxy{}~~~~~~}}}~~}}~~|zyyz{}~~|{zz{|~~}|{zzzzz{}~~}}~}|{{|~~}|zyxyz{||||{zyxxxxyz{}~~~~}}}~~|zyyyz{|~~~~~}}}}}~}|zzz{|~~}|}~}|{{{}~~}{zxxwxxyz{|}}}}}}||{{{{|}~~~~~~}|||}~~~}|{zzyzz{|~~}||}}~~}{zz{|~~}}}}~~~~}}}}|}}~~}|}~~~~|{zyz{}~~~}||}~~~~}}}}~~~}}}}}}}||zyyyyz|}}}|zxwvvwy{~}{|~{yxwvuvwxz}~}}~~~~~~|{z{|~~}|{{||}~~~~|{zyyz|~}|{{|}~~|{z{|~~~~~~~}}}~~}}}~~{xvuvz|zyxwwwxz{{|{zywvuuuwxz|~~}}}}}}||}~}{zz{|~~}}}~}{yxy{~}|{z{{|}~~~}}}}}~~}{{|~}{xvuvx|}zxwvwxyz|}}}|zywvutuvxz}~|{zz{{{||}~|zyyz{}~~~~}|{|~~{zz{|~}{zzz{|~}|||}~~~|ywvvwz~}{zzz{{{{{{zyxxwwwwwxz|~~}|{zzzzz{|~~}}|||}~}zyxy|}{zz{|~~|{zzz|~~}|||~~}}}}~~|zxvvwz~|{{{||}}}|{zyyxxwwwxyz{}~~}{zyxxxyz|~~}||{{||}|zz{}~|{||~~}{zz{|}~~~~~~~~~|zwuuwz~~|{{|}~~~}|zyxwwxxyz{{|}}~~~~~~~}||{zyyyz{}~}}||}}~~|{{|}|||}~}{{{{|}~}|{{|}~}}}~~}|}~~|ywvvx|~|||}~|zxwvvwxy{}~~}|{{zyyyyyyz|~~~}}||}~~|{{{~~~~~~}||||}~~~~~~~~~~~~||||~~|zwvuwz~~}}~~~|{zyxxxyz{|}~~~~~~}}||{zzyyyz{|~~}|||}~~|zz{}~|{zz{|}~~~}||||}~}|{|}~~}{xwvvy|~|{zyxxyz{|~~~~}|{{zzyyyyzz|}~}||||}}{zyz|~}||||}~~~~}}}}~}||||}~~}|{ywwwy|~|{zyyzz{|}~~~~}}|{zzyyyyz{|~~}}||}~~~~|zyy{}~}|{{{|}~~~}}}}}}~~~}||}}~~}|{ywvvwz}}|{zzz{{|}~~~~~~~~}}||{{zyyyyz{}~~}}}}}~~~}{zyz|~}|||}~~~}}}}}}~~~~~~~}|{{{||}}}|{yxwwy{}{zzzz{|}~~}}||{{zzyyyyz{}~~~~~~~~~~}{zyz|~}}||}}~~~}||||}~~~~~~~~}|{{{||}}|{yxwvwy|~}{{z{{|}~~}}|{{zzzzzzz{}~~}}}}}~~}}~~~|{zz{}~}}}}}~~}|||||}~~~~~~~|{zzzz{|||{zyxwxz|}|{{{||}~~}|{{zzzzz{|}~~~~~~~~}}~~~}|{zz|~~}}}}}~~}}||||}~~}}}}~}|{zyyzz{{{{zyxxy{~~}|{{|}~~}|{{zzyyzz{}~~~}}}~~~}}|}}~~}{zz{|~}|||}~~}}||{||}~~~}}}~~}|{zyyzz{{{{zyxxyz|~}}||}}~~}}|{{zzzz{{}~~~}}~~~}||}}~}|{zz{}~}}}}~~~}}||{||}~~}}}}~~~}|{zyyzz{{{{zyxxxy{~~}|||}~~}||{zzyzz{|}~~~~~~~||||}~~|{zz{|~}}}}~~~}||{{||}~~}}}}}~~}|zzyyzz{{{{zyxwwy{}~}}}~~~~}|{{zzzz{|}~~~~~~~}}||}}~~}|{zz{|~}}}}~~}||{{{||}~~}}}}}~~}|zyyyyz{||{{yxwwxz|~~}}~~~}|{{zzz{{|}~~~~~~}}||}}~~~|{zyz{}~~}}~~~}}|{{{{||}~~}}}}}~}|{zyyyyz{{{{zyxwxy{~~~}~~~}|{{zz{{|}~~~~~~~}||||}~~}|{zz{|~~}}}~~}||{{{{|}~~}}}}}~~~|{zyxyyz{{|{{zxxwxz|~~~~~~}|{{zz{{|}~~~~~~}|||||}~~~~}{zzz{}~}}}~~~}|{{{{{|}~~}}|||}}~~}|{yyxxxyz{{{{zyxxyz}~~~~}|{{zz{{|}~~~~~~~}|{{{|}}~~~}|{zz{}~~}}~~~}}|{{{{{|}~~}}|||}}~~~}|{yxxxxyz{{{{zyyyy{}~~~}||{{{{||}~~~~~~}|{{{{|}~~~}|{{{|}~}}}~~}||{{{{{|}~~}|||||}~~~}{zyxwxxyz{{{{zyyyz|~~~}|{{{{{|}~~~~~~}|{{{{||}~~}}|{{{|~~~}}~~~}|{{{{{||}~~}||||||}~~~}|zyxwwxxyz{{{{zyyyz|~}||{{{|}~~~~~~~|{{z{{|}~~~}|{{{|}~}}~~~}||{{z{{|}~~}}|||||}~~~}|{yxxwxxyz{{{{zyyyz|~~}||{{{||}~~~~~~|{{z{{|}~~~}|{zz{}~~~~~~}||{{zz{{|}~~}}||||}}~~~}|{yxxwxxyz{{{zzyxyz{}~}}|{{{||}~~~~~~|{{z{{|}~~~}|{zz{|~~~~~~}||{{zz{{|}~~}}||||}}~~~}|{yxxwxxyz{{{zzyxxyz}~}||{{||}~~~~}{{{{{|}~~~}|{zzz|}~~~~~}|{{zzz{||}~}|||||}}~~}|{zxxwwxyz{{{{zyxxyz|~~}|||||}~~~~~}|{zz{|}}~~}}|{zz{|~~~~~~}||{zzz{{|}~~}}|||||}~~~~~}|zyxwwxxyz{{{{zyxxyz|~~}|||||}~~~~~}|{zz{||}~~}}|{zz{}~~~~~}|{{zzzz{|}~~}||||||}}~~~~}|{zyxwwwxyz{{{{zyyyy{}~}||||}}~~~~~}{zzzz{|}~~~}|{{{|}~~~~~~}||{zzzz{|}~~}||{{{||}~~~~}}{zyxwwwxyz{{|{{zyyz{}~}}|||}~~~~~~|{zzzz{|}~~~}|{{{|}~~~~~~}|{{zzz{{|}~~}|{{{{||}~~~~}|{zxxwwwxyz{||{{zzzz|~~}}||}}~~~~~~}|{zzz{{|}~~}}|{{{|~~~~~~~}|{{zzz{{|}~~}||{{{||}}~~~}}{zyxwwwxyz{{||{zzzz{}~~}}|}}~~~~~~|{zzzz{|}~~~}|{{{|}~~~~~~}|{{zzzz{|}~~}||{{{||}}~~~}}|zyxwwwwxy{{||{{zyzz|~~}}}}}}~~~~~|{zzzz{|}~~~}|{{{{}~~~~~~}|{{zzzz{|}~~}||{{{||}}~~~~}|zyxwwwxyz{{||{zyyyz|}~}}}}}}~~|{zzzz{|}~~~}|{zz{|~~~~~~}|{{zzzz{{|}~~}}||{|||}~~~~~}|{yxwwwxxz{{|{{zyyyz{}~~}}}}}~~}{zzzz{|}~~~}|{{z{|}~~~~}|{zzzzz{|}~~}||{{||}}~~~~}|{zyxwwwxyz{||{{zyyyz|~~}}}}}~~}|{zzz{||}~~}}|{zz{|~~~~~~}||{zzzzz{|}~~}||{{{||}}~~~~}|zyxwwwxxz{{||{zzyyz{}~}}}}}~~}|{zzz{|}}~~}}|{{{{}~~~~~~}|{{zzzz{{|}~~}||{{{||}}~~~}}|zyxwwwxxz{{||{{zzzz{}~~}}}}~~}|{zzzz{|}~~~}|{{{|}~~~~~~~}||{zzzzz{|}~~}||{{{{|}}~~~}}|zyxwwwwxyz{|||{{zzz|}~~}}}~~~}{zzzzz{|}~~~}||{{|}~~}~~~}||{zzzz{{|}~~}|{{{{{|}}~~~}|{zyxwwwwxz{||||{{zz{|~~~}}}~~~}|{zzzz{|}~~~~}||{||~~~}~~~}|{{zzzz{||~~}||{{{{||}}~~}}|{yxwwwwxyz{||||{zzz{}~~}}~~~}{zzzzz{|}~~~}||{{|}~~~~~~}||{zzzz{{|}~~}}|{{{{||}}~~~}|{zyxwwwxyz{||||{zzz{|~~~}}~~~}|{zzzz{|}~~~}||{{{}~~~~~~~}||{zzzzz{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{|||{{zzzz|~~~}}~~~}|{zzz{|}}~~~}|{{{{|~~~~~~~}|{zzzzz{|}~~~}||{{||}}~~~~}|{zyxwwwxyz{|||{{zyyz{}~~}}~~}|{zzz{{|}~~~}|{{{{|}~~~~~}|{zzzzz{{|}~~}||{{{||}~~~~}}|zyxwwwxyz{||||{zzyz{|~~~~}~~~}{zzzz{|}~~~~}|{{{{|~~~~~~}|{zzzzz{||}~}}|{{{||}}~~~~}|{zyxwwwxyz{||||{zzzz{}~~~~~~~|{zzzz{|}~~~~}|{{{|}~~~~~~~}|{zzzzz{|}~~}}|{{{{||}~~~~}|{zyxwwwxyz{||||{{zzz{}~~~~~~~|{zzzz{|}~~~~}||{{|}~~}}~~~}|{zzzzz{||}~}}|{{{{||}}~~~}|{zyxwwwxyz{||}||{zz{|}~~~~}|{zzzz{|}~~~~}}|{{|}~}}}~~~~}|{zzzzz{|}~~}||{{{{||}}~~}}|{zxxwwwxyz{|}}||{{{{|~~~~~~}|{zzzz{|}~~~~}||{||~~~}}~~~}||{zzzzz{|}~~}|{{{{{|}}~~~}|{zyxwwwxxz{||}}|{{{{{}~~~~~~~|{zzzz{|}~~~~}}|{{|}~~}}}~~~~}|{zzzzz{|}~~}||{{{{|}}~~~}}|zyxwwwwxy{||}||{{zz{|~~~~~~~|{zzzz{|}~~~~}}|{{|}~~~}~~~}|{zzzzz{||}~}||{{{||}}~~~}}|{yxwwwxxz{|||||{zzz{|~~~~~~~|{zzzz{|}~~~~}||{{{|~~~~~~~}|{zzzzz{{|}~~}||{{{||}}~~~~}|{zxxwwxxy{{||||{zzzz{}~~~~~}|{zzz{|}~~~~}}|{{{|}~~~~~}||{zzzzz{|}~~}}|{{{||}}~~~~}|{zyxwwwxyz{||||{{zzz{|~~~~~~~|{zzzz{|}~~~~}|{{{{|~~~~~~~}|{{zzzzz{|}~~}||{{{||}}~~~~}|{zxxwwxxyz{||||{{zzz{}~~~~~}|{zzzz{|}~~~~}|{{{|}~~~}~~~~}|{zzzzz{{|}~~}||{{{||}}~~~~}|{yxxwwxxy{||}}|{{zz{|}~~~}|{zzzz{|}~~~~}}|{{|}~~}}}~~~}|{{zzzz{{|}~~}||{{{{|}}~~~~}|{zxxwwwxyz{|}}||{{{{|}~~~~}|{zzzz{|}~~~~~}||{|}~~}}}}~~~}|{{zzzz{{|}~~}|{{{{{|}}~~~}}|{yxwwwxxy{||}}}|{{{{|~~~~~}{zzzz{{|}~~~}}||||}~}}}}~~~}|{zzzzz{|}~~}||{{{{||}}~~~}|{zyxwwwxyz{|}}}||{{{|}~~~~~}|{zzzz{|}~~~~}||{|}~~}}}}~~~}|{{zzzz{{|}~~~}|{{{{||}}~~~}|{zyxwwwxyz{|}}}||{{{{|~~~~~}|{zzzz{|}~~~~~}|{{|}~~~}}~~~}|{{zzzz{{|}~~~}|{{{{||}~~~~}}{zyxwwwxyz{|}}||{{zz{|}~~~~~|{zzzz{|}~~~~}}|{{{|~~~}}~~~}|{{zzzzz{|}~~~}||{{||}}~~~~~}|{yxxwwxyz{||}||{{zzz|}~~~~}{{zzz{|}~~~~~}|{{{|}~~}~~~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{zyxwwxxyz{|}}||{zzz{|~~~~}|{zzz{||}~~~~}||{{{|~~}}~~~}}|{zzzzz{|}~~~}||{{||}}~~~~~}|{yxxwwxyz{||}}|{{zzz{}~~~~~}|{zzz{|}}~~~~}||{{|}~~~}}}~~~}||{zzzzz{|}~~~}|{{{{||}~~~~~}|{yxxwwxyz{|}}}||{{z{|}~~~~}|{zzz{{|}~~~}|{{|}~~~}}}}~~~}|{zzzzz{|}~~}|{{{{||}}~~~~}|{yxxwwxyz{|}}}}|{{{{|}~~~}|{zzz{{|}~~~}||||}~~}}}}}~~~}}|{zzzzz{|}~~~}|{{{{||}}~~~}}|zyxwwwxyz{|}}}}|{{{{|}~~|{zzzz{|}~~~}}||||}~}}}}}~~}|{{zzzz{||}~~}||{{{{|}}~~~~}|{zyxwwxxyz||}}}||{{{|}~~~~}|{zzz{{|}~~~}||||}~~}}}}}~~~}}|{zzzz{{|}~~}||{{{{|}}~~~~}|{zyxwwwxyz{|}}}||{{{{|~~~}|{zzz{{|}~~~}|{{||~~}}}~~~~}|{zzzzz{|}~~}}|{{{||}}~~~~}|{zyxwwxxyz{|}}}|{{zz{|}~~}|{zzz{|}}~~}}|{{{|}~}}}~~~}|{zzzzz{|}~~}}|{{{||}}~~~~~}|zyxxwxxyz{|}}}|{{zz{|}~~~~~|{{zz{{|}~~~~}|{{{|}~~~}}~~~}|{{zzzz{{|}~~}||{{||}}~~~~}|{zyxwwxyz{||}}||{zzz{|~~~}|{zzz{|}~~~~}||{{{|~~}}}~~~}|{zzzzz{|}~~}}||{{||}}~~~~}|zyxxwxxyz{|}}}||{zz{{}~~~~}|{zzz{|}~~~}||{{||~~}}}}~~}|{zzzzz{|}~~}}|{{{||}}~~~~~}|zyxxwxxyz{|}}}||{{{{|}~~~~}|{zzz{|}~~~~}||{|}~~}}}}~~~}|{{zzzz{|}~~~}|{{{{||}~~~~~}|zyxxwwxyz{|}}}}||{{{|}~~}|{zzz{|}~~~~}||||}~~}}}}}~~}|{{zzzz{|}~~}}|{{{{||}~~~~}|{zyxxwxxyz{|}}}}||{{{|}~|{zzzz{|}~~~}||||}~~}}}}}~~~~}|{zzzz{{|}~~}||{{{||}}~~~~}|{zyxwwxyz{|}}}}}|{{{|}~~}|{zzz{|}~~~~}||||}~~}}}}}~~}|{{zzzz{|}~~}||{{{||}}~~~~}|{zyxwwxxyz||}}}}|{{{{|}~~}|{zzz{|}~~~~}||{||~~}}}}~~~}|{zzzzz{|}~~}||{{{||}~~~~~}|{zyxxwxyz{||}}}||{{z{|}~}|{zzz{|}~~~~}|{{{|}~}}}}~~~}|{{zzzz{|}~~}||{{{||}~~~~}{zyxxxxxyz{|}}}||{zz{{}~~~~|{{zz{|}}~~~}|{{{|}~~}}}~~~~}|{zzzz{{|}~~~}||{{||}~~~~}|{zyxxxxyz{|}}}||{{zz{|~~~}|{zz{{|}~~~}}|{{{|}~}}}}~~~}|{{zzzz{|}~~}}||{{||}~~~~~}|zyxxxxxyz{|}}}||{{z{{}~~}|{{{{||}~~~}}||||}~~~}}}~~~}||{{zz{{|}~~}}||||||}~~~~~}}|{zyxxxyz{||}}}}||{{{|}~~}||{{{||}~~~~}}|||}~~~}}}~~~~~}||{{{{||}~~~~}||||||}}~~~~}}|{zzyyyyz{|}}}}}}||||}}~}}||{||}}~~~~}}}}~~~~}}}~~~~~}|||{{||}}~~~~}}||||}}}~~~~}}|{zzzyzz{{|}}}}}}}||}}~~}}||||}}~~~~~}}}}~~~~~~~~~~~}|||||||}~~~~}}}|||}}}~~~~~}}|{{zzzz{{|}}}~}}}}}}}~~}}|||}}~~~~~}}}~~~~~~~~~}}|||||}}}~~~~}}}}}}}}~~~~~}}||{{zz{{||}}}~~}}}}}}~~~~}}}}}}~~~~~}}~~~~~~~~~~}}}||||}}~~~~~~}}}}}}}~~~~~~}}||{{{{{{||}}}~}}}}}}}~~~~}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~}}}}}}}~~~~~~~}}|||{{{|||}}}~~}}}}}}~~~~~}}~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~}}}}}}~~~~~~~}}}||||||||}}}~~~}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~}}}}~~~~~~~~}}}|||||||}}}~~~~~}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~}}}~~~~~~~~~~}}}|||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~}}}}||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m55.bin b/applications/SprPoP/dist/MUS/m55.bin deleted file mode 100644 index 931f6ea..0000000 --- a/applications/SprPoP/dist/MUS/m55.bin +++ /dev/null @@ -1 +0,0 @@ -~~~}}~~}~~~~|}|~~}||{{{{{{{{||}~~~}}||{{{{{zzzzzzz{{{|}~{z}||~~}}|||{{{{{{|||}}~~~}}|||{{{{{zzzzzz{{|}}~{z||{{|}~~~~~~~}}~~~~~~~|zxz}~}{zzzzzzz{{||}}}}||{{zyyyyyyyzz{{||}}}}}~~~~~~~}{zzz}~}|{{{{{{{||||||||||||||||||||||||}}}~~~}|{zz|~~}|{zzzyyyyxxxxxxxxxxxyyyyyyzzz{{{||}}}~~~}||}~~~~~~~}}}}}}}}|||||||||||}}~~~|zyxxy|}|{{{{{|||{{{zyyxxxxxxxyyzz{{{|||{{{{{|||}}~~~|{zzyz{}~}}||||||||||||||||||||||||||}}}}~~~~~|{zzz|~~}|{{zzzyyyyyyxxxxxyyyyyyyzzzz{{{||}}}~~~}|||}~~~~}}}}}}}}|||||||||||}}}~~~}{zyxxz|~~}}|||||||||{zzyyxxxxxyyzz{{{||||||{{|||||}}~~}}|{zyyz{}~}}||||||||||||||||||||||||}}}}}~~~~}{{zz{|~~}||{{zzzyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~}||}}~~~}}}}}|||||||||||||}}}~~}|zyxxyz|~~}}}}}}}}}||{zzyyyxyyyzz{{||||||||||||||}}~~~}|{zzyzz{}~~~}}|||||||||||||||||||||}}}}}~~~~~}|{zzz{|~~}||{{{zzzzzzzzyzzzzzzzz{{{{|||}}}~~~}}||}~~~~~}}}}|||||||||||}}}~~~~}{zyxxyz|~~~~~~~~}}||{zzyyyyzzz{{|||}}}}}||||||}}}}~~~~}|{zzzyzz{}~~~}}||||||||||||||||||}}}}}}~~~~~}|{{zzz{|~~~}|||{{{{zzzzzzzzzz{{{{{||||}}}~~~~}}|||}~~~~}}}}}|||||||||}}}~~~~}|{zyxxyz|~~~~}||{{zzzzz{{{||}}}}}}}}}}}}}}}}~~~~~}||{zzzzz{|}~~~~}}}||||||||||||||}}}}}}}~~~~~}||{zzz{{|~~~}}||||{{{{{{{{{{{{{|||||}}}}~~~~}}||||}~~~~}}}}|||||||}}}}~~~~}|{zyyxyyz|~~}}||{{{{{{||}}}~~~~~~~}}}}}}}}~~~~}}|{{zzzzz{|}~~~}}}}}}|||||||}}}}}}}}}~~~~~~~}||{{zzz{||~~~}}}||||||||||||||||}}}}}~~~~~~}}|||}}~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{zyyyyyz|~~~}||||||||}}}~~~~~~~~~~}}}}}~~~~~~}||{{zzzz{{|}~~~~}}}}}}}}}}}}}}}}}}}~~~~~~}}||{{zzz{{|}~~~~~}}}}}}|||}|}}}}}}}}~~~~~~~}}||||}}~~~~}}}}}}}}}}}~~~~~}}}}}}}}|{{zyyyyyz|}~~}}|||}}}}~~~~~~~~~~~~~~}}||{{zzzz{{|}~~~~~}}}}}}}}}}}}}}}~~~~~~~~~}}||{{{zzz{{|}~~~~~~~}}}}}}}}}~~~~~~~~~}}|||||}}~~~~}}}}}}}}~~~~~~}}}||||||||{{zyyyyz{|}~~}}}}}}~~~~~~~~~~~~~~}}||{{zzzzz{{|}~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}||{{{{zz{{{|}~~~~~~~~~~~~~~~~~~~~~}}||||||}}~~~~~~~~~~~~~~~}}|||||||||{{zzyyyyz{|}~~~~~~~~~~~~~~~~}}||{{{{{{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{{zzz{{{|}~~~~~}}}||||||}}~~~~~~~~~~~}}|||{{{{{{{{{{zzzyyzz{|}~~~~~~~~~}}}||{{{{{{{{||}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zz{{{||}~~~~}}}|||||||}}~~~~~~~~~}}||{{{{{{{{{{{{zzzyyzz{|}~~}}}|||{{{{{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzz{{{||}~~~~}}}||||||||}}~~~~~~~~~~~~}}||{{{zz{{{{{{{{zzzzzzz{|}~~~~}}||||{{{{{|||}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{zz{{{{||}~~~~~}}}}||||||||}}~~~~~~~~~~~~~~~~~}||{{zzzzzz{{{{{{zzzzzzz{|}~~~~}}}}||||||||||}}~~~~~~~~~~~~~~~~~~~~~~}}}}}||||{{{{{zzz{{{{||}~~~~~~}}}||||||||||}}~~~~~~}}}}}~~~~~~~~}||{{zzzzzzzz{{{{{zzzzzz{{|}~~~~~}}}}||||||||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}|||||{{{{{{zz{{{{|||}~~~~~~}}}}||||||||||}}~~~~~~}}}}}}}}~~~~~~~~~}}||{{zzzzzzzzz{{{{zzzzzz{{|}~~~~~~~}}}}}||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||{{{{{{{zzz{{{{||}}~~~~~~}}}}}|||||||||||}}}~~~~~}}}}}}}}}}~~~~~~~~}}||{{zzzyyzzzzzz{{{zzzzzz{{|}~~~~~~~~~~~~~~~~~~~~}}}}}||||||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||{{{{{{{zzz{{{{{||}}~~~~~~~}}}}||||||||||||}}}~~~~~}}}}}}}}}}}}~~~~}}}||{{zzzyyyyyzzzz{{{{zzzz{{{|}~~~~~~~~~~~~~~~~~~~}}}}}}|||||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||{{{{{{{zzzz{{{{{||}}~~~~~~~}}}}}||||||||||||||}}~~~~~}}}}}}}}}}}}}}~}}}}|||{{zzyyyyyyzzzz{{{{{zzz{{{|}~~~~~~~~~~~~~~~~~}}}}}}}}|||||}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||{{{{{{{{zzz{{{{{|||}}~~~~~~~~}}}}||||||||||||||}}}~~~~~~}}}}||||}}}}}}}}}}}||{{zzzyyyyyyzzzz{{{{{{{{{{{|}~~~~~~~~~~~~~~~}}}}}}}}}}}|||}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}||||||||{{{{{{{{zzzz{{{{{|||}}~~~~~~}}}}}|||||||{{{{|||||}}}~~~~~}}}}}||||}}}}}}}}}}||{{{zzyyyyyyyzzzz{{{{{{{{{{||}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||{{{{{{{{zzzzz{{{{{|||}}~~~~~~~~}}}}}||||||||{|||||||}}}~~~~~}}}}||||||}}}}}}}}|||{{zzzyyyyyyyzzzz{{{{{{{{{{||}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||{{{{{{{{zzzzz{{{{{{|||}}~~~~~~~}}}}}}|||||||||||||||}}}}~~~~~}}}}||||||||}}}}}}||{{{zzyyyyyyyyzzzz{{{{{{{{{{||}~~~~~~~}}}}}}}}}}}}}|||||}}}}}}}}~~~~~~~~~~~}}}}}}}}}|||||||{{{{{{{{zzzzzz{{{{{{|||}}~~~~~~~}}}}}|||||||{{{{{{|||||}}}~~~~~~}}}}|||||||}}}}}}|||{{{zzyyyyyyyyzzzz{{{{{{{{{{||}~~~~~~~}}}}}}}}}}}}}|||||}}}}}}}}~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{zzzzzz{{{{{{|||}}~~~~~~~~}}}}}|||||||||{{|||||||}}}~~~~~~}}}||||||||||}}|||||{{zzzyyyyyyyyzzzz{{{{{{{{{{||}}~~~~~~}}}}}}|||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{zzzzzzz{{{{{|||}}}~~~~~~~~}}}}}|||||||{{{{{{{|||||}}}}~~~~~}}}}||||||||}}}}||||{{{zzyyyyyyyyyzzzz{{{{{{{{{{||}}~~~~~}}}}}}|||||||||||||}}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{zzzzzz{{{{{{|||}}}~~~~~~~~}}}}}||||||||{{{{{||||||}}}~~~~~~}}}}||||||||||||||||{{{zzyyyyyyyyyzzzz{{{{{{{{{{||}}~~~~~}}}}}}|||||||||||||}}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{zzzzzzz{{{{{{|||}}}~~~~~~~}}}}}|||||||{{{{{{{{|||||}}}}~~~~~~}}}}}|||||||}|||||||{{zzzyyyyyyyyyzzz{{{{{{{{{{|||}}~~~~}}}}}|||||||||||||||}}}}}~~~~~~~~~~}}}}}}}||||||{{{{{{{{{zzzzzzzz{{{{{{|||}}}~~~~~~~}}}}}|||||||{{{{{{{||||||}}}}~~~~~~}}}}}|||||||||||||||{{zzzyyyyyyyyyzzz{{{{{{{{{{|||}}~~~~}}}}}|||||||||||||||}}}}}~~~~~~~~~~}}}}}}|||||||{{{{{{{{{zzzzzzzz{{{{{{|||}}}~~~~~~~}}}}}|||||||{{{{{{{{{|||||}}}}~~~~~~}}}}}}|||||||||||||{{{zzzyyyyyyyyyzzz{{{{{{{{{{|||}}~~~~}}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}|||||||{{{{{{{{zzzzzzzzz{{{{{{|||}}}~~~~~~~~}}}}}|||||||{{{{{{{{||||||}}}}~~~~~~}}}}}}|||||||||||||{{{zzzyyyyyyyyyzzz{{{{{{{{{{|||}}~~~~}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{zzzzzzzzz{{{{{{|||}}}~~~~~~~~}}}}}||||||||{{{{{{|||||||}}}}~~~~~~}}}}}}||||||||||||{{{zzzyyyyyyyyyyzzz{{{{{{{{{||||}}~~~~~}}}}|||||||||||||||||}}}}~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzz{{{{{{|||}}}~~~~~~~}}}}}}|||||||{{{{{{{{||||||}}}}~~~~~~}}}}}}}}}}}|||||||{{{zzzyyyyyyyyyyzzz{{{{{{{{{||||}}~~~~~}}}}||||||||||||||||}}}}}~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzz{{{{{{{|||}}}~~~~~~~}}}}}}||||||||{{{{{{|||||||}}}}~~~~~~~}}}}}}}||||||||||{{{zzzyyyyyyyyyyzzz{{{{{{{{|||||}}~~~~~}}}|||||||||||||||||}}}}~~~~~~~~~}}}}}|||||{{{{{{{{zzzzzzzzzzz{{{{{{|||}}}~~~~~~~~}}}}}||||||||{{{{{{{|||||||}}}}~~~~~~~}}}}}}}}}}}||||||{{{zzzyyyyyyyyyyzzz{{{{{{{{|||||}}~~~~~}}}}||||||||||||||||}}}}~~~~~~~~}}}}}}|||||{{{{{{{{zzzzzzzzzz{{{{{{{|||}}}~~~~~~~~}}}}}|||||||||{{{{{{|||||||}}}}~~~~~~~}}}}}}}}}}|||||||{{{zzzyyyyyyyyyyzzz{{{{{{{{|||||}}~~~~~}}}}||||||||||||||||}}}}~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzz{{{{{{|||}}}~~~~~~~~}}}}}||||||||{{{{{{{|||||||}}}}~~~~~~~}}}}}}}}}}}||||||{{{zzzyyyyyyyyyzzzz{{{{{{{{|||||}}~~~~~}}}|||||||||||||||||}}}}~~~~~~~~}}}}}|||||{{{{{{{{zzzzzzzzzz{{{{{{{|||}}}}~~~~~~~}}}}}|||||||||{{{{{||||||||}}}}~~~~~~~}}}}}}}}}}||||||{{{zzzyyyyyyyyyyzzz{{{{{{{||||||}}~~~~~}}}|||||||||||||||||}}}}~~~~~~~~~}}}}||||||{{{{{{{zzzzzzzzzzzz{{{{{{|||}}}}~~~~~~~}}}}}|||||||||{{{{||||||||}}}}~~~~~~~~}}}}}}}}}}}||||{{{zzzzyyyyyyyyyzzzz{{{{{{{||||||}}~~~~~}}}}|||||||||||||||||}}}}~~~~~~~~}}}}||||||{{{{{{{zzzzzzzzzzzz{{{{{{||||}}}~~~~~~~~}}}}}|||||||||||{|||||||||}}}}}~~~~~~~}}}}}}}}}}}||||{{{{zzzyyyyyyyyyzzzz{{{{{{{||||||}}}~~~~}}}}|||||||||||||||||}}}}~~~~~~~}}}}||||||{{{{{{{zzzzzzzzzzzz{{{{{{||||}}}~~~~~~~}}}}}|||||||||||||||||||||}}}}~~~~~~~~~}}}}}}}}}|||||{{{zzzzyyyyyyyyyzzzz{{{{{{{||||||}}~~~~~~}}}}||||||||||||||}}}}}~~~~~~~~~}}}}||||||{{{{{{{{zzzzzzzz{{{{{{{{||||}}}}~~~~~~~~~}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~}}}}}}}|||||{{{{{zzzzzzzzzzzz{{{{{{|||||||}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||||||{{{{{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}|||||||||{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}||||||||{{{{{{{{{{|||||||||}}}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zxtssrrqqssrstssttsuuuuvwxy{|}}{ywutrqpponnnnnnnnoqtx||tx{~|{yxwvvuuvvvvwxz{|}~~}|{zyxwwvvuuuuuwxyz|~sp|wssuwz}~~~|{{{{{{{||}~~~}}}}}}}~~~yx~}{{|}~~}|{zzyyyyyyz{|}~zupnpv|xurponnnoppqrssttttttsrrqpppppqstuwyz|}~|yxxz~~||{{{{{{{|||||||{{{{{||||}}~{xusrruy~{ywusrqponnnmmmmmmmmnnnooppqrstuvwxyz{|}~~|zxwxz~}||{{{zzzzzyyyyyyyzz{{|}~{vronnqv|~{yxwvvvvvutsrponmmmmnopqrtuuvvvwvwwwwwxyyz{|}}{ywusrstw|}|{zyyxxxxxxyyyyyyyyzzzz{{{||}~~~{xvtrrtw{~{ywvtsrqppooonnnoooopppqrrsttuvwxyz{{|}~~|zyxxy|~}|{{{zzzzzyyyyzzz{{|}~}zvspnnosx~~|zzyyxxxwvtsqponnnoopqrtuuvvwwwwwwwwwxyyz{|}~~|{ywusrrtvy}~|{zzyyyyyyyyyyyzzzzz{{{||}}~~|zwusrrsux}~|zywvutsrrqqqpppppqqqrrsstuuvwxyyz{|}}~}|zyxxyz}~}||{{{zzzzzzzzz{{|}~|zvsqonnqty~}|{{{zyxwvusrqppppqrstuvwwxxxxwwwwxxxyz{|}~~}{ywvtsssuw{~~||{zzzzyyyyzzzzzz{{{|||}}~~}{ywusrrrtvz~~|{yxwvutssrrrrqrrrrrssttuuvwwxyzz{|}~~~}{zxxwxy|~~}||{{zzzzzzzz{{|}}~~}{yvtqonnprv{~~~}}|{zxwutsrqqrrstuvwxxyyyyyyyxxyyyz{{|}~~}{yxvtssstvy|~}||{{zzzzzzzzz{{{{|||}}~~}{ywusrrrsux{~}{zyxwvvuuttttssttttuuuvvwxxyzz{||}~~~}{zyxxxyz}~}}|{{{zzzz{{{||}~~~~}|zywtrponoqtx}~~}{zxwutssssttuvwxxyyyyyyyyyyyyyz{{|}~~}|zywvutsstvwz}~}}||{{{{{{{{{{{{|||}}}~~}{zxvutsrrstvy}~|{zyxxwwvvuuuuuuuuvvvwwxxyyzz{||}~~}|{zyxwwxy{~~}}||{{{{{|||}}~~~}}||{zxwusqpooprvz~~}{zxwvuuuvvwxyyzz{{{{{zzzzzzzz{{|}}~~|{zxwvutttuwy{~~}}||||{{{||||||}}}~~~~|{yxvutsrrstux{~~}|{zzyyxxwwwwwwwwwwxxxyyzz{{||}}~~~|{zyxxwwxyz|~~}}||||||||}}~}|{{zzzyxxvusrpoopqtw{~}{zyxwwwwxyyz{{|||||{{{{zzzz{{{|}}~~}|{yxwvutttuvxz|~~}}}||||||||}}}}}~~~~}{zywvutsrrrsuwy|~}||{{zzzyyyyyyyyzzz{{{||}}}~~~}|{zyxxwwwxy{}~}}}|||}}}}~~~|{zyyxxxxwvutrqpppqsuy}}|{zyyyyyz{{|}}}}}}}}||||{{{|||}}~~~}|{zyxwvuuuuvwy{}~~}}}}}}}}}}}}}~~~~~|{zyxwvutsrrrstvxz}~}}||{{{{{zzz{{{{{{|||}}}~~~~}}|zyyxwwwwwxy{}~~}}}}}~~~~}|zyxxwwwwvvutsrqppqrtwz~~}|{{{{||}}~~~~~}}|||||||}}}~~~}|{zyxwvuuuuvwxz|~~~~~}}}}}}}}}}~~~~~~}}|{zyxwvutssrsstuwy{~~~}}}|||||||||}}}}}~~~~~~}|{{zyxxwwwwxyz|~~~~}~~~~~}|zyxwvvvuuuuutsrrqqqrsux|~}}||}}~~~~}}}||||}}}~~~}|{zyxwvvuuuvwxy{}~~~~}}}}}}}}}~~~~~~}||{zyxwvuttssrrssuvxz|~~~~}}}}}~~~~~~~~~~}||{zyyxwwwwwwxyz|~~~~~~~~~|{yxwvuuuuuuuttssrqqqqrtvy}~~~~~~~}}}}}}}}~~~~~}|{{zyxwwvvvvwxy{|~~~~~~~~~~~~~~~~~~~}}||{zzyxwvvutssrrrsstuwy{}~~}}|{{zyyxwwwwwwxyz{}~~~}}}}}}~~~}|zyxwuuttttttttssrrqqqrsuwz}~~~}}}}}~~~~~~}}|{{zyxxwwvvvwxyz{}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyxxwvuutsssrrrstuvxy{}~~}}|{{zyyxxwwwwwwxyz{}~~}}||||||}}}~~~~~~}|{zxwvutssssssssssrrrqqrstvx{~~~~}}}}}~~~~~~~~~~~}}}|{{zzyxxwwwwxxyz{}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxwwvuutsssrrssttvwyz|~~~}}||{zzyyxwwwwwwwxxy{|}~~}}||{{{{|||}}}}}}||{zxwvutsrrrrrsssssrrrrrrsuwy|~~~}}}}}}~~~~~~~~}}}||{{zzyyxxwwwxxyz{|}~~~~~~~~~~~~~~~~~~~}}}}}}}}||||{{{zzyyxxwwvuuttsssrrssstuvxy{}~~}}}|{{zzyyxxwwwwwwxxyz{|~~~}||{{{{z{{{|||||||{zyxwvussrrqrrrrsssssrrrrstvxz}~~~}}}}}}}}}}}}}||||{{zzyyyxxxxxxyz{|}~~~~~~~~~~~}}}}}}}}}}||||{{{zzzyyxxwwvvuuttsssrrrsstuvwxz|}~~~}}|||{zzyyxxwwwvvvvwwxyz{|~~}||{{zzzzzzz{{{{|{{zzyxvutsrrqqqqrrrsssssrrrstuwy{~~~~}}}}}}}}}||||||{{{zzyyyxxxxxxyyz{|}~~~~~~~}}}}}}}}}|||||{{{{zzzyyxxxwwvvutttsssrrssstuuwxy{|~~~}}}||{{zyyxxwwwvvvvwwxyyz|}~~}}|{{zzzyyyzzzz{{{{zzyxwvtsrrqqqqqqrrssssssssstvwz|~~}}}}}}}|||||||{{{zzyyyxxxxxxyyz{|}~~~~~~}}}}}}||||||{{{{{zzzzyyyxxwwwvvuutttssssrsssttuvwxz{}~~~}}||{{zzyyxxwwvvvvvvwwxyyz{}~~~}||{zzyyyyyyzzzzzzzzyxxvutsrqqpppqqrrssssssssstuvxz}~~}}}||||||{{{{{{zzzyyyyyxxxyyyz{||~~~~~}}}}}||||||{{{{zzzzyyyxxxwwvvvuutttssssrsssstuvwxyz|}~~~}}||{{zzyyxxxwwwvvvvwwxxyz{|}~~}||{zzyyyxxxyyyyyzyyyxwvutsrqqppppqqrrsssssssstuvwy{~~~}}}|||||{{{{{{zzzzyyyyyyyyyyz{{|}~~~~~}}}}|||||{{{{{zzzyyyyxxxwwvvvuutttsssssrssssttuvwxz{|~~~~}}||{{zzyyxxwwwwwwwwwxxyzz{|}~~}|{zzyyxxxxyyyyyyyyxxwvutsrqqpppppqqrrsssssssttuvxz|~~~}}||{{{{{zzzzzyyyyyyyyyyyyz{{|}~~~~~}}}||||{{{{zzzzyyyxxxwwwvvuuutttssssrrrsssttuvwxyz{}~~~}}||{{zzyyyxxwwwvvvvvwwxxyzz{|}~~~}|{{zyyxxxxxxxyyyyxxxwvutsrqqppppppqqrrssssstttuvwyz}~}}|||{{{{zzzzzyyyyyyyyyyyzzz{||}~~~~}}}||||{{{zzzzyyyxxxwwwvvvuuutttssssrrrrsssttuvwxy{|}~~~}}||{{zzyyxxxwwwwvvwwwwxyyz{|}~~}||{zyyxxxxxxxxxxxxxxwwvutsrqppoooppqrrssstttttuuvxy{}~}}|||{{{zzzzzzyyyyyyyyyyyzz{{|}~~~~~}}}|||{{{{zzzyyyxxxwwwvvvuutttsssssrrrrsssttuvwxyz{|~~~}}}||{{zzyyxxwwwwvvvvvwwwxyyz{|}~~}||{zyyxxxxxxxxxxxxxxwvvutsrqppoooppqqrrssttttttuvwxz|~~}}||{{zzzzyyyyyyyyyyyyyyzz{{|}}~~~~}}|||{{{{zzzyyyxxxwwwvvuuuttttsssssrrssssttuuvwxyz|}~~~}}||{{zzyyyxxwwwwwvvwwwwxxyzz{|}~~}|{{zyyxxxwwwwxxxxxwwvvutsrqqppoooppqqrssttttttuuvwyz|~~~}}||{{zzzyyyyyyyyyyyyyyzzz{||}~~~~}}}|||{{{zzzyyyxxxwwvvvuuuttttsssssrrrssssttuvwxyz{|}~~}}||{{zzyyxxxwwwvvvvvvwwwxxyz{{|}~~}|{{zyyxxxxxxxxxxxxwwvvutsrrqppoooppqqrrsstttttuuvwxy{}~}}|{{zzzyyyyxxxxxxxxyyyzz{{||}~~~~}}|||{{zzzyyyxxwwwvvvuuutttssssssrrrssssttuuvwxyz{|~~~}}||{{zzyyxxxwwwwvvvwwwwxxyyz{|}}~~}|{zzyyxxxwwwwwxxwwwwvuutsrqppooooppqqrssttttuuuvvwxz|~~~}||{{zzyyyyyxxxxxxxyyyyzz{{|}}~~~}}|||{{zzzyyyxxxwwvvvuuuttttsssssrrrssssttuuvwwxy{|}~~~}}||{{zzzyyxxxwwwwwwwwwwxxyyzz{|}~~~}}|{zyyxxxwwwwwwwwwwwvvutsrrqppooooppqrrsttttuuuuvwxy{|~~}||{{zzyyyxxxxxxxxxxyyyzz{||}~~~}}}||{{zzzyyxxxwwwvvuuuttttsssssrrrrssssttuvvwxyz{|}~~~~}}||{{zzyyxxxwwwwwvwwwwwxxyyz{{|}~~~}|{zzyyxxxwwwwwwwwwwvvutssrqppooooppqqrsstttuuuuvvwxz{}~}||{zzzyyyxxxxxxxxxyyyzz{{|}}~~~}}||{{{zzyyyxxwwwvvuuuttttsssssrrrrssssttuuvwwxyz{|~~~}}||{{zzzyyxxxwwwwwwwwwwxxyyzz{||}~~}}|{zyyxxxwwwwwwwwwwvvuutsrqqppooooppqrrssttuuuuvvwxyz|}~~}|{{zzyyyyxxxxxxxxyyyzzz{||}~~~~}}}||{{zzyyyxxwwwvvvuuutttssssrrrrrrssssttuuvwxyz{|}~~~}}|{{{zzyyxxxwwwwwwwwwwwxxyyz{{|}~~~}|{zzyyxxxxxwwwwwwwvvuutsrrqppooooppqqrsstttuuuuvvwxy{|~~~}|{{zzyyyxxxxxxxxxxyyzz{{||}~~~}}||{{zzyyxxxwwvvvuuutttsssssrrrrrrsssttuuvwwxyz{|}~~~}}||{{zzzyyxxxwwwwwwwwwwxxyyzz{||}~~}}|{zzyyxxxxwwwwwwwwvvuttsrqqppooooppqrrssttuuuuvvwwxz{}~~}}|{{zzyyxxxxxxxxxxyyyzz{{|}}~~~}}||{{zzzyyxxwwwvvuuutttsssssrrrrrrssssttuuvwxyyz{|}~~}}||{{zzyyyxxxwwwwwwwwwxxxyyz{{|}}~~}|{{zyyyxxxxxxwwwwwvvuutsrqqppooooppqqrssttuuuuuvvwxyz{}~~}|{{zzyyxxxxxxxxxxxyyzz{{|}}~~~}}||{{zzyyyxxwwvvvuuttttsssssrrrrrrsssttuuvvwxyz{|}~~~}}||{{zzzyyxxxxwwwwwwwwxxxyyzz{{|}~~~~}|{{zyyxxxxxxwwwwwwvvuttsrqqppooooppqrrssttuuuuvvwwxyz|~~}}|{{zyyyxxxxxxxxxxyyyzz{||}~~~~}}||{{zzyyxxwwwvvuuutttsssssrrrrrrssssttuuvwxxyz{|}~~~}}||{{zzyyyxxxxwwwwwwwxxxxyyzz{||}~~}}|{zzyyxxxxxwwwwwwvvuutsrrqppoooopppqrrsttuuuuvvvwxyz{|~~~}|{{zyyyxxxxxxxxxxxyyzz{{|}~~~~}}||{{zzyyxxwwvvvuutttsssssrrrrrrrssstttuvvwxyyz{|}~~~}}|{{{zzyyyxxxwwwwwwwwxxxyyzz{{|}}~~}|{{zzyyyxxxxxxwwwvvuutssrqqppooooppqrrssttuuuvvvwwxyz{}~~}}|{zzyyyxxxxxxxxxxyyzz{{||}~~~~}||{{zzyyxxwwwvvuuutttsssssrrrrrrssssttuuvwwxyz{|}~~~}}||{{zzzyyxxxxxwwwwwwxxxyyyzz{||}~~~~}|{{zzyyxxxxxxwwwwvvuutsrrqpppoooppqqrrsttuuuuvvvwwxyz|}~}||{zzyyyxxxxxxxxxyyyzz{{|}}~~}}||{{zzyyxxwwvvuuutttsssssrrrrrrsssstttuvvwxxyz{|}~~~}}||{{zzyyyxxxxxwwwwxxxxyyyzz{{|}}~~}||{zzzyyyxxxxxwwwvvuutssrqqppooopppqqrssttuuuvvvvwxyz{|~~}||{zzyyyxxxxxxxxxxyyzz{{|}}~~~}}||{{zzyxxwwwvvuuutttssssrrrrrrrssssttuuvvwxyzz{|}~~~}}||{{zzyyyxxxxxxwxxxxxxyyzz{{||}~~~~}||{zzyyyyxxxxxwwwvvuutsrrqpppooopppqrrsttuuuuvvvwwxyz{}~~}||{zzyyyxxxxxxxxxyyyzz{||}}~~~}}|{{zzyyxxwwvvvuutttsssssrrrrrrrssssttuuvwwxyz{||}~~}}||{{{zzyyyxxxxxxxxxxxxyyyzz{{|}}~~~}|{{zzyyyxxxxxwwwwvvutssrqqppooopppqqrssttuuuvvvvwxxyz|}~}||{zzyyyxxxxxxxxxyyyzz{{|}}~~~}||{{zzyyxxwwvvuuuttsssssrrrrrrrrssstttuvvwxxyz{|}~~~}}||{{zzzyyyxxxxxxxxxxxyyyzz{{||}~~~}}|{{zzzyyyxxxxwwwvvuutsrrqpppooopppqrrssttuuuvvvwwxyz{|}~~}||{zzyyyxxxxxxxxxyyzz{{||}~~~}}||{{zyyxxwwvvvuutttssssrrrrrrrrssssttuuvvwxyzz{|}~~~}}||{{zzzyyyxxxxxxxxxxyyyzzz{{|}}~~}||{{zzyyyyxxxxwwwvvuttsrrqpppoopppqqrrsttuuuvvvvwwxyz{|~~~}|{{zzyyyxxxxxxxxyyyzz{{|}}~~~~}}||{zzyyxxwwvvuuuttssssrrrrrrrrrssssttuuvwwxyz{||}~~~}|||{{zzyyyyxxxxxxxxxyyyyzz{{||}~~~}}||{{zzzyyyyxxxwwvvuutsrrqqpppoppppqrrssttuuuvvvwwxxyz|}~~~}||{zzyyyxxxxxxxxyyyzz{{||}~~~~}}|{{zzyyxxwwvvuutttssssrrrrrrrrrsssttuuvvwxxyz{|}~~~}}||{{{zzyyyyxxxxxxxxyyyyzz{{||}}~~}}||{{zzzyyyxxxxwwvvuttsrrqppppppppqqrrstttuuuvvvwwxyz{|}~}}|{{zzyyyxxxxxxxyyyzzz{{|}}~~}}||{{zyyxxwwvvuuuttssssrrrrrrrrrssstttuuvwwxyzz{|}~~~}}||{{{zzzyyyyyyyyyyyzzzz{{||}}~~~}}|||{{zzzyyyxxxwwvvuttssrrqqqqqqqqrrssttuuuvvvwwxxyz{|}~~~}}||{{{zzzzyyyyzzzzz{{|||}}~~~}||{{zzyyxxwwwvvuuutttttssssssssstttuuvvwwxxyzz{|}}~~~}}}|||{{{{zzzzzzzzzz{{{{||}}}~~~~}}|||{{zzzyyyxxwwwvvuutttssssssssssttuuuvvvwwxxyyzz{|}~~~~}}}|||{{{{{{{{{{{{{{|||}}~~~~~}}||{{zzzyyxxwwwvvvvuuuuutttttttuuuuuvvwwwxyyzz{||}~~~~}}}||||{{{{{{{{{{{||||}}}~~~~~}}}||{{{zzzyyyxxxwwwvvuuuutttttttuuuuvvvwwwxxyyyz{{|}}~~~}}}}||||||{{{{||||||}}}~~~~~}}}||{{{zzzyyxxxwwwwvvvvvvvuuuuuvvvvvwwwxxxyyzz{||}}~~~~}}}}}||||||||||||||}}}}~~~~~~}}}||{{{{zzzyyyxxxwwwvvvvvvvvvvvvvvwwwwxxxyyyzz{{|}}~~~~~}}}}}|||||||||||}}}}}~~~~~~}}}|||{{{zzzyyyxxxxwwwwwwwvvvvvwwwwwwxxxyyyzz{{||}}~~~~~~}}}}}}}}|||}}}}}}}}~~~~~~~}}}|||{{{{zzzyyyyxxxxwwwwwwwwwwwwwwxxxxyyyyzz{{||}}~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~}}}|||{{{{zzzyyyyyxxxxxxwwwwwwwxxxxxxyyyyzzz{{||}}~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}|||{{{{zzzzyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{{||}}}~~~~~~~~}}}}}}}}}}}}~~~~~~~~~}}}}|||{{{{zzzzyyyyyyyxxxxxxxxxxxyyyyyzzzz{{|||}}~~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyxyyyyyyyyyyzzzz{{{|||}}}~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||{{{{{zzzzzzzyyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{|||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}|||||{{{{{{{zzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}||||||{{{{{{{{{{{{zzz{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~~~~}}}}}}}||||||||{{{{{{{{{{{{{{{{{|||||||}}}}~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~}}}}}}}|||||||||||||{{|||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}|||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~yvtpoqwyvvxz|}{ywussrqrstuwy{}~|zwtqoljgfedcbbbcehlqylmper~|{zyyyz{}~~|zxwutssstvwy|{rw|wx{~|{yxxwwwwxy{}zjaf{xoiggiloqstvvvtsrqqponmmllmmnnprtvx{}~}}}|||}~}ysmilv}|{|~~~~~umebdn}|upkhfeedddddeddeffghhijkmnpqsuvxz{|~{xsomou{}{ywwvvvwwxxyz{|{|}~|umgb_`eo|yrmifdcbbcdeefggggfddddeegikmortwy|}}~}~~~~~~~~}{yvsqnmoszysmhddgny|wrnkhfdba``____``abcdefgiklnpqstvwyz{|}~~{xtqnlmou|~{zyxxxxyyz{|}~wphb^]`hs}xtrpoomljgeba___`bdgikmoppqqqqqrrstvxy{}~{xtpmkkmry~|{zyyyyyyyzzz{{|}}~~xrmhedfks}|wrnkhfdcaa````aabcdefgijlmoqrtvwyz{}~~|yvsqqsx~}|{zzzzzz{{|~}wqje`^`eny}zwvusqoligdba`abdfhjlmnopopooppqrstvxy{}~~|yvspmkjlou{}|{{zzzzzz{{||}}~|wrmifefjpx{wspmkigfeddccddeefghiklnoqrsuvxyz|}~~|ywtqpoqty~}{zzyyyyzz{|~}xsmgb``dku~|{ywuspmjgedddfgikmnppqqqqqqqqrstvwy{|~~|yvspmkjknrx~~|{zzyyyyzzz{{||}~~zvqmigefinu}{xuromljihhgggghhijklmnpqrtuvxyz{|~~|ywtrqpqsw}~}|{{zzz{{|}}{yupkfb__afnx~}{zyvspmkihgghjlnoqrstttsssssttuvxy{|~}zxuromllnrv|~}||{{{{{|||}~~{xtplhfeegkqx}zwtrpnlkjjiiiiijjklmnopqstuvxyz{|}~~|zwusqppruz~}|||||}~~|{ywtqlhda`aekt}}zwtqnljihijkmoprrsttsssrrrstuvwxz{}~}{ywtromllmpty~}}}}}}}}~~{xtpligeegjou|~{xvtrqonnmmmlmmmnoopqrstuvxxzz{|}~~}|zxvsqpoopsv{~}|||||}~}{yxvuspmifcaadipx~{xtqommlmnoqstuuuuuuttttttuvwxz{|~~}{yvtronllmorv{~}}|||||}}}~~|yvspljhffgimsy|zxvusrrqpppppqqrrstuuvwxyz{|}}~~}{zxvtrqpppruy~~}}}~~|ywvtsrpnlifcaabflt|~{xusqpppqstuvwxxxxxwvvvvvvwxyz{|}~}|zxvtqpnnnprvz~~~~~~~|zwtqnkigeeegkou{}{ywvutsrrrrrrssstuuvwwxyz{||}~~~}|{ywvtrqpopqtw{~{yvsrqpomligdbbbeipx}zwussrstuvwxyyyyxxwwvvvvvwwxy{|}~~~}{zxvtrponnoqtx|}{xvspnkigfffgjnsx~~|{yxwvuuuttttuuuvvwxxyzz{||}}~~~~~}||zyxvtsqpoooprux|}zwtrqponmljhfdbcdhmt|}zxwvvwxyz{{|||{zyyxwwwwwxxyz{|}~~~~}|{ywutrponnoprvy~~~~~~}{ywtrpmkihgffhjmqv|~}{zzyxxxwwwxxxxyyyzz{{||}}~~~~~~~~}}|{zywvtsqponnoqsvz}}zwtrpnnmllkihfdccdfjpw}{zyyzz{|}~~~~~}|{zyyxxxxyyz{{|}}}}}}||{yxvusrqpppqsvy}~}|zxvtrpnljhgfeefhkosx}~}|{{zzyyyyzzzz{{{||}}}~~~~~}}|{zyxvusrqpoooprux||yvspnmlkkjjihfedcceimtz~|{zz{|}}~~~}|{zzyyyxyyzz{{||}}}||{zyxvutrqpppqsux{~|{yxvtrpnlkigfffghknrv{~}}|||{{{{{{|||||}}}~~~~~~~~~}}||{zyxwutsqpoooopqtvy}~~~~~}{xurpmljjiiiihgfeddehlqw~~}~~~}|{zzyyyyyzz{{|||||{{zywvusrqpppqrtvy|~~}|{yxwusrpnlkihgffghjmpty~~~}}}}}}}}}}}~~~~~~~~~~}}||{zyxwvutrqponnnoprtwz~~}|||||}}~~~~~}{yvsqnljihhhhhhgfeedegjntz~}|{zzzyzzzz{{{{{zzyyxwutsrrqqrstvy|~~}}|{zyxwvtsqpnmkjhgffffgiknrvz~~~~}}|{{zyxwutsrqpooooprtvy|~}|{{zz{{|}}}}|{yvtqnljhgggggggffeeefhlqv}~}|{{zzzzzzzzz{zzzyyxwvutsrrrrstvx{~~~~~~}}||{{zyxwvusrqonlkjhggfffgikmqtx}~~~~~}}||{zyxwvutsrqpoooopqsuxz}}|{zzyyyyz{{{{{yxvsqnlihgfffggggfffffhkotz}|{{zzzzzzzzzzyyyxwvuutsrrqrrsuwy|~~~~~}}}||{{zyyxwvutsqponlkjihgffggijmosw{~~~}}|{{zyxwvutsqpponnnopqsux{~~}|{yyxxwxxxyyyyyxvtrpmkigfeeeffgggffffhjmqw|~}|{zzzyyyyyyxxwwvuutssrrsstuwy{~~~~~}}}}|||{{zzyyxwwvutsrponlkjihgffffghiknqux|~~}}|{zzxxwutsrqpooooopqsuwz|~}|zyxwwvvvwwwxxwwutromjhfedddeeffgffffgikosy~}|{{zzyyyyyxxxwwvuutssssstuwy{}~~}}}}|||{{zzzyyxwvvutsrqponlkjihggfffghikmpswz~~~}}|{zzyxwvtsrqppoooopqrtvx{~}|zyxwvuuuuvvvvvvusromkhfedcddeefggggggiknqv|~}|{zyyxxxwwwvvuuttsssssstuvxz|~~}}}||{{{zzyxxwwvutsrqqonmlkjihhgfffghijloruy|~~}||{zyxwvutsrqpoonnnopqrtvy{~~|{zxwvuuuuuuuvvuutsqomjhfedccddefggggghijlpty~~}|{zzyxxxwwwvvuuttssssstuvwy{}~~}}||{{zzyyxxwwvuttsrqponmlkjjihggffffghjlnpswz~~}||{zyxwvutsrqppoooopqrtvxz|~}{zxwvuttssttttttsrqomkhfeccbccdefgggghhiknqv{~}|{zzyxxxwwvvvuutttttttuvwy{}~~}}|{{zzyyxxwwvuutsrrqponmlkjiihggfffgghikmorux|~}}|{zyxwvutsrqqppooppqrsuwy{~}|zywvutssssssssssrqomkigedcbccdefggghhhikmptx}}|{zyxwwvvuutttssssssttuwxz|~~}}||{zzyyxwvvuttsrqpponmlkjiihggfffgghikloqtwz}~~}|{zyxwvutsrqppooooopqrtuwy{~~}{zxwutssrrrrssssrrpomkigeccbbccdffghhhiijlorv{~}|{zyxwwvvuuttttsssttuuvxy{}~}||{zzyxxwvvuutsrrqponmmlkjihhggffffghijlnpsux|~~}|{zyxwvutsrqppoooppqrsuwxz}}|zywvtsrrqqqrrrrqqpomkigecbbabbcefgghhiijkmptx|~}|{zyxwwvvuuttttttttuuvwyz|~~}}|{zzyxxwvvutssrqpponmllkjihhggffffgghikmoqtwz}~}|{zyxwvutsrrqppppppqrstvxz|~~|zywvtsrrrqqrrrrqqpnmkigedbbabbcdfgghhiijkmorvz~}{zyxwvvuuttssssssttuvwxz{}~}}|{zyyxwvvuttsrqpponmllkjiihggffffgghiklnpsvx{~~}|{zyxwvutsrqqppoooppqrsuvxz|~~}{yxvutsrqqqqqqqqqpomljhfdcbaabcdefghiijjklnqtx|~|{zyxwvuutttsssssttuuvxy{|~~}}|{zyxxwvuutsrrqponnmlkjjihhgggfffgghijlnprtwz}~}|{zyxwvutsrqqppppppqrstvwy{}}|zxwutsrqqppppppppomljhfecbaaabcdeghhiijklmorvz~~|{zyxwvuuttttsstttuuvwyz|}~}|{zyyxwvuutsrqqponmmlkjjihhggffffgghijkmoqsvx{~~}|{zyxwvutsrrqppppppqqrtuwxz|~}|zxwutsrqqqqqqqppoomljhgecbaaabcdefghiijjklnqtw{}|{yxwvuuttssssssstuvwxy{|~~}|{zyxxwvutssrqponnmlkjjihhgggfffgghhiklnprtwz|~}|{zyxwvutsrqqpppppqqrstvwy{}~~|{ywvtsrqqpppppppoonlkigfdcbaaabcefghijjkklnprvy}}{zyxwvuttssssssttuuvwyz|}~}|{zyxxwvutsrrqponnmlkkjiihgggfffggghijlmoqsvx{~~}{zyxwvuttsrqqqpppqqrstuwxz|}}|zxvutrqqppppoooonnlkjhfdcbaaabcdefhiijjklmoqtw{~}{zywwvutttssssttuuvwxz{|~~}|{zyxwvutsrrqponnmlkjjihhgggffffgghhjklnprtwy|~}|{zyxwvutsrrqqpppqqrstuvxy{}~~|zxwutsrqqppppppoonmkjhfecbaaaabcefghijjklmnpruy}~|{yxwvuttsssssssttuvwyz|}~}{zyxwwvutsrqpoonmlkkjiihgggffffgghhiklnoqsvx{}~|{zyxwvutssrqqqqqqqrrstuwxz{}}{yxvusrqqpppppooonmljigfdcbaaabcdfghijkkllmoqtw{~}|zyxwvuttssssssttuvwxy{|~~}|{zyxwvutsrqpponmlkkjiihhggffffggghijlmopsuwy|~~}|{zyxwvutssrrqqqqqrrstuvxy{|~~|zxwutsrqppoooooonmlkihfdcbaaaabcefgijjkklmnpruy|}{zywvvuttsssssttuvwxyz|}~}{zyxwvutsrrqponmllkjiihhggfffffgghijklnoqsvxz}~}{zyxwvuutsrrqqqqqrrstuvwyz|}~|{ywvtsrqqppppooonmlkjhfecbaaaabcdfghijkklmnoqtwz~~}{zxwvuttssssssttuvwxy{|~~}|{zyxwvutsrqponmmlkjjihhgggffffgghhijlmoqsuwy|~~}|{zyxwvutssrrqqqqrrsstuvxy{|~}|zxwutsrqppppooonnmljigfdcbaaabcdeghijkklmmopsux|~|{yxwvuttsssssttuuvwyz{}~~}{zyxwvutsrqpoonmlkkjiihgggffffggghijkmnprtvxz}~}|{zyxwvutssrrrrrrrsstuvwyz{}~~|{ywvtsrqpppoooonnmlkihfecbaaaabcdfghjjkllmnpqtwz}~|{yxwvutssssssstuvwxyz{}~~}|{zyxwvutsrqponmlkkjiihgggfffffgghhijlmoqsuwy{~}|{zyxwvuttssrrrrrrsstuvwxz{|~}{yxvutsrqqpppooonmlkjhgedbbaaabcdeghijkklmnopsux{}|zywvuutssssssttuvwxz{|~~}|{zxwvutsrqponmmlkjiihhgggffffgghhijkmnprtvxz|~}|{zyxwvuttssrrrrrssttuvxyz|}~|zywvusrrqpppooonnmljigfdcbaaabbdefgijkklmmnprtvy}~}{zxwvuttsssssttuvwxyz{}~}|{zyxwvusrqpponmlkjjihhgggffffggghijklnoqsuwy{}~}{zyxwvvuttssrrrrssttuvwxz{|~}{zxwutsrqqppooonnmlkjhfecbbaaabcdfghijkllmnoqsux{~~}{zxwvuttsssssttuvwxyz|}~~}|{zxwvutsrqponmlkkjiihgggfffffgghhijkmnprtvxz|~~}|{zyxwvuutssssssssttuvwxy{|}}|zywvussrqqpppoonmlkjhgedcbaaabcdefhijkklmnnpqtvy|~|zyxwvuttssssttuvvwyz{|~~}{zyxwvusrqponnmlkjiihhggfffffggghijklnoqsuwy{}~}|zyxxwvuttsssssssstuvvxyz{}~}{zxwutsrrqqppoonnmlkihfedbbaaabcdfghjkklmmnoqsux{~~}{zywvuuttsssttuuvwxyz|}~~}|{zywvutsrqponmlkjjihhgggfffffgghiijlmnprtvxz|~}|{zyxwvvuttssssssstuuvwxy{|~}|zywvutsrrqqppoonmlkihgedcbaaabcdeghijkllmnoprtvy|~}{zywvuuttsssttuuvwxy{|}~}|zyxwvusrqponmllkjiihgggfffffgghhijklnoqstvy{}~}|{zyxwvuutttssssttuuvwxyz|}~~}{yxwutssrqqppponmlkjigfdcbbaabbcefghjkklmmnoqsuwz}~|{yxwvuutttttttuvwxyz{|~}|{zyxvutsrqponmlkjjihhggffffffgghijklmnprtuwy|~~}{zyxxwvuutttsssttuuvwxyz{|~~|zywvutsrrqqppoonmlkihgedcbaabbcdeghijklmmnoprtvy|}|zyxwvutttttttuvvwxy{|}~~}|zyxwvusrqponmlkkjiihgggfffffgghhijklnoqstvxz}~}|{zyxwwvuutttttttuuvwxyz{|}~|{yxwvutsrrqqpponmlkjhgfdcbbbbbcdefgijkklmnnoqsuwz}}|zyxwvutttttttuvvwxy{|}~~|{zyxvutsrqponmlkjiihhggffffffgghijklmnprsuwy{}~}|{zyxwvvuuttttttuuvvwxyz{}~}|zyxvuttsrrqqpoonmljihfedcbbabbcdeghijklmmnoprsvx{~~}{zywvvuutttttuuvwxyz{|~~}|{yxwvusrqponmlkkjihhggffffffgghhijklnoqstvxz|~}|{zyxxwvvuutttttuuuvwxyz{|}~~}{zxwvutssrqqpponmlkjigfdcbbbbbcdefgijkllmnopqrtwz|}|{yxwvuutttttuuvwwxy{|}~~}{zyxwutsrqponmlkjiihgggffffffgghijklmnprsuwy{}~}|{zyxwwvvuuuttuuuvvwxyz{|}~}|zyxwvutssrrqpponmljigfedcbbbbccefghijklmmnoprsvx{~}|{yxwvvuuttttuuvwxyz{|}~~}|{zxwvutrqponmlkjjihhggffffffgghhijklnoqrtvxz|~~}|{zyxwwvvuuuuuuuuvwwxyz{|~~}{zywvuutsrrqqponmlkjhgedcbbbbbcdefhijkllmnopqrtwy|~}{zyxwvuuutttuuvvwxyz{|~~}{zyxwutsrqponmlkjiihggfffffffgghijklmnpqsuwy{}~}|{zyyxwvvuuuuuuuuvvwxyz{|}~~|{yxwvutssrrqpponmljihfedcbbbbccdfghijklmmnoprsuxz}~|{zyxwvuuuttuuuvwwxyz{|~~}|{zxwvutrqponmlkjjihhggffffffgghhijklnoqrtvxz|~~}|{zyxxwvvvuuuuuvvwwxyz{|}~~}{zyxwvuttsrrqponmlkihgedcbbbbbcdefhijkllmnopqrtvy|}|{zyxwvuuuuuuuvvwxyz{|}~~}|zyxwutsrqpommlkjihhggfffffffgghijklmnpqsuwyz|~~}|{zyxxwvvvvvvvvvwwxyyz{|}~~|{zyxwvuttsrqqponmlkihgfedccccdeffhijkllmnopqrtvxz}~}|{zyxxwwvvvvvwwxxyz{|}~~}|{yxwvutsrqponmlkkjiihhhgggghhhijjklmopqsuvxz|}~}}|{zzyxxxwwwwwxxxyyz{{|}~}|{zyxwvvutsrrqponmlkkjihggfffgghhijklmmnopqrsuvxz|~~}|{zyyxxxxxxxxyyzz{|}}~~}|{zyxwvutsrqponnmllkjjjiiiiiijjjkllmnoqrsuvxy{}~~}}|{{zzyyyyyyyyyzz{{|}}~~}|{zzyxwvuutsrrqponmllkjjiiiiiijjkklmnnopqrstuwxz|}~}}|{{zzzyyyyyyzzz{{|}}~~}|{zyyxwvutsrqqpoonmmlllkkkkkkkllmmnnopqrtuvxyz|}~~}||{{{zzzzzzzzz{{||}}~~~}|{zzyxwvvutssrqqponnmmllkkkkklllmmnoopqrstuvwxz{}~~~}||{{{zzzzzzz{{{||}}~~}||{zyxwwvutssrqqpoonnnmmmmmmmmmmnnoppqrstuvxyz{}~~~}}||{{{{{{{{{{|||}}~~~~}|{{zyxxwvuutssrqqpoonnmmmmmmmmnnooppqrrstuvwxz{|~~~}}|||{{{{{{{{|||}}}~~~~}|{{zyxxwvuutssrrqqppoooonnnnnoooppqqrstuvwxyz{|~~~}}}||||{{{{||||}}}~~~~}}|{zzyxxwwvuutssrrqqppooooooooooppqqrsstuvwxyz{|}~~~~}}|||||||||||}}}~~~~~}}|{zzyxxwvvuutssrrqqqppppppppppqqqrrsttuvwxyz{|}~~~}}}}||||||||}}}}~~~~~}||{{zyyxwwvvuutssrrrqqqpppppppqqqrrsstuuvwxyz{|}~~~~}}}}|||||}}}}}~~~~~}||{{zyyxwwvvuuttssrrrrqqqqqqqqrrrssttuvvwxyz{|}~~~~}}}}}}}}}}}}}~~~~~~}}||{{zzyxxwwvvuuttsssrrrrrrrrrrrrssttuuvwwxyz{|}~~~~~}}}}}}}}}}}~~~~~~}}||{zzyyxxwwvvuutttssssssrrrsssssttuuvvwxxyz{||}~~~~}}}}}}}}}}}~~~~~~}}||{{zzyyxxwwvvuuutttssssssssssstttuuvvwxxyz{||}~~~~~~}}}}}}}~~~~~~~~}}||{{zzyyxxwwvvvuuuttttttsttttttuuuvvwwxyyz{||}~~~~~~~}}}}~~~~~~~~~~}}||{{zzyyyxxwwvvvuuuuttttttttttuuuvvvwwxyyz{{|}~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxxwwwvvvuuuuuuuuuuuuuuvvvwwxxyyz{{|}~~~~~~~~~~~~~~~~~~~}}}||{{zzzyyxxxwwwvvvvuuuuuuuuuuuvvvwwwxxyzz{{|}}~~~~~~~~~~~~~~~~~}}|||{{zzzyyxxxwwwwvvvvvvvuuvvvvvvwwwxxyyzz{{|}}~~~~~~~~~~~~~~~~}}}||{{{zzzyyxxxxwwwwvvvvvvvvvvvvwwwxxxyyzz{{|}}~~~~~~~~~~~~~~~}}}|||{{{zzzyyyxxxwwwwwwwvvvvwwwwwwxxxyyzzz{||}}~~~~~~~~~~~~~~}}}||{{{zzzyyyyxxxxwwwwwwwwwwwwwwxxxyyyzz{{||}}~~~~~~~~~~~}}}|||{{{zzzyyyyxxxxxwwwwwwwwwwxxxxxyyyzz{{||}}~~~~~~}}}|||{{{zzzzyyyyxxxxxxxxwwxxxxxxxyyyzzz{{||}}~~~~~~}}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxyyyyyzzz{{||}}~~~~~}}}}|||{{{{zzzzyyyyyyxxxxxxxxxxyyyyyzzz{{{||}}~~~~~~~}}}}|||{{{{zzzzzyyyyyyyyxxxyyyyyyyzzzz{{{||}}~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~~}}}}||||{{{{{zzzzzzyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~~}}}}|||||{{{{{zzzzzzzzzyzyzyz|zy~}|{zyz~{z~||~||{}~v}~|{|~|{yy~z{x~z||wyv~{zw{|}{}~qruztzwurvvuw}zyzzx{||~v}||z|{z|z|{}v||~|y}y}zz}|v~}{xxw~{zu~}{||}y|rqvztzyxrutt{zzzzyy}~}{v~|~{zz}y|z{w|}~w|w}|~y{~~u~~{xxw|zs~y{}|~v}zrtu|t{zzqurtzzzzyw|{z|w||v~|y|}~{~}~x}~|xzw|z|}x|wy|~wzx}{}{sw|}|}{vyyrx~t}v||{pupy~z{{zyt~{xyyyy~t}z~}y}z~z~}zyzwyzz|w}t{}~x|z}{}{r}u{~~}{|s~wyuyt}v}}puoz}z{z{yq|yvxzyyt|{}x}zz}{}}|xzvzwy{~w{wz~}{}}{}{{r}q{~~yp|vwxxu}u}ruqvz{{{{rv|tw~v|}s~{}{x}|z{}{~w|u}szw{z~{|~~}x{wlwzuym~x|xj|}}yxww~vudrxw{sh|~|vt{t~zw~}y{yq}wzu{z}~u||{x{yyysv{{{xz|ut|xx}qoxym~zs~muo~uyrsq{}z~rs~zy~||y|z}y{}yvsy{}{us|t||~||~tu{}z{yyv|yx~}{|{uu~wtz~uyxusw{{pxwmv}w~yy~t{zu|ypz{}uuy}~w{}{|zxx|zw~|s{~t~z~s~zyw|{vwtwssv|x{{xzsou~yw~tv{|vz~utvtt}{|vvv~rz~y~vyz{~~~|yz{}vw|~~r~}ztt{w{|}~sxsx|xrtvz}wo}zt{{|i{|||vsxxrjtv~|~{|}z}|}wv|}{yv~}yzzt{xu~kz}~{{tty}{}z|n~zw~t{yzsxtyoy|pz{yt|{muy~ry}{wv}t~ww}~y|u~}z|}|v~{y|xww}}~yp}x}xnvsxyvwyv}yyys}rtzy|{syt{v{w}wqwzywyww|vuvt{~tqzqvzuxv~q|wx}x}ywx}y~xvxouxt}}~us{x}pwyuqtu}{|tv}zzxyqv|up{nh}wpty}{st}}||svz|}mqzw~~|yltyuoy|x{y}qxz~}{qjy~|}q}oyw}yoqoz{{qmz}}}o|r{{sz~wtuzwoz~ukz{{vx{v|qwi}tz{~~~vyn{l|tzqu~||w|~t|}w{~u}}r}{qq|y|v{ws{tzy}}~yozrusou{}sypz}~|rzs|v}|zv{ttu~xu~ru~u{}~z~}oy}}ylsqyz|twl{xn{}~z|wxl{t~zysr|q~{|~~|x~~~z|u|zt|owxqrzyzyp~~~|zwz~~{x}{z}~zzpr{zyu}|mvtyrvy~uy{|zsuty}zyxw~~{x|uw}~~{}ws~{|}zt{}}qx~}w}~ru}{||v|||vyy~y~tz{v{su|z{~t}w|~z}~{{}{ywu}{}z|smx|~zyv~{{yx}y|{|{vy~xelhn|}x}xhbd`Lk[asdk~|w~vtvls}xyijin}qvsw~{rp{vs^p{zxrdyn|w|x{}{y}hv|nsxyuqwsjilrxlx}vkvsdihfvskyjy~{{iaz}vldifx{l}uovozqlfWovu}fHV[[m_[ttd|rq}|ydefe]Vafntoglqqv~{z}sxm]qv|~{i`hjr~njprfjbi}yiXaPh~}wzagicascuxfm{`juiilhnjnnq}rmgdnZgwzuy}uv|un^_[\kmu{pziphfwvw~~oXVDP^^qehdjh_ssmdbqhluo~}tilibo^\na[nnozyxpreluxo{yvz|fpnm}vk{phl\k}z|o{pox{oj[]lovwyfsu{esm\jccjcdu^cox~uw}qmzluhimu}~~}}zwrudcj\oslzvs|mtvdz~~}}|y|n_c_tr}{u{|~~rymygcqxu{vzwv|kuxo}y~wvwjpk^ir`pgjn~{zor~uqozisyov|{z{~lnej|q~rjZdkjgZXQUWOT^J\TN]`gV`sllywpx{qrhpt|v{|{~tyvvy~z|upvolhsg}vox|{vrjYSMT\\kyx|yog_S_bc`icxlcgeh[ghgo}vm}|z|ty{v|qyqlz}y~p}yoxw{~|ahbh`\mr~xsrfompmmg\b^a]mYgi`kdgY^g`_qj\__ojtssyvq}{u}y~~uz|}oodorg|y|z|wxgjmrs`\V`^`]k^lthwpmY^kdhurdkjupzwrurmnx^ebcisnnxonlpmrlyiwuywq{ripvzsqgtquq{{~~u{vr||yspcmrnjglc|uz{yrk|wyy{~|||w}svjv~}psumksrdpjqckxz}w{xlqo{{tiisospxg|y{~twt{vqwwwhdcdQVZb`\szxqo|rxr~vw}~qr~rt||{~y|{x~~t|ux|yyu~{wv}qyrc_joacdqcmz||uzzkidmm_Z]aX^YaR^bamibUah]cpneffilzx{{~{y}x}}xmmuhcjqvt~zqmmreYUgchcfe_qfloiY\fbctzlommnswswpnexmheaksmgrj__nnlsttfy{~}||s}upq|vn|{xzw~yzwr}|s}~y~tkuuuumxex{~wq}{r|}xvs{y~ztwpt|mvrecpvkpqvjtw~}yytx|rnistpfsvktnym|~yy~z|rzw}uw|vipo]SZ`Z`erhv{snzz|wxm|y|y{xzt}}zyv{|v{~|{|su{sdmn]Wbjchjoev|w~xqkrmb]ggbf[dYfgfnj`_nmagrlmmhnsys}zy}z~uuq{}xx{jgolfkpplzswpgdlflljrhsnppj`ake]ktprmmr|wqvqthsnkkfpqggqk_anmnutlnyt~z|vt{ysuyyz{w}{{yqu{z{|w{}vx{ts{zwqzwv}zsw}y|~~{{{rtyqfjtqsutgoss|}{zxortomvwmvlspr{zzw~|}{xzwqyrwwu{vilreZ_d^]`bZmv{x~y|zrz~tv~w~ypyy}{z}}y{|yx|~z{|pekoc\cifilh\nrt~}tvuokspfqdhbahhkjcalpedoonnlmr{pws{}x~}}v{yqw}z~}r~|}tiimjlnmds}}tostiuotvpvuwsjfmnfdlppsqtzsxvsznvsrqopjdenjadmmmqsioys{~wuzwv{y}zw{y}onwzx{{sw~zvx}}}ytyuw}{~{w~|}sowylflonpqjfvrz|{~z~wprropzunyqxrqx{}xy}}}}~|rznsvmvsuuxxmegk`UW][^cd`qz}{zw~|v{su~}rs|{~~}~zx|}|wu~wrxvwtupfbil_Zafehjgfxxxxxtsxslukqohlmmjeirskirvvusvzyp|tw~t|~vrw~wmpwx{~|w~{zyppuob`gilpro~|{wty|ryzxvuvvslgmtpgmvxzxy{uw{pyonrppnnh`bklcagkmpqmty~~yzyx}{|{|~}}|tqwzpkqwxz|{}z{||yu{xx|xv}w~~~}xnlrvkchnnookn}w}{x{wqrrrv|tt|r{ztvx{yx~|y}yxxpkuipqhoruttoc^cf[RTZ^cggmz|zx{{rpv}vpty{~|}}~|x}yw~wt~rxvlrttrpkcafjb\_dgjkio~x}|zy}vv{pwvnmmnkipwvnmtxzxxz{sr|r{zry|~}wppv{smptvwwt|zzs~ztz}~wonrqe^aehjllzv~{|{zwrpuxtkmu{~}~v}|r|rmrstqogadlnebfknonm{~z|||~z~}}zz||z|{z{zz~}{rmpwtlkortusu}{|{z}}w|}y{{vx}~|xqosxskikmmlilytwz~zwww{xu~ux~wvvwwx}}y~}zrltjlrfhnrsrngegjcYWYZ\^_gxv}{w}}~}wonsxslmpsuusz|{|zz{v{}vu~rvznosusqkdchmha`beggflyt{}y|wsssqpuz{tosy|||}{us~tv}rsx{|zvposxtmlnpqpns{}xt|srzppuz{zunmormc__acdem}|~|z|~wpsy}}y}ywrtwvsngdgmmfdfiklko|{y{|{zzzy|yz~w~u{suxyxtnkmstmijlnopr~~}|{|zx~~w}v~~tvz}|ysnotvqjijkkkktzs|z}{z{wzw}zwwxxz}x{~|ztkjrgipfglpqpkecfhc[XY[^`cm|zxz~xy{{xtmkouuolmprstx~~{zyxzxuy}~|wquyntukknpomgbcilhcbdgikmx{~~xwvvv{~xtv{~~{uv~uu}uruxxvrmmqvtnklnopqx}}~~~~}xpmvpkuojnrtroifhkib]^aeimv~|}|uuzzw~{ppssqmgdglnjggikmot}}|zyyy|xvz|wrxzpvxnmprqnigjorniiloqsx}||~|y|{v|uz}sruwwtoklqtqkijllmpy~w}~~x}z~{zz{}ytuxyxurlfjndiohfjmljeaadfb\Z\`dho|}y|~ytvwvrnjkptrmkmprtx|yxxz~xtvz|||ytotwlpulhjlkiebeimkgegikms}}}zzz|yvy}|wt{}sx|spsutrnlnsurmklmnot}y|}}}~|xz|}{ytnjppgnqiimppmhefije_^_bfks~xwz}~y~trsrplhgjoplhhikmpx~}|~zxxz}{vux|}|{vqszsowrklnomjgglppliijlnr{~|||x|xwyssuuspmnrutokjjklow|uy}|y|{{}{z{}|wvxzyvrlgkoefnhdfijigddgif_[Z\_biu|x{|yxywtollpsqmjjklnt}z|{{}yuuxz{zwrotwnouniijjhedfjmlheefhjpy}w~~yz}}yv{vv}wqqssqnlmqtsnkjjklpx{uy~}~~~ywyzywsmimphgpmhhjlkhffikhc_]^`dkv}z{z|~}}xuttqmjilpplhghjlpx}yz}}{z{~{vtvxzzxtpqxslstmiijjhffjnpnjiikmqy~||}|xy~uz~wrqrrpmmosurnkjklntzyt||}{|}}||ytsttsqlgejlcemidegigeccfhfa]]^afny{}{}}zutsqnkknrspmllnpu|~~|{{}~{vrsuvvtqnntsjmrlgfggfddgknmjiikmqx|{z|~~{wv|~vu|yrpppomlnqttqnmmnpu|~x|||~~{urrsrplheinhdmnhfghhfddfhhdaacglt~|z|}{ztrqoliiloqolkkmpu|~}}~|{{}~~zurrtuuspmourjnsmhgggfefinqpnmmorv}||~}zwy~}tw|wqooonllnrtsomlmnrw|zv~~|}}}}~{upnnnmjfcekjcfnlgeffdbabefecabejqz}|~~wsrqnlkmpsrommoqu{}~~||}~{vrqrttrolnsrjkqmheeeeddhloomllnpu|~||}~~|ywy~|tv{wqoonmllortspnmnosy}zw~~~~{uqooomjgdglichnkgfggedceghfcbcfkr{||~~~}}vsqomklnqrpmllnqv|{|}}}}~|xtrrssrpmnrtmjpqkgfffeegkopnllmosx~|~~~{yzwv|{uqppnmmorutronmoqvzyty{~}|}xsponmkgdejjcckkgegkmpsw|{|zz}||}}|xvwvtrsty|wwymafpkouy~}zvv}{z}xrlifed`\Z[_^VW_`]^clu}|fR^cSXdqx{|xtsvsjhnngddefhkpw|}xnb]g|ynq{}|{y}zv{~|{{zxustxxqry{xvvwyz|zsja[\dw}wtrssux}}y}|y~|z{|~~~~yvtronoqttsrrsuxz{vmjqv{~{z{}~{oiluxrrvskkopolklmnmjgeefhiiijotrlpvtpnnnnnoqtvvtrrrtw|~zw|{uuvutstv{}|z|wsqqqponmqwxsv~zusw}ywurmhb__`aaabekojhnqnjhggggiloqponoptx}{}~}}}|}}|yurqrssrpptxvpsyyustuwx{zwtrx|tmhfdb`][\a`YX^_ZWVWWXZ]aeggffhjnswvrw~z{|tnpsomv~vqnlkifeflnihosqnmnnnnoruwwwx{usvxz~}wtuungikf_[YWUTUWZ[[ZZZ]`flnlmv|yy~|z|{vpmklosvz~|yy{unptrmkjkklnquxyxxy{~|wrlgcbgpz~tmhd`]\\^^]ZXWWY\`b_]djhfinruvvvtuw{}}~~}|xrjc^[YXY[aly~|}wtpmjijlmllkmptzyuqlgc`dkopz~zuoifccdghdaflifimqsttsrrtx|~}yy{z~~|xutttrplijkf]^cdcfltz~}{zz}~ynkkd[VTUY`jv{twxqkkmnnlkhedfilnnoppnklsuppvzyxxxyzyvqnmmmlkijnrojnsqkgda^[Y[^bfkqy{vpjfca^ZWWZaly|yyzzxwutqlhkokfinnmlmnpqpnkklmnonmouvqouwspooooopsutqmjhghlprr|}wrnjhge_X[bdemz|uqsunimpnljiijifb_]]^^]\\_efbdlnlkklllmnpqqomlmptx|yux|wpnqtw|{}xqoponlkjkpx|xutrplgcaaaa`_^aff`ahheccdegilpsutsstvy~~{{xxz}~~~}|~~{upmlljihhkmpv|tnkhea^[\``ZZac`]]^^^^`beedcdfiouz{y}~~}vrv|{}~}~~|tmkmgacimqw~}}|unpqlgdbaa`begiiggghkoturrz~{z~zxzzwttuy~~zwvvuuvy|~}{zzz||wxwrmhecba`_`elt{}yurnkjjigda`acgmqpmqwvqqtwy{}~~{tnjjlorw|~}~~|zxwxz}~~~|yuohb_\[ZYY\dnsu}zxwxzzvrvzwsux{|}|{zy{~|xutsqnkhillghqvwy}}|}~y{{|}wrnliea]\^^WTY]\\_djpw{{||}}|{{|~zwz|}zyzz{zyy}{uxzuokihghlrx~|z{}xpprmfa^\YXX[_dhlqx|ww||wvz}|{z{|}}{xvvwxxwvvy}zuvzytpomljijkkifedfjpx~|{||||{{~}~|xurokiggeb_[ZZ\`fklnx~~{vsrrstttvz{|~{yxwvvwxywtqnmlmnnjfkqpou}~~~~}~}ywutstsmhjlhdfjnsw}~{wsrrrrqoorvtnqvuqoooopqtwxywuttuwyyuqtwqmmooonmllnsz}xuttttsstx}|y}~}}|||}}|}~ztssrpoljijmqvy}~|zxy}{w|{wutsrrsuvwvsrrrtwzzvw}~zy|}zwvvxxwwvvuttz~}{|{y}zzzz{|~{zzzywtrplgejommu~}zusrqpoqsttrpoopruwtqtyxtux{|}|{yxy{}~~~}{xsqtuolorsstw{||~{zzyxwxz{zyxxy|xtuunknpponoqtwxy{~{xutstwxtquzwtvz|~}||}}|{xz|zwtsrqpnkijmqux{}~}yvsqpnje`^_`acehpy}xy~zvuxz{{zxwvwz}|{~{~~|{zzxtojgedba_^afigktz|}|vqnlifcaaefbahmmnrw|~~}z}z|~|xvuuutrpprsnilnjgefhjmrx|{zywurpqsnggif`\ZYYY[_ejnquz~}}{~||||{xtqoopponnquupqvwromkigeeeffeegkpx~~}|{|}z}{urpmjhffeda^\[\_djnot}ywwwxxwvvy}zvx|{wuttsssuwwvsqonnoqrpntzzz~~~}|}{z~~zvtsrpopqqoliecbbbc_Z\ba_agnty~{vtssrrqpswzvuz}zwuutrrrtuutsrstvy|zuswunklnpruwz}~~~~~}}}~}{wtrpppqpjgjkebceefeedeglry~}z|~zxwwwwy{~}|{{|~}z~|yy{|{zxurqrtvxy{}~}{|{yxxxxy{}~}{yxwwy{{vruxsoopqpnlieddegghhijjjmv||~|zxvuvxyzyxxz|~zz|}~~~}}~}zwsnmrust|~|zzz{~~{x{|xy|}}}{yvttuvutrqnjedghbafiklnsx}}xw{ztrtutrqqrtuuuvy}}{{{}{y}|y{}~|zyz|}~}}|zvrqtsljllifcba`_][Z\`dimrx|}{}~{vqmkkkklmpw}}~~}}|~~}z||vwzywtsrqpmieba``_^]_dgdfntux|~}zvtssrpnlmpoihmnljknpsw|~~|~}{yxwvrnigedcb`^`cc^]bc_]]^^`bflquy}|{{zxwvx{zvvzzvsrqonnoqsssrsux}~~zxvvvutrprtrlkomiecba`_acddccceintz{}~~~~}{z|~yx||xtsrqpopqrqnkjiijmonlpwxw{~{xusrssrqqswxsswxtpnmkhgfffeb`^^_adgfcekkhjouy~~}~~{xusrqrrpkjnnjiloqtuwxz}~~~~}|z{~{x{}{wuutsssuvvurpnmmmomheijebdfghiiijmrx~}||{{{|~~|zyxxy{{wsvxtpprssrpnllnqtwy|~~}}|{zy|{|}zxwvtssuuusrqqsuwyvrruqkhiihggeddehkmoopppppw~}}~zy}~ywy{|{{yvtstuvvvuutqoqwxux~~}|||~~|zzz{}}zvy|xttvvvuspmkklmmlkjhfbafheejortw{~}}~|{{|~~}|zvsuwsopsrqpprtuvvvwz}~}~~|||}}|~xuvxxxxxwvwxz{zxusojffjhceikkjklmoonmnquy}{{~xwzzxvutttsqnmnoqstvy~~}{yz|}}|{zyvrqtsmknomjihggfc`^^^`abbejprrw}|zxwwurnkiiiiihilqqnqwxwwxz{}{wuxzutx{{yxxwvtqlhedba`^^`ddacikjjmpsvz~{zyyxwutuwuppsromlmmnptx|~}}{y|}|zyxxxwtqnmllkigfgifabec_\\[[[]`cfhijmpuz}zyzzzyxy||xz}{vsqomkjklmlkkmorv{}||~zwutsrpoortpnqsqmkjihgfghgdb_^^_adecelpory~||{zzz|}|zwutstuvsoputqrvy|~|{zzyxvuvyxsruuqnmlkjijklkhfdbbbcda]_ba^^begikmoqv|~}}~~}|zyyz|~|xy{wqppqqppppqty}~|~{{}{zzyxxxyyxuqomllllhdehd``abcba`_^`cfilnqsuvy||}~}|zxusstvvvvvutrrw{yy~|{zyxxxzzzxusrrsttqmnrokjlmmlkhfeefghhhhhfdchkiimruvy|~}|}|ytqrtpmpuwxy{~~|zzz{xtsvuqoqrrrqomkkkmnmmlkifcdheabfgffgiknopqsvz~zz}|vuxxvusssssqonoqsuvwy~~{}|xyz{{zywuttvwwwvutqmlooigiigecbaa`^\ZZ\^`behmuyx}}}yurpoonllmrussy~~}{yyy{||{{zyvrrvtooqrpnmmllkhecbbbba``cffcflmmnqtw{|ywvvutrpqsrnmpqnllmnoquy|}z|~yuvwvtqponmkgdbbbbbaabefcadec`^^^^_bfjmpsvz~}{zy{}zwy|zwuttsrstuvutsstux|}||~}}{{{{ywtrppponlkmolghkiecbbaaaceffedefhlpsstz~~{ywvuttuvvurponnprsposwvux|~~}{yvsrrssrqqsvuppsqmigedbabcddcbabceghebehfdeimqux||ywvvvvrnprollopqrrrstw{~|{}|xx{yvsrqppopqrpnljiiijjfcfhdabdeffffffimqux{~}z|}yvwxxxwvtrqsuwxyyz{zy{}zxvtsrsttsrpppqstsolnmhddeeeedcbcehjjjjjihfinpot{}~~}{ywvwxyxxwwurprvtqtxzz{}~|zzz{{xttwuqpqqqpomjhhhijihhgeb`ceb`dghhjknqtvwxz~{y{|wtuvusqqqqqponoqtvxz}~}wvvvutsrqpqsuuutrplgeggcadfggghijkjhffgijlmotz}}}}{{zzywtrqqrrrqrtyywy~}{yyyzzyxwvspnpqmjlmljhhgggeb`_______afgdflnnoqtx{~}{xussssrqqruvrruvtrqqrrsvy|~~yvwxtprtutsstttrnkigfeca__bc_^cedcdegiknrvxz{|~}|~{wy{xusrrqqrtvwwwwwy{~|{}}{yxwwvuromlkkjigfgifbcfda_^^]]^`bdddddfhlpsstz{ywusrrsssrqqqruwyxuw{zwx{~~{xvusrommopmjmomjiihhgghihgdba`abdcaafhfgkosvy{}~|zyxyyyvsuwursuwxyyyyz|~}|{zxvwyxsrttpmlkjiiijjjhfdcccdec_adc`acfgijjklosx{}{}{usstttttsstwz|}}}~}|{}|~~|zyyxwwwxwuromkkkkiebeea__aaaa`_^^`beghjlnnnqx{z}~|zwvvwxxwwvvtrrwxuvz}~~|{{{||{yvusssttpmoqnjklllkjhfeeghhhhggeccfheeilmnpruy{}~~|ytruurqtwxxyz|}~~}||}~}}}|xtuwsoopppomkihhijjiihgebbeebadffeefhjklklnqtwy{~~{y{{zxwvvvutrppqrsstux||z}~~~~}{ywuuvwvvtsrokjlkfdffeca`aa`_]\]_abdeglqqquz{{{}{xwutsqoprtrptxxwxz|}~|{||}|{zyxtrsurnoqqomlllljhedccccbabefcbfhgggikmpsx|~}}{yxxzyusvvsqpppppruwxxxxz{~~{xyyxusqppomjgfffffedfihddgfca_^^]^_bdfghjlpty}~~~}}{zzyyyyz{zxvuttuwxvtw{zxz}~{xvttsrqonoqokjmlifeddccdeffeccccegihgjoooquy|~~~~~|ywvvvwxurtwvstvyz{|||}~|zzzzyxwxzzvtvvrnljhfeefffedccdeghfcdfda`bdeghjkmqv{}ywyxtrssssrqpoprtvxy{|}||}}ywvutssstsrpnlkkklkgehhdbcdeeedcbbdfiklnoqqqtz}|~}{yxxyzzzzyywuuyzwwz}~~~}{yxxxyxwuttttuvsnnolgffffeedccceghihhgfcbdhgfjosux{~|{{|||{{zxvstwvssvxxwxy{}}}}}~}}}}yvwxuqqqqqpnlihhhiihhgfdb`cea`cefffgilmnnoqtwz|~}}~{wwxwutsssssqqqrtvxyz}zxwxwwvutrrsttsrpnlhddfeabeffffghihgeddefghikottuz~~}}|zwuuuuutttvyxvx||{{|~|{z{{zyxwuronpokjkljihgggfdb`_``````bfecfjkklnprux|}{{{{zzyxy{zvvxwtrqqpqrux{}~}ywxxtrtvutssssrpligfedb`_`cb_`cdcbcdfgilorsttvwz}}}}zxwvvuuvxxxwwvwxz|~}|~~|{zyywurpnnmlkihijhdegfca```_`acdddddegilonosxxy|}|zyxyyzyxwwwxyzzwuwxusuwy{|}~~|zywtrqrrolnpnkjjiihijjjigedccded``debbehjlmopqtx|~|yy{yvuvwxxwvuuvx{}~~~~zxzzvsrqponnoonljhggghhfcdfebbdefggfffhknprtvz|~|{{z|}~~~~}{ywtrrpppoljjfbbefdfkqw}||wrnlhb[ZYUQPQRSTTUVWZ]`bdefgfddgifegiihiilnopqrsvy|z~|zxvtrporussw{}~}~}yvtssrqrtuvuvwy|wnhen~}qjgghilosuvwwwusqrrnklmljiiijkkkkmptx|zohhpyqjebaaa``__`aabbbdghffikkklmnpqtvyz{zyyz{}~}zz}|xwwwwvtrpmlllmlkkkigfgjigilmmlkigc^YVW]hs}{xz}~~xurlea__ckvzxwqmkjihfca^]\\]\\[ZYWTSVVSRUVWVVWYZ[[[[\^abdefimnmnrsrrstvxz~~~~~zuoid`^^`hu}xrmf`[XUTRPMLMNLIJMMKJKLNPRUY]_acehlpuxyz}wsqrv{|xutsrstvwxxwxxy{~~}zsmje^VOKHFHNWcoy~zzwrooooppppqrtwyyzzyxvuvyywy}}|{zzwqmmkgehmt|~~}{zyzzzyyy{~}z|~~~}yvtqory}zyyvqpqolihgfffghhhgfffgiklkjmppoqsvwxyyyz|~~{vromlmosx}xtqnllmmmlkkklmnnliklkhilnprtuwy}{wsppquy|zvsokhdbaaaaaaa`_^_bdbcfikklnprttttuvxyzzz|~|||{zzzyyz{{{ywvutttsojjic^\[[\^afkqx~}zwuxxvvy|}~}xtnhb__][]dmu}{uttplifdcaaacccbaabcdeebacda_abdeffgghkmnopppomkloomnruvwxz|}~|zxwvtsqprw}~zwspnligfgjpwzupmkigec`^\XVWXUSTVWVVWXZ[\\\^`cegiknsvuw||{{~~|zzzzywvwxyz{{|~|wqkeb_XSSSTUX^gox~}zustspnmmmnoprttttttuwyzywy|{z{}}{yxvspmllkhinsvz~|~}zwusqomlkjhebaacflsy~~}yvvvusrqqqqponnopqrrrtwwuuwxvtsssttvxz{{||~}{{{yxvsqopqtw{~}|ywuttsrpooqqonqrqqqstvwz}ywvtrppqty}|ywuttrpnljjijkkhhkljjlnpqrssstvx{|}~~}~~~~}zxwvuspnkjifaabbbcglquz~}||{yvxzxwx{|~~{ywurokhedcdffglty}|||xttvutsstttsrponnmlkjjlmkjlnnmmnnopqsuvutsssstutqprrommnmlkifdccefhkoty~~{xxwrnnmjhfefgilosy|zxwuspnkihhhhfccfebcefgggggghjmnpqrssrruxxwy}~|||ywwy|~~}{zxwuqmieb`_^][[_dfjpx~|xwwvrqrsrqpqqrrrqqrstuvwx{~~|}zwusrqpoopqstx~|zwtpmmkfcca_\ZYYYZ[\_djry}zzz{{{{{{{|~~|zy{|yx{}~~~}||{zywuuvtpoqpmllmnqtz~}{ywvuvwxxxwwvttwxvvxz{{{{}~~~~}~}zxvtssrnlnppquz~}{yvtsrsrqqqrtsqruutttuvwxz|~~~~~}{xvutrqomkigfgkmnqw|~}|zz{|zwxyxvuuvvwy|}||{xvtrqomjhffghjmpu|}~}zxxxxwvutssstuvvvvstv{ywvnjkjhhjlmmnqrsy~|oggqzuf]\agnty||yxsonllkjhgfghiloty~~{xuqmkie_[[YVTSSTVX\afkrw|}wk^hzurrw~~qluylfgkoswz~~{yxxyz{{yupmkjkmpsuw{}u{xsvzvrvtljlqsrsutqonpqsvx{}~~q`SMOXgy}tkeb_^]]^_aa__^^__`a_]_aa``bdfgikmptx{~}||{x|{xvuuutqmga[WW\dlsx{wqkgdb``bfmuz}zxvsqmjgc`][\`gq}~|{zywusqomg`][XWY^dimnoppnic^[Z\_abdilllnqstuuuuvxz|~~{xvvw{|smknt}z}xpeXOHIMQX`efosrqtvvx|~{vuzv~}hdhoxvp\WUW]hvxqtxppw{vhWLMVcow|{{}wu}~}}ukfisszz~}|}}p`U[osnz}zyyzzyxvx{zlens^RPTY_cdb_ZURONOQSUUVZblru{qc]_jyzuqmie`[VSQPRV\cksy}}xrlkp}tkjuukecefeb[RKGLZiqwytja[Y]ckrx{~{yxwxy{|~ynecdekx}yxz~}}~~o]MEGP^s}pd_`]XVY]`cfhjmpsw|}rhcemsw{xrrsw{}|xsnieb`___begjmpsuvwxwurpwtibaenzyoga\ZZ[\ZXZ_a]XWXZ]`cfhjklmrx~~yurru}zrpqsvxz~zrh\TTTPQ`y|xtrrrtuwz|{tmf`^_fx}{xtojd_[XWZ_hqy~}yvutuvtqotwsty~~|zzzyvuyui`\[^fr}vplihge`XQQRLHHMSZbkrvw}~ytqqswyxtprvu~~}}~~z{wohc]XTPMMNPSU^kqquy{{zxvuw||xz}yuuvxwvtqmifb_]^`dflxzvssux|}vng`\]dpxqljihc^^bda_cjpuy{~}ytokhec^[_gjls}}{xvtrqppppruy~|vrpt}zrq||wqmiggghikmprtvxxxyyxurssnhglquurtzzuuwxxxwwy}{wsokihilligs}|yvrmg`YRMKNYgu|}{z||xtrqpnjgkz|ywuuuvvvwynfc`[VV\`er{vrnjgda^\ZXVUTTTTVY\afhfa`gnnkjmrvy{|}}}|{ywuromkklpu{|vpjedn||{}{ywusu|}ytpmkklmmq{~|{{zzzyxvtrqomkgb_dntx~~~}}}}}}}~~}|zvsqootysolhd`\YW[ds|yuroljihhhd`_debbflrx}~{{|wrnlllloy~|xuqoot~ypigp~|wrlhedccdeefedddehiigfdddefgiknnlikni``iqty~|zwuroljhhilptvy|~{urqqponmkjijlr~}|||~~|{}}{zyyy|zwuw{~{|yvrnic]XRNKIJMSZct}zwtqnjgdb`^\\[[\\]^__`acgjljimoljkosuwy{{zvqnquuty||}~|xx}}}|xsokiggggfglrssx|~~zwtqnljgda^[YWWXZ^cioty||xy{ywwz}zz|}}}|{wsokigecaajuxuroligfglu~}uppnhcdjt~~yrpqsssqnlihfeeeglt{xurolihecclyztoqspkiijloqrrqonmllkkjihgggggfdcjrvy|xsoljiiikmpu{}{zzzzywusqpqrrqngep}xwwxy|~|yxvutssstuwz||zy~}xwwvuspmifb_\XVSPPRZhy~|zywtomptsonoqrsuwy|~~|~}}~~}{yxxy{||}~|ywtqnlkklnqrpjir|xurolifca_]\\]^`acirvvw{zvvuohca```acfjotx|~~yvwzyutvxz{|}~|{zzywuromjgehs}~}zvsoljijlotz}|{zywvtrqpppponmmmkfccfd_]_bdfeb]Z]fow~zvrokheceoz~}zwutuvwxxyzzyvtvzzvrqqqrsux{}yz~|xurnkjls}}z|~|yxxyzzywutrrrrqpnmkjjhgeca^\YURS[gosw|~}|{zzyyz|~|y{~}zyz{{yxvtsqponmmnmlhcaacabit}{yxxyz|}~}{yz~yvy|zwvwyz{}}{yxwwvx|ywtqoljgeca`_^]]]^ckv}xutssrpnkhebaacehihhlswwxz|}|zxtqnljjknsx~|yvtrpnmlkjheb`befkv~||z|}ywwvutromkihhijloqsuvwxz{}|{{|{||xspopqqomkhfdcccb`\Z[^^\[]_bejr}|xwwxzzz}~|zxvtsrsux}}zvsqoooooonmmsxzxxxvuvyyvqnnpv~}xuwxuqpqrssssssttspmkmmjfcccccba_]\\\]_afo~}zyyyxwvtsrrrrrrrrrty~|zxwvutttttqmjjnpprv|}zxvusrqpooooooonpw|yuqnlkjjhfb__cecaacehkqz}{zxwvutsrqnjhhlnnmnqtvz~{xtqnkigecba`aabcdegilr|~|{zyyy{|{xuuwvronnoonmkjjjklnoooqw|}{yxyyxxxyz|}}|}|yvtrpomkihgfd`]\`dfeeeehossty}|||}~~~~~|{{{{}}zyywuspmjgd`]ZXXXYZZY[`giiknqtuuvz}{~{wuuuuuvuusqomkjhgedcbbbcdddccekswxy~}}~~zwwvrmmpqonoqsuvvutuy~{yxwvusqonljihhiihfehnssux}~}}|yvrprttpmlmnnnnljgiqz}{xuspnlkjjjjjkkjjihinv~|zxvtqnkihhikmooosy}{xz}zz}|wsqrstuutpkebbca]YXXZ\]^_^]\]_fox}zy{}}ywy{xtqpppppooopqsvx{}}|{zzzyxvvy||}~zvspmjhfedcccdfgiihfgo|}{ywusqsy}yvvy{{yy|~~~~~}{zxvtrpnmmlie_YVVVSOMNQVZ\]`gmonnqx|xwy{~~~}|zxwusqomljhhgghjlnqtx{}~}{ywvutsplihkljgghjlmnnorw}zywvvtrnifehjihilptvx}~|zxvtrqpnmmlkkjjjjjjigb^_grwvsrrstuvvwxyzyyxy{~|yvspmkigfefgijjjlqy~}{{{{zzz{{{yvqnnonjfdcb`_][ZXWVUUUVXY[]^`adhoz~}|||}~{upqvwupnosw||zwussstuwxxxy~{upmlkjjiiiijkllmmnqv~{xvuvvvvvvusqpsz~|zxwvvwxz}~}}}}|zxuspnkhfb_[XTQOLKKKLOTY`fjlmou~}zz|}zwuvwwvsommnmjfddfilosvz}~zwvwwsnjgffghiijhgfinpomnoqu{~}~|yvsqomlkkklnqty}~~}|{zxwutrqonlkihfedcba_][YY]emqrtvx{}~}{z{~}|zxvqlheeec_[Z[^bflqtx|~|zyxwwvuspnmnolfbaba^[Z[[\\\]]^^_`aaaacfmu~~|{{zzyvsqruwwwx|}{zxwutrqqqrsuvuttwz{zxxyyyxwusqommlmnooomkkloqru|~|zxwutsrsstttroljjklnsx{|}~~~xtstvvsolkihgeb`^\ZYXWWWWXZ[]`cgkrz{zzzwsonmllkjhggfghjlpswz{||}~}}}|{|~|{ywvtrpmkigfffghjlmlkkkmoponrz}}}}~~~~}|{zzzz{|~~}|||||{{yvsommmmiebaaaaa`^]\[ZYXXZajquwxxxxy{~{xurpmjgeb`^\[[\^afkptwxz|zwtromkjihhfd`]\^``^]\\\]`deda_^afmv~}}||||}}}{zy||zywvtqmiffhjjigffegkorqoopqstttttttttsrpommosz}{yxvutrqonlkihgecaaemu{~~zxyyuqmkjjihgfedcba^\YXZ]^]ZXWXY]clw}wspprsqmkjjkkkllmnpqsuwy{|}~~}}||{zyyyyxwttv|}|{{zzyxwvtrqonlkkjjjklnopqrqpos{}}zwvutsrpnligdb`^\[ZYYXXXXWUSRUY\\[[_gqx|~}zyxwvusqomjhgeddddfgjmpty}~{ywvtrpnljhgfedca^[Z\`a`__abcdefiov~~}|{{{||||{}|yvspmjhec`^\[ZZ[]_`aaacgigeeiortuvxz|~~~~}{{|{wtpnnmmmmmmllkkkkjjjmu~~||}}|yurqrqniecbba``_^^^^^______^_bgox}{ywvutsromlnpokfehmruuuvxz}~~}|{zywvutsqpnkkmtz||zxwwvvutrnkiiknnmllnpsvxz{{}{yz{zxwvwy{{zz}|zzzzvqliijjjihfca_\ZXVTRQPPPPQSUWY\^`bbcekv}yvuuuvuutrolihilmmkjknqtx{~~|zxvtsqnjea__aba___`aacglnlihhkpw~}|||}~{vsqomljhfca^\ZXWWWXYZZZYY]bfhiknswz}~|zxusqonmmlllkifddfikkjjjlpy~|{zyyyyyvqjeehjhc^\\]`cegiijihfedehmsy~~ulfehjqy|zpkhgegjmnprttstssw~~wofa`cjrxyuohefhmt{|tld^\\_djouz~}{zz~~yvsssw|}}{wrmknv~xvwz~zwuttrolifc]SICDKV`d`WOMUbmph]TRZgv{pihjnty}~|yuqonkjjjlmortuvx|~xuux~ww|~tjb\YXZZZ\^acfikmlid`\[Z\clw|xuqonry|vrqswz}~z{}|{yvrmhda^YRJDAADJQZahmsy|{vqljjms|~{rliimquxxwtojfb^\[[[]_bdhkns{{yxy{}~{xtnha][[[YWWY\_cefeefjpx{wvw|yurpmifdeinsw{~}{ywusrqppoooonmmllllkjhea\XTRQRTY`gmrvz}}{xtoljjlosx}|xspmlkklmoqsuwy{{{zyy}}zxwx{~~xrnjd\UOLJHGFFEEEEFHIKMOPPOOQTX\`elu|yvuvx{}}|{{}~{xurpoopqsvxz|~{uqmifdb_^]]]^`cfilpruwxyz~{yyz{}|yvussstuwy|}zvrmhd_[WSOLIFDCBBCEHLQV[_acfmu|xutsrokea^\ZZZZ[\^`ceilpswz}|xvtsplgc`__`behkmoppprvyzywuutssstvz~}zxvtsssuwz}|xtokgc`^[ZXWVVUUUUUUUTTTW]elopqqqpqruxyxvttvz|vqlhgfd`]YWXY\`dinrux{}zyz{|zvqliiklkhfdccccccccdddeeeeeffilry}{zyxwuspmlnprqppqrrrstvyzzxusqpponmlkjihhhiijihfefhkkigffghhiijjjiigecaaceggfdccfjpx|}}yvspnljgda]ZWSPNKJIHIJKNQTVYZZ[]dnx~yvuusojfcba`__^^^^^___^]]_cgkmmnoqtwy{|}~}{{zzyyyxvuuwy|}{yxz{{zxy}}zxvutttuvxyyxvutvxxwtrrrrrpnjgdddca]YVTSRRRQQPPONNMLKJKOV]cegghijjjkmpv}~{xvtrqppqrsstuvy|~|zxwvutroljjkjfa^^adffeedddddddfinsy}~~}||{zzxurooprsqonoprsuvvvvvvuutsqnjfcbcdedbaabccccfimonmmnprtvxyz{|}~~~~~}|{{}}|{yxwy~~ytonmlhd_\[[[[ZYWSPLJJLMMLJIIJLOQTVY\`ejpv|~zxvwyywsponnoopppqrrsuvwy{}~|{zyxwvvvwwy{}}{|~~}{z{|~}zxvvxzzywvuvxz|~{yyyxtokhfdca`^\ZXVTSRRQQQPNLJIILOQRRQQSW^gqy}~}{xvtrppoooprux{}zwtqmjhecb`^[WSPPQSSQPOPRUWYZ\]^`cgkpv|~||}~}{xvuvy}}zxx{|zwtromkjiiijlnopomjhhlpstsrrsvz~~|{zzxwvtrqonmkihffhmty|}~}zyxxxwurnjggfd`\WUSRQQPOONNNNOPQSUVXYZ[\^bis~}zyxxwvutssstvy{~}{ywx{|yvuuvvusponoprtuwyz{||||{zz{|zxxyz|||zyz|~}{yxxyz{||||||}}}~}xutsroljiiihhgfdca_^\[ZYXXXXYZ[]_behkmoqtx}|ywvvvtqmkiijkmortwz|}|{ywuqmhda```_\ZXWWXXXWWY\_`_][ZZ[]_chnswz{{{z{{}}{ywtromjhfeddddeeecbbdglnpqsw{}|zywvutsqolifdcdefedba`aabejqy}}|{zywtqmigfffeb^ZXXY[]_acdeffffeddcdfjou{}ywwxxxvttuwz}~}{zyxxwwvtrpmjhhknppnljhgfeddcddfgiknopqpnmmorux{~}{zxwwvwxxyxwtqopswzzxvuvx|~ysnjhhiiifc`^\\\\]^_`abcefghijjjijlqz}xtqonlkihfeddddefgghhgghkptxyzywvvx{~}}}}}}{zxvtqnlifdb`^]]]^_acdeda^\]adeda`bfmu{~zuqlihgfc`\YWVVXY[]^_^^`cgjlmlmnoqsuw{~|{ywtromkhfecba````abdfhjllllou}~|{zywurnlklmonmkjiiiiknpqpnkjjmqw|~}}}}{ywttuvwusqppqrsstsssrqqpoooonmljheba`aa`]ZXY\aegggghhijkklmnopqrrrrrrsuy~~|{zyyyzzzzxwwy|~ytrpomid`][[ZZZ[[\\]]\\[[\_cfhhgfffhlqv{~zyxvspnmmnnooooonnnnmmmmmnnnoprtvxz{{{yxxyyxwwwxxwvutsssssrrqponmmmmmnoqrtttrpnmpty~}yvtqomjgd`]ZWTRONMLLLMNPQRSUX[_behknpppqtx~|ywxwvtqomlkkklllmmnopqrstvxy{|}}~}zxwvvvvvvvutrolklnoonlkkklmmnnpsw|}|zyyyyyyxwutsrsuwyxvsqqrsuwxxxwutrpnljhfdca_]\[ZYXXWVVX[afiihghlpsuvvvvwxz|~{wtsrrstvxy{{{zz{~~zvqmheccdc`\XUTSSSSSSTTUVWXYZZ[\]_bejpw||{{|}{xsomnpsvxxwvuuuvwxyyzzzzzzz{|||{yvttuwxwusrrtvwyyywusqqrtuvutrrrstuwxyz{{}|z{~{tojhgffedb`^[YWTRPONMMNOQSWZ]_abbcfkqvz~}yvuuuuvvutromklmprssrrrsuxz}~}|{{zyxvtqonnpsuvuqnkkmqssqomllnquy~~~~~|{zyyyzz{{zxwwy|}zxvtsstuvvspmjgfeddccba`_^]]\ZYWWY]djnpqrtvxy{|~|zxwutsqpnlklosvxwvtux}}zxvtsrrqolhc^ZYYYXXVTSRRSUWY\]_`````acfjouy}~~~~|ywwwxz|~|ywvwxxxvtrqqrrsrqpoprttrpnmmnopqrrssttuvwxxyyyxwwwx{~}|{zzyxwutuwz|~|zyyxvsoligeb_\ZYYZYXVSQPPQSVY\_behjkllmpv}|wtqpoonnmmmllmmnpqsuwz|}~~}||||}~~|zwusqonlkjihhijlnpstuutssssqonptz~~{wtrqpponmmlkjigeb_\YXYZ[[[YXWWXY[_emtz~}zwtqnljhffeefhjmpsvxz{~}zwtromkigeb_[WUUWXXWWWXZ]_abba``adinsw{~~~}{ywusqomllkllmmmljheccehkmkifefilpsvy{}~~}|{zyz{~~}{zxwvusrpnmnqv{{wutsplgc_]\[ZYYYXYYZ[\^_```__`bfkpty|}yvwyyxtokhghjknpqstuvvwxxxxxxxxxxxxwvutstw{~{xuuuuvuspmkjijjlmnpqsuwyz{{{yvtsux}}|}}|yvsqonlkjhfda_][YWVUTSTTUWY[^`bbbbcglsz~}{yyyywuqnkigggghjkmortwz|~~~~|yxwutqmjgfeeeedcb`abdffdba```abcehlqv{~}}}|{zxvtqoljgecb``____^\[[\_cfhjjklnoqsvy|~~}||}|yxwxxwuspnmmmnnnorw|~zuqnlkifca`_``aabbbbaa`__]\\\]_bgnu}zvsrrsssqonnnnmmnoqtwyyxwvuuvvwxxxxxwvuspnnoruwvusqpooooooppqqqqpoopsuxzzzyyyz|~}{xtpmjihgeb`]\[ZYYYYYXXXXYYZ[\]^___^^_ciqx}zxvuttsrrqqpomkihhilosvxyz{||}~~|yvtrpommllllkjihfeefgijjhea__adiov|}zwsqonmkiea]ZXWXXZ[]_``___`cgjllmmnprtvxz|~|zwutrqpppppqqrrqonmnrx~|{zywuspmkkklkhd`]]^adfggedba``abdgkpv{}zwutuvutronmnoprstvwxyz{{{zxvtqpopqqqokhdbbdimqssrrqqqqqqrrrsstuuvvwwxy{~~}}}}}}|zzz|~~|wsomkjhd`]ZXXXYZZYXVTSSTVY\]^^^^_`bceghjmqx~{yxwwvvuttsrqpooooopqsvx|}|~|zyyzzz{zyxwusqomkjihhiijllmljihhjloppqrtw{|ywusqoljheca_]\ZYXWUTSSTX\`bddcdfkosuvwxz}}{zyxxxxwvvutsrqpooooopqrrsstv{}{zyxwwvvvuutrokhedefgfecbbcdfhijkkkllmpsw}}|{|||zwuttuvutttuvxz{||||zyxvtrpnlkihgfffeedb`_`aehkmoqrrrrrstvxy{|}}~~~{yxxxyyz{|||{ywwxz}~~|yvsoljiihfc_[XUTTTTTUUVVWYZ\^`acdeeeefgkou|}zxwwwwvutssstuvvwwxxxxxyyz{|||{zxvuvxz{{yxwwvvutsrqrsttrpnlkkkmoqstuuuspnmnqv{~}xusrqppnmjheb_\ZWUSRQQRSVX\_bdfgikmprrrrty~}|{ywusqppqrrqomlkkkmoqtvxyyzz||yvspopqsttsroljiijmpqqomkjihijkmptwz}~~}~~~~}|{{{}|xvtuwy{|{ywusrqponmlkihfdca`^]ZYWWZ^chkmoqruwy{{zyxwwx{|xurpooqsuwwvtrqqtx}}ytoiebbcdda\XUSSTVX[]_abcccbbaaabcfjoty}~~~|zxvuuvxz{{{zywvvvwxxxwutsstuvwxxvusstuvuspnllllmnnopqrstuuvvutsqppqsvxz{{{}}zyz}|wqlifeeeeda^[XUTSSSUVXZ]`begiiihhikpu{zvsqonnmmmmmmmnopqrssssrstvy{}}|||~~|ywtrpnlkkjklnprtuutrpnnnpqrqponoquy~~}}}~}|ywtsssttuttrpmjgdbaa``_][YXWWWXYZ\_djpuxyyzzz{{|}~~{xuspnlkjjklnqtvxz{{{|}~{xvtqolifb^\Z[\]]]\[ZZZZ[\^acegggffhjnsy~~~|{zzz{{{zzyxwvuttssssrrqonmmlllkkkkkkjhgghjmpruwxzz{{zzywvuttuwz}{zxvtsstx|~{ywurniea^]\[[[[\\\[[ZYXWXY\`cfhijklmpsy~{wsolkklmoprsstttttttttttuuvwxyz{{{{}}zwtrpoonnnnoopqrsuvxxxwurpppruwy{~}||~~|yvsqpomljigdb`^\ZYXXXXXYZZ[ZZYY[^cipvyzyxxy{~{wtrponnnnnnoprtvwyyzyyz||xtqnmlllkjigdb``abcb`^\[\\]^_acehlquz~~~}{zz{|~~~}{yvtqomjigffffeedcbbbdgjkkjhggimrvy{|{zyxwwwx{~}zwutttttssstvz~ytqpponkhecbaa```__^]]\[ZZZZZ[]`chmsx|}{{||{yuqmkjkmpsuvvvutssttvwxxyzzzzyxvtrqrtwz{{zxwwwwwwwvuspnmlmoqsuuuuuvwxxxxxxy||zzz{zxuqmjgedcccbba`_^][ZYXWWWXYZ[[\\]^aflrw{~~~~}{yvspmkjjlmopqqrsuwy{|}~~|zxwusqoljhghhiihfecccdcba___`cfinrw{~|{zzzzzyvrnjfdba``abcdeedca`_acfhjjjjknpsvy|}~|{zyxwvtsqonnopqsuy}~|yvrolkigecbaaaaa````aabbbbbbbcehmrw}}zwvuuuspnlkklnqtvxz|||{zxvutuvwwwvtroljhhjmquxyxwutsrrqqqppppppqrtuwxy{||}}~}xurqqpomjgdba_^\ZYXXXZ[[[ZYXWXY[]`cefghhhkou|~{yxwvutrqponmmmnoqsux{}~}~~}}~~|zwtroljhgfffghijjjiiijkkjhfdcejpw}|ywvutsrqpnlkhfc`\YWVWY\_abba_^_aejoruvvwxy{}~}{ywusqpnnmmnnopqrsuy}~}|{zywurnjgeddeeecbbbceghhhgecbcdgkosvz}zvsrrtuvvuttuuwxyzzzzyxwvtsrqpoooooonlifca`bglpstsqonnoprtvxyz{{zzzyyyz|~|zyxz|}~}zvtrqpnlhc_\YXWWWWWXYY[\]^_```_^^^_adgjmosx|yxxxxz}{{|ytuvtooonkmqstuvuqqstuz}ume^\\_gnt{vojc\Z[\]_acfinsx~x}{~~zz}~|rljkouz}~{wqlfa][\[\^aeimnmh`YUXbpyzqgcjyzxunkms|{pf_\^cjsz~{wrnmmotwz|}}}~zqnr{yngipy}}vmd^]_dhlnppponnnnmmmlllmmnprv}~|yvtrrtw||skilu{rkhjou{|zvspmkigeddehlqvz{{xtplhffhlrz{vttw}zutv{xpkjmrx~|ywwwy{}~xphc_]^_`abcdeeeeeca_][YWUSRPONNNQSX]dlt}{vrnkihhjmpty~}xrnkjjkloqstuvwy{}~~|xvsrqponmljihggilosvz}~~{vpjebacgnw{wvx{~zqjecdgkpstsplga[VQNLKJLMPSUX[\]]\\\^`cfilosy|xsokigfeeefghjmortvxyz{{{zywtqmkikou~~}||{|{{zxuqmhc`_`befedbaacglrx~}{zyxwuspmkklmnoonmmnprtvxyyzyyyyzyxuqmhd`^[ZXWUTTTWZ_cfhijjjklmoprtw{~|{{{{||||zxuqnmmpty|~|yuplgca_^[XTOKIIKPV]cimooonlkjiijlorvz}~{yyyyxvtqnlkkklmnpqstvxz|~~}|{zywsniebabdfhikloqtwz|~~}|{{{{|}~~~~||}}{x}{wtspoqrqppljf_XSOKKMRZckrutnf_\^fr~rkr~~qfchs|}yuqonnoqty~~wrprx~tnnszxogb`aekqw}~{yxz}}yursy{x~}}~{wuw|yrnosyzupkgc`_][YXWWWXZ\_beffaZTOPVcq|{riglw{urruz~xrlhedefijklnpsx|}||~~uqsy~vmfbabdgjlnoonlifddefilortuvusqnlkjlnrx~zusuy}sljlr{{uoieb_^]]^__`````abeilprtvxyzywsokhghjnrw|~yvwz~wqliilqw}~{z{}{vpjc^YVUUUVWXYZ[[[\[[\\]]^]]\[Z[\`gp|}{yxvtplifdcdfimquy}}|~|xtqmifcbbejpw}|vronnopqrtuwz|~~|{zz|~}}|{zyxwvvvvwxz{|}}}|zyy{~|tnieb`_^_`abcdddccbbbccdfghiklosx|{vqmjgecbbbdglrx}~|{{{{|||||{zywtqoljiikmpsttspnmlmooonlifdba```abcehjmprtvxz{}}{{{{zxurnjfca`_`abdfiklmnmlkjjkmprsttuvxz}}zwtrqqrux|~}|{ywusqpoprtwy{||}~}||||}~~|yusqqsuwwvsnjea]ZXWVVVWXYZ[\^`adhlpv{~}{ywwwxz{}}}|zwtqommmmnnopqrtvwyz{|}~zwsqvy|~~wrokedefnrtv|xx}{vsuw~|z{{{yxkioyztmgb_^^`adfghhhfb]WRNLMS\fottpia]_frznmutgbemw}{xtnjhgghjkmopqstw{~zvvz~zpf^ZY]ckrwzzxsnhd`^[YXWWX[]`ekrz}}{wsrsv|ywvx|}xsnifc`^\[[[Z[]^_^]ZWTQOOSYbnxyqjfiq{|y{|zyz{~{unhcaacfjouz}yxy|yne_]`flrvwtoic^ZWVTSSSSTUVVVVWY]ckt~}{xwvvx|~xqkgfhnt|~xrligghjknopppoooqsvz{|yuqmkhgffghjmpswz~}{ywwwxy|}|{|~~vpmnqw~|wrmhc]YVTTVY]adgjlmmlkifdbaabdgiklllmosy|wqmigffghjlnprtvxz{}~~}{xwuuvwxwvtqonnpqrsrqnligeddegknrvz}~{voha\YXXZ\_ciow~ytqnljiiiijjkkkjjigfedcba_^[XVUUX\`deedcbbehlry~{xxxyzzywurpmlllmoqtwz|~}zwvuvwy{}~~}zxtronmljhd`\YVUTUVWY[^aeimrvzztpmllnpppomkjijkmoqsvwyzzzzzzyxwvutrpmjgedefilmnmkigffhjlopqqomljjkmpu{~~~}zxwwxy{~~wpkg_XWWQMNOMKMPOPSWXY]behnswz||{xwvvx}zqgju{vi^\dpz{uojfefhlpv|vmgcdipwzzuojhkr{wojikov|}xurstx~ztsy~{zyxxxz~~uonosx}}xrkd^XTQOONNNNOPRUX^dkrxzwpg^Z]gt{qhfmz|xsnlloty~|xtqnmmmnpqqux}{wvvy}zpjioxxnheglsy~ysnkihijmptx|{snlnu~{qhddiov{~|xrmha\WSQPQRSUWXXXYZ\`dioswyz{{zxwtqpnopsw||tolmqxyrooqv|}zxvvvy{}}yupjc\UNIEDEGKOSVY[]^`bccdefhikmprtvxy|{wtqomllkllnoqsux{~~{zz{|||zyxwwxyzzzyxuqmiecbbejpw}{yxz}~}~~~|{zzz{}~|{{||||{yxwwwxy{|~zslf_ZUQONNORVY\_abcefiloruwyz|~|zwtplhda_^^`dhnu{|zxwutrpnlifdcbbcdgjmqtwy{||}~}zupkgfgjmquxyzzyyxwxxz|}{yyz|~}xtqnkjhfecb`_][ZXWVUVXZ]`cdefgilquy|~~}|{{{{|~}zxurpnmlmnpsvx{}~|zzyzz{{{zywtrpoopqqpomkigfedca^[XTQONORVZ_djosw{}{zyyxyxxvuspmjgeba``acfimqtvwwwvvwy|~}|zyxxxxyyyxxwuttsrrtvx|~|zzz{}~~|{yyzz{{zxtpkgc_\YWUSQONMMMMNOPQRSTUWY[]`cfkpu{~}||{{zyyxwwwwxxz{|~~{xvtrrsuxz}~}}}~|zyy{}~|{zyxxxxyyzz{{{zzyyxxyyzzzxvspmkjiiiihgec`\YUROLKJIJLNQTWY\^adhlquy|~~|ywuuvwz|}xtpnlkkkjheb^ZWUTUWY\]]\[ZYXXWWWWWWWYZ]`dhlqux{}~~~~~|{{|}~~}|{zyyyxxxxwvusqqqrtwyz{{{{{|}}~~}yurpoopppomkiggilpuz}~}}}}~~|yuqnlkkkkjgc_ZVTRRSTUUVVVVUTSRQQQRTWZ^chmrx~~~~~~}}}|||}~~}||||}~~}|{zywusqoljhgghikmnnmkigghkotx|}|{{|}~|||~~}||||}~~~~}}}~}yvsqpqrsssrpmjgdb`___`abdeghhiiikmquz~~|{zxwusqomkjjjkmpsuwwwvvvxz|~}zvsoligfeeeffgfec`][YY[]_aaa_\ZYYZ\_cglqux{~~{xusrqppponmllkjjiiijlosvxzzzyxxxyz{|}}~}yvspmkjjjklmnonmmlmosx}~|{zyxvsqnljjjlmnmljgdbaabdgikllkigeccceimrx~~|zyyyyz{{{{{{{zyxwusrpnmlkkjjjjklmoppppooopqstuuutsqomkihggghjloqsuvwxz|}||~~}{xuromlkllmmlkigda^]\\]_abcddcba`acgmt|~zwvuuuvvvutsqnljiggghjloruwxyyyyz{|}~~~~~~~}|zxwutrqpnmllkkkjjigeb`_^_acefgggghjmquz~|zxvsqnkihfeeddccb`_]\\]^adhjkjigfefhknrvz~~{ywusrponnmmmllkjiijlpu{~}{yvtsrrrrpnkhfedefghijjjihggghjnsy}yvuuvxyyxuromlmnqsvxyzzzxvtqomjihgfffeedddegilnooonmnprtvwwwutrpnmlllmoqtw{~{xutttsqomkihgggffedcb`_]\\[[\]^__`__^^_chpy|xurrrsuvvutrpnmlklmoqtvxz|||{yxvvwyz|}}||{{{|}}}|zywvuuuuuuttsrrrqqpnmlkklnprstuvx{~{wspnlkjjjihfeb`^\[ZYYYZ[\]]^^_adgknpppnmmnqv{}zxvuttttttssssssttuwz~|zxvuttttsrqomlkkkkkjhgggghikllmnoprtvy}~|ywuttuwy{{{ywtrqqrtvxz{zyvspligfededfkkllllmpruy{}}}wvvwqnqqpnmkkigfiklouy|{xurrqqqonnnlllmpw~vry}~{yvsqooprtusoi`VPMOT]ekmjcZSQSZbjookd^ZY\cmxxz~tlgdcdegikkkjhfeefipx~vnihlt}umhfinu|}ytoligfeddccbabegjpv}|vtxywwz~}zz}xtrqsvxz{{ywurlheb^[XUTSTW[`ege`YSQU]gqvuoga^`flu|wpljjlnrux{|}~~~~}~~}yy}ytnjgecba`_^]]\\\[ZYZ[^bgmty}|zzz}zvtuy~zsnkjjloswz||yvrokifda^[XUSQPQU[bjry~}zvspmlllnquz~zusrtwz}~}|||}~}{zyz{}~~~~|{ywvutrpmkhfeddcddefghikllllkigfeefimsz|zyyz}|yvsqnkihfffghiklnnnmkigeddegiklmnoqtwz}~{wsokhfffhknquy||{yyyyz{{|}~~}}}~{uojfb^\YWUTRQPNMLLLMNPRUWY\^`bfjpv}}{xuqmjfdbbbcehknqtwz}}ytqmjhgfefffgggffffghiklmnoprux|}zvsolheb`^\\[[[[[[[[\^aeinrvy|~|yvrnkigeeefghijklmnoqsvy|~}{yvtqnkifdbaabcegijkkkjjjjiiiiihhiijkmoqtwz}~}{xvtromljihgfedcbbbbdeghijjiiiiijkmnoppponmlkkklnpruy{~~{ywvutsrqqponnnoqux}}{xurpnmlkkkjiihgfedddddfgikmprux{~~{xvuutsrpnljihgggghhiiiiihhgggghiklmnoopqrsuwxyyyxxwvvuuutsrpnljhfddcddefggggffefgilosvz}~}{ywurolifca_\ZYWVUTTTSSSTUVY\_cfilnqsvy|~{xvtsqponmljigedcbbcdfhjmnpqrsuwz}|zxusqpooopponmlkjjjkmoqsuxz}~|zxvutssssssrrqppoonnmllkjjihgfdcbba```__^^^^__`abbbbbcdefgiklmoppqrstuwz}~~~}{ywtroljhggfffedcba`_^^^_`bdfhknqsvy}~{ywvusrpomkjhhgghhijjkkllkkkkjjkklmnopppqqrsuwxyz{||}}}}~~}}}|{{zzzyzz{{|}}}}}}}}~~|{yxvtromkigfdb`_][YWUTSRQQQPPPQQRRSTVX[]aehlptw{~}|{zyyxwvuttssstuvwy{}~}|zywvtsqponnnnmmlkkjjkmoqtwz}~~}|{{zzz{{{{zzxwvutsrqponmlkjhgfdcba`_^^^^^^^^_`abcdfghikmortvy{~}|{yxxwwwwwwxy{}}zwtqnligeca^\[YXXWWWWVVVUVVWXZ\_cfjnrvy|~}{zyxwvutsrrrrrstuvwxxyyyyyyyyyyyyyzzzzzyyyyzz{{||||||||{{{{zzzzzzzzzz{{|}~~~~~~~~~}{yxvusrpmkigdba_^\[ZYXWVUUUUUUVWWXYZ[]_beimrv{~}|{zyxwwvvvvwwxyz{|}~}|zxwvtsrqpoonmlkjiiiiiiiijkmoqtwy|~~~~~~}}{zywvuttsrrqponmkjihggffffgghhiijklnoprstuvxz|~~}|{zyxwvvuuuvvwwz}|{{|}~~|zxusrpppppppnlkjjjheb^\[\^adgjlnooomljiijlotz~~}}}~|zz|~{xwxz}{wuvwtojgfgjnrvxyxuqlgdbbdhlqv{~~}{z{ztpnoquz{xvuuvwxz|~|vrrttqnnpruvvtrnkhedccdfhijkllllllmnprtvx|~{ywxz}yuv|~|ywtqomlkkkklllkjheb_]\\]`dhkklpwzwuuvwxxy{~~~}xtstw|~zwwx|~|zyyz{|}}}|yvrnjgeddfhkorsqmmqtokklnptx|~}zwuuuvwxyz{{yx}~~}}||}~~{ywuttsrqomkihhikmligjoz|tnmmortrw{z}~ysont~}zz{~~ytprw~xqs|whbhrwvoihkptwyyywmhdelvzxz|}{upmnt}vpot|~xw|{{}~ojq}unjgefhihhhgeb_^bisz}uollmnmkikrz~tjefkqw|}xrnlmouxrqwxx~wv}|tpopsvxz{||vpkjlmkksypg`]]`cgijiiknpstutnhdccdgkpw~~rhlzxuw~~|}{ywustvy||tkaXW\gt}{vk\W^ku|~|~wokiihhjqy|yuttuvvy{~||z}~}{zz|{z~thepyqjfegijjkjjnrttu||vtw{vqpollnpppprvz}~}{snryzz}~|{zuvy~wy{{{vqnlkhd_`fffkmny~~}~}~~xrqz}|{|zytpqtwxxxxz}~}wohdbcdddc`[[aebckjjnokehmihlqux|yv|wpopsvyz{|}yrz~|yupjffgeeegikjt~}~~wsstsrqomjjklhlustuvwwrqt{~zxyzzv{rgkolmpppssqrtwyzyxxy{xu|}|~ztqyzuttqpoqssrnheptnquz~}zz{zxz}zwttuvrv|vsu~}tsvy|}~}|{{|~wyz{~|tsyvtuusrtxyy{wy}}|~~zwtrsttrnlijpnnpot{xuuutsssrrqppqstpkpljnqrqonkfckpjedfkqw|}|||{{||}{wpsqhgffimomifdksolkkknrxxuzzuwyyxvutuuvvvvwxutz|{|y}}}|{|}~~~~}||}~{vrprvz}}x}{~}{z}{}|{zz{|~}~~}}||zywutssuwvqstoptvuplprnoqrpmjhgillieloigghilmmlkkjgkqnhfgjoqouvqrsssqppsvurpoosx}}}~~}|~~xy}z{}~|{xuuvvwwwvuutsrqqqsuuv{{}~}~|zz|{wvy||}{y|y||{{|}|zwtrrtvvruvqqssqqqpnrtpopqqrstuutrx}yxyyyz{{{|}~~~~|yywvxyyuoqvsqrrpnkkkkhkpmmonkgddeilnnkgdfnqmkkinvsrrssttsrqqrssrpnmnrwxrv~z~}}~}}}{|{~~~~~{zz{yx}~zz||}|{z||{zyxvsry{vuuuuutsrpnkospmmnnoomjnqmnpqqoliikmnoonopoqy|vrx}z{~||}~xw}ysssuwwuqnkklnoonligjrpkppnqtutsrqqqrrrrrqrstuust|{tw}}}|zyzz{{{{|}}{x|~{~{z~~}}|~}}}~}~||}||||}|xtxxuvxywusrqqrttqkkqsqrsrotuolmnpssrnkhgghjkkklmmjksunorttuvwxxwvtssux{~}z~~{wutvy{}~|vr{vrsvy|~}{xussssssssuvsqvxwy{yx}}zz~{yxz}}z~ywy|zux~}zxxxz}~z{}yxyyyxxxxxwvutuuttz|xw}~{z{}}|{{|||}~|{}~|yvsrrsttqmnttnnvvsttrpnmorssplhffimprronqnnrqoqtuuuttssrqppqsvvtsyyuwz}|yy}{{|~}{|~{|yz}~}z|}{{|}|{}}|zxy||wv||{||zy~zyxyzzywusrrrqqrrsqoqtvvstvwvtsrsuvvtronnpsuwvv|zuv~{z|yxzwxz{|{yvsrrrsrpmjijmmmrwtqonsvrpprtuvutsstuuusqvzvsstwz}}yuv{{y{}}|||}|z~|{{}}z|~~~|{~}||}~yw}~yw|~~}zxwxyyxusrrsuvwtprwxtqruxywtqoopqsrpnmmmkioussuuqpuyvtttttuwz|}|{xv|~~||||~~}zvrv|zwxyywvz|wqpqsuvwwvvvspsxwuwxxvuuwz|{wuy{yz}}y{~{{}|yvwy{~~~|zx|}z~}{~}||{zxwwxz{|{zx|~y}~~{{~~~|xwwxyxwvuvusrxzuruzxtsuxxxuronortvvsnjnqnmoruwwspruspoprtvwxxuruxuuwyzyxxxyz{{yvw~}}|~}~~yxz}~}yxy{~}zwvwz{zwy~}|{|~~~~|xvvy|xuyxz}{ywwwxxwwxxuswzxxxvuy{ywyzzxussuxz||ywz|xttx|}yz~~~}{{yzzy{{vuvwwwvtttvvtsvwropqrtuwxxuqquurqsvxywv{~ytstwz}}|yvuuwz{{yw{~z}|zy{~~{z||z}~}}~}|{{|~|{||}}zxxy{|{xvz}xttvz|{xyzxttvxxwvuvvutx|yutsrrsuxz{zvrpu{|{{{zy|{|}~{xzzwvuvwxxxwwwvusuzzwuutv|}||{yxxy{||{ywvwy|~zvz}|}~~~|{{|}}|~~~||}|}}}}|}|{|~~{y{{{~}||~}|{yw{}{{zyyy{|{xxzyutwz|{yusw|zwwwxxwvuttuvxxwtsw|{vsw{{{}~}{zz{||{zyz|~|~||}}{{{|}||{{|{{~~xz~|z{}}zxwyz|||{{{|{z}~}}~~zx}}zz|~{y{}||}|{z{|}~{wvy|||~~{y}~{{}|ywxz}~{{~~~~}||}~|zzywx|~|zz{ywz}{yyz{{zyxwvtsstvy{{yuux|}yuuw{|xvvwy{||||{zy}{|~}}~zz}~|}~zwwy{~}yy}}~}{z{}}{~{{}}}~zy{~{xy||yxxz{yxz~~|yxz~{yzz{{|}}{yusrsw{~ztv~yxz~~}}}~~}||{{~zz~zyz||xuttuvxy{|{xtw|}zxxyz}{wuvx{~}zy}~{{|}~}~}|}}~}}}|}~|}~}yvvx{||~~~~~~~~}|}|{~~~~~}||}~|zwwy{}|{||{}|zyz|}~~|zyxwvvuvxz{zy|}xw{}zyz|}{z{|~~|{~|~|~~~~|}~}zwwxz|}|z{|vv|}|{{|}~}{{{{yz~}|}~~~|{}~~}}}|~|{~~~}zyy{}zw}}{|~}|}}~}|zyyz{z~{y|~~{}~}~|~|{}{{{|||||}~}yv{}{{|}}}}~}|{yxxyzzywuu{|xvw|zxwx{~}{yw{~}}}~~}~~}||~{{}}~||}~~}|zxvy}z{}{zz|}yy||}|y|~}}~}zyz{}}}}}}|zz}}|~~||}~|zyy{}}yut{}}}~}}}yxz}}{~}|~~|zz|~{{~y{~{zyz{}~~~}zvsw||{|~~|zy|~xuux|}z|~zy{~~}|z{~~||}}~|~}||}}{}{~}{z{~zvx}}zz}}|}{z{}~}}~}zz~}{z{~{{}}}yxy{{y}|xw|}|zzz{|}~}zwx{zxy{}~}{|{wvy}~{yz}~}~~~~}{{~~{~}~~~}|~||}{zz}|y{~{wvx||ww{~{z{|~~~}zz{|~}{{{|}|~~}{{{}|}~~}{z|~}{~~|||}}{{|}~~~|~~zxy{}{y{~}|}~~~|{|}}}|zz}~~~~~|{}~}}}|{}~{zyy{}}z|zvuvz~~zvuz~{{{zz~}|{|}~{z{~~~~|}}|~}{|~~}}|yxyz}~yuv|~{yz~}}~~}|||}~||~|{|~}{~|{z~}}~~~}~zyz}|z~~zxxz|~}{yy}}yx|~~}||~|z~}}z{}{|~{{~}|}~~|z{~|zyxy{}}zwvy}xv{}{z{|}~{y~|}||~|}|z|~~}~~||}z|~}|}}~}}|||}~~}{|{y}~}{{{}}{~~~|z{~}~|{||y|~||}|yw{~~~{z|~~~}|{{{||||||}}|}}|~}{|}{zz|~}~}z{}|}~|~~~}yx{~{z~~|}}zxwy{~~|zz}~~{{|}zxy{~}|}}~}}~|{vwwspqsv~zroqv~umnwxmnv~}xqmpxxrorz~tprw{|xvxunoyvkmzztv~~rlkmpuy|}{wrmkknqtvy|zwwwx{~xutw{~}zvspprspmkmptwyz~ytsy~tnq{{rquvwzzpjlu{{|{snnry~{{wrnmnt||uooqqrvtlmxwrqty~wrprw}|xvtqpt|uompxztqrxyrooqsvwwsolmqrqqqrssv}wqnnqvz~~zwvvvxwvrnjhilquxxww{~xtstyzrnptwwy}}|}xpjilryytpoty{yxxyz}~{zyyuqopu}}vqoorx}}||}~ztomoruz~zy~~{xtqpqty~ztpoprtvy{|{yvtrrtuvurqtwuolow}}wtvxxtqpqrsssuxzwsopsuwvtposy{xvvzzuuxxvrpqx|xtrqqqqrtvxz}~zxxxxuqprw|~}xtrpqruvvtqnllpvzxrmntz{z{~|z~{vtttvwwwvusqqrsttsrrw~}{xtpmntz||}}|{zxwtsrrrrqpqv{|xwzzz~}xsqsuwwvvwy}~{}|wtrsvz}xuw}~}~~|{zzzzzyyz{|}}~|zzzyxwurppsuvxzzz{}|xx~~{ywvvy|ztollorvy{{xutw{{yyz|~~yx{}zutw{zurrsuvvutsux|}zz{~~|}{xx{~}yuroptxwuuvwxyzyxwutux{~{vsw~{tppsx|}}yupnmnprtvvussw{{vsuz}||||{zwuuvy|}{vplnrtrqruxzzxx{~~}~|{{|}}|zvqoqssqqruwyxwuuwxvsrsvyzywwz|ztonpsvxxvsqqqqpqtxzvrpsxywutvxy{{zwsolmotx{zvoknv{ysppsx}~~~{xvwy{|}|xsprvyxurpprvyzzxurqqsuvusprvzxurpprw{|xspoprtvwxxvssvwtpnoquxz{ytpnptvuutsrqsy~}xtrsvz|~}|||~~ywz{xursx}~{wtrqrsuvvtrqqruvvtrrtwyxtqprtxzzywtrpooprtuvttvwuqquwvtstuvvutttuvvurpoty{xvuwy{{}}|}~~~{wsruz{yvuuuvvuuwywspqsvxxvsrv{{wronpsvxyxvtqopsx{ztomqvzyxwvuuuuutsrqqruxzyupou}{vtuy|~~~|{{|~~{vsu|}xuttvxyzyxvtsttuutqopu{|xsnnry}|xsoopswz{{xtpnquwvtsstvxxwtrstuuuwxxvssw|~|ywvwy{|||}~|z{~}{xvx}}zxwvuuuuvvuuuuuuuuwwuuvvtrrtx{}|yuqoopsuwxxvtrrtvvwwvutvwxxwuttuwyzxupnqx|}{ywwx{~zxy|~}~}xssv{|{zyxvuux{|ytpnquy||yvtvxwsppruyzzyvspopuz|{wtqquyzxvvvwxxwvtrqqsvz|{wsqt{~xtsuz|zyz}|yxz}|vsu}ytrsuy|~~|xtppqtwyxustx{ztposy}}zwtrrrtwy{{zvrqruvtsuwxyywuuvwvtrsvxzyxx{}ytstx|}||}}~|z}}|{{zy{zvsrsvxzzywussstux{zvsuxyvsstx{~~{wspoorvy{{yurruy{zwsrsvy{|{yvtttvxxvttw|~}yvuvz}zz|~}|zwuvz~~{xvuttw|}xtqqsvy{{yvvx{zupnpty}~}ytporx||yvrpqv}}yvtstuwxxwuttuxzywuuw{~~zwvwz~}|{|~~|{|}~zuty~yutuwy{}}|yvsrrtvwwvuw{}zsprw|}{xvtstwy{|{yvrpquz{xvuvwxwwxzzxustwz{{xvw||wttw{~|{|~}~}}~}~~}{xx{~zvtstvx{|{yvsrsw||uqrwzywwyz||{xtrqrtvy{|{wspry~~yustvxz{{zxvvvwxxwussyzutw~}yxy}}~~~{wttw~|xtsuz}wrpqty}|vrswywtstwz}~|xspqvz|{zxvssv{~}zxvvvvvwwwvvwxyxxxyyyz{{yvvy~~zxxz}~~}{{}~{xy{~~zvtvy}}xtqprvz||zwvxzzvtvy{{{{zxvuuwz}~}{vrprx||{yyxwvx|~ytqrv{{yz|}zvtvy~~zxx|~}}~|{{}~}~|xutvy|~|yurru|}wsuz}|ywxz}|xtqqtx|~ysqu}zurtw{zvssux{|{ywy~ytuy~|zz{~}}~}|~~|~|~}||}~~}{yz~~yutx}|xutux|}xvwzzwtux|{vtuy||{zyyxxy}~yutuwz}~~|zxwwxy||yy}~|zxz}|xwx{}}~}~}~}~~}}}}}~{yxy{~zvsrtx}}zxyz{{{{{zz{|||{{{||||{yvuvz{ywwwz}xuuwz~~{{}{wtvz}xwz}{|~~~|}~{{}~|}}xuuwz}xtsw~yttx~|{{|||{yxwxz|~{wtv|zwvx{~|ywvwz|||{{~~xvy}{{}|z|||~}}|~{{||~~~~~}}|zz|yuw|~{xwwy}{vtw|~}{yz||yyz||||}}|zyy}}ywvwz|~{xwx{|xx{~}~}zyy|}z{~}}{|||}}}~}~}~~}}~||~~|{|~|xvuwz~|xwy|~|z{}~~}{{|}}zvtv|~ywvz{vuvz{yz}~|zy{~~zxz~||~}|{|~zy}~}~|yy{~~||~}zyy{~|xuv{{xwz}|}~~|zxxz|~{xx{}ywx{~yvuw{~|{|}z{~}||~{y{||~~{|~|{~~|~~}|~{{zy|}zyz|}|~zxz~~|zyy|yvw{~~}|}~~}}~~}{zz|~~}zwvx{|yvvz{xy~~|}~zxx{zx}}z{~||~~z{~||~|}zy{~}|||~{{~}||~{wuuy~yvw}{xxz~~|{{|}}}{zz}}xvx|}ywxz~}{{}~}zy{~}zz}~}~}{{}~~}~|yy|}|}}}|~{z}|yz|}}~zxx{|xwz~~{xx||yxz}~|||}~~}}|}~|zy{~|xuvx}}{|~~~~}{z|~||~~{{~zy{}yy}|z|~~~}}|z{~}zyz|~|{}~~~}}}~~zww{|{|}~}{z{}}}{wvw{{wux}xvy~~~|{|}|yz|{|||}}z|}|}{yz}~~}yx{}zy{~yx{~}{yy{~{vv}}yxz~~}|}}}}|{z|{ww|~zxy{~ywy~~|}}|}~}}~{z{~}||}|~}zz{~~zy~~|}~{z}~yx|zxx{zy{~}||~}zz|~|yz~|zz{}~~~~~~}}~}}~~||}|ywwz~}yy|~|}~~|yx{|zz~yxz~~|~||~zy{|z|~~{z}|xwy|}||~~~}|}{vuy~|z{~|xwy}}}~{yy{zvv{~yxz~}{z{~|z|~zz|~zxy|}|~~}|~|xx}{y{~zxz~~zxx}}yy||yxy|yvyzvw{{yxz}~}}~yx{~|zz{~ywy}~~}}}yy{~{yz}}z|{xx{yx||yz}}{{}~~}xx||yy{~}zz}~}|~}|}~~~~~}}~ywx|~|{{|~|{~~|}}xvvy|wx}~zy{~~~}|||xy~|yy|}}|{|{z|}|}~zz{~~}~~|{~zwwy}{z|~|{|~~~~|zy}|yx{{xx{~}~~{xy{}xwz{xy}~{z|~~~~~~~~{{}~yxx|~~|yy}}{{~{yz~|xwzywx~|xw{}||}}|}~{z|}yxz}zyy{~~~||~~}}|xwz}}}~}||~zxx|zwy{xz}||~}yy~|zz}~|{|~|yz~|z{~~ywy}~~~}|}}}{wwz~|yy{~yx{}{zz}zwx~zy{~~~~}||{xz{zz}~yy|~}}~}|~|zy{~|{}||~zxy{~zwz~{z|~~~}zyzywy|xwz~|yz}~}}~|z|~}zz}{{{}~}~~{xx{{z}~~|yx{|yz~zxy}~|}~|{}~zxz~{yz~}|}~~~~~~}~~{y{|ywx{~||~}}~|xwz}{{~~zyz}}{z||xx|{yz~|{|~|z|{yz~{xx{~~~|}~|{|~|xwz~}}}zz||xxz|xxz{yz~~|zy{~}xx|{xx||zz|~~{z}|z{}~zy{~~~}yxz~~zyz~}z|~~zxx{}xw{|xx{}{z|~~}}}xw{|yxz}}zz}~}~~}}~~|}{xx{~|||~~}~~}~{xwy~yx|}z{}~~|{~~yxz~zxz}~}~}{{}}yy}}zz}|yy{~}}}~|z{~}ywx{}{{}~||}~{yz|yy||yy|~|yz}}yx{|yy~|{|~~~~}}~{z|}ywx|~~~{xx||zz|{yz||xwy~zww|}xwz~}}}}}}|z{zxz~|zz|~}|~~}}~ywz~}~~}|~{wx{zwx}|xx}~|{{}|xx||yy{~{z{}~~|yy}~{yz}~ywx}~~}~}}{xwz~|zy|~zy}}{z{~ywz~zy|~~~||}zxz}zxz~|xy}~~~|}~}{{~zxy||{{~}{}~~{xxy}{xx}}z{}~~{yy}|ww|ywx|~zz}}}~}z{~}zz}|{{}~|}zxwz~{z|}}~|xwz{xy}~yvx}}|}~{z|~ywy~~zxz}|}~~~}~~zy{|xwx|~|}~}~zww||{|}yx{|yz}~ywx~}yx|}{{|}zz}|xx{|xwy|~||~~|{{}}xvx}~}}~~zy{}ywy}}ywy~|yy}|zy{~~yw{|ww{|zz{~~zy||zz|~yxz~~}~}ywy}~zxy}}z{~~~~zwwz~xvz}xxz}{{|~}}~ywz}yxy}~{z|~~}}~~|}}ywy}~|||~}~~}}|xvx}zxz{z{~~~|{|{wx|{xx{||~|z{~{yz~{yz~zyy|}}~~~{z||xwx|}z{~~||~}zy{|yy|{yy|{yz}|xx{{xy~|{|~~~~|}}zy{}ywx|~}~~~~{xx{}zz|}zy|~ywx}|wwzzwx~~}~~}}}zz~|yx{}zz{}~||~||}{wx|}}~~|}~~}xwx|}xwzzwz}{z{~{wy~{xy|}{{|~~~|xy~~{yz}~ywy~~~}}|xwz~}zz|{z}|zy{~ywy{y{~~~~|{|zwy~~zxy}|yy|~~||}}{{~{xy|}{|~~}~~~|yxy||yx|~{{}|yy}}xw{{xx{|{|}}~}zz}}zy|}{{}~||~{xwz~{z|~~~~{xw{{xy}~ywx}~}~}{{|}ywz~yxz}}}~~}}~}zy{{xxz~}}~}}~}xwy}{{}|yz|}zy{~{xw{{xy~~|{|~{y{{xy}zxx{~~}|}}{{|zwx|~}}~|{|~zxy|~zxy~~zy|}zz{~yw{}xwz}zz|~~~{z|~{yz}}yx{~~~}ywy}}zxz~}{|~~~zxx||xw|}yx{}{|}~}~}xx{|yxz~}z{}~~}}~||}{xx{}||}~}~}}}yww{|xy}|z{}~~~|{{|xw{|xxz~}|~}{{}|yz}|yy}|yy|~}~|z{|xwx|}z{~}|~}zy{|yx{|yy{~|yz|}xx{{xx||{{}~~||~~zyz~~ywx{~}~~~~|ywz~{z{~zz{{wx{}xwy|ww|~}}~~}}~zy|~zxy~~{zz|}|}}{|~}ywy~~}}~}}}~~{wwy~{wx|~yx{}{z|ywy{xy|}{|}~~{xz~~zyz}}ywz~}|}{wwz|zz|{z}|zyz~ywy{z{vrw~}{ytlhjnrw{}yssvz{rlmpw~tokjjnrttsrpqu~zpoxuuyjhr}vux|}{wuux~{uqnpw|ngjvzpkms{|rlnzwqwuqv{urpprstsqonosvxxvttv|xoknu~{uqpsx{vvy{{wrlijntyzxusu|~snr|xsv~~xuvxyyxxz{vsqrsvz}yojkr}{zyxvtrqsvx|}~zvrqruz~~xtv||tnnt|~wnijq{xqmlpv}{vqpt|{wuvy}{rkjmruvtrpoooqtvwwvw{zqjimt}|uqruvvtrrstuvtrqsw~|vpos}xpmmptwy{~}yxxz||ytolnt|}yvtrqqrstvy~~|~ysporvxxww{}zvsqpsz|xy|ypjjov|~|{||{|}zvqory|ywwwvsqprtutsstw{}}zuokjlqvz{xtrsy|ywvtrommpuyzwrmkmsy|{vpkikqw}{uolmrz|wqnnquz||zvuuy|vqqtxzyvrrv}}yvvvurollptx{yuollpw}~{wvy}yvssuwyyuqmlnsx{|zvroosy}yvsqpruz~}|~~ztnkmqw|~|xtsu|}wrruy{zvrqt{|zyyxvsqqtvwxvtrqqsw{~zwvy~}||{ywvwz|{wrmlnsx}~|xtqrw}zvspoqu{|{~~ysoosx{|zwutv{zzx}|wvzwlghlrxzqic`chq{~~}{utyrp{mdk}ncbjx|vtv{xrnmnsy|vqpt}~tru}}yuqonry}wzzv|~{xutttsplgcchpx~wqs{vlhhkoty~{sonprttrommqy{uu|yniluxoihkpuwxwvw{~~~|yusrty~}zwusstx|xy|~zwwz}{wtrplgddhq|vqrx~}~|yy|{tolkjknrx|}ywy{zsmlow}{{{{xtnhfhnu{}zvrrv|}ywvvvvtrrw{vssuwxwusrsvyyxzwqnot}zwvxy}~}}}ytnlmqw}zvttrolkkmprssrrtx}yx{xrpsy}wqlknsy|||~~{|{yvtrqqqqruyyqkijpy~wtuxz||yvtsrssromlmpssokhjqz~|{yvspooppoljijmprssqomnrx}}yuuy}xtommnpqrtx~|xurqqqrqpprw~~{z{||ztnjims{~{xutsrrponnoprrpoorx|xtsrssrqpprsttspnnry}|~xsqpppnllou}}~|yvsssttsqppsx~~}~}{ywurpnorv{zurrtvvtrqqsuuromou}}yvuuutrqppsuwwuqopt{|yz~~zvtssrpnpsx}~~}{xtrrrttttux}~{{~~|{zxuqonpty~tjighhigmvy|~|yvz|rkijov}xsmhcdgox~~}}z{|wx~{jeo}xidnuoqyzngegmt{|xtqsz~uqu~ytpmmpxwquwplkljgeddefedeiow}}vuzvlhhlrx}{tnkmqvxvqlkow}uprx}rhdivvpot{}xvtqolkmpv{|xtqoos{{wwz~~{yz}yvrpnkhffipz|vv}zxyzzyyz}~~{y|zsmkjijmpv{{vtux{yqjhjqz{uqqu{}xsppsw{~~~~zusrrqqrv}}vqqtxyxurqrsuvwy|wqqx|vokikpv{}~}}~}}~yussw}ytqonnmlkkmpswxz{~{z{{uqqv}|zxtolkot{}zvrpqtutrqt{~{xussw~wpjghkorqnkjknpponpswyzxtqpsy}xwwyyvsokijklmlklotxyvqmlpw~{yz~~zxvrolloswz|}|yxxwvtrppqrsrsuz{xvuuutrrsw}uppruwvsnkklnnlklpuz~~|yxz}}}~}{wtrqqqppoopsvwvtqqty{yxwvtqonorux{}|wuuwyyvsqqrttsqpsy}zxvuuvvvtssw~|vssvxxvspooppppqsvxzz{z{}~}~|wspprtuusstwyzwsqqv}}yz|}|yuqpqsuwxy{~~yvvwxxvusstvutrsv{~|ywuttuvvvx}|phb_`efjmnoyyy}wlfejr{~zwuohdbfnw}zz|~}zzvjitwjgsww}|{~|tkdcis~}wsru{|xyyqkkt~x}qhkw}qhedfffefhkmmkjjms{}z||qifhnv~}yuronpsvwvsporwzurquzzsmkq{xssy{tpppqrpoorx~yusstvx||usw|}zy{}|xuqmkhhils|zy}zqmotz}~}~z{~{phfhlquvwz~zrpquy~}xqljmt}zurrv{~~|vplkmrx}|xurqqrtvzxsqqtvxwtpmnqv{yssw|{zxtmhehnv|~xsrv|}uommnnmllnquwwwwz}}{toosz~zvsqppqtz~}~{wsqqrssstuz}wrru}|tlfdfjmnnnoprssrrsttuvwwvuux}zuttuusplijlmnmmnquxywtpnnrx~|yz{xwxxvtqpquy{xxwvsqopqsuuttuy~~{xwvvvuuvyxqmmpstsoljknqstuuuwy{|||{}|yy|~~|xtqpqqpnmnqvz|{xusv{yvvvvvtrqrsvy{}}~zurqrstrqoopqstvwy||wuuwxxvtrstwxwvvy|wvy~}yuttvxyzzz||}|zyzzzyyz|~}xvvwyzxurppsvyzz{}|z|zvtw|}voklosvusqopqsttssux|~zxz}xwy}}xsonoprrqqrtwyyxxz|}~~}{}}wuvy|}|yusrrtuvuuvy}|wtuyztqpsx|~|vpkjlostsrqqrsttttuwyz{{zxvvy~{uqpsw{|{wrnklnrtusqprux{|}yvvx{}}{xvtstvwxxwwwxxwuttw{~|xrnlnrw{{wrlijosvvspnnpsuvvuuwyzzxurqsx~zsnmqw|}ysmihlqvxwtrqsvyzz{|zvw{}wrprvz||zwvwxxvsqqtx|~|wqlkouz|ytmiimrwxvspopqsttssuwyzywtrrvz}}ysnmpuz}|xrmiilquwwussuwyz{}~|wwz~xtrsvz{{zxxyzywtrsvy|{ytpnnquz|zvpkikpuwwurqpqsuwwwvttuvwwvuwz|}zupmnrw|}{vplkmrx{zwrprvz}~~~~~~~yvx{|xttvy}~zwvvxyxwvwy|}|ytomnrx|~{uoklqw|{wrnmptx{{ywuuvwxwutux|~ztonrx}}wqmknsy|}zvssux{||}~~~xvy~~xtruy~}zxwyyywutwz~}ysppsx|~{vqmmqw|~|wrppruxzzyxwxxyyxwwxz}}{wsqrv{~ysnmosx|}{xutvy}~}~~}}{wx{zustx|~{yyyzzyxxz{|{zwuttvz}~}xsompu{~}zvrqsvz}}|yvuvyz{zyy{}}zuqpsy~{upnpv||vrrv{~|}}~|~|wvx}|wttx~zvuwz|}|{z{||{yvssux}{upnqw~ztqqty}}zxwxyzzyxy{~{ursw|~xsppty}xttv{~}|~}~|~{wwz}wttw}zwvx{|{zyz|~~|yvtux|~|xtqrv{zurruy|~~}{yxyz{||{{{||{ywvw{}xspqtz}yuux}~}~||~{}}~}~}{}|yy{{vtuy~~zwxz|}}|{{{{{{yxwx{~|xsqrw}~ytrtx~zvuvz}~|{|}}{xuux||vrqtz~xttx}~~}~}{}}}{{~~zxy}~xtuy}xuvz~~|{|}}|ywvwz~~ytrtz|vrrv{{wvwy|~~}||}~~|ywwz~{vttw{zutv{~~}z{}|}}~z{}{~~zy{{vuw|}xvwz}}||}}}|zzz{|~~}{xvvy}|wssv{|xvwz~|zz{||{zz|{wssv{zutw~|yz}~~|z{}{|~}{}}{}~|{}|wuvzyvwz|zyz|}~}}||}~~|yvuw{ytsv|zvuw{}{{|}|zyy{~}xuux}}wtuy|zz|}{|{z}~zz~~{{}}|yz~yuvz~xuv{~{yz{}}}|{|~~{xwx{~yutv{~yvux|}||}}||{|~|zyz|xtvxvuwvsuy~}zzyy{z{{|yxy|{xwuropsvxyytqu~ylkwzt{vu|zvvxz{zwuuywnjkrz~vporx}tljls}|wpnpwzqqzvor{~yxyzwsmkknsxywurpprw||rklt|sqsz~yvuuusrqqrtwy{}~ypnvyux{tprv|~{z{}~{voijp{ytqqrty~zsporuvtqmms{|wttwz{ytpnqx{tqsy|wutuvy~|xurprvwssvz}~}}{wvx{|}~yros||ywtqomnquwvsnihkqx}|{}yronoqsw{|vokjmrvyxsokilrz~vqoqu|~ysmiimv~}yusstvxxy}zxz}}xrnnry~zsomov~yrnns|}{|zsnmnqtvxxy{||~}~}}|yuqpqv{|sljmsy{ysnlnsy~~ztpoprtutttvy}zrmknswyywusstuvvvutssstttux~yqmlpx~wokloswxwutux|{vttttsqqsvz~{yy{~}wpkjlqvyzxtpnorvz|{zz|}vrsw|}xsooquxzzxwwxz|}}}{rmlotz~~|zz{}zz}}vokknruvutsrsvx{}~~{z}|uonpsvvusrsvz{usuz~xtsuz{z}{xwy|~vpnptx{zxussvy|}~~~~|wssw|{uoklotxyvromorvyzzyz|}~}zwwy~{ustx~zrljlqvyxvsrtwz}}}|{}xrpsx|~{uplmqvz{zxwwxyyxwvvy|}xsppu{~}xrljlqvzzwspnnpsuvvuvwyzxussvz}~|xtpoqvz}|xrljkpuxyxvtuwz}ytsvz~ysnmosvwwuttuvvutttvwyyxuroosw|}zuokknswyyvromoruwxvtrrtuttssuxzzxsolloty|zvokjntz}{xtsuy}~xttw{~ysonquxyxurqqstuuttuvxxwsomnrw|}ztnklqw{|xsnklpuyzxurqrstsqpqtwzywrnlmrw{{xsnkmsy~}yvuwz}~xtuy~~wqnosx{{yusrrsttsrstvxxwspnpty{{wqmknsy}}ytommptwyxvtsstttsrsuwxwuronpsx|}zvpmnrx}{xwwz~}xuvy~ztpprwz{zwutttuvvvvvvvvvusrsvy||ytomnsx|~{wronqvz|{wtrrtvwvuuvxyyxtqopsx}}xropu{zvuw|}wtuy~{tpqtz~~{wsqruxzzywvwwxwvsrsv{~~ztpnqv|zupnpuz}~{xtstvwwvuvxz{{xtrqtx|~}yuqptz~yvvx}~~zvvy~{uqquzzvsstwyzzyxxyyyxvuuw{}}{vrprv|~ytporw{~~{wutvwyyyxxxxyxwvuvx{~~|xsqrv}}xvw{}~}~~{yy{}wsqty~}xutux{}}{ywvwyyyxwx{}}ytqqtz|vqpsy~{vrruy|}|zyxyzyxvuuw{~zursx~{vtw|}}~}~}~{xxz~xsrv|{vrsvz~~|yxxyyyywwy|}ytrty~~xsqrw}{vssvz|}{zyzz{zyxwxz|~~{xutv{{vtv{~||~}|~}|}||yz|}wttx~}wtsvz}}zyxyz{{{z{{}}{yvuw{ztqrv{}xttvz~~|yxxy{{{zz{|~}zvsty|wtv{{yz~~|~}{}}}}{}~|{}zusuzzusuy~zwuvy}~~}{{|}}{wuux}}xsru{~xssu{~{yyz{{zyyz|~|xuvy~|wtv{}yy{~~{z}~~{|{z}|||zz|~xuuy|vrtx~~zvvxz}~}|{|~}{wvw{zvsty~~xtsv{~{zyz{|||||||}|{yxy||wtvz}yy|~~~||zz~{|}{}}z{}|~}|}~|xvw{|wstx}{xwx{~~|{{||{zyy||wssw}ytsv|~yvwy|}||}}}|zxxz~xuv{{xx|~}}}z{{{~~}~~zy|}{}~~~}yvvyxttx}zvux||||}}|yxx{}xtuy}wstx~~zwwy|~~}|}~~~|zyz||xvx}|xx{~}zz~|{~~~}{|~zz~}zz~~~~}}~}ywx||wuv{zwwy|~}}}}}|{z|~~zxwy}}xuvy~~{yyz}~|{{|}}|||~|xwy}|yy}~|}~|{||{}~}}~|{~|z|~~|zz|zwvx|}zxx{}{z{|~~}}~}zxxz~{wvy}{xxz}}||}}}|{{}~zyz}{yz~}}~~|~~{|~}{}~{|~~}}~~}{z{~|xwy}|xwy|~|{{|}}}}}}{yz|~{xxz~|zyz|~~}}}}}}~~~}{{||zz}}}~~|}~||~}}}|~|{}~}~~~}||~}{yz||yyz|~|{|}~~~~~~~~~}|||~~{yy{~|zy{~}{{|}}|{|~|{{~~|}~}}|~}}~~}|}}}~~~~~~~~~|zz|}zyz}}{{{}~~~}|{|}~|zz|~{zz|}|{|}~~||}~||}}}~~}}~}~~~~}}~|}~~~~~~~~}{{|}{z{}}||}~~~}}}~~}{{}}{z{}}||}~~~~~~}~~||}~}}~}}~}~~}}}}~~~~~~}|}~}{{|}}||}~}}~~~~~~}||}}{{|~~|||~~}}~~}}~~}}~~~~~}~}}~~}~~}~~~}||}}|{|~~|{|~~~~~~~~~~}||~}{|}~}||}~~~~~}~~}~~~~~~~~}~}}~~~~~~}}}~~}||}~}||~~~~~~~}}}~}||}~}}}~~~~~~}~~}~~~~~~~~~}~~~~~~~~~~}||}~}|}~~}~~~}}}~}||~}||}~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}}~}}}~~~~~~~~~~}}}~~}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~~~~~~~~}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/m56.bin b/applications/SprPoP/dist/MUS/m56.bin deleted file mode 100644 index 60c47cb..0000000 --- a/applications/SprPoP/dist/MUS/m56.bin +++ /dev/null @@ -1 +0,0 @@ -}}|zyyyz}~zyxxxxyyzzz{||}~~}||{{|}}~ztt}xvw{|w~v~~~~~ztqv~}wssuvxy{|}~~~~~~~}}}}~~}zvtv~}}~~|wsvwsstvwyz{|}~~|yurrv|}zwuuuvwyyz{||}}}~~}{{~|wsqrw|~}yurqqqrsuvwyz|}~~|{xurqsv{|zxwwxxxyzz{||}}~~{wttux{~~|zwvtsssttuvwxyz{||}~~~~~~~}|{zywusrrsw{~}|{zzzzz{{||}~~~}~|ywwxz|~~}{yxwvvvvvwwxxyz{{|||}}}}}}}}}|{{yxvusrrtvz~}|{{zz{{{||}}~~}}~}zxxxz{}~|{yxwvvvvwwxxyzz{{|||}}}}}}}||{zyxvusrrsvy}~}|{{{{{{||}}~~}}}}{yxxy{}}|zyxwwvvwwxxyyzz{{|||}}}}}|||{zyxwusrrsux|}||{{{{|||}}~~~}|}~~|zyyz{}~}{zyxwwwwwxxyyzz{{||||}}}||||{zyxwutrrsux{~~}|||{||||}}~~~}||}|{yyz{}~~|{zyxxwwwxxyyzz{{{||||||||||{zyxwutsrstwz}~}|||||||}}~~~}|||~}{zzz{}~~}|{zyxxxxxxyyyzz{{{||||||||{{zyxwutsrstvy}~}||||||}}~~~}|{|}~|{zz{}~~}|{zyyxxxxyyyzz{{{|||||||{{{zyxwutsrstvy|~}}|||||}}~~~}{{{|~~}{{{{|~~|{zzyyyyyyyyzz{{{{{|||||{{zzyxwvtsrssux{~~}}}||}}}~~~~|{z{|}~}|{{||~}|{{zyyyyyyyzzz{{{{{|||{{{zzyxwvussssux{~~}}}}}}}~~~~|{zz{|~~}|{|}~~}|{{zzyyyyzzzz{{{{{{{{{{{zzyxwvutsssuwz}~~}}}}}}~~~~|{zzz{}~~}|||}~~}|{{zzzzzzzzz{{{{{{|{{{{zzyxwvutsssuwy|~~}}}}}~~~~|{zyz{|}~}}||}~~}|{{zzzzzz{{{{{{{{{{{{{zzyxwvutssstvy|~~~}}}}~~~~|{yyyz{}~~}}}}~~}|||{{{{{{{{{{{{{{{{{{zzyxwvutssstvx{~~~~~~~~~~|zyyyy{|}~~~}}~~~}}||{{{{{{{{{{{{{{{{{zzyxxwvutsstvxz}~~~~~~~~}|zyxxyz{}~~~~~~~~~}}|||{{{{{{{{{{{{{{{zzyyxwvutsstuwz|~~~~~~~}|zyxxxy{|}~~~~~~}}|||||{{{|||||{{{{zzyyxwvuttstuwy|~~~~~~~}{zyxxxxz{}~~~~~~}}}|||||||||||{{{{zzyyxwvuttttuwy{~~~~~~~}{yxwwwxy{|}~~}}}|||||||||||{{{{zzyxwvuutttuvx{}~~~|{yxwwwwyz{}~~~~}}}|||||||||{{{{zzyxwvvutttuvxz}~|{yxwvvwxy{|}~~~}}}}||||||||{{{zzyxxwvutttuvxz|~|{yxwvvvwyz|}~~~}}}}}||||||{{{zzyxxwvutttuvwy|~}|zyxwvvvwxz{}~~~~}}}}}|||||{{zzyyxwvuuttuuwy{}~}|zyxwvvvwxy{|}~~~~}}}}}||||{{{zyyxwvuuttuuwy{}~}|zyxwvuvvwyz|}~~~~}}}}}||||{{zyyxwvvuutuuwxz|~}{zyxvvuuvwxz{}~~~~~}}}|||{{{zzyxwwvuuuuuvxz|~~}{zywvvuuuvxy{|}~~~}}}}|||{{zzyxxwvvuuuuvxz|~~|{zywvuuuuvwyz|}~~~~}}}}||{{zzyyxwvvuuuuvxy{}~}|{zywvuuuuvwxz{}~~~~}}}}||{{zzyxwwvvuuuvwy{}~}|{zxwvuutuuvxy{|~~~~}}|||{zzyxxwvvuuvvwyz|~~}|{zxwvuuttuvwyz|}~~~~}}||{{zyyxwwvvuvvwxz|~~~}|{yxwvutttuvwxz{}~~~}}||{{zzyxwwvvvvvwxz|~~}}|{yxwvuttttuvxy{}~~~~}}||{zzyxxwvvvvvwxz{}~}|{zyxwvuttttuvwy{|~~~}}||{{zyyxwwvvvvwxy{}~~}|{zyxwvuttttuvwxz|}~~}}||{zzyxwwvvvvwxy{|~~}}|{zyxwvuttsttuvxz{}~~~}}||{{zyxxwwvvvwxyz|~~~}||{zyxvuutssstuvxy{|~~~}}|{{zyyxwwvvvwxyz|}~~}}|{zyxwvuutssstuvwyz|~~~}}||{zzyxxwwvwwxyz{}~~}}|{zyxwvuutsssttuwxz|}~~}||{{zyxxwwwwwxxz{}~~~~}||{zyxwvuutsssstuvxz{}~~~}}|{{zyyxxwwwwxxz{}~~~~~~}{{xusrty~}xtrqrstuvwyz|~xvvy|~~}|{{{{{|||||{{yyyyz{}}~}}}}~wmo~ujggikmoqrtvxz|}}}~}||{{{{||}}~~xy~yvvvvwwxxxyzz{|}}~~~~~~}}||zxuqptz~~{wutttuvxy{}~yx~{wutsssssstttttuuuvvvwwxy{|}}}|{{~~xrmlnv~}xrnlkklmoqsuwxz|}~~}|}}zwvy~|zxwvvvvvwwxyyzz{{{{{{{zywusqqruy|~}{yxxwxyz|}~zxx{|ywvutsssssstttuuvwxyz{{||{{{|}zuqnlmqw}}yvsqppqrstvwyz|}~~}|}|zwvvz|zyxwwwwwxxyyzzz{{{{zzyxvtrqpruy|~}|zyyyyz{}~|ywx|~{ywvuttttttttuuvwwxyz{{{{{z{|~{wspmkmqw}~{xvtssstuvwxy{|}~~}||~~{ywvwz}{zxxwwwwxxyyyzzzzzzyyxvusqpqrvy|~~}|{zz{{}~~zxwx||zxwvuuuttuuuvvwwxyzz{{{{zz{||xuqnllnrx}}{xwvuuuvwxyz{|}~~}||~~|zxvvw{|{yyxxxxxxyyyzzzzzyyxwvtrqpqsvz|~~~}|{{|}~|ywwy}}{yxwvvuuuuuvvwwxyyz{{{{{zz{|~|yvspmklnsx~}{yxwwwxxyz{|}}~~}|{|~}{ywuuw{~|{zyyxxyyyyyyyyyyyxwvusrppqsvz}~~~}}}}~}{xwwy}}{yxwwvvvvvvwwxxyzz{{{{zzz{}}zxuromklosy~~|{zyyyyzz{{|}~~~}|{{|~}|zxvuvx{~~~~}|{yxxxy{~|yxz~ysyyupmlllmmnopqsuvyz{||}}~|~|zywutrqonnorw|vpyroquwyz{||}}~~~~}z~~~}}|{{zzz{~{twwpnnopqrrsssssssssrrqrsuwz|~~|zwvy~~{tt|zsomllmnopqstuvwwxxxyz|}{{~}|zxwvvvx|}vqqw|xuttttuvvwxxxyyyxyyz|}{z|}xvx}|xtrpoooooooooonnnnopsuxz{|{zxwvx{zwwz}yvsrqqqqrrstuuvvwxy{~~|{|~}|{zxxwxy|{vssu{~{yxwwwwwwxxxxxxyy{}}{{}zwwz}ywtsrqppppooooooopqtvxz{{{yxwwy|}ywx||yvusssssttuuvvwxxz|~}{{}~}}|{yyxxyz|~}zvttw|}{zyxxxxxxxxxxxyz{}~|{{}}zxx{{xvtsrqqpppppooopqrtvxyzzzyxwwy}{ywy}~{xwuutttuuvvwwwxyz|~~|{{}~~}|{zyyxxyz|~~|xvtuy~}{zyyyxxxxyyyyyz{}}{{{}|yxy|}zxvtsrrqqqpppppqrsuvxyzzyxxwxz}~zxxz~}{ywvvvvvvvwwwxxyz|}~}{z{}~~}||{zyyxyyz|}~}zwuuvz}|{zzyyyyyyyyz{|}~~|{z{~}zxxy}|ywvutsrrrqqqqqrrtuvxyyyyxwwx{~|yxxz}{yxwwwwwwxxxxyz{|}~~}|{z{}~}}|{zzyyyyyz{}~~~}{ywuuw{}|{{zzzzzzzzz{|}~~}{zz{~~|yxxz}}{yxyyzz{||}}}~~~}{yxxz||sov}smklmpqrsuuwyz|}~}}~}x}}{{{|{{yxwvvvwxyzzyyxxy|uzuooqtuvwwwxxy{|}~~~}}~}z|~~}~ypq|~skhghhijklmoprtuvwxxxyz|}}zsry|tpmmmmnoprsuvxyyyyyyyz||yxz~|{zyyyyz{|}~xvz|vsqpoopqrsuvwxxxxxxyz|}zy{~{usty~ytpmkjjjklmopqrsttuvwz}~}}~yuux~{wusrrrrstuvvwwwwwxy{}~|yxx{~|{zzzz{|}~~zxy}|yvtsssstuvvwwwwwxyz|~~|zz{~yutv{}yurpnmmmnopqrsttuvwxz}}|}}xvwz}zwuttsstuuvwwwwwxxy{}}zyxy{}|{zzz{|}~}zyz~{xvutttuuvwwwwxxxyz|~}{zz||xuuw|{wtrpoooopqrsttuuvwy{}~}|}{xwx|}zxvuuuuuvvwwwwwxyz{}~}{yxxy{}|{{z{{|}}~|zy|}zxwvvvvvwwwxxxxyy{|}}|zyz|~zwuvy}}zwtsqqqqqrsstuuvwxy{}~~}|{|~zxwy}~~}{{zxxxvwxyz|~~~|zyyxyz{}||}}}~~~v{|||{zywvvuvwxy{|}}~~~~~~ztt~}}|}}|pn|wx{}zwusrqrrstuvwwwwwxxy{|}|zww~~z}|soosx}~|zxwvvvvvvwwwwxxwvussv~}{zz{~{ut{|vronpsw|~|{zyyxxxxwvtrru{~}}~|wstz{ywtrpooqty}|zxvtsqpnmnrw|~yutv~}{wvtqonnorw{|xupljlu|{{||}~~|}srstuuvwwxyyyyxxyz|}zy{~~z~}zz{|}}~~|~uyukijlnpstvxyyyyxxxxz|zvw~}||}~}}~}rknzyqlklnprsuvwwvutsrsux~|yvv{|xuuw~}vojltxsqoopqrsssrpooqu{}zxx{}{xvuvz~ytolms{~yusqpoooprux{}}}~}{{||yusrty~zvronqx~ytqpqtx{}~}{zyyz}~|{|~yursv{}}~|xtqoptz~}}~~~}|{zyyxyz|~zwuuvwxy{~~}||{{|}{vrnmnsz~|{zzzzzyyz{|}wrmkms|}{yyyyzz{{|}~zvqnmpv~|{{{{{{{{{|}~}yvssuy}}zxwwxxyz{|}~~|{zyxxz~}|||||||{{{{||}~}}|}~}{{}~|zyxxyzz{|}~~}yvvx}~~}||{zxvusrrtw|}xustvz}~~|{zzz{{|}}}}}}}}~}yvuvz}{ywusqnmnqv|}yvsrrux|~||{{{{{{{{|}{xvvx}|yurpoopsw{~|ywusstw{~}|{zyyz{}}zwvwz{wsrsux|~~|{zz{}~}|zwuttvy}}|{{|~|yvuux|~}|~}{ywvuuvxz|~~|zwvuuwz}|wspnorw}~{ywvuttttuwy{}}zxutstx||wrnkjlr{}zxvuttttttuwxz}~~|zxwvwy}|yvtssuw{|zxwvuuuuuuvvxy{|~~}}~~}zxwx{~{yxwvvuuuuuuvwyz}}||}~}|||~~zvsqqty~}{zxwvvuttttuxz~}|{|~~}|{z{|~{wtqooquz}{ywvuuuvwy{}~}||}}{zzz{}}zwtrpopsx}~|zxxxyz{|}}}~~|{|}~|{{}}{xvsqooqty~~~}}|||||}~|zyxy{}~|zwtrpooquz~}||{{{|}~~|ywutuw{}{xurpnnpsy~}}||||||}~}{ywuuvx|~}{xvtrqqsvz~}||{{{{{|||}}}||{{{{|}~~~}|{zywvuuvx|~}|{zyyxxxxyz{}~}~~~~~}zxuttux}}{zxwvuuvwy||{zz{~~~~~~~~}zxvtstvz~}{ywvvvwxz}}{zyyz|~~~~~}{yvusstw{~|zyyz{|~~|{yyxyz|~|ywusrrtwz~~~}~~~~}{zyxxy{}~|zwusqppruy}~}||{{||}~~~}|{yxxxy{~}{yvtqommorw|~||{{z{{||}~~~~~}|{yxxxy{~}{ywurponoquz}|{{zzz{{||}}~~}}||{{{{|}~}|{zyxwvuutuvwz}~}|{{{zz{{{|}}~~~}}}}~~~}|||||||}||{yxvuuvy|}|{{zzzz{{|~~}||}~~}}|||}~~{ywusssux|~}|{{{{|}~~||{|}~~~}}~~~|zxvtrqqsuy}~~}}~~~~}|{{{}~}{zxvtrqqqsvz~~}{zzzz|}~}|{yxvtrqppqtw{~~~~~}|{yxxxyz}~~}|{yxvtsqppprux}~~~~~~~~}|{yxwwwxz}~~}}|{zxwusrqpprtx|~~~}}}}}}}||{zzyyyz{~~~~}||{zywvussrrsuw{~}}||{{{{{||||}}}}}~~~}}||{{zyxwvutsstvx|~}||{{{{||}~~~}}}~~~~}}}}}||zywvtssstvy|~}||||}~}||{||~~}|{yxvussrstvz}~~}|{zz{|~~}|{yxvutrrrstwz}~}|{{zzz{|~~~}|{zxwutrqqqrtwz}~~}|{{zyyz{}~}}|{yxwusrppopqtw{~~~~}|{{zyyyz|~~~}|{zyxvtsqpoopqtw{~~~~~~}}||{zzzz{|~~~}|{zyxwvtsrqqqrsux{~~~~~}}}}|||{{{||~~}||{zyyxwvvuuttttvwz}~~~~~~~~~~~}}||||}~~}}||{{{{zzzyxwvutttuwz}~~}|{{{|}~~~~}}}}}}}}|{zywvutsssuwz}~}}|{{z{{|~~}|{zywvtsrrrsuwz~~}}|{zzzz{|~~}|{zxwvtsrrrrsux{~~}||{zyyyzz|~~}|{zyxwvtsrqqqrtvy|~~}}|{zzyxxyz{}~}|{zyxwvusrqqqrsux{~~~}}||{zzyyyyz|~~~}|{zzxwvutsrqqrstwz}~~~}}||{{{zz{{|}~~~}|{zzyxwvutsrrrstvx{~~~~}}}}}}}}||||}~~~}||{zyyxwvutsssssuvy|~~}}||||}~~}}|{{zyxwvutsrrrsuwz|~}||{{{|}~~}}|{{zywvutsrrrrsuwz}~}||{{{{|}~}||{zyxvutsrrqqrsuxz}}|{zxyyyz{}~~~~}}|{zxwwvuvuuvwwxz|~~y{~~}}}}}~~~~~~~~~}|zywutsrrrrrstuwy{~yxyz{{{{{{zzzzz{{{|||}}~}~}}|{zywvuuttuuvwxz|~{wvvvvvvwwwwwxxyyyzz{|}~~|~~}|{{zyxxwwwxxyz{}}zwutttttuuuvvwwxxyzz{}~~|}}}|{{{zzz{{{||}~|~~zwvuutuuuuvvvwwwxyyz|}~~}||~~}}}}}}}}}}}~~~||}zxwvuuuuuvvvvwwxyz{|}~}|{|~~~~~}}}}}}}}~~|{}|zxwvvvvvvvvvwwxyz{|}~~|{{|~~~}}}}||}}}~}{{~{yxwvvuuuvvvvwwxyz{|}~~}|||~~}}||||||}}~~|{}~{yxwvvuuuuvvvwwxyz{|~~~~}}~~}}}|||||||}~~}{{~}{ywvvuuuuuvvvwxyz{|~~}}~~}}|||||||}}~~|{||zywvvuuuuvvwwxyz{}~~}|}~}}|||||||}}~~|zz|~{yxwvvvvvwwwxyzz{|}~~}||}~~}}|||||}}}~~}{yz}~{zxxwwwwxxxyyzz{|}~~~}|{|~~~}}}}}}}}}~~}{yyz~~|{zyyxxxxyyyzz{{|}}~~~~}|{{|~~~}}}}}}}}~~}{yxy{}{zzyyxxxxyyyz{{|}}~~~}|{{{|~~}}}}}}}}}~~~|zxxy}}|zzyyxxxxyyyzz{||}}}}|{{z{}~~}}}}|||}}}}~~~}{yyy{}{zyyxxxxxyyyzz{||}}}}|{{{|~~}}}|||||}}}~~~|{yyz}~|{zyyyxxxxyyzz{{|}}}}||{{{}~}}}||||||}}~~~|zyy{~|{zyyxxxxyyyzz{||}}}||{zz{~~~}}|||||}}}~~~}{zyy|}|{zyyyyyyyyzz{{||}}||{zzz|~~~}}}}}}}~~~}{zyxz}}|{zzyyyyyzzz{{||||||{zzzz|~~~~~~~~~~}|zyxxz~~}|{zzyyyyyzzz{{|||||{zzyy{}~~~~~~~}|zyxwx{}|{zzzzyyzzzz{{{||{{zzyyy{~~~~~~~~~~~~~~}|zyxwwy|~}|{zzzyyyyzzz{{{{{{{zyyyz|~~~~~~~~~~~~~~}|{yxwwxz~~}|{zzzyyyzzzz{{{{{{{zzzz|~~~~~~~~~~~~~~}}|{zywwwx{~|{{zzyyyyzzzz{{{||{{zzz{}~~~~~}}}}~~~~}}||{yxwwwy}}|{{zzzzzzzz{{|||||{{zzz|~~~~~~~~~~~~~~}}|{zywvvwz~}||{{zzzz{{{|||||||{{zz{|~~~~~~~~~~~~~}}}|{zyxvvvx{~}||{{{{{{{|||||||{{zzz{|~~~~~~~}}}}}}||{zyxwvvvy|~}}||||||||||||||{{zyyz{}~~~~~~~}}}}}|{zyxwvuuwz}~}}||||||||||||{{zzyyz|~~~~~}}}}}}||{zyxwvuuvx{~~}||||||||||||{{zzyyyz|~~~}}}}}||||{zyxwvuuuwy}~~}||||{{{{{{{{{zzyyyz{}~~~}}}}||||{{zzyxwvuuvx{~}}||||{{{{{{{{{zzyyyz|~~~~}}}}}}||||{zzyxwvvvwy|~}}|||||||||{{{zzyyyy{|~~~}}}}}}||||{zzyxwvvvwz}~}}||||||||{{{{zzyyyz{}~~~}}}}}}}||{{zyxwvvuvx{~}}}|||||||{{{zzyyxyz{~~~~~~}}}}||{zzywvvuuwy|~~}}||||||{{{zzyyxxyz|~~~~~}}}||{{zyxwvuuuwz}~}}}|||||{{{zzyyxxxy{}~~~}}}||{zzyxwvuuuvx{~~}}}||||{{{{zzyyxxyz|~~~}}}||{zzyxwvuutuvy|~}}|||||{{{zzyyyxyy{}~~}}}||{{zyxwvuuttuwz}~}}}||||{{{zzyyyyyz|~~~}}}||{{zyyxwvuttuvx{~~}}|||||{{{zzzyyyz{}~~}}}||{{zzyxwvuuttuvy|~~}}}}||||{{{zzyyyz{}~~}}}||{{zyyxwvutttuwz}~~~}}}|||{{zzyyyyz|~~~~}}||{{zzyxwvuttttvx{~~~~}}}|||{{zyyyyz{|~~}}|||{zzyxwvuutttuvy|~~}}}||{{zzyyyyz{}~~}}||{{zyxwwvutsstuwz}~~}}|||{{zyyyyyz|~~~}}||{{zyyxwvuttsstvx{~~}}||{{zzyyyyy{|~}}||{{zzyxwvvutsstuwy}~~}}|||{zzyyyyyz{}~~}}||{zzyxxwvutttttvx{~~~}}||{{zzyyyyyz|~~~}}||{zzyxxwvuttttuvy|~~}}||{{zzyyyyz{}~~}}||{{zzyxwwvuttttuwz}~~}}||{{zzyyxyyz{}~~}}||{{zyyxwvuutttuvx{~~~}}||{{zyyyxyyz|~~}}||{{zyxwwvuttttuwy|~~}}||{zzyyxxyz{|~~~}}||{zyyxwvuttsstuwz}~}}}|{{zyyyxxyz{}~~}||{zzyxwvuutssttvx{~~}}||{zzyyxxyy{|~~}}|{{zyxwwvutssstuwy|~~}}|{{zzyyyyyz{}~~}||{zyyxwvuttstrutv{}~z{xwyx{~}}ztuxz|||{~|rort{~~~{vtmlry~wswwtqnnonrw~~{ywrprsy|}{pipqqrruyz|}}wotwplorty~zy}ty}ustpmnommhoqiu|yy}~|x~u|}ttuy|wqt|xzszvy{vy{{puopvurjnzwsuuy~|v~ywxuzovuuww|tspu~usmsyuowvwqo{|}yvsu{}z|zzpu~vs|~xwx||~z|yxt|~~~uy|}}snkuztu{zyy}}}|}yvwuqzqoltwv{xrw{~rqvtz}y{~~~vz}}|}{{swusswxvw~w~}kc{||sjhkjptu}zovsz|~x}~uq~~~y|zrt|{|{|}}t}{~tyw{}{ti}xsnorms{yvlpztxsv{{|wxy}{|w}|v{tutusyyw|z}}|yy}|}{mkiuzq}szv}yyjapptvjuqsw~}twuzxtzx||}xv{rutvmyxxwxzxmlietvtvwy|zxpnpmnxlurvxyxxqy}wmw}~|syzouuzo{{|vwx|{wmwvfhv{{s|xyyruknp~nvzuxvyvztt{ys}}~xz}x|swwrsyt|{vyzs|~|rvxofj{~wxzzzwotwknvopzxtry~uq{}xx{|yy}t{zuvnvy}|u|x}zz{~~|sqyvmiw~vyz{xtiuukoyymz{wwrs{}ru}}{zx{}}|t~}wtpr{u~|}v~~w~~~x~ko|uqkzytz|ysmm{mjsztmzwxwuw}{w~y|{}~||wyvwwqs{xy~}y~yy}}{tjtztrnzwv{xslq{jmw}umxyyrw}yy~{}{x~xuvtvupu}}z{}~|{{~~~}x|~ljwxspw~zux}wtmvuky{xosx|ws}{{~y~y~zv|utuzwot|x~|}{~z|zs}yiltswr~xtxor}ppyvntw~ysww}~x}wy~}|xtvzutzy}{y}z{|sy|kiqsvvxu||sp{xlzyvtnrzwr}yy}w|}y~{x}~~ztv{xty~}{{x~{{~~st|qhntwxtyv}uqxxltsumnv}xrw|}wzyx}}}sp|}svzz~~v~~{wsyumoruzw{ryqvxoprtolwyrxz|yz~xv}z|}tpz{swx~u~y~vsyxooptzw~r{qvxssstuku}{tv}|wyz~vx{y|~toy|tyz}}w}z}vtxwpmnvxt|~uzt{yusstukx~{tx|tx{|vw{w}umz~wzw~||s}~y||wuvtpnmuvu{x}v|xwvtsuhxyrvyrx~z{xw|zuoz}y{w{zt{y}x~|wttsroksut{zx|wwyuowkv}ztuzrxw{|z|y~wox}xzw{~}|xz~|{u{{wustvpisxu{|yw{xxz|ymvnr}zuu~tvy|~z||yz|przy|x||~~{}{w{yzzxzvwurutloxt|z~{{{w|{{qtum{|zu}vs~{}{|{}yxx~rowy|zy|{~w|{y|rywxvrsvplxtx{{~wz|ypwqw}{wy|qxx{|}}zxw|yosy|w}~z~xyxvzwswvwrntvlpvt~y~~|xzurvs{{xv~tr~zz}z~|z{xy~}vqvy|}|}y|w}z~v~}~pvtutopvrlutz~|~~yz|xrswvyzwy~rvz|}yz{zvz|trv|{~y{z~zzz~}x{x~orqtrmpvqoxv}}~~y|xxsswxyyw|~}ry~|~z{w|zx|zsrv{~zy}~y|yz}{wwnqruplrxrvxy}{~{wvxqu{y{yxwt}}~v}u{wz}|wrsy}zy~{zyw|}|{qoqtsmnwwtyv~}~y|}vwp{~xzw}ty}{}vtx{x{|ztst}zz{{x~y|||}{}y}xoortolrytxv|~|{{uytuzzx{~wv}|{t{r{xz|{xtrz~x}x{x|x~{~~|{{{zsnosqlnwvxxw~~~~{yvyq}wyx}{u|}}yxyryzz}|yvsvzxzxzy}}~|~xz|xunnsrlluwxxu~{}tzq~wxw}|v{~x|xsw{{}|zwtuzzzxz{z}yxx}vvomsrmksxzxt}|szs|xxv}x|~y~~wvu{|}{yxus~{{zx{|x|xxwtwqnrrmlsw{xt}|}s{t~ywx~}z~~x~}xvu{|}zyxts~||{zw|}xzwwvswrosrmlsw|vu{|t{w{wy}{~~~~w}|ywsz}}zyxtt}|||zw|~v{wxusvuosrmkqv|vs~z|uzz}}wx||~~w{}z~ysy~~{xyvt|z|}zv|}v}|v{rusvorqmkot|wr}z|xw|}xv~||~~xz}|}{uv~|yzxtzy|{wz|z{~v{q}{oxqpqnkmrz{r|{}~}}u{~|u~~{}}zy{}~{yt{}yyztxx~}~xy}}x}xw~tuptupqpllpv~uy}{{xwwz~|||xzz{{vu~~{xzwvyx}|w}{{}}|u{~|p}zovsqqnlnr}|v~{||~w{~~v}z}~xyx~x{sy|yyzvyv~|yy}{y|xv}vs~spvrqomlovx|~}{}|v}zxzy~|wyw{xzr{~{xzzyyv|~x{{|{|}vw|~sv|qpvspnlnqzy}z}{w}x{}xz~zwxxxxys|~{y{z{yy}}~}x}y}~~{}|uy~}zqxyoqvrpmmos~}}}{}yy~w{w}}wyu|u{vu~}zz|{|vz~{{|y~zxv|{}tsyunsvqomnpy}{{~~w{|{}xxywxu{u{ty~|y{{}yx|~}~z~y{~xz{|yruwrnxwrppsv|}{|~|}}vkoprsvz|{u~{}{wx{x~xw{~zxxqttuovzurqtv}||vv{{w|~|vz~vwqq|sz}~{z|}v~wsvz|zxrmlquyvsvorpsnoxtomoqy~~}{}~{rmwpsxsrrtkqzyz~~x~|~{~||~}vqr|~{z|~}y|y{zvzxz|~tps|{xtzxyz||{ysu~{rrnm{wr~y}unmw{x}urrsusqslqlmnittmjmnvy{||}utlkvrn{}qvyyxy|y{||y}}~|uqr}}w~}}}~~~yxz|wywyz~}|~||vx{yw{}zvz~|{wsv{sunqzupy~x~upnxyq}zxvwsstmtllpjrvnklnvv{|}~~wvmmurlrvyyyyv|{z|{w{}}vrr{s~~}}}~zzv~x||wxz}z||}{z~|z|z~wu}{wst}~tvpoxwrq~~|~yrot{pv~}~ywtsvotripomutllmsuv|~~~}{wslssqlvz}w~~wx}{}~y}ww{ysquyt}|~}{|}wx~y~{xx||~{x|}}}~~}~|xtw}zurv~{uvmswwsr~}vpovyqv|zwsuvpwrjprnuunnoutx~~|}}}}ywplsqrnv~~x~xxx|}y|vvzysqu~yvz~}{z{~xv~}{}yy|z}ywz}~~vxs{uru||uvnrwvwr}~}~uomsxuvz}xstxqwvmmtrrwsppvuu~{{}{~{vripqrtsy||x{{vy|xuw||tqrz|zy|{w}~{~wy}}|z{z|yvww{s{~wrsywwonvuywx~~}{}vomqwwzxzsv{}~{zxt~|yzvtqos{x{|z~}z|~zwovxz}to{qpps|{q}wyuqsyxvw~}~{y}uv{|{{}v|~~{xuw{v}wvlqwnt}{snpw|~z{ru{y~~}yw~|~xwzxtt{}{ok{vjekqlnqnmqnp|z|}{yvv{|~|{xv~}wnyxpmrlgwsoqkknv}|uqpuxw}uy~~|xtz}~~|}|~xx}uxsnrxrkjotxyvxrnvuw|{||}~~v}||{|zy|~zsnsztzvnqqnpmkvvw{ywtru}z}}|~x~~{qv||zpxytsljls{|vqptvt|ur|||}}yru~}|}{~|{|}zw|xomptwxvzrpwtvz|y{~~~uz~|z||z~~||{}vmqz}|~ssvsrlmwtx{zwsru{~wx~}|{}~|ru{~x{yyumlnt{|wrqvts{sp~yx{~~yqtz{{}}{}~|{{}{spruwvv{srxuuy}y{{{~vx||z{~|}z}wyopuwztyxvnnwsw||xtrty}yt}~~|~}utw}~z}{rnnsz}zusvuqywov{uw||trwv}~z{{{{{}~zttvvvv{yrxwuw|}x|{}~zwy}{z~~~y~yz}{~uosr{zw||vnuvt{}|wssvz}ww~|}}~}uux}z|sopv{}zvuwsrzuqv{sv{~zstuv}||{||{{~~|wvwwvv}ytzwux}yz|||yxy||{~x~zz}x||tptr|x}ypwwt{~~yusvz}yw|~~~}}}vvx}xvrrvz}{ywyuqywtt{}trx}~{tuvt}{|{~}{{}{yyxwu||v{zww{}x}|}z|{xy{}~{|z{|{{wuz}{wruux|zuvzux}}xuux|}y~}}~~~~}~~{xxz|~~yszwx|wuy~~zsxwzxz{z{u~|y{x}wqwvw{||}|}}~|zx~{~|z}~z}~{{{}}||}~|woysmryzxtxtu{z|x|}xvuux{{}}|}yrs{|spywrssuwz|~zuy{~zy|ysxv{z{{}{wzsnlpywvwyyurtz}uwuv{}|zxy}{{vtx{}}}~xmopt~~ztttmu~~}{|zx|x~yw{~{urqrvz~}yqmpx~zxvttuw{|ztvv}{yz~zrvvw~~~w~|tnkkmt}wux~|}wtzyrx}}zxw~}z}wuw||~~~}~wmonoy~|{you|}~|{y}}zzw{~|xtsrsw~}~{soptz{~}zwttvy{zuwy{~}{|~zswst||~w~~wqnkkp||zwz|y~~vvzzrx~{wy~z|}xvwz}|{~}{{~xprlmuwz{rx||}|{{|{~yx{~}yvtrru|{~~wrqsvwx~{vtuyzzvx}{|~}}|uxsryzx~x~zuqmkmyxw~z{|x|wvy~~uu~|xx~z{{xwy{|y}|z|}stokquuzvx|||~~{{{y|}xz}~~{xvsqr|~v~}{urrtvvx{vuwzzxw~z}xxwquzyw|{}xtpljr{uz}}zx|wxy~}uv|x{}x{xxy{|z~{z|yssllsvuyx|}|}~{|{v|yz|}}zxvsqt}w~~~|zurrtwxz|xvwzzxy~|z{~xyvqv{zw}|||wsoljs|wz{y}xyy|~xu}~y|}w~{yxy{}}~}z{~ystmkrxxxz}}~|{u{yz{||zxvsqs}z~~~y{vsrtx|~z|~x{~~{{}sp}|y|~{tp}zlfjvvqw|~z{{zvtw{zz~x{ssxtw|x~{y~x{wswzwqx|}zrp||rnvzsqu{yvy~~~}zy~~yyrs}}uqtqnxwory}}|{}}~xwyyus~}}|uppxxqqyvrtz~{{{w}|vtrqu~{xvtsv}~v|yu{~{{}zvxqnquwv{}}~upory}wuvzyvx}~~~}x}zxxvy}|xuuuw{vv~yqu|~|{~{ztuxyww~~|wrpqv}~{zzy}~}~xy}wttrry~{~rpqsuz~|yx~|}|wzvnpsvvwx~vqoqv~~{xy}zy{~~~xzzxxvv{{xttuvy~{wwt{~|~||uuwxwu{~}|ytqpsz||yz~xy}wuusqv}}|spqqsv{}{x}~|y|vppstttz{}wtqqszzy}}z{}}~|vz}xwwusx}|}wuuuuvz}{zv|}}}{uvwwvtx}~zvrpqv}~zyx{|vvvsqt}|ztppqqrw}~y}~~{y}wqqrsssv~|yvsqrv~~x|}{||~|vy{vvwurt}~|xystutux}}yz~|}wvwwwuv}}|yxtqpszy{zy}xuvurqxw~zpnopqty~{}y}|tqrsstuz{wwusrtz}y~~{{}yvzxtuvsrvwxuqrtuw{{||~{vvvwwxy}~wvvsqrv}z{y{{vtutrrzu}xnmnpsw|{{y}{srrstvx|xsuustw}y}|{|~~yvzvrttsrvxuuppsvz||}{vvvwy||~||tqttsuy}zzz{vstuttzuv~ypkmqv{~~||w{|urrsvy}|z{pptvw{|y|{}{uxwqqsttv}{sx}xqosx~~~~|{}wvvxz~{|x{tmptvx|{}zy{vrsuvvzvsyxqmmrx~~}|wz|urstw{~yw|ontx{~~z}{}~zuxvpqsuvx}yswyvrqtz~{{{vvwy|z~yt{~rkpux{|}~yzztrtvwx||ttvtqnotz~}yw|ztstvy~}{txwlovz}~{||}|vwxroqsuvz|uuwvurrv|}z~xwwxz~z}~zsuxlkrwz}|zz|ursuvwz~vvusspnqw|~{w{{ustuw{~|tv{omsy|}||{vwyroprsux}|vwustsqsx~}{~xwxxy|{~~~~yruymkqvx{}}y{|urstuvy~|xyuqsqnoty~~zy}zutttvy~zsx{plrwz}}|zvyyropqrsv{zwyupstqquz~|~yxxwx{}~~~~~}xqu~zpjntwy|}y||vrsttuw||y{voqspnqv{~|y}{vuutuw}~{tu~}umnty{~}zvxztpopqrtx}|wyxpotsqrv||zxxxxy}}}}}}zspx|vnkouy{}yy}ysrsstvy~yz|rmqtqpsx}~z{~yvuuuvz~xrv}zsmnuz~|xuyyroopqsvz~~~yvzwnntustx~}yxyyy{~}|||xqpwyuokov{~|xy}xsrstuw{~~xy|skottsuy~~{{}yuvvwx{~~~|wqsyyupnt{}xtwysooprtw{~~}~ytyypkqwxxz|zxyz{|~|{zzxqmrvurnnu|~xv{ztrstvy|~~wv{wmksxxx{}|z}zvvwxz}~}|{wppvwutqs{ysuytppqsux|~z}xswzrkox||}}~zxy{|~}{zyyvplqtssqpu}wuzytrsuwz}||uu{wmksz|{}|~{{}yuvxz{~~}{{ytnqvuuusu|wsvxspprtvz}~}z~{usyyqkpy~~~~}~yxz|}~|zyxwsmmsrrtsrw|uwzvsstvx{~{~xty{slmv|}|~|}|{~|wvwy{}}|{zvooutsvvtw{tuxuqpqsux{}~z~|vsx{tmlt|~~~}zxy{|~~}{yxwsmmsrpstrsz~vwzwsrstvz}}~xtz|tmlrz|{|}|{||wvwxz|}|{yuoqvsquvtu{|uvxtppqqswz|~{|utzzsmkrz}|}~}yxyz{}~}{zywrmotportrqw~wyzvsrssux|~~wv{|tnkpx{{{}~{z|}wvwxy{~}|{ytoqvspsvuswwwytqppqruy{}~|vtz{unknv||{}}{~zxyz{|~~}{zywsmotqmpttqszzxzwsrsstwz}~yuz}wqmmsz|{|~|xzzwwxxz}}~}|{zvpoutppuwuty|wyvrqqqqtwz|~~ytv{xrnlpx}}}{z~zyyz|~}~}|{yxuplpsolpuusu|zzyursru|xxvuvtrrqrromorx|~{sosv{{wwz|zsichpsqrxy}ywz~vqnkr~}~|tsyystyyx}zzzvtz|roppmoprwz}onts{~ursuxvs}|wqiu}zwy|vux}zpuopy|zrruyxqmys~z{z|}~x|}plvtongmchov{zy{|~z|sxootx~}v}zyv~~{xvrtrmqkmvrnxz~~z~yxootyzsz{zvzy~stpdjrw{y{xwprrqimrnuzpopny~{{xw~|~}{pjonr~||{y{xr{~{{x|s{}vtpnpswz~|}{y{~~{}}yvtqppov{rr}~~y||wsqlu{}{x|z~|}|tjptt}|uvpsxutvslstpvwoz{|}y}z}zvsimww~yyxw|u}w{~~|~~zx}{ytuwuow~}~}z|~~|z{y|yz}~yxzwnnusx~xz|y~y}w|umyxty|{vyzw~wztruontv{}rz{qqqoqvkluqktxx{~~~z}{~y|wtnlrkkz~y~}|y||x{x}~}xzstzvuw}x~|wvx~{}~|||}{{zzxv{rs{wy{}|}|{zszymmrpsv{{zyzuyrowrv{usxtsstprsvwomvy{|{{{}~}~}zxqooqtpq{x}|~~y{{wyrrrrx}y}v|}y}}t~}|~xwustxns{ysz||}~|zprxwvsv|z}}z|oltpiox|{y~}xvyxwnpqrwvrwrx}~~yyy}{}ywlilnw|}}|}}{}t|yrwuttwsu|z~|||}v~~~{}ux{}||zvyz|yrv~wyxxzupskrzw|{|{zukiryzztr|uus{wszwt}}yzz{}{|u}~x~|r{urnsypxxy{yw~zrxy}~u|~{tz{wqt{{|||~yx{{zzy}ywzw}}{tv||vz|}uw{qvwouyxxu}~}|sqvopqpsv}puwqsypnzxtp|yzzw|}||}}~v{vtniqnwnw{xx~|}|}v~~y{wysv|{v~|{{{{~|yz~spvwrswuyz|zu|{~z}|{qy}yxtrouryy}~||{}xyyvzrq~z{tsvwy{{{w{|r{wvv~utv}~|~{wxuuqlrojvw~y{z~yz~|~{{z|{zty{}x}~}~~}z|}zu}tsuosy}szxytyww}y}syzzutqu~y|~~zvywurix}vw~v||x~uxuzzw{o|vzu~{||~~||vyxtvmlqnq~z}~~|v}{yzz}|wzuvyw|y{{~zy}~|txusuy~wxwxy{~w{zqvuwytyuw}}}}|{{yznp}y|yu~~}z|w{{{zx}wzwv|xtu{zx|y}{~wwwlkpguvrxy}zx~||y|}{{t{z{sx}~{}|~z~xwxtsuxtux~|zy{yzzw|vz{xxsxsrzz~|~~xr|{uupt~}~y~}|vz~vxwp~sss~{u~y|}z{|tssjstjjlx~|~{~{{zx|||vszxu}w}z|{~|x{yz{y|utu|wx}|y~{xzz}uyuyrptuvt}~|~{||t~{ztswruv~}y}}wwxtusty}~s{}}{wuwosxkjfoupz~|~~|{~yv|wtwrv|zz}z|~~z||~z{vxu{vqwy|{w{xywvzxsxuyrvx{}}}|y~|zrwtnpryu|}~}x{vyvts{{{xv~~}z}z{xs|unlmspow}~y~{~t{{wwroqnv~w{|{zy~wzxzyz~~yoxsuz|y{~}{~ysvvtnuuzzx~|}s~~wxxqvpqumtxxy~|y{w~u}tyyy}w~vyzz{~~~~~wx{zytsqsppx|sxy~x}~}{wxorp|tpsz}~uyv~wtw|zvnw}wwrpz~}{}}{|}~yt|vwqwus|~wy}|xy{uospumuq{z}w{wxq||wtw}xzw|~{yywqoyriv|qsor}~~{y|xyxwry{uq}~|{|{}uz~xttwpswqpxwzxz|rvwwsx{u}}yx}z~vu~vrwurtmqytx}y|}x{{|vt~zuw~~}~|w~t{|sxvv|zs{wns{y~{|{~~}rxzzvxsm{uy}}~|y|~ww|wunuurnmv}}}{}~}~{uw}}yt{zz}|}}z}v{|rn|wknnlsxt||z~}zy}wwzx{~v|~}|~v|~x}}wu{uvumsvsx|{}uz{svqvyu||uu}}}~y~wx|vztnuplr|rr~}zy}}xx~yxvw}w}z~yz}yw~~z||xms|rtwtt{y|w{y~xrz}qsrq{}z~~{v~}yxu|wtqrxvpux|zzw~|wxvvxx}zu}~{~|rytqqkptpr{zx~yx|}{zz}z~uu|yux|t|}~|x{vxsxuoqtqvrv{{~{wzx~}z~xs|x}}|{}}{{zvyursvkmxumqp{~|}{~y~{y|w|wy{yy~{}x||~|txxwxvrrvoutw|}~}~yzvutpr|zuvzz}|~y~zyxvzxptvuunvywv||}{{y{x{xtwxx}y~{{~w}zvupx|wty|wyqlw}z}~{|{splmlhookhlkr}~|||zuw{{~ylnq|~jfmrvy}{}yv|tu~s|xsnpsuyxqt{|sxwwwu}p|yuvxupz|pj|rlqsuqu~|{}~~|wz|wyuwrvtqywyrw}v{srvwqluz|~vrwzvvyy{xt}}~x|v|zxz}fnzvmwxysqyx~}zx~xqrumnrjnmcordkdqtnosvvr~z|~|}{st{lxz~v{{uy|z|{{{|~}y{{osnkrmhjhzsjnqsvsz~wu{x|rv}ymlkuylvz}~y|~{|y|zvw||x~~x~txvknhfjjecewidooquv}}{uzyqur~{y}z~}|{{x{|x~{y{}{|xv}~v|vssnltrlgr{fmvqtvx{|~y~xyxowxposp|r~~r~~||}{{zpt}|x~uqwoplfiujeevmbssquvz~zwu}yuyv|{{{~yw{}~y|{~|y~ur~vzvwvolywjktzfnwqvwv|~{~|}~v{xouurtts}v~~t~{~zww~vmu|yusrrtmgnxfemviesouwt|~}|vwzxyyv|~x{}z|~w~}~wu|ot~yvx}uor~mitxqgrquytx{z}{yw|tqstvury|{|z|}~~~xs{{mo{|~z}|wqszrkkylbqsoemnsysu}~~{{wvy|xv||{}|}{~|||z{vr||oq{|}~tzxqs~ohzurjmovyru|yyyz~|xsptytsw|}~}{~~}vr{zloww|w{oy}uloxkexpnihmvxqt}|}}~xsy~xwz|~|z}~~~~~~yy~upy{opwx|t||st|si}vppinxzrr}~}xz|z{}||umsztsvz|}{~}{wqwzpnrtyx{rv{povrfvvjpgiuysp}~~z|~}rt~{w{|~}x|~~||~{|x{xprytort{~||wzsyxososoht{wqw~|wz~wy}z}|plvyswv~~|}~{{~z{{sqvupppt{xq{{ptupkzsjrflyxrqzy|~~{ouzz|~~||w~|~|z~xtyuprusqqr|}|y{tyvsuprrix{xrw{u{~|x~z|x|}qjuyuzx}}|~|}z|~uxyspssrqot|{ty}}sttrpwyjrljyxuq}yw~z~|~qp|}|~}~z~v{~~u||pvtporrttq{xvyvww|znvmr|yvs~uv|z~w|zwx}xknyx|{z~~|~{~vzqvrppqrusr}}yxz}xsvruvzrmtkvywrx|u|~~~z~vnw}~~y|~x}x~}}xtoqspoppuxsz|~~xywv|z|qttr|yws~ut}y|y}|{ww|znmwy}y{~{|{|s{ntppporwut~}{{y}yuvrxyxtmtqxxwsz{u~}}z~vpw|~|w|{x}wy|ut~mppopnpwyt~~y{vzzzrtvxzyuw~sw~yz}y|{wy}wnpv|}{}|z|~{~|{|stppoqnnuysz}|z|wxtvxwsovywwtv~vx}{{~{}|ssx~}~zyx{x}{|~~~~u{p|tmonpnlszuz}}|}yz~xyqx}xxvv}uu}vxy~xy|yqorz|}~zzy|zw}t}wooornkrxtxy{|yzvy{twow~vwsw}vxx{||~|tsu}}{xxyx|~~{~}tytyvomnpmjrxuyx}~z~v{rzwxty}~ux~~twx~y{|xrppz}||zyzz|wzxzyrnornjpwtxv~||z|x|syrvvvrw|}xyv}x}~|vtr{}|{xxx{~x|uuxvvrlmpminvvyv~}|wzxu{xtw}|yxzu~s|{{|ytrot|~zxyy}{|{vyzvwonqpjktvyvx}y}{{ytzqvut}{|y~{}zxz~~}yvst{yxw|~{zv~ztszruqknpkiqvyzw|~}v|x{zxs{}}~y{{zu|tz{|{xusox}|~}zxz}x{zrzyrxomqojltx}v||x}{~ztzuxtu}{~|{y}zyx}~|yxtu{{yw}y~yt|zto{qrtknolipv|}y{|~yy|{ysz}|~{}{w~x{}uuz||xvvqv||}{xy{yv{sr}pusmpplkrx||wz|}ux{|}vs|||~}|yz{~~ww}~zzyu}{~{wz}{}suyxmtyltpmpoknu||y~w|~~uw~|}||}|u{zzzzsv|}zwxuu|}}{}zx|}zt{zvm|sovooqnlqw}wx|~yu|~zr{}||{}xy|}||zt{{{{w}}z|wz~z|~}ss}xxmqylqrnpolou~y}x{ux}||z{yuyz|wzst|}zxyvxz~{~~zz}}xt|{{tn{rouqqpmmryvy|yv{xu}||zz}vzyz{zs|~z|zz}}}|~|x~|~}|{xrvzxukvulrrppmmqwz{~~x{}u}||yy~{txwzvzqw}|xyyxzy}{~~z~}}||uw|zxnvxnqurqnmpuzx{~w|z~u|||yx~}vyw~v}ux~z{{{}z~|~~z~{~{xzsu|yxvnsvnntrpmlot}{}z{x}||xx~ztxu|t{tu}{xyyzyw|}}|||y{t}z}vqoos}z}|x~~y}~xqy}xz}x{{zwx}~~|q}}zz}|vx}y}~}{wxqy~{~xyustx~}lrwtpuvyzvzyyuv~~z~zz|~|xwux{z|xy~y}wotwqstuow{upopt}|y{}}||}zprz{{~||~~{z~xuttvoutrzqovqvuuxx{~|xy~~~s|}vsv~|}{xz{{zppw}v|zqtruttqns~{txuz|x{z}zwvwzs|}{~}}uqs|{zxqzzrmmnuxyyy||y}zu|z}wrs{~}~{}}xutxtyw}zu{rtuqvqtwy|}zwxz~r{{uuz}}}{yz}{y|yyrsx~~xsvxutpns~zuyt|~x~~y{yxwzzt|}~~}~~x{trv~~{}ty}uonouwxzy||~}{z|rzz}ytuz~{{|{zvutzwzx{vyvvwqvrswz~~{ww|~xtv}~{vv{}|~z{|}s||w{uvy~}us|xvroqz~uyvwzx|wxwwy~x~z}}vx{zvswy}{u||sppsxuz}|}|}~z{ur~z|}wwyy|{{vtttz|z|x{uwyzrvtqvz}xwyw}yty|{ww|}|{|qw{v{xx{|yp}|wsoqxwyvv}v}vuvwzz{}}~xvxyutxz|~x{~vrquwu{}}}{{~|yvr|y||xyzy{{~|{srsu|{}}y~uv}{sxsrv{|ww{xzxvw{yvx~}}|~}|pxww{wy|{xr}xros{}xztz}v~~usvw|}z|{~|}{xuwwst{|~z|}vssxsz}~}}|z{zx}swyy~yxy}}w}z}~|~vprty{x}}|s|vwvqtyywx|ywzwxyvv{~}}~{~vvvuzvvx~}s||upryy{ux~yyyrtw{|x~y{~~x|wuvrrx~{zvuxsy}~}{xy~}wzwxxy}xww{}y}{rrtxur}{||nv|rwyz|~xwy~yt}yxzyzws}zxywxtw{vwy~yznn{|{|u|}yw~xorw}zy}}ww}xxzyqzvrrprw|~~}}yqrz{~~}zxy~~vwz{vz{z{qo~yxpvzy{xtywllpvsr{x|w{uuuw}{yz}s~~yyy{}tt}{vrrwyqmrtlntoopu|{x|zqnuw{}{xw|~{wvwzyw{ywxjpvnkjlpuwwu~|vxutxw~{z}~x|}{zy|upv~zyyztrvphkqrmuvs{~u}zxxux~~|ywzz{wvwuz|}xx{yolvsippmnqw||x|yrqxz~}yy~wx{wzx|~y|xjrvnijmrwwuu}uxxxyw{z~v|{{}yvyurx{z{wrurjkrrnxvt{~}x|z{yvyzvzx{vrwx||~yxzzqjwvioqopsx}|~xy{utz|}~y}~~yvww|z}yz{mnwrjhlsxyxu}~uuz{}x}z}ywy}y{tuxuy~|yz{tquojosox{vz~{|zzx|z{~}v|xy~~}{psz~zwxzwln{olqpqtz~z||vyzx{~~|{{xxwuu~~{x}rlswnhkrx{zw|~}zsy~{{|~v{{tzurwx{}yz|xqssmospx}wz~zy||v{}|}yzyw}~z}|qqz{xxyxnnzrnqprv{~wz~vwzz}}|~yuvzsszz}snswohlsy{yw}{~}~zsz{|}}x}~wszuquy|~{|~yqsuoqqq|zx{~}xx|t}}~{|wx|z|ypr}|{yzzvnuxqqpqty~}}|u~}uvz|}~~~}|vr{znx}zysqvvljpwzyvzzx}wu~{~~z}~{qxzqpuy}~xrywprsuwy{}|yx{|{|uz}|~usy|}zv~|swsoporv{}|}~|{x}~~zwx|}|}}}~{{zvr~wiciqttswtt~|~yvuvz~wx{~||ytw|qhitporsuvx{~}yy{}}wvyw~}vz~{zz{uppt}rnoruurqu|~{zu}~x|}z|zvw|zz}vqtryyvwvspsnmy||}}|}{|z|zussux}|~~~ysrv}{w~ystssrtvyzwt~||~}xtyvz~|}}x~vqoorx{z{}|xtty|y}|twyv~~{|}~}xwyz~~~~ypsqs|~}}}{vwunt{{|}}|}|~}{~~yvttuy~}wssx}z}ywwusstwyyuu|}vwxu|~~z{|uqoor{||~~yuvz{x~ztw~yu}}z}{}xwzz~}}~wpspt~~~|xzwov{{|}~|{}~~}z}~yvttuy}}~wssx~}}{yyxustvyyvu}~wwyu|}z{uqooq{{~|xwz{x}}uv{}ux{{{|~zxz{~}~ypsrs}}|z{{rt{{|~~{|}|}z{}~zwutux~~~~z~xssw~{}yzzxutuxywu{|~yvzw{z~zuqoorzzvw{{rowzxsrvqqyvqopu{}}~}ynr||yyzy{|rsxxy{}~||{}yz|~~|xrnr~wlszyzz~y~xvxwurqtwxwv}~|{~yx}w|~|rr}xlfdfq{x}xz~}zy{yv|zuvx|}wsxzxx|{}|szzvsjfjgku{yx{z{zty{z{||zuty}zy~~~}{zxxxvqqw}xwnournlnrx}{||zvrpponox~~z{ytxszxttutsrqpprz|vrnm}}yxzysu{|wvxru~~||~}wvvs}yz}|~{y}yzzy{zzwty{qy}xyz{{|||{{qx~snqsprz|yz|uy|z{||smmsy{}zu}xy|{}{rs~|{~wmxzwwxwvtspmkq||||xqluz{}|z{}xy{~~zqkmt~wu{~{wvwunmokpz}~~zuxurt{w~}|{zz{}zrnx~}wyyutqiowxyyyyz|~~|}~{vqoptx}~z~~y{xuw~uw|vtvxxxvtqnlqzyy|}vqxzz~}|}zuxzsoorx|}zzysqsmkqvxvwz}|wuw{~~}~~~~~}{|tlpuv}}{zqqxxvuttux}}ysmjkou}~vvuppu{~ywutrrqqpnpy}{~|{xru|{}~z{}{||}zwsqruz|~}zy{ytwvpquxyuu}z~~~~yx{~{~~}tntwy|}}|sv|{yxvutvy|zw{uqoprw~~z}xyxsru|}{yvsqpomkmx||~yqsxvz~|~z}}|xsnlmqw}}xvvuqvytuy||zx|}}zx|{ww{~~}}}~~|zsnuy{zvx{{tu}~}|{zyz}yz}z||zvsqruy~z~~vvyvtw}~}zwussrpqx}z~~|urxxw|}|z~~}zzwsollns|~{zytuysquy{|zz}{vzzvuw|~~zxvqkqy{yz~vsy{zzzzz{~|x~xwwvsqrtw||zxqsxxx{}z{zxutsttssz~z~||xw|{{}~}{~z|zzxuqoorw}|zuxzsrtvxxxx~{y~}zy{~~}|zxrnuxyz{vv{zyyxxxz||{zzxurrrtz~}wquwutx}{z|zvsqqstty~~~~}yswyw{~{z}}}yvuspnmnqx~~~}yz{vwyz{{yy~zu{~{yz|{|~{zytnruty~z}{~~}}{{}|w|zzywtrqru~xqvxussv{~~zwuuutx}{y}|~~~ysuvru{~~|{wtroljikr~xy}xuvwxyzzx{xtz|yxxz~}}yxwqnrsrx~~}}~~~}||}yv~zxwwwvtssx~{{vsz{xvvwz~{xwwvvz~xx~~zx~{wzxtvz}}~~~|{xwtqnllq|y{~xuuuuvxyxy|x~}{yyz}}~~~~~|ztprqmqw{~~~~}||~|z{yxwvtrpt|||zswzwussuy~~}yxxxy}}z{|~~{vxxrswz{|~~{wtrpnljmu|{}zyyyxy{zwxuy~~|zyyz}}~~~{zvpqrmlpuy|~}y|~}~zxwvtrppu|zz|y}urwxusqqsx}}{yyzz{{|~}|wtxuqswz|~~}~ztqomljjnx}|~~}yyyxxy{zvv~|tx}}{{z{}~}~~ywtprtposx|~|y||y|~{xwvvussx}}~}|wyxsxywuuuvz~{zyy~{y~~|}yvzystwz|}{~~xspomlknv}{|~yyyyy{}~{x|xw|}|{zz{~}}~}~~|xtoosqnqw{~}~{z~yvtssrrv}~|zw|{qsvutttvy~~~}|||~~~{wtxytsvy{|}~wy|xrnllkkmu|z}|{|{z{|~|wxywz|{zzyz}~}}|vrmnrpmpuz}{zw|~yurqqqqv}}|~~~~yuzxqrtsssuwz~|{|~|~}}yutyxtux{}~}~~{tvzvpmlllmqz}{|||{zz|}zvyyz||||||}~~~{}|wqnstppsw{~{|wx~zvtsssu|~z}~}}~|xx~wuvuutuuw{~|||}wtxyusuwy{}}wuz{uplkkknuyw{}}~}|}~~zy|{||{{zzz||~~~|~xpmqrnmosvy}}~xv|{vsrrrtz{w{~~}yx|{wwvutssstw{~}}~~}vtxxsrstvx{}~~vsxzvplkjjnttrx~||~~}zz~~|}}{zzyxxz}~|{|}xomqpkkmorv{|xuz~{vrqqquzyvz~~~~}zxzywywusssstvy|{|}~wtyytsstvxz}}~wruzxrnlkloutqv}~}|}~}{{|||}|{{zz{|}{z}|}torsnlmnpsw{}}|vw}{vsrruzzuv}~}~}{{yx{{xutssstvxxw~}uwzvrrssuwz|~~~~vsvzxqmkjlqtqpw}~~|z~|zzzyyz{{xz}{~{qnrplklnosw{~~|vw|~{urqruzxtw|~~~~}|zuu{{wtsrrrsvwww~|uwxtqqrstwz|~}~vrswwrljikptppw}{w{|zyyyyz||y{}yz}|snqplkmoqtx|~xux||wsqqtz{vw}~}}}}||zuqw|yussstuxzyx~}ywywtsttuwz}~{ysqswvpljkpvtqv}~wx|zzzz{||zy~}{x{}wpqqnlmoqsw{~{ww{}zurqty{vv|~~~~}}}}vpu}{vsrssuwyyx}~~zwyvsrstuwz|}|ytpquuplikpusqv|xx~}~~~}yy}|~~yru{y|{x{zwvxxwx{|~|}{xy~}{|{{~~~~~uy~~~~~~||}{sox|{{|}~}||rz}}zy}|~~|zzzyxyzz{}zx{}~~yusvzzxuvz~vv}wuuuvwxy||vry~~~{y}~{{}{urw||}~|{}~|xy~zuuz{xusrtxzxvvy~~zz}~~~~~|vu~|v{|vrv~~|{{||zxwz{z{{xvwwwwwxxxy{|xwxy~~|z{~|||vt~~|zyyzzuqu}~{{{||}|yw{~{xxyyvrtz}|}~zyxx}~zwussvyxvux|{xy|}}}}}}~~|vsz|y}}||zvrs{~|ywxyz{yvvvwwwxyyyz|{yyyxz~|zz|}||vsy}|}|vru{~}{zz{{|{xx|~{xxyzxtsw}~~}|}~~{zzxy|ywutuxxwvx{zxy{|}}}}}~~}xtw~~z|}||yurv}}{xwwy{zwvvwxxyyzz{||yz{yx{~|z{}~}~~ytu|~~~zuux|}|{zz{||zy{~}zyyzywttx~~}}}~|zzywy|zxvuvyyxxz|zy{|}}}}}|}}{vtx}}{~|{zywtsv}~|yxx{}{xwxxxyyzzz{|zxyzyxz~||~~}{wtu|{wwz|~}|{{{|{zy{}|yxxxxwttx~~~~~~~~~}ywxxwy~~|zxwwyzyy{{zy{||||||{{{zwux}~}~~{yxwvutw~}{yxz}|yxxxyyyyyzz{ywxzzyz~}|}}{zyxuw|}zyy{}}|{{{|{zyz}|zxxxxxwvy~}~~~~~}}|yvvxyz~}|zxwxzzz{|{yz||||||{zzzxwy}}~~~{xwvvvvx}~|zxz}}{yyyzzzzzzz{ywwyzz{~~}}~}|zxwwvw|~{zz{}~~}||||{z{||zxwwwwwwy}~~~~~}|{zwtuwxz~~}|zyy{{||}{z{|||||{zyyxxxy|~~~|ywuuuuvy~~{z{}}{zzzzzzzzzzzxvvxyz{~~}~}|zxwvuvx|}|||}~~}|||{zz{|{yxwwwwwxz~~~~~~~~}}|{zxutuwxz~}{zz{||}|{{|||||{zzyxxxxz}~}~~|zxvutuuwz}{{|~|{zzzzzzzzzzywwxyzz{~}~~~~}|zywvuuwy}~}}}~~}||||{z{|{zyxwwwwwx{~~~~~~~~}||{ywuuvwxz}|{|}}}|{{||||||{zzyxwxyz|~~~~}{ywvuttuw{}|}~}|{{{{{{{{{{zxxxyyyy|~~~~~}|{yxvutuvx|~~~~}}||{{||{zyyxwwwwwy}~~~~}}||{ywuuvvvwz~}}~~~}|||}}|||{zzyxwxxxz}~}~~|{yxvutttuw|~~}||{{{{{{{{zyxxyyxxy|~~~~~}|{yxvuttuvx}~}}|{{|||{zyyxxwwwxz~~~~}}}||{{ywvuuuuvw{~~~|||}||||{{zyxxxxxxz}~~}}}|{zxwvutttux}~}|||||{{{|{zyyyyyxxz}~~~~~~}|{zywvttuuvy}~}}|||||{{zyyxxxwwy{~~~}}}}||{zywvuuuuvx{~}}}}}}||{{zyxxxxxy{~~}}}}|zywvuttttvy}~}}||||||{{yyxxxxxyz|~~~~}|{zyxvutttuvy}~~}||}||{zyxxwwwxy{}~}}}|{{zyxvutttuvx{~}}}}}||{{zyxwwxyy{~~~}|||{yxvutssstvy}~}}||||{{{zxxxxxyy{}~}}}|{zyxwutsstvxz~~}}||||{zyxxwwxxz{~~~}||{{zyxwuttttuwy|~}}}}|||{zzyxwxxyz{~~}||{{zywvutsssuwz}~}}}|||{{zyxxxxyz{}~}}}||{zyxvutsstvxz~~}}}||{zyxxwwxyz|~~~~}||{zzyxvutsstuwy|~~}}}||{zzyxwxyyz|~~~}|{{zyxwutssssuwz~~~}}|||{zyxxxxxyz{}~}||{{zyxvutssstvx{~~}}}|{{zyxxwwxyz|~~~}||{zzyxwuttsstuwy|~~}}||{zyxxxxyyz|~~~}|{{zyxwvutssstuxz~~}}}||{zyyxxxxyz{}~}||{{zyxwvutsstuvx{~~}}|{{zyxxxxxy{|~~~}}|{{zyxwvuttsstuwy}~~}}||{zyxxxxyy{|~}||{{zyxwuttssstvxz~~~}}}|{zzyyxxyyz|~~}}||{zyyxvutsssttvx{~~}|{{zyxxxxyyz|~~~}||{zzyxvuutssstuwz}~~}|{{zyyxxxxy{}~~}||{zyxwvutsssstvxz~~~}||{zzyyxxyyz|~~~}}|{zzyxwvutsssstvx|~}}|{{zyxxxxyy{|~~}}|{zzyxwvuttssstuwz}~~}|{yyxxxxzy{z}|~zywwvwxy{uspnqvx}~|w{{ss~yyxsuz~zytw|vsptkmptmr|wvq}~}~z{{{{{~xy~}z~u}}~~}z|yrxpmsslhlwwqw{}{x|uv||zwutxzxw~w}ssu|}zxwvusyzlv|zwt~~{~wusu{twxz{t{rwmpmwvsoqnvz}zz{{}x{~}{|{sx|w~z}{{{~}|zzsvozloolxxvv}y{~wnxtvxu{~yqz}z~|}o{|w{xzznywx~w|}wy}xn{qhmmmyyw{y|z}w~{r{}~|y}|z|}|{~swuvvsz}pn}wneinsmvs{yv|t{}qzzr{|~yzqzynt||{}v{ruomwrnxnoxrsxsvzz{yzyzyxos}|{q|z}~pouv|yqvtwzknsgukkr}y~{}|{ux}zyt{u|}~}}mnq}z|u{tsgvfxgjhszy~z}}vvw{yr~|y~z|}}}|nposyv~v|nqllkpms|zzs~wr~{{{ryxxzy~~~wrnspv}||yv}urtmrtrny~~~wt}}zp{xv|xww{~x}wskskrxxzuumztsurx|z|~zo{y}~s}|u{|v~~w{zy~~}~~~xqktqpvzyyxvq{trupuyx{}m}~z~v}ysy|x}~zvz~||||qkpopw|zutnzsotswwwyp|{|v~|svzwyzw|{}}zwmrqqx~|zutp{vmsrwyzz~ux}}~wy}srxxy|w|~}|z||}oonov||usow|orswz|yzyt~|}yvvsvww~}}zy~x{roplsxzvrusqruy{|z~|p~~~~r}ztvyx}{v~xz{~{|vmpknu}~xsp}{qttxx|z{~rx||~}wywuwvxz{|{{z}y|{nnnjsx|vqwqrrww{|{}xo}~r{yuwyv~{yz~{yy|tjpkqv~~ysr}yqtvwwz|{sx||}yv}utxww}|}}|||x{|mlomuy|wtvsquxyy}|~}o~}|}~sywtu|w|~y|||xx|vhmmpy}yts|qswzxzz{~xr}||{~{uzvsw|x~z~|}|z|uw|shnkt|xuv|psyzzz{z~tv|~||}xuzvsz}|~{z}~|yxsvzninny~usxzpvyyzzzz}r|~|}||}vx{vs}|}x|{~{z~trwxkkmp}|su{tqvyy|{z{xs|~~}}ytzyuwz~~y~{}w}zqsxrhnowwrv~rsyxz{{{|szz~}}|vuyxt|}~}{{|~|v}tquxmkoq|ttzxqxzx|}{{xqz|}|}yswyvxz~y~{|uzyprwqinpxxsysv{xz|}{{qz~y||||uuxxu~}~y}}~zt{rpvvkkot}ux}ws{{x||{|vsy{}||xtxxvz|}z~|~szuotxninr{wv}|ry}xz||{xq{y~||ztwxwx{x}{vvworyrilpwzu|sv}yz||zzq|}x}}{{vvxwv|y}~}ytyppwukkou}u|vu~yy|}zzsx~x}~{|vuxwu}}~z{~~}~{tzqpwwkjnr|v|yt}zy|~zysww{||wuwxu||||{|}|tzrovxmimqzw|{t~zy|~{ztu~xz||xuwxu||z~z{|}uytouyoilpvy{~u}|x{|yvs~zx}{{uvxvy~xy{|~vwworyrikps~}yv{}xz~~ywq~~|w~|{vuwww~xz~||yuxpqxukinq|~yzxyy|zxsx}xz||xuvwv}{z}{{z}sxsouyoimpv|}w|y{~yus}{w~{{vuwwz~xyz||wuvoqxtjjpr~~zzzyz}zwr{~|w{{|xvvwwz|||~{y|swqouxninqx|w|z{~xut|{w~{{wuwwzyyz~{{wtunpwukjqrz|zyz|{wsx~{xy|{yvuxx~||~zyx{suqmsxrjnrw}}y}}y{~yvs}{{v|{{wuvxzz{}|{~}wyruonuxojqs{|y|z{xutz{u~~zzwuwy}{z~z}}~yxwrtmovvnltu{zz{|}wtvzzv}zzvuxz}yx}}vyssqlqxtmovx{|}y{~zvs|{{vyz{xvvy|}||~|y}~}~{uxqsnmtxrmtw~|z{z{xtty{t~~zzwuwz}z}x|{~{~vwtqrlpwwopxx{~|z{}{vsy{{ww{{yvvy|~}||x||||ztwqsnmtysnvx}|{{{xtux{t~~zzwux{~z}w}{~{|uwtrplqxvprxy}~z{~zut{y{vxz{yvvz~~{}}zy{}{{wuvqrmnvxrpxw}~z||}vtx{zzt|{zwvy}~~{}w~|||zztvrsnmtxtovw~~~{{{xtvx|s~~z{xuw|~z}w|}z}zzuvtspmrxvptwy}{{yuuw}t|z|yuw{}z}w{}z}zzuuuspmqwvprww~|{zuu~w}uzz|yvvz}{|x{~z}zyvuutqmqwvpqvu~||{vu}w}vx{|zvuy~}{}yz~~z}{ywuuuqnpvwqpvs||~}vuzy{zu||{wux~}~}}{y}~{||xxuuurnouwsour}|}|wux|x}s~{|xuv}|~|~~w|~{{}xxvtvtonswuptsx}}}{yuww~u|{}zuu{}~~{}x{}|z}zwwtuvqnqvwrrus}|~}vv{y|zu|}|wux~}~~}{x|}z{|wxvtwsootwtpur|~}}|yvx~w~t~|}yuv||~~|}wz|{z}yvwsvvpnqwwrsut~~|}vv{x|zu|}|wux~~~~}{w{{zz|vwurwsnotwvrvs|~|wuxzzwy|x{xtu{xu~}yttknpqqutqurtwqoqvxuuvo||uuuptqqspmpyzy|}|t~~wzzzz~yy}x~yz~|sl|{}|}{~{ros~|z~~}yw{tp~vwoknpoqtoqrnusnoswvqrnvxljsz}utqmlszvzy~|}}|yytzzz|}|z}|}zz}}vonj~{~||zyw}ypmr|~{|}usr}wnppppsonsmrtnnpuuqqqu}||riku~{xspt{xzz||{|zyyvz|y{||~y}}x{utuvrmon~~~}zzw|zqnr~}{{}|zsts|qrrrqtqnunswporvvssswyyzqilv|vsv}y{{}|{{yyyw|{yz{{~~x}|wyttuuqnoo~|zyw}ypot}{}{|xttu{rsrrsuppvnvwppswvstrz~~wzxnjny|vtz}x}yz{yz~xyvyzz{|~{wxzwttvuponr}~y{wy}voqx~}{}z~utrywtsrsutmurozspruxvtsrzx{tlkq}{vw~y|{z}}zzxzyvx|zzz{}~w}}v{vuvwtpnk|{{yx~yqpt|~|}~zxvrs|wvstuvntvmzwqruxwuso{}y}xokow|yx~zz|w|~yzw|{wv{zy{}x{uwvwxvsoit~~{{w}|tprx||}|~~z}{wspyzxuuvxrpzov{sstwxwunt~y||slmqx{}y}~y~x|~{{yxy{zuz|{yz|~|vzxzwwxxusklz|{}xz~yrruz{~}~|yywqr~|xvwxxpvxn|ystvxxwsny|}x}zqmnsy|~{|{v~}}yyw|}|xu||{yz|~zwv|ywwxxurjo{{z}w{~xrrvz|}}{y~xvqt|yvxyxoy|w}x|}y}|}uruzytj~{mifnvpqonv}|z|~~ur{zzzzwskq|~vwzmplptqlmqw|~xzxvt}|utqt|ret}vlklpqqlit{y~}~|v{ztpsyutm~tlhjtponls~}|{xwwwts{zz{zyrtvt{yuolrpkjntz|~|yy}z}ytzxxwwwrommsyspqsrqip{zz~{~yy|ytu{zwotx{xrnuvpqoq{~~{wtqrtxv~~|{|||yt}vyvx~~{ruuqmotz~~~z{zv}zvv{yzy}wpklnrt|ywxwwpp|~{~y|~zw{zvu{{uupt|{}wrw{tuss{~~}wuqqtxx||z{|}{u{sxxz~uvxtpqv{~yzzv~zvu~{y{z|voklptv}zxyyxqq}|~~x{~{w{zww|zuupv~|~xsy{uvtu}}}{vtpqtxw}~|{|}~{vysxx{~uxxtqsw|}}yzxw}zuw{{{{zunkmquw{z{{yqu~~{|~~w|~~yx|zwx}xutpy|}~xu}zvwtw~zyvrpquwv}}|}~xyuvyx|}wzytrux~|{yzu{z~yv}z}{}ysmlnrs}||||vq{~|{{yx~}x||ywz~}xvqs{w}x|yzwv{~}{|wuqqsuuy}}{vzuywy}z||xttw{z}zzvw~w|x|{}|{{wpmnppuzry}{yz}|x}|}~z|}{xy|{xrrys{}||ywz}~y}xvrqstst~}u}~wzyxz~~{wvwyz{{{wu|wxz|}}}z~~zsoopoo}uw}{yz|z~~w|}|}~~|~}zxz}~zvqwur~~yy~{x}zxtqrtsqz|yxyyzxxz{xxx~w}{yty{s|~{}||}xroppns|u|}{x|y{}{x}|||}~}zz{}zsrxru~z{{w~ywsqrtsr|}w{wzzxyz~~ywsoutny}x~|usxuv~~{{~~}~wyvqnuzsvx{vv|{||yxtry||z|tu}xs|zr{zvurqsvuv~}zy{|~|{}}{tpw~|vlxzw{|zxwuryzs|}{wzvu|}zvz{srvooruzsqvwxz|~tqru{~~|wws{{|}qvxsromorss{|}xwz~~zoot|wyxz{zwutptztw|{~xruxw~|xtw~y}yqstzwosvwyz~~|sosx|~}~toux|{v|wtrnnqttx~||wv{~}~yoow~z{}|zwvrqzxu~x{yrryz}{|xtx}}~utuyzqrwxz{~||}vosy~|z{tot{}v{ytronqtuw{|xw{~}}|ypowy{}|{xvsqzzt|xyyrrz{}z{~~xux~}vsuy{rrwxz|~{{}vptz|~~~xztou{~v{xtrooqtux~~{|xx}}|z|xpqyz|}}{xvrr{yt|~vyxrt{{}z{~~~wvz~~utv{zqtxy{|~y{}uqu{~{|{xxrqx{}x|wuropsuuz~|{{xy~}~|z|uosz}~}zxuqw{uv~{vyvsx{{~{z|~}~{ww|~|uuy}vrwxy{{|y~zrrw|~|~{xywquyzz|zvuqpqttw{|{~zx{}~}y~zqpu{}~~}zwrt{wsz}vxytwzx|z{}}~ywyxvyyswxyzz~~x~~trux}}|}zyyztuxv~~}|xvsqqttvz{|}|yz~}~}}y~~tprw}~|yss{xrw}wvzww{w{}{{}}}|xw{~}xy}tvyyz{{w{xssvz}~{z{}wzwuxvw~zxurrstuxy{|~{z|~||~~|zzqqsx}~{wqx{tsz{txzw{yw~|z{}|zxx|}|y|zuy~|}z|}~~~}r{~vr~x{vuvtusqrttvyvux}wqytxyos|vsvy|{z~{vs{~y{~sz|uwxvyxyyxxz{{}zwypht~utxqmyzuuxz||}{q{{pu{{wvussqpprsttqu|zov~~}qs{vrtw{~xz~xu}z{}|{tr~{|xzxxxvvwxwxvu|}wvvmly}zqz~wvxz{{z{{r|~}y{wutqz~zyutrppqqqrqw~wtwwryyt~|vvx{}~~|y{uz{x}ywyuvuu}|{yywuuvuuvu~|rpsrpzvw|xxz{{zy}w|~z}{vturtuz|zwutqpppprsv~}xqrxwytyyvx{}~~~z}wv~xy|tuttwx}|yyxutttsvv}~~|rmqus{{uyxz{{zy{{{z~~z|vqsqtx|~{xuurpppprtw~z}xopwy{uw{wx{}~}}}~xv~yx}|srssx{~}|yxxussssvw}}|{qlqvv}}uzyz{{zx{}|y}}y{~uoqquz~|yvusppppsux|x{vnpwy|uy{xy{}}}}}~xw~xx}zqrsuz|~~|yxwussrsvw{{zplrww{wzyz{{yx|{}}x{wz|rnqrwz|xvusqppqtuzzxzsmrxx~~u}zyz{}}|}|vzzvy}vprtwy|~zxxvtsssuvw~y|vnouuxw|}zzz{{yz}yy{~xx|xopruxy{wvurqqqsuu}wyxoovvwxy}yyz|}}~{~xx}ww|zqqtvxw|xxwutttuvs}z{zqotss}{z{z{{{zz~}v|zy~xw{{qpsuvt|}xwvtrrrturz~wxzrpttr{|yzyz|}}}z|zw~xvz|tquwxty~yxxvtttuvrw|z}vpttpwz}{{{|{z}~wv}x~zwy|vosuwtu{yxvtsstvsszvzwprtqt~z~}zz{|}}|x~w{zvw|yqswyvt~{xxwuttuwtq|y{{srurqz~}|{{||{||uyzz~xvz{rotwwrxzyxutstuvqw~xvytpsspvz}zz{}}}{y|x}yvw|wpswyuu{xxwuttuwsr~~xzzrruqs|}}{{||{|{u{yz|wvyzqotwwszzyxvtttvvqx}wtxtossqx{}{z|}}}{z|w}yuv{woqvyvv{xxvutttwtr~~wxyrqurt}~}|{||{||w{yy}wtwyqmrwxu{{yxvtssuwsw}xsvtoqtrx||{{|}|~{}wzzutxxontyyx~xxwusssuvs{~xtwtptuu}||{{{{z~{z{w|~xttwulmtyy{}yxvtsrswvu|ysqtpouvy{}{{{||}~yw}|vsuxrlpx|{zwvusrrtwuy~ystupsxx}~}{{{zz}~||vy~ysruumkrz}}yxvtsrsvxw~|ysosqouxz{~|{{||}yv||vrswsknw~~~{wvusrqtxwx}yrruqsyz~~}{zzzz}}|vx}xsqtumjr{~ywvtrrswyw~~{xrnrqpvy{|~|{{||}xv|{ursvrkoy~zwvtsrruxwz~|wqruquyz}{zzzz~~~zuy|vrqttlku}~~ywvtsrtxxx}zwposqrwx|~~|{{|||vy}ysrtvoks|~~~xwutrrswwu}ztpttrwxz}{{{{||}ww|zsqrupjoy}|{xwutsswxv|~{ytnqsqtvw}{{||~~yw}{ursvslox}{{xwutssvwtx}|wqsusuvv}~|||{|{|yw|{urruslmv{y}~zxwuttwxtw|zvoptrsssz~|||}~|}{x}}wssvvnmv{y{~ywvuttvwtt~|ysqvtttsx}|||}{z~{w{}wsrtvokszxx{yxwuuvyvs}~{xrostrsqt}~|}}}}{~~x{~zustwslqzzw~{xwvutuxvry}{vqsvturs{}}}}~}y{yx}{urrutmmvzwz{yxwvuxxtu|zwpottsrqv}}}}~|||x|~xtrtwqms{yx{xwvutvxur{|zuptvutrt}}}}}|y|~xy}ztqruslnwzw{{yxwvvxxtv|zvpnttsrqw~}}}~|||x|}xsrtvqls{zy{xwvutuxvr{|zuorvuusu}}}}}~~{}~xx|ztqqstmmv{y|{ywvuuxyuv~|yvpmruttrx~||}~~}|wz}ysqrusmpz|{}xvutstwxtx~|zvpouvwvv}}|||}}}~yvy{uqoqspkr{}}|ywvutvyxv}}}ywslntuvvx~|{||~xw{ztqprtomv~~yvutssvyww}|ywqmrwxyx|~|{{|~~zuwzvqoorrloz~ywuttuyzw||}ywsmlswxxy|{{|~~xvzzupoqtqmuyvttssvzxw}~|ywrmpwyzz}~{{{|~zuvzvqnnqrmo{xvuttuy{x||}xvsmlsxyxy~|{{|}wvzztpoqspnvyvtssswzxx}{xvqmqxzzz~}{{{}}xtwzupnnrrmq|}xvuttwzzx~}}{xvqlmuyyxz~|{|}{vw{xroorsopz~xutssuyyv{}~ywtnmuzzyy}{{|~{vvzxronpspnv~{wvuuvyzwy|~ywtokqxyww}}||}}xw{ztpoqsrnu}~zwuttuwyvw}{xvqmryzwv|~}|}~}~}wvzztpoprrnr{|~}ywvvvxzvv~{xvplowxusx~}~}|zxxturqpw~}|~{zxvw~{u}xz~vpp{{|{uu}}~~|~wtyofgqwvsz}sxtvvoloqv|y~{{xt{xn||zytrwxy{{zuqtnjlmlty}|v|{wwxzz{{{vy|wuwv{rr|}~{y}yv{~~vsprnq}||}uqqttruwwr{}z|w{~yv{}zxw{ztw|z{zqx{~{|wvzypqy}|xuyz||t|uqststtw}}wwuw|y{~|}xutssuw}~}zvztrqqptxx~~y{|y{vuwyzzy|y}~w|yuz}{yxt}}w|v~z|y}}y~{yrtmux|{|x{y~~{zrtqv}{zswrunwz}yz|zvyz{sxx|zz~wxy{xxswzusxv|~z~{z|~{xy{{{x~|~vzvuttrp}z||}y~wyz}{uusuq}}}wxylmnx~}~z}~~~yz~zv~tsv{|~~xuxs{}x|u}}|z~}|{{{zv~{~tuwwso|~{zx}}}~y~~ytxxwq}~}yxqtyx|~}}z}~~}}zyw}zzvw~|~~}}~u|~z~yywu~wz}}|{w|{y~w|~zwx}nmmsz~~z}~z}{{xqmou}ywxqtrvy}{~z{{~|{}||x{vyz|~{{v|uuvz{z}}|{}{z~|{w}~}{v}|}~}zsxxuu{~||}~|}~xwz}twzxx~~yz{up{~{{|}y{~~~yz|{z~}w}|{}vwwyxx{~~zz|z}yxz{|tvw{}}~{|wwusrw|{{xxx|~{yxwuuzz~wqnvzqw|}~}z{}zts{x{||xzxvz|~||}|~}xvwx{{~}|x|}|~wr{}zw~}zy|}}|}~}}{xzx~}~ywvvt{zosz|xxyzyonvz~}z}}y|z}{xxy~uz}~~{}~{z}|xwyr}~}rz|uonty}~x~z|}|{y|yv|wzzx{~uttvvv|~y{}}|{~ux|zz}uzw~yywwxur|{}|yx~~|xy}{vx}v}||~yv}}v~~}~zzrsy{yxz}xwyvvzpxz}|||y|}uz}wu{zy~twvuwyy|{~wx|}z{~~x}~ux~z|y{|vv|}{~{~{~{}yyy~~}yv~~y~zzvsmpyz~|{{wy~}~}y|~}}{}zwxxs|xy~~y{||ux}}}|zy~~~~|vyxxw{y||y|}~}z~{{~zx|}zyvnsv{}|zxwy}{w|}~z{|~}}z{ytwzz}~~zy|w|~y~{zz~}~~vxyvrs}}~z{|~{~z||xty}~|tsstz~}~}}}|y~vz{zzzy}}{~~}~~zsz{y|~~|zyzt{|w}{||~~z}~{}wspxz}|~}}|zyyu}{x{~w}{|uvxw{}|{z~|~||{{xzww|}|}z~yw}yx~}~~zzvyyx~y|}}x{~vrs|wt}~~||}}w|yv~zwyx|z||{xzz{zzz}}{|y}}~z~{yzvvyz{||}|{x|x{}|~~zxxv{w}~wy}~~yz{wu}xr{{~~{~~{~zw{vtt~y{~}{|~}zy}xz}y|}|~|}wuyyz~}~zzz{||}xz{w}~|zyww|{~ux~~zz}~}{zwqzzw~~{|x}vsr}v{~y}~wy}x~}~}~~{}}xx{xwyz~}}~{yy~y|~xvzzy}}yw{zu|}{y|~||~~~}~{{}x~v~~zv{|sps}ps|{{t}{}z|{y~{x~||z{v}}wxy{{s~|xw}{upw}y~zyw}u~}xvz{~z{~xx~|~xu~~{|wsn{mpyzyz~|wxz~|}{}{~x}yzut~tz}z{}}|y{}yw}x}zz|~|}xvytxvt||{{~z}yx{~~yz{~~v}qvy~{||~}}}|~|{|ox|ywx~{}~z~yz}{vyyv}{|yvy|~~{{~x}z}}||v|ztwqxxv}~yz}}~|z{vz~~zwwyxxsyzt|}|z~~~}||{v~~||vzzqwpxzr{{}{{{z{~}zzy||}v|~|{qzy{|}|~{~|{xytt{~}~yy~y|~yx{ww{y}}vvy|y~}|v}|z}zw|wtt{uy~zxt||}{zv~z{|||{|x{uuvvv||}}{|~y~|~|u~}zy|{s{ps}tst~x}}~z|~|||yw|yx{|xuxsxz|z~~~xvvvz|}~|~~zz|utyzuxx~y|zwv~{z|{x|}{{zzzvty|w}|uu}|}~}~x|wzv|{|~zz}wwwvsvzxz|||}y}}yy~}|zwwsr|soq||y|}}}y}}zz{}yzt{wuvywx|}zyv{x}}~~~}{~yuywtxxtyt|zv{~|xy|}}}{|{vv|v~|rv{}y|}}~~~~zyxu|xz}}}}yxwyxyvvz{v|}|{}z{z|~z~|}{}wxrzzror{uxx}{z}y~~y~x{zuvyusuxz}~}~{}{w{~~ywvuzzwytvwyxuywu}|y|zu{~{wy}z}uy~u~}yqt{|j{|xxxu~~{zw|ww}~{}|mtwrolv|utxk|}}{ozzwrhltzywz{y{y}vn|ovrq|ywuz~w{|vx}~zrriuzwvyx~vw{y}tur|zyx{|vsrz}u|zo}yyxy}|{npov~~}tqxvloqvqrtpsupxzqr{~}|z||t|}{}||~{~z~wvqkdksx}vvw}sxxry~ux}r~y{~zt|owuqyxx{xzv~}}urkoux{zxrsmwqpslswporwmx||}}}}yx|{x{z~}|}{{vmlkgpu{|ys|~rztt}{vv|ux|{~ytwtyqt|~xzuz~vyqqkqw~|xrpm{opqlrwtquvm{}~{|xy}|x~}x|}}~{{ukmfgpv~zwr{|tztw}zwzsv||zwsswru}~~xztw{x~unrlqv}~ytqm|pmpotutuxxlz~}~wy{|z{x|~}~{y|{tgligov{wt{pwvx|{z|wu|}{tvrvut~}zxxv}u}tjqmqvzssn{vkpotwvuvznt~~zzzx}z}|{~z|zywyvifkhswwwuxrsu{|{}~}q}}sxzuvyv|{v|~t~z|~z{~zknppx~~wrns}lmnruwxwztm~}~w|y|||}yy||x{rvvmdlirzyxu}qtty{|~~rx~~~~}uvztu{z{~|wzv||{||ywzzmmqp{~ytrq}oknquvxy{xm~~x}z}~{yy}}}v}{psvnemlt{{xv~osu{{~}rz~}|uvzwu|z{}}w{v|z|}|wuzyknpr|}ysqu~omosuwzx{vp~|w~|{~~|}|z|}u{umrvlglmx}{xx{orv{|~}q~|~~{ztwxxxx~zx}vx|~ru|vjoow~~ysr{{lmpuvz|y{nw}|~~yy|}{}y~|~{w|nmuthjkqyzx~trvzz}}vu|}|zxuwxv{~x}||w|}{}zuqy{nnos{wuyqkptvx}z|sp}~|}~|{y|}|{|~|}u|rmtxkijnuz|y}xpvz{|~xs}|~zyuwyxy~u}}~{yyz{xqx}qloqw|zuzvkpvvw}{zvn~|z{|xz|}|y|{~|wywmryqhjlqx{z~rsz{{~|q~y{{wvwzwvz}~|}w~z}|ru}ymnorx|vxrnvwvz~zyov}y|}|{yy}{~{|~u|rnuxlhknrz|~|}qx}z|~xs}zzzvvxyzt~{~~{xz}||{rv}vmnqsz}~u{~ppxwv|zxoy}~x}|}zyy}{|}{~~~}uzpovvkilos{||}|rz}z}}vt}yzzvuxyz~t|~|x~z}~{{zqu|vmmrs|~v|spywv{{xox}~x{}|zxx}|}||}}|}sxpmtwnilps}}~{ty~{|}ws~w{{wuwyyu~~~}w}{}~~w{qryxnmqs{wzypxyvz}xrs~{x{|xw{|zz~}{~||ustkovrjkqr}zzu~{{~zszyx}zyuuyy|y~~{y~}~~}vxuotysmpux{wst{wx}zup|}}w|||ywy}~}{~}|}~xxpullsumkqt{{~u}}z}{uu}|vzzvtxz~y~~}x~}}|}}wuunryvopwx~vws{xx|{vpy}}xy}|zwx}~||~}{~~~wyptmlsvokqu{|~w}}{}{uu}|uzzvtwzy~~}x~}||{|wutnsyvopwx}wwv|wx|zuq{|}wz||zwx}~{}}{{}~}|vwpslmtuolsu~{x|{~ytx|{u}zzvtx{}{~{y}{y{uvqouytnsw{z{v{{xyxssz|t{|yvy}}z|y{|wxsrpkpvsmnuu}|}{||vt{}vzz{xtuy}yy}|{~|yxuunrxwpovuz|z}yy}{tr{z|wx|}zww{|{~|z|{~|~yvvsrlnutnlsr}~||~wt||}xw||zutx|y}z{}|}~}yzvvpqwwqnus~|{~zy{}urx|{zu}||xvy}}~~|}}y|}~||uwtsnmsuqkqqx}~}}yuxz~t{|wtvz~{z~y|z~~yyxwrptxuoqtu}~}zzystx~u|{}zvvz|{|y|{||xvvtqmoutnmsp~}}wv|||zv}|{vtw|~z||{~}{}}}xxxvqpuxtotsy}|{zwsvw}t~|}yuv{}}{|x}}z~{{wuuupmputnosq}}}~wv}z}yv||zvtw}}z}|{~|z}~||wwxuppuxtotsz}|{zxtvw~t|{}zvv{~}||x{~}y}zywtuupmouupotq~}~wv{|z|t}|{wtv|~{}~z}~x}||{{xuwvqotxvqtuw}{z~{tu|w|xv|}{wvy~~}zx||yz{wwtsurmmsvtpus{~~|zvwv~ty{|yuuz}}{}xy}}z|{xxuuwsoqwyusyv{{{vtw|w}r~|}yvx~{|~vy{yxzvvuqstnmqvvrtww~|}vv|w|yu||{wuy}||zw{|z{{wxuswtopuywtyw{|zxtwu~s{|}zww}||uxzywyvtupsuomqvxtuxw{|xqpu|rvsnzutsopy{nlxshihhokhjpuutzx||{{z~}zklxtyy{wyy{{||ppvwtvquvpptz|z~|}{|w|ystsx}wrt{u|wv{{vop|ojoz{ongglfehorqrut}~~wmjt~|~vtvv|||yy|}|qnrx}z{xs{wsuz~~z{vtss{yrqu}yu{q{{xwrot|qims{}yntpiimrrptqy{}}z~~xuojn}yyxz~|{wz}|unqsx~~|~t{{tuy}~||zz}yyu{|uqt{|u|tx}yytop{|tjlnt}vzyomostrtqv{~~|~||zxrkju|{yy||w}}}yoppty|xzvvx|~}~|}~y|{||vz~xrty~vzxu}zzwqot~~}znkknvxvppsuttsq~z~}~}}z}zwojmy}|{x}}yy||}tpppu{|v}vwz~~}~yz{z}}{w~}vsv{|v{vy}{{vqpx~~}vlkkow|}ursuvuvrt|{~}}~}~{|zvnkp{|}{y}~y{|}||rpopu|{w}wx{}zy{x~{x}vtw|{w{vz|{{vqqz}||tkkkpx|~wttwxwwru|{}~}|~}~z~{yvokq|~}|y~z{||{|rpopu||vyy|z}wzx}}x~~xtw{|xzwy|{{wrqz~zzukkkpx{zvvxzyyuuz{~||~}}~y{zxvqmp|~|y~|y~~{y{uoppu{~|x}zz{{|~}wx{zy{{vvy}zyywz{zytrw~}yvvmjlpxxxwwz{{zt}|~||~z~~~|~}|zwywvsoq{}zz~~z}~{xyxppqt{zw{|~~|~yz{xv|{|y}wvx|{xywyzzzvtw}~wtvojmpx{~zxx{}}|v{~|~z~~z}}|}}{zwwvutqt|~{uss~|~{}|}|qpu|}zrz|ryz}z}|ww~|{zyw|z}}}|~yt}{}|z}mkx~tjhshoyrrty|~~x|}|xpu~srwrxvsrt~|z|zppv||t}{t{}{v||zxuvtt{{wwz}}{{||}|zvw}~}znjpztsvhsvpqswz|yu}~}{}{y{wsrz|{vztsqx|}|z~xvysorv|}zw|||ytz}~~wxsx{xuwz||xyzzzzxvy~~vwrknr{{wr~wttvz||uy{y{|y}~~zywtrt|~|wtv~}~{}}|uzwpqrv~z}w~{zyuxzz{|uw|zwwz|}yy}z{{yvu|}vxullms~u}wvwz|}uxz~yy|y|}z~}{zvrpwyvu}~{||uyzrpory|w~~yzvwyu~yv{{xwy{~|w}|z|{xuw~~}ywyokkmvz~{xwy{~yt~|z}w{zz~x|~}{{yupqy~~yu{}}{~zu{uqpos{~}|}yyxvyuu~wy|zxxz{yy{{|zwuy|}uyvmkjnxz|yy{}~ww{zzwzy|}w~|zzxtpsz}yw}}|~wv{tqoot||}xxvuytw~w{|zxyz|wzz{|zvuz|}txtmlkoy|}{z|~wy~{zzvyx||wz~yywtqt{~zw}}|~~wuzsqpot|~~~~wuutyuvyz}{yyz|yxzz{zwvz}}sutmlloy||{}yx|y|uxwz~x}~y}wwvtsu||x}~}||ryuqqpt{~{~|ystrwyv{x||zyz{}u}}x{zyxz~}~votnlnpx}~||~w~~z{wuvw~|{}v~ytvuuv|~~yy~~~|~stwrrrtz~|~z}{qqqu{yy{}~{v{w{tiomlps{ytuxqlqjehjrutz{u}{tvvwz~{s{utwrrynlrnoqtz~|yz{qopt}|vptvsulmwqrtuvx}}}}wy{zntsqux|stuokqmhkmuwu~xv|v|wz{|wptw}sruiinjlmpv|~||~|z|z||rrtzwmqz}oqwpqrstvzy}~{z|wtz}yqxutwz{tszwsvnjlowtt~}ux~}z|z|}~~wopwzz|wkonkmmpv{|{z{z~z~yrtv~~{qov}u~ztvvuuxxz{y{{uv~~suwsuvy~wsv}z{yonpvwryyvzxy{{|}~{spvw|~rprmmmnry{{|~}z||}}tsu{~yuorw~ywwwvuvvvzzz|xv||~xuxsttu{{vuy}}spqvxqv|~{ux{{|{||{}~xswuwysupnmlpuyz~~}{{}}xsuz~x||rrty}yyxvvus{{{~y|zw{|z~uyusssv}yvw{}{rruztry}}wvx{{{||||}{}vwxt{vwtpommrwx{~}{|}}~utw~{wwrsuz~|{zywvst~y}zy|yx}y{{wyttstx~~yvx|{zstyzruz}~~}vwy{~~|}||||z~{vxwt}wxtqpnoswx|~~}{|~}~uuyzxvrsv{}|{zxwsv}x~yy|xz}z~{yttrrtxz|~}z{{ww|}xz|{ru~tlnty}xy}~z|s~xwvu~~vo{{qnpuuuz}~wvz}z~}uqsv|wmpvrjmklqor|~{}yyvqr{{z~|{vioxxxnlurlmqu{{zxx|~{{}z~tprzzurooqprrw{xwy}~zuxtv}{}tw~xrlrunnuuosvuz{y~{{z{~}|~|xwwzun~ymqunkoty}y}yy~|}}uxvv{{}phvymnprtv{zwx|{~~ww|~tw~w~{tuzzps~qimrkkpotxw~}|{vsqx~~|~}|skyxsvvknvqnquz~z||{yx{|~vxyywnjnz{wsqqpuwuuy~}}y{}uquyvyw~yy~|vrsy~tsuminorwu{~{xuqqtytpsrp|~{npwrnquy|~wy}xwwy}wz{|{vnkmr{}zyvyyvvz}{}}wyyqouyvzxz{zussw{}|||rosswxv}}}ywspruywnotrs~~rw{sqsvz}~v}|wwxz|||vz{ysmlnt|~{z}{xy|}zzw{wpqxwu}z{}z|xtstwy~~{rsuvzvx~}|xvqqrtztostovyt|xrrtx{}zxywwxyy|yy|~}wpmlou~|~~zy{|y}}wyzspvxrvzz{}}wutttxvtwx{xv}|}{wrppqu{xruunqzv~|ustvy{}|w{xwwwvv|y}~{somlpw}{{|yz~yx|vquysszz|z{~zwusrr}~vyz|zv{||}ztqpoqv}vuwqnt|{}zutuxz|w|yxxwusyy|}xqnlmqy~||{x~~|wzzssxvpu{}|{|~ywuspt|x|}~xx}{}}xrqporw}|uwwoov}{yvuwyz|}w~xwwwtr|y}}vpnlmsz}}zy~{vzzstytqv{~~||}}xvurpv{z}xy~z}}wrpoorw}ztwunpw~|zwvxz{}}w~}xwwwts}y}~~upnmnt{~~{y~{vyzssxtqv|}}|}}wuusqv}y}zyy{}xrppprw}}{suvoqx||xwxz|}~w{xvwwus{y{~vonmot{}z~|wwzurvvqu|{~}}~~wuuutvy{}y}{x}{sppqsw}{||tqurpx|zxxz|}ywzvvwxvx}x}~}~ypmnqu||}~}yuxwrtwtt||~}}}}wttvww{y~z||wz|uppqsx|{y{upttrx{|yyz|}{v||vvxyxxx|~z}yqmoqv|}|}ytvxrswut{}}~~|{xstwxx|y~||}vy|vpprtx|zwyupturx|}zz{}~zv{|vvxyxyx||y}ypmorw}|}~}ytwxrtwtu|}~~~{{wsuwxx|z|~{uz|upprtx}xwytqussz~}{{|}~xw}zvvxxvz}y~yz}vnnpsx~|}|wtxvsvvsw}|~~z}|utuwvy{~|ww}zropruy~|vxxrstqt|}{{}~|wzxuwwuuz{|x}{qmnpsy}~~}ytvyuuvrtz~~{|xttutt~}zu}}tooprvz~xxzutupqx~}|}~~xyzvvvtr{}{~x}~tnmnptz~~~{vuzwvwrrw{~~|{{uttsqy}vzxqoopsw|zvzyuuqoty~~zy}~xvvuqu~{yyzpmmnqv|}~}ytxzwwuqtx|~{}xutspr}yv~~tpopqtx~~wwzwuuopvz~yz|wvvsqx~{w{xommorw}~}xtyzwwsquy|~}{}wttsptxv}spopqty|vvzwvtoqv{~zz|wvvsqy~{~vzwommorw~~}xtxzwwtquy|~}z{wttsqtyu~upopruy|vtxwutopv|zy}~wvvtrx~{vv~ypmmosx~}ztuzxwuqty}~~~yy}ytttss}|tyyqoprux}}xruxuurpu||yzzvvvtu~~{yry|smmpsx}~|vswyxwssx}~ywy~|utuut{vu~|spprux}~~}yrrvvuspu|}yy}|wvwuu}~{zrv|unnptx}~|wsvyxwtsx}~~yww||vtuvu{wt}}tppruy}~~|xrqvvusqu|}yy||wvwuv~~{yqv|unnpty~~|wrvzywssy}~~~xvw||vtuuu|~uu~|spqsvy~~}{wqqvwurqv}{yy~{wvvtw~~|~uqy{rmnquz~{usxzyvruz~~~{wvy}zttttv{tzxqpqswz~~~|ztptxwtpry~{z{yvvtt{~~}zqt|womnrv{}xsv{{xrrw{~~}xwx||vssrr{~uw|spprtx}~~|{vprxxuoouz|{{{wvsrx}~|ss|yplmosw~~zuv{|ysquy|~~yxw{}xtrqpvxv~vqoqsuz}~}|yrqvywqnrw{~|{}~yvtqt|~||~~wrx|unlmpty}xty~|vqswz}{yxx}|vsqoqz}vz|tppqsw|}~|{vqrxyunntx|}}|}xusqw}}{|}trz{smlnquz}wu{~|uqtx{}zyxy}{urqnr{~|v{{spprtw}~}~~|zupsyytnoty}}}|}xurqx~}{||trzzrmlnqu{}wuz|uqtx{~}xuroqz|yz{|}y}}x|zxy|}u{vzzwwvsory}zuuy}~z||z}|{zzwx|yy{|{xspw|wrqsux|{}yvz}z|ty{vvyxtstsx{yvutu{~zzzz~z{}yw|{{vtsrnmsyxtquz}}|~~~xsz|{ywsnqwxspqsvy}|~~~z{~~}zyx}~}{wssstyyvtssw}~|{{{}||~{}|}~zz|z{~ywurorxyurtx{}~||~~~~zwvww}~|wrrwyurrtvy|~z{|{~|~zwvy||xwvvyzxvuux}~}{z{|}}{~}{|}zvwz{}}zxursxzwtuy{}~|{~~}}{xvuwy~}yttxyvssuwz|}z{~|{~}}yvvz||yxvvzzxvvvy}}|{zz|}~~|}||}~}xuwz{}}{yvsuyzwuvy|}~~}{{~~}~}zwuvwy|xuuyyvtuvxz}~|z{~~|}}}~{wuwz{|zxwxzzwvvw{}|{{z{|}~}}|}~~{wvxyz~~{yvuxzyvuxz|}~}|{|~~~}}~{yvuvwz|xvxzxuuvwy{}|z{}~~~~}~}~~|yvvxx{|zyxzzxwvwy||{{{{|||}}||}~~~|ywwxxy~|xvx{zwvwy{|}}|{|}||~}}~|zxwvvv{~zxyzywvvwyz||{{|~}|}~}~~}zxwwww|}{yz{zxvvx{{{{{{||{|~}}}}~~}zxxxwvy|yx{{yvwyz{|||{{}|{|}}}~}{ywwvuw|~{yz{ywvwxy{|{z{}}{|~~~}~~}|ywwwuw}~{z|{yxwxz{{{{{{|{{}~}}}}~}{yxxxvvz|yz|{xwxyz{||{{{|{z}~}}~~~|zxwvvuw}~|{{{ywwxyz{|{{|}|{|~}}~~~}|zxvwvux~~|{|{zxxxz{{{{{{{{{}~}}}}}|zxwwwvv{}{{|{yxyz{{||{{{|{{~~}}}~}{yxvvuux}|{|{yxxxyz{{{z{||{|}}~~}|{ywvvvvy}|||zyxy{{{{{zz{{{~~}}}}||zwvvvvw{}{{}|zyyz{{|{{z{|{{~~}|}}|zxwuuuvx~}|||{yyyz{{{{zz{|{|~}}}}|zxvuuvwy}|||{zyyz{{{zzzz{|~~}|||{{ywuuuvx||||}{zzz{{|{{zz{||~}|||{zxvttuwy~~||||zyyz{{|{zzz{|}~}}||{yxvttvx{~}|}|{zzz{{{zzyz{|~}||{{zyvttuwy}}||}|{z{{||{{zyz|}}|{{{ywutsuwz}|}|{zzz{{{{zyz{|~~}||{zywuttux|}}}}|{z{{{{zyyy{}}|{{zyxvtstwz}~}}}}{{{{{{{zzyz|}}|{{zxwutsuw{~}}}|{{{{{{{zyz{|~~~||{zyxvustvy|~}}}|{{{{{{zyyy{}~}|{zzxwutsuwz~}}~}|{{||{{zyyz|}~}{{zyxvtssux{~~}}|{{{{{{zyyz{|~}|{{zywvtstvy|~~}|{{{|{zzyyz{}~||{zyxvtssuwz~~~~}|{||{{{zyyz|}}|{zzxwutstux|~~}||{{{{{zyyz{|~~}|{zyxvutstvy}~}|{{|{{zzyyz{}~}|{zyxwutstuwz~}||||{{zzyz{{}~}|{zyxvutstvx|~}||||{{zzzzz{|~~}|{{zywvtstuvy~~}||||{{zzyzz{}~}|{zyxvutttuw{~}||||{{zzzzz{}~}|{{zxwvtsstvx}}}||||{zzzzz{|~}|{zyxwutstuvy~~}}}||{{zzzzz{}~}|{zzywvttttuw{~}}}||{{zzzzz{~~}|{zyxvutsstvy}~}}|||{zzzzz{|}||{zywvutstuwz~}}||{{zzyzz{}~}|{zyxwutsstux|~~}}||{{zzzzz|~~|{{zywvutsstvy~~}}||{{zzzzz{}~}|{zyxwvtsstuw{~}}}|{{zyyzz{~~}|{zyxvutsstvx|~}}||{zzyyz{|~}|{zyxwutsssuwz~~}}||{zzyzz{}~}|{zyxvutsstux{~}}}|{zzyyz{|~~}|{zyxwvtssstvy}~~}||{zzyyz{|~}|{zyxvutsssuwz~}}|{{zyyyz|}~~}|zyxwvutsstvx|~}}|{zzyyz{|~~}|{zyxwutssstwz}~~}||{zzyyz{}~~}|{yxwvutsssux{~}}||{zyyyz|~~}}{zyxwvtssstvy|~}}|{zzyyz{}~~}|{zxwvutsssuwz~~}}|{zzyyz{}~}}|zyxwvtssssux|~}||{zyyz{|~~}|{zywvutssstvy}~}}|{zzyyz{}~}}|zyxwvutsssuw{~~}}|{zzyyz|}~}|{zyxvutssstvy|~}|{{zyyz{|~~}|{yxwvutssstwz}~~}|{zzyyz{}~}|{zyxwutssssux{~}}|{zyyzz|~~}|{zxwvutssstvy|~}|{{zyyz{|~~}}{zyxwvtssssuwz~~~}|{zzyyz{}~}|{zxwvutssstvx{~}}|{zzyz{|~~}|zyxwvttssstvy}~}|{zzyyz{|~}|{zywvutssstuwz~~}|{zzyzz|}~}|zyxwvutssstvx|~}||{zzyz{|~~}|{zyxvutssssuwz}~}|{zzzzz{}~}|{zxwvutssstux{~}|{zzzz{|}~}{zyxwutsssstvy|~}}|{zzzz{|~~}|{zywvutssssuwz~~}|{{zy~|zzytqqmkkhiihimkptx{||}|||wxxwx{z}~~}yttuuyzyyzvwutrnuxry}xuw{|~xttrsuww}~z}xvnlntvwrqssuxy{~wljy|sooqvw{}{yqnryywqtuvy}|xty~zvzyyyzvwx|~x}|ztkfr{vxvvy}}~zu}{xx|yxz|z}|ys|~z|~trpno{vuusupv~wxzvtrssnkopmhrnkotuqqw{}{}y{{wr~yz{~{pkmppp|}{}~vuy}z|}}}~{}{||tghjtw|z|{tomhkojadfmklpjsuxvqs||}|}rtqvtv{x|{~zvz{pglitt|~|v}~trxw~}~~z{xvzugimmx|z}srpgfpkchkjnnqmrrrurq}~z~{~svuost{z{x|sv|riqoqv}uztt{zz}|}~yrxuhnspv~}|~|rushdrkflqlnrqoponrqq~}~z|}tzwnru|{|}wzrv}qlvrswt|~sw~}y~}}}~{vrysgqsqv~|xrvrehujipsmrtqooomqnt}~y{zt}sorx|}|wztqy|lquru{}|vxtz{}{~|||tuzkktqsy}stumdsrilsppvspmqmnomy}{~uzzoqs}z||s~vptrmursx}v~ty~{~~{~{|wu|ojtrru~vsvpeswllrqpxtqlsoloktz~}wy}prr|{{r{xqrwmsqrv~||y~vx{z~z~|~}zuzvhrtrr{|tuvjlzrmotnwwsmotkplnv{}}vvrsw~{|~xt{rpxooqos{~zz|w|~z}xy|}xu|olussv~zuwuiszqmqqo|vslutnqlqx}}zxtusy}|{uvyroz~mqpot~~z}{x~~x~~~{wy{{wv|nnvuux~{vwuitzqmqqp}wtmwupsmqx~|~{ytvsy}|~z~uuxqny~npoot{||y}~x}~|u~x|z}zwu{qnwwwz~|xwxkr{tnprn}zvovyquoqv~z~wwvvv~z~|{xswrnsropor~}{yz~}z}~|tz{}{||yzvtxxmuyy{|wzslyyqmsnvyuq~vvuqt}|~y|~tyt{|}|x|zrtupm{{oqqry|{z~y|~{}vt}~y~|x|wwutv{qtz{|}}xxwlv{tmqqrzxq}zwxrtz{}|zuyvy}{}~yy~zssuqmx~qqqrw}}|z}}z~}~||ws|~x~{w{wuttv|rtz|}~~zyxmv{vnrrs|zr~{xystz|}|{~uzvy}{|~xy~ytttqmy}rqrry~{|{~~y~{}z{ts{~|x{~}zvzwstsx{rvz|~y{voy{vnupx|xtyzytt~|~y}{u{v{|}{~~wz}vtttpo}yrqsr~~z|{~~{~{yxqv|~x}y~||wwztrtt|vsx{|z}ru||srvr}t{y{vtwz~z~vyyw}{||zv}yuvttnx}tqqrw}z~|}z}z~zyrs{~zzx~}|yu{wqtszxsvyz~|vu|xsxswyy|xutz{~wx{w|}}~{}}v|{uxtvou}vqprs|~~~|{|}z|ytqw}{xy{~{{zvw{qrrw{svwzy~}uz~tyvy|u|{{wr{}|}{v{zx~|{{zv~vxvutpzzuorpz}~z}~{|y~zwrsz}y{v}{{yzt{xpsr{wtvxy}~zw||v{uzx{}{ws}~{}yw|yy|{{~wx}uytvrq{ztosp~}}{}~~{|}z~yuqr{|x{~v}zzxyr|wpss{vuvyy~yx|}w{vzy|}{ws}~{}xw|zy|{z}vw}uzturq{zvptq~{}~~{|~z~zuqqz|xyuz~zzwyryzptrzxuvy{}~{x|x|w}x~~|ys}~|}ywz{w}{y}|xt~uyustpy{yrts{{}}~||~z~~|vqpu|xy{vv{{ywwur}rrsw|vxx}{~xz~{{zzz|~|vw}|{xx|xz|}zy|{sy{uyrupt||wsvu|}}~}|||{}~~yqoqzyxyzsx||xxuxp{xqtt|xyx}}yy|{|z}{}yu~~|{xw{zx|~zw}|{tv}tzstrs{}ztwu}||}}|{}z|~~~~~yropyywx|{sv{}xytxpyzqut|yyy}~zz||}{~{}yv~|{xwzzx|}yv|zzsw|tzrtqt{~{uxv}}}}}|{{{{~|~}~xpopzwxx}xru{{xxtxo{ysuu|yzx~}~yz~~}}~|~xx|yxw|xz||xw|yyq{ywyrtpw|xvwz|~|}{}z}}|~{~{}tont{vzwssv|xytwtr~tuty{yyz~|{|}}}~}v~}}{wwy|v~zu{zztt~u{tsqsy~|vxv}~}|}||{{~z}{}{~xoop{vyw|vrs{yxvtwo|wttw{yyx}|}|||~w|~|wxw~v~{uyzyvr~wzwsrrx|~vxu~{|}|w||~|yxzx~{z|{~}~~~{njiyx~ztt{~z{tyouxpomrpqnstz{{xz~wr~~}|}}yzy~|x}xzpwytxqrpv|}xtr~xzy|yz}~{}|}zsigw}~yxssjikustqpskxtqosuvvuzz~~{~wz|}{vxwz~{xqjqzrt}~}|}x|vsuvzwz|~}x}z~~z{~}y~{}z~znihq}|tprzwytuup|xutyz{z{~}xu|~rsw|zxttsq~wwxzzusnppxrx{~{uwywxr}{z{trptvzsrqy~~~xzwtjefo}unkrnojhkdookimoppost}}{{zx|~{||}{}|~{vrsrvqnou~y~{{wu|wpsrvuvxz~}zwxyz}xyz}|w}{yxvvywsjln~}{tqxzyytztx{yz~~}zxu{{{y}~vx|{ztwrvwyx{xuqnpqyq||}ytxwxvs~y{ytppswzuvw~xwrtrqiimz~slmrnpjllgrqnmqqtrsuw}}wxu|{}|~}{~wqnoqvrtvz{}{{wv}tqsswvxx{z}uzx|{xyz~{{v||~uvrvvwpmox}xss{y{wwzu|{vurv{||~xy{}}wwwr{zyzyvtnppysx|}ztvwwwr|{z{uqqrv{xxy~~~usoqqrkko{unotqsmnnjstposruttux}}~vwu|||}~|~|tnontutuy{||vz|rtrvwxyy}wyvyy|xyx|z{vzyyvstuvunor~}vryz{{v{xz|~yursy|~|}}}w|t}{{zzwvoppxvt~~~{uuwvxsy}z{xqqru{xxw|~vspqqrjjly{suxuy}}zwvppnsyvv|zu{}||}|y}}{wqpqqtqv}|~~xxy{}y|}|z}|yxvz{z{{~|{z|~zzurv|v{zw{}xsswstsy~|zx{{~~|~{zxyvwuvrops{uy~}{xsvuxxv~~y{z}||z}~~{}{x{|~{{z~}|}~~{qqnmnq|zvqpqoontxut~zx}}z{|||}z~{xw{}}~ywv|z|z||}{tuv{|{|z{wwxzynxqmorsqqqusvru}y~}zxyy}{ust}{z~zx}{uninotvv|~}||wsquxz~~}zqomrsnv{vvzwuonppsqs{|y}xvwx|~y~wtvz|{|~~}}umehjotw~}|{wtrvxvr}yu{{}xyy}~~~zy{yy{}xutx}~{yw||~{}}}woqsz}~}}{xzz}quwnoqtqrpttutq|{{~|xyy{}wusz}y|}wx{upijnrxy||{{{xqopwz}yrpousqz|uxzwtopprsru}|z~wxwz|~~w}|{ssv|~|~{}~~}wzvogdinvz~}~|zvvy{wuxx{||xyy}}}}{y|wwxztssz~zyx}}}}x|yxpmpv~}{{|}{qxuoostrrqusvru}z|~{xyx|{vtu|{y}{txwrmhnqy|~~xuvvpoov{}urpuvrwxvzwvppprtsu|~yzxxy}~vzzzsruz|{|}~~{svsmgdjox|~|xx{|yvyx{|{xzx}}|}{x|vuxxtst{~{zz~}~}}uxvtmoqz}~wtzsoqustrttuuqz}{}~zyxz|xvtz}zz~wuxtpikouz|~~{ttvronrx}zwtwzvv}v{xwrrtv|}~|}xtxlnopkikpy}~~}|z{{}xosokeeiow|~|vwwxsr}x{}uop{nm{{~|zx}}~zrrxvutw}}zw{~zw}{tqqqmiknv{~{skiuxorsqwxuvu{zwtw|}{}uyyvrnqs{~~|xz}~~uostppotx~|slfkq~|~{ptomjnsvurvx{swumpqqlnnuy~~yy{xyy~z}yvpqry~ytpnikmu~zwsnjmqxvwwzzrrpihnllkmqtyx{}{~}~|{xx{~}xyzwstu}}~wllkjmnuzyvpssqnmsuusyqospnhjkrvyy~}{yyzw{{~utyvvsvz~utonkmpuzuptuwstuwwpupkmomklmtx}z~||tvwwz{z}zxrtu|{uommkorx|zsoqu{xyx{zsqqjhnlmkmquzy{}{~~}|{zyy|}wwyxtvv}{zxmjlkorw{~ytsvsqnsuwswwnrpokklpvy{|z~xvyxz}}~zrvwvwv{~yzqqoppuw~zuruwxtvvyuqvnlmplmmqw{|~}z}yrvwz}~|{|zxtwyxyzqmmoqwy~{zsqrw{z{z}ysqqiinlnmpsx|z~}|{{z{z{{}~xmiidcdhpt{zxyxwwttqussyxt|yz~|xrrqvxzx}y{{}z}{~y}sx||sptqrpsv|~}~||zzxwxtrt{x|{~ztruqqqsy}}vqz|x}xwtyzzwx{}|x}vssrpnprz~~|utssy|}zz}wxz}z{ssxwyx{~}~v{}yvsuwvyxtswy{xzz}yuxsoproqpuz~yx||}z{~}|}}~~|ytw{|xwx{}{rqmhgiqruuwyvrssmrtwww{~~zuwtwy{w||z}~}yorsotzy|yzwpkmzuhfks{{~z}}~|}}}}|yzz|y}|xw~|}~}{wvuxuuy}{|xohfpyyrjpvpqvwsvy|||~~{z{xsutrrqv{|yxw{wtrqptysmjhou{{zplplkmtxz{z{xtmpjiorxz~~~~~~{|||}zvz~~{xzvlkinry}}{{vplmlljnqxyz~{zzvvtv{}~}|{}|~~|ussz}}~|zz|{}uonnqvy~wwtnpsy{}}zzyrtttutx||{~yzz~~|y~}zxyvvuz~{z{slmlqsy~|~zxz~|uuvorrvuww{~zsqnopqx}}{||uwxyzy~|svphghns{xvvvwuyy{{{wvxuvuy~{sqtpkor{{|{wvx|y}vwx|}}~w|}xstwzyxx|||}|}zz}vvxxzx|~x}zxz{z||~y{zy}~}ywyy|{~|~||{}}~}srsw}|{yx~x|xuvwywxw{{yw{}sw|}z|~}vqrswvz}~}~{|z{}{}|~}}{tyropu|{|{|{|~~}~~ytrpmlinqtuy~~ztswqmoqwy}x}|zz~~~yyy||}~y}}xsvy||{~|}{zzvqpqijkortz|y}|z~}~~zumtrmnqwz~~|||}~~yv{xrvy~~|wtuxxzwxvwrrxuvw{{zy{~{{{{x~|xyvvuxy{zty{wqtuz{|}z{|{sxvssx}|xqrruwz~wutrqnsuxvy~{ux{{z{{z}|}zusyuqrt{|x|}|}~x{|vqtv{{~~{vwvoonqopsxzxz||qu{zz{~~|tpvrpotx{|~~xpptkjjqv{~|}{wpsqnloqpqrwwxxx|{|yxwy{{}vvzyqqsx{}~xshlolkqy{ywwwwxy}ywyyqopoomsuyxz~wy||{|z{|{}zvt|ytuy|zxy{{zx}xuwy}~~|z{{|}{|{xsxtooprpsu{zz{}ypwyzy}~wx|ytuz|{}}vzyqopvx}}{}}}vrvsonrqrptwwwz|y}}~~|}}uuvzz}}zy|zz|wosrmjnrvy}}|z{{}|~{y{yqpopnotwzz{yxytsw{}{|}yux{|}~~~}xsuypklosu{~~}~}ztxwqprvtwzwz~wuzztrwz}}~}~~~|xppvokkqtx}~}vyzwsvxxwx||}}~}}}|~z~wttwxy}}{~|zpmrqkjpsxy~~~vutvsux|}|y~vv|wrpuwy{~~{}~~}~}{z{{{}xrtyqlmptv|z}}wtuxvxy~~wx|~~~uosuplqsxx}}{z|zz~~|}|{{xrlsrmlpvz{x{{utwwxvz{||||~}zxwwzy|zut{zssu{|{y|||~y|~~~~|zvmnttorx||vuuurvx{z{~{uz{{zzzz}|~}|uyzww}|}x||}{}~~~zzx{{|}xtx}usty|y~|vrtusuw{yzz|zrtx||wuz|vuy|{zy{xz}|}}}|yqqyvrry}wwyvprssrtwxz{}}}|}x{xttxz{}|xz|{}|||zpntwqrx|}zzsrsuswz~~{~~}{su{xssyz~~|~~y}~}~zzx{z||wsw|trsy{~z}yvyzz{~~ww|~~~zqqwxqtw{}~~}|}|{|~{}|{{yumtwsosx{|yxzzyx|{}||{}}zyyz||}xv~ztrtxy}||~}|xz~~~}zypkotpmruz{yvvwtwy|{}wz|}}||~}~}{rtzwrqvx|~~z}}~||~{xwwywzxtnuvomntu{}}wuxvxx}}}}~yuu{|~~~wprxuptvz{~{z|y{}{z|~}|zyzxywvnlstomsw||z~|uwwxvxzz||y|}}|yyy|{|vxxtrwx{~y{{||~wtx{{}{~}}{zwomswqruy|~xuvutwy|{~~}wy|}~||sw|ystxz}}~{yz{zy||}}}x||}zyxz{{}xsz{tprvw}}~xuxwxy}}}}}{vu{~{tszysuvz{~}xvxvwy|}}~z|}}}}|votwtnruy|{|xwwxwx{{}}~{||{~~{v~|vrtvx|~~}xwzy{}yw}||unmutoqsxy~~yvxvwz|~~~z{~zsw{xrtwy}~~|}|z|}}|{}}~zyxyyy|zvpvxroptv{~{x{z{{~xu{~{sqwzstuxy}~~z{zz|~yx{~||y{zyzyvnouuoptw|}yzz{y||}~z{}~}zz{}||uw}ysquuy|~z{{{|~~~zttz{}{}}|zyxqknvspsvz|~yxyvyz}}~|xy~~}||~|}}}uqvzvquw{~}{zz{yz||}}{wyzzvvuwvxzxspxxtqtwzzyzy{|~~~{vsy|~}}wqqyyuvx|~zwyvxy||}~{vuyzyxwyxxxysmrwvrux}~~|yyzyy{{}}|wy{|yyy{|}{v}zvxz|~yy~{{~}}|zvqwxroqrkknqnqqstt}tt~||~~y|yqquttx|~}xw~}~wwx{ztq{so|urv{{z{qtvvrpsv||t}spv||~~~~}ssuz}vx~{ys{|yxxuy|}xvu~w{y{tjqzopux|vxvzv}ww}|}xxu~{{zx{vzxu|w~~x|vz}}~y~|}{}umnx{ztnpnkgpnlwtmqrryxy}|y|rwysz~~~x}yqzxx}|z}}v~~~z~}|}rt|z{zw~{mpninmnoqltwpuxru|uuwwt|~wx|~yzwtyzx|}zwwux~|}zzsoqpq|}xutkmpkksos{wwvvoutkpwps~||{z{x{ww~y~yxzztu{x~~{vzrqupnw|~ruqkrtppqoswpnxqnwvsqqnruy{~zuwytpzyzuvrvzxrrwuwy}zxqtnfmmgltqtsrqtuv{rq{{}~z||tvytzwwww||ssz{}y}|z~yrssmv{z}wxripoonnoqvu|xnowttrqyzzt|{|~wvrt}|}|~xy~x{~v{~~}~zszrlpsx}wtpppswqisxvxtvy{snqptxusxr~uxyvx|u~yzxwv~vw~z~|wvqvqisyvyzswxusnpvwqmtswzusokwyyzy~y~v}|wvxx{~suztktwz~|~yrxxmmroqt{|z|{ynkpouyvttnyvtsuwoxzx|xxvwvxps{vqvwwxyxx}~|x|yywvrqttxus}|wxzrqqjvuvty{tyzvy|pywpruxywz}stutuuwt{{|rt~|~|}}}{ojqyy{yy}wtvxnswsz|v}yrsrpsumr|zsy{|y|yuyz~wqtyz||~u|zt{{{vrvuxppv|z~zwtrosvsttv|umsqrpw}x~}}{z|xuptsyuv}w|wy~}~wzpuxulrvux}{{ynsuurqtyquvx|oruwtqtxswu}{{~|nxuzurxx|w{~~{{{zzywxwxsmy|y~y{ywnozzytvwvssotsosut{|~u~{vuxyuxvxqtz}~}{~~z}zvxzvskzy|yuwxsqyyytwvuwlrwpstsz}}vy||uzzsu{t~yt|x{|}|}~}yy{|zwxpwvrtoy|z}}wqzx{xryzx|rt}tsstuqy~z}|ywystzpyws}wvx|}|~||}|xtyrvtqvouz{zt~zywrz{w}vwxqtrswxy|{{~zvuvuwzq}{txtyvtz{~}~~|zvwnvyuvnptt{~y||zx|zx}tw{ponrwxy~w{}wtwvvys|wrwuwy}~|{~}|~y{tvyuxopplrus{~wz~w{xz}tuutqttww}yw~z||trumv}tvry{yz|}~y~~}us}wztottuxs|||wz|uywuvsruvsszz||v}wz}vvtv{uywzy{xvw{zz~}||~|{pvwxrovrnsovzy|}{yxutrtsvuxwz~~v{{ttsqvqru}zz~zv~}|rx{}vruqoopwt{|{u{uyxuqx{vu}zyst}~yxuyvrwvxw}||y}yv}|{}~uwwxtrwqopku}ttx|~v{yy{|zzw|vxu|vw}~~z}wxso}wqquzw~vp|}z}~tw}vuuputoqrwrvx~~{|yy}yuw}wu{{|yt||xwwyvrwvyvzyzz||w}{~~}xtxysqwtnqnmxqnox}{{z}{{|{yxyqw{~x|||{u|{ponuyu{sy~}~{|}~{t|zwwrpvmnowttyy}{{uxxwy~|qx~{~zyy{|tvtyuwzy{{vvz~x{~~~|}u{|ynmoprsgyxjsqx|}z||uqsuv}{zv|z|vw|ykk{|{||vxy{{~~y|~{}u|~}r|}rnuoojrnowutu{yysx|}~|r{}yx}uu~}sysvpsut{uz~s}|}~y~}{|{xyzppuklqjhynnou|{|~||}{{s{{v{~}zxx|vvos{sr|yt|~|v}~z~{~zz~}|prpmjnovsowzszz|z|w~xzzz~w~svzsqyvz{yz|w~vzz~|}{~~z~~xzztvxpntls}qnsstvx{~~~~{~qu|tr{tz{}}y|uw~{s{|||vwry~y}w|z{{~{suxnsoqtqmovkt}|x||~}z}wuu}}~z}u|tuz|vt{uw}}sxrty~~|yyzvliljnuqkuqpv{x{~~|{zww|~~w{~xruus~ys{yy}{w|~z}}v}~x~~}{{{vnzynoonttqrvvrtns|v}ux}~xz}v|vuryysu}yvt}}zz{|x{{~yvxsvupmtzrtllw{u|{ury~xuzpszzu~|wz{|ts|zvv{v|x{||tyxuzxmnztsxsnpzqvusvwu~w}wvuu}~ys{zvv}y{}xxyty|uzy~}}~|}{y{|v~|xpoutmttrtoosnopu~z|y~vy}|uuyvzytx{zzu||yy{~~x}~~|xz|swpsrllrorpqytvrx|xx}zz~}~|||~yruwwxt{|zx|zuvy|{|xz|}v}{|}wuxrvloqnrntwtptt{vvwy{~}{|}|uzwzyw|zvz|}u||zuz|v{|~{|y~z}{|{{uwpqtokruwqqxsontns{xzx{z~|tvyxzrz{wuzyryyuwvxuikmrxpwz{vxuq~|yy|{yx|v|~wrtqrpfmponntmmzzpuzw}zwxrovytw}{}ympokipumsyorokyyvz}w|vvwoqpjsxxyyw}yq}~~|}tzy||||~~~|oqwpkusu}uqyqjotmix|rrwnu{~{~{{||}}ws{zuy~w}uorj_hd^dli`iofafbeprrz~x{yqs{}~z}|qxzsv|~~zvz|urwtwqw}|||zww{}yz~|}rrzqv|~zzuppngblrjflikstpzzstqemxrs}~yyusxrt}xxz~vyxyru}}y|zw{wnxwswxwmjsnbhop}}}}qpskksrpxw{y|xrytplkk__mi_gidnqinxqu|sswyz~}|w||yzyxx|y}~|r{|jipkwz}}{~v|{|{truwv{xxyzysuynjxtdghbouqtwtvictvpwystu{w|}|}{usututw|~zw{{tvywzxszyuovrfp{njpilyxy|{xvsojlmmov~}syxpkupgqxicd\akjkuzx}xnt~{z{}{|~}|}}}y}{~{~{ux|vr|wkmnly|||}{|~~~}}y||}xswrpqzzxw|pkuwnmmjpqnnrwvxtmqyytvrroz}w|wyvnqvswv|{{{u}{}zyyipurouvmoxtkjikvw|{w{yqqrijroruxxt|vrrwqnsujba`hmooqzxxytw~}vr|}x~y~{~{}}}|~~x~|wwzts|}tpqqx{}}}~~y}~z~|{~tptoryy~{xsvvswzonlntspnyzwyrlv|ux|utv|rxwtz{tv{uyxs{wxx|}{zvunmvsuorojoytossw~}z|}wwtlrmotpkqrqyw~y|}zumqljsxmjkiqtqlrzw||u{}wvu~~}||{}y{zx~|}uswqr~|qrrt~~~~~~~|v~~wz}y~zzutwuqtxy}|{s{wrztptpyxrqwrttmq}{xutvzuxux{xuvwuztz~x}yy}ytx{wzsvwvoinghwzruus~||}xtmtmnnoqoklqu~{{wotolvzqnnitwrrt}|}zru~~{{}{|}|~|y|{}{wrrilyytwvy|~z~~~~|~v||{}||zytvutvwrtzzyzru}|vwuwzvppwvwuqt|}{|x{w}wwrrusqxyz}x}xzzx~|uvzxzvpyusmomjrwsopo{||ywqytoqkknihquz}{ytptwsnopz~ywr|}{{vt}}z}{~y|~z~|y|~|}vnnkpy|vtsw|}|{||}|}||{}{{~|y~z|vtuojqtx{}z~xusw~zys|{|unt|z}z|zwvspvwsuxtzyu|zspttvsx|wwlmkjrxrnqq}~}|}}w}~vwqwqommqpllnnvxx{yuqx}wsus{}xvwvu|}|{~~|}z||}|~|~}w~|}xrvru}{qqpu|~}wwv{~|||~yz{y~{~}{{z{z{xtrrpnotw~}||yxv{xx~|}xsv~vytx}wyy{|ytsrtxt~~|souvvwryvvomqov}xpnjq}{}}|}~||ypponyrqpopokjoqxy~z|x{}xtr}zyzz~vu{}{|~{{w{w~~z~}}}v~|xrsot|{wvuz~||uwxz|zu}}}}|}zy{zw{}yvqztrtswyusww{~~|x~|wytzvzzyxwyyzx{{utxv{zw|x|{}zwyzxxoqvpsopqtz{vonp}}}|~~}ywzv{{vunolptlnlnuuruwu}w|||z}}xx|~~xx}x{|}x~}|{xx~x{u|tusnrt{yww}}~}~{x|~}vx|{xyz{xq{~{x~~}vrsqxtuttyxuuyz~}z|{yw}wx|{vuytww|~zxvu{ty|x~~}yuvxwuqyvvtkllpy|wwy}}{~}}|{~~w}}{zrpv{z{sppjokjknuwwvwv|y{wwx{~||zxz|}~}}|}}|{tyuvtosrvz|~|{zy~~{{{}~~vttu|wvry|~{tty}xyvqwolmqwz{{~|z~}yw}z{rx{vyz}}{vwy}{zyzwyxtw|{{usxrtnlnox}{xxw~ywty|{vsz{zursxzxsmpipsmoopsroru{}{{}~~}~{wy~|~~|~|||z}|||v~|zrqntz||}~}|~z{~|{~}||~x||zxwz~ywy}{|u||ytoov}~xyrqtlnorxyuwz}{~}y|}|}z|{xzzvuyz|xyyz{wvxyxxqx|x|solnrvvtx~|~}vuv|~{z|y{{woiluvyursmrokkkqsqqtt||{|}y{|xy{|{}zwyzyqstyzxy~|z~}||{{}wux{|z~ysttz~yyz}xxqxzzysqwzyxpqqoxutsuwurrty}x{|z|{{{~}zxvy|u~|{}wsuutru~z}ypnlpwxuwy~|}{||~wvv~~|~x|{xrjjptvvnpnktrqrturolmr|{~~|}{z||zzxvtt~}~vurv}}yz{~xuxyzvxy|yvwx|vrovxtzvx|zsiegoywtqkuusux|~|}zyz~z|v}{{lv|~|~xvtw~zvss{wy}~x{~{}w}~yuxyz{x~xutx}~{xwzz}~{{negv}hbY_kjortvuqquz}~~~~wsv}~~}w~}|zzyzwy~z{~xqwwzvqqpstrpssxvszuwz||yxz||zsv{uzyvwz~~zropxusvlproliku~}uspnxwxz|zy|~{~{wsvwtpquspomlnejmlswzxtqqqqmlwtuxqpquz|ywz}zw~}|{z}}~xwkkkgdacn{vysmjimmllnoupqyty{~|xrz|~}{~xvywvsu{yy|{vqnkpmjuqrwxwtqpstspv{uzuopqv{yuvv{vpnehjlmkpy~~uxvs|zyx|~wxusopz{wwzzxtpnpkfplmsttrootuuruwprnknr{|{z|x{vz~}y|zvmccccaenyy{~vsssrpljmrrp|yz{|{z}z|tw|}yvy~}{suspnr|}|zwrrtwtqwnnooqpptwwvptwqurpptz|yursyrqsknqnighow|}|||zwwy}yuywtqrx|zuopqtqqwpqqqpllqtwwqvvoromntz}|yy~~uxyvssw~xwjehfcaagszzvqrtqqtuytrytuz~}}zz~}yurt}~wuywuqot~|wuvw{wrxqmprqpoprtrow|v{wpnnquvsuy}wtrhkmlkhirx{|y}|z~}}}z|wsminz}zwuxulusntwvtropqplqysyzsssuyyvw|xvxwvss{~}~wuskmljd^`hqy~yzyxuztpqvxx}~|~}~~yu{vzytx~zzy{{tsqrvuqsw~{~~|wvy}{z~v}wunjzz~~}|{{xw|}~|z{~}woklmoolsvq{|wvwustz|}|qmuvuwpstttrquxxwv}{xyutty~{|||~~zy|xuvy~||zyxy~zwz~~~z~~~ytposy{}{zwrruvwwy}~~|{~zxy~~{zwwx|}{w{ytpqv{|xvsrmjlllkgmoimmjjouwvqnosmntosyxsnkmqrpouqnwtsuw|{{zwuuz}|{zzvqomkicdolnurqruwwusv}~y{w}}{ywy}}~uy{vvw|}}|{{x{}yrvqljkry}zzyyxtpxws{{z}zy~{x~}~zwytw~}}|~~}~~wyxspqx{~~ztpkjjgenqkrpkklossoqtxsrtlnqqqnouyxvprnjrssuzzyzsoouzz|~}zwrpnielpkqqnoqv|}z{|}wtvrv|||~~|zv{zv~~zwy||}~|}~}xwkkolkouzzvwwut{~x|{vvv{~|}vvz~}}wzxs||xxz}}~{|vuvnlpu{|xsrsromqohjihjnvywtrqtnnrnpuvrooqstrqwrqyvrrsuy|tz{uttux{~~wrrrqppvuopmjjow{}|{|}tuwqu{|yxy|~}wuzurux}~}|{~~~{zujopkklotx|}zuzztyzxx|}{~z}z|~{xxz~}~|zzvtuz~}~uz{usprtuy}wuvvwupttjmmijnrturrwztuwmlommmouzzwtvomttstvz{{~{zzsnkntx~}zwurmqworvrqsvxxutx|yyyxzxvsrw}}uxyvtuy{|~uzyuw|}{x|wuzwqjhhkw}|xsszrorkfefjoprw{zuwsmpqrqoqttronqlozwtyz|xz}}}yzyoqtpmlnpy~|yspwxrwvrpoqtsru{}}~wuuvuqsw{}~}ukgtyzxw|}}~zyzz{zyysxskghltyxzyx{|xzussv}}{~tmkmwvvtrrppsutty|~}zz|~~xwxlkpkhkqx{zxvv}~zy|ywukegnxxwvvurrsqootwtx|||}~~|wvwyzvruqhoqmnqu{}~}}}{~~}|{x|uouqklov~}zsonllmq{{y~}yvy}z{~}zzz{|yrqqffmkmrw||z{z}|}xllmhinv|{||xusqnmkryu{}{|~~~}}~~}||xvvsnmqmjqqoprx}|z|xxwlkomnry|vqonoqpv}ww{xuw{~|{w|}}|zz{wqmmkekpqsu{~|xv~}zxogjjjmu|wsoonlpyut{zy{}}{x~|{ututrprrklonmov}}yz~xsrmgmppqv}|wtrqssqu|vsxutwz}x{zw{~}yxwtqnmohioonrz~{|}vumdimmow}{xvvrnpvpqxy{|~|{|~}{{{|{vstuuurstjjoljnu{||~{}pkkeejpqmorqpprxuu}{zxxwvz}}~~x{~ywxwurlnkcjqrty||~}}|~xqmou~~~wvz}}~||zz}x~z}zx|{{{xtuwy|{x|yosvtvz}vx~srnimqsuz~zzysv{ww||yxwxyywzxw~|yxwx{|}~vv|z~|y}uxzuqpppwvopqnlqwz||{{zqrvpptutttvzzwx{souuuvwz{zz}}~|xyy{zx{~~zsooqv{qnnojhoxyqlrxty||{tsxqnqpnlkmrssv{xqturrt{{{|wzu~{yqr}|wtrolrvollkfelv~}wx~wu||{~z}xpppoppsxyxx||xrx~y|{zvsnjlsy}uqqqqsuutmlspkmonnsx|~zw~}w}~~{~yvvuvv{{tptx|{z|}{xpggfdjr|}xutwqpvvronnmpsvzxrwxnjkkmrv{~~~{zz}{ywzwqkhhgdgnuz~{uqlfcfilnnqrjjqqprvvwxwwwomusmortwz{~~||~~|}uuw{}ommnqw|wrkimjghigbbceilnvvpuyusttuvwwzwqu{uqqqrstw|}~ysonpsu{~xrpkhhjllhkkcadedfjmpqosumnwxwyzz{zxxwoltsopruwxzvpoe^_fr~zwvtonnlhfefigiqmikjgfhimooqxtqz~||zwusqtvspw{vtuy~}zywrr{}{{}|wwrkhjjkmnoqlinkehjjkmorsqqurlsxy{{z{xvxzzw|~zxvmhjquy~|}|w|{vrqonmkmolipoknpoomklljlsurx~~~~|~wvy}}|{tmoslghkmqw{{|ysrrrttrstnjnkfhjlnmoqpopvyw}~~~yxyz}{yyy{}wpfhmhfkorwz|~~zzyyxtoomhgnomopqpoquwy|~|z|uw{~{x{~~|zytlrsifgimsw~{xwwyzvutqlkpqquy|zxyxvww|}x|}ux~||}~~~|}zxojpohhjmrw{~}}zwxyywx}|wuvurruvy{|z}yzywz|}z}~~~~}upurifehmqw|zurwwrsvwvxz{|{y}{u{|vz|wussrpruw|zw{~}rkmmgfhmruy~}|~{w|}utusrtvy}~~xzxomqojilquzz{~~~xqpqkfflsy}uwxrquwy{{||ywz|wx|zwsstsppx}{yz}}}}~~{z|~~~yrpvvrquyz}||yrrrrtux|{xxysmptuuux{|}}{srvxz~|}}|~}ttwpknsvzytwwrsstsqoomklqtru}|w|}tnnopty|}|zz|~~zspwxrrvxz~wtuojhhjjkptwz~~~}~~~}zqntrlnruy||}}~}utzunoqu{zxvplnsssuyzxxzyxy{~y}zxwuvxy{yrtyrmopswz|~}zysow{utvvy}~{y{|{}~}|wvuqqtvxzz||sqwywy{{{|zyvnlttprux|}|}}|{rrvqlmpv|}yz~|wwvronnortx~zuz}yxxvwxwxytpw{vsssuvw{}ywwuoousmkkosv{|y|xpnonnqsuwvvzvotzz|}|||yxwqlpwvuvx||{}~~||zxxskfjkhhmu|~{yywu|}vtspnnnpssu{{uy~|xwutvxwtw}{vsuy{~{xvrrsqmkrxwux}zvzxqpqqrstvwtuxvpsz}~~{xxwuru~|{|~}~~}}z|~~}~~ztoqvsptz~}}}xv|{vvvutqpqpptz{y{|{{{}~yx~|utwz|~|zzzy|}{xuqnuzuprssvz}ywyvrrsvvvwwtsuxxv{|||zxtv~|xy|}~~{yzzz}}wrjfnrnosuwzz|~zvx}}{yxwtrtuvz}{}~~~}}uw}xrtwz}{}ywuttolstmklmqux}ywz{yy}~|{{xwxy}}wz|zvot}{yz{{{yy{{~|x}zvsqjfnqllnqvy{{zyvvwxz|}zz~~{rrwursuy||||zz}}}}}yxwuvvplpsnjikptx~{~}y{{z{|||{y{|uu}{yyvpqxzwsrstsuxz}||~}~wz}}|yxvogglmklqwz{~{zxvvwx|}}{twz{}~}|xqlotspptx{~}~}{z|||~||xwvuwxvploqlikqw||~yxz{|}|{zvvzyuv|~{zxvwwust{~{wxzz{~}||||}}~}vuy|}}~~{ywsniiqtrrvz{~xuttvvy|{y{|wqsx{|{}~~}ww|ztty|}}|zxy{{}{{||yxyyy{{xsmnsrmotx|y{}zyxyywvvusuy|zy}}|~~}{x||utuvz}|ywy{|~~xvz}yxvspljrxutwy{~~~|wtsuvvy{{~}z~~~{sqxxtuy{|zzwx|~zy}}zzywwwwvsnqwtooru{}{}}}~~{{{yz|}~|zxz|}~yuz}wstux{|~~z|~~}~~xw~}xvtqpojmwyuuuuxy{{zywy|}vw|}}~|ztnsyxvxy}}}~|~}||yy{{|~~~y}~zxvssuuwvolqrnmnsy}}yxwvxz}||}|zyzzz{xtw~|xutvwx{}~~}|zy{~yv}~yuronpoklsvsporuw{~yyxx{|}~}}}uv|~~{zysnry{zyz}|{{{||yxwwy{|}wxxwvtstttuqkhlpompv{}zyxwxyy|{}}zywwz{ywy~}wstwx|{~}yxwuv{}yx{}|yusqopqnllsxwtvyy{}~}{z{||}~|{}~zvx~{zyvsrw{z{zz{{{~~zwvuvyzz}}wqxzu{w|~~nntlcbdhy~~yjw}~z|y|pwt||x~y|v|vnuvprnsqhmnrp~{}xqzbZhqwm}w}zu||xsxzs|{}~ujitjnwoz|{xtlpu{|yo|qz~mcfwmob_jhd_hpz{wph|utuzpsx}svoinxsu}{tz}n~|rxmr}~ys__wj`fkhohpmemllqy~xwlposz{yzvq{qsr|z||gekmzw{~yt~xw{owvgdcbdz}mag]bxiiin{npzpr`bvq~}tvsl|yu||}}wzluq`hqq}zm|pzyoop]cnq}{|orhfqhdkuvpp{nkegigwyp|noo}xu}wnhnfns}u}{y{pvxv}pjkb[c}twgazhadgyroywe_wnsxp{}ywnzzxu~xx}y}qxyeeh]}n|yz~|xzrozibqnspzyxsgpmicsspnxwklgj_m|tz~nrqm|pq~mrmejk~}{}zwwuurx|qxmc\hqu}fxwbbatvl|zs]qvkroj~nyy{v~~|{wwzvspfl[dy}y|x}zyw~zvp|sfsrqic|ovpqgornlpzjoqrdhtkq|n}tsnzt{p~rwufieon~}{wwtwtu~vtkbff`ts~hfcwxm}~varvnqlfxxyrzx~v~{||uy}vt~qlo_hzjoty}~zv~|uutn}vue[x}z{|pxomjouiqwxelnaksjtrqtmu~ufhjjbv||{r}wsq~z}trgn_Zhw|~okpvvlfzqpsjjvgovz|~|uy{yv~p{vnsndyn^`hz}}v~{z{vt}zqZgqow}{|oqoylow{nkre`e_oxvrw{ov{|mnmqchluy~|yy|qn{~||svl^`feb~~vzzug|ztvngtiflvsuwyzzx}~o|zprrh}xaZ\pr}|}xxx}|sv{miiebionyn|ujsunmkjrgi`fyvy{lw~w~v|umudljiesqzy}~uw}zzn[flfcg~~zrv|nhauu^gpmj|mvxyyyr|y{|u{weqf]Xf{{|{{{|}yz}zjvneie_foq}vntokx}q}n_susip|zxwy{{|xyonavn]_nkrz~uusrw|~tnrcbh__lnw{{ss{xhtsonngpvq~|~sxqqksout||q\mqvu|w~n}lo~w|}quuklo[ebanp{x|zxrlslfnjfsvv|z|oulmy{}nyyjmqimopyx}ptyrv|p{mg^WiUTdz}~yvryrpwrlxmfugsjvxvpwwxukjkagnlyx~szyv|~|yzoqhdlpdoneZv~}zxvrzhj[ll\czyuy~wxzpsuloqgluix~y~}vzyuzztp{ywanmh_`pnz|qsgwyggusm{ylhvw{tx}vz~tw~mqo`bYsnk{}z~yx~}p~upxkhg^\ehpuop~zrgxsrgszx{~yx}t|xljdxj]etitw}}yusly{~}}~{}|qlmebf_cmisvs~r|yotnfkqq}~xzqloogtq{t`ksrqsxvn~pp}{z|uwypttfik^hf_cl|}yqspkqnlwvu{wp}rqxvi||ymoujnojp}|wu~q{svwwowf]VajYYnwu|zzy{rsxkrtijlt}vv}r}{u{sijjcjlm||s||{~{}smizqaftghrn]bx|~~wqhbnxgfz~ww~}uquqrvptuikofswps||wxxs{|~{uxvu~n`pqladmgpww~zstylvswyho{z|{w}{z{t|rpvf]Yiqdj{}yvzsqu{~~vrwojthecea[fov{yrjilzrk~~xq{t{wqnrqoiwqlopujzvyp{xz{|~lqs``dTer[cbqw}x~{tuvpco{s{w}mutusvot{qt\k{q|yr~||uzr{ro~y|xprxorifbYffbi}wrtk|xkz}wj|xunwvoivwmpipajwnz~xs{zv{y{xr~kdkZ[t^Y[asgu{zvniwosw{yxlpur{t{}ia|qpuil~zst{{g|lttuyp}xrtjj]bda\gstwzuurwjw~yws|uqo|rprsm]mievww|yvxvwyt~v|~mnmXjqY\Vek_t}xxrpwlru{yxwxqptx}jk}oonelwpz{tw~{i|gjkyzswrrpoagdcZdggnwy~wkwz~u}{v~tuq|vrvyp^mf_nmk}~yvuvtp||}~x~qrr\luZ[Wck`mwwzk}v~pnu|vq{~qoq|ztj~tqpfgujps|wz}m~igdv{~s}{pupuhkih_]f^di|z~|vo~vw|vyuty|qwwyfjoaci_xy{yyu{mtw|z~x|psgbxfZW`nectsuiiqtvwixyywrqwjyuuncppipt{s|{~xswrieq}v|yxorqwlknji]f_a`psr~~oyq|z}yxy~oswxkougbdZk}osx|~y}pstyyv}tsiezj^Yaqgaqtpe`|wyxvjv{ux}x}vuxn{{woepoinpvlwz~vzr|xniy}pt~}|stsymmnmibj_balhivsyqxx}}}orvvkwwicbYnsfgr}ovszuz|}~vujs~h_\kocdtso]dyy}~rp|upss{|w{|t~wlivllnrlios|y{vtswptxlx}u}}|xwxpuwqqqmrssyzxxx|}xxzy}{yw{vy|}}sopyrpnpwz{|zvosz{st{ipoqwvzz{xxvsx~}~|{xqt{ysmsytreigbeffqwu|mVjxgZ\filqr||wp{{vuwrutv}zx~}|sgp|prsovzx{v}z|copbdbfmkwyq~tynt}z{yz{{xidS_{wrpcZei_modlpu}untyqxwgz{tfilrvleppt{~{wrqpvf~z{vpksuf~uvxzuowp{}oqsvtyr~z|vwz}~ha\P_Ww{jprokbegguwbegl}mvdr}wlajqturcioz}ztzjrihom|~}{hmcmspzw|qvv{wxzrvvtqywwwtyv`daQZ\{||npvnehliewsajklyqqewvr|j`mqopwggrz|tulynhlpzz{}{zufmdjsuy~~uu{z~uusyxvvxy{vqsr]dgVY_zxzrnypelqmcuwbilhvtrguzr|o^jpnkxpht}uxm}yllm}t~||z{twbiefux}||t{}~{swuww|yu}vulr_^k_\at|wxkvvghsqgl~ibkepwsllvzyaanokszlr~zxnuqolxu}~zxz|pwd_d^q}}xxw{s{{v{}v}z}~wileWfhaiox|orzpeptlg{u`hfhxuphz}w~k\inkk~ws}xuqzsppyuvxs|pm~iYa^k{~x~~|zv|~}x}~~~y}~|}||tjhgWdlfpq~sp|sgpxphyzaddcuwrixzo[enmj}{u|zwq|uto|tuxq}{nk{iW_]k{y~}}|v~z~{||{{||z~xxphhdWgmittru|rhsxoj|x_dacwvqi{{l[fnml{x}|vsywvq{u~stq}xklzcU][oz{~}v~xx{z|||~||{|xtqlgh^[limvxr}{om|yoqm_e_kzumo~c^kohrzws}w}rz}t{}~zwyow}rhutWXZ^z|}{}}{yxx|x~xx~w}|pqljieZekfuqyzunx~toz`dbdyyrl~n]hokk|{wzwyz}ys|yw}{s{qr}vjpy^U[Xo|x||~w~ww}x|vy}y~x~{poklkh\`jcpqvz|suzr{iae`t|umu{`cnniv{ytz~wzqzuzt{~toy{okymTXW`zyzz~y}~z}zyw}wy}wz|xzlmjlkd\fgetlzuyu}cfdg{zsmq^ipkkyzww{|{{{~s{~}w|yrxqpzwlozdSYVh}~vyyy|{|{|wwy{~yzwv|~utghgkjb]hfhwm~zwywzcgdi}zsnn_jpjmy{xyz{}|}z}ty{x{yq~vopzvknyaSZXj~vxyz|{~zz{~vw{zxzvvz}t|tcdcjic^ghi{p|z}xfgfh|{uos_hollx}}x}x{}|r|{w|wp{voovvljxhSZZgxvw||xz}x~wtxuzuztz~utxba`fie_dlh{y~{}ypdidt}xpudcnpmw}{xz||yw|vz|~xzurynlounfpt[W^`zuwz|}vxx|ztx{zvvu}pw{x~zmwk]]`ggcbmmuz||}{gifl~zunm_krptz}~}{tz~~yzw{mxpjjpnfjwfW`auxwy}{{zwyy~ztutvs}qr||w}|zlro\\^fhecmqt|~}|mihj~|wn|r`istw~{}}|r}|xzv~{kwoihmmfiwjY`buzwy}{{ywyx~ztutur{npz{w|{wjpm\\_fhfdnrv}~}~~ljhmzwn~oaktuz{}~|t{~y~yuvkvmhfkjelwh[bd|zy{|{u~wwz}xswzzusvy}ks{yx|ythsg[\aghefqq}~~~}klhxzuq~gdpww~~{v~yz}|vxmqtjgglhfrt`]bjyz||r{{}v}zur|yuuq}yolvzx{ywklq`\_ehgcjpryrmkp|zo~pblvx|}}~v{~{}xv~qlvlifjifnwf[`c}|{~|~|ryv||vrxvyvr|wsjsyxzzwohrd]^dhgcenm|y~{onn|uvzehsxz}~t{{zvyxkupjggjgjuo]^_o|}}zzvy~zx}xss|wzvus{zllvyx{wvimo_^`fhfbilp~tvqnw~|rqemwz}~w}|}xv|~qmvljeghgnwj\_by|}~{u|wyz|vrt}tutvw{ziluxyzusfnl^^bghfbjls}uuro{~|qnfox{~~}y}}|wu|}nmujidgggowi]ad}~}}~zt|wyz|vrt|uutvxyzhkswxytsfll^^agigdjntvysqy~s}rfmw|~~u}}wty}|pkukiddfgmwo`bez~~{~ywux|zx|vrrzw|utr}zs~jfouvxsriena]`fijfipr{tss}wsziju|~v{}xtuz{uhqogfbefjtwicgq~{|{zpv}w{ztrv~~w{tqx~}rxrdhptvupoajh]^cjlkiqt}~xtr~}}q}phq{}}w}}ztswzxkkrggacehrzqfjo~|y{wswu|yy{urt|w~srt{uquddlrttoocfk_^bjmnkqv||us{~~sxtioz}u~}{truywkirggbbeiqzuikp~}y{w~svu{yy{trt}~w~jggr}vmpow{~xkqy|fll`feouuknv|yytgihv~nonv}||tpk`lbdhfqwum|}}~lonrzz|}viklfplnxxlltk{{~rkojuuxyu}q{ryr{yxvouvxp{sr~}~yvhmkk}~vurt~utsr}uq{xjjseqzyurvox}xs~pulanwr{kdostywmelievxs~ru}{swxip|{}z~|sztfirdnxv{yz|t}}~wodmb_mxrjqrv{xkekdcw~rpxksyxv~xnsrcq{~}|ysxobjpcpxtzx}|t}|~zibm`amxslrrx~zkfkccx}pouhsxwu}wosqbty}~~ztxobkodovty}w|{s}}{{ibmaakvwmrow}lekbbw~plqfrxwu}|ruqbr|}~{txobjodnttw{}w}{s~{}z{jcne`is{nroupemdatripenxvu{uuscn}~}uxreisflrxv{yzz~sz~~ww~}nbki`inrsqqwelg_nvhlehxvuwzvufg~}xxugfrikqz|u|yxvu{~uv}sdgnbhk|wruo|}ijmag||khhatwvvxwmau~~~|wxmdoqiqtwz||w|s|~yy|w}xhblgelruxrvufofarseh`jyvvz~yuch|yxsfhskpr}~yyxvwz{st}yoaemeln|x{q}~kjobf{kee_rxvv{yn_p||ywndmsluu}~{x}t|}zxtr~zuh_ijhrr}~{rzgolblzfe_bxwwx{xh`w~}zxuifqprxyvzuxyr{vvzvn`bmiqt}~uz~pisfexodd\mzwwzr_jz}{ywoeltpzw}|z}v{}xurpzwre^illwvr~nrzwqtyygozwmnuoruuttw{|w|tpcx~y|zw~~}qv~or|qdsyfdu~ssowqon_Shw{ppupy~|zv{wtx|{ennb~pv}xvvuz{tzz|~w}}ryq[qwlmuy}}uylkgj}z|r~{`icuuebZliehy|{{yh\wvw}|~xy~yso~vuemqbk|ru~sxcox~ub\ox~tncmhqz{nq|lzxndjfj_\jgzwy}rp|srogoowtmzyrzy}ntw||mcj^Zn~mosfp|psoqxkrzvuZkmYdlpp}nsxyovodygeqitqux}}tzncmemet}zs{mo~zjstehnloaY_Plxuv~t~|uk|t{sqwpoittywsw{|v|}wyou~{|ypwbZY_kzqq}mtrqyjrysx_rx\_]\jxpxuvx|tyuk}tmwj`to|pw|}~k}||oznm\RxuslnsvgfhoqnceUZg_ryt|uhryywz{vtsk[yz}|x{z~}{x}nxwth`a`aaj~{vsxstozsvgemffb\eityv}|~zxownwow{fqlanrpyxzr{qt{z{}toXam`j}uyq}ujcknqkefZicVjnp}xz||uzsx|v|{{zj^tx~s{u}{~~rw|~}ylekffY[cn}|w{wv}wtdh|oimjbibjr~wzt}|z{orj|pyzmynfhi{y}tysjn~|xp_er`^lut|ohnnqidf_qiZbbcyy|t{uxzt~}r_wvwoyxxq~|{x~vuqyqhkkk_ZZ]{|uumdzthnogmiilpnh{vrxxujvss{svwimksxu}~u~x~pjr|w~si^sk`glnyxwqputpdd_ltfag`gqn|}zz|u~}wv|{~|blyxtivw|~x}tno~vnkpmf[ZYmwvu{||zwh^[US^llj{}}rwvkmxtrowtn_oq]epuupnrll~z~}xpzytotlbitrrls}np`ymU^flkjpuii|tkv}zyry~n}mdzqrpomnutemrpr{|zll}xyws]n{nga]]cmhWi}u~}w{gkk~~}irw~s~|rpitf}upsytc{~{rjmotwpdbhjthdfikZUpnrstujps\a^o~|yzlo~zt|tkncpj~xz{}|hsxtmtoz|jic^hkytsnodUlokoxxfj~oYb^dyysxlm{xq{okrflk~}}{}mowuqzq{vhmi_ej|wpogXkqhq}hi~l\gccvxo|~lpw}vo|~oqvijh}|z|lp}wsv}s}ulriabizrqgYmogtzem~g^iaeusl~kv~v~sn}|otvijf~~}}jszxqz|ttnshb`i~vuh[omhuzeo~e^jbetqjkx~v~rm}}|ouvjjd{js{xqy{tunrgc`e|zn]qoju{eng]iaesqi|lwv~~sl|}{}ptuilcylr{~wqx|tvmrhcba~}u^orks~iik]gcbqrjwqsvzvlx~wqrujleqsl}|wut}t}~zloiaf^y}bkumpne|s\cd`otlqxnzyyosvsotjkii|j~{zy{ty{qwyjz~|vgkpipku|{l\qmvm_p}eepmztxydsxgn|xgoifrrtvngsxvxpqoq|sxwyyy~}~}rnyx{|wwx{bptnm|{kjvfporto{pl{tsxw~tilymyrff~srpsnaxzw|zw~y}}x~yrrsef`nxn}x{}mvkaf`pmvpXZftxffomjoyxrq~y{lw~jr}vwylpjjoqu~{x{|sv{omyz{x{|~kYaVZp~t}~}lfmsifkqnz~|szvxosnptpcqvneqopywjw~si}rov{mjwyvylmpohgwybcvmopkop~tru}ou}}jnptvztv~zs`gjk{p}rrvwvs|rortiv|uzt}sjalwrjlbdmmnbm~|u~{v`rrkysmywv}yylljf]yvos|{zmrwwnnlmf{{rdOZqjgg\Yhoq\bjn~{rddkqim~y~u{zqmw|~sx}uphZi~|uzzszz}rq|t]]Y`f{rts`ioZ`dkhc|{uowtkts~sz}rthnkv}omosfm~xpzuscmzx{n}uqcRPc}pikvyjjtnglpvlvpiXVdjsl|{ty{nq{~sxz~vswmkuxy~u~~z|u~}rmu}x~hgl]`axvpebhxu~~|kcge_i{ntj|tvzy~orvvtjUYhswyx~woxz}rUSXgou}xbjjg^\xznii`Sljljuwhxuwl~fac\d{~sxyouz|sxfo|phk}z}ylgkwxjmhhwkre`fu|x~tww{l{|mxuq`fwwsc]pouuwv{yx}ehj^[Yt|rjyoibswdXh}sruw|s{~vz|sq}}|yqo_Vaus|nxzsrvrq{zyylfY_jm{}posyunwwqpjmUdtmrcw{wje{su}ws~ymvmZextu|uw|u{{x|uupv]UVORqu}tpxswk{vdhfjdmsqu~}xr|uou~|xz|yroZTnlzy||{|vn{~tiry}wq\ed]fitkvrggyvl]ewn\]difs|utr}xszyxtmhjhmt}wrvl}uu|}v{tiVQn}wukqqks}|mn__ukttuv~wy||~kvuyi}rfyxdV[ipypzsp}~xy{rqjc_f`cuvoqjcn}zto}xpktpdl|z{yuw~~~ywzurv~vmjZdxvm{}klxuy{xpmXkbWkwttprnpx}yhcfelo}kw}r}{rm}polhcy~ztssjmtss}wz|~|sw{t{ptzlpyj\J\pmn||fi~{sszgi[g~kz~wty}r~qsoop||pefkqzvtmrrpu{wspt{tomng_bnj|t`z|yvlsmaUb}usxtns}yumhxzw|ric_x}w{}{nu{wmmkgj|ri]epoywykspvz}vgeifjmw|z}{uuyw~bw}tyismbY`|txxw~vxulstrlkkaW]owtnflohlvlf\n|~zr~|ttillqv~sheefgsuzowwvp}kgvvhad^chq~|ntswvmehijfqoy|v{os}gciifjujc_sx{v~xou~|{rb|qjdXccciposjhtn{t}xwxv|{w|wxyc{{q|uohjmgk}xn~zz{vm}|xxzp}jpnqpqjZX`iu~~w{qu}jk^hprno~pprmqx}vkvzlckmr~y~~|wqx}pn|rfhd[[e`_`qquvsonpjfityz}zv|{~upvx~~jtxddZcort}tzzz|ws{omlhf[Y_kstwptymfaZ_totp{}r~wuf{nrlliie_jyy{kz{qzs|~ytu~~l]dliegy~~|}ytmjklnvzyq~tvrlch}xid^V]oowxy}xtsv~{oisx{{r\`h[cco~yyqbev|z}uzy{{xqttsv~zl}o`edgt}w~|x{piehm}qujpjb^Y]dmqv~z{wf^xouvq{xtr~ztstrutgwt_Yitzy}px~mw{y~xikgfak{tbROQTmsyhdelt~{|{{~|uwytonvxuqfVfts}w{}~phsxnfinmmqiVfd]mxzsyyrov}tcbdjrwxtzvzsvrj|n`bfr|~}|{xun|zxrninxjleh{xtog^[qz||twgb}sy{{~o}psfhlkgfsuh`aktz~nwquzvvuokksqkfefdficw~ysv~s}{wytnxx}|zytvsmkmsqlmi[p|{}y~yzxnir}xx|}|rkqytsstmkbYljfs~~{mklpwzywvxxtt~{qhddpzptijwssvuu{{~}|zurqzp}~rctlei^b_YU\nutx~}twrla|{{|}uxnnmnqw{qhdgntvqqrpn|uulhghnkgedd`doi{{tunhc_m{zwwx{}kelz~~zokf_x{~}vlnxywxts|qd]Z_mvjh\[mt{tmmkpvx|}ujcyuqtec^Y\jwuqttr|~~}}foscjkmnmj_\bm}ywy{rqbpyzyxwoknrvxngcbfjy{tshefir|{yv{tf\cpywqnd_hcwz{yxrpq{w}wxwrvvhffis{mha]q{~yqjouz{vvqojd^ougi\SVW_r{}zvwv}||xxjh}srxrqnmjgpz}z}ywvzpuqq~w{yertijimmkf[Z^gs}zuuhhkpt~}xyzzu~xulirz{uqqjszwy~{wtx}{|}|xztpleistoec`^hj^dci}~yxsqpv}~{}wpqpssmjwugg`\dksy|ts|~}zvtokjldbwndhcbhmsu~}{xonsv{~vy~tvfnvtqnliifgqy~|~}ov}mvtpuux|zxzyubiprtpi]]ejoqy}}{tvvz~xslfdes~}ujd`csqr~z}}zvsptzy{|w}wsnc`jmvrr{w{yzyx~tpyusrvzpnkhio}~nvwqrxuqrys||ujdj|zi_nsuvtuu{z{}ut|cadhkr{tp}sdknv{todbbcdn~ty|ssnp{swuv}uphpqm}y}ufq_fyrscTYf`bhis{}tr{vlz{ou||wvdnz|roupokpv{zvruu{{nssjmnxrtulgty{ogfbb_bfifjeXzxr|~zuntmqsuvlkjbdt|yz|v~lm_xq{~om{w~zy~seV[etymhWiwhlVktgostij{x~u~xqsss}zssv|wmr}piir{ymzwqozxsbn|yy~x~}}one`htxd`erviafebmtxl{|ob`oyt~uglqjn|uewx{qtkozu}}xwv~}{os|rwzxsdTnqw~xewsnjpvc`^urw}znmmgr~sorzlfmt}um{zyltxjdj~st{rmzlyz~qoUR\s}etyqebqjgS[}smora\vx|x~|}lh}snz|uux}{tgpqvz~y~nop{xuwy~~vh^qxim}z}wqukcdpxxnslx{pkZ\f~yruvykugmz|wizpiki]gos}yu}zy~~~|wz{wiVninroqttajsg^d}wu}taexovr~p}}xuvlkz~|l~plg_l}vw~zj|wpzy~zo~xz}lpfibo~~v{|oc`bnmgrvtwsx^dvpusqdxotynarwvo~~j[n}~{{zpt~~z}{uumhW]cagzo}tealvpsmrjmkmkzyztvzwlfes~z~vvqt\j~}u}u}|shz}yyxp~{yse_pcjoxmr{ig_v}xic{~f]dkljx}~xhvton~|}mpcnkty|ummvqx}}}tl{wpnqbXs|wvtjmnemw~~stjawlswz|uv}ji{qwoo_tzh]gv|qzvuyr}yvu{wloiggrjnsolmpjdmmgzwlhpsff||y}{{xuitvww}qowleb{pztyonzxjj~y{~~|zvkgj]VbcswswtzseYZasycUYegn{qp{~pqntxpg_rnaemytzqwpotzuxzm|wz|{vici[NXixxym{lggjjqmj`\fboqzk|{pzyot{sdivd[_jyjlt}tt~s}}|svp]csiijj~tzy\lytoukkkmg]}tysln{s||yisv_gzrjhupu{|~x{n~w|{v|l}k`hjerr{sijtz}viitvrg{vtcluunk{zrpf]vwjqn|~ty|zzt|{|i|uYWpmhoos{~kmgotsnrin}kxxwluq~po|xn}`gwlp}|v|vt~v~|puu}~wuyx|mZnm_ozzz}lpmotvhiikynfxg|vq~vlxsmw}x`b}o`ny~xs|zt{}q|}|{on}wxn]gm]cv|z{vkgrupmepuk~jsowzqoyzf]tk_q~}{~uyv{zztqy|qkz|q\js\^uwzurkktzsrmakqg}}hk|q||jw|oz{hc{tbn|zp|xytqzq}uxsi|~nV_nadvu{|wtrqytqrgimg~ku~pusm~}kr~~f_yualw{}~{~zy{wtwryvrzyo^gn]^pu~yxrotokjcnog}lu~y}vp~zoxhf{sfpsw~~|wuw{yvzn|}}~vlqkXgqdisry{{uu}~urndlffxyjzzu}so{ukx~heumaqvzx~zv{}yx~l}w~{r{~rs~z{kZfmagqmr~{yvytnnhqmi|znx|vt|tlz}edztdoqrv|~{v{ztpyn}~}xrpzzp^hrdetoqy|yuvoofnpf|w{kzwvqp~zproetseqxvx}}xy{tzowu|{v~riw|zq_crh^mlrx}y~|tumkrhytry}uuwso{rehhgYUj~wrtvlvyykxvqy__bon]Ycdjxvyyqwxo`wtjw}x}}zu~qxx~~xxq_drsyi|y|~~vtt~{sgo~xxuxw~mb{se]fmbbdyyoilprgqst}trpi}qjtxp`wogVfq~~rpzpt|~}znloqohwm]Pacidbquvnnxxsp}}{oviw~sv]WYiqjn~uwuv|ulzqgv|rfwmmpqogd`Y[q}{~|tysibpvzpoyx~{itvrrxxcpsdcg}||q|dhlz{wu}kWj|scahdL\kgipw~x|xqukhu{|lsvwptppwxtcqkdZh{z{{{vtxpswv{{whpejtbdSRYkmnxpvtg_wwxsyo}z~pnhunqoidjkmx}y~{ptrnp{txzmtdo}jnvvfScyifn{zusuk`fsrzzp|yud]zpb`faUs~x}|qz~wzpu{yw{~rqpuodiomppqVXnfnpxydq{sx|w|}}sorz|tvpevdgebl||pjjmrkd}|qrkkrhkbvm\^^bbq|x}hh|syx{p}qzxixxohvxt{wdXi{z}z~|qqsrpytysnapso`Xqu]RXbce~|u}lrmqq~y{~ypknutmuvusprVl{z~y{skd~zy{|yrujdhouphlVak`npx~zmxkbkpjvwvsmm|vvlp{_cdkpyywz~|~qc}m~usum^dplfk|ujhobWc{~yh{ws|{}|{nqshp~xj\jxiY_ioo~z}}uhqqx{u~spebgpshficgdpaetsguwz{xprvmovyxkke[vrw|pug{rfkuvu{zgl|ulhrwhiVkhYinzz{}yxxpvzwsqljdatzwnp|vpqxnhx|zywvpi}|xw|y}uvwzo_itz||~~~x~{pahkmkjilwuuwt{|~tTekmpx|}t}||kv~}}z|yul}~~{pZWbionrquywvnu}WI{qjjhollfi{pqoo{zzx}yzutx|{pYamxy{}xpny~plloVm||{sqn{nt{mtrwz~zutukiq}obr|m]W^gWxynd`blqywymWbp`^^_mqzsls}kemja[jux}_^p|zrtxy~zwxwwkb]lpg~{vt{hvppjz}xx|ujow{nqppb_ZpoxvqpsprroujTgi]YXsz}qitichqicWu|s~rzoZk~|mlnv|srxyvkjd{nyzyxw{{y||rjwqjz}xx}urxt~yimorifbl{u~~{tstooqkpoVbma\Xtvhnibfqkh[o{r~sxu^i~olnrsmtwxmng{txyz{y||y}|zthztlw{wv}ws{v|}tfjnrkifo|y~}vvwppqlqmVgnc_Zt~~rfog_dnhe[u}sv}r`mpnpv}}|nlrwvmmi~ry|~|z~|z}z|mmxvm||{ttzszxz}yzlcimrijdvu~xzwprpmteXqkf]a{}{kcwtb_glea_{x}yidwzoop~~{}ujotyrnhqwv}}~z{|yyf~xunwyrxyvqwyzsefjqmhehwo~}}vttotpYjrgf[p}|}ocl}g^bkeb[u~zs~scosppxz}zllryvnigtk{z{x}~gxxylu}|svywoxyzvgejpofbaog{wwrut\kvjk\j{zynbi~i_aida[p|u~qwfmuppv}{}|nkqwwmicpe|}z}ksy{ntvxts|yuq}{}{yzldiorhe]idvzzutzgcznnd_w{zsfcvqb^fga_c}s|s|mhx|sqr~{~ujmsypkciik}~|zvjzxkzuxqu{tsrz~yytedipmea`lb|{uzxcpzmp`eyxwmdi~k`_gca^n~r}o~jl{zusw||{|ohmswnjbmgt}~z{rn|{ulwvupvxsrvz{wwpabfnid`cle~}x}wdtznq`gyxvlfl~j`_fa`_rs~pkm{|xvz|{z{nejpuljdpju~{|to}|xj}wwvpswqrvyyutp`^clkeccqh~~x|{ir~ptecwxwogk{mb^db``nut{okw{z{|}~zxxpcejrmjgnto~{{my}mryv~ypnuprt{}~~wsppdZ]dkefdsr{|zrk~xrq`lwvsiiswf__d_cg|rzkr~}{x{~xvtsd`emqkll|q~{qx{~tl}v{~rlqqpt~y}z|{uqnmfXZ_igghszw{vk||rudgvutkjq{h`^d_ch{s}lp|~y}~}wussf^bjpkmm}u|rv|}xk{|uzsmqrpuxzxzysolkeWZ_jhiiu|y|wn|swehtsskkszia_d`el|s{lr}w{~|zutrqc_bjnjlpt}q|z~ul{~~yu|{qkqppv{y}{~x}wvomjkaVZ`ifhjzxssywtcnttqjoxtg`bdags|}vtnvxz||wtsrl_aenkkkvzwxt{~nr|{{uxvnmqms}w}vvzxurmljhZY\efdgp{s{rvzlhtstlmt}ld`eaelzs}ns}vz~}{yttrqc_bjkghnzo}szrmzz{uv}xplqmqwx|vxyyvtnmkj]Y[cfbdivmuy}qisstnnupgbfbelwt}ps|w||}zztussgabgkefjvlt|xlwyzvu|{rkomnu{zyx}wzuunnllcY[^e`acrlxy}~}{jqutrns|wkdeeciwwztwqx}wy~{{vtssobbcjedeqopyy|pqxwxtyvompkr|{x}tvxusqlmkk^Z[ab^ahriy|vlttupqxsjdhdfnvuyst{~xy~z|xystrskaadjdeftlww}~~nswwwsztmmnls{x}|rtvrrnlkji\ZZa`^alqk|}vntsupsyskehehqxv{tu|~xy~y{wxrsqskaacicehunxx}~prvvvszunmols{w{~}|q|stqpmijii]YZ`a_cktl|~zntturryvmfighqxzxvty~{uwyuvqqqqmb``gdeiuts{z{voutvsw~wpkolq{}wx}{}srwpqlmhhgibYZ\c`djxs}~sqtstqw}}qjhkhp{w~sw~~t{ywvtsnpnoe``dhejq|sx}}ostutt{{slnnox|yuyy|vmzznokkgfgge[ZZbbdkxyx~xptsurv|tmhkipz~z~sv{~uwzuuqrmonog``cifjq~vx~}pqsstsz}tlmooy{ztxwzukxymnjjfeffe[Z[bcely{yyqusurw|unimkr~z~tw|~~swxtspplnmofa`chflt~uy|}orqsst{zrknnq{|vtx}vzrkyvllhhdefgc[Z[cbgn|xvsututz}slkmmvy{ux|{q}ttqqnmnnmca`ffgmyzw{}{xprrtsy~vokonv{~sv{vxwkqznkigfdgfg^[Z_abit{ttvtwuyxqknms}~|}vw|}~svxsrpolonogb_bedjs{r|{}prqtrv}xqjmlr|}|{tuywwxmnzqkjggdgfh`[Y\`_foxpwxvxwz{slnmr||~{xx|~~uu{tsppmpoqic`aechpxottssrv}{rjiglzztlt}qrxzowswxopqtrkjjpnrxx}yzqzwu|poqsvx~stsldpzw|wy}wwxxvmjgkikpyusy~u}|}wyy}}wqpksqr}xrw{utit|mheha_^cfgnvypywx~}rtuyz|pmfj{{qx~suzwq~|y|~}ztrrwuzxuujrxnmujijlpr{~ulihiuqutpu}|}ufnws{|zpmjonpv}{uqdb_j{}}vocejtx|}ssuietsqttwtvuwrljimkpv|sz}{}{wxy}xtuu}vun_fut}}qjefeciooezx{z{wvx}~tutxx}{qggfoztty{r}{y~|}|{}|y{{qwrjkimnuz~skdffp|upxyorvvuthfx}}{sqptqw}w}od`dj}|~xmehmvx~}}xorpdhxvvutusvvxqmkmpnu{|q|~zzy{~~uuw}~|tnog`p|qlhjhiotmjx{}|}tzw}uutww}ulfjn}z|svz~vv~|||y~zz{xwsyplkloqx|xogehm|{~pr}|roryvpsmesxurutv}}y~{}{~|ofagl}}zpgimux}|{vnqpegyywvtvtxwztpnoqpw|{p}~~|{y|~~vvx{y{{olnfbtvqmoknsvln~xz~}~~~{{t~}xzuttww~}rjgkq~}wsw}}}s|~{~|}}w}{~|xz{~v|xpolpqw{~skfhiv}uqy}tmpt}xptqfk}}yuvwv}~v~z{z}ribehvujknuy}}{worrgfvxvutwwzy|vqooqpw{yo~|}~}}|y|~~vwv~xxzynoncbsz||wstov~~}wtx|{rr}}qptouwwvy|tlkkrz~{hj}|ws{wuunqysz|x{{|zytrw|}~sryxnw~~xpppu~pq{}~vnz}~}|zpovyz~{w{~~x{tytsx{}|zqnoq~~ial~xpouphq}z{z|wwrry|{}}{twz{~qtrpx{snoo{|}sms|xz{ungnx|{zuurqklot|~{su|pqvqtu{~xoonu{}yofku~wp}~~|xyuz}{riompxynhghs}t|rqzzshfmv}zyou~}{}wpolmv~}}}wxz{x|{~{|{|rjbjv~rkvyutsxz|uqmnkqwyr{|{~~~|ytwyzu~sltsuzwrst|ury|}vnkiju~~ywonpty|zwor|xmntpsty|~wopov}xywphmvzr}~~yzw}}ty|rgnsu}vmmlt~xwwps}~{tmfls}y~tp~}wrnonw}}y|}~z}w{}~xz}{uojkv|oo||yvvy{}~xsnmnnw|zrz{}}}ywz||ss|ynnyy~~utuz||}ux~{uoiklt~zxqsswz}}wsmu{tjqwuxw{|}vpss}}uv~zupmv~xu{y{{{rowvkivz}tppr}v}~rou}||wrkkryz|zqw}wsmopw{|}yw}|}~~tt{zyvqnmwtq}|ywz{}~ysonppy}{szz}}}ywyz~yqr{ynnz|xwx}|z}vy~{|snimnx}zsutxz}|vqnx{rjswwxx|}|vrtv|ysw}}xtnoxvzz{{~{umsxqhox{}uus|yywpr|}}ysmhot}}{~ts~|{upoqs~}|{|~yxy}~}tryzyvpliqzzt~~{x{|{uqoppw{yr|{~}}xvwx}}xrt}ynmw}wmmms~}xxx}vov{{wq}~~txrwz{}{|}~x{xswx}zwx{zrrsx|}}|llxwxxzxyt~z~y}{~~}yvxy~}svv}}vvw{}}zwmow~||t|}srzsotuvxwvruu{~~zy|sxz|~~xuvx||vkjt{}|sw~||y{}|~~nosv~xrlnnx~~uxztv}vnjpu}~vt~yvts{~|~~~}xwxz~zyw~~tmflv~umu}zxtx{zxturx{zs{}y~}~~}zvxw|}yxvmtx{{wxz|{}tsx}{trpr{}}}ywppprvy|wtqyynpwwzy~|vxw~~|yx}voipwzt~~}~||zx}riqv|xttt||szvqu}}~yskjou}|~~tu~~{vutv~}|~yxyz~zxx}y~}zsmhowxov}{vy{zwtusx|{txy}~~}{vxwz}{xu~wmrz~z{{~||}wsy}|ytqrs|~~~|yuqrquw{xtqs}|slty{|{zxyzz}vw~}}xsnow~xw~~~}~xsu|wmlx~xvvx{t~~uqv|{{vqknsy~~~||ty~{xtvv|~}yzy|}{zv{wtyyxvroox~wq{|x|}}yvtvv~zs~|y}|~}|ywxx{}{wsu}{rny}||~|z}xzyz}~~~ww~zzy{~wnj}mowxyvy{{{zxxvnt~ysmpqw{~zz||v~|wy}xtx~ur{}~~{z}unryz|wsmnpty}}}}{qt}~~|zwx~zywrrt~w}~}y|yrs{}~zuty|{}{y{}~}{|}~|tq}uw~xxwx{~|||}{xz}vw{uu~~xrttxz}x}~|{|z|xqn~xx}{uqw~{rowyzz}|z}|x~yslpu|xy~~~}{}~yz~}}zutz{{z}xusw|ts~|~|xpmsy|}vvwz~x}zr|}urz|ztpqz|v}}}~|}{yw~~zrtv{wvz}yxvyx||vpy|~zuqtv|{x{ysz~zvu}vx||~zwpqtw}}su|~zuqov{yts||tlrxzyx|~}ywz{|}vw~~~ztruw|~}ut~~~vu{}~xyz~~~}ywtz{|vpjllpsxy{~tox}~~|tq~{|xupquy~|wsz|}~~}~{ux{wlq{}yzy}}wov{uxwxxvtpsty||wuwyt{|xxx|z}vsuv{}yx|z}}zzvsnqtz~~usyzzwy{}xyw|}xz|x~zvprsx{~wot|zs|}~|xuxyzytss|~{volnpuw{yyz~ypny~}vt|yywxvvsux|}|xv~}~xyy|}~xnr|~}~|umq|vyzzzwtpstx{~}xwy}tw}|~xyx|{uprrx|{u}~xzzvvtrqqwz~xouz}}|zwxyzxv{{}{xtruv{|}|}{rozyu|}}|yz}~}}||vuv{}~|wonoquwzxy{xoq}{svyyxwwutrwy}ww~~{uxw{|~{|}zpjt~{tny{uvtutsrswx||zxx}zsz~}xwy}}|~ztsuvz|}~xywvwuutututy|~utz|}y{}~yzz|}{w{}~~zuprrvx||{}uox~ws~|~||zz}}~~x~|vvx|zunnprvy{xz|xor}~{txxwvuvtuty{}}~vy|zvxw{{~{zz~xomyzrpxvvuvutrtuwy{|wwywv}~}xyy~|wrtuy{~{u}yt|uursqqpsw{ztz}}~~yxx|||y{}}~zvprsux{|y{}~ums~yt}{|z{{zyy|}x~|wvx{}xqqqsvxywy|xpt}wqx~wxvwvusrvx}~v{{utuvy{}z|}vmoz~vpwxxvvvtspsswy}{yz~zrw||zzz~}~yssuw{}~ww|vyywussqpnrty~xz}z{z~{w{y||~|ytqttwy|z{}{rox~}vv||{}{zvwxy}~{z|wwv{}|z~xstsvx{yy|~uou||tr}xwtutroprtz}x}~~ztuuwy{|y{}~tlnx~xrxxwuuvtsqsrvy}|y{|tw}|z{z|{|vtuvy{~|~yv|utzvustrqnpru{}y|}{~{x{z}}}}ytpqqtvzzy}vos{yt}}}{{{zxvxw{}~wzzxxx}|{z}wtuuxy|z{~}tpx~{ts|wvtusspqsuz~}y}~~ztuuvxyzwz|~tloxzsyzxvvvuspsrux{|y|~uv|}y{z~~|{}xtvuxz}}}zty~vr|}utpqppootu{y|}||||y~{}|}{wrprruwywy|zrox}vu{{y{zzwxyz}~|v{}yyy|~|uuuuwy{y|{rr{wqtyvustssruvz~yx~~~~zvqsrtuxwvy}zrls|xt~yxuvuussuuxz}zz|zsw}{{|}~{vuvvy{~|~wu~yrswsqoqprptwz~}z}~}}z}{}}}}yuprrtuxxw{}tnt}xu{{xyyxwvyy|~~~|ux}|xxz{|vvvvxy{y|zrr{~vquxusrsrsrvwz~yy~~~}ytprqssvtuy}xqmu~}vu~yxuwvvstuvy{}z|wsy~~{||}}ytvuwy|||{tyzspz{tsoqpqpquw|y~~}z{}|}||yvpqrsuwxw{~woqzzu}}{xxyxwuxwz{~}}tw|}yyzz~}|}~xxxxz{}{~{sr{~vqwxvsrsrrpstx{y{|{~|xrqrrtuwux{~ummv}|w|}zwvwutrtsuw{|{~uv{}{{{~|zz}wvwwyz}{~vt|vqtwsqopoonqquy~~}~~zx}}~|xtqrrtuxwy}{snu|}ww|zxyxxuuuvx{~|yuz~|yzy{{xw}}xyxz{}}}yrv}ztr}~xvrsrrpprrvy~~y}}z{~~zwqrrrtuwuy}~ummv|}x~~|xwxvurtrtvz{{~vv|~||{}zxw~ywxwyz}|~xsyxrrztropoomopqvz}zw{~~~~zvrsrtuwxx|~vnqx~zv~}{xxxwusutvx||}~uv{~{yzx{ywx{yzy{|~}wrx~xss|wuqsrrpqrswz~z~|y{}}yvqqqqstuty}}tmnv}|x~|ywxwususuw{|{vu{~|}{}|yx~yvxvxy||}zsw~yrpy}usoooonorrvz}}zy~|}{xsqsrtuxvy~zrnu|}ww|zvwvvtuuuxz}{~zsw{}zzzz|zy|zzzy{|~}}us{~vquzvsqrqrpstvy}|z{z}|{wsopoqqtsty~zrlpy{x~{wwwvutvuxy}|}|tv{}}}|~|z{|wvwvxy|{~~vsy|toq}xspnpoportvz~||z~}||xuqrqstvvw|}vorzxv}zvvvvttvuwy|{|~xuuusux{}{|{~~y{|}||}}zyyz}{{~|z}~|~}|y|~}}}zxywuxx~|vsuw}~|{}z|z~x||yuy~}~{||}yyz|z|~~yx{}{z}~~{|}~z~|yz|xy{}}}}|{y{~||}~~~~~|yw}wy~{x{}~|{zxww|}~{{|~zy}~}~|ywuvwurw|x}}~}~||{~~}zywzy}~}z|yzzz~z}}z~z~}}}zzywvtywy||}{}}}}|z~ux{{y|~}|~{}|xy|~|~|z}|}~zz~~|zutxvxxx~||xx~~|yzyx||~~}|{}|}zy|~~|~|~|xwy~{xwzuuvwzy}}{~~}}~~~~xttxy~{}~}~zwx}~|~~}||{~}z{vtxuxyyy{~{}~}||~}~~{xz{x}{z{~|~zz~~}||zvy~}z~}~~zvz{~|zvyuwvu||{~}{wz}y}|{vx{}}{}~~}~|yy|}~~}{{~}{{xw}}x{ywut{{yz~~{|{}z~~}~||zyw|~}}~~~|z|||{||~|zz~~~}}}}~yyyuyw{~}~~~{~~}~}~zxwwx|||~}{|w}~x|~}yy{~~|{}y~~|{}|z}xxwwux{~zzx{||~}~}}zvu{~}||}|yz{|}{{{~~}|zzz}|~}~}y{uv{|}{{x{~~{{y}{}~~}yww}~}~~}}}~{}|~|}~~v~~}z{y}~zwwyz~|}||{}|}~~|~}|yy{{{|}}y}~~}~||y}}}}~}{{y|~~~~~|{~~}xywzyzz~}}|z{}}~{z{{zx{}}}}|~}|~y~||~|}}}|xyv{|~z}x{|x{z}|~|~|~|{|~~}}x||}|{zz{~}}~~{}|}{~~~}|{~|~z|}~~~yw|yx{|||{y||{{}~{}}y|~x|~|zz}}~{~}~}~~~|yy}|{z}yy~~~|{|{|}}|xz|xz}~zyz|{y{|}~|~}}|~|}}~y}{~{~{}}y|svy|}|zy{|}x|}{|~{{z}|}||{|{z|~}}~~|y{|||~{~}{|{~{~{|~|}||~|z|}~z{{~}}}{|{xxz~|{|}{{x|{~~|~{{yzvz|{~~~~zz{|xx}}~}zxzy|~y{z||~~xz|xy|~}{yz~}|}}}y{y{~}|{~~~}y|||}~~{zwwvt{|{y{||z}{{zy{{~~~zvzz{}|~}z}~}}y}|z|z{||z|||~zz~}yxz}y{y{y}}||{{{xv|~~z|yz{}}}~~~z|vxz~|~}|{~|~}~{w{~|||~~|}{y{x|~~|y{|~}}~{wvvzz{~~y{|{{~|{z{{zz}|~}{|{|~~{{||y|{{xxzyx{|~z|y|~|||x{}{||x{x}|~z||zyz||~~}yz{}}|y|~|z}}{y|}~}}{~|{|}xz}~}{~|{{yzz{yx}~}{v{yz{~~{~||{~~|zz{z{{||y~z}yx~|||~~{}}{zz}~~z}|yy{}{{|{~~~|}~~y||{y}}~}~|~}w|{~||zvyz{|}~}}~~~}|}x{}{{{}}{zzx|~~~~z{~}|||~~|{~{}|yw{yxxz}|z{|{}~}{}~~~|{|}|}~|yz}|||~}}|u|z}~~~{~~|}~~|~}|zvw{zyyz{}{yz~~~}~||~~z~y{{~~y{{y|{~|y|z~{{z}~~~~~~~~}|~zyvz|z{z}~x{y~|}}~~{zxy~~~~xz|w{x}~}x~}~~~|}}}~{yz|~yy|wvy~}~|}{~~|y{z|{z}~|{~{}|z{w}~~}}yxw~}}~~|}}zuxxxwxz{zz|~{|}{}~{{y{~}}y{x}}y||z|}zyz~~~|}~}{|x|{ywyz|~{z{}x{w{|z|~}~}z~}z|y}{zzyzzz|}y|}||}}{~}|yx~~}zvz~|wvzy~||z}z~|}{~{yz}}~|}{|{zx~~|z{xwxy~|~}|~}~{}|~~|wwzzz~}{{}yz{{z||~{~~{xu{~}|~yz}|{~~~}z~}xw|}}|}~}~~|~y~~{z{zyw{|{z|zvuy}~}z{w{}|~xz}z}}~|zz|}{~~}|~}|xz||}~}ywyy{yxy~{~|y}|x|~~~|~|}}z{}{|y{yy{~|}zyvxz~z{~}{~|y~{vwwy|z}{~zx|{z|||~~}{wz||y}~}yz{~{{||{xw}|z~~~~|}~{~~|}|z|zy{z~{{wwtvx}}|zx{{~~~}x{z|~{|{xzz|{~~}}}yxz|~~~yz{|zv}}}|{{~~}{vy~~}|{~}{{}|}|z|yz}~~}{zyv{||~}z{~~~~}{wuu{x}{{~{y{{|}{~||{x{|~}zxzz~||}~}~zx~z{|}}~|}}~|}zyyzxzz{}z|{yxvw{~}}|~~}}~yuxz~~{{}}{xz~z~}}~~|xy{}~z|{uw{{~~}~{vwwy{}|}}|}|{{urvuquvw|{}z{|}~~|}|xyxx{vwyvt{|~vuw{||~|z~}|}~}vxzww{z}}{||||}{|{~}}~z{zx{yvyxty}~|x{~~}~||}xvzyw||~{{}w}||xzysvwsv|}}~||xswzz|}{~zyxv{zz~}}~{vzzx||}{zwvz{}}~~|~{~}~{||~}}yxuyxvxy{|{twwuxxw|{|~|||xuvstyxz|}}z}}~}}{}|}}~z{}{}~}}~|}~~~zwwv{}{||~}{y|~}}~~}~}||z~y}}}}xy{y{~|~|zy{xvvwy~~~}|wuvw}~|~|}}z}x{|||yx{zz~|}}}}}|~{~~z}~~|~yxwx}}{{yy|~|wzzzyutwww}~|zx{{wy|zz|z~{{}z~}y{||{}~~~z|~}|~~xwxz~~|~{{zz~~~~~~~z|x~|~~}{|~}~}{}||~}}xy|zxvz}}{{}wvwx}~~{}{~y|~~|xuyyw{~~~|~}}}}~y|}}~zxxx{~{{|x}|}z{}}{wtvxvy}~~~{{{zy}|zzyz~|{~}{}}yz|{}~}~}|~~~|z}}|xxy{}~}~~~}~z{~~~}}~~~y|y|~~}~}|}||~}|x{}{zxz}{z{}xvwx|~~{}{z|~}yvxywz~}|~~~}~|~~z{}}}{xvvx||z|yz~~{}~zvuxxw|}~}~|{~~y}}|zzy}~{}~~{~}~}x{{|~~~~||}{~~}{}}}{yxy|||~~~{|}}||}|}~~~z~z~|~~}|}{|~}{x|}|{y{}~zz||ywwy}}~|}|~{|~}xvxyw|~}|~}~}}~y|}~~||~ywtvx|{z|y}}|}zxwzxy~}~~~~}{~{}|zz{~||~}z~|zy|{~}}{}~{}~||}}}{xy{~~~}~~~}{~~~|{{~}{||~~{}{|~~}}||}{y}~|}{z|~{{}|zwwy|}~~|}|{|}|ywxyx|~}}}~}~~z}}}|}|xvtvx{y{{z~}}~~zxyzy}~}~|}}~~}|z{}~{}}~}|}~}~y{{}~~~}|{}{{~|{~|yxz|~}~}~~|}~}}{|}}z{{}~}~|{|~~~}|}~{z}~|}|z{||}}zwwy{~|~}|}|{|||ywxxx}~~}~~|~{}}~}}~{xuuvyzxzzz~~~{y{z{~~|~}~}|{|~}{}}}~{~~}z||~~~~}||}z|~~{|~|yyz}~}~~~~~}}{}}}~}||}}zz{}~}}}{{{~~|~{{~~|~}z||}~}zwwy|}{}}}}}{||~|zxyxy~~~~~}~{}}~}~}|}}xvtuwzxyzz~}~}{{|z}|~}}||}||}~}~{}{{|}}~}~}{}{{~|{~}{yz{~|}~}}}}|~|~}||{}|yz{}~|}|{|{}{|}~}z|}~~}zxxy||{}}}}|{{{}|zxyyy~~~~~~}||~}}|}||~~yvtuvyxyzz}}|}{~~}~~}}}}|}~}~{~~z||~}}}}~}||}z}||~|zyz|~|~~~~}~~~}}~|}~}|{{{}{yy{||~||~|}{}}}{|~~}zxyy||{}}~}~}~z{{}|zy{y{~~~}~|}~~}}~~{{~|||~}xvuuwzwz{|}}~|~}~~}}~}~|}~}z~}z|||}}~~}|~|{~|~~{zz{~||~~~~~}~~~}~|}~}~}{{{z||yyz|~|~}|~|~|}}~{|~~{yyy||{}}}|~z{z||{y{z{~~~}~|}~~|}}~~{{}|||~{wuuuxyx{{}~}~~~~~~}~~}}~}~|}~{{}}}|}}~~}}~{~|}~}{zz|}{~}~}|}}~|~}}}|~|}{{{{{}yyz{|}}}|}}}~}~||{zyy{|z}|}|~z{z||{y|z|~~||~~}|~|~}z{~}|}|~zwuuuxxxz{~~~~~~~~~}}~~~}{{}}~|}}}~~|}}{~|~~~}{{z}||~}}}|}}}|~||||}|{{{{||yyz{|{|{{~|}}|||zyy||z}}}~|~z{z||{z|{}~}~}~~}|}~~|}~zz|~~}|}|~|xvuuwywzz}~~~~~~}~~~}~~|}|}}~|}|~~~||}~}}~~~}{{{~{}}}~}|}}~}|~|~}{|~{}{zz|{}{yzz{}~{|{||~~|||zzy||{}}}|~~z{z||{z||}~}}{|uy{{||||||}}}~~~~~~~{~}||}|}}~~|~~~y}zyxyz|~}||{}~~}y}~}~}~~}}{~}}~|x~}~~~}{||}}}~||y|xxwyz~}~||||~{wyyvzx~~}z|xx|{}}~}~~~|~~~}z||~~|}|z||yyyyz}~}}}zx{wyyy}{yyzuz{|}~{{z|~}}{~}~~~~~}~|}~}~}~~|~{||{}{}}~~}~|}}~{~z~}{xzwy}}|{x{~|}|}}|{}z~}{{|{y|}~|}~}~~~~|~|{z{y{~}}}|yyzx~~zy|}}}~~}|}z}z|||zz{|wzz~~}||~}}}|{{|zy|~|}~}}zx|y~~~}y{}~|}}~}}~{z}{}{|}~yyx~~~~{|}|}}}|}||~|y{|~~}{{}}~{y}{~}||}}~{z||}~}|z}{}|}~{zw|}~|||z|~|}|~}}~{|{~}{{}|~{y}{~|||||~|z{||}~}z|~{}}~|{w{~}}}|{y|}{}}~~~|}{}~}{{|}~{z~|~|{|z|}|z|~|{}~{{|~~||w|}}|~|~zy||z~|~~~}}{}~}{||}{{}}{{|y|||y|~|z~}{{|~|}w{}|{|~zx||z~}~~~}}{}~||}~|{~}|{|y|||y|~|{~~zz~}~|}w{}|||~zx||z~}~~}~|~z|~}|}~|z~~|{{z{}|yz{{}{z}}~}}yy}{}~}{y{}y~}~~}{~z~}~~|~~~z~~}|{|z~|zy{}}{y|~}~}{w~~{~|~~|yy~y~|}}}~{~{}}~}~~{}~}{~y~}{x~}}|}zz}}|}w{|||~z{w|z}{zu~|z}}~}}}z~||}xw|}{{{}}{}||{{z}{}||z}}}}~zwx~|~}~z|}}y}}}|~~|}}||{|}}}}~~|~}}~|~~~||}~~}~{}}vvw|{{~~}|{}}~}z{~y||~~{~{{y~~}~z{|{}~}zyurxwz}zx}}w|}{|}}{{{||~}~{y{{}|||~{~}~|~}w}zz~|{{xuvsxy|{}{|~z}|}|~}}}{{}~}~|}wz~~~{}}}~~x{{z||}}}yyw|yyy{z|u}}yz}~{~|}|{~z}}|{z}~~}}{}~}{y~|z{w~~yvzxyz{z{z|~}~yz}x|~{|~}z~}}z|}|||}|yzxz|~|}}}|yt|yzz|}{yzz~}~~{{|{z~|~|z|}z{~~z|z|w|zy}}~}}zzxwzu{~{}yw~}~zy~|{y~||zz~~||{}}|}}}}~}~y}{zzv{~|xvyz{}x~z{|~~}|}}z{z{~}~~}{}}|~}}~}}}~{|xy}{{}~}|~zyyz~}|}z~z|~~y}x|~{}}zz~}yy{||{||~{~~y|}yz{|{zzw}}}}|xw{}}||w}|{}yz~~{|}{|yzx~{~~~}{|yxvy}zx~z{}y~~||xz~}~}||{y~~||}~|zy}x}|~~~~~}}yx{||{|{}}||{y}}}|||z}~}z}}y{|~}}~}{y}zz~}}~}~~}~|yzy|~|~~|z{~}|z|||}y~z}xzz|~}}}~~}|~|}}~}}xu~~z}}{{w{|~}~~{}|}|{}{}~|}~||~|~}~|xz{v|zzyx|}}~}y{wxz{|~|{}~|~~|{}|}}}~z|{~~{wu|}{{{{xzz}|~|~|wwuvux|}}~}}|~~{{||}{}~}|}y}}}}}}{uvz}}}||}|}{~~~vvwttuy}}|~}~~~||}|}|~}{{{~~{|}{vs|}y~|{z{|~}~~}zwyvuuw{}{~}~{~}{~}|}|~~|~{|~|yvxz~}{yy{|~|~~}xxxvuvx{{~|||}}}~~~{}{~~{{|}{wv||}zz}~~|~~ywyxvwxy{|~{z}{~}}}z}|~|||~{wu~~{~z|}}~}~~yvxywwwy{{}~}|{|{~}~~|z~{||~~zxt}~{~{{|}}}~zvyywwxyzz~}~~z||~|~~~}{}~}~||~~~zwt}|z{}~~}zxyyvwyz{{~~~~|z||~|}~~~z~}{||}||z{}{|{}{|~~||yzx~z}||{~~~~{}~~}|~}~}zxz}~}~~{{}}x~|wy~~~~~~~|yz{}|{||~|}|xzz{z}}z|~~~|v|}{|}~}yz~~z{~}~~}~~~~{w|xy~}z}}~|}}y||{|}~|{xz|{}zz|}~~yy|}z{}||~}{|}~~|{|}~z|}|{~~}z{~|{z}{}|}~~zz~~|y~}y~|z|}}~zyx}|{z}{{|z~~{{~|zz}}||~|}}~|wv~z}|}|{wz{~}}{~}{}~yvzzx{ywzyy~~yy}{z~}vx}y{}}~}}}}~{}|}|~}~|~{|{{|~}wyxutx}}{zy~{yyzw{|~{|~~{{~~z}{}zz{}{~zz{{}~~x{{uy{wy}}~{yyx{z{~}~}z}}~{~~~~~|~~|~~}|}|}|{xtruxwzz||{}yxxwx{{z|y|~}w|}}|~|}~}y|~z~~~z}{}|yy}z~~}v{~~~~z}z}~z}y{yyz|||}}}~|~~|~~{}wv{}ywuxz|~}||~{{}}~zy{x{|}}|~}w}|~{||}~{|~}}||}|}|||{z{zy{~|~{}~yvz~{{zz||~}~}{}~|{}z}~|~}{|}{|{}|zx|}|||~zwyyzyz~}{x|}}|}}|yz{|}{}}{|~{y~}{|~{|{~xx|~yz~zu{~y{yzzyy||}{{yz~|~{|{}~|}~}}|~wz}~|~{|}~~~|}{|x|zywz~}}}zy}~}}~}x{|~{}{}~yzxxw{||}|~~|z}}~}|w|z}~||}|zzzy|{|{zyv{}~z~||~~~}}~z~}{~~~yx{{y}|}|~{xz{~|yz|~~~{{{y|{v{~}~z|~~~{zz}}}z||z{~~}~}~}}{~}zvyxxxz}||}}z}~|}~}zy{z~|~|y{~}|}||z}~}{~~}~~z{}~|}z}{~{|{{~y|}}~|{{yyywy{~|}|z~~~|}}{z~|{}~}~}~{y}~~}||~yxxz~~}}~|||~~~~~z{z{z|}}~}{z|y~zy{{z~}~z||}|||}{zv{|y{|{}~|{zvx{yw|~{{~}|{~~|}||~}}~|~{y{}}~}}~}w|z{~z~}yy|}}|}wv~~{|~|{~||~~~~{{yy}{|}}|}~~~{}~{z|}y}}yzxx{~~~||}}~}|{{|zzz|{||zz|}~~~z}~~|z~|}|{|~|||}{zz{~}}~~}~}{{wxzxy|}~{}}{||}{z}}~~~}~~{z{z}~~{xzx||}y~}}}yy{~}|}}{|zx}||}~}~}~~~{y{xz|~|zwz}|~~~}}|{~~z||yyy{|{}~}~{yz}|~~}~}~|}~~|||}{||z||zx}~|{z}|~~~}{xy~~~yz{z|~~~}{{}~}~|~}~~~|{|{}|xx}z|~}{~~|w{|z~}~~~xx|~~{z{|}}||{}~{~~x{{xx}|{~~~|||}|{{{{|}}~}~}|{{{|}|{~}~~|z}}|~{|zz{{{~|{{{}~}~~}|}{z{}~~}}|z|}|{~}~~~|~}~}zyxz~~|}zxz|}}zyz|~~{|}~~|{x~|{{}~~~~{{~~}|yz~}}}{z|{{}}~~~|zz|~|~}~|{~}}|z{z|~}}|~~|z~~}|}~|}||zz}{y{~~}~yx}~~~|zxy{~|{}|~|~}~~~{{z{~{{}}zy}|yz|~~~~{{{{~~}~~~{{{}}|}~}}~~}|~|z}~|}~~}{}|x|}|y{{z}}}}}~|z{~}}~~~~~~}~~}~~~}|~|~|{~~~}}}~~{z|}~}|zww{}~}~~}~~~|{{{~}}}~}~{{~{z}~|}~~~~|~~}}{{z}}{}|zz{{|}|}}}~}~}}zy|}~}~}}|z|}}~~~}}z~}~~}z{xx||}}||}{{|~~~~}~~}|}|}|}}}|~~~|{|z|~}~~}~~|zyyxy|}}{y|}yz}}~~y{~}}}|~~}|{y|~~{~~{zz}|zxx|}zz|{yy|~~~~{}|z|~|z{z{}}~~~|}|~~}~{z||wwz|}~|||zz{}}}~}}}}}~}zzz{}}}}}}~~~~~~}|zyzxxz{}}{z{z|~}}|z{~~}}}~}||{~~{{}zz~}{~~|~}{zz{{z{yyyyz}~~~~~~}}~~~}}|}{yy||~~}}}~|~}{|}z{|}~}zzyyzz{~||~~||}~~{zzz{}}~~}~~~}~}}|}~~}~}{{zyyxvxz}|yz}{z}~}~}~z{~~~~||~}|{y{}~|~}||}~{xy}|xz|{yxx|}}~~~~~~}}}}~||{z}~~}}~{|{|}}~{z{|zyyyyyz{~~~~}~~~~}~{{}~~~}~~|z~}~}|ywwwyy}yxy{}~}~}}~}{}}|~wxvy}}}}zzzuy{{|~~~~|{}|xzywxvy{~~|~~}~|zwxx{~~}x{|ywx}|~|~}||~}~}y{|~}|yy||z{zyw{z{~~}}{{|zz|~z}|yvw||{y|y{}~}{~~~{}yvzzy{|uvxzx|{|}zy~~}~}~|z{||{~yz{zy||~||~}}{~~|xwywy{~~}yz|}~{|~{z}|z~}}|~{z~{}}~}xxx|y{{|z|{{}|}~~}|~~|z||}~y~|wy}||z|}~}}~~||~}||{twxz{|}}~z||}}|zy|}}{|~y|{yz}}||y|}y||~~~{}}~||{~}|{{z|w{|}y{|z}~z}}{y}}~~{~~}~z{y{z||}~|~{}~~|~|~yz|vv{}z~{}||}}|||z}~~~zz~z||~~{z~|}vx}~|{|{~~~~~||y|}~~yx{y}yzz||}}~}|~|wz~}|}|}}~~~~|z|{|~|~~{~{z}|||}{zxxxzxz|~|z{~~||}||{x{{}|}~}|{|~|}}~~|{|z|~~|}~}||y~zzxv{|~|~|{y|}{|z|}}}~~{|{~~~~~~||{w|}~~~~{|~~~~}~|~|yxzzzz~|}|||}~~~zy|{}~|yxwwx{{~~~}{|}|~xy{|}{z~}{}||}}~{}z~~}}||zz}}~{|z{|~{~|z{zxy||~~~{~~~}xywv{{z{~~|w|}|}~~~|~z|z{z}{}}}~~}y|{~~~~z}|z~zyvuwz|~||~}}~y{|||~|}{}}}zz}{z||{}}}~~y~}z~{}~|~{xuvuzz~~}~~~~y||z|z}~~y~{{z~{y|z}|}}~|~}{~~}~~}}~|zzxxwxz}}~~|}{{{|~~|~~}z~}{zx~y}}z|z~~~{{}y{}~~z~}|zwwuxz}}}}}{~||{}|}z{{{xzz}{}~{}}~~}}~{{}z|~}}}~{~~{yxtwxy|}~}~~{}||}}|~~z~|{zx~{~}z|z~~~~z||{|}|}}~~}~}||wwvx{~~~|}|}~~~z~|z{{zz}{|{{{~}~~|z}zy{~|}~~||{vwxy{}~~~}}~|}}{}{|{|}z{y|~z~x{}|{{{{{|}z~~~~|{xvyxz}}~}~~~}|~~{z~|z~}zyy~{~{z{{|}y}yzy|{{~~~}}}|vwyyz~}~~~~|y}}z|~{zy}~|~{z~~~{~z{{xy{|y}~~}~|xuyxy|~}~~~}z||||}}yxz|}}}{z~~~}}{y|zyy|z}~~~~||uyx{}}~~~}}zy|}}|}~~yxz}~||z~}~~||y}{yx}y{~~}vx{{}~~~~~|}{x}|~|}~{yy~~{|y}~}}|}x}zzy}z{~~}}wxzz|~~~~~~}~{x~|~|||yx}~{}y~~~~~||w|zzw|{z~}~~}xyzz}~~}~{}yz~|~}}}~y~|{{|}|{}~}|}}~||~x{zuz~~|{~~zxx}zx}}~||}|z{y|~||{{y{|z|}~}xy~~{}|w|vzzz|}}|{z~~}|~~}~}~{x|}}~~|}zz{|y}}}~~~z}||~}}~|z||{}wx{|z~~zyz|}|x~|~|yx||{{z~||w{}||}{}}~}|}}~}~~uuzy{}~{}~{~~{|z}~~|}{}}{zz|}|{x}{uz~|~z|}|}{~~~~yx{uuytw|~}z~~~{}|~}{~~||yzy{x|~~}{|z{|z}|~~||~zyy}wyywz}|y}}~}|}}}}~}~|~|}}{~~}w|}~}~y}z}~|{~~~~~{{|tw||}}~|}}{{zx~~~{{|{~{{~}}}zw|{z{{~}}y{}y|~}z~}~zxyytxutw}~|}~||}{{~}~~}w}}||{{z|zz|~}z}|}zx|}}z~yw}xxvy~~~~~~}~}}}|}x~z~|x}~|||y}~y{~}y~~~{~~}}y~~~zwvtvwyw|~~~}y~z}z|{z{w{zz{}}~~z}{|}~~z}|~~{~~~}yzsu~z~|{~}|~~|{zz~~~~~}|}}z}}||}|z{||yz}}}~|}zx{zxxtx|}|}}}}~{~~~}|xw|~{{}}~|z}}}{|~}}}{|}~wy}vvvsswxx|}}z}~~~~|}z|~~~{{~|x~~}}{~}zy||{|~}yz}yzxwwy~{~|}}|{{{}~~~}~|z|}~y|~~{}~{{}zx~~}}yytzz{yzwyx|{{ywzz}{{{{}{}~{xzw{}}{y{{}~zz|~{~{{{zzyvyz~{{x}z{~~|{|{}z||xvx{~~{||{}|}~}~}~~~~}}}~{|xzz~z{~}}|}|y}}||~}|{z{~|}|}}~|xw~}y|}xwttvz}zyuw{xyyxvxxzy}~y}}}~z~|~{y{}}z{|{~~~~~|{{|}{z}|{}}~}|~}||}|y{~~}|{zz}~zxvz||{{yxyy{z{{{{|zwz~|{x~~|||}|}~~zz|}|z~|~~~}~{{~}}~}}z{||x|}~}{xxyyy~|xxvxyywxxvwy{z|y{}}~~{~~}{}{|}z{~}|z~}~~~~}}{|{{z||y}|~~||{|w}~~}~{|||zw{{z|}zzzzzx{xz}||z{~||x|{|~z|~~}~~|yz||{~}|~~~~}~~~|~||}{}~{z{|}z|}~~{|xxx||zyx{zy{zzzy|{z{z}}~{~~z|}|}~}}zzz~}}}}}}}~~}}{~|{y{|z|||~~~|}|{~~|{{}}{{x|||~|zyy{{z{y{}~}{|}{}}z{~|||}{|}~}~zvy~}|}~~}~}|}}~}~}|~~~~|}yz~}{~~}~{yyz|||zwzz{|{yz{|}{|{}~~|}~{~}|}}}||{y|~~~~||}~~~}~|}{{{}}}|{}}}~~z|||~}|}|}~|z}}|}|z{yzzz|z}~zz~|}~|{~~||{~~zz|~~}}xx{~~|}}~}~~}}}|~|~~~}~{z}{y}~~~~}|z{|}~~}z{}}}}{{z{||}{~|z}~}|~}|~}{}}zx{~~|}|}|{{~}|{z||}{}~~~~}}{~}{}~}~}{{~~|}|||}}{~{x{~|~|{~}{{{}z|{~|{xvy~~||}~~~~}}~}|}}}{|~~}{yz~}yz~~~}||}~~{z}~~}|{{{|}}|{~~zz~}~|||}}}}}|xy~}~~~~~~}||~|{{||{z~~|~|{~|z}||~}}||{|}}{}~|x|~{}|{|~|zz{}|||}~||yvz~}|~~~~|}~~}}}~~~}|yy{|zx}~}}}~}{|}~~}}||{|}}|~~{z~}}}~{|}~~~~~~{xz~~}~~~}|~~|{{{|||~~|~~}{{}~|{~|}~}}}}}}|~}{y}|~}|}~}zz|||{}~~~~~}|{ywy}~}~~~~~}}}}}}~~}}}~~}|zy{}|z{~~~~}|~~}}|||}}}}}{|~}}~}{|~}||~~}|zy}~~~}||~~}|||||}~~|~~}~~~~}|}}|}~~~~}}}}}~}zz~|~}||}}{yz}}|z{|}~}~}|zzxx{~}}~}~~~~~~}||}~||{z{}}|{~~~|~~~}}|}}}~~{{~~}}~~}{|}||}~~~~||yy}~~~}|~}|||||~~|~~~}}}}~}}|{}}}}~~~}}}~~~|z|~}}||~~|{z{~|{z{||}}}}{zzxz~~~~~~~~~~~~~}|{|}~~~~~}|{zz|}|z}~~~}}}}~~~~{{~~}~}{|~}||}}~~~~}|{yy}~~~||~~}|||}~~|~~~~|||}~}}||~}|}~~~~~~{{}~}||~}|{{}~|zz||}|}|{zyxy|}}~~~~~~~~}~~}|{{|}~~~~~}||{z{}}{{~~~~~~}{~~~}}~~}|~~}||}~~}~}|{zz{}~}~}}~}|}}~~~||~~~~}|{|}~~}|{|~~|{}~{{}~}||~~|{z{}~|{{{|||||{zyyy|~}~}~~}~~~~}|{{{|}~~~~}|{zz{||{z~~~~~~|}~~|}~}|}~}||}}}}}}|{zz{~~~~~}}~~}}~~~||~~~~~~}|{{{}}~~~~}||{|~~}{~~||~~}||}~}|{|}~|{{{{||||{zyyz}~}~}~~}~~~}}~~}|zzz{|}~}}}||{z{|}|{|}|}}~~}||}~}|||}}}||{{zz|~~~~~}}~~~~~}~|}~~~~~}}~~|{zz{|}~~~~}||{|}~}}}|~~}||}~}|{{|~~|{{{{{{{{zzyz{~~~~~~}}~~~~}}~~~|{zyz{{|}}}||{{{|~~|{~}~}}~~}||}~}||||||||{{{{}~~}}~~~|||}~~||~}|}~~~~~~~}}||||}~~|ywy}|{|}~~~~}}}}|}{~{{~~}~}|||}~}}}~~~~}|{{|~}~~~~~~~}~}|~~zvvz}zyxxxxxyz|}{z}~{{~~||}~~}|{{|~~}}}}~~~~~}}~~}{yyz|~~}}}}}~}}}{}~}~~~~}}}}}|{yxxy{~~}|{{|~~}|}~|zy||zzz{{{zzyxxxy{}~~~|{zzzz{{{{zzz{|~~~}}~~~}|zxvvwz}~|zyyz{ywx{~~||~~|{{~}~~}||}~~~~~~}}}~~}|||}~~|{|~}{z}}}}~~~~}}|||}}|zyxxy{}~}||}~~}|~~|zy{}||||{{zyxxxy{}~~~|{zzzzz{{{zzz{}~}~|}~~}}|{ywvvx{}~}{{||{yx{~~}|}}{{}~~~~~}}}~~}~~~~}}}}~}{{|~|zz}~}}}~~~~~~}||||||{zyxxy{}~}|}~}|~}{zz|~}}}||{zyyxxy{}~~~}{zzzz{{{{{zz{}~}~||~~}||{{zyxwwy{}~|||}}{yz~~}}~~~|{}~~~~~~}}}}~||}~~~~~}}~~~}{{}~|z{~~}}}}~~~}}||{{{||{zyyy{}~~}}~}}~}}|{z|~}}}||{zzyyyz|~~}{{zzz{{{{{{{|}~}{|}~~}|{{zzzyyxxy{}}}}~~|{|~||}}~~~|{|~}|~}|}~~~}}|||}~~}{{|}~~~|{}~~}}~~}z{~~}}}~~~}}}}}|{zyyz|}~~~}}~~~~~}||}|yy{{wvvwy{|}|{zzyyzzzzzzz{}~}||~~}}~~~~}}}}}}||||~~|{{{|}|z{|||||||}~~~}}~~}||}|{{|}~~|{|}~}{ywwyzxvwy||{zyzz{{{{{zzzz{{{{zyyyz{}~~~}|{{|}~}}~|zzz{|}~}{yxwwwwwwwwwxy|~~}{{}~}zz{}~}}}~~~}|}}~}|{||{{}~}}}}~~~}||||}~~~~~~~}|{|~||{||}~~~~}}}~}zyz{zwvx{|{zyyyzzzzzzzzz{{||{zyyyz{|}~~~}|||}~}|||{zzz{|~}{zyxxxwwwwxxz|~~}{{}~|zz{}~}}}~~~}}|}~~}||||{{|~~~~~~}|||}}~~~~~~~|{|~}|{{||}~~~~~~~~~}|}~}{{||zxwy|||zyyzzzzzzzzz{{|||{zzyzz{|}}}}||||}~}|}~|{zz{|}~}{zyyxxxxxxyz|~~}{{}~}{z{}~~}||}~~}~~~~}}}}~~}||||}}|}~}}||}}~~~}||}}|{{{|}~~~~~~~~~~~|{{}~}||}|zxx{}}|{zzzzzzzzzzz{{||||{zzz{||}}}||{|}~~}~~|zz{|}~}{zzyyyyyyyz|}~}{|}~}{z{}}|{|}}}~~}}}~~~~~~~}|||||~~~}}|{zyxxxyz{|}}}}~~~}}|zzz}~|}~~}|z{{|~~~~~}|{{{|~~~|yy{}}|{zzz{{{|||}}~~~}}}}~~|{}}~}}~}{yxx{~~}|{zzzzyzz|}}}~~}|~~|yxy|~}||}~~|z|~~~~~~~~~~~~~~~~}|{{{|}~~~}|||}~}zxvwx{~}|{zzzzzzz{|}}}|{|~}{yxyz|~|{}~}~~~~|{zyz{||~~~~~~~}||||}~~~}||~~}{yxxyz|~~}}||||||}~~~~~|zxxxz|~}}~~|zz{~~}||||}}}}}}~~}}}}}}}}}|{{{|||||~}}}~|ywwwxz|~|{{zzzzzz{|~}|}}{{|~~|{yyy{|~|}~~~~~~}|{{{{{zz|~~}||{{|}}~~~~~~}|{|~~}~}{yxxxy{}~~}}}|}}~~~~|zyxyz|~~~}{z{}~}||||||||}}~~~~}||||}}}||{{{|||{{}~~~~}zxwwwyz}~|{{zzzzz{|}}||~~|{{}~~|{zyyz{}~}~~~~}|{{zzyyxwwwxyyyz|~|zz}}}~}||~|zyz{zyxvvvwxz|~~||}~~|zyyz{}~{yz~~}}|}}}~~~~~~~}||{{{{{{{zzz{|||{}}|||||}~~~~|zxwwwy{}~||{{{{{|}}}~~}|}~}{{{|~~|zz|~~}}|}}}~~~~~}}|{zyyyyzzzyz|}zyxxyz{|}~~~}|}~~~~~|zyxxyz{|~}}~~}}~~|zxwwwy{}}}{wx|~~~~~~~~~~~~~~}}}}}||{{{{|}}||}~}}~}}}~}|zyyz{}~|||ywwwxz|}~}|{|}~}{zz|}~}|zyxxyz|~~~~~}}}}}~~}}{yxxxxyzz{{||||||{zyz{}~|{{|||{yyyyz{}~}|||}|{|~~|zyyyyyyyz{{|||||{zzzzzyyyyyyz{|}|||~}}}~~~~}}}~~|zyy{|{yxxy{|}~~~~}}||{yxxxxy{}~~~~~~}|{{{{{{{{{{{{{zyxy{}~}{zz{||zyyxyyz|}~}||}~}|}~|{{zzzzzz{{||||{{zzzyyyyyyzz{|||{z|~}}}}~~}~}{z{||zyxxz{|}}}~}}}|{zyxxxyz|}~~~}}||||||||{{zyxxy{}~|zzz|||{zyyyyz{|}~~~}|}~}|}~}|{{{{{{{|||||{{zzzzzzzzzz{{|||{z{~~~}}}}~~~~~~}{{|}|zyxyz|}}}}}}}||{zyxxyz{}~~~~~~}}}}}||||{zyxxz|~~|zz{|||{zyyyzz{|}~~~}}|}}~}|~~}|||{{||||}}||{{zzzzzzzzz{|}}}|{{}~~~~}}}~~~|||}}|zyyz{|}}}~}}}|{zyyxyy{|~~~~~~~~~~~~~~~~~}}}}}}||{zyyy{}~}|zz{|}|{{zzz{{|}~~~~}||}~~}|}~}}||||||}}}}||{{zzzzzzzz{|}}~}|{|~~~~~~~}}}}~~~~~||}~}{zyz{|}}~~~}}||{zyyyz{|~~~~~~~~~~}~~}}}~~~~~~~}}}|{zyyy{}~~|zz{|}}|{{{{{||}}~~~~}}||}~~}||~~~}}}}}}}}}}}|{{{zzzz{{{|}~~}|{{}~~~~~~~~~~}}}}}}~~~}~~|{zz{|}}~~~~}}|{zzyyz{|}~~~~~~~~~~}|}}}}}~~~~~}|{zzyz|~~|z{|}}}|{{{{{{||}~~~~}|||}~~||}~~~~~~~~~~}||{{{{{{{{|}}~~|{z{~~}~~~~}~~~~}}|||}}}~~~}{{{|}~~~~~~}}|{zzyzz{|}~~}~~~~~~}||~~}|}}~~~}|{zz|}}|{{|}}}|{{{{{{||}~~~~~}|||}~~~}|||~~~}|||{{{{|||}~~~}{z{}~}}~~~~}~~~~~}}|||||}}~~~~~}|||}~~~~~~}||{zzzz{|}~~}}~~~~~~~~}||~}|||}}~~}|{{{|~~|{|}~~}||{{{{{||}~~~~~}|||||}~~}||||~~~}}|||||||}}~~~}|{{}~}}}~~~~}}~}}~~~}|||||||}}~~}||}~~~~}|{{zzz{|}~~~}}}~~~~~~~}|{|~}|{{|}}~~}|{{|}}|{|}~~~}|||{|||}}~~~~~~}}|{{||}~~~~}||||}~~}}}||||}}~~~}|{|~}}|}~~~}}~~}}~~}|||{{{||}}~~||}~~~}}|{{zz{|}}~~}}}~~~~~~~~~}{{{}}|{{{|}~~}||{|~~|||~~~~}}||||||}}~~~~~~}|{{{{|}}~~~~~~}}|{{|~~~}}}}}}}~~~|{{}~}||}~~~}}}~~}}~~}}||{{{{||}}~}}}~~~}||{{{{||}~~~}}}~~~~~~~~~}{z{}}{{{{|}~~}||}~||}~~~}||||||}}~~~~~~}}|{{{||}}~~~~~~}}|{{{|~~~~~~~~~~}|{|~}|||}~~~}}}~}}}~~}|||{{{{||}~~~~~~~~~}||{{{||}~~~~}}}}~~~~~~~~}|zz|~~|{zz{||}~~}}}~}}~~~}}|||||}}~~~~~~}||{{{{|}}}~~~~}}|{{{{|~~~~~~~~}|{|}}|||}}~~~~}}~~}}~~}}||{{{{||}}~~~~~~~~~}||{{||}}~~~~}}|}~~~~~~~~~~|{zz|~~}|zzz{||}~~~}~~}}~~}}}|||}}~~~~~~~~}|{{{{{|}~~~}}~}}||~~}~~}}~~}}}~~~~~~~~~~~~~~~~~}|{|}~~|{|~~{{}wxz{|}~~~}|zz|~~~~}}}}~~}}~~{z}{yxyzzyyxyyz{||}~~~~~}}~~}}}}~|ywvx{}{yyxwwwwwxz{|}|||}~~}}~}|||}}~~}|{zzz{}}|{zzzzzzzz{{{||}~~}|{zz{|~~~}}}}~~}|zzzz|}~}{zxxxxxyz{||}~~}|||}}~~~|{yxwwxz|~}|zyyxxyz{||{{|}~~}}}}~~~}}}}~~~|{zzzzz|}~}}||{{{{{{{{||}~~}|{{z{|}~~~}}~~~}|{zzz{|}~}|zyyyyzz{{||}~~~~}}}}}}~~~|{yxwwxy{}}|{zzzz{{{{{{{}~~~}}}}~~~~~~~~~}|{{zzzz{|}~}}|||{{{{||}~~~}}|{{{|}~~~~~~}|{zzzzz{|}}|{{{{{{{{||}}~~~~}}}}}}}~~~|{zyxxxyz|~~}||{{||||{{|}~~~~~}}}}~~~~~~|{{zzzzz{|~~}}}|||||}}~~~}||{{||}~}|{zzzzz{|}~~}}||||||||}}}~~~~}}}}}}}~~}|{zyxxxxz{}~}}||}}}||||}~~~~}}}~~~~}{zzzzzz{|}~~~}}}}}}}~~~~}|||||}~~~}|{zzzzz{||}~}}}||}}}}}~~~~~}}}}}}~~~}}|{zyyxxyz|}~}}}}}}}}}}}~~~~}}}}~~~}|{zyyyzz{|~~~~~~~~~~~~~}}||||}~~~}|{{zzzzz{|}~~~~}}}}}~~~~~~~}}}}}~~~~}}|{zyyyyyz{|~~~~~~~~~}}~~~~~}}}}~~~~}|{zzyyzz{|}~~~~~~~~}}||||}~~~}|{{zzzzz{{|}~~~~~~~~~~~}}}}}~~~~~}}|{zzyyyyyz{}~~~~~~~~~}}}}~~~~~}|{zzzzzzz{|}~~~}}}|||}}~~}}||{{zzzzz{{|}~~~}}}}}~~~~~~}}|{{zyyyyyz{|}~~~~}}}}~~~~~}|{{zzzzzz{{|}~~~}}}}}}}~~~~}}||{{zzzzzz{|}~~~}}}}}~~~~~}}||{{zzyyyyz{|}~~~~~}}}}~~~~~~~}}|{zzzzzz{{|}~~~~}}}}}}}~~~}}||{{zzzzzz{||}~~~}}}}}~~~~~}}}||{{zzzyyyzz{|}~~~~~}}}~~~~~~}}}||{{zzzzzz{||}~~~~}}}}}}}~~~~~}}||{{{zzzzz{{|}~~~}}}}}~~~~}}}||{{{zzzzzzz{||}~~~~}}}}~~~~~~}}}}|||{{zzzzz{{|}~~~~~}}}}}}~~~~}}}||{{{zzzzz{{||}~~~~}}}}~~~~~}}}|||{{zzzzzzz{{|}~~~~~}}}~~~~~~~}}}}|||{{zzzzzz{{|}~~~~~}}}}}}~~~~~}}}||{{{{zzzzz{{|}}~~~~}}}}~~~~~~~}}}|||{{{zzzzzzz{||}~~~~~~}}}~~~~~~~}|~utzuqsruux|qnr~vyhhgeinp|qxu{|{qwzqj|rky}|zp{su~}kt}orumq|rlpwlmmnpj{tn~~of\qeXkukmv}yr}n|~|x}~~|xrhqukoyvknj|tyz}qvuw}uxxuwxvmps}}vwx{}}sulo~~}y}rmnMXftxzpiXndg][dejpoixvkqz|{xopnzqktvq|rz}ztisss{oqpuyzw~~|yohsuuu~vqt|vw}qt}{yzz}|w}{xv~bb[^gjy|qqio^jn[amjfxosoux}vl}tmj}mimejksvw~sxznznxusluuxrt|}uuxoplt}xwr|}w~m{|y|x{{{t|rqdggVlqvwolmf_drchlknxqt{m||oxtpumjfiZfns~q|trrsvsz}wttoy{oxqpzqvtzp~{v{}v{~xz{slk]\Uuustq|lmqpgkfiotryygwzlmwmjjctn_cvkkyq{ypu~glqnz{x{zzunzpesyjizs||yz|uxp|~}q~{wrZg__enp|yrxsbk^ouf^sog|{uj~}jv}tqtacghi}|}xyrwoovzwo}|w}x{pntnpqsqz|~urw|x}~snyz{uyrw{~t|setfRabzz}k{vrpukjvnj{zvpouqivm^akq^ZZtmty}xyurrrwu|xw|z~qjkyznqwwmw}~~yyw{rputtz~xzwj`ca\ivu}}tvpltzicmulq}mhw{rtwowpmjdjty}|wzzvtc|yjn}tz~}nsqjqsafoqy|xz{wwnq{w|}y{~ytx}}zylpb_mZ^Vqxw{ws}sillvowpu|yutqn{vnf^prXTkljt}uv{nx}~y{~qxv{mrfzfdwvg}om~ws}}wztvuvxm|~xx{rx{ozmagnckou|}pynxi_vrntvzit}dhm`jlqk}~w|}suo||ld{s}xvw}{v|ohnhknyqv|zvzyv~~}}v|{yy{~wtgvcZeXbgb}vts|yqnymv|onvkq|rkxqkjdogbgrxry{plzxy|x~{wtxfnygdhkad{w|}xx{~ux~{w|~vu|q}v{pul||`cmljaaljut~vnhrogv{x~jp~snwdpifel|yzx{{}{sjwswurvswytuxlnurnnfuxym|~ztw||~r|pulx|z~zz~yxvwwu^bkanobpp}~|~wy~r|swzqjntnsg`[`rscfy~lzvv~vtxxqyqjpksZamsdz~{}{vysy||lp{wuyzxmyzixxh]diafiwou}{tsnrhypo{wkzwqzgfxtwx|}}{tv|tzm|}vwvz~|pujhupecicyu~}xvxwt}~z{x|}t}~x|~}ssttuwdfej_ce[wwyzy~w~}x{{t~}pu|twjkqo`[^t{oo{ztt}~u|~}zxsyqvknlk^h}pdfqt{~~{~z~xtt|}iw{v|}pry}~xrohokr|kqufXftsihssqyqr{vvsj}spcsviwoz|}yx~upm{|lrt~xxss~ylmldlldpxu~v}z~{y{y}xo~}|u}xy~|x{mmpjicbWfi`npr~y~xzrut}zuuypjollgoxzm}zyzv}zyzvzuuzepplj`epbgoxqw|~~~wzt~{|xsy~l{u{{xfmzyoqpf\po_Zevprjwyyu||}v|mr|{jhrnxxnov~zupr}r}ztykqwrl}quncarquzy|}|zrv~vssxtun}x|~}yvzrvrswzllfiqocZh[rvoqvxp|u~zklmnrthcm|rqy~v|{yw}{|w~ykttr|jk^cuk_ew{tz}|u}ysvyo~ru~zy}z~z{ttoz|rlnvdZdha_gjenq}}{z}svw|xxvs|nxuzww}y}|{yyz~qz}rm{vwtnrfjrfgmkv~wzv~y}o{urpwy|z~zt~~svzs~ylfkhlihfjkej^h~}|v}uzwrldlyvlamv~vs|vsr~zxtzrnsbuxqdXeytns||wy{y~{okzszvvtyqz}~ysrovwheyrfjjgbj_^\pvkor}{}yy|wkv~yxkr}{xy~z{{~yovv|uysmswlpdwmfhgmwwrv|xzw~|~v|w|tkz{}{}y}ztvvppuhki`[ihnid_mpnw|u|rnvqosxslx~}|yw|yuwvz{xtnksjemgl_cxtt~|~xw~}}st|qrnsz|z}}vsyfntsqdfookhkdWene_iy}z}~|vunhr|zzmx|}|txmxysrysoeq{qn`joouol{||q|vo}~|rms|l{|~z}}{wlqwtsg|uslc_igbeelkshno}|zy~u~stmlxztm~zx|uxxwztrts}yldo]nrfc_r~wyzvzy{zor}yq}}|svz}{x|xlmpmwjqd`rodcnkeYcfih{{|xmwvquwxyp~{}{~w~}|wjjupklqhpehwhrxyx~zu{{w{|y}uzy|tytnrn~|wwuzrkttuujslopbec_cphiknqxuzww|v|yywujtwy}ut|~trzutytsupke\loof_x}}~|yrs~oo}u}ryv{t}~}x}v~qoraqxqi[dqqffkc[dg`bs|rw}jr~usp~{rx}y|xvllphdwmfefysprt{~}{pthffr~yst{njhkkreswstwqifnlovwsouvssqpcmnc`vtlqo{{}}}yhpoj|{~|w}vz{{|xw|}{|sjSnmkpsr~zow}|}vssvms|z~|{^cpjlfpqohxquz|yxyymvsrfa}{|nf_foievzy}}v~uyvqvyqp}}yvidyaX`_^[Vqhlxrow|~|~pwu}|s|ux{mdnjesx~zw|}~xwkxzuvz~ng\mrwxrrnsp~{yqy|tnose~yvkigy|wx~yvihrt}z{qwzzuvv{vrhkehnvzoiorgkudoihmkqyumnjuu}~}xhsprvnkshnsrnmtrfaidfu}~ytklttvuolqoueowwquzpj[af_c}wsxq{sqwyxz|}xswmutvryzsqxyz}}|vv}osn`WYXchrzsifrgenqeqpr~z{x|}{x}}w}~vu~mjimrv}zv}}|phkr||{ulpxeqzkppohcYdqlqyw||~tqspyqt~~xw{xnfdsqzyqhuysrk||{{{y~uuu|qjaprmsvnopyzxvx}puqn}zzysytnyx~uuusigondfay}~zzwustj`aiy}zpo_aj^]ngdd_oibaekmsx{u{}wpsu~~zkqt}vz|~~ztpifYdxxwzswy~|z~smtpnookysx}zwjwzsuuzmnryrnohkmox}x~uyyvw|w~~||}xwxkuv}}zqrxvzwz|y|vjidrnr~{~w{y~zwqnclv{~yszsn{uztjffYWaps}|q|ss}prskixrrlemyvvyuopndclmmlh}suzrmolfpfjx||~z{ttmtzwyu|qsotrjqoh`_bun|wy~urw|ty|{p|~upmqzwxtxw{zz{zzyyzxvjf`hgZ^^ir~|~~xzx~nv|vw|}}z{x~uwpsnp~{zo{tsqzx~|vxy}tn`zn^c`u~y{kosrhgdqwssjhvcfsjnmmnqnz|xua]^c{}{|~~jepyjqiw~upadnuxzvsjlzruwwtzx{~s_i{oejmkjvxuxxy~~ywg__e{wy}}y{srx~oswosz{xt^\apynujmy|{{rxsqsu{v{|nzvy~zw~vj^giwx{}~}vojv||}qc\`rz~zmhvzptpt{|yzqyonijv}y~~|~{jyved`l~~|ty~z~ymfjbX_`u|{|uxsnkkjvs{wn{}xv}|u}yx{sonc\]ft~z}|~~wricUWgt{}}{xwqj{smtzminovnysuyww{{t}qrkf_a|{{v|ytwz~yqzhig_bmz~~xvzxmyzywsuoh}qlqx}}{~vwtowsemhZis~z}xuuf`^WTgxzqrnilrorrtzsyuqtxx}pz{{}~~}qf_a[\j}|~}~}{y}|zxudc[^ij~y|{{rtqfnrggqntp|}xu||xrrq}vq{leonjqu{vzyxzvtsnqrW_kfkwrqs~trvsvy}skuljsyx{}|~zpzrqqp`Xbldo~}|}z{qqjaTW[`h~{wwusqmkgr}qmpux}tr~zs}yv~~zvrxiajbcgpz}{y}~|zx|xxnsxici`hoz|yxtkwsnxnfjil~~{rrtposstshxrfjhhqws{|x}}zxytjegj`\edm{w{x}rp~zwt{yngswox}x}z~twrhijg]`dibr~y~||qfwo[\`]^g~|tqolnpmxzgs{xuy}w~yom{}sxvwyxx|fag]`epyv}xz}{z}quxvvh]yylctmhkmv{z}{vxqtif{{}tyy{zxyyw_rruw}tzsjnynlrx~qy|{~x|yu|~kc~iny||z~z{|z|~woV_wvxz}}v{}{}zquv|ts|}xSVmutjm|{sp|zum|wz|{usznowv|zwzz{zu^Y|~zx~yw|{{|po}yqbbu|upojbqpcqvwuuvymo|thfrx{{{z}uvsrsrmrk_guy|wv}w~}yofaXRkz{sikh_aghkpfoururfmuu~{}|{stgedV\q~~}~|{~{|unabeYksytpjkmceecdhmm`hwy{rrs|sytpqvoeh{{y{~}qu~|yzhcnladztgo|mgonpsutpfmn^]it{~|}p~tusogacrd^s~wv~z|p}~shaY\_Xhqxyqjhgdcirhikmtnn}}~}|z|~{yxnengebap}|{|z|~}zxulgdacg|x|zpohgtkfhe`aefnsrw|squuzujsrkimjkt}xv{yu|tlfigXbigy{sms{ndrusonmk_dvgfw}{{~vvznjgc`^_niez~xy~}opraZY_aaqvrzpgdeghiodalqtmq{|tqvyyz{ytoabdddh{{~}yuvww{tmd_`ecs{vwtqjnha`\\fkkuxzz{~vpnlouhffbkwu}~}x{z~zurlhe`b[Wnuz}ontwsippoqqnjdmpepz|~~~}ymszlhfaZYcsryzy|}~|~vihaTTZeiw|lmkkiebfodamrqw||{{wr~ru|zupmj_Xlpip~~zywxxw{~v~}oplgedfokp~|tsqflrebabged{|xyyvmknmmpbaijpqq}z~zz}w}sqme^Whztg`fjuwjoplighjir|yxgf~ukhw~xxuz}tqoljinpewfeky{wvuohvtmv|qfg||rrolf`mykryrq}z^Tqud\_dfhemznly}y}n`f|yos}{vsy}yls~nfefb_gc]]_d]Uj||}qkwqneZUi{w~vypqusxmikcb_\YUWhqrv|volcby|yvvyrquz||yri^XT[{|tsmqriffgqzxy{wolv{sptmpskly}smbUMOezvwwmjf^X_gnko|{vrqqoky{lrzysov~}|zwwzzwwiXR]vwiiz~{}|zxv{w|vuunhurffiaQSkxsspooonxwk\Zvtq{uifntwyzsp{rjf`WPRkz}zvts}xumd^c{{tjkkb^\^c`]q|xz{rkdah~~ynuwok_X\du|wpec_[ZY_loy|uz~wwri]]bj|~~}yy|smf]Zbrqioj`]]gpkrwsrvwqnvxrsxtzsosskjvvyzhb\TPUk~vtohcky~{zyqt~mpvtqw|w}uolhfgnqhjd[_wnivupnjijn|tx{tssjjvmcbcd_cyttw|xrkebgyrgelkh`_js}|{uzofb]XXc|{skr|{xzsqokhl}uuvlfb_dowyzznok_X]kxkoqca`UTeus{te`\Z[`lyty{|ztpgaoy|vipl\UPNQb}lhljfhu~stzwtt{|nh}solijtzv|wootwu|yq|i_\[`n~uqljhlxxzvroolcfwthbgowwrmjkozyzoaWXahtyswvtqoqv}zultwjdbcjs}~}zoikr}}~vpmkmv~umpnjj`\gu~xsrsyob_][]h}}uq|}wz}mgkjjo|onpe^ZWZev{{}olpjbet~{~{y{}{shon`^b^Yf~xogcbdjwx~}zuple`j|vxtryvouj^YVTXjtgbgjgkyxs|}zvx~|kp~xsqomr|vssw{y}mrwl_WRR[o~zvtrpz|xwtjhvund^ahswqnllnv|wka[_hrzvwussu}|uldnoc^\[_gr{sruxsuznjfbahvzvyrpqiagswq{shfc_^g{|tns~zwrlwxe`egfjy}~|pjebchv~sx|u~zhekh_^l~{~}rmvocbebY^x{pgb``cnpn}}w~z~ywslej{vosy|rpsf^[WSVd~rjmspqyvy||}pszusrokmy}w{yqmlpvuxvyysmc[X\l~|xsqpnqx|}ywtkhutpmc^cn~vspopt{zxle\V]iwtruuuw|ymqxnfc`_dq}xw{wpou~~tkxtmjgegq~usuphiw~qiy~lb^[X[fx~{vv~zqkxzf[^bchx~{pkfdeix{y}w~neglhgr}|{|ysiclg[XZ^__rulhilv{u}}wzvw}romifgv|{~umqy||wrtj^[YXZdzyofgpuzysz}yuuvrrunknonpz~{sompysnqfbd`Y[g||wttvz~}~zxtjjtnjlh`dv|{ojghlsvw~ulhd_dzzmmpsw{~yjjri`^^_fy|rsxxv|~wdiungefhoxyzpjkopnwzlrvjdbcix|xvuu~zvrjaksi]X^hu}rkgfio}yr{{mb]bls}~||z{~uibjh\XZalwzxulgjq}x{zsor~{pmmnry|z}zxolu~ulgkpbVTVYap}unlv{|xwsovyichmovz{}tnjjozxmpp`\dgekz}xtsv{zzxtqibkmccijgn~}rmmqwyyzrmushddcdoujkryz~rlrlb``agv~pimux{~x~~ywyvgdmjggjmvvompvwzwjmtqkdabjy{xwxzyupf`kmgaZ\fvzoiefiq~xx|pidfryvwwy}zmadj`XXZan}xxxqnpy{{ymky}rmlllr}|x}{vvtnmxuilzqa[[[_j}xqln{{~zwrlu~obdjlq}wpljmt{ulrq`X]caco{z{~}wnjtqgfjlgi{}|rkkms}}yzxwpqyrhfeb`i{omsyz{{qqrh`^]\aoxpqz~|}~{{vkklfeffgm|xrprxz{~}wotspnhb`guzwvvw{|~}wslabliec[X`pyronpvv{xnib`ixxtuwy|~ocikaZYY]gxzwyvpov{vy~njy~uponns}yxxuorvgeutd[YXZbr~yspu~zumqyhadhltxpkhimv{{qtyn`\bgio|~{{}|zqintkdeikjn}|rlknu|xxyrnkswlfdcbcl~~rms{{yw|xkdcbbguvmkr|xzzwuploi`adfhpzspqwzvpuogjjeaft{xxz}{{voebljdee^^l|rnmpuwv{qliccqrmotxzx{ufagbYWXZaqzuy|{||njvvpnnnr{}|yrpsvtu|rcanoe^\\bo{wuux~yvogkxvlcagqzqljlpz|ukmtla[\er}{zy||qfjqibaelu~~{vvsmkow~yu}{oeblumghknuzrqzvnmyzkbabem{vojmx}x~~zuplfeom]Zahnyvplnu~xryugfnrquz}wuvzxzvpi_\fe^`gjjstnot{~zyxqs|wnkkjjt{~tijr{{ttsigjc[[_clrhdcheaY]cUS]rztnnmkopzjj_Xdilhjs|mh|tlghkxxt~pirvtv{x~~zrhpyqwpz|yskuxllyz|li|}vw~ltlfsjdbm{x~sqfv{ussmbVq{jhy~jxx|vpu{vn{tlqlo^YZv~~qprjwtpix}wqvorz~ww|ic`|xvc[`dbolv~~vfmqojr~}ytgorkclmzilkx~wwpnjluk|osloorzt^XX[aadjgwy}ryxvyjk~uuxn{z{z}ukgTijatzzv|r}t{z{zmmat~or^Y[Rhe_j^Xkhquwtx|vjltz~wmtscbqwv{r}{zpxx|~~pwjn~txglqpm\v|ruf^flnlgja{~~~|}{nrop~vyiorvryuopmiq~}vgmiiX[}~thzsn_jtmmplqoek\jvkxzgsuqvny{tw~{touust{qprqsekirzvnp|thWffhvq|tk{prupsfdttughxs}utd_yy|qyx|~xkpg}zwsotxu}z}}rmzjjsfs{kp|jmsqv}do|udwxssxz}xugxugtsi|vsshpmk{|~z}wk~tu}qxtx~{ddgbgvu{k^Y_cgdkohytozrx}wv}kjvpxzx~tsb]uqvluvz~~wxqgbijljxvsnmsggvrr\Zobalrty{owujfkv|}yweoteotkt}q}uswt~}njjmwot|uwy~jlgjf]Z]gkoqzq}y~~syu~}uxlYrtfl}zxo}ssry{y|zrz}qp_`em^jyomaoqfutzmckjtsnxeyxoszsy}|sqfqfdex|putz|~}ryxszygZWRfgg{qiwmszjkilv}to|x{rplsokdfao|t|yvuirs{}~wymyxy|yz{zorgd]a}{~soy{spu|tibeaszr|s|uxsvvlqy~tWgms|n{yout|x||xoopns^Yy}vnhjvzbmw}spolnq}x}sx|~|j}{eemdR^eryrz|~|}tx|zng\\d`hw{mlgwtrvv[okooc~z~vnm|~nunlwyxxywcd{kt}swp{|z|o{ssthZojQgz~voxnp}n|ydijeiqrjprs}vuimwiidlvsv}y~ttlzqwrww|yzngdVjg^olpuq|uutkivml|{xxuuq`{njgutwiXwsxwy~lsz{|xvvvqvscbc`dlrz~rq}o`qssotu}x|{yuvuj}mn{ni\_ootz~~x}{w{v|tz~ogfa^notup{ziktsxtuiwz{z~wvzvpttwhpi^l]~vmuxs}wpr|txuetdmgbmltz}vy|nmzffguoy~|qqqnrvqs{wlmkemymt}}yz}~zwqwf{ignh\otrc|xw{wobsoomcvru{}|k~|qpz}}ockmkrup|xwotyt||wxuq~igTZq]Ze}wwuwslrupw}x~u~rsks}mykwy`jljqvpx|uzvjy{zyvxrr{{vxk\bf_mjiwty|xtphmvrs|}{vtkjd~sfh~{rwrkawyvqqs~y}{twtutrsla`ffmwt{{~y}xxwmq|uv}~z}}{ttwlp}oumls^[dum{|x}s|zpq|qpl`bd`cnwzyqus~kv|ymu|}ywsqxvowyqxtadk_hg|~}vuwzsidpxk{v]`miphv{wvnarxhfwus{z{ystrklttrulgppiv{wxzyw~{rzwhf`wxdZbbYo{}u~|rqnjvunssyt{lxzvlxwsri]alqv{wtuzn~xvyokrkip_SRYsqm}x|~uqspvy{yqr{~in|pnwno~upejtsxuwqmty}~mmiwnbjvnob\fpelymmw{tq~|~~z~y{hhkx~aodbnoekpsoo{o~qjonbjfmbTSYlrywxwsvw~vy}yv{{|y{iilinvusglhhmt}|~xuv|v}tx{pth|{rk_\_\k|qztv}m|u_ouzw~wxutkook~vuqhh]itiwwz~v}tyq|wvtkzrclnmjfuc]jktwx~xqdh}mwv|nwwyllnnvm`lcism{y|{|qxz{~z|inocb[`qqf^gqay~pzx}vw|zz{r~w~{sxsuwxwfik`folsvwtxl|zstxmggatn``V^cl}|y~{yzxzx}~u{rmpstppyynqbkutuv|~{s{|wzs|yikwszljojffXigcv{~zyopw~uv~zyw}wvgltlpmkdfovr{{{~zsm~sstwurrytll\[Ycrlkzvx~zu}w|qz~}}|}xvln{pksa`mdhcrz|~~}xrv{zyxqk|pkdgwtjkcd_[y}xxuvn~tr|xw}uy|xqd{m_kipurwm~~{yjtqspzxgqznpmue_a\X]uwxz~|w~|{wt}{psorkxzysyp`gipmzxz~{y|n{x|~~nljpgisf\\K^vfcg~utsvt~npgaykflzk]pyxoj}||pxy|x~x}qwm|xip}yuam{lje[gpq}kohp}vs}yu{ro{qxvqc_kkqm{|r~wq}zp|s~}yuelilfmric_k`dpztwz|||vszugoxzjrm]^ccuz|{vixyy~vowlddZd|g\QZd^f~wo|x~zyzxrhj{thwzalomvzr~yt{ppwqzxuy~njzroqgeuga]c_hs{wufi}uy~prrqgqq{qqj`hm}w~vo~~juutjvljemywokqo~liwivw{wuilgkyk~j\ol~d\gdi{|zsuy|x~susrcmuoaivtsqx|ys{uskx~uvyj{l}kyws}jsryzmonpyrwyr|qtuqlalfftzxvzu}krxmtvi{oj}rshs{hxx{pxt{q}vx}zdv|qnzwlvsww~x}~zomsmo{ir{gjfnf]ogdqliii`nywxjforzjlzgosht{z~wy|wzzmrrmwoo}vz~skjzszqyz|{wox|kqxyy~{o}x}|z}so^hdsv~xvnvucjfV[g^Nelqc^aisjaym}tyvq}kpw~wwsw|q}y}v}v}vmdoenv{~qyvipqj^u|xwzzxuuqtphVa]huwyuomoadd][[[Lcu{okjo}ixwjtoo}u{irudez|o|}qvp{sqvusflgr~~|z~ryuyvowyyi|xy~~~myzsy}takgh{yur|kqnsthhnpZa{{uijovwehshjmgnx}nu~ui}t{~tpvyurzv|}jmmlz~qy}}zy|~slz{~x|{{}w{e`iems{}}}srppplnofOmwvnhdkvugsvsu|svziruhbywo{rsvo}tvytelgot|{~|uv{}yw{yxcq}}}q~xupoxt_bccpz|{qfipoiimo`Twzzqqu|~ylwwtx}myy|oypdlsefupyx}r{ylyzpysfpqz~|~zxnqwzyyoy{{y|xoqo{{egopx~|z}|knsuqtywlWuyytoouvshprqp{lzz|twzjrsg|zswwuk||wt~sx|hppvxzz}xu{pl~{|zp{wfozkajisw~kiptoovtrYe|srkmsxuqrxzx}swymzidrxfsszzyszw~l~rhxiflnw{nrz~y||d~tzw{~qjwcetp^gku||selronwwxh_~z{usx}vtrwzwy~izptipk_oop}}|v~r|{|~kwwettlux~~}}nox~}m~|z{~{}z~}~xj{hdvygjnw}|jrxvu|zxj_zxrpv{rrpqvwzk}sxqtrerrq{{x~w{~p{|r{xfutlqsz{|~}ps}}h~~}w{}~{~{}shv`cvtdhlvy~vjtvst{xxeb}uuqqz{ruux|l~mxmphatms}w~|~z~x{|lylbu|kkowz}mt{{zwk}|}q~z|}uygnm[jxleksx}mpyxu~{taxyyrxvuvtw~xntrlsipcj~wo}}{}u|z~z}soyemynqvz|}~y~ur}n}|ux~y|z~zzriuagxughosx}}}tz~~wdoxyrsysuqr}yvq{n{prhhzxnwxt}~~~wz~{~{p}km}{lkrtvy{vu}ow~|}ws{~|wwgtebrugdkpo|x|~u{|yih}yxow{ws|~m~nvtnjcowlrtsu}x{z~owrft|pilsp~{|~xw|~}un|z{ypwz}~{x~}vwlkn_iuoefply}{y}wix|~uv}{{ts}|srxkxomffusqwvuy{z}{xylymlz|pkrtsy~}sxtuy}x||wq{{~wu~|uwkonbnvnfhqk|zz~|tj|{~rw{|zrt|}pxyp|rmgivqtvusy~yz|zzp{mnz{oiqoru}|s{~qsw~z}zvpxz~{yw|tuklnajtnefpiz{yuky}~wtvt}~tt{nztkfeqptxuuw}x~{vznvmjvzpiorpx~t}trz}xzztos}y|xytxyzuonfocgrsjfpnuy}{pr|~p~ysx||m{psznjfnuuz|w~u}v~}xwrqvjr|yomvo}yyyzq{w{yxwrp{|}~}q~zrzw{orinkdnuogkrm{}sn|tx}uu|pxxp|tkhkut|{x{ywy|~}uwowlnxyqjsouv}x{quv|wy|vpnvz~z~qz{qxuynnijkcktqiirl~~up~~yvwu{puxnzujgjst}|z|zvxz}}{sunulmwyrktpww~~y{sxvz~}vw{tnnvyz}}oxvowsvlmhljenvrjlsm|~us}vz~uuz}owup|tkimtw}~zvwv|{}xttrvlqzyqmum}w}yws~v|y~x{wqnpwx}{vo{|qsvutlmjoghquohpluw{sy|q{uy~vt{sw}oiiprz|wt~{x{}turvpmtyulppnux{sv|uz{}x~yyullrs{~w|~ow|upwstmkjniemsqilokxvx|vvw|ysyvt}siimo{y}wv||w~{{vrrvqlrxwnorkx{}vuw}yzy~}w|zxxlloq|z~vquzvpwtrpjkokfkrskjpg{y}zy~xyuz}txxt{zkilnvz|x{zw~x|}yztrwunpwysmsiys{w~yv}~t}wzx{{y{pklor}zyvypwxrsxqrnioohhnsohnhory}}vxwxyyyw~tijlnx|uv{|y{xyrtyrnrwwonphxwywww}~x{w{~x{zx{}mjllvyzvxuqwuqtvoqlhqmfhoroiofvr{wwxwyxxv~rijlpz}wv{}zyywxpuyqnrxwpqokwyyxwy}~xzvz{wyxwy|ljllwz{wxtotsorumolgqngiospkogts~|~yxw~wyxyv}wklmp{yux{yw}zuyqr{rorxxrpqi{uy|y{{igp{nntf||xwldj|~|zrkmkqxuto~oi]fsgjeqyrsz}|}~v{u{yxtz{swzrwdjq{porr~~~~ttwvwv{}x{t~~ymms{{x{swt{v|~||okz~|y||nmoozyhWUeldXUe`_enttswp|ry}}{|{ofoy~ulnnu}~xyipx|yeXftrvoac`grjbgr}pxtnzxsjjv}|z~plmlzxztv~x~okYVcr{o}yrtz~|~u~xuofdqxgdadvpikeqxv{owtpj\dlu}~yrxxwz~~yw~|uspmdbs|yzv{|ty}z{|rrdaPSbsttkjmpmkjauykzunrqoerx}|zzytxunmxttrzz{qysoidZ`p|~pogorgbgrujtimxrrkehx{{|xyylkjm~vxqz|ttpjdV]gtz|zwzzz~|xwrkdh|xokhxznoimzvyurtoo_`emvwyr|wy~zsvypqmg`nq}}xxuw|zw~|spfcRQYew}ursuspkcwxjwukoplepo{~~{zyzx{vliryxt~}wsvzpnjcZcds{tnwrgfktqmpisvsqhbfut{zx|wkkhvwwsr{~utnn^XZ_l||}|}~t~{~ytjbewyqwzurmw~v{vspsj_``gs~{{s~zyz~~r{{xtoqmdhji}v{uzxv|~tmjbRRS\n|||ywjk}ulxrjooijpix~}w|x{|}wmho~~~{x~xttu~~pmkd]d_i}~u}zojnttoplqutskccnotw|z|olhsyxur|z}zqlocYYYcrv|{}|}yundbmz~|y{zru|x}uorqba_alw}wt{{|wst{|mmmgelep~yyw}~wx~z{|}ylfh\RSUas~{|oljbpuw{}stlqzyyvpv{otxy}rooq{{~~zspxorzmjlhemgm}hg~b`fouyyuop|zv{zv~wptnaa`fr~}yor}quwknrps{u~x|wv|}{w{}xestnla_ha\_bly~{yy{~v~xlookqto}lfikvztttvwupnu|vpjw}yyzuruxwidgwyyh\_][fehy|wuipvw|}{~~|ww|ndduw~sywlmns~|~}tj]Wdozzurokd_bliqykvplod]Wdqnxz{y{{mkridfhp{}|txtlhkusuus|}zy~~ue[Zowoqn`_^ajsun{xh~{pljpxyzvv{ljnlpxq{rmc_lu|~}}{vsw}xqlz}y{{uyne`ernnjhpkjyz|||{qndltvzzz~||xxz|th`ey{v~zpppu~~kfY[hs}|wuohdilhwtkvlklb[[lopzz~x~xioqgggir{~wnqkioy}uxuzx~yzyk_Yhswzvylfcagptou~jutokms{xu}u|timmpyqsxph^gnt~{vv|y~}|snyzyw|xwtjcdlyywsqxnkxy{|}{upekoqu~z~}|xx}zz|vkckws{zsqos|{pgY]cisxokmhlylnwknlc\dohnsw|tjunggdgqxwwyu~tmkovyv~{{z|v{}zxk`bnjr~rmfekqqo|xmvpmptuly|yrknnxvlv|~xtebgimw|wxwtz}|tt}|zvty}t~ukefkro|{~oryy|}~~zxnglmmqzy}xxytyy|wlgqtoz|wsos{}~ysi[]adkxyrqjmzolxnlog`ephlqs}}}ktqiheemtut|rxplnsvq}~|v{~vwpeamkkx|voil||vvxjg}~xqwwhijquc_jv~y~wsstndhlot~qk{vv~yt}zujbk~swqguxohdhnrl}|oohkhlopfcilou~|wpmrw{}qttkhtur|sdfwx~~tkx~trsmbekpwpa`{tm]RXUQYgdjtvqvvke^^jz{~}px}vsu{y}~yfl~~xqv{~|x{|ytxqmwk]U^wxeikb[Y^eg`m{wqksm`aaif\ixzuvwmhotx~yrnr{}~vt}wts{~skfjcd|xnleVUY\`ekpyncupijgdchjo{owujonhlzy|vtthego{{y~w}wpjgmxznmc[bhbkopv~{pwo_f`ZYZanwvu{unyzuu{|}yjhhrqpyv}{|~x{zon`^`j{yynggkoghyvpgim^YZbh_fu|~}}qsyrjouy}{}{vtqqw~|x~wvv|zhcclikuvpa]acfimqzoburiigeejjq{owwknpjp|y~rpoffhq|wyxyyrmjkrz|tsifnkhqrtzxqwiaf]ZZ\eqvvy{ts}zwx~}~}zpfflsltxz~z}{ppf__co}snpsmhwysmgog[[aja`nx}uqzwlmrvz~vvtqpqwy{~wurv}kdfngew}mhhhjlns}pdxvkkhfefcnzrzzmornu|v}srnedciwzx{yn|ltrfelrv|zyrq}~qvzusvqw}x|ufrgbirv{xtngqrtlbksx}wxux{erfeimil~}t}{xnlhejrx}vpqqmchuwmrz}|{yvsx{~xwvuuqrt`eykjd^dbdeejqvz~y~~w}vjkuzor|wzkbp}po{}|v~zqsw~rjjxhonge_gkbcmyqksvwvtt}xwyxxyz|u}{xrffrkfw|{{yuqpsu|wsvkWT`u}ohmsvwvu}|gm{rkheecae~~{~omkm{zusvzxnqpjnklmil~z}w|zmn}}yuvzhWhmisw}jmummrkny|lkotvldihpxz}{y|{{tnhjz|ynp}ww|~xv}tvpvyohbft~|sohfsjZdgdd]af]]iwsqzx}s{zxvvuuhkmyz~v|yllv{qwx\M]fo}xmedgWPgmfinsuslvwnswkl|~{xtnnnryx|}~|{}~yx|yyzytqzsunZYcn~{yzxmilhhebbacjt{{}zvtxmdhsqpoxmuztxu}~zwpolquvy||yvkeecpz|zph^dhchyxv|~xqsh|}{}~z|}rmxyvy}|~}~{xlnyxpx~|vvq^ez||}{z|qswwz|{trwu|{otzytqklorx~{utntz{}z|vt~||q~qzuvz|zt}ykjj]Yjzvyxwtrsrrtxy{yqvw}{sntmdivsmu{||xtxviw}}~mu~wvuuw}~zuoopprvwy{tuyw{rvyooz}rrx{ztogvvicdgjjmqnx{uyzwrqrtw}~ywzpis}y|uhz|n|{x|~u|zqtzpjv}zpdeijikqtw|~uytt~wurljvws|{vxy~xvzthqztsrpqsvyypvvs|}u}||xrwtijtqjry}~|hjxvtvwxyz~qv}}wz|{ty{uuuvz~y{|u}wz{qs}zqtwwwvstr`aruxon|xlhjlkfk|{rotqabo|yt{~yuvwwy||yxw|tr{x{uutpebooffpwmnzujlne]\\\`fmv|vyxy~|yrszvt~y{~|}{us}~tjr~uswqgdfhlqw{yuzw~wribfbZahbdov{|krzuvz{p{~z{vvutwz~w~v|}wpv|v{~wz|||{xyyihusruy}~{{whjxznijkibhyzssy{lis~}||}}~~w}|rtz}~reospt{}{|yoitxmgjog\dp{zz{miql`]^_bhnv~zu~w}x|~~xwvqhmzuljppdeuzwnljhhikooejtor{~wsiekfbjjcgpu{u|{|~x~ykeccdhnv}w|~tuxpqvojortwwuvvigtutw{{ljvynhjmmip{zup{|{|~vossmtyst|{ms}|~uy{xzyrioxpggmmacr~sjrwmfghjntzz~}w}|yzxqmx~unntodj{~xtmlkjklosogqvpv{ukkpkjrplt{{v}ywwsv|uo|{yylhhhilosvmjvus~|tx{ux{rotuuvtrutjq~zmp|~spsurnwww~uvx}tssrsuyxuotpkpngkqtwyxwztmyz{yzwokwzqkmtpgp~okvuifhkouz~y~yqu{x|}|rr|~snpqnhozulkpsjj{x~ussqqrsxukr|xzyulippnusou{zt~|{~||xz{s~sq|vieefgjntwnlz{x|~wuyzz{ywxwos~ypr}~soqsnkwxrrwwln~zyyxyz}{szomrnmqjhnsuxywwxqr~ypu}vmkptkiyuhowlbbdfimszypy}y~x{~~~|yxszzpnoleiwvnlqxtmzyutrrrtyynq~|xyulchkgkjeksy~}|~|tuxtw}ypxrp|vhddehlqxzpr{~yz~~~~{xxunrxyz{~~qkozypnqrmp{x{~swzyyuuuvwy~uu}zpqvstqilrtx{{z{{vxvr||rllqpefw}{tn{}nhhilot{yvyyxx}~zy~|{{rqoifqysnouypm|xusrrruxphr{sqy}smstrrkipux|~~|x|zsz}usw|woztwwieeegjpvtlt{~{twzyzzxvwvsty{|zuw~rnnkeiwysru||ru~z{tttuvywvspwvtoghnquxzyz{xwz~~ws}ysrvyqkxxkr{odbcfjnu|xr}}~w~|x~~{|}z|tpojdjusmkoutlq{zyyz{}rq~ww|vljrsrngjqux|~}}}{}yu|utx|vq|qvtfbabehmsohq|w}{~{xvvsquwy{wtu|~tnnlgkyztru{|tu|wuuvxz~ur}|pjqsplccimoststvxwz{syypmotqip|mmzwiddfjns{{sw|{wy~|{||y|{trv|ulihcbnuqmntzws|wuuuux{ukq~}vz}yrikstsmiovy}|uuvqquxrp~rhszndbdfjnuyrn{|x|}}}{xuuvtty|}~}usv~~urqnks~{utw~~w|~}|ussstv{xmo}z{}wmksvtngjpsvyywwz||~vs|}tmlptplxwls~vjghkosy~ys}x|wswzz{zwuuxxx|xuv}}tnlhdkusmkovxsyyvuuuwzwln|zz|vljtxwpjouy|}}~{xppz{snotyusujszpd`adgkqunkx{x|~}~|yvvyxwz~}vuv~~vrqmku~ztsw}}w~z}ysrrtvy}wou}~zrhirtpgcinqtwvuv{}||uy|soptvpq~pn{}phgimpu{zqu{z~wy}~|ywy|yx}xusw|vnjgbfrsmjlsxvu~yxxxy}{pny}w~~zpjrzyqilrvy||zy|}|tt~~uporvtoytkrzpd_`bfjqskjx}||~yuvzxtw{}|ywx}uplgiuytprv||xztstuwzzqlvwz~zqhmvvmccimpstsru|}y}zxysqswvpu~zos}xkeehlpw{uq||xuz||}|yttyzstypj]_]]YRZY_gb]j|n[n}y~~}sz|wwqrxpqhhlo{~oblz|~~w}hayjlmxxzuq~}wqogonmkdgem{~uwlWizy~wyxrrqs~z|uqplrysjpy~VKp~rkprsrjsslee_gmkohga_ells{}{||x~sXd{yqptwxrqrrv{}|tWFj}vuioqg]\[`kgkghe^X[bnu{~|r}{sunlhlx|e_tnuzyrr|}unbaheN]}sqzpaY\\fb`_]aa`YWcuvusyzttrmf_buzdt{qs|rzx}{tfYWf`T{}xwpzzk]]_bd[[XXX`b[Vpz~~qx}wyvyupd^c{vjwo{~{wy||pxy~|tdXUh`bvrpnm}xi\`ac]UUSTVacZ]|}~qzwwxxyunc]ewwtqxssrx{v~s{znaVYmcvypmjgp~ue]cb`TQPRNT`fZk|zr}uzxyusic]my{pyxrppm{vuw|vjbVdmj~pnjffx}o_ae`WPQRQMXdd\zsuxwxwvsmebauq}spqlqxxr{|ymf]\pj~unlgdn~wf_ec\RRSVNUahZr}~yqz}tvuuspec]s~yp~toomk}vzqw~|zqgbYllsznoiek||m`ef_URSXPR^h^g{~puutstqrfc]i|qyvnmnhwz{ru|{ythfZhmlqrlhjzsbdhaWTTZUTaf]`{oqvrrsqsgb]f}rwxomoiyyzst{~{ytge[gjguuojlzuddic[XW]XVcf\\{oovqqsqthb]b}~rvxnkngwxyst{|zuhf[efdxxqlo|wefkd[YX_XXdeX\~|nouoqssvhc[c}y}rzukklgztwtv|zzrif[f_b|}sorvmzwf_]a^apoYcxsxovzvq^hpgtwyotu|wlpqmcdwwt|}qlnoqm^ZUbcexvsouoxw]`wrp}rk^cw}qickzph`okjqj{|xuvvxp{wlwz{wqqgl^ovru|ynuuekl\VVnymU^qs}~ztiw{mpv~rfadtox}s|~tpush~~wv}ifxrddhbQU][y{{wsizvttodnulmwd`t}wy}|wupvohivwaztuzrwhktw~whv}}yvv}zy~~l_]kwm|{zhmyldhnhoz|Xwrix{}mmu~yqeqpeocbdlrh{|o}|v|}{}yzywyyzsrqxrg]juaw|zw{r{xbgY]a`wtgosks~wcoo{r}nnwzvgft{krytn|y|rxz{}tvlej]hY`jn{q{zr|vu{lghmulo}xdllw|yuo~tm|xrty~ukhmu|}tzwrmhtnumzxhchkrrc^lxkf}ycquootuuv{sghyoytkz}trtblbfh_uw|p}v|tsu|{v|~|u{~jsyqlmnrmgat{rx{{vzzcgWdbnz~rzsxamlylcelqxpfl}ykwyom{y{~wt|zswaa_Wg[lwxv|wsgegoqnrtgnoyvprmrzzhmztpmpqpjgwv~ywoueowxmpqz~i[Y^eliaexxntylb}okjllowmzvu}|ykszs{ede\pdrzv{rot|}|~v|~vwsw{yfmvogacba\^ux||z|~glYinn~w}v{gmkz|g^^dmrnfm|xnw}xmkutrtsyz~r~vsu[bYYk]oz}~z{mecjqqptojpt|vlsrxysduxqgegfc`g~yzx~{uqgvynqrzp\XX`ihc^ovrm{xewthhfeeowqyr}qp{u}mciZqlgx{xrmoy||zty~}wwxzzxhkwoe[_]ZVYp}uu~~~or_sunzy~yznplzvb]\ampmdkuslu|ms~pppky|i{yspyvfWcvf[W[Pfxqgl~~|~toodh|rk{vzyyxrt{qmsk_]ebZXuqi||}rlwzx~zfrsdi`\]_Vamgbesysc~}supkuy~xywsljU_juegqklj|suqmswpk~ufjss_dWc`gcYct{k{{mlpaqydmyx}yz{rqtnim__m~{mlr~wsmwvldzmxxygqktk`[ea_gpolqzy}wtwij}{pfqxrqusmvxskYomflzvof|{oktzqzu}xurr}xaokcVkl\fjf\v}~xpnxq|jfl}xiroawwe^gaTlqmh|z~~zyxltxqzwszsrtbY\fcRLksgdiox~upnpyvsus~giyqsiklp\cnfdlxqoz~zlys|wpuvu{liUW]ibYcclsvd~t}rs{~wl{|}qy{yx{kjbcoah_fqyx~lxnrpbu~vyop{plg``bY[cokppiwtzl]vznmqjfv~xzkh_ri^ehmu{ny{~~qh|uvv}ulx~kt{jR^sf^]jflk~zz{qwz|oqv{tju}fjxotynajxkmqk]ov{{k}trsq{~z{}mtyvfn{dSTYMUdcbt}~}{~qpt|||m{|xoxl_lmaR_vjcmvfv||r}iqqx~vx~rmp|vspjfj]Mf^^\s~vfpxtq|v|wq{ujxpccikacglszkzzz}t||wh|x}~~zssmvzwhc`Sg]\]\ixt~{osqdpxts|~l{v{pjik_chlgosrw~{r}maxplwsh{nyvtyyhcWnZU[Z`lwswnr}rqqoh~zzp_qwiajjfiors~~zuywnsw{l{z{rhfaj}uf`okdjgUVv{ss~rvotyt{{piywa]_U]kgak|{tqvysv}tzw{r|}uzn}n_`bxy{zzthzupqxypsrpoiotidyzjw|fy|x}zflzxtthfzeRc}{}zpt{|utwvhvmeo}x~{{|~|x|~xc^_YaW_hglsxqwyzxwsihltrjy}ywt|kds|mjfoz{s_brgjwrmuu}{x{|ruzu|{sidjRo~|mXMQWP[^jvdr|~}|}u{~pruicWUXi~vx|mssspokpwzrzzzcacjg|zqkxus}mt~w|t{poyv|z{~u~~tdew|hnpk[]pyrplnrqwxfewjjhmqkpzzuqrmalduqvygnuxirulu}{|~}}wsdohko{z{pismqv{tn}y{mfr~~}~nunhhj}uzvzeikoihutxghyn`gvyhYln|swo]cnrmj}|su}}uzvtwjx|r{zvjonprzy~p}yjhrzynznw}|}rt{}y~|ynajf]iyuwzzuq|qbdclbu~{rgomrb^w}qnsqbZoilgwyw|tixovr~||zywsjz~qdm|{xxcozyng{z{vzlr}ocdilWjkqkruq{nmfyxfhpulfxy|{ziphwovxtnbmqhpyrpytnu|rtvsx~n|riz|ojppij|p}|z~t}{x{|u}z~{~}znkmmdYdtp{rfjvxlaii|wxvihn{ynosd`_hdWtt~ryui{yzzvp}}xtww|pkn~iruzyy~v}nlu{v|{}t}vzo{xw~{{~vuyvn^b^gqtg~~{pgztjYfrlmlimynjcv}rjki^]vvwq~vrq}~u|{vztkrmfimxh|}xquxqq|p~{u{|t|zp}tcqmfUVnqghusjzzr|osjsv|ypvqcetxregaiwt~z|~z{vvyp{ul~qtxsv|rsukbovsluqjoq}~}}s|{owrnuyupoy{i\iaY]To_gy}{}w|zsqpqjyqm`Yof^OTokgioomynxvyxv{ood_gloe`d_yz~u~tszx{xvvworzv{}hrkifkvnf\^_huzvhouz}vhcfx}wz^a~~d[Wu}mysmnnys{z~ofwvuhqufW\vz}ynpzp|pu}zqs~v{vgnrc]plnc^js|x|n{~tlglohsqugnqmr{{dXk~}v{}j{rmruw|ukt{xw{uunqsru~obon}mmwpsuo|pytit~}f~ok^[dhg_^hrpx}nv|vrzoocpylkw}ndfn~q][x}tz|{||zxxwwrzvc`bbnvokqqtyu~zw~ppyvm|svusw~}kutpbRWbco]Xhmhpu~sm|xlvof}slqsxoX[|ultxy{x~~yt~q~oqvp^XZ]hwofsmzqiyx~thvy}~qj}~~z~y}duuc[RQasqem~wzpt}wt~sfvxuf}slqo|q__svkkuu}x~}{~||~vvqtg\`blqphosx}}yh|zuvxnx|ym{zqfzx}}|{gnlnb\PX^eohcv~vg~ypu{vih}xhntquvofdvuwzxy~}{|zxyyx}oosh`\]fitnm|v{lkvy}~yuzz}|~~pl}||~yrayjfaX[\Zagi`pu~ytu}}rfxvniqnrt|k_m}x|ytt}zvu~wq|}vyp|oligb`fmojnpiqvyqrzzy~oix~y~|sywisoi^YT]djphs~tzqx}}qe|yrh|pjr~j^izx}xrw}~vy~~{}i|jngc^\hksqmrm|luzmq}z}x~~pl~vw|{zvmi}klh^XV\fnnhspstv~{vx}xoo}upoyiauwu{z~vvr}yrsxx{yqiketqe`ahuxyytxsy|~~nnyd~ifyt|zzoos~|oxnnvjZV[\afmf^gyiy|otu{w}{muuytku}wto}zp|v~}ix~}yt}^~fypaRTYfpv}v{||x{phuowtbwmxyspprz||plfsoabjghoxvggo{{wgkkno|uwt~rnimqiiquur~vuyvxy|qgz}\vtg\Zaionyulsw{u{lkkf~|~~sx~|jhmstsz{orssp]Vaebhpsb[bvnytxyxxtpyupptqqy|{pz~xp{qqcrkygYOS[dfqzu|}|yol{pyq_yl|vsmnrvu|mjgnocekhdnxvhgl|}yyljmmo{|xw~vqptsljqryw{tw}v{uzzmusp^i}pe\akqouvkk}vz}ui{ye|uy|pozshmsuquvqhvsodUZeggptjY[h|}|x}}~ntsosopu~owvwudklkubWOS\ber|y~}{qlxtw||~zm]yo}tpmjnqnykiegqfbegaluukjp~|riompyyv~zutzwqprqy{trwzvsv}vkh}j~f\|ylb_kruw{rmwq{~z{lrpp{z}vjw}y~x{nmqysttocgyli[U\jknxug[`v}z|{unuynmqks{w{x{sx|\rhjp^YQW`cix|{~plsustx{sh^uz|pmzjeijhv|yei^gqe_aeanttor{}tkrns~wuyvwwvwupqlyyrpv|zocjrow^cvmcdqv|}trs{|~|}rlv}o|u}ooywzxv}tontwpvndYrredWXbqoz{se_l~y|np~qkqko|v|y{vt|^hpdpb^XYbckvymnvnmcx|oqmjjoyymdedX^_w]p|xnfwxx_R]Ycfnut~{ssv~yu_`{lxtv}t|ljqzmlfs~wyyv}mnpjirpcxz~liz|otx_xklijmk{yxuwtwzyokxgfqv{|wkdbSm{}~urvo||vt}youq~r}ytyqikjdogwu{sqrjw}pgoc~s{sibnz}plhp[q|pqav}|{pxy__ehagXzsr|~tlw~ouq{hm}{}xs~vq[my|zly}z{ykhP_wyownmv|{blz|ypmx~tpc{mbqyz~lr|qsZyz~rxypmvy_ew~tl}hjkrz|ulfVVotrrncl[r|uqohm}xtp}~zt~ntwpfqwtvopimzzq|}kzyso`ibj|~qkxyvuhVzqsfav{wwlf{m]^db`\V|zp{rhvyuwnvxlwqYixyxqbs~}tlYexzvsquvaj|~zsmypt`ysamy{}rqzps]n|zus|ooz{e_t~ynvtqrt{{upbWfuvsrehcb{nngjszsqvkxi{zqgaxxuqnixxvnx}vqh`j_w|}tvzy]`}ov`bryrqcf~o_^a_^Ybun}vo|zwy~uy|i~umWdswtocw}~{ulbozxtutch|wrymu_rwdp{{|}tozzosfjqzuuj}~{|{j[g|{yswz}}xum__lwwtmgmavztoihmtxsxns{jjw}tocm|utqpnz|~okrwqlcdlh}}~xtWnyqs]eqvpl_m~n^^```bw}}nm}{v}y}x|zdpo`Ucrvwpmxzwrlnwyty{ocn{y~xmo\wslyz{wpow{tqth|uv{mt{y||{{z~{n_\t~|{{vtyqikxzuk}}t[[lwuwu}s~zjxreywv{vlw|icbwyd|}xsz}purswt}|~k^f\akWlszzsmcXiosq|faqpp~}p~{{n_q{{}vxwl|~~hgrreo{{vrkXosy|q{svwx\Zb}i]\h\Rgaqs{xuw|~ri`wkprxvsts|}npynqlvnatxzfonvXbzgT`Z\g|yjcwulipbqvyd[rvz|}yuzljtdttw~{]di~m`mt||~|r~wyc[_ZsqkqcUahz~qhs||xj_tlYwpsmrrz}{otwiruzeqxmu~p|ozy|{uox}}rtk]_ql^gqv^iutvponguxeuhfswlotjevsw}}}}|oYbykhjyxrzxwv~xzy|rguq_hvslbozcYt~xbiuu}dmiel{o}~qnrfgjy~t~vjoi`{xqjv~}r}}}ssv\WXkpn{nhnkf{likjjqxh^mlexu|w|vtrk}yxkv~z|esrpzsu~qvwo|t||xv~z~rbYUrxzhwwqw}hrtghsbcerym{ppqtqqzzqux~qovwfXjtm{vtoq~n}}{uupoc^dmn~sw{tgswioxv{ipprqfd]o{mqkysxhuv|odj]_r|w|zv{}v}r||ytjtegY`yxipldttjjv}zlnjjc`fvwt~{ehtyotvhrkvopo}~r~q}xrw|q{b[\`_gnwu|vooodwypcmrnpbxxdvqq}ksxovy~rjfehhp}xoszzwwxy|}|bcusd^psztwuyqkkqpwtcorr]^dlhs}}sgtsvxqoxk^lp{}oxxt}xx{z~||nlTaez||mt}zmvyy}q]ivrhlt}nstumov{{}~xmhnr|fck{v|~zsuxv}x~kbee\Xcr}|}prvzryutu{ntfdqsy~~gn|vu}ys}}{__r}tgsu`coqii|pgbkumbj|v~~xpnwda}ut{|pv}zknv|k`totl}~~zhxlkvyzvrvyyjp|gy|wlpvw~~i\w{youxvtu}gem~~vtxtgpv|srlwxs}}zv{{wkZSlTgwa]a[yswyry|}{nvxwny{~olmZfzjum{mpq|}xkqgs~wc[X[wtvcazso|eZvuxqfvsnk\_kquumw}wzq{wv[Uqsjo}~w{~utgvtQNOQ}qgmuwjruclosvnftre[_}zwrsvp~ieh]ifVnvyv}xnzuz|vwq\cocqv{wrtkdjieptntjreaZVbelt{w{ve{|v|nwy~wtuZ_z}z|}}ytzzv||}|igs^Ykzuyun`swpnhwymhden\cyutzyyhrnyvrtplmj`Ypvw{|~}s{rx{~p^ge\ffxrpfjqlmurwl^omeefSRuu}zv{p}xmj_`hip{{}sz{zfxkkt|~~ztreWajlv~xst{hqylcoq`iwaUXUfrlswvyxr}|}wjlskiZew~{z{t|wztx~soywukbeV\^q}wrud_y~igbapogkwoqrfu~{{vx}vyxstkb]imo~m{yqrp~rr}{otp`W[`x}~jkfq}pgr~vwi\nxghlmnuq~}zt|z}vjlklg]uzyy}uin}~u|~{}w[^mmabhbw{}wzzk~}mk|gjdhi`alhmipz{tdu{l[^SWs{py|sy~{}yx|vq~ukb[LZj`^horlo|jkbecXYc`jirspsuih|}lljtuyyxqs|{xuswqjtww~w{|whr}m]YQ_e_b~uvmnlbakgnkn}v~{|~}{{sigoc[`yzzzusotnforrzq~t|miaprjetxqox}j_\kpcfpd`{ppyy{z~stx~vv`mt]ep}~pejflyzxtprx~ywg`mwlns~}d}f\`]`Z[gz~u||}ogz{uw}hd{hdcgny}{zlr}wuwyy||wvqs{vyZeuwvj\]aik`s{iw{xromgduw|ry~wxw{ncfXzplw~uf~~w{}vkihsne^drvyhbelyfZtorked]ovae^knpy~xuuwsqu|lrj||~txwv~sr}w|qy|~mjd\hlxv{wyjZqnebln`q}cd\Wltt|qm}ulsz~wmlvkmhx~~|ruzxxktkyvkliakk~{xqws`u|omvu^_{s_c]Wsyq~ie|vwx||uov|khj|~~w}}qwynw{pktqcad}vconeiuo[lo_gb_nmez~svu}t}~y~yqtwjjew~s{xv{szwueq~z|opuj`^c~y}pcxthlxran|dX_W[tsopx}xxty|{~tnuvjmlv|}}tls|~p||or{skff~wi{pdepiZnmah^\pqlmuu}~zuu}x|~x||lh`tpvuu|uvy|oxsmqjc`^y{}sbxxmn{u`ko_e_\nng|qss{}zw}y{votvjkfp|zzrzwzlt}oksocc^xkw|qkuude~s^baYgmiuvo~uyw{{x~{pqwpmfe||v{~o~qunq~~~vlnl__Whqrshnxi^syc_aWanjpo{x}yw~y{{zmhnlfkg|s~xutrsqlxvsfgpjdee}lzwmiuo_g|mafaarrmytq{~v{qyww}ymptklip{uzy|rvwms|~|{pejlcgbtqq}tkp|nex~e^^Xdroqpyu}zvyyy{qiooioi|v}xsurpk}}zxugbifahhs~uipsddys`a^[nwswznzw|z|wyvhemiinpwy}y{pvqw{yyvd_jdYktnhyekwtju{`Y`amvkqf{yrw|r{xpxYcrlzx|~uqq~mijlyrykVR[\fxxxsao|pq}]`cUuylmstyw{zqlw~}o^dnx}x|xrvnlkzu}wutkrziSYbb_s{|{iwlcwpb^_Sgu}ytwzxvkx}wnlpdmou}n|s}tqhzuz~sft]_a[ujo~qvpowo\mmY]_opq~ynr{ty}}uyto[ilmmjv||~utvuyl{ry|q|sa\aob`z~rwlottxquddZe~jlw}z{|qz{v}yjike`du{tx}yuxyylts~myxzwep{e]dfnhq}sqoougygcjkhq~t}{wmowt{r_qiigp}||tyxzmiytqqxlpec_Xflows~njrsehjjdywnsuwy{v{|{ptrwxyy`cjqwi|szv~twytx||w~xzr{zu]Xg`\apmnipxtykmXjtrmk|~ymyntwuieuuklt{uvxn{qnny}~zzjzunmif[diiiwzzmxwo{ecjmilw|}~z~{v~qomwhcsjl_ev||yzxut{zttpjmitflfX_lv}v|lgz}xsqj]uysmqyvwuny{t{srebqgi{|{}su{vpvqyzztwppqcSZppnoz{uhrs~tumems|~{uyjm}tlcuvdbgc_px~x{s{rx|v}}yzssvjg_a]Ulings|{n|y~ra_u{{{}w~uqszxlnajqlngdw{szvgvvopsuy{~{lkdxcdmijep~z~|swyupjp[s~wufurz}yrowlu~yroobXlzr}~voy~yzz{x|glri^XjpcYZcbksvp|jut|uv}z|zx}opw~~rmrgcbifa}~z~vz{s|mq~z{}tpzyqbiki\\Niipwu|p_mxzniojluwry|attylxnolh}{|~~}}{|~wyzrhn~{xyoijjhWoremutmqynbo|}gmk}yuzz}up|yt`z{i\mjg\`nisqp{uwos}yzx}ouvv]U_hinc[eloqmvzqtwws}nyvyaqj|wwzrg^krgpss~|nqkatglvqyyvf[qzhfrsc^Mwxv{ylrzv~|~tz{onxnpr[Wghmrimw|xzzz{{z}zsw~{jzv~{psxlrevhjN`dYbc~~|tusuvlqp|zt{xpy}ubqtednyp[^p|qwz~xx~{owwprk{r_U[`ce`ammos}zr~sxoog\vq~t{xziz}wyrztxvkzrsnqrv~tnnpzwx{xw~rk|yxshlyq^V]ph\Lh|x~x|rrjwu|z|y}j}pylYbiktd_flgn~uuq~uo~xwxjq{lqix~hlZjhcnhltx|zylikqqrrt{q~yq_ttggmqbPcxouk~{{xnprwvt}{e~szk]SUftreguimpu|xv~{pewtvlvozklump^mskpimlx{zrruzzouux{twyuabz~o`Y`l]RQhdjawpw}|z~xwyppuuti^ijqvmcpttr|}tixoswqfo{vl|y}loj~rke_yc_c`djoy}vtx{qxrprxzvpo\vrffggd^pyuvl{~}~|trssz||xfu~ilffe`bfg\[nknry|zu{~tgouslyw}vrxpven}ejglhimy~~~ywy~{xr~{pyzfZrsaZZgbTThlmovwlqr{zwzu{yqidjmqthenqst}uy|prwzpcqywjtowkllukr`gzZT^ikqw}x}~qy|}qyr^qyd_jnh[Vhppvr}olqssuxx~}oqwdZgqyxosvyttwz}|mpdgua_mo|mqikossxzox}xyom}z~}{spwnrdjgrxptp|}rsPSjydbszoloxyr~~||rsqqleio~x|~sohirvjpsw|vy{nsurlsmtqZuyWS]ms\Yu{gdhr|uv~jq}iqdfgp|xsw~yrjqpcgsyzz{xy{f~h[^g_L\oqe`_rtswvxiup~zyz~nwnlri}nhxsroy{{|rt{||z~sw~~jivwhb{vz}yfZfg[Xansdz{~yqxuuim|{}yumtpy|kmr{uzzyultwqv|}~sy{v~uzwvxwiuwyzkVg}qejiwvrthqn~~{}u|}udmkm{ytfm|x~}plmh{{xhpyor|ukemvyptpsywictuaZ]hqi|utfirkmhswwrs}mr`szryzy{syzzwzpz|ur~w||{~~~s{~mjpnik{scYiwnmuuxhrnx~t~z{uu~uw{nrg~|nlvqyznmnw|zif}ytx|uu~xz}{nkswsh~~}~vlrtgadhthtvnrcoprpl}yvunh|uysssty{pj}vr|}qyvln{yu}yv}|y|ss~rhilkkzlctvimpnmii~sxsuvv{tz}lpfszvtomxz}pjilywpgvty}xy~w|qhjqqqjx~}}phqlilflcjvxdioljdvtx{vhw}yvl}odvxv|w}ysuyvzswrw{ni~{i`a`^owklspr~jma~zqww{wv~{rqop{xrjks~wpxujhjxt|inzrxysl~yutjhluwxtx~xsriikor[qxqs`komid{ztxulg{xslu~{}olyom{|vwr|{vxqyidyr`Y[]`wwejwokzypugvhnnuz{~uwqpzxvqpu||totrpswu|ltylpssn}~{z{wxwidfnqv{|}yptrsuvy]kzprboywofxzmpnie{{rp}kdvwliy}yw~|}m~~}~}xztnookmfUcbr{~lv{zlikgss_pvgwsu{|zzoy~{kotho{zlkfbrtyzwmsumyu{~w}~sz{i[hkiu{y}}oefrpcitunocbyxqyvmxs}~nq{zw{rcg|tnsy|{xz{y|xs~}xtzjlgeltcbhusoyxrptjh~gawlp|yx~tuqwunwoiuupopcnt~t}svznq}u}www{~qqxk_dkjw}z~xvgfqrbhwqlof^u~u{ym}r}~uo{vvxtedvvtw}|wv|vxtzv{ynxvhjd`juhjm|tqzvrtxieg_njs|zyowotxnumjrpospgqu~q}u{{jsyututvzyymprgbhgnwzywhivn^pzlin`dx|uswzs|suwt|txncivrzw|vtyvpt~tw}|}qmtlhh^`ppknrp}yss|vbqv`del}ynv~sm}pspjnnlsvinoszy{qi{usl{rzvxpmpidifgrxuqkvtajodndasyuxvt}|vyynyyuvpfispwt}ys{zrrmxr~x~yzskokjh^_mnknmt}uuzfqwbc`i|}xov~vl}psnmoljsvjni~r}zpkvupi~{usvuoonffkcfksyup{qbrldlbettrvv~}|uukvtvwmgmomvnzzsuvmorq}|}v|mlkjlf]bminil{~wywhzrdc]k|yvo|~yl}oslpqjjtskoe}r|poruoh{{wmsqnqlehkbggm{|vsetlcjdgurqxx}|tyhspvvnhmmjtk{uutomnn|~~xuqljgmh^_iglmg~|{x}lvxgf^eyzvwv~}pxntnprlgotlqgq~z|~~vmurriu}stkrmpnecjfcjd~{y}{jmydfeftvpwy~~|xxmnoqwrhinhpppz~{yo{vxzvx{j~wlcmb[aejeqw~yx|q~qoks{evszw~z}st}{spsleevlopyyu}x|w}yu{wz}vzgpqagiViqWbcy|tz~worwsjpx}|zrntoohzkps|cd|oy~w}s}zm|p{kv~vhngae`d]jtuuwszrsnrtvs{x}z~{u}yspyrldpmiqu{j}|{s~u}x}z}{~{rftfdm]Zva[_a|zx|voxspn}{xyzljpjyzjzyxr^xuoxuv|~ywtrzmw~|}qx{}xlqudgae_^hklrrqtp{qtk~|~t}|wnvvrlqrfllvirwru~w~yy~~}}xkyl`i`YtdY[^sot}zr|xrmyzw~x{}pnnjy{o}zr^uysvmj}vwwrxirxxyv|ykrvkoeh^]ddafyz{ust|vsk}t~{zq|wrnwujmloboyovvtx~y{w~s}|tr}ofiZbu`YVcofo}zzxt}ssy}w{yvtptws~lczvvthixs|ustth}mnuxvozronll\c`b[gmou|vyky{z}|}vzxwt{nopqfeskfply{|~w|ssz{|||tzklf`vh\W_ldasz|uvz{qvxysz|}wyuxtwgz|xvkesnnqx{|wrujokk{{t}zrqnpbhce]chehnzt~qy{s~|||}zqprtjjsj`d`nywy}|sruwwvz~poji}n`Ydod^mrphdvzywp}vuxvx}z{k|ynfrojlmqjw|uuntml}|ry{{wwsufhgjddjdffoelv{xuvz~zsuuolwqc`_aysml|}rvsxr}|~}ypoj}{kbcqj_drmhZj{~~~}rx~woqq}{~ssxmlukljofflt|}xuwtlwwn|}{ywx~rnnwnkvvqiww|}nfox~wpxy|kdpr{prvw|uzxUrjs{{}|klxx~kSednpjchfibXkwy|u^Nznjojtjk|{tyqxmdszx|or{{xnrqirdpzsu}|yv|ogwzvs{v|shewVs{|}yzvvznxyyryv{v~|~tcRZq`wwpcfbe[Q[n]YRefRomkafyxu~xmxszsyvlrrtpfxzw|}ntto_Wgvq~}sywxrbw~ouiws~wyq}{vu|{u~~tsppog^]ryzrunqdSndacXu[mtivexyxpyy|slk{r~{|wimr}jkpozifuyzu|}w|qdkfh]]czt}nssp~s~}|zv}jghgd[_o}~{kqiofMd`W`NmZdscueyuyzt|~zttprwsnvtti|}{|}zfljnbbhzwyzzilmxhwm~}{wv|||u}vwkhjlgaeytyrzmYrfdcYw_qxlxg}rww}}jstznkk~uy|xioxkmqs~kjs}r|v{xyuzl\ceh]`gy~n{t~lz~|}y||v^ach\]a~yusrqv]^o[cRcmXxkomiwqyzwnw|}ppwxyr}~owu~jzs~hfjofaby}z}zrjrukpmwv}wuv|wyynfjoh`as~}y~qcyljdb|atzowh|~quv{zhnsxigh~pz|mv~lpptzhst{lw|wyvyi^dicZZkysr|vtv{}~zyz}{}l`dicWWeuo|~wypaumfa[x_iyjrds}qswz~nqx~rmkxx}wwxx}ps{syxfkpn`^dzm~|l|ttiyr~w}|w~|rp{}~{~iimo`]ayopvrqbxxcvtnkxrvv{sipvsfdnykyzt}xpsqtqg}}wspy|x~yyvxfafk`XXnns|zt}tz||wy~z|~}yyo_cheWUash~|wjzzng`{id|opfm|urvv}qlszsii{zv~|yzx{urv}z|}}jglob\_wm}ty|yl~l}{tuyrouu~y~}~teimi]]lzq}sxpjqkuukqytvvzoioundctuoxyxustssol~zrvu}t}vvstd_ei_Y[toy}uuy||ytz~|{zy{wtrn]^ccXWcxl}yozundztbzvpkj|{uuwzwkpvvjhus~z|{zys}xy}}}{yxpbfli__r}uzu}usxr|tz{rx~xon|}||zyvvi`eje_e~~|z|oulruriu~ytvvylhnrich~s|zy{~tutuspv{pp|wo}wqron^]cg^]jt}wt|zx{wu}}x~tu|romleX]cb[_v~z|wtymomk~tqhq~{uwwzrkqwqjm}|}|}zx{yy}s}uvstfagkdbmy|x{rnztr|qsxypn|y}}zvxvtrrk_djhch~~tzqrwrjt~ztvuxnhmqkekt}{{}~vxvwtrz{rp}ysmy|tnolm_^dg``pv|vy{wz}uu}{zy~ukszulmik`Y^c_\gv}yxo~iw}rlix|wtxxymmstljyv~~~}z{|~w{svvussmaejgbg~{|urxzto{y~|tpuxplvw||}v{sr}~uqrpnachhbe{}yutyrlu~{twvypinqkelq}}xyxytuyuo~vnlxzropmm__dc]_tzs~z{u}~vz}wqx}}}zr~wnkvxplmjj\\``ZZnwox|vpzqjq{{txxzulptohmv~|{{w}vq|ztwstgdhib_n|o}|~qvor~xz||{orvskm{x}{zyx~tmu|yptprh`dgb_i}qtxpny~xvzxzmloogeuzn{}z|zuyv{xp|rjnxwnpooj_ada\avov|}yt}}{uy{upxx}~{q{tlirvnjmik^[_`ZZktk~}q~smoy|uxyzymorpjlyw}|{xuou}{rwstmcfhd`i{n|tzypnx~zv}y~sorsmjwq{~}}r}ulluxpoqnpcaefabuzswwor{~uxzyxlmqohj|vt}|zzw}vuqynhmutkpmni^aeb^fzo|||wrz{~{swytp{w}~}zou}qgdlqjglfj^[_a]^nyms|vnmw|vv{x|porsnn}u~~tvnnvypqspqddhhdgzzv~|stmpy{tyzyznorqlozy~|~zywo|xmfiqqhnlmk`chhfn{}yunt{{t{x{vlorokst~}~zyz|wqq}tidkqmhoine_cgeessy|sr{{{|wswxtty~z~x{wktwjaailcfhei]]cdch|{y~utmqy{t{z{{oqutqw|}xu{ohntrksnqlcgkjjvwuwxnksyut{u|rmqrop~s|{}y}w|xluymcckngkmjocdikjqyvos{{t|y{ynpsqowv~zz{|x~pp{sgciokgoingaeihjyuyzrqz~x|{uswwtwz~{zu}~ritre^ahhaiehh]`eegruzz}qnu|xw~xwqtvtuw}}r{riipskqqnrffjkjqz}yt|pjowur{uzvmpqoozq}|}zz|xyympyncahmginipfchjjoz{xqt{|vz||prtrqyu~||~zz}pq|rfcioijpipgbfggk||syxpsz|w|}stvtt{w{}}ywylkvma]cidekdkc^bcchxyozyprz|v}}stvut{xwtymhmsomvntnehjiky~oyootwt{|ysonllvwtt~zwzurzt~~xjkhkxxskfrovxnruuvv|{xxuv}sr{xq{khz~x}y|~w{y~vtvtsyvy}|qpszxyuwsyzyuooys|z{|syzxxig]ez~ibf`jdbgjkp~|o{w~y}vy{umjxy|z}xv~wyoy|wx{gekvrntnddqndbjrqu~w~xonlkqvu~~zzyqyuv~zx{{o__kjmw~v~upssty~t~|ukgek|ztskhogpqpxvpyvkbnsmnu}|w{}uvwwxt~y~zushlw{yutqw~{zyyvssfYWhmpzy~tjjihkvqb|xlx}{wvslxxz}wv}~wnmmr}wz~tz|vnkeew{~~siotiacknlwurxlhiinzyxwt}~zxysrzqz|zwnsnc\jvuw~~~wvxxyw}{xigjq~|xvloqjtrt{}qqwpgdtxrqw|yyyvxxx{psz}yrpnjyxx}sry}yz{xjli`Xcw{|zsnnllr{mhsnx{wstpq|y|uw}~{~z}pmpvz|zzvytvxtlhigvzpkuqfchnlqxnvqhikpyppw|{xxuoyst|x{wlonf_hz{z}~}yzz||y~~|yuvihmu{ypstlvuu|}qqvphfvysrv{y{zxyyy}npvyvpnmk|xy|ssx}{yz}~|~qgjf_[iz{}wsrpry}hqnowxurrlu~|}yxtw}z}x}xnorzy}}~v{}yzputnhhdl|~yovwlegmmnypsujiimuqru{|xwvovupzxzznophabswvz||{}u{~}|{zuxlijp{uxxoyxx~~sswqiertopw}z{yzyz|npuxupnihwwx|zrsy||~zz{|x~|nkme]Yhppv~{xwzwg|lrxwsrnjvszy||tty|zzvpopyysklpgqttz}sqwqicr{z{zyz~pyxfgpyzwv{~{z{sogfxzq{pvyvrqklumv~~tjfi|ndixtxyyz|xsu{|wyw}{niyty~}}yw|~ykhqty~~|}~i^bmxlkrolgqvolpwx|}wqkjr{yw{|yvtnwwrsdXaisv~|vww{t{|tnyzsg`hzxvqlkfhqhqww~yw|uk`fppt|}{{|t|z~xog]eov~xr|}urv{|xtru{yqbURbktzxomlntykdvjptsnkdcpo|y|~wx}}vmjjuy{xxnuz{xof_Wbpwxognofbejkpyorsiecfrtwuyzwusoxvq}}~}ssqf]Yirw}||t{~~{usz}rgdgszunltknvuy~~vpuph_bqstx~}|||wu~qtuqje`fwz~vyztty|~~|vuy~slkbZUcv}xsqqtzyepoinqnigbmxwx{wx||yxzolnx~xy{vrxtookd_]`vxojspgdgkksujqnffir~urtxywurq{ss}{}~tlnic^eyzyy}zxu}~xptjglwzvosuksww{~zporkfbnzyx{~}~~}n~rlnnieefx|vxuw{{{yy||}qghc^\dzywux|}kiugjmlhgem|yy}}wvyz{xtyqnr|~zy|xttnhhgb__ez{rmurifhkkttjqnhhlv{vrtxyvuqrzqs|z|~{qkmhdaj|uw|~}yxv}|}z}pqrjkq~|vrzrnxxy||uosojefuyxy}}~sr{klmkfdcm}}x{{uvz{~~|zz|w}~|sihf`]]o|}z{pg{iimnjgdhvu|zz}wuxyz{tztopv{y}xs}rmiigb_\asvwr{}ussu~ntympssqldipp|}xz}{tvyrnis}}yzuu{~|zwxxotx{vqppzumupkjmw}|rjvkqsprwrngnwvw|yw~utpsurnkittusty{|}utyt~vtwrnhlxz}sqiZ[_`^]\gkgv|~xqglrswzzx~v|ywv{{~tnts|vtuuwwtrow}}jelq|njngcbdlsocwrknpokfbjkiz~x{{uqktywyzuy|xtu{}|wzpefnm~~xvme\]dcbfknt}sqysnlms{zm|xmorqomjtvqzsjpy|~{x}~ywzsotzwslf_`h`dqtx{ztrupkcajllqvwz|v}yxyw|{|ztoiowu~wy{{}}zxvwndjty}~uolmrvmbwngjljfb`jiiy{w{zuqluzxy}|xv|}zvx|}|w~zrkdhts~}unebjjghlor|voxupnnu}~pu~onqrpnlrzszxskn{~~zv}}y~ztrw{wvqkfcjkdnuwyzwqrslhbhqrruww|wx|{{~uuuurmjjx~}x~~xz|{yxz~wpjhv|~wsru{zlg~}kfhigdaeqnq~yw{yvrqz|z{}y}xx|~~{yw}}xzyusojfgt}uphjqnlmoqw|qqwsppu~|n~wmnqqpoozzuz{yspmy||}{yoy~wsusrqpy~}vzyztprsqpov}vzwpnnxywx{~vwgpyskhisvox~~|w~zp{zssvy~{q|~}|wsow|z{~{totlmppppv~vxwqw|~x~wg[f|wqpnkqusspu|{yz}typpsrqqu}{rrt}xttuy{yysou~}xppz~{yvk]l}pfinpoopxvlruuyztx}zy{~~}}~zki}wrszsr}|w|{x{~{vlc\bhi~xtssyzoptolkqzti{lb`bgptrvnkuyz|zwuxvttxy|xz|~}}}zusqnrtiptzwoeizu`]ioprrrvz~~yvwy}w}lm{os{~|{|~|spsyyzwusuz{|pdlu~{uonw|m[\utdadhhiipwnoz|~~yvwvzzz~~}~{solozqqx~}~vwz||}|ncbdr}phdenjdottuw|~xgkveaekry~{{~|zzzxx|}{yyzotxy}wopc^]_gs{xuporpmidikjlrw||rzwyzwz|{yx}{xwz{}y}~ytsstx~zvrtqbdpxwqecegilrztmuxyzyvtxy{~~||~}yxskjmpv~}zzz||||~xtz}}}ww|zwsmghlpz~z}wjxzmjlnptyv|}~|{z}|nmv{{xyxvtw~yrzzxzz{~vn}g[Y\bm{||~{yurwyvuuux~wnxwxytwyyxx}uqwurokhmw~z}mr~omqvy}ytrptzqo}wrssqoouujnwz|}{xz|}}{{|}{~~xo~~njlqv}~|z}}ywrt{}||}}y{y|{}~||{~{wrnmu}z{tk}rggkosw|zqvxvvutw~{xutxuluxrsmpuvvvzvs{}}}|z|ppygbgpz~{uswwtrrrv{qnywky{xz{yww}{oqusqolkqw|~}zo|posx|zvsqvvmwtrsronqwngnpnljgipu|~~{xggxra[`is|}}~zy~~|zz{ttwtqppr||{|zyytf_s~rijotwz~|sx{{{{yz}{yuoqtqnnnqwtmx{xzssuuttzxwnsvfbhqz{wwvsrorxywvvv{|rstj{vkjlmnot{ulqsqomkmuz~xz|uw{zurprvnn}ywuwwvtu{wlotsrqnmrtuxuwzxttuy{~{kew{j`agmt|~}|rptqnkgfkpu~{lcs|m`^adglu~zsy|||{zz~|zwruxurqprxrkuzz|{{|{|~nanwg[Zair}~zvoprpmlmpwsks|prtnnpppqwynmstssrquxz~uzwxz{|uvxusssu{xntxtspmlqtkhpsssqopqprst{~|{z{~yylu{kefims}{xvxxxy~|txzwtqmmpquz~vgj}zjbbcegmx~vu|}}}}}zx{|yxww|~tq|~~~}|x|~}~}~}piy|k_\^`em{}ystvtrrrv|vmtz}uy{ttutsu{}sqxyxvtrtuuy||p|rmmopu}{yzxtqonsqfhszzxvsruzskpttsrpqttuww}~|mnoffhkpw|x{|{z{}~{yywuuzxljoomljilnpuyrhv{mhhijmux|~|wvzzxxxy~}rs}{wvvtuy}w}yievyh]\^bhq~xz|zxxx{zryvy{sstttu{}souvusqprttxz}u}yrqstv|~xtuuqommqskit~~|ywy~|qrwxwwuuwxxzy{}oeq~sd_aeip{~~~{|{{vvurqtxrgimljihjptypk|vjgilot}y}~}{wrrtrponqwtnw~{{yxx}xsx{{{{{~{oaewtf`bhnu}yz{yxxy~yu~}q|uonnmloutjkqssssty}wosoqsvz~}zsrtrpnmoutmt~}zyy|yquxwvutvyyz{y|~}}}zxjl~~oggkou}~{}~}||~~{y~wvusrsxtihllkklnty}qjyvjegikpx|uy|vvxvtssuzwpw}zyxwx}wsx{{{{{~{n`hxtfaciov|xzywuuv{|ss~}wyttsqquysiloonnnqvx|~qszqprtx~|wqrrpnmmrvonz}{xvx}zopuvvvwx{|}}vhev}qfdgjov{|~~~~{|xutqpquuifkllkkmqtw}vo~qllmos{x|~{xssutsrruzunu|{yy{yu{~~~}~wi`mypb^_bgnz~~vzvyurrppqwxnjnqppoprtuxz}zqwqpqqu|~}ysqrpnmlospglw~|uy|{zyxyywxwv{~}pen~zkdcdglu~||{|usqnnqumdfjiiiiknpswz~qtwmjjjlqzyx~~|wstutttuz{rox~{{~vw|~}}}~~}}{}{rdbszod`bdgo{~~v{v|wsrqprxxokpssrrrtttvxzzq}wpnnnpwy{|ytqssrqqsxvmnxvx||{zzz{xxxvyuik|rgdefip{~~x~wyvtrqswvkhlmmmlmopqtvzyq}umkkknu~~wz|wtvvuuuw|zpqz~|zz~|suzzzzz{|{{{z}|qcctymb_`bfn{w|w~yusqqsxxojnqqqqqtuuwy{xnxxpoopry~}|ytoopnnnotumku~xv{|||{{}|{|z{xkesxkeefiox|~||}y{tqolmpsmdeijjjknqsvz|ussnnnot|y}}ytrtssssw{vot~~|{|{ux||||}~~~~}|{ui^duvibadgmw}y~wvsqoorwtiglnnnoqtvx{|up~uonopt|z||xuolmlllmpuslq|~vx{|{{{|~}~~|~yncgy|phfhkpy}}~}}~}y~v}tpmkjmqndafhijlosux}vrvpoopt|y{~{xsqrrrstx}yrw~{z{yrvyzzz{}}{}zti`iz{oggikox~}~ywxyz{}wqy|{|zxxz}wmlpqqqrtwxy{{~}tlp|voilxrt}{{|{{|~~{|xvssvzxpouxyzzxtsyzomz{qmmnpu}~~~tpwuls}vtsrruyyrnrttuvxz{{}}~}tp{~rjfhny|{||||}z}ytpnqz~yuz~~}{yskgq|ypkjkmpv}}z|~{y{||||}~yrsz}{zy{~yuxz{|}~z~qgcdir}|zwurnmnppqrtwuprw{~|wz~zyxwy|}xtvwvutttuvy}zu{ywwx{|{vnlry~wspnnpqnijlmnopqrrrrruy}ztu~wplkmqx}}}}{wtqonnqv{|}}|zxtohirwsmiiiknswwvz~}|}}}||||wrty~~||}{y{}}~~~y{zqiffioy{xuqooppqqsutqquy{|~~|y{~}|{|}~{wwxwvuttttvy|}x{|zzz|~{zwqmotz~xurqqrqmlmoopqrtttttuy||wty}ztommot{~~{zwtqnnnosw}~~}|zxuqmnuxtpnnnpsvyyy|~~||||{zzzyurty}~~}{|~~{wwzvojhils{|yvttttttuvvtsvy{|}}|zz~||{{|}{xvvvussstvx{~{{}|}~}zwuspmntz{xvvvusppqqqrrtuuvvvx{~}yttxyvqoprw|~|xvtqonnpsw|~|zxuqoqvwtqppqsvyzzz}~~|zzzzyxwwvttx}~~}|}~~|vsturnmnrx~~{xvttuutuuvvtuwz{}}}|{|}|{{{{{yvuutsrsuwz}~|}~~~|zxusrrqrv}~{ywwvurqrrrrstuvwwwx{}~|yutvwvsqruy~{wusqonoquy~~|{xvsqsvwusrrsuwyzz{}~}|zzzyxwvvutuy~}}~}xtrsspnnptz|ywvvvvvvvvvuvxz{|}|{{~~}|{{{{zwvutssstvxz~~~~|zxvtrqppsx~}{zyxvttttttuvwwwwxz|}~|yvuvwvsrrtw{~{xusqpoopsvz~}{xutvxwvtsstuwxyyz|}~~~}{zzzyxwvvutuw{~|xuttspnnorw}}{zyyxxwwwvvwxyzzzzz{~~}||{{{{yxwvuttttuvx{~}|zxvtsqppruz~~|zxwwvvvvvwwvvwxy{|}~~}{ywwxxvtsstwz~}zxvtrqpopqsvz}zxwxyxvuttuvwxxyz{|}}~~~}|{{{zyyxwvuvwz}{xvuusqonoquy~~}|{zyyyxwwwxyyzzzz{}~}}}||||{yyxwvvuuvwxz}~}|zxvtsqppqsw{~|zyyxwwwxxxwwxy{|}~~|{yxxxxvttuvy|~}{xvusqpopqrux|~|zyzzyxwwwwxyzz{|}}~~~}|{{{zyxwwvvvxz}~|yvtssrpoopsv{~~}|{{zzzzzz{{|||||~~~}}|||{yxxwvuuuvwy{}~|zywvtsqqppqtw{~}||{zzzzzzzzz{|}~~~~~}|zywwwwvuuvwy|}|zywtsqpoopqsvy}}||||{zzyyzz{|||}}~~~~~~}}|{zzyxwwvvvwx{}}|zwusqqqppprtx|~}}||{{{|||}}}}}~~}}||{{zyxwvvuuuwxz|~~|zywvtsrqqqqsvy}~}}||{{{{{{{||}~~~~~~}}|{zxwvvvvvvwx{}~}|zywutrqpppqsvx|~}~}|{{{{{{|||}}}~~~~~}}|{zyyxxwvvvvwy{~~}|zxvtrrqqqqrtwz~~~}|||||}}}}}}~~~~}||{{zyxwwvvuuvwyz|~|zywvutsrqqrsuw{~~}}}|||||||}}~~~~~~}}}|{zyxwwvvvvvwy{~~}{zywvtsrqqqqrtvy|~}||||||||}}}~~~~~}}|{zzyyxwwvvvwxz|~~}|{zxvtsrrqqqqsux{~}}}}}}}}}}~~~~}}|||{zzyxwwvvvvwxy{}~}{zywvutsrqqqrsvx{~~~}}|}}}~~~~~~~~}}||{zyxwwwvvuvwxz|~}|{zywvtsrqqqqrsuwz}~~}}}}}}}}}}~~~~~}}|{{zzyxxwwvvwwy{}~}|{zyxvtsrrqqqqrtvy|~~~~~}}}}~~~~}}}||{{zyyxwwvvvwwyz|~~~}|{zxwvutsrqqqqrtvy|~~}}}~~~~~~~~~}}}||{zyxxxwwvwwxz|~~}|{zyxwvusrrqqqqssvxz}~|}{zyz{}}xrtutyyzyzxyzz~}}{~}yuvy}}}usrqtz{sru|yqouv|~}~~}|ty~}{wz{|wqoy|vxvrowyy||}|}~ystxvtptrlgltmhoz|tmu|~zwz{z~~|}}zzwporpsxwo{yo~~}||xux}u|{rzv|z}~~pmqkqsyzvpn}|~z}|~wuuyrtvwutwqtxzxt~}zzy}|uw{qv~ztv|uuv{|v}|zww}{zvz~zwyz}|zstyyu|yz}~{w~wwt~}wxwvrt{xvw~|xsxztxsor{~po|psv{xuu|z||{}}zzr|ugo{|~~x{xuvy~|~v}~yoqurzuq{zv{}y{lo~zxsonslisiutnt{wy|{|{y{w||~x||~vx}}xsmrz{vvv|~~vt~yllqxwtsqpojn|xvgamnjzsmt}~w~|yt|{xzuw~{srutunrm}{||z}zyvzx}pkndd{vwputtzx~qremss|qsukvw{{xwx{lu|r~tq}}p{ts}vupsvu~||qpnqggq|~~~st{v~zvrtxkkk|qu}xuuwwqox~up}w}}w|n~w{zpxr}~~{u~}{{p~~}~qoxsggt}~}rx|uusrn|xoqosm~uxtps}{rz~}v{}}~y||s~}yyyqs}s~yzuy~}~~}y~{{{lpxrmm{~}}t||tpmkztfnvzlp~{{ppv~pu}}y~~wzzz|}y{uwopyxtxs|||~}||{lu}rrn|zrzxzsofnysjxvwlqyvyssywx|{|x|xxyyvwqnx}yx}yy||~w}~}~ylq{ysso~zuv}wnhrwmi}tzpp|y}wr~svz|z~yz||wxyyomt}~wv|}|zzz~}vz}xpswvupp~yoxzpltuvh~{wuourwr~yu~|yz}x{z{zvx~|pqv}y{~z}tzz~wzxzomutrrp~qx}wlwvufyrxqtr{vqz~vxzv}~xyz~~txunszv{~}}uu||}zrzyrossswtyxm|mtxwonqrvmpw~yss}xyuy|~v{~~|tq}{twu~}|z~z{u{|rvwqorsr|x|o{}oqytsn{xlwsov~{uq|{{wx~}~w|{}}~unx~~uvu~}{}|u~{{}swtrsqru~{py|~rqxvutyzlrtkv}~yr}}vw}yy}~y{{xlr|~y{x~|wv~~~~}~w|vvsrspqu~|u||~suwsuyy{orxlxyu{}uz|y~|zz|xy|xms}{y|x~~}v}u{}|y|u}{vvptuoot||v}{wxwuv~{ypqujy}yy~~xs{zy}~~||ww}uov|{~||}yzwzuz~}x}yy{zxtrnuuomwy|}{~x{trxwxpvrn}{{x|{usw}{|{zvyurw|z~x}~vx|~xyx|z~}syyxvunqxulpyw{}z{~zts}rwnuotzzy{||oxzz{}z~xw{ytsy{{{|v|x|w}{xz{vyxwvpkuypmxu}~{~}~vsztutsvryzyx|~ss{~v}yzyy}wruy}~v}|zx~~y~xw}}uwvxzvlpxwosvu{x|}wvovrtvwzzx}|~qx|}~}xvz~zy|~yvrty|zy~x|{xz{}~}vuwxyqjqwuows{{|{}{vz{oxst{zyzx||zs}{}|x|p||zz~|yvqs{xx{z|{~~vyzuruxypkpwtpvq}|{{}|{wzowrrzxyz|~yu}}{}zxp{|z|~zzwrr|zy{{|{zw~z}~}|zvqtwxokpvtsur}~~}{zw|pxsqywyz||yw~}}xz}sx{z|}z{ysp{{~z~{{yy}z{}{w{vyoquwolouuvup~}y{yruwo~vxz~}{y}~w}|wu{{|}zzzvqx|z||yx}~~x~y~us{qosvplmrwyyp~x}}x}wqzrzxww}|zx{~||tw|{}zwzyst|{}}xx~z{yzxxvruvoqtrmmpvz~szzx{||ruxu~wt}{~}{y{~zysz}}zvz{wt~|~{~yw|y|~v}}v}rwpyrosrmlnuzwz|v~|}}uryyzs}~|{|{yy}w{sw}~zvy{yu}{{~~xv{xyw}~v~rynvuorrmmosyy{~v|~}}wrx}~}s|}z|~|zzx}t{ut}~zwy{zw}z{}~yv}xxx}~w|u}xotuorqmmnrzy~v{}}~xrx|~t~|x}~}y{v~tzut}zwy|zy|y}|}xv~~wyy~{y~yx{wosvqronnor}z~|xz}}xrzz|w~yw~~|xzt~s{tu~~yxz|y{x{z}}~wx|wz~{~~y{~xzwvntuqpnnnpt|~}zyz}}xrzx{|vy}~yzvxxu{sw|wx{{{{t}|}}{w}yw}~{}|y~}yzxvsowtqnmnoq{{}{z|~|tyz~y~xu{yytszyt|~yxz|{}tzz~~|y{zvy~xz}~|y{txpsxsolmnou~y|}zy~}zuy{~{ty~}x{tyzt{wv~|xx{{}ys{}{~}z}xvz{z||~}x}wswouxrmlnnoy{|{}yz}yy|}xt~zyyswu|ww}zxy{|uxz~~y}}{vw{w|~}ystvnvyqllnnqzyz}y{~z}}~}vu~xzwtwt|xx|zxy{}t{{}y~~zvw{~w~|}{zqsvouzqllnnrzx|~y|~{|}|uv~w{uv~ys{ywzyyy{t}}{y}~zvvz|x~}|~|yzrpvprzrllnosxw~y{~}z{uv~vzuv}{sy}wwyyz{v}~~|x{~zvvyz{|||}~{~yytnusoyumlnosxv{y|vutvtxwo~~}{uu}vxut~|xsvu{ywy|}xz|{xy}wsvsu|}|~z}zv~wnpvrv|tqrtw|x~{~}~{w|zx~|omu{vqqxstzv}~yxz~|wvv|ytv}{~{|z{|u~|rnuws{zttwz~|{xsoq{}yxy}~vxt|wsx|wxpxvrtnn}~{|}y{~vpo|xxyvpolorkttlfjqmpsnknqwty}~~uyunomjy}|y{rw~{yyw{}y|utuyztrqv|yxr}~{x|~xytu~{{|y{~z~~zx}~{xwx~|qzxs~xsqw}{xuowsosso{z}}xtrvustl|~wqlrpmvrmghrpmrpmnsxr}~}~wsxolooly|}v{}|zy~s~z|xssu{xsrtzwzvn~xv~y}}ytw|z}{|{{|~}zyy}vuxww~|tqtz~zyovvpqtsq|}x~~{vtvvqwlnwnrsnwuplgnunnspnrvqz}|~~~yv{rnoqmpzxy{~~}|y|s{||wsstzytsv{uzwkzxw}x}zvvw|~||}||{w}||wwtyz{|tquz~}}yqyvqquuqvyty~~|xw{vrxkjz~}{qvsr{vrnimvpkqrpstoz}~|||z~~zx|tppsqmsus{~~zy~wy~~wsrsy{vtx{tyyms~{~yw|x~|xv|yw~~||}||~uw{zsv~y~wqty|~}~}rxxsqsxvqvwsz~}{x{yqwrio{{y~xwwr{{urolqwnkstsuou}z}{}x{}}x}yrpptrlqus{zx{z}}~urru{zvv{wszupt~}wzxzyx~|zw|zv~y~{{}~sv}}rv{z~xsuz|||z|tzwrqrxyrsyvx}|~{y{uoupmo{x~wsqmntqinuutmtyu|}usssuxuzz||}}}{tjuso}}|}}zvu~zzusty{xw|yrunnv}uz~|zv~~}||}}~vplt~}}{{}{~wq|}{~{y{~}|yz~~wropv|{}ojdes|yrxwsrkryuttsrswvot|~ut}xy{usrrv{|wmfemx|}|yvuutuwwtnn}zq}|tqquz~~|yvvtjlmnz}|x~~smjimtzwtv|xzxnpz~vtxxy{{yvyyz{snlnv|yupcdfgv}|xvkowtssssqqvsowwt|ww}zsqqruz~|phegoy~}~yvttvxxunl{|ry{wrruz||{zxxsjmln{~wzqljjlr|zvx~~x}wpsxxqv{||zxuz}x~|sompv~}~zwldgciw~}}umvwuuuvuqpvuqy~uz{uy}xtrrrtw~xnhgjqy|{zvtvxyxsmt}xvxyvsty{{zzz{ynmnir}~|z|wpljjks{zz~{ttv|}sqz~}{xuy|xxropsy}|z}qhibdpxy|{ryywwwxxtptxtv|w|{ux|{vtsrqs|}smjjnrvu|~xvxz{ytovzyxuwwuvz{zyz|~zoqmhqyzw{{ztpmjhp~z||{vwwz}upz{wtzzxzurrtwyyw~tllcclsts|y}|yyz{{vqryxvxx|ux{~|yvuspq|yxrnmmorst}yy|}{wsxxx}vtxxxz{zxy|}sspinuyvs{~}ytplhkxzu}yzyxz{ts}zuy{v}yuttuvyxw~|qpibgnsqpz~|z{|}|vrt{{vt}xvy{}~}{ywurot~z{xronnnrtu~zz|}{ww{uxwrw{{}vmnsvrmr}~|~~{{xxy~|zxuqmp{xtw|{|~{~~|}yptt{zywwwwwxzx{}}||{}|~~~yztmquyxrsuq}tqpomkhkwwuwz|||~|~{{{z}yvuutvyzzwwwzzookcflqtqmv~~~}~~z|us~z}zwrnny}{~}utxxy{tpmlklpttvy|}{}ywy{}{{v|zqt|}{qpuz~~y|~ujw{yzuoigotrwuu{|z~x{z{~yuwzvu|}{yxwwzz{~ynlv|xmjmpstpox~zy~}}{{}~{xzyoz}~|wrqy~|wtwtotz|{wtqprvywtz}w|~zwwy{zzvy~|tqy}srvy}~|{{z}ulty{{unlstrzxsx~}}w{}y{~ytsyyux}}|zxx{}zz{yplu{pnprstrpwyw~{{z}~{xz}wsy{}}xsu}|}~|tswuprx|{wsrty{up~yw||ywxxyx~{wz{{tr{{tvxz|}||~{{zrrtu{~vquxrw|ury~yy}xy}~|vru{ytvz~~~{yz~|}}|{zwooyyttttttrr{{v{{~}{|~~|zy{ywxvy}|wx~{{}~~wswzsorw~}xuvy|vny{vz~|zxxwwx~{xzz{xsw~xyzzz{|{~|yvwqqw{}x|ztz|vqv~~yz{vy}~{vrt||tsw}y~}{{~y{~~|zztpw}~~{zxvuutsw~{v{}y}{|~~|{zyw|zrv{}~{|{{}zxtw|xoou|zy~{z|~yow|wx|~~|zyxwvw~{y{xz{vv}~}||{zz|||}xx}tmsy{}x{{ts{}|~zz|vw{}|xsrx}yqrzxy~}~}x~yzzusy||}~{xwxvtx}zy{w{}||}~~}}|ytyvpw|}}}~~z|{vu}xy|w||vv~zwwvusrv|x|||yo|spuxx}~|v}ujv}}z}z|khxoggmvwpp{~wy~~||~wwzrqqnnsuvsnt}~{zyyzz{{||yrwvoz|{}}~yousllqslhqxsv~yuvuy}{zxusw|~zywrx|{{xtv|~|vz~yonzxpvspnjp}ztqswumpyvu{|{{~~|}~{x||}~ww||}}{tptyxonx|{yxxxxxyzzxokwzy~}yvywyyutwwpnvwv}~~yuyxx~}|{xvv~~zppwy~}wyyv~}}}}zqjt|{y}~{{xpnsru~~yvuwyvrvwv}~||}~}~~zx}}}~|tu}{srz~tow||{{zyxxxyzxpku~~~}~~}vv{z|zvtuwurttw}wv~|x~}}|zwx}~woqxzxwzw}|{|{xnku|~}~~yxtnqvuy}zwuvxxvutx}|}~}}{vy|}~~~}wrx~|tt}tsz||||{yxwxyyumoy}~~~~|vtzzz{xuuwwvrs|zu|zz~}~}|yx}}}~}{qovx|}vzx|}{{{|zrlsx{|xuoqutv}~|ywx{|wqv}~~~{uwz~}~~{|xrwz{yu|wvz|||}|zxwxyzumpwy}~}~ztsxwv||ywy|zqq}yv~yw~~~}zz{~~|{rqutxx{~z}}{{{|yqouvw}~~~ysortqsz|yy}ypv~~~ztx}wz~}~{z~wrvww~~y}{z|||}}}{yxxzzunrwuz~}~zsrwvty|yy~uozzw~{w{~|{{|{{}trust|}{~~}~~|{{|zsouvty~|unptrrw~|yzuq||uu}zx|~}~yy|zstwvy}~|}~||}~}{yxyzwqpvvt{~}}uoswtu{|xytr|xx}{}~~~}|~z}~{y{ystvtv~}{~~~~{zzzxqpwvsz}slpusu{}yzxs{|uu~}|}~|~~~{vwwsvyx{}y}}|}~~|zyxxvppwxuz}|~umqwwx~}yx}{sxyw}}}|~{{~~wuustyxyxz}~~|zyywqovyvw}z~xnnuwx}~{x{xw}}ws{}}}~~{~}}}~~xsrru|}~zw}|}~}{yxxvrov{yx~~~xz~zqovz{~{wyyx|{w~|{{}}z~~}}}}~{tqpt|}}{u}}~~|zyxvqov|yx}~~xx|{rovy{|yz{{|~~}xt|}{{}}z~~}||{z{|ztoov|v||}}{zxwupox}zy~}}wvzzrqxz|~{y{}|}}~zx|z{~|{~~}}}|z{}{unnvzu}}}|{zywtopy|yy}~|~wvzxrtxy||{~}~}~~~{ux|z{z|~}||{zyy{zslozyy}}}|{zywrnt|{y{~|zuvyvrvxx}~{|~}{}{x{z}}z~~}}}|zy{}ypkr|~}~w|~||||{zxuoox{xw{|}zvwxtuwvy~}|}~{ux}z{z|~}||||zxx{{ukmx}}{{~}}||{zwqnu{ywy~|{vuvttvtuz~{|~~zy|{~|{~~}|}}|zyz}zqjqz{{y}}|||{zytnpxzvvy~~||wuuuwvtv|{~~{vy}{{{}~}||||{xwy|wmktzz}}}||||{xrnt{xvx{~}~ytrsuxurv|}z}~{y|}~{~}||}}{xxz|wmluyz}}||{{{{zvpnvzwuw{}|{ursxzvtx~|{~~}ww~}}{}|{~~|{{|{ywvxzummuy{~||||zvppw{xwy|~{}}ysopw{vtx}{z~}~yz}~|{~~}{{|{zwvwzwonty{}{z{{yvoowzxwy|{||vppx~zvy~|z}|ww~~~}}{z}}{zyzzxvttwwqotx||{{{zwqov|zyz}}z}~}{wpls}~yy}}x|~}~zy~}y|~|zyzzywttuwtrux{}zyyywrot{{yz|~zz}ztnq}~|y{|}}yv||~|x{}{yxxxxvsrsuutwx{{zzzxtpu|}{{}{y}~}|{ytmo{}~xy}|{y~~|x{}|zxxxxvtsstuvyyz{yyywrou||z{}~|x|~}{voq|y{}{}}xw~||zwz|{xwwwvusrrstx{zz|zyywrqx~|{|~|x}~~|{{ytnq|}x{~{}}yz}}yx{|{yxxxwusrrrtz}zz~{yxxuprz}zy{}~{y~}}ztou{z}{}~zv{{{|vx{{ywwwvusrqqqu||x{{zyxsqv}|z{}~{{~~}{{zvpow~y||{~~yy|~yx{}{yxxxwutsqpry~yw|}zyxtprz{xxz}~~~z~~}|ztpt{||{|~yv||{{vy|{yxxwwutsqoou|{vw}{ywrqx|zxy|~}|}|{zuppuz}{~}{{{~z{wz|~~}{{xxxwtsrlnnnnqqt|~xxy||~xvwwvvww|~smqvwunomlkmnotv~~|}{~zwrqx~xtty}{~{suuutvvuz{x|zzx|x|zyvvssuuyvz}yz{~wssvuwsrxskq|y{zlmy|urqvz~|~x~ystv{xttz{|zsxyns|vtvvwwvs{||y{}yplvqovmhhgklkfhmtvt{|~zlknuz}yuwtwkqrp~x{zznmnow}yqrrv|szrx{}{tyu~wqtpuut}w}tmnl||yuvxtx{uyxtxztorspvoxsxyuyxrr|~z|{zxqqz||}||xzoqsqjqsptzv~|}{~{rvysz|z{~~{wstqltvyx}{wt|uuwtlu~zz~ztwz}|wy}ssw~y|uuyuy~z|~to{vty{~~wx|suu{{~utz}vvzsqttqxwrmssnm~|~~~}umt|~~{}|vlnpkfqyssz{y{wutxu}}~}{}uwzsstlrwx{|xv{x{}yquvoszzswy}|~{~vsvyx|ytwv{vx}vrtlmv~{~{{wxzrz{yquxrmx}trurpxvsrzvvyyt~~}|~~xnnusp}{}wrxvsutmr}~~y}{vttyxzv{{~|}~uq}{ttztv{zyw}{ztrw{uuxvtzyw}x~wu}ssvryzu}|}~|vxyqnstw|yxvxrv{yvx~zzztnz~yv}wsryxu{yw|{|~|{zsszvx~}z|w{ztzvtuztx}}}|~zz{pxwvpz|z|~|~yxzqquvqttw~}zqwyqnz}srvtv~||rz{v~~|}~}xy{|y|{qjtwmnuw~yz|xuz|tzwuvyqsxxsvqwyvwsw~~}|~|~z}~{{tqtupxxuw}y|x{{urtxxzzzs~}~|xnr~}wr}}~|}y}x}{}zws{{zx{u}|}~xv~}{{x|z}yzs{vsuvpmv}oxy{{}}zsio{yu~}|zz~rx}szyxwxvw}twp}wrqtypy|~}}v|yyumvnuuxyxx}vq}tv~v}vt|}~|{~v|}~}~~~v~{xq}uotmfpvz{|{yvv}xyrw~{w}}~xwqsvwu{u~y{|}}|{uzzsxtjyw}|xx|vzxztwyqzsvvop|ss|{z|y}{z~|yyvputmgtpn~z}|~yx~{{|y}}ty~s}}y~||~~}~{xz|~vtru|tuv{~|xyyxzz|z}}{}u~vwov}twwpx|~z}~|{}~{xvow}w}}|w{zvw}}uyy~ywxyx|yt{qvwq|{y~}|~|xwultxmmpmu|}z~}|}{{y~~yv}{wxxz~z|~{|}{y|~}wxyrtxooqxz}tzuttyz{{~us{}}xx~wvuw{|~~}~{~z~{vhsyr{|}|zxzxz|sy|wv{rn~zqvov{yy{}~|{vx}uqrpft~rx{~{}{~|y~~w{~ywzzswty~w~y||~}|{{xrxwwpqywyz{yyys{}~~y~~ww|wuwsyvqz~~|z{z~zqpzyx{yv|}{zw|||xx}zu{zq{~stqsz{u}}z|~yw}tnqqfrvopqw}|y}yz}|{}~{}ty}{w~|y}{|y}}|}|yxvxqvpqwuurz{{~|x~}w}{|{w~xtwuzvtwu}|}~~||~~ux~txvsqzxz~{}u}~xvxsr~zuuovzuz~}~x~~}y}~ytupmxsgkkt{x|y|~}yy~~rwyuv|x{~|zz{y~{z|xxxvztvqsyvy{wz||zovt{zv|z~{y}x|}v{xst|}}yqhonknqx|w}}}rr}wnrpu|y~}vzvx~y}{||{~~}v{ljjuwsm{u{yruyzyrsvsmx{qx}}~~}}y|}y}u{xyyy|ws}~}o}}}zy~|yv}yxuyztsq}z~|y{y|x~}{|uyqwuiklw{vy|}w||uuw|vz|uzt{{~{w|~}{z}z}}qq}wxprwms}twzz}{y}|xvytrulqlw~zvsz}z|z~zx~{w}v{{rmvxzyxs~|~~zx}~|}{x~tuxrxzxvxz~w|{y|yyzrzuymwxt{vns~}|||~vwyytt{ytzxvv~||~}{wyyzzxqoxzoqpzwzuuy|z|y}||z}{owvy~zut|~x|{}zy}ytyztkp|qltvov~~yx|yyw|{zssu|wyz}~~y}z~|~}wzuz{rptvpstru~y}{y|r|}tu{sz}xu~y|}}|w~y|xtuxsuxsqxvoxuv{y{~{}y}yutywyz}u{y}|~t}|u|yrz|xu|xuytkr~wszz}{}}|xv|zvu~zrr}w|zz{{~{||tx|xsspvqsppu|~|z}{w}~q}}x|{wu}|v~|{uy}ux|wms{pnrqirzy}||{{zytsyvvxy{xx~{xx{zyvs|sqsrptrpu~}}xwvvzrv~yw|{|xu~y~xz|zwxxvxwjtssnw|ts~~{{{y|xx||wzsy}{}y|~}xzvyvv}wx}z{vnt|uowzxw||~w|}{u{wnvvrtsu|~}|zx}}wytuxsuoosupu{||}}wz|~{yxtyyxw~{z{~zyzruvppnjrvqpy|{zzzuvtvosxtplnlkuzwszvvzzv}}}~|z}ywxthnqxuru||wuwzshuy}t}}~{rpust}twotqv~{~{|y}|tpv{tprzyqm{zo~sxx{vpqzzpv~qv{|~{y~ztw~}{yjp|{|~z~yvtt}{yx{zytxtsz~tpy}||{|}{kxvnp}sfr}uwwp{t{~{~x~}unrl}|{|rrtkptrjpgyxlmmplrktrlvuxjq}~z|x{uy|y}{ny|~tvs|x||}~zv{}tqrstjjls}{zzqqv{osj}{kowunvpvtzwuzpy~{{z{wzrtuv{zzvwhv}xxswt{~wrvxynjl{|~{wxunlt|omhzwclupjqlnrynny~unx{xx{z~w~oy~z|}vw||z{}sjouxmjh{}|~~}upvwnoz~jozxqwsqwtpzzt~v~{||}||ty|ux~~sv~}kq{{v{{zt}{{lpw{qpizx|xz{rlp}xhltzoestlrqkn~ujszxq|{~z}~zz{w~wr}~|||s}{}xqw{jfmuqonp{}ztq{si{zylpxqxyro~tu|}v}{y~|}|y}}}vty~{~zsuymwx{x{|y~uvrimwvrtq{tvyslw{sbwwroiqmsuojvspvxryx}~{|y}ywu{{~y~x||}~{zpmxpegqqqtqxxyp{|zhzsvmspy{uny|vzzu}z~||}sy~vux~}vr~{txwyw|u||}srzrklrsuvvqv|tnxwtexzlrlklvwpkvysutq|y{}u}{{}|x}~{{{z|t|z~~{wmntmhinnttxsvt}zvn{oxpmt}ztp}~yyuvy}}y|wpz|uxx~}|uv|x~vxs|wq}ypvtpmnorwv~{q}owwupp~pltkiuytnp|}zvsnw}v{xvv}|}y|zyw}tv~}~w~~xpopnmjjjsrx}wzw}yxv}pvvkt~{vq{}xru{y|||~~~yow}wyx{wxyzwwq{|vp}|~~xsuqrpmkqtu}{y~tzwttw{slvljxxunsz}}xpmy|uxyvu~|~{}z|vwztv}z{t}|yqqnlplhhqpwz}}{}xx}}}urzmt~{wsz~yps}xz~{}~{ps||yzw|{{wz|xox{vq}}}{|y~zuunqtpimsr}z|~w{xuu}xwqovktxvrqxy}tkszz|z}|tw~~~|~x{r||wt||xw~u{xurphnqmelpr|y|zx{|zwryr{z{uw|}wnx{~}y}{~|wrszy}z{||}swoyxut}{y{y|zxvrjpvriorv|~}z~xuxysvntswuwrtyxvlt~{}y{y}|vuz|w|rzywwy{}zyvutsrofjqqhmpu{}|x{u{tt{}xyvx}z|qv}|vy|{}zurtv~~|~~uz~puvvv{}z}xuuutjirwpost{}x~{vwtswnu~utts{wy~rp{~}~ztv~}~zwuw|zxvxwxy}~zz}zzwppprjdjsqnsqz{z~t{vs}wwu~{{yt{~yyzv|}{~{wvsry~~}zvxtutv}|~~z}z}sqrungluvtvs}vz}yw~quwn}stq{zx{xsy}~v|xzz}}z{xtz~z}wwux~~zz|szt{omnqjehpttvrx}}|vw|sxvu|{~{x}v~|y{x}}|~ywxvqx}~}yz~}zwtsw}z{t{u~soqtlhltvzxv~tz|z{~tsys}vqt}yyz|xy|~}{u}{||x}zz{xs~{|zuu{|y}wyqtsyolpohfjqtzsy|x~uy{{yr|||}|{~xx|}|||v|}{wxytr}}}|z{~zwsu}}{}z{|vzsyzqpsojjos{{uux||}yrxz}{rr|{zyyx|~~}{tyzy~yw~yy{zt{}{}|vu{{}x|}v{qxqxsmonhfint{sy}~~x~xx~{s}~}|{z}vyx|y~uy~zwxysty{z~{||xtv{z~zz|v{vuzsqrmjjmq|yv|wx{~|uw~|st|{{xww~}xuwxw||t{yxzzuzy|~~xv{{z|~w}{szzrsvpomighkr{tz{|y|~~x|~t|~~|zx|vxv}u}zt{|wwyvuxv{|{|||wv}}yz}~~z{x||utysrnkjkmw}w{xy||u{y~~sz||zvt{~~{txs~t|zt{|xx{xzyy|~}~yy~z{{~{y|wwwxspvrojhhikvzxz{{~y~|x~~~|xv}{uys~uz|txzwwywyvvy|y|}yx~|xyz|}|~z{xxxpwwsmkklmw|||zxz~yy}zw{{|zvry~ytxq{wv|vv~|xx{z}zx|~z}}{~zy~|x|{}{~wyvrwnpvskhhjkszz~~{{z{}~~}ytx|uysw|uyztz{xwyy||u}||zx|}{~~zxz~u}}{z|qwvnvyqkkmms||{x{{}{z~}{{yss}}twts~~yt{xw{zyz{~x}~}x|~{xy~|w{~{}~~{|yv{ppumoxrjiklpyyz|~z~}{vt}uwus}}{sx{vxxxyz}x}}|~|vy|~zxx{z{y}|~{xtpvsoywnkmos{z~yz}u|{yss{~twtr{{|tv|xwyyz|{~}wz}zxx|z{z|{~|}~x|ww|qmsrmvuljlmsyy}~u~xvrmnw}uzuy{|}~s{~{~~}}|tysosx}~zxy~{|}z}zv|z}xuuv{{}}~uzsoy{zv|xtpu}}z}x~tw}}xss|wyzxwyrsv|}yyz}}~~|}}|zy~|~vtuw|wvmn||xzsr{ls~{wsoov~xzww}y|z|~}}tzy~||{|y~zux|||zy~{rrxsuxrmmntqs}}~|}|yx{u~yurqu{w}yw{}~ttwuz{~vpv|rrrllou}}wstv{w~}zx|~||}|~zxx|~z~uqnox}su~}vplmtz|vxrv|y}y||vy||{v{ux~|z{zwx|zz|{xxz|~wywpnotor}z}~{{zwv}~{y}~zwtrt|}z~yv{}|uvvpzsvwttmlms|~xssu~s}|~{y}~zxw~~zy{~yxtqos{}x{|tnmrx|xzts|yy~yxuy|w|xs{x}wwy||z|}{wtvxyxspssnyz{~|zxuw}}y{~}zxvttw|}wx~~z}~|tzsqzuzyysmmnt~~xttx{r|}{{yz~~{vv~}~}z~}y|wtqruz~~{vootx{~}z|tu|xx|}{{tv{}w~ytz|~}xwy~}~|zy{}{xst}vzxtusnxxy~{wtv{xvv~~xvuvy|}}zy~zwz~|tzwrx~y}}wonnr{|vuw~z{xu{wvx|~yt~{}x{z{~wtrsw{}||~upswz{|z~zt|zwx|~z}{su{~w|~wy}{xx{~yuux{|{yt||uz{xxptzv|{vuw|uv|v|xvuwz~~}{~z|xtx|tw{ux}{tpoqw{ww}|w}xyxrtz~|v{z~y~~ywzvsrsx}~~~||~{ttxzzzx~~v||wwy|x|xsw}w{yz}~~~yx{zqqvz||zu|xx}}zqvzu{|wuwz|{{z~|~~yy~zruxryzuy||ysqsyst|vpxtor{|w|z}z}}z{}}yvsssuz|{y{}||~}xnospmioqp{xtxy|~~zz~xzwnrx||zuu{x~}xqmo{vpihjlqvwsru|x~{wx}wxsw}vx{}~~{riqtsjmsutqloon|~y~y|zvvx}}vuux|}z{}~tmjnxzuqytoqqrtvy}~xvx}yx|~uy{|ww||vwzuvnklotz{wvvwywqmov}{u{zy~~|yvw||v~xz{{|~{yokpnyz|{tprkly|}~~{y{zzzwvwy|xwx{~|ww|~volms||{zuvtrrruy}}xu{~zy|uxwv~z~}wxyr|{sommos{|{{}~{uons|}{|vy~vz}z~|wvx}~x~{{||{{}~ulplo|{uwqkuyz|~|z~z~|z|~ywvvwyxy|{wx~~~uomou{}{zzzwtqquz}~{uy~}~~{{~zvysw||y}vtztpnmnq~~}|}wrpu|z{yxz}uw{z~~{wvx|~w{}~}|z{snpjo{}y{snvxy{~|y{}|}y{}ywvutv~zx|}yy~~~|vqnpty|}}}{wsqsx|}{wy~~y}~}~{vyrt~~~}{zv{uronmoz|~|wtu{yy|x{{}{tz|x}}y~yvwz}z{|}|{}~~yoqmlv{}zqvzxy|{x{|z}z|~~{ywutszyx}~|~~x}{tppsw}}~|xsruy||yx~{}|w|~|}wyvqy|~~~}{x}}zwsqonnu}{xxzzv~~x{|z{~zv}~y{}v~{xwy{~||||{yyrjntwtkjtwtuww}x}~~x|~yzxvuwrot|}}~~}|ulw~~~~~~~zy~{z~z}}{|~zx{~x|}spy|xvwxz{{~|{ustuvuspv|xwvzwty~|~~xx~}}z|z||w|wrw~}~wsunlrvyvnmw{wtux{x|}}|zp|~zy}{|z~vtz~~yvutstuvsrstysqw{}|yvvx|}}|x~yqu{|~wx~||so|}}ytopyxuvpqusrw{|zz{~zw~~{~ywzzvy||z|uouwrtvwvojpywqps{wu}}yy|}z}|qz}|z{~}|~xtw{{|xwwywrou{roty{zwttvyzz}x~}tt}{}xxz{~uszyzzuw}xxyqpuutwyzyz|}wv}zy~}xvz}xw{|}zzy{{qt|}wxyywrmoxysnszuu}|yxz~}{|~uy|{}~|{|}{~wuxx}}zz{|vms~unrwyywtstvwx{x|ysy~~|x||y~|vxvx||{|y~xprxxwxxyz|}ytzzw{~~zuv|~xvy{}vy}~yrv~~}|{zxtprzzrovwsz~{xx{~~|{}~zzzwz~~z|zy~wsuy||~~vlwuprwyxvtttuvv}|y||~zux~{{}z}{{wrw||{{sqy|zwwxz}~xt{{zz{}~y|z{~{owzstwz|~}~|{yrqy~~|zywv|~~tjumqw|~|{zwv{yrx|~~|uqsywpovtks}zommnopppoou|xtwvwzyw|zxy~~~||x~xxuo}{rtuqmnqtwtnrrmpuxvspry}xru}{~~~{tqnjkpmlminwxvtuvxyzzzzwrwwpw~~{z||||wwyuliryty}}vqwyxutvyzzzwspt|}}z{~{vw|}~|}|||{srpilvphq|zux~z}|{ws{{tnlow|yxzqsqjgejswtty|}}{{~|y}~w|~xtty}~||}|w|~ru|~}~{unju|rkilld`jrpw~}~|yywsokhip~}vuz|yy~xuv|rfjqi`dntwwy{~~yzzsrvyvuzwsx~zvtuz|vs}~zuqos{rprsonsx||zz|ztosz~vu~{wsstw{wszty~trrmox~zvvwummttx~|||xy}|yusqpnljjp}~~{}{{}xtrru{yy|qmqxzyyz{|{z~~|~z~xuwxspsokpw}~}}{~{yvtqmknz}{ttxz{yuy|{}}yst}~sowzyvutuw{~|ww|~}~~wwunnu}~}zqnnlr{~~y|vt{|xttttsqnmt~~}}|y~}~{xuuw|z|{soqx{zxxz{{}~|}{}~{||wvysmotxzzzzz||zxupkksyx~}wy|~{vz}||z{yv{u{}|ywurpqu|~y{~~vvsjgjqx~ytot|}||~vz~xsqppnkinx{||{~}{xwvuux}~wqquwvvwy{}}}zwxvuzyrpruwy{}~~~zw~{zzyupmpvvx{vz{y}}{|~~zts}zz~~}{ywtstx}{{{{vxtkjlpuy}wqy}yyz{urrrpnlpvuv}{xvtqqsxyuwyyxwwwx~|ytrwunmorux|~v~~zusrpmkovuwzw|zw}}~~{wz~zy{zyxxwvuvy~~~xx}xsvunlnquy}|~|ps|}zuw}~ysqrrporxxv|~zxwutrsv{}xy|}|{zz~}~xruxrnnprtwz~~y}wronkikrtry}{|~}{~}}~}{|z{~|wvuutstw|{{wnormjmquy}zs{~}yuw{ztomnoosz|x|z|}xvvvvuvx|~yvy|}|{{}z~zsvzuqrsuvx|}~y~{|{tpomlouusz}~~|~~|{|}~~~|y~zxxxwvvx{}~~{~xprsmkmoqtx~}x}}|xx|}xroonosyvt{~y~wtsssrsv{{vx{|zy{|urvuppqrsux}~}|{{~}vpmkjlruqs|}}}~~vv}xwxxwwwy|~{|~||z~}srtnklmnosx}}}ywy}{vqpoptyuqv|~~w~zvtsrqqruxxy|{~}}}xtwtooooopsx}|z}~yrmkilqpkow|~}~uv~xvvvuuuxzzy~{}~|ssrmjklmmpv{~}zvvz{vqooqwzurw|~~}tz}xvvutssuvuv{}~}||yzwrrrrpprvz}~}z{~~xrnmotslmsx{~~~~~zv{yyxwwwxwtw~~{~{xvplllkjkoty}}yy|}xspptyvqswz|}{w|wusrrqrsrqw{|~{zxrpqqpoorvz|}~ywz{wplkotpkntwy}}yv}{xxwwwwwurx}|~|}~~}zyunkkkkjjnrwz}~yvx|zupptyuprwxz}~{w{xtrqpqqrpov~~}}|}zsooppooquy|~{vtwwslilqpkmswz~}wy~~ywvwwyzxuw{|~zxwzxqjjkllmosx|~~|xtvzzuqrxytsx{|~~xxz~~xtrrrtutrs~|~~{{zrpqrqqruxz|~ztsvwrmlqrmmswy|||~zwwwyyxtu~~~~z{}wuy|ulijkklnrvz}|wuxzxsswxsswz{}zzz{}~ztqpqstsps}}|xw~zropqpqrtwy{~~~}ysprusnnqpkmsvx{}~~~zwvwxxvru~~|}||{srz|skiijjkmqtx{{vtwyxtvxtptxyz||{|zy|}yspoqrronw|uxvpooppqsuxz}~~~~{vqortqoqpklquvy|}}~~ywxyyvru}}|}~z}|tqx}vnkjjjkmpruy}wtuyzyzzuruyyz{~|}~{y||wsqrrqmmu|{z|}vzytrqppqrtuw{~}~}ysqsuutupklqssux}|yxyxtpt||yy{}~{}vrx}xqljiiikmoqu{~{vux{||{tqtxxxy|}~}~zz}~zurqqokkrxwvx|~xx|wsqpppqrstw}}z~{vqoruwwskjnqrsux|~~{yxxupqx{xwx{|~}{styyvplihhiklnqv}}~zutw{~~xqquwwxy|}~|}yx{|zurqpmjluxvvy|yy}~|xtqooprstuy||~~~}zvqnotyyrkkorstvz}}~zyxuqsz|ywy{}~~{utvwvsokiijlnorv}}}}xtuz|trvxyyz|~y~|yvwz|{wvutpry}ywxz|}~z||z|}|zyz{{zyz}zw|~uzzy{~~}}|zwsru}yvy|||||~~{}~|{~}~tq~|xxyz|~|xuvvvxyvtrstuvvx|~|z}~{yz~~yswyusssuy{wsuz{zwuvz||yxvsrw|zwwxz{zyyy{}}zyz}~xy{xtrrrssrqollqy{uqruwxyz|}~~~{xz~zvrpqtz~|{zyxxwurqrpnpsrpooprsuwz|zxz}~~}wrrvxyz~{zzzurtwwvtrqtwxwusqrx{ywwxyyyxwx{~|{zxvvx{~|xutssrqpolmqxxtrtvwxz{|}~~~|yx{}zwspoqu{~|zyxvsrtspoqttrqqstuvy{{xx{}}}~zurtuuvy~~}|xttwxxvtrsuxywurrvyywwxxyyxwwx{}||zwuuwy{}zxwvutsqpoqvwuttuvwxy{{|||{yxz|}|}~|yvrqqswz|~|zxututqoqstsrrrstvxzywx{|||}~{wuutsstx~{xxyyxwusstwxvtrrvxwvvwxxxxwwxz}~~~|ywvvvwz~|zxwutsqqruvutuuvvwxyz{{{{yxz||{{{~~{xvsrsvwwz|ywvvurpprtsrrsstvxyywx{||||}}~~~zwwusrrtw}|{{zyxwustuwwussuxxwwwxyyyxxxy{~~}}{xvuuuvy~~|zxwutsstuuuvvvwwxyzz{{{zyy{{zzz{}}zxusrtuvvy}zxxxvsrrtuutttuvwyyxxy{{{{{{|}}|ywvtrrstw|~}}|{zxwuuvwxvttwxxwwwxxxxxwwxz}}|~~}|ywuttuvy|~|zyxwvvvuuvwwwwwxyzzzzzyxyzyyyz{}~|ywtrqruvvy|zzzxvtstuvvuuuvwxyxwxzzzzzz{|~~{xvusrqsux|~}|{zywvvwxxvvwxxwwxxxxxxwwwy|~~~}|{yvtsstwz}~|zyxwwwvuuwxxxxxyyzzzzzyxyyyyz|~}|zwusqrtvxz~~|zzzxvutuvwwwvwwyzyxxzzzzyyz{}~{xvusrqsuy|~}|{zyxwwwxxwxyyxxxyyyxxxwwxz|~~|{zxvtsrsvy}~|{zyyyxwvxyzyyyyzzzzzyxxyyxxy{~~}{ywusqqsuwz~~}|{zxwvvwxxxxxxyzyxyyzzyyyyz|~|zwvusqqrux|}|{zyxxxxxxyyyxxxyyxxxxwwxz{}~~}{{ywusrrsux{~~}|{{zywwyzzyyyyzzzzyyxxyxwxy{}~}{zxvtsrrstvy~~|zyxwwxxyxxxyyyxxyzzyyyxyz|~}{ywvtrqqsux{}|{zyyyyyyzyyxxyyyyxxxxxyz{|~}||zywutsstuxz}~}}|zyyyzzzzzzzzzzzyyyyxxxxy{}~}{yxvtsssstvy}~|{zyyyyyyyyyzyyyzzzzyyyyyz{|~}|zywvtrqrsuwz~~}|{zzzzzzzyyyyyyyyxxxxyyyz|~~}|{yxvtssssuvy}~}{z{{{{{zzzzzzzyyyyyxwxxyz|~~}|zywvttsrrtvy|~}|{zz{zzzzzzyyzzzzyyyxxyzz{}~|{yxwusrqrstwz}}|{{{{{{zzyyyyyyyyxxxxxyz|}~}|{zywvtsrrstvy}~||||||{{zzzzzyyyyyxxwwxyz|~~}|{yxwutssrrtvy|~}|{{{{{{{zzyyzzzzyyxxxyyz{}~}{zyxvtsrrrsuwz}}||{||{{zzzzzyyyyyyyxxyz|}}}|{zxwutsrrstvy|~}}|||||{{{{zzzyzyyxxxxyz|~~}|{yxvutssrrtvy{~}}||||||{{zzzzzzyyyxxxyz{}~~|{zxwvtsrrrstwz}~}||}||{{zzzzzyyyxxxxxy{}~}|{zyxvutsrrstvy|~~}}}}}||{{{zzyyyyxxxxyz|}~}|{zywvutsrrrsux{~~}}}}|||{{zzzzzyyyxxxyz{}~}|zyxwvtsrqrstwy|~}}}}}|{{{zzzyyyxxxxxy{|~~|{zyxwvussrrstvx{~~}}}}||{{{zzzyyxxxxyz{}~}|{zyxwvutsrrrsux{~~~}}}}||{{{zzzyyyxxxyz{}~}|{zxwvutsrrrstwy|~~~~}||{{{zzzyyyyxxxy{|~~}|{zyxwvtssrrstvx{~~~~}}||{{zzzyyxxxxyz{}~}|{zyxwvutsrrrtuxz}~~~~}||{{{{zzyyxxxyy{|~~~}|zyxwvutsrrrstvy{~}}||{{{zzzyyyxxyy{|}~}|{{zywvutssrrstvx{~~~}{|y|{|}zzvwvvxx}~~}vzvswywxwrmjupx{x}}~z~|wotzxztuzrv{vu~vqvuqqlssrmxxuou~zxzy}~}xv|}~|xtzz{|{}}~||ptzrlmpomkqstoq{~~y{zvvqzxwvz~}~{}z{}y}wz{xpnwtjqrsspu~}|{|}z~{~sv|o|twt}y{v{z{rt~}~qnqpwqmysw}}{~s}wuxzvssy}|qz~~~ysx||{xmt}zzz}{rqlr}vwy||rp}|q~fhqvyuw}x}~wz{vuuwt~s}y|~qw}msyr||~zv{z~|hozupntx}kvw|vq}}yy}wvwwu|}{uzx~~z{|rv}~xzz}yw~v~y{pxlqu}{owwmv}hrutux}{y|z}}{yv~}vztz~x}w{}~|{|xrsw{~yuynwyqyqhw{i}wgppp{{|z|~|~uyyu~y~y~xw{~sept{sm|xzxpjxqklkuo}yyv}}u~~w{vx{}{|s~y~~|}xnkxs}|mtxwtxroylwlrns~zy}v{{}{uyw{~x~ur~y{}ystitqv~zrzuxyvqrju~pussu}{x~}r~~|~r|vw{}||}uz{x|{}}}}trovwr|rzrrvuvsop|swwnr{~}}q~}~|trwuz}}~~v{v~x|{}voorww{~vzxrxqwuphzut|rrw|}~~vu}v~}nwqz|{|}}{yx{}}plq|vzvz}qtruxujxvo|rvx{|yow~{n{vrw}z~zxz{~~}tikxtz}{xvvstuuj{ylzuwwyx|~nyy|rzxpv}~|||{}{|}}~~xklwpx|wwyxstuozyjutxx{x~|n|y|~rz|quz}}|}v|{z|~{}zkjsow~w{|vsqro{{jvsty{yy{}qz|s{stx{}|v|{{{zz}{nkqmsw~|}yvqsmy|kspvx|{z{}q}~~r||tsww~zy|~y}y{y{|pitop}y~{zwrpnxotqvw{{z}}~q}~{~~uy{uus|wx}ywy|{|z{qkqnny|~}~|zvpouqpswvx}|||}p|{z~~tt|uwt|x~yxw|~|~zxzripqnv}yyprs~vqvuxu{{||~tv}}z|}{r|vwsy~y|}u}|~~{yxzvlkpos|~yzurs|znuu{uz}z|xo|}{}~rzxtvwx|zzz~|zxvyzngnpr|}ywrswsrryzvzz{|rxz~}|{yu{tus~|~~u}}}zzvv{whkoqw~zzupu{nru|wz{{zxp|{{{}syxsvw{~}w{}|{~vtv{ninns~{wprywpsx{vz}{y~twz}}}y}zq{wvt}}w{}~~x~{tqvylkoqw~|{vpu|rruzxy}}zzzq~z}|~z}tuzwwv}{v~{}~{xvqpxtinqu}}~}ysrw|rsxzvz}}y|wr{y}}|{zqxyxv~|zz|~t{zrpszmjqtx}|xqu{vrv{wy{}|zyp|w||}z|vtxwyx~}w||yu|rqpxsiosy~~}ztsz}qt|{vz}}{{styz|{z{yrwvxw~x|~}~qyupovwkmrwz}}vrz~ury}wy|~{zvr~w||zy{tuwyx|~{w}z~uvxoorypknuz|~ysxyqw~wx|}{zyq{w{|{z{uuxwxyu}{wszonpzrjmsy}{tw|rv}yx{}{yyrywy~|x{wuxxyxu~}~|zrypnnytklqy|~}uu~st}ywz~|zyqxyx~~yzwtwvyyw}~}~{{ryqnoxtkmpw{}vvtu~zwz}yxrx~yx~~y{xtvwyx~w~}~{{qyrooxtklqwy~vv~uv~xwz}ywry~zv}z{wtuwxy}w~|{{ryrpoxuklovy~xwvvyxy~yxrw~zv|z{xtvwwy~~x}~}~z}ryronxvkknvv{wxu~zxx~zxru}{v{zzzvuvxx}y{{~x~swroovxlkluu|w{t~{xx|zxst||wy{zzwuuxx~{|yyx}utunnrzokltt~~w~t{~xyz}ytt|~|yw}y{xutxx{|w~z~zzyrwoooytlkqvxzzwxxyyzvsxz|u|z{yvuvxz~~y|z}v|rvrnnuyolnwu~xu~|yy||xsu}|{xv}zzwuuxy}~x~y~xywrvnnpytmltwz{{yzyzyzurxy{t|yzywtvy|y{~z|u{suqmntypnoxvyw~}yy{}xrt{|yzs}z{yvty{x~z}|~yvyqtnmowwpotzy~x~xzzx~{vrvx|vv{zzyuvz}|x}y|~{~uxtrrmmqztqpyz{}y}~xzy~yttyx|s}z{ywux{x}~{z{|}ytwqsnmnwyrqu|{~yyyzx~|wrw~x{wt{zzyvvz~|y}x~{}z|tvtrqlns{vrs|z{{~}yzz~ystz|w|q~~yzzxuy|x~~~y{|z{{vtursmmpyxsry|}~|~|y{xztsxu}sxz{{yux|y{|{y~y|zxsvssnmovzusv}z{|y{x~|vrw}v{xs{{{zvv{{z{}x~~y}~yysussomntzvsu|y|}zzy|}wrv{xzzr}{{{wv{|z|x}~z|~xyttstpmnszwst|y}~{zz{~xrv{yx|q~{{{xuy~}y}x|~~z|~yyutttpmnszwst{x~|{z{~xrv{yx|q}{|{wty~}z}x{~~z|~yxuttupmnsywstzw~{|z|xrw|xy|q}{{{wty~}z|~x{}}z|~xwvtuvpmosxwstyv||z{xsv{yx}q~~{|{xty}~~z~x{}}z}~ywysopsyytt{x|{{z|w|~~{uv}|zyyxz{{~~{~y{{xrxxwssxsnnqvvsrxv~yvzzvtvs~~wqsyvuy|}|zsst{~}xnp~umfkidehorpnstu{~yyx~~zsptz}stuvvy{ww{zttsrt}~}uxzrqrw|{y{~||}xproq{wqlqv~vu{p{}zzysmpvwsonoxyrumggjoqonspv}|~~|{{~}xmkozyxwvw}yzuvy}urqrsw~~v{|tsuz~~|~~}{{{vwrt|xrmrv}vv{q|}zzysnqy|pnlor{|u{slkmrtrqurx|}}{|{~{}zuljq}|yxxwy{vv~~{}|vppqtw|wyvtuz~{x{zwvtr{{tnqu{zs|sw~zzyvorz}{nkkot|szwnmnsvvtwuv~{~~}{}zy{xunkr~yxxvz|wv}~}{{}vopqtyzxxxvw{ywz{wwus||uorv{zt|tw}zzyvps|{ymkkpvs|ypopuxxwyuxz}~{|{~y}zwtmmv}yxwwz{vw~}||z}sopquz}{v{xwx}~vyy}wytv}{tptw|xv{tz|{zytqv~{{skklqx~|vwqqtwyyyyt~~{|~}~|{|}{{~{ywrmp{|zxv}||yvz}z~{|ypporv~zv~xy|}xwzx{zxt{}xrrvz{vzww|{{{wrs{~|{xmkjns|w~uttxz{yztz}|}{~z||{~}z~|zxtnnv|zw|~}{wy|||{{{qqopsz{vzz{|zwyu|{u{~yssvz|wzxw||||ysrx}||ynljkpxzyvvy{|zzsz|{||~x|||~|~}|zunmt||~|y~~{xz|}~}~|}{zyyz}~|zsx|x~|{t|wnt}sokkryw~|}}{zonllov}~~}{vrzomrms{|}~}|y{zros{z~{usymfdcflsvsxv~}~|~}zz|wyrv~uoq~{pijppr}vz|{yx{~}~y~~zrolmr{~xotuy{yqmuvx{}|{{{|}~}ywy|uty||}|xnux~yskijostp|}r{z|~~v~{vzz~~|u}|{yvrnqy{tuwsy}t}z~}xwv|z{xz~~yuqopw~xv|vpnxy|xw}|}~|z|}zz{{{xv||vv|}{wvzuoy}|wqnotwvr~|s|{}}v~zuzz~|u~{xvusrnt}}xxzv|~u}z~}ywv}zy}xz}yurprxwtzupnz}~yw~~~}z{}yyyyzxu}}xw}{utwwpy|xrppuxxs|s~||~~u{~zvw}~}~~v}{wtsqsqtyx{x{xy{{zxvyywz{x}{vtqsywqwtroy|v~}{y}yxxxyzu|~zy~~zsrvxs{}ytqqvyyt{u}}}~~uz}yww}}x~zusqqtsvzz|x|xy{z~zwvz~ywy{x|zvustzuqwtsq||x~zy~|xwvvyzu~{{~~xrrwxt~}ytrsxzyu}u}}~{t{{xvx}}}~x~xtrprvsz|||xv|y{~ywv~}|xw{y{{ywusv}}qtwsrsy}~x{~zwvvw{wv~{}~}|urtyvv}ytsvzzvxxy~}~ux}xxt}{~z}zvsqqvtr}~y}yx|y~{xv{~~yxz~{wz|ywtuztsxsspy~|yz~~{xwvvzyr}}}~xtuyws~~}wuwzzwx{w}}vw}ywsyz|{||xusrvto~z}|~}}}wuv{xr{}u{zwsoloty~yz|{w|~zvwy|}~xy||zxwxy~{t|||wy}~~}}|}zqrt{~{zz|~uv}xwsw|wx|}xw|zx|~~~|{{|xyuwwwwupns{xy|xwy~}v|w|~{ytrstux}}|~ytv~yxpptutrrrsxxnw||yxrt|{~~wspor|{xxz|{sqyvtpowuswz}xrvvwz|zqnwxz}vt{zw{xuvz|vu~xt~}ywrnnqtw{~|uutsu|~uvwwtsrrtzrn||{}ywspy}zyrmmprw~}zrvyutorxssxz~~ssvwy}yytmqzy}y{zz|yvx||uxvv{yvrnorux~{~{rtstx~wxxwutrrv{pp|{|xvqq|~|}wplmptz~zrwyutprytswy~}rsvwzy|wrls||z{zz}ywx|}wxwv~zwuqnnrvz{}~zprsu{xxxxvtssv|so~{~|xvrq|~zunklqw}}~|svzvurqywsuw|}squx|{{uqmq{z|y}{xx{~zw{u|{wuqnnsx|~|~{}~ynpsw}xwxxvutsv|vo}|}~{xvrq}|xsmjlry~|tv{vvsqyxstv{|spvy~{~ytqmt||{z}|yy|{x{u|zvtqnnty~|}zz|vmptyxxxxwuttw}up{}~}{xurs}yvqkjnu{{ty{vwsszwrtw|zqrwzy|wsomy|z|~{z{~yzxw{wusompu{{zxy}|qnru{~yyyxwvtu{}pu~{}~|zwtpx|{wsnjkqw}ww|xwvqvztru{}tqux|||}yupls}|~{{~|x~{vzxutqnosw|{}{wx|~tnqtx~|{zzywvv{~sr{|}|{xupt~~|vvvwy|~zt}xvqtzutxqttwyzzz{|{|tkzy|~znv|nlkjmqsuy}~zz||x{}sxqppponpvyop{|{tn{|||{tz|rkffilouz|{sz}ystzwtxzp~zxwvuv|vt}xqkt~~tpor|tnlnpquxx}z~|~z|~|s~yvtqptyqlyyy|}{xtov~xtvw|tpopqtxy~|vwzv{zuv}}}{qy~{y|{s|}~~|xsmo~~smpqzytsttvyx{}{}{y~}}}~vv~zwtuzxnr~}yz{{zvqp}|}stv|{trqrtxyz~zv}xw}yuy~}|~wq}{{wt~|}|zvqluzpmrv~yuuuvxzx}{~|zy{}}{}}uz~{wux}xnu~yz{{yuqs|yruyztrrsuyz{~zxyx}zvz~~{y|wt}{{xt~{{{yuqox}xpnu|~yuuvvy{y}}{~{y}{|~~~~{x{~y}~{ywx~{qtzyzzxvsu|yru}ytrstvz{z~}|{{w|}xy||xvz|x~|{|t|{zyxvtry~}{xrow~yvuvwy|y{||}y|{z}}|{yvx~~|zxz}ts|yyyxwvx~}}}ytw~yussuw{|z}~~~|x|~yy{~~}|zvu{|~|||u{zxxwvut{~}~{zxtr{}yvvvxz}y{~{{|x|yz{{zywuy~}{y{}tu{yyyyxwz~~|}~}{xty}yuttvy}|{~}{x~~yz|{}}{zxuv}~~}~yv~~ywwwvuv~}|zywsu}ywwxy}|x~z}zx~|xzzzyxvv|}{{ytzzxxyyxw~{}|zvu}}xvuvx|}y~~~y{{y~~z|}|zyvty|~~}vz{xwwvut{~|}{zxury|yxxy|}y|~~{{|x|}xyzzyxvuy~~}|ux{xxyxwu{~{}~|{vrx{xwwx|}y}~~}zz|y}~z{||{ywtw|z}~wy|xxxvtqx|~}{yupu~{zz{}~x|~}||{}y||xzzzyxvtw|y}|vy|yyyxury{|}{vpt}zyxz}}y|}{|z}y}}y{|{{zwuvzwyxy}yxxwspu}}~}{voq}}|{{~y{~}z~{~y{}wyzyyxwtvzxyxx~zyyyuqu}z~|xqp{|zzz}~zz}{}z}z{~yz|{zzxuuxxvzx~zxxwupq}{~|yrnw}||~|y}{{{||y~~xwyyxxwutwzw~|x{|yyywsr{z|~}zuos}{{|~x}|{}z~z}{xz{zyyvtuywyyzyxxwspu~{~|{wqp|~}}{y~}z~z|{z~|wwyxwwvttxzy{y||xxywst~z|~~}|zupv|{{}~x~~||}z~z}zwyzyxwutuzz|zz~xwwwtqw~z~~}|zxsr~}}}{y~}|z{|z}|vvwwvvuttx}}}y{}xxxxuu~zz~|}{{zwsw|{{|y|~~~y|||~{vwxwvvutu{~{y}yvvwvtx~z}}}}|{{zwu~}|}|x}~~~{y~}z||vtvvutttty~z{~xwxyxw~~{x~{~~|{z{zvx~|{{}y{~~y{|{}yuvwvuuttw}{y|yvvxwvz~}y|||~|{{{{yw}|}|x|~zx}}z{ztsuuttttv{}z{}xwyzxy}~zx|z}~|{zz{zw|~|||~~y}}}x||||wtvvutttuxzz~xvwxww~}~}y~{}~}|{{||xy}}~yz}|~xy~|z{vrtutstttw~|{}zwxyyw|~}~x{y{}}{zz{{xw~}|}zy}zz~~|}ytuvuttttv{|z|{vvwwuz~}y{{|~~|{{{{yv~{y|~~}zx}}{{xssutttttuz}||}xxyxvz}yyz{}}|{{{zwt}~}~|y}~}{y~}}ytuvvuutstx}}|||wvwvtx~z{{|}|{{zwt}|y|}{{y}~||wstuutttstw|~}~~yxxvtx~yzz{~~}|{zyurz|z~}||z~~}ytuwvuutssv{~}}~xwwurv~{z||~}|{zvrx}z}~|z~}y}}|xssuutttssuz~~zxxvsv~|y{{~~}|{{yvqu~y~~{~z|~zutvvuuutstx|~}{wwuss{~z~~{~~}||{xssz|}~{{zz}zurtutttsrsv|~~yxwusz~z{~z|~}||{zytq{|{~}{}z~}wsuvvuutssuz~}ywvurv~~}z|{~~~}|{{xswz~~|}{}yz}ysrtutttsrtx~~}yxwuu|~~y{}y{}}|{{zyus~{{}~}||y}|vrtuutttssv{~}ywwusw~}~}y~{z}}}|||{yuxy}{~~|~yy~}yrqstsssssuy~~~yxxvv}~}~zy}xz{|{{{{{xv}|y}|~}x{}wrrttssttuw|~}}{wwwvx}}~y{{y{|||||}|yzy{{|}yw|}yrprsrrstuvz~}zxxxw}~}}zx}}xxz{{{{|}{x~{y~}{}wy|vqqsssstuvy~~||{xxwvy~}|~~xzzxz{{{|}~~{|y{z|~xv{}wqoqrrrstvx|~}zyyxx}|}yx~{wxzzz{|}}{zzy|{{wz{spqsssttuwz~|}zxxww|}|||x|}xx{{}}|xyywuonmoqv}|x|}|~}urtsnomnppv{|}xy~vqo{~yz~|~yz{|~||y|}wqz}wvxuuusvzz|y}z}}uwwwvxyoz||zmt|{ts{~|y~yty{vx{||v}u||vxy{uu}}}}||woywuukmmrmjqvtz}~rmp}|}~}xxtxwzxxqnou|trwzwvu~yuwzxvyx{}{spsx~yywvxzwyu{zrstvyz|}{{pxz|~}suyv||qtutwu}|{}z}|~{tvstuu}~||tsuqtxzxuwnw{z|styzyzyztv{}z}x~{ww|uxsv~x|ww{~~~x}{y|x}{rtqn{vx|{|z}w{~{xozwrvu{|zxwwxuzuu{}|zzuutnt~z}{|{rxqptqsx}}}{zw}~||{{{zukpns|}y~vwxr}wyx}zuyxwtm{z~~|}|tumx{zpu}{zx{zx|xwwzyvy}~~~y~}vmrz||x}wuxvxuz~wxzuxvu}}}}|{~|qsptx~}|x}z{~~vw|uyzwyrwuw}|~{~x|zyyw~yvxqwwyz~z~||wwzrpvt~~|usrpps|||tvrq~vsqv}zz|v~{z~|}||xxmuumpu}~y~}{}x}vxyxwwzxvv|w}}|{y}}zwztxy~z}{uz{~z~{y{uvtqyxrx~~vtttrr~z|{x~}wr~~~z{|}{|ysxx}|~}z}yvkt{|{|{{~||{xy{|xuzuptqw||}zztxuy|ywvr|uuw{u}|{vs{|~~yzruznlkw{{}vxw|wwyz}{|}{xv{~{yw{y|uqpsvu|y|~ywys|tspyysw~~{}~}}~wswut{}~|zw}|xyz{yxwwv{~}~~z~osy|zzx|w}xv~{yt}srluyrx~~z}{}z|~}}xtl}wx}~{u}~{|ts|{{}rwwz~vupljqpnx~w~zv{w}}}||xzxvt|z|~~|wxxxkry~zy|{vst~txr}~}~z}yt}}{{~rttnopz~~{x|uxuvxyqswzs|~zxz{vy|xmu{{}|{zyv}xs|}tpu}zw{|~~~|yurpxswyw}|wwtvz|{{wz{w|}{~{vqvvuu|{|t}~~{{~{|vwy{}ys{ppou}{}}zw{yunqsyz|~|~~tzy~}{~}s{{{tz~}~}vtnvvtprv}yxuvy~y}|{x}zsvy}v|z{{|y{tpw{~|~x{|tz~vuxrrpx~{}|y~}xqtpwrxwz}y}y~x{~{w||vpy}~~}|yvsxsouuw~wzw{~||{|x|spqxy{~y|zy{~|yxptuwz~wzxx{{vvsuz}|}~y{}vvrsrurty{u}yx~x~}ryyw|{yu~zrpvtpvy{{|{}|}~~~}{{zz~xrts~vv}~z}}}|}|ystsppyz~~|{{}|{|uuuvyz{|~|z}zywvvuusot{}|y~yw{z}}us|ty~~zzu}trtypvxyu|}~y|~{~~usqyzst}~|}{{}~}wrvtoszuzy}{}|~zxxxxzyx~|y~|{}}wyxussootw~}|wyx~~xt{}zu|~}~}{yv~rqywouwws{~z~z|{tuq|yqs~|~~~}~||wuyuottsux|}{~~xvxy{{xx}yy||~y|y{wtvtoptvz}|~xy}}}u|yv|xx|ywzyqt|tsxytp}}}||xwtv}tpu|x~~~~}}|uwxqquorq|~{}|{{|zyyw{xu}~~{|~y{yssyopsru|{}wz|{szyp{|z|}|~wysysp{}viywz}~zxyznq{}vqwzyw}~~y|vyxvwznkpyu|w|yzy}uruyy~{~{vyurttsqqwy|w~yz{{~}|twywtwy{|wz{xsx~pmsvvxzxxz{|zt~|wp||~{}|~yxxtrqhkzsrr|x}yzy|{ywxzw|~|{|vxxywpstryw|~vwyvvq{xu}~~|~{}w{{yy~srzvxnu|v~~xx}wyzxyt||uz~}xu{tw|svtsyltz}~|{~|v}xsyru~sz||}y}utxsrruvtt}{~~}xz|zsy|x||~y|~yzsnvmmmvuxy}}{{}~w{|yzwz~}|}}v~wrvtvrmvruy~x}yxty~u|{zp|~~}z}wxxzupxrmwrr~{z|{wzvxu{{|}|yyxux~xmxxuwtv~{zy{xx}sx|susz~|~|~y{xwsvzsrrxps|~}}{}xz{rvw~yyzyzyq}ynonurqz{~w~~|}wy{}uw|y{w~~{~v}}vvqwoprttv|{~wwzz{~xu}}~|wzz{uvuprqix{qty}y{z}xwxx{y~z~~zv}z{us~yvvqrxtxx|z|zr{qqq||y~z~y|z|yvuvwnsuwsx|}{}}vzx|uw{||y|ytxsqpxuqwyzwo~x}~}uw|xtwt~|~}~~z|}wxvzrprqrrxvz|{y|{|r~~~{xz{}wxysppksxmno{}{|~}x}z{x}xx}~|y}~|zs~|zytovsqsy~{}{{uurq||uz{||{}{z}xzwzrrsurqxvv}}zx|~||~}~~~}}{vs{}lqywzv~~~|tu~vyzx~wmpz~ywuqw{vt{z{|||}~{{{q{wx{ru|y|r~~z|zpyzvy~zqxy~x}w{vtytp}zyx|z}~y}yz~u}~zwxv}zx}rv}zzz}|{zmtsrntnvomnoziklyvw}||z~}{{{xtqz{x||y{yxwy{t{xzmw|zw{~oqqxnrmuyuzuuxuw~~t~zxxz{oz{nkoos~|zqtnkuz{wq}qllrlmhqxoyzwy{~x{~s|uqwtu||x|{{}{~vzupz~vvuvwqtot{r{xsu~zwu|q~ww|ov|pornnx}xouniuy}oztrrsmnhqxnzwrw}z|t}|t}tw{us~|w}y||~v|uqx|zyyyxstks|nxusu{xxz|{m~xw{qw}pprqnx}}~~wpwrhpvt~vstsmninyjtvru{|z~r}w{vuyzs}zyzw}|z}|}v|ypvy{~|{wttqo}mqtrtwyvy|py~}x}}wttrruou}~|~zptwkqr{y{~wwrpmmiypksovy}{ywv|wwywu|yv|w{z|us{rsw~~zwssmy|ktpsuyzzz}zo~|{~pyyqstwnz|~|||}tntpksvy~zzytromm|lmqovz~u}~|xxyx}ww||vzz}x{zstxpuzyyvtnz{ksotvy|}{xn~~~}{||~qxwrtuyo|||||}}{~slrnltx||{yuuqon}olqqxx}v{~|wxyv}|y}|v}yzy{|{{~pqwrv~{zyuqwkppsvx}}{~~n~||~z|w|ruyrus|t{}}}}~{wy~vjnonw{~}||uvqpn{wjqpxy}zw~~u|yyx|xyw~x}y~}zvw|pnusy|{zurwnnoswx}~{}}n~|{~z|vzrsxtvsv}}}~}}vsu}tinoqy|}}vyspp}wkpqyx}xx}}{u{y{yz|~xz|{}y{su||opst{|~yts{~mopvwx~~{xn}~z}|zvxquuuuvu~|~zrqv{njopu{|{yzrrvqlpuyxs~y}wvzz|x|{}yy|y{|zsrvunrsx~~}utxvlptyw{}|}py{y{|}vxurvuxty{|ytqt|timnsw}z{trvxlotzx|uy~{|zvzy|x~{}~~x|}|{|wvru~xmpqvzxty{notyvy||qv}zy}~xxvruuxu~zx||xuqt|vjmnrt}~~}|trx~ymouzx|~tz}|}{wyy|x{z~~~w{||{wuru~wmopuvxu||opvyvy|zqv~{x}xxxsuuxu}yv{|wvrszxkmmqr|}~wrz~|pnuzwz~ux{~|}xxy|y~w}y|~|~~~}~u~xrt{{ooott}|u|tnuzwx|{sr~~w{{xzuttwvy|s|~}~~y{{rrv|oklopv||swxnszxx}~yt}||~zwwz{{w~~x{{~z~|v|rrt|vnnquvyx~rqzzwz{wqx~{v}yzxtsuxw}xw|{~v|vqrxymllrp{~~{s|xow{xy|vu{||~ywwzz}w|w|{z}zv{qqt|tnnruwyyts|yxz{vqy}{u|yzxtrtxx~xy~{|uzupqvynllsq}}|t|{px|yy~|vu|y|}zwvz{~y~~w}{z}~{|szqprzwnnqwv{vxr|{xy|xrv|}vxzyyursxx~}y}{~|z~wvvnoryqmlsuz|}vy~sv}yy|}wt~~v|}zwuy{~|~~w}|}{|{x|rxpopxxpoqyw}v{s|{xx|wqu{|vv{yyvssxy~z}z~{y|vuumoryqnmuu||}vzux~yz||uu~}~u{}zwuy{|~~w~|}y}{}{wysvnoqywpptzz|yzv~yyy{uqxy|sxyyxurtx{|}{}~|}v{svqmouxpnpxt|v~u~|zyytx}~zw~||zvvz|~zxzx{}uyuusnotzsqqywyw}|yy|~xqu}{zyr}yywtrwy~|~z~{~~xyvusmorxsonut}~yx}~zz|{tv~|~t|}{wty{}}w{~x~|}|wwvttnoryupowv}|z~~zz{yrt||y|q~~yzxuqvx}{z~z~~xxwvtnorxsomts{}z{~~z{|{tw~{~t|}{wtx{~}}x|x}{}|~wwvvsnosytpovt|~}~zz{yru||x}q~z{yuqux~|{~z{~~}ywxvtnoqxtomsrx|}~z{{|uv}yt~}}|ytwz~|y|x{|{||yuvvuooqxvqnttwz|y|tszv~sxz{zxrsw}}z}~{~}|||||vwwvpnouwqnptq}{|y~xtzy~{u~}}{vux}||{{}w|~}z}~zzvuvwqnotxtppvr~}|{|ysv|{x}q~~z{zvqux{|}{~z}|}|{yvvxuooqwvqossv~{}y}vu{wxw}~|{uuy|{|{{x|}|y}}xyvtvwpnotxuqrws||{|ysw|zx}q}~{{zvruy{~}|~y|~~{|{xyutxtnnqvyzy~|}~yrut|w{v}yt}}}}xy~yw{uqs}y}}y}|~ywwsuyrmilzwrwtyoryiioxvnxms{wyyxsv{~|y|z}{|}~pfdswpmjzyv~tuu|uy~x{}s}|yswupu{wzttz|xsvxywz|wuwrqulghq}~{|xsnszwrswtjtjnwtvvupsx|~}wwz~~~|rtnddlzzu}x}}}|ysxyz~z~~w~urt{{{}uv~y|urtvvuyztrvmptjimvz}~xosw}}}wrxluxvxxuqu{z}~~{vw|~~~wzrlridhr{}~~~|vuyz||xy|}{rrw|}}t}|z{rttvuwzxquskuqjkq{}|~}rpux~sxrpywxywrsx||z~wvx{~xyxkrofgmy~}|}~|ytxw}z~z~}~~sqsx~x{}z}tstutvyyrtwktukkow~~~~uosswzvryxyyxsrw~{{x~xuvx~~~~~xyzltrhgku}~|}}ytwt|~{~}~~~tqqs|z||{|sssttvyxquxlvvmlnu|~vprp|{|yt{zzzytsw~{zw~}xuuv{~~~~yy}ntvjhjqy}~}|uws{|}}|wqpqv|~z~vstssuyysr{nszpmnsx~~~{prov}~w{|{|{wsu|}xx{z{vtuv}~|}}|u~tozpiimt}{}~|vwuu~}~|}|{sppq}~~{}|tussswywpxxlyxonpv{~uqro{}z||}}{vtx~z{v~~z~yuttz~}}{{}wv~nqynjkqx|}|uxtx~}~~{zzyroor~{{tusstxyvoyvlzwporx~~}yrxyvppty{xz{{~{z|~vx~}|{~}up{|flzuttwx{{|ww~~{{|xz~p{wswtrsr||~{y}~yzwurrw}|q~zyy|~yxxvrtotzytsvz}|{{}~|xxzvy~|{}vojpzymxsnmorvwxuq}~||y~~|~|usts}}wrpnvyzyvy|}z~~vtqnmsz|w~||~vv{~~wwpsxxsqtwzzxx{{|~}xstyx}~|}uqjhlv~x}ussuxyzur}}zz~}|v~~}~zrorvw~xus{z|ywz{{y~|tsomnu|{w}}~~~{qw}|xrwzxssvy{{xy}|}|wtuzx}{wrmiioy}~}wuvwz{zsw~|{~z~}}wy|~wqptu}}xtv}{|xx}|xz~wtqmmqx}|~~{~}~trz}~}uvzzvtuxz|zv}}|~~yutxw{~|~zsojhlt{~}|yxx{||ut}yy{~~|yv}~~yspsrv{vv{}yx|{xx~ytrnlouz{|{~}wqxzxw{{xuvxz|{v|~{~~zvuwuw}~~{uqkhjqvz~|{z|}}ut~|y~yz}}}yv}}~~zursos~yz}~zy}{wx~xusomotwxz}~~wrxx{{y|}yvvxy}|u|{~{wuwtv}~}~}|vsmijosvz}|}~wt~~|x{yx{||{v{|}~~|vrsop||}|{}|z|{yv~zutpmnruvw}}~~{rvwy}{}~|xwxy|vx||}yvwus}~z}{wtojilptv~~|t{|{x}wy{{ux||~~}ytrqmu}z|||{uy}wurnmosuu{~~|~}~urwwz~~}~{yxyz~}t}{}~{xvwsu{|~~z{urmiimqtx~|~y~x{|z~~zxyxw{{xuxwysowsjqsnnmklqvyy{xxwyzqqwy~wtzpouvmx}wy{{ywvwtx}}|{~|x~ytrnlntz~|v{|ztqoltsmortzwpvz|wx}|~{xxxvyuwz|xyuovvjnsnnmjjntwx}~{{~y{{}xv}xps}yxxkoyssvwusrsqs~z}|vu~x~}wvsqsyxtx{vortlknpvvmqwy}}vy|~|{{zvos}uxzmmsnllihmrvw{}|{}yz{~zw~~tqyrs}wtvwvtrsqt~y~{~zuvx~|wvsqsz{ww}|tvwomoqxvnsx{~|v{{}{{{z{spwx|{npsnnmjjotwx}}||}xyzxy{st|qy~vuwwvtsspx{y{z|xty|y~ywusru{zwz{uyvnnptyspvy|yw}}~}|{y}}}xqs}z~vntqnnljlquwy}~|}}ywy||w}wrxxu|vwxwvttqs~|x|~x|zvvx}{wvtrsx}}yx~xyzroptzvotx{}~{vz{~|{xy}~{tsz~|{pttpomklptuw}~~|{~{wy|}w{ysv|~wxxyxwutpq|{vyx{{ww~y}{xwursw{|zx|{{}tpqu{vpuxz|}|vx||~|{vx}}~|vu{{~|~zxyxuvxvvvz}zwvy{z~y~|~zzvpruvutspq|{uw~vxzvv}~|~zzxvw{y{rptoijovtnsxz|}}x{{spqy{wkmxzzzprspqqopsvww{{|{z|yy{}ro}{vtuy|~rzzwyzzyxtrz|tpsvqv}|}wtu{uqswyx~x{{sqsz|sruutux}}zwy}|skq}xvsnospu}wxquyvrqrstvztz{y|vlm{ulpsuxzz~x~|{tz~wspt|pjq{smprwytsxzrkiloqtxy{~roywwz||ztqzyrxwrty~}|tw|voktysqv}yv{}}xz~{vuutonot~~}~zxy}|yyojp|yrtuvxzz~x~|vtxqilx~xvwtu{z{|yqrvxzwrpqrtvzy|~xy}|xussw~y~usuy|st|yuy|vqw}wtw~|vy}}~~wsqonrwy~|~|tpsqmr{~wyz{|}}x{|~~|snuuopy|x||{||vwtuyy{zvstuvx{{{~}zy~|wwutuwzz}yy|~spz|x{~yrw~ytv}}uw|}ztpooptyy~{tossos|~xy{{|}}~xy}|zqnuvqrz}x|}}}ztvuwzz{zvttuvx{zz~}|{zzvvuuwy{z}z{}qp{}z|~xsy~xtw}|uw|~~xspoprwz{|yrnsspu|xz{{|}}v|~{xoqxurt}{y~~wtvvxyz{yvtuvwy{x}~{~z{yxwvvxz}}||z{}ynt}{z~|uu}|vty~yuz~|vrppquyy~~{voptqrzyz{{|}}}zw}}spwwrryy|~{ttvwxxzzxuuvwy{xz~}||y|zywwxz|{||}~}qr{|y{xt|}wtw}{uw}~~yurrrtxw{|xqptqpw{{}|}}}}{v~wrxxrqvy|~}utvwvvyzywwwwy|xz~}{x}}||zxyyz{}}}~}rs||wx}xv}}vtw}{tw}~}~~{xutsuxvz}yrptqnt{|~~~~}}{v~}~yuzzsqu}y{~wtvvttwzyxxxxz|yx~|}x{~~~|zzzz~z~~us{}xvzzw}xuv|}vu{~{|~}zwvuvxww}{upssnq{{|~~~}~v|}}}vy|vrsz{yztuxvstxyyxxxy|{w}~}~zx~~|{{z{|~~zsv}|wx|~xz|vux}ztw~|z|}{ywvvxyv{}yrptrou}}z~~}{w}~zw|{uru|zzwsvyusvyzyyyy{}yw~{}~yz~}}|{{{}|xrw~|wy}}x||vuy~ztx~~{z||zxwvvyyv|~|xqptsqw~}{~~~{w~~~~yw|{usv}{{wrvzwtvyzyyyy{}yw~y{~zz~}~}||||~}xru}~yz~}x{|wux}|uw~}{}z||zxvuvz{x|~{xrosusw|~~~x}~{yuz|wtv|zxqt{{wwzzzyyy{}{w}yx}|z~{}|{|}}~yrt||{~~xz}xuw}}wv}}y~{{{zwvuvz|y|~{xsnswux|}~y}}zyu{}xvw}{xqt}|xxz{zyyy{~{w~~xw||{}{}|||}~wru}}|}x|}wvx}}vw~zy}z{{ywvvx||y~|zwqotwv{~|~~}y{z}ww}|wvy~{~upx~{wy{{zyyz}~yx{vx}{}{|}}|}~}usx}}{yzww{~zuz~w{zyzzxwvw{}zz{yuoqwwx~|}{|}z}yv|~yvw|{~yqt}}wwz{{zz{}{w}vv{|{||~~}~~wtv}}||y|xwy~}vxwyzxyzyxwx{~{x|{wqpvww}~{}|{~~}z|~zw}zvw{|~zrt}}vvxz{{{|~{x}wv{{z~~{|~~~xuw}|z}|z}xxz~}vxwyywxyyyyy|~zx~|xrpvww{}z}}|~~~{||~zx}{wwz|}|ss|}vtwyz{||}x~}wuy{z}}z{~zww|}z{~|zzxz~~xw~xvzvwxyyyy|~|w~}ztptxwz|z{|~~~~{{~||~|x|}xwy~~{wqyytuxy{||~y{zuv{{{}{y}~xwy|z}~{}}yy|}wy}uy~wuwxyyy{~zy~|ysqvyy{{y}~}~~~|zz||~}yx~|xxz}|~tr|xtvxz||}~y}}xsv{{||yy}|xwy|{~}{~|yy||wz{ty}vuwxyyy{~yz~|xrqwz{}{z~~~~~~{zz~||~}yy~|xx{~}}tr|zvwy{|}}~y}~~|xstz||}yy}}xwy~|~~{~}zy|~xy{svxuvxxyy{~{y~|ytqu{|~}{}~~~~~{yy{~|~~zx}}yy{}vqy~xxy{|}}y{~}|xsry|}}zy|}yxx~~|}}zy{yx|suzvvxxyy{~|z~|zuqu|~~{}~~~}}zyx{~}~}zx}~zy{~~vrzyxz{|}~y{}~|{wrry}~}yy||yxy|}zz|yy~yrvyvvwxyz|{{}{ytqw~}{}~~}}~}yxx|}}}|xy|zz|~|tt~}yy{|}}}y~~~}{zuqt{~~{xz~zyy{}||zz}}y}|urz|wuvxyz{~}z}{wrt{~{}~}~~}}~zxxy~|||yx~~zz{wszzxz{}~z|~}}{zvqqx}~|wx||zzz}|}{{}z{~~vqw}wtuwxz{~~z}~|xssz~z|}~~}}~zxxx}~{{{xx}~{z{~xszywx{}~z}~}}{zvqqw}}zvw|}{zz~~~||}{|~{|}vqw|ustvxy{~y}}ytsz}y{}~~~}~zyxx|~zzyww}{z{~}|z|||~|vy}}zvz}}~vsx{|yxvmlsz|zyzxx~~|~}zsw|xxz|~xuykekswvssx}}}~~~~}{y}}z|~~~}{v}pkpspmmpsvy|{z~{{}{{|vw~}|ytvystusqqrru{}{zyz}~{|}}}|{{~z~|{|zxvw}yrsvuqnquyz|}~}|}}z{|{yxwwz}yvv{}z{ysooqsuwz|{xy~}|~}yvw{|~|}|wsru|}yvuttw{|zyyy{~}z{}zzzyz}}~}~{urux{{}~|wtuxz{|}}}||}zz{zxwvx|~zwuux~~~yuttvwy{}|yy~~{}~|xvw{}}}~|xtrrv~|ywvvx||{zyz{}~{{}}zyyyz~~~ytqty~||~}yvvyz||}}}||~~zyzywvvx}|wttuy~~{wvvwxy{||zy|~{{|{xuv{~~}~|zvsqsx~{yxwy|}{zzz{}~|z|{yxxx{~{wrquz}}~{xwy{||}}|||}}zyyxwvvy~~}yussv{|ywwxyz{}|zz|~{{{zwuw{|zwtrqtz~{zyxz||{zzz|}}{z{zxwxy|}{yuqrv|~~{yy{||}}}|||~|yxxwvvw{}{wtstw||zyyyz{|}|z{}|zzzyvvy|}zxvsqrv}~|zyz{}|{{{{|}}{zzyxwxy}}{yvsqtx}~{z{||}}}}||}~}zyyxwvvx|}{xussuy~|zzzz{|}|{{|~}zzzywvwz}{ywtrrtx~|zz{}||{{{|}}|{zzxxwxz~~|zxtrsuy~}{||}}}}}||}~~{yyyxwvwz~~|yvtssvz~|{{{||}|{{}~}{zzzxwwy{}|zxvsrsv{}|{|}}||{||}}|{{zyxxxy{}{yusrtvz~}|}}}}}}||}~~{zzyyxwwy{~|zwutstw|~}|||}}}||}~~{{{zywwxy{~}{ywtsrtw|~}}~}}||||}~}{{zyyxxxy|}|ywtsstw|~~~}}}}}|}~~|zzzyxwwxz|}{xvtssuy~~}}}}}}||}~~|{{zyxwwxz|~{zxusrsuy~~~~~}}|||}}}|{zzyxxxxz}~|zxusssuy~~~~~}}}}~~|zzyyxwwxz}}{ywutssvz~~~~~}|}~~~|{zzywwxyz}|zxvtsrsv{~~~~}}}}}}}|{zyyxwxy{~|zxvtrstw{~~~~}}}~}{zyyxwwwy{~|zxvtsstw|~~~~}}}}~}|zzyxwwxy|~{xwusrrtx|~~}}}}}}|zyyxxwxz|~{xwusrsux}~~}}}}}|zyxxwwxz|}{xvtsrsuy~~~}}}}}}|zyxxwwxz}}zwutsrsuy~~}}}}}}{zyxxwwxz}~|zwutrrsvz~~~}}}}}{zxxwwwxz}~}|ywusrstvz~~}}}}}{zyxwwwy{~~}{xvtsrrtv{~~}}}}|{zyxwwxy{~~}{xvtsrrtw{~~}}}}|{yxxwwxy{~~~|zxvtsrsux|~~}}}}|{yyxwwxz|~}|zwutsrsux|~~}}}}|zyxxwwxz|~}{ywusrrsuy}~}}}}|zyxxwwxz|~~}{yvussrsvy}~~}}}}{zyxxwxyz}~}|zxvtsrrsvy~~~}}}|{zyxxxxy{}~}|zxvtsrstvz~~~}}|{zyxxwxy{}~}{ywutsrstw{~~~}}|{zyxxxxy{~~}}{ywutsrstw{~~}}|zyyxxxxy{~~}|zxvutsrsux{~~~}{zzyxxxxz|~~}|zxvussssux|~~~}{zyyxxxxz|~~~}{ywvtsrrsux|~~}|{zyyxxxyz|~}|{ywvtsrstvy}~~}|{zyyxxxyz|~}|zywutssstvy}~~}|{zyyxxxy{}~~}|zxvutsrstvz~~~}|{zyyxxxy{}~}|{zxvutsrstwz~~~}|{zyxxxxy{}~}|{yxvussrsuw{~~}|{zyxxxxz{~~~}|{ywutssrsux{~~}|{zyxxxyz|~~}|{zywutsrssux|~~}|zzyxxxyz|~~}|{zxwutssstvx|~}}|zyyxxxyz|~}|{zxvutsrstvy|~}}|zyyxxxyz|~~}|{yxvussrstvy}~}}|zyyxxxy{}~}|{zywvtssrstwz}~}|{zyyxxxy{}~}|{zywvtsrrsuwz~~}|{zyyxxyz{}~}|{zxwutsrrsuwz~~}|{zyxxxyz{~~}|{zyxwutsrssux{~}|{zyxxxyz|~~}|{zyxvussrstux{~}|{zyxxxyz|~~}|{zywvussrstvx|~~}|{zyxxxyz|~~}|{zxwvtsrrstvy|~}|{zyxxyy{|~}|zyxwutsrrstvy}~~}|{zyxxyy{}~}|{zyxwutsrrstwz}~~}|{zyxxyz{}~}|{zyxvutsrssuwz}~~}|{zyyxyz{}~}|{zywvutsrssuwz~~~||z{~|ywvurqpnomknlkjnjjnpquz~}~}}{}yssqpoqrsxz{}yuqvtwz{yxwsqqnsx}uynwy|}z{}wsrpnnpqt{~~~|yqppvvvpjlkkkmnpvz}ztsx{urpnprsx}wtu}zwomnmmmpqt{~}xv~{xtxvursrprsvyy~vloy{|vtqnmotv|~||zz{wtruwx}{xz|}}yxuumpwsuuwzuw|vussvuqjkorsjsohmmokgdjoszzv|vyx~wwv~{{~z}qqnqslzwz}vpu{}}~vuzz|}vx|}|nlmhsp{}}|vurllupiflknrnsinnkljecqsv|{{wwzpytz|y|uptmnsr|u|xr~~wyvzz~}v}}}|vmqqios}~yxzukhvpiltslsrrlmgeehedssuy~x}x|psty|{|~~{ttytnrw|x|{}zzt}v|wx|~{}{{~x}~|~}}|vlqunms~yv{woeutknszoqurnkifdfgdrvv|xzzwotu~y~z~wuqxwqrwz|~y}w}ywyv{y{z{{}~|}xwkpuqns~}yryupdtxmnrzprvsojkidgheqxz~xzzwpsuz~vzt}tpvvrszzz~w~zyyw|yzy{}||}~{wsjsvspv~}vqwslfyvnnswmuwrnjolgjhhsx~x}y}tssxz}{vzwsprusrwz~}~wxvz~~|w{|}y}w|}lovvrs|{|ruwrhp}qopwqpztqkmpiikgmv|~|~{{{sut{~|r|vrztpsrpt}{~y~|}zy~|wx}}~zz}~zyonvwusz|~vtzukn~upotrn|wslotlkmhkt|}}|~|{}uwt~|~|~s~}wsxuprqor~z~{~}~zz~~~vx~}}|~}yz}~{{npvwutz}~yv{wmp~wqouro~xumpwnmnikr||}z~}{~vyt}}}|}|u|~wtvwoqoop}~z|}}~~|y~~}wv}~}{~w{}~~||ysnvwwtz}~~x{{qo|{sorum||wrnysnqlkoy|{xzwywyz}}{vyvqpqopmx{z{|y|}}ty}{{}xxx|~||{x{}nsvxvw}~~~~x~zos~yrovrqzxotzprrmlr~|y}~||w{v|~{{{xy}xtrzppopn}{{}~~z|{{uz}z}}}uw~xz|{|yyw|{nuvywz~~yzpu~zsovrr{zpu|qssoms}y}~}|x{w{~|{|}xx{xsqzqpoqn}|}}~}}{|{}vz|z|~~}vu}xzz|xwwvy|ptwyy{~z}}rs|}vouup~|ur~utvroq~~x~{}xzzx{}~~z}ywyxuoz~sqosoy~~|~||{~~vz{|z||vtyy{|~z|}vuuuw}rtwy{{~||tsz~xpuvq}wrwvwtqq~y}{|xz{w|}~~x|xxxxunz~tqotpz||{}|~}wzz|{{zusy}xy|}}}x{|tsuty{rvw{{~|~tu{wqwuu~vvvxxuqtz}zx{zx||~zyxywwxrp}{tpqtq}|y~}|z{yz|x~|zvss{~zyv~|~{{v}wqssu|vswx|y~|yux~suyt||s~{wywtp||~||yy}x}|~|}u{wzvxuox}wrouq{~{z|~|~}~yzzz{zvtrx~{y~v{~z~y|uz{qrss{yswv|y~}{wy~wvzv|~t|}xzxvpz~}|{yx}y{||}u|wzvxvpw}xrotpy~}|z||~}~yzzz{zusry~zz~u{~z}y|tz|qsst{xsvv{w}~|xzyx{x}v|z{yxpy|}{yx}{y}|{u~~w{uwvpv|ztnspw~|{{||~yzy{y}{usqu~zz{ww~z}x{wutrtsyytuuyx}{yz}y|z|zx|}zzst|~}yyz~w~}{}yww{xuxrsz|xpqrq~~~~z~}}}{zy}x}~~xrrp{|yz|~ty}|z|v{rz|qtsu{wuuvzw}{zz|{|zx|}}{yqz|}{zx|}w~|z~}t{v|vuvqu{|wpsqu~}{}}}{{y~~x~}}wqqq|{xz{{tx|zzzvzpz|qtsvzvuuw{y{{{~}|{z{~}|zrz|~~zzx|}w|y}|~tyu|uuvquz|xqsrv}{~~|{{z~x}}~~~xpqo{{w{x}svz{y{tzqv~stsuzxwvw|z}|z{~~~|}z}}tv~~{yyyv}}y{|}wtwzysvqsx||tttt~~~z}||{z}y|~{~~}yppow|v{w~ttx~|x{sysrutstzxxww|{~|z{~~|z~}~vw~zyyyv}}xz~{|vtvzyruqtx}}uuuv~~~{~}{|{z}y|~~z|~~|wopnx{v{v{ssw~zyzsyqt~tusvzyyvy|{{{{~~z~~}uz~}xyw{~v{w{}z{rx~v|vtsquy{uvu{||~}}}~tpor~xz{xupqwzuxssvmxvkgfsyunkqty~}~}z~}zzrox}~~|{~y{xv{sprx{|{~|}xy}z{vsy||wyw|~smry{uwv{{y||z~z|}|z~}}wwv}zztrw|y{yu|sy}romv{|zy~wty}~}|~}xxvvw}~wrpnwqty|vw{y{wt{|~xyw{~|{}|sw|v{|y|xrqqusrnnyrwyswvx~uqqq~{zxztrx|yyuqujosjhgnsxzx{yz}z}xwrxsr{~vtvstojurptmmjmqw{uutu|~w|{qosu}{vvxvzzwxy~}x{{y}|yvxtquyz|yzyx}}wwtuu|{}~wzz}xuzwyz~z{x{}t|}xtyyyztz{}zxy}xyz}w~}v|{||zy{}yxqt{sywruswz{ypmlp{wy{vwrovywxspsjnrljipsyzy}|~}{xwtzvs~xvxvvsmuvrvqnknqv|xwtu}}{~~ww}tprt{{|uywy{xxx|}~w}}{y~|~|}ty|vrrwx|{yzx{|z~}uuuwx~{x{~x}sxxzz~}zzx|w}vvyx{yu}}~{y|~~wyy}ww}|~|{z|}yyru}t{ztvswy{yqnmp{wx|v|~wqmtwvwroqkkspmntw|~|}}{|vvsx{t|vywwvqszvwwroprt}|ywv|}{z}{zrzyqtv{|~vxxy|yyx{}~zz|z|y~}xzuryxtswx|}z{y{}yuvv}{y~|xy|vzwr~}|}{zx}w~yuyxz{wzz|~x~vxx{zy}}}|z|~z{uu~w{|vvtwx{zromq{xw|wz}}vqlsuuvqnplkstprxy~~}zurx{}{x|zsu{{~yxzwsqqxuq}}z||{yrzyxzx~}ysw|~||y}}}}z}}u{u{}|swxuq||||}xvt{y}}y{~zvprz{|}||~}|zzxy~~{~|~}v|||xx{{|{}rnks~}ttoikmpyyxuu{z}{u|~}vx}}}~{~{z||~zwrux{|zx{{}vtrw~z{zz~}ysry{}}~ywxvtpsx|~yz|xyxmrtxwrsu||}{}wwv|{|uprqw{|yyxz|{|~~}{{xrplpsw~~~yxuxslifmrnosonsvrnhhnptusrvvu}}xzyy}{{yz}|{{||z~~yrkmlrwz}{wv{zxspux{tvxnsxwwqqvz~|x~z{y{~}}zyy{{vuqtvw|{~}}|xusw~}{{~|xtz|zvvu{~}|}}v{pnquvrrrw|}|y}|ywvy~{|yqqqrwx{||z||}|{z{uromqrw{{}{y{uokjpspqupnsuqnhinputsrvvt}}xzxz}{|y{|}{zy|}{|}xrkllqvy~}z~~}xtxy}wu{pqwwxrqtw~z{y|{yz}~z}wwxzvurruv{{{~|~{xtv}}~}{~{uw{~~~{uutx~~zyyoorwusssy|~zz|~~}xwv{}|}zupqquy{~~}{}~}~xtuvqpnmrtz~~|z}wrnmsutrwtntvroijnpuuuswzt|z{yz~|}z||}~~yzy{}{}{}zvrlmnsz}~z}}vxz}|t{vpvwyursu|{w~~|zx|}z}wstxttsrvw|}}|~zwv|}{}wvz|}zzzytuux~y{uopvwttrw{||z~}~~yxvz~~{~{~{yvqrrv|}~{||}y|}~wrrtppnosv}xzzqqy~}|tstvywwsvxowzvwux{{|y|x~wvuusoomqux}{~wvz|~~zzusmklmuy}ywyz{{yvuyz{uttv||~zw}wtyyxuxz~}xvzzxywz~}vsxvvxwxyy~|xuxy{}vvuvqqqry}~vuzwxvontvttruyz~zx{~|}~~|wsr|v{unqsuqpqsz|~~zx|{|~z|}vprtrtrsvy~|{|u{zxuprsw|{|zz~yuopw~uotursprvw{ywy~|{}~~zyvz~}zx{xwtpqpty||y|{tuwyussu{}{z}}~xwv|z}zxsnppuxxyv~|v}{~~}{~w~vuuvssrqvy~~~xw{~}upuwuvsuyz}{}}~}~xuryzxxzurrqwy||w{}vvz|xwz|zx|xprustrrtuz{{|~z||zxrssw||~{{}zxrosyuuyuurquuzyvwz~w}|{}ywuv{|~y}{yywvqqppuw{{z||xxzyuvtx}~}z}}~yvu|}|ztpppuwxxu~zu}~~zy|{}{z}}|v}}vtuvstsrvx}}|~xy{zswywxuwy{}|}}|}}}}zvrx}{z|xutrvy|}xy}xsw{xvxy~{vxzrosrttsttx{z|~|vzqnqpplllmuwxxw|x{xtttqspptw}}z{|x}}zzvwwz~{z{|}{xz|||v|uusttsww}w|}}||wwzxvwuz~}~|ww}vsyy{{vspw{~}}yxxy{tngku~xsx}x{~zy{~yyxpswwywwz{~~|~}~{{y{zyxx}~|wuyz}||xrpt}~yusnmjmqoru{~{wz{{zw{}|z|{{xuuty|}~{{~~z{yyvu{~{yzwyywz|{|~vy~~}vuxy~}zwroopnpoopjksy|vu{||vsutrsptx|{z}{sqyzy~}wt{wsxyys~w}{~~}yu}~|}zzwxtmptqlnqrvusqnqu{{rvzvx{|~{suvuvrrqtyx{~|wtv{y}}uqqlkiirz|xww{yyzz|yvprxqqttxvtpnrty~y{~~}zwuvwvz{{zy~}{{~zyuqieicgpu||||{|xvw}ts{{ytstqrpswy}yz|yyxttonqtz|{|}~~|}~}~|zw}{urmlijot~{wtrljfglnpnowsnrxxtvvxyw{|~|z}|wywwxsttw|{~|wuv~}y||~}~|usuvz{}wz}ztqpjehffgdhkpsprtvnmwvuwx~{y|wxwyxvspsssv|~|}{~}zvnkhilmvzyusmgkeaddhgghjpqqrt}yu~{{|yzy{~zwvrpkjmpvz|vtoponoouz}zyttqopotsnrqmiijhhghoqutu||ww~||}~}~yx}|tuvx|z{{||}~yrrprtu{zxzxwwuwvsopqjjlknlmqtzywy|{rt|yyx{~}|~||~zyutwvy{}wvsmljmoou}}~||~~{ztnrnjklpooopuvuuv~zty}~yy|{~~}zzwwsqtuyz~~w~~ytppplkghklpu||{yzy|~yxzxrnpmlkhlorsrw}|y}}~yzxzywxw|}~~|wvuxvuuv}vrpllhfikqsy~|}{xrsskjjjnlotyvx}~}{|~{xy|z{xx|||~~zw{}~}z}trnoolmmrwx~{zwortpqrvwvvtyzz{z{}~}~}~||yyxuxy}~}{~}~~|{|x~zupoqopmnrtx|~|{}|~|ttsqrorvx{y||y|zxxyvwux{z|y{}||~|yx{{zzy~yrqmmkilntwzyx|urrrussvy}}~xx|y|wqqrpplmpqvy~xywwwuy|}yzqnkllkmovz~}uxwtqrvuvuv{{}}}~|zz~{qnmmporw{z~xwwy{y{}|~tvyupmqrstswy|xuvtussxz~|}x}~~|||y|{{}{ztz{yxz}{{{}~~zz}zxvz|||{~~vtqrpnqsy{||yutuwuvwz~{{z||qpuvvvz|~~~|vxxwvsuvvy{}z{y{yx|~~~~|uqqsqrruyz~|y{xtpstsrostttsy|wvz}usqrpnpquvx~~}yxy|yz|~{y~|vprrrrpstvz~~}~vpommjjnqvvy}xxztppsqrrtwvy{}z}|xtxzz{z~uspqpnqrvx{xtytonpttvy}{w{~}wsxzvpqsssprttwx{||~}|~zxrpsrrsswwy|~y{~|wx{{{xz}|}|~|z||zyyy}}|zvsqqroqqsvv{}|~~yy}|toqqqonpprtx~ywvvrsvwzyz}~~vw}|}|}}}vxzuprtrtsuwvxy}~y|~~~|}||rnkkjgjjmorz}xtsvttuw{zzzz~ystx||~{tvzyqoqqrpqssvx}|{|}z|}stytmhikkmoswx}~z||wruuuuswxyzz~{z}}zzz{~}zy}tqprrquvy{}{z~~~|{~yppvwpnqrttuxx{~|vtsuqruwzy{}xw|}~}}}|xw~yttwvxxz}|~~y{}}}{~|~~{{{{{yspqqorsvy{|}{vsvvuww||{|z}|uru{|}yw{xrttvvuxxz|zxwyvvyz}|~}zzv|{unmporsuyy|~{z}{ttvvvsvxxzy}z~~zytqssruvy{||~|wtwwwyz}}tquxpkmmpopttxz|vtturtwz}}}{xw~}wqsttww{|||yz~zvyz}}}~~wu|ypljmlmqrvx||}wx{z{{~}xv{{uu|{srstutwwwz{~}|}|~wpuxtljmmpqtww{}zz{{|y{}}~~{~}}}}~x~xropppssuwx|~~|~~|xzyqosvnklmonqsswx~{xyxvyz}~~z{}|tw{yqmppqrsvvxy{|{||}{}~}~}|{|~}zsxzsmikkknosuw}{x{z{{}~yuw}~yspvyqnoprqtuuyz{xzyxz{|{}~~~~xprvunjmmoqswwz||z{{|y{||~}zz}}~zzzz}||vzytprsswwz{|{x{z{|}|vv}~zrnrxrnoorqsutwx}}xyyvyy|}|~zwx|~}~|~xx}ztvvwyz}||~~~}}~yzz|zz}|~~~z}~}{{{~~xv}ztnlnmoqsvvz}yyzyzy|~}~||}{vrw|~xw~wvuvwvywxy{~ywywwyz~}~{z|zstxxpmnnqrtwvyz|~|yyyzwyzz}|~}{}~wrrrruuwxx|~~}wyyy{{zv|}vpovuonmoopssuwyywyxy{}}}wx||trssuvxzy{{}}}{~|zz{|z}~~~{}||{{~}|tuyvqkklloqsuv{}|}|xqpyw{||}}||ztsx|ywv{|}~~vw}yxy{upv|uv|{sywqrswxux~|xvztuv{}}}~}qstsuv}||~z|}~}xty{~x}}tux~}~{}}{}zss|x{|~|~|||rotlopw}wsvw}u{vt|{|xu|w}w~y|z{w|u~uytyr}}|~|x~~{t~{{}||yqios}~zuwjrolqpkr{|~ztyuwqpurr}{vu|y~w|~{|xtw~|}~zxz~|{vrzsnryy~v~wxwnnlomovtqx}vqyxovszv}|~~z~}y|}z~z~wuzxz|wwzz~z}~{{}vtrwsy{zxutvunmvnntxpsvxu{xrw{zu~|~wz}ws}~~w{qqvvr~zywzwy~|yzump{wzx{smmtlmqty||tw}ypxurqwux}|x{~}w{}}yv}z|{~|{tw}{zy|zznmost{}|{ynsusluvps{uz{ztqvqmv~{y{{z}}u{{|{{w|ztr~~z}~x}~}|ywrwomt}w|vpptorxxprwtns}urutszz{zxx|z|}{~wqryqqv|}z{~xw~}xz|tpnntu~|{y|wrlusmt{uuwqvvrquxvy{su}~}vz{u{~}}}~~tsy{y{txz||}|vprvonxy}|xrqrlpuust|||vqy~yvxuw~}}~yy|~xzx|}vzurryv|yxuw~}}~~ztymqvwuy{~wt{|xyyqs{||tsr{sz{yxy}|xy{}xz}wuzvskvvt|xt|z~{nsrjiv}y|xnv~~xyxy~vzwrswoqw{vyy}~~|~|zy{szx{ztyvprrv~~|{}~}}}|vposmv|w~~oxyz|w{{zt~v{ysrttvwq{z}y{~}y|y|v|}tvy}}mxv}|~z|}|~|||vstz}rqu|twq~vuptxuwuyyuzyzxrwy{~u{|yxy}}tuwy{zx|z}wpvxyzz~~~|z~}y}z~}pqqrttv~xzrp}s{wz}}ywttxorz|yw{{z~|}{{xw{y~~x~|y}}xuyz}~{z~}{~{}|yurlrutz{r}{mstrvw|}v}ys{uy|swyz~}z}yv{zyw|}~{vzys{~|zx~y{~|{zwzyy~upsuy{y}}q{{vzutzyx|~z}uq{w{~sx}}{~y~xyzw}}w{ysxxqzzx~||{~|vwxvxrpstvxv}s{xs}|{|}|~~z{ts~wxzsy||}|}~}|~{{zv||w~~vxzv}}v~}~}|{~{y{zxxwqpsttrr}~}zuyuvwy{u|{|{wuwz~|||}{}z}|{z}y}~~wuytpxsv}y~~|{y|tqstsuxtt|yvxs{y~}zyy|vy{y|sy}yu|}yxzvz|wv~x}{vwssvqz|~z~|~~{~xz|w{{uustrsquxv{|y{x}xyxzzwv|zv~{~y{{yx{}vw}{y}zvyqn}}uwy~}z}~|y}ytwyvw}vpvxwwlq~~y|}z~~|wvyusxzsvzwz~z}}xw}{|svsvxtx}~~{}{vz~|}{|{tu|z|vzzwusvqoy}}xz|x}|vt|tvy|}{|y|~yyv}~zy|tsuos}utwu~z}~~}}}xwzrvsy|vx~{zwlp{{~~}}}~u{yutxurwzvuu{||yxvzwswy|}||z~~z|zyzx{~y|}z|xutqusmuy}|}{~z}xutvw~||zz~y}~w{w~{zzrr{tmqr|~|{~|~|~}wvysqgpxxz~wynvyvyv|{xy}yz{rs~twu||y{xkz|{v}tvyr{nv{{}u|yz~wx~~{wvxxwz|{rsyptyus}pu{wuz~|||}~{o}}|y{z~~{{woyuxyuu|||~|vwtuz}}z}{vtvv{svq}x{u|rp{{v{}~{}~wwtrx|xuq}z}yv}z|wyz}zuwwtvy|{v}|}}}u{~ux~st{vwu{v{{sqvytl}~zut|{vwyw}zr{v~}}zus{ykqwvz~~|~~|{|v}{{~tvss{xur|{tpvxvv}rx}}y}zrsw{~vx~~{{}|rwvwt}{}vxzyuww}}|{}|zy|}{psvvpyxx{xuvrrpynu|}w{yz|}t~|z}}|}yryww{|u{zxyvruxst|~x}~|{|~|{~t~|trxrussv{zsv|tt{wzy{yv}{x|z{{yxw~v{|zx{|xw}yysux~}~~{}|x}wz{~{vv~syyrr}zy~srotvu}{x|v|xsty|z}~}zur|y|z~z~yyzsu}yz||zwz||y}~umz{{~{zy|vy~wqqtkqzyx}}|~|}||rw}|z~vzvx~{}x{|rvyxssv}xy~w|}~z}zwzxvxvqxxptzyqrrwuutt|~~~}yw~yw|{w{{vyzztz{yvpw{z~}yzy}{|u~~{|yzzsqyztwqy|{zptwsqsvv|{x}|z}z~{wzry|}}w|xy|vvyp||~{|}}~|z}|z||xwpvzyzvz}}uwxrrujqrtptyz}{}}|z}~|}}xwz}v{}{~xx|yspxtpt}||{y~~x{}~~~z|}ttuuruuq}{xputnkywqrtv||~wqu~~~z|~u~zxwzvx{}vytpktfnttqq|wrkwxmkrwwx}~w|}swsv~{~zzyxx|}|}zrzzy}|n{~umxz}~vzvqp~wu{|||~|{uqy|v{}rmuvou{{lzoy|txx||{~t{y~xzuyt}}{sx|x}yl{}~zy~~}{~~~y|}|}~vvu}~}~v|xputqnx|tot~pjlnhivsovwy{|fmyspt|~~|yx{|yx}{~tv{|yzqxxovvqq}w~tvzur~w{y{{y}}}~}trwuzw{{}zzzsyyt}|ytxzmegugelnfgtmjo}svw{gisnhjxv{{~||~~~~|}w~tiqpovrq|yz|{yxx|{}}~}||~~|~~~{~vvmqu{|uzxp|{yuqlszgjnrhsytlv{qtzzkx~ztyzxzuz{{}zz}|~{~tw}{}{{|xolpmgr|}py~yvy~{x|~}}~~y}|}ytlrrzx~zstwqpp~tmk|pgjmedqljk|wyy|liprlnuvxxw}y~}}y~~}sxupwxtz}}~{zw|zvx||{~}~|y}~|x|{|z|z{rvwz|wwyxrvqo{tuwpkunkgwvw{usz~xxzzyyuy{||~}~v}~|~z}||z~zw{}x|ulmlgn}y|~y||{quyv{~x||zxvyrux|~}zw~utn|uql{tjjmjhxroissrtwomrzvxwzwvp|ww|~{{|yuytx~uwwsu~~}|{x{{}{~||~zz}y|}y|wyy{w|uss{{zx|{rzztp|ywvujtsnkpyyy~wrr}}~yz~putyv|}~~{{{|}z}w{|qpw~qrpsl}}|{{~yqx|t{~||~x}uuvrtxtsx{|~{~{puoifvvpnromytpmpvsuvpnq|z{x|wyr~}w|||{{~~|zrzyttuusvty~zw}||{|{~~}z|~}~{}}{{xvvooronv~~~}w}zuq}|uqsqq}zvtu}z{zspr~u~{qtwxy{{{|~|vx~}~}rwtomw{rroto~}z{zw}}~{}{|~~uz~ttxtsutmqx{z}trplgryvppoktwrtr|}~uojsvxx~|~z|yz{~y}|{zwztrvwupwu{{}|~~}sux}x}~~|~~}}|~{y{}xstomqsou}}}{{xry|utsrywys{}|~zws~||}x{z{}~z~yw~|z~}xv~|v{{utwuswvqjnlz|y}|z|}}}~}~}}|xxtzvuwrrutnty||{z~}wuvsqy}xqommuwsxt|vmlvy{zz~vy|~}z{{~|~uwtsq{|xwxy}~y~}wut|x}xz~}y||~|w{}xur{ypvttu{tuy~{}zzyw}zuss{qvry{s{}}|zz}z}|z{y~|||}~~}~{r~xyusuusx}yqlmnz}yvwz}{~~~~}~}|zvvsy}qtrrs{wwz~{~y{xwwsv|wtqstvxrs|{}zwqx~~|ywt|x|}{x}|}xzxtqruu|zvuv~}~{}~~}|z{}z|yw}~}}||yu||{~}vvrw|qvstsztrt{z{y{zxwt}vxuv{tz}v|{rxy|}~}z~}x}|}}~~~u~zyqnomrz}vsrtz~}}zyu~}~~|~~|~}}~|y{xws|pqppqyyvx{{yw}rspty~xyv||vxpz~~}}uu{{{z||{}z~{~~}}{xxupssu{~wwx~{}}}{{|y}z|}|ywxw|yr{~|xvx|vz|ppllmvsux~}~}{|}y|z|x~ztw~yz~tyy{~z||{}~}ywy}y|wxslonqw~zusuw||}~~~z~~z~|{y~y}xx~swpuzstsssxsrsxwztstv}{vxw}}y}voox}}y|z|~}~~~z~y}}~{rtrtw~{ww{~}~}ztvx{~~}}|}~yy{{{yxz}w}~ztowz|{~wyxv}sqnnnvuvv||~}z|~|~|~x{{y}~|z~}~xxwz{~~{wwy}}~wu}yx|rtstu{zrpqv~~{}}~~}|{}}||x|~|}~z}{sxyywyrtwt}xusrqwuuuyz~||{|}}vwu}~}|tpv~|y|zwww{~{|{z~z}qrqtx~{|~~~}|vwwy|{}}|zuw|{{y}yxwz{~uy}{{xsqy|~{{psqowuttux|zyxzy|{x~}|zw}}~{}}~||{~w}}z||{wrrztzysvuvxxtqvx~y|{|{{y||}y|{~|{||z{v}tuwxwxsovpuxtrtu{}}z{y{}{||{||~|~}zv{x}}x}u{wwxz~ytzvuzrvvz|~y{{|~~~~}z||v}{~{zux}wywy~}|z~{sumvy}~|tuxzyxtmtpqywtttxxyvyz{~~~z~z{t{}|{}zyy~yz~}wyz|zyu}zwzponqt~|y|{|||{xzz~{|z}{}}z{||v{|}{yrty}}~yruqnuqopsy|{{xz|~x~xz{~{~w~yz{{|}}~}}}||uyyt{tssvww|sy|yxy|}~zxuxz{}z{}}xuoox~}}{yzyvx{{{ypqphlldefmqxxzz}|{|uw~~~|v~~|~}}{yyuuz}}{xu~w{zsonn|~yxz~z|x{{}zxnehxzvqxrnpjmsvwtoqswvvpkonkwtrrtvxywxx~uut|{ux~}{|~}tjegm}xyppuvxttt{}}v~{zzwwvyxyw|~}z}~{yx{wqqsy~~|}z|vw||ztoosy|{y}zt~xtsw{{qsu{~svy|yvopswyyvqxts}}wxwzyzuuv{~|}}{|wy{~|{uu|uxwrpst}~~}yzxvmlms|vwrotusmebbgimkjnrjssmkmprwvxw}}|}~~xw|}yrwqmnkjqv}|v}~{wruvzyxsw}v~yyvxwxuwy}{|~yzxxuur}|y}wutw}~{|xrwz{yttv{|~zuv{r|~~~y~y|}{}{womoty{{uxysx}vvvz{}zyz|~yyz~}zzzwupmvutyxwyz~|{vpwqoqpqu||{svtovxwpieehkmkhlogstqqvx|~|xvxy}x|}|}}}yukjoklsrvz|z}{wssw|~{u{us{|vyy|~|zzz|yt{~z|{yxutos{twwutx~~wtysv~zwtwx|ywv~x|~~yz|syy{~zz}{vvv|zsrslr|x{||xuwx|yz~ywwzyzurywqurqsw~{|}yvomwqqtsqty{}tottrmlinqvrpkpjgpporvy}xzx|zx~~wzzyz~||ypkopipoopv|ux~~~|z{~}yrvvrzz|z||}ywwy|z}|~~~yzz}||vv}uqspmpw~v|tu{z{}urlohdklikouz||y{z~}y~xxyw~~~~|zwzz~{v|ztvy|}~xswzqvwsrty}~~twrsw}~}x|}|yzwomnv{srpo}zwrux~|{w{|w~}{zx{{yvyz~}{yx}upsy}~{xxypz{zy{{~{wwwx|vz~~|z{{}}yz|{wswzx|xy~~}z{}~|~zzyslusx~vpptvtrnrlhmmikjosurrtvz}y|}zx}~~}~}~xz{xw}{}zvvtoxxvuuvxwrqqstxqy~zz}~}xuuux{}z}yurvy}~{wuxyvs}y|}vsty||}{|x|~xyx|zx|}||wzxs{|zvtrtqonrsy|wzyvxyzwxx{{|xy{y~|yy}xxx}yx~}}~||}~{urtttnwwx|{|{vsmookovssqsuuqoppuzyz||}yvy}|}~|zsssyyw}{wvv{vy~{wsrsuqssvw}vu|ztwz|{z{z|||vv~~v~~zy{}~ztoqrur|~|utx{z{wz|yz~}}xy{{x~zutxsx~{zwyuspqquyus}|w{~~~{zwxurr~{|}{}}|vwy~z|~}~~~ypllnony}{xzyxvsuvqsxtrortvtvwy{}vw|z}{}~yvz|~|y}}z~|||~{vuvxuv~|yuyxry{zvwx|zzwwtvslrzvw~}|wwvxttz|~}xwwx|zxsvw{vx}zz|{zyzws}~ytuwzy}}xv{zvuuyxywywzzuoywrv|~}{{wtr}|x~zz{}}||~{wz~z|~}}}zz|}{rqnqnnvyz{wvtjptusvz}{yxuuwwp{}||}~}}~}}|~}|z}}}~~~{{}}{vuvlmpplmpvwzyzx{yqr|wty|}z{xxz}{z|~{}xusyzyy}{{{y{|t{~}yz|~~}}{t}kmszxy||xrz~}|}||z}}v{z}{ywtsswvww|wqqy}~}yx~z~|y~yy{zroz~vnnljousw|}}|~rrvwttwzzzzy{~z{~uwwwvxxz~|~x}zwsvy~{zytz}}}rljq{{vlomkov{}|{~}}zwqvuorzywuwwvuttuzyux|z{|yyvuw{~~zyvopqy||}{|}}xspqu~|}ztuxyyvwy|z{vuxyqw{xsqqpqqtu{~~v{xswxz{|{||zvz}ytyvuux}~y}~yvrmnoy|uxxtx|~|y{zzxuqvvou{{wwwwssqru|{x}~yzyywxuyz{xxz{y|zxvwz}}~|}z|vspqv~x}~{{xuutvvwt{}vu}xtqttuwxyz~|vuyvx||~}{{|{xvv|xtvyvyy~~~{~~|rrppptzxy|yx}|{yyvwsqsztu|xxuususwz|vvz|}zvwtsqu{~x{|ywwz|}|zx}zsrusvw}~~z|}ytuuxzywy}tryzuuvxx{zzz}|vt||vy{~~||zztrqwxsw{||~~~|zyzxnopqrv~wz~|~{xwwvurwytr||{y}|}|zwwxvqr~~}~{xuvuutw}|wwyvwv}|xwwywupuxqs~{usqxvsw}}}}{rq|}|z{tv{zuwx{|~}}|tw}{w|}}xwtrpqvxutqrxwu}{}}|}|~~}}}{qsv~{zxz|{y}{zu}~}{{sty}yqmqsuuxw{{usyurv|~|z{{{|z||xttw~{yx{zzyyz{||yusprzznooonpuxxvtpprpluxvw}~}zzz{~~|{}yvwzytnorjfgnt}~{~~|{v|wsv}vquyv{~wurpoopuxppqrnorxz|{zwyumnsomty|~u}olwz{~|v||||z||}||yz~wqqpqoqqspqnqvtpw|||~~{vsqyywnkikqx~xy|usswxywyzz{}~|}}vz{|yvz|tpnoonnptvzz|{|zwsrttvy~~~zvtttrnmvwusvwyuttuuwx|{xroknnrz{yyywz{}ytpwtporwyzz|{{z{|}ypjedirz||{ywwyywsu{{tsrtsssxy}{}{spsrtuxyzwttrrtyz|wz}wuvxyx{|~~zx||{ywvwzz}|xxwwurt~}{y}}|xxxxz}~{xy{yz{vnllpru{|}~|xxvy{|{~~~{vw~~yz}~~ysoljotx|}yyy~~{~zxxzzz|}~|~tvwvruy~~yvxurnjghklpv~|z{zz}||~}{z{}}zyxttqqty{~~}|||yz}||xuqpllkjluyv}}{z~{w{~xrrnkggflqwy~~{y~||zxzz}}|yvrqqwy{uyxqjiijjlqty|~~~z~|{~{xvxtqs{wuvwsqlklquw}~}}||yx}}z{yyxxw||wsrnnhfmtsty|ytrnntztv|}zyywxxxw{}~x{~yssqponosz}~}{yv{ytsu|xwttsx{}yxsrtssrspqomlssmowzz}|{z}yvy~xvvvvuttxz|{~~~}y|z{xwtwxyy}~{vmkrsonrssppkjikjpyzuy~|zz{|{~xtsrqporv{{~~z{{xspjgcfkrw}{|zyrklqlghmpqttsqrnnsztsy}|}wwxupqrttsruy{}wvvqlklmopuz{yusokhsvrpstsqqonppqv~y{}|{||}yzzsrqtvyx|~~{~~}zyuroqux{|zsmqvqmprssustuwux}vtwwwx{~z}||||zutvxx{}}ztponnlpswwz|}|yzvrr|{vtvussqporqsx{wy{xyy|~wusuutsvy{~~~~{zvw}~wqmjhdeiosy}{u{~xopnnoqqruuuv}}xw~~{|}{yzyxttuwx||vvwvxxyz|yyrnklmmlmqrtvz}{{tt{wtsspqppswy{~~~|}|zxuurqrx{|ts|~zz}~xqmkjhgknru{~yw}vsvvxz{z{{xwz{xz}|~{|zwrstvx}||}}||}xxxtpooqnnossvx|}{zwvuusuuvv}}xussppsvxz}}}y~~zyxwx~z{}yuqrolhjknrw}|zxvvxx{zzyzwwz~y||z}yvtsmjjmnsv|~~~}{zyzx{|~~|vuutnmnpomprtv{}|x{}|||zwuustx~~~}zwyupkmnppuz~~wu}}{yzyy}~|zwtuyzusrsonosv|}y}|wyy|}||zxtwz}xy}|zxyxxuw|~{y{}|z{{|{}}|||{{|}|}|{vtxxvsvwvtuvwy}yv}~~||xursqrv}zxz{zyw{~xttvtuw{||xx~}zx{~|~~z{}|urppmmptx~{w}}yvxx{{zvuronrxywx}|wwzyvuxxvtutuvy{~~{zyz||}~~~~xttxuqorrrsxz}{uxzxvuttqrsuv{|xwxsnnqssvy{{}|~}vz~}y{}}|~~{x|{voonnlqtx}wrx|ywwy{~~~|xz~~|xtszzwtvvsrrstxz~|{}~}|vuwrlloqquwyz||~|~~}|yyzyz}{z{}zz|zuxxtoqqrqtux{~}~z~}z{~{y}yrlljijnqvz}~{xyz}|~}}yzz}{wuz||yvx~{vuuspppqswx~|z}~~xqrtojlmnmoopruu{}yxxuuvxx{}yy{}{{~}y}|voomlmpsw|}{~|{y{~~}~}~}xuxulhhhgjlqtz}~zwy{}|||yxwy|~yx{}|{zux}~wvutpppruz~}{|zz{}}z{}}|~~|yuoputppssttvvxz|~}yxyxvxwwwz}{{{{{}||ztqsrsuxz}~{}~zywuvy~}}{z|{}}~~|x{|vusqnonquz}~{z|~}}{{wwvy|}xx~}~~~zzxvsqqrswy|{xwxxxz{zz|}zv|~yttzvsrussrrqsuv|}~|zvvsstx}~~zz}ysrssswwy{~|}xz}||yxvwuxz{{zzux}|tqolkknpvz~{|{||zwxy~}}~|xx~}ywxwvvutuww{}|xz{~}{|{xunntwssssqrqrswx|~}}{yzxz|}~~ywzztqrstvyy|||z|}{|yzz}}{zzyzxutyxrnnklnpsw|~}}zxxy}~{}}|xssy|xxwwttqqruv{||~~~}~~zux~{yvtmosupoppqsuvyzz|~~{{{zz{}z}~~|{trvtpoqruvwwzyy{}{~ywvwy|~}|z{zzy{wssxtolkjloqv{ss{y{z~}~{qowuohljm{vupl}r|}z~~|qkvu|y{vtrzzuypr}lmounlqtzruv~}qx~qhbUdxw{y}|{r{|xjkotqw{}xxmlwwkhku{x}y|qplx~s|y{or|gejyqkffWdggccjmxyty{r~no}zu~yyvrytwwqnkfh|{wopytkz}x|~xu{rw~yzfXhtpeggelcbnek|snrxxsepsflmi|}w|xj{osss|{|ujmpvvy}r}zw}}qqv|xgcdcbbyxqdmm]n~iijerpftwqzhd|tn}zu}z~uvzqr{x~|tlvhZepkv~yrn}xw|u|xcejfsv|wxshkfdtqmiszwljyqfi`dgg|osuiphwwsspynpur{uv|xzv|xpulyqkqe[Wi}yrymbzzdh`etkf{zxzfnrorkiz~~v}{up|xt|ywnbgcVvppy}|x~}wkrsgldd}vuiftmleqxrplxwjjfgfZtzuvtzimguv~qyqumoktuz|{y}~q||uuvnt~~pwld\]nov}}hzjhebqoet|x~lhzmtndl~tvz}vzwsv~vzklkV`}ty~m~~|z}{xzsxwo|wpn\j{nrropfxsroq{rgokoa`rorsrljg||tt|vunnllsoy~{tx{wzwxn{y}qygd]_kiqpnmfkyqiz|x}he}vmqqio~q{zsy{wz|v}t}uxmnmWczlq}o~~}xz|}uumw~pp|vuoYn|s{ruslxotos|pirpq\gnip}vonhn~wux{~qx{fjionk}{}|{w~~qzwssvwwtfd\gh`qzyomi{~qt}}q`pynsrngzpqy}zx{{{y}vuxu}roo`]sibmtu}~~~w}|w}{vnxrwwrnmfahp{wvrozwopzxo{wreppllijx|}zu{yq{{y|swwmrth_mnaz|y~{s}}xqt}r{{|}ogjgRVivky}vy{zw{{ozqjkw{xdgy|sqorxqvwxvo}v|yxrllk]jrq{pq~{s}r|s}~znjqm^f`ecbowryuwryl|djl[Zaztl{}pzxxxx~|yqxrgzqwqc}{}~t~zwzyu||xww~~vrracmZ_ausvtqxhkczrblcjnkowq{~~{zvyytyup~hbm]ec~{~z~|}sw}ywuvqymjtc[afgtztvm}jvrrzusuiaudggux}zwr~voolfpx_ffgrs{}~zy{nvtvz}}xvtk`j^_oeyry{~{}zizzqprwlwtghlnmxrz{protpyrzwrsp]iogoy|{|~svoyp|w}szr~{{bmpp`\phuzz|zuz{|ttrhhqbqwvuxwto|nxyy{{vl~tplrpiupks|w~vu{vy}{}|n~~wjnm[ZXn]\kq~{zwnzzq}{guyyil{ouut}{}svwuux{vqolafmax}xu}}{tzy~{tynkqddeckfcjjd{ztmpsbbbzkgswv}|z}{xwvumvyk|zzwbnzx{}y|{||ysvxxurtuw}tpri]jga`lppu||mlomfjksrnuxo{}~~}{s}|poy|jdo__b~w}}|wzvz|}|{oyyoipnekibefil{wz|ptv}{rusgkuoltz~xvu|vo{mfdur\`cmxw~}y~zq|{ruy{vzwmlgd^ib]ru~xtwwptynruprtvuzz{vsmn~jlntvkjkbbsvwv{po|onu~~{vq{mixuxi^lpkbozu|{}|ttqnjtqh}z~}wrunruxyynlvpgipgjtt{}|vxlmjkw~~r{vx}kmhieX^dafix}xsqlpuj|~yilwxwwt{z{otrmmfk`evpr|zwu~uz{y|z|{rpejo]e{e\cWeo`r~vwxseavtnxw}{rr|p{q}u{w|s^vzktvlkyy~w|~ytx}lgym}xt~{t~yvzooh_ik`Z`nppt|v|ptssz}|evt|{yzstyum{stolo\fnbj{{vyv|u{vzzu|uzmjsk\ux_c][l_]tr{z}|uiqwmnqtropvst|ydpppwoersmwwx{zwe~emlr}|r~~s{uvqgmld^Zgdfds{xv}xkvstzvqztxwnwvvzxzdio^bni`}|zt|wzzu}~|w}||spxq^u{aeb\me\nnmvftxx}snutor}~svvvrynlvqvsjquemjovs~y{n|njiexzuw{szvwymmrjg[fd_abqssxz|ptywoqv{wxq|{sz|xeum`cjZbvr}}}|xyx~wu|~vyyzyvu|ic~r_b]fpeftpplYo}}vrxx|hvvx}suxszlrvtysiwvgnjonjx~z}|x}ppmgixupy~t{xzynpqkl]ge`aapmiw}~r}|tqsx|{{s~}rx|}zjwqechZ^ypiqsz}w}yr}|}ytx{x}~x}sg{wa`Ydricsvoo[_xx~u{x}np~ytz~r|wsxynxzvmkxjlknsinzy}zyxsy~okgxxor{xw{xunuomg`k_c_fpgjt{xuutxryy}}y{ry{~qp{odbcUfxhfjv~~}~tqzt|twy{~y}x|nnta^ZjpgcrvqkYbxv~w}yzlv}wrxxt}zt}|ytujjugkknriovwyzwzq{rkl}wmozx{wzx~totnqeel`c_hi`hpx{yt|~yvsjqoossrsrpuyw~~||z{|wyyzzuzyoop||yliijnstxzy}}uqhruy}}|zky}{{{~~}z~vussv{z}}{}zu}yztmswnmacgc`dcelqz{qzqX[~gedcjpoqrq~vt~}v|wsurrtno{{~}}wsfk|xsouspuxwyuozx~vgzysfafhovstxwzyzms~{~v|rj_Yd[}sssrsj_`ngfnf_gmq|{lhmo~n}do~|yhdjlttmfpvw{vwqx~rjmhjvez|ojic{vy}nksu}}~psst}wtuvsvu}sxwyy~~xtcbbO[bpzrugjplgafhiewwecnjpowdq}r}|kapqrpvsfpvqu|mjurcpi{y~}~mknbpwu{vry{yyorvwz{o~~ry{s|ywz}vupeloZV]j}vjrnhtpcdpnm`uxdfqolzssfqznw|n`prmkoygjt~wt~nn|~kkjwtt~y}{nmriius{ytzwqrwz{qyrzwyw||wr}rt|udjrfW[`zrpvhtuk`ppqdk}kbingsxslj~vv~vbgvnlhzqho|sxmzymmm|mx~zzzxtfih_otxyy~}z{st}z{qysxyzz|syxss{ldnqa\^i}sxpkyshcvrobt|faiigxvsiqx{p^ktmjl}llqvsp~upmqyo|z|~ztkaea^qw||wz{{vuz{twv{x|w~|s{vu}~{pwg`kna`bnw|qjzsidyupct}f_fecvwsjs}~q^irlgi~pqtwurxtpp{oy~xvq{i\_^[q|y~|yxu~|~~uzu~|xw}~}}x|}sz{}{lrh\gpifmn~|{gyvpctysimo^ce`oztnl|za`omjdz{uvy{p{}uwm~suttronXY]Zm~y~u{w~v{x~uvyx~}|~||tz|~y~yvukmgZdolkwsixxqfvwmlr_bf`lzuom||c^nlhcx~yy~{|q|~x|n}vvs~r~|pl~kUX]\py~v~xt~y~{~vvyy|z{vx{}x~~rwnpilc[gplq{w~l~wri{~wlsn_dear{unp~x^aolhg}}y}~}yu{|{p}tyu~yqyjq{`TZ^`z{{zv~tzw}}yyww|xy|~~w|yzxzvpolljj]`knk{ytwuor}un}cafbh|xsl}~j\knket}|~}~u|yr}zyv~szqzzoj|lUW]\n|yzryu|}~wu~yxzwzvvz{vy}x{knhljl`^hlhvzx{vwtpxoh`ece{ztlyp]inkep~||z}|}~x|yuyx|w|t~xsx{qj{nUU[Zj||qwt{~}xu|zyzvztvyzvw|~}wzhlfkkla_gjfryrxywt}s~kaggez{vowt^gokfm{{}wy||{|y{uy~x}{}wyvts|sjxtYSZZc||tssv~y~|y~y~y}}uxsxw|w}u~yz{hidhkle^eifj|oxzvyyydejerytqfaomigw{wv|z||~rx{z~{qytpzwmn{gSV[[q}ptr{}z|sz{zwtztuxyvux||txdfbikkb`fifs{q|}{xxsdhig{xrtzaepmjm|}ww||~{r~zz||{|rusmyzsjqybSW\^x|rvu}|{|s{xyuty|wuvwusv{|q|vbc`gjjb`fkiv~t}~|wzwghih|ysszbeqpnqzy}|}}rz{||z|ptqkswpimxfUW^`x~tvu|~z}rwyx}vswwvsvr{vp}~{yrrzcb_cgie`fmoty|}z||}kfiguywni`mrrs||~}u~x~{~y|myvnjjsnihvo[X_buzvvzz}|u}vzvz~xrv~xyqtq}xxly|zw~{slye_]`figbfosv}}~{z~~ohjhtzxn|k`nsuv~~~}v~y|~x{~lwuligolhhvq^Zaex{ww|z|~|s~v~yv{}vrvxxrsqwslx{zx{ynlvc^]bfigcirt{}~{~~niki{zwn|gcquwz~~s{}}{y{vlzolehmiflxl]^diyxxz}zpw~vw|zssx|}trqt{y~koyzy{~xvhrn_^^ehieemst{yllkr}{rvqbluxz}y{{|~xy~|kutkidkigiusb\bexyy}{{|{q}v~xvz|tru}wxrrq~umkvyyy}wwjmsa^]cgifdjqr}{}~omlq|ustdjty{~}{y~}~xy}{kuukjdjigiutc\`dvzz~{{~|{q}v~yw{{tqt|{uxrrr~smjtxzy~wvjksc_^cgifcgnoxwsoor|yqwfisx|~~v~xx{|mqwkkdhhhhrvg]_bp|{}}z}}yuux||wz|uqrx}stsr~u|qgpvyy|xuofsi`^afhiceknrvzrqp}r|lfpw|v}zxy~~tjwokhdhghmwqb^ag~|{|{}z|ov~yx{yrqs{xuzsrt}~r}khqvyy{tuihrd_^cgihcgmnwvxrrt}}q{ihszt}xwy~{plxlkecffhoxob`dk}|{z|x{}nv~xx{xqqt|vwyrrt|}pzigotxxyrthgqd_^cgjiehoqzxztsu}~q{kiszt}xvw|~|}z}q~}khcfs|yolmxyxfstckZkb]c_ckqogkr{}topjhr~|sqqt~ko|t\j]kdakehpzzs{y|~uy~nusoxnqdkaligvpot}yoswro}yyv{kusmt}yhpqvnyvy|}yncs|vscy}r{okvrvcpoko~~}yyz|dnrrjsov{yvjoroi|u}~x~~o~|wy}~p|yikkhbwzzh{{qfojfolk]mkfjywxz|rx~{}tlnt`pzwpxt|w|mckpok}zz~}}q|y}}ryye]ekih|wtjsikpmf\nfdh{svxxnz~{v}|ripo^vywpyt{wxfdmsno~z{xszy~}s}yt__gmfo||}rntfqnm_`laclzqtupn|yu{qktfazut|yxyrbhptjx~|~yoy~uyv{yyi\dmmfwyyosojumjYig`durqrsivztyxooq^l|r{z}wygcmvpn}~|||yoxv{}q~zs_bjpepz}~vtvjvqn^`k`alwonphmzvtuptcawx|xznbktuky||~}nz{twwr~{ydaisjiv|~yuzptypg\ld`e{|nlmjd{{xqzstl]r~u|{yvdhrzmtz}}|urut|}x{{r}{p_enrett|{zp~vq`dlaamulhl`myutyttba~y||y{mdmxvm{x}~~o{}tt}{~qrzzyfaitmjwu}wuun_mjbbvpihi]v|xr{~wuo^jv}yzhhp|rs|yz~}p{tvzzypp~zvcdjujqwxuytmaoibd|}nfgd^{zxq~yvk]pw~~{zvfjr}pyz|}z~}{r{twx{vq}p|ysbekvjuwzv{umcrkce}~negc]{zxr}xvj]rw}}}zzwgjr}qz||}y~}|s|uwwyup}p}zxsbdjtkv{uxmuj_efnoyywz|~uwqmjyx}wuwosx{soz}utwxv}wyww|rs}z}p|ywwqgykfnv|wosvozvlru_Un{|~}pq{{{rsoqvw{vvwwx|w{|hjmwyz}mthuw}x}t}~le[jxtx|rmTf{ghnxl^sgc\_]d~iij~{u|lZxw}mv}}}ywsnRez|rqoy{o}nwuspow}t_TK\dj~ymeq]\baigeusqmuxqf]iddw|pt{mqu|t~|o~jhhac{qgx}x~x|rc~zmpm\UVm|wyhfkbQhs]ce`trk~wmoV[|xt|vyxz}v}yukm[Wkiw~wzyqm|~|vvo}~~vddOU_Ur}|nnhbgbeuppgoxokcjg\cm}~y{lj|q~s{ypmoj]\nozpw|szwxkuh}~}z}rgWUa_nyxv|fVsjXe]cvjqwzsVeobq||uyvv}}}}v~~}wx__g[e~ix||xowxsrc^gXUjozzolhakqnjhvoqinve`caqjzyg~luqx~|u~zzo^ge_qx|~uu{{u}|tikguvl_dYYXkygys^`\esmk|~|{ffufakoo}}yn{~{}v}}~lnp][faauu~|xtzyty|z{yrpwj[fhdngvxfmqkogtrnkpzrhjegYbvw|snlmsyws|lnn^ealwwx{zvyzvxoih{~mrj]XVejm|oeb`tthsyqf{xile^f|{tu|xv}|wv}|s{qb^cS_|twz~|z|xxnu~~yzrngqhfaSjuwqrmlyorlu~pnskiXaifj~|ypogx|zpwsuuefafggy|sy}u~{t|ymr}sq~u|qi_Ze^\ozthiyslr|}phzwuk_Zolwx}w{v~zu{|}szjbcS[pihpyvt{}th_`b^ahgXTlv}{x}t{{roz~zupsqbinemY_my~xxy|ml{zvtmyysyvjer{yvnkxp`knax\U`jqqpuxqlowwx|vkxyowvdq|qkzunsvxssxoynnzw}ujhh}~~{lx~}r~vsrinkih``fs|xcdvedlks{|maa\v{~ksuylt~{vwqrtx{~utywksmosthjby{umnkh~w||{zkgjmsuhVhbZYesxqycZ_Ufylo|vnxznnuvq{x|zy}~jzxnl{umtiwsefosm~|vrtorroYffZXkz|osz`[cYa|{mn|vunyuiny}usy{|~z~lyzmnuszow~~mbitwsy}vvtoqqmYheY\s}}lus^^fZf|{{~iuxt}snoiq||yu{z~||k}xmrrtzn~}~{hbjuuv{uytrqtiZkcZay{i|k\adYm{y~yh~vtyqq}zjjt~x}~x~z|to~smz}zqxvo}}scfnup}}w{uxux^ck^[k}}qk|a\d]]x{omzs{~toy{~~shox{u{|~}jzzporryov}|{jdjrpr}|}~|{x|o\ne]ay~yh{k\bcXi}{}yi~ttwrq{}zjmt{t{z}qq~rn{}xqxrn}|qdhoqmys~}{]lja]p}zkpu^_cY`v}zluxrytnx|~okrytw~{zzu{tn{j}yoy{{wuoi~ts||}zzebxzwwusogvidi}rys{zuqz~wbVmvi_cndeiv~}vmuvvz~q~gfturz}t~xt}zzp|uj^fmmm{vxpr}{syhenq{uryrzxgm}s|upsrjXPhgni]`Z`nyux{sx}z}ntjjiunirzxwzm}x|w{nrrrly}~{l}xhWced|~{iajqmnnbunknjrp}qssm}vz~wqrpz~uttqbijjhhq}ty{|tsqlkozucozvfpfo}wz~m|}}uwtf\o~y|vwivx{zlmt~ql{u`_{Z_nut~rqhrtnv}{kiupusswofnuwsgi~s~wk_xpr{x|~sklq{qtzgj|zmnousfmbeW]lkqhcov}}uu\dvo{y_jzxnu{}|hhnz}~|r{x{zu|{rlrvntpqyux{sjlsixvpocSZgpqg[rg{|~pc`emnbl|u}r}|vkvuztnu}fwl_cbrq~|v{wzttce}~pyeaRXp}onhlYcwigmoskZj~zpmo{{v}{z}qwqszm``i}~tuu||fuuyzlns~~~p__dcoy~e[\fplbitqksstsfsgbU[r}|rxvqy~~usvwkxtafywmwypurlw|~obi~}}ofca\V|{id~xrttulmf~tyzvsg\grq|jjgeztrw{{tsmnc_vn{tzjxqy|oxizyzyeshdgZbryfwpkaZlmsj_jsa^`]Yay{|{ynx|y~stmolhp{|qikyvw_q|yz~~uqhZLQy{vogopgju}ik_Zn`lnjusxwprxyqv{mv~n`q}pdakw|zyqkxyxy{}|sjheh]fvufhjbZgumnd~}ytthWWtsvm}yqx{w{wng]tpx}{zne{x}s}qhuvxwapk\clx|wdvtntkhjt{uovkcc`gh^p|~yncjzquz|rtwxyomrrlh|zx~wyg{uv}oYQkphahzrbgyoqxrqd_v_bku~}xqt}twx~xuuw}omlifnt~p}rqlwyvr}yz|{utwph^^`]~vvtxo^~vuqix{q_NRlqjkzvs}zt}vlwytx|chYhp|zo||~zz~qvw{~zyv{}tm|{ng\qsnt~|lujqppqnxuknpsqjgqnqusoz|{~~|{~pk{tmywpcXj{}~wo~v{ls{pmokfZamwzhatxhjrrohu|nf]ntsx{svuxxzlt}}}wichnotw|t}ss|yrmzwzrvqc\bk`rm}ywmqrvvqlfikg_gtknuy|thytmsulagogg`w|}pw|tpqy~}fquabS\jruszyq{~}miyuc\\jlr~yzzzww}{x|{zynnpiaZajv{}{zyqsswywmgxwv|}~~ytwimh`_^ca_m}||pouz}{~hd{fidbwxqioutoz}|o{oalxrkhqzwz}||v}{xrux{xkkwc]`YSShw~xss|vyvo}nqojehliiszm|w}}ysy|~wr|}gWpgjsw|zru~~{~otz}|zy|}{yz|`inV]bgo}{{tx~vmkud`_\WZv~sv}w{xxosac^^en}}y~}kkuy|zt|zyn{~ystlVOav~tsv||xy~ydsm^dhos||qwwnv||rimzxcSV[_hx{|~{xllllx~{uvz}ylloljfebSo{wsmlxxo{{wj[^xyqu{ywyz|xorxyvqmr_\wjqsyxxu~wr~ngltx{txrv}tsm[qhW]cnzxzwvszyuw{wsrpbj}{pm~ymnkefuz{qy}vqvqgj~yxxw~wg~z}vnyuwosvn_W]kk^]iqy~|qzz|fqxbajpzxz}}~~qryyvw|shghknqztqvsttq}~{zt{yuvw{}tmnlic]bhYqxp{tw{vnaapumghsut{|v{kn|~|~ymm_\uplrz{{}|ypsvw~}{}riiffixzmhY`kllt}y|}y{{|ysutmihomh|~|nkzuvggg_WWd|{y|~|qztyhrjwlrsoljkk`Y]er|~wpqqnuxtcrz{{||q~pootvz}ujfehikty|t|vurnfh{yz~zlhp}vnkjebjdwu}z{zvnegs{uzyv||tmq}|pmmjijxpee\mu}}unpru{yyyz{yxhh|jdaRV\^bj|}rz|vwqlxp{~{}~~{w{|jwssrlhejomnt~zru~uutpt{qrhwz{wgv~qljkgef`ZZ`ny~yrpoc_dlns|utqu~}oxuiemuqlot}}~~~tx|yqqu{zyurqjdbjy{mc[VSQ]ohsyyzvzzwvvttoipyy{}}ypopuyxxo^ircjkjv}twwqx}|wpllnkmsm`oo_`aeivyxyur|wokcbl{y|~|tw}uwrlphgeelrwz~z|mo~rsyv|~wvstuqridu|yxth\SZmx}~o|lnppw{w{~pjkihhm{}pdZX\bu~|uztopqvx|{wsuvojhhkifd[Rdvsyzwgbjzv~~xrmlqspqri[jnfo{}wrtvqs|ykfdhs}}ts||yxvrimb]mg\^dlz{|}||wqid|{utyxqnlsuqugn{yvrlgbiyxz|~{|~lluv|}ykv|kni`a_^[[fmjebgqy~q|toow~}~~}~yvvvvu{}xrkijhimkj{}xts{{w}{slo|~vxtqnpqpmgfgdaac^Zs~{~xyupqu}}soqt|}tvlp|tln]auppw}|}}wurrrruqz{ttstw~rgdcetyjmeWbhjnpssr}zzuptqex{nk}{sxphb_[W`py|yw{|~uwwwmev|z{z{~nn{pjnrpprle\X]dkuzz|~z~}yrttr}~npportv}v{y}wihgt}{}z}~yw|{~roz|qwrx~uuqxwspid]]hoouqj_iw|{zw{|og{bNMZemv|y~uswjdgsw~wulnuz}|z{w}rqvvgdis|y|~|wldvzquwzcYd{uageYVhngfjfq~~yuu{t|lfu~jbn{wytnikv{fhqr|zz~y}xmijhjzzpouzz|o`intyomkpstlijkonl~uktpylglnvofkt|~wfq}|zorrwtu}uxqgvin[bvetx{su|yy~meSX_kvtzosvph}rq\vxw~iarxhikv{txl|ynqt}~yt|yvzgZZcp|{{}o~su{~|~}tg}z|yndbc\foy}{hcfjwzkqztruqrl[rjd[_x}vcfsrxvlyzaiwfbl|wvyndgp~~pdff^P]~tmjghsuulwprjpjcgolq}{oxnlijwzxwnqZhpkktsmxn}ln}{oat_`YT_tzx{zltnal}rajvb\`gj_f}zizst~|mz{~r|kphkmlv{urmpw~~|}hxy}vpooaNY~y|{~}sltoltnk__qcmfeimw~zov|{{upxtao}r_Ygryvx~tz~wuy{xzmbc`bgYps|ortsf_|{xnwqggnmdZmvplqu}ty~wikXivo~yl|rgzpv||yrc_sX^grwwptjgikv}ykljfchkvfnyzhxvjro|wzozkhivrkr{~~{zws|}waNYok`g~|lcz}onjwwgiZukbnuyzwyzqt~{m|x{|~mhmhinsvu}wq{y|x|z{}wrsspkacg_{yva{zsl}{ugSZxvjepzwkh}w|{~u}omqxim[pygyxhpzz|ywz~ynr}yt}wpyokzh^dnw|uaYYhqrphemqvvp_hwtyzwvqs{}}lo{ekqf\bsx~qmrpx~yzvr~dz|u|rf_Zqy]Vds{d]gniomheejjghmidz~}}}{|qn{yktwi[t}ek||dis|~u~sk~xvsvzmZehUkzfiovywoxztou{jTbthmneorwkv|sws~nxzvocsuVm|mp~x|zxv{}hq{{z}vxwyd_eXsragupt}y{xuu~^`oblpspnszhp|v~wq}j}tqkgeXvwjoxx||svll~wtywwvlnqj`Qnom}{w}xllwv}xuxk`leim}qflqziyzt}xu{kkwrk]rpo{}{u|rg|vsxvytn|ze^eb[Smun{xpgqy~trrpl`tocer}ntyszkrxnsogjlkcmrq|{im~|xj{w|}{v}c`kj]Tcrlxqgmvvu}xxqkWglfhnvyzyoxwz{ynrhlngcr~rzshp}|fvw}wwtrldge\Ym~vvdhv~wslm`noiextxpqyt}rwzxvo~mkroc\i{r~}or}{~hy}~{zw|ztqvc^hg_Wh}z{rho}vyxwup\lmnnpyurz{rx~rvqjphddv}u~{qq~zx|yl~{ytszlswc\lga[s{}qilzx~smnf^song{k|su{q~pvy}qxxomwkhayx~xu{}~pl}}{xxu~weynaah`aa|r~zqrzyywon\kwsmqxqyw~ysp}tjwkmmcahszpp{|yz}k}u~}zqiyldnia[hyvxnr{z{vqrh\sswi{vm|xw{tuy|~qx}qowec`}{{~zw{|~|kn|zyt~}}|}w~ufzsdfja`a}ryv}t~uko`\fn}}}||{xqdz~vmsf`bcc]^yy|zy}}{y{}vsjijyvxtjba]cVcjiee|vs}{}z^d{yluyx|~zvmrsvibt^l][\kypyu|mmuv{l~vv~oqpzoercbdbjhop~w|vmtxzrompndytnwzq|~z}||gl{lskkoseTm~yx~ytxi{{qklsxs}vmis^Yir\VZhnliv{ur}mqor}v}~u|{s|lddkzrrpgcgglhi}w~ovrysypl~{wyx{tow~yf]fQkjitmlxz}xz}fd{lfoxwiw{glztuszoabschls|{yjnwz{ytrwwxyxxsmozufnspZmr^[cksib|xoxc~~wsprv{zjx{uk|zylWUmyofmyrt{||wqmty{{iqssgdchpm\\dbamt}uw}zr~nrulq~p|}w{}~qrsx{{{|tjlptwreslr}vtu~n_p{ztxzux{|m`x{ga]bi^dWpzmwz}utuz|tksvy|u~xtfzzkjxs`mvic[xvlr~wz|~utw{xxwy{}xquxzwaxqg]YhjodWcu{pmm}ruoz{~qznquyqe__ckmcnz}n|tulptsi~t~}vwb{vemonjdefY\clv|{nwshz}zknwxytzx|sv{hl{h\_dtozv|v}|zqkirx{u~vy{ydXnyh_gg]MVhddcx}|vxvnowx~|umxyyvZtkdc`s~|t}~qvqklu|}~}vtvwwqnwenx`d\UV]iuzxvoxtwvi`syxxxwz}wwsvrpumpkheamigq|y{nkpvjs|pzt~|qxtncywwv{oZRerk`dmxvtmkjxvwn{~|qeqk\`a_X]wx{z~zvwyytqpszuwu|slnqtnissppkk`Ijfelf}wvtprullr|~{wxyzvor~~||}~{worwf^]]WORVekem{~mzuu}ttvtxy{|{xuvtysp{}puvttcn|fekdVKPUfojx{jziUcnmptz{z|wzygm~x|vqq|xxxzxvvpy~suegllraSKTYendr~pxcmtp{|~||in~{uyxuv}rqs~stoox}{|j{|fhlbjrtm___mq_rZSpepxtkcwibfrzy~qcdy{{vdyzutrtrxc|vecimtyph}xx~}omynu~xkljrt}xaxvrvrx|vl}}|yzpyo}tq{wrd_]XppcnPdghxjcyt^^i}|vf`|y{ji}xrqmmq|wue~zausuzlm{|vxxmv|p||sjlfptqhuvzqwqw~~x{jz|zwzr}wswvxrc`^ZqnenSgfjvhcys]]h}{ve`}y|ki{vonlmt}xue}ewwx}mlzzw~}}wxpwu|shjgpv}whuwqsrx~}viw{v|{wr|{vxzuf``\mtes\ame~vjasyc\av{|wh]yz{scwunikl{y~u~e{jt|zrizy{{||wvsyz|tgigny|{iwx}rrry|whuztzyxs|}z}{vgabartht^dmf}shcuxc]avz|td`|w|rbvtlhko{|x}f~kv|}nkwxw|}wwv}|rhjjvwwlu~v~rq~pv{~x|{ufztu~yt}{w~}|uedcixnor\nilymei{ra\fxw~yl]m~ufiwpghlxv~om}|n||zgt}xz}r}}xyz|nklp~ylx|xxzwpvs{y{zxw|goyq|{}wwp|mggiywmxagngz~pggxxf]`uy{{pae~u~ncupgfkrwwjpy}}ipv|ypyyzumoswor}uyy{qqtxvzx~wx{glzoyz{}vv~mtlmp}zozchpgx}}phiyzi]^rwyxm`g~t}nctofekss~wmr{}zhp~vzzmzz{vprvyls|u~x{zop}s}vyy~zzxfl~xoxz{~{tu{j~{ssv}r}fhrhv{}pjjy{k_]ovwwlbh~t|qbsqgekrqy|muz}{imu~zxm{}|||tuyxqo}rzy}ql}~uxtyv|x}}{igx{nsyx|zus|lsyy{urdukpy|tmkvse\fttvnedyxw{dlukekpvpo}}~w|pgwxw|w~un}}}zx{|iywu|yxlpxszwvy}~~zrcm{~tmwxz|xswwh|z|xiltjuz|rnn|~ob]lsssjdl~u{ucqtjhovrto|z}|lk{uy~~zxor|{|z|j|uw|zvkq}uvwx}v{}zz~~}obmz|snwwz{vsyvj~~zjnuktx~{spq~pc]krrridn}tzucqtiipxtuo}z}|liyux~zzpp{~}|jzwt}|{ymm|~|tu{tx|~}yz{{{pahvzultvwzvtyzkyyrixnqv|}urr|vh]epoqjel|vwzelvnkryyso}z||mgvvu~}~yytn{~~kyys|}|zmly|~{st|ry}~{x~zyyynahtxtlsvwzuu{zlz~{rmzorv{|utt~vi^fonpheo|uxyfmwonu}ytp~z{ykiv~~tv}||x{qpy|l|vtz~}}wkmxy{vqwwt~y|t~{xyz|uh_ktwpmuuxxtv|ul~}muxotw}yvvyse`jmnlfjw{s}rftwpt{tzwv}}|||rfny~zsy{|}xx}yky}yrt}sw{}}~qirwxxps}p|{}}~|u~|yx}}vm`eqvslruuxstzykwzuq|qsv||wxxxj`gmmnght}u{ygpxqsyvu}t}{|uhlx|{sw{z|ww|zls~vxquvx~|~tiouuvpr~~qx|}{z~u~xw{|umaepuslptsvrrxwjt~xytuuw||yzzzmbhllmgjv}t{zhqzsuzss}v}|{sgmx|zsxzz{vv{xjt{uvt~uvx~~|~siosstos|qy|~xx}wyv{ztl`eptslpsrtpqxuhr|v|vxvw|}z|||odhllmhkw~v{}kpzvv{sqv~|{thkw{{tvzxzutzxjp{t}rxvw||~vjlrqsop|}su}|ysu}zwxztncbnrtnnrpspovvjl{u{v~xxz|}~wiflkmjit~ywslyzw|xoxv~}||vmhsy|wtywxvrwzpixwut{vvx~}}~pinoqpmu{~p{|svxz|~yvyvph_gpsqkpqqrnqwrgszsz|yy~|thilkmimz~w{op|{{up|x|}ytjjuy{utxvxtsyyllztwt}~wwx~|~|oionpomw~z{p{}}rwu|z}wtxtnf_hprplpqqqmrwphtyt{}zy~}uiilkminz~v{op}{|wq|w||~xsjityzutxvwtsyymkzvuu|yvw||}~rimlmnlu}x~ox~tuvvz|~wrtsmg_enqqloqprnqxtiq|t}y{y|~zmiljljlx~wxtn|~{rzv|{y|wrjhrwyvswvvurxzokxwswzyvv||}silllmks~}w~ovus~tuyz~vprpke_enqqlopoqnrytjr|u}{}y|~zmjljljnz~vyto}{s{v|zxzupiiswyuswtvsszymlzutu}yvv|{~|phljkkkw~ywyny|ru~pzu~zsornic^hoqolpopqnuypjwzt}zvklkklkt~{v~ouvuz|~wywrngnvxxsuvzyt~no|slpssx{}shjlmrr|ugmu~vw~~|vqinvyyqmmt|utytjs}tzqd~wabjow{ynnqquu}}qv{|ro|xyz{wupvvmkr}tip}w{ysk~|ttwvz}xmkoosu~zuqrsquurii|xu~xxytqkowyxpops{}{ntw{x}lg}~{yuxz~ujjllpqy~y||y{|uieflzuvznq~}z{wxy{ws|lfvzyvxyx|~vkjlkop{|||qr}z{{|xvpt|~~wvwx~{wowibv|qc`a_cclyyt{uq}{tnuz|rp~y{{|wunowwumjklu|{||z~|o}zvxwz{y~~}}{|qixwnz}wpmokjeeorsmikinryqq}ytt{udo|}qjlkmpt|{~{~ztntutnfggmw{~|vxw{~svyfguwwuyyy}~tjkkloq~yz}yz|qw{|z{{wuqv~xxxx~}vpwibs~viddadenzysywny~yrmsy{tpw|xzvtonuvvpjllsz}zqxwxwxz}vw~|}}~{ymt~rt|umnmjhdkqsqkkkmsvypxvywt|mgx|plmloqz{{|~~yunkpqpkgjlu||wxx|{qwygjw{yvyyzvlmllps~}wt}~|z|sw}zzzzwvqu}zy{|~}slvqgv|ohhefhmz{uwzmt{|~woqw||uo}w}vxtrmjpstqlprx||~vwxwvuwy}tnvwz~~{qsws~ypnnkjeiprsmmppwz|qwzw~uq|tkztnompszy{~{yyspjfmnoljos{~|wyx|~wpxxhnz}zvyy{umnlmpu}|rs{|{|yt}}zvtqvz}{tvwx|xqz~qq{ztvwyyrx~om{z}~xx|sgfmr~zysx|zqn{|wxwwsrnsz|~yz{|~|yjjos|{|yr~zxtnqs|{{s|{w}|qm|}xwyvwtx~x{zr{{xyy||}sutw~~slhmusou~vmw}xrv{}uqw}yzwvsu~}}||znu|{zw|yxymx}~~yxzvxy}}tljt|trmlhksvxtstrvz|qt|umw}|yzx~yywlw}|~|~~{wsw{y{{{~t}ytz{v|~wx}rjsy|vopykaltwrsvvz|ztmnqort{}y}t}~wrw|xplt~}xxtw~~{{~xt|}~{}|~xsosz|}|ouz||tmglsz}}yqkn|yyvvsv~~~z~wxzou{~zy{ls}}|ywzz}~uw|}xnik{xsrxz|yuuqsw{|pqzzory{~|xzy{{x~moz}y|{}xrpvx{yxzss{xv{u{}pmux~|vpuyhcnuuprtv{}yrlnootw{z{u~{souz~wokv{yvz~{yysz}z|y||~ytoqy{sv{}~tngjpw~||yqln~{zzwwuu}|}vt}}qqy||ypoz{~~x{{|uqvy~~zyqkjx|yux}~yxvswztmt{tnuz}~zyzy~}y{xkt|zxzy|}}xstyz~w{yrt{|xyspvxlluz}wsy{jepwxrstuz|zupqrqvx{y}u|{tnrv|~{{upoy|{xz~x{x~ru}|vvtvxz}yww}~wu{}xqiinszzzyrno~~|zxwwu|~}tov{qox~}zuoy|}~|}}|~}tmoqvxuvqno{}|wx~}zzvy|vlpyvmsy~{xyx{~}zz|mqz{vwvy{~}zy}|zzzrsx}|y|~yv|}|wqqpsvx~{xwrr}zxplor{zrs|spyzvz{|}z~}ywtspv{~~~}}z|~ypopqux}~~|~wy|~z~}xqtw~yw}sy{v{yvzzvustsx~{~y|yvwuz{~yx{ynv}|{uwy~{}vtu|umktx}{uursqs{~~y}y{{vwuy|~|}zjoz~yxyuvx}|w}vy{uw}}||wyvuxz~|ztoportw|z|zutvwinx|z||ywywy{}y~wx}yuqv}xuz}|yzxz|}yyteju~vrsprtx|tpvznqw|wqkot{|usy}|yzxy~}y}{{}}z|z}~}}}qvzz}|tpmt|zvyz}vtqrpqy{}{|y|zrwvx|~}z|z}~{y{xilv~~}zvyw{~~zyz{tv|}~}|{vx}{}yuvsuvx}{{ytsu}whjt|{wz{~xtwvy~z~yw|xsmpw|xy||{z{}~zy~{ifnx}{}uuttyz{rt|uotw~ysljot|~~wtt~}{{x}|z~zz}{|}|}}yqx~~yz|yrmjrz|z~|ywttqtz|~||y|wqvvx{}{z|{}zy{xilu}~}|xzx|{|z~{tty~}~{}|xx}z}|wxvvxx||{{vtu|}mhpy}xyz}{uwxx~{{vy{{upmsyy{}|z}z{zx{z}~|||nq{zuusuz~}y}z~xrjgiku|}yqpr}tt|xxwxyyxo|tpw{|xz}ux|yxvz~}}}~vuzvttx~~~z{||}{{|~vmq{~vvz|~|yv{|zrr}zz{wpqrw}~xywx}}y~{sptw~|}wtq{|uu~~wwxwyy}ynt|~}~|vwvvslqwpjdgkrxx{xuv|wz{z{}}rls{}|vty{qpxz{{{tsqu}z{~yrpuy|z{~|yvv|qqzzuy{}x}~|{lhq{||}~~{z{yqlnpvxx{z{~xvv~~qow|vvxx{|~~{orz{y|~xz~ulf`dkt{{|yvw}y}~}zzz}yuz||~~yx{z{{{}|{kmw}~~{{x{}z}vvy}ztsty~qimwzssvx|ywsqtsuwx{yz{z~srx~z{|||y{~wqu}z~|ullot{{}|y{{{|x|{vwsrqrwx~wsx~}xxx|yutqrvxzsqy|{~xsllpu||~}y{{{~}{zy{yrw}|~~zvty{~ww~}}y|xsw~x{~wnlnrwvvtopu~vz|{wvuwwqvyy{}{xywxxxzxz|~wv|}~}||y|ttvz}zutsvtloy~xwyz|yuqnqqsuvzxyzy~qou|}y{|||xz}xsxzy}vnlqv~~~z{}~{{vxvvwvywwyzzv|~~yturtx{~wrw~xtw{|xqnqtz{{{wy}~|~{xwu|su}{|}}zvyzz}}}~}y}~|zpqw}xtzvopqvxwxtsw~{uz}zxuvuzsqy{|}|zttusuuxzy||wx~||y|y{ztux}~{|}|xxvxyrv~xvwwyusomqruwy|yyyx}rpv~}~zzy{ztxzx|{sprtzzzzwx}~yz~}vvvttsvvuxy~y|~~zyxuy{}zqsz~vwzxqklntxx{zz~{}~|xxw{vrx~~|xuyxz|}yv{~zz}}}uot{zx~{tpsu{{zyuvyyuz~|zxyw}tu|||{}~zxsstsutwxwz{~vx}~{yy~}vuw{|{{{yuuuw|su}|xxwzxurnqqqssvvvyzwpt}~||zx||}vos{||uprsy|{}zz{zy~{wqopnpqtxx}~zzzwvswy{{ssz{z{xtmmptyyzyw{xx~~{{{}{tx{{{~|zxvyyz||{v{}}zz|||tns{|~vqrsxxwwtv{{w{|{yzy|qry{||~~{xrrsrsswxy}~vx~|wz}wqsu{~~}xy~~yxvxy~wu{}{yyzwtpoqprsuxwyz{}oov||x{}}zqqx}}~zssux}|}|z~|}}x}}|~zwrnpoopqutw{}}{}yzwx{|{rpw~zxy}{vonptyyzyx{yx}|{xxy{|uy}}|}zwswvwxy}}~{w|||xxzyxols|~}~wtuv{zzywz~xuy}}{{||yrv~|{y{yvrnqqqstxxy|}|x|~~|}{x|usuw}|||y|yw{}|yxyy~wz{zxzxvspsstuvywxyy~uqv|}z|~~}tqw|z||ustv{zzzy}~}|vz~}|~{xsoqppqqtsuwy}{}}z{~}|trx|xxzzuomorxxyzy}zx|~{zzz}w{~|~|zwtwwxzz~||}}zvz}}zy|{yqnt{zwx{zxy{~}}z}{x{}{{y~{sw}{y{zwtprrrssvuuvw}}y}~~zv{||}~xtuw{|{|z||vx~}{ywwv{{|~z{{wtpqsrttvwuww|{st|~}|y||{voszzz{{uvwz}{|{|z|xw}}zyzvsnmpopqsusuwz{|}}z|~~{tu||yxzzvpoqtxwxxw{xx|||z{}w||z}{yvtwxxz{~||}}{vz}}{z|{yrnsz|xxz|wxy}}{}{}y|}}{|st{~|yz{wupqsqssuvtwx|xy~}vy}|}ysstx{z{{z~wvz{{yyxy{~|}zwsqtstuvxwwxx~vqv~}{z}|zsou|yyzzvwx|}|}{}z}ww}}yxxtqmlnmnopsrtw{}}|}}zssz~zy{{xrprtxwxyx|yvy}}{{{{x{~{|{xurtuuww{{{}~~vx|{yvyxwqlqy||}}xxy}~|}|}xy~}utz|xwxusonqprrtwvxz~zy~~~ww~~~}ysqsuxwwxw{vsv}||zz{|z}~{|zwuqtttuuxxwz{yrt|~~|z}|zsot|}}}~ytuvz{z||~z|~uv||xwwspllnmnoqtswz{{}~yru}~{z|~yuppruywyyz~vvz}~|||~{y}{|ywsruuvwx{y{|wuz{{wxywtmmu}~||~{yz|~~~~|y|~~xty~zwxvspmpopqqutvy|}y}}vt{~}~ztrstxwwxw{vrtz}z{zz{{||}zwtqsttuuyxx{|ysv~}}zz|zxqov~}||~yvwx|{{||}y{{tx~}zuutpnjmmmoosstwzz}~wtz}{z~|xspqswwwxx|zuw~~}}|y}{|{xusuvvwwzyy{|ytw||yyzxvnmt{}zyz{yz|{}~yty|xyvtqnqppqquttwy{wz}vu{~{z|ytrstxxxyy}wstz~||{zzy~}~~|yvsuvuvvyxwyzxsv~|{}{yrou|zyx}zwxy}}|~~z{|ux{vvuqnklmmnnqqqtv}~y|~xty}{y|}zvrsswxwzy}|uuz}}{{}}|{xvrsutvvxyxz{~uuz}|{xyyvrlpw~{ywzzz|~|{~wv{~zwxtronqpqrsusuwzxw||uv}}zz~{xsqrtwvwxx}vrt{~|}{{{z}}zwtwwvwwzyxz{ysu|~|~|ysou{{zx{~zvxx|}|~~zz~uv|}wuuqokkmlnnorpsv{yy|uw~}zz~zxsrsuyxyz{xuw}~~~}|{||zwurtuuvvxxwz{ysu}||zxywuokqx{yx|~z{|}{wywuwx{y|~}|z{x{xzy~||~}}|{{zx{~{yz|{}z|z~}|wvvtwxyz|~}}yyxwuw|z}~z{{w|||{y|yy}~||~}}{{}{uy|xz~~}{{xxtvwz}}~~yywvytrsvz}~~|zx{}{yxxyuwwz|~~{{~{wxzxxz}}}}~~y|~|{}}yvxyyxuvurqtwz}~|~z}}xyy}~}zvxvy{~}~~}|z{~{yyx{sz||||{|~~~y~ww{~~zwtwxyzy{}}~{~{zyx{|{{yy||{xw|~~~~zuu}~{yxxw{~~~~yxxz}}{z}|z~}zx|{xuvyy||}}~x{wtuz{~zyyxw||z}{|{{{{{~v{{v}z|z{~~~~~|{~}|vwut~~yy}zwuvxw|~~|}~}y{}~~~|xx~|}zzzy|{}}~|{xw{||}}}~~}}|{{vy{z|zxx{}~|y{~v{yxwvz|}|zzyy{xx|~|~{{}|zwy{~}w~zzxy}}~|~|}~{}y}~z~}||}zww{xz||}}{|{{{wvv}{xw{yz|x~z{}z{}}}zz~|~}|||~~{|xwsx}}{|yz}yyv~|z||x{z{}{z|~~{x||w{y|y{}}|}}~~zyuzy|~|~|z}z{~}~yx|{zx~}xyzz~~{~|xyzx}|||~}zy{w{~{}}}~||}zxwz|~{~{}|yz~|z|{}~z|w}~y{~}}y}{}}}{wyvxxy{x~zw}yz{y|~|}yxz}~}~}y|}zzz{}~~}~~zyvttwx~~~|y}|xz~~|~}zvt}}~}|w{{yzy|xx~}z{}}|}~{{}|xz|~~z~|wuuw|xz}{{}zxwxxxwv~{~~x}~~|{~|ywxxuy}|yx|~~~{zzz~}|~~~yvyzyy{}}~|~vyyqrrx}|}~}{|z{z|{z{{{ws|{}}~~~~{||{~|}}{z}~{zyttstv{~}z{|~|~{~}vzyzzy~}|||~}{~z}xwwvzxx|~~}|~}{z{{|{z{yyxxxtw{}z}}}|}zvwvzzx}|~|}}|z{|}}||z{|xsu{|z}}}~}~}}}{w}z}}zvvvvuv|}~~}~}zxwuvxyy~}}z{y~~{{||zywxzy{~|}{}}yx{~~~~yxzsusv||~~|}~xyzyuuz|}}{zz{~|~xyywyv{|}~{~|y|z~|~||~{}|vuvx|{|}}z{|zxy}}|~|y~}~~}yuuwuwy}{}~||}y|~|~}|}xvsv|yy}~~~~{{|uuv{||~y{}|{~|z{{{vw}z~}~||}}}~z|}|}|yytvuvwuz~~~{zvx}{|{~~}~}{||zyvxy{|{z|}~|{z{yz~|z~~y{zzxuvy{}~zwww|w{~||{}{}}~}~{{xtsw}|{}~||{~|}}}}}}~~}|{uvzxxvx|{{}}}}|zyzyyyy}|{}|~}~|zyxxwu||~~~~|{z}~{}~~~{vwttwuzz{~~{w|}|xx{{||}}}~}}}wyu{{x}~}}~}zxyz|y||~}~~||{ywwwwwy~}{{{yyyy}{~}||~|~{wuvywvwy}~z{y|~}~z|~wuuvvvvv{~~}{}wvzw{|yz~~}~~zvuttv~|~~zyy|{y}{}|~~}~xvtstxzyz{}{z~xy{ywz{~{}yzz|~}wxyyz{yx{}~~~zy|{|yz{{~~}~z~}|{zvt|w{~~y|yzxv~{{}~}~{|~zvxvuyyvy|~~~}xy|}|ywy{}|yuustvxy{|{uz{xxy|{{yy|~z{{xwwz}||}~~zyz||z~z~}|}~~{xupwxu|w}~|{}yzz{|~~~~{xrssuy{|{||zyyz}}|~{{{|}{{{xuwyyuww|}|{~vz|xxy}~|}~}}~}~|xtrvz{z{y}~}}ywy{}~|}~~}~}xvsyuvz~~{xz{z{~}z}~zw~}~{|z{{xtt}~|zz{~{y{{{}}~}{yxtuvtwwz~~{}zvx|~}{{{}~}||xvuxzy|}}~}~|zzzy}}zzw{~~ztxyuwsw~}~|~{yz|z~|~}||~||zzytvyy{z~~{}}{yy}||}}|}~}zyyxtvvu{{z~~}|xwwx|}~x|}~|uw{{yvwz|~~{xw{y}~~{|}{ztxwrvwxv{~}zxy}z{}~}~~yvtw~}|{{}}zyx|z|~~~}{{zv{xvwtv||}~~{x||~~~~~|{~~||{xwuvy{~}|~}~|~zv~~{xz~|xyyuvuvz{|z}~~~}|z}yuvz{{}}~~{yyy{|~}~||~}~}|~~|~~~}}~}zvxytuwvvzxz~x{|}}~}}|{}{||xu{|wuz{}~z|trsvz{~~~}{w|}{|}~zuyzvwz{z|}}~~}~{|~{v|~{{{}}|~||~}y|}xy~}|~yyz||}}||z{~y}~x{|{~~|~|}~z~|{}||}|x}{}{y{ztvxutz~~|}~{|ytwyzz{~{~}~}yyvuzvvyz||{{|{{}|}||xwxtvyy|~}}~}|{~~}|~~~{}~zzxx|xuwtu|utxwuxwtwyu{~~{wvxytwxwy~}~~~{}{{zx{}~|~~}||~~}|}~xvwxz}}}|~|~~z}~{}{{xw}|yy{zz~wy{zz~}{{~~{xz{xwvwz~~}xxxx{|}}{y|}{z|~~~yvywtxz~~{z~}{|{~{~z~~y{|{~~}|~xyyy|}yzzww~}{vy{yyvrrwuvx|~~}z{{}{vy{zy||}~}}|x{}}{{~}~~|{{{|~z~}|~wwyz||~|}|z}~{}~}||zw~z~y|zz|}z|~}~}{{}{||}~zw|{{ww|~~}}|||xzzz~}{{{y}zvvyvuwz~{~|}{|~{~|}}}~yz{z|}}yyyyz~{zzxu|}yz|}}yusvwuw{~|~}||{~~xz|{yyzz~{~x}}~|{y}|~~}}zz{z|yz~||zwxyz~}}}{~|{}|~}|{wx~z{{|}{|}}~|{|{z{|||w{}{{wy|{{z~{zz{{~~~z}~|}z~~~~yvvyuux{~}~||{}~|}{}~}~}xzz{}}~~zxwxx|{yyxu{}{{}{wuvxvw{~|~}~}}{}zz}{zxyy}{~y|}|~|x||}}||}yxz{{{z~}{}yxxz{~{~}}|}}}~~}~}~||{w{{{}}}~~|{|~{z|}|{x}}||yz|{z{|{y{{}~~z}~}~{~~~yvuwutx|~~}|{}~}~~}|~}}}wy{{~}~}zxuvvxzxxywz~|}~zxvyxwz~}}~|}{{}y}||{z{}~}|}y~~}~zz}||{y{ywy||||}}~{zxyz}~~}}}|~~|~}|}}|}{||}~||}{z~}|~|~}|{~|z|~}{y{~|||yz|~{}}|yz{}}~~|||{|}~~yvtvuty~~|}}~}~}~{}|}xy{{~}~|}~}xvstuxywyzy|~|~~~zxwzxx|}~}||{{}{~|}|{}}}|{}}~z{||~}{yy{xy{}}|~}~}{yxz{~}~|~|}~|}~||||}~zzz{}}||}{{~}}~~~|~}{}~~{y|~}{}zy{|}}|yz{}}~~|}||{}|}ywtwuvz~}~~~}~~~}}{}|}yz{|}~}~~|}~zwustuxwwyyz~~~~}{xzzx|~~}}|{}|}~|}{}~~~}z}~|z}|}}~|zy{xx{|}{||zxzz}~|~}}~}~|~}|~}|||~zyzz||}{|zz|}}~~{~}z|~~{}|yz}|}~}zz{|}}~}}~|~{||}~zxuwvuz}~}~~~}z{}{x{{~}}~}|~|}}}xvsttvxvxxy{~~~}{z|z{}~|{~|~}|}|~~~~~~z}{z||}~}}|zy{wy{|}z}|zxzz}}|~}}|}|~}|~~~}|{|{~zyyy{{~|z|zz|~~~~|~~z}~~||~yy{~}}|z|{~}}}}}|}z|{}{yvvwuy}}~~}~}{}|}yz{|~|~~~||}~|}|zwusttwwvyx{~~~|{}z}}}|{~|~}}}}~~~{}{z||~|~|~}{zy{xy|}~{~|{yzz}}{~}||{~~}}~~}~~||z{z|{wxxzz}~{||{}~~~}|{~~}{~{yz}~}{{{}|~~}}|~y{z{{yxvxwx}}~~}}y~|}|y||~}||}z{~~}{|{}}wusssvxvyz{~~{}||}||}}~}~~~~z~~}z|{}{}{|}{{y|zz}~}~}|yzz|}z}||{z}~}}~}|~}}}{{z{y{zwxxzz}~{}||~}~{|~~|{~zyz~~}{|{~~|~}~}|{xzy{zywwyw{~~}}}{{~~|~z{}}~~{~~|}~zz|~}{{|{}xvtstuxwx{{~}~}|}}||~}~~~}~{~z||}~z|{|}|{z|zz~~}~}|zzz|}z||}{~z|~~}~}|~|}|zzzzy|ywxxzz~|{|{|~}|~~~{}}zz{~|||}|}~}}|}~xzyz{yxwyxy~~}|}}y}}~{z|}~|}~~}|~{zz~~}|{|{}zvusttwwvyy|~}~~}||~}~~|~{|}}}}}~~~}~}|}||}}|}}~~~~}{y~~~~~~{||y|{}~}}~}~}}{y~|z||z}~|}}}~|}}{~~~~}{~{||{zy}z||{}}}{~{~{~~|~}z|y{~~}}{~}|z|~~}|{z~~~|~{y|{~|{zxy}z||{|||}~|{~{y~}z{||{yyxwy~~}|}z|~}}|~}||~}y{~}}x~~}~}~|{}~|yy}{}}}~|}|{~~{|}y}|}|z|{z{~|~{|wx{yx|~{~}~~z{~~}z~~z|y{yvuyxy}||~~~|~~~~|v}~z~~{~~}|~|}yx||z{}~}|z|{}~|~yx|~}z~|~z||yvyzy}}|}}z}|yz}~w|z}|wz|zy}~~|~{y}}{}~{}}~~{x{~}{x{|~~~{{~~zx{|z~}~|~~{{~}y}|~y|}{{}}}}z{xvzzyz~~~~|~~~|x}{y|}~~{}x{{xvxzx}~}~|}}~~|w~~{{~~|}~~~}{}yx{{z|}~}}y{z|}|~yw|~~{y~~}}y}{xwzzy~}}}|}{z|~{x|{|y|{z|~~}}}zz}||~}{}|~}~~wx|~|xx~}|~}}~}~|{~{yy|{|~~~~{{~}~z}{{|~{{~}}}|z|ywyzy{~~|}~}~}x|~{x|~~~}~~xz{xwy{y~}}|~~~}|{y}||}|~}~~|}|yy{z|~~}z|z|}|}~}wy}}z{{z}zyy|{|}}|{y{~~~|y~z{||z{|~~}}~{z{||~{}|||}yw|}~yx}~}}}|~~~}~z}|zz|}|~}{{}~~{||~|||yw}}~{~|}}{}~||{{}{~~{~{{|}||{~~~~}{}~{{{|}~~|z{}{}~|~~}}|}}||xz||~}|z}zw{~~}}}|z||{zy}}|~|}{{||}|zyw{}z}~|xwz||yw{{xzy{|}~|{|~xx|~|{|}~~}}}}~}zyx}~~}~{y{yxzwtx|uw}xz}|~{|{{}||~}}|{{{{|}|~z~zv|~~~{~~v{~x}~}|zxzyxwy{yyxy{~}|~~}zyz|}}|||z}}{}|}||zz}{}|{}~~~||}y|y{~~~~~{{wx}xyyt{~}|{|~~yyz{}|{~~}~}|yz~z|{|~||~}~|~y|ww~{|~}y{~{vywzyy}z~~||z{|yzz{}~~||}zy}~~~||zz{{~~~}}xz{t|yw}xywz{|}|zzyx{}}|~z}~~|yy~~}}{x~}z}}}~}z{y{|{{|~~}~}|{zx|xzxuz}}~|{}|~zzx~{{}{}}|z|||~||~}}~~}~||xx~}yy~z{vw}z{x{}~}~{}|y{||~y|{|~~}~{|yyxz~~|~~~~}}}x}{{|}||z|yzzzx}{~~{}|x}y}z~{{{}z~~~{~~~~z}~}{~|~}}|}{{{{~~zzzy{xvwxy}~~|}~|}yx~|~|{}~{z||~~}z~|~~~}||}~|zxvz{~|}|}vx}{~}|zy~~|x|}{||~}|~~{{~}}~~~}~~~|~}{}}~{}~~~|{~~|{zw{yy~{~{~~|{{xy||{x~{|~|}~{}}~xs}~|~|{}|~~~|{z}}}{|||y||z~|~}~}~|~}z~}{x~{~~zrx~~{|}}~zzzy|}}|}z|}~~}}~~y{|}}|~~~}~}{|z{|{~}~|}}|}}xy{yu|~{}~~{wy{yyzxxxvz}}~}}}~{z||~}~}{~~}~{~z}~~{|{{}|~}~~{uuyyv|}}|z{zvyywvwvy|}~{~~}|yy{~~}}z~}}z|}{~{}|{||~}~}|usxyv}}|{|yyyx{yvwxvx{z~|}||zyz}}{~~{}~|~}z}}||{}|}~~wtxyv~~~|~}}|zz{z{zwxzxxzz}~}}}}y{}~~~|}~~}|~~~|z|}|~}{}|}~zux{w{~~|}{yzzzzwxzzyyz{}~}xy|~~}~}|}}~}~~|z~}z|}|}~|}}~~zvy|wz}~~|~zyzzyzwxz{zzz|{}|yz}}~}~}|~}~~|}~|z~}{|}{}|~|~}yuz|w|~|~}~}zz{z{zwxz{z{||}{~}yz|~~~|~~~~}~|z~|||}~}}}|{{|{w{y|~}~~zw}|x~{{||~||}}}}}~|}~~{y{~~~~}}{}|~~~~{{|z{~|}}~}~||~|~~wx}|z|~}|~~|{{}}~~|}~}||~{zv~||ywz{z|}|y{~~{~||}~y{|x{~|||~~}}~~~~|}||}yx~{~~w{|{zuvzz}}}{{|z|}{~}{|x||wx{zy{~~||||~|z~}}~}|}~z~{~~~~zy}~{y{~|yz}{}{}}{|~}~||}|~}z||~}}}|w{wz~~~~|{{y~}||~~}|yyy|||}zzvuzwy{{y~}zzz|ytux|~}~|~y{x{}}|||{~~||}{~}~ywz~{{~|y|{xuywsy|z|zy~|~}~}}}|yuwy{{{|{y~}|~|~|wwxwz}{}{}}vsyx{x|}}~}~|y||~{|~|z|z}|{~|~|z{}}}{|}~~~}|~~|}~yzw|wutssx|~|y|~y{}{||}}}|~~{vt|}~}~z}~}|~~~y~~}~}}{x}xz~{wzywvqw}~{~y}xyxvwy{|}~~}||{|~~z~wy{||{}|~{|}{wvtwuu{wy{~}~|}}|y{~}{{{{|~~||z|~|z}~~}||~|~~|~x{uux}{{~{x|||~~|z{||zy{z}{}z|}z~~}~|x~~}}~~{{{yy{|{|{{x|{vzxsx~}~~~}}~~{~{}}x~}~z~z}|~}|~z|}z}}}}||yw|}~}{{|wuutvtyxwy||}{~~~yx~}}}}z{~y}|~|{~}~||zxyxzux}~}}{}{{xyzx|{}|y}}{zxy|wy{w}z|{|~~}|}}~~~~{yz}yx||y}~{|yxvw}}|}zywz{y{y|~~|}{yz}{|}||}~}}}||zz{~}}~~||{wxz{~{|z{{z|~}}{w|~}{~}}}~{~~yxwx}||{|~{}{|}~}~}z|zwwxxuyy|~{z|y|zt|z|~zx~~}}xyy{}{{~~~~{||~}{~~}{}}~~zzzy|{{{|~{y|~yww||x{yzx{|z}~}~||}}|zy|~}||~~}~|}{}{~zy~}z{~xvwvz|}||}z}zyzy}|}|{}z|~~|}~{wy~{{|~{{~}|~~}~~~y~~}zz}~y{xv}}}||{z|{}|wzxz}}{z{}~}|~|zzyyy~{}|~~}}{~~~}}}yv||y{||}}}|}~}zzxw|~~z{{|zwwxxy}~}}{~}~}}~}y~~~~}{zy||vy{xz}~|zy|{x|~~|x}~}}~|wwx~}~z||~~|}~~}}~}}||}}}}|~z~|{||y{|y{~~zy~|wy~}|}}}}|~~~|{~~{{zz||}~}~{~}}~~}{}}}}~~|{|~||~}{ywv}zy~|xy{~~~~~~}~~}{|z{}}~{~~~~~||~|~~}}~|z{~|zxyz{}{xxzxz|~{}|}~|}~~|}~~}y{|yw}}|}|~~{~~~}}~}~{~~{|{|{z{}}z{|xwyy~|{z~{}}|{}|zz{yz}}}~}}|}~~}}}|}~}}||~|{|}{xy~|}~{||}{||||~}||}~}{zzwy~~~~|}||}}}}{z{yy|~|zy|zxy}}~~}|~||~|z~~}}{~~||{yx|~}~~|}zz|~|y}~}~}|~||zzzzz{~~~~}}{|}|z|~{}~||{y{||}~~~~~~~~~~~}}}{{}}|ywx{~|}}zz}~~{{~~}}|~|~}zyzwwy||~|z}}~~}~~}|{{y||}{{}}|{{yz{{|}~~~}|z{~~}}~zz~}|y{{z{|~~{~~}}|~}|||}}|}}~}|{xz|}}{~~}{|}~~~}~{}yxy{}~}|}~|~|}}}}|~}~|{z{{{{z}{ww~}|}~}{|}}~}}z{zxxxy|~~}~~}~}z}}}~~~|{|zz}}~|{{~}z{|{|}}{z|||}~~~~~}||{||{yz{z}~~~}}~~zy|{}~|{~~~}|xxyx{}|~}|~|}}}}~}{yxxzy{~}}~}~|}}~{~|}}|}{{{{{{}|~~}|zxz}|}~~}{{~|}~~~|~{yxwwz~}~~~~{|}~}~|}~~}~|{~|||}~}{{zz|}|}~~~}{||{}}~{zz|}zx{~|z|~~~|}~~}|~~{~~{xyz|}z{{{{}~}}{}~~}~~~~}}}~~|||{{yyxzzy}~~|{}~}~~|zyx{|{|||{|{z~~{|}z{{~~~}~|}~~~~}~}z{zyy{|}~||||}~~~~|||{{~~{yz~||}zyz{|~}}}z{}~}~{xwwz||}}~~}{~~~|}}|xx~~|{|~~|{|{z{|{}~~~~|{}~~~{z{|z|{zz}|~}~}{{{zz}w{y||~~}}}|yyz{y~~{y{yxzz}~{v{{yz|~y{y{~~}|{x}|||}zywwxw||}zzz{{|zw{|z|||~|zxz|}~~~z|xy}yuux|{yz}}{z|||}|~}}}~|{x{{z|~}z}z}||y}~~}|{{w}{}~xwx|}xxtyxxz{~||}}{yz~~{}z~}wx{~~~|}~}}{{zzz|~~}~}}|w}}~{}zxvuvwz~zy|}~{}|~{{{|~}~}~zzzvyxxy}~}~|}}~||z{zzzyxx{~zytwxuvyxx{~|~}}}~~{}}|}z{||||{{|yy~|~}|{{|x|}}||wtx}|{zzw|~~}~||~~z{|z}}}}~}~{}||~}~|w{~~~y{|z~~}y}y}|}|zyyxtwtuty~{x{zw~~|~}|}~}~~}|{z}yyxww|~}~~~}~~|~~{yz}}xxyurx{~x{z|~}~{{{}}}~|{{}~~}||~}{{{{x}|~||{{|~{|}{vt{{}zy{z~~}|~|~z}~}~~x|~~|}~}~|~}yxvzzz|y}~~|~yy~~}|~}z{zxyuwuttw}{z|x~~~|~~|~}|~}||~}xy}~~~~|}{~~~}{{yzuy|~}}{|wz|wxuu{}{|{z~|}|}}~{{{}~}~~~z{|z}{x}}||~~z|~{|}|~}|{{~{wvstvuwuyy~|}|}||~~}~||}~{z}~yzyy{z}{}~~{vt|zz|}~}~}}~wyxy~}~|~}|||{}}{w|{z}y}}}~y}~y~~|}{~|zyvw{wyz{~~{{{z{}zz}~}{}~{~~~{zw|z||~~|}~}{}}yy{}}~~||}zxx{v{}~}~|{}wx|{y}}~~|~~{~z||z{xx}{}~~~}{~}}z}|}{|}~z}{wxwyz}~}|z}xxz|z|{z}y}~~|z~yzzyx|y|||~}}{z{z}~~{}~{wvwwxz~{{zxx|~~}{}z{|~|}w~|{zzyz|{~{~}{}|z{}~}ywwxxz{|~}}|xxy{{{z|z{|}{{xzz{|{{z{~}}z|}y}y~}~~|zxuux{z~|y{xzwy|{~zx||y~{ywyyzz}}|}~{}{}}w}~}|{}|zvuvx|{{~zyzz}z{z}~{~}{y}{{}xwwz}|~}~}~z~}}~~{~~}~~}}{xvutx|}zwyy{yy{~~|~}|z~xz~}{{z{{z~}~}}}{|~~z}~}{}||}xvtuxy{|zzz{yy|}}{~}~~~{z|~|z~}|yz||}}~}||}}{y|}}y|~{~zxuvxy{}~~~yzx|zx{}~{z~~~~~~y~~~y~~{y{}}|}}|{~|}}}{~~{xytux{}~~~}~x{x{{y|{z}~~y~}}|w}~{z|}}}~}|~}}}~||}~~{~y{zttxz|~~{{xz{z{~||~~~~~||x|||w{{}~}}|}}~{|~~|{||}z~{y}{{x||}z{||~}yy~|}~}{xvx}~y}{|}{~|}|}}{zw|}zz|z~~z|}yxuuvwv}}{yyz|~z{}}}}|}}~y}zz}{|{{}}{~{}|}|}}{y|}}{xzy~}~{{{{{|{{}{x{}}~vu||}}{{z|||w}~}xx{~|zz{}~|||yzwvz|~~|~~{}{~~z|x|{uvzz{~~|{{{z{~||~{|~~~}}}{z~|{}}wz}{wyv}~}~~{}|||~~|}yy~{x{~|{}}|zz|z}~~}~~|yz||{~~}}z~~}~}|{yy{z}~}}u{~}~|~||z~~{y{zzz}{{}{{||~}~zx|~x}z{~~|y{u}~zz|{{|zww{yz|}~}|}}}||{~{~z~}z||}x}~|~{~|~~~|}zzy}zz~}~|}z~{~~}}}xx}~~|~|||z{{|}|}}|~|{y~~}}|zz~}}{~z}|~}~~~}y{||zzz~||yyy|wwx{{~|~~zv}}|{z||wy{v{{zy|~~}~||}~|y{|~~xx||~~~~y{zz{yu{~}}||z{w{yz}}{|{|{||~y}~z~xyzzzy|~~|zy{{z}y{|}~}~{zy||}|~~z{~}}{{~}|~}}~~xxx}z}|}|{{x}}~~~}|}~}z|~}xzx{z}{vzyzwwxz}~~zw{~~}|yz{y}}}|}|{~~}||}{z|~~~|w|}zx{z}z}~~z~||z{yz}|}yxwzyz}~}}{}|}{w}}~~}~~}~~~~yzx~|~~|~{z|}}~}z}|~}{yswzy~}}~~||~~}~~y||z~|~}z|~~}}~|{|~~~y}~|~~~|~z}|~}{yxvvy}~|{uuz|~}~y}{{{{xwy~y~~~~}yyx|~|~}y|~~|yz~~}{~y~|{|}|~~}{z~~|}}wz}{xyz{|~}}~~}~~{yxuwzy{z{yyy~~}{z~{{{|}~~z||{zxz~~~}{{|~}}}}}|~~|||}wwz}{}z|~~|~~~~~y}}|~zzyyz}}z~~}~z{y{{{zwwsuxy|}xx}~z{~|{{~~{zz}y|{x|}|}|{|zyzy|z|~}}}}~}}~}}{}~|wy~~}}yz}}|}}|z}}}}~|{z{zz}xwvvz|~{x{~xx|y|~~{z|~~}xxz~~~|~yz~~|~}~}||{x|}~~{z~~}~~}|{}~~~~~~}|||}zywz}~~}~{}~~|~}}}y|z|xuutww||yx{~|y~{|{}||{{}{z{|xv~}|~{|y{{z~{~~z}|~~~}~}{{}w|~~}{{}|~|{{{|{z|~}z||z}zyvwy|~}|{~|x~{wyz{}{zz|~|z}yx|{~}~~{y{z}~}{~~}|yy}}~~~~~||~{~zz{}~|}|{}}}z{|y{{{|zwuwy{}{|~{{z{~|}}|{||zy}}xw||{|~~|yz{|~}|{~|{}|~~~~~}~{z{{}~{{}~{{z}~~z{}~~}zz|z|{xwx{|}~}x~zzz}~~}}}{{{}{zz}|y~~}|}~~}{|zz{|~~}|~~}|z|}~~}~}{z{|~zz||~||{}{}~z{}~~|{|yzxwvxz|~|}~{|||~~~~|{z~~~{zz|zy~}|~~{{{}~~|||{~}~~~}~{yz{~{~{}~~}{{|||}{}~~~~|{|{zzyxy{}~}{|}yy{~~}}{||yy{~~z~~}~~~}}|{|~~}~~}{z|}~|~}~}~{z|{~~{|}~|{{}}}{}~}|}|z{zxy{|}~}|{|~~~}||~}zy{}~z{~~~|~}||}~{z|~|{}}}~|}}}~|zy{~~{}~}}~|||}~~}~~~}{}}{|{z{}}}}}|z{~~}||~~~zyy|~{}}|}||}|~|{}~~{z{||~|}}}~}{z|{|~}}}~|||~~~~|}}{{{zz|~}~~||}}|{}~~{zz|{{~~}{}~}~}~~|{|~~||}}~|~~|~~}{z{|~{z~~}~}~~}}~~~~}}}|{{{{}~~~|{z{}~}{{}~|zy{}}{~}}~}}~~~||}~||||}~|~|}~~}|zz|}|y{~~}~~~}||~~~~|{{z{|~}~}{|~}}||}~~{zy|~}|}}~~}||}}|}}}}||~~}}~}{yy{|{y{~~~~}~}}}~~~~~||||}~~}|{|~~}}|}~~{zy|~}~~~}}~|||~}{{||~~||}~~~~}~~~~~{zy{}|zz~~~~~}}~}||||~~~~||}~}|||}}{zy{}~}~}~|{|~~|||}~}{~|}}}}~~|}~~~}{yy{||yz~~~~~~~|||}~~~||~~}||}~~|zyz}~}~~~}}~}|||}|||}~}}|~~}}~}}}~~}}~}}{zyz|}{y|~~~~}|||~~}||}}|{|~~}{zz|}}~~|||~}||}~~|~}}~}}}}||}~~}~~~|zyy{|{yz}~~~~~}|}~~~}||~~}||}~~}{zz{~~~~~~~~}|}}}|}~~|~}|}|}}~~||}~~}}}~}|zyy|}{yz~~~~~}}}~~||~~}|||~}{zz{~~|}}~~}}}~}}|}~}{}}|~||}~}||}~~}}}}}|zyy{|{yz}~~}}}~~||~~}|||~}{yz{~}}}}~~~}~~}|}~~|}~|~~|||}~||}}~~}||}||zyy{}|zy|~~~~~}|}}|{||~~|zzz|}|~~|~~~}}}}}}~||~|}}|||~~}{||}~}|}}}{zzz}}|yz~~~~~}|}~}|{|}~~}{yyz}}|~~}~~~~~}}~~||~|}~|{{|}~}||}}~~~}||||{zzz{}~|z{~~~}|~}|{{|~}{zzy~~}~}||}}~~~~}|{{{}~~~|zy{}|zz}~~~~~||||||{zyyyyyxxxy|}|z{~~~~}~~~}~}{zzz{}~}zxx{}|}~~}}~~|z{~|zxwwxz{|||{zyzz{{{{zzzzzzzz{~~||}}~~}~~|ywvx|~~~zyz}~|{{{|~~||}~~}}~~|}~||}||}~~}{{|}~~}|{{|}}}}}|||}}|}~}|{|~}|}~}||~|{}~|zz|~~~~~~~~}|{{||}~~}|{yxy{~}~~|}~|zz{|~~{zzz{{{zyxwwxyyyxxwxxxxxyz}~|z{~}}}~~~~~~~~}|zxwwy}}|~~|{{{|~~}||}~~}}~~}|~}{}~|{{|}~}||}~~}|||}}}}}||||}|}~}|z{|~~~||~}{}~~|zz{}~~~}}}}}~}|{{||}~~~}{zxxy|~~~|}}{yyz{~~}||}}|{zyxxxyyyxxxxxxxxy{}~|z{~~~}||}~~~~~~}|zxwwx{~~~}||}~~}|||~~~}~~}|}}||}{{{{}~~}}}~~}|||}}}}}|||||}~~|zz{}}|}~||}~{zz|}~~}}}}}}~~}{{{|}}~~}|{yxyz}~}|}}{yyy{}~~~~~~}{zyyyyyyyxxxxxxxy{}~|{{~~}~}|{|~~}}}}}}}|zywwxz~~}}}~~}||}~~~~~|}~|{}~|{z{{}~~~~}|{yxwwvvwwxy{~~|{|~~~~}||}~~}|{{{{|}~}|{||}~~~~}|zyy{}~~||~~||}~}~||{{|}~~|{z{~~||||}}}}}}|||{||~~||~}~}}}{|~}{{}}|{|}~~~}||{{{|}~}|||}}~~}|||}~}~}{{~}zxwx{}{zyxxwwwvvvwwy{|}{zz}}||~~~~~~~~~|{{}|zy{~}{{{{}}~~}|||||}~}|}}}}}||}~~~}|{zyz{~~}}}|||{{{{{{|~~~~~~||~~|{zz{{||{{zzyzz{|}~|{{{{|}~~}||}}{{}~}{{}~~}|zyxxy|~}|{zyxxwwwxy{}}{yz}~|{|}~~~~~~~~~~{{|}|zy{~}{{{|}}~}}||||}~}||~~}~~}||||}}}|{zzzz|~~~}}||{{{{{|~~~}~~~~|{{{|||{{zzyyyz{}~~|{{{{|}~~~~~}|}}}{{}~}{{|~~~~~}|{yxxy{}~}|{zyyxxyz|}}{zz|~~|z{|~~~}~~~~~~~{{|}|zyz}~}|||}~~~}}||}}~}||~~}}~}|{|||}}}|{zzz{}~}}||{{{{|~~~~~~}||||||{{zzyyz{|}~~}|{{{{|}~~~~}}}}~~|{|~~}{{|~}}}}}|{zyyxy{}~}|{zzyyz{}~}|zz}~~|zz|}~~~}~~~}|||}~|z{||zxxz||{|}~|zyz|}}{z|}|{{{||||{zyyyy{}~~zzyx{~~}}}}~|~~|||}}}}}||{{||}~~|{zzz{|}~~~~~}|}~~||~~}{z{|}~~~}}||||{{zyyy{|}||}~~~}{{|}~}{{}}{z{|~~~{{~}}|{zzyyyz{|~~}}||}~~~~~{yz|}|{{|~}}~~~~~~}~~~~}~}{zzz|}~|{}~|zzz|}~~}|}}~~~~~}}|{{{{{|}~~}}}~~~~~~}}}}~~}||}~}~}|{zzzzzzzzzz{}~~}}}}~~~~~~}|}}{{|~}~~||~~}|{zzz{|}~~~~}|{{||}}~~~~}}~~~{zz|}}|{|~~~~~~}{zzz{}~}|~|zzz|}~~}|||}~~~~~}||{{|}~~}}~~~~~~~~~~~~}|{|~~||~~|{zzzzzzzzzz{|}~}}}}}~~}}~|{|}~}~~|{|~}|{{{|}~~~~}||{{{{|}}}}}}}}~~|zz|~~|{{}~}|{{{{|}~~}}~~~~~}}}|{{zzzz{}~~~}}}}}||{{}|}~~~~~}}}~~~}}}}~~~}~~||~}{{{}~}}~~}|||||||||}~|{|~{zz{|~}|}~|zz{}~~|{{}~{z{~~}||||}~~}}}~~~~}zwwy}~}}}~~}}}}}}~~~~~~}~~~~~~~}}}~}|{{{{{|}}zyyz|}~~~~}}}}~~{ywuvxyzywvvx}~|}~~~~}|{{{|}~~~}~~~~~~~}~}}~~}|{}~~|{{{{||||{zzyyyxwvux{~~~~~~~zwy~~~~~~}{ywuuuvx{~|zyy{}|zyyz|}~~}}||{{{{}~||~}{yyy|}~~~{xutttvx{}~}{zyxwwxyz|}}~~~~~~~~}|{zyyz|{zxx{~}||{{|}~~}}}~}{zyz{|~~|zyyz{zxwwxz{{zyxwwxyyz{{||}~~}{zyyyz{}}~~}||||zyy|~}{zzzyyyxwvuutttuvvwxxyyz|}~}|{{|~~}}~}}|||}~~{xvtstux|}|}}{yvutuvwxyzz{{{{{{{zzyyyz{}~~|zyxxyzyxx{~~}}~~~}{yxxy{}}||{zzzzzyywwwxz||zyy{}~~}|{zz{{||}}}}}~~~~~}||{{{|}~}||||{ywxz~~}{zyxxxyyzz{zzyxxxxxyyzz{{{|}~~|zz|~~}}~~}}}}~~~|ywuttuvxz}~~}zyxxz{||}}~~~}}}|{zyyyyz{|~~|{z{|}|zyy|~}{zxxwwxy{}~~~}|zzyz|}}{yyz|}~~}}||}}}~~~~~~}|{zzz{|}~|zxwwxyxvtuw{~}||||}}||{zyxxxxyz||}}~~}||~~~~~~~~}}}}{zxwvuvvxy|}zyyy{|~~}|{{{{{|~~}||~}|z{~}||{|}~~~~~~}|{zzzzz{|~~}||}}{{}~}||||}}~~~}|{zzzz{|~~~~}{yyyzzzxvvwz~~}|{{zz{{{||}}~}}~~~~}|{{{{{|}~~~~~|zywvvvvwy|}|||}~~}}|||}~~}{yxwxy{{zyz|~~}~~~~~~~~~}||}}||{{{{{|}~}}}~}}~}||{{|||||||}}~~~}||||}}}||}~}{zyyz{{zyxz}~}||||||||||}}~~~}{zy{}~~~}}}~~~~~~}|zyyxyyz|~}}}~~~}|{zyyyz{|~~}{zyz{||{yyz}~~~~~~~~~~}}}}}}||{{{||~~}|{{|}~}{z{}~~~~~~~~~~~}|{zzyyzz|}~~}}~~|zyxxy{{{zyz|~~~~~~~~}}||||}}~~~}{|}}||||}}}}||||}}~~~}|{zyyyyz|}}}}~~}|{{{||}~~~|{zyyz|}|{zy{}~~~~}}}}}}|{{{{{{|}}~}|}~~}|{{{|||}}~~~}|{{zzzzz{}~~|zyxxxyzywvvxz}~}}||||||}}}~~|{|}~}||}}~}}}|||||}}~~~~}|{zyxwwwxyz|~~~~}||{{{|}}~~}|{zyyz|}}|zz{}~}}~}|zzz{{{{{{{||}}~~~~~}}~~}||||||}}}~~~}}|{{{{|}~~~~}}}}~~~}|{zzz{|}{zyy{}~}}}}}}}}~~~}|{|~~}~~~~~~~~~~~~~~~~~}}}~~~}{zyyxxyz{|~~~}||{{||}~}|{{{|}~~|{zz|~~~}}}}~~~~}|||||{{{zz{{{||}~~~~}~~~}}~~~~~}}|{{{{|}~~}|}}~~|{zxxxxz{{zxxy{}~~}|}~}}}}~~~~}}}}}~~~~~~~~}}~~~~~~~~~~~}|{{zyyyyzz|}~}}}}}}~~}|{zz{|}}|{zz{}~}||~~}{zzzz{{zzzz{{||}~~~~~}}}}~~~~~}||{zzzz{|}~~}}}}}~~~~|{zyxwwxy{{zyxy{~~||}~}|{{|||||||||}~~~~}}}}}}}}}}}}}}}}||{zzzzz{{}~~~}||||}}~~~}|{zyzz|~~~}||}~~~|{{|~~~}{zzzz{{{{{{||}}~~~~~}||||}}}~~~}}}}}}~~~~~~~}||||}}~~~~}|zyxxyz{||{yyz|~~~~~~~}|}~~}~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}|{{zzzzz{|~~~}}}}~~~}|{{{}~~~|{z{|~~~~~~}||}~|{zz{{{{{{{{{{||}}~~~}}||{{||}~~~~~~}}}}}~~~}|{zyxxxy{{{zyxyz}~~~}}~~~~~~|{z{|~~~~~}|||||}}~}~~~~}|{{{{||}~~~}||{{{{|}}~~zz}~~~~~~~|{|}~~}}~}|{|}~~~~}}}|{|}~}}~~}}}}}~~~~~}}~~~~~~~~}}}}}~~~~~~|{|~~}|{{{{{{|||}}~~}|{zz{}~~}}}}~~~~~}}}~~~~~~~}|{|~~}}|{{zzzyyzz{{||}}~~~}}}||||}~~}~~}|||}~~~~~~~~~}}|||}~}|{{{|}}}|{{{{{{||}}~~~}|||~~~~}}}}}~~~}|{{|~~}}|||{||||}}}}|{{{{}~~}}~~~~~~~~}}}||||}~~~~}{zz|~~}}||{{{zzz{{{||}}~~~~~~}}}}}}~~}}~~~}||||}~~}||{{{|}~||||}}}}}||||||}}}~~~~~~~~~}|{{{|~~}|{{{|}~~}}}}}}}}}}}|{{{|}~~~~}}}}}~~~~~~~~~~~~~}}}|||||||}~}|{zz|}~}}||{{{{{{{|||}}}}}}}}||||}~~~}}}}~~}}}}}~~}}||{{{|}~}}}}}}}}||||||||}}}~~~~~~~~~~~}|}}~~}||{{|}~~}}}}}}}}||{{{|}}}}}}|}}}}~~~~~~~~~}}}}}~~~}|{{{|}~}}||{{{{{{{|||}}}}}}}}}}}~~~~~~}}}}~~~}||{{{{||~~~}}}}}}}||||||}}}~~~~}}||}~~}|{{{{|}~~~~~~~~}}}||}}~~~~~~~~~~~~~~}}}}||}}~~~}|{zz{{}~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}~~~}}|{{{zz{{|}~~~~~}~~~~~~~~~}||||}~~~}||{{{{|}~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||}}~~~~}}|{{z{{|~~~~~}}}~~~~~~~~~~}}}~~~~~~~~~~~~}}}}}}~~~}}|||{{{{|}~~~~~~~~~~~~~~~~~}}|||}~~~~}}|||||}~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}||||}}~~~~}}|{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}|||{{{{||}~~~~~~~~~~~~~~~~~~}}|||||}~~~~~~}}|||{||}~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||||}}~~~~}}||{{{{{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||}}~~~}}}||{{{{{{{|}~~~~~~~~~~~~~~}}|||||}}~~~~~~~}}}|||{{{{||}~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||}}}~~~~~~}}}||{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~}}}|||{{{{{{{|}~~~~~~~~}}}}}}~~~~~~~}}}}|||{{{{||}~~~~~~~~~~~~~}}}}}}}}}~~~~~}}}|||{{{{{{|}}~~~~~~~~~~}}}}}~~~~~~}}}|||{{{{{{{{||}~~~~~~}}}}}}}~~~~~}}}}|||||{{{{{||}}~~~~~~}}}}}}}}}}~~~~~~}}}}|||{{{{{{{{|}~~~~~~~~~}}}}}}}~~~~~~~~~}}}}|||{{{{{{{{{||}~~~~~~~}}}}}}}}~~~~~~~~~}}}||||||{{{{{{||}~~~~~~~~}}}}}}}}}}}~~~~~~~}}}}}||||{{{{{{{||}~~~~~~~~~~}}}}}}}~~~~~~~~~~~}}}}}||||{{{{{{{||}}~}|}}strtoqwwsiloutywttq{}po~noxvia]_edlr|qes~{znlw{tkah|tywlwuzzrlvypx|~wuvsvkiqwpjfogjulhwwoxet{wtvwnj_eja_fwtvxryy{{ntu||xws~l|ttqhfp}svp{||w~x{scg~ypwnhnjuu|||wugp~t|z}wz~ZWYb|y~|hpylghaknllrtdnovk^srutrkjiff{pjcrrqw~q{~~zlov{q~xrsqo|}vr~wzzmyhhmsv}|tmx~uvrozw|tv}x~||{rsmhkegmv~zqnlmoYoeYXcfaoymsnornxgsxphgy|jxqomfjfzxsywr~{qyprin~}zv|~}spibltu}psogw~vm}~zx|{s{xqw}~{tw}`bgahttxrvkg\kwjjpkkirglsdr~rgpqo}mn_jbXcoox~zvs{lswwwzq~vw}uu|xrxn{fhnw|}~zwnxqwzot|{w}{|x}~x|i`ZRtrl|~nl|qosph]l_dhupryvcrqegtwbidcwve`ozcl}zp~rtgtwoyzy~~v}mgptcYz|zqlwwxy~yvyxzso{~pzw~vbnmckksousugcj^pvm]gyib{uuctzydr{ymsk\gdhe~{yz}o|nplvyxsu}txwpvmpnoknwz~{u}por}uu~~zmy{z}}vt~~w~tepuWUcfq}uhwuqopnflsneuwqt~ilonhnsa_\ns][\j{ov}~yq|uz|}}tnjtljtsvlytvzywww|q}yyxztunw|}u~}|x~u{tfefgin|syuqkisg`lsmmxwhh{zsqluojsmfjldoy~~yw~vpzilvgq~t~{msrmaql_cusw{~{rsytnzx}|~{zu||~xpnf`ddZc]|~}zq|tiyyjfojpotomxxnsxliyvgn``uk[Tnwj}ww~wuv}{w}ytwsxregsubs~hvxw~syvwsyy~}ws||y{{kx~}vsv}v{p^jtdn}z|xxnxl}n^jxp|koqwsdswdcke^lorp~xzqypvuoiu~|ry{yzq|igicmkzv~}xp{}{|s}{w{x{~{omuoVgaXcll}|ykzwuqmzkowtnnsdnmlprlifnp`djzvu~owy{~|{|wh~y`bln``qvq~~wqx{}t}pzy~vzvus}w||w}~xt}syp`spipbfmlt}uyngw{okk}tv~se||yumsehqcfiky{w}|x~~ujxuxwxr}ym|vthnslitck|~vylvrzpu~utv{wsw~{zyxu~vuzuwjbffeooliuxyy}uq|}yxsss{oimqhqud__Vnyjfl~}{t|u~t|xyzvjpnx~kWempgs}t~u|zysr{pmq~rw{~}{~z{z|mpzvu}qafimffi~v||rup}|hg}ok|{vnqvzwkzsbkxvw|wzq}zpwsx{{y|wyzuuoginmd`ial~xr}{wzs|zy}z}}~z~{|~ostpm}jddf]dcj^p|xv{}pzuzr}wwrs~wr{nbukm^^fxyyy~{{|y||z}}yxomvxig^j}lemsrxwyx|x{sqs|hu{qp{ow{t~ypwmklkoryrjyxdVjyyzvq{mpxo|rxy{ldxxlgcqulywvztutloxmy}|}~y|rkv~osigfetjl~z}zss{uzz|tx~{xu~zy|{u|}~yuxxvxxasfikbaY`mluy{{xuzyx}zxopvwyx{ktwqmuhjlmw|{}|~}||tzzs}jkrheedhmd\t}y}wzu}~wvxyyx||vzums}ztytpesymjvtf^_lq[akv|z}v~zr|~|rq|qnzstaqpkxyty|ux{u|||{~zqvpjx{}vloqqorpg`mxww{zsxzy~trpzy{zpy{~{{vo{~to|v|uxnjvtksf`kpkggejs{}z{zz|p{qu|tikfc|oqie{|~t|yu}u}~xorox|vf^chzhamvzwuvwwvohs~zo~{v{}wx{xw}rzyzpjnw}emskkYdf]]muqntu{t}}tzsxz~wr~rnst}s{y{~y{v{y~xxyrxpttxmlkrscdehmewqw{~s}x{}u{zzurx{}{~}z}|q~y~vyrvslpurgcfYjl`nfgkmuox~{wzyx|ulvibppuwop~~utyw{yxyvtumpdstqibboyvzzpyzliq|~yxyqpl}zxy{v{|~{tpgnzymkdovnpkadcnpa^tx~~{t{x}}vvxuhfpuruj|yzxrwnr|||yxsejy~umbiomnhkin~y~{zqv{wrs|wsvx~{t|x|wz}swrtxsnkuuqhncbl[[e_mupijrx|~~y}}{zu}zlkurxv|zu||{{m{usmeflhlkdd`mp~y}tyy}xxuxsv{wx{xqq~~~usuwppseqjkjhhlkceuch__usqw}vnxuwjkuutx~}zz~~zpy}{rnesxdhjnrnofokp{z{|x{zqwrnzsxzplst||{zvtmvrfiqxrkkjqqppi]\hdjrdpzr|{|{|w~xtwywrxz|mutky|wvxu|tv|wqvzvmpp|{|uxrsy~{oiicu}p}jlx{{|||v~ztv|xp~wrmkxqmv}z}tlaspab\`^V\ZYgz{tkn{yxqo}rz{{~}y~r|zzumxl{prlfkqpefgnyv|zwwz|}{}~uzrifVfwtppkqkfdhukwxo}upxstpwlginpcph^rjnwz}|v}r~vw|zqmg]or~sda^Xocdqflosplwv~xzz}y~}r}ryyxvv~uqqamskv|v}rimuv{}}{{uzqw}z|sui^_Pgqoyw}yupywrrkrlid_prpxp|yxtwrkx~{~xwy|hrpx~~}oeeqsbpbdztvtmkq|uuwpzt}}~qlsxovlgmeimhkyskfhkqprqpuzjnojxu|~|zzgif^~~|qmxlou}tttxwpwmovx}znghhmnnjchr}{y}zjy~{zz|~|z{xz|~r^qefwuwvx{v{qijghftjgwrqnbkstuzwu}vw{|ppvuv~yz~|xs}}yvwxsx{smzvstxyzywuotm{{vzsjzxt{xz|~~tljkmwsx}|rtunrvhkmfet{u{}rvnx{w|ppgtwissx~yw{qylvzqwxvswstovxvupk~tq~qmrzvmpiouw{{ww|rlxmrxurs}sx{rxgmy}yqx~xqotm}qq~qtuipyppvglsqka[cfu{{wqwyusjsmapjbp}~zzw|y}y{wxwplpp{usoiltmqrmo~zwz}zjxu|{}}tunvwsymrswxptuvy{xgqsi}yr~y~w|wyxyvmtvy~qs{}{qnyv|}tx{z}~xt}uzpx~xxzsnotft}ly{}kzyv~}|~ys}}~{}ysws~{~yqmoo}~wt{qwzju~w{xwlkuqkfjwo~~~w{|z~x|~{~wprfjnehwy|vm~~v|tutnmx|wu|x||v~ryyvjelfrorrhir{}qzq|tdv}bU_eaolyy~~zwyvtvprogty~}{u~}x~{ornyyvoliwjZ_odV\ETginnpv{~yrol{{t~||~{w}wsvscak{ttvu}~yw{}{sjijlwnlZRU[`]bih{wu~wssfsmkrpos{|~uv}syruvrmovxy}znb^Z[jm|ytvkkc[ejknnmuuktzqnnopnplyz~swzxzxsuqnqz{|zxwsl}~|~y|zte_la^ivqtslknru||ppsljqkgihjrfiy~zt|{|{wu}wwzzlv||v{xlsmjgceqxxrlg_hvqxumxw|timgficcn~~y|xq||txtzy}ssqjjs|}}x}{ymb^`b^ehr|~rmuijsurjipoxwspinvxsswxtyow|u~tuvsnoyz{{xyyww|{{}~todcdZ`my|uwrpsx{rg}{juvlecciukmy~tuvy}{|wwwxovusrxrtz}{~~su~wefdbgnvzwurqpknwow|uyqzxpblsjlmpu~uu{}z{wpsulwqwvsstxxy{~rjc]Z\]e|vsohprnjmyorwlsrorrrs{z}wyzzvw}zvnflnnt~zx{v{y||~~yy}ujdbYcsoy}z}{st{vo~ngrkcbgjowox|xxx}{uxzzqqv{}wryy||ox}~ys{tnroeVakou|w{}zrlinytuu}u{wrgkpjoru}y|q}~yv}ylebk{w}v~|sspqw~|oso`[UV_kr}pt{svxtlrqey{jmkmv~y}trv{}x{~xyvfpoktz~}|u~~y{}ywxozxw{wsrtrwxj}}vvwsyvqy|{r{~u~y{{azvmjjmsxwrxxvqipy|{tstvx{ysuxuptuwpxia[dlqw}{wou}wznpyy{y}r{}||~yil}vncn~wy}zny~xrqqzup\Rozmjjnqlt|{vywy}}s}}umrz~pnnoooo|}{smaYkw|z|||zx|~xz}o_bYbz}w{qnrqv|}prunojefjjgicq|vvwnuy}y}t}xy{vmjp|xxzy}z{{ssohpia\iz~wqrv|svqx}|vsljocZ^iio}{wku~|{|{~z~zqljmtf_q|~uvzsx~qlfa\WScvpr}tu|nhknyqhnooollwvpupnmnpqs{tn{shd_foo~~{~}~{{uqe[ZYejz~zvhyzomjhfea`illq}tvws{}s{zzw}zxslgjlo}x~y|ysr}ztxrfhbZ_rwyy}yv~{z{yurpjdqk]dnhozxxxu{yy}wyxronompc[t}~{z|xsjhe]SO[rv~qsxnlqrvtelvtohgrsmuvuwwrooww~qqsg`[_lo|z{}xv~~w{~}tolgWScklvwoxtjhdcefbammi|~}|qw~|y{ruuutrrqmjvxuy|{yut~~~z{{wooj\ad_hvy}}}zxuwy{zvrqiig\emgs}y~zs~xyxtnhebdjdq}z{vyxo`\YUSUcw~~s}ynlmlqsginjhlyz|rstsuw{xy}yqdhqd^ew{{y}}{yyy}ts}x||uokiecZ[r}{}rky{mggfd_\az|q{||tw~vtx~yjnrpmihr~{|~vsqp|wwume]`eZY`g}zry}}yronkacmkuuu}vs}ztvrmhb_``\[_h}yxyyvz{z~||~~wsuohssknsvyvz|u}}stxxrnel~yplu|w||z{|xsmenxsuwtrolttlr}tieu}~{}|~zu{xon|rjhijedx|||ytpuzojjihgehywx}pc\bizlgmumnwwyz{zvv~|}~rx~xy}txwututrmgimkyv`Xlpyvkd^TV^ceajqnignnoypw|kj|yqnkgaZT[o}|wlfoyztf`aYUVTU^liq}z{{yolhaYYbdp|||yxzzzwvx}zy|tupipx|xrookhggehgd~|lhjdgis|vqq~~}splcWOU``kwqwo`cjb_bbecZfy~zsv|u||toq{st{zuwxxum`TNSWUg{wtttlepp]f|wqpog^jytks|xojjrootw~wqpoqrpoxw|yhafmhrz|yxyyutvnoyxvvqdiqjeecekgcv|xtvxwsurjt~woibZ_ehx}qpmfmkeoxwvytq}}wyyvrlhehij}zw~xypu~z||vsvsr}wvjba^[Z_ggadu~ur{lsvlfdabf_cw|xyz{moruvq~|ugeda^\[]_TVq~pgnsidusq}pwx}xxrole[TYjdctlrumjlrkcp{uu{tnqwqn~|qtunkjlx|v~trne[UY^Zfzwsolmngcmhcryutoflvvwqqywqpx{x~{xwxywy|}zmhh[U^`bt~}~{{||{}yszyqlvukhgc^adairyv}{rruuuwroxoigjjl{}{onvrktyy{uvtow{qjigbZUU\cbuyw{zq|zrywofaajqr|wzuiecba_aouhsyqszqebdnrq}|vkrynechk_[i{|ojhgd`^cfaj{}|{tztrpmf[`vwtwxx~wumhc]WU^s|vlcjj`_gfdqzzxtrt{xs~|zvrqyy|{tqomqzyv}||xuj`\WSUams~{wtssrqqv~{xrktzruxnkooq}}vqpliiiltxzzvm^^deow|svwronnqxvu~xrkmwrgeda[[fty~}{|uuw{|wtpjb_dsxuuqvqhgmrkku~xorjjhaZX_nrv}||wovx|qosinohcer}unjgfedjz{uwz}qfej`VYgpq{xouvkc^\__X`x}~ujffeccjjiv}}{{xurnkgk||{x~uqukc^YSONTcpwmpuoopmw|yvtrvzxwwtpkhipz||wsqoor{~wpsj_ZY\fnq}zvsqruofv~{xuqhdorhgppdenv~yxusqpsxts~tpmgZT_kkjywv{zxvw|~v|smx|qjhgc^]iytsxryypmpvqlyuy}xvsnijs{vzvolpumiv|sw|msykgfc^[^hiiw}wz~uq{}ynfjjfdlut{vojfeedflnqy~xnmqjdkolv|wpwwleb^[_a_hqx}roonnqjfs~~~|~zwvrljijhjw~z}w{~vutmie_XVYabf}}umpwvmen|~|woq~orwvqmnszwxxussrt~vs~}}iekdWRT\a]fy~tnwmrzrihnpd_jwxt{utsrqqvumr}}urojaYarniyuy}|zzzs}}oitsicb`\YYcqro~|yxy}vs~yr~wqnkgdemsqv{uqnsyspywyyy{{xnheb`aikit}}}zwuw|~ypipsmnka`eglvy|~ytpnmmqon}}zzuriaejilkn}~{qqyshb`\WXbkkm}}w{tkhikngfs~wt~{yxvqorzzrzvz~vrzzlwrd`^ZUSXdklz}xoo|~pp~}zrjt{jjpojiny~|~{}uolkllo{{z|{lcgi_Z`ntu}{zxyxw~|ypiquleceihai}vpppprxws|zu}|qkgda^\`r{|yqw|}{tyvmheb^]alxzppyywyvw}zwuutqnlifdelyztplmsyywx{txwkklc[X[bnrs~{~wmgopfchcY[fswsoljkovssyzwrqlb^ly{w}|w{{zy{}nbgnf[WVUSVez{y{}uoqxzswtl|{spomjlu{~}uqsyxpwqhu{k^[ZWV[gsv|}ywtmo}|tz|yvphly{shgmnnt|vqnnnqxzsz}si_Z^b_cpvy~{{|{vmlusidbacijmz}}skiklqupr~{zw{yqmligimsz}rs{~xtw|wkfdb^\_hsvyqoy}us~}xqkt{mdfheabhu}}{tpmmox}s}}ulrrgabjtuu~|||{q{shhqlb_cf\Wct}}zusqopuvor~w{ronia\gxunx~uy~rmurg`^[XW\jywuwyzsvwpq|rt~wsqolmr{|x{xspszysx|zumoroe[WTSV^ggl{}|}xps{yvrheimqy|z|vroooquut}|w~vni`Y^efiikx~yvmnvsidca_cmqop|{tstxxpp{sr|yplkgdejpkj~vw{stqhgea^_flkm|wpnysiq}}yrim|zgagifejszx~|xwuwzq}pglog`clnkq~~}ur}~xnhoqh_]`c_Yaquu{usrrsvrls~xvtqlhmz{w~ysy~}{}~uosnd_\YWV[eouywz~{yqq|}zyywurpmjkowyv{ysonqy|yuu~~wzvnnlc\Y\ckmmywu{qnwxpprjaclv}{|xspnmnrupo~~tt|ynhe_VVcnnin}}rt|xmhfdablz{qyvx{vpotvonxtgo|xnihfdelvyrxyquyum[VZZWMN_n|qr{gZnxcegkvy|xxutv]Xzx}~}twwmovrke`jkpy~|kv{u{~{sxrlrvrsoqorv||~qgUnz{yss~n~quxtqyvt{pthjo{~yfFTi}rourtw{}{n{xlxxhdnyzujoophqzy{o}{so_av}{uzrfjl}hdcjvy}yn\Yimyeb_[[ebuz}||q{ywgYlnkxux}t~s~yutz}wq{w~{}yoxupxxo}tw}~~vutejnk|kxkX]Xe~ntttqb]gioypqtqwnnsphaux~xwfszyv}yq|xrxi`aLTqt}~~oysu{z{sy~pnj_c^dx}ru}qooelc^f]]jdRfvdhloqtw}|naY`bcdt{~~~{vxy}nmusgideztul{~q|}n]u|rthWW`V^betvz{krrs\cwc`mq~xlz{qz~nrowoZ`iaiehzzomztrgmtutksmad^b_Zssmyz\evrxwvyyra]iao{~xuw|wwuvwrz|ub\bWSM_qx}u{hl{fei]gk^htlsle~nquvwuzsvwszvfhjrxuv~z}wtswxmj{yvdbePPolk}m}p~z{ynpe_hbd`gzzzsuxla~{jh]gsfh{{~yqv{mku{}mlwd_a_Zs~s~qpjmuhbt~lowjfmfZu~ozxu}xv{}qomdf_SZaeuy~{lupnn|r}tgcYcc]q}vmlftr_i}xvdSjncionq}{{y~vvamdY\g_ks~twuzpo~zt}yrv^^U]lhm|u{x}reqwsn]h][WXfeey~yw{zutyuyyd\qniu~~~z}~tytz}~}zvckZRUXcdpnxpfmzjbvjWVP`mhmes~||zsm`k_bcpsvqik~{~}lk}zu~}a_bjd\quz~}~x|r|yvpibnk__]ijxq|~ow|djurnhc\pbUdkuv}~|evmnzsoo|z]Scd^]npnz}ipk`wiptbZpn_gvwu}rnzx~~vpsr\\fjem|wukzymwx~~ng|cQ^dcYfv}~{rikrvqgcp]hpfirt|ho}nsn{gfik_]klp|txsthxsqvxio]PVNR}vpy{rrupx|r\ejghnox}yyn{p{wyouqn}nshXltuswtzdom{t}uqzpddhZ`hmernxqrujf^e_dszv}xyu}vzcnnttcohqkkz~zukro{p~zzsrrnfc\VZnmm||~rvy~hxx[ssjrimuv}x}}zy~~jvsloVarTY]s~}~vu}pts}irzt~m\bW^djkywziguh]hn\lsytg|~{~{xpi}|ojfb_phnpw{skwyrrzvnnzouypdQhmivu{ustp}oeiUdrbbc~y~z|ohz{rdigbanjw}zsrp|w}}~vfoguuVPL^a_t|}v|{~zwhhkmcirgszzqq{}soroifj]^elr|~~ypox}tlpkwxf_hXTVPowpz}txyvwmfdlfgownz}wz{|tsqvjvrjobespxxz~mw~lij{yuy{spozofahZWahes{sukkilbcnvz}ywymnqmhqq_enlg`~zvpyrkrltvqmvuhWZX[[ikq|v|uxyciysrkhyyv{yzztl{|idZYnb[[p~wu}}|xvzwmv|~x~}|nbzxm\_c[`gpoqmhqdcrh`ryynuv{vxsv|mddc]fnfju}}vz{rknqtw|xw{j`mxlhmg`Rcqtxz~zz{y~ncY]h}man}{v}srmmxqkc_jotqvxulswxox~ynyqnadijSFR`kov~vtvzvp~m^fdgr{svzmvyytjrffecaiiyzvvxvy|m}pvz|||svndvh`dbg`V_j{|lmldhshv~zq}wyfjyws`]qqbkmvpz|nsoyujpz}}~vzdbe`fldfd`lji{ogi|mrwonv{|}{||wus`xljhhgcit{lz|}v|scywjutw{~j]jbfscY^Zelo}~|pxxqxuomuu|s{yyy}|sskhuqgbQ\vx|{z~}wozqu~}r{~|zzyzplvplekle_fbftpyzhqysxveqrku}{v|zxhpjhuj`]fnrp~}~}{~ruocy}~vznmr|{g_urdb[ac\o{mnsmoph|{n}{}{w}nqrlgiXZnjenpsqtwqopy|||yxpnzde_il_Wgfab^t}{stphoju~}w|u|~z~x~udn}te]hmqyr{y{s|pvi]ynomzzpzwnqijiXZ\]^`pv~vussfryswjs{~wvrmuqvqpm_eljqi{{l{|zomwyuzzwsqdc\lpaSZWSosistzvdmsmml}~|~r}tfuqdnfgmf_msv|nx~~ztrt|nkusyn~~xuxyqw{s{ynpecsjfh`Zjwv~~|{sfhga|qswy|yklzrvojeV]imsl|i}xpggytjyz|}~olngkbnlc\Yfdblt}pu}yon}}wxfnw{ocnc[_e\q}|wyuqukisq|v~swjfiX`|kTNJah^dz~rskqwotz|~xyumwog~sX_smqtwrxz{hsxlhnpk|oxtozmmohjkV[^ec`ow}wyuogbfxvo{w}jkNbsSUVfxvkp|ty|y{z{p|}y~t{yrlXTdiSaZD`^kaUffcy|mp}|yvyxp|q~{uzzrsqaknmdpsmvonuwoXTg^VkVmtv|}}xkr~qVq~s}|z{soeskqvoqqgmzf~u}z~y{jmzpiqjvl_gmiyi}iz{|anx}p}qz~vmqoqlexv~sryz|~|tpjo^Wumwlai|hog_ei^S[Pd[[xwxxpmyu{qjrzxyz|nbjshoozt{~i}qvryz~wjnjwzwo~vvextplkx|mkmp{}}vx|y}wiy|vgy{ym^W]p[hkbfmgeldvbhsu~sdr{nrmlrogt}xjlvszpxsmjfrzkuzm{~oxpq}lk|{{inj~|qz|q~|tfz~zutyqjk}qx{}totnduhl^aigaeaefKivsqob`uwzl~qv}}nwwly~tvznrjvwiiwum~}}}lgzvn||~v}ysuqvmjw{vrstz\uy|{}|vzslxvi\kqn||pkh~`^_Ydb`bcbkRf~syyxl~trqxz}rulcsbftzruy~{oqnyztwwo~pft}u}vtriqhlgvvswlzvy{z}suxs~|qft|xw{ohai`eanmosutyYfv{tuizsvnl~npqzmp|xof~ujssxw{piqiu~}~zxl{w~x{nz}zysxpto|ezx{t{rymy~qcnur{|}z~tuaibmllqqmqVa|nukpgvqsrl|v|}|wz{j|yhhzkwsuqtilp~{zp|yiotnxz}~sdnjxxv{~}fi~}|zz~nvenxs`conw|}p~\c`fgejmmueUzvzvvuw}ryn{}z|}k~tvmlvdamtj}xwq|t~yp}gmz~ljxx}~vxjfijusygw~w}wx{ppkfrugqux~|xqw]igrps{zwy_cszptowpnskvtwt}zi}lxkqyknxwvzrnrux|tlrprxw|~}z~{nnqw}yzf}{|}{yu}wrgcn}pdlntx}ckjspqxusu\`|pvmppysounyz}mmzpovgiyvsy}qyuq{zq~hmzkiprvz~|{shmsztzze|}y~t{~}x~{wdyi]euscjow{{zebenmju{vxh_}||vz~}r{svx{||hznnqdqefstx}~tryzos~gjtrmvy~~xu{yejs|v|m}{vyy}w|q~}{wye{ock{zjpu{yx|lgnxut}|zjc}zyqt}{qyqrsxy|h|oqvmwln{|{swyryo|{~rxkoyrnswyz~|}~|~|kp|}x~wj~|}~yxtv|}sg{gdkzqelpxt}kjtxpq||wq_ixytpxxy}vxz|xnkyppqhn~vu||y~}yz{w|~i|rhn{zjmowr}xpht{vv{lpxxy|tx|wt}~qwapl_eqvfjnxuztfpxrpz{wiiuwx~wtu{y}|hzmotlpgjuz}|}}rw|vjtwhmxpor{v|}ywyiuzysqu{{{~wy|qsw~zpyfpreku|lkmws|~}oz{xxjj}}rr~w|vrryy~|j|pr{rrkmvz}z|z}{qwyoyylqzonnwpzxzw|p}{y{op{{~y}|uv~~~}rv{~szhordhpxifgrltx~s|{x}vih|||up{|wv}~m|up|soijp~w}||u}{u}}x~rqzjms}oiiqorv|y}rwzw{{omyxx}xqqv{t~ztytrmdrcdivnefmqm{zv}yy|qjx~s~xsw||rqylvwojhkwzzyxwut{kxplpz{nlnwm|~|{zs|zyow{{{{vy{|urt}}~{opv}xmthmpejqzmiismvw||}{on}||n|{uqwz~~owyq|{qllq|{vsx~w~wzo{poq|xmkntjz|~yy|yulwxz{|~z|~~trt|}{{{ory~y~mtinndhowkggrjvu~||ymm{z~nzty|qwyqy|pjkpyy~u}xyw~sxmwnknxxmjlti~z}wzxvmuw|y~w~zw~rprx~y~nx}rq{tzmlkhncfkvqkirrq{~zso{{t{{rtx|~prwrt~tlmqz|{|}ys~t~|~pvnuqlow}rnmvlw}}|}{yourzu|~{u{zwtrtzx|||ks{ypozsxnlljpgimxtljrqpz|sp{xry{rtx}~rvxvwxnpt||y|zws}u~}rvqwplowzqlmtjw}yulv{|ryv}yy{zxqqsz||wyxlv{xotysvkljmlehnwpjiskyw~}zns{pzsx{xtwvuzqnpuz~wtyxx{|uqqrtklpzvokrnrw~{|w{pr}ys~tx{|txwxytmpty}xzmovvpnwrrnhiknefkutnjqqp|}ut~yu{|rtw~zrvtwvvmptz|{~vt|}xu~{xwqqsvnmpyzsmqrl|z|~y~sq{vvx~suy|syvzwynqsy{y}xnlttpmvsppjjnphhktuojool||vt~wvy}stx|uyvzwxmpsw{z~uu|}yw|xxsqvwnmpxxqkpmlxy}}y}qq{utytvz|vzu{wwlnptw~v{ypotuqowuopkhnpgfiqsnhmli|yxu~y|xvvz~u{tzu~zlnotv|~zv{}zw~}vwtntxnlnuxsmooi~t}yupzxz~puqsrcbbfevzkme`jpr{xymelnlipslmpkr|usv}~lyy}||t{to{wosy}pvrtzzvsswwvwnggalswu|~{u}xr{vst~}|vb}xtlqx{|{yyyx|zwkltrx|zyhimomoyyt{|wxg_zl^hlozssr|ysy~qxtyxz}{|~qgkrtwlpqrrz{zz~|nztoigjefvfeipcgidoitmccedk|nicY]kou~w}zijlmlowvoxxp{{~vseavpr|~w~|qk]Wat{yvrojorkfpggyqklpuupkj\gwku~sq{wyxy|}utdagpvrwuzyxt|vuuuxyxmn}{~{pi_Vmwuzytpvyxrupqzmcgnyux||twx~|yxxtupf_g|wwvvtz~wwqxu|{l[V]iuuwqsynjrdokmreba`cwodcXZivuz}x{lhijknvyqtp|}{z}~{rmd\u~{v{}yr}kg\Ye}zxspmruogulf}unnpttpkgZhxpvz~}|st|u{{||zxpzyk^^eqy{yx}w}u{wttr{}xtlr~z~{{xridV]wzzwtw}xqtkt{rebiqzvzw|~|x|vtqr{nkact|zxwyx{uur~rsxm^V[druxx}vmwhmqirjb`_`tree[[gwt}}z~qjkjjmuxqppv~yx{{ztpd^t|yx|~xto~|kh^\h~yutyypj{ljwqprtvroe[nums~y~~{szyt~{z~~x{sq{vh^afpsz{|vxxyvtssz{rox}}~~}{zywqk_Vjro||~yswnpzwlehmsru}y|z{||xtqqrqfcl}||z{{xy{xq}|~rqwpbY[_fjq~upnwlqoeb_`sthh_\dror}|}wonkknuxrmrpyxyz{xsg]otou}szvjabgmmmtz|trz}{|vsrxxokq}}|pk{}{pj}s}{sxpqsrtmirsjcekqsuzx^wv\\heeghyyytpu}wqko{}j|yxy{|ztfs~yvzuvyyzs~ww|~|{r{|urp{z~n]\mllvhccgkpqoagyupu~|~|qnuu}}~twmrzwnkpuz|}skkeq{yujfdi|zsvnnv~xtlhlx|qaip~ushbkle_afkoppw{qlpqn||yron}|~yuywpe_`n}{{}zkv}yuzzi_^fgytjbetlee]]eqlmyvprykc_YW_lttuuoyvwy~~qn}{~wzoft}zv~ztvz~ld\W]o}vtstrl\bqlhjyslqrmlqbdqu{{~uwlpxwpmquz{{ofenq{wojl}}uxrpwvsmls~}|vlnj^nxlqsnfehlqvqtxnjmtq{x{|solx~}}wy~ohc_dt~}~pt}~xwzrf^`lsymedsqhjcafsuny|nktla^YYaoxyt}k}yxy}wm|~xyvotpfv~u|}wx|x{ve_[[dw{xvxwp`hupmjxtiklikoaftz|}wwlpvvqorvz~w{tjfisu~xpkr{xzuu}~{tqmozwrpkhndeyvrvvojkmpxynz|~~zsllrrwyw|zrnq|{y}wthe`bmxq||~}}ty~}zwqga`ioxwnlxxnplgjuyou~ohrlb_ZY_lvxup}|yz}xo{{}stroupesx~~yz|rxrd_ZYbt}}}qdrvqljwqgjkiqm_hrx~|{umrvuqqsv{uv}}yqjfjlp{tqz}{wzzxuplp{|{}pomjpj]ivz|}xrqqrv}nq|{~}wqmnlmy|{~wqr|{~t~xlha^cp}~{wxis|{ovywzrqvsutpllposss}or~~}q|zrplgiryzyuzwmdktdrwqmgqm`acepnbktyxiszfivyyx|ygondb_\`kw~uwzyzroituhhlnwwhnvy~~{o`dq|}zvuwskz~~{z{{zzffv~~ulxxhqxppnjjs|z}zpsxjcfgosfgs{jiw|wdt|svxwtqooit|xxyxngm~~|{phmumtk`adjshblrw}~|zmir|~lpwtvvspoqmtujj}zuisqjieaenux{yy}|{tqg_j}uwwwtpmlievuururieq~~v|}ilrjhfcdmw~yv}xszpfhjrxkhrw|}qp{|xnmd^e|zltohfb^ajqsvxzxst|{zukqsfbejurgox~||tlu~mwxyxusrpl}|zwxyqo{{y~wwztnp{y~whfhnvjcmsw|ztuvkhr{~{y}li~xrtutssspu~suqkp~nstmlifhpx{}~z|oinmist~{vvurpnlfrwpw}ojnifqyv~oiqliiggmw}}||}~tyykhjr|skt{y}yv~~~zw|scddbkorqjheabjpstzzusw}yuv}yyulkskadiuwkozwszzu|p|}yzzxwwso}~xwrwut}yvz~~vpnsutyz~{lgirxkgotx{}}skrullt{~~|yx~ikyrtvuuutoxx{xlopozrg^UQW]`gorvz{ysu|{pv{w}s~md}zy{zyxwqt|{uw{xy}pw}ruuoomjlt{~vzxrlnjkuofhp|zpu}}tq{zqc`f~uwysrokkpuwy~{usxz~~topwqecehlnpuxfvzvwwvurjeruhfw}{x{~vnjgfnzwzz~qns|{jglr|rg`anl_a^]hnkt}~~yvykge\YY[amuxx|zy|}z}vd^cusq~|ttt~xsv{vp~tpzxw|pikcjvz~ytssqoropw}}mxlpuonheqvqu|tuyyzzxw~~op~zjbhx~vnjmvobw~~}{us~|lly~~{sxumoxwjkruy}~hYZmxru~xcl}wpqtvwwqm{xsyzputmnpq}}~qhvqh_ekcbjzwxrenoefskm|rrtvxwrmzzru}uffgdjru~tkonjnlmonmpuxy|zu{}vhkzwk{snonmibVYfaZ`s}vvzvv{vw~ssupqnkkiedgjnv~|wwrhdky|tnushhq|ulpw}||{mliiszyuia[TTW[cmuxz|trvpqsmgiqzzwxsnegj`Zarysv}~~{}n`jl_]ftpm~~wyz}}~z{wppzxnkvwopytilmmnomnup^amf]_emsurptynfywvvwwrjl|{pmsxk`cdfquy}xxxvw{r^ccVT_q|vnlkkh`Ycnf^_ggXTYY_hit}rorpoljllkmqtvzypstkmomsy~vu~z|shfkcX]hqwsqlg`^]ZXY[\]a^\ikkrsopw~|v}ysqkirphkx~tpvxy{|}mqztqy|v|}zyvssy~spsrtzmlmaY^gbY_glprqoqraXfhacjry|{z}zjpwtw|{z~uu{tedks~z}zv}zymX\hfgrrhvyrqqqmd[bmg]\dh\V]dnwuyzx|yyxvvxz|uz~vx}|}yuyy~yy~oggi^ORZdsx~{wwriba`]]_bdildeojhnoot|~vv}xryz}repuqvxtyqqwufeoz~|yuttssrf^ea[bjp{wptpfgqqfejlmnnlmrj^jvrrv|xwztypovwkgpy}tqpmjkmot{zz~{{yuxxwwwtsvlY]gdenzyuqqqmd^kvpjkruiagox}z{wttssvz~v~uv{{~}suuljuztvz~}|{t|vjehhZPV`ltv|}ypnonmmnorvqjvyruzyzyrx}wy~~xgirmjmv|xzyx~vmt||zwtsrrtumdmndfjknw}ztrvwxz{yy~xinwrlmqx~vq{xnloqdX\dknlw~zyvttvw{zs~{{~}~{{x|}||{vstn\[db`ep}tlu}vmkoul`dnx{w}z|uqpomlmnpsmckrjjruy~x~xty{{}~}{rr~zy|ypu}vjegmh[]gqwu{yvspnnnqvums|x}}{{~}}tpvtmqwpjmqsvz{|wnvxrpt{}{|{tko}~wtv~~qlu~}xvutstvx||qmwukmqru|~vx|~}|~wjntojjmt{rox~vuz~}vu|urvxlaeowws||vsttssuw{yr}~|~~{wwtfbklikr}ypt~xnikqn`]gpslkw|{yxwuttuw{xlmyulnqqty}~~|||tw{|~|rw}zwx|wt~tkhlnbX]jtuu~xurommnqsjcmtkhnprv{|{z}y~vswxxyxvrrpc^fhgjq{~~wpv}tqszznkw}zyvtsrsusfcpqilty~|zporqqrsqqutknwwuvz~z~xyyulgpvnfcgmh\]kw{w|tsrqqsv{~v~{uwyyyzxtrqiaflmpv{{{umq~~upqvxnely}yzpxxmjkkklnotthdotkjqv{}|}z|zyuowzpfaaeaUVetyx}|zxwwwz}vlq}yqty{}}|}{tovzvy{sorttuuspoohbgmoqw~~vzzuv|unwytromkjjmj]Zfi`aiqxz{}}||{wuuqhhmnmosy{y~~xxxsjjtvldbeicY^n|~}yxxwxy{ys~|~z|}zompommkgccb\\elqxuow|sjfhnmban|~x|utvnlkjjjkorjaivsmrz|y~~z}zvvribjqkb_agh_\j{zvtqqqruztjo|{qrx{~}}xpuzxyyqnsvwxyxtrrnikpruy|v}zvv{}slu|u|qnnnnnoquocersjksy~y|~}}~{xuurmmpppqu{{||}{tmt|vmhhlne^hx~z}{zxxxy|zptyw}{yuxywwvsnkjgbbfhkowzsyzqmmrsjcky|tu~ytpooooptwpfkwwnmsx|~~|x|~~~}zyywrrtuuv{{rkqwpe`_bd[T\lsot|zxwvwy}wlo|urw|~~||wy~uquxxxywsppnjiknorx~vpu~zrnotytlswqnlkjikni]^kphdjpuxy}|}zzzwttuttu{}{zsloywnihkokacqyus|}vtssuvzwv~y}umnqqqrqmiggdaadfimv{{}vsuyxnju~w{{z|rooopprvvldlwukjpuwwv}~~|zz{zz}{yulgoskb^^ac\V^mrnr~~}~}ru|vy~~zzyx~upsvvuvtpljjhddfhjowz}|vuw{ypn{y|~yokihhgilk_Zdolcdlswxz}zzzvrrttuyzwskhqtleaaega[dsxuy}zyyzz~yps}w{yv~zpjmonnmlhdcdebbglpv{}ztrswwolwy~xwxmihhiilppgakxypow~{z~|yy{zuuwxy|wtphcjpkb^]`db[_oywz~||}}~sq|vv|}{wqw}tnquwwxxuqnorolosw{}vwzspruwqlt|{w|pjhggghkkaY`mqjfnx~{wuxwqprtux}}yrmt{ulgfhlkdfu~{|{wvwwx{~zonzww~{ty{piknmmmkhdadgfcgnsyyzxqnortnis~z~vpnnooptrgaiuwols|zy}}xuvyyssvy{wrmdckne]ZZ]a`\cszy~{zzz{~vnrw{{y}rosutttrmihmokintw}ws{|tporvvpp|~w{tjeccddgicY[gpngis{~~|vvrjlplromxy{~|}uwuz}xzvnwwkoyvu|~{qo}uddmnjputwnowwz}mksyuhp|zh`gnjoz|ppqxynvziiomjtwy}uz~}riq~qpx{ruyw~~zuut{uoxl_blkp{x{wo|ztn`fprs{yvz|vooehp{h_bhepz{}ur{|zzmjaZaj~{vrvsxzx{}~ty~}gcmsw|~ttlofhp{}xs{oglsqa]fdjvuz}{qkwyrz{qga_b]_akruuw~z}~{~{ywwu|rgkz~x}ywyytxzz{uywlmtqefmjrrmqot|~qjxrxujcfflkggfq|vqxy~vt~{pztmrzmivz~}~y~~q{stlfirpfmqorigjhosy|tl{|uzjcfoqsnmlju|zru{vo}rs|tnkpyli}}~|{}x~nz}ryohcgrphssqneeijonvxukxytbdnwrqoppnyy|r{wn|mzxrmkoy|lk}z|{x||~zmw|svnhcdosiuuqldgmormruxl{x{p^hsyrppsurxwzt|wjm|xronqz}lk}z}~w{}y~{lv{s~ukgdeoujtwsmfiosuosuwlwzzp\fqzspruxuwwxv{xgypxypnor{lhz{~}y{|v|{np|u}ujfffozmq{urhjotwqruvonwv\cnzvpty{yvxtzy~zfovqzolps}ohvzy}|~z}~|sy|so}w|ujeggp~}po{xummpwztuyuojux_`ivwpuz|{uwt}y|~xenyoznkquohuzwz~z~y|z~zqx}rp~w{ujfihq~~qo|zwopsy}vw{vnhtw^_jwyrx~~vvrx{}wblxpymkswphw{w{~y~}z~{y~ypy}qs~wyvkiljtqr}{xqtv}w{{ujlus\cm{yt|}vsu|xy|s_ptv}wkluxriztwty}yvtwtvmd|{~vxrk\^edt}wsq}}jcejszq{nzt|pqt|uoks{}wxxtsyx~|}|vk[ov|~xv{s|{z|~}}wy~pt|r|vsf]t{|zylgrnfmtkdbmou}uh}ps]h|ptv{yyzzssvwwm[]nr}oq|||px}xpmq{zw~lx~imnqy}|pkfm}mxybwon]ex|so}sodSgzx|jtymjmvim}{twp}w~xy|{ytq_txcl{yzwfvwhnunuvaZmpeqjjnolhyonow~y{{ydm}tmowx{}|y|}ly{{~}}xzlLUqrwyu~lztnwipug|{tngo{crdjuz~}|~}}~d||}uu_hwpjutzguwv~u|yvyyn[[iv|wu|q~yjv{ws|ylwxurn^evqeenlqwzbRlyx~|qkwftr~{}s}yrl}ywwieuv}w}oj}|rr~|pw|^Zurp}|{~tdvfrvt~vrpw{g^cs}evzww~vw~t~}|sj}}s{~y~rQPpvyq}urrs|t~tqld{}rhj[`vtuw~~twzyr~gouuzsxcj{zswzwkmzwm~|xqvo\X]p~|k}~~rr{oj|oty~llwzvn`]rytmx|x|vwYYxkymqz{|zto~usei~~}tx{y|zhxuaewroxv~lszr|zb_z|s~z|ojxbz|~zrsuc]]pzvhq|xwxvpyoz|~yr|{lh|{z|u\Qlu|qy}}}|rnkbpp|lc`Wrvutuzrs}||mvzndxtnsus}hn~rsk}zrl|qo{}{zn^YXk~}vswwm}qhlnovkdjw{o]]tvz{{dYr~p|tn|ytm||sojby~~{y~qt}|xrcsrc_sqltwxo{}s|~ge~~p|oq`Zgtzxy~woyyvhjw}tswvi|ktxyrp}ptzr~wzxyzqqqulrwiadw}pnzyrtvwtwxrpkpukjy}whqzstngqt~yvkyz{nt}|~g{}~spk|{xsytvj}mr_Vhuw{{z|{|~{nsczsrwwgVn|rwz~sp}sxyzssglvz}|wxwsxjznassxx}|uo{uusrqoy|{w}{vody~ce{yd`hphdx{ozw}|qsq|xz}zqvz~wxutceuwtbo}su|yiquwr]^x{}zjbjvqxkfjoobyzwto~wv}}jsqii~~nsyx~u|}zw]_gy}pt~y}wwmz~}m_p}l_hrxmy~yzvsvwogmazosukwyrxn`p{|skx~pqwue}|o{{{zlotnmuvzkou~prsfinymtvtpvmymsvwoj`usjpu}|~~v{{p`bn~{|xt~~pq}{utwxwalzonszzzy{|tqw}|lhnh}zrls|}rnjv|lw{tfgsqw}vj}wv{wwloxsvzz|mzzy|y}~mzzcaji]mywu}nvwss}lj`up}vww~}|yswtgksqhXk}pw~o|~|fewy|vyszqxz}ytz}~ywttq\vsrnuittnsuhizrk`xxlm~}lzzxoiejqohpvzqyomn`gqkl|to|z~~zy~srgdzloonrw|koppbntujgvkt|woq~w~ttnmogiov{y~z~{}}x{zv{sf|mtwfu}{~{x||xtjg}dhlosw{zzmvptnhdkuwt}m}}pco~qkitzuxu~~z{}tuniz}qowvwvuqpoovnn|urv}rgswyy~o}jrooklplpzz{t~{tm~zfacb[hwuuyww{yyxlnow~{tu~xty{dzphtmfYc{zljtxop|zr~}ibr}vvxzyuzv|q|vpqoebsywrny}z{it~}yfguvpnmjhgnfnppqospsuwpowp}|xuzuoo}x~`Sitpjskglsuyrtqxpvzux}ypmqswzr|s|ktxynmzf`bcqzvrmop|y~~~yw~xligbfw~zty~|qqswreesw]juygkx~|{inmbr|smw}~~ystvuw|vv{|~{zu}~o\hiumu~nWUV`]TRcShvlxnv}|y{uhl`T[dek}sj{wy^|omt|gg~u||uqqebeov~|}|ln}~rpppzr|w~~wv`~~nlko{ws|cecjkZVh{qloy}xhuzjrb{u`emtvifzsloiromxr||yry{ijxsnus{ut{wz{wwyacisvytwblncjsz~vo}uztps}{{zzxwohzjstyoqvw~gh[ers|txsik|tcfus]kiuvt~eWWauvw}opusyi|n{vyxqs|w~~mk||usuzvhrvgcm~|jsy{}~sww{x~~~m}}yy|y{m]arrvnhhnvukqylceccjez{ngxvtf]fxpjjle^uptoxzvwwpfp{}wuny~vzyxlq}u|hbl~{x|hrxzdpqsxqk~~zzv}ph~~yie^`e[uq|{}{vuzxicxpmce|uplnpiamxsx~oneizmxuurmlyurzruos~|rqvxxu{|x|qysbq~tgajtyx}pgx~vz|xqyzynx|~z}w{qrihkmgbl{~xlpnikr|}wikpm~uyreceqzyhjpf`^^iid{vqpan}suxwswww~uscezlv|vvpvt{phhny~~yxy{xyvl||}|ywokprne]fezvtrv`v}svct{uiab}ynnsogbtxokdwqnmowrlo|}|svo{xxz|zomruxu\^eedo|}u{ov}zu{zstys}{rwto}nxkuxyrxamxnrT[]YWNOgzrm{|vutnzj}sgsvvrjm`YX`rsrgklovo{yyt}~|tyuyxtpdqe]^i~z~{z~nvu}}vspuzyxleq{uy}|}|vuo{j`Zg|uz~vswxtfqhidaezuq_tz{wqtZifk{yururt~mnzsuk~w|yv~qq}v}jijghm{{|zwptxjirtgxnmmyel}w~u~yxhlhsxi^^_dktv{}uuxstxrrrl^a}{u^xts{iUgvfiuq{z~~tt}uq|o}}qkkmpfhukl[aryzyor}wx~wip~rwsqwsimy{}wmxi\\gs|vc_a^W_nlruvy|sn~rjzzr`yvnpqw|jehjZ[eo}zzywq|orwk}vhhrrtufgkmloru|smvx{wyovmwx|kvpnphx~~r~utmdf`sjcljb^gqnr}upws{zoex{yfvnjlooyxhcy}kYV]jtzzz{y~zyjdinnz|xekvggiomyzm{spwy~jyzhwyysq}iivx{|u}}wjiikbkurbbhd^^sqwr}}l~uwy|jxwvdun{zc\xyh]``hx~u{y}sy~n}qqbeemutjkwlecloq{}gwt{{iqv|vx|yjrtqkpsu}q{nhfmbfjmpcikhgglq{}v|tyud|uypznlvub^zsc[b]o{qw|}}v|rxsxwquppku~{jfjmoity}|{p|~mw{lnsu{qfpznjln{~kr|qnefcdhkj]dgdjis~x|ts}sdv{qxnkr~tg[ryj`efo|~}zx|~lt~xpmmfmuzqdlknnsyzuynq|{sf{|{px{ouzijrr~qrtwrke_cbimhY\dbekyzw}r}}vjp|~q{}uqzq^Ykjc^`orx}}ws~r|j}}l^`fq|k`b^lszst|xol{{x|umlqfxnfht{{xw||w}}yqlgdlqiYXfkbihmsll|s|plrhqxvyxw~uilfk}zunlyiuxjpmp_yuxrcainsnZX[Zdfuszqq}{xvvsywzik~rllv{|}|~uwz}wzwkejg[Q\rrnur}{s}v|stxqfkzvsltwzvo`frwsjl|uwxux|~u{ptttaYfu{|j[_\choyshyzp|{h_ismcchw}}~z|wz{nwz|vkd^hrl`Zijchgmsrmsysrqo|xvtv}ylnou|}yxovk~uklddsjsrecppreX]_cffq}~~~qryx|quypuwmu|zrqsz|~z|{u}p}~u{}vqhgja[Ylrpuw{~|uqn}yzyos~zttwyubet{rlx{|vt}q|youx}ydZd{n\ZZ^`gy|~xnv}ttwnafiidbgw}~~zqlp}|yk`\asrl^ddadhlnkfd~yuxs~zvtw}ltor~~|{|}zv|i~umlacphlzxndprtk__ejjiryr}{~pst{rlyy{j|vvutstxzv{~{yzwyx{vozx|rn|vpnfkf`\cpqsv{}{{qyuw||yyt{ldkwnuv~q}zzp}tjy}{v`Zej\W[^\fyyztz|qrqypbhgffdiv~yk{klv{{m]XZqurd_^^cjqpki`yxwzzurr}su}plx}xz}~|nrw~npe^mihp||sjfqtrfdemplt|}xp~{z|rrvynh{zrgwxrpuwvu{|vwyrzt~oqwpvyhp{rrkidkd__fmqtv~}{vv~~pzmfmsst~pv||osgwzyva[_zn\e}||zvw{qrzyuxmgu|nl`hks_YtdfeVtvtw~~{}urxlyzhqvpsURsjh_\]mvyqwvu}jinVbknlksd~r|coycxz}rvoxwx~vjwrfhWogZZ_qv|sw|~wx|l[p|zrfct~xz|nvpeZnYluwurvpsxxptvyl{qs|stmkbx{|}{np|vy_]ev~rTlul{uw|}{z{wxiij]xwlnefurruxulpkoty}m{r]Yz{uhkmy~kflvgnzqowv]l~zjuzsv{tyv}dyztxndVu~uzxvoibY|jb^PzrfgoxoViyy}|jmuxvw|z~xmtsh[l]yvkjp{|y~w|t|yr~|t\izufkwtqmmijoken|~}wig`qcmt|vskhez|{sz}djxryskroZxtmvv||~|}~{pmbl_f}~~xywvpsttw{kwrnWaxx~}psrhkr|zrd~yktbwntcbwzv}wyx{uy~xyx}goz~ywto[h|vx}wq||nf`~uegUywlgpy}oX`~}rsz}pnz{{yyzyyvpvzm\cUez|sqv{tx}rv~wq~r^b|yorzq}{yvqnksmhny~nf^i^bp~xtmkkz|y~n|mgvprxtouuyoayr}myx|z|yulbe[Xuz}utywv{hqutbZpuw}tjeonqzwqgwluey|urn_oypo{y~z~zx|~vsbzz}tkZjvqwpjg}neqqqefxsmx|zeXdyptzmy{|}}yzuzrrtvh\`Rmy~|x|~nx~vmwst~}k]^yxprx}wsmwojlv~qg]c^`u}yvqoo}}}xyku}rbnqptnml{}vhus|p{~u{~y}|vha^bVu{|wxzw|pdss[^oqwslfrwoprtokmxrqj~w{ud_v}ytx}wz~}f^w|rx~wxnnlqurgzpn}qugg{fnz~m{zqxxu{itp^pv}sgo}kX^q~vwycXlwoksvny}~{i~~u{vt{yskpnz~uufhuqyshb|x}v}z~|uq}|}~rlv}x^V`{`atgh_ry{pYXk}or}xyoay}rwlot{trryktyy}vtbZ\ntqszy}~y{s{vp{z~|q_Xqz{{idihaiuz|x_hfmuwj`\Z`vts|~|x}vnqqp~oixxytk|eaV|otrptwvtrvwxt{eUZt~yx}sg]yqeV]{iafs|ylwdXVYu}}nyx~{ns~r_UZmpo{ypke{huw~{thd_Xez~{wd_\[hldissry{~hzjbarpyrfn{~pm~l|{{hvraeqx~ty|}}{pm{phhp~~|yuujZQu}xcoi_baohlixjpnolgisrpyw~mrqrfegr}t}hfrbchuzwwasyyxzs{xrcf_Zbm}oiyfbXlstrbZv~jdikaPfxyyqmwkps{|wnmkmw~xq{znons|ys{wr}xy_Rhwqq||wumfkmfks}z|wfyjkl`dlywsz}yj}ykrjumagppdmyhzspr}|}{||z|xpmiTryyt|mmrqaWmnpjrxsryyk_isrwz}nyuzvwusu|urx|}fltbonvfuzrxuv||}vmhdilpsxxnlmi^\]itzrvytnoko`_}uxwfwpgnusktxwuzuga}uy}~{uy}to}rze_traWatnaftlmuwxiihkoty||z~y~quvyrorutvvpnrr{ixynokstriy|~~|{~uhdf\yzwwvpWuwsrcu|xl]^y|ocjuwrq{tv|vim{|wthd}kp{|rtzy~}}w}sw{zp|xvsrlmklrnry~suy~{nprsvzmmny~yv~wrr{qjnsxwy}{uzzrjiu{pf}rtuq}{tzjoyhqkTjlnxu|wrvu{r|dnswnr{~|~~~xhqugxmmhowimvxp||ls|qvlilm{|sfhpqaaYJ\kjjpomu~u~uv{~~z}rqru~pjq|}{zpisltrvn_fupwuyu}vzlZWevw|nl`\jeYgvzzmYqpp{njtzpqtrs}ywslz}wsms{}vy{nSet~|poxu~z~{}uqyjaqa[j|{pz~okrkvzulskhknnwrdepsntrx~odhrss|z~}vxwqfdnbg~j~xwwrvj`leUav~~pixuyxsnogp|trfruh`Vl~~~~cj|x{q}zxkz|qpuirumts~t|~~xpp{ntpYa}~xusqs~wqs|trjiujrifioghigl{vy{opwrbm~lww}roxkluu|xr{y~~~t}z}}|~wsqxj[Ytvzvozvfdq}tputw}m\lhcgwzpoqoq_jxvsxt}{yjvfbikrzo~{u}~v|stvlkd_ghivztu{srwuszpj}tjfsm^_}qYZheyww~rq~|{}sefpqu|{w|~|{{ssystgu|}rw}tibZst}~{m}xtqyie}vggj[dng_o{tnws{{s~y}}yufwomhcmpypkdg_hxto~w|zm|wpkbhqqpmuwwlirlphm}yqy~~oawwnuici|gnlnrvnt~x{p}|uz|`stma]xtqxuz}~xldH`{p}rtqp}{|hp}opoekvwvtqpulkt{w}z|pOWz}{fV_yncdfcu}xvzz|w|yyvdav{n\]yynrzwu}r{qss}{z||rz}qjdZ~m]jlVQVU_uuptwjvvlxyfbgpnhn}zrqr|xx|u~ykhrtr_i~{jUr_rw|xomw}wtuyne]o}vxg[oylc_c~oqjWiZ``bahpzrj{ztnr{ubhuw{|k}swmqemsxtnl|l}~}tto{ytp~y{wk{{zqraxsbacdalvtgnhgqfgjusd`Yp|q{ltzywtx|xhaxqzslxmd|wsvqlnbl}phjhb|oztb^bhleV{|liloh\gx^PZXez~mj|zw~tsoljyvzqityowu}qqyttnu~qionjcxz{xy||}rtwqXjuidhoodiucbnc]uzzy}st}zzs}~}vlmpzqzp|}x}v{q{vyxzxovqo{zskicg_ovtqxnnlm^syeew{d`yn]]e^ckewvy{ugbfnuuv{yuyxn~qxw{w|yorhitxsl|{}}y{vlqxvbtnccvxn^opgjpbhr~~gwtst~{rz}plqvqo}ywov}wv|jx{~yubcltknuvwooqvcf~siq~n_z~aVcf[r~y{|ylqlt}}v|yjkntn{{yx}stmxszqq}vvvkckpneuz}vy~}gyzpcmxr`fm`cgZ_w~|{y}yjwyx{xy}~|lhqzunss~p}{{o|quzq}xyxhfhkcjn{}vqyfozpek}sb\yyg]^VRhrt}rj~v}|wxzqgnrpgrpzkuuz~mkqjw}vxibinhgswwwsdysphvreUfwgaffZgxwt{k|vz}s{~zy|kmx~tqsx~{wz~vo~up}uxul{|~}llppcdgwzzaksleh}teb}yd`e_[ottzwn}xyxzyzjjpqiok{{xx|jy~txxrtmtuwncgkh_kk~}yy}i|zugo{pcg~qdccX^uwuzpo}{|w~x{oeoupgml{sxxpzyywi||yov~ngmqiYdh}supcwx{qnk`Wcthp]\cZw}zp|z|{yyrspokjytcajj|h|q}xtvjfu~jqliijjnrk|zsk{s_ukf^q\[acrnnzptsxxzxnoynb\rqb{fy~~~r~rs}xls~tvyqzyy|a_]cd]uxnyoqkemlo{xkkj_Uct{}|xvzxyxp|^gj_]bs~y}v|tun}pc}z|sesh`a[^nvw{nrj}oespdjx}k^bYisufzz}rrkov}j^nvkkq{~t|onm{il|vlrq]S_nsmg||lotnvjtviljrgefZ^~y~~yuxptttl{qpcntgmpxvwxvnk}ot}{~yxyznct]_^\tuu~}rwt~w{icyw`\dnyp{xogx~tizo{vr}rpS_jnpqoq~}~{xk{zwx~ymltut_UQ_ori|xqps~opnquuhvgh]i{xww|~zquu|pcffaftuww{psv|m|~zdpu}~tv{tyrb\sueajm{|y|rjmiyl|zaZ^kt~yz~~{ntu~}khytlorgXcxkwpu|vszpp}{{tvikghiXhcf`Yu~~}v{zosurjgoyliq{|yxvouhs{nm\Y\gvq{}kh|u||wlh~tw{lolpplf`_kkpuywzwxunhkp{`jtilew|ytrqyq{rp{wyznZYv~rqy{vwq}{}qgk|}mu{ve]r|r_U[^\Vsqsivzzurneu{qw~wq~uooxsvyqmqjl[\xkzjy~}r{qoezqqy~|nhfUjfdf_fiwq|o^gp`bfegk~~~r~}rwsxfvdhjmlos~xxx{u{{|yy`}u}x}{{pjzwlkwqljl`UY|vs}~yyif{lrtloo|tsxzpp}uf\lyo_Zakikry~}nsywyr}}h`kvvia]jt^gkZ_{zo~v~oyjdrv|{r{ttnrnptrqnoY_no~x~{ru~tf{_qxusvxqq~v`ttmkpazr]jt~vy}ujjlqputhdblpm{{|y|sn~{bdnxo]{mwjqlp|x|~xprtw~zwuy\[obnunehe[NUiebi|tuu{dxlx~yz}ntzutk}wqeqgwxntsnnu~jrlffghvuysyvvyxyk|}nmssvqcR^~em]aru~ss}~|yll}~jpwp|~qcY^qogryf``a}x}y~zrkpyd}s|zkfn}eiYe_`xlhgmvw~~pkss}wqopnnpqr|{{n~qhrtotiy~lbVvknbXxwrp{y{z}}nxuqd[RddqwdZ^ghdchp{}sywy}ri`os[~~}rqourhzrjtqjknqv}}~vpinq~t~qipwwtxop\qujnmkc`[e{dojm~lu{xqu}~|y}{ylyr}i_]kkirrf]ejqhoqtz{t{znh~vme~t{qquntsocbve[ihendep~}y}{wvwzykx{tu~t}w~fb}ohqqsucVrsela~}wsw~z|{}nuqpv|w{zw~zx{}l^\W`qnl_cidfiop}}z~u}{rautxdwywxpsnyowv{xk{jkbeswts}urprq}}v{{xury}xz|zkan{iZ]euo]K\m[cX|~qwyyw{wxv~yt~|r{wzrogecqvvhhpemqtyzq}tm~jytgw~nyovzlnmr|onl_xo^^^gefhguy{ttut|~z|ttqwyn||olwmpryjfZivim_|x|{~yrqvvvxqsy|twxmtqqok`c[grsddlec`mwtzs}thwz{hz}|w}mmswyrqb~v]fnmjeefstv|||sqzzx|}pt|s`v}l_hnqg[Q]obgYkz~xs|xoplszzz}ymi|}wuj}vwiyzrcg{kae{z|ykqo}v[nxtfhlquns~}ywywhkz~`SWanvloy{ogvy~xs}uuxxv~zvzmgyktvtuci{~zntjikvouuwwnnP]_qr]\_etsgtxmlyu~s}xyttyoesypxoe~zz|~tjemqu}}yfkuvuvkiov|xs}njaj{x}mf^jvjkyyxvoqxykgngsllojnpzskv||cq~vxq^]Yckmtyw|~wmgx|rjjhgb]`{yqup|~sqzumpuqzrjxu{h^d_c_Zdyrnz{ztxm~pbgrx}}z~~~zthk{{z{kbbcb^twv{}~qmyxt{{{jjjlwjljr~tks~vlq{sjz}uxzn{wcVYau}v~}wns|r|ojr|x}pea_kutosflyvv}qhii{qlvip\U^anqih|~uuxynwxw~uozseckt}yz}zwomxqs}wfXW`mu{wtxzhgyzw~zhtgom_iiputqqgpv{}x{wt{hZ\mtw|w{yuy|rp|z}ww{k\V^jtwx|sv{|owwrornql_|vshO^isoifx|tsttrv{nagzujhw~{|{yz~phl{tdm|iTVcqsw{~znnst{~el\iq_iq|~xq{{tqu}{s}wrs}ukob^_ju~zw}sv}~u~uupnm]WXfvwor|wnzxsormtgdml^Qbhpmjl~qot{wryx{{nfs|rlnxws{{ytuz}|ylcw|mXPV`hnpfwuvyptlcyhdmquzx|ywu|~}xwwvy~{ueifdhry}yvwlw{}ysxxq~yvxdZZfqy|}yx}x{yutyzzlXwohfUgswohczukmproq~}xqdh{ukbky}}vw|wuv~|zshrknoeTYlrxp}rq~pwnmbvh]rx{vtz}~{x}mtvqxmhki^m{{{tzszzyxx{y~z~zznVXhmcs~{yovuwkvukfslqmlXfyru~|rrwxstyz}|cZgzudruy{vqgs{||mo\^gnbVhlq|tsq{yso}}dfrx_nuxvp}~szszswo{jhekd`uvy~{rrzs~z~px~u|bXVdgez}zmzwvex|thrrhusiTjyuy~}xuxxrx~~y|`Zcssjyy~vxzxs~kxv{u|jlWWdmh]nrxyxpxp|~tk|nllpdp}{q||vvwunymshcjki`s{~{q}u||r}xl|~q|prhY[]fcxn{}zzgl}vkn}hpzr[a}|}{v{zws}yu{vmY]fsoyux}rzyvu~{ttguoe_PZfrip}|rozqs|ooysrmbky{u}v{}zhvrji]gmrgo~tyy|zwvukrz}kvrihZ^aiftruzx|jhzwnjrnyxdb~||xx}zzt~|{t{m}|pn]_erpzw~~y}nu~}szz|ytr`rlb^RZftowzrpvkt|ptzxxm^nzp~|x|}zgxnhe^gpvktqszu|t}iyywvgxkfc[agmgxp~tzyhr{tkvqu{ras~{~}wx}yy{}v~yxqmpoh`ckrouy}vl|vp}v|yxefs`bYV_mrp~}xrvomvtz~wbb~ox{~~y}|ktufiaclvqn|~tzsu~vyw|mr{}~wuvgwnde^`hmfnvtz{nv~vnzww|rct}xwx~yz~~u|y{plonkcdlokxy~x}to~|po~~{uzyzckpac[X`mllyxuwmtvz}v_g~}q{z~yy~z}}l{riibdovlmx}|y~~tsrnozqw|{{wmuol`eqfbjithu|{v~v}zlmtirsuxt|tx~z}|ukjuu_lz^^d^zyzx}zshorzupvhz~jxugtbUrh`nwsz~y|p~rktubhysu{}pzwrtrrlnhfuuqmt~~{ztururx{k}ysvnjalpdghjq^lwszzowtjrpvxr}~~v}~uyqpwq]sz_b`[qqp~w|vlo}z}s~urujz{l|qvbXsj`ikgo}rznsyffukysn{susxprleoplin{w{z}rt{vxyumz{ys~umchrhfheo^btko}~uw~ptqouqvzz{~~{q{qvybg~i_c[iqgv~wzzxpz|sy{~upskq~rn{yv[cughkd_qzywwxovtbtmkpr}txytwtqukgqkjcoywz{wytxr~yzzi~v}vtvsimpddhfkZfrkl{|xx|qwqqtlsz}ytzotuco}f_^]nogt~w}zwr~{rxz{wzssly|qpzxo]kvhlja_qrvvwqynf~lnkyy}~u~uzrsrgloiibsruxv{wsvxqjzxz|r|}vrnwnbfdh`\mkekwo|}{ysxokxw}{}utouhlsc`[lpgi}x}~|||u}~rtxz}s}{xvun|un|ys_exqpmb[hojvw}}quqinmjx|~}v|x}vwugjnjlcqnoqw|zt{wsk{{{y|r}|xtr{pfjeg]_kf^aie~|z{nmurzt{{uorgvqhbdsmdgyy|uo}z|puuxsr{ywytuus~zo`nyrulb\jfflnzx{~txmvzollyy{xz|x|rjpjohkrkolyzt~{{}y|my|wt{|xzz|v}ykmlkd^kf^W^Zizwy}wz{{~vru~{ow}tngqkaadYRSHGL\qptwy~xuz}vq{nqzusx{oiv{ylpjbb`TU_VTW[l{n~qeyvi||x{~xwuwmnzmihdfoywzpbmto}d~s~zq}uiflbdrccfeel~yu|mv}ow{s|vuvy{u{|}~uvoyyzz}~}xynyon~przw}w|zzmztrjac\dbdvieyggvlynrej}tffe}wpfqqy~qvmutwnrsl|rh}lfqx|vwwv{}~pmzqmrqfortobhdiupvvxj~{yu||y~trxxwc_^Yidcr_lqQkhln]i^jwdgjc}~jnfjlyrstrl|{~vvwxgr{t~{}}vyvvzoy{ufmhq{o}utn}{~{~}{|wq|dw|wx|{y|}idgcqhhxes{Xomrteofsnmqkoplqs}vtyqiwqwoyymsqhi}urzy|}~wuv|}zmnxttzzktwwvckkp~pxp|m}xy~yuut~w}r}uwi]f_kh`sfi|[_jgp_gbi{ldibtidglowvm~rjvx{swwlzzwy~sts{}{|hnoro}tjz}{{}zz}zx{shwww}~zxz}}z{pemgsmhzjqalopuirisslpj~nklss{wq|nfupyqzyntslo|xt~x~z}uwosz||whpz{~{nywzvfqnv{pyx{|ypzz~|xxwtxot{xyxz}y{eghfpbnraupZvxephijbuwgeegxegkpo|nywjk~}zxtm{{}~|ww|vqzy|posnzqzqo}y{||||yv{x}r}k~v}zx}r|tutuv}~vptmvmq~is~eupuspuiwsjljmloup~uu|lex~w|t}tvpvlzw{|y~s~rtqqos|wtjyys~ztntnysyu~vyyt{~|~qynpoqpu~zx|uprjrhoxdmxbq|jomlncqxlbdd|}gfkqk{qt{kfy{wu}xuvwwuz|{t~{yvxrzr{qzs}xwyz}{}yr}zsxp|w{zy{o|ymoousx}{|tzrwnqlwtwwvwkwvhijqlnxn}ws~ndt}z~v{sssxyz{{~q|}nmmsnqzr|zmz~|u}vzsytxwv{}}~ww}y{zrv}liiwumozvy~x|ttrn~sfvrj}unsothkvuf`bmthgqno~muej{}ux~|zzpryvt}~|xw~}~{xzrp{u|z~rtz{z{wqxrvr{uywywmy}ughjspvx~|~w}upvwxxzz{nw}zigizunnynx~psdo}|}~yyzo~{t}x}z~rv~ngitxnmytwxpsz{~yxyurzxz{w}wzxw{y|vny{tccg|ols}rxxyqxqjzrq~rrttuirwud`cspijvjt}nufou{}y{ukmvut~}zyw~z{usxy}zprv|x}v~xo~wuo}vutuwwuktwvebgxwrty{}}p}w|x|{~rx}}ofityooyqqp~yjm~~zwowu~v{z}ssz{pbdlznmwxq{vq{{vvy~vw|~zv|yszyvwxyultvtc`durnrsy||uzwlxxs~vswwwlswwg`drskkvkq~mwipv||v{rgju|tuz{z{zzsz||z~{mpxxv|tztrzvnp|rwxottwmmtuo_ai~|rr}x|yw}z~~xv}}yhgmsotyjxs~riw}wuqyzuyy|toxwtbagy|pmt|mz{q}~y{w~usx|w~u{yq~{w|stvwrksrr`]bs{pms~p~zxyp}}x~uwy{woxwxfbfu~qloxhw|ovjt~w~|}|u}||lfkywsws|wz}u~}yqlq{vypuznw~vvmxxtypqsuoirpq`]ct{qovqy|}x~~lhl|uqv|k}}pujt~~z{r~z}twy{sowtuc_dtyolrzjv}r|{w~uqv|u{s|}}s}~x|stvxqkspqa[aoxnkq|l~yz~v}xy|~xr|xzkchu~snq{iv~n}wkr|}y{||u~z|mdiuvrvq}yy~}w}}xujny|vwrws|oq|z~y~}ps}uwqnstrhqoqg[_ixrmp}tu|~yzjls}ts~vmtv|plx~yyu}|ztxyzotvtq``gvumlwviywzs~y}~spv}{ry}s|||r|xxpqsvnksnqa[`mumls|k|v{zzz}|tz}rfis~vqs}mqoxznp{{|||x|~}s|zztego}ystwq{}z}yzy~~~mkqwu}{kys~umw~y~{wumvysrjmorjjrlqb\aovopwmz{yknw{vxqrqx|qq|z}xt}zvquvwmttsq``gutnoyujyv|vy|~uos|zot}tzz|qt}uunmoqmhsmqg[_jupns~ouw~||x|v}~ziip}ytu~rkss~}tr}}~x{uxz|sy{wygekyztv|nz|yx{}y{|rjnz~vu{}hz}my|wou}z|{{tvlpyrpiilokhrlqg]alvrrxp{{~{}mnv{wyqprv|tt~||wt}ysortulvssqaahtsps|rlww|zzz~{rou{{zm{tyu~|{{vnwzspikmphnqmqa]cpsor|zjx}z|~z||rjny}vv||h|~nz~ysz~x~~|tuwztu}v{nekwu|q~~xp{zuuzsuw{wxzulp|wzrviuz|~wr{sx}zrqsuppztzl[]rzuz~k{s{|uy}~}|oqfkt}|}uy}}|wp}wps}|wx}zc`uivt|{}xur~xvy|yy|{pt}qjjrwmkjlgc_orkfjvsrllptqq{swk^brq~v~{~tr~|~yy|zptx}yz~~}zgVZnzkorngkprjltjx}|yqkwunjs{yy{wxzxmpzuy~yljnqq|yqly{slo|xvqquywwy}tgjx~qxwomx~y{sefmusty}hsorxummqsoszxr{uu~yw{~{ywwo__l~}}y{|yzz}xz~x{uidgjjp~shntjb]jkgb_cghdpkjkZXapw|zt|v}|}xzvrqwsxx~|~y}zoq`X_q|xquvtipqiyz{|~|ulkwqjep~xwxzuzyvmp{ptxysjkmoly~up~|unp|yvpquywyz~xkmx{pvwnmr}mjowvw{lmsnutnlproo{|t|}xs~~yuwyzu~xstd_hy|~{wz|}{w}uqsrjbdhll}}rmxskbdnkgaadheiqhmf[]iv{r~wx~{~~~}{rz|utwxv|~|}|{{zzrxtjm`\fy}{uxyvlstjy||}}{tkiuqliq~wuvxuzyyoqyn|poqnghnrs|ys}wro{{xsqtwwwz{|opzujpwruxunqyzz~riykpqnkpttr{~vz{tzzstuwrxwnsidl}~||xx{y|~~n{kghe`ckrtwpzxoiepojdbdgfhrikk`blzuy{w}}~~|}wov|xz||x}~{{~|}|utsrltmhmcco|xzzumwrl{|}}}yqhluonkw|uuvwuywqs|zk~jklifkquuwx}xpt~{wqrtwu}wxqv~uuzroqsqww}ypov||y}wxz{u}yzy}}iisqzs|zqt}~|}~vzps{wplwuoklz|ytrtwx~~}t_x^\_agnqovy|zwvklz|ztwuiiq{t{wt}uoz{vuv}rzzyuvyzvzn^_snheXW`lt|oy{uz{z|~vv}mq~yqyyrnm{zxy|}~|~zxse}}vnlmmio|s}}z~xs{zslluut|{zfiv|phdrvtonpssxx}}rquzz|~xg{|}{vvwvpwyyrxskdfprnt|v|{}t{~|}vvwrpql]t|xrhirgnzz{zyslittmhbkke^]cmszxxwkhnw|v|xu{kn{yt}vzorph`^gv~ttxz~kouknpoqtrljsfftw}}v}}tpjt||ywy{}|uvzxxxtbh}|xpnzutz|ty~yrmqx{~zpvlbpxuv}{wqqrtu}v~xpqvyz}|ldy{}{xxxso{|v}tqwqjcen{yv{t~|ys~~zuvvsrqhZtxmpviq{|}{yslkvtmhbkkf_]bjq{zz{plqy~u~z}~}usyjjx~w~}~xzznmoib^dp~~{~ujnmopprrngplanvzyzxtnoz|zvvx{|~vsuwvwwl`|}wpw|r|}}~ys{|wqpu}~xnkqcdt}x}ytsuvx|xwqrwy{}ziiyyzywyxtr|w~yomrnifjt}zt~{}~w~r|~unnonprnaw{st|oq}~}{voluunjbgjgb`emtz}y~ups{xxyy{|||yqmukgx{~~~~z{tidjifekw~{j}slmooqqmfknajw}yx{vrpz~|xvwy{}upqssvysg{~ztxuy~|}zrw{xtsx~||zywrifmdcw|~|vtuvy}xxqqvxz~{lmzxyxxzyuu}w{zukipnkjqz~z~tfr|w|qnoqutha~~}{z|~qjpoicbejnwzpvxqqw~~psnls}ymbfi[cqw}~zt{oyv|obegc`agpyxqmou{nnqbdrw{~~zuu~}xvrz{xy{}y}zl|stumo~rtvrljntzzsnnqy}yomqddt|w}|yz~su}}~|}|saj}qrtvx{zvyzz}}}{}yw|sljmsyxrqvhfsy~||~|v|{vuvvzuu}|}wfr}}w{~}tr|~|tuvqjfhms}~wywx}}wsmvr`lyopsvxzxtyuwwppz|{zsvwslikry}vpopuz{wy|mlwz~|~~y||~t}|zzyxvrmr~y}wxztlffioy}}{}ou~mihjouwtv|nkw|~w{}x~}zfksruy|~}y|}{~|z{ww|}ywx||yyrjtxz{{zwx|ztv}}ytssux~vpyyx|}jixwy|~}xx{~x}}zy~|unkmry~xwvx|}~{vonx~mawrlnqtwwtr||pxzsnqywxwtz{volmry|ysrrvzzxps|~~|z}}tyvvvutplr|u|y{}yqkikpy{z{}mr~lfeglqtsw~smx~~xy{mkvrtx{~~{{y~~zz|}xvzzyz}~}z}mrz|||{xvz}zvrx|ztqpqszzoszyzvgx~uuwz{{xu}z{}vle__eoytv}v|u||x{xr}|vxsuu{}z{pnyyz{|zvv{nsyzx~~zupwzxtsv{}{peeimqrpnvznt}sv{{~t~zqebu|{{|ztu{|xtsuyz~||sr|vwzyjl|uqoliikpv~v|{y}og{rilv~~xu}|pw{smkrzz~}r{xxy{zwsx{llv{~}vmhxplgc^dmfgw{vuzxqmcciloqtw{yvy|ude{{kefhkljglzyx||{yz}~}{oqx|}|vy}{|sjeopsvtty~|kcwodbgnw||||uirqifikktzyvsruzs~wy|spz~}m`szuy|nnwwvw}}wtmosrnnsz}bbrsy|qh_Y]d\at|~{~zwxz~yz~|~~|qmjs~|~~{{hoxvvvvwwx~y~sg_^gzsah|nikoswwuzwqz}|{{}}{z|sZZospz~tlu{}}{yxz~xx||vnjksu{||yy{lafkou~|~}xsqqu}}z~~whp{y{}~zw{yu{vnmsvvtsuzxhpsmmnqrpnuxv~~}}ycg{ysx{u~~zuqsyyx{xzyrnnr}}kr}lfgnw{rwwtqptzzw{zvpmmpxz{|joutyz~wnihmz~jmvqprtuspt{rlu{{zxxzzqmppnmqxt``tujjqz}wvzpiu|xy{{vu{~|wttw}qvyxvux{xy~~w~~{hdvyiabflpstzy~zz|{vrvxtlfbcjvz{pi}xnkmquvuw~sw|{}m_mzrnw|{{wuy}xuqjknle`_bl{thw~qllnqrpottfcknooqt{|{}}yusuz~~}q}~}z}~ztpnr}qrpe``abbbjurmv~~{xuvz|uquxwsqqtz|tz~}~ye_qxmhmv~~~rv~zxx~|}}pntuttv{wpkkpy}x{n_izshfiostqotvkgqwyyyyz}|yrpttoieejv~nuzwx{}}|xyd^p{sosz~x|zx{}wtpjlpokfdflw{vz}ujxrkjmoqontuhdlpqqsw}~ty~wqqpjb]\cpvpwjeegihfhoj^aikkknry}xrtxxussv|z~uc[n}y|{|}~}}{wsrrplhlma^iqvzyusv|~upvwtuw{}ym^ez{pklortrpuzrlu}~|yxy~}yxsqvyvqnouyyxtux{}~{~}~|wd`t|xztu||zuqopvzvtqkmpokgfjr~{oi{uqruwwuu{xjjrvyz~zp|~~}ww{roqojedgqznxtjggijhhnqfajprqrsw}}{uu{}|~qcl|z}}{~xuu{zustsoloqd\bhklot{zx{zu{}||~{m]cxzpkmrw{{z~zs{~}}wtvxuplmtx|vrrtutsw|skqy|}}}}|zseUZqztrv}y}|xvw{zusnknrqnlnt}rvuqqstsquzqipwzzz}~}zty~~z}z{~|vtnjmomhdekvvy{ojilnnotzrjpvxvtux~|~||~tdj}upryv|}{{}|rx~sooqqolorg^cikkkmt~ufk~ummqwz{{{sz}xsvxuplkow}}x}}xxz{{z~|sx~~{z|}~xjZ\pwnhjqz~}xtvzzvrqt{~zuvvpnpqqorwpdfmnmkknw~nk}|rorx~{|~{{zwrllnniedfoz}}~vrsttst{xmlswwutuz}{|{z~~td]l~{rpt|~}{vvz}{xwx~~s~|rmlmmkjoqfahnpooqwuhpvmkotxyy~yqv|~|xutw{zwwsquyyurrv~xzvonpsttyzqt{~}zyz|~~ra^p|vnms{}wwz{xsqrx~~y|qjzyroqtuttzzniptusrsyvjtzsruz~x~zwqmoqplijpzvsttsruztikqtspopu}~z}ud_p}xolou|~~~}ww{}|xwx~vtnmmmlkpqf`floopt{}oaeywonqw|}~x{|{|~ywrmmppmjjoyzw{spqsssv}zopx}~}}}{~~~zqb\mwtw}~}}ywrpuyyvuw~zoy{pjijjjjpsibhorssv{zmszwy}y|~zyz}{wtpjknoljkq{|{|tqsuuuyzopw{{yxz~||~{z|z{|qb_q|tqtz}zy}~{z}ys{qkjjjhhml`]djmnpt{ofrxpnptvwywry~{yy{}zvtnknqpmlovz{usuvvw|vpu|~}|}}wz|{z{zwpbV_tztopv~zuwzyvssx~|ourkijkkkosjaemqrrtzxkpyuw{~wzzvuvxupmhcdhihgjq|xttttsw{tjmtxxvvx~|~~}y{{nadx|tru{|xz~}{{pr~pgddeeejoi`clprrtyvil~|rmnrvxz~tw~|yxz~}ywtopturppu}}~vtuvvw|ypsy|zxwy~}}}x|xj]cv~womqx|wy||yvvz~{~qwwolmnnnrvofhorrqqu|vim|rllpuxzxz|{|~}xuqkkoomjkow}{z{wwwwwzxnovyxutuy|~|pbdvyoklry~~{uvy{ywvy|xxyojiiihkpk`_fkkjknv{mjzvompux{{y}{|{xvpnqtspory{|xrpqrru{{qntz|zyy}{w{}|}~}xo`Zgxypjimu|}z||z{~|s|unklllnsuleiorqoptzxmtwqqtx{~xz{xwxzxtqmhilnljjow|zxzyzzz}~srx||ywx|}}}qc`o}zpjimsy}}z}}{}xp||phffffglmc]billkms{vks~tnnrvy|x{~{{|~|xuqlloqomnrz~{y|wvwww{{qpvzzxvx|wuy{{||{uk]Ziyzrllqx~z||z{{qztkhhihjmw|yxtuwyzxy~z|pqxpklmopv|zst|{kp}vx{xuoopqnlr}yrsxzywvwyzwutqqv{~~~w`j}}vrrtwy||}wx{~xrz|zzxqko}zywvwy}~|tuxqnnqsu{{~ujk{wtvwtorx||ss~vrqpnmr|~|~~{yyz}~}{zxz~~z{zyqnnprtx~yx~~zxx}|tmgdhv~vqppqponllpuwxxz}yuvxxz|v{~vqoqrtw}|y}~|wqopv{}|w}~xutssu}yutsu|zqlkjklorokmruutssuutpnnpw{}~y|}uolihjr}~}~}|{z{~{xsnkkp{{yzzzz{zvpknw}zsnjhhgimuxy{~|zz|~~}}|{|{xwvvyxtsstvy|{xy}}|}vojgeflv~~}zwtropsuuuvxz{xttuvvwz~~z{{usstuwz}|yz~}}|{xspnov~~|x|~|{zzz}{wurqrw~|wsqppqsqnortttttuvurpnmqx||~|y{}wsomjjlrw|~|{{|~|zupliioz~}|{zwrnpw{zuqnmlkklprtx}}{{{}}|{{z{~{xwvtsux}|zzz{}}}~|~ztolhfhlqx|xvuvwwwwxyzyutuutttuwxx{~yvuuvwy{{yy{}}}|{zzxuqnlov~}~}|{z{}|wtrpopty|ywwwvtrrttttsttusqommqv|~{|}~}zx{{wtqommosw}~~{ywtpljjox~}{xtqrvyxuronmlklnpsw|~|{{||{{zzz|~|zywvuvz~~}}~~}}|}ztolihhlqw|ywwxxxwwxxxvsssrrrsuwxz}|yxwxxz|}}|}~~}|{zwtrpqv}~}|{zz{~|wsponnqv}~{zyxwutttttsssssqonmosy~~}|}{vspnmnrw|~|yvtqoljjmt}}|zwtsuxxurpnmmmorvy|~~}}~~|yvtsstw|~~~~~}}}|}}ytplihhjov}~{yyyyyyxyyxwuttttux{}}|{{{|}}}|||}|{zxwutrpqty~}|{z{}~|{xuqnlllotz~}||{yxxxxxwvvvutrrruy~~|{|~}{wsqomnpuz~~~}|zxvsqomkjjlqy|zxy{{zwusqpppsvy|~~}}}~~~~}}|zwusrqruy~~}||}}{zzzwsolihhjnt{~~~}||{{zxvuttttvy{~~}|{{||}|{{{{zyxwutrqpprw~~~|{zzz|~~}|zxvspnmlmosy}|{{zyyxwwvtsrruy}~}|zz{|{xusqonopty~~~}}}~~}|{zxvtsqomllosz~|{|}|ywutrrqrsux{~}}||}}}}}||zxvtsrqrsv{~|{zz|~|||{yvspnlkkmptz~}}|zxwvutttuwy|~}}|||}||{{{{zyxvutrpoorv|~}{{zyz{|}|zxvsqonmnorv|~~}|zzyxwutsrsux|~}|{{{|{ywtrponnpsv{~~}}||}~}|{ywutrpnlklnrx~~~}|zxvutsrstux{~~}||||||{zzxwusrqpqrux}~}|{{}}|{zywuromlkklosx~~~}{zxwvvuuvwy|~}}|||{{zzyyxvutsqoooquz~}}|{{|}~}{zxvtrpnmlmnquz~}|{zywvtttux{~~~}}|zzzzyxvtrponnoruz~}}}}~|{zxwutrpomlkkmpv|~|zxwuttstvxz}~}||||{{zyywvtsqppprtx|~}|{{|~~|zxwvusqomkjjknrv|~|{yxwvuuvwy|~~}}||{{zyyxwvutsqpppruy~}|{{z{|~~}|{zywvtsqomlllmptx~~|{zyxwuutuwz}~~}|{zyyyxwutrqppqsvz~}||{|}~|{zxwvtrqonmlklmpty}|zxwuuuuvx{}~}}|||{zyxwvtsrqrsux|~~}|{{z{|~~}{yxvutsqomkjjkmpuz~|{yxwvvwxz|~~~}||{zyxwvutsrqqrux}~}|{zyzz|~~|{zyxvtsqpnmlkkmorv{~}|{zxwwvwy{~~}|{zyywvtsqppqsvy}~}|{zz{{}~|{zxwutsqpnmlkkklorw}~|{yxwwwxz|~}}|{zyxwutsrqqrtwz~~}|{zzyz{|~|{yxvutrqonlkjjkmpsx}}|{zyyyz{}~~}|{zyxwvusrqqqrtw{}|{zyyyy{|~~|{zywvusrpomlkkklnquy~|{zyyyz|~~|{{zyxwusrqppqrtx|~}|{zzyyz{|~~}|zywvusrqonmlkkklnrv{}|{zyyz{}~}||{zywvusrqqqqsux|~}|{zyyxxy{}~}{zxwvtsrqonlkkklmpsx}~|{zzzz|}~}|{zywvutsrqppqsvz~~}|zzyxxxy{}}|zyxwutsrponmlllmoquy~~|{zzz{|~}|{zzyxvusrqppqrtvz~~}{{zyxxyy{}~}|zyxvutrqponmlllmorv{|}}wuzutwvzuvutusspouqvw|~~yyvwz{~{{vttstnnlkjjnpzvh\nphuz~zxz{uzxpo}~}pjhruod\dimlkjjz}nvy|efmrusz~rx|rw|{|rqttopyolxihry~|xyvwsw~qrhdxvnlc`hqyurpu{wyzpv~t{yt{rvy}~yzzwkx|wsws`dyz|}xxzqzkylq|vtq}vrtnpzwkfpqkzqxr_{xq~{uqvy{ztkxy{z~{sgteaorprrhr}ytv}uv}{{{~}{osttvmn|}{sxvyzpw|}x~~hrjxyr|ymoq}{v|jpiszyrbcpoegsxl^smf|fuysz}t||{~{u{jhklp`x{v}xtyr~vyxpv|tszr}wxzy{qgs~y{~trydbfr}sbyjpxq}v~sxyppouzqnqohxzpnvwl{upm{jdnwv~y{uzp{t|y}}}{s}nmkfjeqk~{kzy{wy~vr{}}z~qyrsiuznkxtttv~{}|xqoqqxkcsvx~vur{pfqoruv{~okskaajnmcpii|lzhk|yyz}wzyxx|mtinhg|}vtu{~oxvr{}}{{|||q~vwv}ii}|spyynlqsmdt~o}w}wonu{orxwo~y|vxtnoyqu{|rq{thzqhphotps~zvn}zpztz{|x~|ysv\aglgUj~~wut{wm}zstxxymhlvxtpzt|tj{j~yuvpinvonluhzs{li{xkemqo``gmuy{lfz|vqx{rtutz|~{z{xxwp||zwljrvlw|u|~vux{xxy~w}ypuu{ifynnrpkorwxlj~sri{t}~~}{}|~nkz|{ok{{vrku{qup~ttzpxubistp}vs|{t}}yw}`gkd\Wj}povt~v|}~|yy~xxyps{zshpn}|~~tps}h{}nsw{xw{ve`~sv{|rdiz{meiatuy~pdlxxsnnorr{zq~ww|{y}sw|}{}xmhrqgdz|w||{snpy{pjv{xcnwvtmhcp{qspvxz{yplw{~}}qs{y~qr}yrkwwlsxwo|spfzy{wcnxzzzr}tzur}w||{~z}}rswmaV]sumifjvozv{mx~~}pt~psjo{zyxx~n{{qtztgy~x~tkw~{{}zvz~vruyz|xzhpynqhhly{wvmmwqjrzjm{{wy}uopkafx|zt{vx|vg}rufhwtlgnln}qndrt|~zv|qp|x}zyyzuyyz{ww~~{ympxwpig}xj|~}zemx|w~xzxsz}}zws~}~r~iu~pagwp^Zbiid{y~r~~|s|~yly|ouru{|ltymm}tx~}zw}oqwr~x~~~vowuwtozqpigiv}pju{rwffv|rvwnz}~~qxz}whdlrty}l|~y~tvwquo||tnhpjgxip{{wv||lx~vu|~xu~xzkv|}{qtwwsy|xqk|w|w~~|imwtxy{}}x|w{|k~z}tlnt_[\[Yixrr{zt||sy{rq{usomq~||~t}wj~ztoprwsj|{w|rvmwyzk}zt~ysotyvnq|~wymcvmjm|~xnp|wxs}x~~z{|wwvqnozlum{}lux~}wrqgksohtmx{{xjm|{wrsv{}~ys|xw{}zt|umtx~zxwxvsrwhr|v{~oqremqu{usz}yzsv{t~zltrkid]]poonrvsyuu{zll}{tuzyrs|}y{wopxru}x}zuw~{{xh}woxsyy}rwwz|xmnxemnpursrpjruilrx~t}|tw{tw|vv{cm}mwytzyx~|slzwrtqikvr{{hdv~}}|vuuxzu~xyjx~yl~uvnxvz~x~vt~yz}xljrmio{yvz|zy}{yxwo~zu{|yrwwefmmgovkjbrr|{uz|}xxwtyt{zpqzz{~tytmsxn}zr{mw}wyuztmyiimy}xxu|xw|~mxnswoqxqci~vmnomn}{{yvvy}{xwzol~jirv{|}|}y~~y}worsrr~vywvls~xw}{v~~{}{zn|tt|}twzevtysuxupt{}ts}~{w{rtpkv~yrot{~~}p~mv||~xon|wnicanxtihy|}mq{xz{z~qv|v~||zxz}wy{}}xvyvn{{xuw}xrd{~onoqu}~zzrw|irx|ukpwmbrogilmr}|~zzz{yx{lxpopopv~u~y}sr|olmny~upmey|y{zzw~vx{{{oqxw}z}vuvoqlrtrmpxzxxzozrmu~zwytpruy}uu{{}qx~uuzxszvnnonozrqql|}||wno~|~uxzy|~|qu~on~|zy}vuuy}~{yqx~{}o~zkjlqv{zss}~~z{p}uytswrggy|vneaeq}zr~z}yzy|}iz{pxxusuxwtw~y~{~|zxsr~v~xgt|vxqm~}||zv~x|~wv|ri||nijjgkyrmt{yu|y{~|y|~soy|vszrn}tyz}~v}tu}ulyrmkmvxsdqvgbn||q}|~sy{}vr}v{ux}|vw|yzxuq}|xwk{qllpvxsopru|z}ypxpqrqqx}qehnpzvtwn{z{~}ttqsuy}~ypnt}~~trt{}wt~pep|w{oxzvy~{uvswvlsttvppleahy{qkijsu{yxzzrw|xrq}|}v~{xsmz|tpvvln~{xts{~~s|~vhfv{~{|qlx{ute\twpsifijlt{vx||}ln}ou{vxzyyxurtx|}pn}uu{sonkjqtikqoz{xkk|yoiuz}|||rklpsw}|ujuow}pnwxsy~wtsxxv{qmuvm{{xv|tiv~ooi_`cegnwwnfddgp~zxyyus{}oppprvyz|~q~x{wmjhip}xlksyznuxngix}w}{uqtz~sf|knnkjhfjwzspsw}rsxwtyuv{{ttwz}q{}w~|xxoloqps}|vsomy{ttovzzzzwrux}|yvtuttvwvv{ymp}yznlutny~xwy~|zv{urx~{s~}~|z}rt~rrsida_al||ofcfo~|swln{t|upwsnpw~zvyunmlkmvtmswz}~}nr|zrnv{xyzyz~~||~ypvxnzqdchlr}|xwy}zw|px~|{{}~|zxy}tn|npu|{umijp|zutw|s{rlt|tnoz}~py|uustx~~~~ts}t{vqnijxyv{{nw|tv}|z|}zu{~~p{{vsiffefnx}zurons{upvkiuz~xux{vvuns{|yx|uwynkkms~yvwxv|xsmy~zurwt}|xxwy~{syzjimigtwsty}|nrxyx|}{|yvx}wiw}poqpqw~xvsqu|xy}rhvvvupr~}x|}s}ypwzzyzzz~{ssy}xomnptz{t{}~sv~{y{uv|~zwtx{w}x|snot~xw{rsidnuvsnkny|xz~ywz|}tsn``gu|tonuyv}tsz{ss}{vt~|r~yx||{}}mwrb_m|}ywvtu{zzouz|}}yvz}~s{}{wvvyzv}qswyz|}}z~xqou||uonpw}x~tr{|z|}slx{~tk~{zzz{z|~||y~tm}~vpqx|qilrsyzzvhmx}}ysnr|x|qr|zy}|ruz{{uqtxvohdelwxqwrdhostrmimx|p}|}~xnwtw}}}}~xpkikrysozqcl{}uqprwzzvix|{w|}~yoy~t}|z{ymjq}zu{qmw}|xrmox||o~~ywxxz}}sy}}}}smyyqmp{zx}rnx~unp}|syvp}yxz|~rw}}|srv~~}|}ztop{yqwrpuxyyvrqwz}wr{~~|{}st}tvvnkkpwwknsjmvywsolmu~x|{~x{zst|{zvv{|rlms{ymqpgpzyuxyqmwy{x|z{|}xt~{wvzzory{|ws}wms{}wqqx{z|wvx|}rpx~~}}~}ytor|}{yz~sr{spx~yvw|wz|s~{|~|qx|w~|~xpszvv|zwx}}ov}oju}upryz~~}|{{p}||zur}|wz~xpot{tlrlcju}~zsmnv~~ws}zvv~{}{ok~{yz~~zwx|{opthenw}~wmnz{z{zu~~}~~|wolx~{{~}{zwxuuqks}}yvx~{yy|x}~|pr~tv||zyxvpik|~~}yvwlju~|ww}~}{{v{~|~zp}zvz}{yzrnn{|~|z|~w{qgr~}wyyvtyxt{|w|z||sw~}wojrxrxzmqrggntvvustx}}wqtypy|zyulow~~|xyxsvlfmsvtrrtwx}}rs~{v~}}|y{y{zvutrnjq{w|z{}vqs{}vpv~}xyyrw}v~|wv}}qgkrwz|}~~}zvqr|x}yosy}~zx|yu~z}xvx}qehmqsttuy|yvyztv|zz~yuwy}{qq}{w|uy~wqotyvrolouxwvwy||yspzz}|z{yy~prx{zwrrw|y~u{vuuy|{{tqooqsttvxzzwrt~~y}{xrptuw{|zvqqx|z|smmrz||}ytsvxrkoxzumirzt|}}{tppwxuzwx{z{yokpz{swywvvusomosxzvplvwu~{z}xqt~~ytsxy~wpljlrwv~~{ywusommqvyuklzw~uqt}ysv~~wwojjnuxtzyzsprvyzyvsvxy~~wrv}}~~{wsqu|x|rrsppx~}|xsoorvxxurx{|~xzwrrx~|}wrqu|ztposz|z|uopvwroqsxv{}xvx}zssz~|}zsvxtstw|~~|xvsonnprsrs|x}|wuv{~tu~}}vsw|unkow~{x|wsonnpppot{z}wy~~{}~~}}xux}~~zurqu{yz||wx{vpnrvvsv{vvz}}wu}uqtz}zxtnnyz~}wrooqsrryzvy{y~~{v|~wtv|~||vtuzx}xtpptwslv~{wuvy~}}wu{xrx}yuuw}~{yz}vpnooomkp|wuw{~}}y}}{|ynmsy~~w|z}~xrpppnkku}zy~yv}||}~{wrprv||zz{}xpqxysmls}yx{~~x~|}}zy|~{~~}ytonry{z}}|ywusoklw~{z~xu}~zuy}~|{~|{||wutuw|{}~zyxwsmkuwyyvx|~zy|vw|~}|{{z{z~ytqqty~~yzxz{trqqxwsrrvxvplryyt{|}~|}uqtv~~|xq~|z|lqsmnomimzzy|u~|zx|z{~{xuz}x}umrijruszsn{~{wwsy}t}swy~t{~}olvujrketxvy~~xv~}ntux{||{mt~}zyyx||~~tpwy~w~|vwtxvt~sh`gzqmxz|oi}|{ttuqvzvpugfgxw}kt~v{v}xtak~}|vlmgmx|svx|wur|}pwr|z|xm{t~|}qv{}}}vrvps~~z|x|nltv{ncyx{opvvzyxzsov}xy{qsv}xxl|yu}vzyp{|~z|z|~}|vqrz}}nxqu}hfgtn}zgtx}z|uryw{{youjy{xswz|~{yrewyuqzvryyqy~ylnqfrnqluz~yiv}z}yts}wzpzzyr{momfwr~{rylvz~znpy|}~rr}r~ur}uiiswuzeww|{txxwrmr{~wzueuka`oww{zf}|~zvvy{wyukqyyym||wq|whx}v~q|xq~~opwqjtnvwt}oqxss{zqlvyuu}||}~|xw{wvy{olwpnk{zwwruryzz~~txsxt{xwkwyihux}z{t|y|~}v~~vw|ypknprz~sqhwmemyntylw||yt|}vy}rsswmxy}|{u}}{}~sp{vwii{t|wuumrxrvrphxumqxmv|~w|~vuy|~||}npz~zu~wrlqjn}wp{uxux||{txyz|sy}trnovsv|ovwk{|~~}}zy~{~zyrlmruwunle{xl}wp}zpyxux{z}wyzpunlsuz~||}vp|vqz|tp}xvywq{yuslts}}kgrxo~m}}xz{zwrz~|~tuqxt~sxwjqgi~{}w{wrw{v{xz~|quzrrrrhuz~yjm||{uvzzv~wzyss{zsqtzomwn~uyr|}}~xsw}tq{zmspr}rmx{x}|}|tvy|u~stwu||~}wo|~tnjxwjl|uvk~{{{wpu{~}vy{yu}}tx~rw}jfit{v~}~~xy}wyu{~rsxpv~|ztw}uurs{ynpyx{}}~~yx}z}w|xsppz|}~{x|}tz}yuyz{|}qw~}|~w}|sxp{ngiywoy~{}~{|}py{tfr|q{|xw}}}slhp~yuzywyy{m|yzxx|~ttw|{{yy}~||x{rpvrnmxsmzy|}t{u|{wpvzwwmmyqxyoswr{}tz~z~}y~y}tmuzwxsw{zz{vz}|msvv{x{}yt~}szwyskfj{z|~{}{}zzvy|wxyrpsxzq}uzvpltmwuv~}vs~{|{t~}qstw{x}yz}x}}~xwtu|xqjmwvq}||~r}{w|{wy}xzwwv{{nszwvpr|}v|}|szv||}uuwyxuxpqru~}w|~xzywx~vq}zzz|}{osuqmo}xp~}{{|}|ttz{nnygq|w{~}~|t{|{wrwzpqry|ztw~ztpw{z~~{z|v}|~vv~xv{ukbi{x{}~xxzz{{qxypt~yp{|owqmwy{}|{}{}xwy|x{}rnqlsw}ywxys~~~}yy{}yw}v~tvtoy{zrov|y}}~{~y~uu{}sn~teszurz|{}ru}~zzzyxztz~y}~zsy{yx}wyuyvyzy~~~||~{~yptomjpzzotw{{zxs}}~|vns||yzyq~{mq}~|{y}xx|w~}}{xy{{wonus{ust~}tx~z}wxxww~xszxyzqgpy{|z}}~ww|}|xyvqxuptwpqq~}~svxx}x~zor~xs|y|vvtq|yt}{{}z}{}y~wxmpzztfitwr}~z||}w{|{wuyxxxyxwpr}zxsyy}}~xw~}{|v~~ywyxtywkvxvx}uwz~{}zwx|{s}~y~{{wtwvxsy|s{~~||z|}xq~u|st{|ojqxrwv}yt~t}zqw}z{}tww~|~yqutw|~zz|}xz|z|yz~~xqwxx|snfkw|twztw~|{}wysst~yqr~ytw~trr{}~}}|~}~vv~x{}x~wlvvqrz|rpv{~{~y|{|~v|||wup}~vov}zyxty}z|x{v|qutlmx|uslvy~y{yyxur{}z|zyvzzsyzys|vzy{~||~{}y}|zz}totqslowyos~~xt{~z|{zz{||{wxu~xoowvy|zuz|~z}zt}~}zyz}zuwurpvxmvxww~y|y}x}{}~us{y}yxnu{{{|u{}}|}u}zx~~~vqnwsqtxnnqy}}zy|try{|vw}|yxzzpz|{wx}{w~z}wzz{xqqjuuuqiouyz}v|yu}vwzx|{tuvmo{yxpz||~|{~{zw~~{{~ux~tpxvjrqw|xtvvx}|}{y{}|{~xv}x{uy~{xw||{~~{w~|~qz{~zvur{sjjrqxwyy{}vu~yw{vxxuuty}zw||~x~}x{x{vuoqrnxrqjkz}rwvxz|y}|{u|~xvmvyvw{trut|}~~}~|{{w{~zsxtv}ymrmrwqwsoqz{}~|z|{vz{~xtqk{~pzzwzsz{|}{x{zow|y|{{pplglxvuwt}}}wyss{{xx|{~zmu|{yu{~v~{~{}}yv{wsqmdosptys||x}}os}}zprplpnwqhhqnrsr{tyz~}v~{~}}|yz|~}}z}z}{wpeqx}usv}y{z|yzturs{t|x|w}xz||vfp~vmfbmkikpinms|ssxz~~~~v~{y~{tmmon|}qz~rnuwv{s}yx~{r{uxzsljfm{sx}~~z{uxvympx|}wloigkqlokn|{zw~~~w~|~yxvx|~t{zy~vlecbrv{y~|{|~||}~}|xumj||}}{}uxzx~znqps}{zsvntpiipnqrkst{wv|zx~yzvzy{uzxuqpjt{vxrqvztxrv{w{rz{txqnorhpx|zw|~||zx~zpmkz||xnmrlknokutzwwzv}|~|wr~~zxx|w||}x|wtkeedgvv{z{}|{}wmpsrx{~y{t}~}zyusms|{psplntnlmp|rv~}v{xy{~zx~}~|wx}{tnnkv|rywsswrwzz|zyw}vu{pvyvkjmvwuuzy{zrnpmx{wwnsnjluuxpryw}|~~zrrq}x}x~}}~~~|zzlnkhegds}~|}wy|wwuxrmn}~{~|y|}yzsoqq}|uqvqmklpykr{ywxz~u~|w~}{xy|~w}xxrnoqt}|wwxqpvy|x~}x{{yzxo{yytnqqimz{t{zwwsoomuyznqqquvnw|pz}~}~|{wsrxywxw|z}z~rruknkfcgk~}|{v~|z{yw~totvp||y|xx~~~xz{urrtv}wtqimvqlxszxtxyy{yr|~wutz{}|wvvsnlhw~svuuzz|ws{|{zw}x|{nxwmipqy}|{~vysnlns{|vx}rmwzrvsxwsyzyzy|~{yvx}z|}w{{toxlkjhinip}vw}}v~rw|womlz~}{u{yx{}}x{wspml{}rpyskpvvvkuywxwvzzx~zyursry~~}wxrjgont}y~{yxsztwz{|~o|qqstsrq~}~}zzuvrqstz|yuzyssu}xts~x}~{wxvv|ywx{x~|{|psulsskcimwv}{}{}~t}zyronno|w}{ywzvx~}{zrkhhs||usuvunrtnzxvwz}|xstvtqqo{}}}opssigl}{yyuvwu|twz{vxwu{xurqs|}|~|xyzwzvzzwsop|xysw}|~x|x{yw}{}zxxuw~{~yzyvx~{~~}z{ssuoknmgcr~}}}}sttrnmkx}~v|~}{~|}trnmmpr|z~vpprqxor{z~{oxxqusqpu{}~|}ryxvskmpmlxv}zzvuxww}w~|}ws}xywtsrt|t{~yww~z|v}{{uolkr~zzz~}}~|z|z{}~z|z|zton}|xy{|~}u~|{zzuwmrqhejmzv~xu}sssqnoq}~{v}|{w{nprsrsr~zwsqqtqwur|yzqs{qrtwywq}y{}{t{|kptqjhix}{xzxvvxyxz|y|wxxvqolx||}v~wx}zzutpmlmo~}~~yw|xxwrptyu}|}|zxvy}}vjyxiilnoqv|z~zq{wprstvx|}~v~{y{wmyvrvussu|xuurqssyx}zyxztozuv|wpsz}{|||tn|uqmjhjlx|zzxx|~~z|}y{wwtpkmp{zwy~|yzzx{zmonmlns~~|y}tywyntzvoq|~xvwwy~t{|w|zmsnmrqpqs{|y|w~}~vr|utyzxvszz}~xw||z{swuuutssq{vwutw{}{w{zyyyyq}tqtzvqu}}zzu|sikjiijs~|}yyu}}xvooopsu{}wvxw~|vsrynmnmnsy{ywx}~~pw~xuptwvu{}yyvuwwzz}}yqm{vprqppov~w}}z~~}~uw{{zupooz}yx|~~~}~v}tusoijt}{y||~}|~sw~|{z|tzwwyrorvv}towmjkjikp~{{{~}uvzoruvuuw~yxuuvwxz~~|xnwvmpsurlr~zy|~~||{yurzxrnmu~w~{xxvvz}u}~yz~wu~uqrpkihs{z{~x{xusqnno|}~~zxv~}qmkmqpn|}{xy~sw~vs|oquwww~}y~~}zrlwpjlnoqryw~{{~}srxwyxvuu}~t~xwvuvxz~}{zyos|uvsmlsu|||~~~}ozxtqommp|{{~xyy|z|}}}s{{pnkhfiq~~~y|x{qrqpopx~~z{~u}{ryqlsslio{z}{xxw{~u~{||qzwuyyxwx}~yy~x~zyxolwqostqomv|v||}|}vy{xyxurox~}xvwwz~w}{zzztxrkpvrmn~y{z{soppnnq~}|wx~|r~~stylhijlpt~|||}xtv}rprstxz~}}ywvx~{~xkp|tmkosts}}z|yxxxz~~~xpzyyzyxwx~{{z}~x{|~|yxwulv|ssqollq~|}~~~~wwwuqmq|{zz~x{|}}}tv~|{{}{otvssompuw~zqzvnpqqsw}xv|yz}v~|qjsminprsw|z~{}{vvyvwrow~{{}}}{yvt{}vsv|~|y}zwst{~trw|{}~}ytvyws}xw{{z{}yqm{x|ww~stz|wuw{plnow{uu{||zuurqtwztp{~||}|xpy{qv~|qovwz~|{tqqt{t}w}}u~{zwvwxwtznpuspv|wtw}w~yyslffqyvqzvpw{}v{|y||yz{{zxqpsm}rhjkmnfvmfmssmhtz{v~y}~vmlxx~uz{{ux~~xy{wz}}}uvkrqpriwqnqwytks~wv}yzwwyvytuzzsjir|~uzq|x~}}vpwz{wqjvromepljiswtiozs}v}}z}z|{z}vysrt~{yy~|~{~{y|||yr{}~wo~{vslsupku|ypr{qzwy|wvuyx{w~zy~pu|upnku~xyzu}z{umt}yy~|wkzyrpgkqmfnwtnnwpvwuyxw}xwzvupw}w}~~v~~}y}xqt}qzxwnmtwmpzztrxws{r}{vr~||{zy}~zyoxwprlm~w~}y|y}~wxomw{z|}rp|ttmgksniswppqwpzsxyuz}wxvxtp~~y|}}|~v~{uzuov~~}t{}xwnmtyorzvstwxu{r}ur~|y||xxpvuqsloy}|z{v}|~q~znow|zxupyttnihtrkrunrrwuxww}uy~~{zv|vywr}~}{w|~~~|uy}||}xqxpv}~zyw{wxrmo|vqwvpwv{wzx{{r{~y||}|surtqvro}|x{z|zy}}{}tqsov|v|sustssmgmyqnsnnvuzwyz~{v}~}wzwwx|wyw~~x}}~~zuy|}{yznxrw}{zy{wvxuply}tttovxx|x||ty~~z|xquvrrwwr~}{xw~x{z|z~}xun}wqy}y|qxupstpil{vpqlnwvy{w|~w~}txuzz}~uz~~|}~}{tv|zw}yvpx~sz~zytvyvpm|~vtpnxzww~~~u|{}{~xoxyotzxv}{ty~~{yv{}w{}tsr}vw|{}q~sovtpht|vrmkszt|yy{y{{xxtv~{~yw~|~|{|wrw{uv}tst{yx~v{r{ywnv|wpmu~w{}wyzy~|z~}~x}vqrpzzwzxu|~}}ux|xuurvwxw||s~znwvukr|zulir{ux}vz|{|}|wwt~~|{x{{y}~yqv~xursrxvxz}}y~t}|zpxynmv~wz~wzzz}}{x{}}{|wtspzxyy|xxx~~}~uzyxttrzswz{zx|qyxwmu|}wkjs{uv}v{|{}z}~|yzs~|}z{zx}}w}~|rv|vvq}vo|su{||w}}}sy}plv~ywy~{z{}|~vx}}zyw}yoyxzu}~~yyxzywx~xxs{{n|uq{|z|wyyzrt{~}qipzys|{{{x}}{y~z}}uy}{{|}|zxv{}}}~wszvtrs}ovznx~{}}yv~ynp{~wy~|~vz~|}{uw{~vz{{vsyw{t~|z}v~{{~wzyuvr|wp}rp~}|~~|zzzrx{}pks|xuz~z{u~zw~w}}xz{~x~|~zxx{}|}{{}wtxrsqrzqu{mx}|yx~{pq{~yx~{uy|~}tuz~}vx~wyvyx|t}{zyy{~|~}xywrtpvyqyxn}z}y{sx{}vmq{zww}}r|~}uy~vy}||}|{|}y|}}yzy|zxyxuwqoqouurzvq|}}|w~wqw|yy|q}xqy}||~qzv{yyv}~|y~z|~||}|zzxyxpspruvuzrvz{}x|tx}|{qq{|xv|ywvvu~yxy||}{{|~~}{}|{xx{{wvvuxpnpnrtvvyr~{}|wysx|yw~~q|yqw}}|~r}|s}|xw}{y~}~}~|z}{www{vnsossxvxvwz{~y{t|}}~zsu}{yv~zvv~uvxzw|||~z~~~x~{z}wx{zustxxmpnpquxuyv~}~x}xw~~{xz|{s~ur}||ztxuz{{z~~y{~~~z~zz{~}xtu{|prqqrt{txv{~{|vz}}|xv|}zwx~~}t|yt~~x~v}}}{}~}}xz~tyw{{vqqx|opooqq{tvxyy}~{z{xy}|uzxs|~}||v{{s~}zyz|y|||}z|v|z~}xss|~qspqqr|styw~v}~}{zz~|yvy|zwyyv~~z}~v~z~}{}||xz|~szx{ztoq||ornpoq{rsyv~y}}~{w{|yyx~xu}{~}|yy{t|~|w{{z}{{~z{u{~}wqr}stpqqq{uqzv{w~}{{~}zuy}w{w~zx~|}z}x{y~}}~}|~yx~~tzz{zuooyssoopnxwnxxw{}}|wyv{yzzw|{z|}|xxyu~xy|{}{}}~}}y}{x~}}ysowxusorouzps{u~~z{z~{wv~~xx}x}y}~z}x}y|}z|}|~x{|~}t{~{{xrmp}{ssmpnpyunzyz||~{v}~t}zz}yy~w||}}wvzv~w|{~~}|~}}z}{w}|wqnwxwqoqouzrs}x||zz|ww~|zvy|z}x~v{|z}{|||zz}|{wv~}zwqlmz{uumonovxqw~z{}|v{~~vyy~zzxx{}}ztzzyy|}|~||}|{~{z}xqnr~{zvousv{|u}~}|y}zxj}~urvtq{z|z}y~wq{~{yyvwzvojhrzuxqpssx|{w||{~y}~yyy|}~u}}~wtwsu~}uv~y}|~{{pr{rpmqltyupjgkwwwvnqpswzvw{}|sstp{sjqtq~|syu{~~~z}~zvzytu~wzywztopz}xxz{~~vyyz|{xst}ysyzxzs||z}vqsztxxy}|yrrzvptltyrjedktqwplonrtxuw}~~wpowtu{t{ywxwwu~}~~~~}zy}x~t}vuy~u}x{wqpv|~xzz}~~~}|y~|ztrx|tv{v~wv}|yts{vs}~~w~~z{sqv|tyur|xngejspwtmonqrvxu||{}~}~ysqwsp{~x|y|ywu~{{}~}zy|yzv|}wux{}v}|zxqpw}{yzz||~|y{zztsy}txzv}}yv|}yuv}usxxy~}{truwz~x}{w~{ohgorpysoooqqtxu{x{zz~~}~~zuuzqptv}~~~~ww~yz{}yy{zzy|}xwyxwyx}|yrqy|zz{z{z}}|wv{|vty~uyzu|{|w|}zyvx~vsus~||}vtvutv}~|}ulioroxupqoppqwxv}w~{x~}}zvv{uospz}}w~{xz~{y{|y|||~ywyyuux}y~vrv|x||zzzy~}{yuy~zuw~zw|uy{{|w{www}|twqu|~~ytuvsqt~tlmtprztsqpqoryyx{{~zz~~yvuw{rrro{~}zzxz{z{}}|x|~||xx{yurx}zvsx|w}}{{yy}}|}yvz{vx~zz}uyzz}y~|tuw}{uxqu~~~}|}}wtuwtqs~~xpouqrzuutrqpqx|x~~||}|{~z{uvupx|rnrx{||tx}}zx{|}z{y}}~|}}wv~ytwzrnqmooqrqu|~z~}~ux~|{||yvzx}|xwysstxzx|sx|}}}|uy}xuy||rlqx{}|xwuuy~rp||xulqqqvuv{qry~}vv{~}{yyzy~~x~{yshisx~wqlijpvtty}w|}~}|w{}}z~w~vv{}|xxusynq}xvwwz~|vot|x}}vsu~{stqovx{|xw{}{ysuxzutxxu|ynoxz||rtx||{yxx~w|~|~y}}{x~snmjoux{upqvzws}~t{}{x}~~z}~yvyv{{}}uzzmw~wtux|~zrpyxyzvtyyqsqswuzxy~|{}vsx{vy|yx}uns}{zusvy{{zzyy|z||}|~z{}yzznmmnrr~{utw|{sxvy|}~}xz~z~}}xvv{xw{x|~quzssw|}yrpxvx~zwuw}qrtuur}}yy~}{}wru}{}~y|xpt}y|usuwyyyzyy}~|y}{x{}|~~}|~{|}onpqnmz}zxz~~tzv{~~}z}}xy~{}~|tx}vsv{uv}srv|}yrqwsx}yxvw~rpuxspz{}{{~~~|{yssx||{{st{x|vttvxxxzzxy~w{|ww}~|~|}}|tmqsojux||}yx{z~~~~}}y~}~zy{}~}~|~vt~ysrx|x{yqsy}zuqwtt|zxxwzzoryxouyx~|~~|yywtux{~|{{uxyyzuutvwwyzyxy}tzvx|||{}|~plsulnvu}~{||~~~~}}~w~z|{z||}~~~}y}st~xssz~{|zrtz|yssxqu{yyxxz~yor{wqxxx~}zwuvuwxz~}z}yyxyzvvuy{~|xy~|{~}{w|~xt{~}|}~ulsxpqyxrsxouzsyvxzy{{{|y~~}yywoyxrqu~||vkmtsmmopuwnjtxqvyw~~v|zrtwy{|~plq~wqnlhnwllwwrqv}|{zztx~|z{zpnyxu~~~zvtu|xxmjswnkptuuuw~|~{y}yv}px~|z}wvupijuy}{wsqrnfksnrvrw~||~}{{~x{uu|yqvsmrw}~xpryokturquz~~z}~yuyywt{|{{{tq{{{urrtwzwty|rlqvvusv|w}yz}zw|ty~}|{qpolioxw~~zvvskptqwtrx}~|}~{}y{~~x|~tv}sqvpotx}ztyyqquvsswz~z}}|}~xvxwsv~{|{{{uu{z}~{srsuwzxy}|pnuxvss||yxzxz|~~y}yy|~}}xrpnjkutw{xxspsrxvpty~~}|}zyy|~{|yt{~~xswqnptx|z||wvuvutvx{{}|}z}{vvvst{wx~{|zwxzzusuuuv{~}vouzwrr{}{zy~xwxyy{~|~}|{}}}~|urnjmsns~{|ytrtzupsw{}}|}}yyy|~}}{u{{|zwyqooprv|}}|vwwvvxy~z|~x|}xvtruzsv}|}~zvz}x|xuvvuux||sv{ysrz|{{|z}wvwwvwz~{{~~~ysolnslox}~{su}xpruy{|||}~{}{x{}}|}xx|zzzsooppqv}{wzzyxy|{~{~yw}|wsqtztry|~|xvyz~vvwvuvy}~{uz|xsx}y~|{}xuvvvuvz|z||~xqmlrpksy~{rzvrtvy{||}}}{zx{|||}~|yz|~~{wpoppprv}|y{wu{{tomrtmmsw~wuyz~{{unnpsuru}z||}|vz}zw~}xvyz{|}wjxxrsy~{~~{}wsu|yrutx|~u}~|~zxxrpqrqnv{vvwvxzurwzwx|yxy|~~|wzuw~xwz}zv{|x||w{|tquzsotx{~|tvv}{vtsspnxyuwwwy{vtyzwz|uw~y|yloyz}~~}{~{{v{xpntumqx~}zuuz|zywps{wuvutvwrrvvtyxt~{y|~~~{zplzz}z{~wv}}tnpvqow|}}w}yv{~}{vrz|wxyww{yuvxwy{twxz}~~}|}}|ywsip~||vyyomstnt|{~{~zuy~~}xrv|wvxvtvyuruvw{wuyy|~~}||||zyxnn~{z|~wu||slquoqz~}~y~~wz~{tt|zwzyww{zuuww{yt{~|wz}}|{zzzywwojw}}}{v{~wnpuppy~}{||ux}|trzyvxxutxzurtv{ysz~xz|}|{zzzyyzrlw||{~{ux}xooupow|~}~~~xz}uszzwzzxvy}yttw|{sx|xx{|{yxxxxwxqjs~~~}xx~zqpupow{|}|ux}}}tszxvyyvtw{xqrv|ysx}yy{|{yxxyyy{rmv|||~|vw|yqruoovy}~~w{~}~uu{xwz{xvz~{ssyysy{xxz{zxwvwwxyplt}~~~yx}{ttvopvx|}~|uy|z~~utzwvyywtw|{rpw~ysx~~zyz{zywwwwy{snu}~}}~}xvz{tsuoouwz~|~wz|~wv{xwz{ywx}~vqw|tx}}zwyzyxvuuuwyrlry~|xy|xuwqouxz|}~}uv}|{yuzxuxzyuuy}xpr{}tu{~yyzzywvuuvzwnqx}~~|xvyyuvqmrwy}{|~~~yv~}~wz{wx{{xvx~~uqyxuz~|zwxxxvutssvwnmt{}xxzyxuoqwz}{~}~~}|}zsx}xv{xuxzxuuy}ypq||ux}zxyyxvutsuxtnsz~~~}yuvxwvpmsx{zz~}}}~}}~wv~w{|xx{{yww|~wpv~yv|~|wwwvutrqqsunnu|~zvwyyvopx|z{}|{{{z{ztwzw{zuwyyvtv{{sow|wx}xxwwvtrqquuos{~}{wstwxsmrz~}w{~|{zzzz}yu~yz~ywz{zwvx}{sq{{w|yvuutsqonptpnw~~|vtwzyqox~|x}|zyxxxz{uw{w|{vwyywttx{vot{xz~yvvutrqoottpu~}}|xrrwztms{|wx}}zyxxxz}ywy|~ywz{ywvw{{tryzy~zvtssqonmpsoqz~|vrv|zpr{~{w|~{ywwww{yu{yy}yvwyxvtuxzuqvyx}~yuttrqonpurqz~}}|vprz{qow~}|}vx}}{ywwwx||v{|{|xxzzxvvx{xtvyx}}}}ytsrqonmospnw~~zrr{~tpw~}wx|~|ywvvwz{ux{y~|wwxxwutvyxtuwv|~}|wtsrqpoptqow~}}}yrpy}tou{}{wv{}{ywwwx|{vy}|}xyzzxwvwzzwwwv||{~zurqqpnnornmu|{sr|uqw|~}xw{}|ywvwx|ysx{|{wxyxwuuvxywvtu|||}wtsrqportoow|~~~zrqz~tpuz~}|xvy|{ywwwy}zty}~~yyzzxwwwyzzyut|{y}|wsqqponprmltz|}urzwrv{}{vy||zxvwx|zsw}}}xxyxwvuuvxzysrz~y}zusrqppqtomtz}~~~|vqv~xrtx|~{|vvz{zxvvx||uv~~{zzzyxwwwx{|wrxxy}{uqpoonorokpx{~ztu}|uuy|}yvy{{ywvwz|vt{|{xyyxwvuuuy|yqs}{x}~ytqppopsrmow|~~~{urw|wtwz~|||vuxzywvvx|zuy~{zzyxwwvvw|~vqyvw|{upnnmnprnksz}~ztu{{wxz~|zuvyzxvuvy{vu}||yyxwvvuttw}{qr}|vy}ztponnorrnpy~~~~|wruzxwy{|{}xstwxvttv{{vz}|zzyxwwvtuzzquxtx{wqmlllnrpmr{~~~|wtx{yz}|}}wsuwwuttw{yv}{~~yyxwvuutrt{vpywuz{vpmlmnqtppy~}}|xttxxy|}}z~}|ztrtvuttuz|x{}|zzyxwvutsw~stystyxrmkklnrqnt}~~}{xuwyz}{}}|xsruutstw|zx{~}yyxwvutsqs{wrzvswzvplklnrtpr|}}|{xuvww{{{~{{ytprttstv{{x~~{zzxwvvussy|swwrtxwqljjlpspox~}}zxxxw{}{{{{wqqstttvz{x{}{yyxvuutrqv~~tu~ztsxytnkkmqtqpw~}}|zxxwtx|z~~zy{wqprtttuz{x{}{zywvvusrvvu|{truxtnkjlospnu}~~}{yzyux}{zz{ysprtttvzzwz|zzxwvuurqu~~vt{|usvyvpllnqtpnv}~}|zyzwrw{{~yx{ysoqstuwzzvz}|{zxwwvssw~wv{{truxuokkmqrmmu{}{{|xsw|}yy|ztpqstuwzyuy}{zywvvusrv}}wuz}vsuxwrmlnrsonu{~}{{|yqu~||~ywzzupprtuwzyuy~}|zywwvtsw}}xw{{yss{}yvtvusuxy}{z{|}}|}}||~~~y|rxzlry}{x{|{~|xz}{{sp|~~{}}zx}zuruvux{z~{~|z|y{{vtwz}}|z|}|txtoy{wz{~}|~pt{|wwz}xx{ywznpt{xqrvxzqtzt~{vy{||~|}ynjs~~uuumpqw}|uwv}{~zx|zxzqusx|}{~~~}~z}{x}{|tttqwzux{x|xyu|xy|tt|yxxputxx~~{}{{wovtx~~u|z~xrsqoluspvtlqrpvx{}zy{zwqqrkqyv{}z}yz~|}{zxyz}yzvswyw~~|v|}{yzty~~zx{vvxpq~yuxzx}~uuypmrnpv{~{{ukszxy}yrwwqrsuuvsy|tuzsvzw|zuzwr~}}yxwwutop{{{xy|tyz~y||~~{{v}{rrwz~~||}zyzvsy|~}xz|z|rvxtz|uuw|}}xx~xsupnwv|}{rprmq}}y{ztxtswtmpvoq|xswuy~{x{~z}|z~~|}{twtkfpor}}~~w{~|~}z~{tzztsry|~~{x||~zwx}yx~||y|~}{w|zv{}x{vx}{stwnr{slooy}}}}uwvpryzxx}tupsyupt|z|wox}{x|~y~{|}~{{zvtztmmuuz|w~||w}{{~||}~y|zxxqxzyv~}|}zz~}{svvsxxz~{twvnwyvur{|xv~||qnxzw~|z{wwujpyrrwx}x{~zuqxvvzuxxsv{x{w|}{zw~}~~z{{unsomss{|}||{}~yy}uy|ttouzwu}~~z|~{x{wzuu{~~z}~zs|}~~zvz}uyuvwpousxxy}}|}{vlq}|}x{xxyrxtxww|xty|}}u}|yuywt|~wtsztokrouzt}|~x~syzvw~xv}qopv|xxzx}~zvw|vz}x{vx{tvuxyy|yx|vu{ssu{ux{~yy~xvqmy|slz~}swxruvwqx}}qvz|{vtz~wv|~{z}}~|{v{siqkolv}~x{~x|zx{sytxyyyv{{yu}zuywu~ywwwz}z}zxyu~qrx}{zrzyyvptoqz}{x~x|}u|{whz~xvuzyuv{y|~xu{{~uuxrur~~}yyzwxoprisvp|w}yz}|{yy}|w{yuz{|~{~~}|{z~y~vzzuvtqu~}s{rvr}~v|}~r}|wvwqwxxy~~z|ywln{z~~~zz}|v|xw|x|rz~xyyo~swr}~|}}}y~wsxmlqkp}v{}~~}{~yy|||wzutzz}x{{}~w|~}{}~wzusty}}|wxvv|{}v|}~{svvqwsxsw~{}~|}z~}sm|xz{v}|~x|yw|z}u|yyzrwvs{|y}z|||zuxqkpkjypty}|~{x|}z~{~wv{z{s}||~|z}}~vwuusxxvv|~zyw}x}vy|{u{xwxtxpsz|~}~ur{yvupu}}z~|{w{~vwwr~ust||wy||~z{|sprjrtlln{~z~~|}~{vy{zuszzv{y~}{|}{{xzwzw{wvt}y{}y~~|~v{x|xxvvtnstxv~|~~|}~s{yzrpwvxy}}~}xzyvwt}yus~z{~vy~}{}zrtppxmjipwty~|}~||{}}yu{zttsv~||~~~}yzz{x|xxuzwrwy|~~v|x}zzxyyqusvswy}|}~x~|wrutprszw}~}}vxt}wvtzz~ux~~~}|wwtv|rokrtnpxz}~~zxyy||}zvt}z|zqq{}~z|~|xwxuqojrywy}}}~}}zw{yysy{xt|xw{|~~}xy}wxv{vrsqmtzv{{~}{}xzzu~{w}xt~}||}y~yw{|y~v{{twwrxyvyzw|}|}ww{{vyvoy|styx}z|yy|wpsjlvqoz{}}~z}{x}|vu{vx~{||}}~zvzxrvsooqsxzv|}yy}v{{sz{}ysvz|}}~~|}uxynrzsqvsx~~{~yuzwx{zz~{z|t|{{~{}x}}}rqrrrxqkuws}|{t~{z|z|yvu{uv{v{{zyy}{|w|xrtqrvvsw|x{xz}}{{w}yotusv{~{~y|}}|yvystulmxz|{z}{|~xy}~xuwpu|v}}~}}~}x}{tusoprwvwsw|x||~~vuyvvzx{z}}}~~wuyqs}wproquvtxy{{yzz}ww{xyzu}{~~xz{vtyuwvnruoqwuz~|{|u{wxu{{vy{|ur}{~}|~}zwztvtputpkspr||~}y~{twxvvs{{~~|~~w{{x~|x~{zqnw{v|vst~~}z|ytwpu|ssqy}~~~{v|xwuuzuvrvysrvw|~wz|xxwyxv{zv~{xzxqyvqolutqpx}{yz~|~}yy|xztv|{vu{vz}y}}uxtuupnspttw~}z|yyv|~yz{qv}}|~~y}||xryvtnrmkvzqssy~}~y|z{|v}xyyx~|x~|~{zy~{ut}}xyuspyssvw~~|{z{t{xrqpz{xv~~{|~{x|{wyuyxrqvuwptzzz~~{~y~wyv{zuuxwz~{}w{|tsow{wsv|xyrmw~|~{xw}yvswqv~vxx}{wyzurlkmkhkmtutv{~{y~}z{yyyy{{xyqz{u{wuz~}}|sruzz|}qqzsz{sxtzzww|{{z}rxrxx}}}~zxrxuqzt}{s{||xw~~y{yzu|yv~s|}}q~ppwuwvx{s~wjsky}pq{y|{}~~vu}qvxynxv~~{y}yvuxy{xz|l{xzys{{nw{nompqhnlkynoywv{}~w|ys}zorltot~~|~w}}z|}}}z|rqyzywr~wokjlqlkgwtlv{wzw{{~zzvtp~qnmlvo|{}}}~~xw|ymv~|rx|roolpqkkm{mrzxyy~wy}~{xy|ovtnsjrtu}|}|~{|zsx|sn|{}qxwsqokuqjjuykxywv|xy{yzzywym{|ppsmxs||~}~}vqxyss|yszutrokwojjwwl{|y|wzxz}yyzvwo{xpqnm|w|~||}~}}np{xuu{vtxvtqmlwijq{ql|{~zv{~w}z~|{z{qs{upqmw~{}x|||}slv{ww}|~}sutxuqissgpuylrzxxw~zy|}w}yzrwxsspo}}~{}}~}}}~x{knzxzx|xtsyzsljwijvxskwv}}xzzz}z{{~ttwtutov~~}~z~~w|ojvxyy~|vru}wpiupduxxnqvzwv}|{}w~zxsssvuqu~~}~~}{~|vxsjtyx|yzsr}ztksvfsztqmsxxu}}|{{zy~~{vsqvwru|}{}||vuwlqvw{w~vq}ukrwho{stmpwytz}|y}xx~}yrovyrv{}y|~}ut}wlquv{wwq}umtwjp}qsmmwzsy~z{xx}|}{qoxxrwy}w~|}~tu|umqtwzwxt~uovwksoslkw~xs{~y|vy}{~|qozztyx~v~|~}}vv{wpqqwywztxouunqoroiw~zsx}w{~vx|z~rmyztyv~vz~|~}uuywqppwzx}tzrxvqprprgt}ysw}vy~~yy|z~tmw|vzw|~x}z~}y{|wuwwtrotzw~t~uwvtq|ylujo|zvsww{~w|{z|ymr{xzy{{~}|w~y||w|wuuvutpqzw}xzxvxtsw~mrqjz{xs|yt}~|xz{y~qnxzy|x~~{v{{ztyxuttturnwzyw~~vzwvv|xlulq|zvuuxz|~z{zw{xnrzy~y}~~}}|x}x~wzrwtusruvpr|x{|}|xytxy|rntly|zu{zs}|}~{}{zx~tnuy|y~~~{x{}w~xsrustqqvvpv}zz}|zzyu{z{pptozzxvwt|~|}|~|zwx~|rovz~}~~~{~x}~w|zznqrstprxvq|||}|z{wv~zyorst{zwxtw{{{~|zyvz~yqrx|}|{||{yzzzztylqptqouztv{}z~~|{v{~xunttxzyw~{s}}|y}~wzxx}}vqty~}~~z}y~yw{~{vonortopxyt}|}z|}xx{wspwxzzw{tx|~}xxxyv{}zsrv~}}y||y{y~{zytwlnptpnu{v{}|y~}~{wuvpt{yyxyxu}}u|t{wz}|vrtzzzzzyx~x}wz|nmotqmr{xz~z{}~~|xwvsq}{yyx{t}}}}w}rzxz}|xtsxzz~zzxy|yzxy{qlnsrmpyyz}y||}}xxuvo}~wxw}u}}~{yzrxzz}|xusv{z}zzx~|~z{xyyyrlnsrmoxz{|x}}}}yytwo~wxw|w}~~zyyrxz{}{yvsv~zz|y{x|~|z|wy{wtmosqmoxy|yw~}}}{xtxpwwx|x~~~zy{rx{}}{yvrv}y{{x|y{zy}vy|uunnsqlnwy|xw~~|~|{syqxww|y~~y{ytv{}~{ywsu|z|{x|{yzw~vv~svpnrqmmuy}xu~~||~rys|yww}{~~y}xwt{}~{yxts~|{}{x{~w|u~xrtttmqqnlrw|{t~{~}twxx}xu~{~~z|x}rw}~|yywr{|||xyy{uz|p|{pvoprolov{~t}~}|~zszwzu||~|y{}vt{}zyytx||~|~zw~~w~xu~urqstnqpmlsxyx}z~uwz|wv}}~~y|}{~|tv}~{yzxu|zz|wz~z{~ty}|oz{nvqpqolou}v}z~}ty|}u{|||x|{}|ysx}zyzwx{{~|{w}}x|zt|}xn~unvqppnmqwzz{~zt{|u~~{}~yy{|}zyry~|zz{w{z{yx}x|wt}|}tp~qouqqpnnsz}~y|~yu}~yw|z~}wzy{yxs|~|z{{y|yz~x{|~}z|~}tv{{nv{mrurqonqv|}y|~~vwv|}y|~yxy{wzuu~}{z|z|z}{~~{y{{}|~wsz{|un{umtuqpnoszyz}{u~{{wzy|wyv|wzsz~|z||||x}{~~y|z}~}{{{tw}{ynvynpvsqoorw|y{~wy~w{x}}wyv}t{vu}}z{}|}wyz{|{}}y~uu|~z{qsysmuvqonquyz~{w|y}|w{~wxvyvyyt|}{{}}~wy~|{|z~w~~vw{z|zrv{uqprs}|||x||}|x|~~}~|}wrwz~x}{~v{{pqy{tuwvopwrmjmpyyr~xtp}v}xz|{ytxxzwxyv|vy}{yxvxuy~~ylkywrgjjlghqlhgjmw{|~{x}z}|x}~}|vsrn~uyzv~yr{vwxwzy{~xw{|sy}toryx{vxsr|xrpsvvsx~v}|sttvvuqmr|~yruquxryvtwuttvwq~~}|qkmu~zzrpmgpngdfiqtwz{}wx~z}~}zzwtrrsly}}~uzvuvswxz}}xuwwxs}vqqvz|zwzry}vqsu|ztt|~wu{yvsmnw|susquu|wuwvvvyruw~}tmlqv~~svomtohgimsrz~~zwy|{y{|xwutruqo~}}{z|twtswz}{vuywuu}~zsqswz}xw{tz~wsux~~xtu~wuzwrmpy{svqt}vt|xsuuvxzry~wz}zrlmrv}twtnurkikpss|}~{yzzzyz|}xttsrvsqz{}}uxurvz|vuwv{xtx{ysqtxz~~}{v|yw{vvy~|~zww}~r~~ysnov~~uvsq|}zsx|trtvw|vy}yuwwrlmsx|xsxsqvqlmpur}~y~|{{|y|{~x~}rpqruxt}x}wwwrtx~xuv~zwxuuwxsqty{}}}vy~y{zxy{||yz~ty|vpot|xwupz||vt}xprux}y{}}zxursqlntz||txyrvvqprvs}z~}}y|y|z~x{}rmprwxvvxxwrtxxuv~{wtwtuvrqv{{|{~xy{{|z{~~|~z{y{u{}upqv}~wyss|{|wt}xprvz}x~}}~}uwvqqnlpwz|}{v{{u|~{|~xwwsurwuqqryyvx{}y}w||qptx|xtopnlot}|wv{||tx~y{zy{|~~w|~}}~z|{{w}|yz}tj~ldhotwstpluuwxrv|spuzy}}{x~|~xwywwvy~{pr~wnhsttxwvtsv|ysw{zv}}yxz~{xu}~y||ysx}|tozrotyyrnnswtxmoxsrrruz|zw{xw}xx~}}|soz~}|zwqrjhpoqsoovokovxs{{w~|{x{|~zzz~zvztq{~~}}yvrqtyvor|vrzxuuw{z|yw|~|}~vy{||xs{trvvsymkxtooptyzxsx~|yw}{u|~|~}zvtu{|rntqqtsosslmtxrz{u{|}}xx{xy}|~wzzqt{vrsxzsn{|pwyvvw{}~{{xzx|~{w||z{vz{vwysxvjryrmnrxzytszy~}xyyu~{~~}vwuw}quursvtotsmpwuu~xv{~z|||{zyvy~{|wzzru|wsuyzrn~zqxwvwy}~}~|xw|y~~||w|{~}xyy|}yzyszvlqytlnsx{yttzv}xx~{u}z~}~{svxvtxxstxxqsvppwuvzx{~yx{~x{tw}{~{vw{wtyuuy{vn{svwvwz~}|{xs{|{~{~zz{}vuz~||{txzqovyolpw{{wtyvy}yvyzyz|~~}{tq{z|yx{vuwzwquwqtvt~y{}~zvwzzvtz}~z|vty|w}}xvxzzruxvvvwz~~{}{zqx|~~~z~z}{|vrw~}vx{tqsztlov{{xuyuv}yww~~z{~}~|{soz}{{{}xvx|zrtyuutu~y{|~~~}yuu}|zvtz|~|x{vtx}z}~~|wtvy|}zxz~{zwox{|~yvzv||xwt}yz{}{w~{wzqoqu}xru|~z{}w|xy|zwx}}{xvx{}z}vv}yrlqwtspxxyzz{|}~}yty}|~{xv{yqry~~{|y|ss|upqqsolpty|{wx|~|}st~y|~w}yx|xs{}}}wy{rrrihotursvou~~}{zx{{|}~zx{~}zvx|zry|~x{xpjryrstttuvwwtps}w~}|}~vtz}{~}zutw}vpqtyzxttx}yzzqqz}vv}|y|ys~}~{z{z{~uqtvvsusmu{{{zywy}zz~{wx|~|vx}yv{z{woxztttsrstvwtpt|w~|z|~zvy}~|x|wsty~tsvz|yutw{wyzqqw}wrz~~}{~|~|s}|}~~||yw}vvwwtvumszzz{zxw{}y|~}}ywy}}yw|}w|{y|sv}vuvusqrtvuqq{~zz}~x~~}zx{}|~z{~zvsuz}uv{}|xuvyxv{vpsy|us||y}}xw~|~}~~~}vzyxxwvysnvyyz{zww|~z{{~}~~{xxz}}zx}~yx~|z~uz|vwwusqrtvuqt|||z{}y|}z{}|y}~}|yvtw{xx|~}ywwyvv{uqsw|wrz|~x~~{x~}}}~|}}x{zswvusrromqxxtu}~zux~~{~zyzv~wy}xxyxurqsuusszz||w{}~x|~|}}}|}ttwrs||wxtx}}zy{xuzxqprvxss|{ux}z{y~}{urxvv}yty|ywwx|{swzyyyywsrvxrn|~}|~}}wsuy~yxrnwzyx{~~|z~yxzzwsppomiirw~ywy~wurrstuuuvwy|yz~{wtspoy|yzz|~zv}zywtx|u{xquz}}|{|~ytrsoo}{xutx}wmw{wz}|ttpqstxytu}||{~~~y}~~yz}ztqonrwsy~ww~z|qz~usrpot||qt{{|~~||}wv|zxyrpqruzxv}}wrt|}vootps|wsx|{||w|}|~wtvunt}zxzyx{vw~~vsppssorwvstpmw~}trstuwz}~}z{zzy|zuvwqwzwy{ngtvqrvz||||zyz~~{y{{yz}{yvuvwsu~wtuvx{uqxuot~~{{~{x|{w{}x}yvyzswzvv|{{~}|yy}~{xwz|wvyywxrpy}}}~xvwvtssuxxx~}|~zuwtlry}tpzxtttttuvxxx|}{yvtvww{xz|yx}sooopsy}z}sry~}zy{~{z}y}~xz~urwwsy}{~zv||}||}~|~yxzvrtwy{ts|xy{z{{xutvy{|zy}{}~z{xpsy|{tz{yxwwvuvvust~~{yyyuy~}~|xy~{|{tsrqpqu|~~vx|yxywtz|x|~z~wxyrsy{|{~|zwvvxvz{|}wqsuxunv~w~~uuvvustw{}z}zy}}yuwqnvz}~vuwvxz{zyyyyxw|}}|{{|yw~}~}zuv{~z|~{xrrsrqrv{|z|}|}zx~|wy}|y}yzyru{{{~}yvuuvsw~}vuz~yrx~~w~ustsrpquy}~}{~xrrljsy}}|zvxyxwvvwyyy}{~zwwy||z~zx}~y}~u~vooqsuwz~~{w}}}~|yyy{}|zwv|{z{uw~|{wwx{y{|z}ytw~~uw}~~|z|vuvvvvxz{~}|~|~wtqls{~}~~wvyywuttvwx|}zxy||y}~|y{|z~x{|qmnprtx|xy}~}|}|z~}~|xz~|yxrs|}~z{{~xssvzz{{xz}yrt~y{zv{tstvvwyz{~|{~zwyzvtnkt|~|yy}}{yxxyyy}~{{xz|zx}||}}{z}}v{zqmmnpruy|~}{zz{}~~~|xy}|zuns{}~|yz}upqtvv|}}vx|x}wy~wrqrtvx{}|wsvwupjoy~}~ux||zxxxyy{}yyz{}~z}~~{z~|~ww}|wrppqsux|~|y~zyzzz{|zx||st|}{~~{}vtuvtx~zx~y}~|}}xttttuvx{}wx{{tjmuy{~vw{|zxwxyz~~|{yzyvy~|||{~}|{|}{xrnmmnpsv{~}}}}}}|}~{wyyqu{||}{z}}z~}ustrpu{y|~}~z}~}}yussssttx|vu{~ujmtuvx|}{|zyyz~|~{|yywswzwx||}|yxtolkklnqv~|{{||{|}|xv||prxzz{}|zz~wrrqnsyxz}z||y{zvssstuvx~~~}xsu}{omswxy{~{|~{zyy||||{}{zvw|zx{~~~}~yxzvpnmmnpsz|~|z{{zz}}yyzsx|||}~}}{|}yuspnuwvy~|~~~y|}xtrrsstwztv~znmsuvxz}{z~~|{{|~|}zwtv{ywz}~~}~}vtwuolklnps{}~}||}~}xv}zswz{||}|}{y|~zurnmtwuw|}}wx|ztqqqrsv~~}}}ztrx{plpsuwz}|~~|{{}~||zvst{{y{~}||xprtqljknqt{}}}|{{}}zuv~}uuy{}~~|{ww{|xtqou{zz~||~{xuz|xtssuvy~|{{|zuqv{upruwz|}|}{z|}}~yuv|}zz}~~~z|}{qqutollnqt{}}~}}}}xx~wwz{|~}{}~}ywz|ysonuzxy}z|}wty|xsqrsuy}|||zuruxrqstvy|~~}~~|~|wsw|zxz|}}~~~{~zunptsnkkmpu}~~~}|}~~{wz}zxyzz{}~}{wvz{vpkovvvy|||{tuzzuqpqsv}}|{|{wssurqsssvy{~~~}{xru{zxz|}~z~y~wnnstpkjlos{~~~}||}}{yy{y{|{{|}~}}}yvy|yrlpvutwz}}~|}uu{}ysqrsv}}}~~|||||ywvusvvttuwy{}ysvzwuwyz|~{~|yqotvrljjlqy}{}~~~||zy}~{zz{{}~}~|{wx|zrlosqpsvy|~~vtx|ztqpqt{~z{~}}}|zxwsqvxusstvx{~}}{suxvstvxy{~~~{|snpttojijmuzxy~~~}yvz}zyyz{|~}~~~yvx{wnlqpopsvy}}zuty{xrpprx~|y~~||||{zyuoqxxtrsuwy}||ytwxuuvxy{}{{yrnottokjlpx{x{~~~xu|{zz{|~|~|~~zvx{wporqpqtwy}}|wux|zuqqsy~|y}~~}||||{{{wopxzvtsuwy|~||vwxutvwxz|~|{{tonqtqmjkow{xzzsx}zzz{}|~||{vtwxrorqpqtvy||xy}}zwx|z{~~~~~~~}|||||~}ws|{~vtx|~zyxwvwyz{|~~{|y}|vsqty{xvux~~z{|yxyz{{{|}~xz}yzyuw~~~~~|{}~}~}{~}|{{|}zwz|ywwz~~{yy|{{~~}{z{}}}|||}}~yv}vt{~{{|xuxz{{}~~{|~~~{yyxxwwwvutwz|~}~{z{~zy}zwvuuuvwx{}ysw~}}}}}|yuvzwssy|xuvy|~|xvz}{ywuux{{ywx|~{xz|{zxxx{~{{|{}ytrw}|}}||}~}{zz||}}{xxxxwwwvutuxy|~~|{}}{xxy~{zyxxxz|zut{}||}}}zwwzyusu{~}{xvvwx|{x{}{ywvuvy{zxx{}{yz|{{zyxy}|{}|~{vsuz~}}}}}{yyz{}}zxxxxxxxxwvwxwy~~}||}{yx{}{zzy{|yuuz~~}||}}}zxz|zvtux|~~}zyxwux}{}}{yxwvvy{zyz|}{z|||{{zyyz}~~||~~|wttv{~~}}}|zyy{~~{yxyyyyyxxwxwuw|~}}}{ywx{~}|{|}{wwy}}|||}|zyz|zwutvy{|~~~|{yxwtuz~}{zywwxz{zz|}{z{||{{zyxxz||~~}}}~|xustwz~~~}|zyy|~|yyyyyyyyxxxxvux}~}}~}{ywwx{}}}~}zxxz}~~|||||{yy{{yvuuwy{}~~~~~}{zyxusv{}{{zxwxz{{{||zz{||{{zyxyz|}~}}}}{wtstw{~}|zyy|~|zyyyyyyyyxxxvuy}~}}~~|zxwvwz}~~~}{yy{|~~}||||{zy{{yvuuwy|~~~}|{yxwusu{~||{zyyz|||}}{z{|{{zyxxxy{}~~|{{zvtstv{~}|zz{~~|zzzzyyyxxwwvux|~~~~~}|zxwuuvy~}{{{|}~~}|||{zyzzyvuuvy|~~}|{zywvutsuz~}|{zzz{|}}}{z{{{zyxxwwy{~}{zzxusstv{~}{z{}~|{zzzzyyxwwwvvx|~~}}}|zywvuuvz~}|{||}~~}|||{zyzzxvuvwy}~~~}||{yxvuutsu{~}}|{zz{|}}|{{{{{zyyxwxy{~~|zzywusstw|~}{{|~~|{{zzzzyxxxwvvy}~~~}}|{zxwuuuvy~}|}|}}~~}}||{zzzyxvvvwz}~~}}|{zywvutssv{~~}|{{|}~}|{{{{zzyxwwxy{~~|zyyxutsstw|}||}~}|{{{zzyyxxwvuwz}~~~}||{zxwutttvy~~~}}}~~~}||{zz{zxwvvvxz}~~}}|{zyxvvtsrtx|~}||}~~}|{{|{{zyyxwwxy|~}|zzyxvtsssux|~}}~~}||{{{zzzyyxwvwy{~~~~}}|{zyxvuttuwz~~~~~}}|{{{{zyxwwvwy{}~~}}|{{zyxwusssvy|~}}}~~~|||||{{zyyxwwxz|~}|{zzywutsstvy}~~~~~}|||{{{zzzywvwxy{}~~}}||{yxwvttttw{~}}|{{{{zyxwvwwy{}~}||{zyxwvtsstvy|~~~~|||||{{zyxxwwxz}~~}|{zzywvtssstvy}~~}}||{{{zzyxwvwxy{}~~~}||{zyxwvutssuw{~}}|{{{{yxxwwwxy{~~~}||{zyxwvusrstvy}~~}||||{zzyxxwwx{}~~}{zyyxwutssstvz}~~~}|||{{zzyxwwwxz|~~~~~~~}|{zzywvuttstux|~}||{{{zyxwwwxy|~~~~}|{{zyxwvussstvy}~}}}||{zzyxxwwxz}~~~~}|{zyxxvutssstvz~~~~}||{{zzyxwwwxz|~~~~~~}{{zyxwvutsstux{~}||{{zyxxwwwxz|~~~}}|{zyxwvutsrstvy}~}}|{{zyyxxwxy{}~~}}}|{yxxwutssrstwz~~}}|{{zzyxwwwxz|~~}}}}|{zyxwvutssstux|~}||{{zyxxwwxxz|~~}}||{zyxwvuttsrsuwz}~}}|{{zyyxxxxy{}~~}}}|{zyxwvutssssuwz~~}}||{zzyxxwxyz|~~~}}}|{zzyxwvutssstvy|~}}||{zyxxxwxyz|~~}||{{zyxwvutsrssuwz}~}}|{{zyyxxxxz{}~~}}|{zyxxwutssrstux{~~~}||{zzyxxxxyz|~~~}}||{zyxwvutsssstvy|~}}||{zyxxxxxy{}~}}||{zyxwvutssrstuwz}~}}|{{zyxxxxyz|}~}}|{zyyxwvutssrstvx{~~}||{zyyxxxxy{|~~~}||{zyxwwuutsrsstvx~~~xy{{z{zz{wxwwz}~vz}vstt}wqxwy~}}}~}luyv}~ywuxwx|suy}x{|~}~ztytwzoqyrrwqnvty{~z}}}}y}y|u~xp}{sq{{z}zxy~~|xssz{krxutoqtv|}|ztwy|vzvsy{u}y}zz{vxz{svz~uwzrmx{|wp}yzzw}rwry|vuzuw{~t}tvvsvqryupuwpu~~}~|}{{rxyu|z}}q{~~y}yz}smxuzx{}y{}|}z{zv||~~pv{~x|{~y{|ww|}}{gy|||wwxy{}~}ytq~v~tv{~~q~~u}}yy~wszw~{{yl{uz|~|~}~~||}~xuzst|zkhu|zxv{uyty|xvurp~|}|}vz~o}|y{}{}kury}~tkrrxxrtwwwx}~y|zqupvzw}zxxwxyz|{~rjrpzzmnuwyzxsw|rx{y}{suzj{y|~x|zyv~~wzyxeoru~pxw|zwvtxyt~~|x|xm{wqz}}{zywv{}|}xz}{~|ofurysqyxzzwtt{rz}yy||qw{q}{{}}zxw~~}z{q}}|~wfrwyovxzywvpxxv||wxxt~wv|{|yyzuu|z{x}~}}km{v|qtvx{zwstwu{~yy}~vzxs}yzzxywzxz}~yu~|qiyyz~zrvzy{yxu{wyzt{wzyq{zy||yyysy{}u|~weuyw}tx{}}{{vwvw|}vw~xvzqv}{z~vzxy~x}u||~}{dq{yz~vz}|y|zyxvuz|uu{xw|qv}{{|y|wuy{xzz}~}fnxwz~yx{{yxvvsw{xt{xu|tv}|}z|}xu~vzz{|}{jm{xz|{w{zzy{wtuzyu|{w{xvz{|~{}xt|}y}~{}{{~}pjwvxz~w~~z|x{ywvz{w{~vx{u|yzy}{tz|{z}|y|{viuwvxyz|{|{zwxyxzyuys|~xx}|}~{uzx}|z|z|ipwtu|~z~y|zxxywv|}twuvyvz~||wvw~}~|}~}~y{nlxvux{~{|zywyxuyytws}~wy~}}xt~|z||z}x|xwgtxvw~}~{{xxwzuv{uxuwyx|~~~{uww~~~}{z~xznlyywz}}}|yywzyvx|uxt|wz~~}}~xr|y|z~x~|x~{hrzxy~}}}yyw|wwzxvwuzv|}~|}ttz~|{|w|wxthvyy|}~~~|zxx{vy|uwuxww~~}{{sy{~|}~~{zwzvwnkxzz|~~~{{wzywy~}txv{vx~}}|yr||}~z}|vxwsy|knz{{z~}z|wzwx{ztvu~u|}~}}}us~|}z~z~sxtt{uju}{}|}|{|wzvy|wuvyyw||~|zqy|~}~}}yvuvtv{nnz}{{}~z}yzyw{~tvu}v{||}|}ur}z}z~~rwutzvku~||~|{}x{vx|xuuxyw}y~|yqy|~|}}~|ztsutwzno{}{{~y~zzyxz|tuu}~v}z{}}}tr~~y~|z{qusuzslv~{~~||}y{wy}vuuzw{}y~{wp|~~z~|{}qtstyvmr|z}~~zy{xy{xtuxzyx~|zpx}}||}}{{tsttxxnpz|z}~{{zyyz|tvw~}wy|}~|rt}~z}~{{wruswypnwzw~~{}zyzy}tuw}~wy{~}}rs}~z~{{yrttvyqnuzu}~zyyyuuw}wzz}~sq~|z~{|~zsttvxqntxs~zzzyvtw{x~{x|tp}}|{{|}|ssuuwsnrxsz}|zzy|xtvzz|u}wny~{|~~{|}|vstuwunpvsu|~zzzz{tvy}yu}~zou~{~|}}{}|xssuvvpotvr~{z{yvux{xyx}rp}}|z~~~y}}zuruuvrorwqz}~z{z{ytwz|{t}xnw}|~|}}~~z{}zwrruvupputs~{z|yuuy|xxy~}qq}~}}z~~}x}|xuqtuurprvq{}z{{{ztwz|{t}}xov}}~}|}}}{y}ywrqtutqquus|z|ywuy{yzv}~so{~}z}|}x{|wvprtusqrwsx~{{|y~uvz}yuy~~|pr~~z|}{}~v|yvtosttrrtxt~}z|{{{uwz~}zs{|you~{{}{}~|v|wurosttrsvxu~~z|y}yux{{}|s}|uoy{}|{{}wy{tuoptttsuywz~|{|yvvz|yvw}}|qr~z~{|y|}}u{wstnrttstvyv}y}z|{uxz~}{~r|{wpw~|{~{zy|~xv{supnttttuyxz|z}ywvz|ywv}||rr}z~{|x{}|t{vstmrttsuwyw~z}z}zvy{|||s|{vpx{}~~{yx|uwzquootsttvyw}{||y~vwz|~ztx|~zqt~z}{{w{~yu|rtrmssstvxwy~{~yxwz|{~xu|||rr|~z~{{wz}|t|urumrsssuwww~z~y~zwz{|}{t{|~tpy}{~||xx|~tzxpwnpsrstvwuzz}|wy{~~||tz{upw}{~~~||xx|uyypwnpsrrtvvt~{{|}xz|~||uy{vpu}|~}~}|xw}uy{oxposqrsuus|||{~yz|}|}vx{wpt}|~~}}}~|yv|xv}ovrnsqqsuury~~~zzy||}}xw{~zqr{}|}~|}~|{vz~{t~rsvmrqpruurv|y|y|}}zvy}|spx}z}{~||vx}}t|wpxnqrpqtuss~}|yw}wuw||tnt||}vw~uuxqqnlswyrt{nwsnspqtvtps{utqnqupijrvv~y|ux||vz~~xzxw|||~uos~}}~|y|xvuw~{}vrw~}urxzzypqmlrvwqrxkuqmqoorsoks~~vrpy~xxwqhgoss{u}~wrx~~x|{~yy||yxwsiit|z}y}wzztsuy{ux{op{xuqmrvwrpxkqskpnmoqokt|vpps|ypkput{x{|~|zrw~zy|~uzuwrppojiv~}}|}|{v|vsvy}~wv}}zroyxwpqvxxpwtkxooqoorrnq~|x~wpot{woovvy~x{~}tu~}x|{xytvsonomju~z|z}u{}xtvz}zv{||yuoxyxrpuxyrtxkvsoroorspr~|u|wqpu|~yqouwyx}{|}}vu~~~x{zzvttrnnoolu~z}~z}uy}xuv{}{w{{~{yvpyyysqvyysuxlwtoroprtqszu{vrqw~yrqvw{x~{}|}uv~~x|{xx~tuqnnpnly~z|~{|t{}xux|}zw|}z~yyspzzzssxzysxumyrqropstpvvx{ursyxrsww~|z}{~}{sx}~{y~}~t}zttonoplo}~~{}{}~xw~{xvz~~~xy~{}|yxos}}}xsvz{wtzotxqspprurp{{u|xtruz}vsww|x}~{~}~st{~y||xy~vuqnoqmkv~~}{|~{v~}zwx{~zx|}}}~zzoow}uw{|yuzrryssqprurox}~v}{wssv~yuwx{y~}|}}vrw~z{|{w~xvsopqoiqwz|~v||yxy}}xz|}{|tlryzw{}}w{~zxz~~x~{|~~~{y{ywor~|tmmrqtsims|{~|y}~~zytrssmluy{owvttnnvvustw~|}{}}}w~z{zxzont}|qo|xnjhfimlhps|~}{{w}~{yxzywnvwonpnsnglryw||z|}{y{ytsuvpsz~usr}{oousrqru}w~zxxv{{y|}{{|rsy}ywsrvztnjknlipr{~yz|}y~|{~|wrpurzzvvrvqimryv|y}yuwz||{vuwxsu}}}vquw}yv{ywtuw}x|yuutz}{}}{{~tsyuqrtvy}wqqsqmsu|{~xy}}y|~}|~xronvwzzyvxwmnszzy{|{uuy|~{wtuxvt}{xvquz}v{{yxwy}~{~~zutsv~}~{|y~{sxwpptx|~ysprtpqxyy|zx}}x~~xqnlt||{zxv{snsy}xz}|}vtw||xttwxv|}uwrt|wx|zzyz}y{{usrt}{|y|~vx~~~xpotz{ursusryzyz{w}w}xqmls}~}zxv{vosx~y|y}z}vsv|}yutwyw|}twsu}yx}|{z{~yz{urqs}||y}wy|}wootz|vssvtt{zxzzw|~x~~wpmmu~~~|yw}vquy~y|z{z|usw|}yuuyzxztvrv}y{~}|{}xy~ytrqu||ywz{}uopv||wtvwtw{{w{xw}{z|tomnx|~}y{}tsv{|x~||y}zttx}|xuwzyzvwtrx}{~}}~{|{{~{wsqqy~|~{|zw|}}{spsx||wvxxv{zyyzuy|}zyromtzz|{ysux}xz{z{}wtvz}{wwzzyzwvqty|~~~~xy~|ytrpv|y~}{|vz}~wrrvy|{yzzw{z|{zzuvyz~|~{uqnrxv|}}tuw|yw~|~{z~yuvy{||~}ywz{y}~yyrrux|{}{wsolovst}|wtq|~~~}yoszoxzx{~{wzvtwxx}}zzv|z}{yzvsvrsnsxxyu||wvy}}~|zsosz|||ux}qn{uquusqoovyv{|ts~~}}}}vnoy}wv}wvyzttvpqtuv|vvwy{~|voz{ruwwuszwttwz{{x~{topv|~|tuv~ywvrutronnvvtz|xrw~womt|{y{zttuoprsu}}ysux{~~|xsq~z|~|xu{yutwz{{w{~zsoqx||~~wpuy||uwvtqoovxuz|xsw~}}uonu~z||vtvppstu|xtty|~}{}xtr}~{~zuz{vuvz||x|{{ztpqx~|}~~~z{otz{vvvtrpnsyvx~~}yvuzzvpou~|z|ytwtpsuvxzxxrx}~{z~yvuzz}|uv{xuvy|}{x~wzvrrx~}{~~}xz~qr{~~zuvusqoqyxw|}~~zxvyvwqpu~z|ztvvqsuvw}{u{rx~~{z{}zwvz{|}vu{yvvy|~|wvxvrsx~{}~|}xw}sr|}|uvutqpqyyw|}|~zxw~~~}xuvrqvz{ztwvqsuvv|{u~zsy}{z~z|zxw|{}~vv|ywwz}~{w~uxvsty|z||{|vx|rt}|vvutrpszxw|||~zxw~{~uuvrrx~{|yuxuqtuuv}ywwt{~|z{}~y|ywv{{ty|ywx{}}wxyuyusu{z{{{z~|u|xqxzvvusqqwyvy}z~}zvz~~~y}swtqsz}||vxxrrtuuy|v|}tx}~}{z~|~z{{xux~wx}{xxz|}yuuyxssw}{z{{y{wz|ruz~xwvusquyuw{{}{wv~~xuwvrqu}}}xx|y{~~|}~}~}w~~}}|{|qw}zysqz|rr{{ywy{|ypu|z{}vwyplmtrszuw}}{ywvusu|z|vt}wvroxwu~~tu|yy}xmow~|tmjoqpyww}yw~}|}rr}{sv~wouzxwwyzxon}~|~|su|{uuwrwwty|~z}zxvv{}ztp{wu~tw}}~}voz}{|{vmmux~}xuyww|xz~{wz~||smv{xry{ywwxxtlq~~|ytry~|}}x|yw|~||~|yww|{y}yps{{uz}|}}{so}}}}wrlpxz{y}zz~y|zw|}|~~|}zrny|ysz|ywwxwtlr~{wrq{||~y|zx|~|}~|zxw||y}~|~xqs}yvy}|||zto|~}}uqlq{}|y}|{~{|{x}~}{}~}zzysoy}~}sx|zxwxwuop~{urq{|z~{z|x|~~}{zxwz}z{~y{yssy{v}~{zzyvpw~}vqoq}}yz~{}}{}z~~}}{{|~{vxurxzwt{|ywwwvsp}~~}trrz}y|}z|z{~{zywy}{y}~xwyvuz{vz~{zyywru~wqpr~}zy~}}~{~|}}|{z~{|~{svvuy{ytz|zwwwvtr|~}}trs{}y{~{|{{~{zyxy}|y|}wuxww|zvy~~{yyxwsv~}wqqt}{z~~}}|~|}||{z~z{}~zruwv|{yu{|zxwwvts~{~{srt}}z|||{}~{zyxz}zx|}vuxwx{|vz~}{yxxvsx~~~}~vqqw~{{~}}~}|||{z{~}y{|~wrvvv}ww||zxwwvru~{~xrqu}{}{{}{zyy||xz|~{twxv{{zw}~|zyxwsr~|~{spq{~|}|}{}~||{z}~yy||}stwtx}v|}|yxxwsp{{}|tppy}~|{~~|{{y|}yy||vuxuv}~w|~}{zyxtox~~~vpnu~~|~zz}||{}~zy||vtvss~x|~}{zyxtov||~wpns~~{~}|~}|{|~zx{|yuxvs{x{~|{zyvpr~}{rnp{|{x}~}|{|~{xz|}{tuurw|z~}{zyvqp}z}|snnw~~||{~~}|{~|xy|}vvwsu~x}}|{zxsnw}~~xpnt}~|~yy~}||}~yx{{~xsvtrz{||{zyups~y}zqmpz~~{~~{~}||~{wz{}}uuwsw}y~}{{ywqoz}}}~wpnv~~}~yz}||{}}xxz{}wruts|{||{zxupt}x{zrmp{{}~{}|||~{wy{{~utvtxy}~}{zywrpy~|{~xpnv|~zz}{{{|}yvyz{~yqsut}}{~~}{zxvqs~~wyztnpz|{|}|{{}|wwyz|~wruvxz{~}{zywuqv~~x{ztpt|}|z~{zzz|zuvxx{{squw|z|~}{yxwus{}yuywqpyz~~}{zz{}xuwxy}zrtxy|y|}{yxwvsu~xx{vru}{~|zyyy{zutwwy{upux}{{}}{yxxvt{}}ytxxsry~z}~zzz{|xtvwx{zssx{~y||{yxwvtu~~~ww{xsv}{~|zyyy{zttvvx{upuy{|}|zyxxvu}~|}~xsxxsr{y~}zzz{|wtvwx{yrty|}z||zyxwvtw~~}vw{wsw||}|~yyyz{xstvvyzsqvz{}~|zyxwuv{~|vtywrs~}z~|zz{|zuuwwy|vquy~{{}|zyxwts|}}zuyzts|z~{~|yyz{zusvvx{wqrv{~}~}|zyxusz~|}~ytwxrpwy}{{{}|wuwxy|zrrvz~|}}{zywtqw~~|vxztpv{~{{~zzz||vtvwx{yrptw~}|zxurw}}{uuysns}{}||}||}}xuwxy{|tqsv~}~~}{zxuqs}~~xvzwpr|~}|y|z{|}ytuwwy{vpqt{~}|zwss|~}~xtwwpnw~z~{||}~|vvxxz|yrqty~~~|{ywsqw}~|vwztou~|zz~{{{}|wtvwxz{toqu~~}{yvru~~}}wtxvnpy~{}{~||}~zuvxxz|xqqt{~}|{yvrqy}}{vwysow{~z{~{z{}|vtvwwzzsoqv~}{yvru~}|}vswvoqz{}{||}~zuuwxy{yqqt{~}|{ywsry}~}~|uvzupw|~{|{zz|{vsuvvyzuoqw~|{yvsu~~~{}}wrvxrqzz|{{{}{utvwwzztptz~}{zywurw}}|}wtxysvz}{}yyz{xrruuvyxrqv~~}|{zxuu{}{{}}ztsxwsx|{~|zz{{vrtuvxzwrsz}|{zyxvtv|}~{}~}xtv{wvy~|~yxyzxsqstuxytqv~~}{{zywu{|zz||ztrwyuy}y|yy{{wrstuwzyssz}|{zyxwuv}|}z|~}ytv{ywy}}~ywxzxrqstuxyurv~|{zzywv||~zz||ztrxyvz|y|yy{{uqstuwzxst{}|zzyxwux|||z|}|xsv{xyy~~}}xxyzvqqstuxytrx~|{{zxvw~|}yz||xssyxv}~|zx{xywyz}~}{{{}{yuy|vxvqokkotxz~|w}~wu~zvv~xzy||y|ungrummnpux}uwvv|xuwwzzsq|~}|~rtslqonsuvw}y{zzzxxuijvrupou{yu|vz}{{{~}w}y{tq{~z}|~{wturqjgnyzv{}uqry}~~w~}}znqu|}voqsqopvsmruz|}}z}xslppq}~z}x~|vwuxyyxqsvyy~y|{z{xry|~ussrqo|{||~}stpsw{wmttwvyz{tuw{{x|uzxzy|{y{z~y{|uwpw~~{z||{}|x|z|u{}quuy{z}~z|zxry|zxwwyqxtuyx|}wxt{}{}~tsmioq}}|wzzpunw|uwy|~|t~w{z~~~poio|{xv|||y|tvtsuy{{}|~~~|~rtyzz{|w{{w}|}z|v{ttv|y~~{xwnqrx~{yw}vv{yxq|y{z{x~~|yqustr~|wxxxz~}}xzxvszuu{~~}~~xuuqszy|yqup|yy}}|s|}}{y~~srkmvpt|}uxyyywztxz|}|~~|}|xz{wqtquw{|}|x~~vys{}sprzu{{~{wwusxzw}zu~x|}~}|xyqtx||{x|twwupo{xxxwy{yz~y{~~z~~uwtzxxtrqsuz}|xzyuu~}yuw~z{v|}}|yxs}unnz{w}z{|{|}~}~~{z{tw}}~|}tvropwz~z}|wy{twsyxvw{x~~~xzxqourw|~zz{{~yxyzstuy{}}zyxzvp{{|{|z|}}|~{|uupy{uw~{zyutrqsz{z~vsu~xxv~x{|y~~yztlktss}|~~yz{}{}{{|zsx{x{~}~~}~|xuvvqtz~|zyyw}ut|y~{vv~y|~wuqruv}}}|v|~vtttty~v}xv~z}x~xqzrw{~~z}yxsxxsyrvus{|{wvspsmnxyw}zz~y~xustyt||~w}ywv}sp~||}}w~yz}~}x{zvyxzy~}{vzxsru{sy|yx~qw|u}yqy{v{{}xtxrkusnq~zyz{x~zyx}wu|y}~|{vyuqstx~y{uy}}~{~|t{|su~}~vy{|z|zqt}|}{v~zz|yuzsqrv~||~~~zy~yuwror|z}|z|z{|x|zrry~{z}~~zu{xsutrv}}|}xv|{{|xrx~xyy{y{{}}sqtuy|{{zy|~z{ytvvw}~~|}~}txuspsmpx{{|wy~xz}wvxvz~}|zzwwursspr|z||z{trxzuy{w{~xtvuvxsw|}}zzuutv|}wx~{yzyystnnpw|y~{zz}{yyux{|~~~zw}|w{yqtxrm{}}{xtv~ur||zx|}vxtsunoq{|~zvyyx}~zu{}}~}z~zvwqklox~~z}|~~w~~vyzx{}z}{z|zy~xu|zpp{~{~}{|ytr|}rt{x|}|~yzytxumlr|y}~zy|||}|~yuzyy|{|zwwrooqwyzx{}z}xyywywu|~|{vxxw}xmr{yx{{}zvuzqw{w~}}}yzzuxpkkuyqy{z}{|~|~yv{wz}{|~||~yzxtsrquuy~}~}~y}|{{vyzuv}}{||v}x}vpyyur{}|~zv}~tu}wx}w~~~{}wzxpmpxpm{|~~~||v{xtyvyz|~{|{vuuststxv|}~}{}wx|wux{~}|v|y~zpxzwqswv~~{w|vu~yy~~ty~{zzzsspyqjrzx~~|{x}y}zrt}{vwzrvtpsqsu|~{|vyqy|}zy~u}q}}vrpxtsw~}{{}}v}|}{vx|vy|~~z~{qpv|mktsrz~{{|}zxw{|xy{x}}~wyzrroqxomx~{|yz|yy|{|v|||~|x{surupsqs|z{uz{x|xq}|y}~w|{}|ywypsyvpu{p{~zz~{uwr|ur||}yyyw{yx|uylu{wyv}zxuyuttyz|{~~uwxptusoxv{||vx{x{{|~}u}{ytp}qorpsu~||~vy}zwx|t~}}zzvyusqtnmvz{wvxxx~~vu~~~~}y{xzqssmtmxz}~z~z{xxx{zy~zwvvzy~xp|wuyryx~~{~uwsuqr~|{~~z}ywxwwssoqyyx}zz}|wyu{xy|~~}y|s}ypmqvoxz}wwy{~{t{xt|t~w}zwxwuqsusqw{||yv~q|}|z~y~~uvznpmpxnqs~{}~{y|xx{zu|~{{{xs}xxtqxssw~|}}t~rst{v|~~}z}~yz|xtyuquvru}z}z~ywzztx}}~}zvwqqvuo{zwpt~}}}w{yuvowz{{xvzssststtvx~z}~u}{}v|~}|~zy{ruqmxpklx|z}}}{{{{v{}{}|{~{u|xwsvrqrvwz}}z}xst~xu~w|~}}||yyyxqvwqpwrvyz~|z{{vvwzy{}xvst|uw{yulx|{}|}y|~tusxvuy}yz{xrtusrustz{w}zx}ww~yy~}~}x}xssnyvkjqxt{~||~ww|{x}|~|w}~|tvvqqusqu{{~|uw{w~u{zx|utsptxsxww}}}uz{vt|zz~xx~|xtwx}vq}wuvyv~wuwq||y~|uxyvy}}}||{|zfsrsqr~y|~~zoxwrnggo{vrswvu|z~|v|~}~tu~txs}{}|||{zyx~vqwxuw~rruxy|tzu|uwzvur~|pvsmx|z|{zmiov~~wzqlpvjkitsqvutz~z~~u~qszw||{|}~x{{~}{unswx~sspwusxqt~vu}qy}wxz{qx|lpqmv}{{rnllux}wtuoohrsmuqu|yx{z~yzuvwt|zxz~y{||tvuq{~|utpzxowqt|wtv|ty~}yz}stqrslsz~}sopjrw~|{zzpojoxjrppz|yy|xv{v{uu}~|y{x~|}~ysunvzzsqp~rttsyzwx|yozz|q{vospow|~~|xmslmrz~{|yqojyqjqpuyz|~tx|vxzvy~{w{{~z|{||qusovzxuqx|ntsvyyyz~vs}{|}ys}spsqqx|~}~rlrknrz}vrpn|nlqrxz{{sw~vwzu|yxy~}{zz{znsrrx}yvszopqwyy|{}tt||}}~xrzusttqz|~~~|{slrkpt|yrom{rjoqwy}~~sy}~xx|wz{vz|}xz}~y{~|nrqqz~{wtwqpquxy}|}xo~|}}{zrxustyrz|~||~|wy}wjplpv|{vrnvzknpvx{yx}y~yx|~y|{zxy~|x}uy}tmtqy}zws~zmqtyy}~{~qx~|}}zzttxtrxwv~}~zxtyzkkonx||xsqs~rmpuy{t}v{zyzzzyy{{zy{}qt{xlrqy|wt{oorxz|{~tu~~z|}zyurvvuyzv~xwpv{njnoy~}{tqs~vlpuz{s~}vyz{zz{~xz~}{zyz{nr{wlqrz~wv}pptxx||sv~z{}yxtruvt{|x}wsovymlor{~~}usvtlqwz|}t|{wz{|{z|}zy~}{v{xnt|tmqs||vx}nqwzy~}|p}}}z}~ywssuwt~w|~|{y|oqyujnou{{su|}nnuyy~~u|~~|yxz|y}|~z~}}}||~|t{qpyznnrw~xx~unvyy|}}tt~~yz{xvstwv{{u}}w}spxznknqw}uu{umuyx{wv~}}|xy{z}x{{|~~{~u{tow{pmptx{yzov{x{}ur{x}yxttwwy|s~{~x{wpv{rkmps{|yt|{oszxy~zs{~~zxz|{w~y{|zxwyos{vmnrt|yts|zy~|yp{~~x|zzwtuxv}ux}}|~w|rryxmkopv|}vzvoyzx||uy}|~}yx{{}x}|{}}{~|~uytov{rmort~~zsw}yz{vq}}v~zzvsuww}s{||~|xzqsyvlkopx|~v}wr{yx~{t{|}~|xw{{{y|{~~~{~{}txsovzrlosu~{ty}yz{vr}}u}zzvstwx}t|}|~~|vyprxwmkppx}~w|zr|zy}zuy}z~}xwz{}y}y~|y}z|uvtntysmntuzxx~yz|wr|}}vzzzwsswx~wz~}~~{}txqouxpkorv~zyty|y{|wux}~zwx{}yy}~{z|}~}xysvnpwxpmtu~{v}|z|ysu|{t~yyurvx|}w{~|~|{wttmqwummtt~wzv~zz~~yt|{z~}{wv{|}~|z~}}y~|~}~vyrupntxsnsw{}|x|}z{ztsz|t{yzvsux|x{~|~|xxstmpvvomuuw}w~{z}yuz~|w}{xvz|~}y|}x}{~|~uxrtpmtxtotx{~}z}}z{ztsz|s{yzvsuy}y{~{}~zxwssmpwvonvux}zz{~xu|~~zx~}{wvz}}|{}}{x{{||{twrtnnuxsovw~|{|{|wsvy{r}yyusvy|{{~z}}wxutpmswtnrux}|{~}z{{vv{v~|}zvw{|yzw{~y}z|vuusqmqwvqqww}{{|ut}y|uwzzxtsw|~y|~{}|}~zwwusnpvvpous|~{{~wv~|~zy}~{wvy~|{}|yyz}|{xuvtrnpvwqovs||~~vu{z{yu{{yusv{}y|~~|||~}{vwwtopuwrntq|~~||}xvz{~u}}yuw}|}~{||w}~{{}yzuuvtonswtossx~}}|yuww~s}z{wsty}zz~|}z~~|||xvwvqorwuopsr|~|{|vwzxz}~{wuy}|~|}xy}}y|{yxtuvrnpuwrour}}}wuy|y|s}{{vst{}y{~}y~}|{zwuxuposwtorrv{}}{{vxyw|}~{vvz}}~{|wz|{y|zwwsuvqnpvvrqur}}}wvz{y|s}{{vsu{}z|~}~y}~|{~yywtxvposwupssv|}}{|vxxxy}~|wuz}}~|~xx{zx{zuwsswrnpuwtqvs~}|xux~w}s}~{|xtt{~z}~|~x{||z}zwxsuwpoqvwrsut}|~xw|{{}u~}}yvx}|||uyyxxzuuuquuoorwwsvvy{~xqqw}rwsp{uusnnvsmryjiigolgiottrxv|}z|z}~~piy{twx~|vyzz~{}rqs|ztwrtxqpsy{z{~~v{{ttsu}yssxyy|s}{yqnuwjlutnlekjefkqrpttz~}~~{rjm}|}|tuvw{}x}||znpu|x{uu{usv|~w~}~utst|xqqv~wwyq|ywvqpx}ynipx}zvmroijnrsqur{|}}~y{}vsolrxxxy||w~z~}zwmqv{~y}ux}uux}~{xxxux}wrsy~uzwt|xxuqr{xvjkqx}wryplnruttus}{}}~v}yurmmu~yzw~}}zy{{{qorv{{}|t~zuw{|w{}yxv}|trv}zv{sy{xxsptzyoimqyt{xooquutvrz{~|~}}y||xvpln|{{x|}{x|~||unprw}~}u}~vwz~~{yz{{{v}}vsv{|v{vx|zzuqq{|{sjkls{y}srruvuvqw{}~}~~}~}{~zxsmkt~|zz}}y}}||ypporx{{zyxy}{||x{y~~xzztuy}xyyw|{{yspt~}~{ynkkmt~z{utuxwwtq~y|||~}{~}zwqlmy{~}y{z~}|{}upposz}wyy{~yyzyzy~yuw{}xzxy|{{xrpw}}|{vlkjnv}{wvxyyyst}z{~}{}}~{}{zwploz{}y{{~}{{|spoot{{wzz|~y~~}xzw{yyux{}yzxy|{{xrqy|~~}yzulkjnv}}xwyzzztu~zz~}|z~}~}{{zyvqmpz|}z|{~~zy|tppot{}x{{|z~{}{wyxyy~{vx{}zyyy{{{xtrx~~~}xxvlkknv{zyy|||xtzz|}{{~|}|zyyxvrop~yurv}}|z|{qpqzzr}wt|yz}}vxx|}y{wx{{~}}}zsyz}|zrjqylhshnyrrsx{}}w}~~}}~|}qpvqwqvvsrs~|~{||rosz~u{~s{|wz}}}wwuurz{xvy|~|{||}}{wu{~~}}sjnvzpxmkxrpruy{|vy{z|}y||yurvzwwxsrr||~{{}~vwxqquyz}u~zzvu}}{xwsy{wuxz|{xzzyzzxx|~ztvplqwytr~vttwz||u{{xz{y~}}xwvuty{||wtu}{}}}uwwqruyyu~zvwtw~|{wu{{xvy{}{x{zyzzxx~~}usummrw~szwvvy|~zu}{|wzyy~~}~|xwvttz{~zvtz}}{~~xuztprtz~{z{vwutz|||uy|zwxz|~xy}yzzywy}|rvqknqy|v|xwx{}}u{~z~wxzx}}}~~|yxwurt}~yux~~~{~||tyvpqqu}|yywwtxyx~wx|{xxz{yx~z{{zwv{}twtlllr|y{yy{~~vy~z{ywzx||x{|yyvsqv~|xw~|}|uxyrqoqx~y}vwuvyt|{w||zxyz~}v}}z|{xuw|}~}xuxolklt~~{z{}zu}y~~vxyz~xz~{zzxuqrx{{w|~~||{tzuqporz|}yuvtxvtzz}|zyz{zw{z|zxux{}}tvumlkmv~|{|xx~|x|uxw{}v|~yxywtqsy{|y~~}}xtztqpos{~}~wuutytuz{}|zyz|yw{z|zxvy{~}sutmlknv~|~yy|x~|uww{}v|~x~wxvtrty|}y~}|zsytqposz}}~|wrssxvu{{}|{}zy~~|}nnpjjlpx|xvy~yqqqgghlrns~}|zyywwvuv}ut~xvouvjoplmnqy~~y}zpppuzw}vqx}wujpvprtttvzz~}y|~{|zotrpru{ytxxqkqmgjltur|{vz~v~wyz{||tutyvqvkhnjjlnsz}|~}}~{z|{~trtx~}pot}soxrprsstxx||~y}zuw~~rvvsvy}wru}}tvsjkmtwryyuzx~y{|}~|tnsx|y|rkpmlmnsy|{}}{}z{}z~vrtx~xoqx|u~wtvvvwyx|{~x|ytx~~~~qvvtvx||uswx{wnnpwxt{~xv{wyz|}~{yrovy~|sosnnopty|{~||}z||z}urtz}~~voryzyxvwwwxyw~|||x{xuz~~~{rxuuwx}{utyy|unpszvu}}~vw|x~y|}~||wprxx}qsrnoopuz{|{~{z}z}{ssw~|}sptzyxxxwwxwxzxy{vw}{vvwtuvx~yuv|~}}rprxxsy~|yux|y{{|}}||uswuzwtuppoorwz{}}~{{}}vsv}~ywqrv|}{zyywwuuy}zx|xw|z|zvytutuz}wvy}}xssyzrv|}{vwy||~||}|}||}~yuxuv~wxrqonpuxy}~~|{}~|{tu{y{}srtw}|{zyxvs{zzw{{x|{|{zvtsrrvz{~~|z|ywzzy~|tsz{nlpv{~v}{ty}xxtz~~{ptuoostr{{|xvy~y~wrrtx~{pqrzvlnllqnpx|{}yywrqw|z|yjl{zyynlurkmosx|||zxy~|}|}xrou}xuqqqprsxzwwx|{zzyxqt~|}t|ypnurlovrouuw{wz}|zy{~~}|wx{}|rqttvwx}wu{tsssux~}~}|vtpivvuqnomnptvy{{~}zvy~}zuy{ynj{~w}~zz{zzvu~~wx~{uz{z{sv|}yzzz}vow~{uxxqouzusy{}~~}vtopyz}wql{z{wutqqqpqtvx{z|}}}wuz|~xyzkgozs~}vvwxwupv|wty|tsvsuvx}unq}zuytnpwwqtxy{{|tt{tnr{~xtplps}}|vurqqoortuxxxzxzzvv|~|zsusjjty{xxyxvqs{xsuztnrqtz{}~~|wwspu{}zrrxystxy{{{~tqyupt{}~}~qmmlrx{yussqqruvyyxzwyzwx~~}|y~~orslmv|~zzzywrs|xsuzunqru{|}~~}~~~zuvsrw|~{stzzsuyz{{{~sqyuqu|~~|~{olmnuy|yussqqsuvyxx{wyzxy}~|yzmrrlox}~{{{zwqv|wsvzsnrsx{|~|}}}~|~xuvssy}ztw|xtwyz{{{|ptzsrv}}}|{~wmmnqvx}yutsrrtuxzvzzw{zxz}z|~spuolqz~||{yts{zttyyppsvzy~|||{|~}}}vvurt{xv||uvyz{|{}uqzwqsx~|}{~}qmopttz}wvusstuwzwy}xz|yx|~|z}ypvslms}}}}{urz{usxzrptvyvx|||{{}~~}yxxtsv|}y}~wwzz{||}yryyrqtz~z~z}voqrtqszwvtstuwzxw}zy|zxy|}~z~}rvwolnu~}ysw}xtv{wpswzxu}}{{{z{}~{~xywssw{||{vyz{|||tu{vrru{z|{z~|qprttpwyxvutuvyzv{~y{}zyz{}}||~yrxtnmpw|vt{{utw{tpuxzvv|{{zz{|~|{{xyvtux{}yx{{|||||sx{ursv|~y~~yz~yppsuspy~yxwuuuwzzu|~y||zy{{~}}{~vrxsmmqy|vu|{utx{spuyzuw{{{zzz|~{zzwxvtvy|}yx{{|}|||swzussw}~y}}xx|yonrvtqzzywvuvwzzu{~yz|zz{|~~|{~wpvsnnrz}wu||vtw{uoty{ww|zzyyz{}zx~zuwvuwz}{x{||}||~~tuzvstx}yz~xvyyplpuvsz{yxvvvwy{vx~zx{{{|~}|{|~}~zoqtppszzux}ytuyxppv{{xzzzyyyz}|vx{ttvvx|~yz||}}||~xrwyuux}{x}yuuxsjlsxwy}yywvvvx{xu||wz||}}}~}{~~{{{qntrqt{|vw}{utwyrnt{}z~zyyxxxy{{uuzuruwy~~yy|||||{}zruyvvy~{w{ytsvsjjryzzzyxvvvx{ytz}wx||~}}~}}z|~~~}zzzqmssru|}vv}{usvysnt{~z~zyyxwwxzzttzuquxzzz||}}|{}yrvywwy~zv|~wsrvrjkszy{zyxwvwx{xt{|wy|}}~~~|y|}}}{yyxpnsssw}|vx~zutwyrou}}z~yyxxwwxzyruzsrvx{~y{}}}}{{}wswxvwz}ww}{ursvpinvzx}}zyxwwx{{uw~{w{}}|~~y{}}}|{yyunqsrsw~yw}}wtuywoqz~z{~|yxxwwwy{uryxrtwy{~{{}}}}}|}{uuywvw{~yv|}wssvtlksyww|{zxxxz|xu}~xy|}}~}~zz}}}}{yyxqpsrqty{w|~yuuyyrqx~zx~~yxxwwwy{wry{tswxyz|~|~~~~~|}|wvyxvvx}~zv{~xtsvvokrxvt|~|{zyyz}zu|zx|}}|{~{y|}}}|zyytqrrqqu{~y{|wvx{vpv}|w{zyxwwwx{ysv|wsuwxxx}}~}|}{wxxwuvz~}wx~{vstwtlnvxsv~}{zzz}}wxyz}}|z{~~y{}}}}{yyxsqrqqrv||yyvvz{try~zw}zxxwwwy{vry|usvwxxx~}|}zwxxwvw{{vy}ytstwrlpwwsw~}{zz{~|vy~xz}}|z{~}y{}|||zyxwsqrqqrw}|{yvwzzsr{~yx~yxxwwwz{ury|usvxxxx~}||zwwxwvw{~zvy}ytrsvrkowwtx~}|{z{~|vxyz}}}{|~}yz|||{zxwvsqqrrsw~|zzvvy{uqy~zx~~yxwwvvxzupv{vruxyyy}}||{xwxwwx{~{vw|ytqrtslmuyux}|{zz}~wv~zx|~~||}~yx{{{{ywvvtqqrstx~~z}|wvwzwqt}}y||xwvvvvywqqyyrswz{|}~~|{{ywwxxy{~|wty{uqprtokqyyx}|{zz{~zuy}xz~~}|zwz{zzywuttqprsux~z{~xuvyysr{{|}~xvvuuuwwqovysrvz}~~}~|zzzwvxxy|~|xtxzvqopspkoyzy}|{zz{}{uw~xy}~|~zwyzzyywttsrpqtvy~{z~xuuxytrz||}~xvuuuuwwqnuytqv{}~~}~|zzzwvxyz|}{wtxzupopspkpzzy}|{zz|~zty~xy~~|~yvyzyyxvtssrpqtwzz|}xuvyyss|{}~}wvuutuwvoowysrw{}}}~}{zzzwvxyz}}zuuzxsooqsnltzyz}|{{{~}wu||x{~}|}wwzzyywusstrprtw{}{{wvwzwsw~}{}zvuuuuwxrnszwqty|||~}{z{zvwxyz~~{wtxzuqopsrmoxxw}}|||}zuzyy}}{}ywzzzyxvtsutppsuw||}xwwzztu}}z}|wvvvvwytoryyrrwzyy~{z||wvxxy||xux{wrppssnnvwuy~}}~|vy{x|~}z}~~{wz{{zywusuvqoqsux~}zxxz{wu{}z{ywvvvwywppw{uqtxywz}{|~zvwxxz}~zvv{ztqprtrnrwuv|~~~yw}yz}~{z}xx{{{zyvssvuoorsuz~}yxy{{vw}|y}z|xtwywuy~yx~|{~}{~{nnsqnmnqtrqw{z||zz|}ww}~z}~|wrqrssrprvuqsvwy|}{{xxy||y|}|wqnpqmkpvwsswzyy~|z~|{}{~|}xttplkknqposwvx}{~~~~zz~uu~yvsqpnossopsuwz~}~{z|~}~yu{}xvtplotvrqtwxw{~yx~~}}xx~yspoprrprvvw{}y|}{~xsu~zwurrturpsuwz}~|}{{}}}vt{|zwrquxvstxyyz~{x}~}~~}~yww~}xtrqstsrvxx{~z{~{}|xtu~|zwustvursvxz}~}|~~||}~|wty}{xtrtxxttwzz{~~{y}~~}|xww}~zvsstutsvxy{~~{{||~{wuv~}zxuttwvstwyz}~||~~}|}{wuz~|zvsuxxvuxzz{~}{z}~~~{xwx~zwuttvutvxy{~}{{|}|ywuw~{yvuvxvtuwy{}}||~}}~}yvu{}zvuvyxvvxzz{~~|{z~~~~}ywvx{xvuvwvuwxz|~~|z|~}~{xvux~|ywvxxvuvxz{}~|||~~~{wuv}~zwwyzxvwyzz|~}{z{~~{xvvy|yxwxxvwxyz|~}{z~~~|ywtu{|zxxyxuvxyz|}~||{|~|yutx~zyz{ywwyyz{}~~}|zy}~~|ywvv{|zyyyxwxxz{}~~}{z{}zxutw}}{z{zwvxyz{|~~}|{z}}zwtuy~{{{{ywxyyz|~~}}|{yz~~~}zxvuw|}|{{zxxxy{|}~~~}|zz|}{ywttx~}|{{ywwxyz{}~~}||z{~}{xvtvz}}}{yxyzz{|}}}}|zy{~~~|ywvuw|~||{zyxyz{|}}~}}{zz|~~|zxvtty~}}|zxxyz{|}}}||{z{~~|zwutvz~}}{yyyzz{|}}||{zy{~~~~~~|zxwuux}}}|{zyzz{|}}}}|{zz|~~~}{ywutuy}}|zyyzz{|}}}|{{z{~~~~~|{ywutv{~~}|zyzz{{|}}||{zy{~~~~~}}|ywvuux}~}}|zzz{||}}}}|{zz|~~~~~~}|zxwutuy~}}|zyz{{||}}|{zz{}~~~~~~}{zxvutv{~~}|zz{{{|}}|{{zz{~~}~~}||zywuuux}}}|{zz{{||}}||{zz|~~~}}|{yxvutuy~}}{zz{{|||||{zz{}~~}}}}|zywvuuw{~~}|{z{{{||||{zzz{~~}}}}|{yxvuuvx}~}}|{{{||||||{zzz|~}}}|{zywuuuvy~~}|zz{{||||{zzz{}~}}}||{yxvuuuw|~~}|{{|||||{{zzz{~}}||{zywutuvy~~~}{{{|||||{{zz{}~}}||{zyxvutuvz~~|{{||||||{zzz{~~}}||{zywvutux|~}|{||||||{zzzz|}|||{zyxvutuvy~~}||||||||{zzz{}~}}|{{zxwuttuw{~|{||||||{zzzz{~}}||{zyxvuttux}~|||||||{{zzzz|~}||{{zxwvttuvz~}|||||||{{zzz{}}}||{zyxvuttuw|~}||||||{{zzzz|~}}||{zywvuttvy~~}}}||||{{zzyz}}}||{zyxvuttuw{}}}}}|||{zzyz{~~}}|{{zxwvtttux}~}}}}|||{{zzzz|~}||{zyxvutttvz~~}}}}||{{zzyy{}~}}|{{zxwvtttuw{~}}}}||{{zzyz|~~}||{zyxvutttuy}~~}}}|||{zzyyz}~}}||{zxwvutttwz~~}}}||{{zzyz{~~}||{zyxvutttux|~~}}}||{{zyyz|~}}|{zyxwvutstvy~~~}}}||{zzyy{}~}||{zyxwuttttw{~~}}||{zzyyz{~}}|{zyxwvutstux|~~}}||{zzyyz|~}||{zyxvuttstvz~~~}}}|{{zzyz{}~}|{zzxwvutstuw{~~}}||{zzyyz|~}||{zyxwuttstvy}~~}}||{zzyzz|~}|{zyxwvutsstwz~~~}}|{{zzyz{}~}|{zyxwvttstux{~}}||{zzyzz|~~}|{zyxwvutsstvy}~~}}||{zzyz{|~}|{zyxwvttstuwz~~}}|{{zzzz{}~|{zzywvutsstvx|~~}||{zzyzz|~~}|{zyxwvutsstvy}~~}|{{zzyz{}~}{zyxwvutsstuw{~~}}|{zzyzz|~~}|{zyxwvutsstvy|~~}||{zzyz{|~}|zzywvutsstuwz~~~}|{{zzyz{}~|{zyxwvutsstux{~}}|{zzyzz|~~}|{zyxwuttsstvy}~~}|{{zzyz{|~}{zyxwvutsstuwz~~~}|{{zzzz{}~}|{zyxwuttsstvx|~}}|{zzyz{|~~}{zyxwvutsssuwy}~}|{{zzzz{}}|{zyxwvutsstux{~~}|{zzyzz|}~}|zyxwvutssstvy|~}}|{zzzz{|~~|{zyxwvutsssuwz~~}|{{zzzz{}~}|{zywvutssstux{~}|{zzyzz|~~zwxusy{{}~~|}|{z{xzxyzyy}}~|wqnjjmmpnjhmou}~~|||zvtrrnonmoposwx}}{upmmuy~}wqw}wq{riddghioqutnkt{~~}|{wz{z{{{~}vqw{vnllruvytmr|x{{xvvvrttyzty}~|~}}xtuvvzurvxwzy}~~qqxtmgeajphmriju|yv~x{womqrw{rpwuuvw~|{qz{rjsro~}}|~z|{wt}|{ts~~x~}xrvzzvy{}~|y~}|ssyzokq}{u~xztqwptrnjhyz~|su{}vyq|}ulltut{yktuptvxt~{wy~sw~uuxrxw|vp{z||}{zzw{xwvwz~~~|x}|v}}~{{|pmytppr~vyv{srookoxjq|}{r~~{swxrqpz}yt|rmxouwyqsw||}{w}r~y~ywt}}ouz~yuuusu}yx}|~}zz~|~|wxykp~zrys{ypvyqoqlk|ylx}t{~wszzoppv|wu~kvtqz{zo|z|~}~|~|}wst}|zuzsp~~z~tuws~~x{uz~|yy}}zv~llz|pyuz{ptyrosnk{}nu~uvysx}pnps|yumtvpz}qzyz~{}{|wvp~{{vvtmx|vuyvy{s~y~|xy}~zyu|kky{oyu}zruysqupm}{nw~tv~xsz~poot~~{xlwstz~~r}w{}{|z|w}sq{|zuvnlz~vwzy~{yty}w{~|~xzxvjm{upxvw}txysvwprtoz|qy}}vt}oroy|w}mzozzxv~u}z}y~~{yzowx|zr{wjo{~|vyz~{}tzx}~{}t~|yxx}~mkt|nvv}z{xw|wuzuq{znu}tr~{xt{rrqtz|zoyqv{~uu||||{~|w{ss~yz}ytuzkjx{|{~yz{|vvz{~{t}z{wz|~okq{nru{{x}z~{v|wtz|ps{vo{yzuzwstty~xtxss}zu}vz~}y~}yzus||y}yvtzniq}xy~}|{~zsw}yz|y|{uz{}tlmytntw~u~~w||wx}uqw~ot{yyutwtwyzs|m}y~xy}t~||}{~xysx~xz{wuwtij{wxw}|}|}}uxwz~~t}z|zt{{zokozopt|{x~x|z|}tty|nwxz|xxuwtwzyzxynx~w|zv~||~||ywt{}xzzwvwrij}vvx|~|}uz~v{|~t|~~{|yt{{wmkqyoqu~{{y}|~}vuy}nwxz}yxwyvwzz{yznx}w|{v~|~~~{}yxsz}xwzwvwrjiyvux{}~~~ww~xy~|}t{|zzry{umjnyqpu~~{z}}yvxqsyv~zwxzwvw|vn}|{yzu}}|yxxsy~{uywvwumirzvv{~|}}t{v|z}zy}~z}{ts{xpjjtwotz{{~}yy{|oxu||z|~zyvu|}w~wry|xxy~}}{}zxuu||vvyvwwpkk}wv}~~~wz~|wz~y~u|~~w||~}{upxypjiqyqty~z}{yzowvy}{zzzwuy~z||p{}y{w}|~|{{xvt{|wtyvwwqliyxv}|}~yx}}xy}y}v}}~~~u}{{|{yupxyniiqyquz~{}|{{pwvz}|{{{xuzxzq{{yzx}}~|}zxtu||wtyuywplj{xu}|wz}{wy}w~wz~|~~}v}z{zzxtqzwkiitvqv~}~}~{}|qyu~|}}zxt~wsxzz{w{|~{~yxrx}{tuyvzsojo|wxy~{~~u}z|xz{yyyz}~vyzyzyyvrt|ohhmxrtw}}~~zsvxx|||zuyy|q}{zzx|}~}~zztu||xrzvzvomjy}xuz~{}w|~~zxy~~w}|yz{}xx{y{yyvtr}sghjvrsv}~zzwvyx~}}|ww{~p{z}x{}}~{{us||{qyxyxnnht|zt|}w|yx{~~zx|w|y{{|z{~~vzx{yzvvrx|jigquqt{w|~}{tzw~~}{t}zvuz}xz|~~}zzqx{|us|v|qnjly{xvt}|~v}}{~yy|x~|}z~zy|xwxx{yztvq|vhiitrru|{x{~vzw~}yt}ty~{xz|~|{yqyz{ru|w|ominy{xys}|~w~|{}yyzyz}}z~~zx|~vwvxzxysvp}uhijursv{}w{xzx~zu~ux{xz|~|{ypxyzst|w|onjmx|zzt}}~w||~|~zy{x~{|}z|~{wz}wuuvzwyrvpzyijitstw~{x}}y{x~|t}}yu|yy{}|}z{ruyyvp|w|tmlkv{}yw~~~yy}|~}{x|~w{z}{z|}xx{|sutywxtstr~pjiovsw|y{{}zyz~~xw~uz~}yy}|}z{wpxwxow{x{nnjqy~}w~~~w|{{|yyyyy}|z}|yvz|}~strvxvvqvo|vkkmvtwz|y|{zzzuwx~yy|~}|zzypvvxqt|w}pnkox~v}x{{~|}zy~yx~y||z|}~zvy|z~struxuvpvp{xllmvux{|z||{zyvwx~yy|~||z{wpwuxov|x|omjqyw~x{z|~|yz~xyz|{y}{~~yuy||y{rsqvvvtqvp}ulkovuz~yz|}z}wy~w|{yy~~x~}y|srvuvn{y{xmlltzx~{~tttu{zxzzw}|y}|~|}{}xonssy~vutv|x{svstzkgfmmps{wvx~~{z|vx{}y{z~}uyvxpt{wznljry}tozzyuvw||~|{~}}~}|rlruourkjkjsqtoqsozpjiorux~|x~}}vrx|u}{wzx{{}~{y{~zpg}zou{}}{~{{xu~ztuuy}{}~{{zz{~||z|||~}~~yslps{{ttouwwwrxs{zompvw|z}|tnq|trz{uypnm}zwzz{srpvw{{v{|z}vswvxq{~|{pkjos{zxnv~~||wsjimv{vpkqmoiilhqjcbhjnrvspwr}y|vsy{}z}~}~vonpsyvrix~}{~}}xx{ywqw{srptw{vvyv|yy|y~v{yy{xzvunoq|{{ytsywztwyv~xqqvx~~yxqpvz|{|yqopzzz{xrqpvwx|u}zz}ttvvwr}~|yojknt||xn{~}}}xxsqjjnx}ysmrpqlkojqngdilquxtqyq|w}xuz}}}z}}wnklowxwnty}~}|uz|yss|vrqruzyyyxxy|x{y|yvzxzywwvtrnsvz~yyrvyyzu{yzxsuz}~vw{wrv~z~z~wrotz|z|vsqrvyw~|v~y{|suuwut}|xoilow~~yt~~~}|xvrropkotzxqnsqrloqmspihmovy{svwt~wv}yy}}|}{|qiijqz{xs}z}~~zu~}xrw|utptw}wvyw{yz}}w|tyv{~xwtusuqsv|~zzutyy|wz~z~~wv{}}tr}{zvx}|ztrr~}{|wusrvxx{}w~~y{|tuuwvt~{ypjlnw{v~~~}y~y}vtppnpmqv|{trvs|~{uuvxwulszpo~}~~w{|~~zx}||y}ytxtnqptrv}{squxxy~u|~vu~{}}~~~zz|}|z}|~|xxz{yvr{|wyxqtqsu|{|vrwy~|w~}}~vyzxxutsrwx{x}y}}xz|tuuxxwzsvxy{{xwy~z~{y}|yz{~|z~x|qnllotrpnrvwplwwmo|~yxy~{{~z{}z~|~}z}~}~{{{}}{~wrqwz~~yunqqxru{oootruwysrxntvz|zyxy|xyx{zvv{wstmknquuz}|}~x}w|xxzwtz}}{uttwzrrutvtqvsnoosqs{xysosvz|y}}zrsv}~|{~}{||{wvriiinps|}upywnm}z{vuu{|}|}xz{|~yz|~y|y~|~~}}|~woorxz}uttyxr|toosstwxtoxqovw|~{xxv{zyy|~xxwwxruqkmotuw}~~{{y{xxxysyx}xxw{zrswuvsrxrpopsrt}~wzsrtyxx~|wqrv||}~~|||{~{{tsphijpsv}xt|yqm}|z~vuty{~|{}x{xz}yz{}x{{~~~~}~~}}wmmnw{{vwx|tx{qorutxxwotwmswy}~yxvx|yzyzwxvvtqtmlnrwy|zx{y{xtvvwu~|xxx}xqtyvvrtxsrosttw~x{tuv}y~v{}rpqx~|~|}~}}{{yusmokgjmuy~wx~zqq{||vvuz{~{||yxvy{wyz|x~~}}}{z~}yoklr{yxx||u|yqquvwzxspyrovxz~|ywu{zzy||vwxttorqmoqx{~}|zytwwsuvwu{zz~{ss{xvstzuspsuuvx{vvv|y~v}y~{rppw}}|zv~~}|~}wuqtpmot|{z}xps}zusqttunutpzvnnx||{}}squtrssrq}{w~}|vw}}z{xqhghqv~~}{y{zuy{||xqwvmqwvz~yxuz}}~{|zwxztuw{|yqjx{{zw{}~~}{stvststqz|ws}}xvv}ywsuwww~x{yyy~|{yyxx~x{xpqvw||yrw|tt}~}~z~vtrvqpouz~tx{|||utqsvxxu~|}x|}xy|yutzwuqruvv{z{{yz}|xxxyywokjnty|yzv{{|uv}vrz}~}}{zz~}wsqostwrw{ywv~~vpuuuvspq|zuy~}zw|~zxuyy{{{}~~}{z}{u|z{||{uowwopzy{}{vz}~~~}v|tqsvqpntx{{||~xwsuwzyv~y~}z~{}xw}{x}{xtsvvww{wzyyz{~yt}zwwxqljlruzv{~}y}~~xu}zsv~|}y}|{y|vuprsvsqyz{~zsy}~~~|{rqvuxusov|vt{~}~{y~}yx{{|}}|zz}~{~xv}|~~|upxvopzxy{yuy{}||~{u~{rprvrqpvy||{~zyuwxzzw~{~{~wy}v|yx~}x}}zwsvvxv~vyyzy{|}yrxzvuvsmlkquzxx~}}~|}uz}xrllprusxyxqw~tqrzxxx{x~}xv~zzz|~}}|wutkosuxuss~zy~wwsutx{~~}~}|zzywuw{~{}}}y{|x||~}~{x|usxzwww~v{uuxurttqrorrvsry|{}ztz~wv{{~{xu}|y||z||~~|}{z|~}}y|}}}xswxosuyzvpnwtno{xy}zvz|~}~~|w~urvyvtqvwzzy~~~|}z|{{tolxwsrnoosrsmwyrosv~ywy{}zsotsomolmov~~}~~{|{zzs{tnrtwzzw{{wosywtow~xvqrz}|xytu~{}{}{xx}x~}|{}{~|spvuwx~wsorswtrvxwy{uz|~|z|~~|zuvw}xrz~x~~zttwz~{}}{yywwsljcfnvwvqjopusokrysnqxrz~zxzy{z~}}vx{pow{{~wz~}zzz}|st~z~|wwttppnnjjsmfenppmpuwxw{uy~y|wqv{xqrnqrtx}~|zjcimsx||wsutpkpqmjgjonkmkkjkosvstz}z}||~~}vuxpps{}yontwrtvz~}wsmpptrsrsuvsosnnquxtoozztqyyu~~xywwvwyxyu~vyyvuyxvty~yzyunmnpqqrprnrxrjltuuquxzzyzsw}~~~z|xwtxx{~|}}w}zldjostwz}|x{ywrwytronruopnmljmpsppv~|}{}yy}}}z|~y}|uppvpihglmsy}wxz{{yzxzyzsrsnoqvtpmv|yz~~~|ywrz~zx{}wxy|~{rwsnmqwwvx~|tssttssprorytmqz}}y}{{xyyyw||}~}{xrxyoflsy{}~{|zxty}zyvvx~xvuttqtv{yx{}}}|~~|}~{}}xx|}y~~~xqnrvnmlptv{~~{x|zwx|~zus~{w|{{{~sqx|~|}~|zzzxzwxz~}}vouroov{{z~{{z|{|zy{w|xpu{|{y}}ztoowrmmnuw}~~}y~~~{|wvqnuulit|~{|ywuy}wwuvutvy|yz}~}{{{zwqz|{}|yz{}~}~wz||}ysppzytuv|~||{z|}xszzuu{vty|wvwvyz~}}|ysz}~}{}|z|zy{~}|tzyww~|}|~~~}{}z}yosxywswwyvy|zu|}wsr{wrqsvwzz~{{~~|{y}{{vu{yopy{vtqwvomkmikntuvz~uszwuv|}{x{|~|}}~zv~~wsouztrrx{~||wrvutu||yuz{x~z|{{xywywwvswztlrx~~~}{~~~|syzxv}~yxvxwxvwzz~|ty}|z}~|~w||x}~{vropzuqortvxz~{}}~}{{wx{wmqw}~}zy{vrsroprurtw~uwz|sw{yuy{ywx}y|~{vqmvuokloptv||~|z|{wx{vqowyvqszwuy~z{yyxxywywvxzqmsx|{~~~}|}}}tostpotuuu{||{{{tnswyuvx{{z}}v~{y~zusnqzuqostwy}}}|{xyvturrttknu|{xvrzxsppqnoptrtwwuyww}{{}{z{}{{~{vuou|wrptuxz~x{}{x{ytotzxtqwywu||{{y{z|{|}|{}|suz}~zzzwxx|yz}}zwty{vvyxwx~{~~~||upuxzvxy|{{~y~~~zxrt}ztrvvxz}~~{vz~{|}zxyvttvmmry|}~zysy{vqqspqrwvwz~y{{v{}z~}|z~~~w{{zuqmistplortx{~~{}|{vt}|wx}}zz~~}{{{|y|{zy|yrw|~~}}||~}}z~~|{xopwytwzyy|yvz~{}~{|~|wuou|xsrvvxy|{{~~|~z|z}z}|xxvvsttsqstmpv}|xytvustuxvx{{w{vtz~yy{yxy|~z~|}xx}yupohlusonsuy|}|xty~|xv{|{w|}|{yywxuvwwtvwpsx~{}xyywwx{y{~{vz~||zzxpow|wy|||ywz~~{}}}y|wz~{wtsms{zuuyz}~~zw~~yx|}zw|{{yvvturuvurvvqu{zy}wsusrrtttw{~urz~xz}~}{~z{~~~}zx~}yusnktxtptvy|~}}{vrt{yvsvyzvx}}~||{}{{}~{y|wvy~y~}wxxvvwywz}}vz}}|tqx~yyzyy}}~xux||y{|~}~}{xuou{yrrtuxy{z~|xy~y{~{y}}~zyxxvuwxuqusqtz~}wz~|uuvtuvywz}wyzuy}zzxwx{}~{}~y|{xtrkmtvomqruw{{~}zw~~yy{~}w{}~|zzyzwz||vvxtux}}~|}yzxxwzyz}{u|~|}yrqy|vvttt{~}}}}|{}xwsntzwpqrtuwyx}~|xz}xz|zwz||yxvvttvwunrqopvyz~~~zwxvuuwvx{vt~{vvzyvuv~||}}}}xx}zwrqkhntpknoruy{}}yvy~}zvxz~xvz|}zzxywx{}ytwvuv{}~|}zxxvvvxwy{ur{~}|{y{upqz{xwvvx||}~~~}{{}xxsou{yrstvwz{{}zvx~}zvwx|xsvxyvvtusswywqtutuz~}}{wwuutwvw{ys{~yw~~|yxx~}~|{{~}}~~}~|{~zx}}zvtrlnuxrqstxz}}{xv|~|xwy|~wx{~}{zzzx|~~xvyxxz}y{}vvu~|xzz{yz|xy{|vxyqu~{xuttvx~}nvzxx{|}}tyzv}yysmtvmnutpqtuwvwyw{vw|}|~~|{p}zrp}{}~~vqp|x{t{vqu||wz~u~~txw|}vtt|y|{wnwspt|yryxzxxytv}~{xzx|t{yx|{wtzy|{{yy|y|~}}zz~~y~xjfnq~wyyrlkhoyvr{{x}xxuyu{zz~rq}xxxvw||zyvyyt|{z~yznn~}~~z{~znsyy~psvonqkgiihnqnxwjlnmu{{|~|{~|xsxz}qswquuvx~|~|~xmelp|||wx|olplkpiillrtqoyuousouw{urvtz|~y{yx}{w}}v}z|~|uvrgmqoythqsttuxxvqzzsuzswysuwxsxqozztwvt|wstxuz|wwuxvz{|wsrtrz}||xtoqtlknhnutvulfqts}xyyz~{{}~rtxusxrwtpvvs{~rmjfo{|ztumsyshhkcmvnjllrtpotwzzu~{z~}~~}vv{vyu{~~}xx~v}{vxrrllmnoqzttyps}ynrosywuv}vwro{yz|ttxztyvtwrqvx{}}}vqox~{~~yw|torqtztqnkssnjvyzxmgvz{}{yz|~y}~zzxys~~zt{xrttpuqs}{{}|zz~zwnfqrtu}wx{orxrqtqnprnpootpnwz~|vzuz{~|w~~yrwsnzzywnnmdfqnjru~v{vx{rvrxytsuptxy}tvqt{vtwwyvqzyst{xt{xknqx|zpolrvsp{x|wpqorqqsyrulpwv{w}zw}{z}zuwoutqnoxuqq{y{|u~}wys||uxumrorxtvw|ustnpnqupmlopnruwv~~tuu{{~~y~|zyuw|ywy~wy~|twnmpprorwy{|wvwut|vytwzsqoyy~rwprvpur}ztvypwy}~uls~}{~}~|~~rnq|untzv||z||omnruntuwurktzvwz{}z|x}xtt~yx}yvnxxvyx|~}xz{vswsqrhkpx~|yto{pppqposrtviwx{wpw~~|wr|tz|z|y{~~x{{~}y~z~{yqinkjkhpu|~|}vyxzxw}z}rtzxz{xruwqzyruqvwvyszv|wtxu|~~~~{rwuprorwv}z}zszruutyyz|tttt|{~||x~zzwwwv~~{}rqusuosztx|x}x}yutmvynokgmr}z}v{ywvtsuwwnxtrrqxutzy{qqt{|y|{~zv||{}y}||~}{{xtsihhklmpuv~|~~~~|~v~}wwtz}xxvtwqtsqtwwvuxuu|sotuyz~|~~z~tqnrvpt{x|w}yyvwx~~z|psvz}y}x{vxzxxz~xx}~xv}yvtqvuqur|{||}xzuytqwvtmlkru~}xy{}}yxoxxuwpqwsstx~y{wtsz~|}xzzvzow~}{~}|z|v}uplnplkqptmq~{||{svtu|xs}uooqzvu}zyur|}yvyptu~~{}yzzx~{{{x{uvvvrsunu|~x{~{zyzzx}~{{|{|~}|xzw|~wsusnrmmzqpqz{~zyyr}zqmoyyrtsnpk{~tw{|tsysprmu}vww||swz~z{|w{w|tuw}||~}~z{|}yy}xxpslmlonioswt}{zsu|xzvyvwyuvv{rrw|uv~|wvmmztuu}~~~{zzyzww}{uyzyvjvyuw}~~zuxwz~xzvv~{~uu}xvxmpswoqsuyx~~zvz|wqut{qstwxoqblv{~|}~}yu}}xsoyx||w~|qnvy}v}ywryumsyv{{~|~tksz|puytvefxvy{qzyxr}yxqwwux~y|un}zwv{q}|r{zvur~}~|zu|~{~z{w{}ww{{v|ppuwrq{t}{~st|}||}|u~}su}}wpntumqmq{wu|~}tv|{syqtyomsvutqnosns}wxvsw{wtpr|xv|wx}}}~}ywwt|{tyz{||}xw}{zxruypxtkiigmkluysy~{wzu}}wvxvvz{muxonspz}wsvuw~~}~zx{z~sox{wzwxywtwyt{yqx|s|}}rw}y}{~{srx~~xywosyqvwt{~y~}}~txxssuvvwpsvqpxtpnhouxu}|x{zx{|rw|ry~zx{z{|~z~}}~tvtv{sy|x}}~|utvv|rntsigkcjvtoww|u{ywz~t|yyytyupxytrztt{wnsv~{}u~}|{zxxuu~yv{pm{ykpoptrnuyx||sunovrnpwtps}{xwt~{{zvrxplx{nkhkxxtqtropmw{x~zxzw}}{}sy}wzxw|z~ww{}z}~~}~}~zzyuyztr{~zwjfptnqlmowuxyv~z~}ttow}xtx|y~wnx{vqwyx~yzu~uu}uxx}{y}{ty~}|wptypsqrsprxv}~~zy~{{y~ttsswtnstuxw~{yv~vr}x|wrltslqswtigikutxyzw{y}}y}xu|}||y{z~|u|wzw}~}|x~~z|}zytqvwturnqgollmlsrptzz{uzvzzusvs{ty{~wwvsu|ww{|zz{~~uszwrdbegnjhy{y}|}}{{|twyy{ogopskkjes}tpysx|u{yzvwunpfkojemqxxhl{yuv|y}x~~|{~yuqvxzngxysxu|wy~yxyw}{}}|z~|z|{}uxv|urkmtomrsjmsmt~spw|w~|zr{y{o{~~}xrvmnxvxv{vpwlahe]kschthhv|xzpm|||xu{vy}zxstwtwv{srs|}}y}~~xv~xpyzqomt~}~y|}yztkzxy|wwopzomzvy~v|~qvrosnheiunmlkihvpmzzztlm}{txvtvypnzuzxqyooutvr{jssrvuuzxm{{ux{ywxvwz}}v}x}ufmsnhrwq{ux~}uwruwqnlpknqviuvgq|y{|so|t}~ryvzwy{yyux}y{|yuz~x{z~yt{|wwztqurwzx{|~~z~|~}}{|yw{}{{zujwwsqu{~v||~y|~qprsmctljlgdquqyur}q`qzs|yrssxqsrzsnxyrsnyutorqxx}wv~totzxzzxqyq{xx}{}tsvmkkrnlsovn{wyuwwrhvqgo{inqowvw~|~np}|~vq|yyzzzs{xwzyz}~{x~wwx|}~qs~ujrwsz}z}{~y{z}~u~~~}zyt{ypsvvqqt{yw}ujsyoi|xkkfloppw|sqyqir}v{rrmuwwzqs}thrwvtrszos{tqzvuwryyvz~uqtpszy~~z|pltpnmofnljws|w{zqlzvpq|{ngkt|vx|~wvq~~yzyzv~x}zvp}|zxyr|~x}s~|zom{}rpvzy~{{zv|{x{yyzy~vs{uwslrukr|~x|uy|utqnfisxtnssntnnvvywmtvwszptwqsvurwyuumy|yru|xrkv|xtyuslyssyy|yyus~srqpumjfnjkyx|{z{~qvzxvzwsrpu~vy}w|xv{qvzu|y~vzz{zw~}}~z}|qz~yq{uhq|uorxz~}}ywxzz}~qz~~v|zyvvtzzmjuwx}|yuxyqxmtmm|vkt}xztryy|u|por{wrvxvpnpuqv|o|qw|u{}stwzzs{|puqpl{}vxu~x~|}|t}{thrmnilsklepux}{|{{}uxst}pqspw{wy{~x~|}zy{z~uwz}x}~zv}}w|xw{ylsqq{}{zsy}~v~zwz{v}zzzruustoszsjqx~|vvvtnrntxwynqwxwntx{|u{xtvzsquzytu}qyusznyxy{wxyspxrsz~sqplu|~{vzz}}yx|xqtnvorrhpmlhmty{z}~vq|zz||}xyzxu|||{xzx~{vy~|zy}w||v}u{zy|pjioyzzys{~}v||{{vs}x~~~z|{rwx{uzxoqutv|}{xxuzzvxz~vuuv||nux~xxvvrvzyvlrxsnyvq{lz|y}yrtzz{zzzxxopjmu|w}|{||~|}uw}~lliommrfpkjprt}{|z|~uwwx~|}v{}s|yy}zv}yx|~twz~s{~}zuvqtrv|wvsy~y~z~wv|{|~}|}~~{|}{rrsypsutomnqt||~y{xywtzxqov{zvqww~zwwuvxx|{pxqvwmzuyzz{nnvuuwzwyrltrszrwz~y}~~|}{}~y~{~}yzzsuoyplngojhinpu~}{zy}}z}}wwyy|yv|xwx}tx|{|uvpknlr{wunz||{~|~rsvx|~{}}}~~|~}~{||}{}{zvxnnqwywx|vzyzt~~z~~qvx{}~wxx{{orstytrwm{x{wy|yw{~~vtxvwnknns|{rqy|z~}|x|zx}|{urywspllkzllldqtqryuuy{xvyz~}y{xzx{|~~yrzxz{~~rv{y{tvuq~}wxqv~~}z~{}~y}~{}{yu~y~z~~|x{{zwrtouytpjotss~y}zyz}z}x{t}|wo{yvr|}{}}|z{pusqvr{w||wtrrv}}qvvr|vswww{|{}}z}~~~x{z}~zuvtkqyyztspivjklgnpopvzyy{~zuuw}wy|}~{xwz{|~vwssumswr}u{~}~~|z}zwuvwvy{{{{w||}|}|ysx~vtxv}{x{rrqqtv||vz{{}x{vqx~}~ypxvux|yynty~|~ux{~}z{w{voytruopry}wwz}~}}~~|~}~uxzy|}~{uoryxxupmoqrmnufqneorv{{tqt~}|}|}}y||}zsvw}~}z~wvs|~|~sqvr|wwx}{}z{~xuzy}yzxy~xr{~w}}z|~qqvuwwrrtsxnloqx{vx~~~y{~wz~|~{v|y~{y~yzupruyu~yxvzwu|zv{npz~|uoox}~{}~yzsrw}zw|zw}zw|tnlowzzujrhjshijotvvvru|z~~{zz|~~{{}~}zy}|tnwvwtoury}}||w{}{}v}szx{~}|{vru|~~z{xvwt|y{lozupmoxvwwxx}vu|y}y}yv{}txt{yy~vyz{||szx|{uzwvynrwsyuutpu{{zx}}w||y{|vv|{suqqz{wlfjpt{shrejtqruwsootx|~}{~|zx{x~xwwz{|y~w|tntuy{yy{}{{xrwxy|z{|xtvxy{tsu}y|puzrsiafr|wsofqsry|t{}yxzw~syzty~~y~}||sstzysyy|{{xy~x|}|{{|ytxx{x||zvrrv{|qs~uifo}ubcZbcdjowztpsv~~|x|}{{wz}~}xx|~~|yyyv}~txymu}yvllmqzzmsqnxv}{{xyyxz}~zwz{y{wpoqw~xpntws}qjvkhjjq}}wtyt{}wtx|y~zy{|ztqnq~xvqiqusqpklkjustwtuvlntpojpxtzukjnu}{u~~{~}|yw{}~{vukkf`__fyxzw|wrkgillnpruqy{wz{||}x~xz}~~x}}xx|ryur|yuvvklnmmhrrrywsonnu|vnvvpz{vwutvwtuwzxmtjeomjgir}zuwqzv{z~~xswz{ytw{yvrqpnmorrgipkt{srtiluvvtxroursuy|}yvxyxu}zw}tmb`fikjls|rwxssrokkilu{pu~r{~{{}yyrv~|w~~~vpxsuyx||ytxmipvvrxokqtxwtrqwuktzqsspquzytpoq|zkriblqrqsuy|~{yx|}|~vlquwy{}y{}}~zpkkprowtmtxqqqmnoqot}trqnou~|~uvxtxz|}|}|x{~utl^aceionxvqqtwwropzun}yuz~~|}{~x}~zy{}t{}~}vlwqnty~wysonrqoyuopqrrvuoushs|w}zplnu{|wtrzvkpjikkkkox|{zx~~wz~|xzspor|}|xtorom{xntxonrtwxsjpurzytqu|z|yy}z{~xzxvvu{~~wmojgkiedjjtzvxxy{uq|sm}|}}yx{||}|{|y}|qw~xrpsvmlsstmv}x{yxx~x~y~}zwyzxx{~~v}uzt{}|qxusyzxtswrsxrtzuz{vsoptttwssxoqs{ugfztekpt|~~|~~yrw|{y}{w}{vuz}~|z~yzy~~tlxtqiqyxz{zxxwzvytvxuwy{z~w~~qrvwywuvyyqtnovxmhqsz~|qy{z~~|uspwvmtrrwspwpipvytwvnquyzwssyxos~ytywwy}}zz|z}qt{}|~}}znfhijkoupytjmpstqjilrrr{wt~~y||z{|~~}~}~zswy{}~okorx~{spqtuqmlstgmwnmquvutrpooo|~qwynlu|~wqrvprtjjntpmv}~}~|}zluspx{vxwprrnmormvxpoqssvwprwlm|z{xrrw}|{wwxsvw{}}}}|qnrjgihjmuqy{soosttsqosps{s{xw{~}w~~}}}zzzz|~~tsqmqtv{xsstuwrluqdpuqvwrnmmqtsnq|wrvusqtz|zywvqmrppmowpp|}}w{z|kmwyz}zv|uorstwtinrmrvusqusosssyvw~{zww|{ytssz|z}~x{}sjleelqppwt{{zyuqonqwwos}ytw~}ywz~~}}~|zwqv}~~|qrlku{vx~||{xusuqntnosnquwwqmoqtwrtytrrtuy|ytrrvyppolpmpuuw}||~~s|phpx{z{~zuruwxrsuopu{xnqunnru|uwusv||}|zx|wpuz}~~vw{sqpc`dhlqu}~}}~ztrtw{vtyxst{|||ywwuz~}~ysx{}~~}}|uvvkjqvrr}|w}{}~{yxroqqolprljnsxzvstxxwynntnosv}||{xz~}z{tlpjhhilnt}~uzpckkw~yy{yv|}yuy|z|}y|vvrqoov}~~~|~yvxrnnnpr{vmotkdehglpqrsstvsopyzz~uw{vy~{tuwrrsruwux|}{y~~xtyz|xps|ohojfhgfffjojekqnjrutsqsvwwyyytvzmltvsrv}}z|}z}{xuuyuwwpoieke^afggilhflnnmouzxpszxpstoswvrsx}yw~{w}{yyz}~|oknnnicabcdekmiqqilruvvvwy|totopxxqtzwzu{}{~~~z}|{|x}|ynjjllgdfkiaeqpjoqqquwvuuw}{mqxkiqvwxxy}}}{w~{{y||styz|xprpiikigghhnunkpppuwrvyqovurwqjnqsvwy}}|{}~|yzwtuzyzxppqpnmighhjvrgptkiouyxsprsnrtmnvzury{|xvyx{~spppqqjekjbhqmpsnklotwtru{vmrtrtuxy{~}|y~~}{xq|~{|tpvpiijkmidgnjkqnmpwwsuwxxvsxwstuwxz{zzvz~~wmc^b_`fiovwv}pqysqrolkkotuuxyv~}{tu{tnrx|}zy|vy{~zx~yvwpy}~}xz}roy}}}|||}~yoryuvywtstty~|xtsqsxyutw{rtxrpsvpsyyxwzxsw{tqwtsx{yy}|}|z|}wns}xu~~~~~z|~xzzux~~}so}yplkkmntvtzxpswzyxxxyypnsopvtpvyw{}}zz~~|}}|zxvvx}{x}wmkw|~{zsmllidjvyqin}|}nrxkglopomnpporunlx|ww}v|nq~~yrrzrnllhippqrkfjrz{xvvy}z|}xzzqnppqomouzxw~vvwu{wv|{zxrhjx}yspqpmlpusikyxpoppqvz}}|u|{x||}|wwzsry}yy~wsrx}}{yxsmjdfosx|upoqljortuqnrvvuxuqyzpmorvywyx|}}|yy{|{{wvz~~wrnnmfblsst{}vqmieeggginrjfrxvtwxxyxvxwrx{nkspmrw|{|}y|{y}||||}tnkrtu|ztleggbacfifcfmomqupr{zwwz{}ztx|qjttooooqsv{{yz~wtqrux~}zrpmjiiggeija`hkihknprppvur{|tx|wsuvyztkmrljklqxrrqhcahztrqmhhlplfgmngjnjjnmjknqurlr{pkuyyzwutrrutnju|spx~vqv}ytvz~~}wvuljmppoppqsmioolonhkplknoqwtkotuuutv{~|{~~}~zusjdelru{{}vwyusssrrrsvpfmtieiklljjlkkpsno|~|{~|{~ytlfhhfijlv|x{ywvqoutmmnklpjefghihjqwwu{{v~xv|~|~~{{|xkbkpignuz{wzqpqstqmmlhgljhntsorz~~}{wvww{~~{xskmrkhmt{{|xspoprpnsxvnryyxyzzy{}{{}~x~}wu~~wy|zxtlprffoqrx~z{ywz}{xz|y}~yvwyyz{xv|}{|xz|}|{~~||~|zw{tfhmihjlquy~~{x}upvztqtwzzy|}vy~zy|vtsuxz}~z~{z}|{{wnfijeefkt~y||uvvrtwurrsuxxx~}~wopwtoknz~}}}yxxtljsukgnx~||}~xsxvqrtstx|{vv|z}}zyyyzvppw{xvx}~}}~}zyyvy{vtvz}~||}wt|ysrvyxwyzxy{xqtz|ztv~~z}|z}zsqtuux~{~zy{}}}~}~wwzwsvxvz|xx~}wvvutpoqrrstrsx|}~~|ytpuxvtpot{}~~zzz||{~tnwyolpu{|vwwqnoppjjswttz{~|||zy||qks|vqtwx{||}{~~~xrnuwolorw|}zzyuqqqttrstvyzxwwyztt{}wvz}|{ztszyrrvy|zw}~~|ytlnupmry|{|zzyuy~|wutrpqsrsw||rny}~~}}{zzwrwxopvtsux{~}|}~}{z{xqpqprux}ztvxsoquvrnotwwz~xv~}}~~~ztx{qjqtqqqruvw{||}xy|xomtsonpu{}{zyzzsnrvusuvwxvw||wz|x{zuuuwwrklrqoory~|ywtlglsrnmtzz}|wz}xuvustvwxtpy~tovyzzxvussusop{~vqw|zzxxtmkputqsyxw}{wvqntuqppqvytorvxywx|}ywxx{}}}}|}zzwwuqnrtpnrx{~tt}zpnopqpopporwvsz{|~yx}}~}}}ywuqmhltutssx{zvtxwqonopoqv{zwy}}}wqzzuwz~|{}|xvyzvldmwuquz}}|zuswxvxzvrsy}}}~|}z|wrqz{usvwz}}z}~wwzzxvrlqwrptx}|~wz||}|{}}|}yu}|{||zyvopxxsw|~{y}}~~|x~|{xvuplqpkosrtw{{}}||yuy~||zux||zyzyy||vtvwwxy|~~}||}~|vqtuleknlklosux}xw}|vtuvxxx|zsv||~~yw|ztw|zvtuy|}~|z~}}}}~wtrrsohdjmjijqy~~}~~}xxxvttsuvuxzwy~~}}|wru{{tnr{}{{}|y}ux{}|xutqpqnjjrvoinw|z}~xvvuvz|zutzzz}}}}}xssvzyusvz{{}}~zy{yyy}ztuyzzwx{{xrppprxyuty{}zytvz{z{{z{~~yx|zy|zzywsw{wstwx{}}}yxyzxwxxwy||y|{y}}||zwrouzvtvuv~}~|zzywxzzzzzyz|}~~~~{{{ywrr{|xuu||~}ywwxww|}{~|z{zxrikwxpoquz}~|{{xsu}|xx||x{}}|{}|rnx}y{|~{z~}xy|~wtxytoigptomorvz|~}~zxwwzzxyz|}xv~|y}}xv~zy{}~|y~{wt~}xvstsqolfgpqosy{zz~~}yyxvwxxz{tz}~zuxzvvzyxyy{}}}~zy~~}wrw{ywurqqopsqllprtwz~}}y|{vv{~{~yv{|touxuttuxxy||~|z{xwxyyx{yqqvwx{{vpmqtqmovxvuw|~z}~~~~}{|{||xwvxwqmqvvssw~~||zzywvuuvvv}{ssvz|yxwutuqlmuyvqr|}}~~}zvzvuy|}{xxvuvvsrx}ut{{||xxww{}|wsv~{wy||{xwwvurmkotvtrty|~yw{}zwvvy}{ttwz{z{~~zvvwy|~~z|vvz|||}{{~zvy|{vsxytrqomkoutprwz~~~tzu{~yzus{ynghhrlp|~~wvyvrou|~ww}~}wutzvop{}ivrpyzttsusu}uomfQbmwqz|ry{}xmqyxp|y{yth{mjxv{}wzs{rut|quwszz~nea}zig_dponflsz|uph{}vurwvwvuvx{ped{yqqyukw}|xo|}ru|c`jyqhkkkngqderpmruxrvugngqszzzlpzyy|~|pmiiw{vy|{y}}}~vx|~urpmgh|fkm\po_fcomdqpqk]xyvxmu|s|~wyvwzopt`\e]zy~u}z|yy{pfojrp~z}nki_kicftytlukkokogzz~qqpj~u}prkrkprq}z}{|~q~vtmx}zwuf_bqm}uxjd}oigeqhm|~njxvujr}~r{vqp}{vr}x|{v}xaei\ylw~s|~yv{zolsjiVeyvlnxtqn{urn{vopmg[rujwwljjhyvoqwvrolqqv{|tzvxp|ukw}{u{lb[f^f{vzlhh{sn{wkgunpbbtnx{~{r{{vztw|y}rpoZhshw|q}{~}}ytuwp{s]Rtu{tphxvnjosglkn]bk`ixqplj}wssy{rqhj^m{|s}{xux~{y|uqlkn`kzwsjdquit}yu^mzossgnmfv}}{{~zxt~s~qjp`\r`\ex}}{{}~z~|z{oYluuy~vynotlmo~pnoriithitm{|wr{tvrstv{ikinelqw|z}zwrop|rwqjj[dltpwqk|sy{~kvyxwjppfovt~x}rwttszxq{vwfawg_arxz}{z}vw}|{z|lUhjemux~{~yyxpsz}lnp`ajarpoo}syl{r}uxxxhmkrw}~y{uzrt{tu|uzyvnrk[`dca{y|wnotnsmhn^d_gtpt{y|}z~y}~rytfdgimy{{|}|zrt~f`g\cirytzvkvmmfhzocifed~~q}zu}xrszfhia`]x~}yxy~y|vqxifjhfu{tqh~xchtnlhkxpml}|}~|xwo~nndjx\Wdhd}}t}ymtq}}tvohndcfhuxs}wwsyymxtppmlpyx|q}sqplnfoxlywcsoss~~~s}m}kjzxuvoiqlXeYchs|}||yttxoqsiinoy{t|jwikztyw{yxoxpnmnq|x~vxsoxyu~vvsdjVi\NShk}~~yyrtomwqaoblhsqozwt}y{}ytstknpjpw{yqt|}|}w|sthainbpti\srw{qstfl\pgX\poz{}z}yzqrlgqoaskw{}}wpq{zspymk`kijrz{xtpl~i`isgu}vewz~}}~|z|uwtotafXhjZaz}vuz|~vvrphbfegtx~~tlx}r}l|vtmpwqy~}~~v{uy{lpexq]]nefy|pw|wvqnnto{vxspride^bspwyw}wxtlmpox}}y{oqkufj|ptklvnoiz{zwtvsht~p}xxmkre`fVYWm|t{ywyuwxooohs~uvxr|jnuxwvzyowtnqlipyzwyynywu~|zxryfbYchTObgd|{zotxionbef~~pu}}{ywz}wooplpolstvvz{}}~sqkxyd`oh_ose]qsz}|v~vigevk\evmx|}wy{x}ysukgpierilq{}|}~{wpqvrpivnjahkhrwzvrvthszisyiu~}~}~tu}opsb^Zil]bz}}t}|t}xz{~y~xrztppgabdgqt|}xx~s|wosyt{svlifrlb`kp_cxy}jy|}~txw|tr}z|~x|zvnsd]d_gkpwuxwuwmllh{{nz{t|xxwqwjtzrklifbtzw}|t~k|}yx|stltmdm[T^UYympz~vpxpjr{zstryn{xmwfmk|sk{rxjf{{twzl}v{wj|txh^ga`b^gf{|z|k}omelveu~~n{}z|x|zptxpehocptz~~{sv~~vvsupslaqgagXQnbajt|~wr{vliupos~}z|oppjyokxwe[wru|w|r}{ju|px}z{~kncqlijgi_lqtuo{ppoykt}}oz|s|{qqumhfpcdgqkmz}xz~pwt|x}zu|}m|sfndXsgUXWqx|x~~u|vq{}w{}njlfuwiy}yrayxmolnus~pnteqw{{z~rwvfgajbdeeaewu~zxv|xnh~{ys{yzsztknphpsxfr{t~r|t}xyuwoom}pkmY^pVQOZhbqv~v{t{rmw~tz{ssnl|xwrh~wsulkzox|x|}qw{jqtuuxlwqehdgYa`hehpjs{{y}yw~jiz~~~~x{zv|vimmmcqqhosow~y{{~s|zzz}~qoxlhlakx]SN_mdnxvws|vs|zp}xsw~twh{xonhapkls~~{vwfrqnk|{w|xz{hjjrehihgcoisuzuz~tf{zz~wtsxhimn^emdgrm}xz{vylprvywxrzpqjd{m^Y]kb[n|}u|uy}v~z}v~uo~suyel|yztfinfszz{rqjkqgdr}xwsqri^cdk_hccgsyuq{~|}zz~|xyx}}qkmqikumfjhs}}yxxyystqvtxylhjfyq]TYhaXcpqog}yy{zmvxtytxxyvpu|wkmwimnuq~xrkn{plx}z{||qdhhmwukqptvynyzzs}qu{|v{x~rxnrxv{wwz~pmz|~sqmrxywrcountwz}zzrw{}|z}~~z}|{~runxnsg_mh_luv|tr}q_\~lm_Zilmvxwnyss~xz|wxw|uxvskz~{wl}~os|wv}}sgqxk[irqqxyyopx|yxtw~q|wyyznp_d[utnrlggdokdkeegg~ow~p|hluqq_mzywqfolz}yxdqpvwmtu~|owlzrtytqsoomxsxxqkoyty|yy}zzfQ]P\dixpyqkY__Zqfcqftrfe}l~w\f|}zfchrxz}r{\hmcymuvxzuxfsjhzoypunpouo|rvle~qy~|{}ruQ]bN``x~|tvzo\bi]^t]qpk~qo_xmkk[u~ux~bcltwzwh_xkkss~{wx{|t|mmhubquso~}nqvs{o~aur~{~~v|~|z~pdPf^Tad|}~s|{j\kj[fj`tjo|rid|ksd^z}r{|bepv|y}ch~mqqw~s~zyvuykfiq`suuo{psytqzaysz|zvz}}}z{p}_Pg_Ycf~r~{k\lk]hk^pfo}rkcqvd]w~s|}dgq{{{}eg}nssv|vxz~wpvh|eal\pxwt~ts{yztdvv{}~}}uz}~y{mxdLacYhgu}~s]jo`bt\lhg~tnb{xrlXo~tukioy{oc|vrypy{{v~z|jzxgmnXe\f~z}|zzuvty{mkz~|w~xy|}}w|nnoPSg\joytzj`si^sd_j^t|rhku~~]_w{p|mo}}{co~p|sz{u~y~om{kaz~X[aZ{yxsy{~y{g}zy|yw~|yx~}~wzty{mhpXMechyur|r_om`ko[h^ksmd|{dXp}s|qryz}ij}q|yuwzw~ysgwl_p]T`Xv~~|u~t~{ixx{{|t|}}y~~y~v~usqvjgnZLdej~wt~udqqclr[g]itne|eXp}r{utzx~km~r{uuzv}y~rgui^r~ZT^X{}vs||jzyy|ys|{v}yy|t}tmmoghmXQgcryu|sfuocsk\h\rtkj|_]u|q~wsvit}rt}vx}vw~zkktc_zuRY[]{vvv}zvnzwystzt~s{wux}dmhglgPZfbw}|plxjh`cb`xsez|sXh|wuvwszz~ul}t~qs~vws{tgrl^m`Q\Tryp|z~mzyyz|yq|wv|w{{rzrhjjfklWTe^vzuyn{riiag^{}ujr}}\cyzrvvot~~mzyyqxy|xtq}wjnoaglPYTd||{rwy|rrvztqu}|v{r~s{p|taiejobR_ael}svzlr}`gajwsgl[o}tx|ttrsy~urtuotx}uvthri`r~\QZTu~}|zoyxp{|{v~x~xp|swzv{zp}|nhaddlm\Tb]q|m}t{xn{uaj`vwrle_u|s|wwrypy{tv}tz{o~}s{vytqhqf`vzWSYW{}{zoxx~q|y~tyz~vo~stzt}xo|xl~c_acll[Ub]v|p|v|yo}ubjaxwrke`u}u}wytyqx{vv|u|zm~rxvwrrfme_s{ZRZX{~|oxxry{{v~t~wnytxwuwwm{xyhzi[``il_Ubaqpyy|qzdjdqxvhl]p~x}}x{twv|zs}usott}orsehf]j}gR[Xs}tuxvt}vxn|or}}rwpxrozxllwZ\]dkgY\gg{u|usrfjexoo~`dy|zvt|~tx{yvp{qznyzok`g^_uxZX^dyqyz~qzyrxu}sm{wtup|r{iy~srbvbY]`ik_Yhi{xxxr~fjd{wugf_t~~}{yz}xt|w~xm}qups|ln^b^\p{cX`c}syzsv{zuo}umww~xsrws~htqs`sfW]_ilbZhl{yxyshkf{wwfh`t{|{yt|w~xn}qtmt{lm]a]]q{cZbf|ty{swy}r{p}smxw}}vsp{pygt{pp^sdX]`jkb\jm~xywu}ilhxthdcy~{z~ww|{vpypwhztmh[`Zbww^]aoyv{~|qywqqy}oo}}}~~rtp}nlhzqrfdsZ\]eli]`lr|w{v}tlks{|ktt`l}vzu|yss|rq|pn~lo_]]\n{kZacy{}tuy{s~o~slutz|xsq~nufswoo^tcZ^bkj`[hj|y{y|~npp|tl|dh|zv{wz|s|uupyvjnoe\^[izr\^`zz|z}yrzx}vm~xlp|ry}|stuvpgk|~ms`jp[^_hkeZahusy|ytqnz~i}ncr~v}v~{xq}qs|ju{ko]^\`r{gZ`g~{~tvyq{pqlu}|rx}{yur}m{sepuno\rh[^bjkaZehv||}ssr|{iifw{{{|x~~yqypt}{gzvlm[][cuyd]am}|swxowr~olu}xtw{{wtr{j}odqrml\se\_ckka[fj}y|{ttt|{iigx{||}y~yqyos{~yfyvkn\\[cu{h_cn}tuwo{opks|{rvzz{ts{mtrcl{tioZmj[^bjle\fkv{|}wuszi}mftxx}|ws|ppy|{hq{hp`Z[_p|pafkz~~yrxxvvk}tlozqyxxtsv{xgzdds}}ygna_r_]_gnlbcmv{}|{vu|ukzgl}}{zz|srtmry{rd{ojkYZ[gy|jgj}|~}vwmcbguqjiry}|{~vwlszsstsztsru{xsvoy{{}zvyzxrzw|xwon}zpiuw~pqswwswtxvxu}|ozu~~{zx{tt~uuw{w{x~~tk\hywx~||}|u}vo~}nz{nwy{zeUd{z}|sdlmo}z}v{vs~}rt}~qwo~}tx~{yzlgV\wv~v|{}xys~y|{vi_L_}kki`luos|qjtrhrwvrj}wlz|n}~|vuzv{sfd[Ws|xv{{{tz~}|i][N[zwugmunoyqdmnch~spofuuxlw|mz|xs}{|tu}ped^Wnzu~|z{t|}xxg^]QYv|zjnvnozrbkmae}}snnessvnx|nxzwr}|{uu}rfe_Xl{u||vzrz}xxh_]QYr{lpwmpzq`jj^f~}qlict}pvs}{n{}us~}}tw}pff^Yk|yv|wwvr~w~zvhc_R[p|{msvks|m_li]i{okgduxjxuyo~~tt|sz|ohi^[lxyy{|twss~{u{vie_S\my~qxwkv|m_kg[jzmhccuwhvyzptt~~tz|oii_\jv{x||tvsr|ys{vjfaV\jvtxykv~o^mi\izlfabuwgu{|q~ut}uz}pllc^it}|x|zuuuq}yr}|{xkgbX\htyy~muu`jl]d~}me`^qyjo~qzyt|{vx}rlke_gq{yw|pxo}wqx{z}zlhe[[eq~zrqzdgp`_xpe_[jznjtv~tx{yv}ummhafox|vp~pxwqr{z|ohe^\dm{||m|oari]lvg_Y`wwiy|r~~xuy}uzznljcemu}|xwtuoxqlz~}wzsffb\bkw~qtzekraaz~laZYl}pntvvx{~wv{rklgdlr~uq~qv|smovvwjdd^^jsm{}{}wrsqbnyvspxtrrryqkxvy}ojqysouyyns}z||{xmkkisqx_p~xpnelqkqkjolzznfr}|ws|t{tylx~qr}~spvxv|u{zl{j}yvrdrkppspsy~rizjpwwgnlUjlptrppq\d{vmzuts|qztzy{x~jj}vz{pio~xsn}{zt}}|m`nsfw}rj`jnjsz{bqggmr|nno}|~t{lnbgnko{}}ytntwyxt|~~wrzzxo~yshbntrxprxgjue~]jY_vg{{quf}|q|trluit||}w{mgxqp~zvov{x||syv^nid~|~t|srrz~utsl^psqfjtkx{|q}l{w]ryblbyn~uiuwvy|z~{uxu|ry|~{~nhlilj}yozigzscbwbhz{gd}zz|w~q{rtmivsqwutouqfwtfv|xyxx|yu|ycrwvylwvqyrqprhkinwekp|qpxrxlr}ed`jys}tutlts{zzxy{vwz}wsx{wkfduottkuowtzxlwv{pcxqs|sr{rs~rkuqpkty~xziole}ytzrmz}v|}xyuy{qt_r~lx~vqelznljqio|mr{domdckzjn}|~oopymr~~~w|{uxqpu~rfpphnwyxilqnssc}xotnnysu|strvrtluqmqt{roaqigpu~~~~|w~~~|xcc|t|{yz~y|tsqlurmaqtjkmn|vmifxtiyy|~y{|xtrplss}}z}t}|zs~{}rxfhnrnxwnuie}}sihxrps~sivxrlwqrjy|~~xztfxvhfizw~zyy{q}{dexvyuuz{vuiruufqldkhe~fer|qix}zojz}xqhosvpwyxvzx~y~liholi||{~x}|~swuywl`nb~}mfhbdkzuw|~s~ywkkntyxu~~tzwcWzuji}w|yt{rj\bmsp}{rsu{yyv}zygbj[bw}skw~|{{oes~{w}y|u~ucbt}zkq{wlgw{uwqc_vyqpzvyj\br_dgaVUltlhxz~w{zm^g~|jqwrxrudku~vxtqdg~~qr}|zmcwr{g]ly}sjf`OYnh\erj{tqqy~yl^]vjj|su~uyut~yimy|u|scswm~yjsumqvmapxxsxcXlq^^vkqromrtvmaWk~|le}zn~}yzuhw|olzxwkm}n}|}npxgerrcnw||xr]hvd]vwjwopnmqmeWdxyyqd|px}}|zbo{tjzuwskpwsm|japtejvvxxbgxi\rzi~|ppnlpmgW`txxvdzqv||{|bn{uixtyulqutl~~laptdhtq{}fj{m]p{j~}qpnlolgW^qvvxdyst{|z~~cm{uhur{{vorrsl|mcsucgqn}hqo^rxj}rqoopmfW^ptwwe{qvzyw|er~rgtm{}urou}qm|~jgvs`hkk~nxm`vum{srppomdV`opwthpx}yxw}xfvnhrh|uwnxzom}}kixs_hiiq|pavsm|sqqqpndV_opwwhqx~ywt}zgvogqgyvxovzom{khwt_ggfu~m]oj`tnffilnneUYit{|u{j]txkqxtqnwxzw|e~km|yv}{vs|yqrt_st_Xql|xzyqox|ehuunvrtaty}|k_v~mwok{o~|zxzp|skulQ^l`_jbot{|lk{u|rrsrrqaarxqzzpswmniirv{lg}w|twr{nptl}kakkU[qrfqok~n~xtrxyp}vo}tmnuwxzpdp|upnisj`[}rvwxp}~~{x~snuulpv}~{~x}zwx~mqw~wpylYnrron}|p|~{xsZWixcqsrlp~~jVZ|gswkkyxzwirzpdwruw|wvyswzueour}x{j~w}~yzokzxvvruzsiblrvpbZ`klskuy}}{flobpzxj}~|w~yseilmgugr|ppy}iqpsho|}wnp]_mp`idT\jupfyt|z{icixvhp|ruuxuvjnv}usvfdYy||z}~zwls}wx}jWT_dpu}q~vu`trclqxe[|nop{sjnm|r~~wtvr~}zi\cq|pvyq}}qzzu|{ia_\SVkpikxtpxsjokkjtlcXS`htny|vwywumirwigq}|z{oiw|{msj^Zupss~fx}}kmfwsjwtfjneaqspvys~pzyuvmrpukg\p}{xwu{v~}wolXQ]n}ntl^nnphn}qmde]]tlri|y~jg~wsl_imjv|ut}}yk{vq}{}cRcunp|~y{rmunhcqsfm`\bu~{v{xvtp}u|t}ouuabc]cz{}}|x}|yysxl`Ohddbn|yvjttqknv|hWXstgnv}r~|v~nyipjffW`u}wv|lnlqrhn|bfag`fwz{{opt~|rqiimcj[dvjpcv~zto}uszvry}x}uh\i}{{|||~uxsxxkhiVW[V\|~pzut~sokrdkjiakqrt~ytwwzts|wumimYatr}zvvyzxvtlw}yl]Xl`bekzr{z{lz{ibcqueZ[[[^{~|y|}uo|lxp_jfilz}xz}|jr}~xzttzmkl^Pa~~wy}sqnu|lhb[qdegjpyvtx~t~zvnZktgWWbgqxoowu}xtkd^^`g]d{ustmiwrfn}qlmvj]fxywy}||nm|thgk^owtsrxhuqpw|}|q~yk`[u__muy~twvsqpzzghjmmnq\|{zywqsvppspvwxqsypquulm||x|wtsy~cuuaRMhrhgtoywjx|ejZps^loxy}qs~w~}ql|we]emqw}|y}x~|x}~r|~xjjda__eoh{jmljpiaW^sxifopq{}z|yr~zprqjbi^{zr|zy{pq|}|suskZmq_UYqtxzowvvsntl_cgjjsylyxs~zzohqg`jffaw{}}wxxspnfkcbeccnrzpkmd]pvjfbw}}tt}w~|wvrvslp|k_blqr}wznz~zq{}|yvhjzq_Zfjpvwyzokupdgmoflyup}w~uwwmf`cbkfggv~}vxwot}Xgs\]Tdnopz{u_psieqrowjp}~yw|~{zsfmpd`ertpx{zplumj|y{tr~jc^gba][ep{zubvqbf`lppjsyrklyxebnrkfkxzy{{vrs~v~zntbV]UMWllpru|ekpjkomikuwz}qztw|tsbnickes{{|y|t|~|}}|||~_kv\^]`fq}zuxlj`[Ymtmplls}w{fliabioikwtnszqu~|xv~{|}wuvmUVgnmlyrlnejkimwxvutyy{xpoxztbXUT^qrvx{|vopu}yuw{ystlpsgOZj`gfpk]dwwrs{~~s{zv}~{rspera_igkwxs{iffhn~yv[qtZWV]elrr|~ws|vo\nviqhrxx{yturx~~vty~rbXeuz|}y|nttxxzz~qssl\\ttaSRVVd~zlifgkltusu||y}{tgpwpkgZfunxx|zskp~ystmekoaQge_lqy|~rhpz}qca^`f||yxoqlitc_dfoyzu}{xynj{{uysro~uq[hypkhe[\sztx{tt`lxhqty~~w~sz|nkbebbnnf_`gm{k|zqqsz}zzxvvpeea^_cihay~zyor}yxymfo~x|||{}sfepldhg`vyvopwoitrops{wsny~xmljg[Vpniqz|}~pkmrwupj}|spv~~unmoxjnjcprvzxsrtu~wsr|tp|{jwnlY[`VQWmzwuv~}}qrcqstu|yu~tw{vojvse_eouzw|{y{|~|iu~u{||uqsqpg_b_]^botmusqke`br~wrss}{~z~qow~uuzsfhhg~v|~tlrx|}zrtzut{tkea\aofbW\t}{w{tkkmrt}rx~}~|ujzodpb\\]dpx~tuynx}~~}y~mm~lgadkhhdektxqi{trij|zwryurmhsqd`dmrx}u}|}lfhkkv}~~zu}xi_]jvpkkiotqt|xwvtpqy|}~x|wxtrz{nc[dqseigi~xuvmlstx|z~}wvvuvpdUhnbbVYadm|xkw~z|tvxo~~~||{oszdlqjimsqpw~rjss{zoxlr~z|sj}vi^`hfc__dku{lvvrohhhkoyr|t{|l\fpsrrwur}xu}{|vtw}yvu{||~tomhkw{p]Z^Y^jgimj|w}~xvtrnotv}z{vzywmddpqcigbgkp~}stsz}~yw~v||}uurqrseXol`bagnsvu}|xnlttutm~q}zowzkpmgfimijpw{yznyxnwmjkms|zsy{{|sjwyujgcWZeotv{xtzzsuxy{~yy|xw{topnrwuvl`\^nvnvvvx{zspqwutty}nhrniaisuyqz~}}x~}thejo||sf\bnzsqlhjlgdosvx{rvrg]Tlug`[et{rq|~||sx|~|mswnv}xqofhs~}~nkw~|qtyqiaovnxwmpmwyrf[gsx~}l^n|rb]_`d`bvtox~}}z~sf`abk~qtyu{ztim~wnyihnuy~r~v}oqnwai~pw[\hl|~paYj|tyyzgh`ax^[d^uwx|xr~x~~xwnxmnyxz}~eenwtpoq^hpt{{wlighjrttmqpezz}~xwx`morsuma_y~u|yyzt}qknosmv{uobvznw{rvmncZnru]_ksoeo}}uuzwhmrwsedrh^glyyxqt{{qmow}ttrorg|ortyuszw}ozv~ppnhwp[h|yh~|r{{stgacYhhnb`u}wtyu{y~mquzpuu}~xnwsz|rwjkvinxntvl_htm`mbirggp~zr|mspsnqk]kvhivzk~o}phuxy~w~~wxwuu~{mwnryz{roykqfrois}tavwqowpw|wkkmebegi_tmprnx}worxx}sv}oi|qjrzp}zkr{xmt~kcakqfqrjru~xziw}r}iemiqZilnznumwwx}rrw|y{{}~vwvwoi}xo{ouv}{n|objtdclxtdqxrqv{vtxt{~]V_lc[lrp{u{~}smrpvrpyllu{upu|mllxyaqw{tmfgw}ehzzmxy~qdvth`cgWhpxo~yuz|szfu|svwj|ylhymqlj||imuxjfmwotrdsxvfhvxt_coimfhcqozl{nqzswtv}rqpqndu}yojxupln{quemzuuz}luyp|psxugghgh\dmyv|spiw{x|}xsu{{jujetkhv|kswkow|yrisriingewsnyyentsj`fmhqln{uu{w|r~skr{rp{~yvrsmplhuvn{wuyr~zuz{lbW[eul\csrmv}plosmgebkfk~nczz}po}tko|}|wuw}yojzrpukmzumnrvr}n~olggfkmljorfluwtpsrhqlajozpgx}yrr{|}|~kqs{sytuiv{sfnldyvmwzxqs`tvokplq||i_y{v|mffq~ulZqpiszzo~{{z}{y|xpvkcq}ob{{}lo}w{wwfttzwmgolg}~zlx{faVhtpfi~|fqqz~}xt~{x~q|qrk|sayxu_k}pw{s~oqemomnvv~itskag_itrfz{kw{v{o}uowzkhh}tmyuygz}wy}zrqpjnphgox{`wruzcfeaopfqvxohzxru~|{{}jonpzrdttyykn}xy|~~zvdgsvoruwrnmn^cbn}ti{|z~ft||~|z~qw~xu~tvvnlhy~jgxrf~yx}w}utkgopmqrrxwgnmubgfarwlu~mq~nuuyv~lgbp|qcu{t_l~z{ztskrvonvxuwg{tqd`]_t|mh~~~sg~{{xyx}u{v}qmbh{xkuxxxily~y|tqisxoglrt}mq~nlhearzql{~~zk~|~|}|sq~vtq~jhcm~tdo{}gf}}y}|znptpnrusxfnymiee`nvngyz|lz~z|vrzxn}|oh`hxtjpvwxfg}x~wxou|tkmuw}jrysmhddtuki~uh~zz~zy~ur{x~yq}kifs~tgqvvwhoy}z~{nsxqkquuzft~uukd]bwxniz}~uo}~{~yzuvtpzzlecv~nbn|twrdq}zx}|qwyspvzwxfx}zyjibfxtif}}oj}}|qpszu{y{xjliffj_hona~y}}|{}}}vfo|pyeuyy|{tsimqqpfxxpgo|}{szuxxvq~xv{yv~k}lrrhpZ\asrxwptq~yxy~mlupboqx}{wel~qsqwvsxunvy}v~~~~swjq|lq~lzrxxxd\xrkmyuq}wfaes{uwpjyvx~{o^j~hemtkf~ytv}}~x{zptx{uy~|itynolpdjxmgeylf}|jx~qnw{sf|vpwy{rrc|pupbjq|}~}y}sqswwcx}xt{yw~swkrsfmmtnpuntyi~wndx|o^vrwwhdotzzhiyw~w|{~r{szhek}t~~~nlrvya_uyh`hog`}~oy}vvwwptvvt{|jjmsytuvnux|omxxxxwu}|{{how}{|~zznesugp`sslsbjw||msmhnrai{tj{tulh~vmjoruyyv}|vt|}|z}|}eu|zxty|x|~larpthw|jpvyi`x}z{}smnrnnqu|||tupig~ye^zvhowuqz}y~|o|lqqtsxvzxsb_kywjgqmsuzldus~}z~ucjxtty~{xpnrtuwz|xtzi|w|z{u~}~ucqyggqymt|nlykpmxkmeo|dnow}~z|w~xzy}sd}xnyttlpl[mxpkx~nv}|{}}~ytyfx{uvrsz^snsljupkXe~yhgx~pv}|qtimqzyw|w~t~monrqvwsnxy|s}~~vyws~usyyxltx{ttokhqxlfirtqnsf{yys~|tboyinvrep|fewqn~svoxp|}z{y|~towtyxzjv|p~}f^ciakqjgg~zw{ty|w|~~uvtivuqy}fiuwer{vlb|wyzsr~pu}rvf|o}wvqtixlsphbhqohjrt{oyx~x|q}|wivyzkquztxqknx|zxy~~u|vlyxoagwft|uqvzvxz~}{wx||vacs}~~vxuw|xracjkidcbm}uny~~~YWgbgoy}ru~|vxlvxhvxuwxzp[Tahomojjnp}rx\Cy|rllkpjibgwxgtlwytxu~z~|txkXer~~~z{syoqz|tx~pGs~zplpvhsw}rtrwrpzqwtnqq|ee{}kcaoTTjbalquwyx[Wwi`iZchln_cyldksi_bqw}jkXlzwvwu~}wsv{uh_jrO{uu}fyqyipyo{v{{i|zosmrvzlcTm`_||svzqonn|nSsib]Rqxzwb[pddq}rfT|utykznyqWlmhisywqozuk]wZ|wx{twv|rnuxexssxtqwr{{}gov}sn\ao]txznjjhrzXhqcaPq}o\ffdnxqXiphynp~~\dqhil}wwht|wt_qno{|}v~~stvvf~xoh~oxzio}}jbmuxmk[xhxt{ujkjl|hZwghV\||xb^{saesxocZusxvn{h\v~mlm{}}~}eir}xsgj~izuzwtwvhzvxdq{{t|m~sy}~k\dnvml^xr~{t{xllkl|nXxkj\Wy}ze\uwaanvmeXz~zryozn]rqnozz{{|ddnzysjjlzw{xtwvi{w{d{q{|sy~ntzy|~gZakslj`}q|w~zoonqh]{hm[Yy|~ua^{r_`mqi``vtx{ti_xsqs|}~}zv`dnzurgq}p}w}wuwwfyxc{owr|zmr~w}w^Zbopkef~k{|wqqoy}\oyhoTe{{zj\gg^cpkfZttk{|zai{tsz~wuy~i_grxpld~l|z~wxxntvilpurtzo~xwxy}hX^irkh^vm{}vtrviekr^Yvzzo_`|n_`llf]fqo||hd|usv~{y{}p`eoxplaulu|zyy~toxpfprrr~wpy|vyy~lZ^gqif[oin{xvyoensgUqxwn__xsa_ild^bp|sqncvyuwwz|{vaclxrmampe}zy{~j{zbysntqxxto}u{|{w}v^Zanlf^bq^}zyd|}nuYcwwse^lg_clea\z}o~g}emzx{su~zj`frulgbva{~}{pxwnfxntqq{zto~}wxx}mY[dohdZlif~|}xhwtrXkwvpbasyd_fkc``uuzhwfq|{}qu|z|e_erqjcfv`~~|mwji~tmxzppzuqn~{zy}~{vwzjWYbldb[oij~xlxvtYiutnbcuzd_djb`cwv|iygq}}puzx}{d\bnpiefyc}p}xof|umw~powupo|wzyzsswlVV]idb]nrg~ks{_brrpdbpi``hbaaqj~imzu|x{zvx|kZ]fohgdzot~yr~~~dq}|ynqsnqwpqvyt}tt}{rorq\QVbhccf}kqwt{q\lqpjbi|sc_efacstzoriv~ptzttyr\Y_kjgfv}moykiyyyoo|wnmuopt|vx~v{vv}zyomnq`PS\gbdfs~utxzw]ippkbhyxe`dgbdqymvit~os~zstvs]X]ikhhtnqyogvwwoo|xnltpqv}uw|syttzxvmlmo_PR[eadjstzw|v_joojcl|uf_efbfxv|orjw{}os}|}vrsvoZX\ihgh{}q}szjivvumqtmmsnqzxsz~movwwskkmlXPT`dbdqnswnbnnnggsndahdelvpzmpzqyww{zyrstveXYahdgnotzyepttomx|pjpont~|xuzvpxpwuumklocRQWb_af}ryx{|cjoojfo~vhbffci}tyosnzyxq}t|{{tstwl[Y]fcdh}qtw}}gmrsplvrkopmr}w|uyxm|outtmlmpfTRU`]^cxpp|gjoolgq~{ldfhdizt}lwnxy|mrzy{urtwq^Y[ecbdvuj}y|miqqqksumlplp|st{}|k}psttpkmomZRR[][_nve{|ugonoimyridiehqtovpt{pxwvyyxruvwg[Y_d`cl{g|w{~hmpqnny}rknnmtx~u{vwukzmsrrlkmogVRT][\bunkojponjr~phfjfkxyzl|~pwz}l}tvwxuqtvtcZX_b`cqyfxzzhnnplp|zpjnlnwxywxvvqlwmqopjkmodURT\Z]exlpqkoonktrigjgm{y{m{qw{}l{uuwwtpsutdZX^b`dq{hy{~imnpmoz|qjnmnvx~txt}t~shykomniikmfWRR[Z]exsmykonokr}ulfkhmywsvst~yqrzruttoqsti\XZb`dnpxz~pjmmmkuulknlttrwvw{fqmklkjeijk]SQW]]drnomnommx}qijkkuxqyryvzj~qrqrnnqso_YW_ack}|p~{zzjlkmkq|xoinlq~{zwss|ws|ji~rhjhidgikaURT]]dqs~tmnnnmwsjjllu{r~|rxw}}jzrqpqnlprpaZW^bcl|qzz}kljmkq{ypjnmr{{vrr{urzig|qghggcfhkaURU]]fsttonnnnyskkmnyyryryuyi}pqopllpro`ZX`aeo|s|~zyjkjljr}vmimlt~vx~ps}ptwcl|lggfecgij]URX]_iyprpnpns}{qjnlrz|utu}zxonyppnokoqsi]Y[aajwqrnkjjny}rhggl}uudp~ppz|ueuwyztmoswsgcdllr}zzy|o|wwoijlnq~{ovypn_oxu}~~nx}zuvy|vhb`gfkuutwszrrruv}spmjx|hpspyouqgxukhig[XXabiuvr~}t~zvmmnrtunjerlptowz}ixuy|~}rljprv~qtlotkyocccghs~xnhifpon|ulr}w|zcixorzpgchjlvp~|tgd^f{xyn`dlz}mpvcbwpkorvuxyzpfbchhq}m~}~|v|{}wrpruywvtvy}|~tzjZlqjs{ne`c`dnwifxp{ttzs}xznmlpr|zohgeq|ywou{nv|{}~vquxyxsrz~t|{ieadelwxnffdiyvyjtylnvvt{i`uvouzqkinmtux~{y{{xjba`o~{mchq}wjsr^exolnrvvzz{ogcfiku~lz|zv}~}xspsu{vutxz{zwpvgXktov|sjdgeiszkgzowttxs|w~qnlpqzzofgfsw{ps{zro~zutyyz{zt|||vtiedgit}sidefuynly~rkpy{nur^f{xx|zqlmpq|r{wvwy|nb`bj}~zjfku~~ojtk[kzrsruvx{|zoiejkq|ynwz{~}|yuquw|tvvywy|jlo]Zu{{skhkir{|hqwpy}uy}zs|y{qmmpr|tifhmzxvpvx}kwytwy|sxv~{~wojehipzwmefgrxxjqwkmt|lpud_y|vposs}u~{ustu}{ncaem}|mhlu~|njtk[k|uusvwy}}|qkglms~wnuw{}|zurvw{tvwytw|tfmm[_y|}vonooyzg{sq{xux~uxwvqlnpv{pghj{uxwjmr}~puyf^x{~~}smlqr}s}z|s{}~wv|~xssuyymhenvlm{ymmt~ku~tv}xtqvw{{|}zyr{v}tpptytjejom{tqw{yubqxsosu}}{|pk{{tlgyvp|spnsv~rkknup{~rnt~~zu`k~ysotu|zuz{{tx~x}|{sfbcxwlr||}yshdjtur|tak~|}~{uostyzrzxzumr{tvxtptwypqqzy~w}v__vz|rjikmx}te{rnw~{wmkpy|ryt|ysort|tiggry{zorxzrl~}zy|~xtljs~{ysr}slfgjpz~tjgfl}ysq}{ont}uw}o_o~|xsww~wv{{vx}~|x{}zmdcev{ymeip{~tnyubezyxx|~vqrtx}nzt{{wnntzx~}wrtw~uts|}~yztxyg[o{|}uprqx{in{moz|}|xqimq|~wr|uwrosvzoiik|yvpt{{nq~v~uz{{vslmu{}tvunhilr{|sihhpyrq}zoot}sv|m_p{vyzwvzywz~~}wzzxmdehy}~{qgjoy~|tmwweav}}}ytswxozrs||}{xspw~|zy|vsw{ytvz{}wzsnvo^c|{tstuvgztlqzy|ywposxzrwwx~wqpsw~tkilv}w~srv~y|zlx~|tuntwuwuuryxszwpjlnu|ypikm{|pq~~vmpu~~vnvwgczzx|}s}xy|ytvw~|rifktzznimr{~xnnxqai~xtvx|xmvnsyx{zzvyxz{tvy}vwz|{uvy|sjqse`xzvxw{irzlmvwzyxtqtw~ystzuzspsv}vmlpyw~~trv|y|{mx~yqrjpttwvwu{zu{~tmop|xy}qt{rox|yuom|xtjz{rx}yy{zs{us}sprw{stu~zwwvhp{{}yvr~um~z{zu|uu~zuvv}~z~{p{yvv~xxzzyr{~vlpy|u|ymz{vpxz}khqvz}|xrssy}{vv}q}}xyzzwy|z}u{}sjly|txzlu}xyy}z|w}}}}{kt{}yrnpsqzvlr}{tkjrz}vz|mtzsssz~|~v|~vuty}|xwu~wzypgfq~zyyhl~}ww{{wrstyvr{rx~~vtsw{{vs~nu~||{y{|{}tv~uou}ywzspqsy||~{qmlmruytqmxoq|zxtwzxyz|xtq{woglu{vn~|~x}}|{{uzqkxyzz~zww{yn}pir{}~xqghnw{u}xlv~~ytuu|w|z~vutx{{xxv}uu~yqhdlwnlzx{~}xssuxwotv~wtstx{yur}pp|||z}}~~xws}xprxu}wrss|v|~xpompswupmqwlw|zwuz}}y|~v~{pr|~zsjgox~rr}}x}~|{{|wr{mlyz|{|{{xp~oirz{|vogioxzvxlx}xsuv~x}z~wvtwz~~ywxu~~spy{{wpienwtm}z}yusvx{o}vrz}zttrwx|ytpvtly~x~su{x{{qr~wsxyqxy|xvuy{~ytmq|qzzyssv{~~|rpdl}zummpu|}{zv~zuzxv{}ywvx~zurqw~y}ovphpuyytoimpw|zxxtky|{zv}uuzxqmkt{u}~vvjlvz~{xrqw|~wz~w~}}}zx{~unzmoyzvstwy|wvw~zwx}vr~qlu}~yqrty||q~~{z}~wjw|uy{zrlrvnz}xyz|qs|~zullry}{ts~z||xsv|~~zruwwvwwqoo~|py|}w~vjfpv|~zsvw~}{~xq{pzy}tt{}{utmkn}zw|{}vtox}xqsv}}lrxvuz}znxzt{~|vqsty{~ztryzs}{y|{nowy}zvopsx}{{lq{{~~|zvspw|{qlowlu~~{vy{|z~y|onx{}ysqtx~}yv}}no}us}sxxxx{~xw{|zzzwryz|ytlhkmsuzxww~{lk|}rqwx{{}yvoqsy~yvxsx|~zv~}vty}~{{khy~yz|rn{opuw{ywpppswzzsprsy~~|}}|yqwz~|wrtv{~{zwqvzvzz|yvomos{{xxwt~~wvx||}}wuwpv|~zunpsx|zy{uit{p||v{~~ysttz~{{z}zy{}|zy~}~ytllnqwy{utt~uhm~}ru~suwxzxuprrw|yx{u{}|{v}yuyzzx}pjyrj{|pnux}{yronotwytrswu}|}~z{wy~{voprv{|}|pyu~vxxyyuqlnov||{~qx}z|~|~|ttpvx{yupnsv|~|xx~}njzyrxv{|~xvvw{~zwy}|{|{|xy~|woopswyytsvvip~qu}suwyzwtnppty}}yzv{zy~~xtwx}~yx|}merukyunrsvvtpmopuwzvrs}{s}~~{}|zv|||xrqtv{}{yzsryttorrvutqqsv||z{yt|z{}zw|qrwy|yuopruy{|vvxxknrsxx{|~|wxxz|~~xx}z|z|}~x{|}}wqlnoux{ytuyqhtzq|zqssvwusqtuz|{wx}u~}yv{}|wuxy|}~xuu|viizqn~rorswvuqqqrtuvppuxv}~~~wy}~{wqstx|~~yz~yox}rzyopprsrqosu{~{|t||~~}}wuqvx{yvportxz{vtv~wjj|ttvtwx|{{xyyz}~}xx~z{}z}y{}~~ytnpquvxursy~qjwvn|vorrvwvssuvz|zx{|v~xx|~|yrstwyzzuuwrgoxmvzprruwvsprpsuwtqt}{rz~{{w{{~{wrrtw{}~zz}~qstv~qooqsrqorsw{~z|w{}u~vptvzzwrpssxy{vtv~zljzutwuwy}|zvvuvy{{wyz|~{}~~y{{uqsswxyutv~|njxsqtpqrutsoopsw{}z{yz{x{|~{vruuxyzvsu|ykfttptoqrvuuppopruvrtzvux}y|}{wrtuxz|zwzxp{wp~vnpptssomnotx}{|yvv~ttwxzwtnpqtvxxtv{tip~zr|vww{|{xtusuwzxw|v~~~wv|~zttuvyyzuvzymn}|qtsqqsvtsnonpsxyw{y|xwz{~~{vsuuxxzvsv}zmfswrxqsswvvqonmpqursyyt~}vw|{~}ytuuwz{{wzzot{qx|ponprqokmlptz{{{yt~ztvwzyvqorrvvxttw{nivwsztuvzzzvutsuwzwx~|w~}wx~}{uuuwxyyuw|xmp~yot~rpqrutsopoqtxyx|y{xxyz||ytqsruvwtru|{mfqyr|ssruvvsppnqrursx|szzwz||}zutvvyz|xx}sp}sptmmmppqnnoptw{y|{wvvtvwzwupqrsuvvrtyvjl{~tvxttvyyxtustvxyvzxw}}x~~}ytvvxxywuxtksunyzonmprrqprruw{yyx}~z}wyx{yvqpqqsstppt}vjhwutxqrrvvvrrrqsturu|wt}z}|{||~{xstuwxzyvzyouvmvznlknpqporrux{{{z~zvztvuxwtpoqrtuvrsxxljxuvytttxxxtuttuwwtxwu~~}y~~~}zuwvxyzwuztlttn{yonmqrrqprqtvzxzxzz{wxxzxuppqqsssoqw~rgk{|t{urqsuutqrprrutsytxzx{||~|zutvvxxyvx~}qp}xnq~qljkoopnppruy{z}}{v~~vvvxxuqoqqsturrw{njuuu{tttwwwttsrtuvtxwu~zv~~~zvxwyy{xw|tmw|qpwponqrropporuxw|}z|v|xxwxyvroqqrstqpu|zmfp}yv}utsvvvrrqoprtrv~yu}ytz|||}~|yuwwxyzxw|wousnzxnlknoomlmlorvv{}}uvzwwwywuprrstutrv|ujmz{t}wusuwwurspqrttu|uyztt}~yyzz{{{xz}qo{yptupnnqqqnomnpsuv}||zu}xxwxyvrpqqrrsppu}zngp|zwwusvwwtrqopqsrv~{t{zsv~{|||zvwwxyyyw{{pr~unu}qmkloonlmkmosux~xt~~wwvxxvrqsrtturtz{oiswv~vtsvvvssropqtrw{t{xsu}~}yzzz{{{x|{pq}wputpmnqqqnomnpsuv~||yu}yxvxxuroqpqqrppv}ynfn{{wxusuvvtrrpqqtsv~~uy|vu||{~}{wvwwxxyvy~snyxoo~umkjmnomnnnpsww}}}wx|xwvxvtpqrrsssqu|vllx|tx{urruuursqpqstsy{~z}{|yxv}zz{|~~}z|zzz}|xw{}zwz~{yuv|~{y{z|~~}~~}|{z|{|wrsuxy|~zvz~zy~}yyuw{{vvy}~}~}|~~}}}|xvzzuwz|}z{|xy~}vruuy{|{zzx|}}|{~~~}}vz~|zvyyz{zwsx|~x|}}}~z||}}~~}{xyz|{{~wz|wy}||z{zyyy}~}xw|y~uwzzxxzz}yx{vzwx~}xuz|~zwtrx{~~z{~wv|xyztz|xwy|}~|~}~~}}|~{zy}~}~~||xwvvyvsszswsw}yz}{x~~}}|zvy~|y~{y~yyu{~z{~~}{}|{x{|~|~zy|}{||wwz|}yxy}}z||}~~{w}yyyy{~z{{x}zwuz}zz{~~~}z{vx||~{{xrvu~~~|{{~{y{wyvxyx{ywu{}~{~~~}~~|}|}~~{z~yzuxwtwuvsrwzy|}}~~y{|~|{{~zvzy~~~}}}wy|}}~}|}{||xy~z{{~~}yz}}{~|x{x{~}{yuv}{z{zz}|x||||w{yyxz|{yx}yxx||}}z~|~}~zuvy{|{~}}}zuu}~~|~~|yyxwuvvzxyw|||~}}v{}~~|{}}}|~{~|y|xxw{wvxsrruwz~}wx~~xz|~}{|wvv|{~~|~y{~~~z{zw}y|yzz}}{zy}}|||zz~}y|}zwvyz{zyx}z|x}|zy}}~~{z|{{yz}}|z{}{{z~~z~|{vts|~~}|zx{|~~||x{x{zzvx{vxw|{~~yy~|~~x~~{|~{x~}}{v~zwwwxvvuyzz~~}y}~~~~{{z||ws|}{{~|~~}~z{~y|}{xyzxy|{{ywz~|vx}xyyvxy}z||z{{{{xy~~}z{~}{{{{|{}yx|}x|~{}y~~zxusv||{}{zy}|}}|{{}||{w}|yzx|uvxz}z~{{~~y|{x{~|~~}|y}{}~~|~{~{zx|xyxxww|~{{z{~~xy~zxxtxzz{{~{y~~}}|~{z{|yuyx|{{|vx~~{zz}~yutwzvy{{}y}}z{|y}~~~zz~yyy}{wz{|~z~||wzyxxtv||zw}~~}}~~{z}}{|yzyyyxxyyuw|}~|{|y}}}zz{~|{~}|x|~~}}~z{}}vyyvyw}yy~{x{}z|~wzuwwz}y}~~|y|}~~}{~}yxxywwy{~{zxx{|yy{}~~zxx{ywyz{z{}}|}{x{}|~~{|}}|x{}}{}}}wzzy~vsuuuuy|~|}z~~}~z}zz|{{wzzvxxyux~{zy|y|zz}}}{|~}zz|~{}}wzwyyy{}~~}yuv}~}y~zwyvyuxy||y~{}}zz~}yx{zvuwuy{yyxz~~yw}z{wvyyxxz|{z}}}~~z}{}~~~}}}z||z|{~}v|~z{{}wtsxyyz{z~}{|~{}~{x~{}wxzwvsz{{|~{wxzz|~}zyy}z{|~}}}|y}~}zz}~|~||zx{|{{~|~zy}|yz~}|wzwxyxxz~~}{}~~yz||{|vvwv}z{ws{~}{|zywt{yzzw{zzy{~zw{~||~{|}yyz||z|z}~vx{~zyzytsuvvx~}}~~|z}|y}|}{yyyzxxx{|~}wv|~~z~~w{z}{|||~~~~|z{|}{{}}|||~}{}}zyx|}}}zw{|~yw}|vsrvx|{~}~~{}|~|~{|{zzy|{stxzxy{}|}|x}|x{uzzvuxy{{}|xx}~}}}|zy|yxz{~|yz~{zxx}~|zvt{yy|}}~}}~}|~z{~}||}{wy~wysv|wy{~{u|~~|wy}{z~{|{xy~}}||}}~}~|}||zu|~y{|vx}{xy{|{zvwy|zz}~z{~~}|}yww{{utuwxzzz|yxx|}~||xyzz}{|{||{|}{zx~|z}~}|{}~|{xw{~zy}|{}|xz|{yzxtwv{{|~~}{~{{{|x|yyvtxyz{{{}zx}~~}|wyz|~|~{|~}}{yz{~|~~y||~}}~xz}{z{|vx~z~{y|~|ytt{~|y|}}||~{}|{z}{yx{yuuwwwyy~zxt|~~||wwz||xx{}{}yx~}~~~~}zzz{~|zy~}~~v{~~zxxz|zz|vwsu{zxz~}~}|}}x|}w{yutuwy{~}~zwz}{~{wv{{y|y~|~{|~||~~|~|}|~~~~~~yz}}|}~}yx{~~{|~}z}}zuuwyzyyy~~~}{}||{{yz{{wvvxt|||ytsy~}~xuw}{{yy{~~{}{}}}|~}~|~{~~}z|{z|~}w|z~}zy{y~~xystxyzxyv}|~{{y~yzy{xwvx{z~}|xx{~}zt|zzzx|}~~{}}yx{}}|~{~|~~{{~}}|y|}~~yy{}{yz|}}zwwyy{ux~|~}z~|}}~}{xxwzwtwuw~{|}zxuwz~|zx{{z{||}z}~~|~~||~}}}{~}}}{}}{y{{}~}wz}~}~z{ysuvxzw{~yvw{~~|zxwuywxyttwvsvtvwv}~~y}|wuuvuuwuxzvx{xwzy|~|z||z}v}|wuvyy||}{uy~|}~|~~}|~{|z~wtvy|z}~{}yuxywz}|~~~{}~~{{}~}}|zwx{{ty}~}z~|{}|~|x{~wsuuw}{~|y}~}zw{}{zvvyvx||~uwy||x}}vy~zwz|}}}}{yuxzx|}zv{}}{{|vz~}}|}}|~zuxyzyz}|{~}uww{{z~|~~}zww}}xvwuw{yy|y||ux}}~v{~~}|y|}~~}{{{z|tx|~}yz}|~~~xw}~|}{|}{~}~zzwz~xyzz}|~ywxxx|~|~{{x}}tw}{~zz{~{|~}w||w{~~~~{yw~yy}}{|z}~~}~vw}}x{~~{}~xy|{|syzty~{w{xyz}{z}{}|yw}xy~|y~{x{{~|}|yy{z}}~|}wx|}~~{}}~z|{}{}}zx~}zx}~|z|{~}z}z{~vx}yz}zyvx{~}|{z{vx~z~|y~{~}y|}y|{v|yw|~|zz}~z{{|z{|}|~~|wy}|}w|{||x{}}ytzxv{~zy{xzz}z~~}|}zyx}~yzz{~yz{{~||w{~z|~}~~}xyz|z}~z~{{}|{x~~|y}y}}}}}|~{~~vy}zz~}zzxxz~}|{{|ww~}z}}~{}|~y}~z{~}vz{w{}~}|y~}y{~z|z}}~}~~~zu{{~yw|~~|z~}vx{wx~~w|zzz|}{~}|}|{xz}y|}y}}x{{}}~~|{w|}y}~~~~}~x{z{z}}|||}~|zw}}|y~z~}~~~}~{xy}{z~}zzzyz}}|z{~}yv}}{{~}}|}~{}~|{}~wy{wy|~}z{}z~~{~~z}}|}|}|vw|z~|w}|~{}}|w{zw|~{x~{zz~|~}}}~|{x}|y|}z{y{{}~|~yx}{y~}}}w|}z|{~~}~}~~~~~}{yv}}|{~}}~~~~|y{~zz|y{{yy}}{z|~yw~}z}}|}}|~~{{|~}xz{w{}~}y}}z}{~{}~}~~~~{{}}ztxz{~{y~|~~{z}yx~x{|z||}}~~|zy~}{}}{}~z{{~~}|{|x{}y|~~~}yz~~{|{~}~}~~~}}}}}{xt{}~}|}|z{{z|z{}zy|~|z|~yw~}{}}|}~}~~{{{}}x{{w|}}y~}z}~}~|~~~~~~|}z{~|wtzy}~}z}~~~{}}x}~|x{z~~~~}}}{w||y|}{|{|}}}z}yy}zy~}~{x~~|~~}}~~~||~}}}|}{xty}}}|||{|{{|z|~zy|~|{|~xx~}~{}{}~~{{{~}y|{x~~}|y~~|}~~~}~~}}}||{z{{tuzy}~~{z}~~~|}z{z~{{~~}}}zw~~}~{|}|||}~}|z~}xz}xz~}~~~yz~}~|}|~~~~|~|}|}||}{wtz{}|||}|}|}}{|{y|~~|{}~xx}|~|~{|~|{{|~y||x}~|}x}~{}}}}~}~}~|~{|~|z{}|wsyy{}}|z}~~{~~y}}{}~~}|xz}z}}~|~{}~~}zz|x||x~}~~~x|~~}~|{~~~}~}|{|{~~}|{}zvtz{||~}}}}}}~|||y{~~||}yx}|~~}|{~|{z{z|~y}{}y{{~~~~}~||{zz}}}|z{{~ytvyy||~{}~~~~||y|{~~~~zw|~~z|}~}~|~~}|y|zy~{z~~}~}x}}~}}{~}~}~z{{z~}~~}|{{}yvtzz}}}}}~{}{y{}}|}~~yy}|~~~}{{~|zy{{~{|}y|{}~~~~|~||~~z}yy|||~{zyz{}xtxyz|~~|~~z|||~~}yx~~~}~~|}}}}~~|zy}y|z~}~}z{~}~}{|}~|~~{y{z|||}|{{z}zvtyz|~~~}~~~|||zz~}}|}~zy}|~~~~~{z}|zy{{|||y}|}}~~~{}}~~}|{{xx|{||zyzz|{vuyx{|~}~}z~|}~~{x|~~~{||}}}}|x}{z||~}}|z}|~~}{}~}|}~~|x~|y{|{~||{|z}{wtxz{}~~}~}}}zz~|~~}|}~zy}|~}~~{z}{zy||}~|~|y~~}}}}{|~}~~z|{xx{y{{yyzz~zuvyx{{~}~~~}{~|zx}}~|||~~~|{y~~z{{}}}}{{~|~~~{{~}}{~~~~~{x|y{{{}|{{{z~{vtxy{|~}~~}~~{{~|~~}|~~zz}|}}~{z||zy{|}~{}y}~|}|~~~}~{~{wx{ytu{z{}||~}|z||~|z{w||~~}}~~|{}{w||~}~{zy}~z}}~{|}}}|~|}{{}~xx~~|}~}z}}~~|}z{~}wx~~~~}|{}}}~{zxxvyx{{{~zxz|zux}|~~~}~}|}~~{}{{}{w{~~~~~}}~|{yxxzx~{x{{wxz|wuyzx~~~~|~||{~x{~}~~~{}~{z~~~~|}~~}~~|~~|zx|zyz~}yy|yw|}~~}}}zxy|{y~||uy{}~}{}}|~~{z}~{}}}}|~~}~yy}z{||z|~yy{|~}}|yxxz}xz}~}vvz|||{~z{~}|z|~|{|~~}{z~}~}{x|}{|~~zz}}y{z}~}~}zzy{~|x{}{{uy}}|z{y~}|}~}}|~}~|~~}y~}~{|~|~yz~}{|}yxz}{|z{}~~z|{{~yz||}~wy}|yz}~{||}}||~{{}{{~|{z~~|z}zxx{{|{y}{||{~{z{~}|yy}~y~}{~{|{|~}~{}~~z~{{}|~|y~|z|zxwz{||x~~~|}~{~}zz}~|zy}z|}{~|~{{{~~{~~z~||~|~}z~|y|zxwy{{|x~~~}~~{~}zz|~|{z}{|}{~|~{{{}~{~~z~}}}|z|y|zywyz|{x}~|~~{}zy~}}zz}z}|}|~~{{{}~|~~~{}}~~|{{z}yywzz|zx}~|}{|zy|~zz~z~{|}~{{{||~~~{}~~}{|z}yywz{|yx}|~}{|zy|~zz~z}{~|}~{{{~|~~|}}~{}~~~xz~~|}|}||}z|yxzxyzy|~~~|~}{|}zx|{{y}~zxuwyyyz{~~|{~zz~}{zu|{~~~}z|}}}|{|~{x|}x}{~}}yz}|}~~zwu{~~~|{~||{}}{xxv|{}~~w~x{{|}~|zz~y~{{|}z~|z}~~~vwzz{~~{{{xzywwxy~}}yyzu|~zzx||}{}~~y~~|z|~~|~}}~}|{xy|}{z}{{{}~zzzvsx{~xzxt{|{zz~}{yx|~}}||~||~~z}}{{{~}{z|||~{wxzxxy{z|~yzyxzvx{x}}ww}~~}}}~}y~}|}~}yw|{{{}}|{}||wvwy~z{}yy}~~{{w}z|}~~~|||{}z}~zw~~}z|{|}z}~}}{}}}~~}{}||{yzz~z|zzwyxz{||}xxx|~{|~}~z|{{}~~z||~}}}z{|~zvxxx{z}|zw|{zzxv||{{ww{x}||~||~}|y~}~}z|~}{~zvv}{}~xxuwy~zyxz}|{w|}|z{}}{}|~~z{{~~~~}y~||{}}||~|{}}yv{||}{|zwxy||~|{y|yz}}{}}~~}}z}~~}zx~zz}{}}z|}y}yz|zyyyyzx{~}y{|y||~}w{}}}|~~y{~|~|y~~z~{~~|}}~z}{|}|||xuw{}xx{zz}~x~}~|zz|~~~||}~~~{y~}~~}|{{}{~}x|}y~~|||yz|wv{{~~}|~|z~~~}{}{~}{|~}~|{~~}|z~|y}|{y}{|~z~|~|{~xxx{{{}~|~|{|~~}{}~|x}~yy}~|{~{|}~~~~}{{||xy}}|uz}x~}{~yw{~}|{~~}|~z~{{y~}|w~{z}~|~~~|{yzyv|xx}wwx}|yvz{||~}{|{~~zy~z~~xzx}~{{}~~~{|xwzy{{x~zwu}|~}|xsvvy|{{~}|~|{|w{~z{|{{|{{}}z||{~zsxzx~y}{y{~{|wutvv{~~y{~{}{{z~}xw}{y~}{~{{|~~}{suzxz}x}yw~~yyuvux|zx|}~}z~}||wz~|}}z{z|~}|}yux{y}{y~ywx|~{wvxvz~~xz|||z|}~{w}|~}z|}{|~|}~~~||yu{{{y{}zy|~}|yuxxy|~~|z|~}{z{~~|{wy|}{|{~|~~|~{ux|{}x}yx~}}zvvyw{|}yy}}}{y~~~|}~{yv}}}}}~||}~~~~{~{wu||}x|}yx}~|{xvzwz||~zz}~}|z}~{}|{w||}{~|}|~~~}}|xt{{|z{|yz~}}zvywx}~~}zz~}|z|~~{|~{wx~}~{~|~|}x|}{}{{|~}}}{~}}}~x{zx{|~zz|yy|~}}|xz||}~{x{|}|yy|z}|z~~}|}}{~{~~~~}~~y|{z}}{{}z{z|{z~~~{{}z|~~~}zzz~x{}yy{|~}{y}y~~{}|}|}wyyzyy|z{z~||}~||yw||~{v||yy{|~|zy{x~~}~~|{zzzz}}}|y{{{}|}}x{|z{y{z{}}~~|~{~{yzz{|||}wu}~~{}{~{}}y|~{yz~zw|~}{~|x{}~||w~~}~~~~~}}xrt}~~~~xy|x|{|}|xvv}}|x|xxu|~|z{v~}~|yty|xxz{{~{~zzvy}}|}{}z}|{}~zxy{~zy{vvyy{}}yzwy{}|{|{yz}}z{zu|}z}z~}}~}|}xytsw|y}zyyt{{}zzyw}{~{~~~|~~zz|zzwy~}}y~|{}}}~}~~{~~|zx}ytuux{y|vzzy}{z|}y~|z|}|~{wy~~{zww~|~}y{|~~|x{wu}}}zzx~~~y~}|{~{||zzzvw{|~~}yyx||~{}}}|}~}~~~~~yy||zyx}~}~}}y||~y~~}}zy|{|~{}}}|||}yz~~~zyz}|~}||z}}~}}|yz~~~y{{~}y||xuv~|~~~|~}{y{{xz{{|{{||~{}~}~}|yy{y{|}{y{}~{}wz|{{~~|z||~}~{~~|~}zx{~{x~{}~|w}~~y|~}~}~yz}{yy|x|xy{{{zxyz~|}|}{|~z|}z{}xz}}~{~~}}|||||z{{zzy|~}z|}~}~}{uw{~}{~|~|xvvwz||~~}z|}~}|}||~}~~yz}{|zv}~xxw}~zyvxvy}{}~~~}z|{}~}|~}{|||yy|~~}|}}~yy|~}}}yz|yy}|y{{z}~{y}~|~}{|}}{}~|yz|~|{}|~{}}}~{{yxyzyzy}~}}~~x|}~z~zuyy}yz|}}}~~z~||{y}|{}~~~zy{|~}~~~}|}|~{zy|~{x~~|}}xvvwv{|}{~~{|~|yy~~|||~}{}{}zx}}z{~{{xyywy~~z~}|zx~y||}z~~y{{|~z{}zyzz}~~}|{|}~~}zw}}z{}}{~~~}}}zywx{|{}~|{~}~z|~~}~|{z|}{~|xy{}}}~~~~{{~|zxz{{~}~~}z{xv~}{|zw|~zzz{}zxxz{{~|}}~z||~~~}|{~{|zwxxx|~z|}}y}}y{}{}~{wx}yz}|wy}~~}{{}}}~}~~z~}~}|~}|zz|~|{{}~~yzyxz||}~}}~~}~~}z}~{~~|~{{~}{{}}|}|}~~~~|{{z}zyz}~|~~||{{x{}}}}}}~yy}~}~}{yz{}~{|~{y~~z{}}|zz|~~~||y|}xz}~{wy~~}|{z|yz}{~}~}yz}~~}{{}}}}~{~}~}||{}{}}{z~{xwz}|||}~~~|{}~{~~~{}z{~}}}}~}|z~~~}~~~|{}{y}}|~|}}}~~~~|yw~}~}}{}~~z{~~~}||~}|~}~}}{|z}~}||~|||}~{yz~~~~}}}}}~~}}|z{~}}~}||z{~}z}{|{}~~|y}}||~}y|~~}}~z~~zy{{}~~|z{}{}~~~|}|}|}}}~~}~|}~}|{|~~|}}}}~}z}|}{}}yw|~}z||}~~~}zzz|~|zz}||}~yz~||~}~}z|~}~}|~}}~}|}|||}}~~{y~|~zzx{}||x{}||}{{|}}{z}~{~}~~z|~}~~~z|{||{}~||}|~}||{}|~{}||}~~zyy|~z{|}{}~}~}}|y|}|}{y~~{||}}~~~}|zy}~~}|{}}|}~|{~~~~~~}|}~}{{~}}}||}~}}|||}~|{}~~~|{y|~~}|{}|z}~~~~{|~}|~}}}}{}y{||zyz}|zy{~~~}{}}~~{{~~{x|~|{~}||{|}~~|||}}|}~}}zz~~zz{}~~}~|}}~~}{{~~|{~}}~}}}{|{|~~{{~~z~~||~~}~|}~~}~|}~~~~}~~~~{z~}~}|}~~}y{~~|}~~}|{~||~}|}~}}}|{}{{|}}~~}~{|~z}}{|}}~|}|}~{~|||z{~~~||~}}~}{}~{y{}|||}~}zw{~}|{z{~}~}|~~|z}}}~~~~}~||~}z|~~~~~~~{|}|~~~~}|{z}{||}~~~}{|||~}~}~~|{}~~~~|{~~~|~~~}~}}}}|}}zz}}|}||~}}||}}~~{{yz}~|zz|~|y{}~}{~~|}~|}~|}|{}||}}~zy|}yyz{}~~~}}~~{|}}~}~~}|}~|y{~~|{}~~|z{~{|~|{{~~}zy{|~~|}~~~~~~~~}z|~}|~~~}{}~~~|~~|z{{||{}}|yy{|{{|}~{|}{~|~|||{}}{|~}}||~~~}~~~}|{|~~~}}}ww~~|}|{yz}~~|||~}|~|{|~{x{~}}}~~}~}|~~|{}~~~|~~||~}}~}}}|~}}}}||z|{~||{{}}wz}~|}zz{z{|~}zzz||||z{}~}|~~}y{}z}~}|{z|}~|}{~~~~|~~~wux|~y{}{|{}{}|}|~~{yxz~~{}}{}}~}|~}x}{~}~~~|~~}z{zxy|~~~zzx{{~}}}zy|y~}}~{|{{}|~~|{}|~zxv{|w||zw{{}{|wxz|}{{z{z|~|zw{~{}|zy~}~yxy}}{zyz}z{}~{{~z{||{y|}xy}{yz{}~{yyz{}|{~}{}{}~~~{x{~|z|}}~|yty~~zz{~{z{}~{~~}||}{yzy~{~~z~~}~||~}{zxvy{y{z}{{z}~|||{}}}~}~}~~}xyz|{{{~}~~}|~}{z{{|xsuvz}~~||}~~||zzzy{~}y||yy~z|~}}}}}}}{}{~}z}~}|{|zwxv{}~y}}z}|wxw||}|}||{}~~|{~z}}}zwvvz~}~|~~~}|}zuxzyx~}}~}|x{|}{}{z||{}{zz~~zxzz|{ywz~~~~~}}||~|~~wy{}}~~}}z}yz|z|~|{wy{~}{xz|z}}{~~||}~}}{|~y{}xvutwz}{|x|z}{~}{~~|}~}||xy}|~||~}z}}~}{vusuzy{|}}~~~|{~{||}~|zw|}z}|}yyy{|}{{}}~}}~{zwux{xvvv}~~|~{zy{w}{vy~xxvw}{~}z}zx|z~{}wz|{}~}|~}|y}z~~~|}y{|y~|zxyx|~|yy~~zxww{z~~z{yw{}}{yyy{|{~{{}|~y|y~}}zz~~x}zx{x|~z{~zzwy{y|}{~vy}{}y{xy}{}}||}|{~~{~}z}}}}y{{~|y}{{{}z}~x|~}xwwzz}~~|zwz}~~}{yyy|z}~~|||}~~y~}y}~}||{y|~{x|yz{x~{y|~xzw{||}}zzuy||}{xz|{}~{}}|~~z}|}~~|||xy|}|x|zx{{}}yz}zyx{z{~~}|}vx|}}|zyy{{z}~{{|{|~~{}{|}|}|yw{~~z~}z{z|~yzzzyz{}|~~y}vw|}|}}|yx{|z~~{z}}}}{|~zz{}{{{|yz|~||~|{z||{x~{yy{{|~~}y{ywz}~{yxz}{}~~~|}||~|z~||z|z{zyyx{~||}{y|{}}y|zz{|z}~{~|}wx}}}{xyz|z}~|{~z}}}y|}yzz|z{yyyz}}}~}zz||~~|y~}zy{}|~}}{}ywy}|||ywz}|{z||z~}~}~y}zyz{zy|{zxz|~|y{}|~zy{y{~|}~~{~~y}yxy~|}~{yvy{|~~z~~{z~}~{x~{zy{y{{zxz|~~~y}}|z}|y}}{|z{z{wyz}z~}zww|~|~~~{z}{}}|}~x}}zxzyx{xzyz~{{~~{z}zy~{}~{|x}yxx}}}~{zyz}}}}{~{z}{}~zy~zyxzwzyyyy}~~z~~|y}~|y|}{|zz{{wy|~{~|{yy}|{{{z~{~~|w}zyvzxxywyy{{}~~~yz}z{{{z|y|yyz~{~|{yx|{~~}yy{}~}xz{tz{|zyywz{|~}~}~~|zz~{{~~xywwy{~}{{x}|{~~~~zz~xyy|}|z}}}}ruy|}~}xz|||}{yz}xwy{}|wtywvvvzzxv{||z|}||~|{z{zzvx~uvxxz|{yz||}|{|zxz}~||}{}ywy{w{y|z~~}z}z~|ttv|||{xuw{}~||~}xw}z~~{zv|ww{}{xvyv|~{z|~|{}~wvxvxz}{}zyuw|~|~}~|xux}{|~}}~{yx~zzz{~}zz|z}x|~{yx}z{~{~z{|vz{vxz}yx{zw|~}}~y{{w{|||yzzyx~}{xx{~{|z{}{yxy~|~}~|{~zu{zvx{vuuw~~~{y{~xv}{{z~}zsxz}~~{~}~}{~zw{yzz~|y{u{xywyyzzyyz}z{zyw}}{|z~|~{wz}yzx{|~{w|y{}~|x~}|xz{zyytyywx|~xvtz}~|yyy~z}z{}y}~zvz{vx{x|~|zxz}{}~~z{vw{zuuyyyy|}|y{}}zxw|}{|w~|vyy}{zx{|~}}~{yw~|zy~|z}}|yyyvxxzxyxz{y|x~~}z|~zz}{vxwwxy{}wxw~~yy}z}~}yz~~~z~zuzzvw|zvx~zy{y~~y||zvzv{|}|wyx|}|y{}yyyzw}}~zyzwyyuxxzywy}~~|}~}y}{zwyz~}}z|{|}wxwz|{wz}|}~~zy~{|zv}xzvrsvwyyy}y|~~~|}~{}z}~~||yx~|vy}~{yz}}{~~{yyz{|{yutxz}}{zxyx{|{z{{}~}~}~~}zxyx{~|~{{|}{~~|y|~|y{wxyuw{zzy~{{~y~~~}|{z}}}x}|vwww~~}||}|~}|z||{~}~~}|~~}z}}~{vy}}~~|||z}||~~}}~zzz{|}~~}~~~}~|}y|~~|yzzwwwtuyz|xwvz|{{zwyxyzz||||}{}}}~|z{}|{{~~~}~}~}|{~~}{zz|{}{}~~~~}||{|~~~zyz{|{{z{|}yzwwyzz{{zyy~~yz||{}~{|~~{{{{|~~zww|{|{}}~~~~{y}|{}{~xx~}~|}{zxwx{}~|{vxzxxyyxy{zy|zxz||}}~{||}y|{|}}~~}}~|{}~~}{{||{|}~{~}}}}~{x}~~}|{{|~}}y{{{zyy{z{|zzyy{{~{w{|{}{y~~}{~||}~~zxz}z{|~~|{|{}}|~~|{|~zv|}}~|zzzyy}~{yw{|{z|zz{{{{}zz|~||~}~{{}|}|~}z|~}}|}~{}~~}}{~}z{{}{||y}~|}~{}|z~~~|}|~|{y|}{|}zzy{}{}z{~}|z{{~~zx}|{z~{|||~~|wz}|{}~}~~|}}~}}{|~}~|~}~}~{z|~~y{~|}{|{|{zyx{||}{zzz}|{{z}~}|}~~{}}}|~}|}~~zy|}~||}{|}|~|}|}|{|~}~{|~}~~}z|||~}|{|~||y|}}~{{zzz{{z}}~~{y|}}~~z{|{{||z||~~~}}zwz~~}~~}~~}~}|}}}}~~}||yz~{{~}}}}{z{|~}|{x{{|~|{{{{||||{z~}}{~}}}~}~~~zw{~}}}~~}}{~~||{||}|}}~~}z|~|}~~}|~~~~|{~~|{{{||}}}~}y{|}~|{}~{{z~|{|}~}{vx|}}~~~~~}~~}}}}|{~~}|}zz}{y~~~}|}}~~~|{|}~}|{|||}}}{~|z~}~}}|~~}}}}}xx{}~~~~~}||}|{{|||z}~}~~~~~||~|z~}~}||||}}}|~~{y~}|~|{|~|{{|}{||}~~~|{xwz~~||}~}|}}}}}|~~~~~}}{z{}|xy~}}~~{{}~~}||{|}~~}}~|y|}~~|~~|||~~}~~}zwy~~}~~~}||~|{{|}||~}~~~~{z}~{y}}~~}}|{}}}|~~}zy~|~}||}|zz|~|||}~~~|{xwz~}|}~~}~||}}~~~~}~~}}|yz||{y}~~~~|}~~}}}}}}}}}~~{{}~}~~{|~}|}~}|zy|~}}~~}|}~|{{|||}~~|~~~~~~~~}{{}~|z~~~~~}~~}}~{z}|~~||}~|zz{}{{|}~~~~}{{ywy}~|~~~~}~~}}}}~~}||}~~||{y{}|z{~~~}~~~~}}}}}}}{}~~}}~|{|}||}~~~}|{yy}~~~~}|~~}||}}}~}~|~~}}~~}|{|~}|~~~}}}}~}{{~|~}||}}|z{}}{zz||}}}}|{zxy|~~~~~~~~~~}}||||~~~~~||{z{}}{{}~~~~}~~~~}{|~}}~}{}~}{|}}~~~~}{{zz}~~~~}|~~}|}}}~~|~~~~}|||}~}||{}~|}~~}~~~|{~}}}||~}|{{|}{{{|}}|||{zyy{}~~~~~~~~~~~}|{{{|}~~~~}||{z{}}|z~~~~~~~~~|}~}}~~}|}~}||}}~~~}|{zz{~~~~}}~~}}}}~~~}|~~~~~~}|||}~~~~}}|{|~~}{~}{|}~}||~~}{{{~}|{{{|}|||{zyyz}}}}~~~~}~~~~}{{{|}~~~~~}|{zz{}|z{~||}}~~}||~~||||}}}}|{zzz}}~}}}}~}}}~~}}~~~~~~|{{{}~~~}||{|~~|{~~|}}~}{|}~||{|}~|{{{||||{{zyyz}}}}}~}~~~~~~~}{zz{|}}~}}}|{zz{}|zz~~|~~|}~}}|}~|||}}}}}|{zz{~~}~}}}~~~~}~||~~~~~}~~}|{z{|}~~~~}}|{{|~~|{~~|}~~||}~}|{{|}~}{{{{||{{{zyyz}~}}~~~}~~~~~}~~~}|zzz{||}}}}|{zzz|}|z|~}~}}~}||}~}||||}|||{{z{}~~~~~}}~~~}||}~~||~}|}~~~~~~~}}||{|}~}zwx|}||}}~~~~}}||~~{}~z}~}}}||{}~}}~~~~}||{{}}}~~~~~~~~}}}|xvx}~{yxxxxxxy{}|{{}{|}||}~~}|{{}}}}}~~~~~~}}~|zyyz|~~}}|}}~}}}|}~}~~~~}}||||zyxyz|~~~}|{{|}~|}~|zz||zyzz{{zzyxxxxz|~~}{zzzz{{{{{zz{|~}}~~~}||{zxwwxz}~|zyyyzzxwz~~}|}~}||~}~~~}}|}~~~~~~}|}~~}|||}~~}{|~}{z|~}}~~~~~~}}|||||{zyxxy{}~}||}~~}|~~}{zz}~|||||{{zyxxxy{}~~}|{zzzz{{{{zzz{}}~~|}~}}|{zxvvwy|~}|{{||zxy|}||~~|{|~~~~~}}}~~~}~~~~~}}}}~}|{|~}zz}~}}}~~~~~~}}||||||zyxxy{|~~}}}~~||~}{zy|~~}}}|{zyyxyz{}~~~|{zzzz{{{{zzz|~}}~||~~~}||{zywvwxz}~}}}}|yy|}|}~}{{~~~~~~}}}}~}|~~~~~~~~}{{|~|zz}~}}}}~~~~}}|||||||zyxxy{|~~}}}}|~}{zz}~~}}}|{zyyyz|}~~}|{zzz{{{{{{{|~~}~|{}~~}||{{{zyxwwy{}~}~~~{y|~}||}~~~}|{|}|~||~~~}|||~~~}{{|~~~~~{|}~~}}~}z{~~}}}~~~~}}}~}|{zyyz{}~~~~~~}}}~~}|{}~{yy|~zwvwy{|}|{zzyyzzzzzzz{|~~~~||~~~~~~~}}}}}}}|||}~}{{z{|~{{{|||||||}~~}}~~~}|}~|{{|}~~~~|{{}~}{ywxyzxvwz||{zyzz{{{{{zzzz{{{{zzyz{|}~~~}|{{|}~~~}{zyz{|~~~~}{zxwwwwwwwwwxy{}~~|{|~}{z{}~~||}~~~~~~~}}~~|{z{|||}~}}}}~~~}|||}~~~~~~~~~~|||~|{{{|}~~~~|||~}zyy{zxvwz||zyyyzzz{zzzzz{{||{zzyyz{|}~~~}|{|}~}}}~|{zz{|}~}{yxxxxwwwwxxz|~~|{{}~|zz{}}}}~~~~}}}}~~}||||{z}~~~~}||||}~~~~~~~}|{}~||{{||}~~~~~~~~~}}}~|{||{xwy{||zyyyzzzzzzzzz{|||{zzyyz{|}}}}}|||}~}{|~~|{{z{{|}}{zyyyxxxxxyz|~~|{{}~|zz{}~~}}}}~~~~}|}}~~}|}}}{z|~}|||}~~~~~}|{|}|{{{||}~~~~~~~~~~~~}|}~}|}}{yxz|}|{zzzzzzzzzzz{{||||{zzzz{|}}}}|||}~~}||~}|{zz{|}~~}{zzyyyyyyz{}~~}{{}~}{z{|~~}||}~}~~}}}~~~~~~~~~~}}}|{{~~~}|{yxxxxyz{||}}}}~~}}{zz{~}|}~~~~}{z}}{~~~~}||{{|~~~~|yy{}}|{zzzz{{||||}}~~}}|}}}{{~}~}}~~{yxxy|}|{{zzzyzz{}~}}}|}}zyyz~}|{|~~}{{}~~~~~~~~~~~~~~~}|{z{|}~~~}||}}~|ywvwz}~|{{zzzzzz{{|~~}~~|{}~~|zyxyz}~}{{~~~~~~~}{zyyz|}~~~~~~~~}||||}~~~}||~~~}{yxxy{}~}}||||||}~~~~~{yxwxz}~||}~}zy{}~}||||}}}}}}~~~~}}}}}}}}|{zz{|}}}~}}}~~|ywwwy{~~|{{zzzzzz{|}}|}~|{|~~|zyyyz|~|}~~~~~}|zzz{{{|}~~}||{{|}}~~~~~~}|{|~~}~}{yxxyz|~~~}}}|}}~~}{yxxyz}~~~|zz|~~}|||||||||}}~~~~}|||}}}}||{{{|||{|~~~~~~{ywwwxz|~}|{{zzzzz{}~~||}~|{{|~~}{zyyz{}~}~~}||{{zzyxwwwxxyyy{~}zy|~}~~}}~}zyz{{yxvvvwxy{}}{~~~|{zyz{}|yy}~}||}}}~~~~~~~}||||||{{{{{{{|{zz|}|{{||}~~|zxwvwxz|~~}|{{{{{}~~|}}|}~~|{{{|~}zz{}~}}|||}}}~~~~~}}|{zzzzzzyxy}~{xxxyz{|}~~~}||}~~|zyxxyy{|}~~}~}}~}|zxxwxy{}}~}yz|~~~~~~~~~~~~~~~}}}}}}|||{{|||{z{~~}~}~~~}|zyyyz|~|{}~zxwwxz|}~}{{|~~}{z{|~~}|zyxxyz|~~~~~~}}}}~~}~~{zxxxxyzz{{||||||{zyz{}~|{{|||{yyxyz{|}~}||}~}{{}~|{zyyyyyyzz{|||||{{zzzzzyyyyyz{|||||~~}}}~~~~}}}}~}|zyz{|{yxxz{|}~~~~}}|{zyxxxyz|~~~~~~~~~~|{{z{{{{{{{||{{zyxy{}~}{zz{||{yyyyz{|}~}}||}~||}}|{zzzzzzz{{||||{{zzzzyyyyyyz{||||{|}}}}~~~}{zz{|{yxxy{|}}~~}}}|{zyxxxyz|}~~~~}||||||||||{{zyxxy{}~|zzz|||{zyyyzz{|}~~}}|}~~}|~~}|{{{{{{{|||||{{zzzzzzzzzz{||||zz|~~}}}}}~~~~~|{|}|{yxyz{|}}}}}}}|{zyxxxy{|}~~}~~~~}}}}}|||{zyxxz|~~|zz{|||{zyyyyz{|}~~~}}|}~~}}~~}|||||||}}|||{zzzzzzzzz{{|}}|{z{~~~~}}}}}~~~~~~~||}~}{yyz{|}}}~}}}||{zyxxyz{}~~~~~}~~~~~}}}}|{zyyyz|~~|zz{|}|{zzzzzz{|}~~~}}|}}~~|}~~~}}|||}}}}}}|{{zzzzzzzz{{|}}}|{{}~~~~}}}}}~~}}}~~}{yyz{|}}~~~}}|{{zyyyz{|~~~~~~~~~~}~~}}~~~~~~~}}}|{zyyy{}~~|zz{|}}|{{zz{{||}~~~~}}||}~}||}~}}}}}}}~}}}||{{zzzzz{{||}~~}|{|~~~~~}~~~~}}}}}}}~~~}}~~|zzz{|}~~~~~}}|{zyyyz{|~~~~~~~~~}}~}|}}~~~~}|{{zyz|~~|{{|}}}|{{{{{{||}~~~~}|||}~~}|}~~~~~~~~~~~}||{{{{{{{{||}~~}|{{}~}}~~}~~~~}}}||}}}}~~}{{{|}}~~~~~}}|{zzyzz{|}~~~~~~~~~~~||}~}||}}~~~}|{zz{}~|{{|}}}|{{{{{{||}~~~~}}|||}~~}||}~~}}|||{{{{||}}~~~|{{|~}}}~~~}}~~~~}}|||||}}~~~~}|||}~~~~~}}|{zzzz{|}~~~~}~~~~~~~~}||}}|||}}~~~}|{{{|~~|{|}~~}||{{{{{||}~~~~}|||||}~~}||||~~~}}|||||||}~~~~}{z{}}}}}~~~}}~~}~~}}||||||}}~~~~}||}~~~~}}|{zzzz{|}~~~}}~~~~~~~~|{{}~|{{||}~~~}|{|}~|{|}~~~}||{{{{||}~~~~~}||{||}~~~~}|{{|~~~}}}|||}}}~~~}|{{}~}|}}~~}}}~}}~~~}|||{{|||}~~}}}}~~~}}|{{z{{|}~~~~}}}~~~~~~~~~}{{{}}|{{{|}~~}||||~~|||~~~~}}||||||}}~~~~~~}||{{{|}}~~~~~~}}|{{|}~~}}}}}}}~~~}{{|~}||}}~~}}}~}}}~~}||{{{{{||}~~~}}}~~~}|{{{{{|}}~~}}}}~~~~~~~~~|{z{}~}{{{{|}~~}||}~||}~~~}||||||}}~~~~~~}}|{{{{||}~~~~~~}}|{{{|~~~~}}}~~~~|{{}~|||}~~~~}}}~}}~~}}||{{{{||}}~~~~~~}}|{{{{|}}~~~}}}}~~~~~~~~~|{z{}~|{zz{|}}~~}}}~~}}}~~~}}|||||}}~~~~~~}||{{{{|}}}~~~}}}|{{{{}~~~~~~~~~}{{|~~}|||}}~~}}}~}}}~~}||{{{{{||}~~~~~~~~}}|{{{||}~~~~}}|}}~~~~~~~~~~}{zz|~}|{zz{{|}~~~~~~}}~~}}}|||}}~~~~~~~~}||{{{{|}~~~~~}|||~~}|~~~~}}}~~~~~~~~~~~~~}~~~~~}||}~}|{|}|z{{wy{|}~~~~~}}{{{~~~~~~~}}}~~}|}}zy|~|{zzyxxxyyz{||}~~}||~~}}~~~~}{xwwy}|zyxwwvwwxz{|{{{|~~~~}~~~~}|||}}~~~}|{zyz{}}|{{zzzzzzzz{{||}~~}|{zzz{}~~}}}}~~|{zzz{|}~~|zyxxxxyzz{|}}~~}}}}}}}~}|zxwwwy{}~|{zyxxyz{{|{{{|~~~}}}}~~}}}}~~}{zzzzz{|~~}|||{{{{{{{||}~~~}|{{z{|}~~}}~~|{zzzz{|}~}{zyyyyzz{||}}~~~}}}}}}~~}|{yxwwxz|~~}|{zyyz{{||{{|}~~~~}}}~~~~~~~~}|{zzzzz{|~~~}}||||{|||}}~~}}|{{{|}~~~~~~}|{zzzz{|}~}|{{{{{{{||}}~~~~}}}}}}}~~}|{yxxxxy{}~}|{{{||||{{|}~~~~}}}}~~~~~~}|{{zzzzz{}~~~}}|||||}}~~~~}||{{|}~~~}|{zzzzz{|}~}||||||||}}}~~~~~~~}}}}}}~~}|{zyxxxyz|~~~}}}}}}||||}~~~~~}}}}}~~}|{{zzzzz{|}~~}}}}}}}~~~~}}|||||}~~}||{zzzzzz{|~~}}}}}}}}}}~~~~~}}}}}}}~~~~}|{zyyxxyz{|~~~~~~~}}}|}}~~~~}}}}~~~~|{zzzzzzz{|~~~~~~~~~~~}}||||}~~}}|{zzzzzz{|}~~~~}}}~~~~~~~~}}}}}}~~~~}|{{zyyxyyz{}~~~~~~~~}}~~~~~}}}}~~~~}|{zzyyzz{|}~~~~~~~~}}|||}}~~}}|{{zzzzz{|}}~~~~~~~~~~}}}}}~~~~}}||{zzyyyyz{|}~~~~~~~~}}}}~~~~~~}|{zzzyzz{{|}~~~}}}||}}~~~~}}|{{zzzzzz{|}~~~}}}}}}~~~~}}||{zzyyyyzz{}~~~~}}}}}~~~~~}|{{zzzzzz{|}~~~}}}}}}}}~~~}}|{{{zzzzz{{|}~~~~}}}}}~~~~~~}}||{{zzyyyyz{|}~~~~~}}}}~~~~~~}}|{{zzzzzz{{|}~~~~}}}}}}}~~~~}||{{{zzzzzz{||}~~~}}}}}~~~~~}}}||{{zzzyyzz{{|}~~~~~}}}~~~~~~~}}}||{zzzzzzz{|}~~~~~}}}}}}}~~~}}}||{{zzzzzz{{|}~~~}}}}}~~~~~~}}}||{{{zzzzzzz{|}~~~~~}}}~~~~~~~}}}}||{{zzzzzz{{|}~~~~~}}}}}}~~~~~}}}||{{{zzzzz{{|}}~~~~}}}}}~~~~~~}}}||{{{zzzzzzz{{|}~~~~~~}}}~~~~~~~}}}}||{{{zzzzz{{||}~~~~~}}}}}}}~~~~~}}}||{{{zzzzz{{{|}~~~~}}}}~~~~~~}}}|||{{{zzzzzz{{|}~~~~~~~}}~~~~~~~~{yrxwqsrttv}snn}t{mfiehmpvtvvywtsyvnnjs~{~pzut}mp~~sp~ylpyskowmlnmqiyul}|yo[ek\ktilu|wq}{nz~|~{~x|}~oitskq|rnlm{sy{{l}o{zop}smpuzp~x}}{vufrx{{r~dOUbzxv^flbeVacejpept{ugxw}yrpnxvnr|syrn|~wmovq{roqq|ux~wqrsivq|{rs}zqnux~wzx|~ww~kjb]e^hquvmq`hoZakgdvmroqw|vk~tnm|rlpgkhlmq{xz}p|ovxqltrx}suz{}tukky}{t|xlyzz~zv~{}~q|}|wnlnUegcs~wmshcbqgejhltqp|lw}qtwoynnkk^bkiw}|vyzmwqt|uxy}}z~w|r{uvvftvtzvvs||zv|{y|t{qrh_WZugsqzykqrmgjekpsr{rh{tkpvkmhgxk^hucovt}woyzdpop|x}{~|zup~nhvwcjxu}yy~}uvp}}|s~~~ww\ha^djmv{twwbk_jwh]nsdy{xjzks}wpvebfhfw}yx~}q~opq|xpy|u}zztltpopspv||~qv{y||{i}}||tyus~{wv{hksWYbk}rp|sqrsgoujp~v{~lsunlwe_bqk[Ybxk}||wzssqtww|xy{{|qflzvlsxwp~{}w{wzsowus~~|vwtg_bb_m{||s}uoktyicntlq|ohwzrswmvolkekv|}{vyxuvc{zjo|s|~|lqpgosbgsu~{xw{wxns|v}}zy~xuz|yvjm_^kY_Yw}u{ur}rilmvpwpv}xttoo|tmd^roVWolostwxn{}}z|zsuyuonirddzok|mv{{z|szyyuwq|mx~z|{rt{rxqg`ogfnsy{wsvmv_iwyxkwzpknbocflpmt{{}swowrdpzvz{{u|}wzvgnhjjwq~x{}~zz~t}~}~w~~z{x{yvhwfZeXaf^{ystu}ypoxmx|noukr|qkzpmjepfahly}ux{noxyyzxv|vvesxgfik`f}~q{u{z~sy||uyzwtx~x~vyn|ot`kpnh_dkex{urmj}}gnz{xxfkymjoefcuwsuv|wlv~tqz}znxt{yu|rovvomdi{}oy}xzz|s|ttnq{t~}|||{zz{dbpcjm[fc|~}yzq|twzrlmxptjb^aota`{{{~lyvv~wsxy~ryumtmx^akr^p}|}{~{tzs{{mp~xtz}~pykz~oaclaedmhhx}uvkxhvtmy}j~}}r{mcwtssuzz{{r~v{pvwz}rztusgvuiaiaorr}x|sox~wvwwy}y||||ttxvzreihk\i\bwpuqzwy|ywz{oyyvtjmtl][axvjovwszv}|yws||qwiu~kk]o}nbfpqz}{}z~zsu}yky{w}|nsy}~yspiqks~mqvgZftshfo~uqwuo|wuwiyvqfnzhuovz{x|{xqmunosy|uq{}okoeindkv}u}w|zu}w~wuvzwy{|}v}~yzuiqkked[\lbgroz~{z~xyn~}uvuvxkmmljit{wpx|{xw}zxyzpytdrmlg_in`krzq{}~~}x~yuy}usz}ms|yvemzwnqnd[pm^[fwrtn|xwu{|}u{mp{{jgrnx{qqwztqp}r|ztzkpuqkzqtocartx|{|{{quurqxtvo|z~|xuzquqqvxlkdhpnc[i^uzsuzw~p|txjlknrsgcoruw}t{|xw}|{x~vkuqtyhi\gui_j{|uzyv|wrw{{rzpy~y~|xzvtqr~woksp[^hd_ckgiqu}u~wx|uz{vyq{sryu|s~w~x}x}}{vt~xlwyuwnrkfrjdlkpzvt~|yrvznsty{}}{~{vzvs|s}{nfkiljifjkdi]d{~{|w~uzyrldnzvjamt|wtvstzwu|prqdywpaYiyqmq{uwx}xxnm}t{vxq}~n}|uuovuwdm~mhlleeh^]^umiiv~~|x}y}qo}|{rl|xwtzz~|{upx~xwypr}mtfrudheioujxw~z~{z|x|zzyiv{}{z~~~~||~vzvuqyknje\ijljc]elc{yu~uqwtnrxqksyz{zy|zuzv|}xvqnumeoin_`tppz~w|zvus}rrmov|}~~~yuzinwvuffpsninfYcmdZarv{z|{|~zssip}|znr{||zu~mv}vsxvshm~uqcfqmrngrwwuxzqw~upm}otsz|}qm|rzir}tshbclcddiinlcll|{||yxurln|~wony|~|u{vy{qutw~xhim^tmf`atyvyyw|x}xptwr~|{pwv{w~wloqnwkrdasoecnkdXbeheyx~{mvxrtwwypz{~}~zx{zznhsrlkqjmkbxjmwyw|y|u~xx~y~xxz{wvymsmzwxuxwkpvrwmoqjsgce`_lmgklptzry}r}x{yxwqk{u~~wys~{rtysvxsstmk`_onobe}}||xpv|mq~s~szyzu}|w}~}u~pop`svpgZdqpffjc\fhaew{rv}jq~utp}z~rv}x{wukknibvneeeyurtv}{orfeityorznjhklshsyypyuqjfnlnvxrouurrqpcllcd|ujrq||~~~pjroj|z~|w}vzy{{yw{~y{oeSz{jmrtuz{m~z{{trstlxz{}tZojmhipqklym|z{xxzsoxpq^l~|xid_mmfi}|{z|wy|||stzuns{s`qk\^b\^Rhnevsor}z}su~~s|quv}ufnmch}}|}{wzyzkq~xxs{~tmakok|ssnso~{xrx}vppsax}xxljhy{uw|~|zlkpmz|}pzxxuvx|vtnrgidn|sotsfppcodikks{tppmrr~zujupttknqeu}qsnrxtggh\^lx~tpolh|zosrvlhuvuq|vpd_haViun|uyzptwvty|x~vsrd{{zvruyy{}||sy~xz{nca][YV{}vkvldmpblnk{yy~~|~y~u}ywpnkfar|}}wyljeirzprxhp{lpsrlg^dobfoq|uormvor~||ywmfncdxmw|trkzy{z|x~vs|}~{teiut}~ux{rpruy}ywxvuxmwqo{yt|xnvwtwuvnlrvih`gvp|zy}~x}ui_`dqzuk^kfZhncgairfcaebhowzx~zsott~wmrqu{u|}~~ytmfWfok||uyz{{}povrpqolvjx~{vjzxstwylqt{rrqkmnlt{wx~v{zvuwq~~}}{{{mutw|sryv{wz}z}ykjbmjm}~|wzv~}ytqfitu|}}tzvnvv|wqgj_W[imv~txyo}tptogtvqqeisxpusnrgchokoevzp{uonqfnleqzx}}y~{trlyt{}vxypsowmlqnd`^ivn~y~y}stx{s}|xpztons|w|wr{u}zy|y{w{wx~thd_idY^`mw}{~}xyz~~~mw{xy|||~zzx|~~z|tunq~~|||{~~vzztvy~~|wwymqm|vieker~~tpo{rnme`p_brmtsmdelypsy~syuXdddy{v|upuxwzsvqehqvskfskz}}mr|}|wtin{quwuoofk}}ttk]htugdkoklyyx~z~vv{}u{ka__erku{tnz|rxumuuvrgx|k`^bjuw|dnlgt}}z{~x}}~{vz{vlgevyyyggeenmotnsv}wxw}tookpz~thcinqysvkeo|svuxz}yvryxy{ojumrwxwtqgjtz{}squzv}|z~x|y|zw|sgh_l}ztxzuyuqpqr}{wuyoxxqqsuz~rgcbizv}{o~wwrv{qxy{{r_`bfq|tz||z{qtvwsxx~~v}kqnhgjitqs{udjtmuyzpjuuqssrqrx{vqppt|{~wxztuw}qw~~z|pwyyz}}}}zvimhiop{ortrtvz~m|z~~}wtxuq~zxmadqnzv{strmpwvx|}|y}|zzkqznpkku||~ywmdemoy{x}}}ruxsupn}tnrektz}x|yyynw|qs~y{twy~zmonibcevzy}yumqvqxywqz}~zyuillotyusvomr{{rrr|u|y|v~znru{vwrqpnalvov{zps}sjrt}w}y|}{w|wxz{{x{{qkmjhixyr|wxvurqowy|~psxnjqfisrvxzwz~rollptx}~vrnjkxsw|z|zzlnkq}~{|xqyxuptor~xqfee`bjnvzv{~wqsrtuz}~{rozontvrrx}woupoz{yytyy}yq~{ypwtxqxnrurrkmtmrx|rruwmlt~tr~zwsuyzo}tmrnghpyzrspqutwtr|{vuwjaerhhopyrysjkls}~{zplmolqtn|us~vfeukjkpy|{~zvvoshm{{vyz|zxz{k`zox{}uunkwslntz~~qz~|y~zv~uejnhs~}}{{||z}{~u{zhVjqw|}w{}|}wpzt|us|~nO^~ymrkn}|uq}}vn|xz|zurvnrwu||x{zwtp]_|yxyx{xxyor~yrk`h}wqnnicsnetvwuuwwjqzqgiw{{|y}{uvrrsokpeal~y~~u{x{ztjb^R]wvnilb_dihpkhursukhus~{{utmcg\Wiz~{||~y~xrf`gZbyvwxqlinedecdgmocb{{w}srr|~tyvrrwrffu~w{~rs}{|kgrm`atujs}khonpsttpgpn]]hqy}}}zp}tutpiciua_q}}vz|y{|qskd^b^Uiyt~yoihfdbmqglmstkp|z|}||yz~{zxkmrjg]`mxy{zz~~}wpld^[ex}~tpldpofihedgdiluwu}tptvy{ntysppjchq~}y{rzzsnpqbfi^g}yrw|reqvspnondfwf^mwyz{xv{qmkhfeeoeYtz}vw~yvu|kb`b]T^~}wsieegiiphcotuhiwy}upvyz{}}yuifid][k}{~~~{xw}}~y|vmfcf\_s}zzutlmmcc`^ejdlrz{~~zxsonnwqilgjron}~yzx~yxsnlheeY_nkvzotvxokrppsrokgohaqy|}~vmyyljhb[\fojyw|}{}{|wklaVV[`cszo~mkliechocdnqnu||{{wsqv}{vqol`Zmnek~}~zyxxyxzw}qqoigeemjjusshhsicbbffasxzyxokmnmqh_hinqox}{|}y~xzvsoi`ZYbafnt|rw}xvjmvtqmjigfqor~}}|~xojcceknidx~z}oi{~r~wtrfcnhgs|{~|rnhs|nlopqrqvl]lyxz{y}}vs}w\cvnkeozos{xdyxqzzqnv~yuwxfbp|ynntlfqb{}vmgnideiqrn}x~yq}rTSowt{utvw{zu~pu{or~|v}wwponlnmmsokvwr^Rbzwna[]bjlnqrstedmwwrkessklmmpnjomu}~~u}vkblwnebWZ^X_p{}wyu}}omolgb`d[Yho{{xrr|~mo}~~~mkxvljhgjpxn_r~s|ulhlhX[guxuz~yuyzlbgslbm{z}~kc``bcdh[Xivyx~xovqeo|{u}{yvof_ciVPezonurjmh[aiouvxzkbtxx|~{wtyub^j~z{rnnqz{uytorh[bq}zzvprnjmovzzwnbjpmnhjrxy~tsqqssvyquw{zrsqjgWU`nrqvwy|}~psvwvszsttrtvupis}{|wwx}vipw}~{namt}~{nilg_cmwqitzvkxpjlmifeke\isy}~~v~uks|zmgb__aio[Yn}{v}tklpc]eo~wspywvyzocisjjw}smmnnqoafs~vloyjcjv~w|{voo|zxtme`cf[Xb{wmflrmleZclsy{{|vqwwz~{y~{mnt~yww}~~ukd_b[OWf|{xlmxy|}vjnvoqsjejpxsjtvrrrsuvzrr{nmrqd[iyvv{}~~uozwiovkggeaahna]u|~z{~rn{u{slik^Vn|olnqmhp{rq~o}|srplhhmebvy|zq}{q}}rrwvssyrrsnigfdhof`nwwokopgcg``r~||xsqpnfajkt{ujfececW]n{||}~~xpmppvz|{{ss|z|qnkd\W[``p{rmsxwmbn|}{w{wu}~zurwwpy~z~uomlou}usx}xi_[``[k}ywvtsse`x|ztinwnmssgckwwtzwwxxy|su~zrcZalb^q~wotz}}vy~pxyokjf`^fqge}{tw~}vwwmtv~{unjmpfk~tqrwumrvq}wn{}umga\Z`a[h~}~uv}vlfgggmmk|wpmjihinklv~|xqloplmggx}}ypyxkfda`b`bcrzrnmol`gvyswzxwsnjjgdu~}{{uy}~}qnjc][abcx|tmmuwf^lw|{ywrmzpmvywtv}xv{vtstxoqqmrnaZ\aZ_r~}|~vem}sp{vnqvrfdqwpyzsqqqrvnhx~yodcpndn}xqvz{}~rq~swxnkjgcagrkdp|x~{ou|}|ytnkonbcq~tppuwqqpn{|}wpjffkf^ix|{wyu|zxpfehmrkiwzvtrqtumryy~|vphhmnj]^jv|{|qmjeehi`Ygz~vqqtkajt{|r|{{zvrrsictyy|xwlhd]YZ_XYlz{yqktzxtrlqtrquxnmx{wuuvzppunrsiacdZ^lyyhjxzooxqijnphbkqlszyz{~umw{xtlc^fibfp}zv|yt~~snmkgdgpoiluxv}~zlju|~|vwwtpmqulgoz}yy~{sjqz~zuxtkdcgj``lz{r}|w}vvqd_dmpgkyxtqporngr|{~|wniqytegt{|xzv~vlhe`_dlfXdzyvxofnx~svzywsppsk^j~}xz~}vxz{~tlgb]^d`\k}vu~xmszzqy}qjloorxtozzwvvv{|tyzmedfb^`[Xfvzry|rx}sllmnlgjjm|~wttvxnlz|}vsoicadelzvu{wuyx}ngec_]`iim{yysq~~{}mknlhfjpln|zvtv{zio|~ppupfaekehxzks}rlusiikeZYfqowyvutvsju}zvskbaovln|vx~z|tysgc`\Y\iphmwx}zssmeo|xr}}yxvspqxwouzxz|vyyxurzxph`ZWZbcctzuxvwxov{ulefipwut{tqppptyvz}yogabgjkfi{vxuoxwmhgfhlnlitxttwult~ru~snkgbaddcuvtzyv~~pkhdacjmm}ztt}xoyys|qdehfeiqqq}xvvxql}{ohlngachdfurtupxtigih`Zcnnwxvttwrjv~yvslecnupuwtz~|wxuvja^[WV\imjr~}|po{{||wvusonswpmv}xwz~zuq{}uyuqog^YZac_hz{yrq}zps}yvsjcfnxvr}}xvvvx{uw|xoh`[bjlbao}xyzt|zokiggmsnbj}|~{utwpgozqv~urokhilf`qz}y~t}pkhdbekfgw}xvvpx~xuqedfefkoijw{yy|ro{voqtqlmldht{nq~}rszrhgihc^cgfq|{||rlx~yvsmfelmkpwyuzzy}ohea]]ckiiox~}noy|tuvtpqvwmkr|zxzskv}y{smnj`YZ__Y`o~xsx{}yyshelvunuyvvvxzrq~~|rme]]gpg^gt|xw{}rkigdhquhap~||ymmw~}q{wrolhgkk`_r}y}}v}slgccijdhx}xuz|tsx|~{rr~rf`achoqkp~~zx~wnjmonnjbgt~|psz|qrxpfcddeccbcp|z{|slu~z|yvrmlmmnyyuy{vywrfa^ZY]fgiu~|xpx}umpqomqvsnu}yusv{ojyz}}nhkld^`fdco~tq{sy~vqsrhbhssr~wsrsuvmn~}w}umic[W`nmir~~~}tljgdenyunuzuy~|zvklw}qruolkheflqkiv{xotupcSSUSKPbttlr]jyadfou}xxxtY`{|{zv}ppslhchozwppystyvrz|xtsnolkkr}roY\vmmyl{sxyzqotu~qrfktvPMWrtqr}xvs~qz|lgszwrjkgvxtj~{xh_k}{|{}~pekwvednnpwtcc]wtk]VS]bz|}wtaspsno{}vuvwvtzzzruqt~ouwonxv|yuremek{|eYTZntzz{k^bgemcknsxvxulk|xyguwq}|x|{r|wu~nhVLefx{tu|suwu~zkg^Xim}qtil`^eY^hVbq_detl}~txpbad`]lzz|||ip~vmi_szxwsvs~}jb{z~v`]aX]V`ks{~m{svm]tl\ahzoz|w}vvt{dif_[QvpvumbiorsyzijceY_rlu|bixgmnuvcidakq~~yyttosxuz}z~sgf[PM^duysf|lchhtg`qnodcuo}uytvrmywtp}mmjoht}~|u|}qgvszohhQ[k[iwp|qz}}yweiid]bswxz~wzqxfd}ojceqdgxwx}|zymrv{y~vxigZTin}smnp^dn|ru{kjm[l{mwxp~rpxukiV[Z^bs|quwpuxy{qeibXfxuokyoasz{nXkjdife}x{zxw|o|roq_]`Tl}{{}mtvsxqrtc\]mce{zz}qitu|kod_Y]aXizzwxywq~|qy^kqgmss|{}yu}x{~zvv\XU[S^rqxpdmqi}r]YWhfb{hx|yx~vpnj`adut|yqisxsxzurmaP[YXjyo}|x~{krf\afig{}xsxysu{opwpv~pt}d\Yl~}||}xlvlswvlk|pxuj`Q^nz}t{ymjfuwgplUaqthu~uzt|z~tumy~{pl\cu{~||t{poxkjo~~|{w{hwso`erz{{r|qzq|}iokidRe{xvvserllfnef[`hgzxps~~~~tmuoZ\`^gemowvc{}recpwYcuruft|}v{y|qyrp}^eijeq~ymywiy|ymb}{b]h_Tt{~wqplt}wepbVmiiiqjn|}x|ps}wwmccgneyz}umz~noxsysmkS]S[mcn|svvsrzummjdfrt}p~m~tnvxxwg{uhZheqywxkex}}|~zjo{qgf^_acer{svnfcfflmqysw|q~upyfkoyfstpdl}{x|}gxf}yrmupjj^Xagn{ywxumiwmpl`rv~y|}}rh{rpk`pYT^xu~vy~uy~lrvyee`^\^dpx}f}klqqftopfz~y~w|~v{zklxtqsiYiegmry{v{tozqhlzjztXWmirmvv{w{fjVlmX\qn{~vvumv}pmpfdmghuv{tw{olfk~cSRfYbvuz{||mkkagti{uuo{xuwzxm|~qie\\hjn{rv~l}xyqnurdi^WWPmnp|{~}vyulimijsr}ytyyxwnrqq~xkyqpaamp||~zzkem}uzrpmqzvjh`X_eeuvzwytjkmdepy~y|noexxlhso`nnkaw}q|tklo~ntsstm`_\X]gk|yxw{xiystll}wz}wqqjpoeZ^l][h}|y~w{{ovx{y~yil{ub^`[aikvvrlrgouclvwnw}|z{uptst|xijh^flgszx|omqsy{{t|c_swiqmbRaqsz~u{ueb\rpgntyypqqmprieigjsrx{|{pzwx~wouiabbpeRSiek~{|{|tapfkzou~xp}uhuzizij^Z\m~y}u|{tw{ukmy}~{gijukg\^eZS_pzzuzswsrhn|~p}r{}sxqsukp}fex{udk}q~oumep~x}zc_hhfgYblXdoxst}ppnlmltt~}~|}yzuvbYjsngkt_lxs}wtyxrq{yszzsn`rrlm[Zb`jz|~zy|ydd~prt{x{}zkgnduy]^\lvm{y|p{zzyz~zx~zvrvnlpd`rnl]Tpoz|r~xqjtsixwx}}}xgwruynsqchg_vuxv{}qrmu|}}}yqntfe_akYZdgin||{vue]t~||}~}t~vswzso}pknbhgq~|uvxxzrtz~suecpf[]SflYfp|~t|wwollt{w}~zzxoxlfmv{mgqhjch~y}|rpyr{{{~zt{vsf\uvuoYYgfolxy|tn]ttjrv~~v~ttrvpjwgb^bhqz}yv{pm{|whturjddjmmjo]cdhiur}uiquvy~{zwxpgehv]`][sptv}xkrkns{ynllash`dckaWckpos}y{wgouzuyxo{vvsy{ttdw~tn_^vy}~~|qhncxvy~zp^jrklfiVX]fivw{vqz|kn}{}simjlp}unemhdlyyt~|olyz|rrncijnbfbUX[Uz|wwfmlx{|qdi_qj]Ufkbl|}}vvs|qq~t|wzrhkve_x{u^Smminnt~r|yiinhvqn~xtsp}teghg_nszqzxtjbpypw~suoo`emph_gZ_brnrvg||z}~vzrktympsm[flejrs~~}lnsxm{}~|~~ojnb^d\boZQQeto}rzntrw}shbcuqk|uh[qwy{}}|yiowru}wzopy~z`gtopqdbgX^espzptd`muyidjzbblsviswryyu|tsvx}~z}y{s}{]pnytT]^Zkyy}}{z~y|sol~pgXjmmwcy|y|{ut|ootvnt~q}wdhhnh_e~ntnzh}|ywjkmcibzuyv{uzw}n{ylsxp{y}|xeb^g|ynweuy}w||p~pyjsjrt~}ysz}{nbNQ[ovqoozhgllrdssespihhdextzneos|vgxofvmwv|qmqgqgq|~~pv|eeYRSkx}ryj~{u{z}nr{ymvpx|swqhpc\TQ`hwt|obZbn]nf]kd\jwhd~vqrwxhbwbZg`qpuq{zt{y}|v~|~~rwzpw}kdblj}sy{tkic|w|}w|u{mhnt}~u{pxneT]bn{wyt`ebuumxmpwqkmp_e}wmeeow_[hW]dh|}zoqtnjxrpw~}uysl_[^d|wzutv}}ttxx{ruv~}{s~ompdROXWo|kkj|jljmrkbkqfUs|zqmowztcrldilm}}r~ykmocnj}v~qvtviYQZ[q{}omjxtuy|{y~mxry~{}}n}qgohXO_`o|xghcxkbcdkpmrzs^zwnu|xckk`biewyq{sn}pwm}ryq|p~pvxk^edtzxgijyjrysz|{sv~u}}w~ouwkW_[ft}olhx}egmwuquzx`i~yqprvufbkddoll~zo{hmkmsirzxwu{v]^cgr}~up{qpv}~}ypy~{{zqrgooXQ]\kswrpvdekpmovvmWp{zxrqxzviopljujxtyyhwtfqgx~uutsyilvkU_`jrwpn~hjpzz|qv~~}~{jyg^imYYaet}tnrm\cmqov|}tb~xtsyuoejhhivfty~{~sz|r{oxn~usq|rr|gm{q]ffqyzpp}mluww{w{||zz}lzoamq]Xaet{zst~gktwsz~|w_t~yuppvqkehkmjznvwynzyksmtwsnt}|pheus]bgowyv|wjq{~~|lz~~|z|~nkrX\kdT^cs{uu~kclsqs{xxee{ztsyzpnjlopv}m{}~p}rozpown}w~w~}kqnZgtf_hm}|stgiu}|p~zz}~|~{~yvq^n\Vio^bkyxrvsbltuu~td~ytqtwkhfimqrm|~s~~s~vr|qwvws~|ypmt]evncls~twqmxrzyxvy}||}x|}}uwbpaVhp`ajv|x~|gowxw{pa||vrnrwlkijpvxst}{r{spxm~vuxtznlqZdtlcjs}uznly}{n|}||z|z}||z|zsp]jYVhl^akxyxwfqwuu~}yif}zvr{{onkjsu}pz}suwyqryszy~uy}uzeoh[jsgdmyys}jr}{||p|}{x~}|{~uwyz}psccgUaohaiu{v~nn{yyveyzzpr}rnlhjttr{{y{x}xrxt~wy{rz{{}zzritaftpehrxs~vp}~o~{||{vv{~||~vyzy{xtnblZ^lk_alq|{yo~}y}wgqzyqo~wqqjkuuvvz{yz}wprtxww|wy~}~xugsdcqpdblqxw}|n}~z~}pvx~yw~|z}{}v~v|{|oqai_Yfj`\enr~qz~xyzmk{{n}uvoiptz|mz~w|zvpyvwsx}uxknm`jsjbfqo~usv{|wpy}uwxz~ztztxx{soicj[`lja`mm{{u|xlv|vn{utlhqt~tsy}zzvryz|vxr|x~twjridosicjpq|zu~|}~sqt}yrx~yv}|vqzryw{qoheh[blh_`mj~z~{tkv{zsnzwvmltxux||{yuqy{{wzs|y}~ruipgcmqicjpq}{w}z{}qpt{twzw{~xqvqvuxpkhbgZ_iia`nm~~z{~vmu{zmxxokrwxu||yzyq{{v}q}|u|y}priljajrnfjuqw|z||up~yv|ts|}{v~}xtm{~rosrsgi`g`]hnidmtw~~}qox}ntxxslnv~t{}~{tv{w{srtxyzwophodfpsmiuuz{||xos{o}~xsy}|rz{szkr|vlspsihccd\dnmgjwt~}rmxzzul|yxpow~z|{~zws|}}xxp}vuxwwlogmfdntpktx|}}}{{zpqyq{~ztw~~~}tx}u}{knytjomphdcad\cmpklyv~tox|zxl~zyqowz|{~{ys~~xwnz}ssvttkmgmfeourmwy|{{xprwn||~xsw}}sz}r}wgmupholnfdbdd^fpqlozwrp|w{sn{zwppxz}~}vwz|qozyquuurlljmehqupmyu|||{rov}y{l}}vsy|yr~~|t|pgrskloklddcf``jpnitt~~xqtu~l}{|upt}}~}|~|}s~w{mvztrwssmjjmhelsrlsvx~|yworunz}~xrt}~|}r|s|vgmqmiokjfbcfa^emniotu}suvqw}~xqqz||~~~u~y~nsxuqwsqojkoiekrsmotq}{{qru~ss}~yrqx~|~uyv|{yhiominlhiccid_cknkjsnvu}{{{n~|spu{~{x|tnvvruwprnipnfgnsplsm~}zspv~u}k}}vps~z}~~~{st~{rfmnkjpihg`fh``flmhnmt~uxvtxzsrz{~x~}oqusqvtnqjirjfiprnnsn}ywggoznpsg~{xvjfn{zz~pklkswvsq{ja^vhgjgwysu|}zyvxz~{wxtxt{qvfglxwmprt|ust~|yz{vx~{zztnml~v~vvvxwyxtjq{|ysmoow~}}{vZT[uxg`S`d^bjsurwrx}ws~}zzvhi|||nmop{x~mlu~~|oZ_nysugab`noeckyxo{lyxwnio}~y~xlllowyr}w{wleT]k{tt~trv}}}|wxz|qlfj}qec`fxnjjftwwzoxrph^hqy{x~pyww{~xx}|sqnkdezxzv{~uy{|ymoa`TXk|oztiilpolmcr~lxwnqpogr~|~z}y|sx~uurs~utsv{s{{rheb__xpnihsmcdlwmnpdtspojlv|~wzu|rklkvyxur~}{ylpfg^^n{sxy}y|rpvnnnrnjfgzvmohpztzqrqml`hqx}}utuzx{yttqkkifh}z|wzvxy~~|}{uhg^`W]o~s{onptspoeu}kvvjmmmgu}|~y|y~{qvzuvtvwvt{}}u~|x|idba]i{rsjptkdhqujqiitpplim{zyzxvzmkjmvxqwxzrmife[ep||{~{}|{~}xnvqonmt}rnl|rsmp|wxwppmnacjqyv{py{~zsr|uhihdduy~~yywx{||~}{~|zwkf``TXdq|ywwyxvogyzkvuilmjgss~~{zyy}}tzzwuop{{yuwty~|w{xgdc^[im}}wpyukhmtrnojpsrphejyw|wwyxmkhvxxur}w{slhj^Y_fu{v}z~vuvrojgm{ty}xvpxw{yqnqj_bdlw}zuz}{{ryzs}rhjhbhnox~}wzyx~z}{}}xxkcc_RU[gy}|}xjflcqyz}~runo|~~~vqw|~myz{soqtx~||ut|ypqzmhkgdmjovfsl`cipvyyupszuzw|~~tnsk`bbjw|ro}}nwtkprov{wyxzw|~|}yxzznilng^ch^^afr~~x}yxyzx~plpmluqv~uegjqvstuwvrnp|~{slo~y}w~zqtv~|nedo}zq^^^[ahcs|~yxlkuwy{}~~xv|sianxzvuzokmpy|}}ldV]ku{wrpmha`hmjyrnvkoj_ZZmpr{z}w}tinpefgkvyn}oiho{yrusuzx|{m`W_w}ylpj___dmutn}th~wnjks|z|svykjmlrzs~ojbaq||}|{|{xuz}vokz~z}}sr|kcaiy}kkifookz}}|{|ondlx|}zw|{~~{{xwsf`bzuz}rrtwz}y{jb][m}~{xsrpkghpmozkpqfld[Wcvu|{zw}ohrnhklqz{vsl~skjp~ttvu}zwqm_Y]worsgeefmtumwyew{oklt~}yvrzohmms|u{y|nidbs||~~{y{~}zwol{}{|{|nkxkddn~ponlvrm{}||{{yooemy|~yw{~|||tspe`hu}|tttw{}usec[`r}yxtoknpjwtitkgj`Z[otv}~w}{insjjjksz{t}~iw{okkv~tww}{~z~|noe[Zm}|v{pjhfjqtos}jp~unkpx~x|szvilmr|st{yrmg`kv~}yz~z|z~{rn{}zyvy|{nmyofcivyvtu|ro{|}}}{xsndlsvzx||~zz~z|}tuqgamzzz{utrv~~}}~vpicX_js~zspqko{mmvjjka\eplt{|zvitoiigirwvuwo~{qkks}xz{xz|{xopf\apq{tpjinssp{xlzvpmqwzr||v~tjmnyynv}~zxspcahp}{xx|}towvz}yxvu{{zndd}wyzy|zutrfYWZjxwuz{hqwnpqommoju~qwy~vg~~~~}~x}~|}vw{{uxbXYk{yz|txptmbbiet|~krtmnlmu}mafremi`fly}s{tkpy~}wxvvrdY_bmz{wuqsy{x{xwtkiq~~vrv}|kTP]r{nzqmqqpoqlpxr~yqvpgjvvzyxtrw|{y~quyma[btxwyvzxxwjbjtvmhYQ[ht{lslgfcekpor{tp|}tmmv~{ruz}u}}ohf`SUewzwu~rtrhiw{~|~snsk`\dxrjkqymjsvwxz~rprlags~z~}uvwmum_`ZR[ox{yusw{{zvz}us{|{wfbaYVg|}yywtrpiq{nmwngjeam{~u~{vuposvsqvodileagyyz}x}twvlmz~|rts`[ZRXoyrwnkhehmonswomwwpnt}{vps{ws{{zxv{tc^b_[i|x||vznqnju|y|~{wyreejebi{nknxwjouuvvztimogfs~u}{unzyijm^Y[V\r|yuv{|{~yvzx{~~z|ua\b_\l|{ywuqipzoisncgebo|u{ztsnmprpoqkbekgem~{zy}syzqs~|x|lnm\WYV`v}xyqnjgimnnssmmuvppx{{sos}rsyxxutxn]_e_`o~wxyvosory|qltrrrrty||}|skn}~}wumq{wu}sdvdirzu|n`kumhcanuu{|~~~ldshhlmrz~~~vlvtikrytcYrtrnbfllv~zvojr|yytqrzzvxpdei|xibdka\lpikrx~{}|zywmtuhinlv~whs|qmmknqqsww{~~ngrfXYf`Ybjadlkrysx~{{wuqoquvy|zzzzuuvrjvzzywzrpjjnuu|yut{{~uxqnofk~}ugT[{~lgnpux|{uw{pjqiadlhZi{ztss{yghsljt~z|fhvtjs{{{zpjls{zxs~~tsup]fujkrjmtqrsuvw}snzxupnpq|nhv{~yg^l~wrut{|{~}ttuh_kyx~rlmpswytsi_[bnzsui`hjpxsw}vpfdgrtilljkiwrkmquxxy~}faqlflu}}vnsrehor|zwwrrkkd_^alz}wyv}}|}y|zt{{~vmkoysustthehfhr~tk`\[^fnqsuoruv~}xwxvnuzprjZV_c_mys|qprxumd_en}spqmoxzvpebg]TZeb`mw{|yvysakyusvxyyxy{gmzpeceltxzzpy~}}zwf\bkip~ulihhhhltk\jtibacfhdjyumrzrhnqw{twurng`Z]eo|yuzhqlZTYh|shllqphlrrrvwndc_[YY`glqtstsmrsv~|}}w|vleid\dv}~|xtvqlfhq{}~wyztponecnniicei]V_ifhtyzzyyxkxvrrtvy|pzumpx{{{libSTdosqhsneeilonntta]nncafmrqn{~qlruiit}vuqmimw{u~s`gnb[`kx}}zosuxvlntssvxrhghd_\aejnrtz|xxosocgv|}{{xtw}}mb`\URYft|~yvvsloytni`adZXeoow}u}~vkx{pnu{~ux||z~~tl`[_YS^lowt|uommnnnsxncq~vnnsxxuxz|s{{xytkiowzxx{~~|{}~~xdeoh]]eox{uuz~}sv~snrqhcfjpw}{yoqodfrstww~{}|x{|xz|mcecYTYbm{~w{wrjmpfgpolu}}qp|zlfhlooxx}~ullnqw~~wpdbcYV_bap|zz{{}pm{sllnpns~zt}~wiikbWX^hu}|tqwrltxsypdlsi`bipsz|powtifhinu{|~vv|tqkfmngmsnr|zz|}}}t|{xy{xv}~tkpnaZ]bkxz|xoptliplhpyvq{yrpquz~wt~tjjmomww~}wzynlnqv~~ynfie^dhenwmuymjkkgft~vpryvlsqjroa[]`gq|~{suzstzus}~okuwkdfkop~wikrh\YZ]cluy}wsjcfd]beahw|}~v|zwz}||pell`Z_fq~~xwqlcbheemmku~~wyutuwxy~xidnumeglpow{zzvsux}zuoefhbdljo~xvvwx}{pr}wopsrnuyvz~sluwu|~tfhpg]^ckt~}v{}w|{sfgqqfdjrvx}wkrwkbbeioty~}sx|{zu}yrne_edajmmxz~}}sc\feZY`is~{vpgfkfglhisz~yv~}wttuwx{~tgeoulgltxyx|}stx}w{vlf]UY\Zdlo|~}}}}~pgkvukjosqp}|vv|{op}w{~whampgdkr{~vv}{||wtttsuwma`ksmjpyuhmvnccgkqv{vz}yt}{uqibhjhpss~z}{}uwy~}te`lmbbhq{~{vpggmjloknx~yy~zxxz{|sijtxpmry{}|s|vnorw|~}{voi^Zaacjjo}zonu|umnqpnwzy~zs|||~rejulceks||tmsuswus|~zyyxy{qd_dmjbdkqszklysfdgkqw~|~}x}vrjbfkinnmxwtzzy}~{{~z~~|zvl\[if[Z`hs}}zsknsqrpkqz{xyz|~|ploxxnknqpwzwvqruyztzxoke[[baccajx{vwwqqqmp|}yv{{mdpsf^_dkt}xu|}|zsu}}ywwwx{xkcbhohacggl~{owthfgkpv~{z{ytpg`fihgbcoy}|yvvsp{y~|z~~}{vl]^kfYW[blwyopwvtnipx}{xwyz|xmiiqtkfhiiqyr~tkjmqw}|txzqlg]Yaded`fs~zx}~trrnmy||~u|yzzpcivnbadks|xpt{zyrnv}~zvuvwy{rgefnphdfhitxq}qgfhlqw{y~|v|yvridlpomgkwzy}xuuqp|x|{z~~~{vk^`mi][_gp{ynnvwtmhnv{}{{|~}qnmsyqkkmkrzpzwljlqv|~}uv|rmiaY^ghgcgsyvv}uppnlt}}{}~vhbosg`bhpy{rmu{zvpr|~}{wttuvyvjcbenohhlnr~po}|ojkou{~zv~{spja_ioolir~|xx}xwwtvv}vwz{zyvpeZani`agpzwos{}zsqz~}|yvvxy}~tkijrvpmoqr|up}vmmqv{}~vpu|ulhd[W`ikigo|{z}yvvst}|w{z{}xmaespfdiqy}wnpz}zsqy|zyurqqrttja``hojhknq~vq}tlkoty}}zt|{sokb^hpqnks|xx{xvvsv~}}uy|stwwvurlaW_lhabir}vnq{}xqqz}|{ywwxz}{pjikswqoqqt}qr~~rllpv{y~z}~xomwxnhf`XZgnnjkw}|{~wvsqz}~}y~z~{sfcoukdflu}~zplu}{sms{~}}sjno_[dfnjsyx~x|zzn~tonvrustrgoxritswvt}}qt|}xr{sp{|toc[Ydginkpeepqfltw~{zxtlups{y}wvncksnlz|{|ts~~|{yxu^h}k`baegegXZdd[gpv}||x}xyvy~zuytwy|nl{xnairqt}yu}iWkyokjffURZ]Vckoww|so}z{zvwsswwpqmprrtsypmtcisuy}xx~~wpqyiXl|wvpp]UZ^Xaeekluywotv}~}{uottpnmptsqllyxl}|ghs|~vr{~yjbprZezuwtwiZ\a^`e`efmrvusx{z}ppormqsz{zpimlx{mgq~~~urysact`]}vqqqvsa^bd`c\^afjqusrtwolv{krt|}~wmdxsrywhlz{z{|~vu{jYjmYqtpmnpxk`agdb]Y]aefottuxrmlqquz}~|shdo~}mit|wv{zv}s~wcYocbypmjkrufbeid`X[`fcgmup}x}ohr~otw||~wpbk|v}{jl{ywx}x~xt{pZ^o`qrnjiktqfdike_[_eicjotnxkg{yptwz|{qi\tzujpwuxyw}}swtgThme{mmhjovmggmke]^bjfdkppv}~qglrptwx|tk_`|~mlyzutyt{}~xs|vn[[qgurmmjmtskikoib_agldknplxiez|optvyxkdXtsjqxswwv|||svyncWnml{opkmsvoljomfbcfogjnoj|}lcqqmquwzmfXfykoxrsvp|~ts{|ogVfqhqrnnrwrnkopicdemjgnnksqcitlntuzpf[\~nnzyqoumy~|vrx~~|njYcqf|vvqoswtqu~mb]`^]cibc{iyyou|~pbUust|r{wy~toot~on\l~}wp{yonnpodWKYnjs~|}sprrnztlcyuxvpv{tm]bxuicsvq__eatwsp|utvxrsxxqs~zynm_kpf}y~yuuw~~jbnd[Q_sl]auc{|ncwos}xgXYtywttuwquq~ywvzpfvwibe_ITc^l~nyu{uuvofgkkzsk\l|}~}{vrwne^pfxvq{yqvkjtwunosvq~|jYSm|oz|wrn}wjckljkqwf|`gx}sss}zphtohm_Y_ttgr{zs{{{z|{zyw{wtwzm_Sunfqj~{kdcYc^iphuw\mw{qmrftpu{~k]evfu}yu~y{|eywipdhaW`f{rjq~{{|phimvpkpvop]f~}os|u~|vw{wh]}qomrxrnjuoo}wxslinqxsbUevf[mtwpuqrxwwntqsrVsrvuz~ywtfpdmeamrzqr|zzsv{{{|kryy~v}vstuvl_Vuplkspgd\jbw~wdlv|ujogjglryyk^hzo_muyrz{|h}{xcl^dfZgk~suzqghlurnmvnoc`s|t{sotxo{}wrrsuoe\t}rspouevu{stykl`_ekpgZYordhy}xopqmlomllys}ih}}r{~y~kfj^qchr{}ttos{|x~}}py~wtxrr}upffdcZS_}wwtkmabsi{|}kzxtpkltc`dlspf\mzsjy|{zuo|tttttvp}}z|m]gTgc\juxxkdensrmouptik}wyt{vqrpn~xrgihg`Ya{vwvoiu}~wqls_Z[big_Vfvun|{tmtiiffdgxz}yfuv{qclZolanyw|slox||vz~}wy~~{|srno|sj]_][TP_}|zvpsdhzkw{}q}zzvknm`]^hone]myxq}w}pqqos~qyqjmo]kogff[Ih~v{}upqzpn`gs||zu~yxw~pfthdcc`li\Zr~}|ykuz~utp|{|{{f{afk_U\n`SYepnu~{t|utruln~xxotaif^tj_Rflpmxtuvtsqzu}|rcaul_dZTOc`s~{y{yywzm]|xtxzit|ickrmfWUc|xuw{yz{|{yqm}xlqr~srkaYhkgZWWrxrttzthulfkkfvsowrwwetlnujhdgbp{~}utujj{oqs~ziuyn^io^YTkjxwy}rvpmn{etuet|~~zrh{{p}xqqxcUmroo|}{zyxuiixxyyt}|mnogbZXkfUVkipz{jq|s}|qskyvyvgnnxxtyg^i{eYY][m}tn{~wxxx{qowuqwyyg[nc[QcbX[r~loy}}xxtizwqzvx~|vvxwu}xfgkick^^}sil|estzwuvv|~sdn`c\TUff_mpqx~p|vgz}|et~wzxychpukhb\njwmku|~xolhmofyl}zy{~owfaf`b`^Q^s}ry}}vpk}wlf}qhrw|myjlumh[kcfxsu}}}xvz{xppwys}nz|tnplpfQ\kc]j~wus{|umm|}oq||}p}pqup\kqi\hukogtzzzxyj~rw}xtxskk~hWboZQRWK`wxkyyvwwykmypuxzguib_il_Ufwjryxz}~{mt{jvvx}ssinz}i[`dfhbPfjnqzolts~xy}|tu|pei_`emc^pztxuw{pn}{uwvwolq}qeghe]iS`_^rtu~z{zjiodl|z{~ys}hhccfk_Zgr~|w{unrzodl|ttwogc}tijfbW\fS^gv|~}yi|wtvws~~v{nq~{r\]qoeer{v~{z{pqvzplw}r|{}{vv~{nbZixvvttty|srnz|nptvxmpwsmef`v}w}smzhvzvxsmosrvy}moyiY_uwvplu|trzsxiqz}}qs}wtvs~f[h\^\_luidq~}uzxmiprqvu|uzqcin~hjki|}ow|~bcxkkyku|}r~|tk{uw{w~soci^qxm]RMLM_h_yimvx}vryz}}lz~cZY]X_~t|zzyo|vvsmx~|r}xvfZ`of|rl{pr{y~{ywz|wwnpu}u}nsxvec{wlromadsyvsqsjykxhsqhool`fyvnmhccbwytly~niszctny}~zxzyolllpqsqfyujrtyum}~~v|xlis|tspdk^sty~xudadpmupzpfmk`ew~o^mhz~}wbgltrgvsx}vnr|}zlyw~pz}rjtsm{{|vynouyxn{tv~}sx|ptyx|y{pflf]f~xqvtrxgggaf_uvzmfnmm\dz~vooocbkenex|y}qj|txt~ywyu|w}}}egoy~|{~ukrpqhr~}~wvrundl]ilffd{wvohs}qnosg^t~y{hjcyxx~snbfi_bsusr~ytv}v{yr}ytxqzzsuossndzsvt}x}~zz~}vzpz}yuvqpeV\w}vvxpfitzuhkdpxv{okl{~snvldfgkXnqtlepuysx|vv|xqzu{{izopvrtq~vkp{tuy{sxt{ty{xv}|v|}k`d]notyv|~p{yej|uhXi}pllkdnxnmgxwpmmfZ`|~ut||w~tuy}y{uv|qsibflrb{~|vuslq}}w~y{w~}r{whxrdSSkpeft|zkv|wnoe}s||qqrgepxtfdeatryxx{ww{uzzqr{}j{vlwuvuoxii{uss|xq~{z~w|{t{w}wyw}}yxt|yuxvvijr\_L_lawyux{}nlduymkfQYfd\Nakf^ejmlyhv~uxqriddlc^`hi~}z{{{wngs|vu~z{z}uyptolqun[O^eu}}yywmx|sqqj__v|wus~fc[g~usmw|ojpdz}roz{w|xxju~qkkVW`~{}{v|||yz|{|{v~|ntys|sc{znm|whQRrw{~rtxsnqwjnbwzpgijwzkbitty}vqvqpkpxtq|zkj~vh{xxztthemwz}~yz~}yzunv}}wutyx|}~{yzppmqulPNk~yq}}ksoylbv|p_Y\at~jehsvv~zp{w{iu~wu{}jkstxpxtqa`uvpt}}zrw~|wtffvx{xr}|vxxkzoffuocMVxsfdy{u}xjuod`aelxvddnlkpw}w~ntir|qr}frwvdyknppe_g|}jo|zx|y}ryyhmtvwv{{rlxx}{ww}uo|xoliilc[q|lovuxy}rrwsd]adj}rglfhiqsuwmmf|tty}r{o~{osywgZhvklw{|z|~iv{tuqns}|px{}{xuyy}otvuiyqlglvfZUo~wrsw|uz~nqsxkfginoolwwty}~rvqdxxoswkz~~suorvxbZhkgrw~ywlnttzs~~{uvu{xlq}scpnejsugUOg|{sp{|~|{mxpukdbgitxgntrwotzajumysgm}mttsx|m[Wywz~{}}t~roppy~n|s~o}}t{sbp|umkfcnt_V_xtx}~~{~uvppmgb`kwxpdoqwwszxmqntznjyssxomowt^[qzvzx{m~womszvt{}ru{mrw|peq}vrexridlseY[yzz}qwrqpgfbpyuiow~~yj|q~otppqytfgpvpvx{vnxreaqrn~z|v~|qtimrvx{|ks}~}wlwxhgirpnqvzw]xy`aepxh\Sn||kyv}~yjeboy|zvrvzx{{kny{gcixtw{kajbY[wyu|or~wwp{lrtvw~}jt|{mmsjilnoutthZ}phpsz{ohe{~ywu{wuy~{|yysi^_blmmuru{xq}~wz|x{|}sdp|otgsvjjnc]aznz{yu~zlk|}}izt}w{tv}oxucefgceszm}cms]emquof^csypvv|jdfnrtzs|xu}{rsthgvxrvd_`\TWozwnx~wpt|mttv{ygru}uhvnjijfm}ms_a|knrusrkikxx~|~ywwuvxx~zuhdiqrnnumzz|p|{y|}}uy{}uldupqeuupiibbmnk}tvms~vjzo{rvozxrnhjnggm{no{atf^ersrld]bjv}wt{~khlrou~s}qy|{xzvsufx{o~rc_YWRZqywpz~tixpqpv|~rbo|srgwqhhibn~mq`\|okksklihksu{||{uwvxz|zqkowyrtspn~pxysuytvywmepoqigulffdn}rku}vwsq{nvl{qtqq}txynlpqhous`yodp]^gwqrle_ah}{xp{minpmyuo|z~ywodw}kync^VXS]q~zs{qevrmmtz{obj|v|qfsrfcg_k|mncUyridngfhhlrx~vwwv~x~vqrxuywrivw{nn~yrtv}|nhd}tmm`vwsdggo||qr~zx}ssu|{pyl~}ouns}|rytpmtokutc^{dgh[]kxqvnjddpzupwmhpmo~{r{{}yy}hczxhuid]W[Xfx~mdpvnsiw{tni`]jy}n^]d]]T`pms{zwql|t~}yq{hlkswyx}}]x}z|xqyo|{{sz}ji\YfomnVm}~w~{xor{igt|rv{{vr]guiht}~{u{xoq}~|jnmkxz|uf~psy~ylgdsk`bcv~yuqui}uepgqkgoyrz|p{rjy{m^eontdzz{ut|w}~|nXffzplqy|j]dnwvvnyqpztafohzvwo]`moob^q~vhu|zxttuy}z|syo~}xu~nZTggy{zqwxpcHervqh|osq\gwywv|vniymkpu~rut~rgk\|z{u}xq|qx~oT\w~{{hc[hrmihf^gvy~ti\fX}ynjls}wu|z~wfrtlusptqzzykv||qx{vs}||ocXf]|xjotwwvovbjrn\fmgsrfqqabmok]fknl{qn~xz|}uw{w}sxvvnX]iitsgs~s^[upyguumy{d`uyrot~zyhs|kqq|yoxxxxjlWb~~{vuyknz}dYn~wss{ukjtumjlb`lw}{pab[Zwuooq{~u~~}~ptixrmiad}||un|uwxwuu}~{n_^aW~{|vyz{{wuqXv}qn\gkjke\rtfflle_r}l~mnzojx}~}wu|z}qutvs][hjmj_hykgzv{ot{rwyg^r~tppz|}popsv|}rr}vuzzlj^X|x|q~spe|i[b}yupy|zryyvmribcpyzrg`cTqy}vsu{zx||~m{}jhqohc]oyt{~s|x}|rpxysg\^]^~~}||{|vwmYzxrmZdjkgd]wuhjkkdey|ovji{sp|zv|y{spnpp\Tbikjfl{po{|usxx}xg]i~xwu~{xjzqy|~wqzuqq|vlgfYy~rsvxny}k[Uk}}~}|{{zuqsfaerwtlbba_~xtyw}}zx~zgwu_dlniik|}zxr|{{rsjo{wqztnwuhq~dsouy~~novwqmou{hvx~uztrmmq|hqoszykjrzndnruqguyywz}vpz}zuqtuyu{{vrwvoqX`~xiYusv}wyvlzwjv~ymhkfnf[UVeuq]dw{kjpzn{h|ylr|rk}r}|u|lebq~z}|wxx~~|l~{yr}yr`\lvopogiuwr_gel~p{lnsw|kj~{rfqmoosmyi[wtzlo|qjxyz}z~rgihwr}rYrrm`ryedhsniuibixvzwyyyzxsvtu|t}trvxnjirkh~zy{|fg{|ywvvh[dx}h_fovj]dhfknug{redoosisrju}tnwhvzsxg_p}v~zu~xzsr||vyywl^md`bxulfmlgbi{ior}ztsfesypsfkq|{uyu{jwiaov}y~nw|qmv~|vszx^VZn|lxrhsytaNgwfhsoZgusnu|zgqvqp|vxk}}r~tqnch|srt|~v~~{y~{{isobfsy{tgdmssgjkjtuj]]bs||{rtwsj|qhtwvgXpxy|ozxwzw~~~|}jjqa]_~~paqpkcvrs}sdqrlkz|}qux|w}{ttz}usqsieiutytm|jl{tkzyymiakoqtjhlqmfpupuuy`iyooe{qjvlswlbvyulytcnrpyx|}vz}y{wwmr``c`[urxylhmwgnf}nunnemuu{}zqzxrkkuxz}yybb{r|x|vx|ul|zxs~|x}{vetjcegtvg~qrflytkauva_ef`t}noytu||rwkporrvz{{rqs~k}z}|s{wxulZ\w~zwnrlgmx{xorflzptnotvz{z}~}cw|urfz|xjj|h^cmr~xn|~|yxt~topjjgrdnxlhfzoYilp~vsrfp{|wom~oqgnjzoyZdlgy~iiywkpszqr}~u|p|x}uk_oanyz}~{fnazygfdldt||yhtwoyuywos|hvz{jjnwni|zivx|gst|~nsyrskn~~wo^}oePbv`Ncen}zztqyzvwyxy|pomu}~lauquqkfie}plu|~~w{ZVepqx\^oYWh`o{gkyt{kwonxr|~zty}wk`sts|y_a|y|p~jb~z}xvtyg{qNYqwr^r|elnlk|krpkrpnpkgmp}yuy~tkvstvg~lubdZhzz~pqz}jbqbWmtzdlidspvwor}zmnumfZj|nxkivnnvt{k{~uvhc~nysrvw}y~|xz{jVhzpyprnjokjljzsqoswlckhknf{w}q_wncgf{uztowslzzz{y{u~wzt~x~wgYihxmtunh`r}vx|zlloc`lqdv{rymozokoqv|kcjeoz~}}sw|yoxw~}uvgfeahx~|khniqgmxnps_c}r[ZYi}vlxzsqjmhnm|{~wwv}v~xz|znq}xzxtfanjtvszoggtig}inifsnbj{z}wk}{tv{kutv}{}yp{rqifrxwulwv|~p}{tnqeY`lw~kyqca`vvs{zifyxq|wvy~ymots}wzqklgogx|vrgv|vun}~x}}}~xzrqa\jgdj}yeak[k~wy|tmtt}z{}snxuuqipetyv{vovvvsftrjdpnn~m|Zdyylmmar{xtveszqyuqk{{t{v{yoqyrwjlpp}~qksqxpu}{y{tdsklwnqtokv}xx|zynd^h`Xc}unxx}{|rwyrtfptyyw}{s}~mphWUp|~xpgpwmusz}wvy|sq~~|yyz|vkjtibiuz|sx}~shbgtjdqrbn~~uwut{rx~uwkZ}bdq|zkjolxx{vkglvucexxqtu}wtdg|^abbc`cmwt{{{yv~}po|qz|{{~j}sgihkkrsuul{wsqv}{hk~xwc{xjjjaX]eoqgyisrpnmpgcxpy|yuyyymdqh{{yso{zc{y}yxlnky}mb]^vz}~ykaacpgVrvxuii_kf`\\|ri~x}|zw{tmhpjnx}{rx}~|zwsjtq}w{yf]e`p|zqz{zyabwojhreYtm^e[hz}uzp}~yqwzvwnflvpzu|t}v|zqkql|zxjaecgxuwvrzo\rtkmxu^czkW\UZ~ikw}tyyvkbjvnv}~{{}}{}noqwzzuuf`mwqz}wwzuyxemqeeonY_xbfgbxt}~siu}w{v~v{zooupt|~~ys{q~uuymu|}whbkqkv{vvrrq\jxonz|if|pY]^Ysv~wmrz}w~xzvkmvnow{|zyzm~wr{ps{{xh`hnjvy|z}jvyifqs`b~qY^^Xpypk|yy{tyvlovnoo~zt}xnurzpx~|yjbggdjlyzvbuxkhur^fo\`ZYouqqsxzuy|vwphkndko~wx}y~rqqrhzzvp``kihnu{~vexwnkvo]g{gZc_`swunqz|ssztrxslrwptn~y|~xvoyuvn}||znjngcgjyfwuifvtckn`d^^qsprpv}}wry~~thmphnlztv}}uxtsjx{wtgclhafg}}m||rkwudg}o]`]]puqzqk}|~v|zw{vhiohkltx~||p}stls~zvuj`giche{pw~showgdzx`]\Wgqmss{~ywyx|vxwkhojhljsyryopim|~wun_bf_diuyqyoiuj^lyd\`[eyyxqu{{tu|vuvlbjojrp|z}~zzytsuqzzzyl_fi\`vl}kxigsxmm}kY]aez}mudrzzp~twnyfYqmt{z{~~wum|}whlg|pwtaPV\_p{{z~yjbxxmynXfZ_}tktpy~wynm{y}yg^hq}~}y|~}vtpufqyzxysrirwdQZcde{y|zhvkcwna]_Tjw}xtu{wukv~|vmipeptz|p~|srshy}uv{tco`Ze[xus}q|ynnts]e~sZ[_mxqyqnyzszrxrq\bnouq{yz{~zp}zq{r||l~tunzc[Yipcw{oyxiqqutoo`eYyos|xx{ntx|zrdfhdbp{y{vxs~snu{jxrwn_nt]^fnzwy{~noloqftbajnozyzzvkp}tqw}n\plqs}{|txtzplzqljqihd_e\o|q}mglrgbvlhgvv}v{t~vx{|slrnwpyd_is~zwsxv|n~uwn{rumnurcRakhp{zuhjdupsnke`|{}p~zz{~numoqsl^fwppzywmvsvsms|v~uykg|vjfdeaatx~srjzjx}l_gpsq|}}}}{~t{skjmnZnnpolx}xw{xm~{sm}qdhbleel^dvu{ymbr}{vpkj]szxsxu|}xrmsyowpqfdxsvzz|qtzsoyu}wvp{qklk]P\tvw}uy|}ogqq{ptjir|}xtz|er{pgawn`bgdh{|t|n}r{xv{|msodbZbV_srxt{psvy}yg\f~zyzzprt}|nle`qmpoiu|p}{xjlznorxxy|}jk_sh_mjnks|}stxsphp]mx|hwoz|zrm}wmq}xroocYkzq{~}vnz{|yywzfkqh\WiobY\gfq}qvn|jut~vz~{}||xznqx~{nnpdcblbj~||~pvz~uow|u~ypv{xebkkc[WU~nwzn}sxdgp{vjmkkp|uwzcxzo|rtverfv}z}|}}}{x{uh{tw}x~q{qkixmmXfvfksvoj}udjyimlu}szz}wp{z~}_rvXjmj^Zfpltjt}{xkysjq}cUXgjpf\alkrm|}sr}{xvuupz}hozh~|xww}ka`tinquwuvwpff}tdvru{{ztw`_{phfvocV[r|{vw|~jvxy|vy|jryitmYUgipqeo{~z~}{xyzzsv|yj{}}osvjqesfiN^c[ed~pqrtvnrsxv}wmx}xaluebjwr_]vvwz{{sz{sr~xycorvaVV_ce`anus{p{ttukk]mytww{olvwuuwmykturwq{||vmlnr~x}|{~{fq~xvpkfqufVT`qdXU||}stinvz}~~wjsssfUbhmsaanroyrqn|roz}}govhmgsyehXigdsqxwxifhm{srwtvzxt[ktddiofTb~xu|}||xrrnrz|z}y~gmpvk]RP[osjg{zxwpzpx{qem}|tun{~mfmzol`atfrntv}|umqu}}puw{t{pybYo{q^XWgcVUiqutyuix{{}~tgxqrj\`hktpdoz}~~ufy{motqdh|szzu}jkgurgcZve^gglt|zspty}pwuqw}x}nnYtmcefd`_u}|~yx||~vr}qst{~{bzsgh`ba^beeYbssw{utzymdxvtrs|wup~yoq^zqaliqlqw}~zvu{|zqvmw~nZ`{yfXY\gYR`qnvv~~}wloov}{{w{{qkbflnskdnrww~zxpovyrbkyzm}tmwjkmriq_ez[T]inu{|v{~~qx|~ryq^rwb]ingZWkprxxyo~kqstv{||per[g[\uulctpsqaolljjxtrmuy}}vmct|vs_|~mlvrz}h[mwg[a{m^jp}~{orYStkuhck_rv{{|pmt~nrx}wgfr_vuo}vxp^qoohp|xws}}|uxjdqyshmxpadp[]k_n_beowtzorvwtfsnjmY^fdkez}spvnnguqgox~}t{}sjqzw{z~}iidY`Sc]ozupfs{{~zrpz}ecrh][Tnzphk~|rju~vvtsy|ynrwnzrwpqwvwmznmakX_hotkl~~}pu{rryjbnka\\rqx|vsw|jxynqnww}}~nhrrqtvuw~zrmqlc^smsw~tn~{lsy|}wpnsgVftpj^]wvt}nh}}xzusmyntw{swqr|z|{tvx}toxgphoogmkmei}qq{zlj}prw|{k_e`Z_dzoyyz~ysvpysp~wsxtokz}ppo~zyyxee\nfnyrr}u~v}zqw{}mTcztede}~tzxrzzyndrjq}ty}letvwy~|synsnutaipsjk}{lqxxqt~tliqsgbjnigi{z{y~xxzqyi{~wq~ynpuuq}znrx{pgef}tuv{wv{skzxswy{~|x`Sesmchq}suz|{on|wx{uqyg}yz~{{ow{{uo~yx{{yw}tjvorbbs{rcg|qsutjy|{nprvmejkkkr{}x||wqz{zwzymrwgis{sq~tmjlzmmezysy{zx}uiy}uwzzz{jVf|yb_fwt}uw{yrnw|uy}oyjs~}{{}pq}{zv}qz~y{yuysj|z~m_mtsjeuwmrttju|vqomrmgfdlpx}~}|}x|~u|~ouyoopgirsoo~qghtvten}tzxrmvpxytlvzw]^t|jaivwt}rvs{x{~qvvmtv||piy|wtkp|{|~lw|xcly{tki~plszyrrskhlpknkjoov|vzw~yywxv}|mpiuysy{}|nkomw}pmx|ykomopg~rv|xyz{delqf^mkn}~p|{}w~~|zrrryrx{{lout|vqw}v}}{u{}{shhtvioyzwwme{}ty{k}tjrusd`no~|vy}|z|~|||xzy~wxvrnl}}szxwsnms|spzyuuynmni|ru~yx}r{{zhbiulhurrrxx}x{{{quz~qw}}{kj}xww}~uy{v}~}w{}xzjiuwgo}vsvmbww|zkwhpuqicno|yy~}~~{yv|zxz|z{wqttsiu}uyys{zsqvyo{xuv~sgudoosz|lw~u}qcctxkuxtwww}x}rxzzwn||u}pft{v~|yxx{t}}|{sriqzjf~zlrpbq~}zkz~klupnhpow}x~zuxys}{}sy|ynnuzkqzvxxqvzwz}p~xtvxfxxeiis|hqsztgbt}pwyxyzw|x~rw|}xl{ypyz|qfuwv}{z}x|{u~pvlvzhhxhpmdu~{yl}kmtpmnvlx{zyuyup{y~wxtztmk{yirtvzupz|wuxwt|rinegeywdzxtzpgd}vsxw||{}wzm|ouxzrr|zz}~wknxnyyy~}x|u|{vxsr|odyjgpen|{zmzskrpok{nm{}~{}uyuw{osvwtuvwphsiopsyvow~z|wzuywj~rgf`r~guzrxrlbzvowu|{}~u{m}pttxro|yz|{xmoxgttx~{w}u}xwzxwpg|iflfp{wyp~tntpok~ljvy||~}u{vsnqow~ztyupfvzfnlsxsoy|wy{v~somidav{~}k}wvxrkf|mqtu~}x~}w}|q|}o}|svnsy}{zvjtserqx|wu}}v}tvz{~mkhhhgvztxrwsvqnlkkrwz|}|t~w~u|xy}us~{_u~y{siswktu}w|zv{rxxqpslq~uyw}otrtljsutt{xuuw|tyq~uv{yz{p|{pvqudowktzj|kql}~v|zruxtmqvzwu|ifhfhfzkwv}|x~~uzp~}py|tftpxplulqsuwp|}psxqyq~zk~rwrwmquqjq{vsv{w~~~v|}z{z{y~z}~|v{tvuydnoerue~lrkzy{|sxzsntt{}}{yynniddh{mu~s~z|~sr{uhu|yzhztvkhwpoqqvnyzzvu~utrzu~gx|~txppwsllvsuu{|wzz}}{}q~xz{||~v{uyuzilvffobrnomwvywxsp|uw|uv|vkzfedurnwn}z~}uzvtzivsvvqyxyrentlupvnpxxsuwtst~xuk|xlusrjvurp|xv|~w}qyz}w~t{}wvwzohwnekbdrkjryz}y}zu|xpw|tyzzlnjhvuky{ky~yyxqwktrmm~wy~vhmtjplunmttsr|zzvyxwl{|rwrtkwvtsy{s|uzyvsw|}x|ovy}y|zyynnxmdi`i|kgfvvx|~zxrvxwsx{xsqkp~ul{}uk|y}ywqti}pll~{vwksrkmkqfoptou}y||x}}ru~t{|zzyuq{tvt}sqw|yxtwuy}z|y~|wovtyu~yoywiee`xtfbi{wp|suxxxoyxtys{sq~ru}xht~u}z|~stmwuniz~tu|}uu{ookpefjnqp{vzyz{|ztvu{~|~wyyu}vntvtrurst}y}z}}|qvrwq||~|w|offbwugagwrku{n{}}zqz|tmqp~xxwxziszs{z~~w{|}utp{xpl|~rpvz{zvupsgegjllxtxwvuz}ywvz~}ci}tytij{oo|rbWejsxz_ld_msntytuel}z{jQpt|xm}qhvujxsg\iqq}eY|pb_b^hZbvvv}um{ztwxztxqllu}Rko||}qxvhiy{xYzkitehjhxqn{y~~ui|wc|~xt~xvzwxykpx{~ehbfaWWsphfnk{~ym}rvw{hgpri\Yp[q}w{w~|~ympwvnzl}w}tdeub{op{p_fegeXh~p|t{qwtu{~ykdpsuvkngk_Okfcj_gvq}i~qninn]fgjaYWd]i~v{xoz{xu|~unl{qz{~lnonwbb~o}u}yyvrrssxwuw{qpt|puoqsYetctbx{mvvwyssryignmm`_doe|{x~u}yex~p{h|v|{xuyysgepysvpu~rdmitq]w{us~wuw|ntswkhi|~qmnku`Ztclch~dyuwiwiliohYbchZZ\rf}}y}sxwqx~ry{zmms{v~lsqxybu~roxt{{rq|~q{}p{{oqu{qoq{tvs|kb{lqimjzoosrwp^fin``ayl|uwz{}lsqyi~q{{ujptqefovzqzxipnvucz~w~s|{~wv{~}}}~|glouhhjtsrpubexgoar|exwtjuimjpdW_eeXZcvh|{}r|~q~tpu{qkkxsvt{pky{s{xqv{qpr{v|ou~{{}sjqwsjl||~y|ug}xrokqyzp}utttucdioc^^tnvxw~{z|{qrvyk{nv{}|wgmrqdbjrx|psqtsf{xzs~z|utyyy|}{}wejopbbkt{|wwteuzomcrlvxlqrnompa\bi`XWkkjt}{yuuzorxyjgmtz|yywk{yxpz{szxnk|x~yvztt|yzz{jkqvieixryzwjm}wrvwuxpchnk^[gsew~|{~{}ypzsowv~t|z{z}nhnsh__tpt}zywvvnq}{qx{~wrxyyy{{zzxzpejpj_^owp}{tm}ummnrvwkuuppoqc_ej`XXmfk~r~z|vuyopvxjekq}{yq|~yqu~rw|yljwrzxvzv|qx|vwvxmflqjbdzy|{z~r|r~}|q|wxvxhgloc]`tfuv}}}|ztzzon|xq{xyxvghnnb]gyj}}zyup}{uxy}tp~z|ytyvvtvlbgkf]`uvu}wu{ouosxtjt}vpqoqe_dh_X\qgou{wv~u|~|}nlqtidlt~zu}}tu~yssxynjstz|snwqm||ursrqcflmddty|}ws|utyvvvrehmk`^nwk|~~~{wuvtzo}wnr|ttttobfjh_avzt}}zvwz~}}vz~yqszvy{ulv}wpqoqe`ejdaiy|x}|qmyvpiv{uopnpbaeh_\fyj}~|yt}wt|xyxwijpqihyz~zy}{wx{~{orwtllz{|txsoxpgmwumonpiagljfnzv}}wo{|uwtvjfjmeak}n~}}}xwzsm}unkxzspqppbchibcut}yz}z{ux|yrtytuwphqwsknknd_eiecmy~|~vo{uokw{toroqdchia_nzl~}~uyqtwwwwsgkomhm|zy|zt~{|tnsunjtv{zyt|jw{ogfqtmjmlmacijfh}~yyrwvxwxqgknich|qy}~zy}uovumisxsmqnpebgicap~q{}yy|twzwpsyrtukentpinjnc^cfa`or~~rumoy{sstsqdfig`buqp{|xy}tnw~zsxuwmglnifrsv|uv||~||opsqjj}zu{u|pm{sicjqphmkng_dhdakt{wt}|x|x{njmmfdsxl{x}yo~|phkuvnpppmacfd_dxpu~{}zv~{twysoyv~|~oy|pgfpskjmjl`_dd^`tuq~vunr{{rwuvrgikgafxlty}wy{rmu|xrxtwngkmheqpw|ts|{z{~qnqqkjy{p{v{tjvuiaclnfjkkj_aedag{uzztzx~z|ulnpkfn}m}|}~~zqu~tjgouplrmqfaefb`nxky~vv~~vtwwqpwzxmxwkcemofjkij^`dd`eytv~xuns{{syvwthjliel{nx{~wv{pkqxupwrvnfjlihsry|}spyzw~x~smpqmkxoz|vvvinuj`^glffkgmb`egehyu~vu}y{~y}pnqpkm|{r}y~ynxznefnqimnlobcggej|wuyzsv~y~stvurw|~~wqkwre^cjickgjh_bgfgru|{~rntzwsztyqjmnkkwotxukipuooupvkhlnloxwxppx|uy{w|onqpmq{u}z}x~|ryzneppc[^fhaihiladijku}ysx|xy~xoqsppzs}z{|nq{pebinijojpgcgihl|~txzqs{~w~~|ssvusx}}~~}u~|phtpc]`ggbkfkj`dhijvv||~rnuzvu|u{slopno}q}~ryrhhoslrspvjjmoou~~~wtmryxs}wzxmoqooyp|}~zy{tt{tghrh]Zagbekfnfbgjkqy}uv}x}}rrtsryv}~~z~rnzsgagmjhqjpkcgiikypzqotyt{|y}qlkkoz|srt~zx|vu}wqbfmwvnlhgtpxxpuwxzw|tv{~u{}uv}nuntin~~|~t||{|}|y}tvwuvs}qmpw|w{vw~~xvpluwyt|z}xu~xje``ro`e`eibfklozr{xz~}}yx|vnhow~z}{uz~}ot|vu|~kbinvmtpgcpqgcirss~x}{onljm|tu}z{zrywv|z{}p`^ifhsw~uqttty~u{wmhcfw{vukkohrqrztrzuibnnhjt}{yy~uwxwysxzvrfmpwwx|ssz~{zxw~vxseV[echw}qlkiioyhjoq{}yvwnmury{v{splkpx~~zxt~x|vpi_ilyznnwmdcjoltxrzpjiggozr~s}|xyuqzsx~z}rwth\akhjuyvxwxzz~oiffn}zoqskust|sryshbnoikt|{zzvxxx{qv|~vsoensyzx~trx}zzxyrqodWXhkmxzqpnmq{rewlv{yutpjvu}z~vv}}|vnmms~z{}tz~x}{skiceuxwmswldflnmxsrwkhhinztxvs{}zxxrsyqz{ztnslc\jtsu}{zz{~v~|xzthgjq}ypwroxux{psvneettoqw|x~z~xyyz~~pqxzvpnkiy{x{|stz~|~yyz}silf^Xeuvzyusrsy~jppowxurqkr|yyzuw}||z|{onpvz|wvvptupigefx|}rszpgflomwuowmhijp|vuyqy|zwxqsypx{y}rlqkd^lwvx~~}}}u}{|~|~txrhimu{s{tr{wzzpuunehvtprx|y{~zzz|vrypvwrmmhm{zxysu{|~{yz||y~}xjjjc[\nuu||zwxyqifqnuyxqx|wvv|vmsz~}}}vp}}}|ytmuk|mrwvqolgstxztnxtbaouq|wrrtzvqvvytyskcltppvtkqnpw{xwuq}|t|{|{}zyzyjiivifmkf`isoovzvswzvuz{wtrktvvrgmnr~~t|wpppt}~y}~{rnup}|yqx|{vkcgxxvsmhe_gkhx~~umuvrv~}yxwyzypgomxwoozvrv}{~~{m^biir}qkgfjsqbwnnsuqmh`gffw}~twxqjfqpjlt|}||rmilu~{ut~w~}~~wocejhzoejldbhpsxw{}sollq{|owvz{wuqlusrvkdmmltywuw}{t||vrztzyzz}xmgdiu|ztklqhrz|~}{tjosnnv}zyyu}wpgmnnwqzzssz~~|qd^hijuvpmmswjfykosrnjdbjcky}{uzvqiksoknuz|{yqmkp{||uxw{zrjafll}sjpqigkqsyv{}tpmnt}{owuxzwtqmvur~}tjcmppv}zxz}s|}{uq{wz|y{{z~wlgekxyrownq|}z{tljtsqu|}|{{{zz|~{tohitr}tv{vy~yyog]cpty~wsru{ygprimpnif`flhu~wvzupipwrorwy}zx|snmp{}zv~zy~}wwunhdbpu||smutmkost|~s{yqons}zssswxusppztwxzumfftyz}{{yyy|~zwrvzz}~yy|||xqvmhhmz|wqvypyzz}vpipywwz~}}t{uwwrmjguz|zu~zy}}}{stng`csy}|xvy~}kmviknmieafojuxw{vrlpxspqvwzxu{sons~{x{zywrrqkfcdtwvrx~{}wrrtzqo}nostqnffomzyy}|uuytoio{|}z~yty~}{yv|qrvzysqowymssljkr~}~xjvlnsqpvtpiiuwvz|wzzz|orutpmhovqwrv~|}yrxuxzswuojhtz{xowu]Z^`_^\blfp}~|ztjjqqty{y{yx{wvxxxossw}xs|~wuwxuros~{pgjluskpidbcjqoassknqplgbiifwx{{vqkswuw}|vx|ytvx}{y}|}shjjg{}xne\`c__dknw|qvysolmrxqksortrollupq{qkrtv~|z}w}vy|tqu|}x|umfagc\ipty{wsvuohafhehpwyw}zxw{wt}zunmslsyw~}z|{{xu|xwjimkp|}upnqsj^snilnmiebieapyy|{vqksursx~{wx~|~}xyxy~z~{~~{sjkmer{shfjfbejnu~tt|wroorvqf{zqrtspmktsmy|ukosqvx|zyx{w~yttz~v~xqiimcdosw{zutwsnfcihgksx}x{yz~qzzz|{vqkorkwyz}z}z~~{xvy|shiopu{vuwxmbwpikmlhdbjfcr{~z}|wrmswttx}zwy}~}yyzy~w}~|}vohhpkrypjoniilpt~zrzytqosxxlrrprsqolqxpt{ulkswzzzwyz|xyroimwvvz~}xrwuvuronvypyuxrtssvz}uoipzukhpqkv~}{uz}|spsywnz~~ztntxuv{{ddvqqoonr|tt{vyvt}{}|~~{lcdi~upkmrqqmpxywxz}~}wtrttrppy}w~xsnu|xuuw~{~u~rquz{}vvvt|ud^uyifjnoomqyqnvvvx|ytz{xx{~~welxsvyot~{y}zvyypf_bfmxsmnnhaabdnsiowust{y{pmkiotqrhbkoqsustz||zwwuoikmotz~}ysomlntmquwonomq{|~wkpsrqonoz{~}~~}zh_tymnxzyxrqt|~{z~zhit|rjoxvvxjhqtz}{xujaupffijjkoywr}||yy{x{}{{|~~zwutw}w~{yyvngdkop~qfdcfmottleccfoqiqyzz|ropijotz|yxwzz~~}v{z{~xsqtz|tuysmgcdkrhcjklmmlnsqpljpqoqx~{xxvxxtqowyu}~~}{z|{vunhcalux}y{zwx{xeeysb^`cehmx~uw}~|~~}{}~}zxy~{}~zxxw{vuopqmhcelgjzwspovvojikr~zv~pzwtuuttx}~{tu|~w~|}|zxz~w}|{vx{vsquz|tw|xtnijsyv||yxwtuyxwusz|zz|~x~xstusqpvzrv||}|~}sutwyz|}yzvplehorv|vlrjkopoot{tpx|~~}}z}ywy{xowzwx~{~|}}|xu{}}}unmkgcbipmx}z|}zxx}xu~stpqqqrx|}zurssqrqw|pxmlpsuw|xw|~}{~~zwx~}v{{yyyy|~|yuy|zyy{v|ooytvwurpuzst~zyww~|z{}~w}}wwxxz~~}|vsnnw}tzplnoonpwyoqxyxwtppqpuw~}x}|}{rtnnnosz{|~}|}|tonmkjnxzv|ywxuw}|}}xjcwumnrtvzy~}|zwvwtqnjouwy|}wtzstwwwx}|zw|~||~}{yy{xuyxvtroqroolnvz{{|}|v}nw{keffefjtxry}~}~~~|}z|~~zx{ywvsxlfx}nhjoqrsx}upwzyxwttwvxyx|~zwuuy|t{~}~tzzrrstvz|{{unmljimwyu~{{xz|||~z||nhzqfcegjnw|v{~|{yvuwtrpmsz|}|~~yz}}}{tz|{{}|s{vwyz}|}}{zwvyxusnosrpppszzqtvovkijihiowsq{z{{|}}xttrmkghpw{{o{xkghhggjrohouwwvtsvuvww{}{{}ux~~~y{zxyxz}t|}kddddekvyu}~}zxy~}rv~zki|rhfghjnxzv}~}|{yz|yxurw|~|{}~~}|~|~z{wv~{zxvv||v|~}|{yyzwurnqtsssuzyry~u}xqponmowxqv|utpqppt|~|{vrojnsuy}wxumllkklsulksvvvutvwuvvx{yr~zzzyz{{}~}}pkigddiojhs|}x~~thqslllklq{y|~~ywrqvy{~{zuuutty~w~}tuzyxwy{xnr}{{zxy{~||}zxurvyxxxz}v|w}zqoonmpwyqs|||x|vutrsxz}|ywxuqnijpsvz}yurrrpqv{tntyzzzyz{xwvtz|zouwttrrt}~}|v~uligedfmoilx~~uky~pkjkjms~y}}}{wtoosuvy|{{zyy}}vz~~~||y}tv{|{z{|xnr~}~}|~}zuwyyxyz~v|vyyolkigiptmlv}~rz{rpppqu~zy~|yvvuqoljpvy}}}ussqqtzzqqxzzyxwyxvwuv|~~~yv}zsyxxwy~}|}{{r~oiggfglutov}ok|xkggghlt}yty~~~~}~|zxtv{}~}}{xxwvx~ytz~~~}|}~|||z~|sy~~{r|~}}}~~|wsvwvuuw|~uqzvyqonmmpxxps{wqtoopqt{xz~}{zxwwurqnpv{~}wsrpnotxqjptuvvwy{{||{x}yowwuvvw|~{}{|r}qihgfgltuou~}pm|pllmnrz~w{~|{z{xvtpsxz|}zxxwwyzv{~~~}}~~}}|z~~~ysy~xq{{{{|zx{|{{{~wwwsrmlkjlrxsnu|~rxzqnnnot}xv{}|{ywxvsrnmrvy|zywuuy~zprwxxxwwywwwvx~y{zprxuuuvz|~x~|rzsjgfdeipqknw}|ol}yniiijnv~zu{~}}|ywtprvxz}~}{zxx{vu{}}}||}|zyvv{~~~~usy||{{{wnn}~~~}xxzzyz{|uz}s{|romkknuvnow|vqtnlkjmszwquz{zywwwsqolnswz~zxvuw|}tpuxyyxxyxvutsx}{}sm{}wvvuw}~~|~~~~xx|qq~rljihjpuplszxmtvmjihinwztu|~{xtrtwy{~~}{ywx{|styzzzzzzwutrsy|~yz~}vlo|zzz{~zz|{{|}}uz|s|uqpnmpvwomuz|~unzunlkjlrzysu|~~~}|{xurnmpsvz~~|ywx|xqtxyzzz{{xwusv{~}~ulsxuutuy}~z{}}~y~xpzyokiggjqrjksy}un{umkjjlrzztv}}zxsruwy{~~}|zyxy~}tw{||||||ywvstx{}~vx~~}{tkp|yzz{||}}}}~v{{szvqomlouwolsx{}~ypxyokjijnvxrqw{{{zyywtromosvz~~|yy{~trwyyzyzzywwuuz~{zokz{uttux~~{|}}}}wv}|ro~skigfgmsqkow|}qo~rlkjknv|ytw}~~~~}zxuqquwz}|zxvx}wptxxxxxyxwtw}~vkaiz{ogeegjpzzz|wxzz{}}wz|zv~|zz||rorssrrsuuuvvx~xnkz{xwsmkwlr}~|}}}}~z||yvtuy{unqvxz{{{wrszwnrwollmou}~}}zwv|umwzussrsvzxposuuvvxyzz{{|{rq~~skgfjs|{|}}}~y|~xsnms}zuy}~}{ytlgo{zqkjjlot{}z{{y{|||}~|trx~{zyz}{vwz{{|}|~wkecelx}|yvspmnoppqsvwrpuz}~~yw{yxwx{}{uuwwvuttuuwz~}vw{wwxy}~}zrlou|zuqonoqpjikmnnoprrrrrsw|}ut|{rmkknt}}}~~~~}zvsponnrw~~~~}{xupihpwsmiiijmrvvuy}}|}~~}}}}xstx{~}|~{y{}}~~{|rkgeglu~}yuqppqqqrtuspquxz{||yw|~|||}~~zxxyxwvuutstuy{x~{yyz|}xqnpsv|zvtsssplmnoopqrsssssuy|zvx~~xrnllnsz~}zwtqommnrx|zwrnnuxupnmmnptvvvy|}|}~}}|||xttvx{~}|}~~|~|tmiggjqy|xvvvuuuvwvssuwyyzzxwy~}|||}~{yxyywvuutsstv{~{}~|{{|}{xsonpsw||zyywsqrrrrrsttssssvy|~}xwz}{vqonoqv|}|zwtrpooorv||xtqqvwuqoooprtvvwy|~~|||}|{{zywttvx{~}}~~~{{|ytnkklou|~zxwwvvuvvvtsuwxyzzzxy~~}||||}|yxxxwuutttuvy}}|}}}}}zxvspoquz|zzyvssssssstuuuuuvy{}}zwvyzwsqpqsw||zxusqopqruy~}zwtrsvwurqqqsuwxxy{}~~}{{{{zyxxvtsux|~}~~}yvvvsomlnrw}}zxxwwvvvwvuuwxyz{{zz|}||||||zxwwvttstuvx{~}~|zwutrporvz~|{zxvuuttttuvvvvvwy{}~~|ywvwxvsqqrux}|ywusqoopqsw{~|yvuvxxvtsssuvxyyz{}}~~~}|{{zzyxwvuttvy|~zvuutqnmnpty~|{zyxxxxwvvvxyyzzzzz}}}||{{{zxwwvuttttuwy|~}{ywutrpopsw{}|yxwwvvvvvwvvvwyz|}~~}|zxwxxwusrsux|~|yxvtrpppprtw|~{yxxyywuutuuvxxxy{|}}~~}|{{{{zyxxvuuwx{~}ywwvtqonnorw{~}|{zzyxwwwxxyyyyy{}~}}}}}}|{zyyxwvvvvvwxz~~}{zxvtrppprtx|~|{zyxxxxxwwwwxyz|}~~|{yyzyxvtttuwz}~{zxvtrqpppqruy~~|{{{zywwvwwxyyyz|}}~~~}|||{{zyxwvvvwy{~|ywwvtrpnnoqtx|~}||{zyzzz{{{z{|}~~}}}}}|{zyxxwvvvvvwy{}|{ywvtrqppqsuy|~}||{{{{zzyzz{|}~~~~}{zyyyxwuttuvx{~}{yxvtsqppppqsvz~~~}|zzyyzzz{{||}}~~~~}|||{zzyxwvvvvxy|~~|zxvutsqooopsvz~~~}|{{{{|||{{|}~}}}}||{zyyxwvvvvvwxz|~}{zywvtsrqpqrtw{~~}}|||{{{{{||}~~~~~~~}|{zxxxxwvuuvwy|~}{zxvusrqppqrtvy|~}|{{{{{{||||}}~~~~~~}|{{zzyxwwvvvwxz|~}{ywussrrqpqrux|~}}|||||||||}~~}}}||{{zyxwwvvuvvwy{}~}{zxwvusrrqqrsvx|~~}}}||||||}}~~~~~~~}}||zyxwwwvvuuvxz|~}|{zxwutsrqqqrsuwz}~}||||||||}}}}~~~~~}|{{zzyxxwvvvvwyz}~}|zywutsrrqqqrtvy}~~}}}}}}}}}~~~~~}}||{{zyxxwvvvvvwxy{~~|{yxwvutsrqqqrtvy|~~}}}}}}}~~~~~~~}}}||{zyxwwwvuuvwy{}~}|{yxwutsrqqqqrsux{~~}}}}}}}}}}~~~~~}}||{{zyyxwwvvvwxy{}~}|{zxwutssrqqqqsuwz}~~~~}}}}~~~~~}}}||{{zyxxwwvvvwxyz}~~}{zyxwvutsrqqqrsuwz}~~~}~~~~~~~~~~~}}}|{zyyyxwwvvwwyz|~~}}|{zyxwutsrqqqqrstvy|~~~~~~~~~~~~~~}}y}zyzyxxywyzy{zzy~}~~~yy{z}z{wxxwtvuqsqppssw}|yxwz|z}~{{qoxvkmnpprrsz~z{~|vu|~|wt{zyyxxz{wupmqtroursstw}y}~{y~{vs{xv}yr{~{}vm|xpw~~|ztvwvzwtso~~v|upmqx}|z~zsv|~x}{z~ux{z{xyosyqt{}|zxtx}{}u~|zw{{~wvvr}znsyzyz{tyv~xyxvy{{xuxzx|~un}z~|y{{~x}ztxu~vxz{suuty{u{xp|tooux}nmxuvz}{yrvz{y~tyvtsjou{~z}w|{{vx~}y{{wmswpzyxzsu||puuouvrqtqhmrnnovuwzx~~}xy~}~xxw~x{ztsnow~}|}{zrt{q||nhfu~zy{qllkhv|~p_dpmrprrq|zyxxyy}w~}zrt}stpssvxu{}}|r~}}vlhnei}wnrqwywpkklmx{quwoxr~wzwxqt}~s|~qp{{ysvx{||}vz}wt~vuzz~lgsshku{xxkwxvyxsrzomntws~zzp{w~{qw~yrz{ww{zvt}xx{s}|zur{|~}xw}~zx~qemy}qptu{}uqzxxqnmu~qosw|ot}yyqr{~ryxy}y~y|uxxvuzws~|s~w{~|r}{|}jip}yuqx{}svy}yojlsxmmvysm{}vpr~wo|}{}y{yw~y}wuzumu}vt}yy|~~}zxjl{{uzu~~|yrs{}slenwrj|wwlp{v~srtz{{|xz~zztvvwnp|tz|{x|~zxrlrxtvv{||vsr~ujjrwhnuvpvw{{tv|sy}t}v{|xxyyulpy}v|zx}{zwzzu~powvryq~~xqs|uftwthyuxour{zszu{x|}}w~{zyuxy~vntz}~}}~sy|w~vuvopurstr~pt~vlxvufy~rxqut{znz}vzzv~xz~|}}|ryurs|x~||}sy{{|ts{upqvtvuvou}umxvwkwosrpr}}wpy|zxv~}{w~~~ymuwvv{}}{||tz|}}wrwtpntsvy{~tu}ymuwvou~mruns~~yrvzyxy}u~}~|~~mr~}xxwz{|{{{v}}{|yqvurprrz~}{s}}{nuutvw|ulvom|}|xv~{u~y~zy{~wzrlv~zz}{}~}|v~v|{|w{uuqstppv}s||suvst{yyrrvjwzx|~}uz|w~|{z|ww{znr{|y}{~}}~wv{{~y|s}zyutorwrov|u{zwzxss}}xuoxlr~~{y~~~qv}vz}|wux|pp{~||}{v}}wzzz{~|rzxxvslpxvps~}w|xy{ysq}uxpxpq~|yz|~qvxz{~|~yuw|tsz}~z|zyw}x}yz||{rxvvtsjoyxpv~}z{vz~ztrqvqvrtz{y{}}pw}y{yy}wvx~xuty}|~~x|~w|zy|{{y~svuvupipzxpz}yy}zysuzpwrvvxyzx~}{q||~~w|s|xw|{xvrx~|}tzz|}~xx~{wstuuwniszvt}zwzzxu}tqwpwzwzzz|ut}|~t|t~xxy}ywtsw}{|w~}zz}w~}~zuqsuxsjnvxszy~xz|{vyovtq{{xzy}{|t}}~y{zpz{xy}{ywrs||x{z}ywy~}}{xroswvmkqwuvwwy{{~xwvpxotxyx}{vy|}{|v}q|zy{}xywrtz}y|{z{~xz~~zvypptwslmswtyt|{z||vzsryn{uxx{~w}}xxvt|zz|zyzvqw|x{|zy~|y~zv~uzoptwplnuwwxr}x~|xrtyovwy}{y~}~x}{wt{{{|xyzwqy}{|{yy|~~xxs|s{pptvnlntw{ys}v|ytszqwvz~{{~~w}|}~xtz||{xyzwr{}}~}~{xyz|wv~r}pzrnsunlmtx~yt~v}}{vqyt}zux{}~}x{||ztv}}|wxzyty~~~|{wy{zxzw{t}nvuortolmrw}uvz~{zqvy|~vv}{~~~y{y{xxr{~~xwz{vx~|}{}ww}w}~v~ywxusowrpspmmpu}x{v|}}}vqx}~{t|z}}|yzwt{tu}yvz|zx}{z~yv|yxx~~w|u|xorvoqqnnos{|vy{}~zsu}t}|x{|zzvztxwq{{wy||y}y~z~~{v{yw~|}~x}~|uyxrnvrqpnopsz~xyz}|vs{w||wy}yyvxvuzrw|wy|}{~x~z~~}~|w{yv|~~}~y|}{xxutmutqonpqr{~yyz}|ws{x~{uz}~xztyvtzsw{wy}~~}w{||~||x}xv{|||y}|xywsuluvrnnprs|zxy~~|wu{zyt|~|xyr}uu{tx~zxz}~zyy|~z{z|wv{x{|~|}w|rttmvvpmnprt~zxz}|v{{~}}}vu~xzws~tv{tz}yy{}v~z~~|{~{}yvw~v}{~~|~yzzouqoxvnmoqqx}yx}}{w{}~ytz{xzr{zsyyu{{yy|}zxy~~x}}||wvy}x}{~~~~}|wrqvnsyrmmoqt}||x{~~z~|}|uv}wztv}vt|wx{zyz|u}}~zz~~~xvw~}v|}~~|~w}{nttnwxolnpqx{~{x~}|z~ytzzwyr{~|uu|wxzyy{}zx{w{~{wvwz}y~{~~}}{wvnusoyvmlnpszxzy~x|vt}wyvt~||tv}xwyyz{x}~~}w{~zvvxz{{||}~{~yytnttoxvmloptywzx~zuutwtzwp~~zuv~~uysv|uqvz}{wx{||~|xz}~zxz|r|zvsx~|}}z~vy~smsvrzzrqtuz{y|{~}~zu}xz~}wkryzspuwqywy}}|xy|yvvxuty||}{{y~wyuoqxsw|vsux~}xvqow{xy{w{r~}ytu|wyrtyrtrlw{~}~{y~zsot|wyxsonlrnnwpifopmsqlmotxs~ztyqmoloy{yry~~{x{}v}{z{ttuzxsqqw{yxs}{w|}xxtv||}z||y~~xw|}{xwx~}ryys}ytqv|{xunvrnrtr||}~wrortsxp}~}vpkoqlutnigpsmrsoptyt{~|~~yotoilqqxvx}}|y|xuz{ussw{tqpuxv}sy{ty|x{xt{|}~}zwz}|}|zxxytvwxyzsqv{|zunvrmpvvx{~~uqosqqypxzrjppnwtolhovoousquys}|z~~vpumilrtwy{~~}}zzwx~}ysssxzsqsxsw|qzxt{x|~|xv}{{~~xwz|zz{zxtv}zwqty}~~|{ptvonqwwx|~}~{tqtslutn}zoormwwrolksvmpvttxsy~|z|}~}{rwqkjotsw~~~~|x|zxzsrsv|vstyrtzrszuzw}}zwz~x~}~yxz~zz~{|}{{stz|yrty|}~|~}rwwpoqwxtz~z}|~}wuxsmtplu~strq{xtqnlswnmuvvvqz~||z|x{~{wzsmlotrpy||~yxz|}}zsrsw~~xuwzrtxrryz}|wzu}}{yyxz}}zyz|zt~~}~vq~~y}{tty{||z~txxrppuzurzzz}|}{}yx~|vtrnxzvtsqqxwnqxwvkotsyuwz}yv}|z}ntspoqvzur{}}{urz}t}wsqor|xvzvrxuvuyzuz|~{{}sxlikmqtoottz{|xxxvtv}~zusuzzu||~vqtuqgbgcfhkvupv{|ut~{zywuwztqy}wmrsr~}yyz|~{z{xvy{pigjomfluuz~}|{{}~{upzsw}tlils|ytxtx{yz{~ptvtzurppontx~~|z{~xsy}tuvttuvwy|xwz{x}}smmt~zopjipmnvsow{{woy}zzyzxuvyspy{opvsy~|||}~zzzwwxz|}uporurlpz{|{}{yz|~~{tp~~swxrmlqzuxvs}{{}~xztpxu{zwtrqtzuz}{~z|~~vvz{qrwwvvww{yy}|z~}{zvomr{srniptppvts{}}|qv|zzz{{xtvyss{uqxtw~}}}xsxywwxyzustvwrnw}w}{xx{~~|vr{}xuttpnry~wzvs|~z}~{w{usxty~{wtrwvwy||}~~xyy~}rowzxvvv}{|~z~zuuqoszvwnlswsntvuz}{sz{z{|}}ztuzwtxtwxsx~}|ury{xutx}ywxxxtpx{u~zwy|~~ztw{y{trtqquz}~{{tx|x~|}{wvtysqy~yuut}|x}}~z{zz}zpr{|xusy~}|tssqquy|~~vpuyxpnuww|}~uz|zz|~|vsx|wutzzrt{~|{rw}ztpr|~~}|{ysu|t{wx|~~{vzzxwqtusuxyz~~vy~vy}|xsw{rot{~y{v{}w{}{}|z|{ss{~ytqx{{|~}usutstuvzzvz}{smtyxy}}}}w}|zz}}xtw~{ss}{rsw|}~uv}|uopwv~~}yv~}v}~~|xx{~~{x}zv|qrwvz~vtxzwnkuywy|}}~~|su|tu~~|ww~vtvzvt|~~}no|js~~~zx~|z~~~}}yxxvz}|~wy|~{rpz}~|}{lp~wuvxyxuru~{wvvzxv|~|~~wwzxuvz~||}{y~}wqqrw|wyrmquxvnkv|yxy||~{~|mu|uv}{w{~}{voqsrv{xwustvurstxyuy{xy|~~|zx}qmtz~y|zu}~zhlvsv~{upszvuuoswtv}|y~||wuxvqtyxx}~~}x|{pglv~|ssuvvrlnx{vtv~z~|}}yx|~pnyyy}~z{~}{tstnlrwy~{wuvyxsoxvsz}yxy{|{|~ux{xomw{{}{y~xwyqhpvy|usyyuzwpsyyy}x|~z|~ysquvqsz{~~{xvwunhp~xuvvvvsoq{}vsy{}|{}~{wwyvptwz|{}~|smpsnmu{zwwy|yor|sv|~zxxxyyzvvwxunr~~|~}}~yuuqmprxyv|zv||sqx}||}~x{|wz}}yrnrxuqv{~zxvtsqlo|{yyxwvusry~xsy}y~}{|~}zxwvttusy}~}zrlotqmr{|yy{~znt{tv{~~|zxxwww|{vwuvvqs~~~}yurosqox{~xz{sr{}{|}zy|wv{}{vpntytpt}~z{yvrsrnr~~}|yxwwutz|vv{wz~{{|~~}|zxvruzrqz~}|uontunks~|~~ss~}wux{|{zyxvuu{{wyuuwurx|xrpxsjr{{}~wsy{z|zz|uvz|{vqotzwopz{}{~}|yttuqqx~}zzzxux|xxxt{}{{|}}}|{zuqy}qnw}~~~}{y~yqs}|u}ywxvy~}zwvvvusqryzz~|~|vvtx}}{}~|vu~xis}}|~yih|{mgfkswqmu}wv}~}z}~{|z{tstpnqttrlq{|zyxyyzz{||yqs}voy}z{}vox{pjjoqjfovrv~{vvty}{yxwtsx|~xzxw~}xtw{}ysz~~~|ulpztowyookjt~wrqtvpkswru{{{}{{}{~|~|v|~yrqvxrjpyzxwwwwwxyyyskp{zuz~}|uwvt||wtuvrkpusxxyzu{~|{zyvty}~}uouy|zw|}sx~}|||{uklxzvx{zysmpqpw{wttwwqqvtw}}|}z|}~~{~}~~ysyyrr{{onw{zzyyxwwxyyvmkw~~}~~~~zsv{z~}xtrsusqsswyx~y|{{{{yvw~|~~}}vos|yu~zu}~|zzzzwnjs|~~}|vurmpwwz{xvtsvwutrv~~}zz||~~|~z{ztx~wqwwpvz{{{{yxvvwxvolu}~{yvrv~~|xvsqsvvtpvxy}}z{||zxy{}yy||vpu~{v{|w|~{yxyxumlv{}vsoltz{}|yxutuy{vpv~}w{~|~|}{}xw|}xt|yty~xuyz{{|{zwvvwwtmpy|~zvrqz~|zwtrtx{toz|w~}z{|{zy}||~}ww{yrrz~{x~{|~~|yxxxwqlsyz{uplpyz{~|{yvtw}|qq}}wx~~}~|||{ux{xsyyy}{y{{{{||{ywvwwtnpxy|~~|vpox{{}{xtty~vnw|w~||||zz{{~}xvzyrrxy}~{}}}~}~|zxxywpnuwv}wokpvux~~|xvx~rr}|vy~~~~}{~}}|uvzvsx{|~}|{~|z{|}{ywwwwsnrxvx}wonvww|{wuzzpv|x~|||{{{{~}~|vwxsswwy}{}}}~}{yyywqnuwtx~~}sknutv||xx~yry~ww~~~}{}}}}zuvvsvzz}}y}|{|}}{ywwwuopwwuz~}|~}slqwvy{ww~xsyy{~||{{~y|~~~{utsrvyw{}w~}|~~}zyxxtnqxwty~||}rkpuuy~|yxzvz|vx}|||z}~}||}~{urrry||w|~{|}}{yxwwtnqyyvz~~{y}}tmqwx{|xw|{wy}z{|{z{~z{~}}}|}~}wropw}|~wx}|}}|{yxwtnpxzwx}~}xy|xopwy{}zx{}z{|~xw{z{}{z~~}|{{zyz{ysoow|v~{{||zywvtpox}{z~~|~wuyzsrx{}}zxy}|{}|}|z|yy||y}~}||{{yyz{uomu}u||||{zyxvtonw}{y|{~yuwyuty{}~{y{~|{~|~~~yx}zy||y|}|zzzywvxzwpmuw|}{{{zyxwtppy|{}{|~xtuxvv{|}~}{y{}z{|||}yy}{z}}|{{{zwvxzwolv}w|~{{zzyxvsnpz~{z}{|ytuwwy||~}{{}}y||}~~|x{}yy~yz||zyyyxutwzwnmy}y~{{zzyxvrnt}~{|~{{|wstuw{|{~~}{|~zx|}{}y{}y|}|zzzzxuuxzulo|z{}{zzyyxtoox}{z{~{||wttvz}{{}}~y{~|~|xz{y}y{}|zyyzxvtuyxplu||{zzzywrnt||z{}}z}}xtqrw|zx{~}zx}}{{z|{z}}{zz{zxvuxztloy}|}~{zzzyxtnpx{xxz}{{~~ysqt{|xx}y||~~{w{}z~~y{}|zyzzyvtuxxqlrz}{{{{zwrnt{zxy|{{~~{upou|zvx~{x~|{z}}|z}~|zzzzyvuvxwpnty|~zzzzyuonv{xwy|~{{|wppx|xz{y|~|wx~}}zz||zyyyywustwvppuy}{zzzyuopx{yx{}{z~}zunmw{xzzx}~}y{zz}}{yyzyxuttvvrrux}{yyyxtopx{xxz|~|y}}xpnx{|{y}|~{wy~}~~yy||zxxxxvtrrttsuwx}|zyzyvpqy}zz|~~yz~}|{xqls}}{w||}~z{~zx|}{yxxxwusrstuwzy{~zxxxvqpw}{z{}~~{x}~}|vpr~~xz}{}}yx|{yvy{zxvvvvtrqrrtx}|{|yyywsqw~}{|~}x{~~|{{zvpq{~xy{|{z~|~zvy{zxwvvvtsrrrty~{~|xxxvrpw~}{{}~~~yz~}}}yss|~xz{z}}yy}z{xuxzywvuuusrqqqsz|~zyxwsrz~||~~zz~~}|{{{wrs{}x{{z}~z{{|xvy{zxvvvutsrrqs||}}yxwuqs{~|{|~~~}~z|}}}|xtw~{y}zy|{x|}y{}uvyzxvuuutrrqppt~|}zywtrw~~{{}~}~{~}~~~|{{{yttx}yz~~{}|{xw{}}}~zzywwusrvqonmotvv{~{{xxxyz{ywx{~}r~{nlmpywtonqvxx|{|~|{{}~~uv~~{z~}~}|~|yx|uw}ynx{xzvxz{z}}{}}~}tx{snx}~}|~|xuuxvoz~xx|vt|~txpkqwvyxx|}ystz{s{}}|~xuuz|ovzonrrptu~v~|~~xpswztsykmpcekmkkfjs}{~|nwqr}~~~~~~uswywumt}}{vu{owss~}zvqx|zxws|y~}zxpqr}tqw{}{x~~wms{~}v~zyyrsrwxwy{yz|uouy{|{puswpqsls~zwsvt|vurrmkogfpsov~zz~|||tvssp{|zrvxnmspisw}x}wxwtms|vt||povxz~~yuxx{ut{uq{~uvz|~|y|rtzqq{~y|vzyy{vwyzwz{rnvvnu{tlqopnwwx{}|}wvusu}|ssqojosqqutq}||zwz{vzx{y}~~}||~}{~|yzorwsmvyy}z{}{ywuosz{rvwy}~}zsvzouz|}|}xtzy}|spsysu}~wu}wqy}trxutr|ywwxou|xpwwvwtpp}}ptqqnzzx|vwspis{wvzz}~|{zyy|vsw|~}|~}uuzsuzoms~~||}tvtxtwvqoxwp{{x}|yzyypu|{vzy~xy}yyurrlluy}~~wt}vx~z}yvnu{wsz{qotwuzwzx~z|~|z{|{u{uwvxu}zy|vzvxvytt~~~~}xw~wowypr{{|~~}|}}|xrw{uquv}u{~wr{vuq{zvxyrwz{s||us~|xzx~{y{wotvqsxu{y|w~usxyx{xzwyrv}{twvwz|rttx|||{}ysuurvtz|uutvyvyvw{zzz{||{urzz}y}|}}{|{smptzkhuxw{ywuwvqv~urw|t~{y{{z{|~{{vvxu}{|vtmtsq{yvtuwvyyxypxvwvz{~yy{tttsttu{}}~~zuww~~nmtwy|}}www}{wy~u{|x||}twr}txyx|~z~xy}}zzwyyyv|sstx|}xx{x{r}{}zsxr}{pmmnwuw~~~~{|}y}}wuwso{z{}u{{yuytvtsrntzsq{~xz~ytxz~~~wyvt|xptkjuppxzsyx|z{}~wy|zty|syz~z~|{z{}}~wsvypxzptz|}z||x~y~{zx{|}xwzwp}|stwtx|{}}}{uuwu{vmrut}zs~wu~tu|qttwzy|~wwyp|}{}{}~z}v}ovvrssnyyzw~{|~~{}y~~~yv{wsyumx|s{{}|}~{zx}zv~tszsrvt}t}|{}xy||t}ywrqywuvy~}~{~|xxxvwpqyry~~||zxyunztwuu}xyzvuv~yz}}xwyssqxukovw|yw~z}zz}z~{z}v|zw}sl~tvw|}}|{~ux{xttqsnq|yx~ywyz}}}ttzzzuyyxut~~w{{zz|{{|vyqvsnuuz~~{}xsvvou{|x}z|ut~{zyxvzz~~{~wwvqq{vntzw|vn~{}{}~w}yvyrtxtso{~~z||||z|ww|ssvt{qvytt~{|z|{|u{{{~uxvuwwyus|~{|~|~xwqtuqqvtzy{||r|ussqz|u||u}x~xx~w||~{~yuutxxpqywwrku{{{{w~|y~uvyrsnx~||~{~{|~{||wvyzzotrqqwxy~}x~~vzy|y~}}zr{tzy{{y}y}y}y~}~qss}zrljlqmutw~~uvw}|s|~z|vs|}|tpzvy}{z{y}}uz||y|}}{wnn{yvt{{}uyqrvpxzqmmot|{w}~yz}|~{}|s|xw|wvtuu|}p~}{}z{|y~~x|~uxwzpqyz}||}~|x{~|tx{qtvpjnqy{z~y{y}zz~z{||}}|u{tqy{{zzy~}wzz~t~vs}tsyru|pozyz{yyzyowxrz{urtnw|v}z{}||x~w{yzwqmpv|zsky|~u~z{zvswvy{vww|uyx}yx|tzuq{vwo{xszuow~~|u}|{rw{ytryurzz|||{y}{{|{{rtvusqtszowz~x}vz}{vx|{wv|y}{uvz}~}y||xuyvmh{zlkqnt}|||}y~{|z~y|wsuzzu{wx{~z~~~uzx{}tswuqtvrqyw||zt{{vxyqz{uu~{y~v~}{~~{~yx{{ty{xuxpmxsquy|~{}{}~}zw~}wyzxz|tzy~{}~~xzxwt~{vv}tw|thrzvsy{~z~|vy~{uwxnsur|~v~~{}}z}zvz~xwtqxsunmtzxx~}{~s{x|zwt|zv}{||}~x{~y|}xpwrmopkqvtw~{|x}}wtxyxyxz|v~~}~}w}zzvrxysvqnqvpsx}}}~~t{wywt||wy|x|yq||~}}zx{~xxyzv{ppwroqzvnv|}}|{z}|vy|zwxs~z{{y||w{y{uy~xz}}}ulu|towvvt|{|v|u|xowvswtt}|~|{x||vwtv{ssoqtwpsz||||zy}|{zvuvyyy|zx~z{v{sryppqlquspv{z}{vuvtvsowvsnmnkpyzuwztyzyv}~~{{~~wv|ljotxsrw}{uuxyniz~~x~s}|~xqqvrw|ty|n~rsy}{}}~|{y}{sowztps{yqo|{mqvx{vpqzzpv}rw{|~~{z~ztv}vvkv}z{~{~xvt}s|zxwzyytxtsztpz}||zz{zlz~}umq~rfs}uxwp|u}}|~y{zqorpz{}~ptqkqtpkoi|ullnomqjvnpuwujx}|zzyr}yyuo||q|{tx~z~wx}yqqrtnikozx}sqr|rsltnmsxntrsuwzs~~rt{y~||~}wzt{|nuz{{v}{jp}xxttwu}zsvx{pjkwz|yxwoms|pnhxydkuqjqlnrxnmx}umwzwyyz~}x|o{~y{}r{}~||}~qmrywkghzw}{tp}ropxis{urvqr{os}uu~zx~|z}~{t}ux|z|{s{wix{xu{zp~~tpw}wniky~|}yvomz}mjpzudnvnorllyzjpxypv{|zw}~y|~x{p}~}z{r|z~|vzniovrkhgy|vq|sky|zkpxrvxqp~st{}uz{w||}~}~~wsx|{~||twzmwyzv~y{v{}yzvlpxuonj}xyztmx}scvwtnhrmruojvrouwqvv~y|~}w|{yt{{~y~x{{z}~~uo{vhgoqmojw~w}qx~}lrtwnqru|wpsvx{vw}{||zxw~{rvw|ztxtwvyvzvw~}|rx{pkosqsqv}p~{qryxogsnqkloxunl{~vrurrw~z}wy{|{z{~z|y|ys{~~|xnqumhinmsquswt}zwm|oxpns}{tp|~yyuuy|~{}zpx}uww~~}vt}x}wxtyyq~|~|rtvqnmoowt{p}ssyusm{xjtohpyvpmx~{wtorxz||}s}{}||{}z{v}yq{}x|umpomkjjmus|vvz{xww{oxskx~zts}|wqxy}yy~}~uox{xyzz}vyw|wwq}|vq}}|~}wrsprpmlrvxzx~}syvsuwzskvljxxunsz}}xpmz}uxzut~}|}~z|vwzuw}{zs|{wppllplhisr{||{{|wx~}|trymv}{ws{~xpu|z}{~}~}yot|{zzyzz{u}{vo{zurz{}||}xurmssniqsw~}}|}w{vty}vvmtqmyvuoux|zomz}wx}}vu{~{|z~sx~xuzyz|~zt{ywrrjkqogippzy}|xyyyqysx{{wu||zou||y||~|zrsyy|{y}|}t}xoxxut}zy{z}{xwskqvqioqu}z~{~xuzwutourwuvqvxyrlw~z}~wz}zuv{}|wxt{yvy}zw~y|wvvtsmfnrmfnmwzyzyzxzry|{xyt{{|uq{|uw}|wssvyy~zvsrwvtz}zx{xxvwnjqvpkqo{{}}{~~xwwswot}wturzxysoy~~|~ztv}zwuw}}~yxuxww}x{{~}~}xrrrskekrojomz{}}|{~u|vt}wxu}{{xs{~yxzu~~||xvsrw{{vxsutu{y}}}uttvphlsupsoz~yzzx~ruxn}suqyzw{zrw}}w|~u|x~{zwtvywwvw{y||wzt|unorofflrpsou~~y||u}wx{xty{|xy~{xx~xz}}}xxwsp|~~~w}}wvstx}{{||wwz}rpsskimtuytw|u||z|}rvxt{vqu}yy{|wy|~}zu~z|{x~zz{ws~{|zvuz|x~w{pwrzplopifipsytu~w~~ww}y{sx||}}z~zv||}|}vz}~}wxyvqz}~~x|zytty{x~y}tyt|torrkilrw~vz|tz||~utzz~xox}zyyxy}~}}wvy}~y~vz~}xz|xu}~|}}{uv}{x}{wwruqwqlolggjov|t}}|x}xxzs}~}|{y}~~vyx{y~tx~yvxytuz|y~{||xtv{z~{z|vzuuysprmjjnr}{x}vw{}|uv~|st|{{xvw}xuwxw{|t{yy{zv{y|~~~xv|z{|~}w~~yszyqsuoolhgilu|u|{y||w|}u~~~|yx~|vyu}vwu}yvxyuwvzy|{}zux{x~}}{}w{|xrxvrqljjlr}y{~|yx{~wvztw||{xtx}}uwtyvy}tx~xxzyxzv~~~~zx~zz|||y}}yvwxtovspkhhijtzv~y~{{~y}|x~~~|xv~{vysu{{syzwwywyuwy|y}|xy{xzy||y|w{urxvrlkjknyz|z~zy}}wx~|x|{|ytt}}vvvruz{t{zxyzz|u||{~{||y{v{|~~}wzsxsnvuoihhimxw}~z|{z|~~~~{vwvxvu~vx|uy}ywxxy{s|{}|x}}{}~zxyv}~z}sxwovyrkjkloyy||y|{}|{}}||yts}}twus~xu|ww|zxxz|v}~~y}~{xz~|w{{}~|}{w|qrvnpxrjhijmwv}{}~{~~|vu}wwws}~{ty{vyywwyzwy|~~~wy|~{xx{y}w}~~~xxpwtoxxokkmowx{yw|}|zvrwxtwqy||xs{zwxyyz|}z~yy|}yxy}}x}{}~}|z}u{ynpunpxqjikmtv{{{z|ytw{uyqx|{{sx}wuwxyz~yz~xwvptmkotz~}yvuw~||~~~~~~wsssxxz}}}vxmvyvx|{|u}zvsv|y{{{~}u|~~}w|tsv{|{||x~|qyzsqxzu|{spqrxvz||}w|wsu~{}w|xuz|tr{~vpnryspu{truonqw~zvvw}z}y{{|xy{{upnq}}~vnxnkyzuplkqywxvs}{}zzvx{{|~v}|~yz}xtwz}wqvwrutnkkpqn{|{~|{{yv{{zy}|vuux{}y{zzzxzur{x}x{|qo|xosmjlpxytst{wy}~|xz}|z||uqopvw|xpv}xqlkpv|wxur|yz~ywuz{~~w}|yy~yy|}xvyzzz{yzxtvrnmrpnzy||{zwuyz}||}}|wutv}~|x|~z{||}ttxqy~~upystlkkpyytsu|~}ux~|~{y|}{y~~{}z}vspps{~|yx~}tmlqvz~}xztr{xx|{}ztx{~w~zu}{~yyz|~zx{|zwsv}vwwspspmywz~|zvtw}}x{|y}xvuvz~~y{~x{}xtzqrzs{xwplknu}vstz}y}r~}zzy{{uz~}{}|{urqrvz}~~z}smpux{|y{zqyzvx}||ysw|y{vx}|{yy||{yxz||yupxwvzvtunryu||yutw}}tzyx{xvwy|}~~z}wx|~uwzqsyz}~}{qmmov}xuu{{w}u{wvw{{tz|z~}~y~xtrrtxy{}~~}xqrvyz{x}|szzvw{z{}utzx{xy|~yy{{utw{|zxrv~uw{yxpqyty{vtvz~ysv{ywvwz~~}~|}}~|uv{vt{uty~~{{xpnos{|xwz}v{~zy{~trw}yx}{~{|~~x|xzvruxyyxxxv{tppuwryyv|y}~~||~xyvnkqx|}|wv}|{~yrzwu||xvutxzxwvwx{}z|y}w~wnglmkvtqvy}}zxsruz}{||rqvyyosz{x}y~xuz{rhdefkqutsw~y|{y{yz{{zwyz{}uqot~~xzxx}{~stx|{kimppokmroz~xv~wt{vv|}vpnpsy~ywxz}}ysqw{vnounnqsuy|wxv~wrrv{}}{zxyuntuyvy{~~z|trru{vrpqtwuqpt||w|wvz||{zwu|{x~yrpqw}|w|~tqvtwxzzvqnrmp~|~xy}v|yuy}ztppqtx|xxz~}|{tqsyww}urttttvzywy|~{vuw|}}||{|wosqs|z{~|w~wtrrtx~xwwy{wroqx}z|ztz}{wv}zz{tqqu{~z}y}~~tssox{tstkp{|~|~{z}zxvz~{vsrrrsx~{z}|z~}vssv{}~{zwxvtrrv{zy~}}}zxz}~||}~xqupq{}~~}{vzvtrpr|}}|~|uppu}|~|{}ux|wv}zz~xtstx||y{z~||xutmr|}zxyooxy{~~{|~||vy|}yvtsqpsx{}{|zustvz|z}~||{xtrrw||y{{~||~}||~tusnu}{{x{~yvspnrz~}wtty{y{}}~uy{wz|w~}xutvxz|z{}~{{vvrkrz|||}{qtyyz~~{~}{|xz|~~}zwusqoty}}}~~{ussuw{||~~{wsrv{~~|{~}x}}{|vwtnt|}y~z}}zvsomp~|~|xwz{x{}~}~{v}~xy|v{{wuvwy|~}~}z}~zpotwtkhptqpssw|wx~~~x~{y{wxyvps{~~}~txq}|wz|vyyw|~{|{}}yx}zqt}|yyz|~|~}vxuuvvusqyywuvxsrx~}}}z|~||~{~}zxuw|xtvnmrwxtlluxtqru|xv~}~|q}}}zx~|~{wsx{}{xvutsuvspqqvrnsxz{yvvy}{~tt}|zyx~~wkw}|{vqnvytuqnrqorwyyxz}}x|~~z{}xw}}||~zonx~srtvvskirwsnntytw~|z|~|zr~z{|yxytqw{}~zwvwxupmuynmswyywuux{}}z}tu{}yz}~}qpxy|ysv|vwxonstrtwxxy|}xw||zx|~yx|~{||~}~wnr|{vwwwvqknvwplqxsu}|yy|}~~v{}|}|{~yx{ysrvx{xyzzrkt|qlqvxwuttuxyz{xu|}|z|}vtutx}~y}xz{rnswuuvvwy|{tv|xz~yw{|wz|~y||}zrrz||{zxtpovyrlrvqv|{xwz~~~~{|y{~||zx|~wqsv|}{||}~vkt~tmptvvusstuvw~~{~}wz~|}~|~zzuquy|{|xpqxzwuuvx{{uuzxz}|{|{}wq}ztw{|||}}||wpry{y{~{yvst{~z|wmulmt{~~}}z{~wu{}|yssxyqlow}y~wyrkwxnjjklmnos||uwxy||x{zvz~~|y|wt{vtx}~zqkjlptrloqmotwwtqs{{tv{~|~~~{yxqklnjhjfjtusqrtwyzz{{zvzysy~~|{|~}yuz|rqz{zxnhnqokjloppppppos~|{{|wtz|~~~~~}y{yuqjktnbgs{yzz{}{ymn{~xqmmpwxmev|t}}upuslkggnvvw|~|yuv|~zyzwu~|mmy}xspquz~wtljryzvronquqhitwv{vqmmu|rnpppw~}|{wy~~x}zurtz}wmfovlflv{~~~|{}xpkjnoln{|{}|xvxyzyvsqs{|xytnmsvssy}~}~}}zphpysou}~{x|~vrtonsy{ytpoptuqow{}|ywusqt~}||upov|{{~}|zxx|~ysy|xussux|~|snx}vprzxxzutz~|wsqquxvv~x}zvtsrqonmr~}zuuz}yvy~|z}||}|qoyztqt{~~|}zz|xsvuorx|~|xvtsutooqr{~||{zxuu|}uopvyvv~|yy|zv|tx}}zxwwwy|vmqwuqot}~}xtvz|zwspnpuxy|}~~x{{wuutrnkmvyvz}zwv{zx}|zwwx{wv}}yuty~|{vrtphinty|||{yyywurr|{yxvspqy}wv{~zvz}}|w||tvywvuvvvx|zuz|yuppvz{{}|zvwz{{{zxutuwwurz}uu{}xttvvuropwwu|}ywzzuy~~{yy{~vv{ywvsu|~~yvytmkmpsuwyyxwy|{tq|}|{xtrv{wx}zx{zx~{{~}|{z|{yxvtrqsw|{w||{yttx{{{|}~||ysrtuwxz{zxvx}|ss~wyysqqqommsurv~~||zvy{}}zxy|{x}|wxwrrx|~~|xsuxrmmoqsuxzzxvx}{oo|}zzzxuuzzuy|ywy~zx~~}zz~}|}|zyxxvsrsvz{wv{{wz|xvy~{}ysrrrssuwxvuxxv~xw||uqppnllqrmrz}}}~{{}|zwuux}{zyz}{vx}~wpqtojkmpruy|~|yyyqy~xuutstz|wy}{{~}{~{{xx||xvvwxwvvx|~{x~zx{}xtw|~|{}wuuuuuwyzyvty~uy|zvuz~|vrqqooswsry~~}}}||~}{yxy{}{vz~xuy~}yyvqutnmnpqrux{{ywzwv~~xvussw{vtz~~}|{|zv}}wuuuuttvy|{x}|wy~}xtw|~~}}w{ztrssssuwyywuwyx{wwz|wqnmlmswsrx}~~~~~{{|||{{zyxy{|xu{~wsv{}zw|{~uqurnnoppqswyzxvyzzyusrtyztsx{{zz{|~wt~~xuuutssuwxvv~{x{|xy~{yzvqqqpppsvyyxx}~~{wvy{vplkkntsnsy}~{}|}}zyxwwwy{zw{xw{{x|}{~zrsrnmnppqswz||{|~~~}|{vsrty|vsx||}}~~}yqy|xwwwvvwxyvv}yz~xvz~~~yuttsqpruxxxx|}~}zwy}{vqooswtorwz{}y{}~}{zyxxxury|wvz~|xy~yxuonoonmoswyzz}yusuzzsqvxyz|~|y}v|ywvuuuuutqt~|yz~zuw{}~}wsssqonpsuwwx|}{~}ywz|xrnnrwsnquwx{~yx~|~|{zxxwvrou}{vuw{~yw{~~{{vpnoomlmoruwx{}~|}wsty{tpsuvvy{~~{}yy~yvuutttsoox}zz}}xz}zsqqqommoruvx|||}xvy{xrnouuonsvwy}z{}~}zyxxxxvqqy~{wwy||xz}{{}|uonooonoquwy{~}}y{~}xtuz{truwwxz}||zz}|xwwwwwuqqz}zz{~ywz~}ursrpooprtuw{~zy|ww{|wrqvxrptvwy{{}zxxxxvqov|zwvwy}|xz|z}|soooonnpsuwz~~z}y{~|wtvytpsvvwx{~|}~~|wuuvwvspu~~{zz{}ywy{|xqpponnoqrtuy}{vz{vuxyvrswsorvwxz}zwvvwvrnrzzwuvxz}~{}~wwwpnnnnnprtvx|{}~yvx{yuuwsoqtuvwz}~}yutuvvspu~|{|}~yy~xxyqonnnnoqstvz}x{|vsuxwtuwrosxyz|~~{wvvwvrou|zwwxyz}{{~vwxrpoopprtvwzz~}xuwzzxyxrptvwwx{~~{xwwxvqrz~{zz||}~yy~w{xsponnnpqrsw|}xw~}wuwzzzzuprvxxy{||{wvvuqmqyyuuvwxz}}z}{w}}vrpoooprsuw|~z}{vux{{{xqosuuuvx{}~~}~~ywwwtpqy|ywxz{|~{y~wzztqommmnooquzzuv}~yuvz|}|uprvwwxz}}|~|xvvsolrwurrtvwy||~{y~}xsponopqqsv{|y~|wtvz}~ypnrttttwy{|~|~|xwvsoqxzwvxz|}~|yy}~{wrommmnooptyzuv}|wux}wqrvxxxz|~{}~}{xwupmqwvrrsuwxy|~}{|~}yuqppqrrsuy~}y{~zutv|vpquuuuvxz{|}~}|{|~~}|zwuz}xwwxxxy{~}wrv}z{|}~|ywvvwwvuuwyupsy}v}z}{y|}~}}|{zwot~~|~|yw{|xvwxz{}~tq{}~}~}zyyzzzyz|~zvx}|vx}zwy{}rkq}{z|{}~|}~|xw{}xwwwwwvvwwvtx~}}~~~~{wtw}zzzzzzxvssw}wwz{|||}}}}|{yuuz|yuv}~~}|zvsqpprv}zxyxvvyywutuvwwwy|{wvxzzz|}||~|~}ytpruutw}|z}}zxy|}zxuw|}zxwxxwutstvx{{xxxvttvx{}|{{zywusty~zxz{||}}~~}}|zvtvzzxx{~|{ywtpnmosx~~{z{zwvxzzxwwwxxyz|{xvxzyyy{|}~|xropsstw|}{}~|zz|~~|ywy}}zxxxxwutssux|~~ywwvtrrtwz~}|{zyxvwz~}{z{{{||}}}||{xutvxxxy{~|{yvspnmosy}~|{|{wvxzzyxwxxyz{|zwwyyxxxz{|~}zvqpqrrtw|~~~|zz{~~}zwx{}{yxxxxwvtttvz}}~{yyxvtrstvy~~}|{zxxy||{{{{{{||}|||{zwvwxxwxy{~}|zxvsqoorvxz~}|}|xwwyzzyxxyyz{|zxyz{zyyyzz{}~{xtssrqqsv{~}{z{}~}zxy||{zyyyyxwvuuwyzyy~}{{zxvtsstuw|~}{zzz{|{||||||}}}}||zxxxxwwvvx{~}|zxusqpqsttw~}zxxz{{zyyyz{||zyz{{zyyyyyyz|~|yvutrqpqru{}|{|~~|yz||{zzzzyyxwvvvxyxwy~}|{{ywusrrstvz~}||||{|}}||||}}|||{yxxxwvvvvx{~|{ywurqqrsssx~{zyz{{{zzzz{|{yyz{zzyxxxyyz{~}{xvutrppqruz~}||}}|z{||{zzzzyyxwwvwxyxxz~|{{zywusrrsuwz~~}}{{|}}||||||||{{yyyywvwwxy{~}|{ywusqqrsstx}}{zz{||{zz{{|{zz{{{zyxxxyzz{~~}{xvutqppqsvz~}|}}}||}}|{{{zzyyxwvvwyyyz}}{zzxvtrqqruwz~~}||~~~}}}}}}||{yxxxwvvwxy{~~}|zywusqpqrsux|}|{||}}||{|||{zzzzzyxwwxy{|}~}|zxutsqppqsvz~~}}}}}}}|{{{zzyyxwvvwxxy{}~|zyxwutrqqrtwz}~||}~~~}}}|||{{yxxxwvvvxz|~~}|{yxvtsqpqrsux|}|||}}}|||||{zzzzyyxwwxy{|~~}|{ywutsqppqtwz~~~}}}}~}|{{{{zzyxxwwwxxy{}~~}{zyxwutrqqrtwz}}}~~~~}}}}|||{zyyxwvvwxz|~~}|{zyxvtsrqqrsux|~}}}}}}}|}||{{{{zzyxwwxyz{}~~}|zxvutsqppqsvz}~~~~~~}|||{{{zyyxxwxwxy{}~}|zzyxvusrqqrtvx|~~}}}}|{zzzyxwvvwxy{}~}|{zywvtsrrqqrux{~~}}}|{{{{{zyyxxwxyyz|~~}|zywvutrqpprsvy|~}||||{{zyyxxxwwxy{|~}|{zzxwvtsrqqrsuw{~~}}}|{{zzzyxwwwwxy{}~~}|{zyxvutsrrqqsuw{~~~}}||||{{zyyxxxxxyz}~~}|{yxwvusrqqqrtvy|~}}|||{{zzyyyxwxxy{|~~~|{{zyxwvtsrrrrsux{~~}}||{{{zyxwwwxxy{}~}}|{zyxvutsrqqrsuwz~~}}||||{zzyxxxxxy{}~}}|zyxwvusrqqqrtvx|~~}}}||{zzyyyxwwxyz|~~}|{zzyxvutsrqqrsuw{~~~}}|{{{zyxwwwxxy{}~}|{zyxwvutsrqqqsuwz}~~}}|||{zzyxxxxxyz|~~}|{zyxwvtsrqqqrsvx{~}}||{{zyyyxwwxy{|~~~}|{zyxwvutsrqqrsuw{~~~}||{{zyxxwwxxz{}~~}|{zyxwvutsrrqqstwz}~}}|||{zzyxxxxxy{|~~~}|{zyxwvutsrqqqrsvx{~~~}}|{{zzyyxxxxyz|~~~~}}{zzyxwvutsrqqrsuwz~~}}|{{zyyxxxxxz{}~~}||{zyxwvutsrrqqstwy|~}}}|{{zyyxxxxyz|~~~}|{zyxwvutsrqqqrsux{~~}}||{{zzyxxxxyz|}~~~}|{zyxwvutssrqqrsuwz}~}}||{zyyxxxxyy{|}~~}|yzvxwwxuuppooqqvx|y|{w{~|}~yup{w|{~~{}~{{|~z|~~x}{simszqrmmslqwzxzuzyvwsyzxu~~{sx|}xvyx|}{ut|xy|yzv||{omstwy{~~tyvrtwvsrxxyqv~~x~~}wywrvxl{zqppuwuyw|}{}}}{uxvsywwus{~u}|}|~z{vzyx{tkwmn|mnmq{~}|xruywyyprw|x~|{~z|vw|}ywqx~}v|~ys|kr}vus{yppt{x{qmr|ytxx~~|{t|sozy}|~xv{|mqst|zy|}|}t}{prooosuxwn~|vrv|y~zv}y{ntz{vyz{~}puyvuuy{{{u|olytvm|poztsxsftqm{{|zy~w}u~~{qr{}}t}yx~|~}zx~xzwvo{}vxxowwoo{cuhppm{}|||xuuv}{qvz~vw|y~{}{{ouuozw|r|xr{xixug}okunr|w{}w|u{}v~~|~t|yxuty|}y}skvqyxyr~wwusp{mtzhtvnvyy{|q{w~~ux}y~~z~ty{|~wmnso{~qz}uwtpswkzwptst|}vz{wv}|}~u{qw}}{|~|ysvy||yskuwr{}o}wvruurorpsuqv~{x|q~{~uypww{{}{{x{{||}~zzqprwoyvzysxuuqqj|wpvqxv}}|~yu{}z~n~{swzz|}}zy{x{~|{uqnyust|ttvutrlv{nzvst{}}p~zyqt~rvx}}~xy}}}~}|wqltttu{xvzruuqm}qsxsvx}}|}su}w}}yovry}~{y~z~~|z|tioytzxywxtuttm{voyqvyzy}znx}}~r{xrw~}|~zwy{|{||vjjvsx}wyzuuutky}jtswxzyz|}n}z}t{zrw{z|zz}z~}~yy{xkivquxzyyvqqox~krqwxyy{~}r{}}uw{utu|~xzxz{}{zxzpiqqsw||}yurpowmruvv{}z{~rx}sy|rss{{|xzz{zwy{ojqosy}|zwrqqvpsrwx{}{{}~q|{}|~qx{sttx{yzw{|zxz|ohppp{{~zzvqpyqtsxxz}y|~|pz~{}|tyztvt~xz}xxz||xxzynipoox}{xrqwsrszxv|{{{|n{y||}uu|uwuxz~wx~}{~{xx{phnnnw|yqrxsqtwxuz{{{|qy{~{~}yt|vws{|}|u}}~~z{wvztjlmpv~zysru~xosvztz|zzvr}}|}|q|wtsyxx|~}xwu{{kinot~}zuqu{}qss{xy{|{}{py~}}{~txyttux~}w{}{|}wuw}rhmnry{zsryxpsz{w{|{{}rvz}}|z}xszuut}|}x||}y{uszxiknot|uqwsrw|wx{~z{xq~x~|{z~tvywvvy}}vz}{z}vsrzqhlmqz{st{zpuzyv{}{yzru{{|~|}yrywxu}}xz~~u|zrptxljmqu~}wrw|wrv|vw{}zyyr{w|}}z}vtywwu}}v}~{s|tpowvikpvz|vrz~}sryzvz|}z{ur}w}~|zztvvww|{|y}z~txyopsznjnty}~zrw}{qv~yw{~|{yqzw{}|y{vswvxx~w}|~}|rzrpoxvkmqxz}vs~us}|wy}~zztt{w|}yyzsvvyx~zy~z{swuoosynlnvy|ys{zrz}wx|zyvr}}vz}{z{tuxxy|~~v}{}~wrxomozrkmsy}|ux}tw}xxz~{xwrxxw}~y{wuwxzzv~}zzqxpnmxukmqz|}wuut}ywy~}yxrv~zv}z{xuwwyzx}~|}x|pwqmnwwlmqyz~xuwt~zxy~zxsv~{v|yzzuuvyy~z{{}w}qvronuxmmpxxzuxtzxy~zxsu|{vzzzyuuvyx~yz~{}x}qwronvxmlnwwzwzuzxyywsv|{uzzzyuuvxy~x{~|}x}rwronvxlknvv|xzvzyy~zwru{{uz{zzwuvxy~yzz}w|rwrnnuxnkmvt~x}t{xx}{wru{{wy{zzwuuxy|{zz}v|tusnnsyoklut~wu~|xy{|xsu~|{yv}z{xutxy~|~x~yw{wsunoqysmltu{z}w{xyz~yutzz|u~z{xvtwx|}x~~{}}{xzrvonoxvnlpwv}z}yyzy{vsxy}uyz{ywtux{~~z{~y}v{turnntyqmmwtzx}yz|}yst||zzs}zzyvtwy~x~z}}~yxxsunmpxuomswx~|}zy{xzusxw}tzz{zxtvy}z{}~y|}~tyttpmnsyrnoxu{y}yyz~yst{|x|s~z{zwtxzx~z{~{}}yuwrtnmowwqptzxzzzzx~{vrw~w{xt{{{yuuz}}y}x}{|z|uvtrrmmqyvrqyy}}}}~y{yzttyv~rzz{zytw{y|}{y~z|zysvstnmovztru|y{|z{y}}wrv|wzyr|z{zvuz~}y|w|z{zzuutsqmnrzwss{z~~y{xzsty~u}q{z{{yty}y}|yz~|z{ywsutsmnpxyusx{{|~y{x{urxt}vu{{{{uw{zz{|x}}y}}xxttttnmnuzvsv|y}z{y|}wrv{wy{q}{||wvz|y}x{}}y|~xwusstpmnszxtu|y~{{z{ysv{zw}q~~{|{xuy~~z~~wz}}y{}xvvssuqmnsyxuu{y}{{zzsuz|v~q|{||ytx}z}xz|}x{~ywztppt{{wv}{|z{y}x|~|xryy{zyxz{{~~{~yzzvr{wvrswrnnqwvtszxvwzzuuut|vqtz|wr||}}yssu}}}umt{siglgdfjqqoous|}||{}wz~}wsqw{~vstvu{z{yu{{uutsqw~yv{uqquz|yy~|~zspqnyysmot|zr|rw~z{zvoos||zvromr~~uwphginpnlqot}}~|{{~{plnwy{yxwx}yytvy~vsssrt|}x}|tsuz}}z}}}||wxrw|wpmrw}txyq~|{{zrory}}{spnmox||}rmlorspqso|{~~}~~y}{|tllrzz}{zw}z{xuyz}ssqrrw~{~xzttw|~}|||~y~~xxrz|vooty|szwt~||{yqos|}wpnlmqz{}~sonrturtsq~|~~~}~~z}|~zskmt||}{yw{|xvzz~{rrpqrx{~w|vvx}~|z|w}~xysy}xqpty|tyxt}|{{yrpt}vnlkmr||{uqpsvwvvvr}}~}~|~|z|~}}~|ytllt}{ywz}{zvx}z~~|}sqoqsx|vwwx}wzw{yztw~zsptx|wwzt{|{{ztpt~}~umkjnt~~xxrqtwyxxxs}~||~{|{|~}|}{xsmnv~{yw{}|zvx|{}|{|rpopsz|vyyz~|vzw}z{tx~ztqux|xxzu{||{ztqvz|rlkkov|{yutvy{zzwt~}z}||}~{}~{|~{zwrmpz~{yw|}yw{}z}z|xppoqu|zwzz|}xxyv}|zu|~yssvz{wzxw|||{xssz}~{{xmljlqzyxvvy{|{{tz}{~|{~y|||~{}|{yuont}{x}~xwuux}}t|vuw}|}{~xz}}zz~{|vxtx{}wqot~|vvvtv}xovxvqszy||yxz}uuuv{{tvzswwsuszzurt{w}yp{vqsvyxxyy{}~zy~xryyy~srtw{zxmllmqy~~wsv}~su}{wyww|}{{zw}||{upos{~yrpt{zvqmtxw}y|}yx{}ttssw}}}zrqwsx|yzrw~~wvow~{{{||yy{|~~yw{}x~|}~stxwyxtpmnsx{w{x|ysruz{|{zyw|}{z~x}|}zwsrvz|ww{x{z}~|tpmr}~||xy}vsrqsy~{ztqyvu}{zwxqt~~}z||}zwx~~yz|{yszywz~ywsrty{zw~v~vstx~{y~vy|{y~zw~{}zyvruz|}z}}yz|~yrony{yv|zttqqu|{ystztw~y~|xupx{z~|}}yw{~|x~|}wv|yw~|zwssvz{xzyy|vsuz~~}y|uy{zzxz|}~|zzwrx{}}{~|{~zz}wqnp}{wv}yttqrv~z~ysu|vxyzxuqyzz{}}zx|~{x|}wv~{w~|zwttw{|xzyx|vtv{~~~y~}uxzzzyz|}}{yzyry~~~|~}{yxzwqnp}{~xt|zttrsv~z}~yvt}zx~z~{wwry~~~|w}{~|z|{x}{{{v~x|~{yutw{}zx|s~~wuw||y{vvyzz|y~|}zyy{tx}~~{x~vwwroq}}|ys{{uuttw~z|~zwu}}y~{~}{xxtz~~~}v}{~|{}zx~~z{}wy}{yvtw{|zx{s}}wvy~}z{vuyz{|z}}|yx{}t{~}|w~~uvwrps|}xs{zuvttxy~~zwv}z~z}yywu|~~zw|{~}|~}yy}{}{yx}|yvuy||xzwu~|xx{}~x}}uvyy~y}|~|zy~{t{{xztxuqpx{sw|wvutuzyyyonpqtyqrz|~}{yttpyu~y{}~||}tpzz~z~su|yxxww{~}zywzy|tqtuyyypn|utuzzov|vx{}|{{}{~zy{{tnrwv~zxyxy~ysyy|wtpouolprv|ut|~zxorw~|~uln}~|svznnvsrrqquz|{{z|vu{|{yuxy~||~wln|}}zltyrtwxwvvxuz{w~vxwqmrzz}{{zz~}urx~urvoknptyrqx{}~{zxvoqzz~|zqko|}{~rowsqqoorwyyyy}|wuy||vxz~}z}zwnmwvxxvxyxwvwtw{v{wvxsnp|~x~{{yx{~wsu~wzwnoqtztpwz|}~~|zzyrou~~|~yzummw}zpvvrrpopuxxx|{zzvw|}ywy|y~~{zslq{u~wxzzxwwus|wv~|twvqnv~y||{zxy|{uty}y|uoprxzrrx{|~~zxzxpqxz|~{wxrmq{wsyusspoqvxxy}}zz~ywx|xwz~~zzyyqmt~~w~xy{zyxwtt~}vv}zsvuppyy~||zxy}}~zuu|}y|upqtzzrty{}~~~xwzwprzz{|xtvqms~xtyvtsqprvxxy||zy~~yxz|ywy~zvwyrowvyy{{zyxut}~vu{{rsuqq{{}||{yy|~{z}zvx~x|yqqsy|tsy{}~~}xtyzst{|}{{{ypsqot}txwttsqquxxx{{yxz}{z|}|{vx|z~tsxvryv{z{|{zyvs|wty{rqtss|}|||{yx{~~|zwzzxzx{{rqtz}uty{}~~|xrx{uv}||{~yy}wnqqpw}uyxuusqruwxx{yyxy}|{~}||wy}z~}qryvu{w|z|||{yut}}vtyzqptsu|}||{yx{}}}~|zxvzzz|y}zrru||tuz{}}}|urzzvxz}y|wx|smqrr|~yvuuvuvxwzz||{nmqlqx~~|~~~zqpyst{yrvyy~|zxpponpstuxzx{z|}|zux~}ql}onqtwxy{}z}vtxv|zruyzwytnifgjlnqttxy{}~}{}|qj|yuvy{}}~~w~|}}zvqoxyv{}uw}}zw{|uomopqsvtwxx~}|~~yz~}xxrl{}{yyyxy~{v~zvs{~z~~uuz{ywz}xroopprtswyy~||}~{~{||xxrjw~x|}|zvqnu|z~~vw}}xvy|xutttvwtxyx}~|{|~zz|zwxsju~}{{|v~}zuqw|wuz{~|wyz~wsrrrtvswzy~||}}y}~{{}yytipx}}}{xsnq~{~yv|~zuwy|xvvuvxuwzx|}{|~||z|~|xxvkn~}|v|~~~~{wqr~~{uy|}xxy|wttstwtu{y|}|}}zy~z~~yxxnjz|{}}}zvqny}|wx}vtx|{wvvvxwtzzx~}{|~}|{||}yvxsjv}}{v}}}|ytov}yuz}}vy}{wuuuvxtw|z}}|}|y|~}z}{vvvmn{~}}|yupp}}}~wy~|ttzzwvvwyvt{zy~}{|~}~||~|~{vtwsmz~~{w|||{xtpy~|~yuz~{vz{wvuuwytx~z}}|||z~}z~|~}|xstvpq|}||{yvrs}|xx~|tt}~ywvvvywsz|x}}||~}{{}~|{yuruwr{~~~w||{{zxusy{{|ux~}w{|wvuvwzvv~|{}||}}|z||{}|{yvqqvvt~{|{zywtu}{~zw}~{vv~zwvvwyxty}y|~|}~{~z||{ywsquzw~w||zyyxvtz~z{|ux~}y~|xwvwy{vw}{}{|~~|z|zz{zywtpqxxx~|{zyyxvx|{yw}~}zvx}ywvvxzwt{}y|~|}}||z{{ywurrx{y|x~{xxxxvu~|z|zuy{y{xwwx{zuz||||}~|}}z~}xzzywurptzx||~~zzzywv|{|~wy~~}|yu{|ywwwzztw~{z~}|~|~yz{yxvtqtzy|yz~yxxxvty{{~vv}}x|~{yxy{|wx~{~||}}{z|~xyzxwusprwwx~}{zzywtx}|yw}}~}|ytv~{yxxz{vu~~y}~|}~~}~yz{zxwursxxxzzzyyxurv|{xv|~}wx}{zz}}xx{}||z|{|}xyzywvtqrvtu~~|{{yvrw~~zx~}~}yrs}{zz|}vw~z}~}}|{~z{{zyxvsswvu{{zyyxupt}|yv|}}vu~||~yx|~}|{y}|||}xxzyxwurqttr}~~{{zwrt~}w|}~}zspy}|{}~yv~{|}}|z}~zz{{zywtsuvs{}z~|yyxvqq{}|}vy}~ysy~}|w}}}|yz~|{~ywyyxwvsqrurv|{{yury~yx~|~}|wpr}|}}vy{}}|{z}yz{zyxussvuv||{xxwtpt}}{v{|}wt~~~{x~}~}{y||}~|~}wwxxwvtrqsut{|{zxts}~yy}|~}|{wqu~}|}|vz{}~}|{|{xyzxwvtrswxy||zxxwtqv||{vz|}wu~~{x~|~}|z~|{~{}|vuwvutsqqtxx}{zzyuu~~~zw~}{~}||{xsv~||}}vx{{~}}}~~{wxxwvutrsx|}}{~{wwwvtw}{}}vx{|~|x~}|w}{}~}|}y}||{utuutsrqqtz|{yzyww~}}{v|}z|~~|{{{zvw~||}~ww{z~~~~}~~zuvwvuttsty~}{}{wwxwux|{|}vwz{~~}z~~|w}{}~~}|y}~||ztsttsrrqrv|{yzzxx}}zv|{y|}|{{{|{wz~||}|vy{z~|~~}xtvvuttssv||{~zvwxvu{~{{}{uy~y|~~~|{~yx~{}~~~zy~~|{wrstsrrrqsx~zyzyw{~|~~wxyz}}|{{||yw~|}yv}~z|~~|~zuuvutttstx~~}|}xwwwux|{|~wv~zz~~~~~|y|x~{|~}||y|}|xrrtsrrrqru{{yzywy}}zw~zy|}|{{{{yuz~~{v|z{~~}|{uuvvuttssv{~}ywwvsv}||yv}zz~~~~~}{v|}y~||~|{}y}~|xssutssrqqsx}|zywux~{xzz}~}|{{zwrx|x}{|~|{|{uuwwuutsstx}~zwwurt}}|}zw}zz}~~~}}zuxz~}||z}z|}yssuutssrqrv{~~zyxtv~~}x}{z|~}||{zwrt~x|}{~}z|}~|vuwwvuutrsv{}xwvsrz~|}~xz|y|~~~~}}{vu{||~}zz|z{urtutssrqqsx}|zyvty~{y~y{}}}|{{yury{y|{~{z|ytuwvuutsrsx~~{xwuru~}|}|x|zz}~~~}}|zuwz~|~}z|zz~ysrttsssrqqt{{yxuu|~~zz}y{|}||{{yus|zy{{~~|{{~xstvuuttsstz~{xvusw}|}|w|zy|}}}}}}{wyz}{}}{}zy~~yrqsssrrrrrv}{yxvv}~}~{x~}xy{|{{{{{xv|{x}|z}}|z|xrsuutttttuz~}|xwvtw~|{}}xyzxz|||}}~~{{z{{{~}~zw{zroqrrrrrstw~|zyxw}~}}{x||xxz{{||ywyvupmmmqs|{{}~~|orupmnknoqx|{~v|ztpv|y|~y{{|~}wx{z|tq{|vuwtutsv{x}~x~~{vyyyw{yq~|sixuqs|~|x}xtyzuwz|{u|t{{uwxzvy~~~}~rn}{sqsjklqnkpwuy||rls}y{ussyvuwvsloq{vrtzxwu|{{vx|zwxz{|{ons}{s~ztvywxvv|rrrtvxy|y{tt~}|xup}~zyunvtxwyz}y}|}{{{urut{y~{wuntwwyuxsuqo{x|xrwz}|}uyut{~|}}ynvuw{y}vyxtx{{{x}w{xy|tqslw}z{~wz{{~vwmszrvvz~z}~x}ytvux|x}}ywsqspuwzzy{qusntqrw}}}yzx~}~}ywsiopu{}x}~uvvq|wxw|ytxwvto~|}xrsm{~yxnv}{zxzwxzvuwyyw|~zy{zsmt||{~}zx|tvwvwt|}vzxw{wux~~|}~vprpwy|{zx|x}}zr~wuzwyusyt~}z}yy|xzu}|tyrswwy{~{||{yuzvouu{~~yrsoooy|~uttn{xrqr|{x~u~~|}|~~}xyntvlnq~~x}}z|w}vvxwwwzxwu|v|}z}zxztwv~~z}ytyz|x~zyzu~vtrzwry~vvutpq{}{zy}}ts}}}x{{}z~xuxx}}|ztjv|z}z}z||{z|~vz{|vwztqtoz~~~~}|zvxtwyxxtsxtsx}{}u}{ut{y~~zzryymkjv|~z||vxw{uvwz{z|}{xw{~~~{x}z}urprtr}|y{}xvxr|trpyysv~}z}~xswtrw{{{t~{{zz|{uwtxtz|}~|{}|rt{yz|~{xzx{|yvz~{}vrpwurr~~|{~}y}~rwxxv||{}|zsw|~|zz{xwvpvzut{okvomo{}w}~tzxzw|w}}y|{~||zz|zzssvqptv~wx{{rvs|tvy{|u|{yw~~{}}zusrslkw}||yyzw~tu{rvuzx~}}~}~z}xzyvyumxzz{}|~|{{vpuyor}|~~y}|{~{vsusxx}uv}|ys|xxxx}}}{x~{~xuuuwjmrw{|yy~{z|}zv|pxuxsx}}||}xurrns{}~~}}}{{}~v~xxu{||z~||}}{|yqtrsro|z{~}{xuuux}~}|w}z{}~~z}|xonnrs}}|~|{~{ysyxqwy|ry{{}|}y~~z}wtnxwzuy~}}~|xvzxwyztv{}{|}z}{~zw~trjr{x}|}z~zxxw|}ywuuux|~{{rrrptwxz|~~y|ywu{~~yvvrvv~y~{{{|zuvzwtpwy}~}}vyt~wx}}tz{{s~}~~{~ztplwtnq{~~vvvy~|zzwxx}vsy|~}uwvuuyuvtqy}zyx}~{xxvpuvz{{x|z|wy}{yqvuwy}wyv}wv|yt|zpy}z|stpztnnwwyzz{~}|{{wv|tssx~}~~|wz{xwxwwvou{{~{zz}}z{xttux{~~}{{x~yy}zrssrtx{|x{x~ww|~v}qw|{wur{wljrus}}~}~~|x}{wzzrss}x|}~{||{x{yxxrovvuz{{xz|xvvwy{{}~}y{}~v}xtvqpuuu|~}zz{wzzyys~~}z{}{|xtu~slmwrs|~~{{zy|vtqu}vu~{|~{{zxwwprusu}}{}z{||vvxvxw{~~}|~~|v||suxmsttu}~~uy|y{{yz~{u||~~~~{su~~llt{oq}yz~|{y}zsvr{uuxxu~}y~~{yy}wzwxuyrnx~}wx|~vxyysuu}x{}sx}zprtrrqww}z|yzxz{~}zvzxywy{|xvy}wpn{qmtvuu~{~~yx}~x~~xyq|w|}{~~|v{totmk|sqv|~z{x{zxxzzywx}}x~}{yq}~vysprrxz{|{}yzxuzxvs{xz}}{}xv}}wtwzovxussz{zztzzwvr}{y|z|tuyuvwswvwtjx|x~}xw}xvxr{{|~~{}{v|sswrnqvuwz~|z}|~}{yz~{t{|~~||}wyzuwqm|siqr{||y{wz|}vxyxzz}}|~||v{}wqxsponyvz}~~t|uwsy~vz}}w~~{|z{uwuvsnvsr|w|}~}z}wxxwxx|{~{v|zutzw~}|om}xxyv~~vtyxp|yttt~}~}|v{vwtvrppwvp{}wyv}vwyy}x}~{{x{rw{nnjquqy~|~~~zyw{}ys}{y||wz~ssrxrprtxw{~uvyzy~zs~}~~~wz{|rstprqix|sw|}}y|x|xx{yxx~{{}zv}z|}ss|xwwquxu{|~x|xtxros|zz~~~z|x}xzvwwwumtwxt|xz~zwywzu|{~y|vxuqlrxssyz{rt}y}~zv|yruvx}}{}zwwvwvotqtpvwy}||z{tx|}|x~|z}yuzwqqlnzpnnwz}|~x}{zw||w|~~~z|{sz|zzvoutpsv}x||w{wtry{uw|~~|||~y|yyw{uruuspvxwy|||{z}|~~}~~|{yuw}|wjv~xwy|wtw}vyy|zumtxt}~tsx}qvx}{||~~}zx}~ovxzqxzyzr|z|ypxyw{}{qy{}y~x{vtxvr|y}w|y}{y}w}x}~|x{uwy|t|wu{~}}zz}yiry}rjsqpulpk|ohmt|w~|~zyyy~wxqt}ywx{xwx|ux{|wsp{xt}wpptwnrlzyvywv{t|{v~xvw}wmywkjrt~}~utltnp}~vrpznkntknktyq|~y{~|x}zr|qpxw{|}y}zz}~yyrvyt~r{wsuvqtrq}sx|vu~}wv{r{~yvz{qn{qkruryrlmslz~~jrvpqsomok|tw}vx{~x}zzrwsy{w||~w}{}|{sr|s{vw{uxwvrqk|uqzutx|x{zts~|uy|zl{ulpvuzz~}smmvls}srwosrplpiyto|vu{|zw|syrw}z~{zv|x}zz{{tt{ryyy~xzvustk{tnwrtv{xz|us~~x{{{p}tnqwtxz}~~umpvltxuw{tuqpmoizqlurx{}yy~uyuv{yzzyv{x{z{|pryqw}~{{}wvrsm}xluptvzz{zwq~z||znzuprwws~}{}~~}ynmslqx}w|wztsppjvxjsouy~~tu~|wyz}u~yx}vzx}}~upxst|~~{xwuotmqqqvy|}|~}m~|}~z}zrtxqtt{r{}~~}}|y|~tkpolvy|~{zzuvrom}qlrqxy~w|}|v~wyw{{|}v{{xzz~y{|oswryy{xup{{jrotwz}}{zn}~}|zzx{pxwsuu|r}{}|xwz}qjpnqy|~{}yuvqopplprzz~u~|zv}x{w{}{|}w||z|z||vxzmqut|{|xtr|}kpouwy~}zyo}~{}{zvypuwuvuu}|}|trv}qiops{|}|vxrpq~ukqryy~wy||{t{y|yz{~xy|{~y|rsz~potu{}|{tswpnptxw}|}|n}|y|{|uxrrvtwuz~}~~~ysoqzsinqu|~{~}wztqs~zlpszy|xv~{z{tyy|z||y~x}z~v~zpry}ppuw~~}zstzqmpvxw|}}zo}|x{||uxrruvxwz~|}~|x~qorzqjprx}}{~yzsrwxmpv{y}uz~~z{yuyy}z|~~x||}||tupr{ymqu{~}xsx~onsywx|}tr~|w{~yuwqtuyx~y}}u{wnouylmpuyz|{wpu{rnszzzzt{~z|vwx{|~{}~zyx}|z~vyzpqv|qosw|~~{sw}vnryxw}}|wo~}xy~|uxsrtwyzy{}~xwzoorzpknrw}||zrt|wnrzzx~zt||z|xwxz|}{~~|wy|}z~xw{pqu|rnqvz}txxnszxw|~{vp}}xx~|wyustvxyw{}}xwzopszokmrtz|~zrw~yot{yx~~yt||{}yvwz{|z~}w{{~z}yvzpqt|snotx|vx|pr{yw{{vp{~~yv~~xyvssvxyx}z~|u{qprzsklotu~}uu}rr{zx|~yt|~y|}{wvx{{|}~~w}~||}||~s{sprzxnopxv{vwqzzxx|xqu}}uyzyytssxx~|x|}}{vyvopuynllss}}|t|{px|yy~|vu{y|}ywvz{~y~|w|{y~||ytypps{tnnswyyxut}yxy{vqx||t|yyxtrtxy{{{~~~y~txsnouxnmmus}{t|rz|yy{uw{x|}yvuz{{|w}{y}~zzxswoprzuooty{zxwt~yyy{uqwz|tyyyxurtxz||{||~w|tvsmnsypnnwu|}v|tz~yz||uu}}u{}zwuy{}~~v}|}z{z~}vzrvonpxyqqt|z}w}t}zyx~|wquz{vtzxyvssx{}}z}z~~wyussmnryspowx~|}w{wzyz{|uu|{~t{|{xuy|~~w|}|z{z}{txruonpxysrv}{}x~wzyx~|vqvx{vszyywsty||{}z|}uxttqlnsysqqzx}~w~x}}zz|{tv~~{}s{|zwuz}}w~|}w||{{~wuvstmorzxsrz||||{yzxzsryv|qyyzxwrvz~z~}{|{}~ztwstnmowwrpuzy|y{z{y}wtzxvx||{zuw{xzzzx}y|{zsvstonpwzusv|zz{zzx|vqwv{uszzyxstx}~{|}~z{{{tvttomnuxsqsywz|{{y~xsyx~yu}||{vvzzzz{w}}y}}zztutuonovyurtzx|}z{x|vrwv|vszzyxssw}}|}|}z{~{zuuuuomouxsprwu|{|y~wtyx~yu}}|{uuy~{{z{w|}|y}|yyttuvpnouyursyv~{|y}~wrw}wzzq|zzytrv{|}|~y~~z~zzvtuvqnosxuqqws~||z}ztx~{z~s}}|xtx|}}z~}wz|}y{~yxwstwrnorxwsrxv}~{|y{suz~u~ryz{zxrux}}{}z{}~{{{xyuswunnpv|||~{|}xrvxzvzu~xu}~~}yz|vvurux|z~~{~xwvrwypjgr}sswt~sn~qfkqzrpwkwywyzwsx}~}yz~z|{xici}}qojn}v{zsvyxuzvxw|}|us||qqxzxzqyz}utwyxw{{vvvpssiglw|z{x{oqwsqsxplthrwuvwtptz{~|vx}}}~xorjcgq}vu{y~}}{~~yt{{~y}y~~w~tsw}x|z|vuy|wruvvuxzuqummsljoy~{y{xru}{yz}yownpyvxxwrty}~|~~wy~~vvshnlflu|y{~}}{|zu|}~y|z}w~{~ttyz}|}xvz}wruuutxytpumltnms{|w{ysx{yz}ypxoryxyzxsu{|{|}wz~~~~|stpeomipz|}}}~}y}xw~~}z}z}z||z{su{~|{~wy}z}ustttuxxqquipunpv}zw|ws|{|}vtwowyyzzvtw~{z~{yw{}~~}|~wqvjhrklt{}~}~~y~v{}{}{z~~|w{vrv}~}}w}y}xststtwytowokwqos{|v|zqw|~|uzsvzz{{ytv|z|yz~|vx|~}~}}|~zqwpgsnkpy~{~~yuy{}~~||~{xywqsx}~y|y}ystsstwyuowqkxrnqx}w}{pux}x{uw{{||ytv|y{yz}{vvx{}~|||~yqypiunjmv{}~zuxx{~}~~zyyxqqty||z}zstssswyvoxtkyuopv}}y}~qsux|}yy{|}}zuuzy~}w{{}wuvx|}{{{}~{rxvhtrklr{{~~}|wwxw~}x|wyspqt}{|~uutssvyxpszktyqpsyyyqtywqptx|zz{{~}yy|wz}~|{|~wpxwuhk|wttwx{|}yx~{{{x{xpstwtsss~|~{z~}yyvsps{{}qyxz|z{{zy~sssowzxstx{}|{|}~zwwzv}|zzrkkuppxpmmpswxysu}}||y|~~xrstx{{tqoo{~x{ww{|{z{tsomow~|v}|}~~sx}zwuouywrruxzzxy{{}~|vsuzz~|ysniio{}xztrsuxyzts}{z~|zw~}xqnsy|}wtrzz|zwz||x}|sromow|w}}}z{rvyyruzyusux{|zx}||~~}wsu{|~|}wplhjq}w~wuuwz||wt~{z|~{~zv}}wqou{~xtr{{}{xz||w|{sqnmpy}xzyyqw{zsvzyutvy{}yw~||~~|wtv|}~|||}snkhktyywwx{}}vv~{y{}|z~xw}~~{uppx|}wtt~{~zy|{xv}wrpmns{}x}~|xzvq|~}xty{yuvxz|}wy{|~}zuty|}}|x}ypmiinx{~zxy{~{t}|||x{|z}|u||~|xrpsy{{wt{|~}y{}}|uz{sqnmow~}{~|}|xyypv|ux{zwvwy{yv|{}~{wtvzz~|x{{rnkhjs}}zz{~}uz~}y~xz{z|}ty}}~}ytpquvzv|}~~z{~|~tz{trolmtz~}~~|||y{yot{wz|{xwxy{yv}{~~|xuvxv~|x}{spkhipx}}|}|t|~|y~wy{z~}tx~}}~~zuqqsr~}y~~{||ty{uspmmrx{{~|{{y{{pry|z{}|yxxy{{tz}~}yvuwt}}x{}uqmhhmty|~~}}zzxyw|~~zxxzzxtwy~utxvotwlmtpnnllpw{|~}|vvvvzrow{{svunotxou~xx{{zwvxvx~{x~}v|xrqnlov}xtxwtqomtsmorszwpv{~vx}}zwxxyutx}yxysowtjpsnnljkpuyy}z|~|yzz}vxsov}wyuisxrtvvtsrspw|{}~ytw}yzvurqu|}vt{ysotrklnqwrmtx{zu{~}{|{||snw~{tzvjpqmlkhiotxx~~{{}yzzxy{qs{~pv}uuwwusssqw}z|{}xtw~w~zvusru|yvxzsvvnmorxunty||w|z}||||~|yroxxz{oosonmkkouyz}|}|}wxy|zx}{tt}st~xuvwvutusvz~}x{xuww|{vvtsv|zx{|tvxpmorxwpuz}~~}x}y~|}}|{yxrqzyz|posonmllpvyy}|~}~|~wwx}zy{||uwsuyuwxwvuusx~y}{vzxuz~w|yvvttw}~zz}|uwxpnptzvqw{~{}{yz~~~}}|}wwvrty|zossoonlnswyz~}|~}}}{vwzx|}z}zu{~r|xvxxwvvts|zywvywvyy{wvvtty~~}z{zvzvoorxzrsy|}zx{y~~}}{yzvwtsz|xtsuustwuuu{{yy|~xwz||}~imyusuwvvvury{wzxswwv|{~{zzyy}|y{wsmrrkjmuysty{}~~}zv|zpp~z~xqhj~zvzspusssrqsvxwz{yvsx~~}zszxpquy}~~~qv{wy{{zyvrx{rlq|}|}y}}{ytpw}upqw~}|vzzrpsy{rprsu{zyx|zton~yopnkouu|~zvvnkkkkoqqtty}|{}|}{rvyy~|u|yw{|q{ponlrzupryvpuxx|{u{wvw{}}~~}lk|qilortuuy~xpx~xux|~yz|w{z{xy|{~xnv}rjgiklnqqtuv|}{{~{wyurz{}|}}z||u{vljrqjjptmlrsu{||||vz{yz|}~wtrmt|wvtssssxzpnxyssvz~tw~}~z~{~y}ywtu}}wsrqprrputv{{yz}}utxuu|{~zpy}{uuzunmsummrsv|{|{y{y}|z{|}xprtrx~}{yxwv{{qozzttw{~rw}y}z}x|vwvyyvutsutrwvw||{{|tsxwv|~zxoxwv|wpnsvomruw}|||x{{|z{|}xoqww{~}{zyxwz}tnx|vux{~ss~yz{yzvvz}zwutsuurvxv{~}}}{uqw{y|}{|ynvxu{yqorwrmrux~~||w{}|zz{|~~~}wpqz{}~~|zzywy~vox}xvx{~sr~y~~zzyy~~vv|zwvutvvrwyw{~~|zuqx|{}}{|wnwxw}yrpsxrnrwz~|{w{~{zz{|~}zuos|}}|{zx{~tpz}xwy{~~|qu|y|y{xz|ux~{xwvvxuszyx}~~~~{xsrz|{~yrq}wz~wqqvwpouy~|~xw|~{z{{}||xrpw}}~}|zz~{qu~{wxz|~~~vq{y}yy~{w}xuz|zyxzxsy|x{~}{yuqv{z|~z|wpx{|{truytosx|||zvy|{{{|{~zuot{{~|{~}st}|xwy{}~~~xqxz}zy}|w{ytx}{z|zuy}y{~||zvqtzxz{|wqw~}vtw{uoty}z{zux}~|}}|||}{|vpsyx|~}~tu~|xwxz|}}~xrx{~zy}}w{{tv}~}~|vz{{||{wqsxww|{~zrvyvx|xqsy~{z|uu|~{{~~}||}{~}xqqwxx~xt|~ywwy{}}~{su~~~}}|y{xx~~vsz~yx~z~||}{yspvxv{y~usz~yw{}vqw|z}xsx~}z|~~}}|}}{}zupsxx{vw~}yxxz|}}wsx~|zy|}wz{st}~y|~|~{~|zxrqwxw~z~~~{ss|}yx||urx~~z~~wsy}z|~~}}|}|{{ytosyz~wx~}zyyz|}}vsx{zy|}wyzrt~y||~{{zwrqwzy~z~}~zss{~yx|}wrw~z}xrx|}~~}||}}z~zxups{}yx~~{zyz|}}~wsv{~zyzxw~{ts~zz|~{}|yxtpv||z}~}}~~}{tszzx{~zsv~{}ysw}}~~}|||~}y}~ywuqr{{x}|zzz{||}xtv{~zxz~xw}~{ttzz}~{}{yxtqv}}{}~}|}}}}~ztt{zy|~ztw{}~xsy}}~~}||||y~||xwtqt}zz~~|zzz|||~}vtx{~yx{~ww~~~ysvy~}}{~zxwrry~~~{}|||}|}}vsv}zz~~xu{}{|us~|}~}}||~y|{~ywvrqxz|}{zz{||}yuv||~{yy}zv{}{ur}||~{}{yxtqu|}|}}|{||||~~xstz|{~{uy{~~wrz||}~}}}~zz{}zwvspt}|}~|{z{|}~zuuz}~|yy}{vz|{tpz}}~{~|yxtptz|~|}}|{{||}~wsty~}|wz|}vqy~zz|}~~~z{~{~zxvsorz~~~}{{{|}~zvuy}}zz}|wz||tow}~{~|zyupry|}~~}~}|{{||}xttwyz|xqvyy{}}~~|z{|{xwtoow|~|{{}}~|wvw~~~~{z{xw|}}wpr~}|~||~{ywrpu{}}}}~~|{z{||~{ustz}y~~}|tq{|xy{}~~z}|z~ywvrnrz~~|{|}}yvvy~}}zz}}wy{~~{tov|}{~}zywqqw|~~}}}~}|zz{{|~~yttu{}y~~{sr}}yz{}~~~y~~{y|xvuqns{~|||}~yvwy}}zz}}wy~{~~{tov~~{~}zywrqw~}~|}}{zyzz{}~yttu{~z~~~|tr|zz|}~~~y|}{x}}xvusor{~}||}}zwwy}}zy{~~yw~{|~}{wqt~||~zyxtqv~}~|{|{yxyyz|}zuuvzz}}|vr{|{|}}~~yz}zx||wvutpr{}|||}~zwxy}}zyz}~yw}z{~~~~}{wqu~{|}zyxtqv}~~{{{zyxxyz|}ytuw|{~~|us}|{|}~~~}x{|~~yw|{vuuspt~~~}|||}~xwxz~||yy{~}xx|y|~~~~}|zuqy~{|yywsry~}~}zz{yxxxyz}{vtvx~|~~ysv{{|}~~zy~|{wy}xuuuqpx~~}|}}zwxy}|~{yz}~{w|~z{}~~~}}{vqt|}}zyxtqv|}~{yzzxxxyz||wtuw{}ztt}{z{}~~|y~|~|wy~~yvutrot~yxyxxxyz}~zuuttz~|{{~~{t{tsvzzx|~~{zywtvz{}~||~}wwtyzxvuvy{zw{~{vuz{wz}{~{zwy|yyyxwvx{|xxz{{|}~|yyxxz{{~}}~zzxsv|yywsqu|~zwz~}z|~{zyuppuy|zxww}yusstwwtv{|z{}}ysptxxx|~|tpquy~|ywvyzwuvxxyyz|~~{wvusuyz}xrqtuu{|ww{~|xwz|{yy}}{yxvqorw{}{wsrtwz|yxyzxvy{zz{}~~}{vrqvxxz~{tonrw{|zz|{wvxyyyz{}~}ywvutvy{~{toqtux}yz}~{xy{|{y{~|zyxuqpsy|~}yvrqux||zyzzxwy{zz|}~~~}|zurrvyz||xsnnsy~|zz|{wwxyzzz{|}|ywvttvz}~ysoptx|}z{}~|yy{|{z{}~|zywuqptz~{wtqquz}{zz{yxy{zz|}}}}}{yvrrvz|}zwrnns{}{z||ywxyzzz{|||ywvtsv{|wrnou{~{z|}}zyz|{zz|}|zywusqtz~yvspqu|~{zz{{yyz{z{||||{zxvsrv{|yuqnou}}{{||zxyzzz{{{|{ywvutv|}zvqopv}|{|~}zyz{{zz||{yxwusru|{wtrpqw~|{{|{zz{{{|||||{zxussw|}zwtqnpw}|{}|yxyzzz{{{{zxvuttx}~{wtporx}|}~|zz{|{z{||zyxvussw~}yvsqpsy}||}{zz{{{||||{zywtsuy}~{xuroosz~}}}|yyz{{{{{{zywvutvz~~{xurppuz~~~|z{|{{{||{yxwvtsuz}zwtrpqv|~}}|{{{{{||||{zyxvttwz~~{yvsqoqv|~}zzz{{{{{{{yxwvuux|~|zvsqprw|}{{||{{||{zyxvusux|}{xusqqsx}~|{{{|||||{zyxvttvx{~~|zwurppty}~|{{{|{{{|{zxxvuuwy|~|zwtqpqtx}~||||{{||{zyxwuttwz|~{yvtrqruy~~||||||||{{zywuuuwy|}{xvsqprvz~}||||||||{zyxwvuvxz}~}{xusqqsvy~~}|||||||{zyxwutvx{}~|ywusqqsw{~}}|}}|||{zyxwuuvxz}}{ywurpqtw{}|||||||{{zyxwvuvy{~~}{ywtrqqtw{~}}}||||{{zyxvuuvy{~~|zxvtrqqtx|~}}}}}|||{zyxvuuwy{~}|zxvsqpquy}~}}}||||{{yxxwvuwy|~}|zxvsrqruy}~}}}}|||{zyxwvuuwz}~}{ywusrqruz~~}}}}}||{{zyxvvvwz}~}|zxvusqqrvz}}}}|||{zyxwwvvwz~~}|zxvtsqqrvz}}}}|||{zyxwvvvx{~~~|{zxvtsrqsv{~}}}}||{zyxwvvvx{~~}|{ywvtrqqsw|~}}}||{{zyxwwvvx{~}|{ywutrqrtw|~}}}||{{zyxwvvvx|~~}{zxwusrrrtx}~}}}}|{{zyxwvvwy|~}|{zxvusrqrtx}~}}}||{{zyxwwvwy|~~}|{yxvtsrqruy~~~}}||{{zyxwvvwz}~~}|zywvtsrrsuy~~~~}}|{{zyxwvwxz}~}}|zywutrrrsvz~~}}||{zyxxwwwxz}~~}|{zxwutrrrsvz~~}}|{zyxxwvwx{~~~}|{zxvusrrrtw{~~~}}|{zyxxwwwy{~~}}|zywvtsrqrtx|~~}||{zyxwwwwy|~~~}|zywvtsrrrtx|~~}}|{zyxwwwxy|~~~}|{zxwutsrrsux}~~}||{zyxwwwxz|~~}|{yxvutrrrsuy}~~}||{zyxwwwxz|~~}|{yxvusrrrsvy}~~}|{{zyxwwwxz}~}|{zywvtsrrrtvz~~}|{{zyxwwwy{}~}|{zywvtsrrrtwz~~}|{zzyxwwxy{}~~}|{zxwutsrrrtw{~}|{zyyxwwxy{}~~}|zyxvutsrrsux{~}|{zyyxwwxy{~~}||zyxvutsrrsux{~~}|{zyxxwwxz|~~~}|{zywvusrrrsux|~}|{zyxxwwxz|~~~}|{zywvtsrrrsvy|~}|{zyxxwwxz|~}}|{yxwutsrrrsvy}~~}|{zyxxwxyz}~}}|{yxwutsrrrtvy}~}|{zyxxwxy{}~}|{zyxvutsrrrtwz~~~}|{zyxxxxy{}~}|{zywvutsrrstwz~~~}|{zyxxxxy{}~}}|{zxwvussrrstw{~~}|{zyxxxxy{~~}|{zyxwvtsrrrsux{~}}|{zyxxxxz|~~}|{zyxwutsrrrsux|~}}|{zyxxxyz|~~}|{zyxvutsrrrsux|~}|{zzyxxxyz|~~}|{zywvutsrrstvy|~}|{zzyxxxyz|~}|{zxwvutsrrstvy}~}|{zyyxxxy{}~}|{zyxwvussrrstvz}~~|}|y~|~{ywwsqpnmnjnnmknokoqstz}{yzyzy|vvutonmnsz||wwzx}~~||xspnlryzxupvuwywvuvuxzy|}}~}{zslklollegmomijnv}rlv|kihjlpst{{{ux{xunpqqrv|~{wxysjjrwunntz|y~oewvninoprwyy~~txyzz}zursx{{xuxw~zzsf~w}}|wwvt}zpmu~vvxplkncdi`jopkd`dmpy|wwy~{}~r}y||z~rorzyf{ul{x~|~uvw{x{rxtxzysnlo{j||u{{yu|tjwwvrdlmqrjj^jplgddiyzzyvywyvyzz~xy|u{{t~{xunzmvvl{zyxu{|zr}~v~|z~~|yz|{wylrqst}}{{{wp{slxxugp{rstpfclibaijuz|vyzzuxx~~{|v|v~|~w|{xv}wsuo|m{|pvuyu|{||{vw}{|v~|||~}x|w{xntm{}|z~z|}tsqnxyqht}rsvpfemj`bjky~||xu~zuzw~zyv}w~zy{ut~|vwtr}m||swu{x}~||{tv{||v~~|}{}xxtywpum|}z~y}}vrrmwzsgp|tsxqheonbcjkwyx{xwyu~~yyt~yz}xzrp{x}uvwrqxwzv{zz~~vs|~u||zxwsruxsxoy|z|x|~xq{skszvhiwtqzrkfouhdkluz~xvyzv|yzs}{}{~wyonuvzswxtsw{}x}}z~vr}t|{}zx~}vr}qwxu{q|~{}x~~xs~rnszugivsr{qkgrvgfmmv{{|v~z}}v~zztz}{|xxymlwzuupxuzq|{~|~su}zt}~{}||{vtsxqyu|zs~~w{xv}oqv|oemvnxzojl{tgmoqz{uv~||xz}~wy{||w|}|plmsvpuxtxs}}}yr|}}syy}~||y|xts|~pwvz}sx{ysrt}vgjupt}rmjzzkmppv~}~x{x{}|zx{v{{{x{{sml{uuorwrzr}{sz{~swy}}{~yzvts|}pvu{}s~}~y}~uuuxhjuov~rol}{loqpu|{wxyz{}yy|w|{{}x||snl|usnsuqxr}|sz{}swy~||z~}yx}wsryquu{~s}|||~xwt}}kitqr~tqmzoorqsy||z~s{}{}xx~{|}yz}woltyrnqwn|q|vv{wt{~||y{}}|x||zqruwrvvvz~y{xwwuhpvoz{sqrxossst}yyr~{zx{~z~}}||w~~~}|snk{tqmwqsut~~tzy~uw}~{|~~x||}|w~y|toqw~sstzt{|~}zwztirup}ytrvvquutu{|q{~yw|~z|~}zw}}~~zrnk{sonypuuw~tzx~ux|}{|w{{||w}}y~zqmou}sstzu||~|xxxjqup{{uttzsvvvt~}{s}{~yx{~{~~}{w~z}|yrnjuvpmxtpyw~vwzxwz||wyz{}~xy~|}zx|qlmq{vquywz}}zv~lovpw}vwt~twxxs{~{xx}}zy{}}~~|w|y~~{xrnjr~xqmyvp{x}wwz~yxz{|wxy{|}xx|z|ywznkkq{vsuzwz~zv}mpvqx{wxv}uxyxs|}v{~}zy|}}~~zv~v~|{vqmju}vpp|rux{}~vy}xxy{{~|vwz{}~~vyz{||{vztkjluzstvxzw|wnuus|zyw{yxy{vu|s}{|~y}~|~~}wx{wyzqojmzztowzmx~~~zv~~}{{xyz~}xww{{wwyy~}~}yyu{mkkqztsu}vyzyptvs{}z{y}yz{xs~}u}}|x|}}~~~xu~u{~|qoklw{wpu{mv~}u}}z|xx~y|}yvvzywvxx~|}}wzt|mkjqxtsu}ux{{ruvu|~||{~zz{xr~}v}}~y|}}~~wu|t{~|poklwzwqvylv~~}u}~z|xx}z|~~zvvzx~wuvv|||}vzt~nljowtrt|tt}yuuwuz}~||{{zr{~yy~y||}zt{s~~|qolksyytu{nyv||~vz~}zyyz|y~~~}~xtxx|~zuuty}z~wxwvulkltvstwyyu~z~uwvw~}~|{|vtw~~~z|~~~~~vu~~yt{znojmuzytywnw~}~v|}~{|yx|y{~}~}}|wtyx~}wutt{{z|tyuypljmuutt{v~ty}wxwy~~}|}uv}x}z{}}~tu~}wuzxnminuzyv{up~x~~v||}{|yx}y{}|~|}~|wtxw~{}vurry{z|syvwrljmtuuu{w~uzxxwy~|~wu~y|z{~~~~vs{|}yr|}{nmilsy|w{ypw~~vz|}|}zx{zy}~|{}}~}~~xsvwz}}xwuspv{x{uuyswmkksuvvzz{z|zzywy~~}~yu~{zz{}}~}wry{|{tyxuxy}~xy~|vxyz|{|{{z}~{|z{zz|~}zs{|xomjgnsrvpqvp}vljjqrsrv}sust~~yv~yxz}{z~y{~wqss{~y{{ynnlrx{wzy~x{{~|x{y{xuwnqtu{{wspts|yst}~wqrlmvwxxrywwtolpuvxxvv}~}z~{{}~~vztginu~|qgb`eirrsqgq|prwxyv~~{xxyz}}{|xy{uru}z}}~zuwx|}uyyvrz~~z}|ywxuw|w~{uqnqu{wzwqvutvonx{~vwv|zy}~z~xzvknsu{w|~somru~t{~|~ywxqmpx|u}}|wslmmpzsuqgrwslmiemqqsnpuoxvmjkrswy}v~xzy{~}|{~~{|~wysgimpwu}ysorszzyuiq{qovv{wqy~}yzxxx|}{z{xwzusu{~u|}z}wxy{s}zzxry~~}|~|xx~uvx~|vqtv~z{{qtutvpnv{~uxt|zy|{|yzznmqrvuwztptv~uyy}}{wyuopsyst~x|ztpqpyzsvjiuvolmfgopsrmstrysmkortz{xvt}}y{|}~|~|wyrhklput}|vuvwvlw|spwwytpw|{|y{yww{}{yywwzusu{|t{}xyyz|ty{{zrw}~~|zy~|utv|}vwxzurvuwtot}~{wvwy}|yy~~}y{x|tlpquxv~ystvz|u~{}zyvuvpoqwxq{}z}|utst}ytujmvtnnnfjpqtqouusxuomrsx}vy~u|yxz}|}z}xsvqhknsxxxvxx{px~wqw{xwouzz}}x~}zxvz{}}{wwuxtsuz}v{x}{yzzyu|yzwwqkmoknoifjlqxz|tsvx}vt~~}xy}s|z}zwtvwzyy~w{~{vwwxzvv~zxqiinp{yvsnv~|~{xvz{~}~}ty{{|{xxxx|zy{}{xpr}xwnovx}|z}|}~vruuxuv~vw}}yvvsw~xvuqut~xwutxx~{}{~}wyx{{xz~|voqtxyzrzx{{~z}|xx|~~~|{~wopnx}ppppplkopknnggjkrwyulv{vow~~{{||}||y|{~~|~~{~~tv{vno}~z~uo||tnrxtqolpryxtzstuzxz|w{~sw||}|{z}zxvv|}uutt~xvyz}zyz~zy}wswx}y~}}|zx}w|xurtr|~}zxvqsoprt{|uwzx||x{wtuvyxx{|}uqtu|vx{uq~~y{~}z}~}zvtyyqooq{~|}|}yuuwrnrlhkkqwyukqyuoo~|{{z~|}||}w||{~}}~{~}wx|wplxz{~{p}wpryuspmpqwzs||rrtyxz|~~vz~st||}|zx}{yxw|}wrssx}||y|}~||~w}zuxx}y}~z}{~y{{sw~~wyw|}zxstqqssz|vsyzz{wy~ytutxxxz|}yrtuzyw|wpxzz}|{|~~}{yuwzvnnpry|~~{{}srummnowzzqlwwsmr~~zyz~y}}}}zvz||}|}|uy{vpkyyy}tzrtzwvrorsy{t{|tqsyx{}~|uz~sr{}}{yw|{yxv{}xqsuv{{~~{}}}x|}wyy}{|y~{yz|y}wuzzz|{|{uttrtsx|ztt|{zxv}}vvtwzyz|z}wtvwu{}ytp~}|z|~|~}}y}zxuswwsmouv{}}}tuwpqqs{}zppzxtmt~|zyz}y~||}}}x{}|~{{yx|~|xxwvjqztkltsrqnqrx~xyztuzz|}|tv~wpxzqv~vy~||}yt{vuvy}z{{}{y~|v|yihtyw}|~|x{z{}yx{xz{}}w}zwz~xurrvvxx}ywrvzy{wvq|~~v|zz~}rjuvromghtux|~~|xsytttv~ut}|xrr}yvuty{~}z}umsy}{{~}wy{y~yqmlx}tngqtqx|zuuu{}~}uwunv|vorxvwsqtv|}x{ysv{{{v~vt||wuru~vz}~}vkkty{{vpt{|~~}w|unptqw~yvsorqrstzzxqu|ywy}zxv{{|{~{vwqqpw~wy~~|}~~{~wronw}yu~zwwy}yxw||{yx~toussru|}zqr{xuoq~|~~xxuvz{~zw~{y}zqmuzxx|}xxqolq|yw|z}~wvtw|}yuxtr{{spwxxwrtuy~{x|~vtz{~|uyyru~{yzurpw|}y|||~ynjqtz~}ts{|~}x}zrrxtv}yuqtsstuzzysrxvx~{yvzz{{|~vxtspu~~|z}}{{{z~yrnjqw|yxwx~{zx}~~}zzqwwwuw~~{rs{yvqp|||}}xxuuxy}yv{}z||sntw{{w~~|ywtqnnw}}~{~~zxvv|}~xyyvy~yswzyzuuwx~}zy}{sw{|~wu~|tqyx|~wtou}ty{wvx}wy{yzw{uw~}|xz{}~y|~yttxuqvvvxx}}}~wz~~}}|st|tqt|{zwv{{{vs|}}{vvv~tvsloyzz{{{y~|~qqxxww}{s{{xuquwyzwzz{xr}yx{}{w~vsswyyzwtuut|}zytqqqvxxuwxqv}xy{qoy|xyxywz}wyzzw|~w{~zyvx~}zrinwursw|ztojmorsrvvwvq|ywytqtvsrwvsiemooppy~{|xwvuxy}}xz~vy}~|~~|~}qlxvmkr}|xywvsrzwnnpqosy||vzt{phmvz|~}{}yu|}x~x|}}{w}wpvxvurw~zzussprsvxsu{|~|wmpwkcilfcgvwv}wrtrsstxwxsr{vzywz~{|yu||uz|twz{}~|{nouomr~~y{}zystvlimsssyzxrpxyvtpt}~~}~x|v{~w}|tor~{||xyvwvwzyzuw}y}}zqkeemw{}||{{tqrutrvrrwwyxvyy~~{|~~~~~~xxsw~}uty}z}}w{~}zx~~{rtuqz|}uouyqx}|ytwwwyy}~~}x||~|upmov{z|yzy{wstx{xz{y~{v}~}xuslqzvsx{vz{{~{xz}~|yzx{yux{}}}~ywzsv{}vx}wqv~xz{}}}~{}y{}}wronsyx||||zxy|~{vy}vqv~xy~y|~~}zwvorytmo{}~y}}~~yvv}}{~}wvzv{~~{|zyzxzxvunu|trz}|ztuvxzy}~zzzuqoorwtuyy||{~{{}||||}|~}wy~xy|}~}yrrzywtqpt{vqrqstsvvzyuuzyyvy{|~~~xsxtty}~}ww~yv|~|vwyzz}ywx~|wxwy||~ywwvyxyvqz|xyz{tpwxrmny|w{}}wvxy}}||yzwtz|tou~}|zy}|{|zz|y|zyy}|wqsqstuxwxwrx~zomuwxwsuvxxw}xz|}ytsprxrqssvvw{~~|{utyxpmxyw}wtzyuqnlmxyrqoprpqqtursv|{y{~~||{zworutx~|y{~~ztpomryvvy{z{y|{{zwwwxzz{sqyxvuy~|xrs{xtos}|xz|zsstuxxzyx{yy~xs{}|{yprwvzz}yw{}xstrsssvstuqu||rnvy{zvwwxxuy}}vu~{vuss|{x{{}zz~{{y{zyxtvvuz~{u{}v{|wsy{xuqpnu|vronpnnnpsqrv}|}yx}}~~{}}wrqooyzwz{~}~xxy|~~~zzzy{z{vntxvtv}}{vv~~yst}}|~zyzy}}}|x{zz~~x~|{x~~~~~}~|{yyyqsxz|z~zxz~yuurrqqsqtutxvtz}}z|{}|{}|}|yywz~|yywwxvvrqrrtxzvt}zu}~{wz~{xwts~xuruututwvtv{~{|{{z{{~~~~|xy~ytpoomvzwxy~~}}}}{}}vz{{|vw~}yuu~~~}}}~{}|}~}v{|}}~}}|~}z{}|{~}~~{{xzwprvxx{}|yzyzzx{zz{~uv|~~~~}xvupv{wuuy{z|}~}||}xw|~yxvtvuurnppqruupw||~zxws|}yuxxwywzyvx|{{|~{tvz|{~}{||~}yuv|yuqpqnu{xxx}~z|~~yx~ytsz~yy|wvvuxyzyvyyzz{zsv~}}x~~yz|z{yzyvwyxv{}~|ttx|{|~~~|~~yv{}}||{|yy{~zy~{{}yvxtv~}zxz~|~~}|}{x}{xty}{{xyzyytuvvwvxtrz{{vt}zsqsqrqqsqrtz{vyy{}|}~|~~~}}~~xz~|x{|xsrrntzxwv|~wv||y}|yuu|{xsry~||}||z}}~|y{{|{z{tt{}~{|xy||~|}|||yz{}wz}}~xuw}}|{{y{xy|||z~|ux{~~~~}z~{vvupv{yvtyyy{|~yz||}xv{}z}{yxvxwywtvxzyx{vw~}~z{vu~wvxwxwwxuvx}|ux{wx}|}zz{|}~{wy}ytrtosz{xvz||~~||}yw}~zvrv{|wzzxxvwxyyuwy{{wzwty}|y}y|{{{z{xxz~vv}|~}|z|xsty|~~~zy{~~~~}~{}}}|~zwy~yustpsz|yvz||~~~{}|}xux|}wywvtqrrrrnqsvwuywv|}}xu|~wtvuuutursuz{rt{}~}~z{}~}~~}~}zy{}}wsqv{xuqrrou|}zy~}{~{yuw|zvqpuy}xuxxywwyy|zx{}|{}yz~y{xxxwwuvtrsu|~touz|}z|~}~{~}yx{~}~{~{xy{~|}}||z|}~~}z{~ywxtt{~|wy|{}}{}}zvv||xtqtx}{uvvwvsuuwwtwy}{x{zz~||vt{}ututvuvvtwy}ux}z{~~}~~|{~}z{}}}~~~}zvw~{vtuqqw{{vx||~}|}|yy{wtwz~xyyzzwyy{zxz|}y{yy|~|}xv}yxxwyxyxuxz{sw}}~|}}xvv~}~~}}~~}z{zxyusx|{vvyxzz}~}w}~{{}xuwy~~wvvwwsttuurtwzytuvux}|x}zwxvxwwwtvy~~uv~}zx~~~}{yy|~|}~}~}||~yutz}zuqrpmpuxtrvwy{}~|zx}}yuux|{wxy{xxxy{xxz|}xuvuvy~z{yyxwxwwttvyvouz}}z||||y{yvsu~~|~}}|~tx{x{{~|{utzwruxz{yzwyyv}us|}z|zwy{~zunpumoqtwxz}ys{z}~|~~qt}opo{z~}}uz~~zx~uwy{uw~u{|stu{~w}{}|}tp{zwxzxx|~vz{}tqrsu~}untz|uvmwx||wms{z~|tzyx{{}~}r}||y||xwvywx~wy~~z~~ssgiou~qwxvxq}wy{upy}{}xwyuvnr{yz~wssyt|yzy|y~}v||{}z{xv~|}|~~w~|zy~yw~zwrxqqy~|~zulvwruulorwvruoks|ws{}w~{~}x}}xx|ys}|vswspyy{v~~|zxz~v}xwv|vrsv|{shpoimuqimoqrxptx}x~zyxz}zxvmx{}||{|}u{}wz|~|~~{y{nppmfs}|~}{yuz}qttwx||uz~wpwvyz}tx{xux{wo{xw||w~|xvxs|||zw}|{y||ylnw~~xrqrtuwlqx}vwwmmuuy}}zw{w|}||v|vv~~srrtrv|zuy{z}uyx{zsz~|~~|tz~voooksuqkpojhwupsusz{|{v|{{{yno|z}|}|zv{|vvt|{|pnsohjlwz{~syypp}~xuyrsusw{ywyso~~{zuu{{{}{xywuxz~~~u{wwx}x~}{|~}~|rlp{yz~x~yqo|yoqutyzumpzy}}xu~|{yy{z~wyv}~}ysw{rpsrrv|}~|}|~~~wuz{vwyr~vxyvzwturjuyvsxsoovxu|~rr{}~}}qwu{uz|uv{{~zz~|~|}~sxvthjnhhs~z}{xyyvyurvwtvytuux~yyvu{|vzzz|~zqs|yuy|y{|zy}yz~z{|~~}}rnruuwvxysp}zzvmr}y{|w{}wz~}xyz{}~w|ss}znnstylsuv}x~~~}~{sos~|rsv{x}}ut{tpstrqurtsurryy}z}vyutv{{~zz|~tr|}w{~{}|}x}tyyw|tilinpps}}zwzvz~}|xquut|{{tsvvsxzryxpv{xw||tq}~|~{{{z{|x{}y}|z||xztiovz}}y|yq}x~zsspr|{z~{{}}}}z~yzy~{|uzuwyvyvquxtv~~v{~zw{rqyxutw}~z{|uwxorusstswtmuxu~|y|}xr||yyssz|z}{}~~}~z|z}}}zypwvopmlllowvw}{}||}}~{}zou~zsxwu{{tz}svyu{|z}v|xv~y{||}v}y}x{|y~z~{}~yzvqnotx{z}|{vzs||~xvzy{x|}}{xu||w}zsxxuysprpmvut{}}}zy~~xtmiltvt|~yxswz{xu{wqutzws~}}|sw~wy||w~}wvvp|}{}{~{|}~v|zuwrpvrnjmnmnqzz{}}v{w}z}wuww{xrxxzwvzxxx~zvupx{yx{{}{~{~|w~|~~|}}z}tvtx{souu}v{y~}}tw|x~}||}zwyty}z}~sw{zztqytoqpyxw~zyuy}|x~|x|{{{wuqouvyv|~z}{|y~qt~wxzxsyyx~~}svw|~z}~wqsntwxv{y|y~|zznomrvolwuttkqz|}||{s}}wxtn{}rtou|ww~}~v{}ysz|x|x|~{|{ttxtx~{z~~z}utpotuv~~z|}|zys|~~~}{~yx~x}}~utzuqtrjswnnqy~xz{}t~}~yp|x|vovtpv}w{us}~vyu~}{u|vv|tym|ypst~|wz~x{xq{qwtv}{z}s{z}wzuxst}|totkxqoolwloxxsxz{}wys{v|ruwsrzvo||ypxtw{}z|~|z}y~~s~~wz|}y}vw~|vynp||~|z}{~v|}||}xu{y{{|y||ys}wqrxrosttu{~}}y~u|}~tyywxuzyzurroxytt{xuy|}zzu~|qu}{z~y|xv{~|}{~}~{tszvhr~~~|{}y~y~~wv}|xs{upmvungprppzsu}wy{w{|}|wo|{syxvu~~{~}tsytu}}w{z}{tz|tzww|~{}zv}vz|tuqpmuzwzvxy{}wxy{yvxyspvrpsylnqwqy~}yx~xtwumxurszw~|yuvpjqzuw}yyyzur}|w|~ypw~|~{}zt|wv{}~}~}z{z~}|}~~||xy{y|{wwxojtzuovplkowu~~}|v{u}wt|vw|{ys}yz|wv~{}wruu}x|~}z~y}wx|xsy}|ys|yzzyx{szzsmsvv}|{}}x}{v}zwt|xy|tx{wosslquvtu{}~||t}}wt~{~tttyy{~uwqgltvrux}{y}u|~{x{}~~|}~~}wxywryxwxy~{~|yzyy}}~~{z|wyvsyvoojtsrpjorqrvz~~zw~zu{~xxz{tu|yz}{}unu{{y}|||z}zv}}|z~yy|v|~{~|x{}ytvsnsno|{zs~|uy}~|{v}|{}vsyxtvrowsrmxwsv~|w~yxyzzwzv|{wvtv|vu|~{yuksrrnuwtrz|}|}xy{~|~{q{}{}|y~v{z{x|rlqrsoqohfsxljpso~nkw~~{~trw~uzz}uy~}zzvspvyrspu{{yy{x}w{wtxrx{u||{y}}vvywy|u|vzr}qmvyvq|rpw}{x|~syzzxw|w~vvz}qyvrmw|~{y}z~~{zy{}zq{|{|||}{{|}uyvqwqruwwm~seqwpu{odtttpwy|vsk|lryzytwuuyz{|yx~y~z{~ywz{tysgg|{yxzzwv}z~zvw~z{}}w||~}zv~sss|s~|u~wzrls~ocd|xmgtn`tgmitkkx|kbw|pmou}zsu{wy{||~uwuqwsfzvx~}txxw|y}z|{y{w}xx|~}|{|pwz~|z~wnuqzxo_{urpnkvlln}}wsulwzzrtvy~zwy}yxw~~w|}w~}t~v|~snrhrwlsz{wm|x{zn}||~}z{|{tuoswyxywtk{{|lsvrdotkqplgkpegyzvusnoorpwy~txy{~q}yy}~{~}xx|s}puput|~u}{|x|z|ty{z{x~zzy~||wwvvyuqqz}y|~zqnqlytpszkgtvqowx~xtk}xs|xwxtqv~}}|u|~~~}|}vss|wt|uumiivxt~vyz}v{{~}~y~}||~y{snzplp|z|u}ywur}nhgy{rfsjgokrkosv|}lfr|trs~ytxxt|}|{}~}}y{x|~unvjs{~t~wy||z}zvs|~|~u|smtxtxy}y}wy|mj~zpopsqnouyx}ssm}wu}s}zz{yx|~z~}yw~|yw~zx|v}usvyklrmnz|w|{ysr}~}|u}|~||v}vtrmuqvxuv}}}tmrxsjrzzulnhntgor{ztvxpgqvzv~tq}}o{zzz~x{{tzqvtkvr}~}yq}||~vrw~|}y~{|~|}z{zxwttwwwqq~w~}zzxuvt|~zzujn{yusw{umwu~|vyysrx}z~~w~u}{y~zy}rp}xto{|vhght~~|y}{wz~~~}v{||~}{|wr|opwulpzyxy{{~}}wqllu|zowklnqusmssnlxz|xwzv~zrw}~z~|w~y~w}z~wqsokz~x}|{~{~z{|~|||v~~t||}~~x{||}w~ww|olpxpsu{}t~unxwttxrvrwuw~x}ku{}p~{|||y|{}{v~|~zw~u}t~surtxwposot}{~xxqz}}v{}{~|}}{uupsjtrquvxy}zquyrsz~qqpkzqotq~yz|}ljt~||~}syx~|yzx~vxtwvqv{~psyz}q}|}vrw~z}~}~}}y~~|}y{t~xyyyxnqqvuzwx|~sxyz~toq~zzx~xttvy}|zrz|z|txwz{|~zx}yqoqrnnxxlknv||}y}tz~~|{~x~zz~vxoyowjrwyrw}x~}tpmpt|}|xmunzyzsx{vsrxys}r|{}yv~t|vx|uv|wwov|zy~|{~y{y|~yvz}{{}||vx~~w{vxtr{uxnlnxsrvz{z}vty}zz|szwzxt~nw{t|{~~|w~vyy|}yyy|~svv}tquuwwxtutw|zxyw~||{{~x}}}}}}zvz{}}s|vospkusrqvywzyzyz~xxqt}twvs{~~ymmy}~x|x}}}}wz|}~{uzsqrw{xvry|~~zy|}~|tuyxyw{|}|x~xw}zyx{rv}p|yzx|x}portu{zzwv||u}vvw}zzry|w}u{yz~}y}tz{}~|ysttrmplpxvnkqs~y~|~tz{}~~||yz~s}x}|y{{rwu|tvplsyyxy{xs{xssvvuywr~{{zzxvx}}~s|vzz}~ywu|{|u}|xzyqx|}uqv{~~|{~~}~~~}{~}|yu~t}uw~z~{z~xvtzvyurtnxztnklttsv~u|{zx{~yy||yzuu~y{vv{zt~z{~}{zwx}vywwx~suvvrvyxwwz{}x|yz}~y~yyy}~~z{|rt{|z{nxynsplsutqvz~{x~}}~ww}|yyzt~vor|~vxx{yz~}{|}y{rzspt{u{wx||}{|~}wvww{u|y}{}}}{vu{y}zwx{vumwy|osxu{}u{xttppttz}yw~}}~|~z{~~~zs}~|w|zzz}{vv{|~~~||~stpurnmos|xrqvw~~}}xyz|~z~~}wwx~z}}}px|~|{vxxxuxuovyruxmnt{|}}ww}~uvwyzxv}|}|yz}y~~{z||xvv}}z{~ytxz}ytsz|~xvy}}z{~~~~{~|}~}zwuz~|t{qu}w}xzzv~xxsmw{tvqosot}snkptxz|xz|{{|}~xxx}y~|x|vw|zy~{yxtyvzrtxz~wwwsqy}}z~{|{yw||y|~yy~~wux~~yt{y|~qnt|}}wvqryptqmrvxuy{~wy~~~zv~yqtzxww}z|}~}xz|wwxsyuu{vt~szqx{zz|ywvutu{yxyx{~rouzzuy}{}yytxssx|xrsrekjjmpvz|tw{w}yz}tqyzzyv}|{zz{wy|up|zuzwpnnw|ttu}~{{|yz|{zz{qjlw|rrqpoojhpuvwsqmoorpmrxgrwjmtz}{ux|wusy||~~{z{~}z{mdipw{|~|w}qpsvwuv{{z{vu{|wuv{}~yvx~~}zyvxttnjt{{z~xz{{zqozxxwtqxvxwsrwy|{zpps}|uz}roquy}qntru|{xv~~vyxsvy{v}{}yx}}y}os{xzxrqlr||}~}}|t{ztxtnijruvyqvywpebdmqurngljjmokikottvw{x{wy|~}~xwy~y}qrrkmnnnj{||u|{ru}{y~uqupu}{{|wvvxtx}z}{|zwxzy}t|ukqtvxuxovyswos|{rt|{|~zvwy{w|{w|smlqwz|ywvomytw|w}ssz}|w|~zy|srvvoormqu~{z{|yzvqnjks{wvljqrspmefhmkmmtigvmjqvx~zstw{{ww{|}|~xuoqxtqtkovyytx|yzzzs|wuw~|ztuu{~~|xys~x{|~{xuups|suxooy||z{x{z~{qqyx{xxu||{~yy|}v|{wv{s~usvv{{spuwt|vy|x|xvvy|w}|{}yz~vyyln{wx}wtry~~z|xskpupsxqopyxxuwzypjfhntvtoisoirvppotx{z}}z|{y{|y{zz|~||~}{qinphswuny~zwtzzx~|ttvrx}~xwvzwy~x~}u}}wvvz|}wuzuvypsvv}u{vtzwzpqz}~xs||~zxuuw~~z|{zz}|xv}}~~vv||}uwvpv|{|xyzw~w{qv~zux}~}~|~xwvy{zszww}so|~wntvuy~{~xzupv{}|wqqv||z|}{{vvx~~~{|~~|v|~||~|yoks|xvpmnkkxzxttw}~~|rrz{}u~~}{}x{z}{sqry{yspw~}vx{y}uuz{rtxz||~{|yz}wvv{{tpty{zuo{wtvyw}|zv||}~|{z}{z|{yzysr~zv}wtv|||{|yniqsvx{~vqst|}wjqsojmtoorpkjgjowwvpr{tl{}xvv{||}y~~yz~~}}{trnpry{zzv|wtx|yyyzwoouptzzysvwvy}yv}y|}{|zt|~zrooty~~{xx|~~~ux{y~z~~ss|||{trry~{zx{~~vt}uot{xuosw~|x{vw{{zx}}w{}{wpuxwv~~}~~x}~z}rprkkt~zzzzywxslpwnlmijrsupjglruzystxrvx|}}yyz||}ywz}||}ysv{xwsqnsx}ww~|vuu{~{vwpmtw~}uo{{xw||{~~|{~{zz~xvy{|zxssu{||vy~xxy~||u{xy||xxwxwxy{~wvy}|{rvvstywy{~|ywv}{~}~{||zuuxwzzwq|{xyyy~z}z||vttxslmvy~~ywwzwpwsqnoutoqomljkpvvvsw{vn{}yz}}}~zwyv{}~|wwuspqqtx~}yw|~}{{xtpwttwywvyvsx}zv~}{}{}|{}qxz{|{trprv}~}{y~~zy~}z}uu|z}|}yvsuw~|~~vyunx{zuruzzy|zxz~z}|s{zuv{ywsuzyx~xy|~~||~z}x{x{zqotmks~}yzuy{}z~wrtvz}zpqzmmuzy}~zyxz}xx~}wrqvspkotz|xwvoz~ytouuusplmrw|~v}~z{}y{uuyxpxxtsxvy~xrxzxz}}}y{~}xx|}xu}ytwwtvxrz~{w{z{|}~zqrrsstpru~}~}wuyuqrxxwxxxvwtu|~v}~}xspvuu{snpuvvtwvwwyw}~tz|~~{w~uswzvopvxzz||~}zzwtrtsrrvxyyz}}|w}|vt|yuuvutwxtt}wpt}w}{z{}}~{v{|vwtuuvuxzzz{~y}}v|{vtwwzxrq{~}yx|}~~w~}xuwyrx{rlntx|zvqxurz}|{|{w|{zwvstrv{|wy~{wrz{{uuv{}zy~{~}~~zwy}}{wz|yrnnpuxytuy{x|{~zs|~{zxqwxpmsy|}}{|y{|wsvxwz|t~|z~|vx~ysvyysppxzvrvy~wt}~}~}uw}yoruxyvrortxz~z~}|w}}tv{wvy}|~v~yvtwy|{{wswutsvyzxzyry~yxu{~|wz{qppsuwsst{{wyvsw|z{yywzxyzy~{zx{~xwvtu{yx{|zxwuvvxw{{oz|vz}~zvyxxrw{vqvzwqsxyzz}}~}vqpmkmosqprrv}{{{~|~{y}{||{wutw|}~~xz}~xxw{|~zz{vr}|vutvvvuxwxwzzurwvv}zy|}vv~~yz{}v{yxttsrswyy{}zy{vx{~{x}}y}{}~{}~xx}wvvxxzwy{|zzuquxwtttxz~{xw}|}ysu}zyxyz|~xqqx|y}{{zy|~tnrmgjxx||zuuxxsx{|trx~z}|ry{pgpwxxwusttvx}{xr}xpw}}z{sz}z|||x{pkkmpr}|xrpnmjoqmpqjinqttyz{xp|llvuty}|~{uv~}z{xy|{~~~{txsoq}wtuwvrqrxwqmv}uz~~ovwt|vpllnopszvps~{tou{}}~}z{wy{|~rrxwv}~{ztrvzty{xuy|}{{}~}}yqswuw~vustqigmlpz~zwvz{~yvy~|wuy|}~}|yzx~~tvxqmt}|{{wuv|~wnu~zzyxsnmvutz{z~xy{xxw{|yrt{xtpqx{xvyyz{}}}~}}}rnxywx}}vsxyxy}{vsy{}{}yz}~{yxwmjlqx|y|}yvwu{ysquvxyzxvqr}~{y}||swvmfr|~}||vss||pmx}}{z}~~}{~|zx{}}xw~{z~|umsy|zxuvuvvz{{zyzwszywy|wyxtwzzzz}{vswwyzytz}}~|tqz{~}}wqt{{|yz|~z~}}~|}{tlt~upy|yyumktwqpt}~}y|}~|||~zw}}~}|}}~{wnt{xs|}}x{~x|}wyxslpsqpt{~|z{yyz|{vpoopvttx}|~}|}}~~~z}~}|vxwtt{{y~~}{xyxzujhtvpov}zyutxwrv}}xst{}|wxxyttxzv{{|{w{{|~~|}}v|xxvts|~y}{{wxvpjovuuvw{}vwuuttqpqtvvwuuy~z{{~~~zxz{yxzzx}~{yy{}xw{~}}|}xz|{{|slmuzxvy~}ywoovxompuxtnmsuurxy}}{}~ww~{snw}~}}{{}|xxzxv|{zuz~~}yz}xwtsrsqrqqrvrnruvuwwwwyvvy}z|}zz{z{zyrqtzxz{|~|}}{wrpx}~||}trwxvrsuyvqnswvor{{vvxwwwyy|zur~|ty}}~|zzzwvuvspq}|z~|{wvtplnw~|{yzwtxyurvyyvwwyy{uqv~zxzxtv|xsrttx~wuxyxywwy}{ww}}~{uv~yvz{|y|~}zu{ztz}}{{|yxxz{zpn}uosuwxwtrsqqu|xtx|x~}~~}~{~~xwtsoptxy~wy~~~yty|yuurpx|vpqqrstpqsxxxz{y{|~}x~}|||wttwwpioy{|~yt}~xwxxyxwuvqlpyupqwzxttz~}|}ysu{}}~|||z~~~}ytwxxutqsy|{||v{zxwuuuusvxwtwyz{|{~~}|~~~~}{wtu||||}|~|{|}x}}~~}zzwurrv~|xxwuz~zyz~{wxz}}}}~~zuy~w{~|~}|}|zy{|y}|}~~|x|}|}}|xsptstuuv|}~~~x|{xv}~zuvvwz|yz~~|z{~}{~|z}~zzz}wy|vrsrtporvttx~~xr}~uuwy{zwvwuvx~}{}|yty{{z~}z{|~|yywzyxsrponmkqx{~}~{|xvz|wvuwyywy||zz}{y{z{uqt~~z{~z|~yw}yyyyvtsutrswzwqnz~{~~|||xtv~}zz~{vx{}|z{{x{|}|~}zw}{xx}~y|}{|{|{zvvx|{vtvz||yvz}}~|{~}~~}~||wz~}}|{}|{yyvuu{{wx}~~zytx}~z|}}zx}|y{yxwxwuyzv~}{{{z~~~{z}yy|yvwxzy{xus{{{~{|{zyzwyy{~zy~~wx}{zxz~{y}}|~~~}xuw{xy}}zuw~xuw|xzy{|xwz|{x{~zux||y~~}~x~~~|}~{y~{}~zuz~{vtuvxutx||~xx{zz}}|xxvutwz~~|~zw{~~zy}}~|xy}}}{yxyvxxxvutsttrs}}|{}yvwxxvxz~zvu}{~~ztu}y{}~~}}z|{z~z|wwzyvwyvuuvuvx|{wppy~zuy}}~}zvvz||z|}{|{x||xurrz}zvyyz{}||{|{|{yvww|}ysw|~ytswzzxywuv~~|}{uz|~~}~{zy|yt{zwyx{yxuuqoszxw|x{|y{zyxywvy}zqv|{{zzyywvvvuu|}yz}}{|}~~ytt{|}|xsw{{xwwvwwwuy{{z|{|zx|{x{zuvy|}|xz|yxxzz{xtsyzuu{}|}~xtz~{vttsuuwz{srvywy|~yy~{{}|}wz~~~}|yzy{zx|yvw}}zwwvyxuqw{zy{~~{|}~zuvwxuttrrrtw||z||z}|}|~~~~|~||{|{{ywx{wyzyzzywwuttupqz}z|}{wy|}wttvvvy|~zwv~~|ut~yz{~~~}}~}zx~|xwx|}vuxwvuvuwz}{xrpt}~~|xvw~|yx|~}}}z||yxsuz~zyyz{|}}{z{{{{|{xvvuy|zsu{}xsty||{||yx~yx}|~vw~yyy{|{xxwsrw|z{~z}{{|yzxxwwuvy|~~yrt{~||||{}{zz|zx{}{}{vv|}}}}vuy{yxxwxxywz}~yxy|}~{x}yy|{utwz{|{w{{{z{{{zvsw|xst{{||}}~qwtsrv}{y}umsvoeeijs~|ywp}v}}|~xvkx}ko{w}xzyu}}zxiswkkqskgmrzpxq{ttyo[Xm{q}x{z~w|}}prwquyz|szxwkgssrzupt|z|vhjgvz~{ypuroqZgxjefafY`ige^hi{rry{rjv|v~|sztjxtwvqbms|turvxzw~}~~{ovvrihcXfxyqfgkghmgrqiy{oqwz|rlyshqm|~qoxlizmvqxzsmgs|tv||tmzz{xxy|s~tw|ze\Zbhmsu}misi_zxgpmn|piusvt[dwm{}v|ztrvpzqu{y|msvfewy~{xxr{z|kz~xyuwkitg`nnw|}w}qpobjurlktqjcnrcfb`lix|zue|pxrx|ztmtmhut{x|vq{|y{~uw{w}wnlvjc_rxmvpawt^`^ctjfxvst]e|qswpjt~zxv{|nqzg\fbY}{u{~t|zw}wyjssmwkyy|tqocjqkicprpnnwldlkrgi|yptroiz~xus}|npxdjjq{y|{y~zq}vpoj{{x{yf^Xkpn~~gjlcidptdnxfzptskl}||xyyptwvq|vy~tkem_`~yp{w|~}u{|ww}{qzzmxrjjVbvjuyxwo~vsqq|snuru`_qop}|lnmgjzvn|zz|}prkoql{tz~|r|u}p{yumy~yxvxgfY`c\g}{mnhs|qu~w_prnlh]pokuzzs}w{}xwxry|yvrxm]rr`nzuuzw~}|zw{uso~{mt}uxdVmw|}~x|moxrtjrsekqrk[he`jwpxqnfx{|vvthplodcr{~{uy}yzyrxz~~y~rhifojbo|{snhwwiqz{q^pxmnnlgxljq|}}y{{x~vznina[oj\ejv{~}~w~ytr{~ppqobcdj~y|zpoyttvko{v|qgkspfrwqy~~y{yxqy|z{ytzthrsjji\wy~|uu{}~|uuqyoougbSRnq~|t|t|ytmv|mzqowpmgtvo|un|ynv}trxl|rvpsrladtq{vourvwn~~tz{skcs[Y`bVo|xyw~|x|y}|uv|tjvi_`Xzqrzsspzq~~~tqzwrwvkmtpx{|xuv~qv}ws~t|zxn|qn{qkThhfpi}}}ww~irfajc[hie~quz}{p|{w~wvyngtbmpkvz|v~yv~{~yrtrxjdmeidgcr}v{ckjiwfxwuc_vjvsqwx~|{~vylt[ov^]^um{ywxyvv}zukekichljo}{wpsywe|wstdpnnoplm}~zskspmfwklxqkYsvyvnrsqnw~{|vpsmeindjyqr}qz}yzwpfnpmpvsuv}qowpl|xs}gvzotciolrvzy{~xpup}}smz{}wnxea]Pog_cwruz|x{uvynovrnxv|ovqxqsp|xqyyuqcdilkw}pxtxv{q|q~qvcu~e]\kZaoojex~}rxxej[g}kim{~p~s|~~vnuyww{tpsphqyw}|t}z|{ntz~}yqrlxzjxzs_]neha`uz}|qqd}|ibisboz{qnytsy~|~~yuyulsn^cZsz{|z{u|~|}zy~ylvwwghphhf`Xcp{~xusn|zl{xffxrtnly{|||xwji^vvb[dpcs}y}yptnutzzzwladgfflikvzz~xpu}}pmyssspgnx~}zpmjohtvdnvpa]sv{}{tri|tlsyypsxww{trtncggbkvnrv}x}xjkorqyyyusmunynw}ofwwrl`lppv{x}|vz|rqzxnqmxvuxw}wo||rvkkb\otnwx}}yu~my|vpoq~x}yutvztmjjxycef\bkx{z~wyrn~xt{w}xvxztjfil`trS\a_thnurldfxuo|wy{{z~n{rowo{xtuol{zjpwew|xurz|tswzywxjox}xvrr}pjti`g_hr^]pqu}ryuqyxqietxtxw}~wwtmqniskcbklk{zywnzxz~xyomruillkYkuW^k_qfb{ux~qkfbtpbswsyw}wyuvmhtsglq\mwq|xw{z|}~uxxl{}yus{ht}rtrgjbmygesokturxn{zuqo|~nnxzxmsmt|fiod_Zgeepyxy|z}{u~~x{|~y~yz|t|tmuxsht[igfsaox{ywyushi|ooyvq}l}u|~vmepwh]k_bxqp{y~wr{~vk{bruuz|uxy}u~~ptqpzn^ee`gdgt~|wqzvn}qxz}pqjizjn}qh]ehdqtvs|xux{vswux}x~~vy|vi{q^ijfpYajmeceuyurkwmmkx~v|rx}|wsin~wjwmizqmt}u}|~xqyw}{fiux{}zr|~tokkusbdfZX[Umno{uuzgqng|~zzw{q|o|wlhkxikkictrt~|{}}}}{xw{xvuxwns~e[gfslbookZY_y~~}sykswheextuw~|vr~tlr`nzrkssimoy{zzowz~lv~{|tx}w}vwuu|segldaa^pdhzvxvruurkzz{{{o{to~uhegsdfdfenudgx|wt~xzwnup|vvvv}~xttqfos|uanppa_]l{prtr{ppo~u|}z}slryksferoko{rqmq~~y}nkvymmw~{st|}tzut{~spnj\]Tch^kmfkw~||o||{yts}lovifiyxhjagj{uhr{trlddffn{umt|sz}oyuvs}vztw||}xk{qxuwmrwueluwytoiiputx{vknz|wyxz|vxos}{z|~ut|swkxhoaTakc\orrr~znoytcYzdeorbhsmmovy}~qhwwl~}wopy{{|ytr|tshtryhrmp{sro~{xxvrcmqe[qwywy~}|nwz}||~yry|uy{wo_``Zqoiirlkfjeukiia`cci~lp{wm}_osm{|g[rvxswmoyt~|zm|e`loh}j||uu{jkrg|{ja|tmplyp{}|qkk{zsyy~}tntQP^YW{vptlvyfwmmVaeeYmldr{hyrm_hl{x[c~wutmqt|~wjpZgyjhymswv~t~mkeqrdbv|lolwmuuqg{t{{~wqzyypt|UQclVkt}|rjg~iruoY_nj^]uao~ppqq^zmdu|cZ|xrkzisz~j~y[h}zevmynv~yql{odpvdzjt}|ummxq~|qtg|x}zy~umy|xrs|VSfnXfnvnjktwrZapk^]t_jwjnqp_}sjy~c[}zskxhoy}o{^k~jxm{m}v~y}olwqaio^tqt}yomxuw~oxexwyywxpz|z~xzp`Rco^bmswnrp}teXrldX}adqmetsas~lwnVr~ulygopxwzeeznvqw{sv}{}{~vtrj_aj_czzm|prpnshoxzy||zvvt{~{zznxsRWii[oj~x{h|wtZetj]cr]enaorob|ta[zzsjxlozxu|bn}p~m}}p|w~wl}ziroZ`fXo~yu}tpx}os}fvzwxw||ws|xx~~}v|kxjOZkhbwn|ivv[iuj^jo\dj]rrnc}w^[yyslwqq}vw{co{rm}zs}x}ukyvfnlU[bWq{u}xqxlv~hv|wywx~}zuw|w{w~}n|wirkNVhlfukzwcezncex\`i_isrb~wgUrytjtxwt{gl{suytzzxwsjthbwUU`\hoxzonx~{op{|x{q{~}~yvzz}ssmpvojjoTSepjsyvn`{sib`^hcbvtdvxoSjzvm|x~tx{}mkyt}tr~zvz}vf~th^{yVS`agp{}nqr|z|qo}zyv{~ox~~yt|xy|qokioigjnTUepns}vpd|tjf`^gaeutdxylTmzwo{wu|~~lnz~tyyq}}vt{ph|oc`~rSUb`qq~zsjuyz|nszzs}~woz{su}sxrwr`igfengS[jouoyzin{pgqu]ag]urqe|^[vyus|xo{{lt}w~oyw|wzsxzfruh]m`Q[cbw~~p{jyv|woyysu{nu~~{qywu|n|~jh_fbejmXWdnlvyvj}vmkb`haktve{|iWpzxq~}ysy{}orzyxsozvoyykkui_ghQWb^}~|tgusz{pw~xqwy}or}qyxt}m~{~ij]daejnYWajhy{ynxpndaicnuxf|~jXqzwq|}|xsx{}rtzyyun{uozxnjtj`flRU_\x}x}irryqu|xq|rppzxruxrypvzjzu[d`eio_V]gf~u{o{{snoahgf{xmovYizzt|xqs||xsy}vsns{s}tveqkc`yyZR[\hzsvnuv}try|w~xm~ymutyqwr~u~kzwhd]``flkXYbhlzy|p|vquidjduvzf|i[r||x|~}wxy|uu{{{unzt}myundnf_e~oVT]\w~}xqrtyrszz|tmsmvtvqvoqvk{yqh~`^^aemhX[ejrxz|r{uqxjeidzuze}g\s}~||~yzy|vu{{}tnzt{kwsmaib]d}rYV__{~}wusuysryz{u}ltmuu~xpsnqxh|{trb{cZ]^dkl\[ens{qzvrvqfjfsw{iro[m}~ux}{ty|yuorwky}mr_da]^v{bX_cr{sqvw~yquzwoow|{lq{z}~qqpvxsgrou^rmX\\ciob]fqttwwstxhihm{zpiu]i}wy~~~tw|yqtzrv}ltkq^``\^s}h\ags|trvw{qtyvnpt|{lq{z~}~ppouxo}fo|mt]onX\\cjod_hswtwwtwyjjiry{njs^mw{}ux|zuq~~qv}gyyjo[_][ax|f^di||stxzwptxxxtkz}uls~wz|{{opn{nvsctrom[ueY[^fmncblu~}sxuurikjv}ewibv}~xuz{rqurwrjloeZ^Z]lsaahozwxx~~rqwvkvo|}mowz~{}z}qoou}yj{dk{yjr[koZ\]djpf`grwwxwv||mll{x}mkp`ow~}vy|x|pxpu}vfpmkZ]Z]i}we_fl~z|xy~spvvl{l}~mmuy~y|z~topu}{h{dizyjs\jq[\]djof^dot~yxwx~ooo~yolqaov~vy}z|qypu|vfrln[\Z]h{xf^djxyz}uptw~n~i|~nlr|yxwzx}xoqsyg{~hev|jsbau`\]bhoi_`jqxxyx}toqw|zfydi|}xyw}}syxqsx{gw|hr`[Z[cu}m`bhy}w{{{|qqvw|nosvjnvqzxxyrpqzsisakypkpXnm\]^floe_dnv|zxzrrsypkqcpvwy}z{rxosy}yn{vhZRXi{tk}tgfsyw{tZmcwk\eUaqz{mdgttxsuiwu{uzoew~xz~lRfaufZiWbr~~pjnsx~wt{kw}met{jxncs~crmnfxfn|snnpr}|}nttfUkytl}sgufqnojnuzttvv|~xdI_v~jpoy[khYds~{{~z~}mqr}rjuu~oihlj{jmnfPg|s~pls~|xyymkicK_{w|zgmrY^hzwtvvso|~~}|zs|vpuzyg|szkcclm{kmpoXe~v}w{mr|z}tt~~ghklVd{ss|_bi{xswuqkxxwvv{xp{wpuxwf}ryibdoplnss\gv}x{mpzy|qr~}hinoZeztq{^aizwsutmjxvvtuyuq|xswxwf|rzh`dqqmqwt_jt}v|ipz|xpt~}fkro[lxpxu\blzrtushlwtqvytx|pt}xxx{pjwsz|d`hst~mt{s`qs~r|hq}zsnx}}uhqwk^syl|k]eryqusodtutm~ttxwj{x}x}hwqv~sa`oq|ur{~lcxxw~qmjtx|y~op~zloxxee|{|r|abiysrtrhhyrqnptwnj}|wf|qvi_ftpqz{flt|u{{fo{u|skx{}|xnz}pap|p~laivyquqlcyurkrsupdw}gzpt~ra`qm|vzngxwz~rikux{}yzzkr}u~nzyei||yzxchr|qtrpbrzqnrwptrejqmvpv~f]lpp|v{iqw~r|shr||s~uqj{u{zvuqeqs~lfn|xqtpietrjprsk`uh|np|s``rjz~wtkxx{q}kmw~}u|}ztz~}ko|pp}~ljx~w}iktttsodprpm|msqec~{hzlom^fri}wqp}v}|szh}~~yuzxktjmwwv}|}iq|net~}zo{qkqyw|}|sbnymnzz{tmswWgsb_fpuzqo}u~yl[p~XG]jqtvs}os}o|jhvrqrtq}jsa]|olox|iq~zsg}y{~rfhttpUad}x_]bo]Zngp`hksru{yypgwfsoctx~}z}{Qklfzdefvtsu}|xuwywvig_]a_ttyrfarkehptlm~uvwroqwjorqvqafrim~xpo}qxy`^zsy}zw{p{|q~w|}ppwmhTcury{umzjcvsXjjdqiyju}rqV}l}xzhlqs}yx~|y|wpprdgimvswmrxyvw}ztzff_Xo^[{zpvsiynhsmrzxwrtkehzqasuxwvxkqr]rrr~zx|lrslcqu||twvz~~w{vvu|xxphaefbwsoxmmxq^txdjdj~vwtvwepupuw}x~nojrwuzytxdhx_g{tvo|zuv~{y|zyncZgiahwuzorpwper{rsn{}tjerpmmf{sf~v|w]hrosoxwxwuhkyaq{v{}yrw~ytvprzuvnbbod]jzuwzfjmalcmyrw~xr_rgn}nm}zmrll~~}~{eorjdjnmzzw~|{}}z{ljrebwlmo{~rwzjnwwrk|wwppujiuoifqssvwewvdlktw~uhrulgi}x{|~~}}rv}lr}|~ugqgj`\vttyxj~ncbq|pn|ch}xwnkjnwy}qfqwzys~y~vuxkfr`U}{nsx|wvz}wpgsyseYkyq~uoxqztwsznippyabvg`tvr~ffbrxt|tuzmvmenjpxvy{xwuz|z{qlhkn]eprxtumi}|ouuhx{v}v_exdpzsntoxr||{vjildhqlef|v{z}~}rha[ZXdsnTgvr{us~u}yquwpo|taoy~}Yta_ms}}{}{wsi|z{{wkktt~~qhm{wpjuq`xu|Uun^bdnrqv}~xl||lxwx{wz|puzrwrfmxnW|y{uxvt{|lzwoup{wkllyux}ox|vy{rfSyljcbjquq_gjfvigptnbdasvy}nvytp|n{yvolo`ww~pqvozqtzzrilex}~tof`iapmqpno`[we[cdglh{yb[`Vevv}}nu}~vv|wtqsogqh}}~ym|nv{~ztnujt~ljkkank~x{snnm[rn[blnqgoza[b[[tx}}qo|tzu~norvjqp|}|zy~pot~wqxum~hgjphnrw|snjo_ju^`ptulg~c[bbYp|}~~vk|ry}ulmpwost}|~{yq|suzwovwn|eehojqvw}upkr`jvabrvvld}aZacZo}~wl|rx}u~}ikovquw}}|zr|twxvovwoxccfnkuyx}wrou`mvaervujez_Yaa[r~tm{q{}v|~ygjntpyx}~}otz{{qnwuq|q`cgmkxy{ytsv_urbjwxufir[Zb_^u~qrxp~zy}}{|rfjnrq{x~ou~vnnvpw|}z}h`chjoy{~{tzoc|jemxuo`vfX\aZfy~}m~tu~u{y{}jhkp~|}~tz{zxtxyz|plnxt~weasipm{soovwiVUbY_]Yimjltor{zkj{sybg||V]gpotk}{}}uuzsxpo|xoq``jrrutqqjs{~uj^xf_cgbp{|}rfgfo_ZZadW`jqpvmv~yx~}|~ttsrxxytvslooxoepw{y}t}zzzp}wz|vpjaXowdcj]^Zadoc`kqqpof}|kggp|z}||uyz|v~vv|wzxrxqtuZUae^cuuzvxwtrWrxkjxqo}{}drmhksg_mu}~}|_^ruwjk`ervzmpu~oWbkX]`cpy|kxz~]xx|trz||xqmmmt|p_gp|rsk}jku{|yqiYlwwz}gh{umlYTirpaaLTaggZbx~|{sQkpao{guutyqtv}kfrxpthdfqxwxu{~}vw~my~wvzr^cuvkgi_agmwzaemdzm~zoqzz|xhissptnsuq{ylu}rwurzii[`uwky|u{py}esy|nKWbdkttbw|c\Qvxpuy{{gbzngo|tlxv~~yknzpet|ne\e~}r~xswmyvyxmy~v~yxvqw{mc``euqtwiklmzznrwnflinplsg\bilxpjp|qrz~z~vuzzlv}jsy~}~umx|fj|tzsrp_Jgzp|j]u}iluouiyu}z~qZ^oei|xmqd~vxshh|ytrpqalersmyw}sq|zl~{~qv{vli|noackv|ruoqiokmciqrrc[j}|sopihgozq}vqv}yomzt~xlqxs{llgr~f}wwyz}}xiQT}xvvy~xfbsslsmqhly`po`errxunmoo|olxvgx}l[atun{}{y|{ul~wz~y||skkh``bwdk|tplokkywlqyuu{p]^n}~}kohw|}~}qtbevwx{x{}exutmx~|{x|}ung~cZivxvztt}kwthgmx~{lrtojbbs\d|uwwk_vthu{qpxtkjnih|}n|z|{nm~y}tcS`ljmivztiizuqryvjqbvokvsy~~spr~}z}iyws|~|tqysgp|~xt{ui{tq|~{sx}{y{|vxzg^jbxw|rq{u]~zwwk{}q]Xv}i_kvzomyvnt{}{o|{swZhjp~}|wl~w|z}z{wwnjyjhrwz{svz~||zysmpv{ogmsak|yrljuxws~|u}~ot}mVWtzt{v|y}{xxvz{rlsut`Vgnny}fpskqrpfk~vtfhxxpo}wmy{vthx}}toqmhpnmyr}z~szyupk~{wwymghgXjef}zx}ttvwtomjqofdknv}qqu{orzkkwpvuldnzod]{~{yxz~yw}xezwnpbclvlcpx{r~ykl}sifyqrjo}swvrux|zy{yx}}zv{y|xslglxnm~{}{s{~~wv~{xywyxpnoqoZYlsu}|yx~dz}on[l{uoin{jgnmfhxsyll}va`q|t~}{y|{n|s~uzsbdfaZSeqso}~x|xzvlopnppkjmlryz~}spvv}ww}zig|cdlo{y{z{|}tz}~~yy|}cmwae`\frzuqz}rm~wgcgcWXu|tzvnkuun{eihgcdxw~x}|u}n}}|ru~~soxx|twxi\^m}~~~}{zzyy~mqngmxtr}|v{~~q|pwxwzokv|jc`\go}}{y{zyquqvv{~{qrstutudRyzx|zngs~xr[d~{}{qptlwzuq{z}|uu{hjwcs~|xzxssfp{vu}t{~yto^us_[^oyx}}|rsz{{vpjkxw|u{|xnhsvojmrz}tr}z|rgkvxzmt~~}gy}rotoc\^nta[hnpwpsw{rkn_mrpvzz}}|zz|xry}zz}yljnrokvn|zwzmu{xxt|vsyqqz|}znjikjggj`d}y|{quuskgpx{wlkopt}|qv{qq{|{{vsudmxtuv}o|~~{{y{||stqlpmjiq~pnffwwntwv{y~ux|{vmq{kzu}{|yr{z{zpy|lmrnf[_zwpt}{{juw{y|}{lw{ytpmrtkb[asz{{|xtz|xlwywpw}~q|{{|{~~tmmonegv}lv{|w{zndqyx{xvy{rmv}trrse_eezxzz{jdrwuz}ux~||qv~~riu|spmjhu~pq`\xs~wvqu~|uyqwqfzrgl^\ZW^ckwy}sn}rl~~|~}|x~}tvuxxssqppsoinrt}xpzxvspwyuo~~y~uxpwommjmpme[]ousz}zu{|kcmsjhtwsonoyvh}wllz~xpr|vztx}~~~~zwyw}s~zvpjkmp|~pf`^^`nj`rko}{}~~xjmvvvx|rv{z}{y{|{kg{vjh_ionos}}z{|tw{{~{{z|{vlr|zwyyjgwlfjh`cu~{y}~{}~tqokjp}zzqowqu~uu|omonnkjrsry|p}nv{rruvx}}upqv|zp{pp|ztka[dlo{outoq|sp{wnptrplo|ulda\[p}v~zxxsw|z}xr|}rp{yrljmkklh]`pr|x||vljxyxxx~xwzwtwwttttgo}kgvz{{|xuz{qhhu~||zutwz{sop_kxmgdcp~xgj{wwyurqw{xqhj~|}ykv~}~{uh]l~{qvu|xx|{}zlsyszrieb`[`nvre]hrt~rznr~|z}{y|zyqv~zslmqqqmhky|yrxs~uquy{sr~tlmvywsifgeehkjYg}~zyxtpqwwuxsrurywgl~ymsmcusny}yxyzus||rvsonlprdfjip|sil^`ntsou|vu}y{|yyxnt||wzwomy{xwlecebemuyvx}~z{|~nn{|~wtvtv~tar}rrvsqsqojefdhw~{v~}uzsrunnzy~wrolr}|~{}~zqkiuzzruz{yywwrsy~{rv}}vq|xpt}}xola^gt|zmX`uurts|}xhqzaTW_mqt{wusqb_pvvxrrmnqtpnpx~xwulhq}rvxpz}sof{{v|wy{voactwudW[b]V[cdr}rv{z}ns~pko}w}zqy|zqmtlmsuvw}zxv{{y}urqgp~rlr}~sif^{zqwukc\agkliqt]}r{ofrz~|lgnw~mdrrikqupmw~xku~ykZ{lq~}ww~}y~}{zedfdgbpxyr`t{mpZv~opv~ncsustzuornxrm{ytvxrt|~z~}nkkqyulu|v}vlnwlx~~zyt|zyxuk^bsk\Zdnzsgnpimzvvbe~sl^ksxzpn~zhnyyuds|}nuf~khexwxwutoqv|~~vowxhVnnoqpnrghh{tngnuwmozulrlco{skntymdhlx{ywsksm^p}wx|zqpp{r|xsr|no[TUc|~~ji~rl_qwzvgawr`doqm\ey|utmyoeuvt}qvvysmnz{{vx~pkmu~~q|pz{vvq]Yxvxy{xuxulrpejtvld`}moi^djxzvusy|x|wk~qvpp{oehqqlswl}{tx}y~z}|kfnin[fyq~kistn]fxpmmkenzrc_{uyxour{tz~z~wyslpbxtqzyz~i}ywljt|}{zx`gx_ejr|}}ksotgaado~~mlhjnqpybq~t~te{}qqz~viwyymps{uiov{w~~y}vuz}eQ]vrfcx~zwobozjgnv}fj`uzeos|~xqs~w}ox|srpzvdnroqw}urj~ou}}xm}y~~|wsppneneo~}zzzxbf}mxox}vpeXothn{~nt}w{xy{pkzvovonocro|ogvsswsv|~rzwqjlxy{yep}ifnwx{{zlZUVejkmiinqz~pcuv||rvvxtl{w{vh]tulot}dbo~qxvloljty|~}ypwso{zxhs|sfYcqZbty{k^blccgadilkeftvgxxzxvy~row}oafn[oqmz~sdhqzw~vnsjyximoYfr_p}fh~w}ovxsgrrmr{{gRioqqgqu{krys||tu{vbr{odz{]wjn}}rvztx}r{dtxymv^jkd~k[dvj~zzw|xls}pYsrktpooqseuyzrsricvpgpfkmelyrwrst{xh}vuzzuqzrtom]gxgnzw|ymklyrt~xxsatpnmu}uf|phxop}xtxwnuvoxwvgrwixzz|}sy|{tk~xyw~s{gxpdhfe]rtdn~zqkqrwo|ytqlgsfh~qntxq}tgvvwbqwjmpujrrn|uufm}}zus|x{|oxmjpic\lkewypjou|ltypf^vqjlxmyytq~r|uz~hlylqopk{wk{w}zohrv|~vju~s~~ykswjkecaswm{sekvwz}ulndxtlfvtroytwozvv}{jiyquoicmylw|mpw~|j}zyw}x|{oiqehid^e|r}|vinv~sq|ut`ovroxux{mywrryyxnhqnmhlop|~}}rnry~y~n~}v|wt~~{mctcgmedf}szkjn{wt|ukn^pzrkqtuzouwtsn}vz{re}~rsslljttux{x~~iy~~zyt~yh^yudcfdgg~p}zqrwzrznl]u~xoszy{t|~x}oqyxvianmkgimt~zoov~}}y{lx~~|zy|~zh_zugliebh~vznozvr||uoj[x{|ou|szpvv{tu|y|{ki|oujhhvx~|vv{wx|tgw}z}~u|ywq`eqajchcwv}tvwy}zrsiiywh}~uss}yumx{yxsfrrlsfjc~~~{z{|{q{iuwyq|u{txu|}u\fyvbZ_qpmkpzxvsslgdo~wqyztx|~ysznhwsflstyeqvce]t~}uy~zgmpr|u|uslliqik~n^L]nqvifv~~qm}gekttvsxttfn{t[RT`}yqtzwoysthm|}ny{x{tkxporo}uiaa[^p}uzz|xvk`qvnv{~|w~yjxtmr{tgwsadgsz~vyxoe_fsyxpvbayjflmdVKrnneku{x}rqywnz}x}nklxxrttpquyhergg_y}uwy|sy{tlswy|rs|oqmhbaYOSZhx~x}ymy~trtsik|{o~vrrpxtthy{txkkhjptpm{tu{}w{}ezzws~~{wd}ukfwhm{{iOUwzjfir|vjvsgjnxwwvhv}|k]r~cYcpm]k{v{wx~rwup{}z{x~kgejswmioqqpjceTjrmjmvyyufo{rx{}~vwzvopwx{i[ufnoggp}w~uzxo|lhu~~nr~kylgelyjqetnT[`ikmr}yxzzxy{ixy~wxlvpw|q`pzqqgsjksrcby|vzxuf~yvxz|byvmgauvyr\ThlbYarwqo}vxz{qmpty|{~suutkgfotysrsjgpu}rf~t{}ok}x}puzp}}sqpqmjjnheitxqbZh]jp}y|}vn\sqq{tx~md|ujij}|liVxsgsx~uzsqqwrtuznurscdki\Wkmoferecjwxo}~|~|wvuy|~}gd|mshq~yl[Rjspvn~xz~mvjv~|{vtbusehb_^inl^Vdlqywvx|{sosoy|wuqmqpmomwumjjmrtr}s|krxwyzumf~zyu|zvv{q_Wnzrjd`gbalbwtpy~|~~uhgt{yur{yrpolhgeplW\komdccjx{|{tqej{~s~~~lyzzrr}~xptu{zx}skq|z{wsqebswXe{h[U\ctr_|rjntutp{mh}tj|}tmmnfdq|rklqpx{st{{ynj{yXkp]VV]ajz|e{}yz|z~grur}opwzzpei}tkkx|vty{xoxuy}xtt_~xw}wlp{~wppvuTWz\ebSgtvvhVWl~aZdt{ti_tm}uns}jgsnry}y}bdluz}zw~~utf|sop{s}~z|ofnwofmh{rp~m}{y}~wxuoya~wvqyu||snnlxkRwcbXTvz|w_O`|_`o{chvizwldhp~tdmgfhtgh~~{r~ye|}xrpiquz{zyv_|tqdzclyrtxyw~||yu{kexw|ytpt~yutqjo{Wht`gNi|~~nUQrm\evsZv}fpheisfkuljhozwmrr~{wxsxlyvtnlj|r}{|xxojp|gnoc}vvq{zyxz~}s}snazttpz}}wtsnxtTvmcdPn||zfPX|i^iv|j]|{ugqeglx{frvmkl|xtqqv{{uwpssxuplkmv~z{wzinq|fplbvvqyx|y{{|qwrmcyqqp|xusnzuUuqejQh{}ygRXzn`et}yj]}vzdsgglx~lp{onm{{|zmzq}ywsp~{lvpijkzyzxxpfs|qfqbx~tu~y~{|z}}oqviixqpp{xssoxwVqxdqVay|zjTWyscdsyxk]t|buihnxpprpq~|{~kr|wvq{q}{mxohko}{zy|nht~sepc|}tt}{x{v{ylm~rliwoprzttr}uWythqTezvfS\qbgtz~sgbywudsjkp~~ov~rrvuvq{vz{so|{nqx|umjkv|zzydyrkjzhiyv}su}syzupioxixwl~uqr{xvuydeiuhVo{{n[Up|iamtzvl_xp~etzpkovtn{uwwjs}vwmspw}jzqjlr}zz~ojv~ycx}nf~}t}~s{~u{|s|sghyxjr|fystz{{}nbqrrWgx~{o`Vjnbjrwukarp|kjtmovvl~z{vlu|~vyln~}ou}g~~tnnt||sjy}}ct|me|}s{}s{}~{szzs|sfhw}tgqwezuv~~nkqxtZjx}ym^Yplckquribzo~hlupqwpj~ylu{{vxln}zmvzf|uoqx~soz~dqylg|}syyr|yxu|zrzteet}}tgnxc{zuv}wjyv{^fw}zoaZlqeiptqiduq{oeyrrwshvxq{{z}w}|mjwymq}ewyrrx}kyki{zngutu}zs~pv}uy|tuzjbkw||tifygqxxw|krn_oz{th]c}{jfnqsmfhq}bs}urt{zkklv~ywtim{}sjzsi}}wrvryzfo}ujk}tx}|vt~zt~uu~zvqw~tealvzwofmyb}wyynvjbpyxpe_kzkiorqkfpxtz`v}vsv~yko{nw~~wxqglxyok|ol{wswq}y}fp}|sim|tx}{uu|ws~v~t}~x}upv}sd_hrwumenyd|x{{ovpcnwxqfal}minqpkfp{q|aoxux|oo}lx{}vvtghrz|wojzuhz{vyvv~kjw~|tkk}uvz}zts|~kw{ysv||tnrzte]douuogk|huz}|qwxelvwriclqknqqlhp~o}cizvyrq~mzz|uu}tffowyumk{uhy~y|uymkv|zskmvvz{xsty|iwzusty~}yrmrysd]cmrqkfo{gzytzufnvwqheqplorpkhvwsz`o~yx{}qtynx{ytv~}pegovvpjn}mo{}~{rzkmvyvoks|uvyytr{xpnzw~kwty|ytmmuwl_]emplfgxshzynjrvtmfk}yonqrnjnn|may}yzvo}|p|~x~|utzvgdkrvrkixwfv|~x|rjrwvqkowuxyurvwyg}|u{qu}sw{ytnlrwpb\bimkfetvew~wkputohkz~ropqnknpzt_s~zz~vnx{twx|{usyxichospjhvweu~{|ukqvvpkowuvwuqvvyg{yr|{qv}tvyxsmlrwob\agkhcdtscvxmrvuojo~sqrrolso|rau{{~smx~szy{~zttzwjdhnpmhiwudt|xlputpkpwtvvtqwuzfwwpx{sstuywsmkqwqc\_figccqsb{tprwvqlo}wrrspnsrzybo|{~~ums|ztz{~~{usyzmefknmhgsxewt{}postqmn{{uuutqtzyimyorx~lwsvwtnkouui^]affcajvfkyxxquwtonw}ussroo|~qldx~{|zpn|~qy|~|xsu|~uhdglmiekyofs}{opssomsxtuurqyszerunvytotrttplkpvrf]]aedacptbtv{wruvsoq||uttrprytify}~yop~{pxz|zuru|}sgcfjkgemzmh~t|{opsrnmtwtttqqzq~xcp~tnu}xsnsprrojiouqe]\`cc`cqudtw{{suvspq|vtsrps{rmcu|rp}|q|xxzxuqsz}uicdgigelyqft}qnqqolqytsrpovrw}ei{wortxhtopqnjhmtsh^[_ccacoxgo|xuuvtqr{xtsrpr}ppcs~tr||rzxvxwsqsy}ujcdfowyxrv{yvw}y|{yqppmlrvpoonoxrz~hox|zp|x{zymgeirqmuvbmokx{xx||znj]]`afu}utuutz}xpj|}ywn|}~viber|{{{fd~wkxvxuponlmvxttuuzvvqv}nwktzy{{yx{}pfdiosuzsf}ms~~~t{wyxsnign}vqppps~s}hp}~l^[`kv~l{histrsx}~xpqzyluzuvqpnkjp~wrpppr~uhky}yvw{~}}{|yt~}yolotx|s~}|jnxq}wst}}phedceo}hqu_`qxxvwxwrpv{|zs}~}{|}pd`cipwsvt||y~}}|yx}~|{{}{iiwzvsrtuuxvvojvqqrqpsy}xmd`behmxyi|qq}zz}owxr~|}{wtxxrooosukozy{ma\^bis{{w}{}~vnnu}wktyotpppmlq~xrooor~t}jix}zxwtpq|}~{s}}~~}|snoqswx~}mpxk}|||~wmhfegr~jpxc_oyzywvqkho{z|q}|||z|uicbdgn{yw{x}z|{}}~|{~|zz{|ufqz{wtrpmluxjxuqqqprv||tjcabdgo~pqpw|wztnquyz}|zzxrpopwu|js|uw~}yka]^bgr~}woou|}riwvnsoppoouyronoss|jgv}}{ywsnoy~}r~|}}}upoprwz}zkk|jv{}unjhiqplzm^hv{zyxtnikxwqz{{zyz}ynebcflv{|{yz}u}|}|{|}zxx|vidqxxvutroq}}~ylurqqqsy}{rhcbdglvmw}qx{wzzlmox}||{z|ztqpr{~v}kr~yz}~~|zxz}|uja^`fny}|zrpu{|qgrzn~zrponnt}tpoos~twncny|{{{yvu{~{xvy{~}{|wrrw|}|{yqfg}u{~~tkks{r|il{yqnt~nfxlh~yrpooptz|yqjhjns{z~wtu{|u~}||}xvysxlbmy~}wuzpyq{vrrssv|ypkkmpuqxoqzvqrx}~ukpzvqvtrxjq~xxwxv|wtsrsw|}wojjnsz{u}}rpty|}}{tih|ttyrpnmnt~{yww~xst|qqztrqrv{~{smjlosz}rzrzwsuz}~}{ujev{t|yxutx~|~p{kfs~zrotyr~~w}}}|yy{~svks~wlftzo~|tponns|zxvuypxmep||vsxzs~|yvuux}~wpllnqxrsx{}zt||vsomowzshq}~xqlpzxnw|q{usrsv{~}voklos{vtx|{~~xngu}p}}uqqprw}||}|{s~{vx~rkx|{}xplklov{o}qu}xstx|}}ztjfu{p~wuutuywris~xpmq|yr|}w~}yxy{s|mpyzohv|nyzqnmmot}{vtuw|qxpen{yrnr}zqyz}zz|{sonnqwrvy~zszzurqpsy|z}{lr}~woiktwmsym~xustw{~yrnmnqwt}wu}{rjrrvxrqqsw}{|~uw|tsyvkmxwqmmnrzpqvpw}}vtvz|}|xpgj~ur{trrsv|~|~{qmw~wolr}wsyy}zxy{ypylpx~zol{|oz{rmlmou~{utux~qyrfmy~xqmoyxqyx~~xsqqtyr{xv~zsz{||tpnmpv~~{|spz{skiozzon|pr|wuuvz}wqooqu}wr}rwxnm}rvrqrt{~}~}syvpqxzpkuyxrpprw|ltrnu|{usux{{zumgntt|urqqt{|tnwxqns}wu}y}yxxzz{z~zurty|~wolyqv}yxuqrx|vtv|z~rtyji||u{v~xspoopxqpyry~ytuy~zu|x{~sgfo{|{|}xpx~ukjtxuun~}~zvsxt~|nqz|}yom{ot{yvtty~zy{}widn}ulgo}xju|{|~xromottyyu{{wx|zs{tp|~|yvv{~zy{|tpyyqmox|~yzzrmkp}~|oqw{}|wrqswz{zvnfj{qhu~|wuttw}{xx|z|rxxpklt~tsxqzustxz~|ro}xhq~~~~~~xttw~~qztgku{|zungekvwt~yn}ysooqzxxv|}z{~yqp~rx~}}uu|}vnhgn{ys{xjv|xwy{ztollnuzp}xtz~yvw{zro{mp}}{{|}{{~{ss|xqmq{~wzsnlnuyy|{urruxzzwphguzinz{usstw|}yxzxrs|zrjfkvzv|p}~zwwyx~~{rq~|jny{wwz~}xwy~rzxjksz|zunfcfp|xuzmz|vsqsxzt~y}{yz}yrrtw~{{~vt{~wofbfqz|mv{z{}|wroopu|~um{{uz}xuvy}~xqo{op{}xvw{}{~{vszzrmmuw}}vropt{yr~}xtsuxzzxrkhrokv{wrqsw||z{zywpu}|ulfelxz}~~}yxy|svux{wuux{|{wpkrynx{{~|zz~{u{ps|yqiehpx|zpp|ofu~ywx|}}pksnu|~zyz~~x{|~~}yvt{{ncbm{{yqv{uqpu~xlt{rsy}}zwx{vnr}w|~rmmpu}~}~~|{qs|zrorz{{v~}~zwx|}rq~|~xutvwxxwurwrw}xxz~sfq}{|umfabis|}vu~~lo}|}vgmxorz}zyzzvw~zr|xspqu}|}u}yvw}}vwwq~}upnorw{wiaqtqv|~}zuux}}vonwpq~~wsqsw~yv~zsnlpw~}{uzxhh}{~}xuuvwusqoowxnvyusuy}sz}sls~|tkc`bis{|x{~sxqxz~{{{zywtpr~~mo}~||~}twvsz}vrqv}{yx{}xvw|whmzpqx}~zvuuwyzzxuwz~||tnwzojs~woklqv{||ytryupwuyuy~|vqoopsuuuuvz}vssu{}vwy~xtuzytvtit{xxz~{mgvvqu{~zxwy{||{yx~~~|}~uz}qqyyrmmqv{~~|xtw~qyvlvphkrz{xutsqnjhn}po{|wssu{y{xztsv{|y|uz}|vlw}tu{|yxyz{{yvtyxs{|vtux}||os}zmiow||ytnjjnu{~~zwzuzwxw{~~{xvuuutronv}{{z{uz~ojpx}}zvtux}~zrmox~tho|{}~tly}uw||yxxyzxvrr{v{tpwzuux}{wz~ot{xz}qhrtjinruvvutrrsttspkjpxv~zyzz~y~}xwz}xzrv|qy|qoruvwvutstwyzyvqmqxs|zussv{|zz~vxtmpxztonqv{~~|xtvwyv{zvy}}{yyzzyvrpt{zutv{ts}tjkry}|xrljlpuxywsonv~okyzmn|x||zzz||zwtvx~qnt{|upmntzzw|xls|{{}~pjxvmmquxyyxvuuuvvtpljrxw{~wz{z}~z|ts}}~rurnptwwwuqommnnnmjhlz~u{|yxz~~}wt{qqxzurrv{|yy~u|w~utvxyxvtqooqsuusqr|}|{xx{~}xot~slpw}}ysonptxzyvrnpzzlm}|pu{wy~}{{{|}{yw{~~}wsot{|wroorvyzyvrqwxlrqitxnmrwz}}|zxwwwwvspov}x}~yyxspquz}~}zxyvq|{npwpquxzyxurpooppomknztv}|}|wwsw}zvssw{|{w{}vtpruwxwusponooomllu|x}}zor~vopw}|wsqsvy{zxtqt}sp~~sw|wx|~~|xurqrstttu{~~~sq||sqv|}xtrsvy||{wtu}ult}pn}xooswz{{zywvwwwvtru{|{z||wssuxzzxuqpvwkpuoz}rpsvyzzyvtrrrsrpnpy{x}}x~|uv{}ysooqtwyywvv}xzvnx}qmoruvvusqppqqqomow}y{rwzrrx}~zurqsvyzzwtrwrrwpz}xz}}zwuttttrpqxz~zrvyqqv{~~|xuux|}zx}sr~wowtoptvxxwutrrrqpnkltz}uz{ssy~|xtsuxz{yvsqvzlmz{t~ytvy{{{yvtrqrrqomnw}y~ysz}vv{~yvtvy{|{yvv|ssxpysmnprsssqppqrssqopy||tx{rquz}}zurpqtvvuromr|zmm{xowxrswy{{zxutsstsqoovz}uy~trv{~{xwy|~}zy}wr|ukovoorvxyyxwvuuuurpotx|wwwrty}~|yustvy{{yvtv~ultxxxvxz{{zxusqpoomjhlwvvyu~yrrvz|{xussuxz{zxvw~ruxs~uoprtuutsqqqqrqpnpz}wpt~ypnrw{|{xuuvxzzyvsrv~plw{qu|tsuxyzywusrrrrqopv}vuysuy}|ywxz|~}|ywxynrsoz}qmmprtttsrqrrrrpnpz}y}w{wuw{~~|yvuvxyzxvsrw~qlv}sv~usuxz{{ywussrrpnnsxxwu~{tswz|{xusstwyzyxwyuvwpxunnprsttrqpopponmowx}}tuuprvyyxuqppsuvusqpt}tlttuyuvyz{zywusrrrqppu|{}spyzsrvz}~|zyy|~}{|ts~smvtmmorstttrqqqqqporz{}uxyuvz|}{wtssuvvuspos||ohp~wzxuvxyyxvtqponnmlmswxww~wwz}~}zwuuwz{{zxx{}rv{omyzojjloqrrrqqqrrrrrw}vry{sqswxxvsppqsttsqprz{pp|xs}|utvxyyxvtrqpponmqz{u{ytzxux{~~|zxwy{}}|zyzur{tnvwpoqsuvvutssssrqqt|zyrv~upquwxvtrrsuwwvtstz~qmv|u|wuvwxxwvsqoonmlknv~vz{uzzvvy||{xvvwyz{zxwx~tpxxqxxpmnpqrrqponnoonnqz{yrwuqsvyyxvtstvwwvtst{~qnxxr{|tqrtuvutrqppponnr{y~~uqwwstwz{{yxxy{}}|{y{vr{vpxyqnoqstttsrqqqqpor{x|{uzyssvxyxvtstuvvusqrx|ojr}v|yvwyzzzyvtsrqpnmowwzztwztsuwxxvutuwyzzxxyzsyxps{qllmoppponmmmmmmov{|~vv{sqsuwwutssuvwvusswwmo{ww}wvwxyyxvtrqponmmr|yv}zrpy}urtwz{{zyz|~~|~~}}yy|{|{{z}~}|~|||xyyxxwywwyz|}{z|}}~~~}}zxw}~xy{{|~}~}~~~{}}urttuuyzz|zwxx{}zx}~}}|yxy~~~zz}{vvz~}~}{}~{xyywtttuuuz||~~~zrpuz}{{~~~~{}~|yxyz}xv{}~}|~~}{{zxvwyvvwuuvzzz||}xwvw~|xvz|}}ywz|~|}{y||yzzzxvvvwxyxx|}~}yys|{xy|~|~}||}~|z{wx~{{{z|zusuutrqsuz~||}~zww}~yw~}{{|{||vuy~~~}}~~}{}zwvyy|~{~}|ystz~|xvt}|y}uy|xvtvxz{xz~{xz}y|zu{vvzvtrvz}}{}|~}xy|uxuu|z{}z|}|{x~}}|yyz||}|zwvzuy{y}yz|}vu|{xy~~}~~}z{}}|yty~{{zwuuwxzzxxx~w|}{}}~{ywx|wz~}}yvy|zxwz}}{}}~z}~}}|z|}{{}~{~~~xuu|~|zwsxzyzwx|zz{xusx}z}}}~}xz~~}{y|yxzyx{{{|}}}{}}}~|x{zwwsuz}}{{yxz~{~~{xyxwzzwxww{yy|zyvu|~|{y|~}|~~|~|x}wv}~~}}yvvutxxv{}{w{~}|yu}{xuwxz|}|yz|xwvxz|}~}}x}}~~|zy|~|{~z|~~~~}~|uxyvzxxuvvvyxxvw}z|~|zuy}~{{|~{xxyz|yy{{z|}}|z}y{}wyvussuy}}~{ut~~yz{}~zxvzzxyv{{yy{zy{}~}~{{~~yzz}~~{}{y|~}~}zuwz~~~z}~~}{yyxyz{}{x|~}{x|}}y{xz{wxyxzwxwvz{}{z|~}~~z~|{y}}~~{z|yywvx{wvzuuywvzz}}}{yvw{z~{|}zz{{|}yz|}}}z{||{}}yuuwtsxz|{{uux~|z}{vz{xwxywz|~||{v|}|{~~~}{z{yy{}{zy|}{{|~wvsuwz~~|~|~}}v~~yy~~|{{{~|{x{vx|wtvuvtrwz|}~}y|}~|{|}}}~~~yvw~~~~}{~y{z{zxxuvsvxxyww{}|}~xuv|~~z{~}~}{y||~|z~z|{wvxyywrutuwv~~~yvxy~|~~z|x|{vtwyzxv}{yyy}|~~|xzxy{~}z|~zwyy{}~{|tpry~}}|{|z~}}~xvzz~~}z|~{}zzvxwvvsrvzzz|z{y~}}{{~zy}z~}}xwy{z}~}~z~~~}yw{xyvuxtrtvx{}~{}~{yyyxy~~}||yz{}|x~{}}}xv{{xwxvxsrttyy}yv{~~~|~{z~|~yyz{zxv|~~xy|}|~}{~~{y{}yxwz||xy}}||wvtvyz~{}{{|~~{z~~~yx|~|xzz{|wuuwwwuwzxy~{z{~}|~~}}y|y}~yuw}}}|~{yxy{v{yyxswwwvtx~||}|yxz|}~}~|}|{}~|~}y~~z}{ywvwwtsvvtssz|yywwz}yyy{~}|zyz|{{y~{zvz|}|}~|{|{yx|~{yyy}{|~zust{|}~|}~}{zx|~}{|w||x{{ywtuxutu{{|zy|||}|{y{z{zy|wutyy~}~}}|zyy|{uxwutwz~~z{~|wuv}~||~|~}{||}}y|}xxwxxutrttxuuwt{}uw~}}~}x{~~|zy{{}|{zyw{~~~z|zyyz}~yy{z{wvxy}}}}xsw~{}y~}}}~{~|y|{~~~~~~{szywvtuuuyvsw|~xx{z~}z}{xwxxz{}wtsvz}}~~}}z~x{xw{xwtuxz~~~xtuz}~}}~z~zy|yz~~xvxyzzxvrvwrytvzz{|}|}{x|}}xx}w}{vtwy~~~|~{xy||xxyz{{{y{||}~}||zuuw|~}~y}y|{~{xz~~xwyxvywtrtxzwwz~~xw{||{~}~|yxz|||{xww~z|{|z~||yuxyxzzxwy}~}~|xst}~~~|}~~|xx~~}{z}{vtvutuvtvvtusv||vvz~}z|~{{{z}~zy{y}~~~{yxz~~~~}z{~|xvwywxzxz|}z}vttr||~~~}~}z~~y}{~yvtvuxxwvuyyuvw}}xx{y}~|z}}~|zxw|~~~~{zwvzx|~}z{|}ywsuvxyz{|~~{}}z}~zww{~|z~}~{}~~zy}yz}~~~yxtutrxuuvsssy}}xwx{z{}|zx}}z}y{~~zvwy}{{y{}}|zwyxw~}|{z~{|wvrt||yv|~}|~|{~}~z}|{yyvxyvvvwxx|z}~}|xv}y}}{wz~}yxz{{zyuxwz}~{||||}}}zzzz|~z|zz~~~z~}}||~~||w{uuwzzz||}ywy|}|{~|uy{{}|{|}}~}{y}{y~}}y}zv~xvxw|}}~|}~{|vu||~|xwyx|~{x||{{yz{~}{|~{x|~~{xzwyxw~~z{{z}~{|x|{y{{|~|~z|~}|}zy~xz{y{~|z~}{|}{y}|yz}xszu{~ywwuy|yv|yvusuv{z{yzwu{~zxz~y}|wxzuvxuwxwz~}{|}zyy{wxz}{~{z||sy~x{}z}}yyzy|}|{zz{~|||{szz|}}{xxxuwx}xty~wuwuvvw~}uxwvu}~yxywy~uy{wzw{xwyz|~~yywvvtz~x~z|{{yz|~z}w{yxyxyz~}}~~}zz{{y{ssz}zxyxxz}~xwxsttttszv~vysz~~yxz}z{yw|t{xwyy{||}|zzxwu{w{||zzww~zzxy}yxyxy{||||zz|}z~{}vw{z~zxxyxz|{vw|wwwwwx~uztyv{yz{zxwy|v~w{ywxz{~~}xwvurt{~yzyy{yzz{|v|zwxyz|~~}{~}~~y{~zrz|~~{xxyy||x{~xutuusx}zwy{tuz}zvx~z~}vy|vx{yyz||~z}yxxwuzy}{}{z{w|}xxzzxvwxz~|||{{||z}~}~~{~~{tw|{~{yzz||ww}ywwxwy~u{u{vzyy{{zv{zy~w|yvvyz~||xvvvsw}z{~||xx~z|}x{xz|{wyzz~}~~~|z}~}|y}|tsy~~zwyy{zy{wuvxuw}|u~wytw~~{uuy}}~v|}z{v}|xy{|~{~~zwxxuz{x|zy}}y{wz~}{|yuvxy~~~}~~||}|{z{{{}}ztrz}{|}~~zw{xwyxxv}sxx}yvx}{~yx~wx~zwuxy|~|~zwwxuv}~{v|}~ywz}z|x{{w}yw{z}}~~}|{~~|~{z}}zsw{zzy{z~{z|ywxzw{yv|xyuw~~{ttz~|~|v}}z|w}yz||~z}~zvwwu{zy}~{y~~{{~x{|z}zuvxx}~~~|}~{|yy~|yz}}yvqz}~~~}}x{~zwxyx~zxxx}xx~~|ww|}}~w~zzy}{wwzz~|||ywwxv{~wy~xw}|z||w~~|}y}yy{{|}}~|}~{}}|z~~zxz|ztz}||{|{{z~{yy{y}yv~w}vv|~{vuz|}|v{zx{z|}~zyzvuvuy|y{~|z|}z|{|yz~|xvxy|~~y{|z{wy|wvy|}~~zxtw}~zy}yxyx{}wuzvy~~}zx{|}z{x{~}zxzz||y~~{xvxwz|x~}{wzzz}}xyzy~~{yz{~~}~|}}{y{~|y{~zww{~~|{xz|}}}}z~|z|{~yuw~xuz|xvz{{~|w{zy}{}}}yx~zvtvv{}{|~|z~|z|~z~}yz|yxyz}{{{{z~yv{yuux{|}|ywu|~z{}yyzzyzzwxv{~~|yz}|}zz{z}zz{{~yz|ywwxz~x~~yy{y|}yx{~z{}z{{~~}}}}{yz{~{yz~zvvy|}}~{yx{{~{~|}}yvw~yvz|xw|{{~~{x}{y}||~|xy~yvuvx}z~~~|||z}|{z|~z|yyz|~x|~z|zvx{vtvz||}zwux}|{|zz{~|y~v{vx}~~}{yy~~|~}{}yz~|{{|~~zy~~{yxyzw{~{z}yz~}zx}|}y~{{{~~|~~{{|{x}}zyy{wuxz|||zxwyz|~~~|vz{}wx}|ywy|z}|y|{z}~||}~xw}|xvvx{{z|~}|~{||{xz{|{z{}}{zz}y||xvyyttwz{|{yvu{}||}{|}{{~w{vx|~~|zyz~|~}|}yz~}||}~yx||zyz{w|}|{~yz}}zy~{y~|{{}~{~~|~~y|xz~~|zxy||wuvyz{{zxwy}|~}x{xzwz~~{xx~{{~~{z{z~}}~{wx~{xwxz~{~}~}}}{|}{{|yy|~|{{|~}z{z|y{~zwvy~xtsvy{{{yww}~||}}~|{w}vw{}~~}{z{}}~||y|{}}}~zwz~}|{{}zz|{}{y{}}zy}zzz~||~}|~~{y}yw{}~}|zxxz~}yuuwy{{{zyz|}{xz{~xx||zy|}{}~{z}{|{~}~|wvz}zyy{~~}~~~}|{}~|{~w~|y~~|||}|x{{yy|}zvuw}zustwyz{yxx}}||{x|xwz|~}}|{|}}~||y}z~}}}ywy}~}||~{||{~{y{}~{yy~yyz~~||||xxwz|}|zxwwz~{wtuwy{{{zz|}~y|y~|xy}~{z{||}|z|~|y~~~~yvw}|zz{~|~~~~}{}~~|{}x{~x|}|}}~|x|zzwz|~}{yvuw|{vstvxyyxwx~~}||x|ywz|}}}|{}}}~|~~y|{~}}}{y~}~z{||~~}~~{|z}{|~}|{}|z{}zy}{wz}}~|}~|}|{|{{|~|wv{y~~}|~|{||zz{|~~|}~~~}}{yy}}}}~{}}}~{z~{x{~~~~w{}z~~~{~}y|zzy{~{{~}~{}}{|{{~~~~}{{}~}~|zz}{y{{}}y~~}{~{x|{}{zz{}|{zxxy|zyx|~~z~|}}|~}~{}}~}~~|}}~z~}{~}}{~~{{~{|~~}{yw}zsvxvtsx}~{~zy|z~~}~~|~~~}}{|~~}|}~|~~~|~||wy|y|~|zz{uxzxuuz{~zy{y}}{y{|{z{y~|~~~~~~y~|{~||}~~xz}z|~~~~}~~|{zz{vy|zww{|{z}z~|{|~|{|z~}~~}|~~~{~}}}|~~z{|}}zzx~{tuyxtsw{~z~|y}z}}}~~~|}{~~}||}~~~}~~|}|}~yw~||{{z~~wuz{wtxz~z|}x{yz~{z{{|yzy|}~}|{{~|~}zx~}|~}|~~~~{|zxw{}yvz|{}~y}z||{|}|yzy|~|}|~}}~|}~{}{z~~~}~zzz~|vuy{wtxy|y}}y}{}}}~~}z{z~}}}~}}~~~~~~~}}|{~~~yz|{|||ww||wvyz|x}{x|y|~z{||{xyx~}}~~}{}|}}}~}}~x}~|~~|~~}{|{wz|wyz|{{y{|{{}}|zxxz|{|}~}{~|}}~z}||{}~}zx~xx~|xyyyy{{z{}~||||z{y}~wz{~z}}~wy||~~}~~zz~zx~|}~~~|y}|z~}~uv||z{z{|}||z|~~}|~}}|}~}}yz~{|{|{}~}~y{w~{|~|xvzxz{|{vy{||}|z|~||~}z~|{{}}|wvz}|{}|}~~|}||yy}~||{xx|yq{{wxsrrstuz~{}|zzz{||}|z~}||||{}~~}}}{}~~}yzwz{w~}~}yvy|{zw{yvxyxz{wuuy}~}|||{yy|{~{|}~{}{|~~}~}}}z{z}|yxw}~ys{zytz{wtvxy{zvw~{zyy|}{zz~|~yz|~{{~|}}~~~~|w~|||u}~}||zx}yvxz|{vwyyxwxzz{~}z~|y{}zu{~{{}}|~}}~~}y}~|~~{}yxzx|zy}~z{w}ux|{vrtuwzzww{~~~~{{{zx}|{zz~{uz|}}{}|~}zsz}x|{{{~zv|}~xu|~}{xutz}{zz~}zw}|z}w|{z|yux}|~}~}|~|{yzx{zz~}|xy|z}y{{yyxzywvx~~||~}~|{}y~~{|||}{zz}}~|~~|{}}zw~vwuy}|{~}ywxx{~~zxuw{xxyz~|{{w}}z}{||}y}yx~~~~}}{~}~~~}{~}tx{yz}}}{}yywy}{{yyyw{|z{|{x~{{|yz}wwzyx{~|{|}}}|{||~wv{z{z}~}zzz}||ztv|{zwwz|}~{}z|}|z~z|||~{|{|}}}{|zvwz{|{wzx|~}~}z|~~|z|||~z~}}{||}zwwux}~wy}zx|yw~~}{~{}~}zv|~~~~~|}}|}y}~z|~{|~~}y}~{||y|}}|xzxz}~~{~{w}{y~}~}~uvz{yv|~yz}}|{y{y}~}}{{|xy}}z}}~~w|~{y}y|{|}yzz{~}{}}z{~~}|}z|}{yy|wx|yyyvwwy~}~z|}y|zx~~}{{~}~|~}||~z|{{|z|zxzz{}}}|}~}{x{~~{}|yzywzwuvw{}|y}yz{wz}|~~|}|~|z}~~{}z|}{|xy|{|{}~z~|xw~|~~|zzwzz{{wvwx{}zy|wyzwy~|}{~}}{|{|}||z~}}}{|||||z}|{~{xx~}|~}}|x|{{ywwxy||{z{w{zx|}~{y~~~}}~~z|}||z~}~}{z|~}~{|{~~{xx|}~{{w{zzyvwxz{{~{{|x}ywz}{}zy~~{{{||||y}|}}{{~~~{}||yww|}}{w{zzyvvxz{z~{z}x{ywz~|{~{y|}{{|{}{~z|~||}|{~||xwu~|}}~}zz|{zvvwy{{~~|x}yz|wy{}|~{z{~}z~||}{{}}~~~}}{vxw}|}}xwzxxuttwzz}}y{{|xz{|{|zz|{wt|~}{~}{}~z{~}~}|}|~|xxu|~{~}{}~zy|||xwwz~}{|}{}zvw~~zwwu}}||{x|{z}~z|}}~|{~~|yxu|~|~}~~{z{}~}xxy~|z}~{}}~~~~~}yvvu}~|~}|{y~||~~z}}}~~|x||||}~~|}~|}}yx||{{xz}yxu}~}|xyx|}~}}~wxz}|||{|y{y|}{|~y{{}~}|y}~|{xz{~}~yyxz~~|yw{|xsv{~{{xwyx||wzwy{}~|}~}}{|~z}}}{zy~}}{y~{tsy|~zz{z|y}|~|vtvy}{vrzz{}~}~{zz{~}}||}~}|~}~||ux|wquw~|{||ywuxyx|}}}}{|}~uz~}}~||xz||~}y|~zzyvsz{}vuwvuz||~xy}{{{|yx~{}zz|vx}~|~~{|~~|}z}~~~z}{~{{ww{|z{~{{vwwuuuttvyu|{xyzyz}~~xz|~~|}}~~|z|{{}}~|~}}}{|yx}~~|yvy~{vnry}~{z{x}z}zz|{|}y}}~y|zzyz~}{{}}}~}}||~~zxztw}~|z}yxyw{ywtv{y|x|~yvzyw}}}~}|{{~vu}~}zzz|}z~~}~}~}}~~}{{~~~xwzyzxx|}|tux{{x|z|{|yyx{}~y~{}~|~|{}|{vwz}|{~~~}z||{}|~xw~}}wtyyzyy||}z|}|~yy}}||y~{}~}{}}~}~~~~zwxsw}~~}yyzzy|wtux{zyw{~yyxx~}~~|~z|}~xu}~~~}~||{}~z|~}{vswwyzx~~}~|xz}|xxy{zvx}}}}y}~w~~|ywzy|~~|zy}~{~}~|~}}{tv|~|~~}~~{uxy}}{zyyyv{}~|~{|}z~}~{|}{~}z{|~|}|~~~||wyzvw}~|}z{{|yy}~{z}~z|{{{}}}{z|z{z}~}|}|}~~}|}z}~x}~wwtuvyyz}~~}{x}wz}~zux|}~{{z}}|y|yw|~|~~}~yx}{yy||~{{{z~{xvyx|~|x{|w|}~|wwwyxz|~~||}}zx|~{ty~z~~~}~|}~}~x{{|~}}}}|wz~}|}}}}z||~zz|{z{|}~~~}{|zw|~~~{{~|}~~~~~~|z{}}}~~|}{{y{}z}|}~|{}{{{~|z~~|yxwy|}|{~}~yz}zz~|~}}~|~~~~|~}y~~}{|{zz}~~|~}~zzwx}~~~{y}zy|}z{yuy~~|}~{}|xxw~~}|zz||z}{{}~|||~}~~}zx{|{~}}~}~}{}~zy{}zuw}|y~~|}}~|xx{}~~y|}{y{~|~|z~~}|~|yz|~~~}|}}~yw{{}||}}}~~~{||y{~~yx|}~}z~~|~{xz~}zx{~~}{|zz{{}||}~z||{{|~~}}}}~}}}~|{}yv{}|~}{|}}~~|~}}{}zvy|xwwz}~z|}{z~}zyx{~|z{yxy|~xx~zwy}~~~||~~{~~~}|~|xvwxx{|{{xy|zy{}~}{}~|}~}~zy{|{ywx{~~}~~~~{}~}~~~{z|~}wvxyxz~}|~{~~~|{{~~|{|||~}{|{zy|}~~~~~~}|}{}~~}{yyzyz}}xx~{z~}{{|~~|~~zy~}}~|{zzz|~yy}{z{|~~{||}|{~{y{||~zwwy{~~~~}{y{~{}~~}zz|~~~|}~~}~}{{z}~~~~~~~{}~|}}}~~}xtuy~~|~}|{z|}~||{}~~|||~~~}yx}~|{|}~|~~|~}~}|{}~|zyyz|}~~~~|}~~{{~~~~~|{}}|{||zz{|~~}}}|zxy{~~}~~~}~}zx{{zz{|}}~}|{|}}~~~}|{~}~}~}{zzy{}{{}~zy}|~~~}~~~|yvvz|xvz|z{~}~~}}~~}}}~}{y}|xxz}~~}}}|~~||~}|}|{z}{ww{}}}}}}~~~~}{~~{}~~~~~{y{~~}{{{|~~~}~~{}}}~~z{}xwz~{{{||{{z|~}}|~}~}{z|{xwz|{yz{|{{~}}}~}{~~}}~~|yvvz|}{zyzz{}||~}{{~}{{|}~~}yvyz{zy{~~zz}~~~~~~~~~~}zy|~|yww{}{|~~||~~~}|}z}~{{}}|}~~}{~~}}||||}}{wvvy|~~|~|}}z{~}{yz}~~~z{~~~~}{{}~|yxz{{{{zx{~}|~|||}~~~}~~{{}|yyz|~~|}}z|~~~~~|xx{}}}|yvvy|}}}~}}}}z{~}~~{z|~zyxy{}~}}~~~~|~~}~~|{~}zyy{}|ywvvy{~~~~|~{|{|x{z}|{zxy~|{}{}{|}}~|}|}~~}}|~zuv{}|{wwx{{|~~||zww||}}z~~}zz~}~||yzxz{|}|~}|xxy~~xv~~}~~~}y}{|||~|}}|yvxwy{}~||{~}zx|y~}{}~}~}{|~~~z{{z~|x{{}}~|{{}~~~}|}~~}|zyvtyx{|~yz|{{}|{~~{{{~}~~}~z~~~|~~{z{{}{yz}~|~zz~z}~{}{}}}{||{|z{|}|xwy}zwx{|}z}{yyy}y{z|}{}|{~y}~}|{{z|}~||{}|~~{zyyyy}~|{yw|}zzvz~}||~}z{~{||zy{~}{~|}}~~{|~~|~~yy~~|{vx~~||{z|~~y~z||}xzw{}z|{{{}|~~{y|~~~~|y{}}}~|x{zz}~}|~zyxzw|{{}|||~{{}|x|}|{|}}}}~zuy~|}}~|{}||{|}{~{|}}~~~}~~|y|}}~xt{}}xxzy||~~zyx~|{{|xzwz}~z|~~~|~~~~~|yxzy{~}~{|zw|||}{yyw~zz}}~~~{|z|}x|~~}~|}~zx{~z~~}}{zx}}~~{x|y|{||zyw{~~~|~z{|{||}~y|{~}||}zuw~~}}~~}}{}~|}}|~~~|{ywzz~}y{z}~~~|~}}{ux~}|}}~y|~x{}~y|zyywyx{|}}}}~{~~~|xw|~}}|~~|zz}|zyyx{z~}}}z}}z|z}{~|z{{~}{|y{}}z}~}|}~}zxx~}y~~{{~|}~|}z{~}|}}ztvyy|}zsw~{}zyxwz{~|{{}~}{~{{||}zz~~}~~{}~}yx|xz}|y||~z~}z{yzwswzz~~~~{x{}}~~}~}}|~~|}~|zxx}{~~||~}yz{x{|x|z{{~}{zuuvz~|~~}y}zx{}~}yz{z{zx|{x|}}~~z{}y{}}{||}{xwsv|~wvvy~~~zvxy}|z}{{|yy{}}yx~{z~{wyx{~~}}zyz|}~~}zyxwzy}yuv{}}{|}~}|zxxx{}|{{{}{|}~}y{|{xx{~}|{{}}z~zz{~~|yxxwx{xx|}|~}~zz~~|xxy{z}z|{yx|}|~|zzx{~|||~}}|~~~|}{|}~zyyxwwxyz~||}{ww|~||wxx}{}yxy}~yxy{|}}~~||{}z|}{{y}~}~~zz|}~{xyv{~y{z}||~~zx|zxxvw{}}z|y{~~~||~}}yyxyx~~{z|}|z|~~}|{|}~}zwxw~yw|~{~~z{~yxyy{|{~|}{|~~~~}}|zxx|~}}|}}}}~~}~y}~~{}zvuv|z{z~}}~~y{~}}{ywy|~}y|w}~z|{}z{|yxz}}~}~|}}}{}~~{~}y{|~~|wusw~|zyz}}|~|wy|zzyw{|~}x}~x{}}{}~}{xxz}}|~}~}~~}|}|~||}{y|~ytsw}{z~|}{xy}xxzx{|{~x|}~~~||}{zx{{{{}~~~~|~}~~z|z{vz}|~|ysvx~~|{~~{x}{xwvw}~zyz{y}|zzzx{xyyz~}~|~~~|~{}{}}zxx||{|{zxvy|}~|}}|~|z~{y|zz{y|z}}{z|||~uw|}~z|~~z}}}}}~~}~w}}|{}}{||roq}}x}}~x{|yytw{yzzzzwzz}}x}{x{y{}~~z}~|z~}{|{yx}xw{|~z|zyxsov|~x{|~}yxz}|}|yy}|}||{z~}||{yz{ywvy~{y~}}}z~|}|y{z|}}|}}{ysuz{~z}}~~{{x}y||w||w~~}}}}}{yz|z~{z~~}}~|}}|~{yw{zyyxwy}}~xxyvq|}}zxy}{xuwz{xzyv~{{{|~{{{xvx~|~{|}}zw}||xy~{{{tz~yytvsu}~{}|x||||{~z~zzyz}}~}|}y}z{~~~~~|z~zzzz~zwz~}xvss~wuz~yy|}xvw~zzww{yzuy{~{|yu|~{{}}|~x{z~z{wzyxywvz}|x{wtvy}~~~w{{{y|}|{||~vz{y~~x{}zwwx~{}{z}|~~}{{}z||zz~}ywu{||xx{~~}~yy~y|y{z}zz{{yx|}~~|z}~{~|}{{wz{{y{y~yxwuvv{xxyy}zvy{zv{}}|x|~z{}~{zzv|zywxz|{{xx}~|{z~|y{{xwz|~~|~xtx~{{{xrvz~|{yvvz|~}|z}~z||{}~~~{y~}z}{}|x|~}~|~z}~~z~}{|z}}{y}}yywuy}|{yyz~{xv|y|}~}}yz|y{y}zwxx{yzwuyyx{~~yx}|x{}{wzutvxywwvwzwz}}|}{~}|{zz~~{zyz~~~}zzz|~~|w|~|~wyy{}|{uwwz~}z|~{~~|z{z|{{~{}}~~~|}}|yywzxww{~~|y{}{}~~~}}y{~zywx}}}}|}z}{w{~|}~~||~~}{|}~~~}zyy}|xu{}~zzz~zxwz~z~}{}{xxzz~}|}~}~||~{|~~y{{|~{~z}~~{}{}~}zyxxy{{|~yx}}z{z{{||~}{|zwxzzvy~}{}}|~y{|~~~}{vw{zy|}|{{}~~|z||{{~}|}~{~~{}|}~}zwvw|~}|y|yyxz{xx||xy|~yxvy{xvw}}~}yz}|~}}~{yy}}}~}~|}}{|}zz~~|~}{}~}|}{}}|~|{~~||~}zzxxy}~zzx}}|zxwvxxzzz|~yxx}~zyz}~y{}}}}~}}~|yw}||||{}|~|{{z{{~}z}{{~~~~|~}y}~~}~zww|}|z}|zxxyy{z{ywy{y{z}|yy}~z}~{y{~}}zz|{~{~~}~~|z{{}~|}}||||||{{|~~{~~}y{~}zyx}~}~xz}}|zywxxzzy{}z{zz}{zz~{z|{yx~}|}}}~{|{}{|~{|~||{{|~}~|~}|}||~||~~}~~}||z~}~}{{z}|{yy}}|zzy{zx{{zzyx{z}{yz~y|}|z{~|}{|~{{||~|~}~}~}{||~|~{||}}|}}}||}~}}||}{z~~~{zzz~zz|||||yzz{|{z{zz{x}{wz{}}zxz~|}~|~{yz~~{}~{|||~~}}|}}}~}}~|}}{}~}}~}|{~||~~~~~}{{||}|zy}}}}|yyyy{|{|zxzy{}zx{{|}yy~}|}||~~|zz|~|~}~}}~}~~||}}}{~~|}~}{}~|~|{|~}~~}|}||||~}{{~}|||zzzz||{|yxz{}|xy{}}{{~~}}}}|xy|}~~|}~|{{}}~~||{~}}|~~~~|~||{|}~|}~~~~}{{|}~{z}}}~|yy{{z{{|zy{z||zx|||y{}}|~~~~~~~yxz}~}}||~}}~~~}|~~~~}}||}~}{}~{{}~}~}}}||}~~}{}~}zyyzz||}{yz|}}{y{|||{~|||~~}~~~}~|xy|~}~~}}~}}~}|{}}|~~~~}~~||~~{{}~|}~}~~}|}~~||~~~}{{{{z{{{zy{|}~|yy~~}~|{}~}}}~~~~~|xy~~~~}~~}~~~~}||~}~~~}}~}~~~~}|}~~~{z|~}{}}|}|}~|{zzz{||{{||}}{y{}{|z|}{|}~~~~}}{yy}~}~~~~~~}|~~}}}}}}~~~~}}~~~{y{~~||~~}~~}|{{{||{zy{}}~|yz}{~{{}}{|~~~~~~}zy{~|}~}||}~}}}~~~}~}~~~|{|}~~{z{~~|{~~~}~~}|{{{{{{{|}}~~{y|}}|{|~}|}~~~~~}|zxz~}}}}~~}}|~}}~}}}~}~~~~}|||}~{y{}}|{~~~}~|{{{{|||{{}}~}{z~|}|{|~|{|~}}~~}}}{zz~}}~~~||~~}}~~}~}~~~~}{z{|~~}zz{~}|~~}|||{{{{{{}~{z}}}}{{}~}|}~}~~~~~}|{yz~~~}}||~~~}~~~~~}~}~~}{z{{}~}{z{~~}|~~}}||{{||||}~~}{z~~}~||}}||~~}}~~~~}||{z{~~}}~}}~~~~~~~}~}~}|{z{{}~~}|zz|~~}~}|||||||}~}{|}}~||}~||}~}}~~~~~~}|||zz|~~}|}~~~~~~}}~}}~}{zzz|}~~}}{z{}~}~~}}||||||}~|{}~}||~~}|}~~}}~~~~~~~}||zz|~~}}||~~~~~~}}}~~}{zzz{|~~~~~}}{zz|~~|}}}}|}}}}~~}{~}}||~~}||~}||}~~~~}|{zz{~~}~~}}~~~~~}}~}}}~~}{zzz{|}~~~~}|{zz|~~|}~}}}}}}}~~|{~}~||}~}}|}~~}}}~~~~~~~}||{{|~}}~~}|~~~|~~}}}~}|zyyz|}~~~~~}|{zz}~}||~~}}}}}~}|}~~||}~}}}~~}}}~~~~~}}|{z{~~}}}~}}~~~|}~}|}~}|zyyz{|}}~~~}}|{zz{}~|{~~~~~~~~~}}~}||~~}||}~}|}}}~~~}}||{{z|~~~~~~~}|zzz|~}{|~}{y|~}{zyzzz{{{{{zzyxxy{}}||~~||}~~~~~}|}~~~~}|{||}}~~~~}|zxz}}}~}||~}z{~~|zyyxyz{||{zxwwxyz{||||||{zz{}}}~~~~}}~~}}~~}}~}{ywwx{~~~|yy{~~~}}}}}}}~~~}|{{|~~~~||~|{|~~}|||}~~}|zyyz{|}~~~~~}}}~}~||{{{|}|zyy|~~{z|~}{yyz|}~~}|||}~~}}}}}}}|{{zzz{}~}~{{}~|zz{~~|{zzzzzyxvuuuvwxyzzzzyyxxz|~~||~~~~}~~~~~}}|{zyxxy{~~||~~}}|||}}~~~~}|{z{|~~}|{|}{{}~}}}}~~~|{zzzz|}~~~~}}~~~~}}|}}}}{zy|~|{|~~|zzz{|}~~~~}}|||}~}|||||||{zzzz{}~}}z{}}|zy{}~||{{{{yxvuuvwxyyzzzzyyyyz|}}{|~~~~~~}}|{zyyxxy{~}~~}}}}}~~~~}|{zz{}~}~|z|~~|{{}~}}~~~}|{zzz|}~~~}}~~}}~~|zz|}{|~~}{zz{|}}}}}}||||}~~}|||}||{{zyyz{~~}{{}~}zyy{}~~~~~}{zxwvwwxyyzzzzyyxyz|}|{{~~~~~~~~~~}}|{zzyxxxz}~~~~~~~~}{zz{|~}}}{z}~}{{{}~~~~~~|zz{{}~~}}~}{}~|{zz{}~|{}}{{{{|{{{zyyxxyz|~~}|||||{{zyxxwxz}~~~{{}~|zyxy{}}|}}zxwxxyz{|||{{zyyz|||zy|}~~}~~{{}}|~}|}}~~~~~~}}||{{zyxxxz|~|~~~}|{{{}}~~|zz{~}zyxxyyzzzzyyyz{}~}|{~~}~~~~|}~|{z{|}}}}}}}|}}~~~~{z}~|{zzz|~~|}~~|yy{}}|{{{}~~}}}~~|zzzzz{{{{{{zzz|}~}|~~~}~}}}{zyz{||||||{{{{}~~}|{{zzzzzyyyz{}~}~}|{{|}~~}|{zz{}}||{{{{{{zzyyz{}}|{{}~~~~}~~|{{||}~~~~}}}}~~~~~}~}{|~~|{zz{|~~||}~|zxy|}}|{{|}~~}}}~~|{{{{||||||{{{|~~|}~~~~~~|{zzz{{{{{{{zz{|}~}{{zzzzzyyyyz{}~}~~||||~~~~~~}{zzz{}~}}}}|||{zzzz|}}|zz}~~~~}~~~}|||}}~~~}}}}~~~~}~~}~~{z|}|{z{|~}|{|~}{yy|~~|{{{|}~~}}}~~}}}}}}}}||{|}~~|}~~~|{zz{{{{{{zzzz{}~~}|{zzzzzzyyyyz|~~}}~}||}~~~~~~~~~~}||{zz{|~~~}}|{{z{|}}|zz}}}~~}}}~~}||}}~~~}}}}}~~~}}}~~~~}{yxwxyz|}~~|{|}}{yyz}}}}}}||~~~}||{zz{|~~~||~}}|yz|}~~|{{{|||}|||||}~}|{zyyyyyyzzz{|~~}|}}|{{|}~{z{~zxwxy{}~~}}|{{|}~~}{{}~}}~~~}}~~~~~|{zzz|~}||}~~}|{{|~~zxxz|~~}{zyyy{|~}||}~~|zz|~~|{zyz|~~|zyyz|~~}}~~||}~}{zyxxyyyyyyyyyz{}~~}|{{zzzzyyxxxy{}~~~~}zyyz|~~~~~}}}|||||{{zzz{|}}|zy{}}||}~~~~~~~~~~}|zyyz{}~~}|{yxxxz}|{}~~}{zyyyz|}~~}||}~~|zy{}~}|zzz{}~|zyxy{}~}}~||~~}|zyyyyyzzzyyyz{|}~}|{zzzzyyxxxxz|~~}}~}{yyy{|~~}}}|||||{{{{{|}}}{yz}~|||~~~~~~~~~~~}|zyyz{}~}|{zyxxxz}~}~~}|{zyz{|}~}||}~~|zy{}~}|zzz{|~}}}|{||}~}~~|zyxxy{}}~~~|zxwwwwwwxxxyyz|}~|{{zzyyyyyyz|~{}|{|~~}}~}zxvx|~~~~}||||{{{{z{{|~~~|{{~~}~{xx{}{{{|}~~~}||~~}{zz|||{{{|}~}}~~}~~}}}~}|{{{{|~~zxwwwwxyz{{{||}}~~~~~~}}~~~~||}}||||}~~~}|{{|~~|}}{{{|}}}}}}}}}~~~}|{zzyyzzzzzz{|~~}~}{|}~{z|~~}~~|{{{||}~~}{{}~}}~~~}|{}~}}~~}}||}~}{}}{zzzz{{{|}~~}||{{zzyyyz|}~~}}~~~~~}||}~}}}~}|~~~|{{|~~{{|~~||}~~~}|{zyxyyz|}~~~|}~}||{{{{{{{|}~~}}}}}}}~~~|||}~~|zyz|}}|{zyyzz{|}~~}||||}~~|{}~}}~~}~}|}~}}|{{{{{|}~~}|{zzyyxxxwxxy{}~~~}}~~~~~~~}~}|{{{|~~|}~}||}}~~~~~~~}}}}|{zyyxyy{|~~}}~}~~}||||{{{|}~~~~~}}}}~~~}|{{|}}{yxy{|}|{zzzz{|}~~~}|||}~~||}~}~~||}~~}~}||{{{|}}~~}|{zyyxxxwwwxyz|~~}}~~~~}~~}|{{{|}}}}|{|}}}~}}}}}}}||{zzyyyyz|}~~}}~~~~}}}|||||}~~~~~~~~~~~}|{z{|}|zxxy{|}|{zzzz{||}~~}}|}}~}}~~~~|||~~|}~~}|||||}~~}{zzyxxxxxxxyz|}~~}|}~~~~~~}}|{{z{{}~~~||||}}~}}}}}}}||{{zyyyyz{|}~~}}~~}~~~}}}}~~~~~~~~~~~|{{{|}}{yxy{}}}|{zzzz{||}~~~}}}}}~~~~~~|||~~|{|~}}}}~~}|{zyyxxxxxxyz|}~~}||}~}~~}~~}|{{z{{|~}||}}}~}}}}}}}||{{zyyyyz{|}~~}}~}~~~~~~~~~~~~~~~~~~~|{{{|}}{yxy{}}}|{{zz{{||}~~~~}}}}}~~~~|{{|~~}||~~~~~~~}|{zyyyxxxyyz{}~~~|||~~}}~~}~~}|{{z{{|}}||}}~~~}}}}}}||{{zzzzz{|}}~~}}}~~~~~~~~~~~~~~~}}~~~~~}|{{|}}|zyyz|~~}||{{{||}}~~~~}}}}~~~~|{zz{}~}||~~~~~~~}|{zzyyyyyyz{|}~~}|}~~}~~~}~~}|{{{{{|}~}||}}~~~~}}}}}}||{{zzz{{|}~~}||}~~~~~~~~~~}||}~~~~~~~~}|{{|}~}{yyz|~~~}}||||||}}~~}}}~~~~~}|{zz{}~~~||}~}|{{zzzyzz{|}~~}||~}}}~~}~~}|{{{{{|}~~}}~~~~~~~~~~}}||{{zz{{||}~~}||~~~~~~~~~~~~~}|||}~~~~~~~~~~~~}||}~~|zyz|~~}||||||}}~~~~}}}~~~~~~~~}|zzz{}~~}|{|~~}|{{zzzz{{|}~~}||}~}}}~~}~~~~~}||{{z{{|}~~~~~~~~}}||{{{{{||}~~~}|||~~}}~~~~~~~~~}|||}}~~~~~~~~}}}~~~~~}~~~|zz{}~}}|||||}}~~~~}}}~~~~~~~~~}|{zzz|}~~}{{|~~}||{{{{{|}~~}||~~}|}}~~}}~~~~~~~~~}||{{{{{||}~~~~~}||{{{{||}}~~~}|||}~~}~~~~~~~~~}}~~|{{{|}}}~~~~~~~~~~~~~~~~|{{|~~}}}}}}}~~~~~}}~~~~~}}}~~~~~}|{zyyz{}~~}|{|~~}}||{{|||}~}||}}||}~~~}}~~~~~~~~~~~~~}}||{{{{{|}~~~~~}}|||||||}}~~}||||~~~~~~~~~~~}}~~|{zz{||}}}}~~~~~~~~~~}{{|~~~}}}}~~~~~~~~~~~~}}}}}~~~~~~~~}|{zyyyz|}~~}||}~}}||||}}~~}}}~~}||}~~~}}~~}}}}}~~~~~~~}}||{{{{||}~~~}}||||||}}~~~~}|{{|~~~~~~~~~~~}}}~}|zzz{{||}}}}}}~~~~~~}||}~~~}}~~~~~~~~~~~~}}}}}}}~~~~~~}||{zyyy{|~~}|{|}~|{zyxyyyz{|}}|{{{}~~~}}||}~~}|||||}}~~~}}}}}}~~{xy{}~~}}|||}}~~~~~}|~~}}}~~~}|~}zyyyz|}}|{zz{}~~~}}}||}}~~~}}~~~~~}}}~~~|zyy{~~}{{zyyyyyyyz{{||||{zz{}~~~}}}~~}~|zyy{}~}}||{{zzzyyyyyyyyzz{||}}}}}}}}}~~}|||}~~}||{{|}~~~}{zyxyz{|||{{{{{{{||}}~}|||~~|{zzyz|~~}|{zzzzzzz{{|||{{z{|}~~~}}}}~~~~~~~~~~~~~~~}{yyz|~~~}||{{{zzzyyyyyzzz{{||}}}}}}}}}~~}}|}}~~~}|{{{{{}~~~~}|{zyyz{|||||{{{|||}}}~~~}||}~~}{{zzz{}~}||{{{{{{{|||||{{{|}~~~~}}}~~~~~~}}}}~~~~~}{zyy{}~~}}||{{{zzzzzzz{{{|||}}}}}}}}~~~}}}}}~~}||{{{{{|}~|{zz{{|||||||||||}}}~~~}|||~}|{{zz{{}~}}||||||||||||{{{|}~~~}}}}~~~~~~}}}}}~~}|{zyz{}~~}}||{{{{{{{{{{|||}}}}}}}}~~~~}}}}}~~~}||{{{{{|}~~}||||}}}}}||||||}}}}~~~}}||}~~}|{{zz{|}~~~}}}}}}}}||||||}}~~}}}}}~~~~~~~~}}}}~~~}|{zzzz|}~~~}}||||{{{|||||}}}}}}}}}~~~~}}}}}~~~}||{{{{{{|}~~}}}}}}}}}}}}}}}}}}~~~~~}}|}}~~}}|{{zz{|}~~~~~}}}}}||||}}}~~}}}}~~~~~~~~}}}}}~~~~}|{{zzz{}~~~}}}}||||||}}}}}}}}}}~~~~~}}}}}~~}}||{{{{{{||~~~~~~~~~~}}}}}}}~~~~~~}}}}}~~~~}||{{{{{||~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}~~~~}}||{zzz{|}~~~}}}}}}}}}}}}~~~~~~~~~~~}}}}}~~~}||{{{{z{{{|}~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~}}}||{{{{{||}~~~}}}~~~~~~~~~~~~~~~}}}}}}}~~~~~}}||{{{zz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~}}||{{{{{{{{|}~~~~~~~~~~~~}}}}}}~~~~}}}||{{{{{{||}~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~}}}||{{zz{{|}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~}}|||{{{{{{{{|}~~~~~}}}}}~~~~~}}}}||{{{{{{||}~~~~~~~~~~~}}}}}}}~~~~~}}}||{{{zz{{|}~~~~~~~~~}}}}}~~~~~~}}}||{{{{{{{{{|}}~~~~~}}}}}}~~~}}}}||||{{{{{{||}~~~~~~~}}}}}}}~~~~~~}}}}|||{{{{{{{||}~~~~~~~~~}}}}}~~~~~~}}}|||{{{{{{{{{|}}~~~~~~}}}}}}~~~~~}}}|||||{{{{{{||}~~~~~~~~}}}}}}}}~~~~~~}}}}||||{{{{{{{||}~~~~~~~~~}}}}}~~~~~~~~~}}}||||{{{{{{{{{||}~~~~{wvtss{xxronoqptorqzxmhvywpc`]chq~yiinx{{ujpvrdaeq~yhs}m{xzrtu~{tt{~z~hivvuvkggcfjj[douzytmwsu{~yuvsVhpZ^hpr}z|u{xyz{w|zus|q~~uw{~sx|w~kp|sw{vtqyy|y{yx~pan~{t~zvt|y~}r|hn~y}z}~ypYZbwy|ndmmc^[igejphcrovybmu~yutqjmtzoqgiswvtmsu{}pfo|uzzwqmyzvx}{x}szkd_h}~xrktkwst{wrzx}}nwrpbgrb`hpmvoum]jX]biddkefxeshpsp}ogbivtshvdojhrf~u|x|r}pw{t{y|}|u{qmuu~tj}y}nmzyqxoqwss|~rv||rzy~lficgk{{zuvjj]ixhcijmivmqteuuiqto|pnbrk`eqkln|y|rt|hvqpqvrzv~ux|zuu~dgelh|qotsxk}}zzz~vszz~imWbu^Xlozmutq_kmfenqhpvkdujehzibm`m|j]_voZx~utwzit|zo~zx}{{~}|usyxY`~wwz~uzzuwvtywwsqyz}y{|yvn}neihdg|t{|bpiausdWizclysb|{vueywtlxhekjddxsp||{potnvttms{s|xtwspggomqx{qop{wt|nz}z~}s~y}~zmp{bVd\qyyv{mtxmqprgkrudptql|phrrjhvgd`fxdY[^smtwz|~vx{x|~{|w}}ip|{gvuvng|rys}t{|q}{|y}wy~qou|vz|~{~}|y|{thgfdel{|tzuskjpd`ksnqzxfk{xrrmwlitmflkeox~z}|x}uq~jlteo|s~yowurcql]bqrq~|{rn~rqw{~|z~xywy~{sqncbe^bbh{sy|gn|repnopqrksxrmyvjp{kkoZlraT^wrn|~{szq~{}xxzwyrhegxkf{yg~yvtxvuxt}xwu~|uz|j~uxs}yv|xh_rncv}x~qsuk{g]upx}yf{{ryleyoagl`cnrpvwz{rwmsllxs}~}x{yutwanbkjvzz{ow~}x|w~{{{v{qnqsXeeW\ig~}|{nzxtolylmxunoufl|llrsifeopacixtv~szyz~z{sjybdpo`apt~lyr{}}txqxyzt{uwqx~}~}}{yurigzppn_ijmq~v}riluqhx{sygo|yprqfqjagent|zvz|xjxs|y}tvwp{{xmmtogshbryptyrs~w{uzxz{px~p}{{zwz}}wx|pffgdmkf^is|||vq||~xytuu}oloohtve`_Wpvgak}{~{wzt~tz|yyumrsj\mnk_q|wquyy}y|vor}ppyxxp}|z~x~o{zy|kgjpmd`ixko~yrtutgr{jswtl}y~or}kdquor{vxyuyvowp|yu|}{wzpnoskabd[pps}v{uwx~{{~{|~zxzz|yruwnw~kjlh`fccYrtpuz|u}svxrw|xsyvt|iivmkY]gustu{{{|w||}zypqy|kiaolekpkp~yzx}z{ssqlu~tn~ymqu}|p|okm{rpvyykv|kXcvxusg|pm{}s{svw{sdppjdkunpxo{}{|xxwnlzps|wzzzopwrrfhainbsxzv{~txxz{|rz|{uywz}|syuzxtytcufnjc`Y`jisuyv~xx{yx}xvnrvy{z{lvvpouijjlwzz}|~~||s{{t}kmuiedehnf]q}w{{v||syt{vzw{~yy{j|vvutsgm{sjsyka\dqdZio~x|~w~~qy~zynxvnttvhfukp~~tt~}q|zt{}}wo~{joz{{okorqormcatw~{vqv{xsopzx~uu|}}y{sqzoszv{twhmuolrafophjfgm||~ww|vutyry}mik`ozmrbo}}yx~zws}yzsoqq}xr^bbutbhuw|vvxtxsjk}tw|xw~ww~uys}~v~skmvkjwlnZ`f][jtrlqq}t}~v{twz~xr~snss}ryx}{z|w|xx{yswqttymllsrcddhkculx||r~v~~v}zztsy{}z~zy~xt{|uyqxpmrwoddc\qffndihnoly|wzxz~ntrckrpwoluxtvzvy|ytxprioysndbiuutx~{wt{qiq{|y{rphzxxxzz~x}}}vrinz{qlgnyqsocfbloaYmr{uuv}v}zxwyuihrtsrj~x}z}xvuou{~x{qgp~ulcnmniffci{zx~{wq|xxp{x}}sywuvwy|~z|}p{tw}pon|wplnajhWcabqpf`fjr~z{w}tkquq{rzoz}}}}~yru~smhmnkqfg_dkr~p|xzv|}uzwu|xzw~{qjq{}~r|uynvnjtkokklokbnsaiWdpkjqx{urzvwhmuss}s|{y{}zr{}~softyfjlqtnofmhlvyztw{|}zz}r|xwm{uw{pjpqw|{zyuosvihpxvmnkqsqrmaZeffregvnsvuv||zvt|~~qxx~roxhy{v}{u|~s~||s}x}{{xxvt~yv{{~ttvq~oxvw}||xvlmunzsyz{xss}p{zpdfpliunj`c`no_`hdmjgnkj{{{xxr{{~}pqy|}|suutqv{whssqxuttxzx}}w||x}~~~rcgwvs^Vc[`eecgz|}||}{sy}glvglkmmhrq{{quxuu|combny~zys}~rufff`jcgptnhmem}iuqghegcly{|yyz|wy|twstvzoyoguvyuszvy|pm]e]]\^nuvjapbZ`ktv{ow}}st|zstu~{zw}rrdhrkost||}xy~zz{tuwploxtsnglhmh__iwhjkZomhigiryu|strv|uzyvjmb`hgo}wyyzrmkjp|qryr~{vnlkiatryqpjtzv}womvhjkqripuytummys~|roqsxxwpginvwu{~y~z|x}slmcplkyx|xjc]acck_aadciragncd[Zmw{}zsvtmt{{ymryzz{~|~|zr\fbZY`myvwpo{wvspttgswluqjlqyzuvrwokrssvu}vyvrumfmtjouwy~wxoxouvuywzmv~w~}~w|uus~{{{rlpopsooinkgfad~~{}{|uv}yzqwurqmlt}~xpjq~|w~zpokWdh_e`h|xnipzxrpdq{ulsibkj_igdu~}vkkmpwrngivxztt|lovefpuruz~zvxzglnmjkw{xxpwofhcakkgkf`hupopw{|vsvw|~zz~{pskofgr{y|}yxy~u}~t{w}yy|z}xtwqtnna[^^djf~{}|vvrinmmrvt|z~xm|}xtw{l}|juqu~~yz}m|x|rgqg^iji}{uplkojeohktdhtklqvoqpq|wuvy|r|xy{uvmp}fji]__ddny{uw~~~{|~wrlc[_b\_v{}}ztuxty}syuywr]d{{ol{hpymkr}wu{qpsgqls~ynsu{~rt}v}{zw}~z}ywq}z}~~|ppzy{ywvsui]]qxuhmus{yws~{{{tszwxgrzrt{~{xx{{cfzylljnzzusty~txuumob]cqnv~vurpxzz}}kgcc^mqhoal~mqrtqwrgiluz~qjkutwfamjcgkhyyponrofhZaa_hnu}{}rxxzpps_aZYlsrz~mwtolmtv~x|v}{w}oa_^b{|sl`ejigggdnlYlk\`achswwy{xx~mvaT[XYbrw}ytulz||||}stxr{y{ve_ljl}{wpsuvzyijebj[\^VZ[d^e}xzyz}~}yr}~}pulhjeigk{r~{kv}~|}|twvsss~orokjlvwleoxptmgluwgnjW_XY]\ew~~}|w}xkpa[jb^dfwxvwojnx~|xwwz~ss}v~n`cebdqwzyxkqtqhbacsgal\]eihgqw{|}~|voqweac`]]hy~~|}x~tvvwzz{rv}smeh]aqzuuwxoanpkebhYTWYfaasvwyz~~yyzzjhfdd]czvuv}~|spsqrtv~wjkjehnw}wqsynsvpprocmfQbf\^`gr~ux}pjti`hdYfnx}yvvwzwy}zvy{x{sfc^\[i~{zplrmgehini]ihbfeccisv{~v{xrg]\^Z[gz|}|wx{{qzuz{v}z{{}nic]ljk~|x{{vikne\`_TZ^^fbd}~y|ws{xoynekmkmoq~uvvxuqxxvsv~~sty^`mkmqz~smlz|opmlttjon]\d^]chtyy}ulobWZhjes}~vusv~|zzv{|utji[W[bioq{xrurlfefehib_`elsv}{vprhceZgihpuvy~z}vjlnofmwnxyy~x|uru|||yyu~|wx{xuvxxvqem{jftpkptw{{aansuvxypx}|}u{z{|~nu|jpxy{~|{vpyxyz{rjx~rtz{|zuuv{q{{~}ndvy{ustpejjhj_ficiq|vu{}zxvwwtoku}wvu}~~ykao}{}}tt|wmpvwxw{{{qrdfzyrqihnshgn]_fchhhmvyvwnv~}vvtryynsvlz~wqs~tx~wxrz}vyryzphj}{oheko^eh^dntttvryxjfntqvs}zx|wn{ux}}xqoowwfkvutvtmuytnyx|urmie`_xvmysg^ddVX\grilvxzzwz||wussuurt~xq{z~~pvsmhfrwz~p{vimquy{}|whebhrx{ysfkmW]ngegikmmkpwvv~wzrqvnjxvp{v{~}{uomsq~~|u{{|z~|~z}x|}qrofeu|{vtssibkihllkknmjyximvpt~~|~z}}y|yvruvrprttwjax~||~zlptrzuz}~wrrph]Xcvuy}p`ceZ[bdki`oz{xqr|wr}}~}vqowwo}w~|rxwkf`fnnntsmtxwssw{zxwm^dmki{vrxm_ejb``agmnkrwmuzt|xwovwlmyxuyxz{xpsxm}~}|~uy~~sy|}~y|~xxxkmqiirqx}wuooriegkoqppsoqsfjpgq{yxzqz|vwuqmlkmqgowv}{|wmuzryvu|vkjgb]\eos{ylhpf^_acmlepusru|y|}{xvvx~ky}{}~}zqjwwhbhrlsr}~mnsstvy~z}|~~}zyvsk]bojmqtwk`esldfiljgcppux}}wqkuuosysnxzxsmjtym~~x{}{}x||wx|z|zsmjrocdbgw||||sowkfpsspnorogprouqx}~~~sztnlgcefb`\Zk{|n|zxyvxwypjuqjnqpox{}|xr|}sv{|{{l_s{oqwqx{y{|{|~r\k|xtqnjrsikw{y}y|vZl}zz{}}xwgn~rmljd[n{{r~tpqyskkkkkhgtud|x~xohZ[|rkpleuxuxz|}{y~|p|xrzxxzy~z{}tvwvsnknheyzdblbq{oh_TW\aa`lrokkoilxoxygm}wpnlic]V\jt~}}qinr|~ugaaXUVTT]jgo||~{{{ypnjd\Z``j~}}|zxz{{wty|}yuxtknuy~ytopmighghiarrhlfeimysnz~}vqoh]QP\ac|}qtvf^hf^`bcf^]r~}vr{xwwpmvzp{xvz|~wvrgYOMVX]vyussrhfsi^q|tpomc`qzqmx|skglsow{s|}tqpprrop}}{{qbajml~y}zwxywsttmu~}vvvlcnogedcgkci~~}uvxyusunm~zske]Zdgovopihnfivxuwxpy~w|{yxtojffjgsw~yztp{yytvun}xxndb`\Z]fhbaowq~~mrwngeccg`^q}vzz|nqtvvnyvhgeb_]\_`STmqiruhbqssznww{zxsqng^W^j\_smutllpthbp}}o{|uqvwjj}zswtmkinzxw{wvof][_YUcu~wsonpnekm^ds}}ywtjhsturmwzusw|su}zxy|{|~z}wnpg[__W_p~|~~{{~}qv~}vmuxmjkhbcgcfkkww{|rrvxxztkuwqnniam{spwrku{|~tqvrz{qllkf_[[`_Uc|}sv{swv}{umiinibpvlhfedbfsl\mz{qy}pihkphdsryup|znihnj]`nuns~qnmliffi`Yev{wyyvutpg^jrbeyx}wv}xsojd]Zakhmxkjrlcgh\^luzyvsuxos~zwv|zv~ztronv}wy||xmgc]XX^]_q~zwwwvqmow~~zqnxxqwwnosqsywy~wsqnllmornn~seegcffnuyzussstwpl|ztmnysihhe_\dnmm{wxy|~vu}zxricbkmdu|uyukgkrmjs|w{~pxnmmg`[\fhfu}~|tsqywo{{lptogdiux{}snkiiffqxmu}xxnflj\W^hgj{vr{vjd`_b]Vdvxsjhhgdejegv}{~{yvsokgky|~yyusvld_ZTPOT`jxxnrwponju}zwtrvzxwwuqljioxx}wsrpor{}|ypuma[Y[dklz~{wtrrurep|zwskclskfmrgcls}zxvtrpqwvp~|xqnkaUYgliq~tz{yvvy~ywynq}wlihe`\`rzp~stztmmsvmq~ryvuqkhmy{w{rmlrsilzzs}vlyshfea\[bkjozxz{qs|{uifkhdfpvw|smhedddhnpu~|tlnoffoop~}}rryrhc`\[a`bntwooonpoflz~~{}xwtojijjhq}z}xw~zt{yokgaZWW_cbs~xonwwoeix}yqoqqwwrnnryvuyvtsst~wp~kflfXSU\_Zatslwmt{rjiopd`lwup|{uutsrswtkq}vspkbZdrhdu~w|}{}xr}mlwrhdca]Z[fpkj}{~y||rsvx~vrolhehomjq~{vqryyqvxs{z|}|tkifcbfjdft~{wuvzwmpwqooeaegipspz~yusqqspjs~|~xvoeekiifdo|zwt|ymgea[Zahebm|yommopf`lw}xu}{{ytrtyuit|y}wu~z{{qsgec^XVYa`]l{svzilz|rn|vjotqlkqwsp|}uqooons~}nu{miok_\cidfu~yorzopyukggjmfanxswvtuutvwomy|~}tolhd_Z`kijxww{~zz~vokhda`cjnsyyry~yxums}zyzwtrolhefksst}xtqsy|wrs~|y~wmpmd][\ageftxw{pnvsihldY]enuty{wsqonpsml~|~yutod_jtrlqy~}||}{tgjrk`[YWSS\nsly~{srwxpp|znzvsrplkoyzqxyttz{ss~zlstd^]ZVW]hkm{~{yrnw{qr}|zuliu|ymflomow{vrqqpt{~}~yx|qh^\b`\dmnu~~~~}|vmpwqiecadihlx|}slklmrsmq~|{x~yqolighlpu}sv||yuy}wlgeb^\_gpr|zrpz|sq|~zrlt|nehieaagryy}vromnv~qy}ymqtjaahrtr|~}||~rx}wlfnpe_afaW]n{|~wtrporwrnzyyvpnle]_qyprwv|~~{lpvmc_]ZWXar{v|}v{}vswuou{py{trpmlnv~|z}vqpu{vs{|||plpqk`YVTTYciis|}~}tnvzwuoffknt||}ytponorvtwxx|rle\Zbegkjr~z{zqkrvmfcb_`hppouvstwztnvwqw~smkiedhnnhtxu}||wrvjgfb_^dkjix}yrnwuho{~{tjl||ibgjgeirxvy}zxwxyp~~qhmpgadllhn|tq}zojqrh`^ad_Xbpqq~{vutsuwojs~ywuqlhnyvs|wv}z{~tsuld`]ZWX]fmos|~z~|uns}~{|zxvsqmkmswrrx}~wspqw}{vrv||}spph`[[_fhdjy{r{wqx|tqtodcksyws||wtrqqsupjvyw~tlidYU`jiaao}~vx{qkigcckwuioz|yssvulju~vkwzplkheekqnemxzz}yo{ykec`]^djgeq{{{yvtzzwn`bjhd[Xet|vxylkmou}~|z~yuw}~ec{wvw}gmwk_ahddddllr|wxm{|zytmsx{~{wurruxsvsr{zvt{}|n[r}~wwqwycurglnttlnz~uzpolry}|Zgwxjhmmmjohkvnyx}umysh~rlx~tjppsgfpnn`irr~zu}|v|~vmutsoqt~}zyk`s{ec]\TWR[xwkqo{xxyvgszyxvyqqszzzp}{~s{rx}y|ulrrdrut}pvzyxwr}{qnygejkmtsfY\cakkdnoqziirwtlqvsmby~nnxln{oulr|srrafeUntzuyytyybgieoo|}zefmaa`X`WYg_^jaPl~mu|ryxzpy}}qlit|z|{r|lzxtvssx~{yyx|w{nuov{~{ssdmuip}uxo_wyxnbcqks|{}r~skz|svttvgxohma`}xq|{}is~pxzx}wruors^Zpqw~~{xhgcZdhda`rqtjgnghkjvmzwqyjWwnolt}wsyrgv|uotwsyvw{vuzy~{zpaT^fchnup~piso\ozfkh]lnj|{p~qtortkt~{~v{lhwrjv~{lplkj}{pzt{vx}txkeooa|z~hc|xovuinzpvifjbhomuq}v}zxwymhxngqq]pnf]\uvnt{x|~v|}~~~|z{nYnkbinn~ztblg`_]khbq{ph|upxzlzr}|ywq}ysmippdkx}xoupx{lrkps}|y|wslngtyxsumdc^npdq|xeZtynu}}z}x{|pwlqulqlx|t~xocskdlyr{pt|{wuxtq}h]a[kwtuixlfjjpgfurpb`odgakwrys~tonpkwz}yzhr{z}wzzqv{yz~~yy~vu{|fchY``lrw~ryx{jkvmnyvaq~kgci~{rm~psqwmvwyuvumuz{twskrszz{|~zx~s}vvqvzwye_mssmwuvvsvqtnbtm]ddo{t{v{m}~tuwou{{rlcduydwy{ssvwpvsty}z|}{n|tmh]bfqocwxr|qopsvrym_qyzt}~~wq||rnrowspurm|{oknyvm~|ux~u~vnv{xy|kmmz\\dfnk|xqtxdaanqlxvcsvs}|~wyuls{wdpwyls{uieflglu~|uwrx}vx}{twy|fff^aeu~}ormnqgmpab_dkr{{yruywrujtuqsalorpfzyyx}t~t|y{v|mhlis{wljrjrv}zpzqwjfz|viictlisi||y||usvsqf}yxtlgclonxustqs|vtyn~mlmm{lkXP``mwz|mpqvpvrnxzq`[z{u}rostt{|yxyqotya^\qt~v|{nvz||xutxuo^l|}qTWer{wspv{kicjwgdoxpxozoymgkfluz{ysgfepvusvvzq{~|suk{{plpwnae^b]l}u|z|}otntoss_edl~~~x~nquuwpuhkha^lxz~vvz{q~}zvvywtnpzhgf[mc^_mz|toompw~tqrkoqty{~zwv}nu}ti{~}mqmgomrjw{ypthxz~rpzyytstypqumol`Vgocim}{ut}t{{kdgopz|{wrsfy}mjm}pi~~a^wy~vry|~|t|thjxu|yyuvigjlmrh]^npjw}tqmzfotwx{wt||uxxmuxjjfgzl_eogq|{z|}x~}{yxxyx}{yq}zkrtqng^Vbgpp}{tpisvx|sdq{w}yv{utuzlqvtoyp\a`gtqu|yz}uu{~|~{rjoum{~zik|qig_mqlyw{}qstrq`ao|oxz~vuzqsrtpqyuurmbkrol~t|{|ryxwztm~zz_mxuhd^jocs}p|vjjkc|lqrx}|{~z~|psxiru{vcerpqmy}|v~n}su|vzi~|}}rtxogmppbXebdmlxz{zt{|oos{urv{wnfxyququxm{q[bqhc~tzv}{}tq~wylmwp\rwbicSca]ywz}{zuucfzww|||stlpfuxgy~ssg|nfrxrvyryu~un{wv|hptuneslhh\acdu|~~xyzipnebzvr~owsutlrztsnuib^ewwz{tzo{q|h{tuypmcnnfloskQbicm}wyu}vmpmwxuu{~zmn{khqp`v}\Y_aw{wy}|~vxtvvwwx{onobf]gn_k|po^Pr|u~|s|z~ytdyuzzzyox{{drrtwtmti^mny}|txur~n}~hnruz~ptyhnihh`grjaTfmqt{w{rsm{wxzqkx~xvkqwnkesvmkekphl~ozwx}poppp\hla`l[Nilakn~zx}}w~xpnou}qvobx{dc^fwsgoss{mv|}s}{y}yntxz~{vxxvwju~ttaZrsoreXauo|xrwro^pysvyy~zpm{mmnnvkbgfqn|{x~nuxmnpnpx~zzmgpjkadmgkeic[gpz~|o~wsr|{qyzmnopndwweYc_hx~~u~xsgux}|s{xlbh^[qj\^Zdd\_x~{{xsu|uy~~ttwogu{pjy|wufo|nptsp~yx{|w|mhtqs~}yloyxsj`kmgmcb][kox}x|tsztgt{wu~yztxqgolnnn{mhcoyrv}xr{usrzu}s|rskprdcill[aca^iipz|rxyr{~~{lxypefcc|}g[Ujwsprwy|xsvx}v||s~ke^jrh_iyuoWTmvz~|{~~lt|ttxvxzvnjddd_ffiojnqrxwx{z{ywwx|{|olvwyzzk`ggc_[XN_[aui`\i~~xy{utwyyzs|p{pu|fsz|{so~zvyz}t[_b[dfn_juo{zrexxlcWS_}}guyuu}x}jxziz~lkxr~ivtuutteg|naef{z~qqsu|utp{wr{olnk~w{udx|rwszo{yplyztr~~tkUkqxuurvjvaXbZccfTW^in\rwzxvmntvqf}yxvx|}|abwniwvpqqqyv~yw}pqwxzuky}h|}uy_knlptogot{xpy{r{yqww~~suwzjuxgh^Odbehlc`_nfrwpwuegkrs[vuwumn{|ttnlw{|shktqdxph~xym~zroilvmpz~|}tpprv~zp~|xys||vsuy{trk|qnxrpXhdffdbZVbx\ekfpkcdlps^w}||u~kj}u~~u{ssnegsxlzv~tuyv{gyzt{|~u}iiuovqtoig{hxy~s{|lgktpi|lp~v}mlfRaYb]]_XRhsXmms|ttx}~xby}|txzopoam{~t{{tpqsx|y}{qtmq|~sswxy|ymv^ihosozup{v}vy|yz}|lyop|rzp{|wtxfq\`egneplbfgaqi{ooqvtwbgvovsp}w}rzntvz{xujsuh||tv{~vzvuvo~r}{y{vtovus}sqylwwvx}vu}pju}ki{kwy~s{odieoanna^vfUk`tkhrttxjgv~{|txmoyvouywxjs}s~tsmzmkziuxwwlppyk{znlqf}s|~~n|ticrwbcsfw~r|ocedk\ml`^vcYrg~rr}{}mj{szyv{wsqqgksq~ut{vxy|p{yoiymj|r{~{v}yimmyj{ws~k|y}xwyouwogumevpt{xy|ilivgt|pfyrYrkxuh|ywvma|{lruutym{spoyy{{}ypuu~vxz|{zpxxgtvn~{~|~~xvruxs}gx~}tsx}~tsif~v_frg{y~|pkurgzvjhx^]qg{em|wvvhoyw|{}ytvpjqws}w~ozzr}~{~}y|zpgzjdqkpy}sor}kyxnyb|yv||{||xunywj_c}p]goj|wjgvlfvsimzaewrlw{xltxwxzwwtppifnuv{uvy{~zv}{tuujd{mjvrx~~}oir~my~vkvy}|zz|xvwq|sotzlce|glto~mjzwkz{ro|jbwqpl~xtklxuwwxtyp|nlr}~~x~|z~wy|xrz{{{w~ogswjstp}{~}{nttuv~kusyzz}}yx{|}utsoyj`_z~gipmw|phywhtxqlxj_tr}qi{vqr|}{|v{p}jhoz}{~vzzz|z~u}|{zxszwhaotiopo~xiqor}}t|~kww~|tvv{vyoxmmjsc[_|zhlqq~}kh|qjvzst|jj}{rr{upvz{xyvsvotffq{~yyzxt||u~qvoyoed|spttw}si~~q{|zpw|~~}wt|{o||ussmqlrpa^ptmqsr|l}qv}}u}vgu}~zky|spp{|zzwzszu}oio{}{~v{~{o{|}yxyvxxhdq{ooro{~|m{tw}z|nyt~|}|rvx~~qyx{rroomq`[fwiknm|{ozsty}vzvhq~~{nuwtu{~wzxzpejv{~~|~xw~s|}xvvusvd`lymlom|z~mzruzzznzyxlq}{pyvxqlmljk[Ygujjnn~p}svzz~xmw}svvtv~}}}z{txvxobhsx~}}xrxz~vtruptdblroqp{zyq{vx|sz{z~|}~}mq|y}oq~txprjqjo`\e}nklnuz|~|{|}pt{wpvst{||}{|wwzy{ggrx}}|{xyuq}zp|rwjcgtnlpo{}z{v~xzus}v~z{sku|vzn{|zywhqlmg[\nskgmj~zzy|}vpzyvsww{~|wzz{rbhrvz|}~|w~sy}yurwqrb`j~qkmntw~{z|wxw}sx~w}~~}mhsy~~xvnzwxtvxdohkaY]rsljpm|{|yv|zuww}||}yvwxy}qbjsx{x~qw{~xrpuqpbbmunppvx|{~~z|yvz|v~|z{{{|pit{s~uit}vvtsyfnlle[_qxpkqmz}}zu|x}pvvz{}}~{xxy|~{hity|zwts|{{nwrrfah}womqm}~{~}}}{xuw||zuz{||{~~ugqx||r{~yjs|yvwrxhjlkeZ]lzqjpmzy|{zv{wryy}}~}{www{zzhhsw{~~xvt|z|xlspoc`g|xonqo~}zzw~vy{|w{}~xzw|{}rfpv{{suirz~uttprehjjaZ_pzrmsn|{{zqxyz|{~vwtxzyxgluz|z|qv~{~x{rnrsmbdpwosovxy}{~y{w|us|yz}{||{xxv~y}mjtx{zr|}lkt|zswrrngkmi^]g{wnppq}~~z~vvxyy||{||wyu~y}phrwz}vvs|||zxpqtrebj|zqopm|zzx~|x}uyu~ys{z}~|}~w{t}xzqfoswxr~rks{|twupohglk^[bt~womol|}~z~z~v~||}~w{s}xzqfptwxzzt{}|wvqntqeanz}t{zjswtmqznxrnxy}veb^qz}xz~}xu}xd[d~njhezpive^eoutk{}nic\ixt~{u{yjlluuwrzm]a~mgawum}sjs|xosuvx~uy{n}{j^U]vpkrripgsyvpx~~u{{h`hztjzzlyrdju{{r|hio|wxrpyj||x}~|zxxggkrzyw_PWrqsu_deST_gjbfus~yvrzzkinq|wz~o}nwx|~yqp_V[cm~vy|yzln|{ruuf^kqpwnfsjjntmjmsmkpdqhd`TY^dp|x}z~{{kpo\Zgxr|vgmx~}ux}yvwdbRPXdr}yqwwsfjovstvrjqicqdY^n}xlsqqzkgs{~xyqx{khswu~wsz{}v{wtkpu{|vuaghWYjrvq]ajnldorr~}wv}omzuelnvxwzyq|ox|x}|}xvqygg]Zcmx{x{~t}quy}hluiev{vuthrnlpvpkmsojsclk_cZ]djr|~~y}|qxhdrcanwww}nkyz|||}vgp_ZYVao{{u}{wyjjmssstshkn\ll^bpzmoxpyugq||y~|~lm|rl{}|{~u~}}~}w~qvpszuho^Zk`bq~yuyhbnrrjqup|xqxqfuxgostyvx}s{tw}z~}{~t{sgsb`a`it}z|you{yvusbiwko~z{wpuqqvyqlnsjlp`mg]b_cin{zzx{~~|pmt^irek{}y{|lp|}{~||szfgiW[\`lw}w~rkmpsrtslesbbsecl}tn~}tszlkx}|w~x|rizwky{{y|}}{yyrtuty~~zqdo`Xmdcpz}ofqusmwup}xqwsgwxfoos{xz|uyvxz{}{}s}pisb_bbgoy|zwujyumw{}v}~xzy}}szrgo{rtsnouvp}tqvw~||zyu~~tvvxvvtncqh_wpip}}l_pz^Ufji}~}z}{r|nhtedkjlntptughkprwxvozt|~~wzpvux~{}x}o`awra[^\Xg`]ndennnnot~|{|z|{vlytf~yquvfgim{}vkz}}|w|y}~z{y~{zubmz}snhfdaWdgWnpefox|}yqfsvnfjoixwz{u}x{|xzogkw{xvlvuhwuktwuut|wx{ma]hhw}~}xpkrmj}pjmdlwzsmmprnhisy|z{rv|kqwhkrppp|pn}}zxyxqnrs~y~||~v}~{vsldan{tmvfama\eec`dz|u}xwx|tjx~|{xxwxxtkywh}~uws~{pfgpm}y{{|x{}y~||yvgl|xuqggtafwmhluy|zteiunhalkl{~wx}w|~vx~vz~ywurlhwvuro|rnyzwtz~z{luqg`cqs~{spwpp}oomdnvxpkjmmmfjz{~{yxpxzjrwilvtrq||pr~{zzzsrvt}{{~w~ypljjiewxq{pdok^glgddw}u{yttwvlu}{yvutuvums|kuzymtwokiy{||y}}|x}y{uruoo}ywunhvmdvvnnux{|vgdrmjdjtpw~||zs}xxy{yvysooqsl|zuzo{{ow{wx~zvdlnhhh{ztyzr}urqfktwpjghkpkj~~|xvnw|lnxljwwsq~}yx{vv|{{{uuyux{yzx{pigglnkxxpjtmblojek}xu|vsswtm|~}xwusrtuqmyxl|{|skwroko}~~x|{}zyty|vv|{tqsuo|}{wouxiq{tqux{}zmcookhdrrrz||r|zv{|zrzyrnnpvmt~w}~~{vpmls|qt|wy{zzvi]jmjjfu|{twpzz~{qv}ytrtw}sp|yul_foorqb_mlgdryovwrruyst~zowqdw|~~{npuuohegktmmquzvholffv}u|~zyz|tsvzxupjfehn|vt~{wy}zp}}|vsluroi`gqvtrrvzwvzr~{~v}ypm{}tzzutvystxplnvyxz|~}rivxrpgotqw|~qvywwx}v|~l_krvvmwyovxtstwqmr}{xtnlmoq|~}~~~shswrqiq{y{{|yy{ppuxtomnqypg}{~ulx}v~~}yofaafnzksxpndfplnuxrrxvutu{lkqurnkloxtg}wjs{v}v|y{|yy{ypzvy}|ytqqst{~vkonnqx{}{tolmstbl}uw{sgjwpmzvu}vmp}wt|zwvyzsvz}uomnqwtp|yuqhpvrv{v|~}}~{pb^nrr}|xxxrlz|mx}uusoihhikv~}}}~tjtyrsjlyww}xwzyy{zvz}zuqqt{xgy|xnwz{zume_`dlzrq{tqlbkpkmrzukrttttw}}sjmstpmlnt|mmxlk{|{|{}}zuv||zvqqruz~{{{{~ifklqx~|upopwucpvv~|ulbkvpoztrytms|tt}|yy{}wyz{yunjkpwvs|wvlq{vuxsy~x}sj_\q|}~{z{yqwrszronjdcfjow}}}||~~xlr|vvrlx}vwztnux}wy}|xusv}otxnuvmdYY^biszxots{rluplpw{nu|~qosg~vt|~}x}ln}~usqjpyklrkknnnpuy{zvnimmiu{ttyzyvxyspqxxej~xt|}w|llo~}|{xtrtx{|zrs}xuskq}{zrhq~mghihghlu}pl||tikxskt{z|u~|z{~|w{}uldbfv|{xyx}}lnu~zofdj|ygdjgfrsmw~}{{}|uw}ommcaejosxwxxxxuuuvwofquooh`ij^]g{}~|{}{s||zyv|tmrxt|v|uka]huphihpwxyy{{sjswolgan{xx~{g`smWVktlmsy{yvvz|u}~ulk{}{xohw}st~~mlpnmqzyn{|nijnprw{pZZbj~yc`ZU]a]k}}||}}xutw{zwz}jqrkq~nu~w|znfrytu}wnv|~ypcXSVbv|yohsxrsohpyrouttxwvuv|}s`RY``lwz}|}z~{}vttpidbfoxwze]^_eo}zyzyvtswoqwx|{wridszyz}~vshdfijknqwyqy|ywllvpgixyy}{{~~~n^bnmr~}yprutyxvwuoifgks|wwxqoij|qpnjikrvsuuspnnu|tn~uhiwvsx{wrkb^^equq~}~xnsyojp}xlostttw}t|legkpv|~~|uk\Ubheky}~}y}ypzx|{yxrqssollpv}tmooory|yyqkzyw{}{ui\ajd_akqjly|z|yxqjif`YUV[fqw~tu~xxrkt|tqz~swyyy{{n]Xfos{stspj`\[XSQT^k{ys||ywmkushfoo_Z`diovvuwxxww{yr|{t|zqpokfcgp~yu}yojbWYc`\gyyoquvvvx{~o{tnpsutssw}yjjzyx{zuk\Tanns{~z|~~yuvzw|~ndgkpwwsqmjimwyqzyxxvpeX[jlikqytjmrv{slu~zyzxoeb`]WV[ft~{{z~|~}{xri\Vftvz~uoqqlb^^^ZVW\dnqnwzrw}u|}xwohotkemrd^cglsz|~sy|nb]XSMMTbt{z|tpj`bke]bkbW[_bflry}q~tprtuvvx~|pswssqkbW[o{~yxyxvw|slrna_gdY]gpy}{wtrtytealrkfillh]Yfplknuzqlsyuyxrvzulijjecemy{vws~|zvnaZguwz}~zwxwqlovqe``_[XX]fpsr~|}yt}~~ysyvqxxkglptyypz}mda^YUV\hwzxtlcgngbjnb_dhikosyvu~ww{~w~~||zsg_jwwx~{vvvrmknt|~|}rtyoglk]X\_aekt}{|}oipzxqpqpj_Wajgeis~x}z|rlkje`_cmyzrv}wrz{omruwz|tx}rmkg_SLWdfirxnnwtgabca__cktwu~zqs{vovxmjostvzyqu~}{t}~rowvg_^^[VTV^jrt|xrhirrmtyojoqqqrty~vy}xladppmpx~||}{wssw~~~{rmstkindZ\`acfluzx|zzxpddormloyy~x}|nihfb]\`iqquz~}vv{|{z{~xru}|snlibVQ\edelyxwrkkliecekrsp|~ypnuumoqe_beeehnv}}|rhkvvrrwwmszn_[[YUSU]itwxpt{usxsikpqrsvz~}~sorz{rmmke[Zhrrtzwvslmonllov~|{ukgmnghj`\bgjmrzyw}}{{ypfhtupoqz~v{y~|tkrxkhiigdelv~|wpr||y~|qqwyz{}yss{yqnlg]Wborsy~wyljjhebdjrupu~|v|}vpu{usvmehmpru{|y}}}{tjkx|yxz|oo{ud\\][Z]fr~|spwwrtqfejlmnpsw}~|}wv|}tqoi_Zdpqptzztznmonlknu~}|wogjojij`Z`fkpv~yuwwrpme\`nrpqu}~xlp{sc\]][[^gt}}~yqr{{y|vnqx|~upouyrkigbZ\kvvy~~qo|}nfhjjijox}z~{zvqielolmja`glorw}zz{qmw|||ohtyj^[\\Z\bmy}}~wsy}}|qntwxxy|~~}|{z|wrqu}|tomh_Zdpqpsyxsprqonqy}{vnfhnkig\X^cgjou}~{vmekutpnpxv{~tjr|qc^__]]`isxv~|uxuqv{||}wpmmtumfc_VPYehhlsx~okkjgeflssov{~yunhjqqpmb_diklou{~ypjr{zvux~xlbjsgXTUUUV[equv}uw}}|xmjostssux|~ysrsz~wqnjb\dopmot~w~tprrpnpv||vz{zsohaailki`\bhkmot{{wnfktsmklt~{|wlqzjddda`bhptqw~xwvptyyxvwy{~}}zsrqv}yqmiaY]iljjnx|{yommkhhlrtoo|~{vokpwwulcekmnnpuz}ysihquqlloy{~qitzm`\\[YY^fnnn{~wyzomrvusstvz{wuu}{toja]enmjjoztzqkkkigiouvqv{vphdjonj^X]befhmsz|xpgjtvqoot~~}ply}ocaa`_`fntrs|vps{~wmnuyzz{}~tomkqvphe`WV`jjikq|zwpppnlnsyxsv|wslhnuwrgaeknnorv{}|umoz}xutw|uibmti\XYYXZ`jrrs{z~rouyyxxz|~{vurv~{rlg_Zbmnllow|{|rqqonotz|wv{~~vqle_aimj_WZbgjmqx~{tkkuzvsrt|{phoxpb]\\\]clsts|xu}|pmswxxxz|~}|}|rlkgksrjd_XU_knnpu~zxshchgksijpw~{v~{ozlkh_grstlnqmmrvrpvw{qlkr}yovspox{~vsyytuxulpuwyiwlfhhw~~~ww}yy{}xsr}slhcb^jstslprjimsnu}yxxyzxz|yt|z{vv~u|s[_yrju}}wzymmnsov~~|xyx~mhmllgm}|kryytoxz|xrvqggkqt{w~~x|{}}unqtuh[q~||wv|qebfhgsst|vsuwunrxkamqrmenyxy~{tym~zuz{|vvzkefryxqvx|tg^_eod`{nfbigmoinnfglwupr~voimwyuiept}u~zwwtq~rtuwtt~vhfn|}w~qs}wh`[ln]q|~}y}uibjmlmbbg`^`qzxoyyzyxqx|{pflp|r|}wx~j}ztquvtqy}lggzyyyp}wm_^pd_{}{wwqgdpkkb[`a\X_qyvkyzz~ws{|ohnqwwv~um~y|quyvpp|vhep~vzpxzr]cl\jz}~xtx}odjoieZ\caZS^n{rnwu{rt}ylhjst}sotu~w|}upsrifx}vv{p}zn\hj[sx|}vszxndnoj`W\caYTbnzlrts|rv~vihjy~s}~~xplyt~zxsxohh~|||wyr~xjZjg]yy~wvypfqpk`Y^ecYTcnxhtus{~sxvhgiz}t}xytnn|v}{ux~nih~{}}xwq~}wiXhf^|~u|}wv~zqfpqmb\`fdZTdmugtvty}~sxvfdgyu{}vvqkp}y{{yz~pjh}}x|yyq|}vkYgjaz~rx{tty|shnsnd\`fh^Tajrhmzuy}xxykcfsuwytoodyu|||ytlhvvy~zqw~tp[cnevqt{trvvkjsoh^afkdV^hnjgwx{|w}pcdnwuw|rjlbs|}~zugmz~{|qan}svv|xrvy{qg]aolwwp{~{ocswc^n|icfy}v|vrmitxtlpx{fdgdkxogxruojl|~|phft{vrp~|khvf`^\mymupmgluzwwxmhYUhxrvhu{ur|~tc\h{oa]ejrvvgj^mnl{|n}tjivppkr|qeidbn{uv}qisyzijiea_]Zpsd{iXymxlpto`tzqplfxyykzpceqy|wnt|xpht}iflvzxhpbcV`rzyxwz}tzimxmrmelz|tl}is{eytl_Z^n|tme^euuxr~vrxts|~~|pjym}|plusep{~nlofkvvyx{gXV`fizqkfacjqgj{{u}op]b|jinzwjpj_bzq{tvwsxx{ysx{zptqf`^gwqh^X_nmn~ruoltvwwre\wkunaxpo}mdbh~ypbr|qqsloywsv}ja_lpvyytu~{|~{fmnlp{qe|fdW`qw|zyysyv|pv~pxtfly}ukyyj~wgumlb_\f}{zpgbhvsrz~quxqz~tizr{{olnvfnx}likedoskxse^fknzyopjgovrk|{fsx_^}lflwxh~sje^|s{{|{uysx|zy|~vuz}s{vrkeaasvtna]^lolxwzs~poy{xp`oumzewprwqzgdbotmbxxnokimzrp{ngfqr}~z|u{}z|uar{hinz|vggu`dUkqs|~|{wwoqwuinuzqo{vq~wjumoge_hxwzphfjvvx{tqt{ouviz}wz}mkhz{vhfurzmfda`hxlsrhjoqz}srrkrw{r|hv||jYqtcio}|winwej]zvx{xxvv|ysv}}tw|{~qzsskg`gr{xnqfa_equ{xuvy{lq|xnaupqtn~qzttvfdbtwwiewpzskgfgntvsmmrt~|z}u{~z}v`qvcfjtuncbo^aYmzx||zwqrrwnlmuss}{y}zlsqrnjcfqy}stoiiiu}v~h}zusu|ur~wgyquuoucouurYT_elpzyu{xrkvjmjg}zts{vbrxomorcqtmi`x_[ru}zx|xthwn}nonkorlf]lnZZaqhp{u~x}psjyxphxxen{}oykmxwruutl{xrkgfclkrxt}zrrrwzvlyvvzhrmmkp^aqnc^ck[et{}y{{}fv}nrtluy}tuzzvxiqqgmfueccohn{zt||zwk~ws|em}xtsttjtudcrtr``^Xkhri~zw|ymoxomutnytz{rwuzkndimqpbltd]q{{}qz}y}stqzv|}{nesxgdgtyhgW][iryxnqp~xzxknv~~voxm{q}x`iwrisqbis}zop}xuwt|zxvoxvs||rppp`_i`n`nhUYjztv~uttmqs|spz~{yiltqk^n}pkih]ltr{p{zozz}vw~nl|~|||rut{n`nltckjaWVnyohty~{|wunn}~~qu{||yquyymerukrqyhahkym~{t|w{tzu}x|gjoeocsqjllgZWlrkqr~|qw}}xpr||t{||wnxsfly}msrdlfyukmyr}{nl}|xmh~zz}zoznxjemigalrdWZgqhsz~|}wyhhzpuxhqwqox}p{luf`prrjs}~|s}w~trwrr~~z||xruulnrlbk~obamveof~|wkwy}{wxyzqsslbqomlrxmjnkgr~uv}~vu{xu{||jksmbXjwpfff\N]ghjj|z~vpv||zz~zzyexnvll{ugUczxjgntww}{~}oovyxw|xvpryvlcjheipqXf_adaw{{v}x{tz}r|uvmmznrpopxxm^dmntwnz|{to~|yt~z{qmzx|rtxneflmijlbnc`ffgn{|pz{{}wypqqklizbior{~t{~yq{t|{v|d}te[auk`^i`PYnji\yrv{~mw~{qwnwqxrvxcZhht}tgqvpysffksj|p{hy~zvwwqfq~{tnnuuxhjvqiijqtyx~xstwkj~}ustxttqlv}q}{j||}{y}YeY]oi`}y~}pzzu|}wn||q{zwz{~mgk[|dbpgV[iehfSn`nhwodlyszt~ojlevxnpvhh`klhw|{vnprndptw~f~{}ptpZWl~~rmvrxltxzrkhyyxy|{z|u~zw{znf^cuxtwbbupqefkxxexyy~qosv^bte`conjfi|wjkuqzx~|{qpoqffl|zdul{{}{uxw{pjW{|{|{ntsud|phky~lt~tpvwnrz{z|xrwtj]w|~~sl}xooj|vgbYi`n}raq{njs}yocqsn}v}p\Zs{}zkhhxtt~xlsqwwmmwzuttypalvom{uq|~pnx~|myut}vzz{{v{vx|~~yz|}vwdanvz|y}fljt}wiq{l\_clnfoxm`pgkdYc{ugdge]j}qx}}ykc{nv~~|}nujusr|ieq}rsktfzvwyirpslbmz{|ygvv{wphaY`Pb{x{~|tm|ypgcxsnnqtqe_x}uv|qojczlowzxojzyxqrkkw}zssr|t|wwwvuvkuyddknvw}zllu|{q{q{wzvwk|u|z{{l~xnilne\hwzz{|znrlcbn~xiikpx}pbbm|{osmg]dhmbl~vs~~ymc{~zosxsm|~qu~tu]opds{x}q~qjk|}y}zz~psylnw}touvtk\fcgywzs{mgu{hasvrh^k~pgkge^gvpsejumlkz}pnyp|q{xzw|w{xy|xznbnkkk}{{{zkax|nfjihvsx~}wwvqx||t`sQcjm_RWy|}m\d}setotoYosrtx|y_\etzokct|xopxxy{rptx|h|ipekp{{irnmeassztiw}lyn||z~syvfxqt}}~|}{ttkaclgghmecpnyypb}}}via}|r^~vkhhonm}adrhkgeadtwsnx~uwwx}k|kltqfpk_Zhu}xmwlr{z}ooq}s|z~nctyvq{r|rhae[srcab_`kvx{w~tsu{myywvr`d{}je}}wqrv{{cSmndnxq~z}vt{qu|oukfhhl~`fujj]dv}smq{z|zkns~yqqtwoq|{~w|ixgZV`mzuaZ__\avx~wt~tjw~zsfuz^w|tolqr}kaeusc_isy|vpy~qnzvtp}l`jpp{wecglqu|skxwsx|ztr}h~u~ml~qzsvwt~qoab`e{p^ekgeky~vl{ot{zob~~rcmkhonvvj`q}raYan~{{}{z}w{kbbjjuyuecujhnwxyk{qmtw~mx|gxyzspllz|{~}xy|vjfgiblqm^bgfbf|{uslxssythuscsr~s[^~vhafgx~|yyy|}}u||xuvrl_dfprmenujghsu~of}sqd|p}w{ohsqpu~}rwutieihaliofdlijiosrsuzuetvyq~tmwyd\qyj_dbonvwz~w~rwqvysuqrnv}{kdilrlv}|yo|ns~xjot}y}pen~rmps{hr{snefdfikg\efekkvywx{txld|~~}twlmunc]|ugbhhw}{|}z}}ttyw~xppmjswyifllqpy}s}rwjt~uisvwttnthrs|}hpwpmcefhll_Vacfit|xqtw}~uuupwtqn`^xj_Z]iy|kwrpusws|rc`cgt~lnks~{~}}qfxypvvmis}yxopuwvrzvsv}|~}~ttwk|cijlrsi[X`[V^\gddvxjpsoz|qll[]t{nhelmy~xzqn|ywqdz|pebgmwwebdfv{}ourltqr}knt~wvrurv|{yv|yxv|x~u~ppnili_UYkmjrq{}xws}wvr~{no{zzyzwr{b_lynkzsz{qqt{xsj|}h\_qy}s\XY\hn}zwln~{nztacpukghry~}o|wo|yqha^mqiY[ifeklxzwqmwwhmxqqmx|qqzjjs|}z|y}|qqo{~qnochsgpqddnnqf[bemps~|mnuv~qqyrvylqyztuy~~|uystsxu}oyx~|pq{rojfja[Wjursv|~v}vxw{qs}ysy|xybgttz}~ytupzwol}xxi[[t~p[VY]cev~woq~~muzr`fmplhir|}kzll|{oa\Zmsn^\baelsywtk{qvmvwpon|n{tjjx{z{|~|z~h|xwopfcqhgsxnbkpsncbhnqq|zy}mqt|ultyzj~sqrrrtz}y~wuuvrsw}sptuz{ll}wqllfkd_\grrru{~zw{~z|z~u}|ehtzuv{}n}}ry|xjizwzn^Zpu^UV]_^nywt~kwovghljkjipjxxsju|ucYVgvsh\]]dkuxsqfnx{tvxtqm{xqngq{wx{{~}rnu|rtlbpmfkx}tlepstiffnspw~n{xzoqxsgv{sjssmlruwv}vqsvmuums|rnwvfpxpniiflc``joqqszyzxuzr||hlwtry~l|~vw|wffxs}xukX[eghhmipzop}uyz|u{z}vnl^giW_kuwhtqbjww|yyjmpgp}z|tlq{uuyocW`ku{iqr}qg^\imxcSbimxtwf`}xipyv{t}lsmgzvpcZV^k|~ocegx{}rrn}uhjokq|eq{yyzj`bgZ[lvy{{pjulils~wuqkzv}nwy{}mbcisvrbqyrnfd|t}~{||{j]]\`huwl|zoenmmyqrpwmfrz}|saky|pvkjpkioiiUVswpov|i|p|y`f{wzv}xu{|{~~xddprww}zpzoZWbiuslbPhyupuzw}huxhpxxz}ywwxventh|rk\W_pyxghkzxoujozu~rj{|krwmhr~{zkgvewytyeY]gwtrnptlm^py|{|k`giz~|wbtxtljp|xyv}z{l`bdku}u{onst{rtyeo{|z{|~{bYisxlqmfdhjpqh^Rk}~w{nqvi`w|}||yxx~~|{h^kqw~yoqvweX]kzseVk~wy{}|dixfr|}y{yvwtscpmewwg`^l}}sffjxz}siqxgw~{|ll~n{zou|{irqdw~j_bcrzpnkulmgauxwttyhgjo}}{pjfuunhjx}sz}v{rqklgnyzytuw}yuzrk|vtwkZdox}qqlqibchpxn\Rh{~xywqytcw~x{{vz|}||~peovzxtjwx}n^]gw{f\q}|yfd}~kuxttrsppbqg^}xwodivxnik~t~}xwlm{tiz~olswupy|{|mwqbzsiidjxwrlv}olpcuzwqimsqwwyvjrevwpignxp}w{z}~g{runlt|}|~}y}~ws|~ro{xfbov~ynyisqhcfhw{fT_v}}x~q|wzrlvru|vy~v~yt{w}oejtxwr~uy{yuhtwhoqt~rjwrwuceqjuo\iyy~~~z}yn^wsrmqxkuswovtry}ryinXU]`ijozwz~|x|_xylis}xxv~zia~{xqklxiw}wwnu|ytzyv}zqgq}lqmchy}sjWXUr{|vnpzswqzvfuj[lpbs~wmnow|rxywakpuqt~tot{}}wwzu~}|rlbfb`t|{k`bj[Xlx{s[amaqez}umgoxq|oszu|x{|rmo_eqkxzz|yzvu~zsupnx~mgZgq~~qu}n}gulW[kqsk`nzvmlgjtq{tuyxon|ns|~ssxxogho~{yuzzwxt~vy|jafi\c|{~kvsrwsfs{rmnemmjwlpbhpz~osyvz}sy}jfktzxhjrolw}}vtvy|z|x}||zpptrg`|yupvxrddz}{|v{fcb`pgz~ynb`nyut{p\iot}|~stnyrq{owo|y}{p}wux{tl|vrlymvdgshpssrv|ovejirpdj|spuzvjjysqifltys|zvtukywwnfiukwo}|~|zt|rw||sllkdXWqttriqoecnzzlXaadshxqjt|ny{mgkn{rswvwolvggq{vyy{~ww|v}y|~yh[ZV_]aymzzx{nt|ln_mxpkefd^\u}jvl}|zxx|khlctmvyvyz|w~v~rky|uz|ryblhaov{sxpmil{}rownec_bc_mwvqgasx}~xpn|rnijhaaww~p|}|xz}owpsz|vk^\rrf^i|x~}rfh|{zhhcaufmvxwmls|}vozwvryrskc_dkzs||}so|||{zw|z~ukmtsjZZZ]}|xyw|mhqyjbqqi[Sdyxoluxvpx{|oxwn|kr^ktj~z{yvwyoloaR[[acjzzsmzqfbwgt~~fiwou}|~rinrxu{{}xu}{y|yo{}jn}zyvziwiafekkpyvpvriVk|~vxwtiuqr}~zinmr{ywnsnuvyiko{xmfimelsbqi}x}yx}~xqx|{xqihzoiWJ\ql]bZUsqe`}v{{ks}oqzwux{jouhibn}yktzbr}qhrtw~rtx~jcjqt{wj{sbm{edfbUstu{}{u~gijgpxynsyppku{~kvyw}}yyxhTd}w}sstz~zx|o^pp`^onxx_twa`lsm]hsm||yvfhp}s{u|hkyx}qsznqyykqqWgzxqt|ps|zvpsxp|}xslxk^vvnhyp]cc`ioqz~qtdohcacsv~{}zitqz|la~}r{{vywkkx|xt{x|{|xy}qwtt}y~tZ\|z}|zqshbgrpnnh|x|ohlxslrqvwzqvnj|in{mm}zruf~xccs}}~zvzyl{z~}nzw~qsj`]urqbkkcc]hpshouuwv`ouieq}ujpqlfzvv}z}onmyhox|~zyko{zzxyyiz~}qlmhckluulnvompppyjizpjo~vabzk\gvq}}tjjrt{||z{ttjen{}{x~~tl{y~wqvoyyxja_\y}|~odzskdpm_^ojj\eqmet{u|xm~|u~|{|yxjxoljk}h^vt_^gbm~~x|uyyzoyrldly|zlzyje~{fbhak}{tod|shop{t}ukuqprpgmuuqtmz|kndsuihpnsmx{yibYazyxytuluypw}~~oh~vltpyxpwsswvnv}yvj]^rqhZZw{jhmhs|v|xmy{{qnlguvq`\wuv}{ixthttx{~}~u{wob]`\k[inYSYXcyyuw{d~|tptqbejqnmszr|ruoszsejt{bcu~|Uvaczzyuqqx~nywsh`cu|~l[eyrfa_wupyUv^^be^`mxyj~wvprx~zejtuw}p|ys|{g{ijqxqpnxl~yusq~|xswy|qh~yzh]wg`^edmvm`vckodfdsoic]ux{wyuh}u}rww|jiikyoozcn}nt}{x~kqobwx~umrdimeqgbgjiS]slhqpbZvlXVZSrzuwxfz{y{z||xvuen{p}{lnsz|uvt|muztfv|pnstcdoo~~vvv{hYqohdnni]ul`fp[euutyj~|{yo{|upqutovh|z}~w{o}syrwtyjq~~rppid[hltryppnl[rygcv|dd{m\_gZ^{pfxu}|y|jbhmsmxz}wzu~nqtt{wv{qskeqzxhvxzx~nosydqsd_pzq_fwdhqf`|yw~mjur|{{qy{}{louvjx|z|zk|{vx|ywwmwxl_dnskwwuukmqt]q}shvzeev\Weaa|x}op}nm{z{s{silqroxx~y~s~qrut|ovx{tte`jsqj{{~xv}zfzwpepup^il\bj\c{~{yx}zjwzvzu{}zxnemxxt{y~s}zmprxqwqufcekgkx|xqujg|rkcyyiYozg^^[Rhyz{xg{z|{}||{zvsbemtmvy||sy|yxsoipprzork]cntkx~~xtv}dsuofoyiYZvn`bkaax}x{nn{tw}t~|u}thpyzs{{|~p{n}zpttwmy~~|v{kfkpjjox|zx|gdtlid{zk^u{e\aa\oyxxzl}uzzy}}}ziilpksr{xw~k}|ttxrtms}tsi`fkibnq|{xw~}k~wsdqxnal~laccXdwywls}}zy}|xzkemunkor~zvvxp|pstn|{otfcjnhnht~}dlxqtkqa\ssb`n\Yxjr|qe{{t}rtnpm\isygcbr~}~~lwpj}{u}r`\jtnjuv~~~atttfauzZrxlsf`^l|kwuzxxs~oqsniniezjrx~x~x{~}k|uknr|~tqup]fl`hchvz{houi_asiXelcjww|p{~w{h{ptpt]qxb`mut{|wu||~pw|zvsqknepn__rv~ni~hl{scgsekfbem{kw}xy{i{kgnhkf_myxpxvvqquu}pv|x}zzwxxwjiyoZ`insvkuywzl~shem|gpmolory~tirzqixs}~q]Z^kmiw~utv|t|usxsc}vntx|rU\Zdkeu|}z}v}}bksnkelswjbbtt~v~kvs{~ltbfekxvwy~}trxsymillt}{y~tn^ufTWaikmortsmdhw}`^d\x|nvwywwz|q~nmtqteR_wvnw}~yuz}~ot|s}{hgovwk`db[]dq|wv|ucyyjngyqccgstq~vxrv|ngltrpccmqw{ut|rgzqblwwfxunmqvX^[gwzxp|jd`gvufnkaiyvppvwtntqytiwyohVorlpx}wzzu{}s}yxrwvepp^Zb_a\Uiudo~qsy{{ck_{}wp|uyi}x}jcbkonhgstwyxrpxrwxnj|pn~ys~zynemeWXfuz|w||{wwdp}pzdiooiah{|p{u}zxig}ylfgzqjvrzu~vmrry~~s}z~vfuodhgaW^jac\rwvz{yuqyvgckw|}zzqmty}usysym`~qm]Ynsuqg|zshy|ssz~vvtcytjj[TQ]kpqs~~puuhjnqgewplh{t}~w|iqxwsrkgkbbk}~yms|v`q~vwzvv{vs~||{vwwfT^nXTk|szxnyuqjhp|izi~dwtb\wbelQdU_rxyy{yvvypswxgmz|{pxleqxnej^b~mp[c~x|q{}{wUyzquvz{~}p|xqvz}~hdWjswvaP[|~jlxvz~|xs|u}y{srbg^y_oZcbWlwvrxusmkiurukbxs|{r}x{ly}atvs|wmnzqyn{shoxyzmxjz~z}}xp|m{mvbPWcdggdPHd{}}twy|pv{lzy~|vuy~odipkkvnrYodXx{|}{rwy{{zzusoXt}pwqXg{vibgfexukgtg||}oeovk|wvt]qywrz~|~lg~j{eaV]yo^\{}st}rwy|k{v~{v~ksviY^h^gsnprZkdesr|xzrpljtj`t}v{qp{~gav|la_auymdvg{~}xxsr~vdsx{jl~zx\gkg]RPdtn[Twxkqky|yysi||ztzncgfhttjvahjeyuzrufefkzymty~us}~zwfiyxidf^igqxi~srtonyxgxlxurt|wn~xz\ilobXYc}|hat}mmkpw~~uv{}}vrvsiZYacqmZeT_`Yy}~urwljvu\rrmy~}ck~{g`hkpnsosn|nlikyqnuq|{{d`z{p[mg`UROdulYc{opnhtxzsmw}z~|pkb^mxtnayno{|oo~{lfdvjgy}qermw~hWgviSWbbhihkx}{uu~~~jwtsytua|bntib`Yevp]\xxqpsvx}~svm~|~ssusid]WhpmffSekiz~s|}phelmi{vyo~||yuho|e^bgljlg{wozuryxkw{l~}nuzq_u|vagrj[QR_yw`^{wx~|unqmwxxuimxzvqvu}nmzjbh{fam~zwsxymw_awzldknvrlww|vx^vzqUT\iumhvtjn}vuyyqxxtx{{wdkztwztvdcw}{ovmjowlnwxwm}xZbSc|dbcftodsujjww}s}v}vwypep~tu|iiyz{|ypnrkonyscnoywslpt||oxutl`obsskctogr~|uxtny{xxfnipvmrjgjntiq}ocyt{zlda_h]ny|u~|zwyjs|r{}svusi]Rphsz}x|~vtyulnurzskvu}mdhcf^SYnyszxw}}s~~zp{lkq|hjx{{w|{}y|~wkny|yonh]Odwv~opvs|{~hmgrxouluyj_lysnw}md|}u{|v|j^^^mqmvkr~~x}qlpt~{~zroknla\utzos~vzzpjij|osvks\\bbif^c{xwz~vivrzwu{kgfiyo~wx||xqkt|~z}rc^_cde|~zy|mg{zy}~htlqudliklkixykm|t}|}y|~xxbYbgquw{{zxus}mxz|z{j^^ckignzw{vs{sppsnublsw\Ucjneaixuttpo}|}kdvsghs~|y~}{|lejzugv~jUV`jio}ynpstz}fl]lr`hnxzvo{|uru{ys|xst}ynre^\emz}x~tt}~v|zuwprbZXbo}}|qqz{nwytprorl_~tlfP^ellihtnsyyrt}tsim~vmiszpx|tsw}tfi~wfRRYciqzlhzuv~lvekxbgnsv{wxww~~y}vvvz}zqdidejv|xwtn|x|}wr{tu~}vvubXZht||xx~w{xuszyzhZylhcUiuxphe}sknqrot~{zobj{sjcm}~~~vw{vvw|wloikqp[Qcnu~pr|n~tto{|cj|w\kvw}~ts}s}ozzutrsokm]dvy{|~xyxu{ztz}w~~zv]Zemaoxz}o~{vyivwmjqitqnWc}vps|}ttwxpt}{c^h|tdqoqzw~qgv||~~qrZdkr]Vecjzstrxroxghut_typtvs~~}p}ywwxuuyhokn\cqms}}yy~v}ww}vs}zu_^_i]lsq}q|z|ipxmozgtyrZ\{vpq~}uyxsr~}o\eowgpqn{v|xww|qq|yyrsaYgnkXcegt}}rxs~xm|rropdnur{u||vuzwq~pwjhoph[kmpzs~}t|rviyuzia`ba\orwqzfw~wkz|jw|nVh|usy|}}y{zsv{}}}{{}j`dmohtswu|{{p}|n}~}zupnn]Walj^hjq{|rw{o{n~xysi]txv}yyyzxwnprgemrk]jowrwutzdyqsqh_accZju~s{hq}xntrt|u]d}wvy~}xx}zyuy}v|p}wpacgngqzw~{~nw~ov}{zxevsgdUYbmfitywrxnrutz|p]c{{p|~y}lwwkk`emthgtz~uzuwyxxzlkw}mxwii^`dh`dww{wxqm|ypqyszwed~}vxxx~{zy~yxwzk{~pqebemjl}z}{{qq~ns}}y~{ycpqcdXX_ljky~wtxmrvy|u]d||~oyz~|{~}}lythjaclumkwrrv~u|wlr{}yvvhypff_`glcgyxuy}pwxoxyw|sbp}v{uw{{}uz}|uh~tnnedjnhpwx|zo|zvi}~uy}y}ndtdc_Y[glhr~}vxrm|u~j]w{ywz{~w}~wrs|jkebhtrjr|}{zupsk|o|~t~||pqsmg`olahipnfrv{}sitklttxuv}zsy}tugqxgb|iZe\lw}z{{}ulg~xt~nxjtnu{hskSmm]isqrz}p~vktxdcypu|~p{zrvstnohfttpkqzzz||yuvsxq|z~j~xxwoicqpeihllZlnmyyq|qmrovtp}}v~rptzka}s^f[_rhr|{{ukv|u~|tpxpptsywtYhvbeieasvww~sr{qax{epqur}u|r{uurhnslhftprp~rwzywuos~~u{shjumilgo`\ndbs|qyzswsptor{zv|{}r}sy|fjlbe\jnan}}x~|yr~{qwyv||svmxst}~u^nwgli`[mko{|vxt}of{ejgswwv{twvkpslgbqnolvu{yvwypn~{|}uyrovnglinb[lf_eodx}{yyrvojxxzu|~sur{mjvbd]iqgfxy}s{~}u|utwv}r}wzyqvzr{{fg|rlod[cldqrz|vy{iuqjii|{y{x|{{txpktnndhrknm||}yys{ks}xz}|v|zsu{ngjgk]ald\ehb}~{wynmwsxtxtrwiqtfc^npffyxzxn~x~stxwyn~{|yzxq~yr~|xcfzuspd[dkcmlw{vwvk~qlhq}w|zzz~zxylkrlpenpkmm}}y~|xx{{|lzzxz|~wyzzs{ykkjhe[ih`Yb_g{|~xlrrsvsx~rtpkmiamtjbmyvwko}~}yrwuxnv|uy~wzs{ux}{lcuytuka_kbfgluqx}vyn|xoko}vy{y||y}rkqkphmslokwwpz}{y~nx|vr{~{yz}w}|nmnlh]jh`V\Ya{zswz~pnptvwx}}x`rsqt{tfatsewyk]R^dgr~|nuzy~w~hthZt~w}{~pgz{|Xcgo~}xp|whsxhuwlf]ksppg_~vlflndpdawuqq||t~twv}}lwzvninYXjtzz~{y{tl{{xix}ut}mexrdfs}eokowkfhz~|w~tlljs~}spvzqp{soqpmkjibTRnd\j]x{fr}sxxzfkvxzkg]k^^xg|ytz~y}|~|jdukzi~kx~nsieurrn|k_eaegUOoh`xkx|yq~sz}}~|srle|~mqkmq\KfbTm\e|`xqqxynooqrbjtnsfga`]Rpdprw|s{y{|ipyyu|uvd}zkomnxjQhq^vrlvw}hn}rq}~|{q}h}xxt{uW^q\gnZ}qpssutvv}sgwvzujlanZguh{t~wtz}w~{hinr~gt}z}wyyktghsx{xudkgot\Spebzf{w}rtz{zyumjvbtusrymQakUgdZ|gtn{n~kkoovh]lkria`YjTioh~vvu~ovt}oyxyk|mu|~|nspx{b[vhhzf~uw~{{qz|n|otvzx~{uytpnl~|zxw[gu`llarswstrvv|tcqrxqeg]qak|m{zr|w}{ljqq|ir}|symmdqqj{uz{{hmjnufXrpfxjyx}y|tx~~|nzyshif}kzuurws[bsahh^}qjuz~m}qmporn\gioj\_Wlai}m~|t~}us|{qxw|pqhy{u}rurtwh_xskxk}t{wvspyqqyt|w}~~wlxxpkkqt|{}vbrzjtjlqvztxvxwzqcoovkabaubx}txv~z{|{}jvsyto{vy~~luw|sefc{k|~y~sqpoqq_g{nrsmy|xzt~~~xz~lotvuefbxuw{zwvvfdynkm`z{eu~ouxqqqps`bilm[\Ylhdovxu~twvt|}~lkgzztyyvvvkf}wrvkryvsqm}~s|u}rs||~{}{~pktvzigev}t~sk{swi}m{yy{wyw{lfprveb]mocr~w~{~|}}toyznp{}}}rltuwfb_qqi{wwttsjf|xsuks}yvsxyx~|}z}njqstca_rpl~|xnkwrpf}~g|v|pt}vqsqtfcjmo^[Xjg`}l{xxwvwysz|~mhevvm}{xql}wvlq~|u}~rmkzzn~}xss~yw~xzx{phpqvgbaqwj{u}{pr{zwy{y|thprvha_kp`~swz}}{wq||qty|w{|{|wipqvj`^hta~||~z{uriywxnyxxzsrws}|yv|xzwxgilpk]]bvew|{sz}zpqzkwxny}wrvsvffjnl\[]pah}m|y~}zw{upuwxhdexro~zts|xpr~|}}sz{rjjx{l}xuuv~{wq}ttutsdjlqi__jzizw~}t~|t}y}z|lmpsoa`fwdsr~~}zu}wwq||s{}v{wzmhlnn_\`tjny|vss}xrt~x~wppt{{x}xr~utusscfhmf[\gyh}wtw{nwwnx~wqvrvheill][_sgls~|~|xz{{|~vkppthbfxzq{xv}txw~{w~qtuzrhiun}yu}xnurjv|zrnsnrdcgkj^`kq}u~}t|w}x|pjnpqcaeynqxzx{zwrz{yqs|rvsunchimb]`tumxwv}vyz|zuyz~vmp~uyzswrkx|zpoqnpabdid[^m|m|v{pwtmx}urwrvhfhlj^^gxgyx~}}v~{s||v|v{nilopddlt|zz|t~|tzy|wosuwjgluw{z}xvnstphkvvriploh_dfka_f|xxz~}vww~z|wjnnrgbfxsn|{|~}ytu{unnz{ynuqrobefja\autm{{}}zyy~xx}twx|slouzvs{smjvxvjonmm^acha[`rwm{xvxrp|~|rxvuugijof_assh|~~{yztr~t{xxwhjkpgbfyxp{xwzttx}}|oqqvlfj{wn||~zvpn}ungfrtrgolmk^ach`\bvto~~wwx}}|npptjdhytk{}~~{vs|tnmxzxnurqqcefja\`rqg~{zw|vu{tuvzrlo~qzwq|rkgrutjoolo``af`Z_psf~wztp{uz{w{lklpjbesue~x~vzuoy~~uwzuzlijnjber{j|u{vpyzzytopsrhhr~j|x~|}t}xkr|piahoqjhphof^ade]_iyjx~vz{||pqrtjho~ory|~utzrjkuwulvprqcdeh`^duni|~|v{us~z~tttxrlp~oyynz|pidlqqhkphpc_adc\`mxf~|y~wov}yww~vlmoofgp}kux~yyvnpy{xq{twuhijmfem}sr|vyrpz~~u~|zpoosmhmzziy|~|}{s~~tisxle_flmfhnfod^aee_dq}l}uyz|}qrstllstt}}|vq|qigpssjspnsdcdhcahwvj~v|upx~x}zxrsusnr~p~vxmq|pg`elnggpfnh^`ce`dp~n{}|yqs{~zux|{nnoqkkrtr~ztulktwvnxtrwjhjmihp|q~uyqmvz{s}yuyyy{rrxoyupowzzpfmvld^fnqms|w|wz}~z|ku}}~{tztr}rsvvopw~hrnv~{|tgbi{wqkpz}~~}}vywvy~wyz}||~sivpornoxvr|zyzzxuu~{oiwujcdnttr~xkc~tfnklwtx|wt{|yt}{|vtyyn~v}wt|{oyzoggqwyv}}|o}t{qplfau{ogiriXtnanwwqrttjppisljlv|{wyujtwlcajprnz|yzwz}zw{zdzsh|{}y|~w|qllv}vjcillgsroynlmpmlr|qazqestzxs~z{xzoimnlgw~~y|yk}r~x~y|{}||tr{~}y|q`wjas~}|~wx~wp|tkiorplyz~yw|zmu{~wxtt|}|{plswxu|~~}rt|ogiif`nu|ye|wfnuwqpqqgmnfqmkmuxsmqxmuzne`hnqmy{w{vxzxv{zdzwdo~~y}}w~xqotywv}wmorrlsxoytlmonlqzxarzdiu{y~r{}z~{xz}rikmmglxuoytv{yw}|}}{su|z{ffydaqv}|tp}|qiioqnn{v{|ur}vyzw~wuw~~zxspvyyw}~~rt~|yldffd`mtwjjnvysqqphloeookmsxtno~{qs{rhbgmpnw~vwwxwuy}dp|fjxxz~{vsxpnpyzxyvruwtr~vv}sppqnpw|kb{pcnyw~zs||}~}t|vkehiiftz{mrww{t}{}zsw|}}|yuv{x^ewdevy}vq}{qhglnmo~z}~wru~vxqztru}vqvz{you|xwtg]^`bao}}mzoltyvsrqiiqdjojlqyxsr}tp{wlegmqpvxzxwwtw||dg}mjz||pcaeghjzy~{xy}us~v}wqzwvz~xids|xwow}zsxruww}wnpxpe`dilm{|Xumdilortoszov{y|}reeqxywvuty|fsstywwyywyqsy|{lz~zwxzs]Ve}|stieefgluxeftlwytnvw{|wox{qigmqrw~ywuehxuspktpkwvw{y~sgdnyzsemr~uimsja]bfijz{z~|xwz}ng{~}ys|zr}~}{{|oa^hv~{yxywirwt~}x}{smnpf]|tjmk_higjquqlp{xtjlrh]W^gpuy~vuuuw~xhsvz}xjsw}{||snsvxzszwyl^X`m{zvuxzk[suadnvwyyvotqenpr{~ypt|ulhmprs}~ywxxh^~yqxulwxx{{|{ojnu}yz|tfnpu}}vkegjjkxws|{{yy}~ma~v{}ys{zq|~~{{tf_cku}~yjrs|w~y|yuuteVs{tvtfmomnsupjlwuskltmaZ]bhn|{xwvyxh~sqz{~}mrvv~wqswyzq~x|tf[\clwybo~jciqtuuuoqvikqpt}}upzypijoqrzz~|yz{t^g{zyw}qq{y{|zzxomqv||~|{v{ngoou{pkmonr}vv|{{z|}hd~sy}xt}xq}~}xz}sgadks~xlss{~w~xz}~{vtutgVny~{||mpussvyunmvurmiqod\]agm{}{yxy~juypu~yx}omuv{}uswyzvy~stuk_\ajtpf}{hgmttutqltpemqrx|ss{wojmprty}zxvyyl]t}}x{~qu|{}}}}yvnntzx~x{{spuhdnsz}rnopptzw|zyxz~|jewz}xt}zq{~~trxqgbgoyzz}or{~w{|~~zvvxzzurqrw|vfxztr~w{~{}wqwzrkjotyzupjrigwhipsromihqjfsx}uswhju|z{|wriholecir{xys~nhnuwutqmtujqy|ymgotvtssss}w|{|~s~lhry~xrrzzwtoxztnqw~|~yqquwtqnikrhjw}{ms|~x{vv{wvuv{zhoxz}xsllxvy{|}}rmqxrstspmjirlfrx|}vmpz{yx{{z|}w~xutty~~omypmy}~yz}xtlmtqjglqw|y{{z~{ypfgu~~ywvy}|md~xuz~}ytnjsvq~~wx|wslkrqkimt{}yyvvyxurolsshpx{|sqz}|}vxohdmvvyqmsrjfhmrx~zvuzrynpttrpmjprgoy|}sow|}}{yy|rf}|v{~zupx{u~z{}uqpw|wrntsgmuwz~xokstrrw{{|v~{wvvy~~pg}y{tovxs~zrpwunjlpu{~}{}~z}ujfnqt{|{|}mcztotz{ytokqqjuyz}xtnlsrlhkpu||z~~~zvspvwkqy{~xsy{xyt{|yskeknixwqvvnhilot{}ywy~xn~qpttrpmjqshmvy}wpuxvx}vgw}sv}|xsx{rx~{z|~{uqs{{ytvznluwy|||ztlorompvz||zzxwy~xgnuv||wqqxqrsifdbjuop}xyxow~z{|t|vw}y||}~nkyu{|xw{ry{wy}~|utzxrnpsw~ocjdjopponvwlr{~{~{vz}p|~uhfpw}ysx|wrqsux}{pwvtz{olzwidfinwyw}|}{jingjpx~}|ypy~|zwts{|}~soyz~{xv}{nrwvv{~~iXl|qhbei`bpvz{z}zuphijeacltz~sy}y}zslkqnp|xqr{z{z|yqypry|{{{z|t~vtsmlmq|zywxtzz|vt~rffjnpswyvu}|xx|zxuoonmtwsnnvzqupz}|rqqptysnwxytsxriry{~ujfemwzurw|sz}{yy{rm|styzxupknlhx}|vr}idgjkklnw|tx~||uoidmzyy~|{{zlyuqstpkfchpnw~wqqvusrnszyvvxz}}|}pmt|y{ywxzzp]^trdclv{zvqqvpmy|wuyzwupqvvqmnpt~zrmmuz||qpssrpoqyuls|{y}vngfotu~zqjb]chimsx|w{~ytpotz{qlwjhkkigegrupw|xyyrld`gou|z}~w|{~|||vtyunoqstuv|zmntuuvvroqsolfaejklprrt{zrzshz}pnqrojecimhr~y}|}xodZ]bgo}}zz{vh]n}qdbegeb^\ab[du}xxzvtpmrvustvy~{~}wrpt}~~|yxyy|~z}vonlhdbdmrnz|woimnjffghlurhmuvuuuwyvkg}{mjmonmmowxnr{~}{~|voqstw}t{{y{z{}|wvyyss}{vqljnl`_gknrvusuvqmhadggglsx~z|un}xyzwsolprioy|{~~}{xwx{tkbbefir~}|~~pbmvgacffdbbgjaanx}zz|{zzx|}|}~~{uzzx{ywx}~trqojd_`d]Zgw~tpsrmjklnu|upx|zwutuuodjyxzzxvux{szzrlnppuxuvtvvtpnntslvxy|wqljlqsnp{vrqvuiiqtuvvsqrtpnkfjpqrv|szsstsqootxpp~{{~|xvvwy}|~}|~v||yxzxrmd`dgjpzwfezrijnpoljlrnfnz|y}|z{}}~~vw}yuqqwwmoyz{~~~~sxolkhc_]afacs}vuyzxwwxz|w~}{|zpwxuvvutu{x~~xtlhlprv}~x{wxywursyyqu~|||~utyxtporxzus}|vqw||}}|z{}zvsmlqstw|qwzommkgb`ciedr}}}}w|~}{z}ux}xuurlha^emt|tm~qlmmkigiqsms{wy|zwvwwz~rrxxwvx~|yy~urz~~|}}{ytv|}owsiggfdbcjqnp}{xwxz|yzpyusssqoosxqiovxy|||~~yvpnty|{mpusuusqptzwrz|~||~wz}zwvw|z~|}}sv~}|}|wtnjmrstx{~y|wsxqqpmighopkq|x{~||}}{x||}|{|{{|yywrnjeiqv|xo~rkkkifdekldfqx|~}~~~~~yy~~{xvx{yrp~{yzusz~|xsuy{}}svmkjgdabimhl||yyy|utz{yvuvywpl|{|zxwx~ury}}}|zwwvrmicekot{xo}yrrsrppry|uvwu{{ywwz}|uuuqvyxxwutvxvtrnpuwx{rjxpihihfeflmehu}}|||~zw~yv|~|z{zuqlfglnqxtl{xrrsrpnpuukjt|}ytuxwvvwz~yx~|ywxyulj~}{|xv}}xx|}}}sxnkjgc`afha`lx~~~xmfu|tstsqqsz|touz{{{zxyyurnhgkmnsyu~wvwwutuz}uqx~}|~xrwywsqpqohbp}~~|wtnkmnnosx~zlo{ojjigddglhbiu~~tw}|~~ssyzyxvtrrpkhc_chlqyytvnmmkhhkqoghry}{wwzzxxyz~vw}~|{||xom}x~~yx|}}tiqrhefedcejnifp|z~~{qgoyvvvussx|wnqwzz{{{{|zvsnjmprv{wv|wvvusru{xoqz}xy{{zz{}ww}~|zxyyumm}y~}~~zwsnmprruy~xnw{plljhfglqkgp{~xns{{|{z{vv{}}|zxvvtolhdfkoszzsxpnnljilqqihqy~{z}}|{||yv|}{{|zrn~~vy~~~|yvrpswy|{nqxkdca^\]cigdlzz}xorzyywvvy|rqwz{zzxwxwspmilrvzuo~xpooonosz|uu~}{||ywwwy~{pmswwvvwzxqoy|~}zwsqtwy{wlrznjihfeflqmiq|}~~u|}|{xvvz}wmnsuuttrqrokiechnrxyyztrqommqwtmoy}yz||{{|}~tv|}|zyzztmp~}}{z~zvwz|~|niv|mda`^]]aikfht{qn{yyxvvy~~tptxxxwvuutpmjfgkpsy}wwtsqoorwxqnv~zxzywwvwz~zomswwuuvwtmm}}zwrqtvx{~qittiedbaadjnihr}~~to}~{{ywvw||slpttssqpppmjheejosyywsrpnnpvwplrz~~ywxyxwxy}vt{}}}ypny||yusvxy||ohsqgdca__cikednxxnjzywwvttw||snsxzz{{{{{xurmmpruy~|uwsrqoorwwokry~{y{{yyyz}~spvyzxvvuqigx|xsqrttvz~woy}rmljgginpjelu|~{qjv}zzzxxz~woquvvutssspmjfdgjmqw{{usqnmosvpiltz~}w{|{yumfo{{}zvrsvwx|wkl|{meca_]_digacmv}xnp~}}|{{vswz{zzyyywtrnjjmprw|zvvrqpnosxwolry}{yzzxxxx{{qouyyxvutofduxw~xrprqosw}~wpx{utsppquwphjquy}{x|zpt|vtsqqrw{xqqw{|~~zwrnmnoprv{vz~xuuwwwx|}vsx~|uliv|{|}}~~~{uw}|}~}ywyz{|~{tz{vtsqqswyuprywrx}vqsy}}}|{xqkn}}xwxwwy|~xvz}}zwtsuwy|}~urqpopswwroty}{usty{~}xvtqnkhfhjmorv{|xqtytrqppruxwrty~}ywy}}}xsu~~~~}{upmjijllheinqtvxz|}|{yvvxyz{|}}{|wt|{ywtsuy}||}{yvtvxz|~yvtuz}{|{ywuspkgkv}{vsrrrrtwywssvyz{{|}~}{zxvwy{}zwtsrruwvssw{~zvrppsy|~|wsplklnoqsvz}}zz~~zusz|wutsstuxxutw{}~{ywy}~~~|yuv~~~}|}{wspnnonkiknqsuwy{||zywwxzz{|}~|{}~}zvu|~zxvutux{{|~|zxwy{}~{wusty}{xvtqlkpx|yvttttuvxyvtuwxyyzz||{zywwxz{|~~~~~~~|zyyz{|zxz}{xusqrtwx{|xtrrrrstuxz{yy{}~~~}{xutx~|xvuuuuvxxvtvxz{|}~}zxvwz~}zz~}|{zyz{}~}zxvvtqnopqrsuwxzzyxwwxyzz{{|~}{z{}}}}|{xuuy}{zyxwxy{{|}{|}~~{xussvz}zwtpnqvywuttttuvwxvuuvwxxxyz{zyxwwxyz{|~~~}}}}{zz|~|ywusrsuvw{~{wvuuuuuvxyxwxz{||{zyvtuy}|zxwvvwwyzyxxz{}~~|zyz||z{~|{zyxwxyz|~|zywtrrrsstuvxxxxwvvwxyzz{|}}||}~~|zy|~}{zyyyyz{|~}}~~~}|{yvtrrtx|}{xtrrvxxwuuuuvwxyyxxyzz{{|}~~}|{{{|}}~~~~~~}}}~~~~~}|{|}~~~zwusrqrsuwz~|zxxxwwxxzzzz{|}}~}}{zyz}~|{zzzzz{{zyz{||}}}~~}|zyyz}~}|}~}|ywvvvvwxz}~}|zxwwwxxyyz||||{zz{|||}}~~~}}}~~~~~}|zz{~}{zyxwxy{|}~~~~}||{zyxwvutsrsvz~|zxxz|}|zzyyyzz{{zyzz{{{||}}}|{{{{|}}}~~~~|{{{{{|}~~~}~~|{{||zwusqqqruwz~~}}|||||}}|||}}}}}|{zyz}~~|{zzzzzz{zzzz{{{{{{{zyyxy{~~}~~~~}|{{zxvuuuvwy{~~|{{{{{{{|}}}|{{{{||||}}}}||}}}}}|{zyz{}}|zyxxwxyz|}~}||{{zyxwwvuuuvx{~|{|}~}|{{zz{{{{zzzz{{{{||||{{zz{{||||}}|{{zzzz{|}~~~~~~|{{||zxvutstuwy{~~~~~~~}}}}}}}}|{zz{|}}|{zzzzz{{zzzz{{{zzzzyyxxyz}~~~}||{zxwvvvvwxz|~}}||||}}}||{{{|||||}}}|||}}}}||{zzz||{zyxwwwwxyz|~}}|{zyxxwvutttuwz~~~~~}|{{{{{||{{{{{{{||||||{{z{{{{{{{{{zyyyyyyzz{|~~}{{{{zxvutssstvxz}~~~~~~~~}|{{|}}}|{{zzzzzzzzyzzzzzzzyyxwwwxz|~~}||{zyxvvuuuuvwx{}~~~~}}|||}}}}}}}||||||||{{zyzz{{zyxwwwwwwxy{}~}|{zyxwwvuutssstwy|~}}}}}|||{{{{{{|||||{{zzz{{{{zzzzyyxxxxxyz{|~~|{zyyywvutsrrssuwy|~~~~~}||{||}}|{{{{zzzzzzzzyyyyyyyyxxxxy{}~}||{zyxxwvuttsttuvxz|~~}}}}}}}}}}}||||||||{{zzzz{{zzyxxxxxyz{}~~}|{zyyxwvuuttsssstvx{~~~}}~}}}|||||||||||||{{{{{{{{{{{zzyyzzz{|~~}|{zyxwwvvtsrrrrstvx{}~~~}}}}~~}}||||||||{{{{{zzzzzyyyyz{|~~}|{zzyxwvuutssrsstuwy{~~~~~~~~~~~~~~~~}}}}|{{{{{{zyyxxxyz{|~~}}|{{zyxwvuutssrrrrssuwy|~~~~~~~~~~}}||||||{{{zzyyyyyz{|}~~}}|{{zywvvuutsrrqqrstuwz|~~~}}}}|||{{{{zzzyyyyyyyz{}~~}}|{zyyxwwvuttsrrrrssuvxz}~~~~~}}||{{{{zzyyxxxxxyz{}~~}||{zzyxwvuutssrrrrrrsuwy|~~~}}|||||{{zzzyyxxxyyz{|}~~}}||{zzyxwvuuttsrrrrrstvxz|~~}}}}||{{{zzzyyyyxxxxyz{|~~~}}}|{{zyxxwwvuutsssrssstvwy{}~~~~}}||{{{{zzyyxxxxxxyz{|~~~~}||{{zzyxxwvvuttssssssstvxz||~}~{~zvsmssqxy~~{|ywtoutwz{}y{|~~zxspww~ysqmoiihhkpy}qbeqcp|{|~shmy{{|{qnqs~}}zrttojbdflpv||{u{~qfcehhmnonoop}}rhfw}}}|z}ynnn{~ztrz|}|}xqovwyyyxq|}pep{zwxvtsw}}zz|{}~~}xr~~{{woqomsvwkbhv~|pk{xxyxo{x|wnx{kp|rqvwrks}|~xrugtuy|xrhm}{u{wov}}xms|tus\izsir|{||ulknonzyz{}}rtzn}wwvqxxmmtyyy{y}yzzizmz|}yz{ror`kfjrupeittljnmdbyohp{w}uw~vvxolrjrbryqpx|wgtpp{tw}wyx~~y~{rgo}z}y}jzldiu~ubszs~t~{{sxmnn{p~~udtyuhr~vqvn~~wnx|dhr|yryy}uytxxx|}z{tryhqimjjnqvr}}}zylyvrpy{~~~tysjvsghxvqsty|yqr~y~~oxihyzxxws|mcjk{ovv}~miqf^bmrpephns{jnz}rsv}|yxwymnfjjh~~qx|nzw~v|}~{{xzozwv|ofyvos}{|nlnsndlu~ttrrpxp|qt~u|lwvnjgv~spxzwm{mqluqowvpy}rvyx|u|{|trym}ssbVchpc_u}|pv{lrz{ry|sijtzzpv}{x|xw}vnlr|u~}y{vnpx{ppripyqsdqxlejssi^ff~~w}qes|xwsss{yo}}uznpw{yzsou{uyx}zol{xv{utvyv}zpxwnf~ompmhi~pvwjh~xul{~|xz~}hky{xih~}vvqngu{rrrwz}u}ucs|uos{ryt{~|x}r~q\jjcXWrqtxv~x{}~xtxz}~~xt|}qkoo}xy~yqtxuqvt|~w}ym_q~yx}{zudduvgialxt}rfcz|{yqpqsuxmzxn}xx{wt|{y|xqiqskfww~{y{vtop}{twly}~ikzwtnhbkzpqlvv~xx|tl{z}~rs{{}rx{rjwqhpusky{rmi|wdywz~}uwt}rsv{y}{{~s~oyxn`Vewrifdmtmxsk{{|r}sugx}yzxt~|z~{p{zt{okwypox{}~~|xw}zssvwzzztexrnmgjq|yyumuzro|tn}sn}~}}tzspqgal~z{~|wux}nkwzvfovtlntkq|qmdzzqywxzuzsz{~{|ywtzy|}yx|{nr|uunge|}uj~}||gpx|w~{|zrv{xz}|{us}~krtbdvr`Yaikcx}w{{~uww{|ssosqrv}m}}x|xjuw}{x}sm~wqvy~zor~xqxk~pqjhfo|wmp~yt{_y}yyq~rn|~}u~zwvv||pdfnruzo}}~~tyvuutrysnlthm~vgvyyux|ymw~uvyy}}|v{m|{}wntxvp|}xyy}qlv{v}jputxyz|}y|y}k|yuljzt_Z]]\e~wv~~{yqx}ux}}~lsvqoozx~}xymu|xsruu|zgq{vwyyu|{w{~|~rooy{uoovxpmw}y`xmolzvo{x}{zuty~yu{~vttpmkuxl~twm{t}}tv{kjqvjr{qqzw|~rhxy}vxnsw}~wzz}}|z~rvl}u}|uxvrxswkk~~xxxkekptxytxxx{xxzvy}ml~sihd^Yjqorswt~xusx{~mn}{su{zstzzxzyqrzrv~v|wtv{|wjwr}x~~|zystux{ulox}dsmturstplvsjmsx|w|yux}zqvzsuu_tyn{xuzy{{zlnussngu~uttdj|~}wwuw|vxywq~~}mxvxnq}uzy{q|{z|n}ostmnx|vw{|yz{}xm}sz|yrs|gekmgkwlkckvw{vy}|{u~t{t|{ppw~zx|sxwosyp~{s{lv}x{uztnykjmzz{}~vu}wwz|}~zl}mvtnsymbntmnnjnxzxy|{yxy{itzgnruy{~}}wy}~zxspstqwyyx{rny|wxq~~{z~mrz~xtzohyvwpuupmz}}|qy~~~uswoq|~wqpv|}|{xqswz~|{tlqtmgbcwurdmzz|yiw|y|xy~u{|zw~~{yz{~~r}{z{~wxzvo|ytz|vof~|ppqsu{}|xrwyhrx}ukowmcsphjlmr{~y}}|{zzvznrtoqnouv{{}tp}qllnuzn}ufsz{}wy}wx|z}ot~{w}{|}}}zq}nrknssnmz}y}u~|~qzxqr|}xzxppuxzpwvwyzswzutrmnnmsynrmo~~{{zsmty}~wy|z~zqxzls}}zxy{utu{|~{xr{~~yzn}wklotx}{tt}}yz|~p~uyrrvqfh{|wofcer}zry{zwz}iu{pwxtsvzyvyz}z{}zytq|}xx~jm~zwwk~}~z|z{zyvzvhu{}rghihiu{qt|~}{wyz}~{z~yns|xrvzm}x{||~}wyryznqwnkkn}yvheyzncgx~{{ys~~}xt{|}q{w{xu{~zv}~zx}x~|qvvxnqtmknswvrpruzxzqu~|qopqpu}wifnpx{syquw|}|~vzxprsw|~{rmpw~wp}||wtu{}xrynryyouzvy~}z}v|~~ww{|ovtvvqrngcl{{qljkv~~|{{}ypv}vt~jpuw|||~}zwu{you}yuqq{z|xoz|{{{tjgq{~y}y}z}w{|ls~~zooqru{y||}nx|~wl~~vwyxusqmkmqrrv{tu|}vtqnq~{ljpot}xofwzpqwz}p{}xtw{ytrstvxvpx|~x~{x|~w{qq{}|ti~|vuw{|xy|}yuysm}xzsiilnov}|slijlu||}v~|{xty{izuqvy|~xu{|wwtrs|yopx|zwmzynder~~}xvuux}zz{oqu{vsqonu|vu||~qvyw|py|sqsw|~wmhilorxqi~}~ttvvv{|wsopuurr{}}unr}x{yz}}xx~zplouxyvpiw~sw~{y|wrv~yupwy{zz|~|z{}~{vyz}|pyv{ynjhegs}ogehs}w{pw~~{y{~}zowvu}yz~~yvxz|~ywvtu}{rv{|~rs~znegqzzqwso{||z|}yrut}mimrv}|}~{~rnyvussuvtrpnklqrhwvxvqorzxuu{swznr}zqkmy~}y{n~|uomnrusltyyzxurww}ss}vy~tz|tsy|vux|zv{|xl~{zvmkjjkr{~zurons|tsynrz}||~uzx}~y~yrqvz||yswwttv{{||yzvo{}unnu{|yxxssymq~~}{|~~xqy}slrqltyx|zwz~~xs{uuwxywqkkostusej|usy|~~{xx|z|}jo}yxrlp{|zz{y{ytw}|wwyxtoieryx|sopty}~y|yl|ytz~ywxxvvvyz||qsutkhioyvnknvrqpemy}yw~~}}w|z{zzyustvwso}|~{xyzw{xzsx|rmq{{phpmi|zwx{{z~ztzyzvuoly|{zz}yyxz|xrlgeemxuusioux|}zwy{jnz|{~|ogr~yyyu~}}yv{|yuvxyxrjn|uuzspqv~nwxsvx|~r{|~|x}wnnrsv|z}zu{}}ulfl{i_dikkhcbjxyvvz{svzsow}xrssoz}tmjhiow{}}yppqbfxzxwwx{}}{vqnt||z}qhlz}|tnls}oy~vzzsmigghnrmx||zz{{yusuz}tns{odeost{{oktmk|{y{wrrswx}|~|xz{uuwy~wqnu{spu}}z}pq{xvx}~rlpojnz|{|{v~qhegp}}yw{~zsle`cksy}}||}zy|}v{z|}z~yww||qmr~}yyrfep{|upvvjqztoptx{{xsqqtw{{xwx~rinw~~unnv}wz{yz|vmhhmuyquy}xsrtx{{z{{z{smloxwqu}uhu}zxy{~~zwvy||x{{|ypmnt}{tqu|spu||~u~zxxyywutsnlws~}yst}zxslktrpy~~yoebgpw{{xsy~x}~~{~u}xuttw~|yy|yx~~rgkuxwy|ztxznrzsporvwtqpsz}~{vuvz~~xssvx{~xtv|}}w|y||olrvx{{syvx|ytsvxywtx}{~{{|tqu|}yyxwwoq|wvxyzyusty{|xzxy|vqnotyyurry}{vx~|w|w}}zyzzvqmns|w~{~|x|}{yx{~sjp}{rvyywtpmnsvxxvqqytpwt{uppu{~{tpr{||~ytrstu|snv|qt~{yxurnkknsy}}|xvz~~yqmoz}|xtwwu~{v{tsvuqxxy{}}}}|{{{{yvrpz|ww{{||ww|yqv{su~~zwxxvroorz|}{x{wwx{|xpkkp{vr|}x{ur}ytpnory}|y~|}zqotw{wz{tlinw~}wpnvsiu|uw~}ywzyxz|{uomoywpnt~zvx|ykm}||}}yrkhipy{z}{{|uoos}|zvux~~{ynyzsos}{q}~zvtw|~xrvw|yuw{zrtzuu{|~ql}yw}ysonorx}zz{z|xsz~zxx|~umimwwv|{~~rwxsqruz{ty~{||~|{|~zsos}wokmsy~~xvyqht~zy{zvz~||~~~}wquvolow~zsqty}yw|z{~ywuvzwt}xz|utx|zutw}|uqt~}yyqthtzyy|{xwwy{}|}yvuwyzvqxx}|vsqsxsnu~}}uxwqyxtx}{vwzysppt{|uy{xwxwspq~~~spsw}~yuvzpmuqxwspprvxywuttw||tz~wvyyxx~upqu}}{}yyzytomrxv{uollmoprssopzt{{vttuw|yrt|~~}xtsrpnouwxyolostsppruz}wnwysqtz{xxutv|wuyxsquzyroprssrrtx~yp{|||tommmnot{spptz~}xutssvz~vrtyxojpw{|{sq~y}xronoopv}zzwrs|xuuussxxuttsqprv{uv}z}{styxsqvxtsw}zsmlmoqsv~}vsrqpnmot{~wu||ywussw{ww{|{ytrqqrsuy~wx{xqnoqsvzyv|vz|yxwuss}zuuy~}xsoow}{x}yvroopty~x}yw{yzxsonmnpz~xtuy~}{|}xxy{{zy{|xrquwut{|u~xy|}~~}{xvsqpot~xqt~}|~{vtvxz{zy}~zwvspoqu|z~|y|~~~|{{xrosyy}}|}}{}~qkpvvtqquz}zvspnnqv|{w~~{zyywuy~|vrswyywtu|{}ww{yqlou|{t~}zzz{||zxwwwvuv}}}ysrvz{uqv~~ysoorw}}vy}|{{|rnrvtomt~}~}}~{y{}ywy{}}|{|~{uqrzrn{xz{|zwustvvtqs}|}~~}~z~}vrruxyyyy~~zusrtx{ysy~~~~}zwtsuwwqmx||yuvvrpswwv|z~ytqqswxro~{w}~yvwxyxwvy}~wqnosvxyy{~yrtyyvwwrt}~|xtqqrtttt{zy~~~vqoqsvxzy{|zxwxxtox~}wstvsmknt~}}{xy}}~~zqoty{{{~~|{zzywv|}zwsonnpqsxzwx}|ypllosvwy~}~zxy{yqp}xspoopqt|{{~xpklsxvpp|~|{zz{vnp}|z}yqnpsuw{z}~{}tmkmoqrty~{vu}|np|~|wqlklnpt~z}vomnprsuz~~xns}{~}xrlkottpw|wvx}~|}xnnsvsruyzouxvz|vpmllmns~yxy~{~ztomnoprv}~xzwpyyx|~xsonnoou}{~y|~xsooppqv}vpz{ssw{~|ummrspllu}|{||z{~z{|zxwxxxxy~{zqqty{tz~x{}yuromox||~{}~{wuz~~||}~~~~xroquz~|swxux}~zwuronu{{|}xy}}z{wqprvz~}upz{sv}zvxzxurpoot|~~z|{{|yzxssxxqp|wppsvyzzxvtrqopw{x~}z|~{~xsyyvvx||uow}soqsuwxxvqlmrvv|wz||yyupy|yy|~{rnw}xtrsvxxwuuutrpuxu{~{~}}{oq}|z}wqyvqprtuvuttttsqrz{{zwz~~}|~~qny||~~yqt{spqty|wolquuqpwvsy|}{|{}wms}zlj{uqqsstsrrsuusruzsvz|~}zz}|pt~}~~|uowztstttsrqrturlm{vrx{|~~|~~vnt|~~ypq}pnu{ztqpqsttssxyqtyz{|}zyz~rpy}~zsnv|vvvutrpooqrrrt}trz{y}}zy{}vx{|~~xpn{xvvwusqsvuoklqy|rtxxx{~~}}|xzupv{|~~zuv}~xvxxwutqonnoqru}yswyxx|{{xx|rqx|}slu{xxyxwtqonnoqsw~{v{{vw}~z~ywz~y~{pt{}}{qmxzxvsrvzxqllnpqwvvyxvx~~x|~zyz}~xqw}~rny}wvxyzxuqmklmnqx}uwywy}|{z|}~~}nkxxmo|zuuxyzxuplmqtrns}wyzzy|}~~|wz|{{}ss{wlq~rosy|{vrnmmmmpz{w{}|{~|}~|{||{zyz|qs|xnswsux{|zwspnmlmp{yrtz}~|{~|{{zz||snuypvwsuy{zuppsurmjnzxw|}|{~~}}}{ywy~wqw{st~spswyzzwtqomkkp{}uw~zz~~~~~{ywy~}uqx~vs|zrprvxyyvtqnlknxunwz{~|xvz|vv{ypoz~uu~xtwyvssvxvspnlmu~wu|{yx{~~}|}~}yutwztlq~}w{wqqsvxzyxvsqompy}vx~}zwy{|{z{|~~{wsu}uko|zwvrrtwyzytolnstv{|vqw~xx~ysv|}xvx{vlmyut~ztqrtvwvusrpnnt|zrqy}yz{{zyz}{xwzzqjrzwxqpqsuvutssqompy|wwx{|z{{zyy|{vuyvihu~wz}towyolnnmkhinw~~~~{vx}yxv|yvryxtuuz~wijxrlnopqv|q}xtrlzuwropt{{wru}s~}ywwuvlsuz|}||u}s|xt|yt~|y~{lbjxy|uuz{~x}}w{{wlz~ntpuy~|{y{}|v|z||ylrwpn}ywlmrpnl`_koeixytv}}||vv~z}wsf]bv}x{~{zz~sxw}}|y}{|vtlltu}~vsp{vvu~{topxljlrpzyu~nkvz||z~z{|yjlnxt||}prisqiwy}}tthmk~}vsrur{w}oszxwx|jy|{xwvu{|w{{}z|s{pt|v~rmyuv}|wpqvv}jfclmw|zz{}sw}xur|{~q}}y}tpgj{vrywx~|~~|{uz~xuyxx~{kuyslrknjsqfiq~}}suvumq{{prt{|~v~}rlmhohmrzv}tsowqzqnqx{}nzyt}tsyrllsuztz~szto~}}z}}z~{tlons}{ytntd`cryzs{o}|}unq~{x|~uefott~x}z~~yy~}{xtzpx}yy|tv|ktuqhmnopmqirzxzy|r~}|tuw~||vxy|~~{yz{w|ulsrecuwv||x|qip|tuxz}y{tzupyrmrukox}y~~vrrvsww|vfgmrnz~qnjsrkszstx{t|v|{v|}xr~~vjppeg{rv|vx~~xwx|~ynxuzw}~wtipusouvjfizslnwxz~zsz}wz{y}vp{{yyr}tjmh^s{p{||uss|yz|xmyz{xztsnkjsytx{wr}wr~|y~||x{rz~}{rysggntx}{rprkj{sw~}yvryrqz}{~{uwqqtek~tox{w|ywtvzw||y}|yvwwnn}zpnkmnroehqvvw}zz{yvvstz|vxv~}~{~ytvqilbbuy|z}{znsysvzuorqptrjs~~}tpz~}}xzxrv~{uu|vntzuow|{}powq}|vx||zxzst~wouzvornnrklx~ww|yu{{yx~|{xr||~{~wrx{qhisnemy~yzv}}{wls}|vw}|xy}~z~}qrxuiehrxps}z{yxxv{vvqzysu|~zvyxtzzux~|sxuy~vyy~}z~wz~zu|sqsuy~yt~~|wy{~z~~x{~rmw{y|vy}oruzsifmrkp}}rt~~rm|oux{~xt}zvphkturwuvzyyvtz{w|zsr{}}y~}|xxyyotxrlpvnhs}xuuz|w~}tnw~|~ynn}|swvtu}vz}uvy}z}{u}|~}pr{ytrxysvy}vv~xwyvzxwyuy}}{p{wrpmehsytwyx|~{{|yy~zzwwsw}try|~}}vvuqksxjz}u~~|xr}pty{|y{wx}~|}x}~{~~y|wwxxrilplm~z|szvy~xs}}vswyx|~vmtvwzw{z{}zw~x{s{s~|}qv~{twsomt||}}}wx}~zwo}xw~uw}~rqpqmmx}rlz}y{ww||utotyvv~||ww}uuw|xqr~ym}wuzxz~{|{st~}}{~w}|{}~z{x{zrs~}uvrpderzst{}~}}yxx~{~wt~ssyyqwws}oyut}z~{||~~~{}}zu||prroqw|r|{xx}~}tw}yw|ty~tuzrsvzxnpuvx}}~{{}||rwzsyqkz~stu{z~z{zryyy{vxx~~x}|zrq{xy~yvrxu}~~~~~w~}xxxpnkmjquqiuy~~}~sv}{wpw{|v~{t}ptz}~}v}x|vz|z|~x{{qowwzrt{s~y{~|zr|zx}xw|{rqzyx|wrhp}uz}|{~~{~y|}yyuy{szysrumqu}}{vtut~vt~wzvwzvxs{yx}}s~}~~w|y|}yvzpntvugiproy}~|||}xyx{zxuvvz}{{vv}xzvyvz|y}wx}{|yvv{|v|ynuvvwxt{|~{|q|zt{vv}wu{vspvxsxytnyz|xwtxxvux}qlstqyy{qp~}{v~||{uzw}}z||s~tv{}wy|zz|}~yv~ypr|wztpmgqwuowru}~|{}~v}~}r{xs|ws|yv{ypvw}x}||{~z}{~vyrs}sor|rlp~~~}{|x~|xywzvxqu{{{oswws~~xv~}~~~{~|zt}~xuzsou|suorvw~}zzw{}|ty~zzs{t~~yq~ytz|y~}}~vzzvw~xnqnunnttknyzzt~{zx||{z}zyv|x|sovtxz{pu|}~{}~x}|~~|zy~xtuxtjutrt}wx||}y}~~xps~y|zwxpw~uww{x{~}~}}v}}|~~zxut|xuuvjpt{~v}~x{xw|{zz|{|}}|u}|x}vty~~z|~v}yxuy|trsksqtrimqtvxp{xw|zzywz}xwzrqyvxrwxv||}y{}{vvzuz|nqotzsptvt}~}~vwzxy~|uzu|xx|xt~t~yv{|~vx|{{tzu|zpjops{v|ux~}}v|{xv}t{}uzzr{zxz{y}~||}y}z{{vnnuorrnqiszsn~xt|~yzwz{yyus}{yxwnvuz}w|~~~~{|z{|v}p|wqvpvprumlv}~~vzv{wzvu}ysp}szyzuz~|{~wx~|{|ruolpxrtus{v~{~|~|~xw}|z}yz~wzxx{vuwt}x{|~ttwrquslrmyvlr|tqzyy}xzx|{}yv}y|rouqvyv{sy||~|~{ytzvzxwvtzqsnjrqtxzrzy|{yv{{y}qy|uv~|ywr|w~zx}yv||}~|utmxwtruntvw~tt|~{z}~v|}y{zyqpx||~|z~}{{}tzryxroqmu{ntttquv}wtzu~{z~}|}z~}txsqtwqxrv||}|wv|s~wsz|wvvlrnuyrmonq{x~~z|{|qvxzw}|xt{xwzryxyyyy~~}{|rxzw|uqquqzsqtv|y}y~|wx~z}qsywx|zy|~~~}z|}|w}twuoqzsnvuwnsz{uxus|v~|vv~{|}~zzrzwtrtnx|z{u{|~|vxu{~vx}w{{xsxrzwprkimroztyzsw}wzw|sx{yz{qxrx}~{{}~~}}}x|~yuwxsrvplrr|qsy|}z}|{{yszt}}xvzv}~{|}y|{xzpxzwortxqn|vwxxu|wwzouux~~~}|wy|tzuqqyw{tyvx~|~|{}}|y}|xq{xy~uwxyzvvqiomlmplwx|yzy|xuvxvzuy{yvzr{~{zvw|z~|wz~x|xtzupklozlq}wwxy|y~|{|~{~w}x}xvy{xu}}z}{~~s|{zxptvolzuzztx{{{{oups~~}{~~v~utwwyxputy|~{|vwrusv|rzvv|}|tksjnokinozu~x|tx~vwxs}xxyyw||twwvw|y~}v{zz~sumkqsgrxsxpty|zx}z~~~|~w}zywsp~{~{z~}}}{ts}tlptu}sxzw{|wusmzxz}}}~}}u}v}}sqzvszw~~w||~zywttwrwwr}~~{tvnnsimklqwnu}|}|u~{utr}vw|vy~tyuqxvuwxzzv~xw{nnwrinrrtjsutxyx}~}~~|}}y|wppzwyz~~~~x~|}~s|rssuvvr|vw~vvtrtzs|zu{{|~~z|zsz{trr{y{v|}uyxustq{~{{yxwuxnoqistnipsysv{~wuvvu}sy~|xpztrust|}xxw~tq~toosqnhoqlvrrv{~}}u{}}~~}|~||ptxwqrxwx~|~{{{|{x{vx|yvvuw~swtptxz}ys|uvyuqt{|}y}|utx|xz}z~y}y~vyvtvzz|w|vxyxvvmwyomlrpjl|y}}x{xvwtwy~|z{xqzqqx{yvuz~|z{~z~uwqwtmikhpqissw}~~ts|txzz{~|yyw}yzrrxxqyut{}{~|{{|zwy{ywwwszooxw{}|{|r{xnoovxsvyv}}{{z|zyz||~}zy~yxvz{|}yz|qyzwxxx}{sulrsjioqy~v}zzzwvxx|}z{|z|tr}xzvrx}v|z~|~}szpnmkjkhppm{{{{yvyqu{sx{}}}{~py{vqpozvt~|}y}|{z|}~x{ywsplvrt~{|}}|}qsqlwuos{||}w}}{{{zwu|y~||}xx}x{{wtr{st{wy~}vlzxiknqrstx||x{z{~~xx~z{|{|}xyox{vsv}{{z}|~}}|}{r|yxztw|}s{}ztxz|~{~zxz{~olytsvvy}{{~{}wstuyx~wz~yty|s}~~{z|{{}~{wut~uwyxxwsyxsvw}~wv{u{wy|~~{wuut~|w~}rvzz{qsqlkrw|rv~~u|}v|~~|yw~tryw}z}zvy}z}{s~typikjkorxsw{xz||~{xvuz|wrxw~|||~zt||}{~qqttnjn|ymy~~~vtstuyx~vzwxx{}~po}{|{zupljmzuy~r|zwsx{wuzoryy~yywwww}{{yjqx}}truvpkw~tzxwy{{|ux||{wtrpxumx{x|yvytkx}uwvwvtsyopywy{}x|zy|urux|x{z}~{zzyrvvv}|tqvvnuwtxx|rvyz{{z}w}xz|zxwwwy~}vvvptw|xspqsyw}|||{uu|zurpvynuy{|yyxwz}z~yt{wq||zrsxw|royxxz{~yvusrqqr{tw~{}|~|zw}vyytx~|vrnswmuyz}vywquxz{zw~}z{}yx}}}wltsuz}wqqu|y~zqzx{|{{z{sp|~z{yxxz}}y}~{znu}|{{{zzy~w}zy~ws~wurqqpwypz~z|}{{www~t|}}{~ytpxunxyz~yz~rrrrqru~txz|{~~||vy}tmtsv{zurqrzru{|sz{w{{{zz|tsyw|zx}||{vwykottz{yz{zx}{{}yy~z|{yvrv|v|zyz{{}}z~}ur{}s{}~}|{rx|~{||tqrqpqr||v~xzy}zyyzzz{s|{{|xtrrzuq|~rw{rrrtvyy|st}z|xx|{{x|}xtxnjstx|xvsru|{z}}zt{{{zyvu{qo{~{{}x~~}xsppwmlx}~}|~{x~{{}zzzvrps{qp}}||~wttuytu~~|xx|sz~{}s{yqrqrsu{wv}|~{z|}|y{{{ywz~qrwy~{wusrx~v}~}vr|xsxzxrnyst{}{yy|~|{{upmrrhpy{ywvx{pz~|}}~zzwtpowxr}~y{yyvsomltso|~~|{zqz~{wrquxvpyyw|z{~z~wuwxwvw}ur{|{vsy|u|~xqzzrsuwxwy}qr{|}zx{~y|}{yvtvviq|zxvvx{}}}|uu~zvpqwwxvn{z|~z~zvrollsqly}~{v~{}}{yurpopuzw||{}|{~vtrpoov~qnw~zvz~tz}v}wuzwppu~~pt{}~{yxy|{|z{zwvtzujrx}|y{}zx~~}{rxxyzyvsryrny}}|z|}}|zvrmoxssxy~}~yy}}~~|{zpuzvpox}u}yytrponoywr|}x{zty~~rqrsuv{yx~~{yy~{x|ttuvwttsmw}y}~zxy{}sx|rqvywtzumvz}|{zyzz~|{yurqulkw|{x{~~~~~zwzxvsqpuypt~~zwroqu{uhs~u|vu~yspqtx}v~~}y~vsssstxtovxz}||}~{s{ztvwxxx}sry|}{zz{{x}y{ztmoz|lnv{~~~~}y}xxzwsppxvmv}|}}y{xtpmnvsny~}v~{wsrqppt}yw||||z~truxunpztszy{~~|xz}{||qsuwxx~uw|{|{y}||yw{uvwwvtxvjovx|}||uv}yyyxvuyvnz~||||}y}xqosurtpkv~|}s|}vsqporzws~}||~ztpnmnr{uq{|wx}tqqqru{vny}{}}|w{~yyunlqw|qluy|}|tz~xxxxwwy~sox||{~~|u~yxwuqnpullw}|xzxwtpnuyuz}}~}|}|qtwsljqyrtyy{~sqppprzxz~y|x{yyonnopqx{qu|}~||zxu~yssuwwuwxt}|yy{~}vz|pnqsrpurjr{}~}~{uz~yxwussxuny|y}x~|vrolkmurn|zzytqoqv{}rq}|y}r{yrljlov|tu}|v}{rqrsuxvw}{{|ws{wqqrqqrxwlq{}}}uw{xyvpnu}pv~|zz{}~zx{vuuqmknuoly|{z{wtqont{uv|~z}{z{~somkkluzsw|}x||{xqswwrpz}w}~|~y~|zsmnpqqu{uow|~}xzt{~vuwxxx{~tr{zy|}us~}utsqonrslvy}upqvxvyup{}~zys~yrolkkpwrr~~{uqpops|vy~~x}zxwpnnnqu{tir|~ty}zupqv}wqy}~}{||ry|uttsqquwlku{yx{zywttzzpu}~{}}}wz|urokjnzynqx~}~wwzvqou~yvz{yz~snmmmow|tt|~|~|x{srstuxtv{|}}}|}{vu}xrrtspnsurwzz}}yzrtxywx|vow}~}}~y}~xt|zusqnlotmkv}{}xusrrx}vw|y|x}rmkmqtvskr~wvzspqswvx~~{|wu}wpoopru|yosz}vw{vvvvvx}xnu}||}{sx{vsnilu}ujqzyz|{yvsrv|vr{~}||w}xqnkijovqpz}}zusrrt{|vz|{zw{tyyporrmjpzvt{~}ursuvw|vsz}~{z{{v~vqy{tqrrrrvypoy~xuzwvusrvzuy}}~~~xwrjkorqstmq}}wyzusqqs{~w{z{{~xv}xnjiijoxyrv}|{|ustux|zow~|z|x~yoq|zuniiov}xou}vw{wvvvvx}wow~{|~}}wrxxtrqonrxrp{|x{uspor|zsy~}z{txvqrrmiktxru}~vsrrtxy|}y{uz|ssyrkjklnszwot{w{|wxywtt||y~~{yyz{|yvu}}pjnqrruxqoy|~xw{wutrsxyqt}zy~}|vx}tpmllpxxsz}z}zrprvy{|us~~~x~tnywnihjnv{trz~ywuuvx{ww}}|z}~xopxuonnnoqwrjs~y{vqpuwpw{{{}~z~ypvyvsqomntwpr}|}xtrppt{zty|~z}x}~w{womlmpw~wosz~}~x}~xxzwrrz{y~~~||yx|vmlmnorxwnow{~}y{{zzyy{{sx{{z|{}zuov|vqomkkovtsz||~yrtxywyzss}}z~~yv~xruuomllpwysv}}~uqqqsx}tx~y~}uw}wpopqsvwpkw|v~yrqtzzsy~~~vnuytpoonosumkt{}|{yxvx}~vw~{{}|z~}|yst|zqlihkr|{nmw}z|{wrqu||ux~y}~}z~}~xy~xpmmmpu}{sx~~x{ztsstvzyqu{y~~|xrw}xsrqnkoyxswz|~ytwyzy}xs{}u|~xrox|upnlklquomw}~yvutv}|y~~{uz~~|uqwxojjnrstuor~xx~tpprv}xu|}}|zy|z{~vrxzroopru{}us{xu}yuuuuv{{rt}}~~~zts}~vojhlu}{onx{w}zxvux~~vz{}{zwrt{xokihjovvpu~~yuuux~uv}z~}||tx|unpvsqrpkjq|{v{~ysrsuw|xrx~~|yz~yt}|tpw{vrqqrty|us|~xwzvtrqsz{{~~||vv|wljnqrrutns}~|x~{wutvzy~}yzyx|}~~|wptyrkhhjmtzvqv}{}xwxz{}|tu~~|zy{zw}~{unnz~vlhiov}}tt|xwyvuuux|yqt|}~~}||wrw~{tqpoqu{xs{|y|tqprxyqx~~y~~unswusokimuxrs{~zvuvx~z|z{}tx{tnqvqkjklouyrls|~~{|zwss||x{~{yyz~zy~}{zyvwzummprsuzxpt}~|w}yutrsw{wrx|x~zz{~~xv}xqnnnry}wuz|~|zwtvzzz{zuy~|}{sou{pjhimsyvory}~~}zyyz|}v{~|}x}|wplsxrnlllnstop{vqrw~sqy|}~{{|}xw{~{onx{vspoosyxrv{xitxnmc^fc[cg`grlkxxq{w}~q}z||wyvaUsqmtpvzptmfwsxf[}cZVZd^]jijtrsikzvscsutmtuxxpyx{zxopsuekjQdpixzspsqMpwaMRVT_j[^}sp~tvriapof{fc}tgp}~pdwx}k{{sgavwdyv|r_mcU}mZ[XV`gT_xdqxxxz}tn~slktvir~yvraVp{typsrw`wqhoih|sofVV}|uwxtdgpap~rtikontzmeWTqsy|u|ohzi~]s}}flzvrvmiyrzxzlryyxy}]PUILx{u{dishx~xz|qsswbmde|zuvsioh}|hp}pltiw~v}}}ex|rmgzjzzlxsU_i\dvvw`ptmxwl|imrz[brcoxsubxiexgkpxm{wcvwfnqh~xt{|~tuvymow{VJcc[o|eyiawoowoh|jsr[zvq}ouq{sn~smkk|iandn~|s~g}~wiitugr|tkOdvivnq{brslqq_tegwuUfyg|s~remqyklsytfwucwn_ilcyrz~xxqu|qk{}|exrINmfj{|tfhkumrtggrdzd^~o|~{mxxr~q}orgqr`fo`}~tzqmv{wjqiwodznzUQqqnmrktnstj`v^syeSojo{qisso~p}fv{njiko`frfw~s~qi|vizin{TGcjful{vlqnttm_}_wmXnptvu{{w{myulpmnbgodq|wyn{w{|ym|awoe}|rv\Qkpnxt}rprwslbx\vygTdgmynqursvzfrpiqjicjogqw}xe{rl~|moxXK`ggl|t~tkrysmd~|az~kZbltt}{|~orxl~ylieklhl|~tty{zvv^qohy}ws}gSbmnp|~}mt|soev~bs}gZWem~|ov{uu~vqexhu{jddkmll}yzhoxo|w~umqiQUajhozlo~uqkqlomcW`r~x}{|enr~udejmjpnts}z}pzp]qkvtptaXbprpxjzrnmxug~q`YRiv~wvwrvztimnir{c`gnktmt}zxdmsy||yzrihgVUaqg{~fvtqqrzoufcV]zzvuzennzt_dlloxp|tnz~{m|{q\kp~~|zztilgZ\twu|izrqsrvn|p\^Mg{}z|whuwv|rhpik|e\gnk{t~suzr{mcq~ywrrpri^g`V[yo~nourvusvtj_`Svwj~wptqln}a_jnpuskq}onzqe_pyqsqruiame[jyjx~trwsouvw_]ZT|}jew{q|hwvkfmt[`moz|zox}o|utff|xz}cnflk\]j_Yv~}iwtt|osz{o]fYjevzw{o|rngyj[hps~rokw~miho^j}sphoiri]ipaipw}uswuhx{sb\aX{|iaw{utqrqngj|u_^nq~ypsxl}spmbsy{\ldkh[[mf^y~{r~utt|ksxk_e_q{cz~|syvrrqiy|i\kp{{ppiwygocr\p}~regkipc\lsctu~wuqzni|k`_`g~z`kwqpxmlqgqzo]dov{v|lumpetfj|||nh^idlaXbqajxz~wuqysime`el|hl||nplvnr{tbcnsys}jkxikekia{~~rr^kgog]cuhlvxvqwshkd^alwwghy|fnftmowscajq|~xnn{mrjmmf||yrl\gekbY_pdgk~wuqxrkjgadsyxlp~iohxssytfciq|z}wijshqfhje|}xwo`ijmf^csikhxvrwrnjg_bur{skm|cobtrqushafnyv|pktntqgqi}|tv|o`chhc[]lhfaxwwqvspnhebzt{wvrh{buwtvumcemwsyqglkou`njz|yvxrhbkig_`lplcrzyqwsrueg^wvsv{znz{os_jttqspgbhvp|klnqiktwwxpqj_dgd^[cmldcyrttszgkcorzyv{~lnetxsrrneesq~{mgflwsaquyv|n}yli`jec^clsob~zwpuqxqfhe~wsuzu}|yov`gsuoppkblts~lhjung}zyvtokj_`e`]]dmughyprqrikisuxz|}zqtbmxtoqrifurxrgajxzyemvrxlx|fl^ed`^dkv{i|vnsnw{gkk{uu}}z||}u~yq~l_kvompsilxtzrhbq}{{fyy~q{}g|rbgZb_]\el{xk}rmqm{wjotxx}{w~zw|janwonsvjtx|~x||la`s|zwwexsqskiff]d^_cntvyymnnpnkr|t{z||rwxxutbapskovsm{vuxkaj|}x|rq|nw|~fuw_f^]_[^fn|rrlnmz|mq}~v~|zty{{uq`iupmszqwyu}yoa_s{usziwrp}pk~hcg]b^_eowzylmlspmzs~x|{|outqrd_orjoxvrzx{w}wi`n~yt|ty{}|mzzweyp_e_]]Z`jq|mllqxnx{zz|susxqp_ktnmwztzu{s{wl_g{xovxs~x|nwzzhwubde^`[aiq~omlqynu}uyz|qqo|kr_eqnjtztws|v~xsdh{{qu}vxyrvyyitud`f^]X\fn||qmlq|ruv|~}tsokvdeqpktzwvqyv|vrchyxmr{xutswzwlvugai`^Y]gn}rnlt{qu}~vz}yrqlhudcnniswwqoy{|xuhn|ynt~~usvz}{tnvrh_h`[VZckyysnmv{tx~y}ytsmjwjdnpjswypnw{{uuimxxko{|vnyy{|tpwrl`he\YZdjyyxonv{vu{xzwqri~jqmainiouyqk{}~vyopyzmp{||l}zz|towpnacg[XV`fut~ons|zv|||{qvjxtmuefnlmuzxiwtwrnuynjtykwz~{yymxroh`jaZW^esv}toq~|w~||{}~oskmhrlahljrx}kwwxvxrvzukqvwn~}~u|mtulm`cgZWXakwt|oox|{~|{wptg~tkugcklowxm||{suusvumjuwlw}}~}uwukznmi_hcZY^hvwwor|}|}z}~mrikjlqacjlr{p{z~vtwwxwsknym~}|ypylqvhmd_h^YYamzwsnv~~z~zzlsft}ipqadlovrz|~|sruwwtojpuyo~|{ysovhurgmcai^\_hv}|qoy~wyxqknbxxeom_clqzxzwssxzyrnlwwuv~{yvmqpiyjgj_bg[]am{|x{nr~{}x}mohkrfth_gqv|~y|qqrzzunln~|qz|xvokrhquejh`ge^bhxvoywvwrjkbt}ziira_kt{~~y~urrx~{qmnxzyv|}|vqiokjwiekc`h^_dp~}z}pu~|yw~|mmdo}|tetk^erxz{{woqs}|skmq{|vyz{vshllgupdji`ff`fl}}~vs}u|tynmdhxyyflq`_mvy}{zprt~xlmp{{{y~|{xshjlftrdgkbbg^ciyz{t}w~uzrpeixy|liud]iux~{yopr|ylko|v|xy|y{shikestffmf`gadixyv}~x~uyspchvv{pgsf[ft~y~}zqru{mkpt{y|z}rgjjeusfdlg^e`bguty~z~v|vscmxw|shth[ft~x}wpqvzljp}p{w|zz}rfkgfxqgemh]dbcitr}}{}v|xsanwu{thriZbr}zxqrx}njqn~vz{{rfkhdxriclk]acahqo}x||wdnxu{yjpo]`p|~}yppv~oho|l|vuxytgihbwsjckn`^dchpo~}yz~zghxsx{ojqa\iy~{|~rquukmzssztvyzigj`qwlefof[bdfonu}}|y~oewtu{xipj]cu{|roq{ymiu}{~ksqv{mej`hxnhclm_]ggopp}}z|xdnwqw{phqc^k}{{ppvtlp}{rt{prxxfhe_rtkfeoi[biksm{|~|zngvssy{kloacu{rnpy|okv}yl}ulryndh^evoidhoe\hlstr}|{{|gkvosywhmmbf{~~pnq}zqo|||~orjrz|ife[julhcjod^lpxsx|}{|}wfpuot{whpnem~xllr~woq~xxqlis{vdg_]orjgdmoccqv|s{|{~{lhspnv{qgrkgu~~skoxurz~xsxxgjv~|mdeXeqnhegplajv|yx}}{}|zgpsoqy{lltkm|xmkr}zrt~w~{rmepzuef\\npjgflqgds|~u||}~|kmsomu|rfrqkwx}qkp{~vt}{ywxveiw}yjf`Wjolgfhpmcl{w}~~{rltqnr{zjmvnr}~~xtlmwxuz{uzu|ges{znfbWgnmiggnpfiyy~}}~~~{tmupnoy{lhvppx{~z|vnmw{v{{v}w}kdq{~|picWemligfkphfvy|~}}~}}wpwqpoy|pgutpuz|zzwpmw~{wzxt}xymdp{}{pkbXfmljggiojftw~~}}}|}}usxpoox{oettpqy}z|xroy}|y|vv}yyneq|}zqmaZhlkjgfhnier|u}}~}{~uwzqqpx|resvqmw||{xspy||y{su|{{v~pen{|zrpaZhkjkgggmlfo{t~}~}{}}ux{rppu{uenxrjs}zzuqx}}||st|zu|uhlz{zsscZgkhkggekmgkys{}~}~zwy~uprt{yjjyvkm}y~|vsv~|}}up{x|wwylht{yttjYdkhjjgeholivuzz~x~}zvxppqxzqft{pg||}xut||~zoyxy~szriozyvtq\`jhgjhfemojovv|z~}z}s~~sprt{xlk|yiq}{zzvuw}|~ss|u~wsxnirxusugYgifhjgfhqqmtuy}x~||wvypprvzuirsg~zyxvv{|{pzxwstukkuvsts]_jgfjjgeltqpuxwwzr|voqsx{tkypn|}wwvvw}~|xq|vypsskksrptmYcheejiggpwusv}w}v|x{p~snqsy{tm~nu~|}tuuwx~~}uu}t}|nsrjkroptfZggdekihitzwuxywyxy{tuyqosu{{ss|ozxptuxz~}}}szxutltoikplro]_iddhlhhn{}xtw|v|}v~zp|uopsv|zr{uw~{sqtwz}~~vw|t{mntmimmntf\gfcekkiju}ux{v{ww{}rxzrotu{}wu}tyxmsv{{~}~zu{uvsitrjilksj^dhcdhlijp~xsw}w}{x~st~toqtw}|u~u{~oqv{|}}~v{wtzipumgkjrn`cidcfliilz|pyzy{}y~ttvqqtv|}wzx~|qnu{~||}vzvt}|klwqhijpoadiebdjjhkw~o~}z|zz~ttxrptt{~ywy~}smu{||}w{ut|~mkxsihjqobgiecdijgju}n|{}{|swysqttz~zv|{~~tmv}|{}}w{st|}mkyuigjqlcjiebdhifju{l}|}|~syzsqssy~ztx|~}}vmv~|{}}x{rt{~ojyxkfkqldljfbdgifir{lz}}~ty|urstx~}tu|~}}yms}}z|}y{qsyrivznejpldmkfcceheho}}nw}~~uw~wsrtu}~vpz|~|}~pp{z|}z}uqy~wkp|sggpndkngdcdhgfmxrr~~}wtzurst{|pt{|{|vmw{z}~z}xov{|pjyykcmoehphebdfifjsxq~}{r|}wsrtvvn||z~z}pp|z|z}}srz}wko|sffohdnnfecdghhozty}}}|tu{vrsu{qs|~zy}zxmt|y~}zypv{}|rjtzmbklbiqiedceiikt~|w}z{}py}yuruw}n|||xzx{tmv{{{}vqy{}zpjvxjclg`kpheddfjjox|~~xzwo|~}yuswz|o~~zv{u|}rmxz|ytrzz{wnjvtfclbboofedehmms|}}~~vzps||xtty}vs~|wvwv~yop|{~{{rv{zztkmwocgg]hqkefdfjnpx}~}xu|ymz~||wtw{q}yuyry~unt}|zusxzyxqiquici_`opgefehmpu}||}~swnt{}yutzww}{uvtv}yqp{||}ysv{xyumluoegb\kqkefefjprz|}||ws~tp~}||wux~~t{wu~xsz~}uov}~{}styxxwqjqrhfd[gqnffeeiprx|}}}{zr{vp}~{}wtv}u{xu~zsz}~wqt}~~{tuyywxtkntlgc[eqohefdgnrvz||}z}syxq}|}yuv}v|yv~{sy|zss{~}{utwyvyvmltnib[eqoiefdflruxy~|~{~szws~|}ytu|w|yxzuz|{us{~{|~uuwyvywnltqk`\gqoiefcekqsuw}|~{u|wv|}yuu|}y|zyzvz|}wsy~~z}}uuwxvzypkssm_\gqpjeecdjqrru~|{wzwx}|zutz}y~zzzwz{~ztw|~y|}vvvxvy{skqupa[fpplfecdhpqpr~{~{zxwy~|{vuy~zz{zxyz}|vtz~zz}xvvwww{wllvteYcnpmhedcfnrpo|}||x|xw~||xuw~{|z|xyyzztw|{yywvvwv{zqirxlZ`kpokeecekrpmw}}~~{{zyt}~{{wv{|y}vyxx{}wsy|x~{xwvuvw|wkkwuaYfmomieedhosnp}}~~||zysw|{zwx}~|zxvywx}|tt{yzyywuvvy{shoymY_jnolgeeflsrmy}~~}}{}}ytp|{{yx{}y{svwuw~{st|~x}|yywtuvzyofqxgWbjmnlfffiovro~~}||z}|wpp~~{|zz~~x}zqwutwzrv}|y{zyvsuvzwlfsvbXekmnlghhlrxrt~~|{{y}{slt~{}{}{xsqwssy~wqxy|xzxusuwzshhwn[]ikmmjgijpvwp~~}{zzz~xllz~}|}}~y{xotuqt|}ts{~x|yzvstuxwneovdZdjlnmiikntysu~{y{y{}phs~~{~~{y}ppvrrxxqwx~x{xtruvxrhhvk\ajjmnkhkmrwvq~|yyzy}vgm~~||}zrnutpu~|ss|{zyzzurtvxulfrp`_hjknmhjmquwq~~}zy{y|zhj{~~}{}{totups|~urz|yzy{vrtwwwngoqb`gjjmmiimptuq{~~yx{z{~}ihy~}{~~~}uotvqs{wqw~|yzx{wssxwwpimqdbgjimmihmosspz~zy|{{~~jiz~~}{~}~tpuvqs{wqw|{zzx{wstxxxqkmoeehjilliglnqpo{~zy||{~ij{~~}z}}{~~~uquwrs{xquzz{zx{wstyxxsmmnggijhkkiglnomnz~zy|}{~liy~~}{|}z~~vquwsrzzrsxy{zxzxttyyxupmlhijjhjkigknnlmy~{y{~{}oiw~~}{{}y~}yruwuqx}uquw{{yyzutxzxwrnjikkjihkjhinnlkv~}yz~|{viq~}}|{~y{}}|stvvrt}xqruz{zyzwsuzxwuqigkmjjgjkihmomir~~zy|~z}~lly}~}|}{x~{usuutqx}upsv~~zyyyttxzwwtmdinmjihjkikpnjm}~~}yz}|ytjq{}}}}~x~||xrsttrs{zsprz|zyywtuyxvvrgclpkihhkkjoqmju~{xz}yyolt|~}}~~|x~z|trsssqt}yros~~{{yyvtuxvvvpbcopjigilmmrrmm}~}yxy{wyymmu|~}~|{|y|yqqrqrpu~yqot}{{xxusuwuuul^eqpjihkmoousnq}|xwyyuzslov}}~{}{x~spqqpqqx~wooy|{zwwssuvtvse\ksniihloprvqnz{zwwxwv~|onqx~}~|{yyzoqqppqs{|slq}{{ywvssuttwn]`qrljijnqrvuos}{xwwxuysoptz~~{|zw~ppqpoqqw~xnmy{{zwwtstvtwsb[ltojjhmqstwqpzzwwwvvxpqqw}}|zx{tnrpopqt{{qjt{{{xvussutvwhYetrkjijpstvsn{{zxwvwu}zrsqt{}~}~{yzwnsqoorsy}siq{{{yvwtstuvyk[bttmjiinstusny|zywvwv|{tursy}~~}|zzyosroorsx~~uin}{{|zvwuttvwym\`ruoiihmrtsrmx}zzxwxx|zvwtrx~}}|~}{|yptspossw~~tin}zz|zvxvttwyzl]bsvoihgmqsroly}{{ywxz~yxyurw}}}{~|xrutppstw}~shn|zz{zvxwuuxzzl^brvpihfkqspmky~{|zxx{}~yy{wru{}|{~|zsuvqpstu{ujly{y{{wxxvux{{n`apwrjhfjpsplkw~{}{xx|}~yz}yrty}|~{}}{tuwrprutyxljv}|x{{xwyvuw|{rb`kwtmhghnrqlkt|||yx{~}xy}|uqv||}{|~vtwtppttv}|pjrz|yz{zwyxuu{|vgafsvpjhglrsmkq~~{}zxy~}yv}~yqsy}||{wuuvqprutyulmvzzy{zxwzvux}ymbclvtnihipspknz~|||xw{~ytx}upt{}~{zuuutppttu{|qmrxzzy{ywxxuuz|sgbfpwrkihlstnlu~{|zww||ts|{rqv|}}}~vtturoqttv}ypotwzyzzyvxwtu|ynddhrvrkjjoutnp|~}z{yuw|xqs}yqqv}}yststpoqusw}wqquwzyzzxvxusv|vjdeisvqlklrwunu~|yzwtw|tnt~wpqx}}urtrroorusy~ursuwzxzywvwtsx{ofdglvvplmovxsp}}~}zyyuuyynnz|uos{wqssrqnpstt{ztttuxzxyxvvvrtzviefhowtomorxwqv~}~|yywtwzrjsyqpv~~{qqtrrporusw}}vvtsuzxxxwuwtsxymeghkuwrnoqvxsr|}}zxxtuzujn||uor{rptsqqoqttt{}yvwrsxyxyxvvusvzqfgiipwtooqtxuq}}|}|yyvuywkky~xppx~spttqrppstsx{zwxrquywxxwvvtvzsghjimvupoqswtq{~|}}zywvyxljwyqou}uoturrqprtsvzzxysosyxxyxvwuwzthhkjktvqoqqusqz|}}{yywzxmjwzrnt~}upuvrrqqrtruxyyzsnryxxyyvwwxzshjmjktuqnppsqp{|~~|zzy{wlkyzrms}}}tqvwssrqrsrtwyz{rmqxxxzzwxxzyrhknkjruqnpoqop{|~}z{z{wmkx|tmq{}~vqvxtrsqqsrrux{|tlovxwzzxxyzzsjkoliouropoonoz|}~z{{|wnkv}vmox}yqvxvrtrqrsqsw|}vlmtxwz{ywz{zskkpnjltspppnmnx~||{||ypkq~ypmt~}}|rsxwsssqqsqqt{~zokpwwx{zwy{{umjopkiqtrpqommu|~}z|}zqkny|tmpy}~~uqwxurtrqqrorw~uklsxwz{yw{{xokmqnjlttrqqmmr~~|~{z}|ulkr}yqms}~}}zrswwsstqprqos|{pjnuwx{zwy|zrklpqlioutsspmoy||}z{}yojmv~woow}|uqtwursspproovxmjovwx{ywz|wmjmqpkiqvvttpns{|~|x{|ukinw}vopy~~||sptvtqsrpprnpxwljpvvxzxvz{tjknrpkjsxwvvqpx~z||zx{zqgioy{uos||}wqptusqtqpqqmr}~sjkqvvyywv{xnhlproklvyyxvps}z|{xx|ujfls|yspv~{~rpqttrrsqpqomvzoilsvvyxvx{siiorrmjpy{zxtpz{z{zwzzoeiow~}wrs{||vqpstsqsrpppmq}tkjouuxyww{wlgnqspklv{|zwqv}y{zxy{rgfns|zuqw~~~{zrqqtsrrtpopnmyxoikruvyxwzzogkqrrmjqz|{xrr~zz{zy|viemrx|wrt{~|~srrstsrtqoonlvzqijpuvxyxy{qgjrssnjnx|{xsq~|z{zz|wjelrw~}xssy~}}utsstsrtronmks|sjinuvxyyz|rhjrssojkv||xsp|}z||{|xjflsv}~xtrw{|vutsttrsromlks|skhmuwxzz{|qhkstsojju|{vqo}~{|}}}wjgntv}~xtquy{xwusuussrnlkkt{skhmuwy{||{qhlttrojit{zupo}|}~~}xkgntv{~yuqsvzyxwtuutssoljjq~}tmhksxx{}}|riltuspjhpzzupo{}|~~ymhmtuzzvqqtx{yxtuutssoljjp|~vohjqwx{}~|tjksvsqkhmx{wpox|~zphlsvw}|xtpqv}}zyvtuussqliimwyrkhmuxy}}wljpvurniit{yrou|}|sijpuvz~~zvqpsz{zxttutrrnjhls}}uohjqwx{~ypimtwspkhny{vqs~|~vmhmsuv|}yuppu}{zvsuusrqlhioxzslgltwx||tljpvvrojjs|ztrz~}|zqiiotuw}|ytoqz{zytsuurrojhls{~xqjgmuvy}xojlrwuqnjlw}ztw{{vmhjptux}}zsor|{zwssutrrnihnu|}wpignuvy~}tljntwtrnlozzv|~z{~|rjgkquuy~~zspu~|{zyvrsutqqmhjqx}|unghouvz~zojkpuwtqnms~zy}}y|~wlhinruu{}xqp|zzzzxtqtusqpjhmuz~~yrkfjquw|}ukjmswwsqnox~z~zz}{phhkpttw}}uotzxz{ywrrutqqmhjsx{}|vohgmsuz~ymjlquxurpos}{}~}y|}tihjnruu{ypp}vy{{xtrturpoihpwy|}yrkfipuw}|qilotxwsqpqy}|~{{~wkgjmqttx~{royuw{|yvrtuspojhmvxz|ztmghntw|}sikpswxsrppu}}|~||~ylgknpttv}|tmvuu{}zwssutpokglvxy|{uoigmtw|}tjkpsvxtqpps{||~}ymglnpstu{|sluuu|~{xtsutpnjgluxx{{vpjhmtx}}tjlqtvwtqpoqxz{~~ylhmpqstt{{rluuu}|yutusomjgmvwvz{vpkhmty}}sjmstvwspoopvx{yminpqrtsy{rktvt}~zwtutpljgltwuy{xqlilsz}}tkmstuwtpponsw{~zoinqqrssw|slrws|{xuutpljgkswtwzysnijqy}}ullsuuvupponpuz~|qjlrqqssu|~vnozrw}zvttrmjhjqvutyzvqlinv|}xokquuuvrppnmrx~~~tlkqrqqssyyqnyss~~{xttsojiiotvswzxsojkrz|zqlnuuuvuqqpnov~}xnjmrqqrsu}~upsxpv}zwttqliilrutsxzvqmilu|{umlqvuuvtqrpmqz}{rkkprqqrsw{sqz~rpz|zusspjikotustxyupkinx{wplmtvuuvsrrpnt}}wnjkqrpqstzztuyppz~{yusroiimquurtxytojioxytnlnuvvvwtttqpx|}|skilqrpqsu|zvzunq{}{ytsrmikosutruxwrnhiqywpllqvwvwwuvtqr~~{~wnijnrqprtwxy{pmt}~|{wsspkinrtusrvxvqlhktxrmknsxwwxxvwtqv|{}qjilprppsu{|y}tmox~}|zurqmilqttsqswxsoihowtnkmqwxwwywwvrr~{}tkikosqpquxz}wnnt}~}{xsrojjpstsrquxvqlhltvnkmpuxwwxywwspy|{xliknrrpptw|{}zpnqz~~|ztqokiostsrpswwsoijrvojlptxxvwyxwspu}{{milnqspprvz|}{rnqx~~}{uqokinttrqprwxupkjpuojlqtxxvwyxvsos~|}niloqspoquy~|}|spqw~~{vqnkinttrqpqvyvqmkquoimrtwxvvxwurnr~||njnpqspoquw|~|~{sqrx~{vpnjintsqppqvywrnmqtminsuwxuuwwtplq}}okoqrspnptvz|||trrw~|wpmjintspoopuyxtpnqsnimsuwxuuwwsplo~~qkorrsqnosux{|ussu}}xqmjimttpoootyzuroprnimsvvxutvwtpln}~tlnrrrronruvy{wtsty~zsmkjlruqnooqwzxtqopnijqvvwwtuxvqmmw~ymmqsrrpnptuwz~zuttv~|vokjkpurnnoouzzvsponjhouwwxutwxsols~~rlosrrrnnruuy}vttsx~zsljknsupmnnpwzxuromjgjrvwwwuvywrnp{~~xnlqsrrpnptuvzzttst{}xpkjmputomnnrxzwtqnjhgmtwwxwvxzvqou}~tlmrsqrpoquvw}wssrt{|wokkorvsnmnnryzvtplgegnuxwxwwz{wrrz~|~{pknrsqqppsvvy}tssrt|{vnkmqtvqmlmnsyyusniddhpwxxyxy||vsv}|unlpsrqqpquww|xrsrrv~ysllosutollmovyxtrkebektxxxzy{}{uu|~||{qlmrsqqqqswwx|trsrrz|woknruurmklmqxyvtofachpwyxzzz}}xuy}{tnmqssqrqruwv}~wssrrv~}yrlmruusnkkmovyxuria`fmuyyyzz|}{ux~|}vpnossqqqqsvvyytssrt|~ztmlquutokjlnsyzwtla^dksyyxzz{}|vw}}xqoostrpqqruuwyvttrszzunlpuuspkjlnrx{yvnb]cjrxyxyzz{{vv~}yrqpstrpqqqstuzwuussx~zuokpuuspkjlnry|zwob]ckrxywxzzzzuvysrqttroqpprrtzyvvtsx~ztnlquurokilosy}|xoa]clrxywwyyyxtvyttsttroppppqs{zwvttw~~ztolquuqokikory}~ypb\bkqwywvyxxwtuzuutturoopoopr~{{ywutv|~zuplpuuqolijnqx}{sd\ajpvxwvxxwvtu~|vvvtuspoponoqz|{{xvtuy~{vrnotvromiimpu|~vi]^gotxxvwywvuu{~xvwuutqnppnmpv~{|ywutv||xspnsvtpnjikoryyn`\cmrvxwvyxwuuy~yvwwuusooqomns~{{{wvutx|zvrpqvvrnmiimqt|~tg\]gosxxvxzxvvx~|wvxvttropqnmpx|z|zwutuy|xtrqtwupmkhjnqv}zna[`kquxxwz{xwx}~~~}xvwxvtsqoqqons}zy{xvutuz{xtsruxtomjhjoqw~wj^[blqvyyx||yx{}}|yvuwxutsqprroov~xyzwuutuzzwtttwwsnlihjoqx~}sf\\dnswzyz~}zz|}}yvuvxxutsqqsqor|zwzzvuttvzyvuuvxvqlkhhlps{ymaZ_hptyzz||z}|}~}zutuwywttrqssppw~wxzxuuttxzwuvvwxtnkiginqv}}sf]\cmswz{{~{|~|}{ustwyyvtsrrtqosywzzvuusuyxvvxxxupkjhhlps{~wj`\`iquy{{}|{{~}~}vrtvyzxttsqsroq{{wy{xvutswxvvxxxwqljhgjory~zmb]^foswz{|}z|}~|~vqsvy{yussrrrooy~|xy{yvvtruxvvyyxwrljihjorw~|od^^enrvy{|~}z}}}|wprvy{zussrqqnnx~}yz|{wvtrsvvvyzxwrmjihjosx~|pd`_dmrtxz{|{y}~~{worw{|{usrqppmmx~}z{}|xwtqruuvz{xvrlijikoty~{oea`emqswzzzzw|{worx|}{vrrqoolmx~~{|}}ywtqptuvz|xvrmijikotx~|qfbadkqrvyyyyw{{xoqx|}|wrrqonllv~~}|}~zwuqoruvz|yurmijjkntx}|rgdbdjpquxyxxwz|~zpow|~}ysrqomlks~~}}}~|xvroptvy}{vsojijjmsw{}vkeccgnqswyxxwy~}}rms{~~|urrpmlkp}~}}}~~zwsonrux|}xtplhjjlpvy|xnfedekpquyywxx}vmox}~}ysrrollmw~|}}}~|xuqmnsw{~|vrnjikkmsxzzsjfedgmprxzyxy|~~{pkrz}~|vrsqnlmr}~|}}}~{wtolpuz~ztqlhikkouxyvngfeeioquz{yy{~~vlkt{~~{ussqmmow}{|}|}}zvrnlqw|yspkhikkouxwslgfffjprw||z{~|~|qjku|~}{uttrnnr||y{|||}yuqmlry~xrojgjjkpuvupjggfgkqsy}}{}{wmimx}~}zuutqnqw}}{y|||}|wtplmv|}uqmhgjjlrvtrmighghnrv|~}||||qiiq{~~|xuutoot}|~~xz|||}zurmkpy~yrokgijjnturnkhihgkpty~~|{ukhlw}~}{vuuqnrz~|zx|||}}wsokmv}}tplhgjjlrurnljijhinsv|}}{}xnhjr|~~|xuusopx|{x{}|}~ytplks|wpmjgjklpurnlkjkihkquz~}|}|zoijpz~~}yuusoow}|y{~}}~{tpljp{yqnjhillptsmllkkkhjosx}}{~||pjjoy~~}zvtsonv}z{~~}~|upliozzqnkiilmptslklllkhinrv{{z}|pkkpy~~|zusrnmw}{|~~|tokinzyqmkijmnqtrlkmmmlhhlquyzy{pllpy~|zurpmmw}|}~~|tojimyzqmljjnoqtrkkmnnmigkpswyx~~qllpw~~|{vrpmlu}}}~}vokhlw{snlkknpqtrkjmponjgiorvxx}smmou}~}{xspmls}}~~xpkijs~}unmlkmpqssmhlppolggmqswx{wnmnrz~}|zuqnlp|}}~~~{sliioz~ypmllloqrrnhjoqpnifjpruwz|pmnpv}~|{xromox|{}~~}wojilt|unlllmqrrojglqqpmhgmqsvy~vmmorx~}|{vqonsz{}~~{tljjoy~zrmllloqqplfhnrqokgiorux|}qlmosz~}|{uqoqx{x{}~}yqkjlr|}xplllloqpmiehpsqpkhkqtvzynkmpt{~}}{uqqt}~ww{}}~|xpkknt~|wolllkopnkfdjqtrpkimsux}~tlknqu|~}}{trsy~ztw{}~}{umklpx~ztmllklpolgdemstrojkpuv{xpkmorx}~~~yssv~}{uty|}|yrlkns||xplllknpmhdchqutrnjmsvx|slloqt{~~~|vsu|~{vrv{}~}zunknrx}ytmlmllpoidcenuvspkkpuv|~uoknpsx}~~~ystz{wssz}~~{wpkmqu}zvolmmlopjdbdjswtqmknsuyvqlnqrv|~~~zstz{vssy}~{wrlmpu{{wqmmnmoqkdbdirwurnjlqtwwrnnqrtz}}}{tsy{vsrx}{wrllptz{wrmnonoqkdadirwvrnjkoruwsooqsty|}|zsrz{ussy~zvrlmqty~zwsnopoprkcadirwvqnjjmqt~~wspprssx||{xrrz{ustyzvqlmqtx~}zwtopqqqrkcaeirxvqnjhkor}~xtrprssv{|{ysrz|ustx{vrmlqtw|}zwuqprrqrlc`dipwwrojhimpz~~yutqssstz{{yuqxurtw}|vrolptvz}{xvsprsrrne_chnvxtplhhkov}|utsrssrw{{ywsvwqru{~xsqmosuw{{xvuqqssrpg``fksxwqnjgins|~wttrssrtz{zxut}|rptw~{uronruvy|zwvtqrsrpkb^cinvyupmihkpy|ztttrssrv{{yxuyvopty~xsqoptvwy{xvusqssqnf^_ekrxxspmiint||vtusssrrx|{yxw~}qmquz}vrqpruwwzzwvurqssokc]_gmtyxsqmjkqy{||tstsssrsy}|zzzymlquz{urrqswwwyyvuurqsrmh`\`hnuzxtrnkmt~~z|xrsusssrt{}|{{~sjlrv|ytrsruwwvywuutqrspjc]]ckqxzwtrmlpy~|y}}trtusssrw}}||~zminsx~}vssttwwvwxvuusqsrmf_[_gntzzwtqmmu~yzwrsvtssrtz}||~rikqu{~ytsutvxvuwvuuurrsoga\]dlqx{yusnlq|~{y}ztsuvssrrw}}|~wkintx~{usuvvxwtuwuuvtrsqib]\ajpuzzwuqlnx}}y{{usuwtssru{|{}ymhmsw~~{vsuwvxwttvuuwustrkb^\`hotyzwuqlmv}y{{vtuxussrsy|{|{oilsw|}{vstwvwwtruuvwwtuslb^\_gosxzxtqlkt|z{{wuvxvsrqrwzz|{ojmtw}}zvsuxwwvsquvvxxuvtkb^]`hoswywspjjt|{|{xvwywsrqqvyy|{pkntx}|zvsuxwwvrptvwyzwvtla^^`horvywsojir~|~||{ywwzxsrpptxx{}rlmtx||yvstxxwvspruwy{ywumb^^`fnquxwspkhp~|}}||zxxzytqpprvwzummrwz}ywttxywvsppuvy{{xvpd^^`dlqswxuplhm|~}||~~zyxy{wrqpptwyxplpvy}~ywutwzxvtpnrvx{|ywrh_^_bipruxwrnjkv~}|}}zzyy{ysqpoqvx}{smmrxz{wvtvy{wurnotwy||xumb]_aemqswyuqmjp}}}|~{xyyz{wrqppswzvplotx|~ywvux{zwtpmpvx{}zwqg^]`bhortyytpmmx~|}|xxyyzzuqqppty~|snlouy||wvvwz}zvsomqvx{}yunc\]adjqsvzytqnq~}}~~||vxyyzztqqqqv{xqmlpvy}~{wwwx{}yurmlrvy{|xrj`[^aelrtx|zurqv|}}{yuxyy{ytrrqrx~tpllqwy}}yvxxz}}xtplmswy|{uoe][`chosuz}zust}||||vvyyz{xsrrqt{yqnlmtxz}|wvyz||vrnknuxz|yrja[]bekqtw}}xuux}}~{~~xuxzz{zursrrx~tpmlpwy||yvxz{~~xsokkrwy||umd][`dhotu{~{vvx|||~yuvz{{{xssrqt}wqolntxz|zvwz{}{tpljovx{}xof_[^dglrux}}xvx~~|~|~zvuz|{{ytrrqrzzsqnnsxyzzwvz|}|upmknuy{}zqg`]_dhlptw{|yvx~}~~~zwwz|||zvsrqrx{urqpswyyywvy|~}wqmlnty|}{sic`aeilpsvz{ywy~~~zwxz|}|zvsrqrx|wtsrtwxxxwvy|~~|wqnlouz|}{sjdbcgjmpruxyxwy~}yxy{}}|yvsqprx|xvttuwxxwvwy|~~{vqnmpuz}~{skecehkmoruwxxwz}zyz{}~|zwtrqrw}zxvuuwxxwvwy|}~|wsonpuy}~{umgefilnortwxxwz~zyz|}~|zxusqrv~{ywvvwwwwvwy{}~|xtpoptx|~|voighjlnpqtvwxxz~~{yz{}~}{ywtrru||zywvvwwwvvx{}~}zvrppsw{}}yrlihjlnoqsuwxyz~|zz{}~~|zxvtstz}{zxwwwwwvwxz|~}{xtqqruy|}zuokjklnpqsuwxyz}}zyz|}~}|zxvttw~~|{zxwwwwwvwy{}~}zvsqrtwz|{xrmkklnpqrtvxy{}~{yy{|}~}{zxvuv{}|{yxwwwwwwxz|}}|yusqrtwz{zvqmllnpqrtvxy{||yxy{|}}}|zywvx}}|{zyxwwwwwwy{}~}{xusrsuxz{ytpmmnoqrtuwy{|~}zyxz{}~}}|zyxx{~|{{zyxwwwwwxz|}~}zwusstvxzzwsonnoqrtuwy{|~~|yxyz|}~}}|zyxz}~|{{{zyxwwwwxy{}}}|yvtssuwyzxuroopqrtuvxz|~}zyyz{}~~}}|zyz|}{{{zyxxwwwwxz|}}|zxutttvxzywsqppqstuvxz{}}{yyz{}}~~}|{zz{}|{{{zyyxwwwxz{}}}{ywuttvwyyxurqqrstuvxy{}~|zyz{|}~~}}|{z{~}||||{zyxxwwxy{|}}{ywvuuvwyyxvsrrrstuvxy{|~|zyz{|}~~}}|{z{~~||||{zyxxwwxy{|}}{zxvuuvwyyxvtsrstuvvxyz|~}{zz{}}~~}}|{{{~~}||}|{zyxxxxy{|}|{zxwvvwxyyxvtssttuvvwyz{}}{z{|}}~~}}|{{|~~}}}}|{zyxxxxz{|}|{zxwwwwxyyxwutttuuvwwxz{}}{{{|}~~~}}|{{|~~}}}}}|{yxxxxy{|||{zyxwwwxyzywvuuuuvvwwxy{}~|{{|}~~~}}|{{|~~}}}}}|{zyxxxy{|||{zyxxwxxyzyxvuuuvvvwxxyz|~|{{|}~~~~}}|||}}}}}}}|zyyxxyz||||{zyxxxxyyyxwvvvvvwwxxyz|~}|||}}~~~}}|||}~}}}}}|{zyxxyz{|||{zyyxxxyyyyxwvvvwwwxyyz{}~||||}~~~~}}}|}~~}}}}}}|{zyyyz{||||{zyyxxyyyyxwwwwwwxxyyz{}}|||}}~~~~}}}}~~}}}}}}|{zyyyyz{|||{{zyyxxyyyyxwwwwxxxyyz{|~~}|||}}~~~~~}}~~}||}}}|{zyyyz{||||{zzyyyyyyyyxxwxxxyyzz{|}~||||}~~~~~~~~~~}|||}}}|{zzyzz{||||{zzyyyyyyyxxxxxyyyzz{|}~}|||}}~~~~~~~~~}||}}}||{zzzz{||||{{zzyyyyyyyxxxxyyzz{{|}~~}||}}~~~~~~~~~}|||}}}|{{zzzz{||||{{zzyyyyyyyyyyyyzz{{|}~~}||}}~~~~~}}||}}}||{zzzz{||||{{zzzyyyyyyyyyyzzz{{|}}~}|}}~~~~~}}||}}}}|{{zzz{||||{{{zzzzzzyyyyyyzzz{{||}~~}}}}~~~~~}}}}}}}||{zz{{|||||{{zzzzzzzyyyyzzz{{{||}~~}}}}~~~~~~~~}}}}}}}||{{{{{|||||{{{{zzzzzzyyzzzz{{{||}~~~}}~~~~~~~~~}}}}}}}||{{{{{|||||{{{{{zzzzzzzzzz{{{{||}~~}}~~~~~~~~~~~}}}}}}}|{{{{{||||||{{{{{{zzzzzzz{{{{{||}~~~~~~~~~~~~~~}}}}}}}||{{{||||||||{{{{{{zzzzz{{{{{{||}~~~~~~~~~~~~~~}}}}}}}||{{||||||||{{{{{{{zzzz{{{{{|||}}~~~~~~~~~~~~}}}}}}||{{||||||||||{{{{{zzzz{{{{||||}}~~~~~~~~~~~}}}}}}}||||||||||||||{{{{{{z{{{{|||||}}~~~~~~~~~}}}}}}}}|||||||||||||||{{{{{{{{{||||}}}~~~~~~~~~}}}}}}}}||||||||||||||||{{{{{{{{||||}}}~~~~~~~~~~}}}}}}}}||||||||||||||||{{{{{{{|||}}}}~~~~~~~~~~}}}}}}}}||||||}||||||||||{{{{{|||}}}}~~~~~~~~~}}}}}}}}}|||||}}|||||||||{{{{{|||}}}}~~~~~~~~}}}}}}}}}|||}}}}||||||||||{{{|||}}}~~~~~~~~~}}}}}}}}}||}}}}}||||||||||{||||}}}~~~~~~~~~}}}}}}}}}}}}}}}}|||||||||||||}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}|||||||||||}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}||||||||}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|||||||}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}|||||}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}||||}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}|||}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/SprPoP/dist/MUS/mus.idx b/applications/SprPoP/dist/MUS/mus.idx deleted file mode 100644 index 9da64422f19d3d178c425d1cd3d9649295ed2e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmWIW^)$3(VP|BZ6EI}F#&Cq8iy?KbXS%09QI(Y{w7yzvtwm@ZsYO+Ns(YGEE`i+z z_$Yi69*>$Ku>S}w77Gv^Rhf|)_g;5%Wo~ZgnC0*O)!+Sh|IOe0&ENd(-~7#g|KH;4 z@9@>Ymy54QeEnbe`oHn@w||T4_`pC`yc=JfB*0Q+d@)+L=E* z-xciTKmOS2HZQ*W-M{(W?Zn(XpEj#yp3Sy*r~M|gOxF=Pk(Z?j)w%ld;`(MF>y{-A zM}zj|4;MXWmC56YF-^GQ+m`|EMNsW$7yqSP!;HbW<|4W>KR9YyMQ7*=w8%LvPd z_m^$G`^#Vc^xOOW-7;iZ)m<(FGw=nTHuBsOSeof|CX8&_!leJHBkO$gqQ{GqUVlJI zhNUY(7SGq2!Arq(u{mraj#2ewKAW$$k*ZjpZTptQ$w3;5oyJIaEZvBgzV9fCIvVle zVzVgrv#Q8qOXK?^%??+_gte0}Ok&TnXxX#uc|4y6$#Pmn+wHV;qpY46mO7whCoZOm z%8V)5)||i=1zEBqUz3FKc*1C27-Us!E26AOieD`kWnijkOlLS63$kjsfur%Prl}%5 z9x$rycyScjw&$3dVtRN*k)av*SrTO3&>h>*4Yx=gJMfKI&|O=TBj2#nX%^X07P(g z9oKU)G0+^#vP{&j<8#*!&>N(D$P}WXf-IwW%R!kYT4C58#6Y`EJcJS)+a^UrNDni` zu~8WcGcigA=?h%PKtj3@vfHTK$Frnj2mOSfZM>j8&H~~o!?bLSIU4Ms7?ekTCUudU zNV_31I)Kz+qx(^viS{~{fe*>OwuRf!7JT6&+VLTEB7zxY<(n<(}W_)|$hV$*`Cg3^zj$S;!&^u@8Pz8kf)+gjM zQZQb4%!Rz9X(n#KvycMPqxGaJ1LH$(BSoAqp2Z~9qkPgE3rY$ z0ukIKLywyFFcBv;5#|I3S1@XzvpyF@OZZ}`@FBJ;N*&a#pU$l4%% zhM&GoSu)q~I`kwbe`xomJFtli{)sNQNaa^te112p(|{3 zorhm_9eMzh)6{eeO3yQ)fE*tS=wD_(>0PWb4LUPQJWUjJFT{$*q9x^FWbo#r8qXR(AKh~*}++46)QdREnU_BMRb&fQ6=lnvlP@7MWilhwJ0#q zz%a6*Nj(VYsH*8EXc$C;a&w{A&@<@BZ(6`qRHEW+RZ`F0WI@+Dq&IbFX^1TwXpf_a zstwJB`K{|jE0Nws=QYXwqAye(%?UjN+L?5jE-NS- z+8vver^~7x#*t@9qUI!d0KI5J9^Xez=!*c_3D3HsXaq&>h!eqy(O;GV^^5JsCSw~q z3I-*KOo3O>mN;}ohBcx*Hbl{ck}*{)#3scHW|SrnQdM;i9fGmK_7j;3h62CInj6Nk zZ)gw}+Y4qFx)M7OhB1V2suN+)mKniHidg4)-H+lx*Pw1K(!o&@1u839X`N~;t6@L$ zv9BqT6=46-4L=T5QT58om&S}4=LtqyQ)S(c154B0D9}a4%L`AOum;(197DmNV#u+v zxe~TK%t_N9)nJbytmNC+*is2yJkriN8pqW`>W1F}9 zAkG4nr{pltJ&D(X7>0^ntU_r#bdnOAc4SGc5)@^m2!_ z^JKv!Bc}&d<#1!pj?)NRu_g;Tdfk#`H?lEc>AWzgu>{$$Ntsw!ZdOF5YNDqkJ(|x0 zX+)b@k&xA+3bJ41z9w6tBMDl(nA*&McJm@~(NhwwL`CK(f*m=cV5aL@r~9H`5TWoW zXXn$z64f9vCE2M~sXU>ys7SE-HAPT-NUVxR6zYQPR#TrJF=m2CU8n+)NNh`zlb~Z{ zzb+kq%vlj^B}gnuc3Q-ytjC#!YKv86G7~w-a?Au%!R=)cXp)uqvY>^FnFERKG!L
    исходная постановка (путь A на AY) - -Полный разбор с замерами — [`../docs/sound_plan.md`](sound_plan.md). -Коротко, почему это оказалось дешевле, чем выглядело: - -- эффекты уже лежат **8-битным PCM на 11 000 Гц**, а у CBL есть режим - 10 937,5 Гц (расхождение 0,6 %) и ровно тот же формат сэмпла — - **играются как есть, без конверсии**; 31 звук, 103 941 Б ≈ 6,3 - EMM-страницы; -- музыка есть **нотами PC-спикера, 7 КБ на всю игру**, причём нота задана - прямо в ГЕРЦАХ — пересчёт в период AY это одно деление; MIDI разбирать - не нужно; -- AY и COVOX сведены в один ЦАП, поэтому играют одновременно; -- отдельный таймер не нужен: секвенсор музыки двигает CBL-callback - (11,7 мс), а короче 12 мс во всей музыке всего 2 ноты из 1469. - -Фазы З1..З5 и список «проверить артефактом до кодинга» — в доке. - -
    - -### MOB-SPR-EMM. Композит падающего куска — в EMM (1284 Б W2) - -`mob_spr` (`pop_room.c`) — самый крупный буфер в W2: 4 + 64*20 байт под -композит падающей плиты. Это половина нынешнего дефицита W2. - -**В БАНК ЕГО ПЕРЕНЕСТИ НЕЛЬЗЯ** (разобрано 2026-08-26). Цепочка рисования -— `pop_room` (банк 7) -> `pop_mem_b` (банк 5) -> `blit_b_clip` (резидент), и -трамплин на `pop_mem_b` переключает W3. Указатель на данные банка 7 после -этого показывает на страницу банка 5: блит нарисует мусор, причём молча. -`--bank-data` вдобавок действует на весь модуль, а `mobs` из того же файла -читают снаружи. - -**ЧТО РАБОТАЕТ — EMM-страница с маппингом в W0.** W0 не переключают ни -трамплин (он трогает только W3), ни звуковой ISR (насос живёт в W3), значит -адрес `0x0000+off` валиден и в банке 7, и в банке 5, и в резиденте — ровно -как у атласных спрайтов, которые тем же блитом и рисуются. `blit_b_clip` -окно не трогает, маппингом занимается вызывающий. - -**Цена.** `mob_spr_build` читает три части через `gfx_w0_map(a->page)`, а -приёмник должен быть в том же окне — держать оба нельзя. Сборку придётся -вести построчно: строка части в 64-байтовый буфер на стеке, перемаппить -окно, записать. Вызывается это лишь на смену тайлсета. Плюс -`gfx_w0_map`/`unmap` вокруг каждого куска — около 1350 тактов, при шести -кусках меньше 2 % кадра. - -**Чем подтверждать.** Падающие плиты в комнате 1.2 и каскад уровня 13: -ошибка проявится не крашем, а мусором на месте куска. - -**Дешёвая половинчатая мера** (если 1284 Б не нужны целиком): буфер объявлен -с запасом 64x20, фактический композит около 58x19 — точные константы дают -~180 байт без единого риска. - -### PAL-ARC. Палитры — в архив своей группы (полишинг) - -Файлов палитр в игре шесть: `KID\kid.pal` (1024 Б), `PV\story.pal`, -`PV\pv.pal` (по 1024), `BG\pop_tile.pal`, `BG\pal_tile.pal` (по 128), -`TITLE\title.pal` (64). Всё, что лежит в `poc/res/tiles/` (36 файлов) и -`bg/pop_bg.pal`, на образ не попадает и кодом не читается — осадок ранних -экспериментов, его стоит просто убрать. - -**Что предлагается.** Класть палитру в архив ТОЙ ЖЕ группы, где её -графика: `kid.pal` → `kid.arc`, оба `*_tile.pal` → `bg.arc`, `title.pal` → -`title.arc`, `story`/`pv.pal` → `pv.arc`. Тогда правило одно на все -ресурсы («файл лежит в архиве своей группы»), и уходят последние шесть -открытий: `pop_bg_load` берёт тайлсет и палитру за одно открытие, заставка -так же. Отдельно ценно, что `kid.pal` перестанет читаться своим `open` на -КАЖДОЙ загрузке уровня (её перезаливает `pop_pal_game_load`). - -**Чего это стоит.** Элемент архива читается только в EMM-страницу, -поэтому нужна маленькая функция «палитра из страницы»: `bank_read` по 256 -байт в буфер и четыре `gfx_pal_load`. Буфер уже есть — `pop_pal_buf` по -0x4000. - -**Что теряется.** Возможность подменить палитру файлом рядом с игрой -(`pal_file_load` сейчас откатывается на `a:\kid.pal`). Решить явно: -либо файл остаётся приоритетным и архив — запасным путём, либо fallback -выбрасывается. - -**Почему НЕ отдельная папка `PAL\` и не один общий атлас палитр.** Папка -не уменьшает числа файлов и рвёт связь «палитра ↔ её графика». Общий -атлас экономил бы открытия только при загрузке всех палитр разом, а они -нужны в разное время: `kid.pal` — каждому уровню, заставочные — только -заставке. - -### HOF-ENTRY. Таблица рекордов — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Оба показа оригинала: между credits и attract-demo и хвостом -> `end_sequence` (с вводом имени, паузой 120 тиков и возвратом на титульную -> картинку). Экран — рамка story с логотипом, время в формате `59:43`, -> строки с тенью, мигающий курсор. Ожидание конца победной темы переехало -> за таблицу, как в оригинале. Протокол и грабли — -> [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#hof-entry). - -### MUS-WON. Финальная тема — кольцевой стриминг — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Кольцо из шести страниц (96 КБ = 9 с), насос заворачивается -> по `pop_mus_ring`, подкачка в `pop_music_service` по дистанции -> «проиграно / прочитано». Разбор и грабли — `../docs/sound_plan.md` §8. -> Проверено в MAME на сборке `LEVEL=14`. - -
    исходная постановка - -Трек 56 (`won`, 115 с) — это 1,2 МБ, 78 страниц EMM. Ни в `POP_MUS_PAGES` -(20), ни в разумный бюджет памяти он не влезает, поэтому единственный -оставшийся неозвученным кусок игры — экран победы. - -**Что нужно.** Кольцевой буфер: держать в EMM несколько страниц (8 = 128 -КБ хватит с запасом — это 12 с звучания), а загрузчик дочитывает в те, что -насос уже прошёл. Курсор насоса (`pop_mus_pg`) при этом обязан -заворачиваться, а загрузчик — держать дистанцию от него и не обгонять на -круг. Чтение страницы 33 мс против 1,5 с её звучания — запаса вдоволь, -вся сложность в аккуратности индексов, а не в скорости. - -**Заодно.** Тот же механизм снимает ограничение `POP_MUS_PAGES` со всех -треков: сейчас каждый должен помещаться в память целиком. - -
    - -### ARC-ATLASES. Атласы — в архивы PBA1 — ЗАКРЫТА 2026-08-26 - -> **Сделано.** Восемь архивов: kid (58 атласов), pv (78), shadow (32), bg -> (25), title (20), guard (10), vizier (5), skel (4). На образе было 232 -> файла, стало 8 архивов плюс шесть палитр, `kid.ani` и таблицы уровней. -> Индексы печатает упаковщик (`ARC_<ГРУППА>_<ФАЙЛ>`), серии код проверяет -> статически. `atlas_load` разделён: `atlas_attach` принимает уже -> прочитанную страницу, поэтому чтение из архива не дублирует проверку -> магии. Грабля, стоившая отладки: имя архива обязано лежать в том же -> банке, что и код, который его читает, — строковый литерал из чужого банка -> после переключения W3 показывает на другие данные; поэтому наружу отдаётся -> НОМЕР архива (`pop_arc_open_id`). -> -> Остаток на будущее — палитры, см. [PAL-ARC](#pal-arc). - -
    исходная постановка - -**Что сделано.** Формат PBA1 и читатель готовы и работают на звуке: -`toolchain/pop_pack_arc.py` собирает архив (заголовок 512 Б, записи по 4 -байта — offset в секторах, size в байтах), `pop_arc.c` открывает его ОДИН -раз на группу и читает элементы прямо в EMM-страницы. Набор эффектов -уехал в `SND\snd.arc` целиком. - -**Что осталось.** Перевести остальные группы: `BG\` (25 файлов), `KID\` -(60), `GUARD/SKEL/VIZIER/SHADOW` (~50), `TITLE\` (21), `PV\` (75), -`LEVELS\` (15). Каждая группа — свой архив, потому что таблицу держит -вызывающий на стеке (4 байта на запись, у PV это 300 Б). - -**Зачем.** Замер 2026-08-25: `open` 51,4 мс против 32,6 мс на чтение 16 КБ. -Стартовая пачка ресурсов — около 142 файлов, то есть **7,3 с чистого -`open`**, который архивы убирают почти целиком. Второй мотив назван -пользователем прямо: «не нравится огромное кол-во файлов» в корне диска. - -**Чем подтверждать.** Время от запуска до первого кадра уровня (сейчас -меряется по MAME), число файлов на образе, и что каждая сцена по-прежнему -собирается при неполном диске (пути ошибок в `atlas_load`). - -
    - -### MEM. Следующий шаг разгрузки W1/W2 - -`pop_ctrl.c` уехал в банк 5 ([MEM-BANK5](TASKS_CLOSED.md#mem-bank5), куча -180 Б → 2298 Б; после снижения `--max-allocs` — 2751 Б). Следующий кандидат -по тому же критерию (**не размер, а частота вызова и отсутствие горячих -банк→банк переходов**) — **расщепление `pop_kid.c`**: холодная половина -(загрузка страниц спрайтов, `pop_kid_load`) в банк, движок кадров -(`load_frame`/`play_seq`, 2×/кадр) оставить в резиденте. - -Брать по факту нехватки места, не заранее. Таблица резидентного кода по -модулям и разбор, почему `pop_level.c` в банк НЕЛЬЗЯ, — в -[`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#mem-bank5). - ---- - -## Отложено осознанно (не брать, пока не появится причина) - -- **KBD-1, остаток** — «иногда при зажатом Shift стрелка всё-таки - пропускается» (ощущение пользователя, не замер: счётчики на 35 нажатиях - подряд потерь не показывают). Решение пользователя 2026-08-01: отложено до - финальной полировки. Где именно осталась дыра и что делать, если вернёмся, - — в [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#kbd-1) (там же весь протокол - замеров и список того, что делать НЕЛЬЗЯ). -- **Quickload (Shift+F9) и остальные читы SDLPoP** — оценка сделана - ([DBG-CHEATS](TASKS_CLOSED.md#dbg-cheats)), код не написан. Самое ценное и - самое дорогое: сериализация `Char` + `room_modif` всех комнат + trob'ов + - стражей (`levels_plan.md` §4), зато даёт воспроизводимый регресс «вот кадр, - где баг» вместо ручной подгонки позы. -- **Звук** (CBL-эффекты, Фаза 5 `PORT_PLAN.md`) — геймплей не блокирует. -- **Таймер уровня / HUD времени / меню / сохранения** — Фаза 6. -- **[T-1](BUGS_OPEN.md#t-1)** (пики: перерисовка по причине) — отдаётся почти - бесплатно после [T-2](BUGS_OPEN.md#t-2), отдельно не окупается. -- **Отключение мыши на время игры** и **замена PRNG** — - `../docs/ideas_backlog.md` (оба дают доли процента кадра). -- **OPT-1** (хирургический редрой шва) — решено НЕ делать, стоимость - транзиентная; разбор в [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md). -- **KEYS-D — осмотр соседних комнат** (`H`/`J`/`U`/`N` + `Ctrl+B`, фаза D - плана [`keys_plan.md`](keys_plan.md)). Отложено 2026-08-27 по решению - пользователя: полезно игроку, но дорого. - - **Почему дорого.** У SDLPoP это три строки, потому что там `drawn_room` - влияет ТОЛЬКО на отрисовку, а физика ходит через `get_tile(room, col, - row)` с явной комнатой. У нас наоборот: карта коллизий загружается для - ОТРИСОВАННОЙ комнаты — `room_fg`, `lcol_fg`, `rcol_fg`, `above_fg`, - `below_fg` — это ОДИН комплект на программу, и описывает он `cur_room` - (видно в `pop_qsave_restore_room`). Уведи `cur_room` к соседу, не трогая - `kid_room`, — и Кид начнёт считать столкновения по чужим тайлам: - провалится сквозь пол или упрётся в воздух. - - Задел уже стоит: `kid_room` заведён отдельно, `update_kid_render_dx()` - умеет сдвигать спрайт на ±140 при расхождении. Но `enter_room_side()` - пишет обе переменные разом — это и есть незакрытая часть S3 straddle - ([`room_model_plan.md`](room_model_plan.md)). - - **Два пути.** (1) Честный, как в оригинале: игра идёт, пока смотришь. - Требует развести владельца карты коллизий — правка ядра, дни работы и - риск для того, что уже работает. (2) Смотровой режим С ОСТАНОВКОЙ игры: - пока ничто не тикает, рассогласование не проявляется. Нужна третья, - облегчённая «нарисовать комнату, не трогая состояние»: `enter_room_side` - попутно делает `pop_guard_leave`/`pop_loose_leave_room`, а - `pop_qsave_restore_room` перетирает карту и зовёт `pop_loose_reset`. - Оценка — 150-250 байт в банк 8 и несколько часов с проверкой. - - Рекомендация: путь (2) плюс запись в `impl_diff.md` (у нас смотровой - режим останавливает игру, у оригинала — нет). Главный риск не в - отрисовке, а в ВОЗВРАТЕ: оставить движок с чужой картой или подтёртой - историей heal — класс багов из memory `pop_seam_room_model`. - - Обходной путь, который уже работает: `Ctrl++` / `Ctrl+−` — телепорт по - номеру комнаты. Задачу разбора багов он закрывает, задачу игрока - «подсмотреть» — нет. -- **KEYS-R — воскрешение Кида** (`R`, остаток фазы C). Отложено - 2026-08-27. Не ещё один чит, а правка модели смерти: SDLPoP ставит - `resurrect_time = 20` и `Kid.alive = -1`, после чего об этом обязаны - знать четыре места — убывание счётчика (`seg003:512`), пропуск пик и - челюстей (`seg000:1245`), пропуск урона мечом (`seg000:876`), - восстановление позы в `play_kid` (`seg006:1352`: `loadkid`, полное HP, - стойка, `Char.x += 8`, `set_start_pos`). То есть окно неуязвимости, - размазанное по кадровой цепочке, и оно задевает гейт «мёртв», про - который предупреждает memory `pop_level_restart_scope`. Наш - `Char.alive` использует конвенцию оригинала (`-1` жив), так что - портируется, — но точечно и с проверкой каждого гейта. -- **KEYS-F12 — скриншот в файл** (фаза E). Помечено пользователем как - «возможно, когда-то в следующих версиях»: 80 КБ на кадр и запись на диск - посреди игры. - ---- - -## OPT-BLIT — цена отрисовки: чистка кодогена (СЛЕДУЮЩАЯ СЕССИЯ) - -> **2026-08-17: контрольный замер снят, задача разложена по фазам.** -> Работа теперь ведётся в трёх документах, которые живут между сессиями — -> туда же писать результаты каждой правки: -> -> - [`../docs/perf_l13_room23.md`](perf_l13_room23.md) — сцена -> (каскад 6 плит, ур. 13 комната 23), рецепт воспроизведения, зонды, канал -> `clog`, сводка по кадрам, разбор габаритов спрайтов; -> - [`../docs/perf_green_phase.md`](perf_green_phase.md) — ЗЕЛЁНАЯ -> фаза: пик **805 000** при бюджете 400 000; позиции G1..G6; -> - [`../docs/perf_cyan_phase.md`](perf_cyan_phase.md) — ЦИАН фаза: -> пик **632 000** при бюджете 400 000; позиции C1..C7. -> -> Порядок работ: **G1** (окно клипа для запечки, −250..400 тыс.) → **G2** -> (расколоть `draw_tile` + лист для ряда −1) → **C1** (убрать избыточный -> `pop_cd_touch` в `mob_render`, −81 тыс.) → **G3/C3** (`blit_b_clip` на -> байтовые габариты) → **C4** (разобрать `pop_char_fore(KID)`: 1 722 → 150 978). -> -> Синяя секция (**142 830**) в бюджет укладывается — не трогаем. -> Ответ на вопрос про `uint8_t`: горячий путь можно переводить целиком, -> максимум по всем игровым атласам **56×63**; шире 255 только восемь -> полноэкранных подложек титров/сюжета (320×200 и т. п.), и они рисуются раз -> на экран — им отдельный банк / прямой libbgi. - -Открыто 2026-08-13 по итогам разбора зелёного блока. Контекст и все замеры -— в memory `blit_cost_model` и `sdcc_z80_stack_locals_hot_loop`, протокол -разбора — в коммитах `f89b7dd` / `b27b313` / этом. - -**Что уже сделано и чем это подтверждено.** Цена блита разложена регрессией -по 339 замерам: `такты = 8791 + 198,2*h + 5,96*(w*h)` (такты MAME = системный -клок ~21,5 МГц, НЕ такты Z80 — растровый кадр 430 000). Байт на пределе -железа (через акселератор дважды по 3 такта), строка ~198, а вот 8 791 на -ВЫЗОВ оказались нашим кодогеном: `pop_blit_b` держал `w`/`h` как `uint16_t`, -из-за чего вся функция уезжала в 14-байтовый стековый кадр и `w = img[0] | -(img[1] << 8)` разворачивалось в два десятка IX-относительных пересылок. -После перехода на байтовый габарит: noclip 13 679 -> 11 530 (-16%), -клипованный 18 853 -> 15 340 (-19%), `_CODE` -42 Б. - -### а) Где ещё `uint16_t` можно сделать `uint8_t` - -Габариты спрайтов и всё, что из них считается. Признак: значение заведомо -<= 255, но объявлено 16-битным «на всякий случай», и живёт в горячем пути. -Начинать с: -- `blit_b_clip` (`pop_tile.c`) — `dw`/`dh`/`sx`/`sy` объявлены `int`, хотя - ядра принимают `uint8_t`; это ВТОРОЙ по частоте путь (33% блитов). -- `pop_cd_touch` / `cd_cols_of` — четыре `int`-аргумента на вызов. -- `_gfx_blit_sprite_noclip` и обёртки libbgi: `stride` уже `uint16_t`, а - `w`/`h` — `uint8_t`; проверить, не расширяются ли они обратно у вызывающих. -- Кандидаты в `pop_room.c`/`pop_bg.c`: локальные `int x, dby, dmy` в - `draw_tile` — часть из них помещается в байт, но осторожно: координаты - бывают отрицательными. - -**Как проверять:** после каждой правки смотреть пролог функции в -`.sprinter-cc-SprPoP/*.asm` — исчез ли `ld iy,#-N / add iy,sp / ld sp,iy` -и сколько осталось `-N (ix)` в теле. - -### б) Проход по asm за неоптимальным IX-доступом - -Механическая проверка, даёт больше всего за единицу усилий: - -``` -grep -c "(ix)" .sprinter-cc-SprPoP/*.asm # где сгущается -grep -n "ld iy, #-" .sprinter-cc-SprPoP/*.asm # крупные стековые кадры -grep -n "pop.*\n.*pop.*\n.*push" ... # чтение спилла через стек -``` - -Признаки беды (все три встречались сегодня): пролог с `iy`-кадром больше -~6 байт; пары `pop bc / pop hl / push hl / push bc` в теле цикла (SDCC -читает спиленный указатель через стек вместо `ld l,-N(ix)`); повторный -пересчёт адреса `arr[i]` под каждое поле структуры. - -Приоритет по частоте вызова: `pop_blit_b` (сделан) -> `blit_b_clip` -> -`pop_cd_touch` -> `draw_tile` -> `pop_redraw_needed`. - -### Что НЕ делать (проверено сегодня, отрицательный результат) - -- **Не откладывать запекание на другой кадр.** Запекание пишет ОЗУ-копию - фона, из которой восстанавливает `heal`; отложенное даёт призрак плиты на - месте дыры. Идея «бюджет одного запекания на кадр» снята. -- **Не ускорять передачу пикселей** — она на пределе железа (3+3 такта на - байт), см. модель выше. -- **Не искать проблему в W3-скобке** (`_bgi_begin`/`_bgi_end` — по пять - инструкций) и не списывать разброс на прерывания (внутри размерной - группы разброс 3 такта, код прямолинейный). - -### Хвосты этой сессии - -- Пакетная пометка `pop_cd_touch` (`pop_cd_batch_begin/end`, скобка в - `draw_tile`) — сделана, но выигрыш замером НЕ подтверждён: в захваченных - кадрах скобка не срабатывала (блиты шли из холодной отрисовки комнаты). - Переснять на кадрах ЗАПЕКАНИЯ. **2026-08-17: цена НЕпакетного вызова - замерена — 4 502 такта, 28 % всей цены блита; в `mob_render` он к тому же - избыточен (см. C1).** -- Снять временную оснастку: `pop_dbg_m9..m16`, `pop_dbg_b1..b6`, - `pop_dbg_wh`, `pop_dbg_kind`, `pop_dbg_rdmax*`, `mame/v306/run_bridge_log.sh`. -- Цель по кадру не достигнута: зелёный пик был 792 012 при цели 400 000. - После сегодняшних правок не перемерян — начать сессию с контрольного - замера, а не с новых правок. - -**ГРАБЛИ (стоили сегодня часа):** проверять, что запущен РОВНО ОДИН MAME -(`pgrep -f mame.arm | wc -l`) — несколько экземпляров пишут в один -`error.log`, мост говорит с одним, замеры собираются с другого, и точки -«не срабатывают». И не обрезать `error.log`, пока MAME его держит: она -пишет по старому смещению, в начале остаётся дыра из нулей. diff --git a/applications/SprPoP/docs/full_game_plan.md b/applications/SprPoP/docs/full_game_plan.md deleted file mode 100644 index c19e5d5..0000000 --- a/applications/SprPoP/docs/full_game_plan.md +++ /dev/null @@ -1,367 +0,0 @@ -# От SprPoP к полноценной игре — сценарий и оболочка - -Статус: **частично реализовано; аудит обновлён 2026-08-24**. Ранее пометка -«завершены FG0–FG12» была неверной: для многих этапов уже есть код и -host-тесты, но их критерии приёмки на Sprinter ещё не выполнены. Фактический -статус каждого FG приведён в [§14](#14-этапы-реализации). - -Этот документ описывает превращение текущего игрового цикла -`SprPoP` в законченную игру: заставка, интро, демонстрационный уровень, -сцены между уровнями, таймер, финал и Hall of Fame. План меню и постоянных -настроек вынесен в [`menu_settings_plan.md`](menu_settings_plan.md), -детальный план QuickSave — в [`quicksave_plan.md`](quicksave_plan.md). - -## 1. Зафиксированный scope - -- Целевая последовательность — оригинальная SDLPoP/DOS PoP с уровнями - **1..14**. Уровень 14 — скрытая финальная часть после Джаффара: его номер - игроку не показывается, победа наступает в комнате 5. -- Уровень **15 удаляется полностью**: не пакуется на HDD, не загружается, - отсутствует в переходах, читах и UI; специальная логика potions/copy - protection level удаляется. -- Уровень **0** остаётся только демонстрационным (attract mode), а не частью - новой игры. -- Title sequence повторяет SDLPoP. Перед ней допускается отдельный - пропускаемый экран с информацией о Sprinter-сборке. -- Первая версия использует текущий профиль поведения `VANILLA`. Сейчас это - означает **существующую реализацию SprPoP**, включая уже встроенные - исправления. Аудит и разведение `VANILLA/ENHANCED` — будущая задача. -- Программа работает **только с HDD**. Варианты без сохранения для floppy не - проектируются. -- Моды и выбор levelset в этот план не входят. - -## 2. Что делает SDLPoP - -Источники истины в локальном SDLPoP: - -- `src/seg000.c`: `start_game()`, `show_title()`, demo mode, общий кадр, - проверка финала; -- `src/seg003.c`: `init_game()`, `play_level()`, `play_level_2()`; -- `src/seg001.c`: cutscene engine, `pv_scene()`, сцены 2/4/6/8/9/12, - `time_expired()`, `end_sequence()` и Hall of Fame; -- `src/data.h`: `tbl_cutscenes`, параметры уровня 0, win level/room; -- `data/TITLE`, `data/PV`, `data/LEVELS/res2000.bin`: ресурсы оболочки. - -Штатный маршрут: - -```text -boot - -> title / story screens - -> Princess + Jaffar intro - -> credits / Hall of Fame - -> demo level 0 - -> title или новая игра - -> levels 1..14 - before 2 -> princess cutscene - before 4 -> princess cutscene - before 6 -> princess cutscene - before 8 -> princess + mouse - before 9 -> princess + mouse - before 12 -> scene selected by remaining time - -> level 14, room 5 - -> embrace + mouse - -> ending text/music - -> Hall of Fame - -> title -``` - -Кроме уровней, здесь есть глобальный 60-минутный таймер, сцена истечения -времени, пропуск сцен клавишей, fade/flash, ожидание музыки и возврат в -attract loop после демо или финала. - -## 3. Текущее состояние SprPoP - -Уже реализованы игровой кадр, комнаты, уровни, тайлсеты, Kid/Guard/Shadow, -Джаффар, специальные события, checkpoint, переходы уровней, бесшовный -выход 12-го уровня, перенос максимального HP и звуковые эффекты. - -Поверх игрового цикла уже добавлены автомат оболочки, title/story, demo -уровень 0, global timer, сценарный интерпретатор, level-flow, ending и Hall -of Fame. Полный маршрут также собирается в HDD-образ. - -Однако это **не означает готовность оболочки**. На момент аудита остаются -существенные незакрытые места: - -- lifecycle палитр: gameplay-переходы используют чёрный барьер без fade; - cold start и полный набор dungeon/palace переходов ещё не прошли приёмку; -- PV intro Princess/Jaffar уже покадровый (актёры, факелы, звёзды, часы, - молния и foreground-колонна); сцены перед 2/4/6 и длинной веткой 12 - анимируют факелы, звёзды и песок, а сцены 8/9 и короткая ветка 12 пока - используют статические позы с исходной длительностью; -- demo отображается с игровой палитрой, проходит второй разворот/зацеп и - доходит до боя; после смерти Кида корректно завершает цикл; -- time-expired, ending и Hall of Fame имеют маршрут и реализацию UI, но не - прошли сквозную MAME-проверку вместе с ресурсами и возвратом к title; -- нет полного регресса EMM/FD для каждого перехода состояния. - -## 4. Архитектура: автомат состояний приложения - -Нельзя наращивать все режимы условиями внутри кадрового цикла. Текущий -цикл должен стать реализацией одного состояния `PLAYING`: - -```text -BOOT -> BUILD_INFO -> TITLE -> INTRO -> DEMO - | | - +---- NEW_GAME <-+ - -NEW_GAME -> LEVEL_LOAD -> PLAYING <-> PAUSE_MENU - | - +-> CUTSCENE -> LEVEL_LOAD - +-> TIME_EXPIRED -> TITLE - +-> ENDING -> HALL_OF_FAME -> TITLE -``` - -Минимальный контекст оболочки: - -```c -typedef enum { - POP_APP_BOOT, - POP_APP_BUILD_INFO, - POP_APP_TITLE, - POP_APP_INTRO, - POP_APP_DEMO, - POP_APP_LEVEL_LOAD, - POP_APP_PLAYING, - POP_APP_PAUSE_MENU, - POP_APP_CUTSCENE, - POP_APP_TIME_EXPIRED, - POP_APP_ENDING, - POP_APP_HALL_OF_FAME, - POP_APP_QUIT -} pop_app_state_t; -``` - -Переходы задаются результатом состояния, а не прямыми рекурсивными -вызовами наподобие SDLPoP `start_game()`/`longjmp()`. На Z80 это проще для -стека и позволяет освобождать ресурсы каждого режима в одном месте. - -## 5. Ресурсная модель - -Title и cutscene-ресурсы нельзя постоянно держать рядом с игровыми -атласами. Для каждого состояния нужен явный lifecycle: - -```text -enter: pause sound -> unload incompatible set -> load set -> apply palette -run: process input/timer/animation -leave: stop sound -> release EMM pages -> clear transient state -``` - -Новые группы HDD: - -```text -TITLE\ title/story images, palette, optional build-screen assets -PV\ princess room, Princess/Jaffar/mouse frames, palettes -MUSIC\ intro, cutscene and ending tracks/samples -LEVELS\ res2000..res2014.bin -``` - -Конкретный формат атласов выбирает упаковщик. Runtime не должен разбирать -PNG/DAT: как и игровые спрайты, он получает подготовленные `.atl`/`.bin`. - -## 6. Экран Sprinter build - -Отдельное состояние перед оригинальной заставкой: - -```text -PRINCE OF PERSIA -SPRINTER SP2000 BUILD -version / date / build id -``` - -Требования: - -- пропускается любой клавишей; -- выключается в Settings; -- не запускает музыку оригинального title и не меняет её тайминги; -- данные версии генерируются сборкой, а не правятся вручную в C; -- отсутствие экрана приводит прямо к `TITLE`. - -## 7. Title и текстовая подсистема - -Порядок переносится из `show_title()`: - -1. основной титульный экран; -2. Presents; -3. название игры и Jordan Mechner; -4. story frame / “In the absence…”; -5. intro Princess + Jaffar; -6. story “Marry Jaffar…”; -7. credits; -8. Hall of Fame, если таблица непуста; -9. demo level 0. - -Нужны общие примитивы: загрузить full-screen image, вывести строку, -показать экран заданное время, transition left-to-right, fade in/out, -прервать ожидание клавишей. Текст и меню должны использовать один renderer. - -Критерий: последовательность и музыкальные точки совпадают с SDLPoP; -Sprinter build screen не сдвигает оригинальный soundtrack. - -## 8. Demo level 0 - -- Добавить на HDD `res2000.bin`. -- Загружать уровень обычным loader, но выставлять demo HP и demo mode. -- Воспроизводить `demo_moves` как синтетический источник `control_*`. -- Пользовательский ввод прерывает демо и начинает новую игру. -- Достижение demo end room (у SDLPoP — 24), смерть или конец скрипта - возвращают в `TITLE`. -- Pause menu, QuickSave и cheats в demo недоступны. -- RNG демо и начальное состояние должны быть детерминированы. - -Критерий: без ввода attract loop не требует перезапуска процесса; -title -> demo -> title повторяется неограниченно. - -## 9. Глобальный таймер - -Состояние: минуты, тики и флаг показа. Таймер создаётся при New Game, -переносится между уровнями и входит в QuickSave. - -Правила `VANILLA`: - -- на pause menu, загрузке HDD, QuickSave/QuickLoad время не идёт; -- игровые тики следуют темпу логического кадра, а не частоте render loop; -- поведение во время level-end sound и cutscenes сверяется буквально с - SDLPoP; -- после Джаффара/на финальном уровне время не должно вызвать поражение; -- ноль времени переводит приложение в `TIME_EXPIRED`. - -Критерий: одинаковый игровой отрезок в NORMAL даёт то же уменьшение времени, -что SDLPoP; сохранение/загрузка не добавляет и не отнимает тики. - -Реализация FG4 живёт одним модулем `src/pop_timer.c` в bank 9: -`60:719`, 720 тиков на минуту, счёт только в живом игровом кадре. Settings -хранит `TIME LIMIT: 60 MIN / UNLIMITED` в `POP.CFG`; старый семибайтный v1 -payload по-прежнему читается как `60 MIN`. Читы таймера повторяют SDLPoP, -но из-за занятого `+/-` используют F7 (−1 минута, не ниже одной) и F8 -(+1 минута). Состояние входит в QuickSave v4. - -## 10. Cutscene engine - -Сцены SDLPoP состоят из небольшого набора повторяемых команд. Вместо набора -крупных C-функций нужен компактный интерпретатор: - -```text -SET_ACTOR actor -SET_POS x,y,dir -START_SEQ seq -WAIT_FRAMES n -PLAY_SOUND id -WAIT_SOUND -SET_HOURGLASS frame -SET_SAND state -FLASH color,frames -FADE_IN / FADE_OUT -CLEAR_ACTOR actor -END -``` - -Скрипты — `const` в холодном банке или подготовленный бинарный ресурс. -Interpreter обязан: - -- исполнять один шаг/кадр без блокирующих длинных циклов; -- поддерживать пропуск сцены; -- при пропуске выполнять cleanup и выходить в заранее заданное состояние; -- освобождать PV-ресурсы перед загрузкой игрового тайлсета; -- не разрешать pause menu/QuickSave внутри сцены. - -Порядок переноса: intro, 2/6, 4, 8, 9, 12, time expired, ending. Сцена 12 -выбирает короткий или обычный вариант по остатку времени. - -## 11. Переходы между уровнями - -Таблица сценария должна быть отдельна от таблиц механики уровня: - -```c -typedef struct { - uint8_t level; - uint8_t pre_cutscene; - uint8_t show_level_number; - uint8_t ending_rule; -} pop_level_flow_t; -``` - -Особые правила: - -- New Game начинает уровень 1; -- перед 2/4/6/8/9/12 запускается сцена; -- 12 -> 13 остаётся бесшовным; -- после победы над Джаффаром переход идёт в 14; -- номер 14 не показывается; -- вход в комнату 5 уровня 14 переводит в `ENDING`; -- значения больше 14 недопустимы и дают диагностическую ошибку, а не - попытку открыть файл. - -## 12. Ending и Hall of Fame - -Ending: - -1. загрузить PV-набор; -2. встреча Kid и Princess; -3. объятие; -4. появление мыши; -5. ending music; -6. финальные story/title экраны; -7. переход в Hall of Fame. - -Hall of Fame хранится на HDD в отдельном версионированном `POP.HOF`. -Сохраняются имя и результат; ввод имени использует тот же текстовый/UI слой. -Повреждённый или неизвестный формат означает пустую таблицу, но не мешает -запуску игры. После показа — возврат в `TITLE`. - -## 13. Удаление уровня 15 - -Отдельный ранний этап, чтобы новый flow не наследовал лишний маршрут: - -- убрать `res2015.bin` из `LVL_NUMS` и HDD image; -- заменить последний игровой уровень на 14; -- остановить Shift+L и прочую навигацию на 14; -- удалить `POP_POTIONS_LEVEL` и специальный половинный урон синих зелий; -- исключить copy protection из конфигурации и меню; -- добавить тест: после уровня 14 приложение входит в ending и никогда не - запрашивает `res2015.bin`. - -## 14. Этапы реализации - -Легенда аудита: **✓** — критерий этапа закрыт; **~** — код существует, но -критерий приёмки ещё не закрыт; **○** — не начат. Статус отражает состояние -исходников и последней MAME-проверки на 2026-08-24, а не только наличие -модуля в bank 9. - -| этап | статус | результат и фактическое состояние | критерий приёмки | -|---|---|---|---| -| **FG0** | ✓ | `POP_LEVEL_LAST=14`, HDD содержит `res2000..res2014`; `t_flow` отвергает 15 | HDD не содержит res2015; переход выше 14 невозможен | -| **FG1** | ~ | автомат `pop_app` и `t_app` реализованы; сквозной ресурсный lifecycle и контроль EMM/FD ещё не измерены | старт/рестарт/выход проходят без рекурсии и утечки EMM | -| **FG2** | ✓ | QuickSave/QuickLoad с `POP.SAV` и `POP.BAK`; отдельно проверен в MAME 2026-08-22 | критерии `quicksave_plan.md`, включая POP.BAK | -| **FG3** | ✓ | pause menu, Settings, подтверждения и двойной буфер реализованы; меню проверялось в MAME; добавлены SDLPoP-звуки навигации и защита CBL вокруг полного redraw/файловых операций | Resume/Save/Load/Restart/Settings/Quit работают | -| **FG4** | ~ | `pop_timer`, настройка unlimited, F7/F8 и состояние QuickSave реализованы; есть host-тест, но нет буквального сравнения темпа со SDLPoP на всех переходах | совпадение с SDLPoP и корректный save/load | -| **FG5** | ~ | text/full-screen/fade примитивы есть; для входа в первый уровень и границ уровней выбран мгновенный чёрный барьер без fade: CBL и яркая новая палитра включаются только после подготовки обеих страниц; Level 1 проверен в MAME | тестовые экраны и переходы на Sprinter | -| **FG6** | ~ | title-ресурсы и порядок кадров реализованы; Enter на title и Esc на первом story в MAME переводят прямо в `FIRST_LEVEL`, минуя demo; полная cold-boot приёмка fade остаётся в FG5 | основной титул/Presents/название/Mechner идут в точном порядке `show_title()`; Enter/Space/Esc/стрелки прерывают ожидание; story/intro продолжит FG8 | -| **FG7** | ✓ | level 0, исходная таблица `demo_moves`, demo HP=4 и блокировка игрового UI реализованы; исправлены зеркалирование auto-control, боевой AI Кида и завершение после смерти; в MAME demo проходит разворот/зацеп, доходит до боя и возвращается в attract-цикл без повторного убийства | `res2000.bin`, исходная `demo_moves`, demo HP=4; бесконечный attract loop, любой ввод начинает чистую новую игру; Pause/QuickSave/читы/таймер отключены | -| **FG8** | ~ | data-driven interpreter и покадровый PV intro работают; в MAME проверены актёры, факелы, звёзды 1x1, часы/песок, palette-0 lightning и foreground-колонна; Enter/Esc переводят прямо в `FIRST_LEVEL`; временный темп 12,5 FPS и TODO точного pacing записаны в `impl_diff.md` | story/PV intro проходит, любой raw-ввод пропускает его без удержания EMM-страниц | -| **FG9** | ~ | `pop_flow` корректно маршрутизирует 2/4/6/8/9/12 и ветку <=5 минут (`t_flow`); 2/4/6 и длинная 12 уже обновляют часы, песок, факелы и звёзды каждые 5 кадров Sprinter; длительности всех веток сверены с SDLPoP: 2/4/6/12 — 2,6 с, 8 — 6,0 с, 9 — 7,2 с; входная клавиша gameplay/Shift+L поглощается до сцены, а новое нажатие делает skip; анимации мыши/Princess в 8/9 и разворот Princess в короткой 12 ещё статичны | таблица flow переводит в CUTSCENE ровно перед 2/4/6/8/9/12; scene 12 выбирает короткий вариант при <=5 минутах | -| **FG10** | ~ | переход TIME_EXPIRED и экран существуют, но это ещё статическая PV-стадия; сквозной MAME-маршрут не принят | PV-сцена истечения с пропуском, затем возврат на title/attract; новая игра сбрасывает таймер | -| **FG11** | ~ | room 5 уровня 14 переводит в ENDING (`t_flow`); объятие/мышь заменены статической стадией, полный маршрут не принят | room 5 уровня 14 переводит в ENDING; PV-финал и Hail-экран возвращают управление оболочке | -| **FG12** | ~ | версионированный `POP.HOF`, ввод имени и восстановление после повреждённого файла реализованы; нужна сквозная MAME-проверка ending → HOF → title | версионированный `POP.HOF`, ввод имени raw-клавиатурой, повреждённый файл = пустая таблица, затем title/attract | - -## 15. Проверки - -- Host-тест автомата: все допустимые переходы и отсутствие уровня 15. -- Host-тест cutscene interpreter на синтетическом скрипте и skip в каждой - ожидающей команде. -- Host-тест demo input: одинаковый seed даёт одинаковый поток управления. -- MAME: cold boot -> build info -> title -> demo -> title. -- MAME: новая игра -> принудительный переход по всем pre-level scenes. -- MAME: time expired и пропуск сцены. -- MAME: 13 -> 14 -> room 5 -> ending -> HOF -> title. -- Проверка EMM/FD до и после каждого состояния: число страниц и открытых - файлов возвращается к базовому. -- `make size-check`; крупный cold-код размещать в банках и отдельно следить - за лимитом 16 КБ каждого банка. - -## 16. Не входит в план - -- уровень 15 и copy protection; -- моды и выбор levelset; -- replay/recording; -- точная эмуляция SDL video/controller options; -- профиль ENHANCED и индивидуальные switches fixes. diff --git a/applications/SprPoP/docs/gates_spikes_plan.md b/applications/SprPoP/docs/gates_spikes_plan.md deleted file mode 100644 index 3734abb..0000000 --- a/applications/SprPoP/docs/gates_spikes_plan.md +++ /dev/null @@ -1,279 +0,0 @@ -# Интерактивные объекты (кнопки/гейты/пики) + HP/смерть — ПОДРОБНЫЙ план - -> **Статус: РЕАЛИЗОВАНО (2026-08-01).** Все фазы плана (P0 персистентный -> per-room `room_modif`, S пики, B кнопки+ворота) сделаны и играются: -> `src/pop_trob.c` (trob-диспетчер, `LINKLOC`/`LINKMAP`, ворота, дверь -> уровня, факелы, зелья), `pop_map.c` (HP, смерть на пиках, урон падения), -> `pop_redraw.c` (пометки перерисовки вместо прямых блитов). Ограничения -> из §0 закрыты: тайлы персистентны, HP/смерть есть, loose обобщён в trob; -> L3-вверх (climb-up в комнату сверху) тоже сделан (`pop_leave_dir = 3`). -> Из §5 остаётся открытым только **переход на следующий уровень через дверь -> уровня** — он вынесен в `levels_plan.md`. -> -> **Документ оставлен как СПРАВОЧНИК**, а не как план: §1 (раскладка -> объектов уровня 1 по комнатам, декод связей кнопка→цель) и §2 (точные -> ссылки на механику SDLPoP) продолжают экономить время при отладке. -> Текущие задачи — `../TASKS_OPEN.md`. - -Составлен 2026-07-20. Документ самодостаточный: рассчитан на старт -«с чистого листа» (пустой контекст). Всё сверено с -`applications/PoP/SDLPoP/src/` и данными `res2001.bin`. - -Правило проекта (см. `applications/PoP/CLAUDE.md`): **SDLPoP — источник истины**, -перед кодингом читать соответствующий код seg*.c, не гадать. - ---- - -## 0. КОНТЕКСТ: текущее состояние `applications/SprPoP` (что уже готово) - -SprPoP — живой прототип порта PoP: комната 1 уровня 1 живой композицией -тайлов + Kid (анимация/управление/коллизия/падение/зацеп/переходы). Собрать: -`cd applications/SprPoP && make`. Тест в MAME: см. memory -`mame_mcp_bridge`/`mame_hdd_test_disk` (канонический цикл: `make` → пересобрать -`mame/v306/IMG/test_hdd.chd` через `toolchain/make_hdd.sh` со всеми ассетами → -рестарт `run_bridge.sh` → `resume` → ~13с бут → `type_string("d:{ENTER}SprPoP.exe{ENTER}")`). -Отладка: клавиши `1`=freeze / `2`=resume в SprPoP; MCP-мост `mame-z80` -(read_logical_memory, set_breakpoint, disassemble); адреса символов — -`.sprinter-cc-build/.sprinter-cc-sprpop/sprpop.map` (сдвигаются при пересборке!). - -### Модули (все в `applications/SprPoP/`) -- `sprpop.c` — главный цикл (дабл-буфер 2 стр.), `enter_room(room)`, - обработчики переходов. File-static рабочие массивы (W2): - `room_fg[30]`, `room_bg[30]`, `lcol_fg/lcol_bg[3]`, `rcol_fg/rcol_bg[3]`, - `below_fg[10]`, `cur_room`. -- `pop_level.c/.h` — **уровень из файла** (Фаза L1): - - `pop_level_load("res2001.bin")` — читает сырой blueprnt в EMM-страницу - (данные с offset `0x100`, ISR-стаб как атлас). - - `pop_room_load(room, fg,bg, lcol_fg,lcol_bg, rcol_fg,rcol_bg, below_fg)` — - извлекает комнату (fg маскирован `&0x1F`, bg raw) + срезы соседей: - leftcol=col9 левого соседа, rightcol=col0 правого, belowrow=row0 нижнего. - - `pop_room_link(room, side)` — связь (side 0=L,1=R,2=U,3=D; 0=нет). - - `pop_level_start_room/pos/dir()`. -- `pop_bg.c/.h` — отрисовка тайлов (порт seg008 draw_tile), fore-окклюзия над - Kid (`pop_fore_over_char`, порт set_char_collision+redraw_at_char/char2), - **loose-полы** (shake/bake/mob). `draw_tile` — статическая, знает - `draw_gate_back` (грань гейта из левой комнаты). -- `pop_kid.c/.h` — анимация Kid (интерпретатор seqtbl `play_seq`, порт seg006), - `Kid` struct (frame,x,y,dir,curr_col,curr_row,action,fall_x,fall_y,repeat, - curr_seq); `knock`-флаг; `kid_cur_dx/flags`, `kid_fp_*` (футпринт). -- `pop_ctrl.c/.h` — ввод (порт seg005 control) через ``. -- `pop_map.c/.h` — коллизия/физика (порт seg005/006). Ключевое: - - `pop_map_set(fg)` — карта текущей комнаты. - - `pop_map_set_edges(l,r,u,d, lcol_fg, rcol_fg)` — связи + кромки швов для - коллизии (`get_tile(col=-1)`=lcol, `get_tile(col=10)`=rcol; порт - find_room_of_tile). - - `pop_phys_tick()` — кадр физики (fall/land/wall/knock/leave). - - Переходы: `pop_fell_out` (вниз, y>=211), `pop_leave_dir` (1=left,2=right, - x∓140). - - **loose-состояние**: `pop_loose_modif[30]` (публично, читает pop_bg), - `loose_bake[30]`, `loose_rest[30]` (static); `pop_loose_tick()`, - `pop_loose_reset()` (сброс при смене комнаты). - -### Что сделано по фазам -- **L1** — данные уровня из файла (room1_data.h удалён). Коммит `21f978d`. -- **L2** — переход в комнату снизу (провал/спуск), фиксы окклюзии. Коммит `7f3e32d`. -- **L3** — переходы вбок (право+лево) через швы. **Не закоммичено** на момент - написания (вместе с этим планом). **L3-вверх (climb-up в комнату сверху) — - НЕ сделано.** -- **Loose-полы** (тряска knock / падение mob+окклюзия) — коммит `8b30dc2`. - -### Известные ОГРАНИЧЕНИЯ (важно для этого плана) -1. **Нет персистентности тайлов**: `enter_room`→`pop_room_load` каждый раз - перезагружает ИСХОДНЫЕ тайлы из level-страницы. Изменения (упавший loose, - открытый гейт) при повторном входе ТЕРЯЮТСЯ. Для кнопок/гейтов это - блокер (см. P0). -2. **Нет HP/смерти** Кида (нужно для пик). -3. Loose-механика — частный случай trob (нужно обобщить). - ---- - -## 1. ДАННЫЕ УРОВНЯ (формат, offsets, объекты) - -Сырой `res2001.bin` (2305 Б) = blueprnt DAT 1.0 (Table 6 в -`POP-DAT-FormatSpecifications.txt`). Читается в EMM-страницу с offset `0x100`. -Тайл-код = байт `& 0x1F`; верхние биты (модификатор BLUETYPE) сейчас отброшены. - -| Блок | Offset | Размер | -|------|--------|--------| -| foretable (fg) | 0 | 720 (24 комн × 30) | -| backtable (bg=modifier) | 720 | 720 | -| **LINKLOC** (doorlink1) | **1440** | 256 | -| **LINKMAP** (doorlink2) | **1696** | 256 | -| links (roomlinks) | 1952 | 96 (24×{L,R,U,D}) | -| start_position | 2112 | 3 (room,pos,dir) | - -Тайл-коды: `0x00`empty `0x01`floor `0x02`**SPIKE** `0x03`pillar `0x04`**GATE** -`0x06`**DROP-кнопка(closer)** `0x0B`loose `0x0F`**RAISE-кнопка(opener)** -`0x10`lvldoor-L `0x11`lvldoor-R `0x13`torch `0x14`wall. - -### Объекты уровня 1 (по комнатам) -``` -room 5: DROP(0,2)m11 RAISE(0,4)m9 GATE(0,5)m2 RAISE(0,6)m8 GATE(0,9)m1 -room 6: RAISE(0,2)m7 SPIKE(2,3) SPIKE(2,4) <-- тестовая -room 7: RAISE(0,2)m6 GATE(0,9)m2 -room 8: RAISE(0,6)m5 GATE(0,9)m2 RAISE(1,7)m4 -room 9: RAISE(0,0)m3 (+ lvldoor(1,3)/(1,4) — выход на level2, отложено) -room12: RAISE(0,3)m2 GATE(0,9)m2 SPIKE(2,4) -room10/13/14/16/19/24: только SPIKE -room20: DROP(1,4)m1 RAISE(1,7)m0 -``` -(m = modifier тайла = ИНДЕКС в LINKLOC/LINKMAP.) - -### Room6 (тестовая) — раскладка -``` -fg row0: 13 01 0F 00 03 01 01 13 01 03 (0,2)=RAISE-кнопка, (0,0)/(0,7)=torch -fg row1: 14 14 14 00 14 14 14 14 14 14 (1,3)=empty -fg row2: 14 14 14 02 02 14 14 14 14 14 (2,3)(2,4)=SPIKE -links: L=8 R=2 U=5 D=0 -``` -- **Шахта пик**: col3 (row0=empty, row1=empty, row2=spike) + col4 (spike). -- **Гейт, видимый у ЛЕВОЙ кромки room6, — это гейт room8 (0,9)**, отрисованный - в col0 room6 через левый шов (L=8, leftcol=col9 room8). В room6 гейта НЕТ. - -### Связь кнопка→цель (декод LINKLOC/LINKMAP), проверено: -- `get_doorlink_tile(i) = d1[i] & 0x1F` -- `get_doorlink_next(i) = !(d1[i] & 0x80)` (0 = конец цепочки) -- `get_doorlink_room(i) = ((d1[i]&0x60)>>5) + ((d2[i]&0xE0)>>3)` -- `get_doorlink_timer(i) = d2[i] & 0x1F` -- где `d1`=LINKLOC@1440, `d2`=LINKMAP@1696. Цепочка: idx++ пока next. - -**Кнопка room6 (0,2) mod=7 → цель: room8 tile(0,9) = ГЕЙТ.** Подтверждено -в SDLPoP-скринах: нажатие кнопки поднимает решётку у левой кромки room6. -Связь КРОСС-КОМНАТНАЯ (кнопка в room6, гейт в room8) и задаётся таблицей, -а НЕ позицией. Кнопка может открывать НЕСКОЛЬКО гейтов в разных комнатах. - ---- - -## 2. МЕХАНИКА SDLPoP (точные ссылки) - -### 2.1 Trob-система (анимируемые тайлы) -- `add_trob(room,tilepos,type)` seg007:0A5A — в список анимируемых. -- Каждый кадр `redraw_needed_tiles`/`process_trobs` продвигает; диспетч по - типу тайла → `animate_button/animate_door/animate_spike/animate_loose` - (seg007:0033+ таблица `animate_*`). -- Состояние тайла хранится в `curr_room_modif[tilepos]` (per-room modifier). -- У нас есть частный случай для loose (`pop_loose_tick`+`pop_loose_modif[30]`). - -### 2.2 Пики (spike) -- **Триггер выдвижения** — `check_spike_below()` seg006:1199 (зовётся в - физике Кида каждый кадр): для каждой колонки футпринта Кида - (`get_tile_div_mod_m7(char_x_left)`..`char_x_right`) идёт ВНИЗ от - `Char.curr_row` через НЕ-floor тайлы; если встретил `tiles_2_spike` → - `start_anim_spike(room,tilepos)`. → Кид у края (0,2) правым краём задевает - col3 → скан вниз col3 (empty/empty/spike) → пики вылезают. -- `start_anim_spike` seg007:596: если `modif<=0`: `modif==0` → add_trob(type1) - + звук; `modif<0` (кроме 0xFF disabled) → `modif=0x8F`. -- `animate_spike` seg007:317: автомат по modif — выдвиг `++modif` (1..4; на 5 → - `0x8F`; на 9 → 0, trob кончился); убирание `& 0x80` → `--modif` (на 0 → `=6`). - `0xFF` = disabled (не двигать). -- `is_spike_harmful` seg007:1178: modif `0/-1`→0 (безопасно); `<0`→1; - `1..4`→2; `>=5`→0. -- **Смерть**: `check_spiked` seg006:0968 — если тайл под Кидом = spike И harmful - И кадр бега (7..14) / старта прыжка (34..39) с harmful>=2, ИЛИ кадр приземления - (43/26) с harmful!=0 → `spiked()`. Падение на пики — отдельный путь (см. - `is_dead` seg006:1907, frame_177_spiked). Осторожный ШАГ по невыдвинутым — ок. - -### 2.3 Кнопки -- `trigger_button(playsound, button_type, modifier)` seg007:0C53: modifier = - индекс LINKLOC. `link_timer = get_doorlink_timer(mod)`; если `!=0x1F` - (не заклинено): `set_doorlink_timer(mod,5)`; если был `<2` → `add_trob` - (кнопка нажимается) + звук; затем `do_trigger_list(mod, button_type)`. -- `do_trigger_list` seg007:09E5: идёт по цепочке LINKLOC от idx, для каждой - цели `trigger_1(target_type,room,tilepos,button_type)` → если >=0 - `add_trob(room,tilepos,result)`. -- `animate_button` seg007:0D3A: `timer=get_doorlink_timer(mod)-1`; - `set_doorlink_timer(mod,timer)`; `timer<2` → кнопка отжимается. -- Когда Кид ВСТАЁТ на кнопку: `check_press`-путь seg006 (opener → trigger_button, - closer → тоже; если Кид мёртв — `died_on_button`). RAISE=`tiles_15_opener` - (0x0F), DROP=`tiles_6_closer` (0x06). - -### 2.4 Гейты -- `trigger_1` seg007:0999 → для `tiles_4_gate` → `trigger_gate`. -- `trigger_gate(room,tilepos,button_type)` seg007:092C: modif = высота открытия. - opener: `0xFF`→игнор; `>=188`(открыт)→держать `238`; иначе `modif=(modif+3)&0xFC`, - return 1 (открывать). closer/иначе: `modif!=0` → return 3 (закрыть быстро). -- `animate_door` seg007:0522: анимация открытия/закрытия; `door_delta[]={-1,4,4}`, - `gate_close_speeds[]={0,0,0,20,40,60,80,100,120}`. Гейт медленно закрывается - после истечения таймера кнопки. -- Отрисовка: кадры гейта; у нас `draw_gate_back` в pop_bg (грань из левой комн.). -- **Проходимость**: Кид блокируется недостаточно открытым гейтом (коллизия - как стена, порог по высоте открытия); проходит при `modif` открытом. - ---- - -## 3. Поправки к описанию пользователя (что важно) - -1. Гейт НЕ в room6 (0,0) — он в **room8 (0,9)**, виден через левый шов; связь - кросс-комнатная (по таблице LINKLOC, не по позиции). -2. Кнопка может открывать несколько гейтов в разных комнатах. -3. Пики выдвигаются по `check_spike_below` (Кид над колонкой с пиками), - имеют состояния (не всегда смертельны), убираются со временем. -4. **Кросс-комнатное состояние тайлов ДОЛЖНО ПЕРСИСТИТЬ** — блокер (см. P0). -5. HP/смерть — новая подсистема. -6. Кнопка сама анимируется (нажата/отжата). - ---- - -## 4. ПЛАН РЕАЛИЗАЦИИ (фазы) - -### P0 — Персистентное per-room modifier-состояние + trob-каркас (ПРЕРЕКВИЗИТ) -**Проблема:** нажатие кнопки в room6 меняет modif гейта room8 (не текущей -комнаты); при входе в room8 нужно отрисовать гейт в текущем состоянии. Плюс -это чинит «re-entry восстанавливает тайлы» (loose/гейты). - -Дизайн (предложение — уточнить в реализации): -- Массив `room_modif[24][30]` (или lazy per-visited-room) — modifier каждого - тайла каждой комнаты. Инициализируется из bg уровня при первой загрузке - комнаты; далее ЖИВЁТ (не перезагружается). ~720 Б — влезает в W2 (или в - EMM-страницу уровня рядом с данными: остаётся >10КБ). -- `enter_room` берёт modif из `room_modif[room]`, а fg — из level-страницы - (fg почти не меняется; исключения — loose→empty, надо тоже персистить: либо - отдельный `room_fg_override`, либо флаг «loose упал»). -- Обобщить loose-trob: единый список trob (room,tilepos,type) + диспетчер - `animate_*` по коду тайла. Loose (`pop_loose_*`) — перевести на него. -- Кросс-комнатный trigger: `add_trob` в НЕ текущую комнату меняет - `room_modif[room][tilepos]`; анимация продвигается даже для невидимой комнаты - (в оригинале — да; можно упростить: для невидимой комнаты гейт сразу в - финальном состоянии, анимировать только при видимости — решить при реализации). - -### Фаза S — Пики (самодостаточно; отладит HP/смерть) -Порядок: -1. `room_modif` для пик (из P0 или временно локально). -2. `check_spike_below` (порт seg006:1199) — в `pop_phys_tick`. -3. `start_anim_spike` + `animate_spike` (порт seg007) — состояние в modif. -4. `is_spike_harmful` + `check_spiked` (порт seg006:0968). -5. **HP/смерть**: ввести `hitp_curr` (старт напр. 3); `take_hp`; при пиках — - мгновенная смерть; seq смерти (`seq_22_crushed`/`frame_177_spiked`..185); - анимация смерти; респавн (kid_init на старте или чек-поинт). -6. Отрисовка: кадры выдвижения пик. В pop_bg есть `SPIKES_FRAM_RIGHT` — нужны - pop-out кадры (spikes_fram по modif) + fore над Кидом. - -### Фаза B — Кнопки + гейты (нужен P0) -Порядок: -1. Доступ к LINKLOC/LINKMAP из pop_level (добавить геттеры doorlink1/2[i] с - маппингом W0 или скопировать таблицы в W2 при load — 512 Б). -2. `pop_map` детект «Кид встал на кнопку» (check_press-путь) → `trigger_button`. -3. `trigger_button` → таймер + `do_trigger_list` (обход цепочки) → - `trigger_gate` для целей → изменить `room_modif[целевой]`. -4. `animate_button` (кнопка отжимается) + `animate_door` (гейт откр/закр + - авто-закрытие). -5. Отрисовка гейта (кадры по modif) через ЛЕВЫЙ шов (гейт room8 в room6) + - при входе в room8. Расширить `draw_gate_back`/добавить `draw_gate`. -6. Коллизия: закрытый гейт = стена (порог по высоте открытия); открытый — - проход. Учесть кросс-комнатный гейт на шве (проход влево room6→room8). - -**Порядок фаз:** P0 → S → B. S в основном независим (кроме HP/trob-каркаса), -но проще и отладит смерть/анимацию; B требует P0 (кросс-комнатное состояние). - ---- - -## 5. Открытые вопросы / грабли -- Персистентность `fg` для loose (тайл→empty): решить в P0 (override-массив или - флаг), иначе упавший loose «вернётся». -- Анимация trob в НЕВИДИМОЙ комнате: упростить (финальное состояние сразу) или - портировать честно. -- Двоебуфер: любой транзиент (пики/гейт/кнопка) финализировать перерисовкой - «покоя» на ОБЕИХ страницах (урок из loose — см. memory `pop_loose_floors`). -- Дверь уровня (lvldoor room9) + переход на level 2 — ОТДЕЛЬНО, отложено. -- L3-**вверх** (climb-up в комнату сверху) — ещё не сделан; можно закрыть до - объектов или параллельно. diff --git a/applications/SprPoP/docs/host_tests_plan.md b/applications/SprPoP/docs/host_tests_plan.md deleted file mode 100644 index 6f4c5ad..0000000 --- a/applications/SprPoP/docs/host_tests_plan.md +++ /dev/null @@ -1,142 +0,0 @@ -# План: модульные тесты движка SprPoP под ucsim_z80 - -Обвязка общая — `testkit/` в корне репозитория (там же объяснение, почему -прогон именно под z80, а не хостовым gcc). Наборы лежат в -`../SprPoP/tests-host/`. - -Задача плана: **перестать чинить одно и то же дважды**. За два прогона -уровня 1 (2026-08-03) закрыто восемь корней, и часть из них — регрессии -соседней механики, внесённые предыдущим фиксом. Такие вещи ловятся тестом -за миллисекунды, а в MAME — часами ручного вождения Кида. - -## Что уже есть - -| набор | модуль | статус | -|-------|--------|--------| -| `t_geom` | `pop_geom.c` | 39 проверок, включая побитовую сверку asm-LCG с 32-битной формулой на 128 шагах | - -`pop_geom.c` выбран первым, потому что не тянет ничего за собой. Дальше -начинаются швы. - -## Фаза 1. Два шва (блокирует всё остальное) - -### 1.1 Доступ к странице уровня - -`pop_level.c` ходит по абсолютным адресам: `gfx_w0_map(lvl_page)`, затем -разыменование `(uint8_t *)(LVL_DATA_OFF + …)`. В тестовом бинаре это -обращение в никуда. - -Нужен макрос `W0PTR(off)`: - -- на таргете — `((uint8_t *)(off))`, то есть ровно как сейчас; -- в тестах — смещение в обычном массиве-подложке. - -Правка механическая и компайл-таймовая, на размер продукта не влияет. -Заодно снимает магию абсолютных констант из тела функций. - -Тестовая подложка должна уметь: загрузить синтетическую комнату (10×3 -байта fg + mod) и целый синтетический уровень на 24 комнаты, чтобы -проверять межкомнатные вещи. - -### 1.2 Журналирующий рендерер - -Вместо `pop_bg.c`/`pop_cdraw.c` в тестовый бинарь линкуется модуль с теми -же прототипами, который **не рисует, а записывает вызовы**: какой тайл -помечен к перерисовке, каким кодом, с каким счётчиком страниц. - -Это не обход проблемы, а самостоятельная ценность: `BUG-GATE-ANIM-1` был -ровно такой формы — ворота меняли состояние, но пометка на перерисовку не -ставилась. Проверяется утверждением, а не глазами. - -Минимум, который надо перехватывать: `pop_set_redraw`, -`pop_set_redraw_above`, `pop_loose_mob_spawn`, `pop_gate_redraw`. - -## Фаза 2. Регрессионные кейсы из `BUGS_CLOSED.md` - -После швов `BUGS_CLOSED.md` превращается в готовую спецификацию: у каждой -записи есть симптом и ожидаемое поведение. Кандидаты, которые ловятся -логикой (без отрисовки и без железа): - -| баг | что закрепить тестом | -|-----|----------------------| -| `BUG-LVLSTATE-1` | запись тайла переживает выход из комнаты | -| `BUG-RESPAWN-1` | рестарт уровня возвращает ВСЕ тайлы из эталонной копии | -| `BUG-RESPAWN-2` | рестарт возвращает таблицу стражей; убитый снова жив | -| `BUG-GATE-ANIM-1` | смена состояния ворот ставит пометку `POP_RD_GATE`; закрывающиеся — на обе страницы, открывающиеся — на одну | -| `BUG-COLL-1` | `check_collisions` сканирует ряд справа налево и выбирает НАИМЕНЬШУЮ занятую колонку | -| `BUG-STANDUP-1` | `bumped_floor` у трупа (`alive >= 0`) только выравнивает и не трогает последовательность | -| `BUG-DEATH-1` | `hitp_curr == 0` при живом Киде переводит его в «умирает» ровно один раз | -| `BUG-LOOSE-2` | кусок, начавший падать, долетает и кладёт щебень ПОСЛЕ смены комнаты | -| `BUG-CEIL-2` | loose-плита ряда 2 верхнего соседа живёт как «ряд −1» | - -`BUG-LOOSE-2` стоит взять первым: он до сих пор помечен в `BUGS_OPEN.md` -как непроверенный именно потому, что гонку «уйти из комнаты раньше, чем -долетит плита» через мост MAME воспроизвести не удалось. На уровне логики -это несколько строк — заспавнить кусок, сменить комнату, тикать до -приземления, проверить щебень в данных уровня. - -Не берутся (нужна картинка либо железо): `BUG-DOOR-CLIP`, `BUG-CEIL-1`, -`BUG-CEIL-3`, `BUG-OCCL-1`, `BUG-KBD-4`, `BUG-3`. - -## Фаза 3. Сценарные тесты - -Сейчас шаг кадра размазан по `main()` в `sprpop.c`. Вынести его в -`pop_frame_tick()` — тогда появляются тесты вида «поставить Кида в -известное состояние, скормить N тиков ввода, проверить итог»: - -``` -дано: комната 5, Кид на кнопке (0,6) -когда: 40 тиков без ввода -тогда: комната по-прежнему 5, Кид на полу ряда 2 -``` - -Это тот самый BUG-STANDUP-1, который ловили потиковой трассой в MAME. - -Ввод подаётся не через `kbd_raw_down()`, а через подменяемый источник — -это же даст возможность проигрывать записанные сценарии. - -## Фаза 4. Дифф против SDLPoP - -`SDLPoP/src/` лежит в дереве, собирается на хосте, и там **уже стоят -отладочные трассы** (`DBG kidobj tilepos=…` в seg008, `DBG make_loose_fall` -в seg007). Значит эталон можно заставить печатать потиковую трассу -автоматически. - -Схема: общий формат скрипта ввода и общий формат трассы (тик, frame, x, y, -room, col, row, action, alive, hp). Гоняем обе реализации, диффим, первое -расхождение — номер тика и есть баг. Это ровно то, что делалось руками -через MAME, только бесплатно и повторяемо: `BUG-COLL-1` и `BUG-STANDUP-1` -такой дифф нашёл бы за секунды. - -**Лицензия.** SDLPoP — GPLv3, правило подпроекта — читать и переписывать, -не линковать. Оракул обязан быть **отдельным исполняемым файлом**, -общающимся через файлы трасс, а не слинкованным с нашим кодом в один -бинарь. - -Требование к детерминизму: сиды PRNG должны совпадать. У нас -`POP_PRANDOM_EXACT` даёт ту же последовательность, что в оригинале, и это -уже закреплено тестом `geom_lcg_matches_reference`. - -## Чего эти тесты не поймают - -Отрисовку, банки и W-окна, тайминги, клавиатуру — за этим остаётся MAME. - -И отдельный класс: **баги порядка вызовов**. Свежий пример — окно -fore-клипа (`pop_fore_set_clip`) одно на всех, и его ставит каждый, кто -рисует персонажа; когда порядок «Кид/страж» стал переменным, окно осталось -стражьим, и Кид нарисовался поверх передних столбов. Это не «функция -вернула не то», unit-тест такое не видит. Ловится инвариантом, -вкомпилированным в safe-сборку: «в момент `pop_fore_over_char` окно клипа -принадлежит Киду». Отдельный инструмент, дополняющий тесты. - -## Порядок работ - -1. Шов `W0PTR` + подложка уровня. -2. Журналирующий рендерер. -3. `BUG-LOOSE-2` — закрыть висящий вопрос. -4. Остальные кейсы из таблицы фазы 2. -5. `pop_frame_tick()` + сценарные тесты. -6. Дифф против SDLPoP. - -Правило приёмки: тест не считается написанным, пока не проверен мутацией — -сломать проверяемое место и убедиться, что набор краснеет. diff --git a/applications/SprPoP/docs/ideas_backlog.md b/applications/SprPoP/docs/ideas_backlog.md deleted file mode 100644 index 1400f58..0000000 --- a/applications/SprPoP/docs/ideas_backlog.md +++ /dev/null @@ -1,183 +0,0 @@ -# Идеи и вопросы «на подумать» (PoP) - -Не план работ, а список того, что осознанно отложено: каждая запись — -гипотеза с причиной, по которой её стоит проверить, и с тем, что мешает -сделать это прямо сейчас. - -## Зелье «переворот экрана» (upside-down) - -**Вопрос пользователя (2026-08-01).** Тайлы фона у нас лежат строками, а -кадры Кида/стражей — КОЛОНКАМИ (`transpose_cols` в `pop_pack_kid.py`, ради -бесплатного горизонтального зеркала). Значит вертикальный переворот для -персонажей заметно сложнее, чем для фона. Верно; но прежде чем это чинить, -надо знать три факта. - -**Факт 1 — когда оно вообще нужно.** Зелье переворота — тип 4 -(`proc_get_object`, `seg006.c:1885` → `toggle_upside()`). Скан всех уровней -по данным (`res200N.bin`, тайл 10 = зелье, тип в backtable): тип 4 -встречается **впервые на уровне 9** (две склянки), и больше нигде. Тип 3 -(перо, медленное падение) — уровень 7. То есть **до уровня 9 механика не -нужна вообще**, и «на первом этапе просто не реализовывать» — не компромисс, -а точное соответствие данным уровней 1..8. - -**Факт 2 — что именно делает оригинал.** НЕ переворачивает спрайты. -`flip_screen` (`seg009.c:1042`) → `flip_not_ega` (`seg009.c:1023`) меняет -местами СТРОКИ готового offscreen-буфера (top↔bottom, порядок пикселей -внутри строки не трогает — это вертикальное зеркало, не поворот на 180°). -Вызывается вокруг отрисовки кадра целиком (`seg003.c:296..301`): перевернул -буфер → дорисовал → перевернул обратно. Так что в оригинале это -post-process всего экрана, и вопрос «как перевернуть колоночный спрайт» -там просто не возникает. - -**Факт 3 — почему нам этот приём не подходит как есть.** У нас нет шага -«готовый offscreen → экран»: рисуем прямо в видеостраницу, а heal берёт фон -из ОЗУ-копии этой же страницы. Переворот всей страницы построчно — это -320×192 Б копирования КАЖДЫЙ кадр, что мимо бюджета на порядок. - -**Варианты, которые надо будет взвесить (не сейчас):** -1. **Предпечённые перевёрнутые атласы.** Второй набор кадров - Кида/стража, перевёрнутый по вертикали ещё в `pop_pack_kid.py` (там уже - есть транспонирование — добавляется одной строкой). Рантайм: выбор - набора + зеркальная арифметика Y. Память: ещё ~28 страниц EMM при - бюджете ~3.3 МБ — не проблема. Похоже, самый дешёвый по тактам путь. -2. **Фон рисовать с обратным Y** — для row-major тайлов строка остаётся - непрерывным accel-прогоном, меняется только адрес назначения; цена — - вызов на строку вместо вызова на тайл. Померить, прежде чем закладывать. -3. **Аппаратная помощь** — до проектирования проверить, есть ли у - акселератора направление копирования «вниз» (обратный инкремент адреса); - если есть, вариант 1 может и не понадобиться. Смотреть - `docs/new/06-accel.md` и `docs/reference/accel_r.txt`. - -**Почему не сейчас.** Уровни 1..8 этого не требуют, а к уровню 9 у нас уже -будет ответ на вопрос «сколько стоит кадр» (задачи CLIP-1/T-2) — без него -выбирать между вариантами выше бессмысленно. - -## Заменить генератор псевдослучайных чисел - -Сейчас стоит LCG оригинала, шаг на ассемблере (~1 020 тактов), бит-в-бит -совместимый с SDLPoP. Есть более дешёвые Z80-генераторы (86–148 тактов), -но потолок выигрыша — 2 814 тактов за кадр, 0.65 %, и он растворяется в -обёртках вызова. Тексты процедур, разбор качества и порядок действий — -`prng_alternatives.md`. Первый шаг там не про генератор: слить приведение -к диапазону в ту же asm-процедуру, чтобы на вызов был один `call`, а не три. - -## Отключать мышь на время игры - -**Гипотеза.** Мышь на Sprinter — источник прерываний (обёртки RST 30h, -см. memory `mouse_api`). Игре она не нужна вообще: управление — -raw-клавиатура (``), которую мы и так забираем у DSS целиком. -Значит каждое мышиное прерывание за кадр — украденные такты в бюджете, -который у нас и без того занят на 86 %. - -**Откуда взялось (2026-07-30).** При замере бюджета по 100 кадрам три -кадра выбились до 552–647 К тактов (1.28–1.51 кадра) при типичных 371 К. -Причиной оказалось движение мыши на ХОСТЕ: при неподвижной мыши 225 -кадров подряд прошли без единого превышения. То есть эффект реальный и -измеримый, просто в тесте он был наведён извне. - -**Что проверить.** -1. Есть ли у драйвера мыши (RST 30h) функция «выключить/включить» — - разобрать список из 14 обёрток; если нет явной, посмотреть, что делает - «hide cursor» и снимает ли она обработчик. -2. Сколько тактов реально стоит одно мышиное прерывание на нашем железе - (замер: breakpoint на входе ISR + totalcycles, при движении мыши). -3. Не ломает ли отключение выход в DSS: состояние обязано - восстанавливаться при `exit`, включая аварийный (atexit). - -**Почему не сейчас.** Выигрыш проявляется только когда игрок реально -двигает мышью, то есть в норме его нет; а риск оставить систему без мыши -после выхода — заметный. Делать после того, как закроем стражей и -займёмся бюджетом всерьёз (там же, где батчинг кроссбанковых вызовов и -возможный возврат `pop_bg` в резидент `--w3`). - -## Готовить следующий уровень, пока играет мелодия конца текущего - -**САМАЯ ДАЛЬНЯЯ ВЕРСИЯ.** Не полишинг и не порт: это улучшение ПРОТИВ -оригинала. Планируем, но не раньше, чем закроем уровни и полишинг. - -**Идея (пользователь, 2026-08-28).** Пока звучит мелодия конца уровня (и -трек заставки между уровнями), экран не меняется — значит в это время можно -успеть прочитать с диска следующий уровень, чтобы после музыки он появлялся -сразу, а не через секунду-другую загрузки. - -**Что УЖЕ сделано и мерено (2026-08-28).** Половина этого уже работает: -трек заставки играет ПОВЕРХ загрузки уровня — так же, как в оригинале -(`seg003:68-108`: `load_intro` возвращает управление, `load_level()` идёт под -музыку, и только потом `while (check_sound_playing())` на чёрном экране). -Насос это переживает: 500 подряд вызовов `pop_sfx_fill` через всю загрузку — -максимальный зазор 245 832 такта при дедлайне 251 000, ни одной пропущенной -порции. Осталась вторая половина: мелодия конца уровня досиживается на -ЖИВОМ экране пройденного уровня (как в оригинале, `play_level_2`), и только -после неё начинается загрузка. - -**Оговорки, найденные при разборе.** - -1. **Загрузку придётся разрезать надвое.** Сейчас `pop_level_switch` мешает - дисковую работу (файл уровня в EMM-страницу, атласы стража и тайлсета) с - экранно-палитровой (`pop_bg_load` переписывает записи палитры и атласы, - `pop_guard_load` физически применяет цветовые слоты, обе страницы - заливаются, `pop_pal_black`). Вторую половину НЕЛЬЗЯ выполнять, пока на - экране ещё живёт пройденный уровень — иначе палитра поедет прямо на - картинке. То есть в «музыкальное окно» можно вынести только диск, а всё, - что трогает палитру и VRAM, остаётся после. -2. **Бюджет кадра.** Ожидание мелодии идёт в игровом цикле (гейт - `pop_endmus_left` + `pop_music_busy()`), кадр там обычный, 80-100 мс. - Шаг подкачки должен быть такого же размера, как музыкальный — полстраницы - (~16 мс), а не страница целиком; иначе кадры на экране пройденного уровня - начнут дёргаться. -3. **Память.** Страницы следующего уровня придётся держать одновременно со - страницами текущего — проверить EMM-бюджет (memory `sprinter_emm_budget`), - тяжёлые тут не файл уровня, а атласы тайлсета и стража. -4. **Риск невелик, но он в самом хрупком месте.** Палитро-атласный обмен — - источник уже пойманных багов (`PAL-DUNGEON-STALE`, `PAL-L1-AFTER-INTRO`), - и трогать его ради экономии секунды стоит только на спокойную голову. - -**Выигрыш.** Одна-две секунды один раз на уровень. - -## Музыка одним постоянно открытым архивом (замер 2026-08-31, НЕ сейчас) - -**Идея.** Сейчас каждый трек — отдельный файл `MUS/mNN.bin`, и -`pop_music_load_begin` открывает свой на каждый запуск. Свести треки в -один файл и держать его `fd` открытым: вместо `chdir`+`open`+`chdir` -останется `lseek` к смещению трека. - -**Почему это стоит внимания — разложение окна старта музыки** (полный -замер и метод — `sound_plan.md` §9): - -| шаг | цена | уйдёт? | -|---|---:|---| -| ожидание `pop_music_service` в кадре | 22,6 мс | нет | -| `chdir` #1 | 46,1 мс | **да** | -| `open` файла трека | 34,5 мс | **да** | -| `chdir` #2 | 59,0 мс | **да** | -| чтение первых 8 КБ | 34,0 мс | нет | -| **итого** | **196,7 мс** | | - -Уходит **139,6 мс** — но это ВЕРХНЯЯ граница: появляется `lseek` к -смещению трека, которого сейчас нет вовсе (файл читается последовательно -с нуля), и его цена НЕ ИЗМЕРЕНА. Реальный выигрыш = 139,6 минус `lseek`; -померить можно тем же способом, `lseek` уже используется в -`pop_arc.c:89`. Остаётся ≈ 57 мс, то есть старт трека ускоряется -примерно вчетверо. - -**Где заметно.** Реплики PV-сцены идут встык (три трека подряд), плюс -каждый игровой джингл — смерть, зелье, подобранный меч. - -**Чем осложнено.** - -1. **`PBA1` под это не годится.** Размер элемента там `uint16` (≤ 64 КБ), - а трек — до 1,2 МБ (m56, 78 страниц); резать по страницам нельзя, - элементов вышло бы ~240 при `POP_ARC_MAX = 126`. Нужен свой индекс со - смещениями — то есть эта задача СМЫКАЕТСЯ с `MUS/MUSIC.IDX` из - `music_runtime_index_plan.md`: одно изменение раскладки, а не два. -2. **Постоянно занятый файловый манипулятор** — один из восьми (memory - `dss_fd_limit`, девятый `open` вешает DSS). Рядом свои открывают - `POP.CFG`, quicksave и загрузка уровня. -3. **`chdir` убрать нельзя** — он и есть половина выигрыша, но нужен - старым DSS (`POP_PATH_CALL`); экономия берётся не его удалением, а тем, - что открытие вообще перестаёт выполняться на каждый трек. - -**Оговорка.** Задержка старта музыки сама по себе НЕ является дефектом: -трек начинается на границе события, на слух это не сбой. У эффектов -такой задержки нет вовсе — они целиком в EMM (см. `sound_plan.md` §9.1). -Так что это оптимизация, а не исправление. diff --git a/applications/SprPoP/docs/impl_diff.md b/applications/SprPoP/docs/impl_diff.md deleted file mode 100644 index 2f8edc8..0000000 --- a/applications/SprPoP/docs/impl_diff.md +++ /dev/null @@ -1,686 +0,0 @@ -# Осознанные расхождения с SDLPoP - -Правило подпроекта (`../CLAUDE.md`): расхождение нашей реализации с -`SDLPoP/src/` — по умолчанию **баг у нас**. Этот файл — список исключений: -мест, где мы сознательно сделали иначе, потому что платформа/ABI/бюджет -кадра требуют другого, а НАБЛЮДАЕМОЕ поведение обязано совпадать. - -Формат записи: что делает оригинал → что делаем мы → почему → чем платим и -что проверять при регрессе. Если запись перестала быть верной (портировали -дословно, отказались от обхода) — удалять, а не оставлять «для истории»: -история в git. - ---- - -## D-1. История флагов перекрытия у бокового шва: сдвиг вместо тега комнаты - -**Файлы:** `src/pop_map.c` (`pop_coll_shift`, `pop_coll_invalidate`, -`check_collisions`), `src/sprpop.c` (`enter_room_side`). -**Связанный баг:** BUG-GATE-PASS-1 (`PoP/SprPoP/BUGS_CLOSED.md`). -**Дата:** 2026-08-09. - -### Как в оригинале - -`check_collisions` (seg004:0004) вместе с `get_row_collision_data` -(seg004:0185) держит **10 слотов** флагов перекрытия и рядом — -**параллельный массив номера комнаты**: - -```c -row_coll_flags_ptr[tile_col] = curr_flags; /* tile_col — колонка ВНУТРИ разрешённой комнаты (0..9) */ -row_coll_room_ptr [tile_col] = curr_room; /* и номер этой комнаты */ -... -for (short column = 9; column >= 0; --column) { - if (curr_row_coll_room[column] >= 0 && - prev_coll_room[column] == curr_row_coll_room[column]) { - if ((prev_coll_flags[column] & 0x0F) == 0 && - (curr_row_coll_flags[column] & 0x0F) != 0) - bump_col_left_of_wall = column; - ... -``` - -Ключ слота — пара **(колонка в своей комнате, номер комнаты)**. Решётка -комнаты 8 и до перехода 8→6, и после лежит в слоте 9 с `room = 8`: история -переживает смену комнаты, переход флага 0→1 виден, `bumped()` срабатывает. -Комнату оригинал резолвит на лету через `find_room_of_tile` (seg006:005D), -никакого кэша всех комнат у него нет. - -### Что делаем мы - -Индекс — **колонка ОТРИСОВАННОЙ комнаты**, диапазон −2…11 (14 слотов, -`COLL_C0`/`COLL_N`/`COLL_IDX`), номер комнаты рядом не хранится. При смене -комнаты тот же физический тайл менял бы слот на ±10, поэтому раньше история -просто выбрасывалась (`pop_coll_invalidate` → `prev = 3` = «уже -перекрывал» → бампа нет). Именно это и был BUG-GATE-PASS-1. - -Теперь при **боковом** переходе история не выбрасывается, а -**перенумеровывается**: `pop_coll_shift(∓10)` сдвигает `coll_curr`, -`coll_above`, `coll_below` на 10 слотов и заполняет освободившиеся -тройками. `enter_room_side` зовёт её сразу после `pop_map_set_edges`. - -Корректность держится на том, что `check_leave` двигает `Char.x` ровно на -∓140 = 10 тайлов по 14 px, и координата грани (`pop_x_bump[col + …]`) -сдвигается на те же 140 вместе с габаритом Кида, — **сами флаги -инвариантны**, меняется только номер слота. Сдвигаются `curr/above/below`, -а не `prev`: `prev` на следующем кадре всё равно перезапишет -`move_coll_to_prev`, выбирая источник как раз из этих трёх. - -Переходы **вверх/вниз** и все прочие входы в комнату (старт уровня, -респавн, чит-навигация) остаются на полной инвалидации: там колонки не -сдвигаются, но тайлы под ними принадлежат другой комнате — история -действительно недействительна. - -### Почему не дословно (вариант A) - -Дословный порт — 10 слотов + параллельный массив номера комнаты, индекс по -колонке разрешённой комнаты, бамп только при совпадении номеров; тогда -`pop_coll_invalidate` не нужен вовсе, история сама «не совпадает» там, где -колонка сменила комнату. - -Не взяли по одной причине: **десяти слотов нам не хватит**. Оригинал -перебирает узкое окно вокруг Кида (от `col(char_x_left_coll) − 1` до -`col(char_x_right_coll) + 2`), поэтому коллизии слотов у него практически -не случаются. Мы держим четырнадцать колонок (−2…11) — при узком окне это -не мешает, а вот в десять слотов колонки −2/−1 и 8/9 сядут поверх 8/9. - -**Окно перебора с 2026-08-09 у нас такое же, как в оригинале** (было: все -четырнадцать колонок каждый кадр). Признак годности слота при этом не -массив номеров комнат, как у оригинала, а ГРАНИЦЫ окна — четыре байта, -которые `move_coll_to_prev` переносит в `prev` вместе с флагами; сравнение -идёт по пересечению двух окон. Очистки массивов нет вовсе, то есть это -дешевле оригинала, а смысл тот же (у него слот вне окна помечен -`row_coll_room = −1` и в цикл бампа не попадает). `check_chomped_flags` -тоже ограничен окном — иначе протухшие слоты дали бы фантомный перемол. - -### Чем платим - -- Расхождение структур: если в будущем понадобится знать, из какой комнаты - пришёл тайл конкретного слота, этого у нас нет — придётся идти в вариант A. -- Границы окна надо переносить везде, где переносятся флаги: `pop_coll_shift` - двигает и их, `move_coll_to_prev` снимает их в `prev`. Забыть один из - переносов = молча потерять или, наоборот, разрешить лишний бамп. -- Сдвиг работает только для чисто горизонтальных переходов на ровно 10 - колонок. Любая будущая диагональ/иная ширина комнаты его сломает молча. -- `coll_last_row`: `pop_coll_invalidate` прячет прошлый ряд, чтобы - `pop_coll_shift` мог отменить инвалидацию. Порядок вызовов в - `enter_room_side` (сначала `pop_map_set_edges`, потом `pop_coll_shift`) - стал значимым. - -### Что проверять при регрессе - -Это сердце коллизии, вокруг которого разбирался BUG-SEAM-PINGPONG. После -любой правки здесь — прогон швов: - -1. Уровень 1, комнаты 6 ↔ 8, закрытая решётка, **обе** стороны. -2. Оба режима подхода: мелким шагом (упереться) и с разбега (не пройти - насквозь). -3. Проверить, что пинг-понг у шва не вернулся (экран не перескакивает - туда-сюда на кадре бампа о ворота). -4. `make -C SprPoP/tests-host` — наборы `t_wall`/`t_char` ходят по этой же - геометрии. - ---- - -## D-2. Кнопка в шве: перерисовываем, хотя оригинал не перерисовывает - -### Что делает оригинал - -Тайл-«трансформер» (кнопка, ворота, пика) перерисовывается только если он в -ОТРИСОВАННОЙ комнате: `redraw_11h` → `redraw_tile_height` → -`get_trob_pos_in_drawn_room` (seg007:0258), а та для `trob.room != drawn_room` -возвращает 30 — заведомо несуществующий tilepos, то есть «не рисовать». -Исключение сделано ровно одно — факелы (`animate_torch`, seg007:03CF, ветка -`trob.room == room_L && tilepos % 10 == 9`). - -Кнопка соседа слева при этом ВЛИЯЕТ на картинку: `get_tile_to_draw` -(seg008:253) подменяет нажатый `tiles_15_opener` на `tiles_1_floor`, а -`load_leftroom` (seg008:360) кладёт результат в `leftroom_[row]`, откуда он -приходит в `draw_tile` как `tile_left`. У пола правая грань есть, у кнопки -нет — значит в оригинале нажатие кнопки, видимой через левый шов, меняет -картинку только при следующей ПОЛНОЙ отрисовке комнаты. - -### Что делаем мы - -Перерисовываем шов сразу: `seam_row_sig` (sprpop.c) подмешивает в сигнатуру -ряда бит «кнопка нажата» (`pop_doorlink2(mod) & 0x1F > 1`) для тайлов -`0x0F`/`0x06`, и change-driven редрой `pop_room_redraw_seam_left` срабатывает -на нём так же, как на openness ворот. - -### Почему - -Голый порт давал видимый залип (SEAM-BUTTON-STALE, PoP/SprPoP/BUGS_CLOSED.md): кнопка -(1,9) комнаты 11 — она же (1,−1) комнаты 24 — оставалась нарисованной в том -состоянии, в каком была на входе в комнату, хотя связь срабатывала. Сигнатура -шва следила только за `room_modif`, а у кнопки `modif` — это ИНДЕКС LINKLOC, -константа уровня: нажатие живёт в `doorlinks2` и в сигнатуру не приходило -никогда. Добавить кнопку в сигнатуру — те же три сравнения на кадр, что уже -делались для ворот; воспроизводить артефакт оригинала смысла нет. - -### Чем платим - -- Резидент +200 Б (`_CODE` 24 739 → 24 939), куча W2 1795 → 1595 Б. Если - станет тесно — `seam_row_sig` переносится в банк 7 к - `pop_room_redraw_seam_left`, ценой одного трамплина на кадр. -- Сигнатура ряда стала разнотипной: для кнопки это булев бит, для остальных - тайлов — modif. Значения между собой не сравниваются (сравнивается только - ряд сам с собой), но при добавлении нового типа тайла в шов про это надо - помнить. - -### Что проверять при регрессе - -Уровень 5, кнопка нижних ворот комнаты 24 (она же (1,9) комнаты 11), оба -направления: нажать её из комнаты 11 и войти в 24; и наоборот — войти в 24 -поверху и наступить на неё, стоя в шве. Картинка кнопки обязана совпадать -со статусом ворот в обоих случаях. - ---- - -## Перо (медленное падение) ловит ТОЛЬКО Кида - -**Оригинал** (`fall_accel`, seg006:057C): `is_feather_fall` — глобальный флаг, -и медленное падение достаётся ЛЮБОМУ персонажу, который окажется в `Char`, -пока эффект жив. То есть страж, сошедший с уступа в те же секунды, парит -вместе с Кидом, хотя зелье пил не он. SDLPoP считает это багом и чинит -опцией `fix_feather_fall_affects_guards`. - -**Мы** берём поведение С ФИКСОМ: `pop_feather` проверяется вместе с -`Char.charid == CHARID_0_KID` — и в `fall_accel` (`pop_map.c`), и в опкоде -`JMP_IF_FEATHER` интерпретатора seqtbl (`pop_kid.c`), чтобы физика и анимация -не разъехались. - -**Чем платим.** Сцена, где страж падает при живом пере, будет выглядеть иначе, -чем в DOS-оригинале (у нас он падает нормально, там — парит). На уровне 7, -единственном с этим зельем, такой сцены нет: зелье в комнате 1, стражи — в -других комнатах. - -**Что проверять при регрессе.** Уровень 7: выпить зелье в комнате 1, тут же -столкнуть стража в провал — он обязан падать БЫСТРО, а Кид рядом — медленно. - ---- - -## Синее зелье («−HP») не ставит свою вспышку - -**Оригинал** (`proc_get_object`, seg006:1892): ветка `case 5` только глушит -звуки, играет `sound_13_kid_hurt` и ставит `hitp_delta`. Экран краснеет не -здесь, а общим механизмом «Кид ранен» (`flash_if_hurt`, seg003:0AFC). - -**Мы** раньше ставили в этой ветке ещё и `pop_flash_*` (красную вспышку на 2 -кадра) — то есть красили экран дважды: своей вспышкой и кадром урона. -Приведено к оригиналу: ветка правит только `hitp_delta`, краснеет `pop_kid_hurt`. - -**Что проверять при регрессе.** Уровень 2, комната 13, зелье `(1,3)`: выпить — -HP убавляется на единицу, экран краснеет РОВНО один раз (без двойного строба). - ---- - -## Переворот (зелье инверсии) применяется НА ГРАНИЦЕ КАДРА, а не мгновенно - -**Оригинал** (`toggle_upside`, seg000:15E9): `upside_down = ~upside_down` и -`need_redraw_because_flipped = 1` — флаг переключается прямо в момент глотка, -то есть в середине кадра. Оригиналу это ничего не стоит: он ВСЕГДА рисует в -offscreen неперевёрнутым, а зеркалит только при выводе на экран -(`flip_screen` вокруг `copy_screen_rect`, seg000:939/946). Внутренние -координаты у него от переворота не зависят вообще. - -**Мы** offscreen-буфера не имеем (две видеостраницы + теневая ОЗУ-копия на -каждую), поэтому рисуем зеркально сразу — переворот «зашит» в координаты -каждого слоя. Из-за этого момент переключения важен: зелье выпивается из -`play_seq`, то есть в СЕРЕДИНЕ кадра, и остаток кадра рисовался бы уже -зеркально поверх ещё неперевёрнутого фона. Хуже всего пламя факела — оно -ЗАПЕКАЕТСЯ в ОЗУ-копию (`pop_torch_draw`, у него нет heal: каждый следующий -кадр непрозрачно накрывает предыдущий). Кадр пламени, положенный в -зеркальную позицию на старом фоне, оставался там навсегда — по комнате -рассыпались лишние языки огня. - -Поэтому у нас два флага: `pop_upside_want` (пишут зелье, смерть Кида, чит U) -и `pop_upside` (читают все слои отрисовки). Переключение — ровно одно место, -начало кадра, вместе с перерисовкой: главный цикл делает -`pop_upside = pop_upside_want` и зовёт `pop_flip_screen`. - -Сама перерисовка при этом СОВПАДАЕТ с оригиналом: там на -`need_redraw_because_flipped` вызывается `redraw_screen(0)` — полная -отрисовка, а не отражение уже нарисованного. У нас то же самое — -`pop_flip_screen` рисует комнату заново (и получает чистый фон по -построению), а вторую страницу дабл-буфера отдаёт копией акселератора. - -**Что проверять при регрессе.** Уровень 9: выпить зелёное зелье — картинка -переворачивается ровно один раз, лишних языков пламени по комнате нет. Чит -U даёт тот же результат (он идёт тем же путём). - ---- - -## Окклюзия воротами: спрашиваем про рисуемого персонажа, а не жёстко про Кида - -**Оригинал** (`draw_tile_fore`, seg008:0D15) первой строкой: - -```c -if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - Kid.curr_col == drawn_col - 1 && Kid.room != room_R) - draw_gate_fore(); -``` - -То есть бары ворот попадают в foretable — поверх всего нарисованного — когда -на тайле ворот стоит **именно Кид**. Это следствие устройства оригинала: -foretable ОДНА на весь проход тайлов, персонажи в неё уже добавлены, и -отдельного «переднего слоя на персонажа» там нет. - -**Мы** ради скорости не рисуем foretable целиком, а возвращаем куски тайлов -поверх ТОЛЬКО в прямоугольнике персонажа (`pop_fore_over_char`, см. memory -`pop_fore_layer_cost`: полный проход стоил 78 % кадра). Проход идёт по -персонажу, значит и вопрос естественно задавать про него — -`pop_gate_over_char(ch)`, а не про глобального `Kid`. - -**Чем платим.** Наш вариант — надмножество оригинального: страж (или тень), -стоящий в проёме ворот, у нас уходит ЗА решётку, а в оригинале остался бы -нарисованным поверх неё, пока на том же тайле нет Кида. Визуально это -правильнее, но формально расхождение. Обратной разницы нет: во всех случаях, -где оригинал рисует бары поверх, рисуем и мы. - -**Что проверять при регрессе.** Уровень 10, комната 7, тайл (2,6): Кид, -стоящий в проёме ворот, виден ЗА прутьями. Решение покрыто хост-тестами -(`tests-host/t_char.c`, набор `char_gate_*`) — отрисовка в харнесс не -линкуется, поэтому проверяется предикат. - ---- - -## Тень рисуется спрайтами КИДА, а не XOR-силуэтом - -**Файлы:** `src/pop_cdraw.c` (выбор набора атласов по `charid`/`frame`). -**Дата:** 2026-08-18 (решение принималось раньше, записано здесь). - -**Оригинал** рисует тень тем же кадром Кида, но ДВАЖДЫ — вторым проходом со -сдвигом на один пиксель и через XOR. Получается тёмный силуэт с контуром, -а не «второй Кид». - -**Мы** рисуем тень обычными спрайтами Кида, обычным блиттером — она выглядит -как Кид. - -**Почему.** Приём оригинала — read-modify-write по уже нарисованному, а -читать данные из ВИДЕО-ОЗУ (там, где спрайты) на Sprinter нельзя: читается -только ОЗУ-копия. Блочный XOR у акселератора есть и работает как раз по -ОЗУ-копии, но с нашей прозрачностью он несовместим: прозрачность сделана -подавлением записи 0xFF, а XOR прозрачные пиксели тоже смешает — под него -нужен набор с прозрачным 0x00 (замер: memory `accel_block_ops`, -`sprinter_vram_transparency`). То есть «сделать как в оригинале» всё равно -упирается в отдельный набор спрайтов. - -**Чем платим.** Тень визуально неотличима от Кида (уровни 4/5/6/12). На -механику не влияет: слот, окна `Char`, ИИ и коллизия у тени свои и от -картинки не зависят. - -**План.** Отдельный АТЛАС ТЕНИ (готовый силуэт), а не воспроизведение -XOR-прохода: один набор спрайтов вместо второго пути блита. До тех пор -расхождение сознательное — багом не заводить. - -**Что проверять при регрессе.** Уровень 6 комната 1: тень стоит слева -через провал, поза совпадает с позой Кида-в-стойке. Родственная запись — -«Слияние с тенью» ниже. - ---- - -## Слияние с тенью: мигания Кида спрайтами тени нет - -**Файлы:** `src/guards.c` (`autocontrol_shadow_level12`), -`src/pop_cdraw.c`. -**Дата:** 2026-08-13. - -**Оригинал** (`draw_objtable_item`, seg008:20CA) во время вспышки слияния -(`united_with_shadow` считает 42 → 0) рисует КИДА как тень на чётных -значениях счётчика: тот же кадр уходит не обычным прозрачным блиттером, а -парой OR+XOR со сдвигом на пиксель. Получается мерцание «Кид/тень» -примерно полторы секунды. - -**Мы** рисуем всё это время обычного Кида, а само событие обозначаем белой -вспышкой фона (`pop_flash_color = POP_FLASH_WHITE`, 18 кадров) — она в -оригинале тоже есть и ставится тем же кодом. - -**Почему.** У нас Кид и соперник рисуются из РАЗНЫХ атласов своими -палитрами (`pop_cdraw.c`), а «тень» — это персонаж слота Guard с палитрой -комнаты; блиттеров OR/XOR в libbgi нет вовсе, прозрачность сделана -0xFF-подавлением записи. Воспроизвести эффект — значит завести Киду второй -набор спрайтов и второй путь блита ради 42 кадров за всю игру. - -**Чем платим.** Момент слияния читается только по вспышке и по тому, что -тень исчезла, — без «двоящегося» силуэта. На механику не влияет: счётчик -`pop_united_shadow` тикает и уходит в −1 независимо от отрисовки, а от него -зависят и повторный подъём тени, и появление плит в комнатах 2/13. - -**Что проверять при регрессе.** Уровень 12: после слияния экран белеет, -соперник пропал, HP-потолок вырос на единицу, тень в комнате 15 больше не -появляется. Логика покрыта `tests-host/t_shadow.c`. - ---- - -## Отложенный старт падающих плит (уровень 13): фаза 0 у нас «не анимируется» - -**Файлы:** `src/pop_map.c` (`pop_check_fall_flo`, `pop_loose_tick`), -`src/pop_trob.c` (`animate_loose`). -**Дата:** 2026-08-13. - -**Оригинал** (`check_fall_flo`, seg000:1317) раздаёт шести плитам ряда 2 -верхней комнаты модификатор `−(prandom(0xFF) & 0x0F)`, то есть 0..−15, и -заводит на каждую trob. Фаза считает вверх, проходит ноль и дальше идёт -обычным отсчётом до провала — плита падает через `n + 11` кадров. Ноль там -безопасен: плиту держит в игре СПИСОК trob, а не значение модификатора. - -**Мы** списка trob для loose текущей комнаты не держим — плита анимируется -ровно тогда, когда её фаза не ноль (`pop_loose_modif[pos] != 0`). Значит -счёт, дойдя до нуля, оборвался бы навсегда. Компенсируем двумя правками, -которые работают только в паре: - -* тик перескакивает ноль (`if (m == 0) m = 1`); -* стартовое значение берётся на единицу «отрицательнее» (`−n−1`). - -**Чем платим.** Ничем в наблюдаемом поведении: суммарная задержка остаётся -`n + 11` кадров, проверено арифметикой на обоих концах диапазона (n = 0 и -n = 15). Платим связностью — две правки в разных функциях, и убрать любую -одну нельзя. - -**Что проверять при регрессе.** Уровень 13, вход в комнату 23 (она же -стартовая): плиты сверху сыплются ВРАЗНОБОЙ, а не разом и не «никогда». -Логика покрыта `tests-host/t_jaffar.c` -(`jaffar_negative_phase_counts_through_to_fall` и парный контроль на другом -уровне). - ---- - -## Чит навигации по комнатам не запускает бесшовный переход уровня - -**Файлы:** `SprPoP/sprpop_cold.c` (`pop_dbg_roomnav`), `src/sprpop.c`, -`src/pop_state.c` (`pop_nav_hold`). -**Дата:** 2026-08-13. - -**Оригинал** (`play_level_2`, seg000:0900) проверяет `Kid.room == 23` КАЖДЫЙ -кадр: уровень 12 кончается самим фактом присутствия Кида в комнате 23, двери -у него нет. Никакого «как он туда попал» там нет и быть не может — -телепорта между комнатами в игре 1989 года не существует. - -**Мы** держим этот триггер, пока Кид попал в комнату ЧИТОМ навигации -(`+`/`−`), и отпускаем на первой же смене комнаты обычным ходом. - -**Почему.** Чит перебирает комнаты ПО НОМЕРУ (1..24 с обёрткой), то есть -любой обход уровня 12 неизбежно наступает на 23-ю — и уровень молча -становится 13-м. Поймано на первом же прогоне 2026-08-13: проверяющий час -смотрел «комнату 20 уровня 12», которая на самом деле была комнатой 20 -уровня 13, и сравнивал её с картой не того уровня. Комнату 23 уровня 12 -читом не посмотреть в принципе. Это ровно та же болезнь чит-телепорта, что -BUG-CHEAT-FIGHT-1 (выход из боя), и лечится там же. - -**Чем платим.** Ничем в игре: в обычном прохождении Кид входит в комнату 23 -ногами, флаг снят, переход срабатывает как в оригинале. Расхождение видно -ТОЛЬКО при включённых читах. - -**Что проверять при регрессе.** Уровень 12: пройти в комнату 23 ногами — -уровень меняется на 13-й без заставки и без сброса HP. Обойти уровень -читом `+` через 23-ю — уровень НЕ меняется. - ---- - -## Чит «убить стража» (K) идёт через штатный путь смерти - -**Файлы:** `src/pop_guard.c` (`pop_guard_kill`). -**Дата:** 2026-08-13. Решение пользователя. - -**Оригинал** (seg000:786) ставит `guardhp_delta = -guardhp_curr` И -`Guard.alive = 0`. А гейт события смерти в `play_guard` (seg006:1490) -требует `Char.alive < 0` — то есть у оригинала чит убивает стража В ОБХОД -`on_guard_killed`. На 13-м уровне это заметно: победа над Джафаром по читу -не ставит `leveldoor_open = 2`, и выход на 14-й не открывается. - -**Мы** `Guard.alive` в чите не трогаем: применённая дельта обнуляет HP, и -`play_guard` сам переводит стража в «умирает», вызвав `on_guard_killed` — -брызги, вспышка, флаг выхода. То есть чит даёт ровно «как будто убил Кид». - -**Почему.** Отладочный прогон 13-го уровня иначе требует каждый раз честно -выигрывать бой с Джафаром (skill 9, 6 HP) — это дорого по времени, а -проверять надо совсем другое. - -**Чем платим.** Ничем в игре: читы включаются флагом `pop_cheats`, в -релизной сборке они выключены. Расхождение наблюдаемо только с читами. - -**Что проверять при регрессе.** Уровень 13: `K` на Джафаре → белая вспышка, -уход ВЛЕВО открывает дверь уровня. Честная победа в бою даёт то же самое. - ---- - -## Страж, вытесненный за правый край комнаты и там убитый, не виден нигде - -**Не расхождение, а особенность оригинала.** Записано, чтобы вопрос не -возникал повторно (спросил пользователь 2026-08-19: бой шёл в комнате 15, -Кид вытеснил стража вправо — из-за края торчал только меч, — убил его, и -труп не появился ни в комнате 15, ни в соседней справа). - -**Почему так.** Три механизма складываются: - -1. **комнату страж не менял.** Его физика работает только в полосе - `x ∈ [44, 211)` (`seg000:1254`, у нас то же условие в - `pop_guard_phys_tick`), поэтому своим ходом за край он не уходит — - Кид вытолкнул его туда толчком, а `Guard.room` остался прежним; -2. **мёртвый за Кидом не идёт.** Единственный способ сменить комнату — - `follow_guard` при переходе Кида, и первое же условие там - (`seg002:0346`) — `Guard.alive < 0 && Guard.sword == sword_2_drawn`, - то есть ЖИВОЙ и с вынутым мечом. Мёртвый уходит веткой `leave_guard`, - которая сохраняет его в **`Guard.room`** — в старую комнату. У нас - ровно это же условие, `pop_guard_cold.c` (`pop_guard_follow`); -3. **из соседней комнаты страж не рисуется.** Оригинал при - `Guard.room != drawn_room` просто ГАСИТ слот (`seg000:422`: - `Guard.direction = dir_56_none`). Механизм «видно из-за шва» - (`xpos_in_drawn_room`) работает для коллизий и для Кида, но стража из - чужой комнаты на экран не выводит. - -Итог: труп приписан комнате, где страж стоял, а его `guards_x` — за -правым краем. При возврате в ту комнату он честно восстанавливается там -же, то есть за пределами видимого поля; в соседней комнате его нет, -потому что в её данных стража и не было. - -**Живой страж в этой ситуации ведёт себя иначе** — при уходе Кида вправо -он идёт следом, если стоит достаточно близко к краю (`Guard.x >= 165`). -Это портировано и работает. - -**Чего я НЕ проверял:** живьём в SDLPoP этот сценарий не воспроизводил — -вывод сделан чтением трёх мест кода. Если понадобится подтверждение, -сценарий короткий: любой бой у правого края комнаты, вытеснить стража за -край и добить. - -## ГСЧ разведён по доменам (у оригинала он ОДИН) - -**Оригинал.** `random_seed` один на всё: кладка стены, анимация тайлов, -броски боя, модификаторы падающих плит — всё тянет из одной -последовательности (`seg009` PRNG, 32-битный LCG). Поэтому в оригинале -бой воспроизводим вместе со всем остальным: тот же сид — тот же бой. - -**У нас.** Сидов несколько: `pop_t_seed` (кладка, `pop_tile.h`), -`pop_fight_seed` (броски боя, `pop_guard.h`), отдельные у trob и loose. -Сам генератор тот же (`pop_prandom`), таблицы вероятностей — -побайтно те же, что в `data.h`. - -**Чем платим.** Конкретный бой у нас и в SDLPoP разойдётся: порядок -бросков другой, значит блоки/удары лягут иначе. Статистически поведение -то же (те же вероятности, тот же генератор), но «сверить бой кадр в кадр -с SDLPoP» нельзя, и QuickSave обязан сохранять ВСЕ сиды, а не один. - -**Что проверять при регрессе.** Если страж кажется сильнее/слабее -оригинала — сначала проверить не таблицы (они сверены), а **режим -скорости**: `fight_speed` у оригинала 100 мс, а в нашем FASTEST бой идёт -61,4 мс, то есть в реальном времени на 63 % быстрее, и на глаз это ровно -«страж давит сильнее». Режим NORMAL (дефолт) даёт 102,4 мс — см. -`frame_pacing_plan.md`. - -## PV intro: единые 12,5 FPS вместо переменных 10/7,5/8,57 FPS - -**Оригинал.** `proc_cutscene_frame()` двигает последовательности через -`cutscene_frame_time`: 6 тиков 60 Гц в начале, 8 после первой речи и 7 во -время заклинания. Это соответственно 10, 7,5 и примерно 8,57 FPS. - -**У нас (осознанное временное отличие).** Один логический кадр PV держится -четыре физических кадра Sprinter: номинально 50/4 = 12,5 FPS. Молния живёт -на отдельной физической шкале и не растягивается этим делителем. Если полная -отрисовка пересечёт дополнительный фронт, реальная частота может упасть до -10 FPS — это допустимо на текущем этапе, но должно быть измерено. - -**TODO.** Перевести PV-сцену на тот же anchor-based механизм точного темпа, -который gameplay использует через `pop_beam_sample/pop_pace_end`: измерять -число реально прошедших фронтов во время сборки кадра, держать период ровно -четыре фронта при укладывании в бюджет и явно учитывать overrun. После замера -можно вернуть точные переменные интервалы SDLPoP без накопления фазы. - -## Межуровневые PV-сцены: сохранён реальный период 100 мс - -Это правило не относится к временному темпу основного Princess/Jaffar intro -выше. `reset_cutscene()` SDLPoP задаёт для сцен перед уровнями период -6 кадров при 60 Гц, то есть 100 мс. На Sprinter тот же период получается -ровно как 5 кадров при 50 Гц. - -Суммы вызовов `proc_cutscene_frame()` перенесены без изменения реального -времени: сцены 2/4/6 и обе ветки 12 содержат 26 логических кадров (130 -физических, 2,6 с), сцена 8 — 60 (300, 6,0 с), сцена 9 — 72 (360, 7,2 с). -Fade in/out в эти числа не входят, как и в оригинале. - -## Gameplay: загрузка уровней через чёрный cut, без fade - -**Оригинал.** На границах игровых уровней использует fade out/in. - -**У нас (решение пользователя 2026-08-24).** Вход в первый уровень и -переход между уровнями выполняются как `старый кадр -> чёрная палитра -> -подготовка -> новый кадр с новой палитрой`. Fade на этих двух маршрутах -отсутствует. Сюжетные title/story/PV переходы сохраняют собственные fade и -left-to-right эффекты. - -Чёрная палитра устанавливается до любого HDD I/O. Загрузчики guard и -tileset сами физически правят отдельные цветовые слоты, поэтому после них -чёрный экран подтверждается повторно. Зеркальные атласы уровня 9 готовятся -до финального источника палитры. CBL открывается последним: старый порядок -`level_switch -> CBL open -> BIOS fade` давал скрежет повторяющейся половины -аппаратного буфера на входе в Level 1; после перестановки баг исчез в MAME. - -## Тень: кайма силуэта не подкрашивается фоном - -**Оригинал.** Спрайт Тени не хранится — он кладётся ДВАЖДЫ: обычным -прозрачным блитом в x и «блиттером XOR» в x+1 (`draw_objtable_item`, -seg008.c:1600). XOR идёт по 24-битному RGB того, что УЖЕ на экране -(`blit_xor`, seg009.c:3190), поэтому там, где спрайт прозрачен в x, но -непрозрачен в x−1, цвет получается как `фон XOR цвет спрайта`. - -**У нас.** Пакетный блит наложения на себя не умеет, поэтому результат -запечён в отдельный атлас (`toolchain/pop_pack_shadow.py`, -`docs/shadow_atlas_plan.md`). Запекать пришлось для КОНКРЕТНОГО фона, и -выбран чёрный: на нём `фон XOR цвет == цвет`, то есть запечка точна. - -**Чем платим.** Ровно одним: **кайма в один пиксель по ЛЕВЫМ кромкам -силуэта** на НЕчёрном фоне. У оригинала она принимает оттенок фона, у нас -всегда «свой» цвет. Внутренность силуэта и правые кромки совпадают точно — -там первый проход уже закрасил пиксель, и от фона результат не зависит. - -**Почему это приемлемо.** Тень бывает на четырёх уровнях, и почти всегда -на чёрном: у зеркала (ур. 4), в проёме (5), над пропастью (6), в бою (12). - -**Что проверять при регрессе.** Если Тень окажется на светлом фоне и -кайма станет резать глаз — вариантов два: запечь второй набор под светлый -фон (ещё 32 страницы EMM) или считать эту кайму прозрачной (силуэт станет -на пиксель уже). Оба хуже нынешнего; трогать только по факту жалобы. - - -## QuickSave/QuickLoad: лейбл печатается ДО дисковой операции, а не после - -**Как в оригинале.** SDLPoP печатает `QUICKSAVE` / `NO QUICKSAVE` (и пару -для загрузки) уже ПО РЕЗУЛЬТАТУ операции — `process_quicksave` (seg000:497) -сначала делает save/load, потом зовёт `display_text_bottom` и ставит -`text_time_total = 24`. На PC это незаметно: файл пишется мгновенно. - -**У нас.** `pop_qsave_process` заявляет строку ПЕРВЫМ действием, ещё до -`mem_alloc_pages`/ESTEX, через `pop_status_show_now()` — та печатает её -немедленно в ВИДИМУЮ страницу, не дожидаясь конца кадра. Отказ уже потом -переписывает строку на `NO QUICKSAVE`/`NO QUICKLOAD` обычной заявкой. - -**Зачем.** Запись снимка на диск занимает доли секунды, и всё это время -игра стоит. При порядке оригинала игрок видел сначала необъяснённый фриз, -и только по его окончании — надпись, объясняющую то, что уже прошло. -Решение пользователя, 2026-08-25. - -**Чем платим.** Строка успевает мигнуть даже там, где операция потом не -удалась: сначала `QUICKSAVE`, следом `NO QUICKSAVE`. На практике отказ — -редкость (нет места/диска), и «заявка → отказ» читается не хуже. - -**Что проверять при регрессе.** Что после неудачной операции на экране -остаётся именно `NO QUICKSAVE`/`NO QUICKLOAD`, а не первая строка: отказ -идёт обычной заявкой и печатается кадровым проходом, то есть на кадр позже. - - -## Смерть Кида: ждём кнопку и перезапускаем УРОВЕНЬ, а не игру - -**Как в оригинале.** `play_kid` (seg006:1383) печатает «Press Button to -Continue» с `text_time_total = 288`. Тик — это логический игровой кадр, -720 тиков = минута, то есть 12 тиков в секунду: 288 тиков = **24 секунды**. -Последние 72 тика (6 секунд) строка мигает с периодом 12 тиков, и на каждом -появлении играет звук 38. Дальше развилок ровно две: - -* игрок молчит все 24 секунды — `draw_game_frame` (seg000:958) зовёт - `start_game()`, и игра начинается ЗАНОВО, с title, а не с уровня; -* игрок нажимает **Enter или Shift** (не любую клавишу!) — seg000:584 - подменяет их на Ctrl+A: `if (rem_min != 0 && Kid.alive > 6 && (control_shift - || key == SDL_SCANCODE_RETURN)) key = SDL_SCANCODE_A | WITH_CTRL;` — и - уровень перезапускается. Условия важны: время не должно быть исчерпано - (иначе отработал `expired()`), а `Kid.alive > 6` даёт трупу улечься. - -**У нас.** Обе развилки сведены к одной: 24-секундного выхода в начало -игры нет вовсе, строка висит бессрочно (`MSG_HOLD`), а перезапускает уровень -ЛЮБАЯ кнопка, а не только Enter/Shift (решение пользователя). -`pop_start_level()` возвращает игрока на уровень. Место возрождения выбирает сам `pop_start_level` — на части -уровней это не старт, а пройденный чекпойнт. Esc за кнопку продолжения не -считается: он открывает pause menu. Логика ожидания живёт в банке -(`pop_dead_prompt`, pop_status.c) — резидент W1 переполнен. - -**Зачем.** Решение пользователя, 2026-08-25: возврат к title после каждой -смерти в отладочной сборке съедает всё время прохода, а прежний вариант -(авто-респавн через 400 кадров либо стрелка вверх) не объяснял игроку, чего -от него ждут. - -**Чем платим.** Двумя вещами. Первое: смерть больше не заканчивает -партию — счёт попыток фактически бесконечен, тогда как оригинал через 24 -секунды бездействия отправляет в title. Второе: любая клавиша вместо -Enter/Shift означает, что случайное нажатие (например, ещё не отпущенная -после боя клавиша) перезапустит уровень — отсюда требование сперва отпустить -всё. Когда дойдёт до «настоящей» игры, обе развилки придётся выбирать -заново: вернуть таймер на 288 тиков со start_game и сузить клавиши до -Enter/Shift — либо оставить как есть уже осознанно. - -**Что проверять при регрессе.** Нажатие принимается только после того, как -отпущено ВСЁ, что игрок держал в момент смерти (иначе зажатая при падении -стрелка перезапускает уровень мгновенно), и не раньше `RESPAWN_SETTLE` -кадров — труп должен успеть лечь. - ---- - -## Таблица рекордов: Esc отменяет запись, а оригинал уйти не даёт - -**Как в оригинале.** `show_hof` вставляет результат в таблицу ДО ввода -имени и крутит ввод, пока тот не вернёт положительную длину: - -```c -/* SDLPoP seg001.c:624 */ -while (input_str(&rect, hof[hof_index].name, 24, "", 0, 4, color, bgcolor) <= 0); -/* seg009.c input_str: Esc -> return -1; Enter -> return length */ -``` - -То есть **уйти нельзя ни по Esc, ни с пустым именем**: и −1, и 0 просто -начинают ввод заново. Запись в таблице остаётся в любом случае. - -**Как у нас.** Enter записывает имя (пустое подставляется как `PLAYER`), -**Esc отказывается от записи целиком**: таблица перечитывается с диска -(`hof_load`), `hof_save` не вызывается, экран показывается уже без строки -ввода. - -**Зачем.** Решение пользователя, 2026-08-27. Оригинальное поведение -означает, что случайно добравшийся до финала игрок обязан вписать имя, -чтобы вообще уйти с экрана, — на клавиатуре без цифрового блока и с нашим -raw-каналом это выглядит как зависание, а не как требование. - -**Чем платим.** Расхождение видно игроку: в оригинале таблица после -победы пополняется всегда. Плюс отмена стоит одного лишнего чтения -POP.HOF — откатывать сдвиг строк, который сделал `hof_insert_current`, -дешевле перечитыванием файла, чем обратным сдвигом (экран холодный, -50 мс там никому не мешают). - -**Что проверять при регрессе.** После Esc: таблица на экране прежняя (без -новой строки), POP.HOF на диске не изменился, следующий показ таблицы — -между credits и attract-demo — даёт тот же список. После Enter с пустым -именем строка называется `PLAYER` и сохраняется. diff --git a/applications/SprPoP/docs/keys.txt b/applications/SprPoP/docs/keys.txt deleted file mode 100644 index 3572819..0000000 --- a/applications/SprPoP/docs/keys.txt +++ /dev/null @@ -1,77 +0,0 @@ -* Left: turn or run left -* Right: turn or run right -* Up: jump or climb up -* Down: crouch or climb down -* Down+Left/Right: hop -* Shift: pick up things -* Shift+Left/Right: careful step -* Home or Up+Left: jump left -* Page Up or Up+Right: jump right -* Up while running: running jump -* Shift while falling: grab onto ledge - -* Left/Right: walk (advance or retreat) -* Shift: strike (attack) -* Up: block (defend) -* Down: put sword away; press Shift to draw your sword again. - -=== - -* Esc: Pause game. -* Space: Show how much time is left. -* Ctrl+A: Restart level. - -* Ctrl+R: Return to intro. -* Ctrl+S: Sound on/off. -* Ctrl+M: Music on/off. -* Ctrl+Q / F10: Quit game. - -* F6: Quicksave: Save the exact state of the game. -* F9: Quickload: Load what the last quicksave saved. -* F12: Save a screenshot to the screenshots folder (optional - можно пока не делать). -* Backspace: Display the in-game menu. (Esc will also display the menu by default, but you can turn that off.) - -* Shift+L: Go to next level. -* -: Decrease remaining time by one minute. (Both the main row and the keypad.) -* +: Increase remaining time by one minute. (Both the main row and the keypad.) -* R: Resurrect kid. -* K: Kill guard. -* Shift+I: Flip the screen upside down. -* Shift+W: Slow falling. -* Shift+S: Restore a lost hit-point. (Like a small red potion.) -* Shift+T: Give more hit-points. (Like a big red potion.) - -=== - -* H: Look at the room to the left. -* J: Look at the room to the right. -* U: Look at the room above. -* N: Look at the room below. -* Ctrl+B: Go back to the room where the prince is. (Undo H,J,U,N.) - -=== - -* [: Shift kid 1 pixel to the left. -* ]: Shift kid 1 pixel to the right. -* T: Toggle display of timer (remaining minutes:seconds). - -=== - -Sprinter-specific debug keys (not in the original; all under Ctrl so that no -plain letter is taken away from the layout above): - -* Ctrl+I: Immortality, cycling off -> combat only -> combat and minor damage. -* Ctrl+P: Speed mode. -* Ctrl+F: Freeze / unfreeze the frame (was 1 and 2). -* Ctrl+D: Debug bar (level/room/... in the top border) on/off. Same switch - as the Settings screen has; the shortcut does not write POP.CFG, - saving stays with Settings. - (The per-phase colour profiling of the border is a different thing - and stays a build option: make PROF=1.) -* Ctrl++ / Ctrl+-: Teleport to the next / previous room by number (ROOMNAV). - The plain +/- belong to the timer, as in the original; the debug - walk moved onto the same keys under Ctrl so muscle memory keeps. - -Note: Ctrl+B is deliberately NOT used here — the layout above reserves it for -"go back to the room where the prince is". - diff --git a/applications/SprPoP/docs/keys_plan.md b/applications/SprPoP/docs/keys_plan.md deleted file mode 100644 index b92386b..0000000 --- a/applications/SprPoP/docs/keys_plan.md +++ /dev/null @@ -1,170 +0,0 @@ -# План: перевод управления на раскладку `keys.txt` - -> **Состояние на 2026-08-27.** Фазы **A** и **B** сделаны (коммит 76f02e7), -> фаза **C** — три чита из четырёх (f8e96c0). Отложены и записаны на доску -> [`TASKS_OPEN.md`](TASKS_OPEN.md): `KEYS-R` (воскрешение), `KEYS-D` (осмотр -> соседних комнат), `KEYS-F12` (скриншот). Итоговая раскладка, включая наши -> сверхштатные клавиши, — в [`keys.txt`](keys.txt). - -Целевая раскладка — [`keys.txt`](keys.txt), она же раскладка SDLPoP. Здесь -разобрано, что у нас уже есть, что стоит не на той клавише и каких функций -нет вовсе, плюс порядок работ. Кода этот документ не меняет. - -## 1. Принципы - -**Раскладка — не самоцель.** Часть строк `keys.txt` — это функции SDLPoP, -которых у нас нет вообще (воскрешение, замедленное падение, осмотр соседних -комнат). Поэтому работа делится на две разные по цене части: *переназначить -клавишу* (минуты) и *реализовать функцию* (от часа до дня). Смешивать их в -одной фазе нельзя — иначе простые переименования застрянут за сложным. - -**Механику сверять с SDLPoP.** Для каждой новой функции — сначала найти её в -`assets/orig/SDLPoP/src/`, потом писать (правило проекта, memory -`pop_check_sdlpop_first`). Особенно для читов: `Shift+S`/`Shift+T` — это не -«прибавить HP», а конкретные `add_life`/`set_health_life`. - -**Кромка против удержания.** Игровые клавиши (стрелки, Shift) читаются как -удержание — это held-state, ради которого и заводился ``. Все -служебные и читерские — как НОВОЕ нажатие (edge), иначе одно касание -сработает столько раз, сколько кадров клавиша была внизу. В коде уже есть -оба образца: `read_user_control()` для первого, `intro_skip_requested()` и -`hof_*` для второго. - -**Где живёт обработчик.** Служебный слой — `pop_frame_ui()` в -`sprpop_cold.c` (банк 8), читы — `pop_cheat.h` + вызовы из главного цикла. -После переноса `pop_config`/`pop_hof` в банк 10 в банке 9 свободно 4436 -байт, в банке 8 — 1786; новые обработчики лучше класть в 8-й или 10-й, а не -в 9-й. - -**Ctrl-комбинации уже поддержаны:** `Ctrl+S`/`Ctrl+M` проверяют -`KBD_LCTRL || KBD_RCTRL` вместе с буквой (`sprpop_cold.c:518`). Тот же -приём годится для `Ctrl+A`, `Ctrl+R`, `Ctrl+V`, `Ctrl+Q`, `Ctrl+B`. - -## 2. Что есть сейчас - -### Движение и бой — совпадает, кроме диагоналей - -| `keys.txt` | у нас | статус | -|---|---|---| -| Left / Right / Up / Down | стрелки, `read_input()` | **есть** | -| Down+Left/Right — прыжок на месте | комбинация стрелок | **есть** | -| Shift — поднять предмет | `KBD_LSHIFT`/`KBD_RSHIFT` | **есть** | -| Shift+Left/Right — осторожный шаг | комбинация | **есть** | -| Up+Left / Up+Right — прыжок в сторону | комбинация | **есть** | -| **Home / Page Up** — то же самое | — | **НЕТ**: читаются только стрелки | -| Up на бегу — прыжок с разбега | | **есть** | -| Shift в падении — зацеп | | **есть** | -| Бой: Left/Right/Shift/Up | | **есть** | -| Бой: Down — убрать меч | | **проверить отдельно** | - -### Служебные - -| `keys.txt` | у нас | статус | -|---|---|---| -| `Esc` — пауза/меню | `KBD_MENU = 0x76` | **есть** | -| `Backspace` — меню | — | **НЕТ** (в оригинале это основная клавиша меню, Esc — дублёр) | -| `Space` — показать остаток времени | — | **НЕТ** (`Space` занят только в меню и вводе имени) | -| `Ctrl+A` — рестарт уровня | только пунктом меню | **НЕТ клавиши** | -| `Ctrl+R` — вернуться в заставку | — | **НЕТ** | -| `Ctrl+S` — звук вкл/выкл | `Ctrl+S` | **есть, совпадает** | -| `Ctrl+M` — музыка вкл/выкл | `Ctrl+M` | **есть, совпадает** | -| `Ctrl+V` — версия | `pop_build_info_show()` есть, зовётся на старте | **НЕТ клавиши** | -| `Ctrl+Q` / `F10` — выход | `F10` в двух местах | **половина** (см. §3) | -| `F6` / `F9` — quicksave/load | совпадает | **есть** | -| `F12` — скриншот | — | помечено опциональным, **не делаем** | - -### Читы - -| `keys.txt` | у нас | статус | -|---|---|---| -| `Shift+L` — следующий уровень | совпадает | **есть** | -| `K` — убить стража | совпадает | **есть** | -| `[` / `]` — сдвинуть Кида на пиксель | совпадает | **есть** | -| `+` / `−` — минута времени | у нас это **F7/F8**, а `+`/`−` заняты обходом комнат | **конфликт, см. §3** | -| `Shift+I` — перевернуть экран | у нас это **`U`** | **переназначить** | -| `R` — воскресить Кида | — | **НЕТ функции** | -| `Shift+W` — замедленное падение | — | **НЕТ функции** | -| `Shift+S` — вернуть одну единицу HP | — | **НЕТ функции** | -| `Shift+T` — добавить HP | — | **НЕТ функции** | -| `T` — показывать таймер | — | **НЕТ функции** | - -### Осмотр комнат — нет целиком - -`H` / `J` / `U` / `N` (соседняя комната слева/справа/сверху/снизу) и -`Ctrl+B` (вернуться к Кида) не реализованы. У нас есть отладочный **обход -комнат по номеру** (`+`/`−`, `ROOMNAV` в `sprpop.c`) — это другое: он -ТЕЛЕПОРТИРУЕТ Кида, а `H/J/U/N` только смотрят, не двигая его. - -### Наше сверх `keys.txt` - -`I` — бессмертие, `P` — режим скорости, `1`/`2` — стоп-кадр, `+`/`−` — -обход комнат. Всё это отладочное и в оригинале отсутствует; выбросить или -оставить — решение пользователя (§6). - -## 3. Конфликты, которые надо решить до кодинга - -**К1. `+`/`−`: время или комнаты.** `keys.txt` отдаёт их под ±минуту, у нас -на них обход комнат, а время висит на F7/F8. В `pop_cheat.h` это записано -как осознанный выбор («Numpad +/- уже принадлежат ROOMNAV»). Варианты: -вернуть `+`/`−` времени и увести ROOMNAV на другие клавиши; оставить как -есть и разойтись с `keys.txt`; либо развести по контексту (ROOMNAV — только -в отладочной сборке). Развилка требует решения. - -**К2. `U` занят.** Сейчас `U` — переворот экрана, а `keys.txt` хочет `U` под -«посмотреть комнату сверху», переворот — на `Shift+I`. Разрешается само, -если делать К5 и К7 одной фазой. - -**К3. `S` без Ctrl.** Звук у нас требует Ctrl, и это правильно, но -`keys.txt` хочет ещё и `Shift+S` (вернуть HP). Проверка обязана различать -`Ctrl+S`, `Shift+S` и голое `S`, иначе они будут срабатывать вместе. То же -для `T`: `T` (таймер) против `Shift+T` (добавить HP). - -**К4. Два выхода.** `F10` живёт в `pop_frame_ui()` (только в игре) и, с -коммита 808c2a5, в `kbd_idle()` (везде). Дублирование безвредное, но лишнее: -проверку в `pop_frame_ui` стоит убрать, оставив одну точку. Заодно повесить -туда же `Ctrl+Q`. - -## 4. Порядок работ - -**Фаза A — переназначения, функции уже есть.** Дёшево и не трогает логику. -- `Shift+I` вместо `U` для переворота экрана (К2). -- `Backspace` как основная клавиша меню, `Esc` оставить дублёром. -- `Ctrl+V` на существующий `pop_build_info_show()`. -- `Ctrl+Q` рядом с `F10`, убрать дубль `F10` из `pop_frame_ui` (К4). -- `Ctrl+A` на существующий путь `POP_MENU_RESTART_LEVEL`. -- Решение по К1 и правка `+`/`−`/F7/F8. - -**Фаза B — мелкие новые функции.** -- `Space` — показать остаток времени. Механика есть (`pop_timer`, статус- - строка); нужен показ на несколько секунд, как `text_time_total` оригинала. -- `T` — постоянный показ таймера (минуты:секунды) в статус-строке. -- `Ctrl+R` — возврат в заставку. Автомат это умеет (`POP_APP_EV_RESTART_INTRO`), - нужен только вход с клавиши. - -**Фаза C — читы, требующие правки игровой логики.** Каждый — сверка с -SDLPoP до кодинга. -- `Shift+S` / `Shift+T` — HP: аналоги малого и большого красного зелья. -- `R` — воскрешение Кида: сложнее прочих, поднимает мёртвого персонажа и - должен согласоваться с уже существующим гейтом «мёртв» (memory - `pop_level_restart_scope`). -- `Shift+W` — замедленное падение. - -**Фаза D — осмотр соседних комнат (`H`/`J`/`U`/`N` + `Ctrl+B`).** Самое -крупное: нужен показ комнаты, в которой Кида нет, с возвратом. У нас уже -разобрана модель `kid_room ≠ drawn_room` (memory `pop_seam_room_model`, -[`room_model_plan.md`](room_model_plan.md)) — это её прямое применение, и -именно поэтому фаза идёт последней. - -**Фаза E — `F12` скриншот.** Помечен опциональным; предлагаю не делать -вовсе: файл на 80 КБ и запись на диск посреди кадра. - -## 5. Открытые вопросы - -1. **К1** — кому отдать `+`/`−`: времени (как `keys.txt`) или обходу комнат? -2. Что делать с нашими сверхштатными клавишами (`I` бессмертие, `P` скорость, - `1`/`2` стоп-кадр): оставить как есть, увести под отладочную сборку или - выбросить? -3. Нужны ли `Home`/`Page Up` как дублёры диагональных прыжков — на IBM-клавиатуре - Sprinter они есть, но комбинация `Up+Left` уже работает. -4. Фазы C и D — делать ли их вообще: это читы и отладочный осмотр, к - прохождению игры отношения не имеющие. diff --git a/applications/SprPoP/docs/layout_plan_v2.md b/applications/SprPoP/docs/layout_plan_v2.md deleted file mode 100644 index d32a4ee..0000000 --- a/applications/SprPoP/docs/layout_plan_v2.md +++ /dev/null @@ -1,532 +0,0 @@ -# SprPoP — план v2: размер кода и раскладка по окнам/банкам/страницам - -> **Замер 2026-08-08, после MEM-BANK2 (актуальная сборка, ALLOCS=3000).** -> `_CODE` 22 556 Б, данные 4 375, куча 4 301. Банки: 1 (`guards.c`) 2 289, -> 2 (`pop_bg.c`, ГОРЯЧАЯ половина фона) 5 872, 3 (`pop_map.c`) 8 483, -> 4 (`pop_cdraw.c`) 5 664, 5 (`pop_ctrl.c`) 2 040, 6 (`pop_trob.c`) 2 889, -> 7 (`pop_room.c`, ХОЛОДНАЯ половина фона) 6 035 — все из 16 384. -> -> Слой фона разрезан надвое по ЧАСТОТЕ ВЫЗОВА (`TASKS_CLOSED.md#mem-bank2`): -> общие листья — в резидент `pop_tile.c` (W1 замаплен всегда, таблицы видны -> обеим половинам), горячий fore-проход остался в банке 2, холодная отрисовка -> комнаты и точечные перерисовки уехали в банк 7. Стык — три тонкие -> `__banked`-обёртки, чтобы трамплин платил только холодный путь. -> **Банк 2: 90.4 % -> 35.8 %.** Резидент вырос на 2 КБ (листья) — куча -> 6 333 -> 4 301 Б, это плата за то, что таблицы должны быть видны из двух -> банков. -> -> Число банков дублируется: `--bank N=` в Makefile И `const uint8_t n_banks` -> в `sprpop.c`. Расхождение — не ошибка сборки, а зависание до первого -> кадра. -> -> **Замер 2026-08-01 (историческая отметка).** `_CODE` 25 119 Б, `_DATA` 3 709, -> куча ~2.4 КБ. Банки: 1 (`guards.c`) 1 896, 2 (`pop_bg.c`) 13 792, -> 3 (`pop_map.c`) 6 331, 4 (отрисовка стража) 2 236 — все из 16 384. -> **Резидента `--w3` больше нет**: отрисовка уехала в банк 2, и это сняло -> главное ограничение резидента (из банка его было не достать) — банк→банк -> работает, трамплин сохраняет страницу окна на стеке. Отрисовка стража -> вынесена из банка 2 в собственный банк 4, потому что банк 2 подошёл к -> потолку (16 021 из 16 384) — коммит `2f3e854`. -> -> **Свободного места в банке 2 теперь 10.5 КБ**, в банке 7 — 10.3 КБ; туда -> просятся чомперы, зеркало и второй тайлсет (palace). Прежде чем начинать -> `levels_plan.md` §3 — всё равно посчитать, куда это ляжет. Следующий -> свободный номер банка — 8, гранулярность — файл. -> -> Из плана ниже **не сделаны шаги 5 (данные: `room_modif`, `dl1/dl2`, -> `_kbdraw_down`; потенциал ~1.5 КБ) и 7 (дедуп `draw_tile`, отложен по -> решению пользователя)**. - -Статус: **план для отдельной сессии**, составлен 2026-07-29 по свежему замеру. -Заменял `size_optimization_plan.md` (v1, 2026-07-21) — тот удалён 2026-08-01 -как полностью перекрытый этим документом. Документ самодостаточный -— рассчитан на старт с пустого контекста. - -Повод: перед стражами и боёвкой (новый код ~5–8 КБ) надо понять, куда он -поместится, и заранее развести код так, чтобы банкованные модули не упёрлись в -ограничения окна W3. - ---- - -## СТАТУС ВЫПОЛНЕНИЯ (обновлено 2026-07-29, коммит ecf5ecf) - -| Шаг | Статус | Факт | -|-----|--------|------| -| 1. `kid_data.h` → EMM-страница + `load_frame`/`cur_frame` | **сделан** | `_CODE` −3 247 Б; попутно найден и обойдён баг кодогенерации SDCC (см. ниже) | -| 2. `pop_geom.c` (дедуп геометрии + PRNG) | **сделан** | −41 Б `_CODE`, −11 Б W3; ценность — не байты, а bank-safe слой | -| 3. `pop_map` без вызовов графики | **сделан** (фазы 1a/1b) | через пометки перерисовки, см. ниже | -| 4. Разгрузка/перебалансировка W3 | **сделан** | резидент = `pop_bg` + `pop_gdraw` (отрисовка стража, 2026-07-29); W3 14 376 → 12 819 (свободно 3 565 Б) | -| 5. Данные (`room_modif`, `dl1/dl2`, `_kbdraw_down`) | не начат | потенциал ~1.5 КБ | -| 6. Контракт банка стражей + пробник | **пробник сделан** | `tests/w3bankgfx` — модель подтверждена в MAME, см. ниже | -| 7. Дедуп семейства `draw_tile` | отложен по решению пользователя | «мороки много, выгода не так велика» | - -**Замер сейчас против замера §1:** `_CODE` 24 881 → 24 421, куча W2 2 076 → 2 592 Б, -W3-резидент 14 376 → 11 632 (свободно 2 008 → 4 752 Б). Сумма кода упала -на ~3.2 КБ (данные Kid уехали в EMM), остальное — перераспределение. - -**Замер 2026-07-29 (после стража).** Появление стража съело кучу до 805 Б; -разгрузка — вынос ОТРИСОВКИ стража в резидент (`pop_gdraw.c`, `--w3`), логика -и состояние остались в W1/W2, чтобы банк `guards.c` их видел (R2). Итог: -`_CODE` 26 149 → 25 703, куча **805 → 1 245 Б**, W3-резидент 11 656 → 12 819 -(свободно 4 728 → 3 565 Б), банк 1 — 236 / 16 384 Б. Граница «что резидент» -теперь формулируется одним правилом: **резидент = только то, что рисует и -зовётся исключительно из главного цикла**; всё, что может понадобиться банку, -остаётся в W1/W2. - -### Что сделано вместо §5.3 (вынос loose в W3) - -Вместо переноса кода между окнами выбран (по обсуждению с пользователем) -**порт архитектуры оригинала**: логика ставит пометку, отрисовка идёт -отдельным проходом — `set_redraw_*` (seg007) + `redraw_needed` (seg008:0178). -Появился `pop_redraw.c/.h`; `pop_trob` и `pop_map` больше не рисуют тайлы. -Наши самодельные счётчики (`spike_rest`, `button_rest`, `ldoor_rest`, -`loose_bake`, `loose_rest`, `ceil_rest`, `ceil_bake`, `land_bake`) удалены — -их роль (вторая страница дабл-буфера) взял счётчик страниц в пометке. - -**Два исключения остались** (обе — функции ТОЛЬКО главного цикла, звать из -банка нельзя): -- `pop_process_trobs` — пламя факела и пузырёк зелья (покадровый оверлей); -- `pop_loose_tick` — падающий кусок (mob): spawn/tick/pos. В оригинале это - отдельная подсистема (`mobs` + `draw_moving`), разделение на логику и - отрисовку — задел следующей фазы. - -### Пробник банка (2026-07-29): модель ПОДТВЕРЖДЕНА - -`tests/w3bankgfx` (huge + `--w3 res.c` + `--bank 1=bank1.c`, графика 256): - -- банк рисует примитивом libbgi НАПРЯМУЮ — работает; страница W3 внутри - банка до блита, после блита и после возврата из вызванной им W1/W2-функции - одна и та же (0xF0), резидент — 0xF3. То есть `_bgi_begin`/`_bgi_end` - корректно возвращают ИМЕННО банковую страницу (правило R4); -- вызов W1/W2-функции из банка работает, и она тоже может рисовать; -- резидент W3 жив и вызывается после возврата из банка (R3). - -**Дополнительно выяснено (важно для стражей):** писучие статики -`__banked`-модуля линкуются В СТРАНИЦУ БАНКА (0x1C000+) — снаружи их не -прочитать, из W1/W2 по 0xC000 видна резидентная страница. Значит всё -состояние банкованного кода (позиции стражей, таймеры боя) обязано жить в -W1/W2 как обычные глобалы, а банк — только код. - -Ещё одна мина, найденная там же: инлайновый `in a,(#0xE2)` посреди тела -функции затирает A, куда SDCC уже положил параметр (у нас из-за этого цвет -заливки стал номером страницы, и «резидент не рисовал»). Читать порт -отдельной `__naked`-функцией. - -### Найденная по дороге ловушка компилятора - -`(const T *)КОНСТАНТА + var*K` SDCC 4.5 может собрать неверно: умножение -делает в 16 битах, а потом берёт только младший байт (`ld c,l` / `inc b`). -Кадры Kid с индексом ≥ 52 читались из чужой строки таблицы, у бега/шага -пропадал `FRAME_NEEDS_FLOOR` и персонаж проваливался сквозь пол. Лечение — -считать адрес в `uint16_t` и кастовать один раз. Тот же паттерн в -`pop_level.c` компилируется ПРАВИЛЬНО, т.е. полагаться на «у соседа -работает» нельзя. Подробности: memory `sdcc_z80_const_ptr_index_bug`. - ---- - -## 0. Что уже сделано из v1 (не повторять) - -- `--opt-code-size` и `--max-allocs 100000` **уже включены по умолчанию** в - `bin/sprinter-cc` (v1 §2.1 закрыт, выигрыш получен). -- Лишние блиты переднего слоя убраны (v1 §7 п.0): `fore_tile` больше не рисует - `bottom_id`, `_CODE` −388 Б. -- `gfx_blit_noclip` в libbgi (v1 §8 шаг 1): фоновые блиты в 2.9× дешевле. -- `--w3` как резидент окна 3 реализован и обкатан (memory `w3_resident_code`). - ---- - -## 1. ЗАМЕР (сборка 2026-07-29, коммит 1214785) - -Команда: `--memory small --gfx 256 --w3 pop_trob.c pop_map.c --w3 pop_bg.c`. - -### 1.1 Окна - -| Область | Занято | Свободно | Примечание | -|---|---|---|---| -| W1+W2 `_CODE` | 24 881 Б | — | 0x4100…0xA231 | -| W1+W2 `_HOME`+`_GSINIT`+`_DATA`+`_BSS` | ~4 240 Б | — | до 0xB2E4 | -| **W1+W2 куча** | 0 (никто не malloc'ит) | **2 076 Б** | 0xB2E4…0xBB00 | -| W1+W2 стек | — | 1 279 Б | 0xBB00…0xBFFE | -| **W3 резидент** | 14 376 Б | **2 008 Б** | 0xC000…0xF828 | -| EMM-страницы | 37 атласов + 1 уровень | ~215 страниц свободно | `sprinter_emm_budget` | - -**Итого запаса до стены: ≈ 4 КБ** (2 КБ в W1/W2 + 2 КБ в W3). Стражи туда -не влезут. - -### 1.2 Код по модулям (точно, из `.rel`) - -``` -W1/W2 (_CODE 24 881): W3 резидент (_W3CODE 14 376): - pop_kid 6 963 pop_bg 11 643 - pop_map 6 157 pop_trob 2 733 - SprPoP 2 583 - pop_level 1 425 - pop_ctrl 1 145 - crt0 333 - libc+libbgi ~6 275 -``` - -### 1.3 Крупнейшие функции/данные (из `.lst`) - -``` -pop_bg : draw_tile 3080, other_overlay_tile 1146, wall_pattern 944, - mob_render 720, mob_tick_one 661, overlay_mid_tile 498, - fore_only_tile 409, climb_overlay_tile 391, tile_table 371 -pop_map : check_loose_fall_on_kid 674, check_bumped 567, jump_up_or_grab 413, - get_tile 266, do_knock 243, check_press 238, check_leave 212 -pop_kid : kid_seqtbl 2310 + kid_frames 1205 + kid_seq_off 230 = 3745 Б ДАННЫХ - (в _CODE!), собственно кода ~3.2 КБ -SprPoP : enter_room+main ~2.1 КБ -pop_level: room_bg_ptr 1084 (+ 515 Б таблиц LINKLOC/LINKMAP в _DATA) -``` - -### 1.4 `_DATA` (3 710 Б) - -``` -pop_trob 963 (room_modif[24][30] = 720 + trobs + rest-массивы) -pop_level 515 (копии LINKLOC/LINKMAP уровня) -pop_map 163, SprPoP 141, pop_kid 130, pop_bg 115, pop_ctrl 13 -libc: _irq_state 818, _kbdraw_state 515, _gfx_pal_buf 256, прочее ~200 -``` - -### 1.5 Находки замера (мелкие, но чинить) - -1. **`--w3` берёт ОДИН файл на флаг.** В `Makefile` написано - `--w3 pop_trob.c pop_map.c --w3 pop_bg.c`, и это значит «W3 = pop_trob и - pop_bg», а `pop_map.c` компилируется как обычный исходник в W1/W2. Судя по - `.sprinter-cc-SprPoP/w3_pop_map.rel` (устаревший артефакт), когда-то - pop_map был в W3. **Решить осознанно** (см. §4) и записать явно: - `--w3 pop_trob.c --w3 pop_bg.c`. -2. `libc` тянет `_irq_state` 818 Б + `_kbdraw_state` 515 Б в `_DATA`. - `__irq_vec_buf` (513 Б) — таблица векторов IM2; `__kbdraw_down` (512 Б) — - битмап клавиш на 512 скан-кодов. Оба можно ужать (см. §5.4), это ~0.7 КБ - в самом дефицитном окне. - ---- - -## 2. ПРАВИЛА ПЛАТФОРМЫ, ОТ КОТОРЫХ ПЛЯШЕТ РАСКЛАДКА - -Это главное, что изменилось по сравнению с v1: модель банкинга уточнена по -`bin/sprinter-cc` (справка `--w3`/`--bank`) и по коду libbgi. - -**(R1) Резидент W3 (`--w3`) и банки W3 (`--bank`) делят одно окно.** -Резидент лежит на своей странице 0xC000…0xFFFF; трамплин на время вызова -`__banked` подменяет страницу W3 на банковую и возвращает резидентную назад. - -**(R2) Из банка резидент W3 НЕДОСТИЖИМ — и транзитивно тоже.** -Пока исполняется банк, резидентной страницы в адресном пространстве нет. -Значит нельзя не только `bank → pop_bg()`, но и `bank → pop_map() → pop_bg()`. -**Это ключевое ограничение при выборе, что делать банком.** - -**(R3) Резидент → банк работает** (через трамплин в W1), резидент → W1/W2 — -тоже. - -**(R4) Графические примитивы libbgi звать можно откуда угодно.** -`_bgi_begin` читает текущую страницу W3 из порта 0xE2, а `_bgi_end` её -возвращает — то есть скобка корректна и из банка, и из резидента. Нельзя -только одно: **звать `_bgi_begin`/`_bgi_end` ИЗ кода, который сам лежит в W3** -(после подмены страницы исчезнет исполняемый код — проверено, белый экран). -Поэтому `pop_bg` (резидент W3) обязан пользоваться готовыми примитивами -(`gfx_blit*`, `bar`, …), а батчинг скобки на весь `draw_tile` (v1 §8 шаг 1) -для него **невозможен** без переноса самого `draw_tile` в W1/W2. - -**(R5) `--w3` кладёт в W3 код И rodata модуля** (`--codeseg/--constseg -W3CODE`), а писучие статики оставляет в `_DATA` (W2). То есть `const`-таблицы -переносятся в W3 бесплатно вместе с модулем (так уже лежит `tile_table` 371 Б). - -**(R6) Данные в EMM-странице читаются, только пока страница в окне.** -`gfx_w0_map(page)` / `gfx_w0_unmap()` — окно W0 (0x0000…0x3FFF), первые 0x100 -занимает ISR-стаб. Так уже работает `pop_level`. Цена — пара `OUT` на -маппинг, поэтому годится для «пачками», а не для чтения по байту в горячем -цикле. - ---- - -## 3. ЧТО ДЕЛАТЬ НЕЛЬЗЯ (анти-паттерны, чтобы не потерять время) - -- **Нельзя банковать `pop_bg`.** Он вызывается из pop_map, pop_trob, SprPoP, - pop_kid — то есть из главного цикла на каждом кадре; плюс он сам держит - `tile_table` и всю отрисовку. Банк дал бы трамплин на каждый блит. -- **Нельзя банковать `pop_map`, пока `pop_map` зовёт `pop_bg`** (R2). Сейчас - зовёт: `pop_loose_tick` и компания (~30 вызовов графики). -- **Нельзя тащить `kid_frames` в EMM «в лоб»**: он читается несколько раз за - кадр из коллизии (`kid_cur_dx`/`kid_cur_flags` → `dx_weight`, - `char_x_forward_edge`, …). Нужен кэш кадра (см. §5.1) — иначе маппинг - страницы окажется в горячем пути. -- **Нельзя «причёсывать» семейство `draw_tile` ради экономии, не имея - пиксельного теста.** Мы неделю выравнивали слои по SDLPoP; любой рефактор - этой зоны проверять диффом страниц (заморозка кадра клавишей `1` + сравнение - VRAM обеих страниц, приём из memory `mame_mcp_bridge`). - ---- - -## 4. ЦЕЛЕВАЯ РАСКЛАДКА - -Принцип: **W3-резидент = «толстая графика, которую зовёт только главный цикл»; -W1/W2 = ядро, которое должно быть достижимо ОТОВСЮДУ (включая банки); банки = -новая холодная логика (стражи, боёвка, будущие уровни)**. - -``` -W1/W2 (всегда отображено) W3 резидент (стр. 0xC000) Банки W3 -────────────────────────── ───────────────────────── ───────── -libc + libbgi pop_bg (отрисовка тайлов) guards.c -pop_kid (интерпретатор+рисование) pop_trob (анимации тайлов) fight.c -pop_map (коллизия/физика/предметы) pop_loose.c (loose+потолок) debug/roomnav -pop_geom (общая геометрия/тайлы) enter_room-часть SprPoP? -pop_ctrl (ввод/диспетчер) -SprPoP (главный цикл) -``` - -Почему так: - -- **`pop_map` остаётся в W1/W2** — его зовут и главный цикл, и (в будущем) - банк стражей; в W3 его класть нельзя именно из-за R2. Для этого из него надо - вынести графическую часть (loose/потолок) — она уезжает в W3 к `pop_bg` - (§5.3). После выноса `pop_map` становится **чистой логикой без единого - вызова графики** — тот самый bank-safe API. -- **`pop_kid` остаётся в W1/W2**: `play_seq`/`kid_set_seq`/`Kid` нужны и - стражам (у стражей ТА ЖЕ seqtbl), а `kid_draw` зовёт только libbgi (R4). -- **`pop_trob` остаётся резидентом**: его зовёт только главный цикл, и он сам - зовёт `pop_bg` — идеальный житель W3. -- **Банк стражей не зовёт ничего из W3.** Рисование стражей — либо через - libbgi напрямую (R4), либо (лучше) резидентный `guard_draw()` в W1/W2 рядом - с `kid_draw`, а банк только считает состояние. Тот же приём мы уже - используем для `pop_item_taken`/`pop_loose_fell`/`pop_ceil_fell`: банк - выставляет флаг — резидент рисует. - ---- - -## 5. ПЛАН РАБОТ - -Порядок выбран так, чтобы каждый шаг был проверяем отдельно и давал место -следующему. - -### Шаг 1. `kid_data.h` (3 745 Б) → EMM-страница + порт `load_frame` — **самый большой выигрыш** - -Сейчас `kid_seqtbl` (2310) + `kid_frames` (1205) + `kid_seq_off` (230) лежат в -`_CODE` окна W1/W2 — это 15 % всего дефицитного пространства. - -Как переносить: - -1. `pop_extract_kid_data.py` дополнительно пишет `kid_data.bin` (те же три - таблицы подряд, фиксированные смещения). -2. Грузим её в отдельную EMM-страницу тем же способом, что уровень - (`pop_level_load` — готовый образец), хэндл держим в `pop_kid`. -3. **Порт `load_frame` (seg006) и глобала `cur_frame`** — в оригинале ровно - так и сделано: раз за тик кадр копируется в структуру, а весь остальной код - читает `cur_frame`, а не таблицу. У нас `kid_cur_dx()/kid_cur_flags()` - станут чтением из `cur_frame` (5 байт в `_DATA`). -4. `play_seq` оборачивается в один `gfx_w0_map(kid_data_page)` … `unmap` на - вызов (в тике, не в отрисовке — конфликта с атласом в W0 нет). - -Выигрыш: **−3 745 Б из W1/W2**, цена — один маппинг страницы за тик и 5 байт -`_DATA`. Дополнительный бонус: `load_frame`/`cur_frame` — шаг К СХОДСТВУ с -оригиналом, а не отход от него. - -Риск: сломать `play_seq` (сердце анимации). Проверка: прогон по комнатам с -эталонными позами (вис, подтягивание, прыжки, подъём меча). - -### Шаг 2. Модуль `pop_geom.c` — дедуп + bank-safe фундамент - -Сейчас продублировано между модулями: - -| что | где | сколько | -|---|---|---| -| `y_to_row`/`y_to_row_mod4` | pop_bg + pop_map | 2 копии | -| `char_dx_forward` | pop_kid + pop_map | 2 копии | -| `x_bump[20]` | pop_kid (uint8) + pop_map (int16) | 20 + 40 Б, РАЗНЫЕ типы | -| `y_land[5]` | pop_kid + pop_map | 10 + 10 Б | -| `tile_is_floor` | pop_map (+ проверка кодов в SprPoP) | 2 места | -| 32-битный LCG `prandom` | pop_bg (`prandom`) + pop_trob (`trob_prandom`) | 2 копии по ~60 Б + 2 сида | - -Собрать в один W1/W2-модуль `pop_geom.c`: таблицы `x_bump/y_land/dir_front/ -dir_behind`, `y_to_row`, `char_dx_forward`, `get_tile_div_mod(_m7)`, -`tile_is_floor`, `prandom`. Выигрыш прямой — сотни байт (оценка 250–400 Б), -но главное — **это и есть тот «чистый» API, который потом сможет звать банк** -(R2): вся геометрия оказывается в W1/W2 по определению. - -Осторожно: `prandom` у pop_bg и pop_trob — РАЗНЫЕ последовательности с разными -сидами (стены vs фазы факелов). Объединять функцию можно, **сиды — нет**: -передавать сид указателем/по индексу, иначе поедет раскладка кладки. - -### Шаг 3. Вынести loose/потолок из `pop_map` в W3 - -`pop_map` — единственный модуль W1/W2, который зовёт графику, и делает это -ровно в одном логическом блоке: `pop_loose_tick` + `check_press` + `do_knock` + -`fell_on_your_head` + `check_loose_fall_on_kid` + плита-потолок (~1.4–2 КБ). - -Вынести их в `pop_loose.c`, собираемый `--w3` рядом с `pop_bg`/`pop_trob`. -Тогда: - -- `pop_map` = чистая логика (bank-safe, R2 соблюдён); -- W1/W2 худеет ещё на ~1.5–2 КБ; -- W3 растёт на столько же — а место там появится после шага 4. - -### Шаг 4. Перебалансировка резидента W3 - -После шага 3 в W3 будет тесно (14.4 + 2 ≈ 16.4 КБ > 16 КБ). Разгружаем: - -1. **`wall_pattern` (944 Б) + `mob_render`/`mob_tick_one` (1381 Б)** — кандидаты - на переезд в W1/W2: их зовёт только `pop_bg`/`pop_loose`, но сами они уже - пользуются только libbgi (R4), значит из W1/W2 работают и остаются - достижимыми из банка. -2. `tile_table` и мелкие const-таблицы pop_bg (371 + ~300 Б) можно унести в - EMM-страницу **уровня** (там ~13.8 КБ свободно) — но только если чтение - происходит под уже замапленной страницей. Сейчас `draw_tile` читает - `tile_table` ВНЕ W0-контекста → потребуется явный маппинг на тайл. **Не - делать раньше замера**: 30 тайлов на входе в комнату × map/unmap — терпимо, - а вот в покадровых редроях (пики/loose/кнопка) — уже горячий путь. -3. Если и этого мало — `enter_room` (~2.1 КБ, зовётся только при смене комнаты) - переносится в резидент W3 или в БАНК (он вызывается из главного цикла = - резидента, значит банк допустим по R3). - -### Шаг 5. Данные - -1. **`room_modif[24][30]` = 720 Б** (pop_trob, `_DATA`). Нужен произвольный - доступ каждый кадр (анимации, ворота) — в EMM не годится. Но 24 комнаты × - 30 байт хранятся ЦЕЛИКОМ, хотя одновременно живут modif'ы только текущей - комнаты и соседей по швам. Вариант: хранить полный массив в EMM-странице - уровня, а в `_DATA` держать кэш на 2–3 комнаты (свою + левого/правого - соседа) с записью обратно при смене комнаты. Выигрыш ~600 Б, цена — - аккуратность на швах (кнопка в одной комнате открывает ворота в другой). - **Делать последним** — это самая «тонкая» правка по семантике. -2. **`dl1[256]`+`dl2[256]` = 512 Б** (pop_level, `_DATA` — копии LINKLOC/ - LINKMAP уровня) — читаются при нажатии кнопки - и при отрисовке нажатой кнопки. Кандидат на чтение прямо из страницы - уровня (она и так маппится) — но проверить, что `pop_doorlink2` не зовётся - из отрисовки в тот момент, когда в W0 атлас. Выигрыш ~500 Б. -3. **`_kbdraw_down[512]` 512 Б** (libc): проверено — это **байт на скан-код** - (`libc/kbd/_kbdraw_state.c`), хотя комментарий называет его битовой картой. - Упаковка в биты даёт −448 Б, но добавляет сдвиг/маску в ISR-трамплин и в - `kbd_raw_down`. Трогать осторожно: raw-клавиатура уже дважды была - источником залипаний (memory `kbd_raw_fifo_drain`, - `kbd_overrun_wipe_modifiers`) — правку сопровождать прогоном docs/kbd-games. -4. **`__irq_vec_buf` 513 Б** (libc IM2): таблица векторов обязана быть - выровнена и полна — не трогать. - -### Шаг 6. Контракт банка стражей (проектируется ДО написания кода) - -Когда дойдём до стражей: - -- `guards.c` собирается `--bank 1=guards.c`, режим `huge` (или `big` с - `BANKED=W1`, если W3 окажется тесен для трамплинов). -- **Банк зовёт только:** `pop_map` (чистая логика после шага 3), `pop_kid` - (`play_seq`, `kid_set_seq`, `cur_frame`), `pop_geom`, libc/libbgi. -- **Банк НЕ зовёт:** `pop_bg`, `pop_trob`, `pop_loose` (резидент W3) — ни - прямо, ни через промежуточные функции. Нужна отрисовка — выставляет флаг, - рисует резидент (идиома `pop_item_taken`). -- Первым делом — **пробник** (`tests/` или `--bank` на пустышке): банк зовёт - `pop_map`-функцию, та зовёт libbgi-примитив; убедиться в MAME, что скобка - W3 корректно возвращает банковую страницу (R4) — это проверка модели, а не - веры в неё. - -### Шаг 7. Мелкий дедуп в `pop_bg` (после того, как появится тест страниц) - -- Пять функций-редроев (`pop_spike_redraw`, `pop_loose_shake_draw`, - `pop_floor_bake`, `pop_button_redraw`, `pop_leveldoor_redraw`) отличаются - только прямоугольником heal, банком и набором тайлов — свести к одному - параметризованному хелперу (оценка −150…250 Б). -- `env_b/wall_b/fore_b/pot_b` — четыре одинаковых обёртки над `blit_b` - (оставить: экономия единицы байт, читаемость дороже). -- `overlay_mid_tile` / `fore_only_tile` / `climb_overlay_tile` / `draw_tile` - — общая структура «взять code/lcode, посчитать x/dmy/dby, разобрать слои». - Тут экономия потенциально сотни байт, но это **та самая зона риска из §3** — - только с пиксельным диффом до/после и по одному слою за раз. - ---- - -## 6. Ожидаемый итог - -| Шаг | W1/W2 | W3 | Риск | -|---|---|---|---| -| 1. kid_data → EMM + load_frame | **−3 745** | — | средний (сердце анимации) | -| 2. pop_geom (дедуп) | −250…400 | — | низкий | -| 3. loose → W3 | −1 500…2 000 | +1 500…2 000 | низкий (перенос как есть) | -| 4. разгрузка W3 (wall_pattern, mob) | +2 300 | −2 300 | низкий | -| 5. данные (room_modif, LINKLOC, kbd) | −1 000…1 600 | — | средний/высокий | -| 7. дедуп редроев pop_bg | — | −150…250 | средний | - -Суммарно: **W1/W2 освобождается ~4.5–6 КБ**, W3 остаётся примерно в нынешнем -объёме, но становится «правильно заполненным» — в нём только то, что банк -никогда не позовёт. Плюс открывается путь к банкам: стражи и боёвка получают -до 16 КБ на банк, не трогая резидент. - ---- - -## 7. Как мерить и проверять (обязательно к каждому шагу) - -1. **До/после по `.rel`** — точные размеры на модуль: - `for f in .sprinter-cc-SprPoP/*.rel; do grep '^A ' $f; done` - (области `_CODE`/`_W3CODE`/`_DATA`). Итоги окон печатает сам `sprinter-cc`. -2. **Функции** — из `.lst` (метки `_name:` и адреса), скрипт в истории этой - сессии; полезно ловить «функция распухла после рефактора». -3. **MAME**: любой перенос кода между окнами/страницами — это класс «молча - ломается» (`sprinter_memory_modes`). Минимум: комната 1 (loose), 12 - (вис/подтягивание), 15 (меч), 9 (дверь уровня), 6 (кнопка/ворота). -4. **Пиксельный дифф** для правок отрисовки: заморозить кадр (`1`), сравнить - обе страницы дабл-буфера через `vram` (см. memory `mame_mcp_bridge`) и/или - сверить с эталонным рендером `render_room.py`. -5. **Скорость** — после шагов 1 и 4 замерить кадр маркерами в порт 0xFE - (приём из v1 §8), чтобы маппинг страницы за тик не съел бюджет. - -## 8. Ссылки - -- `bin/sprinter-cc` — справка по `--w3`, `--bank`, `--memory`, `--memory-manual`. -- `runtime/crt0_banked.s`, `runtime/bank.s` — трамплины и захват резидентной - страницы W3. -- `libbgi/common/_bgi_begin.c` / `_bgi_end.c` — механика скобки W3 (R4). -- memory: `w3_resident_code`, `pop_banking_architecture`, `sdcc_banking`, - `bank_local_data_pattern`, `sprinter_memory_modes`, `memory_modes_implemented`, - `sprinter_emm_budget`, `mame_mcp_bridge`, `avoid_32bit_arith_z80`, - `libc_one_function_per_module`. -- `applications/SprPoP/TASKS_OPEN.md` — что из этого берётся в работу сейчас. - ---- - -## 9. Скорость отрисовки: замеры и запас - -Перенесено из удалённого `size_optimization_plan.md` §8 (замер 2026-07-27) — -единственная его часть, которая не была перекрыта этим документом. -Профилирование в MAME: маркеры в порт 0xFE + `wpiset … totalcycles` (приём из -memory `mame_mcp_bridge`); в самом `sprpop.c` для этого уже стоят полосы -бордюра `PROF()`. Кадр Sprinter = **430 080 тактов**. - -**Стоимость блита почти НЕ зависит от размера** — платим за проход по цепочке -`gfx_blit → gfx_blit_part → _gfx_blit_full` (16-битная арифметика, клип, -пересчёт src, нарезка полос >256), а не за пиксели: - -| путь (спрайт 32×3) | тактов | -|---|---| -| `gfx_blit` (общее ядро, с клипом) | 13 288 | -| линейное ядро без клипа | 4 617 | - -Отсюда `draw_tile(0,0)` тайла шва (9 блитов) стоил **183 690 тактов = 43 % -кадра**; сам `bar` — только 13 308. - -**Сделано:** `gfx_blit_noclip()` в libbgi, фоновые блиты `pop_bg` уходят на -него, когда спрайт целиком на экране (~2.9×, подтверждено в MAME). Позже -тем же приёмом закрыты спрайты персонажей (`gfx_blit_cols_part_noclip`). -**Не закрыт heal** — задача CLIP-1 в `../PoP/SprPoP/TASKS_CLOSED.md`. - -**ВАЖНО:** W3-скобку (`_bgi_begin`/`_bgi_end`) ставит САМА libbgi — вызывать -её из модуля, собранного с `--w3`, нельзя: после `_bgi_begin` окно W3 занято -видеобанком и код вызывающего исчезает из адресного пространства (проверено: -белый экран). - -**Запас, когда перестанет хватать бюджета кадра:** - -1. **Батчинг W3-скобки** — одна `_bgi_begin`/`_bgi_end` на весь `draw_tile` - вместо скобки на блит; нужен публичный batch-API в libbgi. - **Осторожно, и это стало важнее, чем было:** между begin/end стоит `DI`, - длинная серия задержит кадровое прерывание — а по разбору KBD-1 - (`../PoP/SprPoP/TASKS_CLOSED.md`) длинные DI-окна и есть причина потери байт - клавиатуры. Батчинг эту проблему УХУДШИТ, если делать его вслепую. -2. **Решётка ворот одним спрайтом** — `draw_gate_back` рисует бары по одному - (до 7 блитов). Сгенерировать в атласе «столб решётки» и выводить одним - `gfx_blit_part` с обрезкой по фазе `gate_bot_y & 7`: 7 блитов → 1. -3. **Не перерисовывать статичные части шва** — грань ворот, пол и кромка при - анимации решётки не меняются (см. OPT-1 в `../PoP/SprPoP/BUGS_CLOSED.md` — - решено не делать, стоимость транзиентная). -4. **T-1 / T-2** (`../BUGS_OPEN.md`) — перерисовка пик по причине и - idle-skip Кида: самый большой оставшийся резерв, потому что убирает работу - целиком, а не удешевляет её. diff --git a/applications/SprPoP/docs/levels_12_15_plan.md b/applications/SprPoP/docs/levels_12_15_plan.md deleted file mode 100644 index 877eb30..0000000 --- a/applications/SprPoP/docs/levels_12_15_plan.md +++ /dev/null @@ -1,462 +0,0 @@ -# Что осталось на уровнях 12, 13, 14, 15 и 0 - -Статус: разбор по `../SDLPoP/src/`, 2026-08-13. Продолжает -[`levels_plan.md`](levels_plan.md) (машинерия уровней и тайлсеты — уже -сделаны). Здесь только СПЕЦСОБЫТИЯ, которых у нас ещё нет. - -Правило проекта: источник истины — SDLPoP; все ссылки ниже даны на функцию и -строку, чтобы порт начинался с чтения, а не с гипотезы. - ---- - -## 0. Что из этой области УЖЕ есть - -Проверено грепом по `SprPoP/`: - -| механика | где у нас | статус | -|---|---|---| -| слот соперника, общий на всех Char | `pop_guard.c`, `pop_cdraw.c` | готово | -| `check_shadow` (спецвход тени) | `guards.c:310` | готово для уровней 4/5/6 | -| `do_init_shad` + таблицы `init_shad_5/6` | `guards.c:284` | готово | -| ИИ тени 4/5/6 | `guards.c:599/658/680` | готово | -| диспетчер `autocontrol_shadow` | `guards.c:711` | ветки 12 НЕТ | -| боёвка (удар/блок/парирование/HP соперника) | `guards.c`, `pop_ctrl.c` | готово | -| `flash_color` / `flash_time` | `pop_map.c`, `sprpop.c` | готово | -| `add_life` | `pop_map.c` | готово | -| таблицы уровней (`guard_type`, `guard_hp`, `entry_pose`, `level_type`) | `pop_level_cold.c:41..52` | готово, включая 12=SHADOW, 13=VIZIER | -| loose-полы, `make_loose_fall`, mob | `pop_map.c`, `pop_room.c` | готово (без спецкейсов ур. 13) | - -То есть каркас есть весь; ниже — недостающие спецсобытия. - ---- - -## 1. Уровень 12 — тень: встреча, бой, слияние - -### 1.1 Подъём тени в комнате 15 (`check_shadow`, seg002:0070) - -```c -if (current_level == 12) { - if (!united_with_shadow && drawn_room == 15) { - Char.room = drawn_room; - if (get_tile(15, 1, 0) == tiles_22_sword) return; // меч ещё лежит - shadow_initialized = 0; - do_init_shad(init_shad_12, 7 /* fall */); - return; - } -} -``` - -Отличия от наших веток 5/6: тень поднимается **в падении** (seq 7), условием -служит содержимое тайла (меч уже подобран) и флаг `united_with_shadow`. -Таблица `init_shad_12 = {0x0F, 0x51, 0xE8, 0, 0, 0, 0, 0}` — то есть -x=81, y=232, вправо, колонка 0, ряд 0. - -**Что добавить:** ветку в `pop_check_shadow` + константу `init_shad_12` + -глобалы `united_with_shadow`, `shadow_initialized`. - -### 1.2 ИИ тени (`autocontrol_shadow_level12`, seg002:1184) - -Самая содержательная функция уровня. Три режима: - -1. **Первый кадр в комнате 15**: пока Кид не подошёл (`Opp.x < 150`) — - `shadow_initialized = 1`; иначе тень ещё раз падает (`do_init_shad`). -2. **Кид с мечом** (`Char.sword >= sword_2_drawn`) → тень дерётся обычным - `autocontrol_guard_active` (у нас есть, `guards.c:535`). Особый случай: - если тень уже ранена (`offguard != 0 && guard_refrac != 0`) — она убирает - меч (`move_4_down`). -3. **Кид убрал меч** → тень тоже убирает и идёт навстречу; на дистанции - `< 10` — **СЛИЯНИЕ**: - -```c -flash_color = color_15_brightwhite; flash_time = 18; -add_life(); // +1 к максимуму HP -united_with_shadow = 42; // время вспышки Кид-тень -Char.charid = charid_0_kid; savekid(); // Кид ПЕРЕЕЗЖАЕТ на место тени -clear_char(); // тень со сцены -``` - -Плюс «если Кид бежит к тени — тень бежит к Киду» (кадры бега 3..14 и -шага 127..132). - -**Что добавить:** `autocontrol_shadow_level12` в `guards.c` + ветку в -диспетчере `autocontrol_shadow` (там уже три ветки, будет четвёртая). - -### 1.3 Общий урон (`do_delta_hp`, seg000:1518) - -```c -if (Opp.charid == charid_1_shadow && current_level == 12 && guardhp_delta != 0) - hitp_delta = guardhp_delta; // ранил тень — ранил себя -``` - -Три строки, но без них бой с тенью теряет смысл. У нас `do_delta_hp` -портирован — добавить условие. - -### 1.4 Таймер вспышки (`do_timers`, seg003:503) - -```c -if (united_with_shadow > 0) { - --united_with_shadow; - if (united_with_shadow == 0) { --united_with_shadow; /* → -1 */ ... } -} -``` - -`united_with_shadow` живёт как счётчик, потом как «уже слились» (−1). -На него смотрят `check_shadow` и `check_can_guard_see_kid`. - -### 1.5 Луч видимости (`check_can_guard_see_kid`, seg003:702) - -```c -if ((Guard.charid != charid_1_shadow || current_level == 12) && ... -``` - -У нас (`guards.c:103`) условие про тень **нужно сверить**: на уровне 12 тень -ОБЯЗАНА быть видимой (иначе Кид не достанет меч и бой не начнётся). - -### 1.6 Меч исчезает (`sword_disappears`, seg002:0536) - -```c -if (current_level == 12 && Char.room == 18) { - get_tile(15, 1, 0); - curr_room_tiles[curr_tilepos] = tiles_1_floor; - curr_room_modif[curr_tilepos] = 0; -} -``` - -Срабатывает при уходе Кида ВПРАВО из комнаты 18 (`leave_room`, ветка 1). -У нас есть `pop_level_set_tile` — порт на пять строк. - -### 1.7 Переход 12 → 13: НЕТ двери уровня, есть «бесшовный выход» - -Проверено по данным (`res2012.bin` / `res2013.bin`) — портала действительно -нет, уровень кончается **фактом попадания в комнату**: - -```c -// play_level_2, seg000:900 -} else if (custom->tbl_seamless_exit[current_level] >= 0) { - if (Kid.room == /*23*/ custom->tbl_seamless_exit[current_level]) { - ++next_level; - stop_sounds(); - seamless = 1; - } -} -``` - -`tbl_seamless_exit[12] = 23` (пара «уровень, комната» читается из оригинального -`PRINCE.EXE`, options.c:724). Дальше геометрия складывается так: - -| | комната | ряд 1 | что происходит | -|---|---|---|---| -| ур. 12 | 13 | `floor bigpil empty empty wall wall …` | Кид бежит ВЛЕВО с колонки 0 | -| ур. 12 | 23 | `empty ×6, floor floor floor floor` | попал сюда → **уровень сменился** | -| ур. 13 | 23 | `floor bigpil floor ×6 bigpil floor` | старт: ряд 1, кол 9, `seq_84_run` | - -Связи: `комната 13.left = 23`, и в комнату 23 больше ниоткуда не войти. -Номер комнаты у обоих уровней **один и тот же (23)**, стартовая позиция -уровня 13 — `BP_START = 23, поз 19 (ряд 1, кол 9), dir 0`, а -`tbl_entry_pose[13] = 2` даёт «вбегающий» вход (`seq_84_run`, seg003:172). -То есть Кид вбегает в комнату слева-направо… нет, `Char.direction = -~level.start_dir` — влево, тем же ходом, каким выбежал из уровня 12. Швов не -видно. - -Что делает флаг `seamless` (всего два места, оба косметические): - -* `start_level`, seg003:158 — **НЕ сбрасывает HP**: Кид уносит на уровень 13 - то здоровье, с которым добежал; -* `show_level`, seg008:1861/1870 — не показывает заставку «LEVEL 13» и тут же - гасит флаг. - -Двери уровня при этом на карте есть, но не при делах: у уровня 12 она одна -(комната 3, tilepos 23) — это ВХОД (стартовая комната 12-го — 3), а у уровня -13 их две (комната 3 tilepos 13 и комната 5 tilepos 24) — это выходы, -открываемые кнопкой из `Jaffar_exit`. - -**Что это значит для нас.** Наш переход уровня сейчас идёт только через -`SEQ_END_LEVEL` в двери. Для 12-го нужен второй триггер — проверка в главном -цикле «`pop_current_level == 12 && cur_room == 23` → `pop_next_level++`» плюс -флаг `seamless`, который пропустит сброс HP в `pop_start_level`. Обе правки -маленькие и локальные. - ---- - -## 2. Уровень 13 — Джафар - -### 2.1 Кто такой Джафар - -`tbl_guard_type[13] = 3` → `VIZIER.DAT` (у нас в `pop_level_cold.c` уже 3). -`tbl_guard_hp[13] = 6`. Отдельного ИИ у него нет: - -```c -void autocontrol_Jaffar() { autocontrol_guard(); } // seg002:0697 -``` - -То есть **бой с Джафаром — обычный бой стражи**, отличаются только спрайты, -HP и три спецсобытия ниже. Это хорошая новость: боёвка у нас есть. - -### 2.2 Встреча (`meet_Jaffar`, seg002:0544) - -```c -if (current_level == 13 && leveldoor_open == 0 && Char.room == 3) { - play_sound(sound_29_meet_Jaffar); - guard_notice_timer = 28; // Джафар ждёт 28/12 ≈ 2.33 с -} -``` - -Срабатывает при уходе Кида ВПРАВО (`leave_room`, ветка 1). -Пара к нему — в `autocontrol_guard_inactive` (seg002:0734), она у нас уже -портирована (`guards.c:401`), но **без условия по уровню**: - -```c -if (can_guard_see_kid) { - if (current_level != 13 || guard_notice_timer == 0) move_down_forw(); -} -``` - -**Что добавить:** глобал `guard_notice_timer` + его тик в `do_timers` -(seg003:509) + оба условия. - -### 2.3 Победа (`on_guard_killed`, seg006:1929) - -```c -} else if (current_level == 13) { - flash_color = color_15_brightwhite; flash_time = 18; - is_show_time = 1; - leveldoor_open = 2; // ← ключ к выходу - play_sound(sound_43_victory_Jaffar); -} -``` - -и парная `Jaffar_exit` (seg002:0517), срабатывающая при уходе Кида ВЛЕВО: - -```c -if (leveldoor_open == 2) { get_tile(24, 0, 0); trigger_button(0, 0, -1); } -``` - -То есть смерть Джафара не открывает дверь сама — она ставит флаг, а дверь -открывается кнопкой, «нажатой» при уходе влево. `trigger_button` у нас есть. - -### 2.4 Падающие плиты (`check_fall_flo`, seg000:1319) - -```c -if (current_level == 13 && (drawn_room == 23 || drawn_room == 16)) { - curr_room = room_A; // комната СВЕРХУ - for (curr_tilepos = 22; curr_tilepos <= 27; ++curr_tilepos) - make_loose_fall(-(prandom(0xFF) & 0x0F)); // ОТРИЦАТЕЛЬНЫЙ модификатор -} -``` - -Вот это и есть «плиты появляются»: при входе в комнаты 23/16 шесть плит ряда 2 -комнаты СВЕРХУ получают отрицательную фазу — то есть отложенный старт, и -сыплются на Кида вразнобой. Зовётся из `check_the_end` при смене комнаты. - -**Три спецкейса уровня 13 в loose-механике**, без них это не работает: - -| место | что | зачем | -|---|---|---| -| `animate_loose`, seg007:823 | при `modif & 0x80` НЕ останавливать тряску | иначе отрицательная фаза не досчитает до нуля и плита не упадёт | -| `loose_make_shake`, seg007:949 | на уровне 13 сотрясение НЕ трясёт плиты | иначе отложенные плиты сбрасываются в 0x80 | -| `fell_on_your_head`, seg007:1218 | плита бьёт и в БЕГЕ (кадры 5..14) | на прочих уровнях бегущего не задевает | - -У нас первый пункт критичен: `pop_loose_tick` трактует бит 7 как «тряска» и -на `>= 0x84` гасит фазу — отрицательный старт умрёт, не начавшись. Заодно -это ровно та же ветка, что мы правили сегодня в -[`LOOSE-ROOM-CHANGE`](BUGS_OPEN.md#loose-room-change), так что -код на виду. - -### 2.5 Поза входа - -`tbl_entry_pose[13] = 2` — у нас в таблице уже есть; проверить, что режим 2 -(`seg003:172`) реализован. - ---- - -## 3. Уровень 14 — принцесса и конец игры - -Боя нет вовсе (`tbl_guard_type[14] = -1`). Всё сводится к одному событию: - -```c -// check_the_end, seg000:1299 -if (current_level == 14 && drawn_room == 5) end_sequence(); -``` - -`end_sequence` (seg001:573) → `end_sequence_anim` (seg001:332): катсцена -«Кид добежал до принцессы» — обнимаются, появляется мышь, затухание, Hall of -Fame. Персонажи там играются ТЕМ ЖЕ интерпретатором `seqtbl` -(`seq_108_princess_turn_and_hug`, `seq_101_mouse_stands_up`), то есть движок -у нас уже подходит — нужны спрайты принцессы (`PRINCESS.DAT`) и раскадровка. - -**Оценка:** это не игровая механика, а ролик. Логично делать вместе с интро -и межуровневыми вставками — отдельным банком, как и договаривались -(см. memory `pop_banking_architecture`). На проходимость игры не влияет: -достаточно довести Кида до комнаты 5 и показать заглушку. - ---- - -## 4. Уровень 15 — «уровень зелий» (защита от копирования) - -Не часть сюжета. Это экран проверки подлинности из оригинала: после -уровня `copyprot_level` игра подменяет номер на 15, показывает комнату с -**14 зельями, на которых нарисованы буквы**, и требует выпить нужное. - -Механика (всё под `USE_COPYPROT` в SDLPoP): - -| место | что делает | -|---|---| -| `play_level`, seg003:53 | `level_number == copyprot_level` → грузим 15 | -| `redraw_screen`, seg003:273 | поверх зелий рисуются БУКВЫ (`copyprot_letter`) | -| `load_alter_mod`, seg008:1204 | одно зелье в комнате делается «открытым» (тип 6) | -| `animate_potion`, seg007:259 | на уровне 15 своя ветка перерисовки | -| `up_pressed`/`do_pickup`, seg005:657 | выпитое зелье убирает букву из таблицы | -| `seq` эффект зелья, seg006:1896 | синие зелья на уровне 15 отнимают ПОЛОВИНУ HP | -| выход, seg000:700 | из 15 возвращаемся в `copyprot_level` | - -**Рекомендация: не портировать.** Это анти-пиратский экран 1989 года, -требующий книжки-манускрипта; SDLPoP держит его выключенным по умолчанию -(`enable_copyprot`). Единственное, что стоит взять — **половинный урон -синего зелья**, если вдруг захочется полной совместимости; остальное только -съест банк. Если решим делать — это отдельная фича «уровень 15», а не часть -основного прохождения. - ---- - -## 5. Уровень 0 — демо-уровень (аттракт) - -`res2000.bin` у нас распакован. Это тот самый ролик, который крутится на -титульном экране: Кид сам бежит, дерётся со стражем и убегает. - -Как устроено: - -| место | что | -|---|---| -| `do_demo`, seg006:1409 | на уровне 0 вместо чтения клавиатуры зовётся `do_demo()` + `control()` | -| `autocontrol_kid`, seg002:702 | Кид управляется тем же `autocontrol_guard` | -| `do_auto_moves`, seg002:1089 | проигрыватель ЗАПИСИ ходов: таблица `(time, move)` | -| `on_guard_killed`, seg006:1928 | на уровне 0 после убийства стража Кид убегает (`checkpoint = 1`, сброс демо) | -| `demo_index` / `demo_time` | позиция в записи; у нас уже объявлены в `guards.c:267` | - -**Хорошая новость:** движок автодвижений (`do_auto_moves`) у нас уже есть — -он нужен был тени на уровнях 4/5/6, и `demo_time`/`demo_index` объявлены там -же. То есть демо-уровень — это в основном таблица ходов + ветка «Кидом -управляет ИИ» в `pop_ctrl`. - -**Когда делать:** вместе с интро/титульным экраном, не раньше. На -прохождение не влияет. - ---- - -## 6. Порядок работ - -Порядок задан пользователем 2026-08-13: **строго по номерам уровней**, а не -по дешевизне кода — уровень 13 не имеет смысла раньше, чем на него можно -попасть. - -1. ✅ **Уровень 12** — тень: `init_shad_12`, `autocontrol_shadow_level12`, - `united_with_shadow`, общий урон, «убил тень — убил себя», - `sword_disappears`, появление плит. Сделано 2026-08-13, хост-набор - `SprPoP/tests-host/t_shadow.c` (45 проверок); живой проверки в MAME - ещё не было — доска [`L12-SHADOW`](TASKS_OPEN.md#l12-shadow). -2. ✅ **Переход 12 → 13** (§1.7) — room-триггер вместо двери и флаг - `pop_seamless` (не сбрасывать HP). Сделано там же. -3. ✅ **Уровень 13** — Джафар: `guard_notice_timer`, - `on_guard_killed`/`Jaffar_exit`, три спецкейса loose (§2.4) и - `check_fall_flo`. Плюс СПРАЙТЫ визиря (VIZIER.DAT) — без них он - рисовался обычным стражем. Сделано 2026-08-13, хост-набор - `SprPoP/tests-host/t_jaffar.c` (44 проверки); живой проверки в MAME ещё - не было — доска [`L13-JAFFAR`](TASKS_OPEN.md#l13-jaffar). -4. **Уровень 14** — довести до комнаты 5 и поставить заглушку вместо ролика; - сам ролик — в общую задачу «катсцены». -5. **Уровень 0 и 15** — отложить: аттракт и защита от копирования на - прохождение не влияют. - ---- - -## 7. Сверка констант с ОРИГИНАЛЬНЫМИ данными (сделана 2026-08-13) - -Всё ниже снято скриптом прямо с `../SDLPoP/data/LEVELS/res2013.bin` и -`res2012.bin` — не из головы и не из констант SDLPoP. - -### 7.1 Падающие плиты уровня 13 — константы сходятся ТОЧНО - -Комнаты, у которых в ряду 2 вообще есть loose: - -| комната | loose в колонках | комната снизу | -|---|---|---| -| 17 | 2, 3, 4, 5, 6, 7 | **23** | -| 1 | 2, 3,    5, 6, 7 | **16** | -| 14 | 2 | 24 | - -Связи: `комната 23: up = 17`, `комната 16: up = 1`. То есть -`loose_tiles_room_1 = 23` и `room_2 = 16` — это ровно те две комнаты, над -которыми лежит ПОЛНАЯ гряда плит, а `first_tile = 22, last_tile = 27` — ровно -ряд 2, колонки 2..7: - -``` -комната 23 → сверху 17: 22:LOOSE 23:LOOSE 24:LOOSE 25:LOOSE 26:LOOSE 27:LOOSE [6/6] -комната 16 → сверху 1: 22:LOOSE 23:LOOSE 24:empty 25:LOOSE 26:LOOSE 27:LOOSE [5/6] -``` - -Два вывода: - -* диапазон 22..27 — **надмножество**: в комнате 1 тайл 24 пустой, и - `make_loose_fall` его молча пропустит (проверяет тип тайла). Копировать - константы можно как есть; -* пара «комната 14 → 24» НЕ входит в спецсобытие намеренно — одна плита, это - обычный loose. - -**Важное следствие, которого не было в плане:** стартовая комната уровня 13 — -**23** (`BP_START = 23`, поз 19, dir 0), а `check_fall_flo` зовётся из -`draw_level_first` → `check_the_end` (seg003:217). Значит плиты начинают -сыпаться СРАЗУ при входе на уровень, это его первый кадр, а не событие -где-то в середине. - -### 7.2 Джафар — один страж со skill 9 - -В `res2013.bin` заполнен ровно один слот стража: - -| комната | тайл | ряд, кол | направление | skill | -|---|---|---|---|---| -| 1 | 7 | 0, 7 | 255 (влево) | **9** | - -И это сходится с `meet_Jaffar`: событие срабатывает, когда Кид уходит ВПРАВО -из комнаты 3, а `комната 3: right = 1` — то есть ровно туда, где стоит -Джафар. Skill 9 у нас поддержан: `NUM_GUARD_SKILLS = 12`, все шесть таблиц -вероятностей (`guards.c:411..415`) имеют индекс 9. HP = `tbl_guard_hp[13] = 6` -(в `pop_level_cold.c` уже стоит). - -`Jaffar_exit` тоже проверен: **комната 24, tilepos 0 = `opener`** (кнопка), -модификатор 0 — то есть `trigger_button(0,0,-1)` жмёт реальную кнопку, а не -пустой тайл. - -### 7.3 Уровень 12 — меч на месте - -`комната 15, tilepos 1 = SWORD` — условие подъёма тени -(`get_tile(15,1,0) == tiles_22_sword`) на наших данных выполняется. -`комната 18: right = 19` — `sword_disappears` срабатывает при уходе вправо. - -Комната 15 целиком (по ней видно всю сцену встречи с тенью): - -``` -ряд 0: floor SWORD floor torch torch LOOSE LOOSE floor empty empty -ряд 1: wall wall wall empty empty empty empty wall floor floor -ряд 2: wall opener pillar empty empty empty empty wall pillar empty -``` - -### 7.4 `pop_loose_tick` действительно убьёт отрицательную фазу - -Подтверждено чтением кода: `m = ++pop_loose_modif[pos]; if (m & 0x80) { if (m ->= 0x84) → сброс в 0 }`. Для стартового `0xF0..0xFF` первый же тик даёт -`m >= 0x84` → фаза обнуляется, плита не падает. **Это и есть та правка №1 из -таблицы §2.4**, и она обязательна. - -### 7.5 `init_shad_12` и байтовое переполнение `y` - -`init_shad_12 = {0x0F, 0x51, 0xE8, 0, 0, 0, 0, 0}` → frame 15, x 81, -**y 232**, вправо, колонка 0, ряд 0, action 0 + `seq 7 (fall)`. Поле `y` в -`char_type` — `byte` (беззнаковое), то есть 232 лежит НИЖЕ поля (192), и -падение уводит его дальше с переполнением байта: тень «падает» из-под экрана и -появляется сверху. У нас `pop_char_t.y` тоже `uint8_t` — поведение -переносится без правок; при портировании просто не «чинить» это как ошибку. - -Отдельно про ряд: `curr_row` берётся ИЗ ТАБЛИЦЫ и равен **0**, хотя -`pop_y_to_row(232)` дал бы −1. `do_init_shad` копирует семь полей как есть и -ряд не пересчитывает, так что «согласовать» их — значит разойтись с -оригиналом. Закреплено тестом `shadow12_rises_when_sword_gone`. diff --git a/applications/SprPoP/docs/levels_plan.md b/applications/SprPoP/docs/levels_plan.md deleted file mode 100644 index 524175e..0000000 --- a/applications/SprPoP/docs/levels_plan.md +++ /dev/null @@ -1,209 +0,0 @@ -# План: от одного уровня к нескольким (загрузка, переходы, тайлсеты) - -Статус: план, 2026-08-01. Продолжает `PORT_PLAN.md` §7 (Фаза 1: «переходы -между экранами» → теперь между УРОВНЯМИ). Текущая точка: `SprPoP` играет -уровень 1 целиком в одной комнате-за-комнатой модели, но уровень нельзя -ни выбрать, ни закончить. - -Источник истины — `../SDLPoP/src/` (правило `../CLAUDE.md`). Ключевые -места: `seg000.c: load_lev_spr/play_level_2/init_game`, `seg005.c: -up_pressed/go_up_leveldoor`, `seg006.c: play_seq → SEQ_END_LEVEL`, -`seg002.c` (спецсобытия уровней), `data.h:835..850` (потабличные различия -уровней). - ---- - -## 0. Что уже готово (не проектировать заново) - -- **Формат и загрузчик уровня.** `pop_level.c/.h` читает сырой - `res200N.bin` (2305 Б) в отдельную EMM-страницу; путь — параметр - `pop_level_load(const char *)`. Мультиуровневость здесь стоит одной - функции формирования имени. -- **Стартовая позиция уровня** уже разобрана: `pop_level_start_room()`, - `pop_level_start_pos()`, `pop_level_start_dir()` — реализованы и пока - НЕ вызываются (см. `../PoP/SprPoP/TASKS_CLOSED.md` L1-START). -- **Страж по данным уровня**: `pop_level_guard()` (порт `enter_guard`), - сохранение состояния между комнатами (`pop_guard_state_save`). -- **Палитра разложена по слотам ровно как в оригинале** (`pop_pack_kid.py` - `build_palette`): env 0x50, wall 0x60, pot 0x40, kid 0x70, меч 0x80, - страж 0x90. Это тот же раскрой, что `set_pal_arr(0x50/0x60)` в - `seg000.c:1140..1148`, — значит смена тайлсета не требует переиндексации - спрайтов Кида (см. §3). -- **Все 16 файлов уровней распакованы**: `../SDLPoP/data/LEVELS/res2000.. - res2015.bin` (0 — демо-уровень). - ---- - -## 1. Что реально различается между уровнями (замер по данным, не по памяти) - -Таблицы из `../SDLPoP/src/data.h:840..847` + инвентарь тайлов, снятый прямо -с `res200N.bin` (маска `fg & 0x1F`): - -| Ур. | Тайлсет | Страж | Новое против предыдущих | -|-----|---------|-------|--------------------------| -| 1 | dungeon | обычный | — (текущая база) | -| **2** | **dungeon** | **обычный** | **ничего нового: тот же набор объектов минус меч** | -| 3 | dungeon | СКЕЛЕТ | чомперы | -| 4 | palace | обычный | **тайлсет palace**, зеркало (спецсобытие `mirror_level`) — **СДЕЛАНО** | -| 5 | palace | обычный | новых ТАЙЛОВ нет; спецсобытие **тень крадёт зелье** (комната 24) — [L5-SHADOW](TASKS_OPEN.md#l5-shadow) | -| 6 | palace | ТОЛСТЫЙ | падение на входе (спецсобытие) | -| 7 | dungeon | обычный | — | -| 8, 9 | dungeon | обычный | — | -| 10, 11 | palace | обычный | — | -| 12 | dungeon | ТЕНЬ | seamless-выход (комната 23), исчезающий меч | -| 13 | dungeon | ВИЗИРЬ | мышь, особый выход | -| 14 | palace | нет | — | -| 15 | dungeon | нет | финал | - -Прямое следствие для порядка работ: **уровень 2 не требует ни одного нового -ассета и ни одной новой механики** — он проверяет ровно машинерию перехода. -Это и есть первый шаг. - -Прочие потабличные различия, которые придётся завести массивами по 16: -`tbl_level_type` (тайлсет), `tbl_guard_type` (−1 = стражей нет), -`tbl_guard_hp`, `tbl_level_color` (вариантные палитры, 1.3), `tbl_entry_pose`. - ---- - -## 2. Шаг 1 — машинерия перехода (цель: уровни 1 → 2 → 3) — **СДЕЛАН 2026-08-04** - -> **Итог.** Всё в этом разделе портировано и проверено в MAME: уровень 1 → -> Shift+L → уровень 2 (комната 5, дверь захлопывается за спиной, большие -> колонны рисуются) → уровень 3. Разбор что именно сделано и что по -> уровню 2 осталось — `../PoP/SprPoP/TASKS_CLOSED.md`, запись **L2**. -> -> Сверх плана пришлось доделать две вещи, без которых уровень 2 не играется: -> **`find_start_level_door`** (стартовый тайл уровня 2 — это правая половина -> двери уровня) и **большую склянку** `add_life` (тип зелья 2, комната 20). - -Порядок именно такой; каждый пункт проверяем в MAME отдельно. - -**2.1 Выход с уровня.** Портировать `up_pressed()` ветку двери -(`seg005.c:410..423`) + `go_up_leveldoor()` (`seg005.c:497`): дверь рядом -(при/за/перед персонажем) И `drawn_room != level.start_room` И створка -открыта полностью (`curr_room_modif >= 42` — вариант `fix_exit_door`) → -`Char.x = x_bump[...] + 10`, направление влево, `seq_70_go_up_on_level_door`. -Затем оживить опкод `0xF1 END_LEVEL` в `play_seq` (`../src/pop_kid.c:418` -— сейчас пустой `break`): `++pop_next_level`, как `seg006.c:662`. - -**2.2 Цикл уровня.** В `main()` после тика: `if (pop_next_level != -pop_current_level) → load_level(pop_next_level)`. Порядок сноса/подъёма -состояния (порт `load_lev_spr` + `play_level_2`): -`pop_level_free` → `pop_level_load("LEVELS\\res200%d.bin")` → -`pop_trob_reset` → `pop_guard_reset` → сброс tile-override'ов -(`ovr_*` в `sprpop.c`) → `enter_room(pop_level_start_room())` → -`kid_init(поза/позиция/направление из данных уровня)`. -**HP через уровень переносится** (в оригинале `hitp_beg_lev`), не сбрасывать -в максимум — сверить с `seg000.c` `init_game`/`play_level_2`. - -**2.3 Стражи по уровню.** Завести `tbl_guard_type[16]`/`tbl_guard_hp[16]`; -`-1` = стражей на уровне нет (уровни 14, 15) — `pop_guard_enter` обязан это -понимать, иначе на 14-м полезут стражи из мусора. Для шага 1 (уровни 2, 3) -достаточно обычного стража, но проверку `-1` заложить сразу. - -**2.4 Чит «следующий уровень» (Shift+L).** Реализуется ровно тем же -`pop_next_level` — и без него отладка уровней превращается в прохождение -игры руками. Делать в этом же шаге, не позже (см. §4). - -**Приёмка шага 1:** дверь уровня 1 → уровень 2 играется целиком → его дверь -→ уровень 3 стартует (чомперы могут быть ещё не портированы — тогда -фиксируем как известное ограничение, а не «баг»). - ---- - -## 3. Шаг 2 — второй тайлсет (palace, уровни 4+) — **СДЕЛАН** - -> **Закрыт (ревизия 2026-08-11 по коду).** В дереве есть всё, что -> проектировалось ниже: `pop_pack_bg.py` печёт ДВА набора атласов -> (`pop_*` из VDUNGEON, `pal_*` из VPALACE, каскад с обменом приоритетов), -> `pop_bg_load` принимает тип набора и ставит флаг `pop_palace`, по которому -> `pop_room.c` выбирает дворцовую ветку (`wall_pattern` дворца — сплошная -> заливка + пять mono-полос, `PALACE_WALL_MONO_IDS`), решётчатые тайлы -> 25-29 есть и в `tile_table` (`pop_tile.c`), и в коллизии — `tile_is_floor` -> совпадает с `seg006:0628` тайл в тайл. Уровень 4 проходится smoke-тестом. -> -> Текст ниже оставлен как справочник по раскрою палитры и по тому, почему -> смена тайлсета — это перезапись 32 записей, а не переиндексация спрайтов. - -**Ассеты.** `toolchain/pop_pack_bg.py` уже читает PNG каскадом -VDUNGEON→VPALACE (та же логика, что в игре), но печёт ОДИН набор атласов -(`pop_env0..4.atl`, `pop_wall.atl`, `pop_fore.atl` ≈ 75 КБ). Нужен второй -набор из VPALACE (`pal_env*.atl` / `pal_wall.atl`), плюс `torch_debris` — -тайл, который встречается только на palace-уровнях. По EMM это ещё ~6 -страниц при бюджете ~3.3 МБ — не проблема. - -**Палитра — главный технический вопрос, и он уже решён раскроем.** -Тайлсет живёт в слотах `0x50..0x5F` (env) и `0x60..0x6F` (wall); Кид, меч, -страж, склянки — в других слотах. Значит смена тайлсета = перезапись 32 -записей палитры (`gfx_pal_set` на обе страницы, как `flash_bg` в -`sprpop.c`), а НЕ перезагрузка `kid.pal` и не переиндексация спрайтов. -Сделать `pal_dungeon.bin` / `pal_palace.bin` (по 32 записи) и грузить при -смене типа уровня. Проверить артефактом: скриншот palace-комнаты против -рендера `render_room.py` для того же уровня. - -**Вариантные цвета уровней** (`tbl_level_color`, `level_var_palettes` — это -уже 1.3, в 1.0 их нет): по той же механике, тот же диапазон слотов. Решение -на будущее — сначала базовые два тайлсета, потом при желании цвета. - -**Выбор набора в коде.** `pop_bg_load()` сейчас грузит фиксированные имена; -превратить в `pop_bg_load(type)` с двумя таблицами имён + выгрузка старых -атласов при смене типа (`atlas_free`). Переключение — только на границе -уровня, не в кадре. - ---- - -## 4. Читы SDLPoP: что взять на следующем этапе - -Из `../SDLPoP/README.md` (раздел Cheats). У нас уже есть: **K** — убить -стража, **I** — бессмертие (наш, в оригинале нет), **S** — выдать меч (наш), -**+/−** — обход комнат (`ROOMNAV`, наш). - -**Брать сразу вместе с переходами уровней** (без них отладка дороже самой -работы): - -| Чит | Что даёт | Цена | -|-----|----------|------| -| **Shift+L — следующий уровень** | единственный вменяемый способ тестировать уровни 2..15 | тривиально: `++pop_next_level` из §2.2 | -| **R — воскресить Кида** | у нас респавн по ↑ + таймаут; порт `resurrect` ближе к оригиналу и не мешает управлению | низкая | -| **Shift+S / Shift+T — +1 HP / +максимум** | отладка боёвки без «ровно трёх попыток»; честная замена нашему читу бессмертия | низкая, HP-машинерия уже есть | -| **[ и ] — сдвинуть Кида на пиксель** (debug-чит SDLPoP) | прямо бьёт в наш класс багов «окклюзия/шов на один пиксель» — воспроизведение позы без ловли момента | тривиально | - -**Брать во вторую очередь:** - -| Чит | Почему позже | -|-----|--------------| -| **H / J / U / N + Ctrl+B — смотреть соседние комнаты** | требует честной модели `drawn_room ≠ Kid.room` (наш S3-straddle, каркас есть: `update_kid_render_dx`). Зато потом заменяет самодельный `ROOMNAV` и попутно закрывает straddle-задачу | -| **Shift+W — медленное падение (feather)** | ветка `JMP_IF_FEATHER` (опкод `0xF7`) в `play_seq` уже есть, но не проверена ничем — чит станет её единственным тестом | -| **C / Shift+C — номера комнат** | у нас номер рисуется палочками именно потому, что текст тянет 2 КБ знакогенератора в W2 (`sprpop.c`). Ждёт своего шрифта | - -**Не брать:** `Shift+I` (переворот экрана), `Shift+B` (blind mode) — -развлекательные, к отладке порта отношения не имеют. `−/+` (время) — нужен -таймер уровня, которого у нас нет (Фаза 6). - -**Отдельно, дорого, но очень ценно — `F6`/`F9` (quicksave/quickload точного -состояния).** Это сериализация `Char` + `room_modif` всех комнат + trob'ов + -состояния стражей. Даёт то, чего нам сейчас сильно не хватает: -воспроизводимый регресс в MAME («вот кадр, где баг») вместо ручного подхода -к позиции. Кандидат сразу после того, как заработают уровни. - ---- - -## 5. Риски и что проверить артефактом до кодинга - -1. **Размер кода.** Замер сборки 2026-08-01: `_CODE` 25 119 Б, - куча ~2.4 КБ, банк 2 (`pop_bg`) 13 792 / 16 384, банк 3 (`pop_map`) - 6 331, банк 1 (`guards`) 1 896, банк 4 (`pop_gdraw`) 2 236. Чомперы, - зеркало, скелет и второй тайлсет пойдут в банк 2 — там осталось 2.6 КБ. - **Прежде чем начинать §3, посчитать, куда лягут новые тайлы**, иначе - повторится история «банк 2 упёрся в потолок» (коммит 2f3e854). Свободные - номера банков есть (5+), гранулярность — файл. -2. **Спецсобытия уровней** (`seg002.c`: `level3_set_chkp`, `sword_disappears`, - `Jaffar_exit`, зеркало, мышь) — их НЕ надо портировать заранее. Для - уровней 2 и 3 нужен только чекпойнт уровня 3. Остальное — по мере - подхода к уровню. -3. **Чомперы** (уровень 3 и почти все дальше) — отдельная механика - (`animate_chomper` + коллизия + смерть); шаблон работы тот же, что у - пик/ворот, см. `gates_spikes_plan.md`. -4. **`tbl_guard_type = -1`** на уровнях 14/15: без проверки страж - «появится» из неинициализированных данных. -5. **Уровень 0 (демо)** существует в данных, но в скоуп не входит. diff --git a/applications/SprPoP/docs/menu_settings_plan.md b/applications/SprPoP/docs/menu_settings_plan.md deleted file mode 100644 index e8b8d14..0000000 --- a/applications/SprPoP/docs/menu_settings_plan.md +++ /dev/null @@ -1,529 +0,0 @@ -# Pause menu и Settings для Sprinter PoP - -Статус: **MS0, MS2 и MS4–MS8 выполнены** (2026-08-23). Pause menu, CFG, -Settings, диалоги, Controls и build screen находятся в bank 9. Решение о -рендеринге и затемнении — §10. - -Связанные документы: - -- [`full_game_plan.md`](full_game_plan.md) — автомат состояний, title, - demo, cutscenes и ending; -- [`quicksave_plan.md`](quicksave_plan.md) — состав и восстановление снимка. - -## 1. Решения - -- Программа работает только с HDD; настройки, QuickSave и Hall of Fame - всегда могут быть постоянными файлами. -- Основной pause menu обязательно содержит QuickSave и QuickLoad. -- QuickSave имеет один слот `POP.SAV`; предыдущая корректная запись хранится - как `POP.BAK`. -- Первая версия имеет один профиль `VANILLA`. Под этим именем пока понимается - **текущее поведение SprPoP**, включая уже встроенные исправления. -- Дизайн файла и API предусматривает будущий `ENHANCED`, но аудит и - переключение fixes сейчас не выполняются. -- Уровень 15/copy protection отсутствует. -- Моды, levelsets и меню Mods отложены. - -## 2. Что есть в SDLPoP - -`src/menu.c` содержит: - -- Resume, QuickSave, QuickLoad, Restart Level, Settings, Restart Game, Quit; -- General, Gameplay, Visuals, Mods, Controls; -- toggle/number/key controls, пояснения, scroll и confirmation dialogs; -- большой список fixes/enhancements и custom level options. - -На Sprinter не переносятся SDL-специфичные параметры: fullscreen, hardware -acceleration, scaling, aspect ratio, rumble. UI берёт структуру SDLPoP, но -набор настроек соответствует платформе. - -## 3. Pause menu первой версии - -```text -RESUME -QUICKSAVE (F6) -QUICKLOAD (F9) -RESTART LEVEL -SETTINGS -RESTART GAME -QUIT GAME -``` - -Поведение: - -- `Esc` в `PLAYING` открывает меню; повторный Esc или Resume возвращает игру; -- игра, логический таймер и звуковой насос ставятся на паузу согласованно; -- QuickSave/QuickLoad только взводят запрос, фактическая операция идёт на - безопасной границе кадра; -- QuickLoad disabled/показывает `NO QUICKLOAD`, если нет валидных SAV/BAK; -- перед QuickLoad из меню лёгкий probe проверяет заголовок и checksum обоих - файлов: валидный `POP.BAK` при отсутствующем/битом `POP.SAV` требует - отдельного `LOAD BACKUP?`, а не загружается молча; -- Restart Level и Restart Game выполняются сразу, БЕЗ подтверждения - (2026-08-22): Restart Level перечитывает уровень, Restart Game завершает - gameplay и возвращает к первому экрану title/intro; новая игра создаётся - общим LEVEL_LOAD только после skip/attract; -- Quit требует подтверждения и закрывает файлы/каналы штатным путём; -- меню недоступно в demo, cutscene, time-expired и ending; -- отдельная debug-комбинация немедленного выхода может остаться только в - отладочной сборке. - -## 4. Settings первой версии - -```text -GENERAL - Sound ON / OFF - Show Sprinter screen ON / OFF - Restore defaults... - -GAMEPLAY - Speed NORMAL / FAST / FASTEST - Gameplay profile VANILLA - Cheats ON / OFF - -CONTROLS - Show key bindings - -BACK -``` - -`Gameplay profile: VANILLA` показывается read-only: место в модели уже есть, -но пользователь не может выбрать ещё не реализованный ENHANCED. - -Изменения применяются немедленно к скорости, читам и звуку, но `POP.CFG` -записывается один раз при Back/Esc. На экране есть итог `SETTINGS SAVED` или -`SAVE ERROR`; во втором случае runtime-значения остаются рабочими. - -Отладочные параметры `ROOMNAV`, border profiling, stop-frame и переключение -double buffering не являются пользовательскими Settings. Они остаются -compile-time/debug функциями и скрываются из release UI. - -## 5. Модель настроек - -Игровой код не должен читать UI-структуры. Единственный runtime-контракт: - -```c -typedef enum { - POP_PROFILE_VANILLA = 0, - POP_PROFILE_ENHANCED = 1 -} pop_gameplay_profile_t; - -typedef struct { - uint8_t sound_enabled; - uint8_t speed_mode; - uint8_t gameplay_profile; - uint8_t cheats_enabled; - uint8_t show_build_info; - uint16_t enhancement_flags; -} pop_settings_t; -``` - -В первой версии загрузчик принимает только `POP_PROFILE_VANILLA`. Значение -ENHANCED из более нового/ручного файла заменяется на VANILLA с диагностикой, -а не включает частично реализованный режим. - -Будущий профиль задаёт маску возможностей централизованно: - -```text -VANILLA -> текущий согласованный набор -ENHANCED -> будущий рекомендуемый набор fixes -CUSTOM -> только если позже действительно понадобится -``` - -До отдельного аудита существующие `fix_exit_door`, feather guard behavior, -jump grab и sound priorities не переключаются и считаются частью текущего -VANILLA. - -## 6. Файл POP.CFG - -Бинарный, компактный, версионированный формат: - -```text -+0 "PCFG" magic, 4 Б -+4 format_version 1 Б -+5 payload_size 2 Б -+7 payload фиксированные поля little-endian -.. checksum 2 Б -``` - -Требования: - -- путь рядом с exe/в выделенном каталоге игры на HDD; -- неизвестная версия, неверная длина или checksum -> defaults; -- неизвестные будущие хвостовые поля можно пропустить по `payload_size`; -- запись только после Apply/выхода из Settings, не на каждый шаг курсора; -- ошибка записи не завершает игру: показать сообщение и оставить runtime - значения; -- Restore defaults меняет RAM только после подтверждения и затем сохраняет. - -CFG не содержит состояние уровня, QuickSave или Hall of Fame. - -## 7. QuickSave / QuickLoad в меню - -Детальный состав снимка и порядок восстановления — в -[`quicksave_plan.md`](quicksave_plan.md). Здесь фиксируется UI и файловая -транзакция. - -### Один слот и backup - -Файлы: - -```text -POP.SAV текущий слот -POP.BAK предыдущий валидный слот -POP.NEW временный файл во время записи -``` - -Безопасная запись: - -1. записать полный снимок в `POP.NEW`; -2. закрыть файл; -3. повторно открыть/прочитать заголовок и checksum; -4. старый валидный `POP.SAV` перенести/скопировать в `POP.BAK`; -5. `POP.NEW` сделать новым `POP.SAV`; -6. при любой ошибке сохранить прежний `POP.SAV`. - -Точную последовательность rename/copy выбрать после характеризации DSS. -Если атомарный rename не гарантирован, использовать copy + fsync/close и -никогда не удалять единственную валидную копию до проверки новой. - -### Загрузка - -1. проверить `POP.SAV`; -2. если он отсутствует/повреждён/несовместим — проверить `POP.BAK`; -3. при валидном BAK показать `LOAD BACKUP?`; -4. несовместимая версия — `INCOMPATIBLE SAVE`, без частичной загрузки; -5. после успеха закрыть menu, перерисовать обе страницы, перезапустить звук. - -### Сообщения - -Минимальный набор: - -```text -QUICKSAVED -QUICKLOADED -NO QUICKLOAD -SAVE ERROR -INCOMPATIBLE SAVE -LOAD BACKUP? -``` - -Сообщение показывается UI-слоем, но операция завершается до возврата в -игровой кадр. - -## 8. Restart Level / Restart Game - -Restart Level: - -- использует существующий штатный reset текущего уровня; -- не перечитывает CFG; -- не меняет `POP.SAV`; -- сбрасывает состояние, которое сбрасывает текущая реализация SprPoP. - -Restart Game: - -- выполняется сразу, без подтверждения; -- завершить текущий gameplay session и вернуть автомат в TITLE; -- начать title/intro с самого первого экрана; -- создать новую игру с `FIRST_LEVEL` и новым глобальным таймером только - после пользовательского skip либо ввода в attract-demo; -- настройки оставить; -- QuickSave не удалять. - -## 9. Controls - -Первая версия только показывает активную раскладку. Переназначение клавиш -откладывается: raw PS/2 канал имеет особенности Shift и расширенных кодов, -поэтому generic key-binding UI требует отдельного проекта. - -Экран должен перечислить минимум: - -- движение и Shift/action; -- Esc/menu; -- F6/F9 QuickSave/QuickLoad; -- Ctrl+S sound; -- P speed; -- доступные cheats, только если они включены: K/Kill Guard, I/Immortal, - Shift+L/Next Level, U/Flip Screen и F7/F8/Time −/+ на отдельных понятных - строках. Нижней подсказки `Esc or Enter: Back` нет. - -## 10. UI renderer и ввод - -### 10.1. Выбор способа отрисовки: текст против спрайт-атласов - -Ограничение платформы: стандартный текстовый вывод libbgi (`outtextxy`) -не годится — он тянет системный знакогенератор в `_gfx_font_buf` (2 КБ -статики в W2) плюс жирный резидентный код, а W1/W2 забиты игрой -(тот же вывод зафиксирован комментарием в `sprpop_cold.c`, где отладочный -борд рисуется палочками именно поэтому). Значит, любой вариант требует -СВОЕЙ реализации вывода меню, живущей в отдельном банке (память на банк -есть; скорость не критична — меню работает на паузе). - -Рассматривались два подхода. - -**Вариант A — текстовые строки + собственный растровый рендерер.** - -Плюсы: -- минимальные данные: шрифт 2–4 КБ + таблицы строк по сотни байт на язык; -- весь динамический текст бесплатно: значения опций (ON/OFF, - NORMAL/FAST/FASTEST), сообщения (`QUICKSAVED`, `INCOMPATIBLE SAVE`), - диалоги (`LOAD BACKUP?`), экран Controls, будущий ввод инициалов - Hall of Fame — без текстового движка HoF вообще не сделать; -- правка формулировки = правка C-строки, мгновенные итерации; -- локализация = вторая таблица строк (+ вторая половина глифов); -- **решающий аргумент: так сделано в самом SDLPoP** — см. §10.2. - -Минусы: -- надо написать рендерер (блиттер глифа + строка + центрирование + - подсветка) — небольшой, но свой; -- вид определяется качеством шрифта-ассета. - -**Вариант B — готовые спрайт-атласы** (атлас главного меню с активными/ -неактивными пунктами, атлас вложенного меню, атлас каждой опции -On/Off и т.д.). - -Плюсы: -- аутентичный вид: любая типографика/декор запекаются при упаковке; -- вывод = существующий блит атласов, текстовый движок не нужен; -- язык = другой файл атласа с диска, ноль логики. - -Минусы: -- комбинаторика ассетов: 7 пунктов × состояния + вложенные меню + значения - всех опций + все сообщения + все диалоги ≈ десятки КБ raw на язык до RLE; - второй язык удваивает; -- любая правка текста = перегенерация ассетов + перекладка ресурсов; -- динамический текст (HoF initials) всё равно потребует шрифтового движка — - получили бы ОБЕ системы сразу. - -**Решение (2026-08-22): Вариант A**, шрифт — ассет. Спрайты остаются только -для нетекстового декора (рамка/фон меню, маркер выделения — как arrowheads -в SDLPoP). Титульный экран — полноэкранная картинка, тема `full_game_plan.md`. - -### 10.2. Референс: как устроено меню в SDLPoP - -`SDLPoP/src/menu.c` + текстовый движок `seg009` — источник структуры: - -- **Текстовые строки + встроенный пропорциональный bitmap-шрифт** - `hc_small_font_data[]` (menu.c:2488): символы 32..126, каждый глиф — - монохромное изображение переменной ширины; `font_type` - {first_char, last_char, space_between_chars, height_above_baseline, chtab}. - Никаких per-item атласов, хотя SDL_ttf доступен. -- Вывод — портированный движок оригинального DOS PoP (seg009): - `draw_text_character` → `method_3_blit_mono(image, x, y, textblit, - textcolor)`; `get_line_width` для центрирования; перенос по словам. - Тем же движком рисуются in-game тексты и copy protection. -- Пункты меню — data-driven C-структуры `{id, previous, next, required, - char text[32]}` + таблицы `pause_menu_items[]` / `settings_menu_items[]`; - `required` — указатель на флаг disabled, такие пункты пропускаются при - навигации (prev/next пересчитываются). -- Выделенный пункт = смена цвета текста (bright-white против обычного) + - рамка-контур `draw_rect_contours(selection_box, lightgray)`; НЕ отдельный - спрайт «активного пункта». -- Фон меню — затемнение замороженного игрового кадра: - `draw_rect_with_alpha(black, alpha=120)`, внизу просвечивает «GAME PAUSED». -- Settings — декларативная таблица `setting_type` со стилями TOGGLE / NUMBER / - TEXT_ONLY / KEY, геттером/сеттером/increase/decrease значения, строкой- - explanation внизу экрана, скроллом длинных списков и фокусом «левая половина - (список) / правая половина (значения)». -- Диалоги — один общий `draw_confirmation_dialog(text)` + обработчик - результата; диалог возвращает решение автомату меню. -- Мини-спрайты только для декора значений (arrowheads up/down/left/right). -- Навигация озвучена (menu tick), ввод клавиатура+мышь, hover по прямоугольникам. - -### 10.3. Наша реализация - -- Банк 9: код рендерера, - шрифт, таблицы строк, автомат меню. Резидентно — только request-flag и - вызов процесса на границе кадра (паттерн pop_qsave_io). -- Рендерер повторяет минимальный контракт seg009: пропорциональные глифы, - baseline, `draw_string` и центрирование по сумме advance. Блит идёт через - W0-атлас, в `GFX_BANK_SPRITE`: `0xFF` в атласе пропускается, а UI временный - и не портит теневую копию игрового фона. Перед каждым кадром UI `gfx_copy_page` переносит чистый - shadow видимой страницы в скрытую, затем готовый кадр показывается только - на следующем фронте. При выходе чистый фон тем же способом возвращается на - обе страницы и восстанавливается исходная visible-страница. Поэтому - перемещение выделения не показывает поэтапную перерисовку и не оставляет - следов на back buffer. -- Шрифт — АССЕТ из **оригинальных** `hc_small_font_data[]` и - `hc_font_data[]` SDLPoP, не системный ZG и не TTF. Паковщик - `toolchain/pop_extract_font.py` делает `FONT\\font.atl`: 95 ASCII-глифов - малого и 95 крупного шрифта (7667 Б). Номер ленты вычисляется из ASCII, - поэтому это один текстовый движок, а не атлас готовых надписей. -- Двуязычность (eng/rus): строки храним в CP866 — латиница и кириллица одним - байтовым порядком, одна кодировка на оба алфавита. Локаль = пара - (указатель на таблицу строк, файл шрифта); переключатель — одна настройка. - Русские строки длиннее английских ~10–15% — раскладку экранов и ширину - колонок закладывать по русской. Второй язык можно добавить позже без - переделки: сначала eng. -- Визуальная композиция MS4 следует SDLPoP: замороженная сцена остаётся - открытой, поверх неё компактный центрированный список без чёрной карточки, - выбранная строка обведена тонким светло-серым контуром, а крупное - `GAME PAUSED` лежит в нижнем борту. Цвета текста и контура берутся из - стабильного диапазона палитры 0x37..0x3F. -- Фон открытого меню: снимок текущей палитры, затемнение всех слотов кроме - UI 0x37..0x3F и точное восстановление при выходе. Снимок хранится в - свободном хвосте EMM-страницы шрифта, не в W2. -- Навигация MS4: вверх/вниз, Enter/Esc, edge-triggered поверх `kbd_raw`. - Left/right и menu tick добавляются вместе с настройками на MS5. - -Первый UI может быть визуально простым. Критично отсутствие потери клавиш, -предсказуемая пауза и отсутствие повреждения игрового back buffer. - -### 10.4. Затенение экрана под меню — решение MS4 - -Режим меню виден сразу: bank 9 делает динамический снимок palette 0, -затемняет RGB-каналы вдвое и пишет одинаковый результат в обе экранные -палитры. Девять стабильных UI-слотов 0x37..0x3F не гасятся. При Resume/Enter -палитра восстанавливается из EMM-снимка. Это выбранный вариант Б ниже; -ступенчатый fade для роликов пока не нужен и остаётся отдельной будущей -задачей, а не причиной раздувать MS4. - -**Как сделано в SDLPoP** (`seg009.c`): - -- Меню: `draw_rect_with_alpha(&screen_rect, color_0_black, pause_menu_alpha)` - (menu.c:1364) — альфа-заливка чёрным поверх замороженного кадра средствами - SDL; нижняя полоса рисуется с alpha=0, чтобы сквозь неё просвечивало - «GAME PAUSED». Прямого аналога на Sprinter НЕТ (альфа-блендинг в железе - отсутствует) — это SDL-специфика, переносить нечего. -- Ролики/переходы: `fade_in_2/fade_out_2(rows)` (seg009.c:3947+, вызовы из - seg000.c) — ПОШАГОВОЕ затухание ПАЛИТРЫ к чёрному и обратно: палитра - копируется, каждая строка по 16 цветов гасится за несколько кадров - (`which_rows` маской выбирает, какие строки участвуют: 0x800/0x1000/...). - Вот этот механизм на Sprinter воспроизводим один в один. - -Отсюда рабочая гипотеза: наш примитив = «снимок текущей палитры → ступенчатое -приближение к затемнённой копии (кроме резервного блока для UI)», статично для -меню и анимированно для роликов/переходов. Варианты: - -**Вариант А — единая основная палитра (глобальный рефакторинг палитры).** - -1. Собрать ВСЕ палитры игры (уровневые наборы `pal_env*`, kid.pal, палитра - Тени и пр.) в одну общую 256-цветную; использовать её целиком всегда. - Сейчас переиспользования цветов НЕТ — каждая загрузка ассетов перезаписывает - слоты (см. pop_boot: kid.pal затирает тайловые цвета, приходится - восстанавливать `pop_bg_pal_apply`/`pop_shadow_pal_apply`). -2. Для затенения — затемнённая копия основной палитры, КРОМЕ зарезервированного - блока из 16 цветов для самого меню (кандидат — стандартные 16 цветов VGA). -3. Выход из меню — возврат к полной основной палитре. - -Плюс: решает попутно существующую боль с перезаписью палитр при загрузках. -Минус: большой разовый рефакторинг упаковщиков и всех загрузчиков атласов; -нужен аудит, что все цвета всех уровней влезают в 256. **Против говорит -план перевода камней подземелья на цвета VGA-версии PoP: там ряд уровней -несёт ДРУГУЮ палитру, отличную от SDLPoP (VDUNGEON/VPALACE каскад, -levels_plan.md), — единая палитра этому прямо противоречит.** - -**Вариант Б — динамический снимок текущей палитры (сейчас выглядит -предпочтительным).** - -1. При открытии меню прочитать всю текущую палитру, сохранить. -2. Записать затемнённую копию (кроме зарезервированного блока для меню). -3. При выходе — восстановить сохранённую. - -Плюс: локальная правка внутри меню, ничего в пайплайне ассетов не меняется; -работает при любой текущей палитре автоматически — включая будущие -уровне-специфичные палитры VGA-камней; тот же примитив ступенями даёт -fade-out/fade-in для роликов и переходов между уровнями (как fade_*_2 в -SDLPoP). Минус: чтение/запись 256 записей палитры при входе/выходе (раз на -открытие — дёшево); затемнение «на глаз» может по-разному выглядеть на разных -уровнях. - -Резервный блок 16 цветов нужен в ОБОИХ вариантах; текущий диапазон 0x37..0x3F -(стабильный, проверен) даёт 9 цветов — этого может не хватить на -текст+подсветку+рамку, тогда резервировать отдельный блок. - -**Следствие для архитектуры:** работа с цветом/палитрой должна собраться в -ОДИН модуль (сейчас она разбросана: gfx_pal_* вызовы в boot, pop_bg_pal_apply, -pop_shadow_pal_apply, вспышки урона в sprpop.c и т.д.). Модуль палитры — -единственный владелец записи в палитру и предоставляет примитивы, которые -понадобятся и меню, и роликам: - -```text -pal_snapshot()/pal_restore() — снимок/восстановление всей палитры -pal_dim(step) / pal_undim(step) — ступени затемнения (кроме резервного блока) -pal_fade_out(rows)/pal_fade_in(rows) — анимированное затухание по строкам - (порт fade_out_2/fade_in_2, seg009) -``` - -Меню уже использует snapshot+dim локально в bank 9. Когда появятся ролики, -выделить из него общий palette/fade-модуль; вспышка урона сможет переехать -туда же после отдельного аудита. - -## 11. Диалоги - -Общий диалог подтверждения: - -```text -QUIT GAME? -RESTORE DEFAULTS? -LOAD BACKUP? - -YES / NO -``` - -Диалог не выполняет действие напрямую: он возвращает решение автомату меню, -который формирует команду приложению. Так UI не зависит от gameplay-модулей. -По умолчанию выбран `NO`; Up/Down/Left/Right меняют ответ, Enter подтверждает, -Esc отменяет. Реализованы все три вопроса: Quit, Restore defaults и backup -QuickLoad. В Quit-dialog вопрос и `YES / [NO]` заключены в общую рамку; -отдельная строка `Enter: Select Esc: Cancel` не выводится. - -## 12. Будущий ENHANCED - -Не реализуется сейчас, но дизайн обязан позволять: - -- добавить второй профиль без смены всего UI; -- хранить `enhancement_flags` в CFG; -- отличать технические исправления порта (всегда включены) от изменений - оригинальной механики; -- провести аудит уже встроенных исправлений; -- покрыть каждый переключаемый fix host/MAME тестом; -- при необходимости добавить Advanced screen, не раздувая основной menu. - -До этого момента нельзя рассыпать проверки `if (enhanced)` по горячему коду. -Сначала составляется реестр и выбирается минимальная битовая модель. - -## 13. Этапы реализации - -| этап | результат | критерий приёмки | -|---|---|---| -| **MS0** ✓ | определить команды app/menu и структуру settings | UI возвращает команду главному циклу; прямых gameplay-вызовов нет | -| **MS1** | проверить запись/rename/copy на HDD DSS | crash/power-loss сценарий не теряет обе копии save | -| **MS2** ✓ | `POP.CFG`: defaults, load, validate, save | v1 codec, будущий хвост, checksum; повреждённый CFG даёт defaults | -| **MS3** | QuickSave hotkeys + POP.SAV/BAK | полный критерий `quicksave_plan.md` | -| **MS4** ✓ | текстовый рендерер + два шрифта (малый для пунктов, крупный для сообщений) + минимальный pause menu | SDLPoP fonts в одном W0-atlas, центрирование, dim/restore palette и tear-free page flip; все семь пунктов видимы, навигация и Resume/QuickSave работают в MAME | -| **MS5** ✓ | General/Gameplay Settings | значения применяются сразу и после Back/Esc записываются в POP.CFG | -| **MS6** ✓ | dialogs + backup recovery | подтверждения default-NO; QuickLoad спрашивает перед валидным POP.BAK | -| **MS7** ✓ | Controls help | показаны движение, action, menu, save/load, звук, speed и conditional cheats; MAME проверил отдельные K/I и Shift+L/U и возврат Esc ровно на один уровень | -| **MS8** ✓ | build info | CFG читается до первого показа; включаемый build screen получает ID и дату из Make/git | - -QuickSave (`MS1/MS3`) можно реализовать раньше визуального menu: сначала -F6/F9 и сообщения, затем подключить те же команды к пунктам UI. - -## 14. Тесты - -- Host: CFG round-trip, defaults, bad magic/version/size/checksum. -- Host: меню navigation, disabled items, confirmations, команды приложению. -- Host: рендерер строк — вывод глифов обеих локалей, центрирование, - ширина строки для малого и крупного шрифта. -- Host: SAV invalid -> BAK valid; оба invalid -> NO QUICKLOAD. -- MAME: F6, изменение сцены, F9; затем рестарт программы и повторный F9. -- MAME: прервать запись/испортить SAV — BAK остаётся загружаемым. -- MAME: pause на бое/падении, Resume не меняет состояние и таймер; смена - выбранного пункта не показывает промежуточный кадр и после закрытия не - оставляет меню на второй странице. -- MAME: Settings сохраняются после полного выхода и запуска с HDD. -- MAME: включить Show Sprinter screen, перезапустить `SprPoP`, увидеть - build ID/date до первого игрового кадра и пропустить экран Esc/Enter/Space. -- Проверка лимита 8 DSS handles на каждом error path. -- `make size-check`; menu/text строки не должны съесть резидентный бюджет. - -## 15. Не входит в план - -- Mods и выбор levelset; -- уровень 15/copy protection; -- несколько save slots; -- replay/recording; -- key rebinding; -- SDL visual/controller options; -- фактическая реализация ENHANCED и individual fix switches. diff --git a/applications/SprPoP/docs/midtable_analysis.md b/applications/SprPoP/docs/midtable_analysis.md deleted file mode 100644 index a0df25e..0000000 --- a/applications/SprPoP/docs/midtable_analysis.md +++ /dev/null @@ -1,275 +0,0 @@ -# Слои отрисовки: как устроен оригинал и чего стоит порт - -Разбор 2026-08-13, по `../SDLPoP/src/seg008.c`. Повод — семь дефектов -падающих плит на уровне 13, из которых три оказались не багами кода, а -следствием того, что у нас нет слоя, в котором объекты и куски тайлов -сортируются между собой. Решение по этому документу ещё не принято. - ---- - -## 1. Как это работает в оригинале - -### 1.1 Три таблицы, а не «слои» - -`draw_tables` (seg008:1373) рисует ровно в таком порядке: - -``` -restore_peels(); -draw_wipes(0); -draw_table(0); // BACKTABLE -draw_table(3); // MIDTABLE -draw_wipes(1); -draw_table(1); // FORETABLE -``` - -Это грубое разделение на три уровня глубины. Куда попадёт кусок тайла, -решает переменная `ptr_add_table`, которую вызывающий переставляет перед -`draw_tile*`: по умолчанию `add_backtable`, в оверлее кромки — -`add_midtable` (`draw_other_overlay`, seg008:1499), а `add_foretable` -вызывается явно и точечно. - -### 1.2 Объекты живут НЕ в таблицах, а в objtable — и привязаны к ТАЙЛУ - -Персонажи, падающие куски, мечи, брызги попадают в `objtable`, и у каждой -записи есть поле `tilepos` — тайл, которому объект принадлежит. - -Ключевое: объекты рисуются **не отдельным проходом после фона**, а ВНУТРИ -обхода тайлов. В `redraw_needed_tile` (seg008:207) стоит: - -```c -if (tile_object_redraw[tilepos]) { - if (tile_object_redraw[tilepos] == 0xFF) - draw_objtable_items_at_tile(tilepos - 1); - draw_objtable_items_at_tile(tilepos); - tile_object_redraw[tilepos] = 0; -} -if (redraw_frames_fore[tilepos]) draw_tile_fore(); -``` - -То есть на каждом тайле: сначала его фоновые куски, потом объекты ЭТОГО -тайла, потом его передние куски. - -### 1.3 Порядок глубины складывается из ТРЁХ независимых механизмов - -| механизм | что даёт | -|---|---| -| порядок обхода тайлов: ряды **2, 1, 0**, колонки 0..9 (seg008:129) | тайл, обойдённый позже, рисуется поверх | -| сортировка объектов ВНУТРИ одного тайла (`sort_curr_objs`, seg008:1553) | кто из объектов одного тайла поверх кого | -| три таблицы back/mid/fore | грубая глубина для кусков тайлов | - -Сортировка внутри тайла (`compare_curr_objs`, seg008:1572) — пузырьком, и -правил в ней три: - -``` -объект типа 1 (ТЕНЬ) — всегда первым; -оба объекта — падающие плиты (0x80): y1 < y2 → по УБЫВАНИЮ y; -любая другая пара: y1 > y2 → по ВОЗРАСТАНИЮ y. -``` - -Обратный порядок для пары плит — не описка: две плиты из `loose_fall` летят -в 6 пикселях друг от друга, и верхняя обязана лечь поверх нижней. - -### 1.4 Что из этого следует - -**«Сортируемый midtable» — неточное имя.** Глобальной сортировки среднего -слоя в оригинале нет. Есть привязка объекта к тайлу и сортировка внутри -тайла; всё остальное решает порядок обхода. Это принципиально дешевле -общей сортировки: объектов на один тайл обычно 1-2. - ---- - -## 2. Что делаем мы - -Наш кадр — жёсткая последовательность проходов, без привязки объектов к -тайлам: - -``` -фон: pop_loose_tick (физика кусков) -> pop_process_trobs -> pop_redraw_needed - -> редрой шва -объекты: pop_loose_mob_draw (куски ПОД Kid, отсортированы по y между собой) - pop_char_draw(OPP/KID) (порядок задаёт guard_over_kid) - pop_loose_mob_draw_over (куски ПОВЕРХ Kid) -перед: pop_fore_over_char — ТОЛЬКО в окне вокруг персонажа -``` - -Отличия, из которых растут все три оставшихся дефекта: - -1. **Объект не знает своего тайла.** Глубина «кусок против Кида» считается - отдельной формулой (`pop_room.c`, поле `defer`), а «кусок против КУСКА - ТАЙЛА» не считается вовсе — куски тайлов рисуются раньше всех объектов. -2. **Передний слой считается только вокруг персонажа.** Это наша - оптимизация (memory `pop_fore_layer_cost`: полный проход стоил 78 % - кадра). Падающая плита в чужом углу комнаты передних частей тайлов - поверх себя не получает — отсюда «плита перед колонной». -3. **Оверлей кромки идёт после персонажей** и потому безусловно поверх - всех, тогда как у оригинала он в midtable и сортируется. - ---- - -## 3. Что затрагивает порт - -| участок | объём правки | -|---|---| -| `pop_room.c` — куски | привязать к тайлу, убрать `defer`, убрать собственную сортировку | -| `pop_cdraw.c` — персонажи | то же: объект вместо слота, привязка к тайлу | -| `pop_bg.c` — `overlay_mid_tile`, `fore_only_tile`, `ceil_over_kid_tile` | вызов из обхода тайлов, а не из отдельного прохода | -| `pop_redraw.c` — пометки | добавить «на этом тайле есть объект» (порт `tile_object_redraw`) | -| `sprpop.c` — главный цикл | вместо трёх проходов один: обход тайлов с объектами внутри | -| окно fore-клипа (`pop_t_fclip_*`) | смысл меняется: клип по тайлу, а не по персонажу | - -Плюс новая структура objtable и её сортировка — но маленькая, на тайл. - ---- - -## 4. Плюсы - -* **Уходят разом** MOB-CLIP-RIGHT, MID-OVERLAY-LAYER и «плита перед - колонной»: все три — следствие отсутствия привязки к тайлу, а не - самостоятельные баги. -* **Уходят подпорки.** Перерисовка соседнего тайла поверх куска, - `defer`, ручная сортировка кусков, отдельный проход `draw_over` — - всё это заменяется одним механизмом. -* **Совпадение с оригиналом по построению.** Дальше любой вопрос «что - поверх чего» решается чтением seg008, а не экспериментом в MAME. -* **Возможный выигрыш по кадру.** Сейчас fore-проход считает окно вокруг - персонажа и всё равно перебирает до девяти тайлов; при привязке к тайлу - передние части рисуются только там, где реально есть помеченный объект. - Но это НАДО ЗАМЕРИТЬ, а не обещать. - ---- - -## 5. Минусы и риски - -* **Риск регресса широкий.** Трогается порядок отрисовки ВСЕГО: Кид, - соперник, меч, брызги, зеркало, куски, оверлеи, полоса потолка. - Уровни 1-11 приняты и держатся на текущем порядке. -* **Наша оптимизация fore-окна может не пережить порт в прежнем виде.** - Она даёт 3.2x на самом дорогом проходе (memory `pop_fore_layer_cost`). - Если привязка к тайлу заставит рисовать передние части шире — можно - потерять больше, чем выиграть. -* **Дабл-буфер.** У оригинала один экран с dirty-rect, у нас две страницы - со своими копиями фона и heal. Пометка «на тайле есть объект» обязана - быть счётчиком страниц, как остальные наши пометки, — иначе объект - перерисуется на одной странице и не перерисуется на другой. -* **Банки.** Отрисовка размазана по трём банкам (`pop_bg` 2, `pop_cdraw` 4, - `pop_room` 7) плюс резидент. Единый обход тайлов с объектами внутри - означает, что цикл обхода зовёт код из всех трёх — надо проверить, что не - упрёмся в границы банков и трамплины. -* **Объём.** Это не правка, а этап: сопоставимо с тем, что делалось для - fore-слоя. - ---- - -## 6. Развилки - -**A. Полный порт** — objtable с привязкой к тайлу, сортировка внутри тайла, -объекты внутри обхода. Максимально близко к оригиналу, максимальный риск и -объём. - -**B. Частичный: только привязать КУСКИ к тайлам.** Персонажей оставить как -есть. Закрывает MOB-CLIP-RIGHT и «плиту перед колонной», не трогает -проверенный порядок персонажей. Дешевле и безопаснее; MID-OVERLAY-LAYER -остаётся. - -**C. Отложить** до этапа BG-ONCE и делать вместе — там всё равно -пересматриваются слои, и два пересмотра подряд дороже одного. - -Рекомендация: **B или C**. Вариант A целиком оправдан только если мы -одновременно берёмся за BG-ONCE — тогда это один пересмотр слоёв вместо -двух, и замер кадра делается один раз. - ---- - -## 7. ЗАМЕРЫ (сделаны 2026-08-13, уровень 13) - -Метод — маркеры-пустышки в РЕЗИДЕНТЕ вокруг измеряемого вызова плюс -брейкпоинты с `printf totalcycles` (memory `z80_profiling_method`). В -банковый код брейкпоинт ставить нельзя: 0xC000 — общее окно всех банков. - -| что | такты | доля логического кадра | -|---|---|---| -| логический кадр целиком | **1 289 526** | 100 % | -| `pop_redraw_needed` | **978** | 0,08 % | -| **fore-проход, ОДИН персонаж** | **128 778** | **10 %** | - -Плюс два счётчика за прогон ~229 логических кадров: - -* fore-проход вызван **10 раз** — на 96 % кадров он не выполняется вовсе - (пропуск неизменившегося персонажа, `pop_char_skip_mask`). Средняя цена - по кадру выходит ~0,4 %, но КАК ТОЛЬКО персонаж движется — платим все 10 % - каждый кадр, и при двух персонажах это ~20 %; -* **максимум объектов на одном тайле = 2** (комната 16, пара из - `loose_fall`: плита сбивает плиту, дальше летят обе). В комнате 23, где - гряда падает в пустоту, максимум 1. - -### 7.1 Что эти числа меняют в оценке - -**Сортировка внутри тайла — бесплатна.** Два объекта, пузырёк на два -элемента. Возражение против варианта A, которое закладывалось в §5, снято. - -**`pop_redraw_needed` можно не считать вовсе.** 978 тактов против 128 778 у -fore-прохода — соотношение 131 к 1. - -**Единственный настоящий риск порта — окно клипа fore-прохода.** Если -привязка объектов к тайлам заставит рисовать передние части шире нынешнего -окна вокруг персонажа, мы потеряем 10 % кадра, и потеряем их НА ДВИЖЕНИИ, -когда бюджет и так самый напряжённый. - -### 7.2 Насколько узко оригинал помечает передний слой — ВЫЯСНЕНО - -Пометки `redraw_frames_fore[]` ставит ровно одна функция — `set_redraw_fore` -(seg007:0550), и зовут её из трёх мест. Ни в одном нет «пометить всё». - -**Персонаж — `redraw_at_char` (seg003:0576).** Помечается ПРЯМОУГОЛЬНИК -футпринта: - -```c -for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row) - for (tile_col = x_col_left; tile_col <= x_col_right; ++tile_col) - set_redraw_fore(get_tilepos(tile_col, tile_row), 1); -``` - -с двумя уточнениями: при вынутом мече прямоугольник расширяется на колонку в -сторону клинка, а для КИДА берётся объединение с футпринтом ПРОШЛОГО кадра -(`prev_char_*`) — чтобы освободившиеся тайлы тоже вернули свои передние -части. - -**Падающий кусок — `draw_mob` (seg007:~1147).** Каждый кадр помечается -СОСЕД СПРАВА (`++tile_col`), и второй тайл, если кусок висит на границе -рядов: - -```c -++tile_col; -tilepos = get_tilepos(tile_col, tile_row); -set_redraw2(tilepos, 1); -set_redraw_fore(tilepos, 1); -top_row = y_to_row_mod4(ypos - 18); -if (top_row != tile_row) { ... то же для top_row ... } -add_mob_to_objtable(ypos); -``` - -**Анимация тайла — `draw_trob` (seg007:01E6):** один тайл. - -**Вывод: пометка переднего слоя в оригинале НЕ ШИРЕ нашего окна.** Она -пообъектная — футпринт персонажа и 1-2 тайла на кусок. Значит полный порт -objtable **не отнимает** нашу оптимизацию fore-окна, а формализует её: -вместо «окно вокруг персонажа» будет «тайлы, помеченные объектами», что -как минимум не шире, а для одиночного куска заметно уже. - -Риск, вокруг которого крутилась вся оценка, снят. - -### 7.3 Побочный результат: готовый рецепт для MOB-CLIP-RIGHT - -`draw_mob` даёт точный ответ на вопрос, как оригинал прячет правую часть -куска за соседним полом: он НЕ рисует сосед поверх куска (наша подпорка) и -НЕ полагается только на `clip.right`. Он помечает соседний тайл СРАЗУ -двумя пометками — `set_redraw2` (фон) и `set_redraw_fore` (передний слой). -Дальше порядок делает всё сам: фон соседа рисуется ДО куска, его передние -части — ПОСЛЕ. - -Это же закрывает и «плиту перед колонной»: передние части соседнего тайла -(колонна) ложатся поверх куска, потому что тайл помечен. - -**Рекомендация после разбора: вариант A (полный порт).** Оба возражения -против него сняты замерами и этим разбором — сортировка внутри тайла -бесплатна (максимум 2 объекта), окно переднего слоя не теряется. diff --git a/applications/SprPoP/docs/music_runtime_index_plan.md b/applications/SprPoP/docs/music_runtime_index_plan.md deleted file mode 100644 index 40d3326..0000000 --- a/applications/SprPoP/docs/music_runtime_index_plan.md +++ /dev/null @@ -1,592 +0,0 @@ -# Аудио без перелинковки: runtime-индексы музыки и эффектов - -> Статус: **ОБЕ ЧАСТИ СДЕЛАНЫ 2026-08-31** — эффекты (SI0..SI4) и музыка -> (MI0..MI5). Разбор и результаты: `sound_plan.md` §10 (эффекты) и §11 -> (музыка). Ниже — исходный план; расхождения перечислены следом. -> -> Что в реализации разошлось с планом ниже: файл назван `SND/snd.idx` -> (единый basename с `snd.arc`, оба в нижнем регистре), а при отсутствии -> индекса поднимается ПУСТОЙ набор с блоком тишины — иначе встаёт музыка -> и игра непроходима (§10.5 sound_plan). Про `ticks60` в `PMI1` решено: -> поле в формате оставить даже если сценарии перейдут на ожидание звука — -> загрузчик волен не тащить его в память. -> -> Расхождения части I с планом ниже: -> * файл назван `MUS/mus.idx` (единый стиль с `snd.idx`); -> * пауза конца уровня переведена НЕ на runtime-тики, а на состояние -> «заявка/загрузка/звучание» (`pop_music_active`) — §11.2: это снимает и -> зависимость от набора, и враньё делителя `/4` в быстрых режимах, и -> расхождение с SDLPoP при выключенном звуке; -> * PV-сцена (§8 плана) — не структура времён через пять функций, а четыре -> якоря-статики (8 байт), от которых отсчитываются прежние выражения; -> * `pages` в PMI1 не хранится — считается из `blocks`. - -## 1. Цель - -Один и тот же `sprpop.exe` должен корректно работать с любым штатным набором -музыки (`flac`, `mp3`, `ogg`, `mt32`) без перекомпиляции и перелинковки. -Замена набора должна сводиться к замене файлов в `MUS/` вместе с описывающим -их индексом. - -Сейчас это невозможно: упаковщик печатает зависящие от набора значения в -`gen/pop_music_tbl.h` и `gen/pop_music_ticks.h`, после чего они становятся -частью EXE. Если заменить только `MUS/mNN.bin`, загрузчик продолжает верить -размерам старого набора, а сценарии — его длительностям. - -## 2. Подтверждённое текущее состояние - -После преобразования в PCM наборы `flac`, `mp3` и `ogg` имеют одинаковые -длины. Исполнение MT-32 отличается. Значимые примеры: - -| трек | FLAC/MP3/OGG | MT-32 | -|---|---:|---:| -| m32, конец уровня 4 | 438 тиков | 449 тиков | -| m41, обычный конец уровня | 732 | 685 | -| m50, принцесса ждёт | 831 | 867 | -| m53, реплика Джафара | 985 | 1044 | -| m56, финальная тема | 9865 блоков / 78 страниц | 10462 / 82 | - -Все обычные треки каждого из четырёх наборов по-прежнему помещаются в -`POP_MUS_PAGES == 20`. Только m56 требует кольцевого проигрывателя. -`uint16_t` достаточно и для самого длинного MT-32-трека: 10462 блока. - -Compile-time длительности используются не повсюду: - -- `pop_music.c` читает из `pop_music_tbl.h` наличие, число страниц и блоков; -- `pop_intro.c` использует длительности m50 и m53 для шкалы PV-сцены; -- `pop_kid.c` использует длительности m32 и m41 для паузы конца уровня, - включая режим с выключенной музыкой; -- остальные ожидания уже опираются на `pop_music_busy()` и автоматически - заработают с правильным runtime-числом блоков. - -## 3. Что должно остаться константами программы - -В индекс переносятся только свойства конкретного набора. Инварианты формата -остаются в коде, а заголовок IDX лишь подтверждает их: - -- PCM unsigned 8-bit mono; -- частота `CBL_FREQ_10K9`; -- один блок насоса — 128 байт; -- пространство оригинальных sound id — 0..56; -- `POP_MUS_PAGES == 20` для обычного загрузчика; -- размер кольца потокового проигрывателя. - -Это важно: IDX не должен обещать программе другой формат PCM, который насос -физически не умеет воспроизводить. - -## 4. Предлагаемый файл `MUS/MUSIC.IDX` - -Предпочтителен отдельный индекс набора, а не заголовок в каждом треке: - -- все сценарные длительности доступны сразу после старта; -- `mNN.bin` остаются простыми сырыми PCM-потоками; -- загрузчик трека меняется минимально; -- один индекс легко заменить вместе с набором; -- формат помещается в один 512-байтовый сектор DSS. - -Предлагаемая версия `PMI1`: - -```text -0..3 "PMI1" magic и версия -4 57 число плотных записей (id 0..56) -5 4 размер записи -6 7 log2 размера блока: 1 << 7 = 128 -7 1 формат PCM: u8 mono, CBL_FREQ_10K9 -8..15 0 резерв будущих версий - -16.. 57 записей по 4 байта: - +0..1 uint16 blocks длина PCM в блоках по 128 байт - +2..3 uint16 ticks60 длительность ожидания в тиках оригинала - -244..511 нулевой резерв до одного сектора -``` - -Нулевые `blocks` и `ticks60` означают, что трека с таким id в наборе нет. - -`pages` в IDX не хранится: это производная величина, и её дублирование может -разойтись с `blocks`: - -```c -pages = blocks / 128 + ((blocks & 127) != 0); -``` - -По умолчанию упаковщик вычисляет тики той же формулой, что сейчас: - -```text -ticks60 = round(blocks * 40 / 57) -``` - -Хранить `ticks60` отдельно всё же полезно: в будущем момент окончания -сценарной реплики можно будет уточнить независимо от технического хвоста PCM. -Генератор обязан печатать предупреждение, если явно заданные тики заметно -отличаются от длительности файла. - -## 5. Размещение индекса в памяти - -Загружать таблицу в обычный изменяемый `static` нельзя. Данные банковых -модулей сейчас попадают в общий `_DATA`/W2, а свободная куча составляет около -238 байт. Даже таблица из 228 байт практически уничтожит этот запас. - -Индекс следует держать в одной EMM-странице: - -1. `pop_music_init()` выделяет блок из одной страницы; -2. загружает туда первые 512 байт `MUS\MUSIC.IDX`; -3. проверяет magic, версию, размеры полей и формат PCM; -4. готовит страницу для безопасного временного отображения в W0; -5. сохраняет в W2 только номер блока/страницы и флаг готовности. - -Потеря 16 КБ EMM ради маленькой таблицы допустима: EMM у игры с запасом, а -W1/W2 — самый дефицитный ресурс. Не следует ради экономии страницы прятать -индекс в хвост `kid.ani` или звукового набора: это создаст ненужную связь -между независимыми ресурсами. - -Доступ к записи предоставляет банковая функция наподобие: - -```c -int8_t pop_music_info(uint8_t id, pop_music_info_t *out) __banked; -``` - -Она на короткое время отображает страницу IDX в W0, копирует четыре байта в -буфер вызывающего и сразу восстанавливает окно. Наружу указатель на EMM не -выдаётся. - -Индекс живёт до выхода из программы. `pop_music_free()`, который вызывается -между сценами, освобождать его не должен; для полного завершения нужен -отдельный shutdown либо освобождение в общем маршруте выхода. - -## 6. Изменения загрузчика музыки - -`pop_music_load_begin(id)` должен получать из runtime-индекса: - -- наличие трека; -- число блоков; -- вычисленное число EMM-страниц. - -Далее существующая архитектура почти не меняется: - -- `slot_blocks[]` уже хранит runtime-длину загруженного трека; -- `pop_mus_left` получает её при `play`/`stream`; -- насос сам останавливается на правильном блоке; -- `pop_music_busy()` автоматически отражает фактический конец; -- кольцевой проигрыватель получает правильные 82 страницы MT-32 m56 вместо - 78 страниц FLAC. - -При каждом открытии `mNN.bin` надо без дополнительного `open` проверить -фактический размер: - -1. `lseek(fd, 0, SEEK_END)`; -2. убедиться, что размер положительный и кратен 128; -3. сравнить его с `blocks * 128` из IDX; -4. вернуть позицию через `lseek(fd, 0, SEEK_SET)`. - -`lseek(SEEK_END)` уже реализован в libc поверх DSS `MOVE_FP $15` и -используется самой игрой для `POP.CFG`. - -Рекомендуемая политика несовпадения: - -- вывести диагностическое сообщение; -- считать фактический размер файла главным; -- пересчитать `blocks/pages/ticks60` в загруженной EMM-копии индекса; -- продолжить работу, если размер проходит ограничения. - -Так случайно забытый старый IDX не приведёт к чтению чужой EMM-страницы или -обрыву трека. При этом штатная поставка обязана всегда включать согласованные -IDX и PCM. - -## 7. Runtime-тики без 32-битного переполнения - -Если тики приходится восстанавливать из фактического размера, прямое -`blocks * 40` может переполнить `uint16_t`. Та же формула считается только -16-битной арифметикой: - -```c -ticks = (blocks / 57) * 40 - + ((blocks % 57) * 40 + 28) / 57; -``` - -Даже при `blocks == 65535` промежуточные значения остаются в `uint16_t`. -Это холодный путь, поэтому небольшая цена деления допустима. - -## 8. Перевод сценариев с compile-time на runtime - -### PV-сцена (`pop_intro.c`) - -Текущий большой `enum` смешивает два класса величин: - -- неизменные интервалы сценария; -- абсолютные точки, сдвигаемые длительностями m50 и m53. - -Надо сохранить относительные сценарные константы, а при входе в PV-сцену -один раз собрать локальную структуру `pv_timing_t`: - -```text -m50_end = MUS_2_START + ticks(m50) -wait_end = m50_end + 40 -... -dialog1_start = предыдущая фиксированная цепочка -exit_start = dialog1_start + ticks(m53) -anim_end = exit_start + 469 -``` - -Структуру лучше держать на стеке `intro_pv_animated()` и передавать нужным -helper-функциям указателем. File-scope изменяемая таблица снова попала бы в -W2. - -m50 уже загружен до начала PV. m53 начинает подгружаться задолго до своего -старта, поэтому метаданные обоих треков к моменту использования доступны. - -### Конец уровня (`pop_kid.c`) - -Вместо `POP_MUS_TICKS_32/41` редкое событие окончания уровня вызывает -банковый accessor IDX и вычисляет `pop_endmus_left` из runtime-тиков. - -Индекс используется даже при выключенной музыке: оригинал выдерживает эту -паузу молча. Поэтому нельзя заменять её одним `pop_music_busy()`. - -## 9. Генератор и сборка - -`tools/pop_pack_music.py` должен: - -1. как сейчас преобразовать выбранный набор в `mNN.bin`; -2. проверить кратность каждого результата 128 байтам; -3. собрать плотные записи 0..56; -4. записать `MUS/MUSIC.IDX` в формате `PMI1`; -5. больше не генерировать `pop_music_tbl.h` и `pop_music_ticks.h`. - -Makefile должен: - -- добавить `MUS/MUSIC.IDX` в `DISK` и staging; -- убрать музыкальные generated-header'ы из `GEN_H`; -- убрать их из зависимостей EXE; -- оставить `MUSIC_FMT` зависимостью только музыкальных ресурсов; -- гарантировать, что `make music-flac/mp3/ogg/mt32` заменяет и PCM, и IDX, - но не перелинковывает EXE. - -Критерий архитектуры: SHA/дата `sprpop.exe` не меняется при переключении -между четырьмя музыкальными целями. - -## 10. Ошибки и совместимость - -Игра не должна падать из-за необязательной музыки: - -- нет IDX — музыка отключена, игра продолжает работать; -- неверная magic/версия/формат — музыка отключена с диагностикой; -- записи нет — конкретный трек считается отсутствующим; -- файла нет — запрос трека завершается молча/с диагностикой, как сейчас; -- обычный трек требует больше 20 страниц — не загружать обычным путём; -- потоковый трек имеет больше 255 страниц — отвергнуть, потому что текущие - счётчики страниц восьмибитные; -- IDX и файл расходятся — применить политику §6; -- все файловые операции выполнять через `POP_PATH_CALL`, чтобы сохранить - работу на старых DSS с повреждением текущего каталога. - -Для отсутствующего/повреждённого IDX остаётся выбрать поведение немой паузы -конца уровня: нулевая пауза либо небольшой канонический fallback. Это не -мешает основной архитектуре, но решение надо принять до реализации. - -## 11. Этапы реализации - -### MI0 — формат и host-тест - -- вынести writer/reader `PMI1` в тестируемый код упаковщика; -- проверить magic, размеры, LE-поля, нулевые записи и padding; -- для всех четырёх наборов сверить `blocks/ticks` с фактическими PCM; -- зафиксировать тестом значения MT-32 m50/m53/m56 как отличающиеся от FLAC. - -### MI1 — runtime-загрузка IDX - -- `pop_music_init()`/shutdown; -- одна EMM-страница, загрузка и валидация; -- accessor одной записи; -- отказ без порчи W0/W3, EMM и файловых дескрипторов. - -### MI2 — loader/pump - -- заменить `pop_mus_tbl[]` runtime-записью; -- проверять реальный размер файла; -- обычный, немедленный и кольцевой пути должны использовать одну метаинформацию; -- удалить `pop_music_tbl.h`. - -### MI3 — runtime-шкала сцен - -- перевести m50/m53 в `pop_intro.c` на локальную runtime-шкалу; -- перевести m32/m41 в `pop_kid.c`; -- удалить `pop_music_ticks.h`. - -### MI4 — сборка и образы - -- добавить IDX в каждый музыкальный набор; -- исключить музыку из зависимостей линковки; -- собрать четыре HDD-варианта с одним EXE. - -### MI5 — приёмка в MAME/на железе - -- FLAC: title -> story -> PV, обычный конец уровня, конец уровня 4, ending; -- MT-32: те же маршруты, особенно m50/m53 и полный m56; -- музыка выключена: пауза конца уровня берётся из IDX; -- замена набора без пересборки EXE; -- повреждённый IDX, отсутствующий трек, несовпадающий размер; -- контроль, что не запущено более одного MAME и предыдущий экземпляр закрыт - перед новым прогоном. - -## 12. Критерии готовности - -- один бинарник запускается со всеми четырьмя наборами; -- ни один музыкальный generated-header не входит в сборку C; -- начало следующей сцены/уровня соответствует фактической записи; -- MT-32 m56 проигрывает все 82 страницы и не обрывается как FLAC-вариант; -- обычные треки не читают за пределами выделенного EMM-блока; -- IDX не расходует сотни байт W2; -- ошибочный набор отключает музыку безопасно; -- переключение `music-*` не меняет EXE; -- старые DSS продолжают работать через восстановление каталога приложения. - ---- - -# Часть II. Звуковые эффекты без перелинковки - -## 13. Цель и отличие от музыки - -Один и тот же `sprpop.exe` должен работать с разными наборами PCM-эффектов, -если в них сохранена исходная нумерация sound id 0..56. Замена набора должна -сводиться к замене согласованной пары `SND/snd.idx` + `SND/snd.arc`, без -генерации C-заголовка и перелинковки EXE. - -Набор состоит из двух согласованных файлов: - -- `SND/snd.arc` — обычный архив PBA1 с PCM-страницами; -- `SND/snd.idx` — описание раскладки эффектов внутри этих страниц. - -Отдельный IDX предпочтительнее расширения заголовка `snd.arc`: PBA1 остаётся -универсальным и не получает специального варианта только для звука, а -формат индекса можно независимо версионировать и проверять тем же способом, -что будущий `MUS/MUSIC.IDX`. - -Существующий формат записи менять не требуется: - -```c -typedef struct { - uint8_t page; - uint16_t off; - uint16_t len; -} pop_snd_ent_t; -``` - -Это ровно необходимые проигрывателю номер логической страницы, смещение в -ней и длина PCM. В текущем ABI SDCC/z80 запись занимает 5 байт; дисковый -формат обязан описывать эти пять байт явно (`uint16` little-endian), а код -должен проверять `sizeof(pop_snd_ent_t) == 5` на этапе сборки. - -## 14. Подтверждённое текущее состояние - -Сейчас `tools/pop_pack_sound.py` печатает раскладку в -`gen/pop_sound_tbl.h`, а `pop_sfx.c` включает её как -`static const pop_snd_tbl[57]`. Поэтому конкретные `page/off/len` становятся -частью EXE. - -В текущей сборке таблица занимает 285 байт в `_CODE`, по адресам -`0x52D8..0x53F4`. Это общий резидентный диапазон игры: при huge-модели -`_CODE`, `_DATA`, heap и stack совместно используют плоские 32 КБ -`0x4000..0xBFFF`; граница W1/W2 отдельного бюджета здесь не создаёт. - -Проверены оба имеющихся исходных набора DIGISND: - -| набор | PCM-эффектов | страниц после упаковки | отличия раскладки | -|---|---:|---:|---:| -| MSDOS 1.3/1.4 | 31 из 57 | 10 | эталон текущей сборки | -| SDLPoP 1.0/1.1 | 31 из 57 | 9 | отличаются 8 id | - -Максимальный эффект занимает 17 664 байта, или 138 блоков по 128 байт. -У SDLPoP эффект 48 содержит только 7 исходных сэмплов; это свойство самого -набора, а не ошибка runtime-индекса. - -## 15. Файл `SND/snd.idx` - -IDX занимает один 512-байтовый сектор и после короткого заголовка является -точным дисковым дампом 57 записей `pop_snd_tbl`: - -```text -0..3 "PSI1" magic и версия индекса эффектов -4 57 число плотных записей, id 0..56 -5 5 размер записи -6 7 log2 размера блока: 1 << 7 = 128 -7 1 формат: unsigned 8-bit mono, CBL_FREQ_10K9 -8 pages фактическое число PCM-страниц в snd.arc -9..15 0 резерв - -16..300 57 записей по 5 байт: - +0 uint8 page - +1..2 uint16 off, little-endian - +3..4 uint16 len, little-endian - -301..511 0 резерв до одного сектора -``` - -`pages` — фактический размер конкретного набора, например 10 для MSDOS или -9 для SDLPoP. Его не следует называть или трактовать как -`POP_SND_MAX_PAGES`: максимум 16 является compile-time-вместимостью -загрузчика, а IDX сообщает число реально нужных страниц и обязан укладываться -в этот предел. - -Загрузчик сверяет `pages` с числом элементов внешнего PBA1 и не доверяет -расходящимся файлам. `off` и `len` обязаны быть кратны 128; нулевая длина -означает отсутствие PCM для данного id. - -IDX загружается прямо в резидентный `pop_snd_tbl`, поэтому отдельной страницы -EMM для него не требуется. Цена решения — одно дополнительное открытие и -чтение 512 байт при старте звука; на фоне загрузки 9–10 страниц PCM это -приемлемый холодный расход. - -## 16. Размещение runtime-таблицы в памяти - -`pop_snd_tbl` становится обычным изменяемым внутренним объектом: - -```c -pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT]; -``` - -Его следует определить в отдельном internal data-модуле и объявить через -`extern` в `_pop_sfx.h`, потому что таблицу заполняет холодный загрузчик из -банка 8, а читает резидентный `pop_sfx.c`. - -После снятия `const` SDCC перенесёт эти 285 байт из `_CODE` в `_DATA`. Это -не добавляет 285 байт к общему резидентному расходу: `_CODE` одновременно -уменьшается на тот же размер, а `_CODE` и `_DATA` последовательно лежат в -одном диапазоне `0x4000..0xBFFF`. Возможна лишь небольшая разница из-за -выравнивания, которую надо проверить итоговой map-картой и size-check. - -Банк 8 может читать индекс напрямую в этот буфер: весь диапазон -`0x4000..0xBFFF` остаётся доступен, пока банковый код исполняется в W3. -Горячие обращения `pop_snd_tbl[id].page/off/len` и ISR не требуют новых -маппингов или accessor-функций. - -## 17. Фактическое число страниц - -Инвариантами программы остаются: - -```c -#define POP_SND_MAX_PAGES 16 -#define POP_SND_COUNT 57 -#define POP_SND_BLOCK 128 -``` - -`POP_SND_PAGES == 10` больше не должен означать размер конкретного набора. -Вместо него появляется runtime-состояние: - -```c -uint8_t pop_snd_pages; -uint8_t pop_snd_page[POP_SND_MAX_PAGES]; -``` - -Загрузчик выделяет `mem_alloc_pages(pop_snd_pages)` и заполняет только -фактическое число элементов массива. MSDOS-набор займёт 10 страниц, -SDLPoP-набор — 9. Предел 16 оставляет запас будущим наборам без -перекомпиляции и увеличивает постоянный массив лишь на 6 байт относительно -текущего; ещё один байт занимает `pop_snd_pages`. - -Насос при переходе длинного эффекта через границу страницы сравнивает -`sfx_pg + 1` с `pop_snd_pages`, а не с compile-time-константой. - -## 18. Загрузка и валидация - -`pop_sfx_init()` должен выполнять следующую последовательность: - -1. открыть `SND/snd.idx` через существующий путь `POP_PATH_CALL`; -2. прочитать 16-байтовый заголовок, затем 285 байт записей прямо в - `pop_snd_tbl`, и проверить полный размер IDX; -3. проверить magic, версию, число/размер записей, формат и размер блока; -4. получить из IDX фактическое число страниц и проверить диапазон 1..16; -5. открыть `SND/snd.arc` через `POP_PATH_CALL`; -6. прочитать обычную таблицу PBA1 с ёмкостью `POP_SND_MAX_PAGES`; -7. сверить `PSI1.pages` с числом элементов PBA1; -8. проверить каждую ненулевую запись; -9. только после этого выделить фактическое число EMM-страниц и загрузить их. - -Для каждой записи проверяются: - -- `page < pop_snd_pages`; -- `off < 16384` и `off % POP_SND_BLOCK == 0`; -- `len % POP_SND_BLOCK == 0`; -- диапазон `page/off/len` не выходит за загруженный набор; -- переход длинного эффекта на следующие страницы не превышает - `pop_snd_pages`. - -При любой ошибке блок EMM и файловый дескриптор освобождаются, таблица не -используется, эффекты остаются выключенными. Набор без `snd.idx` считается -неполным; хранить в EXE старую таблицу как fallback не следует, иначе -зависимость бинарника от конкретного набора останется. - -## 19. Генератор и сборка - -`tools/pop_pack_sound.py` должен: - -1. как сейчас разобрать DIGISND, привести PCM к CBL_FREQ_10K9 и выровнять - начала/длины на 128 байт; -2. вычислить фактическое число страниц и отвергнуть набор больше 16; -3. сформировать плотные 57 записей `page/off/len`; -4. записать `SND/snd.idx` в формате `PSI1`, включая фактическое число - страниц; -5. собрать обычный `SND/snd.arc` из полученных страниц; -6. больше не генерировать `gen/pop_sound_tbl.h`. - -Чтобы число страниц не было захардкожено списком `s0.bin`..`s9.bin` в -Makefile, упаковщик звука предпочтительно должен сразу формировать -`assets/packed/SND/snd.arc` либо передавать упаковщику архивов динамический -список результатов без сохранения устаревшей десятой страницы. - -Стабильные тип и константы переносятся в обычный internal-заголовок. EXE не -должен зависеть от результата упаковки звука: цель выбора набора меняет -согласованную пару `snd.idx` + `snd.arc`. - -## 20. Этапы реализации эффектов - -### SI0 — формат и host-тест - -- writer/reader отдельного `snd.idx` в формате `PSI1`; -- проверка точного пятибайтового LE-формата записи; -- сборка и разбор обоих имеющихся DIGISND-наборов; -- проверки 10 страниц MSDOS, 9 страниц SDLPoP и отличающихся записей. - -### SI1 — runtime-таблица - -- изменяемый `pop_snd_tbl` в общем резидентном CODE/DATA-диапазоне; -- загрузка и полная валидация `PSI1`; -- удаление generated `pop_sound_tbl.h`; -- проверка map-карты: перенос CODE -> DATA не должен съесть heap. - -### SI2 — гибкое выделение страниц - -- `POP_SND_MAX_PAGES == 16` и runtime `pop_snd_pages`; -- фактический размер стека таблицы PBA1; -- выделение/освобождение 9, 10 и тестовых 16 страниц; -- runtime-гард перехода длинного эффекта между страницами. - -### SI3 — сборка без перелинковки - -- убрать фиксированный `SND_ATL` из десяти имён; -- сделать `snd.idx` и `snd.arc` согласованными результатами выбора набора; -- проверить неизменность SHA/даты `sprpop.exe` при смене набора. - -### SI4 — приёмка - -- проиграть короткий, обычный и переходящий страницу эффекты; -- проверить приоритеты и перебивание звуков; -- проверить музыку поверх общего CBL после runtime-загрузки эффектов; -- отсутствующий IDX и повреждённые magic/count/pages/page/off/len должны - безопасно отключать эффекты; -- перед каждым MAME-прогоном завершать предыдущий экземпляр и никогда не - запускать две копии одновременно. - -## 21. Критерии готовности эффектов - -- один `sprpop.exe` работает с MSDOS- и SDLPoP-наборами; -- замена согласованной пары `SND/snd.idx` + `SND/snd.arc` не требует - компиляции C и не меняет EXE; -- `pop_snd_tbl` больше не генерируется как C-код; -- загружается фактическое число страниц в диапазоне 1..16; -- таблица не расходует дополнительную страницу EMM и не увеличивает - суммарный резидентный CODE+DATA на свои 285 байт; -- горячий путь и ISR используют прежние прямые `page/off/len`; -- повреждённый индекс не приводит к чтению за пределами EMM-блока; -- файловые операции сохраняют совместимость со старыми DSS через - восстановление каталога приложения. diff --git a/applications/SprPoP/docs/palette_plan.md b/applications/SprPoP/docs/palette_plan.md deleted file mode 100644 index f25e914..0000000 --- a/applications/SprPoP/docs/palette_plan.md +++ /dev/null @@ -1,297 +0,0 @@ -# План: консолидация работы с палитрами + переход уровня через fade - -Статус: **этапы A и B реализованы; визуальная приёмка полного маршрута ещё -идёт** (2026-08-24). Палитры выделены в bank 10, а renderer cutscene/intro — -в bank 11, чтобы не переполнять bank 9 оболочки. -Обсуждение велось вокруг `SprPoP/` (банк 9 — оболочка, fade из `pop_ui.c`). - ---- - -## 1. Текущее состояние: карта палитры - -Палитра Sprinter — 256 записей по 4 байта (B, G, R, 0) = 1 КБ на страницу. -У страниц дабл-буфера ДВЕ раздельные палитры (`gfx_pal_load(0,…)` и -`gfx_pal_load(1,…)` — почти всегда парой). BIOS читает буферы только из -#4000–#BFFF: банковую rodata напрямую отдавать нельзя (копия в стек/W2), -см. грабли `pop_guard_set_palette` и `bg_load_tile_pal`. - -### 1.1 Игровая палитра `KID\kid.pal` — раскладка слотов - -Собирается `toolchain/pop_pack_kid.py build_palette()`, грузится одним -`gfx_pal_fload` (перезаписывает все 256 записей). Атласы запекались под эти -индексы — менять раскладку нельзя без перепаковки ассетов. - -| Слоты | Назначение | Источник | Динамика | -|---|---|---|---| -| 0x00 | Цвет фона + **вспышка молнии** (подмена записи 0, `flash_bg` ← do_flash/set_bg_attr SDLPoP) | — | меняется в игре | -| 0x01–0x2F | Не закреплены (нули) | — | свободно | -| 0x30–0x3F | VGA16 — базовые 16 цветов для mono-блитов: пламя факелов, пузырьки зелья (+12 красный «лечение», +10 зелёный, +9 синий), кровь чомпера (12), дворцовая кладка mono (+6) | `VGA16[]` | статично | -| ↳ 0x37–0x3F | Поддиапазон **UI**: текст/рамка меню; единственное, что `keep_ui` не затемняет (`MENU_BORDER`=0x37) | — | — | -| 0x40–0x4F | chtab_1 пламя/зелья (`POT_PAL_BASE`) | VDUNGEON res150.pal | статично | -| 0x50–0x5F | **ENV фон тайлсета** (`POP_PAL_ENV`) | res200.pal набора | **меняется при смене тайлсета** | -| 0x60–0x6F | **WALL тайлсета** (`POP_PAL_WALL`) | res360.pal набора | **меняется при смене тайлсета** | -| 0x70–0x7F | Kid (`PAL_BASE`) | KID res400.pal | статично | -| 0x80–0x8F | Меч chtab_0 (`SWORD_PAL_BASE`) | POT res700.pal | статично | -| 0x90–0x9F | Страж chtab_5 (`GUARD_PAL_BASE`) | res10.bin guard_palettes | **меняется по КОМНАТАМ** | -| 0xA0–0xAF | Тень (`POP_SHADOW_PAL_BASE`) | RGB-сетка pop_pack_shadow.py | статично | -| 0xB0–0xFF | Свободны (5 слотов) | — | — | - -Итого динамических зон три: запись 0 (молния), env+wall (тип здания), -стражи (per-room). Всё остальное одинаково всю игру. - -### 1.2 Полноэкранные палитры заставок - -Каждая перезаписывает ВСЕ 256 записей: - -| Файл | Где используется | -|---|---| -| `KID\kid.pal` (+ fallback `a:\kid.pal`) | BOOT и возврат в игру после заставок | -| `TITLE\title.pal` | экран TITLE | -| `PV\story.pal` | INTRO и HALL_OF_FAME (одна палитра на обе фазы) | - -### 1.3 Тайлсеты: подземелье ↔ дворец - -Оба набора используют ОДНИ И ТЕ ЖЕ слоты 0x50–0x5F/0x60–0x6F, заполняя их -разными цветами (атласы обоих наборов запекались под эти индексы). -Переключение = загрузка 64 байт (32 записи env+wall) в обе страницы -(`bg_load_tile_pal`); остальные 224 записи не трогаются. - -Какие уровни дворец — `tbl_level_type` (`pop_level_cold.c:44`): -**4, 5, 6, 10, 11, 14**; остальные подземелье. - -Палитра дворца `pal_tile.pal` (расшифровка, формат записи B,G,R): - -ENV 0x50–0x5F (пол, ковры, факелы, ворота, пики, арки): - -| Слот | RGB | | Слот | RGB | -|---|---|---|---|---| -| 50 | 0,0,0 чёрный | | 58 | 202,190,178 серо-бежевый | -| 51 | 121,89,60 коричневый | | 59 | 153,133,129 серо-лиловый | -| 52 | 161,121,76 светло-коричневый | | 5A | 76,64,56 тёмный серо-бурый | -| 53 | 194,149,89 песочный | | 5B | 153,97,89 кирпично-красный | -| 54 | 230,178,113 яркий песок | | 5C | 137,80,72 тёмный кирпич | -| 55 | 246,202,125 кремовый | | 5D | 48,125,125 бирюзовый | -| 56 | 255,234,170 бледно-кремовый | | 5E | 12,56,89 тёмно-синий | -| 57 | 255,255,255 белый | | 5F | 202,56,28 красно-оранжевый | - -WALL 0x60–0x6F (вся палитра песочная): 61=(218,170,89), 62=(226,165,93), -63=(226,170,97), 64=(218,161,85), 65=белый, 66=(226,165,93), 67=(218,165,89), -68=(226,170,89), 69=(218,170,97), 6A=(255,210,137), 6B=(255,218,149), -6C=(255,210,137), 6D=(255,218,145), 6E=(194,153,80 тёмный песок), -6F=(238,186,117). - -Чем рисуется во дворце: -- **Тело стены — НЕ спрайты**, а сплошные заливки; цвет разыгрывается на - комнату prandom'ом (`gen_palace_wall_colors`, `pop_bg.c:140`, порт - seg000:1942): подряды 1 и 3 берут случайный из 0x61–0x64, подряды 0 и 2 — - из 0x66–0x69; соседи по горизонтали не повторяются. -- Декор стен id 3–17 — mono-силуэт цветом VGA16+6 (0x36). -- Верх дверных проёмов дворца — спец-id 78–84 + полоса 145 («полоса под - окнами», pop_room.c:478). -- Остальное (пол, ковры, порталы-факелы, ворота, пики) — env-куски - pal_env*.atl с ENV-таблицей выше. - -### 1.4 Стражи (0x90–0x9F) - -Цвет задаётся на КОМНАТУ (`level.guards_color[room-1]`), при входе в -комнату зовётся `pop_guard_set_palette(color)` ДО отрисовки (слоты общие -на экран — смена посреди кадра дала бы стража в новой палитре с полосой HP -в старой). Только для обычных стражей (`tbl_guard_type == 0`): скелет и -Джафар имеют собственную палитру, зашитую в kid.pal; им зовётся с color=0 -(не трогать — иначе Джафар на ур.13 покрасился бы в цвет стража своей -комнаты). Внутри одного уровня слоты могут перезаписываться многократно. - -## 2. Текущее состояние: механика fade - -### 2.1 Наша реализация (`pop_ui.c`, банк 9) - -- `pop_ui_palette_snapshot()` — снимок всех 256 записей через - `gfx_pal_get` по 4 чанкам × 64; хранится в хвосте страницы шрифта - FONT.ATL ([0x3C00,0x4000)), map/unmap W0. Требует `font_ready`. -- `pop_ui_palette_dim(step, keep_ui)` — готовит ОБЕ экранные палитры из - снимка. Шкала без умножений (только сдвиги): - -| Шаг | Формула на канал | Яркость | -|---|---|---| -| 0 | x | оригинал | -| 1 | `(x>>1)+(x>>2)` | ≈3/4 | -| 2 | `x>>1` | 1/2 | -| 3 | `x>>2` | 1/4 | -| 4 | 0 | чёрный | - - `keep_ui` пропускает 0x37–0x3F (меню остаётся ярким). -- `pop_ui_fade_out/in(steps)` — проигрывание ступеней за `steps` кадров - vsync (`step = i*4/steps`, целочисленно): steps=4 — канонический (по кадру - на ступень), steps<4 — перескакивает ступени, steps>4 — повторяет (плавнее), - steps=0 у fade_in — мгновенный restore. -- Контракт map/unmap: обращения к EMM/W0 и BIOS-палитре строго после unmap. - -Стоимость одного dim ≈ 15–25 тыс. тактов (~4–7 мс при 3.5 МГц) — -укладывается в кадр vsync, на практике лагов нет. - -### 2.2 Как сделано в SDLPoP (seg009.c, USE_FADE/gmMcgaVga) - -- fade_out: каждый кадр КАЖДЫЙ ненулевой канал каждой записи −1; до нуля. -- fade_in: `fade_pos` от 0x40 вниз; канал +1, пока меньше оригинала. -- Уровней затемнения до 63–64 (VGA-канал 6 бит), полный фейд ~63 кадра × - wait_time=2 тика — медленно и кинематографично. -- `which_rows` — битовая маска групп по 16 записей: можно фейдить часть - палитры (в оригинале используется). -- По завершении принудительно восстанавливается оригинал; после out экран - заливается чёрным. - -Это осознанное расхождение (скорость/такты vs плавность) — ЗАПИСАТЬ в -`docs/impl_diff.md` (сейчас записи нет). - -## 3. Зафиксированные решения - -1. **Ступени затемнения: остаются 4.** Вариант 8 ступеней той же сдвиговой - техникой — рассмотреть отдельно, сейчас не внедрять. -2. **Предрасчёт fade-вариантов палитры отклонён.** Аргументы: чтение файла - с диска на порядок дороже вычисления; 3–7 КБ постоянной RAM при - MEMORY=small непозволительны; предрасчёт привязан к конкретным палитрам, - а снимок работает с любой текущей автоматически; keep_ui удвоил бы набор. -3. **Считать на лету**, хранить один снимок (уже есть, бесплатно в хвосте - страницы шрифта). -4. **Буферы на стеке**, не статика (W1/W2 мало) и не 1 КБ: обнулить 64/256 - байт дешевле, чем держать килобайт резидентно. -5. **Контракт `gfx_pal_load(pal, start, count, data)`**: count — число - СЛОТОВ, буфер обязан быть `count*4` байт; count=0 означает «все 256». -6. **Leaf-applеры остаются на месте** (`pop_bg_pal_apply` — банк 7 со своими - таблицами, `pop_shadow_pal_apply`, `pop_guard_set_palette`): банковая - rodata чужого банка не видна, перенос сломал бы доступ к данным. -7. **Молния (`flash_bg` в sprpop.c) не переносится** — игровой эффект - записи 0; после вспышки восстановление записи 0 из снимка ложится на API. -8. Модель состояния: разделены «какая палитра логически загружена» (load_*) - и «с какой яркостью показана» (apply/fade). Любой load_* обновляет снимок; - apply/fade показывает его с нужной глубиной. Это позволяет грузить новую - палитру «в темноте» (экран остаётся чёрным, пока не позвали apply/fade_in). - -## 4. Целевой API `pop_pal.c/.h` (банк 9) - -```c -/* сброс */ -void pop_pal_black(void) __banked; -/* все 256 записей ОБЕИХ страниц = 0. Стековый buf[256], обнуление циклом, - * 8 вызовов gfx_pal_load (4 чанка × 2 страницы, паттерн как в dim). - * Зовётся СРАЗУ ПОСЛЕ initgraph в pop_boot (раньше нельзя — нет гарантий - * состояния графического режима): закрывает кейс «мусор/палитра предыдущей - * программы при включении графики». СНИМОК НЕ ТРОГАЕТ (контракт: - * чёрный экран без изменения логической палитры). */ - -/* загрузка (пишет полную палитру в обе страницы + refresh снимка; - * видимую яркость НЕ трогают — экран меняется только по apply/fade) */ -void pop_pal_file_load(const char *name) __banked; -/* gfx_pal_fload + fallback "a:\" + gfx_pal_sync (fallback сегодня - * скопирован в каждом из ~6 мест вызова) */ - -void pop_pal_game_load(void) __banked; -/* file_load("KID\kid.pal") + pop_bg_pal_apply + pop_shadow_pal_apply. - * Сегодня тройка скопирована 3 раза (sprpop_cold ~958, pop_title ~88, - * pop_intro ~183). Единое место инварианта «kid.pal затирает слоты - * тайлсета 0x50..0x6F и тени 0xA0..0xAF». */ - -void pop_pal_level_load(uint8_t full) __banked; -/* палитра уровня: kid.pal/shadow + tileset 0x50..0x6F если набор сменился - * (сравнение через pop_level_type()). full=1 — ПРИНУДИТЕЛЬНО перечитать - * kid.pal/shadow (один экспорт с флагом, не две функции — меньше банковых - * точек входа). СТРАЖЕЙ (0x90..0x9F) НЕ включает: это компетенция входа - * в комнату (pop_guard_set_palette до первого draw). */ - -void pop_pal_story_load(void) __banked; /* PV\story.pal (INTRO и HOF — файл один, функция одна) */ -void pop_pal_title_load(void) __banked; /* TITLE\title.pal */ - -/* отображение */ -void pop_pal_snapshot(void) __banked; /* переезд из pop_ui, тело то же */ -void pop_pal_apply(uint8_t fade) __banked; /* = dim(fade, 0), 0..4 */ -void pop_pal_fade_in(uint8_t steps) __banked; /* переезд из pop_ui */ -void pop_pal_fade_out(uint8_t steps) __banked; - -/* меню продолжает звать низкоуровневый dim(step, keep_ui=1) — отдельный - * тонкий экспорт, чтобы не тащить флаг в горячий apply. Старые имена - * pop_ui_palette_* / pop_ui_fade_* УДАЛЯЮТСЯ (без алиасов — меньше - * экспорта банка). */ -``` - -Соответствие старое→новое: snapshot→snapshot, restore→apply(0), -fade_out/in→fade_out/in, тройка kid.pal×3→game_load, fload+fallback+sync×6→file_load. - -## 5. Этап A: рефакторинг — выполнен (2026-08-24) - -1. Создан `src/pop_pal.c/.h` в **bank 10**, добавлен в Makefile. - Он владеет политикой `load logical palette → snapshot → apply brightness`. - Низкоуровневые snapshot/dim/fade остаются физически в `pop_ui.c`: там - владелец страницы FONT.ATL, где лежит снимок; наружу они доступны только - через `pop_pal`. -2. Заменены call-sites: - - `sprpop_cold.c` ~958: black → game_load вместо тройки; - - `pop_title.c` title_restore_game_palette → game_load; загрузка title.pal → title_load; - - `pop_intro.c` intro_load/intro_restore → story_load/game_load; - - `pop_hof.c` (2 × story.pal) → story_load; - - `pop_menu.c`: fade/dim → новые имена (dim с keep_ui — низкоуровневый экспорт); - - `sprpop.c` demo-start (snapshot+dim(4,0)+fade_in(4)) → новый API. -3. Старые вызовы не остаются в коде приложения; внутренние функции `pop_ui` - сохранены как реализации одного владельца памяти снимка. -4. Сборка и host-тесты пройдены. `make size-check` неприменим: меняется - приложение, а не libc/libbgi. -5. MAME smoke-тест полного цикла смен палитр: boot → title (title.pal + - fade) → intro (story/kid) → demo fade-in → игра → HOF (story.pal). - Проверить: отсутствие мусора при включении графики (эффект black), - меню с keep_ui остаётся ярким при затемнении, молния (запись 0) - восстанавливается. - -## 6. Этап B: переход уровня через fade — реализован, ждёт визуальной приёмки - -Сценарий (обсуждён, детали уточнить по SDLPoP перед реализацией — как -оригинал делает смену уровня, есть ли там fade в DOS-версии): - -``` -fade_out // последний кадр уровня N темнеет -рисуем комнату 1 уровня N+1 // во ВТОРУЮ страницу, в темноте -pop_pal_level_load(full=0) // новая палитра: железо+снимок обновлены, - // экран всё ещё чёрный -флип + копия второй страницы обратно в первую -fade_in // = анимированный apply 3→2→1→0 -``` - -Экономия: реально переезжают только 32 записи (env/wall) при смене набора -dungeon↔palace; guards_color обновит вход в комнату. Kid/shadow не меняются -— потому full=0. - -Реализация находится в `sprpop.c` / `sprpop_cold.c`: последний кадр -уровня N темнеет, `pop_level_switch()` подготавливает первый кадр N+1 и -обновляет логический источник через `pop_pal_level_load(1)`, затем главный -цикл показывает кадр только через fade-in. Восемь ступеней и отдельная -анимация смерти не входят в этот этап. - -**Этап B закрывает два открытых бага** (разборы — `BUGS_OPEN.md`): -- [PAL-L1-AFTER-INTRO] — вход в игру на уровень 1 после интро с чёрным - экраном (маршрут demo_new_game; корень не установлен, воспроизведение - нестабильно); -- [PAL-DUNGEON-STALE] — переход 3→4 оставляет подземную палитру (корень - ясен: fade_in восстанавливает из снимка, снятого ДО загрузки тайлсета - дворца; быстрый фикс `fade_in_pending` 2026-08-23 сам же и проявляет этот - дефект модели). - -Быстрый фикс 2026-08-23 (маршрут CUTSCENE → LEVEL_LOAD → PLAYING, -`fade_in_pending` + `pop_ui_fade_in(4)` после `pop_level_switch`) закрыл -чёрный экран на переходах с pre-cutscene внутри подземелья (1→2), но модель -«кто и когда меняет яркость» остаётся разношёрстной — её и приводит в -порядок этап B. - -## 7. Этап C: документирование - -- Запись в `docs/impl_diff.md`: наши 4 ступени vs SDLPoP ~64 (что делает - оригинал, что делаем мы — сдвиговая шкала ради тактов, чем платим — - грубее градации, что проверять при регрессе). -- После этапа B — дополнить запись про сам переход. - -## 8. Не трогаем - -- Молнию (`flash_bg`, sprpop.c) — включая обход SDCC-бага - `gfx_pal_set(0,0,0,0,0)` → ручные `gfx_pal_set(0/1, 0, r,g,b)`; -- leaf-applеры: `pop_bg_pal_apply` (банк 7), `pop_shadow_pal_apply`, - `pop_guard_set_palette` (данные своих модулей); -- хранилище снимка в хвосте страницы шрифта FONT.ATL (бесплатное место, - guard `font_ready`); -- раскладку слотов 0x00–0xAF (зафиксирована атласами). diff --git a/applications/SprPoP/docs/perf_backlog.md b/applications/SprPoP/docs/perf_backlog.md deleted file mode 100644 index d522c7d..0000000 --- a/applications/SprPoP/docs/perf_backlog.md +++ /dev/null @@ -1,335 +0,0 @@ -# Оптимизация отрисовки — что НЕ сделано (замеры на 2026-08-10) - -Список отложенных идей с измеренной ценой. Всё измерено брейкпоинтами в -MAME (`z80_profiling_method`) на роомтесте, уровень 1 комната 1. - -Прежде чем брать что-то отсюда — перечитать «Как мерить» ниже: половина -прошлых гипотез не подтвердилась, и подтвердились не те, что казались -очевидными. - -## Как мерить (иначе цифры не сходятся) - -- **Такт `totalcycles` ≠ номинальный T-такт Z80.** У ОЗУ Sprinter - wait-state'ы, замеренная стоимость ≈ **2,4× справочной** (`get_tile`: 574 - против 1 422). Считать по таблице тактов нельзя. Подробности — - memory `sprinter_wait_states_2x`. -- **Растровый кадр = 430 000 тактов.** Главный цикл спейсится тремя - `gfx_wait_vsync`, поэтому работа сверх 430 000 стоит СРАЗУ целый лишний - кадр. Граница дискретная: 3 растровых кадра на логический или 4. -- **Адреса символов меняются после КАЖДОЙ пересборки** (`sprpop.map`, - `bank*_*.sym`). Маркер со старым адресом молча не срабатывает, и разбивка - выглядит правдоподобно, но врёт. -- **Сцена между сессиями не воспроизводится точно**: позиция Кида до - пикселя, состояние плиты (2,6), фаза факелов. Сравнивать «до/после» можно - только по ОДНОЙ функции с одинаковыми входами, а не по общей работе за - кадр. -- Кто делит: брейкпоинт на `__divsint`/`__divuint`/`__divuchar` с печатью - адреса возврата — `bpset ,1,{printf "ret=%04X\n",w@(sp); g}`. Если - адрес возврата в банке (>= 0xC000), поставить тот же брейкпоинт с условием - `w@(sp)==<адрес>` и БЕЗ `g`: машина встанет с нужным банком в окне, и - `dasm` покажет вызывающего. -- **Брейкпоинт по адресу в банке ловит ВСЕ банки.** 0xC000..0xFFFF — общее - окно, и один и тот же адрес есть у семи модулей сразу. Либо ловить через - трамплин (`hl==<адрес>&&(de&0xff)==<банк>`), либо перепроверять, что - срабатывания идут из нужной фазы: иначе в интервал попадает чужой код и - цифры врут (так я намерил несуществующие 134 730 тактов в прологе - `pop_char_fore`). -- Трасса вызовов графики с параметрами: скрипт в истории сессии, ставит - маркеры фаз на трамплин `___sdcc_bcall_ehl` (условие `hl==<адрес>&&(de&0xff)==<банк>`) - и брейкпоинты на листья libbgi с печатью аргументов - (`__sdcccall(1)`: arg1 = HL, arg2 = DE, дальше стек с sp+2). - -## Профиль на 2026-08-10 - -Сцена: комната 1, два факела, стража нет. - -| сцена | работа за кадр | период | -|---|---|---| -| Кид в покое, факел не задет (пропуск работает) | 244 026 (57 %) | 3 кадра | -| Кид стоит на факеле (перерисовывается каждый кадр) | 366 240 (85 %) | 3 кадра | -| Кид в щебне (2,4), движется | ~357 000 (83 %) | 3 кадра | -| Кид (0,5) в движении | 421 254 (98 %) | **4 кадра** | - -Одна перерисовка персонажа = **~137 000 тактов = 32 % растрового кадра**, -из них полезной работы (heal 20×19 + спрайт 12×41) — меньше трети. - -## Профиль дворца (уровень 4) на 2026-08-10 - -Сцена: уровень 4, Кид НЕПОДВИЖНО стоит на (1,7) (комната с решёткой), -стража нет. Разбивка одного логического кадра брейкпоинтами на границах -фаз (адреса `PROF()` из `sprpop.lst` + базы `_CODE = 0x42AD`): - -| фаза | тактов | доля работы | -|---|---:|---:| -| ввод + читы + heal | 59 340 | 11 % | -| логика (kid_tick, phys_tick, страж, боёвка) | 85 356 | 16 % | -| `pop_loose_tick` | 27 396 | 5 % | -| `pop_process_trobs` | 106 107 | 21 % | -| `pop_redraw_needed` | 447 | — | -| шов / смена уровня / вспышка | 5 448 | 1 % | -| `guard_over_kid` + `pop_char_skip_mask` | 4 788 | 1 % | -| `pop_char_draw(KID)` | 52 206 | 10 % | -| соперник + `loose_mob_draw_over` + `hp_draw` | 4 086 | 1 % | -| **`pop_char_fore(KID)`** | **171 693** | **33 %** | -| `pop_room_clip_borders` + прочее | 742 | — | -| **ИТОГО работа** | **517 609** | 120 % растрового кадра → период **4 кадра** | - -По цветам бордюра: синий (`PROF(2)`) 144 696 (28 %), зелёный (`PROF(4)`) -139 398 (27 %), циан (`PROF(6)`) 233 515 (45 % работы = 54 % растрового -кадра, начинается на 74 % первого кадра и кончается на 123 %). - -## СДЕЛАНО 2026-08-10: метка «фон трогали» стала маской ТАЙЛОВ - -Было: один union-прямоугольник на страницу. Три факела трогают по пятну -16x18 в колонках 1, 6 и 8, а их объединение — полоса `x 40..280` на всю -комнату; Кид, стоящий где угодно между крайними факелами, в неё попадал и -перерисовывался каждый кадр со всем fore-проходом. - -Стало: `uint16_t pop_cd_dmask[2][3]` — бит на колонку, слово на ряд, набор на -страницу. Колонка берётся сдвигом (`x >> 5`), ряд — цепочкой сравнений; -проверка в `cd_quiet` — три `AND` через резидентный `pop_cd_hit`. - -Гранулярность тайла — это гранулярность ОРИГИНАЛА: пометки там тоже по -тайлам (`redraw_frames_anim[tilepos]`, `set_wipe`), персонажи привязаны к -тайлу через `tile_object_redraw[tilepos]`, а единственное подтайловое -уточнение (`wipe_heights`) — по высоте, не по ширине. Полутайл (16 px) не дал -бы ничего: пламя рисуется с отступом 8 px и шириной 16, то есть занимает -середину тайла и задевает обе половины. - -Замер на той же сцене, где снимался профиль ниже (Кид неподвижно на (1,7)): - -| | было | стало | -|---|---:|---:| -| циан (спрайты + fore) | 233 515 | **24 781** | -| работа за кадр | 517 609 | **306 553** | -| период | 4 растровых кадра | **3** | - ---- - -## СДЕЛАНО 2026-08-10: деление в луче видимости стража (Кид у шва) - -`tile_at_kid` (`guards.c`) считала колонку честным `/` и `%`, тогда как везде -уже стоит резидентная таблица `POP_TILE_DIV` (это и есть `tile_div_tbl` -оригинала). У SDCC z80 это `__divsint` плюс `__modsint`, а тот внутри снова -зовёт `__divsint` — ~5 400 тактов на вызов. - -Зовут её В ЦИКЛЕ по колонкам между стражем и Кидом -(`check_can_guard_see_kid`, seg003:761). Когда Кид стоит У ШВА, его -`curr_col = −1`, луч тянется через всю комнату, и за кадр набегало ВОСЕМЬ пар -делений — около 43 000 тактов, 10 % растрового кадра, в фазе ЛОГИКИ. - -Замер: брейкпоинт на `__divsint` с печатью адреса возврата дал `ret=C033` -восемь раз за кадр; остановка на нём и дизассемблирование с правильным банком -показали `HL−65`, `ld de,#14`, `call __divsint` по смещению 0x24 банка 1 — -`tile_at_kid`. После фикса пар `C033` не остаётся ни одной. - -**Заодно снята ложная тревога.** В прошлом замере я записал, что на шве -пролог `pop_char_fore` разбухает до 134 730 тактов. Это была ошибка зонда: -брейкпоинт на `fore_tile` стоял по адресу, который совпадает с кодом ДРУГИХ -банков, и в интервал попадали чужие срабатывания. Чистый замер (Кид в -колонке 0, спрайт свисает за левый край, окно `x −8..5`): пролог **16 950** — -ровно как в середине комнаты, весь fore-проход 41 803, `pop_room_clip_borders` -14 364. Урок в «Как мерить» выше: адрес в банке нужно либо проверять на -уникальность, либо ловить через трамплин с условием на банк. - ---- - -## 0. Дворцовая кладка в fore-проходе — **СДЕЛАНО 2026-08-10** - -Все три шага выполнены; замер после — в конце пункта. Ниже сохранён исходный -разбор: он объясняет, почему предфильтра `fore_tile` мало и откуда взялись -габариты кусков. - -**Было: 139 863 такта за кадр (32 % растрового кадра), полезных пикселей — -ровно ноль.** - -Замер (уровень 4, Кид на (1,7)). Окно fore-клипа в этот момент — -`x 229..241, y 106..147` (прочитано из `pop_t_fclip_*` брейкпоинтом). -`pop_fore_over_char` обходит 6 тайлов: - -| тайл | тактов | -|---|---:| -| (0,6) (0,7) (1,6) (1,7) | 2 800 – 4 600 каждый | -| **(2,6) — стена** | **74 310** | -| **(2,7) — стена** | **65 553** | - -Ряд 2 этой комнаты — стена, и он лежит ПОД ногами Кида, то есть попадает в -его fore-окно всегда. Внутри одного тайла стены `wall_pattern_palace` -делает 6 × `wpp_fill` (≈ 3 100 каждый) + 5 × `pop_wall_b` (≈ 9 760 каждый) -≈ 60 000 тактов. - -Ни один кусок в окно не попадает: -- верхняя заливка стоит на `dmy - 59 = 157`, окно кончается на `y = 147`; - все остальные куски ещё ниже; -- тайл (2,6) занимает `x 192..223`, окно начинается с `x = 229` — он - промахивается и по горизонтали тоже. - -Тайл всё равно проходит, потому что предфильтр в `fore_tile` (pop_bg.c, -`x0 < fclip_x1 && x0 + 40 > fclip_x0 && y0 - 8 < fclip_y1 && y0 + 70 > -fclip_y0`) намеренно грубый — габарит 40×78 на тайл. Дальше `wpp_fill` -честно режет по окну и выходит с пустым прямоугольником, но 3 100 тактов на -арифметику клипа уже потрачены, а `pop_wall_b` о существовании окна не знает -вовсе: он идёт в `atlas_image` + `gfx_w0_map`, читает `w`/`h` и только там -обнаруживает, что рисовать нечего. - -Что делать (по возрастанию объёма): -1. **Ранний выход из `wall_pattern_palace`**: самый верхний пиксель узора — - `dmy - 59`, самый нижний — `dby + высота нижнего декаля`. Один - `if (pop_t_fclip_on && (fclip_y1 <= dmy - 59 || fclip_y0 > dby + h)) - return;` плюс такая же проверка по `x` убивает оба тайла целиком почти - даром. -2. Прогнать `pop_wall_b` в этом узоре через ту же проверку окна, что уже - есть у `wpp_fill` (нужны размеры кусков — см. п. 2 ниже, «размеры из - каталога атласа»). -3. Сузить сам предфильтр `fore_tile` до реального габарита узора вместо - 40×78 — тогда лечится не только дворец. - -Порядок в подземелье тот же, но дешевле: `wall_pattern` в подземелье делает -до 3 блитов и ни одной заливки (~29 000 на тайл против ~60 000). Это же -объясняет, почему после перехода на дворцовый тайлсет период вырос. - -Сверено с SDLPoP (`seg008.c:1943 wall_pattern`, ветка -`!is_dungeon && GRAPHICS_VGA`): состав узора у нас дословный — 5 -`add_wipetable` + 4 декаля + нижняя заливка + нижний декаль. Расходимся не -составом, а тем, что оригинал складывает всё в `foretable` и рисует одним -`draw_table()`, у которого «посетить тайл» стоит копейки (см. п. 6). - -### Что сделано и сколько дало - -1. **Ранний выход** из `wall_pattern_palace` по окну fore-клипа (узор целиком - в `x [xh*8, xh*8+32)`, `y [dmy−59, dby]`). -2. **Отсев каждого декаля** (`wp_blit`) по реальному габариту вместо - заведомо большего 64×64 в `pop_blit_b`. Размеры сняты из каталогов - атласов: `pal_wall.atl` — группы 3..5 = 8×7, 6..8 и 9..11 = 32×12, - 12..14 = 30×5, 15..17 = 32×3. -3. **То же для ПОДЗЕМЕЛЬЯ**: ранний выход `wall_pattern` (габарит там выше — - левая марка уходит на `dby+POP_YOFF−67`) плюс `wp_blit` на RNDBLOCK - (32×21), обоих разделителях (9×21) и обеих марках (`pop_wall.atl`: - 16/17 = 7×10, 14/15 = 14×5). - -Замер: уровень 4, комната 18, Кид сдвигается читом `]` по пикселю (skip -выключен, идёт полный путь), в fore-окне ШЕСТЬ тайлов, ТРИ из них — -дворцовая стена. - -| участок | тактов | -|---|---:| -| пролог `pop_char_fore` до первого `fore_tile` | 17 208 | -| обычный тайл | 4 000 – 4 600 | -| **тайл стены (было 60 000 – 74 000)** | **~12 700** | -| хвост + чистка бортов | 6 055 | -| **fore-проход целиком (было 171 693)** | **70 681** | - -Кадр целиком в этой сцене: работа **419 839**, период **3** растровых кадра -(было 517 609 и 4). - -Остаток в проходе — пролог 17 208, это уже пункт 1 ниже (футпринт из физики). -Отдельная находка: когда Кид стоит НА ШВЕ (окно `x −8..5`), пролог разбухает -до **134 730** — 86 % прохода; причина не разобрана, см. пункт 1. - ---- - -## 1. Футпринт персонажа — брать из физики, а не считать заново - -**Цена: 11 574 такта на каждый fore-проход** (от входа в `char_footprint` до -первого `fore_tile`). - -`redraw_at_char` (seg003:0430) берёт ГОТОВЫЕ `char_col_left/right`, -`char_top_row`, `char_bottom_row` — их в этом же кадре посчитала физика -(`set_char_collision`, seg006:0723). У нас `char_footprint` (pop_bg.c) -считает их заново внутри fore-прохода. - -Мешает то, что физика (банк 3) держит их в статиках, а слой фона — банк 2. -Надо опубликовать их так же, как уже опубликованы `pop_cd[who].fpx/fpy/fpw/fph`. - -**Заодно:** оригинал расширяет футпринт ТОЛЬКО на одну колонку при вынутом -мече и объединяет с футпринтом ПРОШЛОГО кадра (`prev_char_col_left/right`). -Мы вместо этого расширяем окном fore-клипа и посещаем 6 тайлов там, где -оригинал посетил бы 4. Разница видна в замере: fore-проход стоит 58 764 -там, где реально рисует, и **112 758 там, где не рисует ничего** — вся -разница в числе посещённых тайлов. - -Осторожно: окно клипа заводилось под клинок и брызги (они уходят -вперёд-вверх за габарит кадра). Менять — с прогоном боя и падений. - -## 2. Размеры ленты — из каталога атласа, а не через окно 0 - -**Цена: ~750 тактов на `atlas_image` + часть из 6 396 на «чтение w/h и -арифметика клипа», на КАЖДЫЙ блит фона.** - -Сейчас `pop_blit_b`, чтобы узнать размер куска, зовёт `atlas_image` (тот -мапит страницу в W3, читает запись каталога, возвращает W3 назад), потом -`gfx_w0_map` и читает `w`/`h` из шапки ленты. - -А размеры **уже лежат в каталоге**: запись 8 байт — `offset u16, fw u8, -fh u8, nx u8, ny u8, резерв u16`, и у всех фоновых лент `nx = ny = 1`, то -есть `fw`/`fh` в точности равны `w`/`h` из шапки (проверено по -`pop_env0.atl`). `atlas_image` их читает и выбрасывает. - -Вариант A (0 байт памяти): `atlas_image_wh()` рядом с `atlas_image` — -вернуть заодно размер. -Вариант B (без маппинга вовсе): снять каталоги при загрузке в резидентную -таблицу. Объём: фон (env0-4 + wall + fore + pot) = **313 лент**, по 2 байта -= **626 Б**; всё вместе с Кидом и стражем = 600 лент = 1200 Б. Свободной -кучи на 2026-08-10 — 2873 Б. - -Ожидаемый выигрыш скромный: ~2 000–3 000 из ~16 000 накладных на блит. - -## 3. Один `gfx_w0_map`/`unmap` на группу блитов - -**Цена: ~5 500 тактов на блит** (unmap плюс возвраты по цепочке -`pop_pot_b` → `pop_blit_b` → трамплин). - -Куски одного прохода часто лежат на одной странице атласа, а мапим и -размапливаем на каждый. Мешает то, что `pop_blit_b` — общий лист для всех -вызывающих; нужна форма «открыть страницу, N блитов, закрыть». - -## 4. Единый проход по тайлам вместо трёх - -У оригинала за кадр ОДИН обход тайлов — `redraw_needed_tiles` (seg008): -контекст тайла (`curr_tile`, `curr_modifier`, `draw_xh`, `draw_main_y`) -ставится по разу на тайл в `load_curr_and_left_tile`, а `redraw_needed` -смотрит **семь** независимых счётчиков (`wipe_frames`, `redraw_frames_full`, -`redraw_frames_anim`, `redraw_frames2`, `redraw_frames_floor_overlay`, -`redraw_frames_fore`, `tile_object_redraw`) и делает только помеченное. - -У нас **три** обхода: `pop_redraw_needed`, `pop_process_trobs` и -`pop_fore_over_char`. Плюс один `kind` на тайл вместо семи счётчиков — две -разные причины перерисовки одного тайла конфликтуют. - -Это большой рефакторинг всего слоя фона; браться только если понадобится -ещё заметный запас. - -## 5. objtable: персонажи, привязанные к тайлу - -Оригинал кладёт персонажей в `objtable` и рисует их в -`draw_objtable_items_at_tile(tilepos)` во время обхода тайлов — порядок -окклюзии получается сам. У нас отдельный fore-проход НА КАЖДОГО персонажа. -Со вторым персонажем (страж) цена удваивается. - -## 6. Отложенные таблицы back/mid/fore - -`add_backtable`/`add_midtable`/`add_foretable` только КЛАДУТ запись в массив, -рисование — один `draw_table()` в конце. Поэтому «посетить тайл» у -оригинала стоит копейки. У нас блит идёт сразу из обхода. - -## 7. Мелочи с известной ценой - -| что | цена | где | -|---|---|---| -| `pop_clip_char_top` — трамплин банк 4 → банк 3 ради одной проверки тайла над головой | 8 892 | `pop_cdraw.c` / `pop_map.c` | -| `pop_loose_tick` при полном отсутствии падающих плит в комнате | 27 438 | `pop_map.c` | -| `obj_x * 8 / 7` — единственное оставшееся `__divsint` в горячем пути | ~2 400 | `pop_char_draw` | -| `cd_sig_make` + возврат из `pop_char_draw` | 7 944 | `pop_cdraw.c` | -| `pop_loadkid` + расчёт координат кадра | 7 410 | `pop_cdraw.c` | - -## Что уже проверено и НЕ сработало - -- **Маска «у тайла есть передний слой» (`FORE_ANY`) + контекст тайла один - раз.** Сделано (коммит `a9f4521`), эффект **нулевой**: в футпринте Кида - тайлы почти всегда С передним слоем, а снятое второе чтение кода съедено - проверкой маски. Оставлено как сближение с оригиналом. -- **«Быстрый путь для окна коллизии целиком внутри комнаты».** Не - срабатывал почти никогда: Кид в колонке 0 даёт окно с −1. Заменён на - разбиение окна на непрерывные пробеги. -- **Флаг «фон трогали» вместо позиционной метки** — нулевой выигрыш, - факелы гасили пропуск для всех сразу (см. `pop_cdraw.h`). diff --git a/applications/SprPoP/docs/perf_cyan_phase.md b/applications/SprPoP/docs/perf_cyan_phase.md deleted file mode 100644 index 09188aa..0000000 --- a/applications/SprPoP/docs/perf_cyan_phase.md +++ /dev/null @@ -1,172 +0,0 @@ -# ЦИАН фаза (персонажи + передний слой) — анализ и оптимизация - -Рабочий документ: живёт между сессиями. Внизу **журнал правок** — каждая -запись с замером до/после. Сцена, рецепт воспроизведения и зонды — -[`perf_l13_room23.md`](perf_l13_room23.md); там же ответ про 8-битные -габариты. Парная фаза — [`perf_green_phase.md`](perf_green_phase.md). - -Границы фазы в `sprpop.c`: от `PROF(6)` (строка 620) до `PROF(0)` -(строка 677). Содержимое: `pop_check_mirror`, `pop_loose_mob_draw`, -соперник, `pop_char_draw(KID)`, `pop_loose_mob_draw_over`, `pop_fore_needed`, -`pop_hp_draw`, `pop_char_fore(KID)`, `pop_cd_clear`, -`pop_room_clip_borders`. - -**Бюджет: ≤ 400 000 тактов (растровый кадр = 430 000).** - -| состояние | было (2026-08-17, `c312e4a`) | стало (`af189a1`) | -|---|---:|---:| -| покой, Кид пропущен | 20 550 | 20 550 | -| Кид перерисовывается, кусков нет | 193 000 | 192 000 | -| **пик каскада (6 кусков + Кид)** | **631 800** | **270 510 ✔** | - -**ЦЕЛЬ ФАЗЫ ВЫПОЛНЕНА** (270 510 при бюджете 400 000, запас 32 %). - ---- - -## 1. Что решило дело - -### C1. Пометки «фон трогали» в `mob_render` подавлены — −55 000 - -`pop_loose_mob_tick` помечает **весь коридор** куска одним вызовом, а три -блита внутри `mob_render` метили подмножества того же прямоугольника по -**4 502 такта** каждый. Механизм — `pop_cd_mute()`/`pop_cd_unmute()` -(в `pop_tile.c`; отдельное значение того же флага `pop_cd_batch`, чтобы у -`pop_cd_touch` на общем пути осталась ОДНА проверка). - -Добавлена пометка в `mob_spawn_copy`: кусок, рождённый ВНУТРИ тика -(`loose_fall` сбил плиту), получает слот с начала таблицы, то есть уже -пройденный циклом, — своей пометки в этом кадре он бы не получил, а нарисован -был бы. Без этого пропущенная пометка = стёртый и не перерисованный -персонаж. - -### C4. Кусок клипуется САМ, вместо чистки бортов после — −138 000 - -Самая крупная и самая неожиданная статья. В `mob_render` стоял -`pop_clip_sprite`, то есть кусок рисовался в борт целиком и взводил -`border_dirty`; `pop_room_clip_borders` потом стирал ДВЕ полосы во всю ширину -экрана (320×28 и 320×28) — **150 978 тактов в КАЖДОМ кадре**, пока хоть один -кусок торчит выше поля. А гряда 13-го уровня рождается ровно у потолка -(`y = 2`), то есть почти весь каскад. Стало 1 722. - -Теперь окно клипа (`pop_t_win_set(0, POP_YOFF, 320, POP_PLAYFIELD_H)`) -ставится ТОЛЬКО когда кусок реально задевает борт: внутри поля блиты идут -быстрым путём. - -### Композит куска: три блита → один — −163 000 - -Части `env 70 / 74 / 72` складываются в ОДИН getimage-блоб при загрузке -тайлсета (`mob_spr_build` в `pop_room.c`). Мотив прямо из -[[blit_cost_model]]: у блита ~8 800 такта постоянных накладных против ~5 000 -на пиксели, а шесть кусков в воздухе давали 18 вызовов = **258 708 такта**, -больше половины фазы. - -Тонкости, которые пришлось соблюсти: - -- части **перекрываются** (74 и 70 обе идут от `mob_x`), поэтому композит - собирается попиксельно с пропуском `0xFF` — ровно как три прозрачных блита - друг поверх друга; -- габариты частей **читаются**, а не берутся константами: у тайлсетов правая - часть разная (26 px в подземелье, 25 во дворце); -- блоб лежит в обычной памяти (W2), поэтому блит идёт мимо `atlas_image` и - `gfx_w0_map/unmap` — ещё ~1 350 такта на вызов. Новый резидентный лист - `pop_mem_b` (`pop_tile.c`); -- страйд блоба = его ширина; сначала считается точный габарит, потом - копирование. Промежуточная версия объявляла блоб шириной 63 при - фактических 58 и переносила пять прозрачных колонок на каждом кадре; -- собирается на КАЖДУЮ смену тайлсета; резервный путь на три блита остался - (`mob_spr_ok`). - -### Общие правки, попавшие и в эту фазу - -- `blit_b_clip`: байтовый габарит + file-scope вместо локалей (кадр 22 → 12 Б, - обращений `(ix)` 211 → 51). Подробности — в - [`perf_green_phase.md`](perf_green_phase.md) §G3. -- `pop_blit_b`: аргументы в file-scope (76 → 11 обращений `(ix)`). - ---- - -## 2. Раскладка на 2026-08-17 (до правок) — для истории - -Подфазы (три готовых `PROF(6)`: 0x4BCE / 0x4C26 / 0x4C93), пик: - -| участок | покой | пик | -|---|---:|---:| -| `pop_check_mirror` + `pop_loose_mob_draw` + соперник | 23 250 | 154 512 | -| `pop_char_draw(KID)` + `pop_loose_mob_draw_over` + `pop_fore_needed` + HP | 3 726 | 445 284 | -| `pop_char_fore(KID)` + `pop_cd_clear` + **чистка бортов** | 1 722 | 150 978 | - -Разбор одного `pop_blit_b` (157 замеров быстрого пути, зонды b1..b5): - -| участок | такты | доля | -|---|---:|---:| -| `atlas_image` + `gfx_w0_map` + чтение габарита | 1 086 | 7 % | -| ядро блита (libbgi, `gfx_blit_noclip`) | 10 422 | 64 % | -| `pop_cd_touch` — пометка «фон тронут» | 4 502 | 28 % | -| `gfx_w0_unmap` + возврат | 264 | 2 % | -| ИТОГО | 16 273 | | - -Клипованный путь тогда же: ядро `blit_b_clip` 14 088, итого 16 409. -После правок: клипованный блит 11 848, быстрый ~13 900 (у него больше -пикселей). - ---- - -## 3. Что осталось в запасе (если понадобится ещё) - -Фаза в бюджете, поэтому это задел, а не план. - -### C5. Один `gfx_w0_map`/`unmap` на группу блитов - -1 086 + 264 на вызов. Для композита куска уже не нужно (он в обычной -памяти), но остаётся для тайлов фона: куски одного тайла часто лежат в одной -странице атласа. Мешает то, что `pop_blit_b` — общий лист для всех -вызывающих; нужна форма «открыть страницу, N блитов, закрыть». - -### C6. Размеры ленты — из каталога атласа - -`fw`/`fh` уже лежат в записи каталога (8 байт: `offset u16, fw u8, fh u8, -nx u8, ny u8, резерв u16`), и у всех фоновых лент `nx = ny = 1`, то есть они -равны `w`/`h` из шапки. `atlas_image` их читает и выбрасывает. - -### C7. objtable вместо отдельного fore-прохода на персонажа - -Позиции 5 и 6 старого `perf_backlog.md` — большой рефакторинг. Оригинал -кладёт персонажей и куски в `objtable` и рисует их при обходе тайлов -(`draw_objtable_items_at_tile`), порядок окклюзии получается сам; у нас -отдельный fore-проход НА КАЖДОГО персонажа. - -### Снять временную оснастку - -Шесть вызовов `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит -(`call` + `ret` × 6), плюс `pop_dbg_kind`/`m16` в `pop_redraw_needed`. -Снимать ПОСЛЕ того, как оптимизация закончена: без них не мерить. - ---- - -## 4. Что НЕ делать - -- **Не ставить W3-скобку из кода с `--w3`** — белый экран - (memory `gfx_blit_noclip_fast`). -- **Не ускорять передачу пикселей** — предел железа - (memory `blit_cost_model`). -- **Не возвращать клип куска по `clip.right = 40`** оригинала - (`add_mob_to_objtable`, seg007:1161): единицы этого поля не выяснены, - буквальные 40 экранных пикселей срезают правый задний угол плиты - (прогон 2026-08-13). -- **Не сужать коридор heal «по палаццовому следу»** — габариты частей у - тайлсетов разные; брать высоту СОБРАННОГО композита (так и сделано). - ---- - -## 5. Журнал правок - -| дата | что сделано | циан: покой / Кид / пик | коммит | -|---|---|---|---| -| 2026-08-17 | базовый замер | 20 550 / 193 000 / **631 800** | `c312e4a` | -| 2026-08-17 | C1 подавление пометок в `mob_render` + пометка в `mob_spawn_copy` | — / — / **577 050** | `a3c473d` | -| 2026-08-17 | C4 кусок клипуется сам вместо чистки бортов; `blit_b_clip` байты+file-scope | — / — / **438 546** | `a3c473d` | -| 2026-08-17 | `pop_blit_b` аргументы в file-scope | — / — / **435 180** | `b2da0b8` | -| 2026-08-17 | **композит куска: один блит вместо трёх** | — / — / **273 078** | `b2da0b8` | -| 2026-08-17 | точный габарит композита (было 63 при 58) | 20 550 / 192 000 / **270 510 ✔** | `af189a1` | -| 2026-08-17 | замер после фиксов уровня 1 | — / — / **379 482** | `40f0d46` | -| 2026-08-17 | **регресс после фиксов уровня 2** — без изменений | — / — / **379 488 ✔** | `ec1f384` | diff --git a/applications/SprPoP/docs/perf_green_phase.md b/applications/SprPoP/docs/perf_green_phase.md deleted file mode 100644 index 00324c0..0000000 --- a/applications/SprPoP/docs/perf_green_phase.md +++ /dev/null @@ -1,327 +0,0 @@ -# ЗЕЛЁНАЯ фаза (слой фона) — анализ и оптимизация - -Рабочий документ: живёт между сессиями. Внизу **журнал правок** — каждая -запись с замером до/после. Сцена, рецепт воспроизведения и зонды — -[`perf_l13_room23.md`](perf_l13_room23.md); там же ответ про 8-битные -габариты. Парная фаза — [`perf_cyan_phase.md`](perf_cyan_phase.md) (её цель -достигнута). - -Границы фазы в `sprpop.c`: от `PROF(4)` (строка 450) до `PROF(6)` -(строка 620). Содержимое: `pop_loose_tick`, `pop_process_trobs`, -`pop_redraw_needed`, шов, смена уровня, сигналы провалов, вспышка. - -**Бюджет: ≤ 400 000 тактов (растровый кадр = 430 000).** - -| состояние | было (`c312e4a`) | стало (`af189a1`) | -|---|---:|---:| -| покой в комнате 23 | 35 760 | 35 760 | -| дрожат 6 плит-потолков | 366 000 | 335 400 | -| **пик каскада** | **805 000** | **546 900** | - -**ЦЕЛЬ ФАЗЫ НЕ ДОСТИГНУТА: 546 900 против 400 000 (1,37×).** Что осталось -сделать и почему это именно раскол `draw_tile` — §3. - ---- - -## 1. Раскладка ПОСЛЕ правок (замер `af189a1`) - -Пик — кадры 24-28 (посадки плит), больше не кадры провалов. - -| участок | покой | дрожь | пик | -|---|---:|---:|---:| -| `pop_loose_tick` | 36 234 | 36 234 | **156 762** | -| `pop_process_trobs` | 1 050 | 1 050 | 1 050 | -| **`pop_redraw_needed`** | 924 | 288 800 | **380 568** | -| хвост (шов, смена уровня, сигналы, вспышка) | 9 336 | 9 336 | 10 776 | - -`pop_loose_tick` изнутри на пике: два цикла по тайлам 9 852, -**`pop_loose_mob_tick` 154 074** (heal шести летящих кусков), остальное мелочь. - -### Цена одной перерисовки: было → стало - -| вид | было | стало | чем | -|---|---:|---:|---| -| `RDA_CEIL` — дрожащая плита-потолок | 48 785 | **43 536** | G2 + G3 | -| `RDA_CEIL_GONE` — запечь колодец | 251 335 | **138 318** | **G1** (клип полосы) + G2 + G3 | -| `RD_FLOOR` — щебень на месте посадки | 198 805 | **179 914** | G2 + G3 + снятая двойная пометка | - -Штук за кадр: `RDA_CEIL` до 6, `RDA_CEIL_GONE` до 2, `RD_FLOOR` до 2. - -### Детальный профиль `RD_FLOOR` (179 914) — главная оставшаяся статья - -Снят зондами по каждому блиту (`pop_dbg_b1/b5`) и по рамкам -(`pop_bar_black`, `pop_cd_batch_begin/end`): - -| участок | такты | -|---|---:| -| вход `pop_floor_bake` + `gfx_set_bank` | 2 382 | -| `pop_bar_black` 60×39 (включая `pop_cd_touch` 4 502) | ~15 500 | -| **контекст `draw_tile` #1** (5 чтений тайлов, `63*row`, индексация таблицы) | **13 584** | -| 4 блита тайла #1 | 50 718 | -| **диспетчер между блитами #1** (все `if (code == …)`) | **11 388** | -| **контекст `draw_tile` #2** | **13 584** | -| 4 блита тайла #2 | ~54 000 | -| **диспетчер между блитами #2** | **11 388** | -| хвост | 6 474 | - -Итого: **105 500 — сами блиты (реальные пиксели), 74 400 — накладные**, из -которых 27 168 контекст двух `draw_tile` и 22 776 их диспетчер. - ---- - -## 2. Что сделано (с чем сравнивать) - -### G1. Окно клипа для точечной перерисовки — −90 000 - -`pop_t_win_set(x, ytop, w, h)` / `pop_t_win_clear()` в `pop_tile.c`: ставит -уже существующее окно `pop_t_fclip_*` на прямоугольник, который перерисовка -восстанавливает. Работает в обе стороны — и предфильтр `pop_blit_b` -отсеивает куски мимо окна ДО `atlas_image`/`gfx_w0_map`, и `blit_b_clip` -режет остальные по нему. - -Где сработало: `pop_ceil_bake_empty` — куски ряда 0 высотой 63 px рисовались -целиком, хотя восстановить надо девять строк полосы. **Блит 21 447 → 7 619**, -вся перерисовка 251 335 → 138 318. - -Где НЕ сработало — см. §4, отрицательные результаты. - -Побочно: пока окно стоит, `pop_blit_b` не ставит пометку «фон трогали» -(признак fore-прохода), поэтому вызывающий обязан пометить прямоугольник сам. -В `pop_ceil_shake_draw` добавлен явный `pop_cd_touch` на область heal'а; в -`pop_ceil_bake_empty` и `pop_floor_bake` метит `pop_bar_black`, а лишний -второй вызов на ту же область снят. - -### G2. Контекст тайла — file-scope, а не локали `draw_tile` — −55 000 - -Порт `load_curr_and_left_tile` (seg008:0339): у оригинала это -`curr_tile`/`curr_modifier`/`draw_xh`/`draw_main_y`/`draw_bottom_y` — -переменные модуля, а не локали. - -Причина в кодогене: в `draw_tile` **57 вызовов**, и каждое живое через вызов -значение SDCC спиливал в стековый кадр — 26 байт кадра и **513 обращений -`-N(ix)`** (при ~46 замеренных тактах на обращение это ~23 600, что и -намерено). Стало **33 обращения**, кадра нет, банк 7 −703 Б. - -### G3. `blit_b_clip` — байтовый габарит + file-scope - -Два шага, и важен порядок наблюдений: - -1. **Байтового габарита ОДНОГО НЕ ХВАТИЛО.** `sx/sy/dw/dh` → `uint8_t` - (корректно: кадры атласов ≤ 56×63) дало 211 → 173 обращения, а - 22-байтовый кадр остался: значений, живых через шесть вызовов ядер libbgi, - всё равно больше, чем регистров у Z80. -2. **Решило вынесение из локалей** (`bc_*`): 51 обращение, кадр 22 → 12 Б. - -Клипованный блит 14 088 → 11 848. Заодно `blit_b_oversize` больше не ходит -через `blit_b_clip` (там теперь байтовый габарит) — рисует напрямую -`gfx_blit_part`; это путь под полноэкранные подложки интро/финала. - -### G4. Мелочи - -- `pop_blit_b`: аргументы в file-scope (третий и дальше SDCC передаёт стеком, - каждое чтение шло через `-N(ix)`) — 76 → 11 обращений. -- `pop_loose_mob_tick`: пометки всех кусков ОДНИМ пакетом - (`pop_cd_batch_begin/end`) — было по 4 502 такта на кусок. - 176 772 → 168 600. -- Коридор heal куска — по фактической высоте СОБРАННОГО композита (было 24 - строки константой, стало 20). 168 600 → 156 762. - ---- - -## 3. Что осталось: раскол `draw_tile` (позиция G5) - -**Оставшийся разрыв: −147 000.** Он весь в двух местах. - -### G5. Расколоть `draw_tile` на узкие части, как в оригинале - -**Ожидание: −50 000 … −60 000.** - -У оригинала `draw_tile` (seg008:01C7) — это девять независимых вызовов: -`draw_tile_floorright`, `draw_tile_anim_topright`, `draw_tile_right`, -`draw_tile_anim_right`, `draw_tile_bottom`, `draw_loose`, `draw_tile_base`, -`draw_tile_anim`, `draw_tile_fore`. Для ряда −1 он зовёт шесть из них -(`draw_tile_aboveroom`, seg008:01F2), для полосы у потолка — те же шесть плюс -`draw_tile_wipe(3)` (`redraw_needed_above`, seg008:02C1). - -У нас всё это — ветки `if (row >= 0)` ВНУТРИ одной функции, то есть контекст -(13 584) и диспетчер (11 388) оплачиваются целиком всегда. Расколов, каждая -точечная перерисовка сможет звать только нужные части: - -- `pop_floor_bake`: вместо второго полного `draw_tile(row, col+1)` — только - его правую грань и базу; -- `pop_ceil_shake_draw` / `pop_ceil_bake_empty`: дословный - `draw_tile_aboveroom`; -- `pop_loose_shake_draw`, `pop_spike_redraw`, `pop_gate_redraw` — то же. - -Риск средний: у `draw_tile` собрано много инвариантов (BUG-LOOSE-3, -BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1), проверять придётся прогонами всех -уровней. Поэтому делать отдельным заходом, а не хвостом другой правки. - -### G6. Меньше блитов в `RD_FLOOR` - -**Ожидание: неизвестно, надо мерить.** 105 500 из 179 914 — это 7,6 блита, -и они рисуют настоящие пиксели. Сократить можно только сократив то, что -восстанавливается: бар сейчас 60×39 от `yb+26`, а плита занимает по вертикали -меньше (её куски: левая грань `POP_LOOSE_FRAM_LEFT` 32×13 на `dmy = yb+62`, -низ `POP_LOOSE_FRAM_BOTTOM` 32×3 на `dby = yb+65`, правая грань в соседе -26×16 на `dby−1`). То есть плита живёт в `yb+47 .. yb+65`, а бар начинается с -`yb+26` — **21 лишняя строка сверху**. - -Проверять осторожно: бар заодно стирает и то, что рисует ДРУГИЕ куски тайла -(орнаментная лента `stripe_id` на `dmy−27 = yb+35` попадает как раз в -«лишнюю» часть). Сузишь бар — надо убедиться, что ничего не осталось. - -### G7. heal летящих кусков — 154 074 (28 % фазы) - -Шесть кусков × ~25 700: сам heal 64×20 (по модели ~19 700) + пакетная -пометка + накладные `mob_tick_one` (16-байтовый кадр, 99 обращений `(ix)`). -**Сам heal у предела железа** — это 1 280 пикселей на кусок, оптимизировать -нечего, кроме площади. Площадь уже подрезана до габарита композита. - -Остаётся `mob_tick_one` (~4 500 на кусок = 27 000 на кадр) — то же лечение -file-scope, что у `draw_tile`. - -### G8. Пометка соседа — узкой полосой, а не полным тайлом (идея пользователя) - -**Ожидание: заметное, но не мерено. Взять ПОСЛЕ обхода всех уровней** -(решение пользователя 2026-08-17: пока идёт отлов багов слоёв, каждая правка -добавляет переменных в картину). - -Когда плита (1,8) падает, помечаются ДВА тайла: - -| пометка | что делает | -|---|---| -| `(1,8)` → `RD_LOOSE_GONE` | бар 40 на своём x, бар 32 на соседе, `draw_tile(1,8)` + `draw_tile(1,9)` | -| `(1,9)` → `RD_FLOOR` | бар **60** на x соседа, `draw_tile(1,9)` ЕЩЁ РАЗ | - -То есть сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО, хотя потревожили у него -только левые 28 пикселей — там, куда свисает правая грань упавшего тайла. -`draw_tile(1,9)` при этом вызывается дважды на одну пометку. - -Что такое эти числа (чтобы не сузить лишнего): - -- **60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес.** Правая грань пола (кадр 42, - 26 px) рисуется в клетке соседа с `x+32`, занимая `x+32..x+57`. Для запечки - САМОГО тайла 60 уже минимальны — сужать их нельзя; -- сузить можно только тот случай, когда тайл помечен ПОТОМУ ЧТО ИЗМЕНИЛСЯ ЕГО - ЛЕВЫЙ СОСЕД: тогда нужна полоса 28 px у левого края, а не весь тайл. - -Почему выигрыш не символический: `pop_floor_bake` стоит **179 914** тактов, -из них 105 500 — сами блиты. Узкая полоса срезала бы и площадь бара -(60×39 → 28×39), и часть блитов — окно клипа там теперь стоит обязательным -(см. §4), так что отсев достаётся даром. - -**Условия, из-за которых это не «просто уменьшить число»:** - -1. `pop_floor_bake` — ОБЩАЯ функция: её же зовут кнопка (`pop_button_redraw`), - зеркало, подобранный предмет и щебень на месте посадки. Там меняется сам - тайл и 60 нужны целиком. Значит нужен отдельный вход (напр. - `pop_floor_bake_edge(row, col)`) или параметр-прямоугольник — именно под - пометку «изменился мой левый сосед». -2. Прежде чем выкидывать вторую пометку целиком, сверить ВЕРТИКАЛЬНЫЕ - диапазоны: `pop_loose_bake_empty` кроет `63*row+46 .. +65` (20 строк), а - `pop_floor_bake` — `yb+26 .. yb+64` (39 строк). То есть сосед покрыт - ВТОРЫМ баром не полностью, и просто снять пометку нельзя. -3. Ширина полосы = свес ЛЕВОГО тайла, а он зависит от типа тайла (у loose это - 8 px по комментарию в `pop_loose_bake_empty`, у пола 26). Брать по - максимуму (28) — безопасно. - -### G9. Снять временную оснастку - -Шесть `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит; при 15 -блитах зелёной это 6 000 на кадр. Плюс `pop_dbg_kind`/`m16` (2 вызова на -перерисовку) и `pop_dbg_m5..m15`. Снимать ПОСЛЕ окончания оптимизации: без -них не мерить. - ---- - -## 4. Копия второй страницы — и почему она ТРЕБУЕТ окна клипа - -Точечные запечки ставятся с `pages = 2`, срабатывают два кадра подряд (по разу -на страницу дабл-буфера) и оба раза считают одно и то же. После первого раза -нужный прямоугольник уже лежит в ОЗУ-копии первой страницы, и его можно -скопировать: `gfx_copy_page` берёт источником ОЗУ-копию НЕактивной страницы -(то есть ЧИСТЫЙ фон — спрайты рисуются банком без тени и в копию не попадают), -а приёмник обновляет и в видео-ОЗУ, и в ОЗУ-копии. Идея пользователя: тот же -приём, что при перевороте экрана (зелёное зелье), только без зеркала. - -| | полная запечка | копия | -|---|---:|---:| -| щебень / кнопка (60×39) | 179 914 | ~35 000 | -| колодец полосы потолка (64×9) | 138 318 | ~17 500 | - -**ДВА УСЛОВИЯ КОРРЕКТНОСТИ.** Оба нарушались и оба дали видимые баги. - -1. **Запечка обязана быть ОГРАНИЧЕНА копируемым прямоугольником.** - `draw_tile` рисует тайлы ЦЕЛИКОМ, то есть пишет ШИРЕ бара; копия переносит - ровно бар, и всё, что легло вне него, на второй странице остаётся прежним — - страницы расходятся, это видно как МЕРЦАНИЕ через кадр. У полосы потолка - окно стояло с самого начала (G1), у `pop_floor_bake` — нет, и он мерцал - торцами полов, плит и кнопок (найдено пользователем 2026-08-17: уровень 1, - комната 6, Кид на кнопке (0,2)). Поэтому в `pop_floor_bake` окно теперь - стоит КАК УСЛОВИЕ КОРРЕКТНОСТИ, хотя по скорости само по себе убыточно - (см. §5) — снимать его нельзя. -2. **Копия годится только если содержимое тайла между двумя кадрами не - изменилось.** У анимированного тайла (кнопка с идущим таймером связи) - пометка обновляется КАЖДЫЙ кадр и картинка каждый раз другая. Поэтому - `pop_set_redraw`/`pop_set_redraw_above` гасят слот копии при ПЕРЕпометке - (`pop_bake_slot_reset*`). - -Плюс слот `bake_pg`/`bake_pg_above` помнит, НА КАКОЙ странице сделана первая -запечка: копируем только если первая была на ДРУГОЙ странице и дабл-буфер -включён. Это покрывает переплетение двух запечек в одном кадре, однобуфер -(чит SPACE) и смену комнаты (`pop_bake_forget`). - ---- - -## 5. Отрицательные результаты — НЕ повторять - -### Окно клипа в `pop_floor_bake` — по СКОРОСТИ проверено ТРИ раза, каждый раз хуже - -**Но оно всё равно стоит на месте: без него ломается копия второй страницы -(§4).** Ниже — только про скорость самого окна. - -| попытка | было | стало | -|---|---:|---:| -| до G3 | 187 266 | 198 279 | -| после G3 | 182 124 | 188 460 | -| после `pop_blit_b` file-scope, с детальным зондом | 179 914 | 188 417 | - -Третья попытка объяснила причину: клипованный путь стоит **+1 500 такта на -КАЖДОМ** из 7,6 блитов (+11 400), а режет он только редкие высокие куски — в -трассе такие нашлись (34 878 → 25 872 и 28 818 → 24 090, всего −13 700), но в -среднем по 12 перерисовкам их нет. Запись стоит в коде. - -### Прочее (проверено раньше) - -- **Не откладывать запекание на другой кадр** — запечка пишет ОЗУ-копию, из - которой восстанавливает heal; отложенная даёт призрак плиты на месте дыры. -- **Не батчить смежные колонки в `pop_ceil_shake_draw`** — плиты стартуют со - случайными задержками, в кадре дрожат разрозненные колонки, пробег почти - всегда длиной в одну. -- **Не ускорять передачу пикселей** — предел железа (3+3 такта на байт, - memory `blit_cost_model`). В пиковом кадре «железный» минимум всех блитов - ≈150 000 из 916 458. -- **`LOOSE-SHAKE-RUNS`** (пометки по сменам кадра): наивный вариант выигрыша - НЕ даёт — пять смен × две страницы = те же десять перерисовок. Работает - только версия «пары и тройки», ~20 % и только на дрожащих плитах; оценка - 2026-08-13, не перемерена. Подробности — - `TASKS_OPEN.md#loose-shake-runs`. - ---- - -## 6. Журнал правок - -| дата | что сделано | зелёная: покой / дрожь / пик | коммит | -|---|---|---|---| -| 2026-08-17 | базовый замер | 35 760 / 366 000 / **805 000** | `c312e4a` | -| 2026-08-17 | G2 контекст тайла в file-scope | — / — / **747 954** | `a3c473d` | -| 2026-08-17 | G1 окно клипа в `pop_ceil_bake_empty` | — / — / **663 250** | `a3c473d` | -| 2026-08-17 | G3 `blit_b_clip` байты + file-scope | — / 335 400 / **575 730** | `a3c473d` | -| 2026-08-17 | `pop_blit_b` file-scope; пакетная пометка кусков | — / — / **557 706** | `b2da0b8` | -| 2026-08-17 | коридор heal по высоте композита | 35 760 / 335 400 / **546 900** | `9a50ab2` | -| 2026-08-17 | **копия второй страницы вместо второй запечки** | — / — / **423 558** | `5ef721e` | -| 2026-08-17 | `mob_tick_one` в file-scope; снята оснастка из горячих путей | 35 760 / 326 130 / **414 456** | `18ee60e` | -| 2026-08-17 | фикс мерцания: окно клипа в `pop_floor_bake` как условие корректности копии | замер после фикса — ниже | `35b7cd5` | -| 2026-08-17 | замер после фиксов уровня 1 (мерцание торцов, потолочный fore, сосед под плитой, блеск меча) | 35 760 / — / **417 630** | `40f0d46` | -| 2026-08-17 | **регресс после фиксов уровня 2** (чёрные бары, чит бессмертия) — в пределах шума | — / — / **419 526** | `ec1f384` | diff --git a/applications/SprPoP/docs/perf_l11_room15.md b/applications/SprPoP/docs/perf_l11_room15.md deleted file mode 100644 index 24c59b0..0000000 --- a/applications/SprPoP/docs/perf_l11_room15.md +++ /dev/null @@ -1,238 +0,0 @@ -# Сцена и замер: факел + чомпер + страж, уровень 11 комната 15 - -Вторая целевая сцена для оптимизации (первая — [`perf_l13_room23.md`](perf_l13_room23.md), -каскад плит). Здесь узкое место другое: не разовый пик на каскаде, а -**постоянная** цена статичной комнаты, в которой одновременно живут два -факела, чомпер и страж. - -Такты — `totalcycles` MAME (не такты Z80, ≈2,4× номинала, memory -`sprinter_wait_states_2x`). **Растровый кадр = 430 000.** Хвост кадра — три -`gfx_wait_vsync`, поэтому логический кадр занимает 3 растра, пока работа -укладывается в один; при работе 1..2 растра период становится 4. - -## 1. Сцена - -Уровень 11, комната 15. Проверено чтением состояния машины: -`pop_current_level` = 0x0B, `cur_room` = 15. - -| кто | где | кадр | -|---|---|---| -| Кид | (0,2), x=98 | 15 (стойка с мечом) | -| чомпер | (0,3) | застывший (trob мёртв) | -| факел | (0,2) — пламя рисуется в ячейке (0,3) | анимируется каждый кадр | -| факел | (0,7) — пламя в ячейке (0,8) | анимируется каждый кадр | -| страж | (0,8), x=170 | 171 (боевая стойка) | - -Ни Кид, ни страж не двигаются: сцена статична, разброс замера — сотни тактов -на 800 000. - -## 2. Замер (`09f32ce`, база модуля `sprpop.c` = 0x42AD) - -867 кадров, зонды A/C/D/E; детализация — тремя отдельными прогонами -(m1, m5..m7, M/F). **Период кадра: 4 растра во всех 866 интервалах.** - -| участок | зонды | медиана | доля работы | -|---|---|---:|---:| -| **синяя: ввод + heal** | A→m1 | 141 048 | 17,6 % | -| **синяя: логика** | m1→C | 152 190 | 19,0 % | -| синяя, всего | A→C | **293 238** | 36,6 % | -| зелёная: `pop_loose_tick` | C→m5 | 28 872 | 3,6 % | -| **зелёная: `pop_process_trobs`** | m5→m6 | 92 448 | 11,5 % | -| **зелёная: `pop_redraw_needed`** | m6→m7 | 190 260 | 23,7 % | -| зелёная: шов/ворота соседа | m7→D | 9 336 | 1,2 % | -| зелёная, всего | C→D | **320 916** | 40,0 % | -| циан: `check_mirror` + `loose_mob_draw` | D→M | 37 458 | 4,7 % | -| **циан: Кид + страж + fore + HP** | M→F | 148 566 | 18,5 % | -| циан: `char_fore(KID)` + борта | F→E | 1 740 | 0,2 % | -| циан, всего | D→E | **187 758** | 23,4 % | -| **работа** | A→E | **801 768** | 1,86 растра | - -Циан здесь **не** выделяется: 187 758 — это 0,44 растрового кадра, а разброс -за 867 кадров всего 174 такта (187 674..187 848). Впечатление «циан ~150 % -кадра» на глаз не подтвердилось — при периоде 4 растра полосы бордюра -размазаны по кадрам и на глаз не читаются. - -## 3. Главная находка: чомпер справа от факела — 190 260 тактов/кадр - -`pop_dbg_rdmax_tot` = **1**: за кадр перерисовывается РОВНО ОДИН тайл, и -стоит он все 190 260 тактов зелёной фазы. - -> **ПОПРАВКА 2026-08-19 (после реализации P1).** Механизм ниже описан -> верно, но ГЛАВНЫМ источником 190 260 тактов он НЕ был. Зонд -> `pop_dbg_kind` показал, что все 312 перерисовок в прогоне — вид -> `POP_RD_CHOMP` (полная), и ни одной от факела: собственная пометка -> чомпера просто перебивала пометку соседа. Настоящая причина — в §6. -> Урок ровно тот, что уже записан в `defer_unexplained_quirks`: механизм, -> который правдоподобно объясняет цифру, ещё не доказан цифрой. - -Цепочка: - -1. `TORCH_ANIM_DIV = 1` — факел меняет кадр пламени КАЖДЫЙ логический кадр; -2. пламя запекается в фон (`pop_torch_draw`, `GFX_BANK_NORMAL`), а канвас - пламени 16×18 лежит **в ячейке правого соседа** (seg008:560) — то есть - поверх чомпера; -3. поэтому `pop_process_trobs` метит соседа: `if (trob_rcode[i] == TILE_CHOMP) - pop_set_redraw(tp + 1, POP_RD_CHOMP, 1)` (порт `set_redraw_anim_right`); -4. `pop_chomp_redraw` отвечает на пометку **heal 32×64 + полный `draw_tile`**. - -Расхождение с оригиналом именно в шаге 4. `set_redraw_anim_right` метит -слой **anim**, и оригинал возвращает только его (`draw_tile_anim_topright` → -`draw_tile_anim_right` → `draw_tile_anim`) — одну графику чомпера поверх -огня. Мы вместо этого стираем и пересобираем тайл целиком, со всеми слоями -(`draw_tile_right`, `base`, `bottom`, `loose`), которые пламя вообще не -трогало. - -Цена по модели блита (`blit_cost_model`, 8791 + 198·h + 5,96·w·h): -heal 32×64 ≈ 33 700, значит на один `draw_tile` уходит ≈ 156 000 — сходится -с известным замером «полная запечка щебня 179 914». - -Чомпер при этом **застывший**: своей анимации у него нет, поза не меняется, -возвращать нужно ровно ту же графику поверх свежего пламени. - -## 4. Что это даёт и куда смотреть дальше - -Ранжирование по цене (доля от 801 768): - -| # | участок | такты | что делать | -|---|---|---:|---| -| 1 | `redraw_needed`: чомпер под факелом | 190 260 | вернуть только слой anim, как в оригинале — без heal и без остальных слоёв | -| 2 | синяя: логика двух Char | 152 190 | графики нет вообще; разобрать `pop_check_can_guard_see_kid` и два `play_seq` | -| 3 | циан: Кид + страж | 148 566 | оба будятся каждый кадр — метки фона от чомпера/факела накрывают обоих | -| 4 | синяя: heal двух Char | 141 048 | следствие того же: skip не срабатывает ни разу | -| 5 | `process_trobs`: два факела | 92 448 | ≈46 000 на факел при блите пламени 16×18 ≈ 14 000 — разобрать накладные | -| 6 | `loose_tick` | 28 872 | в комнате нет ни одной loose-плиты | - -Пункты 3 и 4 — одна тема: пока фон трогают каждый кадр, `pop_char_skip_mask` -не может пропустить ни Кида, ни стража. Пламя метит узко (16×18), а вот -`pop_chomp_redraw` метит весь тайл со свесом — то есть пункт 1 чинит и часть -пунктов 3/4. - -Связанные задачи: `HEAL-WIDTH` и G8 в [`perf_green_phase.md`](perf_green_phase.md) -— та же болезнь (полный тайл там, где хватает полосы), но на другом -материале. - -## 6. Настоящая причина 190 260 тактов: перерисовка неизменной позы - -Найдено при реализации P1, сверкой с `animate_chomper` (seg007:0448). -Функция оригинала заканчивается так: - -```c -if ((curr_modifier & 0x7F) < 6) { - redraw_at_trob(); -} -``` - -То есть чомпер перерисовывается **только пока фаза меньше 6** — пять кадров -из пятнадцати (`POP_CHOMPER_SPEED = 15`). Это не оптимизация оригинала, а -следствие таблицы поз: `chomper_fram1 = {3,2,0,1,4,3,3}`, и начиная с фазы 5 -и до конца круга поза одна и та же — 3. Рисовать её десять кадров подряд -значит рисовать ровно ту же картинку. - -Мы же метили тайл БЕЗУСЛОВНО, каждый кадр, пока trob жив — то есть платили -полный `draw_tile` плюс heal 32×64 за неизменную картинку в двух третях -кадров. А trob у чомпера живёт, пока Кид в том же РЯДУ (`animate_chomper` -снимает его только при фазе ≥ 6 и ушедшем Киде) — в 11/15 Кид стоит в (0,2), -чомпер в (0,3), ряд один. - -**Что сделано:** - -1. пометка только при фазе < 6, и на фазе 5 — на ОБЕ страницы дабл-буфера - (она последняя рисуемая, её поза обязана лечь на обе; вторую страницу - пометка догоняет в кадре фазы 6, где поза та же самая); -2. пометка от факела (`set_redraw_anim_right`) переведена на новый вид - `POP_RD_CHOMP_ANIM` → `pop_chomp_anim_draw`: три блита графики чомпера - поверх свежего пламени, без heal и без остальных слоёв — порт ветки - `redraw_frames_anim` (seg008:0211); -3. приоритет полной перерисовки над anim в `pop_set_redraw` — у оригинала - это два независимых счётчика, и `full` побеждает. - -**Результат** (замер, 552 кадра): полная перерисовка теперь в **40 %** -кадров, лёгкий возврат челюстей — в 60 %. Зелёная фаза: 291 888 в дорогом -кадре против 183 414 в дешёвом. - -| | работа | зелёная | -|---|---:|---:| -| до P1 | 768 684 | 294 510 | -| после P1, медиана | **657 882** | **183 420** | -| после P1, дорогой кадр (40 %) | 765 936 | 291 888 | - -**−110 802 на медиане** при ожидании −160 000. Разница в том, что 40 % -кадров по-прежнему платят полную цену: там поза реально меняется, и это уже -не лишняя работа, а честная. Дальше её можно резать только раскладом -`draw_tile` на части (P7) или сужением heal (P8). - -## 5. Журнал правок по этой сцене - -| дата | правка | работа | синяя | зелёная | циан | -|---|---|---:|---:|---:|---:| -| 2026-08-19 | базовый замер (`09f32ce`) | 801 768 | 293 238 | 320 916 | 187 758 | -| 2026-08-19 | **P5**: гейты холостого хода в `pop_loose_tick` | **767 928** | 285 864 | 294 384 | 187 764 | -| | | −33 840 | −7 374 | −26 532 | +6 | -| 2026-08-19 | зонды для замера P2/P6 (временные) | 768 684 | 286 518 | 294 510 | 187 761 | -| 2026-08-19 | **P1**: чомпер — перерисовка только при фазе < 6 (медиана) | **657 882** | 286 503 | 183 420 | 187 761 | -| | | −110 802 | −15 | −111 090 | 0 | - -Оснастка P2/P6 стоит 756 тактов на кадр — замеры до и после сопоставимы. - -Циан не изменился (+6 тактов — шум), и это ожидаемо: `loose_tick` целиком -лежит в зелёной. Синяя просела на 7 374 без прямой причины в правке — -скорее всего перераскладка кода банка 3 компилятором; проверять отдельно -не стали, знак верный. - -## 7. ТЯЖЁЛАЯ позиция: Кид на шаг правее [замер 2026-08-19] - -Поставлена пользователем: один осторожный шаг вправо (x = 106 вместо 99, -колонка та же). Спрайт Кида начинает пересекаться с тайлом (0,3), где -одновременно чомпер и пламя факела — и `skip_mask` перестаёт его -пропускать. - -| фаза | лёгкая | **тяжёлая** | разница | -|---|---:|---:|---:| -| синяя | 259 500 | 257 520 | −1 980 | -| зелёная (медиана) | 181 068 | 180 870 | −198 | -| **циан** | 187 761 | **319 842** | **+132 081** | -| **работа (медиана)** | 628 542 | **758 358** | **+129 816** | -| работа (максимум) | 744 384 | **876 612** | | - -**Период кадра: 4 растра в 335 кадрах, 5 растров в 123 (27 %).** Это уже -не «стабильно медленно», а рывки: каждый четвёртый кадр длиннее соседних. - -Разбор циана показывает, куда ушли 132 тысячи: - -| участок | лёгкая | тяжёлая | -|---|---:|---:| -| `check_mirror` | 3 198 | 3 198 | -| `mob_draw` + `guard_over_kid` + `skip_mask` | 34 374 | 18 672 | -| **`pop_char_draw(KID)`** | **204** | **54 738** | -| соперник: `char_draw` + `char_fore` | 145 896 | 149 748 | -| **`fore_needed` + `char_fore(KID)` + борта** | **4 356** | **93 486** | - -То есть Кид из «пропущен за 204 такта» превращается в полноценного -персонажа за ~144 000 — ровно столько же, сколько стоит страж. - -**Главный вывод замера: самая дорогая единичная статья кадра — это -fore-проход персонажа.** 62 778 у стража и ~89 000 у Кида, вместе около -**152 000, то есть 20 % работы кадра**. У Кида он дороже потому, что в его -футпринте лежит чомпер, а у чомпера есть собственный передний слой -(`POP_CHOMP_FRAM_FOR`), который перерисовывается поверх персонажа каждый -кадр. - -## 8. После P15 (точная метка «фон трогали») - -| фаза | лёгкая до | лёгкая после | тяжёлая до | тяжёлая после | -|---|---:|---:|---:|---:| -| синяя | 259 050 | **223 902** | 257 520 | **245 808** | -| зелёная | 181 494 | 181 494 | 180 870 | 181 761 | -| циан | 194 262 | **59 406** | 319 842 | **192 090** | -| **работа** | 628 542 | **464 796** | 758 358 | **617 487** | - -В лёгкой позиции не рисуется НИ ОДИН персонаж (циан 59 406 — это уже только -`check_mirror`, проверки и передний слой по пометкам). В тяжёлой рисуется -один Кид: он действительно стоит под пламенем, а страж — нет. - -**Пятирастровые кадры в тяжёлой позиции исчезли** (было 27 %), период стал -ровно 4. - -**Полная очередь оптимизаций с оценками — [`perf_registry.md`](perf_registry.md).** -Там же разложена цена одного блита фона по этапам (замер 2026-08-19, 1603 -блита) и модель зелёной фазы этой сцены. diff --git a/applications/SprPoP/docs/perf_l13_room23.md b/applications/SprPoP/docs/perf_l13_room23.md deleted file mode 100644 index 3a64012..0000000 --- a/applications/SprPoP/docs/perf_l13_room23.md +++ /dev/null @@ -1,271 +0,0 @@ -# Сцена и метод замера: каскад плит, уровень 13 комната 23 - -Общий документ для двух фазовых: [`perf_green_phase.md`](perf_green_phase.md) -(слой фона) и [`perf_cyan_phase.md`](perf_cyan_phase.md) (персонажи + передний -слой). Здесь — как воспроизвести сцену, чем мерить, сводка по кадрам и -разбор габаритов спрайтов (он общий для обеих фаз). - -Сцена: старт уровня 13. Комната 23 стартовая, ряд 2 комнаты СВЕРХУ (17) — -шесть loose-плит в колонках 2..7 (`res2013.bin`: коды `11` в позициях 22..27), -`check_fall_flo` раздаёт им отложенный старт `0xF0..0xFF`, и они сыплются -вразнобой. Кид стоит у правого края и не двигается. - -Все числа — такты `totalcycles` MAME (системный клок ~21,5 МГц, **НЕ** такты -Z80: у ОЗУ Sprinter wait-state'ы, ≈2,4× номинала — memory -`sprinter_wait_states_2x`). **Растровый кадр = 430 000.** Логический кадр -спейсится тремя `gfx_wait_vsync`, поэтому работа сверх 430 000 стоит сразу -целый лишний растровый кадр. - -Сборка: `make LEVEL=13` на `c312e4a`, `_CODE = 0x4100`, база модуля -`sprpop.c` = **0x42AD**. **Адреса зондов меняются после КАЖДОЙ -пересборки** — брать заново из `.sprinter-cc-build/.sprinter-cc-sprpop/sprpop.map` и -`sprpop.lst`. - ---- - -## 1. Как воспроизвести сцену - -**Только перезапуском программы.** Проверено и отвергнуто: - -- **выход из комнаты и возврат** (чит `+`/`-`) — не работает: провалившаяся - плита-потолок уходит в страницу уровня насовсем (`pop_level_set_tile` в - `sprpop.c` по сигналу `pop_ceil_fell`, плюс `animate_loose` в - `pop_trob.c`), и при повторном входе `check_fall_flo` не находит ни одной - `TILE_LOOSE`; -- **рестарт уровня** (`pop_kid_dead = 1` + чит навигации) — не работает по - другой причине: `pop_start_level()` сам заходит в стартовую комнату 23, - взводит гряду, и она доваливается ЗАОЧНО (через `trob` комнаты 17), пока - телепорт уносит Кида в комнату 24; -- **поставить сцену руками** (записать `pop_ceil_modif[2..7]` и копию ряда - сверху `pop_t_above[2..7]` отладчиком) — записи ложатся, но пока машина - БЕЖИТ, их успевает обнулить тот же доваливающийся `trob`. - -Рабочий рецепт (идея пользователя, самый чистый): **`ESC` → зонды → -`SprPoP`**. `ESC` выходит в DSS, запуск заново стартует уровень 13 с нуля, -Кид сразу в комнате 23, каскад начинается через ~5 логических кадров после -отрисовки комнаты. Зонды обязаны стоять **ДО** набора `SprPoP` — за время -набора (9 клавиш ≈ 1,8 с) и загрузки атласов каскад успевает пройти целиком. - -## 2. Канал вывода замеров - -`printf` из действия брейкпоинта в `error.log` **не** попадает. Читается -verb'ом **`clog N`** плагина `mamebridge` — а его нет в MCP-обёртке -(`mame_mcp.py` знает только `cmd`). Годится прямой файловый IPC: -положить `/tmp/mame_mcp/req_<ЧИСЛО>.txt` с телом команды и прочитать -`resp_<ЧИСЛО>.txt`. **Имя обязано содержать ЧИСЛО** (`init.lua`: -`entry:match("^req_(%d+)%.txt$")`) — с буквенным id запрос молча не -обслуживается. - -Скрипты сессии (в scratchpad, при необходимости пересоздать): `mrpc.py` — -клиент IPC; `run.sh` — цикл «`bpclear` → `ESC` → зонды → `SprPoP` → `clog`»; -`parse*.py` — разбор трассы по кадрам. - -Форма зонда: `bpset ,1,{printf "<метка> %d",totalcycles; g}`. -Для `pop_dbg_kind` — `printf "K %d %d",a,totalcycles` (аргумент `uint8_t` -приходит в `A`, `__sdcccall(1)`). - -## 3. Зонды - -Адреса `out (_io_border), a` (полосы бордюра) из `sprpop.lst` плюс -однобайтовые пустышки `pop_dbg_*` из резидентного `pop_state.c`. Резидент -важен принципиально: у банковых функций один адрес 0xC000+ есть у восьми -модулей сразу, и брейкпоинт ловит все банки (так в прошлой сессии намерили -несуществующие 134 730 тактов). - -| зонд | адрес | что | -|---|---|---| -| A | 0x43E8 | `PROF(2)` — начало кадра (ввод + heal) | -| — | 0x46AF | `PROF(2)` — начало логики | -| C | 0x47D1 | `PROF(4)` — начало слоя фона (**зелёная**) | -| D | 0x4BCE | `PROF(6)` — начало спрайтов (**циан**) | -| M | 0x4C26 | `PROF(6)` — кадр Кида | -| F | 0x4C93 | `PROF(6)` — fore поверх Кида | -| E | 0x4CB7 | `PROF(0)` — конец работы, ждём vsync | -| m5/m6/m7 | 0x4DC6 / C7 / C8 | границы внутри зелёной | -| m9..m12 | 0x4DCA..CD | внутренности `pop_loose_tick` | -| m13/m14/m15 | 0x4DCE / CF / D0 | `pop_ceil_shake_draw`: вход / heal / draw_tile | -| kind / m16 | 0x4DD1 / D2 | вид и цена одной перерисовки в `pop_redraw_needed` | -| b1..b5 | 0x4DD3..D7 | участки одного `pop_blit_b` | - -Полезные адреса состояния (из `sprpop.map`): `pop_t_room` 0x95F2, -`pop_current_level` 0x9945, `pop_ceil_modif` 0x9C9E, `pop_t_above` 0x95EE -(указатель), `pop_kid_dead` 0x9C4E, `pop_dbg_rdmax` 0x95B1. -Запись в память через MCP — по адресу `0x10000 | addr` (логический вид Z80); -присваивание выражением дебаггера (`print b@... = 1`) **не работает**. - -**Грабли:** проверять, что запущен РОВНО ОДИН MAME (`pgrep -f mame.arm | wc -l`). -Мост говорит с одним, замеры собираются с другого, и точки «не срабатывают». - ---- - -## 4. Сводка по кадрам - -**Базовый замер (`c312e4a`, ДО оптимизации):** - -| фаза каскада | работа | синяя | зелёная | циан | период (растр.) | -|---|---:|---:|---:|---:|---:| -| покой в комнате 23 | 190 860 | 134 550 | 35 760 | 20 550 | **3** | -| дрожат 6 плит | 537 400 | 142 700 | 366 000 | 28 700 | **4** | -| провалы + полёт, ПИК | **1 437 150** | 142 700 | **663 250** | **631 200** | **5–6** | -| максимум по секции | | 142 830 | **805 000** | **631 800** | | - -**После оптимизации (`af189a1`, 2026-08-17):** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| было | 1 437 150 | 142 830 | 805 000 | 631 800 | -| стало | **916 458** | 142 830 | **546 900** | **270 510** | -| | −36 % | — | −32 % | −57 % | - -**Регресс после обхода уровней 1-2 (`ec1f384`, 2026-08-17), 418 кадров:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после оптимизации (`af189a1`) | 916 458 | 142 830 | 546 900 | 270 510 | -| после фиксов ур. 1 (`40f0d46`) | 873 930 | 158 874 | 417 630 | 379 482 | -| **после фиксов ур. 2 (`ec1f384`)** | **878 550** | **158 880** | **419 526** | **379 488** | - -Фиксы второго уровня (чёрные бары, чит бессмертия) на бюджет не повлияли: -разница с предыдущим замером +4 620 работы и +1 896 зелёной — шум прогона. - -**Регресс после обхода уровней 3-7 (`3bcaf51`, 2026-08-18), 2435 кадров:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после фиксов ур. 2 (`ec1f384`) | 878 550 | 158 880 | 419 526 | 379 488 | -| **после фиксов ур. 3-7 (`3bcaf51`)** | **880 170** | **159 774** | **419 520** | **380 244** | -| разница | +1 620 | +894 | −6 | +756 | -| | +0,2 % | +0,6 % | 0,0 % | +0,2 % | - -Все четыре секции — в пределах шума прогона (сравнить с +4 620 / +1 896 -выше, которые уже признаны шумом). Зелёная совпала с точностью до 6 тактов. - -Что за это время добавилось в горячий путь: `pop_spike_frame` и -`pop_chomp_pose` (SPIKE-BAKED) — один резидентный `call` на слой и ТОЛЬКО на -тайлах-ловушках, в этой комнате их нет; и снятие раннего выхода для трупа -(DIED-ON-BUTTON) — цепочка физики на мёртвом Киде, а он тут жив. Замер это -подтверждает: цена не сдвинулась. - -Распределение периода тоже совпало с эталоном кадр в кадр: **3 растра в -2408 кадрах, 4 в 24, 5 в одном** — против «3 в 392, 4 в 24, 5 в одном» -у `ec1f384` (кадров в этом прогоне больше просто потому, что дольше стояли в -покое после каскада). То есть за бюджет вылезает ровно тот же кусок сцены и -ровно на столько же кадров. - -**Регресс после обхода уровней 8-9 (`0dd2f6a`, 2026-08-18), 2701 кадр:** - -| максимум по секции | работа | синяя | зелёная | циан | -|---|---:|---:|---:|---:| -| после фиксов ур. 3-7 (`3bcaf51`) | 880 170 | 159 774 | 419 520 | 380 244 | -| **после фиксов ур. 8-9** | **880 272** | **159 822** | **419 562** | **380 202** | -| разница | +102 | +48 | +42 | −42 | - -Разброс ±100 тактов на 880 000 — это 0,01 %, то есть чистый шум прогона -(циан вообще ушёл в минус). Период снова совпал кадр в кадр: 4 растра в -24 кадрах, 5 в одном. - -Что добавилось за это время и почему не подорожало: фиксы стража -(`c40ae3f`) правят только вход в комнату — кода в кадре не прибавилось; фикс -боя у шва (`a498255`) добавил два сравнения в `check_leave`, а в этой сцене -Кид неподвижен и до порогов не доходит. Отладочная трасса `DBG_KIDOBJ` -выключена дефайном и в сборку не попадает. -Скачок циан на фиксах ПЕРВОГО уровня (270 510 → 379 482) объяснён там же: -восстановлены потерянные половины слоёв (`set_redraw2`, ряд −1 foretable), то -есть это плата за корректность, а не регрессия. - -Период кадра по прогону: **3 растра в 392 кадрах, 4 в 24, 5 в одном** — то -есть за бюджет вылезает только сам каскад. - -Цель — каждая секция ≤ 400 000. **Синяя и циан в бюджете**; зелёная 419 526, -то есть 1,05× цели (и ниже растрового кадра 430 000), остаток разобран в -[`perf_green_phase.md`](perf_green_phase.md) §3 (нужен раскол `draw_tile` на -узкие части, как в оригинале) и в идее G8 (сузить инвалидацию соседнего тайла -до 28-пиксельной полосы). - -Где что расходуется и как это чинить — в фазовых документах: -[зелёная](perf_green_phase.md), [циан](perf_cyan_phase.md). - -### Общий вывод по пиковому кадру базового замера (1 437 150) - -| | такты | доля | -|---|---:|---:| -| блиты (все 27–28 вызовов `pop_blit_b`) | 488 100 | 34 % | -| из них «железный» минимум пикселей (модель `198*h + 5,96*w*h`) | ~150 000 | 10 % | -| синяя (ввод + heal + логика) | 142 700 | 10 % | -| **наши накладные: `draw_tile`, IX-кадры, диспетчер, пометки** | **~1 150 000** | **~80 %** | - -Узкое место — НЕ передача пикселей (она на пределе железа, 3+3 такта на байт, -memory `blit_cost_model`), а 16-битная арифметика в стековых кадрах. - ---- - -## 5. Габариты спрайтов: можно ли всё перевести на `uint8_t` - -Просканированы каталоги ВСЕХ `.atl` (109 файлов) и исходные PNG наборов -`TITLE`/`PV` — тех, что понадобятся для интро, финала и роликов между -уровнями. - -**Игровой кадр — весь укладывается в байт:** - -| набор | максимум | -|---|---| -| фон подземелья/дворца (`*_env*`, `*_wall`, `*_fore`, `pop_pot`) | **48 × 63** | -| Кид (`kid0..27`, `sword`) | **56 × 63** (kid3, idx 0) | -| страж / скелет / Джафар | **53 × 42** | -| спрайты комнаты принцессы (`PV.DAT`: персонажи, песочные часы, факел, звёзды) | **49 × 60** | - -**Больше 255 — только полноэкранные подложки титров и сюжетных экранов.** -Их восемь, и все рисуются ОДИН раз при показе экрана: - -| ресурс | размер | где (`data.h`, `full_image[]`) | -|---|---|---| -| `TITLE/res51` | 320 × 200 | `TITLE_MAIN`, xpos 0 ypos 0 | -| `TITLE/res41` | 320 × 200 | `STORY_FRAME`, xpos 0 ypos 0 | -| `PV/res951` | 320 × 200 | фон комнаты принцессы (`chtab_9_princessbed`) | -| `TITLE/res42..res45` | 272 / 267 / 264 / **256** × 134..142 | «presents», «Prince of Persia», «Mechner» | -| `TITLE/res54` | 272 × 65 | заголовок Hall of Fame | - -Высота нигде не превышает 200 — в байт лезет. По ширине не лезут ровно эти -восемь, и ни одна из них не участвует в игровом кадре. - -**Вывод: горячий путь можно переводить на 8-битные габариты целиком.** -Для подложек — решение пользователя (2026-08-17): работу с роликами вынести в -отдельный банк с версиями блита под большие спрайты либо звать libbgi напрямую -— клип и проверка выхода за экран им не нужны (рисуются в x = 0/24/48/96, -заведомо внутри 320×200). Ширина 320 всё равно потребует ДВУХ burst-скобок -акселератора на строку — как уже сделано в `pop_vflip`. - -Существующая страховка уже есть и остаётся: `pop_blit_b` уводит кадр с -`img[1] | img[3] != 0` на общий путь `blit_b_oversize`. - -**Регресс после дня оптимизации 11/15 (`d0ac4b1`, 2026-08-19), 2367 кадров:** - -| максимум по секции | эталон `mob-order-B-done` | сейчас | разница | -|---|---:|---:|---:| -| работа | 913 848 | **911 862** | −1 986 | -| синяя | 159 810 | **149 106** | −10 704 | -| зелёная | 440 418 | **436 494** | −3 924 | -| циан | 393 000 | **382 770** | −10 230 | - -Период: **3 растра в 2341 кадре, 4 в 23, 5 в 2** — как в эталоне. - -Почему сумма минусов по фазам не равна минусу по работе: максимумы разных -фаз достигаются В РАЗНЫХ КАДРАХ (пик синей — не тот кадр, где пик зелёной), -а «работа» здесь — максимум СУММЫ, а не сумма максимумов. - -Что из правок 11/15 сюда дошло: P16 и P2b дали синюю и циан (они про -проверки и луч видимости, а те работают в любой сцене), HEAL-WIDTH дал -зелёную (плита 64 → 58 на шести heal'ах кадра). - -**Зелёная по-прежнему выше растрового кадра** (436 494 против 430 000). -Главный оставшийся кандидат именно для этой сцены — **P9 (G8)**: при -падении плиты помечаются ДВА тайла, и соседний перезапекается целиком и -повторно (`draw_tile` соседа дважды на одну пометку), хотя потревожены у -него только левые 28 пикселей. При шести падающих плитах это умножается -на шесть. - -**ВАЖНО ДЛЯ ПРОЦЕССА.** Этот прогон вскрыл регрессию, которую не поймали -ни хост-тесты, ни сцена 11/15: гейт `loose_any` (позиция P5) не взводился -в `check_fall_flo`, и плиты уровня 13 дрожали, не падая. Сцену 13/23 надо -прогонять после КАЖДОЙ правки loose-механики, а не только когда меняешь её -сознательно. diff --git a/applications/SprPoP/docs/perf_registry.md b/applications/SprPoP/docs/perf_registry.md deleted file mode 100644 index 18fbbc5..0000000 --- a/applications/SprPoP/docs/perf_registry.md +++ /dev/null @@ -1,871 +0,0 @@ -# Реестр оптимизаций: всё отложенное, в одном списке - -Собрано 2026-08-19 из [`perf_green_phase.md`](perf_green_phase.md) (G1-G9), -[`perf_cyan_phase.md`](perf_cyan_phase.md) (C1-C7), -[`perf_backlog.md`](perf_backlog.md) (позиции 1-7), -[`../TASKS_OPEN.md`](TASKS_OPEN.md) (HEAL-WIDTH) и из -свежего разбора сцены [`perf_l11_room15.md`](perf_l11_room15.md). - -**База для процентов — работа кадра в 11/15: 801 768 тактов** (замер -`09f32ce`). Где эффект относится к другой сцене, это сказано явно. - -Оценки помечены: **[замер]** — измерено; **[модель]** — посчитано по -измеренным составляющим; **[гипотеза]** — не мерено, нужен прогон. - ---- - -## 1. Цена одного блита фона — разложена [замер 2026-08-19] - -Метод: брейкпоинты на резидентных адресах внутри `pop_blit_b` (0x5C50), -`temp0` на входе, разница `totalcycles` на каждом вызове. 1603 блита. - -| этап | такты | постоянство | -|---|---:|---| -| пролог + аргументы + грубый отсев | **810** | ровно, всегда | -| `atlas_image` | **672** | ровно, всегда | -| `gfx_w0_map` + чтение шапки ленты + арифметика клипа | **2 400** | ровно, всегда | -| ядро блита (пиксели) | 4 380 … 26 592 | по размеру кадра | -| `pop_cd_touch` | **2 069** (пакетный путь) / 4 115 (настоящая пометка) | почти ровно | -| `gfx_w0_unmap` + эпилог | **175** | ровно, всегда | -| **весь блит** | 10 458 … 32 718, медиана **16 674** | | - -**Фиксированная накладная = 6 126 тактов на любой блит, хоть 8×8.** -У самого дешёвого блита (10 458) это **59 % цены**; у пламени факела 16×18 -пиксели тянут ~1 700 из ~14 000, то есть **12 %**. - -Это и есть ответ на вопрос «почему маленький блит стоит 14 000». Причины -ровно те, о которых спрашивал пользователь: - -- **810 на пролог** — `call ___sdcc_enter_ix`, IX-фрейм и шесть чтений - `N(ix)`: третий и четвёртый аргументы (`int x`, `int ybottom`) идут - СТЕКОМ, каждое обращение 19 тактов Z80; -- **2 069 на `pop_cd_touch`** даже по пакетному пути, где вся работа — четыре - сравнения. Сигнатура `(int x, int y, int w, int h)` = 8 байт аргументов, - два из них через стек; `w`/`h` никогда не больше 64, `y` не больше 255, - то есть три из четырёх могли быть `uint8_t`; -- **2 400 на map + шапку** — `gfx_w0_map` (1 086) + `unmap` (264, платится в - конце) + ~1 000 на чтение четырёх байт заголовка и арифметику; -- **672 на `atlas_image`** — маппинг W3, чтение записи каталога, возврат W3; - размеры при этом читаются и выбрасываются (см. §3, C6). - -**Блитов за кадр в 11/15: 8** [замер] — все в зелёной фазе (6 на `draw_tile` -чомпера, 2 на пламя факелов). Синяя и циан через `pop_blit_b` не ходят -вовсе: heal и персонажи идут своими путями. Значит фиксированные накладные -блита стоят сцене **8 × 6 126 = 49 000 тактов/кадр (6,1 % работы)**. - ---- - -## 2. Модель зелёной фазы 11/15 [модель, сходится с 320 916 замера] - -| статья | такты | доля фазы | -|---|---:|---:| -| 8 блитов фона (из них 6 126×8 = 49 000 накладных) | 133 400 | 41 % | -| диспетчер `draw_tile` (один тайл чомпера) | 56 200 | 18 % | -| цикл `pop_process_trobs` без блитов пламени | 59 100 | 18 % | -| `pop_loose_tick` (плит в комнате НЕТ) | 28 872 | 9 % | -| heal 32×64 в `pop_chomp_redraw` | 34 000 | 11 % | -| шов / ворота соседа | 9 336 | 3 % | - -Больше половины фазы — не пиксели, а обвязка вокруг них. - ---- - -## 3. Список приёмов, отсортированный по эффекту - -### P1. Чомпер: перерисовка неизменной позы ✅ СДЕЛАНО 2026-08-19 — −110 802 - -**Диагноз, с которым позиция заводилась, оказался неполным.** Я приписал -190 260 тактов пометке от факела; зонд `pop_dbg_kind` показал, что все 312 -перерисовок прогона — вид `POP_RD_CHOMP` (полная), а пометку соседа она -просто перебивала. Настоящая причина нашлась сверкой с `animate_chomper` -(seg007:0448): оригинал перерисовывает чомпер **только при фазе < 6**, пять -кадров из пятнадцати, потому что с фазы 5 поза не меняется -(`chomper_fram1 = {3,2,0,1,4,3,3}`). Мы метили тайл каждый кадр. - -Сделано три вещи: условие фазы (с пометкой обеих страниц на фазе 5), новый -вид `POP_RD_CHOMP_ANIM` → `pop_chomp_anim_draw` (три блита поверх огня, порт -ветки `redraw_frames_anim`) и приоритет полной перерисовки над anim в -`pop_set_redraw`. Обе половины работают: замер даёт 40 % полных -перерисовок и 60 % лёгких. - -Работа 768 684 → **657 882** (медиана), зелёная 294 510 → **183 420**. -В 40 % кадров цена осталась прежней — там поза действительно меняется, и это -уже честная работа; резать её дальше только через P7 (раскол `draw_tile`) -или P8 (ширина heal). - -Полный разбор — [`perf_l11_room15.md`](perf_l11_room15.md) §6. - -
    Исходная (неполная) постановка - -Разбор в [`perf_l11_room15.md`](perf_l11_room15.md) §3. Сейчас пометка от -факела обрабатывается как `heal 32×64 + полный draw_tile` (190 260 тактов на -единственный перерисованный тайл кадра); оригинал в этом случае рисует -ТОЛЬКО `draw_tile_anim` — графику чомпера поверх свежего пламени. - -Останется 1-2 блита челюстей ≈ 20 000-33 000. **Риск низкий**: это -сближение с оригиналом, а не отход от него. Побочно снимает широкую пометку -«фон трогали» вокруг тайла чомпера — см. P3. - -
    - -### P2. Синяя фаза разложена [ЗАМЕР 2026-08-19] — гипотеза не подтвердилась - -Замер зондами внутрь обеих половин синей (286 518 тактов): - -| участок | такты | доля работы | -|---|---:|---:| -| ввод + читы | 14 154 | 1,8 % | -| три спецсобытия уровней (skel / mouse / killed_shadow) | **1 650** | 0,2 % | -| `pop_frame_timers` + **луч видимости стража** | **37 032** | 4,8 % | -| `pop_ctrl_tick` | 18 648 | 2,4 % | -| `skip_mask` + **heal двух Char** | **67 734** | 8,8 % | -| `mirror_heal` + `fore_heal` | 2 040 | 0,3 % | -| `kid_tick` (play_seq) | 10 098 | 1,3 % | -| **`pop_phys_tick`** (физика Кида) | **61 266** | 8,0 % | -| `pop_guard_tick` (логика стража) | 19 932 | 2,6 % | -| **`pop_guard_phys_tick`** (физика стража) | **43 980** | 5,7 % | -| боёвка (`sword_hurting` / `sword_hurt` / `delta_hp`) | 9 558 | 1,2 % | -| `guard_fallout` + уход из комнаты | 366 | — | - -**Что оказалось не так, как ждали.** Я предполагал, что дорогие тут -банковые трамплины на спецсобытиях (по аналогии с `pop_clip_char_top`, -8 892 такта за трамплин ради одной проверки). Замер это отверг: три -спецсобытия уровней вместе стоят **1 650** — они гейтятся внутри и на -уровне 11 честно выходят сразу. - -**Настоящие статьи — три:** - -1. **Физика двух Char — 105 246** (61 266 + 43 980), при том что оба - персонажа СТОЯТ и кадр позы не меняется. Это 13,7 % работы кадра и - самая крупная статья синей. Нужен ещё один уровень разбора — внутрь - `pop_phys_tick` (позиция **P2a**, отдельным заходом). -2. **Луч видимости стража — до 37 032** (вместе с `pop_frame_timers`, но тот - заведомо копеечный: три счётчика). Считается КАЖДЫЙ кадр, хотя ни Кид, - ни страж не сдвинулись. Кандидат на гейт «пересчитывать только при - смене позиции или комнаты любого из двоих» — позиция **P2b**, - ожидание −30 000, риск низкий. -3. **heal двух Char — 67 734.** Отдельной правки не требует: он платится - ровно потому, что `skip_mask` никого не пропускает, и уйдёт вместе с - P1/P3. - -Новое, найдено 2026-08-19. - -### P15. Точность метки «фон трогали» ✅ СДЕЛАНО 2026-08-19 — −163 746 / −140 871 - -Постановка пользователя: не перерисовывать стража, пока он не двигается. - -**Две правки, и вторая оказалась решающей:** - -1. **метка**: вместо «маска колонок × три ряда по 63 px» — диапазон y на - каждую колонку (`ymin`/`ymax`, 40 байт на обе страницы). Прежняя - гранулярность склеивала пламя факела (y 33..50) с клинком стоящего - стража (y 59..65), между которыми девять пикселей зазора; -2. **проверка**: `cd_quiet` сверяет спрайт и накладной (клинок, брызги) - ДВУМЯ отдельными прямоугольниками вместо объединённого bbox. - Объединение включает пустой угол: спрайт стража в колонке 8, клинок - уходит в колонку 7 на y 59..65, пламя метит колонку 7 на y 33..50 — - и прямоугольник «спрайт + клинок» цеплял метку углом. - -**Без второй правки первая дала почти ноль** (632 676 против 628 542 до -неё) — это стоит помнить: точность структуры бесполезна, пока запрос к ней -остаётся грубым. - -| | лёгкая позиция | тяжёлая позиция | -|---|---:|---:| -| синяя | 259 050 → **223 902** | 257 520 → **245 808** | -| зелёная | 181 494 → 181 494 | 180 870 → 181 761 | -| циан | 194 262 → **59 406** | 319 842 → **192 090** | -| **работа** | 628 542 → **464 796** | 758 358 → **617 487** | - -В тяжёлой позиции вдобавок исчезли пятирастровые кадры (было 27 %). - -Проверено в MAME: статика чистая, динамика (пробежка, бой, переход в -соседнюю комнату) без хвостов и просвечивания; хост-тесты зелёные. - -Побочно исправлены два собственных дефекта первой редакции: обе страницы -обновлялись по условию, проверяющему только страницу 0 (после -`pop_cd_clear(0)` метка второй переставала расти), и отсутствовала явная -инициализация — пустая колонка обозначается `ymin = 255`, а нули от crt0 -читались бы как «затронута строка 0». - -### P16. Цианные проверки ✅ СДЕЛАНО 2026-08-19 — −25 818 - -Раскладка остатка цианной фазы (59 406) показала, что 47 883 из них — три -вызова, а не отрисовка: - -| вызов | было | стало | -|---|---:|---:| -| `pop_loose_mob_draw` | 978 | 978 (гейт `mobs_live` работает) | -| `guard_over_kid` | 14 424 | **0** | -| `pop_char_skip_mask` | 28 605 | ~21 000 | - -Три правки: - -1. **`cd_sig_same`** — сравнение снимка БЕЗ построения структуры. - `cd_sig_make` записывал тринадцать полей в стековый кадр (через - `-n(ix)`), и лишь потом шёл побайтовый цикл; теперь сравнение идёт прямо - с источником и выходит на первом расхождении. **−8 016**; -2. **`guard_over_kid` по условию** — вопрос «кто поверх кого» не имеет - смысла, когда не рисуется никто. Вызов перенесён ПОСЛЕ `skip_mask` и - идёт только при `skip != 3`. **−14 118**; -3. **`pop_cd_hit_slot`** — проверка «задет ли слот» брала пять аргументов, - три из них стеком (45 % тактов на IX). Теперь координаты берутся из - `pop_cd`, а сравнение вынесено в `hit_rect` с file-scope аргументами. - **−3 684**. - -**Отрицательный результат внутри третьей правки** (не повторять): первая -версия была обёрткой, которая внутри всё равно звала `pop_cd_hit` с пятью -аргументами — стало ХУЖЕ (1799 тактов Z80 вместо 1318). Снимать аргументы -со стека надо у того, кто их читает, а не этажом выше. - -### Отрицательные результаты 2026-08-19 — НЕ ПОВТОРЯТЬ - -Три попытки подряд сделали ХУЖЕ. Общая ошибка в двух из них — я оценивал -правку по СУММЕ ТАКТОВ ИНСТРУКЦИЙ в листинге, а не по реально исполняемому -пути. - -**1. `cd_sig_same` блоком вместо тринадцати сравнений.** Снимок был -переложен так, чтобы сравнивать непрерывные 10 байт начала `pop_char_t` -циклом `do { if (*a++ != *b++) return 0; } while (--i)`. По листингу -функция стала короче (1939 → 1290 тактов), а на машине **стало хуже: -438 978 → 450 426 (+11 448)**. - -Причина: сумма по листингу считает каждую инструкцию ОДИН раз, а тело -цикла исполняется ДЕСЯТЬ раз. Тринадцать линейных сравнений выполняются по -разу каждое и выходят раньше на первом же расхождении. **Урок: короткий -листинг ≠ быстрый код; цикл надо разворачивать в уме.** - -**2. `cd_touch_pb` — пометка «для блита» из file-scope.** `pop_cd_touch` -зовётся из `pop_blit_b` с четырьмя аргументами, хотя тот держит те же -значения в `pb_x`/`pb_top`/`pb_w`/`pb_h`. Специализированный вход без -аргументов дал **438 978 → 442 242 (+3 264)**. - -Причина: в зелёной фазе блиты идут ПАКЕТНЫМ путём (`draw_tile` открывает -`pop_cd_batch`), а там нужны все четыре значения сразу — и в регистрах -(`x`, `y` приходят в HL/DE) они дешевле, чем чтение из статиков. -**Снятие аргументов со стека помогает не всегда: если значение и так живёт -в регистре, статик его туда ещё и загружать заставит.** - -**3. Обёртка `pop_cd_hit_slot` поверх `pop_cd_hit`** (описана в P16): -внутри всё равно звала функцию с пятью аргументами и добавила свои — стало -1799 тактов вместо 1318. Помогло только когда сравнение переехало внутрь. - -### P14. Fore-проход персонажа — от 4 122 до 117 570 [замеры 2026-08-19] - -**Самая НЕСТАБИЛЬНАЯ статья кадра.** Замеры на одной и той же сцене: - -| ситуация | fore-проход | -|---|---:| -| персонаж пропущен (`skip`) | 4 122 | -| стоящий страж | 62 778 | -| живой Кид у чомпера | ~89 000 | -| **труп Кида в челюстях** | **117 570** | - -Растёт от двух вещей: ширины футпринта (широкий кадр смерти, вынутый меч -добавляет колонку) и числа тайлов с передним слоем внутри футпринта (здесь -чомпер со своими зубьями). Отсюда практический вывод: **в бою проход будет -ближе к сотне тысяч, чем к шестидесяти** — кадры выпадов и ударов широкие. - -Замер трупа сделан по просьбе пользователя. Сама по себе эта ситуация не -игровая («когда Кид — труп, игры нет»), но именно она показала верхнюю -границу цены. - -**РАЗБОР 2026-08-19: P14 сводится к P4.** Fore-проход Кида в тяжёлой -позиции (89 268) разложен зондами: - -| участок | такты | -|---|---:| -| вход + `pop_fore_set_clip` + `char_footprint` | 10 872 | -| арифметика границ окна | 3 786 | -| шов ворот + overlay-цикл | 3 294 | -| **цикл `fore_tile` по тайлам** | **67 854** (76 %) | -| `pop_gate_over_char` + хвост | 3 462 | - -А счётчик показал, что цикл обходит **всего 4 тайла**, и 3 из них реально -рисуют (`FORE_ANY != 0`). То есть 67 854 — это НЕ перебор лишних тайлов -(их четыре) и не проверки, а **цена самих блитов переднего слоя**: около -четырёх блитов по ~16 000, из которых 6 765 на каждом — фиксированная -накладная (см. §1). - -**Отсюда вывод для плана:** отдельной «оптимизации fore-прохода» почти нет. -Срезать там можно ровно три вещи, и только первая крупная: - -1. **цену блита (P4)** — 4 блита × 6 765 накладных = ~27 000 из 67 854; -2. `char_footprint` из физики (**P10**) — часть от 10 872; -3. слияние двух трамплинов в банк 2 — ~4 000. - -Иначе говоря, **P4 ускоряет и зелёную фазу (8 блитов), и fore-проход -(4 блита), то есть работает и в статике, и в динамике** — в отличие от -P14, который я считал самостоятельной позицией. - -`pop_char_fore` = два трамплина в банк 2 (`pop_fore_set_clip` + -`pop_fore_over_char`) плюс обход тайлов футпринта, в каждом `fore_tile`. -У Кида дороже, чем у стража, потому что в его футпринте лежит чомпер, а у -чомпера есть собственный передний слой (`POP_CHOMP_FRAM_FOR`), который -перерисовывается поверх персонажа каждый кадр. - -Что можно пробовать, по возрастанию радикальности: - -1. слить два трамплина в один вызов (мелочь, ~4 000); -2. **P10** — брать футпринт из физики, а не считать заново (−11 574 на - проход, то есть до −23 000 на двоих); -3. гейт по сигнатуре: пропускать проход, если не изменились ни кадр - персонажа, ни тайлы его футпринта. **Это расхождение с оригиналом** — - он рисует foretable безусловно; -4. **P13** — objtable и отложенные таблицы: у оригинала «посетить тайл» - стоит копейки именно потому, что таблицы только копят записи. - -### P3. Персонажи будятся каждый кадр ✅ ЧАСТИЧНО СБЫЛОСЬ - -**В лёгкой позиции — да:** после P1 `pop_char_draw(KID)` стоит 204 такта, -метка от чомпера до Кида больше не дотягивается. - -**В тяжёлой позиции — нет:** стоит Киду шагнуть на 7 пикселей вправо, и его -спрайт пересекается с тайлом чомпера и пламени, `skip_mask` перестаёт -пропускать, и он снова стоит ~144 000 (54 738 draw + ~89 000 fore). То -есть выигрыш P3 держится только пока персонаж не подошёл к анимированному -тайлу — а в игре он к нему подходит постоянно. - -Исходная оценка (−70 000) была: - -heal 141 048 + отрисовка 148 566 = 290 000 тактов (36 % работы) уходят на то, -что `pop_char_skip_mask` не может пропустить ни Кида, ни стража: фон трогают -каждый кадр. - -- **Кида** спасает P1: широкая пометка вокруг чомпера исчезнет; -- **стража спасти нельзя** — пламя правого факела (0,7) рисуется в ячейке - (0,8), где он и стоит. Там фон честно меняется, и оригинал персонажа тоже - перерисовывает. - -### P17. 16 бит там, где хватает 8 ✅ 2026-08-19 (замечание пользователя) - -**1. Границы экрана — беззнаковыми сравнениями.** Проверка «спрайт целиком -на экране» стояла как четыре ЗНАКОВЫХ 16-битных сравнения, а знаковое у -SDCC z80 разворачивается в `sbc` плюс `jp PO / xor 0x80 / jp P`. -Беззнаковая форма делает то же двумя: отрицательная координата становится -очень большой и проваливает условие так же, как `>= 0`. **−378.** - -**2. Габариты спрайтов в байтах.** `w`/`h`, `ow`/`oh`, `fpw`/`fph`, -`cw`/`ch` в `pop_cdraw_t`, параметры `cd_overlay_add`/`cd_clip_add`, локали -в `pop_char_draw`/`cd_splash` и чтение габарита из шапки ленты были -`uint16_t`, хотя спрайты атласов не крупнее 64×64 (memory -`pop_sprite_size_limits`). **−276 в статике, −1 134 в циане динамики**, -плюс 24 байта `_DATA`. - -### P6a. Кэш указателя модификаторов ✅ 2026-08-19 — −840 (ждали −20 000) - -`pop_trob_modif` объявлен `__banked`, а звался на КАЖДЫЙ trob внутри цикла -`pop_process_trobs`, хотя комната у них в подавляющем большинстве кадров -одна. Указатель теперь кэшируется между итерациями. - -Цикл trobs 78 726 → **74 964**, работа кадра 438 324 → **437 484**. - -**Оценка в реестре была завышена в двадцать раз**, и стоит понять почему: -я перенёс её по аналогии с лучом видимости (P2b), где трамплин звался -ДЕВЯТЬ раз за кадр. Здесь trob'ов в комнате всего несколько, и кэш -экономит два-три вызова. **Урок: «тот же паттерн» не означает «тот же -порядок величины» — считать надо число вызовов, а не узнавать шаблон.** - -### P6b. Кэш префетча кодов тайлов — НЕ ДЕЛАЛОСЬ - -Префетч (`pop_level_access_begin/end` плюс чтение кода на каждый trob) -стоит **11 058** за кадр. Кэшировать мешает инвалидация: код тайла меняет -`pop_level_set_tile` (кнопка → пол, loose → empty), вход в комнату и -добавление trob'а — пропустить хоть один источник значит получить -застывшую анимацию. С учётом того, что P6a дал 840 вместо 20 000, -ожидаемый выигрыш тут тоже стоит считать скромным, а риск он несёт -несоразмерный. - -### P10. Футпринт из физики — РАЗБОР 2026-08-19 (без реализации) - -Идея из `perf_backlog.md` §1: `redraw_at_char` (seg003:0430) берёт ГОТОВЫЕ -`char_col_left/right`, `char_top_row`, `char_bottom_row`, посчитанные в том -же кадре физикой (`set_char_collision`, seg006:0723), а наш -`char_footprint` (pop_bg.c) считает их заново внутри fore-прохода. - -**Разбор показал, что «просто передать» не получится: величины разные.** - -| | `char_footprint` (банк 2, fore) | `set_char_collision` (банк 3, физика) | -|---|---|---| -| ширина | габарит КАДРА `w` из атласа, `wh = (w+1)/2` | то же `fpw`, но затем **`FRAME_THIN` сдвигает края на ±4** | -| меч | расширяет диапазон на колонку (`sword >= DRAWN`) | не расширяет | -| колонки | `cLraw` до клампа (нужен для шва), затем кламп 0..9 | `coll_xl`/`coll_xr` в пикселях, колонки считает уже `calc_coll_window` | -| ряды | `rT`/`rB` от ВЕРХА и НИЗА спрайта, с форсом `rT = rB-1` | `Char.curr_row` — опорный ряд, это другое | - -То есть у оригинала обе задачи пользуются ОДНИМИ величинами, потому что он -считает их один раз в `set_char_collision`. У нас они исторически -разошлись: коллизии считают своё окно (с поправкой `FRAME_THIN`), fore — -своё (габарит кадра плюс колонка под меч). - -**Значит P10 — это не «передать готовое», а сперва СВЕСТИ обе величины к -одной, как в оригинале.** Работа не механическая: `FRAME_THIN` влияет на -коллизии осознанно (узкие кадры не должны цеплять стену), а fore-проходу -нужен полный габарит, иначе передние грани в крайней колонке не -перерисуются. - -**Чего не хватает для решения:** отдельного замера самого -`char_footprint`. Сейчас известно только «вход + `pop_fore_set_clip` + -`char_footprint` = 10 872», а оценка −11 574 в backlog взята из старого -замера другой сборки. Первым шагом нужен зонд между `set_clip` и -`char_footprint`. - -**Оценка приоритета:** низкая. Даже если `char_footprint` окажется всеми -10 872, он платится только когда персонаж рисуется (в статике fore-прохода -нет), а сведение двух геометрий к одной — это риск для коллизий, то есть -для физики, которая сейчас работает правильно. - -### P18. Метка «фон трогали» огрублена по X — ОТЛОЖЕНО (решение пользователя) - -**Найдено 2026-08-19 пользователем:** Кид перерисовывается, хотя с пламенем -не пересекается; на пиксель левее — перестаёт. - -Разбор по памяти машины. Кид `x = 156`, спрайт занимает **x 213..224**, -экранные y 43..83. Метка колонки 7 — y 33..50 (пламя правого факела). -Колонка считается как `x >> 5`, то есть по 32 пикселя, и спрайт достаёт до -224 — ровно первый пиксель колонки 7. По вертикали пересечение с меткой -настоящее (43..50), поэтому слот считается задетым. - -А по горизонтали пересечения НЕТ: пламя лежит в колонке 7 на x 232..247, -между ним и Кидом восемь пикселей зазора. На пиксель левее спрайт -кончается на 223, `223 >> 5 = 6`, колонка 7 не задета — и перерисовка -пропадает. - -То есть P15 исправил огрубление по Y и оставил его по X. - -**Почему отложено (аргументы пользователя):** - -- x лежит в 0..319 и в байт не влезает — нужен `uint16_t` на границу, то - есть 4 байта на колонку (80 байт на две страницы), и **16-битные - сравнения в горячем пути**. А они у SDCC z80 дороги ровно настолько, - что могут съесть весь выигрыш (см. отрицательные результаты выше); -- огрубить x вдвое (`x >> 1`, диапазон 0..159 влезает в байт) — это лишний - сдвиг и при записи, и при проверке, плюс точность падает до 2 пикселей. - -**Непроверенная идея на будущее:** хранить границы НЕ в экранных x, а как -смещение ВНУТРИ колонки (0..31, пять бит). Тогда байта хватает и сравнение -8-битное, но запись усложняется: прямоугольник, пересекающий несколько -колонок, даёт частичные диапазоны у крайних и полные у средних. - -**Когда браться:** если после других позиций бюджет всё ещё не сойдётся. -Выигрыш будет именно в пограничных положениях, а их в игре много — -персонаж почти всегда стоит рядом с чем-то анимированным. - -### P4. Накладные блита — ОТКАЧЕНО - -**Правка сделана и отменена по решению пользователя.** Критерий: если -выигрыш получен ценой сильно усложнённого кода — откатывать. - -Что было: `atlas_image_w0` в libbgi читал каталог из уже подключённой в W0 -страницы. **−408 на кадре** при ожидании −5 400. - -Почему откачено: цена — вторая публичная функция в API libbgi с НЕЯВНЫМ -контрактом («страница обязана быть подключена до вызова»), которую легко -вызвать неправильно и молча получить мусор, плюс дублирование чтения -каталога. 408 тактов — 0,09 % кадра, меньше разброса между прогонами. - -**Что осталось знанием:** сам `gfx_w0_map` стоит всего **324** такта, а 672 -у `atlas_image` — это почти целиком вызов функции и арифметика `idx * 8`. -Значит непробованная часть P4 («один map на группу блитов») имеет потолок -~2 600 за кадр, а не 10 000, как считалось. - -Ожидание было −5 400 (672 такта × 8 блитов зелёной фазы), и оно НЕ -оправдалось: цена блита 16 107 → 16 005, то есть −102. Причина в том, что -эти 672 — почти целиком вызов функции и арифметика `idx * 8`, а не само -переключение окна. Замер после правки показывает, что работа просто -переехала между статьями: - -| этап | до | после | -|---|---:|---:| -| пролог + отсев | 810 | 762 | -| `gfx_w0_map` | (в составе 2 400) | **324** | -| каталог + шапка ленты + клип | | **2 694** | -| ядро | 8 508 | 8 508 | -| `cd_touch` + `unmap` + эпилог | 2 883 | 2 883 | -| **фиксированная накладная** | **6 765** | **6 663** | - -Правка оставлена: не вредит, убирает лишнее переключение W3 и делает -контракт честнее (страница мапится один раз). Но как способ снять -накладные она не работает. - -**Что осталось непробованным** (и во что я теперь верю меньше): один -`gfx_w0_map` на ГРУППУ блитов — судя по замеру, сам map стоит 324, так что -потолок этой правки ~2 600 за кадр, а не 10 000, как считалось. - -
    Исходная постановка (модель −28 000) - -| правка | на блит | источник | -|---|---:|---| -| `pop_cd_touch`: `uint8_t` вместо `int` для `y`/`w`/`h`, ранний выход пакетного пути | ~−1 300 | новое | -| один `gfx_w0_map`/`unmap` на ГРУППУ блитов | ~−1 350 | C5 / backlog §3 | -| размеры ленты из каталога, без `atlas_image` и чтения шапки | ~−670 | C6 / backlog §2 | -| `pop_blit_b`: аргументы в 8 бит, где хватает | ~−400 | новое | - -Все четыре — низкий риск, механическая работа. Вместе снимают ~3 700 из -6 126 фиксированных. - -
    - -### P5. `pop_loose_tick` при пустой комнате — 28 872 → 2 760 ✅ СДЕЛАНО 2026-08-19 - -**Получено −26 112 внутри функции, −33 840 на кадре** (замер до/после в -11/15). Оценка была −28 000. - -Раскладка холостого хода (замер зондами m9..m12) и что с ней стало: - -| участок | было | стало | -|---|---:|---:| -| два цикла по тайлам (30 + 10 позиций) | 9 852 | **132** | -| `pop_loose_mob_tick` (обход 14 слотов) | 12 090 | **996** | -| `check_loose_fall_on_kid` (трамплин + обход) | 5 868 | **546** | -| вход + хвост | 1 062 | 1 086 | -| **итого** | **28 872** | **2 760** | - -Сделано двумя гейтами: - -- `loose_any` (статик `pop_map.c`) — «идёт ли анимация плит». Ставится в - пяти местах записи ненулевой фазы, снимается САМИМ циклом по факту - прохода, где не осталось ни одной живой фазы; -- `pop_mob_busy` (резидент `pop_state.c`) — «занят ли хоть один слот - падающего куска» (`active` или дочистка `clean`). Ставит `mob_alloc`, - снимает обход по факту пустой таблицы. В резиденте, а не в `pop_room.c`, - потому что читает его `pop_map` из банка 3. - -**Важно про границу:** гейт отвечает не на «есть ли в комнате плиты», а на -«идёт ли анимация». У лежащей плиты-потолка фаза 0, и крутить нечего — -вопрос пользователя 2026-08-19. Асимметрия намеренная: ложная единица -стоит одного холостого прохода, ложный ноль — застывшей навсегда плиты, -поэтому взвод стоит рядом с КАЖДОЙ записью, а снятие только по факту. - -Покрытие: `phys_loose_floor_breaks` (взвод от шага и сотрясения) и новый -`phys_loose_gate_survives_room_change` — на пятое место взвода -(фаза восстановлена входом в комнату), которое не покрывал никто. -Мутационная проверка: со снятым взводом тест падает. - -### P6. `pop_process_trobs` разложен [ЗАМЕР 2026-08-19] — 89 784 - -| участок | такты | -|---|---:| -| вход + префетч кодов тайлов (маппинг окна 0) | **11 058** | -| цикл: два `pop_torch_draw` | ~36 000 | -| цикл: обход самих trob'ов | ~43 000 | - -Цена одного `pop_pot_b` (пламя факела) измерена отдельно, брейкпоинтами на -резидентных адресах: **17 346 тактов**, и это ЕДИНСТВЕННАЯ группа в -распределении — то есть `pop_pot_b` в кадре зовут только два факела. При -канвасе пламени 16×18 сами пиксели там 1 716, то есть **10 % цены**; всё -остальное — накладные (см. §1) плюс ~6 900 сверх `pop_blit_b` на самом -`pop_pot_b`. - -Направления: - -- **P6a**: `pop_trob_modif(room)` зовётся банковым вызовом на КАЖДЫЙ trob - внутри цикла, хотя комната у них одна и та же — вынести наружу; -- **P6b**: префетч 11 058 маппит окно 0 каждый кадр, а коды тайлов trob'ов - меняются редко — кэшировать с инвалидацией по смене тайла/комнаты; -- **P6c**: цена факела — это цена блита, то есть позиция P4. - -Новое, найдено 2026-08-19. - -### P7. G5. Раскол `draw_tile` на узкие части [оценка дока: −50 000 … −60 000] - -Диспетчер + контекст оплачиваются целиком всегда; у оригинала это девять -независимых функций. В 11/15 это те самые 56 200 на один тайл — но если -сделан P1, `draw_tile` чомпера вообще не вызывается, и здесь эффект пропадёт. -Ценность приёма — в ДРУГИХ сценах (13/23, любая комната с плитами). - -**Риск средний**: в `draw_tile` собрано много инвариантов (BUG-LOOSE-3, -BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным заходом с прогоном -всех уровней. - -### P8. HEAL-WIDTH — ширина heal'ов по фактическому следу [оценка: 5-6 % цены heal'ов] - -ОБЯЗАТЕЛЬНАЯ по решению пользователя (2026-08-18). След плиты 58 px в -подземелье / 57 во дворце против используемых 60 и 64. -Постановка — `TASKS_OPEN.md`, якорь `heal-width`. - -### P9. G8 — пометку СОСЕДА ставить узкой полосой (28 px), а не тайлом [гипотеза] - -Парная к HEAL-WIDTH. Относится к сценам с падающими плитами (13/23), в 11/15 -не играет. Разбор — `perf_green_phase.md` §G8, там же три условия, из-за -которых это не «просто уменьшить число». - -### P10. Футпринт персонажа — из физики, а не считать заново [замер: −11 574 на fore-проход] - -`backlog` §1. С двумя персонажами — ~23 000 за кадр. Мешает то, что физика -(банк 3) держит `char_col_left/right` в статиках, а слой фона — банк 2. -**Риск средний**: окно fore-клипа заводилось под клинок и брызги. - -### P11. Мелочи с известной ценой [замер, `backlog` §7] - -| что | цена | где | -|---|---:|---| -| `pop_clip_char_top` — трамплин банк 4 → банк 3 ради одной проверки | 8 892 | `pop_cdraw.c` | -| `cd_sig_make` + возврат из `pop_char_draw` | 7 944 | `pop_cdraw.c` | -| `pop_loadkid` + расчёт координат кадра | 7 410 | `pop_cdraw.c` | -| `obj_x * 8 / 7` — последнее `__divsint` в горячем пути | ~2 400 | `pop_char_draw` | - -### P12. G9 — снять временную оснастку [замер: −6 000] - -`pop_dbg_b1..b6` в `pop_blit_b` (~400 на блит), `pop_dbg_kind`/`m16`, -`pop_dbg_m5..m15`, счётчик `rd_cnt` в `pop_redraw_needed`. -**Только ПОСЛЕ окончания оптимизации** — без них не мерить. - -### P13. Крупные рефакторинги — брать, только если понадобится ещё запас - -**Чем P13 НЕ является (вопрос пользователя 2026-08-19).** Это не «рисовать -комнату заново каждый кадр в скрытый буфер». Такой вариант исключён -арифметикой: 30 тайлов по 5-6 спрайтов при цене блита 16 674 (и 179 914 за -полную запечку одного тайла) дают порядка **3 000 000 тактов — семь -растровых кадров**. Оригинал так тоже не делает: у него та же -инкрементальная схема с пометками (`redraw_frames_full` / `_anim` / -`_fore`), перерисовываются только помеченные тайлы. - -Разница не в объёме отрисовки, а в цене ПОСЕЩЕНИЯ тайла: у нас -`fore_tile(r, c)` сразу блитит (со всеми 6 126 фиксированных накладных), а -у оригинала `add_backtable`/`add_midtable`/`add_foretable` только кладут -запись в массив, и рисует один `draw_table()` в конце. Плюс у него ОДИН -обход тайлов за кадр против наших трёх. - -- **C7 / backlog §5-6: objtable + отложенные таблицы back/mid/fore.** У - оригинала «посетить тайл» стоит копейки, потому что таблицы только копят - записи, а рисует один `draw_table()` в конце. У нас блит идёт сразу из - обхода, и fore-проход отдельный НА КАЖДОГО персонажа. -- **backlog §4: единый проход по тайлам вместо трёх** (`pop_redraw_needed`, - `pop_process_trobs`, `pop_fore_over_char`) и семь счётчиков причин - перерисовки вместо одного `kind`. -- **G6: меньше блитов в `RD_FLOOR`**, **G7: `mob_tick_one` в file-scope**. - ---- - -## 4. ПЛАН РАБОТ — состояние между сессиями - -Рабочий чеклист. Правило: одна позиция = один заход = один коммит с замером -до/после на сцене 11/15. Замер обязателен даже когда «очевидно» — из семи -закрытых позиций ТРИ дали не то, что ожидалось (P1 — вдвое меньше, P2a — -почти ничего, таблицы порогов — регресс). - -### Закрыто - -| # | что | факт | -|---|---|---| -| P15 | точность метки «фон трогали» + раздельная проверка клинка | **−163 746** лёгкая / **−140 871** тяжёлая | -| P16 | цианные проверки: снимок без структуры, `guard_over_kid` по условию, `hit_slot` без пяти аргументов | **−25 818** | -| P5 | `loose_tick`: гейты холостого хода | **−33 840** (ждали −28 000) | -| P1 | чомпер: перерисовка только при фазе < 6 | **−110 802** (ждали −160 000) | -| P2b | луч видимости: колонки + один банковый вызов | **−26 448** (ждали −30 000) | -| P2a | `coll_scan` в 8 бит + снят с IX | **−2 892** (крупной статьи в физике нет) | -| P3 | Кид перестал будиться каждый кадр | сбылось само после P1 — но только в ЛЁГКОЙ позиции | -| P2/P6 | замеры синей фазы и `process_trobs` | гипотеза «трамплины на спецсобытиях» отвергнута | -| — | замер цианной фазы | крупного лишнего в отрисовке персонажа нет | - -### Осталось, по убыванию ожидаемого эффекта - -| # | что | ожидание | риск | комментарий | -|---|---|---:|---|---| - -| P4 | накладные блита — 6 663 на КАЖДЫЙ блит | частично сделано: **−408** | низкий | из четырёх правок сработала слабо; разбор ниже | -| P14 | fore-проход персонажа | сводится к P4 + P10 | — | разбор ниже: цикл обходит всего 4 тайла | -| P11 | мелочи с известной ценой | −26 000 | низкий | `clip_char_top` 8 658 подтверждён замером | -| P10 | футпринт персонажа из физики | ? (нужен замер) | **высокий** | разбор ниже: величины физики и fore РАЗНЫЕ | -| P6a/P6b | `trob_modif` из цикла, кэш префетча | −20 000 | низкий | тот же паттерн трамплина в цикле | -| P7 | раскол `draw_tile` (G5) | −50 000 в 13/23 | средний | в 11/15 не играет | -| ~~P8~~ | HEAL-WIDTH | ✅ сделано: плита 64→58, чомпер 64→61 | — | эффект ждёт прогона 13/23 | -| P9 | G8 — пометка соседа полосой | не оценено | средний | для сцен с плитами | -| P13 | objtable + отложенные таблицы, единый проход по тайлам | не оценено | очень высокий | большой рефакторинг слоя фона | -| P12 | снять оснастку | −6 000 | нулевой | **последней**: без неё не мерить | - -### Текущее состояние бюджета - -| | работа | синяя | зелёная | циан | период | -|---|---:|---:|---:|---:|---:| -| до оптимизации | 801 768 | 293 238 | 320 916 | 187 758 | 4 растра | -| после P5 | 767 928 | 285 864 | 294 384 | 187 764 | 4 | -| после P1 (медиана) | 657 882 | 286 503 | 183 420 | 187 761 | 4 | -| после P2a | 654 990 | 283 215 | 183 798 | 187 812 | 4 | -| **после P2b (лёгкая позиция)** | **628 542** | 259 500 | 181 068 | 187 761 | 4 | -| ТЯЖЁЛАЯ позиция (Кид на шаг правее) | 758 358 | 257 520 | 180 870 | 319 842 | **4 и 5** | -| **после P15, лёгкая** | **464 796** | 223 902 | 181 494 | **59 406** | 4 | -| после P15, тяжёлая | 617 487 | 245 808 | 181 761 | 192 090 | **4 везде** | -| после P16, лёгкая | 438 978 | 218 052 | 181 494 | 39 438 | 4 | -| ~~после P4~~ | ~~438 570~~ | | | | правка **ОТКАЧЕНА** | -| после P17, лёгкая | 438 324 | 217 590 | 181 098 | 39 192 | 4 | -| **после P6a, лёгкая** | **437 484** | 217 704 | 180 252 | 39 306 | 4 | -| **после P17, тяжёлая** | **603 684** | 241 956 | 181 464 | 180 270 | 4 | - -Итог восьми позиций: **801 768 → 464 796 в лёгкой позиции (−42 %)** и -**758 358 → 617 487 в тяжёлой (−19 %)**. Отдельно важно: в тяжёлой позиции -исчезли пятирастровые кадры (было 27 %), период стал ровно 4 — рывки ушли. - -### Достижима ли цель — арифметика на 2026-08-19 - -Цель: работа ≤ 430 000, тогда период станет 3 растра (хвост кадра — три -`gfx_wait_vsync`). - -- в ЛЁГКОЙ позиции снять надо **7 484**; -- в ТЯЖЁЛОЙ — **173 684**. - -**Лёгких путей больше не осталось.** За 2026-08-19 отвергнуто ЧЕТЫРЕ -правки подряд (три с регрессом, одна почти без эффекта), и все они целили -в накладные проверок и блита. Фиксированная часть блита 6 663 держится -ядром `gfx_w0_map`/`cd_touch`/чтения шапки, а не «лишними» вызовами. - -Всё оставшееся в списке, кроме P13, даёт по оценкам **порядка 100 000** — и -это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами, -чомпером и двумя факелами в три растра не укладывается без одного из трёх -решений: - -1. **P13** — переход на objtable и отложенные таблицы, как в оригинале - (единственный резерв нужного размера, но это переписывание слоя фона); -2. **осознанное расхождение с оригиналом** — например, не перерисовывать - передний слой персонажа, пока не изменились ни персонаж, ни тайлы под - ним (гейт по сигнатуре футпринта); -3. **принять 4 растра** как рабочий режим для сцен такой плотности и - выравнивать период, чтобы не было рывков 4/5. - -Решение за пользователем — это выбор между точностью порта и скоростью. - -### Как воспроизвести сцену (важно для следующей сессии) - -Сборка стартует прямо в ней: `make` (дефолты `LEVEL=11 ROOM=15 POS=2`) → -`make hdd` → **полный рестарт MAME** (`chdman -f` даёт новый inode, memory -`mame_hdd_rebuild_restart`) → в DSS набрать `d:` и `SprPoP`. Кид встаёт в -(0,2) лицом к чомперу, справа факел и страж — та самая сцена замеров. -Штатный старт уровня возвращается через `make ROOM=`. - -Проверка, что программа ЖИВА, обязательна перед любым чтением памяти: -`cur_room` (0x97AA) должен лежать в 1..24 — на этом уже был сорван один -замер (прочитаны два случайных байта остановленной машины). - -### Метод замера - -Зонды — `out (_io_border)` в `sprpop.c` (база модуля 0x42AD) плюс -резидентные пустышки `pop_dbg_m*` из `pop_state.c`. Адреса брать ЗАНОВО из -`.sprinter-cc-build/.sprinter-cc-sprpop/sprpop.map` после каждой пересборки. Скрипты -сессии: `perfrun.py <сек> tag=addr ...` и `parseseq.py <файл> ПОСЛЕД`. - -Цену отдельной РЕЗИДЕНТНОЙ функции можно снять вообще без пересборки: -`bpset <вход>,1,{temp0=totalcycles; g}` плюс `bpset <точка>,1,{printf "… -%d",totalcycles-temp0; g}`. Так разложен блит в §1. - ---- - -## 5. Сводка: что сколько даёт в 11/15 - -| # | приём | эффект | тип оценки | риск | -|---|---|---:|---|---| -| P1 | чомпер: только anim-слой | −160 000 | модель | низкий | -| P3 | Кид перестанет будиться | −70 000 | модель | следствие P1 | -| P2 | логика двух Char | −40 000 … −70 000 | гипотеза | ? | -| P4 | накладные блита (4 правки) | −28 000 | модель | низкий | -| P5 | `loose_tick` без плит | ✅ −33 840 | ФАКТ | сделано | -| P6 | цикл `process_trobs` | −20 000 … −40 000 | гипотеза | ? | -| P10 | футпринт из физики | −23 000 | замер | средний | -| P11 | мелочи (4 штуки) | −26 000 | замер | низкий | -| P12 | снять оснастку | −6 000 | замер | нулевой | -| P7 | раскол `draw_tile` | 0 здесь (−50 000 в 13/23) | оценка | средний | -| P8/P9 | HEAL-WIDTH / G8 | 0 здесь (сцены с плитами) | оценка | низкий/средний | - -Верхняя часть списка (P1 + P3 + P4 + P5) — **около −286 000 из 801 768, то -есть 36 % работы кадра**, и вся она низкого риска. Этого хватит, чтобы -сцена ушла с 1,86 растрового кадра до ~1,2 — но НЕ хватит, чтобы период -кадра упал с 4 растров до 3: для этого работа должна уложиться в 430 000, -то есть нужны ещё ~90 000 сверху (P2 или P6). - ---- - -## 5б. Цианная фаза разложена [ЗАМЕР 2026-08-19] - -Фаза 188 004 тактов, и она НЕ менялась ни от P1, ни от P5, ни от P2b. - -| участок | такты | -|---|---:| -| `check_mirror` | 3 198 | -| `loose_mob_draw` + `guard_over_kid` + `skip_mask` | **34 374** | -| **`pop_char_draw(KID)`** | **204** | -| **соперник: `char_draw` + `char_fore`** | **145 896** | -| `fore_needed` + `hp_draw` | 2 598 | -| `char_fore(KID)` + борта | 1 758 | - -**Кид уже пропускается** — 204 такта, то есть надежда P3 всё-таки сбылась -после P1: метка от чомпера до него больше не дотягивается. А страж -перерисовывается каждый кадр, и это ЧЕСТНО: пламя правого факела (0,7) -рисуется в ячейке (0,8), где он стоит, и реально накрывает ему голову -(пламя занимает y 5..22, страж 12..62). - -Отрисовка стража (148 302) по частям: - -| участок | такты | доля | -|---|---:|---:| -| **`pop_char_fore`** (два трамплина в банк 2 + обход тайлов) | **62 778** | 42 % | -| клинок: `pop_sword_draw` + `cd_overlay_add` + `cd_clip_add` | 27 522 | 19 % | -| блит спрайта + `clip_char_right` | 20 982 | 14 % | -| загрузка кадра и геометрия | 12 696 | 9 % | -| **`pop_clip_char_top`** (трамплин банк 4 → банк 3) | 8 658 | 6 % | -| снимок прямоугольника + `cd_clip_add` | 7 890 | 5 % | -| `gfx_w0_unmap` + `cd_sig_make` | 4 968 | 3 % | -| вход + `cd_heal` | 2 946 | 2 % | - -**Вывод: крупного лишнего здесь нет.** Единственная явно лишняя статья — -трамплин `clip_char_top` (8 658), и убрать его непросто: функции нужны -`get_tile` и таблицы деления из банка 3, а перенос в резидент вернёт тот же -трамплин внутрь. Всё остальное — работа, которую персонаж действительно -делает: рисует себя, клинок и передний слой поверх себя. - -## 6. Иерархия референсов (уточнена 2026-08-19) - -Сравнение трёх реализаций луча видимости показало, что источники не -равноценны, и это важно для ЛЮБОЙ будущей оптимизации: - -| источник | что берём | чего НЕ берём | -|---|---|---| -| **Apple II** (`Prince-of-Persia-Apple-II`) | как это делается на 8 битах: таблицы вместо делений, борьба за такты | ничего — но код на 6502, читать сложнее | -| **SDLPoP** | эталон ПОВЕДЕНИЯ (декомпиляция DOS-версии) | реализацию: она нарочно «расслаблена» под 32 бита | -| **mininim** | разбор краевых случаев, второе мнение о замысле | алгоритмы — переписан с нуля, механика местами своя | - -Доказательство на конкретном месте: `get_tile_div_mod` в SDLPoP содержит -комментарий - -```c -// DOS PoP does this: -// obj_xl = tile_mod_tbl[xpos]; -// return tile_div_tbl[xpos]; -``` - -а вместо этого делает `x % TILE_SIZEX` и `x / TILE_SIZEX`. Таблицы в файле -лежат, но нужны только для эмуляции чтения DOS-версии ЗА ГРАНИЦЕЙ массива. -Apple II (`CTRLSUBS.S`, `GETBLOCKX`) читает ровно `BlockTable[x]`. - -**Правило:** сверять поведение по SDLPoP, а реализацию под 8 бит — по -Apple II и по комментариям вида «DOS PoP does this» в самом SDLPoP. - -## 7. Повторяющийся источник цены: банковый трамплин в цикле - -Уже трижды крупнейшей статьёй оказывался не алгоритм, а вызов `__banked`- -функции ИЗ ЦИКЛА, идущего в другом банке: - -| место | цена | лечение | -|---|---:|---| -| луч видимости: `pop_tile_at` по колонке (P2b) | 36 786 → 13 002 | один вызов на весь отрезок | -| `pop_clip_char_top` — банк 4 → банк 3 ради одной проверки | 8 892 | не сделано (P11) | -| `pop_trob_modif(room)` на каждый trob в цикле | не мерено | не сделано (P6a) | - -**Что проверять в первую очередь при новом «дорогом» месте:** не сколько -там арифметики, а сколько раз за кадр пересекается граница банка. - -## Фиксированный логический кадр (2026-08-19) — МЕНЯЕТ ВСЕ ЦЕЛЕВЫЕ ЧИСЛА - -Период логического кадра больше не `ceil(W) + 2`, а `max(n, ceil(W))` -(`src/pop_pace.c`, разбор — `frame_pacing_plan.md`). Поэтому: - -- **Бюджет кадра вырос с 430 080 до 1 290 240 тактов** (n = 3, режим - FASTEST по умолчанию). Все записи этого реестра, где «работа сверх - 430 000 стоит сразу целого растра», СЧИТАТЬ УСТАРЕВШИМИ. -- 13/23 (максимум работы 911 862) теперь укладывается в период 3 растра — - проверено, ни одного кадра длиннее. Прежний профиль был 3/4/5. -- Оптимизация из спешной стала плановой: смысл резать такты остался - (режим NORMAL при n=4 и бой при n=5 дают ещё больше запаса, а FASTEST — - верхнюю планку скорости), но «свалиться за растр» больше не обрыв. -- Цена самого пейсинга — ≈4 000 тактов на кадр (0,9 %), замерено A/B. - -Приоритет P9 (G8) и остальных позиций от этого не меняется, но их -СРОЧНОСТЬ падает: они больше не спасают от скачка периода. diff --git a/applications/SprPoP/docs/prng_alternatives.md b/applications/SprPoP/docs/prng_alternatives.md deleted file mode 100644 index b5ed432..0000000 --- a/applications/SprPoP/docs/prng_alternatives.md +++ /dev/null @@ -1,148 +0,0 @@ -# Генераторы псевдослучайных чисел: запасные варианты - -Что сейчас стоит в порте, какие есть альтернативы и сколько на них реально -можно выиграть. Заготовка на случай, если упрёмся в бюджет кадра — -**сейчас менять ничего не нужно**. - -## Что стоит сейчас - -`pop_geom.c`, ветка `POP_PRANDOM_EXACT=1` (по умолчанию) — LCG оригинала -`s = s*214013 + 2531011`, шаг написан на Z80-ассемблере (единственное такое -место в порте). Схема Горнера по разреженной записи константы: - -``` -214013 = ((((1<<1)+1)<<2 + 1)<<4 + 1)<<10 - 3 -``` - -17 удвоений, три сложения, одно вычитание; величина `3*s`, нужная в конце, -попадается по дороге на втором шаге. Тело — **≈1 020 тактов** по статическому -подсчёту. Бит-в-бит совместим с SDLPoP, поэтому по картинке можно сверяться -с эталоном. - -Вторая ветка, `POP_PRANDOM_EXACT=0` — xorshift16 + шаг Вейля на C. -Совместимость теряется. - -Замер в MAME, комната 3, 175 кадров (медиана кадра): - -| вариант | кадр | prandom → torch_draw | -|---|---|---| -| C, бит-в-бит (16-битные половины) | 403 632 | 10 933 | -| C, xorshift16 + Вейль | 397 986 | 7 927 | -| **asm, бит-в-бит (сейчас)** | **400 800** | **9 331** | - -## Вариант A — комбинированный LFSR + LCG, ~148 тактов - -Период > 4 млрд (lcm(65536, 65535) ≈ 4.29e9), младшие биты не вырождены. - -```z80 -prng16: - seed1=$+1 - ld hl, 9999 - ld b, h - ld c, l - add hl, hl - add hl, hl - inc l - add hl, bc - ld (seed1), hl - seed2=$+1 - ld hl, 987 - add hl, hl - sbc a, a - and 101101b - xor l - ld l, a - ld (seed2), hl - add hl, bc - ret -``` - -Устройство: `seed1` — LCG `x = 5x + 1` (по модулю 2^16; `inc l` вместо -`inc hl` — экономия байта, на период не влияет). `seed2` — 16-битный -LFSR Галуа: сдвиг влево, и если выехала единица, XOR младшего байта с маской -`0x2D` (примитивный многочлен `x^16 + x^5 + x^3 + x^2 + 1`). На выходе -сумма обоих состояний — она и разрушает регулярность младших бит LCG. - -**Что мешает взять как есть:** сиды зашиты в код (SMC), а нам нужны ДВЕ -независимые последовательности — раскладка кладки и анимация тайлов. -Пришлось бы передавать состояние через указатель, как сейчас у `pop_prandom` -(это +20…40 тактов, не принципиально). - -## Вариант B — xorshift(7,9,8), ~86 тактов - -Самый быстрый, период 65535. - -```z80 -xrnd: - ld hl, 1 ; seed must not be 0 - ld a, h - rra - ld a, l - rra - xor h - ld h, a - ld a, l - rra - ld a, h - rra - xor l - ld l, a - xor h - ld h, a - ld (xrnd+1), hl - ret -``` - -**Две оговорки.** Ноль — неподвижная точка, а сид раскладки кладки у нас -считается как `номер комнаты + смещение ряда + колонка` и вполне может -оказаться нулём: нужен либо guard, либо шаг Вейля поверх. И тот же SMC-сид, -что в варианте A. - -## Чего НЕ брать: RND из Apple II - -Оригинальный `Prince-of-Persia-Apple-II`: - -``` -RNDseed := (5 * RNDseed + 23) mod 256 -``` - -```asm -RND - lda RNDseed - asl - asl - clc - adc RNDseed - clc - adc #23 - sta RNDseed - rts -``` - -Полный период 256 (`a ≡ 1 mod 4`, `c` нечётное), и для своего движка он -работал. Нам не годится: у LCG по модулю 256 младшие биты вырождены — бит 0 -просто чередуется. Наши вызовы это увидят: раскладка кладки берёт -`prandom(1)` (ОДИН бит) и `prandom(4)`, то есть вместо шума получилась бы -аккуратная шахматка. - -## Сколько реально можно выиграть - -Меньше, чем кажется по числам 86/148 против 1 020. Тело генератора — уже не -весь расход: остаются обёртка `pop_prandom`, приведение к диапазону -`pop_rnd_fit` и ABI вызова. Верхняя граница выигрыша видна из замера выше: -между нынешним asm-LCG и самым дешёвым из проверенных вариантов разница -**2 814 тактов за кадр (0.65 %)** при двух вызовах за кадр, и это ПОТОЛОК — -любой из вариантов A/B ниже него не опустится. - -Порядок действий, если понадобится: - -1. Сначала убрать обёртки: слить `pop_rnd_fit` в ту же asm-процедуру, чтобы - на вызов приходился один `call`, а не три. Это ничего не ломает и не - трогает совместимость с эталоном. -2. И только если этого мало — менять генератор, начиная с варианта A - (качество последовательности у него не хуже LCG, в отличие от B). - -Важно помнить: число вызовов вырастет с боёвкой. Сейчас их два за кадр -(факелы), а `guard_advance` / `guard_block` / `guard_strike` дёргают -`prandom(255)` каждый по разу за кадр боя — то есть при драке станет 5–6, и -цена вопроса вырастет во столько же раз. diff --git a/applications/SprPoP/docs/quicksave_plan.md b/applications/SprPoP/docs/quicksave_plan.md deleted file mode 100644 index a5b671c..0000000 --- a/applications/SprPoP/docs/quicksave_plan.md +++ /dev/null @@ -1,328 +0,0 @@ -# QuickSave / QuickLoad — разбор оригинала и план реализации - -Статус: **РЕАЛИЗОВАНО и проверено в MAME** (2026-08-22; F6/F9, POP.SAV + -POP.BAK — см. коммит `v0.6-pop-quicksave`). Документ оставлен как -справочник по формату снимка и разбору. Задача на доске — -[`../TASKS_OPEN.md#qsave`](TASKS_OPEN.md#qsave). - ---- - -## 0. Важная оговорка об «оригинале» - -**В оригинальном PoP 1989 года (DOS/Apple II) QuickSave/QuickLoad НЕТ.** -Там вообще нет сохранения посреди уровня: игра рассчитана на один заход в -60 минут, а «продолжение» — это только пароль/чекпоинт уровня 7. Поэтому -`Prince-of-Persia-Apple-II/` и `MSDOS/` тут не источники — искать в них -нечего. - -Источник истины — **SDLPoP**, где быстрое сохранение добавлено как -enhancement: `seg000.c`, блок `#ifdef USE_QUICKSAVE`, клавиши **F6** (save) -и **F9** (load). Ниже разобран именно он. Это значит, что правило -«расхождение с SDLPoP = баг у нас» здесь работает мягче: мы не обязаны -повторять его байт-в-байт, но обязаны повторить его **устройство**, потому -что оно решает ровно те проблемы, которые возникнут и у нас. - ---- - -## 1. Как это устроено в SDLPoP - -### 1.1 Точка вызова — отдельная фаза кадра, не обработчик клавиши - -Клавиша только взводит флаг (`need_quick_save` / `need_quick_load`, -`seg000.c:558`), а вся работа делается в `check_quick_op()` — она вызывается -из главного цикла **между кадрами**, когда движок в согласованном состоянии. -Это принципиально: загрузка посреди тика переписала бы `Char` под ногами у -`play_seq`. - -Отказ штатный, не фатальный: `quick_save()`/`quick_load()` возвращают -успех/неуспех, и игра печатает `QUICKSAVE` / `NO QUICKLOAD` внизу экрана и -продолжается. - -### 1.2 Формат — плоская последовательность переменных, без структуры - -```c -#define process(x) ok = ok && process_func(&(x), sizeof(x)) -``` - -Один макрос и один и тот же список обходится **и на запись, и на чтение** -(`quick_process(process_save)` / `quick_process(process_load)`). Поля -пишутся встык, без имён и тегов; совместимость держится ровно одним -средством — **строкой версии в начале файла**: - -```c -const char quick_version[] = "V1.16b4 "; -``` - -При загрузке она сравнивается, и при несовпадении файл просто отвергается -(`quick_load`, возврат 0). То есть формат нарочно хрупкий и нарочно -одноразовый — это снимок конкретной сборки, а не сейв-формат. - -**Это стоит перенять целиком.** Мы платим за версионирование одним байтом -и получаем право менять состав снимка при каждой правке движка. - -### 1.3 Что именно сохраняется - -Полный список — `quick_process`, `seg000.c:257-366`. По смыслу он делится -на пять групп: - -| группа | поля | -|---|---| -| уровень | `level` (2305 Б целиком), `checkpoint`, `upside_down`, `drawn_room`, `current_level`, `next_level`, `leveldoor_open` | -| анимируемые объекты | `mobs_count`, `mobs[14]`, `trobs_count`, `trobs[30]` | -| Кид | `Kid`, `hitp_curr/max/beg_lev`, `grab_timer`, `holding_sword`, `united_with_shadow`, `have_sword`, `kid_sword_strike`, `pickup_obj_type`, `offguard` | -| соперник | `Guard`, `Char`, `Opp`, `guardhp_curr/max`, `demo_index`, `demo_time`, `curr_guard_color`, `guard_notice_timer`, `guard_skill`, `shadow_initialized`, `guard_refrac`, `justblocked`, `droppedout`, `is_guard_notice`, `can_guard_see_kid` | -| прочее | кэш коллизии (`*_row_coll_room/flags`, `prev_collision_row`), вспышка (`flash_color/time`), звук (`is_screaming`, `is_feather_fall`, …), **`random_seed`**, время (`rem_min`, `rem_tick`), весь блок управления (`control_*`, `ctrl1_*`) | - -Два наблюдения, важные для нас: - -1. **Состояние ОТРИСОВКИ не сохраняется вообще.** Ни экранных буферов, ни - пометок перерисовки, ни того, что уже нарисовано. Вместо этого при - загрузке комната перерисовывается с нуля. Это резко упрощает задачу и - ровно то, что нам нужно при дабл-буфере. -2. **`random_seed` сохраняется.** Без него загрузка не воспроизводима: - после неё факелы, чомперы и `prandom` в боёвке пойдут иначе. - -### 1.4 Что делается при загрузке - -`restore_room_after_quick_load()` (`seg000.c:395`) — это и есть вся -«сложность» операции: - -- `load_lev_spr(current_level)` — **перезагрузка графики уровня** (тайлсет - мог смениться: подземелье/дворец); -- `different_room = 1`, `next_room = drawn_room = Kid.room` — принудительно - «мы в другой комнате», чтобы движок перерисовал всё; -- `load_room_links()` — связи комнат заново; -- `draw_game_frame()` — отрисовать кадр (важно для состояния падения); -- `hitp_delta = guardhp_delta = 1` — принудительный редрой полос HP; -- если `Guard.room != drawn_room` — стража «выключить» (`direction = - dir_56_none`, `guardhp_curr = 0`), как в `clear_char()`; -- `loadkid_and_opp()` — восстановить окно `Char`/`Opp`; -- сбросить таймеры текста и `exit_room_timer`. - -Плюс визуальный приём: перед загрузкой экран заливается чёрным на 5 тиков — -чтобы переход читался глазом и не выглядел «дёрганием». - -### 1.5 Чего в SDLPoP решили НЕ восстанавливать - -- звуки — просто `stop_sounds()`; -- перо (`is_feather_fall`) — без фикса `fix_quicksave_during_feather` - сохранение под пером запрещено вовсе, а при загрузке эффект гасится; -- есть опциональный **штраф**: `USE_QUICKLOAD_PENALTY` отнимает минуту - игрового времени за квиклоад. Нам не нужен (у нас пока нет игрового - таймера). - ---- - -## 2. Чем наша архитектура отличается - -| | SDLPoP | у нас | следствие для задачи | -|---|---|---|---| -| уровень в памяти | `level_type` в ОЗУ, 2305 Б, мутабельный | EMM-страница (`pop_lvl_page`), плюс рабочая копия комнаты в W2 | снимок читает страницу через W0-маппинг, а не `memcpy` | -| модификаторы тайлов | внутри `level.bg` | отдельный `room_modif[24][30]` в `pop_trob.c` (**static**) | нужен экспортируемый сериализатор из банка 6 | -| код | один бинарник | 8 банков + резидент | сериализатор обязан жить там же, где данные, и зваться через трамплин | -| экран | один буфер | **дабл-буфер**, у каждой страницы своя теневая копия | после загрузки перерисовать ОБЕ страницы, иначе через кадр мелькнёт старое | -| ОЗУ | сколько угодно | куча 2969 Б, стек 1279 Б | буфер снимка целиком в ОЗУ не положить — писать потоком | -| диск | `fopen` | DSS: 8 манипуляторов, 9-й ВЕШАЕТ систему ([[dss_fd_limit]]) | закрывать файл гарантированно, гард уже есть в libc | -| ГСЧ | один `random_seed` | **три** независимых: `pop_t_seed`, `trob_seed`, `pop_fight_seed` | сохранять все три, иначе загрузка невоспроизводима | - ---- - -## 3. Инвентаризация нашего состояния - -Собрано по `.sprinter-cc-build/.sprinter-cc-sprpop/sprpop.map` (данные всех модулей, включая -банковые, лежат в W2 — банк влияет только на код). Отмечено, что глобально -(видно снаружи), а что `static` и требует аксессора. - -### 3.1 Мутабельные данные уровня - -| что | где | размер | доступ | -|---|---|---|---| -| тайлы `fg` (провалившиеся плиты, открытые двери, съеденные предметы) | EMM-страница уровня | 720 Б | `pop_level_set_tile` пишет; чтения наружу нет — **нужен аксессор** | -| `room_modif[24][30]` | `pop_trob.c`, static | 720 Б | **нужен сериализатор** (банк 6) | -| `room_seen[24]` | `pop_trob.c`, static | 24 Б | там же | -| `trobs[30]` + `trobs_count` | `pop_trob.c`, static | 91 Б | там же | -| `trob_seed` | `pop_trob.c`, static | 4 Б | там же | -| `mobs[14]` | `pop_room.c`, **глобален** | 210 Б | напрямую | -| `mobs_live` | `pop_room.c`, static | 1 Б | аксессор | - -### 3.2 Персонажи и бой - -`Kid`, `Char`, `Opp` (`pop_kid.c`), `Guard` (`pop_guard.c`) — по 16 Б, -все глобальные. Рядом: `hitp_curr/max/beg_lev/delta`, `guardhp_curr/max/delta`, -`guard_skill`, `guard_refrac`, `justblocked`, `kid_sword_strike`, `offguard`, -`holding_sword`, `can_guard_see_kid`, `is_guard_notice`, -`pop_guard_notice_timer`, `pop_guard_hurt`, `pop_united_shadow`, -`pop_shadow_init`, `pop_fight_seed`, `knock`. - -### 3.3 Прогресс и физика - -`pop_current_level`, `pop_next_level`, `pop_checkpoint`, `pop_have_sword`, -`pop_item_taken`, `pop_leveldoor_open`, `pop_leveldoor_right`, -`pop_leveldoor_ybottom`, `pop_kid_dead`, `pop_kid_hurt`, `pop_feather`, -`pop_upside` / `pop_upside_want`, `pop_flash_time` / `pop_flash_color`, -`pop_droppedout`, `pop_fell_out`, `pop_leave_dir`, `pop_leave_timer`, -`pop_loose_*`, `pop_ceil_modif`, `pop_ceil_fell`, `pop_debris_at`, -`pop_seamless`, `pop_jumped_mirror`. - -### 3.4 Ввод - -`control_x/y/shift/forward/backward/up/down/shift2` (`pop_state.c`) — как в -SDLPoP, сохраняются. - -### 3.5 Что НЕ сохранять (восстанавливается перерисовкой) - -`room_fg/room_bg`, `lcol_*`/`rcol_*`/`below_fg`/`above_*`, `seam_*`, -`cur_room`, `pop_t_*` (весь кэш слоя фона, окна клипа, `pop_cd_*`), -`trob_drawn`, `mob_spr`, слоты `pop_cd`, метки `pop_redraw`, запечки -(`bake_pg`). Всё это — производное; после загрузки оно обязано быть -сброшено и пересчитано, а не восстановлено. - -**Оценка объёма снимка: ≈ 1,9 КБ** (720 + 720 + 210 + 91 + 64 + ~60 -скаляров + запас). - ---- - -## 4. Куда писать снимок: HDD-файл, а не EMM-страница - -Решение: **один основной слот `POP.SAV` на HDD; предыдущая -валидная запись хранится в `POP.BAK`.** EMM-слота нет: программа -работает только с HDD, а главный сценарий QuickSave обязан переживать -перезапуск игры. - -> Пересмотрено 2026-08-21 по вопросу пользователя «почему EMM, а не файл». -> Первая редакция плана рекомендовала EMM — это была ошибка: она взвешивала -> скорость и недооценивала главный сценарий использования. Разбор оставлен -> целиком, потому что довод переносится и на другие «положить в память -> вместо диска» решения. - -**Решающий довод: EMM-страница не переживает рестарт программы,** а именно -рестарт — тот случай, ради которого QuickSave и нужен. Пример из этого же -проекта: сцену каскада плит на 13/23 воспроизводит ТОЛЬКО `ESC` → запуск -заново ([`perf_l13_room23.md`](perf_l13_room23.md) §1, где перечислено, -почему не годятся ни возврат в комнату, ни рестарт уровня, ни запись -состояния отладчиком). Тем более снимок в ОЗУ не переживает перезапуск -MAME, обязательный после каждой пересборки образа. - -| сценарий | EMM | файл | -|---|---|---| -| «переиграть это место ещё раз» | работает, мгновенно | работает, на HDD быстро | -| «вернуться к багу после рестарта» | **не работает** | **работает** | - -Второй сценарий не закрывается ничем другим; первый закрывается обоими, и -разница в скорости там некритична — 1,9 КБ на HDD ([[mame_hdd_test_disk]] — -быстрый путь против дискеты) не заметны на фоне полной перерисовки комнаты, -которая при загрузке делается в любом случае и стоит дороже. - -Доводы за EMM, которые при перепроверке оказались слабыми: лимит -манипуляторов DSS ни при чём (открываем и закрываем ровно один файл, гард -`_fd_guard` в libc и так стоит), а «не нужен путь и права» — экономия одной -строки. - -Обход состояния всё равно писать с абстракцией чтения/записи, как у SDLPoP -через `process_func`, но второй EMM-слот в scope не входит. - -**Проверить ДО кодинга:** пишется ли `test_hdd.chd` из-под MAME. Если образ -только на чтение, файловый путь упрётся в это на первом же шаге и порядок -работ придётся менять. Проверка дешёвая — записать пробный файл на `D:` из -SprPoP. - ---- - -## 5. Формат снимка - -``` -+0 "PQS1" 4 Б магия -+4 версия сборки 1 Б (инкремент при ЛЮБОМ изменении состава) -+5 pop_current_level 1 Б -+6 длина полезной части 2 Б (контроль, что обход совпал) -+8 ... поля встык, ОДИН порядок на запись и на чтение ... -.. checksum 2 Б (заголовок + payload) -``` - -Версия проверяется первой; несовпадение — отказ, как в SDLPoP. Никаких -тегов и выравнивания: снимок одноразовый и живёт ровно одну сборку. - -Обход — один список и один макрос, как `process(x)`: - -```c -static void qs_walk(qs_io_t io) /* io = запись или чтение */ -{ - QS(pop_current_level); QS(pop_checkpoint); ... -} -``` - -Так состав нельзя рассинхронизировать между сохранением и загрузкой — -единственная реальная опасность плоского формата. - ---- - -## 6. Что делать при загрузке (наш аналог `restore_room_after_quick_load`) - -Порядок важен, каждый пункт закрывает конкретный отказ: - -1. **Сменился уровень?** → `pop_level_load_num()`, `pop_bg_load(tileset)`, - атласы стража по типу. Это дорого, но ровно тот же путь, что при - переходе уровня (`pop_level_switch`), — переиспользовать его, а не писать - заново. -2. Залить экран чёрным (приём SDLPoP: переход должен читаться глазом). -3. Восстановить состояние обходом `qs_walk`. -4. **Сбросить всё производное:** `pop_trob_reset` (но НЕ трогая - восстановленные `room_modif`/`trobs` — нужен отдельный «мягкий» сброс, - только `trob_drawn` + метки), `pop_redraw_reset`, слоты `pop_cd`, - `pop_bake_forget`, `pop_cd_clear`, сигнатуры пропуска перерисовки. -5. `pop_room_load(Kid.room)` — рабочая копия комнаты и срезы соседей. -6. **Полная отрисовка комнаты в ОБЕ страницы дабл-буфера.** Это наше - главное отличие от SDLPoP: одной перерисовки мало, вторая страница - останется со старой картинкой и мигнёт через кадр. -7. Принудительный редрой полос HP (`hitp_delta = guardhp_delta = 1`). -8. Если `Guard.room != Kid.room` — выключить стража - (`Guard.direction = DIR_56_NONE`, `guardhp_curr = 0`), как `clear_char`. -9. `pop_loadkid_and_opp()` — согласовать окно `Char`/`Opp`. - ---- - -## 7. Разбиение на шаги - -| шаг | что | критерий готовности | -|---|---|---| -| **QS0** | Проверить, что `D:` пишется из-под MAME (пробный файл из SprPoP) | файл создался и читается обратно после рестарта программы | -| **QS1** | Аксессоры/сериализаторы для `static`-состояния банковых модулей: `pop_trob.c` (`room_modif`, `room_seen`, `trobs`, `trob_seed`), `pop_room.c` (`mobs_live`), страница уровня (чтение `fg`) | хост-тест `tests-host/t_qsave.c`: обход туда-обратно на синтетическом состоянии даёт байт-в-байт исходное | -| **QS2** | Ядро: `qs_walk` + `POP.SAV`, магия/версия/checksum, безопасная замена с предыдущей валидной копией в `POP.BAK` | сохранение и загрузка **в той же комнате, без движения**; порча SAV не портит BAK | -| **QS3** | Восстановление отрисовки (§6), включая обе страницы дабл-буфера | загрузка после перехода в другую комнату; нет мерцания через кадр | -| **QS4** | Клавиши **F6/F9** (или свободные из `pop_cheat.h`) через ``, флаги `need_quick_save/load`, обработка **между кадрами** | загрузка посреди боя/падения не ломает `play_seq` | -| **QS5** | Загрузка с **другого уровня** (перезагрузка уровня и атласов) | сохранить на ур. 2, уйти на ур. 12, загрузить — тайлсет и стражи верные | - -Порядок не переставлять: QS0 первым (он может изменить весь план), QS3 без -QS2 нечего проверять, а QS5 обязан идти после QS3 — иначе смена тайлсета -замаскирует ошибки восстановления. - -**Главный критерий приёмки всей задачи:** сохранить состояние, выйти по -`ESC`, запустить SprPoP заново, загрузить — и оказаться там же. Именно -этого сценария сейчас нет ничем, и ради него задача и делается. - ---- - -## 8. Риски и открытые вопросы - -1. **`static` в банковых модулях.** Их нет в карте символов, то есть - отладчиком снимок не проверить. Возможно, стоит сделать `room_modif` и - `trobs` НЕ-static — так же, как уже сделано с `mobs` в `pop_room.c` и - ровно по той же мотивации (там это записано прямым комментарием). -2. **Место в банке 6.** `pop_trob` занимает 3802/16384 — запас есть, но - сериализатор лучше писать компактным обходом, а не 30 отдельными - вызовами. -3. **Три ГСЧ.** Проверить, что сохранены ВСЕ: пропуск любого даст - «загрузилось, но играется иначе» — самый неприятный класс бага, потому - что выглядит как случайность. -4. **Согласованность `Char` и `Kid`.** У нас окно `Char` — отдельная копия; - если сохранить их рассогласованными (снимок посреди тика), загрузка - воскресит рассогласование. Отсюда требование QS4: только между кадрами. - Урок свежий — ровно на этом стыке жил - [BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1). -5. **Дабл-буфер.** Самый вероятный источник «почти работает»: забыть вторую - страницу. Симптом — мерцание через кадр - (см. `SprPoP/CLAUDE.md`, раздел про дабл-буфер). -6. **Транзакция SAV/BAK.** До кодинга проверить на DSS семантику - rename/replace. Если атомарная замена не гарантирована, писать через - `POP.NEW`, проверять его после close и не удалять единственную валидную копию - до завершения новой. diff --git a/applications/SprPoP/docs/resident_budget.md b/applications/SprPoP/docs/resident_budget.md deleted file mode 100644 index c0f60fb..0000000 --- a/applications/SprPoP/docs/resident_budget.md +++ /dev/null @@ -1,111 +0,0 @@ -# Бюджет резидента W1/W2: как мерить и как освобождать - -Резидент huge-режима — окно `0x4100..0xBB00` (стек с 0xBB00): код в W1, -данные в W2, между концом данных и стеком остаётся куча. Всё, что туда не -влезло, живёт в банках. - -## Как СМОТРЕТЬ, а не гадать - -**Карта линкера врёт.** File-static SDCC в неё не попадает, и «дырка» между -двумя именованными символами приписывается предыдущему целиком. По карте -выходило, что у `pop_bg` 1529 Б данных (на деле 289), а у `pop_t_win_clear` -1282 Б кода — при том, что это однострочник, а 1282 Б это два статических -помощника соседнего `pop_blit_b`. - -Точный источник — объектные файлы: строки `A size flags ` в -`.rel` дают ровный размер каждой области модуля, а `S Def/Ref` — кто -символ определяет и кто на него ссылается. - -**Частоту вызовов мерить в MAME счётчиком**, а не оценивать по смыслу: - -``` -bpset ,1,{printf "F %d ...",temp0,...; temp0=0;...; g} -bpset ,1,{temp0=temp0+1; g} -``` - -Обязательна **канарейка** — счётчик заведомо горячей функции в том же -прогоне. Дважды спасала: один раз показала, что перехода комнаты в окне -замера не было (все нули), другой — что зонды вообще не встали (в zsh -`set -- $pair` НЕ разбивает строку на слова, и адрес уезжал в мусор). -Полную перерисовку комнаты форсировать читом `+`/`-`, ходьбой ненадёжно. - -## Сделано - -### 1. malloc вон из резидента (−613 Б) - -`cbl_open` держал `malloc`/`free` в мёртвой ветке `CBL_UNDERRUN_SILENCE`, а -линкер тянет `.rel` целиком — и куча приезжала каждому приложению. Разведены -две публичные точки входа (`cbl_open` / `cbl_open_silence`) поверх общего -`_cbl_open_raw`; `cbl_close` больше не зовёт `free`. - -### 2. Разрез pop_tile: холодная половина в банк 5 (−1788 Б) - -`pop_tile.c` был крупнейшим жильцом резидента (5 972 Б кода). Целиком он не -уедет: его const-таблицы (`POP_TILE_DIV/MOD`, `pop_tile_table`, таблицы -кадров) читают банки 2, 3, 7 и 8, а таблица в чужом банке не видна. - -Отбирали ЗАМЕРОМ, на двух тайлсетах (подземелье ур. 1 и дворец ур. 4 — -`pop_mem_b` рисует композитный кусок и мог оказаться дворцовым). Порог — -пик не больше 3 вызовов на кадр. - -| уехало в банк 5 | пик/кадр | | осталось в резиденте | пик/кадр | -|---|---:|---|---|---:| -| `pop_mem_b` | 0 | | `pop_tile_code` | 296 | -| `pop_cd_hit` (+`hit_rect`) | 0 | | `pop_cd_touch` | 198 | -| `pop_t_win_set/clear` | 0..1 | | `pop_blit_b` (+2 статика) | 184 | -| `pop_heal_off` | 0..1 | | `pop_wall_modifier` | 101 | -| `pop_potion_flask` | 0..1 | | `pop_env_b` | 73 | -| `pop_room_set_above/below` | 1 | | `pop_tile_mod` | 70 | -| `pop_cd_init/clear` | 1 | | `pop_cd_batch_end` | 40 | -| `pop_bar_black` | 3 | | `pop_fore_set_clip` | 2 | -| `pop_cd_hit_slot` | 2..3 | | все const-таблицы | — | - -`pop_fore_set_clip` (88 Б) оставлен намеренно: не стоит отказа от прямого -вызова из банка 4, ради которого он и заводился. - -**Цена трамплина замерена**: 252 такта пролог + 84 эпилог + ~50 на стороне -вызывающего = **~410 тактов** на вызов. Итого ~1 000 тактов на кадр покоя -(0,2 % работы) и ~3 700 на кадр редрава (0,009 растра). - -**Ключ, почему это безопасно:** вызов банк → резидент ПРЯМОЙ, трамплин не -нужен (W1/W2 замаплены всегда). Поэтому `blit_b_clip` просто перестал быть -`static` и объявлен в `_pop_tile.h`, а не переехал следом за `pop_mem_b`. - -### Итог - -| | было | стало | -|---|---:|---:| -| `_CODE` резидента | 24 329 | **21 928** | -| свободно до стека | **129 Б** | **2 535 Б** | -| BANK5 | 2 080 (13 %) | 3 954 (24 %) | - -Проверено в MAME: уровень 1 (подземелье) и уровень 4 (дворец), переходы -комнат читом `+`, ходьба — фон, факелы, решётки, гобелены, колонны без -искажений. - -## ЛОВУШКА: данные банка в его страницу — НЕ ДЕЛАТЬ без разбора - -Отдельная попытка (`--bank-data=SRC`, коммиты 3545826/9025573) **откачена**: -перенос писучих данных банкового модуля в его 16-КБ страницу давал цветной -мусор блоками и ронял DSS. - -У `pop_trob` причина найдена: `pop_trob_modif()` ВОЗВРАЩАЕТ УКАЗАТЕЛЬ на -`room_modif[24][30]`, а зовут её из банков 2, 3, 7 и резидента — после -переноса они пишут по 0xC000+ в СВОЮ страницу, поверх чужого кода. -Def/Ref-анализ такого не видит: снаружи ссылки на символ нет, есть ссылка на -функцию, отдающую его адрес. Но и `pop_room`, у которого утечки указателя -найти не удалось, ломался так же — механизм понят не до конца. - -Нулевая инициализация при этом ни при чём: `mkexe -p 0` был проверен по -образу (прогон нулей 14 304 Б, самый длинный прогон 0xFF — 14). - -**Перенос КОДА в банк — штатный путь, на нём стоят все наши банки. Ломался -именно перенос ДАННЫХ.** - -## Что осталось - -- `sprpop.c` 2 508 Б и `pop_kid.c` 2 418 Б — следующие по величине, но оба - горячие (главный цикл и `play_seq`). -- `pop_level.c` 956 Б кода + 660 Б данных (из них `pop_dl1`/`pop_dl2` по - 256 Б — таблицы дверных связей). -- BANK7 на 77 %: если понадобится место в нём — выносить `pop_redraw.c`. diff --git a/applications/SprPoP/docs/room_model_plan.md b/applications/SprPoP/docs/room_model_plan.md deleted file mode 100644 index ff5e341..0000000 --- a/applications/SprPoP/docs/room_model_plan.md +++ /dev/null @@ -1,86 +0,0 @@ -# PoP SprPoP — модель `kid_room ≠ drawn_room` (баг #4) - -> **Статус: ЖИВОЙ ПЛАН, сделан частично (сверено 2026-08-01).** -> - **S1 — сделан:** `kid_room` заведён отдельно от `cur_room`, -> `update_kid_render_dx()` (`sprpop.c`) даёт рендер-смещение ∓140, а -> `pop_kid_set_render_dx` применяет его в отрисовке. Фактически это пока -> каркас: `enter_room` держит `kid_room == cur_room`, так что смещение -> всегда 0. -> - **S2/S3/S4 — не сделаны и не срочны.** Исходный повод (баг #4, -> пинг-понг у шва) закрыт иначе — поправкой odd-pixel в -> `char_x_forward_edge` + `pop_leave_timer` (разбор корня — -> `../PoP/SprPoP/BUGS_CLOSED.md`, BUG-SEAM-PINGPONG). -> -> **Зачем документ остаётся.** Полная straddle-модель понадобится для: -> (а) читов осмотра соседних комнат `H/J/U/N` (`levels_plan.md` §4), -> (б) сцен, где Кид и страж в разных комнатах кадра, (в) остатков окклюзии у -> шва (S4). Брать из `../TASKS_OPEN.md`, когда дойдёт очередь. - -Порт straddle-модели SDLPoP: персонаж может находиться в СОСЕДНЕЙ комнате, -пока на экране ещё ТЕКУЩАЯ (drawn_room). Источник истины — SDLPoP. - -## Факты из SDLPoP (подтверждено чтением исходника) - -- `Char.room` (реальная комната персонажа) ≠ `drawn_room` (отрисованная) — - штатное состояние. -- **Коллизия через ±140:** `xpos_in_drawn_room()` (seg004:0405) сдвигает - xpos на `±TILE_SIZEX*SCREEN_TILECOUNTX = ±140`, когда `curr_room` колонки - (`curr_row_coll_room[col]`) ≠ `drawn_room` (room_L/room_BL → −140, - room_R/room_BR → +140). Т.е. коллизия строится по РЕАЛЬНЫМ тайлам соседей. -- **Смена экрана:** `check_the_end()` (seg000:0FBD): `if (next_room!=0 && - next_room!=drawn_room) { drawn_room=next_room; load_room_links; redraw }`. - `next_room` ставится в `exit_room()` (= `Char.room` ПОСЛЕ успешного - `leave_room`). Значит drawn_room следует за Char.room, но Char.room меняется - ТОЛЬКО при реальном пересечении шва (leave_room, seg002:0504) на «легальном» - кадре/действии (не turn/climb/standup). -- **Отрисовка левого соседа:** только `load_leftroom()` (col9 левого соседа в - левую кромку); правый сосед НЕ рисуется (изометрия). Окклюзия ворот на шве — - только левая (seg008:696). -- **Ceiling-полоса:** `draw_room` рисует доп. ряд из `room_A` (row2, draw_main_y - =-1). (Уже реализовано, баг #3.) - -## Текущее состояние нашего движка (до #4) - -`cur_room` (=drawn_room) ВСЕГДА == комната Kid. Шов подделан: Kid остаётся в -drawn_room с `curr_col=-1/10` + снапшоты соседей `g_lcol/g_rcol` (коллизия ±1 -кол) / `lcol_bg` (openness ворот). Уход из комнаты — `pop_leave_dir`/`enter_room` -МГНОВЕННО при пересечении порога `char_x`. Отсюда #4: экран переключается -раньше, чем в оригинале (Kid должен «отступить» за кромку, оставив старую -комнату). - -## План (инкременты, каждый проверяется в MAME) - -### S1. Данные + рендер-смещение Kid -- Ввести `kid_room` (реальная комната Kid) отдельно от `cur_room`(=drawn_room). -- `kid_x_offset()` = разница комнат: kid_room == left(drawn) → лог. x Kid −140 - (рисуется за левой кромкой); right → +140; равны → 0. (порт - xpos_in_drawn_room). -- `kid_draw`/heal/fore используют смещение (Kid рисуется частично за кромкой). -- Проверка: Kid у шва рисуется со сдвигом, экран не дёргается. - -### S2. Коллизия по kid_room -- Коллизионный контекст (`g_fg`/edges/`g_room`/modif в pop_map) следует за - `kid_room`, а не за drawn_room. Когда kid_room≠drawn_room — грузим - соседа как коллизионную комнату (curr_col 0..9 в кадре kid_room). -- Отрисовка (room_fg и т.п.) остаётся по drawn_room. -- Порт `curr_row_coll_room[]`/`xpos_in_drawn_room` можно упростить: держим - ОДИН коллизионный room (kid_room) + существующие снапшоты кромок для ±1 кол. - -### S3. Отложенная смена drawn_room -- Уход (`check_leave`/`check_leave_below`): ставит `kid_room=сосед`, - репроецирует Kid (x∓140, col∓10) — но drawn_room НЕ меняет сразу. -- `check_the_end`-эквивалент в главном цикле: `if (kid_room != drawn_room && - <условие коммита>) enter_room(kid_room)`. Условие коммита — по SDLPoP: - как только Char.room сменилась легальным leave (не bumped/turn). Для - «bumped назад за кромку» drawn_room остаётся (симптом #4). -- Проверка сценариев #4/#5 в MAME. - -### S4. Полировка -- Окклюзия/ceiling у шва при straddle, BUG-OCCL-1 (глубина), правый край. - -## Связанные баги — все ЗАКРЫТЫ (`../PoP/SprPoP/BUGS_CLOSED.md`) -BUG-CEIL-1 (руки при прыжке вверх), BUG-CEIL-2 (loose в потолке), -BUG-CEIL-3 (потолок над анимируемыми воротами), BUG-OCCL-1 (тень дальней -колонны) — починены без полной straddle-модели. То есть S4 «полировка -окклюзии» осталась актуальной только для окклюзии У ШВА при straddle. -Memory: `pop_seam_room_model`. diff --git a/applications/SprPoP/docs/roomnav_skip.md b/applications/SprPoP/docs/roomnav_skip.md deleted file mode 100644 index f489af7..0000000 --- a/applications/SprPoP/docs/roomnav_skip.md +++ /dev/null @@ -1,65 +0,0 @@ -# Комнаты для отладочного телепорта (`+` / `-`) - -Считано скриптом прямо по `../SDLPoP/data/LEVELS/res20NN.bin`, 2026-08-13. -Задача: обход комнат читом идёт последовательно, и в КАЖДОЙ комнате Киду -должно найтись место для материализации без падения и смерти. - -## Критерии пропуска - -| причина | как определяется | -|---|---| -| **недостижима** | до комнаты нельзя дойти от стартовой обходом связей (BFS по left/right/up/down) | -| **нет пола** | ни одного тайла, на котором можно стоять (`tile_is_floor`, seg004) | -| **пол опасный** | стоять есть на чём, но обычного пола (код 1) нет — только пики, расшатанные плиты и прочее | - -Про достижимость важно: считать «сколько комнат на неё ссылаются» НЕ -годится. На уровне 1 комнаты **13** и **18** ссылаются только друг на -друга (13.down = 18, 18.up = 13), то есть входящая связь у каждой есть, а -из остального уровня в них не попасть. Ловит это только обход от старта. - -Чит ищет место снизу вверх: сперва обычный пол (код 1), потом любой -проходимый тайл (`pop_dbg_roomnav`, `sprpop_cold.c`). Поэтому «пол -опасный» — это комнаты, где он свалится на fallback и Кид может погибнуть. - -## Таблица по уровням - -| ур. | старт | достижимо | пропускать | -|---|---|---|---| -| 1 | 1 | 21/24 | **13** (недостижима), **18** (недостижима), **24** (недостижима) | -| 2 | 5 | 24/24 | **14** (пол опасный), **17** (пол опасный) | -| 3 | 9 | 22/24 | **17** (пол опасный), **19** (пол опасный), **20** (нет пола), **21** (пол опасный), **23** (недостижима/нет пола), **24** (недостижима/нет пола) | -| 4 | 1 | 24/24 | **19** (нет пола), **20** (нет пола) | -| 5 | 7 | 19/24 | **1** (недостижима), **3** (недостижима), **5** (недостижима), **6** (недостижима), **19** (недостижима/нет пола), **21** (пол опасный), **22** (нет пола) | -| 6 | 24 | 14/24 | **2** (пол опасный), **3** (нет пола), **4** (недостижима), **7** (нет пола), **8** (недостижима/нет пола), **11** (пол опасный), **13** (недостижима), **14** (недостижима), **16** (недостижима), **17** (недостижима), **19** (недостижима/нет пола), **20** (недостижима), **21** (недостижима/пол опасный), **22** (недостижима), **23** (нет пола) | -| 7 | 17 | 24/24 | **3** (пол опасный), **17** (нет пола), **21** (пол опасный) | -| 8 | 1 | 21/24 | **9** (нет пола), **10** (пол опасный), **11** (недостижима), **15** (недостижима), **17** (пол опасный), **19** (недостижима), **20** (пол опасный), **21** (нет пола) | -| 9 | 11 | 24/24 | **8** (нет пола), **18** (пол опасный) | -| 10 | 1 | 19/24 | **3** (нет пола), **4** (пол опасный), **6** (недостижима), **9** (нет пола), **11** (пол опасный), **13** (нет пола), **18** (нет пола), **20** (нет пола), **21** (недостижима), **22** (недостижима), **23** (недостижима), **24** (недостижима) | -| 11 | 6 | 23/24 | **3** (нет пола), **5** (нет пола), **9** (нет пола), **10** (нет пола), **11** (нет пола), **12** (нет пола), **17** (нет пола), **18** (недостижима), **23** (нет пола) | -| 12 | 3 | 24/24 | **5** (нет пола), **6** (пол опасный), **8** (пол опасный), **10** (нет пола), **11** (нет пола), **17** (нет пола), **18** (пол опасный), **19** (пол опасный), **22** (нет пола) | -| 13 | 23 | 11/24 | **2** (нет пола), **4** (пол опасный), **5** (недостижима), **6** (недостижима/пол опасный), **7** (недостижима), **8** (недостижима/пол опасный), **9** (недостижима), **12** (недостижима), **14** (недостижима), **15** (недостижима), **18** (недостижима/пол опасный), **19** (недостижима/пол опасный), **20** (недостижима), **21** (недостижима), **22** (недостижима/нет пола) | -| 14 | 4 | 6/24 | **7** (недостижима/нет пола), **8** (недостижима), **9** (недостижима), **10** (недостижима), **11** (недостижима), **12** (недостижима), **13** (недостижима), **14** (недостижима/пол опасный), **15** (недостижима), **16** (недостижима), **17** (недостижима/пол опасный), **18** (недостижима), **19** (недостижима), **20** (недостижима), **21** (недостижима), **22** (недостижима), **23** (недостижима), **24** (недостижима) | -| 15 | 6 | 6/24 | **1** (недостижима), **2** (недостижима), **7** (нет пола), **9** (недостижима/пол опасный), **10** (недостижима/пол опасный), **11** (недостижима/пол опасный), **12** (недостижима/пол опасный), **13** (недостижима/пол опасный), **14** (недостижима/пол опасный), **15** (недостижима/пол опасный), **16** (недостижима/пол опасный), **17** (недостижима/пол опасный), **18** (недостижима/пол опасный), **19** (недостижима/пол опасный), **20** (недостижима/пол опасный), **21** (недостижима/пол опасный), **22** (недостижима/пол опасный), **23** (недостижима/пол опасный), **24** (недостижима/пол опасный) | - -## Спецкомнаты — пропускать независимо от таблицы - -| ур. | комн. | почему | -|---|---|---| -| 12 | 23 | **seamless exit**: попадание МЕНЯЕТ УРОВЕНЬ на 13-й. Чит-триггер придержан (`pop_nav_hold`), но в обходе комнате делать нечего | -| 6 | 1 | **falling exit**: Кид проваливается вниз и уходит на 7-й уровень | -| 7 | 17 | **falling entry**: экран сразу переводится на комнату НИЖЕ (в таблице уже «нет пола») | -| 7 | 14 | проходится СВЕРХУ ВНИЗ; чит для неё уже особый — ставит Кида в ряд 0 | -| 5 | 24 | тень ждёт в колонке −1 ряда 0; посадка рядом начинает схватку, которой там быть не должно | -| 13 | 23, 16 | вход роняет гряду плит (`check_fall_flo`) — материализация под падающей плитой | - -## Уровень 15 - -Экран защиты от копирования, не часть сюжета (см. -[`levels_12_15_plan.md`](levels_12_15_plan.md) §4). Портировать не -планируем — **пропускать целиком**. - -## Как применять - -Список — данные, а не логика: держать таблицей в отладочном коде рядом с -`pop_dbg_roomnav` и пропускать помеченные комнаты, чтобы `+` всегда попадал -в пригодную. Пересчитывать скриптом, если поменяются данные уровней. diff --git a/applications/SprPoP/docs/sdlpop_audit.md b/applications/SprPoP/docs/sdlpop_audit.md deleted file mode 100644 index 2b047fc..0000000 --- a/applications/SprPoP/docs/sdlpop_audit.md +++ /dev/null @@ -1,755 +0,0 @@ -# Аудит расхождений с SDLPoP: Кид, стражи, seqtbl, отрисовка - -> Начат 2026-08-31. КОД НЕ МЕНЯЛСЯ — это только разбор. Задача: найти -> места, где наш движок может вести себя иначе, чем оригинал, и оценить -> вероятность того, что расхождение реально. - -## Как читать - -Ранги вероятности того, что расхождение ЕСТЬ и проявляется в игре: - -| ранг | смысл | -|---|---| -| **А** | гарантированное различие: код объективно разный, эффект понятен | -| **Б** | весьма вероятное: код разный, эффект вероятен, но не доказан | -| **В** | средневероятное: код разный, но эффект может гаситься другим местом | -| **Г** | маловероятное: различие есть в форме, эффект скорее отсутствует | -| **Д** | почти невероятное: сходство подтверждено, остаётся крайний случай | - -Ссылки вида `seg005:114` — строка в `assets/orig/SDLPoP/src/`. Наши -ссылки — `файл:строка` в `src/`. - -## Метод и охват - -Сравниваются НАШИ реализации с оригиналом построчно по функциям. Первый -проход (2026-08-31) охватил: - -* диспетчер `control()` (seg005:251) — целиком; -* `land()` (seg005:114) и `start_fall()` (seg006:1099); -* цепочку смерти: `control_kid` (seg006:1390), `play_kid` (seg006:1348), - `take_hp` (seg006:986), `control()` ветка `alive >= 0`. - -НЕ охвачено первым проходом (список для следующих): - -* интерпретатор `play_seq` и полный набор опкодов seqtbl; -* `frame_table` и модификаторы кадров; -* бой целиком: `control_with_sword`, парирование, `strike`, `hurt_by_sword`; -* ИИ стражей (`guard_ai`), особенности скелета, Тени, Джафара; -* `add_kid_to_objtable`/`add_guard_to_objtable`, порядок слоёв, `clip_char`; -* `check_bumped` — сверен ЧАСТИЧНО (находки 14, 15); `check_grab`, - `in_wall`, `check_bumped_look_left` — нет; -* `do_fall` целиком (проверен только вход). - ---- - -## Симптом, с которого начат аудит - -**Наблюдение (пользователь, 2026-08-31):** идёт бой, за Кидом провал на -этаж. Страж колет на последнем HP, Кид отшатывается назад и падает. -Кид умирает — но на экране он этажом ниже В ПРИСЕДЕ, как после мягкого -приземления. - -**Что говорит код SDLPoP.** Разбор цепочки: - -1. `start_fall` (seg006:1099) ПЕРВЫМ ДЕЛОМ убирает меч - (`Char.sword = sword_0_sheathed`) — для любого падения, независимо от - здоровья. Значит к моменту приземления меч уже в ножнах. -2. `land` (seg005:114) при падении на один ряд выбирает - `seq_63_guard_active_after_fall`, только если `charid >= guard` ИЛИ - меч вынут; иначе — `seq_17_soft_land`, то есть ПРИСЕД. Из-за п.1 для - Кида это всегда присед. -3. `land` НЕ смотрит ни на `alive`, ни на `hitp_curr` вовсе. -4. `control` (seg005:251) при мёртвом персонаже (`alive >= 0`) не - диспетчеризует ничего; он переводит в `seq_71_dying` ТОЛЬКО из - четырёх кадров стойки (15, 166, 158, 171). Присед в этот список не - входит. - -**Вывод:** по букве оригинала мёртвый Кид, застигнутый смертью в полёте, -тоже долетает, приземляется в присед и остаётся в нём — `control` его не -трогает. То есть наблюдаемое, СКОРЕЕ ВСЕГО, воспроизводится и в SDLPoP. - -Гипотеза «hp стал нулевым, поэтому спрятали меч» кодом НЕ подтверждается: -единственное место, где SDLPoP связывает `hitp_curr == 0` с чем-либо, — -`control_kid` (seg006:1395), и там взводится только `Char.alive = 0`. - -**Как проверить окончательно:** прогнать сцену на живом SDLPoP (он -собирается в `assets/orig/SDLPoP/`), где для этого уже есть наши врезки -`POP_TRACE`. До проверки считаю симптом НЕ доказанным расхождением — -ранг **В** (см. находку 5). - ---- - -## Находки первого прохода - -### 1. `land()`: лишний `determine_col()` — ранг **А** - -*Оригинал:* `land` (seg005:114) заканчивается тремя действиями: -`seqtbl_offset_char(seq_id)`, `play_seq()`, `Char.fall_y = 0`. Никакого -пересчёта колонки. - -*У нас:* `pop_map.c:715` (и в ветке смерти `:705`) после `play_seq()` -дополнительно вызывается `determine_col()`. - -*Чем грозит:* `determine_col` пересчитывает `Char.curr_col` из `Char.x`. -Оригинал делает это в другом месте и в другой момент — -`load_fram_det_col` (seg006:0144) перед разбором кадра. Лишний пересчёт -сразу после приземления может дать другую колонку, если `play_seq` -успел сдвинуть `x` первым же `dx`. Колонка — вход для проверок тайла, -пик и коллизий. - -*Замечание:* приём применён у нас системно (`pop_map.c` — 8 вызовов), то -есть это, вероятно, осознанная адаптация, но в `docs/impl_diff.md` она НЕ -записана. Нужно либо обосновать и записать, либо снять. - -### 2. `land()`: обнуляется ещё и `fall_x` — ранг **Б** - -*Оригинал:* в `land` обнуляется ТОЛЬКО `fall_y`, и притом в самом конце, -ПОСЛЕ `play_seq()`. - -*У нас:* `pop_map.c:697` и `:713` обнуляют пару `Char.fall_x = Char.fall_y = 0`, -причём ДО `pop_char_set_seq`/`play_seq`. - -*Чем грозит:* два отличия сразу. Во-первых, `fall_x` в оригинале -переживает приземление — если наш сброс лишний, теряется горизонтальный -импульс, влияющий на последующие кадры. Во-вторых, момент: если -`play_seq` читает `fall_y` (а он читает при обработке своих опкодов -движения), оригинал видит ещё НЕ обнулённое значение, а мы — уже ноль. - -### 3. `land()`: проверка пик до коррекции X — ранг **Б** - -*Оригинал:* сначала (внутри ветки «тайл под ногами не пика») делается -коррекция `Char.x = char_dx_forward(-3)` при `distance_to_edge_weight() < 3`, -и лишь ПОТОМ проверяется падение на пики, причём условие для пики ПОЗАДИ -использует `distance_to_edge_weight() >= 12`. - -*У нас:* `pop_map.c:664` — `fell_on_spikes()` вызывается ПЕРВЫМ, до -коррекции X. - -*Чем грозит:* `distance_to_edge_weight()` считается от `Char.x`, а -коррекция этот `x` меняет на 3 пикселя. У края тайла порядок решает, -попадёт ли персонаж в ветку «пика позади» — то есть умрёт он или нет. - -### 4. Смерть: у нас свой флаг вместо счётчика — ранг **В** - -*Оригинал:* `play_kid` (seg006:1348) после смерти ведёт СЧЁТЧИК -`Char.alive`, и по его значениям запускает музыку смерти (`alive == 6`) и -надпись «Press Button to Continue» (`alive == 7`), причём переход -задерживается, пока играет звук (`check_sound_playing`). - -*У нас:* `pop_ctrl.c` (`ctrl_kid_death`) взводит `pop_kid_dead` — сигнал -главному циклу на респавн; счётчика стадий нет. - -*Чем грозит:* момент респавна и порядок «музыка смерти → сообщение → -рестарт» могут отличаться, особенно если смерть застала персонажа в -длинной анимации (падение). Сюда же относится симптом выше: в оригинале -поза сохраняется, пока крутится счётчик. - -### 5. Мёртвый доигрывает приземление — ранг **В** - -Разобрано выше. Код у нас и в оригинале В ЭТОМ МЕСТЕ совпадает, поэтому -ранг не выше среднего: расхождение может сидеть не в `land`, а в моменте -взведения смерти (находка 4) — тогда оригинал успевает поставить кадр -смерти до приземления, а мы нет. Проверяется прогоном на живом SDLPoP. - -### 6. Диспетчер `control()` — ранг **Д** - -Сверен ветка в ветку (seg005:251 против `pop_ctrl.c:618`): совпадают и -порядок проверок (`bumped/freefall` → меч → charid → кадры), и границы -диапазонов кадров, и обработка мёртвого. Расхождений не видно; остаются -только опциональные `#ifdef`-фиксы SDLPoP, которых у нас нет намеренно. - -### 7. `JMP_IF_FEATHER`: у нас эффект только для Кида — ранг **Б** - -*Оригинал:* опкод `SEQ_JMP_IF_FEATHER` (seg006, play_seq) смотрит ТОЛЬКО -на глобальный `is_feather_fall`. Кто именно проигрывает последовательность, -роли не играет. - -*У нас:* `pop_kid.c:306` добавляет условие `Char.charid != CHARID_0_KID` — -для всех, кроме Кида, ветка «пера» не берётся никогда. - -*Чем грозит:* под зельем медленного падения любой НЕ-Кид, попавший в -последовательности `stepfloat`/`bumpfloat`, у нас пойдёт по обычной ветке -(с уроном), а в оригинале — по парящей. Практически это Тень (charid 1) на -уровне 4-6 и скелет; страж в эти seq попадает редко, но попадает через -`bumpfloat` при отскоке. - -*Замечание:* отличие ОСОЗНАННОЕ (в комментарии сказано «эффект достаётся -только Киду — как и сама физика пера»), но в `docs/impl_diff.md` не -записано, хотя правило проекта этого требует. - -### 8. `start_chompers` отложен до конца `play_seq` — ранг **Б** - -*Оригинал:* опкоды `SEQ_UP`/`SEQ_DOWN` меняют ряд и ТУТ ЖЕ зовут -`start_chompers()` — то есть внутри цикла интерпретатора, до разбора -следующих опкодов. - -*У нас:* `pop_kid.c:318-325` только взводит `chomp_pending`, а сам вызов -происходит после выхода из цикла (`:396`). Причина архитектурная и -описана в коде: seqtbl читается через окно W0, а `start_chompers` лезет в -другое окно. - -*Чем грозит:* два следствия. Во-первых, последовательность с ДВУМЯ -сменами ряда (`UP` `UP`, спуск/подъём по лестнице) в оригинале будит -чомперов в обоих рядах, у нас — только в конечном. Во-вторых, между -`SEQ_UP` и концом цикла успевают отработать `dx`/`dy`/`action`, то есть -оригинал будит чомперов с ДРУГИМИ координатами персонажа. - -Симптом «челюсти не заводятся» уже ловился в этом проекте (memory -`pop_chomper_needs_trigger`), и это место — кандидат в его причины. - -### 9. Набор опкодов seqtbl — ранг **Д** - -Сверены все пятнадцать кодов (`0xF1`..`0xFF`): совпадают и значения, и -семантика, включая проваливание `JMP_IF_FEATHER` в `JMP` и то, что -`SEQ_DIE` — пустышка в обоих движках. Отличия только в находках 7 и 8. - -### 10. Отрисовка: шаги те же, но разнесены — ранг **В** - -*Оригинал:* `add_kid_to_objtable` (seg008:1667) и его двойник для стража — -это строго упорядоченная цепочка: `loadkid`/`loadshad` → -`load_fram_det_col` → `load_frame_to_obj` → `stuck_lower` → -`set_char_collision` → `set_objtile_at_char` → `redraw_at_char` → -`redraw_at_char2` → `clip_char` → `add_objtable`. - -*У нас:* все звенья присутствуют, но распределены по слоям: `clip_char`, -`load_frame_to_obj`, `check_mirror`, брызги — в `pop_cdraw.c`; -`redraw_at_char`/`set_objtile_at_char`/`set_char_collision` — в `pop_bg.c` -(единый проход на всех Char, см. CLAUDE.md). - -*Чем грозит:* сам по себе перенос не ошибка, но ПОРЯДОК внутри цепочки -влияет на результат: `set_char_collision` и `set_objtile_at_char` готовят -данные, которыми пользуются `redraw_at_char` и `clip_char`. Если наш -общий проход выполняет их для ОБОИХ персонажей до отрисовки, а оригинал — -для каждого непосредственно перед его выводом, то при наложении Кида и -стража состояние на момент клипа будет разным. - -*Отдельно:* `stuck_lower` найден только в `pop_cdraw.h` — надо убедиться, -что он реализован, а не только объявлен. Если его нет, персонаж, -застрявший на границе тайла, будет рисоваться на пиксель выше. - -### 11. Порядок вывода Кида и стража — ранг **В** - -*Оригинал:* `draw_people` (seg008:1635) всегда ставит сначала Кида -(`draw_kid`), затем стража (`draw_guard`), а КТО ОКАЖЕТСЯ СВЕРХУ решает -`add_objtable` — таблица объектов упорядочена по позиции тайла. - -*У нас:* по CLAUDE.md порядок задаёт обход тайлов, «кто позже — тот -поверх». Это близко по смыслу, но не тождественно сортировке objtable. - -*Чем грозит:* при наложении персонажей (бой вплотную, страж перед Кидом) -верхний может оказаться другим. Проверять сравнением кадров боя вплотную -с эталонным SDLPoP (метод — memory `pop_pixel_diff_vs_sdlpop`). - -### 12. `hurt_by_sword`: ветка «сбит с уступа» не портирована — ранг **А** - -*Оригинал:* `hurt_by_sword` (seg002:911) при уколе ВООРУЖЁННОГО персонажа -выбирает одну из двух смертей по обстановке ПОЗАДИ: - -* тайл позади не пустой ИЛИ до кромки меньше 4 → `seq_85_stabbed_to_death` - (заколот на месте); -* иначе → `seq_81_kid_pushed_off_ledge` — отдельная последовательность - «убит и сброшен с уступа», которая сама отыгрывает падение замертво. - -*У нас:* `guards.c:1015` — ветки `seq_81` НЕТ вовсе, всегда `seq_85`. -Упрощение ЗАДОКУМЕНТИРОВАНО в комментарии (`guards.c:1011`): ей нужны -тайловые запросы от `Char`, а `pop_map` умеет их только от `Kid`. - -*Чем грозит:* именно тем, что наблюдал пользователь. Заколотый на краю -обрыва Кид в оригинале уходит в собственную анимацию падения с уступа; у -нас он получает «смерть на месте», продолжая при этом висеть в воздухе — -дальше им распоряжается обычная физика падения, и он приземляется этажом -ниже по общим правилам (а с убранным в `start_fall` мечом — в присед, -находка 5). - -*Как проверить:* поставить Кида спиной к обрыву с 1 HP и дать стражу -уколоть. В оригинале — падение замертво (кадры seq_81), у нас — смерть -на месте с последующим отдельным падением. - -### 13. `hurt_by_sword`: прижатие к полу стало безусловным — ранг **А** - -*Оригинал:* `Char.y = y_land[Char.curr_row + 1]` и `Char.fall_y = 0` -выполняются ТОЛЬКО в ветке выжившего удара (seg002:962, рядом с -`seq_74_hit_by_sword`). Смертельные ветки координату не трогают. - -*У нас:* `guards.c` — те же две строки стоят ПОСЛЕ всего `if/else`, то -есть выполняются и при смерти тоже. - -*Чем грозит:* персонажа, убитого в воздухе, мы принудительно ставим на -пол текущего ряда и обнуляем накопленную скорость падения. Дальше физика -обнаруживает, что пола под ним нет, и запускает падение ЗАНОВО — уже без -`fall_y`, то есть с другой высотой и другим исходом приземления. Это -вторая половина механизма из находки 12 и вероятная причина того, что -мёртвый Кид доезжает до нижнего этажа «своим ходом». - -*Как проверить:* тот же сценарий; в отладчике смотреть `Char.y` и -`fall_y` сразу после попадания — оригинал их не меняет. - -### 14. Отскок с мечом: нет `seq_64` — ранг **Б** - -*Оригинал:* при отскоке (`bumped`, seg004:328) живой персонаж с вынутым -мечом получает ОДНУ ИЗ ДВУХ последовательностей по направлению толчка: -толкнули вперёд — `seq_65_bump_forward_with_sword`, отбросило назад — -`seq_64_pushed_back_with_sword`. - -*У нас:* `pop_map.c` знает только `SEQ_65_BUMP_FWD_SWORD` (объявлен на -`:103`, используется на `:2231`); константы и ветки `seq_64` нет вовсе. - -*Чем грозит:* персонаж, отброшенный назад с мечом (страж у стены, Кид в -тесной комнате), проигрывает не ту анимацию — либо ветку без меча, либо -`seq_65`. Кадры разные, а вместе с ними расходятся и смещения `dx` в -последовательности, то есть итоговая позиция после отскока. - -*Как проверить:* бой вплотную к стене, толчок в сторону стены и от неё; -сверять кадры с эталонным прогоном SDLPoP. - -### 15. `check_bumped_look_right`: гейт по направлению — ранг **В** - -В нашей реализации (`pop_map.c:2148`) стоит ранний выход по -`Char.direction` с пометкой «(меча в руке у нас нет)». Пометка означает, -что ветка писалась до появления боя, а оригинал в этом месте учитывает и -меч, и `push_direction` (находка 14). Область `check_bumped_look_left` -не сверялась вовсе — её надо пройти отдельно. - -### 16. `control_with_sword` — ранг **Д** - -Сверен целиком (seg005:964 против `pop_ctrl.c:587`): гейт по `action`, -условие «пол под ногами loose ИЛИ страж видит Кида», пороги дистанции -(90 и −4), `seq_60_turn_with_sword`, ветка «соперник умер» с -`seq_92_put_sword_away`, разделение по `charid`. Совпадает. - -Отдельно отмечу: в оригинале сравнение дистанции сделано ЗНАКОВО-НЕЯВНО -(приведением к `word`), из-за чего ветка «соперник за спиной» вообще -достижима. У нас то же самое выражено явными знаковыми сравнениями — и -диапазоны совпадают, включая «вплотную за спиной» (−4..−1), где обе -реализации ведут бой, а не разворачиваются. - -### 17. `parry` — ранг **Д** - -Сверен целиком (seg005:1064 против `pop_ctrl.c:513`): список кадров -стойки, порог 32 для не-Кида, обработка кадров соперника (151/152/162, -особый случай 153 с отложенным `play_seq`), ветка стража по кадру 152, -ветка `frame_167_blocked` с `seq_61`, сброс автоповтора `control_up`. -Совпадает вплоть до порядка условий. - -### 18. `check_hurting`: звук «меч в движении» в других условиях — ранг **Б** - -*Оригинал:* звук 11 играется в САМОМ КОНЦЕ `check_hurting` (seg002) и -только при трёх условиях сразу: направление персонажа не `none`, его кадр -— укол (154), а соперник при этом НЕ парирует и НЕ ранен. Первое условие -добавлено в SDLPoP специально против зацикливания звука. - -*У нас:* `guards.c:1068` — звук играется в начале ветки укола, -безусловно, ещё до того, как определено попадание. - -*Чем грозит:* лишние срабатывания в двух ситуациях, где оригинал молчит — -когда удар парирован и когда он попал. То есть в самой частой части боя -звук звучит чаще, чем должен. Плюс отсутствует защита от зацикливания -при `direction == none`. - -*Как проверить:* бой с парирующим стражем; считать срабатывания звука 11 -на серии ударов и сравнить с эталонным прогоном SDLPoP. - -### 19. Остальной бой сверен — ранг **Д** - -Прочитаны целиком и совпадают: - -* `swordfight` (seg005:998) — включая ветку кадра 161, `sword_strike`, - побочные эффекты уборки меча (`offguard`, `guard_refrac`, - `holding_sword`), разделение `seq_93`/`seq_92`/`seq_87` по `charid` и - хвост (`parry` / `forward_with_sword` / `back_with_sword`); -* `sword_strike` (seg005:1037) — список кадров, выбор `seq_75`/`seq_58`, - `seq_66` после парирования, сброс автоповтора; -* `check_sword_hurt` (seg002:971) — включая ПРИОРИТЕТ СТРАЖА при - одновременном ранении и сброс `Kid.action` в бег, а также - `refractimer` по навыку; -* `check_hurting` в основной части — гейты по мечу, ряду и кадрам, пороги - дистанции (29), `min_hurt_range` 8/12 по мечу соперника, ветка - парирования с `justblocked` и `seq_69`. Единственное расхождение — - звук, находка 18. - -### 20. Стражи: «стена впереди» сужена до одного тайла — ранг **Б** - -*Оригинал:* `guard_follows_kid_down` (seg002:811) и соседние ветки ИИ -спрашивают `wall_type(tile) != 0`. Эта функция (seg006:1626) считает -преградой ПЯТЬ видов тайлов: ворота, верх двери с полом, верх двери, -зеркало, чомпер и собственно стену — с разной стороной блокировки. - -*У нас:* `guards.c:683` и `:685` сравнивают тайл напрямую с `TILE_WALL` -(тип 20). Ворота, верх двери, зеркало и чомпер преградой не считаются. - -*Причина:* `wall_type` реализована у нас (`pop_map.c:504`, таблица на -`:498`), но НЕ экспортирована — в `pop_map.h` её нет, поэтому `guards.c` -до неё не дотягивается. То есть это не пробел в портировании логики, а -следствие границы модулей. - -*Чем грозит:* страж, преследующий упавшего Кида, у нас шагнёт вперёд там, -где оригинал отступает — перед закрытыми воротами, верхом двери, -зеркалом и чомпером. Отсюда возможны и проход стража сквозь препятствие, -и падение туда, куда оригинал его не пускает. - -*Как проверить:* уровень с воротами (например, 3-й) — заманить стража к -закрытым воротам после падения Кида и сравнить, отступает ли он. - -*Замечание:* в `guards.c` таких мест ЧЕТЫРЕ (`:148`, `:683`, `:685`); -одно из них (`:148`) уже перечисляет три тайла вручную, то есть -расхождение частично компенсировано, но не везде одинаково. - ---- - -## Область: столкновение со стенами и падение внутри стены - -Заведена по наблюдению пользователя (2026-08-31): разбег, прыжок сделан -рано, Кид не долетел, врезался в стену и начал падать — но по X он -оказался ВНУТРИ стены и падал частично в ней. - -### 21. Фикс «скольжения сквозь стену» — ПОРТИРОВАН 2026-08-31 - -> Решением пользователя исправление взято в ТЕКУЩИЙ билд: играбельность -> важнее буквальности. Реализация — `glide_through_wall_guard()` в -> `pop_map.c`, вызывается из `do_fall` в ветке «ещё летим». Цена: +57 -> байт в банке 3, резидент и куча не изменились. -> -> Подтверждено host-тестом: в наборе `t_wall` число заходов в кладку -> упало с двух до нуля, остальные 15 наборов остались зелёными. -> -> Ниже — исходный разбор, по которому принималось решение. - -### 21a. Исходный разбор: было соответствие ванили — ранг **Г** - -*Оригинал:* в `do_fall` (seg005:37) есть блок `FIX_GLIDE_THROUGH_WALL` с -собственным комментарием SDLPoP: «Кид падает сквозь стены после разворота -в беге, особенно в невесомости». Блок опциональный — то есть в ВАНИЛЬНОЙ -игре этот баг ЕСТЬ, а SDLPoP его чинит по желанию. Рядом такие же -опциональные `FIX_JUMP_THROUGH_WALL_ABOVE_GATE` и `FIX_DROP_THROUGH_TAPESTRY`. - -*У нас:* ни один из трёх не портирован — мы намеренно повторяем ваниль. - -*Вывод по симптому:* «падение частично в стене» — с большой вероятностью -ОРИГИНАЛЬНОЕ поведение PoP, а не наша ошибка. Ранг Г означает: различия -с ванилью, скорее всего, нет. Но проверить стоит другое — не ХУЖЕ ли у -нас, чем в ванили (см. находки 22 и 15). - -*Как проверить:* повторить сцену на живом SDLPoP с выключенными фиксами -(они выключаемы в его настройках) и сравнить глубину захода в стену. - -### 22. `do_fall`: наш гард `curr_row <= 2` — ранг **В** - -*Оригинал:* в `do_fall` ветка «достигли нового ряда» выполняется БЕЗ -условия на номер ряда: проверка тайла стены с вызовом выталкивания, затем -`land()` либо переход на ряд ниже. - -*У нас:* `pop_map.c:909` — вся ветка обёрнута в `if (Char.curr_row <= 2)`. -Причина задокументирована (`:768`): наш `get_tile` за нижней кромкой -комнаты отдаёт СТЕНУ как сентинель, тогда как в оригинале там комната -снизу, и без гарда выталкивание срабатывало ложно, смещая падение на тайл. - -*Чем грозит:* гард гасит не только ложные срабатывания. Если персонаж -достиг `curr_row == 3` легитимно (падение между комнатами по вертикали), -у нас не выполнится ни выталкивание из стены, ни `land()`, ни переход -ряда — всё это ляжет на следующий кадр и другую ветку. Именно такая -комбинация (падение у границы комнаты рядом со стеной) даёт кандидата в -причины наблюдения пользователя. - -*Как проверить:* падение вдоль стены точно на стыке комнат по вертикали; -в отладчике смотреть `curr_row`, `Char.x` и факт вызова выталкивания. - -### 23. `bumped_fall` — ранг **Д** - -Сверен (seg004 против `pop_map.c`): откат X на 4 пикселя назад, обнуление -горизонтальной скорости в свободном падении, иначе `seq_45_bumpfall` с -проигрыванием, звук удара. Совпадает; у нас добавлен только флаг «стражи -услышали», который в оригинале ставится внутри звуковой функции. - -**Замечание по области:** глубина отката при столкновении — ровно 4 -пикселя в обоих движках. Если Кид вошёл в стену глубже (а при -недолёте с разбега скорость по X велика), одного отката не хватит ни там, -ни у нас — и дальше всё зависит от того, сработает ли выталкивание из -стены на следующем кадре. У нас его может съесть гард из находки 22. -Это главная зацепка по симптому. - -### 24. `in_wall`: не перезагружается кадр — ранг **Б**, ОТЛОЖЕНА - -> **Правка сделана и откачена 2026-08-31.** По букве оригинала находка -> верна, но практического эффекта показать не удалось: все 15 наборов -> host-тестов дали одинаковый результат до и после, включая специально -> написанный тест на заход в кладку (`t_wall`). При этом правка не -> бесплатна — добавляет маппинг окна и перезагрузку кадра на каждое -> выталкивание из стены. Платить за недоказанное не стали. -> -> Задача переехала в `docs/vanilla_vs_bugfixed.md`: вернуться к ней при -> работе над двумя режимами поведения, где появится сценарий, в котором -> кадр меняется перед выталкиванием. - - -*Оригинал:* `in_wall` (seg006) после выталкивания персонажа из стены -делает `load_fram_det_col()` — ЗАГРУЖАЕТ КАДР и следом определяет колонку, -затем перечитывает тайл. - -*У нас:* `pop_map.c` (`in_wall`) вызывает только `determine_col()`. -Пороги (`>= 8`), формулы смещения (`6 - d` и `d + 4`), условие по тайлу -впереди и финальное чтение тайла совпадают — расходится только этот шаг. - -*Чем грозит:* после выталкивания данные кадра (картинка, смещения, флаги -— включая «нужен пол» и «чётный пиксель») остаются от позиции ДО -коррекции, а ими пользуются проверки того же кадра: падение, клип, -коллизия. Это ровно область, где наблюдалось падение внутри стены -(находки 21, 22). - -*Как проверить:* недолёт с разбега в стену; в отладчике сравнить `Char.x`, -колонку и поля текущего кадра сразу после выталкивания. - -### 25. Таблицы кадров и seqtbl — ранг **Д** - -`frame_table_kid`, `original_seqtbl` и таблица смещений извлекаются -АВТОМАТИЧЕСКИ из исходников SDLPoP (`tools/pop_extract_kid_data.py` → -`gen/kid_data.h`), поэтому расхождение в данных маловероятно по -построению. Применение тоже сверено: используются все четыре флага кадра -(«нужен пол» 0x40, вес по X 0x1F, «тонкий» 0x20, чётный пиксель 0x80), а -байт клинка маскируется как в оригинале (`& 0x3F`, `pop_kdraw.c:31`). - -Не сверено: старшие два бита байта клинка (номер набора спрайтов) — у -Кида он нулевой, у прочих персонажей стоит проверить отдельно. - -### 26. Полнота автоуправления — ранг **Д** - -Из двенадцати функций `autocontrol_*` оригинала у нас есть одиннадцать. -Отсутствующая — тривиальная обёртка над общей логикой стража; у нас она -встроена в вызывающего. Расхождения нет. - -Не сверены ПОСТРОЧНО тела: `autocontrol_guard_kid_armed`, -`autocontrol_guard_kid_far`, `autocontrol_shadow*`, `autocontrol_skeleton`, -`check_grab`, `check_bumped_look_left`, `back_with_sword`, -`forward_with_sword`. - ---- - -## ИТОГ АУДИТА - -Проверено 26 позиций за пять проходов. - -| ранг | находки | суть | -|---|---|---| -| **А** | 1, 12, 13 | лишний пересчёт колонки в `land`; нет ветки «убит и сброшен с уступа»; безусловное прижатие к полу при смерти | -| **Б** | 2, 3, 7, 8, 14, 18, 20, 24 | `fall_x` и момент сброса; порядок «пики / коррекция X»; перо только для Кида; отложенные чомперы; нет `seq_64`; звук удара; «стена» сужена до одного тайла; нет перезагрузки кадра в `in_wall` | -| **В** | 4, 5, 10, 11, 15, 22 | флаг смерти вместо счётчика стадий; мёртвый доигрывает приземление; разнесённая цепочка отрисовки; порядок Кид/страж; гейт в `check_bumped_look_right`; гард `curr_row <= 2` в `do_fall` | -| **Г** | 21 | опциональные фиксы SDLPoP не портированы — соответствие ванили | -| **Д** | 6, 9, 16, 17, 19, 23, 25, 26 | сверено и совпадает | - -### Три узла, вокруг которых группируются расхождения - -1. **Смерть при активной физике** (1, 12, 13, 4, 5). Здесь все находки - ранга А. Общая причина: у нас смерть — это флаг, а физика продолжает - работать с персонажем как с живым. -2. **Границы модулей** (12, 20, 24). `pop_map` не отдаёт наружу то, что - нужно `guards.c` и работе с произвольным `Char`: тайловые запросы от - `Char`, `wall_type`, загрузку кадра. Ветки упрощались не по логике, а - по доступности функций. -3. **Момент побочных действий** (2, 8, 18, 24). Делаем то же самое, но - раньше или позже оригинала: сброс скорости, побудка чомперов, звук, - перезагрузка кадра. По отдельности мелочь, вместе — сдвиг состояния - на кадр. - -### Что делать дальше - -1. Проверить находки А и Б в MAME по сценариям из их описаний — начиная с - 12/13 (смерть на краю) и 24 (выталкивание из стены). -2. Те же сцены прогнать на живом SDLPoP: часть наблюдений может оказаться - ванильным поведением (как находка 21). -3. Подтверждённые осознанные отличия записать в `docs/impl_diff.md` — - сейчас там нет ни одного из найденных, хотя правило проекта требует. - - -Порядок по ожидаемой отдаче: - -1. **Бой** — ПРОЙДЕН. Находки: 12, 13 (ранг А), 18 (Б); совпадают - `control_with_sword`, `parry`, `swordfight`, `sword_strike`, - `check_sword_hurt`, `check_hurting` (кроме звука). Не сверены мелочи: - `back_with_sword`, `forward_with_sword`, `check_skel`. -2. **`play_seq` и опкоды** — самая опасная область: ошибка в одном опкоде - меняет все последовательности разом. -3. **Отрисовка** — `add_kid_to_objtable`/`add_guard_to_objtable`, порядок - слоёв, `clip_char`. -4. **`do_fall`/`check_bumped`/`check_grab`** — остаток физики. -5. **ИИ стражей** и особенности скелета/Тени/Джафара. - - ---- - -# Глубокое ревью находок А и Б: можно ли починить и чем платим - -> 2026-08-31. КОД ПО-ПРЕЖНЕМУ НЕ МЕНЯЛСЯ. Здесь только оценка. -> -> **Главное ограничение (требование пользователя): фикс не должен заметно -> замедлять игру.** Поэтому у каждой находки первым делом указана ЧАСТОТА -> вызова места, а уже потом сама правка. -> -> **Оговорка к ограничению:** для КРИТИЧНЫХ фиксов скорость — не вето. -> Если такой фикс всерьёз бьёт по производительности, он выносится в -> отдельный разбор, где ищется способ получить правильное поведение -> дёшево (иной момент вызова, кэш, предвычисление, перенос в холодный -> путь). То есть порядок такой: сначала решаем, критично ли поведение, и -> только потом — какой ценой его добиться. - -## Снятое препятствие - -Обоснование сразу двух упрощений (`guards.c:1011` — «нужны тайловые -запросы ОТ Char, а pop_map умеет только от Kid») **устарело**. Проверено: -`get_tile_at_char`, `get_tile_infrontof_char`, `get_tile_behind_char` и -`distance_to_edge_weight` в `pop_map.c` УЖЕ работают от `Char` -(строки 460, 465, 477, 561). Они лишь не выведены в `pop_map.h`. - -Так же обстоит с данными: `pop_char_set_seq()` ставит любую из 115 -последовательностей по индексу, то есть `seq_81` и `seq_64` доступны без -единого нового байта данных — таблица генерируется из оригинала целиком. - -То есть три находки (12, 14, 20) упираются не в архитектуру, а в четыре -строки объявлений. - -## Классификация мест по частоте вызова - -| место | частота | вывод | -|---|---|---| -| `play_seq` (находки 7, 8) | КАЖДЫЙ кадр каждого персонажа | правка обязана быть бесплатной | -| `check_hurting` (18) | каждый кадр боя, дважды | почти горячий | -| ИИ стража (20) | каждый кадр, пока страж активен | почти горячий | -| `land`, `in_wall`, `bumped` (1, 2, 3, 14, 24) | событие раз в несколько секунд | холодный, цена не важна | -| `hurt_by_sword` (12, 13) | момент попадания | холодный | - -## Разбор по находкам - -### 12 + 13 (ранг А) — смерть на краю. ТОЛЬКО ВМЕСТЕ, НЕ ПООТДЕЛЬНОСТИ - -> **Проверено на живой машине 2026-08-31 и провалилось.** Правка 13 была -> сделана в изоляции (прижатие к полу перенесено в ветки пережитого -> удара) — и сломала смерть: страж бьёт Кида, тот погибает, а вместо -> нормальной смерти идут вспышка, стопкадр и немедленный выход в -> заставку. -> -> Причина: у нас прижатие к полу работало КОМПЕНСАЦИЕЙ отсутствующей -> ветки «убит и сброшен с уступа» (находка 12). Убрав компенсацию и не -> добавив то, что она компенсировала, мы оставляем мёртвого персонажа с -> ненулевой `fall_y` и незакреплённой `Char.y` — физика продолжает вести -> его вниз, он проваливается за пределы уровня, и срабатывает аварийный -> путь. -> -> Вывод: обе находки — ОДНА правка. Оценка «чистое перемещение строк, -> риск низкий» была неверной; риск ВЫСОКИЙ, пока ветка 12 отсутствует. -> Порядок внутри правки: сперва добавить ветку `seq_81` (с экспортом -> тайловых запросов), убедиться, что смерть на краю отыгрывается ею, и -> только затем убирать безусловное прижатие. - - -*Место:* `guards.c`, `hurt_by_sword` — холодный путь. - -*Правка:* (а) перенести две строки прижатия к полу внутрь ветки -выжившего удара — это чистое перемещение, минус ноль байт; (б) добавить -ветку выбора `seq_81` по тайлу позади и расстоянию до кромки. - -*Что нужно:* экспорт `get_tile_behind_char()` и `distance_to_edge_weight()` -из `pop_map.c` в `pop_map.h` как `__banked`. - -*Цена скорости:* два межбанковых вызова (`guards.c` — банк 1, `pop_map.c` -— банк 3) в момент попадания мечом, то есть несколько раз за бой. -Незаметно. - -*Цена памяти:* банк 1 занят на 19,8 % (13 142 Б свободно) — места вдоволь; -банк 3 занят на 81,1 % (3 100 Б), но там прибавятся только две обёртки. - -*Риск:* низкий. Ветка симметрична существующей, данные есть. - -### 1 (ранг А) — лишний `determine_col()` в `land` - -*Место:* холодный путь. *Правка:* убрать вызов и проверить, не -понадобился ли он нам вместо оригинального `load_fram_det_col`, который -оригинал делает в другом месте цепочки. *Цена:* отрицательная (кода -меньше). *Риск:* СРЕДНИЙ — вызов мог компенсировать наш иной порядок -загрузки кадра; убирать только с прогоном сцен падения и приземления. - -### 2, 3 (ранг Б) — `land`: `fall_x` и порядок проверки пик - -*Место:* холодный. *Правка 2:* сбрасывать только `fall_y` и после -`play_seq`, как оригинал. *Правка 3:* перенести проверку пик после -коррекции X. *Цена:* нулевая, это перестановка строк. *Риск:* низкий, -но обе меняют поведение на краю тайла — нужны прогоны с пиками. - -### 24 (ранг Б) — `in_wall` не перезагружает кадр. Одна строка - -*Место:* холодный. *Правка:* заменить `determine_col()` на -`pop_load_fram_det_col()` — он УЖЕ экспортирован (`pop_kid.h:109`) и, что -важно, НЕ банковый, то есть вызов прямой. *Цена скорости:* одна -перезагрузка кадра при выталкивании из стены — доли процента кадра. -*Риск:* низкий; это возврат к оригиналу. - -### 14 (ранг Б) — нет `seq_64` - -*Место:* `bumped`, холодный. *Правка:* добавить выбор между 64 и 65 по -направлению толчка. *Цена:* нулевая. *Риск:* низкий. - -### 18 (ранг Б) — звук удара - -*Место:* `check_hurting` — дважды за кадр боя. *Правка:* перенести звук -в конец функции и обвесить тремя условиями оригинала. *Цена:* -ОТРИЦАТЕЛЬНАЯ — звук перестанет играть в двух случаях из трёх, то есть -уменьшится и число обращений к звуковой очереди. *Риск:* низкий. - -### 20 (ранг Б) — «стена» у стражей. Требует осторожности со скоростью - -*Место:* ИИ стража — вызывается каждый кадр, пока страж активен. - -*Плохой вариант:* экспортировать `wall_type` из `pop_map.c` и звать из -`guards.c`. Это МЕЖБАНКОВЫЙ вызов (банк 1 → банк 3) в почти горячем -пути — трамплин с переключением W3 на каждый шаг ИИ. Против требования -по скорости. - -*Хороший вариант:* завести копию таблицы `wall_type_tbl` (32 байта) в -rodata банка 1 и обращаться к ней напрямую — стоимость чтения байта, -ноль переключений банка. Дублирование данных здесь оправдано: таблица -константная и вшита в формат уровней. - -*Риск:* низкий, но нужно следить, чтобы копия не разошлась с оригиналом — -лучше генерировать обе из одного места или снабдить перекрёстным -комментарием. - -### 7 (ранг Б) — перо только для Кида. Правка ускоряет - -*Место:* `play_seq`, самый горячий путь. *Правка:* убрать лишнее условие -по `charid`. *Цена:* ОТРИЦАТЕЛЬНАЯ — из горячего цикла уходит сравнение. -*Риск:* средний: надо убедиться, что физика пера у нас применяется к -любому персонажу так же, как в оригинале, иначе анимация разойдётся с -физикой. - -### 8 (ранг Б) — отложенные чомперы. Чинить ДЕШЁВЫМ способом - -*Место:* `play_seq`, горячий путь. - -*Почему отложено:* `play_seq` маппит страницу байткода в окно W0 ОДИН раз -перед циклом (`pop_kid.c:284`) и снимает после (`:389`). Вызвать -`start_chompers` внутри цикла — значит снять окно, позвать, вернуть окно, -и так на каждый переход ряда. Это прямая деградация горячего пути и -против требования по скорости. - -*Дешёвая замена:* сейчас копится ОДИН флаг, из-за чего теряются -промежуточные ряды. Достаточно копить не флаг, а НОМЕРА рядов — один -байт-битовую маску (рядов всего 0..3) плюс запомненную колонку. После -цикла пройти по взведённым битам и разбудить чомперов в каждом. Цена в -цикле: одна операция «выставить бит» вместо присваивания флага, то есть -ноль. Разница с оригиналом останется только в МОМЕНТЕ побудки (после -цикла, а не внутри), но ряды перестанут теряться. - -*Риск:* низкий. Полное совпадение с оригиналом здесь недостижимо без -потери скорости — это осознанный компромисс, который надо записать в -`docs/impl_diff.md`. - -## Сводка: что делать в каком порядке - -| приоритет | находки | почему | -|---|---|---| -| 1 | 24 | одна строка, риск низкий, готовая экспортированная функция | -| 2 | 12+13 ВМЕСТЕ | порознь ломают смерть (проверено); нужен экспорт двух функций | -| 3 | 18, 8 | обе УСКОРЯЮТ или бесплатны; 8 — по дешёвому варианту | -| 4 | 2, 3, 20 | перестановки и копия таблицы; нужны прогоны | -| 5 | 1, 7 | риск средний: обе могут компенсировать наши отличия в другом месте | - -**Ни один фикс не требует переделки архитектуры и ни один не ложится на -горячий путь с накладными расходами** — при условии, что находка 20 -делается копией таблицы, а находка 8 — битовой маской рядов. diff --git a/applications/SprPoP/docs/shadow_render.md b/applications/SprPoP/docs/shadow_render.md deleted file mode 100644 index af0a39b..0000000 --- a/applications/SprPoP/docs/shadow_render.md +++ /dev/null @@ -1,160 +0,0 @@ -# Отрисовка Тени (charid_1_shadow) — изыскания, отложено - -Статус на 2026-08-11: **отложено по решению пользователя.** Тень пока -рисуется как обычный персонаж — простой копией из атласов Кида -(`pop_cdraw.c`, банк 0x5C, аппаратная прозрачность `#FF`). Вернуться к -«правильному» виду, когда будут сделаны все уровни: тогда будет известно, -какими именно кадрами тень вообще пользуется. - -Этот файл собирает всё, что уже выяснено, чтобы не переоткрывать. - ---- - -## 1. Как тень выглядит в оригинале - -Тень рисуется **двумя блитами ОДНОГО И ТОГО ЖЕ спрайта Кида** -(`seg008:1602`, `add_objtable`): - -```c -case 1: // shadow - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl, obj_y, blitters_2_or, 1); - add_midtable(obj_chtab, obj_id + 1, obj_xh, obj_xl + 1, obj_y, blitters_3_xor, 1); -``` - -OR на месте, XOR со сдвигом на пиксель вправо. XOR гасит совпавшее, -остаются края — отсюда «контурный» вид. Это ЗАМЫСЕЛ оригинала, а не -артефакт SDLPoP: подтверждено печатью из живого SDLPoP (метка `DBGMIRROR` -в `add_objtable`) — и тень, и отражение идут из `chtab=2` (собственные -спрайты Кида), `swordbits=0`, обычными кадрами: - -``` -type=4 chtab=2 img=40 dir=0 clipL=137 clipT=3 charid=0 frame=41 <- отражение -type=1 chtab=2 img=41 dir=0 clipL=137 clipT=3 charid=1 frame=42 <- тень -``` - -Единственное различие между отражением и тенью — блиттер. - -## 2. Чем мы располагаем - -Блочные AND/OR/XOR/NOT акселератора подняты в libbgi 2026-08-11 (полный -набор строками и колонками, `gfx_blit_op` / `gfx_blit_part_op` / -`gfx_blit_cols_op` / `gfx_blit_cols_part_wx_op`; регресс — `tests/accop`, -10/10 PASS). Механика и ловушки — memory `accel_block_ops` и шапка -`libbgi/common/_gfx_blit_full_op.c`. То есть примитивов достаточно, дело -не в них. - -## 3. Две причины, по которым «в лоб» не получается - -### 3.1 XOR несовместим с нашей прозрачностью `#FF` - -Аппаратная прозрачность (бит 3 видеобанка) подавляет запись байта `#FF`, -то есть смотрит на **результат** операции: - -| операция | прозрачный пиксель источника | итог | -|---|---|---| -| AND | `#FF & bg = bg` | работает даром | -| OR | `#FF \| bg = #FF`, запись подавляется | работает даром | -| XOR | `#FF ^ bg = ~bg`, подавления нет | **инверсия фона по всему футпринту** | - -Совпадение с «ничего не делать» у XOR получается только там, где фон равен -0 (`#FF ^ 0 = #FF` → подавляется). В DOS-оригинале прозрачный индекс = 0 — -нейтральный и для OR, и для XOR, поэтому там оба блиттера работают на одном -наборе спрайтов. У нас прозрачный `0xFF` (`pop_pack_kid.py`: `0 -> 0xFF`, -`i -> 0x70 + i`). - -Замаскировать `#FF` внутри операции нельзя в принципе: побитовые AND/OR/XOR -не умеют «выбрать по условию», а `#FF` — нейтраль только для AND. Значит -источнику XOR-прохода нужен **прозрачный `0x00`**, то есть отдельный набор -спрайтов. - -### 3.2 Операция читает ОЗУ-копию экрана, а не видео-ОЗУ - -Чтение страниц `#50..#5F` всегда отдаёт ОЗУ-копию (memory -`sprinter_vram_transparency`), а персонажи рисуются банком `0x5C` («не -писать в копию» — на этом держится даровой heal). Поэтому второй проход -**не увидит результат первого**: два блита оригинала выродились бы в -«просто XOR», контурного эффекта не будет. - -Лечится не банком `0x50` (он ломает heal — копия перестанет быть чистым -фоном), а **однопроходным композитом**: всё складывается в буфере -акселератора за один проход по колонке j футпринта - -``` -буфер := s[j] ; спрайт -буфер |= bg[j] ; вертикальное чтение экрана -буфер ^= s[j-1] ; тот же спрайт, предыдущая колонка = сдвиг на +1 px -запись ; вертикальная запись колонки -``` - -что **точно эквивалентно** двум блитам оригинала (крайние колонки: `x` — -только OR, `x+w` — только XOR) и вдобавок дешевле их: 4 burst'а на колонку -против 6. Такому композиту тоже нужен источник с прозрачным `0x00` — уже -на обоих шагах. - -## 4. Сколько стоит подготовить источник с прозрачным `0x00` - -Замер 2026-08-11 (`tests/convbench`, watchpoint по IO-записи в MAME, кадр = -430 080 тактов). Цикл безветвочный (`ADD A,A / SBC A,A / CPL / AND` — -маска из бита 7: прозрачный `#FF` отличается от цветов Кида `0x70..0x7F` -именно им), 59 номинальных T-states на байт, по факту **145.3 такта/байт** -(2.5× wait-state'ов ОЗУ): - -| объём | кадров | секунд | -|---|---|---| -| 1 страница атласа, 16 КБ | 5.5 | 0.11 | -| весь атлас Кида, 28 страниц × 16 КБ = 448 КБ | 155 | 3.2 | -| он же **по реальному размеру данных (186 КБ)** | 64 | **1.3** | - -Последняя строка — замечание пользователя: 28 атласов занимают 186 КБ, а не -448 КБ; обрабатывать по фактическому размеру ленты вместо целой страницы -даёт 2.4× (ценой проверки границы в цикле). Потолок разгона самого цикла — -ещё примерно вдвое (раскрутка убирает `djnz`, чтение через SP парами + -таблица 256 Б вместо арифметики), то есть **~0.7 с** на 186 КБ. Порядок -величины при этом не меняется. - -**Окна:** источник и приёмник — разные EMM-страницы, а окно под атласы одно -(W0), поэтому конвертация гоняется «страница-источник в W0 → -страница-приёмник в W3» целыми страницами; побайтно переключать окно нельзя. -EMM-бюджет: +28 страниц (448 КБ) из ~3440 КБ свободных — не проблема -(memory `sprinter_emm_budget`), и он одинаков в любом из вариантов. - -## 5. Варианты (когда вернёмся) - -1. **Конвертация в рантайме при загрузке уровня с тенью** (4, 5, 6, 12): - диск и упаковщик не трогаем, цена — 1.3 с (или 0.7 с после разгона) на - загрузку такого уровня. -2. **Лениво, постранично** — 0.11 с (5.5 кадра) при первом обращении тени к - странице; рывок один раз на страницу, суммарно меньше, чем вариант 1. -3. **Второй набор `.atl` от упаковщика** (`pop_pack_kid.py`, прозрачный - `0x00`): 0 с рантайма, +186 КБ на образе и вторая ветка в загрузчике - атласов. -4. **Только OR-проход** (то, чем можно обойтись бесплатно): OR с нашим - `#FF`-атласом работает как есть, тень получается сплошным силуэтом в - палитре Кида, без контурного эффекта. Расхождение с оригиналом — тогда - записью в `docs/impl_diff.md`. - -**Ключ к выбору — какие кадры тень вообще использует.** Предположение -пользователя: только бег, длинный прыжок (из зеркала), питьё зелья и -боёвка; прыжки с места и подтягивания — нет. Если так, конвертировать -(или паковать) нужно единицы страниц, а не 28, и разница между вариантами -почти исчезает. Список снимать по факту — когда уровни 5/6/12 будут -проходиться. - -## 6. Что ещё придётся проверить глазами - -Палитра. У нас индексы разложены группами по 16 (`pop_pack_bg.py`): -`0x30` VGA16, `0x40` chtab_1, `0x50` env, `0x60` wall, `0x70` kid, `0x80` -sword, `0x90` guard. Отсюда ожидания (аналитические, в MAME НЕ -проверялись): - -- OR-проход ложится удачно: `0x7X | 0x5Y = 0x7Z` — результат остаётся в - палитре Кида, а младший ниббл получается ровно тот же, что дал бы DOS - (там OR шёл по 4-битным индексам внутри одной палитры); -- XOR-проход уводит результат в группы `0x0Z` (поверх OR-результата) и - `0x2Z` (по чистому фону) — **обе группы палитры у нас не заполнены**, то - есть контур рискует оказаться просто чёрным. - -Значит к «посмотреть глазами» добавляется вопрос, чем заполнять `0x00..0x0F` -и `0x20..0x2F` — по сути это и будет выбор цветов тени. В DOS такого -вопроса не было: XOR двух 4-битных индексов всегда оставался внутри той же -16-цветной палитры. diff --git a/applications/SprPoP/docs/sound_plan.md b/applications/SprPoP/docs/sound_plan.md deleted file mode 100644 index 96af4c6..0000000 --- a/applications/SprPoP/docs/sound_plan.md +++ /dev/null @@ -1,1286 +0,0 @@ -# Звук в порте PoP — разбор и план - -Дата: 2026-08-20, музыка дописана 2026-08-25. Статус: **PCM-эффекты -реализованы; музыка — путь C (PCM через CBL), первый трек играет.** - -Задача пользователя: добавить звук. Приоритет — эффекты; музыку, если -найдётся способ. Эффекты — **обязательно WAV, а не PC-спикер** -(уточнение 2026-08-20; см. §1а — оказалось, что они и так все в WAV). Ниже — что реально лежит в ассетах, что умеет железо, и -почему получившийся план вышел проще, чем ожидалось. - -## 1. Главный вывод - -**Ни MIDI разбирать, ни ноты сочинять не придётся, и ресэмплировать тоже.** - -- Эффекты уже лежат **8-битным беззнаковым PCM на 11 000 Гц**, а у CBL есть - режим **10 937,5 Гц** — расхождение 0,6 %, на слух неразличимо. Формат - сэмпла совпадает с нашим CBL байт в байт (`cbl.h`: 8 бит, беззнаковый, - центр 0x80). То есть данные играются **как есть**, без конверсии. -- Музыка есть в виде **списков нот PC-спикера — 7 КБ на всю игру**, а нота - там задана прямо в ГЕРЦАХ. Пересчёт в делитель AY — одно деление. -- AY и COVOX на Sp2000 сведены в **один ЦАП TDA1543** (док Ивана Мака, - §5), значит музыка на AY и эффекты через CBL звучат ОДНОВРЕМЕННО, и - смешивать их программно не надо. - -## 1а. Уточнение после разбора ВСЕХ наборов MS-DOS версии (2026-08-20) - -Пользователь попросил, чтобы эффекты были не PC-спикером, а WAV, и заодно -посмотреть `mt32snd[1-2].dat`. Разобрал все восемь `.dat` из `MSDOS/`. -Ответ короткий: **эффекты И ТАК все до одного есть в WAV, а вот у музыки -WAV нет ни в одном наборе.** - -| набор | формат | какие звуки | сколько | -|---|---|---|---| -| `digisnd1..3` | **WAV**, 8 бит PCM | эффекты 0..23, 44..49, 51 | **31** | -| `mt32snd1..2` | MIDI для Roland MT-32 | ТЕ ЖЕ эффекты 0..23, 44..51 | 31 | -| `midisnd1..2` | MIDI (AdLib/GM) | **музыка** 24..43, 50, 52..56 | 22 | -| `ibm_snd1..2` | ноты PC-спикера | **всё подряд, 0..56** | 57 | - -Здесь пряталась ловушка: `mt32snd` по имени похож на «музыку получше», а -на деле это набор ЭФФЕКТОВ для владельцев MT-32 — те же id, что у -`digisnd`. Музыки в нём нет вовсе. - -Частоты WAV: 28 звуков на 11 000 Гц, по одному на 8 200, 14 000 и 2 750. -Итого 112 922 сэмпла = **11,4 с, ~110 КБ ≈ 6,7 EMM-страниц**. - -Только PC-спикером, без альтернатив, остаются четыре id: 31, 34, 42 -(пустые) и **38 `blink`** — четыре ноты. То есть на весь звук игры -спикер нужен ровно для одного писка. - -### Музыка: WAV нет, есть три пути - -| путь | данные | что получится | цена | -|---|---|---|---| -| **A. Ноты PC-спикера на AY** | 7 КБ | один квадратный голос — ровно то, что слышали на IBM PC 1989 | секвенсор на полсотни строк | -| **B. MIDI -> AY, три голоса** | 27 КБ исходника | богаче: бас + мелодия + арпеджио | разбор MIDI + раскладка по каналам | -| **C. MIDI -> WAV на хосте, стрим через CBL** | см. ниже | настоящее звучание, любое | нужен синтезатор на хосте + место | - -Про объём для пути C (замерено по длительностям треков): - -| группа | треков | длительность | WAV 11 кГц | -|---|---:|---:|---| -| звучат ПО ХОДУ игры (гимн уровня, смерть, зелья, перо, победа) | 12 | 74,7 с | **803 КБ = 50 EMM-страниц** | -| заставки и титры | 10 | 248,1 с | 2 665 КБ = 167 страниц | - -Игровая половина в EMM **влезает** (при ~215 свободных страницах), а -заставочная — нет, её пришлось бы стримить с диска. Но заставки идут -тогда, когда игра ничего не рисует, так что стрим там как раз уместен. - -**Предложение:** начинать с A (7 КБ, работает сразу, ноль рисков), а C -держать как отдельную фазу — она ортогональна: проигрыватель WAV для -музыки это тот же `cbl_push`, что и для эффектов, только длиннее буфер. -B имеет смысл только если C окажется неподъёмным по месту. - -## 1б. РЕШЕНИЯ (пользователь, 2026-08-20) - -1. **Эффекты — WAV через CBL, 8 бит, МОНО, единая частота.** Проверено по - `convert_digi_sound` (`seg009.c:2358`): один байт на кадр, то есть - моно, и байт беззнаковый (`(b | b<<8) - 32768`), центр 0x80 — ровно - формат нашего CBL. Стерео в данных нет вовсе: каналы у оригинала - размножаются уже на выходе (`digi_audiospec->channels`). -2. **Музыка, первый заход — путь A** (ноты спикера на AY). -3. **Заставки и титры — потом WAV.** Конфликта с эффектами там нет: - одновременно они не звучат. -4. **Музыка ПО ХОДУ игры** (она может совпасть с эффектом) — открыто, два - варианта: либо тоже WAV с ГАШЕНИЕМ эффектов на время музыки (музыка - важнее — **проверить на слух**), либо путь B (MIDI -> три голоса AY). -5. **Все эффекты привести к одной частоте.** -6. Синтезатор для MIDI -> WAV — решать ближе к делу; годятся и онлайн- - конвертеры, хоть вручную, если fluidsynth/timidity не поставится. - -### Про единую частоту (замер) - -Приводим не к 11 000, а ровно к **10 937,5 Гц — частоте CBL** -(`CBL_FREQ_10K9`). Тогда тон точен, а не «на 0,6 % ниже»: проигрывание -11 000 Гц данных на 10 937,5 даёт сдвиг **−9,9 цента**, что на коротком -эффекте не слышно, но бесплатно избавиться от него всё равно приятно — -пересчитывать три файла всё равно придётся. - -| id | звук | было | станет | дельта | -|---|---|---|---|---:| -| 15 | `leveldoor_sliding` | 2 750 Гц, 4 436 сэмплов | 17 643 | **+13 207 Б** | -| 23 | `footstep` | 8 200 Гц, 996 | 1 329 | +333 Б | -| 51 | `princess_door_opening` | 14 000 Гц, 6 188 | 4 834 | −1 354 Б | -| — | остальные 28 (11 000 Гц) | — | ×0,9943 | −588 Б | - -Итог: **112 922 -> 124 531 Б, 6,9 -> 7,6 EMM-страниц.** Рост целиком от -`leveldoor_sliding`: источник у него 2 750 Гц, вчетверо реже целевой, и -апсэмплинг не улучшит звучание — только уравняет формат. Платим 0,8 -страницы за то, что **CBL открывается ОДИН раз и частоту менять не надо -никогда** — ни между эффектами, ни при переходе на музыку-WAV. - -(Альтернатива для него — хранить как есть и повторять каждый сэмпл -четырежды в рантайме: 2 750 × 4 = 11 000 ровно. Это код в `fill()` ради -13 КБ; не стоит того, но если место когда-нибудь прижмёт — вариант есть.) - -## 1в. Бюджет памяти EMM (живой замер 2026-08-20) - -Замерено `mem_info` из работающей программы (уровень 1), а не посчитано на -бумаге: инструментовка ставилась временно и откатана. - -| | страниц | КБ | -|---|---:|---:| -| всего в машине | 256 | 4 096 | -| система (DSS) + сам exe: база + 8 банков кода | **43** | 688 | -| наши ассеты | **81** | 1 296 | -| **занято** | **124** | 1 984 | -| **свободно** | **132** | **2 112 (2,06 МБ)** | - -Разбивка 81 страницы ассетов (сходится точно): - -| набор | страниц | -|---|---:| -| **Тень** (`sk*` 28 + `sf*` 4) | **32** | -| Кид (`kid0..27`) | 28 | -| фон тайлсета (env 10 + wall 1 + fore 1) | 12 | -| страж | 5 | -| зелья (chtab_1), меч, `kid_data.bin`, страница уровня | по 1 | - -Самый крупный потребитель теперь — **набор Тени, 32 страницы**, больше -самого Кида. Если место когда-нибудь прижмёт, там есть очевидный резерв -(кадры смерти и позы, в которых Тень не бывает), но при 132 свободных -страницах трогать незачем. - -### Что из этого следует для звука - -| статья | страниц | останется свободно | -|---|---:|---:| -| эффекты WAV, все 31, 10 937,5 Гц | **8** | 124 | -| музыка ПО ХОДУ игры в WAV (путь C, 12 треков) | 50 | 74 | -| заставки и титры в WAV (10 треков, 248 с) | 167 | **не влезает** | - -То есть эффекты — капля, игровая музыка в WAV тоже поместится, а -заставочную придётся стримить с диска в любом случае (что и планировалось: -во время заставок игра ничего не рисует). - -Оговорка: 132 свободных страницы — это на уровне 1. На уровне 9 добавятся -зеркальные наборы (`pop_vflip_load_all`: 28 Кид + 5 страж + меч = 34 -страницы), останется ~98. Проверять запас надо ИМЕННО ТАМ. - -## 1г. MSDOS против SDLPoP: чем отличаются наборы (сверено 2026-08-20) - -У нас лежат ДВЕ копии звука — оригинальные `.dat` в `MSDOS/` (версия -1.3/1.4) и распакованные ассеты `SDLPoP/data/` (версия 1.0/1.1). Разница -есть, и она влияет на выбор источника. - -### Оцифровка: по умолчанию SDLPoP, MSDOS — опция - -**С 2026-08-31 умолчание — SDLPoP** (`SND_SRC=sdlpop`): он выкачивается -автоматически (`make fetch`), а оригинального дистрибутива DOS у сборки -может не быть вовсе — и она обязана работать без него. У кого дистрибутив -есть, включает лучший набор явно: `make SND_SRC=msdos`. - -Платим за это ровно тем, что разобрано ниже. Заголовок в поставках разный -(`digi_new_type` против `digi_type`), но **28 звуков из 31 совпадают -побайтно**. Различаются три, и все не в пользу SDLPoP: - -| id | звук | MSDOS | SDLPoP | -|---|---|---:|---:| -| 10 | `sword_vs_sword` | 5 020 сэмплов | 3 504 | -| 11 | `sword_moving` | 1 172 | 1 172, но **другие байты** | -| 48 | `spiked` | 5 069 | **7** — то есть звука нет | - -`spiked` в наборе SDLPoP фактически пустой: это звук насаживания на пики -(`spiked()`, seg005.c:245, кадр 177), и с умолчанием он не звучит — от пик -остаётся только шипение выдвижения (49 `spikes`). Звон клинков (10) на -секунду короче, а 11 просто другая запись. - -Всё остальное — включая уровни `LEVELS/res20xx.bin` — берётся из SDLPoP -всегда: `MSDOS/` нужен ровно для этих трёх звуков и ни для чего больше. - -### MIDI: если дойдём до музыки — брать SDLPoP - -Здесь всё наоборот. Содержимое музыкально то же (деление 480, те же -каналы 0..7 плюс ударные), но: - -| | MSDOS | SDLPoP | -|---|---|---| -| формат MIDI | **0** — всё слито в ОДНУ дорожку | **1** — 8-9 дорожек | -| размер (звук 24) | 327 Б | 448 Б | -| размер (звук 56) | 13 587 Б | 12 773 Б | - -Формат 1 с отдельной дорожкой на инструмент — это готовое разделение -голосов. Для пути B (MIDI -> три канала AY) оно решает половину задачи: -дорожки можно выбирать напрямую (бас / мелодия / гармония), а не -разбирать слитый поток и догадываться, что чем было. - -**Итог: эффекты из MSDOS, музыка (когда дойдёт) из SDLPoP.** - -## 2. Что лежит в ассетах (замерено, а не по памяти) - -Звук в PoP адресуется как ресурс `10000 + N`, N = 0..56 — 57 звуков -(`load_sound`, `seg009.c:2289`). Наборов три, и они ПАРАЛЛЕЛЬНЫЕ: один и -тот же звук есть в нескольких видах. - -| набор | что это | объём | покрытие | -|---|---|---:|---| -| `DIGISND1..3.DAT` | оцифровка, 8 бит PCM | 103 941 Б | **31 звук** (эффекты) | -| `MIDISND1..2.DAT` | MIDI-музыка | 27 776 Б | музыка | -| `IBM_SND1..2` (распакованы) | ноты PC-спикера | **7 КБ** | **все 57** | - -### 2.1 Оцифровка (эффекты) - -Разбор контейнера: индекс по 8 байт на запись (id, offset, size), **первый -байт ресурса — контрольная сумма**, тело за ней (спецификация -`POP-DAT-FormatSpecifications`, §3.1.2 — на этом я сначала споткнулся и -читал мусор). Тело — `digi_type`: `word rate, word count, word unk, -byte size`, дальше сэмплы. - -- 31 звук, все 8-битные; -- частоты: **28 звуков на 11 000 Гц**, по одному на 8 200 и 14 000; -- 103 701 сэмпл = **9,4 секунды**, **103 941 Б ≈ 6,3 EMM-страницы**. - -### 2.2 Ноты PC-спикера (и эффекты, и музыка) - -Формат: `byte type(=0), word tempo`, дальше тройки `word frequency, -byte length`; `frequency <= 1` — пауза, `0x12` — конец. Ключевое, что -пришлось смотреть в `play_speaker_sound`/`speaker_callback` (`seg009.c`): - -- **`frequency` — это ГЕРЦЫ напрямую** (`generate_square_wave(stream, - (float)note->frequency, ...)`), а не делитель PIT, как кажется по - маленьким числам; -- длительность ноты = `length / tempo` СЕКУНД. - -Замеры по всем 57 звукам: **2212 нот**, частоты 16..65507 Гц, -длительности 1,74..2571 мс. - -Из них 23 звука — те, у которых оцифровки НЕТ, то есть вся музыка: -заставки, гимны уровней, смерть, победа, титры (id 24..43, 50..56). -**1469 нот**, и вот их длительности: - -| длительность ноты | нот | доля | -|---|---:|---:| -| < 3 мс | 0 | 0 % | -| 3..12 мс | 2 | 0,1 % | -| 12..25 мс | 140 | 9,5 % | -| > 25 мс | 1327 | 90,3 % | - -Это число решает вопрос про таймер — см. §4. - -## 3. Что умеет железо (док Ивана Мака §5 + MAME) - -- **AY-3-8910/8912** в ПЛМ, «программируется по стандартным описаниям» — - то есть ZX-порты; в MAME он заведён как `AY8910(config, "ay8912", - X_SP/24)`, то есть **тактовая 1,75 МГц**. Период канала = 109375 / - частота(Гц), 12 бит (макс 4095) → снизу берутся частоты от ~27 Гц. - Точные Z80-адреса портов идут через таблицу DCP, а не напрямую — - **проверить артефактом до кодинга** (ожидаем ZX-стандарт 0xFFFD/0xBFFD). -- **CBL** — COVOX с буфером 256 Б, две половины по 128; бит 7 порта 0xFE - показывает играющую половину, порт управления 0x4E. Прерывание — - когда половина сменилась. -- **Бипер** (бит 5 порта 0xFE) — туда же в ЦАП. Нам не нужен. -- Всё это **сведено в один ЦАП**, поэтому AY и CBL звучат вместе. - -У нас уже есть готовая обвязка CBL (`libc/include/cbl.h`): callback -`fill(n)`, выдача блока через `cbl_push_otir()` (порт 0x4F) или через -акселератор, коды частот, счётчик недоливов. Своего кольца библиотека не -держит — данные пропихиваются прямо из наших EMM-страниц. - -## 4. Предлагаемая архитектура - -``` - эффекты (31 шт, 8 бит 11 кГц) музыка (23 шт, ноты) - │ │ - EMM-страницы (6,3) 7 КБ нот в банке - │ │ - cbl_push_otir из fill() запись 3 регистров AY - │ │ - CBL (10,9 кГц) ──────┐ ┌────────── AY (1,75 МГц) - ▼ ▼ - TDA1543 (аппаратное смешивание) -``` - -**Один источник прерываний — CBL.** Его callback приходит каждые 128 -сэмплов = **11,7 мс** при 10,9 кГц, и он же двигает секвенсор музыки. -Отдельный таймер (CTC) НЕ нужен: по таблице из §2.2 короче 12 мс всего -2 ноты из 1469 — они растянутся на один тик, чего не слышно. - -Почему это важно: `irq_ctc_install` сейчас требует кода в W2 (tiny/big), -а SprPoP — huge, и попадёт ли туда CTC-трамплин, зависит от раскладки. -Обойтись без него — значит не открывать этот фронт вовсе. - -**Пейсинг кадра при этом не страдает.** Наш темп считается ПО ЛУЧУ -(`pop_pace.h`), а не по кадровым прерываниям, поэтому то, что CBL-ветка -трамплина делает приватный RETI и съедает кадровые прерывания, нам -безразлично. Если бы пейсинг остался на прерываниях — звук бы его сломал. - -## 5. Объём работ - -| фаза | что | оценка | -|---|---|---| -| **З1** | распаковщик `pop_pack_sound.py`: DAT → `.snd`-страницы EMM (эффекты) + `.not` (ноты музыки) | формат уже разобран | -| **З2** | `pop_sfx.c`: `cbl_open` + `fill()`, таблица «звук → страница/смещение/длина», `pop_sfx_play(id)` | ядро | -| **З3** | развесить вызовы: 66 мест `play_sound` в оригинале; у нас часть уже помечена TODO (`pop_ctrl.c:408`, `guards.c:992`, `pop_map.c:3035/3107`, …). **Плюс бесплатный кусок**: опкод `SEQ_SOUND` в seqtbl уже разбирается нашим `play_seq` (`pop_kid.c:326`) — шаги, приземления и прочее поедут сами | механическая | -| **З4** | `pop_music.c`: секвенсор нот на AY (путь A), тик из CBL-callback | небольшая | -| **З6** | заставки и титры — WAV-музыка потоком (эффекты в это время не звучат) | после З1-З4 | -| **З7** | музыка по ходу игры: WAV с гашением эффектов ЛИБО путь B — решать по итогам З6 | открыто | -| **З5** | приоритеты и вытеснение: у оригинала `play_sound` глушит предыдущий (`stop_sounds`), музыка и эффект — разные каналы | правила из seg009 | - -## 6. Что проверить артефактом ДО кодинга - -1. **Порты AY на Sprinter** — записать в 0xFFFD/0xBFFD и убедиться, что - MAME отдаёт звук (порты идут через DCP-таблицу, «стандартные ZX» — - это ожидание, а не факт). -2. **CBL в режиме huge.** Шапка `cbl.h` говорит «код/данные в W2 - (tiny/big)», но это скорее всего устаревшая оговорка: IM2-трамплин - давно переделан на all-modes, и наш кадровый путь в huge работает. - Проверить `cbl_open` из SprPoP. -3. **Совместное владение портом 0xFE.** Бит 5 (луч) у нас держится через - `_cbl_port_ref` «немым» кодом частоты; когда откроется НАСТОЯЩИЙ CBL, - владение переходит к нему. Убедиться, что пейсинг переживает - `cbl_open`/`cbl_close`. -4. **Цена fill() в кадре.** 128 байт через `cbl_push_otir` раз в 11,7 мс - — замерить тем же способом, что и остальное (брейкпоинт + totalcycles). - -## 7. Про MIDI — почему не он - -Музыка в MIDISND — настоящие MThd/MTrk чанки, 27 КБ. Чтобы играть их на -AY, нужен разбор MIDI, раскладка каналов на три голоса и таблица -инструментов — это отдельный проект, и звучать он будет НЕ так, как -оригинал на PC. А набор PC-спикера — это ровно то, что слышал игрок на -IBM PC 1989 года: один квадратный голос. Он у нас есть целиком, весит -7 КБ и ложится на AY напрямую. - -Если позже захочется богаче — материал уже будет разобран, и можно -разложить те же мелодии на три канала AY (бас/мелодия/арпеджио), не трогая -ни данные, ни секвенсор. - ---- - -## 8. Разводка вызовов по коду (сделано 2026-08-20) - -Портированы ВСЕ места `play_sound()` SDLPoP, у которых есть оцифровка -(id 0..23, 44..49, 51 — остальные id это музыка, у них в -`pop_sound_tbl.h` длина 0, и вызов просто глушит текущий эффект). - -| id | что | где у нас | оригинал | -|----|-----|-----------|----------| -| 0 | разбился насмерть | `pop_map.c` land | seg005 | -| 1 | крик падения | `pop_map.c` do_fall | seg005:39 | -| 2 | плита рухнула | `pop_room.c` (обе ветки посадки) | seg007 | -| 3 | кнопка нажата | `pop_trob.c` | seg007 | -| 4/5/6/7 | ворота: закрываются / открываются / рухнули / стоп | `pop_trob.c` | seg007 | -| 8 | удар о стену | `pop_map.c` bumped_fall/bumped_floor + seqtbl | seg004/seg006 | -| 9 | зацеп за карниз | `pop_map.c` check_grab | seg006 | -| 10 | клинок о клинок | `sprpop.c` после `check_sword_hurt`, если один из бойцов в кадре 167 | seg000:1353 | -| 11 | свист клинка мимо | `guards.c` check_hurting | seg002:0DAE | -| 12/13 | ранен соперник / Кид | `guards.c` hurt_by_sword | seg002:0C1F | -| 13 | Кид ранен зельем | `pop_map.c` ветка «злого» зелья | seg006:1894 | -| 14/15 | дверь уровня: закрывается / едет | `pop_trob.c` | seg007 | -| 16 | средняя посадка; толчок о стража | `pop_map.c` land / bump_into_opponent | seg005/seg003:0654 | -| 17 | мягкая посадка | `pop_map.c` land | seg005 | -| 18 | пьёт | seqtbl (SEQ_SOUND) | seg006 | -| 19 | вынул меч | `pop_ctrl.c` | seg005:945 | -| 20/21/22 | дрожит плита | `pop_map.c` loose_shake | seg007:0E55 | -| 23 | шаг | seqtbl (SEQ_SOUND) | seg006 | -| 44 | скелет оживает | `guards.c` pop_check_skel | seg002:106D | -| 45 | прыжок в зеркало | `pop_map.c` jump_through_mirror | seg003:0617 | -| 46 | сожрал чомпер | `pop_map.c` | seg004 | -| 47 | чомпер щёлкнул | `pop_trob.c` (кадр 2) | seg007 | -| 48 | напоролся на пики | `pop_map.c` | seg005 | -| 49 | пики пошли | `pop_map.c` start_anim_spike | seg007:08F6 | - -Что осталось не разведено — только МУЗЫКА (24/28 смерть, 25 презентация, -26 объятия, -27/35/40 заставки, 29 встреча Джафара, 30/33 зелья, 32/41 конец уровня, -36 время вышло, 37 победа, 43 смерть Джафара, 50/52/53 сюжетные вставки) -и 51 (дверь принцессы, тоже из заставки). Их черёд — фаза «музыка». - -**Квирк, за которым следить.** Звук ворот у оригинала звучит не всегда, а -по условию видимости (`play_door_sound_if_visible`, seg007:1250): либо -ворота в комнате слева и стоят в 9-й колонке, либо ворота в НАРИСОВАННОЙ -комнате и колонка не 9-я. У нас это параметр `audible` у `animate_door`. - -**Тряска плиты — свой домен prandom.** Оригинал берёт номер сэмпла (20/21/22) -из общего генератора и вдобавок «сжигает» один бросок ради совместимости с -DOS-версией; у нас последовательности разведены по доменам -(`impl_diff.md`), поэтому у тряски свой сид, а холостой бросок не делаем — -на розыгрыши физики и кладки это не влияет. - -## 9. Цена звука в тактах (замер 2026-08-20, MAME) - -Вопрос был поставлен так: звук идёт по прерываниям, значит размазан по всем -фазам кадра — и если фазы укладываются, всё хорошо? Да, но проверять это -надо не по фазам, а по двум числам, потому что **нагрузка от звука -постоянная и от сцены не зависит вовсе**. - -### 9.1 Одно прерывание CBL - -Зонды: `bpset` на входе трамплина (`_irq_tramp`) и на `reti` ветки CBL, -разница `totalcycles`. 398 замеров в сцене 11/15. - -| величина | значение | -|---|---:| -| цена одного прерывания | **7 825 тактов ровно**, с разбросом до 8 299 (среднее 8 001) | -| период между прерываниями | 245 759 тактов (= 128 сэмплов на 10 937,5 Гц) | -| **доля процессорного времени** | **8 001 / 245 759 = 3,26 %** | - -Цена постоянная, потому что работа фиксированная: OTIR ровно 128 байт плюс -скобка сохранения контекста. Ветвлений по данным в насосе нет. - -### 9.2 Дрожание обслуживания — риск для ЗВУКА, не для кадра - -Период плавает 228 804 … 262 734, то есть прерывание опаздывает максимум на -**~17 000 тактов = 0,8 мс**. Это самая длинная DI-скобка в коде -(акселератор режется по 16 строк, memory `sprinter_wait_states_2x`). -Буфер CBL — 128 сэмплов = **11,7 мс**, запас **14×**. Недолива быть не -может; счётчик `cbl_underruns()` это подтверждает косвенно (наш `fill` -всегда возвращает 1, поэтому он ловит только отсутствие данных, не -опоздание). - -### 9.3 A/B в одном прогоне (Ctrl+S), сцена 11/15 - -Один и тот же кадр, звук выключается на ходу — сравнение чистое. - -| | работа min | работа max | работа avg | прерываний CBL на кадр | -|---|---:|---:|---:|---:| -| звук ВКЛ | 453 132 | 572 532 | **498 064** | 1,40 | -| звук ВЫКЛ | 444 348 | 559 434 | **487 372** | 0,00 | -| разница | +8 784 | +13 098 | **+10 692 (+2,2 %)** | | - -Разница на лёгком кадре (+8 784) — ровно одно прерывание, сходится с §9.1. -`CBL/кадр = 0` при выключенном звуке подтверждает, что Ctrl+S реально -ЗАКРЫВАЕТ CBL, а не глушит сэмпл: иначе насос продолжал бы отдавать блоки -тишины и платить те же 3,26 %. - -### 9.4 Укладываемся ли - -Логический кадр (`pop_pace.h`): NORMAL = 4 растра вне боя = **1 720 000 -тактов**, FASTEST = 3 растра = **1 290 000**. - -| | работа | доля NORMAL | доля FASTEST | -|---|---:|---:|---:| -| 11/15, обычная позиция | 498 064 | 29 % | 39 % | -| 11/15, тяжёлая позиция (Кид на 7 px правее) | 750 066 макс | 44 % | 58 % | - -Период кадра за все прогоны: 1 719 936 … 1 720 752 — ровно 4 растра, ни -одного проскока. **Звук занимает 1,1 % бюджета NORMAL и 1,5 % FASTEST.** - -### 9.5 Где 3,26 % МОГЛИ БЫ стоить дорого - -Ответ «всё размазано, если фазы влезли — ок» верен с одной оговоркой. -Пейсинг квантован растром: работа 1,00 растра и 1,02 растра дают РАЗНЫЙ -период кадра (3 против 4 интервалов), то есть скачок сразу на 20 мс. -Значит звук опасен ровно в одной ситуации — когда сцена стоит в пределах -~8 000 тактов НИЖЕ кратного растру порога. Сейчас ближайший запас — 540 000 -тактов до порога FASTEST, то есть в 60 раз больше цены звука. Проверять -эту оговорку заново стоит только если работа кадра подберётся к 430 000 или -860 000 вплотную. - -## 10. Мусор при включении и щелчок на выходе (разбор 2026-08-20) - -Жалоба: «при старте, когда разрешается звук, проходит кусок мусора». -Разобрано записью выхода MAME в WAV (`-wavwrite`) — по огибающей и -автокорреляции, а не на слух. - -### 10.1 На старте мусора НЕТ; это настоящие звуки - -От `cbl_open` до первого эффекта в записи **точная цифровая тишина** -(размах 1 при разрешении 16 бит). Дальше — два штатных звука: - -| что | когда | длительность | -|---|---|---| -| `gate_closing_fast` (6) — решётка в комнате СЛЕВА | +0,30 с после `cbl_open` | обрывается на 80 мс | -| `soft_land` (17) — Кид приземляется | +0,38 с | 383 мс | - -Опознаны корреляцией огибающих с оригинальными сэмплами `digisnd`: -звук 6 даёт +0,72 с начала записи, звук 17 — +0,32 со сдвигом 80 мс. -Приземление на старте КОРРЕКТНО: `start_pos` уровня 1 — тайл (0,0), а он -`space`, то есть Кид падает на ряд ниже, на площадку с факелами. - -Обрыв первого звука вторым — тоже поведение оригинала, а не наш дефект: -`play_digi_sound` (seg009.c:2402) начинается с `stop_digi()`, голос ОДИН. -Ощущение «мусора» даёт именно 80-мс огрызок скрежещущей решётки. - -Звук кнопки (3) при этом не слышен: `pop_sfx_play(3)` случается ДО -`cbl_open` и глохнет. С SDLPoP совпадает (там на старте тоже только -решётка), но держится это на порядке вызовов — если поднимать звук раньше -`pop_start_level`, щелчок кнопки станет слышен. - -### 10.2 Незалитый буфер CBL — дефект есть, но в MAME он немой - -Буфер CBL (256 слотов) железо не чистит ни сбросом, ни записью в порт -управления, а эта запись сразу пускает воспроизведение с нулевого слота. -Значит первые 256 сэмплов (23,4 мс) — то, что лежало раньше. Разбор по -`sprinter.cpp`: `case 0x89` делает `m_cbl_cnt = 0; m_cbl_wa = 0`, а -прерывание «долей половину» приходит только на 128-м слоте и ставит -указатель на ПРОТИВОПОЛОЖНУЮ половину — своими данными звук идёт лишь с -третьей половины. - -В MAME это не слышно: эмулируемый буфер стартует нулями, а ЦАП -двухдополнительный, то есть 0 = середина шкалы. На ЖЕЛЕЗЕ там -неинициализированное ОЗУ — ровно тот мусор, который ловился ещё на -тестовых примерах CBL. Лечение — `_cbl_prime` в `cbl_open`: сразу после -включения 256 записей байта тишины в порт данных (заранее нельзя, запись -проходит только при поднятом bit7). Стоит 6 400 тактов один раз за -открытие; за это время таймер уходит на два-три слота. - -### 10.3 Щелчок на выходе — ГОЛОДАНИЕ насоса, вылечено - -На выходе по ESC в записи было **ровно 11 мс шума на полной громкости** -(размах 33 671 — громче всего в прогоне), потом мгновенная тишина. 11 мс -= один блок CBL (128 сэмплов = 11,7 мс), то есть один пропущенный долив: -`pop_shutdown` звал `closegraph`/`pop_bg_free`/`pop_kid_free` (а это -ESTEX на каждый атлас) ПРИ ОТКРЫТОМ звуке, насос не успевал, и железо -доигрывало несвежую половину. - -Лечение: `pop_sfx_close()` первым действием `pop_shutdown`. Проверено -второй записью — всплеска на выходе больше нет. Механизм тот же, из-за -которого звук глушится на время загрузки уровня. - -## 11. Приоритеты и перебиваемость: звук у оригинала НЕ «всегда перебивать» - -Пользователь услышал расхождение: у нас решётка обрывалась приземлением -Кида, в SDLPoP — доигрывала до звонкого конца, а приземления не было -слышно вовсе. Разбор исходника показал, что мы упустили ЦЕЛЫЙ МЕХАНИЗМ. - -### 11.1 Модель оригинала - -``` -play_sound(id) seg000:12C5 — только НОМИНИРУЕТ кандидата на кадр: - if next < 0 || prio[id] <= prio[next]: next = id - -play_next_sound() seg000:1304 — раз в кадр решает, запускать ли: - if next >= 0: - if !играет_что_то || - (перебиваем[текущий] && prio[next] <= prio[текущий]): - текущий = next; запустить - next = -1 // НЕ запустили -> номинант ВЫБРОШЕН, очереди нет -``` - -Три следствия, каждое слышно: - -- **Неперебиваемый звук доигрывает целиком.** У `gate_closing_fast` (6) - `interruptible = 0`, поэтому приземление Кида (17) в этот момент - пропадает совсем — не откладывается, а именно теряется. -- **Внутри кадра выживает важнейший.** Меньше `prio` — важнее; при - равенстве побеждает ПОСЛЕДНИЙ (сравнение `<=`). -- **Два источника не «чередуются как получится».** Челюсти (47, prio - 0x10) всегда важнее решётки (4, prio 0x32): решётка не может перебить - укус, а укус решётку — может. Отсюда и картина на ур. 9 к. 9, где - решётка звучит только в паузах между укусами. - -### 11.2 Что сделано у нас - -`pop_sfx_play` теперь только номинирует; запуск — в `pop_sfx_tick`, -который зовётся раз в кадр в конце отрисовки (там же, где оригинал зовёт -`play_next_sound`, seg000:954). Таблицы `snd_prio` (57 байт) и битовая -карта `snd_intr` (8 байт) — в резиденте, значения из SDLPoP С УЧЁТОМ -`fix_sound_priorities()`: в `config.h` SDLPoP `FIX_SOUND_PRIORITIES` -определён безусловно, значит сравниваемся мы с исправленным вариантом -(звук 10 → 0x0D, 48 → 0x15, 49 перебиваем). - -Створка двери уровня (15) — единственная запись, которую оригинал правит -на ходу: перебиваема при закрытии, нет при открытии (seg007:442/464). -Держим отдельным байтом `pop_sfx_slide_intr`, чтобы таблица осталась в -ПЗУ. Там же добавлен пропущенный `stop_sounds()` на завершении открытия -двери (seg007:455) — без него неперебиваемый съезд (1,6 с) блокировал бы -очередь. - -Звуки без оцифровки (музыка, длина 0) не номинируются вовсе — порт -проверки `if (NULL == sound_pointers[id]) return;`. Раньше такой id -глушил живой эффект. - -### 11.3 Проверка - -Записью MAME, старт уровня 1: - -| | всплески | что это | -|---|---|---| -| до | 135 мс + 210 мс | решётка, обрезанная приземлением на 80 мс | -| после | **один, 455 мс** | решётка целиком, корреляция огибающей со звуком 6 **+0,889** | - -Цена: резидент +~250 Б (таблицы + логика), куча ужалась с 347 до 134 Б — -довод в пользу давно назревшей реорганизации базовой памяти. - -## 12. Ворота: гейт слышимости и «решётка встала» (2026-08-20) - -Проверка на сцене, которую предложил пользователь — уровень 9, комната 9: -кнопка (1,8), челюсти (1,2), а ворота **в комнате 4, тайл (1,9)**, то есть -в комнате СЛЕВА. Нашлись три расхождения сразу. - -### 12.1 Гейт слышимости был неверный - -У нас стояло `audible = (room == cur_room)`. У оригинала -(`play_door_sound_if_visible`, seg007:1239) правило другое: - -- ворота в комнате СЛЕВА и в колонке 9 — СЛЫШНЫ (створка видна в шве); -- ворота в отрисованной комнате и НЕ в колонке 9 — слышны; -- особый случай: уровень 3, комната 2 — слышны всегда. - -Сцена 9/9 попадает ровно в первый пункт, поэтому спуск решётки у нас -молчал. Подъём при этом совпадал с оригиналом — потому что звук открытия -(5) идёт БЕЗ гейта (seg007:386, прямой `play_sound`). Эта асимметрия и была -подсказкой. - -Взят вариант под `FIX_GATE_SOUNDS` (условия через ИЛИ): в config.h SDLPoP -он определён безусловно. - -### 12.2 Потерян звук «решётка встала» (7) - -`gate_stop()` (seg007:05E3) зовётся из ТРЁХ мест `animate_door` и каждый раз -играет звук 7 через гейт слышимости: конец закрытия, открытие насовсем и -ветка «уже 0xFF». У нас во всех трёх стояло только `*type = -1` без звука. -Добавлено. Лязг после ОБЫЧНОГО открытия (seg007:395) остаётся без гейта — -там оригинал зовёт `play_sound` напрямую. - -### 12.3 Кнопка: у оригинала есть параметр playsound - -`trigger_button(playsound, ...)` — в трёх местах он нулевой: вход на уровень -(seg003:170), выход Джаффара (seg002:520) и зелье «открыть» (seg006:1890, у -нас не портировано). Мы играли щелчок всегда. Добавлен параметр `snd`. - -### 12.4 Почему щелчок кнопки слышно через раз — это НЕ баг - -Бюджет сцены 9/9 (длительности после пересчёта на 10 937,5 Гц): - -| звук | длительность | prio | -|---|---:|---:| -| челюсти (47) | 465 мс | 0x10 | -| решётка вниз (4) | 97 мс | 0x32 | -| решётка вверх (5) | 123 мс | 0x37 | -| решётка встала (7) | 75 мс | 0x30 | -| кнопка (3) | 106 мс | 0x66 | - -Цикл челюстей — 15 кадров = 1229 мс (замерено брейкпоинтом на номинации: -25 805 000 тактов между укусами). Значит укус занимает 465 мс, пауза 764 мс. -Кнопка (prio 0x66) перебить челюсти не может (0x66 > 0x10), поэтому слышна -только если нажатие попало в паузу — примерно в 6 случаях из 10. -Подтверждено пользователем на живой сцене. - -### 12.5 Грабли сцены - -Если игра стартует ПРЯМО в комнате с челюстями, они не заводятся сами: -нужно сходить Кидом на левую кнопку и вернуться. Это поведение оригинала -(trob челюстей создаётся событием), а не наш дефект — учитывать при -постановке автотестов. - -## 13. Повторный аудит игрового звука (2026-08-24) - -Проверены три независимых слоя: содержимое атласов, места вызова и живой -тракт `play -> tick -> CBL`. - -- В восьми `SND*.ATL` есть все 31 оцифрованных ресурса: `0..23`, `44..49` - и `51`; ненулевая страница/длина есть у каждой записи таблицы. -- Для всех 30 PCM-эффектов, которые могут возникать непосредственно в игре, - есть место вызова. Последним пропуском был звук 10 при столкновении - клинков; условие перенесено буквально из `check_sword_vs_sword` SDLPoP. - Звук 51 относится к сцене с принцессой, а не к игровому циклу. -- Звук 19 «Кид достал меч» проверен в MAME брейкпоинтами. В момент вызова - предыдущий PCM уже закончился (`sfx_left=0`), номинация дошла до - `pop_sfx_tick`, после чего курсор получил id 19, страницу 5, смещение - `0x1500` и длину 2816 байт. В этом прогоне его не подавляли решётка, - плиты, шаги или приоритеты. Если он всё ещё субъективно не слышен, искать - надо после выбора эффекта — в непрерывности CBL/громкости самого сэмпла. -- После продолжительного прогона title/intro/demo/menu CBL обслужил 3303 - блока и сообщил 0 программных недоливов (`cbl_requests=0x0CE7`, - `cbl_underruns=0`). Это исключает возврат `fill=0`, но само по себе не - измеряет запоздание прерывания внутри слишком длинной секции `DI`. -- Регрессия full-game на входе в Level 1 оказалась именно запозданием CBL: - `pop_level_switch` открывал его ДО блокирующего BIOS fade-in. Demo был - чистым, потому что включал палитру без fade. Теперь загрузчик оставляет - CBL закрытым, а caller открывает его после окончательной палитры/QuickLoad; - скрежет на Level 1 исчез в MAME. Однократный щелчок самого первого - `cbl_open` за всю MAME-сессию остаётся отдельной низкоприоритетной задачей. -- Открытие pause menu у SDLPoP беззвучно; движение играет 21, вход/выход - из подменю — 22, изменение настройки — 10. Эти вызовы перенесены. На - время полного копирования страницы и файловых операций CBL закрывается, - после flip открывается снова: аппаратная половина не должна повторять - старые данные и давать «скрежет». - -Отдельно остаётся игровая музыка и сигнальные мелодии без PCM: смерть -(`24/28`), начало/появление Shadow (`25`), встреча Jaffar (`29`), большое -и малое зелья (`30/33`), Shadow (`32`), победа/меч (`37`), перо (`39`), -конец уровня (`41`) и победа над Jaffar (`43`). Вызовы и AY-проигрыватель -для них ещё не реализованы; наличие всех PCM-эффектов эту задачу не закрывает. - - -## 4. МУЗЫКА: решение пересмотрено (2026-08-25) — путь C вместо A - -В §1б первым заходом был выбран **путь A** (ноты PC-спикера на AY), а путь -C (запись -> WAV -> CBL) стоил дорого из-за строки «нужен синтезатор на -хосте». Это обстоятельство отпало: у пользователя есть **готовые записи -DOS-версии** — `applications/PoP/PoP1_DOS_music` (flac/mp3/ogg/ogg_MT-32, -22 трека). Синтезировать нечего, остаётся `ffmpeg -ac 1 -ar 10937 -f u8`. - -### Что померено по этим записям - -| группа | длительность | PCM 10 937,5 Гц | -|---|---:|---:| -| всё вместе (22 трека) | 339 с | **3 625 КБ = 227 EMM-страниц** | -| игровые джинглы (10) | 57 с | 608 КБ | -| заставки и титры | 282 с | 3 017 КБ | -| финальный `won` один | 115 с | 1 233 КБ | - -Свободной EMM на старте ~3 440 КБ, так что вся музыка разом в память не -влезает и не должна: трек грузится под сцену и освобождается после. - -### Что сделано - -`toolchain/pop_pack_music.py` -> один файл `MUS\m.bin` на трек -(читается порциями по 16 КБ из одного открытого fd) + каталог -`pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**, -а не байтами: 169 КБ в uint16 не влезает, 1350 блоков — легко. - -`pop_music.c` (банк 9) грузит трек в EMM и ставит курсор; насос -`pop_sfx_fill` (резидент) получил **третий источник**: эффект важнее -музыки, музыка важнее тишины. Эффект музыку не сбрасывает — её курсор -стоит, пока эффект доигрывает, и она продолжается с места. - -Проверено в MAME записью звука: трек `story_1_absence` на первом экране -истории, корреляция огибающих с эталоном **0,836**, RMS 22,6 против 18,3 -(разница — 8-битное квантование). Эффекты двери в PV-сцене после него -звучат как прежде, то есть освобождение страниц и возврат к набору -эффектов работают. - -### Цена и что осталось - -* CBL один: пока играет музыка, эффектов нет. Для заставок это не важно - (их там не бывает), для игровых джинглов — открытый вопрос §1б.4. -* Резидент вырос на 83 байта (третий источник в насосе) плюс 25 байт - данных под курсор и таблицу страниц; запас W2 — 151 байт. Кучи в - приложении нет (`malloc` не слинкован), так что это чистый запас роста. -* Банк 9 занят на 88 %. Следующий модуль туда уже не влезет — либо - переносить, либо заводить банк 12. -* `won` (77 страниц) в POP_MUS_PAGES=20 не помещается: финал придётся либо - резать, либо стримить кусками по ходу. - - -## 5. СКРЕЖЕТ ПРИ BIOS-ВЫЗОВАХ: причина и решение (2026-08-25) - -Симптом: во время затемнения (fade) звук хрипел — одинаково с играющей -музыкой и в тишине. Пользователь заметил ключевое: **повтор тишины обязан -звучать тишиной**, значит дело не в недоливе буфера. - -### Как искали - -Отладочные клавиши, каждая делает ровно один кусок fade: - -| клавиша | что делала | результат | -|---|---|---| -| H | только ожидание 8 кадров | чисто | -| V | только чтение палитры | скрежет | -| G | затемнение целиком | скрежет | -| J | только запись палитры | скрежет | -| L | 512 раз `bios_get_place()` — видео не трогает | **скрежет** | - -`L` и решил вопрос: виновата не палитра, а **любой вызов BIOS**. - -### Причина - -Вход в BIOS — это `rst 8`, то есть `out ($7C),a`. В драйвере MAME он -правит `m_rom_sys` и вызывает `update_memory()`, которая перестраивает -**окно 0**: `m_pages[0]` + `m_bank_view0.select(1)`. ПЗУ ложится ПОВЕРХ -страничного регистра. - -Насос CBL брал окно взаймы именно у W0 (`_io_page_w0 = phys` + `OTIR` по -адресу < 0x4000). Пока BIOS работает, запись в порт `0x82` ничего не -меняет, и `OTIR` вычитывает ПЗУ, отдавая его в звук. - -Побочно выяснилось, почему `DI` вокруг BIOS помогал лишь иногда: он не -даёт войти в ISR (тогда блок просто пропускается, что неслышно), но в -обработчиках BIOS есть `EI`, так что защита негарантированная. - -### Решение - -Насос переведён на **W3** (идея пользователя): это окно управляется только -портом `0xE2`, подмену из прерывания никто не перекрывает, а BIOS во время -нашего ISR не исполняется — окно возвращается до выхода. - -```c -saved = _io_page_w3; -_io_page_w3 = phys; -cbl_push_otir((const void *)(0xC000u + ptr), n); -_io_page_w3 = saved; -``` - -После этого BIOS безопасен везде: и палитра, и любые другие функции. -Временный обход палитры мимо BIOS (`gfx_pal_write`) стал не нужен — он -остался в libbgi как более быстрый примитив (2,5 тыс. тактов на 64 цвета -против 10,8 тыс. у BIOS), но игра его не зовёт. - -Бонус: в W3 нет стаба восстановления окна, который в W0 занимал начало -страницы, — звуковые страницы можно использовать целиком. - -## 6. ВСЯ ЗАСТАВКА ОЗВУЧЕНА (2026-08-25) - -К `story_1_absence` добавлены остальные четыре трека заставки: -**54** intro_theme (титры), **50** story_2_princess, **53** -story_3_Jaffar_enters, **52** story_4_Jaffar_leaves (сцена с принцессой). -`MUS_IDS` в Makefile — 50 52 53 54 55, всего 1056 КБ на образе. - -### Два слота вместо одного - -Реплики оригинала идут ВСТЫК: следующая начинается там, где кончилась -предыдущая, паузы под загрузку нет. Поэтому `pop_music` держит два слота -EMM: `pop_music_load*` всегда пишет в НЕ играющий, `pop_music_play` -подменяет резидентную таблицу страниц и отпускает прошлый слот. Своей -копии таблицы слот не хранит — её и так держит блок EMM, `mem_get_page` -отдаёт номер по индексу (иначе −40 байт W2 у игры, а там их нет). - -Плюс **постраничная загрузка**: `pop_music_load_begin` / `_load_step` -читают по одной странице за вызов. Страница стоит 33 мс — четверть -логического кадра заставки (133 мс), поэтому подкачка следующей реплики -прямо посреди анимации не видна. Кто может позволить себе паузу (титры, -чёрный экран между сценами) — зовёт прежний `pop_music_load`. - -### Тайминги приведены к шкале оригинала - -Все длительности сцен взяты из SDLPoP в его тиках (60 Гц), а ждём мы -кадрами луча (~50 Гц). Пока сцены были немыми, разбег в 20 % не был -виден; с музыкой он слышен сразу — реплика кончается раньше картинки. -Введён `POP_T60(t)` (pop_cutscene.h), и на него переведены титры, -`intro_before_pv`, хвост после PV и пейсинг самой PV-сцены (счётчик -потраченных кадров луча против `POP_T60(tick)`, вместо прежних жёстких -четырёх кадров на логический). - -**Паузы-реплики.** Там, где оригинал ждёт конца сэмпла, у нас теперь -стоит реальная длина нашей записи: m50 — 831 тик, m53 — 985. Отсюда -новая шкала PV: конец m50 на 846, вход Джафара (m53) на 1046, уход -(m52) на 2073, конец сцены 2500 тиков (было 1959). - -**Fade перед PV** (вопрос пользователя: наш fade короче, 4 ступени против -64). Совпасть должен момент полной темноты, считая от пуска m55: -у SDLPoP это 80 (transition) + 600 (wait) + 128 (fade_out_2: 0x40 шагов -по 2 тика); у нас переход занимает 80 кадров луча = 96 тиков, а fade — -5 тиков. Отсюда `WAIT = 80 + 600 + 128 − 96 − 5 = 707` тиков. Дальше и -там и там экран уже чёрный, а трек доигрывает: этой паузой заставка и -стыкуется с PV. - -**Музыка переживает смену сцен.** m54 звучит с титров и до первого -экрана истории (`pop_intro_show` больше не глушит CBL на входе), m52 -начинается в PV и доигрывает уже на экране «свадьбы» — как seg000:2051. - -Проверено в MAME: цепочка 54 → 55 → 50 → 53 → 52 отыгрывается целиком, -курсор `pop_mus_id` меняется ровно на своих кадрах, интро доходит до -демо-режима. Слуховая проверка (нет ли хрипа от диска при играющей -музыке) — за пользователем. - -## 7. МУЗЫКА ПО ХОДУ ИГРЫ (2026-08-26) - -Звуки 24..43 в наборе оцифровки ПУСТЫЕ — в оригинале это Adlib-музыка, и -в digisnd её нет вовсе. На этом и построено подключение: `pop_sfx_play` -для звука с нулевой длиной не пытается его играть, а кладёт НОМЕР в -`pop_mus_req` (один байт). Заявку разбирает `pop_music_service()` — один -вызов на кадр из любого цикла (игрового, интро, катсцены); всё чтение с -диска живёт там. - -**Стриминг вместо загрузки.** Ждать полной загрузки джингла нельзя — это -фриз на треть секунды посреди игры. `pop_music_stream` читает ПЕРВУЮ -страницу (33 мс) и сразу пускает трек: она звучит 1,5 с, а следующая -читается те же 33 мс — запас сорокакратный. Остальные доливаются по -одной за кадр, пока `pop_music_loading()`. Номера страниц известны сразу -после `mem_alloc_pages`, поэтому таблица для насоса заполняется целиком — -данные появятся раньше, чем насос до них дойдёт. - -**Что и где играет** (номера и места — из SDLPoP): - -| трек | событие | место у нас | -|------|---------|-------------| -| 24 / 28 / 32 | смерть: обычная / в бою / от руки тени | `ctrl_kid_death` | -| 25 | вступление 1-го уровня (Кид сидит), тень 6-го | `control_crouched`, `guards.c` | -| — | НА ДЕМО-УРОВНЕ музыки нет вовсе: там одни эффекты | гейт в `pop_music_service` | -| 27 / 35 / 40 | сцены перед 2/4/6/12, 8/9, «времени мало» | `pop_pre_cutscene_show` | -| 29 | встреча с Джафаром | `pop_meet_jaffar` | -| 30 / 33 | большая склянка / малая | `pop_proc_get_object` | -| 36 | время вышло | `pop_time_expired_show` | -| 37 / 43 | меч найден, страж убит / смерть Джафара | `pop_proc_get_object`, `on_guard_killed` | -| 39 | перо (медленное падение) | `pop_proc_get_object` | -| 41 / 32 | конец уровня / конец 4-го (тень) | опкод SND_LEVEL в `play_seq` | -| 26 | встреча с принцессой | `cut_ending` | - -**Вступление первого уровня — автомат, а не «звук при приседе»** (seg005:02EB). -Пока `need_level1_music` не ноль, `control_crouched` НЕ ЧИТАЕТ управление: -Кид сидит, тема играет, и лишь когда она смолкла, он может встать. Наша -первая версия просто играла трек при первом приседе — и тема догоняла -игрока посреди уровня (пробежал, спрыгнул, присел — заиграла). Признак -«ещё звучит» берём у курсора насоса `pop_mus_left`: он резидентный, и если -музыка выключена, курсор остаётся нулём — Кид просто встаёт. - -Темы, которые звучат один раз за заход на уровень (вступление 1-го, тень -6-го), сбрасывает `pop_music_level_start()` из `pop_start_level`. Оригинал -для этого портит переменную двери (`leveldoor_open = 0x4D`) — у нас на это -есть свои два байта. - -**ГДЕ КОНЧАЕТСЯ МУЗЫКА СЦЕНЫ** (уточнено 2026-08-26). Сначала мы отдали -трек «доигрывать в игре»: у оригинала load_intro после сцены просто гасит -экран и возвращает управление. На слух оказалось хуже, чем в оригинале — -музыка спотыкается: загрузка уровня (ESTEX плюс сборка комнаты) не даёт -насосу долить блок вовремя. У DOS-версии этой проблемы нет, там звук -живёт своей жизнью на аппаратуре. - -Поэтому дослушиваем ПОД ЧЁРНЫМ ЭКРАНОМ, до отрисовки уровня: следующий -load_intro у оригинала и так начинается с ожидания тишины (seg001:681), то -есть к новому уровню трек в любом случае смолкает. Пропуск сцены обрывает -и музыку — игрок нажал клавишу, чтобы идти дальше. - -**ДЛИТЕЛЬНОСТЬ FADE.** fade_in_1/fade_out_1 — это 64 шага палитры по два -тика, 128 тиков = 2,13 с; сцена перед уровнем 2 занимает с ними около семи -секунд. Наши четыре ступени укладывались в восемь сотых секунды, и сцена -выходила втрое короче. Теперь `INTRO_FADE = POP_T60(128)`, а ступеней в -`pop_ui_palette_dim` тридцать две вместо четырёх: на четырёх растянутых -ступенях затемнение выглядело бы скачками. Половина от оригинальных 64 — -на глаз от них не отличается (ступень каждые 66 мс), а вот шестнадцать уже -видно. Сумма «fade in + сцена + fade out» при этом совпадает с оригиналом -сама собой: длительность каждого fade та же, что у fade_*_1. - -**Цена ступени** (замеры в MAME 2026-08-26, такты 21 МГц; кадр 430 000): - -| версия | такты | что изменилось | -|--------|-------|----------------| -| исходная | 2 440 000 | снимок копировался побайтовым циклом на C | -| + таблица яркости на стеке | 1 250 000 | 768 умножений uint16 заменены 256 сложениями | -| + memcpy для снимка | 487 000 | LDIR вместо цикла — главный выигрыш | - -Из оставшихся 487 тысяч 136 тысяч — заливка палитры через BIOS (8 вызовов -`gfx_pal_load` по 17 000). Дальше можно было бы хранить готовые таблицы -яркости файлом, но при 1,2 мс на построение это уже незаметно. - -ВАЖНО: ступень пересчитывается только когда она СМЕНИЛАСЬ. Наивный цикл -«ступень на каждый кадр» звал пересчёт сто раз и растягивал fade до -десяти с лишним секунд. - -## 8. ПОТОКОВЫЙ ТРЕК: ФИНАЛЬНАЯ ТЕМА (2026-08-26) - -`won` (56) — 115 с, 1,2 МБ, 78 страниц EMM. В память он не влезает ни при -каком бюджете, поэтому играется КОЛЬЦОМ из шести страниц (96 КБ = 9 с): насос -идёт по кругу, а `pop_music_service` дочитывает файл в те страницы, которые -насос уже прошёл. - -**Кто кого догоняет.** Страница звучит 1,5 с, а читается 33 мс — запас -сорокакратный. Дистанция считается без отдельных счётчиков: страница ровно -128 блоков насоса, поэтому проигранных страниц = (всего блоков − осталось) -/ 128. Пока прочитано меньше, чем проиграно плюс размер кольца, в кольце -есть свободный слот. Файл читается ПОСЛЕДОВАТЕЛЬНО, без `lseek`. - -**Что пришлось учесть.** - -* Насос заворачивает страницу только при `pop_mus_ring != 0`; конец трека - по-прежнему определяет `left`. Обычный трек этой ветки не касается. -* Кольцо обязано сниматься при любом обычном запуске (`pop_music_play`, - `_stream`, `_load_begin`): иначе следующий трек играет по кругу первых - шести страниц — поймано на титрах сразу после победы. -* Живые сцены комнаты принцессы открывают CBL сами (`cut_begin`): - `pop_ending_show` глушит звук первым действием, и «arrived to princess» - (26) не звучал вовсе. -* Тема дослушивается до конца (прерывается клавишей), как `while - (check_sound_playing() && !key_test_quit())` в seg001:637. У оригинала - между титрами и этим ожиданием стоит ввод имени в таблицу рекордов — - когда он появится у нас, ожидание переедет за него (задача HOF-ENTRY). - -Проверено в MAME на сборке `LEVEL=14`: после встречи с принцессой звучит -тема победы (`pop_mus_id` = 56, `pop_mus_ring` = 6), курсор уходит далеко -за размер кольца — то есть подкачка успевает. - -## 9. ЗАДЕРЖКА СТАРТА ЗВУКА: ЗАМЕР (2026-08-31) - -Замерено в MAME на живой сборке: точка отсчёта — подстановка заявки -отладчиком при ОСТАНОВЛЕННОЙ машине, конец — условный watchpoint -`wpset 19FF6,1,w,{wpdata != 0}` на старший байт `pop_mus_left`, то есть -момент, когда трек реально зазвучал. Масштаб тактов откалиброван не по -памяти, а по аппаратным часам: период тика насоса CBL — ровно -`128/10937,5 = 11,7029` мс, измерено 245 748 и 245 778 тактов, отсюда -**21,00 МГц** (кадр луча — 429 973 такта, развёртка 48,8 Гц, не 50). - -### 9.1 Эффекты стартуют без задержки, музыка — через ~200 мс - -Разница принципиальная и вытекает из устройства: - -* **Оцифрованные эффекты диска не касаются вовсе.** `pop_sfx_init()` - вызывается ОДИН раз за запуск (`sprpop_cold.c`), вычитывает весь - `SND/snd.arc` в EMM и закрывает файл. Дальше `pop_sfx_play` только - номинирует, а `pop_sfx_tick` берёт `page/off/len` из таблицы в памяти. - Задержка = остаток текущего кадра + ближайший запрос CBL (≤ 11,7 мс). - Держать архив открытым НЕЧЕГО: после старта он не нужен. -* **Музыка читается с диска на каждый трек** — `mNN.bin` лежат - отдельными файлами, и `pop_music_load_begin` открывает свой. - -### 9.2 Разложение окна музыки - -От заявки (`pop_mus_req`) до звучания (`pop_mus_left != 0`), одна -загрузка по шагам: - -| шаг | цена | -|---|---:| -| ожидание `pop_music_service` в кадре | 22,6 мс | -| `chdir` #1 (вход в `POP_PATH_CALL`) | **46,1 мс** | -| `open` файла трека | 34,5 мс | -| `chdir` #2 (восстановление каталога) | **59,0 мс** | -| чтение первых 8 КБ (`bank_read_page`) | 34,0 мс | -| **итого** | **196,7 мс** | - -**Главное здесь: два `chdir` стоят 105 мс — больше половины окна, и -каждый дороже самого `open`.** Убрать их нельзя: старые DSS оставляют -рабочий каталог внутри последнего подкаталога, и без восстановления -ломаются относительные пути (ради этого `POP_PATH_CALL` и заведён). -Теоретический запас — снять ОДИН из двух (≈ 50 мс), но это риск для -других мест, которые полагаются на восстановленный каталог. - -Для музыки задержка непринципиальна: трек и так начинается на границе -события. Критична она была бы для эффектов — там её нет по построению. - -### 9.3 Разброс и режимы скорости - -Семь прогонов: **189,3 … 232,8 мс**, среднее 200,1. Величина -ФИЗИЧЕСКАЯ и от режима скорости не зависит, меняется только её пересчёт -в логические кадры: - -| режим | логический кадр (замерено) | окно в кадрах | -|---|---:|---:| -| NORMAL вне боя | 81,93 мс = 4,00 кадра луча | 2,31 … 2,84 | -| FAST / FASTEST вне боя | 61,4 мс = 3,00 кадра луча | 3,09 … 3,42 | - -Худший случай (232,8 мс в коротком кадре) — 3,79 логического кадра. -Пейсер при этом работает ровно как задумано: `pop_pace_n` заказывает 4 -кадра луча вне боя при NORMAL и 3 при FAST/FASTEST, замер это -подтвердил. Подкачка трека кадр НЕ просаживает. - -### 9.4 Следствие для паузы конца уровня - -Ждать окончания мелодии по одному `pop_music_busy()` НЕЛЬЗЯ: в этом окне -он ещё ложен, и уровень сменился бы до первой ноты. Правильный признак -— состояние «аудио-событие в работе», которое выводится из уже -существующих переменных без новых сущностей: - -```c -uint8_t pop_music_active(void) __banked /* банк 9 — там ld_busy */ -{ - return (uint8_t)(pop_mus_req || ld_busy || pop_mus_left); -} -``` - -Переход «запрошен → грузится → звучит» снаружи непрерывен: `service` -обнуляет `pop_mus_req` и тут же в `load_begin` взводит `ld_busy`, а -главный цикл между этими операторами не выполняется. - -Это лучше фиксированной задержки «на раскачку»: не нужна подобранная -константа, нет зависимости от режима скорости, а при провале загрузки -(нет файла, нет памяти) все три признака ложны и уровень меняется сразу, -вместо слепого ожидания. Заодно чинится расхождение с SDLPoP при -ВЫКЛЮЧЕННОМ звуке: `pop_sfx_play` возвращается рано при `!pop_snd_ok`, -заявка не кладётся, паузы нет — как в оригинале (`seg006:651` ставит -трек только `if (is_sound_on)`, а `seg003:387` ждёт -`check_sound_playing()`). Сейчас `pop_endmus_left` взводится -безусловно, и при выключенном звуке игра держит пройденный уровень -лишние 12 с молча. - -## 10. ЭФФЕКТЫ БЕЗ ПЕРЕЛИНКОВКИ: РАСКЛАДКА УЕХАЛА НА ДИСК (2026-08-31) - -Сделана часть II плана `music_runtime_index_plan.md` (этапы SI0..SI4). -Раскладка звукового набора больше не компилируется в EXE: пара -`SND/snd.arc` + `SND/snd.idx` меняется целиком, бинарник остаётся прежним. - -### 10.1 Что именно изменилось - -`gen/pop_sound_tbl.h` УДАЛЁН — упаковщик его не печатает. Вместо него: - -* `src/pop_snd_tbl.h` — рукописный: тип записи и инварианты программы - (`POP_SND_COUNT` 57, `POP_SND_BLOCK` 128, `POP_SND_MAX_PAGES` 16, - константы блока тишины). От набора не зависит НИЧЕГО из этого; -* `src/pop_snd_data.c` — резидентные данные: `pop_snd_tbl[57]`, - `pop_snd_page[16]`, `pop_snd_pages`; -* `SND/snd.idx` — дисковый индекс, формат `PSI1` (писатель и разборщик — - `tools/pop_idx.py`, покрыт `make test-tools`, 22 теста); -* `pop_sfx_cold.c` — чтение и полная валидация индекса. - -`POP_SND_PAGES` как compile-time размер набора БОЛЬШЕ НЕ СУЩЕСТВУЕТ. Его -заменили две разные величины: `POP_SND_MAX_PAGES` — вместимость -загрузчика (16, запас под чужие наборы), и runtime `pop_snd_pages` — -сколько страниц у ЭТОГО набора. Насос сверяет переход длинного эффекта -через границу страницы со вторым, а не с первым. - -### 10.2 Формат `PSI1` и почему запись ровно 5 байт - -Один сектор DSS: 16 байт заголовка (магия, число записей, размер записи, -log2 блока, формат PCM, число страниц) и 57 записей по 5 байт — -`page` (u8), `off` (u16 LE), `len` (u16 LE), — то есть побайтовый образ -`pop_snd_tbl[]`. Записи читаются ОДНИМ `read` прямо в резидентную -таблицу, без разбора по полям. - -Поэтому `sizeof(pop_snd_ent_t) == 5` в ABI SDCC z80 — часть ДИСКОВОГО -контракта, а не деталь компилятора. Ловится с двух сторон: статически -(`pop_snd_data.c`) и полем размера записи в заголовке, которое загрузчик -сверяет со своим `sizeof`. - -### 10.3 Цена в памяти - -Таблица была `static const` в `_CODE`, стала изменяемой в `_DATA`. -Замер до/после: - -| | было | стало | Δ | -|---|---:|---:|---:| -| `_CODE` | 23865 | 23582 | −283 | -| данные | 7128 | 7421 | +293 | -| куча резидента | 239 Б | 229 Б | −10 | -| банк 8 | 14824 | 15425 | +601 | - -Суммарный резидентный расход почти не изменился — в huge-модели `_CODE` -и данные лежат подряд в одном диапазоне `0x4000..0xBFFF`. Реальные -10 байт — это расширение `pop_snd_page` с размера набора до -`POP_SND_MAX_PAGES` плюс байт счётчика. - -### 10.4 Валидация: чему именно нельзя доверять - -Индекс — файл на диске, и битый индекс увёл бы насос за пределы -выделенного блока EMM. Проверяются заголовок целиком и КАЖДАЯ запись: -`page < pop_snd_pages`, `off` внутри страницы, кратность `off`/`len` -блоку 128, непересечение с блоком тишины и то, что длинный эффект не -выходит за последнюю страницу набора. - -Последняя проверка считается В БЛОКАХ, а не в байтах: байтовый адрес -конца (`page * 16384 + off + len`) не влезает в `uint16`, а 32-битная -арифметика на Z80 дорога. В блоках весь набор — не больше -`16 * 128 = 2048`, и всё считается шестнадцатью битами. - -Число страниц из индекса дополнительно сверяется с числом элементов в -`snd.arc`: расходящаяся пара означает, что файлы из разных наборов. - -### 10.5 Нет индекса — эффектов нет, но МУЗЫКА ОСТАЁТСЯ - -Первая версия просто возвращала ошибку, и это оказалось непроходимой -игрой: тишину в паузах насос льёт из первого блока набора, поэтому без -набора CBL не открывался вовсе — а вместе с ним вставала музыка, чьи -блоки отсчитывает тот же насос. Заставка ждала конца трека, который не -начинал играть, и `pop_music_busy()` не гас никогда. - -Теперь при отказе индекса поднимается ПУСТОЙ набор: одна страница EMM с -блоком тишины. Все `len` нулевые, поэтому `pop_sfx_play` уходит по ветке -«нет оцифровки» — эффекты молчат, музыка играет, игра проходима. - -Две тонкости этой заливки, обе выяснены на живой машине: - -1. **Заливается только первый блок (128 байт), а не вся страница.** - `gfx_w0_page_prepare` ставит в страницу IRQ/NMI-стабы, чтобы - прерывание при замапленном W0 нашло валидный код. Заливка всей - страницы затирает их, и первое же прерывание уводит процессор в - мусор — чёрный экран на старте. Насосу больше и не нужно: он берёт - ровно блок тишины, да и то через W3. -2. **Запись под `IRQ_DISABLE`** — 128 байт накрывают стаб RST38, и до - `gfx_w0_unmap` прерываний быть не должно. - -### 10.6 Грабли сборки: секундная гранулярность mtime - -Смена `SND_SRC` тихо давала НЕВЕРНЫЙ результат: `sdlpop -> msdos -> -sdlpop` перепаковывал `build/atl`, а в `assets/packed` оставался прежний -набор. Причина не в логике, а во времени: упаковка укладывается в одну -секунду с записью stamp'а, а `make` считает цель, сделанную в ту же -секунду, что и зависимость, актуальной. С паузой в секунду не -воспроизводится вовсе. - -Лечится двумя приёмами, и оба убирают время из решения: - -* смена варианта СНОСИТ stamp'ы своего семейства (`rm -f - $(STAMP)/sound-*`) — нет файла, значит правило обязано выполниться; -* упаковка, сборка архива и копия индекса делаются ОДНИМ рецептом: - внутри рецепта сравнивать нечего. - -То же лечение получила и музыка (`MUSIC_FMT`) — механизм общий. - -### 10.7 Что проверено на живой машине - -* таблица в памяти совпадает с файлом из образа ПОБАЙТОВО (285 байт); -* один и тот же EXE (sha256 не меняется) поднимает SDLPoP (9 страниц) и - MSDOS (10 страниц); -* СТРОГАЯ проверка: у двух реальных наборов совпадают 23 записи из 31, - поэтому сделан отладочный ключ `pop_pack_sound.py --order reverse` — - набор с обратным порядком укладки, где от штатного отличаются 30 из 31 - записей. Игра на нём звучит правильно, значит раскладка берётся с - диска, а не из памяти; -* битый индекс (испорченная магия) — эффекты выключаются, игра жива; -* отсутствующий индекс — музыка играет, эффектов нет, PV-сцена проходит; -* Ctrl+S в обоих режимах работает штатно. - -Маркер для ручной проверки: звук 51 `princess_door_opening` (дверь в -сцене с принцессой) лежит у наборов по РАЗНЫМ страницам — 8 у SDLPoP, -9 у MSDOS. А вот 4 `gate_closing` из той же сцены совпадает побайтно и -для проверки подмены не годится. - -## 11. МУЗЫКА БЕЗ ПЕРЕЛИНКОВКИ: ДЛИНЫ И ДЛИТЕЛЬНОСТИ УЕХАЛИ НА ДИСК (2026-08-31) - -Сделана часть I плана `music_runtime_index_plan.md` (этапы MI0..MI5, у нас -B0..B7). `gen/pop_music_tbl.h` и `gen/pop_music_ticks.h` УДАЛЕНЫ: длины -треков и длительности реплик читаются из `MUS/mus.idx` (формат `PMI1`). -Один и тот же `sprpop.exe` работает с любым из четырёх наборов записей. - -### 11.1 Где живёт индекс и почему именно там - -228 байт таблицы в W2 положить нельзя — там свободной кучи порядка двух -сотен. Поэтому индекс лежит в ОДНОЙ странице EMM, а в резиденте от него -остаются два байта (номер блока и страницы). Наружу указатель на EMM не -выдаётся: `pop_music_info()` подключает страницу в W0, копирует четыре -байта в буфер вызывающего и сразу снимает окно. - -**Данные в странице лежат со смещения `POP_MUS_IDX_BASE` (0x100), а не с -нуля.** Причина в `gfx_w0_page_prepare`: он делает страницу безопасной -для W0, записывая В НЕЁ переход на IRQ-восстановитель (0x38) и RETN для -NMI (0x66). С нуля эти байты легли бы прямо в записи (id 10 и 21) и -испортили индекс; со смещением стабы и данные не пересекаются, и работает -штатная защита от прерываний, а не запрет их. Тот же приём и по той же -причине — в `pop_config.c` (`CFG_BASE`). - -Числа страниц в индексе НЕТ: это производная от `blocks`, и дублирование -однажды разъехалось бы с ним. Считает `pop_music_pages()`. - -### 11.2 Пауза конца уровня: состояние вместо счётчика - -`pop_endmus_left` и `POP_MUS_TICKS_32/41` УДАЛЕНЫ. Главный цикл ждёт -`pop_music_active()` — «заявка лежит, идёт загрузка или трек звучит». - -Одного `pop_music_busy()` там мало: между заявкой и первой нотой проходит -190–230 мс (§9), и в этой щели он ложен. Раньше щель закрывал счётчик по -длине записи, но он тянул за собой две беды: зависимость EXE от набора и -жёсткий делитель `/4`, который врал в быстрых режимах (там логический кадр -3 кадра луча, а не 4). Три признака подряд закрывают щель без единой -подобранной константы, потому что `pop_music_service` обнуляет `req` и -тут же взводит `ld_busy`, а тот держится до записи `pop_mus_left`. - -Побочно исправилось расхождение с оригиналом: при ВЫКЛЮЧЕННОМ звуке -`pop_sfx_play` не кладёт заявку, все три признака ложны, и уровень -меняется сразу — как в SDLPoP, где трек ставится под `if (is_sound_on)` -(seg006:651), а ожидание это `check_sound_playing()` (seg003:387). -Прежний счётчик взводился безусловно и держал пройденный уровень лишние -12 секунд в тишине. - -### 11.3 PV-сцена: четыре якоря вместо compile-time шкалы - -Шкала сцены осталась абсолютной (переход на ожидание звука — отдельный -разговор, см. план), но точки, зависящие от длины реплик, считаются при -входе в сцену: `pv_m50_end`, `pv_dialog1`, `pv_exit`, `pv_anim_end`. -Остальные выражения не изменились — они отсчитываются от якорей. - -Восемь байт статики вместо протаскивания структуры времён через пять -функций (`pv_princess_step`, `pv_jaffar_step`, `pv_seq_period`, -`intro_pv_draw_frame`, `intro_pv_animated`), как предлагал план: сцена -одна на запуск, и переделка всех сигнатур того не стоит. - -Нет индекса — длительности нулевые, и сцена просто идёт без пауз на -реплики: ждать нечего, звука-то нет. - -### 11.4 Цена в памяти - -За обе фазы (эффекты и музыка) резидент не вырос, а освободился: - -| | до фазы A | после фазы B | -|---|---:|---:| -| `_CODE` | 23865 | 23544 | -| куча резидента | 239 Б | 256 Б | - -Банк 9 похудел на 118 Б (ушла `pop_mus_tbl` из его rodata), банк 11 — на -длительности реплик. Прибавка: 2 байта на страницу индекса музыки и 8 на -якоря PV. - -### 11.5 Что проверено на живой машине - -* `sprpop.exe` ПОБАЙТОВО одинаков для наборов flac и mt32; -* все 22 трека в индексах различаются, и контрольные значения совпали с - тем, что план предсказывал по замерам: m32 438→449, m41 732→685, - m50 831→867, m53 985→1044, m56 9865→10462 блоков (78→82 страницы); -* на mt32-наборе PV-сцена проходит целиком: m50 → m53 → m52 звучат по - длительностям mt32, хотя в EXE их больше нет; -* без `mus.idx` музыки нет, эффекты работают, игра проходима — сцены - проскакивают без пауз на реплики. - -**НЕ ПРОВЕРЕНО:** потоковый трек m56 на 82 страницах (у flac 78). -Кольцевой проигрыватель получает число страниц из индекса, и код к этому -готов, но живого прогона финала на mt32 не было — до него надо дойти в -игре. Это оставшийся пункт приёмки. diff --git a/applications/SprPoP/docs/status_line_text.md b/applications/SprPoP/docs/status_line_text.md deleted file mode 100644 index 75cd199..0000000 --- a/applications/SprPoP/docs/status_line_text.md +++ /dev/null @@ -1,218 +0,0 @@ -# Текст в нижней статус-строке (строке HP) — полная инвентаризация SDLPoP - -Разбор `SDLPoP/src/` на 2026-08-25. Цель — знать ВЕСЬ набор сообщений, -которые оригинал печатает в ту же полосу, где нарисованы деления HP, -и правила их появления/исчезновения. Это входные данные для порта: -у нас пока туда пишется только `GAME PAUSED`. - ---- - -## 1. Геометрия: одна полоса на HP и на текст - -``` -rect_bottom_text = { top 193, left 70, bottom 202, right 250 } // data.h:217 -display_text_bottom: draw_rect(чёрным) + show_text(halign_center, valign_bottom) -``` - -* Деления HP **Кида** — от `x = 0` вправо, шаг 7, максимум 10 → занимают `x 0..69`. -* Деления HP **стража** — от `x = 314` влево, шаг 7, максимум 10 → занимают `x 245..320`. -* Текст живёт РОВНО в промежутке `x 70..250` и по X с делениями не пересекается. -* По Y деления на `y = 194..200`, текст (`valign_bottom` к 202) — на `y = 195..201`, - то есть на строку ниже. Именно поэтому в оригинале текст выглядит «сидящим» - чуть ниже стрелок HP. - -**У нас**: `POP_HP_Y = 194` (`pop_cdraw.h`), экран сдвинут на `POP_YOFF = 28`, -базовая линия крупного шрифта `POP_YOFF + POP_HP_Y + 8 = 230` — силуэт -ложится на `223..229`, то есть та же картинка. - -## 2. Два примитива и два таймера - -| Имя | Что делает | -|-----|------------| -| `display_text_bottom(text)` (seg008:2644) | стереть прямоугольник цветом 0 и напечатать текст по центру | -| `erase_bottom_text(arg)` (seg008:266D) | стереть прямоугольник; при `arg != 0` ещё и обнулить оба таймера | -| `text_time_remaining` | сколько игровых тиков сообщение ещё висит; 0 — ничего не висит | -| `text_time_total` | **идентификатор сообщения**, а не только его длительность | - -Обработка тика — в `draw_game_frame`/`idle` (seg000:956). Комментарий в -оригинале прямой: *«Note: texts are identified by their total time!»* Значения -`text_time_total`, у которых есть особое поведение: - -| `total` | Смысл | Что происходит по истечении | -|---------|-------|------------------------------| -| 12 | «1 SECOND LEFT» | обычное стирание | -| 24 | обычное короткое сообщение | обычное стирание | -| 36 | смерть на демо-уровне (0) или на уровне зелий (15) — **текста нет** | `start_game()` — рестарт игры | -| 288 | «Press Button to Continue» | `start_game()` — рестарт игры | -| 1188 | защита от копирования (уровень 15) | **не убывает и не исчезает** | - -Мигание: при `total == 288` и `remaining < 72` сообщение мигает с периодом 12 -тиков — 4 тика видно (`blink_frame <= 3`), 8 нет; в кадре `blink_frame == 3` -заново печатается текст и играет звук 38 (`sound_38_blink`). - -Сброс: `init_game()` (seg003:32) обнуляет оба таймера и `is_show_time` — то есть -любое сообщение умирает на старте уровня. - ---- - -## 3. Полный список сообщений - -### 3.1. Состояние программы - -| Текст | Где | Таймер | -|-------|-----|--------| -| `GAME PAUSED` | seg000:1769, пока `is_paused` | **без таймера**: печатается на входе в паузу, `erase_bottom_text(1)` на выходе (seg000:1784) | - -### 3.2. Уровень и оставшееся время (`show_level` / `show_time`, seg008) - -| Текст | Условие | `total` | -|-------|---------|---------| -| `LEVEL %d` | `show_level()` при старте уровня; только `1..12` (`hide_level_number_from_level = 14`), не при `seamless`; уровень 13 показывается как **12** (`level_13_level_number`) | 24, дальше сразу `is_show_time = 1` | -| `%d MINUTES LEFT` | каждая минута, кратная 5, и каждая из последних 5 | 24 | -| `%d SECONDS LEFT` | последняя минута, раз в 12 тиков | 24 | -| `1 SECOND LEFT` | остался 1 с | **12** | -| `TIME HAS EXPIRED!` | `rem_min == 0` | 24 | -| `%d MINUTES PASSED` / `1 MINUTE PASSED` | только SDLPoP (`ALLOW_INFINITE_TIME`), при отрицательном таймере | 24 | - -Что взводит `is_show_time` (все → следующий кадр печатает время): - -* **Space** — seg000:612, штатная клавиша оригинала «сколько осталось»; -* читы **`-`/`+` numpad** (изменение времени) — seg000:762 / 777, при этом - таймеры сообщения обнуляются, чтобы новое напечаталось немедленно; -* **смерть Джафара** — `on_guard_killed()` seg006:1936, уровень 13 - (`jaffar_victory_level`): вспышка + показать время; -* истечение очередной минуты — seg008:1796; -* сразу после `show_level()`. - -Обнуляет `is_show_time`: `play_kid()` при смерти (seg006:1365) и -`show_copyprot(1)` (seg000:2385). - -### 3.3. Смерть Кида - -| Текст | Где | `total` | -|-------|-----|---------| -| `Press Button to Continue` | `play_kid()` seg006:1383 — умер на обычном уровне | **288** (мигает, затем рестарт игры) | -| *(без текста)* | тот же код, но уровень 0 (демо) или 15 (зелья) | **36** (тихая пауза, затем рестарт игры) | - -Стирается: `fell_out()` (seg006:1342, упал из комнаты 0) и чит **R** -(воскрешение, seg000:783) — оба зовут `erase_bottom_text(1)`. - -### 3.4. Сохранение и загрузка - -| Текст | Клавиша | `total` | -|-------|---------|---------| -| `GAME SAVED` / `UNABLE TO SAVE GAME` | Ctrl+G (`save_game`, seg000:2211) | `total` не ставится, `remaining = 24` | -| `QUICKSAVE` / `NO QUICKSAVE` | F6 (расширение SDLPoP, seg000:497) | 24 | -| `QUICKLOAD` / `NO QUICKLOAD` | F9 (расширение SDLPoP, seg000:514) | 24 | - -### 3.5. Ответы на клавиши (`answer_text` → `need_show_text`, все `total = 24`) - -| Текст | Клавиша | -|-------|---------| -| `SOUND ON` / `SOUND OFF` | Ctrl+S | -| `KEYBOARD MODE` | Ctrl+K | -| `JOYSTICK MODE` / `JOYSTICK NOT FOUND` / `JOYSTICK UNAVAILABLE` | Ctrl+J | -| `PRINCE OF PERSIA V1.0` (в SDLPoP заменено на `SDLPoP v%s`) | Ctrl+V | -| `SDL COMP v… LINK v…` | Ctrl+C — только SDLPoP | - -### 3.6. Отладочные читы (`cheats_enabled`, `total = 24`) - -| Текст | Клавиша | Смысл | -|-------|---------|-------| -| `S%d L%d R%d A%d B%d` | `C` | номер отрисованной комнаты и её соседей L/R/A/B | -| `AL%d AR%d BL%d BR%d` | Shift+`C` | диагональные соседи | - -### 3.7. Защита от копирования (только уровень 15) - -| Текст | Где | `total` | -|-------|-----|---------| -| `WORD %d LINE %d PAGE %d` | `show_copyprot(1)` seg000:2389 | **1188** — висит, пока не сменится уровень | - -### 3.8. Только SDLPoP, в оригинале 1989 отсутствует - -| Текст | Где | -|-------|-----| -| `RECORDING`, `REPLAY SAVED`, `REPLAY CANCELED` | replay.c:599/626/628 | -| имя файла скриншота | screenshot.c:62 | - ---- - -## 4. Что из этого касается нашего порта - -Реализовано (`pop_status.c`, таймер 24 тика как у оригинала): - -* `GAME PAUSED` — без таймера, рисует само меню (`pop_menu.c`); -* `QUICKSAVE` / `NO QUICKSAVE`, `QUICKLOAD` / `NO QUICKLOAD` — заявка стоит - в `pop_qsave_process`, то есть в единственном месте, где известно, что - именно делали. Лейбл печатается ДО дисковой операции — осознанное - расхождение, см. `impl_diff.md`; -* `SOUND ON` / `SOUND OFF` — Ctrl+S; -* `LEVEL %d` — порт `show_level()` целиком: демо-уровень 0 и номера от 14 - молчат, тринадцатый показывается двенадцатым, бесшовный переход 12→13 - пропускается и гасит флаг за собой. - -* вся группа времени — `N MINUTES LEFT`, `N SECONDS LEFT`, `1 SECOND LEFT`, - `TIME HAS EXPIRED!`. Флаг `pop_show_time` (порт `is_show_time`) взводит - само ядро таймера на круглых пятёрках и каждую секунду последней минуты, - а также старт уровня и читы времени; значение 2 означает «перебить - текущую строку», как оригинал делает в последнюю минуту; -* `Press Button to Continue` — висит бессрочно (`MSG_HOLD`), уровень - перезапускает кнопка. Расхождение с оригиналом, см. `impl_diff.md`. - -Пока НЕ печатается: - -* номера комнат (`C`/Shift+`C`) — у нас отдельная отладочная строка; -* copy protection и SDLPoP-расширения (replay, скриншоты) — не нужны. - -Отладочная строка вдобавок показывает оставшееся время `##:##` у правого -края. На табло уходит `minutes-1`: у оригинала `rem_min` — это НОМЕР идущей -минуты, а не остаток целых (старт 60 при `rem_tick` 719 = «почти 60:00»). -Секунды считаются делением раз в 12 кадров, а не каждый кадр. - -Нам не нужно: copy protection (уровень 15 исключён из порта — см. -`full_game_plan.md`), joystick-режимы, replay, скриншоты. - -Механика, которую придётся портировать целиком, если брать группу времени: -пара таймеров `text_time_total`/`text_time_remaining` с семантикой -«идентификатор сообщения» — иначе не воспроизвести ни мигание, ни рестарт по -истечении 36/288. - ---- - -## 5. Цена вывода и что делать, если упрёмся - -Блит одного глифа стоит ~4,6 тыс. тактов почти независимо от размера — это -цена вызова, а не пикселей (memory `blit_cost_model`). Полсотни символов = -полкадра. Что уже сделано в `pop_status.c` / `pop_ui.c`: - -* **change-driven**: пока показанное не изменилось, не рисуем вовсе; -* **по полям**: смена комнаты — две цифры (~9 тыс. тактов, 2% кадра), а не - вся строка; подписи рисуются только при полной инвалидации; -* **пробелы не блитятся**: их глиф целиком прозрачен, а стоит как буква — - на полной отладочной строке это девять сэкономленных блитов; -* **заливка только поля** при входе в комнату (`pop_screen_fill_field`): - борта от комнаты к комнате не меняются, это и четверть заливки, и то, что - обе полосы вход переживают. - -Запас, если бюджета всё же не хватит (идеи пользователя, 2026-08-25): - -1. **Растянуть вывод на несколько кадров, не показывая полуготовую строку.** - Печатать по нескольку букв за кадр, держа цвет шрифта чёрным (отдельный - индекс палитры), а по готовности подменить этот индекс на белый — строка - появится целиком и мгновенно. Стоит ноль байт памяти и укладывается в - нашу же технику «два разных чёрных» (`POP_COL_OUTSIDE`). -2. **Собирать строку в один спрайт** в свободном хвосте страницы шрифта и - блитить одним вызовом. Дороже по подготовке (~35 тыс. тактов на - копирование), но выгодно там, где строка ЦЕЛИКОМ меняется каждый раз. - Для меню этот путь уже рассматривался и был отвергнут; для статус-строк - он имеет смысл только вместе с п.1. - -Про QuickSave/QuickLoad оптимизация не нужна вовсе: там игра и так стоит на -время дисковой операции. - -## 6. Ловушка: свисающие глифы - -Зона стирания текста обязана захватывать строку НИЖЕ базовой линии. В малом -шрифте `'p'` имеет высоту 7 при ascent 5, `','` — 6: они свисают под базовую -линию. Стирание ровно до неё оставляло от хвоста «p» в «Speed:» одинокую -точку (поймано в MAME 2026-08-25). diff --git a/applications/SprPoP/docs/vanilla_vs_bugfixed.md b/applications/SprPoP/docs/vanilla_vs_bugfixed.md deleted file mode 100644 index 4a38b41..0000000 --- a/applications/SprPoP/docs/vanilla_vs_bugfixed.md +++ /dev/null @@ -1,275 +0,0 @@ -# Два поведения: VANILLA и BUGFIXED - -> Заведено 2026-08-31. Задача поставлена, работа НЕ начата. - -## Зачем - -У оригинального PoP есть баги, которые игроки знают наизусть и на -которых построены известные трюки. SDLPoP чинит их не молча, а -ОПЦИОНАЛЬНО: каждое исправление отдельным переключателем, по умолчанию -часть включена, часть нет. Мы до сих пор повторяли ваниль — сознательно, -чтобы порт вёл себя как оригинал. - -Задача: дать ДВА поведения на выбор, не размазывая условия по всему коду: - -* **VANILLA** — как в оригинале 1989 года, со всеми его багами; -* **BUGFIXED** — с портированными исправлениями SDLPoP. - -## Что уже известно (из аудита) - -Разбор расхождений — `docs/sdlpop_audit.md`. Оттуда прямо в эту задачу -переезжает следующее. - -### Опциональные фиксы SDLPoP, которых у нас НЕТ - -Все три относятся к прохождению сквозь препятствия и живут в `do_fall` -(seg005) и рядом: - -| фикс SDLPoP | что чинит | -|---|---| -| «скольжение сквозь стену» | Кид падает сквозь стены после разворота в беге, особенно под зельем медленного падения | -| «прыжок сквозь стену над воротами» | пролёт в тайл над воротами | -| «проваливание сквозь гобелен» | падение сквозь тайл гобелена | - -Ни один не портирован — это и есть наше нынешнее VANILLA. - -### Находка 24 — отложена сюда - -`in_wall` у нас пересчитывает только колонку, а оригинал перезагружает -ещё и данные кадра (`load_fram_det_col`, seg006). Правка сделана и -ОТКАЧЕНА 2026-08-31 по такой причине: - -* по букве оригинала находка верна; -* но практического эффекта показать НЕ УДАЛОСЬ — все 15 наборов - host-тестов дают одинаковый результат до и после, включая специально - написанный тест на заход в кладку; -* при этом правка не бесплатна: добавляет маппинг окна и перезагрузку - кадра на каждое выталкивание из стены. - -Платить за недоказанное не стали. Вернуться к ней имеет смысл именно -здесь: при работе над BUGFIXED появится сценарий, где кадр меняется перед -выталкиванием, и тогда эффект станет наблюдаемым. - -### Готовый детектор поведения - -`tests/host/t_wall.c` расширен с одной проверки до трёх. Ключевая — -`wall_stops_jump_from_left_side`: она НЕ требует нуля заходов в кладку, а -сторожит их ЧИСЛО (сейчас ровно два случая из четырнадцати стартовых -позиций). - -Это и есть переключатель ожиданий между режимами: - -* больше двух — правка сделала нас хуже ванили, регресс; -* ровно два — ведём себя как оригинал (режим VANILLA); -* меньше двух — кто-то портировал фикс; в режиме BUGFIXED тест должен - ждать нуля. - -То есть когда появится BUGFIXED, этому тесту понадобится ожидание, -зависящее от режима, — и он готов стать первым таким. - -## Переключатель уже есть — второго не нужно - -Уточнено 2026-08-31: в настройках игры ПЕРЕКЛЮЧАТЕЛЬ VANILLA/ENHANCED -СУЩЕСТВУЕТ (`docs/menu_settings_plan.md`), просто сейчас он жёстко -зафиксирован в положении VANILLA. Отдельную сущность заводить не надо — -эта задача про то, чтобы наполнить смыслом уже имеющееся положение -ENHANCED. - -**Наш «ванильный» билд уже не чистая ваниль.** Часть ванильных багов у -нас пофикшена по ходу портирования. Значит: - -* нельзя считать текущее поведение эталоном ванили — оно смешанное; -* при разделении режимов придётся пройтись по уже сделанным фиксам и - решить по каждому, остаётся он в VANILLA или уезжает в ENHANCED; -* и наоборот: отдельные исправления (например, падение сквозь стену) - вполне могут быть сделаны прямо в нынешнем «ванильном» билде, если - сочтём, что играбельность важнее буквальности. - -## Что предстоит решить - -1. **Что считать ванилью на практике.** Составить список уже сделанных - отступлений от оригинала и распределить их между режимами. -2. **Цена рантайм-проверки.** Условия попадают в физику и `play_seq`, то - есть в горячий путь. Если переключать в рантайме, проверка должна - быть дешевле самого фикса: флаг в резиденте, а не вызов через банк. -3. **Что считать умолчанием.** Оригинальное поведение честнее для порта, - но часть фиксов SDLPoP включает по умолчанию. -4. **Как тестировать оба режима.** Host-тесты гоняются одним прогоном; - для двух режимов нужен либо параметр сборки тестов, либо ожидания, - зависящие от флага. - -## Инвентаризация: что уже решено по каждому фиксу SDLPoP - -Составлено 2026-08-31 обходом кода. В движке эти решения УЖЕ приняты и -задокументированы прямо в комментариях — таблица лишь сводит их в одно -место, чтобы при разделении режимов не перечитывать исходники. - -| фикс SDLPoP | где у нас | что взято | -|---|---|---| -| `fix_feather_fall_affects_guards` | `pop_map.c:941` | **ФИКС** — перо действует только на Кида | -| `fix_exit_door` | `pop_map.c:1212` | **ФИКС** — ветка фикса вместо ванильного глобала | -| `FIX_GATE_SOUNDS` | `pop_trob.c:579` | **ФИКС** — условия через ИЛИ | -| `fix_sound_priorities` | `pop_sfx.c:196` | **ФИКС** — в SDLPoP включён безусловно, сравниваемся с исправленным | -| `FIX_STAND_ON_THIN_AIR` | `pop_map.c:1499` | **ВАНИЛЬ** — взяты 2 части из 3, третья ждёт патча `seqtbl` | -| `fix_painless_fall_on_guard` | `pop_map.c:1611` | **ВАНИЛЬ** — намеренно | -| `fix_jumping_over_guard` | `pop_map.c:1612` | **ВАНИЛЬ** — намеренно | -| `FIX_RETREAT_WITHOUT_LEAVING_ROOM` | `pop_map.c:3036` | **ВАНИЛЬ** — в SDLPoP выключен по умолчанию; трюк 35 сохраняем | -| `fix_skeleton_chomper_blood` | `pop_map.c:3177` | **ВАНИЛЬ** — кровь скелета в ванили есть | -| потеря HP скелетом при падении с двух этажей | `pop_map.c:676` | **ВАНИЛЬ** — баг оригинала, сохраняем сознательно | - -### Фиксы, которым нужна правка байткода - -`FIX_STAND_ON_THIN_AIR` не взят НЕ потому, что мы выбрали ваниль, а -потому что его нельзя применить наполовину: он состоит из трёх частей, и -третья — правка самого байткода `seqtbl` (смещения в последовательности -вставания). Взяв только первые две, мы получим вставание, уносящее -весовую точку в стену, то есть ХУЖЕ ванили. - -**Это выполнимо, и раньше здесь стояла неверная оценка** (уточнено -2026-08-31): байткод можно менять и у нас. Способов три: - -1. **Патч в рантайме** — после загрузки `kid.ani` в EMM-страницу - пропатчить нужные байты прямо там. Речь о единицах байт, страница уже - наша, и патч обратим — то есть режим переключается без пересборки - ресурсов. Это и делает фикс пригодным для VANILLA/ENHANCED. -2. **Патч в упаковщике** — готовить два варианта `kid.ani`. Привязывает - режим к файлам на диске, поэтому хуже: переключатель в меню перестаёт - быть чисто кодовым. -3. **Две копии в одной странице** — и это, пожалуй, лучший вариант - (решено 2026-08-31). `kid.ani` целиком около 4 КБ, а страница EMM — - 16 КБ, то есть обе версии байткода спокойно помещаются рядом в уже - выделенной странице. Переключение режима сводится к смене базового - смещения, патчить ничего не нужно, откат мгновенный. - -Для сравнения: у SDLPoP рабочая таблица и неизменная копия оригинала -существуют раздельно (`seqtbl` и `original_seqtbl`), причём вторая нужна -для сверки — то есть сама идея «оригинальный байткод отдельно, рабочий -отдельно» там уже заложена. - -Общее правило для BUGFIXED: фиксы, требующие правки `seqtbl`, доступны -через рантайм-патч страницы; закладывать это стоит сразу, чтобы не -упереться при первом же таком фиксе. - -### Вывод для разделения режимов - -Четыре фикса уже взяты, шесть позиций оставлены ванильными. Значит -нынешний билд — это не VANILLA, а «ваниль плюс четыре исправления». При -разделении: - -* взятые четыре надо либо оставить в обоих режимах (если считаем их - безусловными улучшениями), либо увести в ENHANCED и вернуть ванильное - поведение в VANILLA — второе честнее, но потребует обратной работы; -* ванильные шесть — кандидаты в ENHANCED; `FIX_STAND_ON_THIN_AIR` тоже, - но ему дополнительно нужен рантайм-патч байткода. - -## ВСЕ исправления SDLPoP и их статус у нас - -Полный перечень опциональных исправлений оригинала, какие есть в SDLPoP -(43 позиции), со статусом в нашем порте. Названия — идентификаторы -опций SDLPoP, описание — своими словами. - -Статусы: **ВЗЯТ** — портирован; **ВАНИЛЬ** — сознательно не берём, держим -поведение оригинала; **НЕТ** — не реализован, кандидат в ENHANCED; -**НЕДОСТУПЕН** — требует правки байткода `seqtbl` (см. ограничение выше); -**В РАБОТЕ** — решено делать сейчас. - -### Стены и препятствия - -| опция | что чинит | статус | -|---|---|---| -| `fix_glide_through_wall` | проход сквозь стену при падении после разворота в беге | **ВЗЯТ** 2026-08-31 — `glide_through_wall_guard()` в `pop_map.c`, точка отвязки для VANILLA | -| `fix_jump_through_wall_above_gate` | прыжок в тайл над воротами | НЕТ | -| `fix_drop_through_tapestry` | проваливание сквозь гобелен | НЕТ | -| `fix_running_jump_through_tapestry` | прыжок с разбега сквозь гобелен | НЕТ | -| `fix_turn_running_near_wall` | разворот в беге вплотную к стене | НЕТ | -| `fix_wall_bump_triggers_tile_below` | удар о стену срабатывает на тайл ниже | НЕТ | -| `fix_bigpillar_climb` | подъём на большую колонну | НЕТ | -| `fix_land_against_gate_or_tapestry` | приземление вплотную к воротам или гобелену | НЕТ | -| `fix_caped_prince_sliding_through_gate` | проскальзывание сквозь ворота | НЕТ | - -### Падение, прыжки, зацепы - -| опция | что чинит | статус | -|---|---|---| -| `fix_stand_on_thin_air` | стояние на воздухе после отмены падения | НЕТ — нужен рантайм-патч `seqtbl` (см. выше) | -| `fix_jump_distance_at_edge` | дальность прыжка у самой кромки | НЕТ | -| `fix_edge_distance_check_when_climbing` | проверка расстояния до кромки при подъёме | НЕТ | -| `fix_grab_falling_speed` | зацеп на слишком большой скорости падения | НЕТ | -| `fix_drop_2_rooms_climbing_loose_tile` | провал через две комнаты при подъёме на шаткой плите | НЕТ | -| `fix_infinite_down_bug` | бесконечное падение вниз | НЕТ | -| `fix_falling_through_floor_during_sword_strike` | провал сквозь пол во время удара мечом | НЕТ | -| `fix_safe_landing_on_spikes` | безопасное приземление на невыдвинутые пики | НЕТ | -| `fix_dead_floating_in_air` | мёртвый зависает в воздухе | НЕТ | - -### Бой и стражи - -| опция | что чинит | статус | -|---|---|---| -| `fix_painless_fall_on_guard` | падение на стража с высоты без урона | **ВАНИЛЬ** | -| `fix_jumping_over_guard` | перепрыгивание через стража | **ВАНИЛЬ** | -| `fix_skeleton_chomper_blood` | кровь скелета в челюстях | **ВАНИЛЬ** | -| `fix_push_guard_into_wall` | вталкивание стража в стену | НЕТ | -| `fix_guard_following_through_closed_gates` | страж идёт сквозь закрытые ворота | НЕТ | -| `fix_doortop_disabling_guard` | верх двери отключает стража | НЕТ | -| `fix_offscreen_guards_disappearing` | стражи пропадают за краем экрана | НЕТ | -| `fix_unintended_sword_strike` | непреднамеренный удар мечом | НЕТ | -| `fix_two_coll_bug` | двойная проверка столкновения | НЕТ | -| `fix_move_after_sheathe` | движение сразу после убирания меча | НЕТ | - -### Ворота, двери, плиты - -| опция | что чинит | статус | -|---|---|---| -| `fix_exit_door` | дверь выхода с уровня | **ВЗЯТ** | -| `fix_gate_sounds` | звуки ворот | **ВЗЯТ** | -| `fix_gate_drawing_bug` | отрисовка ворот | НЕТ | -| `fix_press_through_closed_gates` | нажатие плиты сквозь закрытые ворота | НЕТ | -| `fix_chompers_not_starting` | челюсти не заводятся | НЕТ | -| `fix_loose_left_of_potion` | шаткая плита слева от зелья | НЕТ | -| `fix_hidden_floors_during_flashing` | скрытые полы во время вспышки | НЕТ | -| `fix_retreat_without_leaving_room` | отступление без смены комнаты (трюк 35) | **ВАНИЛЬ** | - -### Зелья, перо, спецэффекты - -| опция | что чинит | статус | -|---|---|---| -| `fix_feather_fall_affects_guards` | перо действует и на стражей | **ВЗЯТ** | -| `fix_feather_interrupted_by_leveldoor` | перо прерывается дверью уровня | НЕТ | -| `fix_move_after_drink` | движение сразу после питья | НЕТ | -| `fix_quicksave_during_feather` | быстрое сохранение под пером | НЕТ | -| `fix_hang_on_teleport` | зависание при телепорте | НЕТ (телепортов у нас нет) | - -### Интерфейс и ввод - -| опция | что чинит | статус | -|---|---|---| -| `fix_one_hp_stops_blinking` | индикатор перестаёт мигать на одном HP | НЕТ | -| `fix_register_quick_input` | учёт быстрого ввода | НЕТ | - -### Отдельно: приоритеты звуков - -`fix_sound_priorities` в SDLPoP включён БЕЗУСЛОВНО (не опция), и мы -сравниваемся с исправленным вариантом — `pop_sfx.c:196`. Статус: -**ВЗЯТ**, вернуть ванильное поведение отдельным режимом было бы -дополнительной работой. - -### Сводка - -| статус | сколько | -|---|---:| -| ВЗЯТ | 5 | -| ВАНИЛЬ (сознательно) | 4 | -| требует патча `seqtbl` (выполнимо) | 1 | -| НЕТ (кандидаты в ENHANCED) | 32 | - -## Список кандидатов на BUGFIXED - -Пополняется по мере аудита. Пока: - -* три опциональных фикса SDLPoP выше; -* находка 24 (перезагрузка кадра в `in_wall`); -* находка 21 из аудита — общая рамка «мы намеренно повторяем ваниль». - -Не относятся сюда находки, где мы расходимся с оригиналом НЕ в его -пользу (ранги А и Б аудита): их надо чинить в обоих режимах, потому что -это не баги оригинала, а наши. diff --git a/applications/SprPoP/gen/bg_arc.h b/applications/SprPoP/gen/bg_arc.h deleted file mode 100644 index 581908e..0000000 --- a/applications/SprPoP/gen/bg_arc.h +++ /dev/null @@ -1,34 +0,0 @@ -/* bg_arc.h — индексы в архиве BG. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef BG_ARC_H -#define BG_ARC_H - -#define ARC_BG_COUNT 25 - -#define ARC_BG_POP_ENV0 0 -#define ARC_BG_POP_ENV1 1 -#define ARC_BG_POP_ENV2 2 -#define ARC_BG_POP_ENV3 3 -#define ARC_BG_POP_ENV4 4 -#define ARC_BG_POP_ENV5 5 -#define ARC_BG_POP_ENV6 6 -#define ARC_BG_POP_ENV7 7 -#define ARC_BG_POP_ENV8 8 -#define ARC_BG_POP_ENV9 9 -#define ARC_BG_POP_WALL 10 -#define ARC_BG_POP_FORE 11 -#define ARC_BG_PAL_ENV0 12 -#define ARC_BG_PAL_ENV1 13 -#define ARC_BG_PAL_ENV2 14 -#define ARC_BG_PAL_ENV3 15 -#define ARC_BG_PAL_ENV4 16 -#define ARC_BG_PAL_ENV5 17 -#define ARC_BG_PAL_ENV6 18 -#define ARC_BG_PAL_ENV7 19 -#define ARC_BG_PAL_ENV8 20 -#define ARC_BG_PAL_ENV9 21 -#define ARC_BG_PAL_WALL 22 -#define ARC_BG_PAL_FORE 23 -#define ARC_BG_POP_POT 24 - -#endif diff --git a/applications/SprPoP/gen/guard_arc.h b/applications/SprPoP/gen/guard_arc.h deleted file mode 100644 index f930261..0000000 --- a/applications/SprPoP/gen/guard_arc.h +++ /dev/null @@ -1,19 +0,0 @@ -/* guard_arc.h — индексы в архиве GUARD. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef GUARD_ARC_H -#define GUARD_ARC_H - -#define ARC_GUARD_COUNT 10 - -#define ARC_GUARD_G0 0 -#define ARC_GUARD_G1 1 -#define ARC_GUARD_G2 2 -#define ARC_GUARD_G3 3 -#define ARC_GUARD_G4 4 -#define ARC_GUARD_G0_V 5 -#define ARC_GUARD_G1_V 6 -#define ARC_GUARD_G2_V 7 -#define ARC_GUARD_G3_V 8 -#define ARC_GUARD_G4_V 9 - -#endif diff --git a/applications/SprPoP/gen/kid_arc.h b/applications/SprPoP/gen/kid_arc.h deleted file mode 100644 index db3d846..0000000 --- a/applications/SprPoP/gen/kid_arc.h +++ /dev/null @@ -1,67 +0,0 @@ -/* kid_arc.h — индексы в архиве KID. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef KID_ARC_H -#define KID_ARC_H - -#define ARC_KID_COUNT 58 - -#define ARC_KID_KID0 0 -#define ARC_KID_KID1 1 -#define ARC_KID_KID2 2 -#define ARC_KID_KID3 3 -#define ARC_KID_KID4 4 -#define ARC_KID_KID5 5 -#define ARC_KID_KID6 6 -#define ARC_KID_KID7 7 -#define ARC_KID_KID8 8 -#define ARC_KID_KID9 9 -#define ARC_KID_KID10 10 -#define ARC_KID_KID11 11 -#define ARC_KID_KID12 12 -#define ARC_KID_KID13 13 -#define ARC_KID_KID14 14 -#define ARC_KID_KID15 15 -#define ARC_KID_KID16 16 -#define ARC_KID_KID17 17 -#define ARC_KID_KID18 18 -#define ARC_KID_KID19 19 -#define ARC_KID_KID20 20 -#define ARC_KID_KID21 21 -#define ARC_KID_KID22 22 -#define ARC_KID_KID23 23 -#define ARC_KID_KID24 24 -#define ARC_KID_KID25 25 -#define ARC_KID_KID26 26 -#define ARC_KID_KID27 27 -#define ARC_KID_KID0_V 28 -#define ARC_KID_KID1_V 29 -#define ARC_KID_KID2_V 30 -#define ARC_KID_KID3_V 31 -#define ARC_KID_KID4_V 32 -#define ARC_KID_KID5_V 33 -#define ARC_KID_KID6_V 34 -#define ARC_KID_KID7_V 35 -#define ARC_KID_KID8_V 36 -#define ARC_KID_KID9_V 37 -#define ARC_KID_KID10_V 38 -#define ARC_KID_KID11_V 39 -#define ARC_KID_KID12_V 40 -#define ARC_KID_KID13_V 41 -#define ARC_KID_KID14_V 42 -#define ARC_KID_KID15_V 43 -#define ARC_KID_KID16_V 44 -#define ARC_KID_KID17_V 45 -#define ARC_KID_KID18_V 46 -#define ARC_KID_KID19_V 47 -#define ARC_KID_KID20_V 48 -#define ARC_KID_KID21_V 49 -#define ARC_KID_KID22_V 50 -#define ARC_KID_KID23_V 51 -#define ARC_KID_KID24_V 52 -#define ARC_KID_KID25_V 53 -#define ARC_KID_KID26_V 54 -#define ARC_KID_KID27_V 55 -#define ARC_KID_SWORD 56 -#define ARC_KID_SWORD_V 57 - -#endif diff --git a/applications/SprPoP/gen/kid_data.h b/applications/SprPoP/gen/kid_data.h deleted file mode 100644 index 09debc0..0000000 --- a/applications/SprPoP/gen/kid_data.h +++ /dev/null @@ -1,77 +0,0 @@ -/* kid_data.h — данные анимации Kid (frame_table + seqtbl + - * offsets), извлечено toolchain/pop_extract_kid_data.py из - * SDLPoP. НЕ править вручную. seqtbl адресуется базой - * SEQTBL_BASE: kid_seqtbl[addr - SEQTBL_BASE]. */ -#ifndef KID_DATA_H -#define KID_DATA_H -#include - -#define SEQTBL_BASE 0x196Eu - -/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid). - * САМА таблица кадров и seqtbl лежат в kid.ani (EMM- - * страница); здесь только тип и размеры. */ -typedef struct { uint8_t image; int8_t dx, dy; uint8_t flags, sword; } kframe; -#define KID_NFRAMES 241 -#define KID_SEQTBL_LEN 2310 - -/* Раскладка kid.ani: кадры (KID_NFRAMES*5), затем seqtbl. */ -#define KID_BIN_FRAMES_OFF 0 -#define KID_BIN_SEQTBL_OFF 1205 -/* Таблица кадров СТРАЖА (frame_tbl_guard, seg006:372): индекс - * frame + add_frame - 149 (add_frame=70 для кадров 102..106). */ -#define KID_NGFRAMES 41 -#define KID_BIN_GFRAMES_OFF 3515 -/* Таблица кадров КАТСЦЕН (frame_tbl_cuts, seg006:417): - * Princess/Vizier, индекс — номер кадра как есть. Набор - * спрайтов выбирает sword>>6 (1 = PV1 res800, 2 = PV2 res900). */ -#define KID_NCFRAMES 86 -#define KID_BIN_CFRAMES_OFF 3720 - -#define KID_NSEQ 115 -#define KID_SEQ_OFF_INIT { \ - 0x0000,0x1973,0x19A0,0x1A93,0x1ACD,0x1B39,0x1B5A,0x1BDB, \ - 0x1C54,0x1CA1,0x1D04,0x1D25,0x1D49,0x1D4F,0x1D68,0x1DF6, \ - 0x1C84,0x202B,0x1C1C,0x1C01,0x205A,0x1C38,0x209C,0x1D36, \ - 0x1C69,0x1CD1,0x1B04,0x1B1A,0x1D7D,0x1F9E,0x1F92,0x1F82, \ - 0x1F72,0x1F5D,0x1F48,0x1F33,0x1F19,0x1F13,0x1EF7,0x1EDA, \ - 0x1EBB,0x1E9C,0x1E7D,0x1B53,0x1E59,0x1E06,0x1E3B,0x1DFC, \ - 0x1D9B,0x1FB3,0x1FA7,0x20BE,0x20D1,0x20D4,0x20C9,0x19C4, \ - 0x1A13,0x1A2E,0x1A3C,0x1A7C,0x1A83,0x1A63,0x1A5E,0x1A68, \ - 0x1A6E,0x1A75,0x1A5A,0x19F9,0x1CEC,0x1A54,0x20DD,0x20AE, \ - 0x1E78,0x1CDC,0x19DC,0x1A42,0x1A07,0x19A8,0x2009,0x1B1B, \ - 0x1A8B,0x1B85,0x1BA1,0x1BBF,0x196E,0x20A9,0x1A22,0x19A6, \ - 0x19AC,0x1B2D,0x19C1,0x1FCA,0x1FDA,0x1FFB,0x2195,0x2132, \ - 0x214F,0x2166,0x2199,0x21A8,0x216D,0x226E,0x2136,0x21BC, \ - 0x1BFA,0x2245,0x2253,0x225B,0x21C4,0x21C0,0x21E6,0x21EA, \ - 0x21FC,0x2240,0x2257, \ -} - -/* sword_tbl (seg006:2047): клинок отдельным спрайтом chtab_0. - * Индекс — sword_frame (кадр.sword & 0x3F), id 255 = клинка нет. - * Смещения x/y — ЭКРАННЫЕ (применяются после calc_screen_x_coord), - * x — «вперёд» по направлению персонажа. */ -#define KID_NSWORD 51 -#define KID_SWORD_ID_INIT { \ - 0xFF,0x00,0x05,0x01,0x02,0x06,0x07,0x03,0x04,0x1E,0x08,0x09, \ - 0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x13,0x11, \ - 0x11,0x07,0x01,0x1C,0x08,0x04,0x04,0x0A,0x0D,0x0D,0x0D,0x14, \ - 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0xFF,0xFF,0x1D,0x08,0x1F, \ - 0x20,0x21,0x08, \ -} -#define KID_SWORD_DX_INIT { \ - 0,0,-9,7,17,7,0,17,16,12,13,7, \ - 10,10,22,28,13,0,0,21,14,21,22,7, \ - 15,0,7,14,7,6,9,11,24,19,21,7, \ - 14,14,14,28,28,21,14,14,21,0,8,14, \ - 14,7,8, \ -} -#define KID_SWORD_DY_INIT { \ - 0,-9,-29,-25,-26,-14,-5,-16,-19,-9,-34,-25, \ - -16,-11,-21,-23,-35,-38,-29,-19,-23,-22,-23,-13, \ - -18,-8,-27,-28,-27,-23,-21,-18,-23,-23,-23,-32, \ - -32,-31,-29,-28,-28,-25,-22,-25,-25,-16,-37,-24, \ - -24,-14,-37, \ -} - -#endif diff --git a/applications/SprPoP/gen/pop_bg_atlas.h b/applications/SprPoP/gen/pop_bg_atlas.h deleted file mode 100644 index edb3299..0000000 --- a/applications/SprPoP/gen/pop_bg_atlas.h +++ /dev/null @@ -1,37 +0,0 @@ -/* pop_bg_atlas.h — раскладка атласов статического фона PoP. - * Сгенерировано tools/pop_pack_bg.py — НЕ править вручную. - * - * Прямая адресация (ноль remap-таблиц в W2): - * ENV фон id N -> atlas env_bg[N>>4], idx N&15 - * WALL id N -> atlas wall, idx N - * FORE id N -> atlas fore, idx N - * - * ДВА ТАЙЛСЕТА (порт tbl_envir_ki[tbl_level_type], seg000:1108): - * 0 = подземелье (pop_*), 1 = дворец (pal_*). Набор id и раскладка - * у них ОДНИ И ТЕ ЖЕ — меняются только файлы и 32 записи палитры - * (env 0x50..0x5F, wall 0x60..0x6F), см. *tile.pal. - */ -#ifndef POP_BG_ATLAS_H -#define POP_BG_ATLAS_H - -#define POP_ENV_SHIFT 4 -#define POP_ENV_MASK 15 -#define POP_ENV_PAGES 10 -#define POP_TILESETS 2 - -/* Палитра: env-слоты, wall-слоты (спрайт-пиксель i -> база+i). */ -#define POP_PAL_ENV 0x50 -#define POP_PAL_WALL 0x60 - -/* Палитры пока остаются отдельными файлами рядом с bg.arc. Имена - * видит только модуль загрузки, чтобы не размножать строки. */ -#ifdef POP_BG_ATLAS_NAMES -static const char *const pop_tile_pal[POP_TILESETS] = { "pop_tile.pal", "pal_tile.pal" }; -#endif /* POP_BG_ATLAS_NAMES */ -/* Пузырёк зелья: красный набор = id 16..22 (кадры оригинала), - зелёный (перо/переворот) и синий (вред/открыть) = те же кадры - под id 30..36 и 40..46 (draw_tile_anim, seg008:652). */ -#define POP_POT_BUBB_GREEN 30 -#define POP_POT_BUBB_BLUE 40 - -#endif diff --git a/applications/SprPoP/gen/pop_font.h b/applications/SprPoP/gen/pop_font.h deleted file mode 100644 index 1ef09fc..0000000 --- a/applications/SprPoP/gen/pop_font.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * pop_font.h — контракт FONT\FONT.ATL, СГЕНЕРИРОВАН. - * Источник: SDLPoP hc_small_font_data[] и hc_font_data[]. - * Генератор: toolchain/pop_extract_font.py. Руками не править. - */ -#ifndef POP_FONT_H -#define POP_FONT_H - -#include - -#define POP_FONT_COLOR 0x3F -#define POP_FONT_DARK_COLOR 0x3E -#define POP_FONT_FIRST 32 -#define POP_FONT_LAST 126 -#define POP_FONT_SMALL_BASE 0 -#define POP_FONT_SMALL_ASCENT 5 -#define POP_FONT_SMALL_SPACE 1 -#define POP_FONT_BIG_BASE 95 -#define POP_FONT_BIG_ASCENT 7 -#define POP_FONT_BIG_SPACE 1 -/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом. - * Набор обрезан по '_' — им пишется только таблица рекордов. */ -#define POP_FONT_DARK_BASE 190 -#define POP_FONT_DARK_FIRST 32 -#define POP_FONT_DARK_LAST 95 -#define POP_FONT_SNAPSHOT_OFF 0x3C00 -#define POP_FONT_ATLAS_SIZE 10841 - -#endif diff --git a/applications/SprPoP/gen/pop_guard_pal.h b/applications/SprPoP/gen/pop_guard_pal.h deleted file mode 100644 index 8e394f4..0000000 --- a/applications/SprPoP/gen/pop_guard_pal.h +++ /dev/null @@ -1,36 +0,0 @@ -/* pop_guard_pal.h — палитры стражей (guard_palettes из res10.bin). - * СГЕНЕРЕНО toolchain/pop_pack_guard.py — НЕ править вручную. - * - * Индексация как в оригинале: цвет из level.guards_color[room-1] - * (младшие 4 бита), 1..7 -> строка [color-1]; 0 = палитру НЕ менять - * (seg003:255 при curr_guard_color == 0 set_chtab_palette не зовёт). - * Запись — 4 байта (B, G, R, 0), формат gfx_pal_load. */ -#ifndef POP_GUARD_PAL_H -#define POP_GUARD_PAL_H - -#include - -#define POP_GUARD_PAL_BASE 0x90 /* слоты Sprinter под chtab_5 */ -#define POP_GUARD_NPAL 7 - -static const uint8_t pop_guard_pal[POP_GUARD_NPAL][64] = { - { 0x00,0x00,0x00,0x00,0xFF,0x91,0x48,0x00,0xB2,0x81,0x69,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x79,0x28,0x81,0x00,0xB2,0x81,0x69,0x00,0xC2,0xC2,0xC2,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x30,0xAA,0x00,0x00,0x24,0x81,0x00,0x79,0x79,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xC2,0x69,0x85,0x00,0xAA,0x5D,0x75,0x00,0xFF,0x89,0xB2,0x00,0x50,0x50,0x79,0x00,0x71,0x71,0xAA,0x00,0xBE,0x28,0xBA,0x00,0x00,0x24,0x81,0x00,0x61,0x61,0xCA,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x00,0x00,0x38,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x99,0xD2,0x00,0x00,0x7D,0xAA,0x00,0x00,0xBA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x99,0x28,0x6D,0x00,0x00,0x38,0xBE,0x00,0xD2,0xCA,0xCA,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x91,0x0C,0x00,0x00,0x71,0x0C,0x00,0xFF,0xD2,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x4C,0xAE,0xCA,0x00,0x38,0x7D,0x91,0x00,0x61,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x20,0x00,0x99,0x00,0x00,0x71,0x0C,0x00,0xB2,0x91,0xB2,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0xFF,0x00,0x61,0x00,0xAA,0x00,0x61,0x00,0xB2,0x3C,0xBE,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x8D,0xBA,0xCA,0x00,0x6D,0x8D,0x99,0x00,0xB2,0xEA,0xFF,0x00,0x34,0x6D,0x91,0x00,0x40,0x89,0xBA,0x00,0x79,0x28,0x81,0x00,0xAA,0x00,0x61,0x00,0x81,0x2C,0x89,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0xFF,0x59,0xCA,0x00,0xC2,0x44,0x99,0x00,0xFF,0xAA,0x91,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x99,0xB2,0xB2,0x00,0xDA,0xFF,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xA1,0x6D,0x5D,0x00,0xC2,0x44,0x99,0x00,0xD2,0x8D,0x79,0x00,0x38,0x00,0xF6,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xDA,0xDE,0x00,0xE2,0x30,0xB2,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x9D,0xD2,0x00,0x00,0x9D,0xF2,0x00,0x00,0xC2,0xFF,0x00,0xA1,0x4C,0x75,0x00,0xFF,0x79,0xBA,0x00,0xB2,0x00,0x61,0x00,0x00,0xDA,0xDE,0x00,0xAA,0x24,0x85,0x00,0x38,0x00,0xF6,0x00 }, -}; - -/* Скелет (SKEL/res750.pal): свой набор — свой цвет. */ -static const uint8_t pop_skel_pal[64] = { - 0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x00,0x89,0x79,0xBA,0x00,0xF2,0xFF,0xFF,0x00,0x00,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x00,0x55,0xAA,0x00,0xDA,0xE6,0xE6,0x00,0x55,0x55,0x55,0x00,0xFF,0x55,0x55,0x00,0x55,0xFF,0x55,0x00,0xFF,0xFF,0x55,0x00,0x55,0x55,0xFF,0x00,0x00,0x00,0x00,0x00,0x55,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00, -}; - -/* Джафар (VIZIER/res750.pal): свой набор — свой цвет. */ -static const uint8_t pop_vizier_pal[64] = { - 0x00,0x00,0x00,0x00,0x79,0x69,0xFF,0x00,0x7D,0x4C,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xEA,0x44,0xB2,0x00,0xEA,0x44,0xB2,0x00,0x55,0xFF,0xFF,0x00,0x99,0x2C,0x75,0x00, -}; - -#endif diff --git a/applications/SprPoP/gen/pop_shadow_atlas.h b/applications/SprPoP/gen/pop_shadow_atlas.h deleted file mode 100644 index 1000912..0000000 --- a/applications/SprPoP/gen/pop_shadow_atlas.h +++ /dev/null @@ -1,33 +0,0 @@ -/* pop_shadow_atlas.h — раскладка атласа ТЕНИ. - * СГЕНЕРЕНО tools/pop_pack_shadow.py — НЕ править вручную. - * - * Две половины, потому что и у оригинала их две (см. шапку - * упаковщика): кадры вне боя адресуют chtab_2 (спрайты Кида), - * кадры 150..189 — chtab_5, а он на 12-м уровне это SHADOW.DAT. - * Какая половина нужна, приложение уже знает — тем же условием, - * что выбирает таблицу кадров (pop_frame_tbl_is_guard). - * - * Спрайт Тени НА ОДИН ПИКСЕЛЬ ШИРЕ исходного: второй проход - * оригинала кладётся в x+1, и суммарный след занимает [x, x+w]. - * Рисовать по тем же координатам, что и Кида — сдвиг уже внутри. - */ -#ifndef POP_SHADOW_ATLAS_H -#define POP_SHADOW_ATLAS_H - -#include - -#define POP_SHADOW_SHIFT 3 -#define POP_SHADOW_MASK 7 -#define POP_SHADOW_PAL_BASE 0xA0 /* слоты Sprinter под Тень */ - -/* Половина «вне боя» — кадры Кида (chtab_2). */ -#define POP_SHADOW_KID_PAGES 28 -/* Половина «в бою» — SHADOW.DAT (chtab_5, кадры 150..189). */ -#define POP_SHADOW_FGT_PAGES 4 - -/* 16 цветов, запись 4 байта (B, G, R, 0) — формат gfx_pal_load. */ -static const uint8_t pop_shadow_pal[64] = { - 0x00,0x00,0x00,0x00,0xD8,0xFC,0xFC,0x00,0x6C,0x80,0xDC,0x00,0x78,0x44,0x24,0x00,0xA0,0xB8,0xD8,0x00,0xB5,0x7C,0x21,0x00,0x00,0x90,0xB8,0x00,0x5D,0x6D,0xAB,0x00,0x0C,0xF0,0x6C,0x00,0xCC,0x38,0x05,0x00,0x38,0xCC,0xC0,0x00,0x58,0xDB,0xA7,0x00,0xBB,0x9F,0x54,0x00,0x5D,0x18,0x60,0x00,0x37,0xD7,0x37,0x00,0x2F,0x17,0xD2,0x00, -}; - -#endif diff --git a/applications/SprPoP/gen/pv_arc.h b/applications/SprPoP/gen/pv_arc.h deleted file mode 100644 index d7b9dae..0000000 --- a/applications/SprPoP/gen/pv_arc.h +++ /dev/null @@ -1,92 +0,0 @@ -/* pv_arc.h — индексы в архиве PV. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef PV_ARC_H -#define PV_ARC_H - -#define ARC_PV_COUNT 83 - -#define ARC_PV_S0_0 0 -#define ARC_PV_S0_1 1 -#define ARC_PV_S0_2 2 -#define ARC_PV_S0_3 3 -#define ARC_PV_S0_4 4 -#define ARC_PV_S1_0 5 -#define ARC_PV_S1_1 6 -#define ARC_PV_S1_2 7 -#define ARC_PV_S1_3 8 -#define ARC_PV_S1_4 9 -#define ARC_PV_S2_0 10 -#define ARC_PV_S2_1 11 -#define ARC_PV_S2_2 12 -#define ARC_PV_S2_3 13 -#define ARC_PV_S2_4 14 -#define ARC_PV_S3_0 15 -#define ARC_PV_S3_1 16 -#define ARC_PV_S3_2 17 -#define ARC_PV_S3_3 18 -#define ARC_PV_S3_4 19 -#define ARC_PV_S4_0 20 -#define ARC_PV_S4_1 21 -#define ARC_PV_S4_2 22 -#define ARC_PV_S4_3 23 -#define ARC_PV_S4_4 24 -#define ARC_PV_S5_0 25 -#define ARC_PV_S5_1 26 -#define ARC_PV_S5_2 27 -#define ARC_PV_S5_3 28 -#define ARC_PV_S5_4 29 -#define ARC_PV_P0_0 30 -#define ARC_PV_P0_1 31 -#define ARC_PV_P0_2 32 -#define ARC_PV_P0_3 33 -#define ARC_PV_P0_4 34 -#define ARC_PV_P1_0 35 -#define ARC_PV_P1_1 36 -#define ARC_PV_P1_2 37 -#define ARC_PV_P1_3 38 -#define ARC_PV_P1_4 39 -#define ARC_PV_P2_0 40 -#define ARC_PV_P2_1 41 -#define ARC_PV_P2_2 42 -#define ARC_PV_P2_3 43 -#define ARC_PV_P2_4 44 -#define ARC_PV_P3_0 45 -#define ARC_PV_P3_1 46 -#define ARC_PV_P3_2 47 -#define ARC_PV_P3_3 48 -#define ARC_PV_P3_4 49 -#define ARC_PV_P4_0 50 -#define ARC_PV_P4_1 51 -#define ARC_PV_P4_2 52 -#define ARC_PV_P4_3 53 -#define ARC_PV_P4_4 54 -#define ARC_PV_P5_0 55 -#define ARC_PV_P5_1 56 -#define ARC_PV_P5_2 57 -#define ARC_PV_P5_3 58 -#define ARC_PV_P5_4 59 -#define ARC_PV_P6_0 60 -#define ARC_PV_P6_1 61 -#define ARC_PV_P6_2 62 -#define ARC_PV_P6_3 63 -#define ARC_PV_P6_4 64 -#define ARC_PV_P7_0 65 -#define ARC_PV_P7_1 66 -#define ARC_PV_P7_2 67 -#define ARC_PV_P7_3 68 -#define ARC_PV_P7_4 69 -#define ARC_PV_B0_0 70 -#define ARC_PV_B0_1 71 -#define ARC_PV_B0_2 72 -#define ARC_PV_B0_3 73 -#define ARC_PV_B0_4 74 -#define ARC_PV_A0 75 -#define ARC_PV_A1 76 -#define ARC_PV_A2 77 -#define ARC_PV_J0 78 -#define ARC_PV_J1 79 -#define ARC_PV_J2 80 -#define ARC_PV_H0 81 -#define ARC_PV_T0 82 - -#endif diff --git a/applications/SprPoP/gen/shadow_arc.h b/applications/SprPoP/gen/shadow_arc.h deleted file mode 100644 index 09a719a..0000000 --- a/applications/SprPoP/gen/shadow_arc.h +++ /dev/null @@ -1,41 +0,0 @@ -/* shadow_arc.h — индексы в архиве SHADOW. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef SHADOW_ARC_H -#define SHADOW_ARC_H - -#define ARC_SHADOW_COUNT 32 - -#define ARC_SHADOW_SK0 0 -#define ARC_SHADOW_SK1 1 -#define ARC_SHADOW_SK2 2 -#define ARC_SHADOW_SK3 3 -#define ARC_SHADOW_SK4 4 -#define ARC_SHADOW_SK5 5 -#define ARC_SHADOW_SK6 6 -#define ARC_SHADOW_SK7 7 -#define ARC_SHADOW_SK8 8 -#define ARC_SHADOW_SK9 9 -#define ARC_SHADOW_SK10 10 -#define ARC_SHADOW_SK11 11 -#define ARC_SHADOW_SK12 12 -#define ARC_SHADOW_SK13 13 -#define ARC_SHADOW_SK14 14 -#define ARC_SHADOW_SK15 15 -#define ARC_SHADOW_SK16 16 -#define ARC_SHADOW_SK17 17 -#define ARC_SHADOW_SK18 18 -#define ARC_SHADOW_SK19 19 -#define ARC_SHADOW_SK20 20 -#define ARC_SHADOW_SK21 21 -#define ARC_SHADOW_SK22 22 -#define ARC_SHADOW_SK23 23 -#define ARC_SHADOW_SK24 24 -#define ARC_SHADOW_SK25 25 -#define ARC_SHADOW_SK26 26 -#define ARC_SHADOW_SK27 27 -#define ARC_SHADOW_SF0 28 -#define ARC_SHADOW_SF1 29 -#define ARC_SHADOW_SF2 30 -#define ARC_SHADOW_SF3 31 - -#endif diff --git a/applications/SprPoP/gen/skel_arc.h b/applications/SprPoP/gen/skel_arc.h deleted file mode 100644 index eca2b21..0000000 --- a/applications/SprPoP/gen/skel_arc.h +++ /dev/null @@ -1,13 +0,0 @@ -/* skel_arc.h — индексы в архиве SKEL. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef SKEL_ARC_H -#define SKEL_ARC_H - -#define ARC_SKEL_COUNT 4 - -#define ARC_SKEL_G0 0 -#define ARC_SKEL_G1 1 -#define ARC_SKEL_G2 2 -#define ARC_SKEL_G3 3 - -#endif diff --git a/applications/SprPoP/gen/title_arc.h b/applications/SprPoP/gen/title_arc.h deleted file mode 100644 index e02e7f2..0000000 --- a/applications/SprPoP/gen/title_arc.h +++ /dev/null @@ -1,29 +0,0 @@ -/* title_arc.h — индексы в архиве TITLE. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef TITLE_ARC_H -#define TITLE_ARC_H - -#define ARC_TITLE_COUNT 20 - -#define ARC_TITLE_T0_0 0 -#define ARC_TITLE_T0_1 1 -#define ARC_TITLE_T0_2 2 -#define ARC_TITLE_T0_3 3 -#define ARC_TITLE_T0_4 4 -#define ARC_TITLE_T1_0 5 -#define ARC_TITLE_T1_1 6 -#define ARC_TITLE_T1_2 7 -#define ARC_TITLE_T1_3 8 -#define ARC_TITLE_T1_4 9 -#define ARC_TITLE_T2_0 10 -#define ARC_TITLE_T2_1 11 -#define ARC_TITLE_T2_2 12 -#define ARC_TITLE_T2_3 13 -#define ARC_TITLE_T2_4 14 -#define ARC_TITLE_T3_0 15 -#define ARC_TITLE_T3_1 16 -#define ARC_TITLE_T3_2 17 -#define ARC_TITLE_T3_3 18 -#define ARC_TITLE_T3_4 19 - -#endif diff --git a/applications/SprPoP/gen/vizier_arc.h b/applications/SprPoP/gen/vizier_arc.h deleted file mode 100644 index 8f30b67..0000000 --- a/applications/SprPoP/gen/vizier_arc.h +++ /dev/null @@ -1,14 +0,0 @@ -/* vizier_arc.h — индексы в архиве VIZIER. СГЕНЕРИРОВАН - * (toolchain/pop_pack_arc.py), руками не править. */ -#ifndef VIZIER_ARC_H -#define VIZIER_ARC_H - -#define ARC_VIZIER_COUNT 5 - -#define ARC_VIZIER_G0 0 -#define ARC_VIZIER_G1 1 -#define ARC_VIZIER_G2 2 -#define ARC_VIZIER_G3 3 -#define ARC_VIZIER_G4 4 - -#endif diff --git a/applications/SprPoP/src/_pop_bg.h b/applications/SprPoP/src/_pop_bg.h deleted file mode 100644 index 5ff9578..0000000 --- a/applications/SprPoP/src/_pop_bg.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * _pop_bg.h — ВНУТРЕННИЙ контракт между двумя половинами слоя фона. - * Публичный API слоя — pop_bg.h; общие листья (резидент) — pop_tile.h. - * - * Слой фона разрезан на два банка: - * pop_bg.c (банк 2) — ГОРЯЧАЯ половина: fore-проход поверх персонажей, - * оверлеи, клип. Работает каждый кадр. - * pop_room.c (банк 7) — ХОЛОДНАЯ: полная отрисовка комнаты (draw_tile), - * точечные перерисовки тайлов, падающие плиты, - * загрузка атласов. Раз на комнату/событие. - * - * Резать пришлось потому, что банк 2 упирался в 16 КБ страницы (90.4 % до - * разгрузки), а чомперам и остальным ловушкам уровня 3 место нужно. Граница - * проведена по частоте вызова: холодная половина платит трамплин (~654 такта) - * за каждый вызов сюда, и на входе в комнату таких вызовов ~40 — 26 000 - * тактов, шестая часть кадрового бюджета РАЗОВО. Для горячего пути цена - * нулевая: он зовёт свои функции прямо, а общие листья — из резидента. - * - * Что осталось в банке 2 и вынесено сюда обёртками: кладка стены - * (wall_pattern — её зовёт и fore-проход каждый кадр) и решётка ворот - * соседней комнаты (draw_gate_back — её зовёт шовная окклюзия). Обратных - * зависимостей (горячая половина → холодная) нет вовсе. - */ -#ifndef _POP_BG_H -#define _POP_BG_H - -#include - -/* Состояние дрожащих плит — живёт в pop_map, читают обе половины. */ -extern uint8_t pop_loose_modif[30]; -extern uint8_t pop_ceil_modif[10]; /* плита-потолок: loose ряда 2 комнаты сверху */ - -/* Видимая высота полосы кладки у потолка (room-space y 0..7): её печёт - * холодная половина, а поверх персонажа кладёт горячая. */ -#define CEIL_BAND_H 8 - -/* Тайл ОБЪЕКТА активного персонажа (set_objtile_at_char, seg006:1833) — в - * момент обработки этого тайла спрайт попадает в midtable. Задаёт горячая - * половина (pop_fore_over_char), читают other_overlay_tile (там же) и - * порядок «плита vs Kid» в mob_tick_one (холодная). Писучие данные банка - * лежат в _DATA/W2 и видны из любого банка — см. sdcc_banked_call_rules. */ -extern int8_t pop_bg_obj_col, pop_bg_obj_row; - -/* ---- Точки входа ГОРЯЧЕЙ половины для холодной (через трамплин) ------- */ -void pop_wall_pattern_b(int row, int col, int which_part) __banked; -void pop_wall_pattern_reset_b(void) __banked; -void pop_gate_back_b(uint8_t modl, int xh, int dby, int dmy) __banked; - -#endif - -/* ---- Слоты «первая запечка была на странице N» ----------------------- * - * bake_copy (pop_room.c) копирует готовый прямоугольник со второй страницы - * дабл-буфера вместо повторного пересчёта. Это верно ТОЛЬКО пока содержимое - * тайла между двумя кадрами не изменилось. У анимированных тайлов (кнопка с - * идущим таймером связи, ворота) пометка ОБНОВЛЯЕТСЯ каждый кадр, и картинка - * при этом другая — такой тайл обязан пересчитываться честно. - * - * Поэтому pop_set_redraw / pop_set_redraw_above гасят слот на ПЕРЕпометке - * (пометка пришла, когда счётчик ещё не отработал). Объявления БЕЗ __banked: - * pop_redraw.c и pop_room.c живут в одном банке, и трамплин тут не нужен. */ -void pop_bake_slot_reset(uint8_t tilepos); -void pop_bake_slot_reset_above(uint8_t col); - diff --git a/applications/SprPoP/src/_pop_config.h b/applications/SprPoP/src/_pop_config.h deleted file mode 100644 index cbd7e74..0000000 --- a/applications/SprPoP/src/_pop_config.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * _pop_config.h — внутренний бинарный контракт POP.CFG. - * - * Владелец формата ровно один — pop_config.c (банк 9). Внешний игровой - * код видит только pop_settings.h и публичные pop_cfg_load/save. Формат - * допускает добавление полей в конец payload той же версии: декодер знает - * первые девять байтов, но контрольную сумму считает по ВСЕМУ payload. - */ -#ifndef _POP_CONFIG_H -#define _POP_CONFIG_H - -#include - -#define POP_CFG_VERSION 1 -#define POP_CFG_HEADER_SIZE 7 -/* Ранний MS0-файл имел семь полей. Его продолжаем принимать: отсутствующие - * поля берут исторический дефолт (лимит времени ON, отладочная полоса ON, - * музыка ON), а новая запись содержит все десять. */ -#define POP_CFG_LEGACY_PAYLOAD_SIZE 7 -#define POP_CFG_TIMELIMIT_PAYLOAD_SIZE 8 -#define POP_CFG_DEBUGBAR_PAYLOAD_SIZE 9 -#define POP_CFG_PAYLOAD_SIZE 10 -#define POP_CFG_TAIL_SIZE 2 -/* CFG остаётся маленьким. Верхняя граница не даёт ручному мусору занять - * стек W2, но оставляет запас для будущих полей версии 1. */ -#define POP_CFG_MAX_PAYLOAD 64 -#define POP_CFG_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + \ - POP_CFG_TAIL_SIZE) -#define POP_CFG_MIN_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE + \ - POP_CFG_TAIL_SIZE) -#define POP_CFG_MAX_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_MAX_PAYLOAD + \ - POP_CFG_TAIL_SIZE) - -/* Чистое ядро формата: доступно host-тесту без DSS/EMM. encode пишет - * текущий v1 размер, decode принимает прежние семи-/восьмибайтные и более - * длинный v1 payload, игнорируя неизвестный хвост. */ -void pop_cfg_encode(uint8_t *buf); -uint8_t pop_cfg_decode(const uint8_t *buf, uint16_t size); - -#endif diff --git a/applications/SprPoP/src/_pop_draw.h b/applications/SprPoP/src/_pop_draw.h deleted file mode 100644 index 1cbe465..0000000 --- a/applications/SprPoP/src/_pop_draw.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * _pop_draw.h — внутренний заголовок слоя отрисовки: выбор ядра libbgi - * (клипающее / линейное «noclip») по одному и тому же тесту для блита и - * для heal. - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ ФАЙЛ, А НЕ pop_bg.h. Обе функции — `static inline`, а - * SDCC 4.5 оставляет тело такой функции в КАЖДОМ TU, который видит - * объявление, даже если тот её не зовёт (memory - * `sdcc_inline_codegen_findings`). pop_bg.h включают почти все модули PoP, - * то есть из общего заголовка эти ~100 Б размножились бы десятком мёртвых - * копий (замер CLIP-1, 2026-08-01: +1091 Б в _CODE и +636 Б в банке - * стража — за код, который там никто не вызывает). Здесь их видят ровно - * три файла, которые реально рисуют: pop_bg.c, pop_kid.c, pop_cdraw.c. - */ -#ifndef POP_DRAW_H -#define POP_DRAW_H - -#include -#include - -/* Спрайт целиком на экране И укладывается в 8-битные параметры noclip- - * примитивов libbgi? Условие входа в gfx_blit_cols_part_noclip: клипающий - * вариант платит ~5.6 К тактов подготовки на КАЖДЫЙ вызов, независимо от - * того, вылезает край или нет. */ -static inline uint8_t pop_onscreen_cols(int x, int y, uint16_t w, uint16_t h) -{ - return (uint8_t)(x >= 0 && y >= 0 && w < 256 && h < 256 && - x + (int)w <= 320 && y + (int)h <= 256); -} - -/* Стереть прямоугольник (heal из ОЗУ-копии) тем же приёмом, что и блит: - * целиком на экране → линейное ядро без клипа. Условие входа у - * gfx_heal_noclip ровно то же, что у gfx_blit_cols_part_noclip, поэтому - * тест один — общее ядро gfx_heal платит за клип и 16-бит, а не за пиксели - * (замер: 11 658 тактов на heal 22×22). - * - * НЕ inline (тело — pop_draw.c, резидент W1): SDCC 4.5 встраивал бы его в - * каждое место вызова по 181 Б И оставлял мёртвую копию в каждом TU — см. - * шапку pop_draw.c с замером. Зовётся 5 раз за кадр, цена вызова тонет в - * стоимости самого heal. - * - * w/h тут int, а не uint16_t: вызывающие считают их вычитанием (h − skip), и - * отрицательный результат обязан быть no-op, а не превратиться в огромный - * unsigned. */ -void pop_heal_fast(int x, int y, int w, int h); - -#endif diff --git a/applications/SprPoP/src/_pop_file.h b/applications/SprPoP/src/_pop_file.h deleted file mode 100644 index 6c6485e..0000000 --- a/applications/SprPoP/src/_pop_file.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * _pop_file.h — внутренний файловый слой SprPoP для старых версий DSS. - * - * DSS до исправления относительных путей оставляет рабочий каталог внутри - * последнего подкаталога. POP_PATH_CALL восстанавливает абсолютный каталог - * приложения до и после операции. Это макрос намеренно: код исполняется в - * банке вызывающего, где доступен переданный указатель, и не расходует W1. - */ -#ifndef _POP_FILE_H -#define _POP_FILE_H - -#include -#include - -/* BANK10: получить каталог EXE через APPINFO B=1 и сделать его текущим. */ -int8_t pop_path_init(void) __banked; -int8_t pop_chdir_home(void) __banked; - -/* expression вычисляется только после успешного chdir. errno файловой - * операции сохраняется через завершающее восстановление каталога. */ -#define POP_PATH_CALL(result, expression) do { \ - if (pop_chdir_home() != 0) { \ - (result) = -1; \ - } else { \ - int _pop_path_errno; \ - (result) = (expression); \ - _pop_path_errno = errno; \ - (void)pop_chdir_home(); \ - errno = _pop_path_errno; \ - } \ -} while (0) - -#endif diff --git a/applications/SprPoP/src/_pop_kdraw.h b/applications/SprPoP/src/_pop_kdraw.h deleted file mode 100644 index f3988d2..0000000 --- a/applications/SprPoP/src/_pop_kdraw.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * _pop_kdraw.h — ВНУТРЕННИЙ контракт слоя персонажей: pop_cdraw.c (банк 4) - * ↔ pop_kdraw.c (тот же банк 4). - * - * ВАЖНО: объявления здесь НЕ помечены __banked, то есть вызовы идут прямым - * `call` — это корректно РОВНО ПОКА оба модуля лежат в ОДНОЙ странице: - * - * --bank 4=pop_cdraw.c --bank 4=pop_kdraw.c - * - * Линкер этого НЕ проверяет: если один из них переедет в другой банк, - * сборка пройдёт молча, а на устройстве получится прыжок в чужую страницу. - * Меняешь раскладку банков в Makefile — проверь эту пару. - * - * Публичные (из резидента/других банков) входы того же модуля объявлены с - * __banked в pop_kid.h — там pop_sword_load. - */ -#ifndef _POP_KDRAW_H -#define _POP_KDRAW_H - -#include -#include "pop_char.h" -#include "pop_kid.h" - -/* Клинок в руке персонажа (add_sword_to_objtable). Возврат 1 — нарисован, - * и в (*rx,*ry,*rw,*rh) лежит его прямоугольник для heal. Страницу W0 - * оставляет замапленной: размаппит вызывающий. */ -uint8_t pop_sword_draw(const pop_char_t *ch, const kframe *fr, - int obj_x, int obj_y, - int *rx, int *ry, uint16_t *rw, uint16_t *rh); - -/* Спрайт из атласов Кида по его id (полоса HP: деления 216/217). */ -void pop_kid_img_blit(uint8_t image, int x, int y); - -#endif /* _POP_KDRAW_H */ diff --git a/applications/SprPoP/src/_pop_kid.h b/applications/SprPoP/src/_pop_kid.h deleted file mode 100644 index ceb017e..0000000 --- a/applications/SprPoP/src/_pop_kid.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * _pop_kid.h — ВНУТРЕННИЙ контракт движка Kid: pop_kid.c (резидент W1, - * интерпретатор seqtbl) ↔ pop_kboot.c (банк 8, загрузка ресурсов). - * - * Загрузка атласов Кида и страницы анимации отрабатывает РАЗ ЗА ИГРУ, и - * держать её в дефицитном W1 незачем; интерпретатор же зовут из четырёх - * банков каждый тик — он остался в резиденте. Общее между ними — только - * дескриптор страницы данных: он объявлен здесь и определён в pop_kid.c - * (данные банковых модулей всё равно линкуются в общий _DATA). - */ -#ifndef _POP_KID_H -#define _POP_KID_H - -#include - -/* Смещение данных в странице анимации; ниже 0x100 — ISR-стаб W0. */ -#define KD_DATA_OFF 0x100u - -extern uint8_t kdat_blk; /* EMM-блок страницы kid.ani */ -extern uint8_t kdat_page; /* её номер (маппится в W0 на время play_seq) */ -extern uint8_t kdat_ok; /* данные загружены */ - -/* Файловый обмен с W3 делает общий резидентный bank_load_file(), поэтому - * оркестратор загрузки kid.ani целиком живёт в холодном банке 8. */ - -#endif /* _POP_KID_H */ diff --git a/applications/SprPoP/src/_pop_level.h b/applications/SprPoP/src/_pop_level.h deleted file mode 100644 index 8bfabae..0000000 --- a/applications/SprPoP/src/_pop_level.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * _pop_level.h — ВНУТРЕННИЙ контракт между двумя половинами уровня: - * - * pop_level.c — ГОРЯЧАЯ (резидент W1): чтение тайлов/связей/дверных - * таблиц, живое состояние стражей. Её зовут все банки - * и кадровый путь главного цикла, местами на каждый тайл. - * pop_level_cold.c — ХОЛОДНАЯ (банк 8): чтение файла уровня, разбор комнаты, - * рестарт, потабличные различия уровней. Всё это - * отрабатывает раз на уровень или раз на комнату, и - * держать ~1.9 КБ в дефицитном W1 незачем. - * - * Общее состояние (страница уровня, копии дверных таблиц, живые стражи) - * живёт в ГОРЯЧЕЙ половине и объявлено здесь: данные банковых модулей - * линкуются в общий _DATA (--bank-data мы не включаем), поэтому обе - * половины видят их как обычные глобалы — в банк уехал только КОД. - * - * Заголовок НЕ публичный: снаружи уровень виден только через pop_level.h. - */ -#ifndef _POP_LEVEL_H -#define _POP_LEVEL_H - -#include - -/* Раскладка страницы уровня (Table 6 POP-DAT); подробности — в pop_level.c. */ -#define LVL_DATA_OFF 0x100u /* данные с 0x100; 0x00..0xFF — ISR-стаб */ -#define LVL_PRISTINE_OFF 0x1000u /* эталон foretable для рестарта уровня */ - -#define BP_FG 0u -#define BP_BG 720u -#define BP_LINKLOC 1440u -#define BP_LINKMAP 1696u -#define BP_LINKS 1952u -#define BP_GTILE 2119u -#define BP_GDIR 2143u -#define BP_GX 2167u -#define BP_GSEQLO 2191u -#define BP_GSKILL 2215u -#define BP_GSEQHI 2239u -#define BP_GCOLOR 2263u -#define BP_START 2112u -#define ROOM_TILES 30u -#define MIN_SIZE (BP_START + 3u) - -/* Живое состояние стражей: 6 байт на комнату (порт level.guards_*). */ -#define GS_TILE 0 -#define GS_DIR 1 -#define GS_X 2 -#define GS_SKILL 3 -#define GS_SEQL 4 -#define GS_SEQH 5 - -/* ---- общее состояние (определено в pop_level.c) ---------------------- */ -extern uint8_t pop_lvl_blk; /* EMM-блок страницы уровня */ -extern uint8_t pop_lvl_page; /* её номер (маппится в W0/W3) */ -extern uint8_t pop_lvl_ok; /* уровень загружен */ -extern uint8_t pop_dl1[256]; /* LINKLOC как в файле */ -extern uint8_t pop_dl2[256]; /* LINKMAP, МУТАБЕЛЬНА (таймеры кнопок) */ -extern uint8_t pop_gstate[24 * 6]; - -/* Указатели на тайлы комнаты r (1..24) в W0-пространстве — страницу мапит - * вызывающий. static-инлайн в обеих половинах: две команды сложения, звать - * их через границу банка было бы дороже самого вычисления. */ -static const uint8_t *room_fg_ptr(uint8_t r) -{ - return (const uint8_t *)(LVL_DATA_OFF + BP_FG) + (uint16_t)(r - 1) * ROOM_TILES; -} -static const uint8_t *room_bg_ptr(uint8_t r) -{ - return (const uint8_t *)(LVL_DATA_OFF + BP_BG) + (uint16_t)(r - 1) * ROOM_TILES; -} - -/* ПРАВИЛО ОКНА W3. Банковый модуль исполняется ИЗ W3 и сам менять окно - * не может. Файлы в EMM читает резидентный bank_load_file(), после его - * возврата холодный код продолжает подготовку страницы через W0. */ - -/* Живая копия стражей из данных уровня (загрузка/рестарт) — в холодной. */ -void pop_gstate_init(void) __banked; - -#endif /* _POP_LEVEL_H */ diff --git a/applications/SprPoP/src/_pop_sfx.h b/applications/SprPoP/src/_pop_sfx.h deleted file mode 100644 index e514f33..0000000 --- a/applications/SprPoP/src/_pop_sfx.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * _pop_sfx.h — внутренний контракт между половинами звука (НЕ публичный, - * публичный — pop_sfx.h). Горячая половина живёт в резиденте - * (pop_sfx.c), холодная в банке (pop_sfx_cold.c); делят они массив - * физических страниц и насос. - */ -#ifndef _POP_SFX_INTERNAL_H -#define _POP_SFX_INTERNAL_H - -#include -#include "pop_snd_tbl.h" /* тип записи и инварианты (НЕ генерируется) */ - -/* РАСКЛАДКА НАБОРА и его страницы — общие данные обеих половин, живут в - * pop_snd_data.c. Значения приезжают с диска (SND/snd.idx): холодная - * половина их читает и проверяет, горячая только пользуется. */ -extern pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT]; -extern uint8_t pop_snd_page[POP_SND_MAX_PAGES]; -/* Сколько страниц у загруженного набора; 0 — набор не поднят. */ -extern uint8_t pop_snd_pages; -/* 1 — набор поднят и CBL открыт; 0 — играем молча. */ -extern uint8_t pop_snd_ok; - -/* Насос: отдать n байт в CBL. Резидентный — его адрес отдаётся в - * cbl_open() холодной половиной. */ -int pop_sfx_fill(uint16_t n); - -#endif diff --git a/applications/SprPoP/src/_pop_tile.h b/applications/SprPoP/src/_pop_tile.h deleted file mode 100644 index 2069088..0000000 --- a/applications/SprPoP/src/_pop_tile.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * _pop_tile.h — внутренний контракт между половинами общих листьев слоя - * фона (НЕ публичный, публичный — pop_tile.h). Горячая половина живёт в - * резиденте (pop_tile.c), холодная — в банке 5 (pop_tile_cold.c); - * критерий разреза и замеры — в шапке pop_tile_cold.c. - */ -#ifndef _POP_TILE_INTERNAL_H -#define _POP_TILE_INTERNAL_H - -#include - -/* Клипованный путь блита — статик горячей половины, ставший общим: его - * зовёт pop_mem_b из холодной. Переносить его следом НЕЛЬЗЯ (его основной - * вызывающий pop_blit_b делает 184 вызова на кадр редрава), а вызов - * банк -> резидент и так прямой: W1/W2 замаплены всегда. */ -void blit_b_clip(const uint8_t *img, int x, int top, uint8_t w, uint8_t h); - -#endif diff --git a/applications/SprPoP/src/guards.c b/applications/SprPoP/src/guards.c deleted file mode 100644 index 59e4ef1..0000000 --- a/applications/SprPoP/src/guards.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* - * guards.c — ЛОГИКА стража, собирается в БАНК (--bank 1=guards.c, окно W3). - * - * Правила банка (проверено пробником tests/w3bankgfx): - * - состояние держим в W1/W2 (pop_guard.c): статики банка линкуются в - * страницу банка и снаружи не читаются; - * - звать можно W1/W2-код (pop_map, pop_kid, pop_geom, libc, примитивы - * libbgi) — скобка _bgi_begin/_bgi_end возвращает страницу БАНКА; - * - звать НЕЛЬЗЯ резидент W3 (pop_bg) — ни напрямую, ни транзитивно: - * пока исполняется банк, резидентной страницы в адресном пространстве - * нет. Поэтому фон/окклюзию за стража рисует главный цикл. - * - * Порт: seg003 check_can_guard_see_kid, seg002 autocontrol_*, seg000 - * play_guard_frame, seg006 char_opp_dist. ДИСПЕТЧЕР у соперника не свой: - * ИИ выставляет те же глобалы control_* (pop_ctrl.h), что и ввод игрока, а - * дальше работает общий pop_control(). - */ -#include "pop_guard.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_kid.h" -#include "pop_ctrl.h" -#include "pop_map.h" -#include "pop_geom.h" -#include "pop_trob.h" -#include "pop_level.h" /* pop_current_level — спецсобытие уровня 3 */ -#include "pop_state.h" /* pop_immortal, pop_droppedout */ -#include "pop_tile.h" /* POP_TILE_DIV — таблица колонок (tile_div_tbl) */ -#include "pop_tune.h" /* POP_DBG_SHADOW_NOWAIT — отладка сцены тени */ - -#define TILE_MIDX 7 /* середина тайла в координатах персонажа */ -#define SCREENSPACE_X 58 /* = pop_x_bump[FIRST_ONSCREEN_COLUMN] */ - -#define TILE_FLOOR 1 -#define TILE_SPIKE 2 -#define TILE_GATE 4 -#define TILE_DOORTOP_FLOOR 7 -#define TILE_LOOSE 11 -#define TILE_DOORTOP 12 -#define TILE_CHOMPER 18 -#define TILE_WALL 20 - -/* actions (types.h:334) — нужны ветке «идти ли за упавшим Кидом». */ -#define ACT_HANGCLIMB 2 -#define ACT_HANGSTRAIGHT 6 - -/* tile_is_floor (seg004): не-пол — пустота, ковёр, верх двери, стена и - * «половинки» 26..29. Дубликат крошечного switch'а из pop_map: тянуть его - * через границу банка дороже, чем повторить. */ -/* Темы, которые звучат ОДИН раз за заход на уровень: тень шестого уровня - * (seg002:0090) и вступление первого. Оригинал отмечает «уже играли» - * через leveldoor_open = 0x4D, то есть портит переменную двери; у нас на - * это есть свои байты, а сбрасывает их старт уровня. */ -static uint8_t shadow6_music; - -void pop_music_level_start(void) __banked -{ - shadow6_music = 0; - pop_ctrl_level_start(); -} - -static uint8_t tile_is_floor(uint8_t t) -{ - switch (t) { - case 0: case 9: case 12: case 20: - case 26: case 27: case 28: case 29: - return 0; - default: - return 1; - } -} - -/* get_tile_at_kid (seg003:761) СНЯТ вместе с переходом луча на колонки: - * единственным его вызывающим был этот луч, а он больше не работает с - * X-координатами (разбор — в теле pop_check_can_guard_see_kid ниже). - * Таблица POP_TILE_DIV осталась в резиденте, ею пользуется физика. */ - -/* Буфер тайлов луча — file-scope, а не локальный массив: локальный уезжает - * в стековый кадр, и каждое чтение из него стоит `-n(ix)` (19 тактов - * номинала, ~46 с wait-state'ами). Тот же приём, что у draw_tile и - * pop_blit_b. Размер — колонки −1..10 плюс запас. */ -static uint8_t row_t[12]; - -/* check_can_guard_see_kid (seg003:688) — луч видимости по ряду. - * Результат в can_guard_see_kid: 0 не видит / 1 видит, но не пойдёт / - * 2 видит и пойдёт. */ -void pop_check_can_guard_see_kid(void) __banked -{ - uint8_t kid_frame = Kid.frame; - uint8_t tile; - - /* МЫШЬ Кида «не видит» (seg003:0965): иначе он выхватит меч на зверька, - * пробегающего мимо. */ - if (Guard.charid == CHARID_24_MOUSE) { can_guard_see_kid = 0; return; } - - /* Первый множитель — порт seg003:702. ТЕНЬ боевая только на 12-м - * уровне; на 4/5/6 она Кида «не видит», и это не косметика: увидев её, - * Кид достаёт меч (control_standing, seg005:352), а сама тень идёт той - * же веткой control_standing — встаёт в боевую стойку и с кадра 150 - * рисуется спрайтами СТРАЖА. Пустой слот (charid 0) — наша добавка: - * оригинал гасит его через direction = dir_56_none. */ - if (!(Guard.charid != 0 && - (Guard.charid != CHARID_1_SHADOW || - pop_current_level == SHADOW_FIGHT_LEVEL) && - /* кадры 219..228 — подъём по лестнице: там страж Кида не видит */ - kid_frame != 0 && (kid_frame < 219 || kid_frame >= 229) && - Guard.direction != DIR_56_NONE && - Kid.alive < 0 && Guard.alive < 0 && - Kid.room == Guard.room && Kid.curr_row == Guard.curr_row)) { - can_guard_see_kid = 0; - return; - } - - can_guard_see_kid = 2; - /* ПО КОЛОНКАМ, а не по X-координатам. - * - * Оригинал (и SDLPoP, seg003:688) идёт по x с шагом TILE_SIZEX и на - * каждом шаге переводит x в колонку — потому что x у него уже под рукой. - * Но начальные x — это РОВНО центры тайлов персонажей - * (x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX), а перевод обратно - * даёт ту же колонку: floor((58 + col*14 - 58) / 14) == col. Значит - * весь проход эквивалентен обходу колонок, и ни одна x-координата тут не - * нужна: уходят 16-битный шаг, 16-битное сравнение и индексация таблицы - * POP_TILE_DIV на каждой итерации. - * - * Тайлы отрезка забираем ОДНИМ банковым вызовом. Раньше на каждую - * колонку шёл свой pop_tile_at (__banked, банк 1 -> банк 3): на сцене - * 11/15 это девять трамплинов и 36 786 тактов на весь луч (замер - * 2026-08-19). */ - { - int8_t lcol = Kid.curr_col, rcol = Guard.curr_col, col, lcol0; - - if (lcol > rcol) { int8_t t = lcol; lcol = rcol; rcol = t; } - lcol0 = lcol; /* БАЗА индексации буфера — фиксируем - * ДО сдвигов ниже: row_t[0] это - * тайл lcol0, и сдвиг lcol/rcol на - * чомпере и воротах её менять не - * должен. */ - pop_row_tiles(Kid.curr_row, lcol, rcol, row_t); - - /* Чомпер стоит у ЛЕВОГО края тайла — свой тайл он не перекрывает. */ - if (row_t[0] == TILE_CHOMPER) lcol++; - /* Ворота — у ПРАВОГО края, поэтому крайний правый тайл не считается. */ - if (row_t[rcol - lcol0] == TILE_GATE) rcol--; - - for (col = lcol; col <= rcol; col++) { - tile = row_t[col - lcol0]; - /* Сквозь это не видно вовсе. */ - if (tile == TILE_WALL || tile == TILE_DOORTOP_FLOOR || tile == TILE_DOORTOP) { - can_guard_see_kid = 0; - return; - } - /* Видно, но страж не пойдёт: провалится / попадёт под чомпер / - * упрётся в неоткрытые ворота / шагнёт в дыру. */ - if (tile == TILE_LOOSE || tile == TILE_CHOMPER || !tile_is_floor(tile)) { - can_guard_see_kid = 1; - } else if (tile == TILE_GATE && - pop_gate_modif(col, Kid.curr_row) < 112) { - can_guard_see_kid = 1; /* ворота подняты не до конца */ - } - } - } -} - - -/* ---- Скелет: спецсобытие подъёма (check_skel, seg002:1042) ---------- * - * На уровне 3 стражей в данных НЕТ ВООБЩЕ (guards_tile пуст во всех 24 - * комнатах) — единственный противник поднимается сам: когда Кид в комнате 1 - * доходит до колонки 2 или 3 при открытой двери уровня, тайл 21 (скелет) - * стирается в пол, а на его месте встаёт персонаж слота Guard с уже вынутым - * мечом. Отсюда и место здесь, рядом с ИИ, а не в enter_guard. */ -#define SKEL_LEVEL 3 -#define SKEL_ROOM 1 -#define SKEL_COL 5 -#define SKEL_ROW 1 -#define SKEL_TRIG_COL1 2 -#define SKEL_TRIG_COL2 3 -#define SKEL_SKILL 2 -#define SKEL_HP 3 -#define TILE_SKELETON 21 - -void pop_check_skel(void) __banked -{ - if (pop_current_level != SKEL_LEVEL) return; - if (Guard.charid != 0) return; /* слот занят (dir_56_none) */ - if (Kid.room != SKEL_ROOM) return; - if (!pop_leveldoor_open) return; - if (Kid.curr_col != SKEL_TRIG_COL1 && Kid.curr_col != SKEL_TRIG_COL2) return; - if (pop_tile_at(SKEL_COL, SKEL_ROW) != TILE_SKELETON) return; - - pop_skel_wake_tile((uint8_t)(SKEL_ROW * 10 + SKEL_COL)); - - /* Поднимаем В ОКНЕ Char — как оригинал (он же и saveshad'ит). */ - pop_loadshad(); - Char.room = Kid.room; - Char.curr_row = SKEL_ROW; - Char.y = (uint8_t)pop_y_land[SKEL_ROW + 1]; - Char.curr_col = SKEL_COL; - Char.x = (uint8_t)(pop_x_bump[SKEL_COL + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Char.direction = -1; /* dir_FF_left */ - Char.alive = -1; - Char.sword = SWORD_2_DRAWN; - Char.charid = CHARID_4_SKELETON; - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(SEQ_88_SKEL_WAKE_UP); - pop_sfx_play(44); /* seg002:106D — скелет оживает */ - play_seq(); - pop_saveshad(); - - guard_skill = SKEL_SKILL; - guardhp_max = guardhp_curr = SKEL_HP; - guardhp_delta = 0; - is_guard_notice = guard_refrac = 0; -} - -/* ---- Мышь: спецсобытие уровня 8 (do_timers seg003:0545 + do_mouse) --- * - * - * Кнопка (0,7) комнаты 16 открывает решётку (0,3), но с левой площадки - * верхнего ряда до кнопки не дойти — между ними провал в три колонки. - * Поэтому, когда дверь уровня уже открыта, а Кид всё ещё в комнате 16, - * оригинал через POP_MOUSE_DELAY кадров присылает мышь: она пробегает - * справа налево, наступает на кнопку (кнопку жмёт ОБЩИЙ check_press из - * физики соперника, как и любой персонаж) и убегает обратно. - * - * Счётчик — сам pop_leveldoor_open, как в оригинале: он растёт ТОЛЬКО пока - * Кид в комнате 16, поэтому «12,5 секунды» отсчитываются с момента, когда - * игрок туда вернулся, а не с открытия двери. Ради этого он и word - * (см. pop_state.c). - * - * Слот соперника занимаем БЕЗ проверки «свободен ли» — так в оригинале, и - * на уровне 8 конфликта нет: в данных комнаты 16 стража нет - * (guards_tile[15] = 30 = «пусто»). */ -#define SEQ_105_MOUSE_FORWARD 105 -#define SEQ_107_MOUSE_STAND_UP_GO 107 - -void pop_check_mouse(void) __banked -{ - if (pop_current_level != POP_MOUSE_LEVEL) return; - if (Kid.room != POP_MOUSE_ROOM) return; - if (!pop_leveldoor_open) return; - if (++pop_leveldoor_open != POP_MOUSE_DELAY) return; - - /* do_mouse (seg003:0ABA) поднимает мышь В ОКНЕ Char, начиная с КИДА - * (loadkid): поля, которых нет в списке ниже — frame/action/room/ - * fall_x/fall_y — наследуются от него. Комната как раз оттуда и - * берётся, отдельного присваивания в оригинале нет. */ - pop_loadkid(); - Char.charid = CHARID_24_MOUSE; - Char.x = POP_MOUSE_START_X; - Char.curr_row = 0; - Char.y = (uint8_t)pop_y_land[1]; - Char.alive = -1; - Char.direction = -1; /* dir_FF_left */ - guardhp_curr = 1; - pop_char_set_seq(SEQ_105_MOUSE_FORWARD); - play_seq(); - pop_saveshad(); -} - -/* ---- Тень: спецсобытие входа в комнату (check_shadow, seg002:0064) -- * - * - * На «шадоу»-уровнях слот соперника занимает ТЕНЬ, и занимает его ВМЕСТО - * стража: оригинал вызывает check_shadow при смене комнаты и уходит в - * return, не доходя до enter_guard. Важно, что на уровне 5 в комнате 24 - * страж в данных ЕСТЬ (`guards_tile[23] = 8`) — если позвать enter_guard, - * он поднимется там, где его быть не должно. Поэтому вызывающий обязан - * звать pop_check_shadow ВМЕСТО pop_guard_enter и уважать её ответ. - * - * do_init_shad (seg002:0000): первые 7 полей персонажа берутся из таблицы - * init_shad_N, остальные наследуются от того, что уже лежит в окне Char. У - * оригинала там КИД (check_shadow идёт сразу после loadkid(), seg000:1312), - * поэтому наследование сделано явным — alive/sword берём у Кида, а не у - * прошлого обитателя слота. Поднимаем в окне Char и saveshad'им, как - * pop_check_skel и как сам do_init_shad. */ -/* Состояние проигрывателя автодвижений (seg002: demo_time/demo_index) — - * объявлено здесь, потому что do_init_shad его сбрасывает, а движок - * do_auto_moves живёт ниже, рядом с остальным ИИ. */ -static uint8_t demo_time; /* кадров с начала записи (0xFE = стоп) */ -static uint8_t demo_index; /* текущая запись */ - -void pop_guard_ai_qsave(pop_qs_io_t *io) __banked -{ - pop_qs_u8(io, &demo_time); - pop_qs_u8(io, &demo_index); -} - -#define SHADOW_SKILL 3 -#define SHADOW_HP 4 -#define SEQ_2_STAND 2 -#define SEQ_7_FALL 7 -#define TILE_POTION 10 -#define TILE_SWORD 22 - -/* Таблицы init_shad_N (data:0EEA/0EF2) — ПЕРВЫЕ СЕМЬ полей Char в том же - * порядке, в каком их копирует оригинал (`memcpy(&Char, source, 7)`): - * frame, x, y, direction, curr_col, curr_row, action. - * 5: x 55, y 55, вправо, колонка −1 (ещё за левым краем экрана), ряд 0; - * 6: x 81, y 118, вправо, колонка 0, ряд 1 — тень стоит на границе - * (1,0)-(1,1), одного осторожного шага хватает, чтобы встать на плиту; - * 12: x 81, y 232, вправо, колонка 0, ряд 0 — и это НЕ ошибка данных: 232 - * лежит НИЖЕ поля (192), поле y беззнаковое, и тень с seq_7 «падает» - * из-под комнаты, переполняя байт, то есть влетает в кадр сверху. - * Ряд при этом берётся ИЗ ТАБЛИЦЫ (0), а не пересчитывается из y - * (иначе был бы −1): семь полей копируются как есть, и «поправить» - * их согласованность нельзя (см. ../docs/levels_12_15_plan.md §7.5). */ -static const uint8_t init_shad_5[7] = { 0x0F, 0x37, 0x37, 0, 0xFF, 0, 0 }; -static const uint8_t init_shad_6[7] = { 0x0F, 0x51, 0x76, 0, 0x00, 1, 0 }; -static const uint8_t init_shad_12[7] = { 0x0F, 0x51, 0xE8, 0, 0x00, 0, 0 }; - -/* seq — поза, с которой тень входит в сцену: 5/6 встают в стойку, 12 падает. */ -static void do_init_shad(const uint8_t *tbl, uint8_t room, uint8_t seq) -{ - pop_loadshad(); - Char.frame = tbl[0]; - Char.x = tbl[1]; - Char.y = tbl[2]; - Char.direction = (int8_t)tbl[3]; - Char.curr_col = (int8_t)tbl[4]; - Char.curr_row = (int8_t)tbl[5]; - Char.action = tbl[6]; - Char.room = room; - Char.charid = CHARID_1_SHADOW; - Char.alive = Kid.alive; /* наследование от Кида, см. шапку */ - Char.sword = Kid.sword; - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(seq); - pop_saveshad(); - - demo_time = 0; - demo_index = 0; - guard_skill = SHADOW_SKILL; - guardhp_delta = 0; - guardhp_curr = guardhp_max = SHADOW_HP; - is_guard_notice = guard_refrac = 0; -} - -uint8_t pop_check_shadow(uint8_t room) __banked -{ - /* Уровень 12 (seg002:0070) — встреча с тенью в комнате 15. Три отличия - * от 5/6, и все три существенные: - * — событие одноразовое: после слияния (pop_united_shadow != 0) тень - * больше не поднимается ни при каком входе в комнату; - * — условие на тайл ОБРАТНОЕ уровню 5: там тень поднимается, ПОКА - * зелье на месте, здесь — только когда меча (15,1,0) уже НЕТ, то - * есть Кид его подобрал. Меч на месте — return 0, и это не «ничего - * не делать»: стража в комнате 15 в данных нет, так что вызывающий - * спокойно идёт в pop_guard_enter и убирает слот; - * — поза входа не стойка, а ПАДЕНИЕ (seq 7). - * pop_shadow_init сбрасываем здесь же: тень начинает «ждать Кида» - * заново при каждом подъёме (см. autocontrol_shadow_level12). */ - if (pop_current_level == SHADOW_FIGHT_LEVEL) { - if (pop_united_shadow || room != SHADOW_FIGHT_ROOM) return 0; - if (pop_level_tile(room, SHADOW_SWORD_TILEPOS) == TILE_SWORD) return 0; - pop_shadow_init = 0; - do_init_shad(init_shad_12, room, SEQ_7_FALL); - return 1; - } - /* Уровень 6 (seg002:0090): условий на содержимое комнаты нет вовсе — - * тень встаёт при КАЖДОМ входе в комнату 1. Оригинал играет здесь - * sound_25_presentation, помечая «уже играли» через leveldoor_open = - * 0x4D (переменную двери он использует как флаг). Чужую переменную не - * трогаем: у нас для этого свой однобайтовый флаг. */ - if (pop_current_level == SHADOW_STEP_LEVEL) { - if (room != SHADOW_STEP_ROOM) return 0; - if (!shadow6_music) { - shadow6_music = 1; - pop_sfx_play(25); - } - do_init_shad(init_shad_6, room, SEQ_2_STAND); - return 1; - } - if (pop_current_level != SHADOW_STEAL_LEVEL) return 0; - if (room != SHADOW_STEAL_ROOM) return 0; - /* Зелья уже нет — тень своё дело сделала. Возвращаем 1 и здесь: стража - * комнаты 24 оригинал не поднимает НИКОГДА (return до enter_guard). */ - if (pop_level_tile(room, SHADOW_POTION_TILEPOS) != TILE_POTION) return 1; - do_init_shad(init_shad_5, room, SEQ_2_STAND); - return 1; -} - -/* sword_disappears (seg002:0536) — спецсобытие уровня 12: меч, лежащий в - * комнате 15, пропадает с карты, как только Кид ушёл ВПРАВО из комнаты 18. - * Смысл событийный: дальше по уровню возврата за мечом уже нет, и сцена с - * тенью обязана быть однозначной — либо Кид пришёл к ней вооружённым, либо - * нет. Модификатор гасим вместе с тайлом (как SDLPoP): ненулевой modif на - * полу рисует «фальшивые» узоры. - * - * Звать при уходе ВПРАВО, ДО смены комнаты, — там же, где level3_set_chkp - * (оригинал держит оба в leave_room). */ -void pop_sword_disappears(void) __banked -{ - uint8_t *m; - if (pop_current_level != SHADOW_FIGHT_LEVEL) return; - if (Kid.room != SWORD_GONE_ROOM) return; - pop_level_set_tile(SHADOW_FIGHT_ROOM, SHADOW_SWORD_TILEPOS, TILE_FLOOR); - m = pop_trob_modif(SHADOW_FIGHT_ROOM); - if (m) m[SHADOW_SWORD_TILEPOS] = 0; -} - -/* meet_Jaffar (seg002:0544) — спецсобытие уровня 13: Кид уходит ВПРАВО из - * комнаты 3 и попадает прямо к Джафару. Всё событие — фора: пока - * pop_guard_notice_timer идёт, Джафар не встаёт в боевую стойку - * (autocontrol_guard_inactive), то есть у Кида есть ~2 секунды достать меч. - * - * `pop_leveldoor_open == 0` в условии не косметика: вернувшись к Джафару - * после его смерти (дверь уже открыта), форы быть не должно. - * - * Звать при уходе ВПРАВО, ДО смены комнаты, — рядом с pop_sword_disappears - * (оригинал держит оба в одной ветке leave_room). */ -void pop_meet_jaffar(void) __banked -{ - if (pop_current_level != JAFFAR_LEVEL) return; - if (pop_leveldoor_open != 0) return; - if (Kid.room != JAFFAR_MEET_ROOM) return; - pop_sfx_play(29); /* тема встречи с Джафаром */ - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; -} - -/* Jaffar_exit (seg002:0517) — парная половина победы: смерть Джафара сама - * дверь НЕ открывает, она лишь ставит pop_leveldoor_open = 2. Дверь - * открывает КНОПКА комнаты 24 (tilepos 0 — настоящий opener, проверено по - * res2013.bin), «нажимаемая» в момент ухода Кида ВЛЕВО. - * - * Звать при уходе ВЛЕВО, ДО смены комнаты, — рядом с чекпойнтом уровня 3. */ -void pop_jaffar_exit(void) __banked -{ - uint8_t *m; - if (pop_leveldoor_open != 2) return; - m = pop_trob_modif(JAFFAR_EXIT_ROOM); - pop_trigger_button(JAFFAR_EXIT_ROOM, JAFFAR_EXIT_TILEPOS, - pop_level_tile(JAFFAR_EXIT_ROOM, JAFFAR_EXIT_TILEPOS), - m ? m[JAFFAR_EXIT_TILEPOS] : 0, - 0 /* seg002:520 — playsound=0 */); -} - -/* on_guard_killed (seg006:1927) — соперник только что потерял последнее HP. - * Уровень 13 — единственный, где у этого есть последствия помимо звука: - * белая вспышка и pop_leveldoor_open = 2, то есть «выход разрешён» (сама - * дверь откроется кнопкой из pop_jaffar_exit). - * - * Ветку `is_show_time = 1` не портируем: это показ ОСТАВШЕГОСЯ ВРЕМЕНИ, а - * часов на 60 минут у нас пока нет вовсе — появятся вместе с таймером игры. - * Демо-уровень (0) сюда тоже не входит: его ветка — часть аттракта. */ -static void on_guard_killed(void) -{ - /* Демо-уровень (0) у оригинала уходит в свою ветку — «беги из комнаты», - * без единого звука (seg006:1929). Заставочная демка озвучена только - * эффектами, музыки в ней нет вовсе. */ - if (pop_current_level == 0) return; - if (pop_current_level != JAFFAR_LEVEL) { - /* seg006:1940 — победный трек за стража; за тень его нет: она не - * «убита», а слилась с Кидом. */ - if (Char.charid != CHARID_1_SHADOW) pop_sfx_play(37); - return; - } - pop_sfx_play(43); /* смерть Джафара — свой трек */ - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = JAFFAR_FLASH_TIME; - pop_leveldoor_open = 2; -} - -/* check_killed_shadow (seg006:2033) — «убил тень = убил себя». На уровне 12 - * Кид и тень связаны насмерть: как только один из них перестал быть живым - * (alive >= 0), второму отсчитывается 100 урона, то есть гарантированная - * смерть, и обоих накрывает белая вспышка. - * - * Условие оригинала `(Char.charid | Opp.charid) == charid_1_shadow` читается - * так: в паре ровно Кид (0) и тень (1) — со стражем или скелетом связи нет. - * Оригинал зовёт это ДВАЖДЫ за кадр (из тика Кида и из тика соперника, с - * уже переставленными окнами); нам хватает одного вызова на кадр с явным - * разбором обеих сторон — окна Char/Opp здесь не нужны, кроме как для - * маршрутизации урона внутри pop_take_hp. */ -void pop_check_killed_shadow(void) __banked -{ - if (pop_current_level != SHADOW_FIGHT_LEVEL) return; - if ((uint8_t)(Kid.charid | Guard.charid) != CHARID_1_SHADOW) return; - if (Kid.alive < 0 && Guard.alive >= 0) { - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 5; - pop_loadkid(); - pop_take_hp(100); - } else if (Guard.alive < 0 && Kid.alive >= 0) { - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 5; - pop_loadshad(); - pop_take_hp(100); - } -} - -/* ---- Синтетический ввод (seg002:0706..) --------------------------- */ -static void move_0_nothing(void) -{ - control_shift = control_y = control_x = control_shift2 = 0; - control_down = control_up = control_backward = control_forward = 0; -} -static void move_1_forward(void) -{ - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; -} -static void move_2_backward(void) -{ - control_backward = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_BACKWARD; -} -static void move_3_up(void) -{ - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; -} -static void move_4_down(void) -{ - control_down = POP_CONTROL_HELD; - control_y = POP_CONTROL_HELD_DOWN; -} -static void move_6_shift(void) -{ - control_shift = POP_CONTROL_HELD; - control_shift2 = POP_CONTROL_HELD; -} -/* move_7 (seg002:0770): ОТПУСТИТЬ shift — отдельный ход, потому что - * move_0_nothing сбрасывает всё, а здесь нужно снять только его. */ -static void move_7(void) -{ - control_shift = POP_CONTROL_RELEASED; -} -static void move_down_back(void) -{ - control_down = POP_CONTROL_HELD; - move_2_backward(); -} -static void move_down_forw(void) -{ - control_down = POP_CONTROL_HELD; - move_1_forward(); -} - -/* autocontrol_guard_inactive (seg002:710): страж с убранным мечом. - * Пока Кид за спиной — страж не реагирует; исключение — «шум» Кида - * (is_guard_notice), от которого страж оборачивается. */ -static void autocontrol_guard_inactive(void) -{ - int16_t distance; - if (Kid.alive >= 0) return; - distance = pop_char_opp_dist(); - /* В оригинале условие записано как (word)distance < (word)-8 — - * беззнаковое сравнение, истинное для ВСЕГО, кроме диапазона −8..−1. - * То есть: Кид не «вплотную за спиной». */ - if (Opp.curr_row != Char.curr_row || distance >= 0 || distance < -8) { - if (is_guard_notice) { - is_guard_notice = 0; - if (distance < 0) { - if (distance < -4) move_4_down(); /* обернуться на шум */ - return; - } - } else if (distance < 0) { - return; - } - } - if (can_guard_see_kid) { - /* Увидел — переходит в боевую стойку (вниз+вперёд = достать меч). - * Уровень 13: пока идёт фора после встречи (pop_meet_jaffar), Джафар - * стоит и ждёт — это его единственное отличие от прочих стражей. */ - if (pop_current_level != JAFFAR_LEVEL || pop_guard_notice_timer == 0) - move_down_forw(); - } -} - -/* ---- Активный страж (меч обнажён), seg002:737.. -------------------- * - * Таблицы вероятностей по 12 градациям мастерства (seg002:26..38). Бросок - * — prandom(255) с СОБСТВЕННЫМ сидом: у нас последовательности разведены - * по доменам (кладка / анимация тайлов / бой), см. pop_geom.h. */ -static const uint8_t STRIKEPROB[NUM_GUARD_SKILLS] = { 61,100, 61, 61, 61, 40,100,220, 0, 48, 32, 48}; -static const uint8_t RESTRIKEPROB[NUM_GUARD_SKILLS] = { 0, 0, 0, 5, 5,175, 16, 8, 0,255,255,150}; -static const uint8_t BLOCKPROB[NUM_GUARD_SKILLS] = { 0,150,150,200,200,255,200,250, 0,255,255,255}; -static const uint8_t IMPBLOCKPROB[NUM_GUARD_SKILLS] = { 0, 61, 61,100,100,145,100,250, 0,145,255,175}; -static const uint8_t ADVPROB[NUM_GUARD_SKILLS] = {255,200,200,200,255,255,200, 0, 0,255,100,100}; - -/* Бросок «сработало ли»: в оригинале prob > prandom(255). */ -static uint8_t roll(uint8_t prob) -{ - return (uint8_t)(prob > (uint8_t)pop_prandom(&pop_fight_seed, 255)); -} - -/* guard_advance (seg002:0AF5): наступать. Мастерство 0 наступает всегда, - * остальные — только пока Кид не замахнулся. */ -static void guard_advance(void) -{ - if (guard_skill == 0 || kid_sword_strike == 0) { - if (roll(ADVPROB[guard_skill])) move_1_forward(); - } -} - -/* guard_block (seg002:0B1D): блокировать замах Кида. Если Кид только что - * пробил блок (justblocked) — своя, «импровизационная» вероятность. */ -static void guard_block(void) -{ - uint8_t of = Opp.frame; - if (of == FRAME_152_STRIKE_2 || of == FRAME_153_STRIKE_3 || - of == FRAME_162_BLOCK_TO_STRIKE) { - if (roll(justblocked ? IMPBLOCKPROB[guard_skill] - : BLOCKPROB[guard_skill])) - move_3_up(); - } -} - -/* guard_strike (seg002:0B73): бить. По замаху Кида не бьём (кадры 169/151); - * из своего парирования — по отдельной вероятности «добить». */ -static void guard_strike(void) -{ - uint8_t of = Opp.frame, cf = Char.frame; - if (of == FRAME_169_BEGIN_BLOCK || of == FRAME_151_STRIKE_1) return; - if (cf == FRAME_161_PARRY || cf == FRAME_150_PARRY) { - if (roll(RESTRIKEPROB[guard_skill])) move_6_shift(); - } else { - if (roll(STRIKEPROB[guard_skill])) move_6_shift(); - } -} - -/* autocontrol_guard_kid_armed (seg002:0AC1): Кид с мечом. Вплотную и - * далеко — наступаем; в «рабочей» дистанции 10..28 сначала пробуем блок, и - * только отдышавшись бьём. */ -static void autocontrol_guard_kid_armed(int16_t distance) -{ - if (distance < 10 || distance >= 29) { - guard_advance(); - } else { - guard_block(); - if (guard_refrac == 0) { - if (distance < 12 || distance >= 29) guard_advance(); - else guard_strike(); - } - } -} - -/* autocontrol_guard_kid_in_sight (seg002:0A93). */ -static void autocontrol_guard_kid_in_sight(int16_t distance) -{ - if (Opp.sword == SWORD_2_DRAWN) { - autocontrol_guard_kid_armed(distance); - } else if (guard_refrac == 0) { - /* Кид безоружен: подойти и рубить. */ - if (distance < 29) move_6_shift(); - else move_1_forward(); - } -} - -/* Тайл перед стражем / через один (порт get_tile_infrontof_char и - * get_tile_infrontof2_char, seg004) — но для Char, а не для Kid. */ -static uint8_t tile_infront(int8_t step) -{ - int8_t d = (int8_t)(Char.direction < 0 ? -step : step); - return pop_tile_at((int8_t)(Char.curr_col + d), Char.curr_row); -} - -/* autocontrol_guard_kid_far (seg002:09CB): идём, если впереди есть пол хотя - * бы через тайл; иначе пятимся (не шагать в пропасть). */ -static void autocontrol_guard_kid_far(void) -{ - if (tile_is_floor(tile_infront(1)) || tile_is_floor(tile_infront(2))) - move_1_forward(); - else - move_2_backward(); -} - -/* guard_follows_kid_down (seg002:09F8): Кида спихнули с уступа (droppedout), - * страж его больше не видит — идти ли следом вниз? Условия оригинала, все - * «не идти»: впереди стена; ИЛИ впереди не пол и при этом внизу пика, - * loose-плита, стена или пустота; ИЛИ Кид не ровно на ряд ниже. - * - * Тайлы читаются через pop_tile_at — это банк 1 → банк 3, то есть трамплин. - * Здесь это не жаль: ветка срабатывает только в кадре, когда Кид сорвался - * из боя, а не каждый кадр (её гейтят can_guard_see_kid == 0 и droppedout). - * - * Не идём — сбросить droppedout и попятиться; идём — шаг вперёд, дальше - * персонажа уводит вниз обычная физика (та же, что у Кида). */ -static void guard_follows_kid_down(void) -{ - uint8_t below, front; - if (Opp.action == ACT_HANGCLIMB || Opp.action == ACT_HANGSTRAIGHT) return; - front = tile_infront(1); - below = pop_tile_at((int8_t)(Char.curr_col + (Char.direction < 0 ? -1 : 1)), - (int8_t)(Char.curr_row + 1)); - if (front == TILE_WALL || - (!tile_is_floor(front) && - (below == TILE_SPIKE || below == TILE_LOOSE || below == TILE_WALL || - !tile_is_floor(below) || Char.curr_row + 1 != Opp.curr_row))) { - pop_droppedout = 0; - move_2_backward(); - } else { - move_1_forward(); - } -} - -/* autocontrol_guard_active (seg002:737). */ -static void autocontrol_guard_active(void) -{ - uint8_t cf = Char.frame; - uint8_t of; - int16_t distance; - - /* Кадр 166 (неактивная стойка) и всё, что ниже 150, — не боевые позы. */ - if (cf == FRAME_166_STAND_INACTIVE || cf < 150 || can_guard_see_kid == 1) - return; - - if (can_guard_see_kid == 0) { - /* seg002:740: Кид пропал из виду. Если его СПИХНУЛИ (droppedout) — - * решаем, идти ли за ним вниз; иначе просто отступаем. Скелет не - * отступает никогда (у него нет этой ветки в оригинале). */ - if (pop_droppedout) guard_follows_kid_down(); - else if (Char.charid != CHARID_4_SKELETON) move_down_back(); - return; - } - - /* can_guard_see_kid == 2 */ - of = Opp.frame; - distance = pop_char_opp_dist(); - /* Кид падает/приземляется в отскоке — не мешаем ему, ждём. */ - if (distance >= 12 && of >= 102 && of < 118 && Opp.action == 5) - return; - - if (distance < 35) { - if ((Char.sword < SWORD_2_DRAWN && distance < 8) || distance < 12) { - /* Слишком близко: если смотрим в одну сторону — развернуться. */ - if (Char.direction == Opp.direction) move_2_backward(); - else move_1_forward(); - } else { - autocontrol_guard_kid_in_sight(distance); - } - return; - } - - if (guard_refrac != 0) return; - if (Char.direction != Opp.direction) { - /* Кид разбежался — встречаем ударом, а не шагом. */ - if (of >= 7 && of < 15) { /* бег */ - if (distance < 40) move_6_shift(); - return; - } else if (of >= 34 && of < 44) { /* разбег в прыжок */ - if (distance < 50) move_6_shift(); - return; - } - } - autocontrol_guard_kid_far(); -} - -/* clear_char (seg006:1945): персонажа со сцены — направление «никуда», - * не жив, действие 0, HP обнулены. Полосу перерисует pop_hp_draw сам. */ -static void clear_char(void) -{ - Char.direction = DIR_56_NONE; - Char.alive = 0; - Char.action = 0; - guardhp_curr = 0; -} - -/* autocontrol_shadow_level4 (seg002:1131). Вся «логика» тени на уровне 4: - * в комнате зеркала она бежит вперёд (то есть ВЛЕВО — её направление - * зеркально Киду) и при x < 80 исчезает. Ни боя, ни преследования: она - * просто убегает за левый край и растворяется. */ -static void autocontrol_shadow_level4(void) -{ - if (Char.room != MIRROR_ROOM) return; - if (Char.x < 80) clear_char(); - else move_1_forward(); -} - -/* ---- Автодвижения: «демо-запись» вместо ИИ (seg002:1089) ----------- * - * - * Тень уровня 5 не принимает решений — она проигрывает ЗАПИСЬ нажатий: - * пара {time, move}, где time — момент по счётчику кадров demo_time, а - * move — номер синтетического хода (те же move_*, что заполняет - * autocontrol_*). Оригинал использует этот же движок для демо-режима - * заставки, поэтому имена сохранены. - * - * Тонкость выбора записи, которую легко «упростить» и сломать: когда время - * текущей записи ДОСТИГНУТО, индекс сдвигается вперёд, но ход берётся всё - * равно из ТЕКУЩЕЙ (ещё не сдвинутой) записи; пока не достигнуто — из - * ПРЕДЫДУЩЕЙ. То есть запись задаёт «с какого кадра действует её ход». */ -typedef struct { uint8_t time; int8_t move; } auto_move_t; - -/* shad_drink_move (data.h:866): подойти, взять зелье, выпить, уйти. */ -static const auto_move_t shad_drink_move[8] = { - {0x00, 0}, {0x01, 1}, {0x0E, 0}, {0x12, 6}, - {0x1D, 7}, {0x2D, 2}, {0x31, 1}, {0xFF, -2} -}; - -static void do_auto_moves(const auto_move_t *moves) -{ - uint8_t idx; - int8_t mv; - - if (demo_time >= 0xFE) return; - ++demo_time; - idx = demo_index; - if (moves[idx].time <= demo_time) ++demo_index; - else idx = (uint8_t)(demo_index - 1); - - mv = moves[idx].move; - switch (mv) { - case 0: move_0_nothing(); break; - case 1: move_1_forward(); break; - case 2: move_2_backward(); break; - case 3: move_3_up(); break; - case 4: move_4_down(); break; - case 5: move_3_up(); move_1_forward(); break; - case 6: move_6_shift(); break; - case 7: move_7(); break; - default: break; /* −1 «ничего», −2 «конец» */ - } -} - -/* autocontrol_shadow_level5 (seg002:1157). Тень стоит, пока не откроются - * ворота комнаты (openness >= 80), и только тогда запускает запись ходов: - * идёт к зелью, выпивает и уходит за левый край, где растворяется. - * - * Почему проверка ворот — именно через модификатор, а не через «дверь - * открыта»: `pop_leveldoor_open` тут ни при чём, речь о ВОРОТАХ (тайл 4) в - * колонке 1 верхнего ряда, и оригинал читает их openness напрямую. */ -static void autocontrol_shadow_level5(void) -{ - if (Char.room != SHADOW_STEAL_ROOM) return; - if (demo_time == 0) { -#if !POP_DBG_SHADOW_NOWAIT - uint8_t *m = pop_trob_modif(SHADOW_STEAL_ROOM); - if (m[SHADOW_DOOR_TILEPOS] < SHADOW_DOOR_OPEN_MIN) return; -#endif - demo_index = 0; - } - do_auto_moves(shad_drink_move); - if (Char.x < 15) clear_char(); -} - -/* autocontrol_shadow_level6 (seg002:1064). Вся логика — один осторожный шаг - * (Shift + вперёд) в тот кадр, когда Кид прыгает к решётке: тень встаёт на - * closer (1,1) и роняет решётку (1,2), за порожек которой Кид в этот момент - * цепляется. Условие смотрит на КИДА: кадр 43 — четвёртый кадр бег-прыжка, - * x < 128 отсекает прыжки в правой половине комнаты (там Кид ещё разбегается - * и до решётки ему далеко). */ -#define FRAME_43_RUNJUMP 43 - -static void autocontrol_shadow_level6(void) -{ - if (Char.room != SHADOW_STEP_ROOM) return; - if (Kid.frame != FRAME_43_RUNJUMP) return; - if (Kid.x >= 128) return; - move_6_shift(); - move_1_forward(); -} - -/* autocontrol_shadow_level12 (seg002:1184) — единственная тень, с которой - * можно и драться, и слиться. Четыре режима подряд, порядок важен. - * - * 1. «Ждать Кида» (Char.room 15, pop_shadow_init == 0). Пока Кид не дошёл - * до x >= 150, тень КАЖДЫЙ КАДР роняется заново — то есть висит в первом - * кадре падения у потолка. Дошёл — флаг поднят, падение пущено. Смысл: - * Кид обязан УВИДЕТЬ, как она сваливается сверху, а не застать готовую. - * 2. У тени вынут меч → обычный боевой ИИ стража. Исключение: если Кид - * намеренно убрал клинок (offguard) и тень ещё не отдышалась после - * попадания (guard_refrac) — она тоже убирает меч (move_4_down). - * 3. У тени меч в ножнах, но Кид ПРИ мече (или не убирал его намеренно): - * близко и видно (< 90) — выхватить клинок из стойки (кадр 15); далеко - * или не видно — стоять, а если Кид зашёл за спину, попятиться. - * 4. Оба без мечей — СЛИЯНИЕ: сойтись ближе 10 и объединиться. - * - * xdiff инициализируется заведомо большим числом (как в SDLPoP): при - * can_guard_see_kid < 2 расстояние не считается вовсе, и ветка «попятиться» - * не должна срабатывать на мусоре. */ -#define FRAME_15_STAND 15 -#define FRAME_3_START_RUN 3 -#define FRAME_127_STEPPING_7 127 -#define FRAME_133_AFTER_STEP 133 -#define SHADOW_WAIT_KID_X 150 -#define SHADOW_SWORD_DIST 90 - -static void autocontrol_shadow_level12(void) -{ - int16_t distance; - - if (Char.room == SHADOW_FIGHT_ROOM && pop_shadow_init == 0) { - if (Opp.x >= SHADOW_WAIT_KID_X) { - do_init_shad(init_shad_12, Char.room, SEQ_7_FALL); - return; - } - pop_shadow_init = 1; - } - if (Char.sword >= SWORD_2_DRAWN) { - if (offguard == 0 || guard_refrac == 0) autocontrol_guard_active(); - else move_4_down(); - return; - } - if (Opp.sword >= SWORD_2_DRAWN || offguard == 0) { - distance = 0x7000; - if (can_guard_see_kid < 2 || - (distance = pop_char_opp_dist()) >= SHADOW_SWORD_DIST) { - if (distance < 0) move_2_backward(); - return; - } - if (Char.frame == FRAME_15_STAND) move_down_forw(); - return; - } - if (pop_char_opp_dist() < SHADOW_UNITE_DIST) { - /* Слияние. Кид ПЕРЕЕЗЖАЕТ на место тени: оригинал переписывает - * charid активного персонажа (а это тень) в Кида и savekid'ит его - * целиком — с позицией, кадром и последовательностью тени. Отсюда - * и «дёрганый» шаг в оригинале: Кид оказывается там, где стояла - * тень. Слот соперника после этого гасится clear_char. */ - pop_flash_color = POP_FLASH_WHITE; - pop_flash_time = 18; - pop_add_life(); /* +1 к потолку HP */ - pop_united_shadow = SHADOW_UNITE_TIME; - Char.charid = CHARID_0_KID; - pop_savekid(); - clear_char(); - return; - } - if (can_guard_see_kid == 2) { - /* Кид бежит к тени — тень бежит навстречу (кадры бега 3..14 и - * шага 127..132). */ - uint8_t of = Opp.frame; - if ((of >= FRAME_3_START_RUN && of < FRAME_15_STAND) || - (of >= FRAME_127_STEPPING_7 && of < FRAME_133_AFTER_STEP)) - move_1_forward(); - } -} - -/* autocontrol_mouse (seg002:07EB). Весь «ИИ» мыши — два порога по X: - * добежала влево до POP_MOUSE_TURN_X → seq_107 (встать, поднять голову, - * развернуться и уйти), вернулась вправо до POP_MOUSE_LEAVE_X → исчезнуть. - * - * Почему проверка на исчезновение висит на action == 0 (стойка), хотя мышь - * при этом БЕЖИТ: seq_107 заканчивается прыжком на метку `Mscurry1`, которая - * стоит ПОСЛЕ опкода act(actions_1_run_jump) в seq_105 — то есть на обратном - * пути кадры бега проигрываются, а action остаётся стоечным. Именно этим - * оригинал и различает «бежит туда» и «бежит обратно». */ -static void autocontrol_mouse(void) -{ - if (Char.direction == DIR_56_NONE) return; - if (Char.action == 0) { - if (Char.x >= POP_MOUSE_LEAVE_X) clear_char(); - } else if (Char.x < POP_MOUSE_TURN_X) { - pop_char_set_seq(SEQ_107_MOUSE_STAND_UP_GO); - play_seq(); - } -} - -/* autocontrol_shadow (seg002:081D) — по уровням. */ -static void autocontrol_shadow(void) -{ - if (pop_current_level == MIRROR_LEVEL) autocontrol_shadow_level4(); - if (pop_current_level == SHADOW_STEAL_LEVEL) autocontrol_shadow_level5(); - if (pop_current_level == SHADOW_STEP_LEVEL) autocontrol_shadow_level6(); - if (pop_current_level == SHADOW_FIGHT_LEVEL) autocontrol_shadow_level12(); -} - -/* autocontrol_guard (seg002:701) + autocontrol_opponent (seg002:628). */ -static void autocontrol_opponent(void) -{ - move_0_nothing(); - /* В оригинале эти таймеры убывают только в ветке НЕ-Кида. Demo Kid - * использует тот же AI, но skill 10 и таймеры стража не расходует. */ - if (Char.charid != CHARID_0_KID) { - if (justblocked) --justblocked; - if (kid_sword_strike) --kid_sword_strike; - if (guard_refrac) --guard_refrac; - } - /* autocontrol_skeleton (seg002:685): у скелета меч вынут ВСЕГДА — он не - * бывает «неактивным», поэтому ветка inactive ему недоступна. */ - if (Char.charid == CHARID_4_SKELETON) Char.sword = SWORD_2_DRAWN; - /* МЫШЬ — своей веткой (seg002:0643), первой в цепочке charid'ов. */ - if (Char.charid == CHARID_24_MOUSE) { autocontrol_mouse(); return; } - /* ТЕНЬ идёт своей веткой ЦЕЛИКОМ (seg002:0647): к стражьему ИИ она не - * сводится — на уровне 4 не дерётся вовсе. */ - if (Char.charid == CHARID_1_SHADOW) { autocontrol_shadow(); return; } - if (Char.sword < SWORD_2_DRAWN) autocontrol_guard_inactive(); - else autocontrol_guard_active(); -} - -/* do_demo() (seg006:0D49): пока меч не вынут, управление даёт demo_moves; - * в бою Кид становится AI-персонажем skill 10, а страж затем получает - * skill 11. Команды AI уже actor-relative, поэтому pop_control вызывается - * напрямую — без user_control(), как и исправленная таблица demo_moves. */ -uint8_t pop_demo_kid_ai(void) __banked -{ - if (Kid.sword != SWORD_2_DRAWN) return 0; - - pop_loadkid_and_opp(); - pop_load_fram_det_col(); - guard_skill = 10; - autocontrol_opponent(); - guard_skill = 11; - pop_control(); - pop_savekid_state(); - return 1; -} - -/* ---- Урон мечом (seg002:0CD4..0E1F) -------------------------------- */ -#define ACTION_99_HURT 99 -#define ACTION_1_RUN 1 -#define FRAME_154_POKING 154 -#define SEQ_69_ATTACK_WAS_PARRIED 69 -#define SEQ_74_HIT_BY_SWORD 74 -#define SEQ_81_PUSHED_OFF_LEDGE 81 /* заколот у обрыва — падает замертво */ -#define SEQ_85_STABBED_TO_DEATH 85 - -/* refractimer (seg002:36) — «отдышка» стража после того, как его ранили. */ -static const uint8_t REFRACTIMER[NUM_GUARD_SKILLS] = - { 16, 16, 16, 16, 8, 8, 8, 8, 0, 8, 0, 0}; - -/* hurt_by_sword (seg002): применить попадание к АКТИВНОМУ персонажу. - * Без меча в руке любое попадание смертельно; с мечом — минус 1 HP и кадр - * «получил удар». - * - * СМЕРТЬ БЕЗОРУЖНОГО БЫВАЕТ ДВУХ ВИДОВ, и выбор между ними делается по - * обстановке ПОЗАДИ (seg002): если сзади есть опора или до кромки меньше - * четырёх — «заколот на месте» (seq_85); если сзади пусто и от кромки - * далеко — «сброшен с уступа» (seq_81), отдельная последовательность, - * которая сама отыгрывает падение замертво. - * - * Вторая ветка появилась 2026-08-31 (docs/sdlpop_audit.md, находка 12): - * раньше её не было, потому что считалось, будто тайловые запросы от Char - * недоступны — на деле они давно работают, не хватало объявлений. - * - * Замечание к сцене: падение первым делом убирает меч (start_fall), так - * что персонаж, сбитый в пропасть во время боя, к следующему удару уже - * безоружен — и попадает сюда же. */ -/* ПРИЖАТЬ К ПОЛУ СВОЕГО РЯДА — только для ПЕРЕЖИВШЕГО удар. - * - * В оригинале (seg002, ветка seq_74_hit_by_sword) эти две строки стоят - * ВНУТРИ ветки выжившего; смертельные ветки координату не трогают. - * - * У нас они долго выполнялись безусловно и работали СТРАХОВКОЙ за - * отсутствующую ветку «сброшен с уступа»: убитого в воздухе прижимали к - * полу, иначе он продолжал падать и выпадал за нижнюю границу, а игра - * уходила на рестарт, не показав тела (проверено на живой машине - * 2026-08-31 — правка в одиночку ломала смерть). - * - * Снято ПОСЛЕ появления ветки seq_81: теперь смерть у обрыва отыгрывает - * своя последовательность, и страховка больше не нужна. Порядок именно - * такой и важен — сперва ветка, потом снятие. */ -static void hurt_stand_on_floor(void) -{ - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; -} - -static void hurt_by_sword(void) -{ - if (Char.alive >= 0) return; - if (Char.sword != SWORD_2_DRAWN) { - /* Удар мимо боевой стойки в оригинале СМЕРТЕЛЕН (seg002: «Being - * hurt when not in fighting pose means death», take_hp(100)), и - * чит бессмертия сюда НЕ распространяется — он работает только в - * бою, то есть с мечом в руке. - * - * Раньше чит перехватывал hurt_by_sword целиком и безусловно ставил - * SEQ_74_HIT_BY_SWORD. Но это анимация «получил удар В БОЕВОЙ - * СТОЙКЕ»: её кадры (150..179) все с мечом, и Кид оказывался в них - * при sword == 0. Диспетчер control() при sword != 2 в - * control_with_sword не идёт, а среди обычных веток кадра 158/170/171 - * нет ни одной — управление зависало намертво: Кид стоял в боевой - * стойке без меча и не разворачивался к сопернику (BUG-CHEAT-IMM-1). - * - * Костыля «снять бессмертие на время вызова» здесь БОЛЬШЕ НЕТ: - * pop_take_hp гасит только урон меньше 100, а тут ровно 100. */ - pop_take_hp(100); - if (pop_tile_behind_char() != 0 || pop_dist_to_edge_weight() < 4) - pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); /* есть опора сзади */ - else - pop_char_set_seq(SEQ_81_PUSHED_OFF_LEDGE); /* сзади обрыв */ - } else if (Char.charid == CHARID_0_KID && pop_immortal) { - /* ЧИТ, уровень 1 и выше: в боевой стойке удары не отнимают HP. - * Кадр «получил удар» оставляем — иначе бой перестаёт читаться, - * да и оригинал на выживший удар ставит ровно его. */ - pop_char_set_seq(SEQ_74_HIT_BY_SWORD); - hurt_stand_on_floor(); - } else if (Char.charid != CHARID_4_SKELETON && pop_take_hp(1)) { - pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); /* HP кончились */ - } else { - pop_char_set_seq(SEQ_74_HIT_BY_SWORD); - hurt_stand_on_floor(); - } - /* seg002:0C1F: у Кида свой звук боли, у соперника свой. */ - pop_sfx_play((uint8_t)(Char.charid == CHARID_0_KID ? 13 : 12)); - play_seq(); -} - -/* check_hurting (seg002:0D56): достал ли АКТИВНЫЙ персонаж соперника. - * Бьют кадры 153/154; если соперник в этот момент парирует — удар отбит. */ -static void check_hurting(void) -{ - int16_t distance; - uint8_t cf, of, min_range; - - if (Char.sword != SWORD_2_DRAWN) return; - if (Char.curr_row != Opp.curr_row) return; - cf = Char.frame; - if (cf != FRAME_153_STRIKE_3 && cf != FRAME_154_POKING) return; - - distance = pop_char_opp_dist(); - of = Opp.frame; - if (distance < 0 || distance >= 29 || - (of != FRAME_161_PARRY && of != FRAME_150_PARRY)) { - /* Соперник НЕ парирует. */ - if (cf == FRAME_154_POKING) { - min_range = (uint8_t)(Opp.sword < SWORD_2_DRAWN ? 8 : 12); - distance = pop_char_opp_dist(); - if (distance >= (int16_t)min_range && distance < 29) - Opp.action = ACTION_99_HURT; - } - } else { - /* Парировано. */ - Opp.frame = FRAME_161_PARRY; - if (Char.charid != CHARID_0_KID) justblocked = 4; - pop_char_set_seq(SEQ_69_ATTACK_WAS_PARRIED); - play_seq(); - } - - /* СВИСТ КЛИНКА МИМО ЦЕЛИ (seg002:1039..1044) — в оригинале он стоит в - * ХВОСТЕ функции, после ОБЕИХ веток, а не внутри ветки «не парировано». - * Мы его туда и переносим; раньше он звучал раньше времени и без двух - * условий оригинала, отчего на подъёме Кида шёл непрерывный взмах - * клинка у безоружного (наблюдение пользователя 2026-09-02, звук - * опознан по snd_curr == 11 в живой сессии). - * - * Три отличия от прежнего кода, все из оригинала: - * - * 1. Ранний выход по dir_56_none — это ИМЕННО анти-зацикливание, автор - * SDLPoP так его и подписал («Fix looping sword moving sound»). - * Направление dir_56_none означает «персонаж выключен» (clear_char), - * и махать клинком ему нечем. - * 2. Условие `Opp.action != ACTION_99_HURT`: попали — играет звук боли, - * а не свист мимо. Поэтому звук обязан идти ПОСЛЕ присвоения выше. - * 3. Кадры перечитываются у персонажей, а не берутся из cf/of: ветка - * парирования только что записала Opp.frame, а play_seq в ней — - * Char.frame, и снимки выше уже устарели. */ - if (Char.direction == DIR_56_NONE) return; - if (Char.frame == FRAME_154_POKING && Opp.frame != FRAME_161_PARRY && - Opp.action != ACTION_99_HURT) - pop_sfx_play(11); -} - -/* check_sword_hurting (seg002:0D1A): прогнать проверку с ОБЕИХ сторон. */ -void pop_check_sword_hurting(void) __banked -{ - uint8_t kf = Kid.frame; - if (kf == 0 || (kf >= 219 && kf < 229)) return; /* подъём по лестнице */ - pop_loadshad_and_opp(); - check_hurting(); - pop_saveshad_and_opp(); - pop_loadkid_and_opp(); - check_hurting(); - pop_savekid_and_opp(); -} - -/* check_sword_hurt (seg002:0CD4): применить помеченные попадания. Если - * ранен страж — Киду в этом кадре урон уже не проходит (в оригинале так же: - * его action сбрасывается ДО проверки). */ -void pop_check_sword_hurt(void) __banked -{ - if (Guard.action == ACTION_99_HURT) { - if (Kid.action == ACTION_99_HURT) Kid.action = ACTION_1_RUN; - pop_loadshad(); - hurt_by_sword(); - pop_saveshad(); - guard_refrac = (int8_t)REFRACTIMER[guard_skill]; - } else if (Kid.action == ACTION_99_HURT) { - pop_loadkid(); - hurt_by_sword(); - pop_savekid(); - } -} - -/* play_guard (seg006): ИИ + общий диспетчер. Отдельная ветка «HP кончились»: - * пока страж жив (alive < 0) и HP есть — обычный ход; как только HP дошли до - * нуля, он переводится в «умирает» (alive = 0), и дальше тот же control() - * ставит ему seq_71_dying. Уже умирающий сюда попадает с alive >= 0 и просто - * доигрывает последовательность. */ -static void play_guard(void) -{ - /* МЫШЬ (seg006:0D85, первая ветка): ей положен ТОЛЬКО автоконтроль. - * Диспетчер control() ей не нужен и вреден — он бы гонял её по - * стоечным веткам управления, а вся её «жизнь» уже описана - * последовательностями seq_105/107. */ - if (Char.charid == CHARID_24_MOUSE) { autocontrol_opponent(); return; } - if (Char.alive < 0 && guardhp_curr == 0) { - Char.alive = 0; - on_guard_killed(); /* уровень 13: вспышка + «выход открыт» */ - } - autocontrol_opponent(); - pop_control(); -} - -/* pop_guard_tick — порт play_guard_frame (seg000:1246) в объёме, который у - * нас уже есть: окно Char/Opp вокруг ИИ, диспетчера и интерпретатора - * последовательностей. Физика стража (fall_accel/коллизия/бамп/пики) — - * отдельным шагом. */ -void pop_guard_tick(void) __banked -{ - /* Гейт play_guard_frame (seg000:1248) — `if (Guard.direction != - * dir_56_none)`. Именно им ОТКЛЮЧАЕТСЯ персонаж: clear_char (seg006) - * не трогает charid, он ставит direction = dir_56_none, и вся логика - * соперника перестаёт вызываться. - * - * Проверять только charid НЕЛЬЗЯ (кусало 2026-08-11 на тени уровня 5): - * тень уходила за левый край, clear_char её «выключал», но тик - * продолжал крутиться — do_auto_moves за концом таблицы отдаёт - * последнюю запись `{0x31, 1}` («вперёд»), и тень разворачивалась, - * вбегала обратно, пробегала верхний ряд и падала в проём. */ - if (Guard.charid == 0 || Guard.direction == DIR_56_NONE) return; - pop_loadshad_and_opp(); /* Char = Guard, Opp = Kid */ - /* Симметрично Киду (play_guard_frame, seg000:1248): cur_frame один на - * всех, и до этой строки в нём лежит кадр КИДА — он тикал раньше. */ - pop_load_fram_det_col(); - play_guard(); - /* Анимация: та же seqtbl, что у Кида, но своя таблица кадров — - * выбирается по Char.charid внутри load_frame (seg006:0293). */ - play_seq(); - pop_saveshad(); -} diff --git a/applications/SprPoP/src/pop_app.c b/applications/SprPoP/src/pop_app.c deleted file mode 100644 index 3dcaf14..0000000 --- a/applications/SprPoP/src/pop_app.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * pop_app.c — таблица переходов оболочки, БАНК 9 (FG1). - * - * Модуль не рисует и не выделяет память. Это чистая политика переходов, - * поэтому её можно проверять host-тестом без DSS/MAME. Жизненный цикл - * ресурсов остаётся у enter/leave соответствующих состояний. - */ -#include "pop_app.h" - -pop_app_state_t pop_app_state; - -void pop_app_reset(void) __banked -{ - pop_app_state = POP_APP_BOOT; -} - -uint8_t pop_app_dispatch(pop_app_event_t event) __banked -{ - pop_app_state_t next = pop_app_state; - uint8_t accepted = 0; - - switch (pop_app_state) { - case POP_APP_BOOT: - if (event == POP_APP_EV_BOOT_READY) { - next = POP_APP_BUILD_INFO; accepted = 1; - } - break; - - case POP_APP_BUILD_INFO: - if (event == POP_APP_EV_BUILD_DONE) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_TITLE: - if (event == POP_APP_EV_INTRO_STARTED) { - next = POP_APP_INTRO; accepted = 1; - } else if (event == POP_APP_EV_DEMO_STARTED) { - next = POP_APP_DEMO; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_INTRO: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_DEMO; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_DEMO: - if (event == POP_APP_EV_DEMO_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } else if (event == POP_APP_EV_NEW_GAME) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_LEVEL_LOAD: - if (event == POP_APP_EV_LEVEL_READY) { - next = POP_APP_PLAYING; accepted = 1; - } - break; - - case POP_APP_PLAYING: - if (event == POP_APP_EV_PAUSE) { - next = POP_APP_PAUSE_MENU; accepted = 1; - } else if (event == POP_APP_EV_CUTSCENE_STARTED) { - next = POP_APP_CUTSCENE; accepted = 1; - } else if (event == POP_APP_EV_LEVEL_FINISHED) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } else if (event == POP_APP_EV_TIME_EXPIRED) { - next = POP_APP_TIME_EXPIRED; accepted = 1; - } else if (event == POP_APP_EV_ENDING_STARTED) { - next = POP_APP_ENDING; accepted = 1; - } else if (event == POP_APP_EV_RESTART_INTRO) { - /* start_game() прямо из геймплея: так оригинал уходит в title, - * когда игрок не нажал кнопку за 288 тиков после смерти - * (seg000:958). Раньше это событие принимал только pause menu. */ - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_PAUSE_MENU: - if (event == POP_APP_EV_RESUME) { - next = POP_APP_PLAYING; accepted = 1; - } else if (event == POP_APP_EV_RESTART_INTRO) { - /* Restart Game начинает заново именно title/intro. Сброс новой - * игры произойдёт позже общим LEVEL_LOAD после skip/attract. */ - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_CUTSCENE: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_LEVEL_LOAD; accepted = 1; - } - break; - - case POP_APP_TIME_EXPIRED: - if (event == POP_APP_EV_CUTSCENE_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_ENDING: - if (event == POP_APP_EV_ENDING_FINISHED) { - /* Таблица рекордов — ХВОСТ end_sequence, а не отдельный экран - * по желанию: она же дослушивает победную тему и гасит экран - * перед возвратом в начало (seg001:5F1). */ - next = POP_APP_HALL_OF_FAME; accepted = 1; - } - break; - - case POP_APP_HALL_OF_FAME: - if (event == POP_APP_EV_HOF_FINISHED) { - next = POP_APP_TITLE; accepted = 1; - } - break; - - case POP_APP_QUIT: - default: - break; - } - - if (event == POP_APP_EV_QUIT && pop_app_state != POP_APP_QUIT) { - next = POP_APP_QUIT; - accepted = 1; - } - if (!accepted) return 0; - pop_app_state = next; - return 1; -} diff --git a/applications/SprPoP/src/pop_app.h b/applications/SprPoP/src/pop_app.h deleted file mode 100644 index 87c3dbb..0000000 --- a/applications/SprPoP/src/pop_app.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * pop_app.h — автомат верхнего уровня Prince of Persia (FG1). - * - * Игровой цикл — лишь состояние PLAYING, а не «вся программа». Каждый - * режим возвращает результат через pop_app_dispatch(), поэтому будущие - * TITLE/demo/cutscene не будут вызывать друг друга рекурсивно и копить - * стек или EMM-ресурсы. - */ -#ifndef POP_APP_H -#define POP_APP_H - -#include - -typedef enum { - POP_APP_BOOT = 0, - POP_APP_BUILD_INFO, - POP_APP_TITLE, - POP_APP_INTRO, - POP_APP_DEMO, - POP_APP_LEVEL_LOAD, - POP_APP_PLAYING, - POP_APP_PAUSE_MENU, - POP_APP_CUTSCENE, - POP_APP_TIME_EXPIRED, - POP_APP_ENDING, - POP_APP_HALL_OF_FAME, - POP_APP_QUIT -} pop_app_state_t; - -/* События не содержат деталей конкретного режима: режим завершился, а - * переход выбирает центральная таблица. Это намеренно делает недопустимый - * переход явным no-op вместо случайного прыжка в код другого экрана. */ -typedef enum { - POP_APP_EV_BOOT_READY = 0, - POP_APP_EV_BUILD_DONE, - POP_APP_EV_INTRO_STARTED, - POP_APP_EV_DEMO_STARTED, - POP_APP_EV_CUTSCENE_STARTED, - POP_APP_EV_NEW_GAME, - POP_APP_EV_PAUSE, - POP_APP_EV_RESUME, - POP_APP_EV_LEVEL_READY, - POP_APP_EV_LEVEL_FINISHED, - POP_APP_EV_DEMO_FINISHED, - POP_APP_EV_CUTSCENE_FINISHED, - POP_APP_EV_TIME_EXPIRED, - POP_APP_EV_ENDING_STARTED, - POP_APP_EV_ENDING_FINISHED, - POP_APP_EV_HOF_FINISHED, - POP_APP_EV_RESTART_INTRO, - POP_APP_EV_QUIT -} pop_app_event_t; - -extern pop_app_state_t pop_app_state; - -/* Начать новый маршрут с BOOT. */ -void pop_app_reset(void) __banked; - -/* Выполнить допустимый переход. Возвращает 1 при успехе, 0 при ошибке - * протокола; в ошибочном случае состояние не меняется. */ -uint8_t pop_app_dispatch(pop_app_event_t event) __banked; - -#endif /* POP_APP_H */ diff --git a/applications/SprPoP/src/pop_arc.c b/applications/SprPoP/src/pop_arc.c deleted file mode 100644 index 1d40f06..0000000 --- a/applications/SprPoP/src/pop_arc.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * pop_arc.c — чтение архива ресурсов PBA1, БАНК 8. - * - * Контракт и мотивация — в pop_arc.h. Здесь всё сводится к трём вызовам - * libc: open один раз на группу, lseek к элементу и bank_read_page прямо в - * EMM-страницу (тот резидентен и потому безопасен из банка huge — он же - * переключает W3, где живёт наш код). - */ -#include -#include -#include -#include -#include -#include "pop_arc.h" -#include "_pop_file.h" - -/* Пути 8.3, как требует DSS. Держим их ЗДЕСЬ: строка обязана лежать в том - * же банке, что и код, который её читает (см. pop_arc.h). */ -static const char *const arc_path[POP_ARC_IDS] = { - "BG\\bg.arc", - "KID\\kid.arc", - "GUARD\\guard.arc", - "SKEL\\skel.arc", - "VIZIER\\vizier.arc", - "SHADOW\\shadow.arc", - "TITLE\\title.arc", - "PV\\pv.arc", - "SND\\snd.arc" -}; - -int8_t pop_arc_open_id(pop_arc_t *a, uint8_t id, - uint8_t *tbl, uint8_t tbl_max) __banked -{ - if (id >= POP_ARC_IDS) return -1; - return pop_arc_open(a, arc_path[id], tbl, tbl_max); -} - -int8_t pop_arc_open(pop_arc_t *a, const char *path, - uint8_t *tbl, uint8_t tbl_max) __banked -{ - uint8_t head[8]; - int fd; - - a->fd = -1; - a->count = 0; - POP_PATH_CALL(fd, open(path, O_RDONLY)); - if (fd < 0) return -1; - if (read(fd, head, sizeof(head)) != (int)sizeof(head) || - memcmp(head, "PBA1", 4) != 0 || - head[4] == 0 || head[4] > tbl_max || head[4] > POP_ARC_MAX) { - close(fd); - return -1; - } - if (read(fd, tbl, (uint16_t)head[4] * POP_ARC_REC) != - (int)((uint16_t)head[4] * POP_ARC_REC)) { - close(fd); - return -1; - } - a->fd = fd; - a->count = head[4]; - return (int8_t)head[4]; -} - -uint16_t pop_arc_size(const uint8_t *tbl, uint8_t idx) -{ - const uint8_t *rec = tbl + (uint16_t)idx * POP_ARC_REC; - return (uint16_t)(rec[2] | ((uint16_t)rec[3] << 8)); -} - -int pop_arc_read(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, uint16_t skip, - uint8_t page, uint16_t off, uint16_t size) __banked -{ - const uint8_t *rec; - uint16_t sec, len; - long pos; - - if (a->fd < 0 || idx >= a->count) return -1; - rec = tbl + (uint16_t)idx * POP_ARC_REC; - sec = (uint16_t)(rec[0] | ((uint16_t)rec[1] << 8)); - len = (uint16_t)(rec[2] | ((uint16_t)rec[3] << 8)); - if (skip >= len) return 0; - len = (uint16_t)(len - skip); - if (size && size < len) len = size; - - /* Сектора в байты — единственное место, где нужна 32-битная величина: - * архив может быть больше 64 КБ, и lseek принимает long. Путь холодный - * (загрузка ресурсов), в кадре этого нет. */ - pos = ((long)sec << 9) + (long)skip; - if (lseek(a->fd, pos, SEEK_SET) < 0) return -1; - return bank_read_page(a->fd, page, off, len); -} - -int8_t pop_arc_atlas(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, - atlas_t *at) __banked -{ - uint8_t blk, page; - int n; - - blk = mem_alloc_pages(1); - if (!blk) return -1; - page = mem_get_page(blk, 0); - n = pop_arc_read(a, tbl, idx, 0, page, 0, 0); - /* Дальше всё общее с atlas_load: магия 'SPA1', разбор заголовка и - * gfx_w0_page_prepare. При ошибке atlas_attach сам отпускает блок. */ - return (int8_t)atlas_attach(at, blk, page, n); -} - -void pop_arc_close(pop_arc_t *a) __banked -{ - if (a->fd >= 0) close(a->fd); - a->fd = -1; - a->count = 0; -} diff --git a/applications/SprPoP/src/pop_arc.h b/applications/SprPoP/src/pop_arc.h deleted file mode 100644 index 20cd249..0000000 --- a/applications/SprPoP/src/pop_arc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * pop_arc.h — архив ресурсов PBA1: много файлов в одном, один open на всех. - * - * ЗАЧЕМ. Замер в MAME (2026-08-25): `open` стоит 51,4 мс, а чтение 16 КБ из - * уже открытого файла — 32,6 мс. То есть 61 % времени загрузки уходит на - * открытие, а не на данные, и одна только стартовая пачка ресурсов (~142 - * файла) — это 7,3 секунды чистого `open`. Архив открывается ОДИН раз на - * группу, и эта цена платится один раз вместо сотни. - * - * ФОРМАТ (генерирует toolchain/pop_pack_arc.py): - * 0..3 'PBA1' магия и версия - * 4 count число записей, 1..126 - * 8.. записи по 4 байта: offset в СЕКТОРАХ по 512 (uint16), - * size в байтах (uint16) - * данные с 512, каждый элемент выровнен на 512. - * Оффсет в секторах, потому что архив может быть больше 64 КБ (pv — мегабайт); - * размер в байтах, потому что ни один ресурс не крупнее 16 КБ — он обязан - * помещаться в EMM-страницу. - * - * ТАБЛИЦУ ДЕРЖИТ ВЫЗЫВАЮЩИЙ, на своём стеке: 4 байта на запись, у самой - * большой группы 320 байт. В W2 её класть нельзя — там осталось около сотни - * байт, — а стека в точке загрузки ресурсов израсходовано 75 байт из 1279 - * (замер там же). Так модуль не занимает постоянной памяти вовсе. - */ -#ifndef POP_ARC_H -#define POP_ARC_H - -#include -#include /* atlas_t */ - -#define POP_ARC_HEADER 512 -#define POP_ARC_SECTOR 512 -#define POP_ARC_MAX 126 /* (512-8)/4 */ -#define POP_ARC_REC 4 /* байт на запись таблицы */ - -/* Имя у структуры есть намеренно: так на неё можно сослаться из заголовков, - * которым незачем тянуть весь pop_arc.h (pop_ui.h). */ -typedef struct pop_arc_s { - int fd; - uint8_t count; -} pop_arc_t; - -/* ИМЕНА АРХИВОВ ЗНАЕТ САМ МОДУЛЬ, и это не вкусовщина: строковый литерал - * лежит в rodata СВОЕГО банка, а pop_arc.c живёт в банке 8. Указатель на - * литерал из другого банка после переключения W3 показывает на чужие - * данные — ровно так «BG\bg.arc» превращался в мусор и загрузка фона - * падала (поймано 2026-08-26). Поэтому наружу отдаём НОМЕР архива. */ -typedef enum { - POP_ARC_BG = 0, - POP_ARC_KID, - POP_ARC_GUARD, - POP_ARC_SKEL, - POP_ARC_VIZIER, - POP_ARC_SHADOW, - POP_ARC_TITLE, - POP_ARC_PV, - POP_ARC_SND, - POP_ARC_IDS -} pop_arc_id_t; - -/* Открыть архив по номеру: то же, что pop_arc_open, но имя берётся из - * таблицы внутри модуля. */ -int8_t pop_arc_open_id(pop_arc_t *a, uint8_t id, - uint8_t *tbl, uint8_t tbl_max) __banked; - -/* Открыть архив и вычитать таблицу в буфер вызывающего (count*4 байт). - * tbl_max — сколько записей помещается в буфер. - * Возврат: число записей; -1 — не открылся, не PBA1 либо таблица не влезла. */ -int8_t pop_arc_open(pop_arc_t *a, const char *path, - uint8_t *tbl, uint8_t tbl_max) __banked; - -/* Размер элемента idx по таблице (0, если индекс за пределами). */ -uint16_t pop_arc_size(const uint8_t *tbl, uint8_t idx); - -/* Прочитать кусок элемента idx в EMM-страницу: skip байт от его начала, - * size байт, в страницу page со смещением off. size == 0 — весь элемент. - * Возврат: сколько прочитано, -1 — ошибка. */ -int pop_arc_read(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, uint16_t skip, - uint8_t page, uint16_t off, uint16_t size) __banked; - -void pop_arc_close(pop_arc_t *a) __banked; - -/* Атлас ПРЯМО ИЗ АРХИВА: выделить страницу, вычитать в неё элемент idx и - * отдать libbgi (atlas_attach — проверка магии + подготовка страницы к - * маппингу в W0). Полный эквивалент atlas_load, только источник другой. - * 0 — OK, -1 — ошибка (страница освобождена). */ -int8_t pop_arc_atlas(pop_arc_t *a, const uint8_t *tbl, uint8_t idx, - atlas_t *at) __banked; - -#endif /* POP_ARC_H */ diff --git a/applications/SprPoP/src/pop_bg.c b/applications/SprPoP/src/pop_bg.c deleted file mode 100644 index 89eca09..0000000 --- a/applications/SprPoP/src/pop_bg.c +++ /dev/null @@ -1,1187 +0,0 @@ -/* - * pop_bg.c — ГОРЯЧАЯ половина слоя фона PoP: то, что работает КАЖДЫЙ кадр — - * передний слой поверх персонажей (порт seg003 redraw_at_char + seg008 - * set_char_collision), оверлеи кромки, кладка стены и клип. Полная - * отрисовка комнаты и точечные перерисовки уехали в pop_room.c (банк 7); - * граница реза и её цена расписаны в _pop_bg.h. - * - * Подробности алгоритма кладки — в toolchain/render_room.py и - * memory/pop_background_strategy. Только DUNGEON-стиль (Фаза 1). - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "_pop_bg.h" /* контракт с холодной половиной (pop_room.c, банк 7) */ -#include "pop_tile.h" -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ /* общие листья слоя фона (резидент): блит, тайлы, таблица */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_state.h" -#include "pop_geom.h" -#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */ -#include "pop_kid.h" /* Kid.curr_col/curr_row — порядок оверлеев (см. ниже) */ -#include "pop_cdraw.h" /* pop_cd — габарит кадра Кида (y-порядок плиты) */ -#include "pop_guard.h" /* SWORD_2_DRAWN — расширение футпринта под клинок */ - - -/* Область, куда в этом кадре рисовался ОВЕРЛЕЙ (не футпринт fore, а - * draw_other_overlay/floor_overlay/полоса потолка). Оверлей включается - * только в позах виса/полёта/подъёма и рисует НЕ по прямоугольнику Kid, - * поэтому heal персонажа его следы не убирает: на второй странице дабл-буфера - * остаётся кадр «с оверлеем», и он мерцает через кадр. Копим bbox и - * восстанавливаем фон на ОБЕИХ страницах (pop_fore_heal). */ -static int ov_x0, ov_y0, ov_x1, ov_y1; -static uint8_t ov_pending; /* биты страниц, где надо восстановить фон */ -/* Подавить ov_mark на время серии — для вызывающего, который САМ чистит эту - * область каждый кадр. Так работает падающий кусок: его heal-коридор - * прочёсывается всегда, а оверлей соседа и кромка потолка рисуются ВНУТРИ - * коридора (окно клипа = прямоугольник куска). Без этого объединение ov_mark - * по шести кускам растягивалось на полкомнаты, и pop_fore_heal стоил 187 500 - * такта в фазе «ввод+heal» против 55 000 (замер 2026-08-17). */ -static uint8_t ov_suppress; - -static void ov_mark(int x, int y, int w, int h) -{ - if (ov_suppress) return; - if (!ov_pending) { ov_x0 = x; ov_y0 = y; ov_x1 = x + w; ov_y1 = y + h; } - else { - if (x < ov_x0) ov_x0 = x; - if (y < ov_y0) ov_y0 = y; - if (x + w > ov_x1) ov_x1 = x + w; - if (y + h > ov_y1) ov_y1 = y + h; - } - ov_pending = 3; /* обе страницы */ -} - -void pop_fore_heal(void) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t pg = gfx_get_draw_page() & 1; - if (!(ov_pending & (1 << pg))) return; - pop_heal_off(ov_x0, ov_y0, ov_x1 - ov_x0, ov_y1 - ov_y0); - ov_pending = (uint8_t)(ov_pending & ~(1 << pg)); - /* Восстановленный прямоугольник шире персонажа и запросто накрывает - * СОСЕДА — пометить область (DRAW-COST): heal идёт мимо pop_blit_b. */ - pop_cd_touch(ov_x0, ov_y0 + POP_YOFF, ov_x1 - ov_x0, ov_y1 - ov_y0); -} - - -/* ---- Константные таблицы (render_room.py) -------------------------- */ -static const uint8_t TBL_LINE[3] = {0, 10, 20}; -static const uint8_t DOOR_FRAM_SLICE[9] = {67, 59, 58, 57, 56, 55, 54, 53, 52}; -static const uint8_t SPIKES_FRAM_FORE[10] = {0, 139, 140, 141, 142, 143, 142, 140, 139, 0}; -static const uint8_t LPOS[5] = {58, 41, 37, 20, 16}; -static const uint8_t RPOS[4] = {52, 42, 31, 21}; - -/* Wall (chtab_7) id: делители/блок/марки. */ -#define RES_WALL_RNDBLOCK 13 -#define RES_WALL_DIVIDER1 11 -#define RES_WALL_MARK_TL 14 -#define RES_WALL_MARK_BL 15 -#define RES_WALL_MARK_TR 16 -#define RES_WALL_MARK_BR 17 - -/* ---- PRNG (seg009.c:321, 32-бит LCG) — только на ВХОД в комнату ---- * - * Сид (pop_t_seed) живёт в резиденте: его ставит полная отрисовка комнаты, а - * читает кэш раскладки кладки. */ -#define prandom(maxv) pop_prandom(&pop_t_seed, (maxv)) - -/* Отсев кусков кладки по окну fore-клипа — тела ниже, у wpp_fill. */ -static uint8_t wp_vis(int x, int w, int ytop, int ybot); -static void wp_blit(uint8_t id, int x, int ybot, uint8_t w, uint8_t h); - -/* ---- Декали-марки стен (seg008.c:2041/2056) ------------------------ */ -static void draw_left_mark(uint16_t dv, int arg2, int arg1, int row, int col) -{ - uint8_t image_id = (dv & 1) ? RES_WALL_MARK_BL : RES_WALL_MARK_TL; - int lv2 = 0; - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - if (dv > 3) lv2 = arg1 + 6; - else if (dv > 1) lv2 = arg2 + 6; - wp_blit(image_id, (xh + ((dv == 2 || dv == 3) ? 1 : 0)) * 8 + lv2, - dby - LPOS[dv], 7, 10); /* pop_wall.atl: 16/17 = 7x10 */ -} - -static void draw_right_mark(uint16_t dv, int arg1, int row, int col) -{ - uint8_t image_id = (dv & 1) ? RES_WALL_MARK_BR : RES_WALL_MARK_TR; - int a = (dv < 2) ? 24 : arg1 - 3; - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - wp_blit(image_id, (xh + ((dv > 1) ? 1 : 0)) * 8 + a, - dby - RPOS[dv], 14, 5); /* pop_wall.atl: 14/15 = 14x5 */ -} - -/* ---- wall_pattern (seg008.c:1928, dungeon-ветка) ------------------- */ -/* КЭШ РАСКЛАДКИ КЛАДКИ. Серия prandom для тайла зависит только от - * (комната, ряд, колонка) — пока мы в комнате, это КОНСТАНТА. А - * wall_pattern зовётся из fore-слоя КАЖДЫЙ кадр, и на Z80 это самая - * дорогая вещь в кадре: замер в MAME 2026-07-29 (комната 3) — 18 вызовов - * pop_prandom за один fore-проход, ~10 700 тактов каждый (32-битный LCG: - * __mullong ~8 000 + __moduint), то есть 193 К из 341 К всего прохода при - * бюджете кадра ~430 К. Кэшируем не сид, а ГОТОВЫЕ РЕШЕНИЯ (что рисовать - * и с каким смещением) — тогда в кадре не остаётся ни одного prandom. - * - * Порядок вызовов prandom воспроизведён один в один, включая то, что - * значение метки берётся ТОЛЬКО когда сработало её условие: иначе - * последовательность разъедется и кладка станет другой. which_part=0 - * использует префикс той же серии, поэтому кэш общий. - * - * Упаковка: wp_a = mid_div | mid_off<<1 | bot_div<<4 | bot_off<<5; - * wp_b = rndblk | right<<1 | right_val<<2 | left<<4 | left_val<<5. - * Индекс — (row+1)*10+col, ряды −1..2. */ -#define WP_N 40 -static uint8_t wp_a[WP_N], wp_b[WP_N], wp_ok[WP_N]; - -/* ---- Цвета дворцовой кладки (gen_palace_wall_colors, seg000:1942) ---- * - * Тело стены во дворце — не кирпичи-спрайты, а СПЛОШНЫЕ ЗАЛИВКИ; их цвета - * разыгрываются на КОМНАТУ: сид = номер комнаты, 3 ряда × 4 подряда × 11 - * колонок. Подряды 1 и 3 берут 0x61..0x64, подряды 0 и 2 — 0x66..0x69 - * (это слоты wall-палитры, во дворце они песочные); соседние по горизонтали - * не повторяются. Одиннадцать колонок, а не десять: заливки 3 и 5 берут - * цвет СЛЕДУЮЩЕЙ колонки. - * - * Не static: таблицу читает и холодная половина слоя (pop_room.c, банк 7). - * Writable-данные банка живут в _DATA/W2 и видны отовсюду — в отличие от - * const-таблиц, которые из чужого банка не прочитать. */ -uint8_t pop_pal_wall_col[3 * 44]; - -static void gen_palace_wall_colors(uint8_t room) -{ - pop_rnd_t saved = pop_t_seed; - uint8_t row, sub, col; - uint8_t *p = pop_pal_wall_col; - pop_prandom_set(pop_t_seed, room); - prandom(1); /* сброс, как в оригинале */ - for (row = 0; row < 3; row++) - for (sub = 0; sub < 4; sub++) { - uint8_t base = (uint8_t)((sub & 1) ? 0x61 : 0x66); - uint8_t prev = 0; /* 0 — «цвета ещё не было» */ - for (col = 0; col < 11; col++) { - uint8_t c; - do { c = (uint8_t)(base + prandom(3)); } while (c == prev); - *p++ = c; - prev = c; - } - } - pop_t_seed = saved; -} - -static void wall_pattern_reset(void) /* смена комнаты — сид другой */ -{ - uint8_t i; - for (i = 0; i < WP_N; i++) wp_ok[i] = 0; - if (pop_palace) gen_palace_wall_colors(pop_t_room); -} - -/* Выходы wall_rnd — в файловых статиках: возвращать девять значений - * через указатели на Z80 дороже самой функции. */ -static uint8_t wr_mid_div, wr_mid_off, wr_bot_div, wr_bot_off; -static uint8_t wr_rndblk, wr_right, wr_rightv, wr_left, wr_leftv; - -/* Правила серии prandom по модификатору стены (bg): что вообще есть у этого - * вида кладки и с какими порогами. Столбцы: - * [0] есть «случайный блок» (тогда prandom(4)==0) - * [1] порог условия метки СПРАВА (0 = метки справа нет, prandom не зовётся) - * [2] порог значения метки справа, [3] прибавка к нему - * [4] порог условия метки СЛЕВА (есть у всех четырёх), [5] порог значения - * Порядок строк — по bg: 0 SWS, 1 SWW, 2 WWS, 3 WWW (seg008:1928). */ -static const uint8_t WR_RULE[4][6] = { - {0, 0, 0, 0, 6, 1}, /* SWS: только метка слева */ - {1, 4, 3, 0, 4, 3}, /* SWW */ - {0, 4, 1, 2, 4, 4}, /* WWS: значение справа со сдвигом 2 */ - {1, 4, 3, 0, 4, 4}, /* WWW: полный набор */ -}; - -static void wall_rnd(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Кэшируем только штатную сетку: колонка вне 0..9 дала бы индекс - * соседнего РЯДА и чужую раскладку (тихий баг вместо промаха). */ - int idx = (col >= 0 && col < 10) ? (row + 1) * 10 + col : -1; - uint8_t a, b, bg; - pop_rnd_t saved; - if (idx >= 0 && idx < WP_N && wp_ok[idx]) { - a = wp_a[idx]; b = wp_b[idx]; - wr_mid_div = (uint8_t)(a & 1); wr_mid_off = (uint8_t)((a >> 1) & 7); - wr_bot_div = (uint8_t)((a >> 4) & 1); wr_bot_off = (uint8_t)((a >> 5) & 7); - wr_rndblk = (uint8_t)(b & 1); - wr_right = (uint8_t)((b >> 1) & 1); wr_rightv = (uint8_t)((b >> 2) & 3); - wr_left = (uint8_t)((b >> 4) & 1); wr_leftv = (uint8_t)((b >> 5) & 7); - return; - } - saved = pop_t_seed; - /* Верхняя полоса (row<0): SDLPoP рисует её как ряд 2 комнаты сверху - * (drawn_row=2 для seed, draw_main_y=-1 для позиции) — seed по row 2. */ - pop_prandom_set(pop_t_seed, pop_t_room + TBL_LINE[row < 0 ? 2 : row] + col); - prandom(1); /* сброс */ - wr_mid_div = (uint8_t)prandom(1); - wr_mid_off = (uint8_t)prandom(4); - wr_bot_div = (uint8_t)prandom(1); - wr_bot_off = (uint8_t)prandom(4); - wr_rndblk = wr_right = wr_left = 0; - wr_rightv = wr_leftv = 0; - bg = pop_wall_modifier(row, col); - { /* Четыре ветки bg отличались ТОЛЬКО числами в одной и той же серии - * prandom, поэтому они сведены к правилу (WR_RULE). ПОРЯДОК вызовов - * prandom обязан совпадать с оригиналом дословно, включая то, что - * значение метки берётся ТОЛЬКО когда сработало её условие: иначе - * последовательность разъедется и кладка станет другой. «Нет метки - * справа» = нулевой порог условия — тогда prandom не зовётся вовсе, - * ровно как в ветке SWS. */ - const uint8_t *r = WR_RULE[bg]; - if (r[0]) wr_rndblk = (uint8_t)(prandom(4) == 0); - if (r[1] && prandom(r[1]) == 0) { - wr_right = 1; wr_rightv = (uint8_t)(prandom(r[2]) + r[3]); - } - if (prandom(r[4]) == 0) { wr_left = 1; wr_leftv = (uint8_t)prandom(r[5]); } - } - pop_t_seed = saved; - if (idx >= 0 && idx < WP_N) { - wp_a[idx] = (uint8_t)(wr_mid_div | (wr_mid_off << 1) | - (wr_bot_div << 4) | (wr_bot_off << 5)); - wp_b[idx] = (uint8_t)(wr_rndblk | (wr_right << 1) | (wr_rightv << 2) | - (wr_left << 4) | (wr_leftv << 5)); - wp_ok[idx] = 1; - } -} - -/* ---- wall_pattern (seg008.c:1928, dungeon-ветка) ------------------- * - * Куски кладки одни и те же для всех четырёх видов стены, различается ровно - * НАБОР присутствующих (WP_PARTS) — раньше это были четыре ветки с - * повторяющимся телом. Порядок кусков внутри вызова сохранён: случайный - * блок, средний делитель, нижний делитель, метка справа, метка слева. - * - * which_part == 0 — только нижний делитель (слой draw_tile_bottom), 1 — всё - * остальное (draw_tile_fore). У SWW нижнего делителя нет вовсе, у SWS — - * ничего, кроме метки слева. */ -#define WP_RND 1 -#define WP_MID 2 -#define WP_BOT 4 -#define WP_RIGHT 8 -#define WP_LEFT 16 - -static const uint8_t WP_PARTS[4] = { - WP_LEFT, /* 0 SWS */ - WP_RND | WP_MID | WP_RIGHT | WP_LEFT, /* 1 SWW */ - WP_MID | WP_BOT | WP_RIGHT | WP_LEFT, /* 2 WWS */ - WP_RND | WP_MID | WP_BOT | WP_RIGHT | WP_LEFT, /* 3 WWW */ -}; - -/* ---- Кладка ДВОРЦА (seg008:1946) ------------------------------------ * - * Тело стены — не кирпичи-спрайты, а шесть СПЛОШНЫХ ЗАЛИВОК цветами из - * pop_pal_wall_col, поверх — пять разделителей chtab_7 (mono, цвет 6). - * Геометрия дословно из add_wipetable(layer, left, bottom, height, width): - * прямоугольник = x..x+width-1, (bottom-height+1)..bottom. - * - * Порядок prandom важен так же, как в подземелье: при which_part == 0 - * разыгрывается ОДНО значение, и нижний разделитель берёт ПЕРВОЕ из серии, - * а не пятое. */ -static uint8_t wpp_d[5]; /* пять prandom(2), 0..2 */ - -static void wall_rnd_palace(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int idx = (col >= 0 && col < 10) ? (row + 1) * 10 + col : -1; - pop_rnd_t saved; - uint8_t i; - if (idx >= 0 && idx < WP_N && wp_ok[idx]) { - uint8_t a = wp_a[idx]; - wpp_d[0] = (uint8_t)(a & 3); wpp_d[1] = (uint8_t)((a >> 2) & 3); - wpp_d[2] = (uint8_t)((a >> 4) & 3); wpp_d[3] = (uint8_t)((a >> 6) & 3); - wpp_d[4] = wp_b[idx]; - return; - } - saved = pop_t_seed; - pop_prandom_set(pop_t_seed, pop_t_room + TBL_LINE[row < 0 ? 2 : row] + col); - prandom(1); /* сброс */ - for (i = 0; i < 5; i++) wpp_d[i] = (uint8_t)prandom(2); - pop_t_seed = saved; - if (idx >= 0 && idx < WP_N) { - wp_a[idx] = (uint8_t)(wpp_d[0] | (wpp_d[1] << 2) | - (wpp_d[2] << 4) | (wpp_d[3] << 6)); - wp_b[idx] = wpp_d[4]; - wp_ok[idx] = 1; - } -} - -/* Прямоугольник [x, x+w) x [ytop, ybot] задевает окно fore-клипа? Клипа - * нет — задевает всегда. Координаты сюда приходят посчитанными ИЗ РЯДА - * (63*row + …), то есть логические — значит и рамка нужна логическая - * (pop_tile.h, пара fclip_l*): переворот применяется позже, при блите. */ -static uint8_t wp_vis(int x, int w, int ytop, int ybot) -{ - if (!pop_t_fclip_on) return 1; - return (uint8_t)(x < pop_t_fclip_x1 && x + w > pop_t_fclip_x0 && - ytop < pop_t_fclip_ly1 && ybot >= pop_t_fclip_ly0); -} - -/* Декаль кладки: ybot — БЕЗ POP_YOFF (как ждёт pop_wall_b), w/h — реальный - * габарит куска. Размеры взяты из каталогов атласов (pal_wall.atl / - * pop_wall.atl) и заданы верхней границей по группе, поэтому промахнуться в - * меньшую сторону нельзя: хуже отсева не будет, лишнего не сотрём. - * - * Зачем: pop_blit_b тоже отсеивает до маппинга страницы, но по ЗАВЕДОМО - * большему габариту 64x64 — куски кладки высотой 3..12 px он пропускает и - * платит полный atlas_image + gfx_w0_map + чтение w/h (~9 760 тактов на - * блит), чтобы там обнаружить, что рисовать нечего. Пять таких блитов на - * тайл — 48 500 тактов в никуда (docs/perf_backlog.md, пункт 0 шаг 2). */ -static void wp_blit(uint8_t id, int x, int ybot, uint8_t w, uint8_t h) -{ - int yb = ybot + POP_YOFF; - if (!wp_vis(x, (int)w, yb - (int)h + 1, yb)) return; - pop_wall_b(id, x, ybot); -} - -/* Заливка куска стены. x/ytop — уже ЭКРАННЫЕ (с POP_YOFF). В fore-проходе - * режем по окну клипа: без этого заливка легла бы поверх областей, которые - * в этом кадре никто не восстанавливает. */ -static void wpp_fill(int x, int ytop, int w, int h, uint8_t colour) -{ - int x2 = x + w - 1, y2 = ytop + h - 1; - if (pop_t_fclip_on) { - if (x < pop_t_fclip_x0) x = pop_t_fclip_x0; - if (ytop < pop_t_fclip_ly0) ytop = pop_t_fclip_ly0; - if (x2 >= pop_t_fclip_x1) x2 = pop_t_fclip_x1 - 1; - if (y2 >= pop_t_fclip_ly1) y2 = pop_t_fclip_ly1 - 1; /* клип ДО переворота */ - } - if (pop_t_clip_top && ytop < pop_t_clip_top) ytop = pop_t_clip_top; - if (x < 0) x = 0; - if (ytop < 0) ytop = 0; - if (x2 > 319) x2 = 319; - if (y2 > 255) y2 = 255; - if (x2 < x || y2 < ytop) return; - /* ПЕРЕВОРОТ: заливка — такой же кусок фона, как блит тайла, и обязана - * отражаться той же формулой (иначе полоса ложится в неотражённое - * место — так ломались решётка и чомперы). */ - if (pop_upside) { - int h = y2 - ytop + 1; - ytop = POP_FLIP_TOP(ytop, h); - y2 = ytop + h - 1; - } - setfillstyle(SOLID_FILL, colour); - bar(x, ytop, x2, y2); - if (!pop_t_fclip_on) pop_cd_touch(x, ytop, x2 - x + 1, y2 - ytop + 1); -} - -static void wall_pattern_palace(int row, int col, int which_part) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int xh = POP_COL_XH[col]; - int dbys = 63 * row + 65; /* база БЕЗ POP_YOFF — для блитов */ - int dmys = dbys - 3; - int dby = dbys + POP_YOFF, dmy = dmys + POP_YOFF; /* экранные — для заливок */ - /* РАННИЙ ВЫХОД по окну fore-клипа. Весь узор лежит в прямоугольнике - * x [xh*8, xh*8+32), y [dmy-59, dby]: сверху — первая заливка, снизу — - * нижний декаль, чей низ ровно на dby. - * - * Без этой проверки тайл стены под ногами Кида стоил ~60 000 тактов НА - * НОЛЬ ПИКСЕЛЕЙ: предфильтр fore_tile грубый (габарит 40x78), wpp_fill - * честно режет по окну, но платит ~3 100 тактов за арифметику клипа, а - * pop_wall_b об окне не знает вовсе и идёт в atlas_image + gfx_w0_map, - * чтобы там обнаружить, что рисовать нечего. Два таких тайла (ряд 2 под - * Кидом попадает в fore-окно всегда) = 139 863 такта за кадр, 32 % - * растрового кадра. См. docs/perf_backlog.md, пункт 0. */ - if (pop_t_fclip_on) { - int x0 = xh * 8; - if (x0 >= pop_t_fclip_x1 || x0 + 32 <= pop_t_fclip_x0 || - dmy - 59 >= pop_t_fclip_ly1 || dby + 1 <= pop_t_fclip_ly0) - return; - } - /* Цвета лежат по рядам 0..2; полоса у потолка (row −1) — это ряд 2 - * комнаты сверху, оригинал и сид для неё берёт по ряду 2. */ - const uint8_t *cl = pop_pal_wall_col + 44 * (row < 0 ? 2 : row) + col; - wall_rnd_palace(row, col); - if (which_part) { - wpp_fill(xh * 8, dmy - 59, 32, 20, cl[0]); - wpp_fill(xh * 8, dmy - 39, 16, 21, cl[11]); - wpp_fill((xh + 2) * 8, dmy - 39, 16, 21, cl[12]); - wpp_fill(xh * 8, dmy - 18, 8, 19, cl[22]); - wpp_fill((xh + 1) * 8, dmy - 18, 24, 19, cl[23]); - /* Габариты групп из pal_wall.atl: 3..5 = 8x7, 6..8 = 32x12, - * 9..11 = 32x12 (11-й 28x11), 12..14 = 30x5 (14-й 30x4), - * 15..17 = 32x3. Берём максимум по группе. */ - wp_blit((uint8_t)(wpp_d[0] + 3), (xh + 3) * 8, dmys - 53, 8, 7); - wp_blit((uint8_t)(wpp_d[1] + 6), xh * 8, dmys - 34, 32, 12); - wp_blit((uint8_t)(wpp_d[2] + 9), xh * 8, dmys - 13, 32, 12); - wp_blit((uint8_t)(wpp_d[3] + 12), xh * 8, dmys, 30, 5); - } - wpp_fill(xh * 8, dby - 2, 32, 3, cl[33]); - wp_blit((uint8_t)((which_part ? wpp_d[4] : wpp_d[0]) + 15), xh * 8, dbys, 32, 3); -} - -static void wall_pattern(int row, int col, int which_part) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int xh = POP_COL_XH[col]; - int dby = 63 * row + 65; - uint8_t parts; - if (pop_palace) { wall_pattern_palace(row, col, which_part); return; } - /* Ранний выход по окну fore-клипа — то же, что у паласной ветки, но свой - * габарит. Самый верхний кусок здесь — ЛЕВАЯ марка: LPOS[4] = 58 плюс её - * высота 10, то есть dby+POP_YOFF−67; самый нижний — нижний разделитель, - * низ ровно на dby+POP_YOFF. По x правая марка уходит до xh*8+46 - * (a = 24 при dv<2, ширина 14), берём 48. */ - { - int x0 = xh * 8, dbs = dby + POP_YOFF; - if (!wp_vis(x0, 48, dbs - 67, dbs)) return; - } - parts = WP_PARTS[pop_wall_modifier(row, col)]; - - wall_rnd(row, col); - if (which_part) { - /* Габариты из pop_wall.atl: 13 = 32x21, 11/12 = 9x21. */ - if ((parts & WP_RND) && wr_rndblk) - wp_blit(RES_WALL_RNDBLOCK, xh * 8, dby - 42, 32, 21); - if (parts & WP_MID) - wp_blit((uint8_t)(RES_WALL_DIVIDER1 + wr_mid_div), - (xh + 1) * 8 + wr_mid_off, dby - 21, 9, 21); - } - if (parts & WP_BOT) - wp_blit((uint8_t)(RES_WALL_DIVIDER1 + wr_bot_div), - xh * 8 + wr_bot_off, dby, 9, 21); - if (which_part) { - if ((parts & WP_RIGHT) && wr_right) - draw_right_mark(wr_rightv, wr_mid_off, row, col); - if ((parts & WP_LEFT) && wr_left) - draw_left_mark(wr_leftv, wr_mid_off - wr_mid_div, - wr_bot_off - wr_bot_div, row, col); - } -} - -/* Решётка ворот (portcullis) из ЛЕВОЙ комнаты (seg008.c:1110). */ -static void draw_gate_back(uint8_t modl, int xh, int dby, int dmy) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = xh * 8; - int gate_top_y = dby - 62; - int openness = (((modl > 188) ? 188 : modl) >> 2) + 1; - int gate_bot_y = dmy - openness; - int yb, gate_frame; - - if (gate_bot_y + 12 < dmy) - pop_env_b(50, x, gate_bot_y); - else - pop_env_b(51, x, gate_bot_y - 2); - yb = gate_bot_y - 12; - if (yb < 192) { - while (yb >= 0 && yb > 7 && (yb - 7) > gate_top_y) { - pop_env_b(52, x, yb); - yb -= 8; - } - } - gate_frame = yb - gate_top_y + 1; - if (gate_frame > 0 && gate_frame < 9) - pop_env_b(DOOR_FRAM_SLICE[gate_frame], x, yb); -} - -/* Та же решётка, но в ПЕРЕДНИЙ слой — поверх персонажа, стоящего в проёме - * (draw_gate_fore, seg008:1153). От back-варианта отличается ровно тем, что - * есть в оригинале: только ПРОЗРАЧНЫЕ куски (51 низ + 52 восьмипиксельные - * ломти), без непрозрачного 50 и без хвостового DOOR_FRAM_SLICE — фон под - * баррами уже нарисован, здесь возвращаются только сами прутья. - * Клип по прямоугольнику персонажа делает pop_t_fclip (см. pop_tile.h). */ -static void draw_gate_fore(uint8_t modl, int xh, int dby, int dmy) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = xh * 8; - int gate_top_y = dby - 62; - int openness = (((modl > 188) ? 188 : modl) >> 2) + 1; - int gate_bot_y = dmy - openness; - int yb; - - pop_env_b(51, x, gate_bot_y - 2); - yb = gate_bot_y - 12; - if (yb < 192) - while (yb >= 0 && yb > 7 && (yb - 7) > gate_top_y) { - pop_env_b(52, x, yb); - yb -= 8; - } -} - - - - -/* ---- Точки входа для ХОЛОДНОЙ половины (pop_room.c, банк 7) ---------- * - * Тонкие обёртки, а не пометка самих тел `__banked`: трамплин выбирается - * ОБЪЯВЛЕНИЕМ, поэтому пометка тела заставила бы платить 654 такта и - * ГОРЯЧИХ вызывающих — fore-проход зовёт wall_pattern до девяти раз за кадр. - * С обёрткой горячий путь идёт прямым call, а трамплин достаётся только - * холодному (полная отрисовка комнаты: ~40 вызовов, 26 000 тактов РАЗОВО на - * вход в комнату). См. _pop_bg.h и memory/sdcc_banked_call_rules. */ -void pop_wall_pattern_b(int row, int col, int which_part) __banked -{ - wall_pattern(row, col, which_part); -} - -void pop_wall_pattern_reset_b(void) __banked -{ - wall_pattern_reset(); -} - -void pop_gate_back_b(uint8_t modl, int xh, int dby, int dmy) __banked -{ - draw_gate_back(modl, xh, dby, dmy); -} - -/* ---- fore-over-Kid (порт seg003 redraw_at_char + seg008 set_char_collision) -- - * Передний слой (fore_id = foretable-кусок) тайлов ФУТПРИНТА спрайта Kid - * — рядов top..bottom × колонок left..right (<= 2×2 = 4 тайла) — рисуется - * ПОВЕРХ Kid: то, что по изометрии перед ним (передние грани колонн/ворот/ - * большой колонны/щебня). Стены и факелы имеют fore_id=0 → остаются сзади. - * Рисуем в GFX_BANK_SPRITE (видео-ОЗУ, 0xFF прозрачен); heal персонажа восстановит - * из теневого фона (fore в нём уже запечён pop_room_draw). obj_x — ЛОГИЧЕСКАЯ - * X кадра Kid (до ×8/7), obj_y — низ спрайта, w/h — размер, dir — направление. */ -static int8_t col_from_x(int xpos) /* get_tile_div_mod: колонка (58/14) */ -{ - /* Таблицей (резидентная POP_TILE_DIV, см. pop_tile.h) — как в оригинале. - * Было `/14` и `%14`: два полноценных 16-битных деления SDCC на вызов, - * а зовётся это дважды на каждый футпринт персонажа. */ - if ((unsigned int)xpos < 256u) return POP_TILE_DIV[xpos]; - { - int x = xpos - 58; - int xh = x / 14; - if (x % 14 < 0) xh--; /* округление вниз для отрицательных */ - return (int8_t)xh; - } -} - -#define y_to_row(y) pop_y_to_row((int16_t)(y)) /* общий (pop_geom) */ - -/* Контекст ТЕКУЩЕГО тайла прохода: код, левый край, база Y. Порт глобалов - * оригинала (curr_tile / draw_xh / draw_main_y, которые load_curr_and_left_tile - * ставит ОДИН раз на тайл, seg008 redraw_needed_tiles) — все рисовальщики - * читают их, а не считают заново. У нас код тайла читался дважды за тайл - * (в fore_tile и снова тут), а координаты — в каждом листе. */ -static uint8_t ft_code; -static int ft_x, ft_dmy; - -/* Есть ли у кода тайла ХОТЬ ЧТО-ТО в переднем слое. Порт ранней проверки - * оригинала — `id = tile_table[curr_tile].fore_id; if (id == 0) return;` - * в начале ветки default у draw_tile_fore (seg008:0D15), — расширенной - * нашими спецслучаями: стена (20), пики (2), чомпер (0x12) и нижняя грань - * loose (11) рисуются мимо fore_id. - * - * Была в самом КОНЦЕ цепочки: до неё успевали отработать чтение кода тайла - * и все сравнения спецслучаев. Замер в MAME: fore-проход стоил 58 764 такта - * ради одного блита 10×2, а в позиции без переднего слоя — 112 758 тактов - * и ноль блитов. */ -static const uint8_t FORE_ANY[32] = { -/* 00 empty */ 0, /* 01 floor */ 0, /* 02 spike */ 1, /* 03 pillar */ 1, -/* 04 gate */ 1, /* 05 stuck */ 0, /* 06 closebtn */ 0, /* 07 doortopf */ 1, -/* 08 bpbot */ 1, /* 09 bptop */ 1, /* 0A potion */ 1, /* 0B loose */ 1, -/* 0C dtop */ 1, /* 0D mirror */ 1, /* 0E debris */ 1, /* 0F openbtn */ 0, -/* 10 ldL */ 0, /* 11 ldR */ 0, /* 12 chomper */ 1, /* 13 torch */ 0, -/* 14 wall */ 1, /* 15 skeleton */ 0, /* 16 sword */ 0, /* 17 balcL */ 0, -/* 18 balcR */ 0, /* 19 lattpil */ 1, /* 1A lattdown */ 1, /* 1B lattsm */ 1, -/* 1C lattl */ 1, /* 1D lattr */ 1, /* 1E debristo */ 1, /* 1F — */ 0 -}; - -/* Контекст ft_* обязан быть проставлен вызывающим. */ -static void fore_only_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Нажатая кнопка → пол/stuck (get_tile_to_draw) — это уже учтено в ft_code - * (его ставит pop_tile_code_drawn), иначе поверх Kid лезет передняя грань - * КНОПКИ. */ - uint8_t code = ft_code; - const piece *t; - int x = ft_x, dmy = ft_dmy; - if (!FORE_ANY[code]) return; /* ранний выход, как в оригинале */ - t = &pop_tile_table[code]; - if (code == 20) { - /* Во дворце тело стены даёт wall_pattern заливками, а спрайтовая - * грань не рисуется вовсе (seg008:711). */ - if (!pop_palace) - pop_wall_b(POP_WALL_FRAM_MAIN[pop_wall_modifier(row, col)], x, dmy); - wall_pattern(row, col, 1); - return; - } - if (code == 2) { /* пики: fore-кадр */ - uint8_t sf = pop_spike_frame(pop_tile_mod(row, col)); - if (sf > 0 && sf < 10 && SPIKES_FRAM_FORE[sf]) - pop_env_b(SPIKES_FRAM_FORE[sf], x, dmy - 2); - } - if (code == 0x12) { /* чомпер: передний слой челюстей */ - uint8_t cm = pop_tile_mod(row, col); - uint8_t pose = pop_chomp_pose(cm); - /* Передние куски чомпера и его кровь лежат в pop_fore.atl - * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит - * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ - pop_fore_b(POP_CHOMP_FRAM_FOR[pose], x, dmy); - if (cm & 0x80) /* кровь поверх переднего слоя */ - pop_fore_b((uint8_t)(pose + 119), x + 8, dmy - 6); - } - if (code == 10) { /* зелье: склянка (пузырёк — динамика) */ - pop_potion_flask(row, col, pop_tile_mod(row, col)); - } else if (t->fore_id) { - pop_fore_b(t->fore_id, t->fore_x * 8 + x, t->fore_y + dmy); - } -} - -/* Полоса кладки У ПОТОЛКА поверх Kid — порт redraw_needed_above (seg008:0221). - * Там draw_tile_bottom(1) и draw_loose(1): аргумент 1 = «добавить ещё и в - * FOREtable», т.е. нижняя грань потолка и кадр плиты-потолка рисуются ПОВЕРХ - * персонажа (иначе руки прыгающего Kid лезут на кромку потолка). Всё - * остальное из этой функции (floorright, anim_topright, right) идёт в - * backtable — под персонажем. */ -static void ceil_over_kid_tile(int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code = pop_tile_code(-1, col); - const piece *t = &pop_tile_table[code]; - int x = POP_COL_XH[col] * 8; - int dby = 63 * (-1) + 65; /* = 2 */ - if (code == 20) { /* draw_tile_bottom: стена */ - if (!pop_palace) /* seg008:576 */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[pop_wall_modifier(-1, col)], x, dby); - /* wall_pattern ЗДЕСЬ НЕТ — и это не упущение. draw_tile_bottom - * (seg008:588) кладёт в foretable ТОЛЬКО кадр грани `id`, под своим - * `arg_0`; узор вызывается строкой ниже, вне этой ветки, и уходит в - * текущую таблицу, то есть в ФОН. Мы же звали его прямо в переднем - * проходе — узор задней стены штамповался поверх всего, что уже - * нарисовано, включая падающие плиты (найдено прогоном 2026-08-13). - * В фон он попадает там, где и положено, — при отрисовке тайла. - * - * Не путать с fore_only_tile: там узор в переднем слое ЗАКОННЫЙ, - * это порт draw_tile_fore (seg008:715), где он стоит явно рядом с - * главной гранью стены, обязанной перекрывать персонажа. */ - } else if (t->bottom_id) { - pop_env_b(t->bottom_id, x, dby); - } - if (code == 11) /* draw_loose(1): плита-потолок */ - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(pop_ceil_modif[col])], x, dby); - ft_code = pop_tile_code_drawn(-1, col); /* контекст тайла для листа */ - ft_x = x; ft_dmy = 63 * (-1) + 62; - fore_only_tile(-1, col); /* draw_tile_fore */ -} - -/* Пересекается ли габарит тайла с окном fore-слоя. Шаг тайла — 32 px - * (POP_COL_XH[col]*8 = col*32), куски выходят вправо максимум на +8 (дивайдеры - * и метки рисуются в ячейке правого соседа) и вверх на 42+высота кадра. - * Даёт отсев ЦЕЛОГО тайла ДО обращения к атласу: спрайт 27..40 px шириной - * задевает не все тайлы футпринта, а платили за каждый (atlas_image + - * gfx_w0_map + разбор заголовка на КАЖДЫЙ кусок). */ -static uint8_t tile_in_fclip(int row, int col) -{ - int x0, y0; - if (!pop_t_fclip_on) return 1; - x0 = POP_COL_XH[col] * 8; - y0 = POP_YOFF + 63 * row; - /* По ЛОГИЧЕСКОЙ рамке: y0 тайла считается из его ряда и переворотом не - * меняется (см. pop_tile.h про пару fclip_l*). */ - return (uint8_t)(x0 < pop_t_fclip_x1 && x0 + 40 > pop_t_fclip_x0 && - y0 - 8 < pop_t_fclip_ly1 && y0 + 70 > pop_t_fclip_ly0); -} - -static void fore_tile(int row, int col) /* передний слой одного тайла */ -{ - pop_dbg_rdmax[1]++; /* ВРЕМЕННО: сколько тайлов обошли */ - if (!tile_in_fclip(row, col)) return; - pop_dbg_rdmax[2]++; /* ВРЕМЕННО: прошли окно клипа */ - /* draw_loose (seg008:0A38) — единственный кусок ТАЙЛА, который оригинал - * кладёт В ОБЕ таблицы БЕЗУСЛОВНО: нижняя грань loose-плиты идёт и в - * backtable, и в foretable. Значит передняя грань плиты рисуется ПОВЕРХ - * персонажа ВСЕГДА, а не только у потолка (ceil_over_kid_tile). Верх - * плиты (draw_tile_base) остаётся в backtable — поэтому голова и руки - * висящего/подтягивающегося Kid видны НАД плитой, а тело уходит ЗА неё. - * Без этого Kid лез на плиту «с переднего края» (комната 12: вис на - * кромке loose над дырой от соседней упавшей плиты). */ - ft_code = pop_tile_code_drawn(row, col); /* код тайла — ОДИН раз на тайл */ - if (!FORE_ANY[ft_code]) return; /* нечего класть в передний слой */ - pop_dbg_rdmax[3]++; /* ВРЕМЕННО: реально рисуем */ - ft_x = POP_COL_XH[col] * 8; - ft_dmy = 63 * row + 62; - if (row >= 0 && ft_code == 11) - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(pop_loose_modif[row * 10 + col])], - ft_x, ft_dmy + 3); - /* draw_tile_fore (seg008:690) — ТОЛЬКО add_foretable-часть. Раньше здесь - * рисовалась ещё и передняя кромка пола (bottom_id) «чтобы перекрывала - * Kid», но в оригинале bottom идёт через draw_tile_bottom в backtable - * (под персонажем), а поверх него попадает лишь при draw_other_overlay. - * Из-за лишнего bottom у основания колонны проскакивала «тень». */ - fore_only_tile(row, col); -} - -/* Определение общих с pop_room.c obj-координат (объявление — _pop_bg.h). */ -int8_t pop_bg_obj_col, pop_bg_obj_row; - -/* Пол-оверлей при подъёме (draw_floor_overlay, seg008:1457): когда Kid - * подтягивается на floor-подобный тайл назначения (floor/pillar/stuck/torch), - * а тайл СЛЕВА пуст (т.е. кромка), передний край пола перекрывает нижнюю - * часть Kid — иначе видна часть, что должна быть за полом. Кадр подъёма - * 137..144 индексирует floor_left_overlay. */ -static const uint8_t FLOOR_LEFT_OVERLAY[8] = {32, 151, 151, 150, 150, 151, 32, 32}; - -static void other_overlay_tile(int row, int col); /* fwd (draw_floor_overlay -> else) */ - -static void climb_overlay_tile(int row, int col, uint8_t fidx) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* тип — ПОДСТАВЛЕННЫЙ (нажатая кнопка = пол): иначе кромка, за которую - * Kid спускается/подтягивается, закрашивается целым тайлом */ - uint8_t code; - if (!tile_in_fclip(row, col)) return; - code = pop_tile_code_drawn(row, col); - int x, dmy, dby; - const piece *t; - if (pop_tile_code(row, col - 1) != 0) return; /* слева не пусто → не кромка */ - if (code != 1 && code != 3 && code != 5 && code != 19) { - /* seg008:1E3A draw_floor_overlay: floor-оверлей рисуется только для - * floor/pillar/stuck/torch, а для ОСТАЛЬНЫХ тайлов вызывается - * draw_other_overlay() — иначе кнопка (opener/closer), за кромку - * которой Kid спускается, не перекрывает его. */ - other_overlay_tile(row, col); - return; - } - x = POP_COL_XH[col] * 8; - dmy = 63 * row + 62; - dby = dmy + 3; - t = &pop_tile_table[code]; - ov_mark(x, 63 * row + 2, 64, 64); - pop_env_b(FLOOR_LEFT_OVERLAY[fidx], x, dmy + (code == 5 ? 1 : 0)); - if (t->bottom_id) pop_env_b(t->bottom_id, x, dby); /* draw_tile_bottom */ -} - - -/* draw_tile2 (seg008:1F48) — но ТОЛЬКО та его часть, что реально может лечь - * ПОВЕРХ персонажа. Ключ (подтверждено трассой оригинала): draw_tile_right, - * draw_tile_anim_right и draw_loose добавляют спрайты через add_backtable - * НАПРЯМУЮ, игнорируя ptr_add_table — значит правая грань левого соседа - * («шахматка» столба 93, blueline, грани пик/loose соседа, кадр loose) - * ВСЕГДА рисуется ПОД персонажем. Через ptr_add_table (→ midtable при - * draw_other_overlay) идут только: «floor B» 42 при левом соседе-поле, - * draw_tile_base, draw_tile_anim (свои пики) и draw_tile_bottom. */ -static void overlay_mid_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code = pop_tile_code_drawn(row, col); - uint8_t lcode = pop_tile_code_drawn(row, col - 1); - const piece *t; - int x = POP_COL_XH[col] * 8; - int dby = 63 * row + 65; - int dmy = dby - 3; - t = &pop_tile_table[code]; - ov_mark(x, 63 * row + 2, 64, 64); /* тайл + правый сосед (грани) */ - if (code != 20 && lcode == 1) /* draw_tile_right: только 42 */ - pop_env_b(42, x, pop_tile_table[1].right_y + dmy); - { /* draw_tile_base (seg008:0A8E) — ЦЕЛИКОМ, вместе с подстановками id: - * у loose верх плиты берётся из loose_fram_left (в pop_tile_table base_id=0), - * у opener'а без пола слева — 148, НО только в ПОДЗЕМЕЛЬЕ. Условие - * `tbl_level_type[current_level] == 0` в оригинале стоит третьим - * (seg008:628) и у нас было потеряно ИМЕННО ЗДЕСЬ: статическая - * отрисовка (pop_room.c, draw_tile_base) его имеет, а оверлей — нет. - * Отсюда симптом «кнопка, на которую лезет Кид, залита кирпичом»: - * пока тайл рисует статика, кнопка правильная, но как только Kid - * встаёт под кромку, оверлей перерисовывает её поверх него уже - * спрайтом 148, а во дворце это другая картинка (кладку палас - * вообще рисует заливками, а не спрайтами). Уровень 4, комната 18, - * кнопка (0,4) — найдено пользователем 2026-09-02. - * - * Раньше здесь стоял голый base_id, и - * верх loose-плиты в оверлей не попадал: передняя грань ложилась поверх - * Kid (foretable), а сама плита — нет, и подтягивающийся Kid рисовался - * поверх её верхней плоскости (комната 12). */ - uint8_t base_id = t->base_id; - if (code == 11 && row >= 0) - base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[row * 10 + col])]; - else if (code == 0x0F && lcode == 0 && !pop_palace) - base_id = 148; /* ТОЛЬКО ПОДЗЕМЕЛЬЕ (seg008:628) */ - if (base_id) - pop_env_b(base_id, x, t->base_y + dmy); - } - if (code == 2) { /* draw_tile_anim: свои пики */ - uint8_t sf = pop_spike_frame(pop_tile_mod(row, col)); - if (sf > 0 && sf < 10 && POP_SPIKES_FRAM_LEFT[sf]) - pop_env_b(POP_SPIKES_FRAM_LEFT[sf], x, dmy - 2); - } - if (code == 20) { /* draw_tile_bottom */ - uint8_t wmod = pop_wall_modifier(row, col); - if (!pop_palace) /* seg008:576 */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[wmod], x, dby); - wall_pattern(row, col, 0); - } else if (t->bottom_id) { - pop_env_b(t->bottom_id, x, dby); - } - /* draw_loose тут НЕТ, и это не забывчивость: в оригинале (seg008 - * draw_loose) нижняя грань плиты идёт в add_backtable + add_foretable, - * мимо ptr_add_table — то есть в midtable не попадает никогда. Перекрыть - * ею падающий кусок должен ПЕРЕДНИЙ слой (fore_only_tile), а не оверлей. */ -} - -/* draw_tile_fore (seg008:690) — ТОЛЬКО передний слой (add_foretable): он - * рисуется после всего и поверх персонажа. Нужен для полосы кладки у - * потолка: в redraw_needed_above всё остальное идёт в backtable (под Kid). */ - -/* draw_other_overlay (seg008:1492): для поз виса/прыжка/падения/захвата на - * КРОМКЕ (сосед слева пуст, либо тайл через один слева пуст) — перерисовать - * ВЕСЬ тайл поверх Kid. Тело пола перекрывает висящего/прыгающего/падающего - * ПОД ним. Срабатывает только в этих позах (см. redraw_at_char2 ниже) — - * поэтому при стоянии/залезании ложной окклюзии нет. - * - * ПОРЯДОК (redraw_needed_tiles, seg008:1B06 + redraw_needed, seg008:0211): - * тайлы обходятся ряды 2,1,0, внутри ряда колонки 0..9; в тайле сначала - * оверлей (redraw_frames2 -> midtable), потом ОБЪЕКТЫ этого тайла. Kid — тоже - * запись midtable, вставляемая при обработке СВОЕГО тайла (obj_row/obj_col). - * Значит оверлей ложится ПОВЕРХ Kid только у тайлов, идущих в обходе ПОЗЖЕ - * его собственного; всё, что раньше, — под ним. У нас списков нет (рисуем - * сразу), поэтому порядок эмулируется явной проверкой. */ -static void other_overlay_tile(int row, int col) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t code, left; - if (!tile_in_fclip(row, col)) return; - code = pop_tile_code(row, col); - /* Пустой тайл НЕ окклюдирует: у него нет тела пола/стены, а draw_tile для - * него рисует лишь ФОНОВУЮ сетку (BLUELINE «силуэт кладки» — правая грань - * пустого соседа). В оригинале она уходит в y-сортируемый midtable и - * ложится ПОЗАДИ Kid; у нас draw_tile кладёт её прямо поверх → сетка на - * висящем/падающем Kid. Фон запечён один раз в pop_room_draw — над - * спрайтом его перерисовывать не нужно. */ - if (code == 0) return; - /* Тайл идёт в обходе РАНЬШЕ тайла Kid → его оверлей лёг бы ПОД спрайт. */ - if (row > pop_bg_obj_row || (row == pop_bg_obj_row && col <= pop_bg_obj_col)) return; - left = pop_tile_code(row, col - 1); - if (left == 0) { overlay_mid_tile(row, col); return; } /* ветка 1: сосед слева пуст */ - if (col > 0 && pop_tile_code(row, col - 2) == 0) { - /* Ветка 2 (тайл ЧЕРЕЗ ОДИН слева пуст): в оригинале она ставит - * tile_object_redraw[tilepos]=0xFF, т.е. объекты тайлов tilepos−1 и - * tilepos рисуются СРАЗУ ПОСЛЕ оверлея — Kid возвращается наверх. - * Без этого правая грань соседнего столба (кадр 93) остаётся поверх - * прыгающего Kid (баг «тень на дальнем столбе поверх Кида»). */ - if (row == pop_bg_obj_row && (col == pop_bg_obj_col + 1)) return; - overlay_mid_tile(row, col); - } -} - -/* Оверлей тайла ПОВЕРХ ПАДАЮЩЕГО КУСКА — вторая половина draw_mob - * (seg007:1149: set_redraw2 рядом с set_redraw_fore). set_redraw2 ведёт в - * draw_other_overlay, а тот кладёт части соседа в MIDtable - * (ptr_add_table = &add_midtable, seg008:1507/1512), тогда как кусок сидит в - * objtable, который вливается в midtable при обходе СВОЕГО тайла. Обход идёт - * ряды 2,1,0, колонки 0..9 — значит сосед перекрывает кусок, если его тайл - * идёт в обходе ПОЗЖЕ, и весь порядок уже проверяется внутри - * other_overlay_tile; ему нужен лишь ориентир «тайл объекта». - * - * Именно этой половины и не хватало: плита, отвалившаяся от (0,2), накрывала - * собой переднюю кромку пола (0,3) — а вернуть её через ПЕРЕДНИЙ слой нельзя, - * у кнопки fore_id = 0 (сверено с tile_table оригинала, там то же самое). - * Найдено пользователем 2026-08-17, уровень 1 комната 12. - * - * Ориентир сохраняем и возвращаем: pop_bg_obj_* принадлежит текущему - * персонажу, и его читает ещё и mob_tick_one (решение defer). */ -void pop_mob_overlay_tile(int row, int col, int8_t oref_row, int8_t oref_col, - int mx, int my, uint8_t mh) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int8_t saved_row = pop_bg_obj_row, saved_col = pop_bg_obj_col; - pop_bg_obj_row = oref_row; - pop_bg_obj_col = oref_col; - /* ОКНО = прямоугольник самого КУСКА. Смысл оверлея — перекрыть кусок, а - * то, что лежит вне него, и так нарисовано правильным фоном. Даёт сразу - * три вещи: - * - рисуем в разы меньше пикселей (тайл соседа шириной 32 обрезается до - * перекрытия с куском); - * - куски тайла, вовсе не задевающие кусок, отсеиваются предфильтром - * pop_blit_b даром — это и есть вертикальный гейт, отдельного не надо; - * - ov_mark становится НЕ НУЖЕН: всё нарисованное внутри heal-коридора - * куска, а он чистится каждый кадр. - * Замер 2026-08-17: без окна оверлеи шести кусков давали +210 000 в циане - * и +130 000 в «ввод+heal» (объединение ov_mark на полкомнаты). */ - ov_suppress = 1; - pop_t_win_set(mx, my - (int)mh + 1 + POP_YOFF, 64, (uint8_t)(mh + 1)); - gfx_set_bank(GFX_BANK_SPRITE); - other_overlay_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); - pop_t_win_clear(); - ov_suppress = 0; - pop_bg_obj_row = saved_row; - pop_bg_obj_col = saved_col; -} - -/* Футпринт персонажа в тайлах (порт set_char_collision, seg006:0723). - * Общий счёт для любого Char (Кид, страж, скелет) — в оригинале это один - * код на всех. Результат — в файловых статиках, а не через 6 указателей: на Z80 такой - * возврат стоил бы дороже самой функции. */ -static int8_t fp_cL, fp_cR, fp_cLraw, fp_rT, fp_rB, fp_rTraw; - -static void char_footprint(int obj_x, int obj_y, uint16_t w, uint16_t h, - int8_t dir, uint8_t sword) -{ - int wh = (int)((w + 1) >> 1); /* char_width_half */ - int xl = obj_x / 2 + 58; /* char_x_left (58-база) */ - int xr; - int8_t cL, cR, cLraw, rT, rB, rTraw; - if (dir >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; - cLraw = col_from_x(xl); /* до клампа: <0 = футпринт за левым швом */ - cL = cLraw; if (cL < 0) cL = 0; else if (cL > 9) cL = 9; - cR = col_from_x(xr); if (cR < 0) cR = 0; else if (cR > 9) cR = 9; - /* redraw_at_char (seg003:0430): «If char is holding sword, it makes - * redraw-area bigger» — КЛИНОК торчит на колонку дальше габарита кадра, - * и без этого расширения передние грани в той колонке не - * перерисовываются: меч остаётся поверх столба, а его след — на фоне. */ - if (sword >= SWORD_2_DRAWN) { - if (dir >= 0) { if (++cR > 9) cR = 9; } - else { if (--cL < 0) cL = 0; } - } - /* Порт set_char_collision (seg006:0723): нижний ряд = y_to_row_mod4(obj_y), - * причём обёртка -1 (Kid НИЖЕ комнаты — climbdown/провал, obj_y в полосе - * «ряд 3») трактуется как ряд 3, НЕ ряд 0. Верхний ряд считается от - * char_top_y с ресетом в 0, если весь спрайт ниже комнаты (>=192). */ - { - int top_y = obj_y - (int)h + 1; - if (top_y >= 192) top_y = 0; - rT = y_to_row(top_y); - rB = y_to_row(obj_y); - if (rB == -1) rB = 3; /* обёртка → ряд 3 (ниже комнаты) */ - rTraw = rT; /* −1 = верх спрайта в полосе у потолка */ - } - /* single-room SprPoP: ряд 3 (комната снизу) в этом виде не рисуется → - * окклюдер спереди = ряд 2 (передняя грань пола, за которой нога). */ - if (rB < 0) rB = 0; else if (rB > 2) rB = 2; - if (rT < 0) rT = 0; else if (rT > 2) rT = 2; - /* Голова/руки почти всегда торчат в ряд НАД опорным (Kid выше тайла). - * y_to_row(верх спрайта) из-за +60-сдвига может схлопнуться в опорный - * ряд (rT==rB) — тогда ряд над ним не попадёт в перебор и его окклюдер - * (нижняя грань стены / кромка пола) не перерисуется поверх Kid. Форсим - * включение ряда rB-1. */ - if (rB > 0 && rT >= rB) rT = rB - 1; - fp_cL = cL; fp_cR = cR; fp_cLraw = cLraw; - fp_rT = rT; fp_rB = rB; fp_rTraw = rTraw; -} - -/* Передние грани тайлов и оверлеи ПОВЕРХ персонажа — ОДИН проход на всех - * Char. В оригинале add_kid_to_objtable (seg008:22F0) и - * add_guard_to_objtable (seg008:2324) имеют ИДЕНТИЧНОЕ тело и различаются - * только окном (loadkid/loadshad), типом объекта и спецкейсом тени у - * зеркала; redraw_at_char / redraw_at_char2 (seg003:0576/0645) гейтов по - * charid не имеют вовсе. - * - * До DRAW-CHAR тут стояли ДВА прохода — свой у Кида, свой у соперника, — и - * расхождение уже стоило бага: падающий скелет рисовался поверх верхней - * грани пола соседней колонки, потому что порт redraw_at_char2 был только у - * Кида. Тем же путём пошли бы тень (ур. 4/5/6/12), визирь (13) и толстяк - * (12) — поэтому проход сведён к одному. - * - * obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ спрайта, w/h — размер - * кадра; всё остальное берётся из самого персонажа (ch). Окно fore-клипа к - * этому моменту уже стоит: его задаёт тот, кто нарисовал спрайт. */ -/* Передний слой ОДНОГО тайла — вход для прохода по пометкам - * (pop_fore_needed). Без окна fore-клипа: пометка уже сузила работу до - * нужных тайлов, а кусок тайла обязан лечь целиком — у оригинала foretable - * ничем не режется. */ -void pop_fore_tile_b(int row, int col) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t saved = pop_t_fclip_on; - pop_t_fclip_on = 0; - fore_tile(row, col); - pop_t_fclip_on = saved; -} - -/* Передний слой полосы кладки У ПОТОЛКА (ряд −1) для ОДНОГО столбца — вход для - * прохода по пометкам (pop_fore_needed, ряд −1 идёт там последним). - * - * Тот же redraw_needed_above (seg008:0221), что и над персонажем: обход ряда −1 - * стоит в redraw_needed_tiles ПОСЛЕДНИМ, а его draw_tile_fore кладёт куски в - * foretable, то есть поверх midtable (там лежат падающие плиты) и поверх - * объектов. Без этого кусок, пролетающий у потолка, накрывает собой кромку - * потолка — физически невозможная картинка (найдено пользователем 2026-08-17, - * уровень 1 комната 6: плита (−1,5) перекрывала потолок (−1,6)). - * - * Окно — ровно полоса этого столбца: передние куски потолка живут в трёх - * верхних строках (dby = 2 при клипе по POP_YOFF), рисовать шире незачем. - * ov_mark — как у персонажа: полоса рисуется банком без тени, и на второй - * странице её надо будет восстановить (pop_fore_heal). */ -void pop_ceil_fore_tile_b(int col) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int x = POP_COL_XH[col] * 8; - /* ov_mark ЗДЕСЬ НЕ НУЖЕН, и это важно для бюджета. Передние куски потолка - * рисуются от dby = 2, то есть занимают строки 0..2 поля, а пометку ставит - * ТОЛЬКО падающий кусок, и только пока он до этих строк достаёт - * (mob_y <= 18) — значит нарисованное целиком лежит в его heal-коридоре - * (mob_y−18 .. mob_y+1), который чистится каждый кадр на своей странице. - * Пока ov_mark тут стоял, его объединение с оверлеями соседей - * растягивалось на полкомнаты и pop_fore_heal стоил 187 500 такта вместо - * 55 000 (замер 2026-08-17). */ - pop_t_clip_top = POP_YOFF; - pop_t_win_set(x, POP_YOFF, 64, CEIL_BAND_H); - ceil_over_kid_tile(col); - pop_t_win_clear(); - pop_t_clip_top = 0; -} - -/* Банк на ВЕСЬ проход пометок, а не на каждый тайл: помеченных тайлов за - * кадр бывает больше десятка, и две смены банка на каждый — заметная доля - * прохода, который сам по себе дешёвый. */ -void pop_fore_pass_begin(void) __banked { gfx_set_bank(GFX_BANK_SPRITE); } -void pop_fore_pass_end(void) __banked { gfx_set_bank(GFX_BANK_NORMAL); } - -void pop_fore_over_char(const pop_char_t *ch, int obj_x, int obj_y, - uint16_t w, uint16_t h) __banked -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - int8_t cL, cR, cLraw, rT, rB, rTraw, r, c; - uint8_t frame = ch->frame, action = ch->action; - pop_t_fclip_on = 1; /* окно = прямоугольник спрайта */ - char_footprint(obj_x, obj_y, w, h, ch->direction, ch->sword); - pop_dbg_b1(); /* ЗАМЕР: char_footprint */ - pop_dbg_rdmax[1] = pop_dbg_rdmax[2] = pop_dbg_rdmax[3] = 0; /* ВРЕМЕННО */ - /* Футпринт считается по КАДРУ персонажа (char_x_left/right, seg006:1021) - * и потому УЖЕ спрайта, а рядом с ним рисуются ещё клинок и «брызги» - * удара — они уходят ВПЕРЁД-ВВЕРХ и запросто попадают в соседнюю - * колонку или ряд выше. Оригинал этим не страдает: он помечает тайлы - * на перерисовку и рисует foretable целиком, а у нас проход сужен окном - * ради скорости (см. pop_fore_layer_cost). Поэтому перебор расширяется - * САМИМ ОКНОМ fore-клипа — оно и есть объединение «персонаж + клинок + - * брызги», считать его второй раз не надо. */ - /* Границы считаются АРИФМЕТИКОЙ, а не перебором всех колонок и рядов. - * Условие монотонно по номеру (x0 растёт), значит принятые номера идут - * подряд — хватает первого и последнего. Перебор стоил 38 970 тактов на - * кадр (замер MAME): тринадцать итераций, в каждой пара 16-битных - * ЗНАКОВЫХ сверок, а SDCC пишет их через `jp PO / xor 0x80 / jp P`. */ - if (pop_t_fclip_x1 > pop_t_fclip_x0 && pop_t_fclip_y1 > pop_t_fclip_y0) { - int8_t lo, hi; - /* Колонки: x0 = POP_COL_XH[c]*8 = 32*c (таблица линейна, шаг 4). - * 32c + 40 > x0 -> c >= floor((x0−40)/32) + 1 - * 32c < x1 -> c <= ceil(x1/32) − 1 - * Сдвиг вправо у SDCC z80 для int — арифметический, то есть floor и - * для отрицательных; на это здесь и рассчитано. */ - lo = (int8_t)(((pop_t_fclip_x0 - 40) >> 5) + 1); - hi = (int8_t)((((pop_t_fclip_x1 + 31) >> 5)) - 1); - if (lo < 0) lo = 0; - if (hi > 9) hi = 9; - if (lo <= hi) { - if (lo < fp_cL) fp_cL = lo; - if (hi > fp_cR) fp_cR = hi; - } - /* Ряды: y0 = POP_YOFF + 63*r, r только 0..2 — деления на 63 не надо, - * достаточно сравнить с границами полос. - * 63r > y0 − POP_YOFF − 70 и 63r < y1 − POP_YOFF + 8 */ - { - /* Ряды — величина ЛОГИЧЕСКАЯ, поэтому по логической рамке. */ - int a = pop_t_fclip_ly0 - POP_YOFF - 70; - int b = pop_t_fclip_ly1 - POP_YOFF + 8; - lo = a < 0 ? 0 : (a < 63 ? 1 : 2); - hi = b > 126 ? 2 : (b > 63 ? 1 : 0); - if (a < 126 && b > 0 && lo <= hi) { - if (lo < fp_rT) fp_rT = lo; - if (hi > fp_rB) fp_rB = hi; - } - } - } - pop_dbg_b2(); /* ЗАМЕР: границы окна */ - cL = fp_cL; cR = fp_cR; cLraw = fp_cLraw; - rT = fp_rT; rB = fp_rB; rTraw = fp_rTraw; - /* set_objtile_at_char (seg006:1833): тайл, при обработке которого спрайт - * попадает в midtable — база порядка окклюзии в other_overlay_tile. - * run_jump (action 1) — нижний ряд/левая колонка габарита; вис/полёт/ - * подъём — колонка на одну ЛЕВЕЕ curr_col. */ - pop_bg_obj_row = ch->curr_row; - pop_bg_obj_col = ch->curr_col; - if (action == 1) { pop_bg_obj_row = rB; pop_bg_obj_col = cL; } - if ((frame >= 135 && frame < 149) || - action == 2 || action == 3 || action == 4 || action == 6) - pop_bg_obj_col--; - gfx_set_bank(GFX_BANK_SPRITE); /* видео-ОЗУ, heal восстановит */ - /* Шовная окклюзия ворот (порт redraw_at_char для шва): футпринт зашёл за - * ЛЕВЫЙ шов (cLraw<0) и у соседа слева в этом ряду решётка ворот (код 4) — - * перерисовать её бары ПОВЕРХ персонажа. Иначе он, стоя за закрытыми - * воротами (col-1), рисуется поверх решётки. Бары = draw_gate_back по - * живому modif соседа (pop_t_lbg = lcol_bg, openness). */ - if (cLraw < 0 && pop_t_lfg) - for (r = rT; r <= rB; r++) - if ((pop_t_lfg[r] & 0x1F) == 4) { - int dby = 63 * r + 65; - draw_gate_back(pop_t_lbg ? pop_t_lbg[r] : 0, POP_COL_XH[0], dby, dby - 3); - } - if (frame >= 137 && frame <= 144) { /* подъём: пол назначения поверх него */ - uint8_t fidx = (uint8_t)(frame - 137); - for (r = rT; r <= rB; r++) - for (c = cL; c <= cR; c++) - climb_overlay_tile(r, c, fidx); - } else { - /* redraw_at_char2 (seg003:449) — путь set_redraw2/draw_other_overlay: - * тело пола на кромке перекрывает Kid в позах захвата (78-79), виса - * (action 2/6), полёта (3/4) и старта падения (bumped 102-106). - * Верхний ряд — всегда; опорный — кроме action 2 (hang_climb). */ - uint8_t do_ov = 0; - if (frame >= 78 && frame < 80) do_ov = 1; /* захват */ - else if (action == 2 || action == 3 || action == 4 || action == 6) do_ov = 1; - else if (action == 5 && frame >= 102 && frame <= 106) do_ov = 1; - else if (frame == 135 || frame == 136) do_ov = 1; /* начало подъёма (SEQ_UP */ - /* на 141 — до него Kid ещё */ - /* в ряду 1 ПОД полом [0,3]) */ - if (do_ov) { - /* ВЕСЬ диапазон рядов, а не только два крайних. В оригинале - * (redraw_at_char2, seg003:0645) стоит ровно два вызова — - * char_bottom_row и char_top_row, — и этого хватает, потому что - * там они ВСЕГДА соседние. У нас между ними бывает пропуск: - * char_footprint форсит rT = rB−1 (голова торчит в ряд выше), а - * потом окно fore-клипа расширяет rB ещё на ряд вниз — rT=0, - * rB=2 давали обход рядов 0 и 2 МИМО ряда 1. - * - * Ровно так терялась передняя грань пола у Кида, спрыгнувшего с - * кромки: кадр 103, action 3, ряд по y = 1, а обход шёл по 0 и 2 - * (трасса MAME 2026-08-13: rT=0 rB=2 cL=0 cR=1, ни одного вызова - * overlay_mid_tile). Глубже в падении y_to_row давал уже 2, ряд - * 1 попадал в пару крайних — и плита вдруг начинала рисоваться - * правильно, что и было видно глазом (JUMP-FLOOR-LEGS). */ - for (c = cR; c >= cL; c--) { - int8_t r2; - for (r2 = rB; r2 >= rT; r2--) { - /* seg003:0645: при hang_climb опорный ряд НЕ трогаем. */ - if (r2 == rB && action == 2) continue; - other_overlay_tile(r2, c); - } - } - } - } - pop_dbg_b3(); /* ЗАМЕР: оверлеи сделаны */ - /* draw_tile_fore (seg008:690) — foretable, рисуется ПОСЛЕ midtable, т.е. - * ПОСЛЕ оверлеев выше: передняя грань колонны перекрывает скос пола - * (floor_left_overlay), а не наоборот. Раньше fore шёл первым, и тёмный - * скос ложился поверх колонны — «тень у её основания». */ - for (r = rT; r <= rB; r++) - for (c = cL; c <= cR; c++) - fore_tile(r, c); - /* Первое условие draw_tile_fore (seg008:0D15): персонаж СТОИТ на тайле - * ворот — их решётка возвращается поверх него. Решение приняла карта - * (pop_gate_over_char, разбор там же); здесь остаётся отрисовка. Бары - * рисуются в колонке curr_col+1: графика ворот принадлежит ПРАВОМУ краю - * своего тайла и в оригинале кладётся в проходе следующей колонки. - * - * Один вызов через трамплин на персонажа за кадр — не в тайловом цикле: - * тайл-кандидат всегда ровно один, а fore-проход и так самый горячий - * кусок кадра (memory pop_fore_layer_cost). */ - pop_dbg_b4(); /* ЗАМЕР: цикл fore_tile */ - if (pop_gate_over_char(ch)) { - int8_t gr = ch->curr_row, gc = (int8_t)(ch->curr_col + 1); - if (tile_in_fclip(gr, gc)) { - int dby = 63 * gr + 65; - draw_gate_fore(pop_t_bg ? pop_t_bg[gr * 10 + ch->curr_col] : 0, - POP_COL_XH[gc], dby, dby - 3); - } - } - /* redraw_needed_above (seg008:0221): полоса кладки У ПОТОЛКА (ряд −1 = - * ряд 2 комнаты сверху). В оригинале она рисуется в самом конце обхода - * тайлов — ПОСЛЕ объектов, т.е. поверх персонажа (redraw_frames_above, - * куда set_redraw* уводит отрицательные tilepos). Без этого руки Kid, - * прыгающего в ряду 0, лезли поверх потолка. */ - if (rTraw < 0) { - pop_t_clip_top = POP_YOFF; - for (c = cL; c <= cR; c++) { - ov_mark(POP_COL_XH[c] * 8, 0, 64, CEIL_BAND_H); - ceil_over_kid_tile(c); - } - pop_t_clip_top = 0; - } - gfx_set_bank(GFX_BANK_NORMAL); - pop_t_fclip_on = 0; -} diff --git a/applications/SprPoP/src/pop_bg.h b/applications/SprPoP/src/pop_bg.h deleted file mode 100644 index c35bb14..0000000 --- a/applications/SprPoP/src/pop_bg.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * pop_bg.h — отрисовка СТАТИЧЕСКОГО фона комнаты PoP композицией слоёв - * (порт seg008.c draw_tile/wall_pattern, Шаг 3). Рисует прямо в текущую - * страницу (banked GFX_BANK_TRANSPARENT — в видео-ОЗУ + теневую копию, - * 0xFF прозрачен), ОДИН раз при входе в комнату. - * - * Данные: getimage-спрайты в атласах pop_env0..4/pop_wall/pop_fore - * (toolchain/pop_pack_bg.py), палитра pop_bg.pal. Прямая адресация - * id: env[id>>5] idx id&31, wall idx=id, fore idx=id — ноль remap-таблиц. - */ -#ifndef POP_BG_H -#define POP_BG_H - -#include -#include "pop_char.h" /* pop_char_t — общий проход отрисовки поверх Char */ -#include "pop_qsave.h" - -/* ---- Вертикальный layout (PoP-экран 320×200 в нашем 320×256) --------- * - * Игровой экран 200px центрируем по высоте: сдвиг всего рисунка вниз на - * POP_YOFF = (256-200)/2 = 28px (чёрные борта сверху/снизу). Внутри 200px - * верхние POP_PLAYFIELD_H = 192 — поле тайлов/спрайтов (комната = 3 ряда), - * нижние 8 — статус-полоса (жизни/сообщения): тайлы/спрайты туда НЕ лезут. - * Сдвиг применяется на границе примитивов (blit/heal) — логика рисования - * остаётся в «room-space» y=0..191. */ -#define POP_YOFF 28 -#define POP_PLAYFIELD_H 192 -/* Экранный y нижней границы поля (ниже — статус-полоса + борт → клип). */ -#define POP_CLIP_BOTTOM (POP_YOFF + POP_PLAYFIELD_H) - -/* Экранный верх прямоугольника при ПЕРЕВОРОТЕ (зелье инверсии): поле - * отражается внутри себя, борта не трогаются. ОДНА формула на весь порт — - * блит тайла, heal точечных перерисовок и чёрные плиты обязаны считать - * одинаково, иначе стираем в одном месте, а рисуем в другом (именно так - * ломались чомперы и решётка). Зеркалит ВЫЗЫВАЮЩИЙ; у примитивов libbgi - * семантика координат не меняется. */ -#define POP_FLIP_TOP(top, h) (2 * POP_YOFF + POP_PLAYFIELD_H - (top) - (int)(h)) - -/* Выбор ядра libbgi (pop_onscreen_cols / pop_heal_fast) переехал в - * `_pop_draw.h` — его включают только три рисующих модуля. Из общего - * заголовка SDCC размножал мёртвые копии этих inline'ов по всем TU: см. - * шапку `_pop_draw.h`. */ - -/* Загрузить 7 атласов фона. Звать ДО initgraph (как poc.c — atlas_load - * трогает W3; проверенный порядок). Палитру pop_bg.pal грузит ПРИЛОЖЕНИЕ - * после initgraph (gfx_pal_fload). 0 — OK, -1 — ошибка. */ -int pop_bg_load(uint8_t set) __banked; /* 0 подземелье, 1 дворец */ -/* Пере-применить 32 записи палитры текущего тайлсета (env 0x50, wall 0x60). - * Звать после gfx_pal_fload(kid.pal): та собрана из VDUNGEON и затирает их. */ -int pop_bg_pal_apply(void) __banked; - -/* Освободить EMM-страницы атласов. */ -void pop_bg_free(void) __banked; - -/* Нарисовать комнату: fg[30]/bg[30] — foretable-коды/backtable-модификаторы - * (по строкам, row*10+col). lcol_fg/lcol_bg — 3 тайла правого столбца - * ЛЕВОЙ соседней комнаты (для границы, напр. решётки ворот), или 0 — - * тогда левая кромка = стена. room_num — номер комнаты (зерно стен). */ -void pop_room_draw(uint8_t room_num, - const uint8_t *fg, const uint8_t *bg, - const uint8_t *lcol_fg, const uint8_t *lcol_bg) __banked; - -/* Задать ряд 0 комнаты СНИЗУ — для draw_tile_topright, когда тайл нижнего - * ряда стал empty (после падения loose): «стена вниз» рисуется по коду - * room_B(0, col-1). ОДИННАДЦАТЬ байт: [0..9] — колонки комнаты снизу, - * [10] — тайл (0,9) комнаты СНИЗУ-СЛЕВА (сосед угла (2,0); см. - * load_rowbelow, seg008:368). 0 — нет комнаты снизу. */ -/* НЕ __banked: тело в резиденте (pop_tile.c) — из банка зовётся прямым call. */ -void pop_room_set_below(const uint8_t *below_row0_fg) __banked; - -/* Задать ряд 2 (fg-коды + модификаторы, 10 шт.) комнаты СВЕРХУ — для полосы - * кладки у потолка (seg008 draw_room доп. верхний ряд из room_A). 0 — нет - * комнаты сверху (кромка уровня → пол). */ -void pop_room_set_above(const uint8_t *above_row2_fg, const uint8_t *above_row2_mod) __banked; - -/* Перерисовать передний слой (fore) и оверлеи тайлов ПОВЕРХ персонажа — - * ОДИН проход на всех Char (Кид, страж, скелет, дальше тень/визирь): в - * оригинале add_kid_to_objtable и add_guard_to_objtable имеют одинаковое - * тело, а redraw_at_char/redraw_at_char2 гейтов по charid не имеют. - * Звать ПОСЛЕ отрисовки спрайта, когда окно fore-клипа уже стоит - * (pop_fore_set_clip) — перебор тайлов расширяется по нему. - * - * ch — персонаж (Kid/Guard): из него берутся direction/sword/frame/action и - * curr_col/curr_row. obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ - * спрайта, w/h — размер кадра. См. redraw_at_char/set_char_collision. */ -void pop_fore_over_char(const pop_char_t *ch, int obj_x, int obj_y, - uint16_t w, uint16_t h) __banked; - -/* Окно fore-слоя: прямоугольник СПРАЙТА (экранные координаты, y уже с - * POP_YOFF), поверх которого fore-проход возвращает куски тайлов. Ставит - * тот, кто нарисовал спрайт (pop_char_draw) — он один знает - * итоговый габарит (у Kid — с учётом клинка и обрезки clip_char). Вне - * fore-проходов окно игнорируется: фон рисуется целиком. Мотивация и - * замер — в pop_bg.c у fclip_on. */ -void pop_fore_set_clip(int x, int y, int w, int h); - -/* Восстановить фон там, где в прошлых кадрах рисовался ОВЕРЛЕЙ - * (draw_other_overlay/floor_overlay/полоса потолка): он выходит за - * прямоугольник персонажа, поэтому его heal этого не убирает — на второй - * странице дабл-буфера остаётся след и мерцает. Звать рядом с - * pop_char_heal. */ -void pop_fore_heal(void) __banked; - -/* Loose floors — динамическая отрисовка (состояние pop_loose_modif в - * pop_map). Звать на ТЕКУЩЕЙ (back) странице из pop_loose_tick. - * shake_draw — дрожащий кадр (heal+SPRITE); bake_empty — запечь пустоту - * после падения (NORMAL, в ОЗУ-копию). */ -void pop_loose_shake_draw(int row, int col) __banked; -void pop_loose_bake_empty(int row, int col) __banked; - -/* Плита-ПОТОЛОК (loose ряда 2 комнаты СВЕРХУ, наш ряд −1): дрожащий кадр в - * полосе у потолка / «запечь» пустоту (колодец наверх) после провала. - * Состояние — pop_ceil_modif[10] в pop_map. */ -void pop_ceil_shake_draw(int col) __banked; -void pop_ceil_bake_empty(int col) __banked; - -/* Кусок приземлился (loose_land) — переехал в pop_state.h: переменную - * читают по обе стороны банковой границы. */ -#include "pop_state.h" - -/* Пики (spike) — перерисовка тайла (row,col) на back-странице по живому - * modif (pop_trob). Звать из pop_process_trobs. См. pop_bg.c. */ -void pop_spike_redraw(int row, int col) __banked; - -/* Чомпер — то же самое для его кадра анимации (все куски в СВОЕЙ ячейке, - * поэтому соседа перерисовывать не надо). */ -void pop_chomp_redraw(int row, int col) __banked; - -/* Вернуть ТОЛЬКО слой anim чомпера — его собственную графику поверх свежего - * пламени соседнего факела. Порт ветки redraw_frames_anim в redraw_needed - * (seg008:0211): оригинал на такую пометку делает ровно три вызова — - * draw_tile_anim_topright / draw_tile_anim_right / draw_tile_anim — и НЕ - * делает ни wipe, ни полного draw_tile (wipe у него отдельный счётчик). - * - * Из этих трёх нам нужен один: topright — про верх ВОРОТ под пустой - * клеткой, к чомперу не относится, а anim_right (пламя левого соседа) у нас - * уже нарисован — pop_torch_draw запекает его в фон ДО redraw_needed. */ -void pop_chomp_anim_draw(int row, int col) __banked; - -/* Анимация факела/зелья (динамика каждый кадр; фон запечён без них): - * modif — живой room_modif тайла. Для факела col — колонка САМОГО факела - * (пламя рисуется в ячейке правого соседа). */ -void pop_torch_draw(int row, int col, uint8_t modif) __banked; - -/* Стереть запечённое пламя факела с текущей draw-страницы (фон покоя). - * Нужно перевороту экрана: иначе отражение растаскивает языки огня по - * комнате — подробности в pop_room.c. */ -void pop_torch_wipe(int row, int col) __banked; -void pop_potion_draw(int row, int col, uint8_t modif) __banked; - -/* Ворота на ЛЕВОМ шве (col0) — перерисовать по живому modif соседа слева. - * g_lbg (lcol_bg) должен быть обновлён вызывающим. Звать из основного цикла - * на back-странице, когда сосед слева анимируется. См. pop_bg.c. */ -void pop_room_redraw_seam_left(uint8_t rows) __banked; /* rows = маска рядов 0..2 */ - -/* Перерисовать ПОЛ тайла (row,col) + правую грань в соседе на back-странице - * (wipe по площади пола, БЕЗ стены ряда ниже). Для смены тайла на месте: - * кнопка нажата/отжата, floor → debris от упавшей плиты. */ -void pop_floor_bake(int row, int col) __banked; -void pop_button_redraw(int row, int col) __banked; /* = pop_floor_bake (кнопка) */ - -/* Дверь уровня: перерисовать её ПРАВУЮ половину (row, col = правая) с - * запечкой — створка анимируется (pop_trob animate_leveldoor). */ -void pop_leveldoor_redraw(int row, int col) __banked; - -/* Ворота ВНУТРИ отрисованной комнаты: перерисовать по живому modif. - * (row,col) — координаты САМИХ ворот; бары рисует ячейка правого соседа - * (draw_tile, ветка lcode==4), туда и идёт wipe+redraw. Порт draw_trob - * (seg007:01E6), которым заканчивается animate_door. */ -void pop_gate_redraw(int row, int col) __banked; - -/* Падающий кусок loose (mob, seg007 move_loose): спавн при падении тайла - * (row,col) и покадровое продвижение+отрисовка на back-странице. tick - * зовётся каждый кадр (внутри pop_loose_tick); клип низа делает clip. */ -void pop_loose_mob_spawn(int row, int col) __banked; -/* То же, но в ЯВНО заданной комнате: плита, расшатанная Кидом и брошенная - * (он ушёл в соседнюю комнату), доваливается сама — см. animate_loose в - * pop_trob.c. Дальше кусок летит обычным путём: mob_tick_one умеет чужую - * комнату (mob_tile_at читает уровень, посадку сигналит pop_loose_exit). */ -void pop_loose_mob_spawn_at(uint8_t room, int row, int col) __banked; -void pop_loose_mob_tick(void) __banked; -void pop_loose_mob_reset(void) __banked; /* убрать все куски (СТАРТ УРОВНЯ, mobs_count=0) */ -void pop_loose_mob_qsave(pop_qs_io_t *io) __banked; - -/* Забыть, на какой странице сделана первая запечка тайлов (см. bake_copy в - * pop_room.c). Звать при смене комнаты/уровня: номера тайлов повторяются, и - * первый же тайл с тем же номером получил бы копию вместо честной запечки. */ -void pop_bake_forget(void) __banked; - -/* Передний слой полосы кладки у потолка (ряд −1) для одного столбца — зовёт - * проход по пометкам, ряд −1 в нём последний (порт redraw_needed_above + - * порядка redraw_needed_tiles, seg008:1B06). */ -void pop_ceil_fore_tile_b(int col) __banked; - -/* Оверлей тайла (row,col) ПОВЕРХ падающего куска, чей тайл — (oref_row, - * oref_col): порт set_redraw2 из draw_mob (seg007:1149). Порядок обхода - * проверяется внутри. */ -void pop_mob_overlay_tile(int row, int col, int8_t oref_row, int8_t oref_col, - int mx, int my, uint8_t mh) __banked; - -/* Смена комнаты: куски продолжают падать в СВОИХ комнатах (do_mobs крутит - * mobs[] независимо от drawn_room), сбрасывается только heal-история. */ -void pop_loose_mob_room_changed(void) __banked; - -/* Кусок НИЖЕ Kid по obj_y → рисуется ПОВЕРХ него (порт sort_curr_objs, - * seg008:1561). Звать после отрисовки персонажей, перед fore-слоем. */ -/* Отрисовка падающих кусков, идущих ПОД Kid. Звать ПОСЛЕ pop_redraw_needed() - * — фон кадра обязан быть готов до любого спрайта. */ -/* Передний слой ОДНОГО тайла — зовёт pop_fore_needed (pop_redraw.c). */ -void pop_fore_tile_b(int row, int col) __banked; -void pop_fore_pass_begin(void) __banked; -void pop_fore_pass_end(void) __banked; - -void pop_loose_mob_draw(void) __banked; -void pop_loose_mob_draw_over(void) __banked; - -/* Позиция куска (колонка, y низа) для check_loose_fall_on_kid. 0 — нет. */ -uint8_t pop_loose_mob_pos(int *col, int *y) __banked; - -/* Детектор выхода спрайта за поле: если спрайт [x,w] с ЭКРАННЫМ верхом - * sy_top и высотой h заходит ниже поля (статус-полоса/борт) или выше - * верхнего борта — взводит внутренний флаг «борта грязные» на 2 кадра. - * Звать СРАЗУ после блита падающего объекта (Kid/кусок). */ -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked; - -/* Почистить борта (верхний + статус-полоса/нижний) — но ТОЛЬКО в кадрах, - * где кто-то реально вышел за поле (гейт по флагу от pop_clip_sprite): - * даром в покое, O(1) при падении (не зависит от числа спрайтов). Звать - * КАЖДЫЙ кадр ПОСЛЕ персонажей и fore на back-странице. */ -void pop_room_clip_borders(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_cdraw.c b/applications/SprPoP/src/pop_cdraw.c deleted file mode 100644 index 1f1ecc3..0000000 --- a/applications/SprPoP/src/pop_cdraw.c +++ /dev/null @@ -1,1085 +0,0 @@ -/* - * pop_cdraw.c — ОТРИСОВКА ПЕРСОНАЖЕЙ (Кид, страж, скелет; дальше тень, - * визирь, толстяк) + полоса HP. Банк 4. - * - * Одно тело на всех Char — порт add_kid_to_objtable/add_guard_to_objtable - * (seg008:22F0/2324), различия сведены к слоту; мотивация и порядок вызовов - * в кадре — в шапке pop_cdraw.h. До DRAW-CHAR это были kid_draw в - * резиденте и pop_guard_draw здесь же, каждый со своей математикой кадра, - * своими heal-прямоугольниками и своим проходом окклюзии. - * - * Почему банк, а не резидент: зовёт только главный цикл (раз в кадр на - * персонажа), горячих банк→банк переходов отсюда нет, а резидентное - * пространство W1+W2 делят код и данные — килобайт кода, уехавший в банк, - * это килобайт для кучи. Писучие статики банкового модуля (--dataseg не - * задаём) остаются в обычном _DATA, то есть в W2: pop_cd читают и физика, и - * фон из СВОИХ банков — без трамплина, обычной адресацией. - */ -#include -#include -#include -#include "pop_arc.h" -#include "guard_arc.h" -#include "skel_arc.h" -#include "vizier_arc.h" -#include "pop_guard.h" -#include "pop_kid.h" -#include "_pop_kdraw.h" -#include "pop_vflip.h" /* зеркальные страницы атласов (зелье инверсии) */ /* меч + блит по id — сосед по банку 4 */ /* атласы/кадр Кида, pop_sword_draw, окна Char */ -#include "pop_cdraw.h" -#include "pop_status.h" -#include "pop_ui.h" /* POP_COL_OUTSIDE — фон вне игрового поля */ -#include "pop_shadow.h" /* запечённый набор Тени */ -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_state.h" /* ВРЕМЕННО: зонды pop_dbg_b* */ -#include "pop_bg.h" /* POP_YOFF, pop_fore_over_char, pop_fore_set_clip */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_map.h" /* hitp_curr/hitp_max — HP Кида; clip_char */ -#include "pop_level.h" /* тип соперника уровня (набор спрайтов) */ -#include "pop_tile.h" /* pop_heal_off — клип тени/отражения через фон */ -#include "kid_data.h" -#include "pop_guard_pal.h" /* таблица палитр стражей (сгенерена упаковщиком) */ - -/* Последний curr_guard_color обычного стража (0 — цвет ещё не выбирали). - * Нужен pop_guard_pal_apply, чтобы восстановить слоты после kid.pal. */ -static uint8_t guard_pal_cur; - -/* 16 слотов POP_GUARD_PAL_BASE в ОБЕ палитры дабл-буфера. - * Таблицы — rodata ЭТОГО модуля, то есть страница банка (0xC000+), а - * gfx_pal_load отдаёт указатель в BIOS ($A4 через rst #0x08). BIOS читает - * только #4000-#BFFF (см. корневой CLAUDE.md), поэтому копируем запись в - * локальный буфер — стек гарантированно в W2. Без копии BIOS забирал - * мусор с чужой страницы и страж становился невидимым. */ -static void pal_load16(const uint8_t *src) -{ - uint8_t buf[64]; - uint8_t i; - for (i = 0; i < 64; i++) buf[i] = src[i]; - gfx_pal_load(0, POP_GUARD_PAL_BASE, 16, buf); - gfx_pal_load(1, POP_GUARD_PAL_BASE, 16, buf); -} - -/* Цвет стража (set_chtab_palette, seg003:257). Оригинал держит ОДИН набор - * спрайтов и подменяет 16 цветов палитры chtab_5 по level.guards_color — - * так на уровне 2 стражи комнат 4/7/11/15/24 разного цвета (1/3/1/1/6). - * Полоса HP стража рисуется тем же атласом, поэтому меняется заодно. - * color = 0 — палитру не трогаем (оригинал в этом случае set_chtab_palette - * не зовёт: тип уровня не «обычный страж»). - * Грузим В ОБЕ палитры: у страниц дабл-буфера они раздельные. */ -void pop_guard_set_palette(uint8_t color) __banked -{ - if (color == 0 || color > POP_GUARD_NPAL) return; - guard_pal_cur = color; /* curr_guard_color, для re-apply */ - pal_load16(pop_guard_pal[color - 1]); -} - -/* Пере-применить палитру ТЕКУЩЕГО набора соперника — пара к - * pop_bg_pal_apply/pop_shadow_pal_apply. Слоты 0x90..0x9F динамические: - * общий kid.pal содержит все 256 записей и затирает их палитрой обычного - * стража (цвет 2, тот что запёк упаковщик). Поэтому КАЖДЫЙ file-load - * логической палитры обязан доплатить этот диапазон, иначе скелет (и - * Джафар) остаются в цвете стража: у скелета все пиксели индекса 3, а это - * слот 0x93 = розовый цвет стража — ровно то, что было видно на уровне 3. - * Звать из pop_pal_* ДО snapshot. */ -void pop_guard_pal_apply(void) __banked -{ - int8_t type = pop_level_guard_type(pop_current_level); - if (type == 2 || type == 3) { /* свой цвет — из файла набора */ - pal_load16((type == 2) ? pop_skel_pal : pop_vizier_pal); - } else if (type == 0 && guard_pal_cur != 0) { - pal_load16(pop_guard_pal[guard_pal_cur - 1]); - } -} - -/* ---- Атласы стража (chtab_5, база 750): g[id>>3], idx id&7 ---------- */ -#define GUARD_PAGES 5 -static atlas_t gp[GUARD_PAGES]; -static uint8_t g_ok; - -/* Состояние отрисовки по слотам (см. pop_cdraw.h): heal-прямоугольники по - * страницам дабл-буфера, габарит кадра и окно fore-клипа. */ -pop_cdraw_t pop_cd[POP_CH_N]; - -/* «Брызги» урона Кида — спрайт chtab_2 id 218 (res619.png, в наших атласах - * страница 27). У соперника это image 1 его собственного набора. */ -#define KID_SPLASH_IMAGE 218 - -/* Набор спрайтов соперника выбирает ТИП УРОВНЯ (load_lev_spr, seg000:1092): - * tbl_guard_type = {0 guard, 1 fat, 2 skeleton, 3 vizier, 4 shadow, −1 нет}. - * У нас пока два набора: обычный страж (уровни 1-2) и скелет (уровень 3); - * у скелета и кадров меньше (28 против 34), поэтому пятую страницу он не - * грузит. Уровень БЕЗ соперников (type < 0) не грузит ничего. */ -int pop_guard_load(void) __banked -{ - uint8_t tbl[ARC_GUARD_COUNT * POP_ARC_REC]; /* самый крупный из трёх */ - pop_arc_t arc; - int8_t type = pop_level_guard_type(pop_current_level); - uint8_t i, pages, count, id; - - if (type < 0) return 0; /* соперников на уровне нет */ - /* Наборы разложены по своим архивам, а не в один: имена внутри у них - * совпадают (g0.atl у всех троих), да и грузится всегда ровно один. */ - if (type == 2) { id = POP_ARC_SKEL; count = ARC_SKEL_COUNT; - pages = ARC_SKEL_COUNT; } - else if (type == 3) { id = POP_ARC_VIZIER; count = ARC_VIZIER_COUNT; - pages = ARC_VIZIER_COUNT; } - else { id = POP_ARC_GUARD; count = ARC_GUARD_COUNT; - pages = GUARD_PAGES; } - if (pages > GUARD_PAGES) pages = GUARD_PAGES; - if (pop_arc_open_id(&arc, id, tbl, count) < 0) return -1; - for (i = 0; i < pages; i++) - if (pop_arc_atlas(&arc, tbl, i, &gp[i]) != 0) { - pop_arc_close(&arc); - return -1; - } - pop_arc_close(&arc); - g_ok = 1; -/* Цвет: у скелета он СВОЙ (палитра из его набора), у стража подменяется - * из res10.bin по guards_color — это делает pop_guard_set_palette при - * входе в комнату (seg002:186: у не-guard curr_guard_color = 0). */ - pop_guard_pal_apply(); - return 0; -} - -/* Зеркальный набор соперника — пара к pop_guard_load: те же страницы, но - * файлы *_v.atl (см. pop_vflip.h). Здесь, а не в загрузчике набора, - * потому что gp[] и выбор GUARD/SKEL живут именно тут. */ -int pop_guard_vflip_load(void) __banked -{ - uint8_t tbl[ARC_GUARD_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t type = pop_level_guard_type(pop_current_level); - uint8_t i; - int res = 0; - - if (type < 0 || !g_ok) return 0; /* соперников на уровне нет */ - /* Зеркала есть ТОЛЬКО у обычного стража: зелье инверсии — уровень 9, а - * там tbl_guard_type = 0 (у скелета и Джафара своих *_v нет вовсе). */ - if (type != 0 && type != 1) return 0; - if (pop_arc_open_id(&arc, POP_ARC_GUARD, tbl, ARC_GUARD_COUNT) < 0) - return -1; - for (i = 0; i < GUARD_PAGES; i++) { - atlas_t m; - - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_GUARD_G0_V + i), &m) != 0 || - pop_vflip_take(&gp[i], &m) != 0) { - res = -1; - break; - } - } - pop_arc_close(&arc); - return res; -} - -void pop_guard_free(void) __banked -{ - uint8_t i; - if (!g_ok) return; - for (i = 0; i < GUARD_PAGES; i++) atlas_free(&gp[i]); - g_ok = 0; -} - -/* ---- calc_screen_x_coord (seg008:2602) БЕЗ деления ------------------- * - * - * Логическая X (280 шир = 28px/тайл) -> экранная (320 = 32px/тайл): ×8/7. - * SDLPoP пишет это как `logical_x*320/280`, у нас SDCC разворачивал в - * `__divsint` — 2 400 тактов на вызов, и зовётся оно на КАЖДОГО персонажа - * КАЖДЫЙ кадр (последнее деление, остававшееся в горячем пути). - * - * ХРАНИМ x/7 БАЙТОМ, а не готовое x*8/7 словом. Тождество: 8x/7 == x + x/7 - * (7x делится нацело, поэтому усечение обеих частей совпадает — и для - * отрицательных с трункейтом к нулю тоже). Оба варианта собраны и - * посчитаны по сгенерированному asm: - * - * int16_t готовое: ... add hl,hl / add hl,de / ld e,(hl) / inc hl / - * ld d,(hl) = 132 такта, 2 304 байта - * int8_t x/7: ... add hl,bc / ld a,(hl) / ld l,a / rlca / sbc a,a / - * ld h,a / add hl,de = 131 такт, 1 152 байта - * - * Расширение знака и 16-битное сложение стоят РОВНО столько же, сколько - * лишний `add hl,hl` при двухбайтном индексе, а чтение из памяти на одно - * меньше — под wait-state'ами Sprinter (такт ≈ 2,4× номинала на обращениях - * к ОЗУ) байтовый вариант даже чуть выгоднее номинала. Плюс килобайт - * банка, который в pop_cdraw ещё понадобится. - * - * ДИАПАЗОН — весь, а не «обычный случай». Отрицательные X реальны: - * obj_x = 2*fwd − 116 уходит в минус, как только fwd < 58 (левее - * x_bump[5]), то есть у левой кромки комнаты — это не экзотика. По - * фактическим данным кадров (kid.ani: dx Кида −5..+10, стража - * −2..+10) при x типа uint8_t и render_dx ∈ {−140, 0, +140} полный - * диапазон obj_x = −416..695; таблица кроет −448..703 с запасом. - * Деление ниже поэтому недостижимо и оставлено страховкой на случай - * третьего персонажа или другого render_dx. - * - * SCRX7[x + SCRX_BIAS] == x/7 (усечение к нулю, как в C и как у 8086 idiv - * в оригинале); экранная X = x + SCRX7[...]. */ -#define SCRX_BIAS 448 -#define SCRX_N 1152 -static const int8_t SCRX7[SCRX_N] = { - -64, -63, -63, -63, -63, -63, -63, -63, -62, -62, -62, -62, -62, -62, -62, -61, -61, -61, -61, -61, - -61, -61, -60, -60, -60, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -58, -58, -58, -58, - -58, -58, -58, -57, -57, -57, -57, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -55, -55, -55, - -55, -55, -55, -55, -54, -54, -54, -54, -54, -54, -54, -53, -53, -53, -53, -53, -53, -53, -52, -52, - -52, -52, -52, -52, -52, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -50, -50, -49, - -49, -49, -49, -49, -49, -49, -48, -48, -48, -48, -48, -48, -48, -47, -47, -47, -47, -47, -47, -47, - -46, -46, -46, -46, -46, -46, -46, -45, -45, -45, -45, -45, -45, -45, -44, -44, -44, -44, -44, -44, - -44, -43, -43, -43, -43, -43, -43, -43, -42, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, - -41, -41, -40, -40, -40, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -39, -38, -38, -38, -38, - -38, -38, -38, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, - -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -34, -33, -33, -33, -33, -33, -33, -33, -32, -32, - -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, -29, - -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -27, - -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, - -24, -23, -23, -23, -23, -23, -23, -23, -22, -22, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, - -21, -21, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, - -18, -18, -18, -17, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, - -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -13, -12, -12, - -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -9, - -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, - -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, - -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, - -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, - 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, - 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, - 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, - 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, - 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, - 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, - 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, - 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, - 38, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, - 41, 41, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, - 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 50, 50, - 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 53, - 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, - 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, - 61, 61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, - 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, - 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 70, 70, - 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, - 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, - 78, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, - 81, 81, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, - 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, - 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 90, 90, - 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 93, - 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, - 98, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, -}; - -static int scr_x(int x) -{ - /* Индекс считаем в uint16_t ОТДЕЛЬНОЙ переменной, а не выражением внутри - * скобок: на `(const T*)КОНСТ + var*K` SDCC z80 умеет терять старший байт - * индекса (memory sdcc_z80_const_ptr_index_bug), а тут индекс как раз - * больше 255. */ - uint16_t i = (uint16_t)(x + SCRX_BIAS); - if (i < SCRX_N) return x + SCRX7[i]; - return x * 8 / 7; /* по данным кадров недостижимо */ -} - -/* Добавить накладной спрайт (клинок / брызги) в overlay-прямоугольник - * страницы. Оба мелкие и в одном кадре встречаются редко — их объединение - * дешевле третьего heal-слота. */ -static void cd_overlay_add(pop_cdraw_t *s, uint8_t dp, int x, int y, - uint8_t w, uint8_t h) -{ - if (!s->ovalid[dp]) { - s->ox[dp] = x; s->oy[dp] = y; s->ow[dp] = w; s->oh[dp] = h; - s->ovalid[dp] = 1; - return; - } - { - int x0 = s->ox[dp], y0 = s->oy[dp]; - int x1 = x0 + (int)s->ow[dp], y1 = y0 + (int)s->oh[dp]; - if (x < x0) x0 = x; - if (y < y0) y0 = y; - if (x + (int)w > x1) x1 = x + (int)w; - if (y + (int)h > y1) y1 = y + (int)h; - s->ox[dp] = x0; s->oy[dp] = y0; - s->ow[dp] = (uint8_t)(x1 - x0); s->oh[dp] = (uint8_t)(y1 - y0); - } -} - -/* Добавить прямоугольник в окно fore-клипа слота (объединение «спрайт + - * накладные»): по нему fore-проход возвращает куски тайлов и по нему же - * расширяет перебор колонок/рядов. */ -static void cd_clip_add(pop_cdraw_t *s, int x, int y, uint8_t w, uint8_t h) -{ - if (!s->cw) { - s->cx = x; s->cy = y; s->cw = w; s->ch = h; - return; - } - { - int x1 = s->cx + (int)s->cw, y1 = s->cy + (int)s->ch; - if (x < s->cx) s->cx = x; - if (y < s->cy) s->cy = y; - if (x + (int)w > x1) x1 = x + (int)w; - if (y + (int)h > y1) y1 = y + (int)h; - s->cw = (uint8_t)(x1 - s->cx); - s->ch = (uint8_t)(y1 - s->cy); - } -} - -/* Стирание прошлого кадра персонажа и его накладных. pop_heal_fast, а не - * голый gfx_heal: стираем ровно то, что рисовали, а рисовали в подавляющем - * большинстве кадров noclip-ядром; клипающий путь остаётся для straddle и - * выхода за поле. - * - * Тело — static: pop_char_draw зовёт его же «страховкой» (см. ниже), а - * трамплин выбирается ОБЪЯВЛЕНИЕМ, и вызов через `__banked`-имя стоил бы - * 654 такта внутри собственного банка (memory sdcc_banked_call_rules). */ -static void cd_heal(uint8_t who) -{ - pop_cdraw_t *s = &pop_cd[who]; - uint8_t p = gfx_get_draw_page() & 1; - if (s->valid[p]) pop_heal_fast(s->x[p], s->y[p] + POP_YOFF, s->w[p], s->h[p]); - if (s->ovalid[p]) pop_heal_fast(s->ox[p], s->oy[p] + POP_YOFF, s->ow[p], s->oh[p]); - s->valid[p] = s->ovalid[p] = 0; -} - -void pop_char_heal(uint8_t who) __banked { cd_heal(who); } - -/* ---- Пропуск неизменившегося кадра (DRAW-COST; контракт — pop_cdraw.h) -- */ - -/* Снимок ВХОДОВ отрисовки слота. Картинки (image) в снимке нет: её - * однозначно определяет пара (charid, frame), и это ГАРАНТИРУЕТ pop_load_frame - * в самой отрисовке — без него кадр приходил из кэша, который мог отстать, и - * снимок описывал не то, что нарисовано (BUG-SHADOW-STALE-FRAME, разбор в - * pop_char_draw). Тайлы вокруг персонажа (clip_char, fore-проход) в снимок - * тоже не входят — их изменение ловит pop_cd_dirty. */ -typedef struct { - uint8_t frame, x, y, action, sword, charid, room, hurt; - int8_t dir, ccol, crow; - int dx; /* render_dx: straddle-смещение */ -} cd_sig_t; - -static cd_sig_t cd_sig[POP_CH_N][2]; - -static void cd_sig_make(uint8_t who, cd_sig_t *g) -{ - const pop_char_t *ch = (who == POP_CH_KID) ? &Kid : &Guard; - g->frame = ch->frame; g->x = ch->x; g->y = ch->y; - g->action = ch->action; g->sword = ch->sword; g->charid = ch->charid; - g->room = ch->room; - g->hurt = (uint8_t)((who == POP_CH_KID) ? pop_kid_hurt : pop_guard_hurt); - g->dir = ch->direction; - g->ccol = ch->curr_col; g->crow = ch->curr_row; - g->dx = pop_cd[who].render_dx; -} - -/* Совпадает ли снимок страницы с ТЕКУЩИМ состоянием персонажа. - * - * Отдельно от cd_sig_make намеренно: тот СТРОИТ структуру, и для проверки - * это лишняя работа — тринадцать записей в стековый кадр (а значит через - * `-n(ix)`), после которых идёт побайтовый цикл сравнения. А зовут проверку - * четыре раза за кадр: pop_char_skip_mask дважды, и в ней по два слота. - * Здесь сравниваем поля прямо с источником, и первое же расхождение - * заканчивает работу — у ДВИГАЮЩЕГОСЯ персонажа это обычно первое поле. */ -static uint8_t cd_sig_same(uint8_t who, uint8_t p) -{ - const pop_char_t *ch = (who == POP_CH_KID) ? &Kid : &Guard; - const cd_sig_t *g = &cd_sig[who][p]; - if (g->frame != ch->frame) return 0; - if (g->x != ch->x) return 0; - if (g->y != ch->y) return 0; - if (g->dir != ch->direction) return 0; - if (g->action != ch->action) return 0; - if (g->ccol != ch->curr_col) return 0; - if (g->crow != ch->curr_row) return 0; - if (g->sword != ch->sword) return 0; - if (g->charid != ch->charid) return 0; - if (g->room != ch->room) return 0; - if (g->hurt != (uint8_t)((who == POP_CH_KID) ? pop_kid_hurt : pop_guard_hurt)) - return 0; - if (g->dx != pop_cd[who].render_dx) return 0; - return 1; -} - -/* Габарит слота на странице: спрайт + накладные (клинок/брызги). y — - * КОМНАТНЫЙ (как в pop_cd), перевод в экранный делает вызывающий. */ -static void cd_bbox(uint8_t who, uint8_t p, int *x0, int *y0, int *x1, int *y1) -{ - const pop_cdraw_t *s = &pop_cd[who]; - *x0 = s->x[p]; *y0 = s->y[p]; - *x1 = *x0 + (int)s->w[p]; *y1 = *y0 + (int)s->h[p]; - if (s->ovalid[p]) { - if (s->ox[p] < *x0) *x0 = s->ox[p]; - if (s->oy[p] < *y0) *y0 = s->oy[p]; - if (s->ox[p] + (int)s->ow[p] > *x1) *x1 = s->ox[p] + (int)s->ow[p]; - if (s->oy[p] + (int)s->oh[p] > *y1) *y1 = s->oy[p] + (int)s->oh[p]; - } -} - -/* ЗАБЫТЬ, ЧТО НАРИСОВАНО, на ОБЕИХ страницах. - * - * Звать после всего, что переписало экран мимо кадрового конвейера: меню, - * QuickLoad, переворот картинки. Иначе снимок слота продолжает утверждать, - * что нужный кадр персонажа на странице уже есть, и cd_quiet честно - * пропускает отрисовку — персонаж исчезает до первого своего движения - * (поймано пользователем на выходе из меню; рядом с факелом бага не видно - * ровно потому, что анимация фона метит прямоугольник Кида и пропуск - * снимается сама собой). */ -void pop_cd_forget(void) __banked -{ - uint8_t i; - - for (i = 0; i < POP_CH_N; i++) { - pop_cd[i].valid[0] = pop_cd[i].valid[1] = 0; - pop_cd[i].ovalid[0] = pop_cd[i].ovalid[1] = 0; - } -} - -/* «Тихий» слот: спрайт этой страницы цел (heal его не трогал), фон в его - * прямоугольнике не трогали, и все входы отрисовки те же, что в момент, - * когда этот кадр на эту страницу и рисовали. valid[p] здесь ключевой: он - * снимается heal'ом, поэтому решение остаётся согласованным, сколько раз его - * ни перепроверяй за кадр. */ -static uint8_t cd_quiet(uint8_t who, uint8_t p) -{ - /* Соперника на сцене нет и на ЭТОЙ странице от него ничего не осталось — - * стирать и рисовать нечего, слот «тихий». Без этого пустой слот каждый - * кадр честно проходил heal + вход в pop_char_draw + fore-проход и стоил - * ~8 200 тактов из ничего (замер MAME, комната без стража). */ - if (who == POP_CH_OPP && Guard.charid == 0 && - !pop_cd[who].valid[p] && !pop_cd[who].ovalid[p]) - return 1; - if (!pop_cd[who].valid[p]) return 0; - if (pop_cd_dirty & (1 << p)) { /* фон правили — но задели ли нас? */ - /* СПРАЙТ И НАКЛАДНОЙ (клинок, брызги) — ДВУМЯ ОТДЕЛЬНЫМИ проверками, - * а не объединённым bbox. Объединение включает пустой угол между - * ними, и он ловит касания, которых на самом деле нет: у стоящего - * стража спрайт лежит в колонке 8, клинок уходит влево в колонку 7 на - * y 59..65, а пламя факела метит колонку 7 на y 33..50. Прямоугольник - * «спрайт + клинок» (x 241..284, y 46..84) пересекается с этой меткой - * углом — и персонаж перерисовывался целиком за 148 302 такта - * (замер 2026-08-19, сцена 11/15). - * - * Для skip_mask объединение по-прежнему годится: там вопрос «рядом ли - * два слота», и загрубление в бОльшую сторону безопасно. */ - if (pop_cd_hit_slot(who, p)) return 0; - } - return cd_sig_same(who, p); -} - -/* Запас вокруг габарита соседа: за кадр персонаж проходит заметно меньше - * (бег — ~11 экранных px), а прыжок с падением укладывается сюда же. */ -#define CD_MARGIN 32 - -uint8_t pop_char_skip_mask(void) __banked -{ - uint8_t p = gfx_get_draw_page() & 1; - uint8_t q0 = cd_quiet(POP_CH_KID, p); - uint8_t q1 = cd_quiet(POP_CH_OPP, p); - if (q0 && q1) return 3; /* оба стоят — пересечься нечему */ - if (q0 || q1) { - /* Один перерисовывается: его heal (и fore-проход по его окну) может - * задеть «тихого» соседа и выесть из него кусок. Прямоугольники - * рядом — перерисовываем ОБОИХ. */ - uint8_t st = (uint8_t)(q0 ? POP_CH_KID : POP_CH_OPP); - uint8_t mv = (uint8_t)(st ^ 1); - /* valid[st] тоже: «тихий» слот, в котором на этой странице НИЧЕГО не - * нарисовано (соперника на сцене нет), выесть невозможно, а bbox у - * него мусорный — правило соседства к нему неприменимо. */ - if (pop_cd[st].valid[p] && pop_cd[mv].valid[p]) { - int ax0, ay0, ax1, ay1, bx0, by0, bx1, by1; - cd_bbox(st, p, &ax0, &ay0, &ax1, &ay1); - cd_bbox(mv, p, &bx0, &by0, &bx1, &by1); - if (ax0 < bx1 + CD_MARGIN && bx0 < ax1 + CD_MARGIN && - ay0 < by1 + CD_MARGIN && by0 < ay1 + CD_MARGIN) return 0; - } - } - return (uint8_t)((q0 ? 1 : 0) | (q1 ? 2 : 0)); -} - -void pop_char_set_render_dx(uint8_t who, int dx) __banked -{ - pop_cd[who].render_dx = dx; -} - -/* Брызги урона (draw_hurt_splash, seg006:2003) — ОДИН порт на всех: у Кида - * это image 218 своего chtab_2, у соперника image 1 его chtab_5 (у - * add_midtable аргумент `obj_id + 1`, а get_image вычитает единицу обратно - * — тот же off-by-one, что расписан в шапке pop_pack_guard.py). Подъём: - * `((charid == kid) << 2) + 11`, то есть 15 у Кида и 11 у остальных. - * - * Рисуются МЕЖДУ персонажем и клинком: draw_kid/draw_guard кладут их в - * objtable сразу после персонажа и до клинка (seg008:22A2/22C9), а порядок - * записей и есть порядок рисования. */ -static void cd_splash(pop_cdraw_t *s, uint8_t who, const atlas_t *pages, - int fp_x, int obj_y) -{ - const atlas_t *ap; - uint8_t aidx; - const uint8_t *img; - uint8_t w, h; - int qx = fp_x, qy = obj_y; - int fw = (Char.direction < 0) ? -5 : 5; /* obj_dx_forward(5) */ - - if (Char.frame == 178) return; /* chomped: брызг нет */ - if (who == POP_CH_KID) { - if ((KID_SPLASH_IMAGE >> 3) >= kid_npages) return; /* страница не загружена */ - ap = &pages[KID_SPLASH_IMAGE >> 3]; aidx = KID_SPLASH_IMAGE & 7; - } else { - ap = &pages[0]; aidx = 1; - } - if (Char.frame == 185 || /* мёртв */ - (Char.frame >= 106 && Char.frame < 111)) { /* падение+посадка */ - qy += 4; - } else if (Char.frame == 177) { /* напоролся на пики */ - fw = -fw; /* obj_dx_forward(-5) */ - } else { - qy -= (who == POP_CH_KID) ? 15 : 11; - } - qx = scr_x(qx + fw); /* calc_screen_x_coord */ - img = (const uint8_t *)atlas_image(ap, aidx); - gfx_w0_map(ap->page); - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - if (w && h) { - int top = qy - (int)h + 1; - uint8_t flip = (uint8_t)(Char.direction >= 0); - int skip = 0, rows = (int)h; /* поле комнаты 0..192 */ - uint8_t dp; - if (flip) qx -= (int)w; - if (top < 0) { skip = -top; rows -= skip; top = 0; } - if (top + rows > 192) rows = 192 - top; - if (rows <= 0) return; - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (pop_onscreen_cols(qx, top + POP_YOFF, w, (uint8_t)rows)) - gfx_blit_cols_part_noclip(qx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part(qx, top + POP_YOFF, img, flip, skip, rows); - gfx_set_bank(GFX_BANK_NORMAL); - dp = gfx_get_draw_page() & 1; - cd_overlay_add(s, dp, qx, top, w, (uint8_t)rows); - cd_clip_add(s, qx, top, w, (uint8_t)rows); - } -} - -void pop_char_draw(uint8_t who) __banked -{ - pop_cdraw_t *s = &pop_cd[who]; - const pop_char_t *ch; - const kframe *fr; - const atlas_t *pages; - /* Атлас БРЫЗГ отдельно от кадра: у оригинала они всегда из «своего» - * chtab (Кид — chtab_2 image 218, прочие — chtab_5 image 1, - * seg006:2019), а у Тени кадр может прийти из другой половины набора. */ - const atlas_t *spl; - const uint8_t *img; - uint8_t npages, page, idx, dp, flip, hurt, lskip; - uint8_t w, h, vis_w; - int obj_x, obj_y, fp_x, fwd, top, bx, skip, rows, ct, cr; - int bcut; /* срез СНИЗУ (clip_char в перевёрнутом виде) */ - - /* Страховка пропуска (DRAW-COST): главный цикл мог решить, что слот - * «тихий», и heal не звать — а тик после этого персонажа всё-таки - * сдвинул. Здесь прошлый кадр уже точно надо стереть. Если heal в этом - * кадре был, вызов бесплатен: valid/ovalid уже сняты. */ - cd_heal(who); - - s->cw = 0; /* окно fore-клипа: пусто, пока не нарисовали */ - s->fpw = 0; /* габарит кадра: нечего перекрывать */ - - /* Окно Char (loadkid/loadshad) — как в оригинале: clip_char, футпринт и - * брызги работают с АКТИВНЫМ персонажем, а к этому моменту в Char лежит - * тот, кто тикал последним. Выгружать назад нечего: отрисовка только - * читает. */ - if (who == POP_CH_KID) { - pop_loadkid(); - ch = &Kid; fr = &kid_frame; pages = kidp; npages = kid_npages; - spl = kidp; - hurt = pop_kid_hurt; - } else { - pop_loadshad(); - ch = &Guard; fr = &pop_gframe; pages = gp; - npages = g_ok ? GUARD_PAGES : 0; - spl = gp; - hurt = pop_guard_hurt; - if (Guard.charid == 0) return; /* соперника на сцене нет */ - /* Набор атласов обязан идти за ТАБЛИЦЕЙ КАДРОВ — условие берём из - * того же места, что load_frame (seg006:0532), чтобы они не - * разъехались: вне боевых кадров 150..189 Тень ходит по таблице - * КИДА, и `image` из неё индексирует спрайты Кида. */ - if (Guard.charid == CHARID_1_SHADOW && pop_shadow_kid_n) { - /* У Тени СВОЙ запечённый набор (pop_shadow.h): её вид даёт - * наложение спрайта на себя со сдвигом, а пакетный блит так не - * умеет. Обе половины лежат в нём же, поэтому подмены на kidp - * здесь уже не нужно. */ - if (pop_frame_tbl_is_guard(Guard.charid, Guard.frame)) { - pages = pop_shadow_fgt; npages = pop_shadow_fgt_n; - } else { - pages = pop_shadow_kid; npages = pop_shadow_kid_n; - } - spl = pop_shadow_fgt; /* брызги — из половины chtab_5 */ - } else if (!pop_frame_tbl_is_guard(Guard.charid, Guard.frame)) { - pages = kidp; npages = kid_npages; - } - } - /* load_fram_det_col (seg008:22F5 / 2329) — кадр грузит САМА отрисовка, - * сразу после loadkid/loadshad. У нас его не было: kid_frame/pop_gframe - * считались кэшем, который наполняет тик (play_seq -> load_frame), а - * отрисовка берёт готовое. Кэш лагает — тот, кто пишет Char.frame МИМО - * play_seq, кадр не перезагружает, и рисуется прошлая картинка: - * - * do_init_shad (guards.c) кладёт тени frame = 15 (стойка) прямой - * записью, а pop_gframe в этот момент держит кадр 185 УБИТОГО СТРАЖА - * с прошлого уровня (после его смерти pop_guard_tick выходит по - * `charid == 0` РАНЬШЕ pop_load_fram_det_col, и кэш не трогается - * вообще). В кадре входа в комнату тень рисуется картинкой 33 - * (34x38, dx 3, dy 4) вместо 12x41 — да ещё из атласа КИДА, потому что - * набор выбирается по Guard.frame, а image приходит из кэша. - * - * Само по себе это моргнуло бы один кадр. Смертельным его делает - * пропуск неизменившегося кадра: снимок пишется по Guard.frame, то есть - * страница запоминает «нарисован кадр 15», хотя на ней чужой спрайт. - * Тень дальше стоит, снимок совпадает — страница НИКОГДА не - * перерисовывается, и дабл-буфер вечно мигает двумя разными позами - * (BUG-SHADOW-STALE-FRAME, уровень 6 комната 1). - * - * Лечим корень, а не симптом: после этой строки image ОДНОЗНАЧНО - * определяется парой (charid, frame), и снимок cd_sig снова описывает - * ровно то, что нарисовано. determine_col из связки НЕ берём: он пишет - * Char.curr_col, которую тут же читает clip_char, а физика колонку ведёт - * сама (расхождение с оригиналом — ../docs/impl_diff.md). */ - pop_load_frame(); - if (fr->image == 255) return; /* пустой кадр */ - - /* load_frame_to_obj (seg008:1728): НИЗ спрайта на obj_y, левый край на - * obj_x. +render_dx — straddle-смещение (∓140), когда комната персонажа - * не совпадает с отрисованной: спрайт за кромкой. Коллизия НЕ смещается - * — она в кадре своей комнаты, смещение чисто рендерное. */ - fwd = (int)ch->x + ((ch->direction < 0) ? -fr->dx : fr->dx) + s->render_dx; - obj_x = (fwd << 1) - 116; - obj_y = (int)ch->y + fr->dy; - if ((int8_t)(fr->flags ^ ch->direction) >= 0) - obj_x++; /* even/odd pixel (в ЛОГИЧЕСКОЙ X) */ - fp_x = obj_x; /* ЛОГИЧЕСКАЯ X — для футпринта */ - /* Позицию кадра публикуем СРАЗУ: её читает физика (check_spike_below — - * char_x_left активного персонажа), и она обязана обновиться даже в - * кадре, который рисовать нечем. Размер (fpw) — ниже, по факту кадра: - * он же служит признаком «есть что перекрывать» для fore-прохода. */ - s->fpx = fp_x; s->fpy = obj_y; - /* seg008 calc_screen_x_coord: логическая X (280 шир = 28px/тайл) -> - * экран (320 шир = 32px/тайл), ×320/280 = ×8/7. БЕЗ этого персонаж - * уезжает влево от тайлов тем сильнее, чем правее. Через scr_x — - * таблицей, без __divsint (см. шапку DIV7). */ - obj_x = scr_x(obj_x); - - page = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (page >= npages) return; /* страница набора не загружена */ - img = (const uint8_t *)atlas_image(&pages[page], idx); - /* ПЕРЕВОРОТ (зелье инверсии): тот же атлас, но страница с вертикально - * зеркальными пикселями — смещения лент и размеры кадров у копии те же, - * поэтому меняется ровно номер страницы (pop_vflip.h). Если EMM не - * дала страницу — рисуем обычной: неперевёрнутый кадр лучше дыры. */ - { - uint8_t vpg = pages[page].page; - if (pop_upside) { - uint8_t f = pop_vflip_page(vpg); - if (f) vpg = f; - } - gfx_w0_map(vpg); - } - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - dp = gfx_get_draw_page() & 1; - if (w && h) { - /* Спрайты нарисованы ЛИЦОМ ВЛЕВО (как в оригинале); seg008:864 — - * флип, когда персонаж смотрит ВПРАВО, и тогда xpos -= image->w - * (draw_mid). Флип column-major бесплатен, но зеркалит ВНУТРИ - * [x,x+w), поэтому при флипе подаём x−w. */ - flip = (uint8_t)(ch->direction >= 0); - bx = obj_x; - if (flip) bx -= (int)w; - top = obj_y - (int)h + 1; - /* Поле переворачивается вокруг своей середины: строка t уходит в - * (POP_PLAYFIELD_H - 1 - t), значит верх кадра [top, top+h) — - * в 192 - top - h, что при top = obj_y-h+1 даёт ровно 191 - obj_y. - * Пиксели уже зеркальны (страница выше), поэтому дальше всё - * считается как обычно: «пропустить skip строк сверху» у зеркальной - * ленты означает «срезать снизу» у оригинала — ровно то, что нужно. */ - if (pop_upside) top = (POP_PLAYFIELD_H - 1) - obj_y; - vis_w = w; - lskip = 0; - skip = 0; - bcut = 0; - /* clip_char (seg006:1231/1749): тайл над головой — стена/пол → всё - * выше линии полосы своего ряда НЕ рисуется, иначе персонаж - * просвечивает сквозь щели кладки при спуске/висе. */ - /* clip_char (seg006:1231/1749): тайл над головой — стена/пол → всё - * выше линии полосы своего ряда НЕ рисуется. Граница приходит в - * ЛОГИЧЕСКИХ координатах поля (y_clip), и при перевороте её нельзя - * сравнивать с уже отражённым top: то, что логически «выше линии», - * на экране оказывается НИЖЕ неё. Поэтому в перевороте тот же - * срез применяется с другого конца — укорачивает кадр снизу - * (bcut), а верх (top) остаётся на месте. Строки ленты при этом - * не сдвигаются: зеркальная лента отдаёт их в обратном порядке, - * так что «убрать последние bcut строк вывода» = «не рисовать - * первые bcut строк оригинала», а это ровно то, что просит - * clip_char. */ - ct = pop_clip_char_top(fp_x, obj_y, w, h); - if (!pop_upside) { - if (ct > top) { - skip = ct - top; - if (skip > (int)h) skip = (int)h; /* обрезан целиком */ - top = ct; - } - } else { - int top_log = obj_y - (int)h + 1; /* верх кадра ДО отражения */ - if (ct > top_log) { - bcut = ct - top_log; - if (bcut > (int)h) bcut = (int)h; - } - } - /* Вторая половина clip_char: правый косяк двери уровня. Дверь - * рисуется ПОД персонажем (вся в backtable), поэтому спрятать - * поднимающегося по лестнице можно только срезав спрайт. */ - cr = pop_clip_char_right(); - if (cr) { - int avail = cr - bx; - if (avail <= 0) vis_w = 0; /* весь спрайт за косяком */ - else if (avail < (int)w) vis_w = (uint8_t)avail; - } - /* КЛИП ТЕНИ СЛЕВА (seg008:1699): на уровне зеркала она может - * показываться ТОЛЬКО СПРАВА от него — - * obj_clip_left = 137 + (mirror_column-4)*32. */ - if (ch->charid == CHARID_1_SHADOW && - pop_current_level == MIRROR_LEVEL && ch->room == MIRROR_ROOM) { - int cl = 137 + (MIRROR_COL - 4) * 32; - if (bx < cl) { - int d = cl - bx; - if (d >= (int)vis_w) vis_w = 0; /* вся тень левее линии */ - else lskip = (uint8_t)d; - } - } - /* Поле комнаты — 192 строки (reset_obj_clip, seg006:0507: - * obj_clip_top = 0, obj_clip_bottom = 192). Персонаж, вышедший за - * него (скелет, падающий в пропасть), обязан обрезаться: ниже поля - * идёт полоса HP, и без клипа спрайт лез прямо на неё. */ - rows = (int)h - skip - bcut; - if (top < 0) { skip += -top; rows += top; top = 0; } - if (top + rows > 192) rows = 192 - top; - gfx_set_bank(GFX_BANK_SPRITE); /* видео-ОЗУ, без теневой копии */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (rows > 0 && vis_w) { /* +YOFF: центрирование */ - /* noclip-ядро ширину не ограничивает, поэтому при обрезке справа - * идём общим путём: это редкие кадры (подъём в двери уровня раз - * за уровень), цена подготовки там не видна. */ - if (lskip) /* тень у зеркала: срез слева */ - gfx_blit_cols_part_wx(bx, top + POP_YOFF, img, flip, skip, rows, - lskip, (uint8_t)(vis_w - lskip)); - else if (vis_w == w && pop_onscreen_cols(bx, top + POP_YOFF, w, (uint8_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part_w(bx, top + POP_YOFF, img, flip, skip, rows, - (uint8_t)(vis_w == w ? 0 : vis_w)); - } else rows = 0; - gfx_set_bank(GFX_BANK_NORMAL); - /* heal чистит ТОЛЬКО нарисованное: иначе стирается кромка пола над - * срезом (мусор/дыра в кладке на второй странице дабл-буфера). */ - s->x[dp] = bx + lskip; s->y[dp] = top; - s->w[dp] = (uint8_t)(vis_w - lskip); s->h[dp] = (uint8_t)rows; - s->valid[dp] = (uint8_t)(rows != 0); - if (rows) cd_clip_add(s, bx, top, vis_w, (uint8_t)rows); - s->fpw = w; s->fph = h; /* габарит КАДРА (не обрезанный): */ - /* по нему считается футпринт */ - } - pop_dbg_m15(); /* ЗАМЕР: снимок прямоугольника сделан */ - if (hurt) cd_splash(s, who, spl, fp_x, obj_y); - /* add_sword_to_objtable (seg006:1798): клинок отдельным спрайтом поверх - * персонажа — со своим прямоугольником heal. */ - { - int sx, sy; uint16_t sw, sh; - if (pop_sword_draw(ch, fr, obj_x, obj_y, &sx, &sy, &sw, &sh)) { - cd_overlay_add(s, dp, sx, sy, sw, sh); - cd_clip_add(s, sx, sy, sw, sh); - } - } - pop_dbg_m16(); /* ЗАМЕР: splash + клинок сделаны */ - gfx_w0_unmap(); - /* Что именно нарисовано на ЭТОЙ странице — снимок для пропуска - * следующих кадров (DRAW-COST). Только если кадр РЕАЛЬНО рисовали: - * при нулевом спрайте (`w && h` ложно — пустая запись атласа) блок выше - * не выполняется, и x/y/w/h/valid остаются от ПРОШЛОГО кадра этой - * страницы. Снимок же брался всегда — и слот залипал: cd_quiet видел - * valid = 1 и совпавшую сигнатуру, то есть считал «на странице - * нарисовано ровно то, что нужно», а на ней стоял старый спрайт. Так - * тень оставалась на двух страницах дабл-буфера в РАЗНЫХ позах и мигала - * между ними (BUG-CHAR-STALE-PAGE). Без снимка слот просто не будет - * «тихим», и следующий кадр начнётся с heal — старое сотрётся. */ - if (w && h) cd_sig_make(who, &cd_sig[who][dp]); -} - -void pop_char_fore(uint8_t who) __banked -{ - pop_cdraw_t *s = &pop_cd[who]; - /* Окно fore-клипа — одно на всех, и ставит его КАЖДЫЙ, кто рисует - * персонажа. Пока соперник рисовался строго ДО Кида, к моменту прохода - * в окне оказывался Кид и всё сходилось само; как только порядок стал - * переменным (кто ниже — тот поверх), при «соперник поверх» окно - * оставалось ЕГО, и fore-проход Кида отсекался целиком — Кид рисовался - * поверх передних столбов. Поэтому окно ставится здесь, а не держится - * «по счастливому порядку вызовов». */ - pop_fore_set_clip(s->cx, s->cy + POP_YOFF, (int)s->cw, (int)s->ch); - if (s->fpw) - pop_fore_over_char(who == POP_CH_KID ? &Kid : &Guard, - s->fpx, s->fpy, s->fpw, s->fph); - pop_dbg_b6(); /* ЗАМЕР: pop_char_fore целиком */ -} - -/* ---- ОТРАЖЕНИЕ В ЗЕРКАЛЕ (check_mirror, seg003:0798) ---------------- * - * - * Пока Кид стоит на тайле зеркала, оригинал каждый кадр рисует его - * зеркальную копию. ОТДЕЛЬНОЙ функцией, а не третьим слотом pop_cd — и это - * не экономия, а структура САМОГО оригинала: отражение идёт сокращённым - * путём `load_frame_to_obj(); reset_obj_clip(); add_objtable(4)`, а НЕ через - * add_kid_to_objtable. У него нет ни клинка, ни брызг, ни fore-прохода, ни - * пропуска неизменившегося кадра — гейтить всё это в общем теле значило бы - * добавить ветки в самый горячий путь ради двух секунд за игру. - * - * Char к моменту вызова уже ОТРАЖЁН вызывающим (pop_check_mirror -> - * mirror_image), поэтому здесь никакого «зеркалим» нет — обычная математика - * кадра, та же, что в pop_char_draw (см. там load_frame_to_obj, seg008:1728; - * шесть строк намеренно продублированы, а не вынесены: трогать горячее тело - * ради холодного вызова дороже, чем держать их синхронными по комментарию). - */ -static int mi_x[2], mi_y[2]; -static uint16_t mi_w[2], mi_h[2]; -static uint8_t mi_valid[2]; - -void pop_mirror_heal(void) __banked -{ - uint8_t p = gfx_get_draw_page() & 1; - if (!mi_valid[p]) return; - pop_heal_fast(mi_x[p], mi_y[p] + POP_YOFF, mi_w[p], mi_h[p]); - mi_valid[p] = 0; -} - -void pop_mirror_draw(int clip_top) __banked -{ - uint8_t dp = gfx_get_draw_page() & 1; - const kframe *fr = &kid_frame; - const uint8_t *img; - uint8_t page, idx, flip; - uint8_t w, h, vis_w; - int fwd, obj_x, obj_y, fp_x, bx, top, skip = 0, rows, cl; - uint8_t lskip = 0; - - if (fr->image == 255) return; - page = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (page >= kid_npages) return; - - fwd = (int)Char.x + ((Char.direction < 0) ? -fr->dx : fr->dx); - obj_x = (fwd << 1) - 116; - obj_y = (int)Char.y + fr->dy; - if ((int8_t)(fr->flags ^ Char.direction) >= 0) obj_x++; - fp_x = obj_x; /* ЛОГИЧЕСКАЯ X — её ждёт fore-проход */ - obj_x = scr_x(obj_x); - - img = (const uint8_t *)atlas_image(&kidp[page], idx); - gfx_w0_map(kidp[page].page); - /* Габарит БАЙТАМИ: спрайты персонажей и накладных не крупнее 64x64 - * (memory pop_sprite_size_limits — весь игровой кадр PoP <= 56x63), - * а 16-битные w/h заставляли SDCC держать их в стековом кадре и - * считать каждое сравнение парой загрузок. */ - w = img[0]; - h = img[2]; - if (!w || !h) { gfx_w0_unmap(); return; } - flip = (uint8_t)(Char.direction >= 0); - bx = flip ? obj_x - (int)w : obj_x; - top = obj_y - (int)h + 1; - - /* Клип СВЕРХУ — y_clip[curr_row+1] оригинала: отражение не должно - * вылезать из проёма зеркала вверх. Значение считает вызывающий - * (таблица y_clip живёт в pop_map). */ - if (clip_top > top) { skip = clip_top - top; top = clip_top; } - rows = (int)h - skip; - if (top < 0) { skip += -top; rows += top; top = 0; } - if (top + rows > 192) rows = 192 - top; - vis_w = w; - if (rows <= 0) { gfx_w0_unmap(); return; } - - /* Клип СЛЕВА — obj_clip_left = (curr_col<<5)+9: отражение видно только - * внутри проёма зеркала. Настоящей обрезкой колонок - * (gfx_blit_cols_part_wx), а не «нарисовать и вернуть фон»: для - * column-major левая обрезка стоит столько же, сколько правая. */ - cl = ((int)Char.curr_col << 5) + 9; - if (bx < cl) { - int d = cl - bx; - if (d >= (int)vis_w) { gfx_w0_unmap(); return; } /* целиком за краем */ - lskip = (uint8_t)d; - } - - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (lskip) - gfx_blit_cols_part_wx(bx, top + POP_YOFF, img, flip, skip, rows, - lskip, (uint8_t)(vis_w - lskip)); - else if (pop_onscreen_cols(bx, top + POP_YOFF, vis_w, (uint16_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, img, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part_w(bx, top + POP_YOFF, img, flip, skip, rows, 0); - gfx_set_bank(GFX_BANK_NORMAL); - gfx_w0_unmap(); - - mi_x[dp] = bx + lskip; mi_y[dp] = top; - mi_w[dp] = (uint16_t)(vis_w - lskip); mi_h[dp] = (uint16_t)rows; - mi_valid[dp] = 1; - - /* FORE-ПРОХОД ПОВЕРХ ОТРАЖЕНИЯ — обязателен, и без него картинка неверна. - * В оригинале отражение уходит в objtable (add_objtable(4)), а дальше его - * накрывает передний слой тайлов на общих основаниях; у зеркала это - * fore_id 77 — ПЕРЕДНЯЯ ЧАСТЬ АРКИ. Именно она прячет то, что вылезло из - * проёма: ноги ниже нижней кромки и голову с руками выше верхней (видно - * на прыжке). Клип obj_clip_top этого НЕ делает — при curr_row = 0 он - * равен y_clip[1] = 3, то есть почти не режет; работу выполняет фон. - * - * Мы рисуем отражение мимо конвейера персонажей, поэтому проход надо - * позвать руками — ровно как это делает pop_char_fore для слотов. */ - pop_fore_set_clip(bx + lskip, top + POP_YOFF, - (int)(vis_w - lskip), rows); - pop_fore_over_char(&Char, fp_x, obj_y, w, h); -} - -/* ---- Индикаторы HP (порт draw_kid_hp / draw_guard_hp, seg000:1416) --- * - * Оригинал рисует их в статус-полосе на y = 194 (ниже поля тайлов, внутри - * тех же 200 строк экрана PoP): HP Кида слева направо шагом 7, HP стража - * справа налево от x = 314. Пустые деления у Кида — свой спрайт (chtab_2 - * id 217); у стража оригинал печатает тот же спрайт ЧЁРНЫМ силуэтом, а мы - * просто не печатаем — полоса и так на чёрном фоне. - * - * Спрайты Кида (216/217) лежат в его же атласах, поэтому блитим через - * pop_kid_img_blit; спрайт стража — image 0 его chtab (наша страница 0). */ -#define HP_Y POP_HP_Y /* полосу делит UI: см. pop_cdraw.h */ -#define HP_STEP 7 -#define HP_KID_FULL 216 -#define HP_KID_EMPTY 217 -#define HP_MAXDRAW 10 /* больше в полосу всё равно не влезает */ - -/* Полоса перерисовывается ТОЛЬКО когда числа изменились — и тогда на ОБЕИХ - * страницах дабл-буфера (иначе на второй останется старое значение и его - * будет видно как мерцание через кадр). Отсюда счётчик страниц, а не флаг. - * - * Снимки прошлых значений пишем ДО сравнения: `if (n != s) s = n;` SDCC z80 - * собирает неверно — SUB затирает A, и в s уезжает разность (memory - * sdcc_z80_cmp_store_a_bug). */ -static uint8_t hp_todo; /* сколько страниц ещё обновить */ -/* Сколько страниц ещё стереть ЦЕЛИКОМ. Обычное обновление щадит зону - * статус-текста (иначе он мигал бы на каждом изменении жизней), но после - * рестарта уровня в этой зоне остаются деления ПРОШЛОГО боя: полоса стража - * при большом запасе HP заходит под текст, и щадящая чистка их не трогает. - * Симптом — «после гибели и Ctrl+A на одной из страниц осталась полоса по - * результатам боя» (BUGS_OPEN, HP-BAR-RESTART). */ -static uint8_t hp_wipe; /* сколько страниц ещё стереть */ -static uint8_t hp_kid_prev, hp_kidmax_prev, hp_gd_prev, hp_gdmax_prev; -/* Страница, в которую лёг прошлый проход. Счётчики выше считают СТРАНИЦЫ, - * но кадр и страница — не одно и то же: между двумя вызовами переворота - * может не быть, и тогда оба прохода уходили в ОДНУ страницу, а вторая - * оставалась с делениями прошлого боя. Ровно этим полоса и переживала - * Ctrl+A (BUGS_OPEN, HP-BAR-RESTART). */ -static uint8_t hp_page_prev = 0xFF; - -/* Заставить перерисовать полосу на обеих страницах: звать при входе в - * комнату (фон перерисован целиком и стёр её) и при старте. */ -void pop_hp_invalidate(void) __banked { hp_todo = 2; hp_wipe = 2; } - -void pop_hp_draw(void) __banked -{ - uint8_t i, n; - uint8_t gd = (uint8_t)(Guard.charid ? guardhp_curr : 0); - uint8_t gm = (uint8_t)(Guard.charid ? guardhp_max : 0); - - { /* Изменилось хоть одно число — обновить обе страницы. */ - uint8_t k = hitp_curr, km = hitp_max; - uint8_t changed = (uint8_t)(k != hp_kid_prev || km != hp_kidmax_prev || - gd != hp_gd_prev || gm != hp_gdmax_prev); - hp_kid_prev = k; hp_kidmax_prev = km; - hp_gd_prev = gd; hp_gdmax_prev = gm; - if (changed) hp_todo = 2; - } - if (hp_todo == 0) return; - { /* Пока страница та же, что у прошлого прохода, — ждём переворота: - * иначе потратим оба прохода на одну страницу. Первый проход - * (hp_todo == 2) идёт всегда, ему сравнивать не с чем. */ - uint8_t pg = gfx_get_draw_page(); - if (hp_todo < 2 && pg == hp_page_prev) return; - hp_page_prev = pg; - } - hp_todo--; - - /* Стереть прошлую полосу. Фон под ней — НЕ цвет 0, а POP_COL_OUTSIDE - * (в палитре тоже чёрный): вспышки подменяют нулевой цвет, и полоса HP - * не должна мигать вместе с игровым полем (pop_ui.h). */ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - /* Полосу мы делим со статус-строкой (pop_status.h): пока в ней висит - * текст, его зону не трогаем — иначе он мигал бы при каждом изменении - * жизней. Деления Кида левее POP_STATUS_L, стража — правее POP_STATUS_R, - * так что чистить края по отдельности достаточно. */ - if (hp_wipe) { - /* Полная чистка обеих страниц: старая полоса могла заходить под - * текст. Текст при этом стирается тоже, поэтому сразу просим - * перерисовать и его — иначе строка уровня пропала бы. */ - hp_wipe--; - bar(0, HP_Y + POP_YOFF, 319, HP_Y + POP_YOFF + 6); - if (pop_status_ticks) pop_status_invalidate(); - } else if (pop_status_ticks) { - bar(0, HP_Y + POP_YOFF, POP_STATUS_L - 1, HP_Y + POP_YOFF + 6); - bar(POP_STATUS_R + 1, HP_Y + POP_YOFF, 319, HP_Y + POP_YOFF + 6); - } else { - bar(0, HP_Y + POP_YOFF, 319, HP_Y + POP_YOFF + 6); - } - - /* Кид: сначала пустые деления, поверх — полные (порядок оригинала). */ - n = (uint8_t)(hitp_max > HP_MAXDRAW ? HP_MAXDRAW : hitp_max); - for (i = hitp_curr; i < n; i++) - pop_kid_img_blit(HP_KID_EMPTY, (int)i * HP_STEP, HP_Y + POP_YOFF); - for (i = 0; i < hitp_curr && i < HP_MAXDRAW; i++) - pop_kid_img_blit(HP_KID_FULL, (int)i * HP_STEP, HP_Y + POP_YOFF); - - /* Страж: только полные деления, справа налево. Скелет полосы не имеет, - * мышь (спецсобытие уровня 8) — тоже: draw_guard_hp, seg000:1159. */ - if (g_ok && Guard.charid != 0 && Guard.charid != CHARID_4_SKELETON && - Guard.charid != CHARID_24_MOUSE && gd) { - const uint8_t *img = (const uint8_t *)atlas_image(&gp[0], 0); - uint8_t w, h; - gfx_w0_map(gp[0].page); - w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - if (w && h) { - /* Атлас стража тоже column-major — блит колоночный. */ - n = (uint8_t)(gd > HP_MAXDRAW ? HP_MAXDRAW : gd); - for (i = 0; i < n; i++) { - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_blit_cols_part_noclip(314 - (int)i * HP_STEP, - HP_Y + POP_YOFF, img, 0, 0, 0); - } - } - gfx_w0_unmap(); - } -} diff --git a/applications/SprPoP/src/pop_cdraw.h b/applications/SprPoP/src/pop_cdraw.h deleted file mode 100644 index 8049dc7..0000000 --- a/applications/SprPoP/src/pop_cdraw.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * pop_cdraw.h — ОТРИСОВКА ПЕРСОНАЖА, одна на всех Char. - * - * В оригинале это два входа с ИДЕНТИЧНЫМ телом (seg008:22F0/2324): - * - * add_kid_to_objtable add_guard_to_objtable - * loadkid() loadshad() - * load_fram_det_col() load_fram_det_col() - * load_frame_to_obj() load_frame_to_obj() - * stuck_lower() stuck_lower() - * set_char_collision() set_char_collision() - * set_objtile_at_char() set_objtile_at_char() - * redraw_at_char() redraw_at_char() - * redraw_at_char2() redraw_at_char2() - * clip_char() clip_char() - * add_objtable(0) add_objtable(1 тень / 2 страж) - * - * — различаются ТОЛЬКО окном (loadkid/loadshad), набором спрайтов и типом - * объекта. У нас до DRAW-CHAR это были два независимых куска кода - * (kid_draw в резиденте и pop_guard_draw в банке), и расхождение уже стоило - * бага: падающий скелет рисовался поверх верхней грани пола соседней - * колонки, потому что порт redraw_at_char2 был только у Кида. Тем же путём - * пошли бы тень (ур. 4/5/6/12), визирь (13) и толстяк (12). - * - * Поэтому здесь ОДИН набор функций, а различия сведены к слоту: - * POP_CH_KID — Кид: окно loadkid, атласы chtab_2 (kidp), кадр kid_frame; - * POP_CH_OPP — соперник: окно loadshad, атласы chtab_5 (страж/скелет), - * кадр pop_gframe. - * - * Порядок в кадре (задаёт главный цикл, как draw_people): - * pop_char_heal(who) — стереть прошлый кадр ЭТОЙ страницы дабл-буфера; - * pop_char_draw(who) — спрайт + брызги урона + клинок; - * pop_char_fore(who) — передние грани и оверлеи тайлов ПОВЕРХ него. - */ -#ifndef POP_CDRAW_H -#define POP_CDRAW_H - -#include - -/* Нижняя статус-полоса: строка делений HP. Живёт здесь, а не в pop_cdraw.c, - * потому что её делит UI — «GAME PAUSED» в оригинале пишется в ту же полосу - * (SDLPoP rect_bottom_text = {193,70,202,250}), между делениями Кида слева и - * стража справа. */ -#define POP_HP_Y 194 - -#define POP_CH_KID 0 -#define POP_CH_OPP 1 -#define POP_CH_N 2 - -/* Состояние отрисовки одного слота. Публичное, потому что метрики кадра - * (fp*) читает физика из ДРУГОГО банка (char_width_half в - * set_char_collision, порядок «кто поверх кого» в pop_bg): данные лежат в - * _DATA (W2) и видны всем без трамплина, а вызов аксессора из банка стоил - * бы дороже самого чтения. */ -typedef struct { - /* прямоугольник спрайта по СТРАНИЦАМ дабл-буфера: у каждой своя - * видео-ОЗУ и своя ОЗУ-копия, поэтому heal обязан стирать спрайт именно - * той страницы, в которую сейчас рисуем */ - int x[2], y[2]; - uint8_t w[2], h[2]; /* габарит: спрайты игры не крупнее 64x64 */ - uint8_t valid[2]; - /* НАКЛАДНЫЕ спрайты (клинок + брызги урона) — свой прямоугольник, не - * объединение с персонажем: объединение сильно больше суммы двух - * (клинок уходит вперёд-вверх), а heal стоит ровно по площади */ - int ox[2], oy[2]; - uint8_t ow[2], oh[2]; - uint8_t ovalid[2]; - /* габарит кадра для fore-прохода: fpx — ЛОГИЧЕСКАЯ X (до ×8/7), - * fpy — низ спрайта; fpw == 0 — в этом кадре рисовать было нечего */ - int fpx, fpy; - uint8_t fpw, fph; - /* окно fore-клипа слота (объединение «спрайт + накладные»), КОМНАТНЫЙ y */ - int cx, cy; - uint8_t cw, ch; - /* straddle: рендерное смещение по ЛОГИЧЕСКОЙ X, когда комната персонажа - * не совпадает с отрисованной (порт xpos_in_drawn_room) */ - int render_dx; -} pop_cdraw_t; - -extern pop_cdraw_t pop_cd[POP_CH_N]; - -/* Забыть, что нарисовано на обеих страницах: после меню, QuickLoad и любой - * другой перерисовки экрана мимо кадрового конвейера. Без этого пропуск - * перерисовки «тихого» персонажа оставляет его невидимым. */ -void pop_cd_forget(void) __banked; - -/* Стереть прошлый кадр персонажа (спрайт + накладные) на ТЕКУЩЕЙ странице. */ -void pop_char_heal(uint8_t who) __banked; - -/* Нарисовать текущий кадр: спрайт, брызги урона (по флагу pop_kid_hurt / - * pop_guard_hurt) и клинок. Загружает окно Char сам — clip_char и футпринт - * работают с АКТИВНЫМ персонажем, как в оригинале. */ -void pop_char_draw(uint8_t who) __banked; - -/* Передние грани и оверлеи тайлов ПОВЕРХ персонажа: ставит окно fore-клипа - * слота и зовёт общий проход pop_fore_over_char. Отдельным вызовом, а не - * хвостом pop_char_draw, потому что порядок в кадре задаёт главный цикл: - * между спрайтом и его fore-слоем успевает нарисоваться падающая плита. */ -void pop_char_fore(uint8_t who) __banked; - -/* Straddle-смещение спрайта (см. render_dx). */ -void pop_char_set_render_dx(uint8_t who, int dx) __banked; - -/* ---- Пропуск НЕИЗМЕНИВШЕГОСЯ кадра (DRAW-COST) ---------------------- * - * heal + спрайт + fore-проход стоят ~50 % кадрового периода НА ПЕРСОНАЖА - * (замер пользователя 2026-08-08: комната 1.3 с телом убитого стража — 210 % - * кадра, соседняя 1.2 без тела — 140 %). Платили мы это и за то, что не - * менялось: труп лежит неподвижно до выхода из комнаты, стоящий Кид — пока - * игрок не нажал клавишу, а перерисовывались они каждый кадр. - * - * Оптимизация: у каждой страницы дабл-буфера свой снимок ВХОДОВ отрисовки - * слота (поза, координаты, направление, меч, брызги, straddle). Если снимок - * совпал, спрайт этой страницы не стёрт и фона под ним никто не трогал — - * нужный кадр на странице УЖЕ нарисован, и heal/draw/fore пропускаются - * целиком. - * - * `pop_cd_touch` — «фон трогали ВОТ ЗДЕСЬ»: слой фона копит ПРЯМОУГОЛЬНИК - * своих правок по страницам дабл-буфера, и слот перерисовывается, только - * если тот задел его самого. Флага «трогали хоть что-то» не хватило: - * факелы анимируются КАЖДЫЙ кадр, и один факел в комнате обнулял пропуск - * для всех персонажей сразу (замер 2026-08-08: комната 1.1, Кид стоит — - * 597 684 такта, то есть ровно как без оптимизации). - * - * Метку ставит сам блит фона (`pop_blit_b`, по признаку «идёт не - * fore-проход») плюс те немногие места, что стирают фон голым `bar` или - * своим heal (падающий кусок, оверлей fore-heal). Координаты — ЭКРАННЫЕ - * (с POP_YOFF). Прямоугольник копится сразу для ОБЕИХ страниц: правку фона - * почти всегда повторяют на второй, а лишняя перерисовка персонажа дешевле - * лишнего состояния. Снимает метку главный цикл — после того, как - * персонажи на этой странице отрисованы. - * - * Резидент (pop_tile.c): зовёт и банковый слой фона, и резидентные листья, - * а трамплин на КАЖДЫЙ кусок фона стоил бы дороже самой метки. */ -extern uint8_t pop_cd_dirty; /* биты страниц: метка взведена */ -/* [страница][колонка] = диапазон затронутых ЭКРАННЫХ y; пусто = ymin 255, - * ymax 0. Раньше тут была маска колонок на три ряда по 63 px — она - * склеивала касания внутри ряда и заставляла перерисовывать нетронутого - * персонажа (разбор в шапке pop_cd_touch, pop_tile.c). */ -extern uint8_t pop_cd_ymin[2][10], pop_cd_ymax[2][10]; -/* Задели ли прямоугольник (ЭКРАННЫЕ координаты, x1/y1 включительно) то, - * что трогали на странице p. Резидент (pop_tile.c). */ -uint8_t pop_cd_hit(uint8_t p, int x0, int y0, int x1, int y1) __banked; -/* То же для СЛОТА персонажа: спрайт и накладной, координаты изнутри pop_cd - * (см. тело — там про цену пяти аргументов). */ -uint8_t pop_cd_hit_slot(uint8_t who, uint8_t p) __banked; -void pop_cd_clear(uint8_t p) __banked; /* снять метку страницы целиком */ -void pop_cd_init(void) __banked; /* пустые диапазоны на обеих страницах */ -void pop_cd_touch(int x, int y, int w, int h); -#define POP_CD_TOUCH_ALL() pop_cd_touch(0, 0, 320, 256) - -/* Пакетная пометка: между begin и end блиты КОПЯТ общий прямоугольник, и - * настоящая пометка ставится одна (на весь тайл), а не на каждый кусок. - * Скобку ставит draw_tile — выигрыш ~15% цены блита фона. Вкладывать - * скобки нельзя: аккумулятор один. */ -extern uint8_t pop_cd_batch; -void pop_cd_batch_begin(void); -void pop_cd_batch_end(void); - -/* ПОДАВИТЬ пометки на время серии блитов — для того, кто пометил область САМ - * и заведомо шире, чем нарисует (падающий кусок: pop_loose_mob_tick помечает - * весь коридор heal'а одним вызовом, а спрайт куска — три блита внутри него). - * Дешевле пакета: pop_cd_touch выходит второй проверкой, не считая ни колонок, - * ни рядов. Замер 2026-08-17: настоящий вызов pop_cd_touch = 4 502 такта, - * 28% всей цены блита. - * - * ОПАСНО применять без разбора: пропущенная пометка = персонаж, которого - * стёрли, но не попросили перерисоваться, то есть исчезнувший со экрана - * персонаж (ровно этот баг ловили 2026-08-13 в комнате 23). Ставить только - * там, где покрытие доказано. */ -void pop_cd_mute(void); -void pop_cd_unmute(void); - -/* Кого в этом кадре можно НЕ перерисовывать: бит 0 — Кид, бит 1 — соперник. - * Звать ДВАЖДЫ: перед heal (стирать нечего) и перед отрисовкой (тик мог - * персонажа всё-таки сдвинуть — тогда бит снимется сам, а pop_char_draw - * сотрёт прошлый кадр за нас). */ -uint8_t pop_char_skip_mask(void) __banked; - -/* ОТРАЖЕНИЕ В ЗЕРКАЛЕ (уровень 4, seg003:0798). Char к моменту вызова уже - * отражён (pop_check_mirror); clip_top — линия y_clip[curr_row+1], выше - * которой отражение не рисуется. Отдельно от pop_char_draw, потому что и в - * оригинале это сокращённый путь add_objtable(4): без клинка, брызг, - * fore-прохода и пропуска кадра. heal — парный вызов, рядом с - * pop_char_heal. */ -void pop_mirror_draw(int clip_top) __banked; -void pop_mirror_heal(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_cfg.h b/applications/SprPoP/src/pop_cfg.h deleted file mode 100644 index 78eefe9..0000000 --- a/applications/SprPoP/src/pop_cfg.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * pop_cfg.h — файл настроек POP.CFG (план docs/menu_settings_plan.md §6). - * Единственный владелец формата — модули pop_cfg_*; gameplay читает - * только pop_settings (pop_settings.h). - */ -#ifndef POP_CFG_H -#define POP_CFG_H - -#include - -/* Читает POP.CFG в pop_settings; файла нет / битый — остаются дефолты. - * 1 — прочитано из файла, 0 — дефолты (штатно), -1 — нет памяти. */ -int8_t pop_cfg_load(void) __banked; - -/* Записывает текущие pop_settings в POP.CFG. Звать после Apply/выхода - * из Settings. 1 — записано, 0 — ошибка записи, -1 — нет памяти. */ -int8_t pop_cfg_save(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_char.h b/applications/SprPoP/src/pop_char.h deleted file mode 100644 index b12e3a7..0000000 --- a/applications/SprPoP/src/pop_char.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * pop_char.h — состояние ПЕРСОНАЖА, общее для Кида, стража и активной - * копии Char. Порт char_type (types.h:302). - * - * Зачем отдельным заголовком: интерпретатор последовательностей в - * оригинале один на всех (работает с Char, а вокруг стоят - * loadkid/savekid и loadshad/saveshad, seg006:809). Пока у Кида был свой - * усечённый тип, а у стража свой, общий интерпретатор был невозможен. - * Поля и их порядок — как в char_type, чтобы порт seg005/seg006 ложился - * один в один. - */ -#ifndef POP_CHAR_H -#define POP_CHAR_H - -#include - -typedef struct { - uint8_t frame; - uint8_t x, y; - int8_t direction; /* -1 влево, 0 вправо */ - int8_t curr_col, curr_row; - uint8_t action; - int8_t fall_x, fall_y; - uint8_t room; - uint8_t repeat; - uint8_t charid; /* 0 = Kid, 2 = страж (см. CHARID_* в pop_guard.h) */ - uint8_t sword; - int8_t alive; /* -1 = жив (как в оригинале), 0 = убит */ - uint16_t curr_seq; /* адрес в seqtbl (база SEQTBL_BASE) */ -} pop_char_t; - -#endif diff --git a/applications/SprPoP/src/pop_cheat.h b/applications/SprPoP/src/pop_cheat.h deleted file mode 100644 index f58cc3a..0000000 --- a/applications/SprPoP/src/pop_cheat.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * pop_cheat.h — режим читов (порт cheats_enabled, seg000:111). - * - * В оригинале включается ключом командной строки megahit/debug и меняет - * набор доступных клавиш. У нас конфигурации/UI пока нет, поэтому это - * просто глобальный флаг: main ставит его при старте (на время разработки — - * ВКЛЮЧЁН). Клавиши читов обрабатывает главный цикл. - * - * Реализовано: K — убить стража (seg000:786), I/S/Shift+L (наши отладочные), - * [ / ] — подгонка Кида по X (seg000:1828), U — переворот экрана - * (seg000:793), F7/F8 — минута −/+ (аналог оригинальных keypad −/+). - * Остальные читы оригинала (перо, воскрешение, переход по комнатам) пока - * не портированы. - */ -#ifndef POP_CHEAT_H -#define POP_CHEAT_H - -#include -#include "pop_level.h" - -extern uint8_t pop_cheats; /* 0 = выключены, иначе включены */ - -#define KBD_CHEAT_KILL 0x42 /* K (PS/2 set 2) — kill guard */ -/* ОДИН СКАН-КОД, ДВА ЧИТА: Shift+I — переворот экрана (toggle_upside - * SDLPoP, keys.txt), Ctrl+I — наше бессмертие. Различает их модификатор. - * Переворот раньше стоял на голом U, но U отдан осмотру комнаты сверху - * (фаза D, keys_plan.md); бессмертие — на голом I. */ -#define KBD_KEY_I 0x43 - -/* Бессмертие по кругу — Ctrl+I. Наш чит, в оригинале его нет; вынесен под - * Ctrl, чтобы не занимать голую букву (решение пользователя 2026-08-27). */ -#define KBD_CHEAT_IMMO KBD_KEY_I -/* Ctrl+S (PS/2 set 2: S = 0x1B) — вкл/выкл звук; порт Ctrl+S из SDLPoP - * (seg000:657). С Ctrl, а не голая S: у оригинала клавиша именно такая. */ -#define KBD_SOUND_TOGGLE 0x1B -/* Ctrl+M — тумблер МУЗЫКИ, парный к Ctrl+S. Отдельный потому, что музыка - * у нас поток с диска: её выключают по другим причинам, чем эффекты. */ -#define KBD_MUSIC_TOGGLE 0x3A /* M (PS/2 set 2) */ -#define KBD_CHEAT_NEXTLVL 0x4B /* Shift+L (PS/2 set 2) — следующий уровень */ -#define KBD_CHEAT_XDEC 0x54 /* [ (PS/2 set 2) — сдвинуть Кида на 1 px влево */ -#define KBD_CHEAT_XINC 0x5B /* ] (PS/2 set 2) — сдвинуть Кида на 1 px вправо */ -#define KBD_CHEAT_UPSIDE KBD_KEY_I -/* ВРЕМЯ — на +/-, как в оригинале (keys.txt). Раньше стояло на F7/F8, - * потому что +/- занимал отладочный обход комнат; теперь обход уехал под - * Ctrl (см. sprpop.c, ROOMNAV), и клавиши освободились. Принимаем и - * основной ряд, и цифровой блок — на клавиатуре Sprinter есть оба. */ -#define KBD_TIME_SUB_MAIN 0x4E /* '-' основного ряда */ -#define KBD_TIME_SUB_NUM 0x7B /* '-' цифрового блока */ -#define KBD_TIME_ADD_MAIN 0x55 /* '=' основного ряда ('+' без Shift) */ -#define KBD_TIME_ADD_NUM 0x79 /* '+' цифрового блока */ - -/* Наши сверхштатные, все под Ctrl, чтобы не занимать голые буквы. */ -#define KBD_KEY_P 0x4D /* Ctrl+P — режим скорости (pop_pace.h) */ -#define KBD_KEY_W 0x1D /* Shift+W — медленное падение (feather_fall) */ -#define KBD_KEY_D 0x23 /* Ctrl+D — отладочная строка вкл/выкл */ -#define KBD_KEY_F 0x2B /* Ctrl+F — стоп-кадр, вкл/выкл одной клавишей */ - - -/* Старое имя оставлено для обработчика Shift+L; граница одна — pop_level.h. */ -#define POP_LAST_LEVEL POP_LEVEL_LAST - -#endif diff --git a/applications/SprPoP/src/pop_config.c b/applications/SprPoP/src/pop_config.c deleted file mode 100644 index 4c7dd56..0000000 --- a/applications/SprPoP/src/pop_config.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * pop_config.c — ВСЯ модель пользовательских настроек и POP.CFG (банк 9). - * - * Здесь вместе живут state, дефолты, бинарный codec и DSS I/O: это один - * модуль приложения, не библиотека. Данные остаются в общем W2 (для - * --bank-data нет ключа), код уезжает в банк 9. Игра читает только - * pop_settings либо свои runtime-флаги, которые синхронизирует - * pop_settings_apply(). - * - * POP.CFG v1: - * 0..3 "PCFG", 4 version, 5..6 payload size LE, payload, XOR, ~XOR. - * Неверный файл не меняет уже установленные дефолты. Расширенный payload - * v1 допустим: известны первые девять байтов, неизвестный хвост пропускается. - */ -#include -#include - -#ifndef POP_CONFIG_HOST_TEST -#include -#include -#include -#include -#include -#endif - -#include "pop_settings.h" -#include "pop_cfg.h" -#include "pop_pace.h" -#include "pop_cheat.h" -#include "pop_sfx.h" -#include "_pop_config.h" -#include "_pop_file.h" - -#define CFG_BASE 0x100 - -pop_settings_t pop_settings; - -static uint8_t cfg_checksum(const uint8_t *data, uint16_t size) -{ - uint8_t sum = 0; - while (size--) sum ^= *data++; - return sum; -} - -void pop_settings_defaults(void) __banked -{ - pop_settings.sound_enabled = 1; - pop_settings.music_enabled = 1; - pop_settings.speed_mode = POP_SPEED_NORMAL; - pop_settings.gameplay_profile = POP_PROFILE_VANILLA; - pop_settings.cheats_enabled = 1; /* пока SprPoP — dev-сборка */ - pop_settings.show_build_info = 0; - pop_settings.enhancement_flags = 0; - pop_settings.time_limit_enabled = 1; - pop_settings.show_debug_bar = 0; /* по умолчанию чистый экран */ -} - -/* Применить модель к настоящим владельцам runtime-состояния. Sound нельзя - * применять до pop_sfx_init(): тот поднимает набор и только затем знает, - * можно ли честно включить CBL. */ -void pop_settings_apply(uint8_t sound_ready) __banked -{ - pop_speed_mode = pop_settings.speed_mode; - pop_cheats = pop_settings.cheats_enabled; - if (sound_ready && pop_snd_want != pop_settings.sound_enabled) { - pop_sfx_toggle(); - /* Если звуковой набор не поднялся, toggle возвращает want в 0. - * Файл должен отражать фактически применимое состояние. */ - pop_settings.sound_enabled = pop_snd_want; - } - /* Музыке набор эффектов не нужен: она читается с диска отдельно, - * поэтому применяется всегда, а не по sound_ready. */ - pop_mus_want = pop_settings.music_enabled; -} - -void pop_cfg_encode(uint8_t *buf) -{ - uint8_t sum; - memcpy(buf, "PCFG", 4); - buf[4] = POP_CFG_VERSION; - buf[5] = POP_CFG_PAYLOAD_SIZE; - buf[6] = 0; - buf[7] = pop_settings.sound_enabled; - buf[8] = pop_settings.speed_mode; - buf[9] = pop_settings.gameplay_profile; - buf[10] = pop_settings.cheats_enabled; - buf[11] = pop_settings.show_build_info; - buf[12] = (uint8_t)pop_settings.enhancement_flags; - buf[13] = (uint8_t)(pop_settings.enhancement_flags >> 8); - buf[14] = pop_settings.time_limit_enabled; - buf[15] = pop_settings.show_debug_bar; - buf[16] = pop_settings.music_enabled; - sum = cfg_checksum(buf + POP_CFG_HEADER_SIZE, POP_CFG_PAYLOAD_SIZE); - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = (uint8_t)~sum; -} - -uint8_t pop_cfg_decode(const uint8_t *buf, uint16_t size) -{ - uint16_t payload_size, flags; - uint8_t sum; - - if (size < POP_CFG_MIN_SIZE || - memcmp(buf, "PCFG", 4) != 0 || buf[4] != POP_CFG_VERSION) - return 0; - payload_size = (uint16_t)(buf[5] | ((uint16_t)buf[6] << 8)); - if (payload_size < POP_CFG_LEGACY_PAYLOAD_SIZE || - payload_size > POP_CFG_MAX_PAYLOAD || - size != (uint16_t)(POP_CFG_HEADER_SIZE + payload_size + - POP_CFG_TAIL_SIZE)) - return 0; - sum = cfg_checksum(buf + POP_CFG_HEADER_SIZE, payload_size); - if (buf[POP_CFG_HEADER_SIZE + payload_size] != sum || - buf[POP_CFG_HEADER_SIZE + payload_size + 1] != (uint8_t)~sum) - return 0; - - /* Сначала проверить ВСЕ известные поля, только затем менять state. */ - if (buf[7] > 1 || buf[8] >= POP_SPEED_MODES || - buf[9] > POP_PROFILE_ENHANCED || buf[10] > 1 || buf[11] > 1) - return 0; - if (payload_size >= POP_CFG_TIMELIMIT_PAYLOAD_SIZE && buf[14] > 1) return 0; - if (payload_size >= POP_CFG_DEBUGBAR_PAYLOAD_SIZE && buf[15] > 1) return 0; - if (payload_size >= POP_CFG_PAYLOAD_SIZE && buf[16] > 1) return 0; - flags = (uint16_t)(buf[12] | ((uint16_t)buf[13] << 8)); - pop_settings.sound_enabled = buf[7]; - pop_settings.speed_mode = buf[8]; - /* ENHANCED пока не имеет аудита: безопасно понижаем до VANILLA. */ - pop_settings.gameplay_profile = POP_PROFILE_VANILLA; - pop_settings.cheats_enabled = buf[10]; - pop_settings.show_build_info = buf[11]; - pop_settings.enhancement_flags = flags; - /* Старый POP.CFG создавался до настройки таймера (и до тумблера - * отладочной полосы): отсутствующее поле означает исторический дефолт — - * ограничение 60 минут, включённую полосу и музыку, а не случайное - * значение в памяти. */ - pop_settings.time_limit_enabled = - (payload_size >= POP_CFG_TIMELIMIT_PAYLOAD_SIZE) ? buf[14] : 1; - pop_settings.show_debug_bar = - (payload_size >= POP_CFG_DEBUGBAR_PAYLOAD_SIZE) ? buf[15] : 1; - pop_settings.music_enabled = - (payload_size >= POP_CFG_PAYLOAD_SIZE) ? buf[16] : 1; - return 1; -} - -#ifndef POP_CONFIG_HOST_TEST - -/* В отличие от bank_load_file здесь нужен точный размер файла: только так - * отличаем валидный будущий payload от короткого/дописанного мусора. Буфер - * на стеке лежит в W2, то есть разрешён ESTEX; файл мал, EMM ему не нужен. */ -static uint8_t cfg_read_file(uint8_t *buf, uint16_t *size) -{ - int fd, got; - long n; - - POP_PATH_CALL(fd, open("POP.CFG", O_RDONLY)); - if (fd < 0) return 0; - n = lseek(fd, 0, SEEK_END); - if (n < POP_CFG_MIN_SIZE || n > POP_CFG_MAX_SIZE || - lseek(fd, 0, SEEK_SET) < 0) { - close(fd); - return 0; - } - got = read(fd, buf, (uint16_t)n); - if (close(fd) != 0 || got != (int)n) return 0; - *size = (uint16_t)n; - return 1; -} - -int8_t pop_cfg_load(void) __banked -{ - uint8_t buf[POP_CFG_MAX_SIZE]; - uint16_t size; - - if (!cfg_read_file(buf, &size) || !pop_cfg_decode(buf, size)) return 0; - if (buf[9] != POP_PROFILE_VANILLA) - puts("POP.CFG: ENHANCED profile -> VANILLA\n"); - return 1; -} - -int8_t pop_cfg_save(void) __banked -{ - uint8_t blk, page; - uint8_t buf[POP_CFG_SIZE]; - int rc; - - blk = mem_alloc_pages(1); - if (!blk) return -1; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - pop_cfg_encode(buf); - gfx_w0_map(page); - memcpy((uint8_t *)CFG_BASE, buf, sizeof(buf)); - gfx_w0_unmap(); - /* Не unlink: bank_save_file сам делает O_TRUNC и не создаёт лишнего - * окна, когда POP.CFG вообще отсутствует после ошибки unlink. */ - POP_PATH_CALL(rc, bank_save_file(page, CFG_BASE, "POP.CFG", sizeof(buf))); - mem_free_block(blk); - return (rc == sizeof(buf)) ? 1 : 0; -} - -#endif diff --git a/applications/SprPoP/src/pop_ctrl.c b/applications/SprPoP/src/pop_ctrl.c deleted file mode 100644 index 91c5d64..0000000 --- a/applications/SprPoP/src/pop_ctrl.c +++ /dev/null @@ -1,889 +0,0 @@ -/* - * pop_ctrl.c — управление Kid (Фаза K2b). Порт SDLPoP: - * вход — read_user_control/user_control/rest_ctrl_1/save_ctrl_1 - * (seg006.c) поверх held-state ; - * диспетчер — control() + control_standing/turning/startrun/running/ - * crouched (seg005.c), Kid-only ветки (без меча/стражи); - * действия — forward/back/up/down_pressed, crouch, standing_jump, - * run_jump, safe_step (seg005.c). - * - * Map-запросы (стена/край/захват) ЗАСТАБЛЕНЫ «открытый пол» (map_* ниже) — - * реальная коллизия в K3/K4. Поэтому: forward -> всегда бег, down -> присед, - * back -> разворот, up+forward -> прыжок с места; osторожный шаг и climb - * помечены TODO(K3/K4). - * - * Значения CONTROL_* (types.h): RELEASED=0, IGNORE=1, HELD=-1; - * X: LEFT/FORWARD=-1, RIGHT/BACKWARD=+1; Y: UP=-1, DOWN=+1. - */ -#include -#include -#include "pop_state.h" -#include "pop_ctrl.h" /* свой API (__banked) + объявления шины control_* */ -#include "pop_kid.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_music.h" /* pop_mus_left — «тема ещё звучит» */ -#include "pop_map.h" -#include "pop_level.h" /* pop_current_level — вступительная тема 1-го */ -#include "pop_guard.h" /* charid, состояние меча, seq стража */ - -/* ---- CONTROL_* и seq/frame id (подмножество types.h) --------------- */ -#define CONTROL_RELEASED 0 -#define CONTROL_IGNORE 1 -#define CONTROL_HELD (-1) -#define CONTROL_HELD_LEFT (-1) -#define CONTROL_HELD_RIGHT 1 -#define CONTROL_HELD_FORWARD (-1) -#define CONTROL_HELD_BACKWARD 1 -#define CONTROL_HELD_UP (-1) -#define CONTROL_HELD_DOWN 1 - -#define DIR_RIGHT 0 /* dir_0_right */ - -#define SEQ_1_START_RUN 1 -#define SEQ_2_STAND 2 -#define SEQ_3_STANDING_JUMP 3 -#define SEQ_4_RUN_JUMP 4 -#define SEQ_5_TURN 5 -#define SEQ_6_RUN_TURN 6 -#define SEQ_13_STOP_RUN 13 -#define SEQ_26_CROUCH_WHILE_RUNNING 26 -#define SEQ_43_START_RUN_AFTER_TURN 43 -#define SEQ_49_STAND_UP_FROM_CROUCH 49 -#define SEQ_50_CROUCH 50 -#define SEQ_79_CROUCH_HOP 79 -#define SEQ_78_DRINK 78 /* выпить зелье */ -#define SEQ_91_PICKUP_SWORD 91 /* поднять меч (pickupsword) */ -#define SEQ_STEP_BASE 28 /* +distance(1..14) = seq 29..42 шаг-N */ -#define SEQ_39_UNSAFE_STEP 39 /* шаг за кромку (distance 11) */ -#define SEQ_44_STEP_ON_EDGE 44 -#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */ -#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */ -#define SEQ_25_HANG_AGAINST_WALL 25 /* вис у стены (Shift в висе) */ -#define SEQ_GO_UP_LEVELDOOR 70 /* seq_70_go_up_on_level_door */ - -#define FRAME_7_RUN 7 -#define FRAME_11_RUN 11 -#define FRAME_15_STAND 15 -#define FRAME_48_TURN 48 -#define FRAME_50_TURN 50 -#define FRAME_67_JUMPUP1 67 -#define FRAME_70_JUMPHANG 70 -#define FRAME_87_HANG1 87 -#define FRAME_109_CROUCH 109 - -/* ---- Состояние управления (seg006 globals) ------------------------ * - * Сами control_* ЖИВУТ В pop_state.c, а не здесь. Модуль уехал в БАНК 5, - * а шину пишут с трёх сторон (этот банк, guards.c из банка 1) и читают из - * банка 3 (pop_map) — это ровно тот случай, для которого pop_state и - * заведён. Сегодня оно работало бы и отсюда: банки собираются БЕЗ - * --bank-data, поэтому их писучие данные остаются в общем _DATA. Но это - * флаг сборки, а не свойство кода: включат --bank-data ради экономии - * W1/W2 — и шина молча уедет в страницу банка. - * - * ctrl1_* остаются здесь: их трогает только этот модуль. */ -static int8_t ctrl1_forward, ctrl1_backward, ctrl1_up, ctrl1_down, ctrl1_shift2; - -/* ---- seqtbl_offset_char: сменить последовательность Kid ------------ * - * Обёртка над kid_set_seq (единая точка в pop_kid — kid_seq_off/kid_seqtbl - * не дублируются в этот TU). */ -/* В оригинале seqtbl_offset_char работает с АКТИВНЫМ персонажем, и - * control() вызывается внутри окна Char. Раньше макрос вёл на - * kid_set_seq (пишет прямо в Kid) — после введения окна это ломало ввод: - * savekid затирал Kid копией Char со старой curr_seq. */ -#define seqtbl_offset_char(seq) pop_char_set_seq(seq) - -static int8_t release_arrows(void) -{ - control_backward = control_forward = control_up = control_down = CONTROL_RELEASED; - return CONTROL_IGNORE; /* seg006: return 1 */ -} - -#define TILE_CHOMPER 18 /* tiles_18_chomper (исключение в forward_pressed) */ - -/* Край/стена впереди — из pop_map (get_edge_distance): pop_edge_distance() - * возвращает дистанцию и ставит pop_edge_type() = EDGE_WALL/FLOOR/CLOSER. */ - -/* ---- Действия (seg005) -------------------------------------------- */ -static void crouch(void) -{ - seqtbl_offset_char(SEQ_50_CROUCH); - control_down = release_arrows(); -} - -static void standing_jump(void) -{ - control_up = control_forward = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_3_STANDING_JUMP); -} - -/* check_get_item (seg005:061F): решение по тайлам принимает pop_map, здесь - * только исполнение. Триггер в оригинале — Shift (control_shift2) в стойке - * или в приседе: первый раз Kid приседает к предмету, второй — поднимает. - * Возврат 1 = управление обработано (caller делает return). */ -static uint8_t get_item_action(void) -{ - uint8_t a = pop_get_item_action(); - if (a == 1) { crouch(); return 1; } - if (a == 2) { - control_shift2 = CONTROL_IGNORE; /* do_pickup: без авто-повтора */ - seqtbl_offset_char(SEQ_91_PICKUP_SWORD); - return 1; - } - if (a == 3) { /* зелье — выпить (get_item) */ - control_shift2 = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_78_DRINK); - return 1; - } - return 0; -} - -/* run_jump (seg005:0AA8). Выравнивание по кромке пола живёт в pop_map - * (там тайловые запросы) — pop_run_jump_align; здесь только диспетчерская - * часть. Отказ выравнивателя = прыжка в этом кадре НЕТ, и control_up - * гасить нельзя: Кид бежит дальше с зажатой «вверх» и попробует снова на - * следующем кадре. Ровно так игрок и «ловит» фазу перед провалом. */ -static void run_jump(void) -{ - if (Char.frame >= FRAME_7_RUN) { - if (!pop_run_jump_align()) return; - control_up = release_arrows(); - seqtbl_offset_char(SEQ_4_RUN_JUMP); - } -} - -static void safe_step(void); /* fwd */ -static void draw_sword(void); /* fwd: нужен в control_standing */ - -static void forward_pressed(void) -{ - int distance = pop_edge_distance(); - /* seg005:0577 — «у стены шагаем, а не бежим», НО чомпер из этого правила - * ЯВНО исключён (`curr_tile2 != tiles_18_chomper`). Он проходим в - * разомкнутой фазе, и оригинал даёт разбежаться сразу: без исключения - * Кид перед чомпером делает лишний осторожный шаг, а это кадры — и он - * не успевает проскочить между челюстями (поймано на приёмке - * 2026-08-08, комната 3.22). */ - if (pop_edge_type() == EDGE_WALL && pop_edge_tile() != TILE_CHOMPER && - distance < 8) { - if (control_forward == CONTROL_HELD) - safe_step(); - } else { - seqtbl_offset_char(SEQ_1_START_RUN); - } -} - -static void back_pressed(void) -{ - control_backward = release_arrows(); - /* Kid без меча -> просто разворот. */ - seqtbl_offset_char(SEQ_5_TURN); -} - -static void down_pressed(void) -{ - control_down = CONTROL_IGNORE; /* без авто-повтора */ - /* У края пола (край сзади) со зацепом снизу — спуск на этаж (seq_68); - * у передней кромки — отступ; иначе присед. Решает pop_down_action. */ - if (!pop_down_action()) - crouch(); -} - -/* Прыжок вверх в стойке (seg005 check_jump_up): чистый вертикальный прыжок - * ЛИБО прыжок-с-зацепом за уступ выше (запрыгнуть на этаж вверх). Выбор seq - * + выравнивание Kid.x — в pop_jump_up_seq (pop_map). */ -static void jump_up(void) -{ - control_up = release_arrows(); - seqtbl_offset_char(pop_jump_up_seq()); -} - -static void up_pressed(void) -{ - /* Дверь уровня рядом и открыта → войти в неё: постановку в проём - * (go_up_leveldoor) делает pop_leveldoor_enter, здесь остаётся только - * последовательность подъёма по лестнице. Телепортов у нас нет — это - * модификация SDLPoP, а не оригинал. - * Иначе: ↑+forward = прыжок с места, иначе вертикальный прыжок вверх. */ - if (pop_leveldoor_enter()) { - seqtbl_offset_char(SEQ_GO_UP_LEVELDOOR); - return; - } - if (control_x == CONTROL_HELD_FORWARD) - standing_jump(); - else - jump_up(); -} - -/* Осторожный шаг (Shift+forward): шаг РОВНО до кромки/стены. distance>0 — - * шаг длины distance (seq 29..42 = step1..step14); ==0 у края — шаг на - * кромку (seq_44) либо неосторожный шаг за край (seq_39). Порт seg005. */ -static void safe_step(void) -{ - int distance; - control_shift2 = CONTROL_IGNORE; /* без авто-повтора */ - control_forward = CONTROL_IGNORE; - distance = pop_edge_distance(); - if (distance) { - Char.repeat = 1; - seqtbl_offset_char((uint8_t)(distance + SEQ_STEP_BASE)); - } else if (pop_edge_type() == EDGE_WALL) { - /* ВПЛОТНУЮ К ПРЕПЯТСТВИЮ. Оригинал (seg005:0604) уходит здесь в - * seq_39 — а это шаг на ОДИННАДЦАТЬ пикселей, который останавливает - * только бамп. - * - * ЧОМПЕР: бампа нет по определению (в разомкнутой фазе он не - * препятствие, is_obstacle требует modif == 2), и шаг обязан пройти - * целиком — иначе Кид топчется на 1 px и не успевает между - * челюстями. Здесь играем оригинальный seq_39. - * - * СТЕНА И ВОРОТА: держим «шаг-1» — осознанное приближение. Наш бамп - * ловит не тот же кадр, что у оригинала (см. BUG-SEAM-PINGPONG, там - * трасса живого SDLPoP: `safe_step(d=0) -> step, на первом dx(1) - * x=62 -> bump`), и с полным seq_39 Кид ПРОБЕГАЕТ сквозь закрытые - * ворота шва комнаты 6 — поймано приёмкой 2026-08-08. Пока бамп не - * сойдётся с оригиналом покадрово, этот шаг остаётся коротким. */ - if (pop_edge_tile() == TILE_CHOMPER) { - seqtbl_offset_char(SEQ_39_UNSAFE_STEP); - } else { - Char.repeat = 1; - seqtbl_offset_char((uint8_t)(1 + SEQ_STEP_BASE)); - } - } else if (Char.repeat != 0) { - Char.repeat = 0; - seqtbl_offset_char(SEQ_44_STEP_ON_EDGE); - } else { - seqtbl_offset_char(SEQ_39_UNSAFE_STEP); /* реальный обрыв (edge=CLOSER) */ - } -} - -/* Автомат вступительной темы уровня 1 (порт need_level1_music): - * 0 — не нужна, 1 — пора пустить, 2 — играет, ждём конца. */ -static uint8_t lvl1_music; - -/* seg003:45 — need_level1_music = (level == 1). Ставит старт уровня. */ -void pop_ctrl_level_start(void) __banked -{ - lvl1_music = (uint8_t)(pop_current_level == 1); -} - -/* ---- control_* обработчики состояний ------------------------------ */ -static void control_crouched(void) -{ - /* ВСТУПЛЕНИЕ ПЕРВОГО УРОВНЯ (seg005:02EB) — это не «звук при приседе», а - * маленький автомат, и Кид на его время ОБЕЗДВИЖЕН: - * 1 — ничего не звучит: пустить тему, перейти в 2; - * 2 — ждать, пока она доиграет, и только тогда отпустить управление. - * Оттого Кид и сидит в начале игры, пока не смолкнет музыка. - * - * Я сперва сделал проще — «сыграть при первом приседе», — и тема - * догоняла игрока посреди уровня: пробежал, спрыгнул, присел — заиграла - * (поймано пользователем). - * - * Ждём по pop_mus_left: это курсор насоса, он резидентный и правдиво - * отвечает «трек ещё звучит». Если музыка выключена или заявку никто - * не обработал, курсор так и останется нулём — Кид просто встанет, а - * не сядет навсегда. */ - if (lvl1_music && pop_current_level == 1) { - if (!pop_mus_left) { - if (lvl1_music == 1) { - pop_sfx_play(25); - lvl1_music = 2; - } else { - lvl1_music = 0; - } - } - return; /* управление на это время не читаем */ - } - lvl1_music = 0; - /* Shift в приседе — поднять предмет (seg005 control_crouched). */ - if (control_shift2 == CONTROL_HELD && get_item_action()) return; - if (control_y != CONTROL_HELD_DOWN) { - seqtbl_offset_char(SEQ_49_STAND_UP_FROM_CROUCH); - } else if (control_forward == CONTROL_HELD) { - control_forward = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_79_CROUCH_HOP); - } -} - -static void control_standing(void) -{ - /* Shift в стойке над предметом — присесть к нему (seg005:0358, первая - * строка control_standing). Идёт ДО остальных shift-веток. */ - if (control_shift2 == CONTROL_HELD && control_shift == CONTROL_HELD && - get_item_action()) - return; - /* Ветку «charid != kid && вниз+вперёд -> draw_sword» не портируем: у нас - * соперник до control_standing не доходит, его перехватывает - * control_guard_inactive в самом диспетчере (порядок как в seg005). */ - - /* seg005:352 — Кид с мечом ВИДИТ активного стража: достаёт клинок сам. - * Без этого игрок стоит с мечом в ножнах, пока его рубят. */ - if (pop_have_sword) { - if (offguard != 0 && control_shift >= CONTROL_RELEASED) { - /* Меч убран намеренно (down в бою) — не доставать, пока не - * отпустят Shift; в оригинале это переход на loc_6213. */ - } else if (can_guard_see_kid >= 2) { - int16_t d = pop_char_opp_dist(); - if (d >= -10 && d < 90) { - holding_sword = 1; - /* (word)d < (word)-6 — беззнаковое: истинно для ВСЕГО, кроме - * −6..−1. То есть «страж вплотную за спиной» -> отступить, - * иначе достать меч. */ - if (d >= -6 && d < 0) { back_pressed(); return; } - draw_sword(); - return; - } - } else { - offguard = 0; - } - } - - if (control_shift == CONTROL_HELD) { - if (control_backward == CONTROL_HELD) back_pressed(); - else if (control_up == CONTROL_HELD) up_pressed(); - else if (control_down == CONTROL_HELD) down_pressed(); - else if (control_x == CONTROL_HELD_FORWARD && control_forward == CONTROL_HELD) - safe_step(); - } else if (control_forward == CONTROL_HELD) { - if (control_up == CONTROL_HELD) standing_jump(); /* keyboard mode */ - else forward_pressed(); - } else if (control_backward == CONTROL_HELD) { - back_pressed(); - } else if (control_up == CONTROL_HELD) { - if (control_forward == CONTROL_HELD) standing_jump(); - else up_pressed(); - } else if (control_down == CONTROL_HELD) { - down_pressed(); - } else if (control_x == CONTROL_HELD_FORWARD) { - forward_pressed(); - } -} - -static void control_turning(void) -{ - if (control_shift >= CONTROL_RELEASED && - control_x == CONTROL_HELD_FORWARD && control_y >= CONTROL_RELEASED) { - seqtbl_offset_char(SEQ_43_START_RUN_AFTER_TURN); - } -} - -static void control_startrun(void) -{ - if (control_y == CONTROL_HELD_UP && control_x == CONTROL_HELD_FORWARD) - standing_jump(); -} - -static void control_running(void) -{ - /* Стену НЕ обрабатываем тут — check_bumped (pop_phys_tick) даёт отскок - * seq_47 при беге в стену (как оригинал), с корректной позицией. */ - if (control_x == CONTROL_RELEASED && - (Char.frame == FRAME_7_RUN || Char.frame == FRAME_11_RUN)) { - control_forward = release_arrows(); - seqtbl_offset_char(SEQ_13_STOP_RUN); - } else if (control_x == CONTROL_HELD_BACKWARD) { - control_backward = release_arrows(); - seqtbl_offset_char(SEQ_6_RUN_TURN); - } else if (control_y == CONTROL_HELD_UP && control_up == CONTROL_HELD) { - run_jump(); - } else if (control_down == CONTROL_HELD) { - control_down = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_26_CROUCH_WHILE_RUNNING); - } -} - -/* ---- Вис (seg005 control_hanging/can_climb_up/hang_fall) ---------- * - * Тайловые решения (можно ли подтянуться, куда сорваться) — в pop_map; - * здесь управление осями control_*. */ -static void hang_fall(void) -{ - control_down = release_arrows(); - seqtbl_offset_char(pop_hang_fall_seq()); /* seq_23/seq_11 (+ выравнивание x) */ -} - -static void can_climb_up(void) -{ - control_up = control_shift2 = release_arrows(); - seqtbl_offset_char(pop_hang_climb_up_seq()); /* seq_10 / seq_73 */ -} - -static void control_hanging(void) -{ - if (control_y == CONTROL_HELD && pop_hang_grab_ready()) { - can_climb_up(); /* ↑ — подтянуться */ - } else if (control_shift == CONTROL_HELD) { - int8_t w = pop_hang_wall(); - if (w > 0) seqtbl_offset_char(SEQ_25_HANG_AGAINST_WALL); /* у стены */ - else if (w < 0) hang_fall(); /* сорваться */ - /* w==0: сверху пол — держимся (ничего) */ - } else { - hang_fall(); /* отпустил Shift — сорваться */ - } -} - -/* control_jumpup (seg005): в старте прыжка вверх ←/→ или forward → перевести - * в прыжок с места. */ -static void control_jumpup(void) -{ - if (control_x == CONTROL_HELD_FORWARD || control_forward == CONTROL_HELD) - standing_jump(); -} - -/* draw_sword (seg005:945): достать меч. Кид переходит в seq_55 (подъём - * клинка со звуком), соперник — сразу в стойку en garde (seq_90). Стрелки - * гасятся, чтобы «вперёд», которым меч достали, не сработало второй раз - * уже как выпад. */ -static void draw_sword(void) -{ - uint8_t seq_id = SEQ_55_DRAW_SWORD; - control_forward = control_shift2 = release_arrows(); - if (Char.charid == CHARID_0_KID) { - offguard = 0; - pop_sfx_play(19); /* seg005:945 — меч из ножен */ - } else if (Char.charid != CHARID_1_SHADOW) { - seq_id = SEQ_90_EN_GARDE; /* соперник встаёт сразу в стойку */ - } - Char.sword = SWORD_2_DRAWN; - seqtbl_offset_char(seq_id); -} - -/* control_guard_inactive (seg006:2123): неактивный страж реагирует ТОЛЬКО в - * кадре 166 (стойка) и только на «вниз»: вниз+вперёд — достать меч, - * вниз без «вперёд» — развернуться (stand flipped). */ -static void control_guard_inactive(void) -{ - if (Char.frame == FRAME_166_STAND_INACTIVE && control_down == CONTROL_HELD) { - if (control_forward == CONTROL_HELD) { - draw_sword(); - } else { - control_down = CONTROL_IGNORE; - seqtbl_offset_char(SEQ_80_STAND_FLIPPED); - } - } -} - -/* ---- Боёвка (seg005:964..) ---------------------------------------- * - * Всё это ветки ОБЩЕГО диспетчера: у стража тот же control(), просто - * control_* ему выставляет ИИ (autocontrol_*, guards.c), а не клавиатура. */ - -/* back_with_sword (seg005): шаг назад — только из стоек. */ -static void back_with_sword(void) -{ - uint8_t f = Char.frame; - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_backward = CONTROL_IGNORE; /* без авто-повтора */ - seqtbl_offset_char(SEQ_57_BACK_WITH_SWORD); - } -} - -/* forward_with_sword (seg005): шаг вперёд; у стража своя последовательность. */ -static void forward_with_sword(void) -{ - uint8_t f = Char.frame; - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_forward = CONTROL_IGNORE; - seqtbl_offset_char(Char.charid != CHARID_0_KID ? SEQ_56_GUARD_FORWARD - : SEQ_86_FORWARD_WITH_SWORD); - } -} - -/* sword_strike (seg005): выпад из стойки/шага либо добивание после парирования. */ -static void sword_strike(void) -{ - uint8_t f = Char.frame; - uint8_t seq_id; - if (f == FRAME_157_WALK_WITH_SWORD || f == FRAME_158_STAND_WITH_SWORD || - f == FRAME_170_STAND_WITH_SWORD || f == FRAME_171_STAND_WITH_SWORD || - f == FRAME_165_WALK_WITH_SWORD) { - seq_id = (Char.charid == CHARID_0_KID) ? SEQ_75_STRIKE : SEQ_58_GUARD_STRIKE; - } else if (f == FRAME_150_PARRY || f == FRAME_161_PARRY) { - seq_id = SEQ_66_STRIKE_AFTER_PARRY; - } else { - return; - } - control_shift2 = CONTROL_IGNORE; - seqtbl_offset_char(seq_id); -} - -/* parry (seg005): блок. Условие сильно разное у Кида и у соперника — - * соперник блокирует ТОЛЬКО на кадре 152 (второй кадр удара), а Кид ещё и - * по 153 (и тогда последовательность прокручивается сразу). */ -static void parry(void) -{ - uint8_t cf = Char.frame, of = Opp.frame; - uint8_t seq_id = SEQ_62_PARRY; - uint8_t do_play_seq = 0; - - if (cf == FRAME_158_STAND_WITH_SWORD || cf == FRAME_170_STAND_WITH_SWORD || - cf == FRAME_171_STAND_WITH_SWORD || cf == FRAME_168_BACK || - cf == FRAME_165_WALK_WITH_SWORD) { - if (pop_char_opp_dist() >= 32 && Char.charid != CHARID_0_KID) { - back_with_sword(); - return; - } else if (Char.charid == CHARID_0_KID) { - if (of == FRAME_168_BACK) return; - if (of != FRAME_151_STRIKE_1 && of != FRAME_152_STRIKE_2 && - of != FRAME_162_BLOCK_TO_STRIKE) { - if (of == FRAME_153_STRIKE_3) do_play_seq = 1; - } - } else { - if (of != FRAME_152_STRIKE_2) return; - } - } else { - if (cf != FRAME_167_BLOCKED) return; - seq_id = SEQ_61_PARRY_AFTER_STRIKE; - } - control_up = CONTROL_IGNORE; - seqtbl_offset_char(seq_id); - if (do_play_seq) play_seq(); -} - -/* swordfight (seg005:0CDB) — разбор ввода в бою. Порядок веток важен: - * удар старше «убрать меч», тот старше блока, блок старше шагов. */ -static void swordfight(void) -{ - uint8_t f = Char.frame; - uint8_t seq_id; - - if (f == FRAME_161_PARRY && control_shift2 >= CONTROL_RELEASED) { - seqtbl_offset_char(SEQ_57_BACK_WITH_SWORD); /* отскок после парирования */ - return; - } else if (control_shift2 == CONTROL_HELD) { - if (Char.charid == CHARID_0_KID) kid_sword_strike = 15; - sword_strike(); - if (control_shift2 == CONTROL_IGNORE) return; - } - - if (control_down == CONTROL_HELD) { - if (f == FRAME_158_STAND_WITH_SWORD || f == FRAME_170_STAND_WITH_SWORD || - f == FRAME_171_STAND_WITH_SWORD) { - control_down = CONTROL_IGNORE; - Char.sword = SWORD_0_SHEATHED; - if (Char.charid == CHARID_0_KID) { - offguard = 1; /* убрал намеренно — сразу не доставать */ - guard_refrac = 9; /* и страж на это время придержан */ - holding_sword = 0; - seq_id = SEQ_93_PUT_SWORD_AWAY_FAST; - } else if (Char.charid == CHARID_1_SHADOW) { - seq_id = SEQ_92_PUT_SWORD_AWAY; - } else { - seq_id = SEQ_87_GUARD_BECOME_INACT; /* Кид ушёл из виду */ - } - seqtbl_offset_char(seq_id); - } - } else if (control_up == CONTROL_HELD) { - parry(); - } else if (control_forward == CONTROL_HELD) { - forward_with_sword(); - } else if (control_backward == CONTROL_HELD) { - back_with_sword(); - } -} - -/* control_with_sword (seg005:964): пока соперник виден и близко — бой; - * иначе страж убирает меч, а Кид просто стоит. */ -static void control_with_sword(void) -{ - if (Char.action >= 2) return; /* actions_2_hang_climb и выше */ - if (pop_tile_at(Char.curr_col, Char.curr_row) == 11 /* loose */ || - can_guard_see_kid >= 2) { - int16_t d = pop_char_opp_dist(); - if (d < 90) { - if (d >= 0) { swordfight(); return; } - /* Соперник за спиной: далеко — развернуться, вплотную — драться. */ - if (d < -4) { seqtbl_offset_char(SEQ_60_TURN_WITH_SWORD); return; } - swordfight(); - return; - } - } - /* Не видит / далеко. */ - if (Char.charid == CHARID_0_KID && Char.alive < 0) - holding_sword = 0; /* seg005:980 — индикатор HP стража */ - if (Char.charid < CHARID_2_GUARD) { - if (Char.frame == FRAME_171_STAND_WITH_SWORD) { - Char.sword = SWORD_0_SHEATHED; - seqtbl_offset_char(SEQ_92_PUT_SWORD_AWAY); /* страж убит */ - } - } else { - swordfight(); - } -} - -/* control() — диспетчер по кадру (seg005.c:252) для АКТИВНОГО персонажа. */ -void pop_control(void) __banked -{ - uint8_t f = Char.frame; - /* seg005 control(), самая первая ветка: персонаж УМИРАЕТ (alive >= 0). - * Из любой стойки он валится в seq_71_dying; остальное управление в - * этом состоянии не обрабатывается. Через это же место проходит чит K - * (pop_guard_kill ставит Guard.alive = 0). */ - if (Char.alive >= 0) { - if (f == FRAME_15_STAND || f == FRAME_166_STAND_INACTIVE || - f == FRAME_158_STAND_WITH_SWORD || f == FRAME_171_STAND_WITH_SWORD) - seqtbl_offset_char(SEQ_71_DYING); - return; - } - /* seg005 control(): в отскоке (bumped) и в свободном падении управление - * НЕ обрабатывается вовсе — только гасятся стрелки. Без этого игрок - * прерывает присед после удара (medland/плита по голове) нажатием ↑, и - * последовательность не доигрывает свои dy(1)+dy(1), компенсирующие - * стартовый dy(-2) → Kid навсегда остаётся на 2px выше пола (баг «Y на - * пару пикселей меньше, чем должен»). */ - if (Char.action == 5 || Char.action == 4) { /* bumped / in_freefall */ - release_arrows(); - return; - } - /* Порядок веток — как в seg005: меч старше charid, charid старше кадров. - * Пока Kid безоружен, обе ветки — про стража. */ - if (Char.sword == SWORD_2_DRAWN) - control_with_sword(); - else if (Char.charid >= CHARID_2_GUARD) - control_guard_inactive(); - else if (f == FRAME_15_STAND || (f >= FRAME_50_TURN && f < 53)) - control_standing(); - else if (f == FRAME_48_TURN) - control_turning(); - else if (f < 4) - control_startrun(); - else if (f >= FRAME_67_JUMPUP1 && f < FRAME_70_JUMPHANG) - control_jumpup(); - else if (f < FRAME_15_STAND) - control_running(); - else if (f >= FRAME_87_HANG1 && f < 100) - control_hanging(); - else if (f == FRAME_109_CROUCH) - control_crouched(); -} - -/* ---- Модель ввода (seg006) ---------------------------------------- */ -/* Диагональные дублёры оригинала (keys.txt): Home = «прыжок влево», Page Up - * = «прыжок вправо». У SDLPoP это не отдельные действия, а ровно те же - * Up+Left / Up+Right, поэтому и здесь они просто ДОБАВЛЯЮТСЯ к стрелкам: - * заводить им ветку в диспетчере не нужно, и любой будущий разбор - * «откуда взялся прыжок» останется одним. */ -#define KBD_HOME (KBD_EXT | 0x6C) -#define KBD_PGUP (KBD_EXT | 0x7D) -/* Центр нумпада (KP5) — тоже «вниз», как просит раскладка оригинала: там - * весь блок 7/8/9-4/6-1/2/3 был управлением, и середина работала как - * приседание. Своей навигационной клавиши у KP5 нет, поэтому после - * kbd_raw_keypad_as_ext его голый код 0x73 переезжает в EXT-половину как - * есть — читаем оттуда и добавляем к стрелке «вниз». */ -#define KBD_KP5 (KBD_EXT | 0x73) - -static void read_input(void) -{ - uint8_t home = kbd_raw_down(KBD_HOME); - uint8_t pgup = kbd_raw_down(KBD_PGUP); - uint8_t l = (uint8_t)(kbd_raw_down(KBD_LEFT) || home); - uint8_t r = (uint8_t)(kbd_raw_down(KBD_RIGHT) || pgup); - uint8_t u = (uint8_t)(kbd_raw_down(KBD_UP) || home || pgup); - uint8_t d = (uint8_t)(kbd_raw_down(KBD_DOWN) || kbd_raw_down(KBD_KP5)); - control_x = r ? CONTROL_HELD_RIGHT : (l ? CONTROL_HELD_LEFT : CONTROL_RELEASED); - control_y = d ? CONTROL_HELD_DOWN : (u ? CONTROL_HELD_UP : CONTROL_RELEASED); - control_shift = (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT)) - ? CONTROL_HELD : CONTROL_RELEASED; -} - -/* read_user_control (seg006:1557): «свежее нажатие» (RELEASED->HELD) с - * подавлением авто-повтора (IGNORE держится, пока клавишу не отпустят). */ -static void read_user_control(void) -{ - if (control_forward >= CONTROL_RELEASED) { - if (control_x == CONTROL_HELD_FORWARD) { - if (control_forward == CONTROL_RELEASED) control_forward = CONTROL_HELD; - } else control_forward = CONTROL_RELEASED; - } - if (control_backward >= CONTROL_RELEASED) { - if (control_x == CONTROL_HELD_BACKWARD) { - if (control_backward == CONTROL_RELEASED) control_backward = CONTROL_HELD; - } else control_backward = CONTROL_RELEASED; - } - if (control_up >= CONTROL_RELEASED) { - if (control_y == CONTROL_HELD_UP) { - if (control_up == CONTROL_RELEASED) control_up = CONTROL_HELD; - } else control_up = CONTROL_RELEASED; - } - if (control_down >= CONTROL_RELEASED) { - if (control_y == CONTROL_HELD_DOWN) { - if (control_down == CONTROL_RELEASED) control_down = CONTROL_HELD; - } else control_down = CONTROL_RELEASED; - } - if (control_shift2 >= CONTROL_RELEASED) { - if (control_shift == CONTROL_HELD) { - if (control_shift2 == CONTROL_RELEASED) control_shift2 = CONTROL_HELD; - } else control_shift2 = CONTROL_RELEASED; - } -} - -static void flip_control_x(void) -{ - int8_t t; - control_x = (int8_t)-control_x; - t = control_forward; control_forward = control_backward; control_backward = t; -} - -/* user_control (seg006:0DC0): «вперёд» относительно направления Kid. */ -static void user_control(void) -{ - if (Char.direction >= DIR_RIGHT) { - flip_control_x(); - pop_control(); - flip_control_x(); - } else { - pop_control(); - } -} - -static void rest_ctrl_1(void) -{ - control_forward = ctrl1_forward; control_backward = ctrl1_backward; - control_up = ctrl1_up; control_down = ctrl1_down; control_shift2 = ctrl1_shift2; -} -static void save_ctrl_1(void) -{ - ctrl1_forward = control_forward; ctrl1_backward = control_backward; - ctrl1_up = control_up; ctrl1_down = control_down; ctrl1_shift2 = control_shift2; -} - -/* Общий хвост control_kid: raw-ввод и attract-demo различаются только тем, - * кто до него заполнил control_*. Окно Char и ctrl1_* обязаны быть теми же, - * иначе запись demo_moves перестаёт совпадать с логикой обычного игрока. */ -static void ctrl_kid_dispatch(void) -{ - pop_loadkid(); - pop_load_fram_det_col(); - user_control(); - pop_savekid_state(); - save_ctrl_1(); -} - -static void ctrl_kid_death(void) -{ - /* control_kid (seg006:0CD1): HP кончились — персонаж мёртв. */ - if (Kid.alive < 0 && hitp_curr == 0) { - Kid.alive = 0; - pop_kid_dead = 1; - /* play_death_music (seg006:15B5): траурный трек зависит от того, - * КАК умер Кид — в бою, от руки тени или просто так. Оригинал ждёт - * шести тиков, чтобы доиграл звук удара; у нас ждать не нужно — - * насос держит курсор музыки, пока звучит эффект. - * - * НА ДЕМО-УРОВНЕ МУЗЫКИ НЕТ — и это буквальное условие оригинала - * (seg006:1366: `current_level != 0 && current_level != 15`). - * Заставочная демка озвучена одними эффектами. */ - if (pop_current_level != 0 && pop_current_level != 15) { - if (Guard.charid == CHARID_1_SHADOW) pop_sfx_play(32); - else if (holding_sword) pop_sfx_play(28); - else pop_sfx_play(24); - } - } -} - -/* ---- Публичный API ------------------------------------------------ */ -int pop_ctrl_init(void) __banked -{ - control_forward = control_backward = control_up = control_down = CONTROL_RELEASED; - control_shift2 = CONTROL_RELEASED; - ctrl1_forward = ctrl1_backward = ctrl1_up = ctrl1_down = ctrl1_shift2 = CONTROL_RELEASED; - /* НУМПАД НАМ НЕ НУЖЕН, И ЭТО ЛЕЧИТ ЗАЛИПАНИЕ СТРЕЛОК. Управление и - * меню читают только расширенные коды (KBD_LEFT = KBD_EXT|0x6B и т.д.). - * А при переполнении FIFO SIO теряется префикс E0, и make стрелки - * садится в PLAIN-половину карты как код нумпада — снять его нечем, - * потому что break придёт уже с префиксом. Дальше kbd_raw_any_down() - * навсегда «да», и всякое ожидание «пока ничего не нажато» виснет - * насмерть (BUG KBD-STUCK-WAIT; поймано на 14-м уровне, где почти весь - * путь идёт удержанием Left). Гасит биты kbd_raw_sync(), а его - * pop_ctrl_tick зовёт каждый кадр. */ - kbd_raw_keypad_as_ext(1); - return kbd_raw_open(); -} - -void pop_ctrl_close(void) __banked -{ - kbd_raw_close(); -} - -int8_t pop_ctrl_shift_held(void) __banked -{ - return (int8_t)(control_shift == CONTROL_HELD); -} - -void pop_ctrl_tick(void) __banked -{ - kbd_raw_sync(); /* снять залипшее после Rx-overrun SIO */ - /* control_kid (seg006:0CD1), ПЕРВАЯ строка: HP кончились — персонаж - * мёртв. Без этой ветки смерть от меча стража не доводилась до конца: - * hurt_by_sword играл seq_85, hitp_curr падал в 0, но Kid.alive - * оставался −1 и pop_kid_dead не взводился — Кид досматривал сиквенс, - * возвращался в стойку с нулём HP, и страж убивал его снова по кругу - * (BUG-DEATH-1). pop_kid_dead — наш сигнал главному циклу на респавн - * (в оригинале это счётчик Char.alive в play_kid, seg006:0BEE). */ - ctrl_kid_death(); - rest_ctrl_1(); - read_input(); - read_user_control(); - /* Окно Char вокруг диспетчера: control() работает с АКТИВНЫМ - * персонажем (как в оригинале), поэтому ввод игрока применяется к - * Киду только внутри loadkid/savekid. - * - * load_fram_det_col ОБЯЗАТЕЛЕН здесь — порт play_kid_frame - * (seg000:1209), где он стоит ровно между loadkid_and_opp() и - * play_kid(). cur_frame один на всех персонажей, и в кадре последним - * его перезаписывает страж; без перезагрузки диспетчер считает - * геометрию Кида (dx_weight -> determine_col -> distance_to_edge_weight - * -> get_edge_distance) по кадру СТРАЖА. Замерено: BUG-CTRL-FRAME-1. */ - ctrl_kid_dispatch(); /* -> pop_control(): может сменить Char.curr_seq */ -} - -void pop_ctrl_auto_move(int8_t move) __banked -{ - ctrl_kid_death(); - /* control_kid() оригинала в demo-ветке делает do_demo(); control(); - * БЕЗ rest_ctrl_1/read_user_control/user_control/save_ctrl_1. Команды - * auto_move уже относительны к направлению Char. Если пропустить их - * через user_control(), то при Kid.direction=RIGHT backward зеркалится - * во forward: во второй комнате Кид вместо разворота бежит в пропасть. */ - switch (move) { - case 0: - control_shift = control_y = control_x = control_shift2 = 0; - control_down = control_up = control_backward = control_forward = 0; - break; - case 1: - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; - break; - case 2: - control_backward = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_BACKWARD; - break; - case 3: - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; - break; - case 4: - control_down = POP_CONTROL_HELD; - control_y = POP_CONTROL_HELD_DOWN; - break; - case 5: - control_y = POP_CONTROL_HELD_UP; - control_up = POP_CONTROL_HELD; - control_x = POP_CONTROL_HELD_FORWARD; - control_forward = POP_CONTROL_HELD; - break; - case 6: - control_shift = POP_CONTROL_HELD; - control_shift2 = POP_CONTROL_HELD; - break; - case 7: - control_shift = POP_CONTROL_RELEASED; - break; - default: - break; - } - pop_loadkid(); - pop_load_fram_det_col(); - pop_control(); - pop_savekid_state(); -} diff --git a/applications/SprPoP/src/pop_ctrl.h b/applications/SprPoP/src/pop_ctrl.h deleted file mode 100644 index 8964ae0..0000000 --- a/applications/SprPoP/src/pop_ctrl.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * pop_ctrl.h — управление Kid (Фаза K2b): порт диспетчера control() - * (SDLPoP seg005.c) + модель ввода read_user_control/user_control - * (seg006.c) поверх held-state клавиатуры . - * - * Kid-only подмножество: без меча и стражи. Map-запросы (стена/край/ - * захват) ЗАСТАБЛЕНЫ «открытый пол» — реальная коллизия (стоп у стены, - * падение в ямы, повисание) приходит в K3/K4. Даёт отклик на клавиши: - * бег влево/вправо, разворот, стоп, присед, прыжок с места, прыжок в - * беге, присед-прыжок. - * - * Раскладка (kbd_raw, PS/2 Set 2): ←/→ = движение, ↓ = присед, ↑ = - * прыжок вверх (с →), Shift = осторожный шаг (K3). ESC — выход (проверяет - * приложение сам, канал raw забирает весь ввод у DSS). - */ -#ifndef POP_CTRL_H -#define POP_CTRL_H - -#include - -/* МОДУЛЬ ЖИВЁТ В БАНКЕ 5 (--bank 5=pop_ctrl.c), поэтому всё, что зовут - * снаружи, помечено __banked. Зовут с трёх сторон: главный цикл - * (резидент), guards.c (банк 1) и pop_map.c (банк 3) — банк→банк - * работает, трамплин сохраняет страницу окна на стеке. Диспетчер - * дёргается один раз за кадр на персонажа, так что цена перехода - * незаметна. Сама шина control_* лежит в pop_state.c (см. ниже). */ - -/* Открыть raw-канал клавиатуры и обнулить память авто-повтора. - * 0 — OK, -1 — ошибка (EBUSY и пр., см. kbd_raw_open). */ -int pop_ctrl_init(void) __banked; -void pop_ctrl_close(void) __banked; - -/* Один кадр ввода: прочитать клавиши -> обновить control_* -> прогнать - * диспетчер control() (может сменить Kid.curr_seq). Звать ПЕРЕД - * kid_tick() (play_seq продолжит с новой последовательности). */ -void pop_ctrl_tick(void) __banked; - -/* Один кадр синтетического управления attract-demo. move — код SDLPoP: - * 0 nothing, 1 forward, 2 backward, 3 up, 4 down, 5 up+forward, - * 6 shift, 7 отпустить shift, -1 ничего не менять. Raw-клавиатуру не - * читает: это важно, чтобы ввод мог сперва прервать demo. */ -void pop_ctrl_auto_move(int8_t move) __banked; - -/* control_shift зажат ПРЯМО СЕЙЧАС? — для check_grab в физике (pop_map): - * зацеп за уступ в падении по Shift. Валидно после pop_ctrl_tick. */ -int8_t pop_ctrl_shift_held(void) __banked; - -/* ---- Шина синтетического ввода (порт глобалов control_* из seg005) ---- - * В оригинале ИИ соперника (autocontrol_*, seg002) не имеет своего - * диспетчера: он ВЫСТАВЛЯЕТ эти переменные, а дальше исполняется тот же - * control(), что и для игрока. Значения — CONTROL_RELEASED/IGNORE/HELD. */ -#define POP_CONTROL_RELEASED 0 -#define POP_CONTROL_IGNORE 1 -#define POP_CONTROL_HELD (-1) -/* Оси ЭТОГО кадра (абсолютные): X = -1 влево / +1 вправо, Y = -1 вверх / - * +1 вниз. Для ИИ «вперёд/назад» уже в системе персонажа, поэтому оси он - * заполняет как есть, без flip_control_x. */ -/* Определены в pop_state.c (резидент W1/W2), а не в pop_ctrl.c: шину - * трогают три банка сразу, а данные банкового модуля живут в _DATA лишь - * пока сборка идёт без --bank-data. */ -extern int8_t control_x, control_y, control_shift; -#define POP_CONTROL_HELD_FORWARD (-1) -#define POP_CONTROL_HELD_BACKWARD 1 -#define POP_CONTROL_HELD_UP (-1) -#define POP_CONTROL_HELD_DOWN 1 -extern int8_t control_forward, control_backward, control_up, control_down, - control_shift2; - -/* Диспетчер (seg005:252) для АКТИВНОГО персонажа Char. Игрок идёт через - * pop_ctrl_tick (тот делает user_control с зеркалом «вперёд»), страж — из - * своего тика напрямую. */ -void pop_control(void) __banked; - -/* Снять флаг «вступительная тема уровня 1 уже играла». */ -void pop_ctrl_level_start(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_cutscene.c b/applications/SprPoP/src/pop_cutscene.c deleted file mode 100644 index 7c61cca..0000000 --- a/applications/SprPoP/src/pop_cutscene.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * pop_cutscene.c — общий data-driven шагатель кат-сцен, банк 9 (FG8). - * - * Один вызов = один логический кадр. WAIT съедает текущий шаг сразу, поэтому - * WAIT(1) откладывает следующую видимую команду ровно на один тик. Команды - * без ожидания выдаются по одной: runtime успевает переключить палитру, - * собрать hidden page или сделать fade до следующего шага. - */ -#include -#include "pop_cutscene.h" - -void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked -{ - cs->script = script; - cs->pc = 0; - cs->waiting = 0; - cs->ended = 0; -} - -void pop_cutscene_abort(pop_cutscene_t *cs) __banked -{ - cs->waiting = 0; - cs->ended = 1; -} - -pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked -{ - const pop_cs_cmd_t *cmd; - - *arg = 0; - if (cs->ended) return POP_CS_EVENT_END; - if (cs->waiting) { - --cs->waiting; - return POP_CS_EVENT_NONE; - } - - cmd = &cs->script[cs->pc++]; - *arg = cmd->arg; - switch (cmd->op) { - case POP_CS_SHOW: return POP_CS_EVENT_SHOW; - case POP_CS_PALETTE: return POP_CS_EVENT_PALETTE; - case POP_CS_FADE_IN: return POP_CS_EVENT_FADE_IN; - case POP_CS_FADE_OUT: return POP_CS_EVENT_FADE_OUT; - case POP_CS_FLASH: return POP_CS_EVENT_FLASH; - case POP_CS_WAIT: - /* Текущий tick — первый из N: это исключает скрытый +1 кадр. */ - cs->waiting = cmd->arg; - if (cs->waiting) --cs->waiting; - return POP_CS_EVENT_NONE; - case POP_CS_END: - default: - cs->ended = 1; - return POP_CS_EVENT_END; - } -} diff --git a/applications/SprPoP/src/pop_cutscene.h b/applications/SprPoP/src/pop_cutscene.h deleted file mode 100644 index d49303b..0000000 --- a/applications/SprPoP/src/pop_cutscene.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * pop_cutscene.h — маленький интерпретатор сценариев экранных сцен (FG8). - * - * Данные сценария статичны, состояние — только pc и счётчик ожидания. Это - * пригодится и PV intro, и сценам перед уровнями FG9: графика/звук остаются - * у вызывающего режима, а не тащатся в общий механизм. - */ -#ifndef POP_CUTSCENE_H -#define POP_CUTSCENE_H - -#include - -/* ТИК ОРИГИНАЛА -> НАШ КАДР. Все длительности сцен взяты из SDLPoP в его - * тиках (BASE_FPS = 60), а ждём мы кадрами луча (50 Гц). Без пересчёта - * сцена идёт на 20 % дольше — незаметно, пока она немая, и сразу слышно, - * когда под неё играет музыка: реплика кончается раньше картинки. - * Аргумент — константа сценария, до 2500, так что 32-бит не возникает. */ -#define POP_T60(t) ((uint16_t)((uint16_t)(t) * 5u / 6u)) - -typedef enum { - POP_CS_SHOW = 1, /* arg: номер готового кадра */ - POP_CS_WAIT, /* arg: число логических кадров */ - POP_CS_PALETTE, /* arg: номер палитрового набора */ - POP_CS_FADE_IN, - POP_CS_FADE_OUT, - POP_CS_FLASH, /* arg: длительность белой вспышки */ - POP_CS_END -} pop_cs_opcode_t; - -typedef struct { - uint8_t op; - uint16_t arg; -} pop_cs_cmd_t; - -typedef struct { - const pop_cs_cmd_t *script; - uint8_t pc; - uint16_t waiting; - uint8_t ended; -} pop_cutscene_t; - -typedef enum { - POP_CS_EVENT_NONE = 0, - POP_CS_EVENT_SHOW, - POP_CS_EVENT_PALETTE, - POP_CS_EVENT_FADE_IN, - POP_CS_EVENT_FADE_OUT, - POP_CS_EVENT_FLASH, - POP_CS_EVENT_END -} pop_cs_event_t; - -void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked; -void pop_cutscene_abort(pop_cutscene_t *cs) __banked; -pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked; - -#endif /* POP_CUTSCENE_H */ diff --git a/applications/SprPoP/src/pop_demo.c b/applications/SprPoP/src/pop_demo.c deleted file mode 100644 index 4aaa18c..0000000 --- a/applications/SprPoP/src/pop_demo.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * pop_demo.c — воспроизведение attract-demo SDLPoP, банк 9 (FG7). - * - * Это не отдельная физика и не сценарные телепорты. Таблица custom->demo_moves - * подаёт ровно те же control_* в pop_ctrl_auto_move(), через которые идут - * игрок и автоконтроль персонажей. Поэтому демо проверяет настоящий маршрут - * level 0, а не его нарисованную имитацию. - */ -#include -#include -#include "pop_ctrl.h" -#include "pop_guard.h" -#include "pop_map.h" /* hitp_curr — смерть demo имеет приоритет над AI */ -#include "pop_demo.h" - -typedef struct { - uint8_t time; - int8_t move; -} demo_move_t; - -/* data.h SDLPoP: демо пробегает уровень 0 до комнаты 24. Последний -1 - * означает «больше не менять уже поданный control_*», а не ввод. */ -static const demo_move_t demo_moves[] = { - {0x00, 0}, {0x01, 1}, {0x0D, 0}, {0x1E, 1}, {0x25, 5}, - {0x2F, 0}, {0x30, 1}, {0x41, 0}, {0x49, 2}, {0x4B, 0}, - {0x63, 2}, {0x64, 0}, {0x73, 5}, {0x80, 6}, {0x88, 3}, - {0x9D, 7}, {0x9E, 0}, {0x9F, 1}, {0xAB, 4}, {0xB1, 0}, - {0xB2, 1}, {0xBC, 0}, {0xC1, 1}, {0xCD, 0}, {0xE9, -1}, - /* do_auto_moves читает moves[demo_index] ещё после сдвига индекса. - * Это недостижимая метка из data.h, не команда: она держит индекс в - * границах, пока demo_time доходит до 0xFE. */ - {0xFF, -2} -}; - -static uint8_t demo_time; -static uint8_t demo_index; - -void pop_demo_begin(void) __banked -{ - demo_time = 0; - demo_index = 0; -} - -uint8_t pop_demo_tick(void) __banked -{ - uint8_t index; - int8_t move; - - /* Урон мечом сводится ПОСЛЕ этого вызова в предыдущем игровом кадре. - * На следующем тике HP уже ноль, но pop_kid_dead ещё не поднят: обычный - * pop_ctrl_tick делает это в ctrl_kid_death(), а demo обходит его своим - * AI. Без этого гарда AI снова управлял мёртвым Кидом, возвращал его в - * стойку и страж убивал его по кругу. Attract-demo при смерти кончается; - * текущий главный цикл ещё дорисует один последний кадр и уйдёт в title. */ - if (hitp_curr == 0) return 1; - - /* do_demo(): в бою запись времени/кнопок стоит, Кидом управляет тот же - * combat AI, что стражами, но с отдельным skill 10. */ - if (pop_demo_kid_ai()) return 0; - if (demo_time >= 0xFE) return 1; - ++demo_time; - index = demo_index; - if (demo_moves[index].time <= demo_time) ++demo_index; - else index = (uint8_t)(demo_index - 1); - move = demo_moves[index].move; - pop_ctrl_auto_move(move); - return (uint8_t)(demo_time >= 0xFE); -} - -uint8_t pop_demo_user_input(void) __banked -{ - return kbd_raw_any_down(); -} diff --git a/applications/SprPoP/src/pop_demo.h b/applications/SprPoP/src/pop_demo.h deleted file mode 100644 index e4c0002..0000000 --- a/applications/SprPoP/src/pop_demo.h +++ /dev/null @@ -1,17 +0,0 @@ -/* pop_demo.h — attract-mode уровня 0, банк 9 (FG7). */ -#ifndef POP_DEMO_H -#define POP_DEMO_H - -#include - -/* Начать неизменяемую запись demo_moves SDLPoP с кадра ноль. */ -void pop_demo_begin(void) __banked; - -/* Один логический кадр записи: подать синтетический control_*. - * Возвращает 1, когда запись исчерпана. */ -uint8_t pop_demo_tick(void) __banked; - -/* «Любой ввод» без покадрового перебора 512 scan-кодов. */ -uint8_t pop_demo_user_input(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_draw.c b/applications/SprPoP/src/pop_draw.c deleted file mode 100644 index 6be995e..0000000 --- a/applications/SprPoP/src/pop_draw.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * pop_draw.c — выбор ядра libbgi для heal: линейное «noclip», если - * прямоугольник целиком на экране, иначе общее клипающее. Объявление и - * мотивация — `_pop_draw.h`. - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ РЕЗИДЕНТНЫЙ МОДУЛЬ, а не inline в заголовке. Замер - * CLIP-1 (2026-08-01), SDCC 4.5: `static inline` тут обходится втридорога — - * компилятор И встраивает тело в каждый вызов (181 Б на место), И оставляет - * отдельную мёртвую копию в каждом TU. У стража это раздуло - * тогдашний `pop_guard_heal` с ~60 до 663 Б. Пяти местам вызова это стоило бы ~1.4 КБ - * ради экономии ~50 тактов на вызов — при том что BANK2 занят на 86 %. - * - * Резидент W1 (_CODE), а не банк: сюда зовут из ДВУХ разных банков - * (pop_bg.c → BANK2, pop_cdraw.c → BANK4). W1 замаплено всегда, поэтому из - * банка это обычный `call` без трамплина — тот же приём, что у - * pop_sword_draw. - */ -#include -#include -#include "_pop_draw.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ - -void pop_heal_fast(int x, int y, int w, int h) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча, см. pop_pace.h */ - if (w <= 0 || h <= 0) return; - if (pop_onscreen_cols(x, y, (uint16_t)w, (uint16_t)h)) - gfx_heal_noclip(x, y, (uint8_t)w, (uint8_t)h); - else - gfx_heal(x, y, w, h); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ /* и ПОСЛЕ: широкий heal сам по себе ~70 000 тактов */ -} diff --git a/applications/SprPoP/src/pop_flow.c b/applications/SprPoP/src/pop_flow.c deleted file mode 100644 index b96fa98..0000000 --- a/applications/SprPoP/src/pop_flow.c +++ /dev/null @@ -1,48 +0,0 @@ -/* pop_flow.c — таблица level-flow SDLPoP, банк 9 (FG9). */ -#include -#include "pop_level.h" -#include "pop_flow.h" - -/* Индекс равен номеру следующего уровня. pre_cutscene повторяет - * tbl_cutscenes[] SDLPoP, но тип значения — компактный экранный сценарий, - * а не указатель на игровую функцию. Уровень 14 намеренно скрывает номер. */ -static const pop_level_flow_t level_flow[POP_LEVEL_LAST + 1] = { - { 0, POP_PRE_NONE, 0, 0 }, { 1, POP_PRE_NONE, 1, 0 }, - { 2, POP_PRE_2_6, 1, 0 }, { 3, POP_PRE_NONE, 1, 0 }, - { 4, POP_PRE_4, 1, 0 }, { 5, POP_PRE_NONE, 1, 0 }, - { 6, POP_PRE_2_6, 1, 0 }, { 7, POP_PRE_NONE, 1, 0 }, - { 8, POP_PRE_8, 1, 0 }, { 9, POP_PRE_9, 1, 0 }, - { 10, POP_PRE_NONE, 1, 0 }, { 11, POP_PRE_NONE, 1, 0 }, - { 12, POP_PRE_12, 1, 0 }, { 13, POP_PRE_NONE, 1, 0 }, - { 14, POP_PRE_NONE, 0, 1 } -}; - -const pop_level_flow_t *pop_flow_level(uint8_t level) __banked -{ - if (level > POP_LEVEL_LAST) return 0; - return &level_flow[level]; -} - -pop_pre_cutscene_t pop_flow_pre_cutscene(uint8_t level, - uint8_t remaining_minutes) __banked -{ - pop_pre_cutscene_t scene; - const pop_level_flow_t *flow = pop_flow_level(level); - - if (!flow) return POP_PRE_NONE; - scene = (pop_pre_cutscene_t)flow->pre_cutscene; - /* hourglass_frame(): frame 6 iff `time_bound[0] (6) > rem_min`. */ - if (scene == POP_PRE_12 && remaining_minutes < 6) - return POP_PRE_12_SHORT; - return scene; -} - -uint8_t pop_flow_is_ending(uint8_t level, uint8_t room) __banked -{ - const pop_level_flow_t *flow = pop_flow_level(level); - - /* WIN_LEVEL/WIN_ROOM в SDLPoP: level 14, room 5. Номер комнаты держим - * здесь, а не в горячем игровом цикле, чтобы таблица оставалась - * единственным владельцем специальных переходов. */ - return (uint8_t)(flow && flow->ending_rule && room == 5); -} diff --git a/applications/SprPoP/src/pop_flow.h b/applications/SprPoP/src/pop_flow.h deleted file mode 100644 index 47022cc..0000000 --- a/applications/SprPoP/src/pop_flow.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * pop_flow.h — таблица маршрута уровней и pre-level cutscene (FG9). - * - * Здесь нет механики rooms/guards: номер назначения превращается в правило - * оболочки один раз на границе уровня. Поэтому добавить особый маршрут не - * означает разбрасывать условия по горячему игровому кадру. - */ -#ifndef POP_FLOW_H -#define POP_FLOW_H - -#include - -typedef enum { - POP_PRE_NONE = 0, - POP_PRE_2_6, - POP_PRE_4, - POP_PRE_8, - POP_PRE_9, - POP_PRE_12, - POP_PRE_12_SHORT -} pop_pre_cutscene_t; - -typedef struct { - uint8_t level; - uint8_t pre_cutscene; - uint8_t show_level_number; - uint8_t ending_rule; -} pop_level_flow_t; - -/* Нулевой указатель означает некорректный номер назначения. Сцена 12 - * выбирается по тем же границам SDLPoP: при <=5 оставшихся минутах короткая. */ -const pop_level_flow_t *pop_flow_level(uint8_t level) __banked; -pop_pre_cutscene_t pop_flow_pre_cutscene(uint8_t level, - uint8_t remaining_minutes) __banked; - -/* Победная комната не принадлежит механике movement: это правило маршрута - * оболочки. Сейчас оно есть только у скрытого уровня 14. */ -uint8_t pop_flow_is_ending(uint8_t level, uint8_t room) __banked; - -#endif /* POP_FLOW_H */ diff --git a/applications/SprPoP/src/pop_geom.c b/applications/SprPoP/src/pop_geom.c deleted file mode 100644 index 318e24a..0000000 --- a/applications/SprPoP/src/pop_geom.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * pop_geom.c — общая геометрия + PRNG оригинала. См. pop_geom.h. - */ -#include "pop_geom.h" - -/* data.h: шаг 14 (ширина тайла в координатах персонажа), [5] = col 0. */ -const int16_t pop_x_bump[20] = { - -12, 2, 16, 30, 44, 58, 72, 86, 100, 114, - 128, 142, 156, 170, 184, 198, 212, 226, 240, 254 -}; -const int16_t pop_y_land[5] = {-8, 55, 118, 181, 244}; - -#define TILE_SIZEY_OFF 60 /* сдвиг «ряд 0 начинается выше нуля» */ - -/* Медленный хвост — ОТДЕЛЬНОЙ функцией. Иначе SDCC видит одно и то же - * выражение в двух ветках и поднимает деление в вершину функции: быстрые - * возвраты уже не спасают, __divsint зовётся всё равно (проверено — - * 5 вызовов за кадр остались после первой переписи). */ -static int8_t y_row_div(int16_t t) -{ - return (int8_t)(t / TILE_SIZEY % 4 - 1); -} - -int8_t pop_y_to_row(int16_t y) -{ - /* Было `(y + 60) / 63 % 4 - 1` — SDCC разворачивает это в __divsint плюс - * __modsint (а тот внутри снова зовёт __divsint): ~5 400 тактов на вызов - * по замеру в MAME, при том что полос всего четыре. Цепочка сравнений - * повторяет ИМЕННО прежнюю арифметику, включая усечение деления К НУЛЮ - * для отрицательных (t в −62..−1 даёт 0, а не −1). */ - int16_t t = (int16_t)(y + TILE_SIZEY_OFF); - if (t >= 0) { - if (t < TILE_SIZEY) return -1; /* 0 % 4 - 1 */ - if (t < 2*TILE_SIZEY) return 0; - if (t < 3*TILE_SIZEY) return 1; - if (t < 4*TILE_SIZEY) return 2; - if (t < 5*TILE_SIZEY) return -1; /* 4 % 4 = 0 */ - } else if (t > -TILE_SIZEY) { - return -1; /* t/63 == 0 -> 0 % 4 - 1 */ - } - return y_row_div(t); -} - -/* Уложить значение в диапазон 0..maxv. Вызовы оригинала — prandom(1), - * prandom(255), prandom(0xFF): делитель степень двойки, то есть маска, а не - * деление. __moduint на Z80 стоит заметно дороже проверки n & (n-1). */ -static uint16_t pop_rnd_fit(uint16_t v, uint16_t maxv) -{ - uint16_t n = (uint16_t)(maxv + 1); - if ((uint16_t)(n & (uint16_t)(n - 1)) == 0) - return (uint16_t)(v & (uint16_t)(n - 1)); - return (uint16_t)(v % n); -} - -#if POP_PRANDOM_EXACT -/* ---- LCG оригинала: s = s*214013 + 2531011 (seg009:321) ------------ * - * - * ЕДИНСТВЕННОЕ место в порте на ассемблере, и вот почему. На Z80 нет - * умножения, а SDCC для 32-битного `s * 214013` зовёт __mullong — 8 430 - * тактов на вызов (замер в MAME). Написанное на C через 16-битные - * половины это ~3 500. Здесь ~1 000, при полностью той же - * последовательности, что в SDLPoP. Альтернатива «взять генератор - * попроще» (8-битный RND Apple II, xorshift) экономит меньше и ломает - * совместимость с эталоном, по которому сверяем картинку. - * - * Приём: 214013 = ((((1<<1)+1)<<2 + 1)<<4 + 1)<<10 - 3 — схема Горнера по - * РАЗРЕЖЕННОЙ записи константы. Вместо 12 сложений (по числу единиц в - * 0x343FD) — 17 удвоений, ТРИ сложения и одно вычитание. Величина 3*s, - * нужная в конце, попадается по дороге на втором шаге — её и сохраняем. - * - * ABI __sdcccall(1): arg1 (указатель на сид) -> HL, возврат -> DE. IX не - * используется, сохранять нечего. Клоббер AF/BC/DE/HL. Аккумулятор — - * DE:HL (DE старшее слово); s.lo живёт в BC, s.hi и 3*s — в статиках - * (регистров на всё не хватает). - */ -uint16_t pop_pr_ptr; /* адрес сида */ -uint16_t pop_pr_sh; /* старшее слово исходного сида */ -uint16_t pop_pr_3s_lo, pop_pr_3s_hi; /* 3*s, нужное в конце */ - -static uint16_t pop_lcg_step(pop_rnd_t *seed) __naked -{ - (void)seed; - __asm - ld (_pop_pr_ptr), hl - ld c, (hl) - inc hl - ld b, (hl) ; BC = s.lo - inc hl - ld a, (hl) - ld (_pop_pr_sh), a - inc hl - ld a, (hl) - ld (_pop_pr_sh + 1), a ; (pop_pr_sh) = s.hi - - ld h, b - ld l, c - ld de, (_pop_pr_sh) ; акк = s - - ;; акк = акк*2 + s => 3s - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) ; LD A,(nn) флаги НЕ трогает - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - ld (_pop_pr_3s_lo), hl - ld (_pop_pr_3s_hi), de - - ;; акк = акк*4 + s => 13s - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - - ;; акк = акк*16 + s => 209s - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, bc - ex de, hl - ld a, (_pop_pr_sh) - adc a, l - ld l, a - ld a, (_pop_pr_sh + 1) - adc a, h - ld h, a - ex de, hl - - ;; акк *= 1024 => 214016s (10 удвоений) - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - add hl, hl - rl e - rl d - - ;; акк -= 3s => 214013s - ld bc, (_pop_pr_3s_lo) - or a ; CY = 0 - sbc hl, bc - ld bc, (_pop_pr_3s_hi) ; LD BC,(nn) флаги НЕ трогает - ex de, hl - sbc hl, bc - ex de, hl - - ;; акк += 2531011 = 0x0026_9EC3 - ld bc, #0x9EC3 - add hl, bc - ld bc, #0x0026 - ex de, hl - adc hl, bc - ex de, hl - - ;; сохранить сид, вернуть СТАРШЕЕ слово в DE - push de - ex de, hl ; DE = младшее слово - ld hl, (_pop_pr_ptr) - ld (hl), e - inc hl - ld (hl), d - inc hl - pop de ; DE = старшее слово - ld (hl), e - inc hl - ld (hl), d - ret - __endasm; -} - -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv) -{ - return pop_rnd_fit(pop_lcg_step(seed), maxv); -} - -#else /* !POP_PRANDOM_EXACT — генератор попроще, НЕ совместимый с эталоном */ - -/* xorshift16 + шаг Вейля. Зачем не LCG оригинала: тот 32-битный, и даже - * без __mullong (см. ветку выше) стоит ~7 000 тактов на вызов — при двух - * вызовах за кадр это 3 % бюджета на генератор случайных чисел. Здесь - * умножений нет вовсе, только сдвиги и xor. - * - * Почему НЕ 8-битный RND Apple II (RNDseed := 5*RNDseed + 23 mod 256, - * Prince-of-Persia-Apple-II): он ещё быстрее, но у LCG по модулю 256 - * младшие биты вырождены — бит 0 просто чередуется. Наши вызовы это - * видят: раскладка кладки берёт prandom(1) (один бит) и prandom(4), и - * вместо шума получилась бы правильная шахматка. У xorshift такой - * структуры нет, а стоит он примерно столько же. - * - * Шаг Вейля (+0x9E37, нечётный) нужен ещё и потому, что у чистого - * xorshift ноль — неподвижная точка, а сид кладки (номер комнаты + ряд + - * колонка) вполне может оказаться нулём. - * - * ПОСЛЕДСТВИЕ: последовательность отличается от SDLPoP — другая (но - * статистически такая же) раскладка кладки и другие броски в боёвке. - * Поэтому по умолчанию собирается НЕ эта ветка: после переписывания LCG - * на ассемблер выигрыш от смены генератора почти исчез, а сверять - * картинку с эталоном стало важнее. Ветка оставлена как запасной ход. */ -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv) -{ - uint16_t s = seed->lo; - s ^= (uint16_t)(s << 7); - s ^= (uint16_t)(s >> 9); - s ^= (uint16_t)(s << 8); - s = (uint16_t)(s + 0x9E37u); - seed->lo = s; - seed->hi = 0; /* старшая половина не используется */ - /* Отдаём СТАРШИЙ байт: у него нет короткопериодической структуры - * младших бит, а вызывающие берут от результата именно младшие. */ - return pop_rnd_fit((uint16_t)(s >> 8), maxv); -} - -#endif diff --git a/applications/SprPoP/src/pop_geom.h b/applications/SprPoP/src/pop_geom.h deleted file mode 100644 index 67ef250..0000000 --- a/applications/SprPoP/src/pop_geom.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * pop_geom.h — общая геометрия PoP и PRNG оригинала. - * - * Сюда сведено то, что раньше дублировалось по модулям (x_bump/y_land в - * pop_kid и pop_map, y_to_row в pop_bg и pop_map, 32-битный LCG в pop_bg и - * pop_trob). Кроме экономии это ФУНДАМЕНТ bank-safe API: модуль живёт в - * W1/W2 и не трогает графику, поэтому его может звать и главный цикл, и - * резидент W3, и будущий __banked-код стражей (docs/layout_plan_v2.md §4). - */ -#ifndef POP_GEOM_H -#define POP_GEOM_H - -#include - -#define FIRST_ONSCREEN_COLUMN 5 /* индекс col 0 комнаты в x_bump */ -#define TILE_SIZEX 14 /* ширина тайла в координатах персонажа */ -#define TILE_SIZEY 63 /* высота ряда */ - -/* x_bump (data.h): левая граница колонки в координатах персонажа; колонка - * комнаты col = x_bump[col + FIRST_ONSCREEN_COLUMN]. y_land: пол ряда - * (индекс row+1; [0] — ряд «над комнатой»). */ -extern const int16_t pop_x_bump[20]; -extern const int16_t pop_y_land[5]; - -/* y_to_row_mod4 (seg006): ряд по координате y с оборотом mod 4 (−1 = полоса - * над комнатой, 3 = под комнатой). */ -int8_t pop_y_to_row(int16_t y); - -/* prandom (порт seg009:321). Сид ВНЕШНИЙ: у стен (раскладка кладки) и у - * анимаций тайлов (фаза факелов) свои последовательности, смешивать их - * нельзя. - * - * ДВА генератора, выбор через POP_PRANDOM_EXACT (см. pop_geom.c): - * 1 (по умолчанию) — LCG оригинала (s*214013+2531011) БИТ-В-БИТ: та же - * раскладка кладки и те же броски, что в SDLPoP, поэтому по картинке - * можно сверяться с эталоном; - * 0 — xorshift16 + шаг Вейля, без единого умножения. Дешевле ровно на - * 5 646 тактов за кадр, 1.3 % бюджета (замер A/B в MAME, комната 3, - * 175 кадров: 403 632 против 397 986). Последовательность другая — - * статистически эквивалентная, но не та же. - * - * Обе версии считают 16-битными половинами, а не unsigned long: на 32-бит - * умножении SDCC зовёт __mullong, и это 8 430 тактов на вызов (замер в - * MAME, breakpoint на __mullong). - * - * ЗАДЕЛ: разрыв между версиями определяется не алгоритмом, а кодогенерацией - * SDCC — те же генераторы на Z80-ассемблере укладываются в 86..148 тактов. - * Если процент понадобится, сначала переписать в asm ОРИГИНАЛЬНЫЙ LCG (там - * умножение на константу), а менять генератор — только если и этого мало. */ -typedef struct { uint16_t lo, hi; } pop_rnd_t; - -#ifndef POP_PRANDOM_EXACT -#define POP_PRANDOM_EXACT 1 -#endif - -uint16_t pop_prandom(pop_rnd_t *seed, uint16_t maxv); - -/* Сид из 16-битного числа (старшая половина = 0). */ -#define pop_prandom_set(s, v) do { (s).lo = (uint16_t)(v); (s).hi = 0; } while (0) - -#endif diff --git a/applications/SprPoP/src/pop_guard.c b/applications/SprPoP/src/pop_guard.c deleted file mode 100644 index 099e852..0000000 --- a/applications/SprPoP/src/pop_guard.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * pop_guard.c — СОСТОЯНИЕ и ЛОГИКА стража (W1/W2). См. pop_guard.h. - * - * Здесь только то, что должно оставаться достижимым из банка (guards.c): - * поля Guard, HP, вход в комнату, чит-убийство, чтение кадра из таблицы. - * ОТРИСОВКА — в pop_cdraw.c (банк 4), общая на всех Char. - */ -#include -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_level.h" -#include "pop_kid.h" /* Char/play_seq — интерпретатор общий */ -#include "pop_map.h" /* hitp_* — HP Кида */ -#include "pop_state.h" /* pop_immortal — чит бессмертия */ -#include "pop_tile.h" /* POP_TILE_DIV — колонка по X без деления */ -#include "kid_data.h" - -pop_char_t Guard; -uint8_t guardhp_curr, guardhp_max; -int8_t guardhp_delta; -uint8_t pop_guard_hurt; -int8_t can_guard_see_kid; -int8_t is_guard_notice; -uint8_t guard_skill; -int8_t guard_refrac, justblocked, kid_sword_strike; -int8_t offguard, holding_sword; -int8_t pop_united_shadow; /* см. pop_guard.h: 0 / счётчик / −1 */ -uint8_t pop_shadow_init; -int8_t pop_guard_notice_timer; /* фора Джафара (уровень 13) */ - -/* Сид бросков боёвки. В оригинале генератор один на всё, у нас - * последовательности разведены по доменам (кладка / анимация тайлов / бой), - * см. pop_geom.h — иначе перерисовка стены сбивала бы броски стража. */ -pop_rnd_t pop_fight_seed; - -/* Кадр стража (порт cur_frame для Char). Глобальный, а не статик: его - * заполняет логика (W1/W2), а читает отрисовка из резидента W3. */ -kframe pop_gframe; - -uint8_t pop_guard_present(void) -{ - return (uint8_t)(Guard.charid != 0 && Guard.alive < 0 && guardhp_curr != 0); -} - -void pop_guard_reset(void) -{ - Guard.charid = 0; - Guard.alive = 0; - Guard.direction = 0; - guardhp_curr = 0; - guardhp_delta = 0; - can_guard_see_kid = 0; - is_guard_notice = 0; - guard_refrac = justblocked = kid_sword_strike = 0; - offguard = holding_sword = 0; -} - -/* kill guard cheat (seg000:786): - * if (Guard.charid != charid_4_skeleton) { - * guardhp_delta = -guardhp_curr; - * Guard.alive = 0; - * } - * Скелета чит не убивает — он и в оригинале бессмертен. */ -void pop_guard_kill(void) -{ - if (Guard.charid == CHARID_4_SKELETON) return; - if (!pop_guard_present()) return; - /* HP не обнуляем — ставим дельту, её применит pop_do_delta_hp. Дальше - * play_guard увидит «жив, но HP ноль», сам переведёт в alive = 0 и - * вызовет on_guard_killed: брызги, вспышка, а на 13-м уровне — флаг - * «выход разрешён». - * - * ОСОЗНАННОЕ РАСХОЖДЕНИЕ (решение пользователя 2026-08-13, ради скорости - * прогонов): оригинал (seg000:786) ставит здесь ещё и `Guard.alive = 0`, - * а гейт в play_guard (seg006:1490) требует `alive < 0` — то есть у него - * чит убивает стража В ОБХОД события смерти, и победа над Джафаром по - * читу выхода на 14-й уровень НЕ открывает. Для отладки это дорого: - * каждый прогон приходится честно выигрывать бой. Убрав одну строку, - * получаем ровно «как будто убил Кид». На игру не влияет — читы в - * релизной сборке выключены (pop_cheats). */ - guardhp_delta = (int8_t)-guardhp_curr; -} - -/* take_hp (seg006:06BD) — общий для боёвки и физики; см. pop_guard.h. */ -uint8_t pop_take_hp(uint8_t count) -{ - if (Char.charid == CHARID_0_KID) { - /* ЧИТ БЕССМЕРТИЯ, уровень 2 (pop_state.h): гасим ТОЛЬКО мелкий урон - * — падение с двух этажей, придавливание плитой. Мгновенная смерть - * (пики, чомпер, падение с трёх этажей, удар вне боевой стойки) - * приходит с count = 100 и проходит всегда: у читa нет задачи - * отменять смерть, у него задача отменить «минус одно деление». - * Уровень 1 сюда не вмешивается вовсе — он живёт в hurt_by_sword и - * гасит только удары мечом. */ - if (pop_immortal >= 2 && count < 100) return 0; - if (count >= hitp_curr) { hitp_delta = (int8_t)-hitp_curr; return 1; } - hitp_delta = (int8_t)-(int8_t)count; - } else { - if (count >= guardhp_curr) { guardhp_delta = (int8_t)-guardhp_curr; return 1; } - guardhp_delta = (int8_t)-(int8_t)count; - } - return 0; -} - -/* timers (seg003:0735) — кадровые счётчики спецсобытий. - * - * Вспышка слияния с тенью досчитывает до нуля и УХОДИТ В −1: это «уже - * слились», состояние до конца уровня. Именно на −1 смотрят check_shadow - * (больше не поднимать) и «появление плит» в комнатах 2/13 (pop_map). - * Ноль как конечное значение не годится — он неотличим от «не было». */ -void pop_frame_timers(void) -{ - if (pop_united_shadow > 0) { - --pop_united_shadow; - if (pop_united_shadow == 0) pop_united_shadow = -1; - } - if (pop_guard_notice_timer > 0) --pop_guard_notice_timer; -} - -/* do_delta_hp (seg003): применить накопленную за кадр дельту HP и обнулить - * её. Звать раз в кадр ПОСЛЕ тиков персонажей, как в play_frame. */ -void pop_do_delta_hp(void) -{ - int16_t hp; - /* Спецсобытие уровня 12 (seg000:1518): ранил ТЕНЬ — ранил себя. Урон - * не делится, а КОПИРУЕТСЯ: тень теряет 1 HP и Кид теряет 1 HP. Без - * этого бой с тенью теряет смысл — её можно было бы просто зарубить. - * Проверка идёт по слоту соперника (у оригинала — по Opp, но в момент - * do_delta_hp там всегда пара Кид/соперник). */ - if (pop_current_level == SHADOW_FIGHT_LEVEL && - Guard.charid == CHARID_1_SHADOW && guardhp_delta != 0) - hitp_delta = guardhp_delta; - if (hitp_delta) { - hp = (int16_t)hitp_curr + hitp_delta; - if (hp < 0) hp = 0; - if (hp > (int16_t)hitp_max) hp = (int16_t)hitp_max; - hitp_curr = (uint8_t)hp; - /* Брызги и красная вспышка — только на УРОН: и draw_kid (seg008:1643), - * и flash_if_hurt (seg003:785) смотрят именно `hitp_delta < 0`. С - * условием «дельта не ноль» их получало и зелье здоровья (+1). */ - if (hitp_delta < 0) pop_kid_hurt = 1; - hitp_delta = 0; - } - if (guardhp_delta) { - hp = (int16_t)guardhp_curr + guardhp_delta; - if (hp < 0) hp = 0; - if (hp > (int16_t)guardhp_max) hp = (int16_t)guardhp_max; - guardhp_curr = (uint8_t)hp; - if (guardhp_delta < 0) pop_guard_hurt = 1; /* -> брызги поверх стража */ - guardhp_delta = 0; - } -} - -/* check_guard_fallout (seg002:0241): персонаж слота Guard провалился НИЖЕ - * комнаты. Уйти в комнату снизу он не может (у стража нет перехода), и - * оригинал его просто убирает: guards_tile комнаты становится −1, то есть - * стража там больше нет и после возврата. У нас тот же смысл — запомнить - * состояние с tile = 30 («стража в комнате больше нет»). - * - * Ветка ТЕНИ (seg002:0241): она исчезает, только если РЕАЛЬНО падает - * (`action == actions_4_in_freefall`) — иначе тень, зашедшую низко по - * своим делам (уровень 5 идёт по нижнему ряду за зельем), убрало бы с - * экрана на ровном месте. Ветка скелета — ниже, он не гибнет, а - * возрождается. - * - * Полосу HP перерисовывать отдельно не надо: pop_hp_draw сравнивает числа - * и сам увидит, что стража не стало. */ -/* Куда и как возрождается упавший СКЕЛЕТ (seg002:252): если под комнатой, - * из которой он выпал, лежит комната 3 — он появляется там снова. Убить - * его нельзя вовсе, падение лишь переносит. */ -#define SKEL_REAPPEAR_ROOM 3 -#define SKEL_REAPPEAR_X 133 -#define SKEL_REAPPEAR_ROW 1 - -/* actions_4_in_freefall (seg005) — тот же номер, что ACT_FREEFALL в - * pop_map.c; здесь свой define, потому что тот приватный для карты. */ -#define ACT_4_IN_FREEFALL 4 - -void pop_guard_fallout(void) -{ - if (Guard.charid == 0 || Guard.y < 211) return; - if (Guard.charid == CHARID_1_SHADOW) { - /* Тень исчезает только в свободном падении; иначе — не наше дело. */ - if (Guard.action != ACT_4_IN_FREEFALL) return; - Guard.direction = DIR_56_NONE; - Guard.alive = 0; - Guard.action = 0; - Guard.charid = 0; - guardhp_curr = 0; - return; - } - if (Guard.charid == CHARID_4_SKELETON) { - uint8_t down = pop_room_link(Guard.room, 3 /* вниз */); - if (down == SKEL_REAPPEAR_ROOM) { - Guard.room = down; - Guard.x = SKEL_REAPPEAR_X; - Guard.curr_row = SKEL_REAPPEAR_ROW; - Guard.direction = 0; /* dir_0_right */ - Guard.alive = -1; - pop_guard_leave(); /* запомнить его в новой комнате */ - return; - } - } - pop_guard_state_save(Guard.room, 30, 0, 0, 0, 0, 0); - Guard.charid = 0; - Guard.direction = 0; - Guard.alive = 0; - guardhp_curr = 0; -} - -/* load_frame для стража (seg006:0293 ветка charid_2_guard): таблица у - * стражей СВОЯ (frame_tbl_guard), индекс = frame + add_frame − 149, где - * add_frame = 70 для кадров 102..106 (seg006:535). */ -void pop_guard_load_frame(void) -{ - int16_t idx = (int16_t)Guard.frame; - if (idx >= 102 && idx < 107) idx += 70; /* add_frame */ - idx -= 149; - if (idx < 0 || idx >= KID_NGFRAMES) { pop_gframe.image = 255; return; } - pop_kid_data_frame(KID_BIN_GFRAMES_OFF, (uint8_t)idx, (uint8_t *)&pop_gframe); -} - -/* leave_guard (seg002:02F5): вызывать ПЕРЕД сменой комнаты, пока Guard ещё - * держит стража уходящей комнаты. Мёртвого запоминаем вместе с - * последовательностью — тогда при возврате он лежит там же, а не встаёт - * живым. */ -void pop_guard_leave(void) -{ - if (Guard.charid == 0) return; /* стража не было */ - /* Тень и МЫШЬ в данные уровня не записываются (seg002:02F5): они не - * «стражи комнаты», а спецсобытия — вернувшись, их надо получить заново - * от check_shadow / check_mouse, а не поднять из guards_tile. */ - if (Guard.charid == CHARID_1_SHADOW || Guard.charid == CHARID_24_MOUSE) return; - pop_guard_state_save(Guard.room, - (uint8_t)(Guard.curr_row * 10), /* get_tilepos(0,row) */ - Guard.direction, Guard.x, guard_skill, - Guard.curr_seq, - (uint8_t)(Guard.alive >= 0)); -} diff --git a/applications/SprPoP/src/pop_guard.h b/applications/SprPoP/src/pop_guard.h deleted file mode 100644 index d747acf..0000000 --- a/applications/SprPoP/src/pop_guard.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * pop_guard.h — СОСТОЯНИЕ стража и точки входа в его логику. - * - * Разделение по окнам (docs/layout_plan_v2.md §4, подтверждено пробником - * tests/w3bankgfx): - * - СОСТОЯНИЕ живёт здесь, в W1/W2. Писучие статики __banked-модуля - * линкуются В СТРАНИЦУ БАНКА и снаружи не читаются, поэтому банк — - * только код; - * - ЛОГИКА (ИИ, боёвка) — в guards.c, собираемом как --bank 1=guards.c; - * - ОТРИСОВКА стража — в pop_cdraw.c (банк 4), общая на всех Char: её зовёт - * только главный цикл, а из банка резидент недостижим. Так код - * отрисовки не занимает дефицитные W1/W2 (куча). - * - * Поля char_type — как в оригинале (types.h:302), чтобы порт seg005/seg006 - * ложился один в один. - */ -#ifndef POP_GUARD_H -#define POP_GUARD_H - -#include -#include "kid_data.h" /* kframe */ -#include "pop_char.h" -#include "pop_geom.h" /* pop_rnd_t — сид бросков боёвки */ -#include "pop_qsave.h" - -/* seqids (types.h:1052+) — последовательности боя и стойки. */ -#define SEQ_55_DRAW_SWORD 55 -#define SEQ_56_GUARD_FORWARD 56 /* шаг вперёд с мечом (страж) */ -#define SEQ_57_BACK_WITH_SWORD 57 -#define SEQ_58_GUARD_STRIKE 58 -#define SEQ_60_TURN_WITH_SWORD 60 -#define SEQ_61_PARRY_AFTER_STRIKE 61 -#define SEQ_62_PARRY 62 -#define SEQ_66_STRIKE_AFTER_PARRY 66 -#define SEQ_71_DYING 71 -#define SEQ_75_STRIKE 75 /* удар (Кид) */ -#define SEQ_63_GUARD_ACTIVE_AFTER_FALL 63 /* стойка АКТИВНОГО (скелет) */ -#define SEQ_77_GUARD_STAND_INACTIVE 77 -#define SEQ_88_SKEL_WAKE_UP 88 /* скелет встаёт (спецсобытие) */ -#define SEQ_80_STAND_FLIPPED 80 -#define SEQ_86_FORWARD_WITH_SWORD 86 /* шаг вперёд с мечом (Кид) */ -#define SEQ_87_GUARD_BECOME_INACT 87 -#define SEQ_90_EN_GARDE 90 -#define SEQ_92_PUT_SWORD_AWAY 92 -#define SEQ_93_PUT_SWORD_AWAY_FAST 93 - -/* frameids (types.h:911+) и состояния меча (types.h:332). */ -#define FRAME_150_PARRY 150 -#define FRAME_151_STRIKE_1 151 -#define FRAME_152_STRIKE_2 152 -#define FRAME_153_STRIKE_3 153 -#define FRAME_157_WALK_WITH_SWORD 157 -#define FRAME_158_STAND_WITH_SWORD 158 -#define FRAME_161_PARRY 161 -#define FRAME_162_BLOCK_TO_STRIKE 162 -#define FRAME_165_WALK_WITH_SWORD 165 -#define FRAME_166_STAND_INACTIVE 166 -#define FRAME_167_BLOCKED 167 -#define FRAME_168_BACK 168 -#define FRAME_169_BEGIN_BLOCK 169 -#define FRAME_170_STAND_WITH_SWORD 170 -#define FRAME_171_STAND_WITH_SWORD 171 -#define SWORD_0_SHEATHED 0 -#define SWORD_2_DRAWN 2 - -/* charids (types.h:320) — нужны хотя бы для «скелет не убивается читом». */ -#define CHARID_0_KID 0 -#define CHARID_1_SHADOW 1 -#define CHARID_2_GUARD 2 -/* charid_3 не используется: Джафар (уровень 13) — обычный charid_2_guard, - * своим charid оригинал помечает ТОЛЬКО скелета (enter_guard, seg002:196). - * Отличают Джафара набор спрайтов (VIZIER.DAT), skill 9 и три события. */ -#define CHARID_4_SKELETON 4 -#define CHARID_5_PRINCESS 5 -/* Джафар КАТСЦЕН (не игровой Джафар уровня 13!): в сценах intro он ходит - * по той же таблице кадров, что и Princess (frame_tbl_cuts), только свой - * набор спрайтов. */ -#define CHARID_6_VIZIER 6 -/* МЫШЬ (спецсобытие уровня 8) — тоже персонаж слота Guard: своей таблицы - * кадров у неё нет, кадры 186..188 лежат в таблице КИДА (load_frame, - * seg006:0293 — общий case с charid_0_kid), а спрайты (images 130..132) — - * в атласах Кида, страница kid16.atl. Поэтому отрисовка её подхватывает - * без единой правки: pop_frame_tbl_is_guard(24,…) отдаёт 0. */ -#define CHARID_24_MOUSE 24 - -/* dir_56_none (types.h:402): «направления нет» — им clear_char убирает - * персонажа со сцены. Значение 0x56 в int8_t = 86, то есть заведомо не - * dir_0_right (0) и не dir_FF_left (-1). */ -#define DIR_56_NONE 0x56 - -/* Спецсобытие «зеркало» (custom->mirror_*, дефолты SDLPoP): уровень 4, - * комната 4, колонка 4, верхний ряд. Здесь, а не в pop_trob.c: константы - * нужны и постановке тайла (банк 6), и ИИ тени (банк 1). */ -#define MIRROR_LEVEL 4 -#define MIRROR_ROOM 4 -#define MIRROR_COL 4 -#define MIRROR_ROW 0 -#define MIRROR_TILEPOS (MIRROR_ROW * 10 + MIRROR_COL) - -/* Спецсобытие «тень крадёт зелье» (custom->shadow_steal_*, дефолты SDLPoP): - * уровень 5, комната 24. Тень появляется при ВХОДЕ в комнату, если зелье - * (колонка 3, верхний ряд) ещё на месте; ждёт, пока откроются ворота - * (колонка 1, верхний ряд), идёт к зелью, выпивает его и уходит за левый - * край. Боя нет. Как и MIRROR_*, константы нужны в двух банках. */ -#define SHADOW_STEAL_LEVEL 5 -#define SHADOW_STEAL_ROOM 24 -#define SHADOW_POTION_TILEPOS 3 /* (кол 3, ряд 0) — зелье */ -#define SHADOW_DOOR_TILEPOS 1 /* (кол 1, ряд 0) — ворота */ -#define SHADOW_DOOR_OPEN_MIN 80 /* openness, при которой тень идёт */ - -/* Спецсобытие «тень захлопывает решётку» (custom->shadow_step_*, дефолты - * SDLPoP): уровень 6, комната 1. Кид жмёт opener (1,7), решётка (1,2) - * поднимается, он прыгает через пропасть и цепляется за её порожек — и - * ровно в этот момент тень делает ОДИН осторожный шаг с границы (1,0)-(1,1) - * на closer (1,1), роняя решётку. Обе плиты комнаты ведут на тот же тайл - * 12 (проверено по LINKLOC/LINKMAP уровня). */ -#define SHADOW_STEP_LEVEL 6 -#define SHADOW_STEP_ROOM 1 - -/* Спецсобытие «выход/вход падением» (custom->falling_*, дефолты SDLPoP). - * Уровень 6 не заканчивается дверью: Кид проваливается вниз из комнаты 1 и - * этим переходит на уровень 7, где появляется в комнате 17 — но экран сразу - * переводится на комнату ПОД ней, так что он влетает сверху. Комната 3 - * (шахта под комнатой 1) в переходе не участвует: leave_room перехватывает - * уход раньше, чем сработала бы связь вниз. */ -#define FALLING_EXIT_LEVEL 6 -#define FALLING_EXIT_ROOM 1 -#define FALLING_ENTRY_LEVEL 7 -#define FALLING_ENTRY_ROOM 17 - -/* Комната, которую проходят СВЕРХУ ВНИЗ спуском через зацеп: Кид висит на - * кромке кнопки (0,2), отпускает и цепляется за кромку (2,2). Нужна ЧИТУ - * навигации (`+`/`−` в sprpop.c): он ставит Кида на нижний пол, а отсюда - * этот спуск не проверить — для этой комнаты старт в ряду 0. */ -#define GRAB_DOWN_LEVEL 7 -#define GRAB_DOWN_ROOM 14 - -/* Единственный уровень, где тень — БОЕВОЙ персонаж (seg003:702). На всех - * остальных (4 зеркало, 5 зелье, 6 плита) она Кида «не видит»: см. - * pop_check_can_guard_see_kid. - * - * Сцена целиком (seg002:0070 + seg002:1184): в комнате 15 лежит МЕЧ (0,1); - * пока он на месте, тень не появляется. Кид его берёт — тень падает в ту - * же комнату, и дальше либо бой (у обоих клинки), либо, если Кид уберёт - * меч, — слияние. Комната 18 при уходе ВПРАВО «съедает» меч с карты - * (sword_disappears), чтобы вернуться и подобрать его второй раз было - * нельзя. Проверено по res2012.bin, ../docs/levels_12_15_plan.md §7.3. */ -#define SHADOW_FIGHT_LEVEL 12 -#define SHADOW_FIGHT_ROOM 15 -#define SHADOW_SWORD_TILEPOS 1 /* (кол 1, ряд 0) — меч уровня 12 */ -#define SWORD_GONE_ROOM 18 /* уход ВПРАВО отсюда убирает меч */ -/* Слияние (autocontrol_shadow_level12): дистанция, вспышка, её длительность. */ -#define SHADOW_UNITE_DIST 10 -#define SHADOW_UNITE_TIME 42 - -/* Уровень 13 — ДЖАФАР (custom->jaffar_*, дефолты SDLPoP). Своего ИИ у него - * нет вовсе: `autocontrol_Jaffar` (seg002:085A) — это `autocontrol_guard`, - * то есть обычный бой стражи. Отличают его только данные (VIZIER.DAT, - * skill 9, 6 HP — всё уже в pop_level_cold.c) и три события ниже. - * - * Встреча: Кид уходит ВПРАВО из комнаты 3 — а `комната 3.right = 1`, где - * Джафар и стоит (проверено по res2013.bin, ../docs/levels_12_15_plan.md - * §7.2). Ему даётся фора JAFFAR_NOTICE_TIME кадров: пока таймер идёт, он не - * встаёт в боевую стойку, и это единственная пауза во всей сцене. - * - * Выход: смерть Джафара сама дверь НЕ открывает — она ставит - * pop_leveldoor_open = 2, а дверь открывает КНОПКА комнаты 24 (tilepos 0, - * реальный opener), «нажимаемая» при уходе Кида ВЛЕВО. */ -#define JAFFAR_LEVEL 13 -#define JAFFAR_MEET_ROOM 3 /* уход ВПРАВО отсюда будит Джафара */ -#define JAFFAR_NOTICE_TIME 28 /* ≈2,3 с форы (28/12) */ -#define JAFFAR_EXIT_ROOM 24 -#define JAFFAR_EXIT_TILEPOS 0 -#define JAFFAR_FLASH_TIME 18 - -/* Градаций мастерства стража (seg002: таблицы вероятностей по 12 записей). */ -#define NUM_GUARD_SKILLS 12 - -/* Тип персонажа — в pop_char.h (общий с Кидом и Char). */ - -extern pop_char_t Guard; /* страж ТЕКУЩЕЙ комнаты (как в оригинале) */ -extern uint8_t guardhp_curr, guardhp_max; -extern int8_t guardhp_delta; /* <0 = в этом кадре отняли HP */ - -/* take_hp (seg006:06BD): отнять count HP у АКТИВНОГО персонажа (Char) — - * Киду из `hitp_*`, любому другому из `guardhp_*`. Возврат 1 = HP кончились - * (для вызывающего это «умер»); саму дельту применяет pop_do_delta_hp раз в - * кадр, как в оригинале. - * - * Живёт в резиденте W1/W2, потому что зовут ОБА банка: боёвка (guards.c, - * банк 1) и физика (pop_map.c, банк 3) — раньше у каждого была своя копия, - * причём у pop_map неверная (правила hitp_curr напрямую, мимо дельты, и не - * знала про не-Кидов). Чит бессмертия ловится здесь же. */ -uint8_t pop_take_hp(uint8_t count); - -/* Взводится в кадре, когда СТРАЖУ убавили HP (guardhp_delta < 0 оригинала): - * по нему pop_char_draw рисует «брызги» удара, как draw_guard в seg008:1654. - * Снимает главный цикл после отрисовки — стража могло не оказаться в - * отрисованной комнате, и тогда флаг обязан просто пропасть. */ -extern uint8_t pop_guard_hurt; - -/* Видит ли страж Кида (порт can_guard_see_kid, seg003:688): - * 0 — не видит, 1 — видит, но не пойдёт (между ними loose/чомпер/дыра), - * 2 — видит и пойдёт. Считает pop_check_can_guard_see_kid (банк) раз в - * кадр ДО логики персонажей; читают ИИ (autocontrol_*) и боёвка. */ -extern int8_t can_guard_see_kid; - -/* Кид «нашумел» (порт is_guard_notice, seg000:364): заставляет неактивного - * стража обернуться, даже если Кид у него за спиной. Ставит источник шума, - * снимает сам ИИ. */ -extern int8_t is_guard_notice; - -/* Боевые таймеры/уровень мастерства (seg000:295..311). Все убывают раз в - * кадр в autocontrol_opponent — как в оригинале. - * guard_skill — 0..11, из данных уровня; индекс в таблицы вероятностей; - * guard_refrac — «отдышка» стража: пока >0, он не атакует и не наступает; - * justblocked — Кид только что парировал (влияет на вероятность блока); - * kid_sword_strike — Кид только что бил (стража это придерживает). */ -extern uint8_t guard_skill; -extern int8_t guard_refrac, justblocked, kid_sword_strike; - -/* Состояние меча КИДА (seg005/seg006): - * offguard — меч убран НАМЕРЕННО (вниз в бою): пока стоит, Кид не - * достаёт клинок автоматически, даже видя стража; - * holding_sword — клинок в руке (для индикатора HP стража). */ -extern int8_t offguard, holding_sword; - -/* do_demo() SDLPoP: когда у Кида вынут меч, scripted demo_moves временно - * заменяются боевым AI skill 10, после чего skill 11 остаётся стражу. - * Возврат 1 — AI применён; 0 — меч ещё не вынут, продолжать таблицу. */ -uint8_t pop_demo_kid_ai(void) __banked; - -/* Спецсобытие уровня 12 — СЛИЯНИЕ С ТЕНЬЮ (united_with_shadow, seg000:288). - * Значение читается как три разных состояния, и это НЕ флаг: - * 0 — тень ещё отдельный персонаж (или уровень не 12); - * >0 — идёт вспышка слияния, счётчик кадров (42 → 1), убывает в - * pop_shadow_timer; пока он идёт, Кид мигает спрайтами тени; - * −1 — «уже слились», навсегда до конца уровня. Именно по нему - * check_shadow больше не поднимает тень, а в комнатах 2/13 - * появляются недостающие плиты пола. - * Переход 0 → −1 идёт ЧЕРЕЗ счётчик: таймер, досчитав до нуля, уводит его - * ещё на единицу вниз (seg003:503) — отсюда и знаковый тип. - * - * pop_shadow_init (shadow_initialized, seg000:309) — «тень уже дождалась - * Кида в комнате 15»: до этого autocontrol_shadow_level12 роняет её заново - * каждый кадр, чтобы Кид застал падение, а не готовую стойку. */ -extern int8_t pop_united_shadow; -extern uint8_t pop_shadow_init; - -/* Сид бросков боёвки (свой домен последовательности, см. pop_geom.h). */ -extern pop_rnd_t pop_fight_seed; - -/* Луч видимости стража — раз в кадр, ДО тиков персонажей (в оригинале - * check_can_guard_see_kid стоит в play_frame перед play_kid_frame). */ -void pop_check_can_guard_see_kid(void) __banked; - -/* check_skel (seg002:1042) — СПЕЦСОБЫТИЕ уровня 3: скелета нет в данных - * уровня (guards_tile пуст во всех комнатах), он поднимается сам, когда Кид - * доходит до нужной колонки комнаты 1 при открытой двери уровня. Звать раз - * в кадр, ДО логики персонажей (порядок play_frame, seg000:868). */ -void pop_check_skel(void) __banked; - -/* Спецсобытие уровня 8 — МЫШЬ (do_timers seg003:0545 + do_mouse seg003:0ABA). - * Условие запуска: дверь уровня открыта И Кид в комнате 16; тогда счётчик - * pop_leveldoor_open растёт кадрами, и на 150-м мышь появляется у правого - * края верхнего ряда. Звать раз в кадр рядом с pop_check_skel. */ -void pop_check_mouse(void) __banked; - -/* check_shadow (seg002:0064) — СПЕЦСОБЫТИЕ входа в комнату: на «шадоу»- - * уровнях слот соперника занимает ТЕНЬ, а не страж из данных. Звать ВМЕСТО - * pop_guard_enter при входе в комнату; вернула 1 — событие обработано и - * стража поднимать НЕ надо. - * - * Тонкость оригинала, которую легко потерять: на уровне 5 в комнате 24 - * страж В ДАННЫХ ЕСТЬ (`guards_tile[23] = 8`), но enter_guard там не - * вызывается НИКОГДА — ни когда тень поднимается, ни когда зелье уже - * выпито (в обоих случаях seg002:0064 делает return). Поэтому 1 - * возвращается и во втором случае тоже. */ -uint8_t pop_check_shadow(uint8_t room) __banked; - -/* sword_disappears (seg002:0536) — спецсобытие уровня 12: уход ВПРАВО из - * комнаты 18 убирает меч из комнаты 15. Звать при уходе вбок ДО смены - * комнаты, рядом с чекпойнтом уровня 3. */ -void pop_sword_disappears(void) __banked; - -/* meet_Jaffar (seg002:0544) — уход ВПРАВО из комнаты 3 уровня 13 даёт - * Джафару фору; звать рядом с pop_sword_disappears (та же ветка leave_room). - * Jaffar_exit (seg002:0517) — уход ВЛЕВО при pop_leveldoor_open == 2 жмёт - * кнопку комнаты 24 и открывает дверь уровня. */ -void pop_meet_jaffar(void) __banked; -void pop_jaffar_exit(void) __banked; - -/* check_killed_shadow (seg006:2033) — спецсобытие уровня 12: смерть тени - * убивает Кида и наоборот. Звать раз в кадр ДО тиков персонажей, рядом с - * pop_check_skel; на прочих уровнях выходит первой строкой. */ -void pop_check_killed_shadow(void) __banked; - -/* timers (seg003:0735) — кадровые счётчики спецсобытий: вспышка слияния с - * тенью и фора Джафара. Звать раз в кадр из главного цикла. Резидент: два - * вычитания, банк ради них не разворачиваем. */ -void pop_frame_timers(void); - -/* guard_notice_timer (seg000:307) — фора Джафара после встречи: пока >0, он - * не встаёт в боевую стойку. Ставит pop_meet_jaffar, убавляет - * pop_frame_timers, читает autocontrol_guard_inactive. */ -extern int8_t pop_guard_notice_timer; - -/* Боёвка: пометить попадания (обе стороны) и применить их. Порядок в - * кадре как в play_frame: hurting -> hurt -> do_delta_hp. */ -void pop_check_sword_hurting(void) __banked; -void pop_check_sword_hurt(void) __banked; - -/* Текущий кадр стража (порт cur_frame для Char): заполняет логика в W1/W2, - * читает отрисовка в резиденте W3. image == 255 — рисовать нечего. */ -extern kframe pop_gframe; -void pop_guard_ai_qsave(pop_qs_io_t *io) __banked; -void pop_guard_load_frame(void); - -/* check_guard_fallout (seg002:0241): убрать персонажа слота Guard, если он - * провалился ниже комнаты. Звать раз в кадр после физики и HP — как - * play_frame (seg000:884). */ -void pop_guard_fallout(void); - -/* Есть ли живой страж в отрисованной комнате (для главного цикла). */ -uint8_t pop_guard_present(void); - -/* Атласы стража (GUARD\\g0..g4.atl) — грузить ДО initgraph, как Kid. - * 0 — OK, -1 — ошибка (тогда страж просто не рисуется). */ -int pop_guard_load(void) __banked; - -/* Зеркальный ПО ВЕРТИКАЛИ набор соперника (файлы *_v.atl) — для зелья - * инверсии; зовётся из pop_vflip_load_all (pop_vflip.h). Живёт рядом с - * pop_guard_load: там же gp[] и выбор GUARD/SKEL. */ -int pop_guard_vflip_load(void) __banked; - -/* Сброс «одноразовых» музыкальных тем уровня (вступление 1-го, тень 6-го). - * Зовёт pop_start_level. */ -void pop_music_level_start(void) __banked; -void pop_guard_free(void) __banked; - -/* Вход в комнату: поднять стража из данных уровня (порт enter_guard, - * seg002:0112) либо убрать его, если в комнате стража нет. */ -void pop_guard_enter(uint8_t room); - -/* Запомнить стража УХОДЯЩЕЙ комнаты (порт leave_guard). Звать в начале - * enter_room, пока Guard ещё держит прежнего. */ -void pop_guard_leave(void); - -/* Страж идёт ЗА КИДОМ в соседнюю комнату — порт ветки стража из exit_room - * (seg002:0340) + follow_guard (seg002:039E). Звать ВМЕСТО пары - * leave/enter при смене комнаты: 1 = страж уже перенесён в new_room (ни - * leave, ни enter звать нельзя), 0 = остаётся в старой (всё как раньше). - * side — куда ушёл КИД: 0 left, 1 right, 2 up, 3 down. */ -uint8_t pop_guard_follow(uint8_t new_room, uint8_t side); - -/* Полоса HP (Кид слева, страж справа) в статус-полосе. Рисует главный цикл - * ПОСЛЕ персонажей — она ничего не перекрывает. */ -void pop_hp_draw(void) __banked; -/* Полоса стёрта перерисовкой фона (вход в комнату) — обновить обе страницы. */ -void pop_hp_invalidate(void) __banked; - -/* Цвет стража — подменой 16 слотов палитры (порт set_chtab_palette, - * seg003:257): спрайты лежат в индексах POP_GUARD_PAL_BASE + v, а цвет - * задаёт level.guards_color[room-1] (1..7; 0 = не менять). Звать ДО - * отрисовки комнаты, как это делает redraw_screen. */ -void pop_guard_set_palette(uint8_t color) __banked; - -/* Пере-применить палитру ТЕКУЩЕГО набора соперника (скелет/Джафар — своя из - * файла набора, обычный страж — последний curr_guard_color). Диапазон - * 0x90..0x9F динамический: kid.pal затирает его палитрой стража, поэтому - * каждый file-load логической палитры доплачивает его заново — так же, как - * pop_bg_pal_apply/pop_shadow_pal_apply. Звать ДО snapshot. */ -void pop_guard_pal_apply(void) __banked; - -/* Отрисовка соперника — общая на всех Char: pop_char_draw(POP_CH_OPP) и - * компания, см. pop_cdraw.h. Метрики его последнего кадра (в т.ч. ширина - * спрайта для char_width_half) — pop_cd[POP_CH_OPP]. */ - -/* Убрать стража со сцены (смена комнаты / инициализация). */ -void pop_guard_reset(void); - -/* Чит «убить стража» (seg000:786, K): скелета не берёт. Вызывать только - * при включённых читах — проверку делает вызывающий. */ -void pop_guard_kill(void); - -/* do_delta_hp (seg003): применить дельту HP, накопленную за кадр. Звать - * раз в кадр ПОСЛЕ тиков персонажей (в оригинале — в play_frame). */ -void pop_do_delta_hp(void); - -/* Тик логики стража — В БАНКЕ (guards.c). Состояние берёт отсюда. */ -void pop_guard_tick(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_guard_cold.c b/applications/SprPoP/src/pop_guard_cold.c deleted file mode 100644 index 35d7f63..0000000 --- a/applications/SprPoP/src/pop_guard_cold.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * pop_guard_cold.c — переходы стража МЕЖДУ КОМНАТАМИ (банк 8): страж идёт - * за Кидом (follow_guard, seg002:039E) и вход стража в комнату - * (enter_guard, seg002:0112 + pos_guards, seg003). - * - * Обе зовутся РАЗ НА КОМНАТУ и обе — из sprpop_cold.c, который лежит в - * том же банке 8: значит в резиденте им делать нечего, а трамплин на - * вызове не появляется (объявления в pop_guard.h без __banked; условие - * корректности — оба модуля в одном банке, см. _pop_kdraw.h про ту же - * связку). Состояние стража (Guard, guard_skill, …) живёт в pop_guard.c - * и видно отсюда как обычные глобалы: данные банков — в общем _DATA. - */ -#include -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_level.h" -#include "pop_kid.h" /* Char/play_seq — интерпретатор общий */ -#include "pop_map.h" -#include "pop_state.h" -#include "pop_tile.h" /* POP_TILE_DIV — колонка по X без деления */ -#include "kid_data.h" - -static int8_t guard_col_from_x(uint8_t xpos); /* определена ниже */ - -/* ---- Страж ИДЁТ ЗА КИДОМ в соседнюю комнату ------------------------- * - * Порт ветки стража из exit_room (seg002:0340..0382) + follow_guard - * (seg002:039E). Своим ходом персонаж слота Guard из комнаты не уходит - * (его физика гейтится x ∈ [44,211), см. pop_guard_phys_tick), но когда - * комнату меняет КИД, движок может перенести стража следом — именно так в - * оригинале страж из комнаты 3 оказывается в комнате 2 за отступающим - * Кидом. - * - * Условия оригинала, все обязательные: - * - страж есть, ЖИВ и с ВЫНУТЫМ МЕЧОМ (то есть идёт бой); - * - переход ВБОК: вверх и вниз оригинал не пускает никогда (там условия - * `curr_row >= 0` и `curr_row < 3` истинны всегда → leave_guard); - * - в целевой комнате НЕТ своего ЖИВОГО стража (иначе их стало бы два: - * проверка `guards_tile >= 30 || guards_seq_hi != 0` — «пусто или - * труп»); - * - страж прижат к тому краю, в который ушёл Кид: x < 91 при уходе - * влево, x >= 165 при уходе вправо. - * - * side — куда ушёл КИД (0 = left, 1 = right, 2 = up, 3 = down), то есть - * roomleave_result оригинала. Возврат: 1 — страж перенесён в new_room - * (вызывающий НЕ должен звать ни pop_guard_leave, ни pop_guard_enter), - * 0 — остаётся, всё как раньше. */ -uint8_t pop_guard_follow(uint8_t new_room, uint8_t side) -{ - uint8_t tile, color, skill; - int8_t dir; - - if (Guard.charid == 0) return 0; /* dir_56_none */ - if (Guard.alive >= 0 || Guard.sword != SWORD_2_DRAWN) return 0; - if (side > 1) return 0; /* только вбок */ - /* «В целевой комнате уже есть живой страж» = страж по данным есть И это - * не запомненный труп (у трупа сохранена последовательность). */ - if (pop_level_guard(new_room, &tile, &dir, &color, &skill) && - pop_guard_state_seq(new_room) == 0) return 0; - if (side == 0) { if (Guard.x >= 91) return 0; } /* Кид ушёл влево */ - else { if (Guard.x < 165) return 0; } /* Кид ушёл вправо */ - - /* follow_guard: сначала «стража нет» в ОБЕИХ комнатах (в оригинале - * guards_tile = 0xFF). Без этого он раздвоится: в старой комнате его - * поднимут из данных при возврате, а в новой — при следующем входе. */ - pop_guard_state_save(Guard.room, 30, 0, 0, 0, 0, 0); - pop_guard_state_save(new_room, 30, 0, 0, 0, 0, 0); - - /* goto_other_room (seg002:0486) для стража: комната + перенос X через - * шов (влево +140, вправо −140). Ряд при боковом переходе не меняется; - * колонку пересчитываем из новой X, как enter_guard. */ - Guard.room = new_room; - Guard.x = (uint8_t)(side == 0 ? Guard.x + 140 : Guard.x - 140); - Guard.curr_col = guard_col_from_x(Guard.x); - return 1; -} - -/* get_tile_div_mod_m7 (seg006:697): колонка комнаты по X персонажа — - * floor((xpos − 7 − 58) / 14), где 58 = pop_x_bump[FIRST_ONSCREEN_COLUMN]. */ -static int8_t guard_col_from_x(uint8_t xpos) -{ - /* Таблицей (резидентная POP_TILE_DIV: −58 уже внутри значений) — тот же - * приём, что в tile_at_kid/get_tile_div_mod. Здесь он кроет ПОЧТИ всё: - * xpos — байт, так что медленный хвост остаётся только для xpos < 7. */ - if (xpos >= 7) return POP_TILE_DIV[xpos - 7]; - { - int16_t x = (int16_t)xpos - 7 - pop_x_bump[FIRST_ONSCREEN_COLUMN]; - int16_t col = x / TILE_SIZEX; - if (x % TILE_SIZEX < 0) --col; - return (int8_t)col; - } -} - -void pop_guard_enter(uint8_t room) -{ - uint8_t tile, color, skill; - int8_t dir; - pop_guard_reset(); - /* load_lev_spr (seg000:1112): tbl_guard_type == −1 — стражей на уровне - * НЕТ вообще (14), их графика даже не грузится. Без этой проверки - * на таком уровне полезли бы стражи из данных комнат. */ - if (pop_level_guard_type(pop_current_level) < 0) return; - if (!pop_level_guard(room, &tile, &dir, &color, &skill)) return; - /* Цвет — ДО отрисовки комнаты (как redraw_screen, seg003:255): слоты - * палитры общие на экран, и смена посреди кадра дала бы стража в новой - * палитре с полосой HP в старой. - * - * Цвет из данных комнаты берётся ТОЛЬКО у обычного стража (enter_guard, - * seg002:183: `curr_guard_color = 0`, если tbl_guard_type != 0). У - * скелета и Джафара палитра своя, из файла набора, и подменять её - * нельзя — иначе визирь на уровне 13 покрасился бы в цвет стража, - * записанный в его комнате. */ - pop_guard_set_palette(pop_level_guard_type(pop_current_level) == 0 - ? color : 0); - /* enter_guard (seg002:0112). Из ТАЙЛА берётся только РЯД — колонки в нём - * нет: leave_guard кладёт туда get_tilepos(0, row), то есть обнуляет её - * намеренно. Носитель колонки — guards_x, её пишет тот же leave_guard, а - * при загрузке уровня заполняет pos_guards (см. pop_gstate_init). - * - * Считать X из `tile % 10`, как мы делали, значит после ПЕРВОГО же выхода - * из комнаты телепортировать живого стража в КОЛОНКУ 0 — потому что там - * с этого момента ноль. Уровень 8, комната 24: страж стоит в (0,6), ряд 0 - * в колонках 1..3 ПУСТОЙ, и после возврата Кида страж оказывался над - * дырой (x = 72 — это колонка 1 по таблице деления), падал с ряда 0 на - * ряд 2 и разбивался. Наблюдения пользователя — «страж был на 0,0», - * «страж падает на 2,1 и разбивается» — это ровно оно. - * - * Y всегда по ряду: enter_guard ставит стража НА ПОЛ (y_land[row+1]), а не - * туда, где он был по вертикали. Поэтому «дорисовать падение» при - * возврате в комнату оригинал не умеет — и не должен. */ - Guard.room = room; - Guard.curr_row = (int8_t)(tile / 10); - Guard.y = (uint8_t)pop_y_land[Guard.curr_row + 1]; - Guard.direction = dir; - /* seg002:196: на уровне со скелетами слот поднимает СКЕЛЕТА, и он - * встаёт сразу активным — с вынутым мечом (seq_63), а не в стойке - * покоя (seq_77). Стойку ставит ветка ниже, вместе с seq трупа. */ - Guard.charid = (pop_level_guard_type(pop_current_level) == 2) - ? CHARID_4_SKELETON : CHARID_2_GUARD; - Guard.sword = (Guard.charid == CHARID_4_SKELETON) - ? SWORD_2_DRAWN : 0; /* sword_0_sheathed */ - Guard.alive = -1; - Guard.action = 1; /* actions_1_run_jump */ - Guard.fall_x = Guard.fall_y = 0; - /* enter_guard (seg002:214): мастерство из данных уровня, 12 градаций; - * всё, что вне диапазона, оригинал сводит к 3. */ - guard_skill = (uint8_t)(skill < NUM_GUARD_SKILLS ? skill : 3); - /* get_guard_hp (seg002:54): extrastrength[skill] + tbl_guard_hp[уровень]. - * extrastrength (seg002:38) ненулевой только у skill 4 (=1). */ - guardhp_max = guardhp_curr = - (uint8_t)(pop_level_guard_hp(pop_current_level) + (guard_skill == 4 ? 1 : 0)); - guardhp_delta = 0; - /* enter_guard (seg002:0208). Живого поднимаем стандартной стойкой; у - * ЗАПОМНЕННОГО МЁРТВОГО берём сохранённую последовательность — он лежит - * ровно там, где лёг (порт ветки guards_seq_hi != 0). */ - { - uint16_t saved_seq = pop_guard_state_seq(room); - /* X — ВСЕГДА из запомненной (enter_guard, seg002:179: - * `Char.x = level.guards_x[room_minus_1]`), и живого стража это - * касается ровно так же, как трупа: страж, с которым Кид не стал - * драться, обязан остаться СТОЯТЬ ТАМ ЖЕ. Иначе он не просто - * «дёргается» — он может встретить Кида прямо на входе в комнату, - * не дав тому достать меч. */ - Guard.x = pop_guard_state_x(room); - /* КОЛОНКА — из X (enter_guard, seg002:180: - * `Char.curr_col = get_tile_div_mod_m7(Char.x)`). Из тайла её брать - * нельзя, там всегда 0 (см. выше). Колонка нужна не только - * отрисовке: на неё смотрят коллизия и check_can_guard_see_kid, а у - * ЗАПОМНЕННОГО ТРУПА ещё и порядок обхода тайлов — иначе Кид - * рисовался поверх тела вместо того, чтобы пройти за ним - * (BUG-DRAWORDER-1). */ - Guard.curr_col = guard_col_from_x(Guard.x); - pop_loadshad(); - if (saved_seq) Char.curr_seq = saved_seq; - else pop_char_set_seq(SEQ_77_GUARD_STAND_INACTIVE); - pop_saveshad(); - pop_guard_play(); /* до первого кадра */ - /* enter_guard (seg002:218): кадр смерти -> страж поднят ТРУПОМ. */ - if (Guard.frame == 185 || Guard.frame == 177 || Guard.frame == 178) { - Guard.alive = 1; - guardhp_curr = 0; - } - } -} diff --git a/applications/SprPoP/src/pop_hof.c b/applications/SprPoP/src/pop_hof.c deleted file mode 100644 index a67613f..0000000 --- a/applications/SprPoP/src/pop_hof.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * pop_hof.c — persistent Hall of Fame, банк 9 (FG12). - * - * Порт двух показов оригинала: между credits и attract-demo (seg000:2060) - * и после победы, с вводом имени (end_sequence, seg001:5F1). Экран тот - * же самый — рамка story с логотипом PRINCE OF PERSIA (STORY_FRAME + - * HOF_POP), поэтому фон приходит готовой композицией из архива PV, а - * палитру выбирает вызывающая сцена: обе фазы идут на story.pal, и - * отличаются только цветом фона рамки (см. pop_pal_story_load). - * - * POP.HOF — небольшой самодостаточный формат: magic, version, fixed records - * и XOR+инверсия. Поэтому обрыв/мусор на HDD не может поломать старт игры: - * decode просто начинает с пустой таблицы. Ввод — raw-клавиатура, как весь - * PoP; он не открывает DSS-console и не конфликтует с активным raw hook. - */ -#include -#include -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_settings.h" -#include "pop_sfx.h" -#include "pop_timer.h" -#include "pop_pal.h" -#include "pop_ui.h" -#include "pop_cutscene.h" /* POP_T60 — тики оригинала в кадры луча */ -#include "pop_intro.h" /* фон экрана: рамка story + логотип */ -#include "pop_title.h" /* титульная картинка после ввода имени */ -#include "pop_music.h" /* подкачка потоковой темы победы */ -#include "pop_hof.h" -#include "_pop_file.h" - -/* MAX_HOF_COUNT оригинала — шесть строк. */ -#define HOF_COUNT 6 -#define HOF_NAME_SIZE 16 /* пятнадцать букв + '\0' */ -#define HOF_REC_SIZE 20 -#define HOF_HEADER_SIZE 6 -#define HOF_SIZE (HOF_HEADER_SIZE + HOF_COUNT * HOF_REC_SIZE + 2) -#define HOF_BASE 0x100 -#define HOF_VERSION 2 -#define HOF_FADE POP_FADE_FRAMES -#define HOF_NO_ROW 0xFF - -/* Геометрия hof_rects[] (seg001:0D92) в координатах 320x200: строка i - * занимает y = 84 + 14*i .. +12, имя от x=72, время по правому краю 248. - * Полоса ввода — та же строка, сдвинутая offset4_rect_add(-4,-1,-40,-1). */ -#define HOF_ROW_TOP 84 -#define HOF_ROW_STEP 14 -#define HOF_ROW_H 12 -#define HOF_LEFT 72 -#define HOF_RIGHT 248 -#define HOF_EDIT_LEFT (HOF_LEFT - 4) -#define HOF_EDIT_RIGHT (HOF_RIGHT - 40) -/* Крупный шрифт: глиф 7 строк, строка 12 — текст центрируется по вертикали. - * baseline = верх строки + 2 + POP_FONT_BIG_ASCENT. */ -#define HOF_BASELINE(i) (POP_YOFF + HOF_ROW_TOP + (int)(i) * HOF_ROW_STEP + 9) -/* Золотой цвет полосы ввода: 0xB7 оригинала = седьмой цвет палитры title, - * а у нас story.pal сделана из неё же. */ -#define HOF_GOLD 7 -/* Паузы оригинала в тиках 60 Гц: показ таблицы на титрах и пауза после - * ввода имени (seg000:2065, seg001:628). */ -#define HOF_TITLE_TICKS POP_T60(0xF0) -#define HOF_AFTER_TICKS POP_T60(120) - -typedef struct { - char name[HOF_NAME_SIZE]; - uint8_t minutes; - uint16_t ticks; - uint8_t limited; -} hof_entry_t; - -static hof_entry_t hof_table[HOF_COUNT]; -static uint8_t hof_buf[HOF_SIZE]; - -static uint8_t hof_xor(const uint8_t *p, uint8_t n) -{ - uint8_t sum = 0; - while (n--) sum ^= *p++; - return sum; -} - -static void hof_clear_entry(hof_entry_t *entry) -{ - uint8_t i; - for (i = 0; i < HOF_NAME_SIZE; i++) entry->name[i] = 0; - entry->minutes = 0; - entry->ticks = 0; - entry->limited = 0; -} - -static void hof_clear(void) -{ - uint8_t i; - for (i = 0; i < HOF_COUNT; i++) hof_clear_entry(&hof_table[i]); -} - -static uint8_t hof_decode(const uint8_t *src, uint8_t size) -{ - uint8_t i, j, off, sum; - - if (size != HOF_SIZE || src[0] != 'P' || src[1] != 'H' || - src[2] != 'O' || src[3] != 'F' || src[4] != HOF_VERSION || - src[5] != HOF_COUNT) - return 0; - sum = hof_xor(src, (uint8_t)(HOF_SIZE - 2)); - if (src[HOF_SIZE - 2] != sum || src[HOF_SIZE - 1] != (uint8_t)~sum) - return 0; - - off = HOF_HEADER_SIZE; - for (i = 0; i < HOF_COUNT; i++) { - hof_entry_t *entry = &hof_table[i]; - for (j = 0; j < HOF_NAME_SIZE - 1; j++) { - uint8_t ch = src[off++]; - /* Имя намеренно ASCII: это также отбрасывает мусор из чужого - * формата, не позволяя строке уйти за свою границу. */ - if (ch && (ch < ' ' || ch > 'Z')) return 0; - entry->name[j] = (char)ch; - } - entry->name[HOF_NAME_SIZE - 1] = 0; - entry->minutes = src[off++]; - entry->ticks = (uint16_t)(src[off] | ((uint16_t)src[off + 1] << 8)); - off += 2; - entry->limited = src[off++]; - if (entry->limited > 1 || - (entry->limited && (entry->ticks == 0 || - entry->ticks > POP_TIMER_START_TICKS))) - return 0; - } - return 1; -} - -static void hof_encode(uint8_t *dst) -{ - uint8_t i, j, off, sum; - - dst[0] = 'P'; dst[1] = 'H'; dst[2] = 'O'; dst[3] = 'F'; - dst[4] = HOF_VERSION; - dst[5] = HOF_COUNT; - off = HOF_HEADER_SIZE; - for (i = 0; i < HOF_COUNT; i++) { - const hof_entry_t *entry = &hof_table[i]; - for (j = 0; j < HOF_NAME_SIZE - 1; j++) dst[off++] = entry->name[j]; - dst[off++] = entry->minutes; - dst[off++] = (uint8_t)entry->ticks; - dst[off++] = (uint8_t)(entry->ticks >> 8); - dst[off++] = entry->limited; - } - sum = hof_xor(dst, (uint8_t)(HOF_SIZE - 2)); - dst[HOF_SIZE - 2] = sum; - dst[HOF_SIZE - 1] = (uint8_t)~sum; -} - -static void hof_load(void) -{ - uint8_t blk, page, i; - int got; - - hof_clear(); - blk = mem_alloc_pages(1); - if (!blk) return; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - POP_PATH_CALL(got, bank_load_file(page, HOF_BASE, "POP.HOF", HOF_SIZE)); - if (got == HOF_SIZE) { - gfx_w0_map(page); - for (i = 0; i < HOF_SIZE; i++) - hof_buf[i] = ((const uint8_t *)HOF_BASE)[i]; - gfx_w0_unmap(); - if (!hof_decode(hof_buf, (uint8_t)HOF_SIZE)) hof_clear(); - } - mem_free_block(blk); -} - -static void hof_save(void) -{ - uint8_t blk, page, i; - - blk = mem_alloc_pages(1); - if (!blk) return; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - hof_encode(hof_buf); - gfx_w0_map(page); - for (i = 0; i < HOF_SIZE; i++) ((uint8_t *)HOF_BASE)[i] = hof_buf[i]; - gfx_w0_unmap(); - /* Неудача записи не меняет только что показанную таблицу: следующее - * открытие разумно начнёт с прежнего файла или с пустого списка. */ - { - int saved; - POP_PATH_CALL(saved, - bank_save_file(page, HOF_BASE, "POP.HOF", HOF_SIZE)); - } - mem_free_block(blk); -} - -static uint8_t hof_better(const hof_entry_t *entry) -{ - uint8_t limited = pop_settings.time_limit_enabled; - - if (!entry->name[0]) return 1; - /* Unlimited сохраняется и выводится, но не может вытеснить ограниченный - * таймером результат: у него нет сравнимого времени. */ - if (limited != entry->limited) return limited; - if (pop_timer_minutes != entry->minutes) - return (uint8_t)(pop_timer_minutes > entry->minutes); - return (uint8_t)(pop_timer_ticks > entry->ticks); -} - -static uint8_t hof_insert_current(void) -{ - uint8_t i, j; - - for (i = 0; i < HOF_COUNT; i++) { - if (!hof_better(&hof_table[i])) continue; - for (j = HOF_COUNT - 1; j > i; j--) hof_table[j] = hof_table[j - 1]; - hof_clear_entry(&hof_table[i]); - hof_table[i].minutes = pop_timer_minutes; - hof_table[i].ticks = pop_timer_ticks; - hof_table[i].limited = pop_settings.time_limit_enabled; - return i; - } - return HOF_NO_ROW; -} - -static uint8_t hof_has_entries(void) -{ - uint8_t i; - for (i = 0; i < HOF_COUNT; i++) - if (hof_table[i].name[0]) return 1; - return 0; -} - -static void hof_dec(uint8_t value, char *out) -{ - if (value >= 100) { - *out++ = (char)('0' + value / 100); - value %= 100; - *out++ = (char)('0' + value / 10); - } else if (value >= 10) { - *out++ = (char)('0' + value / 10); - } - *out++ = (char)('0' + value % 10); - *out = 0; -} - -/* «59:43» — те же min-1 : tick/12, что печатает show_hof (seg001:0E94). */ -static void hof_result_text(const hof_entry_t *entry, char *out) -{ - uint8_t seconds; - - if (!entry->limited) { - strcpy(out, "UNLIMITED"); - return; - } - /* min == 0 у оригинала означает истёкшее время и печатается как 0:00. */ - hof_dec(entry->minutes ? (uint8_t)(entry->minutes - 1) : 0, out); - while (*out) out++; - seconds = entry->minutes ? (uint8_t)(entry->ticks / 12) : 0; - *out++ = ':'; - *out++ = (char)('0' + seconds / 10); - *out++ = (char)('0' + seconds % 10); - *out = 0; -} - -/* show_hof_text(): сначала тень со сдвигом (1,1), затем сам текст. У нас - * цвет запечён в глифы, поэтому «другой цвет» — это второй набор - * (POP_TEXT_BIG_DARK), а не параметр рисования. */ -static void hof_text_left(int x, int baseline, const char *s) -{ - pop_text_draw_mapped(POP_TEXT_BIG_DARK, x + 1, baseline + 1, s); - pop_text_draw_mapped(POP_TEXT_BIG, x, baseline, s); -} - -static void hof_text_right(int right, int baseline, const char *s) -{ - pop_text_right_mapped(POP_TEXT_BIG_DARK, right + 1, baseline + 1, s); - pop_text_right_mapped(POP_TEXT_BIG, right, baseline, s); -} - -/* Золотая полоса под ввод — draw_rect(&rect, bgcolor) оригинала. */ -static void hof_edit_bar(uint8_t row) -{ - int top = HOF_BASELINE(row) - 10; - - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, HOF_GOLD); - bar(HOF_EDIT_LEFT, top, HOF_EDIT_RIGHT, top + HOF_ROW_H - 1); -} - -/* Строки таблицы в ТЕКУЩУЮ draw-страницу. - * - * БАНК ЗДЕСЬ TRANSPARENT, А НЕ SPRITE. Полосовой переход копирует страницу - * акселератором, а тот читает ОЗУ-копию (gfx_copy_page); SPRITE — это - * NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах - * переезжал бы один фон без строк. TRANSPARENT даёт ту же прозрачность - * 0xFF, но обновляет и копию, поэтому таблица проявляется уже собранной. */ -static void hof_draw_rows(uint8_t edit_row) -{ - uint8_t i; - - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - for (i = 0; i < HOF_COUNT; i++) { - char value[12]; - const hof_entry_t *entry = &hof_table[i]; - int baseline = HOF_BASELINE(i); - - /* Строка, которую сейчас вписывают, уже содержит результат: имени - * ещё нет, а время справа оригинал показывает сразу (show_hof - * рисует все hof_count строк, включая только что вставленную). */ - if (!entry->name[0] && i != edit_row) continue; - if (entry->name[0]) hof_text_left(HOF_LEFT, baseline, entry->name); - hof_result_text(entry, value); - hof_text_right(HOF_RIGHT, baseline, value); - } - pop_text_unmap(); -} - -/* Готовая страница: фон из архива, полоса ввода и строки. -1 — фон не - * прочитан, и тогда таблица просто не показывается: ни игра, ни title от - * этого не зависят. */ -static int hof_page_build(uint8_t page, uint8_t edit_row) -{ - if (pop_intro_hof_bg(page) != 0) return -1; - gfx_set_draw_page(page); - if (edit_row != HOF_NO_ROW) hof_edit_bar(edit_row); - hof_draw_rows(edit_row); - return 0; -} - -/* Имя пишется ПРЯМО НА ЭКРАН, как input_str оригинала - * (current_target_surface = onscreen_surface_): страницы при вводе не - * меняются местами, поэтому дорисовывать фон второй страницы не нужно. */ -static void hof_edit_draw(uint8_t row, const char *name, uint8_t cursor) -{ - int x = HOF_LEFT, baseline = HOF_BASELINE(row); - - gfx_set_draw_page(gfx_get_visible_page()); - hof_edit_bar(row); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - /* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */ - if (name[0]) { - pop_text_draw_mapped(POP_TEXT_BIG_DARK, x, baseline, name); - x += pop_text_width_mapped(POP_TEXT_BIG_DARK, name) + 1; - } - /* draw_text_cursor(): подчерк той же гарнитуры сразу за текстом, - * мигающий сменой цвета на фоновый — у нас проще перерисовать. - * - * СТРОКА СТРОИТСЯ НА СТЕКЕ, И ЭТО НЕ ПРИДИРКА (поймано в MAME - * 2026-08-27). Литерал "_" лёг бы в _BANK10, то есть в окно W3, а - * pop_text_draw_mapped живёт в банке 9: трамплин на время вызова - * переключает W3, и указатель показывает уже в ЧУЖОЙ банк. Функция - * честно читает оттуда байты до первого нуля и рисует их знаками - * вопроса — экран заливало мусором на каждое мигание курсора. Стек - * лежит в W2, он виден из любого банка. */ - if (cursor) { - char cur[2]; - - cur[0] = '_'; - cur[1] = 0; - pop_text_draw_mapped(POP_TEXT_BIG_DARK, x, baseline, cur); - } - pop_text_unmap(); -} - -/* ---- ожидания -------------------------------------------------------- * - * - * Любое ожидание этого экрана держит ПОТОКОВУЮ музыку: победная тема - * (1,2 МБ) играет кольцом страниц, и дочитывать её надо всё время, пока - * игрок смотрит таблицу и печатает имя — иначе насос догонит загрузчика и - * пойдёт по кругу старыми данными. - * - * Прерывание — по НОВОМУ нажатию (детектор фронта, как в сценах intro): - * клавиша, которой закончили предыдущий экран, в момент входа ещё зажата, - * и считать её за «пропустить» нельзя. */ -typedef struct { uint8_t armed; } hof_skip_t; - -static void hof_skip_begin(hof_skip_t *sk) -{ - kbd_raw_sync(); - sk->armed = (uint8_t)!kbd_raw_any_down(); -} - -static uint8_t hof_skip_requested(hof_skip_t *sk) -{ - kbd_raw_sync(); - if (!kbd_raw_any_down()) { sk->armed = 1; return 0; } - return sk->armed; -} - -/* Возврат 1 — ожидание прервано нажатием. */ -static uint8_t hof_wait_frames(uint16_t frames) -{ - hof_skip_t skip; - - hof_skip_begin(&skip); - while (frames--) { - if (hof_skip_requested(&skip)) return 1; - pop_music_service(); - gfx_wait_vsync(); - } - return 0; -} - -/* `while (check_sound_playing() && !key_test_quit())` (seg001:637): финал - * дослушивает победную тему и прерывается любой клавишей. */ -static void hof_wait_music(void) -{ - hof_skip_t skip; - - hof_skip_begin(&skip); - while (pop_music_busy() && !hof_skip_requested(&skip)) { - pop_music_service(); - gfx_wait_vsync(); - } -} - -/* Set 2 make-коды A..Z, затем space/backspace/enter/esc. Храним edge для - * каждой клавиши, поэтому зажатая буква не заполняет имя автоповтором. */ -static const uint8_t hof_key_code[30] = { - 0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33, 0x43, - 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D, 0x15, 0x2D, - 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22, 0x35, 0x1A, - KBD_SPACE, 0x66, KBD_ENTER, KBD_ESC -}; - -/* Возвращает 1 — ввод завершён (Enter), 2 — отменён (Esc); 0 — продолжаем. - * *changed — надо ли перерисовать строку. */ -static uint8_t hof_name_tick(hof_entry_t *entry, uint8_t *length, - uint8_t *previous, uint8_t *changed) -{ - uint8_t i; - - for (i = 0; i < 30; i++) { - uint8_t down = kbd_raw_down(hof_key_code[i]); - if (down && !previous[i]) { - if (i < 26 && *length < HOF_NAME_SIZE - 1) { - entry->name[(*length)++] = (char)('A' + i); - entry->name[*length] = 0; - *changed = 1; - } else if (i == 26 && *length && *length < HOF_NAME_SIZE - 1) { - entry->name[(*length)++] = ' '; - entry->name[*length] = 0; - *changed = 1; - } else if (i == 27 && *length) { - entry->name[--(*length)] = 0; - *changed = 1; - } else if (i == 28 || i == 29) { - previous[i] = down; - return (uint8_t)(i == 28 ? 1 : 2); /* Enter : Esc */ - } - } - previous[i] = down; - } - return 0; -} - -/* Ввод имени в строку row. Пустое имя оригинал не отвергает, но пустая - * строка в таблице выглядела бы как свободное место — подставляем PLAYER. */ -/* Курсор мигает каждые шесть тиков 60 Гц (start_timer(timer_0, 6) в - * input_str) — в кадрах луча это HOF_BLINK. */ -#define HOF_BLINK POP_T60(6) - -/* 1 — игрок отказался вписывать имя (Esc). */ -static uint8_t hof_edit(uint8_t row) -{ - uint8_t length = 0, previous[30], i, changed = 1; - uint8_t cursor = 1, phase = 0; - hof_entry_t *entry = &hof_table[row]; - - for (i = 0; i < sizeof(previous); i++) previous[i] = 0; - /* Стартовое состояние клавиш: зажатое с прошлого экрана не считается - * нажатием, поэтому первый sync только заполняет previous[]. */ - kbd_raw_sync(); - for (i = 0; i < sizeof(previous); i++) - previous[i] = kbd_raw_down(hof_key_code[i]); - for (;;) { - uint8_t done; - - kbd_raw_sync(); - done = hof_name_tick(entry, &length, previous, &changed); - if (done == 2) return 1; /* Esc — запись не нужна */ - if (done) { - if (!length) strcpy(entry->name, "PLAYER"); - return 0; - } - if (changed) { cursor = 1; phase = 0; } - if (++phase >= HOF_BLINK) { - phase = 0; - cursor = (uint8_t)!cursor; - changed = 1; - } - if (changed) { - hof_edit_draw(row, entry->name, cursor); - changed = 0; - } - pop_music_service(); - gfx_wait_vsync(); - } -} - -void pop_hof_show(void) __banked -{ - uint8_t row; - - hof_load(); - row = hof_insert_current(); - if (row != HOF_NO_ROW) { - uint8_t page; - - /* fade_out_2 гасит титульную картинку перед таблицей (seg001:601). - * Палитру не меняем: story.pal с красным фоном рамки уже стоит от - * финального HAIL, и снимок для fade сделан ею же. */ - (void)pop_pal_fade_out_skip(HOF_FADE); - page = pop_screen_begin(); - if (hof_page_build(page, row) == 0) { - pop_screen_present(page); - (void)pop_pal_fade_in_skip(HOF_FADE); - /* ОТКАЗ ПО Esc — РАСХОЖДЕНИЕ С ОРИГИНАЛОМ (docs/impl_diff.md). - * SDLPoP крутит `while (input_str(...) <= 0)`, то есть уйти без - * имени нельзя вовсе. Мы разрешаем: тогда таблицу перечитываем - * с диска (hof_insert_current уже сдвинул строки, и откатывать - * их дешевле всего именно так) и НЕ сохраняем. */ - if (hof_edit(row)) hof_load(); - else hof_save(); - /* Имя вписано: строку показываем уже обычным золотым текстом, - * без полосы (restore_peel + show_hof_text оригинала). */ - page = pop_screen_begin(); - if (hof_page_build(page, HOF_NO_ROW) == 0) - pop_screen_present(page); - hof_wait_frames(HOF_AFTER_TICKS); - (void)pop_title_main_ltr(); - } - } - hof_wait_music(); - (void)pop_pal_fade_out_skip(HOF_FADE); - pop_music_free(); - pop_sfx_pause(); -} - -uint8_t pop_hof_show_title(void) __banked -{ - uint8_t page; - - hof_load(); - if (!hof_has_entries()) return 0; - page = pop_screen_begin(); - /* Страница собирается ЦЕЛИКОМ до показа — как offscreen оригинала: - * draw_full_image + show_hof, и только потом transition_ltr - * (seg000:2063). Ни fade, ни смены палитры: экран проявляется прямо - * поверх credits, на той же story.pal. */ - if (hof_page_build(page, HOF_NO_ROW) != 0) return 0; - pop_screen_present_ltr(); - return hof_wait_frames(HOF_TITLE_TICKS); -} diff --git a/applications/SprPoP/src/pop_hof.h b/applications/SprPoP/src/pop_hof.h deleted file mode 100644 index dbe34be..0000000 --- a/applications/SprPoP/src/pop_hof.h +++ /dev/null @@ -1,21 +0,0 @@ -/* pop_hof.h — таблица результатов после финала, банк 9 (FG12). */ -#ifndef POP_HOF_H -#define POP_HOF_H - -#include - -/* Хвост end_sequence: при подходящем результате — запрос имени, сохранение - * POP.HOF и возврат к титульной картинке; затем в любом случае - * дослушивается победная тема и гаснет экран. Ошибка или повреждение - * файла означают пустую таблицу; gameplay и последующий title от этого не - * зависят. Победная тема на входе ещё звучит — освобождает её эта - * функция. */ -void pop_hof_show(void) __banked; - -/* Показать уже существующую непустую таблицу между credits и demo - * (seg000:2060): полосовой переход, 240 тиков, ни fade, ни смены палитры. - * Возврат 1 — игрок нажал клавишу, то есть всю цепочку title/intro надо - * прервать. */ -uint8_t pop_hof_show_title(void) __banked; - -#endif /* POP_HOF_H */ diff --git a/applications/SprPoP/src/pop_intro.c b/applications/SprPoP/src/pop_intro.c deleted file mode 100644 index 2ffe184..0000000 --- a/applications/SprPoP/src/pop_intro.c +++ /dev/null @@ -1,1947 +0,0 @@ -/* - * pop_intro.c — вторая половина show_title(): story + Princess/Jaffar (FG8). - * - * Готовые сцены создаёт pop_pack_intro.py из TITLE/PV SDLPoP. Каждая сцена - * хранится пятью полосами <=49 строк, поэтому EMM удерживает лишь текущую - * полосу. pop_cutscene_t остаётся независимым от графики: этот модуль только - * исполняет его события и позднее будет образцом для pre-level сцен FG9. - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_shadow.h" -#include "pop_sfx.h" -#include "pop_music.h" -#include "pop_arc.h" -#include "pv_arc.h" -#include "pop_cutscene.h" -#include "pop_intro.h" -#include "pop_hof.h" /* таблица рекордов между credits и demo */ -#include "pop_title.h" /* титульная картинка в финале */ -#include "pop_pace.h" /* pop_wait_edge */ -#include "pop_pal.h" -#include "pop_timer.h" -#include "pop_ui.h" -#include "pop_kid.h" /* Char/окна, play_seq — движок персонажей катсцен */ -#include "pop_guard.h" /* Guard, CHARID_*, pop_gframe */ - -#define INTRO_PARTS 5 -/* ДЛИТЕЛЬНОСТЬ FADE. У оригинала это 64 шага палитры по два тика — - * 128 тиков, то есть 2,13 с (fade_in_1/fade_out_1 -> fade_*_frame -> - * do_simple_wait(1) при wait_time = 2). Наши четыре кадра укладывались в - * восемь сотых секунды, и вся сцена выходила втрое короче оригинальной. - * Точное число кадров считает POP_FADE_FRAMES (pop_ui.h): из - * заказанных 2,13 с вычитается то, что съедает сам пересчёт палитры. */ -#define INTRO_FADE POP_FADE_FRAMES - -/* Оцифрованные эффекты pv_scene() (SDLPoP seg001:422): створка ворот - * закрывается, затем открывается дверь покоев, из которой входит Джафар. */ -#define PV_SND_GATE_CLOSING 4 -#define PV_SND_DOOR_OPENING 51 - -/* Шкала ниже повторяет порядок pv_scene() SDLPoP и живёт в ЕГО тиках - * (60 Гц): обычный кадр cutscene длится 8 тиков, до первой смены темпа 6, - * после начала заклинания 7. В кадры луча переводит POP_T60. - * - * ДЛИННЫЕ ПАУЗЫ ЗДЕСЬ — ЭТО РЕПЛИКИ. Оригинал их не отмеряет, а ждёт - * окончания сэмпла (`do { frame(1) } while (check_sound_playing())`), и - * пока музыки у нас не было, паузы стояли укороченными «на глаз». - * - * ДВА КЛАССА КОНСТАНТ, И ИХ НЕЛЬЗЯ ПУТАТЬ. Раньше вся шкала была записана - * абсолютными литералами, и разница между ними была не видна — из-за этого - * смена набора записей (flac -> mt32) молча ломала сцену: - * - * 1) БИТЫ СЦЕНАРИЯ — интервалы самого pv_scene() SDLPoP. От записи не - * зависят и масштабироваться ею НЕ должны. Отсчитываются от начала - * своего куска (например, всё поведение Джафара — от PV_DIALOG1_START). - * 2) «ЖДЁМ КОНЦА РЕПЛИКИ» — PV_M50_END и PV_EXIT_START. Это целиком - * длина НАШЕЙ записи, и она у каждого набора своя: m50 — 831 тик на - * flac против 867 на mt32, m53 — 985 против 1044. Раньше их - * печатал упаковщик в gen/pop_music_ticks.h, из-за чего EXE был - * привязан к набору; теперь они приезжают из индекса набора - * (MUS/mus.idx) при входе в сцену — см. ЯКОРЯ ниже. - * - * Всё, что стоит ПОСЛЕ реплики, сдвигается вместе с её концом — отсюда - * сложения от PV_M50_END и PV_EXIT_START вместо литералов. */ -enum { - PV_MUS_2_START = 12, /* frame(2), затем «принцесса ждёт» (m50) */ - PV_MUS_3_LOAD = 60, /* подкачка следующей реплики, m50 звучит */ - /* Конец m50: кадр становится 8. Прежний литерал 846 отвечал длине 834 - * тика — на три больше нашей записи (831); расхождение осталось с - * времён, когда длину подставляли руками. */ - PV_MAGIC_LEAD = 0 -}; - -/* ПОДГОНКА ЗАКЛИНАНИЯ ПОД МУЗЫКУ СНЯТА (2026-08-28): теперь 0. - * - * История: сцена была render-bound — кадр рисовался дороже своего - * бюджета, кадровая ветка пейсинга догона не имела, и анимация шла - * ~49 тиков в секунду вместо 60 (замер 2026-08-27). Реплика Джафара - * при этом играет по РЕАЛЬНОМУ времени, поэтому кода приходила - * примерно на секунду раньше молнии, и жест целиком (замах, шаг - * назад, вспышка) сдвигали раньше сценария на подобранные на слух - * 100 тиков. - * - * Причину убрали: отрисовка разложена по кадровым интервалам - * (pv_restore_bg), сцена идёт по единственным часам — кадрам луча, — - * и подкачка трека оплачивается интервалом (pop_music_load_step). - * После этого подгонка стала вредной: молния била больше чем на - * секунду раньше коды (проверка пользователем 2026-08-28). Константу - * оставляем на месте — если запись другого набора (mt32/ogg) снова - * разъедется, крутить надо её, а не тайминги сценария. */ - -/* ЯКОРЯ ШКАЛЫ. Четыре точки, от которых отсчитывается всё остальное; - * считаются ОДИН РАЗ при входе в сцену из длительностей набора - * (pop_music_info). Держать их статикой, а не тащить структуру времён - * через пять функций: восемь байт против переделки всех сигнатур, а - * сцена всё равно одна на запуск. - * - * Нет индекса или трека — длительность нулевая, и сцена просто проходит - * без пауз на реплики: ждать нечего, звука-то нет. */ -static uint16_t pv_m50_end; /* конец «принцесса ждёт» (m50) */ -static uint16_t pv_dialog1; /* Джафар входит — начало реплики m53 */ -static uint16_t pv_exit; /* конец m53: Джафар уходит */ -static uint16_t pv_anim_end; /* конец всей сцены */ - -/* Ниже — те же выражения, что были в enum: биты сценария отсчитываются от - * своего якоря и от записи НЕ зависят. */ -#define PV_M50_END pv_m50_end -#define PV_WAIT_END ((uint16_t)(pv_m50_end + 40)) -#define PV_GATE_END ((uint16_t)(pv_m50_end + 88)) -#define PV_DOOR_END ((uint16_t)(pv_m50_end + 112)) -#define PV_TURN_START PV_DOOR_END -#define PV_WALK1_START ((uint16_t)(pv_m50_end + 152)) -#define PV_DIALOG1_START pv_dialog1 -#define PV_MUS_4_LOAD ((uint16_t)(pv_dialog1 + 54)) -#define PV_WALK2_START ((uint16_t)(pv_dialog1 + 176)) -#define PV_DIALOG2_START ((uint16_t)(pv_dialog1 + 416)) -#define PV_RAISE_START ((uint16_t)(pv_dialog1 + 696 - PV_MAGIC_LEAD)) -#define PV_STEPBACK_START ((uint16_t)(pv_dialog1 + 703 - PV_MAGIC_LEAD)) -#define PV_MAGIC_START ((uint16_t)(pv_dialog1 + 822 - PV_MAGIC_LEAD)) -#define PV_EXIT_START pv_exit -#define PV_MUS_4_START ((uint16_t)(pv_exit + 42)) -#define PV_GLASS_DONE ((uint16_t)(pv_exit + 210)) -#define PV_SLUMP_START ((uint16_t)(pv_exit + 273)) -#define PV_ANIM_TICKS pv_anim_end - -/* Собрать шкалу под НАШ набор записей. 200 — цепочка битов сценария от - * конца m50 до входа Джафара (40+48+24+40+48), 469 — хвост после его - * ухода; оба от записи не зависят. */ -static void pv_timing_init(void) -{ - pop_mus_info_t m50, m53; - - (void)pop_music_info(POP_MUS_STORY_2, &m50); - (void)pop_music_info(POP_MUS_STORY_3, &m53); - pv_m50_end = (uint16_t)(PV_MUS_2_START + m50.ticks); - pv_dialog1 = (uint16_t)(pv_m50_end + 200); - pv_exit = (uint16_t)(pv_dialog1 + m53.ticks); - pv_anim_end = (uint16_t)(pv_exit + 469); -} - -/* Возврат долга шкалы (см. цикл сцены): сколько порций насоса отдаём за один - * кадр сцены и сколько их вообще имеет смысл копить. 1 порция — 11,7 мс; - * 128 порций — полторы секунды, дальше догонять уже нечего. */ -enum { - INTRO_STORY_ABSENCE = 0, - INTRO_STORY_MARRY, - INTRO_STORY_CREDITS, - INTRO_STORY_HAIL, - INTRO_STORY_FRAME, - INTRO_STORY_HOF, /* рамка + логотип: фон таблицы рекордов */ - INTRO_PV_WAITING, - INTRO_PV_JAFFAR, - INTRO_PV_MAGIC, - INTRO_PV_ALONE, - INTRO_PV_STAND, - INTRO_PV_LYING, - INTRO_PV_MOUSE, - INTRO_PV_SHORT -}; - -enum { - INTRO_PAL_STORY = 0, - INTRO_PAL_PV = 1, - /* Та же story.pal, но фон текстовой рамки красный: - * load_title_images(0) в end_sequence (seg001:586). */ - INTRO_PAL_STORY_END = 2 -}; - -/* Экраны PV лежат в одном архиве по пять полос подряд, ровно в том же - * порядке, в каком идут номера сцен: сначала пять текстовых (story - * res41 + тексты 42/43/45/44 и чистая рамка), затем восемь стадий комнаты - * принцессы (res951 + персонажи) и чистый фон b0. Поэтому имён здесь нет - * — индекс первой полосы экрана считается умножением. */ -#if (ARC_PV_P0_0 - ARC_PV_S0_0) != 6 * INTRO_PARTS -#error "экраны PV в архиве лежат не по пять полос подряд" -#endif -#define INTRO_SCENES 14 - -/* Две текстовые половины show_title(). Между ними PV теперь идёт отдельным - * покадровым renderer-ом, а не четырьмя полными статичными композициями. */ -/* ПОЧЕМУ НЕ 0x258, КАК В ОРИГИНАЛЕ. Точка отсчёта у обоих — пуск m55; - * совпасть должен МОМЕНТ ПОЛНОЙ ТЕМНОТЫ, а дороги к нему разные: - * SDLPoP: transition_ltr 80 тиков + pop_wait 0x258 + fade_out_2, а тот - * гасит палитру за 0x40 шагов по 2 тика = 128 тиков; - * у нас: полосовой переход 80 кадров луча (= 96 тиков) + WAIT + fade - * той же длины (INTRO_FADE = 128 тиков). - * Теперь, когда наш fade идёт те же 128 тиков, остаётся поправка на один - * лишь переход: 80 + 600 + 128 - 96 - 128 = 584. Дальше и там и там экран - * уже чёрный, а трек доигрывает — этой паузой сцена и стыкуется с PV. */ -static const pop_cs_cmd_t intro_before_pv[] = { - /* absence собирается прямо поверх последнего title-кадра полосовым - * transition_ltr(), как в SDLPoP; оба экрана используют title.pal. */ - { POP_CS_WAIT, POP_T60(584) }, /* story 1: In the absence */ - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Файловый fallback сохраняет возможность пройти title на неполном HDD. - * Нормальная ветка его не вызывает: p0..p3 оставлены также для диагностики - * точек сюжета и не являются анимационным ресурсом. */ -static const pop_cs_cmd_t intro_pv_fallback[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, - { POP_CS_SHOW, INTRO_PV_WAITING }, - { POP_CS_FADE_IN, 0 }, - { POP_CS_WAIT, 0x1A }, /* princess, gate and door */ - { POP_CS_SHOW, INTRO_PV_JAFFAR }, - { POP_CS_WAIT, 0x6D }, /* Jaffar comes/walks */ - { POP_CS_SHOW, INTRO_PV_MAGIC }, - { POP_CS_FLASH, 5 }, /* hourglass appears */ - { POP_CS_WAIT, 0x2F }, - { POP_CS_SHOW, INTRO_PV_ALONE }, - { POP_CS_WAIT, 0x3D }, /* Jaffar leaves, princess looks */ - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Хвост show_title() разрезан надвое: между «свадьбой» и титрами оригинал - * ЖДЁТ окончания последней реплики Джафара (seg000:2051), которая начала - * звучать ещё в PV и продолжается поверх смены картинки. */ -static const pop_cs_cmd_t intro_marry[] = { - { POP_CS_PALETTE, INTRO_PAL_STORY }, - { POP_CS_SHOW, INTRO_STORY_MARRY }, - { POP_CS_FADE_IN, 0 }, - { POP_CS_END, 0 } -}; - -/* Гашение — отдельным шагом: между credits и ним оригинал показывает - * таблицу рекордов, если файл с ней есть (seg000:2060). */ -static const pop_cs_cmd_t intro_tail[] = { - { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -/* Статические fallback-сценарии хранят уже физические кадры Sprinter. - * Один логический кадр cutscene SDLPoP длится 6/60 с; на 50 Гц это ровно - * 5/50 с. Поэтому суммы proc_cutscene_frame() здесь умножены на пять. */ -static const pop_cs_cmd_t pre_2_6[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_STAND }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_4[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_LYING }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_8[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - /* 20 + 20 + 20 логических кадров = 6,0 с. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 300 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_9[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - /* 5 + 9 + 58 логических кадров = 7,2 с. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 360 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t pre_12_short[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_SHORT }, - /* 2 + 24 логических кадра = те же 2,6 с, что и длинная ветка. */ - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 130 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -/* time_expired() SDLPoP: hourglass_state=7, fade in, 2+100 кадров, fade - * out. P7 — готовая стадия комнаты с часами; звук намеренно не стартует, - * так как CBL на lifecycle screen погашен до дисковых чтений. */ -static const pop_cs_cmd_t time_expired_script[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_SHORT }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 102 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; -/* end_sequence_anim() — объятие/мышь — здесь сведён к отдельной PV-стадии; - * затем end_sequence() SDLPoP показывает HAIL ровно 900 тиков. */ -/* Хвост финала после живой сцены встречи: только исходный story-экран. */ -/* FADE_OUT в конце НЕТ намеренно: оригинал не гасит HAIL, а проявляет - * поверх него титульную картинку полосами (draw_full_image(TITLE_MAIN) + - * transition_ltr, seg001:590). Гасит экран уже таблица рекордов. */ -static const pop_cs_cmd_t ending_hail_script[] = { - { POP_CS_PALETTE, INTRO_PAL_STORY_END }, { POP_CS_SHOW, INTRO_STORY_HAIL }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 900 }, - { POP_CS_END, 0 } -}; -static const pop_cs_cmd_t ending_script[] = { - { POP_CS_PALETTE, INTRO_PAL_PV }, { POP_CS_SHOW, INTRO_PV_MOUSE }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 54 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_PALETTE, INTRO_PAL_STORY_END }, { POP_CS_SHOW, INTRO_STORY_HAIL }, - { POP_CS_FADE_IN, 0 }, { POP_CS_WAIT, 900 }, - { POP_CS_END, 0 } -}; - -static uint8_t intro_scene; -static uint8_t intro_pending_pal; -static uint8_t intro_pal_pending; - -/* Полосовой загрузчик рядом со своими вызовами: общий из банка 9 звать - * можно (индексы и таблица — числа на стеке W2, а не указатели на W3), но - * лишний банк→банк на каждую полосу тут ни к чему. - * pop_arc_atlas сам временно занимает W3 только на время чтения. */ -static int intro_blit_arc(pop_arc_t *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, int x, int y) -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - const uint8_t *img; - - if (pop_arc_atlas(arc, tbl, (uint8_t)(base + part), &at) != 0) - return -1; - gfx_w0_map(at.page); - img = (const uint8_t *)atlas_image(&at, 0); - gfx_blit(x, y, img); - y += img[2]; - gfx_w0_unmap(); - atlas_free(&at); - } - return 0; -} - -/* Экран целиком: открыть архив, вылить пять полос, закрыть. Один `open` - * на экран вместо пяти — при 51,4 мс за открытие это больше половины - * времени показа. */ -static int intro_blit_screen(uint8_t base, int y) -{ - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int res; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - res = intro_blit_arc(&arc, tbl, base, INTRO_PARTS, 0, y); - pop_arc_close(&arc); - return res; -} - -/* Один актёрский атлас PV из архива. Открытие на каждый — всё равно - * дешевле, чем прежние отдельные файлы (тот же `open`, но без поиска имени - * в каталоге); там, где их несколько подряд, архив открывается один раз. */ -static int pv_atlas(pop_arc_t *arc, const uint8_t *tbl, uint8_t idx, - atlas_t *at) -{ - return pop_arc_atlas(arc, tbl, idx, at) != 0 ? -1 : 0; -} - -/* ---- «Пропустить сцену» — по НОВОМУ нажатию, а не по удержанию -------- * - * - * Клавиша, которой закончили уровень (движение Кида в дверь, чит Shift+L, - * skip предыдущего экрана), в момент старта сцены ЕЩЁ ЗАЖАТА. Считать это - * за skip нельзя: сцена схлопывается в один кадр, и её никто не видит. - * Ждать отпускания безусловно тоже нельзя — потерянный break-код вешает - * игру намертво (BUGS_OPEN.md#kbd-stuck-wait). - * - * Поэтому детектор ФРОНТА: пока хоть что-то зажато со старта, skip не - * взводится; как только всё отпущено, детектор «взводится» и следующее - * нажатие сцену прерывает. Залипший бит в худшем случае делает сцену - * непропускаемой — она доиграет сама, а игра не встанет. */ -typedef struct { uint8_t armed; } intro_skip_t; - -static void intro_skip_begin(intro_skip_t *sk) -{ - kbd_raw_sync(); - sk->armed = (uint8_t)!kbd_raw_any_down(); -} - -static uint8_t intro_skip_requested(intro_skip_t *sk) -{ - kbd_raw_sync(); - if (!kbd_raw_any_down()) { sk->armed = 1; return 0; } - return sk->armed; -} - -static int intro_draw_page(uint8_t scene, uint8_t page) -{ - if (scene >= INTRO_SCENES) return -1; - gfx_set_draw_page(page); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - return intro_blit_screen((uint8_t)(ARC_PV_S0_0 + scene * INTRO_PARTS), - POP_YOFF); -} - -static int intro_draw(uint8_t scene) -{ - uint8_t page = pop_screen_begin(); - - if (intro_draw_page(scene, page) != 0) return -1; - pop_screen_present(page); - return 0; -} - -/* У gfx_pal_fload/sync палитра меняется по 64 цвета за вызов BIOS. Если в - * этот момент хоть одна страница содержит следующую сцену, один VSync может - * показать её уже яркой, ещё до штатного fade-in. Поэтому перед сменой - * источника палитры уничтожаем растр на ОБЕИХ страницах, а не только гасим - * их палитры. */ -static void intro_black_pages(void) -{ - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - gfx_set_draw_page(1); - pop_screen_fill(BLACK); - pop_screen_present(1); -} - -/* Для смены полного источника палитры сначала гасим старую сцену и - * оставляем на видимой странице настоящий чёрный растр. */ -static void intro_prepare_palette(uint8_t pal) -{ - intro_pending_pal = pal; - intro_pal_pending = 1; - pop_pal_apply(POP_PAL_DIM_BLACK); - intro_black_pages(); -} - -static void intro_commit_palette(void) -{ - if (intro_pending_pal == INTRO_PAL_PV) pop_pal_pv_load(); - else pop_pal_story_load((uint8_t)(intro_pending_pal == INTRO_PAL_STORY_END)); - pop_pal_apply(POP_PAL_DIM_BLACK); - intro_pal_pending = 0; -} - -static int intro_draw_new_palette(uint8_t scene) -{ - uint8_t page; - - /* Палитра загружается, пока обе страницы содержат только чёрный растр. - * После повторного затемнения можно собрать новую сцену в скрытую - * страницу и показать её исключительно чёрной перед fade-in. */ - intro_commit_palette(); - page = pop_screen_begin(); - if (intro_draw_page(scene, page) != 0) return -1; - pop_screen_present(page); - return 0; -} - -/* В отличие от intro_draw_page() здесь base собирается в shadow ОБЕИХ - * страниц. После show page 1 palette 0 не видна и в неё безопасно загрузить - * PV\pv.pal; первый animated frame соберётся в page 0. */ -static int intro_pv_draw_base(void) -{ - gfx_rect_t full; - - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - if (intro_blit_screen(ARC_PV_B0_0, POP_YOFF) != 0) return -1; - gfx_set_draw_page(1); - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - gfx_copy_page(&full, GFX_COPY_DIRECT); - pop_screen_present(1); - return 0; -} - -/* ВОССТАНОВЛЕНИЕ ФОНА ЗАДНЕЙ СТРАНИЦЫ — ДВУМЯ БЛОКАМИ ПО КАДРОВОМУ ИНТЕРВАЛУ. - * - * Персонажи и живой фон рисуются банком спрайтов и в ОЗУ-копию не оседают, - * поэтому «стереть прошлый кадр» = скопировать чистый фон из теневой копии - * соседней страницы. Раньше это была ОДНА копия на весь экран, и она стоила - * ~547 000 тактов = 1,27 кадра луча (модель blit_cost_model). Хвост кадра - * сцены ждал vsync ПОСЛЕ отрисовки, так что эти 1,27 кадра ПРИБАВЛЯЛИСЬ к - * пяти интервалам делителя: сцена шла 6+ кадров вместо 5, то есть ~8,2 fps - * вместо десяти (замер 49/60 тиков — docs/BUGS_OPEN.md PV-RENDER-BOUND). - * - * Лечение — не «удешевить», а РАЗЛОЖИТЬ по интервалам: каждый блок заведомо - * влезает в кадр, и после него честно ждём vsync. Тогда отрисовка живёт - * ВНУТРИ делителя, а не сверх него. - * - копируем только картинку (200 строк с POP_YOFF), а не все 256: - * сверху и снизу чёрная рамка, туда никто не рисует; - * - двумя половинами по 100 строк: ~219 000 тактов каждая, чуть больше - * половины кадра — запас двукратный. - * - * ТРАТИТ РОВНО ДВА кадровых интервала (по gfx_wait_vsync на блок) — это - * учтено в раскладке кадра у всех трёх сцен (см. вызовы). */ -#define PV_BG_Y0 POP_YOFF -#define PV_BG_H 200 - -static void pv_restore_bg(void) -{ - gfx_rect_t r; - - r.x = 0; - r.w = GFX_WIDTH; - r.h = PV_BG_H / 2; - r.y = PV_BG_Y0; - gfx_copy_page(&r, GFX_COPY_DIRECT); - gfx_wait_vsync(); - r.y = PV_BG_Y0 + PV_BG_H / 2; - gfx_copy_page(&r, GFX_COPY_DIRECT); - gfx_wait_vsync(); -} - -static void pv_blit_floor(const atlas_t *at, uint8_t frame, int x, int floor) -{ - const uint8_t *img; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, frame); - /* add_*table() оригинала задаёт нижнюю строку спрайта включительно. */ - gfx_blit(x, POP_YOFF + floor - img[2] + 1, img); - gfx_w0_unmap(); -} - -static void pv_blit_actor(const atlas_t *at, uint8_t frame, int anchor_x, - int floor, uint8_t flip) -{ - const uint8_t *img; - int x = anchor_x; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, frame); - /* draw_mid SDLPoP зеркалит правое направление относительно hot-point: - * экранный x сначала масштабирован, затем из него вычитается width. */ - if (flip) x -= img[0]; - gfx_blit_cols(x, POP_YOFF + floor - img[2] + 1, img, flip); - gfx_w0_unmap(); -} - -static void pv_draw_stars(const uint8_t *phase) -{ - static const uint8_t star_x[] = { 20, 16, 23, 17, 24, 18 }; - static const uint8_t star_y[] = { 97, 104, 110, 116, 120, 128 }; - static const uint8_t star_color[] = { 8, 7, 15, 15, 7 }; - uint8_t i; - - for (i = 0; i < sizeof(star_x); i++) { - /* draw_rect SDLPoP получает полуинтервал [x,x+1)×[y,y+1). - * BGI bar() включает правую/нижнюю границу и давал звезду 2x2. */ - putpixel(star_x[i], POP_YOFF + star_y[i], star_color[phase[i]]); - } -} - -/* У Princess/Jaffar номер frame — это индекс frame_tbl_cuts, а картинка - * лежит в отдельном chtab. Эти таблицы — компактная нужная часть таблицы - * SDLPoP: не приходится тащить в банк весь interpreter SEQTBL. */ -typedef struct { - int16_t x; /* Char.x оригинала: полу-пиксели */ - uint8_t frame; - uint8_t left; - uint8_t visible; - uint8_t step; -} pv_actor_t; - -/* frame_tbl_cuts[1..18].image; 10 — служебная пустая запись. */ -static const uint8_t pv_princess_image[19] = { - 0, 15, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 9, 10, 11, 12, 13, 14, 16 -}; -static const int8_t pv_princess_dx[19] = { - 0, 0, 0, 0, 0, -1, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const uint8_t pv_princess_parity[19] = { - 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0 -}; - -/* frame_tbl_cuts[48..85].dx. image равен frame - 48. */ -static const int8_t pv_jaffar_dx[38] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 2, 3, 5, 5, 1, 2, 2, 1, 1, 2, 3, 3, 0, 2, 2, 1 -}; -static const uint8_t pv_jaffar_parity[38] = { - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0 -}; -static const uint8_t pv_walk_frame[6] = { 48, 49, 50, 51, 52, 53 }; -static const int8_t pv_walk_dx[6] = { 1, 2, 6, 1, -1, 1 }; -static const uint8_t pv_raise_frame[] = { - 85, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 83, 84, 76 -}; - -static int pv_actor_x(const pv_actor_t *actor, int frame_dx, uint8_t parity) -{ - int x = actor->x; - int logical; - - if (actor->left) x -= frame_dx; - else x += frame_dx; - logical = x * 2 - 116; - /* load_frame_to_obj: нечётная фаза зависит от flags кадра и direction. - * chtab Princess/Jaffar затем проходит calc_screen_x_coord(320/280). */ - if (actor->left == parity) ++logical; - return logical * 8 / 7; -} - -static void pv_walk_step(pv_actor_t *jaffar) -{ - uint8_t step = (uint8_t)(jaffar->step % 6); - int dx = pv_walk_dx[step]; - - if (jaffar->left) jaffar->x -= dx; - else jaffar->x += dx; - jaffar->frame = pv_walk_frame[step]; - ++jaffar->step; -} - -static void pv_princess_step(pv_actor_t *princess, uint16_t tick) -{ - uint16_t pos; - - /* Palert: 2..9, flip, dx(8), 11. Она продолжается и во время входа - * Jaffar, как последовательность Palert оригинала. */ - if (tick >= PV_TURN_START && tick < PV_TURN_START + 72 && - ((tick - PV_TURN_START) & 7) == 0) { - pos = (uint16_t)((tick - PV_TURN_START) >> 3); - if (pos < 8) princess->frame = (uint8_t)(2 + pos); - else { - princess->left = 0; - princess->x += 8; - princess->frame = 11; - } - } - - /* Pstepback: flip, dx(11), 12; затем 13..16 и вечный кадр 17. */ - if (tick >= PV_STEPBACK_START && tick < PV_STEPBACK_START + 42 && - ((tick - PV_STEPBACK_START) % 7) == 0) { - pos = (uint16_t)((tick - PV_STEPBACK_START) / 7); - if (pos == 0) { - princess->left = 1; - princess->x -= 11; - princess->frame = 12; - } else if (pos == 1) { - princess->x -= 1; - princess->frame = 13; - } else if (pos == 2) { - princess->x -= 1; - princess->frame = 14; - } else if (pos == 3) { - princess->x -= 3; - princess->frame = 15; - } else if (pos == 4) { - princess->x -= 1; - princess->frame = 16; - } else { - princess->frame = 17; - } - } - - /* Pslump: один переходный frame 1, затем frame 18 до fade-out. */ - if (tick == PV_SLUMP_START) princess->frame = 1; - else if (tick == PV_SLUMP_START + 7) princess->frame = 18; -} - -static void pv_jaffar_exit_step(pv_actor_t *jaffar) -{ - uint8_t pos = jaffar->step++; - - if (pos < 6) { - jaffar->frame = (uint8_t)(77 + pos); - } else if (pos < 12) { - if (pos == 6) --jaffar->x; - jaffar->frame = 54; - } else if (pos < 22) { - uint8_t frame = (uint8_t)(57 + pos - 12); - - if (frame == 62) jaffar->x -= 2; - else if (frame == 63) ++jaffar->x; - else if (frame == 64) jaffar->x += 3; - else if (frame == 66) ++jaffar->x; - jaffar->frame = frame; - } else if (pos == 22) { - /* Vexit заканчивается flip, dx(16), dx(3), затем Vwalk2. */ - jaffar->left = 0; - jaffar->x += 19; - jaffar->frame = 49; - } else { - /* Vexit прыгает на метку Vwalk2: кадр 49 уже выведен в ветке - * flip, следующий шаг обязан начинаться с dx(6), frame 50. */ - uint8_t walk = (uint8_t)(pos - 23 + 2); - int dx = pv_walk_dx[walk % 6]; - - jaffar->x += dx; - jaffar->frame = pv_walk_frame[walk % 6]; - } -} - -static void pv_jaffar_step(pv_actor_t *jaffar, uint16_t tick) -{ - uint16_t pos; - - if (tick == PV_WALK1_START || tick == PV_WALK2_START) jaffar->step = 0; - if (((tick >= PV_WALK1_START && tick < PV_DIALOG1_START) || - (tick >= PV_WALK2_START && tick < PV_DIALOG2_START)) && - ((tick - ((tick < PV_DIALOG1_START) ? PV_WALK1_START : - PV_WALK2_START)) & 7) == 0) { - jaffar->visible = 1; - pv_walk_step(jaffar); - } - - /* Vstop: dx(1), 55, 56, Vstand. */ - if (tick == PV_DIALOG1_START || tick == PV_DIALOG2_START) { - --jaffar->x; - jaffar->frame = 55; - } else if (tick == PV_DIALOG1_START + 8 || tick == PV_DIALOG2_START + 8) { - jaffar->frame = 56; - } else if ((tick >= PV_DIALOG1_START + 16 && tick < PV_WALK2_START) || - (tick >= PV_DIALOG2_START + 16 && tick < PV_RAISE_START)) { - jaffar->frame = 54; - } - - if (tick >= PV_RAISE_START && tick < PV_EXIT_START && - ((tick - PV_RAISE_START) % 7) == 0) { - pos = (uint16_t)((tick - PV_RAISE_START) / 7); - if (pos < sizeof(pv_raise_frame)) jaffar->frame = pv_raise_frame[pos]; - else jaffar->frame = 76; - } - - if (tick == PV_EXIT_START) jaffar->step = 0; - if (tick >= PV_EXIT_START && ((tick - PV_EXIT_START) % 7) == 0) { - pv_jaffar_exit_step(jaffar); - if (!jaffar->left && jaffar->x > 205) jaffar->visible = 0; - } -} - -static void pv_blit_jaffar(const atlas_t *j0, const atlas_t *j1, - const atlas_t *j2, const pv_actor_t *jaffar) -{ - uint8_t image; - int x; - - if (!jaffar->visible || jaffar->frame < 48 || jaffar->frame > 85) return; - image = (uint8_t)(jaffar->frame - 48); - x = pv_actor_x(jaffar, pv_jaffar_dx[image], pv_jaffar_parity[image]); - if (image < 13) - pv_blit_actor(j0, image, x, 166, (uint8_t)!jaffar->left); - else if (image < 24) - pv_blit_actor(j1, (uint8_t)(image - 13), x, 166, - (uint8_t)!jaffar->left); - else - pv_blit_actor(j2, (uint8_t)(image - 24), x, 166, - (uint8_t)!jaffar->left); -} - -static void pv_blit_princess(const atlas_t *princess, const pv_actor_t *actor) -{ - uint8_t frame = actor->frame; - - if (frame == 0 || frame > 18) return; - pv_blit_actor(princess, pv_princess_image[frame], - pv_actor_x(actor, pv_princess_dx[frame], - pv_princess_parity[frame]), - 166, (uint8_t)!actor->left); -} - -/* Длина логического кадра в тиках 60 Гц — cutscene_frame_time оригинала. - * Сколько это кадров луча, решает пейсинг в intro_pv_animated. */ -static uint8_t pv_seq_period(uint16_t tick) -{ - if (tick < PV_M50_END) return 6; - if (tick < PV_RAISE_START) return 8; - return 7; -} - -/* Рисует кадр и меняет страницу; возвращает, сколько кадров луча на это - * ушло (вспышка живёт на физической шкале и стоит одиннадцать). */ -static uint8_t intro_pv_draw_frame(const atlas_t *princess, const atlas_t *j0, - const atlas_t *j1, const atlas_t *j2, - const atlas_t *hourglass, const atlas_t *torch, - const pv_actor_t *p, const pv_actor_t *j, - const uint8_t *star_phase, - uint8_t torch_left, uint8_t torch_right, - uint8_t sand_frame, uint8_t flash, - uint16_t tick) -{ - uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1); - - gfx_set_draw_page(back); - pv_restore_bg(); /* блоки 1-2: фон, два интервала */ - gfx_set_bank(GFX_BANK_SPRITE); - /* y=116 в princess_room_torch — нижняя строка, не верх спрайта. */ - pv_blit_floor(torch, torch_left, 93, 116); - pv_blit_floor(torch, torch_right, 211, 116); - pv_draw_stars(star_phase); - pv_blit_princess(princess, p); - pv_blit_jaffar(j0, j1, j2, j); - if (tick >= PV_MAGIC_START) { - /* В SDLPoP hourglass_sandflow=0 означает первый кадр потока, - * а -1 — отсутствие песка. Корпус появляется ещё при молнии. */ - pv_blit_floor(hourglass, - (uint8_t)(tick < PV_GLASS_DONE ? 1 : 2), 152, 168); - } - if (tick >= PV_EXIT_START) { - /* hourglass_sandflow=0 оригинал ставит лишь после окончания - * conjuring — когда Jaffar опускает руки и начинает уходить. */ - pv_blit_floor(hourglass, (uint8_t)(8 + sand_frame), 160, 164); - } - /* draw_princess_room_bg() SDLPoP помещает image 2 chtab PV в - * foretable с x=30*8, ybottom=167. В нашем h0 это кадр 0 (res952): - * его надо повторить ПОСЛЕ актёров, иначе Jaffar проходит перед - * правой передней колонной. */ - pv_blit_floor(hourglass, 0, 240, 167); - gfx_wait_vsync(); /* блок 3: актёры и декорации */ - gfx_set_visible_page(back); - if (flash) { - uint8_t pulse; - - /* Молния намеренно живёт на физической, а не cutscene-шкале: - * пять быстрых white/black импульсов, актёры на это время стоят. */ - for (pulse = 0; pulse < 5; pulse++) { - pop_pal_flash_white(1); - gfx_wait_vsync(); - pop_pal_flash_white(0); - gfx_wait_vsync(); - } - return 13; /* три интервала кадра + десять на молнию */ - } - return 3; /* сколько кадровых интервалов съели */ -} - -/* Сцена pv_scene() SDLPoP: ожидание Princess с факелами/звёздами, поворот, - * вход и речь Jaffar, заклинание+молния, часы с песком, уход. Тайминг - * воспроизводится на кадровой шкале; пропуск проверяется каждый кадр. */ -static int intro_pv_animated(void) -{ - atlas_t princess, jaffar0, jaffar1, jaffar2, hourglass, torch; - pv_actor_t princess_actor; - pv_actor_t jaffar_actor; - uint16_t tick; - uint16_t frame_end; - uint16_t render_tick; - uint16_t beam = 0; /* кадров луча потрачено с начала сцены */ - uint8_t period; - uint8_t anim_step = 0; - uint8_t torch_left = 1; - uint8_t torch_right = 6; - uint8_t star_phase[6] = { 1, 1, 1, 1, 1, 1 }; - uint8_t sand_frame = 0; - uint8_t flash_done = 0; - uint8_t faded_in = 0; - uint8_t flash; - intro_skip_t skip; - int result = -1; - - intro_prepare_palette(INTRO_PAL_PV); - /* commit обязан быть до сборки base: gfx_pal_sync обновляет и видимую - * страницу, поэтому там в этот момент должен оставаться только чёрный - * растр из intro_prepare_palette(). */ - intro_commit_palette(); - if (intro_pv_draw_base() != 0) return -1; - - /* b0_* собирается полосами: на время очередной полосы ей тоже нужна - * временная EMM-страница. Поэтому фон готовится до постоянных - * actor-атласов: порядок сохраняет независимость загрузчика полос от - * числа одновременно живущих анимационных ресурсов. */ - /* Шесть атласов сцены — из ОДНОГО открытого архива. */ - { - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t bad; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_A0, &princess) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J0, &jaffar0) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J1, &jaffar1) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_J2, &jaffar2) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_H0, &hourglass) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_T0, &torch) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - - /* Проявление — ПОСЛЕ первого нарисованного кадра (см. ниже в цикле): - * иначе две секунды fade идут по пустой комнате, а принцесса возникает - * уже на свету. */ - /* Актёрские атласы в EMM; дальше по сцене диск трогает только подкачка - * следующей реплики — по одной странице за кадр (pop_music_load_step). - * Полноэкранная accel-копия кадра насосу не мешает: leaf режет DI - * бандами по 16 строк. */ - (void)pop_sfx_start(); - /* ЧЕМ МЕРИТЬ ВРЕМЯ — ЕДИНЫЕ ЧАСЫ: КАДРЫ ЛУЧА. - * - * Была вторая шкала — тики насоса CBL, и выбор между ними делался - * гонкой на старте сцены (одна выборка `pop_snd_tick` через кадр: - * успел ли диск раскрутить звук). Значит от прогона к прогону сцена - * шла то по одним часам, то по другим, и кода реплики приходилась - * каждый раз на другое место картинки (наблюдение пользователя - * 2026-08-28; баг SND-PACE-DEAD). Насос как часы был нужен потому, - * что кадр сцены рисовался ДОЛЬШЕ своего интервала и счёт наших - * ожиданий врал; теперь отрисовка разложена на блоки по кадровому - * интервалу (см. pv_restore_bg), и счёт кадров луча честен. - * - * Осталось учесть единственную работу, которая в интервал не влезала - * сама, — подкачку страницы трека: шаг читает ПОЛСТРАНИЦЫ (~16 мс, - * pop_music_load_step) и оплачивается ровно одним интервалом, как - * любой другой блок кадра. */ - result = 0; - princess_actor.x = 120; - princess_actor.frame = 11; /* Pstand, facing left */ - princess_actor.left = 1; - princess_actor.visible = 1; - princess_actor.step = 0; - jaffar_actor.x = 198; - jaffar_actor.frame = 54; /* Vstand, behind the closed door */ - jaffar_actor.left = 1; - jaffar_actor.visible = 0; - jaffar_actor.step = 0; - tick = 0; - pv_timing_init(); /* шкала под длительности НАШЕГО набора */ - intro_skip_begin(&skip); - while (tick < PV_ANIM_TICKS) { - if (intro_skip_requested(&skip)) { - result = 1; - break; - } - - /* Один проход = один логический кадр cutscene. Внутри проходим все - * его исходные 6/8/7 тиков, снаружи draw_frame держит результат - * четыре физических кадра — единые номинальные 12,5 FPS. */ - flash = 0; - period = pv_seq_period(tick); - frame_end = (uint16_t)(tick + period); - if (frame_end > PV_ANIM_TICKS) frame_end = PV_ANIM_TICKS; - do { - pv_princess_step(&princess_actor, tick); - pv_jaffar_step(&jaffar_actor, tick); - if (tick == PV_MAGIC_START && !flash_done) { - flash = 1; - flash_done = 1; - } - /* Границы шкалы уже стоят там, где оригинал ЖДЁТ окончания - * очередного сэмпла, — заявляем эффект ровно на них. */ - if (tick == PV_WAIT_END) pop_sfx_play(PV_SND_GATE_CLOSING); - else if (tick == PV_GATE_END) pop_sfx_play(PV_SND_DOOR_OPENING); - /* Три реплики сцены. Каждая следующая читается с диска, пока - * звучит предыдущая (второй слот pop_music), поэтому здесь - * остаётся только пуск — мгновенный. */ - else if (tick == PV_MUS_2_START) pop_music_play(); - else if (tick == PV_MUS_3_LOAD) - (void)pop_music_load_begin(POP_MUS_STORY_3); - else if (tick == PV_DIALOG1_START) pop_music_play(); - else if (tick == PV_MUS_4_LOAD) - (void)pop_music_load_begin(POP_MUS_STORY_4); - else if (tick == PV_MUS_4_START) pop_music_play(); - ++tick; - } while (tick < frame_end); - - { - uint8_t star = (uint8_t)(anim_step % 6); - - torch_left = (uint8_t)((torch_left + 1) % 9); - torch_right = (uint8_t)((torch_right + 1) % 9); - star_phase[star] = (uint8_t)((star_phase[star] + 1) % 5); - if (tick > PV_EXIT_START) - sand_frame = (uint8_t)((sand_frame + 1) % 3); - ++anim_step; - } - render_tick = (uint16_t)(tick - 1); - beam += intro_pv_draw_frame(&princess, &jaffar0, &jaffar1, &jaffar2, - &hourglass, &torch, &princess_actor, - &jaffar_actor, star_phase, torch_left, - torch_right, sand_frame, flash, - render_tick); - pop_sfx_tick(); /* как в оригинале — в конце отрисовки кадра */ - - /* ГАРАНТИРОВАННЫЙ ШАГ ПОДКАЧКИ, а не «если останется время». - * - * Раньше страница следующей реплики читалась в ПАУЗЕ кадра, и это - * верно ровно до тех пор, пока пауза есть. В этой сцене её почти - * не было: кадр дорогой, шкала работает по принципу «долг не - * догоняем», и цикл ожидания выходил сразу. Замер в MAME - * 2026-08-26: ОДНА страница за семь секунд, то есть одиннадцать - * страниц m53 не успевали за всю сцену — pop_music_play() на своём - * тике не находил готового трека, и реплики Джафара пропадали - * совсем (memory pv_music_stall_regression). - * - * Поэтому шаг безусловный — и оплачен как обычный блок кадра: он - * читает полстраницы (~16 мс), а следующий gfx_wait_vsync ставит - * нас на край интервала, который мы этим и заняли. */ - if (pop_music_loading()) { - (void)pop_music_load_step(); - gfx_wait_vsync(); - beam++; - } - /* Первый кадр собран под чёрной палитрой — теперь проявляем его - * целиком, вместе с принцессой и факелами. */ - if (!faded_in) { - faded_in = 1; - if (pop_pal_fade_in_skip(INTRO_FADE)) { result = 1; break; } - } - /* ПЕЙСИНГ ПО ОРИГИНАЛЬНОЙ ШКАЛЕ. Кадр сцены — 6/8/7 тиков по - * 1/60 с (pv_seq_period), в кадры луча переводит POP_T60, и цель - * КУМУЛЯТИВНА: нецелые 6,67 и 5,83 не копят ошибку. - * - * ДОЛГ НЕ ДОГОНЯЕМ: если кадр вышел дороже своего бюджета, цикл - * ожидания просто не сработает, но beam уже учёл потраченное — и - * следующая цель считается от той же общей шкалы. Наверстывать - * пропущенное нельзя: события соседних тиков (створка ворот, дверь - * покоев) слиплись бы в один кадр, и один из звуков пропал бы. */ - { - uint16_t target = POP_T60(tick); - - while (beam < target) { gfx_wait_vsync(); beam++; } - } - } - /* CBL НЕ ГЛУШИМ: последняя реплика Джафара звучит поверх смены сцены — - * ровно как в оригинале, где show_title ждёт её окончания уже на - * экране «свадьбы» (seg000:2051). Глушит вызывающий, когда музыка - * действительно доиграла. */ - if (result) { pop_music_free(); pop_sfx_pause(); } - if (!result) (void)pop_pal_fade_out_skip(INTRO_FADE); - - atlas_free(&torch); - atlas_free(&hourglass); - atlas_free(&jaffar2); - atlas_free(&jaffar1); - atlas_free(&jaffar0); - atlas_free(&princess); - return result; -} - -/* hourglass_frame() SDLPoP: четыре границы оставшегося времени выбирают - * один из кадров 6..2. В h0.atl номер кадра совпадает с hourglass_state. */ -static uint8_t pre_hourglass_state(void) -{ - static const uint8_t bound[] = { 6, 17, 33, 65 }; - uint8_t i; - - for (i = 0; i < sizeof(bound); i++) - if (bound[i] > pop_timer_minutes) break; - return (uint8_t)(6 - i); -} - -/* cutscene_2_6()/cutscene_4(): 26 логических кадров по 100 мс. У SDLPoP - * это 6/60 секунды, у Sprinter — 5/50, то есть 130 физических кадров. - * Статична только поза Princess; draw_princess_room_bg оригинала - * каждый логический кадр заново обновляет факелы, звёзды, корпус часов и - * одну из трёх фаз сыплющегося песка. */ -/* Живая комната принцессы БЕЗ актёрской механики: готовая композиция (или - * чистый фон, если picture == PV_ROOM_BARE), поверх неё пламя факелов, - * звёзды в окне и песочные часы заданного состояния. На этом держатся и - * сцены перед уровнями, и экран «время вышло» — разница только в картинке, - * состоянии часов и длине. - * - * hg_state: 0 — часов нет, 7 — время вышло (пустые, без струйки песка). */ -#define PV_ROOM_BARE 0xFF - -static int pre_room_animated(uint8_t picture, uint8_t state, uint8_t frames) -{ - atlas_t hourglass, torch; - uint8_t torch_left = 1, torch_right = 6, sand = 0, frame; - uint8_t star_phase[6] = { 1, 1, 1, 1, 1, 1 }; - intro_skip_t skip; - int result = -1; - - intro_prepare_palette(INTRO_PAL_PV); - intro_commit_palette(); - /* Обе shadow-страницы содержат чистую статическую сцену. Динамика ниже - * рисуется GFX_BANK_SPRITE и потому не оседает в этом источнике. */ - if (picture == PV_ROOM_BARE) { - if (intro_pv_draw_base() != 0) return -1; - } else if (intro_draw_page(picture, 0) != 0 || - intro_draw_page(picture, 1) != 0) { - return -1; - } - { - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - int8_t bad; - - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_H0, &hourglass) != 0); - if (!bad) bad = (int8_t)(pv_atlas(&arc, tbl, ARC_PV_T0, &torch) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - - pop_screen_present(1); - result = 0; - intro_skip_begin(&skip); - for (frame = 0; frame < frames; frame++) { - uint8_t back, hold, star; - - if (intro_skip_requested(&skip)) { result = 1; break; } - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - pv_restore_bg(); /* блоки 1-2: фон, два интервала */ - gfx_set_bank(GFX_BANK_SPRITE); - pv_blit_floor(&torch, torch_left, 93, 116); - pv_blit_floor(&torch, torch_right, 211, 116); - pv_draw_stars(star_phase); - if (state) { - pv_blit_floor(&hourglass, state, 152, 168); - /* Струйка песка есть, пока часы идут: при state 7 время уже - * вышло (draw_hourglass, sandflow = -1). */ - if (state < 7) - pv_blit_floor(&hourglass, (uint8_t)(8 + sand), 160, 164); - } - pv_blit_floor(&hourglass, 0, 240, 167); /* передняя колонна */ - gfx_wait_vsync(); /* блок 3: живой фон */ - gfx_set_visible_page(back); - /* Три интервала уже потрачены на блоки отрисовки — добираем до - * пяти (5/50 с = кадр катсцены оригинала). */ - for (hold = 3; hold < 5; hold++) gfx_wait_vsync(); - - /* Проявляем ПОСЛЕ первого кадра: иначе две секунды fade идут по - * пустой комнате, а часы и пламя возникают уже на свету. */ - if (frame == 0 && pop_pal_fade_in_skip(INTRO_FADE)) { result = 1; break; } - torch_left = (uint8_t)((torch_left + 1) % 9); - torch_right = (uint8_t)((torch_right + 1) % 9); - sand = (uint8_t)((sand + 1) % 3); - star = (uint8_t)(frame % 6); - star_phase[star] = (uint8_t)((star_phase[star] + 1) % 5); - } - if (!result) pop_pal_fade_out(INTRO_FADE); - - atlas_free(&torch); - atlas_free(&hourglass); - return result; -} - -/* SDLPoP transition_ltr(): подготовленная story-страница копируется на - * видимый title узкими вертикальными полосами слева направо. У оригинала - * 2px/120 FPS; здесь 4px/60 FPS даёт ту же длительность (~1.3 с), не - * удваивая число полных копий 320x256 в ограниченном bank 9. */ -/* Собрать «In the absence» в СКРЫТУЮ страницу. Отделено от показа: между - * ними успевает загрузиться трек, а на экране всё это время держится - * последний кадр титров — ровно как у оригинала, который рисует историю в - * offscreen и лишь потом пускает transition_ltr. */ -static int intro_story_prepare(void) -{ - uint8_t target = (uint8_t)(gfx_get_visible_page() ^ 1); - - return intro_draw_page(INTRO_STORY_ABSENCE, target); -} - -/* Полосовой показ подготовленной страницы живёт в pop_ui: тем же приёмом - * появляются титульная картинка финала и таблица рекордов. */ - -static void intro_flash(uint16_t ticks) -{ - uint8_t page; - - page = pop_screen_begin(); - pop_screen_fill(WHITE); - pop_screen_present(page); - while (ticks--) gfx_wait_vsync(); - /* Вспышка ничего не меняет в сценарии: вернуть ту же собранную стадию. */ - intro_draw(intro_scene); -} - -static void intro_restore_game_palette(void) -{ - /* Обе страницы — именно чёрный растр до gfx_pal_fload/sync. Иначе - * синхронизация palette 1 способна на один кадр высветить credits перед - * переходом в demo. */ - intro_black_pages(); - pop_pal_game_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); -} - -/* ================= ПЕРСОНАЖИ КАТСЦЕН ================================= * - * - * Порт cutscene_8 / cutscene_9 (seg001:034D/03B7) и end_sequence_anim - * (seg001:041C). Все три идут через load_intro(1, …): фон — комната - * принцессы (та же b0_*, что у intro), а поверх играют ДВА персонажа. - * - * Движок общий с игрой, и это главное: последовательности крутит наш - * play_seq (pop_kid_play/pop_guard_play), кадры принцессы берутся из - * таблицы КАТСЦЕН (kid.ani, KID_BIN_CFRAMES_OFF), мышь и Кид — из - * таблицы Кида, как в оригинале (frame_table_kid общая для kid и mouse). - * Отличается только ОТРИСОВКА: спрайты принцессы лежат в PV-атласах, а - * Кид/мышь — в игровых kid-атласах, поэтому в pv.pal под них отведена - * своя палитровая строка 0x70. - * - * Слоты — как в оригинале: Kid-окно занимает мышь (или Кид в финале), - * Guard-окно — принцесса. - */ - -/* Набор PV2 (res901..930) не влезает в одну EMM: image 0..16 в a1, - * 17..29 в a2. Номер кадра при этом остаётся исходным image-id. */ -#define CUT_PV2_SPLIT 17 -/* Один логический кадр катсцены = 5 vsync, как у остальных PV-сцен: у - * оригинала `cutscene_frame_time = 6` тиков по 1/60 с (reset_cutscene, - * seg001:527, и его зовёт load_intro прямо перед сценой) = 100 мс, у нас - * 5 кадров луча по 50 Гц = те же 100 мс. - * - * РАСКЛАДКА ПО ИНТЕРВАЛАМ (иначе отрисовка прибавлялась к делителю, а не - * жила внутри него — см. pv_restore_bg): фон половинами 1-2, актёры и - * декорации 3, служебный блок (звук/подкачка музыки) 4-5. */ -#define CUT_FRAME_VSYNC 5 - -static atlas_t cut_pv1, cut_pv2a, cut_pv2b, cut_hg, cut_torch; -static uint8_t cut_atlases; /* сколько успели загрузить — столько и вернём */ -/* Детектор фронта живёт на ВСЮ сцену: она склеена из нескольких cut_run, и - * взводить его заново на каждом отрезке значило бы ловить одно удержание - * несколько раз. */ -static intro_skip_t cut_skip; -/* Фазы «живого» фона: пламя двух факелов, песок и мерцание звёзд. Счётчики - * общие на всю сцену — она склеена из нескольких cut_run. */ -static uint8_t cut_torch_l, cut_torch_r, cut_sand, cut_star_phase[6]; -static uint8_t cut_hg_state; - -static void cut_free(void) -{ - if (cut_atlases > 4) atlas_free(&cut_torch); - if (cut_atlases > 3) atlas_free(&cut_hg); - if (cut_atlases > 2) atlas_free(&cut_pv2b); - if (cut_atlases > 1) atlas_free(&cut_pv2a); - if (cut_atlases > 0) atlas_free(&cut_pv1); - cut_atlases = 0; -} - -static int cut_load(void) -{ - uint8_t tbl[ARC_PV_COUNT * POP_ARC_REC]; - pop_arc_t arc; - - cut_atlases = 0; - if (pop_arc_open_id(&arc, POP_ARC_PV, tbl, ARC_PV_COUNT) < 0) return -1; - if (pv_atlas(&arc, tbl, ARC_PV_A0, &cut_pv1) != 0) { - pop_arc_close(&arc); return -1; - } - cut_atlases = 1; - if (pv_atlas(&arc, tbl, ARC_PV_A1, &cut_pv2a) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 2; - if (pv_atlas(&arc, tbl, ARC_PV_A2, &cut_pv2b) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 3; - /* Комната принцессы живёт и в катсценах: пламя факелов, звёзды в окне, - * песок в часах — и ПЕРЕДНЯЯ КОЛОННА, которая по оригиналу закрывает - * персонажей (draw_princess_room_bg + foretable). */ - if (pv_atlas(&arc, tbl, ARC_PV_H0, &cut_hg) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 4; - if (pv_atlas(&arc, tbl, ARC_PV_T0, &cut_torch) != 0) { - pop_arc_close(&arc); cut_free(); return -1; - } - cut_atlases = 5; - pop_arc_close(&arc); - return 0; -} - -/* Экранная X кадра: та же математика, что у актёров intro — logical - * координата (x*2 − 116) с нечётной фазой по flags кадра, затем - * calc_screen_x_coord (×8/7). */ -static int cut_screen_x(const pop_char_t *ch, const kframe *fr) -{ - int x = ch->x; - int logical; - uint8_t left = (uint8_t)(ch->direction < 0); - - if (left) x -= fr->dx; - else x += fr->dx; - logical = x * 2 - 116; - if (left == (uint8_t)((fr->flags & 0x80) != 0)) ++logical; - return logical * 8 / 7; -} - -/* Принцесса: набор выбирает поле sword кадра (>>6: 1 = PV1 res800, - * 2 = PV2 res900) — ровно как chtab_base + (cur_frame.sword >> 6) - * в seg008:1759. */ -static void cut_blit_princess(const pop_char_t *ch, const kframe *fr) -{ - const atlas_t *at; - uint8_t idx; - - if (fr->image == 255 || cut_atlases < 3) return; - if ((uint8_t)(fr->sword >> 6) >= 2) { - if (fr->image < CUT_PV2_SPLIT) { at = &cut_pv2a; idx = fr->image; } - else { at = &cut_pv2b; idx = (uint8_t)(fr->image - CUT_PV2_SPLIT); } - } else { - at = &cut_pv1; idx = fr->image; - } - pv_blit_actor(at, idx, cut_screen_x(ch, fr), - (int)ch->y + fr->dy, (uint8_t)(ch->direction >= 0)); -} - -/* Кид и мышь — спрайты chtab_2 из игровых атласов (kidp[]). Атласы Кида - * хранятся column-major (ради бесплатного флипа), поэтому блит колоночный. */ -static void cut_blit_kid(const pop_char_t *ch, const kframe *fr) -{ - const uint8_t *img; - uint8_t pg, idx, flip; - int x; - - if (fr->image == 255) return; - pg = (uint8_t)(fr->image >> 3); - idx = (uint8_t)(fr->image & 7); - if (pg >= kid_npages) return; - flip = (uint8_t)(ch->direction >= 0); - x = cut_screen_x(ch, fr); - gfx_w0_map(kidp[pg].page); - img = (const uint8_t *)atlas_image(&kidp[pg], idx); - if (flip) x -= img[0]; - gfx_blit_cols(x, POP_YOFF + (int)ch->y + fr->dy - img[2] + 1, img, flip); - gfx_w0_unmap(); -} - -/* Сменить последовательность персонажа в его окне (seqtbl_offset_kid_char / - * seqtbl_offset_shad_char оригинала). */ -static void cut_kid_seq(uint8_t seq) -{ - pop_loadkid(); pop_char_set_seq(seq); pop_savekid(); -} - -static void cut_shad_seq(uint8_t seq) -{ - pop_loadshad(); pop_char_set_seq(seq); pop_saveshad(); -} - -/* Поставить персонажа так, как это делают init_* оригинала: позиция, - * направление и стартовая последовательность, затем первый play_seq. */ -static void cut_kid_init(uint8_t charid, uint8_t x, uint8_t y, uint8_t seq) -{ - Kid.charid = charid; - Kid.x = x; - Kid.y = y; - Kid.direction = -1; /* dir_FF_left */ - Kid.alive = -1; - Kid.frame = 0; - Kid.fall_x = Kid.fall_y = 0; - Kid.repeat = 0; - cut_kid_seq(seq); - pop_kid_play(); -} - -static void cut_shad_init(uint8_t x, uint8_t y, uint8_t seq) -{ - Guard.charid = CHARID_5_PRINCESS; - Guard.x = x; - Guard.y = y; - Guard.direction = -1; - Guard.alive = -1; - Guard.frame = 0; - Guard.fall_x = Guard.fall_y = 0; - Guard.repeat = 0; - cut_shad_seq(seq); - pop_guard_play(); -} - -/* proc_cutscene_frame(n): прокрутить n логических кадров, каждый — шаг - * последовательности обоих персонажей плюс отрисовка. Возврат 1 — игрок - * прервал сцену (любое НОВОЕ нажатие). */ -static uint8_t cut_run(uint16_t frames, uint8_t kid_visible) -{ - uint16_t i; - uint8_t hold; - - for (i = 0; i < frames; i++) { - uint8_t back; - kframe kid_fr, pr_fr; - - if (intro_skip_requested(&cut_skip)) return 1; - - /* Кадр забираем СРАЗУ после play каждого слота. load_frame кладёт - * его в кэш ПО charid активного персонажа: у Кида это kid_frame, у - * всех прочих — общий pop_gframe. В Kid-окне здесь сидит МЫШЬ - * (charid 24), то есть её кадр уходит в pop_gframe и затирается - * следом кадром принцессы, а kid_frame держит позу игрового Кида. - * Читать кэши в конце кадра значило рисовать мышь спрайтом Кида и - * терять принцессу — ровно это и было видно в сценах 8/9. */ - pop_kid_play(); /* мышь либо Кид */ - kid_fr = (Kid.charid == CHARID_0_KID) ? kid_frame : pop_gframe; - pop_guard_play(); /* принцесса */ - pr_fr = pop_gframe; - - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - /* Чистый фон обеих страниц лежит в shadow-копии; персонажи рисуются - * банком спрайтов и потому в неё не оседают. Двумя блоками по - * кадровому интервалу — см. pv_restore_bg. */ - pv_restore_bg(); /* блоки 1-2 */ - gfx_set_bank(GFX_BANK_SPRITE); - pv_blit_floor(&cut_torch, cut_torch_l, 93, 116); - pv_blit_floor(&cut_torch, cut_torch_r, 211, 116); - pv_draw_stars(cut_star_phase); - /* hourglass_state == 0 — часов в комнате нет вовсе (reset_cutscene - * SDLPoP ставит state=0 и sandflow=-1). Так идёт финальная встреча - * с принцессой: время уже не считается, это победа. - * state 7 — время ВЫШЛО: часы стоят пустыми, и струйки песка в них - * тоже нет (draw_hourglass: `if (hourglass_state >= 7) return;`). */ - if (cut_hg_state) { - pv_blit_floor(&cut_hg, cut_hg_state, 152, 168); - if (cut_hg_state < 7) - pv_blit_floor(&cut_hg, (uint8_t)(8 + cut_sand), 160, 164); - } - cut_blit_princess(&Guard, &pr_fr); - if (kid_visible) cut_blit_kid(&Kid, &kid_fr); - /* ПОСЛЕ персонажей: передняя колонна — передний слой комнаты, она - * обязана закрывать и принцессу, и мышь (иначе мышь «просвечивает» - * сквозь неё — поймано пользователем 2026-08-25). */ - pv_blit_floor(&cut_hg, 0, 240, 167); - gfx_set_bank(GFX_BANK_NORMAL); - gfx_wait_vsync(); /* блок 3: актёры и декорации */ - gfx_set_visible_page(back); - - /* Блок 4 — служебный, и он НЕ добавляется к кадру, а живёт внутри - * оставшихся интервалов: подкачка страницы трека стоит ~33 мс, то - * есть меньше двух интервалов, которые всё равно надо переждать. - * Порядок как в сцене с Джафаром: шаг подкачки — безусловный (см. - * memory pv_music_stall_regression). */ - pop_sfx_tick(); - pop_music_service(); /* «встреча с принцессой» — трек, а не эффект */ - for (hold = 3; hold < CUT_FRAME_VSYNC; hold++) gfx_wait_vsync(); - cut_torch_l = (uint8_t)((cut_torch_l + 1) % 9); - cut_torch_r = (uint8_t)((cut_torch_r + 1) % 9); - cut_sand = (uint8_t)((cut_sand + 1) % 3); - { - uint8_t star = (uint8_t)(i % 6); - cut_star_phase[star] = (uint8_t)((cut_star_phase[star] + 1) % 5); - } - } - return 0; -} - -/* Общая обвязка всех трёх сцен: чистый фон комнаты принцессы в обе - * страницы, PV-палитра, актёрские атласы. hg_state — кадр песочных часов - * (0 = часов нет). Возврат -1 — ресурсов нет - * (неполный HDD), и caller откатывается на статический сценарий. */ -static int cut_begin(uint8_t hg_state) -{ - uint8_t i; - - intro_skip_begin(&cut_skip); - cut_torch_l = 1; cut_torch_r = 6; cut_sand = 0; - for (i = 0; i < 6; i++) cut_star_phase[i] = 1; - cut_hg_state = hg_state; - intro_prepare_palette(INTRO_PAL_PV); - intro_commit_palette(); - if (intro_pv_draw_base() != 0) return -1; - if (cut_load() != 0) return -1; - /* Атласы сцены прочитаны — можно открывать вывод. Без этого сцена шла - * молча: pop_ending_show глушит CBL первым действием, а включить его - * обратно было некому, и «arrived to princess» (26) не звучал вовсе. */ - (void)pop_sfx_start(); - return 0; -} - -/* Прервали ли последнюю живую сцену клавишей — нужно вызывающему: по - * пропуску музыку обрываем, а не дослушиваем. */ -static uint8_t cut_aborted; - -static void cut_end(uint8_t aborted) -{ - cut_aborted = aborted; - if (!aborted && pop_pal_fade_out_skip(INTRO_FADE)) cut_aborted = 1; - cut_free(); -} - -/* cutscene_8 (seg001:034D): мышь сидит рядом с принцессой, встаёт и - * убегает; принцесса поднимается ей вслед. */ -static int cut_scene_8(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* init_mouse_cu8 (seg001:0212) = init_mouse_go + x=144 + seq_106. */ - cut_kid_init(CHARID_24_MOUSE, 144, 167, 106); - /* princess_crouching (seg001:024D): сидит и гладит мышь. */ - cut_shad_init(131, 169, 110); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 1); - if (!aborted) aborted = pop_pal_fade_in_skip(INTRO_FADE); - if (!aborted) aborted = cut_run(19, 1); - if (!aborted) { - cut_kid_seq(107); /* мышь встаёт и уходит */ - aborted = cut_run(20, 1); - } - if (!aborted) { - cut_shad_seq(111); /* принцесса встаёт */ - aborted = cut_run(20, 1); - } - cut_end(aborted); - return 0; -} - -/* cutscene_9 (seg001:03B7): принцесса стоит, мышь прибегает, принцесса - * приседает к ней. */ -static int cut_scene_9(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* princess_stand (seg001:026A) — поза PV1, лицом вправо. */ - cut_shad_init(144, 169, 94); - Guard.direction = 0; - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 0); /* мышь ещё за кадром */ - if (!aborted) aborted = pop_pal_fade_in_skip(INTRO_FADE); - /* init_mouse_go (seg001:022A): мышь вбегает справа. */ - cut_kid_init(CHARID_24_MOUSE, 199, 167, 105); - if (!aborted) aborted = cut_run(5, 1); - if (!aborted) { - cut_shad_seq(112); /* принцесса приседает */ - aborted = cut_run(9, 1); - } - if (!aborted) { - cut_kid_seq(114); /* мышь останавливается */ - aborted = cut_run(58, 1); - } - cut_end(aborted); - return 0; -} - -/* cutscene_12 (seg001:0525), ветка «времени мало»: принцесса стоит правее - * обычного, через два кадра оборачивается — и всё. Живой её делает та же - * машинка, что сцены 8/9: часы здесь обязаны показывать ОСТАВШЕЕСЯ время, - * а не запечённую в композицию картинку. */ -static int cut_scene_12_short(void) -{ - uint8_t aborted; - - if (cut_begin(pre_hourglass_state()) != 0) return -1; - /* init_princess_x156 (seg001:0230) = init_princess + x = 156. */ - cut_shad_init(156, 166, 94); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 0); - if (!aborted) aborted = pop_pal_fade_in_skip(INTRO_FADE); - if (!aborted) aborted = cut_run(1, 0); - if (!aborted) { - cut_shad_seq(98); /* princess turn around [PV1] */ - aborted = cut_run(24, 0); - } - cut_end(aborted); - return 0; -} - -/* end_sequence_anim (seg001:041C): Кид вбегает к принцессе, она - * поворачивается и обнимает его; следом появляется мышь. */ -static int cut_ending(void) -{ - uint8_t aborted; - - /* end_sequence_anim (seg001:041C) НЕ трогает hourglass_state, а - * reset_cutscene перед сценой обнулил его: песочных часов в финале нет. - * Это и логично — уровень пройден, время больше не идёт. */ - if (cut_begin(0) != 0) return -1; - /* init_ending_princess (seg001:0251) + init_ending_kid (seg001:0287). */ - cut_shad_init(136, 164, 109); - cut_kid_init(CHARID_0_KID, 198, 164, 1); - /* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это - * время на экране была бы пустая комната: персонажи появляются только с - * первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда - * картинка проявляется целиком, вместе с актёрами. */ - aborted = cut_run(1, 1); - if (!aborted) aborted = pop_pal_fade_in_skip(INTRO_FADE); - pop_sfx_play(26); /* «arrived to princess» */ - if (!aborted) aborted = cut_run(7, 1); - if (!aborted) { - cut_shad_seq(108); /* поворот и объятие */ - aborted = cut_run(5, 1); - } - if (!aborted) { - cut_kid_seq(13); /* Кид останавливается */ - aborted = cut_run(2, 1); - } - /* Kid.frame = 0 (seg001:0348): дальше Кида не видно — он в объятиях, - * и рисуется только принцесса. */ - if (!aborted) aborted = cut_run(39, 0); - if (!aborted) { - /* init_mouse_1 (seg001:02D5): мышь приходит к паре. */ - cut_kid_init(CHARID_24_MOUSE, 197, 164, 105); - aborted = cut_run(9, 1); - } - if (!aborted) { - cut_kid_seq(101); /* мышь встаёт на задние лапы */ - aborted = cut_run(41, 1); - } - cut_end(aborted); - return 0; -} - -static uint8_t intro_run(const pop_cs_cmd_t *script) -{ - pop_cutscene_t cs; - intro_skip_t skip; - uint16_t arg; - uint8_t aborted = 0; - - pop_cutscene_begin(&cs, script); - intro_skip_begin(&skip); - for (;;) { - pop_cs_event_t ev; - - if (intro_skip_requested(&skip)) { - pop_cutscene_abort(&cs); - aborted = 1; - break; - } - ev = pop_cutscene_tick(&cs, &arg); - if (ev == POP_CS_EVENT_END) break; - if (ev == POP_CS_EVENT_PALETTE) intro_prepare_palette((uint8_t)arg); - else if (ev == POP_CS_EVENT_SHOW) { - intro_scene = (uint8_t)arg; - if ((intro_pal_pending ? intro_draw_new_palette(intro_scene) : - intro_draw(intro_scene)) != 0) { - pop_cutscene_abort(&cs); - aborted = 1; - break; - } - } else if (ev == POP_CS_EVENT_FADE_IN || ev == POP_CS_EVENT_FADE_OUT) { - /* Fade — 2,13 с, и на стыке экранов их два. Пока он был глухим, - * эти секунды не пропускались ничем: пропуск работал внутри - * сценария, но не между его шагами. Прерывание здесь означает - * то же, что и в самом сценарии — уйти из заставки. */ - uint8_t cut = (ev == POP_CS_EVENT_FADE_IN) - ? pop_pal_fade_in_skip(INTRO_FADE) - : pop_pal_fade_out_skip(INTRO_FADE); - - if (cut) { pop_cutscene_abort(&cs); aborted = 1; break; } - } - else if (ev == POP_CS_EVENT_FLASH) intro_flash(arg); - pop_music_service(); /* подкачка потокового трека (финал) */ - gfx_wait_vsync(); - } - - return aborted; -} - - -/* Ожидание кадров у шагов, которые показываются НЕ сценарием, а напрямую. - * Оно не глушит поток: победная тема играет кольцом страниц, и дочитывать - * её надо каждый кадр, иначе насос догонит загрузчика. Прерывается новым - * нажатием (детектор фронта); 1 — прервано. */ -static uint8_t intro_wait_frames(uint16_t frames) -{ - intro_skip_t skip; - - intro_skip_begin(&skip); - while (frames--) { - if (intro_skip_requested(&skip)) return 1; - pop_music_service(); - pop_wait_edge(); - } - return 0; -} - -/* Титры проявляются полосами, как и всё остальное в show_title() - * (draw_full_image(STORY_CREDITS) + transition_ltr, seg000:2055). */ -static uint8_t intro_credits_ltr(void) -{ - uint8_t page = pop_screen_begin(); - - if (intro_draw_page(INTRO_STORY_CREDITS, page) == 0 && - pop_screen_present_ltr()) - return 1; - return intro_wait_frames(POP_T60(0x168)); -} - -uint8_t pop_intro_show(void) __banked -{ - int pv_result; - - /* МУЗЫКА ПРИХОДИТ СЮДА ЗВУЧАЩЕЙ. На титрах играет тема (m54), и - * обрывать её нельзя: у оригинала заставка и история — одна звуковая - * дорожка, где следующая реплика начинается там, где кончилась - * предыдущая. Поэтому здесь ни pop_sfx_pause, ни pop_sfx_start: - * CBL уже открыт титрами. */ - if (intro_story_prepare() != 0) { - /* Ошибка файла не должна оставить старый title без выхода: менее - * эффектный, но корректный fallback остаётся обычным fade-in. */ - pop_music_free(); - pop_sfx_pause(); - intro_prepare_palette(INTRO_PAL_STORY); - if (intro_draw_new_palette(INTRO_STORY_ABSENCE) == 0) - (void)pop_pal_fade_in_skip(INTRO_FADE); - } else { - /* Картинка собрана и ждёт в скрытой странице; читаем следующую - * реплику во ВТОРОЙ слот — тема титров при этом продолжает - * звучать из первого. */ - (void)pop_music_load(POP_MUS_STORY_1); - /* Тему дослушиваем до конца, как seg000:2027, и только потом - * пускаем историю: пуск и полосовой переход идут встык. */ - { - intro_skip_t head; - intro_skip_begin(&head); - while (pop_music_busy() && !intro_skip_requested(&head)) - pop_wait_edge(); - } - (void)pop_sfx_start(); /* идемпотентно: титры его уже открыли */ - pop_music_play(); - /* Прервали проявление — это не «показать картинку разом», а «хватит - * заставки»: маршрут тот же, что и у пропуска внутри сценария. */ - if (pop_screen_present_ltr()) { - pop_music_free(); - pop_sfx_pause(); - return 1; - } - } - if (intro_run(intro_before_pv)) { - /* Пропуск по клавише. ГЛУШИМ ВЫВОД: сразу за возвратом пойдёт - * загрузка уровня, а при открытом CBL ESTEX уходит в диск дольше, - * чем играет буфер, и железо начинает крутить свои 256 байт по - * кругу — на слух ровно тот скрежет, что ловится нажатием клавиши - * на первом экране истории. */ - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - /* ДОИГРАТЬ ПОД ЧЁРНЫМ ЭКРАНОМ. Оригинал не обрывает story-трек на - * переходе к PV: fade уводит картинку, а музыка продолжается, и лишь - * когда она смолкла, начинается сцена с принцессой (у SDLPoP это - * общий приём — `while (check_sound_playing())`, seg000:2027). */ - { - intro_skip_t tail; - intro_skip_begin(&tail); - while (pop_music_busy() && !intro_skip_requested(&tail)) pop_wait_edge(); - } - /* Первая реплика PV читается ЗДЕСЬ, под чёрным экраном и в тишине: - * дальше внутри сцены остаётся только пуск, а следующие две реплики - * подкачиваются по странице за кадр. */ - /* Глушение снято 2026-08-28: массовое чтение страниц насос не морит - * (замер на загрузке уровня — ни одной пропущенной порции), а трек - * титров может и должен доигрывать. */ - (void)pop_music_load(POP_MUS_STORY_2); - pv_result = intro_pv_animated(); - if (pv_result > 0) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - if (pv_result < 0 && intro_run(intro_pv_fallback)) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - /* «Свадьба» показывается ПОВЕРХ звучащей реплики Джафара: она началась - * в PV и переживает и fade-out сцены, и fade-in этого экрана. */ - if (intro_run(intro_marry)) { - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); - return 1; - } - { - intro_skip_t marry; - intro_skip_begin(&marry); - while (pop_music_busy() && !intro_skip_requested(&marry)) - pop_wait_edge(); - } - pop_music_free(); - pop_sfx_pause(); - /* ТИТУЛЬНЫЙ ЭКРАН МЕЖДУ «СВАДЬБОЙ» И ТИТРАМИ. show_title() рисует - * TITLE_MAIN + логотип + Jordan Mechner и проявляет их полосами - * (seg000:2045), и только через 0x78 тиков показывает credits — тоже - * полосами. Раньше обе картинки возникали мгновенно. */ - { - int shown = pop_title_logo_ltr(); /* 1 — прервано, -1 — нет архива */ - - if (shown == 1 || (shown == 0 && intro_wait_frames(POP_T60(0x78)))) { - intro_restore_game_palette(); - return 1; - } - } - if (intro_credits_ltr()) { - intro_restore_game_palette(); - return 1; - } - /* ТАБЛИЦА РЕКОРДОВ между credits и attract-demo — ровно там же, где её - * показывает show_title(): та же story-палитра, тот же полосовой - * переход, никакого fade (seg000:2060). Пустой таблицы это не - * касается: она просто не показывается. */ - if (pop_hof_show_title()) { - intro_restore_game_palette(); - return 1; - } - if (intro_run(intro_tail)) { - intro_restore_game_palette(); - return 1; - } - /* Abort возможен в любой WAIT и не оставляет загруженных атласов: каждая - * полоса освобождена внутри intro_draw. */ - intro_restore_game_palette(); - return 0; -} - -/* Хвост любой сцены перед уровнем. - * - * ДОСЛУШИВАЕМ ПОД ЧЁРНЫМ ЭКРАНОМ, а не «пусть играет в игре». Оригинал - * так и делает: следующий load_intro начинается с ожидания тишины - * (seg001:681), и к отрисовке уровня трек уже смолк. Мы сначала отдали - * музыку в игру — и она там спотыкалась: загрузка уровня (ESTEX + сборка - * комнаты) не даёт насосу долить блок вовремя. Ждать здесь дешевле, чем - * слушать заикание. - * - * Пропуск сцены обрывает и музыку: игрок нажал клавишу, чтобы идти - * дальше, а не чтобы досидеть до конца трека. */ -static void pre_cut_finish(uint8_t aborted) -{ - /* ТРЕК ПЕРЕЖИВАЕТ СЦЕНУ — как в оригинале. load_intro (seg001:690) - * ничего не ждёт: гасит экран и возвращает управление, а звук играет - * дальше поверх загрузки уровня и первых секунд игры. Мы вместо этого - * ДОСИЖИВАЛИ трек на чёрном экране (27 — 10,7 с против 2,6 с картинки), - * то есть дарили игроку восемь секунд пустого экрана, и только потом - * глушили. ЗАМЕР 2026-08-28: снято вместе с глушением на загрузке - * уровня; если загрузка не укладывается в дедлайн насоса (251 000 - * тактов), вернуть оба места разом. - * - * Пропуск сцены по-прежнему обрывает и музыку: игрок нажал клавишу, - * чтобы идти дальше, а не чтобы дослушать. */ - if (aborted) { - pop_music_free(); - pop_sfx_pause(); - } - intro_restore_game_palette(); -} - -void pop_pre_cutscene_show(pop_pre_cutscene_t scene) __banked -{ - const pop_cs_cmd_t *script = 0; - - /* Глушение перед чтением трека снято 2026-08-28 (см. замер насоса). */ - /* МУЗЫКА ПЕРЕЖИВАЕТ СЦЕНУ. Треки заставок между уровнями длиннее самих - * сцен (27 — 10,7 с против 2,6 с картинки), и оригинал их не обрывает: - * load_intro просто гасит экран и возвращает управление, а звук - * продолжает играть уже поверх загрузки уровня и первых секунд игры - * (seg001:690). Мы глушили CBL на выходе — музыка обрывалась на - * полуслове. Теперь не глушим: доиграет сама, а следующая загрузка - * трека всё равно освободит слот. - * - * Какой именно трек — как в оригинале: 27 для 2/4/6/12 (seg001:401), - * 35 для 8/9 (seg001:298), 40 для короткой «времени мало» (seg001:388). - * Экран в этот момент чёрный, поэтому читаем трек целиком: пауза на - * диск здесь никому не мешает. */ - { - uint8_t track = 27; - - if (scene == POP_PRE_8 || scene == POP_PRE_9) track = 35; - else if (scene == POP_PRE_12_SHORT) track = 40; - if (pop_music_load(track) == 0) { - (void)pop_sfx_start(); - pop_music_play(); - } - } - if (scene == POP_PRE_2_6 || scene == POP_PRE_4 || scene == POP_PRE_12) { - int r = pre_room_animated((uint8_t)(scene == POP_PRE_4 ? INTRO_PV_LYING - : INTRO_PV_STAND), - pre_hourglass_state(), 26); - if (r >= 0) { - pre_cut_finish((uint8_t)(r > 0)); - return; - } - /* Неполный HDD: статический fallback сохраняет корректные 130 тиков. */ - } - if (scene == POP_PRE_12_SHORT && cut_scene_12_short() == 0) { - pre_cut_finish(cut_aborted); - return; - } - /* Сцены 8/9 — живая анимация мыши и принцессы (cutscene_8/cutscene_9). */ - if (scene == POP_PRE_8 || scene == POP_PRE_9) { - int done = (scene == POP_PRE_8) ? cut_scene_8() : cut_scene_9(); - if (done == 0) { - pre_cut_finish(cut_aborted); - return; - } - } - if (scene == POP_PRE_2_6 || scene == POP_PRE_12) script = pre_2_6; - else if (scene == POP_PRE_4) script = pre_4; - else if (scene == POP_PRE_8) script = pre_8; - else if (scene == POP_PRE_9) script = pre_9; - else if (scene == POP_PRE_12_SHORT) script = pre_12_short; - if (!script) { - pre_cut_finish(1); - return; - } - - pre_cut_finish(intro_run(script)); -} - -/* Фон таблицы рекордов — та же рамка story плюс логотип PRINCE OF PERSIA - * (STORY_FRAME + HOF_POP оригинала). Рисуем в ЗАДАННУЮ страницу и её не - * показываем: палитрой, строками и переходом распоряжается pop_hof. */ -int pop_intro_hof_bg(uint8_t page) __banked -{ - return intro_draw_page(INTRO_STORY_HOF, page); -} - -void pop_time_expired_show(void) __banked -{ - /* Глушение снято 2026-08-28 (см. замер насоса). */ - /* time_expired (seg001:04D3) начинается с play_sound(sound_36). */ - if (pop_music_load(36) == 0) { - (void)pop_sfx_start(); - pop_music_play(); - } - /* ПРИНЦЕССЫ ЗДЕСЬ НЕТ. Оригинал не зовёт ни одного init_*: экран — - * это пустая комната и ОСТАНОВИВШИЕСЯ часы (state 7, струйки песка - * нет). Мы показывали готовую композицию с принцессой и полными - * часами — то есть ровно противоположное по смыслу. - * Длина — 2 + 100 кадров cutscene, как в оригинале. */ - if (pre_room_animated(PV_ROOM_BARE, 7, 102) < 0) - intro_run(time_expired_script); /* нет ресурсов — старый путь */ - /* Оригинал ждёт КОНЦА ТРЕКА уже под чёрным экраном (seg001:374). */ - { - intro_skip_t tail; - - intro_skip_begin(&tail); - while (pop_music_busy() && !intro_skip_requested(&tail)) - pop_wait_edge(); - } - pop_music_free(); - pop_sfx_pause(); - intro_restore_game_palette(); -} - - -void pop_ending_show(void) __banked -{ - /* Глушение снято 2026-08-28 (см. замер насоса). */ - /* Экран гасим ПЕРВЫМ действием — как load_intro оригинала, который - * начинается с draw_rect(&screen_rect, color_0_black). Иначе загрузка - * ресурсов сцены идёт поверх ЖИВОЙ комнаты уровня 14, и она «мелькает» - * перед встречей. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - /* Встреча с принцессой — живая сцена (end_sequence_anim). Дальше по - * скрипту идёт только текст HAIL, поэтому статический сценарий ниже - * начинается с него; при нехватке ресурсов отыгрывается целиком. */ - if (cut_ending() == 0) { - /* ПОБЕДНАЯ ТЕМА (56) — потоком с диска: 115 секунд и 1,2 МБ в память - * не влезают никак. Оригинал пускает её здесь же, сразу после - * встречи с принцессой и до экрана HAIL (seg001:583). Дальше - * страницы дочитывает pop_music_service из циклов сцен. */ - (void)pop_sfx_start(); - (void)pop_music_ring_start(POP_MUS_WON); - intro_run(ending_hail_script); - } else { - intro_run(ending_script); - } - /* ТИТУЛЬНАЯ КАРТИНКА ПОВЕРХ ТЕКСТА. end_sequence заводит таймер на 240 - * тиков, проявляет TITLE_MAIN полосами и ждёт его (seg001:590). Экран - * при этом не гаснет: рамка HAIL просто переползает в рисунок дворца. - * Дальше — состояние HALL_OF_FAME; тема продолжает звучать, и - * освобождает её уже таблица рекордов, как в оригинале. */ - if (pop_title_main_ltr() == 0) - (void)intro_wait_frames(POP_T60(240)); -} diff --git a/applications/SprPoP/src/pop_intro.h b/applications/SprPoP/src/pop_intro.h deleted file mode 100644 index 105d960..0000000 --- a/applications/SprPoP/src/pop_intro.h +++ /dev/null @@ -1,29 +0,0 @@ -/* pop_intro.h — story/PV intro после оригинальной заставки (FG8). */ -#ifndef POP_INTRO_H -#define POP_INTRO_H - -#include "pop_flow.h" - -/* Показать absence -> Princess/Jaffar -> marry -> credits. Возврат 1 — - * пользователь прервал цепочку и надо сразу начать FIRST_LEVEL; 0 — intro - * завершилось штатно и далее запускается attract-demo. */ -uint8_t pop_intro_show(void) __banked; - -/* Показать одну pre-level сцену 2/4/6/8/9/12. NONE — no-op. После любого - * skip возвращается затемнённая игровая палитра, далее caller грузит уровень. */ -void pop_pre_cutscene_show(pop_pre_cutscene_t scene) __banked; - -/* Отдельная сцена истёкшего времени (PV hourglass), после которой автомат - * возвращается в TITLE. Любой raw-ввод сокращает ожидание. */ -void pop_time_expired_show(void) __banked; - -/* Финал level 14: Princess room, story-screen HAIL и титульная картинка. - * Победная тема при выходе ЕЩЁ ЗВУЧИТ: её дослушивает таблица рекордов, - * как в end_sequence оригинала. */ -void pop_ending_show(void) __banked; - -/* Фон таблицы рекордов (рамка story + логотип) в заданную СКРЫТУЮ - * страницу; -1 — ресурс не прочитан. Ни палитры, ни показа. */ -int pop_intro_hof_bg(uint8_t page) __banked; - -#endif /* POP_INTRO_H */ diff --git a/applications/SprPoP/src/pop_kboot.c b/applications/SprPoP/src/pop_kboot.c deleted file mode 100644 index b4cdc3b..0000000 --- a/applications/SprPoP/src/pop_kboot.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * pop_kboot.c — ЗАГРУЗКА ресурсов Кида: атласы chtab_2 (kid0..27.atl) и - * страница таблиц анимации (kid.ani). БАНК 8. - * - * Отрабатывает раз за игру (и на выходе — освобождение), поэтому места в - * резиденте W1 не занимает: контракт с интерпретатором — _pop_kid.h, там - * же дескриптор страницы данных. - */ -#include -#include -#include -#include -#include -#include "pop_kid.h" -#include "_pop_kid.h" -#include "kid_data.h" -#include "pop_vflip.h" -#include "pop_guard.h" /* pop_guard_vflip_load — зеркала соперника */ -#include "pop_arc.h" -#include "kid_arc.h" -#include "_pop_file.h" - -/* Серии в архиве обязаны лежать подряд — так их кладёт список в Makefile, - * и только поэтому индекс считается сложением. Если порядок собьётся, - * сборка встанет здесь, а не рассыплется картинкой на экране. */ -#if (ARC_KID_SWORD - ARC_KID_KID0_V) != KID_PAGES -#error "обычная и зеркальная серии Kid должны иметь одинаковую длину" -#endif - -/* Таблица архива живёт на стеке вызывающего (4 байта на запись, здесь 232) - * — держать её постоянно незачем, а W2 у игры и без того тесный. */ -int pop_kid_load(uint8_t npages) __banked -{ - uint8_t tbl[ARC_KID_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t i; - - if (npages > KID_PAGES) npages = KID_PAGES; - if (pop_arc_open_id(&arc, POP_ARC_KID, tbl, ARC_KID_COUNT) < 0) return -1; - for (i = 0; i < npages; i++) - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_KID_KID0 + i), - &kidp[i]) != 0) { - pop_arc_close(&arc); - return -1; - } - /* Меч — из того же открытого архива: без него кадры 229+ идут без - * клинка, а второй open стоил бы дороже самого чтения. */ - { - atlas_t sword; - - if (pop_arc_atlas(&arc, tbl, ARC_KID_SWORD, &sword) == 0) - (void)pop_sword_take(&sword); - } - pop_arc_close(&arc); - kid_npages = npages; - return 0; -} - -void pop_kid_free(void) __banked -{ - uint8_t i; - for (i = 0; i < kid_npages; i++) - atlas_free(&kidp[i]); - kid_npages = 0; -} - -int pop_kid_data_load(const char *path) __banked -{ - uint8_t blk, page; - int n; - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - POP_PATH_CALL(n, bank_load_file(page,KD_DATA_OFF,path, - 16384-KD_DATA_OFF)); - if (n < (int)(KID_BIN_SEQTBL_OFF + KID_SEQTBL_LEN)) { - mem_free_block(blk); return -1; - } - gfx_w0_page_prepare(page); - kdat_blk=blk; kdat_page=page; kdat_ok=1; - return 0; -} - -void pop_kid_data_free(void) __banked -{ - if (kdat_ok) { mem_free_block(kdat_blk); kdat_ok = 0; } -} - -/* ---- Зеркальный набор (зелье инверсии, уровень 9) -------------------- * - * Грузится ОДНИМ вызовом и откуда угодно: со старта игры, из показа интро - * или при входе на уровень с зельем — см. pop_vflip.h. Внутри обычный - * atlas_load (он резидентный и сам мапит W3, банку это разрешено делать - * только через него). Идемпотентна. */ -int pop_vflip_load_all(void) __banked -{ - uint8_t tbl[ARC_KID_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t i; - int res = 0; - - if (pop_vflip_ready()) return 0; - if (pop_arc_open_id(&arc, POP_ARC_KID, tbl, ARC_KID_COUNT) < 0) return -1; - for (i = 0; i < kid_npages; i++) { - atlas_t m; - - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_KID_KID0_V + i), &m) != 0 || - pop_vflip_take(&kidp[i], &m) != 0) - res = -1; - } - { - atlas_t sword_v; - - if (pop_arc_atlas(&arc, tbl, ARC_KID_SWORD_V, &sword_v) != 0 || - pop_sword_vflip_take(&sword_v) != 0) - res = -1; - } - pop_arc_close(&arc); - if (pop_guard_vflip_load() != 0) res = -1; - return res; -} diff --git a/applications/SprPoP/src/pop_kdraw.c b/applications/SprPoP/src/pop_kdraw.c deleted file mode 100644 index dcc6fdc..0000000 --- a/applications/SprPoP/src/pop_kdraw.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * pop_kdraw.c — отрисовка ИЗ АТЛАСОВ КИДА, которая нужна только слою - * персонажей: клинок в руке (add_sword_to_objtable, seg006:1798) и блит - * спрайта chtab_2 по его id (полоса HP). БАНК 4, вместе с pop_cdraw.c. - * - * Почему здесь. Оба вызова приходят РОВНО из pop_cdraw.c и больше ниоткуда - * (проверено грепом), а лежали они в pop_kid.c — то есть в резиденте W1, - * съедая ~1.2 КБ дефицитного окна ради кода, который зовёт сосед по банку. - * Раз модуль в том же банке 4 — вызовы прямые, без трамплина: объявления в - * _pop_kdraw.h НЕ помечены __banked (см. там же условие корректности). - * - * Загрузка атласа меча (pop_sword_load) осталась публичной и __banked: её - * зовёт инициализация, один раз за игру. - */ -#include -#include -#include -#include "pop_kid.h" -#include "_pop_kdraw.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_guard.h" /* CHARID_* — клинок есть и у стража */ -#include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */ -#include "_pop_draw.h" /* pop_onscreen_cols */ -#include "pop_map.h" /* pop_upside — зелье инверсии */ -#include "pop_vflip.h" /* зеркальные страницы атласов */ -#include "kid_data.h" - -/* chtab_0 «меч в руке» (add_sword_to_objtable, seg006:1798): клинок — - * ОТДЕЛЬНЫЙ спрайт поверх персонажа, один и тот же атлас у Кида и у стража. - * Таблица sword_tbl (kid_data.h, генерится из seg006) индексируется - * sword_frame = кадр.sword & 0x3F; id 255 = клинка в этом кадре нет. - * Смещения — в ЭКРАННЫХ пикселях: оригинал применяет их ПОСЛЕ - * calc_screen_x_coord, x — «вперёд» по направлению персонажа. */ -static const uint8_t SWORD_ID[KID_NSWORD] = KID_SWORD_ID_INIT; -static const int8_t SWORD_DX[KID_NSWORD] = KID_SWORD_DX_INIT; -static const int8_t SWORD_DY[KID_NSWORD] = KID_SWORD_DY_INIT; -static atlas_t swordp; -static uint8_t sword_ok; - -/* Меч приходит УЖЕ ЗАГРУЖЕННЫМ: его читает pop_kid_load из того же архива, - * что и остальные страницы Кида, — открывать архив второй раз ради одного - * элемента незачем (`open` дороже самого чтения). */ -int pop_sword_take(const atlas_t *a) __banked -{ - if (!a) return -1; - swordp = *a; - sword_ok = 1; - return 0; -} - -/* Зеркальная страница меча (зелье инверсии) — пара к pop_sword_take. */ -int pop_sword_vflip_take(const atlas_t *m) __banked -{ - if (!sword_ok) return 0; - return pop_vflip_take(&swordp, m); -} - -/* add_sword_to_objtable (seg006:1798). Клинок рисуется, если персонаж в - * кадрах подъёма/ножен, ИЛИ держит меч, ИЛИ это ЖИВОЙ страж (у стража меч - * в руке всегда, даже пока sword ещё sheathed). Страницу W0 оставляем - * замапленной — вызывающий делает gfx_w0_unmap сам. */ -uint8_t pop_sword_draw(const pop_char_t *ch, const kframe *fr, - int obj_x, int obj_y, - int *rx, int *ry, uint16_t *rw, uint16_t *rh) -{ - uint8_t sf, id, flip; - const uint8_t *simg; - uint16_t w, h; - int bx, top; - - if (!sword_ok) return 0; - if (!((ch->frame >= 229 && ch->frame < 238) || - ch->sword != 0 || - ((ch->charid == CHARID_2_GUARD || ch->charid == CHARID_4_SKELETON) && - ch->alive < 0))) - return 0; - sf = (uint8_t)(fr->sword & 0x3F); - if (sf == 0 || sf >= KID_NSWORD) return 0; - id = SWORD_ID[sf]; - if (id == 0xFF) return 0; - - simg = (const uint8_t *)atlas_image(&swordp, id); - { /* ПЕРЕВОРОТ: зеркальная копия страницы меча (см. pop_vflip.h) */ - uint8_t vpg = swordp.page; - if (pop_upside) { - uint8_t f = pop_vflip_page(vpg); - if (f) vpg = f; - } - gfx_w0_map(vpg); - } - w = (uint16_t)(simg[0] | ((uint16_t)simg[1] << 8)); - h = (uint16_t)(simg[2] | ((uint16_t)simg[3] << 8)); - if (!w || !h) return 0; - - flip = (uint8_t)(ch->direction >= 0); - bx = obj_x + ((ch->direction < 0) ? -(int)SWORD_DX[sf] : (int)SWORD_DX[sf]); - top = obj_y + (int)SWORD_DY[sf] - (int)h + 1; - /* Та же формула, что у самого персонажа (pop_cdraw.c): верх кадра - * [top, top+h) уезжает в 192 - top - h. */ - if (pop_upside) top = POP_PLAYFIELD_H - top - (int)h; - if (flip) bx -= (int)w; - /* Поле комнаты — 192 строки (reset_obj_clip, seg006:0507): клинок - * обрезается по нему так же, как сам персонаж. Без этого у падающего - * в пропасть скелета меч оставался виден НИЖЕ поля, на полосе HP. */ - { - int skip = 0, rows = (int)h; - if (top < 0) { skip = -top; rows -= skip; top = 0; } - if (top + rows > 192) rows = 192 - top; - if (rows <= 0) return 0; - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Клинок почти всегда целиком на экране — noclip-путь (см. gfx.h: - * подготовка клипающего варианта стоит ~5.6 К тактов на вызов). */ - if (pop_onscreen_cols(bx, top + POP_YOFF, w, (uint16_t)rows)) - gfx_blit_cols_part_noclip(bx, top + POP_YOFF, simg, flip, - (uint8_t)skip, (uint8_t)rows); - else - gfx_blit_cols_part(bx, top + POP_YOFF, simg, flip, skip, rows); - gfx_set_bank(GFX_BANK_NORMAL); - *rx = bx; *ry = top; *rw = w; *rh = (uint16_t)rows; - } - return 1; -} - -/* Блит спрайта chtab_2 (атласы Kid) по ЕГО id, левым верхним углом в (x,y). - * Нужен полосе HP: она рисует id 216/217 из тех же атласов, что и кадры - * Кида, а держать вторую копию раскладки в pop_cdraw ни к чему. */ -void pop_kid_img_blit(uint8_t image, int x, int y) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - uint8_t pg = (uint8_t)(image >> 3); /* раскладка атласов: 8 спрайтов/стр. */ - uint8_t idx = (uint8_t)(image & 7); - const uint8_t *img; - uint16_t w, h; - if (pg >= kid_npages) return; - img = (const uint8_t *)atlas_image(&kidp[pg], idx); - gfx_w0_map(kidp[pg].page); - w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - /* Атласы Кида хранятся COLUMN-MAJOR (transpose_cols в pop_pack_kid — - * ради бесплатного горизонтального флипа), поэтому блит обязан быть - * колоночным. Row-major gfx_blit_noclip выдал бы марку транспонированной. - * noclip БЕЗ проверки (CLIP-1): единственный вызывающий — полоса HP - * (pop_cdraw.c), у неё координаты фиксированные и заведомо на экране. */ - if (w && h) gfx_blit_cols_part_noclip(x, y, img, 0, 0, 0); - gfx_w0_unmap(); -} diff --git a/applications/SprPoP/src/pop_kid.c b/applications/SprPoP/src/pop_kid.c deleted file mode 100644 index f65b564..0000000 --- a/applications/SprPoP/src/pop_kid.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * pop_kid.c — движок Kid (Фаза K1): порт seg006.c play_seq/load_frame + - * seqtbl-интерпретатор. Данные — kid_data.h. - */ -#include -#include -#include -#include -#include -#include -#include -#include "pop_kid.h" -#include "pop_sfx.h" /* звуковые эффекты: опкод SOUND в play_seq */ -#include "pop_trob.h" /* pop_start_chompers — смена ряда будит чомперы */ -#include "pop_guard.h" /* Guard/pop_gframe/CHARID_* — интерпретатор общий */ -#include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_map.h" /* pop_clip_char_top (clip_char) */ -#include "pop_geom.h" -#include "pop_level.h" /* POP_LEVEL_LAST — level 15 исключён */ -#include "pop_cutscene.h" /* POP_T60 — тики оригинала в кадры луча */ -#include -#include -#include -#include "kid_data.h" -#include "_pop_kid.h" /* дескриптор страницы данных (её грузит банк 8) */ - -pop_char_t Kid; - -/* Флаг сотрясения (seg006 knock): ставится seqtbl-командой KNOCK_UP/DOWN - * в play_seq, потребляется pop_check_knock (pop_map) — трясёт loose-полы. */ -int8_t knock; - -/* Порт глобала next_level: seqtbl-команда END_LEVEL инкрементит его в конце - * seq_70 (подъём по лестнице за дверью уровня), а главный цикл сравнивает с - * текущим уровнем и грузит следующий. Счётчик, а не флаг — ровно как в - * оригинале, чтобы читы «следующий/предыдущий уровень» (levels_plan.md §4) - * легли сюда же без переделки. */ -uint8_t pop_next_level; - - -/* ---- Атласы Kid (прямая адресация image>>3) ------------------------ * - * НЕ static: набор спрайтов слота POP_CH_KID общей отрисовки персонажей - * (pop_cdraw.c, банк 4). Отдан как есть, а не через аксессор: читается раз - * в кадр из другого банка, и вызов стоил бы дороже самого чтения. */ -atlas_t kidp[KID_PAGES]; -uint8_t kid_npages; - -/* Таблица «seq_id -> адрес в seqtbl» (original_seqtbl_offsets). Определена - * ЗДЕСЬ, а не в kid_data.h: заголовок включают почти все модули PoP, и - * `static const` в нём размножал таблицу мёртвой копией по каждому TU — - * 230 Б × 9 модулей, из них 460 Б в дефицитном резиденте W1/W2 (замер - * 2026-08-08). Наружу таблица не нужна: смену последовательности делают - * kid_set_seq / pop_char_set_seq. */ -static const uint16_t kid_seq_off[KID_NSEQ] = KID_SEQ_OFF_INIT; - -/* ---- Данные анимации в EMM-странице (kid.ani) ----------------------- * - * Таблица кадров (241*5 Б) и seqtbl (2310 Б) занимали 3.5 КБ в _CODE окна - * W1/W2 — самый дефицитный ресурс. Теперь они лежат в отдельной EMM- - * странице, которая маппится в W0 РОВНО на время play_seq (раз за тик), а - * весь остальной код читает cur_frame — 5-байтовую копию текущего кадра. - * Это ровно устройство оригинала: load_frame (seg006) заполняет cur_frame, - * и коллизия/отрисовка работают с ним, а не с таблицей. - * Страница адресуется как у pop_level: данные с 0x100, ниже — ISR-стаб. */ -/* Адрес кадра i в замапленной странице. Считаем В uint16_t и кастуем ОДИН - * раз: запись `(const uint8_t *)CONST + (uint16_t)i * 5u` SDCC 4.5 собирает - * НЕВЕРНО — умножение делает в 16 битах (add hl,hl / add hl,bc), а потом - * берёт только МЛАДШИЙ байт результата и подставляет старший байт константы - * (`ld c,l` / `inc b`). Для кадров i >= 52 (i*5 >= 256) адрес уезжает на - * −256*k, и cur_frame наполняется чужой строкой таблицы: у бега/шага/подъёма - * пропадал бит FRAME_NEEDS_FLOOR, и Kid проваливался сквозь пол. - * Артефакт: build/obj/pop_kid.asm, функция load_frame. */ -static const uint8_t *kd_frame_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); /* i*5 = i + i*4, без умножения */ - off += (uint16_t)(KD_DATA_OFF + KID_BIN_FRAMES_OFF); - return (const uint8_t *)off; -} - -/* То же для таблицы кадров СТРАЖА (frame_tbl_guard дописана в ту же - * страницу данных, см. pop_extract_kid_data.py). */ -static const uint8_t *kd_gframe_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); - off += (uint16_t)(KD_DATA_OFF + KID_BIN_GFRAMES_OFF); - return (const uint8_t *)off; -} - -/* ...и для таблицы кадров КАТСЦЕН (frame_tbl_cuts): по ней ходят Princess и - * Vizier в сценах 8/9, финале и intro. Индекс — номер кадра как есть; какой - * набор спрайтов рисовать, говорит поле sword (>>6: 1 = PV1, 2 = PV2). */ -static const uint8_t *kd_cframe_ptr(uint8_t i) -{ - uint16_t off = (uint16_t)i; - off += (uint16_t)(off << 2); - off += (uint16_t)(KD_DATA_OFF + KID_BIN_CFRAMES_OFF); - return (const uint8_t *)off; -} -#define KD_SEQ(cs) (*((const uint8_t *)(KD_DATA_OFF + KID_BIN_SEQTBL_OFF) + \ - (uint16_t)((cs) - SEQTBL_BASE))) -/* Байт seqtbl по адресу оригинала (база SEQTBL_BASE); ТОЛЬКО под замапленной - * страницей данных — то есть внутри play_seq. */ -#define SEQ(cs) KD_SEQ(cs) - -/* Страница данных анимации: заполняет ЗАГРУЗЧИК (pop_kboot.c, банк 8), - * читает интерпретатор здесь. Не static — контракт в _pop_kid.h. */ -uint8_t kdat_blk, kdat_page, kdat_ok; - -/* Текущий кадр (порт глобала cur_frame, seg006): 5 байт вместо таблицы. - * Заполняется load_frame для АКТИВНОГО персонажа (Char), поэтому на - * выходе из play_seq его надо сохранить в кэш своего персонажа: страж - * тикает ПОСЛЕ Кида, и без разделения отрисовка Кида взяла бы кадр стража. */ -static kframe cur_frame; -/* Кадр Кида для отрисовки — пара к pop_gframe соперника; читает общая - * отрисовка (pop_cdraw.c), поэтому не static. */ -kframe kid_frame; - -/* Char (seg006): АКТИВНЫЙ персонаж. Интерпретатор последовательностей в - * оригинале работает не с Kid и не с Guard, а с этой копией, а вокруг - * стоят loadkid/savekid и loadshad/saveshad (seg006:809..825). Копия, а - * не указатель, — и так же, как в оригинале, и быстрее на Z80: обращения - * в горячем цикле идут абсолютной адресацией глобала, а 16-байтовое - * копирование платится один раз на переключение персонажа. */ -pop_char_t Char; - -/* Opp (seg006): СОПЕРНИК активного персонажа — вторая копия, которую ставят - * рядом с Char (loadkid_and_opp / loadshad_and_opp, seg006:809). Через неё - * ИИ и боёвка меряют дистанцию (char_opp_dist), не зная, кто именно перед - * ними: для стража Opp = Kid, для Кида Opp = Guard. */ -pop_char_t Opp; - -void pop_loadkid(void) { Char = Kid; } -void pop_savekid(void) { Kid = Char; } -/* Выгрузка после control() — теперь ПОЛНАЯ, как savekid оригинала. - * - * Была выборочной (только curr_seq и sword) ровно потому, что pop_map правил - * геометрию ПРЯМО в Kid, мимо окна Char: полное копирование затирало его - * правки — Kid терял выравнивание x и ряд, и спуск с уступа через вис не - * срабатывал (персонаж просто приседал). Приходилось ещё и сравнивать - * последовательность со снимком на входе в окно, чтобы понять, чья правка - * свежее. С переводом физики на Char (GUARD-PHYS) диспетчер и pop_map - * пишут в одно и то же место, и разбирать это больше не нужно. */ -void pop_savekid_state(void) { Kid = Char; } -void pop_loadshad(void) { Char = Guard; } -void pop_saveshad(void) { Guard = Char; } -void pop_loadshad_and_opp(void) { Char = Guard; Opp = Kid; } -void pop_saveshad_and_opp(void) { Guard = Char; Kid = Opp; } -void pop_loadkid_and_opp(void) { Char = Kid; Opp = Guard; } -void pop_savekid_and_opp(void) { Kid = Char; Guard = Opp; } - -/* char_opp_dist (seg006:2135): >0 — соперник ПЕРЕД Char, <0 — за спиной. - * +13 при встречных направлениях: у стоящих лицом друг к другу «ноль» - * приходится на ширину тайла между ними. Живёт здесь, а не в guards.c, - * потому что нужен по обе стороны банковой границы — и ИИ, и диспетчеру - * боёвки (pop_ctrl). */ -int16_t pop_char_opp_dist(void) -{ - int16_t distance; - if (Char.room != Opp.room) return 999; - distance = (int16_t)Opp.x - (int16_t)Char.x; - if (Char.direction < 0) distance = -distance; - if (distance >= 0 && Char.direction != Opp.direction) distance += 13; - return distance; -} - -/* Прочитать кадр из ЛЮБОЙ таблицы страницы данных (у Kid и у стража они - * разные: KID_BIN_FRAMES_OFF / KID_BIN_GFRAMES_OFF). Сама маппит страницу, - * поэтому годится для вызова извне (pop_guard) — но НЕ в горячем цикле. */ -void pop_kid_data_frame(uint16_t tbl_off, uint8_t idx, uint8_t *out5) -{ - const uint8_t *f; - uint16_t off = (uint16_t)idx; - if (!kdat_ok) { out5[0] = 255; return; } - off += (uint16_t)(off << 2); /* idx*5, без умножения */ - off += (uint16_t)(KD_DATA_OFF + tbl_off); - gfx_w0_map(kdat_page); - f = (const uint8_t *)off; - out5[0] = f[0]; out5[1] = f[1]; out5[2] = f[2]; - out5[3] = f[3]; out5[4] = f[4]; - gfx_w0_unmap(); -} - -/* load_frame (seg006:0293): скопировать кадр Kid.frame из таблицы в - * cur_frame. Звать ТОЛЬКО когда страница данных замаплена в W0. */ -/* Какая ТАБЛИЦА КАДРОВ у персонажа (seg006:0293). Вынесено из load_frame - * отдельной функцией, потому что тот же вопрос решает ОТРИСОВКА: набор - * атласов обязан совпадать с таблицей, иначе image из таблицы Кида ищется - * среди спрайтов стража. Для тени это не теория — она ходит кадрами Кида - * (и рисуется его спрайтами), а дерётся кадрами стража. */ -uint8_t pop_frame_tbl_is_guard(int8_t charid, uint8_t frame) -{ - return (uint8_t)(charid == CHARID_2_GUARD || charid == CHARID_4_SKELETON || - (charid == CHARID_1_SHADOW && frame >= 150 && frame < 190)); -} - -static void load_frame(void) -{ - /* Таблица кадров зависит от персонажа (seg006:0293): у Kid своя, у - * стража frame_tbl_guard с индексом frame + add_frame − 149, где - * add_frame = 70 для кадров 102..106 (seg006:535). - * - * СКЕЛЕТ идёт по той же ветке, что страж (seg006:529 — общий case): у - * него свой атлас, но НУМЕРАЦИЯ кадров та же. Пока здесь стоял только - * charid_2_guard, скелет попадал в таблицу Кида, получал несуществующий - * image (180 при 28 спрайтах в наборе) и не рисовался вовсе. - * ТЕНЬ (charid_1_shadow) — по таблице стража ТОЛЬКО в кадрах 150..189, - * в остальных она ходит кадрами Кида (seg006:532). */ - const uint8_t *f; - uint8_t use_guard_tbl = pop_frame_tbl_is_guard(Char.charid, Char.frame); - f = 0; - if (Char.charid == CHARID_5_PRINCESS || Char.charid == CHARID_6_VIZIER) { - /* seg006:538 — у персонажей КАТСЦЕН своя таблица. */ - if (Char.frame < KID_NCFRAMES) f = kd_cframe_ptr(Char.frame); - } else if (use_guard_tbl) { - int16_t idx = (int16_t)Char.frame; - if (idx >= 102 && idx < 107) idx += 70; - idx -= 149; - if (idx >= 0 && idx < KID_NGFRAMES) f = kd_gframe_ptr((uint8_t)idx); - } else { - f = kd_frame_ptr(Char.frame); - } - if (f) { - cur_frame.image = f[0]; - cur_frame.dx = (int8_t)f[1]; - cur_frame.dy = (int8_t)f[2]; - cur_frame.flags = f[3]; - cur_frame.sword = f[4]; - } else { - /* Кадра нет в таблице — оригинал кладёт blank_frame {255,0,0,0,0} - * (get_frame_internal, seg006:507) и этим ГАСИТ отрисовку. Выход - * ОДИН на обе ветки: «пусто» обязано доехать и до кэша владельца - * (ниже), иначе kid_frame/pop_gframe держат ПРОШЛУЮ картинку и - * вместо «не рисовать» рисуется она — тот же класс, что - * BUG-SHADOW-STALE-FRAME (разбор в pop_char_draw). */ - cur_frame.image = 255; - cur_frame.dx = cur_frame.dy = 0; - cur_frame.flags = cur_frame.sword = 0; - } - /* Кэш кадра для ОТРИСОВКИ раскладываем ЗДЕСЬ, по charid активного - * персонажа, а не в save*-функциях. Раньше кэш писали pop_savekid/ - * pop_saveshad, и любое окно Char БЕЗ play_seq (окна боёвки - * check_sword_hurting / check_sword_hurt) записывало Киду кадр, который - * на самом деле принадлежал СТРАЖУ: отрисовка брала его image из атласа - * Кида и рисовал произвольную позу. Теперь владелец один — тот, для - * кого кадр реально загружен. */ - if (Char.charid == CHARID_0_KID) kid_frame = cur_frame; - else pop_gframe = cur_frame; -} - -static uint8_t char_dx_forward(int8_t dx) -{ - if (Char.direction < 0) dx = (int8_t)-dx; - return (uint8_t)(Char.x + dx); -} - -/* Аксессоры к текущему кадру (для pop_map): читают cur_frame, НЕ таблицу — - * их дёргают несколько раз за кадр, маппинг страницы тут недопустим. */ -int8_t kid_cur_dx(void) { return cur_frame.dx; } -int8_t kid_cur_dy(void) { return cur_frame.dy; } -uint8_t kid_cur_flags(void) { return cur_frame.flags; } - -/* seqtbl_offset_char: сменить последовательность Kid (единая точка — - * pop_ctrl/pop_map зовут ЕЁ, а не дублируют kid_seq_off/kid_seqtbl). */ -void kid_set_seq(uint8_t seq_id) { Kid.curr_seq = kid_seq_off[seq_id]; } - -/* То же для АКТИВНОГО персонажа — внутри окна Char (порт - * seqtbl_offset_char, seg006). Нужен стражу: его последовательность - * ставится, когда Char уже загружен из Guard. */ -void pop_char_set_seq(uint8_t seq_id) { Char.curr_seq = kid_seq_off[seq_id]; } - -/* play_seq (seg006.c:570): крутит опкоды до КАДРА (байт < 0xF0). - * Страница данных маппится в W0 на ВЕСЬ разбор — один map/unmap за вызов - * (в тике, до отрисовки: конфликта с атласом в W0 нет). В конце — - * load_frame: пока страница ещё замаплена, копируем кадр в cur_frame. */ -/* Отложенный start_chompers: взводится байткодом SEQ_UP/SEQ_DOWN, а - * исполняется после выхода из цикла (окно W0 уже свободно). */ -static uint8_t chomp_pending; - -void play_seq(void) -{ - if (!kdat_ok) return; - gfx_w0_map(kdat_page); - for (;;) { - uint8_t cmd = SEQ(Char.curr_seq); - Char.curr_seq++; - switch (cmd) { - case 0xFB: /* DX */ - Char.x = char_dx_forward((int8_t)SEQ(Char.curr_seq)); - Char.curr_seq++; - break; - case 0xFA: /* DY */ - Char.y = (uint8_t)(Char.y + (int8_t)SEQ(Char.curr_seq)); - Char.curr_seq++; - break; - case 0xFE: /* FLIP */ - Char.direction = (int8_t)~Char.direction; - break; - case 0xF7: /* JMP_IF_FEATHER (seg006:586): под зельем медленного - * падения — перейти по адресу (в seqtbl это ветки - * stepfloat/bumpfloat: «парящие» кадры падения и удара, - * без урона), иначе пропустить адрес и идти дальше. - * Эффект достаётся только Киду — как и сама физика пера - * (fall_accel, pop_map.c). */ - if (!pop_feather || Char.charid != CHARID_0_KID) { - Char.curr_seq += 2; - break; - } - /* иначе — ПРОВАЛ в JMP ниже: адрес лежит ровно там же */ - /* fallthrough */ - case 0xFF: { /* JMP */ - uint16_t a = (uint16_t)(SEQ(Char.curr_seq) | - ((uint16_t)SEQ((uint16_t)(Char.curr_seq + 1)) << 8)); - Char.curr_seq = a; - break; - } - case 0xFD: /* UP */ - Char.curr_row--; - chomp_pending = 1; /* start_chompers — ПОСЛЕ цикла, см. ниже */ - break; - case 0xFC: /* DOWN */ - Char.curr_row++; - chomp_pending = 1; - break; - case 0xF9: /* ACTION */ - Char.action = SEQ(Char.curr_seq); - Char.curr_seq++; - break; - case 0xF8: /* SET_FALL */ - Char.fall_x = (int8_t)SEQ(Char.curr_seq); Char.curr_seq++; - Char.fall_y = (int8_t)SEQ(Char.curr_seq); Char.curr_seq++; - break; - case 0xF5: /* KNOCK_UP: сотрясение трясёт loose РЯДОМ ВЫШЕ (check_knock) */ - knock = 1; - break; - case 0xF4: /* KNOCK_DOWN: приземление трясёт loose В СВОЁМ РЯДУ */ - knock = -1; - break; - case 0xF2: /* SOUND (seg006:0627). Аргумент — НЕ номер звука игры, а - * одно из пяти событий; отображение взято оттуда же: - * 0 SILENT — не звучит, но стражи Кида ЗАМЕЧАЮТ - * (стоит, например, в seq доставания меча); - * 1 FOOTSTEP — звук 23, и шум; - * 2 BUMP — звук 8, и шум; - * 3 DRINK — звук 18, не шум; - * 4 LEVEL — МУЗЫКА конца уровня (32 на 4-м, иначе 41, - * на 13/15 молчок). - * Второй смысл опкода («Кид нашумел») терять нельзя даже - * без звука, см. BUG-GUARD-DEAF-1. */ - { - uint8_t ev = SEQ(Char.curr_seq); - Char.curr_seq++; - if (ev < 3) is_guard_notice = 1; - if (ev == 1) pop_sfx_play(23); - else if (ev == 2) pop_sfx_play(8); - else if (ev == 3) pop_sfx_play(18); - else if (ev == 4) { - /* seg006:646. На четвёртом уровне уход за дверь — это - * встреча с тенью, и трек там свой; на 13-м (Джафар) и - * 15-м оригинал молчит. Держать уровень на экране, - * пока трек звучит, — забота главного цикла: он ждёт - * pop_music_active(), и своей задержки здесь больше - * нет (была по длине записи из gen/pop_music_ticks.h, - * из-за чего EXE зависел от набора музыки). */ - if (pop_current_level == 4) pop_sfx_play(32); - else if (pop_current_level != 13) pop_sfx_play(41); - } - } - break; - case 0xF1: /* END_LEVEL: seq_70 доиграл — уровень пройден. - * До 13-го это тот же `++next_level`, что в оригинале. - * Level 15/copy protection вырезан: 14-й позже передаст - * управление ENDING (FG11), но уже сейчас не может - * породить запрос res2015.bin. */ - if (pop_next_level < POP_LEVEL_LAST) pop_next_level++; - break; - case 0xF3: /* GET_ITEM: аргумент 1 — применить эффект предмета - * (порт play_seq -> proc_get_object, seg006) */ - if (SEQ(Char.curr_seq) == 1) - pop_proc_get_object(); - Char.curr_seq++; - break; - case 0xF6: /* DIE nop */ - break; - default: /* КАДР */ - Char.frame = cmd; - load_frame(); /* cur_frame := таблица[frame] (страница ещё в W0) */ - gfx_w0_unmap(); - /* start_chompers (seg006:0603/0607) — ТОЛЬКО здесь, после - * размаппинга. В оригинале он зовётся прямо из SEQ_UP/SEQ_DOWN, - * но у нас seqtbl читается ЧЕРЕЗ ОКНО W0, а start_chompers лезет - * за тайлами уровня и это окно перемапливает и закрывает — цикл - * дальше исполнял бы мусор вместо байткода. Наступили на это - * 2026-08-08: после спуска Кид проваливался сквозь пол. */ - if (chomp_pending) { - chomp_pending = 0; - pop_start_chompers(Char.room, Char.curr_row); - } - return; - } - } -} - -/* load_fram_det_col (seg006:0144) = load_frame() + determine_col(). - * - * Зачем это отдельной публичной точкой. cur_frame — ОДИН глобал на всех - * персонажей (так и в оригинале), и его владелец — тот, кто последним - * прошёл load_frame. В кадре последним тикает страж, поэтому к моменту - * управления Кидом в cur_frame лежит кадр СТРАЖА. А через cur_frame - * считается вся геометрия: dx_weight -> determine_col -> - * distance_to_edge_weight -> get_edge_distance, то есть буквально выбор - * ветки в check_jump_up. - * - * Оригинал от этого страхуется явно: play_kid_frame (seg000:1209) и - * play_guard_frame (seg000:1246) сразу после loadkid/loadshad зовут - * load_fram_det_col() — ДО control(). У нас этого не было, и Кид считал - * свой прыжок по кадру стража (BUG-CTRL-FRAME-1): при distance 2 вместо 10 - * check_jump_up уходил в «пустой прыжок вверх» вместо «шаг назад и - * зацеп». Результат менялся от кадра к кадру — вместе с анимацией стража. - * - * determine_col теперь общий: pop_map работает с Char, поэтому колонка - * пересчитывается ЛЮБОМУ активному персонажу — ровно как load_fram_det_col - * в оригинале. Раньше вторая половина связки работала только на ветке Кида - * (стражу колонку вёл pop_guard_enter/leave) — прямое следствие того, что - * физика знала один Kid. */ -void pop_load_frame(void) -{ - if (!kdat_ok) return; - gfx_w0_map(kdat_page); - load_frame(); - gfx_w0_unmap(); -} - -void pop_load_fram_det_col(void) -{ - pop_load_frame(); - pop_determine_col(); -} - -/* Прокрутить последовательность КОНКРЕТНОГО персонажа (порт связки - * loadkid/play_seq/savekid, seg006). Звать вместо голого play_seq: тот - * работает с Char и сам по себе не знает, чей это персонаж. */ -void pop_kid_play(void) { pop_loadkid(); play_seq(); pop_savekid(); } -void pop_guard_play(void) { pop_loadshad(); play_seq(); pop_saveshad(); } - -void kid_init(uint8_t seq_id, int8_t col, int8_t row, int8_t dir) -{ - Kid.curr_col = col; - Kid.curr_row = row; - Kid.direction = dir; - Kid.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Kid.y = (uint8_t)pop_y_land[row + 1]; - Kid.fall_x = Kid.fall_y = 0; - Kid.repeat = 0; - Kid.charid = 0; /* charid_0_kid: своя таблица кадров */ - Kid.alive = -1; /* в оригинале ЖИВОЙ = alive < 0 */ - Kid.curr_seq = kid_seq_off[seq_id]; - pop_kid_play(); /* до первого кадра */ -} - -void kid_tick(void) -{ - pop_kid_play(); -} - -/* Отрисовка кадра (load_frame_to_obj, heal, клип, брызги, клинок) живёт в - * pop_cdraw.c — ОДНА на всех Char, см. DRAW-CHAR. Отсюда она получает - * атласы Кида (kidp/kid_npages) и его кадр (kid_frame). */ - -/* Таблица кадров (241*5 Б) и seqtbl (2310 Б) занимали 3.5 КБ в _CODE окна - * W1/W2 — самый дефицитный ресурс. Теперь они лежат в отдельной EMM- - * странице, которая маппится в W0 РОВНО на время play_seq (раз за тик). - * Страница адресуется как у pop_level: данные с 0x100, ниже — ISR-стаб. */ diff --git a/applications/SprPoP/src/pop_kid.h b/applications/SprPoP/src/pop_kid.h deleted file mode 100644 index 9f8d323..0000000 --- a/applications/SprPoP/src/pop_kid.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * pop_kid.h — движок анимации/движения Kid (Фаза K1): интерпретатор - * seqtbl (play_seq) + frame_table. Порт SDLPoP seg006.c. Данные — - * kid_data.h (pop_extract_kid_data.py). - * - * K1: только проигрывание последовательностей кадров с авторскими - * смещениями (движение = SEQ_DX/DY + frame.dx/dy). Управление (K2) и - * коллизия карты (K3) — отдельно. - */ -#ifndef POP_KID_H -#define POP_KID_H - -#include -#include "pop_char.h" -#include "kid_data.h" /* kframe — тип кадра для pop_sword_draw */ -#include "kid_arc.h" /* границы серий атласов в kid.arc */ -#include /* atlas_t — набор спрайтов Кида (см. kidp ниже) */ - -/* Число страниц Кида берём из метаданных архива: зеркальная серия начинается - * сразу после обычной. Не дублировать литералом в загрузчике/хранилище. */ -#define KID_PAGES (ARC_KID_KID0_V - ARC_KID_KID0) - -/* Состояние персонажа — общий тип для Кида, стража и Char (pop_char.h). */ -extern pop_char_t Kid; - -/* Флаг сотрясения (seg006 knock): +1 = KNOCK_UP (ряд выше), -1 = KNOCK_DOWN - * (свой ряд). Ставит play_seq, читает/сбрасывает pop_check_knock. */ -extern int8_t knock; - -/* Порт next_level (seg000): END_LEVEL в play_seq инкрементит — «уровень - * пройден». Читает и обнуляет главный цикл. Пока уровень один, поэтому - * там рестарт того же уровня; загрузка следующего — levels_plan.md. */ -extern uint8_t pop_next_level; -/* Задержка смены уровня на время мелодии конца (см. pop_kid.c). */ - -/* Загрузить npages атласов Kid (kid0..kid{npages-1}.atl). ДО initgraph. - * 0 — OK, -1 — ошибка. */ -int pop_kid_load(uint8_t npages) __banked; - -/* Данные анимации (таблица кадров + seqtbl) — отдельная EMM-страница - * (kid.ani): в _CODE окна W1/W2 они занимали 3.5 КБ. Грузить ДО - * первого kid_init/play_seq. 0 — OK, -1 — ошибка (без них Kid не оживёт). - * Страница маппится в W0 внутри play_seq, раз за тик. */ -int pop_kid_data_load(const char *path) __banked; - -/* Прочитать кадр из таблицы страницы данных: tbl_off — KID_BIN_FRAMES_OFF - * (Kid) или KID_BIN_GFRAMES_OFF (страж, своя таблица frame_tbl_guard). - * Маппит страницу сама; для горячего цикла есть cur_frame. */ -void pop_kid_data_frame(uint16_t tbl_off, uint8_t idx, uint8_t *out5); -void pop_kid_data_free(void) __banked; - -/* Атлас chtab_0 «меч в руке» (sword.atl) — спрайт клинка поверх Kid в кадрах - * подъёма меча/убирания в ножны (add_sword_to_objtable, seg006:1798). - * Грузить ДО initgraph, как и страницы Kid. 0 — OK, -1 — ошибка (тогда - * кадры рисуются без клинка). */ -/* Зеркальная (вертикально) страница меча — для зелья инверсии. */ -int pop_sword_take(const atlas_t *a) __banked; -int pop_sword_vflip_take(const atlas_t *m) __banked; -void pop_kid_free(void) __banked; - -/* Сама отрисовка клинка (pop_sword_draw) и блит спрайта chtab_2 по id - * (pop_kid_img_blit) переехали в pop_kdraw.c — БАНК 4, к единственному - * вызывающему (pop_cdraw.c). Их объявления — в _pop_kdraw.h. */ - -/* Инициализировать Kid: последовательность seq_id, клетка col/row, - * направление dir (-1/0). Ставит x/y по x_bump/y_land. */ -void kid_init(uint8_t seq_id, int8_t col, int8_t row, int8_t dir); - -/* Один логический тик: play_seq() — продвинуть последовательность до - * следующего кадра (применить SEQ_DX/DY/ACTION/...). */ -void kid_tick(void); - -/* play_seq напрямую (для pop_map start_fall — переход в fall-seq в тот же - * physics-шаг, как оригинал). */ -void play_seq(void); /* работает с Char — см. pop_kid_play ниже */ - -/* Активный персонаж (порт Char, seg006) и его загрузка/выгрузка. - * Интерпретатор последовательностей общий для Kid и стража: у них общая - * seqtbl, но РАЗНЫЕ таблицы кадров (load_frame выбирает по Char.charid). */ -extern pop_char_t Char; -/* Соперник активного персонажа (порт Opp): ставится вместе с Char через - * pop_loadshad_and_opp. Читают ИИ стража и боёвка (char_opp_dist). */ -extern pop_char_t Opp; -void pop_loadkid(void); -void pop_savekid(void); -void pop_savekid_state(void); /* Kid = Char, кадр не трогаем */ -void pop_loadshad(void); -void pop_saveshad(void); -void pop_loadshad_and_opp(void); /* Char = Guard, Opp = Kid (seg006:841) */ -void pop_saveshad_and_opp(void); /* Guard = Char, Kid = Opp */ -void pop_loadkid_and_opp(void); /* Char = Kid, Opp = Guard */ -void pop_savekid_and_opp(void); /* Kid = Char, Guard = Opp */ - -/* Дистанция до соперника в системе Char: >0 впереди, <0 за спиной, - * 999 — разные комнаты (порт char_opp_dist, seg006:2135). */ -int16_t pop_char_opp_dist(void); - -/* Прокрутить последовательность персонажа целиком (load + play_seq + - * save). Звать вместо голого play_seq. */ -void pop_char_set_seq(uint8_t seq_id); /* seq активного персонажа */ -void pop_kid_play(void); -void pop_guard_play(void); - -/* load_fram_det_col (seg006:0144) — перезагрузить cur_frame под АКТИВНОГО - * персонажа (Char) и пересчитать его колонку. Звать сразу после pop_loadkid/ - * pop_loadshad и ДО диспетчера control(), как это делают play_kid_frame / - * play_guard_frame (seg000:1209/1246): cur_frame один на всех, и без этого - * геометрия одного персонажа считается по кадру другого. */ -void pop_load_fram_det_col(void); -/* Только load_frame (seg006:0293), БЕЗ determine_col. Нужен там, где - * оригинал зовёт голый load_frame и пересчёт колонки по x был бы вреден — - * например в jump_through_mirror, где ось отражения берётся из curr_col. */ -void pop_load_frame(void); - -/* Какая таблица кадров у персонажа (seg006:0293): 1 — стража, 0 — Кида. - * Нужна не только load_frame, но и отрисовке — набор атласов обязан - * совпадать с таблицей (тень ходит кадрами и спрайтами КИДА, а дерётся - * кадрами стража). */ -uint8_t pop_frame_tbl_is_guard(int8_t charid, uint8_t frame); - -/* Поля текущего кадра kid_frames[Kid.frame] (pop_map, без дублирования - * таблицы во втором TU). */ -int8_t kid_cur_dx(void); -int8_t kid_cur_dy(void); -uint8_t kid_cur_flags(void); - -/* Сменить последовательность (Kid.curr_seq = kid_seq_off[seq_id]) — единая - * точка для pop_ctrl/pop_map (иначе каждый дублировал бы kid_seqtbl ~2.3КБ). */ -void kid_set_seq(uint8_t seq_id); - -/* Атласы Кида (chtab_2) и его текущий кадр — набор слота POP_CH_KID общей - * отрисовки персонажей (pop_cdraw.c). Наружу отданы как данные, а не через - * аксессоры: читаются раз в кадр из другого банка, где вызов стоил бы - * дороже самого чтения (данные в _DATA видны всем без трамплина). */ -extern atlas_t kidp[]; -extern uint8_t kid_npages; -extern kframe kid_frame; - -#endif diff --git a/applications/SprPoP/src/pop_level.c b/applications/SprPoP/src/pop_level.c deleted file mode 100644 index 4edd4f4..0000000 --- a/applications/SprPoP/src/pop_level.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * pop_level.c — ГОРЯЧАЯ половина уровня: доступ к уже загруженным данным. - * См. pop_level.h (публичный API) и _pop_level.h (деление половин). - * - * Здесь живёт то, что зовут на каждый тайл и из любого банка: чтение - * foretable/backtable, дверные связи, живое состояние стражей. Загрузка - * файла, разбор комнаты и рестарт уровня — в pop_level_cold.c (банк 8): - * они отрабатывают раз на уровень/комнату, и в дефицитном W1 им не место. - * - * Общее состояние (страница, дверные таблицы, стражи) определено ЗДЕСЬ и - * объявлено в _pop_level.h — данные банковых модулей всё равно линкуются в - * общий _DATA, так что холодная половина видит их напрямую. - */ -#include -#include -#include -#include -#include /* gfx_w0_map / gfx_w0_unmap */ - -#include "pop_level.h" -#include "_pop_level.h" - -uint8_t pop_lvl_blk, pop_lvl_page, pop_lvl_ok; -/* Копии таблиц дверных связей в W2 (LINKMAP мутабельна — таймеры кнопок). */ -uint8_t pop_dl1[256], pop_dl2[256]; -/* Живое состояние стражей: в оригинале массивы стражей — часть структуры - * уровня в ОЗУ, и движок их ПЕРЕПИСЫВАЕТ (leave_guard кладёт туда позицию/ - * направление/мастерство, а у мёртвого ещё и curr_seq), благодаря чему, - * вернувшись, находишь труп там же. У нас уровень лежит в EMM-странице - * только на чтение, поэтому держим мутабельную копию в W2: 6 байт/комнату. */ -uint8_t pop_gstate[24 * 6]; - -uint8_t pop_current_level; - -/* set_tile-запись в ЖИВУЮ foretable уровня (порт curr_room_tiles[…] = …). - * В оригинале уровень — обычная структура в ОЗУ, и do_pickup (seg006:1671), - * remove_loose (seg007:0EB8), loose_land (seg007:11E8) правят её насовсем. - * У нас уровень в EMM-странице — пишем прямо туда, поэтому изменение - * переживает выход из комнаты (BUG-LVLSTATE-1). Пишем БАЙТ ЦЕЛИКОМ: - * старшие биты старого тайла (напр. 0x20 «solid loose») к новому типу - * отношения не имеют. */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile) -{ - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return; - gfx_w0_map(pop_lvl_page); - ((uint8_t *)(LVL_DATA_OFF + BP_FG))[(uint16_t)(room - 1) * ROOM_TILES + tilepos] - = tile; - gfx_w0_unmap(); -} - -uint8_t pop_doorlink1(uint8_t i) { return pop_dl1[i]; } -uint8_t pop_doorlink2(uint8_t i) { return pop_dl2[i]; } -void pop_doorlink2_set(uint8_t i, uint8_t v) { pop_dl2[i] = v; } - -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos) -{ - uint8_t v; - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return 0; - gfx_w0_map(pop_lvl_page); - v = (uint8_t)(room_fg_ptr(room)[tilepos] & 0x1F); - gfx_w0_unmap(); - return v; -} - -/* Батч-доступ: смаппить страницу уровня в W0 ОДИН раз, прочитать много - * тайлов через pop_level_tile_raw, размаппить один раз. Экономит N свапов - * окна 0 в горячих циклах (pop_process_trobs звал pop_level_tile на каждый - * trob каждый кадр). Между begin/end НЕЛЬЗЯ рисовать/звать код, которому - * нужно окно 0 в исходном состоянии — только сырые чтения уровня. */ -void pop_level_access_begin(void) { if (pop_lvl_ok) gfx_w0_map(pop_lvl_page); } -void pop_level_access_end(void) { if (pop_lvl_ok) gfx_w0_unmap(); } - -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos) -{ - if (!pop_lvl_ok || room < 1 || room > 24 || tilepos >= ROOM_TILES) return 0; - return (uint8_t)(room_fg_ptr(room)[tilepos] & 0x1F); -} - -void pop_level_room_bg(uint8_t room, uint8_t *out30) -{ - const uint8_t *rbg; - uint8_t i; - if (!out30) return; - if (!pop_lvl_ok || room < 1 || room > 24) { - for (i = 0; i < ROOM_TILES; i++) out30[i] = 0; - return; - } - gfx_w0_map(pop_lvl_page); - rbg = room_bg_ptr(room); - for (i = 0; i < ROOM_TILES; i++) out30[i] = rbg[i]; - gfx_w0_unmap(); -} - -uint8_t pop_room_link(uint8_t room, uint8_t side) -{ - uint8_t v; - if (!pop_lvl_ok || room < 1 || room > 24 || side > 3) return 0; - gfx_w0_map(pop_lvl_page); - v = ((const uint8_t *)(LVL_DATA_OFF + BP_LINKS))[(uint16_t)(room - 1) * 4 + side]; - gfx_w0_unmap(); - return v; -} - -/* leave_guard (seg002:02F5): запомнить состояние стража комнаты. seq - * сохраняем ТОЛЬКО у мёртвого — у живого seq_hi = 0 означает «поднять - * стандартной стойкой», как в оригинале. */ -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead) -{ - uint8_t *g; - if (room < 1 || room > 24) return; - g = pop_gstate + (uint16_t)(room - 1) * 6; - g[GS_TILE] = tile; - g[GS_DIR] = (uint8_t)dir; - g[GS_X] = x; - g[GS_SKILL] = skill; - if (dead) { g[GS_SEQL] = (uint8_t)seq; g[GS_SEQH] = (uint8_t)(seq >> 8); } - else { g[GS_SEQH] = 0; } -} - -uint16_t pop_guard_state_seq(uint8_t room) -{ - const uint8_t *g; - if (room < 1 || room > 24) return 0; - g = pop_gstate + (uint16_t)(room - 1) * 6; - if (g[GS_SEQH] == 0) return 0; /* живой — стандартная стойка */ - return (uint16_t)(g[GS_SEQL] | ((uint16_t)g[GS_SEQH] << 8)); -} - -/* Запомненная X стража комнаты (для трупа: он лежит там, где лёг, а не в - * центре тайла). */ -uint8_t pop_guard_state_x(uint8_t room) -{ - if (room < 1 || room > 24) return 0; - return pop_gstate[(uint16_t)(room - 1) * 6 + GS_X]; -} diff --git a/applications/SprPoP/src/pop_level.h b/applications/SprPoP/src/pop_level.h deleted file mode 100644 index 1031c0e..0000000 --- a/applications/SprPoP/src/pop_level.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * pop_level.h — данные уровня PoP из сырого файла res200N.bin (Фаза L1). - * - * Уровень загружается ОДИН раз в отдельную EMM-страницу (как атласы: - * данные с offset 0x100, ISR-стаб в первых байтах — страница безопасна - * для маппинга в W0). Файл — сырой blueprnt DAT 1.0 (2305 байт, БЕЗ - * checksum-байта; Table 6 спецификации POP-DAT): - * foretable(fg) @0 backtable(bg) @720 door I/II @1440/1696 - * links @1952 (24×{L,R,U,D}) start @2112 ... - * Тайл-код = байт fg & 0x1F (верхние биты — модификатор, пока не нужны); - * bg передаётся как есть. См. applications/PoP/docs/POP-DAT-* . - * - * Рабочая копия ТЕКУЩЕЙ комнаты живёт в обычной памяти (W2) у приложения - * (мутабельная — loose→empty); pop_room_load извлекает её из страницы + - * тонкие срезы соседей для кромок (правый столбец left-комнаты, верхний - * ряд down-комнаты). Страница маппится в W0 только на время извлечения. - */ -#ifndef POP_LEVEL_H -#define POP_LEVEL_H - -#include "pop_qsave.h" - -#include - -/* Загрузить уровень из файла в EMM-страницу. 0 — OK, -1 — ошибка - * (open/alloc/размер). Звать ПОСЛЕ первого atlas_load (pop_bg_load) — - * он снимает страницу ядра DSS для W0-unmap. */ -/* pop_level_load — внутренняя для pop_level_cold.c (грузим по НОМЕРУ) */ -void pop_level_free(void) __banked; - -/* ---- Номер уровня и потабличные различия (levels_plan.md §1) -------- */ - -/* Единый допустимый диапазон ресурсов. 0 зарезервирован под demo (FG7), - * 1..14 — настоящая игра; level 15/copy protection намеренно отсутствует. - * Эти границы используют загрузчик, QuickLoad и отладочная навигация, чтобы - * ни один путь не мог запросить несуществующий res2015.bin. */ -#define POP_LEVEL_DEMO 0 -#define POP_LEVEL_FIRST 1 -#define POP_LEVEL_LAST 14 - -/* Порт current_level (seg000 load_lev_spr: current_level = next_level = - * level). Читают потабличные функции ниже, стражи (HP/тип) и стартовая - * логика. */ -extern uint8_t pop_current_level; -void pop_level_qsave(pop_qs_io_t *io); - -/* Загрузить уровень НОМЕРОМ: освободить страницу прошлого, взять - * `LEVELS\res20NN.bin` относительно каталога EXE и выставить - * pop_current_level. 0 — OK, -1 — файла нет / не влез (тогда - * pop_current_level и страница НЕ тронуты — играем дальше на старом). - * Порт связки load_lev_spr + load_level (seg000:1098/1169). */ -int pop_level_load_num(uint8_t n) __banked; - -/* tbl_entry_pose (data.h:848): 1 — падение внутрь (ур. 1), 2 — вбегание - * (ур. 13), 0 — разворот на месте. Индекс — номер уровня. */ -uint8_t pop_level_entry_pose(uint8_t n) __banked; - -/* tbl_guard_hp (data.h:846) — база HP стража на уровне (get_guard_hp, - * seg002:0044: extrastrength[skill] + tbl_guard_hp[level]). */ -uint8_t pop_level_guard_hp(uint8_t n) __banked; - -/* tbl_guard_type (data.h:844): 0 обычный, 1 толстый, 2 скелет, 3 визирь, - * 4 тень, −1 — стражей на уровне НЕТ (уровень 14). */ -int8_t pop_level_guard_type(uint8_t n) __banked; - -/* tbl_level_type (data.h:840): 0 = dungeon, 1 = palace. Пока читается - * только для контроля — второй тайлсет это levels_plan.md §3. */ -uint8_t pop_level_tileset(uint8_t n) __banked; - -/* Извлечь комнату room (1..24) в массивы приложения (W2): - * fg[30], bg[30] — тайлы комнаты (fg маскирован &0x1F, bg raw); - * lcol_fg[6], lcol_bg[3] — [0..2] правый столбец (col9) комнаты СЛЕВА - * (кромка col0), [3..5] предпоследний (col8) — - * для коллизии на колонке −2 (Kid стоит В шве); - * rcol_fg[6] симметрично (col0 / col1); - * нет комнаты → стена/0; - * below_fg[11] — [0..9] верхний ряд (row0) комнаты СНИЗУ, - * [10] тайл (0,9) комнаты СНИЗУ-СЛЕВА («стена - * вниз»); нет комнаты → стена. - * 0 — OK, -1 — уровень не загружен / room вне диапазона. */ -int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg, - uint8_t *lcol_fg, uint8_t *lcol_bg, - uint8_t *rcol_fg, uint8_t *rcol_bg, uint8_t *below_fg) __banked; - -/* Связь комнаты по стороне (0=L,1=R,2=U,3=D) → номер соседней (1..24) или - * 0, если стороны нет. Для переходов между комнатами (L2/L3). */ -uint8_t pop_room_link(uint8_t room, uint8_t side); - -/* Тайл-код (fg & 0x1F) по комнате (1..24) и позиции tilepos (0..29, - * row*10+col); вне диапазона → 0 (empty). Для trob-диспетчера (pop_trob): - * тип анимируемого тайла в ЛЮБОЙ комнате, не только текущей. */ -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos); - -/* Записать тайл в ЖИВУЮ foretable уровня (порт curr_room_tiles[tp] = tile: - * do_pickup / remove_loose / loose_land). Изменение персистентно — уровень - * лежит в ОЗУ-странице, а не в ПЗУ, — то есть переживает выход из комнаты, - * как в оригинале. Отменяется только pop_level_reset_tiles. */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile); - -/* Рестарт уровня: вернуть ВСЕ тайлы в исходное (порт load_level, который - * play_level зовёт на каждой итерации — в т.ч. после смерти Кида). */ -void pop_level_reset_tiles(void) __banked; - -/* Рестарт уровня: вернуть ВСЕХ стражей (тот же load_level + pos_guards). - * Убитый страж после respawn снова жив — как в оригинале. */ -void pop_level_reset_guards(void) __banked; - -/* Батч-доступ к странице уровня (один map/unmap окна 0 на много чтений). - * Между begin/end — только pop_level_tile_raw, без рисования. */ -void pop_level_access_begin(void); -void pop_level_access_end(void); -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos); - -/* Скопировать backtable (модификаторы) комнаты room в out[30]. Исходное - * состояние per-room modifier (openness ворот, состояние пик и т.п.) для - * ленивой инициализации room_modif в pop_trob. Вне диапазона → нули. */ -void pop_level_room_bg(uint8_t room, uint8_t *out30); - -/* Таблицы связей дверей (LINKLOC@1440 / LINKMAP@1696, по 256 Б). Копируются - * в W2-RAM при загрузке (LINKMAP мутабельна — таймеры кнопок). i — индекс - * цепочки (модификатор кнопки). Декод — в pop_trob (get_doorlink_*). */ -uint8_t pop_doorlink1(uint8_t i); -uint8_t pop_doorlink2(uint8_t i); -void pop_doorlink2_set(uint8_t i, uint8_t v); - -/* Ряд приземления падающего loose-куска в колонке col комнаты room: первый - * НЕ-пустой тайл сверху вниз; возвращает его ряд, если это floor (→ debris), - * иначе -1 (пролетел/крушение о стену). */ -int8_t pop_room_col_landing(uint8_t room, uint8_t col) __banked; - -/* Стартовая позиция уровня (блок @2112): комната / поза / направление. */ -/* Страж комнаты: 1 = есть (заполнит tile/dir/color/skill), 0 = нет. - * Порт enter_guard (seg002:0112). */ -/* leave_guard (seg002:02F5): запомнить состояние стража комнаты в ЖИВОЙ - * копии массивов уровня. dead != 0 — сохранить и последовательность, тогда - * при возврате в комнату страж поднимется трупом там же, где лёг. - * tile == 30 (или больше) — «стража в комнате больше нет». */ -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead); - -/* Последовательность запомненного стража (0 — поднимать стандартной - * стойкой, как у живого). */ -uint16_t pop_guard_state_seq(uint8_t room); -uint8_t pop_guard_state_x(uint8_t room); - -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked; - -/* tbl_level_type (SDLPoP data.h:840) — какой тайлсет у уровня: - * 0 подземелье, 1 дворец. Дворцовые: 4, 5, 6, 10, 11, 14. Индекс — - * НОМЕР уровня; элемент 0 — демо-уровень. Оригинал по нему выбирает и - * .DAT окружения (tbl_envir_ki, seg000:1108), и десяток веток отрисовки - * в seg008, и графику стража (GUARD1/GUARD2). */ -uint8_t pop_level_type(void) __banked; - -uint8_t pop_level_start_room(void) __banked; -uint8_t pop_level_start_pos(void) __banked; -int8_t pop_level_start_dir(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_level_cold.c b/applications/SprPoP/src/pop_level_cold.c deleted file mode 100644 index 0ecfb4a..0000000 --- a/applications/SprPoP/src/pop_level_cold.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * pop_level_cold.c — ХОЛОДНАЯ половина уровня (БАНК 8). Контракт и деление - * половин — в _pop_level.h. - * - * Здесь всё, что отрабатывает раз на уровень (чтение файла res200N.bin, - * рестарт тайлов/стражей, потабличные различия) или раз на комнату (разбор - * комнаты в рабочие массивы, посадочный ряд колонки, страж комнаты). Цена - * выноса — один трамплин на вызов; в кадре этих вызовов ноль. - * - * Формат — порт blueprnt DAT 1.0 (Table 6 POP-DAT). - */ -#include -#include -#include -#include -#include /* gfx_w0_map / gfx_w0_unmap */ -#include "pop_level.h" -#include "_pop_level.h" -#include "pop_geom.h" /* pop_x_bump / FIRST_ONSCREEN_COLUMN — pos_guards */ -#include "_pop_file.h" - -/* Низкоуровневое чтение через W3 выполняет резидентный bank_load_file(); - * остальная одноразовая подготовка уровня безопасно остаётся в банке 8. */ - -void pop_level_free(void) __banked -{ - if (pop_lvl_ok) { mem_free_block(pop_lvl_blk); pop_lvl_ok = 0; } -} - -/* ---- Потабличные различия уровней ------------------------------------ */ - -/* Таблицы из SDLPoP data.h:840..848, индекс = номер уровня (0 = demo). - * Хвоста level 15 здесь намеренно нет: настоящий маршрут заканчивается 14. - * Так диапазон данных и диапазон загрузчика не могут разъехаться. */ -static const uint8_t tbl_entry_pose[POP_LEVEL_LAST + 1] = - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }; -static const uint8_t tbl_guard_hp[POP_LEVEL_LAST + 1] = - { 4, 3, 3, 3, 3, 4, 5, 4, 4, 5, 5, 5, 4, 6, 0 }; -static const int8_t tbl_guard_type[POP_LEVEL_LAST + 1] = - { 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 4, 3, -1 }; -/* tbl_level_type (SDLPoP data.h:840): 0 — подземелье, 1 — дворец. По нему - * расходятся не только атласы, но и ветки отрисовки (seg008), кладка стены - * (wall_pattern) и модификатор пустой клетки от упавшей плиты - * (remove_loose, seg007:0EB8). */ -static const uint8_t tbl_level_type[POP_LEVEL_LAST + 1] = - { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1 }; - -uint8_t pop_level_entry_pose(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_entry_pose[n] : 0; } -uint8_t pop_level_guard_hp(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_guard_hp[n] : 3; } -int8_t pop_level_guard_type(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_guard_type[n] : -1; } -uint8_t pop_level_tileset(uint8_t n) __banked { return n <= POP_LEVEL_LAST ? tbl_level_type[n] : 0; } -uint8_t pop_level_type(void) __banked { return pop_level_tileset(pop_current_level); } - -static int level_read_file(const char *path) -{ - uint8_t blk, page; - uint16_t i; - int n; - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - POP_PATH_CALL(n, bank_load_file(page,LVL_DATA_OFF,path, - 16384-LVL_DATA_OFF)); - if (n < (int)MIN_SIZE) { mem_free_block(blk); return -1; } - gfx_w0_page_prepare(page); - gfx_w0_map(page); - for (i=0; i<256; i++) { - pop_dl1[i]=((const uint8_t *)LVL_DATA_OFF)[BP_LINKLOC+i]; - pop_dl2[i]=((const uint8_t *)LVL_DATA_OFF)[BP_LINKMAP+i]; - } - for (i=0; i<24u*ROOM_TILES; i++) - ((uint8_t *)LVL_PRISTINE_OFF)[i]= - ((const uint8_t *)(LVL_DATA_OFF+BP_FG))[i]; - gfx_w0_unmap(); - pop_lvl_blk=blk; pop_lvl_page=page; pop_lvl_ok=1; - pop_gstate_init(); - return 0; -} - -int pop_level_load_num(uint8_t n) __banked -{ - /* Имена патчим на месте, а не через sprintf: printf-семейство тянет в - * резидент W1 форматтер, которого здесь больше негде применить. */ - static char pri[] = "LEVELS\\res2000.bin"; /* цифры — [12],[13] */ - uint8_t saved_blk = pop_lvl_blk, saved_page = pop_lvl_page, saved_ok = pop_lvl_ok; - - if (n > POP_LEVEL_LAST) return -1; - pri[12] = (char)('0' + n / 10); - pri[13] = (char)('0' + n % 10); - - /* Старую страницу отпускаем ТОЛЬКО после успешной загрузки новой: - * level_read_file сам аллоцирует страницу, и если файла нет — остаёмся - * на текущем уровне вместо падения в пустой уровень. */ - pop_lvl_ok = 0; /* чтобы level_load_path не мешался */ - if (level_read_file(pri) != 0) { - pop_lvl_blk = saved_blk; pop_lvl_page = saved_page; pop_lvl_ok = saved_ok; - return -1; - } - if (saved_ok) mem_free_block(saved_blk); - pop_current_level = n; - return 0; -} - -int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg, - uint8_t *lcol_fg, uint8_t *lcol_bg, - uint8_t *rcol_fg, uint8_t *rcol_bg, uint8_t *below_fg) __banked -{ - const uint8_t *rfg, *rbg, *lnk; - uint8_t left, right, down, i; - - if (!pop_lvl_ok || room < 1 || room > 24) return -1; - - gfx_w0_map(pop_lvl_page); - rfg = room_fg_ptr(room); - rbg = room_bg_ptr(room); - lnk = (const uint8_t *)(LVL_DATA_OFF + BP_LINKS) + (uint16_t)(room - 1) * 4; - - for (i = 0; i < ROOM_TILES; i++) { - fg[i] = (uint8_t)(rfg[i] & 0x1F); /* тип тайла (верх. биты — модиф., пока не нужны) */ - bg[i] = rbg[i]; /* backtable как есть */ - } - - left = lnk[0]; /* L */ - right = lnk[1]; /* R */ - down = lnk[3]; /* D */ - - /* leftcol: правый столбец (col9) комнаты СЛЕВА, строки 0..2 (кромка col0), - * а в [3..5] — ПРЕДпоследний (col8). Вторая колонка нужна коллизии: Kid, - * стоящий В шве (curr_col = −1), смотрит вперёд на колонку −2, и без неё - * там оказывалась мнимая стена (get_tile → TILE_WALL), которая выпихивала - * его сквозь решётку. Оригинал резолвит любую колонку через - * find_room_of_tile (seg006:005D). */ - if (left >= 1 && left <= 24) { - const uint8_t *lf = room_fg_ptr(left); - const uint8_t *lb = room_bg_ptr(left); - for (i = 0; i < 3; i++) { - lcol_fg[i] = (uint8_t)(lf[i * 10 + 9] & 0x1F); - lcol_fg[3 + i] = (uint8_t)(lf[i * 10 + 8] & 0x1F); - lcol_bg[i] = lb[i * 10 + 9]; - } - } else { - for (i = 0; i < 3; i++) { lcol_fg[i] = 20; lcol_fg[3 + i] = 20; lcol_bg[i] = 0; } - } - - /* rightcol: левый столбец (col0) комнаты СПРАВА, строки 0..2 (кромка col9: - * коллизия на правом шве + переход вправо) */ - if (right >= 1 && right <= 24) { - const uint8_t *rf = room_fg_ptr(right); - const uint8_t *rb = room_bg_ptr(right); - for (i = 0; i < 3; i++) { - rcol_fg[i] = (uint8_t)(rf[i * 10 + 0] & 0x1F); - rcol_fg[3 + i] = (uint8_t)(rf[i * 10 + 1] & 0x1F); /* колонка 11 (см. выше) */ - rcol_bg[i] = rb[i * 10 + 0]; - } - } else { - for (i = 0; i < 3; i++) { rcol_fg[i] = 20; rcol_fg[3 + i] = 20; rcol_bg[i] = 0; } - } - - /* belowrow: верхний ряд (row0) комнаты снизу — ОДИННАДЦАТЬ байт. - * [0..9] — колонки 0..9 комнаты снизу; [10] — тайл (0,9) комнаты - * ПО ДИАГОНАЛИ СНИЗУ-СЛЕВА (room_BL у оригинала). Одиннадцатый нужен - * тайлу (2,0): его «сосед снизу-слева» — это колонка −1 ряда 3, то есть - * чужая комната, и load_rowbelow (seg008:368) резолвит её именно так, - * с дефолтом «стена» только когда такой комнаты НЕТ. Раньше мы клали - * туда стену БЕЗУСЛОВНО, и в пустом углу рисовался клин кладки - * (BUG-SEAM-WEDGE-1, ур. 3 комн. 18). */ - if (down >= 1 && down <= 24) { - const uint8_t *df = room_fg_ptr(down); - uint8_t dl = ((const uint8_t *)(LVL_DATA_OFF + BP_LINKS))[(down - 1) * 4]; - for (i = 0; i < 10; i++) below_fg[i] = (uint8_t)(df[i] & 0x1F); - below_fg[10] = (dl >= 1 && dl <= 24) - ? (uint8_t)(room_fg_ptr(dl)[9] & 0x1F) - : 20; /* кромка уровня */ - } else { - /* Комнаты снизу НЕТ. Оригинал (load_rowbelow, seg008:368) в этом - * случае подставляет РАЗНЫЕ кромки: колонкам 1..9 — `tiles_0_empty`, - * и только левому краю (колонка 0, тайл из room_BL) — `tiles_20_wall`. - * У нас тут стояла стена на всё, и её грань (topright стены) лезла - * жёлтыми треугольниками под пустые тайлы нижнего ряда — видно в - * шахте падения, уровень 6 комната 3 (BUG-BELOWROW-WALL). */ - for (i = 0; i < 10; i++) below_fg[i] = 0; /* tiles_0_empty */ - below_fg[10] = 20; /* левая кромка уровня */ - } - - gfx_w0_unmap(); - return 0; -} - -int8_t pop_room_col_landing(uint8_t room, uint8_t col) __banked -{ - const uint8_t *rf; - int8_t row, res = -1; - if (!pop_lvl_ok || room < 1 || room > 24 || col > 9) return -1; - gfx_w0_map(pop_lvl_page); - rf = room_fg_ptr(room); - for (row = 0; row < 3; row++) { /* кусок пролетает пустые ряды */ - uint8_t t = (uint8_t)(rf[row * 10 + col] & 0x1F); - if (t == 0) continue; /* empty — дальше вниз */ - /* Набор площадок — дословно switch из loose_land (seg007:11E8): - * пол, пика, обе кнопки, зелье и оба факела. На всём остальном - * (стена, ворота, колонна) кусок просто исчезает. Раньше здесь - * стоял только пол, и плита, падавшая на КНОПКУ в комнате снизу, - * пропадала бесследно: ни щебня, ни нажатия (уровень 4, плита - * 16(1,1) -> кнопка 17(0,1), открывающая ворота 23(0,9)). */ - if (t == 1 || t == 2 || t == 6 || t == 10 || - t == 15 || t == 19 || t == 30) res = row; - break; /* первый не-пустой тайл — стоп */ - } - gfx_w0_unmap(); - return res; -} - -/* Рестарт уровня (порт load_level из цикла play_level, seg003:57): вернуть - * в исходное состояние ВСЁ, что игра правит в данных уровня. - * - * Это foretable (из эталонной копии — сами данные мы правим на месте) И - * ТАБЛИЦА СВЯЗЕЙ. Про вторую легко забыть, потому что мутирует в ней ровно - * одно поле — таймер нажатия кнопки в младших битах LINKMAP, — но забыть - * дорого: `pop_tile_code_drawn` рисует кнопку НАЖАТОЙ, пока таймер > 1, и - * ненулевой остаток показывает её нажатой с первого кадра уровня. - * - * Оставить такой остаток особенно легко из died_on_button: он ставит таймер - * в 5 и заводит trob кнопки, но тайл к этому моменту УЖЕ пол — trob умирает - * в первом же обходе (`default: type = -1`), не успев ни разу уменьшить - * таймер. У оригинала ровно то же самое, просто там load_level перечитывает - * весь файл целиком, и вопроса не возникает (найдено пользователем - * 2026-08-18: уровень 7, комната 3, кнопка (2,1) после первого же респавна). - * - * LINKMAP в странице уровня остаётся ЭТАЛОННЫМ: игра правит только - * ОЗУ-копию pop_dl2 (pop_doorlink2_set), обратно в страницу не пишет никто — - * поэтому отдельная pristine-копия, как у foretable, тут не нужна. */ -void pop_level_reset_tiles(void) __banked -{ - uint16_t i; - uint8_t *dst; - const uint8_t *src; - if (!pop_lvl_ok) return; - gfx_w0_map(pop_lvl_page); - dst = (uint8_t *)(LVL_DATA_OFF + BP_FG); - src = (const uint8_t *)LVL_PRISTINE_OFF; - for (i = 0; i < 24u * ROOM_TILES; i++) dst[i] = src[i]; - src = (const uint8_t *)(LVL_DATA_OFF + BP_LINKMAP); - for (i = 0; i < 256; i++) pop_dl2[i] = src[i]; - gfx_w0_unmap(); -} - -/* Рестарт уровня, часть вторая (тот же load_level + pos_guards, seg003:83): - * стражи — такая же часть данных уровня, как тайлы, и перезагрузка файла - * возвращает их всех. Убитый до смерти Кида страж после respawn снова жив - * и стоит на исходном тайле; забывается и запомненная поза трупа - * (guards_seq_hi = 0 -> «поднять стандартной стойкой»). */ -void pop_level_reset_guards(void) __banked -{ - if (!pop_lvl_ok) return; - pop_gstate_init(); -} - -void pop_gstate_init(void) __banked -{ - const uint8_t *p = (const uint8_t *)LVL_DATA_OFF; - uint8_t r; - gfx_w0_map(pop_lvl_page); - for (r = 0; r < 24; r++) { - uint8_t *g = pop_gstate + (uint16_t)r * 6; - g[GS_TILE] = p[BP_GTILE + r]; - g[GS_DIR] = p[BP_GDIR + r]; - g[GS_X] = p[BP_GX + r]; - g[GS_SKILL] = p[BP_GSKILL + r]; - /* pos_guards (seg003:0913), сразу после load_level: X стража - * ПЕРЕСЧИТЫВАЕТСЯ из колонки тайла, а то, что лежит в файле, оригинал - * выбрасывает (в комнате 24 уровня 8 там, например, 255). Дальше X - * владеет leave_guard, и именно она — единственный носитель КОЛОНКИ: - * в guards_tile leave_guard кладёт get_tilepos(0, row), то есть - * колонку обнуляет намеренно. */ - if (g[GS_TILE] < 30) - g[GS_X] = (uint8_t)(pop_x_bump[(g[GS_TILE] % 10) + FIRST_ONSCREEN_COLUMN] - + TILE_SIZEX); - /* guards_seq_lo/hi в ФАЙЛЕ не используются — там 0xFF во всех - * комнатах (оригинал чистит их в reset_level_unused_fields). - * Осмысленное значение туда кладёт только leave_guard, поэтому - * стартуем нулями: 0 = «поднимать стандартной стойкой». - * Без этого в интерпретатор уходил curr_seq = 0xFFFF и он вис. */ - g[GS_SEQL] = 0; - g[GS_SEQH] = 0; - } - gfx_w0_unmap(); -} - -/* Страж комнаты (enter_guard, seg002:0112 + pos_guards, seg003). Возврат - * 0 = стража в комнате нет (tile >= 30). X оригинал пересчитывает из - * колонки (pos_guards), поэтому guards_x из файла не читаем. */ -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked -{ - const uint8_t *g; - uint8_t t; - if (!pop_lvl_ok || room < 1 || room > 24) return 0; - /* Тайл/направление/мастерство — из ЖИВОЙ копии (её правит - * pop_guard_state_save); цвет статичен, его читаем со страницы. */ - g = pop_gstate + (uint16_t)(room - 1) * 6; - t = g[GS_TILE]; - if (t < 30) { - *tile = t; - *dir = (int8_t)g[GS_DIR]; - *skill = g[GS_SKILL]; - gfx_w0_map(pop_lvl_page); - *color = (uint8_t)(((const uint8_t *)LVL_DATA_OFF)[BP_GCOLOR + room - 1] & 0x0F); - gfx_w0_unmap(); - } - return (uint8_t)(t < 30); -} - -/* ---- Стартовая позиция уровня ---------------------------------------- */ - -static uint8_t start_byte(uint16_t off) -{ - uint8_t v; - if (!pop_lvl_ok) return 0; - gfx_w0_map(pop_lvl_page); - v = ((const uint8_t *)(LVL_DATA_OFF))[off]; - gfx_w0_unmap(); - return v; -} - -uint8_t pop_level_start_room(void) __banked { return start_byte(BP_START + 0); } -uint8_t pop_level_start_pos(void) __banked { return start_byte(BP_START + 1); } -int8_t pop_level_start_dir(void) __banked { return (int8_t)start_byte(BP_START + 2); } diff --git a/applications/SprPoP/src/pop_level_qsave.c b/applications/SprPoP/src/pop_level_qsave.c deleted file mode 100644 index 02c5e6b..0000000 --- a/applications/SprPoP/src/pop_level_qsave.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Сериализация уровня для QuickSave (банк 8). - * - * Код выполняется только по F6/F9 и вынесен из горячего резидентного - * pop_level.c. Данные уровня и снимка используют одно окно W0, поэтому - * foretable переносится небольшими блоками через стековый буфер W2. - */ -#include -#include "pop_level.h" -#include "_pop_level.h" - -void pop_level_qsave(pop_qs_io_t *io) -{ - uint8_t tmp[30]; - uint16_t off; - pop_qs_bytes(io, pop_dl1, sizeof(pop_dl1)); - pop_qs_bytes(io, pop_dl2, sizeof(pop_dl2)); - pop_qs_bytes(io, pop_gstate, sizeof(pop_gstate)); - if (!pop_lvl_ok) { io->failed = 1; return; } - /* W0 одновременно не может держать страницу уровня и страницу снимка. */ - for (off = 0; off < 24u * ROOM_TILES; off += sizeof(tmp)) { - uint8_t i; - if (!io->reading || io->apply) { - gfx_w0_map(pop_lvl_page); - if (!io->reading) - for (i=0; ireading && io->apply && !io->failed) { - gfx_w0_map(pop_lvl_page); - for (i=0; i check_on_floor(): кадр с флагом - * FRAME_NEEDS_FLOOR (0x40), под персонажем не floor -> start_fall(); - * стена -> in_wall(); - * freefall (action 4) -> do_fall(): fall_y-ускорение (в fall_accel/speed), - * достиг pop_y_land[curr_row+1] -> land()/inc_curr_row. - * - * Координатная система PoP: экран.left = 58, тайл = 14 ед. (TILE_SIZEX); - * col = (xpos-58)/14 (округл. вниз), xl = остаток; get_tile_div_mod_m7 = - * div_mod(xpos-7). Карта: fg[row*10+col] & 0x1F; col<0/>9,row<0/>2 = стена. - * - * MVP: без spike/HP/grab/gate — падение + мягкое/среднее приземление. - * Бег В стену (check_bumped) и осторожный шаг у края (get_edge_distance) — - * следующим шагом. - */ -#include -#include /* memcpy = LDIR: цикл на C тут стоил ~390 тактов на байт */ -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_ctrl.h" /* pop_ctrl_shift_held() — для check_grab */ -#include "pop_sfx.h" /* звуковые эффекты (sound_plan.md) */ -#include "pop_geom.h" /* общая геометрия (x_bump/y_land/y_to_row) */ -#include "pop_tile.h" /* POP_TILE_DIV/MOD — деление на ширину тайла таблицей */ -#include "pop_redraw.h" /* пометки перерисовки (порт set_redraw_*) */ -/* pop_bg нужен ТОЛЬКО падающему куску (mob): spawn/tick/pos — это движущийся - * ОБЪЕКТ, а не перерисовка тайла (в оригинале он и живёт отдельно: mobs + - * draw_moving). Из-за него pop_loose_tick — единственная функция модуля, - * которую нельзя звать из __banked-кода; вся коллизия/физика/предметы, то - * есть то, что понадобится стражам, чиста от графики. Разделение mob на - * логику и отрисовку — задел следующей фазы. */ -#include "pop_bg.h" -#include "pop_state.h" -#include "pop_trob.h" /* room_modif + trob-список (пики/ворота) */ -#include "pop_level.h" /* pop_level_start_room — вход в дверь уровня */ -#include "pop_guard.h" /* SWORD_2_DRAWN — ветка приземления с мечом */ -#include "pop_tune.h" /* POP_ENABLE_JUMP_GRAB и прочие настройки */ -#include "pop_cdraw.h" /* габарит кадра персонажа (pop_cd) */ - -/* Габарит последнего нарисованного кадра АКТИВНОГО персонажа (char_width_half - * и char_top_y в set_char_collision, seg006:0723). У каждого слота он свой: - * до DRAW-CHAR отрисовка была продублирована, метрики Кида лежали отдельно, и - * коллизия СТРАЖА считалась по ширине спрайта КИДА. Отставание на кадр — - * как в оригинале (cur_frame берётся тем же кадром, что рисуется). */ -#define CD_ACT (&pop_cd[Char.charid == CHARID_0_KID ? POP_CH_KID : POP_CH_OPP]) - -/* ---- Тайлы / действия / seq id (подмножество PoP) ------------------ */ -#define TILE_EMPTY 0 -#define TILE_GATE 4 -#define TILE_DOORTOP_FLOOR 7 /* tapestry (пол сверху) */ -#define TILE_DOORTOP 12 /* tapestry top */ -#define TILE_MIRROR 13 -#define TILE_CHOMPER 18 -#define TILE_WALL 20 -#define TILE_LOOSE 11 /* проваливающийся пол */ -#define TILE_DEBRIS 14 /* щебень (упавший loose) */ -#define TILE_TORCH 19 /* факел */ -#define TILE_TORCH_DEBRIS 30 /* факел + щебень (loose_land) */ -#define TILE_SPIKE 2 /* пики */ -#define TILE_CLOSER 6 /* кнопка-закрывалка (DROP) */ -#define TILE_STUCK 5 /* заклиненная кнопка (died_on_button) */ -#define TILE_POTION 10 /* зелье */ -#define TILE_SWORD 22 /* меч на полу */ -#define TILE_OPENER 15 /* кнопка-открывалка (RAISE, 0x0F) */ -#define TILE_LEVELDOOR_LEFT 16 /* ЛЕВАЯ половина двери уровня (на ней modif) */ -#define ACT_STAND 0 -#define ACT_RUNJUMP 1 -#define ACT_HANGCLIMB 2 -#define ACT_MIDAIR 3 -#define ACT_FREEFALL 4 -#define ACT_BUMPED 5 -#define ACT_HANGSTRAIGHT 6 -#define ACT_TURN 7 - -#define SEQ_7_FALL 7 /* stepfall (stand/run/step/crouch) */ -#define SEQ_17_SOFT_LAND 17 -#define SEQ_18_FALL_STANDJUMP 18 -#define SEQ_19_FALL 19 /* stepfall2 (run frames 9/13) */ -#define SEQ_20_MEDIUM_LAND 20 -#define SEQ_21_FALL_RUNJUMP 21 -#define SEQ_45_BUMPFALL 45 /* удар В ВОЗДУХЕ: отскок и падение */ -#define SEQ_46_HARDBUMP 46 /* удар после прыжка: отскок + ПРИСЕДАНИЕ */ -#define SEQ_47_BUMP 47 /* удар в стену: dx(-4) отскок + 50-52 + stand */ -/* K4 — зацеп/вис/подтягивание/спуск */ -#define SEQ_8_GRAB_STRAIGHT 8 /* прыжок вверх и зацеп (прямо) */ -#define SEQ_9_GRAB_WHILE_JUMPING 9 /* зацеп ПРЯМО В ПРЫЖКЕ (улучшение SDLPoP) */ -#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */ -#define SEQ_16_JUMP_UP_AND_GRAB 16 /* прыжок вверх и зацеп (нет пола сзади)*/ -#define SEQ_24_GRAB_FORWARD 24 /* прыжок вверх и зацеп (пол сзади) */ -#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */ -#define SEQ_10_CLIMB_UP 10 /* подтягивание из виса */ -#define SEQ_11_RELEASE_LEDGE_LAND 11 /* сорваться и встать (конец спуска) */ -#define SEQ_15_GRAB_LEDGE_MIDAIR 15 /* зацеп за уступ в падении */ -#define SEQ_23_RELEASE_LEDGE_FALL 23 /* отпустить уступ и падать */ -#define SEQ_68_CLIMB_DOWN 68 /* спуск через зацеп (не приседание) */ -#define SEQ_73_CLIMB_UP_TO_GATE 73 /* подъём к закрытой калитке */ -#define SEQ_51_SPIKED 51 /* напороться на пики (смерть) */ -#define SEQ_54_CHOMPED 54 /* попасть в челюсти чомпера (смерть) */ -#define SEQ_22_CRUSHED 22 /* разбиться при падении (смерть) */ -#define SEQ_63_ACTIVE_AFTER_FALL 63 /* стойка С МЕЧОМ после приземления */ -#define SEQ_65_BUMP_FWD_SWORD 65 /* стража прижали к стене (с мечом) */ -#define SEQ_81_FIGHTFALL 81 /* fightfall: падение из боевой стойки */ -#define SEQ_82_GUARD_PUSHED_OFF 82 /* стража спихнули с уступа */ -#define SEQ_83_GUARD_FALL 83 /* страж сам шагнул в провал с мечом */ - -#define TILE_FLOOR 1 -#define FRAME_109_CROUCH 109 -#define FRAME_178_CHOMPED 178 - -/* Кадры анимации для check_spiked (seg006:0658). */ -#define FRAME_7_RUN 7 -#define FRAME_26_STANDJUMP_LAND 26 -#define FRAME_34_RUNJUMP_START 34 -#define FRAME_43_RUNJUMP_LAND 43 - -#define FRAME_NEEDS_FLOOR 0x40 -#define FRAME_WEIGHT_X 0x1F -#define TILE_RIGHTX 13 -#define SCREENSPACE_X 58 -#define FALL_ACCEL 3 -#define FALL_MAX 33 -/* Перо (seg006:057C, types.h:1435): ускорение и потолок скорости падения - * под зельем медленного падения. */ -#define FALL_ACCEL_FEATHER 1 -#define FALL_MAX_FEATHER 4 - -#define TILE_MIDX 7 -#define FRAME_THIN 0x20 - - -static const int8_t dir_front[2] = {-1, 1}; /* [dir+1]: dir=-1->-1, 0->+1 */ -static const int8_t dir_behind[2] = {1, -1}; /* [dir+1]: назад по направлению */ -/* wall_type(tile): gate/doortop=1, mirror=2, chomper=3, wall=4, иначе 0. */ -static const int8_t wall_dl[6] = {0, 10, 0, -1, 0, 0}; /* wall_dist_from_left */ -static const int8_t wall_dr[6] = {0, 0, 10, 13, 0, 0}; /* wall_dist_from_right */ -static int8_t g_infrontx; /* колонка «перед персонажем» (set в get_tile_infrontof) */ - -/* ---- Карта комнаты ------------------------------------------------- */ -uint8_t pop_fell_out; /* 1 = Kid пересёк НИЖНЮЮ границу (см. pop_map.h) */ -uint8_t pop_leave_dir; /* уход вбок/вверх: 0=нет; 1=left,2=right,3=up (side+1) */ -uint8_t pop_leave_timer; /* exit_room_timer (seg002): >0 = leave заблокирован N кадров после входа в комнату */ -uint8_t pop_loose_fell; /* 0=нет; иначе tilepos+1 упавшего loose (кусок улетел вниз) */ -uint8_t pop_kid_dead; /* 1 = Kid мёртв (напоролся на пики и т.п.) */ -uint8_t pop_kid_hurt; /* 1 = в этом кадре убавилось HP → «брызги» */ - -/* is_screaming (seg005:38): крик падения звучит ОДИН раз за полёт, а не - * каждый кадр. Сбрасывается там же, где у оригинала: приземление (land), - * зацеп за карниз (check_grab) и постановка на старт (set_start_pos). */ -static uint8_t is_screaming; -uint8_t hitp_curr; /* текущее HP (0 = мёртв); pop_kid_hp_reset ставит старт */ -uint8_t hitp_max; /* стартовое HP Кида (для индикатора) */ -/* hitp_beg_lev (seg003 init_game/play_level_2): HP, с которым НАЧАТ уровень. - * Смерть/рестарт уровня возвращают ровно его (do_startpos: hitp_max = - * hitp_curr = hitp_beg_lev), а по ПРОХОЖДЕНИИ уровня он подтягивается к - * достигнутому максимуму (hitp_beg_lev = hitp_max) — так «жизнь» из большой - * склянки переносится на следующий уровень, а из мёртвых прогонов — нет. - * Стартовое значение (custom->start_hitp = 3) ставит main через - * pop_kid_hp_newgame — инициализатором нельзя: модуль банкованный. */ -uint8_t hitp_beg_lev; -/* Дельта HP Кида за кадр (порт hitp_delta). Её ставят боёвка (guards.c) и - * физика (пики/падение/плита на голову — через общий pop_take_hp), а - * применяет pop_do_delta_hp раз в кадр, как в оригинале. Раньше путь - * пик/падения правил hitp_curr напрямую; с переходом физики на Char это - * стало невозможно — урон должен уметь уходить и стражу. */ -int8_t hitp_delta; -static uint8_t g_room; /* номер ТЕКУЩЕЙ комнаты (для room_modif пик/ворот) */ -static uint8_t *g_fg; /* fg[30], row*10+col (МУТАБЕЛЬНАЯ — loose→empty) */ -static uint8_t g_curr_tile; /* = curr_tile2: тайл последнего get_tile */ -static uint8_t g_obj_xl; /* позиция внутри тайла (get_tile_div_mod) */ -static uint8_t grab_timer; /* после зацепа (12): блокирует climb-up */ -/* is_feather_fall (seg000:15F8): кадров, пока действует зелье медленного - * падения. У оригинала это флаг + счётчик тиков со сроком по звуку; у нас - * просто обратный отсчёт кадров (POP_FEATHER_FRAMES, pop_tune.h). Публичный: - * его читают play_seq (опкод JMP_IF_FEATHER, pop_kid.c) и приложение. */ -uint8_t pop_feather; -/* upside_down (seg000:15E9 toggle_upside): 1 — картинка перевёрнута вверх - * ногами (зелье типа 4, уровень 9). Держим ЗДЕСЬ, рядом с пером: оба - * ставятся из одной ветки proc_get_object и оба сбрасываются стартом - * уровня. Читает отрисовка (банки 2/4/7) и главный цикл — отсюда - * публичность. Смерть Кида снимает эффект (seg000:1224). */ -uint8_t pop_upside; -/* ЖЕЛАЕМОЕ состояние переворота. Зелье и смерть Кида пишут только сюда, а - * pop_upside переключает главный цикл — ОДИН раз, в начале кадра, вместе с - * перерисовкой (pop_flip_screen). - * - * Зачем разделение. Зелье выпивается из play_seq, то есть В СЕРЕДИНЕ кадра: - * переключи флаг сразу — и остаток кадра рисуется уже зеркально поверх ещё - * неперевёрнутого фона. Хуже всего пламя факела: оно ЗАПЕКАЕТСЯ в ОЗУ-копию - * (pop_torch_draw), поэтому кадр, положенный в зеркальную позицию на старом - * фоне, оставался там навсегда — по комнате рассыпались лишние языки огня - * (нашёл пользователь на глотке зелья; чит U этим не страдал, потому что - * стоит в начале кадра). */ -uint8_t pop_upside_want; -/* need_redraw_because_flipped (seg000:15E9/1226): состояние ОТЛИЧАЕТСЯ от - * желаемого — главный цикл применит его и снимет флаг. */ -uint8_t pop_upside_dirty; -/* Состояние edge-триггера бампа — массивы флагов перекрытия по колонкам - * (порт prev_coll_flags/curr_row_coll_flags, seg004); объявлены ниже, рядом - * с check_collisions. Сброс при смене комнаты — coll_prev_row. */ -static void pop_coll_invalidate(void); -/* Связи комнаты (0 = нет соседа) + ЦЕЛИКОМ fg соседей слева и справа - * (g_lcol/g_rcol, раскладка комнаты [row*10 + col]). Оригинал резолвит - * любую колонку через find_room_of_tile (seg006:005D), гуляя по roomlinks; - * у нас уровень лежит в EMM-странице, маппить её на каждый get_tile (горячий - * путь физики) дорого — поэтому соседи кэшируются на входе в комнату. - * - * Почему именно ВСЯ комната, а не кромочные колонки: col считается из x - * персонажа (floor((x − 7 − 58)/14)), и на всём диапазоне x 0..255 даёт - * col от −5 до 13. Кромок не хватало, а «за кэшем» get_tile отдавал стену — - * мнимую. Так пропадала видимость стража (BUG-SWORD-GHOST-1: страж после - * follow_guard оказывался в col 12, луч упирался в мнимую стену, Кид прятал - * меч и не мог достать обратно) и так же ломались коллизия/разворот у швов. - * Задаются pop_map_set_edges. */ -static uint8_t g_link_l, g_link_r, g_link_u, g_link_d; -static uint8_t g_lcol[30], g_rcol[30]; - -/* ---- Плита-ПОТОЛОК: loose ряда 2 комнаты СВЕРХУ ------------------- * - * В оригинале это тот же loose, просто get_tile ушёл в комнату сверху - * (find_room_of_tile) и tilepos получился отрицательным (set_redraw* уводит - * такие в redraw_frames_above). У нас ряд 2 верхнего соседа живёт отдельной - * копией (above_fg в приложении, наш «ряд −1»), поэтому и состояние - * отдельное — pop_ceil_modif[col] с той же семантикой (0 покой, 0x80.. — - * тряска, 1..11 — отсчёт до падения). */ -uint8_t pop_ceil_modif[10]; /* публично: читает pop_bg при отрисовке */ -static uint8_t *g_above; /* ряд 2 комнаты сверху (fg), мутабельный */ -uint8_t pop_ceil_fell; /* 0 = нет; иначе col+1 провалившейся плиты-потолка */ - -uint8_t pop_debris_at; /* 0 = нет; иначе tilepos+1 нового щебня в ЭТОЙ комнате */ - -void pop_map_set_above(uint8_t *above_row2_fg) __banked { g_above = above_row2_fg; } - -void pop_map_set(uint8_t *fg) __banked { g_fg = fg; } - -void pop_map_set_room(uint8_t room) __banked { g_room = room; } - -/* do_startpos (seg003:0160): HP уровня = hitp_beg_lev, а не константа — - * иначе большая склянка теряется на границе уровня. */ -void pop_kid_hp_reset(void) __banked -{ - hitp_curr = hitp_max = hitp_beg_lev; - hitp_delta = 0; - pop_kid_dead = 0; -} - -/* Бесшовный переход (seamless, seg003:158): уровень стартует, НЕ трогая HP — - * Кид уносит на следующий и потолок, и полученный урон, потому что для него - * это не «новый уровень», а продолжение того же бега. Всё остальное, что - * делает pop_kid_hp_reset, нужно и здесь: дельта кадра и признак смерти. */ -void pop_kid_hp_carry(void) __banked -{ - hitp_delta = 0; - pop_kid_dead = 0; -} - -/* init_game (seg003:0043): начало ИГРЫ, а не уровня — стартовое HP. */ -void pop_kid_hp_newgame(void) __banked { hitp_beg_lev = POP_START_HITP; } - -/* add_life (seg000:11EC) + set_health_life (seg000:1200): большая склянка - * поднимает ПОТОЛОК HP (до max_hitp_allowed = 10) и доливает до него. */ -static void pop_kid_add_life(void) -{ - uint8_t hpmax = (uint8_t)(hitp_max + 1); - if (hpmax > POP_MAX_HITP) hpmax = POP_MAX_HITP; - hitp_max = hpmax; - hitp_delta = (int8_t)(hitp_max - hitp_curr); -} - -/* Тот же add_life наружу: слияние с тенью (уровень 12) даёт ровно ту же - * прибавку, что большая склянка, а живёт ИИ тени в другом банке. */ -void pop_add_life(void) __banked { pop_kid_add_life(); } - -/* Урон — через общий pop_take_hp (резидент pop_guard.c): физика работает - * над Char, значит и HP обязаны убавляться у ТОГО, кто сейчас в Char. Своя - * копия take_hp здесь была Kid-only и правила hitp_curr мимо дельты. */ - -/* Перечитать fg соседей из уровня, НЕ трогая историю коллизий. Отдельно от - * pop_map_set_edges, потому что нужен и посреди жизни в комнате: тайл соседа - * может измениться, пока тот не отрисован (плита, брошенная Кидом на - * полпути, доваливается заочно — animate_loose в pop_trob.c). g_lcol/g_rcol - * до этого были снимком НА МОМЕНТ ВХОДА, и коллизия у шва продолжала считать - * провалившуюся плиту полом. */ -void pop_map_refresh_edges(void) __banked -{ - uint8_t i; - if (!g_link_l && !g_link_r) return; - pop_level_access_begin(); - for (i = 0; i < 30; i++) { - if (g_link_l) g_lcol[i] = pop_level_tile_raw(g_link_l, i); - if (g_link_r) g_rcol[i] = pop_level_tile_raw(g_link_r, i); - } - pop_level_access_end(); -} - -void pop_map_set_edges(uint8_t left, uint8_t right, uint8_t up, uint8_t down) __banked -{ - g_link_l = left; g_link_r = right; g_link_u = up; g_link_d = down; - /* fg соседей — прямо из уровня, одной скобкой доступа на обе комнаты. - * Держать ещё одну копию в приложении незачем: карта — единственный её - * потребитель (отрисовке швов хватает кромочных колонок pop_room_load). */ - pop_map_refresh_edges(); - /* смена комнаты — колонки перепроецированы, прошлые флаги перекрытия - * недействительны (в оригинале prev_coll_room != curr_row_coll_room и - * бампа на кадре входа нет). БОКОВОЙ переход это отменяет: вызывающий - * сразу зовёт pop_coll_shift(∓10) и историю не теряет. */ - pop_coll_invalidate(); -} - -static uint8_t get_tile(int8_t col, int8_t row) -{ - /* Ряд −1 — ряд 2 комнаты СВЕРХУ (порт find_room_of_tile, seg006:005D: - * отрицательный row уходит по links.up). Нужен для зацепа за край - * провалившейся плиты-потолка (колодец наверх) и выбора seq прыжка. */ - if (row == -1 && g_above && g_link_u && col >= 0 && col <= 9) - g_curr_tile = (uint8_t)(g_above[col] & 0x1F); - else if (row < 0 || row > 2) - g_curr_tile = TILE_WALL; - else if (col < 0 && col >= -10 && g_link_l) /* уходим в комнату СЛЕВА */ - g_curr_tile = g_lcol[row * 10 + col + 10] & 0x1F; - else if (col > 9 && col <= 19 && g_link_r) /* и в комнату СПРАВА */ - g_curr_tile = g_rcol[row * 10 + col - 10] & 0x1F; - else if (col < 0 || col > 9) - g_curr_tile = TILE_WALL; /* край уровня / нет соседа = стена */ - else - g_curr_tile = g_fg[row * 10 + col] & 0x1F; - return g_curr_tile; -} - -/* Тайл ТЕКУЩЕЙ комнаты по клетке — наружу (порт get_tile(room,col,row) для - * случая room == текущая). Нужен лучу видимости стража - * (check_can_guard_see_kid, seg003:688): тот идёт по ряду между Кидом и - * стражем, а оба по условию в одной (= отрисованной) комнате. Колонки за - * пределами 0..9 get_tile разрешает через швы — здесь не используются. */ -uint8_t pop_tile_at(int8_t col, int8_t row) __banked -{ - return get_tile(col, row); -} - -/* Тайлы ОТРЕЗКА ряда одним вызовом — для луча видимости стража. - * - * Зачем: pop_tile_at объявлен __banked, а луч живёт в guards.c (банк 1) и - * звал его ПО ОДНОЙ КОЛОНКЕ. На сцене 11/15 (Кид в колонке 2, страж в 8) - * это девять трамплинов банк 1 -> банк 3 за кадр, и весь луч стоил 36 786 - * тактов — 5,6 % работы кадра при том, что делает он девять чтений байта - * (замер 2026-08-19). Цена трамплина здесь та же, что уже измерена у - * pop_clip_char_top (8 892 такта ради одной проверки тайла). - * - * Колонки за пределами 0..9 разрешает сам get_tile (шов с соседней - * комнатой), поэтому диапазон отдаём как есть, без клипа. - * - * out обязан вмещать c1 - c0 + 1 байт; вызывающий даёт буфер на 12 - * (колонки −1..10 плюс запас). */ -void pop_row_tiles(int8_t row, int8_t c0, int8_t c1, uint8_t *out) __banked -{ - int8_t col; - /* БЫСТРЫЙ ПУТЬ — отрезок целиком внутри комнаты. get_tile для ряда - * 0..2 и колонки 0..9 сводится ровно к `g_fg[row*10+col] & 0x1F` - * (см. его тело выше), а всё остальное там — разбор швов и краёв - * уровня. Идём указателем: иначе на каждую колонку заново считается - * row*10 + col. */ - if (row >= 0 && row <= 2 && c0 >= 0 && c1 <= 9 && g_fg) { - const uint8_t *p = g_fg + (int)row * 10 + c0; - for (col = c0; col <= c1; col++) - *out++ = (uint8_t)(*p++ & 0x1F); - return; - } - for (col = c0; col <= c1; col++) - *out++ = get_tile(col, row); -} - -/* can_bump_into_gate (seg004:373): ОТКРЫТЫЕ ворота проходимы — Kid не бампит и - * идёт сквозь них (на шве — уходит в соседнюю комнату; внутри комнаты — просто - * проходит по полу под поднятыми барами). ВАЖНО: ворота остаются тайлом 4 (в - * tile_is_floor это ПОЛ), поэтому Kid НЕ падает на них. Раньше get_tile ради - * проходимости подменял ворота шва на empty — но подмену видел и check_on_floor - * → start_fall (Kid проваливался при проходе через ОТКРЫТЫЕ ворота шва). Теперь - * проходимость живёт ТОЛЬКО в bump-логике (как в SDLPoP), не трогая проверку пола. - * Модификатор: шов слева (col=-1) — сосед g_link_l col9; шов справа (col=10) — - * g_link_r col0; ВНУТРИ комнаты (0..9) — текущая комната g_room (иначе после - * перехода Kid встаёт на ту же створку уже как на внутрикомнатную и его отбивает - * обратно). Открыто ⇔ (modif>>2)+6 >= char_height (бары выше головы). */ -/* Комната и tilepos клетки (col,row) С УЧЁТОМ ШВА — порт того, что в - * оригинале делает сам get_tile: он зовёт find_room_of_tile (seg006:005D) и - * ПЕРЕСТАВЛЯЕТ curr_room/curr_tilepos, а дальше trigger_button работает уже - * с ними, а не с комнатой персонажа. Возвращает 0, если клетки нет. - * - * Кусало 2026-08-11 (нашёл пользователь на уровне 5): Кид стоит на кнопке, - * которая физически в СОСЕДНЕЙ комнате (col = −1, то есть колонка 9 левого - * соседа). Мы читали модификатор как (своя комната, tilepos 9) — там стена - * с bg = 0, то есть индекс связи 0. Цепочка от нуля в комнате 24 уровня 5 - * открывает И нижние ворота, И верхние, хотя настоящая кнопка (индекс 9) - * открывает только нижние. */ -static uint8_t tile_room_of(int8_t col, int8_t row, uint8_t *tp) -{ - if (row < 0 || row > 2) return 0; - if (col >= 0 && col <= 9) { *tp = (uint8_t)(row * 10 + col); return g_room; } - if (col < 0 && col >= -10 && g_link_l) { *tp = (uint8_t)(row * 10 + col + 10); return g_link_l; } - if (col > 9 && col <= 19 && g_link_r) { *tp = (uint8_t)(row * 10 + col - 10); return g_link_r; } - return 0; -} - -/* Живой модификатор (openness) ворот в (col,row): своя комната или соседняя - * через шов. 0xFF — тайла нет (за краем уровня). */ -static uint8_t gate_modif(int8_t col, int8_t row) -{ - if (row < 0 || row > 2) return 0xFF; - if (col >= 0 && col <= 9) return pop_trob_modif(g_room)[row * 10 + col]; - if (col < 0 && col >= -10 && g_link_l) - return pop_trob_modif(g_link_l)[row * 10 + col + 10]; - if (col > 9 && col <= 19 && g_link_r) - return pop_trob_modif(g_link_r)[row * 10 + col - 10]; - return 0xFF; -} - -/* check_skel (seg002:1053): скелет ВСТАЁТ — его тайл стирается в пол. - * Перерисовать надо две клетки (сам тайл и соседа справа, как в оригинале: - * set_redraw_full + set_wipe на curr_tilepos и curr_tilepos+1) и на ОБЕИХ - * страницах дабл-буфера — иначе через кадр проступает старый скелет. */ -void pop_skel_wake_tile(uint8_t tilepos) __banked -{ - g_fg[tilepos] = TILE_FLOOR; - pop_set_redraw(tilepos, POP_RD_FLOOR, 2); - if ((tilepos % 10) < 9) - pop_set_redraw((uint8_t)(tilepos + 1), POP_RD_FLOOR, 2); -} - -/* Тот же модификатор наружу (луч видимости стража, guards.c): ему нужна - * openness ворот в ЛЮБОЙ колонке луча, включая ушедшие за край комнаты. */ -uint8_t pop_gate_modif(int8_t col, int8_t row) __banked -{ - return gate_modif(col, row); -} - -static uint8_t gate_passable(int8_t col, int8_t row) -{ - uint8_t gm = gate_modif(col, row); - /* Ветки `if (gm == 0xFF) return 0;` здесь БЫТЬ НЕ ДОЛЖНО: 0xFF — это не - * только сторожевое «тайла нет» из gate_modif, но и живой модификатор - * «ворота открыты НАСОВСЕМ» (trigger_gate по button_type = щебень, - * seg007:623). Значение это появилось только когда заработал порт - * loose_land, и ворота выходили нарисованными открытыми (отрисовка - * клампит modl>188 -> 188), но непроходимыми. Сторож сюда не приходит: - * зовут нас только там, где тайл ТОЧНО ворота, а (0xFF>>2)+6 = 69 и так - * больше любого fph. */ - return (uint8_t)((gm >> 2) + 6) >= (uint8_t)CD_ACT->fph; -} - -static uint8_t tile_is_floor(uint8_t t) -{ - switch (t) { - case 0: case 9: case 12: case 20: - case 26: case 27: case 28: case 29: - return 0; - default: - return 1; - } -} - -static uint8_t get_tile_at_char(void) -{ - return get_tile(Char.curr_col, Char.curr_row); -} - -static uint8_t get_tile_infrontof_char(void) -{ - g_infrontx = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - return get_tile(g_infrontx, Char.curr_row); -} - -/* ---- Тайлы НАД/ЗА персонажем (для зацепа/спуска, seg006) ----------- */ -static uint8_t get_tile_above_char(void) -{ - return get_tile(Char.curr_col, (int8_t)(Char.curr_row - 1)); -} - -static uint8_t get_tile_behind_char(void) -{ - return get_tile((int8_t)(dir_behind[Char.direction + 1] + Char.curr_col), - Char.curr_row); -} - -static uint8_t get_tile_front_above_char(void) -{ - g_infrontx = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - return get_tile(g_infrontx, (int8_t)(Char.curr_row - 1)); -} - -static uint8_t get_tile_behind_above_char(void) -{ - return get_tile((int8_t)(dir_behind[Char.direction + 1] + Char.curr_col), - (int8_t)(Char.curr_row - 1)); -} - -/* Таблицей, а не switch: тайл уже маскирован &0x1F, значит 32 байта покрывают - * весь домен, и вместо шести cp+jr выходит одно чтение по индексу. Зовётся - * на каждую колонку перебора коллизии — там это заметно. */ -static const uint8_t wall_type_tbl[32] = { - 0,0,0,0,1,0,0,1, /* 4,7 — стена справа (gate/doortop) */ - 0,0,0,0,1,2,0,0, /* 12 — то же; 13 — стена слева (mirror) */ - 0,0,3,0,4,0,0,0, /* 18 — chomper; 20 — стена с обеих сторон */ - 0,0,0,0,0,0,0,0 -}; -static uint8_t wall_type(uint8_t t) { return wall_type_tbl[t & 0x1F]; } - -/* ---- Координаты ---------------------------------------------------- */ -static int char_dx_forward(int8_t dx) -{ - int d = dx; - if (Char.direction < 0) d = -d; - return (int)Char.x + d; -} - -/* Деление на ширину тайла — таблицами POP_TILE_DIV/POP_TILE_MOD (резидент, - * pop_tile.c: их же читает слой фона). Вне 0..255 (у нас xpos — int, у - * DOS-оригинала байт) остаётся честная арифметика: путь редкий. */ -/* col = (xpos-58)/14 округл. вниз; g_obj_xl = позиция в тайле (0..13). */ -static int8_t get_tile_div_mod(int xpos) -{ - if ((unsigned int)xpos < 256u) { - g_obj_xl = POP_TILE_MOD[xpos]; - return POP_TILE_DIV[xpos]; - } else { - int x = xpos - SCREENSPACE_X; - int xh = x / TILE_SIZEX; - int xl = x % TILE_SIZEX; - if (xl < 0) { --xh; xl += TILE_SIZEX; } /* округление вниз */ - g_obj_xl = (uint8_t)xl; - return (int8_t)xh; - } -} - -static int8_t get_tile_div_mod_m7(int xpos) { return get_tile_div_mod(xpos - 7); } - -/* «весовая» точка кадра (dx с вычетом weight-битов флагов), в направлении. */ -static int dx_weight(void) -{ - int8_t offset = (int8_t)(kid_cur_dx() - (kid_cur_flags() & FRAME_WEIGHT_X)); - return char_dx_forward(offset); -} - -static void determine_col(void) -{ - Char.curr_col = get_tile_div_mod_m7(dx_weight()); -} - -/* determine_col наружу — для pop_load_fram_det_col (pop_kid): порт связки - * load_frame + determine_col (seg006:0144), которую оригинал зовёт перед - * control(). См. разбор там. */ -void pop_determine_col(void) __banked { determine_col(); } - -/* Тайл ПОЗАДИ персонажа и расстояние до кромки — наружу, для боевой - * половины (guards.c): по ним оригинал выбирает, какой смертью умирает - * заколотый — на месте или сброшенным с уступа (seg002, hurt_by_sword). - * Обе давно работают от Char, а не от Kid; не хватало только объявлений - * (docs/sdlpop_audit.md, находка 12). */ -uint8_t pop_tile_behind_char(void) __banked { return get_tile_behind_char(); } - -/* расстояние до края тайла (для in_wall). */ -static int distance_to_edge(int xpos) -{ - int d; - get_tile_div_mod_m7(xpos); /* -> g_obj_xl */ - d = g_obj_xl; - if (Char.direction == 0) d = TILE_RIGHTX - d; /* dir_0_right */ - return d; -} - -static int distance_to_edge_weight(void) { return distance_to_edge(dx_weight()); } - -int8_t pop_dist_to_edge_weight(void) __banked -{ - int d = distance_to_edge_weight(); - return (int8_t)(d > 127 ? 127 : (d < -128 ? -128 : d)); -} - -/* ---- ТОЧНАЯ коллизия со стеной (seg004) --------------------------- * - * Передний край персонажа = char_x_right (взгляд вправо) / char_x_left - * (влево) из set_char_collision (seg006:0723): obj_x/2 + 58, где obj_x = - * 2*char_dx_forward(cur_frame.dx) - 116 и load_frame_to_obj (seg008:1728) - * добавляет +1 для кадров «чётного пикселя» (бит 0x80 флагов XOR знак - * направления). Деление obj_x/2 в C усечено К НУЛЮ, поэтому в зоне левого - * шва (e<=57, obj_x<0) поправка +1 сдвигает край на пиксель ВПРАВО: e -> e+1. - * Это НЕ мелочь: Kid, осевший после отскока от ворот шва на x=57, имеет - * char_x_right=58 и НЕ пересекает порог leave-left (<=57) — иначе пинг-понг - * drawn_room у закрытых ворот (BUG-SEAM-PINGPONG; подтверждено потиковой - * трассой живого SDLPoP 1.23). При e>=58 формула сокращается к чистому - * char_dx_forward. ∓4 для THIN-кадров поверх. dist_from_wall_forward — - * расстояние переднего края до грани стены tiletype в колонке tcol: >0 - * зазор, <=0 достал/зашёл (насколько). */ -static int char_x_forward_edge(void) -{ - int e = char_dx_forward(kid_cur_dx()); - uint8_t fl = kid_cur_flags(); - if (Char.direction < 0) fl ^= 0x80; - if (!(fl & 0x80) && e <= 57) e++; /* odd pixel + C-трунк к нулю */ - return e; -} - -static int char_front_coll(void) -{ - int cx = char_x_forward_edge(); - if (kid_cur_flags() & FRAME_THIN) - cx += (Char.direction < 0) ? 4 : -4; /* THIN: край внутрь */ - return cx; -} - -static int dist_from_wall_forward(uint8_t tiletype, int8_t tcol) -{ - uint8_t type = wall_type(tiletype); - int coll_left, cx; - /* ОТКРЫТЫЕ ворота стеной НЕ являются (seg004:0A18: `if (tiletype == - * tiles_4_gate && !can_bump_into_gate()) return -1`). Без этой ветки - * get_edge_distance считал расстояние до створки как до стены и отдавал - * маленькое d с типом EDGE_WALL: осторожный шаг играл короткую - * последовательность (safe_step берёт seq по самому d), и к краю - * приходилось шагать ДВАЖДЫ. Возврат −1 уводит разбор на тайл впереди, - * где открытые ворота опознаются как обычный пол (d = 11, полный шаг). - * Поймано пользователем 2026-08-24 (подход слева направо). */ - if (tiletype == TILE_GATE && gate_passable(tcol, Char.curr_row)) return -1; - if (type == 0) return 127; - coll_left = pop_x_bump[tcol + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - cx = char_front_coll(); - if (Char.direction < 0) /* лицом влево */ - return cx - (coll_left + TILE_RIGHTX - wall_dr[type]); - else /* лицом вправо */ - return wall_dl[type] + coll_left - cx; -} - -/* in_wall (seg006:1292): персонаж оказался ВНУТРИ стены (тайл под ним = - * стена) — вытолкнуть. Аутентично SDLPoP: если он глубоко (delta>=8) ИЛИ - * перед ним тоже стена — двигаем НАЗАД к грани (6-delta), иначе ВПЕРЁД из - * стены на соседний тайл (delta+4). Вызывать ТОЛЬКО когда - * get_tile_at_char()==стена (проверяет вызывающий). */ -static void in_wall(void) -{ - int d = distance_to_edge_weight(); - if (d >= 8 || get_tile_infrontof_char() == TILE_WALL) - d = 6 - d; - else - d += 4; - Char.x = (uint8_t)char_dx_forward((int8_t)d); - determine_col(); - get_tile_at_char(); -} - -/* ---- Падение ------------------------------------------------------- */ -static void inc_curr_row(void) { Char.curr_row++; } - -/* Пики (определены ниже, перед pop_phys_tick) — нужны в land() для смерти - * при ПАДЕНИИ на выдвинутые пики (seg005 loc_5EE6). */ -static int is_spike_harmful(uint8_t tilepos); -static void spiked(uint8_t tilepos); - -/* fell_on_spikes (seg005 loc_5EE6): при приземлении тайл ПОД персонажем = - * пика (или пика СЗАДИ у самой кромки) и вредна → напороться (смерть). - * Возвращает 1, если умер (land прерывается). */ -static uint8_t fell_on_spikes(void) -{ - uint8_t tp; - if (get_tile_at_char() == TILE_SPIKE) { - tp = (uint8_t)(Char.curr_row * 10 + Char.curr_col); - } else if (distance_to_edge_weight() >= 12 && - get_tile_behind_char() == TILE_SPIKE) { - int8_t bcol = (int8_t)(dir_behind[Char.direction + 1] + Char.curr_col); - if (bcol < 0 || bcol > 9) return 0; - tp = (uint8_t)(Char.curr_row * 10 + bcol); - } else { - return 0; - } - if (is_spike_harmful(tp)) { spiked(tp); return 1; } - return 0; -} - -static void land(void) -{ - uint8_t seq; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - if (fell_on_spikes()) return; /* упал на вредные пики — смерть */ - /* к краю пола — чуть назад (как оригинал) */ - if (!tile_is_floor(get_tile_infrontof_char()) && distance_to_edge_weight() < 3) - Char.x = (uint8_t)char_dx_forward(-3); - pop_start_chompers(Char.room, Char.curr_row); /* seg005:0148 */ - /* Урон от падения (seg005:173) — ветвление по ПЕРСОНАЖУ, а не только по - * высоте. Порт построчно: - * 1 этаж (fall_y < 22): не-Кид (charid >= guard) ИЛИ меч вынут → - * меч в руку + seq_63; иначе присед seq_17. Звук/«нашумел» — только - * у Кида (у стража своё падение никого не будит). - * 2 этажа (< 33): тень падает как с одного этажа, СТРАЖ гибнет сразу, - * Кид (и скелет — баг оригинала, сохраняем) теряет 1 HP; - * 3+ этажа: гибнут все. - * - * Ветка «с мечом» на одном этаже — не косметика: seq_17_soft_land - * заканчивается ВЕЧНЫМ циклом на кадре 109, из которого выводит только - * control_crouched(), а при `sword == sword_2_drawn` управление уходит в - * control_with_sword и до него не доходит — Кид садится в присед - * НАВСЕГДА (BUG-LAND-SWORD-1). */ - is_screaming = 0; /* seg005:116 */ - /* seg005:0173 — ВСЯ развязка приземления (мягко/средне/разбиться) у - * оригинала заперта за `if (Char.alive < 0)`, то есть выполняется - * только для ЖИВОГО. Мёртвому телу отведена своя дорога (seg005 ветка - * else, loc_5F6C): добить HP, звук падения насмерть и seq_22. - * - * Развилки у нас не было, и труп шёл по живой дороге. Смертельно это - * не выглядело только из-за высоты: тело, сброшенное ударом с ОДНОГО - * ряда, набирает fall_y < 22 — урона нет, «последнее HP» не тратится, - * ветка «разбился» не выбирается никогда, и мёртвый Кид приземлялся - * в ПРИСЕД (кадр 109, seq_17). Отсюда симптом «убитого Кида уронили, - * а он сел этажом ниже, и только потом обнаружилось, что он мёртв». - * Цена проверки — один тест байта на приземление. */ - if (Char.alive >= 0) goto crushed; - if (Char.fall_y < 22) { - soft_land: - if (Char.charid >= CHARID_2_GUARD || Char.sword == SWORD_2_DRAWN) { - Char.sword = SWORD_2_DRAWN; - seq = SEQ_63_ACTIVE_AFTER_FALL; - } else { - seq = SEQ_17_SOFT_LAND; - } - /* seg005:185 — мягкое приземление слышно И стражам, и игроку. */ - if (Char.charid == CHARID_0_KID) { pop_sfx_play(17); is_guard_notice = 1; } - } else { - uint8_t deadly = (uint8_t)(Char.fall_y >= 33); /* СНЯТЬ до обнуления */ - if (!deadly && Char.charid == CHARID_1_SHADOW) goto soft_land; /* seg005:189 */ - if (!deadly && Char.charid == CHARID_2_GUARD) deadly = 1; /* seg005:190 */ - Char.fall_x = Char.fall_y = 0; - if (deadly || pop_take_hp(1)) { /* 3+ этажа или последнее HP */ - crushed: - /* Сюда же приходит УЖЕ мёртвое тело (см. развилку выше); для - * него обнуление ниже — первое, живой путь его уже сделал. */ - Char.fall_x = Char.fall_y = 0; - pop_take_hp(100); - if (Char.charid == CHARID_0_KID) pop_sfx_play(0); /* разбился */ - pop_char_set_seq(SEQ_22_CRUSHED); - play_seq(); - determine_col(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; - return; - } - if (Char.charid == CHARID_0_KID) { pop_sfx_play(16); is_guard_notice = 1; } /* seg005:195 */ - seq = SEQ_20_MEDIUM_LAND; - } - Char.fall_x = Char.fall_y = 0; - pop_char_set_seq(seq); - play_seq(); - determine_col(); -} - -static void start_fall(void) -{ - uint8_t frame = Char.frame, seq, tile; - /* seg006:1044 первым делом убирает меч в ножны: дальше падением рулит - * не боевой диспетчер, а обычный. Без этого Kid летит «с клинком», и - * control_with_sword разбирает кадры падения как боевые. */ - Char.sword = SWORD_0_SHEATHED; - inc_curr_row(); - pop_start_chompers(Char.room, Char.curr_row); /* seg006:08C1 */ - /* seg006:1044 start_fall: frame 9 -> seq_7, 13 -> seq_19 (лишний dx(1)) */ - if (frame == 13) seq = SEQ_19_FALL; - else if (frame == 26) seq = SEQ_18_FALL_STANDJUMP; - else if (frame == 44) seq = SEQ_21_FALL_RUNJUMP; - else if (frame >= 81 && frame < 86) { - /* сорвался, приземляясь после прыжка вверх: сдвиг ВПЕРЁД на 5 */ - seq = SEQ_19_FALL; - Char.x = (uint8_t)char_dx_forward(5); - pop_load_fram_det_col(); - } - else if (frame >= 150 && frame < 180) { - /* Кадры С МЕЧОМ (150..179) — ушёл в провал из боевой стойки - * (seg006:1123). Отдельная последовательность, а не seq_7: у той - * дрейф fall_x=1, и персонаж уезжал на ~тайл в сторону за полёт. - * Ветвление по персонажу — как в оригинале: - * СТРАЖ: спихнули (fall_x < 0) → seq_82, сам шагнул → seq_83; - * ПРОЧИЕ (Кид): seq_81 + взвести droppedout — по нему страж - * решает, идти ли следом вниз (guard_follows_kid_down). */ - if (Char.charid == CHARID_2_GUARD) { - if (Char.fall_x < 0) { - if (Char.direction < 0 && distance_to_edge_weight() <= 7) - Char.x = (uint8_t)char_dx_forward(-5); - seq = SEQ_82_GUARD_PUSHED_OFF; - } else { - pop_droppedout = 0; - seq = SEQ_83_GUARD_FALL; - } - } else { - pop_droppedout = 1; - if (Char.direction < 0 && distance_to_edge_weight() <= 7) - Char.x = (uint8_t)char_dx_forward(-5); - seq = SEQ_81_FIGHTFALL; - } - } - else seq = SEQ_7_FALL; /* frame 9 + stand/step/crouch */ - pop_char_set_seq(seq); - play_seq(); - determine_col(); - /* Проверки «упал в стену» — ТОЛЬКО пока персонаж В комнате (curr_row<=2). - * Ниже нижнего ряда (curr_row=3 после inc — падение сквозь дыру loose) - * наш get_tile отдаёт WALL как СЕНТИНЕЛ кромки уровня, но в оригинале там - * КОМНАТА СНИЗУ (у дыры — пол/пусто, не стена). Без гарда in_wall() ложно - * срабатывал и откатывал X назад (6−d) → дайв падения смещался на тайл - * влево (Кид «клевал» рано над колонной вместо дыры). */ - if (Char.curr_row <= 2) { - if (get_tile_at_char() == TILE_WALL) { - in_wall(); - return; - } - /* Хвост seg006:1099: тайл ПЕРЕД персонажем — стена → отодвинуть на 1 - * назад (иначе передний край зайдёт в грань). (seq_104 для frame 44 с - * малым зазором не портирован — в этом тесте не встречается.) */ - tile = get_tile_infrontof_char(); - if (tile == TILE_WALL) { - if (frame != 44 || distance_to_edge_weight() >= 6) - Char.x = (uint8_t)char_dx_forward(-1); - determine_col(); - } - } -} - -/* ---- Зацеп (seg006 can_grab/check_grab) --------------------------- * - * can_grab: можно ли зацепиться за g_curr_tile (curr_tile2) СКВОЗЬ through- - * тайл? Kid-only (без loose/opener-модификаторов). */ -static uint8_t can_grab(uint8_t through) -{ - if (through == TILE_WALL) return 0; /* сквозь стену нельзя */ - if (through == TILE_DOORTOP && Char.direction >= 0) return 0; /* верх двери, лицом вправо */ - if (tile_is_floor(through)) return 0; /* сквозь пол нельзя */ - if (g_curr_tile == TILE_DOORTOP_FLOOR && Char.direction < 0) return 0; - if (!tile_is_floor(g_curr_tile)) return 0; /* не за что цепляться */ - return 1; -} - -static uint8_t can_grab_front_above(void) -{ - uint8_t through = get_tile_above_char(); - get_tile_front_above_char(); /* g_curr_tile = спереди-сверху */ - return can_grab(through); -} - -/* check_grab (seg006:0A28): в падении при зажатом Shift — зацепиться за - * уступ спереди-сверху (seq_15), если скорость падения ещё мала и высота - * подходящая. Выравнивает передний край по кромке, гасит fall_y, взводит - * grab_timer (блок climb-up на несколько кадров). - * - * ВОЗВРАТ: 1 — зацеп СОСТОЯЛСЯ на этом кадре. Нужен вызывающему (do_fall): - * дальше по кадру идёт glide_through_wall_guard, и ему нельзя трогать - * персонажа, которого мы только что повесили на кромку (см. там же). */ -static uint8_t check_grab(void) -{ - uint8_t old_x; - if (!pop_ctrl_shift_held()) return 0; /* Shift не зажат */ - if ((uint8_t)Char.fall_y >= 32) return 0; /* падает слишком быстро */ - if ((uint16_t)pop_y_land[Char.curr_row + 1] > (uint16_t)(Char.y + 25)) return 0; - old_x = Char.x; - Char.x = (uint8_t)char_dx_forward(-8); - determine_col(); - if (!can_grab_front_above()) { - Char.x = old_x; /* не за что — назад */ - determine_col(); - return 0; - } - Char.x = (uint8_t)char_dx_forward((int8_t)distance_to_edge_weight()); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; - pop_char_set_seq(SEQ_15_GRAB_LEDGE_MIDAIR); - play_seq(); - determine_col(); - grab_timer = 12; - pop_sfx_play(9); /* seg006 check_grab */ - is_screaming = 0; /* seg006:1219 */ - return 1; -} - -static void make_loose_fall(int pos, uint8_t modifier); - -/* check_grab_run_jump — ЗАЦЕП ПРЯМО В ПРЫЖКЕ, при Shift, зажатом ЗАРАНЕЕ. - * - * ВАЖНО: в оригинальной игре этого НЕТ. Это улучшение SDLPoP - * (`USE_JUMP_GRAB` + `fixes->enable_jump_grab`, seg006:1228), и там оно - * выключено, пока не включены fixes-and-enhancements. Ванильное поведение: - * зацепиться можно только в НАЧАЛЕ ПАДЕНИЯ (check_grab, кадры 102..105) — - * то есть Shift надо успеть нажать уже в полёте. Пользователь ловил ровно - * это и просил «чтобы работало и при заранее зажатом Shift», поэтому - * улучшение портировано, но за выключателем POP_ENABLE_JUMP_GRAB - * (pop_tune.h): игровая сборка сможет вернуться к оригиналу. - * - * Условия оригинала: действие — прыжок, кадр 22..23 (прыжок с места) или - * 39..41 (разбег-прыжок), «вперёд» ОТПУЩЕНО, «вверх» зажато. Дальше — та - * же проба, что у check_grab, но персонаж не падает, а сразу ставится на - * кромку и играет seq_9. - * - * Упрощение против SDLPoP: там колонка захвата правится, когда тайл - * оказался в ЧУЖОЙ комнате (curr_room != Char.room) — у нас модель - * однокомнатная, get_tile сам резолвит колонки за швом в координатах - * ТЕКУЩЕЙ комнаты, поэтому правка не нужна. Зато кнопка/плита за швом - * (grab_col вне 0..9) не сработают — тайл принадлежит соседу, а - * pop_trob_modif/g_fg у нас про свою комнату; такие случаи пропускаем. */ -static uint8_t check_grab_run_jump(void) -{ - uint8_t frame = Char.frame; - uint8_t grab_tile; - int8_t grab_col, grab_row; - - /* Сам выключатель проверяют ТОЧКИ ВЫЗОВА (иначе SDCC ругается на - * недостижимый код при POP_ENABLE_JUMP_GRAB = 1). */ - if (Char.action != ACT_RUNJUMP) return 0; - if (!((frame >= 22 && frame <= 23) || (frame >= 39 && frame <= 41))) return 0; - if (control_x != POP_CONTROL_RELEASED || control_y != POP_CONTROL_HELD_UP) return 0; - if (!can_grab_front_above()) return 0; - - grab_tile = g_curr_tile; /* тайл, за который взялись */ - grab_col = g_infrontx; - grab_row = (int8_t)(Char.curr_row - 1); /* СНЯТЬ до play_seq: он двигает ряд */ - - Char.x = (uint8_t)(pop_x_bump[grab_col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - Char.x = (uint8_t)char_dx_forward(Char.direction < 0 ? -12 : 2); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - pop_char_set_seq(SEQ_9_GRAB_WHILE_JUMPING); - play_seq(); - determine_col(); - grab_timer = 12; - - /* Хвост оригинала: за что схватились — то и сработает. Нужен потому, - * что check_press на следующем кадре уже не поможет: кадр сменится на - * 81 (hangdrop), если Shift отпустят сразу. */ - if (grab_col >= 0 && grab_col <= 9 && grab_row >= 0 && grab_row <= 2) { - uint8_t tp = (uint8_t)(grab_row * 10 + grab_col); - if (grab_tile == TILE_OPENER || grab_tile == TILE_CLOSER) - pop_trigger_button(g_room, tp, grab_tile, pop_trob_modif(g_room)[tp], 1); - else if (grab_tile == TILE_LOOSE) { - is_guard_notice = 1; - make_loose_fall(tp, 1); - } - } - return 1; -} - -/* НЕ ДАТЬ ПРОЛЕТЕТЬ СКВОЗЬ СТЕНУ В ПАДЕНИИ. - * - * Порт опционального исправления SDLPoP (fix_glide_through_wall, seg005 в - * do_fall). В ванили personаж, падающий после разворота в беге, может - * оказаться внутри кладки и лететь «в стене» — баг оригинала, известный и - * воспроизводимый; у нас он ловится host-тестом (tests/host/t_wall.c, - * набор wall_stops_jump_from_left_side). - * - * ВЗЯТО В ТЕКУЩИЙ БИЛД по решению 2026-08-31: играбельность важнее - * буквальности. При разделении VANILLA/ENHANCED эта функция — готовая - * точка отвязки: достаточно не звать её в ванильном режиме - * (docs/vanilla_vs_bugfixed.md). - * - * Условие оригинала: персонаж внутри тайла стены, либо внутри верха двери - * (в обоих вариантах) при движении ВЛЕВО. Порог 8 и сдвиг на 15 назад — - * из исправления; они выбраны так, чтобы вытолкнуть на ту же дистанцию, - * что даёт выталкивание из стены при приземлении. Горизонтальную - * скорость гасим: иначе следующий кадр внесёт персонажа обратно. */ -static void glide_through_wall_guard(void) -{ - uint8_t t; - int d; - - determine_col(); - t = get_tile_at_char(); - if (t != TILE_WALL && - !((t == TILE_DOORTOP || t == TILE_DOORTOP_FLOOR) && Char.direction < 0)) - return; - d = distance_to_edge_weight(); - if (d < 8) return; - Char.x = (uint8_t)char_dx_forward((int8_t)(d - 15)); - Char.fall_x = 0; -} - -static void do_fall(void) -{ - uint8_t nrow = (uint8_t)(Char.curr_row + 1); - if (!is_screaming && Char.fall_y >= 31) { - pop_sfx_play(1); /* seg005:39 — крик падения */ - is_screaming = 1; - } - if (nrow > 4) nrow = 4; /* защита pop_y_land[] от выхода */ - if ((uint16_t)pop_y_land[nrow] > (uint16_t)Char.y) { - /* ЗАЦЕП ОТМЕНЯЕТ GUARD. seq_15 — «grab ledge MIDAIR», то есть после - * удачного зацепа Char.action == 3, персонаж уже подтянут вплотную к - * кромке, а под кромкой в оригинальных комнатах стоит КЛАДКА. Guard, - * позванный следом, видел ровно её (t == TILE_WALL, d == 10), считал - * это «пролётом сквозь стену», отбрасывал Кида на 5 пикселей назад и - * гасил fall_x — зацеп рисовался и тут же срывался. Ловилось на - * длинном прыжке уровня 3 (комната 7 -> кромка комнаты 2) и в - * attract-демо; регресс-набор — tests/host/t_glide.c. */ - if (!check_grab()) /* ещё летит — попытка зацепа */ - glide_through_wall_guard(); /* и не сквозь кладку (см. выше) */ - } else if (Char.curr_row <= 2) { - if (get_tile_at_char() == TILE_WALL) - in_wall(); - if (tile_is_floor(g_curr_tile)) - land(); - else - inc_curr_row(); /* следующий ряд, ВКЛЮЧАЯ 2 -> 3 */ - /* Ряд 3 — «за нижней кромкой комнаты» (в оригинале get_tile уходит по - * links.down и это ряд 0 комнаты снизу, seg006:005D). Нам он нужен - * ровно за тем, за чем нужен оригиналу: пока Kid летит вдоль ряда 3, - * check_grab пробует зацеп за тайл ряда 2 СВОЕЙ комнаты — иначе - * спуск «повис на кромке, отпустил, зацепился этажом ниже» через - * нижнюю границу комнаты невозможен в принципе (BUG-GRAB-SEAM-DOWN). - * Раньше ряд залипал на 2, check_grab не звался ни разу, и Kid - * пролетал мимо кромки, набирая fall_y > 32 — после чего окно - * зацепа закрыто уже по скорости. */ - } - /* curr_row == 3: тайлов своей комнаты там нет (get_tile отдаёт WALL как - * сентинел), поэтому ни in_wall, ни land здесь звать нельзя — до y_land[4] - * дело всё равно не доходит: check_leave_below переводит в комнату снизу - * на y >= 211 (порт leave_room). */ -} - -static void fall_accel(void) -{ - if (Char.action == ACT_FREEFALL) { - int fy; - /* Перо (seg006:057C). Оригинал ловит эффектом ЛЮБОГО персонажа в - * Char — зелье пьёт только Кид, но флаг глобальный, и страж, упавший - * в ту же минуту, тоже парит; SDLPoP чинит это опцией - * fix_feather_fall_affects_guards. Берём поведение С ФИКСОМ (только - * Кид): расхождение осознанное, запись в ../docs/impl_diff.md. */ - if (pop_feather && Char.charid == CHARID_0_KID) { - fy = (uint8_t)Char.fall_y + FALL_ACCEL_FEATHER; - if (fy > FALL_MAX_FEATHER) fy = FALL_MAX_FEATHER; - } else { - fy = (uint8_t)Char.fall_y + FALL_ACCEL; - if (fy > FALL_MAX) fy = FALL_MAX; - } - Char.fall_y = (int8_t)fy; - } -} - -static void fall_speed(void) -{ - Char.y = (uint8_t)(Char.y + (uint8_t)Char.fall_y); - if (Char.action == ACT_FREEFALL) { - Char.x = (uint8_t)char_dx_forward(Char.fall_x); - determine_col(); - } -} - -/* ---- get_edge_distance (seg004:067C) — ТОЧНО ---------------------- * - * Расстояние переднего края до стены/края впереди + тип g_edge_type: WALL - * (стена в пределах тайла), FLOOR (пол — далеко, 11), CLOSER (край уступа - * над ямой — distance_to_edge_weight). Стена сперва под персонажем, потом - * перед ним; dist<=TILE_RIGHTX -> WALL, иначе FLOOR. */ -static uint8_t g_edge_type; - -static int edge_classify(int d) -{ - if (d <= TILE_RIGHTX) g_edge_type = EDGE_WALL; - else { g_edge_type = EDGE_FLOOR; d = 11; } - return d; -} - -int pop_edge_distance(void) __banked -{ - uint8_t t; int d; - determine_col(); - t = get_tile_at_char(); - if (wall_type(t)) { - d = dist_from_wall_forward(t, Char.curr_col); - if (d >= 0) return edge_classify(d); - } - t = get_tile_infrontof_char(); - /* Верх двери лицом ВПРАВО — кромка (в оригинале ПЕРВОЙ проверкой, до - * wall_type: у doortop wall_type != 0). */ - if (t == TILE_DOORTOP && Char.direction >= 0) { - g_edge_type = EDGE_CLOSER; - return distance_to_edge_weight(); - } - if (wall_type(t)) { - d = dist_from_wall_forward(t, g_infrontx); - if (d >= 0) return edge_classify(d); - } - /* ПРОВАЛИВАЮЩИЙСЯ пол впереди — КРОМКА, хотя tile_is_floor считает его - * полом. Это и есть механизм «проверки ногой»: осторожный шаг доводит - * Kid ровно до границы плиты (distance -> 0), там safe_step играет - * seq_44 (testfoot) — Kid щупает плиту ногой, та трясётся (SEQ_KNOCK_DOWN), - * и он остаётся на месте; шаг НА плиту — только со второго нажатия - * (Char.repeat). Без этой ветки плита читалась как обычный пол, и Kid - * заходил на неё первым же осторожным шагом и падал вместе с ней. */ - if (t == TILE_LOOSE) { - g_edge_type = EDGE_CLOSER; - return distance_to_edge_weight(); - } - /* Кнопка-закрывалка/меч/зелье: кромка, пока до границы есть зазор. */ - if (t == TILE_CLOSER || t == TILE_SWORD || t == TILE_POTION) { - d = distance_to_edge_weight(); - if (d) { g_edge_type = EDGE_CLOSER; return d; } - g_edge_type = EDGE_FLOOR; return 11; - } - if (tile_is_floor(t)) { g_edge_type = EDGE_FLOOR; return 11; } - g_edge_type = EDGE_CLOSER; /* яма впереди — до кромки уступа */ - return distance_to_edge_weight(); -} - -uint8_t pop_edge_type(void) __banked { return g_edge_type; } - -/* Тайл, на котором закончился разбор края (порт curr_tile2 после - * get_edge_distance). Нужен control'у: правило «у стены шагаем, а не - * бежим» в оригинале ЯВНО исключает чомпер (seg005:0577). */ -uint8_t pop_edge_tile(void) __banked { return g_curr_tile; } - -/* ---- Прыжок вверх с зацепом (seg005 check_jump_up и производные) --- * - * pop_jump_up_seq выбирает seq для ↑ в стойке: чистый прыжок (seq_28 в - * пустоту / seq_14 в потолок) ЛИБО прыжок-и-зацеп за уступ выше (seq_8/ - * 24 — с полом сзади, seq_16 — без), и выравнивает Char.x. control_up - * гасит caller (pop_ctrl). Порт: check_jump_up/grab_up_with_floor_behind/ - * jump_up_or_grab/grab_up_no_floor_behind/jump_up (без super-high-jump). */ -static uint8_t grab_up_with_floor_behind(void) -{ - int distance = distance_to_edge_weight(); - int edge_distance = pop_edge_distance(); /* побочно ставит g_edge_type */ - if (distance < 4 && edge_distance < 4 && g_edge_type != EDGE_WALL) { - Char.x = (uint8_t)char_dx_forward((int8_t)distance); - return SEQ_8_GRAB_STRAIGHT; - } - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - 4)); - return SEQ_24_GRAB_FORWARD; -} - -static uint8_t jump_up_plain(void) /* seg005 jump_up (без super) */ -{ - int distance = pop_edge_distance(); /* ставит g_edge_type */ - int8_t col; - uint8_t t; - if (distance < 4 && g_edge_type == EDGE_WALL) - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - 3)); - col = get_tile_div_mod(dx_weight() - 6); - t = get_tile(col, (int8_t)(Char.curr_row - 1)); - if (t != TILE_WALL && !tile_is_floor(t)) - return SEQ_28_JUMP_NOTHING_ABOVE; - return SEQ_14_JUMP_INTO_CEILING; -} - -static uint8_t grab_up_no_floor_behind(void) -{ - get_tile_above_char(); - Char.x = (uint8_t)char_dx_forward((int8_t)(distance_to_edge_weight() - 10)); - return SEQ_16_JUMP_UP_AND_GRAB; -} - -static uint8_t jump_up_or_grab(void) -{ - int distance = distance_to_edge_weight(); - if (distance < 6) - return jump_up_plain(); - if (!tile_is_floor(get_tile_behind_char())) - return grab_up_no_floor_behind(); - Char.x = (uint8_t)char_dx_forward((int8_t)(distance - TILE_SIZEX)); - determine_col(); /* load_fram_det_col */ - return grab_up_with_floor_behind(); -} - -uint8_t pop_jump_up_seq(void) __banked -{ - uint8_t through = get_tile_above_char(); - get_tile_front_above_char(); /* g_curr_tile = спереди-сверху */ - if (can_grab(through)) - return grab_up_with_floor_behind(); - through = get_tile_behind_above_char(); - get_tile_above_char(); /* g_curr_tile = сверху */ - if (can_grab(through)) - return jump_up_or_grab(); - return jump_up_plain(); -} - -/* run_jump (seg005:0AA8), часть «выровнять по кромке» ------------------ * - * Оригинал НЕ отталкивается откуда попало: перед разбег-прыжком он смотрит - * на 1–2 тайла вперёд и, если там провал (или пика), подгоняет X так, чтобы - * толчок пришёлся ровно на кромку пола. Иначе прыжок стартует в случайной - * фазе бегового цикла — а запаса у seq_4 почти нет: суммарный dx кадров - * 34..44 равен 62 px при ширине тайла 14, то есть ровно 4 колонки и меньше - * половины тайла сверху. Поэтому без выравнивания провал в ТРИ пустых - * тайла (перелёт с колонки 5 на колонку 1) становится непроходимым — - * BUG-RJUMP-1, уровень 2, комнаты 1 и 9. - * - * Возврат: 1 — прыгать (Char.x уже подогнан), 0 — прыжок ОТМЕНИТЬ. Отмена - * в оригинале НЕ гасит control_up: Кид бежит дальше с зажатой «вверх», и на - * следующем кадре попытка повторяется — так игрок ловит нужную фазу, просто - * удерживая клавишу. */ -uint8_t pop_run_jump_align(void) __banked -{ - int xpos = char_dx_forward(4); - int8_t col = get_tile_div_mod_m7(xpos); - uint8_t tf; - - for (tf = 0; tf < 2; tf++) { - uint8_t t; - col = (int8_t)(col + dir_front[Char.direction + 1]); - t = get_tile(col, Char.curr_row); - if (t != TILE_SPIKE && tile_is_floor(t)) continue; /* тут пол — дальше */ - - { - int adj = distance_to_edge(xpos) + TILE_SIZEX * (int)tf - TILE_SIZEX; - /* Оригинал сравнивает БЕЗЗНАКОВО: - * if ((word)adj < (word)-8 || adj >= 2) { if (adj < 128) return; adj = -3; } - * что означает ровно «adj НЕ попал в [-8,-1] → прыжка нет». - * Ветка с adj = -3 недостижима: distance_to_edge ∈ [0,13] и - * tf ∈ {0,1} дают adj ∈ [-14,13], а туда нужно adj >= 128. */ - if (adj < -8 || adj > -1) return 0; - Char.x = (uint8_t)char_dx_forward((int8_t)(adj + 4)); - } - break; - } - return 1; -} - -/* Стена впереди достаточно близко для стопа бега? Детект (без сдвига — - * позицию держит check_bumped=in_wall). d<=2: передний край почти у грани. */ -int pop_wall_ahead(void) __banked -{ - int d = pop_edge_distance(); - return (g_edge_type == EDGE_WALL && d <= 2); -} - -/* ---- Вис (control_hanging из seg005) — тайловые решения ------------ * - * Управление держится в pop_ctrl (control_*), сюда вынесены только - * тайловые предикаты + выбор seq (+ выравнивание Char.x). */ - -/* grab_timer истёк — можно подтягиваться? */ -uint8_t pop_hang_grab_ready(void) __banked { return grab_timer == 0; } - -/* can_climb_up (seg005:09DF): тайл над персонажем — обычный подъём (seq_10) - * либо подъём к ЗАКРЫТОЙ калитке/зеркалу/чомперу (seq_73 = «влез и съехал - * обратно»). Для ворот условие включает ОТКРЫТОСТЬ: - * curr_tile2 == tiles_4_gate && direction != right && modif >> 2 < 6 - * — под поднятой решёткой (modif >> 2 >= 6) подъём обычный. Без проверки - * модификатора Kid срывался и с открытых ворот. */ -uint8_t pop_hang_climb_up_seq(void) __banked -{ - uint8_t t = get_tile_above_char(); - if (((t == TILE_MIRROR || t == TILE_CHOMPER) && Char.direction == 0) || - (t == TILE_GATE && Char.direction != 0 && - (uint8_t)(gate_modif(Char.curr_col, (int8_t)(Char.curr_row - 1)) >> 2) < 6)) - return SEQ_73_CLIMB_UP_TO_GATE; - return SEQ_10_CLIMB_UP; -} - -/* Shift в висе: 1 = висит у стены/двери (caller играет seq_25); -1 = - * сорваться (hang_fall); 0 = сверху пол, остаётся висеть (ничего). */ -int8_t pop_hang_wall(void) __banked -{ - uint8_t t = get_tile_at_char(); - if (Char.action != ACT_HANGSTRAIGHT && - (t == TILE_WALL || - (Char.direction < 0 && (t == TILE_DOORTOP_FLOOR || t == TILE_DOORTOP)))) - return 1; - if (!tile_is_floor(get_tile_above_char())) - return -1; - return 0; -} - -/* hang_fall (seg005:0A46): сорваться. Нет пола ни сзади, ни под - * персонажем — seq_23 (отпустить и падать); иначе прижать к стене (-7) - * и seq_11 (встать, конец спуска). Меняет Char.x, возвращает seq. */ -uint8_t pop_hang_fall_seq(void) __banked -{ - uint8_t behind = get_tile_behind_char(); - uint8_t at; - if (!tile_is_floor(behind) && !tile_is_floor(get_tile_at_char())) - return SEQ_23_RELEASE_LEDGE_FALL; - at = get_tile_at_char(); - if (at == TILE_WALL || - (Char.direction < 0 && (at == TILE_DOORTOP_FLOOR || at == TILE_DOORTOP))) - Char.x = (uint8_t)char_dx_forward(-7); - return SEQ_11_RELEASE_LEDGE_LAND; -} - -/* down_pressed (seg005:04C7) tile-часть: 1 = обработано (НЕ приседать — - * либо спуск seq_68 через зацеп, либо отступ от передней кромки), 0 = - * приседать. Меняет Char.x. Kid развёрнут от края (край сзади) у кромки - * пола + под соседним тайлом есть за что зацепиться → спуск на этаж вниз. */ -/* Ветка «войти в дверь уровня» из up_pressed (seg005:0482) вместе с - * go_up_leveldoor (seg005:0574). Дверь рядом и открыта → поставить Кида в - * проём, вернуть 1 (последовательность seq_70 ставит вызывающий — это его - * слой); иначе 0 и Кид не тронут. - * - * Геометрию персонажа меняем в Kid, а НЕ в Char: окно Char вокруг - * диспетчера возвращает назад ТОЛЬКО curr_seq и sword - * (pop_savekid_state), поэтому во всём порте позицию правит pop_map — как - * в pop_down_action и pop_jump_up_seq. Запись в Char.x/Char.direction - * отсюда молча теряется (проверено: Кид уходил из проёма влево). - * - * Порядок проб как в оригинале и с той же семантикой `else if`: берём - * ПЕРВУЮ клетку, в которой стоит дверь (под персонажем → за спиной → перед - * лицом), и уже её проверяем на открытость — а не ищем «первую открытую». - * - * Открытость: `modifier >= 42`, то есть створка доехала до верха. Это - * ветка fix_exit_door, а не ванильный глобал leveldoor_open: с ванильным - * условием в дверь можно войти, пока она ещё ползёт вверх, и персонаж - * проходит сквозь опущенную створку. - * - * Стартовая комната исключена (`level.start_room != drawn_room`): в первой - * комнате уровня дверь — та, через которую вошли, и обратно в неё нельзя. */ -uint8_t pop_leveldoor_enter(void) __banked -{ - int8_t cols[3]; - uint8_t i; - - if (pop_level_start_room() == g_room) return 0; - - cols[0] = Char.curr_col; - cols[1] = (int8_t)(dir_behind[Char.direction + 1] + Char.curr_col); - cols[2] = (int8_t)(dir_front[Char.direction + 1] + Char.curr_col); - for (i = 0; i < 3; i++) { - if (get_tile(cols[i], Char.curr_row) != TILE_LEVELDOOR_LEFT) - continue; - /* дверь найдена — дальше решает только её modif (см. выше) */ - if (cols[i] < 0 || cols[i] > 9) return 0; /* дверь в шве: не наша */ - if (pop_trob_modif(g_room)[Char.curr_row * 10 + cols[i]] < 42) - return 0; - /* go_up_leveldoor (seg005:0574): встать РОВНО в проём и развернуться - * ВЛЕВО. Направление тут не косметика: все DX последовательности - * seq_70 ОТРИЦАТЕЛЬНЫЕ (−5,−4,−4,−2,−3,−1,−3,−1,−2), а - * char_dx_forward при взгляде влево меняет им знак — то есть именно - * dir_FF_left и гонит персонажа ВПРАВО-ВВЕРХ по лестнице. При - * взгляде вправо тот же seq уводит его влево, ИЗ проёма. */ - Char.x = (uint8_t)(pop_x_bump[cols[i] + FIRST_ONSCREEN_COLUMN] + 10); - Char.direction = -1; - return 1; - } - return 0; -} - -uint8_t pop_down_action(void) __banked -{ - if (!tile_is_floor(get_tile_infrontof_char()) && distance_to_edge_weight() < 3) { - Char.x = (uint8_t)char_dx_forward(5); /* у передней кромки — отступ */ - determine_col(); - return 1; - } - if (!tile_is_floor(get_tile_behind_char()) && distance_to_edge_weight() >= 8) { - uint8_t through = get_tile_behind_char(); - get_tile_at_char(); /* g_curr_tile = под персонажем */ - /* seg005:482: спуск с тайла-ворот лицом ВЛЕВО запрещён только пока они - * ЗАКРЫТЫ (modif >> 2 < 6); под поднятой решёткой спуск обычный. */ - if (can_grab(through) && - (Char.direction >= 0 || get_tile_at_char() != TILE_GATE || - (uint8_t)(gate_modif(Char.curr_col, Char.curr_row) >> 2) >= 6)) { - Char.x = (uint8_t)char_dx_forward((int8_t)(distance_to_edge_weight() - 9)); - pop_char_set_seq(SEQ_68_CLIMB_DOWN); - return 1; - } - } - return 0; -} - -/* ---- Предметы: меч (seg005 check_get_item/get_item + seg006 do_pickup/ - * proc_get_object) --------------------------------------------------- * - * pop_have_sword — порт глобала have_sword: «меч у Кида». Боевой режим - * (стойка с мечом, бой) НЕ реализован и здесь не нужен: сиквенс подъёма - * seq_91 сам заканчивается убиранием меча в ножны (кадры 230..240 sheathe) - * и возвратом в обычную стойку — как в оригинале до встречи со стражем. */ -uint8_t pop_have_sword; -uint8_t pop_item_taken; /* 0 = нет; иначе tilepos+1 поднятого */ -uint8_t pop_flash_time; /* кадров вспышки фона (flash_time) */ -/* Цвет вспышки: 0 = ярко-жёлтая (меч), 1 = красная (зелье). В оригинале это - * flash_color; нам хватает двух значений, которые реально встречаются. */ -uint8_t pop_flash_color; -static int8_t pickup_obj_type; /* -1 = меч (порт pickup_obj_type) */ - -/* do_pickup (seg006:1671): стереть предмет с карты (тайл → пол) и запомнить - * тип; сам эффект применяет опкод GET_ITEM внутри сиквенса. */ -static void do_pickup(int8_t obj_type, uint8_t tilepos) -{ - pickup_obj_type = obj_type; - g_fg[tilepos] = TILE_FLOOR; - /* ...и В ДАННЫХ УРОВНЯ тоже, ПРЯМО СЕЙЧАС. У оригинала curr_room_tiles — - * это сама таблица уровня, так что `= tiles_1_floor` (seg006:1671) виден - * всем в тот же миг; у нас fg живёт в двух местах (буфер отрисовки g_fg - * и EMM-страница уровня), и раньше страницу правил главный цикл — ПОЗЖЕ - * в кадре, уже после pop_process_trobs. - * - * Из-за этого зазора trob поднятого зелья успевал проснуться: код тайла - * он читает из страницы уровня, там ещё зелье — и animate_potion крутил - * фазу пузырька поверх только что обнулённого модификатора, - * bubble_next_frame(0) = 1. Модификатор оставался ЕДИНИЦЕЙ навсегда - * (room_modif персистентен), а для ПОЛА в паласе modif 1 означает «узор - * не рисовать» (seg008:499, `if (num == !!level_type) return`) — синяя - * лента пропадала на месте выпитого зелья и не возвращалась даже после - * полной перерисовки комнаты (BUG-POTION-STRIPE). Теперь тайл в - * странице — пол сразу, trob того же кадра уходит в default и снимается - * (type = −1), модификатор остаётся нулём. То же лечит и меч: там - * animate_sword делал `--mod[tp]` из нуля и получал 255. */ - pop_level_set_tile(g_room, tilepos, TILE_FLOOR); - /* curr_room_modif[curr_tilepos] = 0 (seg006:1676): у зелья в модификаторе - * лежал тип+фаза пузырька, у меча — счётчик блеска. Тайл стал полом — - * мусор в модификаторе не нужен (в исходное его вернёт только рестарт). */ - { - uint8_t *m = pop_trob_modif(g_room); - if (m) m[tilepos] = 0; - } - pop_item_taken = (uint8_t)(tilepos + 1); -} - -/* proc_get_object (seg006:16CB): эффект поднятого предмета. Зовётся из - * play_seq по опкоду SEQ_GET_ITEM с аргументом 1 (pop_kid). - * - * ПЕРВАЯ СТРОКА ОРИГИНАЛА — `if (Char.charid != charid_0_kid || ...) return`: - * предмет ЗАБИРАЕТ любой персонаж (тайл стирает do_pickup), а ЭФФЕКТ - * достаётся только Киду. На этом стоит всё спецсобытие уровня 5: тень - * выпивает зелье, оно исчезает — и не достаётся никому. Без проверки - * hitp_delta уходил бы Киду, то есть тень его лечила бы (найдено при - * портировании L5-SHADOW 2026-08-11, до живого прогона). */ -void pop_proc_get_object(void) __banked -{ - if (Char.charid != CHARID_0_KID) return; - if (pickup_obj_type == -1) { - pop_have_sword = 1; /* в оригинале have_sword = -1 */ - pop_sfx_play(37); /* победный трек «меч найден» */ - /* Вспышка фона: flash_color = color_14_brightyellow, flash_time = 8 - * (seg006 proc_get_object). do_flash = set_bg_attr(0, color) — - * оригинал подменяет НУЛЕВУЮ запись палитры, т.е. вспыхивает всё - * чёрное поле экрана. У нас так же (gfx_pal_set 0), см. SprPoP. */ - pop_flash_time = 8; - } - else { - /* proc_get_object (seg006:1927), ветка зелий. Типы 3/4/6 - * (перо/переворот/открыть все ворота) — свойства поздних уровней, - * их портируем вместе с этими уровнями. */ - switch (pickup_obj_type) { - case 1: /* здоровье: +1 HP, красная вспышка */ - if (hitp_curr != hitp_max) { - pop_sfx_stop(); /* seg006:1871 — stop_sounds */ - pop_sfx_play(33); - hitp_delta = 1; - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 2; - } - break; - case 2: /* большая склянка: +1 к ПОТОЛКУ HP */ - pop_sfx_stop(); /* seg006:1878 — stop_sounds */ - pop_sfx_play(30); - pop_kid_add_life(); - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 4; /* seg006:1878 — вспышка длиннее */ - break; - case 3: /* ПЕРО: медленное падение */ - /* feather_fall (seg000:15F8): взвести эффект + ЗЕЛЁНАЯ вспышка - * на 3 кадра (flash_color = 2). Оригинал здесь же глушит звуки - * и играет sound_39_low_weight — по нему же меряет срок; у нас - * срок задан кадрами (POP_FEATHER_FRAMES). */ - pop_feather = POP_FEATHER_FRAMES; - pop_sfx_stop(); - pop_sfx_play(39); /* «низкий вес» — весь эффект */ - pop_flash_color = POP_FLASH_GREEN; - pop_flash_time = 3; - break; - case 4: /* ПЕРЕВОРОТ: картинка вверх ногами */ - /* toggle_upside (seg000:15E9): ВЕСЬ эффект — инверсия флага и - * пометка «перерисовать, потому что перевернулись». Ни вспышки, - * ни звука, ни урона у этой ветки нет (seg006:1885). Сам - * переворот уже нарисованного делает приложение - * (pop_flip_screen, sprpop_cold.c). */ - pop_upside_want = (uint8_t)!pop_upside_want; - pop_upside_dirty = 1; - break; - case 5: /* «злое» зелье (синее): −1 HP */ - /* seg006:1892. Своей вспышки у этой ветки НЕТ (в отличие от - * лечебных): красный кадр даёт общий механизм «Кид ранен» - * (flash_if_hurt, seg003:0AFC) — у нас pop_kid_hurt. Раньше мы - * ставили вспышку руками, то есть красили экран дважды. - * Level 15/copy protection отсутствует, поэтому синие склянки - * всегда забирают ровно одну единицу здоровья. */ - pop_sfx_stop(); /* seg006:1893 — stop_sounds */ - pop_sfx_play(13); - hitp_delta = -1; - break; - default: /* 6 «открыть все ворота» — TODO - * вместе с его уровнем (13) */ - break; - } - } - pickup_obj_type = 0; -} - -/* check_get_item + get_item (seg005:061F/073E). Возврат: 0 — предмета нет - * (управление идёт обычной веткой); 1 — присесть (caller зовёт crouch()); - * 2 — поднять меч (caller ставит seq_91). */ -uint8_t pop_get_item_action(void) __banked -{ - uint8_t t; - int8_t icol; - t = get_tile_at_char(); - if (t == TILE_POTION || t == TILE_SWORD) { /* стоим НА предмете */ - if (!tile_is_floor(get_tile_behind_char())) return 0; - Char.x = (uint8_t)char_dx_forward(-TILE_SIZEX); /* отступить на тайл */ - determine_col(); - } - t = get_tile_infrontof_char(); /* заодно ставит g_infrontx */ - if (t != TILE_POTION && t != TILE_SWORD) return 0; - icol = g_infrontx; - if (icol < 0 || icol > 9) return 0; /* предмет за швом — не наш */ - if (Char.frame != FRAME_109_CROUCH) { - /* Ещё стоим: подровняться к предмету и присесть. */ - int d = pop_edge_distance(); /* ставит g_edge_type */ - if (g_edge_type != EDGE_FLOOR) - Char.x = (uint8_t)char_dx_forward((int8_t)d); - if (Char.direction >= 0) - Char.x = (uint8_t)char_dx_forward((int8_t)((t == TILE_POTION) - 2)); - return 1; - } - { - uint8_t tp = (uint8_t)(Char.curr_row * 10 + icol); - if (t == TILE_SWORD) { - do_pickup(-1, tp); - return 2; /* поднять меч (seq_91) */ - } - /* Зелье: тип лежит в СТАРШИХ битах модификатора (get_item, - * seg005: do_pickup(curr_room_modif[curr_tilepos] >> 3)). */ - do_pickup((int8_t)(pop_trob_modif(g_room)[tp] >> 3), tp); - return 3; /* пить (seq_78) */ - } -} - -/* Спецсобытие уровня 12 «появление плит» (seg006:1063, ветка внутри - * check_on_floor). После слияния с тенью (pop_united_shadow == −1) в - * верхнем ряду комнат 2 и 13 пропасти становятся проходимыми: персонаж, - * который ДОЛЖЕН БЫЛ провалиться, вместо этого достраивает под собой пол. - * Плита появляется ровно под ним, шаг за шагом — это не «включили этаж», а - * дорожка, возникающая под ногами. - * - * Возврат 1 = «пол появился, падать не надо». Перерисовываем сам тайл и - * соседа справа на ОБЕИХ страницах — тем же приёмом, что pop_skel_wake_tile - * (у оригинала это пара set_redraw_full/set_wipe на curr_tilepos и +1). - * - * Комната берётся РЕЗОЛВНУТОЙ (tile_room_of): персонаж может стоять в шве, - * и тогда пол обязан появиться в соседней комнате, как и у оригинала — - * там get_tile переставляет curr_room/curr_tilepos до присваивания. */ -#define HIDDEN_FLOOR_ROOM_A 2 -#define HIDDEN_FLOOR_ROOM_B 13 -#define HIDDEN_FLOOR_COL_B 6 /* в комнате 13 — только правая половина */ - -static uint8_t floors_appear(void) -{ - uint8_t room, tp; - if (pop_current_level != SHADOW_FIGHT_LEVEL) return 0; - if (pop_united_shadow >= 0) return 0; /* только ПОСЛЕ слияния */ - if (Char.curr_row != 0) return 0; - if (Char.room != HIDDEN_FLOOR_ROOM_A && - !(Char.room == HIDDEN_FLOOR_ROOM_B && Char.curr_col >= HIDDEN_FLOOR_COL_B)) - return 0; - room = tile_room_of(Char.curr_col, Char.curr_row, &tp); - if (!room) return 0; - pop_level_set_tile(room, tp, TILE_FLOOR); - if (room == g_room) { - g_fg[tp] = TILE_FLOOR; - pop_set_redraw(tp, POP_RD_FLOOR, 2); - if ((tp % 10) < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_FLOOR, 2); - } - return 1; -} - -/* ---- Диспетчер ----------------------------------------------------- */ -static void check_on_floor(void) -{ - if (kid_cur_flags() & FRAME_NEEDS_FLOOR) { - if (get_tile_at_char() == TILE_WALL) - in_wall(); /* забежал в стену -> выровнять */ - if (!tile_is_floor(g_curr_tile) && !floors_appear()) - start_fall(); - } -} - -static void check_action(void) -{ - uint8_t action = Char.action, frame = Char.frame; - /* Зацеп прямо в прыжке (улучшение SDLPoP, seg006:0914) — ДО всего - * остального: если получилось, кадр уже сменён на вис. */ - if (POP_ENABLE_JUMP_GRAB && action == ACT_RUNJUMP && - pop_ctrl_shift_held() && check_grab_run_jump()) - return; - if (action == ACT_BUMPED || action == ACT_HANGSTRAIGHT) { - /* ТОЛЬКО кадр 109 (присед) — как в ванильном seg006:909. Кадры - * вставания 110..119 сюда добавляет ОПЦИОНАЛЬНЫЙ FIX_STAND_ON_THIN_AIR, - * и он состоит из ТРЁХ частей: (1) эта ветка, (2) отмена падения, - * если в 2 px позади ещё пол (seg006:1079), (3) ПРАВКА seqtbl — - * dx(1)→dx(0) и dx(−4)→dx(−3) в standup. У нас seqtbl извлечён из - * данных оригинала, третью часть не применить, а без неё вставание - * уносит весовую точку на 4 px вперёд — в стену. Именно половинчатый - * порт этого фикса ронял Кида сквозь пол: комната 5, приземление с - * уроном на щебень (2,7) у стены (2,8), вставание → колонка 8 = стена - * → start_fall → выпадение в комнату 6 (BUG-STANDUP-1). Ванильное - * поведение (кадр 109) от этого свободно; цена — «встать на воздухе» - * у самой кромки, ровно как в оригинале 1989 года. */ - if (frame == 109) - check_on_floor(); - } else if (action == ACT_FREEFALL) { - do_fall(); - } else if (action == ACT_MIDAIR) { - /* Кадры 102..105 — НАЧАЛО падения (seg006:0619). Здесь fall_y ещё - * не разгоняется (fall_accel работает только в ACT_FREEFALL), то есть - * это САМОЕ ШИРОКОЕ окно зацепа: ветка стояла заглушкой, и первые - * четыре кадра падения зацеп не работал вовсе — отсюда «иногда - * цепляется, иногда нет» на входе в уровень 7. */ - if (frame >= 102 && frame < 106) - check_grab(); - } else if (action != ACT_HANGCLIMB) { - check_on_floor(); - } -} - -/* bumped_fall (seg004:0522): удар, когда под персонажем НЕ пол ИЛИ он высоко - * над полом — отскок назад и падение (seq_45). В свободном падении сиквенс - * не меняем, только гасим горизонтальную составляющую. */ -static void bumped_fall(void) -{ - Char.x = (uint8_t)char_dx_forward(-4); - if (Char.action == ACT_FREEFALL) { - Char.fall_x = 0; - } else { - pop_char_set_seq(SEQ_45_BUMPFALL); - play_seq(); - } - /* bumped_sound (seg004:05F1) — ВНЕ ветвления, как в оригинале: удар о - * стену слышен и в свободном падении. Флаг «Кид нашумел» взводится - * вместе со звуком — см. BUG-GUARD-DEAF-1. */ - pop_sfx_play(8); - is_guard_notice = 1; -} - -/* bumped_floor (seg004:053B): удар о стену, когда под персонажем ПОЛ. - * Портируется целиком — раньше у нас был только хвост (seq_47), из-за чего - * терялись ДВЕ вещи: прижатие Y к полу и «жёсткий» вариант удара. Симптом - * (комната 5, прыжок в решётку): standjump бампится на кадре 25 — том самом, - * где сиквенс уже сделал dy(−6), а парного dy(+6) ещё не было, — и Kid - * оставался стоять на 6 пикселей ВЫШЕ пола, без приземления-приседания. */ -static void bumped_floor(void) -{ - uint8_t frame; - /* Оригинал сравнивает БЕЗЗНАКОВО: если персонаж НИЖЕ уровня пола, - * разность заворачивается в большое число и тоже даёт «падать». */ - if ((uint16_t)(pop_y_land[Char.curr_row + 1] - (int16_t)Char.y) >= 15) { - bumped_fall(); /* высоко над полом — в воздухе */ - return; - } - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; /* ПРИЖАТЬ к полу */ - if (Char.fall_y >= 22) { /* влетел быстро — только отжать */ - Char.x = (uint8_t)char_dx_forward(-5); - return; - } - Char.fall_y = 0; - /* `if (Char.alive)` (seg004:0520) — у ЖИВОГО (alive = −1) сиквенс удара - * ставится ВСЕГДА, даже если персонаж уже в отскоке. Раньше здесь стоял - * наш guard `if (Char.action == ACT_BUMPED) return;` («не рестартить») — и - * он был корнем BUG-STANDUP-1: - * 1) вставание из приседа (medland) двигает Кида на 1 px в стену — - * срабатывает бамп; - * 2) bumped_floor ПРИЖИМАЕТ y к полу (181), отменяя dy(−2), который - * medland сделал в начале; - * 3) наш guard возвращает управление, medland продолжается и делает - * свои dy(+1), dy(+1) — теперь уже ОТ уровня пола, то есть Кид - * оказывается НИЖЕ пола (y = 182); - * 4) следующий бамп видит «персонаж ниже пола» (беззнаковая разность - * заворачивается) и уводит его в bumped_fall → seq_45 → выпадение - * в комнату снизу. - * У оригинала шага (3) нет: seq_47 обрывает medland, и лишних dy не - * случается. */ - if (!Char.alive) return; /* труп — только выравнивание */ - frame = Char.frame; - /* Кадры прыжков и начала падения — «жёсткий» удар с приседанием - * (24/25 = standjump, 40..42 = runjump, 102..106 = start_fall). */ - if (frame == 24 || frame == 25 || (frame >= 40 && frame < 43) || - (frame >= 102 && frame < 107)) - pop_char_set_seq(SEQ_46_HARDBUMP); - else - pop_char_set_seq(SEQ_47_BUMP); - play_seq(); - pop_sfx_play(8); /* bumped_sound (seg004:05F1) */ - is_guard_notice = 1; -} - -/* bump_into_opponent (seg003:08AA). Зовётся из play_kid_frame (seg000:1238) - * между set_char_collision и check_collisions, и ТОЛЬКО у Кида — у стража - * этой ветки нет (см. комментарий к guard_phys ниже). - * - * ЗАЧЕМ. Это единственная защита оригинала от «вошёл в комнату — сразу - * труп». Стража при входе никуда не отбрасывает: enter_guard (seg002:0112) - * ставит его ровно в его тайл из данных уровня, и Кид вполне может войти - * вплотную. Спасает то, что БЕЗОРУЖНЫЙ Кид, столкнувшись с вооружённым - * соперником лицом к лицу, не получает укол, а ОТСКАКИВАЕТ (seq_47). - * Остальные три страховки у нас уже есть: Кид сам достаёт меч - * (control_standing, pop_ctrl.c), страж поднимается в стойке покоя с мечом - * в ножнах (pop_guard_cold.c) и не колет ближе 12 (guards.c). - * - * Расхождений с оригиналом нет. Опциональные фиксы SDLPoP - * (fix_painless_fall_on_guard — падение на стража с высоты перестаёт быть - * безболезненным; fix_jumping_over_guard — нельзя перепрыгнуть) намеренно НЕ - * портированы: базовое поведение движка 1989 года. */ -static void bump_into_opponent(void) -{ - int16_t distance; - if (can_guard_see_kid < 2) return; - if (Char.sword != 0) return; /* Кид уже в боевой стойке */ - if (Opp.sword == 0) return; /* у соперника меч в ножнах */ - if (Opp.action >= 2) return; /* только stand / run_jump */ - if (Char.direction == Opp.direction) return; /* должны быть лицом к лицу */ - distance = pop_char_opp_dist(); - if (distance < 0) distance = -distance; - if (distance > 15) return; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.fall_y = 0; - pop_sfx_play(16); /* seg003:0654 — толчок о стража */ - pop_char_set_seq(SEQ_47_BUMP); - play_seq(); -} - -/* ---- check_collisions (seg004:0004) -------------------------------- * - * ПОЛНЫЙ порт: флаги перекрытия считаются для ВСЕХ колонок ряда, а колонка - * удара выбирается обходом 9→0 по переходу флага 0→1. - * - * ПОЧЕМУ НЕ «колонка переднего края» (как было до 2026-08-03, BUG-COLL-1): - * колонка края попадает на стену лишь пока край внутри её габаритного окна, - * а окно узкое. Для решётки в col9 (x_bump[14]=184, coll_left=191, левая - * грань 191+10=201) это ровно 201..204 — четыре пикселя. Беговой кадр - * сдвигает край больше чем на четыре, край перескакивает с ≤200 сразу на - * ≥205 (это уже колонка 10, соседняя комната, не стена) — бампа нет, а - * check_leave тут же видит char_x_right ≥ 201 и уводит Кида СКВОЗЬ - * ЗАКРЫТУЮ РЕШЁТКУ. Флаг колонки 9 в оригинале взводится при любом - * перелёте, потому что сравнивается не колонка края, а КООРДИНАТЫ: - * 0x0F = left_wall_xpos < char_x_right_coll («в левую грань стены») - * 0xF0 = right_wall_xpos > char_x_left_coll («в правую грань») - * Тем же корнем лечится влёт в стену на длинном прыжке (комн. 6) и провал - * сквозь пол после приземления у стены (комн. 5). - * - * ТРИ РЯДА — как в оригинале (было: один, и это оказалось BUG-JUMPWALL-1). - * Оригинал каждый кадр считает флаги для рядов row−1, row, row+1, а - * move_coll_to_prev (seg004:00DF) в начале СЛЕДУЮЩЕГО кадра выбирает из них - * тот, что соответствует ряду прошлого кадра. Так «прошлые» флаги остаются - * настоящими и на кадре смены ряда. - * - * Наш прежний упрощённый вариант (prev = 3 = «уже перекрывал») подавлял бамп - * ровно на этом кадре — а в падении ряд меняется чуть ли не каждый кадр, и - * переход 0→1 на стене приходится как раз на него. Симптом: недолетевший - * прыжок уходит СКВОЗЬ кладку по свободной траектории (ур. 3 комн. 14). - * Цена трёх рядов — 3×14 get_tile на кадр вместо 14; замерено, что это - * дешевле любого из обходных вариантов, а поведение совпадает с оригиналом. - * - * Ряды вне комнаты (−1 и 3) считаются штатно: get_tile сам резолвит ряд −1 - * через комнату сверху (g_above), а ряд 3 отдаёт WALL — то же «через край - * не бампим», что и раньше. */ -/* Колонки считаем от −2 до 11, а не 0..9: колонки за швом — это тайлы - * СОСЕДНЕЙ комнаты (get_tile резолвит их через g_lcol/g_rcol), и решётка - * соседа обязана бампить так же, как своя (иначе Kid уходит сквозь - * закрытые ворота шва — старый BUG-SEAM-PINGPONG). Оригинал делает то же - * самое: get_row_collision_data идёт от col(char_x_left)−1 до - * col(char_x_right)+2 и резолвит комнату через find_room_of_tile, а - * координата грани (coll_tile_left_xpos) остаётся в системе ОТРИСОВАННОЙ - * комнаты — как у нас pop_x_bump[col + FIRST_ONSCREEN_COLUMN]. */ -#define COLL_C0 (-2) /* первая считаемая колонка */ -#define COLL_N 14 /* колонки −2..11 */ -#define COLL_IDX(c) ((c) - COLL_C0) -#define COLL_ROW_NONE ((int8_t)-128) -static uint8_t coll_prev[COLL_N], coll_curr[COLL_N]; -static uint8_t coll_above[COLL_N], coll_below[COLL_N]; -static int8_t coll_prev_row = COLL_ROW_NONE; /* ряд, к которому относится coll_prev */ -/* ОКНО перебора: какие слоты реально посчитаны. Оригинал (seg004:0047) тоже - * считает не всю комнату, а полосу вокруг персонажа — left_checked_col / - * right_checked_col; прочие слоты у него помечены «комнаты нет» - * (row_coll_room_ptr = −1) и в цикл бампа не попадают. - * - * Раньше мы считали все четырнадцать колонок, чтобы не заводить признак - * годности слота. Замер по сгенерированному асму показал, чего это стоит: - * ~940 тактов на колонку (из них 574 — get_tile), 3 ряда × 14 = ~39 600 за - * кадр у Кида плюс ~13 200 у стража (check_chomped_guard) — вместе ~12 % - * кадрового периода. Окно из 4–5 колонок режет это втрое. - * - * Признак годности у нас дешевле оригинального: не массив номеров комнат, - * который надо чистить каждый кадр, а ГРАНИЦЫ окна — четыре байта. Слот - * годен, если лежит в окне; сравнивать prev с curr можно только на - * ПЕРЕСЕЧЕНИИ двух окон. Очистки массивов нет вовсе. */ -static int8_t coll_lo, coll_hi; /* окно coll_curr/above/below */ -static int8_t coll_prev_lo, coll_prev_hi; /* окно coll_prev */ -static int8_t win_lo, win_hi; /* результат calc_coll_window */ -/* «нет колонки»: НЕ −1, потому что −1/−2 — законные колонки шва. */ -#define BUMP_NONE ((int8_t)-128) -static int8_t bump_col_l; /* bump_col_left_of_wall (Kid лицом ВПРАВО) */ -static int8_t bump_col_r; /* bump_col_right_of_wall (Kid лицом ВЛЕВО) */ -static int coll_xl, coll_xr; /* char_x_left_coll / char_x_right_coll */ - -/* Ряд, к которому относилась история ДО последней инвалидации — чтобы - * pop_coll_shift мог её восстановить (см. ниже). */ -static int8_t coll_last_row = COLL_ROW_NONE; - -/* Смена комнаты: колонки перепроецированы, прошлые флаги недействительны. - * В оригинале это несовпадение prev_coll_room и curr_row_coll_room — - * на кадре входа бампа нет. Безопасный дефолт для ЛЮБОГО входа в комнату - * (старт уровня, респавн, чит-навигация, переход вверх/вниз); боковой - * переход тут же отменяет его через pop_coll_shift. */ -static void pop_coll_invalidate(void) -{ - coll_last_row = coll_prev_row; - coll_prev_row = COLL_ROW_NONE; -} - -/* БОКОВОЙ переход: историю не выбрасываем, а СДВИГАЕМ (BUG-GATE-PASS-1). - * - * Оригинал (seg004:0004) индексирует флаги колонкой ВНУТРИ разрешённой - * комнаты и хранит рядом номер этой комнаты (row_coll_room_ptr), сравнивая - * prev/curr только при совпадении номеров. Решётка комнаты 8 и до перехода - * 8->6, и после лежит в слоте 9 с room = 8 — история переживает переход, - * переход флага 0->1 виден, bumped() срабатывает. У нас индекс — колонка - * ОТРИСОВАННОЙ комнаты, поэтому тот же тайл менял слот, история терялась, и - * Кид с разбега проходил сквозь закрытые ворота шва. - * - * Физически колонки сдвигаются ровно на 10 (check_leave двигает x на ∓140 = - * 10 тайлов по 14 px), и координата грани (pop_x_bump) сдвигается на те же - * 140 вместе с габаритом Кида — значит САМИ ФЛАГИ инвариантны, меняется - * только их номер слота. Отсюда весь фикс — перенумерация. - * - * Сдвигаем curr/above/below, а не prev: prev на следующем кадре всё равно - * перезапишет move_coll_to_prev, выбирая источник как раз из этих трёх. - * Освободившиеся слоты — 3 («уже перекрывал»), то есть бампа по ним нет: - * ровно то, что в оригинале даёт несовпадение номера комнаты. - * - * dcol — насколько изменились НОМЕРА колонок: уход вправо −10, влево +10. - * Отличия от дословного порта варианта A — applications/PoP/docs/impl_diff.md. */ -static void coll_shift_one(uint8_t *a, int8_t dcol) -{ - int8_t i, j; - if (dcol < 0) { /* источник правее — идём вперёд */ - for (i = 0; i < COLL_N; i++) { - j = (int8_t)(i - dcol); - a[i] = (j < COLL_N) ? a[j] : 3; - } - } else { /* источник левее — идём назад */ - for (i = COLL_N - 1; i >= 0; --i) { - j = (int8_t)(i - dcol); - a[i] = (j >= 0) ? a[j] : 3; - } - } -} - -void pop_coll_shift(int8_t dcol) __banked -{ - if (coll_last_row == COLL_ROW_NONE) return; /* истории и не было */ - coll_prev_row = coll_last_row; /* отменить инвалидацию */ - coll_shift_one(coll_curr, dcol); - coll_shift_one(coll_above, dcol); - coll_shift_one(coll_below, dcol); - /* окно посчитанных слотов едет вместе с ними; выйти за [COLL_C0..] оно - * может свободно — пересечение с окном следующего кадра само обрежет. */ - coll_lo = (int8_t)(coll_lo + dcol); - coll_hi = (int8_t)(coll_hi + dcol); -} - -/* set_char_collision (seg006:0723), горизонтальная часть: габарит персонажа - * в комнатных координатах. char_x_left = obj_x/2 + 58 (минус полуширина при - * взгляде вправо) — это ровно наш char_x_forward_edge для переднего края. */ -static void set_char_collision(void) -{ - int e = char_x_forward_edge(); - int wh = ((int)CD_ACT->fpw + 1) >> 1; /* char_width_half */ - if (Char.direction < 0) { coll_xl = e; coll_xr = e + wh; } - else { coll_xr = e; coll_xl = e - wh; } - if (kid_cur_flags() & FRAME_THIN) { coll_xl += 4; coll_xr -= 4; } -} - -/* move_coll_to_prev (seg004:00DF): в prev кладём флаги ряда, в котором - * персонаж был НА ПРОШЛОМ кадре. Массивы curr/above/below в этот момент - * ещё хранят прошлый кадр, поэтому нужный ряд просто выбирается из них по - * разнице рядов. Условия — дословно оригинальные, включая ±3: ряд может - * «завернуться» при смене комнаты (2 -> 0 вниз, 0 -> 2 вверх), и тогда - * геометрия колонок та же, что у текущего ряда. - * - * Первый кадр (и кадр после смены комнаты, pop_coll_invalidate) прошлого - * ряда не имеет: prev = «уже перекрывал всё», бампа на нём нет. */ -static void move_coll_to_prev(int8_t row) -{ - const uint8_t *src; - /* Окно prev — то, по которому считались curr/above/below (у всех трёх оно - * одно). Забираем ДО того, как check_collisions пересчитает своё. */ - coll_prev_lo = coll_lo; coll_prev_hi = coll_hi; - if (coll_prev_row == COLL_ROW_NONE) { - memset(coll_prev, 3, COLL_N); - coll_prev_lo = COLL_C0; coll_prev_hi = COLL_C0 + COLL_N - 1; - return; - } - if (row == coll_prev_row || row + 3 == coll_prev_row || row - 3 == coll_prev_row) - src = coll_curr; /* ряд не менялся */ - else if (row + 1 == coll_prev_row || row - 2 == coll_prev_row) - src = coll_above; /* поднялся на ряд */ - else - src = coll_below; /* опустился на ряд */ - /* memcpy, а не цикл: SDCC пересчитывал адрес назначения на КАЖДОЙ - * итерации через слот кадра IX — 14 байт обходились в 5 514 тактов. */ - memcpy(coll_prev, src, COLL_N); -} - - -/* Окно перебора (seg004:0047). Считать ПОСЛЕ set_char_collision — берётся из - * coll_xl/coll_xr. Клампы: справа как в оригинале (не дальше последней - * колонки), слева — по нашему COLL_C0 (оригиналу клампить нечего, у него - * индекс приходит уже разрешённым внутрь комнаты). */ -static void calc_coll_window(void) -{ - int8_t hi = (int8_t)(get_tile_div_mod_m7(coll_xr) + 2); - int8_t lo = (int8_t)(get_tile_div_mod_m7(coll_xl) - 1); - if (hi > COLL_C0 + COLL_N - 1) hi = COLL_C0 + COLL_N - 1; - if (lo < COLL_C0) lo = COLL_C0; - if (hi < lo) hi = lo; - win_lo = lo; win_hi = hi; -} - -/* Тело перебора: src — тайлы ряда ПОДРЯД, dst — куда класть флаги. Всё - * остальное вынесено в статики намеренно: у SDCC z80 каждый лишний - * параметр/локал уезжает в кадр IX, а `ld -n(ix)` стоит 19 тактов номинала - * (у нас с wait-state'ами ~46). - * - * Замер одной итерации в MAME: пустая колонка 750 тактов, колонка-стена - * ~1 700 (там две 16-битные знаковые сверки граней). */ -static uint8_t scan_n; /* сколько колонок осталось */ -static uint8_t scan_left; /* левая грань текущей колонки */ - -/* ПОРОГИ СРАВНЕНИЯ, предпосчитанные на кадр (по типу стены 1..5). - * - * В теле цикла стояло `wall_dl[wt] + scan_left < coll_xr` и - * `scan_left - wall_dr[wt] + TILE_RIGHTX > coll_xl` — четыре 16-битных - * операции на КАЖДУЮ колонку, при том что от колонки зависит ровно один - * операнд (scan_left). Переносим всё остальное в порог: - * - * scan_left < coll_xr - wall_dl[wt] = thr_l[wt] - * scan_left > coll_xl + wall_dr[wt] - TILE_RIGHTX = thr_r[wt] - * - * Оригинал считает это в лоб (get_left_wall_xpos / get_right_wall_xpos, - * seg004:0226) — он писался под 386, где 16-битная арифметика бесплатна. - * - * ПОЧЕМУ 8 БИТ КОРРЕКТНЫ (доказательство относится и к границам, и к - * слагаемым в самом цикле). scan_left = x_bump[col + 5] + TILE_MIDX, а - * колонка окна лежит в COLL_C0 .. COLL_C0+COLL_N-1, то есть −2..11: - * значит scan_left ∈ [x_bump[3]+7, x_bump[16]+7] = [37, 219], и после - * последней колонки максимум 233. Ни одного выхода за uint8_t. - * Сами пороги считаются в int и КЛИПУЮТСЯ к 0..255 — это не приближение, - * а точное сохранение результата: при пороге ниже 37 условие «меньше» не - * выполнится никогда (клип к 0 даёт то же), при пороге выше 219 оно - * выполнится всегда (клип к 255 даёт то же), и симметрично для «больше». */ -static uint8_t coll_xr8, coll_xl8; - -static uint8_t clip_thr(int v) -{ - if (v < 0) return 0; - if (v > 255) return 255; - return (uint8_t)v; -} - -/* Две границы персонажа, приведённые к 8 битам. ТАБЛИЦЫ ПОРОГОВ ПО ТИПУ - * СТЕНЫ ЗДЕСЬ БЫЛА И ОКАЗАЛАСЬ ХУЖЕ: предпосчёт пяти пар порогов стоил - * дороже, чем экономил, потому что колонок в окне всего четыре-пять, а - * типов стен пять (замер 2026-08-19: check_collisions 33 846 -> 36 570, - * синяя фаза +10 269). Классическая ошибка — кэшировать больше, чем - * потребляешь. */ -static void coll_thresholds(void) -{ - coll_xr8 = clip_thr(coll_xr); - coll_xl8 = clip_thr(coll_xl); -} - -static uint8_t *scan_dst; - -static void coll_scan(const uint8_t *src) -{ - do { - uint8_t wt = wall_type_tbl[*src++ & 0x1F]; - uint8_t f = 0; - if (wt) { - /* ВСЯ арифметика в 8 битах — см. доказательство диапазонов - * над coll_thresholds: scan_left ∈ [37, 233], wall_dl ∈ [−1, 10], - * wall_dr ∈ [0, 13], значит обе суммы лежат в [36, 246] и - * переполниться не могут. */ - if ((uint8_t)(scan_left + wall_dl[wt]) < coll_xr8) f = 1; - if ((uint8_t)(scan_left - wall_dr[wt] + TILE_RIGHTX) > coll_xl8) f |= 2; - } - *scan_dst++ = f; - scan_left += TILE_SIZEX; - } while (--scan_n); -} - -/* Всё, что НЕ зависит от ряда, считается один раз на кадр. Раньше это жило - * в теле ряда, и пролог одного ряда стоил тысячи тактов при том, что сам - * цикл по четырём-пяти колонкам — около трёх. */ -static uint8_t scan_n0; -static uint8_t scan_left0; -static uint8_t scan_off; /* индекс первого слота в flags[] */ - -static void coll_scan_prepare(void) -{ - scan_left0 = (uint8_t)(pop_x_bump[win_lo + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - scan_n0 = (uint8_t)(win_hi - win_lo + 1); - scan_off = (uint8_t)COLL_IDX(win_lo); - coll_thresholds(); /* здесь же, чтобы порог и окно всегда были от - * ОДНОГО персонажа — та же причина, по которой - * тут считается scan_left0 (см. BUG-GUARD-IX-1 - * в шапке get_row_collision_data). */ -} - -/* Базы ряда: указатели, которые индексируются НОМЕРОМ КОЛОНКИ (в том числе - * отрицательным). Ноль = «этой стороны нет» → стена. Ряд разрешается один - * раз на ряд, а не в каждом get_tile: тот на каждый вызов заново решал «ряд - * −1? за комнатой? слева/справа?» и считал row*10+col сдвигами (1 422 такта - * на вызов при 12-15 вызовах за кадр). */ -static const uint8_t *rb_own, *rb_lft, *rb_rgt; - -/* Ряд, целиком состоящий из стены — для стороны, которой нет (край уровня, - * ряд вне комнаты). Дешевле, чем ветка «а тут стена» внутри цикла. */ -static const uint8_t wall_row[COLL_N] = { - TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL, - TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL,TILE_WALL -}; - -/* get_row_collision_data (seg004:0185) для одного ряда: бит0 = «персонаж - * достал левую грань стены колонки», бит1 = «правую». Считаем ОКНО - * win_lo..win_hi (см. calc_coll_window), слоты вне окна не трогаем — их - * годность определяют границы окна, а не содержимое. - * - * Окно режется на НЕПРЕРЫВНЫЕ пробеги: комната слева (колонки < 0), своя - * (0..9), справа (> 9). По каждому идёт тот же coll_scan с шагающим - * указателем, поэтому вопрос «а эта колонка чья?» решается по одному разу - * на пробег, а не на колонку. Первая версия собирала тайлы окна во - * временный буфер тернарником на колонку — 1 340 тактов на колонку, вдвое - * дороже самого перебора; у Кида, стоящего в колонке 0, окно начинается с - * −1, так что это был не редкий, а ОБЫЧНЫЙ путь. - * - * scan_left между пробегами не сбрасывается: coll_scan сам двигает его на - * тайл за колонку — ровно как оригинал (coll_tile_left_xpos += TILE_SIZEX). */ -static void coll_row(uint8_t *flags) -{ - int8_t lo = win_lo, last; - uint8_t n; - uint8_t *dst = flags + scan_off; - scan_left = scan_left0; /* coll_scan сам двигает его дальше */ - if (lo < 0) { /* комната СЛЕВА */ - last = win_hi < -1 ? win_hi : -1; - n = (uint8_t)(last - lo + 1); - scan_n = n; /* coll_scan обнулит */ - scan_dst = dst; coll_scan(rb_lft ? rb_lft + lo : wall_row); - dst += n; - lo = (int8_t)(last + 1); - } - if (lo <= win_hi && lo <= 9) { /* СВОЯ комната */ - last = win_hi < 9 ? win_hi : 9; - n = (uint8_t)(last - lo + 1); - scan_n = n; - scan_dst = dst; coll_scan(rb_own ? rb_own + lo : wall_row); - dst += n; - lo = (int8_t)(last + 1); - } - if (lo <= win_hi) { /* комната СПРАВА */ - scan_n = (uint8_t)(win_hi - lo + 1); - scan_dst = dst; coll_scan(rb_rgt ? rb_rgt + lo : wall_row); - } -} - -/* Разрешить ряд «с нуля» — для одиночного вызова (страж, check_chomped_guard). - * В check_collisions три ряда получаются сдвигом баз на ±10 без пересчёта. */ -static void coll_row_bases(int8_t row) -{ - rb_own = rb_lft = rb_rgt = 0; - if (row >= 0 && row <= 2) { - int ro = (int)row * 10; - rb_own = g_fg + ro; - if (g_link_l) rb_lft = g_lcol + ro + 10; - if (g_link_r) rb_rgt = g_rcol + ro - 10; - } else if (row == -1 && g_above && g_link_u) { - rb_own = g_above; /* ряд 2 комнаты сверху */ - } -} - -/* Одиночный ряд во ВНЕШНИЙ массив (единственный вызывающий — - * check_chomped_guard). - * - * coll_scan_prepare() тут ОБЯЗАТЕЛЕН, и это не перестраховка: coll_row - * пишет по `flags + scan_off`, а число байт берёт из win_lo/win_hi. Без - * prepare scan_off/scan_left0 остаются от ПРОШЛОГО окна (его считает - * check_collisions для Кида), а окно тут уже своё, стражево. Когда - * стражево окно шире или правее кидова, запись уезжает за границу - * flags[COLL_N] — а сразу за ней в кадре check_chomped_guard лежит - * СОХРАНЁННЫЙ IX. Затёртый младший байт превращал кадровый указатель - * main (0xBFFA) в 0xBF00, и дальше main читал свои локали из чужого - * стекового мусора: игра «зависала», потому что отладочный `frozen` - * становился ненулевым (BUG-GUARD-IX-1). Заодно чинится и сам расчёт: - * scan_left0 задаёт x колонок, и страж считался по координатам Кида. */ -static void get_row_collision_data(int8_t row, uint8_t *flags) -{ - coll_scan_prepare(); - coll_row_bases(row); - coll_row(flags); -} - -static void check_collisions(void) -{ - int8_t col; - bump_col_l = bump_col_r = BUMP_NONE; - /* seg004:0044 — на кадрах разворота коллизии не считаются вовсе. */ - if (Char.action == ACT_TURN) return; - /* Вне рядов комнаты (падение мимо пола) get_tile отдаёт WALL во всех - * колонках — считать по нему нечего. Стену в падении держит - * do_fall/in_wall, выход из комнаты — check_leave_below. */ - if (Char.curr_row < 0 || Char.curr_row > 2) { - /* И coll_last_row тоже: curr/above/below остались от старого кадра, - * сдвигать их при боковом переходе нечего (поведение как раньше). */ - coll_prev_row = coll_last_row = COLL_ROW_NONE; - return; - } - - pop_dbg_p2(); /* ЗАМЕР: вход в тело */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - set_char_collision(); - pop_dbg_p3(); /* ЗАМЕР: set_char_collision */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - move_coll_to_prev(Char.curr_row); /* заодно снимет окно prev */ - coll_prev_row = Char.curr_row; - calc_coll_window(); - coll_lo = win_lo; coll_hi = win_hi; - coll_scan_prepare(); - pop_dbg_p4(); /* ЗАМЕР: окно посчитано */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Порядок важен: prev уже забран, теперь три ряда пересчитываются - * НА ЭТОТ кадр (в оригинале ровно так же, seg004:0004). Ряд здесь - * гарантированно 0..2, поэтому соседние ряды — это те же базы ±10, без - * повторного разрешения. */ - { - int ro = (int)Char.curr_row * 10; - const uint8_t *own = g_fg + ro; - const uint8_t *lft = g_link_l ? g_lcol + ro + 10 : 0; - const uint8_t *rgt = g_link_r ? g_rcol + ro - 10 : 0; - - rb_own = own; rb_lft = lft; rb_rgt = rgt; - coll_row(coll_curr); - - if (Char.curr_row < 2) { /* ряд ниже */ - rb_own = own + 10; - rb_lft = lft ? lft + 10 : 0; - rb_rgt = rgt ? rgt + 10 : 0; - } else { - rb_own = rb_lft = rb_rgt = 0; /* ряд 3 — стена везде */ - } - coll_row(coll_below); - - if (Char.curr_row > 0) { /* ряд выше */ - rb_own = own - 10; - rb_lft = lft ? lft - 10 : 0; - rb_rgt = rgt ? rgt - 10 : 0; - } else if (g_above && g_link_u) { /* ряд −1 = ряд 2 сверху */ - rb_own = g_above; rb_lft = rb_rgt = 0; - } else { - rb_own = rb_lft = rb_rgt = 0; - } - coll_row(coll_above); - } - pop_dbg_p5(); /* ЗАМЕР: три ряда просканированы */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Обход СВЕРХУ ВНИЗ, как в оригинале (9→0): побеждает МЛАДШАЯ колонка, - * в которой флаг перешёл 0→1. Только по ПЕРЕСЕЧЕНИЮ окон: вне его - * сравнивать нечего (у оригинала там prev_coll_room != curr_row_coll_room - * или curr_row_coll_room < 0 — тот же смысл). */ - { - int8_t lo = coll_lo > coll_prev_lo ? coll_lo : coll_prev_lo; - int8_t hi = coll_hi < coll_prev_hi ? coll_hi : coll_prev_hi; - for (col = hi; col >= lo; --col) { - uint8_t p = coll_prev[COLL_IDX(col)], c = coll_curr[COLL_IDX(col)]; - if (!(p & 1) && (c & 1)) bump_col_l = col; - if (!(p & 2) && (c & 2)) bump_col_r = col; - } - } -} - -/* is_obstacle (seg004:037E): препятствие ли тайл колонки на самом деле. - * Побочно оставляет тайл в g_curr_tile (как curr_tile2 у оригинала). */ -static uint8_t is_obstacle_at_col(int8_t col) -{ - uint8_t t = get_tile(col, Char.curr_row); - if (t == TILE_POTION) return 0; /* зелье не бампит */ - if (t == TILE_GATE) return (uint8_t)!gate_passable(col, Char.curr_row); - if (t == TILE_CHOMPER) /* закрыт только при modif==2 */ - return (uint8_t)(col >= 0 && col <= 9 && - pop_trob_modif(g_room)[Char.curr_row * 10 + col] == 2); - /* Прыжок СКВОЗЬ ЗЕРКАЛО (seg004:0239). Зеркало вообще-то «стена слева» - * (wall_type = 2), но для Кида в БЕГОВОМ ПРЫЖКЕ справа налево оно - * перестаёт быть препятствием: он пролетает насквозь, зеркало «бьётся» - * (modif 0x56) и взводится флаг рождения тени. Условия — все четыре, как - * в оригинале: только Кид, только кадры бегового прыжка 39..43, только - * направление влево. */ - if (t == TILE_MIRROR && Char.charid == CHARID_0_KID && - Char.frame >= 39 && Char.frame < 44 && Char.direction < 0 && - col >= 0 && col <= 9) { - pop_trob_modif(g_room)[Char.curr_row * 10 + col] = 0x56; - pop_jumped_mirror = -1; - return 0; - } - return 1; -} - -/* bumped (seg004:0448). delta_x — сдвиг персонажа В КООРДИНАТАХ (не - * «вперёд»), push_dir — куда толкает: <0 влево, >=0 вправо. Чем кончится - * удар, решает тайл, на котором персонаж оказался после отжатия: сквозь - * стену/верх двери он стоит на СОСЕДНЕЙ клетке (в сторону толчка), для - * прочих препятствий (ворота, зеркало, кусаки) — на клетке препятствия. */ -static void bumped(int delta_x, int8_t push_dir, int8_t tcol) -{ - uint8_t ct; - if (Char.alive >= 0) return; /* труп не бампит */ - Char.x = (uint8_t)((int)Char.x + delta_x); - determine_col(); - ct = g_curr_tile; /* тайл препятствия */ - if (push_dir < 0) { /* толчок ВЛЕВО */ - if (ct == TILE_WALL) - ct = get_tile((int8_t)(tcol - 1), Char.curr_row); - } else { /* толчок ВПРАВО */ - if (ct == TILE_DOORTOP || ct == TILE_DOORTOP_FLOOR || ct == TILE_WALL) - ct = get_tile((int8_t)(tcol + 1), Char.curr_row); - } - if (tile_is_floor(ct)) bumped_floor(); - else bumped_fall(); - determine_col(); -} - -/* check_bumped_look_right (seg004:030A): Kid смотрит ВПРАВО и достал ЛЕВУЮ - * грань стены — отжать влево. */ -static void check_bumped_look_right(void) -{ - int8_t col = bump_col_l; - uint8_t wt; - int coll_left; - if (Char.direction != 0) return; /* (меча в руке у нас нет) */ - if (!is_obstacle_at_col(col)) return; - /* Прежде чем удариться о стену — попытка зацепиться за её верх - * (seg004:0205, то же улучшение). Не вышло — тайл препятствия надо - * перечитать: проба зацепа сбила g_curr_tile. */ - if (POP_ENABLE_JUMP_GRAB && pop_ctrl_shift_held()) { - if (check_grab_run_jump()) return; - if (!is_obstacle_at_col(col)) return; - } - wt = wall_type(g_curr_tile); - if (!wt) return; - coll_left = pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - bumped(wall_dl[wt] + coll_left - coll_xr, -1, col); -} - -/* check_bumped_look_left (seg004:02D2): Kid смотрит ВЛЕВО и достал ПРАВУЮ - * грань стены — отжать вправо. */ -static void check_bumped_look_left(void) -{ - int8_t col = bump_col_r; - uint8_t wt; - int coll_left; - if (Char.direction >= 0) return; - if (!is_obstacle_at_col(col)) return; - if (POP_ENABLE_JUMP_GRAB && pop_ctrl_shift_held()) { /* seg004:0186 */ - if (check_grab_run_jump()) return; - if (!is_obstacle_at_col(col)) return; - } - wt = wall_type(g_curr_tile); - if (!wt) return; - coll_left = pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - bumped(coll_left - wall_dr[wt] + TILE_RIGHTX - coll_xl, 0, col); -} - -/* dist_from_wall_behind (seg004:0607) — зеркало dist_from_wall_forward: та - * же арифметика, но от ЗАДНЕЙ грани габарита (лицом вправо задняя грань — - * левая, и наоборот). Нужна только check_guard_bumped. */ -static int dist_from_wall_behind(uint8_t tiletype, int8_t tcol) -{ - uint8_t type = wall_type(tiletype); - int coll_left; - if (type == 0) return 99; - coll_left = pop_x_bump[tcol + FIRST_ONSCREEN_COLUMN] + TILE_MIDX; - if (Char.direction >= 0) /* лицом вправо */ - return coll_xl - (coll_left + TILE_RIGHTX - wall_dr[type]); - return wall_dl[type] + coll_left - coll_xr; /* лицом влево */ -} - -/* check_guard_bumped (seg004:0522) — стражья замена check_bumped, и она - * НЕ про «упереться на бегу»: срабатывает, только когда персонажа с - * ВЫНУТЫМ МЕЧОМ теснят спиной в стену (его собственный шаг назад в бою или - * наступающий Кид). Отсюда и проверки: action = run_jump, жив, меч в руке, - * а расстояние меряется от ЗАДНЕЙ грани. - * - * Порядок проб как в оригинале, включая побочный эффект: если тайл под - * персонажем не подошёл и он смотрит вправо, оригинал перечитывает тайл - * СЛЕВА (`--tile_col`), и дальше is_obstacle/dist_from_wall_behind считают - * уже по нему. */ -static void check_guard_bumped(void) -{ - int8_t col = Char.curr_col, row = Char.curr_row; - uint8_t t, hit; - int delta_x; - - if (Char.action != ACT_RUNJUMP || Char.alive >= 0 || - Char.sword < SWORD_2_DRAWN) return; - - t = get_tile_at_char(); - hit = (uint8_t)(t == TILE_WALL || t == TILE_DOORTOP_FLOOR || - (t == TILE_GATE && !gate_passable(col, row))); - if (!hit && Char.direction >= 0) { - col--; - t = get_tile(col, row); - hit = (uint8_t)(t == TILE_DOORTOP_FLOOR || - (t == TILE_GATE && !gate_passable(col, row))); - } - if (!hit) return; - - set_char_collision(); - if (!is_obstacle_at_col(col)) return; - delta_x = dist_from_wall_behind(g_curr_tile, col); - if (delta_x < 0 && delta_x > -13) { - Char.x = (uint8_t)char_dx_forward(-delta_x); - pop_char_set_seq(SEQ_65_BUMP_FWD_SWORD); - play_seq(); - pop_load_fram_det_col(); - } -} - -/* check_bumped (seg004:029D). */ -static void check_bumped(void) -{ - /* Гарды РОВНО как в оригинале: вис и подтягивание. ПАДЕНИЕ И ПОЛЁТ НЕ - * ИСКЛЮЧЕНЫ — bumped_fall (seg004:04E4) специально разбирает случай - * actions_4_in_freefall (гасит fall_x и отжимает на 4). Наш прежний - * guard `action == FREEFALL || MIDAIR -> return` и был вторым корнем - * BUG-COLL-1: длинный прыжок в стену (комната 6, между (0,6) и (0,7)) - * ничем не останавливался, и Кид оказывался ВНУТРИ кладки. */ - if (Char.action == ACT_HANGCLIMB || Char.action == ACT_HANGSTRAIGHT) return; - if (Char.frame >= 135 && Char.frame < 149) return; /* кадры подъёма/спуска */ - /* Кадры виса 87..99: в спуске (seq_68) кадр frame_91 идёт ДО act(hang_climb), - * т.е. action ещё midair — без этого guard'а bump у стены рвёт цепочку - * hang->hang_fall->seq_11 (правильное приземление). */ - if (Char.frame >= 87 && Char.frame < 100) return; - if (bump_col_l != BUMP_NONE) check_bumped_look_right(); - else if (bump_col_r != BUMP_NONE) check_bumped_look_left(); -} - -/* ---- Loose floors (seg007) ---------------------------------------- * - * Состояние на тайл: 0 = покой; 0x80..0x83 = тряска (do_knock); 1..11 = - * отсчёт до падения (на тайле стоят/пробили). Порт animate_loose/ - * make_loose_fall/check_press. Перерисовка — в pop_bg (shake/bake). */ -uint8_t pop_loose_modif[30]; /* публично: читает pop_bg при отрисовке */ - -/* Гейт холостого хода pop_loose_tick. В подавляющем большинстве кадров - * (и в целых комнатах) НИ ОДНА плита не анимируется, а два цикла по 30 и 10 - * позициям всё равно отрабатывают: замер 11/15 — 9 852 такта на комнату, - * где loose-плит нет вовсе. - * - * Ставится ПРИ ВЗВОДЕ фазы — все ШЕСТЬ мест записи ненулевого значения лежат - * в этом файле (make_loose_fall, ветка потолка в check_press, do_knock для - * обоих рядов, восстановление из room_modif в pop_loose_reset и раздача - * отложенного старта в check_fall_flo — уровень 13). - * - * ИМЕННО ЗДЕСЬ УЖЕ ОШИБЛИСЬ ОДИН РАЗ: check_fall_flo забыли, и каскад - * уровня 13 перестал падать — плиты дрожали и застывали. Добавляя новое - * место записи фазы, добавляй и взвод. Снимает его - * САМ цикл, когда прошёл оба массива и не встретил ни одной ненулевой фазы. - * - * Асимметрия намеренная: ложная единица стоит одного холостого прохода, - * ложный ноль — застывшей навсегда плиты. Поэтому взвод обязан стоять - * рядом с КАЖДОЙ записью, а снятие — только по факту пустого прохода. */ -static uint8_t loose_any; - -/* Плита-ПОТОЛОК: состояние/сигналы — см. объявления перед get_tile. */ - -/* make_loose_fall (seg007:0EF6): взвести отсчёт падения, если ещё не идёт. */ -static void make_loose_fall(int pos, uint8_t modifier) -{ - if (pos < 0 || pos >= 30) return; - if ((g_fg[pos] & 0x1F) != TILE_LOOSE) return; - if ((g_fg[pos] & 0x20)) return; /* «solid» loose — не от шага */ - if ((int8_t)pop_loose_modif[pos] <= 0) { /* покой/тряска, не отсчёт */ - pop_loose_modif[pos] = modifier; - loose_any = 1; - } -} - -/* died_on_button (seg007:0776): на кнопке КТО-ТО УМЕР — эффект становится - * ПОСТОЯННЫМ, а сама кнопка с тайла снимается. - * - * Открывалка превращается в обычный пол с нулевым модификатором, а связь - * дёргается типом «щебень» (TILE_DEBRIS) — у trigger_gate это отдельная - * ветка «открыть насовсем»: недооткрытые ворота получают trob-тип 2, уже - * открытые — modif 0xFF (открыты навсегда). Любая другая кнопка становится - * заклиненной (TILE_STUCK): нажатой она и останется. - * - * ЗАЧЕМ ЭТО ВООБЩЕ НУЖНО. Труп не «держит» кнопку — он её ЛОМАЕТ. Разница - * видна сразу: держал бы — ворота закрылись бы, как только тело убрали или - * уровень перезапустили. У Кида перезапуск всё равно перечитывает тайлы, а - * вот когда на кнопке гибнет СТРАЖ, перезапуска нет и кнопка заклинена до - * конца уровня. - * - * Тайл пишем и в страницу уровня (переживёт выход из комнаты, как do_pickup), - * и в живую g_fg отрисованной комнаты — вместе с пометкой на перерисовку - * своей ячейки и правой (у кнопки и пола разные правые грани). */ -static void died_on_button(uint8_t room, uint8_t tp, uint8_t code) -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t modifier = mod[tp]; /* индекс связи — ДО затирания */ - uint8_t button_type = code; - uint8_t newtile; - if (code == TILE_OPENER) { - newtile = TILE_FLOOR; - mod[tp] = 0; - button_type = TILE_DEBRIS; /* trigger_gate: «открыть насовсем» */ - } else { - newtile = TILE_STUCK; - } - pop_level_set_tile(room, tp, newtile); - if (room == g_room) { - g_fg[tp] = newtile; - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - if (tp % 10 < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_FLOOR, 2); - } - pop_trigger_button(room, tp, button_type, modifier, 1); -} - -/* check_press (seg006:0EC8, упрощ.): Kid стоит на loose → make_loose_fall; - * frame 79 (прыжок вверх) с loose СВЕРХУ → пробить сверху. */ -static void check_press(void) -{ - uint8_t frame = Char.frame, action = Char.action; - uint8_t above_press = 0; /* «нажимается» тайл СВЕРХУ */ - /* Кадры виса (87..99) и начала подъёма (135..140): нажимается тайл, за - * КОТОРЫЙ ПЕРСОНАЖ ДЕРЖИТСЯ, т.е. верхний (seg006:1688). Отсюда падение - * плиты, за край которой Kid зацепился, — а не только той, по которой он - * ударил снизу прыжком (кадр 79). */ - if ((frame >= 87 && frame < 100) || (frame >= 135 && frame < 141)) { - above_press = 1; - } else if (action == ACT_BUMPED || action == ACT_TURN || action < ACT_HANGCLIMB) { - if (frame == 79) above_press = 1; /* прыжок вверх — удар снизу */ - } else { - return; /* seg006:1704 — прочее не жмёт */ - } - if (above_press) { - if (Char.curr_row == 0) { - /* Ряд 0: «сверху» — ряд 2 комнаты СВЕРХУ (в оригинале get_tile с - * row=−1 уходит по links.up, find_room_of_tile seg006:005D). - * Плита-ПОТОЛОК; кнопок на потолке в этом тесте нет. */ - int8_t c = Char.curr_col; - if (g_above && g_link_u && c >= 0 && c <= 9 && - (g_above[c] & 0x1F) == TILE_LOOSE && !(g_above[c] & 0x20) && - (int8_t)pop_ceil_modif[c] <= 0) { - pop_ceil_modif[c] = 1; /* make_loose_fall(1) */ - loose_any = 1; - is_guard_notice = 1; /* seg006:1734 */ - } - } else if (get_tile_above_char() == TILE_LOOSE) { - make_loose_fall((Char.curr_row - 1) * 10 + Char.curr_col, 1); - is_guard_notice = 1; /* seg006:1734 */ - } - return; - } - /* Стояние: кадр обязан требовать пол; нажимается тайл ПОД персонажем. - * ACT_TURN обязателен (seg006:1691): при развороте на кнопке иначе - * trigger_button не зовётся кадр-два → таймер связи падает <2 → кнопка - * ложно отжимается и жмётся снова. */ - if (!(kid_cur_flags() & FRAME_NEEDS_FLOOR)) return; - { - uint8_t t = get_tile_at_char(); - uint8_t tp = 0; - /* Кнопка может лежать в СОСЕДНЕЙ комнате — Кид стоит в шве - * (curr_col = −1 или 10). Комнату и tilepos берём резолвнутые, - * иначе индекс связи читается из чужого тайла (см. tile_room_of). */ - uint8_t btn_room = tile_room_of(Char.curr_col, Char.curr_row, &tp); - if ((t == TILE_OPENER || t == TILE_CLOSER) && btn_room) { - /* seg006:1707 — ЖИВОЙ жмёт кнопку на 5 кадров, МЁРТВЫЙ ломает её - * насовсем. `alive < 0` = жив (соглашение оригинала). */ - if (Char.alive < 0) - pop_trigger_button(btn_room, tp, t, pop_trob_modif(btn_room)[tp], 1); - else - died_on_button(btn_room, tp, t); - } - else if (t == TILE_LOOSE) { - /* loose живёт в СВОЕЙ комнате (make_loose_fall работает с g_fg), - * поэтому здесь по-прежнему координаты персонажа. */ - make_loose_fall((uint8_t)(Char.curr_row * 10 + Char.curr_col), 1); - is_guard_notice = 1; /* seg006:1734 */ - } - } -} - -/* ---- Звук дрожащей плиты (loose_shake, seg007:0E55) ------------------ * - * Три сэмпла 20/21/22 вперемешку, но НЕ на каждый кадр фазы: гейт-таблица - * loose_sound (data:2734) даёт звук на фазах 1,2,3,5,8, а на остальных - * молчит — иначе тряска трещит без пауз. Повтор подряд одного и того же - * сэмпла оригинал запрещает (цикл do/while), иначе слышно «заедание». - * - * Сид СВОЙ, а не общий с trob/боёвкой: домены prandom у нас разведены - * (../docs/impl_diff.md), и звук не должен сдвигать чужие розыгрыши. */ -static const uint8_t loose_sound[12] = { 0,1,1,1,0,1,0,0,1,0,0,0 }; -static pop_rnd_t loose_seed; -static uint8_t last_loose_snd; - -static void loose_shake(uint8_t force, uint8_t modif) -{ - uint8_t id, prev; - - if (!force && !loose_sound[modif & 0x7F]) return; - /* ЗАПИСЬ ДО СРАВНЕНИЯ — обход sdcc_z80_cmp_store_a_bug. - * - * Прежняя запись (`do { id = ... } while (id == last_loose_snd); - * last_loose_snd = id; pop_sfx_play(id);`) собиралась так: - * ld a, e / add a, #0x14 ; A = 20..22, номер сэмпла - * ld hl, #_last_loose_snd - * sub a, (hl) ; A = РАЗНОСТЬ, номер потерян - * ld (_last_loose_snd), a ; сохраняем разность - * jp _pop_sfx_play ; играем разность - * то есть в звук уходил не сэмпл тряски, а id минус предыдущий id. - * Пока такие «номера» попадали в пустые слоты набора, это молчало; - * с приходом музыки мусор вида 22-251 = 27 стал запускать ТРЕК — - * пользователь слышал музыку на прыжке и на падающей плите. */ - prev = last_loose_snd; - for (;;) { - id = (uint8_t)(pop_prandom(&loose_seed, 2) + 20); - last_loose_snd = id; /* store раньше любого сравнения */ - if (id != prev) break; - } - pop_sfx_play(last_loose_snd); /* читаем из памяти, не из A */ -} - -/* do_knock (seg007:0FE0) + loose_make_shake (seg007:0FB4): сотрясение от - * приземления/удара трясёт ВСЕ loose-полы в ряду tile_row (не роняя их — - * modif 0x80..0x83 = чистая тряска, сбрасывается в pop_loose_tick). Трясём - * только из ПОКОЯ (modif==0): если тайл уже дрожит/падает — не перебиваем. */ -static void do_knock(int tile_row) -{ - int col, pos; - /* СПЕЦКЕЙС УРОВНЯ 13 (loose_make_shake, seg007:949): сотрясение НЕ - * трясёт плиты вовсе. Причина та же, что у первого спецкейса: тряска - * ставит фазу 0x80, а на этом уровне у плит уже лежит СВОЙ отложенный - * старт (0xF0..0xFF), и приземление Кида сбросило бы его на 0x80 — - * гряда посыпалась бы разом вместо вразнобой. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) return; - if (tile_row == -1) { /* ряд 2 комнаты сверху — плиты-потолки */ - if (!g_above || !g_link_u) return; - for (col = 0; col < 10; col++) - if ((g_above[col] & 0x1F) == TILE_LOOSE && pop_ceil_modif[col] == 0) { - pop_ceil_modif[col] = 0x80; - loose_any = 1; - } - return; - } - if (tile_row < 0 || tile_row > 2) return; - for (col = 0; col < 10; col++) { - pos = tile_row * 10 + col; - if ((g_fg[pos] & 0x1F) != TILE_LOOSE) continue; - if (pop_loose_modif[pos] == 0) { - pop_loose_modif[pos] = 0x80; - loose_any = 1; - } - } -} - -/* check_knock (seg003:0706): по флагу knock (ставит play_seq на seqtbl- - * командах KNOCK_UP/DOWN) тряхнуть ряд. KNOCK_DOWN (knock=-1, приземление) → - * ряд curr_row; KNOCK_UP (knock=+1) → ряд curr_row-1. */ -void pop_check_knock(void) __banked -{ - if (knock) { - do_knock(Char.curr_row - (knock > 0)); - knock = 0; - } -} - -/* Сдать НЕЗАКОНЧЕННЫЕ loose уходящей комнаты в персистентное хранилище — - * звать ПЕРЕД сменой комнаты, пока g_room/g_fg/g_link_u ещё старые. - * - * pop_loose_modif[30] — фаза тайлов ТЕКУЩЕЙ комнаты, и раньше смена комнаты - * её просто теряла: плита, по которой Кид пробежал и ушёл вправо, оставалась - * целой (уровень 10, комната 2, тайл 2,9). В оригинале терять нечего — - * там loose это trob в общем списке, а фаза лежит в curr_room_modif, то есть - * в самой таблице уровня. Порт того же: фаза уезжает в room_modif (он - * персистентен per-room), а досчитывает её animate_loose в pop_trob.c. - * - * Пишем фазу ВСЕМ loose-тайлам, включая нулевые: room_modif — источник - * истины, а pop_loose_modif лишь его копия на время пребывания в комнате, - * и оставить там прошлое значение значило бы «оживить» уже отдрожавшую - * плиту при следующем входе. trob заводим только на незаконченные. */ -void pop_loose_leave_room(void) __banked -{ - uint8_t *mod; - int i; - if (!g_fg || !g_room) return; - mod = pop_trob_modif(g_room); - if (mod) { - for (i = 0; i < 30; i++) { - if ((g_fg[i] & 0x1F) != TILE_LOOSE) continue; - mod[i] = pop_loose_modif[i]; - if (pop_loose_modif[i]) pop_add_trob(g_room, (uint8_t)i, 0); - } - } - /* Плиты-ПОТОЛКИ — ряд 2 комнаты сверху, tilepos 20+col. */ - if (g_above && g_link_u) { - mod = pop_trob_modif(g_link_u); - if (mod) { - for (i = 0; i < 10; i++) { - if ((g_above[i] & 0x1F) != TILE_LOOSE) continue; - mod[20 + i] = pop_ceil_modif[i]; - if (pop_ceil_modif[i]) - pop_add_trob(g_link_u, (uint8_t)(20 + i), 0); - } - } - } -} - -/* Решётка ворот должна идти ПОВЕРХ персонажа? Порт первого условия - * draw_tile_fore (seg008:0D15): - * - * if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - * Kid.curr_col == drawn_col - 1 && Kid.room != room_R) - * draw_gate_fore(); - * - * То есть: рисуя тайл (row, col), оригинал кладёт бары ворот в FOREtable — - * поверх всего, что уже нарисовано, — если тайл СЛЕВА это ворота и персонаж - * стоит ИМЕННО НА НИХ. Графика ворот принадлежит правому краю своего тайла - * и рисуется в проходе СЛЕДУЮЩЕЙ колонки, отсюда сдвиг на единицу. - * - * Живёт в карте, а не в слое фона, по двум причинам: спрашивает она про - * ТАЙЛ и позицию персонажа (это знание карты), и её линкует хост-харнесс — - * решение проверяется тестом без эмулятора (t_char: gate_fore_over_char). - * Слою фона остаётся только рисование (draw_gate_fore в pop_bg.c). - * - * РАСХОЖДЕНИЕ С ОРИГИНАЛОМ (осознанное, см. docs/impl_diff.md): оригинал - * жёстко спрашивает про Kid, потому что foretable у него ОДНА на проход - * тайлов; у нас fore-проход идёт по персонажу, поэтому спрашиваем про того, - * кого рисуем. Наш вариант — надмножество: страж, стоящий в проёме ворот, - * у нас тоже уходит ЗА решётку, а в оригинале остался бы перед ней. */ -uint8_t pop_gate_over_char(const pop_char_t *ch) __banked -{ - if (!ch || ch->room != g_room) return 0; - if (ch->curr_row < 0 || ch->curr_row > 2) return 0; - /* Колонка 9: бары легли бы в колонку 10, то есть в СОСЕДНЮЮ комнату — - * у оригинала это отсекает `Kid.room != room_R`. */ - if (ch->curr_col < 0 || ch->curr_col > 8) return 0; - return (uint8_t)(get_tile(ch->curr_col, ch->curr_row) == TILE_GATE); -} - -/* СТАРТ/РЕСТАРТ уровня: забыть фазы, НЕ сдавая их в room_modif — в - * оригинале всё состояние сносит сам load_level (seg003:57). Без этого - * pop_loose_leave_room у первого же enter_room занесла бы в только что - * восстановленный уровень дрожь из прошлой жизни: pop_trob_reset уже - * отработал, room_modif свежий, а pop_loose_modif — ещё старый. */ -void pop_loose_forget(void) __banked -{ - int i; - for (i = 0; i < 30; i++) pop_loose_modif[i] = 0; - for (i = 0; i < 10; i++) pop_ceil_modif[i] = 0; -} - -/* Сброс состояния loose (при смене комнаты): pop_loose_modif/bake/rest - * индексируются позицией тайла и не должны утечь из старой комнаты в новую. - * Уже ПАДАЮЩИЕ куски при этом не трогаем — они привязаны к своей комнате и - * должны долететь (do_mobs, seg007:1063; см. pop_loose_mob_room_changed). - * - * Вместо нулей забираем фазу НОВОЙ комнаты из room_modif — обратная - * половина pop_loose_leave_room: расшатанная и брошенная плита, к которой - * Кид вернулся, продолжает дрожать с той же фазы, а не с покоя. trob, - * который крутил её заочно, снимет сам animate_loose (room == cur_room). */ -void pop_loose_reset(void) __banked -{ - uint8_t *mod; - int i; - - mod = g_room ? pop_trob_modif(g_room) : 0; - for (i = 0; i < 30; i++) { - pop_loose_modif[i] = (mod && g_fg && (g_fg[i] & 0x1F) == TILE_LOOSE) - ? mod[i] : 0; - if (pop_loose_modif[i]) loose_any = 1; /* взвод гейта — см. loose_any */ - } - mod = (g_above && g_link_u) ? pop_trob_modif(g_link_u) : 0; - for (i = 0; i < 10; i++) { - pop_ceil_modif[i] = (mod && (g_above[i] & 0x1F) == TILE_LOOSE) - ? mod[20 + i] : 0; - if (pop_ceil_modif[i]) loose_any = 1; /* взвод гейта — см. loose_any */ - /* ...и СНЯТЬ заочный trob: плиту-потолок отсюда снова ведёт - * pop_loose_tick. Без этого её крутили бы ДВОЕ — trob по - * room_modif и мы по pop_ceil_modif, — и она проваливалась бы - * дважды (animate_loose снимает сам только trob'ы cur_room, а - * комната сверху — не cur_room). */ - if (pop_ceil_modif[i]) pop_add_trob(g_link_u, (uint8_t)(20 + i), -1); - } - pop_ceil_fell = 0; - pop_debris_at = 0; - pop_loose_landed = 0; - pop_loose_mob_room_changed(); -} - -/* remove_loose (seg007:0EB8) для ОДНОГО тайла, наружу — ради честного - * loose_fall: падающий кусок сбивает плиту НЕМЕДЛЕННО, в том же кадре - * (pop_room.c, mob_break_loose). Здесь, а не в pop_room, потому что тут - * живут и рабочая копия тайлов комнаты (g_fg), и фазы плит. - * - * Перерисовываем ДВЕ клетки — саму и соседа справа. Передний торец пола - * заезжает в соседний тайл (правая грань соседа всегда в backtable), и без - * второй пометки от исчезнувшей плиты оставался висеть торец: тайл пустой, - * а его передняя грань нарисована. Тем же приёмом, что pop_skel_wake_tile - * и что set_redraw_full+set_wipe на curr_tilepos и curr_tilepos+1 в - * оригинале. */ -void pop_loose_remove(uint8_t room, uint8_t tilepos) __banked -{ - uint8_t *mod = pop_trob_modif(room); - if (tilepos >= 30) return; - if (room == g_room) { - g_fg[tilepos] = TILE_EMPTY; - pop_loose_modif[tilepos] = 0; - pop_set_redraw(tilepos, POP_RD_LOOSE_GONE, 2); - if ((tilepos % 10) < 9) - pop_set_redraw((uint8_t)(tilepos + 1), POP_RD_FLOOR, 2); - } else { - /* Комната не на экране, но её кромочная колонка видна в шве — те же - * снимки, что обновляет animate_loose. */ - pop_neigh_dirty = 1; - } - /* Модификатор пустой клетки = ТИП УРОВНЯ (по нему draw_tile_right - * выбирает blueline у дыры), тайл в странице уровня — сразу. */ - if (mod) mod[tilepos] = pop_palace; - pop_level_set_tile(room, tilepos, TILE_EMPTY); -} - -/* check_fall_flo (seg000:1317) — СПЕЦСОБЫТИЕ уровня 13: гряда плит над - * комнатой сыплется на Кида сама, вразнобой. - * - * Как это устроено в оригинале: при входе в комнату 23 или 16 шести плитам - * ряда 2 комнаты СВЕРХУ раздаётся ОТРИЦАТЕЛЬНЫЙ модификатор −(rnd & 15). - * Отрицательное значение — это старший бит, то есть для animate_loose оно - * выглядит как «тряска», а на уровне 13 тряска намеренно не гасится - * (спецкейс в pop_loose_tick). Фаза считает вверх, доходит до нуля и - * дальше идёт обычным отсчётом до провала — получается разная задержка у - * каждой плиты. - * - * Плиты ряда 2 верхней комнаты у нас — это pop_ceil_modif (плиты-потолки), - * так что раздаём фазу именно туда. - * - * ОДНО отличие от оригинала, вынужденное представлением: у нас фаза 0 = «не - * анимируется», плита с такой фазой в цикле пропускается вовсе. Значит - * счёт, дойдя до нуля, оборвался бы — поэтому, во-первых, тик перескакивает - * ноль (см. pop_loose_tick), а во-вторых, стартовое значение берётся на - * единицу «отрицательнее» (−n−1): вместе это даёт ровно ту же суммарную - * задержку n + 11 кадров, что и у оригинала. - * - * Звать при входе в комнату, после pop_loose_reset (тот забирает фазы из - * room_modif) — как check_the_end зовёт его после start_chompers. */ -static pop_rnd_t loose_seed; /* свой домен последовательности, см. pop_geom.h */ - -void pop_check_fall_flo(void) __banked -{ - uint8_t col; - if (pop_current_level != POP_LOOSE_TILES_LEVEL) return; - if (g_room != POP_LOOSE_TILES_ROOM1 && g_room != POP_LOOSE_TILES_ROOM2) return; - if (!g_above || !g_link_u) return; - for (col = POP_LOOSE_TILES_FIRST - 20; col <= POP_LOOSE_TILES_LAST - 20; col++) { - uint8_t t = g_above[col]; - /* Те же отсевы, что в make_loose_fall: не loose и «solid» loose - * пропускаются молча (в комнате 1 тайл 24 пустой — диапазон 22..27 - * намеренно надмножество), уже идущий отсчёт не перебиваем. */ - if ((t & 0x1F) != TILE_LOOSE || (t & 0x20)) continue; - if ((int8_t)pop_ceil_modif[col] > 0) continue; - pop_ceil_modif[col] = - (uint8_t)(-(int8_t)(pop_prandom(&loose_seed, 255) & 0x0F) - 1); - loose_any = 1; /* ШЕСТОЕ место взвода гейта — см. loose_any. - * Пропуск именно здесь стоил каскада на - * уровне 13: плиты получали отложенный - * старт, но цикл их не досчитывал, и они - * дрожали, не падая (нашёл пользователь - * 2026-08-19). */ - pop_set_redraw_above(col, POP_RDA_CEIL, 1); - } -} - -/* fell_on_your_head (seg007:1205): плита прилетела Киду по голове. В беге - * (кадры 5..14) не бьёт (кроме уровня 13 — его тут нет); в висе/подъёме тоже - * (action >= hang_climb, кроме turn). Иначе −1 HP: смерть → seq_22 (crushed), - * живой → seq_52 (плита придавила: Kid приседает), с отступом на 2 назад, - * если сзади пусто. Кадр 109 (присед) последовательность не меняет. */ -#define SEQ_52_LOOSE_FELL_ON_KID 52 -#define FRAME_109_CROUCH 109 - -static void fell_on_your_head(void) -{ - uint8_t frame = Char.frame, action = Char.action; - /* СПЕЦКЕЙС УРОВНЯ 13 (seg007:1218): там плита бьёт и В БЕГЕ. На прочих - * уровнях бегущего она пропускает — иначе гряда падающих плит, сквозь - * которую и надо пробегать, не представляла бы никакой угрозы. */ - if ((pop_current_level == POP_LOOSE_TILES_LEVEL || frame < 5 || frame >= 15) && - (action < ACT_HANGCLIMB || action == ACT_TURN)) { - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - if (pop_take_hp(1)) { /* «брызги» даст pop_do_delta_hp */ - pop_char_set_seq(SEQ_22_CRUSHED); - play_seq(); - determine_col(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; - } else if (frame != FRAME_109_CROUCH) { - if (get_tile_behind_char() == TILE_EMPTY) - Char.x = (uint8_t)char_dx_forward(-2); - pop_char_set_seq(SEQ_52_LOOSE_FELL_ON_KID); - play_seq(); - determine_col(); - } - } -} - -/* check_loose_fall_on_kid (seg007:1192): падающий кусок в той же колонке и - * его низ уже в полосе 30px над ногами Kid → удар. */ -static void check_loose_fall_on_kid(void) -{ - int mcol, my; - if (pop_kid_dead) return; - /* Ни одного куска в воздухе — не платим за банковый трамплин в - * pop_loose_mob_pos с обходом 14 слотов (замер 11/15: 5 868 тактов на - * комнату, где не падает ничего). */ - if (!pop_mob_busy) return; - if (!pop_loose_mob_pos(&mcol, &my)) return; - /* Своё окно Char, как в оригинале (seg007:1199 — loadkid/savekid внутри - * самой функции): зовут нас из pop_loose_tick, а тот идёт в главном - * цикле вне окон, и в Char к этому моменту лежит СТРАЖ (он тикает - * последним). Плита на голову — про Кида. */ - pop_loadkid(); - if (Char.curr_col == (int8_t)mcol && - my < (int)Char.y && (int)Char.y - 30 < my) { - fell_on_your_head(); - pop_savekid(); - } -} - -/* animate_loose (seg007:0CBA) + перерисовка изменившихся тайлов на ТЕКУЩЕЙ - * (back) странице. Звать из основного цикла ПОСЛЕ set_draw_page(back). */ -void pop_loose_tick(void) __banked -{ - uint8_t pos; - /* Массивы обходим УКАЗАТЕЛЕМ, а не индексом. С `int pos` SDCC держал - * счётчик в IX-фрейме, каждую итерацию заново складывал 16-битный адрес - * элемента, клал его в локал и тут же вычитывал обратно парами pop/push: - * 40 холостых итераций стоили 27 936 тактов (замер 2026-08-13). Ходьба - * указателем убирает и адресную арифметику, и IX-фрейм. */ - uint8_t *lm = pop_loose_modif; - /* row/col ведём бегущими счётчиками, а НЕ через pos/10 и pos%10: у Z80 - * нет аппаратного деления, и SDCC выносил оба деления (__divuchar/ - * __moduchar) в начало КАЖДОЙ итерации (общее подвыражение аргументов - * вызовов), т.е. 30*2=60 вызовов деления за кадр — даже в покое и в - * комнатах без loose-плит (условия if к тому моменту ещё не проверены). - * Инкремент+сравнение считают row/col без деления. */ - uint8_t row = 0, col = 0; - pop_dbg_m9(); /* ЗАМЕР: вход pop_loose_tick */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Гейт холостого хода: если ни одна фаза не взведена, оба цикла (30 + 10 - * позиций) пропускаем целиком — замер 11/15 дал 9 852 такта на комнату, - * где loose-плит нет вовсе. Флаг ставят места записи фазы, снимаем его - * здесь и только по факту прохода, в котором не осталось ни одной живой - * фазы (см. объявление loose_any). */ - if (loose_any) { - uint8_t found = 0; - for (pos = 0; pos < 30; pos++, lm++) { - if (*lm != 0) { - uint8_t m = ++*lm; - /* Отложенный старт уровня 13 досчитал до нуля. Ноль у нас - * означает «не анимируется», и плита застряла бы навсегда — - * перескакиваем на 1. Стартовое значение выбрано с учётом - * этого перескока (см. pop_check_fall_flo). */ - if (m == 0) m = *lm = 1; - if (m & 0x80) { /* тряска (do_knock) */ - /* СПЕЦКЕЙС УРОВНЯ 13 (seg007:823): фазу со старшим битом НЕ - * гасим и не трясём. На нём check_fall_flo раздаёт плитам - * ОТРИЦАТЕЛЬНЫЙ старт (0xF0..0xFF) как отложенный таймер, и - * обычная ветка «тряска кончилась на 0x84» убила бы его в - * первом же кадре — плита не упала бы никогда. Пропущенная - * инкрементом фаза сама дойдёт до 0x00, там старший бит - * снимется, и дальше пойдёт обычный отсчёт до провала. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { - /* ждём молча */ - } else if (m >= 0x84) { /* конец тряски: сброс + покой */ - *lm = 0; - loose_shake(1, 0); /* последний удар — без гейта */ - /* modif уже 0 → кадр покоя обоих тайлов (col и col+1: - * правая грань loose живёт в соседе). ОБЕ страницы — - * иначе на одной застывает дрожащий кадр → мерцание. */ - pop_set_redraw(pos, POP_RD_LOOSE, 2); - } else { - loose_shake(0, m); - pop_set_redraw(pos, POP_RD_LOOSE, 1); /* дрожащий кадр */ - } - } else if (m >= 11 && pop_loose_fell) { - /* Сигнал прошлого провала ещё не разобран главным циклом (он - * ОДИН на кадр) — придержим плиту кадр, откатив фазу к 10. - * Иначе из двух плит, провалившихся в одном кадре, дыру - * запекала бы только вторая, а первая оставалась нарисованной - * целой (уровень 13: check_fall_flo роняет гряду разом). */ - *lm = 10; - } else if (m >= 11) { /* loose_floor_delay — падение */ - /* remove_loose (seg007:0EB8): тайл → EMPTY (не debris!). - * Debris появляется ТОЛЬКО там, где приземлился падающий - * кусок (mob), т.е. рядом ниже. Loose в нижнем ряду (2,6) - * — кусок улетает из комнаты вниз, на месте остаётся пусто - * (стена-вниз от тайла снизу + чёрный фон). */ - g_fg[pos] = TILE_EMPTY; - /* remove_loose возвращает ТИП УРОВНЯ, и вызывающий кладёт - * его модификатором пустой клетки (seg007:846/1083): по нему - * draw_tile_right выбирает blueline_fram1 у дыры. */ - pop_trob_modif(g_room)[pos] = pop_palace; - *lm = 0; - pop_set_redraw(pos, POP_RD_LOOSE_GONE, 2); /* запечь пусто, обе стр. */ - /* ...и СОСЕДА СПРАВА: передний торец пола заезжает в его - * клетку, и без этой пометки он оставался висеть над пустым - * тайлом. То же, что делает pop_skel_wake_tile. */ - if ((pos % 10) < 9) - pop_set_redraw((uint8_t)(pos + 1), POP_RD_FLOOR, 2); - pop_loose_mob_spawn(row, col); /* отрыв падающего куска */ - pop_loose_fell = (uint8_t)(pos + 1); /* сигнал приложению */ - } else { /* отсчёт 1..10 — дрожащий кадр */ - loose_shake(0, m); - pop_set_redraw(pos, POP_RD_LOOSE, 1); - } - if (*lm) found = 1; /* фаза ещё жива — гейт держим */ - } - if (++col == 10) { col = 0; row++; } /* row/col без деления */ - } - /* Плиты-ПОТОЛКИ (ряд 2 комнаты сверху): тот же animate_loose, но кадры - * рисуются в полосе у потолка, а провалившаяся плита становится EMPTY в - * НАШЕЙ копии ряда (g_above) — сверху открывается колодец. */ - lm = pop_ceil_modif; /* тот же указательный обход */ - for (col = 0; col < 10; col++, lm++) { - if (*lm != 0) { - uint8_t m = ++*lm; - if (m == 0) m = *lm = 1; /* см. pop_loose_tick выше */ - if (m & 0x80) { /* тряска от сотрясения (do_knock) */ - /* Тот же спецкейс уровня 13, и здесь он ГЛАВНЫЙ: плиты, - * которым check_fall_flo раздал отложенный старт, лежат - * именно в ряду 2 комнаты СВЕРХУ, то есть ведёт их этот - * цикл, а не соседний. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { - /* ждём молча */ - } else if (m >= 0x84) { *lm = 0; loose_shake(1, 0); - pop_set_redraw_above(col, POP_RDA_CEIL, 2); } - else { loose_shake(0, m); - pop_set_redraw_above(col, POP_RDA_CEIL, 1); } - } else if (m >= 11 && pop_ceil_fell) { - *lm = 10; /* сигнал занят — кадр подождём */ - } else if (m >= 11) { /* loose_floor_delay — плита рушится */ - *lm = 0; - if (g_above) g_above[col] = TILE_EMPTY; /* remove_loose */ - pop_set_redraw_above(col, POP_RDA_CEIL_GONE, 2); /* колодец, обе стр. */ - pop_loose_mob_spawn(-1, col); /* кусок отрывается от потолка */ - pop_ceil_fell = (uint8_t)(col + 1); /* сигнал приложению */ - } else { - loose_shake(0, m); - pop_set_redraw_above(col, POP_RDA_CEIL, 1); /* отсчёт 1..10 */ - } - if (*lm) found = 1; /* фаза ещё жива — гейт держим */ - } - } - loose_any = found; - } - pop_loose_mob_tick(); /* продвинуть+нарисовать падающий кусок (после тайлов) */ - check_loose_fall_on_kid(); /* seg007:1192 — плита падает Киду на голову */ - /* Отложенная допечка ПРОШЛОГО приземления на вторую страницу — ПЕРЕД - * разбором нового: иначе при двух плитах, севших подряд, land_bake - * затирался новым и на одной странице оставался старый пол. */ - if (pop_loose_landed) { /* loose_land (seg007:11E8): на месте куска — щебень */ - uint8_t pos = (uint8_t)(pop_loose_landed - 1); - uint8_t r = 0, c = pos; - uint8_t tt = (uint8_t)(g_fg[pos] & 0x1F); /* тайл, НА который села плита */ - pop_loose_landed = 0; - while (c >= 10) { c -= 10; r++; } - /* Плита, севшая на КНОПКУ, её нажимает (seg007:11E8, ветки - * tiles_15_opener / tiles_6_closer). Тонкость: на opener оригинал - * подставляет button_type = tiles_14_debris, а это у trigger_gate - * отдельная ветка «открыть НАСОВСЕМ» (возврат 2 -> animate_door - * доводит створку и ставит modifier 0xFF, после чего ворота - * заморожены и обычный opener их больше не трогает). Сама кнопка - * съедается: тайл станет щебнем ниже, нажаться второй раз нечему. - * Модификатор (индекс LINKLOC) тайл не меняет, берём его как есть. */ - if (tt == TILE_OPENER || tt == TILE_CLOSER) - pop_trigger_button(g_room, pos, - (uint8_t)(tt == TILE_OPENER ? TILE_DEBRIS : tt), - pop_trob_modif(g_room)[pos], 1); - /* На факеле — отдельный тайл «факел с щебнем» (seg007:1067). */ - g_fg[pos] = (uint8_t)((tt == TILE_TORCH || tt == TILE_TORCH_DEBRIS) - ? TILE_TORCH_DEBRIS : TILE_DEBRIS); - /* Перерисовка ПО ПЛОЩАДИ ПОЛА (не LOOSE_GONE: та стирает и верх стены - * ряда ниже — оставался чёрный прямоугольник под тайлом). Обе - * страницы дабл-буфера. */ - pop_set_redraw(pos, POP_RD_FLOOR, 2); - do_knock(r); /* удар плиты трясёт loose этого ряда */ - pop_debris_at = (uint8_t)(pos + 1); /* сигнал приложению (персистентность) */ - } -} - - - -/* ---- clip_char (seg006:1749), первый блок: обрезка спрайта СВЕРХУ ----- * - * Оригинал перед add_objtable кладёт в objtable прямоугольник клипа; блиттер - * рисует персонажа только внутри него. Верхняя граница: если тайл НАД - * головой (ряд char_top_row) — стена или пол, всё выше линии своей полосы - * (y_clip[curr_row+1]) не рисуется. Без этого Kid, ушедший головой под пол - * (спуск с кромки/кнопки, вис), просвечивает сквозь щели кладки. - * - * Хитрость исходника: `X == wall || tile_is_floor(curr_tile2)` — curr_tile2 - * ставит сам get_tile, т.е. это просто «тайл X = стена ИЛИ пол». - * - * Метрики габарита — порт set_char_collision (seg006:0723); в отличие от - * check_spike_below колонки берутся get_tile_div_mod БЕЗ −7. - * - * Возврат: КОМНАТНЫЙ y верхней границы (0 = клипа нет). */ -/* Вторая половина ветки двери уровня из clip_char (seg006:1231): - * obj_clip_right = leveldoor_right — ЭКРАННЫЙ X, правее которого спрайт не - * рисуется. 0 = обрезки нет. - * - * Почему обрезка, а не fore-слой: створка и косяк уходят в оригинале - * ЦЕЛИКОМ в backtable (draw_leveldoor, все add_backtable), то есть рисуются - * ПОД персонажем и перекрыть его не могут. Единственный способ спрятать - * поднимающегося по лестнице — срезать сам спрайт. */ -int pop_clip_char_right(void) __banked -{ - if (Char.frame >= 224 && Char.frame < 229) - return pop_leveldoor_right; - return 0; -} - -int pop_clip_char_top(int obj_x, int obj_y, uint16_t w, uint16_t h) __banked -{ - static const int16_t y_clip[5] = { -60, 3, 66, 129, 192 }; - int wh = ((int)w + 1) >> 1; /* char_width_half */ - int xl = obj_x / 2 + 58; /* char_x_left */ - int xr, top_y, clip_y; - int8_t cL, cR, trow, clip_row; - uint8_t t; - - /* Кадры подъёма по лестнице двери уровня (clip_char, seg006:1231): - * персонаж режется по низу поднятой створки. ВНИМАНИЕ: комментарий в - * SDLPoP говорит «frames 217..228», а КОД проверяет - * `>= frame_224_exit_stairs_8`, то есть 224..228 — портируем по коду. - * Правую кромку отдаёт pop_clip_char_right (парная половина ветки). */ - if (Char.frame >= 224 && Char.frame < 229) - return pop_leveldoor_ybottom + 1; - - if (Char.direction >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; /* char_x_right */ - top_y = obj_y - (int)h + 1; /* char_top_y */ - if (top_y >= 192) top_y = 0; /* весь спрайт ниже комнаты */ - trow = pop_y_to_row((int16_t)top_y); /* char_top_row */ - cL = get_tile_div_mod(xl); if (cL < 0) cL = 0; - cR = get_tile_div_mod(xr); if (cR > 9) cR = 9; - - t = get_tile(cL, trow); - if (t != TILE_WALL && !tile_is_floor(t)) return 0; - /* кадр 79 (прыжок вверх) / 81 (зацеп) в стойке клипятся и по одной грани */ - if (!(Char.action == 0 && (Char.frame == 79 || Char.frame == 81))) { - t = get_tile(cR, trow); - if (t != TILE_WALL && !tile_is_floor(t)) return 0; - } - - clip_row = (int8_t)(Char.curr_row + 1); - if (clip_row < 0 || clip_row > 4) return 0; - clip_y = y_clip[clip_row]; - /* ряд 0 — клип безусловный; иначе только когда линия реально режет спрайт */ - if (clip_row == 1 || (clip_y < obj_y && clip_y - 15 < top_y)) - return clip_y; - return 0; -} - -/* check_leave_below (порт leave_room, seg002: leave_dir=3 при chary>=211): - * Kid пересёк нижнюю границу комнаты (провал в дыру ИЛИ спуск-зацеп/climbdown - * — единый триггер по y). Репроекция в кадр комнаты снизу (goto_other_room - * down: y-=189, curr_row=y_to_row_mod4) + сигнал pop_fell_out — приложение - * решит: переход (links.down) или выпал из уровня (нет комнаты снизу). */ -static void check_leave_below(void) -{ - /* leave_room (seg002:0504) проверяет ВВЕРХ ПЕРВЫМ: персонаж не в отскоке/ - * полёте и его y (как signed) в полосе −16..10 у верха комнаты — он вылез - * в комнату сверху (через колодец от упавшей плиты). Порядок важен: при - * подтягивании y ≈ 248, и проверка «ниже комнаты» (y>=211) иначе - * перехватывает подъём и роняет Kid из уровня. - * goto_other_room(up): y += 189, curr_row = y_to_row_mod4. */ - if (g_link_u && Char.action != ACT_BUMPED && Char.action != ACT_FREEFALL && - Char.action != ACT_MIDAIR && - (int8_t)Char.y < 10 && (int8_t)Char.y > -16) { - Char.y = (uint8_t)(Char.y + 189); - Char.curr_row = pop_y_to_row((int16_t)Char.y); - pop_leave_dir = 3; - return; - } - if (Char.y >= 211) { - Char.y = (uint8_t)(Char.y - 189); - Char.curr_row = pop_y_to_row((int16_t)Char.y); - pop_fell_out = 1; - } -} - -/* check_leave вбок (порт leave_room, seg002): передний край персонажа - * (char_dx_forward(cur_frame.dx) = char_x_left при взгляде влево / char_x_right - * вправо) сравнивается с кромками комнаты. Взгляд вправо: >=201 → right, - * <=57 → left; взгляд влево: <=54 → left, >=198 → right. goto_other_room: - * x∓140 (ширина комнаты), пересчёт колонки; сигнал pop_leave_dir (2=right, - * 1=left). Уход только если сосед есть (иначе кромка = стена, check_bumped - * удержит у шва). */ -static void check_leave(void) -{ - int fx; - uint8_t f = Char.frame; - /* seg002 leave_room: комнату НЕ покидаем во время разворота (action turn), - * подъёма-с-зацепа (climb, кадры 135..149), вставания из приседа - * (110..119) и — ОТДЕЛЬНО ВАЖНОЕ — БОЯ МЕЧОМ (150..162 и 166..168). - * - * Без первых трёх разворот у правого шва (взгляд флипается право→лево, - * char_x_left проскакивает >=198) телепортирует Kid сквозь закрытые - * ворота в соседнюю комнату (leave_room возвращает −1). - * - * Без кадров МЕЧА бой у шва превращается в мельтешение: отступая и - * наступая, Kid пересекает границу почти каждый кадр, и комната - * перерисовывается туда-обратно — драться невозможно (найдено - * пользователем 2026-08-18, уровень 8, шов комнат 24/18). Оригинал - * пускает смену комнаты только на «легальном» кадре вроде 170 (стойка - * с мечом), а вся боевая анимация уход запрещает. Побочный эффект в - * оригинале известен и даже эксплуатируется: Trick 35 «retreat without - * leaving the room» — определённым ритмом «назад» из комнаты можно - * пятиться, не переключая её вовсе (в SDLPoP это чинит опциональный - * FIX_RETREAT_WITHOUT_LEAVING_ROOM, по умолчанию ВЫКЛЮЧЕННЫЙ; мы, как - * обычно, портируем оригинал, а не его исправления). - * - * NB: 135..149 и 150..162 смежны, поэтому слиты в один диапазон — - * условие то же, а сравнений на одно меньше. */ - if (Char.action == ACT_TURN || - (f >= 110 && f < 120) || - (f >= 135 && f < 163) || /* подъём-с-зацепа + вся боевая анимация */ - (f >= 166 && f < 169)) /* стойка «замер, меч наготове» */ - return; - /* Передний край — ТОЛЬКО через char_x_forward_edge (obj_x-арифметика - * set_char_collision): в зоне шва (<=57) он на пиксель правее чистого - * Char.x+dx, и Kid, осевший у ворот на x=57, порога leave-left НЕ достигает - * (эталон SDLPoP: экран не переключается, BUG-SEAM-PINGPONG). */ - fx = char_x_forward_edge(); - if (Char.direction >= 0) { /* взгляд вправо: fx = char_x_right */ - uint8_t t9 = get_tile(9, Char.curr_row); - if (g_link_r && fx >= 201 && - t9 != TILE_DOORTOP_FLOOR && t9 != TILE_DOORTOP) { - /* leave_room (seg002): под doortop у правой кромки выхода нет */ - Char.x = (uint8_t)(Char.x - 140); determine_col(); pop_leave_dir = 2; - } else if (g_link_l && fx <= 57) { - Char.x = (uint8_t)(Char.x + 140); determine_col(); pop_leave_dir = 1; - } - } else { /* взгляд влево: fx = char_x_left */ - if (g_link_l && fx <= 54) { - Char.x = (uint8_t)(Char.x + 140); determine_col(); pop_leave_dir = 1; - } else if (g_link_r && fx >= 198) { - Char.x = (uint8_t)(Char.x - 140); determine_col(); pop_leave_dir = 2; - } - } -} - -/* ---- Пики (spike, seg006/seg007) ---------------------------------- * - * Состояние пики в room_modif[g_room][tilepos] (pop_trob), автомат — - * animate_spike (pop_trob). Здесь: триггер выдвижения (check_spike_below), - * решение о смерти (check_spiked) + spiked(). */ - -/* start_anim_spike (seg007:08E3): взвести выдвижение, если пика в покое - * (modif 0 → trob type1) или ушла не полностью (modif<0, кроме 0xFF disabled - * → мгновенно 0x8F «вышли»). */ -static void start_anim_spike(uint8_t tilepos) -{ - uint8_t *mod = pop_trob_modif(g_room); - int8_t old; - if (!mod) return; - old = (int8_t)mod[tilepos]; - if (old <= 0) { - if (old == 0) { - pop_add_trob(g_room, tilepos, 1); - pop_sfx_play(49); /* seg007:08F6 — пики пошли */ - } else if ((uint8_t)old != 0xFF) - mod[tilepos] = 0x8F; - } -} - -/* is_spike_harmful (seg007:1178): 0/-1 → 0 (безопасно); <0 → 1; 1..4 → 2; - * >=5 → 0. */ -static int is_spike_harmful(uint8_t tilepos) -{ - int8_t m = (int8_t)pop_trob_modif(g_room)[tilepos]; - if (m == 0 || m == -1) return 0; - if (m < 0) return 1; - if (m < 5) return 2; - return 0; -} - -/* spiked (seg005:0888): напоролся — пика становится безвредной (0xFF), - * выровнять по колонке, pop_take_hp(100) = смерть, seq_51 (импейл). */ -static void spiked(uint8_t tilepos) -{ - pop_trob_modif(g_room)[tilepos] = 0xFF; - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - Char.x = (uint8_t)(pop_x_bump[Char.curr_col + FIRST_ONSCREEN_COLUMN] + 10); - Char.x = (uint8_t)char_dx_forward(8); - Char.fall_y = 0; - pop_sfx_play(48); - pop_take_hp(100); - pop_char_set_seq(SEQ_51_SPIKED); - play_seq(); - determine_col(); - /* pop_kid_dead — НАШ флаг респавна, он про Кида. У прочих персонажей - * смерть видна по обнулившимся HP: play_guard ставит alive = 0, а - * дальше их доигрывает общий control() (seq_71_dying). */ - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; -} - -/* check_spiked (seg006:0658): под персонажем пика И вредна И кадр - * бега(7..14)/старта прыжка(34..39) при harmful>=2, ЛИБО кадр приземления - * (43/26) при harmful!=0 → smert'. */ -static void check_spiked(void) -{ - uint8_t frame = Char.frame, tp; - int h; - if (Char.curr_col < 0 || Char.curr_col > 9 || Char.curr_row < 0 || Char.curr_row > 2) - return; - if (get_tile_at_char() != TILE_SPIKE) return; - tp = (uint8_t)(Char.curr_row * 10 + Char.curr_col); - h = is_spike_harmful(tp); - if ((h >= 2 && ((frame >= FRAME_7_RUN && frame < 15) || - (frame >= FRAME_34_RUNJUMP_START && frame < 40))) || - ((frame == FRAME_43_RUNJUMP_LAND || frame == FRAME_26_STANDJUMP_LAND) && h != 0)) - spiked(tp); -} - -/* check_spike_below (seg006:1199): для каждой колонки РЕАЛЬНОГО габарита - * спрайта (char_x_left..char_x_right, порт set_char_collision) скан ВНИЗ от - * curr_row через НЕ-floor тайлы; встретил пику → start_anim_spike. Габарит, - * а не «curr_col + колонка спереди»: иначе пики выдвигаются на тайл раньше - * (когда тело Кида ещё не над шахтой). Метрики кадра — pop_cd (габарит - * последнего нарисованного кадра; отставание в 1 кадр несущественно, ошибка - * в позднюю сторону). */ -static void check_spike_below(void) -{ - const pop_cdraw_t *cd = CD_ACT; - int wh = ((int)cd->fpw + 1) >> 1; /* char_width_half */ - int xl = cd->fpx / 2 + 58; /* char_x_left */ - int xr; - int8_t c0, c1, col; - if (Char.direction >= 0) xl -= wh; /* лицом вправо: левый край внутрь */ - xr = xl + wh; /* char_x_right */ - c0 = get_tile_div_mod_m7(xl); - c1 = get_tile_div_mod_m7(xr); - for (col = c0; col <= c1; col++) { - int8_t row = Char.curr_row; - if (col < 0 || col > 9) continue; - for (;;) { - uint8_t t = get_tile(col, row); - if (t == TILE_SPIKE) { start_anim_spike((uint8_t)(row * 10 + col)); break; } - if (!tile_is_floor(t) && row <= 2) { row++; continue; } - break; - } - } -} - -/* chomped (seg004:07BF): персонажа перемололо. Тайл помечается кровью - * (0x80 в modif), персонаж выравнивается по колонке чомпера, теряет все HP - * и уходит в seq_54. Условие «кадр ещё не 178» — чтобы не перезапускать - * последовательность каждый кадр, пока труп лежит в челюстях. - * - * Кровь пишется ДАЖЕ у скелета: SDLPoP чинит это опцией - * fix_skeleton_chomper_blood, но в ВАНИЛИ она есть, и мы держим ваниль. */ -static void chomped(uint8_t tilepos, int8_t col) -{ - pop_trob_modif(g_room)[tilepos] |= 0x80; - if (Char.frame == FRAME_178_CHOMPED) return; - Char.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_MIDX); - Char.x = (uint8_t)char_dx_forward(7 - !Char.direction); - Char.y = (uint8_t)pop_y_land[Char.curr_row + 1]; - pop_sfx_play(46); - pop_take_hp(100); - pop_char_set_seq(SEQ_54_CHOMPED); - play_seq(); - if (Char.charid == CHARID_0_KID) pop_kid_dead = 1; -} - -/* check_gate_push (seg004:0833): ОПУСКАЮЩАЯСЯ решётка выталкивает персонажа - * из своего тайла. Без неё Кид, зашедший в тайл ворот при поднятой решётке, - * так и остаётся в нём после опускания — «в суперпозиции»: створка рисуется - * то перед ним, то за ним (слой выбирается по направлению взгляда), и уйти - * он может в обе стороны. Поймано пользователем 2026-08-24; то же и для - * попытки проползти под опускающейся решёткой в присяде. - * - * Условия оригинала — только позы, где персонаж стоит на месте и его можно - * сдвинуть, не ломая анимацию: РАЗВОРОТ (action 7), СТОЙКА (кадр 15) и - * кадры приседа 108..110. Решётка ищется в своём тайле И в тайле СЛЕВА: - * створка нарисована у ПРАВОЙ грани тайла, поэтому левый сосед давит так - * же. Перекрытие обязано быть обеими гранями и в этом кадре, и в прошлом - * (у оригинала `curr_row_coll_flags & prev_coll_flags == 0xFF`) — иначе - * толчок срабатывал бы на пролёте мимо. Сам толчок — 5 пикселей: ВЛЕВО, - * если решётка в тайле персонажа, ВПРАВО — если в левом соседе. */ -static void check_gate_push(void) -{ - int8_t orig_col = Char.curr_col, col, row = Char.curr_row; - uint8_t frame = Char.frame; - - if (Char.action != ACT_TURN && frame != 15 && - !(frame >= 108 && frame < 111)) return; - col = orig_col; - if (get_tile(col, row) != TILE_GATE) { - col--; - if (get_tile(col, row) != TILE_GATE) return; - } - /* Слот флагов годен только внутри ОКОН обоих кадров: вне их лежат - * значения прошлых кадров (та же оговорка, что в check_chomped_flags). */ - if (col < coll_lo || col > coll_hi || - col < coll_prev_lo || col > coll_prev_hi) return; - if ((coll_curr[COLL_IDX(col)] & coll_prev[COLL_IDX(col)]) != 3) return; - if (gate_passable(col, row)) return; /* can_bump_into_gate */ - pop_sfx_play(8); /* bumped_sound (seg004:05F1) */ - Char.x = (uint8_t)((int)Char.x + (orig_col <= col ? -5 : 5)); -} - -/* check_chomped_kid (seg004:076B): по колонкам ряда — там, где персонаж - * перекрывает тайл ОБЕИМИ гранями (у оригинала curr_row_coll_flags == 0xFF, - * у нас оба бита) и этот тайл — СОМКНУТЫЙ чомпер (modif & 0x7F == 2), - * персонажа перемалывает. */ -/* lo..hi — ОКНО, по которому посчитан flags: вне него слоты протухшие (там - * лежат значения прошлых кадров), и «== 3» дал бы фантомный перемол. */ -static void check_chomped_flags(const uint8_t *flags, int8_t lo, int8_t hi) -{ - int8_t row = Char.curr_row, col; - uint8_t tp; - if (row < 0 || row > 2) return; - if (lo < 0) lo = 0; - if (hi > 9) hi = 9; - for (col = lo; col <= hi; col++) { - if (flags[COLL_IDX(col)] != 3) continue; - if (get_tile(col, row) != TILE_CHOMPER) continue; - tp = (uint8_t)(row * 10 + col); - if ((pop_trob_modif(g_room)[tp] & 0x7F) == 2) chomped(tp, col); - } -} - -static void check_chomped_kid(void) { check_chomped_flags(coll_curr, coll_lo, coll_hi); } - -/* check_chomped_guard (seg004:0989) — у оригинала ОТДЕЛЬНОЕ тело: страж не - * проходит через check_collisions, поэтому там перекрытие считается прямо по - * координатам граней (check_chomped_here). У нас та же формула уже живёт в - * get_row_collision_data, поэтому считаем флаги ряда во ВРЕМЕННЫЙ массив и - * идём общим телом. Именно во временный: coll_curr/above/below — это кадр - * КИДА, из них move_coll_to_prev берёт «прошлые» флаги на следующем кадре, и - * затирание сломало бы ему бамп. */ -static void check_chomped_guard(void) -{ - uint8_t flags[COLL_N]; - if (Char.curr_row < 0 || Char.curr_row > 2) return; - set_char_collision(); - calc_coll_window(); /* своё окно; coll_lo/hi Кида не трогаем */ - get_row_collision_data(Char.curr_row, flags); - check_chomped_flags(flags, win_lo, win_hi); -} - -/* ---- Кадровая физика: одна и та же над Char, два входа --------------- * - * Оригинал держит физику ОДНИМ набором функций над Char, а кто именно в - * Char — решают окна loadkid/savekid и loadshad/saveshad (seg006:809). - * Мы теперь так же: kid_phys/guard_phys — это списки вызовов из - * play_kid_frame (seg000:1209) и play_guard_frame (seg000:1246), а сами - * проверки общие. Списки отличаются ровно тем, чем в оригинале. */ - -static void kid_phys(void) -{ - if (grab_timer) grab_timer--; - /* do_timers (seg003:0517): срок действия пера тикает раз в игровой кадр. - * Место — у Кида, а не у стража: эффект в оригинале снимается общим - * таймером главного цикла, а у нас единственный кадровый тик Кида. */ - if (pop_feather) pop_feather--; - fall_accel(); - fall_speed(); - determine_col(); - bump_into_opponent(); /* seg003: безоружный Кид отскакивает от стража */ - check_collisions(); /* seg004: флаги перекрытия по колонкам ряда */ - pop_dbg_p6(); /* ЗАМЕР: check_collisions целиком */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_bumped(); /* удержать у стены до check_action (порядок PoP) */ - check_gate_push(); /* seg004: опустившаяся решётка выталкивает из тайла */ - check_action(); - pop_dbg_p7(); /* ЗАМЕР */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_press(); /* seg006: стойка/пробой loose → make_loose_fall */ - pop_dbg_p8(); /* ЗАМЕР */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - check_spike_below(); /* seg006: над колонкой с пиками → выдвинуть пики */ - check_spiked(); /* seg006: напоролся на вредные пики → смерть */ - check_chomped_kid(); /* seg004: перемололо в сомкнутых челюстях → смерть */ - /* upside_down снимается смертью (seg000:1224: `if (upside_down && - * Char.alive >= 0)`). У нас признак смерти — pop_kid_dead, ставится - * там же, где оригинал переводит alive в >= 0. */ - if (pop_kid_dead && pop_upside_want) { pop_upside_want = 0; pop_upside_dirty = 1; } - if (pop_kid_dead) return; /* только что умер — без leave/knock в этот кадр */ - pop_check_knock(); /* seg003: сотрясение приземления → тряска loose в ряду */ - /* exit_room_timer (seg002 exit_room): 2 кадра ПОСЛЕ входа в комнату любой - * leave заблокирован. Без него транзиент отскока о ворота шва (seq_47 - * роняет char_x за порог) сразу же выкидывает Kid в соседнюю комнату - * (ping-pong / баг #4). С таймером первый бамп попадает в окно блокировки, - * Kid оседает у грани (char_x стабильно > порога) — экран не перескакивает. */ - if (pop_leave_timer) { - pop_leave_timer--; - } else { - check_leave_below(); /* seg002: y>=211 → переход в комнату снизу */ - check_leave(); /* seg002: уход вбок → переход в соседнюю комнату */ - } -} - -/* play_guard_frame (seg000:1252..1266). Чего у стража НЕТ по сравнению с - * Кидом: bump_into_opponent, check_collisions/check_bumped (у него свой - * check_guard_bumped), check_gate_push, check_knock и весь уход из комнаты. - * check_chomped_guard — то же тело, что у Кида (у нас check_chomped). */ -static void guard_phys(void) -{ - fall_accel(); - fall_speed(); - determine_col(); - check_guard_bumped(); - check_action(); - check_press(); /* страж тоже давит кнопки и проваливает loose */ - check_spike_below(); - check_spiked(); - check_chomped_guard();/* seg000:1265 */ -} - -/* Физика КИДА — своё окно Char: главный цикл зовёт нас вне окон, а физика - * работает с активным персонажем. Сохраняем ПОЛНОСТЬЮ (pop_savekid_and_opp): - * физика меняет персонажу всё — координаты, ряд/колонку, кадр, seq. */ -void pop_phys_tick(void) __banked -{ - /* РАННЕГО ВЫХОДА ПО pop_kid_dead ЗДЕСЬ НЕТ — и это принципиально. - * У оригинала play_kid_frame (seg000:1231) гейт ровно один, `Char.room - * != 0`: вся цепочка крутится и на ТРУПЕ. Стоял `if (pop_kid_dead) - * return;` — дёшево и почти незаметно, но вместе с физикой он выключал - * check_press, а тот на мёртвом персонаже делает совсем не то, что на - * живом (died_on_button — кнопка ломается насовсем). Наблюдалось как - * «Кид разбился на кнопке открытия решётки, а решётка закрылась» - * (уровень 7, комната 3, тайл 2,1): кнопка получала РОВНО ОДНО нажатие — - * в кадре самой смерти, потому что pop_kid_dead ставит land() уже внутри - * цепочки. Разбор — BUGS_CLOSED.md#died-on-button. - * - * «Труп не шевелится» держится не этим выходом, а тем же, чем в - * оригинале: кадр смерти не двигается сам (dx/dy нулевые, sequence - * кончился), а уход из комнаты и сотрясение отсечены внутри kid_phys. */ - pop_loadkid_and_opp(); - pop_dbg_p1(); /* ЗАМЕР: окно Char загружено */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - kid_phys(); - pop_savekid_and_opp(); -} - -/* Физика СТРАЖА. Зовётся из главного цикла (резидент), а не из guards.c: - * цена та же — один трамплин на кадр, — но банк 1 не зовёт банк 3, а окно - * Char стоит копию 16 байт. */ -void pop_guard_phys_tick(void) __banked -{ - /* Тот же гейт, что в pop_guard_tick: dir_56_none = персонаж выключен - * (clear_char), физику ему тоже не крутим. */ - if (Guard.charid == 0 || Guard.direction == DIR_56_NONE || - Guard.room != g_room) return; - pop_loadshad_and_opp(); - /* seg000:1254 — физика работает, ТОЛЬКО пока страж внутри комнаты: за - * пределами полосы персонаж просто перестаёт двигаться, а - * провалившегося ниже убирает check_guard_fallout (seg002:0241). - * - * Это значит «своим ходом из комнаты не уйдёт», но НЕ «остаётся в ней - * всегда»: когда комнату меняет КИД, exit_room (seg002:03C7) может - * перенести стража следом — follow_guard, если тот жив, с вынутым - * мечом, стоит у нужного края (x < 91 при уходе влево, x >= 165 при - * уходе вправо) и в целевой комнате нет своего живого стража. У нас - * follow_guard пока не портирован (GUARD-PHYS в TASKS_OPEN.md). */ - if (Char.x >= 44 && Char.x < 211) { - pop_load_fram_det_col(); /* load_frame_to_obj + load_fram_det_col */ - guard_phys(); - } - pop_saveshad_and_opp(); -} - -/* ---- Зеркало уровня 4 (порт seg003:0798..08A9) ---------------------- * - * - * Тайл зеркала ставится в рантайме (pop_trob.c place_mirror), а «стеной - * слева» он уже был — wall_type = 2 портирован давно. Здесь вторая часть: - * что происходит ПОСЛЕ того, как Кид пролетел сквозь него беговым прыжком - * (флаг pop_jumped_mirror взводит is_obstacle выше по файлу). */ - -/* check_mirror_image (seg003:085B). МУТИРУЕТ Char НА МЕСТЕ: x отражается - * относительно оси зеркала, direction инвертируется. Возвращает - * distance_mirror — насколько персонаж вошёл в тайл (оригинал по нему - * решает, рисовать ли отражение; нам это понадобится на шаге «отражение»). - * - * Мутация Char здесь ЗАДУМАНА, а не побочный эффект: оригинал зовёт эту - * функцию из двух мест, и оба на неё рассчитывают — при рисовании отражения - * (в Char временная копия Кида, обратно она не сохраняется) и при рождении - * тени (мутированный Char уходит в слот Guard). */ -static int8_t mirror_image(void) -{ - /* +10 — смещение оси зеркала внутри тайла; в оригинале так и написано - * комментарием («I think 10 is the offset for mirror collision»). */ - int xpos = pop_x_bump[Char.curr_col + FIRST_ONSCREEN_COLUMN] + 10; - int distance = distance_to_edge_weight(); - if (Char.direction >= 0) distance = ~distance + TILE_SIZEX; - Char.x = (uint8_t)((xpos << 1) - (int)Char.x); - Char.direction = (int8_t)~Char.direction; - return (int8_t)(distance - 2); -} - -/* jump_through_mirror (seg003:080A): рождение ТЕНИ. Кид копируется в слот - * Guard уже отражённым; HP меняются местами — у тени полное здоровье Кида, у - * самого Кида остаётся 1. Полосы HP отдельно перерисовывать не надо: - * pop_hp_draw сравнивает числа и смену увидит сам. - * - * savekid здесь НЕТ и в оригинале: собственные x/direction Кида остаются - * прежними, отражается только копия, уходящая в слот Guard. */ -static void jump_through_mirror(void) -{ - pop_loadkid(); - pop_load_frame(); /* mirror_image смотрит на dx/flags КАДРА */ - (void)mirror_image(); - pop_jumped_mirror = 0; - Char.charid = CHARID_1_SHADOW; - pop_sfx_play(45); /* seg003:0617 — прыжок в зеркало */ - pop_saveshad(); - guardhp_max = guardhp_curr = hitp_max; - hitp_curr = 1; -} - -/* Линия клипа отражения СВЕРХУ — y_clip[curr_row+1] оригинала. Таблица та - * же, что в pop_clip_char_top; держим её здесь копией из четырёх значений, - * а не тащим наружу: ряд у отражения всегда 0..2. */ -static int mirror_clip_top(int8_t row) -{ - static const int16_t y_clip[5] = { -60, 3, 66, 129, 192 }; - int8_t r = (int8_t)(row + 1); - if (r < 0 || r > 4) return 0; - return (int)y_clip[r]; -} - -void pop_check_mirror(void) __banked -{ - if (pop_jumped_mirror == -1) { jump_through_mirror(); return; } - /* Отражение: пока Кид СТОИТ на тайле зеркала, рисуем его зеркальную - * копию (в оригинале — add_objtable(4)). Условия оригинала: тайл под - * персонажем — зеркало, distance_mirror >= 0 (вошёл в тайл достаточно - * глубоко) и его комната = отрисованная. */ - if (Kid.room != g_room) return; - pop_loadkid(); - if (get_tile_at_char() != TILE_MIRROR) return; - pop_load_frame(); - if (mirror_image() >= 0) - pop_mirror_draw(mirror_clip_top(Char.curr_row)); - /* Char остался ОТРАЖЁННЫМ — как в оригинале: обратно он не сохраняется, - * а следующий тик перезагружает окно из Kid. */ -} - -/* Закрытое состояние физики, которое влияет на следующие кадры. Таблицы - * коллизии и кэши соседей намеренно не входят: их пересчитает вход в комнату. */ -void pop_map_qsave(pop_qs_io_t *io) __banked -{ - pop_qs_u8(io, &is_screaming); - pop_qs_u8(io, &grab_timer); - pop_qs_i8(io, &pickup_obj_type); - pop_qs_u16(io, &loose_seed.lo); - pop_qs_u16(io, &loose_seed.hi); - pop_qs_u8(io, &last_loose_snd); - if (io->reading && io->apply) pop_coll_invalidate(); -} diff --git a/applications/SprPoP/src/pop_map.h b/applications/SprPoP/src/pop_map.h deleted file mode 100644 index 1208c8e..0000000 --- a/applications/SprPoP/src/pop_map.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * pop_map.h — коллизия Kid с картой комнаты (Фаза K3): тайловые запросы - * + физика падения + приземление. Порт SDLPoP seg005/seg006 - * (check_on_floor/start_fall/do_fall/fall_accel/fall_speed/land/in_wall). - * - * K3.2 (падение): Kid, сойдя/сбежав с края пола (тайл под ним не floor), - * начинает падать (fall_y-ускорение, Char.y растёт), приземляется на пол - * ниже (soft/medium land) или продолжает вниз. Стена под персонажем — - * in_wall (выталкивание). Бег В стену (check_bumped) — отдельным шагом. - */ -#ifndef POP_MAP_H -#define POP_MAP_H - -#include -#include "pop_char.h" /* pop_char_t — окклюзия ворот спрашивает про персонажа */ -#include "pop_qsave.h" - -/* Задать карту текущей комнаты: fg[30] = коды тайлов (row*10+col, 3×10). - * col<0/>9 или row<0/>2 трактуются как стена (край уровня). Массив - * МУТАБЕЛЬНЫЙ (loose-пол при падении → empty) — передавать ту же копию, - * что и в pop_room_draw, чтобы отрисовка видела изменения. */ -void pop_map_set(uint8_t *fg) __banked; - -/* Связи комнаты (0=нет соседа; иначе номер). Заодно кэширует fg соседей - * слева и справа ЦЕЛИКОМ (читает уровень сам). Оригинал добирается до любой - * колонки через find_room_of_tile, у нас уровень в EMM-странице и маппить её - * на каждый get_tile (горячий путь физики) дорого — поэтому копия соседей. - * Колонка персонажа считается из x и на диапазоне x 0..255 лежит в −5..13, - * то есть заведомо выходит за комнату; кромочных колонок не хватало, и - * get_tile отдавал мнимую стену (BUG-SWORD-GHOST-1). Звать в enter_room. */ -void pop_map_set_edges(uint8_t left, uint8_t right, uint8_t up, uint8_t down) __banked; -/* Перечитать fg соседей (кромочные колонки коллизии) из уровня, не сбрасывая - * историю перекрытий. Нужен, когда тайл соседа изменился, пока тот не - * отрисован — см. pop_neigh_dirty в pop_state.h. */ -void pop_map_refresh_edges(void) __banked; - -/* БОКОВОЙ переход в соседнюю комнату: перенумеровать историю флагов - * перекрытия вместо того, чтобы её выбросить (иначе Кид с разбега проходит - * сквозь закрытые ворота шва — BUG-GATE-PASS-1). dcol — на сколько - * изменились номера колонок: ушли ВПРАВО −10, ВЛЕВО +10. Звать СРАЗУ после - * pop_map_set_edges и только для боковых переходов; вверх/вниз и все прочие - * входы в комнату остаются на полной инвалидации. Разбор — BUGS_CLOSED.md, - * расхождение с дословным портом — ../docs/impl_diff.md. */ -void pop_coll_shift(int8_t dcol) __banked; - -/* check_skel: тайл скелета -> пол + пометка перерисовки (обе страницы). */ -void pop_skel_wake_tile(uint8_t tilepos) __banked; - -/* Openness ворот в (col,row) с резолвом за край комнаты (соседи слева/справа). - * 0xFF — тайла нет. Нужен лучу видимости стража (guards.c). */ -uint8_t pop_gate_modif(int8_t col, int8_t row) __banked; - -/* Номер ТЕКУЩЕЙ комнаты (для доступа к room_modif пик/ворот в pop_trob). - * Звать в enter_room. */ -void pop_map_set_room(uint8_t room) __banked; - -/* Тайл-код текущей комнаты по клетке (col 0..9, row 0..2) — порт - * get_tile(room,col,row) для текущей комнаты. Нужен лучу видимости стража - * (guards.c): он идёт по ряду между Кидом и стражем. */ -uint8_t pop_tile_at(int8_t col, int8_t row) __banked; - -/* Тайлы отрезка ряда c0..c1 одним банковым вызовом (см. тело в pop_map.c): - * луч видимости стража иначе платит по трамплину за КАЖДУЮ колонку. */ -void pop_row_tiles(int8_t row, int8_t c0, int8_t c1, uint8_t *out) __banked; - -/* determine_col (seg006:014D): Kid.curr_col = m7(dx_weight()). Наружу — для - * pop_load_fram_det_col (pop_kid.c), порт load_fram_det_col. */ -void pop_determine_col(void) __banked; - -/* Тайл позади АКТИВНОГО персонажа и расстояние до кромки его тайла. - * Нужны боевой половине (guards.c) для выбора смерти у обрыва. */ -uint8_t pop_tile_behind_char(void) __banked; -int8_t pop_dist_to_edge_weight(void) __banked; - -/* HP/смерть. pop_kid_dead=1 когда Kid убит (пики); hitp_curr — текущее HP. - * pop_kid_hp_reset() ставит старт HP и снимает смерть (звать в kid_init/ - * респавн). */ -extern uint8_t pop_kid_dead; -extern uint8_t hitp_curr; -extern uint8_t hitp_max; /* стартовое HP (для индикатора) */ -extern int8_t hitp_delta; /* урон за кадр от меча; применяет pop_do_delta_hp */ -/* check_fall_flo (seg000:1317) — спецсобытие уровня 13: вход в комнату 23 - * или 16 роняет на Кида гряду плит из комнаты СВЕРХУ, каждую со своей - * задержкой. Звать при входе в комнату ПОСЛЕ pop_loose_reset (порядок - * check_the_end: start_chompers → check_fall_flo → check_shadow). */ -void pop_check_fall_flo(void) __banked; - -void pop_kid_hp_reset(void) __banked; -/* То же для БЕСШОВНОГО старта уровня (pop_seamless): HP не трогаем вовсе. */ -void pop_kid_hp_carry(void) __banked; - -/* hitp_beg_lev (seg003): HP, с которым НАЧАТ текущий уровень. Рестарт - * уровня (смерть/выпадение) откатывает HP ровно к нему; пройденный уровень - * подтягивает его к hitp_max (play_level_2, seg003:410) — так «жизнь» из - * большой склянки переезжает на следующий уровень. Правит главный цикл. */ -extern uint8_t hitp_beg_lev; -#define POP_START_HITP 3 /* custom->start_hitp */ -#define POP_MAX_HITP 10 /* custom->max_hitp_allowed */ -void pop_kid_hp_newgame(void) __banked; /* начало ИГРЫ: hitp_beg_lev = 3 */ - -/* Предметы (seg005 check_get_item/get_item, seg006 do_pickup/proc_get_object). - * pop_have_sword — «меч у Кида» (порт have_sword). pop_item_taken — 0 или - * tilepos+1 только что поднятого предмета: вызывающий обязан запечь тайл - * (он стал полом) на ОБЕИХ страницах и записать override комнаты. */ -extern uint8_t pop_have_sword; -extern uint8_t pop_item_taken; -/* Вспышка фона (do_flash/set_bg_attr, seg001:0908): счётчик кадров, пока - * НУЛЕВАЯ запись палитры подменена ярко-жёлтым. Тикает вызывающий. */ -extern uint8_t pop_flash_time; -/* Цвет вспышки (порт flash_color, seg006 proc_get_object / seg000 feather_fall): - * жёлтая — подобран меч, красная — зелья HP, зелёная — перо. */ -#define POP_FLASH_YELLOW 0 -#define POP_FLASH_RED 1 -#define POP_FLASH_GREEN 2 -#define POP_FLASH_WHITE 3 /* тень: слияние и её смерть (уровень 12) */ -extern uint8_t pop_flash_color; - -/* add_life (seg000:11EC): +1 к ПОТОЛКУ HP и долив до него. Наружу — ради - * слияния с тенью (уровень 12, guards.c в другом банке): большая склянка - * зовёт ту же ветку изнутри модуля. */ -void pop_add_life(void) __banked; - -/* is_feather_fall: кадров, пока действует зелье медленного падения. Читают - * play_seq (опкод JMP_IF_FEATHER — ветки stepfloat/bumpfloat в seqtbl) и - * приложение (сброс на старте уровня, seg003:189). */ -extern uint8_t pop_feather; - -/* upside_down (seg000:15E9): 1 — картинка перевёрнута вверх ногами (зелье - * типа 4 на уровне 9). Читают все слои отрисовки; сбрасывается стартом - * уровня и смертью Кида (seg000:1224). - * pop_upside_dirty — порт need_redraw_because_flipped: флаг «состояние - * переворота ИЗМЕНИЛОСЬ», по нему главный цикл один раз переворачивает уже - * нарисованное (pop_flip_screen) и снимает флаг. */ -extern uint8_t pop_upside; /* ТЕКУЩЕЕ — его читают все слои отрисовки */ -extern uint8_t pop_upside_want; /* ЖЕЛАЕМОЕ — сюда пишут зелье и смерть */ -extern uint8_t pop_upside_dirty; -uint8_t pop_get_item_action(void) __banked; /* 0 нет / 1 присесть / 2 поднять меч / 3 пить */ -void pop_proc_get_object(void) __banked; /* эффект — из play_seq (опкод GET_ITEM) */ - -/* Уход из комнаты ВБОК/ВВЕРХ: 0=нет; 1=left,2=right,3=up (= side+1 для - * pop_room_link). Координаты Kid уже репроецированы (x∓140 / y+189). - * Приложение переключает комнату по соответствующей связи и снимает флаг. */ -extern uint8_t pop_leave_dir; - -/* exit_room_timer (порт seg002 exit_room): пока >0, боковой/нижний leave - * заблокирован (декремент в pop_phys_tick). Приложение ставит =2 при входе - * в комнату (enter_room) — 2 кадра защиты от повторного/транзиентного leave - * (ping-pong у шва, транзиент отскока о ворота, баг #4/BUG-2). */ -extern uint8_t pop_leave_timer; - -/* Loose floors (проваливающиеся полы). pop_loose_modif[30] — состояние на - * тайл (0 покой / 0x80.. тряска / 1..11 отсчёт падения); читает pop_bg при - * отрисовке. pop_loose_tick() — анимация + перерисовка изменившихся тайлов - * на ТЕКУЩЕЙ странице; звать в основном цикле ПОСЛЕ set_draw_page(back), - * рядом с kid-отрисовкой. */ -extern uint8_t pop_loose_modif[30]; -void pop_loose_tick(void) __banked; -void pop_loose_reset(void) __banked; /* сброс loose-состояния при смене комнаты */ -/* Отдать НЕЗАКОНЧЕННЫЕ loose уходящей комнаты в персистентный room_modif + - * список trob, чтобы они досчитались заочно (в оригинале loose и есть trob, - * а do_trobs крутит список независимо от drawn_room). Звать ПЕРЕД любой - * перезагрузкой комнаты, пока карта ещё описывает СТАРУЮ. */ -void pop_loose_leave_room(void) __banked; -/* СТАРТ/РЕСТАРТ уровня: забыть фазы БЕЗ сдачи (load_level сносит всё сам). - * Звать рядом с pop_trob_reset, до первого enter_room. */ -void pop_loose_forget(void) __banked; - -/* Персонаж стоит НА тайле ворот, значит их решётку надо вернуть ПОВЕРХ него - * (порт условия draw_tile_fore, seg008:0D15 — разбор в pop_map.c). Бары - * рисуются в колонке ch->curr_col + 1: графика ворот принадлежит правому - * краю своего тайла. Рисование — pop_fore_over_char (pop_bg.c). */ -uint8_t pop_gate_over_char(const pop_char_t *ch) __banked; - -/* Установлен в tilepos+1 в кадре, когда loose-пол упал (кусок улетел ВНИЗ). - * Приложение: определить debris-приземление в комнате снизу. Снять (=0). */ -extern uint8_t pop_loose_fell; - -/* Плита-ПОТОЛОК: loose ряда 2 комнаты СВЕРХУ (в оригинале — тот же loose с - * отрицательным tilepos, seg006 check_press frame 79 / seg007 animate_loose). - * pop_map_set_above даёт МУТАБЕЛЬНУЮ копию ряда 2 верхнего соседа (ту же, что - * ушла в pop_room_set_above): провалившаяся плита становится в ней EMPTY — - * сверху открывается колодец. pop_ceil_modif[col] — состояние (как - * pop_loose_modif), читает pop_bg. Сигналы приложению (для персистентности - * между входами в комнату): pop_ceil_fell = col+1 провалившейся плиты, - * pop_debris_at = tilepos+1 щебня, оставшегося в ЭТОЙ комнате. Снимать (=0). */ -void pop_map_set_above(uint8_t *above_row2_fg) __banked; -extern uint8_t pop_ceil_modif[10]; -extern uint8_t pop_ceil_fell; -extern uint8_t pop_debris_at; - -/* Взводится в кадре, когда Kid получил урон (hitp_delta<0 оригинала) — - * отрисовка персонажа рисует «брызги» поверх Kid, а главный цикл снимает - * флаг. */ -extern uint8_t pop_kid_hurt; - -/* check_knock (seg003): по флагу knock (play_seq) тряхнуть loose-полы ряда - * приземления/удара. Зовётся из pop_phys_tick. */ -void pop_check_knock(void) __banked; - -/* Установлен в 1, когда Kid пересёк НИЖНЮЮ границу комнаты (провал в дыру - * или спуск-зацеп с кромки). Координаты Kid УЖЕ репроецированы в кадр - * комнаты снизу (y -= 189, curr_row = 0). Приложение решает: если есть - * links.down — сменить комнату (pop_room_load+перерисовка) и продолжить; - * иначе — выпал из уровня (респавн). Снять флаг после обработки. */ -extern uint8_t pop_fell_out; -void pop_map_qsave(pop_qs_io_t *io) __banked; - -/* Пер-кадровая физика ПОСЛЕ kid_tick(play_seq): fall_accel + fall_speed + - * determine_col + check_action (триггер падения / do_fall / приземление). - * Порядок как в оригинале (seg000 play_kid_frame). - * - * Физика внутри работает с АКТИВНЫМ персонажем (Char), как в оригинале, и - * сама открывает окно loadkid/savekid — звать вне окон Char. */ -void pop_phys_tick(void) __banked; - -/* То же для стража — порт хвоста play_guard_frame (seg000:1246). Звать из - * главного цикла СРАЗУ после pop_guard_tick() (тот прокручивает ИИ и - * последовательность), тоже вне окон Char: функция открывает своё. - * - * Физика у стража та же самая (одни функции над Char), отличается только - * список вызовов: нет ухода из комнаты, нет check_knock, вместо check_bumped - * — check_guard_bumped. Тот же вход обслужит скелета/тень/визиря, когда - * они появятся: в оригинале все они живут в слоте Guard. - * - * «Нет ухода из комнаты» — про СВОЙ ход. Следом за Кидом стража переносит - * exit_room/follow_guard (seg002:03C7/039E) — отдельная механика, у нас не - * портирована (GUARD-PHYS). */ -void pop_guard_phys_tick(void) __banked; - -/* clip_char (seg006:1749), верхняя граница клипа спрайта персонажа: если тайл - * над головой — стена/пол, всё выше линии своей полосы не рисуется (Kid, - * ушедший головой под пол при спуске/висе, не просвечивает сквозь щели). - * obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ спрайта, w/h — размер. - * Возврат: КОМНАТНЫЙ y границы, 0 = клипа нет. Зовёт pop_char_draw. */ -int pop_clip_char_top(int obj_x, int obj_y, uint16_t w, uint16_t h) __banked; - -/* Парная половина clip_char: ЭКРАННЫЙ X, правее которого спрайт не рисуется - * (правый косяк двери уровня в кадрах подъёма 224..228). 0 = обрезки нет. */ -int pop_clip_char_right(void) __banked; - -/* Тип препятствия/края ВПЕРЕДИ по направлению (pop_edge_type после - * pop_edge_distance): для control (бежать / осторожный шаг / стоп у стены). */ -#define EDGE_CLOSER 0 /* край уступа над ямой (дистанция = до кромки) */ -#define EDGE_WALL 1 /* стена впереди/под персонажем */ -#define EDGE_FLOOR 2 /* пол (нет препятствия рядом, дистанция = 11) */ - -/* Расстояние до края/стены впереди + побочно g_edge_type (pop_edge_type). */ -int pop_edge_distance(void) __banked; -uint8_t pop_edge_type(void) __banked; -/* Тайл, на котором остановился разбор края (curr_tile2 оригинала). */ -uint8_t pop_edge_tile(void) __banked; - -/* Стена впереди в пределах стопа? Если да — прижимает Kid.x к корректной - * позиции (передний край у стены, симметрично) и возвращает 1. Для - * control_running (чистый стоп у стены). */ -int pop_wall_ahead(void) __banked; - -/* Разбег-прыжок: выравнивание по кромке пола (run_jump, seg005:0AA8). - * Смотрит на 1–2 тайла вперёд; если там провал/пика — подгоняет Kid.x под - * толчок ровно с кромки. 1 = прыгать, 0 = ОТМЕНИТЬ прыжок (Кид не в той - * фазе относительно кромки; control_up гасить НЕЛЬЗЯ — попытка повторится - * на следующем кадре). Без этого провал в три тайла непроходим. */ -uint8_t pop_run_jump_align(void) __banked; - -/* Прыжок вверх в стойке (↑): seq чистого прыжка (seq_28/seq_14) ЛИБО - * прыжка-с-зацепом за уступ выше (seq_8/24/16) + выравнивание Kid.x. - * check_jump_up/grab_up (K4.4). control_up гасит caller. */ -uint8_t pop_jump_up_seq(void) __banked; - -/* ---- Вис/зацеп/спуск (K4.2/K4.3) — тайловые решения для pop_ctrl --- * - * Управление (control_hanging/can_climb_up/hang_fall/down_pressed) в - * pop_ctrl; здесь — предикаты + выбор seq (+ выравнивание Kid.x). */ -uint8_t pop_hang_grab_ready(void) __banked; /* grab_timer истёк — можно climb-up */ -uint8_t pop_hang_climb_up_seq(void) __banked; /* seq_10 / seq_73 (подтягивание) */ -int8_t pop_hang_wall(void) __banked; /* Shift в висе: 1=у стены,-1=fall,0=держ.*/ -uint8_t pop_hang_fall_seq(void) __banked; /* seq_23 / seq_11 (сорваться), +Kid.x */ -uint8_t pop_down_action(void) __banked; /* 1=обработано(спуск/отступ), 0=присед */ - -/* Дверь уровня рядом и ОТКРЫТА ПОЛНОСТЬЮ? → поставить Кида в проём (x + - * разворот влево, go_up_leveldoor) и вернуть 1; иначе 0, Кид не тронут. - * Ветка двери уровня из up_pressed (seg005:0482). Последовательность - * seq_70 ставит вызывающий (pop_ctrl) — тайлы наши, управление его. */ -uint8_t pop_leveldoor_enter(void) __banked; - -/* Зеркало уровня 4 (check_mirror, seg003:0798). Звать раз в кадр ПЕРЕД - * отрисовкой персонажей — в оригинале это первая строка draw_people - * (seg008:228A). Родит тень, если Кид только что пролетел сквозь зеркало. */ -void pop_check_mirror(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_menu.c b/applications/SprPoP/src/pop_menu.c deleted file mode 100644 index afefd8c..0000000 --- a/applications/SprPoP/src/pop_menu.c +++ /dev/null @@ -1,803 +0,0 @@ -/* - * pop_menu.c — pause menu, шрифты и временный UI-слой, БАНК 9. - * - * Отрисовка принципиально идёт GFX_BANK_SPRITE: прозрачный цвет 0xFF - * пропускается, а пауза не становится частью фоновой ОЗУ-копии игры. - * Каждый кадр UI собирается на скрытой - * видеостранице, флипается целиком и затем стирается копией чистого фона. - * Поэтому при переходе между пунктами нет видимой построчной перерисовки. - * - * Шрифты — исходные hc_small_font_data/hc_font_data из SDLPoP, заранее - * переведённые toolchain/pop_extract_font.py в FONT\\FONT.ATL. Атлас в W0 - * нужен ещё и как временное хранилище снимка палитры: затемнение не тратит - * 1 КБ дефицитной W2 и всегда восстанавливает точные цвета уровня. - */ -#include -#include -#include -#include -#include -#include "pop_menu.h" -#include "pop_pal.h" -#include "pop_ui.h" -#include "pop_font.h" /* POP_FONT_*_ASCENT — раскладка считается по шрифту */ -#include "pop_bg.h" /* POP_YOFF/POP_PLAYFIELD_H — границы игровой области */ -#include "pop_cdraw.h" /* POP_HP_Y — нижнюю статус-полосу делим с HP */ -#include "pop_pace.h" -#include "pop_settings.h" -#include "pop_cfg.h" -#include "pop_qsave.h" -#include "pop_music.h" /* pop_music_service — подкачка кольца, см. ui_wait_frame */ -#include "pop_status.h" -#include "pop_sfx.h" - -/* --- ОБЩАЯ ВЕРТИКАЛЬНАЯ РАСКЛАДКА ------------------------------------- * - * - * Экран у нас 320x256, но ИГРА занимает только 200 строк: 192 поля тайлов - * плюс 8 строк полосы HP, начиная с POP_YOFF. Всё, что выше и ниже, — - * борта, и на реальном ТВ/мониторе они могут быть срезаны. Поэтому каждый - * экран UI центрируется в этой самой полосе, а не в 256 строках кадра, и - * обязан в неё помещаться целиком. - * - * Блок считается «сверху вниз»: UI_CENTER_TOP отдаёт строку, с которой - * начинается силуэт содержимого (не базовая линия!). Первая базовая линия - * = верх + ascent шрифта, дальше — шаги. */ -#define UI_AREA_TOP POP_YOFF -#define UI_AREA_H (POP_PLAYFIELD_H + 8) /* поле + полоса HP = 200 */ -#define UI_CENTER_TOP(h) (UI_AREA_TOP + (UI_AREA_H - (h)) / 2) -/* Отдельный вариант для экранов, у которых нижняя статус-полоса занята - * своим содержимым: центрируем только по полю тайлов. */ -#define UI_CENTER_FIELD(h) (UI_AREA_TOP + (POP_PLAYFIELD_H - (h)) / 2) - -/* Рамка выделения строки. Заглавные малого шрифта занимают РОВНО пять - * строк [base-ascent .. base-1], поэтому симметричный отступ считается от - * них, а не от базовой линии: SEL_PAD строк воздуха сверху и снизу плюс - * сама линия рамки. Раньше низ рамки брался «на глаз» (base+5), и она - * визуально сидела ниже текста. */ -#define SEL_PAD 3 -#define SEL_TOP_DY (POP_FONT_SMALL_ASCENT + SEL_PAD + 1) /* 9 */ -#define SEL_BOT_DY (SEL_PAD) /* 3 */ - -#define MENU_N_ITEMS 7 -#define MENU_STEP 14 -#define MENU_LIST_H (SEL_TOP_DY + (MENU_N_ITEMS - 1) * MENU_STEP + \ - SEL_BOT_DY + 1) -/* Центрируем СПИСОК по полю тайлов: GAME PAUSED — не пункт меню, а строка - * состояния программы, и в блок центрирования не входит. */ -#define MENU_FIRST_BASE (UI_CENTER_FIELD(MENU_LIST_H) + SEL_TOP_DY) -/* Оригинал пишет её в нижнюю статус-полосу, между делениями HP Кида слева и - * стража справа (SDLPoP rect_bottom_text = {193,70,202,250}, valign_bottom): - * базовая линия на строку ниже полосы, силуэт крупного шрифта ложится ровно - * на неё. */ -#define MENU_PAUSED_BASE (POP_YOFF + POP_HP_Y + 8) -#define MENU_SEL_L 115 -#define MENU_SEL_R 205 -#define MENU_BORDER 0x37 /* светло-серый VGA16, не затемняем */ - -#define UI_LEFT 45 -#define UI_RIGHT 274 -#define UI_VALUE_RIGHT 257 - -#define SETTINGS_N_ITEMS 9 -/* Три секции по одному заголовку: T -> GENERAL, i2 -> GAMEPLAY, - * i6 -> CONTROLS. Между заголовком и строками, как и между строками, — - * фиксированные шаги, поэтому вся высота выражается через них. */ -#define SET_STEP 14 -#define SET_HEAD_GAP 17 -#define SET_BLOCK_H (POP_FONT_BIG_ASCENT + 3 * SET_HEAD_GAP + \ - 9 * SET_STEP + SEL_BOT_DY + 1) -#define SET_TITLE_BASE (UI_CENTER_TOP(SET_BLOCK_H) + POP_FONT_BIG_ASCENT) -#define SET_HEAD1 (SET_TITLE_BASE + SET_HEAD_GAP) -#define SET_HEAD2 (SET_HEAD1 + 4 * SET_STEP + SET_HEAD_GAP) -#define SET_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP) - -/* CONTROLS — ДВЕ КОЛОНКИ. В одну колонку раскладка уже не помещалась: - * после приведения клавиш к keys.txt (docs/keys_plan.md) их стало вдвое - * больше, а по высоте есть только 200 точек на всё вместе с заголовком. - * - * Слева — игра (бег, лазание, бой), справа — служебное и читы. Число строк - * в колонках разное и зависит от того, включены ли читы, поэтому высота - * блока считается в рантайме по ДЛИННОЙ колонке. */ -#define CTRL_TITLE_GAP 18 -#define CTRL_N_LEFT 10 /* игровые клавиши */ -#define CTRL_N_SYS 7 /* служебные */ -#define CTRL_N_CHEAT 5 /* читы: показываются, только если включены */ -/* Колонки сдвинуты вправо на 15 точек против первой раскладки: там слева - * оставалось 6 свободных точек, а справа 36, и блок выглядел прижатым к - * краю. Теперь поля 21 и ~20 — по обе стороны одинаково. */ -#define CTRL_L_KEY 21 -#define CTRL_L_DESC 77 -#define CTRL_R_KEY 179 -#define CTRL_R_DESC 235 -#define CTRL_STEP 13 - -/* ABOUT = ровно тот же текст, что на стартовом Sprinter screen, минус - * строка про клавиши. ABOUT_H — и высота блока, и смещение ПОСЛЕДНЕЙ - * базовой линии от его верха (совпадают, т.к. последняя строка малая). */ -#define ABOUT_GAP1 30 -#define ABOUT_GAP2 15 -#define ABOUT_H (POP_FONT_BIG_ASCENT + 2 * ABOUT_GAP1 + ABOUT_GAP2) -#define BUILD_KEYS_GAP 48 - -/* Подтверждение: рамка карточки, вопрос крупным, две кнопки. */ -#define CONF_BOX_H 66 -#define CONF_TOP UI_CENTER_TOP(CONF_BOX_H) -#define CONF_Q_BASE (CONF_TOP + 20) -#define CONF_BTN_BASE (CONF_TOP + 50) - -/* Уведомление: крупное сообщение + строка про клавиши. */ -#define NOTICE_GAP 44 -#define NOTICE_H (POP_FONT_BIG_ASCENT + NOTICE_GAP) -#define NOTICE_BASE (UI_CENTER_TOP(NOTICE_H) + POP_FONT_BIG_ASCENT) - -#define UI_KEYS_TEXT "ESC, ENTER OR SPACE: CONTINUE" - -/* SDLPoP menu.c: движение = loose_shake_2, подтверждение/Back = - * loose_shake_3, изменение значения = sword_vs_sword. Открытие pause menu - * намеренно без звука. */ -#define MENU_SND_CHANGE 10 -#define MENU_SND_MOVE 21 -#define MENU_SND_SELECT 22 -#define MENU_SND_NONE 0xFF - -/* Значения приходят из Makefile: ID — короткий git commit, DATE — дата - * этого коммита. Fallback оставляет исходник самостоятельным для host/IDE. */ -#ifndef POP_BUILD_ID -#define POP_BUILD_ID "DEV" -#endif -#ifndef POP_BUILD_DATE -#define POP_BUILD_DATE "UNKNOWN" -#endif - -/* Порядок = план §3. SETTINGS — вложенный экран в этом же bank 9. */ -static const uint8_t menu_cmds[MENU_N_ITEMS] = { - POP_MENU_RESUME, - POP_MENU_QUICKSAVE, - POP_MENU_QUICKLOAD, - POP_MENU_RESTART_LEVEL, - POP_MENU_SETTINGS, - POP_MENU_RESTART_GAME, - POP_MENU_QUIT -}; - -static const char * const menu_text[MENU_N_ITEMS] = { - "RESUME", - "QUICKSAVE (F6)", - "QUICKLOAD (F9)", - "RESTART LEVEL", - "SETTINGS", - "RESTART GAME", - "QUIT GAME" -}; - -/* Через bar, а не rectangle: у игры уже есть быстрый rectfill, тогда как - * rectangle тянет тяжёлый универсальный line-движок в и без того тесный W1. */ -static void menu_box(int left, int top, int right, int bottom, uint8_t color) -{ - setfillstyle(SOLID_FILL, color); - bar(left, top, right, top); - bar(left, bottom, right, bottom); - bar(left, top, left, bottom); - bar(right, top, right, bottom); -} - -/* Рамка выделения СТРОКИ: её вертикаль задаёт только базовая линия текста, - * поэтому ни один экран не считает отступы сам. */ -static void menu_sel_box(int left, int right, int baseline) -{ - menu_box(left, baseline - SEL_TOP_DY, right, baseline + SEL_BOT_DY, - MENU_BORDER); -} - -/* Весь UI собирается на скрытой странице. Источник gfx_copy_page — shadow - * видимой страницы, где оверлей отсутствует: все строки ниже идут через - * GFX_BANK_SPRITE. Один ui_end() = один готовый, tear-free кадр. */ -static uint8_t ui_begin(void) -{ - gfx_rect_t full; - uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1); - - /* ЗВУК ЗДЕСЬ БОЛЬШЕ НЕ ГЛУШИМ (снято 2026-08-28). - * - * Был вызов pop_sfx_pause() с обоснованием «полностраничная accel-копия - * держит DI дольше половины CBL-буфера, иначе железо повторяет старые - * 128 байт». Обоснование устарело: лист, который зовёт gfx_copy_page - * (_bgi_scroll_rows_raw), режет DI бандами по 16 строк — это ~1,6 мс - * против дедлайна насоса 11,7 мс, и окно прерываний между бандами есть. - * Тот же полностраничный копир каждый кадр делают игровой цикл и - * катсцены, и звук там не рвётся. - * - * А цена была слышимой: pause закрывает CBL целиком (cbl_close), курсор - * трека остаётся на месте, и короткая мелодия начала уровня замирала - * ровно на время перерисовки меню — «тормозится на кусочек» (жалоба - * пользователя 2026-08-28). У оригинала такого нет и быть не может: - * там нет насоса, который надо кормить руками. */ - gfx_set_draw_page(back); - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - gfx_copy_page(&full, GFX_COPY_DIRECT); - gfx_set_bank(GFX_BANK_SPRITE); - return back; -} - -/* КАДР МЕНЮ: перед ожиданием фронта — обслужить музыку. - * - * Насос CBL живёт в прерывании и главный цикл ему не нужен, НО потоковый - * трек (титульная тема играется КОЛЬЦОМ, pop_music.c) дочитывается с диска - * именно из pop_music_service: очередная страница попадает в слот, который - * насос уже прошёл. Пока открыто меню, главный цикл стоит, и без этого - * вызова кольцо опустошалось за несколько секунд — музыка замолкала до - * закрытия меню, а на перемещениях по пунктам это слышно как паузы - * (жалоба пользователя 2026-08-28). - * - * Место — рядом с ожиданием кадра: получается тот же темп 50 раз в - * секунду, что и в игровом цикле, и подкачка не чаще, чем нужна. */ -static void ui_wait_frame(void) -{ - pop_music_service(); - pop_wait_edge(); -} - -static void ui_end(uint8_t back) -{ - ui_wait_frame(); /* готовый кадр показать только на фронте */ - gfx_set_visible_page(back); - /* Парный к снятому pop_sfx_pause (см. ui_begin) вызов оставлен: он - * идемпотентен (открытый CBL возвращает 0 сразу) и чинит случай, когда - * в меню вошли при закрытом выводе — например сразу после загрузки - * уровня, которая глушит звук намеренно. */ - (void)pop_sfx_start(); -} - -static void menu_sound(uint8_t id) -{ - if (id == MENU_SND_NONE) return; - pop_sfx_play(id); - pop_sfx_tick(); /* play_menu_sound: запуск немедленно */ -} - -static void ui_wait_release(void) -{ - while (kbd_raw_down(KBD_ENTER) || kbd_raw_down(KBD_ESC) || - kbd_raw_down(KBD_SPACE) || - kbd_raw_down(KBD_UP) || kbd_raw_down(KBD_DOWN) || - kbd_raw_down(KBD_LEFT) || kbd_raw_down(KBD_RIGHT)) - ui_wait_frame(); -} - -/* Действие = Enter ИЛИ Space: в оригинале выбор подтверждается обеими, и - * держать их врозь незачем — обе читаются одним фронтом. */ -static uint8_t ui_action_down(void) -{ - return (uint8_t)(kbd_raw_down(KBD_ENTER) || kbd_raw_down(KBD_SPACE)); -} - -/* Информационный экран уже нарисован — ждём Esc/Enter/Space по фронту. */ -static void ui_wait_ack(void) -{ - uint8_t esc_prev = 0, act_prev = 0; - - for (;;) { - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t act = ui_action_down(); - if ((esc && !esc_prev) || (act && !act_prev)) { - ui_wait_release(); - return; - } - esc_prev = esc; act_prev = act; - ui_wait_frame(); - } -} - -static void menu_draw(uint8_t sel) -{ - uint8_t back = ui_begin(); - uint8_t i; - - /* Как в SDLPoP: только затемнённая замороженная сцена, компактный - * список и тонкий серый контур выбора, без непрозрачной карточки. */ - menu_sel_box(MENU_SEL_L, MENU_SEL_R, - MENU_FIRST_BASE + (int)sel * MENU_STEP); - - pop_text_map(); - for (i = 0; i < MENU_N_ITEMS; i++) - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, - MENU_FIRST_BASE + (int)i * MENU_STEP, menu_text[i]); - /* Полосу сначала чистим: там могло висеть сообщение игры («60 MINUTES - * LEFT», «QUICKSAVE»), и две надписи ложились друг на друга. */ - pop_text_unmap(); - pop_status_wipe(); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, MENU_PAUSED_BASE, - "GAME PAUSED"); - pop_text_unmap(); - ui_end(back); -} - -/* Явные (uint8_t) — не «на всякий случай»: SDCC 4.5 на константном - * ВЫРАЖЕНИИ больше 127 в инициализаторе uint8_t даёт warning 158, хотя - * значение помещается (на голом литерале 218 — молчит). */ -static const uint8_t settings_y[SETTINGS_N_ITEMS] = { - (uint8_t)(SET_HEAD1 + 1 * SET_STEP), (uint8_t)(SET_HEAD1 + 2 * SET_STEP), - (uint8_t)(SET_HEAD1 + 3 * SET_STEP), (uint8_t)(SET_HEAD1 + 4 * SET_STEP), - (uint8_t)(SET_HEAD2 + 1 * SET_STEP), (uint8_t)(SET_HEAD2 + 2 * SET_STEP), - (uint8_t)(SET_HEAD2 + 3 * SET_STEP), - (uint8_t)(SET_HEAD3 + 1 * SET_STEP), (uint8_t)(SET_HEAD3 + 2 * SET_STEP) -}; - -static const char * const speed_text[] = { "NORMAL", "FAST", "FASTEST" }; - -static void settings_line(uint8_t item, const char *name, const char *value, - uint8_t selected) -{ - int y = settings_y[item]; - if (selected) menu_sel_box(UI_LEFT, UI_RIGHT, y); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, y, name); - if (value) pop_text_right_mapped(POP_TEXT_SMALL, UI_VALUE_RIGHT, y, value); -} - -static void settings_draw(uint8_t sel) -{ - uint8_t back = ui_begin(); - - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, SET_TITLE_BASE, - "SETTINGS"); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD1, "GENERAL"); - settings_line(0, "SOUND", pop_settings.sound_enabled ? "ON" : "OFF", sel == 0); - settings_line(1, "MUSIC", pop_settings.music_enabled ? "ON" : "OFF", sel == 1); - settings_line(2, "DEBUG BAR", - pop_settings.show_debug_bar ? "ON" : "OFF", sel == 2); - settings_line(3, "RESTORE DEFAULTS...", 0, sel == 3); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD2, "GAMEPLAY"); - settings_line(4, "TIME LIMIT", - pop_settings.time_limit_enabled ? "60 MIN" : "UNLIMITED", - sel == 4); - settings_line(5, "SPEED", speed_text[pop_settings.speed_mode], sel == 5); - settings_line(6, "CHEATS", pop_settings.cheats_enabled ? "ON" : "OFF", sel == 6); - pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD3, "CONTROLS"); - settings_line(7, "SHOW KEY BINDINGS", 0, sel == 7); - settings_line(8, "ABOUT...", 0, sel == 8); - pop_text_unmap(); - ui_end(back); -} - -/* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за - * ними идут читовые: их показываем, только когда читы включены. */ -/* ЛЕВАЯ КОЛОНКА — игра. Строка «IN A FIGHT» здесь заголовок, а не клавиша: - * ниже неё те же стрелки и Shift означают уже другое, и без разделителя - * список читался бы как противоречивый. */ -static const char * const ctrl_l_key[CTRL_N_LEFT] = { - "ARROWS", "UP", "DOWN", "SHIFT", "SH+ARROWS", "HOME PGUP", - "IN A FIGHT", "SHIFT", "UP", "DOWN" -}; -static const char * const ctrl_l_desc[CTRL_N_LEFT] = { - "RUN / TURN", "JUMP, CLIMB", "CROUCH", "PICK UP", "CAREFUL STEP", - "JUMP L / R", - "", "STRIKE", "BLOCK", "SHEATHE" -}; - -/* ПРАВАЯ КОЛОНКА — служебное, ниже читы. */ -static const char * const ctrl_r_key[CTRL_N_SYS + 1 + CTRL_N_CHEAT] = { - "BACKSPACE", "SPACE", "T", "F6 / F9", "CTRL+A", "CTRL+S M", "CTRL+Q F10", - "CHEATS", - "SHIFT+L", "K", "+ / -", "SHIFT+I", "SHIFT+S T" -}; -static const char * const ctrl_r_desc[CTRL_N_SYS + 1 + CTRL_N_CHEAT] = { - "MENU", "TIME LEFT", "SHOW TIMER", "SAVE / LOAD", "RESTART LVL", - "SOUND / MUSIC", "QUIT", - "", - "NEXT LEVEL", "KILL GUARD", "TIME + / -", "FLIP SCREEN", "HEAL / MAX HP" -}; - -/* Одна строка колонки: слева клавиша, справа что она делает. Пустое - * описание — значит строка была заголовком секции, и клавишу мы печатаем - * как есть, без второго столбца. */ -static void ctrl_row(int kx, int dx, int y, const char *key, const char *desc) -{ - pop_text_draw_mapped(POP_TEXT_SMALL, kx, y, key); - if (desc[0]) pop_text_draw_mapped(POP_TEXT_SMALL, dx, y, desc); -} - -static void controls_draw(void) -{ - uint8_t back = ui_begin(); - /* С выключенными читами правая колонка короче: вместо пяти строк идёт - * одна пояснительная. Блок центрируется по ДЛИННОЙ из двух колонок. */ - uint8_t cheats = pop_settings.cheats_enabled; - uint8_t rright = (uint8_t)(cheats ? CTRL_N_SYS + 1 + CTRL_N_CHEAT - : CTRL_N_SYS + 1); - uint8_t rows = (uint8_t)(rright > CTRL_N_LEFT ? rright : CTRL_N_LEFT); - uint8_t i; - int top = UI_CENTER_TOP(POP_FONT_BIG_ASCENT + CTRL_TITLE_GAP + - (int)(rows - 1) * CTRL_STEP); - int y0 = top + POP_FONT_BIG_ASCENT; - int y; - - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y0, "CONTROLS"); - y = y0 + CTRL_TITLE_GAP; - for (i = 0; i < CTRL_N_LEFT; i++, y += CTRL_STEP) - ctrl_row(CTRL_L_KEY, CTRL_L_DESC, y, ctrl_l_key[i], ctrl_l_desc[i]); - y = y0 + CTRL_TITLE_GAP; - for (i = 0; i < rright; i++, y += CTRL_STEP) { - const char *key = ctrl_r_key[i], *desc = ctrl_r_desc[i]; - - /* Заголовок секции читов: с выключенными читами он же и объясняет, - * почему список ниже пуст. */ - if (i == CTRL_N_SYS && !cheats) desc = "DISABLED"; - ctrl_row(CTRL_R_KEY, CTRL_R_DESC, y, key, desc); - } - pop_text_unmap(); - ui_end(back); -} - -/* Текст экрана About — он же текст стартового Sprinter screen. Общий код - * ровно затем, чтобы эти два экрана не разъехались: пункт меню обязан - * показывать то же самое, только без строки про клавиши. */ -static void about_text(int top) -{ - int y = top + POP_FONT_BIG_ASCENT; - - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y, "PRINCE OF PERSIA"); - y += ABOUT_GAP1; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, - "SPRINTER SP2000 BUILD"); - y += ABOUT_GAP1; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, - "BUILD " POP_BUILD_ID); - y += ABOUT_GAP2; - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, y, POP_BUILD_DATE); -} - -static void about_draw(void) -{ - uint8_t back = ui_begin(); - - pop_text_map(); - about_text(UI_CENTER_TOP(ABOUT_H)); - pop_text_unmap(); - ui_end(back); -} - -static void confirm_draw(const char *question, uint8_t sel) -{ - uint8_t back = ui_begin(); - - menu_box(82, CONF_TOP, 238, CONF_TOP + CONF_BOX_H - 1, MENU_BORDER); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, CONF_Q_BASE, question); - if (sel == 0) menu_sel_box(104, 151, CONF_BTN_BASE); - else menu_sel_box(169, 216, CONF_BTN_BASE); - pop_text_center_mapped(POP_TEXT_SMALL, 128, CONF_BTN_BASE, "YES"); - pop_text_center_mapped(POP_TEXT_SMALL, 192, CONF_BTN_BASE, "NO"); - pop_text_unmap(); - ui_end(back); -} - -static uint8_t ui_confirm(const char *question) -{ - uint8_t sel = 1; /* разрушительные действия по умолчанию NO */ - uint8_t up_prev = 0, down_prev = 0, left_prev = 0, right_prev = 0; - uint8_t esc_prev = 0, ent_prev = 0; - - ui_wait_release(); - confirm_draw(question, sel); - menu_sound(MENU_SND_SELECT); - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t left = kbd_raw_down(KBD_LEFT); - uint8_t right = kbd_raw_down(KBD_RIGHT); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - - if ((up && !up_prev) || (down && !down_prev) || - (left && !left_prev) || (right && !right_prev)) { - sel ^= 1; - redraw = 1; - } - if (esc && !esc_prev) { - ui_wait_release(); - return 0; - } - if (ent && !ent_prev) { - uint8_t yes = (uint8_t)(sel == 0); - ui_wait_release(); - return yes; - } - up_prev = up; down_prev = down; left_prev = left; right_prev = right; - esc_prev = esc; ent_prev = ent; - if (redraw) { - confirm_draw(question, sel); - menu_sound(MENU_SND_MOVE); - } - ui_wait_frame(); - } -} - -static void notice_draw(const char *message) -{ - uint8_t back = ui_begin(); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, NOTICE_BASE, message); - pop_text_center_mapped(POP_TEXT_SMALL, GFX_WIDTH / 2, - NOTICE_BASE + NOTICE_GAP, UI_KEYS_TEXT); - pop_text_unmap(); - ui_end(back); -} - -static void ui_notice(const char *message) -{ - ui_wait_release(); - notice_draw(message); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static void controls_process(void) -{ - ui_wait_release(); - controls_draw(); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static void about_process(void) -{ - ui_wait_release(); - about_draw(); - menu_sound(MENU_SND_SELECT); - ui_wait_ack(); -} - -static uint8_t settings_finish(uint8_t changed) -{ - int8_t rc; - if (!changed) return 0; - pop_settings_apply(1); - /* Звук не глушим: POP.CFG — десятки байт, а на практике HOF пишется - * под звучащий «won» и насос это переживает (проверка пользователя - * 2026-08-28). Прежняя осторожность «ESTEX может уйти в диск на много - * CBL-периодов» относилась к загрузке НАБОРА страниц, а не к записи - * одного мелкого файла. */ - rc = pop_cfg_save(); - ui_notice(rc > 0 ? "SETTINGS SAVED" : "SAVE ERROR"); - return 1; -} - -static uint8_t settings_process(void) -{ - uint8_t sel = 0, changed = 0; - uint8_t up_prev = 0, down_prev = 0, left_prev = 0, right_prev = 0; - uint8_t esc_prev = 0, ent_prev = 0; - - ui_wait_release(); - settings_draw(sel); - menu_sound(MENU_SND_SELECT); /* вход во вложенное меню */ - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t left = kbd_raw_down(KBD_LEFT); - uint8_t right = kbd_raw_down(KBD_RIGHT); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - uint8_t change = 0; - uint8_t sound = MENU_SND_NONE; - int8_t delta = 0; - - if (up && !up_prev) { - sel = (uint8_t)(sel ? sel - 1 : SETTINGS_N_ITEMS - 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (down && !down_prev) { - sel = (uint8_t)(sel == SETTINGS_N_ITEMS - 1 ? 0 : sel + 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (esc && !esc_prev) { - uint8_t saved = settings_finish(changed); - ui_wait_release(); - return saved; - } - if ((left && !left_prev) || (right && !right_prev)) - delta = (right && !right_prev) ? 1 : -1; - /* Left/right принадлежат только числовой настройке скорости; - * остальные строки меняются Enter либо Space, чтобы стрелкой не - * открыть случайно Controls и не сбросить параметры. */ - if ((ent && !ent_prev) || (sel == 5 && delta)) { - if (sel == 0) { - pop_settings.sound_enabled ^= 1; change = 1; - } else if (sel == 1) { - pop_settings.music_enabled ^= 1; change = 1; - } else if (sel == 2) { - pop_settings.show_debug_bar ^= 1; change = 1; - } else if (sel == 3) { - if (ui_confirm("RESTORE DEFAULTS?")) { - pop_settings_defaults(); change = 1; - } - redraw = 1; sound = MENU_SND_SELECT; - } else if (sel == 4) { - pop_settings.time_limit_enabled ^= 1; change = 1; - } else if (sel == 5) { - uint8_t speed = pop_settings.speed_mode; - if (delta < 0) speed = (uint8_t)(speed ? speed - 1 : POP_SPEED_FASTEST); - else speed = (uint8_t)(speed == POP_SPEED_FASTEST ? POP_SPEED_NORMAL : speed + 1); - pop_settings.speed_mode = speed; change = 1; - } else if (sel == 6) { - pop_settings.cheats_enabled ^= 1; change = 1; - } else if (sel == 7) { - controls_process(); redraw = 1; sound = MENU_SND_SELECT; - } else if (sel == 8) { - about_process(); redraw = 1; sound = MENU_SND_SELECT; - } - } - if (change) { - /* Настройки работают сразу, а запись откладывается до выхода. */ - pop_settings_apply(1); - changed = 1; - redraw = 1; - sound = MENU_SND_CHANGE; - } - up_prev = up; down_prev = down; left_prev = left; right_prev = right; - esc_prev = esc; ent_prev = ent; - if (redraw) { - settings_draw(sel); - menu_sound(sound); - } - ui_wait_frame(); - } -} - -static int8_t menu_quickload(void) -{ - uint8_t slots; - /* probe — это только open/close на D:, данных не читает; глушить насос - * ради него незачем (см. settings_finish). */ - slots = pop_qsave_probe(); - if (slots & POP_QS_SLOT_SAVE) return POP_MENU_QUICKLOAD; - if ((slots & POP_QS_SLOT_BACKUP) && ui_confirm("LOAD BACKUP?")) - return POP_MENU_QUICKLOAD_BACKUP; - if (!(slots & POP_QS_SLOT_BACKUP)) ui_notice("NO QUICKLOAD"); - return POP_MENU_NONE; -} - -/* Вернуть чистую сцену на ОБЕ страницы и показать ту, которая была до - * меню. Это важно и для отладочного single-buffer: главный цикл там - * ожидает страницу 0, а не ту, в которую меню сделало последний флип. */ -static void menu_erase(uint8_t entry_page) -{ - gfx_rect_t full; - uint8_t visible = gfx_get_visible_page(); - uint8_t hidden = (uint8_t)(visible ^ 1); - - full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; - - /* Из shadow видимой страницы берём кадр без текстов. */ - gfx_set_draw_page(hidden); - gfx_copy_page(&full, GFX_COPY_DIRECT); - ui_wait_frame(); - gfx_set_visible_page(hidden); - - /* Теперь чистая hidden — источник для второй страницы. */ - gfx_set_draw_page(visible); - gfx_copy_page(&full, GFX_COPY_DIRECT); - if (entry_page != hidden) { - ui_wait_frame(); - gfx_set_visible_page(entry_page); - } -} - - -int pop_menu_init(void) __banked -{ - return pop_ui_init(); -} - -void pop_menu_free(void) __banked -{ - pop_ui_free(); -} - -int8_t pop_menu_process(void) __banked -{ - uint8_t sel = 0; - uint8_t up_prev = 0, down_prev = 0, esc_prev = 0, ent_prev = 0; - uint8_t entry_page, saved_page, saved_bank; - uint8_t exit_sound = MENU_SND_NONE; - struct fillsettingstype saved_fill; - int8_t result = POP_MENU_NONE; - - if (!pop_menu_request) return POP_MENU_NONE; - pop_menu_request = 0; - if (!pop_ui_ready()) return POP_MENU_RESUME; - - /* Открыли по НАЖАТИЮ Esc: дождаться отпускания, иначе то же нажатие - * закроет меню раньше первого кадра. pop_wait_edge опрашивает FIFO. */ - while (kbd_raw_down(KBD_ESC)) ui_wait_frame(); - - entry_page = gfx_get_visible_page(); - saved_page = gfx_get_draw_page(); - saved_bank = gfx_get_bank(); - getfillsettings(&saved_fill); - /* Звук НЕ глушим (снято 2026-08-28, вторая половина той же заплатки — - * см. ui_begin). Здесь под ней были снимок палитры, затемнение фона и - * первая полная перерисовка: копия режет DI бандами по 16 строк, а - * палитровое затемнение идёт и в титрах с катсценами, где музыку оно не - * рвёт. Цена глушения была слышна как пауза в мелодии ровно на - * появление меню. */ - pop_pal_snapshot(); - /* 50 % яркости; диапазон UI остаётся ярким. Долю берём от шкалы, а не - * числом: ступеней стало 32 вместо четырёх, и прежняя «2» означала бы - * теперь затемнение на одну шестнадцатую — фон под меню почти не гас - * (поймано пользователем 2026-08-26). */ - pop_pal_menu_dim(POP_PAL_DIM_BLACK / 2); - menu_draw(sel); - - for (;;) { - uint8_t up = kbd_raw_down(KBD_UP); - uint8_t down = kbd_raw_down(KBD_DOWN); - uint8_t esc = kbd_raw_down(KBD_ESC); - uint8_t ent = ui_action_down(); - uint8_t redraw = 0; - uint8_t sound = MENU_SND_NONE; - - if (up && !up_prev) { - sel = (uint8_t)(sel ? sel - 1 : MENU_N_ITEMS - 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (down && !down_prev) { - sel = (uint8_t)(sel == MENU_N_ITEMS - 1 ? 0 : sel + 1); - redraw = 1; sound = MENU_SND_MOVE; - } - if (esc && !esc_prev) { - result = POP_MENU_RESUME; - break; - } - if (ent && !ent_prev && menu_cmds[sel] != POP_MENU_NONE) { - uint8_t cmd = menu_cmds[sel]; - if (cmd == POP_MENU_SETTINGS) { - (void)settings_process(); - redraw = 1; sound = MENU_SND_SELECT; /* Back -> pause menu */ - } else if (cmd == POP_MENU_QUICKLOAD) { - result = menu_quickload(); - if (result != POP_MENU_NONE) { exit_sound = MENU_SND_SELECT; break; } - redraw = 1; sound = MENU_SND_SELECT; - } else if (cmd == POP_MENU_QUIT) { - if (ui_confirm("QUIT GAME?")) { - result = POP_MENU_QUIT; - exit_sound = MENU_SND_SELECT; - break; - } - redraw = 1; sound = MENU_SND_SELECT; - } else { - result = (int8_t)cmd; - exit_sound = MENU_SND_SELECT; - break; - } - } - up_prev = up; down_prev = down; esc_prev = esc; ent_prev = ent; - - if (redraw) { - menu_draw(sel); - menu_sound(sound); - } - ui_wait_frame(); - pop_pace_end(pop_pace_n(0)); /* игра стоит — обычный темп */ - } - - /* И на закрытии не глушим: menu_erase — те же две полностраничные - * копии, что и в ui_begin, с DI бандами по 16 строк. */ - menu_erase(entry_page); - /* menu_erase вернул обе страницы из тени, снятой ДО меню: всё, что - * статус-полосы нарисовали за это время (или сообщение, дотикавшее в - * паузе), надо выложить заново. */ - pop_status_invalidate(); - pop_pal_apply(0); - setfillstyle(saved_fill.pattern, saved_fill.color); - gfx_set_bank(saved_bank); - gfx_set_draw_page(saved_page); - (void)pop_sfx_start(); - menu_sound(exit_sound); /* Esc main menu остаётся бесшумным */ - return result; -} diff --git a/applications/SprPoP/src/pop_menu.h b/applications/SprPoP/src/pop_menu.h deleted file mode 100644 index 18efe13..0000000 --- a/applications/SprPoP/src/pop_menu.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * pop_menu.h — контракт pause menu (план docs/menu_settings_plan.md §10.3, - * этап MS0). - * - * UI НЕ вызывает gameplay-модули напрямую: меню формирует КОМАНДУ, а - * исполнение остаётся в главном цикле (sprpop.c). Вся работа с меню — - * код, шрифты и таблицы строк — живёт в БАНКЕ 9. Флаг запроса принадлежит - * главному циклу (W2): это единственная резидентная граница UI. - */ -#ifndef POP_MENU_H -#define POP_MENU_H - -#include - -typedef enum { - POP_MENU_NONE = 0, /* меню не открывалось / пункт-заглушка */ - POP_MENU_RESUME, /* закрыть меню, продолжить игру */ - POP_MENU_QUICKSAVE, /* то же, что F6 */ - POP_MENU_QUICKLOAD, /* то же, что F9 */ - POP_MENU_RESTART_LEVEL, /* штатный reset текущего уровня (без CFG) */ - POP_MENU_RESTART_GAME, /* новая игра с уровня 1, настройки и SAV */ - POP_MENU_QUIT, /* выход из программы (после подтверждения) */ - POP_MENU_QUICKLOAD_BACKUP, /* загрузить подтверждённый POP.BAK */ - POP_MENU_SETTINGS /* внутренний экран Settings (не возвращается) */ -} pop_menu_cmd_t; - -/* Флаг запроса в sprpop.c (W2); банк читает напрямую. */ -extern uint8_t pop_menu_request; - -/* Загрузить/освободить EMM-атлас исходных шрифтов SDLPoP. Вызывается из - * холодного boot/shutdown, не из кадрового пути. */ -int pop_menu_init(void) __banked; -void pop_menu_free(void) __banked; - -/* Граница кадра. Запроса нет — мгновенный POP_MENU_NONE. Меню МОДАЛЬНО: - * пока открыто, не возвращается (игра стоит — логика, таймер и звуковой - * насос главного цикла просто не выполняются); по выбору пользователя - * отдаёт pop_menu_cmd_t. */ -int8_t pop_menu_process(void) __banked; - -/* Экран Sprinter build, если он включён в POP.CFG. Вызывается после - * открытия raw-клавиатуры и до первого игрового кадра. */ - -#endif diff --git a/applications/SprPoP/src/pop_music.c b/applications/SprPoP/src/pop_music.c deleted file mode 100644 index 8e3718f..0000000 --- a/applications/SprPoP/src/pop_music.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * pop_music.c — загрузка и запуск музыкального трека, БАНК 9. - * - * Здесь только холодная часть: выделить страницы EMM, вычитать в них куски - * m_.bin и выставить курсор. Сам вывод делает насос CBL в - * резиденте (pop_sfx.c): когда эффект не звучит, он берёт байты отсюда, а - * не из блока тишины. Контракт и мотивация — в pop_music.h. - * - * Имя файла собираем вручную, без sprintf: printf-семейство в резидент не - * тянем, а тут и формат-то из двух чисел. - */ -#include -#include -#include -#include -#include -#include /* gfx_w0_map/unmap — доступ к странице индекса */ -#include "pop_music.h" -#include "pop_sfx.h" -#include "_pop_sfx.h" /* pop_snd_ok — открыт ли вывод (см. pop_music_busy) */ -#include "pop_app.h" /* POP_APP_DEMO — в демке музыки нет */ -#include "_pop_file.h" - -uint8_t pop_mus_page[POP_MUS_PAGES]; - -/* --- ИНДЕКС НАБОРА ---------------------------------------------------- * - * - * Страница EMM с прочитанным mus.idx; 0 — индекса нет. В W2 от него - * остаются ровно эти два байта, сама таблица (228 Б) лежит в странице. - * - * Данные лежат со смещения POP_MUS_IDX_BASE, а не с начала страницы: - * gfx_w0_page_prepare пишет туда стабы прерываний (0x38 и 0x66), и с - * нуля они попали бы прямо в записи. Со смещением всё расходится, и - * страница подключается штатно — без запрета прерываний. */ -static uint8_t mus_idx_blk; -static uint8_t mus_idx_page; - -/* "MUS\mus.idx" — имя знает сам модуль (тот же приём, что в pop_arc.c: - * литерал лежит в rodata банка 9, и open() читает его, пока в W3 стоит - * этот банк). */ -static const char mus_idx_path[] = "MUS\\mus.idx"; - -int8_t pop_music_index_load(void) __banked -{ - uint8_t *w0 = (uint8_t *)POP_MUS_IDX_BASE; - uint8_t blk, page, ok; - int fd; - - if (mus_idx_page) return 0; - POP_PATH_CALL(fd, open(mus_idx_path, O_RDONLY)); - if (fd < 0) return -1; - blk = mem_alloc_pages(1); - if (!blk) { close(fd); return -1; } - page = mem_get_page(blk, 0); - if (!page || - bank_read_page(fd, page, POP_MUS_IDX_BASE, POP_MUS_IDX_SIZE) < 0) { - close(fd); - mem_free_block(blk); - return -1; - } - close(fd); - gfx_w0_page_prepare(page); /* стабы лягут вне данных, см. BASE */ - gfx_w0_map(page); - ok = (uint8_t)(memcmp(w0, "PMI1", 4) == 0 && - w0[4] == POP_MUS_COUNT && - w0[5] == POP_MUS_IDX_REC && - w0[6] == 7 && /* log2(128) — блок насоса */ - w0[7] == 1); /* u8 mono, CBL_FREQ_10K9 */ - gfx_w0_unmap(); - if (!ok) { mem_free_block(blk); return -1; } - mus_idx_blk = blk; - mus_idx_page = page; - return 0; -} - -int8_t pop_music_info(uint8_t id, pop_mus_info_t *out) __banked -{ - const uint8_t *rec; - const uint8_t *w0 = (const uint8_t *)POP_MUS_IDX_BASE; - - out->blocks = 0; - out->ticks = 0; - if (!mus_idx_page || id >= POP_MUS_COUNT) return -1; - gfx_w0_map(mus_idx_page); - rec = w0 + POP_MUS_IDX_HDR + (uint16_t)id * POP_MUS_IDX_REC; - out->blocks = (uint16_t)(rec[0] | ((uint16_t)rec[1] << 8)); - out->ticks = (uint16_t)(rec[2] | ((uint16_t)rec[3] << 8)); - gfx_w0_unmap(); - return out->blocks ? 0 : -1; -} - -/* Два слота: играющий и подгружаемый. Своей таблицы страниц слот НЕ - * держит — её и так хранит блок EMM, и mem_get_page отдаёт номер по - * индексу. Резидентный pop_mus_page[] заполняется на pop_music_play, для - * одного слота: 40 байт W2 у игры лишних нет. */ -#define MUS_SLOTS 2 -static uint8_t slot_blk[MUS_SLOTS]; /* блок EMM, 0 — слот пуст */ -static uint8_t slot_pages[MUS_SLOTS]; -static uint16_t slot_blocks[MUS_SLOTS]; -static uint8_t slot_id[MUS_SLOTS]; -static uint8_t mus_cur; /* слот, что играет/играл */ -static uint8_t mus_ready; /* слот+1, готовый к запуску */ - -/* "MUS\mNN.bin" — ровно 8.3, как требует DSS. */ -static void mus_name(char *buf, uint8_t id) -{ - buf[0] = 'M'; buf[1] = 'U'; buf[2] = 'S'; buf[3] = '\\'; - buf[4] = 'm'; - buf[5] = (char)('0' + id / 10); - buf[6] = (char)('0' + id % 10); - buf[7] = '.'; buf[8] = 'b'; buf[9] = 'i'; buf[10] = 'n'; - buf[11] = 0; -} - -/* ld_busy отдельно от ld_fd: инициализаторов у статиков в банке нет - * (crt0 зануляет _DATA), а «нет открытого файла» — это не ноль. */ -static uint8_t ld_busy; -static int ld_fd; -static uint8_t ld_slot; -static uint8_t ld_next; /* следующая страница к чтению */ -static uint8_t ld_half; /* 0 = впереди первая половина страницы */ -static uint8_t ld_pages; -static uint8_t ld_id; -/* Длина трека из индекса, снятая при открытии: лезть в страницу индекса - * на каждом шаге загрузки незачем — она не меняется. */ -static uint16_t ld_blocks; - -static void slot_release(uint8_t n) -{ - if (slot_blk[n]) { - mem_free_block(slot_blk[n]); - slot_blk[n] = 0; - } - slot_pages[n] = 0; - slot_blocks[n] = 0; -} - -/* --- ПОТОКОВЫЙ ТРЕК: КОЛЬЦО СТРАНИЦ ---------------------------------- * - * - * Финальная тема (`won`, 115 с) — это 1,2 МБ и 78 страниц EMM. Держать её - * в памяти нельзя ни при каком бюджете, поэтому она играется из НЕСКОЛЬКИХ - * страниц по кругу: насос идёт по кольцу (pop_mus_ring), а загрузчик - * дочитывает файл в те страницы, которые насос уже прошёл. - * - * Кто кого догоняет. Страница звучит 1,5 с, а читается 33 мс — запас - * сорокакратный, так что «не успеть» можно только застряв на секунду. - * Дистанцию считаем без отдельных счётчиков: страница ровно 128 блоков - * насоса, поэтому проигранных страниц = (всего блоков - осталось) / 128. - * Пока прочитано меньше, чем проиграно плюс размер кольца, — в кольце есть - * свободный слот, и следующую страницу можно читать. - * - * Файл читаем ПОСЛЕДОВАТЕЛЬНО, без lseek: страницы идут по порядку, и fd - * сам стоит там, где надо. */ -#define RING_PAGES 6 /* 96 КБ = 9 с звучания, запас с лихвой */ - -static uint8_t ring_on; /* идёт потоковый трек */ -static uint8_t ring_blk; /* EMM-блок кольца */ -static uint8_t ring_fd_open; -static int ring_fd; -static uint8_t ring_file_pages; /* страниц в файле */ -static uint8_t ring_loaded; /* сколько уже прочитано */ -static uint16_t ring_total; /* длина трека в блоках насоса */ - -void pop_music_ring_stop(void) __banked; - -void pop_music_stop(void) __banked -{ - pop_mus_left = 0; -} - -void pop_music_free(void) __banked -{ - if (ring_on) pop_music_ring_stop(); - if (ld_busy) { close(ld_fd); ld_busy = 0; } - pop_mus_left = 0; - slot_release(0); - slot_release(1); - mus_ready = 0; -} - -/* --- загрузка --------------------------------------------------------- - * - * ПОСТРАНИЧНО, А НЕ ЦЕЛИКОМ. Реплики сцены с принцессой идут встык, и - * следующую надо читать, пока звучит текущая. Трек — до 320 КБ, целиком - * это 0,7 с диска: на 7,5 кадрах в секунду сцена встала бы на пять кадров. - * Шаг стоит 16 мс (полстраницы, см. pop_music_load_step) — меньше одного - * кадрового интервала, и подкачка растворяется в анимации. Кто может позволить себе паузу (титры, чёрный экран - * между сценами), зовёт pop_music_load — тот же цикл, но целиком. */ -static void load_abort(void) -{ - if (ld_busy) close(ld_fd); - ld_busy = 0; - ld_half = 0; - slot_release(ld_slot); -} - -int8_t pop_music_load_begin(uint8_t id) __banked -{ - char name[12]; - pop_mus_info_t info; - uint8_t pages, n; - - if (ring_on) pop_music_ring_stop(); /* потоковый трек и слоты не дружат */ - if (ld_busy) load_abort(); - if (id >= POP_MUS_COUNT) return -1; - /* Длину и число страниц знает ИНДЕКС НАБОРА, а не EXE: у mt32 те же - * треки другой длины (docs/music_runtime_index_plan.md). */ - if (pop_music_info(id, &info) != 0) return -1; - pages = pop_music_pages(info.blocks); - if (pages > POP_MUS_PAGES) return -1; - - /* Грузим ВСЕГДА в не текущий слот: играющий трек читает свои страницы - * из прерывания, и отобрать их у него нельзя. */ - n = (uint8_t)(mus_cur ^ 1); - slot_release(n); - mus_name(name, id); - /* Трек лежит ОДНИМ файлом, и fd остаётся открытым до последней - * страницы: `open` стоит дороже самого чтения (51,4 мс против 32,6 мс - * на 16 КБ), и платить его на каждую страницу — чистые потери. */ - POP_PATH_CALL(ld_fd, open(name, O_RDONLY)); - if (ld_fd < 0) return -1; - slot_blk[n] = mem_alloc_pages(pages); - if (!slot_blk[n]) { close(ld_fd); return -1; } - ld_busy = 1; - ld_slot = n; - ld_next = 0; - ld_half = 0; - ld_pages = pages; - ld_id = id; - ld_blocks = info.blocks; - return 0; -} - -/* ШАГ = ПОЛСТРАНИЦЫ (8 КБ, ~16 мс), а не страница (~33 мс). - * - * Шаг вызывают раз в кадр из циклов, где кадр разложен на блоки по одному - * кадровому интервалу (20 мс): катсцены после перехода на блочную - * отрисовку, см. pop_intro.c/pv_restore_bg. Целая страница в интервал не - * влезала и незаметно растягивала кадр сцены; половина влезает, а цена — - * вдвое больше вызовов (11 страниц реплики = 22 кадра вместо 11, то есть - * меньше полусекунды). Игровому циклу это безразлично: там логический - * кадр 80-100 мс. */ -int8_t pop_music_load_step(void) __banked -{ - uint8_t p; - - if (!ld_busy) return 1; /* нечего грузить */ - p = mem_get_page(slot_blk[ld_slot], ld_next); - /* Последняя страница короче — читаем сколько есть (вторая половина - * может дать и ноль байт); ошибку ловим по отрицательному коду. */ - if (!p || bank_read_page(ld_fd, p, ld_half ? 8192 : 0, 8192) < 0) { - load_abort(); - return -1; - } - if (!ld_half) { ld_half = 1; return 0; } /* дочитаем в следующий раз */ - ld_half = 0; - if (++ld_next < ld_pages) return 0; - - close(ld_fd); - ld_busy = 0; - slot_pages[ld_slot] = ld_pages; - slot_blocks[ld_slot] = ld_blocks; - slot_id[ld_slot] = ld_id; - mus_ready = (uint8_t)(ld_slot + 1); - return 1; -} - -uint8_t pop_music_loading(void) __banked -{ - return ld_busy; -} - -int8_t pop_music_load(uint8_t id) __banked -{ - int8_t r; - - if (pop_music_load_begin(id) != 0) return -1; - do { - r = pop_music_load_step(); - } while (r == 0); - return (r < 0) ? -1 : 0; -} - -/* ЗАПУСК С ПОДКАЧКОЙ НА ХОДУ — для игровых джинглов (смерть, зелья, меч). - * Ждать полной загрузки нельзя: это фриз на треть секунды посреди игры. - * Зато можно начать сразу после ПЕРВОЙ страницы: она звучит 1,5 с, а - * следующая читается 33 мс — запас сорокакратный. Дальше вызывающий - * доливает по странице за кадр (pop_music_load_step, pop_music_loading). - * - * Номера страниц известны сразу после mem_alloc_pages, поэтому таблицу для - * насоса заполняем целиком: данные в этих страницах появятся раньше, чем - * он до них доберётся. - * 0 — играет, -1 — трека нет или память кончилась. */ -int8_t pop_music_stream(uint8_t id) __banked -{ - uint8_t i, n; - - if (ring_on) pop_music_ring_stop(); /* см. pop_music_play */ - if (pop_music_load_begin(id) != 0) return -1; - if (pop_music_load_step() < 0) return -1; /* первая страница */ - n = ld_slot; - pop_mus_left = 0; /* насос — на тишину */ - for (i = 0; i < ld_pages; i++) - pop_mus_page[i] = mem_get_page(slot_blk[n], i); - if (n != mus_cur) slot_release(mus_cur); - mus_cur = n; - slot_pages[n] = ld_pages; - slot_blocks[n] = ld_blocks; - slot_id[n] = id; - pop_mus_id = id; - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_left = slot_blocks[n]; - return 0; -} - -void pop_music_play(void) __banked -{ - uint8_t n, i; - - if (!mus_ready) return; - /* СНЯТЬ КОЛЬЦО. Если до этого играл потоковый трек (финал), насос всё - * ещё заворачивал бы страницы по кругу шести — обычный трек звучал бы - * своей первой третью без конца (поймано на титрах после победы). */ - if (ring_on) pop_music_ring_stop(); - n = (uint8_t)(mus_ready - 1); - /* Насос обязан замолчать ДО подмены таблицы страниц: иначе он успеет - * взять порцию по новому индексу из старого курсора. */ - pop_mus_left = 0; - for (i = 0; i < slot_pages[n]; i++) - pop_mus_page[i] = mem_get_page(slot_blk[n], i); - if (n != mus_cur) slot_release(mus_cur); - mus_cur = n; - mus_ready = 0; - /* Порядок важен: сначала позиция, потом длина. Насос стартует ровно - * с той порции, где left стал ненулевым, и промежуточное состояние - * «играем, но курсор от прошлого трека» не возникает. */ - pop_mus_id = slot_id[n]; /* до left: менеджер спросит готовое */ - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_left = slot_blocks[n]; -} - - -static void ring_close_file(void) -{ - if (ring_fd_open) { close(ring_fd); ring_fd_open = 0; } -} - -void pop_music_ring_stop(void) __banked -{ - pop_mus_left = 0; - pop_mus_ring = 0; - ring_close_file(); - if (ring_blk) { mem_free_block(ring_blk); ring_blk = 0; } - ring_on = 0; -} - -int8_t pop_music_ring_start(uint8_t id) __banked -{ - char name[12]; - pop_mus_info_t info; - uint8_t i, page; - - if (id >= POP_MUS_COUNT || pop_music_info(id, &info) != 0) return -1; - /* Потоковый трек НЕ ограничен POP_MUS_PAGES: он и не помещается в - * память целиком, ради того и кольцо. Предел здесь — восьмибитные - * счётчики страниц (у mt32 финальная тема на 82 страницы против 78 - * у flac). */ - if (pop_music_pages(info.blocks) > 255) return -1; - pop_music_free(); /* обычные слоты кольцу не нужны */ - pop_music_ring_stop(); - mus_name(name, id); - POP_PATH_CALL(ring_fd, open(name, O_RDONLY)); - if (ring_fd < 0) return -1; - ring_fd_open = 1; - ring_blk = mem_alloc_pages(RING_PAGES); - if (!ring_blk) { ring_close_file(); return -1; } - ring_file_pages = (uint8_t)pop_music_pages(info.blocks); - ring_total = info.blocks; - /* Заполняем кольцо целиком: старт с полным буфером даёт девять секунд - * форы, и первая же тяжёлая сцена финала не догонит насос. */ - for (i = 0; i < RING_PAGES; i++) { - page = mem_get_page(ring_blk, i); - pop_mus_page[i] = page; - if (!page || - (i < ring_file_pages && bank_read_page(ring_fd, page, 0, 16384) < 0)) { - pop_music_ring_stop(); - return -1; - } - } - ring_loaded = (uint8_t)(ring_file_pages < RING_PAGES ? ring_file_pages - : RING_PAGES); - if (ring_loaded >= ring_file_pages) ring_close_file(); - ring_on = 1; - pop_mus_id = id; - pop_mus_pg = 0; - pop_mus_ptr = 0; - pop_mus_ring = RING_PAGES; /* насос пойдёт по кругу */ - pop_mus_left = ring_total; - return 0; -} - -/* Один шаг подкачки: страница файла в слот, который насос уже прошёл. */ -static void ring_step(void) -{ - uint16_t played; - uint8_t played_pg, page; - - if (!ring_on) return; - if (!pop_mus_left) { /* трек доиграл — отпустить память */ - pop_music_ring_stop(); - return; - } - if (ring_loaded >= ring_file_pages) return; /* файл прочитан весь */ - played = (uint16_t)(ring_total - pop_mus_left); - played_pg = (uint8_t)(played >> 7); /* 128 блоков на страницу */ - if ((uint8_t)(ring_loaded - played_pg) >= RING_PAGES) return; /* полно */ - page = pop_mus_page[ring_loaded % RING_PAGES]; - if (!page || bank_read_page(ring_fd, page, 0, 16384) < 0) { - pop_music_ring_stop(); - return; - } - ring_loaded++; - if (ring_loaded >= ring_file_pages) ring_close_file(); -} - -void pop_music_service(void) __banked -{ - /* Один вызов на кадр из ЛЮБОГО цикла — игрового, интро, катсцены. - * Заявку кладёт pop_sfx_play (звук без оцифровки = музыка оригинала), - * а диск трогаем только здесь. */ - /* В ЗАСТАВОЧНОЙ ДЕМКЕ МУЗЫКИ НЕТ. Точечные условия оригинала (смерть, - * убитый страж) расставлены по своим местам, но гейт нужен и общий: - * демо проигрывает записанные нажатия, и любой музыкальный повод — - * подобранный меч, зелье — зазвучал бы там, где оригинал играет одни - * эффекты. */ - if (ring_on) { ring_step(); return; } /* потоковый трек — свой путь */ - if (!pop_mus_want || pop_app_state == POP_APP_DEMO) { - /* Выключили на ходу: оборвать поток и замолчать. Эффекты при этом - * продолжают звучать — у них свой тумблер. */ - if (pop_mus_req) pop_mus_req = 0; - if (ld_busy || pop_mus_left) pop_music_free(); - return; - } - if (pop_mus_req) { - uint8_t id = pop_mus_req; - - pop_mus_req = 0; - (void)pop_music_stream(id); - } else if (ld_busy) { - (void)pop_music_load_step(); - } -} - -uint8_t pop_music_busy(void) __banked -{ - /* «ЗВУЧИТ», А НЕ «ЕСТЬ КУРСОР». Курсор трека двигает насос CBL, и пока - * вывод закрыт (pop_sfx_pause на загрузке уровня, Ctrl+S, показ заставки - * после Restart Game) pop_mus_left не убывает НИКОГДА. Вызывающий, - * который ждёт конца мелодии, в этом состоянии висит вечно — ровно так - * заставка после Restart Game вставала на экране Prince of Persia - * (поймано пользователем 2026-09-02). Корень того случая был в другом - * (CBL не открывался заново, см. pop_boot_sound), но ждать неиграющую - * музыку нельзя в принципе, поэтому признак спрашивает и про вывод. */ - return (uint8_t)(pop_snd_ok && pop_mus_left != 0); -} - -/* ТРЕК В РАБОТЕ — заявка лежит, идёт загрузка или он звучит. - * - * Одного pop_music_busy() там, где ждут КОНЦА мелодии, мало: между - * заявкой (pop_sfx_play кладёт pop_mus_req) и первым звуком проходит - * 190-230 мс — открытие файла и чтение первой полустраницы (замер и - * разбор — docs/sound_plan.md §9). В этой щели busy ещё ложен, и - * ожидание закончилось бы, не начавшись. - * - * Три признака подряд закрывают её без единой подобранной константы: - * pop_music_service обнуляет req и тут же взводит ld_busy в load_begin, - * а тот держится до самой записи pop_mus_left. Снаружи переход - * «запрошен -> грузится -> звучит» непрерывен, потому что между этими - * операторами главный цикл не выполняется. - * - * И наоборот: если трека нет или память кончилась, все три ложны сразу — - * ждать нечего, как и должно быть. */ -uint8_t pop_music_active(void) __banked -{ - return (uint8_t)(pop_mus_req || ld_busy || pop_mus_left); -} diff --git a/applications/SprPoP/src/pop_music.h b/applications/SprPoP/src/pop_music.h deleted file mode 100644 index 9a63c6d..0000000 --- a/applications/SprPoP/src/pop_music.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * pop_music.h — музыкальный трек через тот же CBL, что и эффекты. - * - * ПОЧЕМУ PCM, А НЕ AY. Оцифровки музыки в игре нет вовсе: digisnd*.dat - * содержит только эффекты, музыка лежит MIDI под Adlib. Зато есть готовые - * записи DOS-версии, и путь «запись -> сырой поток CBL» не требует ни - * синтезатора на хосте, ни аранжировки под три канала AY (разбор вариантов - * — ../docs/sound_plan.md §1). Плата известна: CBL один, поэтому пока - * играет музыка, эффектов нет. Оригинал ведёт себя так же — play_sound - * там глушит предыдущий звук. - * - * ГДЕ УМЕСТНО. Заставки и титры: эффектов там не бывает, картинка - * статична, и загрузка сотни-другой килобайт с диска никому не мешает. - * Музыка ПО ХОДУ игры (джинглы смерти, зелья) — отдельный вопрос, её - * придётся либо гасить эффектами, либо уводить на AY. - * - * ФОРМАТ на диске — один файл MUS\m.bin на трек, читается порциями по - * 16 КБ из одного открытого fd (bank_read_page). Каталог с длинами - * генерирует toolchain/pop_pack_music.py в pop_music_tbl.h. - */ -#ifndef POP_MUSIC_H -#define POP_MUSIC_H - -#include - -/* Сколько страниц EMM держим под трек. Двадцать = 320 КБ, это все - * заставочные треки, кроме финального «won» (115 с, 1,2 МБ): тот придётся - * либо резать, либо стримить, и это отдельная задача. */ -#define POP_MUS_PAGES 20 - -/* --- ИНДЕКС НАБОРА (MUS/mus.idx, формат PMI1) ------------------------- * - * - * Длины треков и длительности реплик приезжают С ДИСКА, а не из EXE: так - * набор записей (flac/mp3/ogg/mt32) меняется без перекомпиляции игры. - * Формат пишет tools/pop_idx.py, он же покрыт make test-tools. - * - * Индекс живёт в ОДНОЙ странице EMM, а не в W2: таблица на 57 записей — - * 228 байт, а свободной кучи в резиденте порядка двух сотен. Наружу - * указатель на EMM не выдаётся: pop_music_info копирует запись в буфер - * вызывающего, на короткое время подключая страницу в W0. */ -#define POP_MUS_COUNT 57 /* пространство id оригинала, 0..56 */ -#define POP_MUS_IDX_REC 4 /* blocks (u16) + ticks60 (u16) */ -#define POP_MUS_IDX_HDR 16 -#define POP_MUS_IDX_SIZE 512 /* сектор DSS */ -/* Индекс кладётся в страницу СО СМЕЩЕНИЯ 0x100, а не с нуля. Причина в - * gfx_w0_page_prepare: он делает страницу безопасной в W0, записывая в - * неё переход на IRQ-восстановитель (0x38) и RETN для NMI (0x66). С - * нуля эти байты легли бы прямо в записи (id 10 и 21) и испортили - * индекс; со смещением 0x100 стабы и данные не пересекаются, и работает - * штатная защита от прерываний, а не запрет их. Тот же приём и по той - * же причине — в pop_config.c (CFG_BASE). */ -#define POP_MUS_IDX_BASE 0x100 - -typedef struct { - uint16_t blocks; /* длина трека в порциях насоса по 128 байт */ - uint16_t ticks; /* та же длина в тиках сцены (60 Гц оригинала) */ -} pop_mus_info_t; - -/* Поднять индекс (один раз за запуск). 0 — ок, -1 — нет файла либо он - * не той версии; во втором случае музыки не будет, но игра работает. */ -int8_t pop_music_index_load(void) __banked; - -/* Запись трека в буфер вызывающего. -1 — индекса нет, id вне диапазона - * или трека нет в наборе (тогда поля нулевые). */ -int8_t pop_music_info(uint8_t id, pop_mus_info_t *out) __banked; - -/* Сколько EMM-страниц занимает трек такой длины. Считается, а НЕ хранится - * в индексе: дублирование однажды разъедется с blocks. */ -#define pop_music_pages(blocks) \ - (uint16_t)(((blocks) >> 7) + (((blocks) & 127) != 0)) - -/* Номера треков — нумерация оригинала (SDLPoP data/music/names.txt). */ -#define POP_MUS_INTRO 54 /* тема заставки, звучит на титрах */ -#define POP_MUS_STORY_1 55 /* «In the absence of the Sultan...» */ -#define POP_MUS_STORY_2 50 /* принцесса ждёт */ -#define POP_MUS_STORY_3 53 /* входит Джафар */ -#define POP_MUS_STORY_4 52 /* Джафар уходит */ -#define POP_MUS_WON 56 /* победа: 115 с, только потоком */ - -/* Курсор проигрывания — читает НАСОС (pop_sfx.c, резидент), пишет - * загрузчик. Отдельный от эффектов: они звучат поверх музыки, а не - * вместо неё, и у каждого свой источник. */ -extern uint8_t pop_mus_page[POP_MUS_PAGES]; /* физические страницы EMM */ -extern volatile uint8_t pop_mus_pg; /* индекс текущей страницы */ -extern volatile uint16_t pop_mus_ptr; /* адрес в окне W0 */ -extern volatile uint16_t pop_mus_left; /* порций до конца, 0 — молчим */ -/* Номер играющего трека (нумерация оригинала). Нужен менеджеру звука: - * музыка участвует в таблицах приоритета наравне с эффектами. */ -extern uint8_t pop_mus_id; -/* Размер кольца страниц для потокового трека; 0 — обычный режим. */ -extern uint8_t pop_mus_ring; - -/* ДВА СЛОТА. Заставочные сцены идут цепочкой треков (титры -> история -> - * PV из трёх реплик), и загрузка каждого — это полсекунды-секунда диска. - * Прятать её в паузу между репликами негде: пауз в оригинале нет, там - * следующая реплика начинается сразу. Поэтому слотов два: пока звучит - * один, следующий читается во второй, и переключение стоит копирования - * двадцати байт таблицы страниц. - * - * Загрузить трек в свободный слот (НЕ запускает; играющий трек не трогает). - * 0 — готово, -1 — нет трека/памяти/файла. */ -int8_t pop_music_load(uint8_t id) __banked; - -/* ТА ЖЕ ЗАГРУЗКА ПО ОДНОЙ СТРАНИЦЕ ЗА ВЫЗОВ — для тех, кому нельзя - * замереть на секунду: страница стоит 33 мс, то есть четверть кадра - * заставочной сцены, и подкачка следующей реплики не видна. - * begin — открыть файл и занять страницы (0 / -1); - * step — прочитать очередную: 0 — ещё есть, 1 — трек готов к play, - * -1 — ошибка (слот освобождён); - * loading — идёт ли чтение (звать step имеет смысл, пока 1). - * Оборвать начатое чтение можно pop_music_free. */ -int8_t pop_music_load_begin(uint8_t id) __banked; -int8_t pop_music_load_step(void) __banked; -uint8_t pop_music_loading(void) __banked; - -/* Отпустить ОБА слота. Останавливает проигрывание, если оно шло. */ -void pop_music_free(void) __banked; - -/* Пустить трек СРАЗУ, дочитывая его по ходу звучания: первая страница - * читается здесь (33 мс), остальные — вызывающим, по одной за кадр, пока - * pop_music_loading(). Для игровых джинглов, где паузы на диск быть не - * может. 0 — играет, -1 — трека нет либо не хватило памяти. */ -int8_t pop_music_stream(uint8_t id) __banked; - -/* Пустить последний загруженный трек с начала; слот предыдущего при этом - * освобождается. Без парного load ничего не делает. */ -void pop_music_play(void) __banked; -void pop_music_stop(void) __banked; - -/* ОБСЛУЖИВАНИЕ МУЗЫКИ — один вызов на кадр из любого цикла (игра, интро, - * катсцена): разбирает заявку pop_mus_req и доливает страницы начатого - * стрима. Всё чтение с диска живёт здесь. */ -void pop_music_service(void) __banked; - -/* ПОТОКОВЫЙ ТРЕК ИЗ КОЛЬЦА СТРАНИЦ — для того, что в память не влезает. - * Финал `won` весит 1,2 МБ (78 страниц); играется из шести по кругу, а - * дочитывает его pop_music_service, пока трек звучит. - * 0 — играет, -1 — нет файла/памяти. Останавливает pop_music_ring_stop - * (её же зовёт pop_music_free). */ -int8_t pop_music_ring_start(uint8_t id) __banked; -void pop_music_ring_stop(void) __banked; - -/* Трек ещё звучит? 0 — доиграл или не запускался. */ -uint8_t pop_music_busy(void) __banked; - -/* «Трек в работе»: заявка/загрузка/звучание. Для мест, где ждут КОНЦА - * мелодии, — busy там ложен в окне запуска (см. pop_music.c). */ -uint8_t pop_music_active(void) __banked; - -#endif /* POP_MUSIC_H */ diff --git a/applications/SprPoP/src/pop_pace.c b/applications/SprPoP/src/pop_pace.c deleted file mode 100644 index 3fd06ea..0000000 --- a/applications/SprPoP/src/pop_pace.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * pop_pace.c — фиксированный логический кадр по лучу. Зачем именно так, - * а не по счётчику кадровых прерываний — в шапке pop_pace.h (там же - * условие точности и замеры). - * - * Модуль НЕ банковый (EXTRA_SRCS): pop_beam_sample зовётся из банков - * рисования, а базовый код в W1 доступен им прямым call — трамплин на - * каждую выборку съел бы весь смысл. - */ - -#include -#include -#include -#include "pop_state.h" /* pop_idle — общий idle-хук */ -#include "pop_pace.h" - -uint8_t pop_speed_mode; /* crt0 зануляет _DATA → NORMAL */ -volatile uint8_t pop_frame_tick; - -/* Бит 5 порта 0xFE на прошлой выборке: 0 или 0x20. На виду у asm-тела. */ -uint8_t pop_beam_prev; - -static uint8_t pace_anchor; /* тик на начало текущего логического кадра */ -static uint8_t pace_ok; /* 0 — луч не работает, откат на gfx_wait_vsync */ - -/* ---- выборка луча --------------------------------------------------- * - * in a,(0xFE) кладёт A на старший байт адреса (выбор ряда клавиатуры) — - * биты 5/7 от него не зависят, так же читает и gfx_wait_vsync. - * Быстрый путь (состояние не изменилось) — 40 T + вызов. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e) __naked -{ - __asm - in a, (#0xFE) - and a, #0x20 - ld hl, #_pop_beam_prev - cp a, (hl) - ret Z ; состояние то же — выходим сразу - ld (hl), a - or a, a - ret NZ ; 0→1: вошли в бланк, это не граница - ld hl, #_pop_frame_tick - inc (hl) ; 1→0: vpos = 0, начало кадра - ret - __endasm; -} - -uint8_t pop_pace_arm(void) -{ - uint16_t tries; - uint8_t t0; - - /* Взводит cbl_mode (_cbl_port_ref) и заодно ставит нас на фронт. */ - gfx_wait_vsync(); - - /* Затравка beam_prev без ложного фронта: что бы луч ни показал сейчас, - * первая выборка либо совпадёт (ранний выход), либо запишет 0x20 и - * уйдёт по ветке «вошли в бланк». */ - pop_beam_prev = 0; - pop_beam_sample(); - - t0 = pop_frame_tick; - for (tries = 0; tries < 20000; tries++) { - pop_beam_sample(); - if ((uint8_t)(pop_frame_tick - t0) >= 2) { - pace_anchor = pop_frame_tick; - pace_ok = 1; - return 1; - } - } - pace_ok = 0; /* бит не шевелится — прежнее поведение */ - return 0; -} - -void pop_wait_edge(void) -{ - uint8_t t; - if (!pace_ok) { gfx_wait_vsync(); return; } - t = pop_frame_tick; - do { - pop_beam_sample(); - /* ТОТ ЖЕ ХУК, что висит на gfx_wait_vsync, а не голый kbd_raw_poll: - * кроме плотного опроса FIFO (KBD-1) он проверяет F10, и без этого - * выход из игры в геймплее не работал — пейсинг по лучу через - * gfx_wait_vsync не ходит. */ - pop_idle(); - } while (pop_frame_tick == t); -} - -void pop_pace_end(uint8_t n) -{ - if (!pace_ok) { /* откат: как было — добрать ожиданиями */ - while (--n) gfx_wait_vsync(); - return; - } - while ((uint8_t)(pop_frame_tick - pace_anchor) < n) - pop_wait_edge(); - pace_anchor = pop_frame_tick; /* якорь ПО ФАКТУ — фаза не копится */ -} - -uint8_t pop_pace_n(uint8_t fight) -{ - if (pop_speed_mode == POP_SPEED_NORMAL) return fight ? 5 : 4; - if (pop_speed_mode == POP_SPEED_FAST) return fight ? 4 : 3; - return 3; /* FASTEST: и вне боя, и в бою */ -} diff --git a/applications/SprPoP/src/pop_pace.h b/applications/SprPoP/src/pop_pace.h deleted file mode 100644 index 2daa201..0000000 --- a/applications/SprPoP/src/pop_pace.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * pop_pace.h — фиксированный логический кадр (frame pacing) по ЛУЧУ. - * - * Задача: период логического кадра = max(n, ceil(W)) вместо нынешнего - * ceil(W) + 2, где W — работа в растровых кадрах. Сегодня главный цикл - * ждёт три gfx_wait_vsync ПОСЛЕ отрисовки, поэтому реальный бюджет кадра - * — один растр (430 080 тактов), и превышение его на такт стоит целого - * лишнего растра. При n=3 бюджет становится 1 290 240. - * - * ПОЧЕМУ НЕ СЧЁТЧИК КАДРОВЫХ ПРЕРЫВАНИЙ (замеры 2026-08-19, MAME, полный - * разбор в docs/frame_pacing_plan.md). Импульс запроса кадрового - * прерывания живёт 32 такта неразогнанного клока = 9,14 мкс, а ядра - * акселератора держат di на весь чанк блита (~0,29 мс). Импульс, - * попавший в такое окно, теряется насовсем — ядро z80 уровневое, защёлки - * нет (то же и на настоящем Spectrum). Замерено: в сцене 11/15 теряется - * от 0 до 2,8 % прерываний в зависимости от ФАЗЫ рендера относительно - * луча, а на полной перерисовке комнаты — три подряд. Сейчас фаза - * плавает (период то 3 растра, то 4) и потери размазаны; при жёстком - * пейсинге фаза застынет, и сцена может залипнуть в плохой — это ровные - * −25 % скорости, невидимые в профиле тактов. - * - * ЧТО ВМЕСТО. Бит 5 порта 0xFE — это ЧТЕНИЕ ПОЛОЖЕНИЯ ЛУЧА (1, когда - * vpos >= 272; MAME sprinter.cpp kbd_fe_r), а не событие: ни импульса, - * ни очереди, ни защёлки. Такой сигнал невозможно потерять — можно - * только не посмотреть. Считаем фронты 1→0 (это vpos = 0, ровно тот же - * момент, которого ждёт gfx_wait_vsync) программно, выборкой из точек, - * которые код и так проходит. - * - * УСЛОВИЕ ТОЧНОСТИ — ОДНО: между соседними выборками должно проходить - * меньше 64 512 тактов (длина окна «бит 5 = 1»: 48 строк из 320). Тогда - * в каждый бланк попадает хотя бы одна выборка, а в промежуток между - * бланками (365 568 тактов) — тем более; значит каждый фронт засчитан - * ровно один раз. Двойной счёт невозможен: инкремент только на переходе, - * и beam_prev тут же обновляется. Условие не про нагрузку, не про di, - * не про прерывания и не про звук — только про зазор. - * - * Запас: самый длинный неделимый кусок без выборки — одно di-окно, то - * есть один вызов _bgi_blit_rows_raw, а он по контракту режется на чанки - * ≤16 строк. Даже если считать грубо — одна выборка на целый блит, а - * самый дорогой замеренный блит 32 073 такта — зазор вдвое меньше окна. - * - * ВАЖНО: бит 5 читается осмысленно ТОЛЬКО при включённом cbl_mode (в - * MAME `data &= ~0xa0` стоит внутри `if (cbl_mode())`, иначе бит выставлен - * в 1 намертво). Его лениво взводит сам gfx_wait_vsync через - * _cbl_port_ref, поэтому pop_pace_arm обязан один раз позвать - * gfx_wait_vsync и ПРОВЕРИТЬ, что фронты реально идут. - */ -#ifndef POP_PACE_H -#define POP_PACE_H - -#include - -/* Режимы скорости. Растровый кадр Sprinter — 20,48 мс (48,83 Гц). - * Оригинал (SDLPoP/src/seg003.c:363): base_speed 5 тиков при 60 Гц = - * 83,3 мс, fight_speed 6 = 100 мс. Условие боя у оригинала одно и - * буквальное — «у Кида ВЫНУТ МЕЧ» (Kid.sword == sword_2_drawn), не - * «идёт бой» и не «рядом страж»; проверяется в верху главного цикла. */ -/* Нумерация НЕ произвольная: 0 обязан быть дефолтом (crt0 зануляет _DATA), - * а обход по кругу инкрементом даёт ровно NORMAL -> FAST -> FASTEST. - * Заодно номер режима = число палочек в отладочной метке минус один. */ -#define POP_SPEED_NORMAL 0 /* 4/5 — 81,9 / 102,4 мс; повтор оригинала */ -#define POP_SPEED_FAST 1 /* 3/4 — 61,4 / 81,9 мс; бой как в оригинале */ -#define POP_SPEED_FASTEST 2 /* 3/3 — 61,4 мс; не успели — подтормаживаем */ -#define POP_SPEED_MODES 3 - -extern uint8_t pop_speed_mode; /* POP_SPEED_*; дефолт — NORMAL */ - -/* Клавиша смены режима по кругу (PS/2 set 2). P — свободна: заняты - * K/I/S/L/U/[/] (читы, pop_cheat.h) и +/- (обход комнат). */ -#define KBD_SPEED_MODE 0x4D /* P */ - -/* Делитель для текущего режима. fight = «у Кида вынут меч». */ -uint8_t pop_pace_n(uint8_t fight); -/* ЭТАЛОН ХОДА ЧАСОВ — делитель РЕЖИМА NORMAL для того же признака боя. - * Игровое время меряется им, а не фактическим темпом: иначе FAST/FASTEST - * ускоряли бы и часы (минута проходила за две трети минуты). При NORMAL - * фактический делитель равен эталону, поэтому его ход не меняется вовсе — - * включая замедление в бою, которое есть и в оригинале. */ -#define POP_PACE_BASE(fight) ((uint8_t)((fight) ? 5 : 4)) - -/* Счётчик кадров. volatile: его правит pop_beam_sample, а читают циклы - * ожидания — перечитывать обязаны каждый оборот. */ -extern volatile uint8_t pop_frame_tick; - -/* ВЫБОРКА ЛУЧА. Дёшево (~57 T с вызовом), не трогает bc/de/ix. - * Звать отовсюду, где иначе получился бы зазор длиннее 64 512 тактов: - * из обёрток рисования и с границ фаз. Модуль НЕ банковый, поэтому из - * банков зовётся прямым call, без трамплина. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e); - -/* Однократная подготовка: взвести cbl_mode, снять первое состояние бита - * и убедиться, что фронты идут. 0 — луч не работает (тогда пейсинг - * молча откатывается на прежнее поведение: n ожиданий gfx_wait_vsync). */ -uint8_t pop_pace_arm(void); - -/* Ждать ОДИН фронт луча. Внутри — тот же плотный опрос клавиатуры, что - * сейчас висит idle-хуком на gfx_wait_vsync (KBD-1: без опроса раз в - * ~0,5 мс теряются нажатия и залипают клавиши). */ -void pop_wait_edge(void); - -/* Добрать до n фронтов ОТ ЯКОРЯ и переставить якорь ПО ФАКТУ. - * Вызывающий обязан перед этим сделать хотя бы один pop_wait_edge() — - * на нём же и происходит своп страниц (tear-free). Якорь ставится - * по факту, а не anchor += n: догонять пропущенное время нельзя, иначе - * после тяжёлого кадра игра рванёт вперёд. */ -void pop_pace_end(uint8_t n); - -#endif diff --git a/applications/SprPoP/src/pop_pal.c b/applications/SprPoP/src/pop_pal.c deleted file mode 100644 index 8f7ec8d..0000000 --- a/applications/SprPoP/src/pop_pal.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * pop_pal.c — владелец порядка «load logical palette -> apply brightness». - * - * Снимок физически хранит pop_ui (в хвосте FONT.ATL), потому что только тот - * модуль владеет страницей шрифта. Здесь остаётся политика: kid.pal всегда - * дополняют живые слоты тайлсета и Тени, а file-load никогда не считается - * показом яркого кадра сам по себе. - */ -#include -#include -#include -#include "pop_bg.h" -#include "pop_shadow.h" -#include "pop_guard.h" -#include "pop_pal.h" -#include "pop_ui.h" /* POP_COL_OUTSIDE */ -#include "_pop_file.h" - -static void pal_file_load(const char *path) -{ - int rc; - POP_PATH_CALL(rc, gfx_pal_fload(0, path)); - gfx_pal_sync(); - pop_ui_palette_snapshot(); -} - -void pop_pal_black(void) __banked -{ - pop_ui_palette_black(); -} - -void pop_pal_snapshot(void) __banked -{ - pop_ui_palette_snapshot(); -} - -void pop_pal_apply(uint8_t fade) __banked -{ - pop_ui_palette_dim(fade, 0); -} - -void pop_pal_fade_out(uint8_t steps) __banked -{ - pop_ui_fade_out(steps); -} - -void pop_pal_fade_in(uint8_t steps) __banked -{ - pop_ui_fade_in(steps); -} - -uint8_t pop_pal_fade_out_skip(uint8_t steps) __banked -{ - return pop_ui_fade_out_skip(steps); -} - -uint8_t pop_pal_fade_in_skip(uint8_t steps) __banked -{ - return pop_ui_fade_in_skip(steps); -} - -/* Слот «вне игрового поля» (POP_COL_OUTSIDE) — всегда ЧЁРНЫЙ. - * - * Это ещё один ДИНАМИЧЕСКИЙ слот поверх файловой палитры: kid.pal содержит - * все 256 записей и кладёт в единицу свой цвет, а нам она нужна чёрной — - * иначе борта и полоса HP станут цветными. Ставим после каждого - * file-load, рядом с тайлсетом/Тенью/соперником (см. pop_pal_game_load). */ -void pop_pal_outside_apply(void) __banked -{ - gfx_pal_set(0, POP_COL_OUTSIDE, 0, 0, 0); - gfx_pal_set(1, POP_COL_OUTSIDE, 0, 0, 0); -} - -void pop_pal_flash_white(uint8_t on) __banked -{ - uint8_t color = on ? 255 : 0; - - gfx_pal_set(0, 0, color, color, color); - gfx_pal_set(1, 0, color, color, color); -} - -void pop_pal_menu_dim(uint8_t fade) __banked -{ - pop_ui_palette_dim(fade, 1); -} - -void pop_pal_game_load(void) __banked -{ - pal_file_load("KID\\kid.pal"); - /* kid.pal содержит все 256 записей и намеренно затирает эти три - * динамических диапазона (тайлсет, Тень, набор соперника). - * Восстановить их надо ДО snapshot. */ - pop_bg_pal_apply(); - pop_shadow_pal_apply(); - pop_guard_pal_apply(); - pop_pal_outside_apply(); - pop_ui_palette_snapshot(); -} - -void pop_pal_level_load(uint8_t full) __banked -{ - if (full) { - pop_pal_game_load(); - return; - } - /* При обычной границе уровня меняются только env/wall и набор соперника. */ - pop_bg_pal_apply(); - pop_guard_pal_apply(); - pop_pal_outside_apply(); - pop_ui_palette_snapshot(); -} - -void pop_pal_title_load(void) __banked -{ - pal_file_load("TITLE\\title.pal"); -} - -/* ЕДИНСТВЕННОЕ ОТЛИЧИЕ ФИНАЛА ОТ ИНТРО — цвет фона текстовой рамки. - * load_title_images(bgcolor) SDLPoP красит его в #100060 на титрах и в - * #800000 в end_sequence (seg001:586); у нас фон запечён отдельным - * индексом POP_PAL_STORY_BG именно ради этой подмены. Она делается ПОСЛЕ - * файла и до нового снимка — как тайлсет/Тень в pop_pal_game_load. */ -void pop_pal_story_load(uint8_t ending) __banked -{ - pal_file_load("PV\\story.pal"); - if (!ending) return; - gfx_pal_set(0, POP_PAL_STORY_BG, 0x80, 0, 0); - gfx_pal_set(1, POP_PAL_STORY_BG, 0x80, 0, 0); - pop_ui_palette_snapshot(); -} - -void pop_pal_pv_load(void) __banked -{ - pal_file_load("PV\\pv.pal"); -} diff --git a/applications/SprPoP/src/pop_pal.h b/applications/SprPoP/src/pop_pal.h deleted file mode 100644 index 2ef3968..0000000 --- a/applications/SprPoP/src/pop_pal.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * pop_pal.h — единый lifecycle палитры PoP, банк 10. - * - * Атласы запечены под фиксированные диапазоны: env/wall 0x50..0x6F, - * Kid 0x70..0x8F, страж 0x90..0x9F, Тень 0xA0..0xAF. Поэтому palette - * уровня нельзя «восстановить fade-ом» из старого снимка: сначала надо - * загрузить логический источник, затем только выбрать яркость apply/fade. - */ -#ifndef POP_PAL_H -#define POP_PAL_H - -#include - -/* Все 256 записей обеих графических страниц = чёрный; снимок не меняет. */ -void pop_pal_black(void) __banked; - -/* Логические источники палитры. Они обновляют снимок, но сами не выбирают - * яркость: caller обязан явно вызвать apply()/fade_in(). */ -void pop_pal_game_load(void) __banked; -void pop_pal_level_load(uint8_t full) __banked; -void pop_pal_title_load(void) __banked; -/* Фон текстовой рамки story лежит в отдельном индексе палитры: ending=1 - * красит его тёмно-красным (финал), 0 оставляет файловый тёмно-синий. */ -#define POP_PAL_STORY_BG 16 -void pop_pal_story_load(uint8_t ending) __banked; -void pop_pal_pv_load(void) __banked; - -/* Показ текущего снимка: 0 — исходная яркость, 4 — чёрный. */ -void pop_pal_snapshot(void) __banked; -void pop_pal_apply(uint8_t fade) __banked; -void pop_pal_fade_out(uint8_t steps) __banked; -void pop_pal_fade_in(uint8_t steps) __banked; -/* Прерываемые: заставка и катсцены. 1 — прервано новым нажатием. */ -uint8_t pop_pal_fade_out_skip(uint8_t steps) __banked; -uint8_t pop_pal_fade_in_skip(uint8_t steps) __banked; - -/* Слот POP_COL_OUTSIDE (всё вне игрового поля) — чёрным. Динамический - * слот: file-load палитры кладёт в него своё, поэтому доплачивается после - * каждого источника, как тайлсет/Тень/соперник. */ -void pop_pal_outside_apply(void) __banked; - -/* do_flash/remove_flash SDLPoP: меняется только нулевая запись обеих - * page-палитр, сама картинка и снимок логической палитры не затрагиваются. */ -void pop_pal_flash_white(uint8_t on) __banked; - -/* Меню — единственный пользователь keep_ui (0x37..0x3F не темнеют). */ -void pop_pal_menu_dim(uint8_t fade) __banked; - -#endif /* POP_PAL_H */ diff --git a/applications/SprPoP/src/pop_path_bank.c b/applications/SprPoP/src/pop_path_bank.c deleted file mode 100644 index b49fc19..0000000 --- a/applications/SprPoP/src/pop_path_bank.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * pop_path_bank.c — каталог приложения и восстановление cwd, BANK10. - * - * APPINFO B=1 возвращает абсолютный каталог запущенного EXE вместе с диском. - * Получаем его один раз при старте. Буфер объявлен const намеренно: у - * Sprinter банковые страницы — RAM, а --constseg кладёт объект в BANK10, - * не расходуя дефицитную резидентную _DATA в W2. Записывает его только - * ESTEX во время pop_path_init(). - * - * ABI: публичные функции __banked; их вызывает POP_PATH_CALL из банка - * файлового клиента. После возврата трамплин восстанавливает прежнюю W3, - * поэтому переданный самой файловой операции указатель снова доступен. - */ -#include -#include - -#include "_pop_file.h" - -static const char pop_app_dir[256] = { 0 }; - -/* ESTEX APPINFO ($47), B=1: HL=буфер, CF/A=ошибка. */ -static int appinfo_dir(const char *buf) __naked -{ - (void)buf; - __asm - push ix - ld b, #1 - ld c, #0x47 - rst #0x10 - pop ix - jr c, _paid_err - ld de, #0 - ret - _paid_err: - call __errno_set - ld de, #-1 - ret - __endasm; -} - -int8_t pop_path_init(void) __banked -{ - const char *dir = pop_app_dir; - - if (appinfo_dir(dir) != 0 || !dir[0]) return -1; - return (int8_t)chdir(dir); -} - -int8_t pop_chdir_home(void) __banked -{ - return (int8_t)chdir((const char *)pop_app_dir); -} diff --git a/applications/SprPoP/src/pop_qsave.c b/applications/SprPoP/src/pop_qsave.c deleted file mode 100644 index 72ef0e9..0000000 --- a/applications/SprPoP/src/pop_qsave.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * pop_qsave.c — файловая транзакция и схема игрового снимка. - * Живёт в холодном банке: в обычном кадре исполняется только проверка - * резидентного флага запроса, вся тяжёлая работа бывает по F6/F9. - */ -#include -#include -#include /* rename */ -#include -#include -#include "pop_qsave.h" -#include "pop_status.h" -#include "pop_kid.h" -#include "pop_guard.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_bg.h" -#include "pop_state.h" -#include "pop_tile.h" -#include "pop_sfx.h" -#include "pop_pace.h" -#include "pop_timer.h" -#include "sprpop_cold.h" -#include "_pop_file.h" - -#define QS_VERSION 4 -#define QS_SAVE 1 -#define QS_LOAD 2 -#define QS_LOAD_BACKUP 3 -#define QS_LIMIT 4096 -#define QS_BASE 0x100 - -extern uint8_t pop_qsave_request; - -static void qs_char(pop_qs_io_t *io, pop_char_t *c) -{ - pop_qs_u8(io, &c->frame); pop_qs_u8(io, &c->x); pop_qs_u8(io, &c->y); - pop_qs_i8(io, &c->direction); pop_qs_i8(io, &c->curr_col); - pop_qs_i8(io, &c->curr_row); pop_qs_u8(io, &c->action); - pop_qs_i8(io, &c->fall_x); pop_qs_i8(io, &c->fall_y); - pop_qs_u8(io, &c->room); pop_qs_u8(io, &c->repeat); - pop_qs_u8(io, &c->charid); pop_qs_u8(io, &c->sword); - pop_qs_i8(io, &c->alive); pop_qs_u16(io, &c->curr_seq); -} - -static void qs_payload(pop_qs_io_t *io) -{ - uint8_t speed=pop_speed_mode, immortal=pop_immortal, sound=pop_snd_want; - - /* Пользовательские параметры входят в снимок, а не остаются свойством - * текущего запуска. Читаем сначала во временные байты: повреждённые - * значения не должны частично применить остальное игровое состояние. */ - pop_qs_u8(io, &speed); pop_qs_u8(io, &immortal); pop_qs_u8(io, &sound); - if (io->reading && io->apply) { - if (speed >= POP_SPEED_MODES || immortal > 2 || sound > 1) { - io->failed=1; return; - } - pop_speed_mode=speed; pop_immortal=immortal; pop_snd_want=sound; - } - /* Глобальный timer сохраняется до состояния уровня: QuickLoad на том же - * уровне вернёт ровно тот логический кадр, без «бесплатной» минуты. */ - pop_timer_qsave(io); - - qs_char(io, &Kid); qs_char(io, &Guard); - pop_qs_u8(io, &cur_room); pop_qs_u8(io, &kid_room); - pop_qs_u8(io, &pop_checkpoint); pop_qs_u8(io, &pop_next_level); - pop_qs_i8(io, &knock); - - pop_qs_u8(io, &hitp_curr); pop_qs_u8(io, &hitp_max); - pop_qs_u8(io, &hitp_beg_lev); pop_qs_i8(io, &hitp_delta); - pop_qs_u8(io, &guardhp_curr); pop_qs_u8(io, &guardhp_max); - pop_qs_i8(io, &guardhp_delta); pop_qs_u8(io, &guard_skill); - pop_qs_i8(io, &guard_refrac); pop_qs_i8(io, &justblocked); - pop_qs_i8(io, &kid_sword_strike); pop_qs_i8(io, &offguard); - pop_qs_i8(io, &holding_sword); pop_qs_u8(io, &pop_guard_hurt); - pop_qs_i8(io, &can_guard_see_kid); pop_qs_i8(io, &is_guard_notice); - pop_qs_i8(io, &pop_united_shadow); pop_qs_u8(io, &pop_shadow_init); - pop_qs_i8(io, &pop_guard_notice_timer); - pop_qs_u16(io, &pop_fight_seed.lo); pop_qs_u16(io, &pop_fight_seed.hi); - - pop_qs_u8(io, &pop_kid_dead); pop_qs_u8(io, &pop_kid_hurt); - pop_qs_u8(io, &pop_have_sword); pop_qs_u8(io, &pop_item_taken); - pop_qs_u8(io, &pop_flash_time); pop_qs_u8(io, &pop_flash_color); - pop_qs_u8(io, &pop_feather); pop_qs_u8(io, &pop_upside); - pop_qs_u8(io, &pop_upside_want); pop_qs_u8(io, &pop_upside_dirty); - pop_qs_u8(io, &pop_leave_dir); pop_qs_u8(io, &pop_leave_timer); - pop_qs_u8(io, &pop_loose_fell); pop_qs_u8(io, &pop_ceil_fell); - pop_qs_u8(io, &pop_debris_at); pop_qs_u8(io, &pop_fell_out); - pop_qs_bytes(io, pop_loose_modif, sizeof(pop_loose_modif)); - pop_qs_bytes(io, pop_ceil_modif, sizeof(pop_ceil_modif)); - - pop_qs_u8(io, &pop_loose_landed); pop_qs_u8(io, &pop_loose_exit); - pop_qs_u8(io, &pop_loose_exit_room); pop_qs_u8(io, &pop_droppedout); - pop_qs_u16(io, &pop_leveldoor_open); pop_qs_i8(io, &pop_jumped_mirror); - pop_qs_u8(io, &pop_seamless); pop_qs_u8(io, &pop_nav_hold); - - pop_level_qsave(io); - pop_trob_qsave(io); - pop_loose_mob_qsave(io); - pop_map_qsave(io); - pop_guard_ai_qsave(io); -} - -static void qs_init(pop_qs_io_t *io, uint8_t page, uint16_t limit, - uint8_t reading, uint8_t apply) -{ - io->page=page; io->pos=QS_BASE; io->limit=(uint16_t)(QS_BASE+limit); - io->checksum=0; - io->count=0; io->reading=reading; io->apply=apply; io->failed=0; -} - -static uint8_t qs_header_read(pop_qs_io_t *io, uint8_t *level) -{ - uint8_t h[7]; - if (!pop_qs_raw_get(io,h,sizeof(h))) return 0; - if (h[0]!='P' || h[1]!='O' || h[2]!='P' || h[3]!='Q' || - h[4] != QS_VERSION || h[5] < POP_LEVEL_FIRST || - h[5] > POP_LEVEL_LAST || h[6] != 0) return 0; - *level = h[5]; return 1; -} - -static uint8_t qs_validate_page(uint8_t page, uint16_t size, - uint8_t *level, uint16_t *payload_size) -{ - pop_qs_io_t io; - uint8_t tail[4]; - uint16_t n, sum; - if (size < 11) return 0; - qs_init(&io,page,size,1,0); - if (!qs_header_read(&io,level)) return 0; - io.pos=(uint16_t)(QS_BASE+size-4); - if (!pop_qs_raw_get(&io,tail,4)) return 0; - n = (uint16_t)(tail[0] | ((uint16_t)tail[1] << 8)); - sum = (uint16_t)(tail[2] | ((uint16_t)tail[3] << 8)); - if (n != (uint16_t)(size-11) || - sum != pop_qs_checksum_page(page,QS_BASE+7,n)) return 0; - *payload_size=n; return 1; -} - -static uint8_t qs_apply(uint8_t page, uint16_t size, uint16_t payload_size, - uint8_t *level) -{ - pop_qs_io_t io; - qs_init(&io,page,size,1,1); - if (!qs_header_read(&io,level)) return 0; - qs_payload(&io); - return (uint8_t)(!io.failed && io.count == payload_size && - io.pos == (uint16_t)(QS_BASE+7+payload_size)); -} - -static int8_t qs_save(uint8_t page) -{ - pop_qs_io_t io; - uint8_t tail[4]; - const uint8_t h[7]={'P','O','P','Q',QS_VERSION,pop_current_level,0}; - uint16_t size; - int rc; - qs_init(&io,page,QS_LIMIT,0,0); - pop_qs_raw_put(&io,h,sizeof(h)); - qs_payload(&io); - tail[0]=(uint8_t)io.count; tail[1]=(uint8_t)(io.count >> 8); - io.checksum=pop_qs_checksum_page(page,QS_BASE+7,io.count); - tail[2]=(uint8_t)io.checksum; tail[3]=(uint8_t)(io.checksum >> 8); - pop_qs_raw_put(&io,tail,4); size=(uint16_t)(io.pos-QS_BASE); - if (io.failed) return -1; - POP_PATH_CALL(rc, unlink("POP.NEW")); - POP_PATH_CALL(rc, bank_save_file(page,QS_BASE,"POP.NEW",size)); - if (rc != size) { - POP_PATH_CALL(rc, unlink("POP.NEW")); - return -1; - } - POP_PATH_CALL(rc, unlink("POP.BAK")); - POP_PATH_CALL(rc, rename("POP.SAV", "POP.BAK")); - POP_PATH_CALL(rc, rename("POP.NEW", "POP.SAV")); - if (rc != 0) { - POP_PATH_CALL(rc, rename("POP.BAK", "POP.SAV")); - return -1; - } - return 1; -} - -static int8_t qs_load_one(const char *name, uint8_t page) -{ - uint8_t level; - uint16_t payload_size; - int size; - POP_PATH_CALL(size, bank_load_file(page,QS_BASE,name,QS_LIMIT)); - if (size <= 0 || !qs_validate_page(page,(uint16_t)size,&level, - &payload_size)) return -1; - if (level != pop_current_level) { - pop_next_level = level; - if (pop_level_switch() != 0 || pop_current_level != level) return -1; - } - if (!qs_apply(page,(uint16_t)size,payload_size,&level)) return -1; - Char = Kid; Opp = Guard; - pop_qsave_restore_room(cur_room); - return 1; -} - -/* Проверка слотов для меню. Это именно probe: не вызывает pop_level_switch, - * не применяет payload и не трогает звук. Отдельная EMM-страница делает - * проверку независимой от живой страницы уровня. */ -uint8_t pop_qsave_probe(void) __banked -{ - uint8_t blk, page, level, slots = 0; - uint16_t payload_size; - int size; - - blk = mem_alloc_pages(1); - if (!blk) return 0; - page = mem_get_page(blk, 0); - gfx_w0_page_prepare(page); - - POP_PATH_CALL(size, bank_load_file(page, QS_BASE, "POP.SAV", QS_LIMIT)); - if (size > 0 && qs_validate_page(page, (uint16_t)size, &level, - &payload_size)) - slots |= POP_QS_SLOT_SAVE; - POP_PATH_CALL(size, bank_load_file(page, QS_BASE, "POP.BAK", QS_LIMIT)); - if (size > 0 && qs_validate_page(page, (uint16_t)size, &level, - &payload_size)) - slots |= POP_QS_SLOT_BACKUP; - - mem_free_block(blk); - return slots; -} - -int8_t pop_qsave_process(void) __banked -{ - uint8_t request = pop_qsave_request; - uint8_t blk,page; - int8_t rc=-1; - pop_qsave_request = 0; - if (!request) return 0; - /* Лейбл — ДО дисковой работы: она длится доли секунды, игра на это - * время замирает, и строка обязана объяснить фриз, а не подводить под - * ним итог. Не удалось — ниже перепишем на NO QUICKSAVE/QUICKLOAD. */ - pop_status_show_now((uint8_t)(request == QS_SAVE ? POP_MSG_QUICKSAVE - : POP_MSG_QUICKLOAD)); - blk=mem_alloc_pages(1); - if (!blk) return -1; - page=mem_get_page(blk,0); - gfx_w0_page_prepare(page); - /* Звук не глушим (2026-08-28). Единственное место из снятых, где по - * диску реально едут 16 КБ (~33 мс, три периода насоса): если на F6/F9 - * появится скрежет — вернуть сюда pop_sfx_pause/pop_sfx_start, это - * лечится точечно и только здесь. */ - if (request == QS_SAVE) rc = qs_save(page); - else if (request == QS_LOAD_BACKUP) rc = qs_load_one("POP.BAK", page); - else { - rc = qs_load_one("POP.SAV",page); - if (rc < 0) rc = qs_load_one("POP.BAK",page); - } - mem_free_block(blk); - /* Успех ничего не меняет: нужная строка висит с начала операции. - * Отказ переписывает её на NO QUICKSAVE/NO QUICKLOAD — обычной - * заявкой, кадр её подхватит (порт seg000:497/514). */ - if (rc <= 0) - pop_status_msg = (uint8_t)(request == QS_SAVE ? POP_MSG_NO_QUICKSAVE - : POP_MSG_NO_QUICKLOAD); - return rc; -} diff --git a/applications/SprPoP/src/pop_qsave.h b/applications/SprPoP/src/pop_qsave.h deleted file mode 100644 index 564c296..0000000 --- a/applications/SprPoP/src/pop_qsave.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * pop_qsave.h — потоковый QuickSave/QuickLoad одного игрового слота. - * - * На диске используются POP.NEW, POP.SAV и POP.BAK. Формат не содержит - * указателей, файловых дескрипторов и графических кэшей; многобайтные поля - * записываются явно little-endian. Внутренние функции pop_qs_* нужны - * модулям-владельцам закрытого состояния. - */ -#ifndef POP_QSAVE_H -#define POP_QSAVE_H - -#include - -typedef struct { - uint8_t page; - uint16_t pos; - uint16_t limit; - uint16_t checksum; - uint16_t count; - uint8_t reading; - uint8_t apply; - uint8_t failed; -} pop_qs_io_t; - -void pop_qs_bytes(pop_qs_io_t *io, void *data, uint16_t size); -void pop_qs_u8(pop_qs_io_t *io, uint8_t *value); -void pop_qs_i8(pop_qs_io_t *io, int8_t *value); -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value); -void pop_qs_i16(pop_qs_io_t *io, int *value); -void pop_qs_raw_put(pop_qs_io_t *io, const uint8_t *data, uint8_t size); -uint8_t pop_qs_raw_get(pop_qs_io_t *io, uint8_t *data, uint8_t size); -uint16_t pop_qs_checksum_page(uint8_t page, uint16_t pos, uint16_t size); - -/* Вызывается в безопасной границе кадра. Возвращает: 0 — запроса нет, - * 1 — сохранено/загружено, -1 — ошибка. */ -int8_t pop_qsave_process(void) __banked; -void pop_qsave_request_save(void); -void pop_qsave_request_load(void); -void pop_qsave_request_load_backup(void); - -/* Валидность слотов без изменения состояния игры. Нужна menu для вопроса - * LOAD BACKUP?: основной SAV уже пригоден, backup спрашиваем только если - * основной отсутствует или повреждён. */ -#define POP_QS_SLOT_SAVE 0x01 -#define POP_QS_SLOT_BACKUP 0x02 -uint8_t pop_qsave_probe(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_qsave_coldio.c b/applications/SprPoP/src/pop_qsave_coldio.c deleted file mode 100644 index 511db08..0000000 --- a/applications/SprPoP/src/pop_qsave_coldio.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Холодная часть ввода-вывода QuickSave (банк 8). - * - * Эти функции вызываются только банковым оркестратором pop_qsave.c, поэтому - * им не место в дефицитном резидентном _CODE. Здесь только доступ через W0: - * переключающие W3 DSS-операции обязаны оставаться в pop_qsave_io.c. - */ -#include "pop_qsave.h" -#include - -void pop_qs_raw_put(pop_qs_io_t *io, const uint8_t *data, uint8_t size) -{ - uint8_t *q, i; - if (io->pos + size > io->limit) { io->failed=1; return; } - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - for (i=0; ipos += size; -} - -uint8_t pop_qs_raw_get(pop_qs_io_t *io, uint8_t *data, uint8_t size) -{ - uint8_t *q, i; - if (io->pos + size > io->limit) return 0; - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - for (i=0; ipos += size; return 1; -} - -/* XOR8 достаточно для обнаружения случайной порчи транзакционного файла; - * размер payload проверяется отдельно, старший байт содержит инверсию XOR. */ -uint16_t pop_qs_checksum_page(uint8_t page, uint16_t pos, uint16_t size) -{ - uint8_t *p, sum=0; - gfx_w0_map(page); p=(uint8_t *)pos; - while(size--) sum ^= *p++; - gfx_w0_unmap(); - return (uint16_t)(sum | ((uint16_t)(uint8_t)~sum << 8)); -} diff --git a/applications/SprPoP/src/pop_qsave_io.c b/applications/SprPoP/src/pop_qsave_io.c deleted file mode 100644 index cc4fc28..0000000 --- a/applications/SprPoP/src/pop_qsave_io.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Резидентная часть QuickSave: часто вызываемые межбанковые примитивы - * потока и флаг запроса. Файловый обмен с W3 теперь общий в libc. */ -#include "pop_qsave.h" -#include -#include - -uint8_t pop_qsave_request; -void pop_qsave_request_save(void) { pop_qsave_request=1; } -void pop_qsave_request_load(void) { pop_qsave_request=2; } -void pop_qsave_request_load_backup(void) { pop_qsave_request=3; } - -void pop_qs_bytes(pop_qs_io_t *io, void *data, uint16_t size) -{ - uint8_t *p=(uint8_t *)data, *q; - if (io->failed || io->pos + size > io->limit) { io->failed=1; return; } - gfx_w0_map(io->page); q=(uint8_t *)io->pos; - if (!io->reading) memcpy(q,p,size); - else if (io->apply) memcpy(p,q,size); - gfx_w0_unmap(); io->pos += size; io->count += size; -} -void pop_qs_u8(pop_qs_io_t *io, uint8_t *v) { pop_qs_bytes(io,v,1); } -void pop_qs_i8(pop_qs_io_t *io, int8_t *v) { pop_qs_bytes(io,v,1); } -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value) -{ - uint8_t b[2]; b[0]=(uint8_t)*value; b[1]=(uint8_t)(*value >> 8); - pop_qs_bytes(io,b,2); - if (io->reading && io->apply && !io->failed) - *value=(uint16_t)(b[0] | ((uint16_t)b[1] << 8)); -} -void pop_qs_i16(pop_qs_io_t *io, int *value) -{ - uint16_t v=(uint16_t)*value; pop_qs_u16(io,&v); - if (io->reading && io->apply && !io->failed) *value=(int)v; -} diff --git a/applications/SprPoP/src/pop_redraw.c b/applications/SprPoP/src/pop_redraw.c deleted file mode 100644 index d8e3018..0000000 --- a/applications/SprPoP/src/pop_redraw.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * pop_redraw.c — пометки перерисовки тайлов и их разбор. См. pop_redraw.h. - * - * Живёт в W1/W2 (НЕ в резиденте W3): пометки ставит логика, которая должна - * оставаться достижимой из будущих __banked-модулей. Сам разбор зовёт - * pop_bg (резидент W3) — это законно, потому что разбор дёргает только - * главный цикл. - */ -#include -#include "pop_redraw.h" -#include "pop_bg.h" -#include "_pop_bg.h" /* pop_bake_slot_reset — тот же банк, без трамплина */ - -#define NTILES 30 -#define NCOLS 10 - -static uint8_t rd_kind[NTILES], rd_cnt[NTILES]; -static uint8_t rda_kind[NCOLS], rda_cnt[NCOLS]; -/* Сколько всего непустых пометок: без него проход по 40 ячейкам крутился бы - * КАЖДЫЙ кадр впустую (замер 2026-07-27 на прежнем rest-цикле: ~12 % кадра). */ -static uint8_t rd_pending; -/* Пометки ПЕРЕДНЕГО слоя — однокадровые, отдельно от rd_*: те живут по - * страницам дабл-буфера (запекают фон), а эти транзиентны. */ -static uint8_t rdf[NTILES]; -static uint8_t rdf_pending; -/* Передний слой РЯДА −1 (полоса кладки у потолка). Отдельным набором, как и - * сами перерисовки ряда −1 (rda_*): у оригинала это вообще другой проход — - * redraw_needed_tiles сначала обходит ряды 2,1,0, а ПОТОМ ряд 2 комнаты сверху - * (seg008:1B06), и его draw_tile_fore кладёт куски в foretable, то есть поверх - * midtable, где лежат падающие плиты, и поверх объектов. */ -static uint8_t rdfa[NCOLS]; -static uint8_t rdfa_pending; - -void pop_redraw_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < NTILES; i++) { rd_kind[i] = 0; rd_cnt[i] = 0; } - for (i = 0; i < NCOLS; i++) { rda_kind[i] = 0; rda_cnt[i] = 0; } - rd_pending = 0; - for (i = 0; i < NTILES; i++) rdf[i] = 0; - for (i = 0; i < NCOLS; i++) rdfa[i] = 0; - pop_fore_pass_end(); - rdf_pending = 0; - rdfa_pending = 0; -} - -void pop_set_redraw_fore(uint8_t tilepos) __banked -{ - if (tilepos >= NTILES) return; - if (!rdf[tilepos]) rdf_pending++; - rdf[tilepos] = 1; -} - -/* То же для полосы кладки У ПОТОЛКА (ряд −1). Ставит падающий кусок, когда - * его спрайт достаёт до кромки потолка: иначе кусок накрывает эту кромку - * собой, чего быть не может (найдено пользователем 2026-08-17, ур.1 к.6 — - * плита (−1,5) перекрывала потолок (−1,6)). */ -void pop_set_redraw_fore_above(uint8_t col) __banked -{ - if (col >= NCOLS) return; - if (!rdfa[col]) rdfa_pending++; - rdfa[col] = 1; -} - -/* Разбор пометок переднего слоя: тайлы обходятся в том же порядке, что и - * фон, и рисуются ПОСЛЕ всех объектов кадра — как foretable у оригинала - * (draw_tables, seg008:1373: back -> mid -> fore). */ -void pop_fore_needed(void) __banked -{ - uint8_t i, row = 0, col = 0; - if (!rdf_pending && !rdfa_pending) return; - pop_fore_pass_begin(); - for (i = 0; i < NTILES; i++) { - if (rdf[i]) { rdf[i] = 0; pop_fore_tile_b(row, col); } - if (++col == 10) { col = 0; row++; } - } - rdf_pending = 0; - /* Ряд −1 — ПОСЛЕДНИМ, как в redraw_needed_tiles (seg008:1B06). */ - if (rdfa_pending) { - for (i = 0; i < NCOLS; i++) - if (rdfa[i]) { rdfa[i] = 0; pop_ceil_fore_tile_b(i); } - rdfa_pending = 0; - } -} - -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked -{ - if (tilepos >= NTILES) return; - if (!rd_cnt[tilepos]) rd_pending++; - else pop_bake_slot_reset(tilepos); /* перепометка — копия запечки не годится */ - /* ПРИОРИТЕТ ПОЛНОЙ ПЕРЕРИСОВКИ НАД слоем anim. У оригинала это не - * конфликт видов, а два независимых счётчика, и полная побеждает - * (redraw_needed, seg008:0211: `if (redraw_frames_full) draw_tile(); - * else if (redraw_frames_anim) {...}`). У нас вид ОДИН на тайл, и без - * этой проверки исход решал бы порядок trob'ов в списке: чомпер, который - * СЕЙЧАС смыкает челюсти, ставит POP_RD_CHOMP (ему нужен heal — поза - * меняется), а факел слева тут же метил бы тот же тайл как - * POP_RD_CHOMP_ANIM, и heal пропал бы — новая поза легла бы поверх - * старой. */ - if (!(kind == POP_RD_CHOMP_ANIM && rd_kind[tilepos] == POP_RD_CHOMP && - rd_cnt[tilepos])) - rd_kind[tilepos] = kind; - if (pages > rd_cnt[tilepos]) rd_cnt[tilepos] = pages; -} - -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked -{ - if (col >= NCOLS) return; - if (!rda_cnt[col]) rd_pending++; - else pop_bake_slot_reset_above(col); /* перепометка — копия запечки не годится */ - rda_kind[col] = kind; - if (pages > rda_cnt[col]) rda_cnt[col] = pages; -} - -/* redraw_needed (seg008:0178): пройти пометки и нарисовать. row/col ведём - * бегущими счётчиками, а не через i/10 и i%10 — у Z80 нет деления, и SDCC - * выносит __divuchar/__moduchar в вершину цикла как общее подвыражение - * аргументов (30*2 делений за кадр даже когда рисовать нечего). */ -void pop_redraw_needed(void) __banked -{ - uint8_t i, row = 0, col = 0, left = 0, cnt = 0; /* cnt — ВРЕМЕННО, замер */ - pop_dbg_rdmax_tot = 0; - if (!rd_pending) return; - for (i = 0; i < NTILES; i++) { - if (rd_cnt[i]) { - pop_dbg_kind(rd_kind[i]); /* ВРЕМЕННО: какой вид перерисовки */ - switch (rd_kind[i]) { - case POP_RD_SPIKE: pop_spike_redraw(row, col); break; - case POP_RD_LOOSE: pop_loose_shake_draw(row, col); break; - case POP_RD_LOOSE_GONE: pop_loose_bake_empty(row, col); break; - case POP_RD_FLOOR: pop_floor_bake(row, col); break; - case POP_RD_LEVELDOOR: pop_leveldoor_redraw(row, col); break; - case POP_RD_GATE: pop_gate_redraw(row, col); break; - case POP_RD_CHOMP: pop_chomp_redraw(row, col); break; - case POP_RD_CHOMP_ANIM: pop_chomp_anim_draw(row, col); break; - default: break; - } - cnt++; /* ВРЕМЕННО: замер */ - if (--rd_cnt[i]) left++; - else rd_kind[i] = 0; - } - if (++col == 10) { col = 0; row++; } - } - for (i = 0; i < NCOLS; i++) { - if (rda_cnt[i]) { - if (rda_kind[i] == POP_RDA_CEIL) pop_ceil_shake_draw(i); - else pop_ceil_bake_empty(i); - cnt++; /* ВРЕМЕННО: замер */ - if (--rda_cnt[i]) left++; - else rda_kind[i] = 0; - } - } - rd_pending = left; - pop_dbg_rdmax_tot = cnt; /* ВРЕМЕННО: замер */ - if (cnt > pop_dbg_rdmax[0]) pop_dbg_rdmax[0] = cnt; -} diff --git a/applications/SprPoP/src/pop_redraw.h b/applications/SprPoP/src/pop_redraw.h deleted file mode 100644 index 7ab303f..0000000 --- a/applications/SprPoP/src/pop_redraw.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * pop_redraw.h — пометки «перерисовать тайл» и их разбор. - * - * Порт архитектуры оригинала: логика анимации НИЧЕГО не рисует, она ставит - * флаг (`set_redraw_full`/`set_wipe`/`redraw_20h`/`redraw_21h`, seg007), а - * отрисовка идёт отдельным проходом (`redraw_needed`, seg008:0178). У нас - * так же: pop_map/pop_trob зовут pop_set_redraw*, а pop_redraw_needed() - * (главный цикл) разбирает пометки и дёргает pop_bg. - * - * ЗАЧЕМ (кроме сходства с SDLPoP): из __banked-кода резидентная страница W3 - * недостижима — ни напрямую, ни транзитивно (docs/layout_plan_v2.md §2 R2). - * Пока pop_map звал pop_bg, его нельзя было использовать из банка стражей. - * Пометки живут в W1/W2 и зовутся откуда угодно. - * - * ОТЛИЧИЕ ОТ ОРИГИНАЛА: у нас не один экран с dirty-rect, а две страницы - * дабл-буфера со своей ОЗУ-копией фона, поэтому счётчик пометки — это ЧИСЛО - * СТРАНИЦ (обычно 2), а вид перерисовки хранится явно: heal+рисовать поверх - * (транзиент) или запечь новый фон. В оригинале вид кодируется тем, в какой - * из таблиц redraw_frames_* стоит флаг. - */ -#ifndef POP_REDRAW_H -#define POP_REDRAW_H - -#include - -/* Виды перерисовки тайла (row*10+col). */ -#define POP_RD_SPIKE 1 /* пики: heal + оба тайла (redraw_21h) */ -#define POP_RD_LOOSE 2 /* loose: дрожащий кадр / кадр покоя */ -#define POP_RD_LOOSE_GONE 3 /* loose провалился: запечь пусто */ -#define POP_RD_FLOOR 4 /* пол изменился: кнопка/щебень/поднятый меч */ -#define POP_RD_LEVELDOOR 5 /* створка двери уровня (ПРАВАЯ половина) */ -#define POP_RD_GATE 6 /* решётка ворот (tilepos = САМИ ворота) */ -#define POP_RD_CHOMP 7 /* чомпер: кадр смыкания челюстей */ -#define POP_RD_CHOMP_ANIM 8 /* чомпер: вернуть ТОЛЬКО слой anim поверх огня */ - -/* Виды перерисовки полосы у потолка (по колонке). */ -#define POP_RDA_CEIL 1 /* плита-потолок: дрожащий кадр / покой */ -#define POP_RDA_CEIL_GONE 2 /* плита-потолок провалилась: колодец */ - -/* Пометить тайл/колонку: kind — вид, pages — на скольких страницах - * дабл-буфера перерисовать (1 = только текущая, 2 = обе). Повторная - * пометка перекрывает вид и берёт максимум счётчика. */ -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked; - -/* ПЕРЕДНИЙ СЛОЙ по пометкам — порт redraw_frames_fore/set_redraw_fore - * (seg007:0550). В оригинале эти пометки ставят ОБЪЕКТЫ, каждый вокруг - * себя: персонаж — прямоугольник футпринта (redraw_at_char, seg003:0576), - * падающий кусок — соседа справа и второй тайл на границе рядов (draw_mob, - * seg007:1147), анимация тайла — свой тайл (draw_trob). Пометка - * ОДНОКАДРОВАЯ: передний слой транзиентен, его снимает heal. - * - * Разбор (pop_fore_needed) звать ПОСЛЕ отрисовки всех объектов кадра. */ -void pop_set_redraw_fore(uint8_t tilepos) __banked; - -/* Пометить передний слой полосы у потолка (ряд −1), столбец col. Ставит - * падающий кусок, достающий до кромки потолка. */ -void pop_set_redraw_fore_above(uint8_t col) __banked; -void pop_fore_needed(void) __banked; -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked; - -/* Разобрать пометки: нарисовать всё помеченное на ТЕКУЩЕЙ (back) странице и - * уменьшить счётчики. Звать из главного цикла в слое ФОНА — до персонажей. */ -void pop_redraw_needed(void) __banked; - -/* Сбросить все пометки (смена комнаты/уровня). */ -void pop_redraw_reset(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_room.c b/applications/SprPoP/src/pop_room.c deleted file mode 100644 index b9a14d6..0000000 --- a/applications/SprPoP/src/pop_room.c +++ /dev/null @@ -1,2011 +0,0 @@ -/* - * pop_room.c — ХОЛОДНАЯ половина слоя фона PoP: полная отрисовка комнаты - * (порт seg008.c draw_tile / render_room.py), точечные перерисовки тайлов - * при событиях (пики, ворота, кнопки, дверь уровня, дрожащие плиты) и - * падающие куски loose (mob, seg007 move_loose). Всё это работает раз на - * комнату или раз на событие, поэтому живёт в ОТДЕЛЬНОМ банке и платит - * трамплин за вызовы горячей половины — см. _pop_bg.h, там же граница реза. - * - * Только DUNGEON-стиль (Фаза 1). - */ -/* Имена файлов атласов обоих тайлсетов нужны только здесь; макрос обязан - * стоять ДО первого включения pop_bg_atlas.h (его тянет pop_tile.h). */ -#define POP_BG_ATLAS_NAMES -#include -#include -#include -#include -#include -#include "pop_bg.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "_pop_bg.h" /* контракт с горячей половиной (pop_bg.c, банк 2) */ -#include "pop_tile.h" /* общие листья слоя фона (резидент): блит, тайлы, таблица */ -#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */ -#include "pop_arc.h" -#include "bg_arc.h" -#include "pop_state.h" -#include "pop_redraw.h" /* пометки тайлов: сосед падающего куска (draw_mob) */ -#include "pop_geom.h" -#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */ -#include "pop_kid.h" /* Kid.curr_col/curr_row — порядок оверлеев */ -#include "pop_cdraw.h" /* pop_cd — габарит кадра Кида (y-порядок плиты) */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include "_pop_file.h" -#include -#include - -/* Фазы loose-плит: массив ТЕКУЩЕЙ комнаты (pop_map) и персистентный per-room - * (pop_trob) плюс постановка trob. Объявлены здесь, а не включением обоих - * заголовков: нужна ровно одна ячейка каждому — падающий кусок срывает - * плиту, в которую врезался (loose_fall, см. mob_break_loose). */ -extern uint8_t pop_loose_modif[30]; -uint8_t *pop_trob_modif(uint8_t room) __banked; -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked; -/* remove_loose для ОДНОГО тайла — снять плиту с карты немедленно (честный - * loose_fall, см. mob_break_loose). Живёт в pop_map: там рабочая копия - * тайлов комнаты и фазы плит. */ -void pop_loose_remove(uint8_t room, uint8_t tilepos) __banked; - -/* ---- Тайлсет: подземелье / дворец ----------------------------------- * - * Порт tbl_envir_ki[tbl_level_type[level]] (seg000:1108): оригинал под один - * и тот же набор id грузит РАЗНЫЙ .DAT — VDUNGEON или VPALACE. У нас так - * же: раскладка id -> (страница, idx) общая (упаковщик печёт оба набора по - * одному объединению id), меняются только файлы атласов и 32 записи - * палитры — env 0x50..0x5F и wall 0x60..0x6F. Кид, страж, меч и зелья - * живут в других слотах, поэтому общая kid.pal не трогается. */ -static uint8_t bg_set = 0xFF; /* какой набор сейчас загружен */ - -/* Ресурсы разложены по каталогам образа (8.3, как в DSS): BG — фон, KID — - * персонаж, GUARD — стражи, LEVELS — уровни. Иначе корень диска зарастает - * десятками .atl. Путь склеиваем на месте: держать по строке на каждый из - * двадцати атласов — лишние полкилобайта в банке. */ -/* Шаг набора в архиве: десять env + wall + fore. */ -#define BG_SET_STRIDE (POP_ENV_PAGES + 2) -#if (ARC_BG_PAL_ENV0 - ARC_BG_POP_ENV0) != BG_SET_STRIDE -#error "тайлсеты в архиве фона лежат не по двенадцать атласов" -#endif - -static char bg_path_buf[20]; - -static const char *bg_path(const char *name) -{ - char *d = bg_path_buf; - *d++ = 'B'; *d++ = 'G'; *d++ = '\\'; - while (*name) *d++ = *name++; - *d = 0; - return bg_path_buf; -} - -/* 32 записи (env, затем wall) в ОБЕ палитры: у страниц дабл-буфера они - * раздельные. Буфер — на стеке: gfx_pal_load отдаёт указатель BIOS ($A4), - * а тот читает только #4000-#BFFF, то есть банковую rodata бы не увидел - * (те же грабли, что в pop_guard_set_palette). */ -static int bg_load_tile_pal(const char *name) -{ - uint8_t buf[64]; - int fd; - POP_PATH_CALL(fd, open(bg_path(name), O_RDONLY)); - if (fd < 0) return -1; - if (read(fd, buf, 64) != 64) { close(fd); return -1; } - gfx_pal_load(0, POP_PAL_ENV, 16, buf); - gfx_pal_load(1, POP_PAL_ENV, 16, buf); - if (read(fd, buf, 64) != 64) { close(fd); return -1; } - gfx_pal_load(0, POP_PAL_WALL, 16, buf); - gfx_pal_load(1, POP_PAL_WALL, 16, buf); - close(fd); - return 0; -} - -/* ---- Композитный спрайт ПАДАЮЩЕГО КУСКА ------------------------------ * - * Три части (env 70 / 74 / 72, см. блок MOB_X0 ниже) складываются в ОДИН - * getimage-блоб в обычной памяти, и кусок рисуется одним блитом вместо трёх. - * - * Зачем: у блита ~8 800 такта постоянных накладных против ~5 000 на пиксели - * (memory blit_cost_model). Шесть кусков в воздухе давали 18 вызовов и - * 258 708 такта — БОЛЬШЕ ПОЛОВИНЫ цианового блока (замер 2026-08-17, - * docs/perf_cyan_phase.md). Плюс блоб в обычной памяти не требует - * atlas_image и gfx_w0_map/unmap — ещё ~1 350 такта на вызов. - * - * Прозрачность соблюдена: части ПЕРЕКРЫВАЮТСЯ (74 и 70 обе идут от mob_x), - * поэтому копируются попиксельно с пропуском 0xFF — ровно как три блита с - * прозрачностью друг поверх друга. - * - * Размер буфера — по худшему из тайлсетов (дворец даёт 63 в ширину, - * подземелье 19 в высоту), 1 201 Б статики W2. Куча SprPoP не - * используется (malloc'ов в приложении нет), так что это её и не задевает. - * - * Собирается на КАЖДУЮ смену тайлсета: размеры частей у наборов разные. */ -/* Коридор heal падающего куска — по фактической высоте СОБРАННОГО композита - * (у дворца он 16 строк, у подземелья 19). Держать константные 24 «на всякий - * случай» значило платить лишними строками на самой дорогой операции кадра, - * помноженными на число падающих плит. Ставит mob_spr_build; стартовые - * значения — безопасный максимум (см. MOB_HEAL_UP/MOB_HEAL_H ниже). */ -static uint8_t mob_heal_up = 20; -static uint8_t mob_heal_h = 24; - -/* Размер буфера — верхняя граница по обоим тайлсетам с запасом; фактические - * w/h композита считаются при сборке и кладутся в его шапку. */ -#define MOBS_MAXW 64 -#define MOBS_MAXH 20 -static uint8_t mob_spr[4 + MOBS_MAXW * MOBS_MAXH]; -static uint8_t mob_spr_ok; /* 0 — не собрался, рисуем тремя блитами */ - -/* Части композита: id, смещение по x, смещение НИЗА части относительно mob_y. - * Порядок — как в mob_render (низ, левая часть, правая), он важен: части - * перекрываются. */ -static const uint8_t MOBS_ID[3] = {74, 70, 72}; -static const uint8_t MOBS_XO[3] = {0, 0, 32}; -static const int8_t MOBS_YBO[3] = {0, -3, -1}; - -static void mob_spr_build(void) -{ - uint8_t w[3], h[3], k, r, c, v, cw, ch; - const uint8_t *src; - int top = 0, row0; - - mob_spr_ok = 0; - /* Проход 1 — габариты частей. Считать их обязательно, а не брать - * константами: у тайлсетов они РАЗНЫЕ (напр. правая часть 72 — 26 px в - * подземелье и 25 во дворце). */ - for (k = 0; k < 3; k++) { - atlas_t *a = &pop_env[MOBS_ID[k] >> POP_ENV_SHIFT]; - uint8_t idx = (uint8_t)(MOBS_ID[k] & POP_ENV_MASK); - if (idx >= a->count) return; - src = (const uint8_t *)atlas_image(a, idx); - gfx_w0_map(a->page); - w[k] = src[0]; h[k] = src[2]; - v = (uint8_t)(src[1] | src[3]); - gfx_w0_unmap(); - if (v || !w[k] || !h[k]) return; /* кадр >255 или пустой */ - row0 = (int)MOBS_YBO[k] - (int)h[k] + 1; - if (row0 < top) top = row0; - } - /* Габарит композита: низ = mob_y, верх = самая высокая часть. */ - ch = (uint8_t)(1 - top); - cw = 0; - for (k = 0; k < 3; k++) - if ((uint8_t)(MOBS_XO[k] + w[k]) > cw) cw = (uint8_t)(MOBS_XO[k] + w[k]); - if (cw > MOBS_MAXW || ch > MOBS_MAXH) return; - mob_spr[0] = cw; mob_spr[1] = 0; - mob_spr[2] = ch; mob_spr[3] = 0; - /* Пустое место — ПРОЗРАЧНОЕ (0xFF), иначе композит закрасил бы фон вокруг - * частей. Страйд блоба = его ширина, поэтому чистим ровно cw*ch. */ - for (r = 0; r < ch; r++) - for (c = 0; c < cw; c++) mob_spr[4 + (uint16_t)r * cw + c] = 0xFF; - /* Проход 2 — копирование ПОПИКСЕЛЬНО с пропуском 0xFF: части - * ПЕРЕКРЫВАЮТСЯ (74 и 70 обе идут от mob_x), и прозрачные пиксели верхней - * не должны стирать нижнюю — ровно как три прозрачных блита друг поверх - * друга. */ - for (k = 0; k < 3; k++) { - atlas_t *a = &pop_env[MOBS_ID[k] >> POP_ENV_SHIFT]; - src = (const uint8_t *)atlas_image(a, (uint8_t)(MOBS_ID[k] & POP_ENV_MASK)); - gfx_w0_map(a->page); - row0 = (int)MOBS_YBO[k] - (int)h[k] + 1 - top; - for (r = 0; r < h[k]; r++) { - const uint8_t *sp = src + 4 + (uint16_t)r * w[k]; - uint8_t *dp = mob_spr + 4 + (uint16_t)(row0 + r) * cw + MOBS_XO[k]; - for (c = 0; c < w[k]; c++) { v = sp[c]; if (v != 0xFF) dp[c] = v; } - } - gfx_w0_unmap(); - } - /* Коридор heal — по композиту: две строки запаса сверху, одна снизу. */ - mob_heal_up = (uint8_t)(ch + 1); - mob_heal_h = (uint8_t)(ch + 3); - mob_spr_ok = 1; -} - -/* Загрузить набор set (0 подземелье, 1 дворец). Повторный вызов с тем же - * набором ничего не делает; со сменой — сначала выгружает старый, иначе - * EMM-страницы утекут (их по 12 на набор). */ -int pop_bg_load(uint8_t set) __banked -{ - int i; - if (set >= POP_TILESETS) return -1; - if (set == bg_set) return 0; - if (bg_set != 0xFF) { /* смена набора — освободить старый */ - for (i = 0; i < POP_ENV_PAGES; i++) atlas_free(&pop_env[i]); - atlas_free(&pop_wall_at); - atlas_free(&pop_fore_at); - } - /* Двадцать пять атласов фона лежат в одном архиве: двенадцать на - * тайлсет подряд плюс общий chtab_1. Открываем его ОДИН раз на смену - * набора — при цене `open` 51,4 мс это и есть основная экономия. */ - { - uint8_t tbl[ARC_BG_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t base = (uint8_t)(set * BG_SET_STRIDE); - int8_t bad = 0; - - if (pop_arc_open_id(&arc, POP_ARC_BG, tbl, ARC_BG_COUNT) < 0) return -1; - for (i = 0; i < POP_ENV_PAGES && !bad; i++) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, (uint8_t)(base + i), - &pop_env[i]) != 0); - if (!bad) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, - (uint8_t)(base + POP_ENV_PAGES), - &pop_wall_at) != 0); - if (!bad) - bad = (int8_t)(pop_arc_atlas(&arc, tbl, - (uint8_t)(base + POP_ENV_PAGES + 1), - &pop_fore_at) != 0); - if (!bad && bg_set == 0xFF) /* chtab_1 от набора не зависит */ - bad = (int8_t)(pop_arc_atlas(&arc, tbl, ARC_BG_POP_POT, - &pop_pot_at) != 0); - pop_arc_close(&arc); - if (bad) return -1; - } - bg_set = set; - pop_palace = (uint8_t)(set == 1); - mob_spr_build(); /* композит падающего куска — свой на набор */ - /* Палитра — ПОСЛЕ атласов: если атлас не загрузился, цвета остаются от - * прежнего набора и картинка хотя бы не разъезжается. */ - return bg_load_tile_pal(pop_tile_pal[set]); -} - -/* Пере-применить палитру ТЕКУЩЕГО набора. Нужна отдельно от pop_bg_load - * из-за порядка старта: атласы грузятся ДО initgraph (тот снимает - * DSS-страницу W0), а общая игровая палитра kid.pal читается ПОСЛЕ него и - * затирает слоты 0x50..0x6F — она собрана из VDUNGEON - * (pop_pack_kid.py build_palette). Звать сразу за gfx_pal_fload. */ -int pop_bg_pal_apply(void) __banked -{ - if (bg_set == 0xFF) return -1; - return bg_load_tile_pal(pop_tile_pal[bg_set]); -} - -void pop_bg_free(void) __banked -{ - int i; - if (bg_set == 0xFF) return; - for (i = 0; i < POP_ENV_PAGES; i++) - atlas_free(&pop_env[i]); - atlas_free(&pop_wall_at); - atlas_free(&pop_fore_at); - atlas_free(&pop_pot_at); - bg_set = 0xFF; -} - -static const uint8_t SPIKES_FRAM_RIGHT[10] = {0, 134, 135, 136, 137, 138, 137, 135, 134, 0}; - -/* ---- Чомпер (seg008.c:0B2B draw_tile_anim, ветка tiles_18_chomper) ---- * - * Кадр берётся НЕ прямо из modif: chomper_fram1[min(modif & 0x7F, 6)] даёт - * номер позы 0..4, и уже он индексирует три набора кусков — нижнюю челюсть - * (backtable), верхнюю (backtable, со своим подъёмом) и передний слой - * (foretable, поверх персонажа). Кровь — тот же номер позы + 114 (back) / - * +119 (fore), рисуется mono-силуэтом цветом 12; в атласе она уже такой - * (pop_pack_bg.py, 2026-08-07). - * Старший бит modif (0x80) = «в этом чомпере кого-то перемололо». - * - * Номер позы (pop_chomp_pose) и передние куски живут в РЕЗИДЕНТЕ - * (pop_tile.c): их читает ещё и fore-проход из горячей половины, а - * const-таблицы банка из чужого банка не видны. */ -static const uint8_t CHOMP_FRAM_BOT[5] = {101, 102, 103, 104, 105}; -static const uint8_t CHOMP_FRAM_TOP[5] = {0, 0, 111, 112, 113}; -static const uint8_t CHOMP_FRAM_Y[5] = {0, 0, 0x25, 0x2F, 0x32}; - -static const uint8_t BLUELINE_FRAM1[4] = {0, 124, 125, 126}; -static const int8_t BLUELINE_FRAM_Y[4] = {0, -20, -20, 0}; -static const uint8_t BLUELINE_FRAM3[4] = {44, 44, 45, 45}; - -/* ---- Зелье (tiles_10_potion, seg008 draw_tile_anim/draw_tile_fore) ---- - * Тип = (modif & 0xF8) >> 3: 0 = пусто (ничего не рисуем), 2..4 — «большая» - * склянка (id 13) и pot_size=1, остальные — маленькая (id 12). Спрайты — из - * chtab_1 (атлас pop_pot), поэтому НЕ из env: раньше мы рисовали chtab_6 id 12 - * (res212), которого в VDUNGEON нет — оттуда и «мусорный объект». - * Позиции оригинала: склянка xh = fore_x + draw_xh, xl = 6, ybottom = fore_y + - * draw_main_y; пузырёк/маска xh = draw_xh + 3, xl = 1, - * ybottom = draw_main_y − (pot_size << 2) − 14. */ -#define POT_MASK_ID 23 -static const uint8_t POTION_FRAM_BUBB[8] = {0, 16, 17, 18, 19, 20, 21, 22}; - -static uint8_t potion_type(uint8_t modif) { return (uint8_t)((modif & 0xF8) >> 3); } - - - -/* Дворец? — по ЗАГРУЖЕННОМУ набору (pop_palace ставит pop_bg_load), а не по - * номеру уровня: так ветки отрисовки и картинки заведомо согласованы даже в - * момент смены. */ -#define PALACE (pop_palace) - -/* Декоративная панель над воротами — ТОЛЬКО в паласе (в подземелье над - * воротами не рисуется ничего). Индекс — модификатор тайла doortop. - * seg008:407 doortop_fram_top / seg008:453 doortop_fram_bot. */ -static const uint8_t DOORTOP_FRAM_TOP[4] = {0, 81, 83, 0}; -static const uint8_t DOORTOP_FRAM_BOT[4] = {78, 80, 82, 0}; - -/* Верх ворот: его рисует тайл НАД воротами (draw_tile_anim_topright, - * seg008:0568). Кадр — по открытости соседа снизу-слева; 68 — маска, - * mono-блит чёрным «продавливает» фон под створкой. - * Без этого над воротами оставался чёрный клин — виден у шва во дворце, - * где сверху идёт декоративная панель doortop. */ -static const uint8_t DOOR_FRAM_TOP[8] = {60, 61, 62, 63, 64, 65, 66, 67}; -#define GATE_TOP_MASK 68 - -/* topright тайла снизу-слева (seg008.c:410). */ -static void draw_topright(uint8_t tt, uint8_t tmod, int x, int dby) -{ - if (tt == 7 || tt == 12) { /* верх ворот */ - if (!PALACE) return; /* подземелье: ничего (seg008:413) */ - if (DOORTOP_FRAM_TOP[tmod & 3]) - pop_env_b(DOORTOP_FRAM_TOP[tmod & 3], x, dby); - return; - } - if (tt == 20) { pop_wall_b(2, x, dby); return; } - if (pop_tile_table[tt].topright_id) - pop_env_b(pop_tile_table[tt].topright_id, x, dby); -} - - -/* ---- Loose floors: кадры дрожащей плиты (seg008 loose_fram_*) ------- * - * Состояние pop_loose_modif[] живёт в pop_map. draw_tile рисует грани - * loose АНИМИРОВАННО по modif (как SDLPoP: сам тайл — лево/низ, ПРАВЫЙ - * СОСЕД — правую грань через draw_tile_anim_right). При modif==0 (покой/ - * статич. запекание) get_loose_frame=0 → базовые кадры 41/42/43. */ -static const uint8_t LOOSE_FRAM_RIGHT[12] = {42,71,42,72,72,42,42,42,72,72,72,0}; - -/* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора, - * из которой потом восстанавливает heal). В этом режиме дрожащие кадры - * ЧУЖИХ плит рисовать НЕЛЬЗЯ: транзиентный кадр законсервируется в копии, а - * так как запечка идёт двумя кадрами (по одному на страницу дабл-буфера), - * на страницах застынут РАЗНЫЕ кадры — вечное мерцание. Пример: упала плита - * (0,6); её запечка перерисовывает и соседа, а правый угол СОСЕДНЕЙ плиты - * (0,5), который рисуется в ячейке (0,6), был в этот момент в тряске. - * Фон обязан быть состоянием ПОКОЯ — анимация каждый кадр кладётся поверх - * (банк SPRITE, только видео-ОЗУ). */ -/* draw_leveldoor (seg008:1D29) — дверь уровня. Рисуется при обработке - * ПРАВОЙ половины (tile_left = 0x10), все куски со сдвигом +8px (xh+1): - * 99 низ лестницы (всегда), - * 144 марш лестницы за створкой (когда створка приподнята, modif != 0), - * 33 слайс створки — повторяется вниз с шагом 4px, пока не дойдёт до - * y = ybottom − modif: modif 0 = закрыто (створка на всю высоту), - * 43 = открыто (остаётся только верхняя кромка), - * 34 верх коробки двери. - * Куски непрозрачные (blitters_0_no_transp) — как в оригинале. */ -static void draw_leveldoor(uint8_t modif, int xh, int dmy) -{ - int x = (xh + 1) * 8; - int ybottom = dmy - 13; - int ylo = ybottom - (int)(modif & 3) - 48; /* leveldoor_ybottom */ - int y = ybottom - (int)modif; - /* leveldoor_right (seg008:1D29): правая кромка проёма — от xh ТЕКУЩЕГО - * тайла, то есть ПРАВОЙ половины двери (сюда мы попадаем из - * draw_tile_anim_right, разбирая левого соседа). - * - * +8 у дворцовых уровней — дословно seg008:1429 - * (`if (tbl_level_type[current_level]) leveldoor_right += 8;`): проём - * во дворце шире, чем в подземелье. Без этой строки Кид в анимации - * ухода на следующий уровень скрывался за кромкой РАНЬШЕ, чем нужно, - * потому что клип брался по ширине подземного проёма (найдено на - * уровне 4, обход 2026-08-17). pop_palace ставит pop_bg_load из того - * же tbl_level_type, что читает оригинал. */ - pop_leveldoor_right = xh * 8 + 48; - if (pop_palace) pop_leveldoor_right += 8; - pop_env_b(99, x, ybottom); - if (modif) - pop_env_b(144, x, ybottom - 4); /* лестница (комната ≠ стартовой) */ - for (;;) { - pop_env_b(33, x, ylo); - if (y > ylo) ylo += 4; - else break; - } - /* ИМЕННО после цикла: в оригинале clip_char читает уже доведённое - * значение (низ поднятой створки), а не стартовое. */ - pop_leveldoor_ybottom = ylo; - pop_env_b(34, x, dmy - 64); -} - -/* ---- draw_tile (seg008.c:155) — одна клетка ------------------------ */ -/* ---- КОНТЕКСТ ТАЙЛА (порт load_curr_and_left_tile, seg008:0339) ------- - * Не локали draw_tile, а file-scope переменные — ровно как curr_tile / - * curr_modifier / draw_xh / draw_main_y / draw_bottom_y у оригинала. - * - * Зачем: в draw_tile 57 вызовов, и КАЖДОЕ значение, живое через вызов, SDCC - * спиливал в стековый кадр — получались 26 байт кадра и 513 обращений - * `-N(ix)` (замер 2026-08-17: 23 700 тактов накладных на вызов при одном - * блите на тайл, docs/perf_green_phase.md §1.6). У file-scope переменных - * абсолютная адресация (`ld a,(nn)` — 13 тактов против 19) и спиливать - * нечего. Функция от этого не становится реентерабельной, но и не была: - * draw_tile ниоткуда себя не зовёт. */ -static int dt_row, dt_col; -static uint8_t dt_code, dt_lcode, dt_lmod; -static int dt_xh, dt_x, dt_dby, dt_dmy; -static const piece *dt_t, *dt_lt; -static uint8_t dt_rbl, dt_rblm, dt_wmod, dt_base_id; -static int dt_base_yb; - -static void draw_tile(int row, int col) -{ - dt_row = row; dt_col = col; - dt_code = pop_tile_code(dt_row, dt_col); - dt_lcode = pop_tile_code(dt_row, dt_col - 1); - dt_lmod = pop_tile_mod(dt_row, dt_col - 1); - /* Нажатая кнопка (seg008 get_tile_to_draw): при таймере связи >1 opener - * (0x0F) рисуется как ПОЛ (modif 0), closer (0x06) — как stuck (0x05). - * Модификатор кнопки = индекс LINKLOC. И для самого тайла, и для левого - * соседа (его правая грань). */ - if (dt_code == 0x0F) { if ((pop_doorlink2(pop_tile_mod(dt_row, dt_col)) & 0x1F) > 1) dt_code = 1; } - else if (dt_code == 0x06) { if ((pop_doorlink2(pop_tile_mod(dt_row, dt_col)) & 0x1F) > 1) dt_code = 5; } - if (dt_lcode == 0x0F) { if ((pop_doorlink2(dt_lmod) & 0x1F) > 1) { dt_lcode = 1; dt_lmod = 0; } } - else if (dt_lcode == 0x06) { if ((pop_doorlink2(dt_lmod) & 0x1F) > 1) dt_lcode = 5; } - dt_xh = POP_COL_XH[dt_col]; - dt_x = dt_xh * 8; - dt_dby = 63 * dt_row + 65; - dt_dmy = dt_dby - 3; - dt_t = &pop_tile_table[dt_code]; - dt_lt = &pop_tile_table[dt_lcode]; - - /* тайл снизу-слева (для topright). Ниже нижнего ряда — берём ряд 0 - * комнаты снизу (load_rowbelow, seg008:368): row_below_left_[dt_col] = - * room_B(0, dt_col-1); dt_col-1<0 → левая комната снизу = стена уровня. */ - if (dt_row + 1 > 2) { - int lc = dt_col - 1; - /* lc < 0 — угол (2,0): сосед снизу-слева лежит в ЧУЖОЙ комнате - * (room_BL). Её тайл (0,9) приходит одиннадцатым байтом below-ряда; - * «стена» там стоит, только если такой комнаты нет — как в - * load_rowbelow (seg008:368). См. BUG-SEAM-WEDGE-1. */ - if (lc < 0) dt_rbl = pop_t_below ? (uint8_t)(pop_t_below[10] & 0x1F) : 20; - else dt_rbl = pop_t_below ? (uint8_t)(pop_t_below[lc] & 0x1F) : 0; - /* Модификатора ряда снизу у нас нет (pop_t_below — только fg), а он - * нужен паласной панели над воротами. Ставим 0 = «панели нет»: - * случай узкий (ворота в комнате СНИЗУ, по диагонали от пустого - * тайла нижнего ряда), но расхождение с оригиналом честное. */ - dt_rblm = 0; - } else { - dt_rbl = pop_tile_code(dt_row + 1, dt_col - 1); - dt_rblm = pop_tile_mod(dt_row + 1, dt_col - 1); - } - - /* Пометка «фон трогали» — ОДНА на весь тайл, а не на каждый его кусок - * (pop_cd_batch_begin/end). Досрочных выходов у draw_tile нет, так что - * скобка гарантированно закрывается. */ - pop_cd_batch_begin(); - - /* --- draw_tile_anim_topright (seg008:0568): верх ВОРОТ снизу-слева. - * Условие дословно: свой тайл пуст / верх большой колонны / верх двери, - * а снизу-слева — ворота. --- */ - if ((dt_code == 0 || dt_code == 9 || dt_code == 12) && dt_rbl == 4) { - uint8_t om = (dt_rblm > 188) ? 188 : dt_rblm; - pop_env_b(GATE_TOP_MASK, dt_x, dt_dby); /* маска (mono, чёрным) */ - pop_env_b(DOOR_FRAM_TOP[(om >> 2) & 7], dt_x, dt_dby); - } - - /* --- floorright (seg008.c:392) — только can_see_bottomleft --- */ - if (dt_code == 0 || dt_code == 9 || dt_code == 12 || dt_code == 26) { - draw_topright(dt_rbl, dt_rblm, dt_x, dt_dby); - /* floor-right тень (blitters_9_black) на ЧЁРНОМ фоне = no-op - * (чёрный силуэт по чёрному) — не рисуем. Если tile_left имеет - * floor_right: dt_lt->floor_right. */ - } - - /* --- draw_tile_right (seg008.c:456) --- */ - if (dt_code != 20) { - if (dt_lcode == 20) { - /* Полоска на стене (seg008:510) — только палас и только если у - * стены не взведён старший бит модификатора. */ - if (PALACE && (dt_lmod & 0x80) == 0) - pop_env_b(84, dt_x + 3 * 8, dt_dmy - 27); - pop_wall_b(1, dt_x, pop_tile_table[20].right_y + dt_dmy); /* грань стены */ - } else if (dt_lcode == 0) { - if (dt_lmod <= 3 && BLUELINE_FRAM1[dt_lmod]) - pop_env_b(BLUELINE_FRAM1[dt_lmod], dt_x, BLUELINE_FRAM_Y[dt_lmod] + dt_dmy); - } else if (dt_lcode == 1) { - uint8_t num; - pop_env_b(42, dt_x, pop_tile_table[1].right_y + dt_dmy); /* правый треуг. пола */ - num = (dt_lmod <= 3) ? dt_lmod : 0; - /* seg008:501 — `if (num == !!level_type) return;`: в подземелье - * пропускается num==0, в паласе num==1. */ - if (num != (PALACE ? 1 : 0)) - pop_env_b(BLUELINE_FRAM3[num], dt_x, dt_dmy - 20); /* силуэт кладки */ - } else if (dt_lcode == 7 || dt_lcode == 12) { - /* Низ декоративной панели над воротами (seg008:506) — только - * палас; в подземелье у doortop right_id нулевой и ветка пустая. */ - if (PALACE && DOORTOP_FRAM_BOT[dt_lmod & 3]) - pop_env_b(DOORTOP_FRAM_BOT[dt_lmod & 3], dt_x, dt_lt->right_y + dt_dmy); - } else { - if (dt_lt->right_id) - pop_env_b(dt_lt->right_id, dt_x, dt_lt->right_y + dt_dmy); - /* Орнаментная лента соседа (seg008:486) — только палас. Она и - * даёт непрерывную полосу под окнами: stripe_id = 145 у пола, - * кнопок, зелья, loose, чомпера и меча. */ - if (PALACE && dt_lt->stripe_id) - pop_env_b(dt_lt->stripe_id, dt_x, dt_dmy - 27); - /* Основание факела (seg008:489): рисует ПРАВЫЙ сосед. */ - if (dt_lcode == 19 || dt_lcode == 30) - pop_env_b(146, dt_x, dt_dby - 28); - } - } - - /* --- draw_tile_anim_right (seg008.c:530) — статичные части. Для - * верхней полосы (dt_row<0, draw_tile_aboveroom) НЕ рисуется + защита от - * отрицательного индекса в pop_loose_modif. --- */ - if (dt_row >= 0) { - if (dt_lcode == 4) { /* gate: решётка */ - pop_gate_back_b(dt_lmod, dt_xh, dt_dby, dt_dmy); - } else if (dt_lcode == 11) { /* loose: правая грань (анимир. по modif соседа-loose) */ - pop_env_b(LOOSE_FRAM_RIGHT[pop_loose_frame(pop_loose_modif[dt_row * 10 + (dt_col - 1)])], dt_x, dt_dby - 1); - } else if (dt_lcode == 2) { /* spike: статич. кадр */ - uint8_t sf = pop_spike_frame(dt_lmod); - if (sf < 10 && SPIKES_FRAM_RIGHT[sf]) - pop_env_b(SPIKES_FRAM_RIGHT[sf], dt_x, dt_dmy - 7); - } else if (dt_lcode == 16) { /* дверь уровня */ - draw_leveldoor(dt_lmod, dt_xh, dt_dmy); - } - /* Пламя факела (seg008:560, chtab_1 id modifier+1) здесь, в статичной - * отрисовке тайла, не рисуем — его ведёт pop_torch_draw из - * pop_process_trobs каждый кадр. Но ЗАПЕКАЕТСЯ оно всё равно (там - * GFX_BANK_NORMAL): факел — чистый задний план, а самонакрытие кадров - * делает запекание безопасным. Подробности — в шапке pop_torch_draw. */ - } - - /* --- draw_tile_bottom (seg008.c:570) --- */ - if (dt_code == 20) { - dt_wmod = pop_wall_modifier(dt_row, dt_col); - if (!PALACE) /* во дворце тело стены даёт */ - pop_wall_b(POP_WALL_FRAM_BOTTOM[dt_wmod], dt_x, dt_dby); /* wall_pattern */ - /* заливками (seg008:576) */ - pop_wall_pattern_b(dt_row, dt_col, 0); - } else if (dt_t->bottom_id) { - pop_env_b(dt_t->bottom_id, dt_x, dt_dby); - } - - /* --- draw_loose (seg008.c:600) — нижняя грань (анимир. по modif). В - * верхней полосе (dt_row<0) это ПЛИТА-ПОТОЛОК (loose ряда 2 комнаты сверху): - * её состояние живёт отдельно, в pop_ceil_modif[dt_col] (pop_map). --- */ - if (dt_code == 11) - pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(dt_row >= 0 ? pop_loose_modif[dt_row * 10 + dt_col] - : pop_ceil_modif[dt_col])], dt_x, dt_dby); - - /* --- draw_tile_base (seg008.c:611). Верхняя полоса (dt_row<0) базу НЕ - * рисует (draw_tile_aboveroom) — только нижние/правые грани. --- */ - if (dt_row >= 0) { - dt_base_id = dt_t->base_id; - dt_base_yb = dt_dmy; - if (dt_lcode == 26 && dt_code == 12) { - /* «Lattice + door A» (seg008:622): у doortop своей базы нет - * (dt_base_id 0), и когда слева от него стоит арка (lattice_down), - * пара рисуется ОДНИМ спрайтом 6, опущенным на 3 px. Без этой - * ветки на месте тайла оставалась чёрная дыра — уровень 5, - * комната 12, тайл (0,9) (BUG-LATTICE-DOORTOP). */ - dt_base_id = 6; - dt_base_yb += 3; - } - else if (dt_code == 11) /* loose: левая грань (анимир.) */ - dt_base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[dt_row * 10 + dt_col])]; - else if (dt_code == 0x0F && dt_lcode == 0 && !PALACE) /* opener, слева пусто */ - dt_base_id = 148; /* левая половина без пола — только */ - /* подземелье (seg008:628) */ - if (dt_base_id) - pop_env_b(dt_base_id, dt_x, dt_t->base_y + dt_base_yb); - } - - /* --- draw_tile_anim (seg008.c:0B2B) — левый кадр выдвинутых пик в - * СВОЕЙ ячейке (анимир. по своему modif). Без него остриё пики - * рисуется только правым соседом со сдвигом → шахта над самой пикой - * пустая. */ - if (dt_row >= 0 && dt_code == 2) { - uint8_t sf = pop_spike_frame(pop_tile_mod(dt_row, dt_col)); - if (sf > 0 && sf < 10 && POP_SPIKES_FRAM_LEFT[sf]) - pop_env_b(POP_SPIKES_FRAM_LEFT[sf], dt_x, dt_dmy - 2); - } - /* Чомпер (тот же draw_tile_anim, case tiles_18_chomper): нижняя челюсть - * на draw_main_y, поверх неё кровь (если кого-то перемололо), затем - * верхняя челюсть со своим подъёмом. Всё это BACKtable — то есть ПОД - * персонажем; передний слой рисует fore-проход. */ - if (dt_row >= 0 && dt_code == 0x12) { - uint8_t cm = pop_tile_mod(dt_row, dt_col); - uint8_t pose = pop_chomp_pose(cm); - pop_env_b(CHOMP_FRAM_BOT[pose], dt_x, dt_dmy); - if (cm & 0x80) - pop_env_b((uint8_t)(pose + 114), dt_x + 8, dt_dmy - 6); - if (CHOMP_FRAM_TOP[pose]) - pop_env_b(CHOMP_FRAM_TOP[pose], dt_x, dt_dmy - CHOMP_FRAM_Y[pose]); - } - /* Меч-предмет на полу (тот же draw_tile_anim, case tiles_22_sword): - * chtab_1 (наш pot-атлас), id = (modif==1)+10, низ на draw_main_y-3. - * В оригинале это midtable (рисуется вместе с объектами) — у нас статикой - * в фоне: пока меч лежит, он не анимируется, а Kid и так поверх фона. */ - if (dt_row >= 0 && dt_code == 22) - pop_pot_b((uint8_t)((pop_tile_mod(dt_row, dt_col) == 1) + 10), dt_x, dt_dmy - 3); - - /* --- draw_tile_fore (seg008.c:690) --- */ - if (dt_code == 20) { - dt_wmod = pop_wall_modifier(dt_row, dt_col); - if (!PALACE) /* seg008:711 */ - pop_wall_b(POP_WALL_FRAM_MAIN[dt_wmod], dt_x, dt_dmy); /* основная грань */ - pop_wall_pattern_b(dt_row, dt_col, 1); - } - if (dt_code == 0x12) { /* чомпер: передние зубья + кровь. - * Отдельной веткой, как в оригинале: - * у записи 0x12 fore_id == 0, и через - * таблицу этот слой не идёт. */ - uint8_t cm = pop_tile_mod(dt_row, dt_col); - uint8_t pose = pop_chomp_pose(cm); - /* Передние куски чомпера и его кровь лежат в pop_fore.atl - * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит - * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ - pop_fore_b(POP_CHOMP_FRAM_FOR[pose], dt_x, dt_dmy); - if (cm & 0x80) - pop_fore_b((uint8_t)(pose + 119), dt_x + 8, dt_dmy - 6); - } - if (dt_code == 10) { /* зелье: chtab_1, не env fore_id. - * Пузырёк — динамика (pop_potion_draw). */ - pop_potion_flask(dt_row, dt_col, pop_tile_mod(dt_row, dt_col)); - } else if (dt_t->fore_id) { - pop_fore_b(dt_t->fore_id, dt_t->fore_x * 8 + dt_x, dt_t->fore_y + dt_dmy); - } - pop_cd_batch_end(); /* одна пометка на весь тайл */ -} - - -/* ---- Loose floors — динамическая перерисовка (seg008 draw_loose) ---- * - * Порт SDLPoP redraw_tile_height: каждый кадр анимации перерисовать - * ПОЛНОСТЬЮ и loose-тайл, и ПРАВЫЙ СОСЕД (грани loose анимируются по modif - * внутри draw_tile). */ -void pop_loose_shake_draw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* heal возвращает печёный фон обоих тайлов из ОЗУ-копии, поверх — - * перерисовка обоих тайлов с дрожащим кадром (draw_tile берёт кадр из - * pop_loose_modif). Порт redraw_tile_height (loose + правый сосед). - * NB: печёный кадр-0 может слегка просвечивать по кромкам — чистое - * решение (bake тайла как empty + рисовать loose всегда динамически) - * отложено; wipe-в-чёрный делал плиту невидимой — не годится. */ - /* Ширина 58, а не 64 = «две клетки»: реальный след дрожащей плиты — - * свой тайл (верх/левая грань 32 px) плюс правая грань, которая уходит - * в соседнюю клетку на 26 px (25 во дворце). Габариты сняты из - * каталогов атласов: 41/69/70 = 32x13-14, 43/73/74 = 32x3, - * 42/71/72 = 26x15-16. Задача HEAL-WIDTH. */ - pop_heal_off(x, 63 * row + 46, 58, 24); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); /* loose: лево+низ (анимир.) */ - if (col + 1 < 10) - draw_tile(row, col + 1); /* сосед: правая грань loose (анимир.) + его пол */ - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Вернуть ТОЛЬКО слой anim чомпера — порт ветки redraw_frames_anim в - * redraw_needed (seg008:0211). Контракт и разбор — в шапке объявления - * (pop_bg.h). - * - * Чем это отличается от pop_chomp_redraw и почему нужна отдельная функция. - * Пометку ставит АНИМАЦИЯ ФАКЕЛА: пламя лежит в ячейке ПРАВОГО соседа - * (seg008:560), то есть поверх чомпера, и запекается в фон каждый кадр. - * Возвращать после него надо ровно графику чомпера — а pop_chomp_redraw - * делал heal 32x64 плюс ПОЛНЫЙ draw_tile, то есть пересобирал тайл со всеми - * слоями (правая грань, база, низ, loose), которых пламя не касалось. - * Замер 11/15 (2026-08-19): 190 260 тактов на этот единственный тайл, 24 % - * работы кадра. - * - * heal не нужен: поза чомпера здесь НЕ меняется (свою анимацию ведёт - * pop_chomp_redraw по своей пометке), стирать нечего — рисуем ту же - * графику поверх свежего пламени. Оригинал на пометку anim wipe тоже не - * делает: у него это отдельный счётчик wipe_frames. - * - * Передний слой (зубья, POP_CHOMP_FRAM_FOR) сюда НЕ входит — как и в - * оригинале, где fore идёт по своему счётчику redraw_frames_fore. Геометрия - * это подтверждает: пламя занимает 18 строк с низом на 63*row+22, передние - * зубья — на dmy = 63*row+62, то есть на 40 строк ниже; пересекается с огнём - * только ВЕРХНЯЯ челюсть (подъём до 0x32 = 50 px), а она в back-слое. */ -void pop_chomp_anim_draw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - int dmy = 63 * row + 62; /* dby - 3, как в draw_tile */ - uint8_t cm = pop_tile_mod(row, col); - uint8_t pose = pop_chomp_pose(cm); - - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_cd_batch_begin(); /* одна пометка на все куски */ - pop_env_b(CHOMP_FRAM_BOT[pose], x, dmy); - if (cm & 0x80) /* кого-то перемололо */ - pop_env_b((uint8_t)(pose + 114), x + 8, dmy - 6); - if (CHOMP_FRAM_TOP[pose]) - pop_env_b(CHOMP_FRAM_TOP[pose], x, dmy - CHOMP_FRAM_Y[pose]); - pop_cd_batch_end(); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать пики тайла (row,col) на back-странице по ЖИВОМУ modif - * (pop_trob). Кадр выдвижения рисует ПРАВЫЙ сосед (draw_tile ветка lcode==2 - * читает lmod = pop_t_bg[row*10+col] = живой modif пики). pop_t_bg должен указывать - * на room_modif (enter_room передаёт его как bg). Порт redraw_21h/draw_tile. - * heal берёт печёный статич. фон, поверх — динамич. кадр (шипы над полом). */ -void pop_spike_redraw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* Порт redraw_21h -> redraw_tile_height (seg007:0218): wipe + ПОЛНЫЙ - * redraw ДВУХ тайлов — своего и правого соседа (остриё рисуется в его - * ячейке). Именно ПОЛНЫЙ: рисовать только два спрайта остриёв нельзя — - * порядок слоёв внутри тайла (draw_tile_anim_right идёт ПЕРВЫМ, база и - * fore соседа ложатся ПОВЕРХ) тогда теряется, и остриё лезет на колонну - * справа. Заодно draw_tile сам восстанавливает вклад соседних пик: - * в ячейке col — правое остриё пики col-1 (ветка lcode==2). - * Шипы выдвигаются выше линии пола (dmy-7), поэтому heal с запасом вверх - * (63*row+34 .. +74); ширина 64 = обе ячейки. */ - pop_heal_off(x, 63 * row + 34, 64, 40); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); - if (col + 1 < 10) - draw_tile(row, col + 1); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Чомпер: перерисовка кадра анимации (порт redraw_20h/draw_trob). Челюсти - * поднимаются высоко над линией пола (верхний кусок уходит на 0x32 = 50 px - * вверх от dmy), поэтому heal берём на всю высоту тайла. Правый сосед НЕ - * нужен: в отличие от пик, все куски чомпера рисуются в СВОЕЙ ячейке. */ -void pop_chomp_redraw(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* РОВНО 32x60 — весь чомпер помещается в свой тайл, и это его точный - * след (замечание пользователя, проверено по каталогу атласа): - * нижняя челюсть 101/102 = 32x60 низом на dmy = 63*row+62, то есть - * занимает 63*row+3 .. +62; - * верхние челюсти дают ТОТ ЖЕ верх — подъём 0x25 при высоте 23, - * 0x2F при 13 и 0x32 при 10 все три дают 63*row+3; - * кровь 114..118 шириной 6 рисуется на x+8, то есть внутри 32. - * Было 64 «на всю высоту тайла» — четыре лишние строки. */ - pop_heal_off(x, 63 * row + 3, 32, 60); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - draw_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать ЛЕВЫЙ шов (col0) на back-странице по живому modif соседа — - * ворота соседней комнаты слева (portcullis room8) видны в col0 текущей - * комнаты через draw_gate_back (draw_tile ветка lcode==4, lmod = pop_t_lbg[0]). - * pop_t_lbg (lcol_bg) должен указывать на живой modif (SprPoP обновляет из - * room_modif соседа перед вызовом). Bar-в-чёрный + redraw (как loose bake): - * heal вернул бы ЗАПЕЧЁННОЕ состояние ворот → при открытии нижние бары - * оставались бы; чёрная плита стирает старые бары в VRAM+ОЗУ-копию. */ -void pop_room_redraw_seam_left(uint8_t rows) __banked -{ - int8_t r; - /* rows — битовая маска рядов 0..2: перерисовываем ТОЛЬКО те, где openness - * реально изменился. Раньше ряд был жёстко нулевым, потому что на уровне 1 - * решётка соседа стояла в (0,9); на уровне 4 она в (1,9), и открытые ворота - * оставались нарисованными закрытыми (BUG-GATE-SEAM-ROW1). */ - for (r = 0; r < 3; r++) { - int yt = POP_YOFF + 63 * r; - if (!(rows & (1 << r))) continue; - gfx_set_bank(GFX_BANK_NORMAL); - /* Полосу кладки НАД рядом НЕ трогаем: её низ на room-space 63*r+2, а - * бары ворот начинаются с 63*r+3 (gate_top_y = dby−62). Раньше bar шёл - * от POP_YOFF и стирал потолок, из-за чего приходилось перерисовывать - * ещё и draw_tile(-1,0) — вдвое дороже на КАЖДОМ кадре анимации. */ - pop_bar_black(0, yt + 3, 32, 62); /* col0 этого ряда (бары ворот) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(r, 0); /* фон col0 + бары ворот (живой modif) */ - gfx_set_bank(GFX_BANK_NORMAL); - } -} - -/* Ширина прямоугольника запечки, ОБРЕЗАННАЯ по правому краю экрана. - * - * Точечные запечки берут ширину «свой тайл + свес соседа» (40, 60 или 64 при - * шаге тайла 32) — для последней колонки это уезжает за 320. А заливка и - * копия по контракту НЕ КЛИПУЮТ (см. шапку _gfx_recthfill256: «Клиппинга НЕТ, - * координаты обязаны быть валидны») — и правильно, что не клипуют: проверка - * координат стоила бы дороже самой заливки. Значит обрезать обязан - * вызывающий. - * - * Чем это было: падение плиты (1,8) помечает соседа (1,9), pop_floor_bake - * заливал x=288 шириной 60, то есть 28 пикселей за экраном, и эти 28 всплывали - * ЧЁРНОЙ ПОЛОСОЙ у левого края — поверх стража в (1,0), причём только на одной - * странице дабл-буфера, то есть с мерцанием (найдено пользователем - * 2026-08-17, уровень 2 комната 4; трасса заливок: - * BAR x=288 y=117 w=60 h=39, а расхождение страниц — ровно x 0..27, y 117..155). - * - * Обрезка ничего не теряет: правее 320 восстанавливать нечего. */ -static uint8_t bake_w(int x, uint8_t w) -{ - if (x >= 320) return 0; /* весь прямоугольник за экраном */ - return (x + (int)w > 320) ? (uint8_t)(320 - x) : w; -} - -/* ---- ЗАПЕЧКА НА ВТОРУЮ СТРАНИЦУ — копией, а не пересчётом ----------- * - * Точечные запечки ставятся с pages = 2, то есть срабатывают ДВА кадра подряд - * — по разу на каждую страницу дабл-буфера, — и оба раза считают одно и то же. - * А после первого раза нужный прямоугольник уже лежит в ОЗУ-копии первой - * страницы, и его можно просто скопировать: gfx_copy_page берёт источником - * ОЗУ-копию НЕактивной страницы (то есть ЧИСТЫЙ фон — спрайты рисуются банком - * без тени и в копию не попадают), а приёмник обновляет и в видео-ОЗУ, и в - * ОЗУ-копии. - * - * Замер 2026-08-17: полная запечка щебня — 179 914 такта, колодца — 138 318; - * копия прямоугольника 60x39 стоит ~30 000, а 64x9 — ~14 000. - * - * Слот на тайл помнит, НА КАКОЙ странице сделана первая запечка (+1; 0 = не - * было). Копируем только если первая была на ДРУГОЙ странице и дабл-буфер - * включён; иначе честно пересчитываем. Такая проверка выдерживает и - * переплетение двух запечек в одном кадре, и отключённый дабл-буфер (чит - * SPACE), и смену комнаты между кадрами. */ -static uint8_t bake_pg[30], bake_pg_above[10]; - -static uint8_t bake_copy(uint8_t *slot, int x, int ytop, int w, int h) -{ - uint8_t pg = (uint8_t)(gfx_get_draw_page() & 1); - gfx_rect_t r; -#ifdef POP_DBG_NO_BAKE_COPY - (void)x; (void)ytop; (void)w; (void)h; /* A/B: копия выключена целиком */ - *slot = (uint8_t)(pg + 1); - return 0; -#endif - if (!*slot || (uint8_t)(*slot - 1) == pg || - gfx_get_draw_page() == gfx_get_visible_page()) { - *slot = (uint8_t)(pg + 1); /* это ПЕРВАЯ запечка */ - return 0; - } - *slot = 0; - if (pop_upside) ytop = POP_FLIP_TOP(ytop, h); /* копируем ЭКРАННЫЙ прямоугольник */ - r.x = (int16_t)x; r.y = (int16_t)ytop; - r.w = (uint16_t)w; r.h = (uint16_t)h; - gfx_copy_page(&r, GFX_COPY_DIRECT); - pop_cd_touch(x, ytop, w, h); /* область изменилась и на этой странице */ - return 1; -} - -/* Перепометка тайла: содержимое могло измениться (кнопка с идущим таймером - * перерисовывается каждый кадр РАЗНОЙ), поэтому копия со второй страницы - * больше не годится — гасим слот, следующая запечка пойдёт честно. - * Контракт и мотив — в _pop_bg.h. */ -void pop_bake_slot_reset(uint8_t tilepos) -{ - if (tilepos < 30) bake_pg[tilepos] = 0; -} - -void pop_bake_slot_reset_above(uint8_t col) -{ - if (col < 10) bake_pg_above[col] = 0; -} - -/* Смена комнаты/уровня: запечки прошлой комнаты недоделанными не остаются - * (pop_trob_room_changed сбрасывает пометки), но слоты обнулить надо — иначе - * первый же тайл с тем же номером в новой комнате получит копию вместо - * честной запечки. */ -void pop_bake_forget(void) __banked -{ - uint8_t i; - for (i = 0; i < 30; i++) bake_pg[i] = 0; - for (i = 0; i < 10; i++) bake_pg_above[i] = 0; -} - -/* ---- Плита-потолок (loose ряда 2 комнаты СВЕРХУ) ------------------- * - * В полосе кладки у потолка (наш ряд −1) виден только НИЗ плиты - * (draw_tile_aboveroom: bottom+loose, всё выше отрезано клипом POP_YOFF). - * Дрожащий кадр берётся из pop_ceil_modif[col] (см. draw_loose выше). - * shake — на текущей (back) странице поверх фона; bake — «запечь» пустоту - * после провала (NORMAL, в ОЗУ-копию, чтобы heal её сохранял). */ - -/* Полоса кладки у потолка: дрожащая плита ряда −1 — порт redraw_needed_above - * (seg008:0221). - * - * Оригинал рисует ТОЛЬКО СВОЮ колонку: кусок, свисающий вправо, кладёт её же - * draw_tile_right. Здесь дополнительно звался `draw_tile(-1, col + 1)` — - * целый соседний тайл, — и это удваивало работу. Замер 2026-08-13: пик - * зелёного блока 887 000 тактов при кадровом интервале 430 000 состоял ровно - * из шести вызовов этой функции, то есть двенадцати отрисовок тайла. - * - * Батчинг смежных колонок (один heal на диапазон) пробовался и убран: плиты - * стартуют со случайными задержками (check_fall_flo), в кадре дрожат - * разрозненные колонки, пробег почти всегда длиной в одну — механика не - * окупалась, но крутилась каждый кадр. */ -void pop_ceil_shake_draw(int col) __banked -{ - int x = POP_COL_XH[col] * 8; - pop_heal_off(x, 0, 64, CEIL_BAND_H); - /* Пометка «фон трогали» — ОДНА на восстановленный прямоугольник: пока - * стоит окно (ниже), pop_blit_b пометок не ставит. Область та же, что у - * heal'а, — он её и стирает. */ - pop_cd_touch(x, POP_YOFF, 64, CEIL_BAND_H); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_t_clip_top = POP_YOFF; - pop_t_win_set(x, POP_YOFF, 64, CEIL_BAND_H); /* восстанавливаем ровно полосу */ - draw_tile(-1, col); - pop_t_win_clear(); - pop_t_clip_top = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_ceil_bake_empty(int col) __banked -{ - int x = POP_COL_XH[col] * 8; - uint8_t bw = bake_w(x, 64); /* обрезка по краю экрана — см. bake_w */ - /* Вторая страница — копией с первой (см. bake_copy). */ - if (bake_copy(&bake_pg_above[col], x, POP_YOFF, bw, CEIL_BAND_H + 1)) return; - gfx_set_bank(GFX_BANK_NORMAL); - /* Отдельного pop_cd_touch тут не надо: pop_bar_black метит сам, и ровно - * этот же прямоугольник (было два вызова на одну область). */ - if (bw) pop_bar_black(x, POP_YOFF, bw, CEIL_BAND_H + 1); /* стереть плиту в ОЗУ-копии */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_clip_top = POP_YOFF; - /* Окно = ровно стёртая полоса. Главный выигрыш здесь не в отсеве, а в - * КЛИПЕ: куски ряда 0 высотой 63 px рисовались целиком (клип был только - * сверху, по pop_t_clip_top), хотя восстановить надо девять строк — - * отсюда 21 447 такта на блит против 14 384 в pop_floor_bake. */ - pop_t_win_set(x, POP_YOFF, bw, CEIL_BAND_H + 1); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - /* Восстанавливаем ВСЁ, чья графика попадает в стёртую полосу, а не только - * два тайла ряда −1 (BUG-LOOSE-3). Куски тайла рисуются ВВЕРХ от своей - * нижней грани и свисают ВПРАВО, поэтому в полосу над тайлом col лезут: - * • ряд −1, колонки col−1..col+1 — сама полоса кладки у потолка; - * • ряд 0, колонки col−1..col+1 — их верхушки заходят в те же 8 px. - * Раньше перерисовывались только (−1,col) и (−1,col+1), и в полосе - * оставался чёрный прямоугольник ~13×3 px (замер: экранные y 47..52 при - * полосе 44..52), который heal возвращал каждый кадр. Признак, что дело - * именно в запечке: после выхода из комнаты и возврата бара нет. */ - { - int c0 = (col > 0) ? col - 1 : 0; - int c1 = (col + 1 < 9) ? col + 1 : 9; - int c; - for (c = c0; c <= c1; c++) draw_tile(-1, c); - for (c = c0; c <= c1; c++) draw_tile(0, c); - } - pop_t_bake_rest = 0; - pop_t_win_clear(); - pop_t_clip_top = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* ---- Анимация факела и зелья (динамика, каждый кадр) ---------------- * - * Оба кадра рисуются ПОВЕРХ статического фона и стираются heal'ом своей - * области (фон запечён БЕЗ них). Факел: пламя chtab_1 id modifier+1 в - * ячейке ПРАВОГО соседа (seg008:560: xh = draw_xh + 1, ybottom = - * draw_main_y − 40). Зелье: маска (23, «прорезает» фон) + кадр пузырька - * potion_fram_bubb[modif & 7] на xh+3/xl=1, ybottom = draw_main_y − - * (pot_size<<2) − 14 (seg008:668). */ -void pop_torch_draw(int row, int col, uint8_t modif) __banked -{ - /* Пламя рисует ПРАВЫЙ сосед со своим draw_xh: xh = POP_COL_XH[col+1] + 1 - * (seg008:560), т.е. x = (col+1)*32 + 8 — как и основание факела (env - * 146), которое тоже лежит в ячейке соседа. */ - int x = (col + 1 < 10 ? POP_COL_XH[col + 1] : POP_COL_XH[col] + 4) * 8 + 8; - int yb = 63 * row + 62 - 40; - if (modif >= 9) return; - /* heal НЕ нужен: оригинал рисует пламя blitters_0_no_transp (seg008 - * draw_tile_anim_right), и все 9 кадров лежат на общем канвасе 16x18 — - * непрозрачный блит сам полностью накрывает предыдущий кадр. Кадры - * упакованы с opaque=True (pop_pack_bg POT_FLAME_IDS). - * - * И ровно поэтому пламя ЗАПЕКАЕТСЯ (GFX_BANK_NORMAL: видео-ОЗУ + ОЗУ-копия), - * а не рисуется в SPRITE поверх фона. Запечь его безопасно именно из-за - * самонакрытия — следующий кадр сотрёт предыдущий сам, «протухнуть» в - * копии нечему. А выигрыш принципиальный: точечные перерисовки соседних - * тайлов начинаются с heal из ОЗУ-копии, и незапечённое пламя они стирали - * — чомпер (0,7) комнаты 23 уровня 4 healит x 224..255 / y 30..93 и - * съедал факел (0,6), который рисуется в ячейке правого соседа. С - * запеканием heal возвращает огонь сам, а челюсти ложатся ПОВЕРХ него — - * тот же z-порядок, что у оригинала, где draw_tile_anim_right (пламя - * левого соседа) идёт до draw_tile_anim (сам чомпер). - * - * Пузырёк ЗЕЛЬЯ так нельзя: он ползёт вверх и себя не накрывает, ему - * нужен heal — pop_potion_draw остаётся в SPRITE. */ - gfx_set_bank(GFX_BANK_NORMAL); - pop_pot_b((uint8_t)(modif + 1), x, yb); - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_potion_draw(int row, int col, uint8_t modif) __banked -{ - uint8_t type = potion_type(modif); - int pot_size = (type >= 2 && type < 5) ? 1 : 0; - int x = (POP_COL_XH[col] + 3) * 8 + 1; - int yb = 63 * row + 62 - (pot_size << 2) - 14; - uint8_t bubb; - if (type == 0) return; - bubb = POTION_FRAM_BUBB[modif & 7]; - /* Цвет пузырька по ТИПУ зелья (draw_tile_anim, seg008:652): 3/4 (перо / - * переворот) — зелёный, 5/6 (вред / открыть ворота) — синий, остальные - * (1 лечение, 2 склянка жизни) — красный. У нас цвет запечён в спрайт - * при упаковке (mono-блиттера с параметром цвета нет), поэтому «цвет» = - * другой набор кадров: id 30..36 / 40..46 вместо 16..22 (pop_pack_bg.py). - * Кадр 0 («пузырька нет») общий — его подменять нечем и не нужно. */ - if (bubb) { - if (type == 3 || type == 4) - bubb = (uint8_t)(POP_POT_BUBB_GREEN + (bubb - POTION_FRAM_BUBB[1])); - else if (type == 5 || type == 6) - bubb = (uint8_t)(POP_POT_BUBB_BLUE + (bubb - POTION_FRAM_BUBB[1])); - } - pop_heal_off(x - 1, yb - 10, 8, 12); - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_pot_b(POT_MASK_ID, x, yb); /* маска (под пузырьком) */ - pop_pot_b(bubb, x, yb); /* кадр пузырька */ - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Стереть ЗАПЕЧЁННОЕ пламя факела (row,col) с ТЕКУЩЕЙ draw-страницы и - * вернуть на его место фон покоя. - * - * Нужно ровно одному месту — перевороту экрана (pop_flip_screen). Пламя - * рисуется банком 0x50, то есть запекается и в ОЗУ-копию (см. шапку - * pop_torch_draw: heal'а у него нет, каждый следующий кадр непрозрачно - * накрывает предыдущий). Отражение страницы утаскивает его в зеркальную - * позицию, где накрывать уже нечем — и языки огня остаются по комнате - * навсегда. Стерев их ДО отражения, мы отражаем чистый фон и не платим за - * полную перерисовку комнаты (14.5 кадра против 2.1 у копии, замер MAME). - * - * Прямоугольник — канвас пламени 16x18 в ячейке ПРАВОГО соседа (seg008:560, - * те же координаты, что у pop_torch_draw). */ -void pop_torch_wipe(int row, int col) __banked -{ - int x = (col + 1 < 10 ? POP_COL_XH[col + 1] : POP_COL_XH[col] + 4) * 8 + 8; - int yb = POP_YOFF + 63 * row + 62 - 40; - /* У факела в колонке 9 канвас пламени лежит на x = 328, то есть ЦЕЛИКОМ за - * правым краем — заливать нечего, а bar не клипует (см. bake_w). */ - uint8_t tw = bake_w(x, 16); - pop_cd_touch(x, yb - 17, 16, 18); /* bar мимо pop_blit_b */ - gfx_set_bank(GFX_BANK_NORMAL); - if (tw) pop_bar_black(x, yb - 17, tw, 18); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой */ - draw_tile(row, col); - if (col + 1 < 10) draw_tile(row, col + 1); - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Перерисовать тайл КНОПКИ (row,col) на back-странице: нажатая/отжатая - * (draw_tile подставляет пол/stuck по таймеру связи). Bar-в-чёрный + - * redraw — иначе «шишка» отжатой кнопки (base 147) осталась бы при переходе - * в пол. Звать из pop_process_trobs для кнопок текущей комнаты. */ -void pop_floor_bake(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - int yb = POP_YOFF + 63 * row; - uint8_t bw = bake_w(x, 60); /* обрезка по краю экрана — см. bake_w */ - /* Вторая страница — копией с первой (см. bake_copy). */ - if (bake_copy(&bake_pg[row * 10 + col], x, yb + 26, bw, 39)) return; - /* Пометку ставит сам pop_bar_black — по тому же прямоугольнику; отдельный - * pop_cd_touch тут был вторым вызовом на одну область (4 502 такта). */ - /* Wipe СВОЕЙ ячейки + правой грани (заходит в соседа) + перерисовка пола. - * НИЗ строго yb+64 (≈ низ передней грани пола): ниже — СТЕНА ряда ниже - * (высокий спрайт), которую тут не перерисовываем → иначе чёрный бар. */ - gfx_set_bank(GFX_BANK_NORMAL); - if (bw) pop_bar_black(x, yb + 26, bw, 39); - gfx_set_bank(GFX_BANK_TRANSPARENT); - /* ОКНО КЛИПА ЗДЕСЬ ОБЯЗАТЕЛЬНО — и не ради скорости. - * - * Без него draw_tile рисует тайлы ЦЕЛИКОМ, то есть пишет ШИРЕ бара, а - * bake_copy переносит на вторую страницу ровно бар — и всё, что легло вне - * него, на второй странице остаётся прежним. Страницы расходятся, и это - * видно как МЕРЦАНИЕ через кадр (найдено пользователем 2026-08-17: - * уровень 1, комната 6, Кид на кнопке (0,2) — дрожала нижняя грань - * переднего торца кнопки). С окном запечка и копия совпадают по - * построению. - * - * По скорости окно САМО ПО СЕБЕ убыточно, и это проверено трижды - * (179 914 -> 188 417): клипованный путь дороже быстрого на ~1 500 такта - * на каждом из 7,6 блитов, а режет он только редкие высокие куски. Но - * оно открывает копию второй страницы, а та экономит ~145 000 — так что - * пара «запечка + копия» всё равно вдвое дешевле двух запечек. - * - * Что бар покрывает ВСЁ изменившееся — это инвариант самого бара (иначе - * запечка не работала бы и без копии). */ - pop_t_win_set(x, yb + 26, bw, 39); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - draw_tile(row, col); - if (col + 1 < 10) draw_tile(row, col + 1); - pop_t_bake_rest = 0; - pop_t_win_clear(); - gfx_set_bank(GFX_BANK_NORMAL); -} - -void pop_button_redraw(int row, int col) __banked { pop_floor_bake(row, col); } - -/* Перерисовать ПРАВУЮ половину двери уровня (в её ячейке рисуется створка, - * см. draw_leveldoor) на back-странице С ЗАПЕЧКОЙ в ОЗУ-копию: створка едет, - * а heal обязан возвращать её ТЕКУЩЕЕ положение, а не запечённое закрытое. - * Куски двери непрозрачные — wipe не нужен. */ -void pop_leveldoor_redraw(int row, int col) __banked -{ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(row, col); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Ворота ВНУТРИ комнаты: перерисовать бары по живому modif (порт draw_trob, - * seg007:01E6 — им заканчивается animate_door). (row,col) — сами ворота; - * решётку рисует ячейка ПРАВОГО соседа (draw_tile, ветка lcode==4), поэтому - * wipe и redraw идут по ней. Логика ровно как у левого шва - * (pop_room_redraw_seam_left), только колонка произвольная. - * - * Bar-в-чёрный обязателен: бары висят в видео-ОЗУ и ОЗУ-копии, и при - * ПОДЪЁМЕ решётки heal вернул бы запечённые нижние бары. Полоса — ровно - * зона решётки: от gate_top_y (dby−62 = 63*row+3) до низа (63*row+64); - * выше начинается ряд −1, ниже — стена ряда ниже. - * - * Ворота в col9: их бары рисуются уже в СОСЕДНЕЙ комнате, в отрисованной их - * не видно — оригинал такой trob тоже пропускает - * (get_trob_right_pos_in_drawn_room → 30). Для взгляда из комнаты справа - * работает pop_room_redraw_seam_left. */ -void pop_gate_redraw(int row, int col) __banked -{ - int x, yt; - if (col + 1 > 9 || row < 0 || row > 2) return; - x = POP_COL_XH[col + 1] * 8; - yt = POP_YOFF + 63 * row; - pop_bar_black(x, yt + 3, 32, 62); /* зеркалится сама (переворот) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - draw_tile(row, col + 1); - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Запечь ПУСТОТУ на месте упавшего loose (текущая страница). Порт - * redraw_at_cur_mob (seg007:132C): перерисовать сам тайл (теперь empty) И - * тайл СПРАВА (его левая грань зависит от нашего кода: пока был loose — - * рисовал loose-правый-край pop_env_b(42); теперь пусто → чистая грань). - * pop_t_fg[pos] уже = 0 (pop_map). Чёрная плита (NORMAL) стирает старые - * пиксели пола в видео-ОЗУ + ОЗУ-копию, поверх — новый статич. фон. */ -void pop_loose_bake_empty(int row, int col) __banked -{ - int x = POP_COL_XH[col] * 8; - /* col+1 читаем ТОЛЬКО в границах массива: у последней колонки соседа нет, - * а POP_COL_XH[10] — чтение за концом (10 элементов). */ - int xr = (col + 1 < 10) ? POP_COL_XH[col + 1] * 8 : 0; - int yb = 63 * row + 46; - /* Чёрная плита (opaque NORMAL — пишет в VRAM И ОЗУ-копию акселератора): - * стирает ЗАПЕЧЁННЫЙ пиксель-в-пиксель loose-пол с обоих тайлов, иначе - * heal вернул бы старый пол из ОЗУ-копии. Ширина 40 — кусок пола - * заходит на x+32..+40. */ - /* НИЗ строго 63*row+65 = низ собственной графики плиты (bottom_id 43/73/74 - * стоит ровно на dby; base 41/69/70 — до dmy=62; правая грань 42/66/67 — - * до dby-1). Ниже начинается СТЕНА ряда ниже (высокий спрайт), которую - * здесь не перерисовываем: заливка на 9 строк глубже оставляла ЧЁРНЫЙ БОКС - * под соседним столбом, причём в ОЗУ-копии — то есть heal возвращал его - * снова, и на второй странице дабл-буфера его не было → мерцание. - * Тот же урок уже учтён в pop_floor_bake. */ - yb += POP_YOFF; - /* bar идёт мимо pop_blit_b — пометить область самим (DRAW-COST). */ - pop_cd_touch(x, yb, 72, POP_YOFF + 63 * row + 66 - yb); - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - if (bake_w(x, 40)) pop_bar_black(x, yb, bake_w(x, 40), POP_YOFF + 63 * row + 65 - yb + 1); /* сам тайл: +40 (кусок пола заходит вправо; сосед перерисуется) */ - if (col + 1 < 10) - if (bake_w(xr, 32)) pop_bar_black(xr, yb, bake_w(xr, 32), POP_YOFF + 63 * row + 65 - yb + 1); /* сосед: РОВНО 32 — не залезть в col+2 */ - /* Новый статич. фон: сам тайл (empty → «стена вниз» topright комнаты - * снизу) + правый сосед (его левая грань: был loose-край pop_env_b(42), - * теперь пусто). TRANSPARENT — 0xFF не забивает чёрный, пишет и в - * ОЗУ-копию → heal сохранит. */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - draw_tile(row, col); - if (col + 1 < 10) - draw_tile(row, col + 1); - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* ---- Падающий кусок loose (mob, seg007 move_loose) ------------------ * - * Упрощ. одиночный кусок (в комнате 1 — один loose). Модель fixed- - * corridor: коридор падения (колонка тайла) heal'ится каждый кадр (стирает - * прошлый кусок, возвращает печёный фон — empty+«стена вниз»), поверх — - * кадр 0 loose (41/42/43) на текущей y. Гравитация: speed 0→+3/кадр - * (cap 29), y+=speed. Двоебуфер: коридор фиксирован → heal чистит любой - * прошлый кадр ЭТОЙ страницы. Ниже поля кусок прячет clip_borders. */ -/* Падающие куски — ТАБЛИЦА (порт mobs[14]/mobs_count, seg007:965). Одного - * куска не хватает: в комнате 7 плиты (0,5) и (0,6) соседние, Kid роняет обе - * подряд, и второй спавн затирал состояние первого — его пиксели оставались - * висеть в воздухе (на каждой странице на своей y → мерцание), а щебень - * появлялся только под одной плитой. - * - * Слотов СТОЛЬКО ЖЕ, СКОЛЬКО В ОРИГИНАЛЕ (14). Было 4 с обоснованием - * «больше одновременно падающих плит в одной комнате практически не - * бывает» — неверным ровно с уровня 13: check_fall_flo роняет ШЕСТЬ разом - * (комнаты 23 и 16), а с учётом плит, которые эти куски сбивают по дороге - * (loose_fall), в воздухе бывает и больше. Лишний кусок молча терялся - * (`if (!m) return`), то есть тайл исчезал, а щебня на месте посадки не - * появлялось — найдено прогоном 2026-08-13, комната 16, тайл (1,5). - * Цена — 150 байт W2. */ -#define MOB_MAX 14 -typedef struct { - uint8_t active; /* 0 нет; 1 падает */ - uint8_t clean; /* кадров дочистки после конца полёта (2 = обе стр.) */ - uint8_t defer; /* кусок ниже Kid → рисуем ПОСЛЕ него (y-порядок) */ - int x; /* левый край (POP_COL_XH*8) */ - int y; /* = curmob.y оригинала (низ куска, dby), растёт вниз */ - /* Где кусок рисуется НА ЭКРАНЕ в этом кадре, MOB_Y_NONE = не рисуется. - * Отдельно от y, потому что кусок виден и из СОСЕДНЕЙ комнаты: порт - * draw_mob (seg007:13E5) сдвигает его на +192 (комната снизу) или на - * −189 (комната сверху). См. mob_tick_one. */ - int draw_y; - int prev_y[2]; /* последняя нарисованная y на КАЖДОЙ странице (heal) */ - int8_t speed; - int8_t row, col; /* тайл-позиция куска (для окклюзии соседа) */ - uint8_t room; /* curmob.room: кусок падает В СВОЕЙ комнате, не в текущей */ -} mob_t; -/* НЕ static намеренно: статики банкового модуля в карту символов не - * попадают, и разобрать зависший кадр по слотам (y каждого куска, порядок, - * defer) в отладчике нечем — адреса просто нет. Снято 2026-08-13 для - * разбора артефактов множественного падения; наружу таблица не объявлена и - * никем не читается. */ -mob_t mobs[MOB_MAX]; -/* Сколько кусков сейчас летит (active). Считает pop_loose_mob_tick. */ -static uint8_t mobs_live; - -/* Кусок «приземлился» (порт loose_land): 0 = нет, иначе tilepos+1 тайла, на - * который он лёг → приложение/pop_map ставит debris + do_knock. */ -/* pop_loose_landed переехал в pop_state.c: его читает pop_map (W1/W2), а - * писучие данные банкового модуля недоступны снаружи (см. pop_state.h). */ - -/* y_loose_land / y_something (seg007): [row+1], row = −1..3. Ряд −1 — - * плита-потолок (ряд 2 комнаты сверху): в оригинале это отрицательный - * tilepos, у нас — свой ряд полосы у потолка. */ -static const int16_t MOB_Y_LAND[5] = {2, 65, 128, 191, 254}; -static const int16_t MOB_Y_BOUND[5] = {-1, 62, 125, 188, 25}; -#define MOB_Y_NONE 0x7FFF - -/* Габарит падающего куска. Части и их места (порт draw_mob, seg007:13E5; - * индексы loose_fram_*[10], seg008:518/596/608): - * - * env 70 левая часть при (mob_x, mob_y-3) - * env 74 низ при (mob_x, mob_y) - * env 72 правая часть при (mob_x+32, mob_y-1) - * - * Размеры (сняты из каталогов атласов; РАСКЛАДКА env: page = id>>4, - * idx = id&15 — POP_ENV_SHIFT равен 4, не 5): - * - * оба тайлсета 70 = 32x13 74 = 32x3 - * 72 = 26x16 в подземелье, 25x16 во дворце - * - * Отсюда след: по x mob_x .. mob_x+57 (32+26−1), по y mob_y-16 .. mob_y - * (правая часть выше всех: 1+16−1). Именно эти числа и стоят в шапке - * mob_render — composite их пересчитывает сам и кладёт в шапку блоба. - * - * Коридор: MOB_X0 = mob_x при MOB_W = 64 даёт mob_x .. mob_x+63, то есть - * шесть пикселей запаса справа. Раньше было mob_x-4 при той же ширине - * (mob_x-4 .. mob_x+59): четыре пикселя слева, где кусок не рисует ничего, - * и всего два справа. Площадь та же, запас переехал туда, где он нужен. */ -#define MOB_X0(mx) (mx) -#define MOB_W 64 /* mob_x .. mob_x+63 */ -/* Коридор heal по высоте: mob_y-20 .. mob_y+3 при следе mob_y-18 .. mob_y. - * Уже НЕ сужать: 24 строки — это след подземелья (19) плюс две строки поля с - * каждой стороны. Сужение до 18 «по палаццовому следу» сломало бы - * подземелье. */ -/* Сами величины коридора — в mob_heal_up / mob_heal_h у начала файла: они - * считаются из высоты собранного композита, а не константами. */ - -/* Свободный слот = не летит И дочистка завершена (иначе затрём хвост, - * который ещё не стёрт со второй страницы). Общий для обычного отрыва и - * для копии из loose_fall — раньше цикл был написан дважды. */ -static mob_t *mob_alloc(void) -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) - if (!mobs[i].active && !mobs[i].clean) { - pop_mob_busy = 1; /* гейт холостого хода — см. pop_state.h */ - return &mobs[i]; - } - return 0; -} - -static void mob_spawn(uint8_t room, int row, int col) -{ - mob_t *m = mob_alloc(); - if (!m) return; /* таблица полна — кусок без спрайта (тайл всё равно пуст) */ - m->x = POP_COL_XH[col] * 8; - m->y = MOB_Y_LAND[row + 1]; /* y_loose_land: низ куска в момент отрыва */ - m->row = (int8_t)row; - m->col = (int8_t)col; - m->room = room; /* curmob.room (add_mob, seg007:1010) */ - m->speed = 0; - m->active = 1; - m->clean = 0; - m->defer = 0; - m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - m->draw_y = MOB_Y_NONE; -} - -/* Отрыв куска в ТЕКУЩЕЙ комнате (обычный случай — pop_loose_tick). */ -void pop_loose_mob_spawn(int row, int col) __banked -{ - mob_spawn(pop_t_room, row, col); -} - -/* Копия куска ОТ ПОЗИЦИИ УДАРА — порт хвоста loose_fall (seg007:1085): - * curmob.y += 6; mob_down_a_row(); add_mob(); - * то есть новый кусок заводится не из тайла, а из места, где его сбили: - * на 6 пикселей ниже и рядом ниже, со скоростью УЖЕ ПОДЕЛЁННОЙ пополам. - * Через границу комнаты — как mob_down_a_row: y −= 192, ряд 0, комната снизу. */ -static void mob_spawn_copy(const mob_t *src) -{ - mob_t *m; - int16_t y = (int16_t)(src->y + 6); - int8_t row = (int8_t)(src->row + 1); - uint8_t room = src->room; - - if (row >= 3) { - y = (int16_t)(y - 192); - row = 0; - room = pop_room_link(room, 3 /* вниз */); - if (!room) return; /* ушло из уровня — куску негде лететь */ - } - m = mob_alloc(); - if (!m) return; - m->x = src->x; - m->y = y; - m->row = row; - m->col = src->col; - m->room = room; - m->speed = src->speed; /* уже half (loose_fall делит ДО add_mob) */ - m->active = 1; - m->clean = 0; - m->defer = 0; - m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - m->draw_y = MOB_Y_NONE; - /* Кусок рождается ВНУТРИ mob_tick_one (loose_fall сбил плиту), и слот ему - * mob_alloc выдаёт с начала таблицы — то есть, скорее всего, УЖЕ - * пройденный циклом pop_loose_mob_tick. Своей пометки «фон трогали» этот - * кусок в текущем кадре не получит, а нарисован будет; помечаем коридор - * здесь — иначе персонаж под ним стирается и не просит перерисовки - * (см. pop_cd_mute в mob_render). */ - pop_cd_touch(MOB_X0(m->x), m->y - 27 + POP_YOFF, MOB_W, 64); -} - -/* Отрыв куска в ЧУЖОЙ комнате: плита, которую Кид расшатал и убежал, всё - * равно проваливается (animate_loose в pop_trob крутит её trob по своей - * комнате, как do_trobs оригинала). Летит и садится кусок дальше сам — - * mob_tick_one давно умеет чужую комнату (mob_tile_at / pop_loose_exit). */ -void pop_loose_mob_spawn_at(uint8_t room, int row, int col) __banked -{ - mob_spawn(room, row, col); -} - - -/* Остановить падающий кусок (при смене комнаты — состояние per-tile не - * должно утечь в новую комнату). */ -static void mob_render(mob_t *m, uint8_t pg); - -void pop_loose_mob_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) { - mobs[i].active = 0; mobs[i].clean = 0; mobs[i].defer = 0; - mobs[i].prev_y[0] = mobs[i].prev_y[1] = MOB_Y_NONE; - } -} - -/* Смена комнаты. Куски НЕ останавливаем: в оригинале mobs[] чистится только - * в start_level (seg003:88), а do_mobs (seg007:1063) крутит их все независимо - * от drawn_room — move_loose работает по curmob.room, и плита, за которой Кид - * не досмотрел, всё равно долетает и кладёт щебень (BUG-LOOSE-2: в комнате 12 - * плита 0,1 не успевала упасть до ухода в комнату 15). Сбросить надо только - * heal-историю: новая комната перерисована целиком, старых пикселей нет. */ -/* Соседи ОТРИСОВАННОЙ комнаты сверху/снизу — для draw_mob (см. mob_tick_one). - * Кэш, а не вызов каждый кадр: pop_room_link лезет в страницу уровня, то есть - * мапит и размапливает W0. Инвалидируется сменой комнаты. */ -static uint8_t mob_link_room, mob_link_up, mob_link_dn; - -void pop_loose_mob_qsave(pop_qs_io_t *io) __banked -{ - uint8_t i, live = 0; - for (i = 0; i < MOB_MAX; i++) { - mob_t *m = &mobs[i]; - pop_qs_u8(io, &m->active); - pop_qs_i16(io, &m->x); pop_qs_i16(io, &m->y); - pop_qs_i8(io, &m->speed); pop_qs_i8(io, &m->row); - pop_qs_i8(io, &m->col); pop_qs_u8(io, &m->room); - if (io->reading && io->apply) { - m->clean = m->defer = 0; - m->draw_y = m->prev_y[0] = m->prev_y[1] = MOB_Y_NONE; - if (m->active) live++; - } - } - if (io->reading && io->apply) { - mobs_live = live; - pop_mob_busy = (uint8_t)(live != 0); - mob_link_room = 0; - } -} - -static void mob_links(void) -{ - if (mob_link_room == pop_t_room) return; - mob_link_room = pop_t_room; - mob_link_up = pop_room_link(pop_t_room, 2); - mob_link_dn = pop_room_link(pop_t_room, 3); -} - -void pop_loose_mob_room_changed(void) __banked -{ - uint8_t i; - for (i = 0; i < MOB_MAX; i++) { - mobs[i].defer = 0; - mobs[i].prev_y[0] = mobs[i].prev_y[1] = MOB_Y_NONE; - mobs[i].draw_y = MOB_Y_NONE; - /* дочистка хвоста относилась к покинутой комнате — она уже не нужна */ - if (!mobs[i].active) mobs[i].clean = 0; - } - mob_link_room = 0; /* кэш соседей — под новую комнату */ -} - -/* Тайл под куском. В своей комнате — обычный tile_code (он знает про кромки - * и соседей), в чужой — прямо из данных уровня. */ -static uint8_t mob_tile_at(mob_t *m) -{ - if (m->room == pop_t_room) return (uint8_t)(pop_tile_code(m->row, m->col) & 0x1F); - if (m->row < 0 || m->row > 2 || m->col < 0 || m->col > 9) return 1; /* кромка = пол */ - return (uint8_t)(pop_level_tile(m->room, (uint8_t)(m->row * 10 + m->col)) & 0x1F); -} - -/* loose_fall (seg007:1082) — падающий кусок пробил ЕЩЁ ОДНУ расшатанную - * плиту. Порт дословный, три действия В ОДНОМ КАДРЕ: - * 1. налетевший кусок тормозится вдвое (`curmob.speed >>= 1`); - * 2. сбитый тайл снимается с карты немедленно (`remove_loose`); - * 3. на месте удара заводится ВТОРОЙ кусок — копия налетевшего, сдвинутая - * на 6 пикселей и ряд вниз (`curmob.y += 6; mob_down_a_row; add_mob`). - * То есть в столбце дальше летят ДВА куска, и это правильное поведение - * оригинала, а не дефект. - * - * Здесь стоял обходной путь: плите ставилась фаза «падает следующим кадром», - * а всю работу делал pop_loose_tick. Цена оценивалась как «один кадр - * задержки» и оказалась выше: защита «один сигнал pop_loose_fell на кадр» - * придерживает провал, пока главный цикл не разберёт предыдущий, и на 13-м - * уровне (плиты сыплются пачкой) вторая плита появлялась через несколько - * кадров — уже после того, как первая улетела с экрана, — да ещё и с высоты - * покоя тайла, а не от места удара (найдено прогоном 2026-08-13). */ -static void mob_break_loose(mob_t *m) -{ - m->speed >>= 1; - pop_loose_remove(m->room, (uint8_t)(m->row * 10 + m->col)); - mob_spawn_copy(m); -} - -static mob_t *mt_m; -static uint8_t mt_pg, mt_here; - -static void mob_tick_one(mob_t *m, uint8_t pg) -{ - /* Рабочие переменные — file-scope, не локали: у функции пять вызовов, и - * живой через них указатель на слот SDCC спиливал в кадр (16 байт, 99 - * обращений `-N(ix)`). То же лечение, что у draw_tile и blit_b_clip. - * Реентерабельности нет и не требуется: единственный вызывающий — - * pop_loose_mob_tick, и слоты он обходит последовательно. */ - mt_m = m; mt_pg = pg; - if (!mt_m->active && !mt_m->clean) return; - mt_m->draw_y = MOB_Y_NONE; /* по умолчанию не рисуемся; решим в конце */ - mt_here = (uint8_t)(mt_m->room == pop_t_room); - /* Стереть кусок, нарисованный на ЭТОЙ странице в прошлый раз (у каждой - * страницы своя копия фона). Раньше коридор был фиксирован под ряд 2; - * плита-потолок падает через весь ряд 0, поэтому чистим по фактической - * прошлой позиции. */ - /* Гейта по `mt_here` здесь БЫТЬ НЕ ДОЛЖНО: prev_y[mt_pg] — это след, который - * кусок оставил ИМЕННО НА ЭТОЙ странице, и стереть его надо независимо - * от того, где кусок сейчас. Пока чистка была под `mt_here`, кусок, - * улетевший в комнату снизу (mob_down_a_row), навсегда оставлял себя - * на одной из двух страниц дабл-буфера — «застрявшая плита», видимая - * через кадр (BUG-MOB-STALE-PAGE). */ - if (mt_m->prev_y[mt_pg] != MOB_Y_NONE) { - /* Ширина/высота — по СЛЕДУ, а не по спрайту. Спрайт куска целиком - * влезает в 64x32 (41: 32x13 с y-3, 42: 26x15 с x+32,y-1, 43: 32x3), - * но mob_render рисует ещё и ЦЕЛЫЙ соседний тайл поверх правой части - * (окклюзия грани пола), причём в GFX_BANK_SPRITE — то есть мимо - * теневой копии фона. Всё, что тот тайл нарисовал вне коридора - * heal'а, не стиралось никогда: кусок улетал, а в соседнем столбце - * оставался обрезок пола (найдено прогоном 2026-08-13). Коридор - * расширен до площади, которую реально может тронуть эта - * перерисовка: столбец соседа по ширине и ряд по высоте. - * - * ЗАДЕЛ: правильнее не перерисовывать соседа вовсе, а КЛИПОВАТЬ - * правую часть куска — оригинал так и делает (add_mob_to_objtable, - * seg007:1161: clip.right = 40). Тогда коридор вернётся к 64x32. */ - pop_heal_off(MOB_X0(mt_m->x), mt_m->prev_y[mt_pg] - mob_heal_up, MOB_W, mob_heal_h); - mt_m->prev_y[mt_pg] = MOB_Y_NONE; - } - if (!mt_m->active) { mt_m->clean--; return; } - /* гравитация (move_loose): ускорение до 29 */ - if (mt_m->speed < 29) mt_m->speed += 3; - mt_m->y += mt_m->speed; - /* move_loose (seg007:1126): низ куска пересёк границу своего ряда — - * смотрим тайл этого ряда. Пусто/loose — валится дальше, пол — - * приземление (loose_land: debris + do_knock). Через LOOSE кусок именно - * ПРОЛЕТАЕТ, как через пустоту, — но по дороге СРЫВАЕТ её (loose_fall, - * seg007:1082). - * - * Здесь раньше стояло «порт loose_fall не нужен: в ряду ниже её нет» — - * допущение, верное для уровней 1-11 и сломавшееся на 13-м: комната 16, - * плиты (1,6) и (1,7), на которые сверху сыплется гряда из комнаты 1. - * Куски пролетали сквозь них правильно, а сами плиты оставались целыми и - * нарисованными (найдено прогоном 2026-08-13). */ - if (mt_m->row < 3 && mt_m->y < 226 && MOB_Y_BOUND[mt_m->row + 1] <= mt_m->y) { - uint8_t t = mob_tile_at(mt_m); - if (t == 11) mob_break_loose(mt_m); - if (t == 0 || t == 11) { - /* mob_down_a_row (seg007:1387): ряд ниже, а из НИЖНЕГО ряда — - * в комнату СНИЗУ (y -= 192, ряд 0). Именно так кусок пролетает - * несколько комнат подряд: уровень 6, плита (1,7) комнаты 6 - * проваливается сквозь пустую шахту комнаты 7 и приземляется на - * кнопку (2,7) комнаты 11. Раньше мы кусок на границе комнаты - * ГАСИЛИ и подменяли одним «переходом вниз» из главного цикла — - * дальше первой комнаты он не летел (BUG-MOB-MULTIROOM). */ - mt_m->row++; - if (mt_m->row >= 3) { - mt_m->y = (int16_t)(mt_m->y - 192); - mt_m->row = 0; - mt_m->room = pop_room_link(mt_m->room, 3 /* вниз */); - if (!mt_m->room) { /* улетел из уровня — просто гаснет */ - mt_m->active = 0; mt_m->clean = 2; /* дочистить ОБЕ страницы */ - return; - } - mt_here = (uint8_t)(mt_m->room == pop_t_room); - } - } else if (!mt_here && pop_loose_exit) { - /* Сигнал прошлой посадки в чужой комнате ещё не разобран (он - * ОДИН на кадр) — держим кусок на границе ряда и садим следующим - * кадром, как это уже сделано для pop_loose_landed ниже. Без - * этого второй кусок затирал первый, и из нескольких плит, - * улетевших в одну дыру, щебень оставляла только одна (найдено - * прогоном 2026-08-13, уровень 13). */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - } else if (!mt_here) { - /* Приземление в ПОКИНУТОЙ комнате: рисовать нечего, но щебень и - * КНОПКА под куском обязаны сработать — сигналим главному циклу - * комнатой и тайлом (loose_land, seg007:11E8, работает с - * curmob.room, а не с отрисованной). */ - pop_sfx_play(2); /* tile crashing, seg007:1041 */ - pop_loose_exit_room = mt_m->room; - pop_loose_exit = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); - /* clean = 2 даже для чужой комнаты: пока кусок летел, он мог - * рисоваться в ЭТОЙ, и след остался на обеих страницах. */ - mt_m->active = 0; mt_m->clean = 2; - return; - } else if (pop_loose_landed) { - /* сигнал прошлого приземления ещё не разобран (один за кадр) — - * подержим кусок на границе и приземлим следующим кадром */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - } else { - pop_sfx_play(2); /* tile crashing, seg007:1041 */ - mt_m->y = MOB_Y_BOUND[mt_m->row + 1]; - pop_loose_landed = (uint8_t)(mt_m->row * 10 + mt_m->col + 1); - mt_m->active = 0; mt_m->clean = 2; /* кусок исчез — на его месте debris */ - return; - } - } - /* Страховка: кусок ушёл ниже поля, не поймав границу ряда (в норме этого - * не бывает — mob_down_a_row уводит его в комнату снизу). Просто гаснет, - * как у оригинала кусок в комнате 0 (move_loose: `speed = -2`). */ - if (mt_m->y - 27 >= POP_PLAYFIELD_H) { - mt_m->active = 0; mt_m->clean = 2; - return; - } - /* Порт ГОЛОВЫ draw_mob (seg007:13E5). Кусок виден НЕ ТОЛЬКО в своей - * комнате: оригинал рисует его ещё и когда он только что провалился в - * комнату СНИЗУ (пока |y| < 18 — со сдвигом +192, то есть выглядывает из - * нижней кромки) или летит в комнате СВЕРХУ и уже подошёл к её низу - * (y >= 174 — со сдвигом −189, вываливается из верхней кромки). - * - * Без этого плита, падающая из НИЖНЕГО ряда, исчезала мгновенно: она - * уходит в комнату снизу на ПЕРВОМ же move_loose (спавн y = 191 при - * границе ряда 188), и у нас после этого не рисовалась вовсе. Ряды 0 и 1 - * летят внутри комнаты, поэтому баг был виден только на ряду 2 — ровно - * как заметил пользователь (уровень 11, комната 14). */ - if (mt_here) { - if (mt_m->y >= 210) return; /* ниже поля — оригинал не рисует */ - mt_m->draw_y = mt_m->y; - } else { - mob_links(); - if (mt_m->room == mob_link_dn) { - int8_t yb = (int8_t)mt_m->y; /* ABS((sbyte)ypos) < 18 */ - if (yb >= 18 || yb <= -18) return; - mt_m->draw_y = mt_m->y + 192; - } else if (mt_m->room == mob_link_up) { - if (mt_m->y < 174) return; - mt_m->draw_y = mt_m->y - 189; - } else { - return; /* дальше соседей не рисуем */ - } - } - /* Порядок «плита vs Kid». В оригинале объекты рисуются при обходе СВОИХ - * тайлов (redraw_needed_tiles: ряды 2,1,0; колонки 0..9), и только внутри - * ОДНОГО тайла сортируются по obj_y (sort_curr_objs, seg008:1561: кто - * ниже — тот позже, т.е. поверх). Тайл падающего куска — draw_mob - * (seg007:13E5): row = y_to_row_mod4(y), col = xh>>2. Значит кусок - * поверх Kid, если его тайл идёт в обходе ПОЗЖЕ тайла Kid, а при - * совпадении тайлов — если он ниже по y. */ - { - int8_t mrow = pop_y_to_row((int16_t)mt_m->draw_y); /* y_to_row_mod4 */ - uint8_t over; - if (mrow < 0 || mrow > 2) { - /* КОРЗИНА 30 (get_tilepos_nominus, seg006:110). Ряд объекта вне - * комнаты: y_to_row_mod4 берёт остаток по 4, поэтому «выше - * потолка» и «ниже пола» дают одно и то же −1, а оригинал сводит - * оба в тайл 30. Объекты этого тайла рисуются ПЕРВЫМИ — - * draw_objtable_items_at_tile(30) стоит в redraw_needed_tiles до - * всего обхода тайлов. Значит кусок под ВСЕМ, включая Кида; до - * сих пор сравнение рядов давало обратное («−1 обходится - * последним» = поверх). */ - over = 0; - } - else if (mrow != pop_bg_obj_row) over = (mrow < pop_bg_obj_row); /* ряды идут 2,1,0 */ - else if (mt_m->col != pop_bg_obj_col) over = (mt_m->col > pop_bg_obj_col); - else over = (mt_m->draw_y > pop_cd[POP_CH_KID].fpy); - /* РИСОВАНИЯ ЗДЕСЬ БОЛЬШЕ НЕТ — только решение, в какой проход кусок - * пойдёт. Пока heal и вывод шли в одной итерации, heal СЛЕДУЮЩЕГО - * куска срезал верхнюю кромку уже нарисованного предыдущего: на 13-м - * уровне куски идут лесенкой в соседних столбцах с разницей ~20 px - * по y, и перекрытие гарантировано (артефакт «чёрный бар», найден - * прогоном 2026-08-13, комната 23). Теперь сперва тикают ВСЕ куски - * (то есть heal'ятся все), и только потом рисуются. */ - mt_m->defer = over; - } -} - -/* Один проход отрисовки кусков. want_defer: 0 — те, что под Kid (идут сразу - * после фона), 1 — те, что поверх него (после персонажей). - * - * Порядок внутри прохода — ПО y, но ПО УБЫВАНИЮ: сперва нижние, последним - * верхний. Это НЕ описка и не общее правило «ниже = поверх»: сравнение двух - * объектов в оригинале (compare_curr_objs, seg008:1572) разводит два случая, - * - * оба объекта — падающие плиты (тип 0x80): y1 < y2 → по УБЫВАНИЮ - * любая другая пара: y1 > y2 → по возрастанию - * - * то есть между СОБОЙ куски укладываются наоборот, чем всё остальное: верхний - * ложится поверх нижнего. Видно на паре из loose_fall (сбитая плита летит в - * 6 пикселях под налетевшей): при общем правиле нижняя перекрывала верхнюю, - * и это поймал прогон 2026-08-13. - * - * Порядок «кусок против Кида» здесь ни при чём — его решает defer выше, и там - * действует обычное правило. */ -/* Пометки СОСЕДА СПРАВА — порт draw_mob (seg007:1147). Оригинал каждый - * кадр помечает тайл col+1 в ряду куска сразу двумя пометками: - * - * set_redraw2(tilepos, 1); // фон соседа — рисуется ДО куска - * set_redraw_fore(tilepos, 1); // его передние части — ПОСЛЕ куска - * - * и повторяет их для второго ряда, если кусок висит на границе (ypos-18). - * Так правая часть куска (спрайт 72 лежит в столбце col+1) прячется за - * передней гранью соседнего пола, а передние части чужого тайла — колонна, - * например, — ложатся поверх куска. - * - * Здесь была подпорка: целый соседний тайл рисовался ПОВЕРХ куска прямо в - * mob_render. Она тащила на плиту чужой узор и окно и стоила по полной - * отрисовке тайла на кусок за кадр (MOB-CLIP-RIGHT). */ -static void mob_mark_neighbour(const mob_t *m) -{ - int8_t r = pop_y_to_row((int16_t)m->draw_y); - int8_t rt = pop_y_to_row((int16_t)(m->draw_y - 18)); - int8_t c = (int8_t)(m->col + 1); - /* ПОЛОСА У ПОТОЛКА (ряд −1). Её передние куски (нижняя кромка потолка и - * кадр плиты-потолка) живут в трёх верхних строках поля — dby = 2 при - * клипе по POP_YOFF, — а спрайт куска занимает mob_y−16 .. mob_y. Значит - * кусок закрывает кромку, пока mob_y − 16 <= 2, то есть mob_y <= 18: три - * кадра после отрыва (y = 2, 5, 11 при ускорении 3). Помечаем ОБА - * столбца, которые кусок накрывает по x (mob_x .. mob_x+62 — это col и - * col+1). - * - * Без этого кусок оказывался ПОВЕРХ кромки потолка соседней колонки — - * физически невозможно (найдено пользователем 2026-08-17, ур.1 к.6: - * плита (−1,5) перекрывала потолок (−1,6)). В оригинале порядок даёт - * сама структура таблиц: кусок идёт в midtable (draw_mobs), а полоса - * потолка — в foretable, и та рисуется позже (draw_tables, seg008:1373). */ - if (m->draw_y <= 18) { - /* Пустой тайл полосы потолка не рисует В ПЕРЕДНЕМ СЛОЕ ничего - * (bottom_id = 0, FORE_ANY = 0), а пометка стоит потом двух трамплинов - * — в банк 7 за разбором пометок и в банк 2 за самой отрисовкой, - * ~8 900 такта каждый. А пустой он тут как раз чаще всего: кусок - * существует ровно потому, что плита из своей клетки уже выпала. - * Проверяем pop_tile_code — он резидентный, ~1 100 такта. */ - if (pop_tile_code(-1, m->col)) - pop_set_redraw_fore_above((uint8_t)m->col); - if (m->col + 1 <= 9 && pop_tile_code(-1, m->col + 1)) - pop_set_redraw_fore_above((uint8_t)(m->col + 1)); - } - if (c > 9) return; - if (r >= 0 && r <= 2) pop_set_redraw_fore((uint8_t)(r * 10 + c)); - if (rt != r && rt >= 0 && rt <= 2) pop_set_redraw_fore((uint8_t)(rt * 10 + c)); -} - -/* Вторая половина draw_mob (seg007:1149): рядом с set_redraw_fore там стоит - * set_redraw2, то есть draw_other_overlay соседнего тайла — его части уходят в - * midtable и ложатся ПОВЕРХ куска (порядок разобран в pop_mob_overlay_tile). - * Звать СРАЗУ после mob_render: списков у нас нет, порядок эмулируется - * последовательностью вызовов. */ -static void mob_overlay_neighbour(const mob_t *m) -{ - int8_t r = pop_y_to_row((int16_t)m->draw_y); - int8_t rt = pop_y_to_row((int16_t)(m->draw_y - 18)); - /* КОРЗИНА 30 оригинала (get_tilepos_nominus, seg006:110): ряд объекта вне - * комнаты. y_to_row_mod4 берёт остаток по 4, поэтому «выше потолка» и - * «ниже пола» дают одно и то же −1 — оригинал сводит оба случая в тайл 30 - * и рисует такие объекты ПЕРВЫМИ, до всего обхода тайлов - * (draw_objtable_items_at_tile(30) в redraw_needed_tiles). - * - * Отсюда два отличия от обычного куска: - * - ориентир «тайл объекта» = 3, то есть РАНЬШЕ любого ряда обхода - * (2,1,0). Сюда уходил сырой −1, и гейт other_overlay_tile - * `row > pop_bg_obj_row` читал его наоборот — «объект поверх всего» — - * и соседа не возвращал вовсе (тело плиты пропадало, оставался - * только её торец из переднего слоя); - * - перекрыть кусок должна и СВОЯ клетка, а не только сосед справа: - * после объекта у оригинала рисуются ВСЕ тайлы. У куска в обычном - * ряду своя клетка не перерисовывается — там объект вливается в - * midtable уже ПОСЛЕ частей своего тайла. */ - uint8_t b30 = (uint8_t)(r < 0 || r > 2); - int8_t oref = b30 ? (int8_t)3 : r; - int8_t c, cend = (int8_t)(m->col + 1); - int ytop, ybot; - if (cend > 9) cend = 9; - /* Габарит куска — по ЭКРАННОЙ координате: у куска, видимого из соседней - * комнаты, draw_y отличается от y на 192. */ - ytop = m->draw_y - (int)mob_spr[2] + 1; - ybot = m->draw_y; - /* ПРЕДУСЛОВИЯ ПРОВЕРЯЕМ ЗДЕСЬ, до вызова в банк 2. pop_mob_overlay_tile - * живёт в банке 2, то есть каждый вызов из банка 7 платит межбанковый - * трамплин (~8 900 такта); а условий всего два — тайл не пуст и габарит - * тайла пересекается с габаритом куска. Оба дешёвые: pop_tile_code — - * резидент (~1 100). Замер 2026-08-17: без этого гейта двенадцать - * вызовов на шесть кусков стоили ~130 000 в циане, причём большинство - * ничего не рисовало. - * - * Габарит тайла берём ПОЛНЫМ (63*row+2 .. +66) — какая именно часть - * соседа окажется поверх куска, решит уже окно клипа внутри. */ - for (c = b30 ? (int8_t)m->col : cend; c <= cend; c++) { - if (c < 0) continue; - if (r >= 0 && r <= 2 && pop_tile_code(r, c) && - ybot >= 63 * r + 2 && ytop <= 63 * r + 66) - pop_mob_overlay_tile(r, c, oref, (int8_t)m->col, m->x, m->draw_y, mob_spr[2]); - if (rt != r && rt >= 0 && rt <= 2 && pop_tile_code(rt, c) && - ybot >= 63 * rt + 2 && ytop <= 63 * rt + 66) - pop_mob_overlay_tile(rt, c, oref, (int8_t)m->col, m->x, m->draw_y, mob_spr[2]); - } -} - -static void mob_draw_pass(uint8_t pg, uint8_t want_defer) -{ - uint8_t order[MOB_MAX], n = 0, i, j; - /* Ранний выход: проход зовётся ДВАЖДЫ за кадр (под Kid и поверх него), и - * без него мы перебирали бы все MOB_MAX слотов 28 раз в кадре даже - * когда в воздухе пусто. Счётчик ведёт тик, которому проход по слотам - * нужен и так. */ - if (!mobs_live) return; - for (i = 0; i < MOB_MAX; i++) { - mob_t *m = &mobs[i]; - /* Отбор по draw_y, а НЕ по комнате: кусок, только что провалившийся - * в комнату снизу, ещё виден из нашей (см. mob_tick_one). */ - if (!m->active || m->draw_y == MOB_Y_NONE) continue; - if ((uint8_t)(m->defer != 0) != want_defer) continue; - for (j = n; j > 0 && mobs[order[j - 1]].draw_y < m->draw_y; j--) - order[j] = order[j - 1]; - order[j] = i; - n++; - } - for (i = 0; i < n; i++) { - /* Пометки соседа ставятся ЗДЕСЬ, а не в тике: у оригинала draw_mob - * (seg007:1147) считает ряд от той же координаты, по которой кусок - * рисуется. Стояли они в цикле тика — то есть по позиции ДО - * mob_tick_one, а рисовался кусок уже по новой. Пока он летит - * внутри ряда, старый и новый тайл совпадают и разницы не видно; но - * в кадр пересечения границы пометка указывала на прежний тайл, и - * передняя часть колонны кусок не перекрывала — ровно ОДИН кадр, - * как и наблюдалось (прогон 2026-08-13, комната 23, колонка 8). */ - mob_mark_neighbour(&mobs[order[i]]); - mob_render(&mobs[order[i]], pg); - mob_overlay_neighbour(&mobs[order[i]]); - } -} - -void pop_loose_mob_tick(void) __banked -{ - uint8_t pg = gfx_get_draw_page() & 1, i, live = 0, busy = 0; - /* Слоты обходим УКАЗАТЕЛЕМ и пустые отсеиваем ЗДЕСЬ, а не внутри - * mob_tick_one. Индексная запись mobs[i] заставляла SDCC умножать i на - * sizeof(mob_t)=15 заново под каждое поле (.active/.clean/.x/.y), и 14 - * пустых слотов стоили 35 790 тактов в кадре, где не падает НИЧЕГО - * (замер 2026-08-13). Гард в самом mob_tick_one оставлен: функция - * зовётся и из других мест. */ - mob_t *m = mobs; - /* Ни одного занятого слота — обходить 14 штук незачем (замер 11/15: - * 12 090 тактов холостого хода). Гейт снимается ниже, по факту прохода, - * в котором не осталось ни active, ни дочистки. */ - if (!pop_mob_busy) return; - /* Пометки всех кусков — ОДНИМ пакетом: настоящий pop_cd_touch стоит 4 502 - * такта (замер 2026-08-17), а кусков в кадре каскада шесть. В пакете они - * копят общий прямоугольник четырьмя сравнениями, и настоящая пометка одна. - * - * Загрубление осознанное: объединение шести коридоров накрывает и ряды - * между ними. Безопасно в одну сторону — лишняя пометка стоит лишней - * перерисовки персонажа, пропущенная стоит ИСЧЕЗНУВШЕГО персонажа. - * Практически гряда идёт по колонкам 2..7, а Кид от неё убегает — на - * замерах разницы в числе перерисовок нет. */ - pop_cd_batch_begin(); - for (i = 0; i < MOB_MAX; i++, m++) { - /* Летящий кусок и его дочистка ходят по чужим пикселям СВОИМ heal'ом, - * мимо pop_blit_b — пока он в кадре, персонажей пропускать нельзя - * (DRAW-COST). Взводим ДО тика: кусок может исчезнуть прямо в нём, а - * стереть себя ему всё равно надо будет. */ - if (!m->active && !m->clean) continue; /* пустой слот — ни адреса, ни вызова */ - /* Метка «фон трогали вот здесь» обязана покрывать ВЕСЬ коридор - * heal'а, а не габарит спрайта. Иначе персонаж, попавший в - * расширенную часть коридора, стирается heal'ом, но перерисовать - * себя не просит (pop_char_skip_mask его пропускает) — и просто - * исчезает с экрана. Ровно это и случилось, когда коридор - * расширили под транзитную перерисовку соседа (прогон - * 2026-08-13: в комнате 23 после падения гряды пропадал Кид). - * Запас сверху — на путь, пройденный за кадр (speed до 29): heal - * стирает ПРОШЛУЮ позицию, она выше текущей. */ - pop_cd_touch(MOB_X0(m->x), m->y - 27 + POP_YOFF, MOB_W, 64); - /* ...и по ПРОШЛОЙ нарисованной позиции: у куска, видимого из соседней - * комнаты, экранная координата отличается от y на 192 — коридор heal'а - * лежит совсем не там, где коридор по y. В пакете это четыре - * сравнения, настоящая пометка всё равно одна. */ - if (m->room != pop_t_room && m->prev_y[pg] != MOB_Y_NONE) - pop_cd_touch(MOB_X0(m->x), m->prev_y[pg] - 27 + POP_YOFF, MOB_W, 64); - mob_tick_one(m, pg); - if (m->active) live++; - if (m->active || m->clean) busy++; /* слот ещё занят — гейт держим */ - } - pop_cd_batch_end(); - mobs_live = live; - pop_mob_busy = busy; -} - -static void mob_render(mob_t *m, uint8_t pg) -{ - /* Падающий кусок (SDLPoP draw_mobs/add_midtable, case 0x80): ТРИ куска — - * left(41) на obj_y-3, bottom(43) на obj_y, right(42) на obj_x+4 (=col+1, - * заходит в тайл СПРАВА) на obj_y-1. */ - gfx_set_bank(GFX_BANK_SPRITE); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* КЛИПА ОБЪЕКТА ЗДЕСЬ НЕТ. У оригинала он есть — add_mob_to_objtable - * (seg007:1161) ставит куску clip.right = 40, — но единицы этого поля я - * НЕ выяснил: буквальные 40 экранных пикселей срезают правый задний угол - * плиты (прогон 2026-08-13). У оригинала obj_x живёт в удвоенных - * единицах (char_x_left = obj_x / 2 + 58), так что 40 может означать и - * не пиксели. До выяснения рисуем кусок целиком. - * - * Подпорки «перерисовать соседний тайл поверх куска» тоже нет: она тащила - * на плиту чужой узор и окно (MOB-CLIP-RIGHT). Цена отказа — правая - * грань куска не прячется за передней гранью соседнего пола; артефакт - * мельче прежнего и уйдёт вместе с сортируемым midtable. */ - /* Спрайты ПАДАЮЩЕГО куска, а не лежащей плиты. У объекта в objtable - * obj_id = 10 (add_mob_to_objtable, seg007:1170), и три части берутся из - * таблиц по этому индексу (seg008:518/596/608): - * loose_fram_left[10] = 70 при (x, y-3) - * loose_fram_bottom[10] = 74 при (x, y) - * loose_fram_right[10] = 72 при (x+32, y-1) - * Здесь стояли 41/43/42 — это индекс 0, то есть плита В ПОКОЕ. Отсюда и - * «цельная ровная плита» вместо двух частей со сдвигом правой половины - * на пиксель (замечено пользователем 2026-08-13 сравнением с оригиналом). - * Габариты частей — в блоке MOB_X0 выше (правая часть у тайлсетов - * РАЗНАЯ: 26 px в подземелье, 25 во дворце). - * - * Рисуем ОДНИМ блитом по композиту (mob_spr_build): три вызова блита - * стоили 258 708 такта в кадре при шести кусках — больше половины - * цианового блока. Три отдельных блита остались резервным путём на - * случай, если композит не собрался. */ - /* Пометки «фон трогали» на время блитов ПОДАВЛЕНЫ: коридор куска - * (MOB_X0 .. +MOB_W, y−27 .. +37) уже помечен ОДНИМ вызовом — из - * pop_loose_mob_tick для летящих кусков и из mob_spawn_copy для куска, - * рождённого внутри тика. Спрайт целиком внутри коридора: по x он - * занимает m->x .. m->x+57, по y m->y−16 .. m->y, коридор — m->x .. - * m->x+63 и m->y−27 .. m->y+37 (запас на ускорение, speed ≤ 31 за кадр). - * Замер 2026-08-17: три настоящих pop_cd_touch стоили 13 506 тактов на - * кусок, то есть 81 000 в кадре при шести кусках. */ - pop_cd_mute(); - /* ВЫХОД ЗА ПОЛЕ РЕЖЕМ САМИ, а не чистим борта после. Раньше здесь стоял - * pop_clip_sprite, то есть кусок рисовался в борт целиком, взводил - * border_dirty, и pop_room_clip_borders потом стирал ДВЕ полосы во всю - * ширину экрана — 320x28 и 320x28. Замер 2026-08-17: 150 978 тактов в - * КАЖДОМ кадре, пока хоть один кусок торчит выше поля, то есть почти весь - * каскад (гряда на 13-м рождается ровно у потолка, y = 2). Это была - * четверть цианового блока. - * - * Окно ставим только когда кусок реально задевает борт: внутри поля блиты - * идут быстрым путём (10 422 против 14 088). */ - { - int ytop = m->draw_y - 16 + POP_YOFF, ybot = m->draw_y + POP_YOFF; - uint8_t clipped = (uint8_t)(ytop < POP_YOFF || ybot >= POP_CLIP_BOTTOM); - if (clipped) pop_t_win_set(0, POP_YOFF, 320, POP_PLAYFIELD_H); - if (mob_spr_ok) { - pop_mem_b(mob_spr, m->x, m->draw_y); - } else { - pop_env_b(74, m->x, m->draw_y); - pop_env_b(70, m->x, m->draw_y - 3); - pop_env_b(72, m->x + 32, m->draw_y - 1); - } - if (clipped) pop_t_win_clear(); - } - pop_cd_unmute(); - m->prev_y[pg] = m->draw_y; - gfx_set_bank(GFX_BANK_NORMAL); -} - -/* Отрисовка кусков, идущих ПОД Kid. Звать ПОСЛЕ pop_redraw_needed(): фон - * кадра обязан быть полностью готов до любого спрайта. - * - * Раньше куски рисовались внутри pop_loose_mob_tick, то есть ДО разбора - * пометок перерисовки, и перепечатка тайла ложилась поверх уже нарисованного - * куска — окно задней стены, передняя грань пола (найдено прогоном - * 2026-08-13, комнаты 16 и 23). */ -void pop_loose_mob_draw(void) __banked -{ - mob_draw_pass(gfx_get_draw_page() & 1, 0); -} - -/* Отложенная отрисовка куска ПОВЕРХ Kid (он ниже Kid по obj_y). Звать - * после отрисовки персонажей, до fore-слоя. */ -void pop_loose_mob_draw_over(void) __banked -{ - mob_draw_pass(gfx_get_draw_page() & 1, 1); -} - -/* Позиция падающего куска для check_loose_fall_on_kid (pop_map): колонка и - * y (низ куска). 0 — куска нет. */ -uint8_t pop_loose_mob_pos(int *col, int *y) __banked -{ - uint8_t i; - /* check_loose_fall_on_kid (seg007:1192) начинается с Char.room == - * curmob.room: кусок, падающий в покинутой комнате, Киду по голове не - * бьёт. */ - for (i = 0; i < MOB_MAX; i++) - if (mobs[i].active && mobs[i].room == pop_t_room) { - *col = mobs[i].col; *y = mobs[i].y; return 1; - } - return 0; -} - -/* Спрайт вышел за поле? → взвести флаг на 2 кадра (обе страницы дабл- - * буфера). Узкий per-спрайт heal НЕ используем: accel-выравнивание блока - * оставляет 1–2px слайверы правой грани → на одной странице мерцает. - * Вместо этого борта чистит pop_room_clip_borders (полоса, но ТОЛЬКО в - * кадрах падения — гейт по флагу). */ -static uint8_t border_dirty; - -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked -{ - int sy_bot = sy_top + h; - (void)x; (void)w; - if (sy_bot > POP_CLIP_BOTTOM || sy_top < POP_YOFF) - border_dirty = 2; /* 2 кадра = обе страницы */ -} - -/* Клип бортов (см. pop_bg.h): работает ТОЛЬКО пока border_dirty (кто-то - * вышел за поле в последние 2 кадра) — иначе ноль стоимости. Возвращает - * чёрный из ОЗУ-копии (вне поля она чёрная) в верхний борт и статус-полосу - * + нижний борт. Звать КАЖДЫЙ кадр ПОСЛЕ всей отрисовки спрайтов. */ -void pop_room_clip_borders(void) __banked -{ - if (!border_dirty) return; - border_dirty--; - /* ОСТАЁТСЯ клипающим осознанно (CLIP-1, 2026-08-01): полоса шириной 320 - * не лезет в 8-битный параметр noclip-ядра, а разбивать её на два куска - * по 160 нет смысла — гейт border_dirty пускает сюда только в кадрах - * падения/выхода за поле, и выигрыш (~2×5.6 К тактов подготовки) там - * тонет в цене самих 320×28 пикселей. Не «оптимизировать» повторно. */ - gfx_heal(0, 0, 320, POP_YOFF); /* верхний борт */ - gfx_heal(0, POP_CLIP_BOTTOM, 320, 256 - POP_CLIP_BOTTOM);/* статус-полоса + нижний борт */ -} - -void pop_room_draw(uint8_t room_num, - const uint8_t *fg, const uint8_t *bg, - const uint8_t *lcol_fg, const uint8_t *lcol_bg) __banked -{ - int row, col; - pop_t_room = room_num; - pop_wall_pattern_reset_b(); /* кэш кладки привязан к номеру комнаты */ - pop_t_fg = fg; pop_t_bg = bg; - pop_t_lfg = lcol_fg; pop_t_lbg = lcol_bg; - - /* прозрачный блит: 0xFF не пишется (чёрный фон/нижние слои проступают) */ - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_t_bake_rest = 1; /* фон = покой (см. pop_t_bake_rest) */ - for (row = 2; row >= 0; row--) /* снизу вверх (2,1,0) */ - for (col = 0; col < 10; col++) - draw_tile(row, col); - /* Полоса кладки у потолка (seg008 draw_room: доп. ряд из room_A, row2 - * при draw_main_y=-1): нижние/правые грани ряда 2 комнаты сверху. Кадры - * высокие — верх ушёл бы в борт (за поле); клип по верхней границе поля - * (POP_YOFF) рисует ТОЛЬКО срез у потолка, без зачернения борта. */ - pop_t_clip_top = POP_YOFF; - for (col = 0; col < 10; col++) - draw_tile(-1, col); - pop_t_clip_top = 0; - pop_t_bake_rest = 0; - gfx_set_bank(GFX_BANK_NORMAL); -} diff --git a/applications/SprPoP/src/pop_settings.h b/applications/SprPoP/src/pop_settings.h deleted file mode 100644 index 727f920..0000000 --- a/applications/SprPoP/src/pop_settings.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * pop_settings.h — рантайм-настройки игры (план docs/menu_settings_plan.md - * §5, этап MS0). Единственный контракт между UI/файлом настроек и игрой: - * gameplay-код читает значения, но не знает про UI-структуры и POP.CFG. - * - * Экран Settings и загрузчик POP.CFG уже используют эти поля; начальные - * значения ставит pop_settings_defaults() из pop_boot() (crt0 зануляет - * _DATA, поэтому ненулевые дефолты литералами в данных запрещены). - */ -#ifndef POP_SETTINGS_H -#define POP_SETTINGS_H - -#include - -typedef enum { - POP_PROFILE_VANILLA = 0, /* текущее поведение SprPoP (план §1) */ - POP_PROFILE_ENHANCED = 1 /* будущий набор fixes (план §12) */ -} pop_gameplay_profile_t; - -typedef struct { - uint8_t sound_enabled; /* 0/1 — зеркало звука (Ctrl+S / pop_sfx) */ - uint8_t music_enabled; /* 0/1 — зеркало музыки (Ctrl+M / pop_mus_want) */ - uint8_t speed_mode; /* POP_SPEED_* (pop_pace.h), 0..2 */ - uint8_t gameplay_profile; /* pop_gameplay_profile_t */ - uint8_t cheats_enabled; /* 0/1 — активны ли чит-клавиши */ - uint8_t show_build_info; /* 0/1 — build info на title (этап MS8) */ - uint16_t enhancement_flags; /* маска будущего ENHANCED (план §12) */ - uint8_t time_limit_enabled;/* 0/1 — 60-минутный лимит / unlimited */ - uint8_t show_debug_bar; /* 0/1 — отладочная полоса в верхнем борте */ -} pop_settings_t; - -extern pop_settings_t pop_settings; -void pop_settings_defaults(void) __banked; - -/* Применить модель к runtime-владельцам (темп, читы, звук). До окончания - * pop_sfx_init() sound_ready=0: звук применится отдельным вызовом после - * инициализации набора. */ -void pop_settings_apply(uint8_t sound_ready) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_sfx.c b/applications/SprPoP/src/pop_sfx.c deleted file mode 100644 index d2a4449..0000000 --- a/applications/SprPoP/src/pop_sfx.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * pop_sfx.c — ГОРЯЧАЯ часть звуковых эффектов: насос в прерывании CBL, - * запуск/останов и таблица звуков. Зачем всё это и в каком виде лежат - * данные — в шапке pop_sfx.h и ../docs/sound_plan.md. - * - * ПОЧЕМУ МОДУЛЬ РЕЗИДЕНТНЫЙ (в EXTRA_SRCS, а не в банке). Три причины, - * и каждой хватило бы одной: - * - callback насоса зовётся ИЗ ПРЕРЫВАНИЯ; трамплин перед вызовом - * ставит базовую страницу W1, значит хендлер обязан быть в базе; - * - pop_sfx_play дёргается из горячих мест (play_seq на каждый шаг - * Кида, физика, боёвка) — трамплин там был бы чистой потерей; - * Файловое чтение страниц выполняет общий резидентный bank_load_file(). - * Холодная половина (аллокация страниц, cbl_open) — в pop_sfx_cold.c. - */ - -#include -#include -#include -#include -#include -#include /* IRQ_DISABLE/IRQ_ENABLE вокруг курсора */ -#include "pop_sfx.h" -#include "pop_music.h" -#include "_pop_sfx.h" - -uint8_t pop_snd_ok; - -/* ХОЧЕТ ЛИ ЗВУКА ПОЛЬЗОВАТЕЛЬ (Ctrl+S) — отдельно от pop_snd_ok. - * - * Разделять обязательно: pop_snd_ok значит «CBL сейчас открыт», и его - * гасит служебная пауза на время загрузки уровня. Если бы Ctrl+S правил - * только его, то первая же смена уровня позвала бы pop_sfx_start() и - * вернула звук, который пользователь выключил. Поэтому start уважает - * этот флаг, а pause его не трогает. - * - * Живёт в резиденте, а не в банке: метку в борте рисует отладочный ярлык - * каждый кадр, и тащить ради одного байта трамплин незачем. */ -uint8_t pop_snd_want; - -/* Курсор проигрывания. volatile: пишет главный цикл, читает прерывание. - * Всё в 8/16 бит — 32-битной арифметики на Z80 избегаем (см. memory - * avoid_32bit_arith_z80); поэтому и в таблице смещение уже разобрано на - * страницу и адрес в окне. */ -/* Курсор МУЗЫКИ. Лежит здесь, а не в pop_music.c, по той же причине, что - * и курсор эффектов: его читает насос из прерывания, то есть резидент. */ -volatile uint8_t pop_mus_pg; -volatile uint16_t pop_mus_ptr; -volatile uint16_t pop_mus_left; -/* Номер играющего трека в нумерации ОРИГИНАЛА: музыка участвует в тех же - * таблицах приоритета и перебиваемости, что и эффекты (см. pop_sfx_tick). */ -uint8_t pop_mus_id; - -/* Тик насоса: +1 на каждый отданный CBL блок, то есть 85,4 Гц. */ -volatile uint8_t pop_snd_tick; - -/* Размер КОЛЬЦА страниц для потоковой музыки, 0 — обычный трек целиком в - * памяти. Читает насос, ставит загрузчик (pop_music.c). */ -uint8_t pop_mus_ring; - -/* Заявка на музыкальный трек: номер в нумерации оригинала, 0 — нет заявки - * (нулевого трека не бывает). Ставит pop_sfx_play, снимает главный цикл. */ -uint8_t pop_mus_req; - -/* ХОЧЕТ ЛИ ПОЛЬЗОВАТЕЛЬ МУЗЫКУ (Settings / Ctrl+M) — отдельно от звука. - * Оригинал такого разделения не знал (там один тумблер на всё), но у нас - * музыка это ПОТОК С ДИСКА: кому мешает подкачка или просто не нужен - * саундтрек, гасит её, не теряя эффектов. */ -uint8_t pop_mus_want; - -static volatile uint8_t sfx_pg; /* индекс в pop_snd_page[] */ -static volatile uint16_t sfx_ptr; /* адрес в окне W0: 0x0000..0x3FFF */ -static volatile uint16_t sfx_left; /* сколько байт осталось (кратно 128) */ - -/* ---- насос ---------------------------------------------------------- * - * Зовётся из ISR CBL раз в ~11,7 мс за очередными 128 байтами. - * - * ОКНО БЕРЁМ ВЗАЙМЫ У W3, А НЕ У W0 — и это принципиально. - * - * Раньше насос занимал W0. Оказалось, что так звук рвёт ЛЮБОЙ вызов - * BIOS: `rst 8` — это `out ($7C),a`, который включает системное ПЗУ и - * перестраивает окно 0 (в MAME это update_memory: m_pages[0] + - * m_bank_view0.select). ПЗУ ложится ПОВЕРХ страничного регистра, поэтому - * запись в порт 0x82 из прерывания ничего не даёт — OTIR честно - * вычитывает ПЗУ и отдаёт его в CBL. На слух это скрежет; поймано на - * затемнении в PoP (2026-08-25), причём одинаково при чтении палитры, - * записи палитры и вообще любой функции BIOS. - * - * W3 таким свойством не обладает: он управляется ТОЛЬКО портом 0xE2, и - * подмену из прерывания никто не перекрывает. BIOS тоже двигает W3 - * (LP_OPEN_PG, PIC_SET_PAL), но во время нашего ISR он не исполняется — - * мы возвращаем окно до выхода, и для него подмена невидима. Ровно так - * же незаметна она и для фона с accel-блитом: их DI-банды прерывание не - * рвёт, а между бандами W3 всегда восстановлен. - * - * Идея пользователя, 2026-08-25. Тот же приём заимствования окна, что у - * трамплина с W1 (_irq_tramp.c). - * - * Заплатки ISR-стаба в 0x38/0x66 нашим страницам НЕ нужны (в отличие от - * страницы уровня, pop_level_read_file): пока страница замаплена, мы - * внутри прерывания и IFF сброшен — прерваться некому. - * - * ТИШИНУ ЛЬЁМ СВОЮ. Когда эффект кончился, отдавать в CBL всё равно надо: - * иначе железо крутит по кругу хвост своего буфера и это слышно как - * жужжание. Готовый блок 0x80 лежит первым в наборе (упаковщик), поэтому - * libc-шный CBL_UNDERRUN_SILENCE с его malloc нам не нужен — а куча в - * тесном резиденте W2 отказала бы и уронила весь звук. */ -int pop_sfx_fill(uint16_t n) -{ - uint8_t saved, phys; - uint16_t ptr; - - /* ЧАСЫ СЦЕН. Насос зовётся строго по расходу буфера CBL — 85,4 раза в - * секунду, что бы ни делал главный цикл. Это единственный источник времени, - * которому не мешают ни долгие блиты, ни чтение с диска: кадровые - * прерывания теряются в di-окнах акселератора (pop_pace.h), а счёт - * ожиданий vsync считает НАШИ ожидания, а не прошедшее время. - * Катсцены пейсятся по нему — иначе картинка уезжает от музыки. */ - pop_snd_tick++; - - /* Три источника по убыванию важности: эффект, музыка, тишина. Эффект - * перебивает музыку — как у оригинала, где play_sound глушит всё, что - * звучало; голос-то один. Музыка при этом НЕ теряет позицию: её - * курсор стоит, пока эффект доигрывает, и она продолжается с места. */ - if (sfx_left) { - phys = pop_snd_page[sfx_pg]; ptr = sfx_ptr; - } else if (pop_mus_left) { - phys = pop_mus_page[pop_mus_pg]; ptr = pop_mus_ptr; - } else { - phys = pop_snd_page[POP_SND_SILENCE_PAGE]; - ptr = POP_SND_SILENCE_OFF; - } - /* ОКНО БЕРЁМ ВЗАЙМЫ У W3, А НЕ У W0 — см. шапку файла. */ - saved = _io_page_w3; - _io_page_w3 = phys; - cbl_push_otir((const void *)(0xC000u + ptr), n); - _io_page_w3 = saved; - if (!sfx_left) { - if (!pop_mus_left) return 1; /* тишина — курсор не двигаем */ - /* Длину трека считаем ПОРЦИЯМИ насоса, а не байтами: 169 КБ в - * uint16 не влезает, а 1350 блоков — легко (32-бит арифметики на - * Z80 избегаем, тем более в прерывании). */ - pop_mus_left--; - pop_mus_ptr += n; - if (pop_mus_ptr >= 0x4000) { - pop_mus_ptr = 0; - /* КОЛЬЦО. Финальная тема — 1,2 МБ, в память целиком не влезает - * никак, поэтому она играется из нескольких страниц по кругу, а - * загрузчик дочитывает в те, что мы уже прошли (pop_music.c). - * Конец трека определяет left, а не номер страницы. */ - if (pop_mus_ring) { - if ((uint8_t)(pop_mus_pg + 1) < pop_mus_ring) pop_mus_pg++; - else pop_mus_pg = 0; - } else if ((uint8_t)(pop_mus_pg + 1) < POP_MUS_PAGES) { - pop_mus_pg++; - } else { - pop_mus_left = 0; - } - } - return 1; - } - - sfx_ptr += n; - if (sfx_ptr >= 0x4000) { /* граница страницы — ровно по блоку */ - sfx_ptr = 0; - /* Переход на следующую страницу нужен ровно одному эффекту — тому, - * что сам ДЛИННЕЕ страницы (упаковщик с 2026-08-25 кладёт остальные - * целиком в одну). Гард обязателен: без него ошибка в длине увела - * бы насос за pop_snd_page[] и он читал бы чужую память — на слух - * это «играет не тот звук», причём каждый раз другой. */ - if ((uint8_t)(sfx_pg + 1) < pop_snd_pages) sfx_pg++; - else sfx_left = n; /* обрываем */ - } - sfx_left -= n; - return 1; -} - -/* ---- ОЧЕРЕДЬ И ПРИОРИТЕТЫ (порт seg000:12C5 + seg000:1304) ------------ * - * - * Оригинал НЕ перебивает играющий звук чем попало, и это слышно. Модель - * ровно такая: - * - * play_sound(id) — только НОМИНИРУЕТ кандидата на кадр; из нескольких - * за кадр остаётся ВАЖНЕЙШИЙ (меньше prio = важнее, - * при равенстве побеждает последний — сравнение <=); - * play_next_sound() — раз в кадр решает, запускать ли: можно, если ничего - * не играет, ЛИБО текущий звук помечен «перебиваемым» - * И новый не менее важен. Иначе номинант ВЫБРАСЫВАЕТСЯ - * (next_sound = -1 безусловно), а не встаёт в очередь. - * - * Отсюда то, что слышно в игре: `gate_closing_fast` (6) неперебиваем и - * доигрывает до звонкого конца, а приземление Кида в этот момент пропадает - * совсем; челюсти (47, prio 0x10) всегда важнее решётки (4, prio 0x32), и - * решётка звучит только в паузах между укусами. - * - * Таблицы — из SDLPoP (sound_prio_table seg000:1528, sound_interruptible - * data.h:433) с правками fix_sound_priorities(): в config.h SDLPoP - * FIX_SOUND_PRIORITIES определён безусловно, то есть сравниваем мы себя - * именно с исправленным вариантом (10 -> 0x0D, 48 -> 0x15, 49 перебиваем). - */ - -/* Приоритет: МЕНЬШЕ значит ВАЖНЕЕ. Музыкальные id тут тоже есть — они - * никогда не номинируются (нет оцифровки), но индексация должна совпадать - * с оригиналом, иначе таблицу не сверить глазами. */ -static const uint8_t snd_prio[POP_SND_COUNT] = { - 0x14, 0x1E, 0x23, 0x66, 0x32, 0x37, 0x30, 0x30, 0x4B, 0x50, /* 0.. 9 */ - 0x0D, 0x12, 0x0C, 0x0B, 0x69, 0x6E, 0x73, 0x78, 0x7D, 0x82, /* 10..19 */ - 0x91, 0x96, 0x9B, 0xA0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x13, /* 20..29 */ - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* 30..39 */ - 0x01, 0x01, 0x01, 0x01, 0x87, 0x8C, 0x0F, 0x10, 0x15, 0x16, /* 40..49 */ - 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01 /* 50..56 */ -}; - -/* «Играющий звук можно перебить» — битовая карта (бит id&7 байта id>>3): - * 57 флагов уложены в 8 байт, потому что в резиденте W1/W2 каждая сотня - * байт на счету, а читаем мы их раз в кадр. */ -static const uint8_t snd_intr[8] = { - /* 0.. 7 */ (uint8_t)(0<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 0<<6 | 1<<7), - /* 8..15 */ (uint8_t)(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 0<<6 | 0<<7), - /*16..23 */ (uint8_t)(1<<0 | 1<<1 | 0<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7), - /*24..31 */ (uint8_t)(0<<0 | 0<<1 | 0<<2 | 0<<3 | 0<<4 | 1<<5 | 0<<6 | 0<<7), - /*32..39 */ 0, - /*40..47 */ (uint8_t)(0<<0 | 0<<1 | 0<<2 | 0<<3 | 0<<4 | 0<<5 | 0<<6 | 1<<7), - /*48..55 */ 0, - /*56.. */ 0 -}; - -/* Створка двери уровня (15) — единственная запись, которую оригинал правит - * НА ХОДУ (seg007:442/464): при закрытии её перебивать можно, при открытии - * нельзя (иначе съезд створки обрывается и «конца» не слышно). Держим - * отдельным байтом, чтобы таблица осталась в ПЗУ. */ -uint8_t pop_sfx_slide_intr; - -/* Номинант кадра, ЗАПИСАННЫЙ КАК id+1: ноль значит «никого». Так сделано - * ради crt0 — он зануляет _DATA, а «нет номинанта» у оригинала это -1; - * со смещением на единицу начальное состояние получается даром. */ -static uint8_t snd_next1; -static uint8_t snd_curr; /* что играет — для prio/intr */ - -static uint8_t snd_interruptible(uint8_t id) -{ - if (id == 15) return pop_sfx_slide_intr; - return (uint8_t)(snd_intr[id >> 3] & (uint8_t)(1 << (id & 7))); -} - -/* ---- запуск / останов ------------------------------------------------ */ - -void pop_sfx_play(uint8_t id) -{ - if (!pop_snd_ok || id >= POP_SND_COUNT) return; - /* НЕТ ОЦИФРОВКИ — ЗНАЧИТ ЭТО МУЗЫКА. В оригинале звуки 24..43 играет - * Adlib по MIDI, и в digisnd их нет вовсе; у нас на их месте записи - * DOS-версии, которые надо читать с диска. В прерывании и в горячем - * коде этого делать нельзя, поэтому здесь только ЗАЯВКА одним байтом — - * её разбирает главный цикл (pop_music_stream, банк 9). - * В конкурсе эффектов такой id не участвует: он не глушит живой звук - * (порт проверки `if (NULL == sound_pointers[id]) return;`). */ - if (pop_snd_tbl[id].len == 0) { - /* Заявку принимаем ТОЛЬКО в музыкальном диапазоне оригинала - * (24..43 — Adlib-треки игры). Пустых слотов в наборе больше нет, - * но случайный мусорный id обязан молчать, а не запускать трек на - * минуту: ровно так проявился sdcc_z80_cmp_store_a_bug в звуке - * тряски — разность двух номеров попала в 27 и заиграла музыка. */ - if (pop_mus_want && id >= 24 && id <= 43) pop_mus_req = id; - return; - } - /* НАБОР ЕЩЁ ДОЧИТЫВАЕТСЯ. На старте программы звук открывается после - * ОДНОЙ страницы (в ней блок тишины), чтобы музыка заставки заиграла - * почти сразу; остальные приезжают позже (pop_sfx_init_begin/finish). - * Страницы под них уже выделены, но не прочитаны — эффект из такой - * страницы был бы шумом из чужих данных. Заявку на МУЗЫКУ выше это - * не трогает: её данные лежат отдельно. */ - if (!pop_snd_pages) return; - if (!snd_next1 || snd_prio[id] <= snd_prio[snd_next1 - 1]) - snd_next1 = (uint8_t)(id + 1); -} - -void pop_sfx_tick(void) -{ - uint8_t id, pg; - uint16_t off, len; - if (!snd_next1) return; - id = (uint8_t)(snd_next1 - 1); - snd_next1 = 0; /* номинант живёт ровно кадр */ - /* ЧТО СЕЙЧАС ЗВУЧИТ — эффект либо музыка. У оригинала это один и тот - * же вопрос: check_sound_playing() отвечает «играет хоть что-то», без - * различия типа, а музыкальные id лежат в тех же таблицах приоритета и - * перебиваемости (seg000:1672 + data.h:433). Почти вся музыка помечена - * НЕперебиваемой, поэтому пока она играет, эффект просто не стартует — - * ровно это слышно в оригинале. Исключение одно: 29 meet_Jaffar. */ - { - uint8_t cur = sfx_left ? snd_curr : pop_mus_id; - if ((sfx_left != 0 || pop_mus_left != 0) && - (!snd_interruptible(cur) || snd_prio[id] > snd_prio[cur])) - return; /* ...и уступать не обязано */ - } - snd_curr = id; - pg = pop_snd_tbl[id].page; - off = pop_snd_tbl[id].off; - len = pop_snd_tbl[id].len; - /* Курсор из трёх полей, а читает его прерывание — обновляем под DI, - * иначе насос может застать наполовину обновлённое состояние и уехать - * в чужие данные. */ - IRQ_DISABLE(); - sfx_pg = pg; - sfx_ptr = off; - sfx_left = len; - IRQ_ENABLE(); -} - -void pop_sfx_stop(void) -{ - IRQ_DISABLE(); - sfx_left = 0; - IRQ_ENABLE(); -} diff --git a/applications/SprPoP/src/pop_sfx.h b/applications/SprPoP/src/pop_sfx.h deleted file mode 100644 index aba1e82..0000000 --- a/applications/SprPoP/src/pop_sfx.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * pop_sfx.h — звуковые ЭФФЕКТЫ PoP через COVOX-Blaster. - * - * Данные — оригинальная оцифровка игры (`digisnd1..3.dat`), приведённая - * упаковщиком к 10 937,5 Гц. Конвертировать в рантайме нечего: у PoP - * сэмплы 8 бит БЕЗЗНАКОВЫЕ МОНО, и это ровно формат CBL (см. и - * ../docs/sound_plan.md). - * - * ОДИН ГОЛОС. Оригинал тоже одноголосый: `play_sound` глушит - * предыдущий звук (`stop_sounds`, seg009.c), поэтому новый эффект просто - * перебивает играющий, и никакого микшера не нужно. - * - * ПОЧЕМУ ЭТО НЕ ЛОМАЕТ КАДР. Насос живёт в прерывании CBL и отдаёт 128 - * байт раз в ~11,7 мс. Кадровые прерывания при этом теряются (ветка CBL - * в трамплине делает приватный RETI), но нам всё равно: темп кадра - * считается ПО ЛУЧУ (pop_pace.h), а не по прерываниям. Если бы пейсинг - * остался на них — звук сломал бы игру. - */ -#ifndef POP_SFX_H -#define POP_SFX_H - -#include - -/* ПОДЪЁМ НАБОРА РАЗБИТ НАДВОЕ — ради быстрого старта программы. - * - * Насосу, чтобы открыть CBL и заиграть МУЗЫКУ, нужен из всего набора - * ровно один блок — тишина, и упаковщик обязан класть её первым блоком - * СТРАНИЦЫ 0 (tools/pop_idx.py, проверка `_check_entry`). Поэтому: - * - * pop_sfx_init_begin() — индекс (snd.idx) + ОДНА страница (33 мс). - * После него можно звать pop_sfx_start() и - * играть музыку; эффектов ещё нет. - * pop_sfx_init_finish() — остальные страницы (~230 мс) и публикация - * pop_snd_pages: с этого момента есть эффекты. - * - * Пока набор неполон, pop_sfx_play() молча игнорирует эффекты (заявку на - * музыку принимает по-прежнему): страницы под них выделены, но ещё не - * прочитаны, и играть из них — это шум из чужих данных. - * - * ВЫВОД НИ ТА, НИ ДРУГАЯ НЕ ВКЛЮЧАЕТ — см. pop_sfx_start. 0 — OK, -1 — - * не получилось (тогда всё дальнейшее молча ничего не делает, игра идёт - * без звука; begin при отсутствии индекса поднимает набор из одной - * страницы тишины, чтобы не встала музыка). */ -int pop_sfx_init_begin(void) __banked; -int pop_sfx_init_finish(void) __banked; - -/* Включить вывод (открыть CBL). Звать ПОСЛЕ всей загрузки: пока идёт - * чтение файлов, ESTEX уходит в диск надолго, насос не успевает долить - * блок, и железо крутит хвост своего буфера — на слух сплошной скрежет. - * Идемпотентно. */ -int pop_sfx_start(void) __banked; - -/* Заглушить вывод на время загрузки (закрывает CBL). Парная к start. */ -void pop_sfx_pause(void) __banked; - -/* Закрыть CBL и отпустить страницы; звать на выходе. */ -void pop_sfx_close(void) __banked; - -/* Вкл/выкл звук по воле пользователя (Ctrl+S, порт SDLPoP seg000:657). - * Правит pop_snd_want и приводит вывод в соответствие. */ -void pop_sfx_toggle(void) __banked; - -/* ХОЧЕТ ЛИ ЗВУКА ПОЛЬЗОВАТЕЛЬ. Не то же самое, что «CBL открыт»: вывод - * ещё гасит служебная пауза на время загрузки уровня. Читать для - * индикации; писать — только через pop_sfx_toggle. 0 и в случае, когда - * набор вообще не поднялся (нет файлов, нет страниц) — то есть флаг - * честно means «звука не будет». */ -extern uint8_t pop_snd_want; - -/* ЧАСЫ ДЛЯ СЦЕН: +1 на каждый блок, отданный CBL, то есть ровно 85,4 Гц - * (10 937,5 / 128), пока звук открыт. Идут от расхода буфера железом, а - * не от нашего кода, поэтому не врут ни на долгих блитах, ни на чтении с - * диска — в отличие от счёта ожиданий vsync (тот считает НАШИ ожидания) и - * от кадровых прерываний (те теряются в di-окнах акселератора, pop_pace.h). - * Переполняется каждые 3 с — разности брать в uint8_t и накапливать. - * Когда CBL закрыт (звук выключён), НЕ ИДУТ: у пейсинга обязан быть - * запасной путь по кадрам луча. */ -extern volatile uint8_t pop_snd_tick; - -/* ЗАЯВКА НА МУЗЫКУ. pop_sfx_play(id) для звука без оцифровки (24..43 — - * в оригинале это Adlib-музыка) кладёт сюда номер трека, а разбирает - * заявку главный цикл: чтение с диска ни в прерывании, ни в горячем коде - * недопустимо. 0 — заявки нет. Снимать обязан тот, кто обработал. */ -extern uint8_t pop_mus_req; - -/* Тумблер МУЗЫКИ (Settings / Ctrl+M), независимый от тумблера эффектов: - * музыка у нас — поток с диска, и выключают её по другим причинам. - * 0 — заявки не принимаются, играющий трек глушится (pop_music_service). */ -extern uint8_t pop_mus_want; - -/* Заявить эффект с номером id (0..56 — нумерация оригинала, см. - * sound_plan.md). НЕ запускает его немедленно и НЕ перебивает играющий: - * это порт play_sound (seg000:12C5), который лишь НОМИНИРУЕТ кандидата на - * текущий кадр. Из нескольких заявок за кадр выживает важнейшая, а решение - * «запускать или нет» принимает pop_sfx_tick. Звуки без оцифровки (музыка) - * игнорируются. - * - * НЕ банковая и НЕ __banked: зовётся из горячих мест (play_seq в - * pop_kid.c, физика, боёвка), и трамплин на каждый шаг Кида не нужен. */ -void pop_sfx_play(uint8_t id); - -/* Раз в кадр: запустить номинанта, если можно (порт play_next_sound, - * seg000:1304). Оригинал зовёт его в конце отрисовки кадра — зовём там же. - * Не запустили — номинант ВЫБРАСЫВАЕТСЯ, очереди у оригинала нет. */ -void pop_sfx_tick(void); - -/* Перебиваемость съезжающей створки двери уровня (звук 15) — единственная - * запись таблицы, которую оригинал правит на ходу (seg007:442/464): - * 1 при закрытии двери, 0 при открытии. */ -extern uint8_t pop_sfx_slide_intr; - -/* Оборвать текущий эффект (порт stop_sounds). */ -void pop_sfx_stop(void); - -#endif diff --git a/applications/SprPoP/src/pop_sfx_cold.c b/applications/SprPoP/src/pop_sfx_cold.c deleted file mode 100644 index 2c20673..0000000 --- a/applications/SprPoP/src/pop_sfx_cold.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * pop_sfx_cold.c — ХОЛОДНАЯ половина звука: поднять набор и открыть CBL. - * Отрабатывает один раз за запуск, поэтому живёт в банке 8; горячая - * половина (насос, запуск эффекта) — в резиденте, см. pop_sfx.c. - */ - -#include -#include -#include -#include -#include -#include -#include "pop_sfx.h" -#include "pop_arc.h" -#include "_pop_sfx.h" -#include "_pop_file.h" /* POP_PATH_CALL — старые DSS и пути */ -#include /* IRQ_DISABLE вокруг записи в W0 */ -#include /* gfx_w0_map — залить блок тишины */ - -static uint8_t snd_blk; /* блок EMM под весь набор */ -/* Раздельная загрузка (см. шапку pop_sfx.h): сколько страниц обещал индекс - * и сколько уже прочитано. 0 в want — begin не проходил либо поднялась - * только страница тишины (набора нет), и дочитывать нечего. */ -static uint8_t snd_want_pages; -static uint8_t snd_done_pages; - -/* --- ИНДЕКС НАБОРА (SND/snd.idx, формат PSI1) ----------------------- * - * - * Раскладка эффектов приезжает с диска, а не из EXE: так пара - * snd.idx + snd.arc заменяется целиком (SDLPoP <-> MSDOS) без - * перекомпиляции игры. Писатель формата — tools/pop_idx.py, он же - * покрыт тестом; проверки ниже повторяют его один в один, потому что - * доверять содержимому файла нельзя: битый индекс увёл бы насос за - * пределы выделенного блока EMM. - * - * Заголовок: 16 байт, дальше POP_SND_COUNT записей по 5 байт подряд — - * ровно в том виде, в каком лежит pop_snd_tbl[], поэтому читаются они - * ОДНИМ read'ом прямо туда, без разбора по полям. */ -#define IDX_HDR_SIZE 16 -#define IDX_BLOCK_LOG2 7 /* 1 << 7 == POP_SND_BLOCK */ -#define IDX_PCM_FMT 1 /* u8 mono, CBL_FREQ_10K9 */ -#define IDX_TBL_SIZE (POP_SND_COUNT * (int)sizeof(pop_snd_ent_t)) - -/* Имя знает сам модуль — литерал лежит в rodata банка 8, и open() читает - * его, пока в W3 стоит этот же банк (тот же приём, что в pop_arc.c). */ -static const char idx_path[] = "SND\\snd.idx"; - -/* Одна запись: ровно те проверки, что делает упаковщик. - * - * СЧИТАЕМ В БЛОКАХ, А НЕ В БАЙТАХ. Байтовый адрес конца эффекта - * (page * 16384 + off + len) не влезает в uint16, а 32-битная арифметика - * на Z80 дорога (memory avoid_32bit_arith_z80). В блоках по 128 весь - * набор — не больше POP_SND_MAX_PAGES * 128 = 2048, и всё считается - * шестнадцатью битами. */ -static int8_t idx_entry_ok(const pop_snd_ent_t *e, uint8_t pages) -{ - uint16_t start, end; - - if (e->len == 0) /* нет оцифровки — это музыка */ - return (e->page == 0 && e->off == 0) ? 0 : -1; - if (e->page >= pages) return -1; - if (e->off >= 0x4000) return -1; - if ((e->off | e->len) & (POP_SND_BLOCK - 1)) return -1; - /* Блок тишины неприкосновенен: насос льёт его, когда играть нечего. */ - if (e->page == POP_SND_SILENCE_PAGE && e->off < POP_SND_BLOCK) return -1; - start = (uint16_t)((uint16_t)e->page << 7) + (uint16_t)(e->off >> 7); - end = (uint16_t)(start + (uint16_t)(e->len >> 7)); - /* Длинный эффект переливается на следующие страницы — они обязаны - * быть загружены, иначе насос уйдёт в чужую память. */ - if (end > (uint16_t)((uint16_t)pages << 7)) return -1; - return 0; -} - -/* Прочитать и проверить индекс. Возвращает число страниц набора либо 0. */ -static uint8_t idx_load(void) -{ - uint8_t head[IDX_HDR_SIZE]; - uint8_t pages, i; - int fd; - - POP_PATH_CALL(fd, open(idx_path, O_RDONLY)); - if (fd < 0) return 0; - if (read(fd, head, IDX_HDR_SIZE) != IDX_HDR_SIZE || - memcmp(head, "PSI1", 4) != 0 || - head[4] != POP_SND_COUNT || - head[5] != (uint8_t)sizeof(pop_snd_ent_t) || - head[6] != IDX_BLOCK_LOG2 || - head[7] != IDX_PCM_FMT) { - close(fd); - return 0; - } - pages = head[8]; - if (pages == 0 || pages > POP_SND_MAX_PAGES) { close(fd); return 0; } - /* Записи ложатся прямо в резидентную таблицу: дисковый формат и - * структура совпадают побайтово (проверено статически в - * pop_snd_data.c и полем head[5] выше). */ - if (read(fd, pop_snd_tbl, IDX_TBL_SIZE) != IDX_TBL_SIZE) { - close(fd); - return 0; - } - close(fd); - for (i = 0; i < POP_SND_COUNT; i++) - if (idx_entry_ok(&pop_snd_tbl[i], pages) != 0) return 0; - return pages; -} - -/* НАБОРА НЕТ — НО НАСОС ВСЁ РАВНО ОБЯЗАН РАБОТАТЬ. - * - * Тишину в паузах насос льёт из ПЕРВОГО БЛОКА НАБОРА, поэтому без набора - * CBL не открывался вовсе. А вместе с ним вставала и МУЗЫКА: её блоки - * отсчитывает тот же насос (pop_mus_left убывает только в pop_sfx_fill). - * Заставка при этом висла намертво — ждала конца трека, который не - * начинал играть, и pop_music_busy() не гас никогда (поймано - * пользователем 2026-08-31 на образе без snd.idx). - * - * Поэтому при отказе индекса поднимаем ПУСТОЙ набор: одна страница EMM с - * блоком тишины. Эффектов нет — все len в таблице нулевые, и - * pop_sfx_play уходит по ветке «нет оцифровки», — а музыка играет. - * - * ЗАЛИВАЕМ ТОЛЬКО ПЕРВЫЙ БЛОК, и это не экономия: gfx_w0_page_prepare - * ставит в страницу IRQ/NMI-стабы, чтобы прерывание при замапленном W0 - * нашло валидный код. Заливка ВСЕЙ страницы затирает их, и первое же - * прерывание уводит процессор в мусор — чёрный экран на старте (поймано - * при первой попытке этого фикса). Насосу больше 128 байт и не нужно: - * он берёт ровно блок тишины, да и то через W3, а не через W0. - * Запись — под DI: 128 байт накрывают стаб RST38, и до unmap прерываний - * быть не должно. */ -static int8_t snd_silence_only(void) -{ - uint8_t blk, page; - uint8_t *w0 = (uint8_t *)0x0000; /* окно 0 — сюда ляжет страница */ - - memset(pop_snd_tbl, 0, sizeof(pop_snd_tbl)); - blk = mem_alloc_pages(1); - if (!blk) return -1; - page = mem_get_page(blk, 0); - if (!page) { mem_free_block(blk); return -1; } - gfx_w0_page_prepare(page); - IRQ_DISABLE(); - gfx_w0_map(page); - memset(w0, 0x80, POP_SND_BLOCK); /* 0x80 — тишина в 8-бит без знака */ - gfx_w0_unmap(); - IRQ_ENABLE(); - pop_snd_page[POP_SND_SILENCE_PAGE] = page; - snd_blk = blk; - pop_snd_pages = 1; - return 0; -} - -/* ПЕРВАЯ ПОЛОВИНА: индекс + страница 0 (в ней блок тишины). После неё - * звук можно открывать, и музыка играет; эффекты — после finish. */ -int pop_sfx_init_begin(void) __banked -{ - uint8_t blk, pages; - - if (snd_blk) return 0; /* набор уже поднимали */ - - /* СНАЧАЛА ИНДЕКС, ПОТОМ ДАННЫЕ: сколько страниц читать и куда какой - * эффект лёг — знает только он. Набора без индекса не бывает: - * держать в EXE запасную таблицу нельзя, иначе привязка бинарника к - * конкретному набору вернётся через чёрный ход. */ - pages = idx_load(); - if (!pages) { - /* Набор эффектов не поднялся — но звук как таковой поднять надо, - * иначе встанет музыка (см. snd_silence_only). Возвращаем -1: - * эффектов действительно нет, и вызывающий вправе об этом знать. */ - if (snd_silence_only() != 0) return -1; - pop_snd_want = 1; - return -1; - } - - /* Одним блоком: страницы блока идут подряд по логическому индексу, и - * таблица звуков адресует их именно так (page = смещение >> 14). - * - * Из АРХИВА, а не десятью файлами: `open` стоит 51,4 мс против 32,6 мс - * на чтение 16 КБ (замер 2026-08-25), то есть девять лишних открытий — - * это почти полсекунды на ровном месте. Таблица живёт на стеке, см. - * pop_arc.h. */ - { - pop_arc_t arc; - uint8_t tbl[POP_SND_MAX_PAGES * POP_ARC_REC]; - - /* Архив обязан содержать РОВНО столько страниц, сколько обещал - * индекс: расходящейся паре доверять нельзя — она означает, что - * snd.idx и snd.arc из разных наборов. */ - if (pop_arc_open_id(&arc, POP_ARC_SND, tbl, POP_SND_MAX_PAGES) != - (int8_t)pages) - return -1; - /* Блок выделяем СРАЗУ на весь набор: номера страниц отдаёт - * mem_get_page по индексу, и finish дочитает в те же самые. */ - blk = mem_alloc_pages(pages); - if (!blk) { pop_arc_close(&arc); return -1; } - pop_snd_page[POP_SND_SILENCE_PAGE] = mem_get_page(blk, 0); - if (!pop_snd_page[POP_SND_SILENCE_PAGE] || - pop_arc_read(&arc, tbl, 0, 0, - pop_snd_page[POP_SND_SILENCE_PAGE], 0, 0) != 16384) { - pop_arc_close(&arc); - mem_free_block(blk); - return -1; - } - pop_arc_close(&arc); - } - snd_blk = blk; - snd_want_pages = pages; - snd_done_pages = 1; - /* pop_snd_pages НЕ ставим: набор ещё неполон, и до finish эффекты - * запускать нельзя (страницы выделены, но не прочитаны). */ - pop_snd_want = 1; /* набор есть — звук по умолчанию включён */ - return 0; -} - -/* ВТОРАЯ ПОЛОВИНА: дочитать остальные страницы и разрешить эффекты. - * Идемпотентна; архив открывается второй раз (51 мс) — это дешевле, чем - * держать открытый манипулятор через всю заставку при лимите в восемь. */ -int pop_sfx_init_finish(void) __banked -{ - pop_arc_t arc; - uint8_t tbl[POP_SND_MAX_PAGES * POP_ARC_REC]; - uint8_t i; - - if (pop_snd_pages) return 0; /* набор уже полный */ - if (!snd_want_pages) return -1; /* begin не проходил либо только тишина */ - if (snd_done_pages < snd_want_pages) { - if (pop_arc_open_id(&arc, POP_ARC_SND, tbl, POP_SND_MAX_PAGES) != - (int8_t)snd_want_pages) - return -1; - for (i = snd_done_pages; i < snd_want_pages; i++) { - pop_snd_page[i] = mem_get_page(snd_blk, i); - if (!pop_snd_page[i] || - pop_arc_read(&arc, tbl, i, 0, pop_snd_page[i], 0, 0) != 16384) { - pop_arc_close(&arc); - return -1; /* страницы не отдаём: тишина в стр.0 жива */ - } - snd_done_pages = (uint8_t)(i + 1); - } - pop_arc_close(&arc); - } - /* Число страниц ставим ПОСЛЕДНИМ: до этого момента насос обязан - * видеть 0 и не пытаться ходить по полузаполненной таблице. */ - pop_snd_pages = snd_want_pages; - return 0; -} - -/* ЗАПУСТИТЬ ВЫВОД — ОТДЕЛЬНО ОТ ЗАГРУЗКИ, и это не косметика. - * - * Пока идёт чтение файлов, CBL держать открытым НЕЛЬЗЯ: ESTEX уходит в - * диск надолго, насос не успевает долить очередные 128 байт, и железо - * крутит по кругу хвост своего 256-байтового буфера. На слух это - * сплошной скрежет (поймано пользователем на старте, 2026-08-20). - * Поэтому загрузка страниц и открытие CBL разведены: грузим молча, - * включаем звук последним действием, а на время загрузки уровня глушим - * (pop_sfx_pause). - * - * Параметры: 10 937,5 Гц, 8 бит моно — формат данных один в один - * (sound_plan.md). OTIR, а не акселератор: тот нужен только для 16 бит. - * cbl_open, а не cbl_open_silence: тишину насос льёт СВОЮ (первый блок - * набора), и просить у libc буфер через malloc не надо — куча в резиденте - * W2 тесная, и её отказ ронял бы весь звук. Заодно так malloc вообще не - * приезжает в резидент (275 Б, см. libc/cbl/_cbl_open_raw.c). */ -int pop_sfx_start(void) __banked -{ - if (pop_snd_ok) return 0; - if (!pop_snd_want) return 0; /* выключено пользователем (Ctrl+S) */ - if (!snd_blk) return -1; /* набор не загружен */ - if (cbl_open(CBL_FREQ_10K9, CBL_FMT_MONO8, CBL_PUMP_OTIR, - pop_sfx_fill) != 0) - return -1; - pop_snd_ok = 1; - return 0; -} - -void pop_sfx_pause(void) __banked -{ - if (!pop_snd_ok) return; - pop_sfx_stop(); - cbl_close(); - pop_snd_ok = 0; -} - -void pop_sfx_close(void) __banked -{ - pop_sfx_pause(); - if (snd_blk) { mem_free_block(snd_blk); snd_blk = 0; } -} - -/* Ctrl+S — порт `turn_sound_on_off((!is_sound_on) * 15)` из SDLPoP - * (seg000:657). Выключение реально ЗАКРЫВАЕТ CBL, а не глушит сэмпл: - * иначе насос продолжал бы отдавать блоки тишины 85 раз в секунду, а это - * 3,3 % процессорного времени ни за что (замер: 8 001 такт на прерывание - * при периоде 245 759). Открытие обратно дешёвое — cbl_open только - * настраивает железо, страницы набора никуда не девались. */ -void pop_sfx_toggle(void) __banked -{ - if (pop_snd_want) { - pop_sfx_pause(); /* pause сам не трогает want... */ - pop_snd_want = 0; /* ...поэтому гасим его следом */ - } else { - pop_snd_want = 1; - /* Набора может не быть вовсе (файлы не прочитались, страницы не - * дались) — тогда откатываем флаг, чтобы индикация не врала. */ - if (pop_sfx_start() != 0) pop_snd_want = 0; - } -} diff --git a/applications/SprPoP/src/pop_shadow.c b/applications/SprPoP/src/pop_shadow.c deleted file mode 100644 index 721dcb2..0000000 --- a/applications/SprPoP/src/pop_shadow.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * pop_shadow.c — загрузка запечённого набора спрайтов Тени. Зачем набор - * отдельный и почему половин две — в шапке pop_shadow.h. - * - * Код ХОЛОДНЫЙ (раз на уровень), поэтому живёт в банке 8 вместе с прочей - * загрузкой. Сами atlas_t — в W2: их читает отрисовка из банка 4, а - * данные видны из любого банка. - */ - -#include -#include -#include -#include "pop_arc.h" -#include "shadow_arc.h" -#include "pop_shadow.h" -#include "pop_shadow_atlas.h" - -atlas_t pop_shadow_kid[POP_SHADOW_KID_PAGES]; -atlas_t pop_shadow_fgt[POP_SHADOW_FGT_PAGES]; -uint8_t pop_shadow_kid_n, pop_shadow_fgt_n; - -/* ГРУЗИМ ОДИН РАЗ НА ЗАПУСК, а не по уровням. - * - * Тень бывает на ЧЕТЫРЁХ уровнях: 4 — рождается прыжком сквозь зеркало - * (jump_through_mirror, seg003:0811, ставит Char.charid = charid_1_shadow - * прямо из Кида), 5 — крадёт зелье, 6 — прыгает через пропасть, 12 — - * дерётся. Читается как три, потому что таблиц init_shad_N всего три - * (5/6/12): четвёртой нет — на 4-м Тень копируется с Кида, а не поднимается - * из таблицы. Так вот, напрашивается - * грузить набор только там, как это сделано с перевёрнутыми наборами - * (pop_vflip_load_all зовётся лишь на POP_UPSIDE_LEVEL). Решение - * пользователя — грузить сразу, и оно правильное по двум причинам: - * страниц EMM с запасом (32 из ~215 свободных), а вот забыть перезагрузку - * на границе уровня легко — ровно так и появился BUG-SHADOW-SET. Разовая - * загрузка убирает целый класс ошибок и заодно не тормозит переход между - * уровнями на 32 файла. */ -int pop_shadow_load(void) __banked -{ - uint8_t i; - if (pop_shadow_kid_n || pop_shadow_fgt_n) return 0; /* уже загружен */ - - { - uint8_t tbl[ARC_SHADOW_COUNT * POP_ARC_REC]; - pop_arc_t arc; - - /* Тридцать два атласа — из одного архива: раньше это были тридцать - * два `open` по 51,4 мс, то есть полторы секунды на ровном месте. */ - if (pop_arc_open_id(&arc, POP_ARC_SHADOW, tbl, - ARC_SHADOW_COUNT) < 0) - return -1; - for (i = 0; i < POP_SHADOW_KID_PAGES; i++) { - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_SHADOW_SK0 + i), - &pop_shadow_kid[i]) != 0) { - pop_arc_close(&arc); - pop_shadow_free(); - return -1; - } - pop_shadow_kid_n = (uint8_t)(i + 1); - } - for (i = 0; i < POP_SHADOW_FGT_PAGES; i++) { - if (pop_arc_atlas(&arc, tbl, (uint8_t)(ARC_SHADOW_SF0 + i), - &pop_shadow_fgt[i]) != 0) { - pop_arc_close(&arc); - pop_shadow_free(); - return -1; - } - pop_shadow_fgt_n = (uint8_t)(i + 1); - } - pop_arc_close(&arc); - } - - pop_shadow_pal_apply(); - return 0; -} - -/* ПАЛИТРА ОТДЕЛЬНО ОТ ЗАГРУЗКИ, и это не косметика. - * - * `gfx_pal_fload("KID\\kid.pal")` заливает ВСЕ 256 записей — это единая - * игровая палитра, — и затирает любые слоты, выставленные до него. Ровно - * та же беда уже была с тайлсетом: сразу за ним стоит pop_bg_pal_apply, - * который возвращает цвета env/wall. Наши 0xA0..0xAF из той же оперы, и - * в первом заходе я на это наступил: набор грузился, силуэт рисовался - * правильной формы, но ЦЕЛИКОМ ЧЁРНЫЙ (поймано пользователем на 6-м - * уровне). Поэтому вызов живёт рядом с pop_bg_pal_apply, а не внутри - * загрузки атласов. - * - * Обе страницы дабл-буфера: у них свои палитры. Через буфер в W2 — - * gfx_pal_load отдаёт указатель BIOS ($A4), а тот читает только - * #4000-#BFFF и банковую rodata не увидит. */ -void pop_shadow_pal_apply(void) __banked -{ - uint8_t buf[64], k; - if (!pop_shadow_kid_n) return; /* набора нет — нечего красить */ - for (k = 0; k < 64; k++) buf[k] = pop_shadow_pal[k]; - gfx_pal_load(0, POP_SHADOW_PAL_BASE, 16, buf); - gfx_pal_load(1, POP_SHADOW_PAL_BASE, 16, buf); -} - -void pop_shadow_free(void) __banked -{ - uint8_t i; - for (i = 0; i < pop_shadow_kid_n; i++) atlas_free(&pop_shadow_kid[i]); - for (i = 0; i < pop_shadow_fgt_n; i++) atlas_free(&pop_shadow_fgt[i]); - pop_shadow_kid_n = pop_shadow_fgt_n = 0; -} diff --git a/applications/SprPoP/src/pop_shadow.h b/applications/SprPoP/src/pop_shadow.h deleted file mode 100644 index 7463e2f..0000000 --- a/applications/SprPoP/src/pop_shadow.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * pop_shadow.h — запечённый набор спрайтов ТЕНИ. - * - * Оригинал спрайтов Тени не хранит: он кладёт обычный спрайт дважды — в x - * прозрачным блитом и в x+1 «блиттером XOR» (draw_objtable_item, - * seg008.c:1600). Пакетный блит так не умеет, поэтому результат запечён - * заранее (toolchain/pop_pack_shadow.py); разбор и замеры — - * ../docs/shadow_atlas_plan.md. - * - * ПОЛОВИН ДВЕ, и это не наша выдумка. Набор спрайтов у оригинала выбирает - * не персонаж, а поле `sword` САМОГО КАДРА (load_frame_to_obj, - * seg008.c:1752: chtab_base жёстко = chtab_2, плюс `sword >> 6`). У всех - * кадров таблицы Кида эти биты нулевые, у всех кадров таблицы стража — - * 0xC0. Тень берёт таблицу стража для кадров 150..189 (seg006.c:533), - * значит идёт через chtab_5 — а chtab_5 на 12-м уровне грузится из - * SHADOW.DAT (tbl_guard_type[12] == 4), и это графика КИДА в боевых позах. - * Отсюда: - * - * pop_shadow_kid[] — кадры вне боя (запечены из спрайтов Кида); - * pop_shadow_fgt[] — кадры 150..189 (запечены из SHADOW.DAT). - * - * Какая половина нужна, отрисовка уже знает — тем же условием, что - * выбирает таблицу кадров (pop_frame_tbl_is_guard). - * - * СПРАЙТ ТЕНИ НА ПИКСЕЛЬ ШИРЕ исходного: второй проход оригинала кладётся - * в x+1, суммарный след занимает [x, x+w]. Рисовать по тем же - * координатам, что и Кида — сдвиг уже внутри спрайта. - */ -#ifndef POP_SHADOW_H -#define POP_SHADOW_H - -#include -#include - -extern atlas_t pop_shadow_kid[]; /* половина «вне боя» */ -extern atlas_t pop_shadow_fgt[]; /* половина «в бою» (SHADOW.DAT) */ -/* Сколько страниц реально загружено; 0 = набора нет (уровень без Тени - * или загрузка не удалась) — отрисовка тогда идёт прежним путём. */ -extern uint8_t pop_shadow_kid_n, pop_shadow_fgt_n; - -/* Загрузить набор. Звать ОДИН РАЗ при старте: набор не зависит от - * уровня, а перезагрузка на границе — лишний повод её забыть (почему - * именно так — в шапке pop_shadow.c). Повторный вызов — no-op. - * Возврат: 0 — OK, -1 — ошибка загрузки. */ -int pop_shadow_load(void) __banked; - -/* Залить 16 слотов палитры Тени. ЗВАТЬ ПОСЛЕ ЛЮБОЙ заливки общей - * палитры (gfx_pal_fload kid.pal): та кладёт все 256 записей и затирает - * наши — см. развёрнуто в pop_shadow.c. Рядом с pop_bg_pal_apply. */ -void pop_shadow_pal_apply(void) __banked; - -/* Освободить страницы; звать на выходе из программы. */ -void pop_shadow_free(void) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_snd_data.c b/applications/SprPoP/src/pop_snd_data.c deleted file mode 100644 index cb8ac7e..0000000 --- a/applications/SprPoP/src/pop_snd_data.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * pop_snd_data.c — РЕЗИДЕНТНЫЕ ДАННЫЕ звукового набора. - * - * Отдельным модулем, потому что стороны у этих данных разные: заполняет - * их ХОЛОДНЫЙ загрузчик из банка 8 (pop_sfx_cold.c), а читает ГОРЯЧИЙ - * насос из резидента (pop_sfx.c) — в том числе из прерывания. Держать - * их в любой из половин значило бы тянуть чужую в резидент. - * - * Инициализаторов нет намеренно: crt0 зануляет _DATA (memory - * sdcc_static_storage_gotcha), а «набор не загружен» — это и есть нули. - * - * ЦЕНА ПЕРЕЕЗДА. Таблица была `static const` в _CODE (285 Б); сняв - * const, мы переносим её в _DATA — суммарный резидентный расход не - * меняется, потому что в huge-модели _CODE и данные лежат подряд в одном - * диапазоне 0x4000..0xBFFF. Реально добавилось 8 байт: pop_snd_page - * вырос с размера набора до POP_SND_MAX_PAGES (запас под чужие наборы) - * плюс байт самого счётчика. - */ -#include -#include "pop_snd_tbl.h" - -/* РАСКЛАДКА НАБОРА — приезжает из SND/snd.idx целиком, одним read'ом - * прямо сюда. Поэтому размер записи обязан совпадать с дисковым: если - * ABI когда-нибудь добавит выравнивание, сборка упадёт здесь, а не - * рассыплется звуком в рантайме. */ -pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT]; -typedef char pop_snd_ent_is_5_bytes[(sizeof(pop_snd_ent_t) == 5) ? 1 : -1]; - -/* Физические страницы EMM, по индексу из pop_snd_tbl[].page. */ -uint8_t pop_snd_page[POP_SND_MAX_PAGES]; - -/* Сколько страниц у ЭТОГО набора (1..POP_SND_MAX_PAGES). Насос сверяет - * с ним переход длинного эффекта через границу страницы. */ -uint8_t pop_snd_pages; diff --git a/applications/SprPoP/src/pop_snd_tbl.h b/applications/SprPoP/src/pop_snd_tbl.h deleted file mode 100644 index 237d20b..0000000 --- a/applications/SprPoP/src/pop_snd_tbl.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * pop_snd_tbl.h — РАСКЛАДКА ОЦИФРОВАННЫХ ЭФФЕКТОВ: тип и инварианты. - * - * Раньше этот файл ПЕЧАТАЛ упаковщик (gen/pop_sound_tbl.h), и конкретные - * page/off/len становились частью EXE — из-за чего замена звукового набора - * (SDLPoP <-> MSDOS) требовала перекомпиляции игры. Теперь значения - * приезжают с диска (SND/snd.idx, формат PSI1 — tools/pop_idx.py), а - * здесь остаётся только то, что от набора НЕ зависит: устройство записи и - * пределы, на которые рассчитан загрузчик. - * - * ЗАПИСЬ ЧИТАЕТСЯ С ДИСКА ПОБАЙТОВО, прямо в pop_snd_tbl[]. Значит - * раскладка структуры в ABI SDCC z80 (uint8 + uint16 + uint16 подряд, без - * выравнивания = 5 байт) — часть дискового контракта, а не деталь - * компилятора. Расхождение молча разъехало бы весь набор, поэтому оно - * ловится статически (pop_snd_data.c) и проверяется загрузчиком по полю - * размера записи в заголовке индекса. - */ -#ifndef POP_SND_TBL_H -#define POP_SND_TBL_H - -#include - -/* Пространство id оригинала: 0..56. От набора не зависит. */ -#define POP_SND_COUNT 57 -/* Блок запроса CBL при 8 бит; страница EMM кратна ему, поэтому ни один - * блок не пересекает границу страницы (см. docs/sound_plan.md). */ -#define POP_SND_BLOCK 128 -/* СКОЛЬКО СТРАНИЦ ГОТОВ ПРИНЯТЬ ЗАГРУЗЧИК — вместимость, а НЕ размер - * конкретного набора: тот приходит в индексе (pop_snd_pages). Запас - * ради будущих наборов без перекомпиляции; цена — 16 байт таблицы - * страниц вместо 9-10. */ -#define POP_SND_MAX_PAGES 16 - -/* ПЕРВЫЙ БЛОК СТРАНИЦЫ 0 — ТИШИНА. Насос льёт её, когда играть нечего: - * без этого железо доигрывает по кругу хвост своего буфера (жужжание). - * Это инвариант ПРОГРАММЫ — упаковщик обязан оставить блок свободным, а - * загрузчик проверяет, что ни одна запись в него не залезла. */ -#define POP_SND_SILENCE_PAGE 0 -#define POP_SND_SILENCE_OFF 0x0000 - -/* page — индекс в pop_snd_page[] (физические страницы EMM), off — начало - * внутри страницы, len — длина PCM. Оба кратны POP_SND_BLOCK; len == 0 - * значит «у этого id нет оцифровки» (это музыка, см. sound_plan.md). */ -typedef struct { - uint8_t page; - uint16_t off; - uint16_t len; -} pop_snd_ent_t; - -#endif /* POP_SND_TBL_H */ diff --git a/applications/SprPoP/src/pop_state.c b/applications/SprPoP/src/pop_state.c deleted file mode 100644 index 096b2d3..0000000 --- a/applications/SprPoP/src/pop_state.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * pop_state.c — данные, которые читают ОБЕ стороны банковой границы. - * - * Зачем отдельный модуль: sprinter-cc собирает банковый модуль с - * --dataseg BANKn, поэтому ВСЯ его писучая память (глобалы, file-static, - * статики внутри функций) линкуется В СТРАНИЦУ БАНКА и снаружи не читается - * — проверено на .map (2026-07-30: глобал банкового модуля лёг по - * 0x0001C000, а не в _DATA). Значит любую переменную, к которой нужен - * доступ и из банка, и снаружи, надо держать в НЕбанковом модуле — здесь. - * - * Модуль обязан оставаться в W1/W2: его читают и главный цикл, и банки. - */ -#include "pop_state.h" -#include "pop_ctrl.h" /* объявления шины control_* (живёт здесь) */ - -/* F10 — НЕМЕДЛЕННЫЙ ВЫХОД, откуда угодно. Флаг взводит kbd_idle (sprpop.c), - * то есть он ловится везде, где программа ждёт кадр: в заставке, в титрах, - * в fade, в проявлении полосами, в меню и в игре. Держим его резидентным, - * чтобы взводить и читать без трамплина из любого банка. */ -uint8_t pop_quit_req; - -uint8_t pop_mob_busy; -uint8_t pop_loose_landed; -/* Кусок loose УШЁЛ ВНИЗ из комнаты (порт хвоста move_loose, seg007:1126: - * mob_down_a_row переносит его в комнату снизу; у нас симуляция там не - * продолжается, и приземление разбирает главный цикл). 0 = нет, иначе - * col+1; комната, ИЗ которой он ушёл, — в pop_loose_exit_room. - * Сигнал отдельный от pop_loose_fell: тот взводится в момент ОТРЫВА плиты - * (там верен только remove_loose), и по нему кнопка внизу нажималась, - * пока кусок ещё летел. */ -uint8_t pop_loose_exit; -uint8_t pop_loose_exit_room; -uint8_t pop_droppedout; -/* leveldoor_open (seg007:456): дверь уровня доехала до верха. Ставит - * анимация двери (pop_trob, банк 6), читает спецсобытие подъёма скелета - * (guards.c, банк 1) — снова случай «данные через границу банков». - * Сбрасывается стартом уровня (seg003:97). - * - * ШИРИНА — word, как в оригинале (data.h:361), а не byte: на уровне 8 - * do_timers СЧИТАЕТ этой же переменной время до появления мыши - * (`++leveldoor_open` каждый кадр, пока Кид в комнате 16), и байт - * переполнился бы через 255 кадров, обнулив признак «дверь открыта». */ -uint16_t pop_leveldoor_open; - -/* ---- Шина управления (seg006 globals) ------------------------------ * - * Объявлены в pop_ctrl.h, а ЛЕЖАТ здесь: к ним обращаются ТРИ банка — - * pop_ctrl (банк 5) пишет с клавиатуры, guards.c (банк 1) подаёт - * синтетический ввод ИИ (autocontrol_*, seg002), pop_map (банк 3) читает - * через pop_ctrl_shift_held. Сегодня оно уцелело бы и в pop_ctrl.c - * (собираем без --bank-data, данные банков остаются в _DATA), но это - * флаг сборки: включат его — и шина уедет в страницу банка 5. - * - * control_x/y/shift — «сырое» состояние осей ЭТОГО кадра (абсолютно: - * X LEFT/-1..RIGHT/+1); *_forward/backward/up/down/shift2 — конечный - * автомат held/released/ignore (авто-повтор). */ -int8_t control_x, control_y, control_shift; -int8_t control_forward, control_backward, control_up, control_down, control_shift2; - -/* Чит «бессмертие» (клавиша I). Отладочный: Кид получает анимацию удара, - * но HP не теряет — иначе проверять боёвку приходится с трёх попаданий. */ -uint8_t pop_immortal; - -/* Габариты последней нарисованной двери уровня (порт leveldoor_right / - * leveldoor_ybottom): пишет draw_leveldoor из банка pop_bg, читает - * clip_char из pop_map. См. pop_state.h. */ -int pop_leveldoor_right; -int pop_leveldoor_ybottom; - -/* ---- Отладочная «пустышка» для брейкпоинтов из БАНКОВ ---------------- * - * Зачем. PC-брейкпоинт видит только логический адрес, а 0xC000+ — это - * окно, куда мапятся ВСЕ банки: точка на адресе банковой функции ловит - * заодно чужой код, случайно легший по тому же смещению (проверено: - * точка на start_fall из банка 3 срабатывала на каждом кадре — попадала - * в pop_bg из банка 2). Условные брейкпоинты этот отладчик MAME не - * поддерживает («error in assignment expression» на `==`). - * - * Приём (идея пользователя, 2026-08-04): позвать ЭТУ функцию ровно из - * того места банкового кода, которое отлаживаем, и поставить брейкпоинт - * на неё — она резидентна в W1, её адрес однозначен. По возврату из неё - * читаем что нужно. Условие «когда именно ловить» пишется обычным `if` - * в C — это гибче любых выражений отладчика. - * - * Счётчик нужен, чтобы вызов не выкинул оптимизатор; заодно видно, сколько - * раз точка прошла, если ловим не останавливаясь. */ -uint8_t pop_dbg_hits; - -void pop_dbg_trap(void) { pop_dbg_hits++; } - -/* ВРЕМЕННО: трасса kidobj — порт вывода, который пользователь добавил в - * SDLPoP add_kid_to_objtable (seg008:1679), чтобы сверить поведение у шва - * кадр в кадр. Буфер РЕЗИДЕНТНЫЙ, потому что читает его брейкпоинт MAME: - * printf из действия точки берёт байты по фиксированному адресу. Поля — - * ровно те же и в том же порядке, плюс наша комната девятым (у оригинала - * смена комнаты видна по скачку tilepos, а нам удобнее явно). */ -int8_t pop_dbg_obj[9]; - -/* ВРЕМЕННО (разбор оверлея падающего куска): по слоту mob. - * pop_dbg_pass[i] — что было в проходе отрисовки: - * bit0 рассмотрен, bit1 active, bit2 draw_y задан, bit3 defer совпал, - * bit4 нарисован, bit5 позван mob_overlay_neighbour. - * pop_dbg_ovl[i*4 + 0..3] — что решил mob_overlay_neighbour: - * [0] r+128, [1] rt+128, [2] флаги, [3] col. - * Флаги: bit0 вошли, bit1 c<=9, bit2 tile(r,c), bit3 габарит r, - * bit4 ВЫЗОВ по r, bit5 tile(rt,c), bit6 габарит rt, bit7 ВЫЗОВ по rt. */ -uint8_t pop_dbg_pass[14]; -uint8_t pop_dbg_ovl[14 * 4]; -/* ВРЕМЕННО: какие тайлы РЕАЛЬНО перекрывают спрайт куска. Бит - * (ряд+1)*2 + (0 своя колонка / 1 соседняя), ряды −1..2. */ -uint8_t pop_dbg_tiles[14]; - -/* Зеркало уровня 4 — см. pop_state.h. */ -int8_t pop_jumped_mirror; - -/* Тайл СОСЕДНЕЙ комнаты изменился, пока она не отрисована (плита, которую - * Кид расшатал и бросил, провалилась заочно — animate_loose в pop_trob). - * Кромочные колонки и у отрисовки (lcol_fg), и у коллизии (g_lcol/g_rcol) — - * СНИМКИ на момент входа в комнату, поэтому их надо перечитать. Ставит - * банк 6, разбирает главный цикл. */ -uint8_t pop_neigh_dirty; - -/* seamless (seg000:900 + seg003:158): переход 12 → 13 идёт БЕЗ двери - * уровня — уровень кончается фактом попадания в комнату 23, и следующий - * начинается в комнате с тем же номером и тем же рядом. Флаг говорит - * старту уровня «не сбрасывай HP» (и, когда появятся заставки, «не - * показывай „LEVEL 13“»): Кид продолжает бежать, не заметив границы. - * Ставит главный цикл, гасит pop_start_level. */ -uint8_t pop_seamless; - -/* «Кид попал в комнату ЧИТОМ навигации» — держит бесшовный переход уровня. - * Отладочная добавка, у оригинала телепорта между комнатами нет вовсе; см. - * pop_dbg_roomnav и ../docs/impl_diff.md. Снимается первой же СМЕНОЙ - * КОМНАТЫ ОБЫЧНЫМ ХОДОМ и стартом уровня. */ -uint8_t pop_nav_hold; - - - -/* ВРЕМЕННО (замер фаз кадра 2026-08-13): четыре маркера-пустышки в - * РЕЗИДЕНТЕ. Брейкпоинт на каждом + printf totalcycles даёт длительность - * блоков: m1..m2 — логика (синий), m2..m3 — фон (зелёный), m3..m4 — - * спрайты (циан). В банк брейкпоинт ставить нельзя: 0xC000 общее окно. */ -void pop_dbg_m1(void) { } -void pop_dbg_m2(void) { } -void pop_dbg_m3(void) { } -void pop_dbg_m4(void) { } - -/* ВРЕМЕННО (разбор зелёного блока 2026-08-13): состав перерисовок в САМОМ - * тяжёлом кадре. pop_redraw_needed считает вызовы по видам, и если кадр - * оказался тяжелее прежнего максимума — сохраняет расклад сюда. - * Индексы 0..7 — POP_RD_*, 8..9 — POP_RDA_* (полоса у потолка). */ -uint8_t pop_dbg_rdmax[10]; -uint8_t pop_dbg_rdmax_tot; - -/* ВРЕМЕННО (замер внутренностей 2026-08-13): m5..m8 — границы внутри - * pop_ceil_shake_draw (heal / draw_tile) и mob_render (heal / блиты). */ -void pop_dbg_m5(void) { } -void pop_dbg_m6(void) { } -void pop_dbg_m7(void) { } -void pop_dbg_m8(void) { } - -/* ВРЕМЕННО (разбор pop_loose_tick 2026-08-13): m9..m12 — границы ВНУТРИ - * самого pop_loose_tick. Он банковый, но зовёт резидент W1 напрямую, - * так что брейкпоинты по этим адресам однозначны. */ -void pop_dbg_m9(void) { } -void pop_dbg_m10(void) { } -void pop_dbg_m11(void) { } -void pop_dbg_m12(void) { } - -/* ВРЕМЕННО (разбор pop_ceil_shake_draw 2026-08-13): heal / draw_tile. */ -void pop_dbg_m13(void) { } -void pop_dbg_m14(void) { } -void pop_dbg_m15(void) { } - -/* ВРЕМЕННО (разбор pop_redraw_needed по ВИДАМ 2026-08-13): вид приезжает в - * A (__sdcccall(1), uint8 arg1), брейкпоинт на первой инструкции логирует - * его вместе с тактами — так видно цену КАЖДОГО вида, а не число пометок. */ -void pop_dbg_kind(uint8_t k) { (void)k; } -void pop_dbg_m16(void) { } - -/* ВРЕМЕННО (разбор pop_blit_b 2026-08-13): сколько в одном блите занимают - * САМИ пиксели, а сколько пооспрайтовые накладные (map/unmap страницы - * атласа, чтение заголовка, пометка грязного прямоугольника). */ -void pop_dbg_b1(void) { } /* вход (спрайт прошёл отсев) */ -void pop_dbg_b2(void) { } /* atlas_image + gfx_w0_map */ -void pop_dbg_b3(void) { } /* сам блит */ -void pop_dbg_b4(void) { } /* pop_cd_touch */ -void pop_dbg_b5(void) { } /* gfx_w0_unmap (конец) */ -void pop_dbg_b6(void) { } /* взведён = пошли в gfx_blit_noclip, а не в _part */ - -/* ВРЕМЕННО (разбор pop_phys_tick 2026-08-19): звенья цепочки kid_phys. */ -void pop_dbg_p1(void) { } /* loadkid_and_opp сделан */ -void pop_dbg_p2(void) { } /* fall_accel + fall_speed */ -void pop_dbg_p3(void) { } /* determine_col */ -void pop_dbg_p4(void) { } /* bump_into_opponent */ -void pop_dbg_p5(void) { } /* check_collisions */ -void pop_dbg_p6(void) { } /* check_bumped */ -void pop_dbg_p7(void) { } /* check_action */ -void pop_dbg_p8(void) { } /* check_press */ - -/* ВРЕМЕННО (регрессия цены блита 2026-08-13): w и h упакованы в один - * 16-битный аргумент (arg1 -> HL при __sdcccall(1)), брейкпоинт логирует - * HL — дальше цена раскладывается как a + b*h + c*w*h, где b и есть - * построчные накладные ядра. */ -void pop_dbg_wh(uint16_t wh) { (void)wh; } diff --git a/applications/SprPoP/src/pop_state.h b/applications/SprPoP/src/pop_state.h deleted file mode 100644 index 4ef6d3f..0000000 --- a/applications/SprPoP/src/pop_state.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * pop_state.h — состояние, общее для банков и W1/W2. См. pop_state.c. - * - * Правило: если переменную читают/пишут по обе стороны банковой границы — - * её место здесь, а НЕ в банковом модуле (там она уедет в страницу банка). - */ -#ifndef POP_STATE_H -#define POP_STATE_H - -#include - -/* Есть ли хоть один ЗАНЯТЫЙ слот падающего куска (active или дочистка - * clean). Гейт холостого хода: пока кусков нет, ни обход 14 слотов в - * pop_loose_mob_tick, ни поиск куска над головой Кида делать не нужно - * (замер 11/15: 12 090 + 5 868 тактов на комнату, где не падает ничего). - * - * Живёт в резиденте, а не в pop_room.c, потому что читает его pop_map - * (банк 3), а писучие статики банкового модуля наружу не видны. Ставит - * отрыв куска, снимает сам обход по факту пустой таблицы. */ -/* F10 нажата — выйти из программы; см. pop_state.c. */ -extern uint8_t pop_quit_req; - -/* Общий idle-хук: вычерпать клавиатурный FIFO и проверить F10. Живёт в - * sprpop.c (резидент), висит на gfx_wait_vsync и вызывается из цикла - * ожидания луча — обе точки ожидания обязаны звать ОДНО И ТО ЖЕ, иначе - * выход работает не везде. */ -void pop_idle(void); -extern uint8_t pop_mob_busy; - -/* Кусок loose приземлился (loose_land, seg007:11E8): 0 = нет, иначе - * tilepos+1 тайла, на который он лёг. Ставит отрисовка mob (банк), - * разбирает логика loose-полов (pop_map, W1/W2). */ -extern uint8_t pop_loose_landed; - -/* Кусок loose ушёл ниже поля своей комнаты: 0 = нет, иначе col+1; комната - * отправления — pop_loose_exit_room. Ставит отрисовка mob (банк 7), - * разбирает главный цикл (посадка в комнате снизу). */ -extern uint8_t pop_loose_exit; -extern uint8_t pop_loose_exit_room; - -/* Тайл СОСЕДНЕЙ (не отрисованной) комнаты изменился — перечитать кромки. - * Подробности — в pop_state.c. */ -extern uint8_t pop_neigh_dirty; - -/* Бесшовный переход между уровнями (seamless): подробности в pop_state.c. - * Ставится главным циклом при попадании в комнату-выход, гасится стартом - * уровня — он же единственный, кто на флаг смотрит. */ -extern uint8_t pop_seamless; - -/* Держатель бесшовного перехода после ЧИТ-телепорта (см. pop_state.c). - * Ставит pop_dbg_roomnav, снимает первая смена комнаты обычным ходом. */ -extern uint8_t pop_nav_hold; - -/* Чит «бессмертие» (I): Кида бьют, но HP не убавляется. Читают пути урона - * (боёвка в банке, пики в pop_map), переключает главный цикл. */ -/* ЧИТ БЕССМЕРТИЯ, три состояния (клавиша I по кругу): - * 0 — выключено; - * 1 — только БОЙ: удары мечом не отнимают HP (pop_take_hp тут ни при - * чём, ветка живёт в hurt_by_sword, guards.c); - * 2 — бой И мелкий урон: не проходят «минус одно деление» от падения с - * двух этажей и от падающей плиты (pop_take_hp гасит count < 100). - * МГНОВЕННАЯ СМЕРТЬ остаётся на любом уровне: пики, чомпер, падение с - * трёх этажей, удар мечом вне боевой стойки — все они приходят с - * count = 100. Чит отменяет потерю HP, а не смерть. */ -extern uint8_t pop_immortal; - -/* Габариты ПОСЛЕДНЕЙ нарисованной двери уровня — порт глобалов - * leveldoor_right / leveldoor_ybottom (seg008 draw_leveldoor). Их ставит - * отрисовка (банк pop_bg), а читает clip_char (pop_map, W1/W2): кадры - * подъёма по лестнице (224..228) обрезаются по правому косяку проёма и по - * низу поднятой створки. Дверь рисуется ПОД персонажем, поэтому перекрыть - * его не может — оригинал именно режет спрайт. - * right — экранный X правой кромки; ybottom — room-space Y (без POP_YOFF). - * 0 = двери в отрисованной комнате нет. */ -extern int pop_leveldoor_right; -extern int pop_leveldoor_ybottom; - -/* droppedout (seg006:1140): Кида СПИХНУЛИ с уступа в бою — он падает из - * боевой стойки. Ставит start_fall (pop_map, банк 3), читает ИИ стража - * (guards.c, банк 1): по этому флагу страж решает, идти ли за упавшим вниз - * (guard_follows_kid_down, seg002:09F8). Отсюда и место в общем модуле — - * банки друг другу данные не отдают. */ -extern uint8_t pop_droppedout; - -/* leveldoor_open (seg007:456): 1 — дверь уровня открыта полностью. Пишет - * анимация двери (банк 6), читает подъём скелета (банк 1). Word, как в - * оригинале: на уровне 8 в него же СЧИТАЕТСЯ задержка до мыши (см. - * pop_state.c и pop_check_mouse в guards.c). */ -extern uint16_t pop_leveldoor_open; - -/* Отладочная «пустышка» для брейкпоинтов из банков — см. pop_state.c. - * Звать из отлаживаемого места под нужным `if`, брейкпоинт ставить на - * _pop_dbg_trap (резидент W1, адрес однозначен). */ -extern uint8_t pop_dbg_hits; -void pop_dbg_trap(void); - -#endif - -/* Зеркало уровня 4 (jumped_through_mirror, seg003). −1 — Кид ТОЛЬКО ЧТО - * пролетел сквозь зеркало (ставит is_obstacle в pop_map, банк 3), и - * следующий pop_check_mirror родит тень; 0 — обычное состояние. - * Межбанковый: пишет pop_map, читает pop_map же, но через главный цикл. */ -extern int8_t pop_jumped_mirror; - - - -/* ВРЕМЕННО: маркеры фаз кадра (замер). */ -void pop_dbg_m1(void); void pop_dbg_m2(void); -void pop_dbg_m3(void); void pop_dbg_m4(void); - -/* ВРЕМЕННО: состав перерисовок в самом тяжёлом кадре (замер). */ -extern uint8_t pop_dbg_rdmax[10]; -extern uint8_t pop_dbg_rdmax_tot; - -/* ВРЕМЕННО: маркеры внутренних замеров. */ -void pop_dbg_m5(void); void pop_dbg_m6(void); -void pop_dbg_m7(void); void pop_dbg_m8(void); -void pop_dbg_m9(void); void pop_dbg_m10(void); -void pop_dbg_m11(void); void pop_dbg_m12(void); -void pop_dbg_m13(void); void pop_dbg_m14(void); -void pop_dbg_m15(void); -void pop_dbg_kind(uint8_t k); void pop_dbg_m16(void); -void pop_dbg_b1(void); void pop_dbg_b2(void); void pop_dbg_b3(void); -void pop_dbg_b4(void); void pop_dbg_b5(void); void pop_dbg_b6(void); -/* ВРЕМЕННО (разбор pop_phys_tick 2026-08-19, позиция P2a): физика Кида — - * 61 266 тактов на НЕПОДВИЖНОМ персонаже. По одному зонду на звено - * цепочки kid_phys. */ -void pop_dbg_p1(void); void pop_dbg_p2(void); void pop_dbg_p3(void); -void pop_dbg_p4(void); void pop_dbg_p5(void); void pop_dbg_p6(void); -void pop_dbg_p7(void); void pop_dbg_p8(void); -void pop_dbg_wh(uint16_t wh); - -/* ВРЕМЕННО: трасса kidobj (см. pop_state.c). Порядок байт: - * 0 obj_tilepos, 1 frame, 2 action, 3 curr_col, 4 char_col_left, - * 5 char_col_right, 6 char_top_row, 7 char_bottom_row, 8 комната. */ -extern int8_t pop_dbg_obj[9]; -/* ВРЕМЕННО: разбор оверлея падающего куска (см. pop_state.c). */ -extern uint8_t pop_dbg_pass[14]; -extern uint8_t pop_dbg_ovl[14 * 4]; -extern uint8_t pop_dbg_tiles[14]; -void pop_dbg_kidobj(void) __banked; diff --git a/applications/SprPoP/src/pop_status.c b/applications/SprPoP/src/pop_status.c deleted file mode 100644 index 55cd777..0000000 --- a/applications/SprPoP/src/pop_status.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - * pop_status.c — текст в двух служебных полосах экрана, БАНК 9. - * - * Нижняя полоса (та же, где деления HP) — статус-строка оригинала; - * верхняя — наша отладочная. Обе живут ВНЕ игрового поля, поэтому фон у - * них POP_COL_OUTSIDE, а не цвет 0: вспышки (урон, зелья, молния) сделаны - * подменой нулевого цвета палитры, и полосы не должны мигать вместе с - * игрой (pop_ui.h). - * - * ЦЕНА ВЫВОДА — главное ограничение. Блит одного глифа стоит ~4,6 тыс. - * тактов почти независимо от размера (см. memory blit_cost_model): цена - * вызова, а не пикселей. Полная отладочная строка — это полсотни глифов, - * то есть ПОЛКАДРА. Отсюда три правила, на которых держится модуль: - * - * 1. Всё change-driven. Пока показанное не изменилось, не рисуем вовсе - * — за кадр остаётся только сравнение нескольких байт. - * 2. Отладочная строка перерисовывается ПО ПОЛЯМ. Смена комнаты — это - * две цифры (~9 тыс. тактов, 2% кадра), а не вся строка; подписи - * («Level», «, Room», …) не меняются никогда и рисуются лишь при - * полной инвалидации, которая случается на старте уровня, где кадр и - * так тяжёлый. - * 3. Пробелы не блитятся (pop_ui.c): их глиф целиком прозрачен, и на - * строке из полусотни символов это девять сэкономленных блитов. - * - * ГРЯЗЬ СЧИТАЕТСЯ ПО СТРАНИЦАМ, а не счётчиком «осталось два кадра». У - * каждой страницы дабл-буфера своя видео-ОЗУ, и если поля меняются в - * разных кадрах вперемешку, общий счётчик их путает: маска на страницу - * всегда описывает, что именно этой странице ещё должны. - * - * Рисуем прозрачным банком GFX_BANK_TRANSPARENT (не SPRITE): 0xFF шрифта - * не пишется, но ОЗУ-копия обновляется — и текст переживает полностраничные - * копии (вход в комнату, выход из меню), которые берут картинку из тени. - * - * Данных в W2 — 11 байт, и семь из них просто переехали сюда из прежнего - * ярлыка комнаты в sprpop_cold.c. Кода в резиденте не появляется вовсе: - * заявка сообщения — присваивание одного байта, всё остальное здесь. - */ -#include -#include -#include -#include -#include "pop_status.h" -#include "pop_music.h" /* ждём конец музыки смерти и глушим её по ответу */ -#include "pop_ui.h" -#include "pop_font.h" -#include "pop_bg.h" /* POP_YOFF */ -#include "pop_cdraw.h" /* POP_HP_Y — полосу делим с делениями жизней */ -#include "pop_settings.h" -#include "pop_app.h" /* start_game после 288 тиков молчания */ -#include "pop_state.h" /* pop_immortal */ -#include "pop_level.h" /* pop_current_level */ -#include "pop_pace.h" /* pop_speed_mode */ -#include "pop_timer.h" /* оставшееся время и флаг «пора показать» */ -#include "pop_sfx.h" /* pop_snd_want */ - -/* ---- нижняя полоса: статус-строка -------------------------------------- */ - -/* Как у оригинала: 24 тика (text_time_total = 24) — около двух секунд. */ -#define MSG_TICKS 24 -/* «Висит, пока не снимут»: у оригинала эту роль играет особое значение - * text_time_total (288 у «Press Button», 1188 у copy protection). */ -#define MSG_HOLD 0xFF -/* Базовая линия та же, что у GAME PAUSED (pop_menu.c): строка ниже делений. */ -#define MSG_BASE (POP_YOFF + POP_HP_Y + 8) -#define MSG_TOP (MSG_BASE - POP_FONT_BIG_ASCENT - 2) -#define MSG_BOTTOM (MSG_BASE) - -/* POP_MSG_LEVEL здесь пустой: его строка собирается с номером уровня. */ -static const char * const status_text[POP_MSG_N] = { - "", - "QUICKSAVE", - "NO QUICKSAVE", - "QUICKLOAD", - "NO QUICKLOAD", - "SOUND ON", - "SOUND OFF", - "MUSIC ON", - "MUSIC OFF", - "", /* LEVEL N — собирается с номером */ - "", /* N MINUTES LEFT */ - "", /* N SECONDS LEFT */ - "TIME HAS EXPIRED!", - "Press Button to Continue" -}; - -uint8_t pop_status_msg; /* заявка (пишут откуда угодно) */ -/* Постоянный показ таймера (клавиша T, keys.txt). Отдельно от - * pop_settings.show_debug_bar: полоса — это отладка, а таймер игрок может - * захотеть держать перед глазами. В POP.CFG не пишется намеренно — это - * переключатель «на посмотреть», а не настройка. */ -uint8_t pop_show_timer; -uint8_t pop_status_ticks; /* сколько кадров ещё висит; читает HP */ -static uint8_t st_shown; /* что реально нарисовано */ -static uint8_t st_dirty; /* бит на страницу дабл-буфера */ -static uint8_t st_arg; /* номер уровня для POP_MSG_LEVEL */ - -/* ---- верхняя полоса: отладочная строка --------------------------------- * - * - * Level ##, Room ##, Speed: ..., Sound: ..., Immortal # - * - * Раскладка фиксированная: у каждого поля свой левый край и своя зона - * стирания, поэтому изменение одного значения не трогает соседей. Ширины - * посчитаны по самому длинному значению (FASTEST, OFF, две цифры). */ -#define DBG_BASE 6 /* базовая линия малого шрифта */ -#define DBG_TOP 0 -/* На строку НИЖЕ базовой линии: у малого шрифта 'p' высотой 7 (и ',' — 6) - * свисает под неё, и при стирании ровно до базовой линии от хвоста «p» в - * «Speed:» оставалась одинокая точка. */ -#define DBG_BOTTOM 7 -#define DBG_LEFT 8 -#define DBG_RIGHT 310 - -/* Значения ПРИЖАТЫ ВПРАВО к границе своей зоны, а подпись следующего поля - * начинается сразу за ней. Так запятая всегда стоит вплотную к значению — - * при выравнивании влево она отрывалась бы на всю ширину зоны («Level 1 , - * Room»). Дырка слева от значения при этом крошечная: варианты близки по - * ширине (NORMAL 30 против FASTEST 32, ON 9 против OFF 14). */ -#define X_LBL_LEVEL 10 /* "Level" 10..30 */ -#define R_VAL_LEVEL 44 /* зона 31..43 */ -#define X_LBL_ROOM 44 /* ", Room" 44..70 */ -#define R_VAL_ROOM 84 /* зона 71..83 */ -#define X_LBL_SPEED 84 /* ", Speed:" 84..116 */ -#define R_VAL_SPEED 152 /* зона 117..151 */ -/* Три тумблера подряд — звук, музыка, бессмертие. Подписи сокращены до - * буквы с двоеточием: полные слова («Sound», «Immortal») занимали столько, - * что на музыку места уже не оставалось, а смысл и так читается. */ -#define X_LBL_SOUND 152 /* ", S:" 152..168 */ -#define R_VAL_SOUND 185 /* зона 169..184 */ -#define X_LBL_MUS 185 /* ", M:" 185..201 */ -#define R_VAL_MUS 218 /* зона 202..217 */ -#define X_LBL_IMM 218 /* ", I:" 218..234 */ -#define R_VAL_IMM 245 /* зона 235..244: цифре нужен зазор в пробел */ -/* Оставшееся время ##:## — отдельным полем у правого края, подписи не - * требует: формат читается сам. */ -#define R_VAL_TIME 310 /* зона 284..309 */ -#define W_VAL_TIME 26 - -/* Ширина зоны значения — под самый длинный вариант плюс воздух. */ -#define W_VAL_NUM 13 /* две цифры */ -#define W_VAL_SPEED 35 /* FASTEST */ -#define W_VAL_SOUND 16 /* OFF */ -#define W_VAL_IMM 9 /* одна цифра */ - -enum { /* биты маски «что перерисовать» */ - DBG_F_LEVEL = 0x01, - DBG_F_ROOM = 0x02, - DBG_F_SPEED = 0x04, - DBG_F_SOUND = 0x08, - DBG_F_IMM = 0x10, - DBG_F_TIME = 0x20, - DBG_F_MUS = 0x40, - DBG_F_ALL = 0x7F /* + подписи: см. dbg_labels */ -}; - -static const char * const speed_text[] = { "NORMAL", "FAST", "FASTEST" }; - -static uint8_t dbg_lvl, dbg_room, dbg_spd, dbg_snd, dbg_mus, dbg_imm; -static uint8_t dbg_tmin, dbg_tsec; /* показанное время ##:## */ -static uint8_t dbg_phase; /* кадры до пересчёта секунд */ -static uint8_t dbg_dirty[2]; /* маска по странице; DBG_F_ALL => и подписи */ -static uint8_t dbg_on; /* показанный РЕЖИМ полосы: 0 нет / 1 таймер / 2 всё */ - -/* ---- общее ------------------------------------------------------------- */ - -static void wipe(int left, int top, int right, int bottom) -{ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - bar(left, top, right, bottom); -} - -/* Число 0..99 БЕЗ ведущего нуля и без ведущего пробела: значение - * выравнивается вправо, а пробел в шрифте имеет ненулевую ширину и сдвинул - * бы цифру влево от границы зоны. Деления нет намеренно: у SDCC z80 один - * «/» стоит ~5,4 тыс. тактов (memory sdcc_z80_division_hoisting), здесь же - * максимум девять вычитаний. */ -static void dec2(uint8_t v, char *buf) -{ - uint8_t t = 0; - while (v >= 10) { v = (uint8_t)(v - 10); t++; } - if (t) { *buf++ = (char)('0' + t); } - buf[0] = (char)('0' + v); - buf[1] = 0; -} - -/* То же, но ВСЕГДА две цифры: часы-минуты без ведущего нуля не читаются. */ -static void dec2z(uint8_t v, char *buf) -{ - uint8_t t = 0; - while (v >= 10) { v = (uint8_t)(v - 10); t++; } - buf[0] = (char)('0' + t); - buf[1] = (char)('0' + v); - buf[2] = 0; -} - -/* ---- нижняя полоса ----------------------------------------------------- */ - -/* Строки с числом собираются вручную: printf сюда не тянем, а число — - * единственное переменное место во всём наборе сообщений. */ -static char *put(char *buf, const char *s) -{ - while (*s) *buf++ = *s++; - return buf; -} - -/* Число ВПЕРЕДИ («12 MINUTES LEFT»), как у оригинала. */ -static void num_text(char *buf, const char *suffix) -{ - dec2(st_arg, buf); - while (*buf) buf++; - *put(buf, suffix) = 0; -} - -static void build_text(char *buf) -{ - if (st_shown == POP_MSG_LEVEL) { - *put(put(buf, "LEVEL "), "") = 0; - dec2(st_arg, buf + 6); - } else if (st_shown == POP_MSG_MINUTES) { - num_text(buf, " MINUTES LEFT"); - } else if (st_arg == 1) { - *put(buf, "1 SECOND LEFT") = 0; - } else { - num_text(buf, " SECONDS LEFT"); - } -} - -/* Стереть полосу сообщения на ТЕКУЩЕЙ странице. Нужна меню: оно пишет в ту - * же полосу своё «GAME PAUSED», а под ним могло остаться сообщение игры - * («60 MINUTES LEFT», «QUICKSAVE») — две надписи ложились друг на друга. */ -void pop_status_wipe(void) __banked -{ - uint8_t saved; - - if (!pop_ui_ready()) return; - saved = gfx_get_bank(); - wipe(POP_STATUS_L, MSG_TOP, POP_STATUS_R, MSG_BOTTOM); - gfx_set_bank(saved); -} - -static void status_draw(void) -{ - char buf[18]; - const char *text; - - wipe(POP_STATUS_L, MSG_TOP, POP_STATUS_R, MSG_BOTTOM); - if (!st_shown) return; - if (st_shown >= POP_MSG_LEVEL && st_shown <= POP_MSG_SECONDS) { - build_text(buf); - text = buf; - } else { - text = status_text[st_shown]; - } - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_center_mapped(POP_TEXT_BIG, (POP_STATUS_L + POP_STATUS_R) / 2, - MSG_BASE, text); - pop_text_unmap(); -} - -/* Заявка сообщения С ЧИСЛОМ. Обычная (байтовая) заявка сравнивает только - * номер сообщения, а здесь меняться может одно лишь число — «12 SECONDS - * LEFT» и «11 SECONDS LEFT» это один и тот же POP_MSG_SECONDS, и по номеру - * их не различить. Поэтому ставим состояние сразу и сами взводим грязь. */ -static void msg_set(uint8_t msg, uint8_t arg, uint8_t ticks) -{ - pop_status_msg = msg; - st_shown = msg; - st_arg = arg; - pop_status_ticks = ticks; - st_dirty = 3; -} - -/* Порт show_level (seg008:25A8). Демо-уровень 0 и номера от 14 не - * показываются вовсе, тринадцатый представляется двенадцатым, а бесшовный - * переход 12->13 молчит — и, как в оригинале, гасит флаг за собой. - * Следом оригинал просит показать и время: за «LEVEL 1» идёт «60 MINUTES - * LEFT», когда первая строка отвисит своё. */ -void pop_status_level(void) __banked -{ - uint8_t n = pop_current_level; - uint8_t quiet = pop_seamless; - - pop_seamless = 0; - if (quiet || n == 0 || n >= POP_LEVEL_LAST) return; - if (n == 13) n = 12; - msg_set(POP_MSG_LEVEL, n, MSG_TICKS); - pop_show_time = 1; -} - -/* Вторая половина show_time (seg008:1812): собственно печать. Флаг - * pop_show_time == 2 означает «перебить текущую строку немедленно» — - * так оригинал ведёт себя в последнюю минуту и после читов времени. */ -static void time_msg(void) -{ - if (!pop_show_time) return; - if (pop_show_time == 2) pop_status_ticks = 0; - else if (pop_status_ticks) return; /* ждём, пока освободится строка */ - pop_show_time = 0; - - if (pop_timer_minutes == 0) { - msg_set(POP_MSG_EXPIRED, 0, MSG_TICKS); - } else if (pop_timer_minutes == 1) { - /* Секунда — 12 тиков; +1 потому, что ticks уже уменьшен. */ - uint8_t sec = (uint8_t)((pop_timer_ticks + 1) / 12); - msg_set(POP_MSG_SECONDS, sec, (uint8_t)(sec == 1 ? 12 : MSG_TICKS)); - } else { - msg_set(POP_MSG_MINUTES, pop_timer_minutes, MSG_TICKS); - } -} - -/* Показать сообщение НЕМЕДЛЕННО, не дожидаясь конца кадра. - * - * Обычный путь (заявка в pop_status_msg + pop_status_frame) печатает строку - * там же, где рисуется кадр, — то есть уже ПОСЛЕ длинной операции. На - * QuickSave это выглядело так: игра замирает на полсекунды, и только потом - * появляется «QUICKSAVE», когда объяснять фриз уже поздно. Здесь строка - * выкладывается сразу, до дисковой работы. - * - * Рисуем в ВИДИМУЮ страницу: игрок смотрит именно на неё, а до следующего - * флипа кадра ещё вся операция. Скрытой странице сообщение остаётся - * должным — её закроет обычный кадровый проход. */ -void pop_status_show_now(uint8_t msg) __banked -{ - uint8_t visible, saved_page, saved_bank; - - pop_status_msg = msg; - if (!pop_ui_ready()) return; /* шрифта нет — останется заявкой */ - st_shown = msg; - pop_status_ticks = (uint8_t)(msg ? MSG_TICKS : 0); - st_dirty = 3; - - visible = (uint8_t)(gfx_get_visible_page() & 1); - saved_page = gfx_get_draw_page(); - saved_bank = gfx_get_bank(); - gfx_set_draw_page(visible); - status_draw(); - /* Бит видимой страницы НЕ снимаем. За время дисковой операции ту же - * страницу успевает переписать восстановление комнаты, и снятый бит - * означал бы «здесь уже нарисовано» — надпись оставалась ровно на одной - * странице и мигала через кадр (поймано на QUICKLOAD). Лишняя - * перерисовка строки стоит дешевле мигания. */ - gfx_set_draw_page(saved_page); - gfx_set_bank(saved_bank); -} - -/* ---- верхняя полоса ---------------------------------------------------- */ - -/* right — граница зоны (первый столбец СЛЕДУЮЩЕЙ подписи), w — её ширина. */ -static void dbg_value(int right, uint8_t w, const char *s) -{ - wipe(right - w, DBG_TOP, right - 1, DBG_BOTTOM); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_right_mapped(POP_TEXT_SMALL, right - 1, DBG_BASE, s); - pop_text_unmap(); -} - -/* Подписи неизменны — рисуем их только при полной перерисовке полосы. */ -static void dbg_labels(void) -{ - wipe(DBG_LEFT, DBG_TOP, DBG_RIGHT, DBG_BOTTOM); - gfx_set_bank(GFX_BANK_TRANSPARENT); - pop_text_map(); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_LEVEL, DBG_BASE, "Level"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_ROOM, DBG_BASE, ", Room"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SPEED, DBG_BASE, ", Speed:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SOUND, DBG_BASE, ", S:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_MUS, DBG_BASE, ", M:"); - pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_IMM, DBG_BASE, ", I:"); - pop_text_unmap(); -} - -static void dbg_draw(uint8_t mask) -{ - char buf[6]; - - /* Полная перерисовка стирает всю полосу разом — значит зоны значений - * стирать по второму разу не надо, но нарисовать их всё равно нужно. */ - if (mask == DBG_F_ALL) dbg_labels(); - if (mask & DBG_F_LEVEL) { - dec2(dbg_lvl, buf); - dbg_value(R_VAL_LEVEL, W_VAL_NUM, buf); - } - if (mask & DBG_F_ROOM) { - dec2(dbg_room, buf); - dbg_value(R_VAL_ROOM, W_VAL_NUM, buf); - } - if (mask & DBG_F_SPEED) - dbg_value(R_VAL_SPEED, W_VAL_SPEED, - speed_text[dbg_spd < 3 ? dbg_spd : 0]); - if (mask & DBG_F_SOUND) - dbg_value(R_VAL_SOUND, W_VAL_SOUND, dbg_snd ? "ON" : "OFF"); - if (mask & DBG_F_MUS) - dbg_value(R_VAL_MUS, W_VAL_SOUND, dbg_mus ? "ON" : "OFF"); - if (mask & DBG_F_IMM) { - buf[0] = (char)('0' + (dbg_imm < 10 ? dbg_imm : 9)); - buf[1] = 0; - dbg_value(R_VAL_IMM, W_VAL_IMM, buf); - } - if (mask & DBG_F_TIME) { - dec2z(dbg_tmin, buf); - buf[2] = ':'; - dec2z(dbg_tsec, buf + 3); - dbg_value(R_VAL_TIME, W_VAL_TIME, buf); - } -} - -/* Снимок ДО сравнения — обход sdcc_z80_cmp_store_a_bug: `if (n != s) s = n;` - * SDCC z80 собирает неверно (SUB затирает A, в снимок уезжает разность). */ -static void dbg_scan(uint8_t room) -{ - uint8_t prev_lvl = dbg_lvl, prev_room = dbg_room, prev_spd = dbg_spd; - uint8_t prev_snd = dbg_snd, prev_mus = dbg_mus, prev_imm = dbg_imm; - uint8_t prev_tmin = dbg_tmin, prev_tsec = dbg_tsec; - uint8_t mask = 0; - - /* Часы-минуты: у оригинала rem_min — это НОМЕР идущей минуты, а не - * остаток целых минут (старт 60 при rem_tick 719 = «почти 60:00»), - * поэтому на табло уходит minutes-1 и секунды из тиков. - * - * Секунды — единственное деление на этом пути, поэтому считаем их не - * каждый кадр, а раз в двенадцать (тик секунды у SDLPoP) и вдобавок - * сразу, если минуты изменились (чит времени, загрузка снимка). */ - { - uint8_t mm = (uint8_t)(pop_timer_minutes ? pop_timer_minutes - 1 : 0); - if (dbg_phase) dbg_phase--; - if (!dbg_phase || dbg_tmin != mm) { - dbg_phase = 12; - dbg_tsec = (uint8_t)(pop_timer_minutes ? pop_timer_ticks / 12 : 0); - } - dbg_tmin = mm; - } - - dbg_lvl = pop_current_level; - dbg_room = room; - dbg_spd = pop_speed_mode; - dbg_snd = pop_snd_want; - dbg_mus = pop_mus_want; - dbg_imm = pop_immortal; - if (dbg_lvl != prev_lvl) mask |= DBG_F_LEVEL; - if (dbg_room != prev_room) mask |= DBG_F_ROOM; - if (dbg_spd != prev_spd) mask |= DBG_F_SPEED; - if (dbg_snd != prev_snd) mask |= DBG_F_SOUND; - if (dbg_mus != prev_mus) mask |= DBG_F_MUS; - if (dbg_imm != prev_imm) mask |= DBG_F_IMM; - if (dbg_tmin != prev_tmin || dbg_tsec != prev_tsec) mask |= DBG_F_TIME; - if (mask) { - dbg_dirty[0] |= mask; - dbg_dirty[1] |= mask; - } -} - -/* ---- смерть Кида ------------------------------------------------------- * - * - * Порт play_kid (seg006:1383): вместо авто-респавна по таймеру уровень - * перезапускает сам игрок кнопкой, а строка висит, пока он этого не сделал - * (MSG_HOLD). Авто-рестарт оригинала по истечении 288 тиков нам не нужен: - * он там начинает игру заново, а мы возвращаем на чекпойнт. */ -#define DEAD_SETTLE 7 /* Kid.alive > 6: труп успел лечь */ -#define DEAD_TICKS 288 /* text_time_total у «Press Button» */ -#define DEAD_BLINK 72 /* последние 72 тика строка мигает */ -#define SND_BLINK 38 /* sound_38_blink на каждом появлении */ - -/* Кадр, с которого пошёл отсчёт надписи. НЕ равен DEAD_SETTLE: оригинал - * не показывает «Press Button», пока звучит музыка смерти — ветка мёртвого - * (seg006:1351) на седьмом шаге просто выходит, если звук ещё играет, и - * надпись появляется только после него. Поэтому момент старта отсчёта - * заранее не известен и запоминается здесь. */ -static uint16_t dead_base; -static uint8_t dead_armed; /* всё отпущено — можно принимать нажатие */ - -uint8_t pop_dead_prompt(uint16_t frames) __banked -{ - uint16_t rem; - - if (frames < DEAD_SETTLE) { dead_base = 0; return 0; } - if (dead_base == 0) { - /* Ждём, пока домолчит музыка смерти — порядок оригинала. Пока она - * играет, надписи нет и отсчёт 288 не идёт; прервать ожидание можно - * Ctrl+A или быстрой загрузкой, они музыку глушат. */ - if (pop_music_active()) return 0; - dead_base = frames; - msg_set(POP_MSG_PRESS_BUTTON, 0, MSG_HOLD); - pop_show_time = 0; /* иначе поверх ляжет время (seg006:1365) */ - dead_armed = 0; - return 0; - } - - /* Свой отсчёт, а не pop_status_ticks: тот 8-битный, а здесь нужно 288. - * Кадры смерти считает вызывающий, так что хватает вычитания. */ - rem = (uint16_t)(frames - dead_base); - rem = (uint16_t)(rem >= DEAD_TICKS ? 0 : DEAD_TICKS - rem); - if (rem == 0) { - /* Игрок промолчал все 24 секунды — оригинал зовёт start_game(), - * то есть уходит в title, а НЕ перезапускает уровень. Событие - * шлём отсюда: pop_app живёт в этом же банке, и резиденту остаётся - * один break вместо вызова с проверкой. */ - msg_set(POP_MSG_NONE, 0, 0); - (void)pop_app_dispatch(POP_APP_EV_RESTART_INTRO); - return 2; - } - - /* Мигание последних шести секунд: 4 тика видно, 8 нет; на кадре - * появления оригинал перепечатывает строку и играет звук 38. */ - if (rem < DEAD_BLINK) { - uint8_t phase = (uint8_t)(rem % 12); - if (phase > 3) { - if (st_shown) msg_set(POP_MSG_NONE, 0, 0); - } else if (phase == 3 && !st_shown) { - msg_set(POP_MSG_PRESS_BUTTON, 0, MSG_HOLD); - pop_sfx_play(SND_BLINK); - } - } - - /* Рестарт уровня — Enter или Shift (seg000:584 подменяет их на Ctrl+A), - * а не любая клавиша. Esc сюда не попадает: он открывает меню и - * разобран раньше в этом же кадре. - * - * Отпускания оригинал не ждёт, а мы ждём: Shift у нас — клавиша - * действия, и зажатый в момент смерти он перезапустил бы уровень - * мгновенно, не дав прочитать строку. */ - { - uint8_t any = (uint8_t)(kbd_raw_down(KBD_ENTER) || - kbd_raw_down(KBD_LSHIFT) || - kbd_raw_down(KBD_RSHIFT)); - if (!dead_armed) { - dead_armed = (uint8_t)!any; - return 0; - } - if (!any) return 0; - } - dead_armed = 0; - dead_base = 0; - pop_music_stop(); /* игрок ответил — доигрывать не заставляем */ - msg_set(POP_MSG_NONE, 0, 0); - return 1; -} - -/* ---- кадровая точка ---------------------------------------------------- */ - -void pop_status_invalidate(void) __banked -{ - st_dirty = 3; - dbg_dirty[0] = DBG_F_ALL; - dbg_dirty[1] = DBG_F_ALL; -} - -void pop_status_frame(uint8_t room) __banked -{ - uint8_t page, bit, saved; - /* Три состояния верхней полосы: 0 — нет, 1 — только таймер (T), 2 — - * вся отладочная строка (Ctrl+D). Отслеживаем именно РЕЖИМ, а не - * булево: переход «таймер -> полоса» тоже обязан перерисовать всё. */ - uint8_t want = (uint8_t)(pop_settings.show_debug_bar ? 2 : - (pop_show_timer ? 1 : 0)); - - if (!pop_ui_ready()) return; - page = (uint8_t)(gfx_get_draw_page() & 1); - bit = (uint8_t)(1 << page); - saved = gfx_get_bank(); - - /* --- нижняя полоса: заявка, таймер, перерисовка --- */ - time_msg(); - if (pop_status_msg != st_shown) { - st_shown = pop_status_msg; - pop_status_ticks = (uint8_t)(!st_shown ? 0 : - (st_shown == POP_MSG_PRESS_BUTTON ? MSG_HOLD - : MSG_TICKS)); - st_dirty = 3; - } else if (pop_status_ticks && pop_status_ticks != MSG_HOLD) { - pop_status_ticks--; - if (!pop_status_ticks) { - /* Оригинал по истечении зовёт erase_bottom_text(1) — снимаем и - * заявку, иначе то же сообщение никогда не покажется снова. */ - pop_status_msg = 0; - st_shown = 0; - st_dirty = 3; - } - } - if (st_dirty & bit) { - status_draw(); - st_dirty = (uint8_t)(st_dirty & ~bit); - } - - /* --- верхняя полоса --- */ - if (want != dbg_on) { - dbg_on = want; - /* Выключили — полосу надо стереть на ОБЕИХ страницах, иначе её - * остаток висел бы до следующей смены комнаты. */ - dbg_dirty[0] = DBG_F_ALL; - dbg_dirty[1] = DBG_F_ALL; - } - if (!want) { - if (dbg_dirty[page]) { - wipe(DBG_LEFT, DBG_TOP, DBG_RIGHT, DBG_BOTTOM); - dbg_dirty[page] = 0; - } - } else if (want == 1) { - /* Только таймер: подписей нет, поле рисуется на своём месте у - * правого края — dbg_value стирает свою зону сам. Полную маску - * сюда пропускать нельзя, иначе dbg_draw позовёт dbg_labels. */ - dbg_scan(room); - if (dbg_dirty[page] & DBG_F_TIME) { - if (dbg_dirty[page] == DBG_F_ALL) - wipe(DBG_LEFT, DBG_TOP, DBG_RIGHT, DBG_BOTTOM); - dbg_draw(DBG_F_TIME); - } - dbg_dirty[page] = 0; - } else { - dbg_scan(room); - if (dbg_dirty[page]) { - dbg_draw(dbg_dirty[page]); - dbg_dirty[page] = 0; - } - } - - gfx_set_bank(saved); -} diff --git a/applications/SprPoP/src/pop_status.h b/applications/SprPoP/src/pop_status.h deleted file mode 100644 index a6d1d8e..0000000 --- a/applications/SprPoP/src/pop_status.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * pop_status.h — ТЕКСТ в двух служебных полосах экрана (банк 9). - * - * Нижняя (полоса HP) — статус-строка оригинала: порт display_text_bottom - * (seg008:2644) и пары text_time_total/text_time_remaining. Полный - * разбор всех сообщений SDLPoP — ../docs/status_line_text.md. - * Верхняя — наша отладочная строка (была палочками, теперь текст). - * - * ЗАЯВКА — ОДИН БАЙТ. `pop_status_msg` лежит в W2 и пишется откуда - * угодно простым присваиванием: ни трамплина, ни функции. Всё остальное - * (таймер, перерисовка на обеих страницах, шрифт) делает pop_status_frame() - * из банка 9 — один банковый вызов на кадр, рядом с прежним ярлыком - * комнаты. Так в резиденте W1/W2 не появляется ни кода, ни таблиц строк. - */ -#ifndef POP_STATUS_H -#define POP_STATUS_H - -#include - -/* Сообщения нижней полосы. Порядок = таблица строк в pop_status.c. */ -enum { - POP_MSG_NONE = 0, - POP_MSG_QUICKSAVE, /* F6 успешно */ - POP_MSG_NO_QUICKSAVE, /* F6 не удалось */ - POP_MSG_QUICKLOAD, /* F9 успешно */ - POP_MSG_NO_QUICKLOAD, /* F9 нечего грузить / битый слот */ - POP_MSG_SOUND_ON, /* Ctrl+S */ - POP_MSG_SOUND_OFF, - POP_MSG_MUSIC_ON, /* Ctrl+M */ - POP_MSG_MUSIC_OFF, - POP_MSG_LEVEL, /* «LEVEL N» — строка собирается с номером */ - POP_MSG_MINUTES, /* «N MINUTES LEFT» */ - POP_MSG_SECONDS, /* «N SECONDS LEFT» / «1 SECOND LEFT» */ - POP_MSG_EXPIRED, /* «TIME HAS EXPIRED!» */ - POP_MSG_PRESS_BUTTON, /* Кид мёртв — ждём кнопку (висит бессрочно)*/ - POP_MSG_N -}; - -/* Заявка/текущее сообщение. Пишется откуда угодно: 0 — снять строку, - * POP_MSG_* — показать. Повторная заявка того же номера продлевает показ - * только если строка уже погасла (как у оригинала: он тоже сравнивает). */ -extern uint8_t pop_status_msg; -/* Постоянный показ таймера (клавиша T); независим от отладочной полосы. */ -extern uint8_t pop_show_timer; - -/* Показать сообщение НЕМЕДЛЕННО, до конца кадра: строка выкладывается в - * видимую страницу прямо сейчас. Нужна там, где сразу за вызовом идёт - * длинная операция (QuickSave/QuickLoad): обычная заявка напечаталась бы - * уже ПОСЛЕ фриза, когда объяснять его поздно. */ -void pop_status_show_now(uint8_t msg) __banked; - -/* Порт show_level (seg008:25A8): заявить «LEVEL N» на старте уровня. - * Сама решает, показывать ли (демо-уровень и финальные номера молчат) — - * вызывающему условий знать не нужно. */ -void pop_status_level(void) __banked; - -/* Сколько логических кадров сообщение ещё висит; 0 — не висит. Читает - * pop_hp_draw (банк 4), чтобы не затирать чужой текст своим фоном. */ -extern uint8_t pop_status_ticks; - -/* Горизонтальные границы ТЕКСТА в полосе HP. Ровно промежуток между - * делениями Кида (слева) и стража (справа) — как rect_bottom_text - * {193,70,202,250} у оригинала. */ -#define POP_STATUS_L 70 -#define POP_STATUS_R 250 - -/* Раз в логический кадр, ПОСЛЕ pop_hp_draw: тик таймера, перерисовка - * нижней строки и обновление верхней отладочной. Всё change-driven — - * пока ничего не менялось, не рисует вовсе. */ -void pop_status_frame(uint8_t room) __banked; - -/* Кид мёртв: показать «Press Button to Continue» и ждать кнопку. frames — - * сколько кадров прошло со смерти (труп должен успеть лечь). Возвращает 1 - * ОДИН раз, когда игрок нажал — вызывающему остаётся перезапустить уровень. - * Логика живёт в банке, потому что резидент W1 переполнен, а зовут её лишь - * в кадрах смерти. - * - * Возвращает: 0 — ждём дальше; 1 — игрок нажал Enter/Shift, перезапустить - * УРОВЕНЬ; 2 — 288 тиков истекли, уйти в title (порт start_game). */ -uint8_t pop_dead_prompt(uint16_t frames) __banked; - -/* Заставить перерисовать ОБЕ страницы: звать после того, как полосы - * затёрли чужим содержимым (вход в комнату, выход из меню). */ -void pop_status_invalidate(void) __banked; - -/* Стереть полосу сообщения на текущей странице (меню пишет туда своё). */ -void pop_status_wipe(void) __banked; - -#endif /* POP_STATUS_H */ diff --git a/applications/SprPoP/src/pop_tile.c b/applications/SprPoP/src/pop_tile.c deleted file mode 100644 index da9fdab..0000000 --- a/applications/SprPoP/src/pop_tile.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * pop_tile.c — общие ЛИСТЬЯ слоя фона: блит куска атласа, чтение тайла - * комнаты, таблица тайлов. РЕЗИДЕНТ W1 (_CODE). - * - * Мотивация раскладки (почему резидент, а не банк) — в шапке pop_tile.h: - * коротко, эти функции и таблицы нужны ОБЕИМ половинам слоя фона (горячей — - * fore-проход каждый кадр, холодной — полная отрисовка комнаты), а код и - * rodata банка видны только пока банк замаплен. W1 замаплено всегда. - */ -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF, POP_PLAYFIELD_H */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include "pop_cdraw.h" /* POP_CD_TOUCH — фон тронут, персонажей перерисовать */ -#include "pop_tile.h" -#include "pop_pace.h" /* pop_beam_sample — счёт кадров по лучу */ -#include "pop_level.h" /* pop_doorlink2 — подстановка нажатой кнопки */ -#include "_pop_draw.h" /* pop_heal_fast */ -#include "_pop_tile.h" /* контракт с холодной половиной (pop_tile_cold.c) */ - -/* ---- Состояние (писучее, _DATA/W2 — видно из любого банка) ---------- */ -atlas_t pop_env[POP_ENV_PAGES], pop_wall_at, pop_fore_at, pop_pot_at; - -/* Загруженный тайлсет: 0 подземелье, 1 дворец (порт tbl_level_type в той - * части, что касается ОТРИСОВКИ). Ставит pop_bg_load; резидент — потому - * что по нему расходятся ветки и в банке 7 (полная отрисовка тайла), и в - * банке 2 (fore-проход), и в банке 3 (модификатор пустой клетки от упавшей - * плиты, remove_loose seg007:0EB8). Читать напрямую, без трамплина. */ -uint8_t pop_palace; - -const uint8_t *pop_t_fg, *pop_t_bg, *pop_t_lfg, *pop_t_lbg; -const uint8_t *pop_t_below, *pop_t_above, *pop_t_abovemod; -uint8_t pop_t_room; -pop_rnd_t pop_t_seed; - -int pop_t_clip_top; -int pop_t_fclip_x0, pop_t_fclip_y0, pop_t_fclip_x1, pop_t_fclip_y1; -/* ТО ЖЕ ОКНО В ЛОГИЧЕСКИХ (неперевёрнутых) координатах. Экранная пара нужна - * для клипа самого блита — он режет уже перевёрнутый прямоугольник; а вот - * ОТСЕВ ТАЙЛОВ идёт по позиции тайла в комнате (63*row + …), и она от - * переворота не зависит. Пока пара была одна, при pop_upside отсев сравнивал - * логический y тайла с зеркальным окном и выбрасывал именно те тайлы, что - * должны лечь ПОВЕРХ персонажа: передняя грань колонны переставала рисоваться - * и Кид оказывался перед ней (найдено пользователем на уровне 9). */ -int pop_t_fclip_ly0, pop_t_fclip_ly1; -uint8_t pop_t_fclip_on; -uint8_t pop_t_bake_rest; - -/* Позиция склянки внутри тайла зелья — поля fore_x/fore_y записи 0x0A той же - * таблицы. Вынесены МАКРОСАМИ (одно место правки, дублирования данных нет): - * пока таблица была `static const`, SDCC сворачивала `tile_table[10].fore_x` - * в константу, но глобальную (её читают оба банка) уже не сворачивает — - * чтение полей в рантайме стоило +150 Б и IX-кадр на 13 локалов. */ -#define POT_FORE_X 2 -#define POT_FORE_Y (-3) - -/* ---- Таблица тайлов (piece, seg008.c:27) --------------------------- */ -const piece pop_tile_table[31] = { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 00 empty */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 01 floor */ - {127, 1, 0, 133, 1, 2, 145, 0, 43, 0, 0, 0}, /* 02 spike */ - { 92, 1, 0, 93, 1, 2, 0, 94, 43, 95, 1, 0}, /* 03 pillar */ - { 46, 1, 0, 47, 1, 2, 0, 48, 43, 49, 3, 0}, /* 04 gate */ - { 41, 1, 1, 35, 1, 3, 145, 0, 36, 0, 0, 0}, /* 05 stuck floor */ - { 41, 1, 0, 42, 1, 2, 145, 0, 96, 0, 0, 0}, /* 06 close button */ - { 46, 1, 0, 0, 0, 2, 0, 0, 43, 49, 3, 0}, /* 07 door top w/floor */ - { 86, 1, 0, 87, 1, 2, 0, 0, 43, 88, 1, 0}, /* 08 big pillar bottom */ - { 0, 0, 0, 89, 0, 3, 0, 90, 0, 91, 1, 3}, /* 09 big pillar top */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 12, POT_FORE_X, POT_FORE_Y}, /* 0A potion */ - { 0, 1, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0}, /* 0B loose floor */ - { 0, 0, 0, 0, 0, 2, 0, 0, 85, 49, 3, 0}, /* 0C door top */ - { 75, 1, 0, 42, 1, 2, 0, 0, 43, 77, 0, 0}, /* 0D mirror */ - { 97, 1, 0, 98, 1, 2, 145, 0, 43,100, 0, 0}, /* 0E debris */ - {147, 1, 0, 42, 1, 1, 145, 0,149, 0, 0, 0}, /* 0F open button */ - { 41, 1, 0, 37, 0, 0, 0, 38, 43, 0, 0, 0}, /* 10 leveldoor left */ - { 0, 0, 0, 39, 1, 2, 0, 40, 43, 0, 0, 0}, /* 11 leveldoor right */ - { 0, 0, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 12 chomper */ - { 41, 1, 0, 42, 1, 2, 0, 0, 43, 0, 0, 0}, /* 13 torch */ - { 0, 0, 0, 1, 1, 2, 0, 2, 0, 0, 0, 0}, /* 14 wall */ - { 30, 1, 0, 31, 1, 2, 0, 0, 43, 0, 0, 0}, /* 15 skeleton */ - { 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0}, /* 16 sword */ - { 41, 1, 0, 10, 0, 0, 0, 11, 43, 0, 0, 0}, /* 17 balcony left */ - { 0, 0, 0, 12, 1, 2, 0, 13, 43, 0, 0, 0}, /* 18 balcony right */ - { 92, 1, 0, 42, 1, 2, 145, 0, 43, 95, 1, 0}, /* 19 lattice pillar */ - { 1, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0,-53}, /* 1A lattice down */ - { 3, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1B lattice small */ - { 4, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1C lattice left */ - { 5, 0,-10, 0, 0, 0, 0, 0, 0, 9, 0,-53}, /* 1D lattice right */ - { 97, 1, 0, 98, 1, 2, 0, 0, 43,100, 0, 0}, /* 1E debris w/torch */ -}; - -/* Деление координаты на ширину тайла ТАБЛИЦЕЙ (tile_div_tbl/tile_mod_tbl, - * seg006:702/23A6) — как в оригинале. Живут в резиденте, потому что нужны - * и карте (банк 3, колонка персонажа), и слою фона (банк 2, футпринт), а - * const-таблицу чужого банка не прочитать. - * - * Почему не деление: SDCC разворачивает / и % в __divsint + __modsint, - * причём __modsint внутри снова зовёт __divsint — замер в MAME дал 5 400 - * тактов на один вызов при 13+ вызовах за кадр. Индекс — координата как - * есть (0..255), смещение -58 уже внутри значений: POP_TILE_DIV[x] = - * floor((x - 58) / 14), POP_TILE_MOD[x] — остаток. Сверено с SDLPoP - * побайтно. */ -const int8_t POP_TILE_DIV[256] = { - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, -}; -const uint8_t POP_TILE_MOD[256] = { - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, -}; - -const uint8_t POP_COL_XH[10] = {0, 4, 8, 12, 16, 20, 24, 28, 32, 36}; -const uint8_t POP_WALL_FRAM_BOTTOM[4] = {7, 9, 5, 3}; -const uint8_t POP_WALL_FRAM_MAIN[4] = {8, 10, 6, 4}; -const uint8_t POP_SPIKES_FRAM_LEFT[10] = {0, 128, 129, 130, 131, 132, 131, 129, 128, 0}; -const uint8_t POP_LOOSE_FRAM_LEFT[12] = {41,69,41,70,70,41,41,41,70,70,70,0}; -const uint8_t POP_LOOSE_FRAM_BOTTOM[12] = {43,73,43,74,74,43,43,43,74,74,74,0}; - -/* ---- Чомпер: номер позы и передние куски (seg008 chomper_fram1/for) --- - * Резидент, а не банк: позу считает и полная отрисовка тайла (холодная - * половина, pop_room.c), и fore-проход поверх персонажа (горячая, - * pop_bg.c) — а const-таблица банка из чужого банка не читается вовсе. */ -static const uint8_t CHOMP_FRAM1[7] = {3, 2, 0, 1, 4, 3, 3}; -const uint8_t POP_CHOMP_FRAM_FOR[5] = {106, 107, 108, 109, 110}; - -uint8_t pop_chomp_pose(uint8_t modif) -{ - uint8_t m = (uint8_t)(modif & 0x7F); - /* В ЗАПЕЧКЕ — поза ПОКОЯ, по той же причине, что у плиты и пик: фаза - * челюстей транзиентна. Покой и есть фаза 0 (она же 6, на которой - * animate_chomper снимает trob): CHOMP_FRAM1[0] == CHOMP_FRAM1[6]. */ - if (pop_t_bake_rest) m = 0; - else if (m > 6) m = 6; - return CHOMP_FRAM1[m]; -} - -/* get_loose_frame (seg008:761): индекс дрожащего кадра по модификатору. - * В режиме ЗАПЕЧКИ фона отдаёт кадр ПОКОЯ — транзиентный кадр нельзя - * консервировать в ОЗУ-копию (см. pop_t_bake_rest в pop_bg.c). */ -uint8_t pop_loose_frame(uint8_t m) -{ - if (pop_t_bake_rest) return 0; - if (m & 0x80) { m &= 0x7F; if (m > 10) return 1; } - return m; -} - -/* Кадр пик по их модификатору: 1..4 — выдвижение, 0x80|n — «вышли целиком» - * (один кадр 5), 6..8 — уход. Как и у плиты, в режиме ЗАПЕЧКИ отдаёт кадр - * ПОКОЯ (0 = пик не видно): выдвинутая пика — транзиент, её место в ОЗУ-копии - * фона делает heal вечным (BUG-SPIKE-BAKED, см. BUGS_CLOSED.md). - * - * Отдельная функция, а не `(m & 0x80) ? 5 : m` по месту: считают кадр ЧЕТЫРЕ - * слоя (draw_tile_anim, draw_tile_anim_right соседа, fore-проход и - * mid-оверлей), и одного забытого хватило, чтобы пики законсервировались. */ -uint8_t pop_spike_frame(uint8_t m) -{ - if (pop_t_bake_rest) return 0; - return (uint8_t)((m & 0x80) ? 5 : m); -} - -/* ---- «Фон трогали ВОТ ЗДЕСЬ» (DRAW-COST; контракт — pop_cdraw.h) ----- * - * - * Метка — БИТОВАЯ МАСКА ТАЙЛОВ, по слову на ряд и по набору на страницу. - * Раньше здесь лежал ОДИН union-прямоугольник на страницу, и это убивало - * пропуск перерисовки персонажа: три факела комнаты трогают по пятнышку - * 16x18 в колонках 1, 6 и 8, а их объединение — полоса x 40..280 на всю - * комнату. Кид, стоящий где угодно между крайними факелами, попадал в неё - * и перерисовывался каждый кадр со всем fore-проходом (замер: циан 231 829 - * тактов против 20 071, период 4 растровых кадра против 3). - * - * ГРАНУЛЯРНОСТЬ: колонка 32 px по горизонтали, ТОЧНЫЙ диапазон y по - * вертикали. Раньше по вертикали стоял номер ряда (три полосы по 63 px), и - * это склеивало касания, разнесённые внутри ряда. Найдено пользователем на - * сцене 11/15 (2026-08-19): пламя факела занимает y 5..22, клинок стоящего - * стража — y 31..37, между ними девять пикселей чистого зазора, а метка - * считала слот задетым, потому что оба попадают в ряд 0 и колонку 7. - * Стоило это 148 302 такта в кадр — 23 % работы — на перерисовку персонажа, - * которого никто не трогал. - * - * Почему диапазон, а не более мелкие полосы: полосы по 16 px эту пару всё - * равно склеивают (пламя кончается в полосе 1, клинок в ней же начинается), - * а 8-пиксельные потребовали бы 24 маски на страницу. Пара ymin/ymax на - * колонку — 40 байт на обе страницы, точнее любых полос и без битовой возни. - * - * У ОРИГИНАЛА такой метки нет вовсе: и Apple II (FRAMEADV.S RedBlockFast с - * шестью буферами wipebuf/redbuf/movebuf/floorbuf/halfbuf/objbuf), и SDLPoP - * (set_redraw_fore в redraw_at_char) метят ЦЕЛЫМИ тайлами, но им это не - * мешает — персонаж у них рисуется каждый кадр безусловно, а пометки нужны - * только фону. Пропуск неизменившегося персонажа — наша добавка, поэтому и - * точность метки нужна выше оригинальной. См. docs/impl_diff.md. */ -uint8_t pop_cd_dirty; -/* [страница][колонка] — диапазон затронутых экранных y. Пусто = ymin > ymax - * (заполняется как ymin = 255, ymax = 0). */ -uint8_t pop_cd_ymin[2][10], pop_cd_ymax[2][10]; - -/* CD_LOW, cd_row_of и cd_cols_of СНЯТЫ вместе с переходом на диапазон y: - * колонка теперь считается прямым сдвигом (x >> 5), а вертикаль сравнением - * отрезков — битовые маски больше не нужны. */ - -/* Обе страницы помечаются сразу (персонаж чинится на каждой в свой кадр), - * поэтому цикл развёрнут: индекс-переменная заставляла SDCC считать адрес - * каждой ячейки сложением. Зовётся с КАЖДОГО блита фона. */ -/* Пакетная пометка (pop_cd_batch_begin/end). Один тайл рисуется пятью-шестью - * спрайтами, и каждый звал pop_cd_touch со своими четырьмя 16-битными - * аргументами — 2 866 тактов на спрайт, 15% всей цены блита (замер - * 2026-08-13). В пакете спрайты копят ОБЩИЙ прямоугольник, а настоящая - * пометка ставится одна на тайл. - * - * Объединение ЗАГРУБЛЯЕТ прямоугольник (накрывает и то, чего между кусками - * не касались), и это безопасно ровно в одну сторону: лишняя пометка стоит - * лишней перерисовки персонажа, пропущенная — стёртого и не восстановленного - * персонажа. Практически загрубление почти нулевое: все куски одного тайла - * и так лежат в тех же 1-2 колонках сетки 32px и том же ряду. */ -uint8_t pop_cd_batch; -static int cdb_x0, cdb_y0, cdb_x1, cdb_y1; - -void pop_cd_batch_begin(void) -{ - pop_cd_batch = 1; - cdb_x0 = cdb_y0 = 32767; - cdb_x1 = cdb_y1 = -32768; -} - -void pop_cd_batch_end(void) -{ - pop_cd_batch = 0; /* СНАЧАЛА снять: ниже настоящий вызов */ - if (cdb_x1 >= cdb_x0 && cdb_y1 >= cdb_y0) - pop_cd_touch(cdb_x0, cdb_y0, cdb_x1 - cdb_x0 + 1, cdb_y1 - cdb_y0 + 1); -} - -/* Подавление на серию блитов — см. шапку в pop_cdraw.h. Отдельным значением - * того же флага, а не вторым флагом: у pop_cd_touch тогда остаётся ОДНА - * проверка на общем пути. */ -#define CD_BATCH_MUTE 2 - -void pop_cd_mute(void) { pop_cd_batch = CD_BATCH_MUTE; } -void pop_cd_unmute(void) { pop_cd_batch = 0; } - -void pop_cd_touch(int x, int y, int w, int h) -{ - if (pop_cd_batch) { /* копим, не разбирая на колонки/ряды */ - if (pop_cd_batch == CD_BATCH_MUTE) return; /* область помечена вызывающим */ - int x1 = x + w - 1, y1 = y + h - 1; - if (x < cdb_x0) cdb_x0 = x; - if (y < cdb_y0) cdb_y0 = y; - if (x1 > cdb_x1) cdb_x1 = x1; - if (y1 > cdb_y1) cdb_y1 = y1; - return; - } - { - int8_t c0, c1, c; - uint8_t y0, y1; - int xr = x + w - 1; - if (xr < 0 || x > 319) return; /* весь прямоугольник вне поля */ - if (x < 0) x = 0; - if (xr > 319) xr = 319; - c0 = (int8_t)(x >> 5); - c1 = (int8_t)(xr >> 5); - /* Клип по вертикали: экранные y не выходят за байт, а всё, что выше - * поля или ниже его, персонажам всё равно не принадлежит. */ - if (y < 0) y = 0; - if (y > 255) return; - y0 = (uint8_t)y; - y1 = (y + (int)h - 1 > 255) ? 255 : (uint8_t)(y + h - 1); - /* Страницы обновляются НЕЗАВИСИМО. Общее условие по странице 0 - * («если ей стало теснее — записать в обе») ломается сразу после - * pop_cd_clear(0): страница 1 хранит свои старые границы, условие по - * нулевой уже не выполняется, и её метка перестаёт расти. */ - for (c = c0; c <= c1; c++) { - if (y0 < pop_cd_ymin[0][c]) pop_cd_ymin[0][c] = y0; - if (y1 > pop_cd_ymax[0][c]) pop_cd_ymax[0][c] = y1; - if (y0 < pop_cd_ymin[1][c]) pop_cd_ymin[1][c] = y0; - if (y1 > pop_cd_ymax[1][c]) pop_cd_ymax[1][c] = y1; - } - } - pop_cd_dirty = 3; -} - -/* Задел ли прямоугольник (ЭКРАННЫЕ координаты, x1/y1 ВКЛЮЧИТЕЛЬНО) то, что - * трогали на странице p. Резидент: зовёт pop_cdraw.c из банка 4 прямым - * вызовом, без трамплина. */ - -/* ---- Блит куска атласа ---------------------------------------------- */ -/* Клипованный путь — ОТДЕЛЬНОЙ функцией. У него девять 16-битных локалей, - * и SDCC заводит под них кадр IX; пока он жил в общем теле, за этот кадр - * платили и блиты БЕЗ клипа (`ld -n(ix)` = 19 тактов номинала, у нас ~46). - * А блитов без клипа большинство: весь фон вне fore-прохода — факелы, зелья, - * перерисовка тайлов — идёт с pop_t_fclip_on == 0. */ -#define FLIP_TOP(top, h) POP_FLIP_TOP(top, h) /* формула — в pop_bg.h */ - - -/* Клипованный путь блита. Габарит и смещения внутри куска — БАЙТЫ, а вся - * рабочая переменная — file-scope, НЕ локали. - * - * Корректность байтового габарита по построению: кадры наших атласов не - * крупнее 56x63 (просканированы все 109 .atl, docs/perf_l13_room23.md §5), а - * кадр больше 255 в pop_blit_b уходит в blit_b_oversize и сюда не попадает. - * - * Зачем file-scope: с локалями SDCC заводил 22-байтовый стековый кадр и 211 - * обращений `-N(ix)` — при ~46 замеренных тактах на обращение это ~9 700 - * такта из 14 088 цены клипованного блита (замер 2026-08-17, - * docs/perf_green_phase.md §1.6). Одного байтового габарита НЕ ХВАТИЛО: - * кадр остался, обращений стало 173 — значений, живых через шесть вызовов - * ядер libbgi, всё равно больше, чем регистров у Z80. С file-scope - * спиливать нечего, а адресация абсолютная (13 тактов против 19). - * Тот же приём и по той же причине применён к draw_tile (pop_room.c). - * - * Реентерабельности не было и не требуется: единственный вызывающий — - * pop_blit_b, и он себя не зовёт. - * - * Арифметика клипа считается в int16 (bc_d), в байт уходит только результат — - * иначе вычитание ушло бы в перенос по модулю 256. */ -static const uint8_t *bc_img; -static int bc_dx, bc_dy; -static int16_t bc_d; -static uint8_t bc_w, bc_h, bc_dw, bc_dh, bc_sx, bc_sy; - -void blit_b_clip(const uint8_t *img, int x, int top, uint8_t w, uint8_t h) -{ - bc_img = img; bc_w = w; bc_h = h; - bc_dx = x; bc_dy = top; - bc_dw = w; bc_dh = h; bc_sx = 0; bc_sy = 0; - if (!pop_upside) { - if (pop_t_clip_top && bc_dy < pop_t_clip_top) { /* полоса у потолка */ - bc_d = (int16_t)(pop_t_clip_top - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)bc_d; bc_dy = pop_t_clip_top; - bc_dh = (uint8_t)(bc_dh - bc_sy); - } - } else { - /* ПЕРЕВОРОТ: то, что в обычном виде торчало ВЫШЕ поля (полоса кладки - * у потолка), теперь торчит НИЖЕ него — и без обрезки лезет в борт, - * где живёт полоса HP (баг «мусор ниже 192», найден пользователем). - * Режем по границам поля ВСЕГДА, а не по pop_t_clip_top: зеркальный - * спрайт может вылезти и там, где в обычном виде клип не ставили. */ - if (bc_dy < POP_YOFF) { - bc_d = (int16_t)(POP_YOFF - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)bc_d; bc_dy = POP_YOFF; - bc_dh = (uint8_t)(bc_dh - bc_sy); - } - if (bc_dy + bc_dh > POP_CLIP_BOTTOM) { - bc_d = (int16_t)(POP_CLIP_BOTTOM - bc_dy); - if (bc_d <= 0) return; - bc_dh = (uint8_t)bc_d; - } - } - if (pop_t_fclip_on) { /* окно fore-слоя / перерисовки */ - if (bc_dx < pop_t_fclip_x0) { - bc_d = (int16_t)(pop_t_fclip_x0 - bc_dx); - if (bc_d >= (int16_t)bc_dw) return; - bc_sx = (uint8_t)(bc_sx + (uint8_t)bc_d); - bc_dx += bc_d; bc_dw = (uint8_t)(bc_dw - (uint8_t)bc_d); - } - if (bc_dy < pop_t_fclip_y0) { - bc_d = (int16_t)(pop_t_fclip_y0 - bc_dy); - if (bc_d >= (int16_t)bc_dh) return; - bc_sy = (uint8_t)(bc_sy + (uint8_t)bc_d); - bc_dy += bc_d; bc_dh = (uint8_t)(bc_dh - (uint8_t)bc_d); - } - if (bc_dx + bc_dw > pop_t_fclip_x1) { - bc_d = (int16_t)(pop_t_fclip_x1 - bc_dx); - if (bc_d <= 0) return; - bc_dw = (uint8_t)bc_d; - } - if (bc_dy + bc_dh > pop_t_fclip_y1) { - bc_d = (int16_t)(pop_t_fclip_y1 - bc_dy); - if (bc_d <= 0) return; - bc_dh = (uint8_t)bc_d; - } - } - if (!bc_dw || !bc_dh) return; - /* ПЕРЕВОРОТ: экранная строка (dy+i) берёт источник (h-1-i), поэтому - * обрезка СВЕРХУ экрана съедает НИЖНИЕ строки источника. В терминах - * куска источника это sy' = h - sy - dh (при обрезке только сверху даёт - * 0, при обрезке только снизу — верхний край). */ - /* Проверки `dw < 256 && dh < 256 && w < 256` убраны как тождественные: - * это уже байты. */ - if (pop_upside) { - bc_d = (int16_t)bc_h - (int16_t)bc_sy - (int16_t)bc_dh; - if (bc_d < 0) bc_d = 0; - if (bc_dx >= 0 && bc_dy >= 0 && - bc_dx + bc_dw <= 320 && bc_dy + bc_dh <= 256) - gfx_blit_part_noclip_vflip(bc_dx, bc_dy, bc_img, bc_sx, - (uint8_t)bc_d, bc_dw, bc_dh); - else - gfx_blit_part_vflip(bc_dx, bc_dy, bc_img, bc_sx, - (uint8_t)bc_d, bc_dw, bc_dh); - } else - if (bc_dx >= 0 && bc_dy >= 0 && - bc_dx + bc_dw <= 320 && bc_dy + bc_dh <= 256) { - if (bc_sx == 0 && bc_sy == 0 && bc_dw == bc_w && bc_dh == bc_h) - gfx_blit_noclip(bc_dx, bc_dy, bc_img); - else - gfx_blit_part_noclip(bc_dx, bc_dy, bc_img, bc_sx, bc_sy, - bc_dw, bc_dh); - } else { - gfx_blit_part(bc_dx, bc_dy, bc_img, bc_sx, bc_sy, bc_dw, bc_dh); - } - /* Кусок ФОНА лёг туда, где может лежать уже нарисованный персонаж — - * пометить область (DRAW-COST, pop_cdraw.h). Признак «это не fore-проход - * поверх персонажа» — окно клипа: его ставит только он. */ - if (!pop_t_fclip_on) pop_cd_touch(bc_dx, bc_dy, bc_dw, bc_dh); -} - -/* Кадр шире или выше 255 — общий (медленный) путь. Вынесен отдельно, чтобы - * 16-битная арифметика габарита не жила ни в горячем pop_blit_b, ни в - * blit_b_clip (у того габарит теперь БАЙТОВЫЙ, см. его шапку). У нас таких - * кадров в игровом кадре нет вовсе (максимум 56x63), но контракт формата - * .atl их допускает, а интро/финал такие подложки принесут (320x200) — - * см. docs/perf_l13_room23.md §5. - * - * Клипа полосы у потолка и окна перерисовки здесь нет намеренно: такой кадр - * — полноэкранная подложка, ей ни то, ни другое не адресовано; за клип по - * экрану отвечает само ядро gfx_blit_part. */ -static void blit_b_oversize(const uint8_t *img, int x, int ybottom) -{ - uint16_t w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8)); - uint16_t h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8)); - int top = ybottom - (int)h + 1 + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - if (!w || !h) return; - gfx_blit_part(x, top, img, 0, 0, (int)w, (int)h); - if (!pop_t_fclip_on) pop_cd_touch(x, top, (int)w, (int)h); -} - -/* Рабочие переменные pop_blit_b — file-scope, не локали и не стековые - * аргументы (см. пролог функции). Реентерабельности нет и не требуется: - * pop_blit_b себя не зовёт, а blit_b_clip держит СВОЙ набор (bc_*). */ -static atlas_t *pb_a; -static uint8_t pb_idx, pb_w, pb_h; -static int pb_x, pb_yb, pb_top; -static const uint8_t *pb_img; - -void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom) -{ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча, см. pop_pace.h */ - /* Аргументы сразу в file-scope: третий и дальше SDCC передаёт СТЕКОМ, и - * дальше каждое их чтение — `-N(ix)` (замер 2026-08-17: 76 таких - * обращений в теле, ~3 500 такта из 14 500 цены блита). То же лечение, - * что у draw_tile и blit_b_clip. */ - pb_a = a; pb_idx = idx; pb_x = x; pb_yb = ybottom; - if (pb_idx >= pb_a->count) - return; - /* Грубый отсев ДО маппинга страницы: реальные pb_w/pb_h лежат в заголовке - * ленты, то есть в EMM-странице, и чтобы их прочитать, надо сделать - * gfx_w0_map. Берём заведомо больший габарит (кадры фона не крупнее - * 64×64) и, если он не задевает окно, уходим не заплатив ни за - * atlas_image, ни за map/unmap. */ - if (pop_t_fclip_on && - (pb_x >= pop_t_fclip_x1 || pb_x + 64 <= pop_t_fclip_x0 || - pb_yb + POP_YOFF + 1 <= pop_t_fclip_ly0 || - pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1)) - return; - pb_img = (const uint8_t *)atlas_image(pb_a, pb_idx); - gfx_w0_map(pb_a->page); - /* Габарит читаем БАЙТАМИ. С `uint16_t pb_w = pb_img[0] | (pb_img[1] << 8)` SDCC - * разворачивал каждую такую строку в два десятка IX-относительных - * пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком - * уезжала в стековый кадр (пролог `ld iy,#-14 / add iy,sp / ld sp,iy`, - * дальше всё через -N(ix) по 19 тактов). Замер 2026-08-13: до вызова - * ядра блита уходило ~6 700 тактов при том, что работы там — прочитать - * четыре байта заголовка и сравнить границы. - * Байтовый габарит корректен по построению: обе ветки ниже И ТАК требуют - * pb_w < 256 && pb_h < 256 (иначе ядро не примет), а кадры наших атласов не - * крупнее 32x63. Формат .atl допускает больше — такой кадр уходит на - * общий путь выше. */ - if (pb_img[1] | pb_img[3]) { /* кадр больше 255 — редкий путь */ - blit_b_oversize(pb_img, pb_x, pb_yb); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); - return; - } - pb_w = pb_img[0]; - pb_h = pb_img[2]; - pb_top = pb_yb - (int)pb_h + 1 + POP_YOFF; /* +YOFF: центрирование */ - /* Переворот применяем ЗДЕСЬ, до клипа: дальше вся геометрия (окно - * fore-слоя, полоса у потолка, отсев по экрану) считается уже в - * экранных координатах результата. */ - if (pop_upside) pb_top = FLIP_TOP(pb_top, pb_h); - if (pb_w && pb_h) { - if (!pop_t_fclip_on && !pop_t_clip_top) { - /* БЫСТРЫЙ путь: клипа нет вовсе. Так идут все блиты фона вне - * fore-прохода. Линейное ядро без клипа — ~2.9× быстрее общего - * (замер: 4617 против 13288 тактов на спрайт 32×3; gfx_blit - * платит за клип/16-бит/split, а не за пиксели). W3-скобку - * ставит сама libbgi: из кода с --w3 её вызывать нельзя. */ - /* В перевёрнутом виде быстрый путь годится, только если спрайт - * целиком внутри поля: иначе он залезет в борт (см. blit_b_clip). */ - if (pop_upside && (pb_top < POP_YOFF || pb_top + (int)pb_h > POP_CLIP_BOTTOM)) { - blit_b_clip(pb_img, pb_x, pb_top, pb_w, pb_h); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); - return; - } - /* pb_w<256 && pb_h<256 больше не проверяем — гарантировано типом. */ - /* «Целиком на экране?» — ДВУМЯ беззнаковыми сравнениями вместо - * четырёх знаковых. Отрицательная координата в беззнаковом виде - * становится очень большой и проваливает то же условие, что - * проверка `>= 0`, а верхняя граница переносится в правую часть, - * так что сложение уходит вместе с ней. Знаковое сравнение у - * SDCC z80 стоит дорого: пара `sbc` плюс `jp PO / xor 0x80 / jp P` - * на каждое (видно в листинге). - * - * Границы правой части неотрицательны по построению: pb_w и pb_h - * не больше 255, значит 320-pb_w >= 65 и 256-pb_h >= 1. */ - if ((unsigned int)pb_x <= (unsigned int)(320 - (int)pb_w) && - (unsigned int)pb_top <= (unsigned int)(256 - (int)pb_h)) { - if (pop_upside) gfx_blit_noclip_vflip(pb_x, pb_top, pb_img); - else gfx_blit_noclip(pb_x, pb_top, pb_img); - } else { - if (pop_upside) gfx_blit_part_vflip(pb_x, pb_top, pb_img, 0, 0, (int)pb_w, (int)pb_h); - else gfx_blit_part(pb_x, pb_top, pb_img, 0, 0, (int)pb_w, (int)pb_h); - } - pop_cd_touch(pb_x, pb_top, (int)pb_w, (int)pb_h); - } else { - blit_b_clip(pb_img, pb_x, pb_top, pb_w, pb_h); - } - } - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - gfx_w0_unmap(); -} - -void pop_env_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_env[id >> POP_ENV_SHIFT], (uint8_t)(id & POP_ENV_MASK), x, yb); } -void pop_wall_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_wall_at, id, x, yb); } -void pop_fore_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_fore_at, id, x, yb); } -void pop_pot_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_pot_at, id, x, yb); } - - - -/* ---- Чтение тайла отрисованной комнаты ------------------------------ */ -uint8_t pop_tile_code(int row, int col) -{ - if (col < 0) { - if (pop_t_lfg && row >= 0 && row < 3) return pop_t_lfg[row]; - return 20; /* уровневая кромка = стена */ - } - if (row < 0) { /* верхняя полоса: ряд 2 комнаты сверху */ - if (row == -1 && pop_t_above && col < 10) return pop_t_above[col]; - return 1; /* нет комнаты сверху → пол (кромка) */ - } - if (row > 2 || col > 9) return 20; - return pop_t_fg[row * 10 + col]; -} - -uint8_t pop_tile_mod(int row, int col) -{ - if (col < 0) { - if (pop_t_lbg && row >= 0 && row < 3) return pop_t_lbg[row]; - return 0; - } - if (row == -1 && pop_t_abovemod && col < 10) return pop_t_abovemod[col]; - if (row < 0 || row > 2 || col > 9) return 0; - return pop_t_bg[row * 10 + col]; -} - -/* Порт подстановки нажатой кнопки из get_tile_to_draw (seg008:240): opener → - * floor, closer → stuck, когда таймер связи > 1. Любой слой, который - * выбирает ветку отрисовки по типу тайла, обязан смотреть на ПОДСТАВЛЕННЫЙ - * тип (иначе кнопка, на которой стоит Kid, ведёт себя как «не пол» — напр. - * climb-оверлей уходил в draw_other_overlay и закрашивал Kid целым тайлом - * вместо узкой кромки floor_left_overlay). */ -uint8_t pop_tile_code_drawn(int row, int col) -{ - uint8_t code = pop_tile_code(row, col); - if (code == 0x0F) { if ((pop_doorlink2(pop_tile_mod(row, col)) & 0x1F) > 1) code = 1; } - else if (code == 0x06) { if ((pop_doorlink2(pop_tile_mod(row, col)) & 0x1F) > 1) code = 5; } - return code; -} - -uint8_t pop_wall_modifier(int row, int col) -{ - uint8_t lw = (col > 0) ? (pop_tile_code(row, col - 1) == 20) : 1; - uint8_t rw = (col < 9) ? (pop_tile_code(row, col + 1) == 20) : 1; - if (lw && rw) return 3; /* WWW */ - if (lw) return 2; /* WWS */ - if (rw) return 1; /* SWW */ - return 0; /* SWS */ -} - - -/* Окно fore-клипа: ставит тот, кто нарисовал персонажа (pop_cdraw, банк 4), - * читает blit_b. Резидент — чтобы вызов из банка шёл без трамплина. */ -void pop_fore_set_clip(int x, int y, int w, int h) -{ - pop_t_fclip_x0 = x; pop_t_fclip_y0 = y; - pop_t_fclip_x1 = x + w; pop_t_fclip_y1 = y + h; - if (pop_upside) { /* вернуть окно в неперевёрнутый вид */ - pop_t_fclip_ly0 = 2 * POP_YOFF + POP_PLAYFIELD_H - (y + h); - pop_t_fclip_ly1 = 2 * POP_YOFF + POP_PLAYFIELD_H - y; - } else { - pop_t_fclip_ly0 = y; pop_t_fclip_ly1 = y + h; - } -} - diff --git a/applications/SprPoP/src/pop_tile.h b/applications/SprPoP/src/pop_tile.h deleted file mode 100644 index 8de2a70..0000000 --- a/applications/SprPoP/src/pop_tile.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * pop_tile.h — ОБЩИЕ ЛИСТЬЯ отрисовки фона: блит куска атласа, чтение тайла - * комнаты, таблица тайлов. Внутренний заголовок слоя фона, НЕ публичный - * API (публичный — pop_bg.h). - * - * ПОЧЕМУ ОТДЕЛЬНЫЙ РЕЗИДЕНТНЫЙ МОДУЛЬ (pop_tile.c в _CODE / W1), а не часть - * банка 2. Слой фона режется надвое: горячая половина (fore-проход поверх - * персонажей, каждый кадр) и холодная (полная отрисовка комнаты и точечные - * перерисовки тайлов, раз на комнату/событие). Обе половины зовут одни и те - * же листья — blit_b, tile_code, tile_table. Разложить их по банкам нельзя: - * - * - код в чужом банке зовётся ТОЛЬКО через трамплин (по `__banked` в - * объявлении), и пометка бьёт по ВСЕМ вызывающим, включая горячих; - * - `const`-таблицы банка лежат в его СТРАНИЦЕ (0xC000+) и видны, лишь - * пока банк замаплен — из другого банка их не прочитать вовсе; - * - дублировать листья в оба банка — лишние килобайты и два места правки. - * - * Резидент W1 замаплен ВСЕГДА, поэтому и горячая, и холодная половина зовут - * их обычным `call` без трамплина, а таблицы читают напрямую. Тот же приём, - * что у pop_heal_fast (pop_draw.c) и pop_sword_draw (pop_kid.c). - * - * ПИСУЧИЕ глобалы (атласы, указатели на комнату, окно клипа) лежат в _DATA - * (W2) и видны отовсюду независимо от банка — они здесь ради одного места - * определения, а не ради доступности. - */ -#ifndef POP_TILE_H -#define POP_TILE_H - -#include -#include -#include "pop_geom.h" /* pop_rnd_t — сид кладки комнаты */ - -/* ---- Атласы фона (прямая адресация id) ------------------------------ * - * env[id>>POP_ENV_SHIFT] idx id&POP_ENV_MASK — chtab_6 environment; - * wall — chtab_7; fore — передний слой; pot — chtab_1 (зелья, меч). - * Раскладка и число страниц — из pop_bg_atlas.h (генерит упаковщик). - * Тайлсетов ДВА (подземелье/дворец), но раскладка id у них общая: - * подменяются только файлы и 32 записи палитры (см. pop_bg_set_tileset). */ -#include "pop_bg_atlas.h" -extern atlas_t pop_env[POP_ENV_PAGES], pop_wall_at, pop_fore_at, pop_pot_at; - -/* Загруженный тайлсет: 0 подземелье, 1 дворец. Ставит pop_bg_load. По нему - * расходится с десяток веток отрисовки (seg008) и модификатор пустой клетки - * от упавшей плиты (seg007:0EB8). */ -extern uint8_t pop_palace; - -/* ---- Текущая отрисованная комната ----------------------------------- * - * fg — foretable-коды, bg — модификаторы; lfg/lbg — правый столбец ЛЕВОГО - * соседа (кромка); below — ряд 0 комнаты снизу (11 байт, см. pop_bg.h); - * above/abovemod — ряд 2 комнаты сверху (полоса кладки у потолка). */ -extern const uint8_t *pop_t_fg, *pop_t_bg, *pop_t_lfg, *pop_t_lbg; -extern const uint8_t *pop_t_below, *pop_t_above, *pop_t_abovemod; -extern uint8_t pop_t_room; /* номер комнаты — зерно раскладки стен */ -extern pop_rnd_t pop_t_seed; /* сид кладки (seg009 PRNG) */ - -/* Верхний клип блитов фона (ЭКРАННАЯ y): !=0 — строки кадра выше границы не - * рисуются. Нужен полосе кладки у потолка (ряд −1): высокие куски не должны - * лезть в верхний борт. 0 — без клипа. */ -extern int pop_t_clip_top; - -/* ОКНО FORE-СЛОЯ (экранные координаты, полуинтервал). Пока включено, - * blit_b рисует только ту часть куска, что попадает в окно. - * - * Зачем: fore-слой существует РОВНО для того, чтобы вернуть куски тайлов - * поверх нарисованного персонажа — за пределами его прямоугольника в - * видеопамяти и так лежит правильный фон. А рисовал он тайлы ЦЕЛИКОМ: - * стена (код 20) — блок 64×63 = 4032 пикселя, и таких кусков за проход до - * девяти. Замер в MAME 2026-07-29 (комната 3, Kid + страж): проход поверх - * Kid — 402 816 тактов, поверх стража — 431 964, вместе 78 % всей работы - * кадра при бюджете 430 000. С окном большинство кусков отсекается целиком, - * остальные режутся до пересечения. */ -extern int pop_t_fclip_x0, pop_t_fclip_y0, pop_t_fclip_x1, pop_t_fclip_y1; -/* Та же рамка в ЛОГИЧЕСКИХ координатах (без переворота). Всё, что решает - * «задевает ли ТАЙЛ окно», обязано сравнивать по ней: позиция тайла в - * комнате от переворота не зависит. Экранная пара — только для клипа - * блита, который режет уже перевёрнутый прямоугольник. */ -extern int pop_t_fclip_ly0, pop_t_fclip_ly1; -extern uint8_t pop_t_fclip_on; - -/* Поставить то же окно под ТОЧЕЧНУЮ ПЕРЕРИСОВКУ / ЗАПЕЧКУ. Прямоугольник — - * тот, который восстанавливаем (heal или бар-в-чёрный), в ЛОГИЧЕСКИХ - * экранных координатах (с POP_YOFF, но до переворота); экранную пару - * функция считает сама. - * - * Зачем: точечная перерисовка зовёт draw_tile, а тот честно рисует ВЕСЬ тайл. - * У полосы кладки у потолка это особенно дорого: куски ряда 0 высотой 63 px - * рисуются целиком, хотя восстановить надо девять верхних строк (замер - * 2026-08-17: блит в pop_ceil_bake_empty стоит 21 447 против 14 384 в - * pop_floor_bake — ровно разница в высоте). Окно и отсеивает куски, вовсе не - * попавшие в прямоугольник (предфильтр pop_blit_b — ДО atlas_image и - * gfx_w0_map), и режет остальные по нему. - * - * ВАЖНО: пока окно стоит, pop_blit_b НЕ ставит пометку «фон трогали» (признак - * fore-прохода) — вызывающий обязан пометить прямоугольник САМ (pop_cd_touch - * или pop_bar_black, который метит сам). */ -void pop_t_win_set(int x, int ytop, int w, int h) __banked; -void pop_t_win_clear(void) __banked; - -/* ---- Таблица тайлов (piece, seg008.c:27) ---------------------------- */ -typedef struct { - uint8_t base_id, floor_left; int8_t base_y; - uint8_t right_id, floor_right; int8_t right_y; - uint8_t stripe_id, topright_id, bottom_id, fore_id, fore_x; int8_t fore_y; -} piece; - -extern const piece pop_tile_table[31]; - -/* Таблицы, нужные ОБЕИМ половинам слоя фона (односторонние живут по месту). */ -extern const uint8_t POP_COL_XH[10]; /* x тайла = COL_XH[col]*8 */ -/* Деление координаты на ширину тайла таблицей (оригинал: tile_div_tbl / - * tile_mod_tbl, seg006:702). Индекс — координата 0..255 как есть, смещение - * -58 уже внутри: POP_TILE_DIV[x] = floor((x-58)/14), POP_TILE_MOD[x] — - * остаток. Резидент: нужны и карте (банк 3), и слою фона (банк 2). */ -extern const int8_t POP_TILE_DIV[256]; -extern const uint8_t POP_TILE_MOD[256]; -extern const uint8_t POP_WALL_FRAM_BOTTOM[4]; /* нижняя грань стены по bg */ -extern const uint8_t POP_WALL_FRAM_MAIN[4]; /* основная грань стены */ -extern const uint8_t POP_SPIKES_FRAM_LEFT[10]; /* кадр пик в своей ячейке */ -extern const uint8_t POP_LOOSE_FRAM_LEFT[12]; /* верх дрожащей плиты */ -extern const uint8_t POP_LOOSE_FRAM_BOTTOM[12]; /* низ дрожащей плиты */ -extern const uint8_t POP_CHOMP_FRAM_FOR[5]; /* чомпер: перед (pop_fore!) */ - -/* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора, - * из которой потом восстанавливает heal). В этом режиме ТРАНЗИЕНТНЫЕ кадры - * рисовать НЕЛЬЗЯ — ни свои, ни соседские: кадр законсервируется в копии, и - * heal будет возвращать его вечно, даже когда ловушка давно вернулась в - * покой (пики: BUG-SPIKE-BAKED). А так как запечка идёт двумя кадрами (по - * одному на страницу дабл-буфера), на страницах могут застыть ещё и РАЗНЫЕ - * кадры — вечное мерцание. Фон обязан быть состоянием ПОКОЯ; анимация - * каждый кадр кладётся поверх (банк SPRITE). - * - * Флаг читают ВСЕ функции «кадр по модификатору»: pop_loose_frame, - * pop_spike_frame, pop_chomp_pose. Появится новая анимированная ловушка — - * её кадр обязан спрашивать флаг ТАМ ЖЕ, а не в вызывающем слое: слоёв - * отрисовки у тайла четыре, и забыть один слишком легко. */ -extern uint8_t pop_t_bake_rest; - -/* Кадр дрожащей/падающей плиты по её room_modif (seg007 loose_fram_*). */ -uint8_t pop_loose_frame(uint8_t modif); - -/* Кадр пик по их modif (индекс в spikes_fram_*): 0 = не видно, 5 = вышли - * целиком. В режиме запечки — всегда 0 (см. pop_t_bake_rest). */ -uint8_t pop_spike_frame(uint8_t modif); - -/* Номер позы чомпера по его модификатору (seg008 chomper_fram1): 0..4 — - * индекс во ВСЕ три набора кусков (низ/верх/перед) и в кровь (+114/+119). */ -uint8_t pop_chomp_pose(uint8_t modif); - -/* ---- Блит куска атласа ---------------------------------------------- * - * НИЗ спрайта на ybottom (room-space, POP_YOFF добавляется внутри), левый - * край на x, прозрачно (0xFF). w/h читаются из getimage-заголовка ленты (в - * W0). Режется окном fore-клипа и pop_t_clip_top. */ -void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom); -/* Блит getimage-блоба из обычной памяти (W2) — без atlas_image и без - * маппинга страницы; клип полосы у потолка и окно перерисовки те же, что у - * pop_blit_b. Для композитных спрайтов, собранных в рантайме. */ -void pop_mem_b(const uint8_t *img, int x, int ybottom) __banked; - -void pop_env_b(uint8_t id, int x, int yb); -void pop_wall_b(uint8_t id, int x, int yb); -void pop_fore_b(uint8_t id, int x, int yb); -void pop_pot_b(uint8_t id, int x, int yb); - -/* heal в room-space (со сдвигом POP_YOFF) — все heal слоя фона/loose. */ -void pop_heal_off(int x, int y, int w, int h) __banked; - -/* Чёрная плита по ЭКРАННЫМ координатам, с учётом переворота (POP_FLIP_TOP). - * Пишет банком 0x50 — и в видео-ОЗУ, и в ОЗУ-копию, иначе heal вернёт - * стёртое. ВСЕ стирания слоя фона обязаны идти через неё, а не через голый - * bar: иначе при перевороте плита ложится в неотражённое место (так - * ломались решётка и плита-потолок). */ -void pop_bar_black(int x, int top, int w, int h) __banked; - -/* ---- Чтение тайла отрисованной комнаты ------------------------------ */ -uint8_t pop_tile_code(int row, int col); -uint8_t pop_tile_mod(int row, int col); -/* Тип «как он РИСУЕТСЯ» — подстановка нажатой кнопки (get_tile_to_draw, - * seg008:240): opener → floor, closer → stuck при таймере связи > 1. */ -uint8_t pop_tile_code_drawn(int row, int col); -/* seg008.c:1255: сосед — стена, если его тип == 20. 0 SWS / 1 SWW / 2 WWS - * / 3 WWW. На кромке col0 сосед по умолчанию = стена (как render_room). */ -uint8_t pop_wall_modifier(int row, int col); - -/* Склянка зелья (draw_tile_fore, chtab_1): нужна и полной отрисовке тайла, и - * fore-проходу поверх персонажа. */ -void pop_potion_flask(int row, int col, uint8_t modif) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_tile_cold.c b/applications/SprPoP/src/pop_tile_cold.c deleted file mode 100644 index f4daa3f..0000000 --- a/applications/SprPoP/src/pop_tile_cold.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * pop_tile_cold.c — ХОЛОДНАЯ половина общих листьев слоя фона (банк 5). - * - * ЗАЧЕМ РАЗРЕЗ. pop_tile.c был самым крупным жильцом резидента (5 972 Б - * кода), а резидент huge-режима — это всё окно 0x4100..0xBB00, и место в нём - * нужно под музыку, заставки и UI. Но целиком pop_tile не уедет: его - * const-таблицы (POP_TILE_DIV/MOD, pop_tile_table, таблицы кадров) читают - * банки 2, 3, 7 и 8, а таблица в чужом банке не видна. - * - * КРИТЕРИЙ ОТБОРА — ЗАМЕР, а не догадка. Каждая функция pop_tile была - * посчитана брейкпоинтом-счётчиком в MAME: сколько вызовов в кадре покоя и - * сколько в кадре ПОЛНОЙ перерисовки комнаты (её форсирует чит +/-). Сюда - * переехало только то, у чего пик <= 3 вызовов на кадр — и проверено это - * на ДВУХ тайлсетах: подземелье (уровень 1) и дворец (уровень 4), потому - * что pop_mem_b рисует композитный кусок и мог оказаться дворцовым. - * Замер: pop_mem_b 0, pop_cd_hit 0, pop_t_win_set 0..1, pop_heal_off 0..1, - * pop_room_set_above 1, pop_bar_black 3, pop_potion_flask 0..1, - * pop_cd_hit_slot 2..3 — при канарейке pop_blit_b 184..214 в том же кадре. - * - * ЦЕНА. Трамплин замерен: 252 такта пролог + 84 эпилог + ~50 на стороне - * вызывающего = ~410 тактов на вызов. На кадр покоя выходит ~1 000 тактов - * (0,2 % работы кадра), на кадр редрава ~3 700 (0,009 растра). - * - * ЧТО ОСТАЛОСЬ В РЕЗИДЕНТЕ и почему: pop_blit_b (184 вызова на редрав) со - * своими статиками blit_b_clip/blit_b_oversize, pop_cd_touch (198), - * pop_tile_code (296), pop_wall_modifier (101), pop_env_b (73), - * pop_tile_mod (70), pop_cd_batch_end (40) — и все const-таблицы. - * pop_fore_set_clip оставлен намеренно: 88 Б не стоят отказа от прямого - * вызова из банка 4, ради которого он и заводился. - * - * ВЫЗОВЫ ОТСЮДА В РЕЗИДЕНТ — прямые, без трамплина: W1/W2 замаплены всегда. - * Поэтому blit_b_clip (статик горячей половины) просто перестал быть static - * и объявлен в _pop_tile.h, а не переехал следом. - */ - -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF, POP_PLAYFIELD_H */ -#include "pop_map.h" /* pop_upside — переворот (зелье инверсии) */ -#include "pop_cdraw.h" /* pop_cd, pop_cd_dirty, pop_cd_ymin/ymax */ -#include "pop_tile.h" -#include "_pop_draw.h" /* pop_heal_fast */ -#include "_pop_tile.h" /* blit_b_clip — из горячей половины */ - -#define FLIP_TOP(top, h) POP_FLIP_TOP(top, h) /* формула — в pop_bg.h */ - -/* Смещение склянки внутри тайла (seg008 draw_tile_fore): те же числа, что в - * tile_table горячей половины — дублируем, потому что там они локальные - * define'ы, а тащить их в публичный заголовок ради одной функции незачем. */ -#define POT_FORE_X 2 -#define POT_FORE_Y (-3) - -/* Прямоугольник слота против метки — БЕЗ передачи пяти аргументов. - * - * pop_cd_hit принимает (p, x0, y0, x1, y1): три последних идут стеком, и - * функция целиком уезжает в IX-фрейм — 45 % её тактов уходит на `-n(ix)` - * (замер asm 2026-08-19). А зовут её из cd_quiet дважды на слот, то есть - * до восьми раз за кадр. Здесь координаты берутся прямо из pop_cd, и - * аргументов остаётся два. - * - * Спрайт и накладной проверяются РАЗДЕЛЬНО — объединённый bbox ловит - * касания углом, которых нет (разбор в cd_quiet, pop_cdraw.c). */ -static int hit_x, hit_y; /* аргументы hit_rect — file-scope, не стек */ -static uint16_t hit_w, hit_h; -static uint8_t hit_p; - -static uint8_t hit_rect(void) -{ - int8_t c0, c1, c; - uint8_t ya, yb; - int x1 = hit_x + (int)hit_w - 1; - int y1 = hit_y + (int)hit_h - 1; - if (!hit_w || !hit_h) return 0; - if (x1 < 0 || hit_x > 319) return 0; - if (y1 < 0 || hit_y > 255) return 0; - ya = (uint8_t)(hit_y < 0 ? 0 : hit_y); - yb = (uint8_t)(y1 > 255 ? 255 : y1); - c0 = (int8_t)((hit_x < 0 ? 0 : hit_x) >> 5); - c1 = (int8_t)((x1 > 319 ? 319 : x1) >> 5); - for (c = c0; c <= c1; c++) - if (ya <= pop_cd_ymax[hit_p][c] && yb >= pop_cd_ymin[hit_p][c]) return 1; - return 0; -} - -uint8_t pop_cd_hit_slot(uint8_t who, uint8_t p) __banked -{ - const pop_cdraw_t *s = &pop_cd[who]; - if (!(pop_cd_dirty & (1 << p))) return 0; - hit_p = p; - hit_x = s->x[p]; hit_y = s->y[p] + POP_YOFF; - hit_w = s->w[p]; hit_h = s->h[p]; - if (hit_rect()) return 1; - if (!s->ovalid[p]) return 0; - hit_x = s->ox[p]; hit_y = s->oy[p] + POP_YOFF; - hit_w = s->ow[p]; hit_h = s->oh[p]; - return hit_rect(); -} - -uint8_t pop_cd_hit(uint8_t p, int x0, int y0, int x1, int y1) __banked -{ - int8_t c0, c1, c; - uint8_t ya, yb; - if (!(pop_cd_dirty & (1 << p))) return 0; - if (x1 < 0 || x0 > 319) return 0; - if (x0 < 0) x0 = 0; - if (x1 > 319) x1 = 319; - if (y1 < 0 || y0 > 255) return 0; - ya = (uint8_t)(y0 < 0 ? 0 : y0); - yb = (uint8_t)(y1 > 255 ? 255 : y1); - c0 = (int8_t)(x0 >> 5); - c1 = (int8_t)(x1 >> 5); - /* Пересечение отрезков [ya,yb] и [ymin,ymax] хотя бы в одной колонке. - * Пустая колонка держит ymin = 255, ymax = 0 — условие ниже её отсеет - * само, отдельной проверки «пусто» не нужно. */ - for (c = c0; c <= c1; c++) - if (ya <= pop_cd_ymax[p][c] && yb >= pop_cd_ymin[p][c]) return 1; - return 0; -} - -/* Страница приведена в порядок — снять с неё метку целиком. */ -/* Начальное состояние обеих страниц — «ничего не трогали». ЯВНО, а не - * расчётом на обнуление _DATA: пустая колонка обозначается ymin = 255, - * ymax = 0, а нули от crt0 читались бы как «затронута строка 0». */ -void pop_cd_init(void) __banked -{ - pop_cd_clear(0); - pop_cd_clear(1); -} - -void pop_cd_clear(uint8_t p) __banked -{ - uint8_t c; - for (c = 0; c < 10; c++) { pop_cd_ymin[p][c] = 255; pop_cd_ymax[p][c] = 0; } - pop_cd_dirty = (uint8_t)(pop_cd_dirty & ~(1 << p)); -} - -/* Окно под точечную перерисовку/запечку — контракт в шапке pop_tile.h. - * Логическая пара нужна для отсева тайлов (он считается из ряда комнаты), - * экранная — для клипа самого блита; при перевороте они разные. */ -void pop_t_win_set(int x, int ytop, int w, int h) __banked -{ - pop_t_fclip_x0 = x; - pop_t_fclip_x1 = x + w; - pop_t_fclip_ly0 = ytop; - pop_t_fclip_ly1 = ytop + h; - if (pop_upside) { - int t = FLIP_TOP(ytop, h); - pop_t_fclip_y0 = t; - pop_t_fclip_y1 = t + h; - } else { - pop_t_fclip_y0 = ytop; - pop_t_fclip_y1 = ytop + h; - } - pop_t_fclip_on = 1; -} - -void pop_t_win_clear(void) __banked -{ pop_t_fclip_on = 0; } - -/* Блит getimage-блоба из ОБЫЧНОЙ памяти (W2), а не из EMM-страницы атласа: - * те же клип полосы у потолка и окно перерисовки, что у pop_blit_b, но без - * atlas_image и без gfx_w0_map/unmap (это ещё ~1 350 такта). Заведено под - * композитный спрайт падающего куска (pop_room.c: три части сложены в один - * блоб, один вызов блита вместо трёх). */ -void pop_mem_b(const uint8_t *img, int x, int ybottom) __banked -{ - uint8_t w = img[0], h = img[2]; - int top; - if (pop_t_fclip_on && - (x >= pop_t_fclip_x1 || x + 64 <= pop_t_fclip_x0 || - ybottom + POP_YOFF + 1 <= pop_t_fclip_ly0 || - ybottom + POP_YOFF - 64 >= pop_t_fclip_ly1)) - return; - if (!w || !h) return; - top = ybottom - (int)h + 1 + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - if (!pop_t_fclip_on && !pop_t_clip_top && - !(pop_upside && (top < POP_YOFF || top + (int)h > POP_CLIP_BOTTOM)) && - x >= 0 && top >= 0 && x + (int)w <= 320 && top + (int)h <= 256) { - if (pop_upside) gfx_blit_noclip_vflip(x, top, img); - else gfx_blit_noclip(x, top, img); - pop_cd_touch(x, top, (int)w, (int)h); - } else { - blit_b_clip(img, x, top, w, h); - } -} - -/* Heal по КОМНАТНОЙ координате (её и знают точечные перерисовки: чомпер, - * пики, loose, ворота, полоса потолка). При перевороте прямоугольник - * обязан отразиться ровно так же, как сам тайл, — иначе heal чистит одно - * место, а рисует в другое: именно так «ломалась анимация чомперов» - * (найдено пользователем на первом же прогоне зеркального фона). */ -void pop_bar_black(int x, int top, int w, int h) __banked -{ - if (pop_upside) top = FLIP_TOP(top, h); - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - bar(x, top, x + w - 1, top + h - 1); - pop_cd_touch(x, top, w, h); /* bar идёт мимо pop_blit_b (DRAW-COST) */ -} - -void pop_heal_off(int x, int y, int w, int h) __banked -{ - int top = y + POP_YOFF; - if (pop_upside) top = FLIP_TOP(top, h); - pop_heal_fast(x, top, w, h); -} - -/* ---- Зелье: склянка (tiles_10_potion, seg008 draw_tile_fore) --------- * - * Тип = (modif & 0xF8) >> 3: 0 = пусто (ничего не рисуем), 2..4 — «большая» - * склянка (id 13), остальные — маленькая (id 12). Спрайты из chtab_1 (атлас - * pop_pot), поэтому НЕ из env: раньше рисовали chtab_6 id 12 (res212), - * которого в VDUNGEON нет — оттуда и «мусорный объект». Позиция оригинала: - * xh = fore_x + draw_xh, xl = 6, ybottom = fore_y + draw_main_y. - * - * Здесь, а не в банке: склянку рисует и полная отрисовка тайла (холодная - * половина), и fore-проход поверх персонажа (горячая). */ -void pop_potion_flask(int row, int col, uint8_t modif) __banked -{ - uint8_t type = (uint8_t)((modif & 0xF8) >> 3); - uint8_t id = 12; - if (type == 0) return; - if (type >= 2 && type < 5) id = 13; /* большая склянка */ - if (pop_palace) id += 2; /* seg008:747: во дворце склянки другие */ - pop_pot_b(id, (POT_FORE_X + POP_COL_XH[col]) * 8 + 6, - POT_FORE_Y + 63 * row + 62); -} - -/* Ряд 0 комнаты СНИЗУ (fg-коды) — нужен draw_tile_topright/floorright, когда - * тайл нижнего ряда стал видимым (empty после падения loose): «стена вниз» = - * топрайт тайла room_B(0, col-1). 0 — нет комнаты снизу (кромка = стена). */ -void pop_room_set_below(const uint8_t *below_row0_fg) __banked -{ pop_t_below = below_row0_fg; } - -/* Ряд 2 (fg-коды + модификаторы) комнаты СВЕРХУ — для полосы кладки у - * потолка (seg008 draw_room: доп. верхний ряд из room_A, draw_tile_aboveroom - * при draw_main_y=-1). 0 — нет комнаты сверху (кромка уровня → пол). */ -void pop_room_set_above(const uint8_t *above_row2_fg, const uint8_t *above_row2_mod) __banked -{ pop_t_above = above_row2_fg; pop_t_abovemod = above_row2_mod; } diff --git a/applications/SprPoP/src/pop_timer.c b/applications/SprPoP/src/pop_timer.c deleted file mode 100644 index 1890fea..0000000 --- a/applications/SprPoP/src/pop_timer.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * pop_timer.c — единый владелец глобального таймера (FG4, банк 9). - * - * SDLPoP хранит rem_min/rem_tick и уменьшает rem_tick на каждом логическом - * игровом кадре. Здесь та же схема: после нуля tick возвращается к 719, - * поэтому 720 тиков образуют минуту. Настройки, экранные сообщения и - * переход TIME_EXPIRED остаются снаружи: это делает ядро таймера чистым и - * не привязывает его к ещё не реализованным title/cutscene режимам. - */ -#include -#include "pop_timer.h" - -uint8_t pop_timer_minutes; -uint16_t pop_timer_ticks; -uint8_t pop_show_time; - -/* Накопленные кадры луча, ещё не сложившиеся в тик. Живёт между кадрами: - * при FAST логический кадр короче эталона, и остаток переносится вперёд. */ -static uint8_t tick_acc; - -void pop_timer_new_game(void) __banked -{ - pop_timer_minutes = POP_TIMER_START_MINUTES; - pop_timer_ticks = POP_TIMER_START_TICKS; - pop_show_time = 0; - tick_acc = 0; -} - -uint8_t pop_timer_tick(uint8_t enabled, uint8_t may_run, - uint8_t spent, uint8_t base) __banked -{ - if (!enabled || !may_run || pop_timer_minutes == 0) return 0; - /* ХОД ЧАСОВ ОТВЯЗАН ОТ ТЕМПА. Тик стоит `base` кадров луча — столько, - * сколько их в кадре режима NORMAL. При NORMAL spent == base, и тик - * приходится ровно на кадр, как было всегда; в быстрых режимах кадр - * короче, остаток копится, и за то же РЕАЛЬНОЕ время выходит столько - * же тиков. Цикла не нужно: spent никогда не больше base (быстрые - * режимы кадр только УКОРАЧИВАЮТ) — значит не больше тика за вызов. */ - /* Пауза, меню и загрузка сюда не заходят вовсе, поэтому за время их - * работы кадры луча накапливаются мимо нас. Ограничиваем вклад одного - * вызова: иначе после меню часы прыгнули бы вперёд на всю паузу. */ - if (spent > (uint8_t)(base + base)) spent = base; - tick_acc = (uint8_t)(tick_acc + spent); - if (tick_acc < base) return 0; - tick_acc = (uint8_t)(tick_acc - base); - - --pop_timer_ticks; - if (pop_timer_ticks != 0) { - /* Последняя минута: оригинал напоминает о времени КАЖДУЮ секунду - * (rem_tick % 12 == 0) и специально гасит текущую строку, чтобы - * новая встала немедленно, не дожидаясь её 24 тиков. */ - if (pop_timer_minutes == 1 && pop_timer_ticks % 12 == 0) - pop_show_time = 2; /* 2 = «показать, перебив текущую» */ - return 0; - } - - pop_timer_ticks = POP_TIMER_START_TICKS; - --pop_timer_minutes; - /* Круглые пятёрки и весь финальный отсчёт: seg008:1795. */ - if (pop_timer_minutes != 0 && - (pop_timer_minutes <= 5 || pop_timer_minutes % 5 == 0)) - pop_show_time = 1; - return (uint8_t)(pop_timer_minutes == 0); -} - -void pop_timer_cheat_subtract(void) __banked -{ - /* Это буквально правило SDLK_KP_MINUS: последнюю минуту читом не - * отнимаем, иначе не получится отличить чит от настоящего expiry. */ - if (pop_timer_minutes > 1) --pop_timer_minutes; - pop_show_time = 2; /* оригинал показывает результат сразу */ -} - -void pop_timer_cheat_add(void) __banked -{ - /* SDLPoP хранит signed short, у нас достаточно byte: 255 минут — - * практический максимум и насыщение не даёт тихо свернуться в нуль. */ - if (pop_timer_minutes != 0xFF) ++pop_timer_minutes; - pop_show_time = 2; -} - -void pop_timer_qsave(pop_qs_io_t *io) __banked -{ - uint8_t minutes = pop_timer_minutes; - uint16_t ticks = pop_timer_ticks; - - pop_qs_u8(io, &minutes); - pop_qs_u16(io, &ticks); - if (io->reading && io->apply) { - if (ticks == 0 || ticks > POP_TIMER_START_TICKS) { - io->failed = 1; - return; - } - pop_timer_minutes = minutes; - pop_timer_ticks = ticks; - } -} diff --git a/applications/SprPoP/src/pop_timer.h b/applications/SprPoP/src/pop_timer.h deleted file mode 100644 index 72ce854..0000000 --- a/applications/SprPoP/src/pop_timer.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * pop_timer.h — глобальный игровой таймер (FG4, банк 9). - * - * Время измеряется логическими кадрами SDLPoP: 720 тиков = одна минута. - * Модуль намеренно не знает ни о клавиатуре, ни о графике, ни о состоянии - * Settings: вызывающий передаёт, разрешён ли лимит и можно ли времени идти. - * Благодаря этому тот же код проверяется host-тестом без DSS/MAME. - */ -#ifndef POP_TIMER_H -#define POP_TIMER_H - -#include -#include "pop_qsave.h" - -#define POP_TIMER_START_MINUTES 60 -#define POP_TIMER_TICKS_PER_MINUTE 720 -#define POP_TIMER_START_TICKS (POP_TIMER_TICKS_PER_MINUTE - 1) - -/* Оставшееся время. ticks всегда 1..719 вне короткого участка timer_tick. - * Нуль minutes означает естественное истечение; выключенный в Settings - * лимит состояние не меняет, а просто останавливает отсчёт. */ -extern uint8_t pop_timer_minutes; -extern uint16_t pop_timer_ticks; - -/* «Пора показать оставшееся время» — порт is_show_time (seg008). Взводит - * и сам таймер на круглых минутах, и внешние события: старт уровня, клавиша - * Space, читы +/-, смерть Джафара. Гасит его тот, кто напечатал строку - * (pop_status.c) — ядро таймера про экран по-прежнему ничего не знает. */ -extern uint8_t pop_show_time; - -/* Начать новую игру: ровно исходные 60:00 SDLPoP (60 минут, tick 719). */ -void pop_timer_new_game(void) __banked; - -/* Один логический игровой кадр. enabled — переключатель Settings, - * may_run — правила текущей сцены/уровня. Возвращает 1 ОДИН раз, когда - * отсчёт дошёл до нуля; на паузе, HDD/QuickSave и при выключенном лимите - * вызывать можно — состояние останется неизменным. */ -/* spent — сколько кадров ЛУЧА стоил этот логический кадр (pop_pace_n), - * base — сколько их было бы при NORMAL (POP_PACE_BASE). Тик отсчитывается - * по base, поэтому режим скорости на ход часов не влияет. */ -uint8_t pop_timer_tick(uint8_t enabled, uint8_t may_run, - uint8_t spent, uint8_t base) __banked; - -/* Читы, повторяющие +/- SDLPoP: минус не даёт искусственно поставить 0, - * плюс добавляет минуту. Они меняют счётчик и при выключенном лимите — - * после включения пользователь продолжит именно это подготовленное время. */ -void pop_timer_cheat_subtract(void) __banked; -void pop_timer_cheat_add(void) __banked; - -/* Состояние входит в payload QuickSave. Неверный tick помечает поток - * ошибочным, не подменяя живой таймер частично. */ -void pop_timer_qsave(pop_qs_io_t *io) __banked; - -#endif /* POP_TIMER_H */ diff --git a/applications/SprPoP/src/pop_title.c b/applications/SprPoP/src/pop_title.c deleted file mode 100644 index 7b1664c..0000000 --- a/applications/SprPoP/src/pop_title.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * pop_title.c — оригинальная графическая часть show_title(), банк 9 (FG6). - * - * Готовые композиции создаёт toolchain/pop_pack_title.py непосредственно из - * TITLE/res51..55.png SDLPoP. Каждый 320x200 экран режется на пять лент: - * загружаем одну в EMM, блитим непрозрачно в normal bank, освобождаем. Это - * сознательно не держит title-ресурсы рядом с игровыми атласами. - */ -#include -#include -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF: title занимает 200px по центру 256px */ -#include "pop_sfx.h" -#include "pop_music.h" -#include "pop_arc.h" -#include "title_arc.h" -#include "pop_cutscene.h" /* POP_T60 */ -#include "pop_settings.h" -#include "pop_pal.h" -#include "pop_title.h" -#include "pop_ui.h" -#include "sprpop_cold.h" /* pop_boot_sound/pop_boot_rest — фазы старта */ - -#define TITLE_W 320 -#define TITLE_H 200 -#define TITLE_Y POP_YOFF -#define TITLE_PARTS 5 -#define TITLE_FADE POP_FADE_FRAMES /* 2,13 с, как fade_*_1 оригинала */ - -enum { - TITLE_MAIN = 0, - TITLE_PRESENTS, - TITLE_GAME, - TITLE_LOGO -}; - -/* Композиции лежат в одном архиве подряд по пять полос 49/49/49/49/4, - * поэтому имён здесь больше нет: индекс = сцена * TITLE_PARTS. */ -#if (ARC_TITLE_T1_0 - ARC_TITLE_T0_0) != TITLE_PARTS -#error "полосы титров в архиве лежат не по пять подряд" -#endif - -/* Последовательность и интервалы буквально из show_title(): - * main --0x82--> presents --0xCD--> main --0x41--> game - * --0x10E--> main --0xEB--> logo+Mechner. - * Счёт — в тиках SDLPoP (60 Гц), в кадры луча переводит POP_T60: под - * заставку играет тема, и разбегание на 20 % было бы слышно. - * - * Последний интервал у оригинала не фиксирован: показав логотип, он ждёт - * ОКОНЧАНИЯ ТЕМЫ (`while (check_sound_playing())`, seg000:2027) и лишь - * потом уходит в историю. 0xEB здесь — нижняя граница на случай, когда - * музыки нет (нет файла, выключен звук). */ -static const uint8_t title_scene[] = { - TITLE_MAIN, TITLE_PRESENTS, TITLE_MAIN, TITLE_GAME, TITLE_MAIN, TITLE_LOGO -}; -static const uint16_t title_wait_ticks[] = { - POP_T60(0x82), POP_T60(0xCD), POP_T60(0x41), - POP_T60(0x10E), POP_T60(0xEB), POP_T60(0xEB) -}; - -static uint8_t title_shown; - -static uint8_t title_skip_pressed(void) -{ - /* Как и в attract-demo, любой удерживаемый raw-код означает «не ждать». - * Это заодно не дублирует список клавиш у title, intro и cutscene. */ - return kbd_raw_any_down(); -} - -/* Нарисовать одну из готовых 320x200 композиций в скрытую страницу. - * Сопоставление W0 охватывает ТОЛЬКО atlas_image/blit: BIOS/vsync сюда - * не попадает, значит не конфликтует с EMM и CBL. Возвращает номер - * подготовленной страницы; show=0 оставляет её скрытой для palette commit. */ -static int title_draw(uint8_t scene, uint8_t show) -{ - uint8_t tbl[ARC_TITLE_COUNT * POP_ARC_REC]; - pop_arc_t arc; - uint8_t page = pop_screen_begin(); - int res; - - pop_screen_fill(BLACK); - if (pop_arc_open_id(&arc, POP_ARC_TITLE, tbl, ARC_TITLE_COUNT) < 0) - return -1; - res = pop_screen_blit_atlas_arc(&arc, tbl, - (uint8_t)(ARC_TITLE_T0_0 + - scene * TITLE_PARTS), - TITLE_PARTS, 0, TITLE_Y); - pop_arc_close(&arc); - if (res != 0) return -1; - if (show) pop_screen_present(page); - return page; -} - -/* draw_full_image(TITLE_MAIN) + transition_ltr() финала (seg001:590 и - * :629): титульный рисунок проявляется полосами поверх текущего экрана. - * Палитру не трогаем — story.pal и title.pal это одни и те же цвета - * (обе сделаны из res51). -1 — архив не прочитан. */ -int pop_title_main_ltr(void) __banked -{ - if (title_draw(TITLE_MAIN, 0) < 0) return -1; - return pop_screen_present_ltr() ? 1 : 0; -} - -/* Тот же приём для композиции с логотипом и подписью Jordan Mechner: её - * show_title() показывает МЕЖДУ «свадьбой» и титрами (seg000:2045). */ -int pop_title_logo_ltr(void) __banked -{ - if (title_draw(TITLE_LOGO, 0) < 0) return -1; - return pop_screen_present_ltr() ? 1 : 0; -} - -/* Ждать ticks кадров луча, доливая трек. Тема заставки играет с ПЕРВОЙ - * страницы (pop_music_stream), остальные обязаны приезжать по ходу — шаг - * стоит 16 мс и укладывается в кадровый интервал. */ -static uint8_t title_wait(uint16_t ticks) -{ - while (ticks--) { - if (title_skip_pressed()) return 1; - if (pop_music_loading()) (void)pop_music_load_step(); - gfx_wait_vsync(); - } - return 0; -} - -/* Новый источник не становится видимым сам: cold boot уже чёрный, а - * последующий fade_in выбирает яркость только после сборки t0. */ -static void title_load_palette_dimmed(void) -{ - pop_pal_title_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); -} - -uint8_t pop_title_show(void) __banked -{ - uint8_t step; - uint8_t skipped = 0; - uint16_t first_wait = 0; /* такт 0 за вычетом времени загрузки */ - int prepared; - uint8_t cold_start = (uint8_t)(!title_shown && - !pop_settings.show_build_info); - - /* Игровые SFX не должны тянуться сюда из прерванной партии: заставка - * начинается с тишины, а через несколько строк её займёт тема титров. */ - pop_sfx_pause(); - /* Только мгновенность перехода: сам титул ещё не показан, - * и прерывать тут нечего. */ - if (!cold_start) (void)pop_pal_fade_out_skip(TITLE_FADE); - - /* Видимая VRAM могла сохраниться от предыдущей программы. Обнулить её - * при чёрной палитре, затем собрать t0 СКРЫТО: загрузка title.pal тогда - * освещает только индекс 0, а не старый экран или недорисованный title. */ - gfx_set_draw_page(gfx_get_visible_page()); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill(BLACK); - prepared = title_draw(TITLE_MAIN, 0); - if (prepared < 0) return 0; - title_load_palette_dimmed(); - pop_screen_present((uint8_t)prepared); - title_shown = 1; - - /* ЗДЕСЬ ЖЕ ДОГРУЖАЕТСЯ ВСЯ ИГРА — и это не случайное место. - * - * До 2026-09-02 pop_boot читал ВСЕ ресурсы перед первым пикселем: от - * запуска до проявления титула проходило несколько секунд чёрного - * экрана в тишине, потому что перед fade_in ещё и вычитывался целиком - * трек заставки (248 КБ). Теперь порядок обратный и совпадает с - * оригиналом (init_game_main грузит до заставки только мелочь, - * seg000.c:156): - * 1) картинка титула и fade_in — первое, что происходит; - * 2) звук: индекс + ОДНА страница набора, CBL (pop_boot_sound); - * 3) тема — с первой же страницы (pop_music_stream), не дожидаясь - * всех шестнадцати; - * 4) остальные ресурсы — под стоящим титулом и звучащей темой. - * - * Порядок «fade_in, потом тема» сохранён как у show_title (fade_in_2, - * затем play_sound(sound_54)). */ - for (step = 0; step < sizeof(title_scene); step++) { - if (step && title_draw(title_scene[step], 1) < 0) - break; - if (step == 0) { - uint8_t t0; - - if (pop_pal_fade_in_skip(TITLE_FADE)) { skipped = 1; break; } - (void)pop_boot_sound(); - (void)pop_music_stream(POP_MUS_INTRO); - /* ЧЕМ ЗАПЛАЧЕН ПЕРВЫЙ ТАКТ. Загрузка занимает около секунды, и - * без поправки титул простоял бы на первом кадре дольше - * оригинала, а сцена уехала бы относительно темы. Считаем - * потраченное часами насоса (85,4 Гц, идут от расхода буфера - * CBL — единственные, кому не мешает диск) и переводим в кадры - * луча сдвигами: 48,83/85,4 = 0,572 ~ 1/2 + 1/16. Без звука - * часы стоят, поправка выходит нулевой — и правильно, тогда и - * синхронизировать не с чем. */ - t0 = pop_snd_tick; - (void)pop_boot_rest(); - { - uint16_t spent = (uint8_t)(pop_snd_tick - t0); - - spent = (uint16_t)((spent >> 1) + (spent >> 4)); - first_wait = (spent >= title_wait_ticks[0]) - ? 0 : (uint16_t)(title_wait_ticks[0] - spent); - } - } - if (title_wait(step ? title_wait_ticks[step] : first_wait)) { - skipped = 1; - break; - } - /* Логотип держим до конца темы — так оригинал стыкует заставку с - * историей: музыка не обрывается, а сменяется следующей репликой. */ - if (step + 1 == sizeof(title_scene)) { - while (pop_music_busy()) { - if (title_skip_pressed()) { skipped = 1; break; } - gfx_wait_vsync(); - } - } - } - /* Уходим В ИГРУ — заставочная музыка не должна тянуться в уровень. - * Дальше по сценарию (intro) трек, наоборот, ОСТАЁТСЯ звучать: там - * следующая реплика подгружается во второй слот, пока играет эта. */ - if (skipped) { - pop_music_free(); - pop_sfx_pause(); - } - return skipped; -} diff --git a/applications/SprPoP/src/pop_title.h b/applications/SprPoP/src/pop_title.h deleted file mode 100644 index 0f15dd9..0000000 --- a/applications/SprPoP/src/pop_title.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * pop_title.h — первая часть оригинальной title sequence, банк 9 (FG6). - * - * Экран живёт отдельно от игрового кадра: он загружает одну ленту TITLE - * за раз, рисует готовую страницу и не оставляет EMM-страниц после выхода. - */ -#ifndef POP_TITLE_H -#define POP_TITLE_H - -#include - -/* Показать TITLE_MAIN/PRESENTS/GAME/POP+MECHNER в порядке show_title(). - * Возврат 1 — пользователь прервал ожидание и надо начать FIRST_LEVEL - * напрямую; 0 — последовательность завершилась штатно, продолжать intro. */ -uint8_t pop_title_show(void) __banked; - -/* Одна титульная картинка (TITLE_MAIN) полосами слева направо — так финал - * возвращается к ней после HAIL и после ввода имени в таблицу рекордов. - * Палитру не меняет: story.pal и title.pal сделаны из одного res51. - * -1 — архив титров не прочитан. */ -int pop_title_main_ltr(void) __banked; - -/* Композиция с логотипом PRINCE OF PERSIA и Jordan Mechner тем же - * переходом — шаг show_title() между «свадьбой» и титрами. */ -int pop_title_logo_ltr(void) __banked; - -#endif /* POP_TITLE_H */ diff --git a/applications/SprPoP/src/pop_trob.c b/applications/SprPoP/src/pop_trob.c deleted file mode 100644 index 948a2d2..0000000 --- a/applications/SprPoP/src/pop_trob.c +++ /dev/null @@ -1,929 +0,0 @@ -/* - * pop_trob.c — P0-каркас: room_modif + список trob + диспетчер анимаций. - * Порт SDLPoP seg007 (process_trobs/animate_tile/add_trob/animate_spike). - * См. pop_trob.h. - */ -#include "pop_trob.h" -#include "pop_sfx.h" /* звуковые эффекты (../docs/sound_plan.md) */ -#include "pop_state.h" /* pop_leveldoor_open */ -#include "pop_level.h" -#include "pop_geom.h" -#include "pop_redraw.h" /* пометки перерисовки тайлов (вместо прямых вызовов) */ -/* pop_bg нужен ТОЛЬКО для пламени факела и пузырька зелья: это не тайловая - * перерисовка, а покадровый оверлей поверх фона (в оригинале — свои - * add_backtable/add_foretable внутри draw_tile). Всё остальное идёт через - * пометки, поэтому pop_process_trobs — единственная функция модуля, которую - * нельзя звать из __banked-кода. */ -#include "pop_bg.h" -#include "pop_tile.h" /* pop_palace — тип уровня как модификатор дыры */ -#include "pop_guard.h" /* is_guard_notice — нажатая кнопка слышна стражу */ -#include "pop_kid.h" /* Kid.curr_row/alive — условие остановки чомпера */ -#include "pop_tune.h" /* POP_DBG_GATE_HOLD — отладочное растягивание окна */ - -/* Коды тайлов (fg & 0x1F), которые анимируются. */ -#define TILE_SPIKE 0x02 -#define TILE_GATE 0x04 -#define TILE_CLOSER 0x06 -#define TILE_DEBRIS 0x0E /* button_type для «насовсем открыть» (died_on_button) */ -#define TILE_OPENER 0x0F -#define TILE_POTION 0x0A -#define TILE_LOOSE 0x0B /* проваливающийся пол (фаза тряски в modif) */ -#define TILE_SWORD 0x16 /* меч-предмет на полу */ -#define TILE_LEVELDOOR 0x10 /* левая половина двери уровня (на ней modif) */ -#define TILE_CHOMP 0x12 /* чомпер (челюсти) */ -#define TILE_WALL 0x14 /* стена (в модификаторе — флаг «без полоски») */ -#define TILE_TORCH 0x13 -#define TILE_TORCH_DEBRIS 0x1E -#define TILE_EMPTY 0x00 /* remove_loose: на месте провалившейся плиты */ - -/* ---- Персистентное per-room modifier-состояние -------------------- */ -static uint8_t room_modif[POP_NROOMS][POP_ROOMTILES]; -static uint8_t room_seen[POP_NROOMS]; /* modif проинициализирован из уровня */ - -/* ---- Список анимируемых тайлов ------------------------------------ */ -typedef struct { uint8_t room, tilepos; int8_t type; } trob_t; -#define TROBS_MAX 30 /* как в оригинале (types.h) */ -static trob_t trobs[TROBS_MAX]; -static uint8_t trobs_count; -static uint8_t trob_code[TROBS_MAX]; /* префетч кодов тайлов на кадр (1 map W0) */ -/* Код ПРАВОГО соседа — заполняется только у факелов (0 у остальных). Нужен - * потому, что пламя рисуется в ячейке соседа и запекается в фон: если у - * соседа своя anim-графика, её надо вернуть ПОВЕРХ огня. Читается в том же - * префетче, чтобы не свапать W0 второй раз за кадр. */ -static uint8_t trob_rcode[TROBS_MAX]; - -/* Последняя НАРИСОВАННАЯ draw-сигнатура тайла (spike: modifier; button: - * признак «нажата» = таймер связи >1). Редрой пики/кнопки — ТОЛЬКО при её - * изменении (порт redraw_11h-on-change из SDLPoP). Без этого кнопка под - * стоящим Кидом перерисовывалась КАЖДЫЙ кадр (2×draw_tile ≈ 50% кадра в - * статике), т.к. её trob висит, пока Кид стоит (это верно, как в SDLPoP — - * расхождение было именно в безусловном редрое). */ -static uint8_t trob_drawn[POP_ROOMTILES]; - -/* prandom (seg009.c:321, 32-бит LCG) — нужен для стартовой фазы факела и - * выбора следующего кадра пламени. */ -static pop_rnd_t trob_seed; - -#define trob_prandom(maxv) pop_prandom(&trob_seed, (maxv)) - - -void pop_trob_reset(void) __banked -{ - uint8_t i; - for (i = 0; i < POP_NROOMS; i++) room_seen[i] = 0; - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); - trobs_count = 0; -} - -uint8_t *pop_trob_modif(uint8_t room) __banked -{ - if (room < 1 || room > POP_NROOMS) return 0; - if (!room_seen[room - 1]) { - uint8_t i; - pop_level_room_bg(room, room_modif[room - 1]); - /* load_alter_mod (seg008:198E): модификатор В ФАЙЛЕ уровня и - * модификатор В РАНТАЙМЕ — разные величины, оригинал переводит их - * при загрузке. Порт того, что нас касается: - * - * ворота 1 = «открыты» (Table 8 спецификации DAT) -> 188, то есть - * рабочая высота подъёма; ЛЮБОЕ другое значение -> 0 - * (закрыты). Без этого перевода ворота, которые в - * уровне открыты, стартуют закрытыми, и кнопка-closer - * рядом с ними теряет смысл (ур. 2, комн. 13). - * loose -> 0: фаза тряски всегда начинается с нуля. - * зелье -> <<3: старшие биты = тип, младшие 3 = фаза пузырька. - * стена -> <<7: единственный бит уровня («без полоски», см. ниже) - * переезжает в СТАРШИЙ, где его и ищет отрисовка. - * - * СВЯЗИ кладки (какая грань у стены слева/справа) из этого перевода - * намеренно выкинуты: у нас их считает pop_wall_modifier по типам - * СОСЕДЕЙ прямо при отрисовке. Но второй смысл модификатора стены — - * авторский флаг «не рисовать синюю полоску на моей правой кромке» - * (noblue) — из соседей не выводится, он проставлен вручную в данных - * уровня. Без перевода отрисовка видела сырую единицу вместо 0x80, - * проверка `(mod & 0x80) == 0` проходила, и во дворце вылезал кусок - * узора на стене (BUG BLUELINE-NOBLUE, ур. 6 к. 1 тайл (2,3)). */ - pop_level_access_begin(); - for (i = 0; i < POP_ROOMTILES; i++) { - uint8_t *m = &room_modif[room - 1][i]; - switch (pop_level_tile_raw(room, i) & 0x1F) { - case TILE_GATE: *m = (uint8_t)((*m == 1) ? 188 : 0); break; - case TILE_LOOSE: *m = 0; break; - case TILE_POTION: *m = (uint8_t)(*m << 3); break; - case TILE_WALL: *m = (uint8_t)(*m << 7); break; - default: break; - } - } - pop_level_access_end(); - room_seen[room - 1] = 1; - } - return room_modif[room - 1]; -} - -static int find_trob(uint8_t room, uint8_t tilepos) -{ - uint8_t i; - for (i = 0; i < trobs_count; i++) - if (trobs[i].room == room && trobs[i].tilepos == tilepos) return i; - return -1; -} - -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked -{ - int f = find_trob(room, tilepos); - if (f >= 0) { trobs[f].type = type; return; } - if (trobs_count >= TROBS_MAX) return; - trobs[trobs_count].room = room; - trobs[trobs_count].tilepos = tilepos; - trobs[trobs_count].type = type; - trobs_count++; -} - -void pop_trob_room_changed(void) __banked -{ - uint8_t i; - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); -} - -/* anim_tile_modif (seg000:0B12) — при входе в комнату завести анимации её - * тайлов: факелам — случайная стартовая фаза пламени (start_anim_torch, - * seg007:0847: modif = prandom(8)), зельям — случайная фаза пузырька - * (start_anim_potion: младшие 3 бита = prandom(6)+1, старшие = тип). */ -void pop_trob_anim_room(uint8_t room) __banked -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t i, code; - if (!mod) return; - pop_level_access_begin(); - /* Освободить список от «декоративных» trob ДРУГИХ комнат: факел, зелье и - * блеск меча анимируются только в ОТРИСОВАННОЙ комнате, а место в списке - * занимают. Оригинал их копит и на 30-й выдаёт «Trobs Overflow»; у нас - * отладочный обход всех 24 комнат упирается в лимит за пару минут, после - * чего новые анимации молча не заводятся. Механику (ворота/пики/кнопки, - * в т.ч. кросс-комнатные) чистка не трогает. */ - { - uint8_t k, wr = 0; - for (k = 0; k < trobs_count; k++) { - uint8_t c = (uint8_t)(pop_level_tile_raw(trobs[k].room, - trobs[k].tilepos) & 0x1F); - if (trobs[k].room != room && - (c == TILE_TORCH || c == TILE_TORCH_DEBRIS || - c == TILE_POTION || c == TILE_SWORD)) - continue; - trobs[wr++] = trobs[k]; - } - trobs_count = wr; - } - for (i = 0; i < POP_ROOMTILES; i++) { - code = (uint8_t)(pop_level_tile_raw(room, i) & 0x1F); - if (code == TILE_TORCH || code == TILE_TORCH_DEBRIS) { - mod[i] = (uint8_t)trob_prandom(8); - pop_add_trob(room, i, 1); - } else if (code == TILE_POTION) { - mod[i] = (uint8_t)((mod[i] & 0xF8) | (trob_prandom(6) + 1)); - pop_add_trob(room, i, 1); - } else if (code == TILE_SWORD) { - /* start_anim_sword (seg007:087C): случайная фаза счётчика блеска. */ - mod[i] = (uint8_t)(trob_prandom(0xFF) & 0x1F); - /* trob_drawn обязан описывать то, что НАРИСУЕТ полная отрисовка - * комнаты, а она идёт ПОСЛЕ этой функции и берёт ЖИВОЙ modif. - * Обнулять его (как делает pop_trob_room_changed для всех тайлов) - * тут нельзя: если случайная фаза попала ровно на 1, комната - * рисуется С БЛЕСКОМ, а trob_drawn говорит «блеска нет» — и на - * следующем кадре счётчик уходит с 1, sig снова 0, СОВПАДАЕТ со - * стоячим trob_drawn, и перерисовка НЕ помечается. Блеск остаётся - * запечённым в фон до конца периода: animate_sword считает вниз и - * выдаёт новый период 0x28..0x67, то есть до 103 логических кадров - * ≈ 6 секунд. Вероятность ровно 1/32 на вход в комнату — отсюда - * «редко воспроизводится» (найдено пользователем 2026-08-17, - * уровень 1 комната 15). Проверено ПРИНУДИТЕЛЬНО: со временной - * подменой фазы на mod[i] = 1 баг ловится на КАЖДОМ входе в - * комнату, а с этой строкой не ловится ни на одном. - * - * У КНОПКИ той же дыры нет, хотя механизм общий: её признак — - * ДЛИТЕЛЬНОЕ состояние (нажата/нет), и рассогласование само - * исправляется на первой же смене. У блеска признак — одиночная - * вспышка в ОДНОМ кадре из 40..103, и пропущенная смена стоит - * целого периода. */ - trob_drawn[i] = (uint8_t)(mod[i] == 1); - pop_add_trob(room, i, 1); - } - } - pop_level_access_end(); -} - -/* animate_spike (seg007:04D3): автомат по modifier. *m — modifier тайла, - * *type — тип trob (>=0 активен, <0 = удалить). Выдвиг: ++modif (1..4), - * на 5 → 0x8F (полностью вышли, безвредны), на 9 → 0 + конец. Убирание - * (флаг 0x80): --modif; когда 0x7F-часть обнулилась → modif=6 (начать - * визуальный уход 6..8). 0xFF = disabled. */ -/* get_torch_frame (seg007:06CD): случайный кадр 0..8, иначе следующий. */ -static uint8_t get_torch_frame(uint8_t curr) -{ - uint8_t next = (uint8_t)trob_prandom(255); - if (next != curr && next < 9) return next; - next = (uint8_t)(curr + 1); - if (next >= 9) next = 0; - return next; -} - -/* bubble_next_frame (seg007:0759): фазы пузырька 1..7 по кругу. */ -static uint8_t bubble_next_frame(uint8_t curr) -{ - uint8_t next = (uint8_t)(curr + 1); - return (next >= 8) ? 1 : next; -} - -/* Разбор номера тайла 0..29 на ряд/колонку без деления (`tp / 10`, `tp % 10` - * — это __divuchar/__moduchar, а в animate_chomper они звались на каждого - * чомпера каждый кадр). Определены ЗДЕСЬ, а не перед pop_process_trobs, где - * лежали раньше: чомперы выше по файлу и оригинала не видели. */ -static const uint8_t TP_ROW[30] = { - 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2 -}; -static const uint8_t TP_COL[30] = { - 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9 -}; - -/* animate_chomper (seg007:0448). Модификатор: младшие 7 бит — фаза 1..N, - * старший — «перемололо кого-то» (кровь). Фаза крутится по кругу до - * POP_CHOMPER_SPEED (у оригинала 15), то есть челюсти смыкаются раз в N - * кадров; фаза 2 — момент удара (в оригинале там звук sound_47). - * - * Остановка (иначе чомперы щёлкали бы всю игру): если Кид ушёл из этой - * комнаты, или ушёл из этого РЯДА, или умер не в этом чомпере — trob - * снимается, но только после фазы 6, чтобы челюсти успели разомкнуться. - * Запускает их обратно start_chompers на смене ряда. Аргументы room/tp - * нужны ровно для этой проверки. */ -static void animate_chomper(uint8_t *m, int8_t *type, - uint8_t room, uint8_t tp, uint8_t drawn_room) -{ - uint8_t blood, frame; - if (*type >= 0) { - blood = (uint8_t)(*m & 0x80); - frame = (uint8_t)((*m & 0x7F) + 1); - if (frame > POP_CHOMPER_SPEED) frame = 1; - *m = (uint8_t)(blood | frame); - if (frame == 2) pop_sfx_play(47); /* щелчок челюстей, seg007:297 */ - if ((room != drawn_room || (int8_t)TP_ROW[tp] != Kid.curr_row || - (Kid.alive >= 0 && blood == 0)) && frame >= 6) - *type = -1; - } -} - -/* next_chomper_timing (seg007:0F9A): 15,12,9,6,13,10,7,14,11,8 по кругу — - * чомперы одного ряда стартуют вразнобой, а не хлопают в унисон. */ -static uint8_t next_chomper_timing(uint8_t timing) -{ - timing -= 3; - if (timing < 6) timing += 10; - return timing; -} - -/* start_anim_chomper (seg007:08C7): запустить, только если стоит (0) или - * уже прошёл фазу размыкания (>=6). */ -static void start_anim_chomper(uint8_t *mod, uint8_t room, uint8_t tp, - uint8_t modifier) -{ - uint8_t old = (uint8_t)(mod[tp] & 0x7F); - if (old == 0 || old >= 6) { - mod[tp] = modifier; - pop_add_trob(room, tp, 1); - } -} - -/* start_chompers (seg007:0F13): все чомперы РЯДА активного персонажа. - * Зовётся отовсюду, где персонаж сменил ряд (SEQ_UP/SEQ_DOWN, start_fall, - * приземление) и на входе в комнату. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked -{ - uint8_t timing = 15, col, tp; - uint8_t *mod; - if ((uint8_t)row >= 3) return; /* вне комнаты — нечего */ - /* pop_trob_modif ДО открытия окна: при первом обращении к комнате он - * сам лезет за её bg в страницу уровня, то есть перемапит W0 и закроет - * его — а мы внутри окна читаем тайлы. */ - mod = pop_trob_modif(room); - pop_level_access_begin(); - for (col = 0; col < 10; col++) { - tp = (uint8_t)(row * 10 + col); - if ((pop_level_tile_raw(room, tp) & 0x1F) == TILE_CHOMP) { - uint8_t m = (uint8_t)(mod[tp] & 0x7F); - if (m == 0 || m >= 6) { - start_anim_chomper(mod, room, tp, - (uint8_t)(timing | (mod[tp] & 0x80))); - timing = next_chomper_timing(timing); - } - } - } - pop_level_access_end(); -} - -static void animate_spike(uint8_t *m, int8_t *type) -{ - uint8_t mod = *m; - if (*type >= 0) { - if (mod == 0xFF) return; /* disabled — не двигать */ - if (mod & 0x80) { - --mod; - if (mod & 0x7F) { *m = mod; return; } - mod = 6; - } else { - ++mod; - if (mod == 5) mod = 0x8F; - else if (mod == 9) { mod = 0; *type = -1; } - } - } - *m = mod; -} - -/* animate_loose (seg007:0CBA) — для плиты в НЕ отрисованной комнате. - * - * ЗАЧЕМ. В оригинале loose-пол — обычный trob, а do_trobs крутит весь - * список независимо от drawn_room: расшатанная плита доваливается, даже если - * Кид уже убежал в соседнюю комнату. У нас фаза живёт в pop_loose_modif[30] - * — массиве ТЕКУЩЕЙ комнаты, — и смена комнаты её обнуляла: плита, - * пробежав по которой Кид уходил вправо, оставалась целой (уровень 10, - * комната 2, тайл 2,9). - * - * Разделение обязанностей: пока комната отрисована, фазой владеет - * pop_loose_tick (ему нужны перерисовка, звук, mob-порядок), и trob здесь - * сразу снимается. На выходе из комнаты pop_loose_leave_room (pop_map.c) - * сбрасывает фазу в ПЕРСИСТЕНТНЫЙ room_modif и заводит trob — дальше плита - * досчитывает здесь, а на входе обратно pop_loose_reset забирает фазу - * назад. Персистентный модификатор и есть curr_room_modif оригинала, так - * что расхождения с SDLPoP нет — только двухуровневое хранение. - * - * Рисовать тут нечего (комната не на экране), поэтому от оригинала остаётся - * ровно счёт фазы и провал: тайл в EMPTY + отрыв падающего куска. */ -static void animate_loose(uint8_t *m, int8_t *type, uint8_t room, uint8_t tp, - uint8_t cur_room) -{ - uint8_t ph; - if (room == cur_room) { *type = -1; return; } /* хозяин — pop_loose_tick */ - ph = (uint8_t)(*m + 1); - if (ph == 0) ph = 1; /* перескок нуля, см. pop_loose_tick */ - if (ph & 0x80) { /* тряска (do_knock): 0x80..0x83 */ - /* Спецкейс уровня 13 (seg007:823) — тот же, что в pop_loose_tick: - * отложенный старт от check_fall_flo живёт в старшем бите, и гасить - * его нельзя. Здесь он тоже нужен: гряда лежит в комнате СВЕРХУ, и - * пока Кид не вошёл в комнату под ней, счёт идёт заочно. */ - if (pop_current_level == POP_LOOSE_TILES_LEVEL) { /* ждём молча */ } - else if (ph >= 0x84) { ph = 0; *type = -1; } - } else if (ph >= 11) { /* loose_floor_delay — провал */ - /* remove_loose (seg007:0EB8): тайл → EMPTY, модификатором пустой - * клетки становится ТИП УРОВНЯ (по нему draw_tile_right выбирает - * blueline у дыры). Тот же порядок, что в pop_loose_tick. */ - pop_level_set_tile(room, tp, TILE_EMPTY); - /* Комната не на экране, но её колонка 9 ВИДНА в шве текущей и лежит - * в кромочных снимках — попросить главный цикл их перечитать. */ - pop_neigh_dirty = 1; - pop_loose_mob_spawn_at(room, TP_ROW[tp], TP_COL[tp]); - ph = pop_palace; - *type = -1; - } - *m = ph; -} - -/* ---- Кнопки/ворота (seg007) --------------------------------------- * - * Таблицы связей LINKLOC/LINKMAP — в pop_level (мутабельная копия в W2). - * doorlink1 (d1) = LINKLOC, doorlink2 (d2) = LINKMAP. */ -static uint8_t get_doorlink_timer(uint8_t i) { return (uint8_t)(pop_doorlink2(i) & 0x1F); } -static void set_doorlink_timer(uint8_t i, uint8_t v) -{ - pop_doorlink2_set(i, (uint8_t)((pop_doorlink2(i) & 0xE0) | (v & 0x1F))); -} -static uint8_t get_doorlink_tile(uint8_t i) { return (uint8_t)(pop_doorlink1(i) & 0x1F); } -static uint8_t get_doorlink_next(uint8_t i) { return (uint8_t)(!(pop_doorlink1(i) & 0x80)); } -static uint8_t get_doorlink_room(uint8_t i) -{ - return (uint8_t)(((pop_doorlink1(i) & 0x60) >> 5) + ((pop_doorlink2(i) & 0xE0) >> 3)); -} - -/* trigger_gate (seg007:092C): изменить openness ворот по типу кнопки. - * Возвращает тип анимации для add_trob (или -1 = ничего). */ -static int8_t trigger_gate(uint8_t room, uint8_t tilepos, uint8_t button_type) -{ - uint8_t *mod = pop_trob_modif(room); - uint8_t modifier = mod[tilepos]; - if (button_type == TILE_OPENER) { - if (modifier == 0xFF) return -1; /* уже насовсем открыт */ - if (modifier >= 188) { mod[tilepos] = 238; return -1; } /* открыт → держать */ - mod[tilepos] = (uint8_t)((modifier + 3) & 0xFC); - return 1; /* обычное открытие */ - } else if (button_type == TILE_DEBRIS) { /* насовсем (died_on_button) */ - if (modifier < 188) return 2; - mod[tilepos] = 0xFF; - return -1; - } else { /* closer */ - if (modifier != 0) return 3; /* быстро закрыть */ - return -1; - } -} - -/* trigger_1 (seg007:0999): цель = ворота → trigger_gate; иначе -1 (leveldoor - * и прочее — отложено). */ -static int8_t trigger_1(uint8_t target_type, uint8_t room, uint8_t tilepos, uint8_t button_type) -{ - if (target_type == TILE_GATE) - return trigger_gate(room, tilepos, button_type); - if (target_type == TILE_LEVELDOOR) { - /* trigger_1 (seg007:0999): дверь уровня открывается ОДИН раз — если - * створка уже тронулась (modif != 0), кнопка ничего не делает. */ - uint8_t *m = pop_trob_modif(room); - if (m && m[tilepos] == 0) return 1; - return -1; - } - return -1; -} - -/* do_trigger_list (seg007:09E5): обойти цепочку LINKLOC от index, для каждой - * цели добавить trob (если trigger_1 >= 0). */ -static void do_trigger_list(uint8_t index, uint8_t button_type) -{ - for (;;) { - uint8_t room = get_doorlink_room(index); - uint8_t tilepos = get_doorlink_tile(index); - uint8_t target_type = pop_level_tile(room, tilepos); - int8_t result = trigger_1(target_type, room, tilepos, button_type); - if (result >= 0) pop_add_trob(room, tilepos, result); - if (get_doorlink_next(index) == 0) break; - index++; - } -} - -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked -{ - uint8_t link_timer = get_doorlink_timer(modifier); - if (link_timer != 0x1F) { /* не заклинено */ - /* Оригинал ставит 5; вынесено в pop_tune.h, потому что проверять - * руками проход в закрывающуюся решётку при таком окне почти - * невозможно (см. BUG-GATE-PASS-1). */ - set_doorlink_timer(modifier, POP_DBG_GATE_HOLD); - if (link_timer < 2) { - pop_add_trob(room, tilepos, 1); /* кнопка нажимается */ - /* seg007:766: щелчок кнопки — шум, и страж оборачивается - * (флаг обязателен даже без звука, BUG-GUARD-DEAF-1). - * - * Звук НЕ у всех вызовов: у оригинала первый параметр playsound, - * и в трёх местах он нулевой — вход на уровень (seg003:170), - * выход Джаффара (seg002:520) и зелье «открыть» (seg006:1890, - * у нас пока не портировано). Там кнопка нажимается служебно, - * щёлкать нечему. */ - if (snd) pop_sfx_play(3); - is_guard_notice = 1; - } - do_trigger_list(modifier, button_type); - } -} - -/* animate_button (seg007:0D3A): отсчитать таймер связи; <2 → кнопка - * отжимается (trob кончился). idx = модификатор кнопки (индекс LINKLOC). */ -static void animate_button(uint8_t idx, int8_t *type) -{ - if (*type >= 0) { - uint8_t timer = get_doorlink_timer(idx); - timer = (uint8_t)(timer ? timer - 1 : 0); - set_doorlink_timer(idx, timer); - if (timer < 2) *type = -1; - } -} - -/* animate_leveldoor (seg007:05F1): створка двери уровня. type 0..2 — - * открытие (modif 0 -> 43, по пикселю за кадр), type >= 3 — быстрое - * закрытие со скоростями {0,5,17,99} (после выхода из уровня). Готово -> - * type = -1. */ -static const uint8_t leveldoor_close_speeds[5] = {0, 5, 17, 99, 0}; - -/* ---- Спецсобытие уровня 4: ПОЯВЛЕНИЕ ЗЕРКАЛА ------------------------ * - * - * seg007:0457, хвост animate_leveldoor: когда дверь выхода ДОРИСОВАЛА - * открытие и leveldoor_open переходит 0/2 -> 1, оригинал ставит тайл - * зеркала прямо в данные комнаты: - * - * get_tile(mirror_room, mirror_column, mirror_row); - * curr_room_tiles[curr_tilepos] = tiles_13_mirror; - * - * Ставится он в ЧУЖУЮ комнату (4), а не в ту, где дверь. В статике уровня - * зеркала НЕТ НИ В ОДНОМ файле (проверено перебором всех 15 res200N.bin), - * поэтому его спрайты 75/77 пришлось добавить в атлас явным списком — - * MIRROR_ENV_IDS в pop_pack_bg.py (грабли memory pop_atlas_dynamic_ids). */ -#define TILE_MIRROR 0x0D /* MIRROR_* — в pop_guard.h (нужны и ИИ тени) */ - -static void place_mirror(uint8_t cur_room) -{ - if (pop_current_level != MIRROR_LEVEL) return; - pop_level_set_tile(MIRROR_ROOM, MIRROR_TILEPOS, TILE_MIRROR); - /* Комната зеркала обычно НЕ та, где дверь выхода, — игрок войдёт в неё - * позже и она отрисуется целиком. Но если она уже на экране, тайл надо - * вернуть: зеркало ДОБАВЛЯЕТ графику поверх пустого места, поэтому - * хватает обычной пометки (wipe пола + полный draw_tile). */ - if (cur_room == MIRROR_ROOM) - pop_set_redraw(MIRROR_TILEPOS, POP_RD_FLOOR, 2); -} - -static void animate_leveldoor(uint8_t *m, int8_t *type, uint8_t cur_room) -{ - if (*type < 0) return; - if (*type >= 3) { - uint8_t sp; - if (*type < 7) (*type)++; - sp = leveldoor_close_speeds[*type - 3]; - if (sp >= *m) { *m = 0; *type = -1; pop_sfx_play(14); } /* seg007:437 */ - else { - *m = (uint8_t)(*m - sp); - /* seg007:442: створку НА ЗАКРЫТИИ перебивать можно. */ - if (*type == 4) { pop_sfx_slide_intr = 1; pop_sfx_play(15); } - } - } else { - /* seg007:464: на ОТКРЫТИИ створка неперебиваема — иначе съезд - * обрывается посреди и «конца» не слышно. */ - if (*m < 43) { (*m)++; pop_sfx_slide_intr = 0; pop_sfx_play(15); } - if (*m >= 43) { - *m = 43; *type = -1; - /* seg007:455: дверь открылась — оригинал глушит всё. Без этого - * неперебиваемый съезд (1,6 с) продолжал бы блокировать очередь. */ - pop_sfx_stop(); - /* Условие оригинала — переход ИЗ 0 или 2, то есть ровно один раз - * за открытие; иначе зеркало ставилось бы заново каждый кадр, - * пока дверь стоит открытой. */ - if (pop_leveldoor_open == 0 || pop_leveldoor_open == 2) { - pop_leveldoor_open = 1; - place_mirror(cur_room); - } - pop_leveldoor_open = 1; - } - } -} - -/* animate_door (seg007:0522): openness по типу анимации. *m — modif ворот, - * *type — 0 закрытие / 1 открытие / 2 насовсем / 3..8 быстрое закрытие. */ -static const uint8_t gate_close_speeds[9] = {0, 0, 0, 20, 40, 60, 80, 100, 120}; -static const int8_t door_delta[3] = {-1, 4, 4}; - -/* play_door_sound_if_visible (seg007:1239): СЛЫШНА ли решётка. - * - * Правило не «решётка в текущей комнате», как можно подумать, а такое: - * - решётка в комнате СЛЕВА и стоит в колонке 9 — слышна (это тайл вплотную - * к левому краю экрана, игрок фактически видит её створку в шве); - * - решётка в ОТРИСОВАННОЙ комнате и НЕ в колонке 9 — слышна (колонка 9 - * уезжает за правый край); - * - особый случай оригинала: уровень 3, комната 2 — слышна всегда. - * Всё остальное молчит, иначе на 13-м уровне скрипели бы решётки со всей - * карты. - * - * Берём вариант ПОД FIX_GATE_SOUNDS (условия через ИЛИ, а не тернарником): - * в SDLPoP этот фикс включён по умолчанию, а сравниваемся мы именно с ним. - * Отличие только в вырожденном случае room_L == cur_room. */ -static uint8_t door_audible(uint8_t room, uint8_t tp, - uint8_t room_L, uint8_t cur_room) -{ - uint8_t col = TP_COL[tp]; - if (pop_current_level == 3 && room == 2) return 1; - if (room == room_L && col == 9) return 1; - if (room == cur_room && col != 9) return 1; - return 0; -} - -static void animate_door(uint8_t *m, int8_t *type, uint8_t audible) -{ - int8_t anim_type = *type; - uint8_t mod = *m; - if (anim_type >= 0) { - if (anim_type >= 3) { /* быстрое закрытие */ - if (anim_type < 8) { anim_type++; *type = anim_type; } - { - int new_mod = (int)mod - gate_close_speeds[anim_type]; - if (new_mod < 0) { mod = 0; *type = -1; pop_sfx_play(6); } - else mod = (uint8_t)new_mod; - } - } else if (mod != 0xFF) { - mod = (uint8_t)(mod + door_delta[anim_type]); - if (anim_type == 0) { /* закрытие */ - /* seg007:376: скрип закрывающейся решётки — раз в четыре шага - * модификатора; лязг «встала» (7) — в конце. Оба через - * гейт слышимости (gate_stop, seg007:05E3, тоже через него). */ - if (mod != 0) { - if (mod < 188 && (mod & 3) == 3 && audible) pop_sfx_play(4); - } else { - *type = -1; - if (audible) pop_sfx_play(7); /* gate_stop */ - } - } else { /* открытие */ - if (mod >= 188) { - /* Лязг после ОБЫЧНОГО открытия оригинал даёт без гейта - * (seg007:395 — прямой play_sound), а после открытия - * насовсем — через gate_stop, то есть с гейтом. */ - if (anim_type < 2) { mod = 238; *type = 0; pop_sfx_play(7); } - else { - mod = 0xFF; *type = -1; - if (audible) pop_sfx_play(7); - } - } else if ((mod & 7) == 0) pop_sfx_play(5); /* seg007:386 */ - } - } else { - *type = -1; - if (audible) pop_sfx_play(7); /* gate_stop, seg007:404 */ - } - } - *m = mod; -} - -uint8_t pop_trob_room_active(uint8_t room) __banked -{ - uint8_t i; - for (i = 0; i < trobs_count; i++) - if (trobs[i].room == room) return 1; - return 0; -} - - -/* Темп анимации пламени в ЛОГИЧЕСКИХ кадрах (один логический кадр = 3 - * vsync и соответствует игровому тику оригинала): - * 1 — кадр пламени каждый тик, как в оригинале; кадры при этом ровные по - * тактам, что нужно для счёта бюджета; - * 2 — вдвое реже (так было до 2026-07-30; пламя шло на половинной - * скорости, а бюджет кадра «прыгал» на 6.2 % от того, попал кадр на - * анимацию или нет). */ -#define TORCH_ANIM_DIV 1 - -static uint8_t torch_tick; -#if TORCH_ANIM_DIV > 1 -#define TORCH_ANIM_NOW ((uint8_t)(torch_tick % TORCH_ANIM_DIV) == 0) -#else -#define TORCH_ANIM_NOW 1 -#endif - -void pop_trob_qsave(pop_qs_io_t *io) __banked -{ - uint8_t i; - pop_qs_bytes(io, room_modif, sizeof(room_modif)); - pop_qs_bytes(io, room_seen, sizeof(room_seen)); - pop_qs_u8(io, &trobs_count); - for (i = 0; i < TROBS_MAX; i++) { - pop_qs_u8(io, &trobs[i].room); - pop_qs_u8(io, &trobs[i].tilepos); - pop_qs_i8(io, &trobs[i].type); - } - pop_qs_u16(io, &trob_seed.lo); - pop_qs_u16(io, &trob_seed.hi); - pop_qs_u8(io, &torch_tick); - if (io->reading && io->apply) { - if (trobs_count > TROBS_MAX) { io->failed = 1; return; } - for (i = 0; i < POP_ROOMTILES; i++) trob_drawn[i] = 0; - pop_redraw_reset(); - } -} - -void pop_process_trobs(uint8_t cur_room) __banked -{ - uint8_t i, w = 0; -#if TORCH_ANIM_DIV > 1 - torch_tick++; -#endif - - /* Перерисовка «покоя» законченных пик/кнопок (обе страницы). - * row/col ведём бегущими счётчиками, а НЕ через i/10, i%10: иначе SDCC - * выносит оба деления (__divuchar/__moduchar) в вершину цикла как общее - * подвыражение аргументов redraw — 30*2=60 делений/кадр даже когда нет - * активных пик/кнопок (тот же случай, что был в pop_loose_tick). */ - if (trobs_count == 0) return; - - /* Префетч кодов тайлов всех trob'ов за ОДИН map/unmap окна 0, а не - * pop_level_tile() на каждый trob (тот свапал W0 каждый вызов = N свапов - * за кадр даже без анимации). Дальше цикл (с редроями) идёт с - * размапленным W0 — как раньше. */ - { - uint8_t k; - pop_level_access_begin(); - for (k = 0; k < trobs_count; k++) { - uint8_t tp = trobs[k].tilepos; - uint8_t c = pop_level_tile_raw(trobs[k].room, tp); - trob_code[k] = c; - trob_rcode[k] = 0; - if ((c == TILE_TORCH || c == TILE_TORCH_DEBRIS) && TP_COL[tp] < 9) - trob_rcode[k] = (uint8_t)(pop_level_tile_raw(trobs[k].room, - (uint8_t)(tp + 1)) & 0x1F); - } - pop_level_access_end(); - } - - pop_dbg_m8(); /* ЗАМЕР: префетч кодов тайлов сделан */ - - /* Указатель на модификаторы КОМНАТЫ кэшируется между итерациями. - * - * pop_trob_modif объявлен __banked, и вызов его на КАЖДЫЙ trob — это - * трамплин из банка 6 в банк 6 же... нет: из горячего цикла в банковую - * функцию, то есть полный переход через резидент. А комната у trob'ов - * в подавляющем большинстве кадров ОДНА (все они из cur_room, чужие - * появляются лишь у брошенных плит соседней комнаты). Тот же паттерн - * «трамплин в цикле», что дал −23 784 на луче видимости стража - * (P2b) и −14 118 на guard_over_kid (P16). - * - * Сбрасывается на каждом кадре: room_seen внутри pop_trob_modif живёт - * дольше, но указатель на строку room_modif может смениться при - * перезагрузке комнаты, поэтому кэш локальный для одного прохода. */ - { - uint8_t mod_room = 0; /* 0 = «ещё не брали» (комнаты 1..24) */ - uint8_t *mod = 0; - /* Сосед СЛЕВА нужен гейту слышимости решёток (door_audible). Берём один - * раз на проход: pop_room_link маппит страницу уровня, а решёток в - * списке может быть несколько. */ - uint8_t room_L = pop_room_link(cur_room, 0 /* L */); - - for (i = 0; i < trobs_count; i++) { - uint8_t room = trobs[i].room; - uint8_t tp = trobs[i].tilepos; - uint8_t code = trob_code[i]; - int8_t type = trobs[i].type; - - if (room != mod_room) { mod = pop_trob_modif(room); mod_room = room; } - - switch (code) { - case TILE_SPIKE: - animate_spike(&mod[tp], &type); - break; - case TILE_CHOMP: - animate_chomper(&mod[tp], &type, room, tp, cur_room); - break; - case TILE_OPENER: - case TILE_CLOSER: - animate_button(mod[tp], &type); /* mod[tp] = индекс LINKLOC кнопки */ - break; - case TILE_GATE: - animate_door(&mod[tp], &type, door_audible(room, tp, room_L, cur_room)); - break; - case TILE_LOOSE: - animate_loose(&mod[tp], &type, room, tp, cur_room); - break; - case TILE_LEVELDOOR: - animate_leveldoor(&mod[tp], &type, cur_room); - break; - case TILE_TORCH: - case TILE_TORCH_DEBRIS: - /* animate_torch (seg007:03C1): анимация вечная — type остаётся - * 1, пока комната отрисована. Темп — TORCH_ANIM_DIV. */ - if (room == cur_room && TORCH_ANIM_NOW) - mod[tp] = get_torch_frame(mod[tp]); - break; - case TILE_POTION: - /* animate_potion (seg007:03E9): крутим младшие 3 бита (фаза - * пузырька), старшие 5 — тип зелья. */ - if (room == cur_room) - mod[tp] = (uint8_t)((mod[tp] & 0xF8) | bubble_next_frame(mod[tp] & 7)); - break; - case TILE_SWORD: - /* animate_sword (seg007:0425): счётчик вниз; на 0 — новый период - * 0x28..0x67. Блеск рисуется РОВНО на modif==1 (draw_tile берёт - * кадр (modif==1)+10), т.е. одиночная вспышка раз в 40..103 тика. */ - if (room == cur_room) { - if (--mod[tp] == 0) - mod[tp] = (uint8_t)((trob_prandom(255) & 0x3F) + 0x28); - } - break; - default: - type = -1; - break; - } - trobs[i].type = type; - - if (room == cur_room && - (code == TILE_TORCH || code == TILE_TORCH_DEBRIS || code == TILE_POTION)) { - /* Пламя ЗАПЕКАЕТСЯ в фон (GFX_BANK_NORMAL внутри pop_torch_draw), - * пузырёк зелья — нет, ему нужен heal. Порядок «пламя раньше - * перерисовок тайлов» обязателен: heal чомпера-соседа вернёт - * запечённый огонь из ОЗУ-копии, а его собственная графика ляжет - * ПОВЕРХ — ровно как в оригинале, где draw_tile_anim_right (пламя - * левого соседа) идёт до draw_tile_anim (сам чомпер). Выносить - * отрисовку ПОСЛЕ pop_redraw_needed нельзя: пламя окажется поверх - * челюстей. */ - /* Таблицей, а не tp/10 и tp%10: у Z80 деления нет, SDCC зовёт - * __divuchar + __moduchar — на два факела это четыре вызова за - * кадр (замер MAME). Тайл всегда 0..29. */ - uint8_t trow = TP_ROW[tp], tcol = TP_COL[tp]; - if (code == TILE_POTION) { - pop_potion_draw(trow, tcol, mod[tp]); - } else { - pop_torch_draw(trow, tcol, mod[tp]); - /* Порт set_redraw_anim_right (seg007:0101): animate_torch метит - * ПРАВОГО СОСЕДА, и redraw_needed рисует его слой anim в - * порядке draw_tile_anim_topright -> draw_tile_anim_right - * (пламя) -> draw_tile_anim (СВОЯ графика тайла). То есть в - * оригинале челюсти чомпера возвращаются поверх огня КАЖДЫЙ - * кадр факела, а не только пока жива их собственная анимация. - * - * У нас пламя запекается напрямую (pop_torch_draw), минуя - * механизм пометок, поэтому у ЗАСТЫВШЕГО чомпера возвращать - * его было нечем — огонь накрывал челюсти (баг найден на - * уровне 4). Метим сосед-тайл сами, ОДНУ страницу: факел - * анимируется каждый кадр, значит обе страницы получат свою - * перерисовку по очереди. Порядок сходится: этот блок идёт - * ДО pop_redraw_needed. - * - * РАСХОЖДЕНИЕ С ОРИГИНАЛОМ (осознанное): он метит соседа - * безусловно, мы — только когда там чомпер. Безусловная - * пометка = перерисовка тайла каждый кадр на каждый факел, - * а слой anim рисует ещё пики/зелье/меч (seg008:644). Их - * случай «застыл справа от факела» в BUGS_OPEN.md как открытый: - * пики и меч рядом с факелом на уровнях 1-4 не встретились. */ - if (trob_rcode[i] == TILE_CHOMP) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_CHOMP_ANIM, 1); - } - } - if (room == cur_room && code == TILE_SPIKE) { - /* ПИКИ — редрой КАЖДЫЙ кадр, пока trob жив: animate_spike - * (seg007:0353) зовёт redraw_21h БЕЗУСЛОВНО, а не по смене кадра. - * Это не «лишняя работа оригинала»: выдвинутая пика живёт только в - * видео-ОЗУ (банк SPRITE, в фон не запечена), а heal персонажа каждый кадр - * возвращает под спрайтом Кида ПЕЧЁНЫЙ фон — то есть стирает те - * части остриёв, что попали под его прямоугольник. При редрое - * по смене кадра пика держится 15 кадров (modif 0x8F..0x81) с - * неизменной сигнатурой, и стёртое уже не возвращается: рядом с - * Кидом остриё пропадало, а нижний кусок мерцал (стёрт на одной - * странице дабл-буфера из двух). */ - /* Последний кадр (пика убралась, trob умирает) — пометить ОБЕ - * страницы: живой trob метит каждый кадр по одной. */ - pop_set_redraw(tp, POP_RD_SPIKE, (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_CHOMP) { - /* ТОЛЬКО ПОКА ФАЗА < 6 — как в оригинале (animate_chomper, - * seg007:0448 заканчивается `if ((curr_modifier & 0x7F) < 6) - * redraw_at_trob();`). - * - * Это не оптимизация оригинала, а точное следствие таблицы поз: - * CHOMP_FRAM1 = {3,2,0,1,4,3,3}, то есть с фазы 5 и до конца - * круга (POP_CHOMPER_SPEED = 15) поза одна и та же — 3. - * Перерисовывать её десять кадров подряд значит рисовать ровно - * ту же картинку, а стоит это 190 260 тактов НА КАДР: полный - * draw_tile плюс heal 32x64, 24 % работы кадра в 11/15 - * (замер 2026-08-19). - * - * На фазе 5 метим ОБЕ страницы дабл-буфера: она последняя - * рисуемая, и её поза обязана лечь на обе, иначе на второй - * останется поза фазы 4 и чомпер будет дрожать через кадр. - * Сходится и по кадрам: вторую страницу эта пометка догоняет в - * кадре фазы 6, где поза та же самая (CHOMP_FRAM1[6] == 3). - * - * Про type < 0 отдельной ветки больше нет: trob снимается сам - * только при frame >= 6 (см. animate_chomper выше), то есть - * когда перерисовки уже не идут, а на экране с фазы 5 лежит - * финальная поза на обеих страницах. */ - uint8_t ph = (uint8_t)(mod[tp] & 0x7F); - if (ph < 6) - pop_set_redraw(tp, POP_RD_CHOMP, (uint8_t)(ph == 5 ? 2 : 1)); - } - if (room == cur_room && code == TILE_GATE) { - /* draw_trob (seg007:01E6), которым заканчивается animate_door: - * пока trob жив — решётка едет каждый кадр, помечаем ТЕКУЩУЮ - * страницу; последний кадр (type<0, ворота встали) — ОБЕ, иначе - * на второй странице дабл-буфера застынет предыдущее положение - * и решётка дрожит через кадр. Тайлпос — САМИ ворота, соседа - * справа выбирает pop_gate_redraw. */ - pop_set_redraw(tp, POP_RD_GATE, (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_LEVELDOOR) { - /* Створка едет каждый кадр — перерисовываем ПРАВУЮ половину (там - * её рисует draw_tile_anim_right) С ЗАПЕЧКОЙ в ОЗУ-копию: иначе - * heal персонажа вернул бы из фона закрытую створку. Куски двери - * непрозрачны, поэтому wipe не нужен. */ - /* Створку рисует ПРАВАЯ половина двери; последний кадр анимации - * помечаем на обе страницы, иначе дверь дрожит через кадр. */ - if (TP_COL[tp] < 9) - pop_set_redraw((uint8_t)(tp + 1), POP_RD_LEVELDOOR, - (uint8_t)(type < 0 ? 2 : 1)); - } - if (room == cur_room && code == TILE_SWORD) { - /* МЕЧ — редрой только на смене видимого кадра (блеск = modif==1): - * спрайт запечён в фон (draw_tile), поэтому перерисовываем тайл - * той же схемой, что и кнопку — текущая страница сразу, вторая - * следующим кадром через rest-цикл. */ - uint8_t sig = (uint8_t)(mod[tp] == 1); - if (sig != trob_drawn[tp]) { - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - trob_drawn[tp] = sig; - } - } - if (room == cur_room && (code == TILE_OPENER || code == TILE_CLOSER)) { - /* КНОПКА — редрой только при смене видимого состояния (нажата = - * таймер связи >1): пока Кид её держит, картинка стабильна. - * Рисуем ТЕКУЩУЮ страницу сразу + =1 (вторая страница - * дабл-буфера следующим кадром через rest-цикл). tp/10,tp%10 - * считаем только в момент редроя (редко), а не каждый кадр. */ - uint8_t sig = (uint8_t)(get_doorlink_timer(mod[tp]) > 1); - if (sig != trob_drawn[tp]) { - pop_set_redraw(tp, POP_RD_FLOOR, 2); /* обе страницы */ - trob_drawn[tp] = sig; - } - } - } - } /* конец блока с кэшем mod/mod_room */ - - /* compact: удалить завершённые (type < 0). */ - for (i = 0; i < trobs_count; i++) - if (trobs[i].type >= 0) trobs[w++] = trobs[i]; - trobs_count = w; -} diff --git a/applications/SprPoP/src/pop_trob.h b/applications/SprPoP/src/pop_trob.h deleted file mode 100644 index 3be05ce..0000000 --- a/applications/SprPoP/src/pop_trob.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * pop_trob.h — P0-каркас: персистентное per-room modifier-состояние + - * список анимируемых тайлов (trob). Порт SDLPoP seg007 (process_trobs/ - * add_trob/animate_tile) + curr_room_modif. - * - * ЗАЧЕМ: тайлы-объекты (пики, ворота, кнопки) имеют состояние (modifier), - * которое живёт МЕЖДУ входами в комнату и может меняться КРОСС-КОМНАТНО - * (кнопка в одной комнате открывает ворота в другой). room_modif[room] - * — единственный источник модификаторов для отрисовки (pop_bg draw_tile - * читает его как bg), как curr_room_modif в оригинале. - * - * Список trob хранит (room, tilepos, type) активных анимаций; каждый кадр - * pop_process_trobs продвигает их (animate_spike/door/button по коду тайла), - * пишет результат в room_modif и перерисовывает изменившиеся тайлы ТЕКУЩЕЙ - * комнаты на back-странице (2-page, как loose). Невидимые комнаты - * анимируются в состоянии (без отрисовки) — при входе рисуются статически. - */ -#ifndef POP_TROB_H -#define POP_TROB_H - -#include "pop_qsave.h" - -#include - -#define POP_NROOMS 24 -#define POP_ROOMTILES 30 - -/* Сброс всего состояния (новый уровень / рестарт): забыть все комнаты и - * очистить список trob. */ -void pop_trob_reset(void) __banked; -void pop_trob_qsave(pop_qs_io_t *io) __banked; - -/* Указатель на persistent modifier-массив комнаты room (1..24), 30 байт. - * При ПЕРВОМ обращении лениво инициализируется из backtable уровня - * (pop_level_room_bg). Далее ЖИВЁТ (не перезагружается). room вне - * диапазона → 0. */ -uint8_t *pop_trob_modif(uint8_t room) __banked; - -/* Добавить/обновить trob (room, tilepos, type). Если уже есть — сменить - * type (как SDLPoP add_trob/find_trob). type<0 = будет удалён. */ -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked; - -/* Продвинуть все trob на кадр (animate_* по коду тайла из уровня), записать - * modif, перерисовать тайлы ТЕКУЩЕЙ (cur_room) комнаты на back-странице. - * Звать в основном цикле ПОСЛЕ set_draw_page(back), рядом с loose. */ -void pop_process_trobs(uint8_t cur_room) __banked; - -/* Кид встал на кнопку (opener/closer): взвести таймер связи + обойти цепочку - * LINKLOC, добавив trob целям (ворота). Порт seg007 trigger_button. - * room/tilepos — кнопка; button_type — её тайл-код; modifier — её modif - * (= индекс в LINKLOC). Звать из check_press (pop_map). */ -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked; - -/* Есть ли активные trob в комнате room? Для перерисовки ворот соседа через - * шов (SprPoP не дёргает шов, пока сосед не анимируется). */ -uint8_t pop_trob_room_active(uint8_t room) __banked; - -/* Смена комнаты: сбросить отложенные перерисовки «покоя» текущей комнаты - * (trob-состояние в room_modif персистентно и НЕ трогается). Звать в - * enter_room. */ -void pop_trob_room_changed(void) __banked; - -/* anim_tile_modif (seg000:0B12): завести анимации тайлов комнаты (факелы, - * зелья) со случайной стартовой фазой. Звать в enter_room. */ -void pop_trob_anim_room(uint8_t room) __banked; - -/* start_chompers (seg007:0F13): запустить чомперы РЯДА персонажа. Звать - * там же, где оригинал: смена ряда в play_seq (SEQ_UP/SEQ_DOWN), start_fall, - * приземление и вход в комнату. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked; - -#endif diff --git a/applications/SprPoP/src/pop_tune.h b/applications/SprPoP/src/pop_tune.h deleted file mode 100644 index f2e3730..0000000 --- a/applications/SprPoP/src/pop_tune.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * pop_tune.h — НАСТРАИВАЕМЫЕ КОНСТАНТЫ движка (аналог custom_options - * SDLPoP) в одном месте. - * - * Зачем отдельный заголовок. У оригинала «особые события» уровней зашиты - * магическими числами прямо в код (`current_level == 3 && Char.room == 7`), - * и SDLPoP вынес их в структуру `custom_options_type` (types.h) с - * загрузкой из SDLPoP.ini и правкой через меню Settings/Mods. Нам нужно - * то же самое по двум причинам: - * - * 1. ОТЛАДКА. Некоторые сцены руками почти не проверить (успеть в - * закрывающуюся решётку), и единственный вменяемый способ — временно - * растянуть тайминг. Такие крутилки обязаны жить в одном месте, а не - * прятаться числами по трём модулям. - * 2. МОДЫ. Тот, кто захочет свой набор уровней, меняет ровно эти числа. - * - * Пока это только `#define` — ни INI, ни меню нет (см. TASKS_OPEN.md, запись - * TUNE-1). Но правило уже действует: НОВОЕ «особое событие» или тайминг - * заводится ЗДЕСЬ, а не константой по месту. Имена — как у SDLPoP - * (custom->имя), чтобы сверка с оригиналом оставалась механической. - */ -#ifndef POP_TUNE_H -#define POP_TUNE_H - -/* ---- Чекпойнт уровня 3 (SDLPoP: checkpoint_*) ----------------------- * - * Оригинал: level3_set_chkp (seg002:0665) взводит флаг, когда Кид уходит - * ВЛЕВО ИЗ комнаты 7 (вызов стоит до goto_other_room, поэтому Char.room там - * ещё старая); do_startpos (seg003:0141) подменяет по - * нему стартовую позицию и убирает loose-плиту, через которую туда - * попадают (иначе после респавна дорога назад была бы уже провалена). */ -#define POP_CHKP_LEVEL 3 /* checkpoint_level */ -#define POP_CHKP_ROOM 7 /* комната, ИЗ КОТОРОЙ уходят влево (у - * SDLPoP хардкод; это НЕ комната - * назначения — см. sprpop.c) */ -#define POP_CHKP_RESPAWN_ROOM 2 /* checkpoint_respawn_room */ -#define POP_CHKP_RESPAWN_TILEPOS 6 /* checkpoint_respawn_tilepos */ -#define POP_CHKP_RESPAWN_DIR (-1) /* checkpoint_respawn_dir: влево */ -#define POP_CHKP_CLEAR_ROOM 7 /* checkpoint_clear_tile_room */ -#define POP_CHKP_CLEAR_COL 4 /* checkpoint_clear_tile_col */ -#define POP_CHKP_CLEAR_ROW 0 /* checkpoint_clear_tile_row */ - -/* ---- Отладочные крутилки (в оригинале и в SDLPoP их НЕТ) ------------ * - * POP_DBG_GATE_HOLD — сколько кадров решётка держится поднятой после - * нажатия кнопки, ПРЕЖДЕ чем пойдёт вниз. В оригинале это таймер связи - * дверей: trigger_button ставит 5, animate_button вычитает по единице, и - * решётка стоит, пока таймер > 1 (то есть ~4 кадра после того, как Кид - * сошёл с кнопки). Проверять руками проход в закрывающуюся решётку при - * таком окне почти невозможно, поэтому значение вынесено сюда: поставь - * 30 — и успеешь дойти спокойно. ОБЯЗАН быть 5 в игровой сборке. - * - * ПОТОЛОК 30. Таймер связи — пять бит модификатора кнопки (маска 0x1F), а - * значение 31 у оригинала означает «событие заклинено» (`link_timer != 0x1F` - * в trigger_button). Больше 30 ставить нельзя — кнопка перестанет - * срабатывать вовсе. */ -#define POP_DBG_GATE_HOLD 5 - -/* ---- Улучшения SDLPoP (в ОРИГИНАЛЕ их нет) -------------------------- * - * POP_ENABLE_JUMP_GRAB — зацепиться за кромку можно ПРЯМО В ПРЫЖКЕ, если - * Shift зажат заранее (SDLPoP `enable_jump_grab`, seg006:1228). Ваниль - * разрешает зацеп только в начале падения (`check_grab`, кадры 102..105), - * то есть Shift приходится нажимать уже в полёте — это и раздражало на - * приёмке. 0 — как в оригинале, 1 — как в SDLPoP с включёнными - * enhancements. */ -#define POP_ENABLE_JUMP_GRAB 1 - -/* ---- Чомперы (SDLPoP: custom->chomper_speed) ------------------------ * - * Период смыкания челюстей в кадрах: фаза крутится 1..N и сбрасывается в 1. - * В оригинале 15; SDLPoP выносит это в настройку, потому что на разных - * уровнях моды любят делать чомперы быстрее. Меньше — злее. */ -#define POP_CHOMPER_SPEED 15 - -/* ---- Отладка сцены «тень крадёт зелье» (уровень 5) ------------------ * - * Тень появляется в комнате 24 сразу при входе, но СТОИТ, пока не откроют - * ворота (кол 1, ряд 0, openness >= 80) — так в оригинале - * (autocontrol_shadow_level5, seg002:1157). Чтобы посмотреть саму сцену - * (подход, питьё, уход), не проходя уровень до кнопки, поставь 1: тень - * стартует запись ходов сразу. ОБЯЗАН быть 0 в игровой сборке. */ -#ifndef POP_DBG_SHADOW_NOWAIT -#define POP_DBG_SHADOW_NOWAIT 0 -#endif - -/* ---- Зелье МЕДЛЕННОГО ПАДЕНИЯ (SDLPoP: FEATHER_FALL_LENGTH) ---------- * - * В оригинале длительность эффекта задана НЕ таймером, а звуком: эффект - * держится, пока играет sound_39_low_weight, и снимается принудительно на - * 225-м тике (do_timers, seg003:0517). Звука у нас нет, поэтому берём тот - * же порог напрямую — 225 ИГРОВЫХ КАДРОВ (у оригинала тик do_timers = кадр - * игрового цикла; 225 кадров при его 12 fps и есть FEATHER_FALL_LENGTH = - * 18,75 с из фикса SDLPoP). По ВРЕМЕНИ у нас выйдет короче ровно настолько, - * насколько наша игра быстрее оригинала — это общий вопрос темпа - * (TASKS_OPEN.md, L1-SPEED), а не свойство зелья. */ -#define POP_FEATHER_FRAMES 225 - -/* ---- Спецсобытие «МЫШЬ» (уровень 8, комната 16) ---------------------- * - * Кнопка (0,7) комнаты 16 открывает решётку (0,3) — ту, за которой лежит - * путь через комнату 4 (два чомпера) к кнопке выхода в комнате 3. Сам Кид - * до кнопки с левой площадки не дотягивается (провал в колонках 4..6), - * поэтому, когда дверь уровня уже открыта, а он всё ещё в комнате 16, - * оригинал через 150 тиков присылает мышь: она пробегает справа налево по - * верхнему ряду, наступает на кнопку и убегает обратно (do_timers - * seg003:0545, do_mouse seg003:0ABA, autocontrol_mouse seg002:07EB). - * - * Числа — custom-константы SDLPoP (data.h:821): уровень/комната/задержка/ - * стартовая X. Пороги разворота (166) и исчезновения (200) — литералы - * autocontrol_mouse. Задержка в ИГРОВЫХ КАДРАХ, как POP_FEATHER_FRAMES. */ -#define POP_MOUSE_LEVEL 8 -#define POP_MOUSE_ROOM 16 -#define POP_MOUSE_DELAY 150 -#define POP_MOUSE_START_X 200 -#define POP_MOUSE_TURN_X 166 /* x < этого — развернуться и уйти */ -#define POP_MOUSE_LEAVE_X 200 /* x >= этого в стойке — исчезнуть */ - -/* С какого уровня начинается игра (-DFIRST_LEVEL=N при сборке). Живёт - * здесь, а не в sprpop.c: старт уровня уехал в холодную половину цикла - * (sprpop_cold.c, банк 8), и константа нужна обеим. */ -#ifndef FIRST_LEVEL -#define FIRST_LEVEL 1 -#endif - -/* Уровень с зельем инверсии (переворот экрана). По нему делается - * ПРЕДзагрузка зеркального набора спрайтов персонажей — чтобы пауза на - * чтение 34 страниц пришлась на загрузку уровня, а не на глоток зелья. */ -#define POP_UPSIDE_LEVEL 9 - -/* Уровень ПАДАЮЩИХ ПЛИТ (custom->loose_tiles_*, seg000:1317 check_fall_flo). - * При входе в комнату 23 или 16 тринадцатого уровня вся гряда loose ряда 2 - * комнаты СВЕРХУ получает ОТРИЦАТЕЛЬНУЮ фазу — отложенный старт, — и плиты - * сыплются на Кида вразнобой. Комнаты сверху — 17 и 1 соответственно, и в - * них ряд 2 колонок 2..7 действительно loose (сверено по res2013.bin, - * ../docs/levels_12_15_plan.md §7.1). Диапазон 22..27 — надмножество: в - * комнате 1 тайл 24 пустой, и он молча пропускается. - * - * Комната 23 у этого уровня ещё и СТАРТОВАЯ, то есть плиты сыплются с - * первого кадра уровня — это его открывающая сцена, а не событие в - * середине. */ -#define POP_LOOSE_TILES_LEVEL 13 -#define POP_LOOSE_TILES_ROOM1 23 -#define POP_LOOSE_TILES_ROOM2 16 -#define POP_LOOSE_TILES_FIRST 22 /* ряд 2, колонка 2 */ -#define POP_LOOSE_TILES_LAST 27 /* ряд 2, колонка 7 */ - -/* Бесшовный выход уровня (tbl_seamless_exit, play_level_2 seg000:900). У - * оригинала это таблица по уровням, но заполнена она ровно одной парой: - * уровень 12 кончается, как только Кид попал в комнату 23 — двери уровня у - * него нет. Комната 23 у 13-го уровня СТАРТОВАЯ и совпадает геометрией - * ряда, поэтому шва не видно (../docs/levels_12_15_plan.md §1.7). */ -#define POP_SEAMLESS_LEVEL 12 -#define POP_SEAMLESS_ROOM 23 - -#endif /* POP_TUNE_H */ diff --git a/applications/SprPoP/src/pop_ui.c b/applications/SprPoP/src/pop_ui.c deleted file mode 100644 index bba7902..0000000 --- a/applications/SprPoP/src/pop_ui.c +++ /dev/null @@ -1,503 +0,0 @@ -/* - * pop_ui.c — текст, палитровый fade и full-screen примитивы (FG5, банк 9). - * - * Шрифты извлечены из SDLPoP в FONT\FONT.ATL. Внутри map/unmap разрешены - * лишь обращения к EMM/W0: всё, что ждёт кадр или трогает BIOS-палитру, - * выполняется строго после unmap. Это общий контракт для menu/title/PV. - */ -#include -#include -#include -#include -#include -#include -#include "pop_bg.h" /* POP_YOFF/POP_PLAYFIELD_H — граница игрового поля */ -#include "pop_font.h" -#include "pop_arc.h" -#include "pop_ui.h" -#include "pop_status.h" -#include "pop_music.h" /* pop_music_service — подкачка кольца в долгих фейдах */ -#include "_pop_file.h" - -typedef struct { - uint8_t base; - uint8_t ascent; - uint8_t space; - uint8_t first; /* первый код, который есть в наборе */ - uint8_t last; -} pop_font_desc_t; - -/* Тёмный набор — тот же мелкий шрифт другим цветом; глифов в нём меньше - * (см. pop_font.h), поэтому диапазон кодов хранится у каждого набора. */ -static const pop_font_desc_t font_desc[] = { - { POP_FONT_SMALL_BASE, POP_FONT_SMALL_ASCENT, POP_FONT_SMALL_SPACE, - POP_FONT_FIRST, POP_FONT_LAST }, - { POP_FONT_BIG_BASE, POP_FONT_BIG_ASCENT, POP_FONT_BIG_SPACE, - POP_FONT_FIRST, POP_FONT_LAST }, - { POP_FONT_DARK_BASE, POP_FONT_BIG_ASCENT, POP_FONT_BIG_SPACE, - POP_FONT_DARK_FIRST, POP_FONT_DARK_LAST } -}; - -static atlas_t font_at; -static uint8_t font_ready; - -/* БУФЕР ПАЛИТРЫ ПО ФИКСИРОВАННОМУ АДРЕСУ 0x4000. DSS занимает эти 256 - * байт только при загрузке программы, дальше они наши (код начинается с - * 0x4100), и держать буфер здесь дешевле, чем класть 256 байт на стек в - * каждом вызове — идея пользователя, 2026-08-25. */ -__at (0x4000) uint8_t pop_pal_buf[256]; - -static uint8_t text_index(const pop_font_desc_t *font, uint8_t ch) -{ - if (ch < font->first || ch > font->last) ch = '?'; - return (uint8_t)(font->base + ch - font->first); -} - -int pop_ui_init(void) __banked -{ - int rc; - if (font_ready) return 0; - POP_PATH_CALL(rc, atlas_load(&font_at, "FONT\\font.atl")); - if (rc != 0) return -1; - font_ready = 1; - return 0; -} - -void pop_ui_free(void) __banked -{ - if (!font_ready) return; - atlas_free(&font_at); - font_ready = 0; -} - -uint8_t pop_ui_ready(void) -{ - return font_ready; -} - -void pop_text_map(void) __banked -{ - gfx_w0_map(font_at.page); -} - -void pop_text_unmap(void) __banked -{ - gfx_w0_unmap(); -} - -uint8_t pop_text_width_mapped(pop_text_font_t font, const char *s) __banked -{ - const pop_font_desc_t *desc = &font_desc[font]; - uint8_t width = 0; - - while (*s) { - const uint8_t *img = (const uint8_t *)atlas_image(&font_at, - text_index(desc, (uint8_t)*s++)); - width = (uint8_t)(width + img[0] + desc->space); - } - return width ? (uint8_t)(width - desc->space) : 0; -} - -void pop_text_draw_mapped(pop_text_font_t font, int x, int baseline, - const char *s) __banked -{ - const pop_font_desc_t *desc = &font_desc[font]; - - while (*s) { - const uint8_t *img = (const uint8_t *)atlas_image(&font_at, - text_index(desc, (uint8_t)*s++)); - /* Пробел не рисует НИ ОДНОГО пикселя: его глиф целиком 0xFF, а - * текст всегда идёт прозрачным банком. Блит при этом стоит те же - * ~4,6 тыс. тактов, что и буква, поэтому в строке из полусотни - * символов пропуск пробелов — самая дешёвая экономия, какая тут - * есть (важно для статус-строк, они рисуются в игровом кадре). - * У крупного пробела вдобавок высота 0: для accel это 256 строк, - * и нулевой блит нельзя отдавать ядру даже noclip-вариантом. */ - if (img[2] && s[-1] != ' ') gfx_blit_noclip(x, baseline - desc->ascent, img); - x += img[0] + desc->space; - } -} - -void pop_text_center_mapped(pop_text_font_t font, int center, int baseline, - const char *s) __banked -{ - pop_text_draw_mapped(font, center - pop_text_width_mapped(font, s) / 2, - baseline, s); -} - -void pop_text_right_mapped(pop_text_font_t font, int right, int baseline, - const char *s) __banked -{ - pop_text_draw_mapped(font, right - pop_text_width_mapped(font, s), - baseline, s); -} - -/* W0 свободно: snapshot кладём в зарезервированный хвост страницы шрифта. - * 4 × 256 Б = ровно 1024 Б, [0x3C00,0x4000), и не пересекаются с атласом. */ -/* Снимок палитры лежит в странице шрифта (в W2 килобайта нет). Копируем - * memcpy, а не циклом: у SDCC это LDIR — 256 байт за ~5 400 тактов против - * примерно ста тысяч у побайтового цикла на C. Именно этот цикл и делал - * пересчёт палитры шестикадровым (замер 2026-08-26). */ -static void snapshot_chunk(uint8_t chunk, uint8_t *buf, uint8_t store) -{ - uint8_t *slot; - - gfx_w0_map(font_at.page); - slot = (uint8_t *)(POP_FONT_SNAPSHOT_OFF + (uint16_t)chunk * 256u); - if (store) memcpy(slot, buf, 256); - else memcpy(buf, slot, 256); - gfx_w0_unmap(); -} - -/* Снимок палитры целиком: дробить на мелкие порции больше не нужно — - * причина скрежета была не в длительности BIOS-вызова, а в том, какое окно - * он под себя забирал (см. pop_pal_buf выше). */ - -void pop_ui_palette_snapshot(void) __banked -{ - uint8_t chunk; - - if (!font_ready) return; - for (chunk = 0; chunk < 4; chunk++) { - gfx_pal_get(0, (uint8_t)(chunk << 6), 64, pop_pal_buf); - snapshot_chunk(chunk, pop_pal_buf, 1); - } -} - -/* Из одного исходного снимка приготовить обе экранные палитры. Умножения - * нет: шкала 1/4, 1/2, 3/4 на 8-битном значении не должна тащить делитель - * в постоянно вызываемый (во время fade) путь. */ -/* ВОСЕМЬ СТУПЕНЕЙ, а не четыре. Fade у оригинала идёт 64 шагами по два - * тика — 2,13 с плавного затухания; наши четыре ступени укладывались в - * доли секунды и выглядели как моргание, а растянуть их по времени значило - * получить четыре заметных скачка яркости. - * - * Яркость ступени — простое умножение: (v * (8 - step)) >> 3. Через - * switch с парами сдвигов выходило дороже: 768 каналов на вызов, и цепочка - * сравнений SDCC съедала больше, чем стоит само умножение. - * - * dim_step: 0 — исходная, 8 — чёрная. */ -void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked -{ - /* ТАБЛИЦА ЯРКОСТИ — НА СТЕКЕ, и это главное здесь по времени. - * - * Замер в MAME (2026-08-26): вызов стоил 2,44 млн тактов, то есть почти - * шесть кадров, из которых на BIOS-заливку палитры уходило всего 136 - * тысяч (8 x 17 000). Остальное съедал пересчёт: 768 умножений - * uint16 в кадровом цикле — на Z80 это вызов библиотечной функции на - * каждый канал. Со ста вызовами подряд (fade кадр за кадром) набегало - * больше десяти секунд — ровно то «очень долгое затемнение», которое - * поймал пользователь. - * - * Теперь таблица строится один раз на ступень (256 сложений, без - * единого умножения), а каналы её просто читают. 256 байт стека — - * дешёвая плата: в этой точке израсходована едва сотня байт из 1279. - * - * Вместе с memcpy для снимка это дало 487 тысяч тактов на вызов против - * 2,44 млн (замер в MAME 2026-08-26). */ - uint8_t lut[256]; - uint8_t chunk, i, start; - uint8_t *buf = pop_pal_buf; - - if (!font_ready) return; - if (dim_step > POP_PAL_DIM_BLACK) dim_step = POP_PAL_DIM_BLACK; - if (dim_step) { - uint8_t mul = (uint8_t)(POP_PAL_DIM_BLACK - dim_step); - uint16_t v = 0; - - /* Без умножения вовсе: значение растёт на mul/32 с каждым шагом, - * дробная часть копится в младших пяти битах аккумулятора. */ - for (i = 0; ; i++) { - lut[i] = (uint8_t)(v >> 5); - v += mul; - if (i == 255) break; - } - } - for (chunk = 0; chunk < 4; chunk++) { - start = (uint8_t)(chunk << 6); - snapshot_chunk(chunk, buf, 0); - if (dim_step) { - uint8_t *p = buf; - - for (i = 0; i < 64; i++, p += 4) { - uint8_t idx = (uint8_t)(start + i); - - if (keep_ui && idx >= 0x37 && idx <= 0x3F) continue; - p[0] = lut[p[0]]; - p[1] = lut[p[1]]; - p[2] = lut[p[2]]; - } - } - gfx_pal_load(0, start, 64, buf); - gfx_pal_load(1, start, 64, buf); - } -} - -void pop_ui_palette_restore(void) __banked -{ - pop_ui_palette_dim(0, 0); -} - -void pop_ui_palette_black(void) __banked -{ - uint8_t chunk; - uint16_t i; - uint8_t *black = pop_pal_buf; - - /* BIOS принимает максимум 64 записи за вызов; одним буфером покрываем - * все четыре четверти палитры, не занимая постоянную память. - * sizeof(black) здесь нельзя: black — 16-битный указатель, и тогда - * обнулятся лишь первые два байта, а цвет заливки останется случайным. */ - for (i = 0; i < sizeof(pop_pal_buf); i++) black[i] = 0; - for (chunk = 0; chunk < 4; chunk++) { - uint8_t start = (uint8_t)(chunk << 6); - gfx_pal_load(0, start, 64, black); - gfx_pal_load(1, start, 64, black); - } -} - -/* ДЛИТЕЛЬНОСТЬ ЗАДАЁТСЯ КАДРАМИ, А ПАЛИТРА ТРОГАЕТСЯ ВОСЕМЬ РАЗ. - * - * frames — сколько кадров луча длится затухание целиком (у оригинала это - * 2,13 с). Наивный цикл «ступень на каждый кадр» звал pop_ui_palette_dim - * сотню раз, а он не бесплатный: 4 чтения снимка по 256 байт, 768 каналов - * арифметики и 8 вызовов BIOS на палитру — около 9 мс, то есть половина - * кадра сверху на каждой итерации. Fade растягивался втрое против - * заказанного (поймано пользователем: «один fade in секунд восемь»). - * Теперь ступень пересчитывается только когда она СМЕНИЛАСЬ. */ -/* Возвращает 1, если прерван нажатием (только при skip=1). - * - * ЗАЧЕМ ПРЕРЫВАНИЕ. Fade — это 2,13 с, и на каждом стыке экранов заставки - * их два. Пока цикл был глухим, эти секунды нельзя было пропустить ничем: - * пропуск работал в сцене, но не между сценами, и заставка ощущалась - * невыключаемой. - * - * Кромка нажатия считается ОТ ВХОДА, как в сценах (intro_skip_requested): - * клавиша, которой закончили предыдущий экран, в момент входа ещё зажата, и - * принимать её за «пропустить» нельзя — иначе fade схлопывался бы сам. - * - * Прерванный fade всё равно доводит палитру до конечного состояния: экран - * не должен остаться на промежуточной ступени. */ -static uint8_t fade_run(uint8_t frames, uint8_t up, uint8_t skip) -{ - uint8_t i, shown = 0xFF, armed = 0, hit = 0; - - if (!frames) { - pop_ui_palette_dim(up ? 0 : POP_PAL_DIM_BLACK, 0); - return 0; - } - if (skip) { - kbd_raw_sync(); - armed = (uint8_t)!kbd_raw_any_down(); - } - for (i = 1; i <= frames; i++) { - uint8_t step = (uint8_t)((uint16_t)i * POP_PAL_DIM_BLACK / frames); - - if (up) step = (uint8_t)(POP_PAL_DIM_BLACK - step); - if (step != shown) { - pop_ui_palette_dim(step, 0); - shown = step; - } - /* Fade — это 2,13 с, и всё это время главный цикл стоит. Кольцо - * потокового трека дочитывает pop_music_service, иначе музыка - * замолкает прямо посреди перехода (та же причина, что у меню: - * ui_wait_frame в pop_menu.c). */ - pop_music_service(); - gfx_wait_vsync(); - if (skip) { - kbd_raw_sync(); - if (!kbd_raw_any_down()) armed = 1; - else if (armed) { hit = 1; break; } - } - } - /* Довести до края: целочисленное деление могло не дойти до 8 (или 0), - * а при прерывании мы вообще ушли с середины. */ - if (hit || shown != (up ? 0 : POP_PAL_DIM_BLACK)) - pop_ui_palette_dim(up ? 0 : POP_PAL_DIM_BLACK, 0); - return hit; -} - -void pop_ui_fade_out(uint8_t steps) __banked -{ - pop_ui_palette_snapshot(); - (void)fade_run(steps, 0, 0); -} - -void pop_ui_fade_in(uint8_t steps) __banked -{ - if (!steps) { pop_ui_palette_restore(); return; } - (void)fade_run(steps, 1, 0); -} - -/* Прерываемые варианты — для заставки и катсцен. Отдельными функциями, а не - * флагом в прежних: в меню и на переходе уровня прерывать нечего, и молча - * менять там поведение не следует. */ -uint8_t pop_ui_fade_out_skip(uint8_t steps) __banked -{ - pop_ui_palette_snapshot(); - return fade_run(steps, 0, 1); -} - -uint8_t pop_ui_fade_in_skip(uint8_t steps) __banked -{ - if (!steps) { pop_ui_palette_restore(); return 0; } - return fade_run(steps, 1, 1); -} - -uint8_t pop_screen_begin(void) __banked -{ - uint8_t page = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(page); - gfx_set_bank(GFX_BANK_NORMAL); - return page; -} - -void pop_screen_fill(uint8_t color) __banked -{ - setfillstyle(SOLID_FILL, color); - bar(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); -} - -/* Экран под ИГРУ: вне поля — цвет POP_COL_OUTSIDE, внутри — цвет 0. - * - * Зачем два разных чёрных. Вспышки (молния Джафара, урон, зелья) сделаны - * подменой ЦВЕТА 0 всей палитры — как в оригинале. Пока борта и полоса HP - * тоже были нулём, мигал весь экран целиком, вместе с рамкой и жизнями. - * Красим всё, что вне поля 320x192, отдельным индексом, а в палитре держим - * его чёрным (pop_pal_outside_apply): картинка та же, но вспышка достаёт - * только игровую область. Идея пользователя, 2026-08-25. - * - * Индексы 1..15 у нас свободны: атласы кладут либо 0xFF (прозрачность), - * либо PAL_BASE+v (0x40 и выше), шрифт — 0x3F. */ -void pop_screen_fill_game(void) __banked -{ - setfillstyle(SOLID_FILL, POP_COL_OUTSIDE); - bar(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); - setfillstyle(SOLID_FILL, BLACK); - bar(0, POP_YOFF, GFX_WIDTH - 1, POP_CLIP_BOTTOM - 1); - /* Заливка съела и обе служебные полосы — они ВНЕ игрового поля. - * Инвалидируем здесь, а не у вызывающих: точек заливки несколько - * (старт игры, смена уровня), и пропустить одну из них — ровно тот - * баг, из-за которого строка исчезала при переходе между комнатами. */ - pop_status_invalidate(); -} - -/* Только ИГРОВОЕ ПОЛЕ, без бортов. Вход в комнату перерисовывает лишь - * его: борта от комнаты к комнате не меняются, а всё, что на них живёт — - * полоса HP, статус-строка, отладочная строка — обязано вход пережить. - * Заодно это на четверть меньше заливки (192 строки вместо 256). */ -void pop_screen_fill_field(void) __banked -{ - setfillstyle(SOLID_FILL, BLACK); - bar(0, POP_YOFF, GFX_WIDTH - 1, POP_CLIP_BOTTOM - 1); -} - -void pop_screen_present(uint8_t page) __banked -{ - gfx_wait_vsync(); - gfx_set_visible_page(page); -} - -/* transition_ltr() SDLPoP: подготовленная СКРЫТАЯ страница переползает на - * видимую узкими вертикальными полосами слева направо. У оригинала - * 2px/120 FPS; здесь 4px/60 FPS даёт ту же длительность (~1,3 с), не - * удваивая число полных копий 320x256. - * - * Страницы при этом НЕ меняются местами: копируем в видимую, как оригинал - * копирует offscreen в onscreen. Поэтому у вызывающего после перехода на - * ЭКРАНЕ и в скрытой странице лежит одно и то же. */ -/* Возвращает 1, если проявление прервано НОВЫМ нажатием. - * - * Раньше функция была void и нажатие ГЛОТАЛА: полосы схлопывались, картинка - * появлялась целиком — и на этом всё, вызывающий о нажатии не узнавал. На - * заставке это выглядело как «клавиша срабатывает наполовину»: проявление - * прервалось, а в игру не ушли. - * - * Кромка считается от входа, как в сценах и в fade: клавиша, которой - * закончили предыдущий экран, ещё зажата, и принимать её за новое нажатие - * нельзя — иначе весь маршрут заставки схлопнулся бы сам собой. */ -uint8_t pop_screen_present_ltr(void) __banked -{ - gfx_rect_t stripe; - uint8_t visible = gfx_get_visible_page(); - uint8_t armed; - int x; - - kbd_raw_sync(); - armed = (uint8_t)!kbd_raw_any_down(); - gfx_set_draw_page(visible); /* source gfx_copy_page = target */ - stripe.y = 0; - stripe.h = GFX_HEIGHT; - for (x = 0; x < GFX_WIDTH; x += 4) { - kbd_raw_sync(); - if (!kbd_raw_any_down()) armed = 1; - else if (armed) { - /* Прервали — дорисовать остаток разом, а не бросить полукадр. */ - stripe.x = 0; stripe.w = GFX_WIDTH; - gfx_copy_page(&stripe, GFX_COPY_DIRECT); - return 1; - } - stripe.x = x; - stripe.w = (uint16_t)((GFX_WIDTH - x < 4) ? GFX_WIDTH - x : 4); - gfx_copy_page(&stripe, GFX_COPY_DIRECT); - pop_music_service(); /* 80 кадров перехода — см. fade_run */ - gfx_wait_vsync(); - } - return 0; -} - -/* Нарисовать одну полосу и отпустить её страницу. Общая часть обоих - * загрузчиков ниже: они отличаются только тем, откуда взялся атлас. */ -static int strip_blit(atlas_t *at, int x, int *y) -{ - const uint8_t *img; - - gfx_w0_map(at->page); - img = (const uint8_t *)atlas_image(at, 0); - /* gfx_blit_noclip ограничен шириной uint8 и обрезает 320px. */ - gfx_blit(x, *y, img); - *y += img[2]; - gfx_w0_unmap(); - atlas_free(at); - return 0; -} - -/* Полноэкранные изображения не помещаются одним getimage в EMM-страницу. - * Общий загрузчик полос держит лишь одну страницу и не трогает page flip: - * caller уже собрал скрытую страницу и сам решает, когда её показать. */ -int pop_screen_blit_atlas_strips(const char * const *parts, - uint8_t count, int x, int y) __banked -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - int rc; - - POP_PATH_CALL(rc, atlas_load(&at, parts[part])); - if (rc != 0) return -1; - strip_blit(&at, x, &y); - } - return 0; -} - -/* То же самое, но полосы лежат подряд в АРХИВЕ (заставка, story, PV): один - * `open` на весь экран вместо пяти — при цене открытия 51,4 мс против - * 32,6 мс на чтение это больше половины времени показа. */ -int pop_screen_blit_atlas_arc(pop_arc_t *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, - int x, int y) __banked -{ - uint8_t part; - - gfx_set_bank(GFX_BANK_NORMAL); - for (part = 0; part < count; part++) { - atlas_t at; - - if (pop_arc_atlas(arc, tbl, (uint8_t)(base + part), &at) != 0) - return -1; - strip_blit(&at, x, &y); - } - return 0; -} diff --git a/applications/SprPoP/src/pop_ui.h b/applications/SprPoP/src/pop_ui.h deleted file mode 100644 index b82f082..0000000 --- a/applications/SprPoP/src/pop_ui.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * pop_ui.h — общий экранный слой PoP (FG5, банк 9). - * - * Здесь только примитивы: исходный SDLPoP-шрифт, палитровый fade и сборка - * полной страницы. Menu, title и cutscene держат собственные автоматы и - * строки, но не дублируют формат FONT.ATL или опасную работу с W0. - */ -#ifndef POP_UI_H -#define POP_UI_H - -#include - -typedef enum { - POP_TEXT_SMALL = 0, - POP_TEXT_BIG = 1, - /* Крупный шрифт вторым цветом (POP_FONT_DARK_COLOR): тень строки и - * текст на светлом фоне — так show_hof_text() SDLPoP рисует таблицу - * рекордов дважды (тень со сдвигом (1,1), затем сам текст). Набор - * обрезан по 'Z', см. pop_font.h. */ - POP_TEXT_BIG_DARK = 2 -} pop_text_font_t; - -/* Жизненный цикл единственного FONT\FONT.ATL. Загрузка — в холодном boot, - * освобождение — после закрытия графики; повторные вызовы безопасны. */ -int pop_ui_init(void) __banked; -void pop_ui_free(void) __banked; -uint8_t pop_ui_ready(void); - -/* Группа text_*_mapped требует активного pop_text_map() и не вызывает - * BIOS/ESTEX. Для прозрачных букв установить GFX_BANK_SPRITE до рисования. - * - * ВСЯ ГРУППА __banked, И ЭТО ОБЯЗАТЕЛЬНО (крэш финала, 2026-08-27). Живёт - * она в pop_ui.c, то есть в банке 9, а зовут её и из ДРУГИХ банков — HOF - * лежит в банке 10. Трамплин SDCC выбирает по объявлению, а не по тому, - * где функция реально лежит (memory sdcc_banked_call_rules): без пометки - * получается прямой `call` по адресу банка 9, который в чужом банке - * попадает в пустой хвост (0xFF) — процессор ползёт по нему до 0x0000, и - * DSS убивает процесс с кодом 0x27. Собиралось это МОЛЧА, поэтому рядом - * появилась toolchain/check_bank_calls.py — она такое ловит на сборке. */ -void pop_text_map(void) __banked; -void pop_text_unmap(void) __banked; -uint8_t pop_text_width_mapped(pop_text_font_t font, const char *s) __banked; -void pop_text_draw_mapped(pop_text_font_t font, int x, int baseline, - const char *s) __banked; -void pop_text_center_mapped(pop_text_font_t font, int center, int baseline, - const char *s) __banked; -void pop_text_right_mapped(pop_text_font_t font, int right, int baseline, - const char *s) __banked; - -/* Снимок обеих (идентичных по контракту) палитр хранится в свободном хвосте - * FONT.ATL. dim_step: 0 — исходная, POP_PAL_DIM_BLACK — чёрная; между ними - * равные ступени яркости (step/32). Тридцать две, а не четыре: fade - * оригинала длится 2,13 с, и на четырёх ступенях это четыре заметных - * скачка вместо затухания. Половина от оригинальных 64 — на глаз разницы - * с ними нет, а вот шестнадцать уже видно. - * keep_ui сохраняет диапазон 0x37..0x3F ярким для текста/рамки меню. */ -void pop_ui_palette_snapshot(void) __banked; -#define POP_PAL_DIM_BLACK 32 - -/* СКОЛЬКО КАДРОВ ЖДАТЬ, чтобы fade длился столько же, сколько у оригинала - * (fade_in_1/fade_out_1 — 64 шага по 2 тика = 128 тиков = 2,13 с, то есть - * 106 кадров луча). - * - * Ждать все 106 нельзя: пересчёт палитры не бесплатен — 487 тысяч тактов - * на ступень, то есть чуть больше кадра (замер в MAME 2026-08-26; из них - * 136 тысяч уходит на заливку через BIOS). Тридцать три ступени съедают - * около сорока кадров, и без вычитания fade растянулся бы в полтора раза - * длиннее заказанного. Ступень при этом меняется каждые 66 мс — на глаз - * это уже слитное затухание, а не лесенка. */ -#define POP_FADE_STEP_FRAMES 1 /* цена одного пересчёта, кадров луча */ -#define POP_FADE_FRAMES (106 - (POP_PAL_DIM_BLACK + 1) * POP_FADE_STEP_FRAMES) - -void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked; -void pop_ui_palette_restore(void) __banked; - -/* Немедленно погасить все 256 цветов обеих страниц. В отличие от dim(), - * не требует загруженного FONT.ATL: это ранний экран запуска, когда в VRAM - * ещё может лежать картинка предыдущей программы. */ -void pop_ui_palette_black(void) __banked; - -/* Пошаговый fade к снимку: fade_out сначала делает снимок, fade_in требует - * его сохранить. Каждый шаг показывается на следующем фронте. */ -void pop_ui_fade_out(uint8_t steps) __banked; -void pop_ui_fade_in(uint8_t steps) __banked; -/* То же, но прерывается НОВЫМ нажатием; 1 — прервано. Палитру всё равно - * доводит до конца, экран не остаётся на промежуточной ступени. */ -uint8_t pop_ui_fade_out_skip(uint8_t steps) __banked; -uint8_t pop_ui_fade_in_skip(uint8_t steps) __banked; - -/* Полная экранная страница: begin выбирает скрытую страницу, fill рисует - * непрозрачный фон и present делает ГОТОВУЮ страницу видимой на фронте. - * Текст на второй странице надо нарисовать заново — GFX_BANK_SPRITE не - * меняет shadow-копию, и это сознательный контракт временного UI. */ -uint8_t pop_screen_begin(void) __banked; -void pop_screen_fill(uint8_t color) __banked; -/* Индекс палитры для всего, что ВНЕ игрового поля 320x192 (борта, полоса - * HP). В палитре он чёрный, но НЕ нулевой — поэтому вспышки, которые - * подменяют цвет 0, не задевают рамку и жизни. */ -#define POP_COL_OUTSIDE 1 -/* Подготовить экран под игру: вне поля POP_COL_OUTSIDE, внутри — цвет 0. - * Звать на СТАРТЕ и смене уровня; заодно сбрасывает служебные полосы. */ -void pop_screen_fill_game(void) __banked; -/* Только игровое поле (борта и всё, что на них, не трогает) — это путь - * входа в комнату. */ -void pop_screen_fill_field(void) __banked; -void pop_screen_present(uint8_t page) __banked; -/* Показать подготовленную скрытую страницу полосами слева направо - * (transition_ltr оригинала). Любая зажатая клавиша достраивает переход - * мгновенно. Страницы местами не меняются: содержимое копируется в - * видимую, поэтому после возврата обе страницы одинаковы. */ -/* 1 — проявление прервано новым нажатием (остаток дорисован разом). */ -uint8_t pop_screen_present_ltr(void) __banked; - -/* Нарисовать в уже выбранную draw-страницу набор вертикальных полос SPA1. - * Полоса загружается, блитится и тут же освобождается; функция не вызывает - * BIOS/vsync, поэтому её можно безопасно применять в title и cutscene. - * Возвращает -1 при ошибке чтения очередной полосы. */ -int pop_screen_blit_atlas_strips(const char * const *parts, - uint8_t count, int x, int y) __banked; - -/* Те же полосы, но из архива ресурсов: элементы base..base+count-1. - * Один `open` на экран вместо одного на полосу. */ -int pop_screen_blit_atlas_arc(struct pop_arc_s *arc, const uint8_t *tbl, - uint8_t base, uint8_t count, - int x, int y) __banked; - -#endif /* POP_UI_H */ diff --git a/applications/SprPoP/src/pop_vflip.c b/applications/SprPoP/src/pop_vflip.c deleted file mode 100644 index df45a23..0000000 --- a/applications/SprPoP/src/pop_vflip.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * pop_vflip.c — таблица «страница атласа -> её ВЕРТИКАЛЬНО ЗЕРКАЛЬНАЯ пара» - * (зелье инверсии, уровень 9). См. pop_vflip.h. - * - * Сами зеркальные ленты делает упаковщик (`vflip_cols` в pop_pack_kid.py) и - * кладёт рядом с обычными: kid0_v.atl, sword_v.atl, g0_v.atl… Здесь остаётся - * только связать пары: зеркальный файл грузится обычным atlas_load, а его - * раскладка байт-в-байт совпадает с оригиналом — значит движку достаточно - * подменить НОМЕР СТРАНИЦЫ, которую он мапит в W0. - * - * Почему не считаем в рантайме (замеры MAME 2026-08-12, такты Z80): - * загрузка одной 16-КБ страницы с HDD — 970 003 такта (0.045 с); - * разворот той же страницы на месте — 12 645 582 такта (0.59 с). - * Даже идеальная конвертация (accel-копия + asm-реверс) даёт ~1.05 млн — - * то есть в лучшем случае сравнивается с чтением готового файла, а стоит - * asm-модуля. На все 34 страницы: 1.5 с загрузки против 20 с разворота. - * - * РЕЗИДЕНТ: pop_vflip_page зовёт отрисовка персонажей (банк 4) на каждый - * спрайт — трамплин тут ни к чему, а кода всего ничего. - */ -#include -#include -#include "pop_vflip.h" - -/* Персонажных страниц: 28 (Кид) + 5 (страж) + 1 (меч) = 34; с запасом. */ -#define VF_MAX 40 -static uint8_t vf_src[VF_MAX]; /* страница оригинала */ -static atlas_t vf_atl[VF_MAX]; /* зеркальный атлас (его page) */ -static uint8_t vf_n; - -/* Взять УЖЕ ЗАГРУЖЕННЫЙ зеркальный атлас под своё управление (дальше его - * освобождает pop_vflip_reset). Нужен тем, кто читает зеркала не файлом, а - * куском архива ресурсов: загрузку делает вызывающий, связывание — мы. */ -int pop_vflip_take(const atlas_t *orig, const atlas_t *mirror) -{ - if (!orig || !mirror || vf_n >= VF_MAX) return -1; - vf_atl[vf_n] = *mirror; - vf_src[vf_n] = orig->page; - vf_n++; - return 0; -} - -uint8_t pop_vflip_page(uint8_t src) -{ - uint8_t i; - for (i = 0; i < vf_n; i++) - if (vf_src[i] == src) return vf_atl[i].page; - return 0; /* пары нет — рисуем обычным атласом */ -} - -uint8_t pop_vflip_ready(void) { return vf_n != 0; } - -void pop_vflip_reset(void) -{ - uint8_t i; - for (i = 0; i < vf_n; i++) atlas_free(&vf_atl[i]); - vf_n = 0; -} diff --git a/applications/SprPoP/src/pop_vflip.h b/applications/SprPoP/src/pop_vflip.h deleted file mode 100644 index f031fbd..0000000 --- a/applications/SprPoP/src/pop_vflip.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * pop_vflip.h — ВЕРТИКАЛЬНО ЗЕРКАЛЬНЫЕ наборы спрайтов персонажей - * (зелье инверсии, уровень 9). Реализация и замеры — в pop_vflip.c. - * - * Кому нужно. Фон и все row-major спрайты переворачиваются даром (порядок - * строк = знак страйда, gfx_blit_*_vflip), а персонажи лежат КОЛОНКАМИ — - * у них даром получается горизонтальное зеркало, а вертикальное требует - * развернуть байты внутри колонки. Такой набор готовит упаковщик - * (kid0_v.atl, sword_v.atl, g0_v.atl…), а здесь он только грузится и - * связывается с оригиналом. Правило вызывающего: - * - * страница = pop_upside ? pop_vflip_page(a->page) : a->page; - * if (!страница) страница = a->page; // набор не загружен - * - * Ни смещения лент, ни размеры кадров, ни горизонтальный флип при этом не - * меняются: зеркальный файл имеет ТУ ЖЕ раскладку, отличаются только пиксели. - * - * КОГДА ГРУЗИТЬ — на усмотрение приложения: pop_vflip_load_all можно звать - * где угодно (старт игры, показ интро, вход на уровень с зельем). До - * загрузки движок просто рисует неперевёрнутыми кадрами — это заметно, но - * не ломает ни кадр, ни физику. - */ -#ifndef POP_VFLIP_H -#define POP_VFLIP_H - -#include -#include - -/* Зеркало УЖЕ загружено из архива: таблица - * забирает его себе, и дальше он освобождается вместе с остальными. */ -int pop_vflip_take(const atlas_t *orig, const atlas_t *mirror); - -/* Страница-зеркало для страницы src; 0 — пары нет (набор не загружен). */ -uint8_t pop_vflip_page(uint8_t src); - -/* Загружен ли хоть один зеркальный атлас (чтобы не грузить дважды). */ -uint8_t pop_vflip_ready(void); - -/* Освободить весь набор (смена набора спрайтов соперника / уровня). */ -void pop_vflip_reset(void); - -/* Загрузить ВЕСЬ зеркальный набор: страницы Кида, меч и текущий набор - * соперника. Идемпотентна — повторный вызов ничего не делает. 0 — OK, - * -1 — что-то не загрузилось (движок останется на обычных кадрах). - * Живёт в банке 8 (pop_kboot.c): зовётся раз за игру/уровень. */ -int pop_vflip_load_all(void) __banked; - -#endif /* POP_VFLIP_H */ diff --git a/applications/SprPoP/src/sprpop.c b/applications/SprPoP/src/sprpop.c deleted file mode 100644 index a3216ab..0000000 --- a/applications/SprPoP/src/sprpop.c +++ /dev/null @@ -1,1084 +0,0 @@ -/* - * sprpop.c — проверка порта статического фона (Шаг 3): рисует комнату 1 - * уровня 1 реальной композицией слоёв (pop_bg.c) и держит на экране. - * Сверять на MAME с эталоном applications/PoP/toolchain/1.1-2.png. - */ -#include -#include -#include -#include -#include -#include -#include /* gfx_copy_page — вход в комнату и переворот */ -#include "pop_bg.h" -#include "pop_kid.h" -#include "pop_ctrl.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_redraw.h" -#include "pop_geom.h" /* pop_y_to_row, TILE_SIZEX — тайл объекта */ -#include "pop_sfx.h" -#include "pop_music.h" /* pop_sfx_tick — решение о запуске звука за кадр */ -#include "pop_guard.h" -#include "pop_cdraw.h" /* общая отрисовка персонажей (слоты Кид/соперник) */ -#include "pop_cheat.h" -#include "pop_tune.h" -#include "pop_vflip.h" /* зеркальный набор персонажей (зелье инверсии) */ -#include "pop_pace.h" /* фиксированный логический кадр по лучу */ -#include "sprpop_cold.h" /* холодная половина цикла — в банке */ -#include "pop_qsave.h" -#include "pop_status.h" -#include "pop_timer.h" -#include "pop_menu.h" /* pause menu — банк 9, команды наружу */ -#include "pop_settings.h" /* единая модель скорости/звука/читов */ -#include "pop_app.h" /* автомат приложения: игровой цикл = PLAYING */ -#include "pop_timer.h" /* global 60-minute timer — bank 9 */ -#include "pop_title.h" /* исходная графическая title sequence — bank 9 */ -#include "pop_intro.h" /* story + Princess/Jaffar после title — bank 11 */ -#include "pop_flow.h" /* таблица pre-level cutscene — bank 9 */ -#include "pop_demo.h" /* attract mode level 0 — bank 9 */ -#include "pop_pal.h" /* lifecycle палитры title/intro/level */ -#include "pop_hof.h" /* persistent Hall of Fame — bank 9 */ -#include "pop_ui.h" /* чёрные обе страницы перед сменой палитры */ -#include "_pop_file.h" /* cwd приложения для старых DSS */ - -#include -#include - -__sfr __at (0xFE) io_border; - -/* ПРОФИЛИРОВАНИЕ ПОЛОСАМИ БОРДЮРА (включено по умолчанию; make PROF=0 — - * выключить). Цвет бордюра держится, пока фаза считает, поэтому высота - * полосы на скриншоте = время фазы в растровых строках. Это единственный - * способ смотреть профиль без дебаггера: выборка PC вырождается (мост MAME - * отвечает из фреймового колбэка, все сэмплы падают в обработчик - * прерывания); точные такты — breakpoint'ы с {printf totalcycles; g}. - * - * ЦВЕТА: у бордюра Sprinter бит 0 (красный) ИГНОРИРУЕТСЯ, работают только - * бит 1 (синий) и бит 2 (зелёный) — значит различимых состояний ровно - * ЧЕТЫРЕ, и значения обязаны быть чётными. Отсюда фазы сгруппированы по - * четыре, а не по семь (нечётные номера раньше сливались с соседями и - * полосы не читались): - * 0 чёрный — ожидание vsync (запас кадра) - * 2 синий — ввод, heal и ЛОГИКА (kid_tick/физика/страж) - * 4 зелёный — слой ФОНА (loose/trobs/redraw_needed/шов) - * 6 циан — СПРАЙТЫ (страж, Kid, fore поверх них) */ -#ifndef PROF_BORDER -#define PROF_BORDER 1 -#endif -/* ВРЕМЕННО: покадровая трасса kidobj для сверки с SDLPoP (см. - * pop_dbg_kidobj в sprpop_cold.c). 0 — выключить. - * СВОЙ #ifndef, а не общий с PROF_BORDER: тот задаётся ключом сборки - * (-DPROF_BORDER=1), и всё, что лежало внутри его блока, не определялось - * вовсе — трасса молча не включалась. */ -#ifndef DBG_KIDOBJ -#define DBG_KIDOBJ 0 -#endif -#if PROF_BORDER -#define PROF(n) io_border = (n) -#else -#define PROF(n) ((void)0) -#endif - -/* Раскладка банков; их число crt0_banked получает автоматически из - * --bank флагов: 1 = guards (ИИ/боёвка), 2 = pop_bg (ГОРЯЧАЯ половина фона: fore-проход, - * оверлеи, кладка), 3 = pop_map (коллизия/физика), 4 = pop_cdraw - * (отрисовка персонажей + полоса HP), 5 = pop_ctrl (диспетчер управления), - * 6 = pop_trob (ловушки/анимация тайлов), 7 = pop_room (ХОЛОДНАЯ половина - * фона: полная отрисовка комнаты, точечные перерисовки, падающие плиты), - * 8 = sprpop_cold (ХОЛОДНАЯ половина главного цикла: старт уровня и - * отладочная навигация — см. sprpop_cold.h), 9 = pop_menu (ВСЯ работа - * с меню: автомат, рендерер, Settings и build screen; наружу только - * команды gameplay). - * Отрисовка персонажей и холодная половина фона вынесены из банка 2 - * отдельно: тот дважды подходил к 16 КБ вплотную, а расти ему ещё есть - * куда — тайлы поздних уровней, чомперы, зеркало. */ - -/* Режим читов (pop_cheat.h): на время разработки включаем в main. */ -uint8_t pop_cheats; -/* Единственная резидентная часть UI: банк 9 вызывается только по запросу, - * поэтому обычный кадр не платит трамплин. */ -uint8_t pop_menu_request; - -/* ПОТЕРЯ НАЖАТИЙ ПРИ ЗАЖАТОМ Shift — лечится ПЛОТНЫМ опросом клавиатуры. - * - * При зажатом Shift PS/2 обрамляет расширенный код «фиктивным шифтом», и - * одно нажатие стрелки превращается в 5 байт вместо 2 (отпускание — тоже - * 5). Приёмный FIFO SIO — 3 байта, а импульс запроса прерывания здесь - * теряется примерно в 44 % случаев, поэтому байты копятся и один из - * полусотни пропадает ДО чтения порта: нажатие «не срабатывает». - * - * Что НЕ помогает (замерено, TASKS_CLOSED.md/KBD-1): редкий опрос (несколько - * вызовов за кадр — они попадают туда, где прерывания и так разрешены, и - * лишь дублируют трамплин) и укорачивание DI-окон графики (в кадре вообще - * без блитов потерь БОЛЬШЕ). Снимать `di` в accel-ядрах нельзя — машина - * уходит в перезагрузку. - * - * Что помогает: опрос раз в ~0.5 мс. Столько времени берётся из ожидания - * кадра — процессор всё равно крутит там ~42 мс из 60, ничего не делая. - * Поэтому kbd_raw_poll вешается idle-хуком на gfx_wait_vsync (см. - * kbd_idle ниже); полезной работы это не отнимает. Потолок приёма - * подтверждён отдельно (tests/kbdpoll: 25 нажатий → 25, 250 байт из 250). */ - -/* Обёртка ради типа: хук — void(*)(void), а kbd_raw_poll возвращает - * «было ли что вычерпано». Приводить указатель кастом не хочется. */ -/* F10 (PS/2 set 2 — 0x09): немедленный выход. Проверяем ЗДЕСЬ, а не в - * каждом цикле ожидания: idle-хук висит на gfx_wait_vsync, то есть - * вызывается везде, где программа ждёт кадр — заставка, титры, fade, - * проявление полосами, меню, игра. Одна точка вместо десятка. */ -#define KBD_KEY_F10 0x09 - -/* НЕ static: этот же хук зовёт цикл ожидания луча (pop_wait_edge), иначе - * в геймплее F10 не работал бы вовсе — пейсинг по лучу не ходит через - * gfx_wait_vsync, к которому хук подвешен (поймано 2026-08-27). */ -void pop_idle(void) -{ - kbd_raw_poll(); - if (kbd_raw_down(KBD_KEY_F10)) pop_quit_req = 1; -} - -/* seq_2_stand (types.h seqids) — Kid стоит, ждёт ввода. */ -#define SEQ_STAND 2 -#define ROOM_1 1 -#define LINK_DOWN 3 /* сторона links: 0=L,1=R,2=U,3=D */ - - -/* ОТЛАДОЧНЫЙ ОБХОД КОМНАТ: '+'/'-' (цифровой блок либо '='/'-' основного - * ряда) — следующая/предыдущая комната уровня ПО НОМЕРУ (1..24, с обёрткой), - * Kid ставится на первый попавшийся пол. Нужен, чтобы пройти все комнаты и - * собрать список багов отрисовки, включая недостижимые обычным путём. - * Убирается закомментированием ОДНОЙ строки ниже. */ -#define ROOMNAV 1 - - -/* Рабочая копия ТЕКУЩЕЙ комнаты (W2, мутабельная: loose→empty) + срезы - * соседей для кромок. Заполняются pop_room_load из уровня. File-scope, - * чтобы enter_room переключал комнату без длинного списка параметров. */ -uint8_t room_fg[30]; -uint8_t room_bg[30]; -/* lcol_fg/rcol_fg — ШЕСТЬ записей: [0..2] кромочная колонка соседа (col9/col0), - * [3..5] следующая за ней (col8/col1) для коллизии, когда Kid стоит В шве и - * смотрит наружу (колонка −2 / 11). См. pop_level.h. */ -uint8_t lcol_fg[6], lcol_bg[3], rcol_fg[6], rcol_bg[3], below_fg[11]; -uint8_t above_fg[10], above_mod[10]; /* ряд 2 верхнего соседа (полоса кладки у потолка) */ -uint8_t cur_room; /* номер ОТРИСОВАННОЙ комнаты (drawn_room) */ -uint8_t kid_room; /* РЕАЛЬНАЯ комната Kid (S1: == cur_room; расходятся в S3 straddle) */ - -/* Рендер-смещение Kid по логической X (порт xpos_in_drawn_room): комната Kid - * слева от отрисованной → −140 (спрайт за левой кромкой), справа → +140, та - * же → 0. Звать каждый кадр перед отрисовкой персонажей. */ -static void update_kid_render_dx(void) -{ - int dx = 0; - if (kid_room != cur_room) { - if (kid_room == pop_room_link(cur_room, 0)) dx = -140; /* left neighbour */ - else if (kid_room == pop_room_link(cur_room, 1)) dx = 140; /* right neighbour */ - } - pop_char_set_render_dx(POP_CH_KID, dx); -} - -/* Change-driven редрой ЛЕВОГО шва (ворота соседа room8 видны в col0): тяжёлый - * draw_tile(0,0) в pop_room_redraw_seam_left зовём ТОЛЬКО когда openness гейта - * реально изменился. Пока Кид держит кнопку и гейт открыт — modifier стабилен - * → 0 редроёв (раньше шов рисовался безусловно КАЖДЫЙ кадр, пока сосед активен - * — тот же класс, что был у кнопки). seam_redraw=2 = обе страницы дабл-буфера. - * - * Сигнатура — ВСЕ ТРИ ряда колонки 9 соседа, а не только ряд 0: ворота в шве - * бывают в любом ряду. На уровне 1 решётка соседа стояла в (0,9), и одного - * байта хватало; на уровне 4 плита комнаты 1 открывает ворота (1,9) комнаты 8 - * — изменение приходило в m[19], сигнатура его не видела, редрой не - * заказывался, и открытые ворота оставались нарисованными закрытыми - * (BUG-GATE-SEAM-ROW1). */ -/* Кнопка в шве (SEAM-BUTTON-STALE). Сигнатурой служил ТОЛЬКО modif, а у - * кнопки modif — это индекс LINKLOC, то есть константа уровня: нажатие живёт - * в doorlinks2 (get_doorlink_timer, seg007:0BB6). Изменение в сигнатуру не - * приходило, редрой не заказывался — и шов оставался нарисованным в том - * состоянии, в каком был на входе в комнату: кнопка (1,9) комнаты 11, она же - * (1,−1) комнаты 24, залипала нажатой (или отжатой), хотя связь срабатывала. - * Видимой её делает draw_tile: нажатый opener рисуется как ПОЛ (seg008 - * get_tile_to_draw), а у пола есть правая грань, у кнопки — нет. - * Поэтому в сигнатуру ряда подмешиваем бит «кнопка нажата». */ -uint8_t seam_row_sig(const uint8_t *m, const uint8_t *lfg, uint8_t r) -{ - uint8_t code = (uint8_t)(lfg[r] & 0x1F); - uint8_t mod = m[9 + r * 10]; - if (code == 0x0F || code == 0x06) /* opener / closer */ - return (uint8_t)((pop_doorlink2(mod) & 0x1F) > 1); - return mod; -} - -uint8_t seam_sig[3]; /* последняя нарисованная openness гейта в шве */ -uint8_t seam_rows; /* маска рядов, ждущих редроя (переживает 2 кадра) */ -uint8_t seam_redraw; /* оставшиеся кадры редроя (обе страницы) */ - -/* checkpoint (seg000:270): взводится, когда Кид уходит ВЛЕВО в комнату 7 - * уровня 3 (level3_set_chkp, seg002:0665); по нему do_startpos подменяет - * стартовую позицию. Сбрасывается началом игры и прохождением уровня — - * ровно как в оригинале (seg003:37 и seg003:413). */ -uint8_t pop_checkpoint; - -/* Изменения тайлов (упавшая плита → пусто, щебень на месте приземления - * куска, поднятый предмет → пол) пишутся ПРЯМО В УРОВЕНЬ — - * pop_level_set_tile, как в оригинале (curr_room_tiles[…] = …). Раньше тут - * жила таблица переопределений на 8 записей, и девятая правка молча - * терялась: разбитые плиты и выпитые зелья «возвращались» при возврате в - * комнату (BUG-LVLSTATE-1). */ -#define TILE_DEBRIS 0x0E -#define TILE_CLOSER 0x06 -#define TILE_OPENER 0x0F -#define TILE_TORCH 0x13 -#define TILE_TORCH_DEBRIS 0x1E -#define TILE_EMPTY 0x00 -#define TILE_FLOOR 0x01 - -/* Поднятый предмет (меч): tilepos и счётчик «запечь пол» по страницам. - * flash_on — вспышка фона активна (нулевая запись палитры подменена). */ -static uint8_t item_pos, item_bake, flash_on; - -/* Подмена НУЛЕВОЙ записи палитры на обеих страницах (do_flash/set_bg_attr). - * Через функцию с параметрами, а не пятью литералами в месте вызова: на - * gfx_pal_set(0,0,0,0,0) SDCC 4.5 выдаёт невалидный `ld hl, a` - * (см. build/obj/SprPoP.asm) и ассемблер падает. */ -/* Сколько кадров ЛУЧА прошло с прошлого игрового кадра. Часы считают - * именно их, а не ожидаемый делитель темпа: логический кадр не всегда - * укладывается в свой бюджет (дорогая сцена, загрузка звука), и часы, - * считавшие «по делителю», шли рывками — несколько секунд быстро, потом - * притормаживание (наблюдение пользователя 2026-08-31). Луч же идёт - * ровно, поэтому по нему время течёт равномерно. */ -static uint8_t timer_beam_delta(void) -{ - static uint8_t prev; - uint8_t now = pop_frame_tick; - uint8_t d = (uint8_t)(now - prev); - prev = now; - return d; -} - -static void flash_bg(uint8_t r, uint8_t g, uint8_t b) -{ - gfx_pal_set(0, 0, r, g, b); - gfx_pal_set(1, 0, r, g, b); -} - -int main(void) -{ - /* Дабл-буфер: front — видимая страница, back — куда рисуем. Отладочный - * тумблер «однобуфер по SPACE» убран (решение пользователя 2026-08-25): - * дабл-буфер теперь безусловный, а SPACE свободен под игру. */ - uint8_t front = 0, back, frozen = 0; - uint8_t pace_prev = 0; /* edge клавиши смены режима скорости */ - uint8_t skip = 0; /* маска «слот перерисовывать не надо» */ - uint16_t dead_frames = 0; -#ifdef ROOMNAV - uint8_t nav_prev = 0; - uint8_t freeze_prev = 0; - uint8_t dbgbar_prev = 0; -#endif - uint8_t cheat_prev = 0, immo_prev = 0, sword_prev = 0, nlvl_prev = 0; - uint8_t xdec_prev = 0, xinc_prev = 0, upsd_prev = 0; - uint8_t failed = 0; - - /* До первой файловой операции запоминаем абсолютный каталог EXE. - * Без этого старый DSS теряет последний компонент cwd после OPEN пути - * с подкаталогом и следующий файл ищет уровнем выше. */ - if (pop_path_init() != 0) return 1; - - /* Загрузка ресурсов, палитра, первый экран — В БАНКЕ (sprpop_cold.c): - * отрабатывает ровно один раз за игру, а кода там на полкилобайта. */ - pop_app_reset(); - if (pop_boot() != 0) return 1; - - if (pop_ctrl_init() != 0) { /* raw-канал клавиатуры (забирает ввод у DSS) */ - closegraph(); - puts("kbd_raw open failed"); - return 1; - } - gfx_set_idle_hook(pop_idle); /* вычерпывать FIFO, пока ждём кадр */ - if (!pop_app_dispatch(POP_APP_EV_BOOT_READY)) { - pop_shutdown(); - return 1; - } - /* Экран версии при запуске БОЛЬШЕ НЕ ПОКАЗЫВАЕТСЯ (решение пользователя - * 2026-08-27): единственная его точка — пункт ABOUT в меню паузы. - * Само состояние BUILD_INFO в автомате осталось: через него проходит - * маршрут BOOT -> TITLE, и убирать его ради одной пустой фазы незачем. */ - if (!pop_app_dispatch(POP_APP_EV_BUILD_DONE)) { - pop_shutdown(); - return 1; - } - /* Темп кадра по лучу. Если бит 5 порта 0xFE не шевелится (иное - * железо), pop_pace_* молча откатываются на прежние gfx_wait_vsync. */ - pop_pace_arm(); - - { - uint8_t qs_save_prev = 0, qs_load_prev = 0; - uint8_t quit = 0, esc_prev = 0, menu_restart = 0; - uint8_t demo_new_game, demo_finished; - uint8_t reveal_pending = 0; /* уровень готовится за чёрной палитрой */ - for (;;) { - uint8_t is_demo; - - /* F10 в любой точке — выходим, не начиная следующий маршрут. Проверка - * стоит В НАЧАЛЕ витка: заставку и титры прерывает ЛЮБАЯ клавиша (это - * штатный «пропустить в игру»), и без этой строки F10 успел бы уронить - * нас в загрузку уровня перед тем, как программа закроется. */ - if (pop_quit_req) break; - - /* Title -> intro -> demo — три самостоятельных состояния. Сцены не - * вызывают gameplay рекурсивно: после каждого return следующий маршрут - * выбирается только pop_app_dispatch(). */ - if (pop_app_state == POP_APP_TITLE) { - pop_app_event_t ev = pop_title_show() ? POP_APP_EV_NEW_GAME : - POP_APP_EV_INTRO_STARTED; - if (!pop_app_dispatch(ev)) { - failed = 1; - break; - } - } - if (pop_app_state == POP_APP_INTRO) { - /* Таблица рекордов между credits и demo показывается ВНУТРИ - * pop_intro_show — там же, где её показывает show_title(). */ - uint8_t skipped = pop_intro_show(); - pop_app_event_t ev = skipped ? POP_APP_EV_NEW_GAME - : POP_APP_EV_CUTSCENE_FINISHED; - if (!pop_app_dispatch(ev)) { - failed = 1; - break; - } - } - if (pop_app_state == POP_APP_ENDING) { - pop_ending_show(); - if (!pop_app_dispatch(POP_APP_EV_ENDING_FINISHED)) { - failed = 1; - break; - } - continue; - } - if (pop_app_state == POP_APP_HALL_OF_FAME) { - pop_hof_show(); - if (!pop_app_dispatch(POP_APP_EV_HOF_FINISHED)) { - failed = 1; - break; - } - continue; - } - - /* Enter/Esc на title/story/PV/credits и клавиша в attract-demo сходятся - * в ОДИН маршрут LEVEL_LOAD. Начальные уровень/комната берутся из - * FIRST_LEVEL и данных уровня — то есть из параметров текущей сборки. */ - if (pop_app_state == POP_APP_LEVEL_LOAD) { - if (pop_new_game_load() != 0 || - !pop_app_dispatch(POP_APP_EV_LEVEL_READY)) { - failed = 1; - break; - } - } - - /* После intro всегда запускается настоящий level 0. pop_level_switch() - * даёт тот же lifecycle, что и обычной границе уровней: новый tileset, - * актёры, палитра, обе страницы room background. Это важно, поскольку - * девелоперская сборка может до title держать дворец LEVEL=11. */ - if (pop_app_state == POP_APP_DEMO) { - pop_next_level = 0; - pop_seamless = 0; - pop_checkpoint = 0; - if (pop_level_switch() != 0) { - failed = 1; - break; - } - /* custom->demo_hitp = 4. level_switch переносит HP предыдущего - * уровня по обычному правилу, поэтому demo-вариант задаём после - * него и просим полосу HP перепечатать новое число. */ - hitp_beg_lev = 4; - pop_kid_hp_reset(); - pop_hp_invalidate(); - pop_demo_begin(); - /* show_title() SDLPoP начинает attract-demo сразу, без fade-in. - * Credits уже ушли в чёрный, intro_restore_game_palette оставил - * обе страницы чёрным растром, а level_switch успел собрать на них - * level 0. Поэтому яркую game palette можно включить одним commit: - * старый credits-кадр физически уже негде высветить. */ - pop_pal_apply(0); - (void)pop_sfx_start(); - } - is_demo = (uint8_t)(pop_app_state == POP_APP_DEMO); - if (!is_demo && pop_app_state != POP_APP_PLAYING) break; - demo_new_game = 0; - demo_finished = 0; - /* Счётчик кадров смерти живёт СНАРУЖИ витка, поэтому переживает возврат - * на заставку. Ответ игрока кнопкой его обнуляет, а вот выход по - * таймауту (24 с молчания -> title, pop_dead_prompt вернул 2) уходит - * мимо этого сброса. Без строки ниже счётчик оставался израсходованным - * на всю сессию, и в следующей игре ПЕРВАЯ же смерть мгновенно уводила - * в title, не показав «Press Button to Continue». Сбрасываем на входе - * в игровой маршрут — это закрывает и любую другую боковую дорогу - * (выпадение за нижнюю границу, смена уровня), а не только таймаут. */ - dead_frames = 0; - - while (!quit && !pop_quit_req && (pop_app_state == POP_APP_PLAYING || - pop_app_state == POP_APP_DEMO)) { - PROF(2); /* ввод + heal */ - - /* Demo читает raw-карту первым: любая клавиша начинает новую игру, - * не попадая в Pause/QuickSave/чит. pop_ctrl_auto_move() ниже raw - * вообще не трогает, поэтому карта не будет сброшена между проверкой - * и решением оболочки. */ - if (is_demo) { - kbd_raw_sync(); - if (pop_demo_user_input()) { - demo_new_game = 1; - break; - } - } - /* P — переключить режим скорости по кругу (FASTEST -> FAST -> - * NORMAL). Edge, чтоб одно нажатие = один шаг. Дефолт FASTEST - * (crt0 зануляет _DATA). Что означают режимы — pop_pace.h. */ - if (!is_demo) { - uint8_t pk = (uint8_t)(kbd_raw_down(KBD_SPEED_MODE) && - (kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL))); - if (pk && !pace_prev) { - uint8_t m = (uint8_t)(pop_speed_mode + 1); - pop_speed_mode = (uint8_t)(m >= POP_SPEED_MODES ? 0 : m); - pop_settings.speed_mode = pop_speed_mode; - } - pace_prev = pk; - } - - /* Отладочный стоп-кадр: Ctrl+F — вкл/выкл ОДНОЙ клавишей. Раньше - * занимал две голые цифры ('1' заморозить, '2' продолжить); голые - * клавиши освобождены под раскладку keys.txt. В заморозке - * пропускаем весь tick/draw/flip: картинка стоит, можно спокойно - * разбирать позу Kid и окклюзию. */ - if (!is_demo) { - uint8_t fk = (uint8_t)(kbd_raw_down(KBD_KEY_F) && - (kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL))); - - if (fk && !freeze_prev) frozen = (uint8_t)!frozen; - freeze_prev = fk; - } - /* Ctrl+D — отладочная строка (level/room/...) в верхнем борте. Тот - * же переключатель, что пунктом Settings: пишем прямо в модель - * настроек, а строку по ней перерисовывает pop_status сам. В - * POP.CFG не сохраняем — это шорткат «посмотреть», сохранение - * остаётся за экраном Settings. - * - * На Ctrl+B вешать нельзя: keys.txt держит эту комбинацию под - * «вернуться в комнату Кида» (фаза D плана keys_plan.md). */ - if (!is_demo) { - uint8_t dk = (uint8_t)(kbd_raw_down(KBD_KEY_D) && - (kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL))); - - if (dk && !dbgbar_prev) pop_settings.show_debug_bar ^= 1; - dbgbar_prev = dk; - } - /* Читы — В БАНКЕ (sprpop_cold.c): они дёргаются раз в кадр, а места - * в резиденте W1/W2 нет (см. TASKS_OPEN, MEM). */ - if (!is_demo) pop_cheat_tick(); - /* Esc — открыть меню (edge). Меню МОДАЛЬНО: пока пользователь не - * выбрал пункт, pop_menu_process не возвращается и игра стоит. - * Команды исполняет ГЛАВНЫЙ ЦИКЛ — UI не зовёт gameplay internals: - * QuickSave/QuickLoad идут тем же механизмом, что F6/F9 (запрос - * подхватит блок ниже в этой же границе кадра), рестарты исполняются - * после вычисления back-страницы (как респавн), QUIT рвёт цикл. */ - /* Меню, F10 и QuickSave/Load — целиком в банке 8 (pop_frame_ui). - * Всё это события «раз в партию», а кода на них было полсотни строк - * в резиденте; наружу остаются флаги, которые нужны самому циклу. */ - if (!is_demo) { - uint8_t want_restart = 0, dead_reset = 0; - int8_t urc = pop_frame_ui(&want_restart, &dead_reset); - - if (want_restart) menu_restart = 1; - if (dead_reset) dead_frames = 0; - if (urc) { - if (urc < 0) failed = 1; - if (urc != 1) quit = 1; /* 1 — restart game, без quit */ - break; - } - } - if (frozen) { - PROF(0); /* чёрный: ждём vsync */ - /* Заморозка — тоже полноценный логический кадр: иначе якорь - * пейсинга уедет и первый кадр после разморозки будет рваным. */ - pop_wait_edge(); - pop_pace_end(pop_pace_n((uint8_t)(Kid.sword == SWORD_2_DRAWN))); - continue; - } - -#ifdef ROOMNAV - /* Обход комнат по номеру: Ctrl++ — вперёд, Ctrl+− — назад. Голые - * +/- отданы времени, как в оригинале (keys.txt); обход — наш - * отладочный чит, поэтому уехал под Ctrl на ТЕ ЖЕ клавиши: мышечная - * память сохраняется. Edge по nav_prev: одно нажатие = одна - * комната. Сама навигация — в банке (sprpop_cold.c): она нужна - * только по клавише, а место в резиденте дефицитно. */ - if (!is_demo) { - /* Ctrl входит в САМО значение nav, а не в условие блока: иначе - * при отпускании Ctrl блок не выполнялся бы, nav_prev застревал - * ненулевым и следующее нажатие глохло на кромке. */ - uint8_t ctrl = (uint8_t)(kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL)); - uint8_t nav = !ctrl ? 0 : - (uint8_t)((kbd_raw_down(KBD_TIME_ADD_NUM) || - kbd_raw_down(KBD_TIME_ADD_MAIN)) | - ((kbd_raw_down(KBD_TIME_SUB_NUM) || - kbd_raw_down(KBD_TIME_SUB_MAIN)) << 1)); - if (nav && !nav_prev && pop_dbg_roomnav((uint8_t)(nav & 1 ? 1 : 2))) - dead_frames = 0; - nav_prev = nav; - } -#endif - - /* Рисуем в СКРЫТУЮ страницу дабл-буфера. - * Видимую перечитываем У ЖЕЛЕЗА, а не ведём свой счёт: её меняют и - * вход в комнату (ENTER-ROOM-FAST), и переворот экрана - * (pop_flip_screen), причём оба — из банка, где front недоступен. */ - front = gfx_get_visible_page(); - back = (uint8_t)(front ^ 1); - gfx_set_draw_page(back); - - /* Рестарты из меню — ЗДЕСЬ, с известной back-страницей (тот же - * контракт, что у респавна ниже). */ - if (menu_restart == 1) { /* Restart Level — штатный reset уровня */ - pop_start_level(); - dead_frames = 0; - menu_restart = 0; - } - - /* Переворот только что переключился (зелье инверсии, ур. 9) — - * привести уже нарисованное в новый вид ОДИН раз, до кадра - * (порт need_redraw_because_flipped, seg000:939). Дальше слои - * рисуют зеркально сами. */ - if (pop_upside_dirty) { - pop_upside_dirty = 0; - /* Само переключение — ЗДЕСЬ и только здесь: весь кадр обязан - * рисоваться в одной системе координат (см. pop_upside_want). */ - pop_upside = pop_upside_want; - /* Страховка для ЧИТА U на «неподготовленном» уровне и для - * случая, когда зелье выпито раньше предзагрузки: набор - * поднимается здесь же. На уровне 9 он уже загружен, и вызов - * не стоит ничего (pop_vflip_ready). */ - if (pop_upside && !pop_vflip_ready()) pop_vflip_load_all(); - pop_flip_screen(); - back = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(back); - } - pop_dbg_m13(); /* ЗАМЕР: ввод и читы разобраны */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_check_skel(); /* спецсобытие ур.3: скелет встаёт */ - pop_check_mouse(); /* спецсобытие ур.8: мышь жмёт кнопку */ - pop_check_killed_shadow(); /* спецсобытие ур.12: смерть тени = смерть Кида */ - pop_frame_timers(); /* timers (seg003:0735): вспышка слияния */ - pop_dbg_m9(); /* ЗАМЕР: pop_frame_timers сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_check_can_guard_see_kid(); /* луч видимости — ДО логики персонажей */ - pop_dbg_m14(); /* ЗАМЕР: спецсобытия + луч видимости */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - if (is_demo) demo_finished = pop_demo_tick(); - else pop_ctrl_tick(); /* ввод -> control(): смена seq */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Кто в этом кадре не изменился с прошлой отрисовки ЭТОЙ страницы — - * тот на ней уже нарисован правильно: ни стирать, ни рисовать заново - * не надо (DRAW-COST, контракт в pop_cdraw.h). Решение - * перепроверяется перед самой отрисовкой — тик ещё впереди. */ - skip = pop_char_skip_mask(); - if (!(skip & 1)) pop_char_heal(POP_CH_KID); /* стереть прошлый кадр ЭТОЙ страницы */ - if (!(skip & 2)) pop_char_heal(POP_CH_OPP); /* и прошлый кадр соперника */ - /* Отражение в зеркале — свой heal: у него нет слота pop_cd и в - * skip-маске он не участвует (рисуется/стирается безусловно, живёт - * только пока Кид стоит на тайле зеркала). */ - pop_mirror_heal(); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_fore_heal(); /* + следы оверлея (шире прямоугольника Kid) */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - PROF(2); /* логика (тот же синий) */ - pop_dbg_m1(); /* ЗАМЕР: начало логики */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - kid_tick(); /* play_seq: следующий кадр */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_phys_tick(); /* K3: падение/приземление/стена */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_tick(); /* логика стража — В БАНКЕ (guards.c) */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_phys_tick(); /* и его физика — та же, что у Кида (play_guard_frame) */ - /* Боёвка, порядок как в play_frame (seg000:872): сначала пометить - * попадания с обеих сторон, потом применить, потом свести HP. */ - pop_check_sword_hurting(); - pop_check_sword_hurt(); - /* check_sword_vs_sword (seg000:1353): кадр 167 — клинки уже - * столкнулись. Раньше сам parry работал, но эта отдельная строка - * оригинального play_frame была потеряна, поэтому звон sound 10 - * не номинировался ни в обычном бою, ни в attract-demo. */ - if (Kid.frame == FRAME_167_BLOCKED || Guard.frame == FRAME_167_BLOCKED) - pop_sfx_play(10); - pop_do_delta_hp(); - /* Порт show_time(): счётчик уменьшается только в живом игровом - * кадре. Пауза, frozen, HDD и QuickSave проходят через continue - * выше, поэтому не создают бесплатных/лишних тиков. На уровне - * Джафара время идёт до открытия двери, но истечение уже не может - * перевести игру в TIME_EXPIRED — буквально правило SDLPoP. */ - if (!is_demo && pop_timer_tick(pop_settings.time_limit_enabled, - (uint8_t)(Kid.alive < 0 && - (pop_current_level < 13 || - (pop_current_level == 13 && pop_leveldoor_open == 0))), - /* ХОД ЧАСОВ — по эталону NORMAL, а не по фактическому - * темпу: иначе FAST/FASTEST ускоряли бы и время. */ - timer_beam_delta(), - POP_PACE_BASE(Kid.sword == SWORD_2_DRAWN)) && - pop_current_level < 13) { - /* Время ИДЁТ и на уровне Джафара (до открытия двери), но - * КОНЧИТЬСЯ игра там уже не может: expired() у оригинала стоит - * под отдельным `current_level < 13` (seg000:910). На 13-м - * истечение оставляет только строку «TIME HAS EXPIRED!». */ - if (!pop_app_dispatch(POP_APP_EV_TIME_EXPIRED)) failed = 1; - break; - } - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_guard_fallout(); /* страж провалился ниже комнаты — убрать (seg002:241) */ - if (pop_fell_out) { /* Kid пересёк нижнюю границу комнаты */ - uint8_t down = pop_room_link(cur_room, LINK_DOWN); - pop_fell_out = 0; - /* Спецсобытие «выход падением» (leave_room, seg002:0504 — - * направление вниз даёт особый результат −2; разбор в главном - * цикле, seg000:0893). Уровень 6 не заканчивается дверью: Кид - * проваливается вниз из комнаты 1 и этим переходит на 7-й. - * Проверка ОБЯЗАНА идти раньше связи вниз: у комнаты 1 сосед - * снизу есть (шахта, комната 3), и без спецсобытия Кид улетал - * туда, а оттуда — в рестарт уровня. */ - if (pop_current_level == FALLING_EXIT_LEVEL && - cur_room == FALLING_EXIT_ROOM) { - Kid.y = 0xFF; /* seg000:0896 — Kid.y = −1 */ - pop_next_level = (uint8_t)(pop_current_level + 1); - } - else if (down) { /* L2: переход в комнату снизу — продолжает падать */ - pop_nav_hold = 0; /* сменил комнату НОГАМИ — чит забыт */ - enter_room(down); /* координаты Kid уже репроецированы pop_map */ - gfx_set_draw_page(back); /* вернуть текущую back для отрисовки */ - } else { /* выпал из уровня (нет комнаты снизу) — рестарт */ - pop_start_level(); - gfx_set_draw_page(back); - } - } else if (pop_leave_dir) { /* L3: уход вбок/вверх (координаты уже репроецированы) */ - uint8_t nb = pop_room_link(cur_room, (uint8_t)(pop_leave_dir - 1)); - uint8_t left = (uint8_t)(pop_leave_dir == 1); - uint8_t pop_leave_dir_prev = pop_leave_dir; - pop_leave_dir = 0; - /* level3_set_chkp (seg002:0665). ВНИМАНИЕ на комнату: оригинал - * зовёт его из leave_room ДО goto_other_room, то есть Char.room - * там ещё СТАРАЯ. Значит условие `Char.room == 7` читается как - * «Кид УХОДИТ ИЗ комнаты 7 влево» (в комнату 2), а не «входит в - * неё». Смысл: чекпойнт даётся за то, что комната 7 пройдена - * НАСКВОЗЬ, и респавн ставится туда, куда Кид только что попал. - * - * Сначала я поставил проверку на комнату НАЗНАЧЕНИЯ — и это - * поймал пользователь прогоном в SDLPoP: он умер В комнате 7, но - * влево из неё не выходил, и оригинал вернул его в стартовую - * комнату 9, а плита осталась цела. Заодно тут запоминается - * достигнутый потолок HP: смерть после чекпойнта его не отбирает. */ - if (left && pop_current_level == POP_CHKP_LEVEL && - cur_room == POP_CHKP_ROOM) { - pop_checkpoint = 1; - hitp_beg_lev = hitp_max; - } - /* Соседи чекпойнта по leave_room (seg002:0490): в ветке ухода - * ВПРАВО (pop_leave_dir == 2) — sword_disappears + meet_Jaffar, - * в ветке ВЛЕВО — Jaffar_exit. Комната во всех трёх ещё СТАРАЯ, - * как и в оригинале (goto_other_room идёт после). */ - if (pop_leave_dir_prev == 2) { - pop_sword_disappears(); - pop_meet_jaffar(); - } else if (left) { - pop_jaffar_exit(); - } - if (nb) { - /* side для pop_guard_follow — то же направление, по которому - * ищем соседа (roomleave_result оригинала). */ - pop_nav_hold = 0; /* сменил комнату НОГАМИ — чит забыт */ - enter_room_side(nb, (uint8_t)(pop_leave_dir_prev - 1)); - gfx_set_draw_page(back); - } - } - - PROF(4); /* слой фона */ - pop_dbg_m2(); /* ЗАМЕР: конец логики / начало фона */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - - pop_loose_tick(); /* loose-полы: анимация + перерисовка (СЛОЙ ФОНА */ - /* — ДО Kid, чтобы Kid всегда был поверх плиты) */ - pop_dbg_m5(); /* ЗАМЕР: pop_loose_tick сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_process_trobs(cur_room); /* пики/ворота/дверь: продвинуть СОСТОЯНИЕ (порт */ - /* process_trobs — рисования внутри нет) */ - if (pop_neigh_dirty) { - /* Тайл СОСЕДА изменился заочно (провалилась брошенная плита — - * animate_loose). Обе кромочные копии — снимки на момент входа - * в комнату, обновляем обе: g_lcol/g_rcol (коллизия у шва) и - * lcol_fg (отрисовка: колонка 9 левого соседа видна в col0 - * через draw_tile_anim_right, pop_room.c). Без второй шов - * продолжал рисовать плиту, которой уже нет — LOOSE-ROOM-CHANGE. - * Событие редкое, поэтому по сигналу, а не опросом каждый кадр. */ - uint8_t lft = pop_room_link(cur_room, 0); - pop_neigh_dirty = 0; - pop_map_refresh_edges(); - if (lft) { - uint8_t i; - pop_level_access_begin(); - for (i = 0; i < 3; i++) { - uint8_t c = pop_level_tile_raw(lft, (uint8_t)(9 + i * 10)); - if (c == (uint8_t)(lcol_fg[i] & 0x1F)) continue; - lcol_fg[i] = c; - seam_rows |= (uint8_t)(1 << i); - seam_redraw = 2; /* обе страницы дабл-буфера */ - } - pop_level_access_end(); - } - } - pop_dbg_m6(); /* ЗАМЕР: pop_process_trobs сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_redraw_needed(); - pop_dbg_m7(); /* ЗАМЕР: pop_redraw_needed сделан */ /* и разобрать пометки перерисовки тайлов (порт */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* redraw_needed, seg008:0178) — СЛОЙ ФОНА, до Kid */ - { /* ворота соседа слева (room8) видны в col0 — */ - uint8_t lft = pop_room_link(cur_room, 0); /* редрой шва ТОЛЬКО при изменении openness */ - if (lft) { - uint8_t *m = pop_trob_modif(lft); - uint8_t i, changed = 0; - /* Все ТРИ ряда колонки 9: ворота в шве бывают в любом из них - * (BUG-GATE-SEAM-ROW1, см. объявление seam_sig). */ - for (i = 0; i < 3; i++) { - uint8_t g = seam_row_sig(m, lcol_fg, i), prev = seam_sig[i]; - seam_sig[i] = g; /* СНАЧАЛА сохранить (обход SDCC z80 sub-store */ - /* бага: `if(g!=s)s=g` эмитит store РАЗНОСТИ g-s, */ - /* не g — sdcc_z80_cmp_store_a_bug) */ - if (g != prev) changed |= (uint8_t)(1 << i); - } - if (changed) { /* openness изменился → обе страницы дабл-буфера */ - /* Плюс ряд ВЫШЕ: верх решётки (draw_tile_anim_topright, - * seg008:0568 — маска 68 + кадр DOOR_FRAM_TOP) рисует не - * сам тайл ворот, а тайл над-справа от него, то есть у - * нас (r−1, 0). Он тоже анимируется вместе с openness; - * без этого чёрный треугольник над воротами оставался - * статичным, пока бары ездили (BUG-GATE-SEAM-ROW1). */ - seam_rows |= (uint8_t)(changed | (changed >> 1)); - seam_redraw = 2; - } - if (seam_redraw) { - lcol_bg[0] = m[9]; lcol_bg[1] = m[19]; lcol_bg[2] = m[29]; - pop_room_redraw_seam_left(seam_rows); - if (--seam_redraw == 0) seam_rows = 0; - } - } - } - /* Бесшовный выход уровня 12 (play_level_2, seg000:900): двери уровня - * у него нет — уровень кончается ФАКТОМ попадания в комнату 23. - * Условие «уровень ещё не сменён» обязательно: комната 23 есть и у - * 13-го, причём она там СТАРТОВАЯ, и без гарда переход зациклился бы - * (12 → 13 → 14 в первом же кадре нового уровня). */ - if (pop_current_level == POP_SEAMLESS_LEVEL && - pop_next_level == pop_current_level && - !pop_nav_hold && /* не по чит-телепорту, см. pop_state.c */ - kid_room == POP_SEAMLESS_ROOM) { - pop_next_level = (uint8_t)(pop_current_level + 1); - pop_seamless = 1; - } - /* WIN_LEVEL/WIN_ROOM SDLPoP: скрытый 14-й уровень заканчивается - * входом в room 5. Не подменяем это `next_level=15`: уровня 15 в - * сборке принципиально нет, а ending — самостоятельное состояние. */ - if (!is_demo && pop_flow_is_ending(pop_current_level, kid_room)) { - if (!pop_app_dispatch(POP_APP_EV_ENDING_STARTED)) { - failed = 1; - quit = 1; - } - break; - } - /* В level 0 нет обычной победы: достигли последней комнаты, умерли - * или доиграли запись — показать текущий кадр и затем вернуться в - * title. В частности, не вызываем level_switch(0->1). */ - if (is_demo && (kid_room == 24 || pop_kid_dead)) demo_finished = 1; - /* Смена уровня целиком уехала в банк 8 (pop_level_change): это - * событие раз в несколько минут, а кода на нём было под сотню строк - * в самом горячем месте программы — резидент W1 у нас в дефиците. */ - if (!is_demo && pop_next_level != pop_current_level) { - /* КОНЕЦ УРОВНЯ ЖДЁТ МЕЛОДИЮ (порт seg003:387, play_level_2): - * - * if (next_level == current_level || check_sound_playing()) - * draw_game_frame(); ... // экран уровня живёт - * else { stop_sounds(); return next_level; } - * - * То есть пройденный уровень остаётся на экране — с анимацией - * факелов, идущим таймером и всем прочим — ровно столько, - * сколько звучит трек конца уровня; мы же уходили на смену - * уровня сразу и обрывали мелодию на первых нотах. - * - * «Звучит» — это pop_music_active(), а не busy: между заявкой - * на трек и первой нотой проходит 190-230 мс на открытие - * файла и чтение первой полустраницы, и в этой щели busy ещё - * ложен (замер — docs/sound_plan.md §9). Раньше щель - * закрывал счётчик по длине записи, но он же тянул за собой - * зависимость EXE от набора музыки и жёсткий делитель `/4`, - * враньё которого вылезало в быстрых режимах (там кадр 3 - * луча, а не 4). Состояние «заявка/загрузка/звучание» - * закрывает щель без единой константы. - * - * ЗВУК ВЫКЛЮЧЕН — ПАУЗЫ НЕТ, и это тоже верно: pop_sfx_play - * не кладёт заявку при !pop_snd_ok, все три признака ложны, и - * уровень меняется сразу. Ровно так в оригинале, где трек - * ставится под `if (is_sound_on)` (seg006:651), а ожидание — - * `check_sound_playing()` (seg003:387). */ - if (!pop_music_active() && pop_level_change(back) != 0) { - failed = 1; quit = 1; break; - } - } - if (!is_demo && pop_kid_dead) { /* demo после смерти завершается, без respawn */ - dead_frames++; - /* Просьба нажать кнопку, мигание и таймаут — в банке - * (pop_status.h). Место возрождения выбирает pop_start_level: - * на части уровней это НЕ старт, а уже пройденный чекпойнт. */ - uint8_t dr = pop_dead_prompt(dead_frames); - if (dr == 2) break; /* 288 тиков молчания -> title */ - if (dr) { - dead_frames = 0; - pop_start_level(); - gfx_set_draw_page(back); - } - } - if (pop_loose_fell) { /* remove_loose: сама плита исчезла */ - uint8_t fpos = (uint8_t)(pop_loose_fell - 1); - pop_loose_fell = 0; - pop_level_set_tile(cur_room, fpos, TILE_EMPTY); - } - if (pop_loose_exit) { /* кусок приземлился в НЕ отрисованной комнате */ - /* Комнату и тайл посадки считает сам кусок (pop_room.c): он летит - * через комнаты честным mob_down_a_row, а не «одним переходом - * вниз», как было раньше. Здесь остаётся то, что положено - * loose_land (seg007:11E8): щебень на месте посадки и КНОПКА - * под ним. */ - uint8_t lroom = pop_loose_exit_room; - uint8_t lpos = (uint8_t)(pop_loose_exit - 1); - uint8_t tt = pop_level_tile(lroom, lpos); - pop_loose_exit = 0; - /* На opener подставляется button_type = щебень, то есть «открыть - * НАСОВСЕМ» (modifier 0xFF). Второе место того же порта: своя - * комната — в pop_map.c. */ - if (tt == TILE_OPENER || tt == TILE_CLOSER) - pop_trigger_button(lroom, lpos, - (uint8_t)(tt == TILE_OPENER ? TILE_DEBRIS : tt), - pop_trob_modif(lroom)[lpos], 1); - /* На факеле остаётся отдельный тайл «факел с щебнем» - * (seg007:1067), а не обычный щебень. */ - pop_level_set_tile(lroom, lpos, - (uint8_t)((tt == TILE_TORCH || tt == TILE_TORCH_DEBRIS) - ? TILE_TORCH_DEBRIS : TILE_DEBRIS)); - } - if (pop_ceil_fell) { /* провалилась плита-ПОТОЛОК (ряд 2 комнаты сверху) */ - uint8_t ccol = (uint8_t)(pop_ceil_fell - 1); - uint8_t up = pop_room_link(cur_room, 2); - pop_ceil_fell = 0; - if (up) pop_level_set_tile(up, (uint8_t)(20 + ccol), TILE_EMPTY); /* колодец */ - } - if (pop_debris_at) { /* кусок лёг в ЭТОЙ комнате → щебень */ - pop_level_set_tile(cur_room, (uint8_t)(pop_debris_at - 1), TILE_DEBRIS); - pop_debris_at = 0; - } - if (pop_item_taken) { /* предмет поднят → тайл стал полом */ - item_pos = (uint8_t)(pop_item_taken - 1); - item_bake = 2; /* запечь на ОБЕИХ страницах */ - /* Тайл в странице уровня ставит САМА do_pickup (pop_map.c): здесь - * это было бы слишком поздно — между подбором и этим местом - * успевает пройти pop_process_trobs (BUG-POTION-STRIPE). */ - pop_add_trob(cur_room, item_pos, -1); /* меч убран — блеска больше нет */ - pop_item_taken = 0; - } - if (item_bake) { /* стереть спрайт меча из фона страницы */ - pop_floor_bake(item_pos / 10, item_pos % 10); - item_bake--; - } - /* Вспышка фона — порт flash_if_hurt/remove_flash_if_hurt (seg003:0AFC): - * do_flash(color) = set_bg_attr(0, color), т.е. подмена НУЛЕВОЙ записи - * палитры (вспыхивает всё чёрное поле). Оригинал ставит цвет и СНИМАЕТ - * его В ТОМ ЖЕ кадре, поэтому пока идёт flash_time видно СТРОБ - * «жёлтый/чёрный», а не одну длинную заливку. Снятие — после первого - * gfx_wait_vsync (ниже): цвет держится ~1 растровый кадр из трёх. - * Приоритет как в оригинале: активный flash_time > кадр урона - * (hitp_delta<0 -> ярко-красный, ровно на один кадр). */ - if (pop_flash_time) { - /* Цвет вспышки (flash_color оригинала): меч — ярко-жёлтый, зелья - * HP — красный, перо (медленное падение) — зелёный. */ - if (pop_flash_color == POP_FLASH_RED) flash_bg(255, 0, 0); - else if (pop_flash_color == POP_FLASH_GREEN) flash_bg(85, 255, 85); - else if (pop_flash_color == POP_FLASH_WHITE) flash_bg(255, 255, 255); - else flash_bg(255, 255, 85); - pop_flash_time--; - if (!pop_flash_time) pop_flash_color = POP_FLASH_YELLOW; - flash_on = 1; - } else if (pop_kid_hurt) { - flash_bg(224, 0, 48); /* color_12: игра правит его на */ - /* #E00030 (seg000:164), это не */ - /* стандартный VGA brightred */ - flash_on = 1; - } - update_kid_render_dx(); /* straddle: смещение спрайта, если kid_room≠cur_room */ - PROF(6); /* спрайты: страж, Kid, fore поверх */ - pop_dbg_m3(); /* ЗАМЕР: конец фона / начало спрайтов */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* check_mirror (seg003:0798) — ПЕРВАЯ строка draw_people - * (seg008:228A), до отрисовки кого бы то ни было: если Кид только что - * пролетел сквозь зеркало, тень должна родиться ДО того, как слот - * соперника пойдёт рисоваться, иначе кадр её проглотит. */ - pop_check_mirror(); - /* Падающие плиты, идущие ПОД Kid. Здесь, а не внутри pop_loose_tick: - * фон кадра (перепечатки тайлов, шов) обязан быть готов ДО любого - * спрайта, иначе перепечатка ложится поверх уже нарисованного куска — - * так окно задней стены и передняя грань пола оказывались на плите. */ - pop_dbg_m10(); /* ЗАМЕР: check_mirror сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_loose_mob_draw(); - pop_dbg_m11(); /* ЗАМЕР: pop_loose_mob_draw сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - { /* Кто позже — тот поверх; порядок задаёт обход тайлов, а не роль - * персонажа (см. guard_over_kid). Отрисовка одна на всех Char - * (pop_cdraw.c), различает их только слот. */ - /* Пересчёт после тика: слот, за который heal не платили, мог - * всё-таки сдвинуться — тогда бит снимется, а прошлый кадр - * сотрёт сам pop_char_draw (страховка cd_heal). */ - uint8_t g_after; - skip = pop_char_skip_mask(); - pop_dbg_m12(); /* ЗАМЕР: skip_mask сделан */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - /* Порядок «кто поверх кого» нужен, только если кого-то РИСУЕМ. - * При skip == 3 оба слота тихие, рисовать некого — а вызов стоит - * трамплина в банк 8 и двух objtile_at_char, 14 424 такта - * (замер 11/15, 2026-08-19). Перестановка безопасна: обе - * функции только читают, и читают разное — skip_mask снимок - * cd_sig, guard_over_kid габариты pop_cd прошлого кадра. */ - g_after = (skip == 3) ? 0 : guard_over_kid(); - if (!g_after && !(skip & 2)) { pop_char_draw(POP_CH_OPP); pop_char_fore(POP_CH_OPP); } - PROF(6); /* кадр Кида (тот же циан) */ - if (!(skip & 1)) pop_char_draw(POP_CH_KID); /* спрайт + брызги + клинок */ -#if DBG_KIDOBJ - /* ВРЕМЕННО: трасса для сверки с SDLPoP кадр в кадр. Место — то - * же, что у оригинала (конец add_kid_to_objtable), и ВНЕ skip: - * пропуск перерисовки не должен рвать трассу. */ - pop_dbg_kidobj(); -#endif - if (g_after && !(skip & 2)) { pop_char_draw(POP_CH_OPP); pop_char_fore(POP_CH_OPP); } - /* Брызги урона рисует сама отрисовка персонажа (порядок objtable: - * сразу после него и до клинка), а флаги снимаем здесь: соперника - * могло не оказаться в отрисованной комнате — тогда брызги просто - * пропадают, как в оригинале. Снимаем ПО ФАКТУ, а не безусловно: - * запись в кадре удара — готовая точка останова для отладки в - * MAME (watchpoint), и лишней записи каждый кадр нет. */ - if (pop_guard_hurt) pop_guard_hurt = 0; - if (pop_kid_hurt) pop_kid_hurt = 0; - } - pop_loose_mob_draw_over(); /* падающая плита НИЖЕ Kid → поверх него (y-порядок) */ - /* ПЕРЕДНИЙ СЛОЙ по пометкам — последним в кадре, как foretable у - * оригинала (draw_tables, seg008:1373). Пометки ставят сами - * объекты вокруг себя (pop_redraw.h). */ - pop_fore_needed(); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_hp_draw(); /* полоса HP — только при изменении */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - PROF(6); /* fore поверх Kid + борта */ - /* Fore-слой Кида — В КОНЦЕ, после плиты и полосы HP: окно fore-клипа - * одно на всех, и его ставит каждый, кто рисовал персонажа, поэтому - * pop_char_fore(KID) заодно возвращает окно Кида (при «соперник - * поверх» в нём остался бы соперник, и передние грани у Кида - * отсеклись бы целиком — он рисовался бы поверх столбов). */ - if (!(skip & 1)) pop_char_fore(POP_CH_KID); - /* Персонажи на этой странице приведены в порядок — след «фон трогали» - * для неё снят. ПОСЛЕ отрисовки, а не до: слой фона этого же кадра - * взводит бит и обязан быть учтён. Всё, что рисуется ниже - * (mob поверх Кида, борта), взводит его заново само. */ - pop_cd_clear(back); - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_room_clip_borders(); /* почистить борта — только в кадрах падения (гейт) */ - - /* ФИКСИРОВАННЫЙ ЛОГИЧЕСКИЙ КАДР (pop_pace.h): период = max(n, - * ceil(W)) вместо прежнего ceil(W) + 2. Раньше здесь стояли три - * gfx_wait_vsync ПОДРЯД — они отсчитывались от КОНЦА работы, из-за - * чего бюджет кадра был один растр, а превышение его на такт стоило - * целого лишнего. Теперь ждём от ЯКОРЯ начала кадра. - * - * Первый фронт — всегда: на нём и происходит tear-free своп (до - * начала картинки остаётся верхний бордер, 16 строк). Строб вспышки - * снимается ровно между первым фронтом и остальными, как и было. */ - - PROF(0); /* чёрный: ждём vsync */ - - /* Звук: решить, запускать ли заявленный за кадр эффект (порт - * play_next_sound). Место то же, что у оригинала — конец отрисовки - * кадра, seg000:954: все заявки кадра уже поданы, и из них выбирается - * важнейшая. Раньше по кадру нельзя — потеряются поздние заявки. */ - pop_sfx_tick(); - /* МУЗЫКА ПО ХОДУ ИГРЫ. Заявку положил pop_sfx_play (звук без - * оцифровки — это Adlib-трек оригинала), а диск трогаем здесь: - * первая страница читается сразу и трек уже звучит, остальные - * доливаются по одной за кадр — 33 мс на кадр, пока догоняем. */ - pop_music_service(); - - /* Обе служебные полосы — нижняя статус-строка (сообщения оригинала) - * и верхняя отладочная. Всё change-driven и целиком в банке 9, - * поэтому звать можно каждый кадр: пока показанное не изменилось, - * работы там нет. Место — ПОСЛЕ pop_hp_draw: тот делит нижнюю - * полосу с текстом. */ - pop_status_frame(cur_room); - - pop_dbg_m4(); /* ЗАМЕР: конец спрайтов */ - pop_beam_sample(); /* ТЕМП КАДРА: выборка луча (pop_pace.h) */ - pop_wait_edge(); - if (flash_on) { /* строб: цвет держался один кадр растра */ - flash_bg(0, 0, 0); - flash_on = 0; - } - /* Условие боя — буквально как у оригинала (SDLPoP seg003.c:363): - * не «идёт бой» и не «рядом страж», а «у Кида ВЫНУТ МЕЧ». */ - pop_pace_end(pop_pace_n((uint8_t)(Kid.sword == SWORD_2_DRAWN))); - gfx_set_visible_page(back); - front = back; - if (is_demo && demo_finished) break; - } - - if (quit || pop_quit_req) break; - /* Restart Game завершает только игровой цикл. Следующая итерация - * верхнего автомата начинает title/intro с самого первого экрана. */ - if (pop_app_state == POP_APP_TITLE) continue; - if (pop_app_state == POP_APP_TIME_EXPIRED) { - pop_time_expired_show(); - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)) { - failed = 1; - break; - } - continue; /* TITLE -> intro -> новый demo */ - } - /* ENDING/HOF тоже завершили внутренний игровой цикл, но это не ошибка - * протокола и не demo-result: следующая итерация верхнего автомата - * вызовет соответствующий экран. */ - if (pop_app_state == POP_APP_ENDING || - pop_app_state == POP_APP_HALL_OF_FAME) - continue; - if (pop_app_state != POP_APP_DEMO) break; - if (demo_new_game) { - /* Чистую инициализацию выполняет общий LEVEL_LOAD в начале следующей - * итерации — тот же маршрут теперь используют skip title/intro. */ - if (!pop_app_dispatch(POP_APP_EV_NEW_GAME)) { - failed = 1; - break; - } - continue; - } else if (!pop_app_dispatch(POP_APP_EV_DEMO_FINISHED)) { - failed = 1; - break; - } - } - } - - PROF(0); /* выйти с ЧЁРНЫМ бордюром (иначе цвет */ - /* последней фазы остаётся в DOS) */ - pop_shutdown(); /* снять хук, закрыть ввод/графику, отдать ресурсы */ - return failed ? 1 : 0; -} diff --git a/applications/SprPoP/src/sprpop_cold.c b/applications/SprPoP/src/sprpop_cold.c deleted file mode 100644 index 827e915..0000000 --- a/applications/SprPoP/src/sprpop_cold.c +++ /dev/null @@ -1,1504 +0,0 @@ -/* - * sprpop_cold.c — ХОЛОДНАЯ половина главного цикла, собирается в БАНК - * (--bank 8=sprpop_cold.c, окно W3). Здесь всё, что отрабатывает раз на - * уровень или только по отладочной клавише; кадровый путь остался в - * sprpop.c. Зачем разделили и что осталось снаружи — см. sprpop_cold.h. - * - * Правила банка те же, что у guards.c: состояние — в W1/W2 (данные этого - * модуля тоже, --bank-data не включён), звать можно резидент W1/W2 и другие - * __banked-модули через трамплины. - */ -#include -#include -#include "sprpop_cold.h" -#include "pop_bg.h" /* pop_loose_mob_reset — банк 7, зовём через трамплин */ -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_level.h" -#include "pop_trob.h" -#include "pop_guard.h" -#include "pop_state.h" -#include "pop_geom.h" -#include "pop_cdraw.h" /* pop_cd — инвалидация слотов после переворота */ -#include /* gfx_copy_page */ -#include "pop_tune.h" -#include "pop_ctrl.h" /* pop_ctrl_init/close — ввод поднимает и закрывает boot */ -#include "pop_shadow.h" /* запечённый набор Тени */ -#include "pop_sfx.h" /* звуковые эффекты через CBL */ -#include /* cbl_shutdown — погасить железо звука на выходе */ -#include "pop_music.h" /* pop_music_busy/free — ждём трек заставки */ -#include "pop_vflip.h" /* сброс зеркальных страниц на смене уровня */ -#include "pop_cheat.h" /* pop_cheats — режим разработки включает pop_boot */ -#include "pop_pace.h" /* pop_speed_mode — режим скорости в отладочной метке */ -#include "pop_settings.h" /* pop_settings_defaults — стартовый профиль VANILLA */ -#include "pop_cfg.h" /* pop_cfg_load — POP.CFG поверх дефолтов */ -#include "pop_flow.h" /* таблица level-flow: какая сцена перед уровнем */ -#include "pop_intro.h" /* pop_pre_cutscene_show — сцена перед уровнем */ -#include "pop_app.h" /* pop_app_dispatch — состояния приложения */ -#include "pop_pal.h" /* pop_pal_apply — гашение перед загрузкой */ -#include "pop_timer.h" /* pop_timer_minutes — выбор сцены «времени мало» */ -#include "pop_ui.h" /* POP_PAL_DIM_BLACK */ -#include "pop_menu.h" /* пауза-меню: коды выбора */ -#include "pop_qsave.h" /* QuickSave/QuickLoad по F6/F9 */ -#include "pop_status.h" /* pop_status_invalidate после меню */ -#include -#include "pop_status.h" /* статус-строка и отладочная полоса — банк 9 */ -#include "pop_menu.h" /* pop_menu_init/free — атлас UI в bank 9 */ -#include "pop_ui.h" /* ранняя чёрная палитра + snapshot стартового экрана */ -#include "pop_pal.h" /* единый lifecycle game/title/level палитр */ -#include "pop_timer.h" /* global 60-minute timer — core in bank 9 */ -#include /* puts/printf — сообщения об ошибках загрузки */ -#include - -#define SEQ_STAND 2 -#define SEQ_TURN 5 -#define SEQ_FALL 7 -#define SEQ_RUN 84 -#define ENTRY_POSE_FALL 1 /* tbl_entry_pose[1] */ -#define ENTRY_POSE_RUN 2 /* tbl_entry_pose[13] */ -#define TILE_LEVELDOOR_LEFT 16 /* tiles_16_level_door_left */ -#define TILE_EMPTY 0 -#define LINK_DOWN 3 /* сторона links: 0=L,1=R,2=U,3=D */ - -/* Во время смены уровня enter_room должен только СОБРАТЬ новую страницу. - * Физический flip делает pop_level_switch после окончательной палитры. */ -static uint8_t level_prepare; -static uint8_t level_prepared_page; - -/* find_start_level_door (seg003:02E6): дверь уровня В СТАРТОВОЙ КОМНАТЕ — - * это дверь, через которую Кид ВОШЁЛ, поэтому она открыта полностью - * (modif = 43) и заводится trob'ом типа 3 (start_level_door, seg007:0D72). - * Без этого на уровне 2 Кид материализуется внутри глухой закрытой створки: - * его стартовый тайл (комната 5, ряд 1, колонка 3) — правая половина - * той самой двери. */ -static void find_start_level_door(uint8_t room) -{ - uint8_t *m = pop_trob_modif(room); - uint8_t tp; - if (!m) return; - /* Батч-доступ к странице уровня тут не нужен: функция отрабатывает раз - * за уровень, а pop_add_trob сам лезет в W0. */ - for (tp = 0; tp < 30; tp++) { - if (pop_level_tile(room, tp) != TILE_LEVELDOOR_LEFT) continue; - m[tp] = 43; /* створка поднята полностью */ - pop_add_trob(room, tp, 3); /* ...и тут же поедет ВНИЗ (type>=3) */ - } -} - - - -/* МЕНЮ, F10 И QUICKSAVE/LOAD — граница кадра, но не горячий путь. - * - * Всё это события «раз в партию», а в главном цикле они занимали полсотни - * строк резидента W1. Здесь же держим и edge-состояния клавиш: снаружи они - * никому не нужны. - * - * restart_level — «пользователь выбрал Restart Level» (главный цикл сделает - * это сам, после вычисления back-страницы, как респавн); - * dead_reset — «QuickLoad удался, счётчик кадров смерти сбросить». - * Возврат: 0 — продолжаем кадр, 1 — выйти из игрового цикла (Restart Game), - * 2 — выйти и завершить работу (Quit), -1 — сбой диспетчера. */ -int8_t pop_frame_ui(uint8_t *restart_level, uint8_t *dead_reset) __banked -{ - static uint8_t esc_prev, qs_save_prev, qs_load_prev; - static uint8_t restart_prev; - static uint8_t intro_prev, showtime_prev, timer_prev; - uint8_t e = (uint8_t)(kbd_raw_down(KBD_MENU) || kbd_raw_down(KBD_MENU_ALT)); - uint8_t ctrl = (uint8_t)(kbd_raw_down(KBD_LCTRL) || kbd_raw_down(KBD_RCTRL)); - uint8_t menu_opened; - int8_t mrc = POP_MENU_NONE; - - if (e && !esc_prev) pop_menu_request = 1; - esc_prev = e; - menu_opened = pop_menu_request; - if (menu_opened) { - if (!pop_app_dispatch(POP_APP_EV_PAUSE)) return -1; - mrc = pop_menu_process(); - } - if (mrc == POP_MENU_QUICKSAVE) pop_qsave_request_save(); - else if (mrc == POP_MENU_QUICKLOAD) { pop_music_stop(); pop_qsave_request_load(); } - else if (mrc == POP_MENU_QUICKLOAD_BACKUP) - { pop_music_stop(); pop_qsave_request_load_backup(); } - else if (mrc == POP_MENU_RESTART_LEVEL) { pop_music_stop(); *restart_level = 1; } - else if (mrc == POP_MENU_RESTART_GAME) - return (int8_t)(pop_app_dispatch(POP_APP_EV_RESTART_INTRO) ? 1 : -1); - else if (mrc == POP_MENU_QUIT) - return (int8_t)(pop_app_dispatch(POP_APP_EV_QUIT) ? 2 : -1); - if (menu_opened) { - /* Меню переписало обе страницы целиком. Снимки слотов об этом не - * знают и продолжают считать, что персонаж на странице уже - * нарисован, — стоящий Кид оставался бы невидимым до первого своего - * движения. */ - pop_cd_forget(); - pop_status_invalidate(); - if (!pop_app_dispatch(POP_APP_EV_RESUME)) return -1; - } - /* Ctrl+Q — выход (keys.txt). Вторая клавиша выхода, F10, ловится в - * kbd_idle (sprpop.c) и работает везде, включая заставку. */ - if (ctrl && kbd_raw_down(KBD_QUIT)) - return (int8_t)(pop_app_dispatch(POP_APP_EV_QUIT) ? 2 : -1); - /* Ctrl+A — рестарт уровня: тот же путь, что и пунктом меню. */ - /* БЫСТРЫЙ ВЫХОД ИЗ СМЕРТИ. Надпись «Press Button» у оригинала ждёт, - * пока домолчит музыка смерти (seg006:1351), — так же и у нас. Чтобы - * ожидание не было принудительным, три быстрых пути (Ctrl+A, обе - * быстрые загрузки и пункты меню) музыку ГЛУШАТ: оригинал при Ctrl+A - * делает то же самое (seg000:0617, stop_sounds). */ - { - uint8_t r = (uint8_t)(ctrl && kbd_raw_down(KBD_RESTART)); - - if (r && !restart_prev) { pop_music_stop(); *restart_level = 1; } - restart_prev = r; - } - /* Ctrl+R — вернуться в заставку. Тот же переход, что «Restart Game» - * пунктом меню: автомат сам разложит title/intro с первого экрана. */ - { - uint8_t ri = (uint8_t)(ctrl && kbd_raw_down(KBD_INTRO)); - uint8_t was = intro_prev; - - intro_prev = ri; - if (ri && !was) - return (int8_t)(pop_app_dispatch(POP_APP_EV_RESTART_INTRO) ? 1 : -1); - } - /* Space — «сколько осталось» (seg000:612). Печатать самим не надо: - * ставим тот же флаг, которым пользуется автоматическое объявление - * минут, и строку соберёт time_msg() из pop_status. 2 — перебить - * текущее сообщение немедленно, как делает оригинал по этой клавише. */ - { - uint8_t sh = kbd_raw_down(KBD_SHOWTIME); - - if (sh && !showtime_prev) pop_show_time = 2; - showtime_prev = sh; - } - /* T — постоянный показ таймера. Без модификаторов: Shift+T отдан - * «добавить HP» (фаза C плана keys_plan.md), и без этой проверки один - * тап сработал бы обеими функциями сразу. */ - { - uint8_t tk = (uint8_t)(kbd_raw_down(KBD_TIMER) && !ctrl && - !(kbd_raw_down(KBD_LSHIFT) || - kbd_raw_down(KBD_RSHIFT))); - - if (tk && !timer_prev) pop_show_timer ^= 1; - timer_prev = tk; - } - /* F6/F9 только ставят запрос; файловая операция выполняется здесь, на - * границе кадров — вне окон Char и до heal/tick/draw. */ - { - uint8_t s = kbd_raw_down(KBD_QUICKSAVE); - uint8_t l = kbd_raw_down(KBD_QUICKLOAD); - - if (s && !qs_save_prev) pop_qsave_request_save(); - if (l && !qs_load_prev) { pop_music_stop(); pop_qsave_request_load(); } - qs_save_prev = s; qs_load_prev = l; - if (pop_qsave_process() > 0) *dead_reset = 1; - } - return 0; -} - -/* СМЕНА УРОВНЯ — целиком здесь, а не в главном цикле. - * - * Событие редкое (раз в несколько минут игры), а кода на нём была без - * малого сотня строк — и все они лежали в _main, то есть в резиденте W1, - * где у нас счёт на десятки байт. Наружу остаётся одно условие и один - * вызов. - * - * back — страница, в которую главный цикл рисует кадр: после загрузки - * уровня её надо вернуть себе (level_switch показывает свою). - * Возврат: 0 — уровень сменён, -1 — сбой, главный цикл завершает работу. */ -int8_t pop_level_change(uint8_t back) __banked -{ - uint8_t reveal_pending = 0; - pop_pre_cutscene_t pre = pop_flow_pre_cutscene(pop_next_level, - pop_timer_minutes); - - /* Загрузка файла уровня, спрайтов соперника и тайлсета — в - * pop_level_switch ниже. До 2/4/6/8/9/12 таблица - * flow запускает отдельное состояние CUTSCENE, как play_level() - * SDLPoP: следующий уровень не трогаем до завершения/skip. */ - if (pre != POP_PRE_NONE) { - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_STARTED)) - return -1; - pop_pre_cutscene_show(pre); - if (!pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)) - return -1; - /* Катсцена оставляет экран чёрным. Новый уровень будет - * открыт одним применением его готовой палитры. */ - reveal_pending = 1; - } else { - /* CBL глушим ДО первой же операции с палитрой. Палитра идёт - * через BIOS ($A4) с запрещёнными прерываниями: насос не - * успевает долить блок, железо крутит хвост своего буфера — - * на слух скрежет. Раньше pop_sfx_pause() звался только - * внутри pop_level_switch, то есть УЖЕ ПОСЛЕ гашения, и - * переход без катсцены (в т.ч. телепорт Shift+L) скрежетал - * почти всегда — поймано пользователем 2026-08-25. Ветка с - * катсценой свободна от этого: pop_pre_cutscene_show глушит - * звук первым действием. */ - /* Глушение снято 2026-08-28 (замер: загрузка уровня насос не - * морит — 500 вызовов подряд, максимум 245 832 такта при - * дедлайне 251 000). Прежнее обоснование — скрежет на палитре - * через BIOS ($A4 с запрещёнными прерываниями), пойманный на - * переходе без катсцены 2026-08-25. Если он вернётся, это - * единственное место, куда его надо возвращать. */ - /* Без fade: старый кадр гасим сразу и обязательно даём - * показать один чёрный растр ДО диска/перерисовки. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - pop_wait_edge(); - reveal_pending = 1; - if (!pop_app_dispatch(POP_APP_EV_LEVEL_FINISHED)) - return -1; - } - if (pop_level_switch() != 0 || - !pop_app_dispatch(POP_APP_EV_LEVEL_READY)) - return -1; - if (reveal_pending) { - /* Обе страницы и snapshot уже принадлежат новому уровню: - * включить его корректную палитру одним переходом. */ - pop_pal_apply(0); - reveal_pending = 0; - } - /* level_switch оставляет CBL закрытым: palette/fade идут через - * BIOS и при открытом буфере давали скрежет на первом кадре. */ - (void)pop_sfx_start(); - gfx_set_draw_page(back); - - return 0; -} - -/* start_level (seg003:0055) + do_startpos (seg003:01A3) + set_start_pos - * (seg003:028A). - * - * Позиция берётся ИЗ ДАННЫХ уровня (pop_level_start_*), а не из #define: - * start_pos — тайл 0..29 (row*10+col), start_dir — направление, в котором - * персонаж должен ОКАЗАТЬСЯ. - * - * Направление ИНВЕРТИРУЕТСЯ (`Char.direction = ~level.start_dir`): персонаж - * ставится спиной и доворачивается кадрами позы входа. Сама поза — из - * tbl_entry_pose (data.h:848 = {0,1,0,…,2,…}): - * 1 (уровень 1) — падение внутрь (seq_7_fall) + нажатие кнопки room5(0,2); - * это оно захлопывает решётку за спиной в первой комнате; - * 2 (уровень 13) — вбегание (seq_84_run); - * иначе — разворот на месте (seq_5_turn). - * Таблица индексируется НОМЕРОМ УРОВНЯ — pop_level_entry_pose(). */ -void pop_start_level(void) __banked -{ - uint8_t entry_pose, start_room, pos, seq = SEQ_TURN, chkp; - int8_t dir; - - pop_leveldoor_open = 0; /* seg003:97 — дверь прошлого уровня не в счёт */ - pop_music_level_start(); /* одноразовые темы уровня — заново */ - pop_feather = 0; /* seg003:189 — перо не переживает старт уровня */ - /* upside_down тоже сбрасывается стартом уровня (seg003:38/188). Если - * картинка была перевёрнута, отрисовка комнаты ниже уже пойдёт обычной - * стороной, поэтому переворачивать ничего не надо — только снять флаги. */ - pop_upside = 0; - pop_upside_want = 0; - pop_upside_dirty = 0; - entry_pose = pop_level_entry_pose(pop_current_level); - start_room = pop_level_start_room(); - pos = pop_level_start_pos(); - dir = (int8_t)~pop_level_start_dir(); - /* Особое событие: старт с чекпойнта (do_startpos, seg003:0141). - * Числа — в pop_tune.h. Плиту снимаем ПОСЛЕ pop_level_reset_tiles() - * ниже, иначе рестарт её вернёт. */ - chkp = (uint8_t)(pop_current_level == POP_CHKP_LEVEL && pop_checkpoint); - if (chkp) { - start_room = POP_CHKP_RESPAWN_ROOM; - pos = POP_CHKP_RESPAWN_TILEPOS; - dir = (int8_t)~POP_CHKP_RESPAWN_DIR; /* стартует в ПРОТИВОположную - * и разворачивается seq_5 */ - } - -#ifdef DBG_START_ROOM - /* ОТЛАДОЧНЫЙ СТАРТ: сразу в целевую комнату оптимизации, минуя проход - * уровня. Задаётся сборкой (make ROOM=15 POS=2), по умолчанию — сцена - * 11/15 из docs/perf_l11_room15.md: Кид в (0,2), справа чомпер под - * факелом, дальше второй факел и страж. - * - * Ставится ПОСЛЕ чекпойнта намеренно: отладочная позиция должна - * перебивать и его тоже, иначе рестарт уровня уводил бы Кида из - * измеряемой комнаты. Направление и позу входа не трогаем — они из - * данных уровня, как у обычного старта. */ - /* ...НО ТОЛЬКО НА СВОЁМ УРОВНЕ. pop_start_level зовётся ещё и на - * СМЕНЕ уровня, и без этой проверки отладочная позиция перехватывала - * переход: на 6-м Кид проваливается в комнате 1, а на 7-м обязан - * появиться в комнате 17 и продолжить падение вниз (спецсобытие - * «вход падением», см. ниже). Вместо этого он оказывался в - * DBG_START_ROOM/POS, спецсобытие не срабатывало вовсе, и переход 6->7 - * выглядел сломанным (поймано пользователем 2026-08-20 на сборке - * make LEVEL=6 ROOM=1 POS=18). - * - * Рестарт ТОГО ЖЕ уровня (смерть, чекпойнт) отладочную позицию - * сохраняет — ради этого она и перебивает чекпойнт выше. */ - if (pop_current_level == FIRST_LEVEL) { - start_room = DBG_START_ROOM; - pos = DBG_START_POS; - } -#endif - - /* Рестарт уровня = load_level() заново (play_level, seg003:57): в - * исходное возвращаются И модификаторы (пики/ворота), И сами тайлы — - * разбитые плиты целы, выпитые зелья на месте (BUG-RESPAWN-1), и - * убитые стражи снова живы на своих тайлах (BUG-RESPAWN-2). */ - pop_trob_reset(); - pop_level_reset_tiles(); - pop_level_reset_guards(); - pop_guard_reset(); /* start_level: Guard.direction = none */ - /* united_with_shadow = 0 (seg003:95) — состояние ПЕРСОНАЖА уровня, а не - * комнаты: pop_guard_reset зовётся и при каждом входе в комнату (из - * pop_guard_enter), поэтому гасить слияние надо здесь. */ - pop_united_shadow = 0; - pop_shadow_init = 0; - pop_guard_notice_timer = 0; /* фора Джафара — не переживает рестарт */ - pop_nav_hold = 0; /* старт уровня снимает и держатель чита */ - pop_loose_mob_reset(); /* start_level: mobs_count = 0 (seg003:88) */ - pop_loose_forget(); /* ...и фазы плит — уровень восстановлен целиком */ - /* «Особое событие: убрать loose-плиту» (do_startpos): без этого путь в - * комнату-чекпойнт после респавна остался бы непройденным. */ - if (chkp) - pop_level_set_tile(POP_CHKP_CLEAR_ROOM, - (uint8_t)(POP_CHKP_CLEAR_ROW * 10 + POP_CHKP_CLEAR_COL), - TILE_EMPTY); - - /* Кнопку жмём ДО отрисовки комнаты — как в оригинале (do_startpos - * отрабатывает раньше первого draw_room), иначе шов кадр показывал бы - * ещё не тронутое состояние решётки. */ - if (entry_pose == ENTRY_POSE_FALL) { - /* get_tile(5,2,0) + trigger_button(0,0,-1) — «нажать» кнопку room5, - * col2, row0 её же типом и модификатором (в оригинале и то и другое - * берётся из curr_* после get_tile). */ - uint8_t tp = 2; /* row0*10 + col2 */ - pop_trigger_button(5, tp, pop_level_tile(5, tp), pop_trob_modif(5)[tp], - 0 /* seg003:170 — playsound=0 */); - seq = SEQ_FALL; - } else if (entry_pose == ENTRY_POSE_RUN) { - seq = SEQ_RUN; - } - - /* Тоже ДО отрисовки комнаты: дверь, через которую вошли, обязана быть - * открыта уже в первом кадре (в оригинале find_start_level_door стоит - * между do_startpos и draw_level_first). */ - find_start_level_door(start_room); - - enter_room(start_room); - kid_init(seq, (int8_t)(pos % 10), (int8_t)(pos / 10), dir); -#ifdef DBG_START_ROOM - /* ...и поправить x: kid_init ставит `x_bump[col] + TILE_SIZEX`, а это - * ЛЕВАЯ ГРАНИЦА СЛЕДУЮЩЕЙ колонки (порт set_start_pos — в данных уровня - * стартовые позиции подобраны под такую договорённость). Отладочный - * старт называет тайл, В КОТОРОМ Кид должен оказаться, поэтому сдвигаем - * его внутрь названного: с границы физика относит Кида к колонке правее, - * и в 11/15 он стартовал прямо в челюстях (найдено пользователем - * 2026-08-19). - * - * Отступ ровно 2, а не «половина тайла»: колонку определяет не сам x, а - * ВЕСОВАЯ ТОЧКА кадра (determine_col -> dx_weight: dx позы минус - * weight-биты, с учётом направления), поэтому геометрически ровной - * середины тут нет. Число снято замером живой сцены: x = 98 при позе - * стойки даёт curr_col = 2, x = 94 — уже 1. */ - if (pop_current_level == FIRST_LEVEL) { /* см. условие выше */ - Kid.x = (uint8_t)(pop_x_bump[(pos % 10) + FIRST_ONSCREEN_COLUMN] + - TILE_SIZEX - 2); - Kid.curr_col = (int8_t)(pos % 10); - } -#endif - /* Спецсобытие «вход падением» (set_start_pos, seg003:0196): на 7-м - * уровне Кид ставится в комнату 17, а экран тут же переводится на - * комнату ПОД ней (`goto_other_room(3)`: y −= 189, ряд пересчитать) — - * он влетает в неё сверху, продолжая падение с шестого уровня. */ - if (pop_current_level == FALLING_ENTRY_LEVEL && - start_room == FALLING_ENTRY_ROOM) { - uint8_t below = pop_room_link(start_room, LINK_DOWN); - if (below) { - Kid.y = (uint8_t)(Kid.y - 189); - Kid.curr_row = pop_y_to_row((int16_t)Kid.y); - enter_room(below); - } - } - Kid.sword = 0; /* set_start_pos: sword_0_sheathed */ - /* Остальные одноразовые флаги того же set_start_pos (seg003:028A). Они - * НЕ косметика: droppedout переживал границу уровня и на следующем - * уровне заставлял стража идти «за упавшим Кидом» вниз - * (guard_follows_kid_down) — на 4-м уровне в комнате 22 страж по этому - * флагу шёл прямо в челюсти, хотя Кида он даже не видел. Взводится он - * на ПРОШЛОМ уровне: Кид сорвался с уступа в боевой позе (кадры - * 150..179, pop_map.c start_fall) — обычная концовка боя со скелетом на - * 3-м. Поймано пользователем 2026-08-24 (переход 3 -> 4 ногами, через - * дверь уровня; читом Shift+L старт чистый, и баг не воспроизводился). */ - pop_droppedout = 0; - offguard = 0; - knock = 0; - /* play_level (seg003:106): have_sword = level >= have_sword_from_level - * (=2); исключение — demo level 0, где меч уже выдан. */ - pop_have_sword = (uint8_t)(pop_current_level == 0 || pop_current_level >= 2); - /* seamless (seg003:158): пришли БЕЗ двери уровня, прямо на бегу — HP не - * трогаем, оно переезжает как есть. Флаг одноразовый: у оригинала его - * гасит заставка «LEVEL N», которую этот же переход и пропускает. */ - if (pop_seamless) { pop_seamless = 0; pop_kid_hp_carry(); } - else pop_kid_hp_reset(); - /* ПОЛОСУ HP — НА ОБЕИХ СТРАНИЦАХ. Старт уровня перерисовал фон, то есть - * стёр её, а сама она обновляется только при ИЗМЕНЕНИИ чисел. После - * Ctrl+A с выросшим за уровень максимумом (большой кувшин, чит Shift+T) - * это давало моргание: одна страница показывала старые деления, вторая - * новые (поймано пользователем 2026-08-27). invalidate ровно для этого - * и заведён — см. его шапку в pop_cdraw.c. */ - pop_hp_invalidate(); -} - -/* ---- ОТЛАДКА: обход комнат по номеру -------------------------------- * - * - * Нужен, чтобы пройти все комнаты уровня и собрать список багов отрисовки, - * включая недостижимые обычным путём. - * - * Здесь БЫЛ pop_trob_reset() перед enter_room — «чтобы каждая комната - * смотрелась в исходном состоянии». Убран: reset обнуляет room_seen, и - * модификаторы перечитываются из уровня заново, то есть чит ОТМАТЫВАЕТ МИР - * — открытые/закрытые ворота, выдвинутые пики, нажатые кнопки. Навигация - * обязана только телепортировать; исходное состояние даёт перезапуск. */ -uint8_t pop_dbg_roomnav(uint8_t dir) __banked -{ - uint8_t r, i, c, pos = 20, any = 0xFF; - - /* Кид МЁРТВ: сначала честный рестарт уровня, потом телепорт. Навигация - * только переставляет Кида (kid_init + сброс HP), то есть «оживляет» его - * мимо start_level — а тот обязан вернуть тайлы, модификаторы и ОЧИСТИТЬ - * слот соперника (seg003:100: Guard.direction = dir_56_none). Без этого - * после смерти оставался живой скелет рядом с вернувшейся кучей костей. */ - if (pop_kid_dead) pop_start_level(); - - r = cur_room; - r = (dir == 1) ? (uint8_t)(r == 24 ? 1 : r + 1) - : (uint8_t)(r == 1 ? 24 : r - 1); - enter_room(r); - - /* Куда поставить Кида в новой комнате: пол С МАКСИМАЛЬНЫМ Y — сначала - * НИЖНИЙ ряд (2), потом 1, и только потом 0 (пользователь 2026-08-11). - * Раньше брался первый пол подряд, то есть почти всегда (0,0) — верхний - * левый угол: это и «прилёт» в проём/ворота, и, на уровне 5, посадка - * вплотную к тени спецсобытия, которая ждёт в колонке −1 ряда 0. Вместо - * сцены кражи зелья начиналась схватка, которой в этой комнате быть не - * должно. Снизу вверх нужно и самой навигации: в верхнем ряду пола чаще - * нет, и Кид проваливается из комнаты сразу после телепорта. - * - * ИСКЛЮЧЕНИЕ — комната 14 уровня 7 (пользователь 2026-08-12): её проходят - * СВЕРХУ ВНИЗ (с ряда 0 на ряд 2 через зацеп за кромки), и с нижнего ряда - * этот спуск не проверить вовсе. Пол в ряду 0 там есть, так что Кид не - * проваливается. - * - * В каждом ряду сначала ищем ОБЫЧНЫЙ пол, и только если его там нет — - * любой проходимый tile_is_floor (seg001: всё, кроме пустоты, верха - * колонны, верха двери, стены и «половинок» 26..29). */ - { - int8_t row, step = -1, first = 2; - if (pop_current_level == GRAB_DOWN_LEVEL && - r == GRAB_DOWN_ROOM) { first = 0; step = 1; } - for (row = first; row >= 0 && row <= 2 && any == 0xFF; - row = (int8_t)(row + step)) { - uint8_t fallback = 0xFF; - for (i = (uint8_t)(row * 10); i < (uint8_t)(row * 10 + 10); i++) { - c = (uint8_t)(room_fg[i] & 0x1F); - if (c == 1) { any = i; break; } - if (fallback == 0xFF && c && c != 9 && c != 12 && - c != 20 && !(c >= 26 && c <= 29)) fallback = i; - } - if (any == 0xFF) any = fallback; - } - } - if (any != 0xFF) pos = any; - kid_init(SEQ_STAND, (int8_t)(pos % 10), (int8_t)(pos / 10), 0); - pop_kid_hp_reset(); - - /* ВЫХОД ИЗ БОЯ (BUG-CHEAT-FIGHT-1). Телепорт с вынутым мечом заклинивал - * управление намертво: pop_control при Kid.sword == SWORD_2_DRAWN уходит - * в control_with_sword, а там единственный выход — ветка «убрать меч» на - * кадре FRAME_171_STAND_WITH_SWORD. После kid_init(SEQ_STAND) кадр - * обычный, стража в новой комнате нет, swordfight не запускается — и - * диспетчер каждый кадр не делает НИЧЕГО. Это болезнь ЧИТА: в оригинале - * телепорта между комнатами нет, попасть в режим боя без соперника - * нечем. Меч в инвентаре (pop_have_sword) НЕ теряем — только состояние - * схватки. */ - Kid.sword = SWORD_0_SHEATHED; - holding_sword = 0; - offguard = 0; - guard_refrac = 0; - - /* ПРОВАЛ НА СЛЕДУЮЩИЙ УРОВЕНЬ ПО ЧИТУ (та же болезнь, что выше). - * Уровень 12 кончается ФАКТОМ попадания в комнату 23 — двери у него нет - * (pop_seamless, seg000:0900). А навигация перебирает комнаты ПО - * НОМЕРУ, то есть любой обход рано или поздно наступает на 23-ю, и - * уровень молча меняется на 13-й: комнату 23 двенадцатого уровня читом - * не посмотреть в принципе, а прогон «съезжает» на соседний уровень - * незаметно для проверяющего (поймано 2026-08-13 на первом же прогоне). - * Держим триггер, пока Кид не сменит комнату НОГАМИ. */ - pop_nav_hold = 1; - return 1; -} - - -/* ---- ЧИТЫ (seg000: switch под if (cheats_enabled)) -------------------- * - * Переехали из главного цикла в банк 8: дёргаются раз в кадр, то есть - * один трамплин на кадр, а места в резиденте W1/W2 не осталось (звук, - * атлас Тени и пейсинг съели остаток; см. TASKS_OPEN, MEM). - * - * Флаги «фронта» стали статиками модуля — раньше они были локалями main. - * Смысл прежний: одно нажатие = одно срабатывание. - */ -static uint8_t cheat_prev, immo_prev, sound_prev, music_prev, nlvl_prev; -static uint8_t upsd_prev, xdec_prev, xinc_prev, cfg_prev; -static uint8_t time_sub_prev, time_add_prev; -static uint8_t hp1_prev, hpmax_prev, feather_prev; - -void pop_cheat_tick(void) __banked -{ - /* Читы (seg000: switch под if (cheats_enabled)). Все — по - * ФРОНТУ нажатия, иначе срабатывали бы каждый кадр. - * K — убить стража; - * I — бессмертие Кида (наш отладочный, в оригинале его нет: - * иначе боёвку проверять получается ровно три раза); - * Ctrl+S — вкл/выкл звук (порт Ctrl+S из SDLPoP, seg000:657). - * НЕ чит: работает и без pop_cheats, как в оригинале. - * Ctrl обязателен — голая S у нас свободна, но менять - * пользовательскую раскладку оригинала незачем; - * Shift+L — следующий уровень (seg000:698, ветка next_level = - * current_level + 1). Единственный вменяемый способ - * тестировать уровни 2..14. NB: L без Shift — отладочный - * «осторожный шаг вправо» (pop_ctrl KBD_DBG_STEPR); с - * Shift шаг тоже пройдёт, но уровень тут же сменится, так - * что конфликта на практике нет; - * F7 / F8 — отнять / добавить минуту. Это точный аналог - * keypad −/+ SDLPoP, но +/- заняты обходом комнат; - * [ / ] — подвинуть Кида на ПИКСЕЛЬ влево/вправо (seg000:1828, - * `--Char.x` / `++Char.x`). Нужен потому, что мост MAME - * теряет нажатия при быстрой отправке, и подогнать Кида в - * нужную позу скриптом нельзя (на это упёрлись BUG-LOOSE-2 - * и BUG-GATE-PASS-1). Пишем прямо в Kid.x: геометрию - * персонажа в этом порте задаёт не диспетчер (грабли - * L1-EXIT). Колонку не трогаем — её пересчитает физика - * следующего кадра. */ - uint8_t k = kbd_raw_down(KBD_CHEAT_KILL); - /* Ctrl+I — бессмертие, Shift+I — переворот: скан-код один. */ - uint8_t i = (uint8_t)(kbd_raw_down(KBD_CHEAT_IMMO) && - (kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL))); - uint8_t s = (uint8_t)(kbd_raw_down(KBD_SOUND_TOGGLE) && - (kbd_raw_down(KBD_LCTRL) || kbd_raw_down(KBD_RCTRL))); - uint8_t m = (uint8_t)(kbd_raw_down(KBD_MUSIC_TOGGLE) && - (kbd_raw_down(KBD_LCTRL) || kbd_raw_down(KBD_RCTRL))); - uint8_t nl = (uint8_t)(kbd_raw_down(KBD_CHEAT_NEXTLVL) && - (kbd_raw_down(KBD_LSHIFT) || kbd_raw_down(KBD_RSHIFT))); - uint8_t up = (uint8_t)(kbd_raw_down(KBD_CHEAT_UPSIDE) && - (kbd_raw_down(KBD_LSHIFT) || - kbd_raw_down(KBD_RSHIFT))); - uint8_t xd = kbd_raw_down(KBD_CHEAT_XDEC); - uint8_t xi = kbd_raw_down(KBD_CHEAT_XINC); - /* ±минута — на голых +/-, как в оригинале. С Ctrl те же - * клавиши означают обход комнат (sprpop.c), поэтому здесь Ctrl - * обязан быть ОТПУЩЕН, иначе сработает и то и другое. */ - uint8_t nomod = (uint8_t)!(kbd_raw_down(KBD_LCTRL) || - kbd_raw_down(KBD_RCTRL)); - uint8_t ts = (uint8_t)(nomod && (kbd_raw_down(KBD_TIME_SUB_MAIN) || - kbd_raw_down(KBD_TIME_SUB_NUM))); - uint8_t ta = (uint8_t)(nomod && (kbd_raw_down(KBD_TIME_ADD_MAIN) || - kbd_raw_down(KBD_TIME_ADD_NUM))); - /* C — записать POP.CFG сейчас (отладка MS2, до экрана Settings: - * там сохранять будет Apply/выход). */ - uint8_t cf = kbd_raw_down(0x21); /* C (PS/2 set 2) */ - /* ЧИТЫ ЗДОРОВЬЯ И ПЕРА (seg000:838, :845, :795). - * - * Делают то же, что соответствующие зелья, но НЕ через них: - * оригинал в этих ветках не зовёт stop_sounds, хотя ветка - * зелья зовёт (seg006:1871). Повторяем чит, а не зелье. - * Исключение — перо: там stop_sounds сидит внутри самого - * feather_fall(), поэтому остаётся. - * - * Shift+S делит скан-код с Ctrl+S (звук), поэтому Ctrl обязан - * быть отпущен; Shift+T — с голым T (таймер), но тот сам - * требует отпущенного Shift. */ - uint8_t shift = (uint8_t)(kbd_raw_down(KBD_LSHIFT) || - kbd_raw_down(KBD_RSHIFT)); - uint8_t h1 = (uint8_t)(shift && nomod && - kbd_raw_down(KBD_SOUND_TOGGLE)); - uint8_t hm = (uint8_t)(shift && kbd_raw_down(KBD_TIMER)); - uint8_t ff = (uint8_t)(shift && kbd_raw_down(KBD_KEY_W)); - if (pop_cheats && k && !cheat_prev) pop_guard_kill(); - /* Shift+S — одна единица HP, как малое красное зелье. */ - if (pop_cheats && h1 && !hp1_prev && hitp_curr != hitp_max) { - pop_sfx_play(33); - hitp_delta = 1; - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 2; - } - /* Shift+T — поднять ПОТОЛОК HP, как большая склянка. Оригинал - * здесь условия «не полон» не ставит: потолок растёт всегда. */ - if (pop_cheats && hm && !hpmax_prev) { - pop_sfx_play(30); - pop_add_life(); - pop_flash_color = POP_FLASH_RED; - pop_flash_time = 4; - } - /* Shift+W — медленное падение, как зелье пера. */ - if (pop_cheats && ff && !feather_prev) { - pop_feather = POP_FEATHER_FRAMES; - pop_sfx_stop(); - pop_sfx_play(39); - pop_flash_color = POP_FLASH_GREEN; - pop_flash_time = 3; - } - hp1_prev = h1; hpmax_prev = hm; feather_prev = ff; - /* Бессмертие по кругу: 0 выкл -> 1 «только бой» -> 2 «бой и - * мелкий урон» -> 0. Что означают уровни — pop_state.h. */ - if (pop_cheats && i && !immo_prev) - pop_immortal = (uint8_t)(pop_immortal >= 2 ? 0 : pop_immortal + 1); - if (s && !sound_prev) { - pop_sfx_toggle(); /* не под pop_cheats */ - pop_settings.sound_enabled = pop_snd_want; - /* Порт seg000:657: оригинал отвечает строкой в статус-полосе. */ - pop_status_msg = (uint8_t)(pop_snd_want ? POP_MSG_SOUND_ON - : POP_MSG_SOUND_OFF); - } - if (m && !music_prev) { - pop_mus_want ^= 1; /* не под pop_cheats */ - pop_settings.music_enabled = pop_mus_want; - pop_status_msg = (uint8_t)(pop_mus_want ? POP_MSG_MUSIC_ON - : POP_MSG_MUSIC_OFF); - } - if (pop_cheats && nl && !nlvl_prev && pop_current_level < POP_LAST_LEVEL) - pop_next_level = (uint8_t)(pop_current_level + 1); - /* U — переворот экрана (seg000:0793 — чит и в оригинале). - * Тот же путь, что у зелья типа 4: флаг + пометка «перевернулись». */ - if (pop_cheats && up && !upsd_prev) { /* тот же путь, что у зелья */ - pop_upside_want = (uint8_t)!pop_upside_want; - pop_upside_dirty = 1; - } - if (pop_cheats && xd && !xdec_prev) Kid.x = (uint8_t)(Kid.x - 1); - if (pop_cheats && xi && !xinc_prev) Kid.x = (uint8_t)(Kid.x + 1); - if (pop_cheats && ts && !time_sub_prev) pop_timer_cheat_subtract(); - if (pop_cheats && ta && !time_add_prev) pop_timer_cheat_add(); - if (pop_cheats && cf && !cfg_prev) (void)pop_cfg_save(); - cheat_prev = k; - immo_prev = i; - sound_prev = s; - music_prev = m; - nlvl_prev = nl; - upsd_prev = up; - xdec_prev = xd; - xinc_prev = xi; - time_sub_prev = ts; - time_add_prev = ta; - cfg_prev = cf; -} - -/* Отладочная строка в верхнем борте переехала в pop_status.c (банк 9): - * она теперь ТЕКСТОВАЯ, а шрифт живёт там же. Здесь не осталось ничего — - * см. заголовок pop_status.h про то, почему заявка сообщения стоит один - * байт, а весь рендер сидит в банке. */ - -/* Загрузить комнату room в рабочие массивы и отрисовать её фон в ОБЕ - * страницы дабл-буфера (у каждой своя видео-ОЗУ/теневая копия). Оставляет - * активной страницу 1 — вызывающий восстанавливает нужную draw-страницу. */ -/* side — куда ушёл КИД (0 left, 1 right, 2 up, 3 down); 0xFF = «не переход - * за Кидом» (старт уровня, респавн, чит-навигация). От него зависит ровно - * одно: пойдёт ли страж следом (pop_guard_follow, порт exit_room+ - * follow_guard) или останется в прежней комнате. */ -void enter_room_side(uint8_t room, uint8_t side) __banked -{ - uint8_t pg; - /* Страж идёт за Кидом? — решаем ДО того, как что-либо загрузим: функции - * нужны и старая комната (Guard.room), и целевая. Пошёл — ни leave, ни - * enter звать нельзя: он уже перенесён и живёт дальше как есть. */ - uint8_t follow = (uint8_t)(side <= 3 ? pop_guard_follow(room, side) : 0); - if (!follow) pop_guard_leave(); /* запомнить стража уходящей комнаты */ - /* ...и так же запомнить НЕДОСЧИТАННЫЕ loose: пока карта ещё описывает - * СТАРУЮ комнату, фаза уезжает в персистентный room_modif + trob, и - * плита доваливается заочно (см. pop_loose_leave_room / animate_loose). */ - pop_loose_leave_room(); - uint8_t *room_mod; - pop_room_load(room, room_fg, room_bg, lcol_fg, lcol_bg, rcol_fg, rcol_bg, below_fg); - pop_map_set(room_fg); - /* Соседей слева/справа карта забирает из уровня САМА (целиком, см. - * pop_map_set_edges) — отдельной копии в приложении нет. */ - pop_map_set_edges(pop_room_link(room, 0), pop_room_link(room, 1), - pop_room_link(room, 2), pop_room_link(room, 3)); - /* Боковой переход: колонки сдвинулись ровно на 10 (x ∓140), флаги - * перекрытия при этом инвариантны — историю перенумеровываем, а не - * теряем. Без этого решётка шва не бампит на кадре входа и Кид с - * разбега проходит сквозь закрытые ворота (BUG-GATE-PASS-1). */ - if (side == 0) pop_coll_shift(+10); /* ушёл ВЛЕВО: col += 10 */ - else if (side == 1) pop_coll_shift(-10); /* ушёл ВПРАВО: col −= 10 */ - pop_room_set_below(below_fg); - /* Ряд 2 верхнего соседа → полоса кладки у потолка (row0). fg — статика - * уровня, mod — живой room_modif (ленивая инициализация). */ - { - uint8_t up = pop_room_link(room, 2), c; - if (up) { - uint8_t *um = pop_trob_modif(up); - pop_level_access_begin(); - for (c = 0; c < 10; c++) above_fg[c] = pop_level_tile_raw(up, (uint8_t)(20 + c)); - pop_level_access_end(); - for (c = 0; c < 10; c++) above_mod[c] = um[20 + c]; - pop_room_set_above(above_fg, above_mod); - pop_map_set_above(above_fg); /* плита-потолок: пробой снизу + провал */ - } else { - pop_room_set_above(0, 0); /* нет комнаты сверху → пол (кромка) */ - pop_map_set_above(0); - } - } - pop_map_set_room(room); - /* Kid.room — как в оригинале: «комната персонажа». Полная модель - * (Kid.room ≠ отрисованной у шва) ещё не портирована, но сравнение - * Kid.room == Guard.room нужно уже сейчас: без него луч видимости - * стража никогда не срабатывает. */ - Kid.room = room; - pop_loose_reset(); /* loose-состояние не тянем из старой комнаты */ - pop_trob_room_changed(); /* отложенные перерисовки пик — не из старой комнаты */ - pop_bake_forget(); /* и слоты «первая запечка была на странице N» */ - pop_trob_anim_room(room); /* факелы/зелья: стартовая фаза + trob */ - pop_start_chompers(room, Kid.curr_row); /* seg000:1288: чомперы РЯДА Кида */ - pop_check_fall_flo(); /* спецсобытие ур.13: гряда плит сверху */ - /* check_shadow (seg002:0064) стоит ПЕРЕД enter_guard и на «шадоу»- - * уровнях забирает слот соперника себе: вернула 1 — стража поднимать - * НЕЛЬЗЯ (в комнате 24 уровня 5 он есть в данных, но оригинал его туда - * не пускает). Порядок ровно как в оригинале, не «сначала страж, потом - * заменим». */ - if (!follow && !pop_check_shadow(room)) - pop_guard_enter(room); /* страж комнаты (порт enter_guard) */ - pop_hp_invalidate(); /* фон перерисован — полоса HP тоже */ - /* Модификаторы тайлов (openness ворот, состояние пик) — ПЕРСИСТЕНТНЫЕ - * per-room (room_modif живёт между входами); рисуем и коллидируем по ним, - * а не по свежему backtable. Фаза P0. */ - room_mod = pop_trob_modif(room); - /* Модификаторы швов — из ЖИВОГО room_modif соседей (openness ворот, - * видимых через шов, персистентен: ворота room8(0,9) видны в col0 room6). - * pop_room_load заполнил lcol_bg/rcol_bg статикой уровня — перекрываем. */ - { - uint8_t lft = pop_room_link(room, 0), rgt = pop_room_link(room, 1); - if (lft) { uint8_t *m = pop_trob_modif(lft), i; - for (i = 0; i < 3; i++) { - lcol_bg[i] = m[9 + i * 10]; - /* шов рисуется в обе страницы ниже — синхр. сигнатуру */ - seam_sig[i] = seam_row_sig(m, lcol_fg, i); - } } - if (rgt) { uint8_t *m = pop_trob_modif(rgt); - rcol_bg[0] = m[0]; rcol_bg[1] = m[10]; rcol_bg[2] = m[20]; } - } - seam_redraw = 0; seam_rows = 0; /* шов свежий на обеих страницах — редрой не нужен */ - /* ENTER-ROOM-FAST: комната рисуется ОДИН раз — в скрытую страницу, — и - * обычно тут же показывается флипом; вторая страница дабл-буфера получает её - * КОПИЕЙ акселератора (gfx_copy_page, ~384 burst-строки против почти - * полумиллиона тактов на вторую отрисовку). Побочный эффект важнее - * тактов: игрок больше не видит, КАК рисуются тайлы — только готовый - * кадр. - * - * Копия идёт банком 0x50, то есть обновляет и VRAM, и ОЗУ-копию - * страницы-приёмника — иначе heal на ней восстанавливал бы фон прошлой - * комнаты (инвариант gfx_copy_page, регресс tests/pageflip). - * - * Видимая страница здесь МЕНЯЕТСЯ, поэтому главный цикл перечитывает её - * в начале каждого кадра (front = gfx_get_visible_page()), а не ведёт - * свой счёт. */ - { - gfx_rect_t full; - pg = (uint8_t)(gfx_get_visible_page() ^ 1); /* скрытая */ - gfx_set_draw_page(pg); - pop_screen_fill_field(); - pop_room_draw(room, room_fg, room_mod, lcol_fg, lcol_bg); - if (level_prepare) { - /* Межуровневый staging: пока pop_pal_level_load последовательно - * пишет KID.PAL и env/wall, видима нулевая чёрная страница. - * Показывать эту комнату разрешено только после финальной - * палитры — иначе level 4 успевает мелькнуть цветами level 3. */ - level_prepared_page = pg; - } else { - gfx_set_visible_page(pg); /* показать готовое */ - gfx_set_draw_page((uint8_t)(pg ^ 1)); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); /* вторую — копией */ - } - } - cur_room = room; - kid_room = room; /* S1: комната Kid синхронна отрисованной (S3 разведёт) */ - pop_leave_timer = 2; /* exit_room_timer: 2 кадра блокировки leave (анти-ping-pong/#4) */ -} - -/* Вход в комнату БЕЗ перехода за Кидом: старт уровня, респавн, чит-обход. - * Страж такой смены не «видит» — он остаётся в своей комнате. */ -void enter_room(uint8_t room) __banked { enter_room_side(room, 0xFF); } - -void pop_qsave_restore_room(uint8_t room) __banked -{ - uint8_t i, pg, *room_mod; - gfx_rect_t full; - uint8_t lft, rgt, up; - - pop_room_load(room, room_fg, room_bg, lcol_fg, lcol_bg, - rcol_fg, rcol_bg, below_fg); - pop_map_set(room_fg); - lft = pop_room_link(room, 0); rgt = pop_room_link(room, 1); - up = pop_room_link(room, 2); - pop_map_set_edges(lft, rgt, up, pop_room_link(room, 3)); - pop_room_set_below(below_fg); - if (up) { - uint8_t *um = pop_trob_modif(up); - pop_level_access_begin(); - for (i = 0; i < 10; i++) - above_fg[i] = pop_level_tile_raw(up, (uint8_t)(20 + i)); - pop_level_access_end(); - for (i = 0; i < 10; i++) above_mod[i] = um[20 + i]; - pop_room_set_above(above_fg, above_mod); - pop_map_set_above(above_fg); - } else { - pop_room_set_above(0, 0); pop_map_set_above(0); - } - pop_map_set_room(room); - pop_loose_reset(); - pop_trob_room_changed(); - pop_bake_forget(); - pop_loose_mob_room_changed(); - room_mod = pop_trob_modif(room); - if (lft) { - uint8_t *m = pop_trob_modif(lft); - for (i = 0; i < 3; i++) { - lcol_bg[i] = m[9 + i * 10]; - seam_sig[i] = seam_row_sig(m, lcol_fg, i); - } - } - if (rgt) { - uint8_t *m = pop_trob_modif(rgt); - rcol_bg[0] = m[0]; rcol_bg[1] = m[10]; rcol_bg[2] = m[20]; - } - seam_redraw = seam_rows = 0; - pg = (uint8_t)(gfx_get_visible_page() ^ 1); - gfx_set_draw_page(pg); - pop_screen_fill_field(); - pop_room_draw(room, room_fg, room_mod, lcol_fg, lcol_bg); - gfx_set_visible_page(pg); - gfx_set_draw_page((uint8_t)(pg ^ 1)); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); - cur_room = room; kid_room = Kid.room; - /* Обе страницы теперь содержат только свежий фон. Старые габариты - * персонажей относятся к кадру до QuickLoad и не должны запускать heal - * поверх восстановленной комнаты. */ - pop_cd_forget(); - pop_cd_init(); - pop_hp_invalidate(); - /* Полоса состояния тоже переписана заново — «QUICKLOAD» обязан лечь - * поверх свежего фона на ОБЕИХ страницах, иначе он виден через кадр и - * мигает. */ - pop_status_invalidate(); -} - -/* start_level (seg003:0055) + do_startpos (seg003:01A3) + set_start_pos - * (seg003:028A) — поставить Кида в стартовую позицию УРОВНЯ. Один вход и - * для запуска, и для рестарта после смерти / выпадения из уровня: в - * оригинале это буквально один и тот же путь (play_level_2 зовёт - * start_level заново), поэтому и у нас не три копии четырёх строк. - * - * Позиция берётся ИЗ ДАННЫХ уровня (pop_level_start_*), а не из #define: - * start_pos — тайл 0..29 (row*10+col), start_dir — направление, в котором - * персонаж должен ОКАЗАТЬСЯ. - * - * Направление ИНВЕРТИРУЕТСЯ (`Char.direction = ~level.start_dir`): персонаж - * ставится спиной и доворачивается кадрами позы входа. Сама поза — из - * tbl_entry_pose (data.h:848 = {0,1,0,…,2,…}): - * 1 (уровень 1) — падение внутрь (seq_7_fall) + нажатие кнопки room5(0,2); - * это оно захлопывает решётку за спиной в первой комнате; - * 2 (уровень 13) — вбегание (seq_84_run); - * иначе — разворот на месте (seq_5_turn). - * Таблица индексируется НОМЕРОМ УРОВНЯ — pop_level_entry_pose(). */ -#define SEQ_TURN 5 -#define SEQ_FALL 7 -#define SEQ_RUN 84 -#define ENTRY_POSE_FALL 1 /* tbl_entry_pose[1] */ -#define ENTRY_POSE_RUN 2 /* tbl_entry_pose[13] */ -#define TILE_LEVELDOOR_LEFT 16 /* tiles_16_level_door_left */ - - -/* ---- Порядок «Kid vs страж» (BUG-DRAWORDER-1) ----------------------- - * - * В оригинале никто не «поверх» по определению: и Кид, и страж попадают в - * midtable при обработке СВОЕГО тайла (set_objtile_at_char, seg006:13F3), а - * тайлы обходятся в фиксированном порядке — redraw_needed_tiles (seg008:1B06) - * идёт рядами 2,1,0 и внутри ряда колонками 0..9. Кто нарисован ПОЗЖЕ — тот - * поверх. Отсюда «Кид проходит ЗА телом стража»: тело лежит правее и/или - * выше, его тайл в обходе позже. Совпали тайлы — решает sort_curr_objs - * (seg008:203C): у обычных объектов (не тень, не плита) ниже по obj_y = позже. - * - * Мы рисовали страж→Кид всегда, то есть Кид был поверх безусловно. - * - * Ключ обхода: чем больше, тем позже. Ряды идут 2,1,0 → (2 - row). */ -#define OBJ_ORDER_KEY(row, col) ((int)(2 - (row)) * 10 + (int)(col)) - -/* get_tile_div_mod (seg006:750): колонка комнаты по X (БЕЗ поправки −7). */ -static int8_t tile_div_mod(int x) -{ - int v = x - 58; /* pop_x_bump[FIRST_ONSCREEN_COLUMN] */ - int c = v / TILE_SIZEX; - if (v % TILE_SIZEX < 0) --c; - return (int8_t)c; -} - -/* char_x_left из set_char_collision (seg006:0723) — левая граница габарита. - * ВАЖНО: величина НЕ утоньшённая; поправку THIN оригинал применяет только к - * *_coll, а колонки char_col_left/right считает по этой. */ -static int char_x_left_of(uint8_t x, int8_t dir, int8_t dx, - uint8_t flags, uint16_t w) -{ - int e = (int)x + ((dir < 0) ? -dx : dx); /* char_dx_forward */ - uint8_t fl = flags; - if (dir < 0) fl ^= 0x80; - /* odd-pixel + усечение деления к нулю — та же поправка, что в pop_map */ - if (!(fl & 0x80) && e <= 57) e++; - if (dir >= 0) e -= (int)((w + 1) >> 1); /* char_width_half */ - return e; -} - -/* set_objtile_at_char (seg006:13F3) — ТАЙЛ ОБЪЕКТА персонажа. - * - * Ветка actions_1_run_jump обязательна, а не «упрощаемая» (как я решил - * сначала): в беге оригинал берёт НЕ curr_row/curr_col, а нижний ряд и ЛЕВУЮ - * колонку ГАБАРИТА. При беге вправо левая колонка меньше curr_col, поэтому - * бегущий Кид уходит ЗА объекты справа от себя. Без этой ветки часть кадров - * бега рисовала Кида поверх лежащего стража. Считаем одинаково для обоих: - * enter_guard (seg002) тоже ставит стражу action = 1, и односторонний учёт - * дал бы перекос в другую сторону. */ -static void objtile_at_char(int8_t *row, int8_t *col, - const pop_char_t *ch, int8_t dx, int8_t dy, - uint8_t flags, uint16_t w) -{ - int8_t r = ch->curr_row, c = ch->curr_col; - if (ch->action == 1) { /* actions_1_run_jump */ - int8_t br = pop_y_to_row((int16_t)((int)ch->y + dy)); - if (br == -1) br = 3; /* char_bottom_row */ - r = br; - c = tile_div_mod(char_x_left_of(ch->x, ch->direction, dx, flags, w)); - if (c < 0) c = 0; /* MAX(char_col_left, 0) */ - } - if ((ch->frame >= 135 && ch->frame < 149) || - ch->action == 2 || ch->action == 3 || - ch->action == 4 || ch->action == 6) c--; - *row = r; *col = c; -} - -/* ВРЕМЕННО: трасса kidobj — порт отладочного вывода, добавленного - * пользователем в SDLPoP add_kid_to_objtable (seg008:1679): - * - * DBG kidobj tilepos=%d frame=%d act=%d col=%d cols=%d..%d rows=%d..%d - * - * Считаем ровно то же, что set_char_collision (seg006:0723) + - * set_objtile_at_char (seg006:13F3): габарит НЕутоньшённый (THIN правит - * только *_coll, а колонки берутся по «толстой» границе), колонки - * клампятся в 0..9, нижний ряд −1 читается как 3. Звать ПОСЛЕ отрисовки - * Кида: ширину/высоту кадра (fpw/fph) заполняет она. - * - * Вывод забирает брейкпоинт MAME на резидентном pop_dbg_trap — сама - * функция банковая, её адрес в W3 неоднозначен. */ -void pop_dbg_kidobj(void) __banked -{ - int8_t dx = kid_cur_dx(), dy = kid_cur_dy(); - uint8_t fl = kid_cur_flags(); - uint16_t w = pop_cd[POP_CH_KID].fpw; - uint16_t h = pop_cd[POP_CH_KID].fph; - int xl = char_x_left_of(Kid.x, Kid.direction, dx, fl, w); - int xr = xl + (int)((w + 1) >> 1); /* + char_width_half */ - int oy = (int)Kid.y + dy; - int ty = oy - (int)h + 1; - int8_t r, c, tr, br, cl, cr; - objtile_at_char(&r, &c, &Kid, dx, dy, fl, w); - br = pop_y_to_row((int16_t)oy); - if (br == -1) br = 3; - if (ty >= 192) ty = 0; - tr = pop_y_to_row((int16_t)ty); - cl = tile_div_mod(xl); if (cl < 0) cl = 0; - cr = tile_div_mod(xr); if (cr > 9) cr = 9; - pop_dbg_obj[0] = (int8_t)(r * 10 + c); - pop_dbg_obj[1] = (int8_t)Kid.frame; - pop_dbg_obj[2] = (int8_t)Kid.action; - pop_dbg_obj[3] = Kid.curr_col; - pop_dbg_obj[4] = cl; - pop_dbg_obj[5] = cr; - pop_dbg_obj[6] = tr; - pop_dbg_obj[7] = br; - pop_dbg_obj[8] = (int8_t)cur_room; - pop_dbg_trap(); -} - -/* 1 = страж рисуется ПОСЛЕ Кида (поверх). __banked: зовётся раз в кадр, - * то есть один трамплин — а 500 Б кода в резиденте дороже. */ -uint8_t guard_over_kid(void) __banked -{ - int8_t kr, kc, gr, gc; - int kk, gk; - if (Guard.charid == 0 || Guard.room != cur_room) return 0; - objtile_at_char(&kr, &kc, &Kid, kid_cur_dx(), kid_cur_dy(), - kid_cur_flags(), pop_cd[POP_CH_KID].fpw); - objtile_at_char(&gr, &gc, &Guard, pop_gframe.dx, pop_gframe.dy, - pop_gframe.flags, pop_cd[POP_CH_OPP].fpw); - kk = OBJ_ORDER_KEY(kr, kc); - gk = OBJ_ORDER_KEY(gr, gc); - if (gk != kk) return (uint8_t)(gk > kk); - /* один тайл — ниже по obj_y рисуется позже (sort_curr_objs) */ - return (uint8_t)((int)Guard.y + pop_gframe.dy > pop_cd[POP_CH_KID].fpy); -} - - -/* ---- Переворот уже нарисованного (зелье инверсии, уровень 9) --------- * - * - * Порт need_redraw_because_flipped (seg000:15E9 + 939/946). Оригинал - * держит готовый offscreen и переворачивает его на выводе; у нас страниц - * ровно две, рабочей третьей нет, поэтому переворачиваем то, что уже - * нарисовано, — построчной копией акселератора (gfx_copy_page). - * - * Почему это законно и почему heal после не ломается: accel ЧИТАЕТ - * ОЗУ-копию, значит копируется ЧИСТЫЙ ФОН без персонажей, а пишет банком - * 0x50 — и в видео, и в копию приёмника. После двух проходов обе страницы - * дабл-буфера содержат перевёрнутый фон в обеих плоскостях, и heal - * восстанавливает уже его (memory accel_port_y_between_triggers, - * регресс — tests/pageflip). - * - * Порядок: перевернуть в СКРЫТУЮ, показать её, скопировать оттуда во - * вторую (теперь скрытую) — прямой копией. Так игрок видит результат - * сразу, а не после второго прохода. - * - * Переворачиваем ТОЛЬКО игровое поле (POP_PLAYFIELD_H): полоса HP лежит - * ниже него и в оригинале тоже не переворачивается. */ -void pop_flip_screen(void) __banked -{ - gfx_rect_t area; - uint8_t front = gfx_get_visible_page(); - uint8_t back = (uint8_t)(front ^ 1); - uint8_t i; - - area.x = 0; area.y = POP_YOFF; - area.w = 320; area.h = POP_PLAYFIELD_H; - - /* СНАЧАЛА убрать из фона то, что в нём запечено, но фоном не является: - * пламя факелов (pop_torch_wipe объясняет, почему оно вообще там). - * Отражённое вместе с фоном, оно оседало в зеркальных позициях, где его - * никто не перерисовывает — по комнате оставались лишние языки огня - * (нашёл пользователь на глотке зелья). - * - * Чистим ОБЕ страницы: источник отражения — видимая, а вторая получит - * прямую копию уже чистой картинки. Дешевле полной перерисовки комнаты - * на порядок: 0..4 тайла против 6.2 млн тактов (14.5 кадра, замер MAME - * 2026-08-12) — а копия отражения стоит всего 2.1 кадра. */ - /* ВНИМАНИЕ на систему координат: pop_upside к этому моменту УЖЕ - * переключён (главный цикл делает это перед вызовом), а картинка на - * экране нарисована ещё в СТАРОЙ. Чистить её надо по старым - * координатам, иначе чёрный бар ложится в зеркальное место — на экране - * оставался чёрный квадрат, а пламя так и не стиралось. */ - pop_upside = (uint8_t)!pop_upside; /* временно: система ЭКРАНА */ - gfx_set_draw_page(front); - for (i = 0; i < 30; i++) { - uint8_t t = room_fg[i]; - if (t == 19 || t == 30) /* факел / факел с щебнем */ - pop_torch_wipe(i / 10, i % 10); - } - pop_upside = (uint8_t)!pop_upside; /* вернуть новое состояние */ - - gfx_set_draw_page(back); - gfx_copy_page(&area, GFX_COPY_VFLIP); /* источник — видимая страница */ - gfx_set_visible_page(back); - - gfx_set_draw_page(front); - gfx_copy_page(&area, GFX_COPY_DIRECT); /* вторую страницу — прямой копией */ - - /* Всё, что рисуется поверх фона, надо положить заново: прошлые - * прямоугольники персонажей относятся к СТАРОЙ (неперевёрнутой) - * картинке, и heal по ним стёр бы не то место. */ - pop_cd_forget(); - POP_CD_TOUCH_ALL(); /* фон трогали целиком */ - pop_hp_invalidate(); /* полосу HP перерисовать */ -} - -/* ---- Запуск, смена уровня, завершение ------------------------------- * - * Три куска главного цикла, которые отрабатывают раз за игру (или раз на - * уровень). В резиденте от них оставались только вызовы — сам код здесь. - */ - -/* Фазы старта (см. шапку pop_boot): обе половины идемпотентны, а - * boot_rest_fail нужен, чтобы повторный вызов не пытался читать заново - * то, что уже не прочиталось. */ -static uint8_t boot_sound_done; -static uint8_t boot_rest_done; -static uint8_t boot_rest_fail; - -/* СТАРТ РАЗБИТ НА ТРИ ФАЗЫ — чтобы игрок увидел заставку и услышал музыку - * сразу, а не через несколько секунд чёрного экрана в тишине. - * - * pop_boot() — только настройки и графика: чёрный экран за ~0,1 с. - * pop_boot_sound() — индекс+первая страница звука, индекс музыки, CBL: - * после него титул уже показан, и тема заставки может - * начать играть, не дожидаясь остальных ресурсов. - * pop_boot_rest() — всё тяжёлое (эффекты, Кид, Тень, шрифт) ПОД стоящим - * титулом и звучащей темой; идемпотентно. - * - * ЧЕТЫРЕ ЗАГРУЗКИ ОТСЮДА ПРОСТО УБРАНЫ, а не отложены: атлас фона, страж, - * уровень 1 и игровая палитра — это дубликаты того, что и так делает - * pop_level_switch() на входе в ЛЮБОЙ уровень (а pop_new_game_load ещё и - * pop_pal_game_load перед ним). Оба маршрута в игру, LEVEL_LOAD и DEMO, - * упираются в pop_level_switch, так что второй раз читать их до заставки - * незачем — это ~0,77 с на ровном месте. Так же устроен и оригинал: у - * SDLPoP chtab_5/6/7 грузит load_lev_spr() на старте уровня, а init_game_main - * до заставки читает только меч, пламя, звуки и палитры (seg000.c:156). - * - * ПАЛИТРУ ТРОГАТЬ НЕЛЬЗЯ, пока на экране титул: и kid.pal (все 256 записей), - * и палитра тайлсета пишутся прямо в железо и перекрасили бы заставку. - * Поэтому в отложенной части нет ни одной палитровой операции — они все - * живут на маршруте входа в уровень, за чёрным экраном. */ -int pop_boot(void) __banked -{ - /* Настройки: дефолты, затем POP.CFG, если он есть и корректен. */ - pop_settings_defaults(); - pop_cfg_load(); - pop_timer_new_game(); /* default 60:00, Settings may freeze it */ - - /* Экран Sprinter хранит VRAM и палитры между программами. Перейти в - * графику надо ДО долгих чтений, но первой же операцией погасить ОБЕ - * палитры: тогда ни старый экран, ни частично собранный первый уровень - * не могут мелькнуть перед первым title fade-in. */ - /* PIC-палитры графики живут и в text mode. Предзапись чёрного сокращает - * окно между аппаратным SETVMOD и первой строкой нашего кода, в котором - * иначе успевает мелькнуть VRAM предыдущей программы. */ - pop_pal_black(); - initgraph_black(); - /* initgraph_black уже обнулил VRAM до SETVMOD. Повторная заливка после - * него фиксирует и shadow-копии, откуда затем работают heal/page-copy. */ - gfx_set_bank(GFX_BANK_NORMAL); - setfillstyle(SOLID_FILL, BLACK); - gfx_set_draw_page(0); - bar(0, 0, 319, 255); - gfx_set_draw_page(1); - bar(0, 0, 319, 255); - gfx_set_visible_page(0); - pop_pal_black(); - - /* FONT.ATL — В МИНИМАЛЬНОЙ ФАЗЕ, И ОТКЛАДЫВАТЬ ЕГО НЕЛЬЗЯ. - * - * Дело не в шрифте: СНИМОК ПАЛИТРЫ физически живёт в хвосте страницы - * шрифта (pop_ui.c, POP_FONT_SNAPSHOT_OFF — в W2 килобайта нет), и вся - * машинерия яркости начинается с `if (!font_ready) return`. Без него - * pop_pal_apply(DIM_BLACK) не гасит, а fade_in нечего проявлять — - * заставка возникает разом на полной яркости (поймано пользователем - * сразу после первой версии этой перестановки, 2026-09-02). - * Цена вопроса — 12 КБ, около 75 мс. */ - if (pop_menu_init() != 0) { - puts("menu font atlas load failed"); - return -1; - } - - pop_current_level = FIRST_LEVEL; - pop_cd_init(); /* метка «фон трогали» — пустые диапазоны */ - pop_guard_reset(); - pop_next_level = pop_current_level; /* current_level = next_level (load_lev_spr) */ - pop_kid_hp_newgame(); /* init_game: hitp_beg_lev = start_hitp */ - pop_checkpoint = 0; /* init_game (seg003:37) */ - if (!pop_settings.show_build_info) pop_pal_apply(POP_PAL_DIM_BLACK); - return 0; -} - -/* ЗВУК ВПЕРЁД ОСТАЛЬНЫХ РЕСУРСОВ. Насосу для тишины (а значит и для того, - * чтобы CBL вообще открылся) нужен ровно ОДИН блок набора, и упаковщик - * обязан класть его первым блоком страницы 0 — поэтому здесь читается одна - * страница вместо восьми (33 мс против 440). Остальные приезжают в - * pop_boot_rest, а до тех пор pop_sfx_play молча пропускает эффекты. - * - * Звать ПОСЛЕ того, как титул уже проявлен: чтение всё равно занимает - * полсекунды, и лучше, чтобы она прошла под картинкой. */ -int pop_boot_sound(void) __banked -{ - if (!boot_sound_done) { - boot_sound_done = 1; - (void)pop_sfx_init_begin(); /* эффектов может и не быть — не фатально */ - /* Индекс музыкального набора — одна страница EMM. Без него музыки не - * будет (pop_music_info вернёт -1 на любой трек), но игра работает: - * это необязательный ресурс, как и сами треки. */ - (void)pop_music_index_load(); - pop_settings_apply(1); /* CFG -> speed/cheats/CBL */ - } - /* ОТКРЫТИЕ CBL — ВНЕ РАЗОВОГО ГАРДА, и это не мелочь. Загрузка нужна - * один раз за запуск, а вот вывод к моменту следующего показа заставки - * почти наверняка закрыт: pop_title_show начинается с pop_sfx_pause, да - * и уровень оставляет CBL закрытым. Пока start стоял под флагом, - * Restart Game приводил к заставке БЕЗ музыки (поймано пользователем - * 2026-09-02), а заодно подвешивал ожидания «дослушать тему»: с - * выключенным насосом pop_mus_left не убывает, и pop_music_busy() - * истинен вечно. Идемпотентно и уважает Ctrl+S (pop_snd_want). */ - (void)pop_sfx_start(); - return 0; -} - -/* Шаг подкачки трека между кусками загрузки: заставочная тема играет уже - * с первой страницы (pop_music_stream), остальные обязаны приезжать по - * ходу — иначе насос уйдёт в ещё не прочитанную страницу. Запас после - * шага — 0,75 с звучания на каждые 8 КБ, куски загрузки короче. */ -static void boot_music_step(void) -{ - if (pop_music_loading()) (void)pop_music_load_step(); -} - -int pop_boot_rest(void) __banked -{ - if (boot_rest_done) return boot_rest_fail ? -1 : 0; - boot_rest_done = 1; - /* Заставку могли пропустить в первую же секунду — тогда звук ещё не - * поднимался. Идемпотентно. */ - (void)pop_boot_sound(); - - (void)pop_sfx_init_finish(); /* дочитать эффекты (музыка уже играет) */ - boot_music_step(); - if (pop_kid_data_load("KID\\kid.ani") != 0) { /* кадры+seqtbl в EMM-странице */ - puts("kid.ani load failed\n"); - boot_rest_fail = 1; - return -1; - } - boot_music_step(); - pop_shadow_load(); /* запечённый набор Тени — один раз на запуск */ - boot_music_step(); - if (pop_kid_load(KID_PAGES) != 0) { /* ВСЕ страницы: бег+стоп+разворот+присед+прыжок */ - puts("kid atlas load failed"); - boot_rest_fail = 1; - return -1; - } - boot_music_step(); - - /* Стартовая комната до title НЕ НУЖНА: LEVEL_LOAD всё равно выполняет - * pop_level_switch. Единственное исключение — явно включённый - * build-info: его фон по контракту является игровой сценой, поэтому - * только здесь читаются фон с уровнем и применяется игровая палитра. */ - if (pop_settings.show_build_info) { - if (pop_bg_load(pop_level_type()) != 0 || - pop_level_load_num(FIRST_LEVEL) != 0) { - puts("build-info scene load failed"); - boot_rest_fail = 1; - return -1; - } - pop_guard_load(); - pop_pal_game_load(); - pop_start_level(); - if (pop_current_level == POP_UPSIDE_LEVEL) pop_vflip_load_all(); - gfx_set_draw_page(0); - pop_char_draw(POP_CH_KID); - pop_char_fore(POP_CH_KID); - } - return 0; -} - -/* Порт play_level_2 (seg003:0386..0410) + play_level (seg003:81): цикл - * уровня кончается, когда next_level разошёлся с current_level (END_LEVEL - * после seq_70 в двери уровня либо чит Shift+L), и play_level грузит - * следующий. Возврат -1 — фатально (не удалось сменить набор фона). */ -int pop_level_switch(void) __banked -{ - uint8_t old_page; - gfx_rect_t full; - - /* РЕСУРСЫ МОГУТ БЫТЬ ЕЩЁ НЕ ПРОЧИТАНЫ. Кид, Тень и шрифт грузятся под - * заставкой (см. шапку pop_boot), а её можно пропустить клавишей в - * первую же секунду. Идемпотентно: со второго раза это проверка байта. */ - if (pop_boot_rest() != 0) return -1; - - /* Граница FG0: повреждённый snapshot или старый внешний вызов не должен - * даже пытаться открыть res2015.bin. Финальный маршрут 14 -> ENDING - * добавит автомат приложения (FG11); пока просто оставляем уровень. */ - if (pop_next_level > POP_LEVEL_LAST) { - pop_next_level = pop_current_level; - return 0; - } - - /* Порт play_level_2 (seg003:0386..0410) + play_level (seg003:81): - * цикл уровня кончается, когда next_level разошёлся с - * current_level (END_LEVEL после seq_70 в двери уровня либо чит - * Shift+L), и play_level грузит следующий. - * - * HP переносится: hitp_beg_lev = hitp_max ДО загрузки — так - * поднятая на уровне «жизнь» (большая склянка) переезжает - * дальше, а урон — нет (do_startpos дольёт до потолка). */ - hitp_beg_lev = hitp_max; - pop_checkpoint = 0; /* уровень пройден (seg003:413) */ - /* ЗАМЕР 2026-08-28: глушение снято ВРЕМЕННО, чтобы измерить - * зазоры насоса на загрузке уровня (дедлайн 251 000 тактов). - * Если зазоры укладываются — снятие остаётся, и трек заставки - * доигрывает поверх загрузки, как в оригинале (seg001:690). */ - if (pop_level_load_num(pop_next_level) != 0) { - pop_next_level = pop_current_level; /* файла нет — остаёмся */ - } else { - /* С этого места видим только индекс 0. Это одновременно - * скрывает дисковую подготовку и даёт безопасный экран, - * пока loaders физически меняют отдельные диапазоны palette. */ - pop_pal_black(); - old_page = gfx_get_visible_page(); - gfx_set_bank(GFX_BANK_NORMAL); - /* Обнуляем ОБЕ страницы, а не только software-visible: - * аппаратный SCREEN_SWITCH и сохранённое BGI-состояние не - * должны оставлять старые sprites на соседней странице. */ - gfx_set_draw_page(0); - pop_screen_fill_game(); - gfx_set_draw_page(1); - pop_screen_fill_game(); - pop_wait_edge(); - /* Набор спрайтов соперника у каждого уровня СВОЙ - * (load_lev_spr, seg000:1092): уровень 3 — скелет, у него и - * кадров меньше, чем у стража. Без перезагрузки соперник - * рисуется чужим атласом: часть индексов уходит за его - * пределы, и персонаж просто не виден. */ - pop_guard_free(); - pop_guard_load(); - /* guard loader применяет свои цветовые слоты физически; - * пока остальной уровень читается, экран обязан быть чёрным. */ - pop_pal_black(); - /* Зеркальные копии атласов сделаны из СТАРЫХ страниц — - * после перезагрузки спрайтов они мусор (pop_vflip.h). */ - pop_vflip_reset(); - /* Тайлсет: подземелье <-> дворец (порт tbl_envir_ki, - * seg000:1108). Внутри — no-op, если тип не менялся; - * при смене выгружает старые атласы и правит 32 записи - * палитры. Только на границе уровня, не в кадре. */ - if (pop_bg_load(pop_level_type()) != 0) { - puts("bg set load failed"); - return -1; - } - /* Смена tileset тоже пишет env/wall slots. Не открывать их - * до готовности обеих страниц нового уровня. */ - pop_pal_black(); - /* Всё состояние прошлого уровня сносит сам pop_start_level: - * pop_trob_reset обнуляет room_seen (модификаторы комнат - * перечитаются из НОВОЙ страницы), тайлы/стражи приезжают - * из неё же, loose чистит enter_room. */ - level_prepare = 1; - pop_start_level(); - level_prepare = 0; - /* pop_bg_load мог заменить только env/wall, а до этого - * экран жил после fade на чёрной палитре заставки. Полный - * game source обязателен даже для dungeon->dungeon: иначе - * fade_in восстановит старый (либо уже чёрный) snapshot. - * Яркость caller выберет сам: gameplay может показать кадр - * сразу, lifecycle title/demo — сначала apply(4)+fade_in. */ - /* Уровень с зельем инверсии — заранее поднять зеркальный - * набор персонажей (pop_vflip.h): 34 страницы читаются ~1.5 с, - * и делать это после открытия палитры либо в момент глотка - * нельзя. Звать можно откуда угодно — функция идемпотентна. */ - if (pop_current_level == POP_UPSIDE_LEVEL) pop_vflip_load_all(); - /* Последнее действие подготовки: собрать полный logical - * source новой палитры. Пока он собирается физическими - * записями, видимая old_page заполнена нулём. */ - pop_pal_level_load(1); - /* Атомарный commit на границе растра: впервые показать - * готовую комнату уже с окончательной палитрой уровня. - * Вторую страницу синхронизировать аппаратной копией. */ - /* ЖДЁМ КОНЦА ТРЕКА ЗАСТАВКИ НА ЧЁРНОМ ЭКРАНЕ — порт - * seg003:107: - * while (check_sound_playing() && !do_paused()) idle(); - * stop_sounds(); - * draw_level_first(); - * Порядок оригинала важен: загрузка уровня идёт ПОД - * звучащий трек, и только потом чернота до его конца. Тогда - * общее время черноты = max(трек, загрузка), а не их сумма, - * и трек не обрывается на полуслове. Раньше у нас было - * наоборот: pre_cut_finish досиживал трек, потом глушил - * насос и грузил уровень. - * - * ЗАМЕР 2026-08-28: 500 подряд вызовов насоса через всю - * загрузку — максимальный зазор 245 832 такта при дедлайне - * 251 000, ни одной пропущенной порции. Поэтому глушение на - * загрузке снято и музыка её переживает. - * - * Счётчик — страховка от вечного ожидания (потоковый трек, - * который никогда не кончится): ~20 с и идём дальше. */ - { - uint16_t mus_guard = 1000; - - while (pop_music_busy() && mus_guard) { - mus_guard--; - pop_wait_edge(); - } - pop_music_free(); /* порт stop_sounds() */ - } - pop_wait_edge(); - gfx_set_visible_page(level_prepared_page); - gfx_set_draw_page(old_page); - full.x = 0; full.y = 0; full.w = 320; full.h = 256; - gfx_copy_page(&full, GFX_COPY_DIRECT); - /* Уровень готов и показан — заявить «LEVEL N» (порт - * show_level из draw_level_first, seg003:222). */ - pop_status_level(); - } - /* CBL намеренно НЕ открываем здесь. После загрузки caller ещё - * может делать BIOS fade/palette либо восстанавливать QuickSave; - * открытый буфер за это время успевает повторить старую половину - * и даёт скрежет. Caller запускает звук последним действием. */ - return 0; -} - -/* Общий холодный маршрут title/intro/credits/demo -> настоящая игра. - * Держим его в банке 8: это разовый lifecycle-код, а не часть кадрового - * пути, и перенос возвращает резиденту W1 место под стек/heap. */ -int pop_new_game_load(void) __banked -{ - /* Клавиша, которой пропустили заставку/demo, не должна стать первым - * движением Кида или тут же открыть pause menu на уровне. */ - while (kbd_raw_any_down()) { - kbd_raw_sync(); - gfx_wait_vsync(); - } - - /* ДО pop_pal_game_load: она доплачивает слоты палитры по загруженным - * наборам (Тень, страж, тайлсет), и звать её раньше их чтения нельзя. */ - if (pop_boot_rest() != 0) return -1; - - pop_kid_hp_newgame(); - hitp_max = POP_START_HITP; - pop_timer_new_game(); - pop_checkpoint = 0; - pop_next_level = FIRST_LEVEL; - - /* Title мог завершиться на яркой title-палитре. Сначала погасить её, - * затем восстановить полный game snapshot; level_switch собирает обе - * страницы уже невидимо, и первый игровой кадр проявляется. */ - pop_pal_apply(POP_PAL_DIM_BLACK); - gfx_set_draw_page(0); - gfx_set_bank(GFX_BANK_NORMAL); - pop_screen_fill_game(); - gfx_set_draw_page(1); - pop_screen_fill_game(); - gfx_set_visible_page(1); - pop_pal_game_load(); - pop_pal_apply(POP_PAL_DIM_BLACK); - if (pop_level_switch() != 0) return -1; - /* Первый уровень появляется сразу, без fade, но только после того как - * обе страницы и его собственная палитра полностью готовы. */ - pop_pal_apply(0); - (void)pop_sfx_start(); - return 0; -} - -void pop_shutdown(void) __banked -{ - gfx_set_idle_hook(0); /* снять хук ДО закрытия raw-канала */ - /* ЗВУК ГАСИМ ПЕРВЫМ, до closegraph и освобождения страниц. Дальше идут - * ESTEX-вызовы (mem_free_block на каждый атлас), а они уходят надолго — - * насос не успевает долить очередной блок, и железо доигрывает по кругу - * несвежую половину буфера. Замер записи MAME: на выходе по ESC ровно - * 11 мс шума на полной громкости, то есть ОДИН пропущенный блок (128 - * сэмплов = 11,7 мс). Та же причина, по которой звук глушится на время - * загрузки уровня (pop_sfx.h). */ - pop_sfx_close(); - pop_ctrl_close(); - closegraph(); - pop_bg_free(); - pop_kid_free(); - pop_shadow_free(); - pop_menu_free(); - pop_guard_free(); - pop_kid_data_free(); - pop_level_free(); - /* ЖЕЛЕЗО ЗВУКА ГАСИМ ПОСЛЕДНИМ ДЕЙСТВИЕМ, и pop_sfx_close выше для этого - * НЕ ДОСТАТОЧНО: он закрывает сессию, а bit7 порта CBL остаётся включён, - * пока его держит gfx_wait_vsync ради бита луча. Дальше main просто - * возвращается, а crt0 при возврате уходит прямо в ESTEX EXIT, минуя - * цепочку atexit (runtime/crt0_banked.s) — то есть vsync-ссылку снять - * уже некому. В результате мы уходили в шелл с включённым CBL, и он - * крутил свои 256 слотов: тихо до первой чужой записи в порт данных, а - * дальше она зацикливалась (поймано пользователем на железе 2026-09-02; - * в MAME не воспроизводится). */ - cbl_shutdown(); -} diff --git a/applications/SprPoP/src/sprpop_cold.h b/applications/SprPoP/src/sprpop_cold.h deleted file mode 100644 index b51384b..0000000 --- a/applications/SprPoP/src/sprpop_cold.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * sprpop_cold.h — контракт между главным циклом (резидент W1/W2) и его - * ХОЛОДНОЙ половиной, вынесенной в банк (sprpop_cold.c). - * - * Зачем. В режиме huge под кучу остаётся то, что не занял _CODE+_DATA, и к - * уровню 8 запас упал ниже килобайта. Главный цикл при этом наполовину - * состоит из кода, который отрабатывает РАЗ НА УРОВЕНЬ (старт/рестарт) или - * вообще только по отладочной клавише (обход комнат, лейбл номера) — держать - * его в дефицитном окне незачем. Кадровый путь (tick/draw/флип) остался в - * резиденте целиком: цена выноса — один трамплин на вызов, а он тут ноль раз - * за обычный кадр. - * - * Что ОСТАЛОСЬ в sprpop.c и почему: enter_room_side (её зовут и холодная - * половина, и переходы между комнатами в кадре падения) и рабочие массивы - * комнаты — они же и есть то состояние, ради которого функция вообще - * существует; банковый модуль читает их как обычные глобалы (данные банков - * линкуются в общий _DATA, --bank-data мы не включаем). - */ -#ifndef ROOMTEST_COLD_H -#define ROOMTEST_COLD_H - -#include - -/* ---- то, что холодная половина берёт у главного цикла ---------------- */ - -/* Рабочие массивы комнаты: заполняет вход в комнату (банк), читают и он, и - * главный цикл (шов, straddle, чит-навигация). Данные банковых модулей - * линкуются в общий _DATA, поэтому обе половины видят их как обычные - * глобалы — в банк уехал только КОД. */ -extern uint8_t room_fg[30], room_bg[30]; -extern uint8_t lcol_fg[6], lcol_bg[3], rcol_fg[6], rcol_bg[3], below_fg[11]; -extern uint8_t above_fg[10], above_mod[10]; -extern uint8_t kid_room; /* РЕАЛЬНАЯ комната Kid (straddle) */ -extern uint8_t seam_sig[3]; /* последняя нарисованная openness в шве */ -extern uint8_t seam_rows, seam_redraw; - -/* Сигнатура ряда шва: openness ворот соседа либо «кнопка нажата». Живёт в - * резиденте — её зовёт и кадровый путь главного цикла, и вход в комнату. */ -uint8_t seam_row_sig(const uint8_t *m, const uint8_t *lfg, uint8_t r); -extern uint8_t cur_room; /* её номер (drawn_room) */ -extern uint8_t pop_checkpoint; /* checkpoint (seg000:270) — ставит уход */ - /* влево из комнаты 7 уровня 3 */ - -/* Вход в комнату. side — куда ушёл КИД (0 L, 1 R, 2 U, 3 D); 0xFF = «не - * переход за Кидом» (старт уровня, респавн, чит-навигация): от этого - * зависит, пойдёт ли страж следом. enter_room — обёртка с 0xFF. - * Обе в банке 8: зовутся раз на комнату, а кода там на полтора килобайта. */ -void enter_room_side(uint8_t room, uint8_t side) __banked; -void enter_room(uint8_t room) __banked; -/* Пересобрать только производные кэши и обе страницы после QuickLoad. - * Игровые таймеры, trobs, mobs и персонажей не изменяет. */ -void pop_qsave_restore_room(uint8_t room) __banked; - -/* ---- холодная половина ----------------------------------------------- */ - -/* start_level (seg003:0055) + do_startpos + set_start_pos: поставить Кида в - * стартовую позицию уровня. Один вход и для запуска, и для рестарта после - * смерти / выпадения из уровня — в оригинале это буквально один путь. */ -void pop_start_level(void) __banked; - -/* ОТЛАДОЧНЫЙ обход комнат по номеру ('+' / '−'). dir: 1 — следующая, - * 2 — предыдущая. Ставит Кида на подходящий пол новой комнаты и выводит - * его из боя. Возвращает 1, если комната сменилась (вызывающий обязан - * вернуть себе draw-страницу и обнулить счётчик кадров смерти). */ -uint8_t pop_dbg_roomnav(uint8_t dir) __banked; - -/* Читы по фронту нажатия (K/I/S/Shift+L/U/[/]/F7/F8). В банке: раз в кадр, - * а резидент W1/W2 переполнен — см. шапку функции. */ -void pop_cheat_tick(void) __banked; - -/* Кто рисуется ПОЗЖЕ — Кид или соперник (порядок обхода тайлов оригинала, - * set_objtile_at_char + sort_curr_objs). 1 = соперник поверх. Зовётся раз - * в кадр, поэтому живёт в банке: трамплин на кадр дешевле полукилобайта - * резидента. */ -uint8_t guard_over_kid(void) __banked; - -/* Перевернуть уже нарисованное (зелье инверсии, уровень 9): две копии - * акселератором + инвалидация слотов персонажей и полосы HP. Звать РАЗ на - * переключение, по флагу pop_upside_dirty. */ -void pop_flip_screen(void) __banked; - -/* ---- Запуск / смена уровня / завершение ------------------------------ * - * Три куска главного цикла с частотой «раз за игру» или «раз на уровень». - * В резиденте от них остались только вызовы. */ - -/* СТАРТ В ТРИ ФАЗЫ — ради быстрого появления заставки; подробности и - * причины (в том числе почему часть загрузок убрана совсем) — в шапке - * pop_boot в sprpop_cold.c. 0 — OK, -1 — фатально (сообщение выведено). - * - * pop_boot() настройки + графика, чёрный экран; - * pop_boot_sound() индекс+первая страница звука, индекс музыки, CBL — - * звать, когда титул уже на экране: после него можно - * пускать тему заставки; - * pop_boot_rest() всё тяжёлое (эффекты, Кид, Тень, шрифт) под стоящим - * титулом; идемпотентно, страхуется вызовом из - * pop_new_game_load/pop_level_switch на случай, если - * заставку пропустили сразу. */ -int pop_boot(void) __banked; -int pop_boot_sound(void) __banked; -int pop_boot_rest(void) __banked; - -/* Перейти на pop_next_level: файл уровня, спрайты соперника, тайлсет, - * старт. На время I/O закрывает CBL и оставляет его закрытым: caller обязан - * вызвать pop_sfx_start ПОСЛЕ palette/fade/восстановления snapshot. Если - * файла нет — молча остаться на текущем. -1 — фатально. */ -int pop_level_switch(void) __banked; - -/* Смена уровня целиком (катсцена, гашение, загрузка, палитра, звук). - * back — страница кадра главного цикла. 0 — ок, -1 — сбой. */ -int8_t pop_level_change(uint8_t back) __banked; - -/* Клавиши служебного слоя. Живут здесь, а не в sprpop.c: сам обработчик - * (pop_frame_ui) переехал в банк, а главный цикл о них больше не знает. */ -#define KBD_QUICKSAVE 0x0B /* F6, PS/2 set 2 */ -#define KBD_QUICKLOAD 0x01 /* F9, PS/2 set 2 */ -/* МЕНЮ — Backspace, как в оригинале (keys.txt); Esc оставлен дублёром, - * потому что у SDLPoP он тоже открывает меню по умолчанию. */ -#define KBD_MENU 0x66 /* Backspace */ -#define KBD_MENU_ALT 0x76 /* Esc — дублёр */ -/* F10 больше НЕ здесь: он ловится в kbd_idle (sprpop.c) и работает везде, а - * не только в игровом цикле. Тут остаётся Ctrl+Q — вторая клавиша выхода - * из keys.txt. */ -#define KBD_QUIT 0x15 /* Q — вместе с Ctrl */ -#define KBD_RESTART 0x1C /* A — Ctrl+A, рестарт уровня */ -#define KBD_INTRO 0x2D /* R — Ctrl+R, вернуться в заставку */ -#define KBD_SHOWTIME 0x29 /* Space — сколько осталось (seg000:612) */ -#define KBD_TIMER 0x2C /* T — постоянный показ таймера. БЕЗ модификаторов: - * Shift+T в keys.txt — «добавить HP» (фаза C) */ - -/* Меню, F10 и QuickSave/Load на границе кадра. restart_level/dead_reset — - * флаги для главного цикла. 0 — продолжаем, 1 — Restart Game, 2 — Quit, - * -1 — сбой. */ -int8_t pop_frame_ui(uint8_t *restart_level, uint8_t *dead_reset) __banked; - -/* Чистый старт настоящей игры после Enter/Esc на title/intro/credits либо - * клавиши в attract-demo. Ждёт отпускания клавиши, сбрасывает состояние - * новой игры, загружает FIRST_LEVEL и проявляет его первый кадр. */ -int pop_new_game_load(void) __banked; - -/* Снять idle-хук, закрыть ввод и графику, отдать все ресурсы. */ -void pop_shutdown(void) __banked; - -#endif /* ROOMTEST_COLD_H */ diff --git a/applications/SprPoP/tests/host/Makefile b/applications/SprPoP/tests/host/Makefile deleted file mode 100644 index de521a4..0000000 --- a/applications/SprPoP/tests/host/Makefile +++ /dev/null @@ -1,132 +0,0 @@ -# Модульные тесты движка SprPoP под ucsim_z80. Обвязка общая (testkit/), -# здесь — только сами наборы и список модулей, которые в них линкуются. -# Наружу тесты знают тот же единственный путь, что и само приложение, — -# корень тулчейна (см. ../../Makefile). Всё остальное считается от него. --include $(CURDIR)/../../local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(CURDIR)/../../../../bin/sprinter-cc),$(abspath $(CURDIR)/../../../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT для host-тестов SprPoP) -endif -TESTKIT := $(SPRINTER_ROOT)/testkit -APP_DIR := $(abspath $(CURDIR)/../..) -ENGINE_DIR := $(APP_DIR)/src - -# t_phys гоняет НАСТОЯЩУЮ физику, а она ходит по таблицам анимации -# абсолютными адресами от KD_DATA_OFF (0x100) — там, куда на устройстве -# мапится страница W0. Значит блоб kid_data.bin лежит по 0x100, и код -# набора обязан начинаться выше его конца. С добавлением таблицы кадров -# КАТСЦЕН блоб вырос до 4150 Б (0x100 + 4150 = 0x1136), и прежние 0x1000 -# уже резали его хвост — набор падал как «main() не позвал ни одной -# проверки». Держим запас: следующая таблица снова сдвинет границу. -CODE_LOC := 0x1400 -# Данные — выше 0x8000: набор t_phys линкует уже полдвижка (геометрия, Kid, -# карта/физика, управление, страж) и его код перевалил за 0x8000. Раньше -# это проявлялось как «тест зациклился»: хвост кода ложился поверх _DATA. -# 0x9000 оставляет ~24 КБ под код и ~28 КБ до стека (0xFEF0). -DATA_LOC := 0xA000 - -# Заголовки libc/libbgi нужны потому, что pop_kid.c включает gfx/sprite/ -# sprinter: под тестом эти функции заглушены (stubs.c), но объявления -# берутся настоящие — иначе разъедутся сигнатуры. -PROJ_ROOT := $(abspath $(TESTKIT)/..) -EXTRA_INC := -I$(PROJ_ROOT)/libc/include -I$(PROJ_ROOT)/libbgi/include -I$(CURDIR) \ - -I$(APP_DIR)/gen # генерируемые заголовки (pop_bg_atlas.h и прочие) - -OBJS_geom := build/eng_pop_geom.rel - -# pop_guard.c линкуется НАСТОЯЩИЙ, а не заглушкой: после перевода физики на -# Char урон идёт через pop_take_hp, и кому именно он достанется (hitp_* или -# guardhp_*) решает charid — то есть ровно та логика, которую тесты обязаны -# проверять, а не имитировать. -# eng_pop_kboot — загрузчик таблиц анимации: с 2026-08-12 он живёт отдельным -# модулем (в продукте — банк 8), а сцене он нужен: sc_init зовёт -# pop_kid_data_load, и стабы open/read отдают ему настоящий блоб. -OBJS_phys := build/eng_pop_geom.rel build/eng_pop_kid.rel \ - build/eng_pop_kboot.rel \ - build/eng_pop_map.rel build/eng_pop_ctrl.rel \ - build/eng_pop_state.rel build/eng_pop_guard.rel \ - build/eng_pop_guard_cold.rel \ - build/stubs.rel build/scene.rel build/kid_blob.rel \ - build/bank_stub.rel - -# Пробный набор (разведка, без эталонов) линкуется тем же составом. -OBJS_grab := $(OBJS_phys) -# t_wall — удар о стену в воздухе (BUG-JUMPWALL-1), состав тот же. -OBJS_wall := $(OBJS_phys) -# t_hang — зацеп обязан ДЕРЖАТЬСЯ (регресс glide_through_wall_guard). -OBJS_hang := $(OBJS_phys) -# t_gate — открытая решётка не должна считаться стеной у осторожного шага -# (нужны pop_map + физика, то есть тот же состав). -OBJS_gate := $(OBJS_phys) -# t_char — физика над Char для РАЗНЫХ персонажей (Кид / страж / тень). -OBJS_char := $(OBJS_phys) -# t_mouse — спецсобытие уровня 8 (мышь). ЕДИНСТВЕННЫЙ набор, куда линкуется -# guards.c: здесь проверяется сам ИИ (autocontrol_mouse) вместе с рождением -# (pop_check_mouse) и общей физикой соперника — то есть ровно то, что в -# остальных наборах заменено ручным прогоном play_guard_frame. -OBJS_mouse := $(OBJS_phys) build/eng_guards.rel -# t_shadow — спецсобытия уровня 12 (встреча с тенью, общий урон, слияние). -# guards.c нужен по той же причине, что и мыши: check_shadow/ -# check_killed_shadow/sword_disappears живут в нём. -OBJS_shadow := $(OBJS_phys) build/eng_guards.rel -# t_jaffar — спецсобытия уровня 13 (встреча, победа, выход, падающая гряда). -OBJS_jaffar := $(OBJS_phys) build/eng_guards.rel -# t_death — смерть от меча: HP, признак смерти и, главное, координата с -# остаточной скоростью падения (находки 12/13 в docs/sdlpop_audit.md). -OBJS_death := $(OBJS_phys) build/eng_guards.rel -# t_cfg — весь codec POP.CFG из единственного прикладного модуля. -OBJS_cfg := build/eng_pop_config.rel build/bank_stub.rel -# pop_app — чистая таблица переходов, без DSS/графики. -OBJS_app := build/eng_pop_app.rel build/bank_stub.rel -# pop_demo — запись управления; t_demo подменяет выход control и raw input. -OBJS_demo := build/eng_pop_demo.rel build/bank_stub.rel -# pop_timer — чистое ядро логического времени; поток QuickSave заглушен -# memory-stream'ом в t_timer.c. -OBJS_timer := build/eng_pop_timer.rel build/bank_stub.rel -# pop_cutscene — общий интерпретатор статических сценариев. Он не знает -# графики, поэтому проверяется отдельно от PV/title-ресурсов. -OBJS_cutscene := build/eng_pop_cutscene.rel build/bank_stub.rel -# pop_flow — чистая таблица маршрута перед загрузкой следующего уровня. -OBJS_flow := build/eng_pop_flow.rel build/bank_stub.rel - -include $(TESTKIT)/host-tests.mk - -# У host-теста нет DSS/EMM: ему нужен тот же codec/state, но не target-I/O. -build/eng_pop_config.rel: $(ENGINE_DIR)/pop_config.c | $(BUILD) - @$(SDCC) $(CFLAGS) -DPOP_CONFIG_HOST_TEST -c -o $@ $< - -build/eng_pop_timer.rel: $(ENGINE_DIR)/pop_timer.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_demo.rel: $(ENGINE_DIR)/pop_demo.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_cutscene.rel: $(ENGINE_DIR)/pop_cutscene.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/eng_pop_flow.rel: $(ENGINE_DIR)/pop_flow.c | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -# --- t_phys: блоб таблиц анимации ------------------------------------ -# Берём дисковый ресурс из assets/packed (он в репозитории), а не выхлоп -# упаковщика из build/: тесты обязаны собираться и без assets/orig/. -# Прежнее имя kid_data.bin устарело — файл давно называется kid.ani. -KID_BIN := $(APP_DIR)/assets/packed/KID/kid.ani - -build/kid_blob.c: gen_kid_blob.py $(KID_BIN) | $(BUILD) - @python3 gen_kid_blob.py $(KID_BIN) $@ - -build/kid_blob.rel: build/kid_blob.c kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/stubs.rel: stubs.c stubs.h kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/scene.rel: scene.c scene.h stubs.h kidblob.h | $(BUILD) - @$(SDCC) $(CFLAGS) -c -o $@ $< - -build/bank_stub.rel: bank_stub.s | $(BUILD) - @$(SDASZ80) -plosgff $@ $< - -# Эталоны трасс: пересобрать набор, если их правили (см. шапку t_phys.c). -build/phys.rel: $(wildcard golden/*.h) diff --git a/applications/SprPoP/tests/host/README.md b/applications/SprPoP/tests/host/README.md deleted file mode 100644 index db81c9a..0000000 --- a/applications/SprPoP/tests/host/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# tests-host — модульные тесты движка SprPoP - -Прогоняются под `ucsim_z80`, обвязка общая — `testkit/` (там же объяснение, -почему под z80, а не хостовым gcc, и грабли). - -``` -make host-tests # из корня, вместе с остальными -make -C applications/SprPoP/tests/host # только эти -make -C applications/SprPoP/tests/host t_geom -``` - -## Что покрыто - -| набор | модуль | что проверяет | -|-------|--------|---------------| -| `t_geom` | `pop_geom.c` | геометрия комнаты (`x_bump`, `y_land`, `y_to_row`) и PRNG оригинала | -| `t_phys` | `pop_map.c` + `pop_kid.c` + `pop_ctrl.c` | покадровые трассы физики Кида: стойка, бег, шаг с Shift, разворот, присед, прыжок вверх, падение с кромки, loose-плита, разбег-прыжок через провал | -| `t_char` | те же + `pop_guard.c` | физика над `Char` для РАЗНЫХ персонажей: кому достаётся урон (`take_hp` по charid), ветки `land()` (Кид −1 HP с двух рядов, страж гибнет, тень цела), падение и гард по X у слота Guard, `check_guard_fallout`, «окна Char не путают персонажей» | - -Главный тест в `t_geom` — `geom_lcg_matches_reference`. LCG оригинала -(`s = s*214013 + 2531011`) написан в `pop_geom.c` на ассемблере по схеме -Горнера ради обхода `__mullong`, и заявка «бит-в-бит как в SDLPoP» до -появления теста держалась только на комментарии. Тест сверяет рукописный -asm с наивной 32-битной формулой на 128 шагах — и по возвращаемому -значению, и по обеим половинам сида. - -## t_phys: характеризация, а не проверка правильности - -Набор существует ради **страховки под рефакторинг**. Эталоны сняты с -текущего билда, то есть консервируют и текущие баги — правильность -по-прежнему проверяется сверкой с `SDLPoP/src/`. Ценность в другом: -ближайший крупный шаг (перенос физики с `Kid.` на `Char.`, чтобы её мог -переиспользовать страж) обязан быть **поведение-сохраняющим**, и «трасса до -== трасса после» ловит ровно тот класс ошибок, который там возможен. - -Поэтому эталон **переснимается только осознанно**, и в коммите должно быть -написано, что и почему поменялось. Молча обновлённый эталон обесценивает -весь набор. - -Своё дело набор сделал: перенос физики на `Char` (GUARD-PHYS, 2026-08-07) -прошёл при **неизменных трассах** — 1723 проверки без единого расхождения. - -## Грабли раскладки: `DATA_LOC` - -Набор линкует уже полдвижка, и его код перевалил за `--data-loc 0x8000`. -Линкер `sdld` это НЕ ошибка: хвост кода (`_HOME`, деления из libsdcc) он -молча кладёт ПОВЕРХ `_DATA`, после чего тест ведёт себя как «зациклился» -— хотя логика ни при чём. Час на поиск стоило именно это. - -Поэтому: `DATA_LOC` в Makefile набора (сейчас `0x9000`), а `host-tests.mk` -перед каждым прогоном проверяет `CODE_LOC + l__CODE <= DATA_LOC` и падает -с внятным сообщением. Упёрлись снова — поднять `DATA_LOC` (стек в -`crt0_ucsim` начинается с 0xFEF0). - -``` -python3 record_golden.py # переснять все трассы -python3 record_golden.py 7 9 # только сценарии 7 и 9 -``` - -Трасса — по одной записи на кадр: `frame, x, y, dir, col, row, action` и -смещение `curr_seq` от `SEQTBL_BASE`. Кадр гоняется ровно в том порядке, -что и в главном цикле `sprpop.c`: - -``` -pop_ctrl_tick(); // ввод -> control(): смена последовательности -kid_tick(); // play_seq: следующий кадр -pop_phys_tick(); // падение/приземление/стена -pop_loose_tick(); // досчёт тряски и снятие провалившейся плиты -``` - -Покадровость здесь принципиальна: порт seg005/seg006 — конечный автомат, и -ошибка почти всегда проявляется не в одной функции, а в расхождении -траектории через несколько кадров. Плюс главный риск переноса на `Char` — -не арифметика, а то, **кто владеет окном `Char` внутри кадра**; поймать это -можно только прогоном полного кадра. - -Проверка, что харнесс воспроизводит устройство: сценарий `stand` даёт -`frame=15, x=114, y=118, curr_seq=0x19A3` — те же значения, что читаются из -`_Kid` в живом MAME. - -### Как это заработало под ucsim - -Три шва, каждый закрыт без правок продуктового кода: - -1. **Таблицы анимации.** `pop_kid.c` ходит по ним абсолютными адресами от - `KD_DATA_OFF` (0x100) — там, куда на устройстве их приводит маппинг W0. - В тесте `kid_data.bin` просто кладётся по 0x100 (`gen_kid_blob.py`), а - `gfx_w0_map` заглушен. Следствие: код набора линкуется с - `--code-loc 0x1000` (`CODE_LOC` в Makefile), чтобы не налезть на блоб. -2. **Окружение.** `stubs.c` — libc/libbgi (графика, память, файлы), соседние - модули (`pop_bg`/`pop_trob`/`pop_level`/`pop_redraw`) и состояние стража. - Заглушки не пустые там, где это меняет смысл: файловое чтение реально - отдаёт `kid_data.bin` (иначе `pop_kid_data_load` тихо сдаётся, `kdat_ok` - остаётся нулём и `play_seq` не делает ничего — трасса выходит из одного - застывшего кадра), клавиатура отвечает по набору «нажатых» скан-кодов - (так под тест попадают `read_input` и `read_user_control`, а не только - диспетчер), а обращения к соседям **журналируются** (`tk_log`) — можно - проверять «плита отвалилась и попросила перерисовку», а не только - координаты. -3. **`__banked`.** Модули физики помечены как банковые, SDCC генерирует на - них трамплин `___sdcc_bcall_ehl`, которому нужны `set_bank`/`get_bank`. - В тесте память плоская — `bank_stub.s` отдаёт нулевой банк и пустое - переключение, соблюдая контракт по регистрам. - -Что харнесс НЕ покрывает и остаётся за MAME: отрисовка и окклюзия, реальные -переключения банков, тайминги кадра, настоящая клавиатура. - -## Что нужно, чтобы двинуться дальше - -- **Доступ к странице уровня.** `pop_level.c` ходит по абсолютным адресам - (`(uint8_t *)(LVL_DATA_OFF + …)` после `gfx_w0_map`). Для `pop_map` это не - потребовалось — карту комнаты в него ИНЪЕКТИРУЮТ через `pop_map_set`, — - но набор на сам `pop_level`/`pop_trob` в это упрётся. Решение то же, что - для `kid_data`: положить страницу по нужному адресу и поднять `CODE_LOC`. -- **Сценарии из `BUGS_CLOSED.md`.** У каждой закрытой записи есть симптом и - ожидаемое поведение — готовый список регрессионных кейсов, который стоит - переносить в `t_phys` по мере надобности. -- **BUG-LOOSE-2** (гонка «уйти из комнаты раньше, чем долетит плита») — - через мост MAME воспроизвести не удалось, а на уровне логики это - несколько строк: заспавнить кусок, сменить комнату, тикать до - приземления, проверить щебень. diff --git a/applications/SprPoP/tests/host/bank_stub.s b/applications/SprPoP/tests/host/bank_stub.s deleted file mode 100644 index 5e7921a..0000000 --- a/applications/SprPoP/tests/host/bank_stub.s +++ /dev/null @@ -1,25 +0,0 @@ -;-------------------------------------------------------------------------- -; bank_stub.s — set_bank/get_bank для прогона под ucsim. -; -; Модули движка помечены __banked (в продукте они лежат в страницах W3), и -; SDCC генерирует на такие вызовы трамплин ___sdcc_bcall_ehl из своей -; библиотеки. Трамплин обязан найти две пользовательские подпрограммы: -; -; get_bank — вернуть в A номер текущего банка, прочие регистры не трогать -; set_bank — переключить банк на A, прочие регистры не трогать -; -; В тесте банков нет: вся память плоская, все модули слинкованы вместе. -; Поэтому «банк» всегда нулевой, а переключение — пустое. Важно только -; соблюсти контракт по регистрам, иначе трамплин испортит аргументы вызова. -;-------------------------------------------------------------------------- - .area _CODE - - .globl set_bank - .globl get_bank - -get_bank:: - ld a, #0x00 - ret - -set_bank:: - ret diff --git a/applications/SprPoP/tests/host/gen_kid_blob.py b/applications/SprPoP/tests/host/gen_kid_blob.py deleted file mode 100644 index 1974d6b..0000000 --- a/applications/SprPoP/tests/host/gen_kid_blob.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 -""" -gen_kid_blob.py — kid_data.bin как C-массив для тестов под ucsim. - -Зачем. Таблицы кадров и seqtbl живут в EMM-странице, замапленной в W0, и -pop_kid ходит по ним АБСОЛЮТНЫМИ адресами от KD_DATA_OFF (0x100). В ucsim -никакого W0 нет, зато есть ровная 64-КБ память, поэтому тест просто кладёт -файл по 0x100 и глушит gfx_w0_map. Единственное следствие для сборки — -код набора линкуется с --code-loc выше конца блоба (см. Makefile). - -Файл берётся ровно тот, что уходит на устройство, — pop_extract_kid_data.py -делает его из оригинального PRINCE.EXE, так что тест проверяет порт против -НАСТОЯЩИХ данных игры, а не против переписанной от руки таблицы. -""" -import sys -from pathlib import Path - -src, dst = Path(sys.argv[1]), Path(sys.argv[2]) -data = src.read_bytes() - -out = [ - "/* Сгенерировано gen_kid_blob.py — не править руками. */", - '#include "kidblob.h"', - "", - f"const unsigned char kid_blob[{len(data)}] = {{", -] -for i in range(0, len(data), 16): - out.append(" " + ",".join(str(b) for b in data[i:i + 16]) + ",") -out += [ - "};", - "", - f"const unsigned int kid_blob_size = {len(data)};", - "", - "/* Разложить блоб по KD_DATA_OFF. Без memcpy: тестовый бинарь не", - " * линкуется с libc, а тянуть ради этого z80-рантайм незачем. */", - "void kid_blob_install(void)", - "{", - " unsigned char *d = (unsigned char *)KID_BLOB_ADDR;", - " const unsigned char *s = kid_blob;", - f" unsigned int n = {len(data)};", - " while (n--) *d++ = *s++;", - "}", - "", -] -dst.write_text("\n".join(out)) -print(f"gen_kid_blob: {src.name} -> {dst.name} ({len(data)} Б)") diff --git a/applications/SprPoP/tests/host/golden/crouch.h b/applications/SprPoP/tests/host/golden/crouch.h deleted file mode 100644 index 62fdebf..0000000 --- a/applications/SprPoP/tests/host/golden/crouch.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: crouch. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x6B, 0x81, 0x76, 0x00, 0x04, 0x01, 0x01, 0x3E, 0x06, - 0x6C, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x41, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6D, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x42, 0x06, - 0x6E, 0x84, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4A, 0x06, - 0x6F, 0x84, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4B, 0x06, - 0x70, 0x86, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4E, 0x06, - 0x71, 0x86, 0x76, 0x00, 0x04, 0x01, 0x05, 0x4F, 0x06, - 0x72, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x52, 0x06, - 0x73, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x53, 0x06, - 0x74, 0x87, 0x76, 0x00, 0x04, 0x01, 0x05, 0x54, 0x06, - 0x75, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x57, 0x06, - 0x76, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x58, 0x06, - 0x77, 0x83, 0x76, 0x00, 0x04, 0x01, 0x05, 0x59, 0x06, - 0x0F, 0x83, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x83, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/SprPoP/tests/host/golden/fall_ledge.h b/applications/SprPoP/tests/host/golden/fall_ledge.h deleted file mode 100644 index 450567d..0000000 --- a/applications/SprPoP/tests/host/golden/fall_ledge.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: fall_ledge. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x66, 0x9E, 0x79, 0x00, 0x06, 0x02, 0x03, 0x77, 0x02, - 0x67, 0xA0, 0x7F, 0x00, 0x06, 0x02, 0x03, 0x7C, 0x02, - 0x68, 0x9F, 0x88, 0x00, 0x06, 0x02, 0x03, 0x81, 0x02, - 0x69, 0x9F, 0x94, 0x00, 0x06, 0x02, 0x03, 0x84, 0x02, - 0x6A, 0x9E, 0xA6, 0x00, 0x06, 0x02, 0x04, 0xDE, 0x03, - 0x6B, 0xA0, 0xB5, 0x00, 0x06, 0x02, 0x05, 0xC3, 0x06, - 0x6C, 0xA2, 0xB5, 0x00, 0x06, 0x02, 0x05, 0xC6, 0x06, - 0x6D, 0xA2, 0xB5, 0x00, 0x06, 0x02, 0x01, 0xC9, 0x06, - 0x6E, 0xA3, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4A, 0x06, - 0x6F, 0xA3, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4B, 0x06, - 0x70, 0xA5, 0xB5, 0x00, 0x06, 0x02, 0x05, 0x4E, 0x06, diff --git a/applications/SprPoP/tests/host/golden/jump_up.h b/applications/SprPoP/tests/host/golden/jump_up.h deleted file mode 100644 index 98ddae4..0000000 --- a/applications/SprPoP/tests/host/golden/jump_up.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: jump_up. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x43, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x12, 0x04, - 0x44, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x13, 0x04, - 0x45, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x14, 0x04, - 0x46, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x15, 0x04, - 0x47, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x16, 0x04, - 0x48, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x17, 0x04, - 0x49, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x18, 0x04, - 0x4A, 0x80, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x19, 0x04, - 0x4B, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1A, 0x04, - 0x4C, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1B, 0x04, - 0x4D, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1C, 0x04, - 0x4E, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1D, 0x04, - 0x4F, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x1E, 0x04, - 0x4F, 0x80, 0x72, 0xFF, 0x04, 0x01, 0x01, 0x21, 0x04, - 0x4F, 0x80, 0x70, 0xFF, 0x04, 0x01, 0x01, 0x24, 0x04, - 0x4F, 0x80, 0x70, 0xFF, 0x04, 0x01, 0x01, 0x25, 0x04, - 0x4F, 0x80, 0x72, 0xFF, 0x04, 0x01, 0x01, 0x28, 0x04, - 0x51, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0xB8, 0x03, - 0x52, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x01, 0xB9, 0x03, - 0x53, 0x80, 0x76, 0xFF, 0x04, 0x01, 0x05, 0xBC, 0x03, diff --git a/applications/SprPoP/tests/host/golden/loose.h b/applications/SprPoP/tests/host/golden/loose.h deleted file mode 100644 index d1df6d1..0000000 --- a/applications/SprPoP/tests/host/golden/loose.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: loose. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x9D, 0x76, 0x00, 0x06, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x9E, 0x76, 0x00, 0x06, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xA0, 0x76, 0x00, 0x06, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0xA4, 0x76, 0x00, 0x06, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0xA9, 0x76, 0x00, 0x07, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0xAB, 0x76, 0x00, 0x07, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0xAE, 0x76, 0x00, 0x07, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0xB2, 0x76, 0x00, 0x07, 0x01, 0x01, 0x14, 0x00, - 0x08, 0xB7, 0x76, 0x00, 0x08, 0x01, 0x01, 0x17, 0x00, - 0x09, 0xB8, 0x76, 0x00, 0x08, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xBA, 0x76, 0x00, 0x08, 0x01, 0x01, 0x1F, 0x00, diff --git a/applications/SprPoP/tests/host/golden/rjump_gap3.h b/applications/SprPoP/tests/host/golden/rjump_gap3.h deleted file mode 100644 index d2c141c..0000000 --- a/applications/SprPoP/tests/host/golden/rjump_gap3.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Эталон трассы: rjump_gap3. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x08, 0x00, - 0x02, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x09, 0x00, - 0x03, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0xB8, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0xB0, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0xAD, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x11, 0x00, - 0x07, 0xAA, 0x76, 0xFF, 0x08, 0x01, 0x01, 0x14, 0x00, - 0x08, 0xA5, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x17, 0x00, - 0x09, 0xA4, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0xA2, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x9E, 0x76, 0xFF, 0x07, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x99, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x97, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x2A, 0x00, - 0x22, 0x95, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x64, 0x01, - 0x23, 0x90, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x67, 0x01, - 0x24, 0x8A, 0x76, 0xFF, 0x06, 0x01, 0x01, 0x6A, 0x01, - 0x25, 0x87, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x6D, 0x01, - 0x26, 0x82, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x72, 0x01, - 0x27, 0x7B, 0x76, 0xFF, 0x05, 0x01, 0x01, 0x75, 0x01, - 0x28, 0x6F, 0x73, 0xFF, 0x04, 0x01, 0x01, 0x7A, 0x01, - 0x29, 0x67, 0x6A, 0xFF, 0x03, 0x01, 0x01, 0x7F, 0x01, - 0x2A, 0x5F, 0x68, 0xFF, 0x02, 0x01, 0x01, 0x84, 0x01, - 0x2B, 0x5B, 0x73, 0xFF, 0x01, 0x01, 0x01, 0x89, 0x01, - 0x2C, 0x57, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x8E, 0x01, - 0x07, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x32, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x93, 0x04, - 0x33, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x94, 0x04, - 0x34, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x95, 0x04, - 0x0F, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x00, 0x35, 0x00, - 0x10, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x28, 0x01, - 0x11, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x29, 0x01, - 0x12, 0x50, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x2C, 0x01, - 0x13, 0x4E, 0x76, 0xFF, 0x01, 0x01, 0x01, 0x2F, 0x01, - 0x32, 0x52, 0x76, 0xFF, 0x01, 0x01, 0x05, 0x93, 0x04, diff --git a/applications/SprPoP/tests/host/golden/run_right.h b/applications/SprPoP/tests/host/golden/run_right.h deleted file mode 100644 index 96c4fd6..0000000 --- a/applications/SprPoP/tests/host/golden/run_right.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Эталон трассы: run_right. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x01, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x56, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x5E, 0x76, 0x00, 0x01, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x61, 0x76, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x64, 0x76, 0x00, 0x01, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x69, 0x76, 0x00, 0x02, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x6A, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x6C, 0x76, 0x00, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x70, 0x76, 0x00, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x75, 0x76, 0x00, 0x03, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x7A, 0x76, 0x00, 0x03, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x83, 0x76, 0x00, 0x04, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x84, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x86, 0x76, 0x00, 0x04, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x8A, 0x76, 0x00, 0x04, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x8F, 0x76, 0x00, 0x05, 0x01, 0x01, 0x25, 0x00, - 0x0D, 0x91, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2A, 0x00, - 0x0E, 0x94, 0x76, 0x00, 0x05, 0x01, 0x01, 0x2D, 0x00, - 0x07, 0x98, 0x76, 0x00, 0x05, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x9D, 0x76, 0x00, 0x06, 0x01, 0x01, 0x17, 0x00, diff --git a/applications/SprPoP/tests/host/golden/stand.h b/applications/SprPoP/tests/host/golden/stand.h deleted file mode 100644 index 8610c7c..0000000 --- a/applications/SprPoP/tests/host/golden/stand.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Эталон трассы: stand. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x72, 0x76, 0xFF, 0x03, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/SprPoP/tests/host/golden/step_shift.h b/applications/SprPoP/tests/host/golden/step_shift.h deleted file mode 100644 index c6c0891..0000000 --- a/applications/SprPoP/tests/host/golden/step_shift.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Эталон трассы: step_shift. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x79, 0x72, 0x76, 0x00, 0x03, 0x01, 0x01, 0x6F, 0x05, - 0x7A, 0x73, 0x76, 0x00, 0x03, 0x01, 0x01, 0x72, 0x05, - 0x7B, 0x74, 0x76, 0x00, 0x03, 0x01, 0x01, 0x75, 0x05, - 0x7C, 0x77, 0x76, 0x00, 0x03, 0x01, 0x01, 0x78, 0x05, - 0x7D, 0x7B, 0x76, 0x00, 0x03, 0x01, 0x01, 0x7B, 0x05, - 0x7E, 0x7E, 0x76, 0x00, 0x03, 0x01, 0x01, 0x7E, 0x05, - 0x7F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x81, 0x05, - 0x80, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x82, 0x05, - 0x81, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x83, 0x05, - 0x82, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x84, 0x05, - 0x83, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x85, 0x05, - 0x84, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x01, 0x86, 0x05, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, - 0x0F, 0x7D, 0x76, 0x00, 0x04, 0x01, 0x00, 0x35, 0x00, diff --git a/applications/SprPoP/tests/host/golden/turn.h b/applications/SprPoP/tests/host/golden/turn.h deleted file mode 100644 index 66f5dbd..0000000 --- a/applications/SprPoP/tests/host/golden/turn.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Эталон трассы: turn. Снят record_golden.py — не править руками. - * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */ - 0x2D, 0x7A, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD1, 0x01, - 0x2E, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD4, 0x01, - 0x2F, 0x77, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xD7, 0x01, - 0x30, 0x78, 0x76, 0xFF, 0x04, 0x01, 0x07, 0xDA, 0x01, - 0x01, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x08, 0x00, - 0x02, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x09, 0x00, - 0x03, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x0A, 0x00, - 0x04, 0x79, 0x76, 0xFF, 0x04, 0x01, 0x01, 0x0B, 0x00, - 0x05, 0x71, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x0E, 0x00, - 0x06, 0x6E, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x11, 0x00, - 0x07, 0x6B, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x14, 0x00, - 0x08, 0x66, 0x76, 0xFF, 0x03, 0x01, 0x01, 0x17, 0x00, - 0x09, 0x65, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x1C, 0x00, - 0x0A, 0x63, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x1F, 0x00, - 0x0B, 0x5F, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x22, 0x00, - 0x0C, 0x5A, 0x76, 0xFF, 0x02, 0x01, 0x01, 0x25, 0x00, diff --git a/applications/SprPoP/tests/host/kidblob.h b/applications/SprPoP/tests/host/kidblob.h deleted file mode 100644 index 11f58aa..0000000 --- a/applications/SprPoP/tests/host/kidblob.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * kidblob.h — таблицы анимации Кида в памяти теста. - * - * KID_BLOB_ADDR обязан совпадать с KD_DATA_OFF из pop_kid.c: продукт - * адресует таблицы именно так, и в этом весь смысл — под тестом работает - * тот же код доступа, что на устройстве, просто без маппинга W0. - */ -#ifndef POP_TESTS_KIDBLOB_H -#define POP_TESTS_KIDBLOB_H - -#define KID_BLOB_ADDR 0x0100 - -extern const unsigned char kid_blob[]; -extern const unsigned int kid_blob_size; - -void kid_blob_install(void); - -#endif diff --git a/applications/SprPoP/tests/host/record_golden.py b/applications/SprPoP/tests/host/record_golden.py deleted file mode 100644 index b21db80..0000000 --- a/applications/SprPoP/tests/host/record_golden.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -""" -record_golden.py — снять эталонные трассы для t_phys. - -Зачем скрипт, а не один прогон. Отчёт tcheck ограничен 768 байтами лога, а -трасс на все сценарии сильно больше. Поэтому набор умеет снимать РОВНО -ОДИН сценарий за прогон (-DSC_RECORD=), а перебор делает этот скрипт: -собирает набор N раз, каждый раз забирает из отчёта имя сценария и его -трассу и пишет golden/<имя>.h. - -Эталон фиксирует ТЕКУЩЕЕ поведение. Это осознанно: набор страхует -поведение-сохраняющие правки (перенос физики Kid -> Char), а не доказывает -правильность. Правильность — сверка с SDLPoP. Поэтому переснимать эталоны -можно только вместе с внятным объяснением, что и почему поменялось. - -Использование: - python3 record_golden.py # снять все сценарии - python3 record_golden.py 7 9 # только эти номера -""" -import re -import subprocess -import sys -from pathlib import Path - -HERE = Path(__file__).resolve().parent -GOLDEN = HERE / "golden" -# Число сценариев = число TC_RUN в t_phys.c: список ведётся там, здесь его -# дублировать незачем. -NSCEN = len(re.findall(r"^\s*TC_RUN\(", (HERE / "t_phys.c").read_text(), re.M)) - - -def record(n: int) -> str: - # make не видит смены -DSC_RECORD (в зависимостях только файлы), поэтому - # объектник набора сносим руками — иначе следующий прогон молча снимет - # трассу предыдущего сценария под новым именем. - for f in ("phys.rel", "phys.ihx"): - (HERE / "build" / f).unlink(missing_ok=True) - subprocess.run(["make", "-s", "build/phys.ihx", f"EXTRA_CFLAGS=-DSC_RECORD={n}"], - cwd=HERE, check=True) - p = subprocess.run(["make", "-s", "run-phys", f"EXTRA_CFLAGS=-DSC_RECORD={n}"], - cwd=HERE, capture_output=True, text=True) - out = p.stdout - m = re.search(r"^\s*### (\S+)\s*$", out, re.M) - if not m: - raise SystemExit(f"сценарий {n}: в отчёте нет строки '### имя'\n{out}") - name = m.group(1) - rows = re.findall(r"^\s*([0-9A-F]{18})\s*$", out, re.M) - if not rows: - raise SystemExit(f"сценарий {n} ({name}): трасса пустая\n{out}") - - lines = [f"/* Эталон трассы: {name}. Снят record_golden.py — не править руками.", - " * Поля кадра: frame, x, y, dir, col, row, action, seq_lo, seq_hi. */"] - for r in rows: - lines.append(" " + ", ".join(f"0x{r[i:i+2]}" for i in range(0, 18, 2)) + ",") - GOLDEN.mkdir(exist_ok=True) - (GOLDEN / f"{name}.h").write_text("\n".join(lines) + "\n") - return f"{name}: {len(rows)} кадров" - - -def main() -> int: - nums = [int(a) for a in sys.argv[1:]] or list(range(1, NSCEN + 1)) - for n in nums: - print(f"[{n}/{NSCEN}] " + record(n)) - # Итоговая пересборка в обычном режиме, чтобы каталог не остался с - # объектниками, собранными под SC_RECORD. - subprocess.run(["make", "-s", "clean"], cwd=HERE, check=True) - print("эталоны сняты; проверить: make -C", HERE.name, "t_phys") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/applications/SprPoP/tests/host/scene.c b/applications/SprPoP/tests/host/scene.c deleted file mode 100644 index 9202153..0000000 --- a/applications/SprPoP/tests/host/scene.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * scene.c — реализация покадрового раннера (см. scene.h). - */ -#include -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_ctrl.h" -#include "pop_geom.h" -#include "pop_guard.h" -#include "kid_data.h" -#include "scene.h" -#include "stubs.h" -#include "kidblob.h" - -sc_rec sc_trace[SC_TRACE_MAX]; -uint8_t sc_len; - -static uint8_t sc_fg[30]; -/* Соседей у сцены нет (links = 0) — по краям комнаты стена: карта сама - * решает так, когда соседняя комната не задана. */ - -void sc_init(void) -{ - kid_blob_install(); /* таблицы туда, куда смотрит pop_kid */ - pop_kid_data_load("KID\\KID.ANI"); - pop_kid_hp_newgame(); -} - -void sc_room(const uint8_t *fg, uint8_t room) -{ - uint8_t i; - for (i = 0; i < 30; i++) { sc_fg[i] = fg[i]; tk_modif[i] = 0; } - pop_map_set(sc_fg); - pop_map_set_room(room); - /* Изолированная сцена: соседей нет. Тип TILE_WALL (20) с обеих сторон - * и сверху/снизу — тогда решения физики зависят только от sc_fg, и - * трасса не поедет, если когда-нибудь поменяется загрузка кромок. */ - pop_map_set_edges(0, 0, 0, 0); - tk_start_room = room; - tk_log_clear(); -} - -void sc_kid_at(uint8_t col, uint8_t row, int8_t dir) -{ - kid_init(2 /* seq_2_stand */, (int8_t)col, (int8_t)row, dir); - /* kid_init комнату не трогает (в продукте её ставит enter_room_side), а - * сцена обязана быть согласованной: логика, спрашивающая «персонаж в - * ОТРИСОВАННОЙ комнате?» (pop_gate_over_char), иначе всегда отвечает - * «нет». Тест, которому нужна другая комната, задаёт её сам. */ - Kid.room = tk_start_room; - pop_kid_hp_reset(); -} - -void sc_kid_at_x(uint8_t col, uint8_t row, uint8_t x, int8_t dir) -{ - kid_init(2 /* seq_2_stand */, (int8_t)col, (int8_t)row, dir); - Kid.room = tk_start_room; - Kid.x = x; /* тайл задаёт ряд, X — фазу внутри тайла */ - /* Колонку пересчитываем В ОКНЕ Char: determine_col — часть физики, а та - * работает с активным персонажем (порт load_fram_det_col). */ - pop_loadkid(); - pop_determine_col(); - pop_savekid(); - pop_kid_hp_reset(); -} - -/* ---- слот Guard ------------------------------------------------------ */ - -void sc_guard_at(uint8_t charid, uint8_t col, uint8_t row, int8_t dir, uint8_t hp) -{ - /* Поля — как в enter_guard (seg002:0112): X из колонки, Y с пола ряда. */ - Guard.charid = charid; - Guard.curr_col = (int8_t)col; - Guard.curr_row = (int8_t)row; - Guard.x = (uint8_t)(pop_x_bump[col + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX); - Guard.y = (uint8_t)pop_y_land[row + 1]; - Guard.direction = dir; - Guard.alive = -1; - Guard.action = 1; /* actions_1_run_jump */ - Guard.sword = 2; /* у живого стража меч в руке */ - Guard.fall_x = Guard.fall_y = 0; - Guard.repeat = 0; - Guard.room = 1; - guardhp_max = guardhp_curr = hp; - guardhp_delta = 0; - /* Стойка с мечом (seq_77 у неактивного стража — но нам нужна поза, из - * которой персонаж просто стоит и может упасть). */ - pop_loadshad(); - pop_char_set_seq(77 /* seq_77_guard_stand_inactive */); - play_seq(); - pop_saveshad(); -} - -void sc_guard_run(uint8_t n) -{ - uint8_t i; - for (i = 0; i < n; i++) { - /* play_guard_frame (seg000:1246) без ИИ: окно, кадр, seq, физика. */ - pop_loadshad_and_opp(); - pop_load_fram_det_col(); - play_seq(); - pop_saveshad_and_opp(); - pop_guard_phys_tick(); - } -} - -void sc_trace_clear(void) { sc_len = 0; } - -static void sc_record(void) -{ - sc_rec *r; - if (sc_len >= SC_TRACE_MAX) return; - r = &sc_trace[sc_len++]; - r->frame = Kid.frame; - r->x = Kid.x; - r->y = Kid.y; - r->dir = Kid.direction; - r->col = Kid.curr_col; - r->row = Kid.curr_row; - r->action = Kid.action; - r->seq = (uint16_t)(Kid.curr_seq - SEQTBL_BASE); -} - -uint8_t sc_run(uint8_t keys, uint8_t n) -{ - uint8_t i, done = 0; - for (i = 0; i < n; i++) { - tk_keys_clear(); - if (keys & SC_L) tk_key_down(KBD_LEFT); - if (keys & SC_R) tk_key_down(KBD_RIGHT); - if (keys & SC_U) tk_key_down(KBD_UP); - if (keys & SC_D) tk_key_down(KBD_DOWN); - if (keys & SC_SHIFT) tk_key_down(KBD_LSHIFT); - - /* Порядок ровно как в главном цикле sprpop.c (kid_heal и - * отрисовка выпадают — они ничего не решают). pop_loose_tick - * оставлен: он не рисование, а МЕХАНИКА — досчитывает тряску и - * убирает провалившуюся плиту из карты, то есть меняет то, по чему - * физика в следующем кадре принимает решения. */ - pop_ctrl_tick(); - kid_tick(); - pop_phys_tick(); - pop_loose_tick(); - - sc_record(); - done++; - if (sc_len >= SC_TRACE_MAX) break; - } - return done; -} - -/* ---- сверка с эталоном ---------------------------------------------- */ - -void sc_expect(const uint8_t *golden, uint8_t nrec) -{ - uint8_t i; - const uint8_t *g = golden; - tc_check((int16_t)sc_len, (int16_t)nrec, "sc_len", __LINE__); - for (i = 0; i < nrec && i < sc_len; i++, g += SC_REC_BYTES) { - const sc_rec *r = &sc_trace[i]; - /* Номер кадра идёт первым полем каждой проверки: в отчёте видно, - * на каком именно кадре трасса разошлась. */ - tc_check((int16_t)r->frame, (int16_t)g[0], "frame", i); - tc_check((int16_t)r->x, (int16_t)g[1], "x", i); - tc_check((int16_t)r->y, (int16_t)g[2], "y", i); - tc_check((int16_t)r->dir, (int16_t)(int8_t)g[3], "dir", i); - tc_check((int16_t)r->col, (int16_t)(int8_t)g[4], "col", i); - tc_check((int16_t)r->row, (int16_t)(int8_t)g[5], "row", i); - tc_check((int16_t)r->action, (int16_t)g[6], "action", i); - tc_check((int16_t)r->seq, - (int16_t)((uint16_t)g[7] | ((uint16_t)g[8] << 8)), "seq", i); - } -} - -/* ---- снятие эталона -------------------------------------------------- */ - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} - -static void put_byte(uint8_t v) -{ - static const char hex[] = "0123456789ABCDEF"; - put(hex[v >> 4]); put(hex[v & 15]); -} - -void sc_dump(const char *name) -{ - uint8_t i; - tc_result.magic = TC_MAGIC; - tc_result.total = 1; - tc_result.failed = 1; /* иначе раннер лог не напечатает */ - put('#'); put('#'); put('#'); put(' '); - while (*name) put(*name++); - put('\n'); - for (i = 0; i < sc_len; i++) { - const sc_rec *r = &sc_trace[i]; - put_byte(r->frame); - put_byte(r->x); - put_byte(r->y); - put_byte((uint8_t)r->dir); - put_byte((uint8_t)r->col); - put_byte((uint8_t)r->row); - put_byte(r->action); - put_byte((uint8_t)r->seq); - put_byte((uint8_t)(r->seq >> 8)); - put('\n'); - } -} diff --git a/applications/SprPoP/tests/host/scene.h b/applications/SprPoP/tests/host/scene.h deleted file mode 100644 index ba2dafd..0000000 --- a/applications/SprPoP/tests/host/scene.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * scene.h — покадровый сценарный раннер для тестов физики Кида. - * - * Почему покадровый, а не «вызвать функцию и сверить возврат». Порт - * seg005/seg006 — это конечный автомат: диспетчер выбирает - * последовательность, интерпретатор проигрывает её кадр за кадром, физика - * между кадрами двигает персонажа и решает, не пора ли падать. Ошибка - * почти всегда проявляется не в одной функции, а в РАСХОЖДЕНИИ ТРАЕКТОРИИ - * через несколько кадров. Плюс главный риск ближайшего рефакторинга - * (Kid -> Char) — не арифметика, а то, КТО владеет окном Char внутри кадра; - * поймать это можно только прогоном полного кадра, как в главном цикле: - * - * pop_ctrl_tick(); // ввод -> control(): смена последовательности - * kid_tick(); // play_seq: следующий кадр - * pop_phys_tick(); // падение/приземление/стена - * - * Отсюда формат: сцена (комната + стартовая поза) + скрипт ввода, на - * выходе — трасса состояния Кида по кадрам. Сравнение трассы с эталоном - * и есть тест. - */ -#ifndef POP_TESTS_SCENE_H -#define POP_TESTS_SCENE_H - -#include - -/* Одна запись трассы: то, чем оперируют решения движка. curr_seq — - * СМЕЩЕНИЕ от SEQTBL_BASE (адрес зависит от базы, смещение — нет). */ -typedef struct { - uint8_t frame; - uint8_t x, y; - int8_t dir; - int8_t col, row; - uint8_t action; - uint16_t seq; -} sc_rec; - -#define SC_TRACE_MAX 48 -extern sc_rec sc_trace[SC_TRACE_MAX]; -extern uint8_t sc_len; - -/* Кнопки скрипта ввода — битовая маска на кадр. */ -#define SC_L 0x01 -#define SC_R 0x02 -#define SC_U 0x04 -#define SC_D 0x08 -#define SC_SHIFT 0x10 - -/* Инициализация окружения набора: таблицы анимации, обнуление состояния. - * Звать один раз в начале прогона. */ -void sc_init(void); - -/* Задать комнату: fg[30] — коды тайлов по рядам (row*10+col), room — - * номер (нужен trob'ам). Модификаторы обнуляются; ставить их тест может - * сам через tk_modif. Соседи комнаты — стены (изолированная сцена). */ -void sc_room(const uint8_t *fg, uint8_t room); - -/* Поставить Кида: колонка/ряд задают позицию по центру тайла, как это - * делает do_startpos (seg003) — так сцена описывается в терминах карты, а - * не в пикселях. */ -void sc_kid_at(uint8_t col, uint8_t row, int8_t dir); - -/* То же, но с точным X: тайл задаёт ряд и пол под ногами, X — фазу внутри - * тайла (нужно, когда исход зависит от того, где именно Кид стоит). */ -void sc_kid_at_x(uint8_t col, uint8_t row, uint8_t x, int8_t dir); - -/* ---- Персонажи слота Guard (страж/скелет/тень/визирь) ---------------- * - * Физика у них ОБЩАЯ с Кидом (одни функции над Char, разные окна), поэтому - * тестировать её надо на обоих слотах. Поднимаем персонажа руками, как - * enter_guard (seg002:0112): данных уровня под тестом нет. - * charid — CHARID_2_GUARD / CHARID_1_SHADOW / CHARID_4_SKELETON; - * hp — сколько HP выдать (guardhp_max = guardhp_curr = hp). */ -void sc_guard_at(uint8_t charid, uint8_t col, uint8_t row, int8_t dir, uint8_t hp); - -/* Прогнать n кадров ПЕРСОНАЖА СЛОТА GUARD — порт play_guard_frame без ИИ: - * окно loadshad → load_fram_det_col → play_seq → saveshad, затем - * pop_guard_phys_tick(). ИИ (guards.c, банк 1) в набор не линкуется: он - * решает «куда идти», а тут проверяется «что с ним делает физика». */ -void sc_guard_run(uint8_t n); - -/* Прогнать n кадров с ЗАЖАТОЙ маской keys, записывая трассу. - * Возвращает число записанных кадров (обрезается по SC_TRACE_MAX). */ -uint8_t sc_run(uint8_t keys, uint8_t n); - -/* Сбросить трассу (перед новым сценарием). */ -void sc_trace_clear(void); - -/* Сверить трассу с эталоном: golden — плоский массив по 8 байт на кадр - * (frame,x,y,dir,col,row,action,seq_lo,seq_hi — 9), nrec записей. - * Расхождения уходят в отчёт tcheck с номером кадра и поля. */ -void sc_expect(const uint8_t *golden, uint8_t nrec); - -#define SC_REC_BYTES 9 - -/* Снятие эталона. Лог tcheck всего 768 байт — на все сценарии сразу трасс - * не хватит, поэтому за прогон снимается РОВНО ОДИН сценарий (его номер - * задаёт -DSC_RECORD=), а перебором занимается record_golden.py. - * Формат: строка «### имя», дальше по строке на кадр, по два хекс-символа - * на байт. Раннер печатает лог только при провале — sc_dump ставит - * failed=1 намеренно. */ -void sc_dump(const char *name); - -#endif diff --git a/applications/SprPoP/tests/host/stubs.c b/applications/SprPoP/tests/host/stubs.c deleted file mode 100644 index 0202e73..0000000 --- a/applications/SprPoP/tests/host/stubs.c +++ /dev/null @@ -1,423 +0,0 @@ -/* - * stubs.c — окружение движка для прогона под ucsim_z80. - * - * Под тестом крутится НАСТОЯЩАЯ физика (pop_map) с настоящим - * интерпретатором последовательностей (pop_kid): это единственный способ - * проверить порт seg005/seg006, потому что вся его суть — в точных - * величинах кадров и seqtbl. А вот всё, что вокруг, в ucsim не существует: - * видеопамять, EMM-страницы, файлы, клавиатура. Здесь они заглушены. - * - * Три категории: - * 1. libc/libbgi (графика, память, файлы, клавиатура) — пустышки. Код - * отрисовки из pop_kid.c линкуется, но не вызывается. - * 2. Соседние модули движка (pop_bg/pop_trob/pop_level/pop_redraw) — - * минимальные модели: room_modif живёт здесь массивом, пометки - * перерисовки и падающие куски ЖУРНАЛИРУЮТСЯ (тест может проверить, - * что физика их дёрнула), уровень отдаёт стартовую комнату. - * 3. Состояние стража — просто данные: страж в тестах физики не тикает, - * но pop_map/pop_ctrl на его поля смотрят. - * - * Клавиатура сделана НЕ пустышкой: `tk_keys` — набор «нажатых» скан-кодов, - * и `kbd_raw_down` отвечает по нему. Так под тест попадают и read_input, и - * read_user_control, то есть весь путь ввода, а не только диспетчер. - */ -#include -#include -#include -#include -#include -#include -#include "pop_qsave.h" /* из src/: ENGINE_DIR стоит в -I */ - -/* Сериализаторы приватного состояния входят в те же крупные модули, что и - * физика/ИИ. Сами QuickSave-тесты работают на target с EMM; обычным - * ucsim-сценам нужны только символы, и вызывать их они не должны. */ -void pop_qs_bytes(pop_qs_io_t *io, void *p, uint16_t n) -{ (void)io; (void)p; (void)n; } -void pop_qs_u8(pop_qs_io_t *io, uint8_t *p) { (void)io; (void)p; } -void pop_qs_i8(pop_qs_io_t *io, int8_t *p) { (void)io; (void)p; } -void pop_qs_u16(pop_qs_io_t *io, uint16_t *p) { (void)io; (void)p; } -void pop_qs_i16(pop_qs_io_t *io, int *p) { (void)io; (void)p; } - -#include "pop_kid.h" -#include "pop_guard.h" -#include "pop_bg.h" -#include "pop_map.h" -#include "pop_trob.h" -#include "pop_level.h" -#include "pop_redraw.h" -#include "pop_pace.h" -#include "pop_sfx.h" -#include "_pop_draw.h" -#include "pop_cdraw.h" -#include "stubs.h" -#include "kidblob.h" - -/* ---- 1. libc / libbgi ---------------------------------------------- */ - -uint8_t _gfx_visible_page, _gfx_draw_page, _gfx_bank; -/* ISR-стаб W0-страницы: продукт берёт его АДРЕС и вписывает в страницу. - * Здесь достаточно, чтобы символ существовал. */ -void _gfx_w0_isr(void) { } - -void gfx_w0_map(uint8_t page) { (void)page; } -void gfx_w0_unmap(void) { } -void gfx_w0_page_prepare(uint8_t page) { (void)page; } - -void gfx_blit_cols(int x, int y, const void *img, uint8_t flip) -{ (void)x; (void)y; (void)img; (void)flip; } -void gfx_blit_cols_part(int x, int y, const void *img, uint8_t flip, - int skip, int rows) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; } -void gfx_blit_cols_part_w(int x, int y, const void *img, uint8_t flip, - int skip, int rows, uint8_t maxw) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; (void)maxw; } -void gfx_blit_cols_part_noclip(int x, int y, const void *img, uint8_t flip, - uint8_t skip, uint8_t rows) -{ (void)x; (void)y; (void)img; (void)flip; (void)skip; (void)rows; } - -int atlas_load(atlas_t *a, const char *path) { (void)a; (void)path; return -1; } -void atlas_free(atlas_t *a) { (void)a; } -const void *atlas_image(const atlas_t *a, uint8_t idx) -{ (void)a; (void)idx; return 0; } - -/* EMM: страниц нет, но блок обязан выделиться — иначе pop_kid_data_load - * сдастся на первом же шаге и молча оставит kdat_ok = 0, а play_seq тогда - * просто ничего не делает (и трасса выходит из одного застывшего кадра). */ -uint8_t mem_alloc_pages_bios(uint8_t n) { (void)n; return 1; } -void mem_free_block_bios(uint8_t blk) { (void)blk; } -uint8_t mem_get_page_bios(uint8_t blk, uint8_t idx) { (void)blk; (void)idx; return 1; } - -/* Файловая система: единственный «файл» — таблицы анимации. Сделано не - * пустышкой, а рабочим чтением, чтобы pop_kid_data_load отработал целиком - * (включая правку ISR-стаба страницы) и сам взвёл свой kdat_ok — тест не - * лезет во внутренние статики продукта. Данные, по которым потом ходят - * аксессоры, кладёт kid_blob_install по KID_BLOB_ADDR: на устройстве туда - * же их приводит маппинг W0. */ -int open(const char *p, int f) { (void)p; (void)f; return 3; } - -int read(int fd, void *b, int n) -{ - unsigned char *d = (unsigned char *)b; - const unsigned char *s = kid_blob; - unsigned int i, cnt = kid_blob_size; - if (fd != 3) return -1; - if ((unsigned int)n < cnt) cnt = (unsigned int)n; - for (i = 0; i < cnt; i++) d[i] = s[i]; - return (int)cnt; -} - -int close(int fd) { (void)fd; return 0; } - -int bank_load_file(uint8_t page, uint16_t off, const char *path, uint16_t max) -{ - (void)page; (void)off; (void)path; - return kid_blob_size <= max ? (int)kid_blob_size : (int)max; -} - -/* ---- клавиатура: управляемая тестом --------------------------------- */ - -uint16_t tk_keys[TK_KEYS_MAX]; - -int kbd_raw_open(void) { return 0; } -void kbd_raw_close(void) { } -void kbd_raw_sync(void) { } - -uint8_t kbd_raw_down(uint16_t code) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) - if (tk_keys[i] == code) return 1; - return 0; -} - -uint8_t kbd_raw_any_down(void) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) if (tk_keys[i]) return 1; - return 0; -} - -void tk_keys_clear(void) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) tk_keys[i] = 0; -} - -void tk_key_down(uint16_t code) -{ - uint8_t i; - for (i = 0; i < TK_KEYS_MAX; i++) - if (tk_keys[i] == 0) { tk_keys[i] = code; return; } -} - -/* Темп кадра и звук относятся к окружению реальной машины. Физика и - * управление только оставляют выборки луча и заявки эффектов; host-тесты - * проверяют их игровую логику, поэтому здесь достаточно no-op контрактов. */ -void pop_beam_sample(void) __preserves_regs(b, c, d, e) { } -void pop_sfx_play(uint8_t id) { (void)id; } -/* Курсор насоса: в тестах звука нет вовсе, значит «ничего не звучит» — и - * автомат вступительной темы первого уровня сразу отпускает управление. */ -volatile uint16_t pop_mus_left; -void pop_sfx_stop(void) { } - -/* ---- 2. соседние модули движка -------------------------------------- */ - -/* room_modif текущей комнаты: пики (счётчик фазы), ворота (высота), - * зелья (тип). Физика читает и пишет его напрямую через pop_trob_modif. */ -uint8_t tk_modif[30]; -uint8_t tk_start_room; - -uint8_t *pop_trob_modif(uint8_t room) __banked { (void)room; return tk_modif; } -uint8_t pop_level_start_room(void) __banked { return tk_start_room; } - -/* Журнал: что физика попросила у соседей. Тест сверяет ФАКТ и параметры - * (какой тайл помечен, где заспавнен кусок) — заглушка-пустышка этого не - * дала бы, а именно такие баги (BUG-GATE-ANIM-1) мы и ловим. */ -tk_log_t tk_log; - -static void log_put(uint8_t kind, uint8_t a, uint8_t b, uint8_t c) -{ - if (tk_log.n >= TK_LOG_MAX) { tk_log.overflow = 1; return; } - tk_log.e[tk_log.n].kind = kind; - tk_log.e[tk_log.n].a = a; - tk_log.e[tk_log.n].b = b; - tk_log.e[tk_log.n].c = c; - tk_log.n++; -} - -void tk_log_clear(void) { tk_log.n = 0; tk_log.overflow = 0; } - -uint8_t tk_log_count(uint8_t kind) -{ - uint8_t i, c = 0; - for (i = 0; i < tk_log.n; i++) if (tk_log.e[i].kind == kind) c++; - return c; -} - -void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked -{ log_put(TK_TROB, room, tilepos, (uint8_t)type); } - -/* Чомперы будит смена ряда (SEQ_UP/SEQ_DOWN, падение, приземление) — в - * хост-тестах физики их состояние не проверяется, достаточно не падать. */ -void pop_start_chompers(uint8_t room, int8_t row) __banked -{ (void)room; (void)row; } - -void pop_trigger_button(uint8_t room, uint8_t tilepos, - uint8_t button_type, uint8_t modifier, - uint8_t snd) __banked -{ (void)modifier; (void)snd; log_put(TK_BUTTON, room, tilepos, button_type); } - -void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked -{ log_put(TK_REDRAW, tilepos, kind, pages); } - -void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked -{ log_put(TK_REDRAW_ABOVE, col, kind, pages); } - -void pop_loose_mob_spawn(int row, int col) __banked -{ log_put(TK_MOB_SPAWN, (uint8_t)row, (uint8_t)col, 0); } - -void pop_loose_mob_tick(void) __banked { } -void pop_loose_mob_room_changed(void) __banked { } - -uint8_t pop_loose_mob_pos(int *col, int *y) __banked -{ (void)col; (void)y; return 0; } - -/* Отрисовочные хвосты, которые физика дёргает напрямую. */ -void pop_fore_set_clip(int x, int y, int w, int h) -{ (void)x; (void)y; (void)w; (void)h; } -void pop_clip_sprite(int x, int w, int sy_top, int h) __banked -{ (void)x; (void)w; (void)sy_top; (void)h; } -void pop_heal_fast(int x, int y, int w, int h) -{ (void)x; (void)y; (void)w; (void)h; } - -/* ---- 3. страж ------------------------------------------------------- * - * Само состояние (Guard, guardhp_*, can_guard_see_kid, is_guard_notice…) и - * pop_take_hp даёт НАСТОЯЩИЙ pop_guard.c — он линкуется в набор. Здесь - * только то, что он тянет из уровня: данных уровня под тестом нет, страж - * поднимается вручную (tk_guard_spawn в scene.c). */ - -uint8_t pop_current_level; /* pop_level.c под тест не линкуется; sc_init ставит 1 */ - -/* Цвет стража — подмена палитры, живёт в pop_cdraw (отрисовка, в набор не - * линкуется). Здесь важен только факт вызова из pop_guard_enter. */ -void pop_guard_set_palette(uint8_t color) __banked { (void)color; } - -/* Габарит последнего нарисованного кадра по слотам (pop_cdraw.c): физика - * читает из него char_width_half. Под тестом никто не рисует, поэтому все - * поля остаются нулями — ровно как было до DRAW-CHAR, когда kid_fp_width() - * возвращал 0. Тест, которому ширина важна, выставляет её сам. */ -pop_cdraw_t pop_cd[POP_CH_N]; - -/* Связи комнат: нужны check_guard_fallout (возрождение скелета в комнате - * снизу). Тест задаёт их через tk_link_down. */ -uint8_t tk_link_down; -uint8_t pop_room_link(uint8_t room, uint8_t side) -{ (void)room; return side == 3 ? tk_link_down : 0; } - -int8_t pop_level_guard_type(uint8_t level) __banked { (void)level; return 0; } -uint8_t pop_level_guard_hp(uint8_t level) __banked { (void)level; return 3; } - -/* Тайлы «уровня» для соседних комнат: pop_map_set_edges забирает fg соседей - * слева/справа сам (кэш на входе в комнату), значит тесту нужен источник. - * Заполняет сам тест — по умолчанию комнат нет и всё стена. */ -uint8_t tk_room_fg[TK_ROOMS + 1][30]; /* индекс = НОМЕР комнаты (1..TK_ROOMS) */ -void pop_level_access_begin(void) { } -void pop_level_access_end(void) { } -uint8_t pop_level_tile_raw(uint8_t room, uint8_t tilepos) -{ - if (room == 0 || room > TK_ROOMS || tilepos >= 30) return 20; /* стена */ - return tk_room_fg[room][tilepos]; -} - -/* pop_level_tile (то же самое, но с маппингом окна W0 внутри) — её зовёт - * спецсобытие подъёма скелета из guards.c; тому единственному набору, где - * guards.c линкуется (t_mouse), достаточно чтения из tk_room_fg. */ -uint8_t pop_level_tile(uint8_t room, uint8_t tilepos) -{ - return pop_level_tile_raw(room, tilepos); -} - -/* Запись в «данные уровня» — у теста это тот же tk_room_fg. Нужна с тех - * пор, как do_pickup правит страницу уровня сразу (BUG-POTION-STRIPE). */ -void pop_level_set_tile(uint8_t room, uint8_t tilepos, uint8_t tile) -{ - if (room == 0 || room > TK_ROOMS || tilepos >= 30) return; - tk_room_fg[room][tilepos] = tile; -} - -/* Живое состояние стражей по комнатам — как gstate в pop_level.c, только на - * 8 комнат и без данных уровня: тесту нужно ровно то, на что смотрит - * follow_guard (есть ли в целевой комнате свой страж и не труп ли он). - * tk_guard_room != 0 — комната, в которой «по данным уровня» страж есть. */ -uint8_t tk_guard_room; -uint8_t tk_gs_tile[TK_ROOMS]; /* 30 = стража нет (как в pop_level) */ -uint16_t tk_gs_seq[TK_ROOMS]; /* != 0 — запомнен ТРУП */ - -void tk_guard_state_clear(void) -{ - uint8_t i; - for (i = 0; i < TK_ROOMS; i++) { tk_gs_tile[i] = 30; tk_gs_seq[i] = 0; } - tk_guard_room = 0; -} - -/* ВНИМАНИЕ на форму возврата: результат собирается в res и отдаётся ОДНИМ - * выходом. С `return 1;` прямо в ветке SDCC 4.5 не кладёт единицу в A — - * функция возвращает мусор (docs/bugs/sdcc-z80-ret-const-lost). Без - * __banked баг маскировался: в A случайно оставался ненулевой байт от - * `*tile = 11`, и проверка «истина» проходила. */ -uint8_t pop_level_guard(uint8_t room, uint8_t *tile, int8_t *dir, - uint8_t *color, uint8_t *skill) __banked -{ - uint8_t res = 0; - if (room < 1 || room > TK_ROOMS) return 0; - if (tk_gs_tile[room - 1] < 30) { /* запомненный (в т.ч. труп) */ - *tile = tk_gs_tile[room - 1]; *dir = 0; *color = 0; *skill = 1; - res = 1; - } else if (room == tk_guard_room) { /* страж из данных уровня */ - *tile = 11; *dir = 0; *color = 0; *skill = 1; - res = 1; - } - return res; -} -void pop_guard_state_save(uint8_t room, uint8_t tile, int8_t dir, uint8_t x, - uint8_t skill, uint16_t seq, uint8_t dead) -{ - (void)dir; (void)x; (void)skill; - if (room < 1 || room > TK_ROOMS) return; - tk_gs_tile[room - 1] = tile; - tk_gs_seq[room - 1] = dead ? seq : 0; - if (tile >= 30) tk_guard_room = (tk_guard_room == room) ? 0 : tk_guard_room; -} -uint16_t pop_guard_state_seq(uint8_t room) -{ return (room >= 1 && room <= TK_ROOMS) ? tk_gs_seq[room - 1] : 0; } -uint8_t pop_guard_state_x(uint8_t room) { (void)room; return 0; } - -/* Таблицы деления на ширину тайла — настоящие (резидент pop_tile.c в тест - * не линкуется). Не заглушка: физика считает по ним колонку, подменять - * нельзя. Значения сгенерированы той же формулой, что в pop_tile.c. */ -const int8_t POP_TILE_DIV[256] = { - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, -}; -const uint8_t POP_TILE_MOD[256] = { - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9,10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10,11,12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, - 12,13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13, 0, 1, -}; - -/* Тайлсет (0 подземелье, 1 дворец) — в приложении его ставит pop_bg_load; - * тесты гоняют физику подземелья, поэтому 0. Не заглушка-функция, а та же - * переменная, что и в резиденте: карта читает её напрямую. */ -uint8_t pop_palace; - -/* Отражение в зеркале (уровень 4) — чистая графика, в тестах физики её нет. - * pop_map зовёт pop_mirror_draw из pop_check_mirror, поэтому символ нужен. */ -void pop_mirror_draw(int clip_top) __banked { (void)clip_top; } -void pop_mirror_heal(void) __banked { } - -/* ---- Зеркальный набор персонажей (зелье инверсии) -------------------- * - * В host-тестах графики нет: pop_kboot линкуется ради pop_kid_data_load, а - * его хвост (загрузка *_v.atl) заглушен — проверять там нечего, атласов в - * тесте не существует вовсе. */ -uint8_t pop_vflip_ready(void) { return 1; } /* «уже загружено» — грузить не станет */ -int pop_vflip_add(const void *orig, const char *path) -{ (void)orig; (void)path; return 0; } -int pop_vflip_take(const void *orig, const void *mirror) -{ (void)orig; (void)mirror; return 0; } - -/* Архив ресурсов: на устройстве из него читаются атласы Кида, в тестах - * графики нет вовсе — pop_kboot линкуется только ради pop_kid_data_load, - * а тот по-прежнему ходит в файл (заглушка open/read выше). */ -signed char pop_arc_open(void *a, const char *path, unsigned char *tbl, - unsigned char max) __banked -{ (void)a; (void)path; (void)tbl; (void)max; return -1; } -signed char pop_arc_open_id(void *a, unsigned char id, unsigned char *tbl, - unsigned char max) __banked -{ (void)a; (void)id; (void)tbl; (void)max; return -1; } -signed char pop_arc_atlas(void *a, const unsigned char *tbl, - unsigned char idx, void *at) __banked -{ (void)a; (void)tbl; (void)idx; (void)at; return -1; } -void pop_arc_close(void *a) __banked { (void)a; } -uint8_t pop_vflip_page(uint8_t src) { return src; } -void pop_vflip_reset(void) { } -int pop_sword_take(const atlas_t *a) __banked { (void)a; return 0; } -int pop_sword_vflip_take(const atlas_t *m) __banked { (void)m; return 0; } -int pop_guard_vflip_load(void) __banked { return 0; } - -/* --- заглушки, без которых не линковались t_char/t_gate и прочие ------ * - * - * pop_chdir_home живёт в pop_path_bank.c (банк 10), а его тянет pop_kboot; - * kbd_raw_keypad_as_ext — из libc, её тянет pop_ctrl. Ни файловой - * системы, ни клавиатуры в хостовых тестах нет, поэтому обе — пустышки. - * До этого сборка tests/host падала на неразрешённых символах, и логику - * движка нельзя было проверить без эмулятора. */ -int8_t pop_chdir_home(void) __banked { return 0; } -void kbd_raw_keypad_as_ext(uint8_t on) { (void)on; } diff --git a/applications/SprPoP/tests/host/stubs.h b/applications/SprPoP/tests/host/stubs.h deleted file mode 100644 index ed71b8e..0000000 --- a/applications/SprPoP/tests/host/stubs.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * stubs.h — интерфейс тестового окружения (см. stubs.c). - * - * Что тест может задавать: «нажатые» клавиши (tk_key_down) и модификаторы - * тайлов комнаты (tk_modif). Что может проверять: журнал обращений - * физики к соседним модулям (tk_log). - */ -#ifndef POP_TESTS_STUBS_H -#define POP_TESTS_STUBS_H - -#include - -/* ---- клавиатура ------------------------------------------------------ */ -#define TK_KEYS_MAX 6 -extern uint16_t tk_keys[TK_KEYS_MAX]; -void tk_keys_clear(void); -void tk_key_down(uint16_t code); - -/* ---- комната --------------------------------------------------------- */ -extern uint8_t tk_modif[30]; /* room_modif текущей комнаты */ -extern uint8_t tk_start_room; /* что вернёт pop_level_start_room */ - -/* ---- журнал обращений ------------------------------------------------ */ -#define TK_LOG_MAX 24 - -enum { - TK_TROB = 1, /* a=room b=tilepos c=type */ - TK_BUTTON, /* a=room b=tilepos c=type */ - TK_REDRAW, /* a=tilepos b=kind c=pages */ - TK_REDRAW_ABOVE, /* a=col b=kind c=pages */ - TK_MOB_SPAWN /* a=row b=col */ -}; - -typedef struct { uint8_t kind, a, b, c; } tk_log_e; -typedef struct { uint8_t n, overflow; tk_log_e e[TK_LOG_MAX]; } tk_log_t; - -extern tk_log_t tk_log; -void tk_log_clear(void); - -/* Сколько записей данного вида в журнале (0 = не было). */ -uint8_t tk_log_count(uint8_t kind); - - -/* Состояние стражей по комнатам для follow_guard (см. stubs.c). */ -/* Комнат в таблице «уровня». 24 = столько же, сколько в настоящем уровне - * PoP: спецсобытия поздних уровней адресуют комнаты по их РЕАЛЬНЫМ номерам - * (меч тени лежит в 15-й, уход за ним — из 18-й), и обрезать их до восьми - * значило бы тестировать не тот адрес. Цена — 720 байт тестового ОЗУ. */ -#define TK_ROOMS 24 -extern uint8_t tk_guard_room; /* комната, где страж есть «по данным уровня» */ -extern uint8_t tk_gs_tile[TK_ROOMS]; -extern uint16_t tk_gs_seq[TK_ROOMS]; -void tk_guard_state_clear(void); - -/* Связь «вниз» для check_guard_fallout (скелет возрождается в комнате 3). */ -extern uint8_t tk_link_down; - -/* fg комнат «уровня» — источник для кэша соседей в pop_map_set_edges. */ -extern uint8_t tk_room_fg[TK_ROOMS + 1][30]; /* индекс = номер комнаты */ - -#endif diff --git a/applications/SprPoP/tests/host/t_app.c b/applications/SprPoP/tests/host/t_app.c deleted file mode 100644 index 997ac99..0000000 --- a/applications/SprPoP/tests/host/t_app.c +++ /dev/null @@ -1,135 +0,0 @@ -/* pop_app — протокол верхнего автомата: допустимые и запрещённые переходы. */ -#include "tcheck.h" -#include "pop_app.h" - -TC_TEST(boot_to_title) -{ - pop_app_reset(); - TC_EQ(pop_app_state, POP_APP_BOOT); - TC_TRUE(pop_app_dispatch(POP_APP_EV_BOOT_READY)); - TC_EQ(pop_app_state, POP_APP_BUILD_INFO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_BUILD_DONE)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(level_load_roundtrip) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_PAUSE)); - TC_EQ(pop_app_state, POP_APP_PAUSE_MENU); - TC_TRUE(pop_app_dispatch(POP_APP_EV_RESUME)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_FINISHED)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); -} - -TC_TEST(rejects_wrong_event) -{ - pop_app_reset(); - TC_FALSE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_BOOT); - TC_TRUE(pop_app_dispatch(POP_APP_EV_QUIT)); - TC_EQ(pop_app_state, POP_APP_QUIT); - TC_FALSE(pop_app_dispatch(POP_APP_EV_BOOT_READY)); -} - -TC_TEST(future_routes_are_declared) -{ - pop_app_reset(); - pop_app_state = POP_APP_TITLE; - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); - TC_TRUE(pop_app_dispatch(POP_APP_EV_LEVEL_READY)); - TC_EQ(pop_app_state, POP_APP_PLAYING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_TIME_EXPIRED)); - TC_EQ(pop_app_state, POP_APP_TIME_EXPIRED); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(prelevel_cutscene_route) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_STARTED)); - TC_EQ(pop_app_state, POP_APP_CUTSCENE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(demo_routes) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_INTRO_STARTED)); - TC_EQ(pop_app_state, POP_APP_INTRO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_CUTSCENE_FINISHED)); - TC_EQ(pop_app_state, POP_APP_DEMO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_DEMO_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); - TC_TRUE(pop_app_dispatch(POP_APP_EV_DEMO_STARTED)); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(intro_skip_starts_new_game) -{ - pop_app_reset(); - pop_app_dispatch(POP_APP_EV_BOOT_READY); - pop_app_dispatch(POP_APP_EV_BUILD_DONE); - pop_app_dispatch(POP_APP_EV_INTRO_STARTED); - TC_EQ(pop_app_state, POP_APP_INTRO); - TC_TRUE(pop_app_dispatch(POP_APP_EV_NEW_GAME)); - TC_EQ(pop_app_state, POP_APP_LEVEL_LOAD); -} - -TC_TEST(restart_game_returns_to_intro) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_PAUSE)); - TC_EQ(pop_app_state, POP_APP_PAUSE_MENU); - TC_TRUE(pop_app_dispatch(POP_APP_EV_RESTART_INTRO)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -/* Финал уходит в таблицу рекордов: она же дослушивает победную тему и - * гасит экран, как хвост end_sequence (seg001:5F1). */ -TC_TEST(ending_to_title_route) -{ - pop_app_state = POP_APP_PLAYING; - TC_TRUE(pop_app_dispatch(POP_APP_EV_ENDING_STARTED)); - TC_EQ(pop_app_state, POP_APP_ENDING); - TC_TRUE(pop_app_dispatch(POP_APP_EV_ENDING_FINISHED)); - TC_EQ(pop_app_state, POP_APP_HALL_OF_FAME); - TC_TRUE(pop_app_dispatch(POP_APP_EV_HOF_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -TC_TEST(hof_route_still_exits_to_title) -{ - pop_app_state = POP_APP_HALL_OF_FAME; - TC_TRUE(pop_app_dispatch(POP_APP_EV_HOF_FINISHED)); - TC_EQ(pop_app_state, POP_APP_TITLE); -} - -void main(void) -{ - TC_RUN(boot_to_title); - TC_RUN(level_load_roundtrip); - TC_RUN(rejects_wrong_event); - TC_RUN(future_routes_are_declared); - TC_RUN(prelevel_cutscene_route); - TC_RUN(demo_routes); - TC_RUN(intro_skip_starts_new_game); - TC_RUN(restart_game_returns_to_intro); - TC_RUN(ending_to_title_route); - TC_RUN(hof_route_still_exits_to_title); -} diff --git a/applications/SprPoP/tests/host/t_cfg.c b/applications/SprPoP/tests/host/t_cfg.c deleted file mode 100644 index 761648b..0000000 --- a/applications/SprPoP/tests/host/t_cfg.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * t_cfg — полный codec POP.CFG: заголовок, размер, checksum и payload. - * - * DSS/EMM под host не живут, но pure codec лежит в том же pop_config.c, что - * и target-I/O. Поэтому проверяем весь формат, а не только payload. - */ -#include -#include - -#include "tcheck.h" -#include "pop_settings.h" -#include "pop_pace.h" /* POP_SPEED_MODES */ -#include "_pop_config.h" - -/* Runtime-владельцы нужны только для линковки pop_settings_apply(); codec - * их не вызывает. */ -uint8_t pop_speed_mode, pop_cheats, pop_snd_want, pop_mus_want; -void pop_sfx_toggle(void) __banked { pop_snd_want = (uint8_t)!pop_snd_want; } - -static void set_all(uint8_t snd, uint8_t spd, uint8_t prof, uint8_t cheats, - uint8_t info, uint16_t flags, uint8_t time_limit, - uint8_t debug_bar) -{ - pop_settings.sound_enabled = snd; - pop_settings.speed_mode = spd; - pop_settings.gameplay_profile = prof; - pop_settings.cheats_enabled = cheats; - pop_settings.show_build_info = info; - pop_settings.enhancement_flags = flags; - pop_settings.time_limit_enabled = time_limit; - pop_settings.show_debug_bar = debug_bar; -} - -/* ser→parse должен возвращать ровно те же значения (кроме профиля: - * ENHANCED осознанно садится в VANILLA). */ -TC_TEST(cfg_roundtrip) -{ - uint8_t buf[POP_CFG_SIZE]; - set_all(1, POP_SPEED_FAST, POP_PROFILE_VANILLA, 1, 1, 0xBEEF, 0, 0); - pop_cfg_encode(buf); - memset(&pop_settings, 0, sizeof(pop_settings)); /* стереть */ - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - TC_EQ(pop_settings.sound_enabled, 1); - TC_EQ(pop_settings.speed_mode, POP_SPEED_FAST); - TC_EQ(pop_settings.cheats_enabled, 1); - TC_EQ(pop_settings.show_build_info, 1); - TC_EQ(pop_settings.enhancement_flags, 0xBEEF); - TC_EQ(pop_settings.time_limit_enabled, 0); - TC_EQ(pop_settings.show_debug_bar, 0); -} - -/* ENHANCED из файла применяется как VANILLA (режим ещё не реализован). */ -TC_TEST(cfg_enhanced_downgrades_to_vanilla) -{ - uint8_t buf[POP_CFG_SIZE]; - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_ENHANCED, 0, 0, 0x0003, 1, 1); - pop_cfg_encode(buf); - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - TC_EQ(pop_settings.gameplay_profile, POP_PROFILE_VANILLA); - /* Остальные поля при этом применяются. */ - TC_EQ(pop_settings.enhancement_flags, 0x0003); -} - -/* Мусор в ЛЮБОМ поле => отказ без частичного применения. */ -TC_TEST(cfg_garbage_rejected_whole) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t i; - - for (i = 0; i < POP_CFG_PAYLOAD_SIZE; i++) { - set_all(1, POP_SPEED_FASTEST, POP_PROFILE_VANILLA, 1, 0, 0x0001, 1, 1); - pop_cfg_encode(buf); - switch (i) { - case 0: buf[7 + i] = 2; break; /* sound > 1 */ - case 1: buf[7 + i] = (uint8_t)POP_SPEED_MODES; break; - case 2: buf[7 + i] = 2; break; /* profile > ENHANCED */ - case 3: buf[7 + i] = 2; break; /* cheats > 1 */ - case 4: buf[7 + i] = 2; break; /* buildinfo > 1 */ - case 7: buf[7 + i] = 2; break; /* timer > 1 */ - case 8: buf[7 + i] = 2; break; /* debug bar > 1 */ - default: buf[7 + i] = 0xFF; break; /* флаги — любые */ - } - /* Изменённый payload обязан иметь корректную checksum: иначе мы - * тестируем checksum, а не диапазон поля. */ - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = 0; - { - uint8_t j; - for (j = 0; j < POP_CFG_PAYLOAD_SIZE; j++) - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] ^= buf[7 + j]; - } - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = - (uint8_t)~buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE]; - if (i == 5 || i == 6) { /* flags не валидируются */ - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, sizeof(buf))); - continue; - } - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_FALSE(pop_cfg_decode(buf, sizeof(buf))); - /* Настройки не тронуты — нули после memset остались нулями. */ - TC_EQ(pop_settings.sound_enabled, 0); - TC_EQ(pop_settings.speed_mode, 0); - } -} - -TC_TEST(cfg_header_checksum_and_future_tail) -{ - uint8_t buf[POP_CFG_MAX_SIZE]; - uint8_t i, sum; - set_all(1, POP_SPEED_FAST, POP_PROFILE_VANILLA, 0, 1, 0xA55A, 1, 1); - pop_cfg_encode(buf); - - buf[0] = 'X'; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - buf[4] = 2; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] ^= 1; - TC_FALSE(pop_cfg_decode(buf, POP_CFG_SIZE)); - pop_cfg_encode(buf); - TC_FALSE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_SIZE - 1))); - - /* Будущий v1: два незнакомых байта перед checksum должны пропуститься. */ - pop_cfg_encode(buf); - buf[5] = POP_CFG_PAYLOAD_SIZE + 2; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE] = 0x12; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 1] = 0x34; - sum = 0; - for (i = 0; i < POP_CFG_PAYLOAD_SIZE + 2; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 2] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + 3] = (uint8_t)~sum; - memset(&pop_settings, 0, sizeof(pop_settings)); - TC_TRUE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_SIZE + 2))); - TC_EQ(pop_settings.enhancement_flags, 0xA55A); -} - -/* Созданный до FG4 файл (семь payload-байтов) остаётся валиден и обязан - * включить лимит: это исторический дефолт 60 минут, не значение в _DATA. */ -TC_TEST(cfg_legacy_enables_time_limit) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t sum = 0, i; - - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_VANILLA, 1, 0, 0, 0, 0); - pop_cfg_encode(buf); - buf[5] = POP_CFG_LEGACY_PAYLOAD_SIZE; - for (i = 0; i < POP_CFG_LEGACY_PAYLOAD_SIZE; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE + 1] = (uint8_t)~sum; - pop_settings.time_limit_enabled = 0; - TC_TRUE(pop_cfg_decode(buf, POP_CFG_MIN_SIZE)); - TC_EQ(pop_settings.time_limit_enabled, 1); -} - -/* Файл, записанный ДО тумблера отладочной полосы (восемь payload-байтов), - * обязан остаться валидным и включить полосу: это её исторический дефолт. */ -TC_TEST(cfg_legacy_enables_debug_bar) -{ - uint8_t buf[POP_CFG_SIZE]; - uint8_t sum = 0, i; - - set_all(1, POP_SPEED_NORMAL, POP_PROFILE_VANILLA, 1, 0, 0, 1, 0); - pop_cfg_encode(buf); - buf[5] = POP_CFG_TIMELIMIT_PAYLOAD_SIZE; - for (i = 0; i < POP_CFG_TIMELIMIT_PAYLOAD_SIZE; i++) sum ^= buf[7 + i]; - buf[POP_CFG_HEADER_SIZE + POP_CFG_TIMELIMIT_PAYLOAD_SIZE] = sum; - buf[POP_CFG_HEADER_SIZE + POP_CFG_TIMELIMIT_PAYLOAD_SIZE + 1] = (uint8_t)~sum; - pop_settings.show_debug_bar = 0; - TC_TRUE(pop_cfg_decode(buf, (uint16_t)(POP_CFG_HEADER_SIZE + - POP_CFG_TIMELIMIT_PAYLOAD_SIZE + - POP_CFG_TAIL_SIZE))); - TC_EQ(pop_settings.show_debug_bar, 1); - TC_EQ(pop_settings.time_limit_enabled, 1); -} - -TC_TEST(settings_apply_syncs_runtime) -{ - set_all(0, POP_SPEED_FASTEST, POP_PROFILE_VANILLA, 0, 0, 0, 1, 1); - pop_snd_want = 1; - pop_settings_apply(1); - TC_EQ(pop_speed_mode, POP_SPEED_FASTEST); - TC_EQ(pop_cheats, 0); - TC_EQ(pop_snd_want, 0); -} - -void main(void) -{ - TC_RUN(cfg_roundtrip); - TC_RUN(cfg_enhanced_downgrades_to_vanilla); - TC_RUN(cfg_garbage_rejected_whole); - TC_RUN(cfg_header_checksum_and_future_tail); - TC_RUN(cfg_legacy_enables_time_limit); - TC_RUN(cfg_legacy_enables_debug_bar); - TC_RUN(settings_apply_syncs_runtime); -} diff --git a/applications/SprPoP/tests/host/t_char.c b/applications/SprPoP/tests/host/t_char.c deleted file mode 100644 index f213c60..0000000 --- a/applications/SprPoP/tests/host/t_char.c +++ /dev/null @@ -1,525 +0,0 @@ -/* - * t_char — физика над Char для РАЗНЫХ ПЕРСОНАЖЕЙ. - * - * Зачем отдельный набор. После GUARD-PHYS физика — один набор функций над - * глобалом `Char`, а кто именно в Char, решают окна loadkid/savekid и - * loadshad/saveshad (как в оригинале, seg006:809). В слоте Guard живёт не - * только страж: тем же кодом ходят скелет (ур. 3), тень (4/5/6/12), визирь - * (13) и мышь (8) — `autocontrol_opponent` (seg002:628) разводит их только - * по ИИ, а play_guard_frame у всех общий. Значит расхождения «у Кида так, - * у прочих иначе» — это ВЕТКИ ПО charid внутри общих функций, и проверять - * их надо именно так: одна сцена, разные персонажи. - * - * t_phys страхует, что перенос ничего не сломал КИДУ (характеризационные - * трассы). Здесь — противоположное: что не-Кид получает СВОЮ ветку. - * - * Проверки точечные (значение поля после N кадров), а не трассы: ветки - * различаются исходом, а не траекторией, и эталон тут только запутал бы. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define G 4 /* gate (portcullis) */ -#define W 20 /* wall */ - -/* Ровный пол на ряду 1 (как room_flat в t_phys). */ -static const uint8_t room_flat[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Пол ряда 0 обрывается после колонки 3; ряд 2 — пол. Персонаж, сошедший - * с кромки (0,3), падает ДВА ряда: ровно та высота, на которой ветки - * land() по charid расходятся (seg005:189). */ -static const uint8_t room_drop2[30] = { - W, F, F, F, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, -}; - -/* Решётка ворот в (2,6) — сцена под окклюзию персонажа, стоящего в проёме. */ -static const uint8_t room_gate[30] = { - W, E, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, G, F, F, F, -}; - -/* ---- take_hp: кому достаётся урон ----------------------------------- */ - -TC_TEST(char_take_hp_goes_to_active) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - - /* Окно Кида: урон обязан уйти в hitp_delta и не тронуть стража. */ - pop_loadkid(); - hitp_delta = 0; guardhp_delta = 0; - tc_check(pop_take_hp(1), 0, "kid: не последнее HP", __LINE__); - tc_check(hitp_delta, -1, "kid: hitp_delta", __LINE__); - tc_check(guardhp_delta, 0, "kid: страж не тронут", __LINE__); - pop_savekid(); - - /* Окно стража: тот же вызов — уже в guardhp_delta. */ - pop_loadshad(); - hitp_delta = 0; guardhp_delta = 0; - tc_check(pop_take_hp(1), 0, "guard: не последнее HP", __LINE__); - tc_check(guardhp_delta, -1, "guard: guardhp_delta", __LINE__); - tc_check(hitp_delta, 0, "guard: Кид не тронут", __LINE__); - /* Смертельный удар: возврат 1 и дельта на всё оставшееся. */ - guardhp_delta = 0; - tc_check(pop_take_hp(100), 1, "guard: смертельный удар", __LINE__); - tc_check(guardhp_delta, -3, "guard: дельта на все HP", __LINE__); - pop_saveshad(); -} - -/* Уровень 2 чита гасит только мелкий урон Киду. Мгновенная смерть - * (count=100) проходит всегда, а на стража чит не действует вовсе. */ -TC_TEST(char_immortal_level2_covers_kid_only) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - pop_immortal = 2; - - pop_loadkid(); - hitp_delta = 0; - tc_check(pop_take_hp(1), 0, "kid: мелкий урон погашен", __LINE__); - tc_check(hitp_delta, 0, "kid: HP не тронуто", __LINE__); - tc_check(pop_take_hp(100), 1, "kid: мгновенная смерть проходит", __LINE__); - tc_check(hitp_delta, -3, "kid: смертельная дельта", __LINE__); - pop_savekid(); - - pop_loadshad(); - guardhp_delta = 0; - tc_check(pop_take_hp(100), 1, "guard: чит на него не действует", __LINE__); - pop_saveshad(); - - pop_immortal = 0; -} - -/* ---- do_delta_hp: дельты применяются каждому своему счётчику --------- */ - -TC_TEST(char_delta_hp_applies_per_character) -{ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_guard_at(CHARID_2_GUARD, 6, 1, -1, 3); - - hitp_delta = -1; - guardhp_delta = -2; - pop_kid_hurt = 0; - pop_guard_hurt = 0; - pop_do_delta_hp(); - - tc_check(hitp_curr, 2, "kid: HP 3-1", __LINE__); - tc_check(guardhp_curr, 1, "guard: HP 3-2", __LINE__); - /* Флаги «брызг» — по одному на персонажа, и только на УРОН. */ - tc_check(pop_kid_hurt, 1, "kid: брызги", __LINE__); - tc_check(pop_guard_hurt, 1, "guard: брызги", __LINE__); - - /* Плюсовая дельта (зелье) брызг и вспышки давать НЕ должна. */ - pop_kid_hurt = 0; - hitp_delta = 1; - pop_do_delta_hp(); - tc_check(hitp_curr, 3, "kid: зелье вернуло HP", __LINE__); - tc_check(pop_kid_hurt, 0, "kid: зелье — не урон", __LINE__); -} - -/* ---- land(): ветки по charid (seg005:173) --------------------------- */ - -/* Кид с двух рядов теряет 1 HP и остаётся жив. */ -TC_TEST(char_kid_survives_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(3, 0, 0); - sc_trace_clear(); - sc_run(SC_R, 30); /* шагнуть с кромки и упасть */ - - pop_do_delta_hp(); - tc_check(Kid.curr_row, 2, "kid: приземлился на ряд 2", __LINE__); - tc_check(hitp_curr, 2, "kid: −1 HP за два ряда", __LINE__); - tc_check(pop_kid_dead, 0, "kid: жив", __LINE__); -} - -/* СТРАЖ с той же высоты гибнет: seg005:190 уводит charid_2_guard прямо в - * take_hp(100). Это не «баланс», а буквальная ветка оригинала. */ -TC_TEST(char_guard_dies_from_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); /* Кид в стороне, не мешает */ - /* Ставим сразу НАД ПУСТОТОЙ: ИИ в наборе нет, сам с кромки страж не - * сойдёт, а физике довольно того, что под ним не пол. Колонка 5, а не - * 4: решение принимается по ВЕСОВОЙ ТОЧКЕ кадра (dx_weight, seg006), - * а она у стойки стража уходит на 9 px назад — с колонки 4 точка - * попадала бы ещё на пол колонки 3. */ - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - sc_guard_run(30); - - pop_do_delta_hp(); - tc_check(Guard.curr_row, 2, "guard: приземлился на ряд 2", __LINE__); - tc_check(guardhp_curr, 0, "guard: два ряда = смерть", __LINE__); -} - -/* ТЕНЬ (charid_1_shadow) с тех же двух рядов не теряет ничего: seg005:189 - * уводит её в ветку «упал с одного ряда». */ -TC_TEST(char_shadow_survives_two_row_fall) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_1_SHADOW, 5, 0, 0, 3); - sc_guard_run(30); - - pop_do_delta_hp(); - tc_check(Guard.curr_row, 2, "shadow: приземлилась на ряд 2", __LINE__); - tc_check(guardhp_curr, 3, "shadow: HP не тронуто", __LINE__); -} - -/* ---- физика слота Guard вообще работает ----------------------------- */ - -/* До GUARD-PHYS у стража не было ни fall_accel, ни check_action: сойдя с - * кромки, он просто висел в воздухе. Тест ловит именно это. */ -TC_TEST(char_guard_falls_at_all) -{ - uint8_t y0; - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - y0 = Guard.y; - - sc_guard_run(6); - tc_check(Guard.y > y0, 1, "guard: пошёл вниз", __LINE__); -} - -/* Гард по X (seg000:1254): за пределами комнаты физика молчит — именно так - * оригинал не выпускает стража из комнаты. */ -TC_TEST(char_guard_physics_gated_by_x) -{ - uint8_t y0; - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - Guard.x = 220; /* правее 211 — вне комнаты */ - y0 = Guard.y; - - sc_guard_run(6); - tc_check(Guard.y, y0, "guard вне комнаты: физика не трогает", __LINE__); -} - -/* check_guard_fallout (seg002:0241): провалившегося ниже комнаты убирают - * совсем — в комнату снизу он не переходит. */ -TC_TEST(char_guard_fallout_removes_him) -{ - sc_room(room_drop2, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_2_GUARD, 5, 0, 0, 3); - - Guard.y = 211; - pop_guard_fallout(); - tc_check(Guard.charid, 0, "guard: убран из комнаты", __LINE__); - tc_check(guardhp_curr, 0, "guard: HP обнулены", __LINE__); -} - -/* ---- окна Char не путают персонажей ---------------------------------- */ - -/* Регресс на класс ошибок, ради которого затевался перенос: физика Кида не - * должна трогать стража, и наоборот. Гоняем оба слота в одной сцене. */ -TC_TEST(char_windows_do_not_leak) -{ - uint8_t gx, gy; - sc_room(room_flat, 1); - sc_kid_at(3, 1, 0); - sc_guard_at(CHARID_2_GUARD, 7, 1, -1, 3); - gx = Guard.x; gy = Guard.y; - - sc_run(SC_R, 10); /* Кид бежит вправо */ - - tc_check(Guard.x, gx, "страж не поехал за Кидом", __LINE__); - tc_check(Guard.y, gy, "страж остался на своей высоте", __LINE__); - tc_check(Guard.charid, CHARID_2_GUARD, "страж не подменён Кидом", __LINE__); - tc_check(Kid.charid, CHARID_0_KID, "Кид не подменён стражем", __LINE__); -} - - -/* ---- follow_guard: страж идёт ЗА КИДОМ вбок (seg002:0340/039E) ------- * - * Своим ходом персонаж слота Guard комнату не меняет, но когда её меняет - * КИД, exit_room может перенести стража следом. Здесь проверяются все - * условия отбора — они и есть механика. Порт зовётся из enter_room, а - * тестируем прямо pop_guard_follow: сцена комнат в наборе одна. */ - -/* Базовый случай: бой, Кид ушёл ВЛЕВО, страж прижат к левому краю (x < 91), - * в комнате 2 своего стража нет → идёт следом, X переносится через шов. */ -TC_TEST(char_follow_guard_left) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; /* < 91: у левого края */ - Guard.room = 3; - - tc_check(pop_guard_follow(2, 0), 1, "страж пошёл следом", __LINE__); - tc_check(Guard.room, 2, "страж в новой комнате", __LINE__); - tc_check(Guard.x, 80 + 140, "X перенесён через шов (+140)", __LINE__); - /* follow_guard стирает guards_tile ОБЕИХ комнат — иначе страж - * раздвоится: старую поднимут при возврате, новую при входе. */ - tc_check(tk_gs_tile[3 - 1], 30, "в старой комнате стража нет", __LINE__); - tc_check(tk_gs_tile[2 - 1], 30, "в новой комнате нет второго", __LINE__); -} - -/* Тот же бой, но страж ДАЛЕКО от края (x >= 91) — остаётся. */ -TC_TEST(char_follow_guard_needs_edge) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 5, 1, -1, 3); - Guard.x = 120; /* >= 91 */ - Guard.room = 3; - - tc_check(pop_guard_follow(2, 0), 0, "далеко от края — остаётся", __LINE__); - tc_check(Guard.room, 3, "комната не менялась", __LINE__); -} - -/* Порог для ухода ВПРАВО — свой (x >= 165). */ -TC_TEST(char_follow_guard_right_threshold) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(8, 1, 0); - sc_guard_at(CHARID_2_GUARD, 7, 1, 0, 3); - Guard.room = 3; - - Guard.x = 160; /* < 165 — не идёт */ - tc_check(pop_guard_follow(4, 1), 0, "x=160: остаётся", __LINE__); - Guard.x = 170; /* >= 165 — идёт */ - tc_check(pop_guard_follow(4, 1), 1, "x=170: идёт следом", __LINE__); - tc_check(Guard.x, 170 - 140, "X перенесён через шов (−140)", __LINE__); -} - -/* Не бой — не идёт. Меч в ножнах = страж Кида не преследует. */ -TC_TEST(char_follow_guard_needs_sword_drawn) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - Guard.sword = 0; /* sword_0_sheathed */ - - tc_check(pop_guard_follow(2, 0), 0, "без меча — остаётся", __LINE__); -} - -/* Мёртвый (и умирающий) не идёт никуда. */ -TC_TEST(char_follow_guard_dead_stays) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - Guard.alive = 0; /* alive >= 0 — умирает/мёртв */ - - tc_check(pop_guard_follow(2, 0), 0, "мёртвый остаётся", __LINE__); -} - -/* Вверх и вниз оригинал не пускает никогда (условия leave всегда истинны). */ -TC_TEST(char_follow_guard_never_vertical) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - - tc_check(pop_guard_follow(2, 2), 0, "вверх — не идёт", __LINE__); - tc_check(pop_guard_follow(2, 3), 0, "вниз — не идёт", __LINE__); - tc_check(Guard.room, 3, "комната не менялась", __LINE__); -} - -/* В целевой комнате СВОЙ живой страж — перехода нет (иначе их станет два). */ -TC_TEST(char_follow_guard_blocked_by_own_guard) -{ - tk_guard_state_clear(); - sc_room(room_flat, 3); - sc_kid_at(1, 1, -1); - sc_guard_at(CHARID_2_GUARD, 2, 1, -1, 3); - Guard.x = 80; - Guard.room = 3; - tk_guard_room = 2; /* в комнате 2 есть свой страж */ - - tc_check(pop_guard_follow(2, 0), 0, "чужая комната занята", __LINE__); - tc_check(Guard.room, 3, "остался у себя", __LINE__); - - /* А если там ТРУП (запомнена последовательность) — идти можно. */ - tk_gs_tile[2 - 1] = 11; - tk_gs_seq[2 - 1] = 0x1234; - tc_check(pop_guard_follow(2, 0), 1, "к трупу — можно", __LINE__); -} - -/* Тайлы СОСЕДНИХ комнат: колонка персонажа считается из x и на диапазоне - * x 0..255 лежит в −5..13, то есть регулярно уходит за комнату глубже кромки. - * Там get_tile обязан отдавать настоящий тайл соседа — мнимая стена стоила - * BUG-SWORD-GHOST-1 (страж после follow_guard оказывался в col 12, луч - * видимости упирался в неё, и Кид посреди боя прятал меч, а достать обратно - * уже не мог: draw_sword требует can_guard_see_kid >= 2). */ -static void char_tiles_resolve_across_rooms(void) -{ - static const uint8_t floor30[30] = { - E,E,E,E,E,E,E,E,E,E, - E,E,E,E,E,E,E,E,E,E, - F,F,F,F,F,F,F,F,F,F, - }; - uint8_t i; - /* Комнаты-соседи «уровня»: карта заберёт их fg сама (pop_map_set_edges). */ - for (i = 0; i < 30; i++) { tk_room_fg[4][i] = F; tk_room_fg[6][i] = F; } - tk_room_fg[4][10 + 5] = W; /* сосед слева: ряд 1, col 5 */ - tk_room_fg[6][10 + 2] = W; /* сосед справа: ряд 1, col 2 */ - - sc_room(floor30, 5); - pop_map_set_edges(4, 6, 0, 0); - tc_check(pop_tile_at(-1, 1), F, "col -1 = col9 соседа слева", __LINE__); - tc_check(pop_tile_at(-5, 1), W, "col -5 = col5 соседа слева", __LINE__); - tc_check(pop_tile_at(10, 1), F, "col 10 = col0 соседа справа", __LINE__); - tc_check(pop_tile_at(12, 1), W, "col 12 = col2 соседа справа", __LINE__); - tc_check(pop_tile_at(13, 1), F, "col 13 = col3 соседа справа", __LINE__); - /* Дальше комнаты соседа оригинал ушёл бы ещё через roomlink; у нас - * кэш на одну комнату в каждую сторону, и это край — стена. */ - tc_check(pop_tile_at(20, 1), W, "за комнатой соседа — стена", __LINE__); - tc_check(pop_tile_at(-11, 1), W, "и слева тоже", __LINE__); - - /* Соседа нет (край уровня) — стена в обе стороны, как раньше. */ - pop_map_set_edges(0, 0, 0, 0); - tc_check(pop_tile_at(12, 1), W, "без соседа справа — стена", __LINE__); - tc_check(pop_tile_at(-1, 1), W, "без соседа слева — стена", __LINE__); -} - -/* ---- скелет: падение его не убивает (check_guard_fallout, seg002:252) --- */ - -/* Если под комнатой лежит комната 3, упавший скелет ВОЗРОЖДАЕТСЯ там же — - * это единственный способ «убрать» его с экрана, убить его нельзя. */ -TC_TEST(char_skeleton_reappears_below) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_4_SKELETON, 5, 1, -1, 3); - Guard.room = 5; - Guard.y = 220; /* ниже нижней границы комнаты (211) */ - tk_link_down = 3; /* под комнатой 5 — комната 3 */ - - pop_guard_fallout(); - - tc_check(Guard.charid, CHARID_4_SKELETON, "скелет остался в слоте", __LINE__); - tc_check(Guard.room, 3, "перенесён в комнату 3", __LINE__); - tc_check(Guard.x, 133, "и на свою позицию", __LINE__); - tc_check(Guard.curr_row, 1, "ряд 1", __LINE__); - tc_check(Guard.alive, -1, "жив", __LINE__); -} - -/* А если снизу НЕ комната 3 — обычная судьба выпавшего: слот освобождается. */ -TC_TEST(char_skeleton_falls_out_elsewhere) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 2, 0); - sc_guard_at(CHARID_4_SKELETON, 5, 1, -1, 3); - Guard.room = 5; - Guard.y = 220; - tk_link_down = 7; /* снизу другая комната */ - - pop_guard_fallout(); - tc_check(Guard.charid, 0, "скелет убран, как обычный выпавший", __LINE__); -} - -/* ---- Окклюзия воротами (GATE-FORE-KID) ------------------------------ * - * Персонаж, стоящий В ПРОЁМЕ ворот, обязан уходить ЗА решётку: оригинал - * кладёт её бары в foretable (draw_tile_fore, seg008:0D15). Решение — - * pop_gate_over_char; сама отрисовка живёт в слое фона и в харнесс не - * линкуется, поэтому проверяем именно РЕШЕНИЕ. */ - -TC_TEST(char_gate_covers_char_standing_in_it) -{ - sc_room(room_gate, 1); - sc_kid_at(6, 2, 0); /* ровно на тайле ворот */ - pop_loadkid(); - TC_TRUE(pop_gate_over_char(&Char)); -} - -TC_TEST(char_gate_ignores_neighbour_tiles) -{ - sc_room(room_gate, 1); - sc_kid_at(5, 2, 0); /* колонка слева от ворот */ - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); - sc_kid_at(7, 2, 0); /* и справа */ - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); -} - -TC_TEST(char_gate_ignores_other_room) -{ - /* Персонаж той же клетки, но ДРУГОЙ комнаты (страж, оставшийся в - * соседней): его решётка текущей комнаты не касается. */ - sc_room(room_gate, 1); - sc_kid_at(6, 2, 0); - pop_loadkid(); - Char.room = 5; - TC_EQ(pop_gate_over_char(&Char), 0); -} - -TC_TEST(char_gate_never_in_last_column) -{ - /* Колонка 9: бары легли бы в колонку 10, то есть в СОСЕДНЮЮ комнату — - * у оригинала это отсекает `Kid.room != room_R`. */ - static const uint8_t room_gate9[30] = { - W, E, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, G, - }; - sc_room(room_gate9, 1); - sc_kid_at(9, 2, 0); - pop_loadkid(); - TC_EQ(pop_gate_over_char(&Char), 0); -} - -void main(void) -{ - sc_init(); - TC_RUN(char_take_hp_goes_to_active); - TC_RUN(char_immortal_level2_covers_kid_only); - TC_RUN(char_delta_hp_applies_per_character); - TC_RUN(char_kid_survives_two_row_fall); - TC_RUN(char_guard_dies_from_two_row_fall); - TC_RUN(char_shadow_survives_two_row_fall); - TC_RUN(char_guard_falls_at_all); - TC_RUN(char_guard_physics_gated_by_x); - TC_RUN(char_guard_fallout_removes_him); - TC_RUN(char_windows_do_not_leak); - TC_RUN(char_follow_guard_left); - TC_RUN(char_follow_guard_needs_edge); - TC_RUN(char_follow_guard_right_threshold); - TC_RUN(char_follow_guard_needs_sword_drawn); - TC_RUN(char_follow_guard_dead_stays); - TC_RUN(char_follow_guard_never_vertical); - TC_RUN(char_follow_guard_blocked_by_own_guard); - TC_RUN(char_tiles_resolve_across_rooms); - TC_RUN(char_skeleton_reappears_below); - TC_RUN(char_skeleton_falls_out_elsewhere); - TC_RUN(char_gate_covers_char_standing_in_it); - TC_RUN(char_gate_ignores_neighbour_tiles); - TC_RUN(char_gate_ignores_other_room); - TC_RUN(char_gate_never_in_last_column); -} diff --git a/applications/SprPoP/tests/host/t_cutscene.c b/applications/SprPoP/tests/host/t_cutscene.c deleted file mode 100644 index e36ede6..0000000 --- a/applications/SprPoP/tests/host/t_cutscene.c +++ /dev/null @@ -1,46 +0,0 @@ -/* pop_cutscene — порядок событий, точная семантика WAIT и прерывание. */ -#include -#include "tcheck.h" -#include "pop_cutscene.h" - -static const pop_cs_cmd_t script[] = { - { POP_CS_PALETTE, 1 }, { POP_CS_SHOW, 7 }, { POP_CS_WAIT, 2 }, - { POP_CS_FLASH, 3 }, { POP_CS_WAIT, 1 }, { POP_CS_FADE_OUT, 0 }, - { POP_CS_END, 0 } -}; - -TC_TEST(script_events_and_waits) -{ - pop_cutscene_t cs; - uint16_t arg; - - pop_cutscene_begin(&cs, script); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_PALETTE); TC_EQ(arg, 1); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_SHOW); TC_EQ(arg, 7); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_FLASH); TC_EQ(arg, 3); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_NONE); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_FADE_OUT); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_END); -} - -TC_TEST(skip_aborts_at_any_wait) -{ - pop_cutscene_t cs; - uint16_t arg; - - pop_cutscene_begin(&cs, script); - pop_cutscene_tick(&cs, &arg); - pop_cutscene_tick(&cs, &arg); - pop_cutscene_tick(&cs, &arg); /* WAIT(2), ещё есть один кадр */ - pop_cutscene_abort(&cs); - TC_EQ(pop_cutscene_tick(&cs, &arg), POP_CS_EVENT_END); - TC_EQ(cs.ended, 1); -} - -void main(void) -{ - TC_RUN(script_events_and_waits); - TC_RUN(skip_aborts_at_any_wait); -} diff --git a/applications/SprPoP/tests/host/t_death.c b/applications/SprPoP/tests/host/t_death.c deleted file mode 100644 index 1a81f6c..0000000 --- a/applications/SprPoP/tests/host/t_death.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * t_death — смерть от меча: что происходит с координатой и состоянием. - * - * Набор заведён ПЕРЕД правкой находок 12/13 (docs/sdlpop_audit.md), чтобы - * зафиксировать нынешнее поведение и поймать деградацию. История вопроса: - * правка 13 в изоляции уже ломала смерть — мёртвый Кид оставался с - * ненулевой скоростью падения, проваливался за нижнюю границу и игра - * уходила на рестарт, не показав тела. - * - * Проверяем ровно то, на что эти правки влияют: - * - HP и признак смерти; - * - КООРДИНАТУ по Y и остаточную скорость падения (в этом вся суть); - * - что смерть наступает при ударе не в боевой стойке (порт оригинала: - * «ранение вне боевой стойки означает смерть»). - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" - -#define E 0 -#define F 1 -#define W 20 - -/* Ровный пол во всю ширину: ряд 2 — пол, выше пусто. Комната без краёв, - * чтобы смерть не смешивалась с падением. */ -static const uint8_t room_flat[30] = { - E, E, E, E, E, E, E, E, E, E, - E, E, E, E, E, E, E, E, E, E, - F, F, F, F, F, F, F, F, F, F, -}; - -/* Площадка, обрывающаяся справа: колонки 0-4 — пол, 5-9 пусто. Кид у - * самого края спиной к обрыву — целевая сцена находки 12 (в оригинале - * такой удар отправляет в отдельную последовательность падения замертво). */ -static const uint8_t room_ledge[30] = { - E, E, E, E, E, E, E, E, E, E, - E, E, E, E, E, E, E, E, E, E, - F, F, F, F, F, E, E, E, E, E, -}; - -/* Поставить сцену «страж бьёт Кида» и нанести удар. */ -static void strike_kid(const uint8_t *room, uint8_t col, uint8_t hp, uint8_t sword) -{ - sc_room(room, 1); - sc_kid_at(col, 2, 1 /* лицом вправо */); - hitp_curr = hp; - Kid.sword = sword; - pop_kid_dead = 0; - /* Признак «жив» обвязка ставит только стражу, поэтому Киду задаём его - * сами: обработчик удара первым делом отсекает уже мёртвого. */ - Kid.alive = -1; - /* Удар оформляется действием 99 «ранен» — так его помечает боевая - * проверка оригинала, а разбирает pop_check_sword_hurt. */ - Kid.action = 99; - pop_check_sword_hurt(); - /* Удар выставляет ДЕЛЬТУ, а HP меняет отдельный шаг кадра — как в - * оригинале. Без него hitp_curr остался бы прежним, и тест мерил бы - * не то. */ - pop_do_delta_hp(); -} - -TC_TEST(death_unarmed_hit_is_lethal) -{ - strike_kid(room_flat, 4, 3 /* HP */, 0 /* без меча */); - /* Удар не в боевой стойке смертелен независимо от запаса HP. */ - TC_EQ(hitp_curr, 0); -} - -TC_TEST(death_armed_hit_costs_one_hp) -{ - strike_kid(room_flat, 4, 3, 2 /* меч вынут */); - TC_EQ(hitp_curr, 2); -} - -TC_TEST(death_armed_last_hp_kills) -{ - strike_kid(room_flat, 4, 1, 2); - TC_EQ(hitp_curr, 0); -} - -/* --- КООРДИНАТА ПОСЛЕ УДАРА: суть находок 12 и 13 -------------------- */ - -TC_TEST(survivor_is_placed_on_floor) -{ - /* Пережил удар — оригинал ставит его на пол своего ряда и гасит - * скорость падения. Это единственная ветка, где он так делает. */ - strike_kid(room_flat, 4, 3, 2); - TC_EQ(Kid.fall_y, 0); - TC_EQ(Kid.y, pop_y_land[Kid.curr_row + 1]); -} - -TC_TEST(death_on_flat_floor_keeps_body_in_place) -{ - /* Смерть на ровном полу: тело обязано остаться в своём ряду. Если - * координата или скорость падения уедут, физика утащит труп вниз — - * ровно так ломалась игра при правке 13 в одиночку. */ - strike_kid(room_flat, 4, 1, 2); - TC_EQ(Kid.curr_row, 2); - TC_EQ(Kid.fall_y, 0); -} - -TC_TEST(death_at_ledge_keeps_body_in_place) -{ - /* Смерть у самого обрыва — целевая сцена находки 12. Сейчас мы - * ставим «заколот на месте» и удерживаем тело; в оригинале здесь - * своя последовательность падения замертво. Тест фиксирует НЫНЕШНЕЕ - * поведение: после правки 12+13 ожидание изменится осознанно. */ - strike_kid(room_ledge, 4, 1, 2); - TC_EQ(Kid.curr_row, 2); - TC_EQ(Kid.fall_y, 0); -} - -/* --- ДВЕ СМЕРТИ БЕЗОРУЖНОГО: на месте и сброшенным с уступа ---------- * - * - * Оригинал выбирает между ними по обстановке ПОЗАДИ: есть опора или до - * кромки меньше четырёх — «заколот на месте»; сзади обрыв — отдельная - * последовательность падения замертво (docs/sdlpop_audit.md, находка 12). - * - * Проверяем сам ВЫБОР: последовательности должны различаться. Сравнение - * с конкретным номером было бы хрупким — смещения приходят из таблицы, - * извлечённой из данных оригинала. */ - -static uint16_t seq_after_unarmed_death(const uint8_t *room, uint8_t col, int8_t dir) -{ - sc_room(room, 1); - sc_kid_at(col, 2, dir); - hitp_curr = 3; - Kid.sword = 0; /* безоружен: падение уже спрятало меч */ - Kid.alive = -1; - pop_kid_dead = 0; - Kid.action = 99; - pop_check_sword_hurt(); - pop_do_delta_hp(); - return Kid.curr_seq; -} - -TC_TEST(unarmed_death_with_floor_behind_differs_from_ledge) -{ - uint16_t on_floor, at_ledge; - /* Лицом ВПРАВО в середине сплошного пола: сзади (слева) опора. */ - on_floor = seq_after_unarmed_death(room_flat, 4, 1); - /* Лицом ВЛЕВО у кромки: сзади (справа) обрыв — колонки 5..9 пусты. */ - at_ledge = seq_after_unarmed_death(room_ledge, 4, -1); - TC_TRUE(on_floor != at_ledge); -} - -TC_TEST(unarmed_death_at_ledge_is_lethal_too) -{ - (void)seq_after_unarmed_death(room_ledge, 4, -1); - TC_EQ(hitp_curr, 0); -} - -/* --- ПРИЗЕМЛЕНИЕ МЁРТВОГО ТЕЛА --------------------------------------- - * - * Оригинал спрашивает у приземляющегося, жив ли он (seg005:0173): вся - * развязка «мягко / средне / разбиться» отведена ЖИВОМУ, а телу — своя - * ветка (добить HP, звук падения насмерть, seq_22). - * - * У нас развилки не было, и это не бросалось в глаза только из-за высоты: - * тело, сброшенное ударом с ОДНОГО ряда, набирает fall_y < 22 — урона нет, - * «последнее HP» не тратится, ветка «разбился» не выбирается никогда, и - * труп приземлялся в ПРИСЕД (кадр 109). Отсюда симптом «убитого Кида - * уронили, а он сел этажом ниже». - * - * Пара тестов держит обе стороны развилки: мёртвый обязан разбиться, - * живой на той же высоте — сесть, как и раньше. */ - -#define FRAME_109_CROUCH 109 - -/* Уронить персонажа с ряда 1 на пол ряда 2 и дать физике доиграть. */ -static void drop_from_row1(const uint8_t *room, uint8_t col, uint8_t alive, uint8_t hp) -{ - uint8_t i; - sc_room(room, 1); - sc_kid_at(col, 1, 1 /* лицом вправо */); - hitp_curr = hp; - Kid.alive = (int8_t)alive; /* -1 жив, 0 мёртв (соглашение оригинала) */ - Kid.sword = 0; - pop_kid_dead = 0; - Kid.action = 4; /* свободное падение */ - for (i = 0; i < 40; i++) pop_phys_tick(); -} - -TC_TEST(dead_body_falls_crushed_not_crouched) -{ - /* Мёртвое тело падает на ОДИН ряд: высоты не хватает ни на урон, ни на - * «последнее HP», поэтому до фикса оно уходило в мягкое приземление. */ - drop_from_row1(room_flat, 4, 0 /* мёртв */, 0); - TC_EQ(Kid.curr_row, 2); /* долетело до пола */ - TC_EQ(Kid.fall_y, 0); /* скорость погашена */ - TC_FALSE(Kid.frame == FRAME_109_CROUCH); /* НЕ присед */ - TC_EQ(pop_kid_dead, 1); /* пошли дорогой «разбился» */ -} - -TC_TEST(living_soft_land_from_row1_still_crouches) -{ - /* Обратная сторона развилки: живой с той же высоты обязан сесть, как и - * до фикса. Если этот тест покраснеет — развилка съела живую ветку. */ - drop_from_row1(room_flat, 4, (uint8_t)-1 /* жив */, 3); - TC_EQ(Kid.curr_row, 2); - /* Кадр не проверяем: присед — это ПОСЛЕДОВАТЕЛЬНОСТЬ, и к сороковому - * тику она уже ушла с начального 109 (первый прогон теста поймал это - * на кадре 107). Держим то, что действительно различает ветки. */ - TC_EQ(pop_kid_dead, 0); /* живого не разбило */ - TC_EQ(hitp_curr, 3); /* один ряд — без урона */ -} - -int main(void) -{ - sc_init(); - TC_RUN(death_unarmed_hit_is_lethal); - TC_RUN(death_armed_hit_costs_one_hp); - TC_RUN(death_armed_last_hp_kills); - TC_RUN(survivor_is_placed_on_floor); - TC_RUN(death_on_flat_floor_keeps_body_in_place); - TC_RUN(death_at_ledge_keeps_body_in_place); - TC_RUN(unarmed_death_with_floor_behind_differs_from_ledge); - TC_RUN(unarmed_death_at_ledge_is_lethal_too); - TC_RUN(dead_body_falls_crushed_not_crouched); - TC_RUN(living_soft_land_from_row1_still_crouches); - return 0; -} diff --git a/applications/SprPoP/tests/host/t_demo.c b/applications/SprPoP/tests/host/t_demo.c deleted file mode 100644 index 85d28c3..0000000 --- a/applications/SprPoP/tests/host/t_demo.c +++ /dev/null @@ -1,89 +0,0 @@ -/* pop_demo — запись level 0: смена команд и прерывание любым вводом. */ -#include -#include "tcheck.h" -#include "pop_demo.h" - -static int8_t moves[255]; -static uint8_t moves_n; -static uint8_t any_key; -static uint8_t fight_ai; -uint8_t hitp_curr; - -uint8_t pop_demo_kid_ai(void) __banked -{ - return fight_ai; -} - -void pop_ctrl_auto_move(int8_t move) __banked -{ - moves[moves_n++] = move; -} - -uint8_t kbd_raw_any_down(void) -{ - return any_key; -} - -TC_TEST(replays_sdlpop_move_table) -{ - uint8_t done = 0; - - moves_n = 0; - fight_ai = 0; - hitp_curr = 4; - pop_demo_begin(); - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 1); - TC_EQ(moves[0], 0); /* t=1, запись {0, nothing} */ - while (moves_n < 14) { - TC_FALSE(pop_demo_tick()); - } - TC_EQ(moves[1], 1); /* t=2, запись {1, forward} */ - TC_EQ(moves[11], 1); /* t=12 всё ещё forward */ - TC_EQ(moves[12], 0); /* t=13, запись {0x0D, nothing} */ - - while (!done) done = pop_demo_tick(); - TC_EQ(moves_n, 254); /* SDLPoP останавливает demo_time на FE */ - TC_EQ(moves[253], -1); /* хвост после записи {0xE9, -1} */ -} - -TC_TEST(fight_ai_pauses_scripted_moves) -{ - moves_n = 0; - fight_ai = 1; - hitp_curr = 4; - pop_demo_begin(); - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 0); /* во время боя demo_time не идёт */ - - fight_ai = 0; - TC_FALSE(pop_demo_tick()); - TC_EQ(moves_n, 1); - TC_EQ(moves[0], 0); /* первый scripted тик не потерян */ -} - -TC_TEST(death_stops_demo_before_combat_ai) -{ - moves_n = 0; - fight_ai = 1; - hitp_curr = 0; - pop_demo_begin(); - TC_TRUE(pop_demo_tick()); - TC_EQ(moves_n, 0); -} - -TC_TEST(any_raw_key_interrupts_demo) -{ - any_key = 0; - TC_FALSE(pop_demo_user_input()); - any_key = 1; - TC_TRUE(pop_demo_user_input()); -} - -void main(void) -{ - TC_RUN(replays_sdlpop_move_table); - TC_RUN(fight_ai_pauses_scripted_moves); - TC_RUN(death_stops_demo_before_combat_ai); - TC_RUN(any_raw_key_interrupts_demo); -} diff --git a/applications/SprPoP/tests/host/t_flow.c b/applications/SprPoP/tests/host/t_flow.c deleted file mode 100644 index 36a9aad..0000000 --- a/applications/SprPoP/tests/host/t_flow.c +++ /dev/null @@ -1,52 +0,0 @@ -/* pop_flow — только канонические pre-level маршруты и ветка scene 12. */ -#include -#include "tcheck.h" -#include "pop_flow.h" - -TC_TEST(only_original_levels_have_pre_scenes) -{ - uint8_t level; - - for (level = 0; level <= 14; level++) { - pop_pre_cutscene_t scene = pop_flow_pre_cutscene(level, 60); - if (level == 2 || level == 6) TC_EQ(scene, POP_PRE_2_6); - else if (level == 4) TC_EQ(scene, POP_PRE_4); - else if (level == 8) TC_EQ(scene, POP_PRE_8); - else if (level == 9) TC_EQ(scene, POP_PRE_9); - else if (level == 12) TC_EQ(scene, POP_PRE_12); - else TC_EQ(scene, POP_PRE_NONE); - } - TC_EQ(pop_flow_pre_cutscene(15, 60), POP_PRE_NONE); -} - -TC_TEST(scene_12_short_time_boundary) -{ - TC_EQ(pop_flow_pre_cutscene(12, 6), POP_PRE_12); - TC_EQ(pop_flow_pre_cutscene(12, 5), POP_PRE_12_SHORT); - TC_EQ(pop_flow_pre_cutscene(12, 0), POP_PRE_12_SHORT); -} - -TC_TEST(level_14_is_ending_without_number) -{ - const pop_level_flow_t *flow = pop_flow_level(14); - TC_TRUE(flow != 0); - TC_FALSE(flow->show_level_number); - TC_TRUE(flow->ending_rule); - TC_TRUE(pop_flow_level(15) == 0); -} - -TC_TEST(ending_room_is_exact) -{ - TC_TRUE(pop_flow_is_ending(14, 5)); - TC_FALSE(pop_flow_is_ending(14, 4)); - TC_FALSE(pop_flow_is_ending(13, 5)); - TC_FALSE(pop_flow_is_ending(15, 5)); -} - -void main(void) -{ - TC_RUN(only_original_levels_have_pre_scenes); - TC_RUN(scene_12_short_time_boundary); - TC_RUN(level_14_is_ending_without_number); - TC_RUN(ending_room_is_exact); -} diff --git a/applications/SprPoP/tests/host/t_gate.c b/applications/SprPoP/tests/host/t_gate.c deleted file mode 100644 index 0340fdf..0000000 --- a/applications/SprPoP/tests/host/t_gate.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * t_gate.c — ОТКРЫТЫЕ ворота не должны быть «стеной» для осторожного шага. - * - * Наблюдение (пользователь, 2026-08-24): перед ОТКРЫТОЙ решёткой Кид, - * идущий слева направо, делает лишний мелкий шаг — чтобы подойти к краю, - * Shift+вперёд надо нажимать дважды. - * - * Механика: длину осторожного шага выбирает сам safe_step (seg005:0604) по - * числу, которое вернул get_edge_distance — seq 29..42 это «шаг ровно на - * distance пикселей». А get_edge_distance для тайла-стены зовёт - * dist_from_wall_forward, и та у ОРИГИНАЛА первой строкой отвечает −1, если - * тайл — ворота, сквозь которые можно пройти (seg004:0A18: - * `if (tiletype == tiles_4_gate && !can_bump_into_gate()) return -1`). - * Минус единица уводит разбор дальше, где открытые ворота опознаются как - * обычный ПОЛ: distance = 11, полный шаг. Без этой ветки расстояние - * считается до створки, тип края — EDGE_WALL, и шаг выходит коротким. - * - * Проверяем не поведение через кадры, а сам ответ get_edge_distance: он и - * есть источник длины шага, и утверждение «открытая решётка == обычный - * пол» переживёт любую перенастройку последовательностей. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_cdraw.h" /* pop_cd[].fph — высоту кадра ставит отрисовка */ - -#define F 1 /* floor */ -#define G 4 /* gate */ -#define W 20 /* wall */ - -/* Ряд 0: пол до колонки 4, решётка в колонке 5, пол дальше — «коридор с - * решёткой» уровня 1 (комната 5) в чистом виде. */ -static const uint8_t room_gate[30] = { - F, F, F, F, F, G, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Тот же ряд, но вместо решётки обычный пол — эталон «свободного» края. */ -static const uint8_t room_floor[30] = { - F, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Кид на колонке 4 лицом вправо, решётка (или пол) — следующим тайлом. - * modif — «открытость» ворот: 188 = подняты (проход открыт), 0 = опущены. - * Возврат — distance, тип края остаётся в pop_edge_type(). */ -static int edge_at_gate_x(const uint8_t *fg, uint8_t modif, uint8_t x) -{ - int d; - sc_room(fg, 1); - tk_modif[5] = modif; - if (x) sc_kid_at_x(4, 0, x, 0 /* лицом вправо */); - else sc_kid_at(4, 0, 0); - /* «Открыты ли ворота» решается сравнением подъёма створки с ВЫСОТОЙ - * КАДРА персонажа (can_bump_into_gate, seg004:0373). В продукте её - * пишет отрисовка (pop_cdraw), которой в наборе нет, — значит задаём - * сами. Порог важен только тем, что 6 (опущенная створка) под - * высотой кадра, а 53 (поднятая) над ней. */ - pop_cd[POP_CH_KID].fpw = 12; - pop_cd[POP_CH_KID].fph = 41; /* габарит стойки, снят в MAME */ - pop_loadkid(); - d = pop_edge_distance(); - pop_savekid(); - return d; -} - -static int edge_at_gate(const uint8_t *fg, uint8_t modif) -{ - return edge_at_gate_x(fg, modif, 0); -} - -/* ОТКРЫТАЯ решётка — не препятствие: и расстояние, и тип края обязаны - * совпасть с обычным полом, иначе осторожный шаг окажется коротким. */ -TC_TEST(open_gate_is_not_a_wall) -{ - int d_floor, d_gate; - uint8_t t_floor, t_gate; - - d_floor = edge_at_gate(room_floor, 0); - t_floor = pop_edge_type(); - d_gate = edge_at_gate(room_gate, 188); - t_gate = pop_edge_type(); - - TC_EQ(d_gate, d_floor); - TC_EQ(t_gate, t_floor); -} - -/* ЗАКРЫТАЯ решётка обязана остаться стеной — иначе фикс выше открыл бы - * проход сквозь опущенные ворота. */ -/* ЗАКРЫТАЯ решётка обязана остаться стеной: фикс выше не должен открывать - * проход сквозь опущенные ворота. X берём у самой створки — в центре тайла - * она ещё «далеко» и честно классифицируется как пол. */ -TC_TEST(closed_gate_is_a_wall) -{ - int d = edge_at_gate_x(room_gate, 0, 136); - TC_EQ(pop_edge_type(), EDGE_WALL); - TC_EQ(d < 11, 1); -} - -/* ...а ОТКРЫТАЯ на том же X ведёт себя как чистый пол — это и есть длина - * осторожного шага: 11, а не обрезок до створки. */ -TC_TEST(open_gate_steps_like_floor) -{ - int d_gate, d_floor; - uint8_t t_gate, t_floor; - - d_gate = edge_at_gate_x(room_gate, 188, 136); - t_gate = pop_edge_type(); - d_floor = edge_at_gate_x(room_floor, 0, 136); - t_floor = pop_edge_type(); - - TC_EQ(d_gate, d_floor); - TC_EQ(t_gate, t_floor); -} - -/* ---- check_gate_push (seg004:0833) --------------------------------- * - * Кид стоит в тайле решётки, решётка опускается — оригинал ВЫТАЛКИВАЕТ его - * из тайла (иначе Кид «в суперпозиции»: створка рисуется то перед ним, то - * за ним, и уйти он может в обе стороны). Прогоняем кадр физики и смотрим, - * сдвинулся ли X. */ -static int8_t push_col; /* curr_col, с которым сработал толчок */ - -static int push_from_dir(uint8_t x, uint8_t modif, int8_t dir) -{ - sc_room(room_gate, 1); - tk_modif[5] = modif; - /* Габарит ПОСЛЕДНЕГО НАРИСОВАННОГО кадра — его в продукте пишет - * отрисовка (pop_cdraw), которой в наборе нет. Значения сняты с живой - * сцены в MAME для стойки Кида: ширина 12, высота 41. */ - pop_cd[POP_CH_KID].fpw = 12; - pop_cd[POP_CH_KID].fph = 41; - sc_kid_at_x(5, 0, x, dir); - sc_run(0, 1); /* кадр «стоим» — флаги перекрытия за прошлый */ - push_col = Kid.curr_col; - sc_run(0, 1); /* ...и за этот: check_gate_push смотрит оба */ - return (int)Kid.x - (int)x; -} - -static int push_from(uint8_t x, uint8_t modif) -{ - return push_from_dir(x, modif, 0); -} - -/* СТОРОНА толчка — формула оригинала `Char.x += 5 - (orig_col <= tile_col) * 10`: - * пока тайл ПЕРСОНАЖА и есть решётка, его выталкивает ВЛЕВО (−5); как только - * персонаж отнесён к следующей колонке (решётка стала левым соседом) — ВПРАВО - * (+5). Граница между сторонами, стало быть, ровно там, где меняется - * curr_col, и проверяется здесь на обоих направлениях взгляда. - * - * Решётка — колонка 5, значит push_col == 5 обязан давать −5, push_col == 6 - * (+5), а вне зоны касания створки толчка нет вовсе. */ -static uint8_t check_side(int8_t dir, uint8_t *nleft, uint8_t *nright) -{ - uint8_t x, bad = 0; - for (x = 130; x <= 162; x++) { - int dx = push_from_dir(x, 0, dir); - if (dx == 0) continue; - /* Величина — кратная 5: пока персонаж остаётся в зоне створки, - * толчок повторяется каждый кадр (так же и в оригинале), поэтому - * проверяем СТОРОНУ и шаг, а не одно конкретное число. */ - if (push_col == 5) { if (dx >= 0 || dx % 5) bad++; else (*nleft)++; } - else if (push_col == 6) { if (dx <= 0 || dx % 5) bad++; else (*nright)++; } - else bad++; /* толчок вне тайлов решётки — ошибка */ - } - return bad; -} - -TC_TEST(closing_gate_pushes_kid) -{ - uint8_t nleft = 0, nright = 0, bad; - - bad = check_side(0, &nleft, &nright); /* лицом вправо */ - bad += check_side(-1, &nleft, &nright); /* лицом влево */ - - TC_EQ(bad, 0); - TC_EQ(nleft > 0, 1); /* обе стороны реально есть */ - TC_EQ(nright > 0, 1); -} - -/* ОТКРЫТУЮ решётку выталкивание не трогает вовсе (can_bump_into_gate). */ -TC_TEST(open_gate_does_not_push) -{ - uint8_t x, moved = 0; - for (x = 130; x <= 162; x++) - if (push_from_dir(x, 188, 0) != 0) moved++; - TC_EQ(moved, 0); -} - -int main(void) -{ - sc_init(); - TC_RUN(open_gate_is_not_a_wall); - TC_RUN(closed_gate_is_a_wall); - TC_RUN(open_gate_steps_like_floor); - TC_RUN(closing_gate_pushes_kid); - TC_RUN(open_gate_does_not_push); - return 0; -} diff --git a/applications/SprPoP/tests/host/t_geom.c b/applications/SprPoP/tests/host/t_geom.c deleted file mode 100644 index 0702db5..0000000 --- a/applications/SprPoP/tests/host/t_geom.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * t_geom.c — тесты pop_geom.c (геометрия комнаты + PRNG оригинала). - * - * Модуль выбран первым, потому что не тянет за собой ничего: ни графики, - * ни данных уровня, ни клавиатуры — только свой заголовок. - * - * Главный тест здесь — geom_lcg_matches_reference. В pop_geom.c LCG - * оригинала (s = s*214013 + 2531011) написан на ассемблере по схеме - * Горнера ради обхода __mullong, и заявка «бит-в-бит как в SDLPoP» до сих - * пор держалась только на комментарии. Тест сверяет рукописный asm с - * наивной 32-битной формулой на каждом шаге — и по возвращаемому значению, - * и по обеим половинам сида. - */ -#include "tcheck.h" -#include "pop_geom.h" - -/* ---- геометрия ------------------------------------------------------ */ - -TC_TEST(geom_xbump_layout) -{ - /* Шаг колонок равномерный и равен TILE_SIZEX — на этом стоит вся - * арифметика колонок (x_bump[col + FIRST_ONSCREEN_COLUMN]). */ - uint8_t i; - for (i = 1; i < 20; i++) - TC_EQ(pop_x_bump[i] - pop_x_bump[i - 1], TILE_SIZEX); - - /* Центр тайла колонки 0 — та самая величина, которую кладут в Char.x - * do_startpos и pos_guards (seg003). */ - TC_EQ(pop_x_bump[0 + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX, 72); - TC_EQ(pop_x_bump[9 + FIRST_ONSCREEN_COLUMN] + TILE_SIZEX, 198); -} - -TC_TEST(geom_yland_rows) -{ - /* y_land[row + 1]; [0] — ряд «над комнатой». */ - TC_EQ(pop_y_land[0], -8); - TC_EQ(pop_y_land[1], 55); - TC_EQ(pop_y_land[2], 118); - TC_EQ(pop_y_land[3], 181); - TC_EQ(pop_y_land[4], 244); - /* Шаг между рядами — TILE_SIZEY. */ - TC_EQ(pop_y_land[2] - pop_y_land[1], TILE_SIZEY); - TC_EQ(pop_y_land[3] - pop_y_land[2], TILE_SIZEY); -} - -TC_TEST(geom_y_to_row) -{ - /* Пол каждого ряда должен давать номер этого ряда. */ - TC_EQ(pop_y_to_row(pop_y_land[1]), 0); - TC_EQ(pop_y_to_row(pop_y_land[2]), 1); - TC_EQ(pop_y_to_row(pop_y_land[3]), 2); - /* Ряд над комнатой. */ - TC_EQ(pop_y_to_row(pop_y_land[0]), -1); - /* Оборот mod 4: ряд «под комнатой» сворачивается обратно в -1 — - * ровно на это опирается спавн падающего куска у нижней кромки. */ - TC_EQ(pop_y_to_row(pop_y_land[4]), -1); -} - -/* Цепочка сравнений в pop_y_to_row обязана совпадать с ИСХОДНОЙ формулой - * `(y + 60) / 63 % 4 - 1` во всём рабочем диапазоне — включая усечение - * деления К НУЛЮ для отрицательных. Тест держит инвариант: вызовы - * разбросаны по банкам (pop_map, pop_bg, pop_room), и соблазн написать - * деление «по месту» возвращается. */ -TC_TEST(geom_y_to_row_matches_formula) -{ - int16_t y; - /* −400..400 с запасом накрывает всё: кусок loose стартует у потолка - * (ряд −1) и улетает ниже поля в комнату снизу. */ - for (y = -400; y <= 400; y++) { - int16_t t = (int16_t)(y + 60); - TC_EQ(pop_y_to_row(y), (int8_t)(t / 63 % 4 - 1)); - } -} - -/* calc_screen_x_coord (seg008:2602) считается в pop_cdraw.c таблицей SCRX7 - * (банк 4, сюда не линкуется): хранится x/7 байтом, результат = x + SCRX7[..]. - * Таблица сгенерирована питоном, поэтому проверяем два правила, на которых - * держится генерация — ИМЕННО на целевом компиляторе: - * 1) тождество 8x/7 == x + x/7 (7x делится нацело); - * 2) усечение К НУЛЮ, а не к минус бесконечности. - * Округляй SDCC иначе — вся отрицательная половина уехала бы на пиксель, и - * поймалось бы это только глазами на левой кромке комнаты. */ -TC_TEST(geom_mul8div7_table_rules) -{ - int16_t x; - /* Полный диапазон obj_x по данным кадров: −416..695 (см. шапку scr_x). */ - for (x = -448; x <= 703; x++) { - int16_t want = (int16_t)(((x < 0) ? -x : x) * 8 / 7); - if (x < 0) want = (int16_t)-want; - TC_EQ((int16_t)(x * 8 / 7), want); /* усечение к нулю */ - TC_EQ((int16_t)(x * 8 / 7), (int16_t)(x + x / 7)); /* тождество */ - } -} - -/* ---- PRNG: сверка asm-LCG с эталонной формулой ---------------------- */ - -#if POP_PRANDOM_EXACT - -#define LCG_ITERS 128 - -TC_TEST(geom_lcg_matches_reference) -{ - pop_rnd_t s; - unsigned long ref = 12345UL; /* произвольный ненулевой старт */ - uint16_t i, got, want; - - pop_prandom_set(s, 12345u); - - for (i = 0; i < LCG_ITERS; i++) { - got = pop_prandom(&s, 255u); - ref = ref * 214013UL + 2531011UL; - want = (uint16_t)((uint16_t)(ref >> 16) % 256u); - - /* Обрываемся на первом расхождении: иначе одна ошибка в умножении - * забила бы весь буфер отчёта однотипными строками. */ - if (got != want || - s.lo != (uint16_t)ref || - s.hi != (uint16_t)(ref >> 16)) { - TC_EQ(got, want); - TC_EQ(s.lo, (uint16_t)ref); - TC_EQ(s.hi, (uint16_t)(ref >> 16)); - break; - } - } - TC_EQ(i, LCG_ITERS); /* прошли всю дистанцию без расхождений */ -} - -TC_TEST(geom_lcg_seed_zero) -{ - /* Ноль — законный сид (кладку сеют номером комнаты + ряд + колонка, - * что вполне даёт 0). У LCG ноль не является неподвижной точкой — - * убеждаемся, что asm это воспроизводит. */ - pop_rnd_t s; - unsigned long ref = 0UL; - pop_prandom_set(s, 0u); - pop_prandom(&s, 255u); - ref = ref * 214013UL + 2531011UL; - TC_EQ(s.lo, (uint16_t)ref); - TC_EQ(s.hi, (uint16_t)(ref >> 16)); -} - -#endif /* POP_PRANDOM_EXACT */ - -TC_TEST(geom_prandom_range) -{ - /* Оба генератора обязаны укладываться в 0..maxv, в том числе когда - * maxv+1 НЕ степень двойки (там другая ветка pop_rnd_fit). */ - pop_rnd_t s; - uint16_t i, v, seen_hi = 0; - - uint16_t out_of_range = 0; - - pop_prandom_set(s, 1u); - for (i = 0; i < 200; i++) { - v = pop_prandom(&s, 4u); /* n = 5, не степень двойки */ - if (v > 4) out_of_range++; - if (v == 4) seen_hi = 1; - } - TC_EQ(out_of_range, 0); - TC_TRUE(seen_hi); /* верхняя граница достижима */ - - pop_prandom_set(s, 7u); - out_of_range = 0; - for (i = 0; i < 64; i++) { - v = pop_prandom(&s, 1u); /* n = 2, маска */ - if (v > 1) out_of_range++; - } - TC_EQ(out_of_range, 0); -} - -int main(void) -{ - TC_RUN(geom_xbump_layout); - TC_RUN(geom_yland_rows); - TC_RUN(geom_y_to_row); - TC_RUN(geom_y_to_row_matches_formula); - TC_RUN(geom_mul8div7_table_rules); -#if POP_PRANDOM_EXACT - TC_RUN(geom_lcg_matches_reference); - TC_RUN(geom_lcg_seed_zero); -#endif - TC_RUN(geom_prandom_range); - return 0; -} diff --git a/applications/SprPoP/tests/host/t_grab.c b/applications/SprPoP/tests/host/t_grab.c deleted file mode 100644 index 66d1c02..0000000 --- a/applications/SprPoP/tests/host/t_grab.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * t_grab.c — прыжок с места через провал в три тайла с зацепом за дальнюю - * кромку (уровень 2, комната 9: Кид на краю (1,1) прыгает и должен - * повиснуть на (1,5)). - * - * Зачем отдельный набор. Трюк требует точной фазы и вручную выходит далеко - * не всегда — в SDLPoP тоже. Поэтому проверяем не «получилось с первого - * раза», а то, что действительно важно: **окно существует и достижимо**. - * Разница между «сложно» и «невозможно» — это разница между «так в - * оригинале» и «баг у нас», и глазами в MAME её не различить. - * - * Два утверждения: - * 1. есть хотя бы одна стартовая X, из которой зацеп удаётся; - * 2. короткий шаг (Shift+вперёд) приводит Кида В ЭТО окно — иначе окно - * было бы недостижимо для игрока, что равно его отсутствию. - * - * При провале в отчёт уходит карта исходов по всей ширине плиты: - * G — зацепился, L — приземлился на дальнюю плиту, . — сорвался. - * - * Механику зацепа задаёт check_grab (seg006:0A28): она работает ТОЛЬКО на - * кадрах 102..105 (начало падения) и только при зажатом Shift. mininim, - * для сравнения, разрешает повиснуть прямо в дуге прыжка (kid-jump.c, - * кадры 7..10) — но это переработка, а не порт, и источник истины у нас - * SDLPoP. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" - -#define E 0 -#define F 1 -#define P 3 -#define W 20 - -/* Уровень 2, комната 9, ряд 1: факел(0), кнопка(1), провал(2,3,4), - * колонна(5). Ряд 2 под провалом пуст — падение уходит из комнаты. */ -static const uint8_t room9[30] = { - E, E, E, E, E, W, W, W, W, W, - F, F, E, E, E, P, F, F, F, P, - W, W, E, E, E, P, F, W, W, W, -}; - -/* Судить по curr_row нельзя: у улетающего вниз Кида ряд заворачивается - * (0,1,2,0,…), и падение выглядит как «остался наверху». Надёжный признак - * — ДЕЙСТВИЕ: 2 = вис/подтягивание, 6 = вис у стены. */ -#define ACT_STAND 0 -#define ACT_RUN_JUMP 1 -#define ACT_HANG_CLIMB 2 -#define ACT_HANG_STRAIGHT 6 - -#define X_LO 76 -#define X_HI 99 - -static char probe(uint8_t x, uint8_t k1, uint8_t k2) -{ - uint8_t i; - sc_room(room9, 9); - sc_kid_at_x(1, 1, x, 0 /* лицом вправо */); - sc_trace_clear(); - sc_run(k1, 4); /* фаза 1: ↑+вперёд — прыжок с места */ - sc_run(k2, 26); /* фаза 2: Shift — попытка зацепа */ - - for (i = 0; i < sc_len; i++) { - uint8_t a = sc_trace[i].action; - if (a == ACT_HANG_CLIMB || a == ACT_HANG_STRAIGHT) return 'G'; - } - i = sc_len ? (uint8_t)(sc_len - 1) : 0; - if (sc_trace[i].col >= 5 && - (sc_trace[i].action == ACT_STAND || sc_trace[i].action == ACT_RUN_JUMP)) - return 'L'; - return '.'; -} - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} - -static void puts_(const char *s) { while (*s) put(*s++); } - -/* Карта исходов — только когда что-то сломалось: по ней сразу видно, - * окно съехало или исчезло. */ -static void dump_map(const char *tag, uint8_t k1, uint8_t k2) -{ - uint8_t x; - puts_(tag); - for (x = X_LO; x <= X_HI; x++) put(probe(x, k1, k2)); - put('\n'); -} - -/* Куда встаёт Кид после n-го короткого шага от x0. */ -static uint8_t step_x(uint8_t x0, uint8_t nsteps) -{ - uint8_t n, fx = x0; - sc_room(room9, 9); - sc_kid_at_x(1, 1, x0, 0); - for (n = 0; n < nsteps; n++) { - sc_trace_clear(); - sc_run(SC_SHIFT | SC_R, 4); /* шаг = нажатие, не удержание */ - sc_run(0, 6); /* отпустить, дать доиграть */ - if (sc_len) fx = sc_trace[sc_len - 1].x; - } - return fx; -} - -TC_TEST(grab_window_exists) -{ - uint8_t x, n = 0, lo = 0, hi = 0; - for (x = X_LO; x <= X_HI; x++) - if (probe(x, SC_U | SC_R, SC_SHIFT) == 'G') { - if (!n) lo = x; - hi = x; - n++; - } - /* Окно обязано существовать: без него трюк непроходим в принципе, а - * уровень 2 без него не пройти. */ - TC_TRUE(n > 0); - if (!n) { - dump_map("no-window: ", SC_U | SC_R, SC_SHIFT); - } else { - /* Границы фиксируем: если поедут — это осознанное изменение физики, - * а не случайность. */ - TC_EQ(lo, 91); - TC_EQ(hi, 95); - } -} - -TC_TEST(grab_window_reachable_by_safe_step) -{ - /* Игрок доходит до кромки короткими шагами. Если они не попадают в - * окно, существование окна ничего не стоит. */ - TC_EQ(step_x(80, 1), 91); - TC_EQ(step_x(80, 2), 95); -} - -TC_TEST(grab_same_for_all_key_patterns) -{ - /* Живой игрок держит «вперёд» и жмёт Shift по-разному. Исход не должен - * зависеть от того, отпущена ли стрелка и когда нажат Shift. */ - uint8_t x; - for (x = X_LO; x <= X_HI; x++) { - char a = probe(x, SC_U | SC_R, SC_SHIFT); - char b = probe(x, SC_U | SC_R, SC_SHIFT | SC_R); - char c = probe(x, SC_U | SC_R | SC_SHIFT, SC_SHIFT | SC_R); - TC_EQ(b, a); - TC_EQ(c, a); - } -} - -/* ---- Спуск через НИЖНЮЮ КРОМКУ комнаты (BUG-GRAB-SEAM-DOWN) ---------- * - * Уровень 7, комната 14 — по ней уровень и проходят: Кид на ряду 0 висит на - * кромке кнопки (0,2), отпускает и в падении должен зацепиться за кромку - * (2,2). Тайл-цель лежит В НИЖНЕМ ряду, то есть в момент зацепа персонаж - * уже НИЖЕ комнаты — в оригинале это curr_row == 3, а get_tile для него - * уходит по links.down в комнату снизу (find_room_of_tile, seg006:005D). - * - * Пока do_fall не пускал ряд дальше 2, check_grab на этом отрезке не звался - * НИ РАЗУ: Кид пролетал мимо кромки, набирал fall_y > 32, и дальше окно - * зацепа было закрыто уже по скорости — спуск становился непроходимым. - * Тест держит именно это: окно существует и достижимо. */ -#define C 6 /* closer */ -#define O 15 /* opener */ - -static const uint8_t room14[30] = { - C, F, O, E, E, E, E, E, F, F, - W, W, W, E, E, E, E, E, W, W, - F, F, P, E, E, E, E, E, W, W, -}; -static const uint8_t room15[30] = { - W, W, W, E, E, E, E, E, W, W, - F, F, P, E, E, E, E, E, W, W, - W, W, W, E, E, E, E, E, W, W, -}; -/* Ряд 2 комнаты 14 = «ряд −1» комнаты 15 (pop_map_set_above): после перехода - * зацеп продолжает целиться в ту же кромку, уже как в потолок. */ -static uint8_t above14[10]; - -#define ACT_MIDAIR 3 -#define ACT_FREEFALL 4 - -static uint8_t went_below; /* Kid уже пересёк нижнюю границу комнаты 14 */ - -/* Один кадр + переход в комнату снизу — ровно то, что делает главный цикл - * sprpop.c по pop_fell_out (enter_room(down) + exit_room_timer). */ -static void step14(uint8_t keys) -{ - sc_trace_clear(); /* трасса тут не нужна, важен исход */ - sc_run(keys, 1); - if (pop_fell_out) { - uint8_t i; - pop_fell_out = 0; - went_below = 1; - for (i = 0; i < 10; i++) above14[i] = room14[20 + i]; - sc_room(room15, 15); - pop_map_set_edges(0, 0, 14, 0); /* сверху — комната 14 */ - pop_map_set_above(above14); - pop_leave_timer = 2; - } -} - -/* Исход попытки: - * 'G' — повис на НИЖНЕЙ кромке (то, ради чего тест: ряд 2 комнаты 14); - * 'U' — зацепился обратно за ту кромку, с которой сорвался (ряд 0) — - * это другой, всегда работавший случай, и засчитывать его нельзя; - * '.' — пролетел мимо; 'x' — так и не сорвался (проба не состоялась). */ -static char probe_down(uint8_t x, uint8_t delay) -{ - uint8_t i; - sc_room(room14, 14); - pop_map_set_edges(0, 0, 0, 15); /* links комнаты 14: снизу — 15 */ - pop_map_set_above(0); - pop_leave_timer = 0; - pop_fell_out = 0; - went_below = 0; - /* Лицом ВЛЕВО у правой кромки кнопки: обрыв позади — это и есть поза - * спуска (pop_down_action, seg005:482). */ - sc_kid_at_x(2, 0, x, -1); - - /* ↓ + Shift — спуск с уступа (pop_down_action, seq_68) и вис на кромке. - * Shift держим, иначе Кид сорвётся, не успев повиснуть. */ - for (i = 0; i < 30; i++) { - step14(SC_D | SC_SHIFT); - if (Kid.action == ACT_HANG_CLIMB || Kid.action == ACT_HANG_STRAIGHT) break; - } - if (Kid.action != ACT_HANG_CLIMB && Kid.action != ACT_HANG_STRAIGHT) return 'x'; - /* отпустить Shift — сорваться с виса (hang_fall, seg005) */ - for (i = 0; i < 12; i++) { - step14(0); - if (Kid.action == ACT_MIDAIR || Kid.action == ACT_FREEFALL) break; - } - if (Kid.action != ACT_MIDAIR && Kid.action != ACT_FREEFALL) return 'x'; - - for (i = 0; i < delay; i++) step14(0); /* пауза перед Shift */ - for (i = 0; i < 30; i++) { - step14(SC_SHIFT); - if (Kid.action == ACT_HANG_CLIMB || Kid.action == ACT_HANG_STRAIGHT) { - if (!went_below) return 'U'; - /* За ЧТО взялся: после перехода вниз ряд 0 = кромка ряда 2 - * комнаты 14 (наша цель), ряд 2 = кромка ряда 1 комнаты 15 - * (этажом ниже — этот случай работал и раньше). */ - return Kid.curr_row == 0 ? 'G' : 'g'; - } - } - return '.'; -} - -#define XD_LO 90 -#define XD_HI 113 - -#define XD_DELAY_MAX 8 - -TC_TEST(grab_below_room_edge_window_exists) -{ - uint8_t x, d, n = 0, n0 = 0; - for (x = XD_LO; x <= XD_HI; x++) - for (d = 0; d <= XD_DELAY_MAX; d++) - if (probe_down(x, d) == 'G') { n++; if (!d) n0++; } - TC_TRUE(n > 0); - /* И играбельность: зацеп обязан удаваться при самом естественном вводе — - * отпустил вис и сразу зажал Shift (d = 0). Окно, доступное только с - * точной задержкой, для игрока почти равно отсутствующему. */ - TC_TRUE(n0 > 0); - if (!n) { /* карта исходов: строка = задержка Shift */ - uint8_t i; - for (i = 0; i <= XD_DELAY_MAX; i++) { - put('d'); put((char)('0' + i)); put(':'); put(' '); - for (x = XD_LO; x <= XD_HI; x++) put(probe_down(x, i)); - put('\n'); - } - } -} - -int main(void) -{ - sc_init(); - TC_RUN(grab_window_exists); - TC_RUN(grab_window_reachable_by_safe_step); - TC_RUN(grab_same_for_all_key_patterns); - TC_RUN(grab_below_room_edge_window_exists); - return 0; -} diff --git a/applications/SprPoP/tests/host/t_hang.c b/applications/SprPoP/tests/host/t_hang.c deleted file mode 100644 index 0ee13a6..0000000 --- a/applications/SprPoP/tests/host/t_hang.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * t_hang.c — ЗАЦЕП ОБЯЗАН ДЕРЖАТЬСЯ, а не срываться на следующем кадре. - * - * Регресс 2026-09-02. glide_through_wall_guard() (порт fix_glide_through_wall, - * взят в билд 2026-08-31) звался в do_fall СРАЗУ ПОСЛЕ check_grab. Беда в - * том, что seq_15 называется grab_ledge_MIDAIR: после удачного зацепа - * Char.action == 3 (в воздухе), персонаж уже подтянут вплотную к кромке — а - * под кромкой в комнатах оригинала стоит КЛАДКА. Guard видел ровно её - * (t == TILE_WALL, d == 10), считал это «пролётом сквозь стену», отбрасывал - * персонажа на 5 пикселей назад и гасил fall_x. Зацеп РИСОВАЛСЯ и тут же - * срывался — уровень 3 (комната 7, длинный прыжок через четыре пролёта) и - * attract-демо (комната 2, прыжок с места). - * - * ПОЧЕМУ ПРЕЖНИЕ НАБОРЫ ЭТОГО НЕ ПОЙМАЛИ. t_grab судит по «действие стало - * вис» — а вис-то наступал, он просто не жил. Отсюда мера здесь другая: - * вис обязан ДЕРЖАТЬСЯ подряд несколько кадров. Разница между «зацепился» - * и «зацепился и держится» — это и есть разница между багом и нормой. - * - * СЦЕНА (геометрия уровня 3, комната 7, приведённая внутрь одной комнаты, - * чтобы шов не примешивался): кромка на (0,0), под ней кладка (1,0), четыре - * пролёта (0,1..4), толчок с плиты (0,5), разбег справа. - */ -#include -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" - -#define E 0x00 -#define F 0x01 -#define G 0x04 -#define L 0x0B -#define T 0x13 -#define W 0x14 - -static uint8_t room[30] = { - F, E, E, E, E, L, F, T, F, T, - W, E, E, E, E, W, W, W, W, W, - W, E, E, E, E, W, W, W, W, W, -}; - -#define ACT_HANG_CLIMB 2 -#define ACT_HANG_STRAIGHT 6 -#define HOLD_FRAMES 3 - -/* Вис ДЕРЖИТСЯ: действие «вис» стоит HOLD_FRAMES кадров подряд. */ -static uint8_t hang_holds(uint8_t ledge, uint8_t nrun) -{ - uint8_t i, run = 0; - room[0] = ledge; - sc_room(room, 7); - sc_kid_at(9, 0, -1); /* лицом влево, у правого края */ - sc_run(SC_L, nrun); /* разбег */ - sc_run(SC_L | SC_U, 6); /* толчок в прыжок */ - sc_trace_clear(); - sc_run(SC_SHIFT, 30); /* полёт, зацеп и жизнь после него */ - for (i = 0; i < sc_len; i++) { - uint8_t a = sc_trace[i].action; - if (a == ACT_HANG_CLIMB || a == ACT_HANG_STRAIGHT) { - if (++run >= HOLD_FRAMES) return 1; - } else run = 0; - } - return 0; -} - -/* Сколько фаз разбега из 41 дают ЖИВОЙ вис. До регресса — все, кроме - * первой (слишком близкий толчок), то есть 34; при сорванном зацепе — ноль. */ -static uint8_t window(uint8_t ledge) -{ - uint8_t k, n = 0; - for (k = 6; k <= 46; k++) if (hang_holds(ledge, k)) n++; - return n; -} - -TC_TEST(long_jump_hang_survives_wall_under_ledge) -{ - /* Кромка-пол: под ней кладка — та самая, на которую срабатывал guard. */ - TC_TRUE(window(F) >= 30); -} - -TC_TEST(long_jump_hang_survives_on_gate) -{ - /* Кромка-решётка: тайл другой, кладка под ним та же. Проверяется - * отдельно, потому что зацеп за решётку идёт своей веткой can_grab. */ - TC_TRUE(window(G) >= 30); -} - -int main(void) -{ - sc_init(); - TC_RUN(long_jump_hang_survives_wall_under_ledge); - TC_RUN(long_jump_hang_survives_on_gate); - return 0; -} diff --git a/applications/SprPoP/tests/host/t_jaffar.c b/applications/SprPoP/tests/host/t_jaffar.c deleted file mode 100644 index 08bf622..0000000 --- a/applications/SprPoP/tests/host/t_jaffar.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - * t_jaffar — спецсобытия УРОВНЯ 13: встреча с Джафаром, победа, выход и - * три исключения loose-механики (падающая гряда плит). - * - * Своего ИИ у Джафара нет — это обычный страж (seg002:085A), поэтому - * проверять тут нечего кроме СОБЫТИЙ и ветвлений по номеру уровня. А - * именно они и опасны: три из них — это `if (level == 13)` посреди чужого - * кода (тряска плит, удар плитой в беге, «страж не встаёт в стойку»), и - * сломать их можно правкой, вообще не думая про 13-й уровень. - * - * Порт: seg002:0544 meet_Jaffar, seg002:0517 Jaffar_exit, - * seg006:1927 on_guard_killed, seg000:1317 check_fall_flo, - * seg007:823/949 исключения animate_loose/loose_make_shake. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define L 11 /* loose */ -#define W 20 /* wall */ - -/* Комната с полом внизу и грядой loose в ряду 2 — она же будет играть роль - * «комнаты сверху» для check_fall_flo. */ -static const uint8_t room_loose[30] = { - F, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, - F, F, L, L, L, L, L, L, F, F, -}; - -/* Комната, в которую Кид входит снизу: ровный пол во всех рядах. */ -static const uint8_t room_flat[30] = { - F, F, F, F, F, F, F, F, F, F, - F, F, F, F, F, F, F, F, F, F, - F, F, F, F, F, F, F, F, F, F, -}; - -static uint8_t above_row[10]; - -static void scene_level13(uint8_t room) -{ - pop_guard_reset(); - pop_current_level = JAFFAR_LEVEL; - pop_leveldoor_open = 0; - pop_guard_notice_timer = 0; - sc_room(room_flat, room); - sc_kid_at(1, 2, 1); - tk_log_clear(); -} - -/* ---- meet_Jaffar ----------------------------------------------------- */ - -TC_TEST(jaffar_notice_timer_set_leaving_room3_right) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = JAFFAR_MEET_ROOM; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, JAFFAR_NOTICE_TIME); -} - -/* Дверь уровня уже открыта — значит Джафар мёртв и Кид возвращается. - * Второй форы не даётся. */ -TC_TEST(jaffar_notice_not_given_after_victory) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = JAFFAR_MEET_ROOM; - pop_leveldoor_open = 2; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -TC_TEST(jaffar_notice_not_given_from_other_room) -{ - scene_level13(JAFFAR_MEET_ROOM); - Kid.room = (uint8_t)(JAFFAR_MEET_ROOM + 1); - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -TC_TEST(jaffar_notice_is_level_gated) -{ - scene_level13(JAFFAR_MEET_ROOM); - pop_current_level = 12; - Kid.room = JAFFAR_MEET_ROOM; - pop_meet_jaffar(); - TC_EQ(pop_guard_notice_timer, 0); -} - -/* Счётчик убывает по кадру и останавливается на нуле. */ -TC_TEST(jaffar_notice_timer_counts_down) -{ - uint8_t i; - pop_united_shadow = 0; - pop_guard_notice_timer = 3; - for (i = 0; i < 5; i++) pop_frame_timers(); - TC_EQ(pop_guard_notice_timer, 0); -} - -/* ---- Джафар ЖДЁТ, пока идёт фора ------------------------------------- */ - -/* Поднять соперника с УБРАННЫМ мечом в одном ряду с Кидом и «показать» его: - * дальше решение принимает autocontrol_guard_inactive. */ -static void jaffar_faces_kid(void) -{ - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = 0; - can_guard_see_kid = 2; - is_guard_notice = 0; -} - -TC_TEST(jaffar_holds_still_while_notice_timer_runs) -{ - uint8_t i; - scene_level13(1); - jaffar_faces_kid(); - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; - for (i = 0; i < 6; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - /* Стойку не сменил: меч так и в ножнах. */ - TC_EQ(Guard.sword, 0); -} - -/* Фора кончилась — обычное поведение стража возвращается. */ -TC_TEST(jaffar_draws_sword_after_notice_timer) -{ - uint8_t i; - scene_level13(1); - jaffar_faces_kid(); - pop_guard_notice_timer = 0; - for (i = 0; i < 12; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - TC_EQ(Guard.sword, SWORD_2_DRAWN); -} - -/* На прочих уровнях таймер ни на что не влияет: условие в оригинале - * двойное (`level != 13 || timer == 0`), и потерять первую половину легко. */ -TC_TEST(jaffar_notice_timer_ignored_on_other_levels) -{ - uint8_t i; - scene_level13(1); - pop_current_level = 12; - jaffar_faces_kid(); - pop_guard_notice_timer = JAFFAR_NOTICE_TIME; - for (i = 0; i < 12; i++) { can_guard_see_kid = 2; pop_guard_tick(); } - TC_EQ(Guard.sword, SWORD_2_DRAWN); -} - -/* ---- победа и выход --------------------------------------------------- */ - -/* Смерть Джафара не открывает дверь, а ставит флаг «выход разрешён». */ -TC_TEST(jaffar_death_opens_the_exit_flag) -{ - scene_level13(1); - /* charid у Джафара обычный: своим charid оригинал метит только скелета - * (enter_guard, seg002:196), а визиря отличают спрайты и события. */ - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = SWORD_2_DRAWN; - guardhp_curr = 0; /* последнее HP только что снято */ - pop_flash_time = 0; - pop_guard_tick(); - TC_EQ(pop_leveldoor_open, 2); - TC_EQ(pop_flash_time, JAFFAR_FLASH_TIME); - TC_EQ(pop_flash_color, POP_FLASH_WHITE); -} - -/* На других уровнях смерть стража флага не ставит (иначе дверь открывалась - * бы от любого убитого). */ -TC_TEST(jaffar_death_flag_is_level_gated) -{ - scene_level13(1); - pop_current_level = 12; - sc_guard_at(CHARID_2_GUARD, 6, 2, -1, 6); - Guard.sword = SWORD_2_DRAWN; - guardhp_curr = 0; - pop_guard_tick(); - TC_EQ(pop_leveldoor_open, 0); -} - -/* Уход ВЛЕВО при поднятом флаге жмёт кнопку комнаты 24. */ -TC_TEST(jaffar_exit_presses_button_in_room24) -{ - scene_level13(1); - tk_room_fg[JAFFAR_EXIT_ROOM][JAFFAR_EXIT_TILEPOS] = 15; /* opener */ - pop_leveldoor_open = 2; - tk_log_clear(); - pop_jaffar_exit(); - TC_TRUE(tk_log_count(TK_BUTTON) >= 1); -} - -TC_TEST(jaffar_exit_silent_before_victory) -{ - scene_level13(1); - tk_room_fg[JAFFAR_EXIT_ROOM][JAFFAR_EXIT_TILEPOS] = 15; - pop_leveldoor_open = 0; - tk_log_clear(); - pop_jaffar_exit(); - TC_EQ(tk_log_count(TK_BUTTON), 0); -} - -/* ---- три исключения loose-механики ----------------------------------- */ - -/* Сотрясение (приземление Кида) на 13-м уровне плиты НЕ трясёт: иначе оно - * сбило бы им отложенный старт, и гряда посыпалась бы разом. */ -TC_TEST(jaffar_knock_does_not_shake_tiles) -{ - scene_level13(1); - sc_room(room_loose, 1); - sc_kid_at(1, 2, 1); - Kid.curr_row = 2; - pop_loadkid(); - knock = -1; /* KNOCK_DOWN: ряд Кида */ - pop_check_knock(); - TC_EQ(pop_loose_modif[22], 0); - TC_EQ(pop_loose_modif[27], 0); -} - -/* А на прочих уровнях трясёт — контроль, что выключен именно 13-й. */ -TC_TEST(jaffar_knock_still_shakes_on_other_levels) -{ - scene_level13(1); - pop_current_level = 12; - sc_room(room_loose, 1); - sc_kid_at(1, 2, 1); - Kid.curr_row = 2; - pop_loadkid(); - knock = -1; - pop_check_knock(); - TC_EQ(pop_loose_modif[22], 0x80); -} - -/* Фаза с ОТРИЦАТЕЛЬНЫМ стартом на 13-м уровне не гасится, а досчитывает - * до провала: это и есть падающая гряда. Проверяем на плите ПОЛА (тот же - * код, что у плит-потолков, но без mob-обвязки, которая в набор не - * линкуется). */ -TC_TEST(jaffar_negative_phase_counts_through_to_fall) -{ - uint8_t i; - scene_level13(1); - sc_room(room_loose, 1); - sc_kid_at(1, 0, 1); - pop_loose_modif[22] = (uint8_t)-4; /* старт «через 4 кадра» */ - /* 4 кадра — на выход из отрицательной зоны, дальше 10 — обычный отсчёт; - * 30 с запасом. Ванильная ветка «тряска кончилась» обнулила бы фазу на - * первом же кадре, и плита осталась бы стоять. */ - for (i = 0; i < 30; i++) pop_loose_tick(); - TC_EQ(pop_tile_at(2, 2), 0); /* провалилась: тайл стал пустым */ -} - -/* На прочих уровнях та же фаза читается как тряска и гаснет — плита цела. */ -TC_TEST(jaffar_negative_phase_is_shake_on_other_levels) -{ - uint8_t i; - scene_level13(1); - pop_current_level = 12; - sc_room(room_loose, 1); - sc_kid_at(1, 0, 1); - pop_loose_modif[22] = (uint8_t)-4; - for (i = 0; i < 30; i++) pop_loose_tick(); - TC_EQ(pop_tile_at(2, 2), L); - TC_EQ(pop_loose_modif[22], 0); -} - -/* ---- check_fall_flo --------------------------------------------------- */ - -/* Вход в комнату 23: шести плитам ряда 2 комнаты СВЕРХУ раздаётся - * отрицательная фаза, остальным — ничего. */ -static void fall_flo_scene(uint8_t room) -{ - uint8_t i; - scene_level13(room); - for (i = 0; i < 10; i++) above_row[i] = room_loose[20 + i]; - pop_map_set_above(above_row); - pop_map_set_edges(0, 0, 1 /* up */, 0); - pop_map_set_above(above_row); - pop_loose_reset(); -} - -TC_TEST(jaffar_fall_flo_seeds_the_row_above) -{ - uint8_t c, seeded = 0; - fall_flo_scene(POP_LOOSE_TILES_ROOM1); - pop_check_fall_flo(); - for (c = 2; c <= 7; c++) - if ((int8_t)pop_ceil_modif[c] < 0) seeded++; - TC_EQ(seeded, 6); - /* Колонки вне диапазона 2..7 не тронуты (там в комнате пол, не loose). */ - TC_EQ(pop_ceil_modif[0], 0); - TC_EQ(pop_ceil_modif[9], 0); -} - -TC_TEST(jaffar_fall_flo_ignores_other_rooms) -{ - uint8_t c; - fall_flo_scene((uint8_t)(POP_LOOSE_TILES_ROOM1 + 1)); - pop_check_fall_flo(); - for (c = 0; c < 10; c++) TC_EQ(pop_ceil_modif[c], 0); -} - -TC_TEST(jaffar_fall_flo_is_level_gated) -{ - uint8_t c; - fall_flo_scene(POP_LOOSE_TILES_ROOM2); - pop_current_level = 12; - pop_check_fall_flo(); - for (c = 0; c < 10; c++) TC_EQ(pop_ceil_modif[c], 0); -} - -/* Повторный вход не перебивает уже идущий отсчёт (иначе гряда «зависала» - * бы, пока игрок бегает туда-сюда). */ -TC_TEST(jaffar_fall_flo_does_not_restart_running_countdown) -{ - fall_flo_scene(POP_LOOSE_TILES_ROOM2); - pop_ceil_modif[3] = 5; /* плита уже падает */ - pop_check_fall_flo(); - TC_EQ(pop_ceil_modif[3], 5); -} - -void main(void) -{ - sc_init(); - TC_RUN(jaffar_notice_timer_set_leaving_room3_right); - TC_RUN(jaffar_notice_not_given_after_victory); - TC_RUN(jaffar_notice_not_given_from_other_room); - TC_RUN(jaffar_notice_is_level_gated); - TC_RUN(jaffar_notice_timer_counts_down); - TC_RUN(jaffar_holds_still_while_notice_timer_runs); - TC_RUN(jaffar_draws_sword_after_notice_timer); - TC_RUN(jaffar_notice_timer_ignored_on_other_levels); - TC_RUN(jaffar_death_opens_the_exit_flag); - TC_RUN(jaffar_death_flag_is_level_gated); - TC_RUN(jaffar_exit_presses_button_in_room24); - TC_RUN(jaffar_exit_silent_before_victory); - TC_RUN(jaffar_knock_does_not_shake_tiles); - TC_RUN(jaffar_knock_still_shakes_on_other_levels); - TC_RUN(jaffar_negative_phase_counts_through_to_fall); - TC_RUN(jaffar_negative_phase_is_shake_on_other_levels); - TC_RUN(jaffar_fall_flo_seeds_the_row_above); - TC_RUN(jaffar_fall_flo_ignores_other_rooms); - TC_RUN(jaffar_fall_flo_is_level_gated); - TC_RUN(jaffar_fall_flo_does_not_restart_running_countdown); -} diff --git a/applications/SprPoP/tests/host/t_mouse.c b/applications/SprPoP/tests/host/t_mouse.c deleted file mode 100644 index 24afb09..0000000 --- a/applications/SprPoP/tests/host/t_mouse.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * t_mouse — спецсобытие уровня 8: МЫШЬ (do_timers seg003:0545, - * do_mouse seg003:0ABA, autocontrol_mouse seg002:07EB). - * - * Единственный набор, куда линкуется guards.c: проверяется не физика (её - * держат t_phys/t_char), а связка «условие запуска → рождение → ИИ → - * нажатие кнопки → уход». Всё это ветки по charid внутри общего кода - * соперника, и сломать их можно, ничего не трогая в самой мыши. - * - * Кадр соперника здесь полный, с ИИ — pop_guard_tick() + pop_guard_phys_tick(), - * как в главном цикле; sc_guard_run для этого не годится (он намеренно без ИИ). - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" /* pop_current_level (под тестом — из stubs.c) */ -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define O 15 /* opener */ -#define W 20 /* wall */ - -/* Верхний ряд комнаты 16 в упрощённом виде: сплошной пол и кнопка на - * колонке 7 — там же, где она стоит в данных уровня 8. Провал колонок - * 4..6 намеренно засыпан: он мешает Киду, а не мыши, и в тест на ИИ - * притащил бы падение соперника. */ -static const uint8_t room_mouse[30] = { - F, F, F, F, F, F, F, O, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Поставить сцену уровня 8: Кид в комнате 16, дверь уровня открыта. */ -static void scene_level8(void) -{ - sc_room(room_mouse, POP_MOUSE_ROOM); - sc_kid_at(1, 0, 1); - Kid.room = POP_MOUSE_ROOM; - pop_guard_reset(); - pop_current_level = POP_MOUSE_LEVEL; - pop_leveldoor_open = 1; - tk_log_clear(); -} - -/* Один полный кадр соперника, как в главном цикле sprpop.c. */ -static void mouse_frame(void) -{ - pop_guard_tick(); - pop_guard_phys_tick(); -} - -/* ---- рождение -------------------------------------------------------- */ - -TC_TEST(mouse_appears_after_delay) -{ - uint16_t i; - scene_level8(); - - /* Счётчик стартует с 1 («дверь открыта») и растёт по кадру, срабатывая - * на значении POP_MOUSE_DELAY — то есть кадров до мыши на два меньше. - * Прогоняем всё, кроме последнего: слот обязан быть ещё пуст. */ - for (i = 0; i < POP_MOUSE_DELAY - 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); - - pop_check_mouse(); /* тот самый кадр */ - TC_EQ(Guard.charid, CHARID_24_MOUSE); - TC_EQ(Guard.x, POP_MOUSE_START_X); - TC_EQ(Guard.curr_row, 0); - TC_EQ(Guard.direction, -1); /* dir_FF_left */ - TC_EQ(guardhp_curr, 1); - TC_EQ(Guard.room, POP_MOUSE_ROOM); /* унаследована от Кида (loadkid) */ -} - -/* Счётчик тикает ТОЛЬКО пока Кид в комнате мыши: в оригинале это то же - * условие, что и запуск (Char.room == mouse_room), поэтому 12,5 секунды - * отсчитываются с возвращения игрока, а не с открытия двери. */ -TC_TEST(mouse_timer_frozen_outside_room) -{ - uint16_t i; - scene_level8(); - Kid.room = POP_MOUSE_ROOM + 1; - for (i = 0; i < POP_MOUSE_DELAY * 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); - TC_EQ(pop_leveldoor_open, 1); /* не сдвинулся ни на кадр */ -} - -/* Закрытая дверь уровня — мыши нет вовсе (она подсказка на обратном пути). */ -TC_TEST(mouse_needs_open_leveldoor) -{ - uint16_t i; - scene_level8(); - pop_leveldoor_open = 0; - for (i = 0; i < POP_MOUSE_DELAY * 2; i++) pop_check_mouse(); - TC_EQ(Guard.charid, 0); -} - -/* ---- ИИ: пробежала, нажала, ушла ------------------------------------- */ - -/* Родить мышь, не гоняя POP_MOUSE_DELAY пустых кадров. */ -static void spawn_mouse(void) -{ - scene_level8(); - pop_leveldoor_open = POP_MOUSE_DELAY - 1; - pop_check_mouse(); -} - -TC_TEST(mouse_runs_left_and_presses_button) -{ - uint8_t i; - spawn_mouse(); - TC_EQ(Guard.charid, CHARID_24_MOUSE); - - /* Бежит влево: до порога разворота ей ~35 пикселей по 3-5 за кадр. */ - for (i = 0; i < 24; i++) mouse_frame(); - TC_TRUE(Guard.x < POP_MOUSE_START_X); - - /* По дороге наступила на кнопку (0,7) — общий check_press физики - * соперника, тот же, которым кнопки жмут страж и тень. */ - TC_TRUE(tk_log_count(TK_BUTTON) >= 1); -} - -TC_TEST(mouse_turns_back_and_disappears) -{ - uint8_t i; - spawn_mouse(); - - /* 120 кадров с запасом покрывают путь туда (200→166), стойку seq_107 - * (11 кадров) и путь обратно (166→200). */ - for (i = 0; i < 120; i++) { - mouse_frame(); - if (Guard.direction == DIR_56_NONE) break; - } - TC_EQ(Guard.direction, DIR_56_NONE); /* clear_char: ушла со сцены */ - TC_EQ(guardhp_curr, 0); -} - -/* ---- ветки по charid у соседнего кода -------------------------------- */ - -/* Мышь Кида «не видит»: иначе он выхватит на неё меч (seg003:0965). */ -TC_TEST(mouse_is_not_seen_by_kid) -{ - spawn_mouse(); - Guard.curr_row = Kid.curr_row; /* один ряд — условие луча */ - pop_check_can_guard_see_kid(); - TC_EQ(can_guard_see_kid, 0); -} - -/* leave_guard мышь не записывает в данные уровня (seg002:02F5): вернувшись - * в комнату, игрок не должен встретить «стража» с её параметрами. - * Комнату берём из диапазона таблицы заглушки (TK_ROOMS = 8). */ -TC_TEST(mouse_is_not_saved_as_room_guard) -{ - spawn_mouse(); - Guard.room = 1; - tk_gs_tile[0] = 0xEE; /* метка «никто сюда не писал» */ - pop_guard_leave(); - TC_EQ(tk_gs_tile[0], 0xEE); -} - -void main(void) -{ - sc_init(); - TC_RUN(mouse_appears_after_delay); - TC_RUN(mouse_timer_frozen_outside_room); - TC_RUN(mouse_needs_open_leveldoor); - TC_RUN(mouse_runs_left_and_presses_button); - TC_RUN(mouse_turns_back_and_disappears); - TC_RUN(mouse_is_not_seen_by_kid); - TC_RUN(mouse_is_not_saved_as_room_guard); -} diff --git a/applications/SprPoP/tests/host/t_phys.c b/applications/SprPoP/tests/host/t_phys.c deleted file mode 100644 index a3c91a0..0000000 --- a/applications/SprPoP/tests/host/t_phys.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * t_phys.c — характеризация физики Кида (pop_map + pop_kid + pop_ctrl). - * - * Назначение набора — СТРАХОВКА ПОД РЕФАКТОРИНГ, а не проверка - * правильности. Эталоны здесь сняты с текущего билда, то есть - * консервируют и текущие баги; правильность по-прежнему проверяется - * против SDLPoP. Смысл в другом: перенос физики с `Kid.` на `Char.` - * обязан быть поведение-сохраняющим, и «трасса до == трасса после» ловит - * ровно тот класс ошибок, который там возможен. - * - * Поэтому при осознанном изменении поведения эталон ПЕРЕСНИМАЕТСЯ (см. - * SC_RECORD ниже), а в коммите должно быть написано, почему трасса - * поменялась. Молча обновлённый эталон обесценивает весь набор. - * - * Снятие эталона: - * make -C applications/SprPoP/tests/host t_phys SC_RECORD=1 - * Трассы уходят в отчёт tcheck готовыми C-строками — вставить в golden_*. - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_ctrl.h" -#include "pop_guard.h" /* pop_do_delta_hp — урон сводится дельтой */ - -/* Коды тайлов (pop_map): 0 пусто, 1 пол, 3 колонна, 11 loose, 20 стена. */ -#define E 0 -#define F 1 -#define P 3 -#define L 11 -#define W 20 - -/* Ровный пол во всю комнату: базовая сцена для ходьбы/бега/разворота. */ -static const uint8_t room_flat[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Пол с обрывом после колонки 5: падение с ряда 1 на ряд 2. */ -static const uint8_t room_ledge[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, E, E, E, E, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Проваливающаяся плита на (1,4) — сцена под loose-механику. */ -static const uint8_t room_loose[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, L, F, F, F, F, F, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Провал в ТРИ пустых тайла (колонки 2,3,4) — геометрия из BUG-RJUMP-1 - * (ур. 2, комнаты 1 и 9). Разбег-прыжок влево с колонки 5 обязан - * доставать до колонки 1; у нас Кид сваливается в провал. */ -static const uint8_t room_gap3[30] = { - W, E, E, E, E, E, E, E, E, E, - W, F, E, E, E, F, F, F, F, F, - W, F, F, F, F, F, F, F, F, W, -}; - -/* SC_RECORD= — снять эталон СЦЕНАРИЯ n (нумерация в порядке вызовов в - * main). По одному за прогон: лог tcheck 768 байт, на все трассы сразу - * его не хватает. Перебором занимается record_golden.py. */ -#ifndef SC_RECORD -#define SC_RECORD 0 -#endif - -/* Снять или сверить — одной строкой в каждом сценарии, чтобы режимы не - * разъезжались. Имя сценария = имя файла эталона. */ -#if SC_RECORD -static uint8_t sc_idx; -#define SC_CHECK(g, nm) \ - do { if (++sc_idx == (SC_RECORD)) sc_dump(nm); } while (0) -#else -#define SC_CHECK(g, nm) sc_expect((g), (uint8_t)(sizeof(g) / SC_REC_BYTES)) -#endif - -/* ---- эталоны (сняты SC_RECORD=1) ------------------------------------ * - * В режиме снятия эталонов файлов golden/ ещё нет — и не должно быть: - * первый прогон их и порождает. */ -#if !SC_RECORD - -static const uint8_t golden_stand[] = { -#include "golden/stand.h" -}; -static const uint8_t golden_run_right[] = { -#include "golden/run_right.h" -}; -static const uint8_t golden_step_shift[] = { -#include "golden/step_shift.h" -}; -static const uint8_t golden_turn[] = { -#include "golden/turn.h" -}; -static const uint8_t golden_crouch[] = { -#include "golden/crouch.h" -}; -static const uint8_t golden_jump_up[] = { -#include "golden/jump_up.h" -}; -static const uint8_t golden_fall_ledge[] = { -#include "golden/fall_ledge.h" -}; -static const uint8_t golden_loose[] = { -#include "golden/loose.h" -}; -static const uint8_t golden_rjump_gap3[] = { -#include "golden/rjump_gap3.h" -}; - -#else -/* SC_RECORD: имена нужны только чтобы SC_CHECK() раскрылся. */ -#define golden_stand 0 -#define golden_run_right 0 -#define golden_step_shift 0 -#define golden_turn 0 -#define golden_crouch 0 -#define golden_jump_up 0 -#define golden_fall_ledge 0 -#define golden_loose 0 -#define golden_rjump_gap3 0 -#endif - -/* ---- сценарии -------------------------------------------------------- */ - -TC_TEST(phys_stand_is_stable) -{ - /* Никакого ввода: Кид на ровном полу обязан стоять неподвижно. Тест - * дешёвый, но ловит самое обидное — «сам поехал» после правки - * геометрии или окна Char. */ - sc_room(room_flat, 1); - sc_kid_at(3, 1, -1); - sc_trace_clear(); - sc_run(0, 12); - SC_CHECK(golden_stand, "stand"); -} - -TC_TEST(phys_run_right) -{ - sc_room(room_flat, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 24); - SC_CHECK(golden_run_right, "run_right"); -} - -TC_TEST(phys_step_with_shift) -{ - /* Shift + вперёд — осторожный шаг: одна из самых чувствительных к - * distance_to_edge веток. */ - sc_room(room_flat, 1); - sc_kid_at(3, 1, 0); - sc_trace_clear(); - sc_run(SC_R | SC_SHIFT, 20); - SC_CHECK(golden_step_shift, "step_shift"); -} - -TC_TEST(phys_turn_around) -{ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - sc_trace_clear(); - sc_run(SC_L, 16); - SC_CHECK(golden_turn, "turn"); -} - -TC_TEST(demo_backward_is_not_screen_mirrored) -{ - /* demo_moves уже задаёт forward/backward относительно Кида. На плите - * 0,6 он смотрит вправо, и move=2 обязан начать seq_5 turn, а не - * превратиться через user_control() в seq_1 run вправо к пропасти. */ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - pop_ctrl_auto_move(0); - pop_ctrl_auto_move(2); - /* SEQTBL_BASE+0x01CB — начало seq_5 в исходном kid_data.bin. */ - TC_EQ((uint16_t)(Kid.curr_seq - SEQTBL_BASE), 0x01CB); -} - -TC_TEST(phys_crouch_and_stand_up) -{ - sc_room(room_flat, 1); - sc_kid_at(4, 1, 0); - sc_trace_clear(); - sc_run(SC_D, 8); - sc_run(0, 12); - SC_CHECK(golden_crouch, "crouch"); -} - -TC_TEST(phys_jump_up_nothing_above) -{ - /* Над головой пусто — seq_28; проверяем и смещение по x, которое - * оригинал делает перед прыжком. */ - sc_room(room_flat, 1); - sc_kid_at(4, 1, -1); - sc_trace_clear(); - sc_run(SC_U, 20); - SC_CHECK(golden_jump_up, "jump_up"); -} - -TC_TEST(phys_run_off_ledge) -{ - /* Бег в обрыв: check_on_floor -> start_fall -> land на ряду 2. - * Сценарий, вокруг которого крутился BUG-FALL-SWORD-1. */ - sc_room(room_ledge, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 34); - SC_CHECK(golden_fall_ledge, "fall_ledge"); -} - -TC_TEST(phys_loose_floor_breaks) -{ - /* Пробежка по loose-плите: тайл обязан затрястись и провалиться, а - * физика — сообщить об этом соседям (trob + перерисовка). */ - sc_room(room_loose, 1); - sc_kid_at(1, 1, 0); - sc_trace_clear(); - sc_run(SC_R, 34); - SC_CHECK(golden_loose, "loose"); -#if !SC_RECORD - /* Журнал заглушек: плита обязана была отвалиться (кусок отрывается — - * pop_loose_mob_spawn) и попросить перерисовку. Это уже не - * характеризация, а содержательная проверка — заглушка-пустышка её не - * дала бы. Пока плита ЖИВЁТ в отрисованной комнате, фазой владеет - * pop_loose_modif, а не trob — поэтому спрашиваем именно про кусок. */ - TC_TRUE(tk_log_count(TK_MOB_SPAWN) > 0); - TC_TRUE(tk_log_count(TK_REDRAW) > 0); -#endif -} - -TC_TEST(phys_loose_survives_room_change) -{ - /* GUARD против бага «плита не успевает провалиться»: Кид расшатал плиту - * и ушёл в соседнюю комнату — отсчёт обязан ПЕРЕЖИТЬ смену комнаты. - * В оригинале терять нечего (loose — обычный trob в общем списке, фаза - * в curr_room_modif); у нас фаза живёт в pop_loose_modif[] текущей - * комнаты, и её сдаёт/забирает пара leave_room + reset. */ - uint8_t pos = 1 * 10 + 4; /* loose-плита сцены room_loose */ - uint8_t phase = 3; /* середина отсчёта до провала (1..10) */ - - /* Саму анимацию проверяет phys_loose_floor_breaks выше; здесь нужна - * ровно передача фазы, поэтому ставим её явно — прогон бы привязал тест - * к тому, на каком кадре Кид добежит до плиты. */ - sc_room(room_loose, 1); - pop_loose_modif[pos] = phase; - - /* Уход из комнаты: фаза уезжает в room_modif + trob... */ - tk_log_clear(); - pop_loose_leave_room(); - TC_TRUE(tk_log_count(TK_TROB) > 0); /* плита сдана в общий список */ - - /* ...и возвращается при входе обратно — а не обнуляется, как раньше. */ - pop_loose_reset(); - TC_EQ(pop_loose_modif[pos], phase); - - /* Старт уровня, наоборот, обязан фазу ЗАБЫТЬ (load_level восстанавливает - * уровень целиком) — иначе дрожь протекала бы в следующую жизнь. */ - pop_loose_forget(); - TC_EQ(pop_loose_modif[pos], 0); -} - -TC_TEST(phys_loose_gate_survives_room_change) -{ - /* GUARD против гейта холостого хода (loose_any, pop_map.c). Гейт - * пропускает оба цикла pop_loose_tick, пока ни одна фаза не взведена, и - * взводится ПЯТЬЮ местами записи. Четыре из них — взвод дрожи от шага и - * сотрясения — уже прогоняет phys_loose_floor_breaks; пятое (фаза - * ВОССТАНОВЛЕНА входом в комнату) не покрывал никто, а именно оно даёт - * самый тихий из возможных отказов: плита, к которой Кид вернулся, - * застыла бы на полудроже навсегда. - * - * Поэтому проверяем не флаг (он статик модуля), а НАБЛЮДАЕМОЕ следствие: - * после возврата в комнату тик обязан ДВИГАТЬ фазу. */ - uint8_t pos = 1 * 10 + 4; /* loose-плита сцены room_loose */ - uint8_t phase = 3; /* середина отсчёта до провала (1..10) */ - - /* Начинаем со снятого гейта: старт уровня забывает все фазы, и ни одно - * место взвода после этого не срабатывает. */ - sc_room(room_loose, 1); - pop_loose_forget(); - pop_loose_tick(); /* холостой проход — гейт снят */ - - /* Плита осталась недодрожавшей в room_modif, Кид возвращается в комнату. */ - pop_loose_modif[pos] = phase; - pop_loose_leave_room(); - pop_loose_reset(); - TC_EQ(pop_loose_modif[pos], phase); - - /* И вот теперь тик обязан её ДВИНУТЬ, а не пропустить по снятому гейту. */ - pop_loose_tick(); - TC_EQ(pop_loose_modif[pos], (uint8_t)(phase + 1)); -} - -TC_TEST(phys_running_jump_over_3tile_gap) -{ - /* BUG-RJUMP-1. Разбег влево от колонки 8, дальше Up — разбег-прыжок. - * Ожидание оригинала: перелёт провала в три тайла и посадка на (1,1). - * Сейчас эталон фиксирует НАШЕ поведение (падение в провал) — когда - * баг починим, трасса поменяется осознанно и эталон переснимется. */ - sc_room(room_gap3, 1); - sc_kid_at(8, 1, -1); - sc_trace_clear(); - sc_run(SC_L, 8); /* разбег */ - sc_run(SC_L | SC_U, 26); /* прыжок и посадка */ - SC_CHECK(golden_rjump_gap3, "rjump_gap3"); -} - -/* Падение с ДВУХ рядов: пол только внизу, Кид стартует на кромке ряда 0. - * В обычном падении это −1 HP (land, seg005:173), под пером — ни урона, ни - * разгона. */ -static const uint8_t room_drop2[30] = { - W, F, E, E, E, E, E, E, E, E, - W, E, E, E, E, E, E, E, E, E, - W, F, F, F, F, F, F, F, F, W, -}; - -/* Максимальная скорость падения за прогон и итоговое HP — через сцену не - * видно (в трассу пишется поза), поэтому меряем прямо по Kid. */ -static uint8_t drop2_max_fall_y(uint8_t frames) -{ - uint8_t i, mx = 0; - for (i = 0; i < frames; i++) { - sc_trace_clear(); - sc_run(SC_R, 1); - if ((uint8_t)Kid.fall_y > mx) mx = (uint8_t)Kid.fall_y; - } - return mx; -} - -TC_TEST(phys_feather_fall_is_slow_and_harmless) -{ - uint8_t mx_normal, mx_feather, hp_normal, hp_feather; - - /* (1) как обычно: разгон до FALL_MAX и −1 HP за два ряда */ - sc_room(room_drop2, 1); - sc_kid_at(1, 0, 0); - pop_feather = 0; - mx_normal = drop2_max_fall_y(40); - pop_do_delta_hp(); /* урон копится дельтой, сводит её цикл */ - hp_normal = hitp_curr; - - /* (2) под зельем медленного падения (seg006:057C: ускорение 1, потолок 4; - * seqtbl уводит приземление в ветку stepfloat — без урона) */ - sc_room(room_drop2, 1); - sc_kid_at(1, 0, 0); - pop_feather = 200; - mx_feather = drop2_max_fall_y(40); - pop_do_delta_hp(); - hp_feather = hitp_curr; - pop_feather = 0; - - TC_TRUE(mx_normal > 4); /* обычное падение разгоняется */ - TC_TRUE(mx_feather <= 4); /* под пером потолок скорости — 4 */ - TC_TRUE(hp_normal < 3); /* два ряда обычно стоят HP */ - TC_EQ(hp_feather, 3); /* под пером — целым */ -} - -/* ---- точка входа ----------------------------------------------------- */ - -void main(void) -{ - sc_init(); - TC_RUN(phys_stand_is_stable); - TC_RUN(phys_run_right); - TC_RUN(phys_step_with_shift); - TC_RUN(phys_turn_around); - TC_RUN(demo_backward_is_not_screen_mirrored); - TC_RUN(phys_crouch_and_stand_up); - TC_RUN(phys_jump_up_nothing_above); - TC_RUN(phys_run_off_ledge); - TC_RUN(phys_loose_floor_breaks); - TC_RUN(phys_loose_survives_room_change); - TC_RUN(phys_loose_gate_survives_room_change); - TC_RUN(phys_running_jump_over_3tile_gap); - TC_RUN(phys_feather_fall_is_slow_and_harmless); -} diff --git a/applications/SprPoP/tests/host/t_shadow.c b/applications/SprPoP/tests/host/t_shadow.c deleted file mode 100644 index 2c96934..0000000 --- a/applications/SprPoP/tests/host/t_shadow.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * t_shadow — спецсобытия УРОВНЯ 12: встреча с тенью, общий урон, слияние. - * - * Что здесь проверяется и почему именно тестом, а не прогоном в MAME. Вся - * сцена уровня 12 — это набор УСЛОВИЙ, каждое из которых легко сломать, - * ничего не трогая в самой тени: тайл меча, знак `pop_united_shadow`, - * charid соперника, номер уровня. Проверить их в эмуляторе — значит - * дойти до 12-го уровня и разыграть бой; здесь это шесть вызовов. - * - * Порт: seg002:0064 check_shadow, seg002:0536 sword_disappears, - * seg006:2033 check_killed_shadow, seg000:1518 do_delta_hp, - * seg003:0735 timers, seg006:1063 «появление плит». - * - * Сам ИИ тени (autocontrol_shadow_level12) сюда НЕ вынесен: он решает - * «куда идти», и его исход — траектория, то есть предмет прогона со - * сценой и эталоном, а не одиночной проверки. Набор линкует guards.c - * (как t_mouse), поэтому добавить такой сценарий можно здесь же. - */ -#include - -#include "tcheck.h" -#include "pop_kid.h" -#include "pop_map.h" -#include "pop_guard.h" -#include "pop_geom.h" -#include "pop_state.h" -#include "pop_level.h" -#include "pop_tune.h" -#include "scene.h" -#include "stubs.h" - -#define E 0 /* empty */ -#define F 1 /* floor */ -#define W 20 /* wall */ -#define S 22 /* sword */ - -/* Комната 15 в объёме, который нужен событию: меч в (0,1), пол под ним. */ -static const uint8_t room15[30] = { - F, S, F, F, F, F, F, F, E, E, - W, W, W, W, W, W, W, W, F, F, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Комната 2: верхний ряд с ПРОПАСТЬЮ в колонках 4..6 — те самые плиты, - * которые появляются под ногами после слияния. */ -static const uint8_t room2[30] = { - F, F, F, F, E, E, E, F, F, F, - W, W, W, W, W, W, W, W, W, W, - W, W, W, W, W, W, W, W, W, W, -}; - -/* Общая точка входа: уровень 12, слот соперника пуст, слияния не было. */ -static void scene_level12(void) -{ - uint8_t i; - pop_guard_reset(); - pop_current_level = SHADOW_FIGHT_LEVEL; - pop_united_shadow = 0; - pop_shadow_init = 0; - for (i = 0; i < 30; i++) tk_room_fg[SHADOW_FIGHT_ROOM][i] = room15[i]; - tk_log_clear(); -} - -/* ---- check_shadow: когда тень поднимается ---------------------------- */ - -/* Меч ещё лежит — тени нет. Условие ОБРАТНО уровню 5 (там тень приходит, - * пока зелье на месте), и перепутать их — самая вероятная ошибка порта. */ -TC_TEST(shadow12_waits_until_sword_taken) -{ - scene_level12(); - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 0); - TC_EQ(Guard.charid, 0); -} - -/* Меч подобран — тень падает в комнату (init_shad_12 + seq_7_fall). */ -TC_TEST(shadow12_rises_when_sword_gone) -{ - scene_level12(); - tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS] = F; - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 1); - TC_EQ(Guard.charid, CHARID_1_SHADOW); - TC_EQ(Guard.x, 0x51); - /* y = 232 — НИЖЕ поля (192), и это не ошибка данных: поле беззнаковое, - * тень «падает» из-под комнаты и появляется сверху. А curr_row при - * этом РОВНО ИЗ ТАБЛИЦЫ (0), а не пересчитанный из y (тот дал бы −1): - * do_init_shad копирует семь полей как есть и ряд не трогает. Обе - * величины закреплены тестом — «починить» их выглядит соблазнительно. */ - TC_EQ(Guard.y, 0xE8); - TC_EQ(Guard.curr_row, 0); - TC_EQ(Guard.direction, 0); /* dir_0_right */ - TC_EQ(Guard.room, SHADOW_FIGHT_ROOM); - TC_EQ(guardhp_curr, 4); -} - -/* После слияния тень не поднимается больше НИКОГДА (флаг ушёл в −1). */ -TC_TEST(shadow12_never_rises_after_uniting) -{ - scene_level12(); - tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS] = F; - pop_united_shadow = -1; - TC_EQ(pop_check_shadow(SHADOW_FIGHT_ROOM), 0); - TC_EQ(Guard.charid, 0); -} - -/* В чужой комнате событие не срабатывает — там поднимается обычный страж - * (возврат 0 = «занимайся слотом сам»). */ -TC_TEST(shadow12_other_room_leaves_slot_alone) -{ - scene_level12(); - TC_EQ(pop_check_shadow((uint8_t)(SHADOW_FIGHT_ROOM - 1)), 0); - TC_EQ(Guard.charid, 0); -} - -/* ---- sword_disappears ------------------------------------------------ */ - -TC_TEST(shadow12_sword_vanishes_leaving_room18) -{ - scene_level12(); - Kid.room = SWORD_GONE_ROOM; - tk_modif[SHADOW_SWORD_TILEPOS] = 5; /* блеск меча */ - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], F); - /* Модификатор гасится вместе с тайлом: ненулевой modif рисует на полу - * «фальшивый» узор (та же причина, что у поднятого зелья). */ - TC_EQ(tk_modif[SHADOW_SWORD_TILEPOS], 0); -} - -TC_TEST(shadow12_sword_stays_leaving_other_room) -{ - scene_level12(); - Kid.room = (uint8_t)(SWORD_GONE_ROOM - 1); - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], S); -} - -/* На других уровнях комната 18 — обычная комната. */ -TC_TEST(shadow12_sword_event_is_level_gated) -{ - scene_level12(); - pop_current_level = 11; - Kid.room = SWORD_GONE_ROOM; - pop_sword_disappears(); - TC_EQ(tk_room_fg[SHADOW_FIGHT_ROOM][SHADOW_SWORD_TILEPOS], S); -} - -/* ---- таймер вспышки -------------------------------------------------- */ - -/* Счётчик досчитывает до нуля и уходит в −1 — «уже слились». Ноль как - * конечное состояние был бы неотличим от «слияния не было». */ -TC_TEST(shadow12_timer_ends_at_minus_one) -{ - pop_united_shadow = 3; - pop_frame_timers(); TC_EQ(pop_united_shadow, 2); - pop_frame_timers(); TC_EQ(pop_united_shadow, 1); - pop_frame_timers(); TC_EQ(pop_united_shadow, -1); - pop_frame_timers(); TC_EQ(pop_united_shadow, -1); /* и больше не меняется */ -} - -TC_TEST(shadow12_timer_idle_when_zero) -{ - pop_united_shadow = 0; - pop_frame_timers(); - TC_EQ(pop_united_shadow, 0); -} - -/* ---- общий урон (do_delta_hp) ---------------------------------------- */ - -static void hp_scene(uint8_t charid, uint8_t level) -{ - scene_level12(); - pop_current_level = level; - Guard.charid = charid; - guardhp_curr = guardhp_max = 4; - hitp_beg_lev = 3; - pop_kid_hp_reset(); - guardhp_delta = -1; - hitp_delta = 0; -} - -/* Ранил тень — ранил себя: урон КОПИРУЕТСЯ, а не делится. */ -TC_TEST(shadow12_damage_is_shared) -{ - hp_scene(CHARID_1_SHADOW, SHADOW_FIGHT_LEVEL); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 2); -} - -TC_TEST(shadow12_damage_not_shared_with_guard) -{ - hp_scene(CHARID_2_GUARD, SHADOW_FIGHT_LEVEL); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 3); -} - -/* Тень уровней 4/5/6 боевой не бывает, но проверка обязана быть по УРОВНЮ, - * а не только по charid: иначе безобидная тень уровня 5 делилась бы HP. */ -TC_TEST(shadow12_damage_not_shared_on_other_level) -{ - hp_scene(CHARID_1_SHADOW, 5); - pop_do_delta_hp(); - TC_EQ(guardhp_curr, 3); - TC_EQ(hitp_curr, 3); -} - -/* ---- check_killed_shadow --------------------------------------------- */ - -static void kill_scene(uint8_t charid, int8_t kid_alive, int8_t guard_alive) -{ - scene_level12(); - Guard.charid = charid; - Guard.alive = guard_alive; - guardhp_curr = guardhp_max = 4; - hitp_beg_lev = 3; - pop_kid_hp_reset(); - Kid.charid = CHARID_0_KID; - Kid.alive = kid_alive; - guardhp_delta = hitp_delta = 0; - pop_flash_time = 0; - pop_immortal = 0; -} - -/* Тень мертва — Киду отсчитывается 100 урона, то есть гарантированно всё. */ -TC_TEST(shadow12_killing_shadow_kills_kid) -{ - kill_scene(CHARID_1_SHADOW, -1, 0); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, -3); - TC_TRUE(pop_flash_time != 0); - TC_EQ(pop_flash_color, POP_FLASH_WHITE); -} - -/* И симметрично: смерть Кида добивает тень. */ -TC_TEST(shadow12_killing_kid_kills_shadow) -{ - kill_scene(CHARID_1_SHADOW, 0, -1); - pop_check_killed_shadow(); - TC_EQ(guardhp_delta, -4); -} - -/* Со стражем связи нет — условие оригинала `(charid | charid) == shadow` - * проходит только для пары Кид/тень. */ -TC_TEST(shadow12_kill_link_ignores_guard) -{ - kill_scene(CHARID_2_GUARD, -1, 0); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, 0); - TC_EQ(pop_flash_time, 0); -} - -/* Оба живы — событие молчит (иначе бой убивал бы обоих в первом же кадре). */ -TC_TEST(shadow12_kill_link_silent_while_both_alive) -{ - kill_scene(CHARID_1_SHADOW, -1, -1); - pop_check_killed_shadow(); - TC_EQ(hitp_delta, 0); - TC_EQ(guardhp_delta, 0); -} - -/* ---- «появление плит» ------------------------------------------------ */ - -/* Сцена: Кид стоит в комнате 2 на колонке 4 верхнего ряда — прямо над - * пропастью. До слияния он обязан провалиться, после — достроить пол. */ -static void floors_scene(void) -{ - uint8_t i; - scene_level12(); - for (i = 0; i < 30; i++) tk_room_fg[2][i] = room2[i]; - sc_room(room2, 2); - sc_kid_at(4, 0, 1); - sc_trace_clear(); -} - -TC_TEST(shadow12_floors_appear_after_uniting) -{ - floors_scene(); - pop_united_shadow = -1; - sc_run(0, 2); - /* Не упал: действие осталось стоечным, ряд тот же. */ - TC_EQ(Kid.curr_row, 0); - TC_TRUE(Kid.action != 4); /* actions_4_in_freefall */ - /* Плита появилась И в карте комнаты, И в данных уровня. */ - TC_EQ(pop_tile_at(4, 0), 1); - TC_EQ(tk_room_fg[2][4], 1); - /* Перерисованы две клетки — сама и соседняя справа, на обеих страницах. */ - TC_TRUE(tk_log_count(TK_REDRAW) >= 2); -} - -/* До слияния пропасть остаётся пропастью. */ -TC_TEST(shadow12_floors_hidden_before_uniting) -{ - floors_scene(); - pop_united_shadow = 0; - sc_run(0, 2); - TC_EQ(pop_tile_at(4, 0), 0); - TC_TRUE(Kid.curr_row != 0 || Kid.action == 4); -} - -/* Событие привязано к КОМНАТЕ: в комнате 3 того же уровня пола нет. */ -TC_TEST(shadow12_floors_only_in_their_rooms) -{ - floors_scene(); - pop_united_shadow = -1; - Kid.room = 3; - sc_run(0, 2); - TC_EQ(pop_tile_at(4, 0), 0); -} - -void main(void) -{ - sc_init(); - TC_RUN(shadow12_waits_until_sword_taken); - TC_RUN(shadow12_rises_when_sword_gone); - TC_RUN(shadow12_never_rises_after_uniting); - TC_RUN(shadow12_other_room_leaves_slot_alone); - TC_RUN(shadow12_sword_vanishes_leaving_room18); - TC_RUN(shadow12_sword_stays_leaving_other_room); - TC_RUN(shadow12_sword_event_is_level_gated); - TC_RUN(shadow12_timer_ends_at_minus_one); - TC_RUN(shadow12_timer_idle_when_zero); - TC_RUN(shadow12_damage_is_shared); - TC_RUN(shadow12_damage_not_shared_with_guard); - TC_RUN(shadow12_damage_not_shared_on_other_level); - TC_RUN(shadow12_killing_shadow_kills_kid); - TC_RUN(shadow12_killing_kid_kills_shadow); - TC_RUN(shadow12_kill_link_ignores_guard); - TC_RUN(shadow12_kill_link_silent_while_both_alive); - TC_RUN(shadow12_floors_appear_after_uniting); - TC_RUN(shadow12_floors_hidden_before_uniting); - TC_RUN(shadow12_floors_only_in_their_rooms); -} diff --git a/applications/SprPoP/tests/host/t_timer.c b/applications/SprPoP/tests/host/t_timer.c deleted file mode 100644 index cd9e904..0000000 --- a/applications/SprPoP/tests/host/t_timer.c +++ /dev/null @@ -1,169 +0,0 @@ -/* pop_timer — логические тики, pause/unlimited, читы и QuickSave state. */ -#include -#include "tcheck.h" -#include "pop_timer.h" - -/* Минимальный memory-stream вместо EMM. pop_timer_qsave использует ровно - * u8/u16, поэтому этот stub одновременно проверяет его endian-контракт. */ -static uint8_t stream[3]; -static uint8_t stream_pos; - -void pop_qs_u8(pop_qs_io_t *io, uint8_t *value) -{ - if (io->reading) { - if (io->apply) *value = stream[stream_pos]; - } else { - stream[stream_pos] = *value; - } - ++stream_pos; -} - -void pop_qs_u16(pop_qs_io_t *io, uint16_t *value) -{ - uint8_t lo, hi; - if (io->reading) { - lo = stream[stream_pos++]; hi = stream[stream_pos++]; - if (io->apply) *value = (uint16_t)(lo | ((uint16_t)hi << 8)); - } else { - stream[stream_pos++] = (uint8_t)*value; - stream[stream_pos++] = (uint8_t)(*value >> 8); - } -} - -TC_TEST(timer_starts_and_only_runs_when_allowed) -{ - pop_timer_new_game(); - TC_EQ(pop_timer_minutes, POP_TIMER_START_MINUTES); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(0, 1, 4, 4)); /* Settings: unlimited */ - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(1, 0, 4, 4)); /* pause/HDD/cutscene */ - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - - pop_timer_minutes = 2; - pop_timer_ticks = 2; - TC_FALSE(pop_timer_tick(1, 1, 4, 4)); - TC_EQ(pop_timer_minutes, 2); - TC_EQ(pop_timer_ticks, 1); - TC_FALSE(pop_timer_tick(1, 1, 4, 4)); - TC_EQ(pop_timer_minutes, 1); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); -} - -TC_TEST(timer_expiry_is_one_shot) -{ - pop_timer_minutes = 1; - pop_timer_ticks = 1; - TC_TRUE(pop_timer_tick(1, 1, 4, 4)); - TC_EQ(pop_timer_minutes, 0); - TC_EQ(pop_timer_ticks, POP_TIMER_START_TICKS); - TC_FALSE(pop_timer_tick(1, 1, 4, 4)); - TC_FALSE(pop_timer_tick(0, 1, 4, 4)); -} - -TC_TEST(timer_cheats_match_sdlpop_rules) -{ - pop_timer_minutes = 5; - pop_timer_cheat_subtract(); - TC_EQ(pop_timer_minutes, 4); - pop_timer_minutes = 1; - pop_timer_cheat_subtract(); - TC_EQ(pop_timer_minutes, 1); /* minus не создаёт expiry */ - pop_timer_minutes = 0; - pop_timer_cheat_add(); - TC_EQ(pop_timer_minutes, 1); - pop_timer_minutes = 0xFF; - pop_timer_cheat_add(); - TC_EQ(pop_timer_minutes, 0xFF); /* не сворачиваемся в 0 */ -} - -TC_TEST(timer_qsave_restores_exact_state_and_rejects_bad_tick) -{ - pop_qs_io_t io; - - pop_timer_minutes = 42; - pop_timer_ticks = 103; - stream_pos = 0; - io.reading = io.apply = io.failed = 0; - pop_timer_qsave(&io); - TC_EQ(stream_pos, 3); - - pop_timer_minutes = 7; - pop_timer_ticks = 400; - stream_pos = 0; - io.reading = io.apply = 1; io.failed = 0; - pop_timer_qsave(&io); - TC_FALSE(io.failed); - TC_EQ(pop_timer_minutes, 42); - TC_EQ(pop_timer_ticks, 103); - - stream[0] = 9; stream[1] = 0; stream[2] = 0; /* tick 0 — impossible */ - pop_timer_minutes = 33; - pop_timer_ticks = 444; - stream_pos = 0; io.failed = 0; - pop_timer_qsave(&io); - TC_TRUE(io.failed); - TC_EQ(pop_timer_minutes, 33); - TC_EQ(pop_timer_ticks, 444); -} - -/* --- ХОД ЧАСОВ НЕ ЗАВИСИТ ОТ РЕЖИМА СКОРОСТИ ------------------------- * - * - * Тик стоит `base` кадров луча — столько, сколько их в кадре режима - * NORMAL. Быстрые режимы только УКОРАЧИВАЮТ кадр (spent < base), поэтому - * за одно и то же реальное время выходит одинаковое число тиков. - * Наблюдение пользователя, из которого выросла правка: «при FAST/FASTEST - * время начинает бежать быстрее». */ - -/* Сколько тиков насчитается за `frames` логических кадров темпа spent/base. */ -static uint16_t ticks_over(uint8_t frames, uint8_t spent, uint8_t base) -{ - uint16_t before; - uint8_t i; - pop_timer_new_game(); - before = pop_timer_ticks; - for (i = 0; i < frames; i++) pop_timer_tick(1, 1, spent, base); - return (uint16_t)(before - pop_timer_ticks); -} - -TC_TEST(timer_normal_ticks_every_frame) -{ - /* NORMAL вне боя: кадр равен эталону — тик на каждом кадре, как было до - * правки. Страховка, что NORMAL не изменился ни на тик. */ - TC_EQ(ticks_over(12, 4, 4), 12); -} - -TC_TEST(timer_normal_fight_ticks_every_frame) -{ - /* NORMAL в бою: кадр длиннее (5), но и эталон 5 — часы по-прежнему идут - * по кадру. В РЕАЛЬНОМ времени это медленнее, и ровно так же ведёт себя - * оригинал, поэтому трогать нечего. */ - TC_EQ(ticks_over(12, 5, 5), 12); -} - -TC_TEST(timer_fast_keeps_real_time) -{ - /* FAST вне боя: кадр 3 при эталоне 4. За 12 кадров (36 кадров луча) — - * 9 тиков, ровно столько же, сколько NORMAL насчитает за те же 36 кадров - * луча. До правки было бы 12: часы бежали на треть быстрее. */ - TC_EQ(ticks_over(12, 3, 4), 9); -} - -TC_TEST(timer_fastest_fight_keeps_real_time) -{ - /* FASTEST в бою — самый короткий кадр против самого длинного эталона: 3 против - * 5. За 20 кадров ждём 12 тиков. */ - TC_EQ(ticks_over(20, 3, 5), 12); -} - -void main(void) -{ - TC_RUN(timer_starts_and_only_runs_when_allowed); - TC_RUN(timer_expiry_is_one_shot); - TC_RUN(timer_cheats_match_sdlpop_rules); - TC_RUN(timer_qsave_restores_exact_state_and_rejects_bad_tick); - TC_RUN(timer_normal_ticks_every_frame); - TC_RUN(timer_normal_fight_ticks_every_frame); - TC_RUN(timer_fast_keeps_real_time); - TC_RUN(timer_fastest_fight_keeps_real_time); -} diff --git a/applications/SprPoP/tests/host/t_wall.c b/applications/SprPoP/tests/host/t_wall.c deleted file mode 100644 index 662e432..0000000 --- a/applications/SprPoP/tests/host/t_wall.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * t_wall.c — удар о стену В ВОЗДУХЕ (BUG-JUMPWALL-1). - * - * Наблюдение с приёмки уровня 3 (комната 14): Кид прыгает, не долетает и - * вместо удара о кладку с последующим сползанием ВДОЛЬ неё пролетает - * сквозь стену «по свободной траектории». Класс отказа шире одной - * комнаты, поэтому проверяем его отдельным набором, а не сценарием в - * t_phys: там характеризация (трасса == эталон), здесь — утверждение о - * поведении («сквозь кладку нельзя»), которое не должно молча - * переснашиваться вместе с эталонами. - * - * Оригинал: bumped_fall (seg004:04E4) на ударе гасит `Char.fall_x`, то есть - * горизонтальный снос обнуляется и дальше Кид падает вертикально. Кто - * решает, что удар был, — check_collisions (seg004:0004) + check_bumped. - * - * Проверка — свипом по стартовому X, а не одним прыжком: исход зависит от - * фазы, и «с одной X работает» ничего не доказывает (ровно так и вышло с - * первым сценарием — из центра плиты стена держит). - */ -#include "tcheck.h" -#include "scene.h" -#include "stubs.h" -#include "pop_kid.h" -#include "pop_map.h" - -#define E 0 -#define F 1 -#define W 20 - -/* Комната 14 уровня 3 с одной правкой: шахте колонок 6–7 подложено дно - * (ряд 2), потому что соседних комнат у сцены нет, а в игре Кид улетает - * вниз в комнату 13. Остальное — как в данных: площадка (0,8), провал - * (0,6)/(0,7), СТЕНА в колонке 5 рядов 1–2, площадка (0,5) за ней. */ -static const uint8_t room14[30] = { - F, F, F, E, E, F, E, E, F, E, - W, W, W, E, E, W, E, E, W, E, - W, W, W, F, F, W, F, F, W, W, -}; - -/* Плита (0,8) по X: колонка 8 — это [177, 191), плюс шов с пустой (0,9). */ -#define X_LO 177 -#define X_HI 196 - -/* Прыгнуть влево со стартовой X. Возврат — код исхода: - * 'L' — долетел до площадки (0,5) и стоит на ней (ряд 0) — законно; - * '.' — не долетел и упал на дно шахты колонок 6–7 — тоже законно; - * цифра — колонка, в которой Кид оказался ЛЕВЕЕ стены, то есть прошёл - * сквозь кладку колонки 5 (это и есть баг). */ -static char jump_left_from(uint8_t x) -{ - sc_room(room14, 14); - sc_kid_at_x(8, 0, x, -1 /* лицом влево */); - sc_trace_clear(); - /* Клавиши держим только на сам прыжок: если удерживать их всю сцену, - * Кид, ДОЛЕТЕВШИЙ до (0,5), тут же прыгает с неё второй раз — и исход - * говорит уже не о стене, а о втором прыжке. */ - sc_run(SC_L | SC_U, 6); - sc_run(0, 34); - if (!sc_len) return '?'; - { - int8_t col = sc_trace[sc_len - 1].col; - int8_t row = sc_trace[sc_len - 1].row; - if (row == 0) return 'L'; /* остался на верхнем ряду */ - if (col >= 6) return '.'; /* сполз вдоль стены в шахту */ - return (char)('0' + (col < 0 ? 0 : col)); - } -} - -static void put(char c) -{ - if (tc_result.logn < TC_LOGSZ) tc_result.log[tc_result.logn++] = (uint8_t)c; -} -static void puts_(const char *s) { while (*s) put(*s++); } - -TC_TEST(wall_stops_undershot_jump) -{ - uint8_t x, bad = 0; - /* Карта исходов по всей ширине плиты: 'L' — долетел до (0,5), '.' — - * сполз вдоль стены в шахту, цифра — просочился сквозь кладку. */ - puts_("x=177..196: "); - for (x = X_LO; x <= X_HI; x++) { - char r = jump_left_from(x); - put(r); - if (r != 'L' && r != '.') bad++; - } - put('\n'); - TC_EQ(bad, 0); -} - -/* --- ГДЕ КОНЧАЕТСЯ СТЕНА ПО X ---------------------------------------- * - * - * Колонка 5 — кладка (ряды 1-2). Тайл шириной 14, колонка c занимает - * [58 + 14*c, 58 + 14*(c+1)). Для колонки 5 это [128, 142). Персонаж - * НИКОГДА не должен оказаться внутри этого отрезка ниже верхнего ряда: - * там сплошная кладка, и «падение частично в стене» — как раз оно. - * - * Проверка отдельная от той, что выше: та смотрит КОЛОНКУ в конце сцены, - * а эта — X на КАЖДОМ кадре падения. Персонаж может кончить падение в - * законной колонке, успев по дороге пройти сквозь кладку. */ -#define WALL_X_LO 128 -#define WALL_X_HI 142 - -/* Сколько кадров трассы имеют X внутри кладки, будучи ниже верхнего ряда. */ -static uint8_t frames_inside_wall(uint8_t x) -{ - uint8_t i, n = 0; - sc_room(room14, 14); - sc_kid_at_x(8, 0, x, -1); - sc_trace_clear(); - sc_run(SC_L | SC_U, 6); - sc_run(0, 34); - for (i = 0; i < sc_len; i++) { - if (sc_trace[i].row == 0) continue; /* верхний ряд — не кладка */ - if (sc_trace[i].x >= WALL_X_LO && sc_trace[i].x < WALL_X_HI) n++; - } - return n; -} - -TC_TEST(wall_x_never_inside_masonry) -{ - uint8_t x, bad = 0; - puts_("inside x=177..196: "); - for (x = X_LO; x <= X_HI; x++) { - uint8_t n = frames_inside_wall(x); - put((char)(n ? ('0' + (n > 9 ? 9 : n)) : '.')); - if (n) bad++; - } - put('\n'); - TC_EQ(bad, 0); -} - -/* Симметричный случай: прыжок ВПРАВО через провал колонок 3-4 к площадке - * (0,5). Стартовая площадка — колонки 0-2 верхнего ряда; под провалом - * дно (ряд 2), по бокам кладка. Недолёт обязан кончиться на дне, а не - * внутри кладки: выталкивание из стены работает в обе стороны. */ -static char jump_right_from(uint8_t x) -{ - sc_room(room14, 14); - sc_kid_at_x(2, 0, x, 1 /* лицом вправо */); - sc_trace_clear(); - sc_run(SC_R | SC_U, 6); - sc_run(0, 34); - if (!sc_len) return '?'; - { - int8_t col = sc_trace[sc_len - 1].col; - int8_t row = sc_trace[sc_len - 1].row; - if (row == 0) return 'R'; /* остался на верхнем ряду */ - /* Ниже верхнего ряда законны ОБА провала — слева от кладки - * (колонки 3-4, недолёт) и справа (6-7, перелёт через площадку). - * Незаконна только сама кладка колонки 5. */ - if (col != 5) return '.'; - /* Вис на уступе площадки (0,5) — законное состояние, и колонка - * при нём как раз 5. Отличаем по действию персонажа. */ - { - uint8_t act = sc_trace[sc_len - 1].action; - if (act == 2 || act == 6) return 'h'; /* hang_climb / hang_straight */ - } - /* Осталось одно: персонаж НИЖЕ верхнего ряда, в колонке кладки и - * не висит — то есть находится ВНУТРИ стены. Именно так выглядит - * «падение частично в стене» (docs/sdlpop_audit.md, находка 24). */ - return '5'; - } -} - -/* ФИКС ПАДЕНИЯ СКВОЗЬ СТЕНУ ВЗЯТ — ЖДЁМ НОЛЬ. - * - * В ванили прыжок вправо через провал давал ДВА случая из четырнадцати, - * где Кид оказывается в колонке кладки, будучи в воздухе, — «падение - * частично в стене». Это баг оригинального PoP, для которого SDLPoP - * держит опциональное исправление (fix_glide_through_wall, seg005 в - * do_fall). - * - * 2026-08-31 исправление ПОРТИРОВАНО в текущий билд - * (glide_through_wall_guard в pop_map.c), и оба случая исчезли. Поэтому - * ожидание теперь НОЛЬ. - * - * Если когда-нибудь появится режим VANILLA без этого фикса, ожидание - * станет зависеть от режима: 0 в ENHANCED и 2 в ванильном - * (docs/vanilla_vs_bugfixed.md). Число 2 сохранено в имени константы - * именно поэтому — оно измерено, а не выдумано. */ -#define WALL_VANILLA_GLIDE_CASES 2 /* сколько их было ДО фикса */ -#define WALL_EXPECTED_GLIDE_CASES 0 /* сколько ожидаем СЕЙЧАС */ - -TC_TEST(wall_stops_jump_from_left_side) -{ - uint8_t x, bad = 0; - /* Плита колонок 3-4: [100, 128). */ - /* Плита колонок 0-2: колонка 2 — это [86, 100). */ - puts_("right x=86..99: "); - for (x = 86; x <= 99; x++) { - char r = jump_right_from(x); - put(r); - if (r != 'R' && r != '.' && r != 'h') bad++; - } - put('\n'); - TC_EQ(bad, WALL_EXPECTED_GLIDE_CASES); -} - -int main(void) -{ - sc_init(); - TC_RUN(wall_stops_undershot_jump); - TC_RUN(wall_x_never_inside_masonry); - TC_RUN(wall_stops_jump_from_left_side); - return 0; -} diff --git a/applications/SprPoP/tools/fetch_orig.py b/applications/SprPoP/tools/fetch_orig.py deleted file mode 100755 index 2f7617f..0000000 --- a/applications/SprPoP/tools/fetch_orig.py +++ /dev/null @@ -1,411 +0,0 @@ -#!/usr/bin/env python3 -"""fetch_orig.py — забирает ВНЕШНИЕ исходные данные в assets/orig/. - -Репозиторий SprPoP не хранит ни байта чужих данных: `assets/orig/` целиком -в .gitignore. Хранится вместо них ЗНАНИЕ, откуда эти данные берутся, — -таблица SOURCES ниже, и этот скрипт, который по ней всё выкачивает. - - python3 tools/fetch_orig.py # SDLPoP + музыка (чего нет) - python3 tools/fetch_orig.py --check # что уже на месте, ничего не качать - python3 tools/fetch_orig.py --list # печать таблицы источников - python3 tools/fetch_orig.py sdlpop --force --ref v1.23 - -Что откуда: - - SDLPoP (GPLv3, github.com/NagyD/SDLPoP) — распакованные ресурсы DOS-версии - (`data/`: спрайты, палитры, LEVELS/res20xx.bin, DIGISND*.DAT) и исходники - (`src/`), которые нам одновременно ЭТАЛОН МЕХАНИКИ. Тянем архивом ветки - или тега, а не git-клоном: в assets/orig/ не нужен вложенный .git, а - зафиксировать версию всё равно надо — пишем её в SDLPoP/.fetch.json. - - PoP1_DOS_music (popot.org, 43 МБ) — записи саундтрека DOS-версии в четырёх - наборах (flac/mp3/ogg/ogg_MT-32), из них `pop_pack_music.py` делает треки - для CBL. Ссылку берём ИЗ САМОГО SDLPoP (ReadMe.amigaos4, секция «AUDIO IS - SLOW/AWFULL»), чтобы она не протухла молча вместе с нашей копией; если - секцию не нашли — падаем на константу MUSIC_URL_FALLBACK. - - MSDOS/ — оригинальная поставка PoP 1.0 для MS-DOS. НЕ качается: это - копирайтный дистрибутив, качать его неоткуда и незачем. Он НЕОБЯЗАТЕЛЕН — - всё, что нужно сборке (уровни, звуки), лежит в SDLPoP. Если папка у вас - есть, её звуковые .dat можно включить явно: `make SND_SRC=msdos ...` - (см. assets/orig/README.md). -""" -import argparse -import io -import json -import os -import re -import shutil -import sys -import tarfile -import time -import urllib.error -import urllib.request -import zipfile -from pathlib import Path - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -# --- источники ------------------------------------------------------------- -SDLPOP_REPO = "https://github.com/NagyD/SDLPoP" -SDLPOP_REF = "master" # ветка по умолчанию = «последняя версия» -SDLPOP_API = "https://api.github.com/repos/NagyD/SDLPoP" - -# Секция «AUDIO IS SLOW/AWFULL» в этом файле SDLPoP держит ссылку на записи. -MUSIC_README = "ReadMe.amigaos4" -MUSIC_URL_FALLBACK = \ - "https://www.popot.org/get_the_games/various/PoP1_DOS_music.zip" - -UA = {"User-Agent": "SprPoP-fetch-orig/1"} -CACHE = P.ORIG / ".cache" # скачанные архивы; переживает make clean - -SOURCES = [ - ("sdlpop", P.SDLPOP, SDLPOP_REPO, - "ресурсы DOS-версии (data/) + исходники-эталон (src/)"), - ("music", P.MUSIC_ROOT, MUSIC_URL_FALLBACK, - "записи саундтрека DOS-версии, 4 набора (flac/mp3/ogg/ogg_MT-32)"), - ("MSDOS (необязательно, вручную)", P.MSDOS, "дистрибутив игры", - "оригинальные .dat; нужен только для SND_SRC=msdos"), -] - - -# --- мелочи ---------------------------------------------------------------- -def say(msg): - print("fetch: " + msg, flush=True) - - -def fetch_url(url, dest, expect_type=None): - """Скачать url в dest (через .part), с индикатором на одной строке. - - Если dest уже есть и его размер совпал с Content-Length — не качаем. - """ - req = urllib.request.Request(url, headers=UA) - with urllib.request.urlopen(req, timeout=60) as r: - total = int(r.headers.get("Content-Length") or 0) - ctype = r.headers.get("Content-Type", "") - if expect_type and expect_type not in ctype: - say(f"ПРЕДУПРЕЖДЕНИЕ: {url} отдал Content-Type {ctype!r}") - if dest.exists() and total and dest.stat().st_size == total: - say(f"уже скачано: {dest.name} ({total} Б)") - return dest - dest.parent.mkdir(parents=True, exist_ok=True) - tmp = dest.with_suffix(dest.suffix + ".part") - # Проценты — только в терминал: в перенаправленном выводе (лог сборки, - # CI) \r не схлопывается, и одна закачка даёт полторы сотни строк. - tty = sys.stdout.isatty() - got, t0 = 0, time.time() - with open(tmp, "wb") as f: - while True: - chunk = r.read(256 * 1024) - if not chunk: - break - f.write(chunk) - got += len(chunk) - if total and tty: - print("\r %s: %3d%% (%d/%d КБ)" - % (dest.name, got * 100 // total, - got >> 10, total >> 10), end="", flush=True) - print("%s %s: готово, %d КБ за %.1f с%s" - % ("\r" if tty else "", dest.name, got >> 10, - time.time() - t0, " " * 20 if tty else "")) - tmp.replace(dest) - return dest - - -def safe_members(names, root): - """Проверка архива на выход за пределы каталога распаковки.""" - for n in names: - p = Path(n) - if p.is_absolute() or ".." in p.parts: - sys.exit(f"архив содержит небезопасный путь {n!r} — распаковка отменена") - return root - - -def backup_dir(dest): - """Сложить текущий каталог в .cache архивом — перед заменой.""" - CACHE.mkdir(parents=True, exist_ok=True) - tar = CACHE / ("%s-backup-%s.tar.gz" % (dest.name, - time.strftime("%Y%m%d-%H%M%S"))) - with tarfile.open(tar, "w:gz") as t: - t.add(dest, arcname=dest.name) - say(f"старая копия сохранена: {tar} ({tar.stat().st_size >> 10} КБ)") - return tar - - -def swap_dir(new, dest): - """Поставить свежераспакованный каталог на место старого.""" - dest.parent.mkdir(parents=True, exist_ok=True) - old = dest.with_name(dest.name + ".old") - if old.exists(): - shutil.rmtree(old) - if dest.exists(): - dest.rename(old) - new.rename(dest) - if old.exists(): - shutil.rmtree(old) - - -# --- SDLPoP ---------------------------------------------------------------- -def sdlpop_head(ref): - """(sha, дата) верхушки ref на GitHub; (None, None) если API недоступен.""" - try: - req = urllib.request.Request(f"{SDLPOP_API}/commits/{ref}", headers=UA) - with urllib.request.urlopen(req, timeout=30) as r: - d = json.load(r) - return d["sha"], d["commit"]["committer"]["date"] - except (urllib.error.URLError, KeyError, ValueError) as e: - # Лимит запросов GitHub или отсутствие сети: не повод падать — - # просто не сможем сказать «у нас уже последняя». - say(f"GitHub API недоступен ({e}); версию не проверяю") - return None, None - - -def stamp_path(dest): - return dest / ".fetch.json" - - -def manifest(root): - """{относительный путь: sha256} по всему дереву, кроме служебного.""" - import hashlib - out = {} - for f in sorted(root.rglob("*")): - if not f.is_file() or f.name == ".fetch.json": - continue - rel = str(f.relative_to(root)) - h = hashlib.sha256() - with open(f, "rb") as fh: - for chunk in iter(lambda: fh.read(1 << 16), b""): - h.update(chunk) - out[rel] = h.hexdigest() - return out - - -def local_edits(dest): - """Файлы, изменённые ПОСЛЕ распаковки: (изменённые, добавленные). - - Считается по манифесту из .fetch.json. Нет манифеста — вернуть None: - происхождение копии неизвестно, и трогать её нельзя. - """ - base = read_stamp(dest).get("files") - if not base: - return None - now = manifest(dest) - changed = sorted(k for k, v in now.items() if k in base and base[k] != v) - added = sorted(k for k in now if k not in base) - return changed, added - - -def read_stamp(dest): - try: - return json.loads(stamp_path(dest).read_text()) - except (OSError, ValueError): - return {} - - -def fetch_sdlpop(ref=SDLPOP_REF, force=False): - dest = P.SDLPOP - sha, date = sdlpop_head(ref) - have = read_stamp(dest) - if dest.exists() and (dest / "data").is_dir(): - if sha and have.get("sha") == sha and not force: - say(f"SDLPoP уже последний: {ref} {sha[:8]} от {date[:10]}") - return - # ЗАМЕНА КАТАЛОГА — ТОЛЬКО ОСОЗНАННО. Наша копия SDLPoP не просто - # справочник: в неё внесены отладочные врезки (POP_TRACE — покадровая - # трасса Кида для сверки с портом, дампы спрайтов и палитры), и - # перекачка их сотрёт. Поэтому существующее дерево не трогаем без - # --force, а что именно потеряется — говорим заранее. - edits = local_edits(dest) - if edits is None: - note = ("происхождение копии неизвестно (нет манифеста .fetch.json) " - "— возможно, в ней есть ваши правки") - else: - changed, added = edits - if changed or added: - note = "локально изменено: %s%s" % ( - ", ".join(changed[:8]) + ("…" if len(changed) > 8 else ""), - "; добавлено %d файлов" % len(added) if added else "") - else: - note = "" - if not force: - say("SDLPoP уже на месте" + (f"; {note}" if note else "")) - say(" перекачать поверх: make FETCH_ARGS=--force fetch-sdlpop") - say(" (правки будут сохранены в бэкап, см. ниже)") - return - if note: - say("ВНИМАНИЕ: " + note) - backup_dir(dest) - # Тег и ветка лежат по разным путям codeload; пробуем оба. - urls = [f"https://codeload.github.com/NagyD/SDLPoP/tar.gz/refs/heads/{ref}", - f"https://codeload.github.com/NagyD/SDLPoP/tar.gz/refs/tags/{ref}"] - CACHE.mkdir(parents=True, exist_ok=True) - tar = CACHE / f"SDLPoP-{ref.replace('/', '_')}.tar.gz" - last = None - for u in urls: - try: - say(f"качаю SDLPoP {ref} <- {u}") - fetch_url(u, tar) - last = None - break - except urllib.error.HTTPError as e: - last = e - if last is not None: - sys.exit(f"не удалось скачать SDLPoP {ref!r}: {last}") - - tmp = P.ORIG / ".SDLPoP.new" - if tmp.exists(): - shutil.rmtree(tmp) - tmp.mkdir(parents=True) - with tarfile.open(tar, "r:gz") as t: - names = t.getnames() - safe_members(names, tmp) - # В архиве GitHub всё лежит в одном каталоге SDLPoP-/ — снимаем его. - top = os.path.commonpath([n for n in names if n]) if names else "" - t.extractall(tmp) - src = tmp / top if top else tmp - inner = P.ORIG / ".SDLPoP.unpacked" - if inner.exists(): - shutil.rmtree(inner) - src.rename(inner) - shutil.rmtree(tmp, ignore_errors=True) - - if not (inner / "data").is_dir() or not (inner / "src").is_dir(): - shutil.rmtree(inner) - sys.exit("в архиве SDLPoP нет data/ или src/ — раскладка репозитория " - "изменилась, чините fetch_orig.py") - # Манифест распакованного дерева: по нему следующий fetch отличит наши - # правки от нетронутых файлов и не сотрёт их молча. - stamp_path(inner).write_text(json.dumps( - {"repo": SDLPOP_REPO, "ref": ref, "sha": sha, "date": date, - "fetched": time.strftime("%Y-%m-%d %H:%M:%S"), - "files": manifest(inner)}, - ensure_ascii=False, indent=2) + "\n") - swap_dir(inner, dest) - say(f"SDLPoP: {ref} {(sha or '?')[:8]} -> {dest}") - - -# --- музыка ---------------------------------------------------------------- -def music_url(): - """Ссылка на архив записей: из ReadMe SDLPoP, иначе константа.""" - rm = P.SDLPOP / MUSIC_README - if rm.is_file(): - text = rm.read_text(errors="replace") - m = re.search(r"https?://\S*[Mm]usic\S*\.zip", text) - if m: - url = m.group(0).rstrip(".,)") - say(f"ссылка на музыку из SDLPoP/{MUSIC_README}: {url}") - return url - say(f"в SDLPoP/{MUSIC_README} ссылки не нашлось — беру запасную") - else: - say(f"нет SDLPoP/{MUSIC_README} (сначала `fetch_orig.py sdlpop`) — " - "беру запасную ссылку") - return MUSIC_URL_FALLBACK - - -def fetch_music(force=False): - dest = P.MUSIC_ROOT - if dest.is_dir() and not force: - have = [d for d, _ in P.MUSIC_FORMATS.values() if (dest / d).is_dir()] - if len(have) == len(P.MUSIC_FORMATS): - say(f"музыка уже на месте: {dest} ({len(have)} набора)") - return - say(f"музыка неполная (наборы: {', '.join(have) or 'нет'}) — перекачиваю") - - url = music_url() - CACHE.mkdir(parents=True, exist_ok=True) - zpath = CACHE / os.path.basename(url) - fetch_url(url, zpath, expect_type="zip") - - with zipfile.ZipFile(zpath) as z: - names = z.namelist() - safe_members(names, P.ORIG) - top = {Path(n).parts[0] for n in names if n} - if top != {dest.name}: - sys.exit(f"в архиве музыки ожидался один каталог {dest.name}/, " - f"а там {sorted(top)} — чините fetch_orig.py") - tmp = P.ORIG / ".music.new" - if tmp.exists(): - shutil.rmtree(tmp) - say(f"распаковываю {len(names)} файлов") - z.extractall(tmp) - swap_dir(tmp / dest.name, dest) - shutil.rmtree(tmp, ignore_errors=True) - got = [d for d, _ in P.MUSIC_FORMATS.values() if (dest / d).is_dir()] - say(f"музыка: наборы {', '.join(sorted(got))} -> {dest}") - - -# --- отчёт ----------------------------------------------------------------- -def do_list(): - print("Внешние источники SprPoP (assets/orig/ в репозиторий не идёт):\n") - for name, path, where, what in SOURCES: - print(f" {name}") - print(f" куда: {path}") - print(f" откуда: {where}") - print(f" что: {what}\n") - - -def do_check(): - ok = True - st = read_stamp(P.SDLPOP) - if (P.SDLPOP / "data").is_dir() and (P.SDLPOP / "src").is_dir(): - v = f"{st.get('ref', '?')} {(st.get('sha') or '?')[:8]}" - print(f" SDLPoP есть ({v}, {st.get('fetched', 'версия неизвестна')})") - else: - print(" SDLPoP НЕТ -> make fetch-sdlpop") - ok = False - have = [d for d, _ in P.MUSIC_FORMATS.values() if (P.MUSIC_ROOT / d).is_dir()] - if len(have) == len(P.MUSIC_FORMATS): - print(f" музыка есть (наборы: {', '.join(sorted(have))})") - elif have: - print(f" музыка ЧАСТЬ (только {', '.join(sorted(have))}) -> make fetch-music") - ok = False - else: - print(" музыка НЕТ -> make fetch-music") - ok = False - if P.MSDOS.is_dir(): - print(" MSDOS есть (необязательно; звуки оттуда — make SND_SRC=msdos)") - else: - print(" MSDOS нет (необязательно: звуки и уровни берутся из SDLPoP)") - return 0 if ok else 1 - - -def main(): - ap = argparse.ArgumentParser( - description="скачать внешние исходные данные SprPoP в assets/orig/") - ap.add_argument("what", nargs="*", default=["all"], - help="что качать: all (умолчание), sdlpop, music") - ap.add_argument("--force", action="store_true", - help="качать заново, даже если данные на месте") - ap.add_argument("--ref", default=SDLPOP_REF, - help=f"ветка или тег SDLPoP (по умолчанию {SDLPOP_REF})") - ap.add_argument("--check", action="store_true", - help="только показать, что уже на месте") - ap.add_argument("--list", action="store_true", - help="только показать таблицу источников") - a = ap.parse_args() - - if a.list: - do_list() - return 0 - if a.check: - return do_check() - - what = set(a.what) or {"all"} - bad = what - {"all", "sdlpop", "music"} - if bad: - ap.error("не знаю, что такое %s; есть: all, sdlpop, music" - % ", ".join(sorted(bad))) - if "all" in what: - what = {"sdlpop", "music"} - P.ORIG.mkdir(parents=True, exist_ok=True) - if "sdlpop" in what: - fetch_sdlpop(a.ref, a.force) - if "music" in what: - fetch_music(a.force) - say("готово; дальше — make resources") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/applications/SprPoP/tools/paths.py b/applications/SprPoP/tools/paths.py deleted file mode 100644 index 7dee7b6..0000000 --- a/applications/SprPoP/tools/paths.py +++ /dev/null @@ -1,150 +0,0 @@ -"""paths.py — единственное место, где инструменты SprPoP знают раскладку -каталогов приложения. Все упаковщики берут пути отсюда, поэтому папку -SprPoP можно перенести куда угодно: важно лишь, что рядом с tools/ лежат -assets/, gen/ и build/. - -Раскладка: - - assets/orig/ ОРИГИНАЛЬНЫЕ данные (SDLPoP, записи музыки и, - необязательно, MSDOS). В репозиторий не идут — - копирайт; выкачивает их tools/fetch_orig.py - (`make fetch`), см. assets/orig/README.md. - build/atl// промежуточный выхлоп упаковщиков: отдельные атласы, - из которых потом склеиваются архивы. Пересоздаётся, - в репозиторий не идёт. - assets/packed/ ровно то, что ложится на диск игры, уже в раскладке - каталогов диска (BG/, KID/, ...). В репозитории — - иначе из чистого клона без assets/orig/ ничего не - собрать. - gen/ генерируемые C-заголовки. Тоже в репозитории и по - той же причине: это такой же производный артефакт, - как .arc, и без него не скомпилировать src/. -""" - -from pathlib import Path - -TOOLS = Path(__file__).resolve().parent -APP = TOOLS.parent - -# --- вход: оригинальные данные ------------------------------------------- -ORIG = APP / "assets" / "orig" -SDLPOP = ORIG / "SDLPoP" -SDLPOP_DATA = SDLPOP / "data" -SDLPOP_SRC = SDLPOP / "src" -MSDOS = ORIG / "MSDOS" - -MUSIC_ROOT = ORIG / "PoP1_DOS_music" -# Записи DOS-версии лежат в четырёх вариантах. Имена треков во всех наборах -# одинаковые, различаются каталог и расширение; ogg_MT-32 — та же музыка в -# исполнении Roland MT-32, а не другой кодек. Ключ = имя формата в Makefile. -MUSIC_FORMATS = { - "flac": ("flac", ".flac"), - "mp3": ("mp3", ".mp3"), - "ogg": ("ogg", ".ogg"), - "mt32": ("ogg_MT-32", ".ogg"), -} - - -def music_src(fmt="flac"): - """(каталог, расширение) исходников музыки для формата.""" - if fmt not in MUSIC_FORMATS: - raise SystemExit( - "неизвестный формат музыки %r; есть: %s" - % (fmt, ", ".join(sorted(MUSIC_FORMATS)))) - sub, ext = MUSIC_FORMATS[fmt] - return MUSIC_ROOT / sub, ext - -# --- источники звуковых эффектов ------------------------------------------ -# Контейнеры digisnd1..3 есть в ДВУХ поставках, и они не одинаковы: в SDLPoP -# лежит версия из репозитория (её и качает fetch_orig.py), в MSDOS/ — из -# оригинального дистрибутива 1.0, если пользователь его себе положил. -# ПО УМОЛЧАНИЮ БЕРЁМ SDLPoP: сборка обязана работать без MSDOS вообще. -# Ключ = значение SND_SRC в Makefile; регистр имён в поставках разный. -SND_SOURCES = { - "sdlpop": (SDLPOP_DATA, "DIGISND%d.DAT"), - "msdos": (MSDOS, "digisnd%d.dat"), -} - - -# Ноты PC-СПИКЕРА и МЕЛОДИИ — два других набора того же движка. Нужны нам -# по разным причинам: мелодии мы играем отдельно (MUS/), а из нот спикера -# добираем те номера, которых нет НИ в оцифровке, НИ среди мелодий — сейчас -# это ровно звук 38 (мигание надписи «Press Button»). В поставке SDLPoP -# наборы лежат распакованными каталогами res1XXXX.bin, в дистрибутиве DOS — -# контейнерами .DAT; поддерживаем оба вида. -SND_MIDI = { - "sdlpop": (SDLPOP_DATA, "MIDISND%d.DAT", 2), - "msdos": (MSDOS, "midisnd%d.dat", 2), -} -SND_SPEAKER = { - "sdlpop": (SDLPOP_DATA, "IBM_SND%d", 2), - "msdos": (MSDOS, "ibm_snd%d.dat", 2), -} - - -def snd_extra(kind, name="sdlpop"): - """(каталог, шаблон, сколько контейнеров) для набора нот или мелодий. - - kind — "midi" или "speaker". Набора может не быть вовсе (у пользователя - нет MSDOS, поставка неполная) — это НЕ ошибка: вызывающий просто - пропускает добор. Возвращает None, если источник неизвестен. - """ - table = {"midi": SND_MIDI, "speaker": SND_SPEAKER}.get(kind) - if table is None: - raise SystemExit("неизвестный набор %r; есть: midi, speaker" % kind) - return table.get(name) - - -def snd_src(name="sdlpop"): - """(каталог, шаблон имени) контейнеров оцифровки для источника.""" - if name not in SND_SOURCES: - raise SystemExit( - "неизвестный источник звука %r; есть: %s" - % (name, ", ".join(sorted(SND_SOURCES)))) - return SND_SOURCES[name] - - -def find_ci(directory, name): - """Путь к файлу без оглядки на регистр (FAT-имена приезжают по-разному). - - Возвращает None, если файла нет. Точное совпадение проверяется первым, - чтобы на case-insensitive ФС не читать каталог зря. - """ - p = directory / name - if p.exists(): - return p - if not directory.is_dir(): - return None - low = name.lower() - for e in directory.iterdir(): - if e.name.lower() == low: - return e - return None - -# --- выход ---------------------------------------------------------------- -ATL = APP / "build" / "atl" # промежуточные атласы, по набору в папке -PACKED = APP / "assets" / "packed" # раскладка диска игры -GEN = APP / "gen" # генерируемые заголовки -DIST = APP / "dist" # ручное содержимое дистрибутива (README и - # производные наборы, напр. тихий звук) - - -def atl(name): - """Каталог промежуточного выхлопа набора; создаётся при обращении.""" - p = ATL / name - p.mkdir(parents=True, exist_ok=True) - return p - - -def packed(name): - """Каталог диска игры (BG, KID, ...); создаётся при обращении.""" - p = PACKED / name - p.mkdir(parents=True, exist_ok=True) - return p - - -def dist(name): - """Каталог внутри dist/ в раскладке диска; создаётся при обращении.""" - p = DIST / name - p.mkdir(parents=True, exist_ok=True) - return p diff --git a/applications/SprPoP/tools/pop_extract_font.py b/applications/SprPoP/tools/pop_extract_font.py deleted file mode 100644 index 6f394ba..0000000 --- a/applications/SprPoP/tools/pop_extract_font.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python3 -"""pop_extract_font.py — SDLPoP-шрифты в один Sprinter .atl-ресурс. - -Источник истины — оригинальные встроенные шрифты SDLPoP: - * hc_small_font_data[] из menu.c — пункты меню; - * hc_font_data[] из seg009.c — крупные сообщения/заголовки. - -В исходнике глиф — IMAGE_DATA(height, width, flags) и 1-битные строки. -Здесь его силуэт переводится в getimage (0xFF = прозрачность) и пакуется в -FONT\\FONT.ATL. Это именно шрифтовой атлас, а не заранее нарисованные -строки: номер ленты = код ASCII, поэтому runtime сохраняет произвольный -текст и пропорциональную ширину оригинала. - -Хвост страницы [0x3C00..0x3FFF] намеренно оставлен свободным: pop_menu.c -кладёт туда снимок игровой палитры на время паузы. Тогда 1 КБ не занимает -дефицитную W2. -""" -import re -from pathlib import Path - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -ROOT = Path(__file__).resolve().parent.parent -SRC_SMALL = P.SDLPOP_SRC / "menu.c" -SRC_BIG = P.SDLPOP_SRC / "seg009.c" -OUT_DIR = P.atl("font") -OUT_ATL = OUT_DIR / "font.atl" -OUT_H = P.GEN / "pop_font.h" - -FIRST, LAST = 32, 126 -FONT_COLOR = 0x3F -# ВТОРОЙ ЦВЕТ КРУПНОГО ШРИФТА. У SDLPoP шрифт — маска, и цвет задаётся -# параметром рисования (show_hof_text рисует текст дважды: тень цветом 0 со -# сдвигом (1,1) и сам текст цветом 0xB7). У нас цвет запечён в пиксели -# глифа, поэтому второй цвет — это второй набор глифов. Он нужен таблице -# рекордов: чёрная тень строк и тёмное имя на золотой полосе ввода. -# Набор крупный, потому что draw_text() рисует hc_font (seg009:1594). -FONT_DARK_COLOR = 0x3E -# Каталог SPA1 хранит число картинок одним байтом, а три полных набора по -# 95 глифов — это 285. Тёмному набору полный ASCII и не нужен: им пишется -# только таблица рекордов (имена A..Z, время вида 59:43 и курсор ввода -# '_'), поэтому он обрезан по '_'. 190 + 64 = 254 картинки — потолок. -DARK_FIRST, DARK_LAST = 32, 95 -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -SNAPSHOT_OFF = 0x3C00 -PAGE_SIZE = 16384 - - -def extract_array(path: Path, name: str) -> list[int]: - text = path.read_text() - match = re.search(rf"byte {name}\[\] = \{{(.*?)\n\}};", text, re.S) - assert match, f"{name} not found in {path}" - body = re.sub(r"//[^\n]*", "", match.group(1)) - body = re.sub(r"/\*.*?\*/", "", body, flags=re.S) - - def word(mm: re.Match) -> str: - value = int(mm.group(1), 0) - return f"{value & 0xFF}, {(value >> 8) & 0xFF}" - - def bin4(mm: re.Match) -> str: - b7, b6, b5, b4 = (int(v, 0) if v != "_" else 0 for v in mm.groups()) - return str((b4 << 4) | (b5 << 5) | (b6 << 6) | (b7 << 7)) - - def bin8(mm: re.Match) -> str: - bits = [int(v, 0) if v != "_" else 0 for v in mm.groups()] - return str(sum(bit << (7 - i) for i, bit in enumerate(bits))) - - def image_data(mm: re.Match) -> str: - h, w, flags = (int(v, 0) for v in mm.groups()) - return (f"{h & 0xFF}, {(h >> 8) & 0xFF}, " - f"{w & 0xFF}, {(w >> 8) & 0xFF}, " - f"{flags & 0xFF}, {(flags >> 8) & 0xFF}") - - body = re.sub(r"\bWORD\s*\(\s*(\w+)\s*\)", word, body) - body = re.sub(r"\bIMAGE_DATA\s*\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\)", - image_data, body) - body = re.sub(r"\bBINARY_4\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin4, body) - body = re.sub(r"\bBINARY_8\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin8, body) - body = re.sub(r"\b_\b", "0", body) - # Hex обязан идти первым: иначе regexp съедает в `0x20` только `0`. - return [int(v, 0) for v in re.findall(r"0[xX][0-9a-fA-F]+|\d+", body)] - - -def parse_glyphs(vals: list[int]) -> tuple[dict, list[dict]]: - first, last = vals[0], vals[1] - font = { - "first": first, - "last": last, - "ascent": vals[2] | (vals[3] << 8), - "below": vals[4] | (vals[5] << 8), - "space_lines": vals[6] | (vals[7] << 8), - "space_chars": vals[8] | (vals[9] << 8), - } - pos = 10 + (last - first + 1) * 2 # offsets у SDLPoP вычисляются в runtime - glyphs = [] - while pos < len(vals): - h = vals[pos] | (vals[pos + 1] << 8) - w = vals[pos + 2] | (vals[pos + 3] << 8) - pos += 6 # height, width, flags - stride = (w + 7) // 8 - rows = [] - for _ in range(h): - rows.append(vals[pos:pos + stride]) - pos += stride - glyphs.append({"h": h, "w": w, "rows": rows}) - assert len(glyphs) == last - first + 1, f"glyph count {len(glyphs)}" - return font, glyphs - - -def glyph_pixels(glyph: dict, color: int) -> bytes: - """1 бит/пиксель SDLPoP -> 8bpp getimage: 1 = color.""" - out = bytearray() - for row in glyph["rows"]: - for x in range(glyph["w"]): - byte = row[x // 8] - on = byte & (1 << (7 - (x & 7))) - out.append(color if on else 0xFF) - return bytes(out) - - -def pack_atlas(fonts: list[tuple[dict, list[dict], int]]) -> int: - entries = [] - for font, glyphs, color, first, last in fonts: - assert font["first"] <= first <= last <= font["last"] - entries.extend((glyph, color) for glyph in - glyphs[first - font["first"]:last - font["first"] + 1]) - assert len(entries) <= 255 - - data_off = ATL_DIR_OFF + len(entries) * 8 - out = bytearray(data_off) - out[0:4] = ATL_MAGIC - out[4] = len(entries) - for index, (glyph, color) in enumerate(entries): - offset = len(out) - pixels = glyph_pixels(glyph, color) - out += glyph["w"].to_bytes(2, "little") - out += glyph["h"].to_bytes(2, "little") - out += pixels - directory = ATL_DIR_OFF + index * 8 - out[directory:directory + 2] = offset.to_bytes(2, "little") - out[directory + 2] = glyph["w"] - out[directory + 3] = glyph["h"] - out[directory + 4] = 1 - out[directory + 5] = 1 - - if len(out) > SNAPSHOT_OFF: - raise SystemExit(f"font atlas: {len(out)} Б, нет места для palette snapshot @ {SNAPSHOT_OFF:#x}") - OUT_DIR.mkdir(parents=True, exist_ok=True) - OUT_ATL.write_bytes(out) - return len(out) - - -def emit_header(small: dict, big: dict, atlas_size: int) -> None: - small_n = LAST - FIRST + 1 - text = f"""/* - * pop_font.h — контракт FONT\\FONT.ATL, СГЕНЕРИРОВАН. - * Источник: SDLPoP hc_small_font_data[] и hc_font_data[]. - * Генератор: toolchain/pop_extract_font.py. Руками не править. - */ -#ifndef POP_FONT_H -#define POP_FONT_H - -#include - -#define POP_FONT_COLOR 0x{FONT_COLOR:02X} -#define POP_FONT_DARK_COLOR 0x{FONT_DARK_COLOR:02X} -#define POP_FONT_FIRST {FIRST} -#define POP_FONT_LAST {LAST} -#define POP_FONT_SMALL_BASE 0 -#define POP_FONT_SMALL_ASCENT {small['ascent']} -#define POP_FONT_SMALL_SPACE {small['space_chars']} -#define POP_FONT_BIG_BASE {small_n} -#define POP_FONT_BIG_ASCENT {big['ascent']} -#define POP_FONT_BIG_SPACE {big['space_chars']} -/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом. - * Набор обрезан по '_' — им пишется только таблица рекордов. */ -#define POP_FONT_DARK_BASE {2 * small_n} -#define POP_FONT_DARK_FIRST {DARK_FIRST} -#define POP_FONT_DARK_LAST {DARK_LAST} -#define POP_FONT_SNAPSHOT_OFF 0x{SNAPSHOT_OFF:04X} -#define POP_FONT_ATLAS_SIZE {atlas_size} - -#endif -""" - OUT_H.write_text(text) - - -def main() -> None: - parsed = [] - for path, name in ((SRC_SMALL, "hc_small_font_data"), (SRC_BIG, "hc_font_data")): - font, glyphs = parse_glyphs(extract_array(path, name)) - print(f"{name}: chars={font['first']}..{font['last']} ascent={font['ascent']} " - f"space={font['space_chars']}") - parsed.append((font, glyphs)) - sets = [(parsed[0][0], parsed[0][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_DARK_COLOR, DARK_FIRST, DARK_LAST)] - atlas_size = pack_atlas(sets) - emit_header(parsed[0][0], parsed[1][0], atlas_size) - print(f"{OUT_ATL}: 2 x {LAST - FIRST + 1} + {DARK_LAST - DARK_FIRST + 1} glyphs, " - f"{atlas_size} Б; " - f"snapshot from 0x{SNAPSHOT_OFF:04X}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_extract_kid_data.py b/applications/SprPoP/tools/pop_extract_kid_data.py deleted file mode 100644 index 585fbc6..0000000 --- a/applications/SprPoP/tools/pop_extract_kid_data.py +++ /dev/null @@ -1,171 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_extract_kid_data.py — извлекает данные анимации Kid из исходников -SDLPoP в C-заголовок gen/kid_data.h (Фаза K1). - -Извлекает: - frame_table_kid[] (seg006.c) -> kframe kid_frames[] {image,dx,dy,flags} - original_seqtbl[] (seqtbl.c) -> byte kid_seqtbl[] (2310 Б, база 0x196E) - original_seqtbl_offsets[] (seqtbl.c) -> word kid_seq_off[] (seq_id -> адрес) - -seqtbl адресуется базой SEQTBL_BASE=0x196E: элемент = kid_seqtbl[addr-0x196E]. -Автогенерация — чтобы не переписывать ~180 кадров + 2КБ байткода руками. -""" -import os -import re -import sys as _sys -_sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -SRC = str(P.SDLPOP_SRC) -OUT_BIN_DIR = str(P.atl("kid")) -OUT = str(P.GEN / "kid_data.h") -SEQTBL_BASE = 0x196E - - -def read(name): - return open(os.path.join(SRC, name)).read() - - -def parse_frame_table(txt, name="frame_table_kid"): - """frame_table_kid[]/frame_tbl_guard[] -> список (image, dx, dy, flags). - Записи вида { IMG, 0xC0| 4, DX, DY, 0x40| 4 } — sword/flags как - OR-выражения.""" - m = re.search(r'const frame_type ' + name + r'\[\]\s*=\s*\{(.*?)\n\};', txt, re.S) - body = m.group(1) - frames = [] - for row in re.findall(r'\{([^}]*)\}', body): - parts = [p.strip() for p in row.split(',')] - image = int(parts[0], 0) - sword = eval(parts[1], {}, {}) # напр. "0x00| 9" - dx = int(parts[2], 0) - dy = int(parts[3], 0) - flags = eval(parts[4], {}, {}) - frames.append((image & 0xFF, dx & 0xFF, dy & 0xFF, flags & 0xFF, sword & 0xFF)) - return frames - - -def parse_sword_tbl(txt): - """sword_tbl[] (seg006:2047) -> список (id, x, y). id 255 = клинка нет. - Индекс — sword_frame (cur_frame.sword & 0x3F); один и тот же chtab_0 и у - Кида, и у стража.""" - m = re.search(r'const sword_table_type sword_tbl\[\]\s*=\s*\{(.*?)\n\};', txt, re.S) - rows = [] - for row in re.findall(r'\{([^}]*)\}', m.group(1)): - a, b, c = [int(p.strip(), 0) for p in row.split(',')] - rows.append((a & 0xFF, b & 0xFF, c & 0xFF)) - return rows - - -def parse_byte_array(txt, name): - m = re.search(r'const byte %s\[\]\s*=\s*\{(.*?)\}' % name, txt, re.S) - return [int(x, 0) for x in re.findall(r'0x[0-9A-Fa-f]+|\d+', m.group(1))] - - -def parse_word_array(txt, name): - m = re.search(r'const word %s\[\]\s*=\s*\{(.*?)\}' % name, txt, re.S) - return [int(x, 0) for x in re.findall(r'0x[0-9A-Fa-f]+|\d+', m.group(1))] - - -def emit_c(vals, per_line=12, fmt="0x%02X"): - out = [] - for i in range(0, len(vals), per_line): - out.append(" " + ",".join(fmt % v for v in vals[i:i + per_line]) + ",") - return "\n".join(out) - - -def main(): - seg006 = read("seg006.c") - seqc = read("seqtbl.c") - - frames = parse_frame_table(seg006) - gframes = parse_frame_table(seg006, "frame_tbl_guard") - # Кадры КАТСЦЕН (frame_tbl_cuts, seg006:417) — Princess и Vizier. Нужны - # сценам 8/9 и финалу: там персонажи ходят теми же последовательностями - # seqtbl, что и в игре, но кадры адресуют свои chtab (sword>>6: 1 = набор - # PV1 ресурса 800, 2 = PV2 ресурса 900). - cframes = parse_frame_table(seg006, "frame_tbl_cuts") - seqtbl = parse_byte_array(seqc, "original_seqtbl") - offs = parse_word_array(seqc, "original_seqtbl_offsets") - swtbl = parse_sword_tbl(seg006) - - with open(OUT, "w") as f: - f.write("/* kid_data.h — данные анимации Kid (frame_table + seqtbl +\n" - " * offsets), извлечено toolchain/pop_extract_kid_data.py из\n" - " * SDLPoP. НЕ править вручную. seqtbl адресуется базой\n" - " * SEQTBL_BASE: kid_seqtbl[addr - SEQTBL_BASE]. */\n") - f.write("#ifndef KID_DATA_H\n#define KID_DATA_H\n#include \n\n") - f.write("#define SEQTBL_BASE 0x%04Xu\n\n" % SEQTBL_BASE) - - # frame table и seqtbl В .h НЕ ПОПАДАЮТ — они уезжают в kid.ani - # (EMM-страница): 3.5 КБ в _CODE окна W1/W2 нам дороже, чем один - # gfx_w0_map за тик. См. applications/PoP/docs/layout_plan_v2.md §5.1. - f.write("/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid).\n" - " * САМА таблица кадров и seqtbl лежат в kid.ani (EMM-\n" - " * страница); здесь только тип и размеры. */\n") - f.write("typedef struct { uint8_t image; int8_t dx, dy; " - "uint8_t flags, sword; } kframe;\n") - f.write("#define KID_NFRAMES %d\n" % len(frames)) - f.write("#define KID_SEQTBL_LEN %d\n\n" % len(seqtbl)) - - # раскладка kid.ani (смещения ОТ НАЧАЛА ДАННЫХ страницы) - f.write("/* Раскладка kid.ani: кадры (KID_NFRAMES*5), затем seqtbl. */\n") - f.write("#define KID_BIN_FRAMES_OFF 0\n") - f.write("#define KID_BIN_SEQTBL_OFF %d\n" % (len(frames) * 5)) - f.write("/* Таблица кадров СТРАЖА (frame_tbl_guard, seg006:372): индекс\n" - " * frame + add_frame - 149 (add_frame=70 для кадров 102..106). */\n") - f.write("#define KID_NGFRAMES %d\n" % len(gframes)) - f.write("#define KID_BIN_GFRAMES_OFF %d\n" % (len(frames) * 5 + len(seqtbl))) - f.write("/* Таблица кадров КАТСЦЕН (frame_tbl_cuts, seg006:417):\n" - " * Princess/Vizier, индекс — номер кадра как есть. Набор\n" - " * спрайтов выбирает sword>>6 (1 = PV1 res800, 2 = PV2 res900). */\n") - f.write("#define KID_NCFRAMES %d\n" % len(cframes)) - f.write("#define KID_BIN_CFRAMES_OFF %d\n\n" - % (len(frames) * 5 + len(seqtbl) + len(gframes) * 5)) - - # seq offsets - # kid_seq_off — МАКРО-инициализатором, не готовым массивом: заголовок - # включают почти все модули PoP, и `static const` размножал таблицу по - # каждому TU мёртвой копией (замер 2026-08-08: 230 Б × 9 модулей = - # 1840 Б впустую, в т.ч. 460 Б резидента W1/W2). Сам массив - # определяет ОДИН pop_kid.c — та же причина, что у sword_tbl ниже. - f.write("#define KID_NSEQ %d\n" % len(offs)) - f.write("#define KID_SEQ_OFF_INIT { \\\n") - f.write(emit_c(offs, 8, "0x%04X").replace("\n", " \\\n") + " \\\n}\n\n") - - # sword_tbl — макро-инициализаторами, а не готовыми массивами: так - # 159 байт таблицы лягут в ОДИН TU (pop_kid.c), а не в каждый, кто - # включил заголовок. - f.write("/* sword_tbl (seg006:2047): клинок отдельным спрайтом chtab_0.\n" - " * Индекс — sword_frame (кадр.sword & 0x3F), id 255 = клинка нет.\n" - " * Смещения x/y — ЭКРАННЫЕ (применяются после calc_screen_x_coord),\n" - " * x — «вперёд» по направлению персонажа. */\n") - f.write("#define KID_NSWORD %d\n" % len(swtbl)) - for i, (nm, fmt) in enumerate((("ID", "0x%02X"), ("DX", "%d"), ("DY", "%d"))): - # dx/dy — знаковые: печатаем со знаком, иначе int8_t = overflow - vals = [r[i] if i == 0 else (r[i] - 256 if r[i] > 127 else r[i]) - for r in swtbl] - f.write("#define KID_SWORD_%s_INIT { \\\n" % nm) - f.write(emit_c(vals, 12, fmt).replace("\n", " \\\n") + " \\\n}\n") - f.write("\n#endif\n") - - # kid.ani: кадры (по 5 байт) + seqtbl подряд - os.makedirs(OUT_BIN_DIR, exist_ok=True) - binpath = os.path.join(OUT_BIN_DIR, "kid.ani") - with open(binpath, "wb") as b: - for (img, dx, dy, fl, sw) in frames: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - b.write(bytes(seqtbl)) - for (img, dx, dy, fl, sw) in gframes: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - for (img, dx, dy, fl, sw) in cframes: - b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF))) - print(f"kid.ani: {len(frames)*5 + len(seqtbl) + len(gframes)*5 + len(cframes)*5} Б " - f"(кадры Kid + seqtbl + кадры стража + кадры катсцен) -> {binpath}") - - print(f"kid_data.h: {len(frames)} кадров, seqtbl {len(seqtbl)} Б, " - f"{len(offs)} seq-оффсетов -> {OUT}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_idx.py b/applications/SprPoP/tools/pop_idx.py deleted file mode 100644 index 212c227..0000000 --- a/applications/SprPoP/tools/pop_idx.py +++ /dev/null @@ -1,230 +0,0 @@ -"""pop_idx.py — ДИСКОВЫЕ ИНДЕКСЫ аудио-наборов SprPoP. - -Зачем. Раскладка звукового набора (какой эффект в какой странице, по -какому смещению и какой длины) сегодня печатается упаковщиком в -gen/pop_sound_tbl.h и становится частью EXE. Из-за этого замена набора -(SDLPoP <-> MSDOS) требует перекомпиляции игры. Индекс переносит эту -раскладку НА ДИСК: пара `SND/snd.idx` + `SND/snd.arc` меняется целиком, -а бинарник остаётся прежним. - -Формат читают ДВЕ стороны — этот упаковщик и загрузчик на Z80, — поэтому -писатель и разборщик живут в одном месте и покрыты тестом -(tools/tests/test_pop_idx.py). Числа little-endian: у Z80 это родной -порядок, и разбор на нём — просто чтение байтов подряд. - -PSI1 — индекс ЭФФЕКТОВ, ровно один сектор DSS (512 Б): - - 0..3 'PSI1' магия и версия - 4 57 число плотных записей, id 0..56 - 5 5 размер записи - 6 7 log2 размера блока: 1 << 7 = 128 - 7 1 формат PCM: 8 бит без знака, моно, CBL_FREQ_10K9 - 8 pages сколько PCM-страниц в снд-архиве (1..16) - 9..15 0 резерв - 16..300 57 записей по 5 байт: page (u8), off (u16), len (u16) - 301..511 0 добивка до сектора - -Размер записи 5 — это НЕ произвольное число, а sizeof(pop_snd_ent_t) в -ABI SDCC z80 (uint8 + uint16 + uint16 без выравнивания). Загрузчик -читает записи ПРЯМО в резидентную таблицу, поэтому расхождение здесь -молча разъедет всю раскладку; на стороне C это проверяется статически. - -Нулевая `len` означает, что у этого id нет оцифровки (это музыка). - -PMI1 — индекс МУЗЫКИ, тоже один сектор: - - 0..3 'PMI1' магия и версия - 4 57 число плотных записей, id 0..56 - 5 4 размер записи - 6 7 log2 размера блока - 7 1 формат PCM - 8..15 0 резерв - 16..243 57 записей по 4 байта: blocks (u16), ticks60 (u16) - 244..511 0 добивка до сектора - -Числа страниц здесь НЕТ намеренно: это производная от `blocks`, и -дублирование однажды разъедется с ним. Загрузчик считает сам: - - pages = blocks / 128 + ((blocks & 127) != 0) - -`ticks60` — длительность в тиках сцены (60 Гц оригинала), нужная там, где -сценарий ждёт конца реплики. Считается из blocks отношением 40/57 — -обратным к тому, которым шкала сцены переводит тики в порции насоса. -Хранится ОТДЕЛЬНО, а не выводится в рантайме: так момент окончания -реплики можно будет уточнить независимо от технического хвоста PCM. - -Нулевой `blocks` означает, что трека с таким id в наборе нет. -""" - -import struct - -SECTOR = 512 - -# --- PSI1: эффекты --------------------------------------------------------- -SND_MAGIC = b"PSI1" -SND_COUNT = 57 # пространство id оригинала: 0..56 -SND_REC = 5 # sizeof(pop_snd_ent_t) в ABI SDCC z80 -SND_HDR = 16 -SND_MAX_PAGES = 16 # compile-time вместимость загрузчика -BLOCK = 128 # блок запроса CBL при 8 бит -BLOCK_LOG2 = 7 -PCM_U8_MONO_10K9 = 1 # единственный формат, который умеет наш насос -PAGE = 16384 - - -class IdxError(Exception): - """Индекс не разобрался: битый, чужой версии или противоречивый.""" - - -def snd_pack(entries, pages): - """Собрать PSI1 из 57 записей (page, off, len) и числа страниц.""" - if len(entries) != SND_COUNT: - raise IdxError("записей должно быть %d, а не %d" - % (SND_COUNT, len(entries))) - if not 1 <= pages <= SND_MAX_PAGES: - raise IdxError("страниц %d — вне 1..%d" % (pages, SND_MAX_PAGES)) - - out = bytearray(SECTOR) - out[0:4] = SND_MAGIC - out[4] = SND_COUNT - out[5] = SND_REC - out[6] = BLOCK_LOG2 - out[7] = PCM_U8_MONO_10K9 - out[8] = pages - for i, (page, off, ln) in enumerate(entries): - _check_entry(i, page, off, ln, pages) - struct.pack_into(" (записи, pages). Проверки те же, что у Z80.""" - if len(data) != SECTOR: - raise IdxError("размер %d, а должен быть сектор %d" % (len(data), SECTOR)) - if data[0:4] != SND_MAGIC: - raise IdxError("не PSI1: %r" % (bytes(data[0:4]),)) - if data[4] != SND_COUNT: - raise IdxError("записей %d, ожидалось %d" % (data[4], SND_COUNT)) - if data[5] != SND_REC: - raise IdxError("размер записи %d, ожидался %d" % (data[5], SND_REC)) - if data[6] != BLOCK_LOG2: - raise IdxError("log2 блока %d, ожидался %d" % (data[6], BLOCK_LOG2)) - if data[7] != PCM_U8_MONO_10K9: - raise IdxError("формат PCM %d — насос умеет только %d" - % (data[7], PCM_U8_MONO_10K9)) - pages = data[8] - if not 1 <= pages <= SND_MAX_PAGES: - raise IdxError("страниц %d — вне 1..%d" % (pages, SND_MAX_PAGES)) - - entries = [] - for i in range(SND_COUNT): - page, off, ln = struct.unpack_from("= pages: - raise IdxError("запись %d: page %d >= pages %d" % (i, page, pages)) - if off >= PAGE: - raise IdxError("запись %d: off %d вне страницы" % (i, off)) - if off % BLOCK or ln % BLOCK: - raise IdxError("запись %d: off/len не кратны блоку %d" % (i, BLOCK)) - if page == 0 and off < BLOCK: - raise IdxError("запись %d залезает в блок тишины (стр.0, off 0)" % i) - # Длинный эффект переливается на следующие страницы — они обязаны быть. - last = (page * PAGE + off + ln - 1) // PAGE - if last >= pages: - raise IdxError("запись %d выходит за набор: кончается в стр.%d из %d" - % (i, last, pages)) - - -# --- PMI1: музыка ---------------------------------------------------------- -MUS_MAGIC = b"PMI1" -MUS_COUNT = 57 # то же пространство id оригинала -MUS_REC = 4 -MUS_HDR = 16 -# Потоковый трек (финальная тема) заведомо длиннее обычных, и предел ему -# ставят не страницы загрузчика, а восьмибитные счётчики страниц в коде. -MUS_MAX_PAGES = 255 - - -def mus_ticks(blocks): - """Длительность в тиках сцены (60 Гц) по длине в блоках. - - Отношение 40/57 — обратное к тому, которым шкала сцены переводит тики - в порции насоса (57/40, pop_intro.c). Берём именно его, а не точное - 10937,5/128/60: длина реплики и ход шкалы обязаны считаться ОДНОЙ - арифметикой, иначе они разъедутся на длинных треках. Округление к - ближайшему: отбрасывание вниз теряло по тику на реплику. - """ - return (blocks * 40 + 28) // 57 - - -def mus_pack(entries): - """Собрать PMI1 из 57 записей (blocks, ticks60).""" - if len(entries) != MUS_COUNT: - raise IdxError("записей должно быть %d, а не %d" - % (MUS_COUNT, len(entries))) - out = bytearray(SECTOR) - out[0:4] = MUS_MAGIC - out[4] = MUS_COUNT - out[5] = MUS_REC - out[6] = BLOCK_LOG2 - out[7] = PCM_U8_MONO_10K9 - for i, (blocks, ticks) in enumerate(entries): - _check_mus(i, blocks, ticks) - struct.pack_into(" записи. Проверки те же, что у Z80.""" - if len(data) != SECTOR: - raise IdxError("размер %d, а должен быть сектор %d" % (len(data), SECTOR)) - if data[0:4] != MUS_MAGIC: - raise IdxError("не PMI1: %r" % (bytes(data[0:4]),)) - if data[4] != MUS_COUNT: - raise IdxError("записей %d, ожидалось %d" % (data[4], MUS_COUNT)) - if data[5] != MUS_REC: - raise IdxError("размер записи %d, ожидался %d" % (data[5], MUS_REC)) - if data[6] != BLOCK_LOG2: - raise IdxError("log2 блока %d, ожидался %d" % (data[6], BLOCK_LOG2)) - if data[7] != PCM_U8_MONO_10K9: - raise IdxError("формат PCM %d — насос умеет только %d" - % (data[7], PCM_U8_MONO_10K9)) - entries = [] - for i in range(MUS_COUNT): - blocks, ticks = struct.unpack_from(" MUS_MAX_PAGES: - raise IdxError("запись %d: %d блоков — больше %d страниц, счётчики " - "страниц в коде восьмибитные" - % (i, blocks, MUS_MAX_PAGES)) - if ticks == 0: - raise IdxError("запись %d: трек есть, а длительность нулевая" % i) diff --git a/applications/SprPoP/tools/pop_pack_arc.py b/applications/SprPoP/tools/pop_pack_arc.py deleted file mode 100644 index fd12db3..0000000 --- a/applications/SprPoP/tools/pop_pack_arc.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_arc.py — сложить несколько ресурсов в один архив PBA1. - -ЗАЧЕМ. На диске игры лежит больше трёхсот отдельных файлов, и дело не в -беспорядке: замер в MAME (2026-08-25) показал, что ОДИН `open` стоит -51,4 мс, а чтение 16 КБ из уже открытого файла — 32,6 мс. То есть 61 % -времени загрузки уходит на открытие, а не на данные. Одна только стартовая -пачка (kid + shadow + bg + sound + guard, ~142 файла) — это 7,3 секунды -чистого `open`. Сложив группу в архив и открыв его ОДИН раз, мы эти -секунды возвращаем. - -ФОРМАТ (512-байтовый заголовок, дальше данные): - - 0..3 'PBA1' магия и версия — как SPA1 у атласов, PCFG, POPQ - 4 count число записей, 1..126 - 5..7 резерв (нули) - 8.. записи по 4 байта: - +0..1 offset в СЕКТОРАХ по 512 от начала файла (uint16 LE) - +2..3 size в байтах (uint16 LE) - -Оффсет именно в секторах: архив `pv` — мегабайт, в байтах uint16 не хватило -бы. В секторах uint16 покрывает 32 МБ, то есть весь наш образ. Размер при -этом спокойно живёт в байтах — ни один ресурс не крупнее 16 КБ, потому что -каждый обязан помещаться в EMM-страницу. - -Данные каждого элемента выровнены на 512, поэтому его смещение всегда -целое число секторов, а чтение попадает в границу сектора DSS. -""" -import re -import sys -from pathlib import Path - -MAGIC = b"PBA1" -HEADER = 512 -SECTOR = 512 -MAX_ENTRIES = (HEADER - 8) // 4 # 126 - - -def build(out_path: Path, files: list[Path]) -> None: - if len(files) > MAX_ENTRIES: - raise SystemExit(f"{out_path.name}: {len(files)} файлов, " - f"в заголовок влезает {MAX_ENTRIES}") - header = bytearray(HEADER) - header[0:4] = MAGIC - header[4] = len(files) - - blob = bytearray() - for i, f in enumerate(files): - data = f.read_bytes() - if len(data) > 0xFFFF: - raise SystemExit(f"{f}: {len(data)} Б — размер не влезает в uint16") - offset = HEADER + len(blob) - assert offset % SECTOR == 0 - rec = 8 + i * 4 - header[rec:rec + 2] = (offset // SECTOR).to_bytes(2, "little") - header[rec + 2:rec + 4] = len(data).to_bytes(2, "little") - blob += data - pad = -len(blob) % SECTOR - blob += bytes(pad) - - out_path.parent.mkdir(parents=True, exist_ok=True) - out_path.write_bytes(bytes(header) + bytes(blob)) - - -def const_name(prefix: str, path: Path) -> str: - """kid12.atl -> ARC_KID_KID12; kid.pal -> ARC_KID_KID_PAL.""" - stem = path.name - if stem.lower().endswith(".atl"): - stem = stem[:-4] - return f"ARC_{prefix}_" + re.sub(r"[^A-Za-z0-9]", "_", stem).upper() - - -def write_header(path: Path, prefix: str, files: list[Path]) -> None: - """Индексы элементов — константами, чтобы код не считал их на память. - - Порядок задаёт Makefile, и он же единственный источник истины: сдвинулся - список — сдвинулись константы, а серии вроде kid0..kid27 код проверяет - статически (`#if ARC_KID_KID27 - ARC_KID_KID0 != 27`). - """ - lines = [f"/* {path.name} — индексы в архиве {prefix}. СГЕНЕРИРОВАН", - " * (toolchain/pop_pack_arc.py), руками не править. */", - f"#ifndef {path.stem.upper()}_H", - f"#define {path.stem.upper()}_H", - "", - f"#define ARC_{prefix}_COUNT {len(files)}", - ""] - width = max(len(const_name(prefix, f)) for f in files) - for i, f in enumerate(files): - lines.append(f"#define {const_name(prefix, f):<{width}} {i}") - lines += ["", "#endif", ""] - path.write_text("\n".join(lines)) - - -def main() -> None: - args = sys.argv[1:] - header = prefix = None - while args and args[0].startswith("--"): - opt = args.pop(0) - if opt == "--header": - header = Path(args.pop(0)) - elif opt == "--prefix": - prefix = args.pop(0) - else: - raise SystemExit(f"неизвестный ключ {opt}") - if len(args) < 2: - raise SystemExit("usage: pop_pack_arc.py [--header H.h --prefix NAME] " - "OUT.ARC file [file ...]") - out = Path(args[0]) - files = [Path(a) for a in args[1:]] - for f in files: - if not f.exists(): - raise SystemExit(f"нет файла: {f}") - build(out, files) - if header: - if not prefix: - raise SystemExit("--header требует --prefix") - write_header(header, prefix, files) - total = out.stat().st_size - print(f"{out.name}: {len(files)} записей, {total / 1024:.0f} КБ") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_bg.py b/applications/SprPoP/tools/pop_pack_bg.py deleted file mode 100644 index d94f75c..0000000 --- a/applications/SprPoP/tools/pop_pack_bg.py +++ /dev/null @@ -1,616 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_bg.py — упаковщик спрайтов СТАТИЧЕСКОГО ФОНА PoP (Шаг 2 порта). - -Что делает: - 1. Определяет РЕАЛЬНО используемый набор спрайтов фона (прогоняет - render_room.py по всем комнатам всех уровней, собирает (chtab,id)). - 2. Грузит исходные PNG (VDUNGEON→VPALACE каскад, как в игре), переводит - 16-цветный индексированный пиксель в 8bpp getimage-блоб: - индекс 0 -> 0xFF (прозрачность getimage) - индекс i -> 0x50+i (env, chtab_6) / 0x60+i (wall, chtab_7) - 3. Пакует в атласы .atl с ПРЯМОЙ адресацией (idx = id), каталог любого - размера (блобы кладутся ПОСЛЕ каталога — загрузчик atlas_image читает - offset явно, лимит 19 из libbgi/mkatlas.py не действует). libbgi НЕ - трогаем. Дырки в каталоге (неиспользуемые id) = фейковые записи, - ссылающиеся на общий пустой 0×0-блоб (осознанная трата места в EMM - ради нулевых remap-таблиц в W2 — требование пользователя). - 4. Собирает палитру Sprinter (.pal, записи B,G,R,0) из res200.pal (env - -> слоты 0x50..0x5F) и res360.pal (wall -> 0x60..0x6F). VGA 6-бит - каналы масштабируются в 8-бит. - 5. Пишет C-заголовок с раскладкой (имена файлов, SHIFT, число страниц, - набор fore-id). - -Раскладка (прямая адресация, SHIFT=5): - ENV фон : 5 страниц, страница = id>>5, idx = id&31 - WALL : 1 страница, idx = id - FORE : 1 страница (спрайты «перед персонажем»: фронты столбов/ - ворот/дебриса), idx = id — отдельный атлас (жизненный цикл - другой: рисуются каждый кадр как sprite_t, не запекаются). -W2-цена: 7 хэндлов atlas_t (~21 Б), ноль таблиц id->позиция. - -Выход: в build/atl/bg/ — *.atl + pop_bg.pal + pop_bg_atlas.h -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import render_room as R # noqa: E402 (экстрактор + каскад загрузки) - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -OUT_DIR = str(P.atl("bg")) - -# Спрайты FORE-слоя (add_foretable в seg008 — «перед персонажем»): фронты -# столбов, ворот, дебриса. См. tile_table.fore_id + анализ pop_background_strategy. -# 119..123 — фронт чомпера и его кровь; 77 — фронт ЗЕРКАЛА (MIRROR_ENV_IDS). -# -# id 12 ЗДЕСЬ НЕТ намеренно. В tile_table он стоит как fore_id ЗЕЛЬЯ -# (0x0A), но зелье рисуется из chtab_1 (`add_foretable(id_chtab_1_...)`, -# seg008 draw_tile_fore; у нас — pop_potion_flask), а в chtab_6 под этим -# номером лежит ПРАВАЯ ЧАСТЬ АРКИ БАЛКОНА (32x62), и она идёт в backtable: -# `BT room=18 r=1 c=7 ch=6 id=12` в трассе оригинала. Пока 12 был в этом -# списке, он уезжал в fore-атлас, а env-страница получала дырку — правая -# половина портала не рисовалась вовсе (BUG-BALCONY-RIGHT). -FORE_ENV_IDS = {9, 49, 88, 91, 95, 100} | {106, 107, 108, 109, 110} \ - | {119, 120, 121, 122, 123} | {77} - -# Пол-оверлей подъёма (floor_left_overlay, draw_floor_overlay seg008): рисуется -# рантаймом поверх нижней части Kid при подтягивании на пол у кромки — НЕ -# попадает в used render_room, добавляем явно в env-фон. (32 обычно уже есть.) -CLIMB_OVERLAY_ENV_IDS = {32, 150, 151} - -# Дрожащие/падающие кадры loose-плиты (loose_fram_left/right/bottom, seg008): -# 41/42/43 = покой (уже в used из render_room), 69-74 = вибрация/раздвоение — -# используются ТОЛЬКО динамикой (shake/fall), в статический render_room НЕ -# попадают, поэтому добавляем явно. Без них дрожащая плита невидима. -LOOSE_ANIM_ENV_IDS = {69, 70, 71, 72, 73, 74} - -# Кадры ВЫДВИЖЕНИЯ пик (seg008): три части — left (128-132, своя ячейка, -# draw_tile_anim), right (134-138, правый сосед, draw_tile_anim_right), fore -# (139-143, поверх Kid, draw_tile_fore). Рисуются ТОЛЬКО динамикой -# (animate_spike); в уровнях пики статически убраны (modif=0 → кадр 0), -# поэтому в used render_room НЕ попадают. Без них выдвинутые пики невидимы. -SPIKE_ANIM_ENV_IDS = {128, 129, 130, 131, 132, # left - 134, 135, 136, 137, 138, # right - 139, 140, 141, 142, 143} # fore - -# Кадры ЧОМПЕРА (seg008:638 chomper_fram_bot/top/for + кровь). В уровнях -# чомпер стоит с modif = 0, а chomper_fram1[0] = 3 — значит render_room -# (он анимацию пропускает вовсе, см. render_room.py:611) не кладёт в атлас -# НИ ОДНОГО кадра, и чомпер не виден даже в покое. Поэтому весь набор — -# явно. Низ и верх идут в backtable (ПОД персонажем), фронт — в foretable -# (ПОВЕРХ), поэтому фронтовые id продублированы в FORE_ENV_IDS. -CHOMPER_BOT_IDS = {101, 102, 103, 104, 105} # chomper_fram_bot -CHOMPER_TOP_IDS = {111, 112, 113} # chomper_fram_top (фазы 2..4) -CHOMPER_FORE_IDS = {106, 107, 108, 109, 110} # chomper_fram_for - -# Кровь на сомкнутых челюстях (modif & 0x80): chomper_num + 114 в backtable и -# + 119 в foretable, обе — MONO-блитом цветом 12 (blitters_4Ch_mono_12), то -# есть силуэтом, как пузырёк зелья. Появляется после смерти Кида в чомпере. -CHOMPER_BLOOD_IDS = {114, 115, 116, 117, 118} -CHOMPER_BLOOD_FORE_IDS = {119, 120, 121, 122, 123} -CHOMPER_BLOOD_COLOR = None # ставится ниже, когда известен VGA16_PAL_BASE - -# Кадры ОТКРЫТИЯ ворот (portcullis, DOOR_FRAM_SLICE + gate pieces 50/51, -# seg008 draw_gate): 50-59 + 67. В уровнях ворота статически ЗАКРЫТЫ -# (низкий modif → используются только нижние срезы 50-53); срезы более -# открытых состояний (54-59, 67) нужны анимации открытия — добавляем явно. -GATE_ANIM_ENV_IDS = {50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 67} -# ВЕРХ ворот, который рисует тайл НАД ними (draw_tile_anim_topright, -# seg008:0568): маска 68 (mono, чёрным — «продавить» фон под створкой) и -# кадр door_fram_top[(modifier>>2) % 8] = 60..67 по открытости. Без них -# над воротами остаётся чёрный треугольник (видно у шва во дворце). -GATE_TOP_ENV_IDS = {60, 61, 62, 63, 64, 65, 66, 67} -GATE_TOP_MASK_ID = 68 - - -# НАЖАТАЯ кнопка-closer (get_tile_to_draw seg008:2FE: при таймере связи >1 -# tiles_6_closer рисуется как tiles_5_stuck). tile_table[5] = база 41 (уже -# есть), правая грань 35, нижняя 36 — оба id встречаются ТОЛЬКО в этом -# динамическом состоянии, статически тайла 5 в уровнях нет, значит в used -# render_room они не попадают. Без них у нажатой кнопки чёрный провал на -# месте нижней грани и потерянная правая грань. -STUCK_ENV_IDS = {35, 36} - -# Левая половина кнопки-opener, когда СЛЕВА пусто (draw_tile_base seg008:0A8E: -# curr_tile==15 && tile_left==0 && level_type==0 → id 148 вместо базы 147). -# render_room этой ветки не знает, поэтому добавляем явно. -OPENER_NOFLOOR_ENV_IDS = {148} - -# ---- chtab_1 (flame/sword/potion), база ресурса 150, папка PRINCE ---- -# Зелье (seg008 draw_tile_fore/draw_tile_anim): склянка id 12 (малая) / 13 -# (большая, типы 2..4), кадры пузырька 16..22 (potion_fram_bubb) и его маска -# 23. Пузырёк и маска рисуются MONO-блитом (одним цветом), поэтому пакуем их -# силуэтами уже в нужном цвете: маска — чёрный env[0], пузырёк — env[12] -# (красный, тип «лечение»). Цвета других типов (9 синий / 10 зелёный) — -# TODO, когда появятся такие зелья. -POT_DIR_NAME = "PRINCE" -POT_FLAME_IDS = tuple(range(1, 10)) # пламя факела: modifier+1 (seg008:560) -POT_FLASK_IDS = (12, 13) -POT_BUBBLE_IDS = (16, 17, 18, 19, 20, 21, 22) -POT_MASK_ID = 23 -POT_PAL_BASE = 0x40 # 16 цветов chtab_1 -> слоты 0x40..0x4F -# MONO-блит (method_3_blit_mono, seg009:3040) красит спрайт цветом из ОБЩЕЙ -# 16-цветной палитры экрана, а не из палитры chtab. Кладём её в 0x30..0x3F. -VGA16_PAL_BASE = 0x30 -# Два цвета игра ПРАВИТ на старте (init_game_main, seg000:164) — стандартные -# VGA-значения там не годятся: -# 6 -> #C09850 (0x30,0x26,0x14) «palace wall pattern» — швы дворцовой кладки -# 12 -> #E00030 (0x38,0x00,0x0C) «blood, hurt flash» — кровь и вспышка урона -# Проверено дампом палитры живого SDLPoP: PAL[6]=48,38,20 PAL[12]=56,0,12. -VGA16 = [(0,0,0),(0,0,42),(0,42,0),(0,42,42),(42,0,0),(42,0,42),(48,38,20), - (42,42,42),(21,21,21),(21,21,63),(21,63,21),(21,63,63),(56,0,12), - (63,21,63),(63,63,21),(63,63,63)] # 6-битные каналы, как в .pal -# ЧЁРНЫЙ ФОН АНИМАЦИЙ — ИМЕННО ЦВЕТ 0, а не «чёрный из палитры набора». -# Вспышки (молния, урон, зелья) подменяют НУЛЕВУЮ запись палитры, и всё, -# что закрашено 0x30/0x40, остаётся чёрным островом посреди вспышки — -# пламя факелов и склянки «не мигали» (поймано пользователем 2026-08-25). -POT_MASK_COLOR = 0 # маска mono-блита = фон вспышки -POT_BUBBLE_COLOR = VGA16_PAL_BASE + 12 # ярко-красный (color 12: «лечение») -# Цвет пузырька зависит от ТИПА зелья (draw_tile_anim, seg008:652): типы 3/4 -# (перо / переворот) — зелёный, 5/6 (вред / открыть) — синий, остальные — -# красный. У нас спрайт красится при УПАКОВКЕ (mono-блиттера с параметром -# цвета в libbgi нет), поэтому каждый цвет — свой набор кадров: те же семь -# силуэтов под сдвинутыми id. Синий появится вместе с зельями 5/6. -POT_BUBBLE_GREEN_COLOR = VGA16_PAL_BASE + 10 # color 10 (seg008:663) -POT_BUBBLE_GREEN_BASE = 30 # id 30..36 = кадры 16..22 -POT_BUBBLE_BLUE_COLOR = VGA16_PAL_BASE + 9 # color 9 (seg008:658) -POT_BUBBLE_BLUE_BASE = 40 # id 40..46 = кадры 16..22 -CHOMPER_BLOOD_COLOR = VGA16_PAL_BASE + 12 # тот же mono-цвет 12 (seg008:678) - -# Кладка ДВОРЦА (wall_pattern, seg008:1928, ветка palace): тело стены — -# сплошные заливки цветом из palace_wall_colors, а поверх идут ПЯТЬ -# разделителей chtab_7 id 3..17 (prandom(2) + 3/6/9/12/15), и рисуются они -# blitters_46h_mono_6 — mono-блитом ОДНИМ цветом 6 общей 16-цветной палитры -# экрана. В подземелье те же id — обычные спрайты кирпичей (wall_fram_main/ -# bottom), поэтому силуэтом пакуем ТОЛЬКО дворцовый набор. -PALACE_WALL_MONO_IDS = set(range(3, 18)) -PALACE_WALL_MONO_COLOR = VGA16_PAL_BASE + 6 - - -# Основание факела (seg008:489 draw_tile_right: при левом соседе-факеле -# рисуется chtab_6 id 146). В статический render_room не попадает. -TORCH_ENV_IDS = {146} - -# ---- Два тайлсета: подземелье и дворец -------------------------------- -# Оригинал грузит РАЗНЫЙ .DAT под один и тот же набор id: -# tbl_envir_ki[tbl_level_type[level]] -> VDUNGEON / VPALACE (seg000:1108), -# то есть id спрайта от набора НЕ зависит — меняется только картинка и -# палитра (env 0x50..0x5F, wall 0x60..0x6F). Поэтому оба набора пакуются -# по ОДНОМУ И ТОМУ ЖЕ объединению id: раскладка id -> (страница, idx) -# остаётся одна, и коду достаточно подменить ИМЕНА файлов. -# -# Порядок каталогов — каскад: сначала «свой» набор, потом чужой как -# фолбэк (в распакованном data/ несколько id есть только в одном из них: -# res230/231/348 только в VDUNGEON, два десятка — только в VPALACE). -SETS = { - "dungeon": ("pop_", lambda: (R.VDUNGEON_DIR, R.VPALACE_DIR)), - "palace": ("pal_", lambda: (R.VPALACE_DIR, R.VDUNGEON_DIR)), -} -SRC_DIRS = None # ставит main() по выбранному набору - -# Спрайты, которые рисуются ТОЛЬКО на паласных уровнях (seg008): -# 78, 80, 82 doortop_fram_bot (низ верха двери, draw_tile_right) -# 81, 83 doortop_fram_top (draw_tile_topright) -# 84 полоска на стене (draw_tile_right, tiles_20_wall) -# 145 stripe_id соседнего тайла (draw_tile_right) -# render_room про них не знает (он рисует по подземельной ветке), поэтому -# добавляем явно — иначе при переключении набора в этих местах будет дыра. -PALACE_ENV_IDS = {78, 80, 81, 82, 83, 84, 145} - -# ЗЕРКАЛО (tile_table[0x0D] = база 75, фронт 77; 42/43 — общие грани пола). -# Тайла 13 НЕТ НИ В ОДНОМ уровне статически (проверено перебором всех 15 -# res200N.bin): оригинал СТАВИТ его в рантайме, когда дверь выхода уровня 4 -# дорисовала открытие — animate_leveldoor, seg007:0457: -# curr_room_tiles[curr_tilepos] = tiles_13_mirror; -# Значит в used от render_room эти id не попадают и без явного добавления на -# месте зеркала был бы чёрный провал (те же грабли, что у нажатой кнопки и -# дрожащей плиты — memory pop_atlas_dynamic_ids). -MIRROR_ENV_IDS = {75, 77} - -ENV_SHIFT = 4 # env фон: страница = id>>SHIFT, idx = id&MASK. - # Было 5: паласный набор добавляет куски верха - # двери (78..84), и страница 2 переваливала за - # 16 КБ. При 4 обе раскладки укладываются, цена - # — 10 страниц EMM на набор вместо 5. -ENV_MASK = (1 << ENV_SHIFT) - 1 - -# ---- .atl формат (== libbgi, но каталог не ограничен 19) -------------- -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 # _ATL_DIR_OFF -ATL_MIN_SIZE = 0x100 # atlas_load требует n >= _ATL_DATA_OFF -PAGE_SIZE = 16384 - - -def die(msg): - sys.exit(f"pop_pack_bg: {msg}") - - -# ---- 1. Набор используемых спрайтов ---------------------------------- -def collect_used(): - """Прогон render_room по всем комнатам -> множество (chtab, id).""" - used = set() - orig = R.load_sprite - - def spy(id, chtab=R.CHTAB_ENV, reason=""): - img = orig(id, chtab, reason) - if img is not None and id > 0: - used.add((chtab, id)) - return img - - R.load_sprite = spy - for lvl in range(1, 15): - fn = os.path.join(R.LEVEL_DIR, f"res{2000 + lvl}.bin") - if not os.path.exists(fn): - continue - lv = R.Level(open(fn, "rb").read()) - for room in range(1, 25): - rm = R.Room(lv, room) - L = lv.links[room][0] - if L: - rm.left_room = R.Room(lv, L) - canvas = Image.new("RGBA", (320, 192), (0, 0, 0, 0)) - for dr in (2, 1, 0): - for c in range(10): - R.draw_tile(canvas, rm, dr, c) - R.load_sprite = orig - return used - - -# ---- 2. Загрузка спрайта в 8bpp-блоб --------------------------------- -# Спрайты chtab_6, которые оригинал рисует БЕЗ прозрачности -# (blitters_0_no_transp): нижние грани тайлов (draw_tile_bottom, seg008:570) и -# нижние кадры loose (draw_loose, seg008:600). У 96/149 (грани кнопок) и 73/74 -# (кадры loose) ПОСЛЕДНЯЯ строка — пиксель 0; в оригинале она заливается ЧЁРНЫМ -# поверх того, что сзади, а у нас 0 -> 0xFF делал её прозрачной, и сквозь неё -# просвечивал Kid (спуск/подъём у кромки кнопки). 43/36 полностью непрозрачны — -# для них флаг ничего не меняет, оставлены для полноты списка. -# Дверь уровня (draw_leveldoor, seg008:1D29): решётка створки (33 — слайс 4px, -# 34 — верх), лестница за ней (99 — низ, 144 — марш). render_room.py -# draw_leveldoor не реализует, поэтому в автосбор эти id не попадают. -LEVELDOOR_ENV_IDS = {33, 34, 99, 144} - -# Куски двери уровня (draw_leveldoor) оригинал рисует blitters_0_no_transp: -# марш лестницы 144 обязан ЗАКРАШИВАТЬ поднявшуюся створку, иначе слева от -# лестницы сквозь него видна решётка (0 -> 0xFF делал фон спрайта прозрачным). -NO_TRANSP_ENV_IDS = {36, 43, 73, 74, 96, 149} | LEVELDOOR_ENV_IDS - - -def load_indexed(chtab, id, opaque=False, mono=None): - """PNG (mode P, 16 цветов) -> (w, h, bytes 8bpp). Каскад по SRC_DIRS - (порядок задаёт выбранный тайлсет, см. SETS). - Пиксель 0 -> 0xFF (прозрач); i -> base+i (env 0x50 / wall 0x60). - - opaque=True — пиксель 0 остаётся ЦВЕТОМ (base+0 = чёрный), а не ключом - прозрачности: порт blitters_0_no_transp (см. NO_TRANSP_ENV_IDS).""" - base_res = 360 if chtab == R.CHTAB_WALL else 200 - pal_base = 0x60 if chtab == R.CHTAB_WALL else 0x50 - fname = f"res{base_res + id}.png" - path = None - for d in SRC_DIRS: - p = os.path.join(d, fname) - if os.path.exists(p): - path = p - break - if path is None: - die(f"нет файла {fname}") - im = Image.open(path) - if im.mode != "P": - die(f"{fname}: mode {im.mode}, ожидался P (16-цветный)") - src = im.tobytes() - if mono is not None: - # MONO-блит (blitters_4Ch_mono_12): спрайт красится ОДНИМ цветом из - # 16-цветной палитры экрана — пакуем силуэтом, как пузырёк зелья. - out = bytes((0xFF if v == 0 else mono) for v in src) - elif opaque: - out = bytes((pal_base + v) for v in src) - else: - out = bytes((0xFF if v == 0 else pal_base + v) for v in src) - return im.width, im.height, out - - -def load_potion(id, mono=None, opaque=False): - """chtab_1: res(150+id).png из data/PRINCE. mono=None — обычный спрайт - (палитра chtab_1 -> слоты POT_PAL_BASE+i); mono=цвет — силуэт этим цветом - (порт blitters_40h_mono); opaque=True — пиксель 0 остаётся ЦВЕТОМ - (порт blitters_0_no_transp, см. POT_FLAME_IDS).""" - path = os.path.join(os.path.dirname(R.VDUNGEON_DIR), POT_DIR_NAME, - f"res{150 + id}.png") - if not os.path.exists(path): - die(f"нет файла {path}") - im = Image.open(path) - if im.mode != "P": - die(f"res{150+id}: mode {im.mode}, ожидался P") - src = im.tobytes() - if mono is not None: - out = bytes((0xFF if v == 0 else mono) for v in src) - elif opaque: - # Пиксель 0 — ЦВЕТ 0 (общий фон игрового поля), остальные — палитра - # chtab_1. Ноль здесь принципиален: непрозрачный бокс пламени иначе - # закрашивал бы фон «своим» чёрным (0x40) и не участвовал во вспышке. - out = bytes((0 if v == 0 else POT_PAL_BASE + v) for v in src) - else: - out = bytes((0xFF if v == 0 else POT_PAL_BASE + v) for v in src) - return im.width, im.height, out - - -def blob(w, h, pix): - """getimage-блоб: u16 w, u16 h (LE) + пиксели.""" - return w.to_bytes(2, "little") + h.to_bytes(2, "little") + pix - - -# ---- 3. Пакер .atl (каталог любого размера) -------------------------- -def pack_atlas(path, entries): - """entries: dict idx -> (w, h, pix). Пустые idx (0..maxidx) заполняются - фейковой ссылкой на общий 0×0-блоб. Каталог count записей с 0x68, - блобы — сразу после каталога.""" - if not entries: - die(f"{path}: пустой атлас") - count = max(entries) + 1 - if count > 255: - die(f"{path}: count {count} > 255") - data_off = ATL_DIR_OFF + count * 8 - - blobs = bytearray() - empty_off = data_off + len(blobs) # общий 0×0-блоб для дырок - blobs += blob(0, 0, b"") - dir_bytes = bytearray(count * 8) - for idx in range(count): - e = entries.get(idx) - if e is None: - off = empty_off - fw = fh = 0 - else: - w, h, pix = e - off = data_off + len(blobs) - blobs += blob(w, h, pix) - fw = min(w, 255) - fh = min(h, 255) - d = idx * 8 - dir_bytes[d:d + 2] = off.to_bytes(2, "little") - dir_bytes[d + 2] = fw - dir_bytes[d + 3] = fh - dir_bytes[d + 4] = 1 # nx - dir_bytes[d + 5] = 1 # ny - # d+6,d+7 резерв - - out = bytearray(data_off) - out[0:4] = ATL_MAGIC - out[4] = count - out[ATL_DIR_OFF:ATL_DIR_OFF + len(dir_bytes)] = dir_bytes - out += blobs - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) # atlas_load: n >= 0x100 - if len(out) > PAGE_SIZE: - die(f"{path}: {len(out)} Б > {PAGE_SIZE} (одна EMM-страница)") - with open(path, "wb") as f: - f.write(out) - return count, len(out) - - -# ---- 4. Палитра ------------------------------------------------------ -def scale6to8(v): - return (v * 255) // 63 - - -def read_pal16(res, d): - b = open(os.path.join(d, res), "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def build_tileset_palette(out_path): - """Палитра ТОЛЬКО тайлсета: 32 записи B,G,R,0 — env (16) затем wall (16). - Ею подменяются слоты 0x50..0x6F при смене типа уровня; полная игровая - палитра (kid.pal) при этом не трогается, потому что Кид, страж, меч и - зелья живут в других слотах (levels_plan §3). Порядок каталогов — - SRC_DIRS, то есть файл соответствует выбранному набору.""" - pal = bytearray(32 * 4) - src = read_pal16("res200.pal", SRC_DIRS[0]) + read_pal16("res360.pal", SRC_DIRS[0]) - for i, (r, g, b) in enumerate(src): - pal[i * 4:i * 4 + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - with open(out_path, "wb") as f: - f.write(pal) - - -def build_palette(out_path): - """256-записная палитра B,G,R,0: env@0x50..0x5F, wall@0x60..0x6F.""" - def read_pal(res, d): - return read_pal16(res, d) - - env = read_pal("res200.pal", R.VDUNGEON_DIR) - wall = read_pal("res360.pal", R.VDUNGEON_DIR) - pot = read_pal("res150.pal", os.path.join(os.path.dirname(R.VDUNGEON_DIR), - POT_DIR_NAME)) - pal = bytearray(256 * 4) - for i, (r, g, b) in enumerate(env): - o = (0x50 + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(wall): - o = (0x60 + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(pot): - o = (POT_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - for i, (r, g, b) in enumerate(VGA16): - o = (VGA16_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((scale6to8(b), scale6to8(g), scale6to8(r), 0)) - with open(out_path, "wb") as f: - f.write(pal) - - -# ---- 5. C-заголовок -------------------------------------------------- -def write_header(out_path, env_pages): - """Заголовок ОДИН на оба тайлсета: раскладка id -> (страница, idx) у них - общая (пакуются по одному объединению id), различаются только имена - файлов и палитра. Поэтому здесь два массива имён и один индекс.""" - lines = [ - "/* pop_bg_atlas.h — раскладка атласов статического фона PoP.", - " * Сгенерировано tools/pop_pack_bg.py — НЕ править вручную.", - " *", - " * Прямая адресация (ноль remap-таблиц в W2):", - " * ENV фон id N -> atlas env_bg[N>>%d], idx N&%d" % (ENV_SHIFT, ENV_MASK), - " * WALL id N -> atlas wall, idx N", - " * FORE id N -> atlas fore, idx N", - " *", - " * ДВА ТАЙЛСЕТА (порт tbl_envir_ki[tbl_level_type], seg000:1108):", - " * 0 = подземелье (pop_*), 1 = дворец (pal_*). Набор id и раскладка", - " * у них ОДНИ И ТЕ ЖЕ — меняются только файлы и 32 записи палитры", - " * (env 0x50..0x5F, wall 0x60..0x6F), см. *tile.pal.", - " */", - "#ifndef POP_BG_ATLAS_H", - "#define POP_BG_ATLAS_H", - "", - "#define POP_ENV_SHIFT %d" % ENV_SHIFT, - "#define POP_ENV_MASK %d" % ENV_MASK, - "#define POP_ENV_PAGES %d" % len(env_pages), - "#define POP_TILESETS 2", - "", - "/* Палитра: env-слоты, wall-слоты (спрайт-пиксель i -> база+i). */", - "#define POP_PAL_ENV 0x50", - "#define POP_PAL_WALL 0x60", - "", - "/* Палитры пока остаются отдельными файлами рядом с bg.arc. Имена", - " * видит только модуль загрузки, чтобы не размножать строки. */", - "#ifdef POP_BG_ATLAS_NAMES", - 'static const char *const pop_tile_pal[POP_TILESETS] = { %s };' - % ", ".join('"%stile.pal"' % p for p, _ in SETS.values()), - "#endif /* POP_BG_ATLAS_NAMES */", - "/* Пузырёк зелья: красный набор = id 16..22 (кадры оригинала),", - " зелёный (перо/переворот) и синий (вред/открыть) = те же кадры", - " под id %d..%d и %d..%d (draw_tile_anim, seg008:652). */" - % (POT_BUBBLE_GREEN_BASE, POT_BUBBLE_GREEN_BASE + len(POT_BUBBLE_IDS) - 1, - POT_BUBBLE_BLUE_BASE, POT_BUBBLE_BLUE_BASE + len(POT_BUBBLE_IDS) - 1), - "#define POP_POT_BUBB_GREEN %d" % POT_BUBBLE_GREEN_BASE, - "#define POP_POT_BUBB_BLUE %d" % POT_BUBBLE_BLUE_BASE, - "", - "#endif", - "", - ] - with open(out_path, "w") as f: - f.write("\n".join(lines)) - - -def main(): - global SRC_DIRS - set_name = sys.argv[1] if len(sys.argv) > 1 else "dungeon" - if set_name not in SETS: - die(f"набор '{set_name}': ожидался один из {', '.join(SETS)}") - prefix, dirs = SETS[set_name] - SRC_DIRS = dirs() - print(f"набор: {set_name} (источник {os.path.basename(SRC_DIRS[0])}, " - f"фолбэк {os.path.basename(SRC_DIRS[1])}), префикс {prefix}") - os.makedirs(OUT_DIR, exist_ok=True) - used = collect_used() - env_ids = sorted(set(id for ch, id in used if ch != R.CHTAB_WALL) - | CLIMB_OVERLAY_ENV_IDS # + пол-оверлей подъёма - | LOOSE_ANIM_ENV_IDS # + дрожащие кадры loose - | SPIKE_ANIM_ENV_IDS # + кадры выдвижения пик - | GATE_ANIM_ENV_IDS # + кадры открытия ворот - | GATE_TOP_ENV_IDS # + верх ворот (тайл сверху) - | {GATE_TOP_MASK_ID} # и его маска (mono) - | TORCH_ENV_IDS # + основание факела - | STUCK_ENV_IDS # + нажатая кнопка-closer - | CHOMPER_BOT_IDS # + чомпер: низ - | CHOMPER_TOP_IDS # верх - | CHOMPER_FORE_IDS # фронт (поверх Kid) - | CHOMPER_BLOOD_IDS # кровь (mono) - | CHOMPER_BLOOD_FORE_IDS - | OPENER_NOFLOOR_ENV_IDS # + opener без пола слева - | LEVELDOOR_ENV_IDS # + дверь уровня (створка/лестница) - | PALACE_ENV_IDS # + куски, что рисует только палас - | MIRROR_ENV_IDS) # + зеркало (ставится в рантайме) - wall_ids = sorted(id for ch, id in used if ch == R.CHTAB_WALL) - - env_bg = [i for i in env_ids if i not in FORE_ENV_IDS] - env_fore = [i for i in env_ids if i in FORE_ENV_IDS] - - # ENV фон -> страницы по id>>SHIFT - pages = {} - for id in env_bg: - w, h, pix = load_indexed(R.CHTAB_ENV, id, id in NO_TRANSP_ENV_IDS, - CHOMPER_BLOOD_COLOR if id in CHOMPER_BLOOD_IDS - else (POT_MASK_COLOR if id == GATE_TOP_MASK_ID - else None)) - pages.setdefault(id >> ENV_SHIFT, {})[id & ENV_MASK] = (w, h, pix) - max_pg = max(pages) if pages else -1 - env_page_names = [] - total_bytes = 0 - for pg in range(max_pg + 1): - if pg in pages: - nm = f"{prefix}env{pg}.atl" - cnt, sz = pack_atlas(os.path.join(OUT_DIR, nm), pages[pg]) - total_bytes += sz - env_page_names.append(nm) - print(f" {nm}: {len(pages[pg])} спрайтов, каталог {cnt}, {sz} Б") - else: - env_page_names.append(None) - print(f" (env стр {pg}: пусто)") - - # WALL -> idx=id - wall_entries = {id: load_indexed( - R.CHTAB_WALL, id, False, - PALACE_WALL_MONO_COLOR - if (set_name == "palace" and id in PALACE_WALL_MONO_IDS) - else None) - for id in wall_ids} - cnt, sz = pack_atlas(os.path.join(OUT_DIR, prefix + "wall.atl"), wall_entries) - total_bytes += sz - print(f" {prefix}wall.atl: {len(wall_ids)} спрайтов, каталог {cnt}, {sz} Б") - - # FORE -> idx=id - fore_entries = {id: load_indexed(R.CHTAB_ENV, id, False, - CHOMPER_BLOOD_COLOR - if id in CHOMPER_BLOOD_FORE_IDS else None) - for id in env_fore} - cnt, sz = pack_atlas(os.path.join(OUT_DIR, prefix + "fore.atl"), fore_entries) - total_bytes += sz - print(f" {prefix}fore.atl: {len(env_fore)} спрайтов, каталог {cnt}, {sz} Б") - - # POTION (chtab_1) -> idx=id: склянки + кадры пузырька + маска - # chtab_1 целиком (res151..res173 = id 1..23): пламя факелов, меч-предмет, - # склянки зелий. Пузырьки и их маска рисуются MONO-блитом — пакуем - # силуэтами в нужном цвете (см. POT_*_COLOR). - pot_entries = {} - for id in range(1, 24): - if id in POT_BUBBLE_IDS: - pot_entries[id] = load_potion(id, POT_BUBBLE_COLOR) - elif id == POT_MASK_ID: - pot_entries[id] = load_potion(id, POT_MASK_COLOR) - elif id in POT_FLAME_IDS: - # Пламя оригинал рисует blitters_0_no_transp (seg008 - # draw_tile_anim_right) — непрозрачным боксом поверх всего, что - # сзади. Все 9 кадров лежат на одном канвасе 16x18, поэтому - # непрозрачный блит сам стирает предыдущий кадр: heal не нужен. - pot_entries[id] = load_potion(id, opaque=True) - else: - pot_entries[id] = load_potion(id) - # Наборы пузырьков ДРУГИХ цветов: те же кадры другим mono-цветом. - # зелёный — типы 3/4 (перо, переворот), синий — типы 5/6 (вред, открыть). - for i, id in enumerate(POT_BUBBLE_IDS): - pot_entries[POT_BUBBLE_GREEN_BASE + i] = load_potion(id, POT_BUBBLE_GREEN_COLOR) - pot_entries[POT_BUBBLE_BLUE_BASE + i] = load_potion(id, POT_BUBBLE_BLUE_COLOR) - # chtab_1 (пламя/меч/зелья) от тайлсета НЕ зависит — пакуем один раз. - cnt, sz = pack_atlas(os.path.join(OUT_DIR, "pop_pot.atl"), pot_entries) - total_bytes += sz - print(f" pop_pot.atl (chtab_1: факелы+зелья): {len(pot_entries)} спрайтов, каталог {cnt}, {sz} Б") - - build_tileset_palette(os.path.join(OUT_DIR, prefix + "tile.pal")) - print(f" {prefix}tile.pal: 32 записи (env 0x50..0x5F + wall 0x60..0x6F)") - build_palette(os.path.join(OUT_DIR, "pop_bg.pal")) - write_header(str(P.GEN / "pop_bg_atlas.h"), env_page_names) - - n_pages = sum(1 for n in env_page_names if n) + 2 - print(f"ИТОГО: {len(env_bg)} env-фон + {len(wall_ids)} wall + " - f"{len(env_fore)} fore = {len(env_bg)+len(wall_ids)+len(env_fore)} спрайтов") - print(f" {n_pages} EMM-страниц, {total_bytes} Б на диске " - f"(+1КБ палитра), W2: {n_pages}×atlas_t = {n_pages*3} Б хэндлов") - print(f" -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_guard.py b/applications/SprPoP/tools/pop_pack_guard.py deleted file mode 100644 index 33b4d99..0000000 --- a/applications/SprPoP/tools/pop_pack_guard.py +++ /dev/null @@ -1,216 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_guard.py — упаковщик спрайтов СТРАЖА (chtab_5_guard, база 750). - -Оригинал грузит стражей из отдельного .DAT по типу уровня -(GUARD/FAT/SKEL/VIZIER/SHADOW, seg000:1092); уровень 1 — обычный «guard», -то есть data/GUARD/res(750+id).png. Палитра — НЕ из PNG: оригинал -подменяет её из res10.bin (guard_palettes, 7 палитр по 16 цветов, 6-бит) по -level.guards_color; на уровне 1 у обоих стражей color = 2. - -Выход: build/atl/guard/g0..gN.atl (по 8 спрайтов на страницу, адресация -id>>3 / id&7 — как у Kid) + группа палитры 0x90..0x9F в общий kid.pal -(его собирает pop_pack_kid.py, см. GUARD_PAL_BASE там). -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B -from pop_pack_kid import transpose_cols, vflip_page - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -# Набор спрайтов соперника выбирается ТИПОМ УРОВНЯ (load_lev_spr, seg000:1092): -# tbl_guard_type = {0 guard, 1 fat, 2 skeleton, 3 vizier, 4 shadow, −1 нет}. -# У обычного стража палитра подменяется из res10.bin по guards_color, у -# остальных наборов curr_guard_color = 0 (seg002:186) — значит цвет берётся -# из ФАЙЛА набора (res750.pal), и подменять его не надо. -SETS = { - "GUARD": ("GUARD", "guard", None), - "SKEL": ("SKEL", "skel", "res750.pal"), - "VIZIER": ("VIZIER", "vizier", "res750.pal"), -} -SET_NAME = "GUARD" -GUARD_DIR = str(P.SDLPOP_DATA / "GUARD") -PAL_BIN = str(P.SDLPOP_DATA / "PRINCE" / "res10.bin") -OUT_DIR = str(P.atl("guard")) -PAL_BASE = 0x90 # слоты палитры Sprinter под стража -COLOR = 2 # level.guards_color обоих стражей уровня 1 -SHIFT = 3 # g[id>>3], idx id&7 (спрайты крупные) -MASK = (1 << SHIFT) - 1 -MAX_ID = 33 # атлас-индексы 0..33 = res751..res784 - - -def select_set(name): - """Переключить упаковщик на набор (GUARD/SKEL/VIZIER): каталоги и число - кадров.""" - global SET_NAME, GUARD_DIR, OUT_DIR, MAX_ID - if name not in SETS: - B.die("неизвестный набор %s (есть: %s)" % (name, ", ".join(SETS))) - SET_NAME = name - src, out, _ = SETS[name] - GUARD_DIR = str(P.SDLPOP_DATA / src) - OUT_DIR = str(P.atl(out)) - # Сколько кадров реально есть в наборе (у скелета их меньше, чем у стража). - n = 0 - while os.path.exists(os.path.join(GUARD_DIR, f"res{751 + n}.png")): - n += 1 - MAX_ID = n - 1 - - -def set_palette(): - """16 цветов набора из его res750.pal (для наборов, где цвет НЕ - подменяется из res10.bin). None — у набора своей палитры нет.""" - fname = SETS[SET_NAME][2] - if fname is None: - return None - b = open(os.path.join(GUARD_DIR, fname), "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def load_guard(id): - """Атлас-индекс id (== frame.image) -> res(751+id).png -> (w, h, 8bpp - COLUMN-MAJOR); 0 -> 0xFF (прозрачность). - - Off-by-one как у Kid (см. pop_pack_kid.load_kid): load_chtab_from_file - зовётся с ресурсом 750, а images[i-1] = res(750+i), то есть images[0] = - res751. Рисование берёт get_image(chtab, obj_id+1 − 1) = images[image], - значит frame.image=N -> res(751+N). С res(750+N) страж стоял в позе - предыдущего кадра (замечено на frame_166_stand_inactive: image 17 - рисовался как res767 — выпад — вместо res768). """ - path = os.path.join(GUARD_DIR, f"res{751 + id}.png") - if not os.path.exists(path): - return None - im = Image.open(path) - if im.mode != "P": - B.die(f"res{750+id}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -NPAL = 7 # guard_palettes: 7 палитр по 16 цветов (res10.bin) - - -def guard_palette(color=None): - """16 цветов (r,g,b 0..63) из res10.bin для палитры color (1..7). - Индексация как в оригинале (seg003:257): &guard_palettes[0x30*color-0x30]. - color=None — палитра COLOR (та, что запекается в kid.pal по умолчанию).""" - if color is None: - color = COLOR - b = open(PAL_BIN, "rb").read() - off = 0x30 * color - 0x30 - return [(b[off + i * 3], b[off + i * 3 + 1], b[off + i * 3 + 2]) for i in range(16)] - - -def write_pal_header(out_path): - """Таблица ВСЕХ палитр стражей -> заголовок для приложения. - - Оригинал держит спрайты стража в одной палитре, а цвет подменяет на лету: - redraw_screen (seg003:255) зовёт set_chtab_palette(chtab_5_guard, - &guard_palettes[0x30*curr_guard_color - 0x30], 16) ПЕРЕД отрисовкой - комнаты, где curr_guard_color = level.guards_color[room-1] & 0x0F - (enter_guard, seg002:184). У нас спрайты уже лежат в индексах - PAL_BASE + v, поэтому достаточно залить 16 слотов палитры. - - Формат записи — родной для gfx_pal_load: 4 байта (B, G, R, 0).""" - rows = [] - for color in range(1, NPAL + 1): - vals = [] - for (r, g, b) in guard_palette(color): - # res10.bin хранит 6-битные каналы, палитра Sprinter — 8-битные - # (так же делает pop_pack_kid при записи kid.pal). - vals += [B.scale6to8(b), B.scale6to8(g), B.scale6to8(r), 0] - rows.append(" { " + ",".join("0x%02X" % v for v in vals) + " },") - lines = [ - "/* pop_guard_pal.h — палитры стражей (guard_palettes из res10.bin).", - " * СГЕНЕРЕНО toolchain/pop_pack_guard.py — НЕ править вручную.", - " *", - " * Индексация как в оригинале: цвет из level.guards_color[room-1]", - " * (младшие 4 бита), 1..%d -> строка [color-1]; 0 = палитру НЕ менять" % NPAL, - " * (seg003:255 при curr_guard_color == 0 set_chtab_palette не зовёт).", - " * Запись — 4 байта (B, G, R, 0), формат gfx_pal_load. */", - "#ifndef POP_GUARD_PAL_H", - "#define POP_GUARD_PAL_H", - "", - "#include ", - "", - "#define POP_GUARD_PAL_BASE 0x%02X /* слоты Sprinter под chtab_5 */" % PAL_BASE, - "#define POP_GUARD_NPAL %d" % NPAL, - "", - "static const uint8_t pop_guard_pal[POP_GUARD_NPAL][64] = {", - ] + rows + [ - "};", - "", - ] - # Палитры наборов со СВОИМ цветом (скелет, визирь) — из их res750.pal, а - # не из res10.bin: на таких уровнях curr_guard_color = 0 (seg002:186), и - # оригинал палитру не подменяет вовсе. - saved = SET_NAME - for name, cname, human in (("SKEL", "pop_skel_pal", "Скелет"), - ("VIZIER", "pop_vizier_pal", "Джафар")): - select_set(name) - pal = set_palette() - select_set(saved) - if not pal: - continue - vals = [] - for (r, g, b) in pal: - vals += [B.scale6to8(b), B.scale6to8(g), B.scale6to8(r), 0] - lines += [ - "/* %s (%s/res750.pal): свой набор — свой цвет. */" % (human, name), - "static const uint8_t %s[64] = {" % cname, - " " + ",".join("0x%02X" % v for v in vals) + ",", - "};", - "", - ] - lines += [ - "#endif", - "", - ] - with open(out_path, "w") as f: - f.write("\n".join(lines)) - print(f" pop_guard_pal.h: {NPAL} палитр x 16 цветов = {NPAL*64} Б -> {out_path}") - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - pages = {} - n = 0 - for id in range(0, MAX_ID + 1): - g = load_guard(id) - if g is None: - continue - pages.setdefault(id >> SHIFT, {})[id & MASK] = g - n += 1 - if not pages: - B.die("нет спрайтов стража") - total = 0 - for pg in range(max(pages) + 1): - nm = f"g{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages.get(pg, {})) - total += sz - # Зеркальный по вертикали набор — пара к kid*_v.atl (см. vflip_cols). - # ТОЛЬКО для обычного стража: зелье инверсии есть на уровне 9, а там - # tbl_guard_type = 0, то есть страж; скелет (уровень 3), визирь и - # жирный с переворотом не встречаются. Если чит U всё-таки включат - # на таком уровне, соперник нарисуется неперевёрнутым кадром — - # pop_vflip_page вернёт 0 (pop_vflip.h). - if SET_NAME == "GUARD": - _, szv = B.pack_atlas(os.path.join(OUT_DIR, f"g{pg}_v.atl"), - vflip_page(pages.get(pg, {}))) - total += szv - print(f" {nm}: {len(pages.get(pg, {}))} спрайтов, каталог {cnt}, {sz} Б") - write_pal_header(str(P.GEN / "pop_guard_pal.h")) - print(f"ИТОГО: {n} спрайтов стража, {max(pages)+1} EMM-страниц, {total} Б -> {OUT_DIR}") - - -if __name__ == "__main__": - if len(sys.argv) > 1: - select_set(sys.argv[1].upper()) - main() diff --git a/applications/SprPoP/tools/pop_pack_intro.py b/applications/SprPoP/tools/pop_pack_intro.py deleted file mode 100644 index 7e78394..0000000 --- a/applications/SprPoP/tools/pop_pack_intro.py +++ /dev/null @@ -1,353 +0,0 @@ -#!/usr/bin/env python3 -"""Упаковка story/PV intro SDLPoP в полосы SPA1 для Sprinter. - -Исходники остаются единственным источником истины: TITLE/res41..45, res51 и -PV/res800/850/950/980. Runtime получает только готовые 320x200 композиции -и 256-цветные палитры. Это намеренно переносит смешивание палитров Princess, -Jaffar, спальни и кровати из ограниченного Z80 в build-time. -""" -from pathlib import Path - -from PIL import Image - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -ROOT = Path(__file__).resolve().parent.parent -TITLE = P.SDLPOP_DATA / "TITLE" -PV = P.SDLPOP_DATA / "PV" -PRINCE = P.SDLPOP_DATA / "PRINCE" -KID = P.SDLPOP_DATA / "KID" -OUT = P.atl("pv") - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - -# ФОН ТЕКСТОВОЙ РАМКИ — ОТДЕЛЬНЫЙ ИНДЕКС. У оригинала это индекс 14 в -# строке палитры спрайтов title40, и load_title_images() красит его либо в -# #100060 (интро), либо в #800000 (финал, seg001:586). Раньше мы -# ремапили 14 в 9 — «тёмно-синий» палитры res51; подменить его нельзя, -# потому что тем же индексом нарисована сама титульная картинка (8265 -# пикселей). Поэтому фон уезжает в свободный индекс, и финал красит -# только его (pop_pal_story_ending). -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) -# Цвет текста таблицы рекордов: 0xB7 оригинала = седьмой цвет палитры -# title (224,160,0). Глифы шрифта запечены индексом POP_FONT_COLOR, так -# что цвет им даёт именно эта запись; тёмный набор (POP_FONT_DARK_COLOR) -# остаётся чёрным — старшие записи story.pal и так чёрные. -STORY_FONT_INDEX = 0x3F - - -def transpose_cols(width: int, height: int, rowmajor: bytes) -> bytes: - """Row-major -> column-major для бесплатного horizontal flip в BGI.""" - out = bytearray(width * height) - for column in range(width): - base = column * height - for row in range(height): - out[base + row] = rowmajor[row * width + column] - return bytes(out) - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"intro atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def sprite_atlas(path: Path, entries: dict[int, tuple[int, int, bytes]]) -> None: - """Атлас небольших прозрачных кадров, целиком живущий в одной EMM. - - В отличие от atlas_blob() для полноэкранной полосы, здесь нужен каталог - нескольких картинок: runtime держит страницу открытой всю PV-сцену и - переключает только idx. Пустые индексы не требуются — все наборы ниже - нумеруются подряд с нуля. - """ - count = len(entries) - if not count or count > 255: - raise SystemExit(f"{path}: bad sprite atlas count {count}") - data_off = ATL_DIR_OFF + count * 8 - directory = bytearray(count * 8) - blobs = bytearray() - for idx in range(count): - width, height, pixels = entries[idx] - offset = data_off + len(blobs) - blobs += width.to_bytes(2, "little") + height.to_bytes(2, "little") - blobs += pixels - d = idx * 8 - directory[d:d + 2] = offset.to_bytes(2, "little") - directory[d + 2] = width - directory[d + 3] = height - directory[d + 4] = directory[d + 5] = 1 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = count - out[ATL_DIR_OFF:ATL_DIR_OFF + len(directory)] = directory - out += blobs - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"{path}: {len(out)} B > one EMM page") - path.write_bytes(out) - - -def sprite_frames(directory: Path, first: int, last: int, - color_base: int, column_major: bool = False - ) -> dict[int, tuple[int, int, bytes]]: - """PNG-кадры -> getimage. Ноль PNG становится прозрачным 0xFF BGI.""" - result = {} - for index, number in enumerate(range(first, last + 1)): - image = png(directory, number) - pixels = bytes(0xFF if pixel == 0 else color_base + pixel - for pixel in image.tobytes()) - if column_major: - pixels = transpose_cols(image.width, image.height, pixels) - result[index] = image.width, image.height, pixels - return result - - -def png(directory: Path, number: int) -> Image.Image: - image = Image.open(directory / f"res{number}.png") - if image.mode != "P": - raise SystemExit(f"res{number}.png: expected indexed PNG, got {image.mode}") - return image.copy() - - -def pal_file(path: Path) -> list[tuple[int, int, int]]: - """16 цветов из .pal ресурса (4 байта заголовка, дальше RGB по 6 бит).""" - raw = path.read_bytes() - return [(raw[4 + i * 3] << 2, raw[5 + i * 3] << 2, raw[6 + i * 3] << 2) - for i in range(16)] - - -def palette(image: Image.Image) -> list[tuple[int, int, int]]: - raw = image.getpalette() - return [tuple(raw[index * 3:index * 3 + 3]) for index in range(16)] - - -def write_palette(path: Path, entries: list[tuple[int, int, int]], - extra=None) -> None: - """B,G,R,0 — ровно формат gfx_pal_fload; незадействованное чёрное.""" - out = bytearray() - entries = (entries + [(0, 0, 0)] * 256)[:256] - for index, color in (extra or {}).items(): - entries[index] = color - for red, green, blue in entries: - out += bytes((blue, green, red, 0)) - path.write_bytes(out) - - -def write_scene(prefix: str, number: int, canvas: Image.Image) -> None: - if canvas.size != (320, 200): - raise SystemExit(f"{prefix}{number}: expected 320x200, got {canvas.size}") - for part, top in enumerate(range(0, 200, STRIP_H)): - band = canvas.crop((0, top, 320, min(top + STRIP_H, 200))) - (OUT / f"{prefix}{number}_{part}.atl").write_bytes( - atlas_blob(band.tobytes(), band.width, band.height)) - - -def story_scenes() -> list[Image.Image]: - """show_title/end_sequence в единой с title палитре. - - res41 кодирует тёмный фон индексом 14, а его палитра делает этот индекс - чёрным; show_title() SDLPoP подменяет его #100060 либо #800000. Тексты - res42..45 имеют индекс 1, но этот индекс у res41 тоже тёмный; ремап на - индекс title/res51 15 (белый) позволяет проявлять историю прямо поверх - последнего title-экрана без смены палитры. Фон уезжает в - STORY_BG_INDEX, чтобы финал мог покрасить его отдельно. - - Последний экран — фон таблицы рекордов: та же рамка плюс логотип - PRINCE OF PERSIA на y=24 (HOF_POP оригинала — тот же спрайт res54, что - и в титрах, только выше). - """ - frame_raw = bytearray(png(TITLE, 41).tobytes()) - for offset, pixel in enumerate(frame_raw): - if pixel == 14: - frame_raw[offset] = STORY_BG_INDEX - frame = Image.frombytes("P", (320, 200), bytes(frame_raw)) - result = [] - for text_number, ypos in ((42, 25), (43, 25), (45, 26), (44, 25)): - canvas = frame.copy() - raw = bytearray(canvas.tobytes()) - text = png(TITLE, text_number) - for sy in range(text.height): - for sx in range(text.width): - if text.getpixel((sx, sy)): - raw[(ypos + sy) * 320 + 24 + sx] = 15 - canvas.frombytes(bytes(raw)) - result.append(canvas) - result.append(frame) - - hof = frame.copy() - raw = bytearray(hof.tobytes()) - logo = png(TITLE, 54) - for sy in range(logo.height): - for sx in range(logo.width): - pixel = logo.getpixel((sx, sy)) - if pixel: # blitters_10h_transp: 0 сквозной - raw[(24 + sy) * 320 + 24 + sx] = pixel - hof.frombytes(bytes(raw)) - result.append(hof) - return result - - -def pv_palette_canvas() -> tuple[Image.Image, list[tuple[int, int, int]]]: - """Спальня + bed. Номера 0..15=room, 16..31=Princess, - 32..47=Jaffar, 48..63=bed. Благодаря этому у смешанных PNG не теряются - исходные цвета при одном gfx_pal_fload() на весь PV.""" - room = png(PV, 951) - bed = png(PV, 981) - raw = bytearray(room.tobytes()) - bed_raw = bed.tobytes() - for sy in range(bed.height): - for sx in range(bed.width): - pixel = bed_raw[sy * bed.width + sx] - if pixel: - raw[(142 + sy) * 320 + sx] = 48 + pixel - canvas = Image.frombytes("P", room.size, bytes(raw)) - # 80..95 — пламя факелов. Это отдельный chtab PRINCE в оригинале; без - # отдельной строки цвета динамические кадры становились бы цветами стены. - # 112..127 (0x70) — палитра КИДА: на PV-экране финала и сцен 8/9 он и - # мышь рисуются СВОИМИ атласами (chtab_2), а их индексы запечены под - # игровые слоты 0x70. Без этой строки они выходили бы чёрными. - return (canvas, palette(room) + palette(png(PV, 801)) + - palette(png(PV, 851)) + palette(bed) + palette(png(PV, 901)) + - palette(png(PRINCE, 151)) + [(0, 0, 0)] * 16 + - pal_file(KID / "res400.pal")) - - -def sprite_paste(dst: Image.Image, sprite: Image.Image, x: int, floor: int, - color_base: int) -> None: - """Положить спрайт ногами на floor, remap его палитру в отдельную строку.""" - raw = bytearray(dst.tobytes()) - src = sprite.tobytes() - y = floor - sprite.height - for sy in range(sprite.height): - dy = y + sy - if dy < 0 or dy >= 200: - continue - for sx in range(sprite.width): - dx = x + sx - pixel = src[sy * sprite.width + sx] - if pixel and 0 <= dx < 320: - raw[dy * 320 + dx] = color_base + pixel - dst.frombytes(bytes(raw)) - - -def pv_scenes() -> tuple[list[Image.Image], list[tuple[int, int, int]]]: - base, colors = pv_palette_canvas() - - # Позиции Char из init_princess()/init_vizier(): x=120/198, y=166. - # В оригинале точный offset задаёт frame table; статические композиции - # выравнивают персонажей по полу y=166, не хранят таблицы PV-анимации. - waiting = base.copy() - sprite_paste(waiting, png(PV, 801), 110, 166, 16) - - jaffar = waiting.copy() - sprite_paste(jaffar, png(PV, 851), 188, 166, 32) - - magic = base.copy() - sprite_paste(magic, png(PV, 805), 110, 166, 16) - sprite_paste(magic, png(PV, 870), 188, 166, 32) - # res953 — первый полный кадр песочных часов; он использует палитру room. - sprite_paste(magic, png(PV, 953), 18, 166, 0) - - alone = base.copy() - sprite_paste(alone, png(PV, 816), 110, 166, 16) - sprite_paste(alone, png(PV, 959), 18, 166, 0) - - # FG9: статические ключевые позы тех же scene 2/4/6/8/9/12. PV2 - # использует второй набор Princess (res900), поэтому он лежит в строке - # палитры 64..79. Мышь в оригинале меняет только короткую позу рядом с - # Princess; здесь соответствующая стадия выделена отдельным кадром. - stand = base.copy() - sprite_paste(stand, png(PV, 801), 134, 166, 16) - - lying = base.copy() - sprite_paste(lying, png(PV, 901), 78, 162, 64) - # Часы для cutscene_4 выбираются runtime по оставшимся минутам и - # анимируются вместе с песком; в статической основе их быть не должно. - - mouse = base.copy() - sprite_paste(mouse, png(PV, 920), 120, 169, 64) - sprite_paste(mouse, png(PV, 959), 18, 166, 0) - - short_time = base.copy() - sprite_paste(short_time, png(PV, 816), 146, 166, 16) - sprite_paste(short_time, png(PV, 953), 18, 166, 0) - - return [waiting, jaffar, magic, alone, stand, lying, mouse, short_time], colors - - -def pv_animation_assets() -> None: - """Ресурсы покадрового intro. - - `b0_*` — единственный чистый фон. Он копируется accelerator-ом между - обеими экранными страницами; спрайты рисуются банком без shadow, так что - следующий кадр автоматически начинает с фона. Каждый actor-атлас <=16K, - поэтому нет чтения 320x200 с HDD в анимационном цикле. - """ - base, _ = pv_palette_canvas() - write_scene("b", 0, base) - # frame_tbl_cuts из SDLPoP адресует Princess как image 0..16 ресурса - # 800 (то есть PNG res801..817). Для Jaffar PV1 адресуется ресурс 850: - # image 0..37 = res851..888. Все 38 кадров не помещаются в одну EMM, - # поэтому сохраняем их тремя последовательными атласами. Runtime знает - # границы, но номер кадра остаётся исходным image-id 0..37. - sprite_atlas(OUT / "a0.atl", sprite_frames(PV, 801, 817, 16, True)) - sprite_atlas(OUT / "j0.atl", sprite_frames(PV, 851, 863, 32, True)) - sprite_atlas(OUT / "j1.atl", sprite_frames(PV, 864, 874, 32, True)) - sprite_atlas(OUT / "j2.atl", sprite_frames(PV, 875, 888, 32, True)) - # ВТОРОЙ набор Princess (PV2, res901..930 = image 0..29 ресурса 900). - # Он нужен сценам 8/9 (сидит и гладит мышь, встаёт, приседает) и финалу - # (поворачивается и обнимает Кида) — поз PV1 для этого не хватает. - # 26.7 КБ не влезают в одну EMM, поэтому два атласа; номер кадра при - # этом остаётся исходным image-id 0..29, границу знает runtime. - # Палитровая строка 64..79 — та же, что у PV2 в статических сценах. - sprite_atlas(OUT / "a1.atl", sprite_frames(PV, 901, 917, 64, True)) - sprite_atlas(OUT / "a2.atl", sprite_frames(PV, 918, 930, 64, True)) - # res953/res954 — состояния часов, res960..962 — три фазы песка. - sprite_atlas(OUT / "h0.atl", sprite_frames(PV, 952, 962, 0)) - sprite_atlas(OUT / "t0.atl", sprite_frames(PRINCE, 151, 159, 80)) - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - - stories = story_scenes() - write_palette(OUT / "story.pal", palette(png(TITLE, 51)), - {STORY_BG_INDEX: STORY_BG_COLOR, - STORY_FONT_INDEX: (224, 160, 0)}) - for number, scene in enumerate(stories): - write_scene("s", number, scene) - - scenes, colors = pv_scenes() - write_palette(OUT / "pv.pal", colors) - for number, scene in enumerate(scenes): - write_scene("p", number, scene) - - pv_animation_assets() - - print(f"{OUT}: {len(stories)} story + 8 PV compositions + base x 5 strips, " - f"6 animated actor atlases, one strip/page <= {STRIP_H} rows") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_kid.py b/applications/SprPoP/tools/pop_pack_kid.py deleted file mode 100644 index 682b1a8..0000000 --- a/applications/SprPoP/tools/pop_pack_kid.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_kid.py — упаковщик спрайтов персонажа Kid (Фаза K0 порта). - -Аналог pop_pack_bg.py, но для chtab_2_kid (база ресурса 400): image id N -= res(400+N).png (data/KID), палитра res400.pal (16 цветов) -> слоты -Sprinter 0x70-0x7F (env 0x50 / wall 0x60 заняты фоном). Пиксель i: -0->0xFF (прозрач), i->0x70+i. - -Прямая адресация (ноль remap в W2): kid[img>>5], idx img&31. Дырки — -фейковые записи (как в фоне). Переиспользует pack_atlas/blob/scale6to8 -из pop_pack_bg. - -Выход: build/atl/kid/kid0..N.atl + зеркальные атласы + kid.pal. -Количество страниц рантайм получает из сгенерированного описания kid_arc.h. -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B # pack_atlas, blob, scale6to8, ENV_SHIFT - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -KID_DIR = str(P.SDLPOP_DATA / "KID") -OUT_DIR = str(P.atl("kid")) -PAL_BASE = 0x70 # слоты палитры Sprinter под Kid -SWORD_PAL_BASE = 0x80 # chtab_0 (меч в руке) -> слоты 0x80..0x8F -GUARD_PAL_BASE = 0x90 # chtab_5 (страж) -> слоты 0x90..0x9F -# chtab_0 целиком: sword_tbl (seg006:2047) адресует id 0..33 — подъём меча, -# ножны И вся боёвка. Меч в оригинале ОДИН на всех: и Кид, и страж рисуют -# клинок из этого же chtab_0 (add_sword_to_objtable, seg006:1798). -SWORD_IDS = tuple(range(0, 34)) -SHIFT = 3 # kid[img>>3], idx img&7 (Kid-кадры крупные: 8/стр ≤16КБ) -MASK = (1 << SHIFT) - 1 - - -def transpose_cols(w, h, rowmajor): - """row-major (pix[row*w+col]) -> column-major (out[col*h+row]). - Спрайты Kid хранятся КОЛОНКАМИ: gfx_blit_cols рисует вертикальным accel- - проходом (даёт бесплатный горизонтальный флип реверсом порядка колонок; - см. memory/accel_vertical_copy). Заголовок getimage (w,h) не меняется.""" - out = bytearray(w * h) - for col in range(w): - base = col * h - for row in range(h): - out[base + row] = rowmajor[row * w + col] - return bytes(out) - - -def vflip_cols(w, h, colmajor): - """COLUMN-MAJOR (out[col*h + row]) -> тот же формат, но кадр ЗЕРКАЛЕН ПО - ВЕРТИКАЛИ: внутри каждой колонки байты идут снизу вверх. - - Зачем отдельный набор. Спрайты персонажей лежат колонками ради - БЕСПЛАТНОГО горизонтального флипа (accel копирует колонки, направление - задаётся знаком страйда). Вертикальное зеркало у такой раскладки — это - разворот байтов ВНУТРИ колонки, а accel копирует блок только вперёд: - в рантайме это стоит ~0.6 с на страницу (замер MAME 2026-08-12), тогда - как ГОТОВАЯ страница читается с диска за 0.045 с. Поэтому зелье - инверсии (уровень 9) обслуживается вторым набором файлов *_v.atl. - Раскладка каталога у него та же — движку достаточно подменить номер - EMM-страницы (см. src/pop_vflip.h).""" - out = bytearray(len(colmajor)) - for col in range(w): - b = col * h - out[b:b + h] = colmajor[b:b + h][::-1] - return bytes(out) - - -def vflip_page(page): - """{idx: (w,h,pix)} -> то же с зеркальными по вертикали пикселями.""" - return {i: (w, h, vflip_cols(w, h, pix)) for i, (w, h, pix) in page.items()} - - -def load_kid(aidx): - """Атлас-индекс aidx (== frame.image) -> res(401+aidx).png -> (w, h, 8bpp - COLUMN-MAJOR). 0->0xFF, i->0x70+i. Пиксели транспонированы в колонки. - - МАППИНГ (seg008.c:1589): персонаж рисуется add_midtable(chtab, obj_id+1), - внутри get_image(chtab, id-1)=get_image(chtab, obj_id) -> chtab-индекс = - frame.image; первая картинка chtab_2_kid = res401 (res400 = палитра). - Значит frame.image=N -> res(401+N). Раньше грузили res(400+N) — off-by-one: - стойка frame_15 (image 14) рисовалась res414 (беговой наклон) вместо res415 - (прямая стойка).""" - path = os.path.join(KID_DIR, f"res{401 + aidx}.png") - if not os.path.exists(path): - return None - im = Image.open(path) - if im.mode != "P": - B.die(f"res{401+aidx}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -def load_sword(id): - """chtab_0 (меч в руке): sword_tbl[].id = N -> res(700+N+1).png в data/PRINCE - (в оригинале add_midtable(chtab, obj_id+1) -> get_image(chtab, obj_id)). - Пиксели, как у Kid, COLUMN-MAJOR (gfx_blit_cols + бесплатный флип).""" - path = os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), B.POT_DIR_NAME, - f"res{700 + id + 1}.png") - if not os.path.exists(path): - B.die(f"нет файла {path}") - im = Image.open(path) - if im.mode != "P": - B.die(f"res{700+id+1}: mode {im.mode}, ожидался P") - src = im.tobytes() - rowmajor = bytes((0xFF if v == 0 else SWORD_PAL_BASE + v) for v in src) - return im.width, im.height, transpose_cols(im.width, im.height, rowmajor) - - -def _read16(path): - b = open(path, "rb").read() - return [(b[4 + i * 3], b[4 + i * 3 + 1], b[4 + i * 3 + 2]) for i in range(16)] - - -def build_palette(out_path): - """ЕДИНАЯ игровая палитра (gfx_pal_fload пишет с индекса 0, перезатирая - всё — bg и Kid обязаны жить в одном файле): chtab_1@0x40 (пламя/зелья), - env@0x50, wall@0x60, kid@0x70. - """ - pal = bytearray(256 * 4) - groups = [ - (0x50, os.path.join(B.R.VDUNGEON_DIR, "res200.pal")), # env - (0x60, os.path.join(B.R.VDUNGEON_DIR, "res360.pal")), # wall - (PAL_BASE, os.path.join(KID_DIR, "res400.pal")), # kid 0x70 - (B.POT_PAL_BASE, os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), - B.POT_DIR_NAME, "res150.pal")), # chtab_1 0x40 - (SWORD_PAL_BASE, os.path.join(os.path.dirname(B.R.VDUNGEON_DIR), - B.POT_DIR_NAME, "res700.pal")), # chtab_0 0x80 - ] - # 16 базовых цветов экрана (mono-блит красит ими: пламя, пузырьки зелья) - for i, (r, g, bl) in enumerate(B.VGA16): - o = (B.VGA16_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - for base, path in groups: - for i, (r, g, bl) in enumerate(_read16(path)): - o = (base + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - # Палитра стража берётся НЕ из .pal, а из res10.bin (guard_palettes: - # 7 палитр по 16 цветов, 6-бит) по level.guards_color; на уровне 1 у - # обоих стражей color = 2. См. toolchain/pop_pack_guard.py. - import pop_pack_guard as G - for i, (r, g, bl) in enumerate(G.guard_palette()): - o = (GUARD_PAL_BASE + i) * 4 - pal[o:o + 4] = bytes((B.scale6to8(bl), B.scale6to8(g), B.scale6to8(r), 0)) - - with open(out_path, "wb") as f: - f.write(pal) - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - # атлас-индексы aidx (== frame.image), для которых есть res(401+aidx).png - ids = [] - for aidx in range(0, 255): - if os.path.exists(os.path.join(KID_DIR, f"res{401 + aidx}.png")): - ids.append(aidx) - if not ids: - B.die("нет спрайтов KID") - - pages = {} - for id in ids: - w, h, pix = load_kid(id) - pages.setdefault(id >> SHIFT, {})[id & MASK] = (w, h, pix) - - max_pg = max(pages) - names = [] - total = 0 - for pg in range(max_pg + 1): - if pg in pages: - nm = f"kid{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages[pg]) - total += sz - names.append(nm) - print(f" {nm}: {len(pages[pg])} спрайтов, каталог {cnt}, {sz} Б") - # Зеркальный по вертикали набор (зелье инверсии, уровень 9). - nmv = f"kid{pg}_v.atl" - _, szv = B.pack_atlas(os.path.join(OUT_DIR, nmv), vflip_page(pages[pg])) - total += szv - else: - names.append(None) - print(f" (kid стр {pg}: пусто)") - - # chtab_0: меч в руке — весь chtab (id 0..33), индекс в атласе = id. - sw = {} - for i, id in enumerate(SWORD_IDS): - w, h, pix = load_sword(id) - sw[i] = (w, h, pix) - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, "sword.atl"), sw) - total += sz - _, szv = B.pack_atlas(os.path.join(OUT_DIR, "sword_v.atl"), vflip_page(sw)) - total += szv - print(f" sword.atl (chtab_0, id {SWORD_IDS[0]}..{SWORD_IDS[-1]}): " - f"{len(sw)} спрайтов, каталог {cnt}, {sz} Б") - - build_palette(os.path.join(OUT_DIR, "kid.pal")) - - print(f"ИТОГО: {len(ids)} спрайтов Kid, {len(names)} EMM-страниц, " - f"{total} Б диск (+1КБ палитра) -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_music.py b/applications/SprPoP/tools/pop_pack_music.py deleted file mode 100644 index 09920fa..0000000 --- a/applications/SprPoP/tools/pop_pack_music.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_music.py — музыка PoP в сырой поток для CBL. - -Источник — готовые записи DOS-версии (assets/orig/PoP1_DOS_music). -Набор выбирается ключом --format: flac (по умолчанию), mp3, ogg, mt32. Оцифровки музыки в самой игре НЕТ: в digisnd*.dat лежат -только эффекты, а музыка хранится как MIDI под Adlib. Поэтому здесь мы -не «конвертируем ресурс игры», а укладываем готовую запись в формат, -который наше железо играет без единого преобразования в рантайме. - -ФОРМАТ — тот же, что у эффектов (см. pop_pack_sound.py и sound_plan.md): -8 бит БЕЗЗНАКОВЫЙ моно на 10 937,5 Гц — ровно CBL_FREQ_10K9. Частоту -берём не 11 000, а частоту железа: тогда CBL открывается ОДИН раз за -запуск и не переключается ни между эффектами, ни при переходе на музыку. - -ОДИН ФАЙЛ НА ТРЕК. Резать его на куски не нужно: читаем порциями по -16 КБ из ОДНОГО открытого файла (`bank_read_page` + `lseek`), и «дорогой» -open платится раз на трек, а не на каждую страницу — замер 2026-08-25: -open 51,4 мс против 32,6 мс на чтение 16 КБ. Этот же путь работает для -финального `won` (1,2 МБ), который в память целиком не помещается и -обязан подгружаться по ходу. - -Хвост дополняется тишиной (0x80) до кратности 128: насос отдаёт CBL -блоками по 128 байт, и остаток «не полного блока» ему пришлось бы -досчитывать в прерывании. - -Длина трека уходит в MUS/mus.idx блоками по 128 байт, а не байтами: -самый длинный трек (won, 115 с) — это 1,2 МБ, что не влезает в uint16, а -в блоках даёт 9855. 32-битной арифметики на Z80 избегаем (см. memory -avoid_32bit_arith_z80). -""" -import subprocess -import sys -from pathlib import Path - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) -import pop_idx # формат дискового индекса PMI1 (tools/pop_idx.py) - -# Формат источника выбирается ключом --format (по умолчанию flac — он же -# лучший по качеству исходник). Каталог и расширение знает tools/paths.py. -FMT = "flac" -SRC_DIR, SRC_EXT = P.music_src(FMT) -OUT_DIR = P.atl("music") -OUT_IDX = "mus.idx" # дисковый индекс набора, ложится в MUS/ рядом с треками - -CBL_RATE = 10937.5 # CBL_FREQ_10K9 — частота железа, не 11 000 -PAGE = 16384 # EMM-страница -BLOCK = 128 # порция насоса CBL -SILENCE = 0x80 # центр беззнакового 8-битного сэмпла - -# id — нумерация звуков ОРИГИНАЛА (SDLPoP data/music/names.txt). Держим её, -# чтобы игровой код просил трек тем же номером, каким оригинал зовёт -# play_sound, и таблицу можно было сверить глазами. -TRACKS = { - 24: "regular_death", - 25: "find_mirror_and_find_shadow", - 26: "embrace", - 27: "cutscene_before_2_4_6_12", - 28: "fight_death", - 29: "meet_Jaffar", - 30: "life_potion", - 32: "end_level_4_and_killed_by_shadow", - 33: "potion", - 35: "cutscene_before_8_9", - 36: "out_of_time", - 37: "guard_death_and_obtaining_the_sword", - 39: "floating", - 40: "cutscene_not_much_time_left", - 41: "story_5_level_end_and_merge_with_shadow", - 43: "killed_Jaffar", - 50: "story_2_princess", - 52: "story_4_Jaffar_leaves", - 53: "story_3_Jaffar_enters", - 54: "intro_theme", - 55: "story_1_absence", - 56: "won", -} - - -def decode(path: Path) -> bytes: - """запись любого формата -> сырой u8 моно на частоте CBL.""" - out = subprocess.run( - ["ffmpeg", "-v", "error", "-i", str(path), - "-ac", "1", "-ar", str(int(CBL_RATE)), "-f", "u8", "-"], - capture_output=True, check=True) - return out.stdout - - -def pack(track_id: int, name: str) -> tuple[int, int]: - src = SRC_DIR / f"{name}{SRC_EXT}" - if not src.exists(): - raise SystemExit(f"нет источника: {src}") - data = bytearray(decode(src)) - - # Добить до кратности блока насоса — хвост тишиной, а не обрезкой: - # обрезать значило бы щёлкнуть на последнем сэмпле. - tail = len(data) % BLOCK - if tail: - data += bytes([SILENCE]) * (BLOCK - tail) - - chunks = (len(data) + PAGE - 1) // PAGE - OUT_DIR.mkdir(parents=True, exist_ok=True) - (OUT_DIR / f"m{track_id:02d}.bin").write_bytes(bytes(data)) - return chunks, len(data) // BLOCK - - -def main() -> None: - global FMT, SRC_DIR, SRC_EXT - args = sys.argv[1:] - if args and args[0] == "--format": - FMT = args[1] - SRC_DIR, SRC_EXT = P.music_src(FMT) - args = args[2:] - wanted = [int(a) for a in args] or sorted(TRACKS) - print(f"музыка из набора {FMT}: {SRC_DIR}") - rows = [] - total = 0 - for tid in wanted: - if tid not in TRACKS: - raise SystemExit(f"неизвестный трек {tid}") - chunks, blocks = pack(tid, TRACKS[tid]) - rows.append((tid, TRACKS[tid], chunks, blocks)) - total += blocks * BLOCK - print(f" {tid:2d} {TRACKS[tid]:<40} {chunks:2d} стр, " - f"{blocks * BLOCK / 1024:7.1f} КБ, {blocks * BLOCK / CBL_RATE:5.1f} с") - - # ДИСКОВЫЙ ИНДЕКС набора: длины треков и длительности реплик. Пока - # печатаются и заголовки выше — переход на runtime идёт по шагам, и - # индекс обязан описывать ровно то же, что они (docs/music_runtime_index_plan.md). - # Тики считает pop_idx.mus_ticks — общая формула для обеих сторон. - if len(rows) != len(TRACKS): - print(f" ВНИМАНИЕ: упаковано {len(rows)} треков из {len(TRACKS)} — " - f"индекс описывает только их") - entries = [(0, 0)] * pop_idx.MUS_COUNT - for tid, _name, _chunks, blocks in rows: - entries[tid] = (blocks, pop_idx.mus_ticks(blocks)) - (OUT_DIR / OUT_IDX).write_bytes(pop_idx.mus_pack(entries)) - print(f"индекс: {OUT_DIR / OUT_IDX}") - print(f"итого {total / 1024:.0f} КБ в {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_shadow.py b/applications/SprPoP/tools/pop_pack_shadow.py deleted file mode 100644 index 968cb4b..0000000 --- a/applications/SprPoP/tools/pop_pack_shadow.py +++ /dev/null @@ -1,284 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_shadow.py — упаковщик спрайтов ТЕНИ. - -ЗАЧЕМ ОТДЕЛЬНЫЙ НАБОР. Оригинал не хранит спрайтов Тени вовсе: он кладёт -обычный спрайт ДВАЖДЫ — в x обычным прозрачным блитом, и в x+1 «блиттером -XOR» (draw_objtable_item, seg008.c:1600). Наш пакетный блит так не умеет, -поэтому результат запекается заранее, здесь. - -ЧТО ИМЕННО ДЕЛАЕТ ОРИГИНАЛ (проверено по исходнику, не по памяти): - - * `blitters_2_or` — НЕ побитовое ИЛИ. В SDLPoP это обычный блит с - colour key = индекс 0 (method_6_blit_img_to_scr, seg009.c:3306), то - есть один в один наш прозрачный блит. - * `blitters_3_xor` работает по 24-битному RGB, а не по индексам палитры - (blit_xor, seg009.c:3190: конвертация в 24 бита, затем `*p_dest ^= - *p_src` побайтно). Прозрачности у него нет — XOR'ится весь - прямоугольник, но прозрачный пиксель это чёрный 0x000000, а XOR с - нулём ничего не меняет. - -Отсюда своя палитра: XOR двух цветов игровой палитры даёт цвет, которого в -ней нет. - -ЕДИНСТВЕННОЕ РАСХОЖДЕНИЕ. XOR считается по тому, что УЖЕ на экране, то -есть зависит от фона. Разбор по пикселям: от фона зависит только кайма в -один пиксель по ЛЕВЫМ кромкам силуэта (там, где спрайт прозрачен в x, но -непрозрачен в x−1). На чёрном фоне `фон XOR цвет == цвет`, и запечка -точна; Тень почти всегда на чёрном. Мы печём именно этот случай. - -ДВА НАБОРА В ОДНОМ АТЛАСЕ. Набор спрайтов у оригинала выбирает НЕ -персонаж, а поле `sword` самого кадра: load_frame_to_obj (seg008.c:1752) -держит chtab_base жёстко равным chtab_2 и прибавляет `sword >> 6`. У всех -кадров frame_table_kid эти биты нулевые, у всех кадров frame_tbl_guard — -0xC0. Тень берёт таблицу стража для кадров 150..189 (seg006.c:533), то -есть идёт через chtab_5, а chtab_5 на 12-м уровне грузится из SHADOW.DAT -(tbl_guard_type[12] == 4, seg000.c:1117) — и это графика КИДА в боевых -позах, а не стража. Поэтому печём обе половины: - - KID — data/KID/res(401+id).png, id 0..218 -> sk0..skN.atl - SHADOW — data/SHADOW/res(751+id).png, id 0..31 -> sf0..sfM.atl - -Выход: build/atl/shadow/sk*.atl + sf*.atl + pop_shadow_atlas.h (палитра -внутри заголовка — 16 записей, её заливает приложение через gfx_pal_load). -""" -import os -import sys -from PIL import Image - -HERE = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, HERE) -import pop_pack_bg as B -from pop_pack_kid import transpose_cols - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -DATA = str(P.SDLPOP_DATA) -OUT_DIR = str(P.atl("shadow")) -PAL_BASE = 0xA0 # слоты Sprinter под Тень: 0xA0..0xAF -NCOL = 16 # столько цветов в палитре Тени -SHIFT = 3 # sk[id>>3], idx id&7 — как у Kid (кадры крупные) -MASK = (1 << SHIFT) - 1 - -# Половины набора: (каталог, база ресурса, префикс выходных файлов). -# Off-by-one тот же, что у Kid и стража: images[0] = res(база+1), значит -# frame.image = N -> res(база+1+N) (см. pop_pack_kid.load_kid). -HALVES = (("KID", 400, "sk"), - ("SHADOW", 750, "sf")) - - -def frames(dirname, base): - """Все кадры половины: [(id, w, h, [[rgb|None]...])] — уже после - наложения XOR, в честном RGB.""" - out = [] - id = 0 - while True: - path = os.path.join(DATA, dirname, f"res{base + 1 + id}.png") - if not os.path.exists(path): - break - im = Image.open(path) - if im.mode != "P": - B.die(f"{path}: mode {im.mode}, ожидался P") - pal = im.getpalette()[:NCOL * 3] - rgb = [tuple(pal[i * 3:i * 3 + 3]) for i in range(NCOL)] - w, h = im.size - px = im.load() - grid = [] - for y in range(h): - # Ширина на один больше: второй проход кладётся в x+1, и - # суммарный след занимает [x, x+w]. - row = [None] * (w + 1) - for x in range(w): # проход 1: обычный блит - i = px[x, y] - if i: - row[x] = rgb[i] - for x in range(w): # проход 2: XOR в x+1 - i = px[x, y] - if not i: - continue # чёрный: XOR — не операция - s = rgb[i] - t = x + 1 - row[t] = s if row[t] is None else tuple(a ^ b for a, b in zip(row[t], s)) - grid.append(row) - out.append((id, w + 1, h, grid)) - id += 1 - return out - - -def histogram(halves): - h = {} - for _, fr in halves: - for _, _, _, grid in fr: - for row in grid: - for c in row: - if c is not None: - h[c] = h.get(c, 0) + 1 - return h - - -def _d2(a, b): - return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2 - - -def _kmeans(pts, k, init): - """Взвешенный Ллойд по СПИСКУ ЦВЕТОВ с весами (их полсотни, не пиксели).""" - cent = list(init) - for _ in range(80): - groups = [[] for _ in cent] - for c, n in pts: - groups[min(range(len(cent)), key=lambda j: _d2(c, cent[j]))].append((c, n)) - new = [] - for j, g in enumerate(groups): - if not g: - new.append(cent[j]) - continue - w = sum(n for _, n in g) - new.append(tuple(int(round(sum(c[i] * n for c, n in g) / w)) for i in range(3))) - if new == cent: - break - cent = new - return cent - - -def build_palette(hist): - """16 цветов ГИБРИДОМ: часть слотов — самые частые цвета ТОЧНО, остаток - — взвешенные кластеры хвоста. - - Почему не «просто самые частые»: тогда редкие цвета уезжают в далёкий - ближайший, и грубых промахов (сдвиг >90 по евклиду в RGB при максимуме - 441) получается впятеро больше — 381 пиксель против 76 на все 251 - кадр (замер 2026-08-20). Почему не чистый k-means: он двигает вообще - все цвета, включая массовые. - - Разделение слотов подбираем перебором по критерию «сначала минимум - грубых промахов, потом заметных, потом худшая ошибка».""" - items = sorted(hist.items(), key=lambda kv: -kv[1]) - - def stats(pal): - bad = worst = mid = big = 0 - for c, n in items: - e = min(_d2(c, p) for p in pal) ** 0.5 - if e > 0: - bad += n - worst = max(worst, e) - if e >= 90: - big += n - elif e >= 40: - mid += n - return bad, mid, big, worst - - best = None - for m in range(1, NCOL): # m слотов под хвост - keep = [c for c, _ in items[:NCOL - m]] - rest = [(c, n) for c, n in items[NCOL - m:]] - if not rest: - continue - pal = keep + _kmeans(rest, m, [c for c, _ in rest[:m]]) - bad, mid, big, worst = stats(pal) - score = (big, mid, worst) - if best is None or score < best[0]: - best = (score, m, pal, (bad, mid, big, worst)) - _, m, pal, st = best - # Чёрный обязан быть ТОЧНЫМ и лежать в слоте 0: это XOR-погашенная - # середина силуэта, больше половины всех пикселей Тени. - j = min(range(len(pal)), key=lambda i: _d2((0, 0, 0), pal[i])) - pal[j] = (0, 0, 0) - pal[0], pal[j] = pal[j], pal[0] - bad, mid, big, worst = st - tot = sum(hist.values()) - print(f" палитра: {NCOL - m} частых точно + {m} кластеров хвоста; " - f"из {len(items)} цветов изменено {bad} px из {tot} " - f"({100.0 * bad / tot:.2f} %), заметно {mid}, сильно {big}, худшая {worst:.0f}") - return pal - - -def encode(grid, w, h, pal): - """RGB-сетка -> байты атласа: нет пикселя -> 0xFF, цвет -> PAL_BASE + k. - Чёрный — НАСТОЯЩИЙ цвет Тени (слот 0), а не прозрачность.""" - row = bytearray() - for y in range(h): - for x in range(w): - c = grid[y][x] - if c is None: - row.append(0xFF) - else: - row.append(PAL_BASE + min(range(len(pal)), key=lambda k: _d2(c, pal[k]))) - return transpose_cols(w, h, bytes(row)) - - -def write_header(path, counts, pal): - vals = [] - for (r, g, b) in pal: - vals += [b, g, r, 0] # формат gfx_pal_load: B, G, R, 0 - lines = [ - "/* pop_shadow_atlas.h — раскладка атласа ТЕНИ.", - " * СГЕНЕРЕНО tools/pop_pack_shadow.py — НЕ править вручную.", - " *", - " * Две половины, потому что и у оригинала их две (см. шапку", - " * упаковщика): кадры вне боя адресуют chtab_2 (спрайты Кида),", - " * кадры 150..189 — chtab_5, а он на 12-м уровне это SHADOW.DAT.", - " * Какая половина нужна, приложение уже знает — тем же условием,", - " * что выбирает таблицу кадров (pop_frame_tbl_is_guard).", - " *", - " * Спрайт Тени НА ОДИН ПИКСЕЛЬ ШИРЕ исходного: второй проход", - " * оригинала кладётся в x+1, и суммарный след занимает [x, x+w].", - " * Рисовать по тем же координатам, что и Кида — сдвиг уже внутри.", - " */", - "#ifndef POP_SHADOW_ATLAS_H", - "#define POP_SHADOW_ATLAS_H", - "", - "#include ", - "", - "#define POP_SHADOW_SHIFT %d" % SHIFT, - "#define POP_SHADOW_MASK %d" % MASK, - "#define POP_SHADOW_PAL_BASE 0x%02X /* слоты Sprinter под Тень */" % PAL_BASE, - "", - "/* Половина «вне боя» — кадры Кида (chtab_2). */", - "#define POP_SHADOW_KID_PAGES %d" % counts["sk"], - "/* Половина «в бою» — SHADOW.DAT (chtab_5, кадры 150..189). */", - "#define POP_SHADOW_FGT_PAGES %d" % counts["sf"], - "", - "/* 16 цветов, запись 4 байта (B, G, R, 0) — формат gfx_pal_load. */", - "static const uint8_t pop_shadow_pal[64] = {", - " " + ",".join("0x%02X" % v for v in vals) + ",", - "};", - "", - "#endif", - "", - ] - with open(path, "w") as f: - f.write("\n".join(lines)) - print(f" pop_shadow_atlas.h -> {path}") - - -def main(): - os.makedirs(OUT_DIR, exist_ok=True) - halves = [(prefix, frames(d, base)) for d, base, prefix in HALVES] - for (d, base, prefix), (_, fr) in zip(HALVES, halves): - if not fr: - B.die(f"нет спрайтов в data/{d} (SHADOW.DAT распакован?)") - print(f" {d}: {len(fr)} кадров") - pal = build_palette(histogram(halves)) - - counts, total, nspr = {}, 0, 0 - for prefix, fr in halves: - pages = {} - for id, w, h, grid in fr: - pages.setdefault(id >> SHIFT, {})[id & MASK] = (w, h, encode(grid, w, h, pal)) - nspr += 1 - npg = max(pages) + 1 - counts[prefix] = npg - for pg in range(npg): - nm = f"{prefix}{pg}.atl" - cnt, sz = B.pack_atlas(os.path.join(OUT_DIR, nm), pages.get(pg, {})) - total += sz - print(f" {prefix}*.atl: {len(fr)} спрайтов, {npg} EMM-страниц") - write_header(str(P.GEN / "pop_shadow_atlas.h"), counts, pal) - print(f"ИТОГО: {nspr} спрайтов Тени, " - f"{counts['sk'] + counts['sf']} EMM-страниц, {total} Б -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_sound.py b/applications/SprPoP/tools/pop_pack_sound.py deleted file mode 100644 index c91a1fa..0000000 --- a/applications/SprPoP/tools/pop_pack_sound.py +++ /dev/null @@ -1,311 +0,0 @@ -#!/usr/bin/env python3 -""" -pop_pack_sound.py — упаковщик ЗВУКОВЫХ ЭФФЕКТОВ (оцифровка, chtab нет). - -ИСТОЧНИК. Контейнеры `digisnd1..3` — по умолчанию из `SDLPoP/data/` -(`--source sdlpop`), потому что SDLPoP скачивается автоматически и без него -сборки всё равно нет. У кого лежит оригинальный дистрибутив DOS, может -взять оцифровку оттуда: `--source msdos` (= `make SND_SRC=msdos`); наборы -НЕ одинаковы — версии данных разные. Разбор: -индекс по 8 байт (id, offset, size), **первый байт ресурса — контрольная -сумма**, тело за ней (спецификация `docs/POP-DAT-FormatSpecifications`, -§3.1.2). Тело — один из двух вариантов заголовка: - - digi_type (1.0/1.1): word rate, word count, word unk, byte size=8 - digi_new_type (1.3/1.4): word rate, byte size=8, word count, word, word - -Различаем по позиции байта размера: у нового он на смещении 3, у старого -на 7. Сэмплы — 8 бит БЕЗЗНАКОВЫЕ, МОНО (проверено по `convert_digi_sound`, -seg009.c:2358: один байт на кадр, `(b | b<<8) - 32768`; стерео в данных -нет вовсе, каналы размножаются уже на выходе). Это ровно формат нашего -CBL — конвертировать нечего. - -ЧАСТОТА. Приводим ВСЁ к 10 937,5 Гц — это `CBL_FREQ_10K9`, то есть -частота железа. Не к 11 000: проигрывание 11 000-данных на 10 937,5 дало -бы сдвиг тона −9,9 цента, а пересчитывать три файла (2 750, 8 200, -14 000 Гц) всё равно надо. Взамен CBL открывается ОДИН раз и частота не -меняется никогда — ни между эффектами, ни при переходе на музыку. - -РАСКЛАДКА. Всё склеивается в EMM-страницы по 16 384 Б, и начало каждого -звука ВЫРАВНИВАЕТСЯ НА 128. Это не косметика: блок запроса CBL — ровно -128 байт, а 16 384 кратно 128, поэтому при таком выравнивании ни один -блок не пересекает границу страницы. Проигрыватель за счёт этого не -знает слова «стык»: замапил страницу, отдал 128 байт, сдвинул указатель. -Плата — до 127 байт на звук, всего ~2 КБ. - -ВЫХОД: build/atl/sound/s0..sN.bin (страницы по 16 384 Б) + snd.idx — -дисковая раскладка набора (формат PSI1, tools/pop_idx.py). C-заголовка -БОЛЬШЕ НЕТ: раскладка уехала на диск, чтобы замена набора не требовала -перекомпиляции игры. -""" -import argparse -import os -import struct -import sys - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) -import pop_idx # формат дискового индекса PSI1 (tools/pop_idx.py) - -HERE = os.path.dirname(os.path.abspath(__file__)) -OUT_DIR = str(P.atl("sound")) -IDX = "snd.idx" # дисковый индекс набора, рядом с snd.arc - -PAGE = 16384 -BLOCK = 128 # блок запроса CBL при 8 бит (см. cbl.h) -RATE = 10937.5 # CBL_FREQ_10K9 -NSOUND = 57 # id 0..56; у музыки оцифровки нет — длина 0 - - -def dat_resources(path): - """id -> тело ресурса (без байта контрольной суммы).""" - d = open(path, "rb").read() - off, _ = struct.unpack(" 4 and body[3] == 8: # digi_new_type - rate = struct.unpack(" 7 and body[7] == 8: # digi_type - rate, cnt = struct.unpack("= len(src) - 1: - out[i] = src[-1] - else: - a = x - i0 - out[i] = int(round(src[i0] * (1.0 - a) + src[i0 + 1] * a)) - return bytes(out) - - -def load_bundle(dat_dir, pattern, count): - """id -> тело ресурса из набора любого вида. - - Наборы приезжают в двух видах: контейнером `.DAT` (дистрибутив DOS) и - распакованным каталогом `res1XXXX.bin` (поставка SDLPoP). Тело в обоих - случаях начинается с байта типа, так что дальше разбор общий. - """ - out = {} - for i in range(1, count + 1): - p = dat_dir / (pattern % i) - if p.is_dir(): - for f in sorted(p.glob("res1*.bin")): - try: - rid = int(f.stem[3:]) - 10000 - except ValueError: - continue - out[rid] = f.read_bytes() - elif p.is_file(): - out.update(dat_resources(p)) - return out - - -def speaker(body): - """(темп, [(частота Гц, длина в долях), ...]) или None — если это не ноты. - - Формат — канон Princed, «Internal PC Speaker»: заголовок 3 байта, из них - байт 1 — доли на ДВЕ секунды; дальше тройки «частота (2 байта) + длина - (1 байт)»; нулевая частота = пауза, 1 и 2 — маркеры; в конце маркер - `12 00`, который сам отсекается недобором до целой тройки. - """ - if not body or (body[0] & 7) != 0 or len(body) < 6: - return None - bps = body[1] or 1 - notes = [] - i = 3 - while i + 3 <= len(body): - notes.append((struct.unpack(" те же 8 бит без знака, что и оцифровка. - - Амплитуда НАМЕРЕННО маленькая: сигналы спикера короткие и резкие, и на - полном размахе они колют ухо рядом с оцифровкой, которая заметно тише. - Значение снижено вдвое по слуховой проверке в MAME (решение пользователя - 2026-08-31): на 44 сигнал мигания перекрикивал игру. - """ - out = bytearray() - for freq, beats in notes: - n = int(round(beats * (2.0 / bps) * rate)) - if n <= 0: - continue - if freq <= 2: # 0 — пауза, 1 и 2 — маркеры - out += bytes([0x80]) * n - continue - period = rate / freq - for i in range(n): - out.append(0x80 + amp if (i % period) < period / 2 else 0x80 - amp) - return bytes(out) - - -def main(): - ap = argparse.ArgumentParser(description=__doc__.splitlines()[1]) - ap.add_argument("--source", default="sdlpop", choices=sorted(P.SND_SOURCES), - help="откуда брать digisnd1..3 (по умолчанию sdlpop)") - ap.add_argument("--order", default="id", choices=("id", "reverse"), - help="порядок укладки эффектов в страницах: id (штатный) " - "или reverse — ОТЛАДОЧНЫЙ, для проверки того, что " - "игра берёт раскладку из snd.idx, а не из своей " - "памяти: смещения расходятся у ВСЕХ эффектов") - args = ap.parse_args() - - # Имена контейнеров в поставках отличаются регистром, и на Linux это не - # мелочь: ищем без оглядки на него (P.find_ci). - dat_dir, pattern = P.snd_src(args.source) - res = {} - for i in (1, 2, 3): - p = P.find_ci(dat_dir, pattern % i) - if p is None: - sys.exit(f"нет файла {dat_dir / (pattern % i)} " - f"(источник {args.source}); см. assets/orig/README.md") - res.update(dat_resources(p)) - print(f" источник оцифровки: {args.source} ({dat_dir})") - # У набора SDLPoP оцифровка беднее: `spiked` (48) там длиной 7 сэмплов, - # то есть звука пик фактически нет (разбор — docs/sound_plan.md). Если - # у пользователя лежит дистрибутив DOS, сказать об этом стоит вслух — - # молча отдавать тишину вместо эффекта нельзя. - if args.source == "sdlpop" and P.MSDOS.is_dir(): - print(" ВНИМАНИЕ: у вас есть assets/orig/MSDOS — там оцифровка полнее" - " (в наборе SDLPoP звук 48 `spiked` пустой).") - print(" собрать с ней: make SND_SRC=msdos") - - sounds = {} - for sid, body in sorted(res.items()): - g = digi(body) - if g is None: - print(f" звук {sid}: не оцифровка, пропуск") - continue - rate, samples = g - pcm = resample(samples, rate, RATE) - sounds[sid] = pcm - if rate != 11000: - print(f" звук {sid}: {rate} Гц -> {RATE:g} Гц, {len(samples)} -> {len(pcm)} сэмплов") - - # ДОБОР ИЗ НОТ PC-СПИКЕРА (docs/TASKS_OPEN.md, SND-SPEAKER-38). - # У оригинала три параллельных набора звука, и номера разложены по ним - # не подряд: оцифровка, мелодии и ноты спикера. Берём из нот ТОЛЬКО те - # номера, которых нет ни там, ни там — иначе синтез перекрыл бы собой - # мелодии, которые мы играем отдельно, из MUS/. На поставке SDLPoP это - # ровно один номер: 38, сигнал под мигание надписи «Press Button» - # (31, 34 и 42 в наборе есть, но они пустые заглушки без нот). - midi_cfg = P.snd_extra("midi", args.source) - spk_cfg = P.snd_extra("speaker", args.source) - midi_ids = set(load_bundle(*midi_cfg)) if midi_cfg else set() - added = [] - for sid, body in sorted((load_bundle(*spk_cfg) if spk_cfg else {}).items()): - if sid in sounds or sid in midi_ids: - continue - sp = speaker(body) - if sp is None or not sp[1]: - continue - pcm = speaker_pcm(sp[0], sp[1], RATE) - if not pcm: - continue - sounds[sid] = pcm - added.append("%d (%d нот, %d Б)" % (sid, len(sp[1]), len(pcm))) - if added: - print(" из нот спикера: " + ", ".join(added)) - elif spk_cfg: - print(" из нот спикера: добирать нечего") - - # Раскладка: начало каждого звука кратно BLOCK, страницы по PAGE. - # ПЕРВЫЙ БЛОК — ТИШИНА. Он нужен насосу: когда эффект кончился, в CBL - # всё равно надо что-то отдавать, иначе железо доигрывает по кругу хвост - # своего буфера (жужжание). Держим тишину СВОЮ, а не просим у libc - # (CBL_UNDERRUN_SILENCE делает malloc), потому что куча в резиденте W2 - # тесная и её отказ ронял бы весь звук. - blob = bytearray([0x80] * BLOCK) - table = {} - # ПОРЯДОК УКЛАДКИ. Штатно — по возрастанию id; `--order reverse` кладёт - # те же эффекты задом наперёд. Данные и таблица при этом остаются - # согласованными (индекс печатается из table), но НИ ОДНО смещение не - # совпадает со штатным набором — только так и проверяется, что игра - # читает раскладку с диска, а не помнит её с компиляции: у двух - # реальных наборов совпадают 23 записи из 31, и подмена на них видна - # слабо. - order = sorted(sounds, reverse=(args.order == "reverse")) - for sid in order: - pad = (-len(blob)) % BLOCK - blob += bytes([0x80]) * pad # 0x80 — тишина в беззнаковом 8-бит - # Длину округляем ВВЕРХ до блока: хвост последнего блока — это - # выравнивающая тишина следующего звука, и проигрыватель за счёт - # этого не знает слова «неполный блок». - need = (len(sounds[sid]) + BLOCK - 1) // BLOCK * BLOCK - # ЗВУК ЦЕЛИКОМ В ОДНОЙ СТРАНИЦЕ (решение пользователя 2026-08-25). - # Раньше длинные эффекты перетекали в следующую страницу, и насос - # переключал её прямо посреди воспроизведения — лишняя логика в ISR - # и целый класс отказов «играет не тот звук». Теперь страница — - # как атлас: не влезает в остаток — начинаем новую, хвост добиваем - # тишиной. Платим страницами EMM, их у нас с запасом. - if len(blob) % PAGE + need > PAGE: - blob += bytes([0x80]) * ((-len(blob)) % PAGE) - table[sid] = (len(blob), need) - blob += sounds[sid] - blob += bytes([0x80]) * ((-len(blob)) % PAGE) - - os.makedirs(OUT_DIR, exist_ok=True) - # Старые страницы СНОСИМ: у разных источников их разное число (SDLPoP 9, - # MSDOS 10), и лишняя s9.bin от прошлого прогона уехала бы в архив - # хвостом, которого нет в таблице. - for old in os.listdir(OUT_DIR): - if old.startswith("s") and old.endswith(".bin"): - os.remove(os.path.join(OUT_DIR, old)) - npages = len(blob) // PAGE - for i in range(npages): - with open(os.path.join(OUT_DIR, f"s{i}.bin"), "wb") as f: - f.write(blob[i * PAGE:(i + 1) * PAGE]) - - # ДИСКОВЫЙ ИНДЕКС. Та же раскладка, что и в заголовке ниже, но на - # диске: с ним пара snd.idx + snd.arc заменяется целиком, без - # перекомпиляции игры (docs/music_runtime_index_plan.md, часть II). - # Проверки внутри snd_pack — ровно те, что делает загрузчик на Z80: - # набор, который не пройдёт здесь, не пройдёт и там. - if npages > pop_idx.SND_MAX_PAGES: - sys.exit("набор занял %d страниц, а загрузчик берёт не больше %d" - % (npages, pop_idx.SND_MAX_PAGES)) - entries = [table.get(sid, (0, 0)) for sid in range(NSOUND)] - entries = [(off >> 14, off & 0x3FFF, ln) for off, ln in entries] - with open(os.path.join(OUT_DIR, IDX), "wb") as f: - f.write(pop_idx.snd_pack(entries, npages)) - print(" индекс -> %s (%d страниц)" % (os.path.join(OUT_DIR, IDX), - npages)) - - have = sum(1 for s in sounds.values() if s) - print(f"ИТОГО: {have} эффектов, {len(blob)} Б = {npages} EMM-страниц -> {OUT_DIR}") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_pack_title.py b/applications/SprPoP/tools/pop_pack_title.py deleted file mode 100644 index 5c1852b..0000000 --- a/applications/SprPoP/tools/pop_pack_title.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_title.py — титульные композиции SDLPoP для Sprinter. - -Исходник — PNG-ресурсы ``data/TITLE/res51..55`` из локального SDLPoP. -Runtime не должен держать 320x200 картинку в W2 и не разбирает PNG: каждая -готовая композиция разрезана на пять getimage-лент высотой не более 49 -строк. Лента вместе с заголовком атласа занимает одну EMM-страницу; экран -рисуется лента за лентой, и страница сразу освобождается. - -Композиции в точности повторяют ``show_title()`` до story/intro: - t0 — основной рисунок; - t1 — рисунок + PRESENTS; - t2 — рисунок + название игры; - t3 — рисунок + логотип PRINCE OF PERSIA и Jordan Mechner. -""" -from pathlib import Path - -from PIL import Image - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -ROOT = Path(__file__).resolve().parent.parent -SRC = P.SDLPOP_DATA / "TITLE" -OUT = P.atl("title") - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - # Каталог хранит preview-габарит в uint8, но atlas_image читает только - # offset; реальный getimage-width — u16 в блобе. Так уже пакуются - # широкие 320-пиксельные полосы фона. - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"title atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def image(n: int) -> Image.Image: - im = Image.open(SRC / f"res{n}.png") - if im.mode != "P": - raise SystemExit(f"res{n}.png: expected indexed PNG, got {im.mode}") - return im.copy() - - -def assert_palette(base: Image.Image, overlay: Image.Image, n: int) -> None: - if base.getpalette()[:48] != overlay.getpalette()[:48]: - raise SystemExit(f"res{n}.png uses a palette different from res51.png") - - -def paste_opaque(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - dst.paste(src, (x, y)) - - -def paste_transparent(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - # TITLE_POP — единственный из пяти элементов, который SDLPoP рисует - # blitters_10h_transp. В PNG тот же факт записан colour-key index 0. - # Image.point() у P-изображения возвращает снова P, а paste() принимает - # маску только L/1/RGBA. Строим L явно, не меняя индексы самой картинки. - mask = Image.frombytes("L", src.size, - bytes(0 if p == 0 else 255 for p in src.tobytes())) - dst.paste(src, (x, y), mask) - - -# Семнадцатая запись — фон текстовой рамки story (STORY_BG_INDEX в -# pop_pack_intro.py). Она нужна здесь потому, что «In the absence…» -# проявляется полосами ПОВЕРХ последнего кадра титров, то есть при ещё -# загруженной title.pal: без этой записи фон рамки был бы чёрным. -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) - - -def write_palette(base: Image.Image) -> None: - rgb = base.getpalette()[:48] - pal = bytearray() - for i in range(16): - r, g, b = rgb[i * 3:i * 3 + 3] - pal += bytes((b, g, r, 0)) # родной формат gfx_pal_fload - assert len(pal) == STORY_BG_INDEX * 4 - r, g, b = STORY_BG_COLOR - pal += bytes((b, g, r, 0)) - (OUT / "title.pal").write_bytes(pal) - - -def write_scene(scene: int, canvas: Image.Image) -> int: - count = 0 - for part, top in enumerate(range(0, canvas.height, STRIP_H)): - band = canvas.crop((0, top, canvas.width, - min(top + STRIP_H, canvas.height))) - path = OUT / f"t{scene}_{part}.atl" - path.write_bytes(atlas_blob(band.tobytes(), band.width, band.height)) - count += 1 - return count - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - main_image = image(51) - if main_image.size != (320, 200): - raise SystemExit(f"res51.png: expected 320x200, got {main_image.size}") - - presents = main_image.copy() - paste_opaque(presents, image(52), 96, 106, 52) - - game = main_image.copy() - paste_opaque(game, image(53), 96, 122, 53) - - logo = main_image.copy() - paste_transparent(logo, image(54), 24, 107, 54) - paste_opaque(logo, image(55), 48, 184, 55) - - write_palette(main_image) - scenes = (main_image, presents, game, logo) - strips = [write_scene(i, scene) for i, scene in enumerate(scenes)] - assert strips == [5, 5, 5, 5] - print(f"{OUT}: {len(scenes)} title compositions x {strips[0]} strips, " - f"one strip <= {STRIP_H} rows / one EMM page") - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/pop_quiet.py b/applications/SprPoP/tools/pop_quiet.py deleted file mode 100755 index 0adf26b..0000000 --- a/applications/SprPoP/tools/pop_quiet.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python3 -"""pop_quiet.py — тише в N раз: пережать ГОТОВЫЕ наборы звука и музыки. - -Берёт то, что уже лежит в assets/packed (SND/snd.arc + MUS/m*.bin), делает -тише и кладёт в dist/ в той же раскладке диска, ПЕРЕЗАПИСЫВАЯ то, что там -было. Оригиналы в assets/packed не трогаются никогда — значит скрипт -идемпотентен: сколько раз ни запусти, громкость упадёт ровно один раз. - -ФОРМУЛА. PCM у нас 8 бит БЕЗ ЗНАКА, тишина = 0x80 (см. cbl.h и -docs/sound_plan.md), то есть байт — это знаковое отклонение от 0x80. -Тише вдвое: - - out = 0x80 + (in - 0x80) / 2 = in / 2 + 0x40 - -Правая форма — та самая, что делается на Z80 двумя командами -(`srl a` / `add a,#0x40`), поэтому таблицу строим floor-делением: тогда -результат совпадает с ней БАЙТ В БАЙТ и его можно сверять с железной -реализацией. Тишина остаётся тишиной (0x80 -> 0x80) при любом gain, а -клиппинга не бывает по построению: |отклонение| только уменьшается. - -ЧТО ИМЕННО ПЕРЕСЧИТЫВАЕТСЯ. - - MUS/m*.bin — файл целиком: это чистый PCM без заголовка, загрузчик - читает его страницами с нулевого смещения (pop_music.c). - SND/snd.arc — ТОЛЬКО тела записей архива PBA1. Заголовок (512 Б) и - выравнивающий хвост между записями остаются как есть: - там нули упаковщика, а не звук, и пересчёт превратил бы - их в 0x40 — мусор на месте служебных байт. - *.idx — копируются без изменений: длины и смещения не поменялись, - меняются только сами отсчёты. Магию всё же проверяем, - чтобы молча не скопировать файл чужого формата. - -Запуск: - - python3 tools/pop_quiet.py # вдвое тише, packed -> dist - python3 tools/pop_quiet.py --gain 0.25 # вчетверо тише - python3 tools/pop_quiet.py --src DIR --out DIR -""" -import argparse -import shutil -import struct -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parent)) -import paths - -SILENCE = 0x80 # центр 8-битного беззнакового PCM -ARC_MAGIC = b"PBA1" # архив ресурсов, см. src/pop_arc.h -ARC_HEADER = 512 -ARC_SECTOR = 512 -SND_IDX_MAGIC = b"PSI1" -MUS_IDX_MAGIC = b"PMI1" - - -def gain_table(gain: float) -> bytes: - """Таблица перекодировки байта: 256 значений, готовые для bytes.translate. - - floor, а не округление к ближайшему: при gain = 1/2 это ровно - `in >> 1 + 0x40`, то есть побайтово то же, что сделал бы Z80. - """ - if not 0.0 <= gain <= 1.0: - raise SystemExit("gain обязан лежать в [0, 1]; громче делать нечем — " - "запас по амплитуде в исходнике уже выбран") - out = bytearray(256) - for v in range(256): - dev = v - SILENCE # знаковое отклонение - out[v] = max(0, min(255, SILENCE + _floor_div(dev, gain))) - return bytes(out) - - -def _floor_div(dev: int, gain: float) -> int: - """dev * gain, округлённое ВНИЗ (к минус бесконечности).""" - scaled = dev * gain - i = int(scaled) - return i - 1 if scaled < i else i # int() режет к нулю - - -def quiet_raw(src: Path, dst: Path, table: bytes) -> int: - """Файл целиком — PCM (музыкальный трек). Возвращает размер.""" - data = src.read_bytes() - dst.write_bytes(data.translate(table)) - return len(data) - - -def quiet_arc(src: Path, dst: Path, table: bytes) -> int: - """Архив PBA1: пересчитываем только тела записей.""" - raw = bytearray(src.read_bytes()) - if raw[0:4] != ARC_MAGIC: - raise SystemExit(f"{src}: не {ARC_MAGIC.decode()} — это не наш архив") - count = raw[4] - if not 1 <= count <= (ARC_HEADER - 8) // 4: - raise SystemExit(f"{src}: count = {count}, вне 1..126") - for i in range(count): - off_sec, size = struct.unpack_from(" len(raw): - raise SystemExit(f"{src}: запись {i} выходит за файл " - f"({off} + {size} > {len(raw)})") - raw[off:off + size] = bytes(raw[off:off + size]).translate(table) - dst.write_bytes(bytes(raw)) - return count - - -def copy_idx(src: Path, dst: Path, magic: bytes) -> None: - """Индекс переносим как есть — но убеждаемся, что он наш.""" - head = src.read_bytes()[:4] - if head != magic: - raise SystemExit(f"{src}: магия {head!r}, ожидалась {magic!r}") - shutil.copyfile(src, dst) - - -def peak(data: bytes) -> int: - """Максимальное отклонение от тишины — для отчёта «стало тише».""" - return max(abs(b - SILENCE) for b in data) if data else 0 - - -def main() -> int: - ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) - ap.add_argument("--gain", type=float, default=0.5, - help="множитель амплитуды (по умолчанию 0.5 — вдвое тише)") - ap.add_argument("--src", type=Path, default=paths.PACKED, - help="откуда брать готовые наборы (умолчание assets/packed)") - ap.add_argument("--out", type=Path, default=paths.DIST, - help="куда класть (умолчание dist/)") - args = ap.parse_args() - - table = gain_table(args.gain) - src_snd, src_mus = args.src / "SND", args.src / "MUS" - out_snd, out_mus = args.out / "SND", args.out / "MUS" - if not src_snd.is_dir() or not src_mus.is_dir(): - raise SystemExit(f"{args.src}: нет SND/ или MUS/ — сначала " - "`make resources`") - out_snd.mkdir(parents=True, exist_ok=True) - out_mus.mkdir(parents=True, exist_ok=True) - - print(f"тише в {1 / args.gain:g} раз(а): {args.src} -> {args.out}") - - arc = src_snd / "snd.arc" - before = peak(arc.read_bytes()[ARC_HEADER:]) - n = quiet_arc(arc, out_snd / "snd.arc", table) - after = peak((out_snd / "snd.arc").read_bytes()[ARC_HEADER:]) - copy_idx(src_snd / "snd.idx", out_snd / "snd.idx", SND_IDX_MAGIC) - print(f" SND/snd.arc {n} записей, пик {before} -> {after}") - - tracks = sorted(src_mus.glob("m*.bin")) - if not tracks: - raise SystemExit(f"{src_mus}: нет ни одного m*.bin") - total = 0 - worst_before = worst_after = 0 - for t in tracks: - total += quiet_raw(t, out_mus / t.name, table) - worst_before = max(worst_before, peak(t.read_bytes())) - worst_after = max(worst_after, peak((out_mus / t.name).read_bytes())) - copy_idx(src_mus / "mus.idx", out_mus / "mus.idx", MUS_IDX_MAGIC) - print(f" MUS/ {len(tracks)} треков, {total // 1024} КБ, " - f"пик {worst_before} -> {worst_after}") - print("индексы (snd.idx, mus.idx) скопированы без изменений — длины те же") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/applications/SprPoP/tools/render_room.py b/applications/SprPoP/tools/render_room.py deleted file mode 100755 index 6d4ca85..0000000 --- a/applications/SprPoP/tools/render_room.py +++ /dev/null @@ -1,853 +0,0 @@ -#!/usr/bin/env python3 -""" -Parse SDLPoP level file (res2001.bin) and render the first room by -faithfully replaying the tile-drawing logic of seg008.c (draw_room/draw_tile). - -Pixel model (from seg008.c): - - screen is 320px wide, 10 columns. - - col_xh[col] = {0,4,8,12,16,20,24,28,32,36}; x_px = xh*8 -> 0,32,64,...,288 - (tile column is 32px; the 4px offset handles overlap of floor/wall edges) - - rows drawn 2,1,0 (bottom..top). For each row: - draw_bottom_y = 63*drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - row2 -> bottom_y=191, row1 -> 128, row0 -> 65 - - a tile sprite of height h drawn at ybottom is placed with its BOTTOM at ybottom: - y = ybottom - h + 1 - -We replay draw_tile() which composites (in order): - floorright, anim_topright, right, anim_right, bottom, loose, base, anim, fore -Dependencies on NEIGHBOURS: - - tile_left = tile in the column to the left (same room, same row) - - row_below_left_[col] = tile in (room_below, col-1, row_below) -> for topright/floorright - - For a single room with no links we treat out-of-range neighbours as walls - (level edges), matching SDLPoP's custom->drawn_tile_*_level_edge defaults - (left = wall, top = floor). - -We ignore animated variants (spike frames, chomper, torch flames, gate -animation) for this first static render; they use curr_modifier/backtable. -""" - -import os -from PIL import Image - -import sys as _sys, os as _os -_sys.path.insert(0, _os.path.dirname(_os.path.abspath(__file__))) -import paths as P # раскладка каталогов SprPoP (tools/paths.py) - -LEVEL_DIR = str(P.SDLPOP_DATA / "LEVELS") -VPALACE_DIR = str(P.SDLPOP_DATA / "VPALACE") -VDUNGEON_DIR = str(P.SDLPOP_DATA / "VDUNGEON") - -# For dungeon levels (tbl_level_type == 0) the environment sprites come from -# VDUNGEON where present, otherwise fall back to the shared VPALACE set -# (PRINCE.DAT common images). For palace levels use VPALACE only. -IS_DUNGEON = True # room 1 (res2001) is the dungeon - -# tile_table[code] = (base_id, floor_left, base_y, right_id, floor_right, -# right_y, stripe_id, topright_id, bottom_id, fore_id, -# fore_x, fore_y) -TILE_TABLE = [ - ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), # 0x00 empty - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x01 floor - (127, 1, 0, 133, 1, 2, 145, 0, 43, 0, 0, 0), # 0x02 spike - ( 92, 1, 0, 93, 1, 2, 0, 94, 43, 95, 1, 0), # 0x03 pillar - ( 46, 1, 0, 47, 1, 2, 0, 48, 43, 49, 3, 0), # 0x04 gate - ( 41, 1, 1, 35, 1, 3, 145, 0, 36, 0, 0, 0), # 0x05 stuck floor - ( 41, 1, 0, 42, 1, 2, 145, 0, 96, 0, 0, 0), # 0x06 close button - ( 46, 1, 0, 0, 0, 2, 0, 0, 43, 49, 3, 0), # 0x07 door top with floor - ( 86, 1, 0, 87, 1, 2, 0, 0, 43, 88, 1, 0), # 0x08 big pillar bottom - ( 0, 0, 0, 89, 0, 3, 0, 90, 0, 91, 1, 3), # 0x09 big pillar top - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 12, 2, -3), # 0x0A potion - ( 0, 1, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0), # 0x0B loose floor - ( 0, 0, 0, 0, 0, 2, 0, 0, 85, 49, 3, 0), # 0x0C door top - ( 75, 1, 0, 42, 1, 2, 0, 0, 43, 77, 0, 0), # 0x0D mirror - ( 97, 1, 0, 98, 1, 2, 145, 0, 43, 100, 0, 0), # 0x0E debris - (147, 1, 0, 42, 1, 1, 145, 0, 149, 0, 0, 0), # 0x0F open button - ( 41, 1, 0, 37, 0, 0, 0, 38, 43, 0, 0, 0), # 0x10 leveldoor left - ( 0, 0, 0, 39, 1, 2, 0, 40, 43, 0, 0, 0), # 0x11 leveldoor right - ( 0, 0, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x12 chomper - ( 41, 1, 0, 42, 1, 2, 0, 0, 43, 0, 0, 0), # 0x13 torch - ( 0, 0, 0, 1, 1, 2, 0, 2, 0, 0, 0, 0), # 0x14 wall - ( 30, 1, 0, 31, 1, 2, 0, 0, 43, 0, 0, 0), # 0x15 skeleton - ( 41, 1, 0, 42, 1, 2, 145, 0, 43, 0, 0, 0), # 0x16 sword - ( 41, 1, 0, 10, 0, 0, 0, 11, 43, 0, 0, 0), # 0x17 balcony left - ( 0, 0, 0, 12, 1, 2, 0, 13, 43, 0, 0, 0), # 0x18 balcony right - ( 92, 1, 0, 42, 1, 2, 145, 0, 43, 95, 1, 0), # 0x19 lattice pillar - ( 1, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, -53), # 0x1A lattice down - ( 3, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1B lattice small - ( 4, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1C lattice left - ( 5, 0, -10, 0, 0, 0, 0, 0, 0, 9, 0, -53), # 0x1D lattice right - ( 97, 1, 0, 98, 1, 2, 0, 0, 43, 100, 0, 0), # 0x1E debris with torch -] - -TILE_NAMES = { - 0x00: "empty", 0x01: "floor", 0x02: "spike", 0x03: "pillar", - 0x04: "gate", 0x05: "stuck_floor", 0x06: "close_button", 0x07: "door_top_floor", - 0x08: "big_pillar_bottom", 0x09: "big_pillar_top", 0x0A: "potion", - 0x0B: "loose_floor", 0x0C: "door_top", 0x0D: "mirror", 0x0E: "debris", - 0x0F: "open_button", 0x10: "leveldoor_left", 0x11: "leveldoor_right", - 0x12: "chomper", 0x13: "torch", 0x14: "wall", 0x15: "skeleton", - 0x16: "sword", 0x17: "balcony_left", 0x18: "balcony_right", - 0x19: "lattice_pillar", 0x1A: "lattice_down", 0x1B: "lattice_small", - 0x1C: "lattice_left", 0x1D: "lattice_right", 0x1E: "debris_torch", -} - -COL_XH = [0, 4, 8, 12, 16, 20, 24, 28, 32, 36] - -# chtab -> directory/subfolder + id offset -# id_chtab_6_environment -> VPALACE, res(200+id).png -# id_chtab_7_environmentwall -> VPALACE (wall images also here, res(200+id)) -# id_chtab_1_flameswordpotion -> flames etc (skipped in static render) -CHTAB_ENV = 6 -CHTAB_WALL = 7 -CHTAB_FSP = 1 # flames/sword/potion (animated, skipped) - - -# ---- POP1 level file structure (see POP-DAT-FormatSpecifications.txt, sec 3.4) ---- -# Block layout (for the standard 2305-byte level): -# 0 .. 720 pop1 foretable (24 rooms x 30 bytes) -# 720 .. 1440 pop1 backtable (24 rooms x 30 bytes) -# 1440 .. 1696 door I (256 bytes, one per event line) -# 1696 .. 1952 door II (256 bytes) -# 1952 .. 2048 links (24 rooms x 4 bytes: L,R,Up,Dn) -# 2048 .. 2112 unknown I -# 2112 .. 2115 start position (room, location, direction) -# 2115 .. 2116 unknown II -# 2116 .. 2119 unknown III -# 2119 .. 2143 guard location (24) -# 2143 .. 2167 guard direction (24) -# 2167 .. 2191 unknown IV (a) -# 2191 .. 2215 unknown IV (b) -# 2215 .. 2239 guard skill (24) -# 2239 .. 2263 unknown IV (c) -# 2263 .. 2287 guard colour (24) -# 2287 .. 2303 unknown IV (d) -# 2303 .. 2305 0F 09 - -# foretable byte format: rrmccccc (2 random bits, 1 modifier bit, 5 code bits) -FG_RAND_MASK = 0xC0 -FG_MODBIT_MASK = 0x20 -FG_CODE_MASK = 0x1F - -# backtable: a tile modifier that depends on the group of the foretable code. -# group ids map foretable code -> "group" used to interpret backtable value. -# (see Table 7/8). We only need the group for door/event interpretation. -GROUP_OF_CODE = { - 0x00: "free", 0x01: "free", 0x02: "spike", 0x03: "none", - 0x04: "gate", 0x05: "none", 0x06: "event", 0x07: "tapest", - 0x08: "none", 0x09: "none", 0x0A: "potion", 0x0B: "none", - 0x0C: "ttop", 0x0D: "none", 0x0E: "none", 0x0F: "event", - 0x10: "none", 0x11: "none", 0x12: "chomp", 0x13: "none", - 0x14: "wall", 0x15: "none", 0x16: "none", 0x17: "none", - 0x18: "none", 0x19: "none", 0x1A: "none", 0x1B: "none", - 0x1C: "none", 0x1D: "none", 0x1E: "none", 0x1F: "none", -} - -# backtable modifier meanings per group (subset, from Table 8): -GATE_MOD = {0: "closed", 1: "open", 2: "with_lattice", 3: "alt_design"} -TTOP_MOD = {0: "normal", 1: "black", 2: "empty", 3: "?3", 4: "?4", 5: "?5", 6: "?6", 7: "?7"} -SPIKE_MOD = {0: "normal", 1: "barely_out", 2: "half_out", 3: "fully_out"} -CHOMP_MOD = {0: "normal", 1: "barely_out", 2: "half_out", 3: "fully_out", 4: "out?"} -POTION_MOD = {0: "blue", 1: "no_blue", 2: "window", 3: "spot?"} -TAPEST_MOD = {0: "normal", 1: "alt_design", 2: "black", 3: "empty"} -EVENT_MOD_DESC = { # group "event": the backtable byte IS the event id - 0: "closer", 1: "opener", -} - - -class Level: - """Full parsed POP1 level file.""" - def __init__(self, data): - self.data = data - self.rooms_fg = {} # room -> list[30] of (fg_byte, code, modbit) - self.rooms_bg = {} # room -> list[30] of backtable byte - for room in range(1, 25): - fg = []; bg = [] - for off in range(30): - i = (room - 1) * 30 + off - fb = data[i]; bb = data[720 + i] - fg.append((fb, fb & FG_CODE_MASK, (fb & FG_MODBIT_MASK) >> 5)) - bg.append(bb) - self.rooms_fg[room] = fg - self.rooms_bg[room] = bg - # door I / II (event lines 0..255) - self.door_i = data[1440:1696] - self.door_ii = data[1696:1952] - # links: 24 rooms x (L,R,Up,Dn) - self.links = {} - for room in range(1, 25): - b = data[1952 + (room - 1) * 4: 1952 + (room - 1) * 4 + 4] - self.links[room] = tuple(b) # (left, right, up, down) - # start position - self.start = tuple(data[2112:2115]) - # guards - self.guard_loc = list(data[2119:2143]) - self.guard_dir = list(data[2143:2167]) - self.guard_skill = list(data[2215:2239]) - self.guard_colour = list(data[2263:2287]) - - def door_for_event(self, event_id): - """Decode door I/II for an event line -> (room, location, trigger_next).""" - bi = self.door_i[event_id] - bii = self.door_ii[event_id] - # Byte I: t1 s4 s5 l1 l2 l3 l4 l5 - t1 = (bi >> 7) & 1 - s4 = (bi >> 6) & 1 - s5 = (bi >> 5) & 1 - l1 = (bi >> 4) & 1 - l2 = (bi >> 3) & 1 - l3 = (bi >> 2) & 1 - l4 = (bi >> 1) & 1 - l5 = bi & 1 - # Byte II: s1 s2 s3 00000 - s1 = (bii >> 7) & 1 - s2 = (bii >> 6) & 1 - s3 = (bii >> 5) & 1 - screen = (s1 << 4) | (s2 << 3) | (s3 << 2) | (s4 << 1) | s5 - loc = (l1 << 4) | (l2 << 3) | (l3 << 2) | (l4 << 1) | l5 - return screen, loc, t1 - - def backtable_desc(self, code, bb): - grp = GROUP_OF_CODE.get(code, "none") - tbl = {"gate": GATE_MOD, "ttop": TTOP_MOD, "spike": SPIKE_MOD, - "chomp": CHOMP_MOD, "potion": POTION_MOD, "tapest": TAPEST_MOD} - if code == 0x06 or code == 0x0F: # event group - act = EVENT_MOD_DESC.get(bb & 1, "?") - return f"event(id={bb}, {act})" - if grp in tbl: - return tbl[grp].get(bb, f"?0x{bb:02X}") - return f"0x{bb:02X}" - - -class Room: - def __init__(self, level, room_num): - self.level = level - self.room_num = room_num - self.fg = level.rooms_fg[room_num] - self.bg = level.rooms_bg[room_num] - self.left_room = None # соседняя комната слева (link L); load_leftroom - - def tile(self, row, col): - """Return (code, fg_byte, modbit, backtable_byte) for an in-room tile. - Out-of-range neighbours follow seg008 defaults: - col<0 -> берётся из ЛЕВОЙ комнаты (col 9), как load_leftroom(); - если левой комнаты нет — уровневая кромка = стена (20). - row<0 -> top level edge = floor (code 1, mod 0) - """ - if col < 0: - if self.left_room is not None and 0 <= row < 3: - return self.left_room.tile(row, 9) - return 20, 0, 0, 0 - if row < 0: - return 1, 0, 0, 0 - if not (0 <= row < 3 and 0 <= col < 10): - return 20, 0, 0, 0 - i = row * 10 + col - fb, code, mbit = self.fg[i] - return code, fb, mbit, self.bg[i] - - -# Log of every sprite loaded during a render, for the per-tile report. -SPRITE_LOG = [] - - -def load_sprite(id, chtab=CHTAB_ENV, reason=""): - """Load resource PNG для картинки id из набора chtab. - - База ресурса зависит от chtab (seg000.c:1109/1122): - chtab_6 environment -> res(200+id) - chtab_7 environmentwall -> res(360+id) - chtab_1 flame/sword/pot -> res(150+id) (анимация, статикой не грузим) - - Dungeon (IS_DUNGEON) cascade: try VDUNGEON first (dungeon-specific - overrides), then fall back to VPALACE (shared base set). - """ - if id <= 0: - return None - base = {CHTAB_ENV: 200, CHTAB_WALL: 360, CHTAB_FSP: 150}.get(chtab, 200) - fname = f"res{base + id}.png" - if IS_DUNGEON: - vd = os.path.join(VDUNGEON_DIR, fname) - if os.path.exists(vd): - try: - img = Image.open(vd).convert("RGBA") - CURRENT_TILE_LOG.append((id, "VDUNGEON", reason)) - return img - except Exception: - pass - vp = os.path.join(VPALACE_DIR, fname) - try: - img = Image.open(vp).convert("RGBA") - CURRENT_TILE_LOG.append((id, "VPALACE", reason)) - return img - except FileNotFoundError: - CURRENT_TILE_LOG.append((id, "MISSING", reason)) - return None - - -def blit(canvas, img, x, y): - """Composite img onto canvas at (x,y) using its alpha as mask (draw_main style).""" - if img is None: - return - w, h = img.size - if x + w <= 0 or y + h <= 0 or x >= canvas.width or y >= canvas.height: - return - canvas.alpha_composite(img, (x, y)) - - -def blit_black(canvas, img, x, y): - """blitters_9_black (seg008.c:1054): рисует МАСКУ спрайта ЧЁРНЫМ — - непрозрачная область формы заливается чёрным (тень-силуэт), а не - пикселями картинки. Используется для floor-right в draw_tile_floorright - (тень уступа тайла снизу-слева).""" - if img is None: - return - w, h = img.size - if x + w <= 0 or y + h <= 0 or x >= canvas.width or y >= canvas.height: - return - alpha = img.split()[3] - solid = Image.new("RGBA", img.size, (0, 0, 0, 255)) - canvas.alpha_composite(Image.composite(solid, Image.new("RGBA", img.size, (0, 0, 0, 0)), alpha), (x, y)) - - -# ---- Dungeon wall_pattern() (seg008.c:1928) ---- -# PRNG: seg009.c:321 random_seed = random_seed*214013 + 2531011; return (random_seed>>16) % (max+1) -_random_seed = 0 - - -def prandom(maxval): - global _random_seed - _random_seed = (_random_seed * 214013 + 2531011) & 0xFFFFFFFF - return (_random_seed >> 16) % (maxval + 1) - - -# wall sprite ids (chtab_7 / RSET_WALL = 7) res(200+id).png -RES_WALL_FACE_MAIN, RES_WALL_FACE_TOP, RES_WALL_CENTRE_BASE, RES_WALL_CENTRE_MAIN = 1, 2, 3, 4 -RES_WALL_RIGHT_BASE, RES_WALL_RIGHT_MAIN, RES_WALL_SINGLE_BASE, RES_WALL_SINGLE_MAIN = 5, 6, 7, 8 -RES_WALL_LEFT_BASE, RES_WALL_LEFT_MAIN, RES_WALL_DIVIDER1, RES_WALL_DIVIDER2 = 9, 10, 11, 12 -RES_WALL_RNDBLOCK = 13 -RES_WALL_MARK_TL, RES_WALL_MARK_BL, RES_WALL_MARK_TR, RES_WALL_MARK_BR = 14, 15, 16, 17 - -WALL_MODIFIER_SWS, WALL_MODIFIER_SWW, WALL_MODIFIER_WWS, WALL_MODIFIER_WWW = 0, 1, 2, 3 - -# Сплошная грань стены (chtab_7), индекс = wall_modifier (seg008.c:567/687): -WALL_FRAM_BOTTOM = [7, 9, 5, 3] # нижняя часть (draw_tile_bottom) -WALL_FRAM_MAIN = [8, 10, 6, 4] # основная часть (draw_tile_fore) - -LPOS = [58, 41, 37, 20, 16] # draw_left_mark vertical offsets -RPOS = [52, 42, 31, 21] # draw_right_mark vertical offsets - -TBL_LINE = [0, 10, 20] # смещение строки в 30-тайловом массиве комнаты - - -def wall_modifier(room, drawn_row, col): - """Модификатор стены (SWS/SWW/WWS/WWW = 0..3) по соседям слева/справа. - seg008.c:1255-1305 (без USE_FAKE_TILES): сосед считается стеной, если - его тип == wall(20). На кромке комнаты без линка сосед по умолчанию - считается стеной (wall_to_left/right = 1).""" - left_code = room.tile(drawn_row, col - 1)[0] if col > 0 else 20 - right_code = room.tile(drawn_row, col + 1)[0] if col < 9 else 20 - wall_left = (left_code == 20) - wall_right = (right_code == 20) - if wall_left and wall_right: - return WALL_MODIFIER_WWW # 3 - if wall_left: - return WALL_MODIFIER_WWS # 2 - if wall_right: - return WALL_MODIFIER_SWW # 1 - return WALL_MODIFIER_SWS # 0 - - -def _wall_add(canvas, which_table, id, xh, xl, ybottom, reason): - """Emulate ptr_add_table(RSET_WALL, id, xh, xl, ybottom, blit, 0). - which_table 0 -> backtable (blit transparent), 1 -> foretable. - RSET_WALL id -> res(200+id).png, cascade VDUNGEON->VPALACE.""" - img = load_sprite(id, CHTAB_WALL, reason=reason) - if img is None: - return - y = ybottom - img.height + 1 - x = xh * 8 + xl - blit(canvas, img, x, y) - - -def draw_left_mark(canvas, decal_variant, arg2, arg1, drawn_row, col): - image_id = RES_WALL_MARK_TL - if decal_variant % 2: - image_id = RES_WALL_MARK_BL - lv2 = 0 - if decal_variant > 3: - lv2 = arg1 + 6 - elif decal_variant > 1: - lv2 = arg2 + 6 - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - _wall_add(canvas, 1, image_id, xh + (1 if decal_variant in (2, 3) else 0), - lv2, draw_bottom_y - LPOS[decal_variant], - reason=f"wall left-mark var{decal_variant}") - - -def draw_right_mark(canvas, decal_variant, arg1, drawn_row, col): - image_id = RES_WALL_MARK_TR - if decal_variant % 2: - image_id = RES_WALL_MARK_BR - a = 24 if decal_variant < 2 else arg1 - 3 - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - _wall_add(canvas, 1, image_id, xh + (1 if decal_variant > 1 else 0), - a, draw_bottom_y - RPOS[decal_variant], - reason=f"wall right-mark var{decal_variant}") - - -def wall_pattern(canvas, room, drawn_row, col, which_part, which_table): - """Replay seg008.c wall_pattern() for a dungeon wall tile. - which_part: 0 = bottom part (draw_tile_bottom), 1 = fore part (draw_tile_fore). - which_table: 0 = backtable, 1 = foretable.""" - global _random_seed - xh = COL_XH[col] - draw_bottom_y = 63 * drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - - saved_seed = _random_seed - # seg008.c:1941 — зерно зависит от НОМЕРА КОМНАТЫ (не строки!): - # random_seed = drawn_room + tbl_line[drawn_row] + drawn_col - room_num = getattr(room, "room_num", 1) - _random_seed = room_num + TBL_LINE[drawn_row] + col - prandom(1) # discard - is_dungeon = IS_DUNGEON - - middle_divider = prandom(1) - middle_divider_offset = prandom(4) - bottom_divider = prandom(1) - bottom_divider_offset = prandom(4) - - # Модификатор стены (какие соседи — стены) — тот же, что для сплошной грани. - bg = wall_modifier(room, drawn_row, col) - - if bg == WALL_MODIFIER_WWW: - if which_part != 0: - if prandom(4) == 0: - _wall_add(canvas, which_table, RES_WALL_RNDBLOCK, xh, 0, - draw_bottom_y - 42, reason="wall rndblock") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + bottom_divider, xh, - bottom_divider_offset, draw_bottom_y, reason="wall bottom-divider") - if which_part != 0 and is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(3), middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(4), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_SWS: - if is_dungeon and which_part != 0: - if prandom(6) == 0: - draw_left_mark(canvas, prandom(1), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_SWW: - if which_part != 0: - if prandom(4) == 0: - _wall_add(canvas, which_table, RES_WALL_RNDBLOCK, xh, 0, - draw_bottom_y - 42, reason="wall rndblock") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - if is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(3), middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(3), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - elif bg == WALL_MODIFIER_WWS: - if which_part != 0: - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + middle_divider, xh + 1, - middle_divider_offset, draw_bottom_y - 21, reason="wall middle-divider") - _wall_add(canvas, which_table, RES_WALL_DIVIDER1 + bottom_divider, xh, - bottom_divider_offset, draw_bottom_y, reason="wall bottom-divider") - if which_part != 0 and is_dungeon: - if prandom(4) == 0: - draw_right_mark(canvas, prandom(1) + 2, middle_divider_offset, drawn_row, col) - if prandom(4) == 0: - draw_left_mark(canvas, prandom(4), - middle_divider_offset - middle_divider, - bottom_divider_offset - bottom_divider, drawn_row, col) - - _random_seed = saved_seed - - -# Per-tile sprite log: draw_tile resets CURRENT_TILE_LOG, load_sprite appends to it. -CURRENT_TILE_LOG = [] -TILE_LOGS = {} # (row, col) -> list of (id, source, reason) - -# seg008.c:1108 — вертикальные слайсы решётки ворот (portcullis). -DOOR_FRAM_SLICE = [67, 59, 58, 57, 56, 55, 54, 53, 52] -# seg008.c:517 — правый край шипов по кадру get_spike_frame. -SPIKES_FRAM_RIGHT = [0, 134, 135, 136, 137, 138, 137, 135, 134, 0] -# seg008.c:450 — «blueline»-декали на ЗАДНЕЙ стене (силуэты кладки/окна), -# рисуются правым соседом по МОДИФИКАТОРУ соседа слева: -# tile_left == empty -> blueline_fram1[mod] (окно/решётка-фрагменты 124..126) -# на высоте blueline_fram_y[mod] + main_y; -# tile_left == floor -> blueline_fram3[mod] (кирпичные силуэты 44/45) -# на main_y - 20 (если mod != !!level_type). -BLUELINE_FRAM1 = [0, 124, 125, 126] -BLUELINE_FRAM_Y = [0, -20, -20, 0] -BLUELINE_FRAM3 = [44, 44, 45, 45] - - -def draw_gate_back(canvas, modifier_left, draw_xh, draw_bottom_y, draw_main_y): - """seg008.c:1110 draw_gate_back — портикулис (решётка) ворот. Рисуется - на тайле СПРАВА от ворот (draw_tile_anim_right, tile_left==gate). У нас - это col 0 room1, где сосед слева — ворота из room 5. modifier_left — - модификатор тайла-ворот (степень поднятия решётки).""" - x = draw_xh * 8 - gate_top_y = draw_bottom_y - 62 - gate_openness = (min(modifier_left, 188) >> 2) + 1 - gate_bottom_y = draw_main_y - gate_openness - if gate_bottom_y + 12 < draw_main_y: - img = load_sprite(50, reason="gate bottom+B") # gate поднята высоко - if img: - blit(canvas, img, x, gate_bottom_y - img.height + 1) - else: - # id 47 (правая грань ворот) уже рисует draw_tile_right — не дублируем. - img = load_sprite(51, reason="gate bottom") - if img: - blit(canvas, img, x, (gate_bottom_y - 2) - img.height + 1) - # Стек 8px-слайсов решётки снизу вверх. - ybottom = gate_bottom_y - 12 - if ybottom < 192: - while ybottom >= 0 and ybottom > 7 and (ybottom - 7) > gate_top_y: - img = load_sprite(52, reason="gate slice 8px") - if img: - blit(canvas, img, x, ybottom - img.height + 1) - ybottom -= 8 - gate_frame = ybottom - gate_top_y + 1 - if 0 < gate_frame < 9: - img = load_sprite(DOOR_FRAM_SLICE[gate_frame], reason="gate top slice") - if img: - blit(canvas, img, x, ybottom - img.height + 1) - - -def draw_tile(canvas, room, drawn_row, col, left_edge_code=20): - global CURRENT_TILE_LOG - CURRENT_TILE_LOG = [] - code, fg_byte, modbit, bg_mod = room.tile(drawn_row, col) - # tile_left: колонка слева. col-1 == -1 -> Room.tile берёт из левой - # комнаты (или уровневая кромка = стена), см. Room.tile / load_leftroom. - left_code, _, _, left_mod = room.tile(drawn_row, col - 1) - draw_xh = COL_XH[col] - x = draw_xh * 8 - draw_bottom_y = 63 * drawn_row + 65 - draw_main_y = draw_bottom_y - 3 - - # For topright/floorright we need the tile below-left. - # Room below = same room (no room links) -> row_below = drawn_row+1 if <3 else treat as empty/floor top edge. - row_below = drawn_row + 1 - if row_below > 2: - # below the bottom row of the level: floor top edge - rbl_code, rbl_mod = 1, 0 - else: - rbl_code, _, _, rbl_mod = room.tile(row_below, col - 1) - row_below_left_code = rbl_code - - t = TILE_TABLE[code] - lt = TILE_TABLE[left_code] - - # ---- draw_tile_floorright (seg008.c:392) ---- - # Рисуется ТОЛЬКО когда can_see_bottomleft(): текущий тайл — - # empty/bigpillar_top/doortop/lattice_down. Иначе topright соседа - # снизу-слева перекрыт и рисовать его нельзя (иначе «арки» повсюду — - # это была главная причина замусоренного рендера). - if code in (0, 9, 12, 26): # can_see_bottomleft - _draw_topright(canvas, row_below_left_code, rbl_mod, x, draw_bottom_y, - reason=f"topright(below-left tile {row_below_left_code:02X})") - if lt[4]: # tile_table[tile_left].floor_right - # blitters_9_black: ЧЁРНЫЙ силуэт (тень уступа), не светлый спрайт. - img = load_sprite(42, reason=f"floor-right shadow(left tile {left_code:02X})") - blit_black(canvas, img, x, draw_main_y + TILE_TABLE[1][5] - (img.height if img else 0) + 1) - - # ---- draw_tile_anim_topright ---- (gate top mask) - skipped: no anim - # ---- draw_tile_right (seg008.c:456) ---- - if code != 20: # у самой стены правый край не рисуется - level_type = 0 if IS_DUNGEON else 1 - if left_code == 20: - # сосед слева — стена: её правая грань в текущую колонку (chtab_7 id 1) - img = load_sprite(1, CHTAB_WALL, reason="wall right-face(left tile 14)") - ry = TILE_TABLE[20][5] # right_y стены = 2 - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - elif left_code == 0: - # сосед слева — empty: фрагмент окна/решётки по его модификатору - if left_mod <= 3: - bid = BLUELINE_FRAM1[left_mod] - if bid: - img = load_sprite(bid, reason=f"blueline-window(left empty mod{left_mod})") - blit(canvas, img, x, - BLUELINE_FRAM_Y[left_mod] + draw_main_y - (img.height if img else 0) + 1) - elif left_code == 1: - # сосед слева — floor: правый треугольник (42) + СИЛУЭТ КЛАДКИ (44/45) - # на задней стене, если модификатор пола != !!level_type. - img = load_sprite(42, reason="floor-right(part of left tile 01)") - ry = TILE_TABLE[1][5] # right_y пола = 2 - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - num = left_mod if left_mod <= 3 else 0 - if num != level_type: - bid = BLUELINE_FRAM3[num] - img = load_sprite(bid, reason=f"brick-silhouette(left floor mod{num})") - blit(canvas, img, x, draw_main_y - 20 - (img.height if img else 0) + 1) - else: - rid = lt[3] # tile_left.right_id - if rid: - ry = lt[5] - img = load_sprite(rid, reason=f"right(part of left tile {left_code:02X})") - blit(canvas, img, x, ry + draw_main_y - (img.height if img else 0) + 1) - # stripe: only drawn when tbl_level_type != 0 (palace). Dungeon: skip. - sid = lt[6] - if sid and not IS_DUNGEON: - img = load_sprite(sid, reason=f"stripe(left tile {left_code:02X})") - blit(canvas, img, x, draw_main_y - 27 - (img.height if img else 0) + 1) - - # ---- draw_tile_anim_right (seg008.c:530) ---- - # «Анимированные» части соседа слева, проецируемые в текущий тайл. - # Статикой (кадр покоя) рисуем те, что формируют ГЕОМЕТРИЮ фона: - # gate -> решётка (portcullis) на границе с левой комнатой; - # loose -> правый треугольный край шаткой плиты (иначе провал в полу); - # spike -> статичный кадр шипов по модификатору. - # torch-flame/chomper — чистая анимация, пропускаем (отдельные sprite_t). - if left_code == 4: # tiles_4_gate - draw_gate_back(canvas, left_mod, draw_xh, draw_bottom_y, draw_main_y) - elif left_code == 11: # tiles_11_loose — правый край плиты (loose_fram_right[0]=42) - img = load_sprite(42, reason="loose right (part of left tile 0B)") - if img: - blit(canvas, img, x, (draw_bottom_y - 1) - img.height + 1) - elif left_code == 2: # tiles_2_spike — статичный кадр (spikes_fram_right) - sf = 5 if (left_mod & 0x80) else left_mod - sid = SPIKES_FRAM_RIGHT[sf] if 0 <= sf < len(SPIKES_FRAM_RIGHT) else 0 - if sid: - img = load_sprite(sid, reason="spike right (part of left tile 02)") - if img: - blit(canvas, img, x, (draw_main_y - 7) - img.height + 1) - - # ---- draw_tile_bottom (seg008.c:570) ---- - if code == 20: - # Сплошная НИЖНЯЯ грань стены (chtab_7 wall_fram_bottom) + декали. - wmod = wall_modifier(room, drawn_row, col) - img = load_sprite(WALL_FRAM_BOTTOM[wmod], CHTAB_WALL, reason="wall bottom-face") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - wall_pattern(canvas, room, drawn_row, col, 0, 0) - else: - bid = t[8] - img = load_sprite(bid, reason=f"bottom({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - # ---- draw_loose (seg008.c:600) — статический кадр loose floor ---- - # Нижняя часть шаткой плиты (loose_fram_bottom[0]=43) на draw_bottom_y. - if code == 11: # 0x0B loose floor - img = load_sprite(43, reason="loose bottom (draw_loose)") - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - # ---- draw_tile_base (seg008.c:611) ---- - base_id = t[0] - base_y = t[2] - ybottom = draw_main_y - if left_code == 0x1A and code == 0x0C: - # seg008:622 «Lattice + door A»: у doortop своей базы нет (base_id 0), - # и рядом с аркой (lattice_down слева) он рисуется ОДНИМ спрайтом 6, - # опущенным на 3 px. Без этой ветки на месте тайла чёрная дыра. - base_id = 6 - ybottom += 3 - elif code == 11: # loose floor: базовая (верхняя) часть = loose_fram_left[0] = 41 - base_id = 41 - img = load_sprite(base_id, reason=f"base({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, x, base_y + ybottom - img.height + 1) - - # ---- draw_tile_anim ---- (spike/potion/chomper animated) skipped - - # ---- draw_tile_fore (seg008.c:690) ---- - if code == 20: - # Основная (средняя) грань стены (chtab_7 wall_fram_main) + декали/марки. - wmod = wall_modifier(room, drawn_row, col) - img = load_sprite(WALL_FRAM_MAIN[wmod], CHTAB_WALL, reason="wall main-face") - if img: - blit(canvas, img, x, draw_main_y - img.height + 1) - wall_pattern(canvas, room, drawn_row, col, 1, 1) - fid = t[9] - if fid: - # fore_x — в единицах xh (×8 пикс!), не в пикселях: seg008.c:743 - # xh = fore_x + draw_xh, затем x = xh*8. fore_y — в пикселях. - fx = t[10] * 8 + x - fy = t[11] + draw_main_y - img = load_sprite(fid, reason=f"fore({TILE_NAMES.get(code,'?')})") - if img: - blit(canvas, img, fx, fy - img.height + 1) - - # Save per-tile log (keyed by logical room position: row=drawn_row, col) - TILE_LOGS[(drawn_row, col)] = list(CURRENT_TILE_LOG) - - -def _draw_topright(canvas, tiletype, modifier, x, draw_bottom_y, reason=""): - if tiletype in (7, 12): # doortop_with_floor / doortop -> palace uses frame - return - elif tiletype == 20: # wall - img = load_sprite(2, CHTAB_WALL, reason=reason) - else: - tid = TILE_TABLE[tiletype][7] - if tid == 0: - return - img = load_sprite(tid, reason=reason) - if img: - blit(canvas, img, x, draw_bottom_y - img.height + 1) - - -def render_room(room_num): - with open(os.path.join(LEVEL_DIR, f"res{2000 + room_num}.bin"), "rb") as f: - data = f.read() - level = Level(data) - room = Room(level, room_num) - # load_leftroom(): левая комната по линку L — её col 9 виден на границе - # (col 0) текущей комнаты (напр. решётка ворот из соседней комнаты). - left_link = level.links[room_num][0] - if left_link: - room.left_room = Room(level, left_link) - - canvas = Image.new("RGBA", (320, 192), (0, 0, 0, 0)) - # rows drawn 2,1,0 (bottom first) - for drawn_row in (2, 1, 0): - for col in range(10): - draw_tile(canvas, room, drawn_row, col) - - return canvas, room, level - - -def render_single_tile(code, modifier=0, left_code=20, below_left_code=1): - """Render one tile in isolation on a 40x64 canvas (matching SDLPoP tile box).""" - TILE_W, TILE_H = 40, 64 - canvas = Image.new("RGBA", (TILE_W, TILE_H), (0, 0, 0, 0)) - # Place tile as if it were at drawn_row=2 (bottom), col=0 - drawn_row = 2 - col = 0 - # Build a fake Room backed by single values - class FakeRoom: - def tile(self, r, c): - if c < 0: - return left_code, 0, 0, 0 - if r < 0: - return 1, 0, 0, 0 - if r == drawn_row and c == 0: - return code, 0, 0, modifier - return below_left_code, 0, 0, 0 - room = FakeRoom() - draw_tile(canvas, room, drawn_row, col, left_edge_code=left_code) - return canvas - - -def main(): - import sys - room_num = 1 - if len(sys.argv) > 1: - room_num = int(sys.argv[1]) - - canvas, room, level = render_room(room_num) - out = f"./room{room_num}_render.png" - # Прозрачный фон (задняя чёрная стена, которую мы не рисуем) -> ЧЁРНЫМ, - # а не белым как показывает вьюер прозрачность. Композитим по альфе. - flat = Image.new("RGB", canvas.size, (0, 0, 0)) - flat.paste(canvas, (0, 0), canvas) - flat.save(out) - print(f"Saved {out} ({canvas.width}x{canvas.height})") - - # debug grid with code labels (на чёрном фоне) - from PIL import ImageDraw - dbg = flat.copy() - d = ImageDraw.Draw(dbg) - for r in range(3): - by = 63 * r + 65 - for c in range(10): - x = COL_XH[c] * 8 - d.rectangle([x, by - 63, x + 31, by], outline=(255, 0, 0), width=1) - code, _, _, _ = room.tile(r, c) - d.text((x + 2, by - 60), f"{code:02X}", fill=(255, 255, 0)) - dbg.save(f"./room{room_num}_debug.png") - print(f"Saved room{room_num}_debug.png") - - # Per-tile individual renders (the 30 tiles of the room) - # For proper neighbour context, render each tile inside its real room, - # then crop its 32x64 (40x64) column box. - tiles_dir = f"./tiles_room{room_num}" - os.makedirs(tiles_dir, exist_ok=True) - for r in range(3): - by = 63 * r + 65 - for c in range(10): - x = COL_XH[c] * 8 - code, _, _, _ = room.tile(r, c) - # crop the column box (40 wide to include left overlap, 64 tall above bottom) - box = (x, by - 64, x + 40, by) - tile_img = canvas.crop(box) - tile_img.save(os.path.join(tiles_dir, f"r{r}c{c}_{code:02X}.png")) - print(f"Saved 30 tile crops to {tiles_dir}/") - # Per-tile report: which images each tile pulls and why. - print() - print("=" * 78) - print(f"PER-TILE SPRITE REPORT (room {room_num}, {'DUNGEON' if IS_DUNGEON else 'PALACE'})") - print("=" * 78) - for r in range(3): - for c in range(10): - code, fg_byte, mbit, bb = room.tile(r, c) - name = TILE_NAMES.get(code, f"?0x{code:02X}") - btd = level.backtable_desc(code, bb) - line = (f"\n[{r},{c}] code=0x{code:02X} ({name}) " - f"fg=0x{fg_byte:02X} mbit={mbit} backtable=0x{bb:02X} ({btd})") - # If this tile is an event activator (group 'event'), show the door it drives. - if code in (0x06, 0x0F): - scr, loc, trig = level.door_for_event(bb) - line += f"\n -> DOOR EVENT id={bb}: screen={scr} loc={loc} trigger_next={trig}" - print(line) - logs = TILE_LOGS.get((r, c), []) - if not logs: - print(" (no sprites drawn)") - for sid, source, reason in logs: - print(f" res{200+sid:03d}.png <- {source:8s} {reason}") - print() - print("=" * 78) - - # Level-level summary: start position, links, door events, guards. - print() - print("LEVEL STRUCTURE SUMMARY") - print("-" * 78) - print(f"start position: room={level.start[0]} loc={level.start[1]} dir={level.start[2]}") - links = level.links.get(room_num, (0, 0, 0, 0)) - print(f"room {room_num} links: L={links[0]} R={links[1]} Up={links[2]} Dn={links[3]}") - # guard in this room - gi = room_num - 1 - gloc = level.guard_loc[gi] - if gloc < 30: - gr, gc = gloc // 10, gloc % 10 - print(f"guard: loc=tile(r{gr},c{gc}) dir={level.guard_dir[gi]} " - f"skill={level.guard_skill[gi]} colour={level.guard_colour[gi]}") - else: - print("guard: none") - # door events driven by any tile in this room - print("door events referenced by this room's tiles:") - seen = set() - for off in range(30): - fb, code, mbit = room.fg[off] - bb = room.bg[off] - if code in (0x06, 0x0F): - if bb not in seen: - seen.add(bb) - scr, loc, trig = level.door_for_event(bb) - print(f" event id={bb} (tile off {off}): screen={scr} loc={loc} trigger_next={trig}") - if not seen: - print(" (none)") - - print() - print("Room", room_num, "foreground codes (3 rows x 10 cols):") - for r in range(3): - print(" ", " ".join(f"{room.tile(r,c)[0]:02X}" for c in range(10))) - - -if __name__ == "__main__": - main() diff --git a/applications/SprPoP/tools/tests/test_pop_idx.py b/applications/SprPoP/tools/tests/test_pop_idx.py deleted file mode 100644 index 6650421..0000000 --- a/applications/SprPoP/tools/tests/test_pop_idx.py +++ /dev/null @@ -1,244 +0,0 @@ -"""test_pop_idx — формат дисковых индексов аудио (tools/pop_idx.py). - -Индекс читают ДВЕ стороны: упаковщик на хосте и загрузчик на Z80. Тест -закрепляет ровно то, на что рассчитывает вторая сторона: точные смещения -полей, little-endian, размер сектора и НАБОР ОТКАЗОВ — потому что битый -индекс обязан выключить звук, а не увести насос в чужую память. - -Запуск: make test-tools (либо python3 -m unittest discover tools/tests) -""" -import os -import struct -import sys -import unittest - -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -import pop_idx as X - - -def empty(): - return [(0, 0, 0)] * X.SND_COUNT - - -class SndFormat(unittest.TestCase): - """PSI1: раскладка байтов, на которую смотрит Z80.""" - - def test_size_is_one_sector(self): - self.assertEqual(len(X.snd_pack(empty(), 1)), X.SECTOR) - - def test_header_fields(self): - d = X.snd_pack(empty(), 9) - self.assertEqual(d[0:4], b"PSI1") - self.assertEqual(d[4], 57) # число записей - self.assertEqual(d[5], 5) # sizeof(pop_snd_ent_t) в SDCC z80 - self.assertEqual(d[6], 7) # log2(128) - self.assertEqual(d[7], 1) # u8 mono 10937.5 - self.assertEqual(d[8], 9) # фактических страниц - self.assertEqual(d[9:16], b"\0" * 7) - - def test_entry_is_little_endian_at_fixed_offset(self): - """Смещение записи и порядок байтов — контракт с загрузчиком.""" - e = empty() - e[3] = (2, 0x1500, 0x0480) - d = X.snd_pack(e, 9) - at = X.SND_HDR + 3 * X.SND_REC - self.assertEqual(d[at], 2) - self.assertEqual(d[at + 1:at + 3], b"\x00\x15") # off LE - self.assertEqual(d[at + 3:at + 5], b"\x80\x04") # len LE - self.assertEqual(struct.unpack_from("> 1) + 0x40, f"байт {v:#04x}") - - def test_silence_stays_silence(self): - for gain in (0.5, 0.25, 0.1, 1.0): - self.assertEqual(X.gain_table(gain)[X.SILENCE], X.SILENCE) - - def test_no_clipping_and_range_shrinks(self): - t = X.gain_table(0.5) - self.assertEqual(t[0x00], 0x40) - self.assertEqual(t[0xFF], 0xBF) - for v in range(256): - self.assertLessEqual(abs(t[v] - X.SILENCE), abs(v - X.SILENCE)) - - def test_gain_one_is_identity(self): - self.assertEqual(X.gain_table(1.0), bytes(range(256))) - - def test_gain_out_of_range_rejected(self): - for bad in (-0.1, 1.5): - with self.assertRaises(SystemExit): - X.gain_table(bad) - - -def make_arc(bodies): - """Собрать PBA1 ровно так, как это делает tools/pop_pack_arc.py.""" - raw = bytearray(X.ARC_HEADER) - raw[0:4] = X.ARC_MAGIC - raw[4] = len(bodies) - blob = bytearray() - for i, body in enumerate(bodies): - off = X.ARC_HEADER + len(blob) - struct.pack_into("/. -/tests/*/*.exe - -# Клон исторических исходников VC служит локальным справочным материалом и -# сохраняет собственный .git; во внешний репозиторий его как gitlink не кладём. -/VolkovCommander/ - -# Собственный выход Commander и локальные пути к SDK/MAME. -local.mk -build/ -artifacts/*-local/ -.sprinter-cc-*/ -.resource-stamps/ -*.o -*.obj -*.dSYM/ -__pycache__/ -*.py[cod] -.DS_Store -._* -.vscode/ diff --git a/applications/Volkov/.python-version b/applications/Volkov/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/applications/Volkov/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/applications/Volkov/LICENSE b/applications/Volkov/LICENSE deleted file mode 100644 index a738358..0000000 --- a/applications/Volkov/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/Volkov/Makefile b/applications/Volkov/Makefile deleted file mode 100644 index fe4263d..0000000 --- a/applications/Volkov/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -# Sprinter Commander — двухпанельный файловый менеджер. - -EXAMPLE := sprcmd -SRC_DIR := src -BUILD_DIR := build -MEMORY := big -ALLOCS ?= 3000 -HDD_IMG := $(CURDIR)/build/hdd/sprcmd.chd -MDVIEW2_DIR := $(CURDIR)/tests/fixtures/mdview2 -MDVIEW2_SRCS := $(wildcard $(MDVIEW2_DIR)/*.c) -MDVIEW2_HEADERS := $(wildcard $(MDVIEW2_DIR)/*.h) -MDVIEW2_TEST_EXE := $(CURDIR)/build/external/mdview2.exe -P5_COPY_FAULT_EXE := $(CURDIR)/build/tests/cperr.exe -P6_SORT_TEST_EXE := $(CURDIR)/build/tests/sortrt.exe -P7_SELECT_TEST_EXE := $(CURDIR)/build/tests/selrt.exe -P9_MKDIR_TEST_EXE := $(CURDIR)/build/tests/mkrt.exe -P10_RENAME_TEST_EXE := $(CURDIR)/build/tests/renrt.exe -P11_DELETE_TEST_EXE := $(CURDIR)/build/tests/delrt.exe -P19_OVERWRITE_TEST_EXE := $(CURDIR)/build/tests/p19/delrt.exe -BANK1_SRCS := src/sc_source_fs.c src/sc_sort.c src/sc_select.c \ - src/sc_copy_job.c src/sc_metadata.c src/sc_disk.c src/sc_tree.c src/sc_exec_ui.c -BANK2_SRCS := src/sc_draw.c src/sc_dialog.c src/sc_copy_ui.c \ - src/sc_file_ui.c src/sc_name.c src/sc_rename.c -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -I include \ - $(foreach f,$(BANK1_SRCS),--bank 1=$(f)) \ - $(foreach f,$(BANK2_SRCS),--bank 2=$(f)) -EXTRA_SRCS := \ - src/sc_app.c \ - src/sc_command.c \ - src/sc_input.c \ - src/sc_path.c \ - src/sc_panel.c \ - src/sc_platform_screen.c \ - src/sc_platform_exec.c \ - src/sc_screen.c \ - src/sc_store.c \ - src/sc_theme.c \ - src/sc_video_system.c - -include $(CURDIR)/sdk.mk - -HEADERS := $(wildcard include/*.h) - -$(EXE): Makefile $(HEADERS) $(BANK1_SRCS) $(BANK2_SRCS) - -hdd-stress: $(EXE) - sh tests/make_p3_stress_hdd.sh $(CURDIR)/build/hdd/p3_stress.chd $(EXE) - -hdd-copy: $(EXE) - sh tests/make_p4_copy_hdd.sh $(CURDIR)/build/hdd/p4_copy.chd $(EXE) - -tests/p4_exec_child/p4child.exe: tests/p4_exec_child/p4child.c \ - tests/p4_exec_child/Makefile - $(MAKE) -C tests/p4_exec_child ALLOCS=$(ALLOCS) - -hdd-exec: $(EXE) tests/p4_exec_child/p4child.exe - sh tests/make_p4_exec_hdd.sh $(CURDIR)/build/hdd/p4_exec.chd \ - $(EXE) tests/p4_exec_child/p4child.exe - -hdd-p5: $(EXE) - sh tests/make_p5_hdd.sh $(CURDIR)/build/hdd/p5_stability.chd $(EXE) - -hdd-p5-enospc: $(EXE) - sh tests/make_p5_enospc_hdd.sh \ - $(CURDIR)/build/hdd/p5_enospc.chd $(EXE) - -hdd-p5-panels: $(EXE) - sh tests/make_p5_panel_edges_hdd.sh \ - $(CURDIR)/build/hdd/p5_panel_edges.chd $(EXE) - -$(MDVIEW2_TEST_EXE): $(MDVIEW2_SRCS) $(MDVIEW2_HEADERS) $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory small --max-allocs $(ALLOCS) \ - -o $@ $(MDVIEW2_SRCS) - -hdd-p5-viewer: $(EXE) $(MDVIEW2_TEST_EXE) - sh tests/make_p5_viewer_hdd.sh \ - $(CURDIR)/build/hdd/p5_viewer.chd $(EXE) \ - $(MDVIEW2_TEST_EXE) $(MDVIEW2_DIR)/README.md - -$(P5_COPY_FAULT_EXE): tests/p5_copy_faults.c src/sc_copy_job.c \ - src/sc_metadata.c src/sc_disk.c \ - src/sc_path.c src/sc_platform_exec.c include/sc_copy.h \ - include/sc_metadata.h include/sc_disk.h include/sc_path.h \ - include/sc_exec.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_copy_job.c --bank 1=src/sc_metadata.c \ - --bank 1=src/sc_disk.c -o $@ \ - tests/p5_copy_faults.c src/sc_path.c src/sc_platform_exec.c - -hdd-p5-copy-faults: $(P5_COPY_FAULT_EXE) - sh tests/make_p5_copy_faults_hdd.sh \ - $(CURDIR)/build/hdd/p5_copy_faults.chd $(P5_COPY_FAULT_EXE) - -hdd-p5-media: $(EXE) - sh tests/make_p5_media_hdd.sh \ - $(CURDIR)/build/hdd/p5_media.chd $(EXE) - -$(P6_SORT_TEST_EXE): tests/p6_sort_probe.c src/sc_sort.c src/sc_store.c \ - include/sc_entry.h include/sc_panel.h include/sc_sort.h \ - include/sc_store.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_sort.c -o $@ \ - tests/p6_sort_probe.c src/sc_store.c - -hdd-p6-sort: $(EXE) $(P6_SORT_TEST_EXE) - sh tests/make_p6_sort_hdd.sh $(CURDIR)/build/hdd/p6_sort.chd \ - $(EXE) $(P6_SORT_TEST_EXE) - -$(P7_SELECT_TEST_EXE): tests/p7_select_probe.c src/sc_select.c \ - src/sc_store.c include/sc_entry.h include/sc_panel.h \ - include/sc_select.h include/sc_store.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_select.c -o $@ \ - tests/p7_select_probe.c src/sc_store.c - -hdd-p7-select: $(EXE) $(P7_SELECT_TEST_EXE) - sh tests/make_p7_select_hdd.sh $(CURDIR)/build/hdd/p7_select.chd \ - $(EXE) $(P7_SELECT_TEST_EXE) - -hdd-p8-masks: hdd-p7-select - -$(P9_MKDIR_TEST_EXE): tests/p9_mkdir_probe.c src/sc_name.c src/sc_path.c \ - include/sc_path.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_name.c -o $@ \ - tests/p9_mkdir_probe.c src/sc_path.c - -hdd-p9-mkdir: $(EXE) $(P9_MKDIR_TEST_EXE) - sh tests/make_p9_mkdir_hdd.sh $(CURDIR)/build/hdd/p9_mkdir.chd \ - $(EXE) $(P9_MKDIR_TEST_EXE) - -$(P10_RENAME_TEST_EXE): tests/p10_rename_probe.c src/sc_rename.c \ - include/sc_file_ops.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_rename.c -o $@ \ - tests/p10_rename_probe.c - -hdd-p10-rename: $(EXE) $(P10_RENAME_TEST_EXE) - sh tests/make_p10_rename_hdd.sh $(CURDIR)/build/hdd/p10_rename.chd \ - $(EXE) $(P10_RENAME_TEST_EXE) - -$(P11_DELETE_TEST_EXE): tests/p11_delete_probe.c $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -o $@ tests/p11_delete_probe.c - -hdd-p11-delete: $(EXE) $(P11_DELETE_TEST_EXE) - sh tests/make_p11_delete_hdd.sh $(CURDIR)/build/hdd/p11_delete.chd \ - $(EXE) $(P11_DELETE_TEST_EXE) - -hdd-p12-group-copy: $(EXE) - sh tests/make_p12_group_copy_hdd.sh \ - $(CURDIR)/build/hdd/p12_group_copy.chd $(EXE) - -hdd-p13-group-delete: $(EXE) - sh tests/make_p13_group_delete_hdd.sh \ - $(CURDIR)/build/hdd/p13_group_delete.chd $(EXE) - -hdd-p14-default-colors: $(EXE) - sh tests/make_p14_default_colors_hdd.sh \ - $(CURDIR)/build/hdd/p14_default_colors.chd $(EXE) - -hdd-p15-tree-copy: $(EXE) - sh tests/make_p15_tree_copy_hdd.sh \ - $(CURDIR)/build/hdd/p15_tree_copy.chd $(EXE) - -hdd-p15-tree-cancel: $(EXE) - sh tests/make_p15_tree_cancel_hdd.sh \ - $(CURDIR)/build/hdd/p15_tree_cancel.chd $(EXE) - -hdd-p15-tree-self: $(EXE) - sh tests/make_p15_tree_self_hdd.sh \ - $(CURDIR)/build/hdd/p15_tree_self.chd $(EXE) - -hdd-p16-group-tree-copy: $(EXE) - sh tests/make_p16_group_tree_copy_hdd.sh \ - $(CURDIR)/build/hdd/p16_group_tree_copy.chd $(EXE) - -hdd-p17-tree-delete: $(EXE) - sh tests/make_p17_tree_delete_hdd.sh \ - $(CURDIR)/build/hdd/p17_tree_delete.chd $(EXE) - -hdd-p17-tree-delete-cancel: $(EXE) - sh tests/make_p17_tree_delete_cancel_hdd.sh \ - $(CURDIR)/build/hdd/p17_tree_delete_cancel.chd $(EXE) - -hdd-p18-metadata: $(EXE) - sh tests/make_p18_metadata_hdd.sh \ - $(CURDIR)/build/hdd/p18_metadata.chd $(EXE) - -$(P19_OVERWRITE_TEST_EXE): tests/p19_overwrite_probe.c \ - src/sc_copy_job.c src/sc_metadata.c src/sc_disk.c src/sc_path.c \ - include/sc_copy.h include/sc_metadata.h include/sc_disk.h \ - include/sc_path.h $(LIB) - mkdir -p $(dir $@) - $(PROJ_ROOT)/bin/sprinter-cc --memory big --safe --max-allocs $(ALLOCS) \ - -I include --bank 1=src/sc_copy_job.c --bank 1=src/sc_metadata.c \ - --bank 1=src/sc_disk.c \ - -o $@ tests/p19_overwrite_probe.c src/sc_path.c - -hdd-p19-overwrite: $(P19_OVERWRITE_TEST_EXE) - sh tests/make_p19_overwrite_hdd.sh \ - $(CURDIR)/build/hdd/p19_overwrite.chd $(P19_OVERWRITE_TEST_EXE) - -hdd-p19-policy: $(EXE) - sh tests/make_p19_policy_hdd.sh \ - $(CURDIR)/build/hdd/p19_policy.chd $(EXE) - -.PHONY: hdd-stress hdd-copy hdd-exec hdd-p5 hdd-p5-enospc hdd-p5-panels \ - hdd-p5-viewer hdd-p5-copy-faults hdd-p5-media hdd-p6-sort hdd-p7-select \ - hdd-p8-masks hdd-p9-mkdir hdd-p10-rename hdd-p11-delete \ - hdd-p12-group-copy hdd-p13-group-delete hdd-p14-default-colors \ - hdd-p15-tree-copy hdd-p15-tree-cancel hdd-p15-tree-self \ - hdd-p16-group-tree-copy hdd-p17-tree-delete hdd-p17-tree-delete-cancel \ - hdd-p18-metadata hdd-p19-overwrite hdd-p19-policy diff --git a/applications/Volkov/README.md b/applications/Volkov/README.md deleted file mode 100644 index b66dfad..0000000 --- a/applications/Volkov/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# Sprinter Commander - -Функциональный аналог классического двухпанельного Commander для Sprinter -Sp2000. Volkov Commander 4.05/4.99 и Dos Navigator используются как -поведенческие и архитектурные референсы; проект не является переносом их -DOS-кода. - -Текущее состояние: PoC 0.1 (этапы P1–P5) пройден в MAME / BIOS 3.06 / -DSS 1.71.57; аппаратный smoke-тест остаётся внешним контрольным пунктом. -Начат этап 0.2: готовы независимые для каждой панели сортировки по имени, -расширению, размеру и дате/времени в обоих направлениях, выбор записей через -`Insert`, `*` и маски `+`/`-`, создание каталога по `F7` и локальное -переименование файла/каталога по `F6` без overwrite, однообъектный F8 и -групповой рекурсивный F8 для выбранных файлов и каталогов, а также рекурсивный -F5 для выбранных файлов и каталогов. F5 сохраняет FAT date/time и атрибуты -`R/H/S/A` обычных файлов и поддерживает conflict-policy -`overwrite/skip/rename`, включая `overwrite all`/`skip all`, отдельную -защиту readonly и backup/rollback. Обход использует динамическую EMM-очередь. -Встроенный профиль имён уже различает белые каталоги, жёлтые `.EXE` и -светло-серые остальные файлы; загрузка пользовательских цветовых правил -остаётся задачей 1.0. -Командер -сканирует, хранит и сортирует каталоги, показывает явную виртуальную запись -предела DSS 1.71, безопасно копирует один файл через выделенную EMM-страницу -W3 и запускает `.EXE` с восстановлением режима, палитры, CWD и обеих панелей. - -## Сборка - -Из этого каталога: - -```sh -make -``` - -Результат: `build/sprcmd.exe`, конфигурация -`--memory big --safe --max-allocs 3000`. Значение `ALLOCS=3000` принято как -исходное для Commander и всех его проб; при диагностике его можно переопределить -явно, например `make ALLOCS=4000`. - -Основные тесты используют быстрый HDD `D:`: - -```sh -make hdd # только Commander -make hdd-stress # большой каталог P3 -make hdd-copy # набор успех/overwrite/cancel/zero для P4.1 -make hdd-exec # запуск child/restore/error для P4.2 -make hdd-p5 # 20 copy, граничные размеры, 100 refresh, lifecycle -make hdd-p5-enospc # реальный disk-full и cleanup temp -make hdd-p5-panels # точные границы панели 27/28 записей -make hdd-p5-copy-faults # детерминированная матрица ошибок copy/EXEC -make hdd-p5-viewer # запуск реального mdview2 и восстановление Commander -make hdd-p5-media # снятие/возврат hard2 во время F5 -make hdd-p6-sort # target-матрица и UI-сценарий сортировок 0.2 -make hdd-p7-select # выбор Insert/*, статистика и EMM cleanup -make hdd-p8-masks # тот же расширенный образ: редактор и маски +/− -make hdd-p9-mkdir # validator DOS 8.3, mkdir/error/CWD и UI F7 -make hdd-p10-rename # file/dir rename, no-overwrite, CWD и UI F6 -make hdd-p11-delete # confirm/cancel, file/empty-dir, guards и UI F8 -make hdd-p12-group-copy # legacy group fixture; current F5 also copies selected dirs -make hdd-p13-group-delete # legacy file-only group F8 regression -make hdd-p14-default-colors # built-in dir/EXE/file colours и restore палитры -make hdd-p15-tree-copy # recursive current directory, depth=16 и repeat guard -make hdd-p15-tree-cancel # Esc в 4-МБ файле и cleanup temp/traversal page -make hdd-p15-tree-self # target-inside-source guard до mutation -make hdd-p16-group-tree-copy # selected files + multiple directory roots -make hdd-p17-tree-delete # recursive group F8, depth=12, cancel confirmation -make hdd-p17-tree-delete-cancel # Esc после начала recursive group F8 -make hdd-p18-metadata # exact FAT date/time + R/H/S/A после F5 -make hdd-p19-overwrite # target backup/commit/rollback matrix -make hdd-p19-policy # UI overwrite/skip/rename/all/readonly/cancel -``` - -`make floppy` сохранён для smoke-проверки совместимости с FDD и не запускает -эмулятор. Подробнее: [политика тестовых носителей](docs/test-media.md). - -## Документы - -- [требования PoC](docs/commander-requirements.md); -- [архитектура](docs/commander-architecture.md); -- [roadmap](docs/commander-roadmap.md); -- [клавиши и команды](docs/commander-keymap.md); -- [результаты платформенных проб P1](docs/p1-platform-probes.md); -- [экранный backend и границы BIOS API](docs/p2-screen-backend.md); -- [результаты coordinate-screen probe P2.1](docs/p2-screen-probe-results.md); -- [результаты системной палитры P2.2](docs/p2-palette-results.md); -- [результаты двухпанельного skeleton P2](docs/p2-skeleton-results.md); -- [результаты файловых панелей P3](docs/p3-panel-results.md); -- [результаты копирования P4.1](docs/p4-copy-results.md); -- [результаты запуска EXE P4.2](docs/p4-exec-results.md); -- [результаты стабилизации P5](docs/p5-stability-results.md); -- [результаты сортировок 0.2/P6](docs/p6-sort-results.md); -- [результаты выбора записей 0.2/P7](docs/p7-selection-results.md); -- [результаты выбора по маске 0.2/P8](docs/p8-mask-results.md); -- [результаты создания каталога 0.2/P9](docs/p9-mkdir-results.md); -- [результаты локального rename 0.2/P10](docs/p10-rename-results.md); -- [результаты однообъектного delete 0.2/P11](docs/p11-delete-results.md); -- [результаты группового F5 0.2/P12](docs/p12-group-copy-results.md); -- [результаты группового F8 0.2/P13](docs/p13-group-delete-results.md); -- [результаты стандартных цветов P14](docs/p14-default-colors-results.md); -- [результаты рекурсивного F5/P15](docs/p15-tree-copy-results.md); -- [результаты рекурсивного group F5/P16](docs/p16-group-tree-copy-results.md); -- [результаты рекурсивного group F8/P17](docs/p17-tree-delete-results.md); -- [результаты сохранения метаданных F5/P18](docs/p18-metadata-results.md); -- [результаты conflict-policy F5/P19](docs/p19-copy-policy-results.md); -- [направление развития UI по образцу VC](docs/ui-reference.md); -- [инструкция и ограничения PoC 0.1](docs/poc-0.1-release.md); -- [носители интеграционных тестов](docs/test-media.md); -- [предел больших каталогов DSS и стратегия Commander](docs/dss-large-directories.md). - -Экран выводится системными координатными функциями ESTEX/BIOS без оконных -дескрипторов и без прямой адресации VRAM. Системные вызовы палитры разрешены; -их save/set/readback/restore и многоцветная сцена подтверждены пробой P2.2. diff --git a/applications/Volkov/artifacts/mame-p1/README.md b/applications/Volkov/artifacts/mame-p1/README.md deleted file mode 100644 index e288d21..0000000 --- a/applications/Volkov/artifacts/mame-p1/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Артефакты MAME-прогона P1 - -Дата: 6 сентября 2026 года. - -Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`, текущие системные -образы проекта. `p1probe.exe` и `p1child.exe` запускались с дискеты A:. - -Каталоги: - -- `directory/` — CWD, `*.*`, `*`, завершение F_NEXT с `ENOENT=3`; - `strict-enoent.png` снят после удаления временного допуска `EISDIR`; -- `emm/` — три страницы, граничные patterns и возврат free pages; -- `dskinfo/` — геометрия и свободное место текущего диска; -- `winrest/` — полный экран 80x32 и частичный вывод из offset `0x2000`; - `partial-phase-hidden.png`/`partial-stable.png` показывают неудачные raw- - атрибуты, а `partial-flash-phase.png`/`partial-contrast-stable.png` — - именованный цветной pattern. Повторная проверка декодированных RGB показала, - что два последних кадра пиксельно идентичны; P2.2 отдельно подтвердил - стабильность четырёх палитровых планов; -- `exec/` — оба вызова child и итоговые значения EXEC/WAIT; -- `exec-then-emm/` — повторный EMM-тест после двух EXEC в том же процессе; -- `keyboard-commander/` — навигация, F1–F10, Ctrl+R, Ctrl+PgUp, Alt+F1; -- `keyboard/` — дополнительная проба Ctrl+A, Alt+X и Shift+Tab. - -Нумерованные клавиатурные кадры соответствуют времени сценария: - -- `0000.png` — первые навигационные события; -- `0001.png` — продолжение навигации и начало F-клавиш; -- `0002.png` — полная базовая таблица до сочетаний; -- `0003.png` — сочетания, Esc и общий `RESULT: PASS`; -- `0004.png` — возврат в главное меню. - -Интерпретация результатов и ссылки на основные кадры находятся в -`docs/p1-platform-probes.md` и `docs/commander-keymap.md`. -Актуальная интерпретация палитры находится в -`docs/p2-palette-results.md`. diff --git a/applications/Volkov/artifacts/mame-p1/directory/menu.png b/applications/Volkov/artifacts/mame-p1/directory/menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 TcDriU0bI_wpC+C1{q%-AQC``bOizeN(fy# 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

    UN@v@& z@?kk~OxxSRk4Er9x%xp4wMrO1gtYNA#XkqqUK<{BNGb+?u^+=49h&T3c~y5pSe-Xh zQf;3fqsX2w@UIq?p4sbSJR3Drz7f6pkyY>xqLRu7UZ(vDs&qPVKGF><^x7>Mm-&iB z=5SC!2cR)#CKC|3Be^S7|DJkEax+aF_?lyF4jTJv899I+d48dy5_c_QVQ%``3r=2v zD{7MO&Uy(Exa_fR!>5-|SYYo%*3M^MGNdvuBZO3n=AzGarmMWPW=YqLt%ZMm`5IYs zw^@A@cI#Z%gAMOubG6r%d{(wI9^qccJ)e6SiJ;7{ZX|C~1cWl-^ci}8{cE$6K;6Jy z^mf4e`p!~JQ8r(b!pn!<_cTPqr7Qfoc)6^rd6?GK*Y*Bvs&iS${ugVpG zSEB`5x?hbjI5x?q{+=(wUB-F?lTFc*wfQO?yTL;`Kb zT^=0lo2`w?&zH;aa@}yu6pnmf1c*3aD0aq#nhv?a!r`?9=yab)H=$$>KmxLuv zgD68}0pj$Ar;$>EGes)rLyl_bvs|LUBTiglpaI`PLtMdWnf!%hym3Y-(oYgY)ei;}2KB>I8`0Lp z+uuAuhX-o4p5fdmNTNrW%4Vk?WNg^1XuSXJ-vq&5&4z1Y8Qlp=s_@A(u9_`You7b@ zW51`y>0}W&TAn<}0^Z48>q+)d=!8Q~4K%ua33N#`tME^C)7kBY`F8hi?W)EhYYaHH z3qyWdH(ZQACVPx_?V;yp@q979$DG1-t!t(>*O1cdAg+8yC|#$&$9S&qocPo!J~j)% zdQ-trwRyW_YTa@PwEXp_1j&e^yAHNP(gs8{siz=fOx|@>AA&>}6`wo8+Q6>Z@)&dV5xDKooivdBV61ZbTkr!oR)T17 zx9y0C5}eG^8;erUY8@$jh~Mzq=)n^)@u{S9_4!|o=b$vuwPU-v{kVPm!kDnBnXNx2 zA3c!u34!Iutz#`DSOjxhLyEu@FY{^2pR-?t!IX@f;=Ir&n>y{U&Mcdhm3MTFaI|&N z5N)S<1B|%FY?sI5l0$9KGq*KEZ$u}RBHpw6v0Oc#4X<7b#rp-=1?Odn)m9Xst-Gr|A-Bis{sskssO)1Y`@+HIy&qpjxTZ#ArS7I(D}Elsf-WRGj}DQt1n-j= zD_Ti|qzD_;rLYg-PC+`N;unuE&pZ7n*_@yW71PQgkQCFZ_&#r^0@Era)T^4LkP!6) z4i&om#f(%wji)j0OpM3?zlrWaEsKjLkEo~f zd*w2ILwa1UkzC<<3(a-#g^l_J_g+8@Dt8XKZH^A_E4Gh%iAA6y zW*=7oSv~;qt+UxLMg)&#J(|Py>*R+Wh{?QW5jV~;!a}&_kpZO>r#G- zX}V5gPkOlMVO@&xvggF*zI%ML;%=f!(H6UOu>OCA*}rbde+l~kUgpmO)<3BEuV+F3 zJ$CuGi~m1y@n3&h{`rIQKX-GtWKV>0a`(M~*YM%5Q{kZNcY+{(Zb6~Wfv!hP^-Qme zD#$6Ssfu2`r{JOtR8)15@({;%vPa5%9~lk{a(!^b+%?EG5GHEw6AY6PH4bt16*YDC i7KQi+dit^-ux}I<6cmOMi8l{zGrn#HdZT|g=6?Vgo0-f2 diff --git a/applications/Volkov/artifacts/mame-p1/directory/strict-enoent.png b/applications/Volkov/artifacts/mame-p1/directory/strict-enoent.png deleted file mode 100644 index 6d97dd1dc767796e71d78ae96c2f7fd5397e32bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8001 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 Js{0`7-vE|fuJZr@ diff --git a/applications/Volkov/artifacts/mame-p1/directory/strict-menu.png b/applications/Volkov/artifacts/mame-p1/directory/strict-menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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

    UN@v@& z@?kk~OxxSRk4Er9x%xp4wMrO1gtYNA#XkqqUK<{BNGb+?u^+=49h&T3c~y5pSe-Xh zQf;3fqsX2w@UIq?p4sbSJR3Drz7f6pkyY>xqLRu7UZ(vDs&qPVKGF><^x7>Mm-&iB z=5SC!2cR)#CKC|3Be^S7|DJkEax+aF_?lyF4jTJv899I+d48dy5_c_QVQ%``3r=2v zD{7MO&Uy(Exa_fR!>5-|SYYo%*3M^MGNdvuBZO3n=AzGarmMWPW=YqLt%ZMm`5IYs zw^@A@cI#Z%gAMOubG6r%d{(wI9^qccJ)e6SiJ;7{ZX|C~1cWl-^ci}8{cE$6K;6Jy z^mf4e`p!~JQ8r(b!pn!<_cTPqr7Qfoc)6^rd6?GK*Y*Bvs&iS${ugVpG zSEB`5x?hbjI5x?q{+=(wUB-F?lTFc*wfQO?yTL;`Kb zT^=0lo2`w?&zH;aa@}yu6pnmf1c*3aD0aq#nhv?a!r`?9=yab)H=$$>KmxLuv zgD68}0pj$Ar;$>EGes)rLyl_bvs|LUBTiglpaI`PLtMdWnf!%hym3Y-(oYgY)ei;}2KB>I8`0Lp z+uuAuhX-o4p5fdmNTNrW%4Vk?WNg^1XuSXJ-vq&5&4z1Y8Qlp=s_@A(u9_`You7b@ zW51`y>0}W&TAn<}0^Z48>q+)d=!8Q~4K%ua33N#`tME^C)7kBY`F8hi?W)EhYYaHH z3qyWdH(ZQACVPx_?V;yp@q979$DG1-t!t(>*O1cdAg+8yC|#$&$9S&qocPo!J~j)% zdQ-trwRyW_YTa@PwEXp_1j&e^yAHNP(gs8{siz=fOx|@>AA&>}6`wo8+Q6>Z@)&dV5xDKooivdBV61ZbTkr!oR)T17 zx9y0C5}eG^8;erUY8@$jh~Mzq=)n^)@u{S9_4!|o=b$vuwPU-v{kVPm!kDnBnXNx2 zA3c!u34!Iutz#`DSOjxhLyEu@FY{^2pR-?t!IX@f;=Ir&n>y{U&Mcdhm3MTFaI|&N z5N)S<1B|%FY?sI5l0$9KGq*KEZ$u}RBHpw6v0Oc#4X<7b#rp-=1?Odn)m9Xst-Gr|A-Bis{sskssO)1Y`@+HIy&qpjxTZ#ArS7I(D}Elsf-WRGj}DQt1n-j= zD_Ti|qzD_;rLYg-PC+`N;unuE&pZ7n*_@yW71PQgkQCFZ_&#r^0@Era)T^4LkP!6) z4i&om#f(%wji)j0OpM3?zlrWaEsKjLkEo~f zd*w2ILwa1UkzC<<3(a-#g^l_J_g+8@Dt8XKZH^A_E4Gh%iAA6y zW*=7oSv~;qt+UxLMg)&#J(|Py>*R+Wh{?QW5jV~;!a}&_kpZO>r#G- zX}V5gPkOlMVO@&xvggF*zI%ML;%=f!(H6UOu>OCA*}rbde+l~kUgpmO)<3BEuV+F3 zJ$CuGi~m1y@n3&h{`rIQKX-GtWKV>0a`(M~*YM%5Q{kZNcY+{(Zb6~Wfv!hP^-Qme zD#$6Ssfu2`r{JOtR8)15@({;%vPa5%9~lk{a(!^b+%?EG5GHEw6AY6PH4bt16*YDC i7KQi+dit^-ux}I<6cmOMi8l{zGrn#HdZT|g=6?Vgo0-f2 diff --git a/applications/Volkov/artifacts/mame-p1/dskinfo/menu.png b/applications/Volkov/artifacts/mame-p1/dskinfo/menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 diff --git a/applications/Volkov/artifacts/mame-p1/dskinfo/transition.png b/applications/Volkov/artifacts/mame-p1/dskinfo/transition.png deleted file mode 100644 index b482e9ec0e9fe5f65b231025df680635e3ffaa01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6455 zcmeHMX;f2Lwhp4@EDqg>B7_1d96+XG9-@?@6eT!-s1f4Cq=X0o5+DP%l&A<15ReuU zEJPHP2uLE50Vg5|NeMCr2pC8-Atn$4A!A?cdi`F%wcc8<|JPdg$GzvAd-vV@?)`n= zKKJ^ep#7^?Y+eBZfmR0`*n0#7GBgH(3@nx{0!AL3PK*VCOiBax?g>GcN``|UnuU$E zOohc=E5CoC()gM2NB_YinYXTmKU&rpPrR*JJGA%d_XZmgc{_HUI%)Zql#qAJyN$HJ zJH~wQ0j03q#qn<|EY}qljlTNTbY1bTp*8~VejiUgJXGR=j2fZOb)*XA6R#&2sYoHQ zBt73_=vZ^TWkCK`;IO0Z*ORlrxaV+^TFS(i`~-|{PPYjvRnBwpxQX^c1Xc`%t4qC8 z6Ti*1ms{=6#e7AQ?s`MeveOFXTYFqx+9@d13#UOV#zj3fRl%eYDgvg^OtHWaq@d#* z!KWym20Yd(CT)50?BsxGO3l;b6ll4ilb$|zEEuQe@)+W9Y1-7=jWxnzdl*AVOpid1 z{hGut1YTwjJn*4Hp=fJG;MLq7erv10LOF!wgc7QP%6@hV3CO=+_ai-XaA@eUIbKl% z1IB|%#5m0d0`8fjX643RAp{OYkIBFHbN<$x%ATH{V9cit1wx+oE2^flYg}D*j+J}R zHG+X@8eDLhk*1sJ4i4kk=-Y2E#OGf}&IA4R9{^+e^UJLR@;`b7Zu{p{Y$jZnUM*rt zOfKD$Fk^*iLE;4@xa+{x5AH;dpsP(CS$U_PRfaDvU)4_g!sHd}QCdHqqvTPgr&t0b zd5kF3=2Z#$CplJ4@!5=JyB%+156?YO(J8o!)fmzTaoFV?xb(=zejAMDop6kwxwPq; z+^k&wG0p6LLTL^ww%He6Tnl%g*Fs0nrVYfY+RosD&yODKo5iU7yOjB| zJ>N}&(YzNj?9NL^oZToC$rS4`fhpBZ2~ADT3j@#AMhGk8y?<459>N3BoIB!UOy4pa z6WyK71V}N*Y}?g(DTEZM39s(6bH>!faJ$eXadKZQ_nw^LF7JhN#mvnq9|Xw^!^OD+ zV#y+YoOcj+{^}ff_5qZ0*S8gJcW*O+SvJ)%_j*ZUd52h2!_K}Q+4#n(~F zZNdwm#7AvaXt@;5)VwQ)N=~IGbG=L6V`5By8Fe4iior0Re2|UaEHpZ_BNFxzva@8s zL|-GbYe+aZ>W)QtPi0+D*U6KjQdX8C_&T`{4<1ocIQZgw!7w*PjLB}PVs_3Or}i5N zUE;i*qv@pt6BD0En0&ujiaI;_F}40EXQj!8$Pq!=LHvsxZZzd1$?YplUsp##4Fsr& zA)^(WG>IVp-2-mTk4rGm;2b{Qg>F6l)R{|dNHVE9!{-T32yq`kDcd4plk1}c$=2*7 zILpZPm1l8`fiuF)_hretlz1aBli{POxwGLB*ya+$v1--sBkhde?I`kN!^)agJ4IOX zh?M)?+6u{i&)}4_XO|_0xxBfgs2eo)T}*+ox5?TitWw#Cka78&K@fGwq1tzw9& zbcajzaOMS5`7dQGX|ktb?oseBXfIH}c6C(ok^(|X%aID*IdWg`+=(~q@Ar)wa?ho# zxyh8$j)HPZ)^%aU0Nn=?mQZ^C0Z!#qF`H= zEIyrg8`~ya3;IjUc^}p13WE3aJNn#+SA%ve3!Dpix8HX(ui@K3@kL#XVuL zC&b53o|r*!w6y8T2F@|UQX})n=A<;yBT<50rxlCE>RHKMk5?#$yo`*MT!hWHhZT8G zC;eg8<%C}-eWok0hu?YEZSLzZ)MvhrsSEWXdLSR9c_)iP6zDHql|JdSrCz9b)dXrd zxv!@t3?&`WHjuP&ZC1fy(;kaKOE#Z?20q*wRvSV93>JWG0v|RuHUeM*fMEy+G5n&j zuI{kiod+;oTQF{#gV)K8aIz~*tprif7-sO_uVUtYX;d>W?|G<;xKk@IGRHY?<(I=j9Fu_`|=;( z?7+ZA6=c->w1-~U=U7q353rNa1ZWlL=3OTQL$4rA3=OJvZbypda|7LVnBuFTtxol` z`-;=<^B*a2L$i{Qj@iy4J%-!STKHhe9&SQZM85~Ig`LC9*`!Zl@3g>i&ZrF?e68NE zuf|g$@06APrZJRj)tvgQT`*CRXF$t_!0&dNKE!k+o* zAS~?c@+G$*kvu_CHz}Sc>1IlXAc9e6HMR5AOFryG3AX;Zd_^{o86jdW0+~epd){KF z^&aN(>FPPAUc1s{FecD93sk<_O5Ewj^G^8mMj`GC3k$2F!WbA2!32K(J*>J|uVg_Y zpipQBXn)@*!bPCgvOX~m4V>Y1XF|xW??3O{nQ?gYi2}X^U6m zcg0a-@l}T2!d_O>^4pH$8iPYu^Zs{=H&5gBC1cLf?2rYDtTwj~fAI`R0i=+9kg1X4 z_34c_RIkB0S*1NTb|Jy#;jWj&aJBJPP0s=D#_y-ptSxw1LR1jVm;LJvJd3dr+20I$ zinh9Vad|Qz2t)~3EOwfIet9E>LV58bZTwxHX#NS5>gwuR8$tKfPWMHm!+}aO@>Px^ zaPqsAxn7Z-s0oVD5&DXp0}0~s5z(bU9uVt~!)NGee27&>{>{g2>qRY>4TT&MnON$J zO{>S&XQq9=morCV!J@r8QMJ!R_Ho^)ob?TOG)d-e z82HdS8!vt*H^X!q95;>}ne^NKRlojG!a4q)!8Ic(_C~87NM~R2PwBw-Bc!ItGB-Cb zis7xl*OTWfl6gxq_8k$d))k#?q5i-vh0DV^6V1Eg)K6c5e?wG({G-m#b5_m4V|a|rikAhc`0!ejo3XW>qcoP zJ$J+L6>n}fAT>}(D>ypi%>Ed!Iob9O@vuQZF)wm?4--%ZZ**d}A|Z7fi{O}6)XCr_<`vS8YyI{EX;6R_u2z7*0-8B3Wd1A{O0y2$rN4WFl zzAkicCurjEtX6OK495$PePLjvG`@eBj5v6f@w)1Kjog#L~Z!iRe6In64scGAC1j2c;h=*DQg?hqFkt?#H z(Qm*_63-br@x6yVXmGoHkde6z@fdBE6 zbu442=Xt&K9e>xoJJ;)WIqdD@9M#A)_v%N=R*@I+rJ-rciq}CYUZjnn?Kd9-{7RCh z^VHQgh~XWcs+lSXmfxB~#wlv-8Ol!|D)!gd>9xlez{GVI=JB~$WaMXkXjgmtWI?O8 z3f6-zz2gQy3f|oTH8SOV>IKu+m^-sOi;~Ab1sP-z{d)nWz?`E?LxV?Ngg&0+G4TN4 z@fg?wp07^H2bg(4mH(xfshJ@9q*vQ4CrO8D9D6>rrt(6-48S436dj_*4-W!DAx$9~rvi3PDbS*ikJ<=Koq}A$BH(5!INtIO zl5VC-G=BxaYYLVAra$S^gq}L9Kr3ZqfOiWj&R4II7l3PQ0MXY|Fvpmq z1MDgd8&O4w%%o`60xhOX8W&dtcT0?%G=;CD-iQ4qhdR=7&oVkxxNecu)R{=pZV-9p z%dD$mHL|wvYT+HrOnDnKc3Fu5dua;gES0Ivf@sbtzF|1;O94KVCi+rEs>OMuWuxP) z1z`xZggT&6o$3aBUC?!n6W48s504%0s|~-aIqnZ&93|Pm10hy@NYNq}-3|qbbonfsDlxpl zTd()lFhD;Zo&~U(kEnEpdLruJ&_$Ng-YNd|)QV@S+^sZxM^}|pXzt7IueI5|<~G($ zoUc?*%&_5sB=&X}WTq0DJg$uXSu3q0VpXWruipy>9W_wwNt9awQ#QW3XCy*)}Z`)Jvn`O{d%lvEyO71)Tc~<0FJOFnEvD# zjJa;+HTak|tc|>Cx9@E%YUp4UWSH$0kIjleb+=53y)vmkGNfx5jjU5y6iy9;j%$$> z5>nUf-WUlJmyr|F$z`u!p+0>v#b~YR@mxN$an9@vT7QQVBbYwvXJA|AWKTODOWVE% z9WXp|cAKCG+~2QcI9KYB>(gB<=StsKZE$D15?1YA90{BDNXnuW`GOp7{|iF@NiYA= zrIVD`_yZ{po6aXwqWrK~faqm`T@7EeV!abPZas)XPeaauCJ(gJYkN4o(LSl>4an2U zJt@!bR0iLTsG*MVgZ0s?GRy*+HrC}|(_g4c$ZAP@C<)`j{8pO;%V%fst)TwA+v$yX zV~S$THNI3A$}N)E-%E?#fuNvgKYUnd<&@m(d|@cSXZ168K3Rk5X?Wj zjfU(MJL?r4dJNH{58~+R^NH3vOdO10R;ybi2KykRJ~+Iz?)`F!GgE$Muc$ z^9&Y&89%lsUams$H|quHR%e^ z;xp87ilQ?k!9PN8AoUtmW_$5U0^Ex^@7Av{aRc@aMA3qxUNJO_B7p-N9COwor)3o< z{oca#45_KRZkppp%RKq{pBAJm?<=`yG_w?}B_ijt^**JYC4!12K;*_{d};Eg*JO!; zQO1G^=Gj~BO*sz=ysvwo)bxDUZyp)J{bcbpCPov=^*kq2SzX#WtXpq)i6uD|xKB6m zIXS?Pf0L$jltP)rv3;$8O^2IovsXf|IKgp0gY5g0K>I<7Y*`NvVJ$5WX=i-vjK7Tn zP062^3;P6rM&nzD`e!oynGF9|E&PuS?0@ZK|36Mz2lb2gyR^xKpQjnX?+WvzeaDlI zBBGK|XA&bp2lpJ@XW_8R$=%Ij+gXQmKe{-%o!cH`S=A1#wEea+6`2$X2OWw`icCaW x9EwXu+FAspoQbzMc;=$T(MyT3@xTOd;^g4q(3jmA2;2t>*cY_7*6;M+{sEzBTm=9C diff --git a/applications/Volkov/artifacts/mame-p1/emm/menu.png b/applications/Volkov/artifacts/mame-p1/emm/menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 diff --git a/applications/Volkov/artifacts/mame-p1/emm/transition.png b/applications/Volkov/artifacts/mame-p1/emm/transition.png deleted file mode 100644 index ef38cbf8c8c2f14a83f8c090f756dbbab3b6c929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6802 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 diff --git a/applications/Volkov/artifacts/mame-p1/exec-then-emm/emm-result.png b/applications/Volkov/artifacts/mame-p1/exec-then-emm/emm-result.png deleted file mode 100644 index ef38cbf8c8c2f14a83f8c090f756dbbab3b6c929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6802 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 diff --git a/applications/Volkov/artifacts/mame-p1/exec-then-emm/exec-result.png b/applications/Volkov/artifacts/mame-p1/exec-then-emm/exec-result.png deleted file mode 100644 index 8ae813638c2c83d238a6df151e9e548eb65f9283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6493 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 diff --git a/applications/Volkov/artifacts/mame-p1/exec-then-emm/menu.png b/applications/Volkov/artifacts/mame-p1/exec-then-emm/menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 diff --git a/applications/Volkov/artifacts/mame-p1/exec/case1-parent.png b/applications/Volkov/artifacts/mame-p1/exec/case1-parent.png deleted file mode 100644 index c157572a997ae289b674df936d86edb78d603f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6141 zcmeHLd011|wvY8XJcrU-U*W0lF&J*>U< zTEF#MyXata#L8uBmO&tpm63nj8v}tXbcR3{tY7*8*wXmbxswox%ZbRnyAJ1FpA#W& zA4?PctWG%nZQZSm2ImLPf_-B#7p{DZYF^r&*?RTs*Pnm0@;^GCZj3wD`C#vN^sLe= z$G9~3aJtV}V@E~Z_P>6!Y-8yb?_Ua*2X6F1brSJ-MDUtMe;HmHHRd~vTI20UE;Z^XBDwc(Q~ibnuvD! z&63(MlDRa(ttf#GPW$mT@^Y+{M^&l|Vb`D0j)ln^jA7(j}I-~V2$KmB&=>1Ux{+(=}&Y+^SRG^2E?{o1Be+xgR{S!net)oU{=cIK+3TK#gd~pW_tAD zsXo|d*@R1(m@$d->orjMHI3^8y0DSuBG3R}#06cuALaZ3CyAz#po;v!ts3e*d zX1fVQkEO0tx%ydLby-xbLFs{I0&_CUppb82KPkwpCm1j$GDh!xw;;`#`+n*8$ zvL)#iEp$1>lbUzW8UeslRmD`>3fBBp)fRm(wb1`wyflx~D=6QDyhyt(X6EfPU z?xldiLo2Lp>v=Magy98&aMc)Kn+=N`@0rj9QV4a?AVRTk2~XqlalQ;p4$^dG}n8# z%24cj2^qWb5j12;ixYCVeAQ!*-aSAKp&rS=XlwZO9&I>_Rpwlq{B_H1GoiJUK|6f_Wrugr#HmL!Cdz8O z$bi=??Kn|^N=)siI<2D+fi;Vvv?Jm{|E;~N6(qPlq@Uv_VJ!YAs)8{zy5HIGOe0EQTabmOQRb` z;7Tk;mCB8l_qIrxr4qAFojOG{%u-+eYGfN(nEZ*gXv^4W2YxE+ch%O2c4Jxd50{H3 zF0BpBRf$DVz{qikpdjLP6GQQuWMiKC?PF9=ZVi-}Yn{W5XZ2QiB6F4Fz&nhoM!F$? z*I&pu2*Rw=ZFFR0AH`L)dtK1EWGq%cSieW4tq#Pr(&@Os0}~jBt_fzV;#j95VCEr- z!)_d6As7C)E^|VLYP>63R1Tu=r9^kpZs`2a3+WuYnPe1=LOEyO>^A1jzy3wdpoNhL zI!Y+Ts_y03<}eu5*v)0M4UqJ~GOW$4N1{ns63GUF@3cKnCm$M8AnA$gpg~!0AIZ6Y zU$`V7AmBsyuu!`}$T)@*<7HI;w2qTQzr5GuZ!cWJ_CN;L$4P$lJtv1<>BjZ(+&Yvr zcac!%5zP!^*<5AyXQ6u}_xl~I#d1s2g(}}qDa>Y66oy8qHOFXZJB(b8tyNr79R!2y zxotj&q+hi*WK}nvHD`=kPDq!b?nePxD}!mp`GbwLZeZj}uvoBepUMD~2c*}qK+O4M zl2awHLRLITp4;q0Xy}WP`uQiSN@6gPa~|zlL5ZKcz*66=$ecNMt$Uxd8~8Mfw$s2YY~L27Op?M{8q*bQL8UoyGpmT!NsYxEk=a}OGU zl3h%6eEFQQ)RSaf)jYQxcIVOF0$GREdlNcVdYWftKdCxIUP_Hcg>9I!P`mDE=-acU z{>AZ=)gR;ymrXfmq*FbA8HA73jmD04)sJ#27~+CkA0C$)s`J8KbC#}3%PUQpL?i*m z9Xijar(;b;{$O4S?&b7%jnd5D3QkDvjS%sz83kvOmle5IM@V(7>c9SwTJ>CPOY5Kk zl^XqlyT{F)1V`snS!(VM7DGMN&#+rJ5-C?-IqLA$_-om-X{F${{`LZ=DCQko6N~H= z=$q&D)=mBnLWZn)5j`2Rh~U&^{Aj=Z)6!S?HwjY9IJN1X@xiTV!IQi6)WND+$21Qw z7e!)#a%zxOK)yKO^z%pXkzbu)*1D|a?fC~SgRghtag7&!4*oMv-b{1SFyWF>Vqw2*VW?~&6gOmObl1H;jB8LMO?Ax!lqL?)l=cU zq~1PX4pSrLAWbjtC5g(LXyk6oBZwaHPz(LINYCI)Ik(D~}e zXVAn0YcV#OccU*gArP893v*P?f#EG*#W;?y*8h1J7sO)37I<#Pvw3Mr)vzop?ECHF z;=|pizx^rsQf7U3V&0nqrTWRGwLLghBB0`=nsn2{q6u!fM^A6Di?4F5T`~Kr4UFqv zn0-hT&N7UhLIcl`?+`|02G2>+K(0Wb(b^axf1Hwm1f149s1;1*nMS|0Odb&spQk5ZZY zWDCUmD)0X9sDti0mtvixGd0gZlc+cj`#bt2>{dR_B$cu_%qJ8{6fBZ;2j{^O8kI1P z%o<$S+GNx(8ui!Z#R{uj`@T`E){&yTc4%)3mR2y?ug9FJg@O&d&^y{QR5XGNYo721 zI?J+;F zm12=oo(kJfjk??C3+GUIUoqHEsmRMk=;CIyZrD%AV{W-Rdq#;?vuM|X9{?k5uK_O@ zw>pm;Bda%-46C-pzo`54hr}3rXMiFvmKKuZCN;VFhfwihY2;`5va^F5beY#-TzukT@6Va6+h*{znh&(rVduPdL`wuljtt?qALdL z9Q0k0abP^oo{Cdjg1-Kdk=#|VX3SL4IPX_!#yF@h$ct9*aI&Kr8?6d$r%^!yRLhGd z7(rC`rx`OjU7!ootoK|pX#|z2hhU8N`)pXX=!hS@GU0Z8gHI5kK+l-REW^A{{@Q?R zqguH1mc4*_V4V9XSX*Uy%uma(gb(a|6Xx*)X633S&n*T4IY9ApK}XdVjOK$Q23X?( z$L+JQ0%W_mUxR!$&G&Y6QiV=q2&o3m9^ggx&BEGj8`H>AE)8hlS>;9Ev4sco9xhqu zxAUX8#5WCuho*+s{E2hJ7W8Ve;>s9;E33SlHW;n(*gy$`v#YH5FB}_VEb)_gfXY{8 zsJE{`ee&~{F;i2%Fe*HH#=K2!=GkuDGL*+>q{dCru8pzJ!l*SXL=;t4L$058(u?et z$_~r9;71b@y*63+Ox)mB$Z2RC`aOeqe_W82F~4!9e z^30$!5OKk1PwGW}?0BFPz&x1+T_5}<`bFS`q)2UOTiN>;>>4mu(xJoeDQ{|{QSU5W z_SO10w4))@OkbTzQ8aUoegWM1woD924T}7%ZZP=?SXM z`)dLr=G*2}vKND$UA8*JpVG@f zzTX{^B`odAa85koPcXuC_&4@g_wJ{5BEz+t#tUfHqD^s?zGSmE;8YVvE1)eMytPU3 zD+m#CZef_NzHCln5gW-;e;OcbF#M6ljO}=Otl-P`uVf`F)t> z6+e+fe&4F)!ziZtH_8eJzAalefc4D;j#k|i^zV{3)*B;M_2)yA@+ZW7hK(*`MHL5N z{MqEeg8aeF{l44VX%F>I=5cYOQ`%eo^c=kMF!^F1V$Duy<=wS`nN~2J%4?axa$L$k znd)krZYaVXN;2!_ILT%`ox(ab+N$KP!;Py2u?Q?85lm_!DrOr|^MX#^o^1Pb0e^6J zjEm~1!D;86%DZi8{Mw*w=_;D(k=%La?c-umRE+Vhyy<^b<3sLrRL=-hOjNN-poW*S zFk_bzsAB6HV76(5=*&n&n5MMu)0g&#X-gq%9wcLNaFO>A+?TbjyPzAdm72|FkO1$4 zk)+hL?%r|_#AUllD6w}CttK!9f;!p&K1Eq8p*U=+yxx#*VKa!YPh5BI1knhx^6342 zlsCE`F(d_sVo5MgJ}dy4_b=y{M8Kf`sPHe_Uqa(isJU7uID=!t-O;I$O5iL7N;L+u z08cvem>$>CYS4l}pI?5+1f`;qS15-*k6kRWlV-Yn) z*O)<*>9sV66@2rJ&yq@@BcgB=i-6Vj2D~TFS6Y1E7Z@$<`PCnMy|~%@`!c_=(AeLY zz8B-*ugia<+8_bUd%vxJC2HTn^S>7Fe~jFD{@;MhKg{=s`TpIM`-czxOFs0EJJ@$u z*8h*EZ_Kf9e>ncip}mK|J9mg%PWX|WSWIdT?)bSBNYt*V@bz1L{B{Jc|Kh~fq;1>% z0+TkUZ)|!7_Vjw+6Q7-vat3lRB`4)v_WFaTvDsehBXf^uu8%r?YJKe4b0;%F0r=s! Xb?esA;(qwMB_hM4_qOi->YM)p5PNKx diff --git a/applications/Volkov/artifacts/mame-p1/exec/case2-child.png b/applications/Volkov/artifacts/mame-p1/exec/case2-child.png deleted file mode 100644 index 0890c65bfd5b5542cd9734f51015d79f008ea31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5065 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 diff --git a/applications/Volkov/artifacts/mame-p1/exec/case2-parent.png b/applications/Volkov/artifacts/mame-p1/exec/case2-parent.png deleted file mode 100644 index 7c0ce18745f22dde7289606c72ddbd16f7d572c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6127 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 P?80|N?&R$F`oez$<-cyZ diff --git a/applications/Volkov/artifacts/mame-p1/exec/menu.png b/applications/Volkov/artifacts/mame-p1/exec/menu.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 TcDriU0bI_wpC+C1{qXWO(UXWWRqr> z76{q`DodbQ;@Cn^nnc+mAc+tmBoJc=2_a;e(r3SSX3lx%%{%YEcc%WSI#s{>``x;A z>w7=9D%a2V_*T^&svr<(tCy#TKM16x3j%G}xp^aSrv6+)6bSU)b1#o00jU+-X?Vlg zz#f%P!74h;F$1XfCXLce6#$wER}MyRR;g&5cA0evTudM8}l<=DcnCwZPrEH z=(}K?l;09Tg^J!@SmWpb6YC%DC-|`_mC?o|g^Xv9C&o@scA=0hpQadc(OF&^?WR@l zTl3J)gt@BpkLa0fz2z}86B85bt3TEI85kJcF9wDY%gIASL-YJjR#mhyyc$|r7x2a9 zix}0mwze@BIVX^G*_c}4Xmfh)K3EpHUUyT^$_`J3DKK~ak9v4`Tq_U?g>cNQ*8MqN z#%kA4K-7wCgwG@&H)}rAIs8Z}Wx*KcFxkq;(DDMj9x(W)O}S9vwGZ&hM3D~%Pd6WNT3j+TP0Da1SO%PI7U(*@4I%3|(#7$6$2CViZcr6x z2L>7~TU|1CvoYS7JNoVTC89+J9-N$f`Cb;!2Eo; zRP1wb`SQi`BAM@W2B$IhmjaQfMyPhCN|3sKdbG(M`}9u6W*sek(_ZZQve2~&&0#Nr z@163;6l4TiKe3k8i7i?ZFI}wYwXa&Kaf1_#DKEnFncR07Psq-!(xB)e1Ame6WDLjB zBoIf*@HR}j#w=^B%Do>lv{zXfegnQ*CtUNrQ8{VqEbO?tEB|@RSTT2ODljb!o4(E; z+IMPxd-KK3Ivf2CLZC(?_bA0vaAzVOS?JwxE3-)Da9^$X9e?YHc+6+**ux&{@7JRn zb4w2hTETX&4x&6x60n@WY15Dp&X3nJw(e0o`*`8oZB( zN(Of0-=*_Z{>J_y$W9Q65gW~7b3ch+4sXF$dt|a8LF>?C1 zHWZH@J`<{t1PW3`OB3__752ywb8fI?b!j3|E?wgj8OgM>w5GFDJ?X2|3{i_tV3pNG z`exAnLyu$NHBBKslP<9_F}JF2*ZYxg8wH1k!V*4swqO8d0`w#N`60Oop0QkrlMAYG zpR&MGE)r)j)U)4HWW4dJ>Q?jnkkL#f70WXnugxnQ6T@3G4rQk;)a1}pnRzP4srQ0< zli2=(RPm=7KC#+0J!K__1&6MEuqUkzjg42Cef8sAH(DU1g)-i~>*n>Yml4Q#Fu0MF zA(KSTj6Oiz&vwtzxN_x+k!xC#lskoJ>H-G6>r6D;@09o@ww^cOU%c^}$(16Qzvg$4 zCteAf^Wd&FT<_{(buERVbh$tG7O7UN;AxO(P-SVeKgKCG-7NZENY`TU)Qc+)=`wel z?=kCVvTrxZ`sebrf~prU>tf$z?$ZB3wAU0>_q*4pSo0Mkz+LE?lQ^#HbX1EF#u1(tIpp(4;LD=r zQ}3VF^TKuwf$pq-WZZxRD84}|*93bnP)0kkk&dnVexYT!XC3FToijrDBL%7SdShf- zK9lUw_Wl8O*f@eC!jiolo5b(A2t6k%*6J^ZasHU!c;Dm)4~}xR$U)`Ik8jaxCm~Va zlZ%%xv-+8mDPPOfryKT3&UsO^B6 zT#Zt`dmM~i$v`e|6Xe91K+yBCp3SyKTy4?J6*FGp6n zpqKme3>Fs`nTtRfDp(egq;pn7Q^4y620N$3IBwFgtU;=oTuVWLPrE8Tf>|%eAbx9n zrsv}AdUS4_v}7}aj)eHM$v98RxwkZR41PGKz;~bRO6iesevMYh6{^(^@xKJ6iY6k; z$yq9zc6hj}FhJ0OQ^@o3@^VRLxVhrMGV*j6iX>egG;4MZbb?y$F2RIliAQt>LJq$X z5_pzRFZGv)v4vL5J-6UNvt+0+0-ee973S2Z^_X-dQY@MLDGk& zi(&++k`?wme|c^&U9{wglS{=@3i&F@zNG;sozV=H440fbgYHejooKgt@;9;F)YgN) zTUZ?Oym%?iHUDhRe$6~aXKx}Ny$A=}`BO)Q`9^y~Ry`|&GX;(f5_k8$MP70@glzl0 z|0_q$#xo)Z1UW~dZa#%*_%*QE4*!`M2*8^Rz{xm`hBtH^HfQu=(-RW~lWoyVB#zrg zOX1OF@3S=J^Y)~msA)$nY2?R4@iv}lZ%jjD}%fPJN#lzBXLvJ;a>(J%`MIN{-U2T+;y#VKlaXy2W1I0_8h8P*uWM8S5Hv ziB&1H!rIZ&r`s#q$d)gss!B0?#Sy^}^n!+s? zR=ccyC^UQIg!~OQ=MI!)XOH!$GpzoazeW6N8c*Ptgg4kAW!x(OZG=^_2l zRXO+~y&af#Cj`YEQ!#)xtCPPL*IWTG;dE)p$%`m1KRs`RB4yT|F>lDyu3mEerfz#>*ys5l4FpQuX2q8}4Z+-Bb+4DIPVQO_Rl%pdyr>`ENC^_mhpRKg^N$n=H5X zSg+XY<`b2kX;?r0*-Z#1dDE+ueaw+<@`{vpn99MM8_yjtoE_m6N*2C2b2=O^?) zMF0(uyp0vQ`?0EHo$(kH=y8@OpN$=J7gSNAMkXs27Ibxl3F0rH6cY&ai_Y)KHs$MG z)>0O(x9M}hMLMHk#b4R#N3Zo>J;Q~Vj6zduD*>Q6#o^E z+1Mm6j1R;2VGpqyVOUhYg$-TXyBVi%dLHv?J4}?yvq-5JNc(K?5&klz-wHFE6XlV9 zT+8a{scX=2XYZ|Cr-N~_=D6D%N&8<4kBpSco zkmlh9VY##>OfXLxfjPVTOvP^u^Lyt;kL-)J;7%P2+nby7tv;!xsy8{jnUqMXIgi+X zvbl!GzeczIAVJUztmPH9tth<*d*;-e&s7YF{mdXx0sUzBcqgNGHymRL$EG{;)BHIn zgF=qTqFs^6HlbwE!D}3^2e3n<2NtW-I-NBi(lXL@T2dn5z7`I17b)mv!tKJ;GkzN& z(CKObK*VjEriY#EKc)||F_S2QjbT7HrCUfOmZnAKCf8e$7m+*@C?$@A-9#0hGV*JgTI%0YUP|hBFkTP%c7o& zc!j=>*K$PGje>W;T74E$-OWaB<}Nk4W;Dl7mf|XkZf;8cf=c(k!xA=P2_A=iYQ>Kl z0=M%_J{|(N{RWjYSx4jTOF-Fy%!{?F>4C1Fvy8wkt|2|S-faX*`4$3|S)$W-9D33{ zCP|!}kQ=@*SG{WF^Chp!CX&J}T;|FmLP37LnR5VlypNnw0*ep75`At)V8RD*toU~@ zJw(6^k{q zjfZ1B&sH0HRY!9wTIuD~py906D1d*wbGrto=Rl9+lm;7viM^{mJXLNJV@@aX{ih*679(rB^Tr?N5{zN7gwHk){ z_>K$}Jplv{Q2e1i4}u)igs+OtR^KI3)vUS?q@^+Y^XB>Tbslau*Ayx!r5+j#6+hRL zi^(v%kw==?1^3e1=f=F&HoZH&Xi)!}_r6{p7W>eV(fcVr+@LX$IdP&)ao9~y?dl`t zyW#DlCv!v4bH%`FfZOHeQY$ym7$#?F^U$X5t3+d)mJ z`27@J)E@4XERzUbRPOBhLiE9Bal@_c<2@Pjpi${`=co92a9sPgN!|&tX@b#)fy?Lg zu`?@qNDQ+XCyQ>0V-MHO^FPh}em~GEr2DN4R3R1ICk#E8NYYw9(Shf(3N*NrBvMHl z*_r+XU}IWHx`n$Coj}$;FXddT*QlJL#vwJZw%ZxV$aS&H{hoJgcReeyi}>!n@f8DI z!_*X3rq!$|_^RVpbAW+q z36;+30m%S|txr(xqN`G8bHjB%-{_kWr|n(Y1bC2yUhXa^&#i3N+g^g8mxn}1&(713&Dvju|RXvGdC}OC)3h7KGPZb8{nv&ZK=ecrM}aeyI|hiB47E@J@{C?1E1)j z%ywz&W!WV>7N~zQD(!B(R&T{LctJ!WM|3AT1a(DTUXc|mTZTsc5u&MRyp3UC+FbMn zL_;s~n{zK~KgA?px-ywm+anW)_tfvJ*|tw)px;e%sCkvHGePhBBf0(&{>*J{tfv0e z;_vsW7<|Y7*7kRrt4R^lO3Xo30*G|VD^N$qGe@S--`R)2o)n+xGIu_X8 z(<`Xs`bHwZo#;rEPBbakPe` zMdMv^DeMAh$?oOK%=&CflOYb$ z8ZL(fSXBy-b8?r67qIfL(`O=M$DcFYe7Ywyc2v9Vr8Es6-G}Z8&-|}Bg18K~zKB2s z4OQmkUKZiFs`(wrxmdd@*D9*LWQs9+GG@e4{|2(cn&P34$X4Fsn=92rgVcX4s#>x* z6t`vuI(PhE3`yUA^nbPDe~jmI!FaI3b{ERqg7!+ohF1FM3JKI#Fxz4at!s$T{j0=s zN$*}9fZYT?Ej6b7!0W(MHOLl8#^6}=9sPM+4bePBx+2iEN}vc}$(@PoA&fB#QR);6 zJs|_#$8=){+qU8>B?1i5CjqG(!vU$sN0g$NroRcmJngC$iwG-4A7L7EbMvZV+CDRI{ssqXJLo}=i7${OcKM>c=hm88KZ`i2?$Z_xC z6C|VhX3Z;wsnNGiLT0->yQf7)xG+5gz>hnaJZ>A~0ke5I)%4gx_pwBg*K8y^!r&a# zKh>=;YoNA9Q1{y9!u;Ct52u_I+7=1qN~e+&(usxS6T6f5RVj*O?bHZN!4nBHujpWM zmY7c&cdYk&X6^Mk-x5pD->_@oZ)gBY1pqSta&rDRPvT$8?0*~oFQwq$0sD8r?z#OB z_2U0WlKlCh`v1IFw^gV$?%r8>z3Ug?_Xfx~>F5th2xNE?>U_c_kk1jHqdN~+T07Y9 z{7cw@3x{m2?JqzgO$e`mk>+1Uq7#!YT><%BO1hMgxYI8tInjKlSIYU=oj&KIcOv2v eqGEvyz=8FF0|#g~hr9thkk?UPk0!TsKmHxP5%mrL diff --git a/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0000.png b/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0000.png deleted file mode 100644 index 94ef3395ba8089b6fe1491af63bb88bb3a4d8932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7068 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

    eb%B4szU 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 diff --git a/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0002.png b/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0002.png deleted file mode 100644 index 6c3d05ccc7adba0f3e8dd07141253c742364c30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9588 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±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 diff --git a/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0003.png b/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0003.png deleted file mode 100644 index b6595ced1f32ea60c9f439308d63025d621bbc97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10121 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 R0p9~@sOnrUP`Ul!{{Z2~A?5%8 diff --git a/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0004.png b/applications/Volkov/artifacts/mame-p1/keyboard-commander/sprinter/0004.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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

    eb%B4szU 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 diff --git a/applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0002.png b/applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0002.png deleted file mode 100644 index a56ed413118fc5f0def19895e95a2ca64b8285c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9591 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 diff --git a/applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0004.png b/applications/Volkov/artifacts/mame-p1/keyboard/sprinter/0004.png deleted file mode 100644 index ef16fc7bb762364b9b8fbbe83bea5be370ab7cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6662 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 diff --git a/applications/Volkov/artifacts/mame-p1/winrest/full-current.png b/applications/Volkov/artifacts/mame-p1/winrest/full-current.png deleted file mode 100644 index e052adc5522b23357943a29f39209d2295e516d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6120 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 lo$rOs&KJW1L%}~luy464e@9tuYw&rP8t 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 TcDriU0bI_wpC+C1{q64e@9tuYw&rP8t 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 diff --git a/applications/Volkov/artifacts/mame-p1/winrest/partial-stable.png b/applications/Volkov/artifacts/mame-p1/winrest/partial-stable.png deleted file mode 100644 index c1df3d1e4732cd03883be599c5d798c34e12e6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6663 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 diff --git a/applications/Volkov/artifacts/mame-p1/winrest/partial.png b/applications/Volkov/artifacts/mame-p1/winrest/partial.png deleted file mode 100644 index c1df3d1e4732cd03883be599c5d798c34e12e6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6663 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 diff --git a/applications/Volkov/artifacts/mame-p1/winrest/result-contrast.png b/applications/Volkov/artifacts/mame-p1/winrest/result-contrast.png deleted file mode 100644 index c07a8d04c2c2e5727548dc32b5fefb13b24800ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7043 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 P12{Xvj#nJ@`{lm?>dhXp diff --git a/applications/Volkov/artifacts/mame-p1/winrest/result-current.png b/applications/Volkov/artifacts/mame-p1/winrest/result-current.png deleted file mode 100644 index c07a8d04c2c2e5727548dc32b5fefb13b24800ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7043 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 P12{Xvj#nJ@`{lm?>dhXp diff --git a/applications/Volkov/artifacts/mame-p1/winrest/result.png b/applications/Volkov/artifacts/mame-p1/winrest/result.png deleted file mode 100644 index c07a8d04c2c2e5727548dc32b5fefb13b24800ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7043 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 P12{Xvj#nJ@`{lm?>dhXp diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0000.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0000.png deleted file mode 100644 index e99a71a3d0872a80e4e2b43c6bc1a2bf0244eb2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8935 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0001.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0001.png deleted file mode 100644 index f3d4d238ac5eef8c817a0663b4106b35927f9991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 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 Z59iOGJxh)0G~kZ|=wC6?DbaSi_aE#Zb6NlZ diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0002.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0002.png deleted file mode 100644 index 1b49f0ba947ddc3bad8e0803b7142e650d016c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8840 zcmeHtXH-*Z7cPp3$|wp5g9t(CNK@%8BfTgfy+~7$CZU8PH7X(^CDLRlfe-05BE3ct zX+n??5~-1H5<(|H8aL|PZ|28c_pZCvUF-gtKUrs;^X`4#-JbpI^CrQ<%<%N73#V9E zSWX)o=~=R{u=29791%WolzFGrEy$aNcT+nW}uk7pD8^+@%vR<;~ z$qj`kE}f$mUq(}cN{+F)UjF*(G3VYTo2ZRZE-6M5=gB>nfdbR9@10(`leSMWJ;$ui zCX_cE14M1;_ZR}A8WG;mPMAg{T+4T4NUa{DT_6uQ113+@dy*Q-Ls28sxw(}(CoVlZ z`|HPRO?~6FP}IhaijmH}+4lZdKkru)ckp8f$~e6CPV3gpdW;^pV}No2L}hsw0A2e$eb}7v6Irn`9PRvco3$gvC&2)W;4;X zy1C%dd_qJd`HI!wuKMTIeS<@r*q^RqNXYQ~aHU1lTZ@0J;75n@!VxZ{|Ew1Xl}$)I zEQm&5C>yT@80I`h^CxXB7xem7&y$?>1d7`A%ucj|eHV9BN1?Mqo)?0!YAZ+gmrUUZ zMv2Pn^_|py;l07yh&3A}(i_xNeY4F13P%{bW`8^Pd_hDs z8WowbkFDdaiN*bm78Lf|tSc#T(#HPq1UZCE8~;*DLNxciQoq-;oS#4fo9y=}`1ki0 zwc}6_w0BJ?OeqGOR2S2s!fnY@>{BzGlg3tDP3uy_7S&m72ySnYNGj-Q^dZF{?k}a6QNuzJDX~+7}(;6=yS+JVAw{ z-V$iqtqPMpFQ5Lgir~X@A9OM$DjHaxr^bk`#C3547(A!kg2X8^B>b-@ZaGhIy<9-5 zYd0}RWchw!@$T8CW+6_+_TAsh23-q0-XFB*xfKqkTRXlrrQm}x>&Nso0?sRcrseAx z6EEEnuvy@pC5$;fNzgxEJC12mG&>T&kdw79-xAH_O}gw10Lxb-FcOO1H{A3pEG`qa zS&kTkH(chsw6cCJHcr~y()+{ZL25FC>moz=53o$V5%AmZRnbAqeudo!;ukc4nZ3{$ z(Ky9$q~Wt|yYvDNbx3NYaS2;d5<^y*SbKcz-QzNglg&KJw#idAJ7YVlgU%*Tx5Ki3 z*%mE{r@rzClCOaAISh*l$hZ;03g1wl`)4jlV*UQ!XA`G=dEB{9FM|R{!>OW?PN~(SsB$kJjISrgaY zDBv>lCfOZ=U%izlaeO2@{1x)!Mu)8N1+BYG6V<7n&g_a+wT)T5I{H*y&-_RpG&Q$-93*ggQHBStIu`bPw;7Bj>2m6ygKPW6#OUZ5a=r1;0J#;Rw4y<&! z;+FwG`$c5RMef1_|5MsB)-@{ykgk}{5F&;_rxKG7X)C~8B83t`k07s3PObAPfYsHNnq zKo1_?l5RT@-(a3XM{r~+nfW$UTX0+buBt7%rFK`4+wkHNP4G(Pxxjmc%)ViX06ly- zG>eo$69@z*;BGGT5lK_c{{A2k=6OXcwG2qd|L``Du?aogghGZouv|vceg!1}txZRe zu_GmCyg=Lk7EF3ucj3|V6+h!N{23~QPue%{`(uhl5lLqG_V=OU#aeM_$IBU4aZc~& zoE#zh8*?0da%cfxU*CFic3i}_C+sfKyW`ZgcKB>pFy4|LvHG=cd5uUU*1Kv#R_pq@ zwqffs%H#^s%+N0fue)G&?ed|6rU4CN(bbj%je4!&PHBn}J?M2E57Lxc3gflrASM2o z)+rz95vI2>vgl+16_@a(OlC)lTx%_hiQHNoaG*B&Vjl>2BJ;BSE^0*tM@CY661azF z!ep?pu-Wjn=~gy2tvY6MxxTXrP~$+Hm88bUzgY9yewcm5Qiy43c+mHA3rtJH@=WXt zYG#TGO@wM+)_B^6@LJZP4w}<_>iHCjyr-5-rDa+Ej74y;edCj{4o@@5HC$^RH(`XT z4mRiQ*v%>k`QqLT8XN|HaLXIB9Kyv7CQIzKU`}~Hsot*b3;F6eS@X%tz0f4Xda{t% zIHseY)p9?~vB+EQ!zd%cGyt>zB^Q|pPvs~W&aJD!#SvD4i?qScd_Ah}6*~&C=E2qA z6o2=wP@PI5Iu41R>KT>X#QdJxq# znKx~Hg{D->%6>+3=ZkI_E;_6#nyk{N)Q+WmV+X3ne;G3QJHSL;u4EIR(`l>gq-*om+gaQFSph z?P2R2@*QtCzLup~ObRu>vR%Q1`sOu50l{C-&pf7PE5?8{735%_l+vQS1xUE|I7nnq<D@oRUd^+4u~&noCL|BGq2bYu*u2E6I0o7j!X*d;Gh;md(;`tgjgmdRN29m z!ypGsS$k_Uk%#oX!?iGklh?GBiKHLYX|ncqyTMm)Z_@bc#H1;|fua!pJB+!NS11k5 z?Nm1H|7Z!4bgqj#Kh>Cw#65CMo{O#<;}kp24=O|zN>k-I@uH@mPS=<1eCe!*xrnxs zP*D;+@p0i^uJQV7TH0}ZlC-8C^pTs8-k7iSN8gId4?jlREep_0~#GeXO*W)wDC~NF7~$*_fnCFxW(K=!?t5#4W2VW-J}h_ z6}g0XZhUm+n(RdrNVQLEvNdQ9g;8!s#HpF3gmA=diDfA7A?tjNJ{h8>9z?dxq;wKr z=Y6kEV(-@=Y%k_{H4?O9ur?i##<94`4f{4@ule<>E0@>Fj(({QOy+ZWG>6n!uU6?IH^Ogm z9rC1^aIh@@6<&1+gVqXO(cVljACf^Yea`Ytw^l)F&rD9X5o_D?qsbE!Q$#Er3*VcK zTrYxZQ(8x&YiAi-SqLUWJZx=p037riisyWo|Jy)T4jZR8Oh^xWPzb_xb+)#KGl%<$ zGIJn3_$Qm3n8Gp0&AY@tCWn(Kh}x2e9GG@SGl34VAh=#mLNj?#Y4-bLfA8{1T%{|5 zPVzsbuS4J}a?Wkm2qBHohh+SxL_Q+cGe7(RxoOtk!J$HB_K>mngB4cKM#=5ghIRTf zCw+MYZR^;mxd?N_ayui#^Vqf8soX!B=(J1Jz#Sk9Xp0iNy`x2j&CSi82x%8$f<%5f zPDm~2KAFt?gt0d{ISGf*iLSJHz5*sGCcZWVL^p)q#@0ILb~>M7&N;ubm06^POe*q! zOhhKI-DoULL8ttjQ2s89zqa<)V#)X)(f*69{fzxjuJ%{l*#75;^S@W{ugHIM=wFZh znu-5Sn7{ha|El2rt(Sl6wUq`$uMaQn*Fv53T8`PZ`J3V(Nk$vU?Na|Ed0b&5!I*H4kTfKZ1W&M*}xvN!2Si= zusQ@h!iL0&u`}7itQ<)p0f(yGmvXLr2k#h_@$LmIaa|+{C!g)iJeBO_k|sCIYPdv; zwhCYIf8^3JKC7j@vL1Ab!{*Q4YuF0#qwp@GkzH?aySAw%U`fp0foDno4!^+H`0Zvj zEBZlhf1&uuXebirakLeyYU=I{Z?%+0;mGO;Ht9a7_#JSx`9*7rq_5>S4kQjU4bEy~ z$b6&49q;cHchzMcZ<(G5s?B|>7|qqLxR+xXss5a;$BJ#xBt_9W_%h5tbHKPSU8wRp z3tD$n@r+ande#AlF>LL#NdaO5K`9v{7#G$)e*N@|4Zmeq-YY*9Zs!?N|5|51RET8h zmY@wzHmnGc#24j$$OeE++jkNTb4ta9(B?3Gw5VFAQ8&mz-%iL*jd7>1b>d0^s^3O8 zCvdq^;rHT<3UvdUOY4Mc5XRC=Hu2n)2CJ_UQX}7|`JH8P_HEw{Jy$WenP9^rGFtZ3H9d z$n9EGI7ZZgP|yyd3aZp42E{G*R`B2Q88{te6w{lw+~S~gdd#Uq27TKyuH#BogF}^j zEos=mYSZiKXq0HDUsL=P-hz7opJ%u7Sklyz!5uPiL4qb(1%XOEBjwysT=05MP=WV+ z!=t6jl<&B+xGQ7^_~3YI1?HxndK9Omb%!M8c@xBb9RA4`m3AE#eL!V}27Z>VsD31# zq!}^I*26tKayLZ-yLnEhTp>B)x}jBhecK#)@!I*D)?)@O`$bdm6FMgx#*TtEy}Ah1 zwGA_qT2~*wfwai(W*r@?Hk0~&SUBO4B55?-7(6hntM0ZG$Q_uXgnN5c6LgvL#3k!u z=|yJ>L0MpTYVL7DNxG0BAbjTqMOCS&q;K^8AHdRUNWGXhB6?%9^7+-8o`QUro|)Lh zbyU^2soZOB4mjqmF)daXOi6}k>on-AnR#mFEG+kmEZqS2?A%7Rdu;*lyWkgmQsU0) zcu024UiM_>rmxfFl}U&CnG4Ecw1)2d)`dl6)p(j}L{;5xYD|j5=8i8K3Lh}1oOPGx zY8QU?%GIX7UEOplO2D>r95@X+eI6v)m(_c_*6dauY(a7%Y%6jk>`1C-O#$=c%UUb362}v?q5%qYiX4__ z1akkGOL!tRJPe7*VJ(AB`)X|S_>oteu{1O3;oA}BQD!@dkXZ+k3WtYg4QNg-@s6FA z!CTv>)4$*R1e`yZYNcw5Pl;sL?1Q1#K!@kHf&OpeeH-uBJem6dRXQ3}ea^f!;A@ZN zly_=q_Sn<4n>u$b-Kq8xmLM9QCQ&LQ=-bcZSTaO_55zujVU5LdrhR{n1QUz&1gT;O zoZMVf2JO;~6xFQq45`dgUQ$tB5LEra5(2D_;^~HRC5tQr1HWAA%ZxB!{SJ$ws~g{x z)`(G2UoXofIcbO`tIaFMeRD~8)H$fxu&i%Bwe;*TL{Wb{|E zjITUKG7qanPFF!SuN3sBKbM&g(732}H3q?QymkSGv>A_?%H|&?Z;VyAGR9<49b96c zU#j`$*`A~f`%Vw-eMY>K8-=2_NqqG|d3wLOpX+-Gezg4Y8@H9kvP8smwG`(7#6Iym z4_7L5+!X-1?skjTI@L-n4(UM_c0Z1Ur&srnZ3_2Yc=uvgL=Tv3fbu^{@Ej%7Z`)4V zUB~J7A_VU!p~B5Zd^5O$g{tb0!NR{+Bj>jP$Ayzc#KJQcM?@G;7C7_tZAYpdpBW|y zsrcsTZozSO{NX!i2fs$h2zkrp(02NrE^|8QDwR~nqjD_KVck^U(Gc zLitCeG>1EOwuf`P5wv)EpHG(Mq#E)SZOUrra^7-01`u4$A{ttq~+=Dz= zZr!-0FRUPUO;tr$@~*-?MWt&h_oTcomklyk%KTgz4i5J4W3liE_6PzCTRaQ_%Lp5X ox`Tvox%&!R1q6A6m=Bm2*Ax^Ku!+N_OgR=~eKWmU9k-|d1OE%OQUCw| diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0003.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0003.png deleted file mode 100644 index 6ef9f1a225931dc2656cfc5a0d90081253c3412c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8932 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0004.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0004.png deleted file mode 100644 index 2d9d34e42731441eaa81f83a3b051e8c66503e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8913 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 B=HUPU diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0005.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0005.png deleted file mode 100644 index ab02a2e742d9e23c258510208684141f024f1fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8808 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 W+_|y%K6Cy!0MyvRsLJ4a)c*q?`m+WA diff --git a/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0006.png b/applications/Volkov/artifacts/mame-p10/rename-final/sprinter/0006.png deleted file mode 100644 index 4526c9989ce5a540f1931382830892f7c7782250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9202 zcmeHNX*8SL*Qb-V?yZj8s;NcIl-4{IRT4GNQql=E*DQ$KTUBjMEkVsyVkn`;n6*_j z2uesvNZXhqL=B;mNZx4g|K9uMUGG}&m-oYapSAL=Cwb1sNs36&o(Dz5HBU++qj!aDFMd5#+_iCGH5gVqh1MyPO9u6LzHaTGpJspZY4@ zW!S~)jF;Il!*iPe<1*ST@R0u7%!6tYpSz%@r$nRcuRPHw8NF+FT$>-cl%3F6?k9QI z{MzOH&mIBIzP;rEUy0s$ivz=Mr|9a2dsM6X3=L@3jq4RCi5>~woT&3$ZrB`%9?Hds zs2ChP`{1bIkK5fZk>3?`zkiOkDTrEW56?RL;|&B?Zd)3&-4Awa4w}^_ZYN{sH^`&? zzZ}|qEB$-2u=Zx0QuNIh==X157HR!pRuHYFqa$W*2JKB+9IH5U<_ymfp|VC%=*CA3 z24f-uxziSLY1dhJ74%N1-cfWZ+rMq~&!?HIY|jHfY_;R)B)u!O(D!EHpGMtn z7*v)gKOJ#frE3~2>e*pg2c=v4<+`*&g}e^ic;4&FVPB#WWTz*LYn7YLzCL)Wjk`MD z3y9g+)F3@=9n=&MQ)I9AoMEpQ%xcF-s7SZfR^&(7kGaA-bfMZ=ts6Kx_7{f{57l0P zh@BvhPU>vh$*qe~d9Vtnni;VXkbBvxO=+$Va)#d2Dh|eic-@7(+pwXGx7oIP9~uW< z>^TB#-6+3QGV7GU9fyPYY(F$VvC5-T!;ZG>J|&4yV|X~10Z1}%_e?_l3(1OZ!)2Gx zA_a!D?5IT-U!po>+Bw;sobuEdd87nCT0RMQ=2N)D_cC%&nAbja+U%-Co;`wTdw71GG{9GpSRGMvM*^5@Gn41JPh8A7Ya7*&vf-MTry!2o z1d7&+>ngxQrf2uPnc&|0Lc4Ig6Q2D^#GD4vLTrg1mA8YW0(n3GMwV)p4#|sPms)WZ zT^u3$r||K=(g7g$<2IOTCCtsv`?!Y7@*fNVl)?$OD4h#LWS2%7ljeLNx3l8V&z7AF zmZf#9^I{W!RJ;c9Z=D3X@L?L1vs&XgEAQ~4wk+GHp-~~pmMgbYj`wGeQd3+n!R*xt zSo3gV|08~2bTlXhL|9?oh+hnRcSR zO=f_5tSS|!vNehHMqWv%=-M@^WCQJ-PxGBvp6fdbc0t5B5J{sa6!f>A%X|2}y(E;f z(WT?)&6(hUC$j~{Yyrr6fK*cG7`@ngq;WdCzypcD^_l5v{!?kLrdXK3VKK#N1#B0e zK6BWJZwk6K)v(DU8a=G{p;vFS#vnFGvAiB)N(2UXc89Ul9KH!SM7`rd)K~+IX2$Y9Zw|^nvN~XAsID%R{qHh?nz)uxSU0q+@|JlofKPu4-?Fy(7N=R$=N+ zq3V$E;l;(4FQe*FC@TTQ>t$|ROB3sB{Ys8!C=`m6Wqzevehi(wNc;AsYm9QjQpdVo zL?_~&j}PU|AA1{)b!@e-KuKqa-zRY$jWZv5)9fbO#+-eg$y@t9n86c3j91RmUddf^ zey3DUA7ir>?Z!3IEad#2Rv#Tci?>!3^ba_!EN_PpaEmC6Y!9W3vvwF2Nia5pI7XS9 z^Pok}4P-6SMi6F<&1LOyDuGE2Cj|D6RXA=@rx*!f<}LKI6shw1$r1STOI1j827nYf zNi@`CzN1B8FrmI@`)mK`j%WMdV!lREknanOP9I zUS1xlH)Uu=ukL#IG-RHWiZf4cd`Jc2p=b-i%(^*&J-69&XH&K5Iw1Zh@OTyklqYoc z{WizM+Jje|3L2);3V|a2sV+m6i}J;{$lF_K-Y9`fEBuFN&14n+6CAri2oIY_E>f4C zo2E?tc8BGM^bC@AXA&Z^xd%Ei!lLx21FySg7>BO5?L*a{snI#N`0b?gX({!50*Ma! z_L+xat6T1BS&OQVO7OfNCu?o!rA;vO&MU=ZuFm=)5skXU5y5mU_^?=b^uhq%toq~g z%8v_yEeEf*aO8!z5~Vw17xX^?@Tz<7G}p-V`Xx<7JW78#wlU)m>e;#g)<0{`1eNXe zND?j=J%liy#>=B}$q%uLQ0(NV<+)cW0f{^ZOorOxWt$RAb|ubF2f_WwUJu-fGoaf# zBd%b`xrQdtjk`7Js;^(o&1UQ zWr@qXKK#R+4xM=NR<{QmmEzHq-ZRVJgQVjk-Po$t5T! zdidR;Cp`QH{!_h4!^S!zl1&KRt*W8`OBMEcbcCZrelj*$TiL1I1$GzHnSYHjDy;7j zS88?F>o_ncYW^P!ZPt3yyA~E7apQ7o!uy-79NybA5yfWr%%a8>OloB?N*jG?vOCE> zfo9NT%D1<%Jn$Lml#LCRO;P;J?Lw`^FY%%=3x)C24hGeQu|X62Tz?~h9jcUZ0?KSs)Dr|=Wu9$++M+>T|tCh}Q zj!y;V#IGq>ZI9oImismJREnOR57z~;zM_MUS>dM!;Im9kNUgP2xq@fKD%slMsZQRa zt$RBaiSTljEgA|rPGW|ZklEq^L;1Q&oy@fv47>UpI!&q~sk9)bB~mx~`#l={{RvCE zY92lj!sO(u9oKC$rFOe^>Qw7iw*dHheUHgw0_$M;SzLtMh@tehQ#7ar!j@u9=-l1t?0htLY;A8HNO=QCForv*LN zPWm5tc|FtN@a?2xzxHt;J5Z`(ApGPzr!qOmD!XbB2sDba|p7WWKoB z7MT#HJ8A8-Ks1z*3aGn;gp5)~Mh(e@f{f}Tk*SEUYIQi5ru+%F_H|rV3IF17q0#(M zLA4s^Dp|JWrM=n9*S0z7vo#eCZh)?S?OvoUd@NdTwS;}ZqXLL4oa8fmK<{PoNSMAE z!Yn5Ss6KR=T$$gl+LK1W{l+K1XO^WN>AU_`qm7|RA41b?#V7nxR%zH3|0#Lwm5xEv zRff#hHLohqoqh1!v`fif>vIRfH;!Lh^)K`%G_5XHRQm@65QB$w$MCxp9$)R+sy3wo zrEi3gK0FiG*4FM#5e=ZS>I!z2R(nOkx3DCjtY5Fa57Tt*(pBQ9_v0W2=)i-**G^9Q z$08qj_B6qG-6tfQ{WLR^s7Outj??;%BY)JF4O=l(XS``%2HtRJUj`xj;t zW#uzW$-ap^4~<_X*i;`Q`TC~}K4KfY)ds5=+dy;3V+sD6)uH%eu)4$19jvWQp6cKN zAUT-z@*9UNa#24MrJ)PgJ)XZt;O8RzEoVPh_^y7OeD#0Yg+oo_^_gGD zJ@I-QXU*7K93EG&J>aQF|Clo9qPLB<)LZ)?&UO~x{oJoTeUJxSFZ9Oab3%vDlvMFtycyBlnR0wNUxociJCWI2m5)e=hK(f@AH zpxj{f6aKXBeSWhsY9a~^2@Ve4d`h0fhjGK1>fIe4P9G8%2fdNq>a)3OeJC{&UHw4i?Fdw zqu?rVoLz#gnqCnGVP4PC4@NcvbMT&JH&K}qJtHoTxv~AjrFZ>L^7pt`@*g>fe5t{T z0|e94(;bnt#f?$Vd`L;8Zt&c|#&ST+dd?z^B+CA7YpF|{*Jn3RcCc9t;%aiZUD)De zgAeK2jeUPj`}i9}`)VS69L3s1b=sd1P;#quOA*o4+Szy)$2&%;8`9H;g8V9xNc%Ip zsKfpiuYYYiT9H;2-tNQ6A=PbbeFs0Li2rley9$g^I2#;;936VcdY*}!goTBbz+~OX zXsLqAX%W5X2>Rv}XLq8fr>8oGR)1m%*0snUS%PD_?;=dN# zMWBBj=D!KJf8*ufc=;D#|Durp&(U(ODiIAkaCG{eywt_SJZ&NOkG4)$B5BEemwsRVBv)(MSXei7P20k|4E0#-IrSK-!rzDlaf0toI0mJWV73s zK6mNHv{tK|6#tWTR2MyWDa_IA(cwR7Y_MZbRlwG{wO-2&)e9@!G-F56pwoqTt^_}4h8voG( zYe}BN+v^!4nDx|iu3A#%W{uM?S8`Mn##e*aU(EN4AhE&6Ae4*AcHpjk0t}<+Ck36& zl)81gy1$&b+0FXoVYU`m9w%p%qRf1rwW+)h@H%0EZ4B7%fdi9(`RSk=rHri${IZn6 zJ3`I{ng08iAfw`BwL$7~^8AZcru|in7A#715V&M{r)2YI6 z7G0xRj(>kfV8iLmcbJ|-I(AWhZyO%A<$@fJ(FW#45@eysdltAuizmL@_%Np9wAcT(jUgH>~&m~zK z3ptxKdX^8J51msLeI5hv1{^ABupa912D${OUmOy57xF3_kFYXraKJU4_uf0$81IMT zQFG8i%4EYT5@nJqMIDD8*67NKU`?87VJDyXegkAlf8@0!EG!K==p>-DnDg-sdxde@nIkR{p9jk!_$OTvmD*~ufq8wM zn#&P_ebPXD$jM883O7hxoljQkmYKcTIMtFVQhKRlTHmJw33xptrEZ~X_u#1~$FazW zv5J_wz<3|3oF7H>bf!x@X_3eLp)xi){V{$X(XSy+I;guoes<79WW$K^Yy%xkjRwV5 zngd6yR>dALaOD-hAXF|e>o`AZnq#TBYu5$tCYC9%%1n4?B-uBHV7 zS3!EUiD?bUfqq43b*0W3l#fEsbCAhhkt$~(REYejM`wNzh1UQ`&R49+%@QN7JQ$YF zezDLedk<+$&h_n_ASb6T5rj+*p^ulI1W=>X51n5h_H)~`l4^Aqx{{)=IVcwB^6qX@ zDgJvi_irgtwq>ox=%*XLPJ+h_EiM^+oV`g-JhgYN+8!ijVPW}T_;~$rj<(B_urO8^ zv(X~H-Md#XcP=Dx)zdsWFeJINx&P6qvW0>3gFcPE54!UeJQq#TOo`6*=***#ak^KB z-;{2+YiN!kH9B6w->=|`EfgcYSV=PaMuLRKUR9= zzpA8FG39YHv2+~S+^>SOk3ZIyE~b9Kag{HE)ky7lgbp+HP+$>?e!;`uFqN`rzIZD* z`@DdCGfMh>kIx(1D$UATtcSvgBCpFZ5@2;x^bl5=-}nTg1+ zFP?6L9!2Ej&rg~Fg`)QKHQNZ@#8qu&x(pSt#owqEM#*tD?v9xH#BcuKjLid;@ChZLNQV{BaJ<& zh=dHjn!Eqia;`1Z#t6{@J5c;he!X@`-KS(~jku(5*9spQ52Vj@cG0s|2!fYwGvF=< ze3MK>bto?~AcZ#;uQT!^9&z9JXi6cVy$*7T-~Y!6iJu2h{&}e4$Kj0s^)0A^%_FU0 zwjYMOxXd|eBNAfl6k;3T5fXkg$eqjFz}#5uf})Csx|sB>3%4(+s;J+VxqGg(kJD2A zM@vX>h`S$`m3xSLP_USlZ)mW*7$EGXznJ+=A2Hi|L0Sc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0000.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0000.png deleted file mode 100644 index e99a71a3d0872a80e4e2b43c6bc1a2bf0244eb2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8935 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0001.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0001.png deleted file mode 100644 index 894df1dbedda8d6f302d3f09cb11dfc11ca00870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10049 zcmeHtc~n!`w`LR-0TmSt2nr}7gCHt`$P@(;0VPZd1Q`?oNsuTqV@L^7lma4C6c8d~ z!c2%^hKL9%2+24 zo5z+GCOd_tgaH7+PSZ;ltN{Q4AONsQZu@5bojg}xF96_Zp6P}2wm~l$>0qprU2hZ^ zcPKoeAQ|!*Vkzxqw8!vpK+a)`PPO%0MeWC~Mw@rd$z465{rbWa^u1@#LKTq5uVkOS zoz{0Pociv%<@qC7xtw{3^e_eURUEzkzsHkXaXJ_2lLwIeV` z%d_L9gU6*GbA+Z=7DioG-bw(+$FB%&8>!1`B{BtR*D!t^h|eqNnf18My5Y>N2S@W(A<5s}EhK;?U5 z)Slhbo08l^qjPO(r|A+=P%dSL!M$YkOe(@=aJ{oC`KsQKaoMRLGgqSzu`qo)cZ+EK z0O|C*lKbqbz*>w^UHNO=9;nmo_bXHGo!CcnT;s~S2mtIQ9-(U2q9m*D~!%{?p zjoAZv; zd3gU3k*mc?tqJsU$}t2AuI6;*j6V+8I=JJ_rB&|dEK6<)wkRL*(6;z_pCCP=J6*FO zJE27P)Q<&e+}FXVB~f8Bce+(Ra&&i)?U4va5%*bWO+KA1O7-3;32bhclvZMqt@6Qb zgqBSTrMwB>_jxHRqPK2xpyti{w$dXeFFIfyMje&flyRNms3M>U0roI-9azxaW3+se zQ{9O0tVZSP8v+SBFMNh9y0naoBFm9`y6(@~V_z<@Q*SfdveHgwU|$w4<KgwUkKf{zty~@cCC|oKH%5yzp_R@MR-DHcHoI}bCt?v+5+|A9LM8Ln5U|a%=C@^YY z0D2Cd0Mv*TY*<4*IM4!8rA-KD)6ew)PvbXCkMFD5RmZEe1SD#FfmdP#MUv4ulyF!` zn3T;11G#k`CUi0(GJ$G@Z(y^|5gekzJQnC0qCLbyA)pG#G=D2`YRJNbdsMFHx7sqt z77ox1BHB(kS*Z6Gb_aUQ(!sW!06AvPy#?R|y8pB~EIz#<8ESsD@0i^~uawV*rbFSM z4tJ*^a^0)9_YwTn?yn0^J8wZoSs+b&puD;)6N0s;?OsBky33d0)>dTf+>~BsV!sn@kEg>HH%Qa z-I`sfH4os?_l|lRJm5_1nL%yD+ERPknQkhzfMr+etjWH+^6e{fgNdFG9pYU4qXUye z3FwEn6KHj{TaTqNat8`$#iBwzb}R)?f#AnZ#VU`?R9Y4@vgZU)SM7A$Zf1rvGW|1j zk5IZ0O&B=aC-b;djcwgrFMcxF&RJQQPN!om(p7{>dd$lUA!8rnM_3;f(W=g(2X$Uo zR|kI^ZiI*qaR!$g7GmKK7%&${-?2_UVx=qIfph)6eSIoBY*z5x=QCA?Ht|pRG(sab;TcU9gX444}c*J zmu1M|r&TFmo1)a6>+Hol(se7bF80_cnUE<~w+nLkq2QCn@iu;!a(n;uDtM@;$A10W z`eVh66?P@DzP|^PkkseQxq^I23K*J=sT_8V4J*F>m~a8dtT^2H;&4fr$Uc7`7>I4M zC`XqS*Wu?_uNI-iugOZEfe;3vyP~3Eu6Dj*gz+&^QG#{Gr=Rb_%d>c;1NtF;257YQ zy{wQBuj;u5&Kz@+q^>;mSRuE9laQ|IzMm;SSz$ zTW^rY4FuIf^mmouDu>(p_=4R|st!ml@$f?Wp_U@0dq{*h9E_fz{w%qH2TTXNh#kMDN z!(a|Oin*bZrRZlK8)}sE_`Ii-IR1{gUXE{RH(%SbzbIbCQM8x#zC|EnbjUC`8gpcT zpFQ0~+_IPfuLpD5Ufvzkd$IgzSb&)hr#q$0av{N*cCSmtv8`eJCS6TBAFOvmb?xwU zVtAjLa}7(Ho_rf~_^%}r&r`vJujh2V%wp?V==CldvExzX6Fv>haqz^*gk3i>7taw_ zLq3H2!7^U@@v$sxk&H_^=oVV`iI@}^3jbkLLP1@baM11!>rU}t`S_AazR%+rmeIgS zrbfQK5@;c*YE8{H>b~x5=ZwGS;zn|x5q+JW=ykbdkoQQQCDye=BsrTOutWKk(V-fR zT*U3t=US#^h^Qdfb4lQ+k_k|{<6U!vw=>k}=|HzN2>*dgTdgU%7B8#HIbKn3JAGrZ zvzOT6H~i+IiA?a=VCZ~tm-@y;)%cR3?E0{v$@cc*f8}>%z_5OyMH&M}Hv}^$`uZS* z4ZcP~b@JA_i9if*2?KI+agkL#7nNWwZ8D27;i=S^S^aQqdA^enR;?E9+XP!jG? z_7a^acr3RxX=(mMxP~&L6DzkGPyj};>MHZ{{PQmxkR7D>xd8Iw>hwd|b&IXX@Mn0$ zxBmm)a^N_vwy6`Z*Ub&oF6TaXhJ?)8d}pon{2~2_u|sVq#*1@z$`ow6wIi_#h~(PHCw6z9$SuUt`g` zI$aQ~uKLhrgO%Y3B9{SwF14J*FJ>5WTVRr}3*9Z#V=>R45d7+hRvb>B9{t(5)I?V( zdjn|Jdw~qRHgSby4i?Fcf_f8mrV@*W(1j+BV%_&E?BG0|&bNjK4IZqFG)EhM?XSKc zy%rf6GL;#{m$)oJnV?rnE)5T=gY*Mt?O99BpfLs?3_jg+eFe~#)=-Ymm*F|x;(tA=u!EatgcB5@i$a z-o|aLLPji$jS>nNcEHe)CAHnO!6r$?_qCCR-&q0iu|uj-W7@`?KHYBK1NK|lv*r5^ zTTJdytIBO~ghCRtK&R3?_s@%(0aNuI=M=3u$;M_^=(Z*-jnyLiw@ z^S~#(_PceDC@ltt1!`%YTRFFDxC5BFRJ3rPV)hW@S0rkm1dWTt`r)}ny0H+(^Q zh=7ZG4NddlP^Gv_9bnD+!ihs}m7f!P>fW*IU=NqE-PukvF{VG4j|dcr98t)rV0mHm z#M3aZsY)0@y6y${U|Z?h$cz>A`kRX>TK{HsFag>&;m{b?+S+H8e=NU#uP4PnyF~=? z*>lhc*xxKa5bij$>5Zs8cKt|>7W?C#DQ&+?I_A@!_iSgb2Y*m*R06kRt&CL3I#yKD zqkCFyiT|7u&?mSJVEY$vs2_&^Pdf0G+2;jDdcVf5fT5X&zbyl zZG@oc@uvpt9ydO@jX%FkqtQ5Q#xdc*0srn!Fvv;VIb=GQuP+*}R@K@eteLJ*{-Jku675n~AI$Vv2;p&;K^rThXiop+ zlf~x^OSvHKG&r(-?SqNIsW016{B{T!-t`^$Bd(dk=1Yrh>guYLblpI{y!oyZwby3x zB;a=)=~TyUhlknJg{_auBG;xdy!AlZkz~ZhUN#>)15-u zv%#z`JHu3Cl3)X7T!G&<169<1(nC;=YV0j-sO+7z@zm~ksqUJDB5N2A@anfn zGm)P(A){=*vIFqOFn8;phvFm!RdIl8CVBJEQ@Tm(UZ60b%+l-OpYgg2iEIVfV_$!# zXJx{0eEFlu%>Y$f$e*EIa(HXF3Gk}}H!=YLk!0YX$XKKJ9QP0N_DcVi%;#nRp_5lk z;T$~Pk!&@c)MFm=Mdl6Y*MLv|5viiPzsWucVHR*j_|4u=J&flO=u2`|zoO)&B%)Bg z|KswOA(iLYa-}5*i+Q(9)$S*R3n8KPd0<}gc;DwG*o}f$ivI{KAu@G7z`W6B z7I@*5qZu#2?n@uBzTN=TSWPZYa5sq65c+53=!IGf{h+ zY9323^d2;Hz0r#M$Y@@u*akRpF#XJ_UkfDmc4oL{S8LxFSGQcmGl;oz1tj8P=)F1{ zko+cb9r&$ZiwjZ_S$)m=6$bp`t?Ky)H{* z@3~Co#g<>7Rv-dZ?1yGg{6Q%Kmi0Ryn5U2~0U|r3_y1a@FE{vuwAiwt1D3JcgZb!q zfbhR@d#77wfZC%LdLw<-bfL3QT=VHl_Hpf|gP*$i8V@ zZ<)9^`(Qfwb!GP`_;f^zs@;&q!CkM*A|hKYtf7ta?)g0V^TB?aZ78W}Wl6nz=VFX* z@9fepvAx|sf9gGK8l-ivWh^i4{OG%D|NX?w8F*^)eOmTy%po^B?&JEBy>SNQA6BUo zS5h9vho7AI@%pNe9y&ZA3DwiesOixKW!`KQm5@|mmK`%l_qUERN(t=Yodvo8QvzZd#M z)K#C@xbQT+oJzljftcR*UU!RwEnfJyF)O!Co=5&3@>J!Tz;~_pFK&Bx|KR`4+{ci6 zv>T|R98hN2YigzzbZc!p;LR}`7g@+(1cw)F)UBk+}BhLa3^?Cer_08Y*d zaUNef>v=?^d80UXpbD90@;+K6V0$9z$myTQN!&5{;T=#DMVAKi-a}s>O4FZ-bLg;s$37QMzI90)&@wWfEP|Ah;(b_SK4ku8(LhBabi zxT3+cLs-5^i5}uHzM=)yr}u^J1?9HCb=0vl9tw`Y-RaIWm|gW(J-&#iXl4Hh{T5Yo<)ouf6-`Vt(^ ziqkuH8a>cwa>W*T#rKOIw-I@Gq^at7M&L$SuHMQ@^4M$!t!89fW10t%bfl^Pv? z7Ylt%#ik~sw5?>PnfrBV-YgOZTX{r z7PS3&RPc*TN>}OtHrLWo%#9)_U<1AQL@^*s=RN%Fz+j7HFgpHl?afJ-dBrN%aQe0U zFZ48#%Q`uBEo?DOQS#V3cIQjMag|nM2J_XYxRcxJ5#RPYn4yn>GIFwNAMid)$$JrbODG?c6s?kM9lW{#R%i>-zifEIA}Ilar>WA-GpS+NwVpREPZgoQ z5E{Ly=wNb9Lf^4H7oF^;1^p8Znh?~hvo(wWr*ZL7>&LO3bBs92?v%RhF9YFN874rk4PA_tm`bobP44C%!Q_w{j@mVs)LfYx%mgU3NylT zo7BwNr$=pI&_ek0a_s4|LQTciDd^0R7>4I8y9v5#2X^PmB}M)I0F`Ze%ap;M3x$1K z@`&)TBP*zK&)B8a^IY8!D^{b{GinR;=TD!w)L{K=Yo-EjUvnFM`~Pjqwr$GL@)(Sg|V&+@M~nJ+lvFf~D6Hn>#d2m799~^u}u*L1WpfEu(Qs{0UUGjQL`ZPG>7gY-3fOf#-Os|z*IAqBT_C?N+A z%YRYZz>?VCSurisf|WJbs(w#h?HN>!r}SOwl+lG3Cwk2u2{Q8zzN@1uKD4s(bNdWF;V^WVC$2 z`x=s_qk;0}F(`L7SW;fs&04c=KApj!!hJ@i0w!wPi6_+?jn;x{o4sdE9%rV!%N&^n zG24fe4@pic1`S{jEvN82j)xmr9+oYr*WZA?L9Mv8;pjO5&D4_AO@YpeR`K+OSC6_p z_s~MO%j~>Jz9ZCUVg<8lNbVrS1g0#Iqyu*%GFbO^CWKRAguGXL`oiPaSK-^_Sn^jE zXr`?&rh^aZ!BDL!+ior1=~ym}0Mc`4t% zW4+tLD}55{{Zt%zx5H6TlVZD!-lVM8Ry8{sE9F(W3a^kYa84yt!`40_qgXa~`lZg< zpp*%IJyLOl!4zY)QNzdi_vb=K4sH7l7f-EDyt5r37XGh)9Q}u1`4;j73tCj9c%$mU zd_5rJXKe3h1NZO?yy5E(xN`oAvD}H{r?k(=DcwBbc3Sh)88_wIhcT`Ek*YsN2H*E{ zzXPyz_jC8XFK6lPe_vJ3G~kAh+?5+JIh(t_UOxN>{EJg3PMqkDZa3%81DG0HTqrSg G4gYUmbbjvu diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0002.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0002.png deleted file mode 100644 index 54c654fcf1a0616e2b34b0bb3b1a6c9dac1969df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8983 zcmeHtcT`j9*Dh8B92o^+Kro0Pf)u4liNFX7gcgP(O^O2&LzNB!i6b%$(hPz~2^oaY zi!|wkC-*=f``7%Fb1IXl-H4o1b5gwjHQYQ{`TZ-I+pgcU%(V$y5Z6k8YNN|aZJ*@{^bKyx^ zS%%YRC#!Q%v(pCBVTIDeI+51zzz@%0e?KbGcC$?D;e!NWIPT`VDDd{u7j?$@$)dLz ze`;J4wEZ!mr2Z)HsoX!bLS}cyh&5v!gzy1ZW<~p;_HIQ3W$9!5$7be6-Qc7TIc8&* zFx_$Itig#3Pk;RWQ?T||HjjDqT zDyzzTd&;X5IM*fGu^Bh9^`*dgtw#mE|B*&oU0q!nDqf5A8LO(Std!IVDba)Nd@&vy z8v{hnBUa{ae_d1c&q#q#_Q5`5D_;NL9xGyPv@(`gaFiFroS_h?dAm0_2UObD=;)|R z_zZ12c+f&rSm?k4)h;oC1z>m4C0cr;^c0)j%y*nTtMij$+`{&2CL29V9(#ke`6Cw9Tb zmdI=ke?PyGWVeGk(KV7BD!NuLkLAh#kEj0IXWXk#%ba1Uuao6-_yyv=uAi=`DE!@} z-#Q*|Kz5xAux(vt_Vi>?hWt_O!#@>&sR9^hKN%KF+FnHAkj~vxQ75h+2lM%!Xb$$6 z-_yco63#=!t;e*Z4jpXk2efVJa~wN{jHP3zuQacghL1EQJ_8Kq-3e}F8=-#3@=sRK zwXlh%q{p|@qOH4F>v{wF$qqHMQuv`>t0A;P3`6Su0d`?=i#?*EVotwOJ)J~u+1xL)1P9 zU0gE4B~2-|1Nhtho??C)0`p$FNOQi-GDD7f4{jtx4+_IIgrF#880YZLg$Is|XsWQL zId&~9MO(|EWLqZVj?&J{Vc0~xwLk_+wE$A^J0%-)zSewIseyW_y!n3YF>{uPLWDoFG)Q8hMTv(_!9V%7 zh2TyDrKDL4wY|#FH@bW6n%%X7sXvIP2ZGQRh78+mhWvHrkOLOr zK;r|*1ej$Qg)8wPD6yMck>R3#kB$Xu5cDj4Kgs@6zFmP{{4;^A0IRA zcZiF|?EOJ_2PKAb?t)HEnrTimanh$TCS2h9Tc%m7W-a*SM%J}Imh$0*momxcuhE=K z2H2q8L;Ynwx#$`zEcmx;G57@XJ)PA zWoXL#ML#jsmD5bPr~))s!3X`r_UXf_wd94OdvptId|Vmroq)=4YNP**PQ<2r%q9iS zX@%W&bE^gnB7ye$uFXLUoxdFsRlfU5pOpgKXbK}wvRO>{R-&8Yw*{{U_q}b0Zw@`) zxpu9Cak0@d7NCWbQtiP~7q6j`LB~Yzq3C@zobdcK95m^ru(v0_Zcn_49&d%m{Il3~ zV*YFKA2mf*S4YZeBpeR6zVgYSvZ|`8q9Ru-@U>nC*BgtAUVg6@!JM69eO4ysV8K|Q z@rB4??`G{f9R{KM9U0i`O{8$BhuS2834rfS;U@ZB8(pFA=w|Vw4!zz}nxOj8< zQ{jBorPMb5c8vLX{7HbwYA@oVsETWaAonfeMOG7_bsiCHqfh$m&V;+gMDK4eFt+x# zNYvu$>gqvQ1bdH^3TI9cU47SWxB#wZiNJx?bi#UicffG8-JHeXzRtCEBM=8-j z7CEJz!d8lWP7^$>%I~c(=tUH+a4yNw4Cr92mgnT;>`n)RSv$j}Hg)v1vFgE719`eY zpjO!WIGs-Kdm*<3CN|s+CqypoQFUWm!MrbA|Kebmh`|9`{phW#Pwe z-$PKm6m{py{?K1isGvDOdPFtz_fIDG?b+u3BLlKk7aIxKcKF~%H za9o_iFV;|I)tIHg*}HRTGti`>=3~4}V}C4&WOyB^>2^_5FDC$31QQsUzzniY+fhfE zh8OJ_%u26oAt?d(I>HRf)}2cXy)7h5CAp_}x7KcLQ8wnu$+srSNR<_4G44pL2hqSW z5h9A=0#@Ti>8_9-XW2&F7g08}anVr-2<#qYYg|&aZ7IZiRZaGe;sct8!}^U@g#=HU zMI(0PZ<0h*W*8Y{#Dn5@6k?odzvn8;^Eu7tI+AH=S{hW(?sMy4`ItMDgm9N9qF74l zJ7+}7PR?n%3D`aN?|(tsr5GG@PTw*a`GwAF!A7^N8Q0a>9IU&|yIMol?8yg1My*~S zyNRZxmnIW>!%F9Cw|>oE@2X4W9{T;_wR0cSepL{;pDJhLIK8(gG%##wdsd|E z)>pLF`jLpuYUr4ffXwTlH*ljHSEUf(_@ZsflF0OzJf}=ty3KBbx@ATaysp~E`|QNc zI*K*ZELkLt0^x`cy%*F!_-rUR6SF&$OrIc1jODtn#R3jyPvmE1*gElC<%Ns#cdBry zWUU$lTl|!DPSd}lqT*9yfS(`KlC$Q-c zR|EGKe{+#`yZuVxWvRQD;^NXg)@bDldN2GZthp&uUEZVvxoWczF#|LkYPP+Ef-ZP) z_q5JIGzJhmGTmU!kEon0(TtrH#_UQlstS;LUe`%qZ>vj)M*8c0yyo@m;+QM&6*QOR zSj=6_-dv(UYK#I1O>R&lg%7%W6vvg(31VpM60n~6e*V_R7}-N0(CLI%<}aKJDzD)E z9UC|NrzA_k)+Kgx0d-{y9cQ~LD}#OrNhwfScp~R>2q026DxlJ4rB7%HU7N+mjyQ92 z{-V)n-;^JXlySxWl!Vs9zuv{|4{^3q;ls+Ssqh1meaCjjF=IVsA)fA3jaRas^oR@} zr0*d#z1|qMDT|bOea81Yd>ZW2C^f0QN!{gLXpMm6;=M9Al)|2A@qG{n^=vsAGr+)! z-e@^&a$L(Jnm4Pdrsi6dPMuYGdHIzqSL7^nOH#QWYHx0iBu_T%54lAyWNZo5dMA<{i_Sf?mO!tE)89#Q||>S{o~bdJg7J49Re z8h*&2+t7~gc76_&LPRaOkrnR_`l=Aw8bw)gIzjWj-HD=Wu?-Ckj?7O6x|^Lxs@v(4 zT*%l1+&ZG0VK-n0dj~6Z@Lu4<*-kFqGrN!L<#WxSd5xVpJE4$mm&X|O@uqevZ?!m- zIN|2*p7h}4-hBj5-Whf-QP@Gq4;t7-QRI@#Z*T-wfWbz9+@LMovVh~2>606G9 zRj6#nbx5C480o-lgplJBl@U((BQ}}Qs&8)AX3aear977+Zn!R{&(}4T)u0x>!V7Xd-A2!p<7q+N=*flJnN6Ss>c8tOYuWe zH1YCCrLCbl;{Di}uyY!L?|$l{`sVYCCHhTA6godN2J(y_;wqk}_@WMU|1NZw;+ufV zV^xU&%2;VZ4$B~K7i(ieU1wB%Pl3w=+}|UxEpY}bXH2K|{Y4{fd{Ov`Gupc2d8acL zE1k3zce-HPN6y`!{6D8J@89)Bot1zz)@+rjrw{9&f#5@5EDFT@0U;Qi{nUMN=DXEj zm1X*M8uH@Rhs&}n6}?(@_Gs+IfFOjsG$kEW_q%Oj=ov?SA>4#sp5plxF5jKv3F|b- zkjt+h>bS?#d1LOsU0@C6df(x1=YL~15iYTPm##dYev3Q2DIijI1B5=t6YQSPbMRd& z{(l|9g*kw|84uwFFh0ktvxrQ>E^JW^wZCkv-!iq`2Zn7UjL(b7Y87xLKF?yO!J)nG zmN>>3hE4lTF#1oual*!_jXD%-y+22j+g7d5&1U7mc@@s=T??1Ch#G$h-8)zQ*P&ca z8x@3Y#xmT!@=pQu+G=V7mp|uEl&9)3mKhAjMy5Fs2;@B_Q6jj}L`o^ndsLD>X3O1Jt1?^Q3*QugB3A%#rHFv2a;`p{EriYhgF@rOPP~JH-L~69>YcWOcYw>T#YrU~*kbT4@ zcrTGvI(dpKa>lA$a@rZ6)CPxBmj;kIx~%>Hn2kQ{fCPZAmKL)Qmh{JZzVaZDu$3}t z>4Jg9Wb>Iz{j*C6hZ4q?Gm$Y$WYZfNv)c>Y+QAm72U6|Y5>g6_rcXd1;I-I{j10ys zi%Vo*&ttWpf+o!aIF{5 zHRMHa_c2zuRSF20$l3_6uB>FO+G7}8eg944`$w+V^mvPgvKX|9p@rxFV3Hf^rkVfT z{a+FK>x_Y)$mo4#&-kZuRlaWK zwzHYPC&r!Ouq=S1VIH)YDYO?QQz!#J(IO|~C-L^=8PR#lGX zv0g7<}J^I^)-baKxi%!L7j-O6T?e69h^=4BDLmy!>+eg zr#z=#coH1%9iY+_anhsbMS5<8FaE)Y-1+X&<|7?<+~hkeZies)5O30w;DkLrJblkk=(g+%8T9vIWRBc64+k?q>x zC?}vDq+M}7-+(aUI8%uJ>>%V(&wC`XK1mqt{koPkmRm(BNNO82N4S>mr=|+sy^0Mz z2Tf>f6n(X0-F7WBxA2BZA4swo8Q*IsEjqGvAq{Z< zclm+a$iU}xqfKl=k|bE>7i6FB*Yq&=yzkgk;g#$9_buS*#W&L=#AKTMfhuKggNEcp zx|Ud?_IPlK#V>J%e5J+GqRHx}J&CDs1?ZyB1wO16LN4@9V~m6we=^&!q4@aqup6Mh zm308hi)07ATnd+YSGZ<`yBYZm(lpp&>e3iFmYnD8Q1JtS(icFwOQ=izqTRBU z@x3}A@nV*>H77~Feo7uA}Zz-Z4EJZoivbgmuoV+><{o?u=;k znm5cooZ9|aBzW|vTA{v_IWy*d*h*9ICW4WfUkh=fum9-OmPUMo(17ww$Va|`Y@)dZ zfMmq@4uUsc90;>8nFtI^A!?0+)jT$nf`P5H3VV+^>oRT~V=atM$qn$%P0l07N=DAm z+x(e#pMI7qdmawuS8RBYLMsS;3o)*0ewHrLuO*INR3f!tZN!&wC~w>#@b-int;t1Y zB|U#zMbbd`m9$)sMY&Qtu(#odM|6TC#gJwzy#FcksTk zMJil79?w7EqI2aUELoj})?*xW+347^Ns%TW%w;TDp=xtt^DQUx+1?c3ym|IvGo@tv z*!M;ZUT4*+DX~a=pvGxF*S$Pd)Gjm?=?7N5PrL6Y9-G)1>(<^RHPhsb927eELOO#UeM`%r;84 zeNqhUeSqzam&B+A09`&>Yg=xjhXv%9rm{ZuYFX!EH`QM}!^k98qZAD;m+(i94V(4W znEZM3Eaq(@O3L74L3i87f@=-!EWlza$uoDPX>_)}xFAU%I!8iC!kOuO#Ra(ro~Mm) z2}#qz9b4|l<+G6Ukiqan2)RlWeQ03FX3UNtY`p~Z4Lk=)7UjI*Gq(sGOfOp0*Xz$4 zGTvxFHr-x|T109Pitu-3qvkFmL^?n#NZLtPeUn1x8-vN2(xIQsU<7%xhx~rb6N!h)H|1>< zER@ELwHK0fE-he!b@0NID!0XXKf&i;$5dURojm>=8O_p3FjwN6ca2Qc(ldyvpWTZ* z)K&1oxmL{Cr*l?qZfvPpZIQmCCJp{zc#&!ioui5?P)iG-($F0QJ}|EI|Mh)B05RM6KXFn4M*0pqzN#@as|Bz@beg_a~t%s1K zId+jr^j^dk_3(0YN;uHojtYf%srRrNZCu$TC48H-EEh=7TqC~iMGfCY>UMR7*(Q1~ zn)>UV6rqHCm#+M|b<}>?CPMx)RjAD$pU#}exFpUBOCtnF+yI>D&g?y#RGTpn=^4_n z;mCli90<`vx|uQpIlX3lqC-4MCV+1h@@2V>X{%$eM!b!~%(VD)Q6*4gQnJf!cOZN^ z)X$E{?j?-mWA&8u`I~9_MhCh*6z#;qJW#^}H`$1pLMXit!@hfe9&2{l!Oze$X-rg)obmWtOwoMp0>ema$AJ-s8n-P8|c!Zw({b|Pk_QApb zqc+uY4ljlCE{m>~_=)>D%K4Dn4k0!HULoQ4g6{KJ+_bnYbyZnaOH=CduU9?PHB>b{ zi!q7ZD9NDVzoi=iZz zD*+TDL5R|#(xilz5FjDRi+caQvetWVt@q`9xgU~s&dJQ4$?QG9{hK*E%ihl70Ix7F z001~(WohOJ0PGe50Cq|I@f-I^m0vUj0Fd;wGCSj(SVSoXS9`l{;K9#MT+gd5@Ozyll64r?edbj%czteAiy=N*)mHFCTV25U z&#dZ}-+B0pZtBH;rjf|cNZ82)y3gVgls(=&f<>qTRpypE2%u0@>n4Vr9K-Z<`Qt?T zpC&)QavC$q#54iW$qmfrWb)DDhrU0*8&`ZPX7&MYXJ)w04M#0rv4jqk7p|igYXu);tfEqm?|l^uC5LVMl=dEdUv$7wZ(sXU&`1Tv;cbh`ogB~SyW{o z{cf}8>a6mIZR*@29>`wJ+?Z1|{4QD_5*Rq+gkXGF+G3J9sbK{{WaDD}xJx6?TU%Xp zQ`fS6>vIt)>%ELbdcORxNd0@vxK|qG9GksAp0M29Pkxsvz3gB5ub_SxsHP}QCYF!N zbm2e)DTt>~y5ohSv&jrS;^B$`Ke#SOYk6E@a?-R#J<0l_X-~0;)Z&zxZ&Gp*q{n-1 zY0v6gPUl)TXD4{u4w$t+8nskAH|Y|0v=T@tag9N<&mwNTyfs=MS@g}kGU|n-2goYQ zxFeSeKB6cjW|maDU)y^D-Ze4`1nk{|af=@|7j8{4;&ME(=Q!wKU(QlsqWOM z&EM0-_Ij&Jbk5?OmZc+BYMz&cB-6%~_+0joO)87>3WZwyTHULS_{P7Y?Ym~hJB}g| zA`=PnBPdRr zK~8`YRA22lhC3?m!=(oLlK4!rENl3VB{O!7dGv{Z!&~B9q1=R;IciLQ_OoAUU%s;^ zWY0}brPsP}?JWKg(Dk_Q+POhXxL#$C0pSnX(@h#wu!!nBQaax5I3~(n3)_prT#eh%v{y~dJd35l{zPxrOHlVt72+f(v2+cJ3P>a^Oh3OPWi6)$AH zNZ=2qu8i^97TCSy?<4PL%j+z9AE*l4MK+NSm%m&;JK0!Kz4QsTU1Wb4xJF%%}hA;Qv=|~&sI5n)wkZOIun?>RhlW@ z&Rp&gp$LGs{1_5I=12VA1AWgch_ff43jM6ZW7|XSFM;kuf*{Mu`wBVB?s+)AVdVi@ zqJ-kGJjMTrEZ)px?wQMpP%_?Om(fkDLyB zk16M3*HH=Ji6^FQUE^Bsu<~0^?OS~kzhp4hMjE_$1jOqF*sK*8DR*&kabpS-Gq-?O zbZZpVi~Rg5gO7?NN8!atjoxE87)O;0eS0iG#oU=Z-&DGpn<{)4B)d@Oi-{B7d7-|y zPn3sHh)>axJ>s1X9hJkg$r*jZNOe!w>b}ECcLc0KJoV+#Z_dzH>>Uo=6yb~8SQutR zUAS<89vf83{o`(~u69Lw4nQ&%n#=`oopV$qj4^~@zx8FWmjhYfR$v_FyJY2STn;*N|yWTk}JnQtkY_j>m@U3Us!{ z6-&(&_i8DNJLfwSpMl)Hyb46g_ceu6T}s@U?$0XrmCeDdV*V-MqT{OaN!~(4b)0@_mPU>+g*t-sYR;9^=j~ zX3F^$<8qPs0hjeim&-=Ywas^LRnC#^YWpYO*L$6WtJbvqD>r_mcbGT^;i|Yj^hE*@ zP0Q`{Hyi<(7uYh;e0!&g?gy|{oWl(pcZcp4{?cR0G}to&dp0~phkV6vx znnTdwXT2&G(xK9!0l~jVzuU=DyNU>-W#!*r3^e z#mkJ=tTGcyqctBT8y~;Og4-@)^Bo`Sd2*&z$!u*|C1)&m^^g%PWjO7SQ0;zNAu2<` z5V{`sbQL>xRE)sv)Fr1sS(6Z*K8GZ`5C$nrBCm-(97o_z$&y& zq4X%u)KE>L4{7SOy&1z74k0wyT(5|05IU!43>`s!tBO0{waqyKf-+*EtF$37 zDfb8GLnMC9Vyvxxc`YI$l0z=Q(TFx1Q*0K~H)ZWj1|C#UL8Om9VoYd`e!Ns#+m&z@ zvbxRh4|^y&lPV_eb#ur>t>ZRB;L6|*a%pj7>ix1Mw8^AF16JswyxDLX-If*lgqvuN zDv3=(tNx{zx>jHD{o;yU8@S^>zP>0Rq1eF9*as6m^Wxg>qblbg8nb|$EelE+dkb%z zI-}_85jj0%r4WYNP?(UcG#a5SAHRd@R8JG5wYyh8K4YVMLETsmY-N7`z+;@TG&URE zEgu#?KN*0$nSa+^YTg~yN`#H}Do~4m*A-e=7_Qrx;sW&2{5z9|#>U3_`XarkG7uKZ zq|eUIwuX{s!LXSEH~I=0#$j!8=xCgG$hea=*E;L?ghL;+AvdFT+BWnO^@R#1?wy#2 zZ~8nXsU=@+A)*v+D;?%96OrVdet87K2F?qFt`{{dPz)ZF5nn*ZkoufBWg~VxID`}H=*R*x|vF>_6*?6 zoR~>f^vHiY@e>TDef+m69pAsB6b0E3J5wL@{KEXLC3rBBVx zX&3N!!XhFNhF3HUS;5B4Ph4QdzNkhPIFG8>xPHo^s=6dc#D7tU=sIX2GPJ^0Q% za_;vu>^R5ts)jq2;pI0o|6+-BA*6jmu^eKaj~s_7mq5qNiq3B{zIMD~K&s`k_U= z`Aa`@oewbkdBtSc)*dclNhgNmTqYHg$~F!f+dH#iip7O)4u!T z^CIMqtqF}2`2q1coJOpU1gyiyFXbTvZ(Yyv4?32RuIOdljnu?-uhCsE_}#15rQz|Ty88hSEjst0TXtU+`$;_k4|ntJ`FvE# z`AVKOcOqW=Jr5Pc->#l|Y7a>L#r2f9RPX;mWl?D1HMcHZ`fLhh*jsZpv723p?RUW- z#$fJpTgrMqB86MYp4~T4{mWzS(qwO-V9?LIfz<+S=&>~BQm}C{b+#V`V=WSlIXk`i za*OvlP^Y7+KJ_9Nxx=^qqiXm>`$igY=LzVcNA>GWfr!hOMfGDt=nLh!pmr`jVaf~* z3=DAdc_GbU`T0~0vZPkPhl{TUE1k`ttpzunzSWMCrGoO`VdZ+yC3IYB!TC!Lq~2`r z)_A_g)^S2FIW9DGv9V)0X&EyY1dbSg?qEEbywa6xME^Jk+QcxnY{5Oi7! z_$Xv=_5){6fEtew?+aCaCFig#pQQQ9M;YzEz%B>{qQ2Ao!6k#hFlr(BLoOG3@ra~_ z8e`5jVPlQ8N#@*1=qzt@BB6W{LB9$9yO%sdwW&KJXzT_W$7%pQPuY%UCGKpkeX4t) z;#~_wKfv4RVN-rqm?bx4}Z(J&r9(zieTE=gy*>QXs>oWhk`@6RKY3@2VlYi{U?msu=%slP5 ziuhle|D)_l-(Q+POToWG{5@U%cVqvkaO?DcBKAEe|5-5qFR2AYOr5dw+TQe^sfTJ^8@*MWs4WF%$z?&a@$mC}$ zWx4OBURrluzA8Cm>F(BFf@4Pok8A}x^SxpBPvCNva^RISy|A?(nKn9J@N7=@mGbjZ zW?Kb1cmftZ(UMO;r4WY!;sW${2?nCM+F)taE9G@-Z@D=)bTSPJ>tSL#>NPG^eN1rf7&M>bpimmD)aj((w!%8P@g)h=JLesl84jdGNrf4+wECXx%vYGJ=>Q% zA0H!1c<{FPn4!VSe~C?WC${g_TMb@sntT~wV*OPLMw@&phSC{O+1F|W1rHD>Ln zER8mzn$}TE*=rSl`BDldao~pH+EyQ-b^Ct}Tc4#qT7FGlS?W!GVfDZovZ!QIPJJDu zX+GcAj|17ozBD5>5X;b+eCLv^BHoF~DGE47N8|TVpPVcci-<4~1O<+U5I)1#jayzX>_j<0~#ic~JS*xt(5_z<&NIVR@&uU)Bcm~d{F5GL? zq+uC5(dMHCH4Q z%bUYCZJpbz6L09z3!$LE&1smbO{8#C#!^M~tKOtc5p^KqvSyL^0H4&L3 zQSiGJB~)O8PjHgC{ci~ZvHx_hIPaTdUO`TcVu+mjM;og)B ziGT9Dw7pVNety0E)y9n?$b!uGmu<@BRjC|{t^%LYH_CM=e4UyR``bkklr=>@O2O^;MIY$8>;aV=DH+Ypb^{ak#@&iD6;re;l#8>P zfhjT-BN&PF`xZym8)*vzx>dl;-3m5xQKFD@^OaA*wEFrQ`KYth5nJn`95u$Y?E;X# z4|zY?yCyiivFTPNUfwo%HPnjKUuuTSe@xgV;05F1V4dZothTw?GsbmsX9urPXgy;s8$^Qj@#dJFFIx@U?}UTh z80TrAiKbhBu2=G2aSMgaA#S)taDyUZn!%GbC8zRoU@h~6OqxhtLt-(U3=7|CfX0d-$AkZwK*TXwlYG4^BQ zWs@*xZAOH@0e9@BB=EwKZ!=yi*o2|Y^#d#ROg#QQ(9xf1FCwp-YQ*V-SB7ppGAW09 zu$?8gdS! zJsZgolO*(+N>Lplv?~V+w#Nq@B_XtX#F9ev$VFNHLq;;2iIMtB;t<}!9Sf(!UEfj& z@apy%<4~h-%0^7ZZ7Tv!D|I<)SrYR5dwpkgVuk;Z6roRUy#kc2XUK2i+Pxxlnh@7H zhN*oF_R`Fc9)}sky~RyR_S?vNxW4n4(z1RZ=JPrT>%|saJOs5uM4%rE;vEA1$kuZ% zVrc^RqRyRAHy&IJvc-VeuRYC>Ps~8h9NO00Zo4ewO}&I-t;Ub~&c`C>;_{AQ#08@3 zxn`m1-|7Y}+m&C^JhT`~pn?J0M=O$3Wd3F0q>_y*2OO`Dgtp#)qAk!c?2*EL4XB8! zkQT_>QUAJfDwW`IapPUBd1Ar0xaO))a-8`&*|XwZW&xMQgmSeWz;|MM3iC4SOJ@t* z@gtvPx=}o7ybcV>aN2{tgJT^HhJpKn!d^w{H;9#Wpb6)RX(T7oDNfo^$vPi@w$nlx zGC+MhqKNo-uKv=U!!WJ6hJ0a#VV0&u#sdu$Z9AyH#f$x#i<~y{VPZ%y+n^q?JdTUxNUR-jMMBYhH9PAC9yOaxLa^63UZ?ZnT67ys!v!S_=M|Kae!|NXX^ z0TXe5T&-?1%sqAj5RWx?k9CR&icRp34g}bqu{D=aQ_;}Vl{guoc0o&9L-&Gwh$OO) zE2;ED@=8o>U>LwYFg7qcM#BDbT#S;0RlI+=gsp$5gi~ZRB%J#L_d-KWO^uY@Z^P9C NSee_IHJbQc|2LIN`S<_; diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0004.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0004.png deleted file mode 100644 index 76c6f0dc6ed5156ac80c69ed4ea446bc90727d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8931 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0005.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0005.png deleted file mode 100644 index 8b1adde065aa4f0cab6eacd579fde4e6234e7ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8799 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0006.png b/applications/Volkov/artifacts/mame-p10/rename-pass/sprinter/0006.png deleted file mode 100644 index afb278c764f47176992cd7f161fb0dce458a9625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9193 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0000.png deleted file mode 100644 index e99a71a3d0872a80e4e2b43c6bc1a2bf0244eb2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8935 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0001.png deleted file mode 100644 index c16fe107a51b8ff950e212c5723bd2b59253dc29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10045 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 o?)b}C-tm#K4GaSNb02X3oI7*o%ur$<&{O1SGM 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 L^`%+^uiO6t`=A&Vdx$T2i_o)n{YU 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0005.png deleted file mode 100644 index 8b1adde065aa4f0cab6eacd579fde4e6234e7ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8799 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0006.png deleted file mode 100644 index 06d6e0f229acfe520fb14794836d65488325d38b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9184 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 ZsH&)_;1UPTx$}5TuUlTLGraZazW~L)uT1~| diff --git a/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p10/rename-run/sprinter/0007.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p10/rename/clean-dss-return.png b/applications/Volkov/artifacts/mame-p10/rename/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p10/rename/collision.png b/applications/Volkov/artifacts/mame-p10/rename/collision.png deleted file mode 100644 index 2d9d34e42731441eaa81f83a3b051e8c66503e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8913 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 B=HUPU diff --git a/applications/Volkov/artifacts/mame-p10/rename/dialog-default.png b/applications/Volkov/artifacts/mame-p10/rename/dialog-default.png deleted file mode 100644 index f3d4d238ac5eef8c817a0663b4106b35927f9991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 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 Z59iOGJxh)0G~kZ|=wC6?DbaSi_aE#Zb6NlZ diff --git a/applications/Volkov/artifacts/mame-p10/rename/group-guard.png b/applications/Volkov/artifacts/mame-p10/rename/group-guard.png deleted file mode 100644 index 4526c9989ce5a540f1931382830892f7c7782250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9202 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename/unchanged-name.png b/applications/Volkov/artifacts/mame-p10/rename/unchanged-name.png deleted file mode 100644 index 6ef9f1a225931dc2656cfc5a0d90081253c3412c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8932 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 diff --git a/applications/Volkov/artifacts/mame-p10/rename/virtual-guard.png b/applications/Volkov/artifacts/mame-p10/rename/virtual-guard.png deleted file mode 100644 index ab02a2e742d9e23c258510208684141f024f1fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8808 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 W+_|y%K6Cy!0MyvRsLJ4a)c*q?`m+WA diff --git a/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0000.png deleted file mode 100644 index 0d47c788c81d78de8aa44eb35649f3fded3ffd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8995 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 diff --git a/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0001.png deleted file mode 100644 index df2c5b592a97f384e4e24f68fc1a964a9d23c2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9914 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 TitaH2=79`!O)i#eUyJxRRp>5p diff --git a/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0002.png deleted file mode 100644 index b04d5cb600fa987aef515aeb439427374aa873fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8991 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 XPEKwjX26g+4`85Ue7#iL`Qd*6M7tBi diff --git a/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0003.png deleted file mode 100644 index e23d66b4952102d7c9111a1d0ebb2eebb826aaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8412 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 j0*~3>z3(3^5lH@MpFMkaI0# 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

    fPTVy>r7Xk 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 LUe48y=dS-3m4&B( diff --git a/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p11/delete-run/sprinter/0005.png deleted file mode 100644 index bbecd05734d42877cb35f2ad7a445ad352533035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8662 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 diff --git a/applications/Volkov/artifacts/mame-p11/delete/cancel-preserves.png b/applications/Volkov/artifacts/mame-p11/delete/cancel-preserves.png deleted file mode 100644 index b04d5cb600fa987aef515aeb439427374aa873fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8991 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 XPEKwjX26g+4`85Ue7#iL`Qd*6M7tBi diff --git a/applications/Volkov/artifacts/mame-p11/delete/clean-dss-return.png b/applications/Volkov/artifacts/mame-p11/delete/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p11/delete/empty-dir-deleted.png b/applications/Volkov/artifacts/mame-p11/delete/empty-dir-deleted.png deleted file mode 100644 index 461f9132c535cac3b3af9616b34acc76878a38e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8385 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

    fPTVy>r7Xk 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 LUe48y=dS-3m4&B( diff --git a/applications/Volkov/artifacts/mame-p11/delete/file-confirm.png b/applications/Volkov/artifacts/mame-p11/delete/file-confirm.png deleted file mode 100644 index df2c5b592a97f384e4e24f68fc1a964a9d23c2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9914 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 TitaH2=79`!O)i#eUyJxRRp>5p diff --git a/applications/Volkov/artifacts/mame-p11/delete/file-deleted.png b/applications/Volkov/artifacts/mame-p11/delete/file-deleted.png deleted file mode 100644 index e23d66b4952102d7c9111a1d0ebb2eebb826aaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8412 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 diff --git a/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0001.png b/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0001.png deleted file mode 100644 index 03e8fd3f290dfe82ef9d39e98dfefeaa5e26235e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8482 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 Ly;Ygz`D_0J@r4@x diff --git a/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0002.png b/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0002.png deleted file mode 100644 index 3fe3807380bd839ae4d0807e873c25cbdcd8b1d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8612 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 diff --git a/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0005.png b/applications/Volkov/artifacts/mame-p12/group-copy-p16-regression/sprinter/0005.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 GKmG&V&e-(; diff --git a/applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0001.png deleted file mode 100644 index 8dfc702d7a7dafd96f5850361ada2c4f31344683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8428 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 diff --git a/applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p12/group-copy-run/sprinter/0004.png deleted file mode 100644 index df0c174aef3d214dd23237842123d06053cae472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8452 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 CdQ4-7C!i9nz_=W?&mDz+P`#%Y;*-x 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 diff --git a/applications/Volkov/artifacts/mame-p12/group-copy/selected-files-and-dir.png b/applications/Volkov/artifacts/mame-p12/group-copy/selected-files-and-dir.png deleted file mode 100644 index 8dfc702d7a7dafd96f5850361ada2c4f31344683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8428 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 N-q!I{na%m6{{ZS{&?o=^ diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0001.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0001.png deleted file mode 100644 index 362fbe8ca3d2602c0ccad07a97750bb8a4573ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9539 zcmeI2XHZk?*Y@#PP*6F?f+!k9KsqQ$kxOt5@3T{}BZ%uMw5 z@g3vi;o;e5pnn;{!?RtGhiBW#-G2aQUf=R{=iw1AFt~itGAM(ZXn35eO zPxcg?JYep=Xa8~azkI&GE97J{$V*chjRQ8U(IwXsjy6>LX4e=zyOA(Xne%Ic6H^1r zFYFe5_^0mX!OdTb4b@ux8Ue`+oo|G<$8DZ(psX%T;#OM}6`)OQDhz2?xGWWLYbdObv`{cNTf|i=K#9ICEJH zrKtpM*qm>_CDzQfE2Gc>`6EKavP=y&KH3-x5BM=c z&loJXcL0O_JmV$KpNJL*x%p0C?Fa$mQCvco*~=g8T_LniqatFkog{65$wFo_z%g(FGE+H`OTB0R{{qR`j~YVsX^))a?GY`m4j*IW{*q^dG#`SJ(TRDt-`U6g&{bzd1_j?KKw z7A(&0mrA0&59GftJfkb3n0EE40&g!2UgWc9+E$8nwJ+Lne(Yr!2fm`Rz%)+jpd7ja ziHfYFZkzTw;*nqOnA6^~?%m8Z)>)~39^kz=$c^n?JzTAa3!?-W^;Ep6SjrQA?S#wp z+W)M|q{9vesqNFgdlO3hta&KgcyI5o)`LkrnH?%Fj;(=DZi%n!&l)Z2get z)(kUphQr-I_9FQ)UPo78IeE-l>IGErxQr*Vhyb%X2_65FpvYJD%+62Hx&SXkhE8GZ z#B8#Tu0W>@(93Ro6|d`pt-Sk_$XMX?{=a^XRpwdE=_cxKd)M%oLU;i}tbU6Eg?y*g z&wD570H|YJ)n1H8?LC&{2V|u3vzl(w0cX>Ed&s)fiU1;6=im*#+H_%#V34cwG}3UuO3v~I>oW>O2^lxb+))_`=MUhr*T?~F z&rT@f*uDYxras0ywmrMfYpTQXr`I9Zxn%ki$*cm071~%m08RkMSNVw?8XU)^mu&zt zQ+;twJimIqr$Vl_l|H6zmIk2>*X9h%Te=2)GuxHyoTDMx=0NOTuA_Gzw3d>VZVj_Z zxrdTle#U$C)Qa{QD^JkG(5Xj}Ma%E`6@LSH8In^R0zlt?6U}7$M9b6qK&nP4!;`ZN zrqxWgC(DB2H1=9IQrl;0$-t0m*ipCy@qVLLA8E^JvVpaEp9n*skBUQWP_3=v*2D4F z$U>-hSL0%vd^@6|Jub9Xn}v`Qry&*$UoCNozQZF?h^bNvNFJ6>r(ClWBri^P^i!Bj z<|4I6_r!T$CoeDR=bTIZ3ng|~RaI4)50*Nd#BBCd_Bwl3g!>~3$r>T1jNcX3H}uLj z(t#UP9m(^pB~Ya7;iZDk0VDzXqMW6YN{C?Ic~Tfp+4y|Jl5(iN(Q9I)?MJI7XUs9m zh%o7hz+Mwt_$}sO#tsX~N0Gx=7_ruGwkW~^Z6e>1DoDQ13ksrQ2tfTckyqbG^7m7k zBX}w3Z0+!nwWwK?4tEvXL@#l7%r=5}@LHQgzUk5x7#0<2)HzujB2^i2K|^nBQp`Dl zMF&r2tUmELyGGQNe~6LmjM0WMWG_m0NAo_)C)P2J&dLR0%?M>sB)#8CO;r_;&nzQBEK<~E>W>5 zu=7l;2C&NZWHf9+-SyhE{mHdwTXwja3w96iaP{^vl+Y**` z4QXcqUBEYOWGK&5EXLvGGjYxI`R&%DzRJbx8iV=!xusarc}gkv=)9 zaBjkId8oQjGUJ9bZcWX>vvrZNFt-u@Cz>nG19PhRVogtza<8)!o0c9%rlmf5@*bS9-t1VGF%<}UCN6C7%w)t z(GSX%WV^2R3%Ldf4GM*h( zC6+7~&j;42Aauv_hP;H4NK12~{QKp{4#*w4aPz%&K}V{hRT;3@4y+M>0FVw01_OB2 z>up%?vEjkN8sBL{&a#z5u=8wJ<_ZzH4nr)Z8%$+2%labHq-{ZJS-?>ef;MQ#3~K z#|KU&F2MHxc?8f6CY@5Z-2wrZ`6S~O~fEPt{%vh-@am6m z43Z9qWGaGWFYL+9vf3y=P4{8wgggqu8CgGBe}f&TwyidJxtcO5pS6*7p9Sw6v!=Yh znJ?UdtSadqm=we!Wie3EkONw{pp&#V&;DregE~3%t4aR&8~j`0>erjankF+t)=nX< zJ_w=n!%5V@52hgW@%gR3ZK;o(Kq_Y_N@IqqM56J&`Jb(uCQx$iB!TE$v0}1afkDxc!^hH!dC5-dpC+9q0}k|T z?&n*xX#=3gBQy=^iwLTe&*>49kk1&!s-ji$Y|VXlTf6HJeFsIksI3w`M1-rNt2nd!{UUg+8{ z$ahk~x?oW}UsYh5Rk!?QaGHPUfP|?zU-B-jfbxt_X>&Eob#uN=s`2yCHp=2Bx@NwN zj~RIXkfPHUBfWBq^)fpHGQSD!8}%u{|IexmCER?|e; z0cL*t7lDRC2CcK6rpWV=zF=OVNv=87k7mgCHID9IQXdMkZ}~l;ae9Rg<7MFzT}~|g zf$Y!&iQmqkQq+Z2rLZ?e2y(wsjWilrp>u~itpy6u3d|w5A+lauOq@X-j3MN}TK{t| zE{S11)}Tbk<14%IJr9b}q@+*jdODMtCpMbw=ca(#R{}`6-CI zkV^_}_%8;{8?0=EK#L^t{;JC%agjtwFl*4djjK;_%}Kb#)1hgaL3H1Rxfgi$x7#&G zyflB7zi;ofyGK}_G*wEX6g0(saTaH&nVEU4!wThk@3)vz;C)ndk~6{ePyS@hD{9xR zrNGKF@Clzz?S7-JR?=Q=7Eln-{&8Qxnv7$O&2#(E+VpP%$e`k>Ns;x{ji+40dnOY3 zs_9*dv}j|}s8oB=Xt3c8_${Xfc8E~NTyOo3t(M=gAFT0}Ch{%6N^p%SlGzK$_WCfP ziNRj#7SRr?ky*oG{b{4MMfaAi8v&^Uwd%dDxG15LU-fxazeo;K7IfOmwDZrHG-Bb&>=`i~&OaTxgi=NHn*16b5s#kJmT?n15x&8UY4cN*hEz6p+ZW?9gOt@Py z)<$BHF8KN7h((@_7T+dkNoRHf=m(tY-GF=F-ba$@Uz;O3OuMsnppDwBxylY~fAjFL zZNLv;gH~2>>zs*_@IrXQMY?tIy>*`FJV9SaM~4G9NKCO21vQ=p*^*sqzHnMKnUS*^9H#QqTuYekXRw3Ioo z89?q+M6PvYbLLz(ev1>@K%sAZ%{QD|(-;VFQO2_ZPIyQ6?H?d+C`tF{2@={Xpiw19 zL~@YEh*}DEi%mZrn3rn1$t9Mw^AO!;A^vs7t8^K;q|BpB;Ds8OY_h~}Fx1F?@c*dP zpY|Sl%)nS${+xD#j1g5f3*T>{yd!r8UiuC2f?EjoK-u`|k@bM*+IJ^@O`y3f z|L~3dE2q0uCbN~N-mKWQH|tL5_()-S)w~C2X6Hsf{G270dptP|f}5PS3)RfrFHIVB zfx;@|lI04U@-vxsQHk?gPGU>bTzYGDa#o*DtQd4q=a@?CX|hS1PiOBP;%3E{$iY} zS5#G;i22ij-m0<3%a+2hBQitts!ntE1y1DHM$_}#_jAtuk_=%y%{uHFZDAr%tba|s ztHKNtF~a+_rH?{U2|cGWxmSIU`<`E;Q4A~t0ltPGNMaeHjUer2+28 zL6eFwhJiHzvRgYgaSPb#?f=Qs2rrBFtf@G!>QgDCImjpx8zcy1`{S0jC5g-@5f{m5 z;Stj;Sx%hfbsks^Qxqm@z4V*N&)gpJvfZuvarH6THD{Rfz>b}VFIoR305dsu1y{)6 za2hsj+Da$?pIL`L#BH>Udjy&|?Hi9^zo;4PZ(DGM>eFAEI1=dtj~Q|3gxC^1y$={`aE$_mY1zwq@o1Etp>n{I_5J#l_a=8~@VsKMv)8 zK`c~P+N~Rg{{9hYSALu&*e(|^Afj3{D*8z~@w1CKe+$zqrm+zuKb?Cu8T@d_^}z5? zAsv;StWN(}-6$rz9s9f}{eMD%@+A!v+V#Pi1J>Kh6&ym}eXkEIPB#xfG+) z5Z*+Qf?wqfxMWBbK3EX+ycWH1+B;?+`vbECRn?fZ?8}lXM|=x33)<%=?Ku)!dhRej z)O!|tp(9T^Rw@y;MlM92)Bo}H-~h~VuGPrihLFNYJlMq?GkN(VjdKim-#Yl{<<~mV zj}8_Z&J~M+dwbh@&z~3F7(n;f3GPQuJg8GYDs(Oq*J}a{mdY#-6UrS_q6w@)uZod*O?7 zcj+|5EkosEaPA6z!u?vj_W1%KX;LY&FF1Vs%p1jye2iP+oNqYD+o_aTK4KHz5K?;p zxu`y5+3bPpQ;M>Xd2!^BLFQ0nJW>{x4R)wKG=7uwYC>Y#zE(BKsA|c=$s9!odw>rX z`~_(=)9`ki_=y_k+$(G*L z0{cPl*rz$!z6AQd+eM*O%8hb_k=S9LM8_8jqv!J^I}BuwNY%MCgaEHkbG(Xcv)A36 zk6NU&{XZE|S_i427Oq$4V)q`58*P!}JVU>EAtG)ZyQ@;hh(6hcD~)Vud0+;-TyPUJ zC4ZvDo(IMCu6(~pH4jbag)QvOf8(=Hea|HoOvxgIeCvy9-$?hkm2J&d@)W97`3}X(!iJh9##Yw#AB~GTXX5 zsAvAVmLc02;bUfK zQM{b4vV^~y#K@2HWnCvrcC z4-o3##`N_dax+JLO4J3elH}j`j!KpP^CE*i`q$W*Pe@$3e=E^uXb_>q4YaVamlYlA zP9RsIMlQYW_R4+Qs`;HN-j<(nCuWDJq+zMzA%oUFLlIIWQ!hlQc%}GUzGWg)WuOeF z^2k=v(w1@rCz0i(65f}|ky)Tn?LsUkurUM>Zrr^BT*w*yB5iNCSW#nNTtz&OwXr}i zr@s-4HCn4uKJYNZ?f$E~G$S{;eJY=h&KAw>IC_|48w*-Dy94^u<1SrNJn+$Rce_;4EQGZ3^O0KQ*q(KwMb(}mOibT|t2{;sm$lYzSo@ZE+h&ZPX6cY3d& zY{za7oVn1XyXD<%rRjkF+?_D#kFm|y+1pErUA=8Wo+!NMKiMN4Z|S@l>*WT41Sx#o zt{Vb~0ztD|`)a0!J7rRbZ#?mD*FWMvD=rn`kt%?R^PMEjLXTGT5o9j8n-jkfne{v>n zhR=*N%U(LuWm-XeBU+}kPQ57}_42Z|Wq2r?{ z$Q&tejGRK_^_lh$80P25o{h;}m>78bs+t{qUw9VXXJ5jDt|kqO&*ud)hh8AKBir<; z`iYt!r%->bM^nqxqu-?2)Vi%C%&FadUi=Bix#>8CSBNR6*97I2ThE}|8l;!v`Yr8S zH3Oe@3E@C{WiB(G)|f**E-TK%r=?SG4V>~6Kv(Me(o2;DLw_*)=vnK{2ji2=7;L-6 zSEeoJmWb;4ep!_j=OJwT`T660W)_Xiz53s5TAf8;1Ny8^WIfkxx+f{Hy0V?UQiC8T zgSWeNDCMW@0#AMs?k4vsDIB`i=!ZK6x&ypiBWb`Z_HMg%b@N*&|3e3F`g;4@`-P*7 zFP6Ypmq7kkto_C9HR`|e4Ld%o`8z(0ULl+K(vLwMS01YE~saK+?u JsqU=@{{_4ZmdgMD diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0002.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0002.png deleted file mode 100644 index 7a9a26dea8eaa5ce90a95c2221dfa6b54c5383f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9820 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 O<1@H!a;*a75dB{g?iG9h diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0006.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0006.png deleted file mode 100644 index 5e501dc3bc2c805f25484262a0ad4d601adb6448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10110 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 diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0007.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0007.png deleted file mode 100644 index 7dde71db508d0438eb8b2efdcf88bd2cdb7e30b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9912 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 diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0008.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0008.png deleted file mode 100644 index 34dc9b32f4b1650b11449ae99dbd5842eb85b6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10044 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 H{^EZCOs_;l diff --git a/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0009.png b/applications/Volkov/artifacts/mame-p12/single-copy-regression/sprinter/0009.png deleted file mode 100644 index b31a79c464c1e37bb17cb87b05a9088975f843e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10982 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 diff --git a/applications/Volkov/artifacts/mame-p13/file-only-regression/cancel-preserves.png b/applications/Volkov/artifacts/mame-p13/file-only-regression/cancel-preserves.png deleted file mode 100644 index 81f988a9fa5f06b88f4d0499ece125a19b6222b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8865 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 Ky-J;XkN+2PJ;L(< diff --git a/applications/Volkov/artifacts/mame-p13/file-only-regression/clean-dss-return.png b/applications/Volkov/artifacts/mame-p13/file-only-regression/clean-dss-return.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 MO{|U4hPNL4ClzTAaR2}S diff --git a/applications/Volkov/artifacts/mame-p13/file-only-regression/group-confirm.png b/applications/Volkov/artifacts/mame-p13/file-only-regression/group-confirm.png deleted file mode 100644 index e7584a5ba42dea0623064d052baae877741371f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9823 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 Pa{!a`7Uy0YUXJ;1y5;j$ diff --git a/applications/Volkov/artifacts/mame-p13/file-only-regression/selected-files.png b/applications/Volkov/artifacts/mame-p13/file-only-regression/selected-files.png deleted file mode 100644 index dcc3d4745922b9625e263b886a007add826d1b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8932 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0000.png b/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0000.png deleted file mode 100644 index 5d69c553fd65ee62558b2f19ffbac1258b7904e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8512 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0001.png b/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0001.png deleted file mode 100644 index 865a6cf2f4076ab2d2430ca6aa91150e8e7146d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8869 zcmeHNXH-*Zw~pf|Dx;_$VnG88A{`W@6HpLo3J6G*qJZ>7dI=rLO0N5!30PK+7^PTX{Gw<*~0N}@cmX|I%#un0xyedvPGka|7 zW$tA?N4R}(vy%+8K4kJE%hIfZIb*fg_;ubM?bBc0CR!YkN@%+DPva@mH(2MDIsEx} zb>g!Y#1pM^JC0oXQAzc+h*ZL%CnlYQCIis;1)3w%&8IV zwFSRlw&lbx^rWBSygAx&mSU8!afivCQHQt1dw6(&;#Pc{!)E#r&CSg_MGiQUGK|>s zY&Kgq!%)KmvpwMf$5uOkTyc#jeB-T@Q=JZkJkbeS<(?M8x!E?H{*b0k0x+96amZ+F^fam6zZOX zOc06BPjqf{sXLKujW&IoL4s_>f4SD9dU z8=`)U-QK=)n;#NN`PBjCsAWJUS&hjEVHh&1nW%wnLid)Cckt-V)uP%5oDxtF0 zt*%tX9H5wz>0Z$&(s%0{;z1uK&_*fro@l-uST7G{Y$73d>Plz1!%o#4-o?>ZZ9XMd zcvA42fI=wupm*f8(5f=SmsaUJ<+3^AeI3eyHDGjn&fFC?x!7WSVWrONu1us`u8eJQ zdr=f>lxRoUgz)@RgWL#mZ@fMB$H#MzgRoB_5*jRg=nl6UCVp z7v(9tC)3Ha7@fP@t9mU90!QJm^+7~>BihW^KlxO%dY5mPyo^)V$KkKt=mZhvMMSR` zm*MX@Toyil800r~y

    jeIy<2|&moyYF1;eJ_a5avH6S9hf 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0003.png b/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0003.png deleted file mode 100644 index 9a2f5a4c390060a23788576688070e177960aed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8803 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 S*-GXCtWTXkS!!|h?tcJdf|Q^D diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0004.png b/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0004.png deleted file mode 100644 index ce3d3f20b7588bcc042a97b77304e37ffd78a02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8380 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0005.png b/applications/Volkov/artifacts/mame-p13/group-delete-rerun/sprinter/0005.png deleted file mode 100644 index 77450554bc38b9a6cc16ed98fd46cd4dfa652710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8636 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0000.png deleted file mode 100644 index 5d69c553fd65ee62558b2f19ffbac1258b7904e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8512 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0001.png deleted file mode 100644 index ad71e67c6cf9d9deabefe97428cc73a7f00b7198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8863 zcmeHtXH-*J+jf+3P#Hyi6bn)mlnx4_w185iDIg+6s!{@iM0yD!j)>?$=mF6{M2K`U z^b!IVqzZx1lt7}=Bq5YQ0;GNsXXcrAt!KUKeb@Wr`!hds)>-H5eeZkU`@XLG+By4) zjg{%1-N$wV0DwK_X2!MvfRGpfuuXdBcEOWZ9>IP9z{#J?jW5|nB5Aqq#S#vTPV1@@ z57J8!HwSLoi2GUYH$2HSHz{V!SnM)*lfCo2?B{n-vqMrbwZ^|0Oc}k!Ind__=c3id zU)3XCXrA46$oQn9${S&+nEfk*!tO9G9LNk;*YKy+fo73T{$zZ%Xo5C`x!?q;0D@XU z{a1CLpLn>>aOaOp?L8nTOEPBpQVAZnPQrdj-FnkP9WJ@v#+gx5b8qG3F2$HqLRf3_ z-jBBW9lY3?EWv(zxb+NKKW5_|gEgZDYl?Ptbp=Mzz3PHydJuJWbwa{>?T9J*tZyt9 zOD086-L++Fz`b@2HXwXng&S<+os>Q10+=+>27}eDV9DG?;8GNR6>s2v7ku~bWZ0N1 z9=JXcx^nXSnA)jc`RC7{pM?vWMU;*8_4QF0IiS1}H#|~X!@PLQw41;*kw_e&Vqjb< zCG76qyQGZ_6vqoR7B6zRbPR-ohNs)?|32>)UvKZ3>nPT644X~n$9f}X@hB^#)>-hx z_;~5DwvG2{_C#y_O|Lp2KSSZ)q5At>Z~Avdun3x~v4mb1zgX_6j7~`zW}fJg7W3CUBe^rhE1v=<)K51n(|Vrjf>n&JW;eTt zcrX3z;Wf885L3V__bo!N07^)zjHQ4jy`^$Sl7-IFgG*l!u8dez5liM&Nzs}(c{x)0 ze4t8ZQ1QHNHp9qms(7Bd7yY8~sHZU6bzBMVr#*K2;ui+_X6vn?D;t-t&bu#_Kx8Z% zoG1#JlA?-6yF|i>+t)V^-Wiy{>L=1V!+AD=+SzCWL$Om5SK5lM3#nvsFAcwL^31m& z5dGi!A|af89--InmKEwXS|kgd%3vStX;t#82*gHb&Rt=V^32BO=@|F>Cqi##ov_Xe zeK#CMntoak7q4h->xVuxz*UhV*koE_h?B!@OQoLY1}n!o>zAwsUC7Lc44o1SP$ej*Cnz2l7bzqmB! znn!+5hTYA3eXqfuJzzd|IYecjNSzHqR4I!w6npbbRHfcK23Ge+|IdfH^P!{UpF+bw zU;n6*SYy*|U_N-*oNn!S(IPi*&WrEm_gd7km@bPDL!N}{&&C!iauGGJYn8hU6=v!k zm8NW7OeatyF5KUm)f*XLU>Mli`lA=&@NY!AN=qi`r1$h-Y?qMUo@Ia>yX>?8II;AwyZ<8azwR}<)Wn;COO6+mMgU-jTcmlo&Z1gY4K`~=Bn_99lCCaS;j0-BlvUGOaU zdB(-okNpA`-@^)j@9?qQF6AkRu$W`QPX)QivBDG?;85R`j6+`Rd57Sb(R#Prr$)M) zbwB)G<}n-DV1sGnu}ZENRk~v9tE+9n+VIn`lTnBrT<;@)gE2aLG5_-aFlNL_Pt zb9Hs_!pEvR?9mG6=g*%bZk0;$=B;5YHP~ivO6*!e8=t!rvQ#G`ix_PlV4%w}J~KLN z^=n*@Aia01SLo2{Zw7J~NXnqMtg2A^y;aV|x%uPR!i|X4XnW-V-D@?YaxF8f?Trzo zn^tZQw9hIJ=Nl#TqXc!JyrQCyI44H=Rai2TRyVeYU246<{`x*~ggRJYN=?9EFnInl zXQfk$&unPJO?)g$w;OM#1OzxQlAYYWIWF+M-F3!IQKxBvIZSZAa)PXZR1&oCdP71r zs*D61yRC+Vnn$t+m}2<7f;DGQ$K0We5kYN%EH)KIL%y~@iDHkGIn0R{S)=m6$F+mK zAQ1M($`s>Wgz{K!1SyKS@afbJU{xU@Im$_qyjNGv3ROlvWJ`K9mxF}(yoIHWeQM&_ zYg;r6D^csAc32qUyg4^Q#nvyqWR&_cN#n~ogm2MXY`o!Sx`hZ}@pGHVj(vx>aQVD* z8Js}Sf(z+3K=hz1tMPtjZ_!bEx{bco9uyVZEv>r67xwL61AH3zlfDpVo%&lXNph50 z|6CQ8&9#9!O+C>|L)GH14Y#$w$Hwb;j1H%<((G>T;m*hNYGry4h1JXFs@O|6$EV+x zydb(?qh_n=jxFX0AM$&0Of;uj*^Zr>6WzN+t1L`C-Bw&}b6XN98nl|>5`ZHLNajyp z%hK2f?-UJg{3K6(MPkn_3NY|j>n=FS>-l|)5d#xEO1bN|K8vYcRp*3vW()b6_u5h zCGHx?FC;ME@Bjs?X*VDb`-|-LPCv1t&lhB{SWmo!{}^zSF9XKs0oB?#^o2e?X8FHi z0$+~nrllIr4!0b!Mo_5HqXk6$#p%u#R&((D>;7IW|OlMy5 zHaZPrXO!HXf~SWB_8;-qbM6#;pqQWUe{d1=1oo=bA z^a2IYS!RNxyx5)3HB!*4v-OsPRy)6^;Qt(`cvu&)0Zd+k@!2y!>kEQ@=Ofr8D=2dX z&OITP9&amo(dt0{J2L%yG*$xhE8W|8lrl_UU?3?34;&%>OU~*85#xr_A!|WdYcW$@ zX)*$x*O?*(mg3c*xC;UTaKAk~WT9ALHg`Cb>x>OV6kd+)QabeB&|Knl(mlEd<&UJu zk11<4@!RhY{!#5e@BO~;TZQbdWD`vHcFeIs-%OIB z@`Cj#i4JWQNBR4Wf)d05KUzJ7uy3b}W-q9g*0k~45WkW_S+WW5!+hs`1dY0WXax9l z+{^b)^7CqaC-(7FG8-bpzhm-Gpz*d<-tu2?pFr>|67e9R)c0RwyE0;>7so1%br1b9 zlDxaEpXRIR-6LA;=`o=-nV#$N39%A?VMgipW_4bzaT8ZX$nfAxM|p#lh5PZ_AB%{U z>Io)m#2;0yleex3#ZOZze-00(>fc4uXx-mo`NN0p_jSLA{rlweYl+|+5fEZKacVL) zU|l<896pEGZr0(6lumk_9_0`gbnwaAex$E3z~KAbY{n%UQlmkB5Z)*$?-!5Oh@$7} zkvJo)fik=yJFlhJ$Ten%4D=_t@ohikO=f+NOcgnJJYkrK=H=3uH4)(%U%Q_jRDLiK zeN{X^F|sh_v#~BWl0g?oY6*V*(*wPd( z`LboidYcHk=9_Io_f!DbS}f(igvJki1Yl#z*=bcPbYJRERV4J+q6ygk-)Zo-B@n31 zzvZ7mNNsgl5~IA6;w{Ha8A-8H(R_ixA>m_YHKe%TOe1dUZ+2Vj)4OCucJ-GO68^9y zKoO6Dfk8hDNfn>3Zy0(5W!9i@v0T!Eg7E}p>_#uYwPbY;?*JD`8A<$m*FaLs zW}Fn~#rRX_;y7W^z<_|`TK7C!*9T3dT;1KtQC*=^9dIa{c|$y6BB=AaHSosWmW{88 zf{F;LTN%N`hNW*5rP|#D+!OxJ6N1v(6f)PJ2V_67j=3F}uj<-tms408)EeRMPp!l* zMlUwa&4MwmSbH1^vV=oYc|3zi95LDD`4u$a{M`N|2ZL<$tI+g`o5#8ykVW-xe++HM%covp-6jxm;t|M=_Re1!Kzcm}af>J1I~jo9%n!}Gj_ z$BL9K-|I<&C_&QZ4ywDM$_p7T_39kux@07&oUv>__x@(FYb=-Ph-z}OP(9GweCMZ8 z?aY}LR>`fsB&iXVsUf+Rd!0 zDv9SNtYPD+D7Nms4t5d-IT&k+i6pdU3qcj?^SM zZOvh4i$@UUik#oIbp0o_BkczvNo@l`fjc)p90QHo26ImNX0Fbj)@WWkNhv8_sw=nl z9{Ch!d;(Ek*}A>3Ul)9MI4|ke;K~uB>W5?c@i^d7BTum`PAJo~z@M3w>DtX99=-tq zD)|$S#Efo;NX$J-wT2$IOw{Kc@N)m9BmeT_Zk+O1eCD2B&69OwD@)IjJ_N3vFbiINF>U%O>*VnR zu%nc6Y;|#Fl4i0+eMIsr4gIOCHSvjOHj2M00k2Z4*XI&E!;d| zxaj=y!QzDRsJt+Rh*WV(SY~-6w~&zT#?!LElMG96sM(^eQaYs$Enm_tCa5jo;7j?!$h>KY+4LwhDrwWRD6z`7SarA}Y25;zf zdr-i{I8dD>=o(#`5zy&_JWMI-|7sz@f)9NPTp)YyriJ%Pd%|VYer>VzBF#Y#b}A_8+@v)%waP4@i3X-Mn`q zD69~R9@%_)mjA8#pyQpvbqY76^Jqj2bow$sx>6^h2ma>B+(P*L%KFo6{oMY|@l_1! zy?%jYR7QuCx0~mP;cs&5E*AXhr&%qhIx+Z{rm%(Z2hUr3df zZ5-m1)KgSA4-Tp_eo8DFG`O(Ybapsn0IS->kZ@Fc7>@Yv--xRZ1PWdXqJT3rt|kv@ z+d&;5M%tLr-F|L_6WvGWxr|MVDdNpwRouhy#LHK75k8ey!{yR^q0h^0V!VRzv6+tja<_Y{Fn23t_7$3_xvInTfX1M10LC3 zmvAF%+$u4&>w#FP`mUbBahj*ASidPF6d07Ie82AIfsR*%^Hml~`j~PVh zMx>qFZnk$sP14U1GVQc!oOaG@e?tRNMrmqY#N)FLX13a! zf|LCRr>S!m17No)pH_DsJZydfjc;)O&=Hh*WZdMqQva76urTJzo2RJ$RiCR-W;|lu zH{^o@n~q%C%9v1nI|`eNwK@j6vUg-}VIxxa-}rc3BxNGC$7gfT^x5j;~hV|(2AX2YRK11S8w@CU%waZ7btikxKTfI=FC`PpQWH5z}&>jxYE$$!T$q|DCp7v diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0002.png deleted file mode 100644 index 8425c0ca06e8e028175fae0ab4c5bc70cb036a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9873 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0003.png deleted file mode 100644 index 52506177deda50e6c69fc931b9c6badc92c14131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8797 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 Df7Y@! diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0004.png deleted file mode 100644 index 7e3cf6954bc7d63236531170dffbc98aaca75d6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8381 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 Q(L8{Oq4~vPedoLX0f#x(0{{R3 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0005.png deleted file mode 100644 index a83a2ad1fc4affa42d33f7a3a54cc1851dfc926d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9468 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 z z$ocoRw#(c@>`S5O`jP|62mGk1C|Rl_Jmu02n6^GWjOL=3h zb?u^=Qm1`pE-Su2W!tXSysiY6(YtaTo>c|zoP0~Xe0a>dVKz1OVOK$z+s`|wh+8{r zeZAFAJ$&w@Bi^T<${7s9sIQ8fTpVE{{QTB~qEyRaRH1QCNf+Zshpzb~I!DEr!pAGjW5eZZl$nFcC~*n$ zEUe?PQoz2`39dL-OjoeNHSS5=%ILl&jvUm5)PS>1>B*# z0(Z{^YxgPC+?CEZ+EWcDQtC|ZbW1bSEg{A&DGz9j4@W}Ul^7^#pCWtx=Jk|C4z*&k zIT7Pq+47rECcg~S1b)BVoE>J=bwdW~YF?slMO04!OPSa)IqqT(IaXfF^ZnbCTH{2z zo?S9QXHaXHrV}X?xODb0gV8TS1-CQ8<|@l@Vb@%49VQ@bhPvNl48;b+PMP*itJ=ED zWl9Z9OL0AAT%VjaXrJ<&GcQD>n*bY7oZz0?=lcLsLk15FEE?V0^Hlc5odL9|bof9= zUh83OPB+85@K#eHj^nM_@9#)SF38N~X{YumB?*dtIQqP|#i^ds1}&Kx{1`AS@pK*@ zk>f5KWRP;^nnv6ZVm3=2EF&-Tm^M5$Y02rfRXiY%j91V@^}-xHeH%|+Q8D5_8_^|tpP}3cBTP@t=g$#T(G#I1amiOjR{pkb1U#7hX zYbehWDON0AEq-?ZMu1Vp{Lm4i?}=Z#w|!L&;2EVRbr-DTl`0Mf6`Ri3Cy_07tv^~n zAKzf2;#27}xL@Dr8JDp)_uXyJovOA*g}ot5i84jLVX-=~w4+rPWU5AnLoYXucSUuUUmBk9iUM-?-fKTM;rqK{l@!7k^a+V{J)$ z^OarVQxX+!r!2Di^7B}Sm1YMNcH(VGuE=5Py%b$@`iFKoCYx*pNoO7odf#P1zZQ>x zC12kiuH7D_lw?|Lad}8WWo2NvBNTT=ulU&%=ax{C6RfcWlb_H}RgAb*X+PfUvhM*> zr}s-;N&0*`BsN2&k81e~l9UhU&MvNgFh9j>Ew(!rCuuDX$z%_R78!qaNE=`=pNZ%x zt5 zbn$SfLT!f6Np==FdiiC%KiLYYUReAp5yeQ}o#x_j>-p}Ku;lcJ(kp^)4-?mo(bN@X zsigu=Po%iEPB0<}t~V1NqvSjLY;hcN=4M6VTzdBaoBn>LHZr*(_!#mN?X9nSd7r(>28>`5L<&(n0Qt8!eE@f&nYkUmo znUb{Pl?$^sxy^#7x0~2)ANB9>Oewj{G{VPKVQ(8-2=~oEXusW$M|2UN|1k|irCKPs z_J*2*73nmw29%KN;~eUcRQ`jJMDlF18{7nqIm+)~S{x^rl1e()`eJflP+WVIpJumE zMoe-iAEV5nsw*h}Q3+q5SrZB)YZ|*vrp!0f4ujQ%)7c~2KIYMCT(v&Kw(lfMp(Ao` zpVUYr13+l^s;Q*>hUm9QPsr{NGWLl}W)3v$Nb=0Wtt1aH#{vhmyMd$Q}e>VcA*^h z<#f=Hx6>=CHppfpOJ%D@bSo3#!vVe8)k1;r{_^zs)F>B6nBX*hR=DyySmv(VftdT1 zQB#@C3Z|-4_?0?K)43#`n-VPT$pzis&lB$h4{E41BQG_e>}_$!yfKB{o82xZWnLKGYM6~rs#8%m)`03+SrQG zMIEwFqIE=*@6BYsIOCLYVSc`bk*p*dbnr~tL5Yvyt4#Y?olu>iYz8z`Dwo#xftarx zE}xpj8+nbI)BOFsH(EsS&gHzzpJ{apH|awk@Gl)ZwF>7 zew!H<5a{XyvTzM_^$$2|;T;s9c+@!fs_)TDSG|r}`}uqN0t3JgHC0vB{@4yv;69MC Mf!T#pJ?C5h2h&V8rvLx| diff --git a/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p13/group-delete-run/sprinter/0006.png deleted file mode 100644 index da562690ad1bf9b1689aac046cf3232c0d8f0d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7737 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 S*-GXCtWTXkS!!|h?tcJdf|Q^D diff --git a/applications/Volkov/artifacts/mame-p13/group-delete/clean-dss-return.png b/applications/Volkov/artifacts/mame-p13/group-delete/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p13/group-delete/directory-only-refused.png b/applications/Volkov/artifacts/mame-p13/group-delete/directory-only-refused.png deleted file mode 100644 index 77450554bc38b9a6cc16ed98fd46cd4dfa652710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8636 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete/group-confirm.png b/applications/Volkov/artifacts/mame-p13/group-delete/group-confirm.png deleted file mode 100644 index 12501dee1138a2284d087bfe1e060d9379b837ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9876 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 diff --git a/applications/Volkov/artifacts/mame-p13/group-delete/selected-files-and-dirs.png b/applications/Volkov/artifacts/mame-p13/group-delete/selected-files-and-dirs.png deleted file mode 100644 index 865a6cf2f4076ab2d2430ca6aa91150e8e7146d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8869 zcmeHNXH-*Zw~pf|Dx;_$VnG88A{`W@6HpLo3J6G*qJZ>7dI=rLO0N5!30PK+7^PTX{Gw<*~0N}@cmX|I%#un0xyedvPGka|7 zW$tA?N4R}(vy%+8K4kJE%hIfZIb*fg_;ubM?bBc0CR!YkN@%+DPva@mH(2MDIsEx} zb>g!Y#1pM^JC0oXQAzc+h*ZL%CnlYQCIis;1)3w%&8IV zwFSRlw&lbx^rWBSygAx&mSU8!afivCQHQt1dw6(&;#Pc{!)E#r&CSg_MGiQUGK|>s zY&Kgq!%)KmvpwMf$5uOkTyc#jeB-T@Q=JZkJkbeS<(?M8x!E?H{*b0k0x+96amZ+F^fam6zZOX zOc06BPjqf{sXLKujW&IoL4s_>f4SD9dU z8=`)U-QK=)n;#NN`PBjCsAWJUS&hjEVHh&1nW%wnLid)Cckt-V)uP%5oDxtF0 zt*%tX9H5wz>0Z$&(s%0{;z1uK&_*fro@l-uST7G{Y$73d>Plz1!%o#4-o?>ZZ9XMd zcvA42fI=wupm*f8(5f=SmsaUJ<+3^AeI3eyHDGjn&fFC?x!7WSVWrONu1us`u8eJQ zdr=f>lxRoUgz)@RgWL#mZ@fMB$H#MzgRoB_5*jRg=nl6UCVp z7v(9tC)3Ha7@fP@t9mU90!QJm^+7~>BihW^KlxO%dY5mPyo^)V$KkKt=mZhvMMSR` zm*MX@Toyil800r~y

    jeIy<2|&moyYF1;eJ_a5avH6S9hf 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 diff --git a/applications/Volkov/artifacts/mame-p14/default-colors-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p14/default-colors-run/sprinter/0001.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 CdQd(PP>+QJOH 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 diff --git a/applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0000.png deleted file mode 100644 index dcb026f9ead9a49d3fc85ce89d4b7d9b6b97476b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7748 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 Oq9%ss232~lxBdqjHiS|D diff --git a/applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p15/tree-cancel-run/sprinter/0002.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ zA|O&CB?M_viQq(vB$5D;AYcdyB?)Qw#VOycZ>_t&dwYuT7ON`)I|a;lYVX%R?UZBd!&W)m~T~3XjvLtNU{NS7RE&fZ}`ZoQXuZ=odeA zPt1U<#raUhMaIb3IFE%8^QY@a_u*0s zz#yB2pr;$>(oAE%IIpY%4!HVfzb#F>;QsvT8n8Z1)M%cqbm}0})67CJO>9cOwSAJy1HpNuws_B_9+-3{a?6$>8mSzK z?(}i}?a!{<)*S+!iezH9cwtA8uJN$w*d}hN-Cuy+IYIj89dVKH? zcuLlih0-E7ZX4St<7?Hi0+?6s1>~Z9SUzlkViGicsZ?llq&h}AN1_|zf=Mmc2)!(k zpRc*H?Nn&sZE!C22h>5%czz}X^Arq)oN98OV0nDrbp37ggBAHqfnGspu`?T=v$tCW zgXPm4Z=hM*v~%!w<=@F?i|zYwH|@3*hL>KYE-%r-xM+p9eq|)9MiRJ6THK6_MUDG? znG?TK_Iz)}@8HJi|7OKcbMyRiR*>UO)wH;=;rfDn)2|9|*R|t!ru{xubB3S4YPWSi z$V6tSddIM-OLUmo7z?5=E(8dQYJeCJ=* zfOVc5sm0GcF4Sq~O_Id>!rSzacjszaYd+X(qMgYdl35#(q^e`KBUP}7EfYQQiGYgA zNruB(jq`it*xNrn2VGSrdp-G3;lvuPpYBfG>FVm*Ba)Gk$y5s^H_VLqp>SUwrky@! zR=nLoz`bq;KFHV(J{O5#yY`$cV@}$xnIz5j&$dp`Lq>`MJ!}vgjlW7iNLf*seP0TY z)6=t6)I=68G$0`%fjd7o+G{Xio{b9|eW9M1G=5F`#Yp--mA^nNh+vi_%HqWg<2wbsk-tlXJn(b#>2Q%TRC-OXvjIUG(5?gg< zeotAD=aWaa=%Cu@=x9DVUdG76!otX?F-fozDj*gZEG{md?{X9Jm{^*)OAg$&LJk2- zgwfQ*Ge0Jingr1eE8|ne<#B0(a(bdf?fijC)gBSag)pd&P*}41BZ27(un&*VNXsb` zj|T+>aYXSlaMAJzN+RNV_{Ik|CGi#}zQQR@mwV6y{rwEd1Ruwx3YI=Nq2uP0fECf? z=7o28(n(|No?=q0IN%Ccb)f{$jI55djSv zFkYD-D+~`EYk@~bMiMfVdeFL9@9CoGez8bEFq|n-%ZX)UW)GQ9r9En(D|NJIGxWBBUTqbu`%;R#p*pkOfg->tO68`a$8UEkkyv=-~Bree3SE56kwv&W#h4!4?Vm6yvZ1e zWIvjJCAUu(kJ#wyy6;cJfU9E5q=bPI3k}Dj{QLKh%=?`?cZ<(MgT?tt!s0k;K}m`7 zyN$a}AJLYAUn-Sq1xk%CIZgco(69U?t(~oLtp4LA@r;76@V;E_(YXzB=67*npI%0W zh1D$4?%@UVt)p|ZLsc}SfLS+ytNkxW^izD{RjY| zz*^gk{pah0-d)=ueH$d1%JX}nGg}zm9?zRdA($_URqrWWHEnRd>hm8#2<)2{QYhlm z{BQ}tYu`@4_;r8{;_lSX8@oW)Jvk-w-N*7ZeEena8~y!Z`|mPS zTV7(&^*_?HN4t4S&Azu<7yCQQ|KF9N;iWY#vriH9+gdfZPKej|k)B~zgIgg_SzxIN zb3lJ*p7lmE{m=CR`T)|feLAg2Dd)UHOFjWGj^})SLja+KYrSAyfNj&XMEv&Eb?N$I zHB43RUw{PYda%+}7q{fnl!(hAjHC}aJ=YvNPSH+<9b%Y0H`UJCHGVG=v;e}fCB;;cJb@-&3$1X8$(9oXi0gO{eWHHtE`AOivVgqU*+sU#3C!PjN;sKJbPhab;b#xe#$}72R z9jzb|pa(vB8rTjZkyrsZok#&uqX#TTOMtbT%{|NjflDMNihr{x|DRC|?Dlc%3Rb~v z>YsW4@9++2+9i~c);p&t{P6tu{^lR~pFI47fqyXY4+j3h!2dT4JfO#n1()n^PDuYEhO1L|5OM|TRWb9KyvBwyU2QNuJ` zW)q<5ipLL?@9TQ@#{uLF&cIzLx?{WGKUHtUDA?ERz!cv;DpFM3bA-`0;rb~0QCKNY z+{63Qj<|lMRNaXR_OvTqIE5nR!mb*{G1|@e1Tqwg>#Nktp`cLi9j03h) z0)a;s9-lhb#f>AKl9@W{V>D9ATKFvVu}#pw$tBcg#r*VH&E&=5OgZ-J=9A!de2-ST zMEtl$j^_8wnpjcjb>SkWndFizY4S+$9##e!Aep}!i;K_hJt%Y++PvD|jxP_H7Npgw zFg^$@HcEADRPC)lc#x6bVS5`h3zKlX(xdkbAj<5&Kjbd56N-h}P_SaOYIv6Vgym*= zy~f9S)At;;x86&jzGmB+_Gdkh=^|<@gniDr)nvyly!mEZBJ^1psoGgoS0#dMm#dw9 z^{CKk+?({t0Tf;oyF54{`X#io`en?3p|YQa3M1nOInrc%IvCozW{q><+C6k7gvhp+ zv2hE`PejTqZkzkvUW>NrCz?rlMD;XO^or9e#IM|6IXjKaXjj7K2|l16?#pA3D>r%Ykd1BIt5` zIuDvgz$)Z@%V+yL#vAi;V|+k1*Cpc^4y;Iyqh6o zlNnFL2sCUZx84vrs~%(INF)S&k3OGLrkQ@g-l&@T{my&6-z-+yAGu5#d(T8d_1SsH zO8C|_PVithfz0j_yvg4gzj#!A7-t$qH0-Q+B1^r3NOOhc9WRL_`*^^E{fl~k>n-Rw zm}XYBuP30_*yqgV5iAV=!3_6%Rp2}CA%i3d-|42~%LWpf8J05)(%ouAVlyAtJ$4{5 z&0Pt<;Vt7~9?&hzjV~;dP3$~S8QE0QIr1brpt;iOXZ@{>buTP^-WkA)eg@Gl_o8C8 zxN-+9NmH1qvb^q`Sm;!J;|hIf!_!mt6}J@e3D_RAUt$E0lU<|r92_K`aMgI{XIi;b z6GJL*IeVtqiDbU7LLN1n&+p!kF&v1U+h!01FCqt!t4|TtH^#aTXk9k;4QSENFIx)~2pgL`DHx0mfb6%4hgZvaifIKo%2IZF; zPV?AZi(An9^D7Mby>!5SflsapygZ_}HG8B5eBkeiCCB9*@RsH9GJpX)5I7N7g%m-rL&`L*J5^u}J@Giv5Y zV*bRgTVQ0qp6kHAX3L>s7igKQ?Qr=R`E-97+qEyzWu#&;UKW4IelZ+tfE4EQQ=ICG zX4iEQ!3@uvqZwec16{#CKGX0flR;^it^3^*^SUurvBHj$*PF$2}DbB2O3FT zFtwXbFGA6I_9Of92V4S`vKZM7vgvaQd%yr!AXGJ)4ZVF}DOtJ3$cUNh;kkl@pY`&J zOeL@0c5gZR>HOFx@2D$`h1lV!VQF5ggI^dl=K9Av%XcC7Tf`H6`#GFc{?S87n>5=d!Qhv6H@#qJ z(u5i*O#H}qDAr^92@L7N5cpq8?&Oz&mv za47%D)G|ovVok{FHw3vICP&-)%dzX>p;#W%(q$}H0hMnbdqul3)!Su;1Vg8`eO7?~ z39GkwE@vQjAxgIp$X?bmrG4mw?HXT61Rq;hOEg=;sm>+pF}QFgE9y$54(cq@lF z41S^07=EJ`J65Dd*i0<-?5<&)5We-$0KH6py$nz&NnNg9Jmfj(Yvs@IQ3AdtOeO~~ z*1ThK`ahbu!8@y2*<}SO)2Frs=NFnFlgV)*!K8VGJNVlqy*{u5CcT*&*^jE@3~s88 z=Czn=o}@SLg}i?$n?9r{S@qCRNmtX3(ntf}=F6QB-}T6h`Nc*1Y4DogK-qdR8Chm($Bnb_ytC@z=bL%|OoK zih4J|@VG8-i12e4WF$dkrfcnjdpZYl&0BD}6D)#&px)DEu#8LM#t`b2pMA8K7qnE) z=rUR+YmH|dDAlNCUd;*wLN@6?HbJ=J)GEi=oQrV{4~mJq z5EUqO=HwY0m18>kCdMjV!Z diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0001.png deleted file mode 100644 index b0129448b0ce26dc35e42776db4469360020a75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7668 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 diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0002.png deleted file mode 100644 index edead950b24f6b6623cc5536fd9b0682a46c0f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7819 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 Q_~a?%d9qJ9Ez;_sl(OCNr76*SFU9 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 diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p15/tree-copy-run/sprinter/0004.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ zA|O&CB?M_viQq(vB$5D;AYcdyB?)Qw#VOycZ>_t&dwYuT7ON`)I|a;lYVX%R?UZBd!&W)m~T~3XjvLtNU{NS7RE&fZ}`ZoQXuZ=odeA zPt1U<#raUhMaIb3IFE%8^QY@a_u*0s zz#yB2pr;$>(oAE%IIpY%4!HVfzb#F>;QsvT8n8Z1)M%cqbm}0})67CJO>9cOwSAJy1HpNuws_B_9+-3{a?6$>8mSzK z?(}i}?a!{<)*S+!iezH9cwtA8uJN$w*d}hN-Cuy+IYIj89dVKH? zcuLlih0-E7ZX4St<7?Hi0+?6s1>~Z9SUzlkViGicsZ?llq&h}AN1_|zf=Mmc2)!(k zpRc*H?Nn&sZE!C22h>5%czz}X^Arq)oN98OV0nDrbp37ggBAHqfnGspu`?T=v$tCW zgXPm4Z=hM*v~%!w<=@F?i|zYwH|@3*hL>KYE-%r-xM+p9eq|)9MiRJ6THK6_MUDG? znG?TK_Iz)}@8HJi|7OKcbMyRiR*>UO)wH;=;rfDn)2|9|*R|t!ru{xubB3S4YPWSi z$V6tSddIM-OLUmo7z?5=E(8dQYJeCJ=* zfOVc5sm0GcF4Sq~O_Id>!rSzacjszaYd+X(qMgYdl35#(q^e`KBUP}7EfYQQiGYgA zNruB(jq`it*xNrn2VGSrdp-G3;lvuPpYBfG>FVm*Ba)Gk$y5s^H_VLqp>SUwrky@! zR=nLoz`bq;KFHV(J{O5#yY`$cV@}$xnIz5j&$dp`Lq>`MJ!}vgjlW7iNLf*seP0TY z)6=t6)I=68G$0`%fjd7o+G{Xio{b9|eW9M1G=5F`#Yp--mA^nNh+vi_%HqWg<2wbsk-tlXJn(b#>2Q%TRC-OXvjIUG(5?gg< zeotAD=aWaa=%Cu@=x9DVUdG76!otX?F-fozDj*gZEG{md?{X9Jm{^*)OAg$&LJk2- zgwfQ*Ge0Jingr1eE8|ne<#B0(a(bdf?fijC)gBSag)pd&P*}41BZ27(un&*VNXsb` zj|T+>aYXSlaMAJzN+RNV_{Ik|CGi#}zQQR@mwV6y{rwEd1Ruwx3YI=Nq2uP0fECf? z=7o28(n(|No?=q0IN%Ccb)f{$jI55djSv zFkYD-D+~`EYk@~bMiMfVdeFL9@9CoGez8bEFq|n-%ZX)UW)GQ9r9En(D|NJIGxWBBUTqbu`%;R#p*pkOfg->tO68`a$8UEkkyv=-~Bree3SE56kwv&W#h4!4?Vm6yvZ1e zWIvjJCAUu(kJ#wyy6;cJfU9E5q=bPI3k}Dj{QLKh%=?`?cZ<(MgT?tt!s0k;K}m`7 zyN$a}AJLYAUn-Sq1xk%CIZgco(69U?t(~oLtp4LA@r;76@V;E_(YXzB=67*npI%0W zh1D$4?%@UVt)p|ZLsc}SfLS+ytNkxW^izD{RjY| zz*^gk{pah0-d)=ueH$d1%JX}nGg}zm9?zRdA($_URqrWWHEnRd>hm8#2<)2{QYhlm z{BQ}tYu`@4_;r8{;_lSX8@oW)Jvk-w-N*7ZeEena8~y!Z`|mPS zTV7(&^*_?HN4t4S&Azu<7yCQQ|KF9N;iWY#vriH9+gdfZPKej|k)B~zgIgg_SzxIN zb3lJ*p7lmE{m=CR`T)|feLAg2Dd)UHOFjWGj^})SLja+KYrSAyfNj&XMEv&Eb?N$I zHB43RUw{PYda%+}7q{fnl!(hAjHC}aJ=YvNPSH+<9b%Y0H`UJCHGVG=v;e}fCB;;cJb@-&3$1X8$(9oXi0gO{eWHHtE`AOivVgqU*+sU#3C!PjN;sKJbPhab;b#xe#$}72R z9jzb|pa(vB8rTjZkyrsZok#&uqX#TTOMtbT%{|NjflDMNihr{x|DRC|?Dlc%3Rb~v z>YsW4@9++2+9i~c);p&t{P6tu{^lR~pFI47fqyXY4+j3h!2dT4JfO#n1()n^PDuYEhO1L|5OM|TRWb9KyvBwyU2QNuJ` zW)q<5ipLL?@9TQ@#{uLF&cIzLx?{WGKUHtUDA?ERz!cv;DpFM3bA-`0;rb~0QCKNY z+{63Qj<|lMRNaXR_OvTqIE5nR!mb*{G1|@e1Tqwg>#Nktp`cLi9j03h) z0)a;s9-lhb#f>AKl9@W{V>D9ATKFvVu}#pw$tBcg#r*VH&E&=5OgZ-J=9A!de2-ST zMEtl$j^_8wnpjcjb>SkWndFizY4S+$9##e!Aep}!i;K_hJt%Y++PvD|jxP_H7Npgw zFg^$@HcEADRPC)lc#x6bVS5`h3zKlX(xdkbAj<5&Kjbd56N-h}P_SaOYIv6Vgym*= zy~f9S)At;;x86&jzGmB+_Gdkh=^|<@gniDr)nvyly!mEZBJ^1psoGgoS0#dMm#dw9 z^{CKk+?({t0Tf;oyF54{`X#io`en?3p|YQa3M1nOInrc%IvCozW{q><+C6k7gvhp+ zv2hE`PejTqZkzkvUW>NrCz?rlMD;XO^or9e#IM|6IXjKaXjj7K2|l16?#pA3D>r%Ykd1BIt5` zIuDvgz$)Z@%V+yL#vAi;V|+k1*Cpc^4y;Iyqh6o zlNnFL2sCUZx84vrs~%(INF)S&k3OGLrkQ@g-l&@T{my&6-z-+yAGu5#d(T8d_1SsH zO8C|_PVithfz0j_yvg4gzj#!A7-t$qH0-Q+B1^r3NOOhc9WRL_`*^^E{fl~k>n-Rw zm}XYBuP30_*yqgV5iAV=!3_6%Rp2}CA%i3d-|42~%LWpf8J05)(%ouAVlyAtJ$4{5 z&0Pt<;Vt7~9?&hzjV~;dP3$~S8QE0QIr1brpt;iOXZ@{>buTP^-WkA)eg@Gl_o8C8 zxN-+9NmH1qvb^q`Sm;!J;|hIf!_!mt6}J@e3D_RAUt$E0lU<|r92_K`aMgI{XIi;b z6GJL*IeVtqiDbU7LLN1n&+p!kF&v1U+h!01FCqt!t4|TtH^#aTXk9k;4QSENFIx)~2pgL`DHx0mfb6%4hgZvaifIKo%2IZF; zPV?AZi(An9^D7Mby>!5SflsapygZ_}HG8B5eBkeiCCB9*@RsH9GJpX)5I7N7g%m-rL&`L*J5^u}J@Giv5Y zV*bRgTVQ0qp6kHAX3L>s7igKQ?Qr=R`E-97+qEyzWu#&;UKW4IelZ+tfE4EQQ=ICG zX4iEQ!3@uvqZwec16{#CKGX0flR;^it^3^*^SUurvBHj$*PF$2}DbB2O3FT zFtwXbFGA6I_9Of92V4S`vKZM7vgvaQd%yr!AXGJ)4ZVF}DOtJ3$cUNh;kkl@pY`&J zOeL@0c5gZR>HOFx@2D$`h1lV!VQF5ggI^dl=K9Av%XcC7Tf`H6`#GFc{?S87n>5=d!Qhv6H@#qJ z(u5i*O#H}qDAr^92@L7N5cpq8?&Oz&mv za47%D)G|ovVok{FHw3vICP&-)%dzX>p;#W%(q$}H0hMnbdqul3)!Su;1Vg8`eO7?~ z39GkwE@vQjAxgIp$X?bmrG4mw?HXT61Rq;hOEg=;sm>+pF}QFgE9y$54(cq@lF z41S^07=EJ`J65Dd*i0<-?5<&)5We-$0KH6py$nz&NnNg9Jmfj(Yvs@IQ3AdtOeO~~ z*1ThK`ahbu!8@y2*<}SO)2Frs=NFnFlgV)*!K8VGJNVlqy*{u5CcT*&*^jE@3~s88 z=Czn=o}@SLg}i?$n?9r{S@qCRNmtX3(ntf}=F6QB-}T6h`Nc*1Y4DogK-qdR8Chm($Bnb_ytC@z=bL%|OoK zih4J|@VG8-i12e4WF$dkrfcnjdpZYl&0BD}6D)#&px)DEu#8LM#t`b2pMA8K7qnE) z=rUR+YmH|dDAlNCUd;*wLN@6?HbJ=J)GEi=oQrV{4~mJq z5EUqO=HwY0m18>kCdMjV!Z diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy/cancel-clean.png b/applications/Volkov/artifacts/mame-p15/tree-copy/cancel-clean.png deleted file mode 100644 index dc0d6c62b6d009e8db1fc7c21c36bf7e18f0df29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7751 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 Oq9%ss232~lxBdqjHiS|D diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy/clean-dss-return.png b/applications/Volkov/artifacts/mame-p15/tree-copy/clean-dss-return.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ?%d9qJ9Ez;_sl(OCNr76*SFU9 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 diff --git a/applications/Volkov/artifacts/mame-p15/tree-copy/repeat-existing-target.png b/applications/Volkov/artifacts/mame-p15/tree-copy/repeat-existing-target.png deleted file mode 100644 index edead950b24f6b6623cc5536fd9b0682a46c0f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7819 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 diff --git a/applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0000.png deleted file mode 100644 index edd4c1a312feaedc03798624632dd17fa5b74ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7857 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 aa>LNTz<`!QwwL!)u(fi$&|q=($NvH|L_T)_ diff --git a/applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p15/tree-self-run/sprinter/0001.png deleted file mode 100644 index f2497af639aeba14f6423f31694a16d295ab98d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7802 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 CdQW|4Lug79LQ#5v5LQH9SAmtPw1@(shZc}P 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 diff --git a/applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p16/group-tree-run/sprinter/0003.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p16/group-tree/clean-dss-return.png b/applications/Volkov/artifacts/mame-p16/group-tree/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p16/group-tree/copied.png b/applications/Volkov/artifacts/mame-p16/group-tree/copied.png deleted file mode 100644 index 3d805e9475d78f829e1f719e7765513776db8351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8782 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 diff --git a/applications/Volkov/artifacts/mame-p16/group-tree/selected-roots.png b/applications/Volkov/artifacts/mame-p16/group-tree/selected-roots.png deleted file mode 100644 index eec5d44fef43bed966759de6cc73de17aa4d5c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8607 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 CdQ2?#+T^dvU)ph5sCN{dJh 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 diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png b/applications/Volkov/artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png deleted file mode 100644 index 1991252dc0260c5ef6f8c28d9739cab8814938e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8090 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 GoBshmu44=U diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/before.png b/applications/Volkov/artifacts/mame-p17/tree-delete/before.png deleted file mode 100644 index 33a943e38e5581be19088bb301b176bd813aba60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8608 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 K;~K-8zx_8oax=RC diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/cancel-preserves.png b/applications/Volkov/artifacts/mame-p17/tree-delete/cancel-preserves.png deleted file mode 100644 index 20a457e2af6833c2de7ed69fb69c7abec3b4d55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8870 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 diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/clean-dss-return.png b/applications/Volkov/artifacts/mame-p17/tree-delete/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/deleted-keep-preserved.png b/applications/Volkov/artifacts/mame-p17/tree-delete/deleted-keep-preserved.png deleted file mode 100644 index 31f72e7595ef925505606beaa43b20f5bc535d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8034 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 diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/group-confirm.png b/applications/Volkov/artifacts/mame-p17/tree-delete/group-confirm.png deleted file mode 100644 index f852fc99b739b44ee24439648ec38fb17c4ee599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9877 zcmeHtc{J4j+xHZuQnX0f6|!W>_N6RSS{PHvzGNv$Oi>uSnIid7ne53j4JHjS5hm-T zLWl{25TnQ#48|D4jG1{xeSg1i-*fJBe)oNz=RD7IpL74?jQ8igUf1h-U9ao?`6Sv{ zneW;mxdQ+I>;hSwu>}AG!~uX!^4m7^Tb_Fb`2he*EYO)#_TjnIJnI+kPK-9sibJuf zB^j=tU2UZNz{bvrVX*AyzP(CaoW5^jL^*|8hyw`)n5G0WKvXMmYOz3Q4&%b64L#V+71B0IO zvP1WFn{E5`N3T{k1}q9(f2B9YWiNR8So~}sgDy?BBYEp&C#(l&0N14S=s0wSsCN42 zsE(87$m)a>n7WB01j=;GG*~jY8)>B<^#V7_Nr+cIOV^0zLa->$EmPz6tw_ zH=^r+*2dt+0{R-n+F)|Y-~yb-?w_TO;F$BHZu&5K4yj?*eIb(8a-ei2C#0l`p$ixF>fUxMH zh#wspC3HHH7u^qIQHo1fmXPOvGuB^byZ2a%gOvFB|FYa=)K7D!#>fBDs{98ZQ8lT~ z>I43B6O4$b-m!Vjv`%ZgiMwX2OrCzggjnEBg)b5finmUGjC0eSr3(UC3&wQ$(JcsE_fQqZV^y=JeelOw8Q^FQgc){Ok8%% z_HQDBn0Y?NfQLIeJlY)=Xc>|XivFmgP>5R7_prmM@&2KfH`}2utc>HcxJ=9x*u5ma zQdHoWEzh*-h93NANt7#4UZ0JoHFL-7AbF%0MNs9fKG?|;Cfk(if#&7q5i_S;zM+JK z-c;MPZjA5soUAT?il4XHk(8q?V#7jPqmOGqE(mmZ@Gw8#J=g!HMNFr4rJO2Fzls{T zf;Xekp6Q5H*o=t0Y4b#FrJ5|e-@yM7PI4Kjd}#i$;6)sTIZHe#?87_cKR#ArqeQ{` zzPp|qwSM-_sH{YpL!ZU2M4=!hhLZ~0{34{9I)4%7+Y6*7h9Jwi+${&qK3DEs`vEdI z-wZ7bP8Ja_F$SSCtWK`NC9;C<4?Lyo6;r$A+{40+A1kG1_%+>(De}A`eIvUT>JZ+O zzq87wHzsQ@fO+8Io%wrDdA9ytD}BVrp2f>Fh1hsCYg@lf(h8i6OPb50tBal}z%}3J z@Ol%V^NS_L4Dm~SEC}=mb|j9|LHeA)eJ9&+EG0g*I}T=1hwR`@32fe;wWOMH#1%XL zX*|iw&t@gnQW&-!2Ck9yUZIU{iWaUvThh502_m05;WUbChJCghrA~4+4yxNn@OxUN zG|AcFZ8K;cYR9y6T~#n$?UX!UFc%Ge0}mDycE~U4jWtgXY=wC?SEmjHbruxfX8W3B zxNk5J2ACQUbP3%lWf@dt40bw8@J)_CIBS~0@-5!Cy~D%SuUR!S@I2e;*0SBL_$7d> zY4D=41-az7sUgAn?*6UJ1*@$;=U*|F>j@NkqC)6!@?QoIEM@GHb-o*)I?OuMgWaOq zKWa5kifuN_P{vf55QN12^#$>I5U9E3ME&cF>V)%GQAKq5ywbB4mO#OMnm=@%CFe<- zr_;CkXkn@VH0B0g^2rKW@9%`b9(KY{p#t8TZS4s4Dq)!Vtc?Zi|UxGLk31s z2S-jX-9(K=)4S4?t;gQn_Kt~Z9D@Jo*gvsTNJM&-P2zF$nGL?N)6te{Wue>BLn_w@6_qdF<^m0$7>QOieDS{38#q9KS{S-fsfS=s2)a9jQGOQ8n0 z7eD!>K9m~C=yxh@t?+KM$~C;GpC7X_G{YEgj_aSbvo>*PoG0Po-rnA%rkFB`CVJjN zG!^2>?r>_V{Qi-gWlWcvcyLrDrqKFnM8J$rHdITW<4;FmZg z+ITcQ_hCL+nvO-bf8)F^w1+=z7ZA;PwvfVdx`tY|c{C9w5}AtrzV&sn^!;x`1EL^* zd=<$>I3+Q@E|THTsH>=`h_0`)X-k%I^YjD;O7b4Y}Tj+Q zzReVIV5GlMadolPOi3yFt8rTJMhFcM@y}8|J({mmuQ|`doOHoKGj7A2tovLZTkgA1 z&9Ml#&=KEJcAn2uZ)N&iQ~*yTf3inTv`#GW-ZB@e7{0w~uhNg37Wtrh-&Zz(wO_1O zeR?-X_?eemWStaQ$b0NQIlHQUi}04mTKr>}zMe`ZB8qy?b>HRA#-m4Lq+~=bty;VI zklZf5L*Db1%@2@TS@`DI85psyXk@-=m!>uw6&9bG)D30hr|-v+-rg(R!CI#r3W%{1~UWYaXEYiQwDe9b{xgpW9!2f zU~50JoMhRTQY}Zwx72sSwbO}mH^7?B2dy_vvt{y;?|L2fI;-4?Zhvp)5J^F2l?;yH z0vAT>!>DDvPm6r?mJaq6TRUO1v^>XN`x4gZ0F!dqpGaibUWKt%gq}OA98+C>V$Q~ZYV4qSQt9@rGmj=D3~YP zQ;ovrZv+H*)Q6TutU<7iHBroYA-U+qK|GgXIgxK?>&KQ(cJ*d}P2UFWi3LwSsLbl2 zr+JTw%RCwZ8d)-Y5xW2(Czu#r4GrR50U^yxZ*26tbC18C^K^ZYAR9UT$Y3md{H{>R z3L4Bm-unbm11(SP*|B_+C>VQ$RQ|`Jgi=Ng;hXbA&e3#YAZ}a7z3j@T>tdNzSKj`D z4U|6BHRuVC2@a<7MQ-Vs?1qekb65vlVqZp{AxLS=MB@aa|d>)}Cft?!N;)63?aB(P79RJm&WUzo z;bM=94;FDm2-Xp`YTGe-={w&7^Vnj)vYCjw*vTd@R0p5S^#U5vQzO^lb|6kG6b&e# zeS+Ch^_C~=OCBIC{5L}I`=}WWDPhIWZdVnB`k=Zi+-cpHeh-)1a|G%pF6&RXKz(ky zZ?TJu-~92wuV_9$o0adi;X+cLT3wZrEW7HMYRB>H#uFwY-~2bMA^cPJTsX(FV?TyX z6oMsHFMOXty%C@c_^5XVl@=c2yq}Pe+1O+_&PK)E)-Mf%)a&ijzMhfJl?4m2D{RVb z)b@tx>TabdJ~^@hykB{}{UC2Qa#%}a4>e0YuSxKH(vLwI(f*1L$A$mu<5$IfHCCxL z3jFNGLOT?p-R_@{EY;eSwpYDQ&uhi7o;tJ<=D&8h1rW9ouv_@@;$Ck+qr+&K#=g6W zr;(Cv%3atH%fQR$3KBk8qt^u$U|Y;to8F3UD6MqIh9o;K zUOmv4@J=S#UM!(yI5g{%?8D{#(i9;8aKjBY!{fSItdPVNJ(4ArSd6U<7!Aypb9`to zCfZ_YlAG415cB)|@La*?du0D8ll4)Xu+uQ~pnzOAJI2|ke9P#yzUB|dnYgtUVaF|i zfYnVucV3eZ>WC{D!7l5Ow)!TU$`tll#-$C!?w8-+a=K!(K}Q44!m~LA23Qo}`(-=Y zLH1f#_W&TK!DrEVc6cz>;qd;8s^z7Iz7Nb)4-a$Ai{JVHG#4lK0U zskoQ)?x6*G5b;6%ROra-mcMN|bj9}|fcTHURso@Zvu#oD<~v4zu{}RG{N*md_+McC zjTc2>i*cQ;LZ*wGI#`^3(SZuofO?1#?gBInY<|;t3!D<`I?dNbljQGvKF=i9f z;Za#x_$_`qFAf}QSnJ2a7%c}pjrnP=pN{7Z#0wuN>2CLC9R7VME|A3K4|USd6!-td zjqDYw8;rF&fk2u>)o@cN17&VeD{~mhuuMd6w5H02&xz&dZToB2mpd|!GWn&VuvWvX=%|U-M>7n5p$q?> zsBB8lCfHN8qQ42lSKrI2X7s#r4I%i16kbC7591 z)R=D?6S=nHgl9Q0SUvnYGutFrEm!lhR0)I{AAJZ2P(72We|XW>Nw8uvji3fEUtH2~8sk2LKdOi!fxEF2i`cB6q zyNE5n-AajicBpXa+2&iD#nrU_HTi{Q8>i^^&YUi5>O`ToxpHEwM6N$KRp6r+YH9PI z=b0H0f!A4c_U*v~Pl^BDE{+HVyfyp5U!Grb^Ox697X$q5x%dviE1QVBKkMjb1*ov_ z7J&1MhPOW}#_^Q8`1s8Lb$gFLtzj|x&TJFl_sv~K0RX}o2mZ9TEsjrUcj7yQe*r)i zrr2lc}pB96h5#E1;xe6^} z^jxVgm|z&DO;KdXDl{qFkzIC2y9Zy}4(}<3seXQTSFv`jxx!9Z7#7;+v?z z572;&7e&I+q-(ad zzxllG(wQ*MqpXNQ@9O*>Q)T;|RXDc;w%<{X#Me!uB|HwOZ2diEo(`KqjdJkORVU)` za0@xrJU1CpRGXGYUKNSBs*J8Ku-($AiCL2~AoN6+AIUblyG2~>sJQcs@BH*>Y>T@O zOh`9>+A9$)3wENI^cK4B@LIjbu66<)6|k(KLba#hna1xI?-`J~|L)Nrhl-3-Gn(IP z*e_#%EIUVd?oryy)d;zVW#;ZhtHoo<`Q-i&uL}7XsN@4u&5D2JqyUAaCp>Ohwvg*b z-2Bn=C8lnKj60J*85BFAF<8EoqIEo<+Yqp<%zr<$? z{q;j)(V8;^%6y+5>-t=%<*cM!@B0e%yh*9&$z@^gu{7&CtslmpQVHK({M=4@r>V+)4y#1d_6Q;{1p%2{?hsXktqCkx$*x} z3jUvE{sY1OKfd`XPX23E&VMVT*;%&^A?@!6LdzX#+=f3z^og z*otd8Aq@T{Ix`S=*s9yN(Q-!o8bLASS3F~sy+^V>CUeeZran__({Vub#~hZ~3FZ+s z{mUcPomJ*Zl?3Hazh0JHFp(JHs?>PnW9yGsFx~E-MFy_`mB15>@N?NkMkpf5C=i4f zSIJ{#3YF(nVR2inA*j$*PW^Yf#9UQwsiRjjMtyb${C@h^{Rc6vrwLsj7}l*J$q@%X zRb1__6=!t}L@h(oN~H6EC*qbr4aglcIh?B*czP;j2J&UR3Z8;{zd&-xCmbS|R9`=q zPlR6H!k?@U4u+&e>r?^J)K60VONIs>vg_qlz;}!VPCA)sD6Yo3YMU?7Di6i?8U;q~ z$-B?l9V}+WWnJ?b5Q8Ulu z*f_TXoohFs&t-eO-f1waE3fp{QfVfD!r02eIp1x2$B&8vo{8B^)hT_{Iaga0(XYa3 z{g?qhhj_hq(Lbnwevk=~*tj6+*&$}Kvo*~pd|r$&9E!dMn(=G8;BF=nNDy^J7ky$HIW@dt5+2J!3&}*Rh9~jS^CjE1(*0{p_kEAmJK6% zU?#`>K84Wq4(!_c>}va)1MI3E2m_iUb*3~cJ=*(X?E9kNQUnfL`Uxoszg6S|W3Lh| zT$9cj<)wQSnp?W>go)z?VxrCg$rFL*jVmGe=ZXx9~)PnN@xWWQXZP47tF*^RL- zC3t6dG>Jbo%cS2>O@ftizOJ}A)hbfXfU-tT_qKtvX8T0i3C@)-A&8q9DTGpDa5=fg z=={PUd1p5w$bo-zXZ5~_(`DsEQ?YF=wi=^)&RQTX;SU_;F&{wW4rgXHzhx!(if7#j z$vgG>I)Mzl-n8o#Ou@K? z%{q<-6upPHs{*!=C2qr_4wia`_-tB!5)rOg3i9h+r)PdiWc4dCN`?Ye?yY}Ze|F9T zomDeZBmIvGk%7gCb3Jp-Ap%d17G0V#ifY$!z&D^h&O&#)`cKoPy2`IZ86|F-DXng- z968DZ%ecZ3z1F@__nEq`?y2G)!;Hrdb9Q+64BZHUWUketh9|P7wr}-Lw9D?OEN=?& zUyn3y6{FC@NNRL&PKK$&fbDl&;4V~U_5GkM^jlj57h`G)&A&|^^bL3vIHhLj;J>rg zaIgl9z_&FmQw5n20=_9J#@uA-NEfi9skJ0t%zDPPV|6+=v*9c`aK4}|{9b6~fX%$l zfU|0?j~S&?(p0ApJzRNl*ZPOMIvhihY*CmJzGei>Ep+T}aZJ2_btM)V%_ zni867E0`}}8Fx&M)-8A9O}Ka0C{v_2NlNdC+GR9MyY(Yf_PsGEsBGbFPqJVVZ%}RQzO$>g>=DUe;Dzm%B&^Wf}N_FIBy|`U2u9zlJ%`3z1gDFJw30^PBl%M zQr73Xfw&uMh!rrss2iJ*@VUE3vco-C4wYB1r_bu!ZnGDFvK2qX^UnhV z`0F*$$V>gMkdV3&?N($JjWR6*XQoQvyuZco#}7_qMiI4Dc|BAMw`o{WNb(c7 zPtT!QONF>i%T`UCTopI)W*;mp!5N7%a=XQaZJNHwFsd{ODBBaaum^8K=y_5JH6eX}`o0Pi|Uw z+?ejIhE%yIE_%&w1d~v-|71uBjAqd{tYF=t+yOc*avL|A=aP;01PBmrn}pvi_?SmIYp^wg0j1THCK60rihS|PwD|3ph6%n+QVo?` zykW7kM{Y(~aO3m^ z!y?k2s)Yjm=dh#hkf8;&3DQh7WIAGisc*Tx0CE<*yX$n-iBbaG0N^L9+Fqy#Pg)h~ z2HrXVQb_afaaVd1(ECTiBneigy)?eJ^-H9*te;lq`trw|)Py3;Q=I|rIwSA($YU>d z4~gD}H0ULckrpOZ&5u!z%mpZ)kPl~y3_UOjH-R?Nfsuz&XZpMFXw679$28u6Qjf8+ zLvX=r+;K#J|4VyO!X2@EAI}xe5o(nuw|=5+Cd*bb&)0$*m5ZDjzYcJBvGvbBCW$bO z=q<>ML46|DuL#g~3%n&-kiWLy+y>B%{nyt~zkTrYf2b{}lqZyTcf$3uPwj60$6&G{ zXPrar0%to$)e9YX_ol`F@*_4IWNyj8CsF7Dv>RR7sCA~?k7Ccwrg z#3v|N-sT20SX~|zdO1M;!exlO-K`+M0R99151nJjjtxHO0`tcKKxeJal$&|Q{x7`$ BG&leN diff --git a/applications/Volkov/artifacts/mame-p17/tree-delete/selected-file-and-trees.png b/applications/Volkov/artifacts/mame-p17/tree-delete/selected-file-and-trees.png deleted file mode 100644 index f39b794537485f29547bd2ae63a96d3a1c5a8f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8936 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 diff --git a/applications/Volkov/artifacts/mame-p18/metadata/source-metadata.png b/applications/Volkov/artifacts/mame-p18/metadata/source-metadata.png deleted file mode 100644 index a3ca1603d2467d9f0d019a03438739e4076db956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7984 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 bg678V@ZrO(oIbCwpXPDO=On=`_|AU-$7c>c diff --git a/applications/Volkov/artifacts/mame-p19/overwrite-core/clean-dss-return.png b/applications/Volkov/artifacts/mame-p19/overwrite-core/clean-dss-return.png deleted file mode 100644 index 469db835cd196a3e6de0547b6db1535a03fdc73b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6099 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 diff --git a/applications/Volkov/artifacts/mame-p19/policy/cancel-choice.png b/applications/Volkov/artifacts/mame-p19/policy/cancel-choice.png deleted file mode 100644 index ec02cb14ae7c98f3efeb508f828eb548a856ab30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11290 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 X@#4k7s7@I090+>TK&w>K=FxuxKvFZz diff --git a/applications/Volkov/artifacts/mame-p19/policy/cancel-cleared.png b/applications/Volkov/artifacts/mame-p19/policy/cancel-cleared.png deleted file mode 100644 index e4b0b7f94eaff5729ae10b75062520b09e715503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10109 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 DFcXT| diff --git a/applications/Volkov/artifacts/mame-p19/policy/clean-dss-return.png b/applications/Volkov/artifacts/mame-p19/policy/clean-dss-return.png deleted file mode 100644 index a56f301a39bb14427f6e2753449a4b9830a09276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmeHHdpy+X8h^7{ch;p8X{=glMPf23mu;9Pt6|(4Me8!geN<-3Wf)4EW88A7`C!OT zt~ux;6lPiBs3tjX4VGFhgVBV_b=a4^e9oWe@AEm&Kkx7JzR&OTJkR&?BogiM3bGoq z000HslQvEOe6byXE!xr&@TSBoED!+cI9r?JE)krWU+hk1Q8lGL6h1Auw`Uvus^W?7 zw-!29unJoJbgmVo98bh1opI|fqSc#{>t01g^7z7bO{@EuX{zmz%lIVNH-3NQzK0b>y(Z$9*>7iibM{3 zRa{+NkLn)PDr4-P3FxfDb4gHPC!s71_8g5csYecC65T$`W6R^`e6~2@M{4G$HqP zQQ>W?py5<$NpK2HHsRGr&)=!fWUy2a5SKW)Px;#p=bxerHec7zU0d$vjbOKcb@dY_ zyoI;p?28lZ*hN?%PDU`%smrdPpU1fUN6|m~`TGcSIdkTWqvN6Q_rn)gg8Tp3DgIiY zRJDpvkN|q2=SLa?sZ_09yOP^{$O|Ufr&1lt%FCBNPWEujXlu=M0C1bAWMpLIV$NUJ z-JOQPU=qfkCaNO+{r%UUFc#huD=I3S%UxVu`|9^`EMu1cmA*$xY4?lycK}GL;>zAk z^;IB>N=j@tJ7N4e`yis5*-0E48nT|5nK97UpB4&tF{0<*b&AE};^N|P(FkwzPZJGf zd3hO2D0b>LW)Wv2%(o{UMx(DWeSP=l*(WrkKQERLa!0r^jM-n?lu(v7d^zCtYm$x& zfj}UUNC7H|HZ>?*nQO)ACZ;&5GvgaXG&w2rh|6UPXMK%##(aqGNY&~{Lv@LSuuWq$ znl2h?q93)0U0b~u5){PxEcNA=g(a1h20>F(QxEtdWb)YSu{-I(P)u4{T9FzWf5Gd; zxy#uWPd)>?p z@h1!p4Y{8_-OuNneO`p)TeG4de%zRqIde1cT}$$bGU!txWV0q&$HjbiTAPo8f&zlt zxzo0^2NFb18+~%AqNaw=}`@ei4ngZ>qgBzd-g2ff^loKWebq?4+s!I&ri~$pkKZD&{{J}^71wWcX#*R z-o8HQ&Gzo$my8B?(HXTQ_h1=m({ppr|Fw zdlWoSVxOmxBVJih_hrIWAP@?L0)bmy=s7hciovixDVy8fcS_fUHvVFMq6`1LrKN=k zS6w}IsJ7C*?mDw8-vVwa`9r}=bH7P0D*!NOSXBH~V(4(aGOjE=J)M5^m(fwwIci{_ z%%i3zi?f!@)g!%q6(rPAx&R)CXKe^SYriv=qp@R$-iw0(+=%U#DI z0GYp7BkpiD)Bjim*NpWw39v|od+h)5KY@Tz`l_Y}gNPUsHJjl;yXiPLy7PHIdboEO z1rUxCaN0(O#z!#PdOk*E^kHKRd4GUT=`)ylU^6q4MyF5#kwT}0(X@#nmuLsHZ7+L= kY7@MJwVf}71%|>0_+e~hWHgY(v)h2o7H4l$h4s4nJ0l2U_W%F@ diff --git a/applications/Volkov/artifacts/mame-p19/policy/overwrite-choice.png b/applications/Volkov/artifacts/mame-p19/policy/overwrite-choice.png deleted file mode 100644 index a0d541af3f5dfde9a322e684170a44b3bdf1b451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11196 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 YQ%Xt-AJGYAKF6Y^uA^3>@+kPf0WjF|YybcN diff --git a/applications/Volkov/artifacts/mame-p19/policy/overwrite-complete.png b/applications/Volkov/artifacts/mame-p19/policy/overwrite-complete.png deleted file mode 100644 index d366f0bffbdbb4f6a163e800e4614278460364d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9820 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

    yf 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 diff --git a/applications/Volkov/artifacts/mame-p19/policy/readonly-reprompt.png b/applications/Volkov/artifacts/mame-p19/policy/readonly-reprompt.png deleted file mode 100644 index 0487799bc72f0af6e05b8311fe5173ed7f505344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11290 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 diff --git a/applications/Volkov/artifacts/mame-p19/policy/rename-choice.png b/applications/Volkov/artifacts/mame-p19/policy/rename-choice.png deleted file mode 100644 index e18afd01474892c7cc9bf970e40032280ed9be2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10861 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 F{{_YKaf1K= diff --git a/applications/Volkov/artifacts/mame-p19/policy/skip-all-choice.png b/applications/Volkov/artifacts/mame-p19/policy/skip-all-choice.png deleted file mode 100644 index 1477025fb8be49ece96675cbf78f6b9dc6527af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11103 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

    u#U#oH%~P^d^_4D}a67J?x_$rY;vMu)Na?4b(7O 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 TLp!vA=a^vXx@v_gR)PNp7Nfyw diff --git a/applications/Volkov/artifacts/mame-p19/policy/skip-complete.png b/applications/Volkov/artifacts/mame-p19/policy/skip-complete.png deleted file mode 100644 index d55dbfeab8eca08783cb484812c9c29c7912726a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9803 zcmeHtXIzunw=VXAil~UF1d(Qd07FsfBNj+Pn}C9$L`1p}=^bpy&}%?S2p|C&q)C%L zh=6o~&`Sh?Kp>PrLJ3Lk3(kMe+}}OF`{jH*lMfKs``vr5wfB0SXRUXK=<8~pJbv*w z2M5PVsMZ|>2giZ)9313Sny@+9~k5} zr2Zv4IJd@C5Bya^l{fx1?z`yAli*KZuiiKPRC*^={l`^7Z;?Rr2d3Bj>9Ncy3$lfRRY)yA{vCAsHyZ^o|v7wQNPt$JwYqrHTTM>tn=HVnt6`XcGkM} zc%^q28+`zJ-rm*K)qInJ4y^Vb8yT?&;r!{tv#W$$gSgkByT(l4Z9i}C>s#%;Gb0^1 ztdgeY?_<9CPJn5<+8e~lo7_T5^L2{V=iVKz#@5pE$64Iwm!0iuBGbtdGfPzGSN3>n z?zKgo$zEB*vHe_`({Xy&2iI`g|8doSIc;x6mzX%dJtwZCEi(3;85-^7skE~$HFZGH~)J51@tS5YZ6D?7J92gC$TPJ#C-y-rN zm;{eS#trwl>}IZo4tCAfEPKZxL|Y)_gt&R@Lp{~Xbpzw72dAvs-6tUWC!lIjXZ5g_ znVe9buD%ppZUATQ;q;>yz~809Qy$^ZwX+UoTwyN9vFBoK~0BTry8_x{vPP*n}7s z7Ps68qM2Ku+&0QGnR#fvHET@~yMdWU)HFtsS%07%qI7|y+HGluq6e8wB2eoeiz71(^OGq&BY*Oyb$_eV- z2r3R5e#S6Tgd*BAB;CYHci_26l)PLuqV7EH$U)BgxGci{oA3{dJdLT)O$4N z8Te6#IM7u7v*}r=n_4y~7v_)WeS2QgaK0#TkWbRkKNi6W`c1dFM#w88t8R>Hoo>-C zrrFAxF1{tUh-%;Y(8s#l1cyOxHn}_=iTd7U)WFkrX=S?j#Uc8#(ogf{1~p0Z91_Vk zGg=gtClJl+UXSqSLz&8_7Kvqt_Uy4P;EMe2{5vR_Ge`lyZQ&r?E@%8+=@Gj?%=rDb zF#bHpSTTb05Qjulb&${IWUzqGTt@YBUG;s|_g7pam$trYs>#~wcZuMy2V*OQG1B$I zs^cNKB`vmA_#(MST6b}QmgeD50dM`d;NlJ#<2&kV*WIqaQg6i7XwrqXLR$tJnw z)e)}iQF@d(4QiK+G_h6qbCL~Q(P!>RW2*ftdom? zt1llt#RyUfZ^<(k8%Ynor5Iw<5GwhXB~ZTefAoY&*A1ym)OfotPtE^pY4MoG!vX_~FNGZWYe1FSa50 zg*gZeYA>CxUFVWdx{MMD9S}Yg=zhU+3g=o2_+izjo5PrEfU5 zc()mUfzy4a4KwQuU@6PZDI*f3T2)-^JpDChc6%V-1o%W)AnTZMxSeSnYduF`=lhXB z<^qZ|;c!wI@9`Bc;8Zks{pi9_^+2_OIAhpM0x(dg|iN*Hx+}tMqjRK zVDTr(N)lciIMRhvCz_`2VzF9B~pGD)etSjd@YZ2FuIKmnunVv-8E4EweL&1!gIzR26TR0Oz@H859a7C(Xxxiykyn zwbrHFou;ac_;wZ!qeR2Y%LE&h@-3@G<_m0@b8swEL+|tOQb!o!>$GJO#_gbIJeRCF z9Zf3=Y-y+t(wGNAj$`Tjvc|r6&b^@SY+!-=sFS_ao)>z>ac8kMRzCP`m~!7KN2*K$ z-`285abR9BQ(1H`SUle5e{y9MUX#>Zaj{~6$A+IuXjS-rkW>;=S7Or_T7zeW-yRZT zn_Z)$$BP0ro2!FHYz7E1+cEJY4dt2mJ4zmqOIMbU>MG3$T2htaS*;t<=YrA4Tt#;v z@rchX$T|A**FC@(i79`)aIHh_Wg^!D%laOZD?C=B7!47WzwF1e@AWEWLvvTGGdzas zgWh#yA>L2t>D^mrzC{*sCtsp48i&zgr9tgT@*5gz7Edv3bT2UhX%qA-^k+s ziCM}+vEvUBrFAZ0z3?F~c7Wiku2wx*L0oveE8y-80cl2s(@?$T)VPM~&PpSf>iV~F zPvW>Zj@{|pPKlUcvo;E^$XEQ=Muh#hU{OBCBB`@0E150otks@(nnq{SZv${~Yx_#? z!``iZ@;ip5akM-{drn^0pQ6OzyYHmW7|AV)zf~040sJp*{4rh3mU@MDGv{-4P%>Mc z>OmQywMi6qOl-4{3;cf&V_>-r6|glk>%6fvE?v9cJ6EhH0xqi^$aC|7DMM&JEO|6; z&T;AJ@`BUGlZQ`)eMa=L2TLCH2lB$Itl1iFuy@klZ=V=7NM38yQ1Dr8;!SBuxq)69 zulA$^9#{e5CAq~QM^_;#QOazj#HPE_m6U*Hj}ln}pWYJz-=Ma86YoX(DFL=VEcB^# zkqYL88T1&)N*gk`$M`^5j~~i`9E3Q?yyU1@2N8sNT@^KXhEqJ(y7V9sfqOHpmDs;=k^ByIv zI%PPGeOeuHD0Fmm9Cz(j?d-E`iR^4IG^@T|e-n_oJ5%2>ZjX+R>Z#HUy%>4{)VLOb zK))~Vb1?BE<_vM4tc%@h3<$K-gU*wWwmZG}M0n(WYMdN(_k5qu)O!~Um9k-HP61>W zI5~^Wnd~bHfWsoY!$n!%&aCI#DQQGtIu*?E+Cfxe#okC!T0sSMpJ$ zs5Q=5s%=N&;al;p6(5(qNQ7{FdR5PPNMC9XKdzsg?+angm$>`hW5@x(ikEx1t(2s~ zN@}-~qq2pfn4E$Lr5b#ziHaQid?>r~SydK+jx6k@EvnbQ_&tr_P0>Vm+X@{1^67%o zf}Ywzu?ESvyW;v z>s+la43=s}&|~)J%V7S1UPIv6h)Nm)^H>**tc?E#jyKn_SFeJ~js!RK*r;tIy0s|> z$p&g#T8$s=IeD_Re|Au6VTjdzmwZNwH_R3_BilUGoXA|oX|6eojiW|p5f4o3qj|NkV^3)(u&Z8`BU|;*= zxsK$6%`rk;B(Tl<~c`cd^7{KY;x@@>APASKh4F=a_l9Cms8~sRs?ITah7mmUSY6^=c11 zP9>?$#6>y%h5Tja7;EcQLv({$UbA~YAJ+-lZvQqhf$?bz$)DoOH-B)>-T3`rg?t*f zUg;qbkc{p}1jy__0u^8a!C0$o=DWj-#I{H5$P;^9Ln*ryVWO*ug+$nV5h_dnasV55 z8FYVg8Xhvxp2KhCrK)(Ag?`iMLPrAvQS z7ro}0{?QMk)CTF%af;GBb~|^`W)Snzt+dl8^=n@wo(FT}9;;e^kw|;NRNnuS^`7$& zRb5XDfokR;()~o|J$$7*D;>&8jh;B_h-&(?2h??vm?W6h{0t^u%bmt~F^YW&moV@+~Buw|&Q? zP3*EE;E(@E)COYE{%gE@iaAA_l%w6A)4bA`!`i2j`{5i+&*HL@`e!9*C{F8q_?oMW zW!>kTMWXw!DB%FvDS#061{o-oGSRegn-q7?tax1k_}@_wkGgPVW(TWME+dS7k-siL z&8&RHei{2xhFdol@pVsnJ5tG|H45dCmNRZ?e5Z&-oDA;EbWWiwI-6Y-7oMEB=-J%~ zbEBD@*uEt}@XR90uqKOO50{HCHQw8{ke=AA==cd*fW^W1CuQUly#a2&4YxB|(=_Kr9{h9@K@yEgD1m7Z%@ps9T9=X$HY(Z)qoBb;6p>5>BmdbARzjKL(e%?7S6X|hocE+qpQLzA^lp0keB-bJL%YFNS zBdXG%*eOWbp$P~9AmONu+GYRFCc1~`vt5OW2B5gVFn|^WB>v>woa9)xKb+K!LmxK+ z;6*$AYQV>0{ zGqF)OXxafGu$YV+H*RcDMsEbt{whXH!LzNA8;iqzrelE2)>CJ?xvuuYrN_NV*v_WJ z`kfi*6ix$Szwb|eKmt5>0qCL&tL#Z%9FFo|v~=ZkpYO#t3o8Vz8A+q+{07ZDRoOdh zYdM33C^TppD511~d>7?#TiUM7AZb6qd7HN_OVrjgxOC)Su8L%NtSU^<%Q2(K2p*~W zbNS~dFofLRvWXb~aG9fs0E)MOTvu!3(1XbDkuJ(u)FCi#5nmmvG-L7}@w;v{t}uQ5 zW)7Z%v)?!~5f$JK5ZQQDSy`DojoiPL2awX!H7_zDcdHM@BpY@9&{W^<$-xC|16yb5 z>d$6w)KeVM4vT~`hrw*VKM$Tk_PRb z5$N6Gi=C8|c@0n!QuFg-k^io}uu3b3hK6jVCKwYNtR>I-lv-LXL3v^|(yZE}cAK1c z_KteQYXTYlv_j#L7v~97>{3|;Uw)sruY?PnA#<;nGlZ zu^%RxDx8?<-bcpkcDp(_!6_0Df`A~Y_4Z=`dZHrW0A8?>3SPylCtsKskfwdjxOytSwM@i*85 zx!Rw9r)vLB^RLtXJ!${O&Hsx-|ANhbgz~@8`M;ZQuDe@xu=<~`ls?F8Oyw1q9yaNE z+lbL+T(L7t!#(Sqo5{OG(2vL|j~iixN)mjQP^v<@1EkDEf}plq-07cjWMI_n82nW! z^=pr7iR&4}gk+ppCtC&1*@&pK=T*3`93V+RQc!RyaTA=(&*Tc2b&USoQ=Q01{-#w8 zZ4P6Pd%|(C_-!nBiKsP{ZkYCqZ|+*UUYXi-8q+#Iv>*AtY^2^tN^(K2QNvy8Ona66 zq0^3Sy@eABCr<5&4IMK+3WQ%R9~}l0BHQgpMrgH^x?O~c@U{5c?BqI<7lb7TNpcE8 zja?=@t!={9_J@JfeBi0@8^nd2(Y4=06KU91YMqrI@?>tp)zQK`#L0NN+|y3+W{I-X z6PbxN9p=5YbZx%1(P1>sIsYYXtiD&}gOmTMvV!#`s%{#s^`n^n>P2hthtZ@IR<17N z{GB8{d_bwGk}Ay$5qz1_H56|(fppC7GAX70(H=Kjj~Q;=Xs@CWyK;-rNzU|`+P*CJ z6z5Zarl(ISY+ZbL@Ftam!+sx60spN8Ajxm{Jc)1$H?6e7J7;%A5xgWe=RPGY!^ng) z^{jIzCBRY4!G7I=s?Mdsp}L9qVkY<0aEQ)bbLCgI(YiUu0}i?u2*CYwUs{=26~^(2 zn>AZKF+D!ncRwEf0_-jt(sITmudHhmGlZy)ESF(KE#AKE{ZaBq);-A(UE~S+cL-%c z=k8#JYI%*<`nd}vkN)GY=7$L!zjz}^+aU!ftw2i43JE6GzHeYgHXbydbjj+ZqAY5g z@&N~)0;RMf6}wO+RP38~C;EEPBua@0->4>EtY~@nYj}vc?t6TIIck`371?(t(B8i` zvFI6(A`ByoD;ed17$NhZ+n>U{qw0k7^J-|K?!m_&>`rj{fs=xoVI>HIaCBeQ;znA7 z!7Q2ZuEUMlnHeLblYl?Ku#b}YWiXG|DkBW+A@WmHuJlPAaEwz(*K_|GEalp7!=uIB zugsl7IzfRpD@{;b#EMA!Vi^pX8`DM$z#RQ8m)x-gyuL+zHTK5N^h7Ih8u50!Mo_vt7x;vccU|+xeQ9D!}+1FcF9MF3)t%<-#A!i-z zdw8vrd^08r>~Grat$)1HT?FHK_+4pKsG*HVM0;lc_bH$EF5na3qWdjz@`_j*{*3Pl zn6UqBpR9bmAQ*f*Kab#^GFa#W?`?~5stAr(GKZJ=&)QsjxLwwA-Fn&**8M?bd3y}D zAnslZro2M{Rnn|}882_Q-$sIqdR-jNtH=@&3wn(Kv}VZaf?m&a7?LaDUi?m%lllN< zp<%+^IITwuh{x4yl;!vBCg?WV(p%>apFVt+Kfboc7Q97~eA<~)%voz1(sDsvT>Dra z&+ZHP19s$%K!OSV;0Ed%Uxo3~$8g&%eE2OW4f8oo?#*e9_f9jl4nmsb4ks_wWJzo} z`3^ef@Z-yb%w+#FqDfM~2#4%GdAi8QtP?z}RX<4Ao+}^VdjqmC78^l!(=qn273dEI z>w|)?^>vandht0Aq|yDq)IIqy#%HlGF$dYcrgSMWS)p7SbInros9>q+KRO9RuwD0* z64O^b;3du5bgB5HimU^`Kvu_zy!sZviWZcR7tBr~3=ko`xmL%-o#}R{LhJda38M)! z;BErUaOF)nEKaq-XHqv27fqI!fu*#Go1R08lRAIxc811*-7_?Q2Q0i3w5<7FCjT+` zM87C-@4zrG+j~&+w!JR{C5c*iGS*Lac=mbn!VkTRo8+&N>NQrtAHnI88hC#EOxlnB zSA4=&0ix=@H9~jNN&`OUU@LM8@@fRLB0Yzu%a@R5JB_-J$c7uKy@aj7;9=Lz_g;=- zPCYZp-k$kR1`mB&L7Smp!vgzDl5ZThRLQrWgjg2jg`cm%Ur{)0w954~`3| zFQ*iRqM&O;#mja_ffx9b&({jwMsiTO*7DC6TPq6BTG>L=r!W=2)6Rb$$fS@CrE6j; zp2(FCJa4f1g2s^mdYiPllP1rVpOlDr7v=CiNzbwK3^XrNo|3yZpqSKrFS8=coJ+TP zD(1~;EPL+UU1hTZyAW|SD{kPGd2dObtU7%waYV0H*GxE{Ln);#Ow)b<2mNOU(4^_;?J~&QoR#@yHb=LnP-IKV! zI@|R0sb+|v_LROe9k(UpWp%W9D}K)yRy1Sz~x~v$Ql?<&s>bpB(huRvte(-{KDW~OAzA(*;VO9aM zvpPw^S=k9z9hRiI@YRKebl4Nrm;7ynkdOC7n?b^(UeOc5eGdhzd>P?Qpc*yz;Wc%y ztFcs`u6hyaZNqRmcD{)cNfDeP5vs04!oIp_{|BS{`MESJQ~IiCgglznxP2P~Hy9b# z#cg#PtG8p64;-~hLcm{PSLY(c-0k^z#kGekmqUUta6E`8?ZQ62&GGj1Ul*GGaRUbk zrhnXY`X4kzn=sYujy5<#xun;DD_kJAyT)z?Xlpl53l}R6om)D0ugFNr-n?<;+G80@ zc?H=UmSEefIc-2s$-SQ5u5MP29QsynRxYkr^q;!BN?w6_SU6qLv2eIz@XW=|31|Sm Z$jZpb42E^Wf#*1&cXjU+XgqrPe*hL*;9vj% diff --git a/applications/Volkov/artifacts/mame-p19/policy/target-result.png b/applications/Volkov/artifacts/mame-p19/policy/target-result.png deleted file mode 100644 index 81ac8558e7bd9993198c2a36a502324b1b7ea437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9822 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 diff --git a/applications/Volkov/artifacts/mame-p2/README.md b/applications/Volkov/artifacts/mame-p2/README.md deleted file mode 100644 index 995b2d6..0000000 --- a/applications/Volkov/artifacts/mame-p2/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Артефакты MAME-прогонов P2 - -Дата: 6 сентября 2026 года. - -Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`. -Программа `p2screen.exe` запускалась с дискеты A:. - -Каталог `screen/` содержит: - -- `full.png` — полный `WINREST` и сверка через `RDCHAR`; -- `partial-offset.png` — прямоугольник из EMM offset `0x2000`; -- `left-scroll-up.png` и `right-scroll-down.png` — оба направления scroll на - разных панелях; -- `stress-running.png` и `stress-final.png` — прогон 1000 операций и итоговая - сверка модели; -- `stable-phase-a.png`, `stable-phase-b.png`, `stable-phase-c.png` — три - идентичных кадра принятого варианта с системным атрибутом `0x30`; -- `flash-before-visible.png`, `flash-before-hidden.png` и - `flash-before-visible-again.png` — исторические диагностические имена. - Повторная RGB-проверка показала, что все три файла полностью идентичны; - прежний вывод о чередовании был ошибкой предпросмотра. - -Каталог `skeleton/` содержит именованные кадры первого запускаемого Commander: - -- `initial-left-active.png` и `tab-right-active.png` — старт и переключение - панели; -- `navigation-scroll.png` — PgDn+Down, cursor/top `28/2`; -- `quit-dialog.png`, `quit-cancelled-restored.png` — обе ветви первого - подтверждения; -- `reserved-command-dialog.png`, `message-closed-restored.png` — общий - message dialog и восстановление модели; -- `clean-exit-dos.png` — штатный выход; -- `repeat-second-launch.png`, `repeat-second-clean-exit.png` — второй процесс - после cleanup и его завершение. - -Это сохранённый одноатрибутный baseline. Каталог `skeleton-color/` повторяет -полный сценарий после подключения `sc_theme` и дополнительно содержит кадры -обоих красных quit-dialog. Актуальным результатом P2 считается -`skeleton-color/`. - -Каталог `palette/` содержит P2.2: - -- `phase-a.png`–`phase-e.png` — многоцветная сцена в разных моментах; -- `restored-dos.png` — возврат после восстановления сохранённых записей. - -В `phase-a.png` отличается только внешний индикатор Drive A в левой панели -layout MAME. Viewport Sprinter во всех пяти фазах пиксельно идентичен. Левая -служебная панель MAME в сравнение экранных тестов не входит. - -P2.1 не открывает BIOS-окна, не обращается к VRAM напрямую и не изменяет -палитру. Интерпретация и точные результаты приведены в -[`docs/p2-screen-probe-results.md`](../../docs/p2-screen-probe-results.md). -P2.2 проверяет разрешённые системные палитровые вызовы; результаты приведены -в [`docs/p2-palette-results.md`](../../docs/p2-palette-results.md). -Результаты приложения-skeleton приведены в -[`docs/p2-skeleton-results.md`](../../docs/p2-skeleton-results.md). diff --git a/applications/Volkov/artifacts/mame-p2/palette/phase-a.png b/applications/Volkov/artifacts/mame-p2/palette/phase-a.png deleted file mode 100644 index 3f35ed7c2e78c34508ce82308fee939203083424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10225 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 diff --git a/applications/Volkov/artifacts/mame-p2/palette/phase-b.png b/applications/Volkov/artifacts/mame-p2/palette/phase-b.png deleted file mode 100644 index d41755fefbbe08a82c23193c3315d72f443add67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10221 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 diff --git a/applications/Volkov/artifacts/mame-p2/screen/flash-before-hidden.png b/applications/Volkov/artifacts/mame-p2/screen/flash-before-hidden.png deleted file mode 100644 index 2659006fee90f4a79c46857439dfa7c8d99aea4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12402 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 diff --git a/applications/Volkov/artifacts/mame-p2/screen/left-scroll-up.png b/applications/Volkov/artifacts/mame-p2/screen/left-scroll-up.png deleted file mode 100644 index f2beaf0642a88072e29c7e140bb85c443df1b201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12823 zcmb_@c|4T++y9^w0h3-6KPNEp}EuRuBlpuA_a? z7zASC27wq3vM>VwC)@V!Ef7c=qI2=QsbBJ3ir&X#T0I1D<(+$;KH_`ypfM;(d+&qY zd!@y>4mEz(=G{GXQR)x_PpS5P9trj*-(0M2BpzsPdd!)^_Bl-FMu(#G1J=Vw#CFz) zuqhmtuzm~mEAAzg->RB{5tH8$-&GZ$3Fsz0@8vv`98&TZ^P>iSmv>=P}a)zx+w17 zi*L_`J-ml0X?g=gQps3%s?FOw-`~v^4RQpM22r)R6f9)E68&bZ)Un;hqk*ek8TSdY zaG3VZQ|D$_yopQG!OiY4(%>M{u`Riu0$uqYRsl0eR+QGwrJqUHh{{slfBOv#wp;*q zrKT$TFWN3@sS%BQXPZUShA7aPyqudmxoF3CI&t>i(v+y`!lU2?UnFUG&S?4@N^KZM zB{Ro4wx^Np8}r}l$o>Y{nc*Pq@CY!xC^HNFu}If1{0idWlfA(QL>+2%s4 zR!wd_L=5U*wfdAYn}GgIAdinhcm@OI^n zoX_|F&@)vFO7jzFcg&Kvfs+uKqZ2U$dYZb|%qa^h-jO;IK=#g+^)& z*@GiB;tKe!#N;-A;?asSM`9b!pU9&pzW7?~jM87%v#A-~Z>fyTxJL7Kq`QVxy5fcV z^^v?;@&UI?kp~Qv`tUv`9mrQl8p74tb+fo5_xiT+7papbad^KtvdGFq(Bg z;fGbfvZG)6_K0<#XzAmSQ80n#PuhLoKg%G0GX5IK;$XhPG&pD?PEoz^vRJw1_HmaK z{A&Jn-o`A)h#5nMgcz|&9ip@|vX|m5!R*A+b3WHBuX{k_n}SduPg6@>Dg3npgt06l zfBYR~xvcRdx#~npJLsCI$HQySOr7Tr|HbbvkY?Rpjq-OBX6Lmn$-PuG3pQ~1)Q9wv zcp3TU9%l#Ryz+=T_hfUOP95KVVLv?I$&>HcHP~L=FqPIK^`iJn30MqPz*cOpR&Kmb z)>nxK9q-#}ky5^~uO)8@W!|0dXSCg(8(TC5b`1X1gQT!9TsyRRbL}Vg;jgict2Zuv zD481?^Tbaw^a+|Zi_d~#ejxTIn@8r=-$kNiy(`$Iekf1T(OoEL*eG6L4n=V&S0S_Q zKD>T42HX3&s#!3G1cPh%Ju{8`?$zHz`HQL-Tk6-Ad%;-W#V0Y48(l9FPQ_nCFfNws zlOSf&yT-aoHN0~{ty)|-5i)Oi4vaxPm*d(WBM{tYEg}E$@?IOIdrM9*3Z}nQpR;1* z-mDsBA%-?b0e`qXSuc$8E6M2i`;L+h?kn4zc+8r;$+NfEi9EJqU9V#d4OCah@mL4A zHGZ*G(w(^}Mi@4g9`+`fSr~GMMCdEAA4K|&_@nXIQx!vZfw_O~UhDtuyAo=(t+y6m zUJRKK4-;6uy?&!=4~UNnE)ZP_m9q_M$PlY6f~gdqr!rpFaQ@Cx-h*pbLy`l&zYm!$ zs&Z3W=|xh?$pJInd2^_JqWZU~sw7OQRk^obMEzMd@)jf3LKQD9VL)%FOIyRGQP+Zn*S^u9tiIocOgqNGvR9>8 z$xkVn7~Lf1ykwpVLk1>VbB0sA@eNjF-NE-n?Nb8jZZ*qaMN|E*D=GRfj@Pf%@0l5J zDTabJ9jAHR#j;VygiFy?+U(qCA=eQEQV5oC^47w465%dz3@nqWiG|7t{1kaYWn{$1Tl2EbCt=jl$shPqE ze83zS_83(7;w($KSp2mrmbFGE(x}A&Km6;t2m{s*iTv1EV(%Be(j|8}?Vw}Yt*Yw7 zn6E=mBs9g!efF$GDMYsyIgVfQ9E{a zYCCk%z>{AV#{IERu;my`n7U_30?^0 zcYC|oBF>Csrm8imv{u}sl2FL7js&1MKamlr^F7>W1!4d3C%rZSb5orN@+v^B_Y$ZR zlCXXW>Ou?*vbM57-u6~GubYqSak2LRx**(+7oK`bnZzg;o@<>>{ zoqspm1*15I0v!!Z?&zP7=1`7lQ2fUyM`F|{ey~*(l|q<1F~bR4`2eq7%DNB@IlT__ zBZ{h3ss2b@ZQ7bNLy{(!r#1E7JNpERJb?SU&f_f0fWo;=O;v>wzb$@a@diqP(25xW zW_EDF(!Iue^3yW_3zp$XpwMt|;HrGD74A7OONL{qM(d}*iJdq*EkR;xw+Rl>AUV~6 zA~ekImch(Q73T=U$VMB`TrJ4ZyF;V2Sh~`i#nSUiSm9(M@$g9<7SJ0ZAb~vxhjDA0g?uP z>OwYvwkQPcCtn`@14;jK7iN1Y#_Fa%O}WeuOJ)BDmMsH_(c_L zw(G;&rQ1e=Vs(o~4az!dnl#D*x+m$J_iksi-*AUL4K%k^D*QvS47SJ#X4!lr7x_YGOwx#dg{cjF zhOCVVBd4>UbZDyZ-K7m#Sz6^`+t(_rk zJivvqSyVucR8AxSiU%-zpP7B#tLEOAq;DXBO(?uz@Tz z=t|ajDXlERk;=Mjvf5ePAnreAOaMW+N;|y}3=m*K0T_E>QXimd`W@4Tg<{{tG5fZs zssuD}nFCf(mKk1LgCD?SNh5^XL3bosHf{Bj&svBi%$;YR6kkq z?b>oNtcFbLj0s!<4zcnjjZ!8E_WUeQ#i>zCRrFKTV1cR3ije=^RqPIl3Xqcz{R&(qM-3 zgshvOt)d8bYEg7Mt#vyo%Y=r#L|=R_hty6$k{sVp2kl=KQT5vpR^AuZrblUtNb=@1 z*d7pHKL*Hnd^Q_X<)Qkl>&|T@h0%qJEFG-*iRNFCod+3`Uaa6A@&T7LVhG*$p%#`m zFBWX59qJkM)o6L$-jKg9NuJtOa0nnK?@~)ot#`ctE+^-#F@+ochz<;*)8L7;$&lsr zvrdObS-7@RPIACRyD^&Cb~RT9FnloBfiY{MdB0ZhHm3)p*!|8H>o`Iel&XBjwYQGn z406b5c?)DXcS*A>onOm=l%w z{CY9jW$6~cd=n;XDKsnmyF--C)Wd7|5E(2K^CQKH3IkT8DX>9WSM@8tNYsh$Oxp9& z9@XXBq##(tP>d{aHAKtXPKw~1$yuJS4~Z%2g_p9v=7K&vvO^(FedEs`7xH%5aFZLO zJ%Z#P&H+4a%sO6g589qVd`bZZW>b}(tNnT_tynD7&T61)1r3l<58V@@T&SU=+ngAG zH`bNrl#_U6fHm)J)DODk9wH2!@}+0@t1ZqNVy)e2$iN+)j|Qk+4xsku?w5{yU_Jiz z%w~}{ZAWbc4iuF!Q<(un zeD+QxD_Q6t`EXWhMnL`qjpJiiVna7t4}*Fy%h_=}KNV=a;Bq;cmrQ18T1>#lWveKS zA;D*gWLO&P+nMB|^2dL;nAO65lycqte<5>59GZR!B9O$dWbG$SFP2Hp)8o=Mj zDf%=j{>8GysBm`3<;Nlb760-LEiw4NR>*+L_|Q=B;kEcJ3XnFA*GZcJ0#?%gGL=#B z#Lpg~4`LwvamKn``w=p1hAxaq51XSJqQefbZz$bo6EQo1p9qMWS$BFAvH7XZXr`;e z==|9Wti#)#SZD;z?^<+W9z4MPRqNksa)ZWU`)37cu@r*wr{ePquega72+}cZ*Z?gG zv3JVl2L}H1X`6A*&jhO`La+|=ndz01W{MJ=pQij=sG4f>Kpyj(l({n>ucljaZUfr@ zW4qo!D5u9DJ;UDzPD8szl&)s!K~@jaNc4x~q~%?kP*173D@(&_dX}^~Zf{b_mIc~|mI}k>8 zxy{fafdGJ5dMiQG(247Z=Onie-(u&5f)K$Zo1odkAY>+2`*OzIO)ivie_UIk)L7u&=p zOMq&=`^^ZHi_ogN)rXNSySD?`Kz=NMO%&ieMjI@#70gpd3;UIrZTHd=#|qe0S0L>C z%zhKL3Q~$)Z>oQ@76Cl=gpF@+^_rrv(mkeN`OFzIj za4c%9boNiDyz?6{+VjFH!So?y7f_z(lc2{d6;SLE59N_#fHfOux7e~_lp z^5*!_&DTZ+XnEi8rdJ?a`c2a5yM?&!=KcY*7OP4t*y~Jl@2$Jkz+!Si5+99>3~9am zZ;{=cwa+dtKsH_9C>6>n8Kft54gL4|`-Sb6B!l8Mf9!qKy0}Fg;!@b|1O(nRIFGtY z?1k~XIJ9Lxe^MRS=kTA99#u*7UE)6H`Fli{>5h2d6?y}^ot6{Ql~hr>mf8e`!|DH=G!lA3W&6D|JcCDfiFO| zXv&;^h34vj!`p%d#F@}GtEGLa3HmG!Oo#Tr@ZQh@v<&(mb(4nd zawg5^o*6(=YAw_OB{0Bn?8lbj*Cy()25fo!f6+uM?hJBaM(9A!R_s=uiDH#X=EakB zz0D6i9Fq30!!u%=e6hM#6^dmJIfKuNHq#DW6qm=mC%wa`>KoV!X?ebc57P3## zZWv>umJb}hfiefPSd58uWTT!6n$+G5(w>ItO(Ui&z1&=z4y2$;mU#F@Up^O{b?op! z3_A{Lk%s>&w(8`0b*x+R7%ljS&}cZ2lID!cYS=j&N@UnfW&{g^<*u;e*S-}kzO>3K z)EX10aX874D2PZ+X^jG!GmO|<8d9>1aTl`n#T?d}qwlaFtJz*d9>8L!>86+KLS^@n zas9~VPD@aneRn!4*!kIGXfCWEg*3L!LN#v*@o3$}H7`8l7c3~(PeYU((2azD^W7^0 z0^*%p6xLnKPhS^Lp=RpBp{yN;8-#gi79omNdz9qj*M^Qb9em&JN~9Pv3!`P-f7I<0 z6NU?sN)}SrP_m;&yQK?sfnRZKhCrYX7w%H`<+~!@eB|MFoN>#8vWx071?5T2^kdWe zat@JZDDrFQIGX2Zn~LFZrY{XMOWK{hk`1y=g-9s{2S`^IKAWyE^zG9WB&zV98mr)3 zc2B_>0*^UorS-x3SxziAo8TJES`HSUMr@n&FYlaEuG?$aa9{@917w+o)B%c?WdL4* z^Oe&7*6%?XVHxd^`0s^I)BT6fs`>TRQrFxoAX0y{;8cA}jCLl?>M{hVPjo+XfjQj6 z;B-iLy&?dfN1Xv+nS<`q5{?fJLEt*;#1fbQYNbOQ09T8Tm5fenj13{@PJw04 zy2nJon58)z_5E$KQO7E4B&&y0RjH_d6b(`avC{>>9Pi8Sksm6 zcuk41+=7#F4XYW{3_aC6tA5Mzv8SvsoNY3;l=suTOO)2Emg)=xUxP^(La57vGkSpY zE645R5NofA>g^qe^OnX!)*WEp(osP{w9?nYVGk?FxEs746&N2NHWGNNs(3jkyN&6j zK>T^wO*5B^bIf|3X_s#)7O{nfhr}DbytCeN$M5lat0p#^bDiqp=32--J1^Nx^>JZl zI!X;Fu;h0&vN#}yY^&yEy;YWbn^b*rPWJ=M17SD;ROBgnZ~B`oV-fWa&Sq0n zSZrzvJ>~Vi=cZfvC4GpY`PgvUHjZc+Oxd0o{v)5=SUoPenm$hT6Way4cHZnR5ag1s z7g4fY?VvyCR0pDS0Y9urFP_i*E}GUm3Xs#!*m?^AoES-}@dO<^Ps>C}@E$xMoe;$g z14n<~Nw5FZt;;8_Lm?U4fy^V87T1w&NWH=$=frt6qLZF(v4y~5z(oNPV&}cNmhW2E zM=K%fdO+auLvWdI%idV>pI#_yv?5!gx7jxTIM5aiZ@%Es4eV>^RO#PJ7hE)j@Z+N! z*%nPoEd6Q!bP_{mdUb@B%k=i|2eytMK`*#|m`Rb^%tItM09E7!uzMr_Mxv!$B_k9K-4Clmuu1~lEK?w$%&H4B+ zH7IvOy<5!<9RSt~bYr+BXa83>Z9`H}NF+}%VYJt;_;1=2aVSLnM+8i!0Pzm^-XLK820?wJqY+ZhA$@YG?gS0?pLp1zb+Mp&900s<1{N~Q2MGfeLzZFL_ z#eCbA_-PvKcpK!pvBCPWV-JMaZ6-0UqcrIbPYp5K@S?w#Xm!j~Yx7+hrvovY8>W9A zxG@^mYvz$u#%WoIFO@HVp-lH@BY_n*EA-A*`8$K$!+dl+uv7&6;Ks`6mz>HV(D(QC zl9>rpneGA)J=^$ur82wJ9K_HqBY1G+9RxK`p`sX9id7_2$d=~qSl%6<9<;z^V|<1+ z=S1^74LXgpfK}wWrZ+tYOXu_Dz%_S9X_7gQF;`&xKeXEhE-E6hc3vjsaK{m9;;ZAP zwQK%zEiyOMbW&o@`qE@*@FmU906XReQ3h(`DC2cD)_j)Zs^UYFIOlZoU7wiJQ58i6 zvq!JczPp$v)hAlhnyv$PCm5ky62(G#9$!Lg(aahEs;_0WY}hqOdgF1{Ua3{5Z1`}R zevPgDDsAC}-S?=S{-m1v>qe`KXlc{&mcW6t3J=mR+UaF>VfWA?Sk3L3a+j&!uC&w^ zI-8)m`N_=^zy+MYA6zj^ZU~Avolda5eQlSLoI6s%;-nauqMU!7rQg5;9m>AEQ~XGL zU<}P$0WWntLVe5lK+#;yMp*7|s@ym6MiIPZuiPu*aiyBs9;gEBXBB1+(W)?5Z$O6c3KN>Iqfxo)bxBEl?v3SuU0y9T`Z z%TYCLb7wPU>>T!s(-XPhALlFGxc%VbdpJ;_>4c%tzFIpX5B}nME2(>jWp+_}E<^z@ zJGG=|WZ$bh!caZo8Ak7?Dps27-{C^#SU_L5X5aMO^ z2~Mqg0^BVXR%j0Og=+XHWS?oDGba$yz^Fxs(OBl%6 z2GReyNrTBC{b7EKaOC$PpLnIbfHRE{m?W2{m(>t-w~q(7yagAS;XMl3U0!@I4ADM| zD&lAl@R@h{^Gs6SjANOCF^PyOy{l-pMrwsz5v=gcxzDX> z!=r_U=@;2r|7e;qZm2>-}}fBGt?V+hEk|fAEWwu zz&wNp>fUzQ>^8g!scW4_cqyPsh{_m^bjuVnoM;u|fj`8Xv9X6WMstnW76VT#$(jlY zDVW;(AqG|Z{PL(Jc4yz}U7}kA&WOJ}z-@@oZ$3=&s15IgM)4>Sg)nfFq4#}793+*P zgr=zg+<33Ot^2jhdbvfI>Vo8asBinzaL*+M@mS*_-J0aPMHGsMPWhS4@SxQdw;AFVGr#Kl z2ll#yYrL1M@9oqm9ll_OcfPsXV5xGkH3Jt;7^7|*5AYYNUlj^(pMbc>y}*~_=3(xd zMklE0X!%iv2ajqUk;3gbp_?|{wM?ABgcm|B)Ps%J#<(VM8X75e>GzX*G4k6$k3TT8 zUg31MX~XcHXove*X#^WBV2ocQvILT1-h`u7{4fQ=mG6SVq<}3(_*-TH>21l)t2Kb{I5!Vd^kLiTV z>VrO(kbIkBK$s&}bM2yT_WBp7AsSmA32J%~!Y6!`HIsWt+)X-=0rfl&KBc(97`+e$ zqN=a|nYJ3xx1dgnJW+S`zRLY1xM+RqDkYMSzh~d6x5EWrg=6+OTK^Sn)_7xS&lCgvDL!e$Qn~t(2I6Jgd=x&4b`6i-1=;+Q)l9gFuFq7E;7`#1|lbPq|HzSs+Q*^ za6(^yc}I74n_|=i0_!QI#+RyQ3gR`yz^ziv8kH|II@|a-oALC^23O5oaXWp@nc^pA zmFKq$9rmVp;nM7B??w{=?35#1k)bZTPqOE8k-&SA7n2j8=BFUkE}PiclY+2vE_XBd zOV1JEm=f$kTawC(sIR}fzpa0ALlqbHOB(!L*!H)HM&!|3GoyR2VLKK>lDcUR2y|!9 zgCw|YRd6%p_8_{#RI1Sjkv@=hRRLQ}c}$iFRCa&icXh$A!BAW%U)GR9#^FtJ3ATy{ zQoI_+B6okiShC}EEp{;Dl0&|B0`8(-P!c?4K&SCJmGXLj1+T@Vy(1TQ%`(BeQTCmC zZ3=3n@A%AV*v>|7efKwMLyztj$h_9I*-@eHzktMt1IK;kwkCg*f4?IKbx*=K^eBUT zv6I@8DD#fc3xj6!nGzp|EKbF!COM*>LJuSOC)$fk ziLP{-tGFstZqz67&dD2`&p#0GMSmt?F*(f0i)&y&7T~NuWdrUK*qv=sxA9*k^o6Zm z494(}H})*7pf1pq{%=-d@``xhf*X2ZO7|MjFiJy$bHy!UZ2h$(*?!ghw^qj z@vz$KCR8Bjl+YjyPq=BU6>O6)ewQl!l{i<`EJ7UmqJiI+H-T7)tbJA=9efl&JBNBr zzGx|ps^PWpZj8X5LCP&w+1n%oSIu9D6^+a}8{BamQ8QUg4cChpt6pLD^?jsu#yk*n zb5{dW)esl{CfBjiKFuIIKW!}>s%3Q_$`=o{m+yttyZ&UJDuhmcZwj6 zdCWgod$1>1Ep_x1Ond+?WS*+sePNj=e>HDLgeVj)eVIQ-R^4J>e$mX#pJ3(u#CRB~ z3+cV^=(ZZvzTISyV!mU8!>mmIk~M{JuK(?X-(Ix;|MQ>e6H`=1!p{4_uQjT{z+cA@ z^3t&IGI77@0i<_cPvfAJgp8uX!Q`~T3Q6HzBi3FFjpL}}1M)>4v`tp0O| zyBxDj9Y_dx!t!TVIr>`vCfG6nQ>>2N#k~G70NyA;FRw37NtPi`bR}s1?6AANl5BAb zpKj4^qmfWmQ5$rQ?cGQk!@y_VtD;;q_eh`U>^ho~7|=H0khYDqi50*B&t(%27Wc^iTCxFvzSxtce_@We;5!`Keerrbp3@L z#xWw&laME3xg#3#6usc-e~CJrim>9Fv>2H^QD~x3mDD6nywTW?ojL0Ca&HTUr7Yc| zouib?d;BC4-XMp6Qa}nqva}l`D_)+%@>ks3joyD$0$truLF^zAOn02$k2SQ+*NOhr z6X+a>IE?hk$Kzi-Ls;oV3f)zCbWU!U)J&3+*&5ip%?8!Znb?_KwUs$O-zdv4#iY&%H9@qF&1kuFBpO z=04HA7hOat=DM=gq$O(3x*f^dv?Wz#%e-vDwel^D`knNlE4%&3iqjR@JAcw?q=i4So24=FnRL@Blfj_d~WO{a%)gI z??GDpHxIS%(?_qO`nX?iFllLHH9wWIF<^5;?yg^+c{QZN0M za4nsiPdbdbVBBxAIrSbiDbP(Kq~9n(3_nP;EmCLlZr|%3dhH3+k?Yw>Xv!xv2p`|0 zp=FL>&Uc#o_H#<|2^y$#roP7P{kVgo&|c%Lqq35)sW&Z`g=*ywshdK>x3+3zKNgw5 zpg5~(c^mEvAT=w21IAM?!-D6>+tP=rh4w8f>U}|^X7&O`bAUPHn-V_$$HQ~4%s0Y^ zBZA#u@~H*N1lCHQK%>s(PQeVE7B>idhB|9uxOY(RQ0YjW2&|7k7Ocst-XP%2Lm5P{ z$&{`F>)yd$H*_#P@bd+wWQ|~2{T{a@zXhys6{#pM7=Hjp{rHPcl~PuFkM>uk0cDMH zq(7R}ry(kTqHyht0+h8}=BEo=ToEu}+fKQqcB%`VXjTzZ-Fvcq5hHpBGgIKS5BK-Q zY0$>~sM;dtbF+;QSinSvCcV3b|M+a>(&4*XNNG#gj{1G=c6yyZeoRpAL?h~YEIAK- zbQ~6vaW+{j6$t<%o-pw_Q{a$5tRW^2tQjyj4!~liIC}nzsXaESTjFtjqb9Y%fJJRV zuxbS0-#MW5b-D=7*~a#3%3X0HWBSHqspdOSthy=aCCKEH5Od0TF%69cbWl&-s;C7R ziC%tvq?*4x;$~aUWJD$e6~Tl1nt}J-RVcox|qq&swMThmgAoeGRD5u zS4nf;ac^(Raa+x3Qp3X+*1e?|+`v;FOJAte=jGI>1hOHoV)i3|qPcH}BJrb@0Px8p zX8KC+)YJ-S2Fbr2j#WMOv{{|fci2Khtn^UT!jKMt+xKn{DBi%@@clFfZk+mXJ-JKdBX`)2n)rNc^LEyR#yWmI+_!fa@< zh`*~{lIp;9?TnD;8w7J{#i1=lihpq?QKqO6E}FK9hc;VENMye&KCz>bCF;DMUn zo`v7nKHmvL00(Fer;f%`@32#bk)x)SY$icdAhieps#SP@9 zu2mKWKa`I=(6b04*3A*v=HGZE{47=9vRU*JG$vNOmo)&V<9i36x|U7MO?-}L=Q8e! zSah*0fI4Z>WHVARO9}Q>3E3rr`B+_;=mHBe4uKmbn02C&U!Ebj9_^jK8QL@1ZJ*N5 zs$$WmI?X&U&|26{-+@#uMoa4_b+I&S!XSkyG7zkjlC2oLpM78{8A+PB2=^ zv9)PYni3hp^#^d;ZxAHNi4Q=(KuH37D5H)&1qV(S;J=PE#Pg7NbWk~YRWuH>nf-X6 zWLP>S$b%jT0BlSmm;s)R6+1p#KFFN8xnVE`>WJUFMNVuQ!|N$6Lw_)KQWi%QHqr!{ zKl}JL4Uv3dC7I`eDy#$+10bVxDDpsYB2a~d8b+xnj(@X&CgXd}*I3n=F6U#EK2L)x zhBSaEE+zdwzZ(%23+4F-O-Wh0Rg%GrBjUYSyr0@hZm(O}HZ+lE!N$Eh`vo6yx?_jO-o5v-SOz6oKkklwvHIu<*Kv(-xN-5U5o$+hAR{nJv<%2bn1F4Sy=UYYz+2 zH%h2Dt9fQId$aF|?qDCTwOT5{l`ME2xA~{mP1)H~w9e1J%|WV-m;3UXa|F{Hz&oEg zK@~VBsk#WJOU;ebmHiV0llc;dZ`tQHyh{r{Vi{t`X>YKOgZhEMhHn2TKZkFYnih{$ zb-NRf2pAuSxTbP%9v3lb0N`_)cWoEH{cF|pUsj`|u0a`41C^)CK3NM#)i+duR~)t4J7d9qKvSZpb1xKLuhZ+jS1|+QOiMz>d%3M7<30~&xfPhdAlq`W^QB<{Cg?o^XIth-` z)&xzRF!2VS==swVNtboo8g3q!@FV|m@SsIl+9rqHoG+X&*}RsIoLmV?h5_#V`Qt4m z@?`G64vHYPOy>W7P`*#|w#ux9oqvY*6(Ih1J^rsjy)^j9wU9?fbpRQb4ybN&M;?6si9NCuhYTz}%*G7{Oc!8^<8kU=&Hzjj8uIOZJ{Xo={!voU z816)H*^n=ojZ9~%R=q6FL~v;d9;gtn1TYj>mGTJ@YpB%k^%>wDZWYA(JLM&P9*qE| zh9Mf}8eyzifZ6oc0IbGqFqq=P!@+8RZ&io~Q5#_cdW^t(=j1>~exJO!3=b$BaPZuH z9SLd|M#JZ3XaH>@vn2dEex#-!;CU84-L?km^X)aG0OFM~gMrukPQ5CDj~!0wjzxdJ z3tXu@#KjMjl^q(DxcVA!4UA{~-i(3g(8;q_xEj_zngmXrEJxhjVhvCJ`(gq8O9q ziNoS?T>P+qVhOA*MNDSBQWX&(fZnQpt8A&Je^mvFnYr@l#7Xq?50H=)2GD^FfHq|8 zhM@OCN=F_fS_Iq>Xd`GZy+|pxCD(p{phnrbZP&A_Ya5XZIJJs3pXY`cBo~)3zlUq~ z@y`IvsoBo+drG96H!j)N6%r?|>T{DC>sv7lbP+%+L*T%+;N-%Terz8QhTenP$5CDK5M{C_-fzIIU9+~o}ijjAP#U&HY4>}pBX%LjjBJ4xinz#8Vn#1L+Y8q7 zlIvq9RZjKTz$`MsA@xSKW^L%Uu`~pi&wG?-dj{vxvqO5Kufg?Hn{%HF5K(<`hxJ3q zMz$QL8<*|bp0i#E3>lS>ms;%qGB|9t6Pc)he;XOH8lWlz09A=V?6#(fRO|l8hDAk4 zExVVN%6%mE-%E8uM$__B4(u^l$UQ*m8lGHPX+@OPACo<6f3}bWN=}!ROXWr+azcJ-D1mt6hoYL#knaawXQ&h?_GBno;@dC~a0JBOxX24ppt1Nd7ijdumM1DOXf;#sCz=O=C?^&w}>n>Il z{TE!br@V`6y3+sa_V4XaF#|J#CeUKG`4Hq|SDn1YNagN0;b5B(UY_);hKWnLpjH5h zO}OQm$G94~sf;pqtF|V$q+%EJ!dPORRJ?94dxjX-oIO0qtn|Mft)W~!DFYWXTuGz0 zlm#elZw@u`-a~^cN`>=w?T-r?v(&B9sSDCALtYX+0g04Ll`_?vw29@nRxoNcn3rAc zrZ-L56%RxfCHkIrz0nlt7?`*qP147uzDg&^&A~yIwL2VxIiD%{=4L(^(v%$S0=B0Xbcf`UX}L*8OTAn9t5^huA}qe4I&5D%?N3ZA&MKe6xv_{V&(ouh(Di$?CsDF!nG(e3^BRc*gSBL#KAb)kvyU2G{ti zPZ9Us`Il2jbP?XRi>BStF@~O!hZ!II+4_^48|KEFupN^xQ^py$2|Gc8+37}kYmedi zbR&{yf=|XvVo>|2gA03v{y9Q-yMuKrP7zb zdha?C@)xbv9q3`Q6M(TxNmKyJG-1WYzOu84mpa&k$S8pXHiX z<+-In$bX(8;B8rNWq|3%5A%POa(>@~Gcop3G>he7RYuxP>MlB~fCU@8=!30rtMv>l zwH(mavj4=uSf-$UtM<~t4S*XWvZ6@V)Qm*!an8WyKPZ@o;TISw=c4qrq~1bhF4N;^ zR~=z*<+}^u)2x^t9eS`2uk}GbtKsDww8`MP!JmDo~E zfG#hOZ_2lP>Qiv|QlBr7@YOiO46iw9pB4P=oehPi(9`OcM=L4Ii>aQC6FQN(3Ph#h zeWvi^PKHLe^%6Xa*r=2Y@?GBe{wbYcE-i940&}O&*@t(ul^qOnc(URsNdi8{;;$?p zwmT;w?O*1{Im)mD-Mk%krX!gW#*CoC9Wk&sKM8rZ*}YDB5#s%o!Af`KOtenQ2J42q z&m2DjmaUnjitC}fm96@xEi|(c>Et?=IO57|-1&C@{Xce;&J9FtB7LIN%hd(5J9)5R z?rF@$l4dSnzMV?4=^3N~62cFj+lxdPKWjdnCrF0zEo!g4)&w=jISY;oj7 zoxL#ec3AAdhPdYGo*~aHoe#;o;tNYa!Wh&kG*5@(FLXoprH$5ripzZd34DPgePXtr zjcpm7zVgbOmK4)`<$A?Nbo@Q8YGc$n(q&6j=EGoZb{Kcg75-L@x~)s#8)74o8i^!P z)0%B89}A^_bd#Z9z3daQhXle2apI|^U2e(7x*8=7(p7m@e7&Qx)!*;+u|pkuQF60) z>zKrrK7%Y}q65f*`^h&xRFxsNu~SV!>WXw79`D8B-lsnMBPzg1K{k$w?T8M} zS+J93fRd!6RptWauhqMOCkM+c9S&XDz4~R((V0}aqcF1!zFEh^=US1M_cUWSya|!T z8nUzD(LLd`PBIt|3z1mPztwTVa(WqYX$xqlP-SaP+ddU)d%n z{m^Vzaud73>l~~9Oz*yE+0q>o|W9V+`HnP)r^N*i9}G3Fby=A@FvajIWlt%l?6M|B}L z^qc-p+Qo}FE>RuZ)|9JD@rdROk8+Y#?`#~utt*v218fF*qOJBNso{K8wnJ7i>UW(E zqMt5H^<^^OLk8iMtIHd0D_aypg`^?#ygThRp7i<+WE;CKMk_&}RYQiZ7fO3{4u8!k zF6lk`t|%HcbfvN-2!=QmT@;A8l@Eh%Gu#7=gqQ5oH6tS1{m&gxAbfhH|9v25IF5Jp zULEtb$d9bFOTN7EZ{^eCfM!rCf5oi1ptgRh_El-ctYHL>#&HC3BxeprGhIg@)@lHx zpDZ6J;N+UY+bXt2KyG}1@505)T)=c-lYh)Q{sQ*@JF4`0?{mX9pqO;o)o?(0QUTyv zq~q6N0NAux)c0IqRP(eduaT3xgkqO4X_-3aZ8=Zf$Z_AjU50LKTRW0iM+_E}9U+{t z8DLvi*lKa?vP~=33s&s>-MuJDb>gm!QVNT!YllfaXGFYp?Si)jsXV8b$GpSlw}~4$ zBbW#4201^j4fyfh`ETYw;0KlK_#@E)oi9B@j;3ap0b^PhEzX#BrK2x<`P8zQ zSq#TRXexiBdv~4dvOYly^#IfFx?t(xDI)Lo*MM;>d-ks!iHOX1pl2dbsmpVDg^M28 z>QfIE9)vB+5Hoz=?o|=~SL9JvT!f*w7&<;9{+Ck6`ASh^e?9GQlt1WGFYjyHFj^f4dEZgJV&Q0_AXBHe$0kf zzVG`UH?b7+7RI4l+8Z`I2>(O196%&Zu1xM@9ud0$tP)yfN^1<7x%a~rn_Bms$)c-| zEX^K%q|n;r5Q&yn3yC#c^6m=WaqKgoZ?8@RBc;*h%NK}#Oami@IBx8pBO>f`FZr;I1qld1KfU!bFgMtYSNG!ZO#Imx2D^oXyrsc9D! zE;_#U%TnZ5Pg6W=*MiA;fv~!|6m4Oj>G+1J}y@A}%Gijh62T2c?{DJ<~stOT3z($Td za0l(7iSX}Sya#rm7GBHpbscf|LR}D^*!&&1AZB%&bD?Yt2=tYEqc;TM7*(Qm*VxEJ zTL9??WlT!#>eW6a-g1EMkd#Up_7}rd6%uNWU22R8mgY54o8)5N?@T2Zkt71#&M@lr z`0=I{M{Y+{*`re&7~%0Esvr6~rq9>SAO&$GZSCah)LUhp&OXw^L(dD(F{Fw<`2FnT z9u;A$F(B0*v@dXA0`pjbvC9DOuh~JU;nz?(G}g!-@UgE6#@jck3o`fU+bPXYn-VJu z-Bn!34@B&ZXWiTUD)Kz1`aH;`cD1>tTf#w;7KPo-80`%PsiD~)!O`FPd=gZ%0*}`- z{2)S}US@s4z$;-zA4%{u@1daWMR@_?g)LKqx%@4GJ~K}5k3Y?tw11;yOs5SNdc1`) zaHv7tKi`bi<^P1)eba=t2p3qbB`>BTUF*uJZU{lLB)I_95?#fkKa6{YsIMhs*8< zoJfEKnwkCFb6M_)n5gO{zdNL@oW0DqTz(sQNP)3{4{!LjY91Mq46&asRt6UtmE-EI zQ>;5G!ML2q{hfXVz`?+e*U3fWC-VnM&i+kRN(ONC&Eyw#?V*z&vE?7LdVDG8vy|<@ z`FmyRD%%@n!oD>`iRXX2`MSvSTPy)Qd7|IxSb4pT>$4#2j0qmS7ujHQjb`vw{*p#a zr5arAa9vS(Map=fJUKadpnFt5r7pAg{w9id)n0_YI-UQI=wzWGe~W$CAebr~_f!q+ zUvTG141!$uMd*}Qh0J`E=PzR1s6c;Xr%W~UR7u`IS%5`lXj=D7s%+rV!x7RnGpcQy ze;u8O;GV5ii~AZRP>1uVD$zEi_xMxLO6jPF>{gN}aZkHctfC} zz$jw7^($iJEHy1n|7$C-4Z_ilpnJ7ETQ3PrT41L|Wm*#b%(U+q5vMI)`!GHZe7Amo zgP!NNwOj~KQQK32m!@T(B1>qt`G<5^Q*IROQwuJk;I17&1$Jl2#bOROxO>T)U3k>; z=$gBg`-^ub`{BdtC_gpUDIyM%zn~FC^4S|nt|#?Cx=GPK#*7w;ei2LCu2(ikelO&) zBHEEJs|C~tF8Z3BSr!BIJsnUpyg1_o|Ym1mckmGFEe%Q)+piXaVX&& zmDsewOcLd$RggK`*zJF1dwZqYPvoXJ`}Qsr(xFD~N>QQ09yezS#TuPWOWSxV<5&McGl)Pa4d<4=6pA zJBm=#zg+&_ZMyse{Yea3<#FpN|6;?Z!X^9b-Qqf~vDK+tI^VeRtgjTFT(VOr4Aky$Pa*ywveA) z)7mM1t;#U5CvY1V2xJ!WY-Y4+#zqm`OQy;RMHlotqkL|BX{P6B+MuJrEqnG`TvCH7 zv`2=E@;yYbE0}_l>bvyqq?3ut`$CTzy}T7epnrj89Td`4HE7?&Ia+g@3Mv7jw+KK! zm#o@){b2TLh4isrDn2GA&6SjB>HKZZj^2>GzeILl`G~E@frlb&r@Y@WH~FXPVb;Yb z-N(LzQ#Waf@S_5?=~imT739Tway_KIPma|)0vDas=r5*s?(W}@80eOdB)H7Frt?RA z+YPZNOZB=v%hgw_X{nmD9VSZietGYl=fBmsx$7yvamhoRT69`Y>lY+74ZIIoDNPBw zQEVeQgBf+I>&ynkoh3W7cT|Z1T<%u zxmOWX4J&DNp-X!-C9kVpb3nODuPxZO)N}`1_GEufu6=Y7oNlEUp+WJw&pho&byh2M zvwJ;k6Tu9?lsId)U25`$Y`&CC916rjVi+@zMR35Xjuj)DhO@AeULT$Fs8i_cpNEto ztcHH`AtP)8xP131VxB;IWt!aN6Ji%GK5NndURQCbWMy?$! z7N-ynESeYrR)rwNkBiG69N=CaL?$sKBNsV|w7Frz+kDLdJwl+SNS@v!qH`U{f)&qVA($&^K KovUSe`+ooocr)q% diff --git a/applications/Volkov/artifacts/mame-p2/screen/right-scroll-down.png b/applications/Volkov/artifacts/mame-p2/screen/right-scroll-down.png deleted file mode 100644 index fd2b9653a5ea99f51d1c6aecc6e40b3f71da446b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13089 zcmb_@c{r4d+y9_aQ96}(SocK zk=>MSEW^YwV~m-3pJz}yeZS{@f7kWl#ZXStvI{%rT-fuX+cmdzrYArQ!xvu93U zgh03iAP|mS8##fWJhQ%i0|GgA|Lo~gCO(N%NtPd7;2qQ~_0Us=dAvIs?w-@q=4}0l z4y`6$3%R*b_2?O+F>6VO)>9!5c2{=)nNaDyP&k98Xwx2xB)oLqz<*kZKh)#XDXBli zy*`b<_pj`C4I7Ck!@dZS%{wcSi+LF{nz0 z|LkymaJ?jJp{_qqD%r<|POXM6X#M#KJqTfKE$q=Q?gy{mvhC`&mKox^!5R8`uS9pk_AR1An(uAjNRC#^5Im z61JFSzq%MQo7V97{CklJoyqK-iVrfdYS6s)Wji9%l6GyvMq#c*L z?&$F%He1;qW)*Z+e&8l^5I1spBr=3~51Q@!xRER3k}vDFe9DLCvfgTCo!Nz<>XP&! zF?GSbs#}&HH_guJx!l0bB@xJTa`Bgj?cle)zTP{}N^O6G3JUfe$|K-Q_B=66Oslrm z32%$nc-?JK`+4i@%Kn{ma>O%*>4xtw=B!75NFv{V{;7&qp)qg`wu!lL^;@=r<=1i1 z_FGU1=XwRoCjN=S259D;moC;>KkSr5 zq2<~L)n?j~mh17E-Bj*R8~k%*wE%#(kaRC=4lD z>kMKhkUy!!KvY1lP!7EH;;?GhMANgaXT7^6eJCO_GG$w|c?zzX990YJ8xuqapO{99 zy|{SX5rHM!e4jXqo*^j)){rAx_#WESO5NF3Q+0BSUgno0cRsyqslv*8N4-?imdLn0 z-OXveK0C@Q)^A{!FLpR$oKzPOH`sI}u&k3>zdHl7P!-x@nkXvsrwtfxrf|HRlWg_QAj-HmhItv~F_m_$)!aGQQ zZ}9oFQQ!b3LEkELPe(fS!-E~YSe!b!>G57&34dZCb2jWq*;rqxdz_WuI1a@m z|2$30^Ng{Kaw4C){}us({`=|c&5q?hK{F;@Bf9C{l;hk_Lfbz|wUco$EW>|sZala# z*dQCYFG-+Uzy)+a#QRO=9k*|}345~G2%FC_V2sG2Xy5oy3sfwN@wL~90oHC;QNb&c zTvJj8@j^UzPNHCmAqQ7cSnhBr)00vY&d?*gYd9ktpxJ-BQ8p6BT=2RD!Y~aulT&`_ zXoS+hn~B`#uZOad{eXL$E+p%N61{NO{Hcj!#O9Bks#9cmjeNKs zPGDl1*vwU+mK!BCUYE_VqIXK}J9#*Jt7hIgU`9EyGu2hfmo_9<-lPvkbArVxW6l@V z$}mK?Y){?9ZvNX&(`N+t#+a9HT&fkVbLu=!@`jcPo-EHkmp_RxaBAwnBBdaCkCx93 z;tm0R(WA|h!kt{XfyW)j&%q@l0IzRlHsc|?>48*|^<;OXxb^n!DTarm!D6P}OA16? zo!)2X+NOSHL><3pf;)ASiLmJ$=GCF=;|P=wWXt1N#-@Ak*pFD-%DtgVln{MrOWkXC zH3@@9kPE3`<=NM}a!ezR`#auOp>n3BgALEr_IJ~{t#wU=b?GIj%g$IVvssZ|&qdTX zr%1JLQR=(JnD0a&X(K=*uu_JSM=S!ra!Gb+Iq1c#1@lJcT|aWO5-`HwOc8n$5qU=>5ao!D`}$% z1}RXD1yTbdV5VjYuP0YIcTdntd2Xc{kwbq5y1n34_di5;0IQK(mXFeKKIYGAYb+4C z$dh7dp+W6)@5KTDwpiS0mB6IKjt5M%=S<;uNa^2XLCHVyJlXDOHU`ub14Bdc)*s=R77$4R}0uT%Qzj9vfs6Qcy@b z6%;~o+$n~@`4p#xL9G81 zuZ)RGkDh)B`%Y9eGb@VRz*}HuvR{{Osu=c}d211D+8r4J&@`9Qk=Qy(RDhbY@9gl~ zrMFV;ik(-;wW6+9JUigMGsXrQ#SDLHzc)2ba!GRbp_s}n9nWIk;z}_98TGD!7lm=J zH2Uw#v*cYdmV-x^IEYjRjDYBXM1GnJ0^e{`H#ey0$1!_!*6<1j#N&n3Z{_> zI7wa!-{Hr>Z z8A5!Rdu>tBnwDXQ(o8D=$5TF0h{DkGG!?$9Dcyn_P=Q3JhN|>n8I6wqi-NmO5AJZZ z0|ZFW`t-%Wnd{A<4-B$n&Srke4hqQo3`M|s-@lo=d6mxXAOdfSp0jO7;u#iwoT-*3 z+_I;aaJ(VQ_4Khuh#ls_S=|p*&<`3xp97mh-_~ZS(rs#)^K=e}JIg!^vV1_&LApz#!7~N1-WCn0y{kk}zfnxZOD3EH zqHtmP{EE`mw`{toavhd-+cxJY!~6-5^LM029at2(=Tp=kEUmwrPtsaE()%5J4UPg)+#p>8+eH!tkb6=6uO26aB^( zF;+=j#{sr@*Tn<0{(g`xhpiW^Y~oeFXU50>sI5o-fnVqnS2aboOi(s^aD5t&@H4a7E-ex zkcL?XDOKao61GkQ#xyTWKWT!w|1$Q*x-l9!B$GETnZ4y(` z@6~G$qjyg&gaN)fg*lfsW&b4vw)E|3^4CwGf<9UG|ogZIUx2 z(G>b5-XRg78dZngJxEz+*aItonE)LH8f!rD5L%Md-u&>ugI{Nru(W0hsSZjhq?52L zP#Jm!%y*cwaI7U9#eHIlMkcFQe*;a!PeJl`<+mN+lV$e{`^ko}?)ESlqrkyH_pjzN zk(2crMFNCXaJhl{%m)f7+5qZ%t5jS}!_Py_2lURsz3gTX@OqWxBvQq2l%5s9^TO#V z+RN^0b(X0+mi^JPoN2>0Y)HKUDxa#E2-lmesv&XGLTe8pLM@s?RhF}tba`q9RB}t`IuX|r3j0m_C*qe%78NX576W7PEL!gFwNWoy` zMknxtI*<#-GOq0aLHq>JL;lgDr=$rrvL@A_|0_*LB?TU}Wwn(S9Q!d4zi3g>8J|7t z9M;2|o)Z!Af|qn=2%Equ{{<0v36MPW#4_KkdX$}q160cD^Gf$xhMPEYSpS&~%|vm; z8myx4Plq#QNz7Y;X!Wx&ohhkt#7N5Mz4zd91d44)Zc{!=_K`YVe1aZKy7H=uoZojOJ)bW7QhIl8bH*J8LJ9@(Vg*TgIf7UO&&Em^IhNBhJg&xvjrtAIl%ZJGf7wQScNIe~zNC8MS-y|HJ``>tniG?Iys+2`lwra}91-neCtO z-drsGYaM;s^STqbt-V2&!WNePEEkWIwu%Di|AB@o!%z~bMkX3;pLlk$(`WBJE4D1$ z_KWquH5~&B)8GTxC>dZQJfhYojtQrSTaoCrVqH;$6d( zBKa2&Y<$t6rC;mFBZ1pe$c;iXda*BF<10~0m!FHYaF|Oi-xp^!r%~WJ*3au%14TXM zL?LOQt7_N{$d`w@an+1FH`wqOT5`uMUB1Z9g7yWu}pF0jIgWXJ151!5nJ1HPr#lF zKO6MSXuoAEwslmsi776V6?au!$n)WHyR8{oimQ`@aMdD3#yMUrXhzePQ6L`J=`i9nfWo zkRekSmy$HuNe%$YwKF~QO{DD?6|94503ZUyWZpl42su=7E>yp)ky(w6JJz`D5_IXE zctAsui1u6M`G1I*m0+l?#ORc&*5>~84jbY1{0vd&{P!e;Du7!5xvM7btaIRm*B_o_ zTSB9ii_3<*e{dC#HSvx)buf7_?-#lS?3Uu9NUG)kX&}X`**;k(Ni9y4AykZaV(Bb9 zwckflukhpw2Ce`b9Y7VpdKtcO{}tA>&ooG_HOfX(Kb{hpy{v{JOa3F*Ypp-6is6p%|w)6;A!= zoRuVK&e;SQMNQx^nxOsANeE-E?|S?LoDJqlE6kunx}$gpT%4_;vu7^E04KghLC zZSc@Qe5E_&z$t$BA{0HYgEA*~@~`Cs{R|6NNZE*kW}X#Tl`C}L?FPw)2wkx&>;!|MSU0f@j~6ULw`{^40>i}mRN@T0s#Z38t}Ie=`=v85(h=2lhRh~*AgPOE+gEN>R) zi~BZ7Y?cAS1fLZS^g>Mx#;2ej6o(M!HJaRJE>A!goH z;Y`qhm2O{~?ad5(+q;Se3Y%J$(O7Kw40N%xR3KG$O|P&6V4B03nhSvIgx?0_m$@wk@IPB>mZ9R8 zxqI$#DS$npVp9l|Q&Srj)FRdS?(NBIWow`)f5!2B{&FkXO6zDkio+{om3bfSaaFRz zN096PzHiGC@C3&8&*gw*g-O?nRiDt3>ubYL4F=D)J^!x~0RW~}WsZ33q820Dwbu1F zjWCXYNd3I)WzN&pl6KkrNp&?2n8UD+oYeY{s#H2YM`}G7*aMoBT62Y==Esw&vVsUd zQqBxl^c|1;JIjEc$&EU^sMK>M1dsJN@*?~{W72{vheC)E0m+v)C)dn#c<=J9|1xT} z%G?g(aNG)Z7o#*9IeOB~zJXBiyNU{$EqK5(zR`L%dtH|Fh$G7gW<13sctGt-WIxu3 z?ttwr7qY-1i9jHwx)Bt-wTnu2i7w%DM34Uox`2gX+1T)n;MIFC}Q&WSCh;u zQ?Lp9+`w<|u2C0_T!S7}PT-lllwOs{Q<4~690zu;La`A<;;0a)|L`J1!S*# zPVkmt)YNX8ybhd=AzCa4L?ks)*lX&`T(Hs#*^rT|#(p>ajwD(1y6OD*O5LKcN1p?= zo6?F@S~_gnO697KGQvK|hUc^&5#YD?K;{O<2}r#V1=8#l0W#$vo>6$QfWYk?V?T1v zSwn;{CTqK?nkY0+yy5}`dC+z&dbR%6OFn4_z+CE7ReqP%aFo1u1mcU>iH1ZK>`s({Y;sd`14}@6m+4mUbxnGwN1j1 z^Y?NUQ0wpeo$Cg|68A6=#8a1N5>SjEo;QC_#0ffY;ClZ;2#(b2jx2kr*Y||G>#&Xn zUE^-3*E?o$N!L*zO8l{8kXPSFg{AeJa10B$>h^3pwx{#fpaSH{W^^(`A~aCsC1x7o z9~N2;*>ZFd9V`OG$VMDDh>9ZOKz1Kfha@=GR>9SuZiYep-(_oIxzTn@lr-kN>o@HB zPhvF)0Z>RqY(BFX7>~b5u7Nk~!kj>_oANDg9aFE~ZdfBcf#?8MY=*2JX2h3dMiY?T z{#RIN)oQh`YWRMsXzu18Ns{U}@hE1A1ytzthzic~rpcXAKjZ3TLlw`_9>h}#dO%y1 zSpT~&KT0%rmw5R{BY*bRVcbCMJrwWOZs0ccaAa#-x67B;H)ucl*ck36mREhhQIVvKSQ37}{5io(S`EkthP~i5ob>&ebTA>^Z5mIB zl@m@XsjI;TKjF5`QV$s~sh^^kOnCiyz)*P3{>$a3uNl_P!0vYVI@;o3$lpg^1TR%a z^Zd-^%aV_EhxnPJZw%$y-JFIEE4MK`?pp_1l&`ILEJ`2~@E7sOl&wWVO zo5l9`yggZua`ALR%WgibHPZQ%dTMusK#X%rTxQ^n1=IYc7`}plixj=P!0k+#8$~95 zz}}mXG;w>;ava~8!ecu{3d;MJ>)ndo?N>Kn?44sM|H|b5+pZW+nPXF`VWAaj~Mf z{$*>}82U&Ph+xIw_3Zru5E=7rPvsBaqkG}kond&f=)k)I)s>9y`Z(JJSubfWBiCw~ z4s#kqIl%beGQr2(HlLa2&RKBn2QRL1jixhh?W-=xxA86!u&U*smE8Fkb$^uiI!Q7}+{o_7lGVEi!(qPfzkR|N|9n<`kqA)J+>{3h@I(@G-oX)t-bk`@DDVG8Z*kS97TT_O(6Mv zfxs7V+DRMMtozr3lBN8w`=}KgvvzwIDuq?^?*+98;m7taH;1DqbAjjHe|~)`qYY*! zO=uXPAi{5J0I;@g?S+?)e4QaE4)`N|Y82db{A|*J?WP+n~ zn!$u5h}lyW%^a?_vJ|lxh92%4B|D}CDwo$?cH7!=0ltSw6Mr963VyrLti*^O*zT(! zA2fO<6Tf#wxpXV(T5Zv$Ul@+D^hhq3wGtug_|$$QO4!$^+--rWx~7QA2*k*tB(${i ziCKB>@TW{L){Q|%g3b?ksVMX6B6mp?l7H(7PnW`03~?~?C`MrG9ln~&yl)(KsB+tW zw&_aqrS}1Eb_LML*`d3y!LB9=I)kg${XdWL0RJ`pJyVDF3~jNqu5`!9Yh}cot$OD^ zw@Zn^g*iQqFcRv#*-mK$Q(a^p2!b1<7qo(Ph>~X}C*p(DUjZ**Bhr1+QfA&uiQAz=)$%*>eqLA~fcTo2JcKD^f zSM6F+fX_;ckJzs z$WVm%okB~6c4o!P$Xa1lN!*Y!Ra}F+*GyK4A}(Vxlg&M+YZcPd+2TLe7rqdowROs( zLgCJX&Hl0}+bphrY}Ht#oqGp%_Eub=mw?f)i3W>lIq zwYs@cPj%G(`24Ln6*a2jpjflX{P7;qoInQQg_u4+tBO2$ zK9qcNLvEL;tb!QDmMrshcqwgbd&N?>?7(LJb43N=K8Z{Qa$>8!M^(8AxmJa6qINns zB9t!jJdr@e?7(%EVgi+!c^Ypcp)Y$(?+I!s**}wh-8h8L%x_mY9MT$y&Q?Z?=5U+P zUe?v@PYdkOe4kcmdrztBaJFy6^-dV#n{?TS??WY|1JOR6{+wPC`gmtIs3Y177eR;8 zbJZjXM&Z*=V#G0(t`OtCcU}2g>500HwsU>zw0WVf1Oek6xrfzA(pir9{^Oa0Vu976 z89S*LLyURfM+>T1zyD_KM0h8Tlbm2bnA&SDsR0kC;ZxW>$#1X4FG>}N9!{yXl7J;Y z9qh4ek@DMGTZP7{mGzCkTJTUi_N}UA?<}GHm21}9uFJcV35tVF)Z!uUHR;E|y`#08}zEaO|M; zteuoyd)tnyRV0U_*?PUa*5W>k?Ph~dLn=pk6c4Bs*UXGgVb9k%-YOH3;p0#2c{hH# z<`Ml+k7=SojgcTuw`NCAr|-tJLV`THes+PXu9sCN1TlX*{aHLgobp(vy+G&HWJO1c zk?qKbt!M{V;xsi{ZqEO8id&RVD8bf0e?TeTBZkLdLhFavfB|Q&EhFE!T66z z)f9)NaxqPZ3Uo@VVGOJ9DhjD^B1qBb#ni;JOIxpQHzeP_?(I>9x*>OV6f3*2$A`-t*SBc16>v72kVTog>o6(&a+9g;8cHIamMp>h0taNgpVs`+`oeRwgF?sDt_lS`7WMFpmg@;e*h!t0oc`XE{B==~c*ZaN#CG&|syNef}R z{I6zR5sM{9ppU1rT#3Gpy{rZR=0Jo9;@OP6A4&-N`(f- zd)PTc4DCGZZoBU?yy@vKv+JzaRhL~Ct~%{9zIFSC3-AlzKgZg|&T8wQ J&eycQ^FJFzrvm^0 diff --git a/applications/Volkov/artifacts/mame-p2/screen/stable-phase-a.png b/applications/Volkov/artifacts/mame-p2/screen/stable-phase-a.png deleted file mode 100644 index 8e88ec8f340f44e3abe6140b526fb4d7b75ca0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13215 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 J4xGR7e*ivuCIA2c diff --git a/applications/Volkov/artifacts/mame-p2/screen/stable-phase-b.png b/applications/Volkov/artifacts/mame-p2/screen/stable-phase-b.png deleted file mode 100644 index 8e88ec8f340f44e3abe6140b526fb4d7b75ca0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13215 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 J4xGR7e*ivuCIA2c diff --git a/applications/Volkov/artifacts/mame-p2/screen/stable-phase-c.png b/applications/Volkov/artifacts/mame-p2/screen/stable-phase-c.png deleted file mode 100644 index 8e88ec8f340f44e3abe6140b526fb4d7b75ca0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13215 zcmb_@c|4Tu`}QD7ipsu(mM58Flw>z;XthNuF-1az$j*!wd9qfL%D!b#BqZx7F=?4W zWH)6SjTww##uzj6-nXUH_xpRE-{*bbKkCyo_so6W=XIXPc^t=i%^fonj;h&o>9Hebrx?EhF!kmt>j6`~tFJy+i8uT9^u9zLM>J!wn1+=fi2fxn&{x{>g174+{z zmTTTz=Tq7&yiqHJNhi`eOKhhR)u$+Zrq(`46jIO9y6|ji#n-ddx&d{rM^|mSweG;e zUmI=PImYehyrW+R)XDaFKG`(?R%t=dSUJ%N&gyiC)u#`^P-i-Og2thrR`3Wd};rIX8I_bZBk|j5oGkG>Gr3stZ2K_4(*M=>TVH5$a#1MvJDolAqv@RXcm^X^!E9W$*8GotC+* z;A2)dH(2mQ^W5h#UHW6wv6qaOXKgmF**Adx`W_akUThL&#ql3ONZqVxCuy`AkkVRr z$zWx5X!cJpVK3i_@SYyvKfPk$^DvBaE@kOT$#T7BxA<6?675J;mseSF&}W(a_p~B7 zuF<=h6g^s>q-cs6d`SP)5ny1-&2Tid+xwT3K+Pj*g$FXRBA&ZFs;1{yr&fqYsEbKG z``i3%KK9jYqkq?%S7nJeIAMIsr^HC7p{3^^y!P(%6z|eZEyGrlmEI`8_rx6i5~&vw zCxgQlt2`byNI#IA5k*n-R&UF>EH9IDS_JKo+seD|CfXny#nYuk6)fGA+bSb|x1U>* z^>7EbewAM*+!faa8zLxhbEhxJ-wrGo(JP7i@Id`$UP|O{@)d3~XR`f5G72@96Zgh` zF8os=>(Do2tDPh(XsHo@lw=EhW@6<7~2d}3dd1}V6$kl+Juks~d)YC4qPN1tc9KVXlL5X`e zqipALn!+2H9fB{3=~peEB>j+eHRcxFt1*M;1+Yre&qRb=*LisKxjB#W3GY!yC+9yq@CU2Ni7~kqBt~oY&?Yn*9W6S0+_KBcz@d zi!+U}uUERUuD)j9#$(xE(V-8jS=-7iavLKP1AUcoVvK3Ys~`GuJ}j)Lp4OVMhxP8jN1|9A%YiB$Y1uKJpZ^Fp`V@v4d`Vt){;xjsNE&8yV2!T=wb?$3i!* zYTS`6w@0>!VVM{Aa88cYZ9Q8wvy&6xEEm7cX*Q~_(StHV*pdZnjim?o^1O{WzB{ZU z0esNhso9gbcs5zW@S}alhYnwNy_oecP?-ZhY4_e34yQX>K0Ppv0R=<_}$I9&(h+TVi^dB}(dYEevU|?3;elUUg|V>a#}sOmY>Q z;(^$MewA(EYPqlGt4nGj^!9~wfv?cQ;%On4yI?J`=B!M5p||!vW3=$)LwGoMPM^_3 z`=pLf()PZjhx*a-S5COB`|Ixt+!<^>f=$|Ts6ET_GG+6GtSLFt!SP$?u})b7o>@aH zFI#TlS%-K|Z+s0N5~x(l7MyN6C_>@dA(=y_denDFPdd4?a=a!8KGTv=Q^F0RebyZ3 z_FemOf`w^Epx9wTk_DAx6?ei5LnyAPtRA8P?J+*dYcT&v_E%M23>8Q1n*PK}CeoWj zd7doYuAY1CMY;GioA@HV$3gy{oe<#7+HkI)q3Y5fw=^Px!d_;bw|T+Qhs z)Q@u=Qn}%#XfW_^1QdEiaLKxUyHS&Z(=mQk1E#3iFILvJr3&!L_gh$)vR>bAe^$v#v8D{q;jVE>mv(;dPnIAetiMN#hO@ga zqgpxB0)kCKc{j}pEpkgEYd!ReU@`I6onYNHGg%OJ2DH2YrT@I>DA(xbijf=OqxiT# z-{_*gaB-D)m9IVxNh}WHnTpICtl&(SG@NCR`tddi-7!T+FJ#qKyT1&T>W2Kkb-KP( zW1L*Cwyzj{G=}cMS-GlHp%SHJQ-~x(BJa-J>Usnw{VEkXGFHf2NjWHPct4cLlrV=w zY|}ox&Ojxf0M@Y-QnA$l@~GYr3;3+ex{zf0bkD|a9K~O6Kkv2cd4ti@9(xXlsvZtL zaOF6Nxl$%;Sk&x_{51zQN&8ukD}?fyJIYZARL4>_byl;Tq$J|0l}j;2yB1c{ZN~%K zUF~R38s{3h_^bHI>b{ug7vJ);z8jq;B z)>u3T@&Y7N1T|Av?1YzBs-*)N@*65lkcFC*^X^Ojz@mYh`$?kOASJP+G^1;in0tQA zp#(Vfo#+n&xAHAePz>ZmHY~)2%NS1d=;K!Zc$!E@6=FEELXxV-IhB)G1ynGX5wW9S z=8Xu_lT=i=HU4bns<{SHR{v>ff4T*|S&^q=pOp`Q8eJEsIoSyp)c;Ev|A2GV>xlSN z!aUKTqZC4>ns*ddOKhLxE1`~u7MRzc zYsaLFoz6zZuie+4Wnz#nA4D!<6M&T_ol6NmkgOj>|MXbBjDTbz=iUmz&QXY4&*5-4ro+t&pVaH+GRTC`#Hm?vDj(EhoRA;xZgLc+Z%Q@~EV| zqE5zf5B7oR)D2+8H9mytzoA4Lis#{G5M;^4c;Nfs)&A7}Q9DKjdng&G-`(7)FQ%z$ z#;O^8ac@-0dR}%@#$FG^1T#T=0RQAjP3M7iqIgHsu|D#8ibak)ZUd=(*}S)_KanUyWDxqHuKqt>QE*!O>3M6|NFw))Ggza+b&zX^sFJIF{;ho&`k*0{%!q({$fz!bQdA^|r^3ie z3uLxnUss~n7ww)PXOqD^`PDmg9QZ~e7c&+pY=5FZC2*LH^M)^{8Pgp8jx|dU#f$l^ zYY;ZesO9BTDN@oSWuRd+*v;P@Xc!^;xx70KLD~i=JzC?p z6CQzaSdLX;V4Hx!#Pzaj%9XlLK?GKxABNRyELd;?ER(yNJv1HRQMASfPaV3;u|(2m zK2NQ@`#%t&^dnbL2iUY!ZZII{QaOmbv^OCWHx+{EouHn@BgcaXVE?A8bBTn&i8lg_ zIOEvT_5X|F2D^zj&`P2`g14}VqNLf;LJS~9eE^y3#b}WA&_i+NCSZ?|)JVj+fT4KS z8^;7&U*JuO031MmyUF_rWC0NHtnZ-smrEBAx&S8DgW|Hs1Mop0CGW0y{t2`GOsnIT*L&5GG=QaxVejn9}d%{9$F9E6A`?xpPDY3NhP~fF$Y? zIz`;ehaUF2`%R`sjQfl}FB^k_#zox61kBtJU=FaDcob&rmNXcJ+um7d5<(ZF?(QcQT=#PP#gbF zjBxW1v(R#kDF~uhXw3Fg{<;;o=cQY&7(q)RO^SJ@^JTC^s|H<@>C8NPsfO(8$m;3E zLYXHvo7wquU#ec{TMB4wHb{TFoLYJp&YdC60h|Xq0Psad!Y+d>RD1|X*S2#^(qk5S z{{lp0ZW>CwZNJi4)T+UUJ^CXO5K*KrVC|dDB_9BlC!kq=Mvt&VGf^w5VNKJvyr@j} zs7C~Fb#u-&Rkzsw@p&iU4@Ho?iSm+B_(cS;Fm@M=5S+a?W&)yA24u2S-LQ%WU;|K| z^gT(h(@H(=qC@w%$GQsSw?ST%E(Ot+1B7wIv~C#KD9m|oi`F57bH|`J&GblL7vqr0 z)~$K=3SNcst1xx3>yTf7HVKH#p=o8dP?NzT)S*LzpMNnxSgomhUE)W@^8t;B2zGGH zVXllvR#W~;piv8?+bxF09wE1bk7&m%?w|n}M*_$>o9!4S@&nRa z!Dp_Z{JCQb~c&!0dM2wc;t;OrqR4KN?YksNilcR{UQm?L)6kGF` z>*$^xD2eW+Mvg*B4>-&x084CC4s3iNb=JkYwyUEKA70*>;yIr+v%@a%ExRlrUMzV{ z!oYPD%<&<7+rIW+t?ACe3aMB7i*V+DH1g=j0zcL?K3Xv%W7Q(gmc3H&g-mGl3Y30z z-JFO%Hs5&OCGNSn*m$@SJ_}0b1RbWbM)qKv_JVozOUO`x46x0F{?dR**XcL`t)zb^ zid~g*QqX-Yw7p%HLM9!kbgoyZ-JhH%DQF09&ss4eY1Ign-Z;!5IEte&%rl!kqZoch|@SiM{=*xQpPSP(;OAjjTIxj^UM(C57}tG2n*IEf6~41Jy?t9Fuo7TBlaxswbV4B}Ntte{{B;fM}SJV#|Uh z8Q~N2Tf7Qa9bqno)g`)gR+F^i=gq;O{*0Hk`z10!^FYayh~YUv$Bq#izve6G)@~L< z<@`<)qpn!q#of(gL-xc#2O>Dpd)r;;g>b#ln29-)^prm>3bxImao%gUeyZf{U$y^i z22`n)`3#ZT>*(E!6w#lp+uaV)U!?v#Y5OfxTR{1;AO)6lf*?t54J0`Oy1)<%QGQe~ zVxItL$AJq0*xyeKvs?kvg}lXhb+C`Y>MkuV1|*a70@Fa|e&BENlI_Q%^Olo*fc=NL zK=`;fa!Df2$1CRxh6Bi7#U-M?)I1yZLJvC~POpS)Oox_dpfW!ja(U$r|6_WAUdm$e zXY&419sUtzr^e+%4bAEoyaau=(7Mh4t~UV7c5G3t%vT_=vHcPNn(M5ZhA!heT8s~= z*{UX?bo0Le^~K@rZZQ4_r53y=3v7&Oc@=A6aP#vPza#Y#8({#st}+c>xzM@T5NRl674_XiVVt$dL83M zny_GPDr~UWb3XJEU;={l5il#-Tvr404jtqF%qF!+P@x$mv-HIXkWDP0qhLe<1+cKz zUsPf~PAz1;eK|mrU5r!U81J=1|2?7fXh3a{0vvwBhTr%Dv$w5#<#}aG{YAKHrU2f%8f=`8iU8*g3%9Z#O+EU0Srp^cM?eAp#vmn3Hg zHwwB<&Sbl@OtVuZfKpNYiR4-3__Q;!bq1CUVGa?z>T^e{=K@b=i|+sL3cj88~% zq9JH5F9mx4*e1q91Wv~C!Ea0YKAqVI*#vxGV88n%j|=3=*&@E32Y!~Bqen}R4N}|n z{DW4vq!g!TFJdn%bMwn|O758Bks`Sy)+IN@GkP-Gi7Qbrt;4(bCXF3iaStRixl_Kf z4duk9VDyT7qR3A6rGZ;ly#3i|PIQ+f%WuxU5wSaEo@gws&@y!L#g6Jd`U$w_6kuQ{ z@DN#i_3bO|7szcJHM>Jzg_IE1az9v2u^~;nNs^)fsCQj5ziLEG=qfAKy3lO~|7oE) zjVgYQzo8E=&)3^weR;G~%gICf7~~Wd?L_p-1h`o`C%L!2BXHV50GOR(g?yC3_AohA z*+Pu*25hOl#jcU~Z23)o_Q!F3yr<Kxx>St3L)tggR)6_|=GY=H)}cH(Xi_txcZw8~^y{o@Lo%ZR!=Ux2$r z1=54I(_P-zRG=s-Pyid>kz<8P^S*pmdAsv9z`VDVXC>!LvrbVjLgyfIg5ZNhJ*0Mr z&$eU2xDxyP#878I#sd)k9}E}dvCop$$~UXJqBfKe+l-275S6qD^;S&Ye8fuGvd^n$ zAM@=rTv*qCiiWh2^bvK0qyLVxfv^6?nacZ;;auIFscSMOlZc!4Lif8?D}OtTPSWwF z6dsQaF>pcP+%LFQ&o=VO#n=v_;qz2|N-5?->bTZu&TD$@RqDNP+ifU6E?d`Jg{3A^ zmivCo)ZZTp;p2H48T7cP+jWwr;iEkYO8Z#HKS=q^`x*BKo?9o$sYW)uiY|J$_dPLE z#K295lPGXfNq4yJ3R&;A9$LZcDw8sA6W>oXGRLcUg%H-9fVVD3l9Bt=H@0qg$%?>3phsplr8XM8JFXCVHctiG zZ|H9Qcw)8%5=5ME3_M{YA5Ab9mZ>@Fc|2`ov`&J8)&JG zp}yA!uEgbFv-%<(d@ur~8daLFp!h5@kLNPqPmaBe;7hLt)$uYR1X>c-o+BDSEpg1ZzEh z3GELG*c5>gF{@9_oawR#61#F)x&qUJMei3R^(p?)HITslR$l+&@SLOcNCRf?ubHEL z*nHEn4E_G@g#se4@`Iw7DfKHUneW9a&~%=6ChWK}Apo;jXh{F$OFUbpET#gu2uGI$ zBkC@s`n;Gn$>KNH*YQ~|RpRz%fK@LW8S)MQrt&;)Eoy7T`bU$3psX3~diO=fb=o6Y zH1y$5TJ>u*%(bh>nlBIrXYR0y=u5aSw+moTKc^2%b3zAM@hm0z%sq=^J#f7H6kvAj z?>zsVgoUpd5S(Wi9?wvjfXLqe6Tdv|J7QsNwvOu}uxh8PQ4rxn@mCk@Fn}<0)~p=4 z_wV9*_TWnfKd`rr^CZll?fQuiIEFL0pzwcAVA`K~hpMD6a`ixN%f}be%OvxHb<@3l zVXhW@IMK2Ln3L+$Aiaz29y}SaGEezwpu0lsXEV6E#1vbaUld&%uv<~@jcJYPP74w{uzTqL~z3AevI zn#@gM2YwOM4z^7XFE9f7!`#B#g+JpT5w>ap9lv{}vwoTkAAmL)g=MNPw+8byc{?`b z<;Avd%bzOzF1n=W=Y5G^QipmqB32L}!9dE7dPIw}%3cG4=BGt^KuCZ^ecRL6VZ{IA zj#BEB77yqph_gq@k>V`PL4lu`0UCim8H;Y}@>+w+h88U5?s6}c`bT_#(;pu0FJ`~< zE$PgEiV}NM=f91kKI;^&T0k0LfTwY491;5Y=QLz-ayPf>x*^|6X9<9&Ug-yEs&(~K zNX51#F}$3n4#l3_xHMg9-Yx%+Qb#nFCb2J8DtnA^mjQ^3YqRYxkYBU@<)f%}{sBRe zv@MqUOJ%k=UHVNxPgedpiOPQhcry_gv;W}?)=}<*+@u{r-Kbq}lQ}tkJvBId(ZCdo z;bE(fIxqENH57r<>++E;MP%Wk&nNBYow~8$0Y{o{xnQ7O+5C*#I5_xF-(%+S zCz!m`l-wmvtDt~kcC6ru^vNN7ruoB7EJM6@+TAHSC89S0EB_U=)P zF&GBm=vm7icAU)-%xa}XowAM}*1pu1N7h10Z^HX`t~^&Fn0&LyWf!@rD#X2MCltZa z%d=nA2|GD+acTKLx($;W)8a>twx91uJdK z)*DL4xo__+p4c$!-IP0pnl^I?U6<#DMrX$)aKZ)_!SBL7cjc74C$KIt_3Ukt3DAM2 zEzp}6=~BigxNl!B*0$CQ(`{JYa&e#gBCQ=S!q=v~Jn}F>|KhA<%skp}PVjk|cu4wF zfmK7@YpvXt1cH})#94_uy62`~XO9iKp7g2_u5FyLq=^bA2Q;5%GPWi}@pUv|JfEbE zl?JZ8vW9hw?c_e_{FON)@nhx0LGD|Z8{oOe6%fe8<`q6L)aA&s17Q~CR)!)e{+4s3 zby1Xz^cW&A<-j#D{pGRc<7DlQhRfwe;}_E-jP=vtlRB+6zI_LYm)?2Ec{vmMv)3P= zN@623fK!2XWJPc5Vs-J#Ad4itq__`n&PtM9ac6Q=WE>7kO=#UbaHOMNW!ppM%w02D zG&vwg!J%QoL9dh;oQHoSY@nk${1N3IUi__wu0AXu!C9+RoES)d?%&s`mAp59u>SFb z;B$NA$47f~%926~I$w-Ryj2dZXm|6aU2U#Cxjj8^Qoup0%y!6xB#eEeFrIB66BAi! z`c`!;|5N}@>8uh?z?_w*o)luo_4V<`b(R;dC%Qe&OKt8uOc{kc4SD9y#3oBRStJSU zHm|R_oc`TYF43uRGf~7RZEOhdPCbP-%LsFPH!wBMIO(TVOsmU&qKVTk+vS_;X4%tz zdPvU+mF(Yu3!&6eJt%@m`n|RqXw^u$wz^f3tvq*=Pd4t1cGQ@xVZC(kVg0lZ3Hqw4 zf|Ps-8R6)SJF4E81BX}lR&toDt(*V4t$<;xJ$_f&C;Ecs+29^YGnXw5a@V74pXz05 z#oGHK2F^R--xwtIOEmcUbP)AyJjfL3SzLG~z%xpUYthKFJ@+r#VL^9v0t=X>= zbdv0)QmQ(5WQCP%bS35eIc5Uj#%OHw<{R?%ExgPXryk$-r3HSy?lf}`eR78SNvvJo z%b?j?jh-CR*EwX8TA!nPm!IJye-ECM5+ZP-0k@i}SGeA(rf?&Mwl(&ir0%2687Glf z1yUIUwz-HTq3>e*dOyaU)g5BmVnU|Bw$VuIA})o8=aJh!ZA}^R9!fAIiW3J={DVOO z@^1o!>xo_|-J8)Nlqwef^LFSEe5%T5&Pc7!X`mO?*dZlA322tCUtmR@0@*1&cN+Y#wcxdQe)C)UHJe`jS*wD?!{p} zqb{b$Xe9Rb7My=rm^|}IfC=3a+Sx(gP{Me!QBvUw{XrfBsw1NPxLPAu*oRc3VNfux# zKx!k`wN@u}CLbSm=r+J)-`Mpkac!IG=ZXN-bU0arI-q^M-?9Fn_`&D?=r{YA41Bj~ zI_{0&`3tnxI`TNKuk_ZOop@p!0S~M6)$*T7&!pxj4mZAKVI=qZs=y{aP?iWADL! zb6mVarSw6nhe&I6h6?F1wSyR!OH#tvBTV&hA(8Yt|F5<50l_-004b$Iumd`JyN)+Wr)W za*X@6Ug;$}Dq7$43X33x4tj2P5NMJaH&WC4wH3jiY%Ke!!~f5hUCmtni>y@*v#EUU zz|UgjuNj`ccGBb0HNOj9j*t`kPZ%nysqWU&RNQW_=CDU&x2A)#^X8lnz?D1auMF_M z=6D5S=6KD~%UjXR&BuGE;t}5q?usWaxGJ9X^m1_r-T?lwTTM-^J@WH0;B$~8h9-v! J4xGR7e*ivuCIA2c diff --git a/applications/Volkov/artifacts/mame-p2/screen/stress-final.png b/applications/Volkov/artifacts/mame-p2/screen/stress-final.png deleted file mode 100644 index 8e88ec8f340f44e3abe6140b526fb4d7b75ca0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13215 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 J4xGR7e*ivuCIA2c diff --git a/applications/Volkov/artifacts/mame-p2/screen/stress-running.png b/applications/Volkov/artifacts/mame-p2/screen/stress-running.png deleted file mode 100644 index 903b2c5e09a7186d087a2a16cdf09ac47680b4d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13153 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 Nx>^^`lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/initial-left-active.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/initial-left-active.png deleted file mode 100644 index 4471bd0db8b83f3bf58c1ac28f8b83fee5706e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14447 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�Tg~){t~NHtwex-q8}1Jf77fpZm6$OPq6~ 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 TLmPG2PobrutDXzK9Pobt3Z$4E diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/message-closed-restored.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/message-closed-restored.png deleted file mode 100644 index 3a4ba93624c2f6960b879c04da6fdcaa6740e782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15251 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 IblLa+05!^OEdT%j diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/navigation-scroll.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/navigation-scroll.png deleted file mode 100644 index f5b8efbddf72bb56300c13568c2f68c01f408f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15275 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 Hq38bqgz|^L diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/quit-cancelled-restored.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/quit-cancelled-restored.png deleted file mode 100644 index d694559c1477e065cb5f19612b8ab26cc6c5782e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15202 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/quit-dialog.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/quit-dialog.png deleted file mode 100644 index b7a412ca7762ef6164c356fe7a75cb208449c33f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15102 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-clean-exit.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-clean-exit.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-launch.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-launch.png deleted file mode 100644 index 4471bd0db8b83f3bf58c1ac28f8b83fee5706e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14447 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�Tg~){t~NHtwex-q8}1Jf77fpZm6$OPq6~ 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 TLmPG2PobrutDXzK9Pobt3Z$4E diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-quit-dialog.png b/applications/Volkov/artifacts/mame-p2/skeleton-color/repeat-second-quit-dialog.png deleted file mode 100644 index 2ff914821b274f1f758096794452bce96e099863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14521 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0000.png deleted file mode 100644 index 3913e2c82b5d908481993866b679bda8a21a1e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22815 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 TyG{nU?w4DVauQi$_gw!67X82_ diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0002.png deleted file mode 100644 index 610bab7ef69b316e782e613e22d6a3c05ff5414d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22935 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0003.png deleted file mode 100644 index c4a55438609cd7f50b64ca83dfdd8f6763024129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21444 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�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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0006.png deleted file mode 100644 index f6ff3cc8e396679f4e7b55a89742be4bdb4708f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22905 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 U8PuQ(yl$Ve!bSNU*=s)k2hDhEVE_OC diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0007.png deleted file mode 100644 index fc8d10fed8e74cfdee58e38600a4a48a0de36afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21415 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 VXFG!$G=S?4sVQqIAr!9o{2%y{3#$MC diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0008.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0008.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0009.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0009.png deleted file mode 100644 index 3913e2c82b5d908481993866b679bda8a21a1e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22815 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 SG=TGVsHtcx=bXFZ^S=OK(9-4r diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0011.png b/applications/Volkov/artifacts/mame-p2/skeleton-repeat-run/sprinter/0011.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0000.png deleted file mode 100644 index 3913e2c82b5d908481993866b679bda8a21a1e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22815 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 TyG{nU?w4DVauQi$_gw!67X82_ diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0002.png deleted file mode 100644 index 610bab7ef69b316e782e613e22d6a3c05ff5414d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22935 zcmd6Pby(AD*uO`?KtbuFfRsp!BArqqAYDp`B1-5$T8T|jY8<*GM}r`sf*?5qq(Qo! zbP1!!V2s~)1C8~1bHpSmA!H5GYcq7y`W_Us{6xFoBwXU{&W zJ$wFOIJg)1Ny>E_^F4d6U=(DfwC+bwmZ*-Fv}>QiQqeH6J=1$em`V6LP=JE*l(9UA zbY^gN$ipwE+=veeRWfMP3gyZ|+l4MI4RfOBlFj)JfHb=mKSlm2MHuL%sC4hkTW>F! z11dZy1IhMq)YR)(Q^`9>*ZP&xk>}<8AFx?Di#f3i&tI$7FR)6cvU6{LOb#x-UF(pS zTviX6dv_E(9UaoN@yN4m5Sy!ot)XFX?D7PBK_BjJ6YILzX{({AwEpORB#vDgkVM%^ zI@*E<1Lgf7kQr*o%o3`K73Q)$mg?^*`1$_8;$-(xiKQ=-Te+I;LbK5^Ll<`5IM%bTz{C zQ@0O9g{?pG{*aN3pXw>FCC5K~08!+KJh=wO&cP(Hu2TggI`NU;o=K^XeIi0jQUQl7 z=tAr<&MS+PQD5j+8|mxlOE9xF6>y`a_tcx8Ut~Ygriv+3?TLn<93iMB&9Pw!cD_YZ zwU+?*W^PW8K(HhJBMmOY=PTyw)~dDi{{GQ*`zxd-cH=FDEv|7vq?0!u?%Y5A{q1MT z$)E-j&vSlf)z!r%pnYMhP9n;Plwe2slZmTdFxBO(46#s7b-Hr?%2GlJ7`(^LDv*$ zNg!Z}pj7s2W?#>8)GH|C@xb@3LK+vIN5y^~XbqLAVmesB9}NjTYMNk|>T_B;*(g4B z^0SB4J_H$yN}NuQjr8+KwaJ6tiLmBo(HNKWY^2n(#ry%1hsLesA>{<*-uL#iH=+8? zi}FXgGP+-2Oi5vH^Zng3+fJ0a85=F$B|XN)?irLJCp_npKy5DmSZA^4_G~3t&&P(j zEK(tjhv%hW93pR=bmE(`DrQ&E33r8+hBB1VL|Nb*EqHmQ{D`COxu)wQ)GzfNqpFi& zh^pW*`O{WZlcv_g$o{16jNrQy;o)fl&MNFpf)i6Gk|sMonb8P*Ak^(AuvqYwY$;Vu zU0Z|G%3f>H)rR^`1cO!NWsn9Q#))4G3ZdmPLJtuvsonasQw9fAAGCR88BZCB#|0McP)ZSKI!2 z$`wbh5?`T&uFkzqMxGP*;Tit+Iax}4I<=#(GS6t~8{xjAYMuN7p`v%kT7o{4QL*rx zpS=2fbXK>2teS7-{DJ66zQYT25gL$vD^(DAEdz-y% zHcVi=L@M}Li%q!Ni|Y6*9{tw`K(6e`8DGvExI;x7sC&ZN_seunw~dwtL4SV$I8o#I zgr$+Wr~qGA-p~t%nz*Pq8FrT8i+2OU&k#g3G%m6Iap(<`G+S1Hk$|QBC-j^ih__3h zP~WhD(N^pkv(wG?Y|ZFT0$tYA#{;2Z9RBhvO+{3wOy!sRu{9ql>B_Fj<~4%YJI0;- zP7ICpO!9#$JT7)G9wEByDCcouhH|js@-rnxt%15ixs}OwZVr+HmGO&nl;^xH)7ZmR zt<@B>C%kU3+TLO#PJH&!FlRthkvZ0~I6hlVJsAP+P3RApNV4QJA`Kq(h_pdd97vuo zRFPHcPL6L(Nlmr-)F@hqii$0Dh2^c1k3Twaa;c+2ViAji!@VH$iS(^f;6Zt?3EMLe z@O6KrHGftdb8ax!;Qe`B~+~Q6uPUu)Im%PJs7MixjH{H zUC`h!?hBy*$9je+XDWPVu1?ac8Ob4mk7EBmxIx#a*%KoHdOjHw{}fs3gF zZx44zooZU5E4s!=0_!>w<2VIh!w&Spu@i7V2n>Qn4kFDJO62uS66s?R%_gb z->#R!#C_y;@8lg(fwd=2s|)S^5F{{D=Nh75YN`_G!A$-9lMu|z0J_%^QR0l6nmN!s zyR3>GRK?CouFcV7-qB;a;j7(sR@pUzxZ`tAO3j6$g*LjjDDts3iTmmDcORqlGs3c% zcqDBebP-Ur7v0-9d#c~hp4T-=P>b{9(~N0DXX3Ai%Dg-Ryh@bjRC31CsnV-CU#8>& z;dcl;VZC9AicH6-J?CjcjSU@Fy8L=EPn?$eJdK>jk_Y+#v>`YHylZ-NrF<#6&I&v# zLl0nw2ScF)h>DZWcOR?*5Co1k5?gCYl~{;^qoYQKN`vrUEaBDty##cM?B@iH9~av( zR=QlAF_Ul1N|cj<^4H#C_iB|NX}I%x%-o9duDy5#$vlPM=t6VWROlHMGnz@ErN1u8 zDTP)fx{ew8thA+E*|&CU07_!a!_+;RM*+M*-gnk+%At_Xd1W#mKI3cE1ALGB=$GEk zz*NN-T9h$$f{0>av6Zhmf}Zm9uJiYV#AeFKYbNGYvrwg|5}xAe_Ys$}@0jI+8sgsC z>6#p*Fp|R7h7=~r+8V_tD8g3@<;oe`6?)A|nNBwn^AF9klPHea)1CWjl655c24Cx& zI}R?2=4G1RM;p1jtl*aF)|K`ef|1#y3U)He1uoFX8cv3+3CWX9pUj$@n*~QlV}@6h zcb{c!rOP!v&nL)yDbE+)%{biJscU+8)RpcGYIVx)kNU5L5;sHtI@3Ka{dyrZ&)FyI zu6>kG4$ToM?lJBg>a)DfvE|S+YgnLvI1huzq5FJdm21_Cm2-U{@EXX}oj>Z4XmAD8 zyvnNLWC#e95_N9#aV03F1>ue>hBYabN24p|AW@--TB`Ov_u|%gJ?b%;SsBIk(Kb92 z)45}`HJ9}tm;w#&vU8fJN9MY;X_uw_`kchE{r<5%)Wv^MDQ z;hx@`794#O#$=mSF#hcYUV$Lup9|%gPy7 zFD74UCoKVYrJ?pKORLowN&{2T_&9W*e%!8Nd#D5#= zSf;K|Q&Y9;g`B(u&};_CZAC+kgo0lTEx$hI93-Y zs3<)RSnU(h&>&gCmXMlMA-3dpd!{a`uUqCB0<&goPyo(Fu3?dqf4t5-aRTJzw7j3L zq}c^NHr99WvsJaLf_M!@oCuXsn7~7GoE(A*-LA zk*m|5k{ChAoS^AYNy5f}oG#^|U_0m6#aKr+$V6Y>y=*ZNLh;&@(X{*d9VXS}GrBVE z%2GP_E!#*xfQMy0(}dVMeT(D_H94rzY*{bpTG=h?ng$#fazJhTfvFmT>8Bb7D~THF z3cK4Kz7Dgt-~dgN5)a+cd@Dq$Hv;oyxl&$Y7ML}2GW5%zW-!&9*|cjCiyb#>CIr{$ zXQzsgrSO#^xG2xe0#Hx@Vm?MePso3ObuMcdm~-(8)-Pu2_bZHX49_x$rz&5tj@dcq zo6F<}N9g^a9JVcm53%$igBJjDBf!(m&4pkRP=*R=b7%~fCzUI+tlRbJPl!Qp5 zn83f^$$SL%qhP5uYO43B%a?r>5Q&8rO~DyKgv;FU^w*q*&$K69=NmutO_!0Yc1%EK zSs}B}R9(madald=b0GYW`^4W4#Yh}?0Xgp{OetcLiCZF?HBD(@VM!N@viDi+&eqqW zwTWr*9p-c*>s8Y{1M80qxzhFla2T{_mAu(?UZZf+8KIIbcf zF7Eo+@3VO+Vt#&dB}6j*Of8NCK4$2SJE&bQuUybB!>u(?o|++94=T)RxWbZHlUJw~ z<7%Jx@N;`#0s=Xe0s*(PoZ!4|*QrCDo|&C_6$?8~qHlLAquU_5_xeE#1*=0oLE#aL zTsn5>M98?SVJfP2wT1Ekm3Y+C`1?_2?bBcsKZ;TufxL2#8$Edi`-BJp+#{c2i%I%3kI3ZuSv(hhMu?jywLF}DnM{>-{5VJQLgb9yscYE z%)=O{(XB!^MAJ1}B9kkSsnh}v_(Y)V%v_S<0 zFDdGt>uqY|66$|G?YIFS6@F*30cU!WG=PHGS`CDM=;TFIpF9`Kz0S z6WUda3Uv#G;z79sU(Pd8a%-RTUrcu7p3;vpCdP#Oa*BABc->9x*4TJKLAQCAAMhnk z9;bLZ1wHbppR*Dcp%ET(tW#i=YBJv_KTT**Qj``+i6Vcg2~#5Zw0+1y;i?W2nwB5n9IzER-reyKbu(sZbQq)oP`-WTg8 ztHO-&x0hc|U2&qZmVKQ=_^P3iMfW7>19{C-1b4yrQU99q^z@@jkMJTUWarvI(!e@fD+ZYtR#V_ss$**`*!W>r#)k8 z9a$`N7$qNNcbVHvuh`qNy15-d!a2QEDGmDY3`mn1&3JB|H#HD6jQv~Qg#QKr_Fs7b zGgKa5CS>8srxf7hLZRE?H~y{i)-?kf?I2Sd9EAY@uc?Zi7xZyZ?;HIV{$%4o|9d&a$>&zu=QeD7?BBYp0eEmW z_Yhmw+|G*oDPdWsIYleC>)eW{%g-3B_vBXcA3a$YUpgRRu1em~)1zvN-UXyIgUN@b zhR@?AgVRgUgYj?PLpt9iJnrzR6e#4zNet?VVlm84tGOA@$v)&=7ez@Vm^B(TkjB*+oc4|3)os}1N4X5Woi_|9fz`i(}SX! zoDeY#H+%lH@s_?}T3%_BgVip`r>8#Dc`NdnK?>5pnp&p}sW@d%6ji#%e@di!@I^2> zOSX<Fw@Sq+VNG5*x}fYk=&7Y`XDeKUmbv&~KPwZ8nb|u*I{q?=lE)Qp zP?hR%%;a^iXAes~0mx5zW-C-Z(B<>@qi9-IA zpA5Kt$R@C1pb?O^zExgk!4|IlvqDX?j4~7R)61D(GF+{VvOjceGr1@N4lnT0fL}u> zHKVR(dyf}sL82o}5lL}?!pbrrB+IxkxzXf-!3c7LDg^zKD*Q%2?S6?P_Qk@Ow?{D# zgVuTxtG$v7nvx42BrzXs2LX^=A&H&whdt>Lz|WKapq__j%#57c`%7Q5x4r$z0Vs;G ztiTHnE2YSllr^PSDpRSDA>$6Lj$7kf5&fT9IyOUkA2#5nnAHWl-lSDX8WDXzz59cuqGsp@VHU$sg z$GRIWx#Jj(7`Apfo_;w#R79xgAB~XaENrS8HL_6lX88uAf6Xt7)f2&LOUTHMSEa30R>Kw_bA{Ze7QV|d5|e^u1YPzi6na1dpAM8 zgEP@?3kwPQ6${CjQQr#b6t+M*?vBT=GVAQlZ$IVLFg5DiX1T;sQUM^fC+Yo(DLoVM zRMIo8M#Hy%48{6V5&a9ui5F`qpR8bvT}IP4$me)I|0bH89g<;aks-snD_yf>=+Y!wA zK^bRF;MHs|h(f%H;CHgF-Yd{}pLU&BLJRFFXdNh_*d5o>p4HLm`ui(wmaC>(iT=pWkfH%aW zQEMQpbA~ z6s45K`C?3`n=xXa^&-FQ%9*A`kXdewv(ZC&N4i@!9aS!#3AZU{$(K|QLLJ9(PUq3j zkUe-oSZr)NRwEBw2@I4~k5@bG$s+SSEN?KB^yu-DSDuzRikraQ{5rUckr9j972Nsv z7bDgy4~NzaKzVrS*?TvmGcayUEHPn52oRQr0bz;qkFjUdTH_ZN{&#qYNm)#$wvujO zuWQcjcfCHw)EljJ{P$X`{h+`f3hHuC)C|mTe6u~g6+FmVZNKoT4g$1ia{Ss@|C78% zzsC(;T3Q#MPk*I8t9ZKltVp&q#J06klQtw#oj)ZZge!ruFiY(dPubh(l&qNj(j4&Wj>u=^_|4u;hDMui*A#c*t5(pN zddsr}uaokh$W_%`cBbOg>k2#C7f_$t2@^hMYLp|RHMc4NN4RpoMQ_MDc+YyXrV|fn zI>mC$b2N4`a-`(v0Qs{P1aB?8BpyT`q>eWo^6REBD%-ngyL?Z zUaIb0RdI&!l_51V~Qxdy^~6Lq%)3&1Nzi!Q>8U&;!D$!WajRFSehfpDSa!{?}Q1!Ghmqq zFR8lY&#waBStViv!?JwGus;B>8`on? zH+RJ&lsfZ-dn*-pv_3VS%LKCmM zLQXY%j|*Fbq}t{;ujgLQvz_gwJifPFH$d`y@)VyGX80GCw%zItXYHf6;Ly_gx=D_l z-y}zpH#Rw#o8^v;jnUZ6tIVyYq*@_TF^BAL0DSqyae~hMa%mhA7S$yuE#85XrZ3BL z5Z6*n_$B9)%4><@VCcO9q+{ygd$-#cj%S!`2;#ZDKNZ7sbGcz2KQnvFbni)TAfUR1~Q@^}%ZnGy` zb*~xs$w4)JO!URb!-N}Aiio(tFj2VyYd`_7!zti712fytfK>G5>F7B7Ks?wpB= z8_A0w)v`^mxng~(m$8tYa#Eh~#^Le-C+3aetO)(adwvE!JBD%Iu72hySnF7xnpoD+ zg9{ngIb2TY5IzccPyoX@!o7fK1{`lt%?+tADM2Yu4aHjD4h9~>gBm5D+rmHF90n*Ha5PkY)j`%IQ1jC@Q*sDyQzqV`L<}?VOMw(!cI5s zQG{{t%XxwRR)FM0$m!-4)|Gb>d&Gs!hrM8X5Mkb6ET_~xYd*RId8VVH>VG}beO?id zc|e&?8*jpnn}op~U=!_SZ}Rf07R5QzIbpwg#JFarPs>)N+~kdU5g$H46L|D9%6%`( zM|IJpt8SM+U8;%MfgZo-cD8GYOj16t)=kXKSTpqRu;xo3Lq?42fwe>Hr6~ewKS&~3 z#4R5x%W#HdOmLThE|w&vQ3xH|80hGtjb?l5d$awXyz@Q_z*H%W`Rm2YB#Oy z{DovkIwo@M=a1ID4Rm&e6!KPleqblk1hB*Ib^LQmlzOON_kqB~7F%X>AKYfkOwOLd z$SAu*x0La}^AbD!moi)FM+6MpO`iwhW$g_Hf3Feg=-4a?{}G@01=^gl*R7f#-^hKs z;Bud%E4}SKy1$<2zAcmL{+FMe#Z}txn1>DWV)sUOfK6>Y1UPzp=y>!IK~Oj_8S-e) z%)VPGRg2qjV-B4#CbP(l$JvIPnx-#D)p_Bc;SB(kHeZzmbK4PN)TtbU8pSXQN?99ciJ%~WdcpYc8*66rRaA>63RzYZsPd~ zb5KB*`tb|5jr3D?hDaqOFw&ENY|HR>?C6|vJ!1ktqk(v-gMGH0wRE>x#XD134i4t2 zG2jKVr_+Jt*EbfV8FZO7{nss1E{}LC*kswH7;OuD7Kt5NQ`3y!+A>-HWy^fIxi@-Q zm>xEPB`RGbyb2!dVniTs8+(9E+>I=GBW~=S>vml5?nj% z7!og7EZYS!Sn(Zz` zo%ffmaHpIkt#!Zws+W_C2Gk_E3r-w>_@sXB!D)G1SmgVB?Q@G;VoMViig4sVkU>kN z{9I_zN#=2q9i=T=U8+NR=1u)h@VHX|4Ip*Q)8RIhbJ)ml`~;=`ca8JkP;^n{WAN&n ztNCV|xJ|;Qa@&bGM-Y-T971E85a%hD9|rh8L7cK#&#}CM6W?72`^8p#UjCm^A*+$< zZF16T#!i@rAW=1>+3-4axp1^w?DRYK1;?V0m?rO`wlj%>=J&FlmF+H z`QLG&Q;ShkMEqwppNoclzDTP+dH2y*Tf3?Z24EFIG#a}qFmE68!{6R@o5RdpUxIi? zJ_rqNuKG6Vr%vJp-py9_dhgT=0bLT@0Fl2p+W&QV{;C^pkIs?tm23#2`08BwO)1`+ z(p2kCYm@fi2Ih3ysa5`r4&A?m>$lClf_JETO4w$1hBI~zx{_v3;GCl%Z{EM^Z++w5 z^SSv%d4;hz4>%F+EKuV>i`0keyo}{1hIvOQW;vo4^gzbzn;(yw#R7MQo!$SyI&yeG zhLt(3Qub_f;BB+j#43eN%xV8;=+yN{W)DCzl!t{r`S zT~gzI3UlcGjU*~_IzD32v9=?tSffkQo4^hNQvlURkQSfKjv_!mgxM9sg+vyVu-pNjrAis?p~7 z*-wxs5Y6~+^!NAY>7MazYM_6VWPiXSc>3VkjoJOnqcTbfalU}g1S?*91?=hlG#ii% zLh}KQ_Vam^rY`N3`Mbs*{h$QH+7%WIWrv+(tn+u6RGGib)t09Z;Y zl^q`fe%~SbcdVVE-mdaZuQ-Jd)ou#uuGn+5eIZ5KP`>I3#U>TrdwnbBfXbY#%Hj+9 z2;`Qnm^pe;OY0FzQfcdCpJWE81h5sOZzvcJ$VnZKV&Cs7CxNj47Y>m-2hirG(zjQr zeKDf7qVVeG{O>Mu=kr;4^gr3u6r}(*HAgU^m;lQuS+!5xP?1bG&RTV3(wWE;TV3<* zTIU2tl=?#Fcij0)rE@y`geTcR8eJ2Y)UcT`Sc~r@tI1c~(&fPJ};n z9JesW#2`-jTcI?rIR$k=xU!%q3Bjn141hXaFKo!1)n2>HoKg{EX;+J!FTFLi1Y*7x zz`oK(-&FYfzG))CjAes_JR~q6Wu(xpt6s^P7J`!3v!IS`aQS;#L zQNS%Yn!m$|mRd}|T#I}V0~y)N<~%BpF=$IG7cqWsdwbooI;=79ZMTY6c@XCgZLYN5 zwAhVhDX$xnwh1y?v>{(V_9kSpQwpEp=w<&l$~Tz$-&3Kh!@)(wfH&j`-L>!S+#CLM zS=4iCit(LY0kDOb#_qmzJL3oS+Ob18j9KtYFbpolg?gLHHIB*AzoZV#%!;Z3cBH;u zQ0?2UasJz~{6F%B;;SXQ+U*O^G+sHkWn01qfmEUXQkyk#UZ?8Ud+k?-5V#HB?TKE; zaA#LoI9rf|A899XW zr6knLU9LX7DKJR@+pO@(lJ$7{CRKE^$oYkbpJc-xs%=yo z12P=Z0WX0Sx4-o*{iuwAJs;_hCq1ISJMiBZ+`a|awgu*@c#Vp?pGDCfcyCt_Up4!C z0_T(4UF+(54X~glugt!QIDKDG`}X^G2Il$^fM?17PFMC|IVDy}%4xn2u*lbGIxfAj zgQh2U!Gl5T+o=11C7v zVctWp+di=~-UL>qbqKcZKJOUkUDNTLF=TjRu5bH$Db6Zh7=@g%0NnSAE<>~01DJ1moTS8m9rSx5Sd&Mm*`v?x$w1LAaCkA<2U2OLmpTzdF) zhhyJHlrHxB63=({X?wbZ7e>042T16LN^zIdOdAn3B_92|^~QS0*Ei)cxZWCiCd`d( z8MoeO-)pcTf$o}&%bva4w(IQ?@<&7?IAzTLROX+Gq=RX64OO90s>MVq%bRYq*&2uc z-3>>zB~O5-{9xWWJh{=0=iC?JMB3$!bwRr6@@V;$%}>b8-i4ZLElo@s6#Q7qbt=B< z30yh>0+je&u2I?`=L^@$ZsWFbmB?@spZ2 zSP#KtGU_}|_Xh!&D4oJzqQtuTyGS##>F(oiIuNK1w}Sp7^yYQr5^>P*_@YS5iuuZ@Y5QHx4PY+l;XG8MTuI(3rl za(*uVVLu_x|9GTJH@BBtk$<;_a3ejwQFi?frJWGq-wRB8Ms*_N+RM02Pn9St9Ki#d7@1OawT zrn2sn=9~I`7^sej<5uW;?5A0$wM^%Z)bsk_EYqr;Wy3n?)zk}d?U3nj+%&HD$^J|vL!PBYC4XBKX zIL=_CV+e4OoDL#>QZ!tNLNm}6O)64UrQ~84Gp8#8&8iD19ECw+$HqKe;O|sq3bp4N zB`L+T-!(f}WgtI=I{Pt;yTW6Uf+ZEePpTiHzcg|L49ZNdl~XaXXPqATu%dB43wxs7 zMsCC``e<_Sq@SJIyf7iU09x~?OmGxxHZln3ml)%8>Y7rH&hn)mF}J~vU1MYzg%PAy z8?nDzv5~qDZy&hS5&OpGt!5w_*%TzBC#m}=%+K$|q|+CJF)YcUY&qkK&RhRUD3 z77e3<>Qd{c&5}wbxHw%4m!P(DuP~h9E-mRF<}0JD>m3vj7tD~+g7vL9Ok?S}^KMc2 z^X5LRHZZuQ7Ck3bEBM~Dc&?&;70+vuM*tXLD!j{*)@9a&`m~B)#mQlff*pnB{hU(R@aziTHKmDP8^3&c^)h z18F*5mmjC=H#4R;u>|Yl6=Bx_DO2(%oj?R}}xgnbOHn1|NOAxCnNphMv-Fr@Ht($KqR+b~LZFryssbK$ULAbHH zj;tV3%kgwsz-XsKR^G?C{EroNjIRyYo@AF%T8@E$D-8z{F1$#hRlUd}o#EZZ z=n@7aqdQnX-R`c(Nun(t<(URKoLin5bIDZQ^V2KhmUt;xUrioYpAGZO{xP*zN*^qk z>KjiZ-BfQ7`9<}-J+Kfe@d;l;YQWtv;)qK7@nWD3!YA>cV7?(w?)Yn4)^bF)u4y4D zea(4jj;pJeqUlrQwfRG1AA>zZa_mF1JLfr3z?`wqt$|pY^y#F&yo&IVNW6d1S|tXq z9GYh^v$yaboKIgb2$hKji7TMH$z?H}8#TAMJI6 zCa5aFjg6kDdZng4*3j!q9Q3@OHx`GC6%F)w;M;VdRc=ImC1n(dq&nHSXw;V^%Oo2` z0cU5)?C31y`lqYj45x`yD2$$Ux7~zfg0UbGpX8_lb}>rcRTxR5>6hYzEq7bNz~vO5 zgsFq*(=+C2%B5V&3KJI}wGam?z@>qAIMYaV(;?MwmQ;@)c2+jp-lbl%@!gO@EJ1^R z8(o^M{#XLxxq|AP>WUI+H)F$kO-IAvVb_6GD$^F~k++;wu%N=#6_2Gvv_OmRV#Z@x z^CY88{QH}f47V1naA$efPxOw*?4Ao@FlXEd>iWeA=(3i5n~^;Y{WT>MjS_zOgykb6 zo!JT_E^@=-%M|G1vb)4LL0{-wud3gtfLQyD>5i^f7_6q~R9!DwNtll+lW~tgf)#p} zC@`>PNQAAB6swIZGXu zRsh@9waBshN*sjB3v9jW8p_j}C^Di(#18y1c^VvJVzZoqt1*Qyxemtb%Vh>z-tdB? z&CC@isI2PVmB0Ili}4*}Wz4D#ugt|fIw1TizHjamwgaM*EssjibT@o z_hRx?2w%FSRZh-oZf`f^l5BVcC|?DY7Q#{I3#;s2g6Xy9ospH0i!8CJFR{4L(RDC^ zR-hd6WhL{Pq+AZMF%>3J`{VG@mbI3tFixg;x=~h1B1TY!z;xBsE3YhU2@HiBrFG>P zlslKwJSm167Ff9x^~AX;5|0dVim7p8I#Ak_*WT{QTPRQyR3rx z9ZSCsn-8=y%eviC+#UXx?!{q~%v23S#>mX5j1c5adX>N_0V&mzaz*+eEk|_s@JbJJX408lyVIWbQkix2PMs2;MYM5tdd?Hgs}zlB|3CU~UDw(lHq)$ diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0003.png deleted file mode 100644 index c4a55438609cd7f50b64ca83dfdd8f6763024129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21444 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�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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0006.png deleted file mode 100644 index f6ff3cc8e396679f4e7b55a89742be4bdb4708f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22905 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 U8PuQ(yl$Ve!bSNU*=s)k2hDhEVE_OC diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0007.png deleted file mode 100644 index fc8d10fed8e74cfdee58e38600a4a48a0de36afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21415 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 VXFG!$G=S?4sVQqIAr!9o{2%y{3#$MC diff --git a/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0008.png b/applications/Volkov/artifacts/mame-p2/skeleton-ui-run/sprinter/0008.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/clean-exit-dos.png b/applications/Volkov/artifacts/mame-p2/skeleton/clean-exit-dos.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/cleanup-between-runs.png b/applications/Volkov/artifacts/mame-p2/skeleton/cleanup-between-runs.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/initial-left-active.png b/applications/Volkov/artifacts/mame-p2/skeleton/initial-left-active.png deleted file mode 100644 index 3913e2c82b5d908481993866b679bda8a21a1e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22815 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 U8PuQ(yl$Ve!bSNU*=s)k2hDhEVE_OC diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/navigation-scroll.png b/applications/Volkov/artifacts/mame-p2/skeleton/navigation-scroll.png deleted file mode 100644 index 610bab7ef69b316e782e613e22d6a3c05ff5414d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22935 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/quit-cancelled-restored.png b/applications/Volkov/artifacts/mame-p2/skeleton/quit-cancelled-restored.png deleted file mode 100644 index d0705f2e25d11bfea7e2db4e44b1eb82ddb7676f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22866 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�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 l-DK9jV;wCuN^)lMef#!Ns-IWU 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/repeat-second-launch.png b/applications/Volkov/artifacts/mame-p2/skeleton/repeat-second-launch.png deleted file mode 100644 index 3913e2c82b5d908481993866b679bda8a21a1e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22815 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 diff --git a/applications/Volkov/artifacts/mame-p2/skeleton/tab-right-active.png b/applications/Volkov/artifacts/mame-p2/skeleton/tab-right-active.png deleted file mode 100644 index f9297dfdde1e054b907a90e7ad41774a346f4e50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22597 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 TyG{nU?w4DVauQi$_gw!67X82_ diff --git a/applications/Volkov/artifacts/mame-p3/panels/bigdir-partial.png b/applications/Volkov/artifacts/mame-p3/panels/bigdir-partial.png deleted file mode 100644 index 23a6cf5207b59c69994c17fa9c67a35af14f681f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13022 zcmc(GcR1Wx+rPAxup+yHO`@dfEvwHcvqXvBi8>KMlps1WCW&AXL>Zz^MDK|borE9+ z6KzBUQHL3Qj55r4ze6_cvzy)bx!&vg{r+)b&YbT#_qp#+xz9|9wx%*2%~={MDk?ga zYYMtlR7aSos1BV!ei-;q)(uxXDk|ZtDhhJ?-pTVR=I?9_Hg}v=e&udyzmle&BdUM- zRJe5B@eWPSTN}qxe#zi=zd~)|{=xF*wVk=wmNt#?Z{icv{8Ylz)ZLyv{5^z55j^uO z=J%6QGphqTWRIa?&teaA2Xlvp0*68jeyXVn2EDgf4*YLxYHN-p=_G#q!lP62dp`t< zaO8A{qADd5%*uNqs0hdID~rBMZ>Zs9JQA`sS2{{WS7dmw`Oc(?>FvJD{x`2-j{%JA zdet!Il5&J2+&ABu4%4Aq-qa4P>J4=0(cv zpbsD9Www`^hLEE>qWZJE@&n8f!vsyyfylHf#+qIu-UTZ1&2me=em> zm4*49+up`N8c2SvtX__gMe;40{iq%M?eh%0RBktz&NQ@vlqK9^VmdfB7;H5T-T5@v z28FWQmPM3=xkQQnE*en+y&VGI>8%V%-{>&?{fG1<1LXA^h9#)XII$|6di;50w9~BY}Xyf8pu-$RnFnD>hTP~xx zU7Mh4D?2t|J*HaKzrid2I#i^XaW)XvyZ1i_UiVEKlDI7P@^J zTX^nyTnNR+&=KyYX7@KA>v)h5RnW17yB$@pGTjck z6!|K2vFu3*lRa@6wRyPonN->sRQ1jZn}&uDII|dX>3RN2ee&~9VeTc~rD-=bjwjQN3xy--k?QodrvS@z>`uqqDM`>3CM@-oNrNX(ecP%?UWgXjcb}qJ<`F*1-Jz*q4gCkDE`}aUbwZV;1N6g+@J- z%}eaMo(Y5{+y*SoqFnrf-N1n8iTeDa)=z8OOK^=9Y^K!@~$Hs01T- zI~&&X{842&zR^v7dD*|-D$myLj#usJ&Fa2%if7?f9!_LHkK0a%a6JKfyw6U=iB5{=6S{J^TUUVUzpaK=CrcibKJr| z4-@nq3uJ!99>FH#yF*%chJ5xKg$*HwezorUO}8|ms?`Ev_=3ZPXDPMpR(vT z?*QFuH>xjjohDo^N2~Y92gX}LmS^$N;)nDsQ@)5-F!IN)-jk0AjOLwwm5RHhF=`)D zd9?i6IVSsj+f*N$E&TQ--UtdKtTjP)Hc|5^1};rUIGdCwu%O)RRIvNZhf9&t!k@Pv z(h5r6TbpZUhHjT4Nsdz;I2HTCGbFH-$)rGPvXMJ@j7In9^I+9q60U}n_obL#JVC=%c<3QiFLE8$5R;qN>R&}YiawMCK-^P-; z*Kj#$yXBm7GT6i3;b~A3d?g0C-HRlz2C#2`DTb49UH4e2R0;*8iONW3SLxE$><&IW z(_v7chi;vx;F}O{IjQFoi%WiO?ngk&M-(;ht_bM6@>D*jqxI<3kdPtHqz};$Ld_c``)aJct8ytDJ7(t@fKhYY@c|QUm&)pfRkv-ic?gf)C|qNmYP6$PnE)BR9;Jq@`uW3 z0T5CtEbsoHmlHn4EN1;=MpE_9S>K(lod88Jdb0>;emSO_;#JaU;@; z*5m3cdt0osu0!W73te1GlRhRfzU;(P8r;!}DuZoP?q(y)w1Q0Z1ZaRyP;R%3fuWBE zMm1dSAd0H;o0W~HP<&ukJJBL2h=We*=aw+#2)1B!Ws_5NiFVS*O))k0dx|`234yw* z!#8QCW#FuAp}PqFYH5ZYX7TO>V{4OsHj0m>vtI?rgo?{d0RY!&KG2nImc%RDaPllD zf@@TsBmN;@ttt1d_&yVn>VB7>BmMg)y44W=?=eJ*ss!_#kQpIRzQ za6Znj505r+xVl+5Y+%;rb_rUW@h06=B_P0p-N>U!p3#)s2sQ+O zg6Y}WTC|X|DW#jpoo&qgG=#hy2^2=P`oohzS}5^prHQwUMk7W~N}SOu-0;vA$~}N) z5U%)fVsBQ*-3)WC*4dz{RCyH&Z9Vs{(5~509#LdAUu~onawL;>80&Y)TNUg;^3~6y zc17Qa=g^%Yq{N8#L|Y7(GTex~jYm1dE&P_7fz17kts001BGw(;)-yYQ!O2yp=c%Pj znF=8W&8SMMGbh4E8sbZ}&y7{~M=mY7xw5ozDBy|(3Ti>?@f=CttPo_Z!DYp*`^g$WAi9E z5z1He(cgbOgzFV#u@>JoHeJK)6MT}D2ngXCr*TG(^4*+Ho$xo!3p*nYLU+#Os8pka{>b-@* zW~l$>)NpVxoA2%Qv9%#*h}(3>u-7Q76Bz*3Nwlf6`LDQYAiI?+&K8YZHtJrsHRacr z1&OU{%Q$b&<=#$PgT@eEj;s{M<$J^xY1vL;Pb@Og3{fFq-EQjTx<`Hhfd`+kN!(e+36@BW2Wx~i3?q^5xn z73?fH@`!`ip}jrVP|NCFJ3t_PLL^DlVllxl3LSaU^os1|vF((HUbM|SHXi|MkBJ!Q z=HNHWHuT#N!yoN!{qZaNzN?xCy}`h|0KiH|B>?rmUWf@Rt1l7i-FQ*}!7QHMg}Zra zTcckJ&c(YX$qLyqTwz3?aB?#plvm-qhQoZ!nl#eOYlHdVZb($hC`)640O6tQKpSZ? zT>L1$%4B(4kCs+UDm~!VB^GHtrLRy`gvU&FPZ-nimYej-tN8fhZcw|BnI?wiFVtk9 znb=6_C^t|l$9MvlpQ}aBa3*mU%YurR#>thO#YqRY8(*-Ge4$NE-8FjnkM+f_zLzVk zjCJX<-;Dp!h^vs#)qW<;cVuO-v?Q?orE(8OT`E)m<7uH^*b7|9nn!8-ks0VXmJ*$T zMFBR!@KkS5fO3VdCygq=AB7Y^lzqw5^IS&(n%5dr(}hyDL*{de)BO<-0jkOXI5W*N z^F1;MH%yi1@tN-6s}?Oic`ELjiM~vmrEGuiFS;Zs*T6)Nc8}ggT-(nJUXq%we!+C+ zXELFn)_^`?q~cmk8`~~qO3iwA)|MGWCQWC4HvfZ8CO;dde3|!uVb#s-(^h{PesW%O z#Uv^Q%PBeGnx$74QvO8HxH`8TBwm}s*>fvDU@!3W##4PXLh0q>S$ceK7CoFdcncUl zPro9=ql|7KGUT4yBFp=lU@CWK#i4aDMjhXbcynjNWe<;(Hcs0L;jc`QgD8qjS1cdz zv9pmm_flK$xRme!$Mps+(}|NcRWqaVJlQHX?=wsSJp=_kRvt&BJ}yeEl(in<%bf+8 zKaIx7f#Ev%XcH-vF&JE#-%6`Vn5CaV&hAT3 zdv5;TZ0E}`7=F3+(ppP&9s%a+_Ye< z&wE>~;fBEW!OK1))!YmJtda2134%dwXGOx+jUFq*6o>thQQH!aquL1{>Zk15) zW}YV4LOK4EONzx?HwERYVRFdxJzR+|@8ggag1+RCSM*3u`Hhb`uYBy(#bOgF4 z>pQDTVT9~0b}MprKwmKfjnNrkH)teGR}1TK%pw^yxRwXsam*IIN|G~CJ-OK+_$ z@xMD9i^kc;RiIf|T!|JHLPgPM#)su$O9AYkVH>ZhWuKIiYeq>6S}?30J9#O1Jt`8u zJpot;(#19q0+=6Ta9hl*x#>~nwXRp!bNs#)aM#Wk#R{=*4OeUy650)$y;N!6`9@Bt zCOE6ijSTLkF#mepB5a7>wksoMYc(4}!sZwI6Y`-j;%xR}{no;r$sLkuq%3hpywbbK z;&S<`$tU5}{;0cCZ{MG}T#XQx!Eo~Sdi{Fcd~ix&^>WKOK#}`2(Min3jrid^xiphMLT-V*7Cxt44SvNgSo!7Q zy~R4Ot+6UhYRyt3Z3TP%_LPuOTSHI=`tW_J4X-q+Pt7%fzLQbPZ2lW#k+3-{DOy6G zp4J_W9`Q<3U*hVlnqbvr8yE633^s)@dIh0~VpFH8DG}sm#~Plwekl;LJw|VuL`b8D z<@EfB2Bg}#Lg_%=m5#qUxT6#aMRz@?ki(a}i2)S-KCyeLv3q}cFpsiojhL?|V~rX< zk+)}*A-;=s>p*1TpZzI%Yjo{Z#hv-S_d*S3wuc!h4r+BUclFEgRcZVWxshjnP)^c^ z*qNvGjV3{tX9HepQ_c6>4+JJ^k*HseZ`iip8Vlh{{YVBlTnc#Jy}6h3s8)8k-@3=v z7|@FvqF;n9-h;2#jNT!W%&@GB-mMf3HXbHq_^v(za1<&gIb(FWhGweX#9A69*)OL* z8oM?D8a~X6mOv>oGIub-`AdI8f2&sjS{xYtU?-p=Uqnlko zcW!5#xnW~g3r-wF`FozLnu;@hC5WAhhmOExegU|hlX%!+5+qMs;_4TBhg|!-H!8^0 zqu1lw>g+JT7EEd4k@%<6ULQ61Pybc}$cT3Uv)V{YWzW#vEAp{SYhQ9SUL_mu#(Iyi zA3KR9zfFe{y!(P@EBuTk%#9}dK3pZ#PL)zq4rFf-;9+ViHd=0`tpZvZn@4VFB{7yJ9-tJ88wa*=^g@W$(QJ%7)Um(RH}P-B4Z=u2!l&&1kMS=u8knU(o%hIIzeDemah#k0r$Xp$(&% z476OIY7s<(ZUD#pb)O;iTTe#d0<5FQ*R8BcleMlEAH&hBo=1u_SB~8#{HVO?{hnq& z$ABgY;3L#pn_@FA;{{^(r5~m8_S~}=1MGp=3QO8CV{X|`_kL-Ex7-g*WX;v(tXQ8jkE#pR_oXLjVsS!!oTW6Mo^qvYs!>W~@WiS|wIUAAOPNb;hr77Ug%yM5akccBG_n zf5*F(($lkig@dQRYT7`W{6MkzLY3m1{SkkPiKsy@1x1wHfP?>_7m_iH73?7t-$N;WbF%W zYwuV5zHq*W`-cnoFuvAwXy#=EkTHyrM-sj|vHhbcPuoUYa0pIW!F)3oMXM1_%FIO{ z!WJ`tWl=q4-Nh0~u+)BGb}Ed*t}Qmi zML0j&y8DLqEDZXGy>DZF)-S>`H6g%v;N(;BKa8T6Jmwkq`QUWW z8{ri9%oG~ACYYHBDV}l9sH?1=1uJ0tR&5z9}@vkf%zk9wkh%FBzfRx!k2=Um_Px)^}@F89DfKKS#UY5&^ z%&!K>;D+a}o%u7-1XW~fH!1oyX89<_+n^6M{)`Z_p3=|H{`COMsjm(PuaX^RH&i7I!Qt5?u`4jLS(|oW<8virX1OQBIN$NUMl8|?Z~SsQ1`D{;XrbToZ6(`VO$`q$Hk!%a`>F|;ElbpdYX|)l^v!D@1Y8fU zT`CS7Pp{)UVcSLN1hN3aBKTTLBDv32RP%PR#(&V!8&IKRT1E|J@1{V6>KYjLD?}{a zG#p^{V%_L=;#hs?_dyrc!S$!!#jZTr^CEyV+E4j&BdPLq%+}KhA^@)NOtAkJO<2_v z1$@hXl>wx&exYv11YG~qLhCW1+pDm^ul>`@(EElcm)OXPg8fK$UKZ$E3MzA#R#(yb z5B2vq98_~qwfz&`>SYBA51)?tob_-|9?05{jf+U}~^wQ+zxPJJWj^1l*vMj&sc7$+t$khkeOM8wOHTfn}M@6GbA zV9$lq@1qmlRK*(aa);mZUFjkM_tVBsu;?OAXWbmrr+efwqM!$t<*Lj z#q3M-&HWk!7j(0;AcQmF44)kIK3hsq49uPq>-2Wf1Tpct*^&Q|gB(QyHvdWB-$Qt7 z%J%Tb`X~_9hJ`T*t8OI+ z-?u&)RKrhRu^5N+RFJ!wlHTZ{bCw~z9EApz2 zY{nA8zLzRFKga(Zvw#l8sYdW14rjD)RA~FJ4E`tR)}BX(I|c!5sjtpw=usS^rytMn6_Vw}XpW!o*E_hv+K7ZT0%!0~Rw?^-y)B(eeg0 zQ(e#`)3JU1p}u+y{m$(X)2*}(?#$bH00m}W3ZJGFP^KP(n#5VIvVkn%+U4dqeVVxZ zC0TgU&&`;7wuqwBfZLV7&~v(~w7PmI_wwY^13ixajEY%%D{=MOsGU1saHODF+P_KM z&Rr{L_^(#5SZo4>besN`DqNd~%Y1{<{c5cP57dZVT98CW=7jD|&~k|n<72;=@D!)9jg-_jFt% zW5)3rLL}RM)BDefqV84SVQTe5{7yVXLmwdl zU#h8mwv~dks@a@zPJgdcI2QfJ1Vnti)VpYD4T5an-;}v#c;LW*Zc5(Urnec75MnV_ z2fDz2;h#ypqt@J%ixz}m9`fbMsDI-iC0JMN&g)AU9YY(|-)7(6)*)OD-qhE!I?%RA zn5m(kB@HAlhX`5!?*xmPR)@PoNAkD3-GkAoj@j)f$S>=tsx~J4XKW&FrHK5cgoKAT zvrPXHSIkr#8EOoao#V28McjQ>DdfLWaPt4c%$yT;dR^(q?3Ts=gZTO}%vhu!Yxm;; z?f6y4i4@fah;;I`KHuvlbO9r|4EEYfe=Z+y;g^H|ruTVfRe*~WaEi+@p2LZ zKR89@LVX}^&cIc2qaGaxDtXTW#nwOmes87l3~Do3q*y&n{NJszS_sg9o~GQ;X20%= z{=1G7B|mguZSLkr`@htV^~k2WMDur@vcb6JO_IBragK=xE zkPNZR6r~E+jhRM9U%lkM?{(g^J%b#T9;qQTm^3=TVc6zJr}+C;7$cAk-If0Js3e33 zO+Vj>3ws@z_O4UQ;|NiM_vRb+=DJm}LfX3geb1-DKW24!!!bf%yAy#WA_`jw{f5&v z7TkEaq9IfG!lCXo*R`Zl99CoY1b<)SRJgRI?s(6uHgnOtq)F&DE`HUt zm^}2tUxm)-gYvu0&U^0W(>>D6*K-2jOTFSuXSg-)Ok0@T@ZuD(rqxmO^I2cq;LXa@ zLAHry)TD}@5|WL@!}N9fX0GNIIXw>Z#BP>$SIsjRHD5mzX3>`*>)j~tkwt8&-lQ zY_pilomGIwiWFm;sh?i!>P_Tn;B_H4QuWp5v0nu~9ZP+xud?ezyRq`%t;&9&y%hZL zuK0rt%k+ti`~adZ`Ave`si3g9&U)p9u64#1xzhLUtcHmQGsqyc?G&Q(xLCn0FO6XN z4G(~%n%*uq0U8#sq4I+VKWV8qGVb;j%#u=Qd(pWz&4ePzZJmUoCUngEPopW8pGZEE zOxWM}2F-iZu7LRse^(of3l~Bt3I*nB=Xj{hpQIOnF<8T_g}C!da6uMp+jq@)e0fU! z*K(8nXHBPy)8h}*29D^L)MQ`rj6_`sZyBx9M(XLc@-C4l6RNBwe3qySN0MOp~y_0|GuE>;5D# zP~Mrhw7feL-PD|s*}9%}OF3?6arLLzfVcg3bu$~o^3aw6rxJ_KIF02LMGwmuO|+Df z*<`qr2|XT99sKN)4Og5^P9I8B62s546c*p|%0!(TvtbuRc*ZkmMO>OUA|@w0Pj3*3 zS(`yyx)(uhwhKmsm#e~VO{2Fnmqjq;CwvQkM1YEou`w}PHX#{)N;U5~lvRZw?2kSu z+|kCVdP;1w__MOoVIIBr1!U1R(S#0?X0qdQt?LS^tv9iuybBGRotTV-Sdp7lmDKJG z7aQopQPwPw1goGh;a2vdD;&U7?%$>|K*z7;EXtTACUo3x0Bt1-*UJ_!xsi#6Q<(F2 z5LID1WTNEeM0`INxV|JrRNmd9=axwJGfeuNgzfgEAK`3JO&nVJxIp&I=IbcnD->1Azw?k3L~8%6rWu6xP{Juo zpo-OnkuyaEs~eYPc0vX(KDw-kQtpcuHsurO2_RmS37_3E2+}o-Sxc%SFFDxcH9ZqH z(Ok(Q#m!&r5CI9{HWCPre?X)pu6(XF$l4AzW}Hl?7n}lZCyI>Dw2#^HJOqx6&fdJ7 zJ}pypK$H)ixA?<_M;{Ii&{TMrz358bgajcyXkMM2ckpbSy*2HexZ!#l!|tSe7o4D{ zeNx_<#dC-NL=(3@RDpSum;PeGgy6=tSh*L5Hf z>@<^Q?JaB{XV18FmK4TG<+`rvN-qa;zlYD}#dTg3L3Z1ZaXPRW9lPZ1@IZ{(XcOg4 z=9GZmEIHQ9GUYt{z7~hNzLOcU;B@*|)+4yMT^+c9WP}32%PGtoMgY3VwA>tWf~E`pD7;H%Im6#S`+CK-)F zPuwbNoz%8$Y;FzVag$;1dy&QRcJq=#ypjly)KR?cuO_xT2A{-j>m8=yoR#)79%zi1 z8g2BJ>Z|j{!MD87#qg*1MI-bljYAt0$PBGWN!s4TEQ?3?LKX%@J9!AGQE?IcjG(X^ zAF%(b$-eAoPO7ZxSLqOgt&?-Y_<3ou|NVt0rX;wdPo{B>hoB_Dn{4ii*WLA;ZQQ*qU9G7!-H|?S?$&pxw5{E(UER)WJ9@bBpI7m;bULqL>2O}p#nsLU ccmeoD_{x)!k4u5W#Jt@)Fc_dVzAbM`*_JkPV= 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 E4+QK@4*&oF diff --git a/applications/Volkov/artifacts/mame-p3/panels/dss-enum-limit.png b/applications/Volkov/artifacts/mame-p3/panels/dss-enum-limit.png deleted file mode 100644 index 3388fda6b904d0e4860361506c2cdd3c7ddb6142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6437 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 M?Qsh0aQUad1ElBaLjV8( diff --git a/applications/Volkov/artifacts/mame-p3/panels/dss-limit-clean-exit.png b/applications/Volkov/artifacts/mame-p3/panels/dss-limit-clean-exit.png deleted file mode 100644 index 815c5efb6fca98cb50c095835a90b70287be8178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{YdDna8pofq+aa19GJ83M4jQA3Jrqk$4b$X2s2p;rn2Z^W^T_#f7>lA+v5G~K zT9_#oE<_A!*;b@RGQt`|gB-_Q9LJXEGNZINWZVsjSk91U zw&L2A3s9{qTvm z+7mVaj8`-_Z+@K{l8}(VWvi|Y>#M1$wR=i|5z3>6h8tZ!opj=|SO=!F)y`n-kIDxH z1r>j%s%ocougdMj5}EzX`l++drDq5Z699sSIVLhPGA(A}Z5|$n!!Z~P%SFNH>vES; z?-wDOO9O#XojKa2jzzlPsz+kwkcAGo*S;OuY58ybFs3m}#InM|!ej0S!6VNxT$!gX ze7ZSy1!J#uuSXzSTl5KD{`!>`GySpr?lWnC*ZnM9o$h0lh=0pa&_rVA&1>uG&boYAX*h~Zmi4>xQuo00ybKi__p?&a7#$p=M@$EyVGIn z82hKr#ZggFv_US{=i~Xm z@wWGM&4O&}ekn4EwpAmOivsAp?Vh z%H8QS+T&kJN{*0}RaC+oJZ)`l#X{5_@~c!SFE1~whw={O5uKLOeVe<$h=QCn7)j57 zB;G!F8i`CMlStR!J`nbqtQYapRACeE3O5ukNdSZ^%Dah3p{O4^l-h?_~aK%nWEt-s7YXtqbO1(dnSU#>g2Z zl(&dbP3of`)VU3Yqxt#>O!VV{bx>j$GK0qla^f%zolrj-sGB&9U`#I?{mGahv;+N+IfcH5y!f zmCBkOtYsYCkN`OrR4UcgwZAi0r$n-k%T>oX|Lq*LW?(i)+r^>COwDUQ43=)}|E?fQ z#W48OubN9k^_0Z*rGOvYZz`Qc_E4ZTi_kooc0OXfGZ%r$%F2RhwzaiQ@_R~fmUFYS zw{+*ZE$Y+Ngs!iA&IV)@7RvL5pq`tsFO)utgJi$Y!p&y0yW74YFnW@aY2zasZaEJ(U*6f$B_rf}TB zgv$3M{%MsZC*hS9K4-MLxLC8Xz~n|4IVKi)E?3JmmR?nS#E7M z&Dy|X-~c3M!UM@YJDLB-|7`*y8?me+Z1wS(fV0P;Ne)F|-6C8l*CVJ`!wA6stUXpk zPZw=usDZeq=WB2ZZRo2_JY3odRi5}(c_Tc65Crgq2tru620kz{{Dg*e)YV`O`>SLP fmyoc4U?>4Sp!M|h`fqmIZnLt+I#^X;t|b2xKR8ZX diff --git a/applications/Volkov/artifacts/mame-p3/panels/dss-limit-quit-dialog.png b/applications/Volkov/artifacts/mame-p3/panels/dss-limit-quit-dialog.png deleted file mode 100644 index 4300ec702fe011655792683f97869fea7af920aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13999 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/dss-marker-message.png b/applications/Volkov/artifacts/mame-p3/panels/dss-marker-message.png deleted file mode 100644 index b58e144b75c3c0d529720c272e5e0a475fb2b8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13566 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/dss-marker-selected.png b/applications/Volkov/artifacts/mame-p3/panels/dss-marker-selected.png deleted file mode 100644 index cfe2ec18f0e89de8ad3b63a9d936d1a243089cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13547 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/empty-parent.png b/applications/Volkov/artifacts/mame-p3/panels/empty-parent.png deleted file mode 100644 index 4919a72725f2d0415dc9dc389247347fb567af81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8540 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/independent-panel-state.png b/applications/Volkov/artifacts/mame-p3/panels/independent-panel-state.png deleted file mode 100644 index fb1fb02b8f17eaf6af950669f588600fbfb0782f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8624 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/left-testdir-parent.png b/applications/Volkov/artifacts/mame-p3/panels/left-testdir-parent.png deleted file mode 100644 index 88d4484b8df374511083a6d1f5a74915adea10a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8447 zcmeHMcT`i^y2r{$MsQR>Q2_;{6GlLk7LBw}0tTdaq=q7$P=cc(0*0a>f&x+kgeqNX zR0I?dgg`=%N{J96LI_9-c>(YE=Du~;dh7o4*1K!XKUwFT>~p?vfBRRyb9THbRPP{< z5Dym@*FlKBHjImFj{q0fF413hbFLIQ1$uFDiC%|jUp5baO38LCIb})fHmN=hmbfNc z|E&Jm`Jub87ve6t=67ryE7P8RG~9dQ@V8G|g$aDob=nD_nJcf`ELTZG$`QcvqK5Qm zD!&VwABr!j+ba_FP3MiC2;Doz)g)3aGqc`<;lnY#MY;0U^rS_9@ zBK`inO~1zU$&)9z*UK?%MrSA-UN)*l?NjPp@5@vwxRbCwlj}Nefcn~6GoKj71W{mu zMx%Ls8bGesj^zOa6^>4LvAQug!WU!DZJI?qTS6ue{CG!)pJ-F0QTL5a7C{1m>6 zxtgv@WcIKhEq_maE4tCsAMw?`zIvE_Wk!Kxdn zH|L?zR8VC3qmHwiFUw01Gkyac ze?y~D0 z{I>>>o|~?Sqb+Q9ea1dEtIC74NgFd@$yuRmv|bUx z8#3XiasqGJ_V8S08F@SxFYGSOf>))O7K11|<+1JT3fCzoHtKpt2lz@pJkGFoW_dOv+jb)w z?}h{Xq%C3W>B6Xz)oPg4n7^+iIn3fPKl6dGKYR1QdHd9t;Le9B<6+BFI2%_G*y(Os zY9Im)oso{G$2&M3ePesW5Ft>JypHe53SH!X)B}dN9uGyHd2c2DBkrS#jk?dHCclkB z=JTUUU==Ini{Q5ly>bTuQ6E+ZyCkMKx!3Azl-lNg?ghqi1xi5d?ddSn#gzkD>-Y8cj{6|pM>?@MwXkqLw z0KW;?o7f&;Quf7v4a}Mheb%8dz(dx<(a8L7GgN*go)s6ss;*!PNUywgECsF#D1u%U z$sV>U2|o;Lp+ZBcervC#Pi5UI$5gu4TbPwP`lGHN*KXa{m`3(u;tRH7^=HB)nkZk$ z8K9&s=82Te_a?1P33~-(a_$T#ZS`^8JpNh!1^Oh{lG7CU)P)-#UvZ1Hk}F$e=J+(e z-E2=aL9RZ$z2D6a=3NV6)|s;(D^#(K&a$M+59m_6)ElF}7`Z&Cc;8wdeip!PF@?1c z5e(I^^w70{KzrbQJeklh{)ERpAp}69ldEz$f;wIgFDomXTcuEZ-2idCr|2BPW4+=- z-ryY^OG_JfepDV@jKkjhx?a=lGOXM<-bGiGt4P*VSMsMesV@UpWf($F@-M0m&Wn?p zXPSit=OUipd`KodRa(#lMqTX%3aZ25a7mLKxzHRWeZeL2`?pUnjPEnaf)ls7 z`TYF+D$C2wZN77YexvxuFrE;Z^S8uAOkmy&2PYKy#Y%BUd=%i3kfp=1c#-tOgGtED zeP^?^)u}}1YWchSY)iC5)h3GY$<}!d>u&P5ofRWdR!Q&UVrAA|1As?=$~j^NrJ6wL z>e8*&44OBpZVO%*YL900XRBLku^J})S_0>KrrRQ8Xl0J_7gjmkY*>C>ktWqfK9#_FqU!JG>&t%^6Gis`F~+bgia%)coypeb zKn%2va9H2KcLQ)q#;eYh2B@(su9lWda~x_suTBL{W$AhR?w_a3f0z*13?+B>=W!PH zaPOne0UF%M3=s0=LmrhhAgE3zlX0t<*k<+?!!eRlAGzGtIEoElajDjfSo7Rm<2c{~ zFbA|g>PlpN4HG=UuzCQS*vR*m8=QoZA&d* zQ6$|TlgEXGCaya-RCFqJG{-h0S@g21_U8Kfkd3J@K@pQ}+rmcB7K2G^3piZ1m|oJ- z($Yx~vNej{7dVAvP&meKZ~8&Z(7?C*S{XAy$=-pzD}Sh_3+&b@HWK#=GTRB|VNP;L z&JfpmSk)!%?JH9TkJgA^%QVP`7j7!63?M5VXB}YPyI!7T+Dma^w`I;ip6jve8Wx(P zkdXyz59#Nr*?QDmA8iH{7q~yKQ&58>OBe7poE-S#oc4+%PiZz>irseDw`I$cylxZ% zCCOY;cKDq-Ru*#~VG%QCI&WzfbLNFC9NAgq)!>)6)q>gACdLt2r=(7HVk@r&#Jh0C z*Ocy+eXn?>$-!T{6kF$c*3Pvl@Q8=+{eqi66xk`MX-mPJZkyAk=k=OTLTJH1ZzxZO z3_Q^zEzt=@vADrWag z8fVERA`i+TpYNZl4FSZiN}vU}`hNeq4EBP0O`6n6kEAwNs-l1D%mWi0-UEq-6 zKlX47M}2$M^0m1Prp0ztoWT3!G+%n23wnqUKgr zRJ@nGbo&7ez%_66(owPsJ2jX_uqEUDXHH|>%z(!p{eicP2zAglHd5dt3wYCGW+`K} zq`3^ooK_l}CszYeGm4-u6em(Xb;Ko7W|Bb;K77I&FPfT~YHB!%p)(w08X`BoMz3@V z3JPx{cqh;@r)I?4eR9LI_~l+1(tL9XUQq^R$nR8HC`tSnhS0s0`KbfUAMq(xFoA+P zp}M|I1R+S+%)Sem?F*$!e&sNrH7QrRz`Xx3dU4Zn8vMMASZ4vD7{oQe~YQbMVY*I;y+1s7v<}i3FhRv#KTOV)Rn6_PVYz?m-71oTX zi=wY3wnj77Su4pgc0M1)40fpE9Ai_vwRgz2L@oyRN!}b?HTbZ`$8%N7&%tP)S=YZq zYa|_rTuJN}j`aECYO?GPjxf1_UbeV!19Ch{q9Ph?t4IsB6CT3(otAEm1p{{27nd57 zYI)JztGGQ^0iv9~Zd8<$)O*Ec9M$^$6*w<;htRjNfPEhYIcC07bEiBmrppw#qC_RM zFjRaS{C{wO2>27<&rP|Ie^Q%UfafI;FMqTrW1HwZXB>y#LC8z+uJ8LePQN1`R)0~C zJ^wS-Kl&;sUb&+;9d{bG|25?QNf5mJaJSZa^+LZMh zS}*~veYg^Ipuc2?_S4^ZBQmG zmnK6ed`+}AuUAt)CjzHAO5fS9+P;Fi`dQ@4&uUvWnvyuK8@ayJ!3WZ)H|3B`#t3%x zf@X7DTQn&MXeDXJW;b)(>cXC5mwzUC;kjw&I;J>>-VNHix@7kcCIv^Vy^aNRu8(=- zW+UZ7Ei5e)v-zUGT#2FMa?kp=Wi-zusjqWdo*vn%`-fN;exj|jIhNiZ)^6rQWK3^t ztrdghLz7Nktf{S4VqIGSZ@<>9tbF^_flKDR)H3h{LJXDD1FdrA`dJWbm8L=eQV^TC zo#NU|p#C;@cYsP3;F&Z0dG=R|{1a@;ZAucfsX_Jl~|u%c7myha;>;J+zG0M`9*`VSNyjLn&M zG7!*PnU)Xidz0ZMhpk-AvXD6Yj*mOz#|Tx|YlrM_uoNVJRBNg-WwD|nFw&TKiAIs# zKtG6Q-tqK3Jtf%3FE{+OSaq5HzD?i-GUFsCg|;U)%6INIQN71SW(6j#@@RS^y6iCc z>8y-GTO}bdCl^+8cyVi6bR}`_sDRAlF4g(el&|*}Rt=otjD^)V@)x3WjZZEfIdM}k zu!=};%38Elxuz&D4Ghzl84Md@fYe2#jV}m{ml?hn+P{2BGJ#= ziB_klP7$hPQzB9AcR9Nij}Fb+wLl;ti}K<&(4z(n>&s`)ROKqvR{@s~^|=&gvJq(n zSF0$E@rz(rLu`q1Vjj}7eX#r5*Wm>+a6%{R1rRNGF%ZLRm}hrxA~)^VZa>Oyv-4-7 zjp}ehF>u70`%?`8W2wqNsrO&4!{JtrX%7645Nn^V}wvd%)|!p)E5=q@-FrU(rziu6?~&iYZGdbXZR zKx7yWD%21m%frtQvZ+O@dH9g}NV0*a&qImSvNyDe2<685Zw7KuFZUEzFZ|`EqIo%E zME?7+Zf!lGktfEDxnEQ@7kO9G7zP8kYsdz3J^jocvNQ0kFvjt^1+4w>MPs=Ne1U!y zy$}to!y7u7feHgjzPDP-I$);42Egp8aop9?axW147Z@YHtCnuuZFW5H%=7YTw7a00 zmW2j=6C$gbpe0{WBSccFel)cG#ne(Y-ON;a%y?d+5g9($-?0~AnTs}+&d4$j&Zv|N zIo(#m`GJ(4on zDaGnHu~q`|uE5)FD42NIkOAL$h1t=HU)XGv!?!-m2N`|wGTI)|?9KEn1tv%~FT5Xr@vh3CT zc*jNa0dHZmSqMYE(&~(0MS8%9nEBn|7sO*Ga3&p-a!centLr=Z({+{U3p|+Y zwHJ%kr)Qx@X6-A+DwYW#3yY4*8&7aca08*+SJx+ko@aNX;~kF_Bac?F8t{-tdWxk%v5?PBle|(?n`3IhkJkpIsZC2MR!f18L z)WuY@#WYE_41UL_bcGJi8P1xTYT&*e_j;;<;nYON(-#z!#YXBJy(GizG)b2+!GP#> zS&6I*CnP~(+ARs2%jX~AzuU^nPWa!)PMcd0;#1Z5#UHgNTTBr6W98+5?hAxn_NFf zoa-6n`*7MyvAXXP)Eg8Q9ABw|$eb+IqBQpV;)f;ZzU5*l*?>9~&eJ__wZfMqlz|6T z`hFwHgx*S9ZMSIa2BkgbzO%T<-mB*d_aMcjZQz10lnoI+4#yST2f;s53xb$5Gu@L( zfxpD-Joc0v3>;V~x_w;SE%Ypw8ZLMUfv00)d^9z~>_bj~zlO&d`^}Yac7m4n&O<{6 zq~B+=*AydpMVbiEc?p}!F-rNSy?K^{8ebGNI5B3rcHH-9Pq@s;VzFGHeTe5P8=gQ{ zMSk{8fBoWdh7V$o~HuA zWO4ER*MK66;2so6lO2EBFq(E8ERk+aQ=vXPZaMIgh7vDDlbQmhQoH>g5-Dl)cID0J zTPJVGph}NIeuYU#_@SD#n7pYT@2|McqlXK-RfhXW4Mp*VFuknx zNd!FG$W07YJo}Xo8rLayFfU;1L~%(qF3{N6d}pQ(5V3#ld~hq6-otT%P|*2p0I=Cl`FM-YFzrg ziyz$bn-L0~Z+VYB2SmjU%}@ktYqGU}rHS+Md$2RBxO0!)3PcJq-U|ihZdQ@<1Ad8r z8&_JDj6M1M?A9b}G6c3zU5|-)nN5IL%r1ndxN-v11%#5%>kj!ISk$|UQDR7CmmOa| zGeg8osSHt{3KK-7Jt<`>`zoj(va&k|Vl=rhr@S6;XEG6Qh_$Sog14oa>4_0Q6wCc! z?EsTJa7}l5H1=ErZ=#-1qB~Np&(=k_CQHUJvl~AsJ!8Us`<6cTo-7TmJ2W?C;ox$> z-Tn^kQ=NrpYXsxIj!0C*qS^raWBl75%jhi?1jMA%WgZ)7K-TbZ3xckw_9Mv8?q)4+ zDT&4wAJ0IxT8mN6vuX4z>4s+G$zrblW{8hDzwH{kAg@)tnKGyWQJNHB!5z zfD6}S)gd+2z~j4L-V^=TyUTysNB+4@|8HOGTV(H2ZF!3rc^_56F>>Kx9jjn7fA`=p z=Rh|uJt(q rCkhF5_7gRBhKrir2=wyf{J}Xmr>Lk%NPKU|xsMB?1J$ksJKg#(7uMR9 diff --git a/applications/Volkov/artifacts/mame-p3/panels/navigation-scroll.png b/applications/Volkov/artifacts/mame-p3/panels/navigation-scroll.png deleted file mode 100644 index 97cd85b71588feb898c413bd4b417d4cddcb5909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13410 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 TP=^9=-3d7vrTYcor{4b$+k^F| diff --git a/applications/Volkov/artifacts/mame-p3/panels/quit-dialog.png b/applications/Volkov/artifacts/mame-p3/panels/quit-dialog.png deleted file mode 100644 index 1fa966ed3b709c7630378c964bf43933b5fed40c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9466 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¬(dLQ;R-{yc%iGMS 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/refresh-preserves-inner.png b/applications/Volkov/artifacts/mame-p3/panels/refresh-preserves-inner.png deleted file mode 100644 index dc34b34931e5a98f0472b1b3c2625b92cbcaa4d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8481 zcmeHN2~d;Smc~{a6~#snT4*+rRTdRc3?#_DHH1x80TCo1LYjRiF3@y9_9db~8Uzxc zF`z)$(g1Llo;a_lq|)*5u>5&`ajkls7p4ukw%WGyVXq)$&Dno?7;zdALjM4v*3&0Q zMbOWdgx(|43E$}-JGc}#QQo;muXpg4f#@?aYv=6_-s4}YLx%QO9C6Ljw3P_lo?FH6 zhu091{4-xhGY%DM16$NP6YCD>hJEC$a{x%UXkRis-GRCQ?yV8WxLP zYo@$}AmhSYV+Fp56f%8f{rvfJLf2Z{TFe-QNOYhvw+UcJ3~8uPO!nphYZWf*!otE8 z+BF=*lGfbb4hq;OgJA&eFfzVug_aK~I`=1~i<=v36a~@*vO7-4TRWGL>0p#q;j^oO zP^e?7$Nrp1)x3OBWC@^%ovZklrT%6!?w#!mj`!mO8?xn6euc$Bm?*X(C1U5hfG6%}nxq$oQhUf+BX-d4b4mEP zp*Egy23`yrOU6w`?EmPU5p~wFZQD+B0yc3)`)u>M3P|LXs7bI5Tqi2n7u6##J2kvo z&%WyUM~Pl37H&PS;zkCM+xeyJ3+x4-Wh2%@2EPk=WsQ$NHu(Z&K5uG( z?Fu?fUkiSexG7&z_bXx>OE7}TOHDikd)5yO>s#&w7BeflCgH77!E@WQNa829o6A?0 zIp^a*dGV#?k~Xm?DBdr17wSP1uG*x|pRZ&ZS&XSZ&apIh_&Y$JOR1#R z&-Ww?YnAOOb~@@-bp}|LpTOtY0-AIAo=85z-o?7_BP>}Z8t|rZnIWu1I#W^0Vb}4| z*RDK1P|$6CnkRQJ%2%HT^^Hjam``q08?KP6I>f(-GGu zBxBb*_N65E-gkd%Y2K88mt$i@=5WGJ=}H_AwQ?wdI{1SZmC-x8M@rXb;@X#UJJ0*O zMgbYWNOq`D^G!W8EnndZlZ~^Dd!J+@QQH;{ezCr?wNEF6oo`;Tt8+z4o?s*t&?A84YFA?T4dG1KSDWfT$SCCHu(^_{mKnNtbb5h_3Gq z6qFcPtm@Wm-}ZSDyHgzL? zc|*r>SkU;b=N=s9xJUsb@{GAy+|pT~)QjQbF1`0N%h`=Z6LD{S zoU@J>Pf z>N&f>^o9g#;g(-Q-|FeZSqgVJwDkMy5>$h`n!lHreep*bxNu)`39$dGaNL`)$R0Bm zLHE+B&0`760Qsw6Y|lvC%?SyK^t5w)VYHR8m9UVI5N7zjVy<-@938<0S~lXd?Qt>w z{#93gr1k5v$Y9Q*8jP`#4%_D%CvK%J?}ol#3vles5G@beoij;6m0B|t&46Mu{JY1J z_LEB^QhwHZ0Hi@E)A^}}nzW3TQs>gsBNPSmS- z#z63N6seFjjP$U^%UCD`B*}Ldq2Cw;?OdIn83=+52hD8`F-%#WKb;91v3u0%BPK6N zmT4?&Th7d`k;9+9HiEMEN0$_DZNb}b?%quBE2Y`j4>>8+T{>PSPJeiaC#*C5V_rDV zyTihL$Wr__4*Pe7QLMw&6sshm|xoWbpj+?1h@MRtj-`OC#esi(S;shASnk}C$Q<@jT~;~B z1Ilb%59M}lsniJcF&<1Y1dWiQzc*aL)h#GTrY$O|6f|5<`{qxLmY5O6c-*F;WZ7}u zoMZS|{W813Ros1V;mfbvKLv5Zte{!=o%P7jzf@YoS*Zfe1%WB;W2PQ>k}KK_uWz)c zcJ??S-?_zX;MKy~!#}_d#WCC;F#yvW`PxLtr7^(Y5X0&VKwIHA-2A;Y0K zOOZp1xuD&S(?iml^;zb8JS!h(6ThiR3Fo6RDH!DSkfp9vv8t*n+76XUE$HVa0GtDY zvkK95b#;9Xesn@MSD0tC_5rL=XFpsX1$;sbm|9j;d{wFTecnSNW_vqUK+~oP$W3-+ zjtrC=LTYW>_=Q0ZW}QqxRXs)(MOQ`xqqlu&%-#8PM@-Ub$(gCCTh7iE9_+akH3!Td zeGT?0QAD_C&*?xpr{8B2pIw0Q<~yT%XJ-3F$Mc%eL=Dl7GX6`B_!P`KR!6pXpvJRU z3CP*s8lzOZV)-R>w4x|5_14;2o3-MaC# zDi61xmgdcrRCv%{@xqny%B;4M^~z2GsBjo!(_58_MfJCv=q~#sTyE zIcIO2uUz<3nEe7;63A=N1g0J(dwni{9VeU@j6QH~D|iT2Ip5_pF7dD;!8jWD%Zy5>%Mg zKg)Q|KdZ0VCEBLYZ)`Q)U7b?tz2b|tz6PC%UCecCXlVG%-P^8EE9_9^)NzalQlbDD z6CVB3>ib&mrZrn0{4;{HPtt|0)^-a&r8Rza!vN=_Y=D0WqR##M06+1I;(B9*peR$d zmY+-3RfJrg9$+_TUnDBkE>-JOP_wLn5;fl*D2_<#e07mA$IF)}EcZoAezuzePs{D% z{R5*P<~w>@gerVb*3}DAX=3Yl=!Uq{e;od^VBaq0SuL5?FAhEk+b>UFt3H>fvd{y! zKSS;z7t4Hq#%ql=Pk4tuBir7E$C_98#P6z33b2Fa{LU@@NBI`P|Fy_}iV*I);&$Ik z7D>b|8%Xw%IWzQjx;m0EV8U%pocrZ<8NEr8@sX;%in)KSWI|;W$EIOU$9_CK)-hxi z6O3f7LZCCPj8tgsJlDP2QJdaln=t6g+#e}7=chu(&L5cni>bJ=$!&I6T=e|LUoO0| z{^>2ZpSgJPBH?wq&Sp(6$2LU+yhK5Prvy%O6#|hxB(Sv->_y zR{98^Cg-eb3rq|`Lfj+^8GD!=`??!l4o@-!g{x1J=pEfAm0~s4A?`D;_OR@{JrS3` zC^S?uy>m--dwlpaIVKCs6~=c)tgp|PC;i;fp+6WEm9pm1>r!^aw)S>Ze4Xbz7|-KRK{JKe{l&_zU2#s z3bCu>)h8}#o z{$2?f?RUl29N29sFZi<6K5f7}@f=a@TqW=a+05VHZ2Ao<*?A_IS+>+}nvtn;oc)aa zd(qEq8>&6K$GkCbb__|rFqYkC%=XebZvpf1CIh#;Qm2+h+6nsgE9Lm=4A{*fBD`qO zOwEMsU7AzkNCW#gJ`Ki(Ssj56+(GYzI^gf9${~HtjaHDj9M2a(^_vwaA@2;Mr&aiK z#v&@wO1IYa2&3rErE~X=p4r3E?)z!bl`6-NI6Dr3(DZ>OB@|E~WasK->$EpD3p zq9%H+5bV_l?@TsEyx|{Hy_+=@70X8daPmWyQ{KkiByX9Ux(EP+5 z6wa?7I7<4EYLBjO{K*}E=y`JoEqkegDdCbL) z+!z#f{{Edt;ty|%$i=RYBhqAOr+Li>9L<$s;-$MZ?8y9ftm_uI(`@*%db|%PZZoIr z6lSpC*{G9{e8?-jqF;L%!#nM{`YbWb_?V@p9x>O$t-=87RUs>noc`D=oq9HPR@#aa z8?H`NHxVZ`X$}|c+7=M)_b?&b_mK>9R*0M|Z5V0M3dOWx{mB1pR|xtw4}7fz3RY{+HI|nUxpao+>Yx(prySR$nX`H5Fabd4uyay@Y!(0^moKObFy!dC zlElP~%wH&s8KQmJa4p7`N}v4Yz|c4s!jPFnu`D+v#^1XhquL(h#fQ84_47&#-J2PX z(11}__YusXXZ()b&ng8!0rD9lma*}nL%OZron&t->DuFhL1!{!hOQM3NXZgj?-r6; z9t@=HfOi{coA|h~fD>g~;th?dRZ9p?4WCo$|4X}ug7`2YbRoT+aTDgr3kyl zC-|tjkP=t+mit)X>z)DBh)Sz>=3b@2kpNkRLA{&o!!x*Q#IV;ZapBjQFtWni9m$_q zB+Jl7V~Y`qW#qoKK!)e3$o@o6LDvA{dABR5Q`61I;AV+bgK5(;25MaQ@?F2*Kz6=4 zuh6g|z`{TkWRszHW*SeK(#l19VgFbQH;YtOiAP@GEwHf9w@|WFnUD|Z6JK$vV^=JAK9!G8WJu-dO+bkL?C* z24(75h!%@KU!>Z=Yq1PpO41zdLm2n>mX4UX?BK)v-3A7vMl8(Jc~NhdxB}cb%V&&u ztLX#1m6J>nYEr1hFdI(m^?)hHlY_`|eiz<}R=R?0-|r8k5CxrWk(NJ5BxMS2w8*{- zksJnqV|Y_hPQJ3Q;`;w>SR&7;6A(eTBVYM75(2@1bO%?t4L$ZYl~Xbhl`T z_nZULvOrQg`syyR0^wl_CvH0W zh`T}%`7pq_1w+R3#u1MbS%GT}TW4HrmgP>O2ouuL^qqW*_)T&drIr0yqy+8$iAfrj zZ4*jy=5)zcQ*PN0USE`S+aj8ssvl)J-Y{2#xN`yj%nwUDy?1&{RmIQ007RMfnsGVoWgJ*zf#(vmH16fX)guoC^#1Nh`5z9T502^oXP1gG z&f)e_L#&--?se`T6C^^7oI>rOKA{nw!FPEq^(>8~E~#G8x+bM?=aQF(=9Oz+ioWMj zeOyZA1Inn7(7ORV)^|hi28T#l-wz8>mNExDcCQNJHWlUa_Q2g@svRe Q?mQkdBP+v~`nMnb8yPbkkpKVy diff --git a/applications/Volkov/artifacts/mame-p3/panels/root-both-panels.png b/applications/Volkov/artifacts/mame-p3/panels/root-both-panels.png deleted file mode 100644 index 295c9953c326cb1c9bb30a95c93085d1d9e25164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8553 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

      ST<(!mhSWl=Y5TM`b@gBXqo-aE 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/second-launch.png b/applications/Volkov/artifacts/mame-p3/panels/second-launch.png deleted file mode 100644 index 295c9953c326cb1c9bb30a95c93085d1d9e25164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8553 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 lxZ&m}VRB4Mu! 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 diff --git a/applications/Volkov/artifacts/mame-p3/panels/store-boundary-640-641.png b/applications/Volkov/artifacts/mame-p3/panels/store-boundary-640-641.png deleted file mode 100644 index b2d47e2cff6f52879ac57651a19686e8a0586dac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6934 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 PeLThn*Y%6_?ne9kM)uG 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 G5&J(E*1RwP diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0005.png deleted file mode 100644 index c1f7d9cd97856e102ee4400bfccdf83af77a9aca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9649 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0007.png deleted file mode 100644 index b17b30540feb47090bef594734ca2f0a7787d179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9687 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 WIz^1_HU{SL8R?r`D%W+m_kRFpU8var diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0008.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-diag/sprinter/0008.png deleted file mode 100644 index 99dafb94f844bef9a723b359f330d0f9f0de26ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10623 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 >@!f8^c!khp_})=3>pmw0X>qY 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 TbQ=S|<1x}V)vM6GcIW>9c#0r; diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0004.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0004.png deleted file mode 100644 index ee4a8cdf01143d2eb8a5da5c477251357144185e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9885 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0006.png deleted file mode 100644 index c397f855042dd9f429107e5bebbb911a31f3a53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10099 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 KS*&^g$^QTe{EiC% diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0007.png deleted file mode 100644 index 1e969368c7b085e82ebe895980a7952d4135c335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9900 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 T$7)deQK>!BdRVCRBJh6!+c!1D diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0009.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0009.png deleted file mode 100644 index c090a6b73e93f96ca7e19aa0408c09e09485c7e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10950 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0010.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-final/sprinter/0010.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ+ zNRfz&AylPBLJ1Ne5D0-l2qEnTX0CVMTkpQI*8StYwI*vN>zthZoxQ)kf4^OF^3dAS z_`trS`*?VG4w#x;u;Jn173SgDCGq1A+;2*+hWPRDNbEJepl=tMPb#o_e#L=`3aUME zH=`oU`Lnb2F+b2jgOlOKCx^76Y~EW1A8LQF`*^EKYlsQUeW3U~2|c)993M!OLxorMDZ-jC@8M z?QK15ufdNe?*H`rhXCdSXZW5F@HDlFHW`y6dT9IW^soZ0Fk%jpIXl~(gIp^ho5Wcn zfNy)!cNQI=|61$mzWH9Hl#n0<2uyWnQ*!d~L?RIllgWdfad=TxT`i^&{8SUV{>2!B z!2qIW9<5FrZR=Ei`Z``KX5$8!`ArD=^?1-^YZH{io|}n4GA3ds*Paj%&^ApR7Tdh| zqUA}(N^J;&B5Ocz_A;nzQ%ixY;U_W@$%)%Kx(;_ML&|mBCB8a+hPqq{8^?n z#l^+N0xyEx?3iPsWe_*|%Am^ef4J!%4%<2MS%>=XT>0$s-eAX<_5uQbl19G3g z7))%P72vz;^vWFcXk$ZCW02(NM&hCD zx;RwY1->SSu;Bnig-*N&+m2qG%ox>t?e0_M81mDCx6kuc8%!JE)+L^zyW^G3L|*Z7 zu2`RmaK*&w0?-T4;1f|Wp=4XiA)s)5f+uq+R!>#e59&}qI6(iQd_s|G^;(8du-;ab zF?Z!`=i7=(;8IkV?Jsi=odimb`?n6+vrg84hd09#PJ4|fzcMVn676u*Rt0nI*JbKu z1>9%9ftbgZ{VJ?6T^Bv}NmbW90%2o(jhhNX<^fi^NmR`8_=8-=BZi2Aff2vT(pb5u zLMA)uxhN(zKC!rwc7H%aXw&Fdiu3JnLlA)yXyx_lz?K+goXRXt?6*)v2}!8iWzO&>R5PWz`f?v>JCw+XbtVf} zfcrx@?;U3ftQkrr(#~0Zkh^2DQ z&l7AZI#OSj{l0_jyONA6^`gwF%e3s0x6|2M61Ui{OL`XD)u<)YuU&M6;k9MuF8G*6 z3d2E`lf1s#JV|0Dl|T4$5YQeUu4^QdNq=s+A=`}DwI)r%90JnkKcL3}Tqj2>bj!r{6l$R{0(^FZ-)o|*{NymaK45EcQLtNo+s-T# zK=aWt)$)34QK)r&z(Au@>gQr-&xgt^mAZFtw*7IMbTf_Yhhj>)%@6toA(!}G6w16Ggwd<>XRr1iV+?YD}o9WahL9hy|i9EmAO&PPpeO& z$l{3kI^^VRQ5|~r5Ypc*ZhtnKP{s*7hd4KI=$F-luGcY=arZ%h;d=^0@@quTm*&+{ za&sydox^z@pGO`tYhmGtBf9fryk*!V-IB&kNsvRBb8${;=Zvx0C21A-@wX3TKRrWQW{0Ob}$PAvm!(#$@B|`5R_( zH`O|1{N^rOZ7k$RG*eNdy8Wp$W-3vgwEi4EbC0#4!Z%R-E%_ zjio61Y)&3*cz75lV|8A}N{jCI+P%_ zGo2`y9af7^?{38Wx-3vF5ub3X?wv>4RoP)n*r-!x{U~2!TB@2r2TMCgM+TgSOk_m- z%9wvsYn`Ly9+-OU*s;MJTY-k==H^$gLYBVP&M`--UGnnsQat?K*$Yz5rqW>@O6&aXceJ9sj{VOe=Jr zNnh(lW3kx!IR8TN$f-LRw-{0zV>zHt$*uM4@icK=Y+GzxT-;UyAx)3H*@$G3Wi$sd5~r9p)w6l0yw`B`M2mnPI{z9sLdu3m#+sl>QB&*#_re6iSX)#F_qZ@H zc#T{6{M?>s+`5K^P>I6}=!L8joHQWRwgIvs__`cp>yEzUWmx5(!+)tp@!r<2qU^$T{>!66oMZ=iAQtbpx= zYFbhdh7Ui=(EI5yq71I@1Kmw9wBNw#&cIx=`prvx`oR#`&}&}W z8$Nvzr3DqL<^*$&CNLr{Z0D-1@TnITKxDCtB4=nsXJkw_$!ZM3nf7!bA_Gk4sw>vJ znjIZW50idN-c+Jw6u@Ms*=hnb@*A$7g!GszhC;fbw26oaY#FEbR_|;IaI;-VQ9`vY z!%To@ZVD-|XG&yIm`KIA>xB`A8UirfZU#%@wl2BdoGlFUd=6*5Oz#T!WqzAaDodEB z=T7_&D@kDjYAomsX|#?oo8$hZmCiW=jG}mfDeHq)>ZlJ1Lh2})Cy~!I#dRWsJw1!o zB4(A|uG@geTO!CwN^Nh}zoIhioO#aj3-5cU1eCWc5^;+x)SPUM0(00b7>6D7fZOKf z;o&O2x%d)L&IV~LVtKr2W0tdt(mN_bMd`6u&$!dOG9&?3JK%FX&4c_OY3uO9)z6*X zb*5%%qJ_q0kU69vXv@$WROX*787eeP=tJn?^0_Ui#aNjz@eaRuB&h+j+(K@fV@`J@ z^{&o;DI#^3Av?z!gK%UhhcU|sd{#X0!)?u%);y5fz`_^qNH(#uCNMB?65Oxb+x@eQ zrTJKm+gmMN&A6@g^_k8`l4E0Is5AiCon41uEv=#e?$?I!W^xKVk9mI&#=c?D_p=?y z?%@Gn{Z22QtAg@}Z@X8yoMx+kpzcKRox!fnJpxDm;f&vVl>gfeccAu1d_d51ZT0$4&79u3Nrt>~4?Ss6)Jku(&v9Q@OJOdvg_U(amWqUnBIZrwF7C zC;oY9;AAWP9)S5&6Yl){9=}lFjT^@`g0F5Z7o`E4+uGXJqy|%tsdKT4$sfOk60_2! z+JPz4NlKGZgo0kQ19EHl(lo&EJ6^f$B=i+%bBm}9aP?t%d~@i6jb}#gr-c?S_aY|3 zFkJMg$3=0g_FN?SEe*Kw)f2%OC*-av#VvrKTZ4$BdDKT~v0lYT5HP77fQqjc6^ZwRNa*6Z73A zY4RO@{K6HQkVO~V))a6+cu&X{YcXIbz@^0RBm#9dq{E< z2gXKjQ6|U`8n-&uK&X`n4wJC`&dWxL$5h?A#I>=YZCva-@VPCH!T*j1#M{oE#{U1X z=0C9H&yc+~VNe)tTJm4f?q3PuKdbz`bpFBZzm#x0itVKSPb2h~yZ$|L@Lv%Aql@`B zs*8Wc3R`{$gEmM#<$_Fom9W5*la*_kHKE(x0IxMh)& zVpdj74)6;5w=c}H)fCFe&9B{gJUH| zYw1L^3sd&83fon@9WB@au!kW4jq1;gOruqcqJCrKkm?;h3h(;GdW!E|KtB#5s|us~ z8-2yw>4Y0|)lS!VSAO75s#0IQC1^+Egp3T=2HjT6ex2Pc_{5HSWeBlZsID;Dr4i2% z$^J2<<_qm79-eoKyEQQf^mBo55Y|DV`7PiB1uvTZ%&SG!&-YSC$8xJw3Jl>8{V+VU z#sOLOs*Uw1>(LA$t2FyTMS+868zkQxl4$5%`g#A!D>ldWJKtXqlMS>KppsDc^2;43 zDylz2o94r1A9#N%GS3Ws=#!Eg#Zcn!(WcjE5uR6jITvdQGiciLgKqMH(y!ZLg2$kR z`0@0{fVq%`YEuyFiTy(ZaAuq0nwERLbZ1NAa5Z*c!OhzH;j-A0-Z4b;V?@PEZGugL zCBQFnMuWAHN&$`C9LQ9*y==khk?(r9MQGSH)HjTC$UPT;A4)52I4?ATvdkZT!U16ERKz)r7eEnr0 zWb;Ikxq<2eiPnG02@&fD8@DFA$o}G|;`OP2z2<1y`Mv1Afo4_7)3%wSW#@&q!Y!D& zVN?{x%a7hQG<(rsk1z(iH^WdeK{F+-!Bm|++po|lOMI{=;^C9ZJ&dML8ab0Bwnl-=&6IHR? ziBxz|O@lc&8Wn*%UNrtR`m2t7QeZI!p#*8 zb$^?4H?F`}RmulHs$?gk^Tz|TGMb#--cX5Efo@^_$#vFLf>B?6e#%|$Gl|02pV&-e z6_7i2#sxfTSSR$#`hd#~N=1~Ef*#obrT(m4JGhVz$H!gL_9VP8pR9w2-~UX>YK1MX?0#&=}VAA9H&-QzHhds4+JDU+m&=>o^3uU39|NW4&T28-j?4ozxcwgDv+Zy zdScL`DJDa59cN=%J6H{UsA}oMtOzr8@RlwB<)dTGSS3*5va<66b4Q%GF9edyG zU-qOp(@!ZCu|MqV(InoJ^`OjF!1hM9LHx6Pa)IT??uoacLCT_?UKf!AvH9p*71KS& z8HjUDlQXTkOI!vpHSn37ktnD)A$5hBhFyAb4o-}k z1)PW=;zT;(iNn3B8`_6anHTdq)3Bywr<(kdUywt|{rfSZd zt4feGd*gj21tzLDnsMpX+LX>|84EY=1DtoR=;p)t{&fe%3sFZ5AZq%PC9*e3F1#Do zuS(XkrI(zhgVbN+s&gB|^PQ&6KNT(2IA!{vVPjdXmvgmn7Ag=5wt{JbUsSQqw~Ial zPl#QiN5Oc*g-ciNuI$>7U-gDYRF!=#bZ$!6-x4AFTYAo#;7TK zimG^mQo$O8I<>ZjyB}~dAVm{g#{2A(lAvvSt1PI=vems%2wX)G(1Zz}RlqK5E>(0) z*yTF$DaGpVPlA4N5_`SRTc;q91T4MalvAlKsdNl{rJ$qNP7lrah{k0Vaqy(^^J5G5C4+kMIDR#%8Kn`3A1nzxx z-%_@6D}eIU36tEu$d3-~CN!;GE=~QAp|_O5Zpvgj-Oa~4XV{e5IXk~f3qkV|9kV#o zA;nVbxGvSca~!y-FWi9$-+wijLS>w)tCvfUIWYE-esHTu3I!1U6C8 zv8EqA|FyJ}e$IHjBAAnTWO%%xEp%h+W?QRcGK(2HmRk zw5DH6nRJB*y#^~p&lY9)Qi}SKst{5XNqS+o^>Kekoq?BIot2b_I)2#}<9g(@d{L+) zkIFK>pbutB^FF7NyEYnB=0WdoG+FG*tdg6nxTPia%j*|(ABZD6E6lVl%boo4aTea| z+Puguw_ANr=#Uk-)af-?expCSZU*U|G;>J#QGX>8$PRy(yBW|QKr{9IG;Phg%}<6^ zbgr#RpmM!`UNkmo%S-n9Dm+y4Y|xib5?bx^wmTWxLL2HNXd+)UWj@t#sNLP6bGWjO z$)xe7e|nUmlQW}qk}Zlt+&W^fTj~D=A*C5Ktn7Y9R;7!kH=2uA zJn#oOp{9wMtAu;{`o*}91?&L{`i6(LQr(`)!1wHsM6rwrvV6c7euUM;6tn;BPxe$I z!QD0|RxTUH>67Zvaj*yLugZYkT!&h1bYu96S5y}VY8w4ZK2UIEy_#^@l8#$GXwGfc z;Iixfr%D!PYP`aDw2+%xxzCkOI3EUbQT`*(%j?B)fivfK-#)1SpC0}GD^KCW9Nsg? zE~x^(mH_U51H?m(97An`d_p5ULcDn_^ev1e&MGQvs7su_cGgo>Opu< L^1=&)t9SnfE*;fg diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0001.png deleted file mode 100644 index 2a0af2f8d54513815f0250fe4fec75aaf54bcc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9508 zcmeHNXIRr$xTlVyqR>(WaWIO=778LGKol!enPEmiWXTX@&m zh*SYVhRjHS1c9(aBq4z$gxr9(ddKtJFZa2h`T-uEKj*yXJ@0vcBj=w4b5nz3M@}8# z;o&)EWcaHk56^xf9-i;S5AEYVDZUlx#lv$h!RXg3pzs`0u34$0Ev?JHRw5>~Jj3C= zgZXJMlOOed4lVq7L@UBFCMNCBrE}Bbv7mtI_kyxJNwE*+jCQoM^{MYKp(+nlCLAsm z7qsv?%zsAX$AHCGW$aw~GIcJebpJV6>7VjMv|{lq+YCI!8P~B-;=vDk zhxUHu57IutXw$I*#vyC1n|Rr)d(SCVvt22i8DY$eXa)t1Vc#w5Pxwi?_~_x?IWqV8 z&uVQn4M6;wFfh)JH>*eqQic=N44nH=>pI$>A#ZD%tA+9$$n)k58i?sYm>ZHQ+A7X1 zdkgY|(B_`~Ic1H&t#*NOQr~m+Ff!hev`t52AlPO+ZJRn^%gVao_;RJHIWKChi7|6+ zcV3`)w_as+wGtnOno9;vBqt|(vwBqrKoe=wX8nS4yGcJ59#tHfpZ7qqN2{UMcg?st zC~U8%z*<5Uw;9w?`nV?|R|>SZaU};ZnDs_lw|0_)-)ytBFCsFB2MY|c;M|4Fj{rFg zZVqO;3^x>JJ5BbVQhhDjZbAjH=U4W2#Q9O^$X;2%b~4|LJ>#vKsE)Vub*V;7I5gKd z)k6&l{)nGZ1)Dx+_>XrA6moVId zoMV{o+5{mk!aM4g59Cghm9sof&Pzdj^j#6No8pE^96OaUQmr1S2&%&!*sLyk!1_fl z6<#iE%t~FUOP9av2Whyd_5t+Ar=I>uOjqXmIF@n9k9D$p(ym95&c{dmsiW_tybN*3 zqU?r=v*}{kFJ>^#`KWfi6ER>ucVF+CvdbT7h?{LL!+Kl4T`zO49%s<7TZ%S7q=k$Q zoFr6!sTZ#6bTL`Tk-wO*44M_}L7CIxr6;=Z%~u#q@|w>KOWpngp+qKCOJU@$l1vKH zTt4|MpLOQW=Akh$W>ZQ>MNk@x?w`|HU8BP!f~&!)neG`G(o@P(ERt`~y+T$)3(Hn6 z3m0!VSEV;D5aNKGz(aeq(x45}cBPbaMK&+@*|1%ZY*0pp3KbCo<#uC zVWDzuqq2jaOwut^qB*0s`8@LmOrr}&AiR&@a%Ps^?P~H>#WJww`eP6y@d_bhM#z5c z_is(9Ws~J)Sbwo>$bEBz7MMkNh<0|n1hd-29yXj-aX&H8Bn}=)ZEtPqSb)MV$GSN+ z9+@zpF-b?}rcTeW6aPZa4j#qVY^ybN2rj`Qk`pOLdED{itu5~spzv2hmio)YWUX$i zbf&SAGT+}5s?2k40QrixuUY&mEXBU831Y0eflJlJ2=7iq*3gH1%bQBYyg?>;qtTBS zHi(&T_`Kg!#yh2^FfuJ#qJ7iJ?Y8-=oW-La@z$lE3`NSa)R)hhjmwRs#PGgh3Bzr> z3N#Z_$5gdn6ZGzaJK12FGN>Qmy=xx&@6_M@oqEneA#as9rf>vl%rMillPw%EB&(Ah zQ&Hxpn*mlUV(vb^`X#0a&-VKT|9qZXPH$M)XQI%pkMW|Bi)+nfzjWZ%bSzz8m+~a# z=&AG|ZUyV#3+tr|y5A^rv;?NJcriVQ!}9Q+%YVA|+Ae@jFVq`g>dpFBT}DKffR$wg z=kCKx=w+`Ka1ql|yNPtwKXMXFjnj%c8PWnS#X7^-TkEsfDn~FFjLdR=8QlHhuQmv4 zXP1Q*bjTtST8LE3<{=u6QL47{xDcqrnv%|xu9NEDS5sIVG?Yr38_QzSE@{@Q;$gYk z5wIoo-`QGT4IZ`T-OPvZ9&a(`;A~r-I!Ln;VuG7`CKDqbPt>)FOonHJ75ltHzUCsH#zhCdJNhhqtzEL_f7LwEB>e=*gVP zg;yK3num)`kMg1X32i|O{nmgI(_Dv4CB>2b0@|N&KGjoU1jy(PoKLu%)E>*bQi9Nh zL^9$RQh+;K=r&rVmn*`=(wp~1LE&HUWyjSLH?@gz+q$-iut#sGqQ)DhhGs&oZUvB_WWJ9pNh1Gpq_ zW>*^F_4MiZf^(fseJp(6?}=f2aEesXrRR-&MnaEV^3$!6qO2;XXA=h?7Wb;ca}HSX z@*Vs^SOFBl&C-AcZuZMhCvOhr_gk&5FD9Bn@mUi`Y>~QlGCU{GkcE~%#*0B0^W)dr zSZn$W3P#gUvvr6?;OzXU7bGu>;+f{(&Fp`sm_VlU4kc@O1F=0PZSd%fi1g+7-6hxL zMt%-L$!_{v6*4oef3ZdKUm09b^`QmOEqX=u_jbySN90KQcRf0*gxRLdRC206)w*_- z=awL#FL7%G3c77`D1YgFeZg4;5Vtj6KPeMSzoh2de5xo7cOrf;H!ieZXn87HW2#Oo3HGF-h z%CWgWPX`QSlVO}F;-5R8;(^hOcg}el6vnxtOQ*YGhVqu(f@L+-$E{F5?f3g3MrH_4 z0sDJ*mNIYU^UMf#{x9I4?a7d*4Le5=Gjai8co>I`Vf6W*PmVG*D(fqzW_ZCe<}?51 zly`c5PJt|M=ZEYb+8xjDxM!JlQplUo23hFOMTYJgTm@%`QeM&UX%yC}ncT)IXY&bP z08Pa53XGXK?>t8PV5WqdOM)TT=cCYiTe0pw?iMl&=K(q zc*POg3f37y8|9i>uHh|VhHoqmx-&+Rwpjpa(;U0CGaC191qD$*eSA$ChB1c`x;tC5 zKk4gKbHfgY4>w@mfSrn%XwDUz$}I{1eSy@)yQ5uTZSZbMW+J4#Z%KQ#Oy9Cs=kDZK2a(L3ul8zML)_ze(aTa0NG zC`l&Z{DfKNi^z7fl-Jr0GwBN1wb8Wj@Aptf7CJ&S;bJxyX->CYtsxq#&B}owgn@}* z<1_OCG3#0zec!Tx|EYKCtY7F+58S-kN4aC>`w9^2{d=deXZJ1%5LqvS@2pbbz6q%% zGH~PAiFgsJ2KE-0-*&P8c_Unk+bu!NXM(#^y>?DGJe?WI_^a{#sHABt#3p|uB2WIC zVtpQ2?}d>~BO2$|MqdM`je>?mdZA+dF=%a5RVRN7mwy7*k4KK%;S)2Zjx3F${w!JY z%x{dFUxsUm@KZI$!yP-mE$Cz0GADdBM5^D7)h&qd5ls82oRX<=`jQO#rWjV?Ym)U# zH{o@d+a#inQ;3dD{xS=SFSeRdPWdSboA2NGPY-ycMGxCKrMa$d9_k*7L86z^d!HKs zXLG+{N70_mkfrw@hkvD!)4S<%M8R0ssuifWSU{^{>dxF(Q zWi74#6|S%%TD^I<#C`WX>3;IXSO<;flV96+Tn6}FhBdS=j&ez@Z74l7UC>r3kkk9r zSt_sJG?|F(Qq}k-W_m^(9o$p5tol3LIPcHrati6WB2>Wo3lGHdo`i5!M{IkVHwz%P z^@>-4wu^1pvK4~KC8-u`3fJLnKQRy$ktu#V#33&-89*R-XO0A&>?s7{hQ zeaSKAvvkn7=7S0$M>(VFo5s&hmH^pHE7)on$;UZrhq16L%^BMSuvXaGO>2$F3MVf6 z3Czk{+5eH6ZRv35Osbp-Nj|T86s&rnU_PwsW5buKb9H3C?>SdBHj%kSaNIw}FVjE_ zvN1SZV&<=?GW8vE6m1P&8gdMqqD=-3C<2|DLo0FkC~|9x4*i3tF7=r= zC((I(MvSx7)#CwKyegLMbzqnaPf@ycX=s9bhM{+%s;EtVvCGW1sb=Z;>(X6Jnegyg z+y9y66zS!a?>F@lRa+ZC?8zVwdgetG4#>e_F@&v7^>We#VTUfp zO?>o=^~!?DIW2WdBPw*cA`4@z=aQor%B)JDT&>$#^#roGKi~{)`UlsH#NBOCX6cW) z>uJHnP1a2KPG;&wX&b#xS6FYNPiKlyk#B~_+iF|5j_k{tGS0g-usMbEmwi`0@UZ$K z@%R+TC4aT|DIuXtjRjKr25-X*A&{@}f}Vv9vEQoh<$lRoBKEbN2Lk_%Ytl}tzV7~; zvA3~Tet==Q0;)RvysdxV4@udCrnuoRo{8%ubUgabmWk~-zpso#eV_G1olQb&C2D1b zZ-0eeW!{abholJqlFp$vWW-b9Z)lzw1)>Gh ziH^_o+wIAuzkOFf?QloeIp-ovt4>=7Am6A+XXs@yXvr@sW9jE7U(ZD)dh&e}ovn}# zVMvEri;uUBn9Mq^Emvylyp$TMpNz`Oh$iae$6wUm6r1{%E4=`P@a=~V4ftY`ejyqc zjx_Ivq9t6b^`xx)S0Ozj_ZCZPzxr0g(5@NRz)fNF>9T(HfJ}JmsYzWsg<>b}T}DBf zi03OKLzAz>6w!b|ZGv5l8;ctd+B){Y2t)7oQE-qkvk%OAT$}60SWTzQ>?%zEZ||8)g!+$Ue$vkVX~iy@AhsW&3DZJ82gZtM7FkuHgsY$Ll9X2lP;^gXk@zG%zQbTiY)JeHCqSfFpb-xucrU|=D*O= z{~*8Ly*m33mH(%D{X1nBH2+p?_rC30zxHp#{EL^*w*vpt#aDItmo5K4*fNrEE>Vkg zmCk&vp8#fUD?s6#BO^(Jt&KxT;&Vk;doH7|I5IH81 z7PK5Jkx6fYp-XDa;a*TzC&8YyT6S%H+en*Jm39p6mey=T5`=!7XG8y`7>%Ou;>n8C z+$4wYgJV~*=3X)c6#(X-gQ$zKB#G^Iuagji&njBZzTQ|5HszPQPEQ;Tv_J_YpN1s#w8Falcp2$= zZxW~zQ2sw|E%*9GVd?|fvmc0^_YIOuf&$H5hLkY$L420HN;x5@K-H=<)cp9;0O{Hd ztIpVcNY!Q%#FYrYr52}X_Pw$@CbRpBl#y{5%W}}nVp+cRk3!}YhS{*7%bRm2pm`Zi zXOqO2Za)na6_R_zfkTmZJNvSE?)m-etvDa+(rUoI!49BX0 z*U7!Cu+>l-v1$-r1Y=o+CX8SE&N~H^jp+XQipA)&snd)U3cYDI!{lS%sFIwMB|gLF zYSXWPl%EqLCou($ss*R=$M}laap(ENFGM_zcf)XBh}BQvu}W}#wpY)>!!8ZYYaFxQ1AZKWTtx%lezl}^+{1*4omL2lk!R$$K45Vh-8ejnn71fgJ05An|g@H8~j`4@46j(hsfbQ*^DbgBX^XMbs*r{ z_KL$>6WK%8Y^$>_Q40H4@lR(DYC=*(M?_KRh)+TT<~^sd_tTU?RughcMf^f{uO6ca z8U&TAHV^ISg^#0CjHm2-025D`8FWCGkFRqzLJc44Y@8qkEwggf&ZNveE_$m-Ef$a) zPZUjp+$0@JmXO*^TMzE^M;wve`fkFkQ|XvAa(zywFmxjT<$6^nXSWdCBKpI8Zyr;B z(3Rs(uuMJL`GNc}mZWpRWII!XRIs>;u78Agz(9kjw>8~67-)l`QeR&}xD0ZopJMG` zx~3kd9V!YyqF!JACLUyYI0LeC+clM9; zVw)v(pZT<88Ip+vk&YZO%S`#D8yug0rSbzj;HJH!>ba~2wx-KPQ>g#IRZrh~dx|cS3 zbqJ|ZFETp*7GgqQI630|gwZ1t&5o0Y^-R-SFy`k(tmMxQ@zJhEo3r@&->5jccGF;AcAtL*DjFC(vP zXdnl%(+%;iNkE_J*+IY#T~?L9OXC3XXAsW9!6~36QaQG;cVKQ)lziZcrz4P*l3TLi zWXq0w48XgjO=$SEY{loknk;h)Fb-O97Mp+g+TbJVSw!NP4;|ps^1Nrrg#25|ub8c_ zyisU@a_4aAn67)zO1S|a-tzJ3SmYLO3k+Z;=31k3zWzs;pVI3wv3omR=f@oj&aIrX z)7i>*xcr;iv?A8erfHQKl|hJ*>EQssfZT>Ub5zFnp2 zL@ZkUPtfo}Q-EQ&E2f(qW*p_5y=@(H=AMF)ND1haL*1i*w>p%kYMk8HPvYL|79Qu< z;24)6H{?gJfB!y;Lc%7fG$@#d)0%&$3E?WGCdk6~MXfO=ja`*$w?662pa+6Hdr2QR zf7kXAJ*BEtq%VdwS4B)@OQq_c^}+=$R0gReC!aIxo)XIu6;8SMU~XHwL}uKpwOFbg zN=1a|EK13b+0J+Aax7U*tR`V2$@~4q%nnI4pA>B$U5j&-fj^=*CluvLn|!xAR>F~# z+k@L5G*vU%qy8mOYIT<3tfgh0VzuU^2BU4uWte{47jP~weevb1enHSjcn#3wPk8- zntmrKo=Z6|xfFI7XE0b=PqWa%s^Dd33BEdN8xdn&YKBL&Sj*S1ENBONcrqFOyy7Uy z8x-+0p#HXeBW6aX&fA0d=afkup~9s~g+mWYej?qh+&MNo^Q80kGlVF$xc91!Rfq`n zgQk}2cBFFY593NR`jE08TU!VjB{yU2)m@@Aa!;g&k>y-#d8^GF$qX^=AMF|50~jeK zCg{2n-;rhbLEi=zc^1>i^CHwSL{@wV>td0|Idk&~MV;-)M03mIHCk8B%) zPVEnRR;$twkH-_cJm9+%lM7v4H@9{$4+nfR3k)(d1a2RMBfV@{*w@#$LQHDiv)>As z?@bPvi3#4wAy{)s+k69N!l^sj#v1!!uV>fP)EER!pC%GkgSQ&fZ>O}vm4o-To7PYX z;?^?@Ali=m?ovVKO6>yeKJ$N)b&#=tJ}`^$-gEooX3@Af588-Wnu+|A*ZnCw%S9rv zDQCWcQgCNSpslRzSnw!F*a;jQD-6+Us)}F3DIhyb_?NC&nY(U#yDD*7lyAeuEnwS zDUw%T)LI^senlo2(;NeRFy`N1>hSm@4<=SQk+_CUYGMor-jr2L^oyjls|9>~A13=O z#eE5-KR*m<9W*L8?0Z|sZO4>nJuco^9aVGIkVK|gwAg>v+dh(vZpF#%5J$Jg?|_{D z7MTnqaK2OQO9n!!c?2bf_=M}a5r!;%s=>$2V$Sr_Hq69Zf^!J#zAv275_5M^Sp5_I znN}?J@KZHkF@bNFNtqATKu+Esk>=eu5rkHyXpk*S*PLk?*c+!d<}dhun9nq3JwqF3 z`P?VH)}Nw7Fb*n=EVMVD?Td4NlRYD3_mY+KovLSITym3H?wHF<{7)t8JvI)NoMUMVv42{_>ub6|-_fg0`63aZHHm z&5e9+mO0q0!a;qX)A({P^nj4gPD*j}V42K=R_n7!~i;<}KE7K=8J0 z;H#LR*^4vvp&PQAye_LQFP;Twx}IAW#~XI1T(hM}VCu$&Iw ziCdgvP}maJbBYSLdX-tBBfL}1zB62wxfJgN_KodTz)B8vMshU{SU37Llb4GpyZ#|S zmECVulM4sTSdamIw~J|o)5v6U3vBn;sTN}TY7oH%vWqfpshsXDh%*^q*X{8}p6Flo zym34aQ}Ym9V_A3~I-I2^)}toK)s4jstT&MQ#LEqhjiN}ER_%c~X$6m-~>Ki+8HKfHBtbc`8Sr&G#rc#vr@L!3FeIg_j^fD`F8@r}#QO~2J ztg&aK5+;Cm?p&;NWywndj!T7ABJiT3MN)qOP@kGhSuU);!H*`_N)8Pdn>G%RNTi+7 z`Y>g`Z(qj8$6sI6Y#>Y^JUm=oeV!G;w}nAFNDyVo0JPo4MkSB7_BW5RzA_n)1%tL? z|B%+2^I6?8dZuq9i5kuW4NX)T4x$%tzZwzPVXz6pIE^~2$Iq8gC5QBYL`l=)idI!E zbD)fJ{nnG=g?WKwps!gWeZ{TnJhLX09?thR!Q8X>p^I6H*he!@nD`fKrL7x=VEn+K zI{5ZjmBRw<`yNs_b8lX;wSF8^5Nk4is#K)ND<8_Wd*0kO&Q4>u5!Mx>)$TF7B}oVN8@xBvg$#j7V!^2r{gzEg6>+ON?kGo^h5kve2MdYqYyaE&Tghpgi%&Y$H8rlXDMb&e{?#Te=R*T@d z#n#~5)DrYq?3dZmspkTta^I3~Ln%NPZvS@s;|SpbG);rfMDIOUNQ(=zPN^k$=(s=! z0Z9jeVM{K0A9t&2hlW@VK-_n6%d});nvv|&d9cj(5irq)=|ATvEh0LO*;Qsg@O_o!2MibAGVP-b`ff{q45eV$FHh>u^z}+d%!;rQZhD+%C387@}4K zolMtH1_H@F!k~d3zOZ5h&`gBkFTPdI`tDxq756JmpXm;TDwsQe z$Jpu62R<{A$I$Wey_~-AIQ^bS~SEl^#SN4Yck@7$+?km-SOgH1VM6j}h)OV-A@FARE8R7Z{K< z1fE==Qg%m2N114)dkLmCOF;isEM>h%x=dxONFYHW_3w0b-h?u_9X63rM^2VAgfg?j zlI>SkaHkV-`KSmlFUO?^^y#M*b*TA5m-3Pt1}qWogvmz#%~e|J6y2Zs?YpQIpfseV z$zdRaxG=EAMw`G{gThp((y%HBSE#TfwW+e-=(=nyz&kn&x#Y0l^!jSQH3e+K@^@=(3+ z#^y-3C2->B-PLyJ$)gvcsxvsZHA^c?f-ohbLkkId`=>o6t}#sj;BLUm$^6#lKvE?c z>W;858cLfLZqgT*ZAo(IZW$WlkvZ2oEHm#EAq|^!+Af+ATe$kGh}Ph8Y0^d2V^7&S z9UIY(u8{9B5~wNL>O#3Ud&+4?J$$YDf|>=N{X$~jW=Gfhc-Q(1HK>oM$JNU9KR<&d zhBk++R1Hm^btsp*w&)xGj@&+x7~|$K`g_#P2y#1K~{WS$d2+x-#& z`OGZ#4(;U9M>cWNq=Vw1J4wLaSEdDC!1f0w2?~y~;tyX2XOh2%gPJDS*J9v%72W)n zI^Ozp$fwS-`FG|EKsfAu_4#Av&;Dg@15@p_U!O}q7?IBV0NQrUX)f=R^?*jgu748Q7l&E8h4&s2L@sn=3Hl&*LxQ89XRj0qe%5i(x{eG{j}GmyjJ zD&|BBTv7h%pD=E+ETl6mY&8&vSD5E?rco*Mtt*}WQdePnYuy7Gs*RLbCl?nN`nSn0 zYyU}7uiStSuXO9)`lLT@(k*DG2a+K`6BS7Kr@HAArQ5fK{`B21-9QC|VUjdtMbCIt z2^TnrN(iKHmBYAf-oTr^W^Qf;&?sA=wU4JWcX}Nf2+~1QEb#3PfO0A+iw)+O&0S(+ z>_jYY4P&;H@QBDghYWheQp0n{3U^!I`KJ@eqi;COvrTOR?A^26aV^bsMkI{a>|hr% z0!w#QVC0QGd>K7KE5sZCWl?TGh1dDqj=!VnD! zXt$Gub)kg6eIt4(Qj>FAiZkPx4z%J)*fOwnE!tymP8z=p}fsSP>S}ZXpg40 z)87|v9g@H|O_NI>7-PLV=(-W<&q5-V!JBu3=yE{q08q;(lzbNdo}ZuJ%Y5MvB`*~; zmNBvMr@>(hS8@9X2avsKt^?Vzo%i3bH8<>AWqlb^7X9H=C^KEx}Ym;$5LM;zKTQ@o$MzbiNN6DnDKu^_)= zJka*bq6zJAn7Hb!YZ%>Gm_2Xa@#OW~@MwpX5Cr=hlmq?(B%@fwMB~|Q%XOC}I!#sL ziVGf`k*H|_-x9`T{DY6(-V|jph`w87SlL(2eGhm%Z<0FD=;5AHcQLozbh&IbfsC&g zO;5NfIK`*oLq?${@cfBg?6_fNy|@S;7X9iYj{*B?B;wX~QGGe6+fj{%A?%n20;ehl z@8?plz9_k;O_B5>L-?dxe6ad)Q9t`MS&GC6mWp(QIH89zXPfZC~o*N2u3^8%exOe9t0syO^(9u1D}^SI@pg z3!pdh5(am9N6m{&-RF^CyZm5&;_sjT*Cf}M-UQk7BQ73cHUKXTo>>w5q{(BkGKsl@-nB z$3Z3wm`ZaOoEv&7{`I`z+V4Fu!kQ|Z>DSu{i={Ft?4X^(L}mP`%6TliJ)Uz#wkx96 zpyiL$^?z1Pvwx!vuYPakFQqZP-6@M+J=&Cj zv;@l0*}CtC1iBvEEX4gqp`re;et9W)!)%H6Rb!a}`<+Nzk^R(dpz~W(6$y{j2O%e9 zf!Qbt6D6s-PJ?6&+2c3j_hFHbq~s4!63X`IwtsC$>QJ_XjnEQXi#@^4UjD)_y$BGH z94gtWW8R%*wGCo9!^ef0F3^juN%>8hT{l`s!XO>igYI2+q%GspjF59v1$s?khaV6A zkaxkSpfM5xjAnx&*+tW%XF?2`no0Cx|FC!vm<59;)Bo;w{$acyryalQmwrCM;Qvc{ z=-Zop3i+{D`037no~rz&cK;6ZZ_@s)w108)FWLM{o&W!O!vPVf0!~Q<(!8or>Fu-P z$IqJ;&XsxYL945!<%=<*dM&Xhe+XFCH|7Y8&F(})kp;Rr#?o2tZdPJb(;9vd-O^MX zg-3AzI2VYwKA+-%mW*FRxQ-aycN+c5ee#4ow<&<|8V?CJ{gMi29JSa{oUa zIxJHM)woyhq04M2qvgT6C$5^6WUzB5GI2U1dw5&OHYOE;sEy&8EdlePqwX`#UhR48O@& zoR`ePaCej;sm4Lg*7b~dqyVwH7q-sMz;V$!2DQH{a8mjU@IssLsXZ9g(0s=_#~(}zvmPDwUT8K z2@%Ertg?hqc}D1SRBn;RMAZwIqI5xOrTmQ=ar4O%u&t+sM2+=;Ux`=VDH0VaXgs~x z82^L}+t90gwt_H2J8F|Jld9UWV2dvpjl`FPZp4N(Z?Oaoqe2*z=w9wv!aE@yyv{^j zZ3IKpisowsOR9#X<~Y+!F26#zOxLq{Upw=29Q~*-{BB0Zd|sH6?L@&?o}AE|T-PH! zkm?cA(Z({kV*j{W_6Xv$OFr&c>Aul(H_ct!|5))E6m1&UuBA zI`l~>+&+Q~LEK9+`~peY{rV~xu6kP3#JgqCi#HK?3zi_EN+NdGeL__r!6G~#W$8y9sI ze@m+)Y<}$GG3C)%Et7cdWz!{!4;SB=2v_iPG$tzxn2OR}d_4OV46FZ{G%Zw}-JEnM zQnjz^T~ei@Vjg3HC09=cI>Jciqe$$rK2_7Cie}e7L;4E4jf|BKZ3fR66OA~pJ0k?D zU|LEeZ{c;~%GDeoXdTSP_-Idj@tra9)5a*TY{JF)F9v>MRfLE7) zW3<5@uWtHeyjN}wNiJ9Qzm(9glM`ERohTsLA$mRc6H*E3tEDeCCZ{5^^-6l|E)aE6rm-Nytpxut} zNK4UR442>+-cl*jvU@MAb`>mV(zt;ZD(2q=e2cB^$QT5RHRu``WU9$#F8XY2BM*vH z%gHQX`UDT3))k$YqOH+Dozs{5rIG`D2HQ2BD~M4D+^ovHGrFP6Yot9wTqVMzNbpn2 z;eYPEOb7)ITIu)ZrNR~t<7Zu8(WPxC6Ws*0 zyjAl8&OcQP8|B*P0oK}_=)tP|=IQwFvANsq)#C}T z{vz9_k9(b&YfxfFoh?sjV$k zRD50qXL9@7cyo#*{%-PU2y!A+WOBoo|C{l$S?#uc_|pmWv~=w3^M?_rx?J>7HY^G( zRcJRt7B0AW>pUj!^2<6Z>TP6{I4MfVuxWdfsGe-WSqM!?{|J35V{tjy{4n&6eSvFR zp8UOa#+`}LE6ER)C?UO7Bev!1#!edn(KYM!gA&PqlC^p=8r_kdmybp8$2O`eGYZFC z4qGH^CW$CJwiXB$SCR&l0UL>oyW)5|2wXIH#cxGhR_h%1I|+bji7K&#q%QCDI!+10 zdQp6>hu!SE3U);$^+cX;hG`O@ z`J_3Cc@$^N1rxnfMGd_Xi%+}VCpZVNCeG$|SuA&&Ueg(nmEH}idSFpYwWU>z=Lz2G zGQUq@>CX&axPLfHLf85Dn_f+}4EaKPn?l($qrulzW*N#|bBP$F{T~dcLw>&G^v^3h z|Cc|#i)oBz7j3_rZ#`q9n-hK?4Kp9G#{(aKTW@=YTi0)CoRg7~RZ=`Ba!b&j+0u`)3+ z9oM~~Wy-{Kh?|M&z}Y_zGOpx1__;DMiG0=7(lEcDLC7>Jw6i33dsmzbkAItV`_pY> zepmgIn&$)GoF7&RHf=ZZ;cR<4&mAR^QI5+1?E$`TP|GhmP8Zlx^Tb2BHHLul;fE z@d?fS50@p#CKj?Y6PX9t#=__q&Gs*^mnMiA(I_}zD}=a=Xdy}$4HTIbSfq09{cFsu z;y3pZ2iUGBZM8jOX&jIZTZ^8?RXBAUW+)GO+BOCfdQ;_hw+Q%JAsA(?%6R~=_1S4? zK6x zHiVws>-5ZxN@F}8ztQCl+nt=ob#-0eCQaQN2!IzD!Lx*K?S~_~Y*X0R*SE5f(nSVLC@Aj@rc`j1Np{4k^ps&>u-L6{`qf5gDpw4D z4af`>@M0-}YrBd%PJe4v;c{ZBnA5Ex&rBxu4opA8q!inRaXBM%y->)!xw6>a2Nxfv zBO1c}IrF;}cyW#ZpeXd(O)|$vEGy|v#^WoiB`+gdZ)@H}_}6n^obY5GE6a<(SD4mf zIr@~ytIuj}j>x_s6HMtYA^ua=-=FL81tIqbRymoxhDm8+js#qnQ%VkurnYMae|Q%m z_ax1031zr20%{#JDL3wWUB~Ohl4my|*;yS^bH4;kznN=3I~2J5d`kHN`0vSP&J>3)Ube9T{ps*txrAds8!tQe)^`BWJ_2sVLjlP8(M1K0fjL< z-Ve8B1H(?%e3=S)y-bAP(*(Nuc}H7!Uq=vHm1BX9Y+dt~WoCX@&G8_ScOwFpaqC&S zSevK*nYBSwJ%VXyVRRwbdaf_Q>s8KIQK#qZ+;7!&^OE`>Xw%D2V{YYP(~`5$GER4v z3N@lPPm5lwl%tkCvLm1C>QDaoD0lV|cjfB{^Z?B1@ui8yv9h%nNJF62pVLQ)^t|ET zEjPE92r~%%WSeGSXBwmj#Y!GYcOih2_!m`rt)uySyG`9Mj`NvIWQuH*mpZ*AaUNp!N z?vU*ki4PKc6yauM>e_Yzm09tPyMz+`m~XWmEu`G#20tTZKH@{YJ?boG*IEeC&0{Wz zp-C!|_<1M~BHjv=Vl$8Jhc2C+hrO1CY|dMtoqGVO2N!Wa!v`t&P*<$VjS0FJJ&#U> zTVCJH=Y_fpc*eDC=UdSj(H$6D?LWLfs)G+ycdiLuZN85%jsuVvFT|<&tu}A7PY8wW zIEK843!S@=D>`p$>Z<<`WN=ymBW#(gNl)gOYy1C|+jS1c8V^9~S&ezG)^Bp#99(CI3 z@gWv=3Uw6*8wkNvJ^mJ|caflpb6>Y`4?Xz~tKL(3sz+cv-uaM~UV?44OU4upU5DXz z_DkO8z6gOX@jRuf@oH6B6}rGWHNl;ca;&9zSF?clUPX-baA!16=XU2jo$lKkiRv4X3CbvL$kDP4T$XpF2xPx|4mMxXDy#)#86YKgte#qnf zt3KC`=1tYyGpn&FyaO4@Hn`ZMDZhGH55+*dKp(_IYm8d%x*HqIEt(ojL;Ku?P7>Ub57LfW8qtTy0F z-N#A^nC4w);O_V{dAOmeD^Ej4e8Kt`NR>@t=W04tIS~J4L#a=kh=N>U=WgTFkt^!C zf0#Y~Oia=wz{27}r3YJH3SdGeq7s3ZkSLP*Qwa63xs>hv>MQ(MYOVC}NU>$(0Fg)} zjnzk}1b+KGF){J-f=&Zr65;Lb;o<+J2(}{zBq4#+B_rTY8wZU%*4p1Z#{R;5BHj$R z9sh^yjd}moZIdU4_R^@4JmBzTmGK~Y@z#q`VG@&l=#=Z2^LpY!2~B#~0I(r#SzOVo ze#07YNu_@K;RtR)I290JRmhle+d7}@N#%PBy-iTBY(dCkwi4$4*M}^Ei?ySiioq!hO0D%1Qw8zn6DLc>i+uATJiF(t9TS|icN?KyaX0)%nHv+e zW%z^I71k0)Jm%@#Zlbn5Xw)M9F7Q<1R!OLXEvnQV9&8vM#1^oz&^HExL7kkww(PFp zTLgh&p_ni#nMmqlsOSQJB)h=G)RY=z(}n)svnODCItZ>B`i(JdOZH~+}O-h;W7Ddskb0hfIDwcJNPI(Y#~D0-6*>mY0+My~5u$PU>| z%Re~e?x}{n@yz@Wv(JunxofbUrn({9CLdJ=Z?=vZyo!%B*l*g|7%|~II-E*=X+Ghh ziIq>l9_cf;6mAxZ-@2agGRN8@0m0(Dp@r3IKsm3Aq&|Y8qlV6q?AJ z1q)Nx1MdZ_#2-NZJHhnKz-Sxr#tsr%iGdwa&kL zRg7Ry$|-Xmo$N+BUuJOGUaX8D`sl#*K*9uZxwx#KMx;xI&VGpU`a13mCjdAE)jmT3 z#9^~(9F4j=Ha5mWFQp_|+AjfuRx#A|9@#Rr?IPhM#q>{^TKq|6@+1!NM=soKrwL_N zg(W*LY+I?cNxP^E9%e;fGp*uGz{1vya>~cL0hZz^cjXf3*2*2D*#zg zOOx|J)&_21n}a@yrH$4XGBU6YBBN6*GD!aMdg-xqz&A>!gWN@z>w7RjB_Z*vu)Kn@ zs>qAV)&BSP0y2$_Xn+viw(DD30CW|Earbip8yg!{zquO-D8muP#>O((hsXgV)Qkl( zV)*iCAO7~P7&E<#o{C7Fe5y&>WNE>hHw_M<;>DU?c7ENgMxB*`>XW+f8P%*Wz`gwb z;UOLw+eO9xjKAc);WmYl3~DM(^K;D}M$cb%qrlecuT(EPj8u#Ywe z>H{{nM!RhQlRuxXNn#|AQH1JlW^Y=vZ)8gmX2kXA;i0dOfvE|N8NxzdM(o_IukH6G zRhp^p5F4|xtX1I_V{$o`q=y~K&>(O4eCx=i1=lE9=(Ouj(btPO)n7%l29wW_Evg=W z%+cx6h<5P+eUFnu%{W#U%D(4YH{u17*mFvfb z%%q05hHcf2EuVC#lzOxnn*NU5KJhry=4Pqq@y=Jmsyjyxg%OoYaz%`gIlPlR1J3?G zYxxHtN!%#fQvrnC(%n$D5$x8+6+01jd|fz6WwUP&L_f^WxEB0MGH9#kv&;=7XWPh- zf0BWX4sav$j1&BGv&{d)mRk85q9t~;onF$A(Y`zKTJ%r2?j8GXOkzxvhs^RI0{%^0!6m) z{wFfU^u>g(^;foCff{^c-><_wL$fnq*1WGqTMQw5x&*|lI`rs}( z3KXPy)T#gVE7eS2*nb72c4UnCjTQi5J$^14t3#bIS>k?iFr1_iuYf^N=3Jz zjh>$&1M=x}96_D=!XPeifT3W#!kIs;-FGSzz-ochcFaREhf%jo;it2FY3}~k$~h`$t>iE zSru#YZER8gsh==zvMFRREOa#li&tFWcB9j%jHN4s{?b>Wl(p`GEcHfeysNvrJLB7Q zmtD{_u~&Y;pI^3>vOXPzo%ReR^?(AW%+zn7f7^ldBRt!wX zl(8Z6sH70aQaOUh{uQj*_v`iTU^;ahxc1=`oYd>wK#&ccVT0{-2&tqKvpJwHIlLwI zrmh?1tr4s?Qr=N-<tav(@lf*kW%Py8Uzld5i^zb&jQdFxV^G3)|AnU_`=14GDwG z3Mt)HgOWEX_%cR?w1y=8Om)bSjhY)IxR>H5Fx>iL2MDw;5foZy15b`rgEjAlGUR~PAw(;mRQ6x|w6L&1fjfEN2=J(X=ZMkuvXvyj`oC3*o zpzW7M6D4t(d+4oen^@rH&RKUnd^tZd)?q6O!u$s1;6H^@QEV3_5;+~q^_QhOE!7f= z3+|qls%bI1DK?e$4?cE#(^SlWjMXC3%ARWOdBCH2)3kv`Z?Ckv3vbFTm&;a@$oP7R z%%tlgGXmQFWE5%=FPPlLi5*cfNQm-hGps)JKxj{m#68ce~e*5%+Gt8Y{U~~v#ZhavZRkDd@KSvjfpd4sNaUklji_g zLX{UMl#E`U-%8}3>X>cp(P>~7n>g^EV^8W5M`>3_8j1WY0#Bmebg`=1tVapvRL?y} z3!^vlk_LDA$E=Giy%vyPx&onrlJB1Wk3p_4y$ZGOM_f3>YGk%FczWgHM;*S~OCD$P zbT^mq#m-B-(#^h`w@R;WHf4$mEpcbKurLAlRK|EBJkq*#V=J)QWXXFf3pOIu(3Kr4 z5XeO)3tP(a7MvY^EcxY}$lC9BOo{2JZDne-6BbJ^rEvmDg~=-Tla&h?PB5N(MXoEV z)~Mx=^z~p>YXDkWd61nc>^)<-pIw~*>|k=>|LsZU6P(}ZBdgzA1xx8HuSsRGtB0GC zkTw8$23z<2kU)FNH|W*nMBFwl%?dv|Q(({(aqz+5 z4|x}P3>+sS%+MTAB&S4X?ALIkre-3e*xxVi2X>puhvmQfoqrhb$8N{3`ep1-Fa`aR z9>(%!k3xQ|6@I$&pSvo*solTb{F}6YEA3z0{7W|fQs@7@-f)40s{k`HA#~p=RA&2} z{%f9wk++MP>tMoTBIAv{Kn?zoP9;XQF2%xfvccb$c;W^O(f6qk%2zE8VHUAgn0 z8#-*#2Q_(D|3;VDQ^(4~^pC4rm1J@9CbMw6A$#~+1*OMorh(&#yky=n?@Wd^55e@J zyNoIQyQ|uxVF&wH>dXqh#`&>554=G$j|Bi%JhXb^{oSuSeVogPm-)a6#|JsHvW>jT zS6YzHp5pB&L()t`o9*hE@krr~>R#wNCll8NyEw@1>&v_#Zyb4A_w}*@>91ivR9Wv_ z+0`CtgQJ{YI;uA`HtlkSIlg3+;LYnxrPo+uX9BAqacN;YiFi))W>H`yIkOYM;{2YEu$Rg< zMMOl5;FHP{Lgi`Ep_n&C+LKk!+>0_rXq5`rY9y_vOUxX7ZcEkJ4Fs0>=A9(ckRqnD zi;am7$?pVURBAtCt z$EY@%K{ARKYD7w^hGpitGfS?#K)1}+bNF37{j(p#n9qWqCZ+t`h2e7>Hvd1^?E3svnki64l?B7x-DpJhv zg)eA-O|K(tedyw| z^Rk^t^}epRDV0h}dCW;RJUtcYD3ePc#N&_jsavL0G<)aHv2Hr)Kbq^LuNc6JY%1_Fa+&fgB7#$vf zRhNHbw#OW;Zu)3SDYpZqma7L{PU_dojrU2;iJTN`yx*AE1WwaCA>k)ys9fk9K~V2F zbdSSYtLl|S>ihNK&;FkbEjCrO6(p>ueHyuS|I!~yS#Tf6$f;c*I^`li?}~K`_*R0W zPl=u(IQ5z_PML@3Z$G3Y*6egfN(qW(tj``*9<;(oeX35&p2$m4v?i9*9a5?VwqmkO z2kjsbGFLoFt01@A=x)4%f2+1$haA+^W!GL}rjoFDn5TCrzCJ6?lq-Y}k};n7tTr|-E1|~P@>keBmmF*lI8o+3BO5n+3Bh{Okb!Vx$oIv>q%V30x2&z=kEuqoET5`i z0c{2Pxgnda@lQUXu3W3>v3F?p?eT$EeprGf9bCAJ5z>AJ{HUc{BP8aLB4-dddO`T> z?(L2?MWh0SF}jWV*OYyqvCuMu4zpo!snm$pI3sr zG%_%&^*BSk>4pjTc308sjPto4gf4qNzCOs>Z`2?9m~ZGtobQ!vMJ0M1t=6#3))p~-g>as zZwMgj9_1#d(CgS^3}~N(%${Ez}C3CglJ@_lcrgx?|R0Unxw(QYq`vO z^Y#5T0xn9fM#`9YQ8kMAhhw!1rSkA*3CeIhT;Kh}9NRjg?4BIXhs>Pn{I0`cJ`cUP z!RJ1IFV|X*ck^YkdeC%ywCgcWb>W~8e^x_5SJpvdoQ#S8r!XUZ3osrY09ce}+p-+( zZlRe{rU+9BcV1kTGq(nqT7@iFLo?xn@z=5))w1-~XyL>zJF?R>J*H zAl4j2N@g%h;#I)OCque{Pwktddpon5TKqflK*+hu<26=O2epIdRHLt-7E|?+%##76_9G8#S|<;4UP_G`0)#s9wKbVWf<$w|WHd;yBlQfj|t@I8O9CzCPQ zAMAJUtg%PHJ*l(0fsS5hZ#uf4HS_Uv^?r8EmA@P1QOn$^Bd>4{$KuUy=%Rn=F44K_ug~PK6^j=dG^`4NtWh@ zM|e*1004j^#zt4b0Kk4B0ASzgpMT=qdEpZ11pr7NGQM)zI{YaWX;CC@v(-LvTmOL6 zjSDr;Yo1@~dvG@X%94peQAiLr9yKW)d*slYH_6rkpZf%4*(u5K(*VlGhuwwg?!FqzDxV=}p^K0~EQjUe}3HjBV;P16ZwER7gS z#01xe|FSpuRFNOL2dOm_4cpzGfa*fW>ubW6$?j8XEn9>JGQCvTIUGIG95~adv+;?x zLnB%UE9?z>wBK0B+tt<8d6No-H*9_S^vPEj6~h>rrLE8RXU6}rx0z`JKi-;}nt^Ec zT270vE@#Wi3Ol`NuV~(YR zapTskFLxA+G{{V#=2D%Qp}R+MVoi{#yDr*fX8)U#s_;d=*aW=(PrQ1ipSW)DKF9`WwVZKyR9Vf|}O50EL^_*U;tx_B2Oa7&kTd-`p*u$|7 zL;2uIINZ<=x;d{IS+@*25;PEc{|Ld@-qI23 z?Abzr7$qhf;LeCsDWQ z1)2$cH-`Pu_N`Cnrwpdf-$s8`$LlmF*n2L0mU7X#slGcEliCQ2n_1H|kn$1=QjCBW zYEmp-CRDckZhvWU!bWJHbFe}D}WItXJnYD3^ zNxp^&v7caOcVZc6`B;Qox|&7(EgpubU(nrhOS-X1N$^2=W?TvT#*N6qYEo9Hhy&u` zLY5KameRQk{p`^Ztio@(^gsLr>TToy0#OUPWQ22*Cg%a{9U*ktxWL2x0 za_y(7S`JROyoTmuF`k@c)c5d#V|L#-hhm3&E)YesFnRi924pvD9AV@ z^fK7C<<()Km%7F{uC((uZH=boYodpwoD;ATcMspt)vztfzs0hj^~fGnkaGrm<7MMO z@2{c)@cgz#eYaSpO5fJIl$iT0Q9Coz*o<`an)>&`lSDF&E&=VuD}%G5NI%4$2FJe_Gu z;3-vzxj#(IH1`qW6)Y~ZEy6I)q@{%D_!XJQj^G;->cdxW)9N@>XX6}!9kGQ#KmlK_ zRIPR^6ID=&d}7|ZsOYthS=!tC`$a`Xw>OrTt5=ZA(G(xZ_NYzsT6Vf5${g%X%R#tx zg!C-4AM|Af4wxSq@JHu=7EDwsI>#%BJQWoK>R%jGOLIYEFehkkcJD;&K0M?`Tv-Tl zc{!~8XO+H)(97Orh34UCa(#%;GP#M+2HM>s&eE1fstA<%{=z(BSB}E+NEKygi$-l- zu3s$W*h?ihZF_*WM?R!ma8SbwES$rAvV(^5)@+7UjXxaM+>Cx9at>l#+tzc=b~OFk zf|CDzAGR{o!VdY`bn`b31k70^ zsb0vV&UtcaL9mz;uydggx~ZKEKX7bFmDx@^(Lgfi=y^B}y7T ztmX$rF_w0OiKy@|Nl+LqZ>mi<8$;qN&&Rxbvf#9ocurN6dck&rsssBizo2Irdo9qp zr=y_af<2+OQ#6--7DkMz; zq^r;ZV=<$rNH{B6YHK1t)Xz^$E3`Of^WjYW_SXg?QcDf|@tCQJA3G_JlE{PrEi{<@ zX~F3?CxsOPe8Nv8{B)kfv78LdySiXiygqnYVHrw!e=NrGSv0ofbSYV{Mn9L6Gm?!7 zmECaxVzP_&C|hjc!Wd5QPxeg&{Z=?FtM6d76lKiYptV?N8Bx^FXJsjwXj)ee! z4R;71m|78L(N=xA((okr7W&n2RQEa+>)vz>_w=9xr{3MhuMi!V&@kOU3lh!tWY1Ey@ z{#IeB&1H}%p?b9~w=X{GaWr&w>0ZK13$V8`(SH6H!%9nphZvTHsllu#C*&e}YSg3H zsWN#LjV(GFWcjS-hZxcw446Nph*roKY>M&Fh`k!uzPDmKPUr6huKJ_N;Zv!ZG8W`F0j_?2B~GxJPQk9va5fE< z*9za6k|--HQ;_*B@f(yJik|G;l%4nL5Vru`V+@fPXQ1pjyEzG^h#ixs{jqzfTNd(W z!>6gEHH+Cc&QF@?yF4iMfc%m0*(V;kMEyiQRg{J9)*V{JdVJILb)YC%IZOa z_xhJ)g-fVf|MAg=u;nGtE@5S)$|H~1UudC*%29xjt2~HXG|E`wE~jktaU?Bs#6Tft z-c-_17l|QBOK$Pcr&^a^kxThnIb@N_t@IHxKTlga!^;O8KP7+sx4Pr5=u+pV(P)2P z-|m(kAc<4sj*gD@78vGn91Ml}`#U#;mc(qnDr>Hf+W5*X5xvK0^r8R@S=pM7E6^tl z2QTkB@eF~5SgO9W5SW%RYO`zIePO5od0=n)tXpV4aqaNW?-Janx;e%9T3tfq96He% z&Z2XRhd&=_4xR_oBBnp2Gd|NKrl}k%uWeyb-`ux2&zb%_h^wnyKF;=(d=@u&f)Vi{ z_D+d3H!qjvMUEH}^3)(v)EWYTz+suPt;n6t)rc+n;t)l&&>WcyJ*68R?&GsKT;a-U zg|B6zv{(N;CV5q-gyWO`y8d;EFTh$bYaafn_U6uM=m9Woj#`pd8y@;rZ(mmOccQtJ z%C?I7_`(RJpPpNpwGnlF!Q;>U5$9`stn)Ct5SH-?Fy< z5m_&UAxEdL*)biCxIRTNuw}0vptK)qkULsEzLzymF8gC6Bb>ENp5hsCQlLkt-ji4WJY;JfQ$b+Pxe8Z#6vXo0hjHu%x~NNPsz0Bt5C1>g)~M1X6X{GW&*lb&Bd>Z?m_5V#W;G08P@4i2lkYQd>lNdDj0k)v#iy4 z1<@YRwg{B_$7`Yfmk`_eGlB`hi}oM;r|pW6=(>9J!w0R}4=*{}RNVSIXwu3bN~{%# zK9D5kVOaT}6s@G*yN?Y`pNffQ*_WpI2>gg>W>RxP<-~33j7V*LO06Z;4;0q_Yry07 zU)mNws=5A{@K|HNt$$|MaL>;jeX*|^<{w|nGXzZ`zopstO{ip1LcE45yF4nTc*OIM z%N;4@J2o5e63?iW`4Kygz}^3czEN2B*B+uFx8b69;MehEFVaOcT3q?O*Az#808qNX zwuoJFy;2^GOv!tKZGgp(jF%{7PKWJWjsWcC%U__F^aIN+Lq!*dpdl^gw%vS;D@h6Ls$H%NVA^DVco3vTyoSj)B*ib+ZY z?R-XNq;V)XO_ww*Tp$L{V1576wsfd&HQd>De3$n~i>^-;_TQ1w8Hi0IN$^`L- zY%{1FLgW;|gbm&8rSC;D1p=qPf~cY-SaXIbj^QBoY8rtN$FIBjy0)pL!fL1tf^r8O zGcxg0`XeC&*4Yml1bY;PGqYpZOKqTkfQYluEKPJ`vkk&&Ke$izVND5?bVt$s;d=wEixI~_5`nMpJES5CfO|EU%1nI_};I95t` zLg$U!yB)dJD`RSijlYtQ3_NaXMEW zw)QnyH@FU-nLA@Vem{L?W~kLx8b#LlL7M-c;H#M^#!1p8WorPFeE*@cN25s4a&wK_ zmxs~`P2iZAGHXbh8Ls%a+`h8o_|F%Vp~NVVDuUreXjMr!%9%9M0Br8#h*3Pr{gWQ1 zGi+U&WHJ5>Uen$Wx^yDN8jdwGL0C`pnQy;p?a1jF^NLNsh))j$ti*lOI?T;_iUCx^ zX5LPE5JT~#X z6t2lSNhR9LeVy4BadR#EWJGm*{8v63@@Np6k`2!KVKw5~4a(5Sy9z8kl$ z521&-{V5qzVtt7LmSV2ZN2*ANUyz5lA1fc#h889n)*mqJ-1nAqZfBmuT$*wpEN!e3 zlebUwQl z1G7YyY6u+wyEP?XDu%9*8|h&pV}}qHx`!OrBDCzZ`=r#td;r*6PQ&3$P3A-^z=eBN z;FK&k0Q8-}Pc6ae4ZB0FbP#|55ruFyVmlnPl{qo%_)DcU8AVPfc3PB}7u$znE4K5X z@N~I*YCAj27m?vR@hW@Z{@$`MYh8QoB|Ut43Mfa^qi=K7ZW?Dg?56%8{s;bOceDqS zR2V%|2s23{h8;S3XH~@*v_iNbA@_3MKaeQtjdm{?yU}9qE!+ zUtqnu>*ciT1Gg#9UA1L3WxZ-RZM12842lN0eDDAG@v#g;S=6lc=L&Xbv6U5&m89BQ zUEA}36Q}-P)#d_({g9sjs(m8JcC4*p%{ zU#I9CSl1y$)|t9tqkOAjnjV|Esf?E^4?ND<(!6C!(PqSjPLLe zV1AQ%`wtFh?sxe_IjG$*t!D%nmmHKQWfZD4iUVi59Nda0y!Yw{*_ubSdMZSW!}+Ny z-#*F8>Q_PhKVNd2w^=@Ukejz=dj3e6VV9=rv)$r}8wbC&5%kDB^Uk9wLY?7)na?8W zg|}E4qh&4?ktSW`+U1s}&&Vs0)x|yy@Jgtul=2|-3CEUxxK;84%gxShl<}bWK94X* z+!U2R@DSh4-*sOeT$TtE%6BuaS1CAiC(!%>mmm~HZ^(V8cjLu;YJ?f*9~1VFXACZ; z$+7OhBL2!$bxO?IaljqP62qoOs}p_@1rJuKKvB3EjBnty$drkT#JUCYOx1j{;zX8?eEf(Hak{VpRkJI_!H5Z6oF6@6Qf?m#;BEhZP7 z7OCCoQgB8#J6lg`QcjT2fNjPi=XMO^mWGI)poR(b7gPtOs!0~hYbx1y28TafWUMJ> zXk3{8?6_-lmi9x`1Z<~B(V!|XSZ=-LVu2&iHC*QS^6UD?*s{y>w-%i+{=}BisU*I_ zV`#TV>;+j_aEz(eSQ4d9>RAdSGq65oQ`pNx>(VZQylrMT8#=PUZIy~ab9H5A_;et# zEH|GACN?S!#)W#6YFkcAi)zU-(OIAuSYfIQmcg3dL%ov53-wO74;4tyw~~lFQD$DZ ztz_&pUynCqVa||<)xtI}C?T+zjMPOT!i8+Ewp3|hYn2DyyiSNfbYh2Ne4b$6yNMJC zcvKU5uH$p7K27r#P3{zA94Gj1zgo2(MwF%SB24eoT}59)aJ)^;N(R)jF|-t^Od+)? z$f%)NJc(o-+=z!=KSU zfkdBd)@!Qgg`qal(I(|w)&bW7pQA@W%Tfv6|qg?dq7wGvzHZMM? zUz~bGZ_VDMI*DGemW>h5uR880Qy`0-VTZzP+LAEqTGl&YEnMM<Q7t&7vd-jO0RQDMC6<}r#nqiggyD9qqlbFIinebODNy`#sF?&LU7668x;N~ z#u3bmI3rxrxHZ45^!k{*gkldVT&cb%8Nva>j7pbiPG7T92qOFe7z8klaZ}5 zWNamOA;ILWi6O!pM?IYJwb$CRC?;EV;Ab>mu(9R&UIgG#Dk56hFO6HX+T2FSm%@cv z!!C+AnzprOEcIH(;=pmM)Q@teZ-51Xn8HiBbXbg+O-qgEiO6`)Neg}48|2#*W2(p~ z9g{*R#wH%1Xvmu5#AG)~m|;%(Ua%Ek3Y*@;$N3{vUvAzwk2q46b$+n72Cvmr_ZYdk--t_6CDgC@sCCri zUh~XRPMfuM#LL5wp-!FY+@YBHhVI~8NgM80l8?%nbIe&fG{{@)y0IVE3@)w4p<>4> z9PIDfw5VcZygu}HM)LNqo@{ts{rtdl3#ZU{)2&0U5~a(++(n%q&ya|uIcV1is$ClkH*2^R0macr@hu^y96=da9|bZWoDRe0;sKR16R>CJ^-Ve4-k50%MNin5 zvl;>GMQi3GDOgpP6_M33ipI$x_@+p@3_;&x7E79&I_W)YBTgVfM?HyBUp?~4Cb4WnG+01)MRi89% zFWu|L_S5ISLN^?4juLrY@U-y4HQzzjNu)>@<4cz;luZ}#ay048xNYuTm>Js`a72q1 zL4$Ui-p$b^H$G0Kp8s_{Q{DP$GBFwy?)G!r)*(io%Cy033o3c?Xx4|sm(a8pv2rOk ziAthj`dzDWu(u-=WAJpOc99D(P+-jA=dVYuW`yyK8usFLJNj9l-o$L(`-DXWY4=O%YRNm_L5)%CSTWeW|iOrcwF^=yzGjZLZa$``=ck_XNpw9R)}q z_{TRr|M_U@$7ewQyI<2cclkjFdR0ejj+Ar04HFMGuno3?x(A2d3UmXQT{bf~t$0yM zUG4Pw+lsC#s!D3EvYuxPJ2`L4e|s|`DA>&pVCfd@78rEe(l;bX{97-mba>fCS4a~2U>bb=J4`gB#=>Px# diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0005.png deleted file mode 100644 index 5c38baa05192e84f95bdf0b04073bea226486cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9865 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 Y?!tu&;M1& diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0007.png deleted file mode 100644 index 4cffd000c59396338f93c8220f3d05fb53a740b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9913 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0008.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0008.png deleted file mode 100644 index fe8716efa6d46374396c2b37b1af20c981d820e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10850 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 CqaDxy diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0009.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-fixed/sprinter/0009.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQqgTU#0* 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 C%*59K diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0001.png deleted file mode 100644 index 2a0af2f8d54513815f0250fe4fec75aaf54bcc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9508 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%0ALC&O`zLeM0PTRubpLvvl|VhN_IbA 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0003.png deleted file mode 100644 index 399137c8d8ccf2673e80bc2d021556bffc830a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9854 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0005.png deleted file mode 100644 index 57973063ca974a1f0f82fbe4eb717d3edae68088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9894 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0006.png deleted file mode 100644 index c815ef3e4702e1e0b25aacd285e5285fdcb4b1cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9695 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/copy-hdd-run/sprinter/0007.png deleted file mode 100644 index bf947c3898b773ae8af1acaa2576bddee1ccbb52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10631 zcmeHtcT`i^*EZ@nD5#8zpdg^4LLdQ#UIG~rr76LnK&T=jQX^f01RFAfNDH9Sq=bMV zy|;h}7!Z&edZd@oApsIX-V4r*%(vFNzJI>8zV}`0_fOW%z4x56_da_+``P=Rm->2| zhdKB-*x1+(YinsB*x2^*u(9nqb6_uUC-t_g9UGhIthUCbn-62>;^0%}n!OFE+{CBh zA0kb@ndtM|=^j-V_r#s+EPIJvf+W-cn=cc;qtP<69Gl(P8aT9 zzxK!eus?Nl9}IsA{!^FNnN0SvSfDITe1*0`-L}+Z2(8gv(WP#{f0wi zZ|VomKHvHIHdeMkE}M+^Ns;#&aA}A=yK~>0l;5hxSV>@Qe)8ue)4PjPFvRw0wJ%%KSSqf^Vgb8cLW9ZYV50*yij*IBck_iM5Z1vk^5qNwB zYl{&b#JfH9mnZU&&U6F(JJNz5i_uIebRf~@`bpfFl^Ajb#e4xhjf;M_ysvqraK*R>t-n$u{0Q)ms&_xqdG3+_qreZK?i!LqpCM zej81e^4TJKvBpMQQ<^Y)E>+g%N;8F1vLZ(-ZAWtp_wUtD;EzU*QN24DBLmFlQbWu#9iIBrTDz~l1aCDQ+OZ?u&nj`}NuIy|KZXTVO)Sdq z=|vXy^iR@w44sPxpefO{1}T_Tm*9>k8|x%kaJkC~6#0(=X|&GRi%@_~@eA=wl@`hS7r1nK6Q==N5&P6+SK;cBxKWg;FYHfnbb@q~EbjatfcvHTq>bk*>20|Ztrr{jdn;(YQ9(E2ay{H@o!fX zGU1g^I8i7U$F3DaMKJFBx)0o1e5J$Zbw_`xu?0;CfsEQ(E(%hM?A z48i7Rj7MdW>!2(qzrcRZTZaQ_7t2 zG;my3df3pXJ6eYKR-7h7F@d?cxXBje(j_11Z|c(|LT*4#aod9BC@9DrBXx4{pwkwv zvypb+{!0g_lKJQD#F+@J30s2}j2Nj-e#zy>u|G$VlQ~CQ{_*5Nb2ZAk5ydKBbo+QF zN8h8GS+4R!kngjOFB<%dpjjU9&HWEp^Cmg^RBauIV%;(c8x?YsDXFl*O*_c* z!M()KOU5{jejdjIO?o6vV;nHtI+yqvZZ*yRI(LSbo%5FL03nLndwoq(%mQIw14{M_ zx{hhs54)YH6Tt9Nc;^2Bj<9FwcdVUl9mAwdZ2k5})qr%m|HxJx`#jm4ljnn)cKX~t zp_=@o%x|yM3SW0?Cip~vS%40Y8D3sbcZTn&7T64B*OwTAbo#ChdM#A04SDuE#nFA{ zOB;rWnrh2oH=emloGol*p%akZdxo ze{xk##T*1IeL;?RC5RT$Z^1|E9|7~cT0I(@wopkv54q_cgus}a3{E`^uhHli=Ml^B zn+n(pN)+d$h`r%i;F;N&Oh8$z&GxSJIb_TE3v0fHGFLmU52xef?Jc+jp*lUC9x z_l*#-C*EJv$qwUbc0D}yx_o^^@ukk@0lm&iXQhm4KP`Alk{rTjIkeK(87g&@e*6+F z*ZWUA?ht3!)OfU|vqiRfc@c_SmAcsKx0Ua$>b-n-1--exG(jCGb@N%9SM{Z@PE0Ed zx_8tC@uEt{qY{|2wlbPkvClgvoE;G{&Gh>lFN`~Ll_5S0<%9e6%fm;&0wBr8@T;We z_SSngAuc{&bpvIJF_~#szeI0ataZ?Xn{>xZx0H(3(n;IL2*7B;I*+tI-P-5u%v^kU z6@QY`WB8N*golHJ1Jlzf@%3pXR{)}G1Gp5%DWvQKCAZYyuf^c~mLn22I})~5p9yV# z&-P`J*8w#Of0&on&coF6RhE^PvOH8q8Z#T_T`IBJJvX%{36&@fR7 zO6jGeVcXtQT22z9i5qh@Ne9-|sC!>6mTtQE>6TOs)+$l((P9md5wk$CiY|A|2}Sx| zWZ$(IRF(H+oR|D~zHO^~cEAyVJ}7gH7(szS{l>yHt2UZZE&L3`F+{($ZolI|RC1(M zYt+4A5OVNhLts&{yRkA6xu%!`b|tv*njPo5@lvSfC4Io$cEt%lv|RgkYt9dgH{1*@ zJ`;sk5zMPLNQ*CX9dG1ERk%!iecO*BRC@cYPPKV3ak|mn{?-kzKXQhs(t2n#+Hp8E z*Bk9n>Rh!kVSv|b=3e~-2!Wa`NgR!JlB3Hzl7r2&ND6ki+zUB2UL9d;6P@T6kbHz> z+#MmW8k>VnL3P5uzlhA_7sW0H`7E#T5gU3axa$&qRhm#K3A(ZhaW4-?^To4;P0lCT za$c?jd&$lQ00e+veNb0Ioetp^g=$r52_;H429fQ`f4d;r^rGP5$(Y-TY>fcWC!}=V zJ6?wC3Qqkz5~y77@ZLYLs_^r7r_oG7=GwdcmzRGdUNjbc?7HNfNQ)_SPr;nW$;W(K z%N)aB67M>p-5QXR+;%%<2wX($uScr3iG*d1ARoQ#-aR|BJH9}_k;^`6EBJ;svq$yx zHJ$aeJTjeMQr_Cv*y1#p`;XEe0y|>y`c60(+wdcYm*DgW5pZXo`?aql6iH+T-~@ZH zL0+8x%NMo<@YfK>=jb;YWC+?AnNCPt@)Iq&3DtYr`wQoOeTf}Nl@D1oEq6}DF08dD zj)7J(eCGngl*YRy65b!Ms_qTIf! z`SEHJYC!-n?uZ8SFS7Y8g$1OkSya&x)qZ!T9%U-OfBv^++fpsp{CHd9L7CTa77KJ?Y;<_;FEm>?%H zvqoSsqpMbNZ-p)O5cc_Dn*pmDVkW}3E^_tuPuA~K{U$U$O_@E*c?2@Zx4n7X)`=2k zCEqHXot!?Bvml)S)jV=q@d3a>Qy($uR2kbAvx*y;#GZ0HmbU2P2qvIssn0;Fn+$74w&N=>M0Pic9 zcjl)zd5kwkDhxdw{rXm>n2hmRp-r_VQ|P+U5+6AMLT$<`=rfx;H#a8||L`1?DFWLd z3Wq?Ytvj2x=Z%ZIxOoiKt3ySxlA(no0TrjdG$$A1)rLmwcKa&ehCZFCT7*O`bL33z z4J=J{AQBR?Ynnu6DlOV;tJ#6+@g)}F-U{HEueYvF>E zu?r(sj!*sfit;Y-1hVcaS^^t%P@(RACBiOKXk9qS72RXnc?ygXl6YDSZIQ7=J+b;3 z=pD}TQ4R7@n%wQ(IOyD$K$%1ET>ZIDGpDrtVX2V(W|Fp+!?wYHFoXP4HsW0r1~vKf zsX3U*sQt49p#blK&mg3%^>#{N-ww4Q2zO&Nw$Cvfo;YhdTSC>588t|2&Py0{*E>Do z@?t}IwfU!py&7J8O$rQ9qpEt|>UVpExCon-Dch=`XWQz4Z~6kx5U}iPt}N@p)G5+v zGr;QLY6okddYjqjS$Vts6bzs&KPUBm4);ppdWfZ=nT@pf8Je+Z7Sz9;lz;QYn>Q z!L#Ql7R8Jih%$H_vKMl@s1G>`k+l4nmY22A7Aebss#CjOo6@uHy@(fGJ3wrImI2r> zsyR7fL*mHKB?TMTJf^>OQpJ0ZU4h>ai#+1R#W~@UPJA)G1CT#7*w5zm6MrY#yfN>g z)(0GB;m>Bd#2)s^%E(N5wP-^G>vw?thx7G{@`w%aU1&O2IGy_z`GQk;R&~JnUf5;} z48-+wu6xG^FXHGqj*iykb~-X`in}_m1(+;e`(v#6p`TmQD+>E2YBRm(MP3YFu`Esq zSKoDYK4Je##^;FBoyIU|JV4t2vG!H(_TT0aQFygv)L9fjrOt7 z3l54>(&iY|uQp5L=6}y5#9D7)46RkA=2XTVncrqAk>W;G^selx)plJtbVyCeS|(Y z-V_}}QkgFq9S#uM`f97zfh8>ZOKuKx`Q3Ny4p3W7^uH%XNa>ug^5ZzsZ5)40JMR4G zFsKvyHI}R-Qur4Kz_D?587CQ8`g%AeW?2$20G|osmCOoJTlp%}Oj#OjAff!I8J2R{ zLd+@61VC`W;vv^JvdZVt{ryATJ?Q{iLS&xo2Y3O0ow_z*`T3+t->Vbwo}NjR!WQy8 zVFli}Z`(IO)#`HDtKftpDFU%|ys|YhyBo#B1@;idh5#^2U2m#aiV86WHit zI>{~Ft725Zhc@fYq>_05#GKkreP!2msBN%!+C|g6A;%E-tMB$2cY9B4w#a}`x!Z78 zSME=zlL$ileMw9|OTa_L%@XY;u?vIO1hB4EiKSODk=^BzPXT}V6q z-(jB!Q~!e2;huvyX2VW?2X!tw_8B;~`n=)OWo30+A%CK2e%sm&q6k$yo7^|5t(=l( zZMumueV%z&dk(^Mtnw&X2huzTAh`5DSl=qbEp&WP2bcBA)C9&EdB|GfJsf8D>J$Q3*=1ygJ{Wce`vj#B#z|qi$56Ejq@}J3sjBv=p|xgey0Vl+nB5TQ-B}S6 z!uq*Pz%WvKeiY?w15f_RO#SSP4gqF*c)JWdQmo$eT}55~cFH)kQ)4$@-B{AwfS^{~ ztyyhuIHBc~U%wwVf{lIr#i43fhW9p(m;d++|J{Kk06ZUV z+W&aYvs-&k!MEtgac^GPY6sARt2Rx@C)-ED*v=!-kF*}|bP;NVWnQ(p9J)MkIclTF zakjCrgyYvgtfrUF?%6TW{*bRyS1Bizuj-)1Rq;eL76)tKPzl?N8mYx%R?o~aMKktD z?b8k6I{2ei^6>79-_Pr|xg2b}+?F-_Y=&y3B>M-Vva)qb`EFtBJH_fh!K!NKt9M#I z-@}TysT`glYe)Lysk4Jvx~XK&3g z??~}HyW2nof407P-F$n3%d!1vbX=cCzNbq1;IF$)blo;F1<%=rwh?dk)j8_aYv@@P zK9ejLcl%Yq>INS^wSZ{SI^bbAAzs(*Qx)a$_$9C#C+d#yd{73kF{A)D9AoG{X;3tC zmwz-0W~dbtQ+7uKymYtFs9vt+i*)*R5Vh3%U^$;6d5ohv#hu4*`oWo+U85O>B?it7 zMKgLnquntB3&A%o1cXl9nbpX?(S1qzccr)ikA7{WC{DUKR)svaYGtoXA-F4s-UhmO zaVeeK4z&1Dyi9Jwd81!pzN(E@`RpJ=;mA=z1byKeL345+32FbElVn$jv7n;mn+QGo zs3YvhW^X5c0Q!)CyYQ7{%zfq-42;hcaLi~kH=JoWhA>7gK+&Rhyx5Hw%&{^KAEWmE zF?Z!=?8eo8pdB)=Ts;Mh54`hJ0Eyl*I+EwH`QF`DwF3Qrb-cqsYk*)O;8b)x!sY$A z(Z|zCEX8$h?Oz=^hSCHW0_=w(epgG%}TPsd<{=HWn*ZA@cj-R!U;PtfDx zh&iM9h!zgf45!v07bY*#_GH!f7*zDX_r&HnqUbJe=>cct09BK0L!C2wX*heKXoKCGxO`DS_rmE!|S z#gB+fV-r{GzoF)79!0O@CeenifCGyDgsj8l=ShsDDtJJ-ovXtkahywV%<2R1W!sGx z>DH9E==+-yExM(GJjm9W-hcW21zI9FDo=wg;^}ToS!es-j41`repBBKx#PlYY}vch z!vF0CK(?pV#<%t_a{WNn-Br`x$0|P=(!c7>-DUdUJ)$2d&Q`MTAAa}m?8!D?{ZGO3 zFP8S7W&UHd|9IMe8#k4x@UDx)XMGqh$&GQJM#K*SjA7bH5d$-s5eXLa;t0w<|NIA| zn(_+JP_s~IDocMil^+t)XSVNUS%i2BKy%Vl$!IS1z&xa zxY<^(mI+bmdNz4}mGQuLzbApD5t6=>C|Np!ycZ&5r6Xdc)c41X2256Gk*$ST29IR) zwfo_v!J7P9aZ>>$e&$cNNBjoBy~HmkvNE26ov;S-t$Z0(s@PXn@h*`x^uwsFNl%R1+iM3?x~&K9jg=rQ^x~^od%spZA#pLkKlh@?J zQ+YnN>SSS6M3m+Z1#%efEHRmPGFRg(!?`|C;GlP*L+QrzYF2GapDqskx07tld*G5|Z#z#p{Qh{^*PyY7KR`{XU5T z?$XV@A|ie`rLz^frgtdq_J#Zy50HD-%cB%(=qGx5Ls!4)xkHp>8<1YQ_=TIvh6*|h zVqO9j+9rPK6CZNaqA-S^PRQM9{3MvOW_8Vj@TfAzf~T zBycOwHGGKv6uLLY){H?nJJD@0qj9hrqhnZ1%uSku2t*}~&7x1|nVm{fanIt@L!t){gReDO%mH9Bl|KltOn4alML>9 z0i)@L5{(!+G!mWBP>LXQT`4bYHRAf3$328KE6%~;67F9oxJ1-~HUfW5E+Dbrq7&Yk z2>HN_+$8Xr6$BkF5qIIkFvq@}0wW$bkK|i{SzX38rr1~VWm`l+!zZg~983E|{WFdZ zM-s>O;SUo?B`dimPvqfiPWv0$GIPaytv~iV8*dn*IbH=*^at}VA26>|zxDpEXRT{p zcxo?-K8!47&W77qX2fOsc6(&Qw_gb^j!5=T!OOp;=J-yA-juhvRqrx47m2>0j&pHM z1T)3)6oc2a(~wD;OitxZy%r-R`zWYQG2+=oi^6GNEREQE_W6f4jz|gBLbNab`f6yq znv%2gq05c5qY=!LMm^^kB^ht92H+*leNsh6bfbG>g$1O^*D?GovDCXhK1!$0or0;S z>0g1t^|jj#GDu#18eE{c{QAS$@~VQW7`y%8{B8y@E<0<$W$rA?=cow$q=gYPHB^P{649^ZP`2J+UOj*l zEJ-P)WW(LQuijYdYpJ-RU`kVQD2r*7)>(K7*C4FpExIuIQuQ5nJn_<#9$m@oDA1SS znp>N~Lj+<6{*7Zu-R$QCmBx}eO*2;d%Oj+8V%e`R*kOiTX}5zPHu(>VMVpuk$4R&C zk2Cwl24TfCRzNs!(&^#`QT2S%{(55heWu+t(%DaH`c-bco2CpXrHtj0N7hs>fOUgl z=f51CJQnGqjZ44Me-b|+9D<}I#J-mGUkpVkjnKuP9XVxWf9ml2wUPep<2Lrl_aj{k z=em6k_yp0&l5DCUFwu@7rVgLK`+P=OPTu`Gyy~M7Uw9-gG8&QG>W~@PI@f$m8y{RS zTS|#CyJjuYX5iYC+%Y;5min7HYwFk)_CZIxmmkP}xe8YHcq0snEO3S~Cs&dkr;1 zAD_*bJ*FeAkVy-XxT6u~{(IJ{^zzP;MlbDm_;ST@;VfE~Pn)3oO)W?-hW61t%cjb$ zo*?kZeu|RW>VV}w-=LFvrt}DL_A6n_iVXp4KNpg>ZtxkF!+Mhc#r|z%&;#sL39{pK z-WJU*I7~A@s=gaAz{DM7f*>U|^Rl5)jP%6sN-EZyXsNVgy^(UY@PURJI) zY}YSczj8)OLRwMbjOZOHYgsvI1#8g#bNEK!P4Lc}-fr$TPHg%%?l!J&XY?IC+`wnF pJ*}M2T(@#KWAMP$&KY5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQJSeP&k<7-0~;P5ULhWyJ>my`;y!uh5d!An5kF{ZaMdmL< z(n>R(hn%fM!1~AZBqItXM>U}~adGJfE=hm>e8lG6U48SyZPla4XQI;pDX)gNhA!1t z?5#+E{x#0T04;O*_Gg36Jl>+s$mKu?aNvqRwSKT^E2n;p8AHE)Ig$Y1bdRp69b~sN z-6wnYO5Fd8-huCzy!fRzF0gMMd}!URnP{qt{`coKl_Nz!4%q?Q95UY@Hw_4W7o1g;ZPwAZ>B z48~glfVO+<_x|?VVXTM)sIp`LV>qRBw*RHZ7L@=(v39nwh{5O?+NaP#d!mbrOXPI; zcKeslcf%uHo6mfjC3 zot>PVtXnMtuu01miNea)yL@t>-WgWMcE?}t>*Y0Xo68toXYm2HuX<&^A^=d@(2&W- z`g(iy*wsW(`9N;e*93A5L)P~DsQ=65mJ!GP-ggLRP6!>^1+v)DQSJw*688`LwLBUJ z<$f62Qbz3)e=EWPf0}e_g^Qq)P{^==15KfxbL*E;kT#ux%cEOW-jEtZhcXDp-cV*! zH$?%*PtLi&vsZ?fuAO*5x1CErzTy*6j=knsJ#e)UnUMG1+zk%+n$KgjugM`8AFXWz zJ@hs^Rl%;!S`+Dte5G@7VHxdRylUg%m$yF6lkuTl>_yHf_WX-_wf0|2G3IQoDJ>$Z zuDu{_!R6tCuH0F`E|OLwt<4*4B`&9BmS6)~GusU&oK!<*OIJ*zRfhD` zHx-z|?#NW zZ&8Tti-%o$LmLp6@E0_916Il|-9IjdN5N}Win>}+oBjuLV`wt$DVZKa`6ZbRKK|b$ zP7SVrtCpqQ7sq_7u*=#=O*MvzZCLV15M;q)S)jWHXlqz12p(S_9~XUgZ~MSN-T74A zF!ctojc?xZ9dZBhLP+iDJk$F3$7L9@-gkpL^xmagO-`L5j3kqcTZf8<-4PRqZ?zP( z>DV>5U5tvJSvmcLy~pXB^*O$Br`SsnbU5aL-6v>$N`n&VST@)JH>HP0bd8=lH(gl` zs#LU-{2VKEE_H8Y4_Mi(c>;z>IVyB6=RWRPY_i$(Dar;iAytd;LjBSVmwERv%sS=O zxU=|#x+2Gug?9mhXIDCx~ui zky{3k?o1q@z4uM%&?2NUg!{`}ZbH zy#4u&zJN~H)^w!Cq*%cu)Rt zEdRS53d&DDcOw5a0(Em*uWfVEzX+Jy9?NF*_L{Z9{r%0a{PyMTL(WDOqKyity8Ie; zNhY)5`Et5iHC~IUHXt%RIlG+WV@xy?gqmytk^8URph5CJV%uyhdU%-{hsP90-z5r{ z&F1JtyTeFm@~!ajjnNWYe2*h%=S{B}(*0}z$7I;{>liViNb?sBu)VlpL;S8l< z_Pw54QwUl!C?Mb($Wn2XOeXjC_O8x$mC;-n`I)2#~(ibXG1Q)7r)eMxWyQ?#NH zY_Ew6Tq)&q=k{Ise*H~}7Jfia_D${r9oP4on!rwIzec?EnAV$a44%z&aG&_}sg;-$ zU5beg(L~hWB4yfBMGH)oCG4 zD18T9LhCxq7I4RD;1jOaTpg>jNgf178G=m0HmL!atXo>C9~{?}*FIvaZ*Y=-Z?%ba zLU&C(rESjIkZqf*a48-ooE2&Ia4}tuqLG~X&e`K2!g63I=@2tAtlXveo?nt^i6~bC z(7snwnJJU&vA;A%FNK;?P${0aF2Qs;f4dA||K(YwF%xaoXEfs63%l0{c*jmX&-XDN zZ3`AjqKF-+864>pe=F8OvdUyf3Xr7D-{Es3-9KtslFrHp=9-((ytuvQSc02TY=6N` z>Y~i^-`zj-V;M;+YOE5m7uej6p>7?>If8GxyBni7PCaC6NjersrI}69Dk(9srY{xQqhs1*BLF|?g+N#IX~JmG>G*+GFY~8L2Knx@ zN+Zs8>DJs8@*xhKs7Cbvwj(OMBt(95msdb%eP}w8FzuVWqtT^~bYOhu12o~k6j?#%cATF%q?$MNW(#Uuf2;}5cf`J4Ef|WQ^gq`bdJGHs&fbj6}i+fIG*g5lD z;1fFZMwx2_>zq^!SBOY=7@R6o;Rl* z<#@2$udOn35Ib~o6m6lO&D;XcFbIdMs;V5iYJCQ;cl9BasZ$s#i%#3<Dpu?s&VPkE9D{~KkkURwb}OSES_HBg1MxjQRUv| zjAhLuK{H&JU~dsPEd+K@NpOlhH>GLmp#Z4ycAln_i_6OfpyDX6fc7_X zS=9`;>c!L1=E&07YR@h*5{O9UT2DKG^+llXNQ}XEA$a8Ru(-1LAFFS;okiqYnrDhm zLuYYU=HEek;vDkFukRG#=UI58w`Y4F|Ib|W`~x;ej1>#=pid@Ki08xI9}@fnjNQci zBgB~E|0v*Yg|JHrUjBWbg};|dTy^hG>W{MLcZ^w0Cid4-tr$DC@#eP0ZVmI-VU3JKz!yEE4FOF&^q9o zwYhD+Xy3A>rVwCjNWZ*C4PX6Ec}l;%^Vj9)1e*ej7$6%}m8ICkfqa_lNs_w9br z^o;wN>Ka1*WjjzVG`rJ*+5h zHOjt0d8MOEO8u~7@xCG?o1cI0_fj~Ia1^X-gEkIiW);U+39%n3wBZkwhsyQ0l1gr@ zc;pFXyKhpr?GGIO5h|um{Y(dmuQ)blzG+k?6(CU~RY;7BkBfJ{4V%Ee{*_xktVe){ zwF_Zu-iXKeCjg}JZJ&qBDW#}fF^opOp(#wQ0Q!jCN2znXkrxM!@jP>o)bl(DqUPNN z#K>|(69c|hNL25My35`79gH~H-DZS+n4d=nD>H5X8p1O2WVY7o!)!n%+!|*5XKxVvuCRO!}q>;q&E$=EbRD zoLWiA3{Drx*b?yxej!fny^dMD?)yo|+!vYeHrYxksin&wY6(^f_gznYwRpN{dd3O{ zZn1b_bGEmXl>6N9q$9Ic?GCPKax2sOgJFu)hG~lHWRO|R4cqo#2dN7LB*C<|E(V z)0TIc-h?u)`>um5nU1S+=_4zzoXl^29Khg8tOm+bZfKlGaW-2fU>lav&5aCa**Mb= zFB=V-?&B^KwUX6BxFG(FZ$>HAo@;|_P`EYvUZ{gLIC15{eBBcA_0VRRcMbBy5%&|< z3apz;hb6hBkcXt9T-zoKex8rP*=S08an9J9n~UfUw0;Grj09z@rFXxSmx(LaXaJJo z&xC`TPL=hI$-GPoMiP?6u8gQagm=#yEYvrNfKv)^F#2d>YlmHpV2|C{*NH4+6I_1* zwqWQlXc}ShnJ=c~%NLokzW#&{rJ*1xAeR*I_H<@M*g#~Ko@f9061AN8_W+TY&kB@i zkL~9sRR%j7L~A_#&ZMbs=U+~_3C_7qkk1ZGN!{uS*a|R~j7J`b4yK*O*`ESN$XT!w zg3b7Vow?5=iJMq}xq_J>qM=O}%vL06i^Q}burXw0wrHyyM5~8|89`^G;WspQj0PDk z>@k@mm8XkT7sABu8#xel4RZ>sg4(L#x^pWNV4aSUSp@!7Rq)#!}Vrn~PdB0Ldo5%{a<%b*s<5#fNlxBOaq{?ah-XQx=*l z$(^r*?V3a+a8~}Xio93rA)|Y ztja1aqr~JtpXtCTj~gTprQw^ZQe~6i{E9C7$AixO;-5yY?}N-Xm8oUTiRFDcwY{2j z*f*Mq7#$p0Z!Eny{t2vXd=fGIo3Jr;dkXoa@$~%h;~F<^W_Nb;j=wzWtt3;M&YD?r z)0;Eg0y4ce*Ko{I!f~^4EyCAJmCmj#nuQ0rlUaW9ee88AKX{}(BhL{tq>_~-}KOgw6qXDD0kfGToM4q=}bd6Jy6KA z?#hz2tNuEe%I&8kt>4eKwTE88{Jc z=}aw2CxC0P&6S$sL9S${i3U$;Kl zPd$$`C2UBAwNITi#kyEw9~Em`-bMp#>7Brrp%4~s zxDrRp9TDU$nyX#^zITKy+H(FvCi%VQT#7!e^1c_VR@E5ne9Rd#GzTn=dT)1#yJh9)L+m6T7 M(9)n%&m-(WaWIO=778LGKol!enPEmiWXTX@&m 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�gDb>o{uHeq4_;D_0J@Ik66TqK55tnm$ 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 AivR!s diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0003.png deleted file mode 100644 index a552fd335779b39956bcd0f442b1484de15eeebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9817 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0004.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0004.png deleted file mode 100644 index 55e321a0b23643ee8d1f5311dcd3ec96cd86d0a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9857 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0005.png deleted file mode 100644 index de4c53f9417e183dd7483f6d09d66d82a599ed14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9829 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 GnEwI6W&3sj diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0006.png deleted file mode 100644 index 33c85018361e9775a670f36a966edf3fbce9b5f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10077 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 ObT1oTD%865=zjn)YaJK> diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0008.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0008.png deleted file mode 100644 index a5e4d75a7eba136121df2938e0120ddca27a77c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9990 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 NxTkfuQ039{{{^|nK^*`9 diff --git a/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0009.png b/applications/Volkov/artifacts/mame-p4/copy-openfix/sprinter/0009.png deleted file mode 100644 index c180e337578e3e0edebc704fba107bfecbf5dab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10926 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 CdQYDT$O& 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 PI58`8TeA|A%Xj__@J`o4 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0001.png deleted file mode 100644 index 2a0af2f8d54513815f0250fe4fec75aaf54bcc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9508 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0003.png deleted file mode 100644 index 518d562ddf7e78e70df19343f1763b85336e9515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9837 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 NZB6|fCF=K|{vUA{I!XWl diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0004.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0004.png deleted file mode 100644 index e50d1d99ffa74c1cf41e19187d45fc39da822325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9877 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0005.png deleted file mode 100644 index 4905279320e7e62e5c4401fa95f5702d34f24b41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9844 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0006.png deleted file mode 100644 index 6086083f0ba5036b0b291c338ee9dd7453fe1e24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10084 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0007.png deleted file mode 100644 index f037bb82ae1e2fa39cd08abc9e4d01530578f528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9885 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 SQy+MaNmtA0T8YM;$NvR0`Woi| diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0008.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0008.png deleted file mode 100644 index c63b73eb91ab1ee59b88d99ca8e8468b132ec108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10003 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0009.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0009.png deleted file mode 100644 index fe75c00ea8b1da7440ab1e867cc9f5bed03fa80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10940 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 diff --git a/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0010.png b/applications/Volkov/artifacts/mame-p4/copy-precommit-regression/sprinter/0010.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ!L&YNpA*50fFpvm@M?xOjRxPD9 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 OBZrQC#{Trnum28>5D9ny diff --git a/applications/Volkov/artifacts/mame-p4/copy/hdd-cancel-cleanup.png b/applications/Volkov/artifacts/mame-p4/copy/hdd-cancel-cleanup.png deleted file mode 100644 index 1e969368c7b085e82ebe895980a7952d4135c335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9900 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 KS*&^g$^QTe{EiC% diff --git a/applications/Volkov/artifacts/mame-p4/copy/hdd-clean-exit.png b/applications/Volkov/artifacts/mame-p4/copy/hdd-clean-exit.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ51qpjR+nmD z)V{dd|KR+6-4)Qyl8~Un`*~B6FV=qG-@vbKG%^3jb63~=L{5^B?<8EJ!5`A zJz{f#sI^s3rR3|xXZ9+<*B^Hi*Js+yasea04$Tqdm67V5tu<(!Xyi&InM~FfjSg-I zKe_j?aEV`jPmacL6r8y;3DtsrZKw@fn{b~|#ZtQ)C&*>|PT~0@6QiRI#N5bS1cSOb zeRFTDfnx32e!jk4oLKrQR5dRvE32DW-K#Ygm8%xyo@~C~brY-WIt(VO7sA*`?idZOg9(|Z&D^mu4!NNfF}Sr-Po^L6d&Z7&96@x#O4N$=mh zc~kU*l*f#!rV}j8RK`e6iw_Wv(TzSrLOrUWNv++R**-FT|wC$&DG zReg4aY+=95U*}U7wm3%DL4|I@6I%aV4_`K$sq2|u)i}y`gy)#-(fYt*x8|IwGG?6; z7mcbgh^gU|O``Zfun{|K(F|g@Dw7EDXy1JH>BV$fHkt4^-4YlfVYOmZVM?I8ZVJ^v zEXvglHVq%`j8J_MRaYP}YH)Lu-J*Bn~B28_24WPq`bO0;dCs7HfI zOQ%5AcN*ioxq^z4_!A2L6W1_vcx#)_JHIkM{T|uo+iud9$_9-K*|~fw4Q1Pfn{Ccn z$_AqOIvD4@ag~_sAD6Mj`|y606JJUq*WIzaYY9me0`v{Saw-91PI0{D6VkSHYeH!; zQt8={SM;*=#q`nms-t$un-hS=2QpuvHQhLz_MntZZNEUp0#6;y+G^2u0BkYp=4-3| z%Hn)I14#ydV9>G1zlRu#_m-1=s!Wcyirk%+B~gZspmLuSsU1_zW&?eZ2k4acvkRiJJ2I46glD}}41xq2KQo&@ql*h*9QQ3Cw#pO%a z&cUE2PfD#`DSS*B)pAX#EGy;;VciYKm_wV^@o0C+Tq0(o_S(jo5SsEUjHSXD%&}JV_ zZ@IogG%Qwm9Cv)kTGkT0^Hd+-kbBiq3b!)#RePUM#%q0sFO@g-`w9c$yR+>n-FT&5 zz(ACUdTI0#6SnDN5sk0^yu|rA>t6_J9 zKo%WV8Y-5JagQEY3wOLombDBHTp`nq%k3utF>%Sse{`k09rJKKry*j)iyrD763-`P*aDXF7zNQ+I&@2^!G70`$oo3dFMpH3(OFouG8bV0D&ef-fuYKlpCGN>>FNWCaSefUAX0s0_6k>0$5wYo69lb+Y?e6ZzU#{h0&PoBP#X$NZ2XGq)VbX@{x9kqEJfTLmNY_Q& zxL6$7nAjf@Tq|8_ghdZ~QkuH;*)hV+VSAXU}yDFy#owS|qvBL7T}511G@c zYb=MXy9DtXXDP}OaIqW;4sSpEW@|=mT;&PJl}u2<**aa|`^K^ zX$Ihbdz-G<;Y@T`l5cr zr;BNFf10##bBL?w(K8Lv!{yaTxKuWhL76>8Q`kri^m<@1T#%Pid^dTBTyukhk!ov< z(_TylbFzJ(TGKv|%E|Xi%MfjHfh==7V);e-7KSwaP)pjZrT_MC*3kUXb0#8sStlp7 zZRc@s6H`Opn7sz8kyi=F|3H)$n_1W7csdF9wATFOfSbL;iEbI>6CnRamnOa%b6h#{ zOp{#GQb0IoaJbR)gzZN2KA3@>1)Y+D^xxbxFOw_P16QGF$WZt9Dg*7a{8jKAFRZPF z{*pe}Tghx>B!|DP=fY$9hBx-G0nXr!t#1k@&RUa>GS*;nLyraN)tTdOdc$^)I*D$8 zU)V_J#=LAz61?DI;`LtBxCIj)`fi_-Gd$jG{^x?NbZ2#9KfK=#O#7&9Vnnpd)@0&S zx@{&VbA_RNAPCE(A{ZU7PM}(FG)VMUXKVI?TEG_|h2&*po08zY9K_sE=ywY5QyObQ zC7i1*SaM*Gk!!RIDZNfSe~r3pls?~{F$)Yo)}s@A)-bGAoKxas(esN?86nZ=Z9bz{ z!-QdUe7k}N{pB<(ilo=LF3E#FEf1#-SD9?P@mb* zEN&Ack+p)AaLs3e9+eSuL{kZ{R@?55;C>zn_mqpK5rZZ zzSV3TSl5j`_LF{p%RzW?7Zi0o3<&UCbhnYdmn_q&trD^Rkw2@~9&>l~YhxHCkLeyB z9oj^IKi$E9ho97^AAH zTJF?5sCmLqBT8g+h zpSIj*dXVq<3x|#ha}FMnCjW2R)d7^15g2t`o5fc;EWV;0;sJd2g){`Cser&)gPk8# zo()zD(%2*;bo`yvUiYbaF>W@<8?xMd9f#1+9f0eNs@o~CaR;UO*Z7w32}0$~l+pS5 zc^1nIM`;F3e`wkrt@R-#uw;C%Dz~UsQ*(3l%9l#UHz2j$EH`}m;mLyB+hFgM#c?kh z&pOf`&DaEfvcCj>s(KI&+oTM&*#k73^VvE+{v?_#JtkVy(*l*3Z(w5EvC}L~R+|13 zkV;MZ9>^PohzzVSXPb-JS2G9Ron=KU@TchUGJxi*N2bvtsIv4o53ZOR?eq^@wVH{v z39rrGsrd^-9}!B~@_RslKEeeSezs|u;;~I_-Fd^FgPUFU=WUt`$X<`&Ji*CsF8?!S zGIFvK=4un>PR9i=gC|18KaTL2Rhnz)1cm6F<%)+1`!$(rXYRX3)-pO7oYf_U0XGB6 z&r0+-@8Ec?Rkzmzp6eTBC*M>;Dv0z>{W?wKO}SJ$pN4NexOQ>Dv47 zvov>ERto*(NY|J!!Oj%AVx5w9Rn62AtIfcCUvIb+$3J7_nu9rx)~;-1_&$t@myQF) zmbTu9WqVi9SKIfd{gbfS*~0dW|CDq^eTc^2qi_X;;ZBb_en)|TrBxCiD36HVxHcay z#Z$nw2cdnX<)=v3aI0{TQAR3w`Xpx_SC4HU{w5yYIdg4>%y;^iW*VwOozZ<8kF*;? z4VAq!cRf1@Df*o2oXrrpig+^ zlL8XsI;`!pLM4`~3R^PeH}L66_T&`~71$ZSU*>X4){;3SZOex?#dml0I|ARYe7~Jx zxS_##0l2r9FF!$H{Nt)j+7>1uWCc?L;5;pS&}JSsyPK#~l2M&<;GZ}O%yB4p)NLNr zsm~IGdVw@R4@-sW5t3cyyk<2PF4XDu6TeJJu_NmN!?9yy$m2K8(*RvnE7l6?_xZ5d z028gjpuG`Jf7Oou5i6PvjhZ?nT0uZ;HBQpeX3f*%2JvGzT+Xoj%Gl5 zaP@k>k;0zB>BgsHcjpYJ^R&UUG9DsiM{dwct> z@t|H(FA&I#pwn0~ma(&j*j;Y}k}`Ug#~|D9`58arfy!5xbwp{ObuXNOfV~GQuyIT2 zHWR#t3A!`iQJEwr~x+?G3K!_4i3v_MSn*PYz8wu*wRAr9(zJBvYMQAO0Epji= z-4hWC>=O##Dxq`SWi*_ghiy_9O8!`2B%%AO23GADO+ zk8)U5drvuM^hR#xJyZe3IPV%MT$YWagvUIPVI}+5So@!Nj&_0lMdd7< z=Cjn2i5_g=GuFsbdMUSk(6Ra`GIJ9BV1T9H{+jDfccwZR zxG!!0C-aY?zfwux$HpYTdxF1Q8XVpNk;z|DJ3#roKR_piTNFu@rY#E>ugO7x@$V0V zk0quax+l6vlm>oyIo(%L`cQ2;VU=nf$%mRqgCs%J+nHswg3S>zR# z;a~%@JT2|0?Ohn@w23S@6?*Y-n9SGOWfZ<3_-qqoRNqm8_M>pb=#7lY+xYe{{-j?m zy`evNW$nWsdNKIWL-Js`??b8Z|A3Q6jnWKS)7|yTq1hf15cD&BAywpZfso3Deu-;f zZZ`Oyv^`hb*XXhdSDWMxmL4}Lw6{iB>jA*SAU78UtCu{GJWZo+=cR<^B(+00QfOv4 z%E%uj%(i=vRcp1qmF~K)c4&;@vz>@%A_ zDz&oM`oz!GNRdm@XdI4tsbDSe$tp)u8Y7k;eK5SWm-)T_VVjwO5-Z^CKkKQoEHukK zhD&kc<%X;!7UKUnPr05v`A^aDTHy2MizqUS?y!b06{l`TrL*1OGfUY#G}*L~|5EU` ze~_sBlFxgn!I8X-3cVA>d3uF^d|JvRxi<4xux{oJk+GC8_ELeQ!AYa~2F{rKdCKd2 z$Jvf>?C-72e@3_tPnsI?(2^y<7ln4%^TH#SSwOz`*Y*%gPXBGtj?JIr?~=ya0Xg({ z<=|r*|MTx^^Iv7`zpDPhdm8_guK&_b|C;%=_W$d&f06d9TK+e0{w14#sq_D=-h6Tr zuf9rmq|jRR($w#_d+^en^O3;TZ)8syh_@wL=XsQ5KF@xck83*3`?jeL6Jk+|@)1oZ zc)!z@gGID1_kmlQtnjoqM}Ds3V3%}B#tm_bTAh-b=ZzZGx9&MxAmQY)JN^~sM!6F| zB5Gb+%usu2j&46+Cd|Hh`n|B*GyjS8l|{5QLU2d{O+U_8T3mCY^AKn4>>^jWerH47 zj?_+_rJ@TRd5kp{x@xWG(YW#^W`^tPN&nEcH1!FFSo)N6+(Lo(4@Q8;IXfiENJ&sz zlIUt0&qu?vL~}oBvy8st>zxwDUMTF@*J3I!*967G*@&pJ0RkzH%qeHSp1CW`dh=^@ z!~9!=%qOtE8Y-Hg*g-z?U==g)y0GQcb4!b*TS@u?zRKc-Rp64t4uvma7y_o|_Z+6@ zQ#wsx)niM;a#x8ORi|1Q{7kUx{EVP^O0arjvgu7t8GMusOc;ozZ{ND}$X#{OaslC} zSAXg`SgLU{Yv~VU%aOwPH(}2jG@0H>QtH{J_mS(!G8D>yC3nY-0ljkTt~Gh718yI% z1{$g^B8pj`z(rXJjq3NTe{RkCb&Ibx!ITD|xqxRdM|zhu31 zt6VhaeBs&X^!{6oi6VyJ;Z%%tD8F}IfVdQe8~p^zv>{%iuo>ohJrngsxKjv`ITZlgZ8&*QIxll zXCF%PD}fivZ_+wW)nX@3$mPSMy;gE`M#*FYRME>BE{c8S=AET#S2Q{gh&Q~Qn2@WD z)03rhpT!s!8@Xx~7)l(K}=uTr&m`fMN7rSzrt2O=7=mu7Uq zw6hoC=p4d;?|KxM3Q))E89W8w57g94A$WPqBP*MIyUiCtAiw^R3c^O{H}K3Y$r~3j zhpU4Ou;r$7Mw#<4cn8y_i&iNQWD+{7q6elNH(3iaR1e8~@o1frVVSjsv5I!7?6YryX*czL3JEkWZqs)VYCphYA zn0V`ZgEGvFW^i|oNa+jODHBkp97(`(h>Q5q{ELHFtrzc4b>H>SusH(|LKUHS3oSZr zp9^|SP`Wh|EH7)j4C9aAsErp`RYsph%S2}7goe5%4LFr`AtpY!x8lAk8Iye7tUxAAaT6d&fC0nq5Bl*S$p(b7s!N8iT3GLt}e3_h_^nnG7^s{%coL;%H zu~kXdG7jFmxI^)eM9*1fxR(UW%~+m!Wnx(d0*Zo?M9b3TzfkQz*gV&c-K z$~F48Gc#s_+Z&$}v4~IiTd#26P&<|unu_EXE*I$%lOZWlM`q5R+dz?unJN+CORzN6 z`-FAwtnr>(osSV;jv41Hu@@_cFvxf0uSHol)%~9C+2}rTtJB^R=~TthBEB&Vp}d|? zcz?#M*pB)1N^j{CzNSJkl_S>cJa6Fz@d_>#0x2U8fwk#(mU*r*J0-t37K<+m+W@xn z?XI)?yptG)-c}n71)+41!P@##Hv}xPQ6+Jyf>Lvtt?r0| zpxrOuTWQDSNp*ZqzW(vjn)s0Y0*22QsKBQAs>$N2ix=0KD7{?@ED=903fG%8Bz?|+ z$*9oYKFFjJhGd@wFBuHvszdwQm9O#w#6u$e6-`CFj^e01rnf2vLQRY;VWhlZtpy3r zA?x`zEhcyeJ%*Mtl)C3>0b4id9=%|eX=a(sr}l7XjE+pBkPh1X08F3(Ss_?G4}4Yg zc3?*qqFGlkJ-G_?JY{qdB?fh9?TMP$6(aGD7bdAHxVvb8PSC}p!zplHsR2?O6FMlR8$ZIk*J7B6O^WeGJ=2sX#u4vK>?8(kQyM#h$16ZAOY!v5Fyf} zMx;bULI;7+yGRW!2?3IjY2o|rzpY2u;I9*H|L z6@OLyrP7ml{`t)%bc89XBklwuRQ0&~txu8naw3H6Y|b}klFy&J9K=99tcyW^Af+wy7OtjA7EsM^e#T zMzCjH;PD-&qPI#-NhDI+=T*dJb;lfmphu;*D|RVmN}6P(Nm%@twY;lsUPnjAEOh|S z_M^fUiCCv869grp(0r~d6RMdB-x#vi*4+u6@}{Dq!UVo(-Zs68!qw}2hvpasXIEQ${c49-x$_nhv_3z9c ztw{cI8Y)})e!#?|5HeUaq=^A+%Et|NGnJ3-e>>g5QSx*<2_4sauMh~b*J(xr@Ct#Fu4w z&&4D3_1qo}rn4&y2D(S!oB@RZ520Iv@9tkZV_4J%E-J60_3aFhlcebJp!>Fg&<0Hp`(%6ZU&mt_J^iw@;3Bizc!O_ht@l_=#+a)2v zR&h@`R0)>;_A>N}2_E^Z);{aq4R1xlA%iO4yRN-G1FpX}lJHd_4R6EN_Fu&ysvoV- z6_YIs5O;D-Kk|;qS-8FCh1Wb5(Um27@QzN~=G}1MgYF_#d}hRMDwEkq65E&p=p5bl z`tP;riv^h$yiUmD%3e!yrsSYtqxr~-w941M9&3Z_$lfh}m23!trY1p?L$NG~He;2+ zsLk7qq1!odn+Z0$6|<2g8=C0UoGLk{u$LKKd0ovak8uHW*JhUv=Y1bO-vF;Hr;ITt zBx3T_Bzi1gA8BbV$NL*EB%PA6wOP4$az!cOsh|ObLl9&XM%N*uliDk{?G--qyK)S% zVat8QS2*(^*717nK1rzxo|riH1>ifZ))dPvjXR3pq&sV+Eh?56W5P9kS~!WPiGHm%e1574d@QmYlgYmk&uBe>!qeJV9Tv1T6%GiR&#GRnt2Sp(KI0oc zO&@I1RB<)!l)$L$XN9A{Z?-RzlFCg$8aC&n{6(V6ev6_<7*}{}Dl*dHPag4QcSOjd z>hPib@tgf$KGP6ltjBEg zCfPlzf5Ov!ZOW|j?BR{t5*2(f$0ZU>$L~bD;J6%-PMu5bIs^2t*`~C0)c-g5sk7F5 zJLZ0%qGU$k8~SK&O+waF1`za|x*7?Lw!aC+V~?Ez=b6 z$}l!-Sk6MJ=9}q0v}4wr1c%~P=b$mh>_J%+O2DB`*7lk>?-2P@#I0Js_LHgMft8mU zw3UOV!h}+~QdOZVI&dv5*W+_(!@rjN(Xzk-s(Gul7&Z2(E$|F8ZLmuET=Wwv=!n;rf@f6^pXwc`@qAV|soVtr4HBiNFBU}?|L zf=oq7L7tvtpP+#W{QW)GR=c9`oabuq;mzWH5a;q5kBwqQ59_?PBze`$9hfdQ>C>k-M}17FwE6DrHcGx_ z@nt^av}+~m*Ssb_&CbqFHH42OL9L5`t2Na2WJUhH8f7`eS@}_QEh5L2j?U&V;yg~zLI0x!~-1(*rpTnthj7{->Tpq{wAFyGA1Y&2H|aVy{~v#D%)OgqaL zgx$*%ur?9)+a;kNwV$fDSZuXW_{?rxt20uPp#$4UuRP*S6MT23XX!zC@}wNfNi2$a zYiNM+MH+2BVeFx^1f{JnL{##3L^i-){~QG9Tk9{|_Qu&XwCT*W@>lJ>c$hxqR;xfy_vfFg3aPF${@e+Nw^0H$q$;KD)uUMqp!R;wPuvR=c zwaQTlHz5ktvR=YjGUa|hr03f4Ftx^`W^qB%X`CLgb<65%N!V3Sa9daGBZ-@}e(GRnVC#^SZ;Qdesqs>CUT))9ay#vsM#}j?qh6Du1$Pc{6q8GXdKEYRx>10qR(xS zNo@F@RQ3Z%Q>$D@AkV_`-^0+` zly>TMD0v+OuYIIvuGslU!mC94tVJ#?q)CjZvU>`R=VDRsT|9#!4ij#`d$;Qv5=JsJf0r%?WJT&S8ecSQE_nq`##-JzLprW zGFnA#6oRCwZ&Y2#QJFs8gRN0t5t4=gCDNz;K}yotI)UF^na9$RE=MQqf?m{gY3`A) zzlEE;b)9D`>o9NMe3+2kV@>FIO;zybN~0}DwISCe(^JzVLwzX3t|riXpyRvBQx zN)3n2L^4Mvj72unPJmO%x2g;8OrgjRl5IR;$Bw?-|Ke+AAF(E9qYn}Rn+YmU=*;rv zjX~}H1JL^3l)16Y9pRpj*N_h@UZecD}IyD`jN+5u6>2d^x;df=KplQILK_%9FB zm=het@F!=~tKs=xV;FdYgdekAntGR6x<6qv&)5S%DgCRfEL?VvN^1@I@2u5VhkZn_ z82QC@A4^KSyEHbHAhBW^A7$}Dv_;C~mzVr)&vx%W>h9?&rWx`9N$)~zlr;g6A)oW+ z(65H0!mV>D{p7naymIXquvWIZlvuO4a%>PBO71!q`*#>MwwF+s&sAVeV!TFb^@brp zqh0hL5cfu3wb*hrj!vzB_Jw#Si< zzTJLTMQ6QB$!Z5(4hkOn>)sE!<#9Dz-GD}^@kd>Iw!Gi)p2lQu(*rR%Zv(*&D^2x` z?)smF71qNQH_7w1mzd)Iqfam?WH}4wU{|lN0e8euvf6sb&UAmu!InLlN{Nt-{A-;D zT6#kBa~DwUsrp*e>1Te;Q3*9c>cQSgl6N!|sJSU+Au_7j{<^7Z--uSmFDn}!ul>KK zDZ;`5>xI+};I$zSg1gbjbH_EIS?jP2nOO6ffDMIV`z)T;y}WlabBGsvk>Gu8Xl)1j z@3sjO}+_K zPUMSq_Wh^vxYBwiI1#6rZIw4E@e%u3dnow|oqo>!X-7H12>=ROm{nEDV8q; z!WuPfHCx!3f{di(e2qb9%*M&C?~7RLJu)4u_Zk)eT}O8|BUc%56)Jmjzt-cUiGr@H zO29h5-#HW0o8RClmF~5QPTmT!TkSg2;Qo6XO z8k;3eV$9Jw%>hy5f+2*#UXpepLb8~Q*Zbi$qm3668Z&P8E?=3R}6Wg<@9dk`uY%+J^ zi(N>zk534PwTYiTv-)_6*q3iPC;aI!SNcRf%*w%2){85M!ZH~Mr%Yruxl5LwjxZJb z^tU7Wc0aC;hQqT8uYd5G(x$@JChKR0sB>ManO&O9C5oHR`^w6G(HahGmBU^2_kq+} zV)Zz!Xr~e3(v0Fwt=OGq4!LbGQ;$^QFH8`MJpsh@tx=oHnj*5z2^RoBx@u8bEp4Om$Pv{t6F*oJ$b=+eaO|FzKM$qyzIooqP zpVas!vETx4Gs|MT`-m|yZd|w5`5fyV7WTftd=)eKs<78Eq%PR2EsB2U+sjI*?CO7Z z0ha)zDq1cr-M8d>8p@IO7<#(fHP-ad-#A>+ zR8S>O6aUZl`HA^T>y`&V(3hcwG!jXEUm<dg_M22zA^f8UweaD#-tG(=y*>)*?A` zMjk&r{ZcLGFNah(zC#;an!`x+ABLPUuG2BZ?W|x_0Po+B&pg=JvYCeqJ(#`w=5;So2V%q<|y7Rw@;B7ajFJtqC)L=>vVvSb@#yXUL5s6rIW0x_^mxR)Vd5>U z`;t(|x8*{-<|ev-TVtS|3c^gIp3TMPLLg5HyI+up1!kq>`^9Y{#lp}>u~sHHYNmPhB^9R zBl)@J&jWvo|EtrE|XgEgK` z&{!^(l*!`dzJp4EAKAsjm_3>OYSidR<-Y4BkJ4IN=^%h|21gtpm_JPRf$w&hxMbt zrv{cv)gZ&HGFd&@*nRy{qPPhJx1Glvz`R|zTmL*S70edM;{MV(xv*)fU zf|hUED%z#0@wIO6nJ)QKfa_gV^-H8U3TK~iF7N2PQ=h`yz<^YQQezFkO4ZB71dNwX zo#LY;(o>KhVG%bGCSfe)E@1=D={8SPkmVjr-7o{?H``6v8Chp`w+{=I)v?2IiXj@g zF@`Q4iH-PqsfBpsEZ?-@MlTR+afY?U^e}+Xo)|LoO}%RJF6fqxX!R#)=dwS{YNN*;37@A}&Vm4fLuE5q%oZu}L#&8_gS2bO(lV#~i`gk)vB(JrXgyJrV zET8x1fVfMok7c3X0r;eEClsFCd6DhmvNES7A{!iBz2@LeUe1Rg* zd%Xpptovblv7G_uwVR7-a#fz>JoaZcjhCMsdG~AympMFrulF?(N(eF5qRwnwy~!58 zd0DgY77ttw<;i>D!+l+Xjv~_M~X9^!*@L8pSw$QVN6cy<62N zZ9u=!Tofa*2)MjQoKNL+w7C?jNSOc?O(9lj?$M~U2V&!7&=_-YELh!OdSeSsH=8Xp z&j@lqY?pGx=|KJ4ef|0eV0SrnPY;_%{)WCB97_9q`UTU^ zKUTQD++=KCgMivXQ`pC3#SiJB1#(NISSK9v66v?oRi_0&R8e>5TWMgX>T_$6tA4Em z^B+RfFZQYG#T-k~<+b>Dw?qIXarJJ%$ldlirH2{Ewe$O5cRf*xRZ->WFs&q~-x))) zdjT<5*f~#&W0tmz^qX+p)+t0kwCZyr zIVN?q^G<#wa`fQs^u?#mAQjDWMz=M3RTgtaBnAetQ2UU=Zs}C&E+$ealMpv?T@YY&9ak{(3O14Lv_eR zVp+s#qHfQ@v%?m4>fo}C=7d>(bk4cR56DrdwTqVgA5Tev`ILva_yH_rOuzokT zjCSW^|J8A+>4~K=<#kwpld{2~H*j6^W9i|K{oiJC5IkUD&xP2l^!z`O_RQV-aTbbF zLM*!-hd#~QBgM*kVoRS-*%H3R5gsOIM#0Qy&tb8ZQLw0(&Qo}?!|!fx=#FCLmER=I z6{t;r{%;J4Oz8MLnRd2SQ`G}n% zTA6Ev?8{k`oi2@4b;*HICyKT1Rw-e+{a>^r2@Ds@n0;T9oDAfS=uLN@Hd!QIy=?Ki z)JN+W-xZz$5tnq}&~@n65z`QN|7F_33$B-OnxK_$6A`x5ijwemHGKJpEC@WhG7 z=!TK*S%u42uc@BB^iaV;N%^X(gVf{mxvgAF*&miLA73XA9#bb@rzbvVP2K%`WY2>9 pA9$WMdf;}}-0O*pC-(vO;;Mpz!a!t)A@_ScAYJ2|McVeE{{{aX5Ci}K diff --git a/applications/Volkov/artifacts/mame-p4/copy/hdd-zero-copy-success.png b/applications/Volkov/artifacts/mame-p4/copy/hdd-zero-copy-success.png deleted file mode 100644 index b7b89a1dc72a49103383040f651db6a9d0d74657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10015 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 T$7)deQK>!BdRVCRBJh6!+c!1D diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0000.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0000.png deleted file mode 100644 index 79c189f03f64a801975232726ec1d52d8ba7c20e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8399 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0001.png deleted file mode 100644 index 048351a74d202fed61d80dc5cdde7ec31a535ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8108 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 N=M(M@)%IsD|2sH8l-vLS diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0002.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0002.png deleted file mode 100644 index 1a8538cf0a67d6510b41c9beeb09471615d890d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5408 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0003.png deleted file mode 100644 index ee59798069bbe9cff3c47e793679b7ee933b4b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8768 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-83-pass/sprinter/0007.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQX;zp65LEcgh=QX>Pnn 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0001.png deleted file mode 100644 index 495a2ab9d147fb315e438a8fc90efbf4cb9b9c74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8104 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 F{{?c4VC(<@ diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0002.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0002.png deleted file mode 100644 index 516e9647fd3486307a8ff4b09e8c1aa842c520fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5425 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 HKRNf`;6V&T diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0003.png deleted file mode 100644 index 7985f43f207924f44d6ce06d1ef982e0ba0d8de1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8573 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 F_g_(c;ywTX diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0005.png deleted file mode 100644 index f0df585d1bc81ceeec9206fbc006519541cef0fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8591 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 H+wK1WNJCf^ diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0006.png deleted file mode 100644 index fc0b5528d39e776803e974d6196c60299adb6b33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9541 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 VD3BxD41j$gsE+Za0&VBe{{cFVL;e5& diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-final/sprinter/0007.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0001.png deleted file mode 100644 index fb5618c25e8912b0dee61541ad2bc07e65a9c54c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8102 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 HKRNf`;6V&T diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0003.png deleted file mode 100644 index 2603413aef4aa56a52404f7b9806785fe43b3d82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8576 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 Q`Emj#*UYY#8QzKd4|~=YXaE2J diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0004.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0004.png deleted file mode 100644 index 6095af7cbefb137ec1b488f92101fa0667868d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0005.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0005.png deleted file mode 100644 index 07ff09dc954492c50d1733ddbed5da41935f28ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8593 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 Lxie*^-nae-x(X>o diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-pass/sprinter/0007.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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

      e>)E?*#)F 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0001.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0001.png deleted file mode 100644 index c90021374f42e492492315eb080367086e096a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8096 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�QbP{Y77 zQ!|Xz{c??op@z8R)E=Ff99+jSF7iQmv9Cjfqh#ow+(_&)_Zfa$yQTbf?7IF8ybcP_ zEq&uW;B&mO4->cIhPazs@613gnaw-TSd5CR_OrZcXY~(kK%HBO3_frj$s0y1&F2FmJTL@dS zD~pF$r?zQ3l{#O|Ly-|Hzu)sNb_F@`hF0st>Un+OLgt5KdrdnoYDA>i$E!}fFf}T2 zA%ReVdo<0|kytPHKr_v%be?1Wt&>8H)iy}RTEHI5;+Fa3qR+^nG`VQL1=}mFx@3D5 zTsh{c%z|_r$5c}94u0#E3P|q`k}Crp_+l=2ICr1tNdv;8GG<^9V`O!z`v&NWa~`Wy ze<^^*yNL0U<+Hh#m1bFQ?s;205`p3mK?hrXPF^hKfe_#W9(|lA57_*>(PZ$2dl|Dv_SONp#JTPqsffIjzb?229E!G=ZnPdl)bd7# z4zDD8db|36q3&m(au&z6Qls&?i-u(LwBXY7Gd}*xLG}%c_56#i*B{Ep zoylO^R4l4v)^lX>L%^PJY2n|>5e+$1-$izvn9LmP>?xk+UV5s#g<9mrzSrYg?JO#9 z_XgBoZ4+`@?6-ze-)K;dl%Xcy7RQ0Xg%j~!d89#X_IZtc04KjVQ!DDcJ_SjQu{sAF zk3;%^*}@)<-yTlM4G?!LSE5oC0x!Dhr_Y(5!l0Oq9+-LQ#D*(ndQ@q2w~4581{H-@ ztyx4z$E?^tO41iK{zN~Y*7yc;LK!Vp6JMYIbOqU@G#$B})KuLzWDpcytEAw~b;>bv zer5=69=zEgVjQ;k&T=$}siB|?Yr~SkmZ|GjSDcyLuZKS0hbf1CL(XT8@|KmC!lCT2 zty^7!(5Zq1l?)b%;#iSdRM(KDLdH+iKYBUfBF>$)6dk@x=UDk`?|t`0^sGGqN3vH(_Z6UkcN7ux|P~D9{vaW`c``Y diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0002.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0002.png deleted file mode 100644 index 516e9647fd3486307a8ff4b09e8c1aa842c520fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5425 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 HKRNf`;6V&T diff --git a/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/exec-hdd-run-20260908/sprinter/0003.png deleted file mode 100644 index 181c3c3154b951236c8a0474122b9e7d565929cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8565 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 N=M(M@)%IsD|2sH8l-vLS diff --git a/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0002.png b/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0002.png deleted file mode 100644 index 1a8538cf0a67d6510b41c9beeb09471615d890d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5408 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0003.png b/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0003.png deleted file mode 100644 index 09bb86f552a142621a76a4f3940949b7cc613f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8753 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0004.png b/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0004.png deleted file mode 100644 index 6fed65f35d4c45895f5b589a23f4aa52360b5a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 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 C9k@gQ diff --git a/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0006.png b/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0006.png deleted file mode 100644 index 522af920a88792585554ec95afd16adc95920c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9707 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0007.png b/applications/Volkov/artifacts/mame-p4/exec-regression-cwd/sprinter/0007.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec/clean-dss-return.png b/applications/Volkov/artifacts/mame-p4/exec/clean-dss-return.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQd|$) 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 diff --git a/applications/Volkov/artifacts/mame-p4/exec/unsupported-file.png b/applications/Volkov/artifacts/mame-p4/exec/unsupported-file.png deleted file mode 100644 index ffade7a4f3b151bccd88211145b2b0c38efbcb05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8772 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 diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-final/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/copy-faults-final/sprinter/0001.png deleted file mode 100644 index 7b5bf9fd21570f285eb1b8824b72aacbd290f6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmeHHYc!jA8vm5P-;x$RwQu=aml>eGc#ZI!|a)_`+Rxd^FGh>KF|Mm`DbCh z-S(*Ks{;V`c(}Ws1wdH`0412(F6av_$=s`w|b&(!C? zPck9acoHywxj5RYqE1U8x9n8s@m!n=BNE?83|lT)c;#x856BYs(IV_oHJ{B!rBBDG8*Cd=MSs*9{tpuvFAmTf7xcVVfWrgJR# z+umFN)I%a8=h|s9xms~R!dV8 zlhfIW%60ei_s?KV{_yoPeB8XSdA&pz+yysoVGRup*=49y=fR1IiN?mp0mmdM9vWC^ ziQ7vz%{yXY;Y3{s-WI6@1~UKem|i&g>7*pUTre=OU(Va3xgV<7f}`sKn~8MpU~Ee8R(kD;7kz!n%hUYPmwQ3Z zVHXz{>f)GJ)vKkc{(Ze14u_Z;8VZYmv{b?2@s5@B+1S|JL^593OncA$;TBK7Nd&@!1dXo+VgdF zb=R(4YY2$iWSHg^^+;@E#+Z|@c_FOsNz_-TKw6g;-R+`}5C3ZeTTaUM#fgG~f`Nk$ z3Fd>)R#@u1@bids=gyhs%SG+dx!3iXfx*EkE3-qT{X6IJVXE_jTQz6J;@ArphQG1I zS(pA7&}EC`nc6Fx>yVvfqQp3m_DGL~rPJwb&e>|B9)_FfXvBJ|udk0r+1nR;S8Z%; zbQ^ajErnmXB55S_8lf1auUeIW6rPP88X5`-31NF2(&RI=+5UBbNGq#G2=xKk@-j0J zheK^AE@wWvefxIRnQ~D=EJ)kb)7NjK$w>BhAh$6BY>-IIhO)A<&ntmI2N@q9KOFU- zp+VB$9rL#BoUd=*lj`5`7DZ+#eKNqeCl2gfP=6?3g$2h#^pPxG%d(!W`(O2sJxW^2 z{`}|<34(fDXTrR&-0C1W6((PkOkP#dK_TJ z`dhpNDm62C^}{exuQS@Zp;id6@a*GqWx>;Pd-!sy3xFQ3^n{E0G-7R(@RsIEf-e1XYT@QX0nvL^bXyu zN;r5&m0eRqKK9k>{0k7X*2YZ+Wu$^~kT%|hAHObtyho}9#6fG4&YlwYLvo4My${sQ zkR@fXdDRvEC)fLb`~Ql-_B^g%D%Fgp&KENHhR=V7y&<=+LXb04j!GBLDyZ diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0000.png deleted file mode 100644 index 3ce4a0ea844fa2a97cf32d1ab51ba685e1b1e41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5851 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 diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/copy-faults-missing-exe/sprinter/0001.png deleted file mode 100644 index 79378f8d9bc1bc84114cd0d007b8343883bf6465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5921 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 diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-pass/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/copy-faults-pass/sprinter/0001.png deleted file mode 100644 index 7b5bf9fd21570f285eb1b8824b72aacbd290f6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmeHHYc!jA8vm5P-;x$RwQu=aml>eGc#ZI!|a)_`+Rxd^FGh>KF|Mm`DbCh z-S(*Ks{;V`c(}Ws1wdH`0412(F6av_$=s`w|b&(!C? zPck9acoHywxj5RYqE1U8x9n8s@m!n=BNE?83|lT)c;#x856BYs(IV_oHJ{B!rBBDG8*Cd=MSs*9{tpuvFAmTf7xcVVfWrgJR# z+umFN)I%a8=h|s9xms~R!dV8 zlhfIW%60ei_s?KV{_yoPeB8XSdA&pz+yysoVGRup*=49y=fR1IiN?mp0mmdM9vWC^ ziQ7vz%{yXY;Y3{s-WI6@1~UKem|i&g>7*pUTre=OU(Va3xgV<7f}`sKn~8MpU~Ee8R(kD;7kz!n%hUYPmwQ3Z zVHXz{>f)GJ)vKkc{(Ze14u_Z;8VZYmv{b?2@s5@B+1S|JL^593OncA$;TBK7Nd&@!1dXo+VgdF zb=R(4YY2$iWSHg^^+;@E#+Z|@c_FOsNz_-TKw6g;-R+`}5C3ZeTTaUM#fgG~f`Nk$ z3Fd>)R#@u1@bids=gyhs%SG+dx!3iXfx*EkE3-qT{X6IJVXE_jTQz6J;@ArphQG1I zS(pA7&}EC`nc6Fx>yVvfqQp3m_DGL~rPJwb&e>|B9)_FfXvBJ|udk0r+1nR;S8Z%; zbQ^ajErnmXB55S_8lf1auUeIW6rPP88X5`-31NF2(&RI=+5UBbNGq#G2=xKk@-j0J zheK^AE@wWvefxIRnQ~D=EJ)kb)7NjK$w>BhAh$6BY>-IIhO)A<&ntmI2N@q9KOFU- zp+VB$9rL#BoUd=*lj`5`7DZ+#eKNqeCl2gfP=6?3g$2h#^pPxG%d(!W`(O2sJxW^2 z{`}|<34(fDXTrR&-0C1W6((PkOkP#dK_TJ z`dhpNDm62C^}{exuQS@Zp;id6@a*GqWx>;Pd-!sy3xFQ3^n{E0G-7R(@RsIEf-e1XYT@QX0nvL^bXyu zN;r5&m0eRqKK9k>{0k7X*2YZ+Wu$^~kT%|hAHObtyho}9#6fG4&YlwYLvo4My${sQ zkR@fXdDRvEC)fLb`~Ql-_B^g%D%Fgp&KENHhR=V7y&<=+LXb04j!GBLDyZ diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-readonly-openfix/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-readonly-openfix/sprinter/0000.png deleted file mode 100644 index 958029b80bba3b1fd67aaf4826f41e0b1794e80f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5574 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 diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-readonly/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-readonly/sprinter/0000.png deleted file mode 100644 index 205d997ea818ae21ae091870f90f5100e320a2d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5476 zcmeHLYgkfgyI!ScO$TSj($W;0sjSR2(L6&|j-@7LrWPhT8hFAJ9uuMRbE+|O(lYS? zm1AWpSR|At=;R?xK}*yWMTI0KB_tA1aMR4Uf9&ttzxS{GT-RFHTJL(+^{)4MpZk99 zXI(qt=e7PjlkWfkSbyy35q|*CF#>=U7OPikM;?SFM+3k{*0CcV0U719qp(Nkg1EqE zc-+;yf5uc9Ju~Y6W!V2;e_S=IUftkFymfJW`{ng(oHB9(lE!;~+>Pt-_$v!GFY2=| z&7)PLcSIe(e)saxBUL+`6336U-P3sp;>wAfqor| z$a`Z9gsr(wKY`*9>&Vch34R;_i&lN!Z1Z4DgcFHJdeQ_*O& zy|Re3B>Y;p)_7mQpooOW{o{7~_H9`9%&AK00&`jY__Rs(a>``ewLYPC!WxzhPMXJ6 zOg|)%J1X(#zwOoE78bpfpuz*dOV71>zzJXNNozi+U_*`#)t9KIfr}1bHGV&1xbG~! z2|EeYACnro3rU#H2JJD8g@@UC8%n&fz8FlY>Ms{=-BZ**#~dUtDC<&2cYr z<#>U=r^G{d&_q1P9|j^J197K&8c&PgM&3<0vPpJT;+4; z>+DGS9Pfp6P|_$S*91}KMw=FlnTqyuFyd~v)?FThRKMk2HgKfs0aFucYg0dT-JWTD@?^g%ssB(NnM|&&-RhcFYr=0#jm2Q7 zF(n;{OrPP?gdr#K{e8XladBg`{F0z$EWJT7#KBe&xpbs$w;a&-vOoOMh_&s z+yqLf|G+l9DoMlbGL%t=ZGg20V(x7)b4k%GDP!tsv;(D}h7$(vUwTawUP@bZ3<3ms z#x{Y2m0krmm<$F3qB7=?u=A`0{NjkLCp+Ba&5-^1r;naFrmd^WWuhTO*0a@Hz;U~O zA1L2RU+VsnRnB$Rsn3n)J(sG)l!W;Bv2=bmx4_b`d~*+?DGhD!q~)8aMB(e3Ga!Cv z0SJUwr@cvC7)>X+XQlZavk8Fj_bG1a_V?gfggl*FC3nhT?7u?eU0%v#hhvj}?cMw& zMeX|-OrVIMnuAMN^?o4CbnV%nkgvDt)E{0KJCmLhWG8#`U>6JLdbZ#BS$jpeU7jkD z-VU+`((cd@Pwi<(q_5=C{udCQ0Xd2sF>(yP2aZp!VBhjy;HE)5`&R6#%$?ar zrl6~89-TFIAK2^&W{dchn@Tq8i_^`6K4Xz;Um^i6y_v@FzXj9qc24DBbS~4^I zZv5bU^B{^BCMCFmM9$f~iHgfQ1T-Y4nB!ieA6EQ7@C;Hrc7iEE5Jjs&yhjWGyqW27 zitLx!k&AiPQhR4Hfqu^8T9TK3L~cghe)0 zdt5+(*A4!>OpshSrdu|gS*DlP)W^R`{|DBopZUxng^*Rm9e&CuM@L5+Gf2~AMF|*e&RSqB&A-8LvcqSX_FF)(fSZa5l@sVfAiQL1f*=HsFcLLY zjrJdBMd^{o+^B_58;3mq1Ix?fvrJ@0c6Rf(iu0f`v@s=`&&U?BD@^ff(()3D>#3gB zuBa=BVJGS~e)M-jDB$H|_bhjc>A$7Vl-qpgavp-ti}c?!8f5E?qhl(ZNKTwFj-~9A z?^7^|_MDXz@ta&;RJ}4zhYo*a6+{jg%+Js7E2uPzNli^XfBwVJlL)S2pblPERu)7F zHN&eL217@h(j_?t5JeMT9Z$}*35Ynh+S^Cq>jt{Q=Jh}c>r4Xpz8fm490{kV8FooN zn5cE7OR_(lSsiYcZ`TqH3ip}~(gzNJP;UhRD~d-S<+`MN>{ZG{HLb(L!%?{YLt2<0 z*226)$H47GzD?-M;By7$?k*bDN8`-Jud|Di)hz%)L-A@9bn$%=4C35bYh3$CxA=z7Vbs8y zv97lDhlDcLUjMUE;KiBiaEZ=kx$C>vpQ@yRecMDBaR?LR_N0QQbgEH_R<@Ae1*Q~L zxljX`z4=x9f}vaJj4(;I0~^+zg5*XZk|0%Ldae%A06$s2{Z}QJL-nVy_4r z`3CiW>Phq7x=K$za=oNKtHQh*IUor^PlkP?V=K4$-I*A0t^s#Ec)JssJ)jw zcB9L$i3FD5nx2@DQq)plpG(q(SH;T@gGXMmI95z{2Cw7$R@`ERB@ma8FSmJA*$QvP zYMzW)AA&63FNBVy77Exh10#-p-Ib^^j@OEdqxYX^HgOlj%GWe<1;XOI`SKE0ZD9YM zTL*SDb3|VoAdepQ6`$^N23q`jgZuTv#osgihbwf&>q@;BzbL=3spgGIJ3}9$rT5`U zM1q>8-t1;1D&iOd7B$a6D}mzS`Ug12j2&Po$d%&pKGSvOMYAf+n^I|#C?Rc9>NflG zw+PYfY9Q@K$DC!vQWJx@ax@2R|Xz`Di?@C?r3qHu=;1BIdY(ls4){UZVz{NR=%Vqt-n$(Vp zkIp871ME8ki)?w3;7o&sR7c)Kbs?SkU;s1)MG(p#tg{ryqj=HtyT2wYvVA846-8@RV<#{p`6n- z1xDWkX_etc*P2?bq(ZmjpzKRZ{UrK6P~DG!Z`Ihke2)IP0Aw=p0W53+UQ*9h?j6Cc z2y=aL&TE8$e{4KF4SyuP%d&aq!u;4(3x0V@WHgC6I`s!HLEx{HT|4DH=a|9x=r+Q( zcG3rikiUC}jrfj4?wq?@&0THO9Uy(1gxpDOmFC+sLP;D+N+}lkoWGm%B4sU5|L4xf z8inwAN6=*!j_ZDP#0grXbv`8#D^Z8&b-ZGjK&h(~O5)|pPC5`=Vt`k?s%*Ui`EsvY zCdrm$L1hFE_DdzG*<=LP4_x9r+ZkY_nk~CZ&ST8p5)YA`@|f zir_?Xa+DR4_2ZBeq54K^M3VQbFE+0)yU7+~T#MLs=L=bF>)G3id_Q9)%8UZ3EZ=oy zm^6Our7{P!6!uxGgg%eAYROVZf5Y`Th(;k0YZ-I#HnYys*$&TMa&q;=wAmpVn_90$9^&EmL)W3u~SVsGS8g* z)(L79olx>BuNzydH3Wz%sND(%Rj0@W6R)m#K^cpql2AB&kxRkJwV_$k9#{uin;|UV zTz^CC;4jd*AM;OB(YynOoX#Zu2Jfw+KdwRI3PUVI!E9yGlu z;Y?hg3dP7@TPK|C!|2~g|Emw7qj(qYIfQ+M_|WV<%3f2Pzs_>iK~VlEtoO$TZkahB zs(0=zymwsL@l1TCp?!Vfb-^kzY6@jaM^~tH&?4I+Of1}z024X46|{?tgal`OAj2nO z&6=*$f7f}xF*8m*WbOTN)6m-OPxb_Hb&$B(n+auaVy=i;%NkPcLcM`L2 z^nYkwterNL&4(Q!yx^Zr#ZeKO=Aw0n+N{!vD7*N2zr>P!1Kqrov6(wq(Q^!<)j8$2 zDA)TPN(<1pd2>Got<2FA^u8Np-o1gGL>9)CmCq7{0>2{EG?=y3E_MJ~o6!@7r~+k+ z*7(XYSJXGz4^TZa*Q}cYudyeCpHpe6`-t6C>-c(PNW1>=PKOW5$jP0KBbh{kTaG9z zA$;eeiEsmy!7cHh{>GBiCx=%64;*T%`RhYj-Ijs@=E=>^utx$#-^sxiNIfwBbVWW5oHv-~H{r&Vt^gt-m03I7!ap=LyArn<1UikZ}rVc^XyAt5AEx zn>hJKL{^Pg2YE81SH&>-&WXjVyazg zKf{Skj?JsdU3n2*t!aL(z-IH5-Y1vs?^y@hA{r?)xZKx-zvrwa!M{HHKbz)%?n|mV zmX9d>KNR^!*MJfIthjg2TP=fK3;>^)mr>S-SJW)u-d#nBOZCQ3>jVchbq-Y#KyYY2 zH}+Rs-zA4cG{Q|6akNdj-I&#e4tcqYwB(!;A5$v(wAB$p;$Q+7d;ToqF7t) z8vWbHLAXWIY+ZH6y3m>P_IazyGc$e~m-Btqv6U^CH*KQ&=9WEm8F0<#X?U(v!02ChZ?i zz&yn>IOS9VG9^7c`8;sk!g03kp^0ylQ|`*YX(`~JOJ>zq}m&R(mk_TJyOzp9jT zt`4f(wYCEQpnCSqDR%(aq6q+-^prQtN1ppf1OvcNJI|gv?irguJLLA_vbV@`9)3Of z@w1RZ%__~V(*y3mKSS{4!zn1IVlQ5hQ$$L#Jy=*H`ESR>H7wG}Xk5`)95R2g9;6sh@v8x~Ks7 zY(^P(F&K=X#X62GENWW=$(m>j_xjA`056` zoaR6X_#Ujknt!k~TtWbVdV3WG;GDDkC2vkh9}SjCr88MZ1!ta2-rYZ?apV%A4m%1| zoDp>dR}`cMP4)!F8la4>i-H9sZW@55LC}-CG+b~34NcQMc;015~CTCI(KrFAFsldOk)$WBgCZ?X@m?hHpgO;6d)%6B&)>Mb<~RNxnrwF;2# z3W@v5s%X(i+`HPkiX%R6XPSo5OI`icXB8by^QRpRTFhrtHJVlZ?yYod9;6rprdLt=*w~`robQSK z->uJ27q|4qK{sw}I6**qNLc-LN0^G8xe9s|?Cyl}@t|whXAlLX?yOYi4br|=Li&%1 z8$#ZraI!oJC8BA0?6|^Q6NGEojfu}s2(oE}Ac3<+)vMD#=I1cY9SL9lbnjvy^bjx{ z@$LPssahn9?2W*^)hhWXDQ(wgD!WDV-#&DUUKWvGl_{y~4)*m~%5l=XowGK)LR&}+ z$IgZ#9$|PYU462x#^>Qf#;;mP(=8nQF(~C?(d@SrJ~*Lu?CU#DN-}ABtB`1`9j;Fi z49;Y&Dfs_!+SqfvFxT%@86~p}Ljb^wp2~V8mm_;XaG7M=5-pBt?bTyyOLIv5d!E_90-`L`^${%>0l* zS?AzQbx5TG!21@h5;fkIJyrYq^-&4B>qMy>c_k%sNS0`EYNJ9in97ic48+D#5lq%g zUl%#RBwt|b3+d+tZ?(;HUSDzHmHN{#GU{RWs$(DxP14neRo)8j39tVN6kajjp^+?z z#vjxWRt}f|Di$G6)b?3Nu1m!s6;!H49_Z~kb-Sg{+TryJja$?`xv9HNym|{9((lu0 zG#XTr#CL;=$ExYFSuu}hns)7ap4mmu0d1Sxo$omoAXdPo-|y|E{%9ZSnhD1TO6)qO z@;CLJfP@Xk%0#^o2t-gPpiQ-C7`oo$m0zy2(8`D6;>|51#?FY!1>BbObUMCnymoD_ zjzzY!DSEd1Rp~>0C;z~gdSO2txfqiauVc%3coH6VeBGXJ3bi^KbkC<2Z_rI-_6k7+ zJv?oF4^WY&V7wDN_Fz-r&$o|>>Y9v*;%gpR0rY*wQ#u2q9i~KkTn&2^WDG>-QW0;= zsizh`h!!Faw^c;iR8uHIE9TF0zry;*H~8EAwQU|yC!BN7TwT$qI)%zEK@^`S7zGV2 zvXq2{FBxm7)JItSXd|0yn`x^J>HtN}@7&rtw$lABcKsl5@cFH&C$G(^Y3#sJ@oFnG zq*5!FXLZn)QUeRR2VKYF9x$oKVHGEkgJagDL)ml1v)H>&x12kz(tXkw!FKdM|Mp0H z$aMkHEHUM9h>BZNb%}`)9F*2Px8bE=(o9BB0V!K;yL#AH(fj!`>b2 z_P_O1$h76`XLV*}gr|km5m3}|q=@wsz-+zYjH5y4u=)tTb?@G)s$V>K9$EZTn@Q-T zkH|%AK7R>)CuX}^09Cx>5_H91H}PV;9L}J)u|E<74KcssmpD4CdOz`q60Anyh_{+a>tnMBPn<4Zm-hhHhR-ND7Wx zs|&@})IvpF9^ImmrX+1`Z4E-1G~3(nWm&??98Nr*%O|hB?;-@7LCG)vB@ZbYx>Q0n zZT|pnMN)C!q)t)6pV=(Irz5Yv%=I6tNWFLIMVpgJgXiV&;re%kjrArrp?zK=iT_@4 zoTC~dCp&4lwGNUEWL*N=5VKyTO1@Iom$J*T*E)zM=l)8Fg=))&lWxvE;i`fzE5whH zZP)?L)@Poz<^B=UFupY!iY7Nu+<5)O03;NJ&g3$7OivqnDD)|YRiE=N^L<$+-$Vh( z!MJN`YO1ZR?e*1`R|}=^Y6}RY+^@lUT@qT}K#dU$D}k`{G4!<|U!mU%M#c|WISgVf zRE_lR5y5P)`3o9R$J!~}thf_*Z8V4Xd5^i6b&_{LTbO^wBo=z+O{6d95*wR;Hr+$P zC%Qm$>hqJ6d={l#F*G!^Kzv?B^!cQE!vaHF-FE)p$7rz&zed@`FHNjY7a+!F+0_Dd zc?rjAAf7Sef9T2{kuyrn1VemLVfGgy`m9=C zOUpT$)tJyG+eV9ME+efMLBL@!LfYC~G2RwE+8ne#@HVudY4U54L(+bS`<@%SZ1GY# zJ5XdZ$nVsmQ|VXnbeE6y5mnMf!&oDE;rfGRSa~M+N&8GOIIKZkxkuo3Yw=w>4wMGcpw-9U9e)z*UXA*0vl!$VZgZ6KZ5WT6ouZeqftlmQq75^;nA|3NK zB?)CSPc>#8X2nBW(N}NVb!7&1`NaIA;^_`YJef>7KNU#%>braG=)?>&3ph6VGn1y$)jML|Id zKy)fY;_WF&LK{qYrDwvAv|)ZVsJwI@;XaVH1f{ThC6CFc;a>K90I)fJ^*reJ(vwoh z;Fw({;Gn~^U-@5cSn(6`^deC|riOit3tVO|U!C{KcZ0eCi6xzQWxyxoL!M-4B%3M4 z&eSVjwIlcKOG`QYYn`jA?Ud4yzJH z>cmsZ_HDE&^@*#;*!9o*X=&C`)0Fxm!M+`8<-6PX8h8w zMdX>~m(-EaMXf~#gP@T}Xsfx|^a12(RDAWhYJJFNpw0>Y+Bv6>>28k(PeY!2Q%trG zUG=b^&f=1s=DpQofxjVe3lT}kj{ z*3ZO~5%e^tah9R$p?91S@l)Y-o9YoA!2i*q!@r@xs7zu_(sQr*j+voBgjqrQg)k6+x2Ecg$Gyl?H)~iG&Kjq~n*CncuZ^i*CYorwq7P+O=QG zFm`^EJ0X>;B@EJ`Zunh)57N--NjcN%6s`?T2|+)S4FSyJcZt0PwA!e*@Y9*`N;!Pf zv>~*0Q8|5eG_@riR35m_r*}|b2$!(9vOk~vRmiyk&#e{HKOR#3O4n0aWD1IBovo{L z&KhVyEblm*H3=K|TssB}GN+vQu`W)?Q^(IIHL;Dmnv#?t78YtcmZr69tK9VR@^a34 z#^iV5BWLMXO_yVaL`*QtGbtB=7thrR$`lc@Dev7Gus;K1i|mUkXRVwQ^`qpntP;t> zk7`i%$W$bqg-#bTJzeh4`O&aqa>88Pw_CeU!~E#@hT38I>B!A?p_va|c^4urG{H^E zbsnZW5I43Tbn&wq?|+mm5~>3QWEY0qyLUA#wiy+ih?wpvZEtUv%f9<_(3L?roNIzh^1*$SD6^~Kx}=}3|~jk{0qV&G+HZ<%r6mekM7PC1O6gZLU~AUWR_ zuuG%ekn~j3L@V@-1})$E*w?kXcJYysEAMZqbc@7%3P|Ro>gDD2s%ee0vHo59C2inM zL}f7zp>pL^-mpBd`3>R$W6m%rWne1uyo{{uiGV$1V%NHf1SmUJmI9Y8cdug4L(^>1 zC??i?s&M8H81U!BBaSpM3dgtMh`FGR8Z8~Gh-Z=*$wc~HZ!%soIo0yvj(R#CyHdw# zpi-BM-! zw3|_m!pZzr3LKxmV-sL=?rMMN49uFdoyRpaj8BdqbXIXEJjWMf5Ms=yXONwcPq4W7 zg)O2wk{CjU<9+kw2-iuw7M}MeucUy4MrN?)JJg<6F_c(H_gN<0yl^!i3|_FdgL1x+ zGPE}(&X$(0>N^DnzI)fAIcze9(;VOW2W!n*8^`Q}8X) zV+R%GMzhWn*;+ka0>$zGo{h!?NopP)(AwMHeDec3s4=WaPT{k;W@*Ofr8jW->UM56 zZ&*Q6W9_}JI})M)&>zH(M%Z3kMSa{PObhO<3`x~Ku(w6Ehs9)Bgt4tfN&_8N4EQ}% zS2IcnCK;57TYGu}hPU$)?u21$UZ1w;`NEJU81DT&*?Z2G6)@;e z8Zp%dDQiyFcbkYi(0tlW%*2i_(Wlac$D!Zn-TtL~tD*|yNl`iB_`de$_5=MER%~!< z3(0`hiOjGH=qVxiEaWxO9AT0UjfXtpX8)Mr5@gciu02fTt{`9J4J2yX*OrKc5Bj&) z+*QxJAKE5tZFUKx3T?r1;$Inl@4S5M(>^@5_-J9LY;$9DXF=5#z&Z4vv!NTKlu%$A zB!2$H__gud?r)L50Tu1{yyqmA6PL}n0fS9!JI4mn-4@|d%8g40fj-xN{Jd1SuQ9eH zrFB~qHgJIy`Y6P)Q z7=+^>^eP+zathk{3Xd%Lj8V zc91drV)(@P$pep`FjKj~U6j_b9!+og%>mn8mhi`dSW+X*e!3of0$$=zi$tKRr-*eQ5ss+tev-BW1p@&5+pXg`~a6?0=3PM5&8|oifFr9W%EkDi|FO zByNXXiz*DG&6zb$5~&xgUYc?8MWcj-rPVn0Ar?;Ner)(3nf0* zfU;0+?GziKV&A&t1FI~TmRim|?s;BiH%RqFz8Bjjx#;&!+CB~7$z9dxzMW>QOg3py z04lzA5sWY<>26}8DNfBDNY4ik9|1)RGUc`X8? xckX%=<`=!Q(O1IsT&{%bdEAHy4wL_ocg##pO?y+@oxX45ti9{0vJ?I{{{yK{uR8z$ diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-run/sprinter/0000.png deleted file mode 100644 index c9f2633a474de8125088de2a2082241ad358923a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9078 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 diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0000.png deleted file mode 100644 index 7b5bf9fd21570f285eb1b8824b72aacbd290f6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmeHHYc!jA8vm5P-;x$RwQu=aml>eGc#ZI!|a)_`+Rxd^FGh>KF|Mm`DbCh z-S(*Ks{;V`c(}Ws1wdH`0412(F6av_$=s`w|b&(!C? zPck9acoHywxj5RYqE1U8x9n8s@m!n=BNE?83|lT)c;#x856BYs(IV_oHJ{B!rBBDG8*Cd=MSs*9{tpuvFAmTf7xcVVfWrgJR# z+umFN)I%a8=h|s9xms~R!dV8 zlhfIW%60ei_s?KV{_yoPeB8XSdA&pz+yysoVGRup*=49y=fR1IiN?mp0mmdM9vWC^ ziQ7vz%{yXY;Y3{s-WI6@1~UKem|i&g>7*pUTre=OU(Va3xgV<7f}`sKn~8MpU~Ee8R(kD;7kz!n%hUYPmwQ3Z zVHXz{>f)GJ)vKkc{(Ze14u_Z;8VZYmv{b?2@s5@B+1S|JL^593OncA$;TBK7Nd&@!1dXo+VgdF zb=R(4YY2$iWSHg^^+;@E#+Z|@c_FOsNz_-TKw6g;-R+`}5C3ZeTTaUM#fgG~f`Nk$ z3Fd>)R#@u1@bids=gyhs%SG+dx!3iXfx*EkE3-qT{X6IJVXE_jTQz6J;@ArphQG1I zS(pA7&}EC`nc6Fx>yVvfqQp3m_DGL~rPJwb&e>|B9)_FfXvBJ|udk0r+1nR;S8Z%; zbQ^ajErnmXB55S_8lf1auUeIW6rPP88X5`-31NF2(&RI=+5UBbNGq#G2=xKk@-j0J zheK^AE@wWvefxIRnQ~D=EJ)kb)7NjK$w>BhAh$6BY>-IIhO)A<&ntmI2N@q9KOFU- zp+VB$9rL#BoUd=*lj`5`7DZ+#eKNqeCl2gfP=6?3g$2h#^pPxG%d(!W`(O2sJxW^2 z{`}|<34(fDXTrR&-0C1W6((PkOkP#dK_TJ z`dhpNDm62C^}{exuQS@Zp;id6@a*GqWx>;Pd-!sy3xFQ3^n{E0G-7R(@RsIEf-e1XYT@QX0nvL^bXyu zN;r5&m0eRqKK9k>{0k7X*2YZ+Wu$^~kT%|hAHObtyho}9#6fG4&YlwYLvo4My${sQ zkR@fXdDRvEC)fLb`~Ql-_B^g%D%Fgp&KENHhR=V7y&<=+LXb04j!GBLDyZ diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/copy-faults-second/sprinter/0001.png deleted file mode 100644 index 7b5bf9fd21570f285eb1b8824b72aacbd290f6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmeHHYc!jA8vm5P-;x$RwQu=aml>eGc#ZI!|a)_`+Rxd^FGh>KF|Mm`DbCh z-S(*Ks{;V`c(}Ws1wdH`0412(F6av_$=s`w|b&(!C? zPck9acoHywxj5RYqE1U8x9n8s@m!n=BNE?83|lT)c;#x856BYs(IV_oHJ{B!rBBDG8*Cd=MSs*9{tpuvFAmTf7xcVVfWrgJR# z+umFN)I%a8=h|s9xms~R!dV8 zlhfIW%60ei_s?KV{_yoPeB8XSdA&pz+yysoVGRup*=49y=fR1IiN?mp0mmdM9vWC^ ziQ7vz%{yXY;Y3{s-WI6@1~UKem|i&g>7*pUTre=OU(Va3xgV<7f}`sKn~8MpU~Ee8R(kD;7kz!n%hUYPmwQ3Z zVHXz{>f)GJ)vKkc{(Ze14u_Z;8VZYmv{b?2@s5@B+1S|JL^593OncA$;TBK7Nd&@!1dXo+VgdF zb=R(4YY2$iWSHg^^+;@E#+Z|@c_FOsNz_-TKw6g;-R+`}5C3ZeTTaUM#fgG~f`Nk$ z3Fd>)R#@u1@bids=gyhs%SG+dx!3iXfx*EkE3-qT{X6IJVXE_jTQz6J;@ArphQG1I zS(pA7&}EC`nc6Fx>yVvfqQp3m_DGL~rPJwb&e>|B9)_FfXvBJ|udk0r+1nR;S8Z%; zbQ^ajErnmXB55S_8lf1auUeIW6rPP88X5`-31NF2(&RI=+5UBbNGq#G2=xKk@-j0J zheK^AE@wWvefxIRnQ~D=EJ)kb)7NjK$w>BhAh$6BY>-IIhO)A<&ntmI2N@q9KOFU- zp+VB$9rL#BoUd=*lj`5`7DZ+#eKNqeCl2gfP=6?3g$2h#^pPxG%d(!W`(O2sJxW^2 z{`}|<34(fDXTrR&-0C1W6((PkOkP#dK_TJ z`dhpNDm62C^}{exuQS@Zp;id6@a*GqWx>;Pd-!sy3xFQ3^n{E0G-7R(@RsIEf-e1XYT@QX0nvL^bXyu zN;r5&m0eRqKK9k>{0k7X*2YZ+Wu$^~kT%|hAHObtyho}9#6fG4&YlwYLvo4My${sQ zkR@fXdDRvEC)fLb`~Ql-_B^g%D%Fgp&KENHhR=V7y&<=+LXb04j!GBLDyZ diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults-visible/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/copy-faults-visible/sprinter/0000.png deleted file mode 100644 index 32dcd7cb4feb74adb3ca9db64a5c1c84327c91b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5298 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 b@`G{$vaqmVrgpllx^&vf?bp&10ZIP?xb#th diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults/fault-matrix-all-pass.png b/applications/Volkov/artifacts/mame-p5/copy-faults/fault-matrix-all-pass.png deleted file mode 100644 index 3ce4a0ea844fa2a97cf32d1ab51ba685e1b1e41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5851 zcmeHL=U-DdDJlmTfO%UI|F(n53SHPS;!0t17J7;q>;sG>ro z2Bm}=Kp_l8B9H24`x$_U)Z}-DFXaCM#XPv#*UeA7>wNq`aZ_4gh z+z$YN?Co3E?EqkpJOD_j{6kXwrrawc5CG(VzJ2|Q1GMn#w9V^6rwL$9{io};c8zv2 zt};PqL)EX|>Zx`3-POR!{O9{}-4FJ<`TX(YMK{+oy~O5Q%`KUr-13nFljTi0&-E`Q z?LTuQ=h@7=l#@qtFHRxhENaC)9aentRvaB|tQ)(^dU#;5_%e%QvS_&!mj^EB7LNe{ znxrO+rksQA1D5VGfH`YHZ9 z1-!PRvI(>fwj(xk>rgU|`O=drN1jeeK=siWJ~1StcLk z?d`3{pJpL(u<5C(YLAlm)s_|R#`2hq`Z2)E>5S z`7T9<%;XS3olor~fM>mvlam-TZp8?1o4$)A|A@jT7$Jqcfc5qHLGqkJC$Be1xG`qq z#2D$+k@_nv;#-}b$Y2Kq0JQQHNnpuR=C2M5e`h(OR=s7>PLpodwMWSz-0xx^ce77a{_A5^vMA7I3!hA>dF>)l>W2Mom1oOyDQnVR$~EaX*VG3_3M7ruik zH98%A7!)bu`dfe>X|P}qfVw1C>{?*$CPgFR*HfSZtnNh6xvgVZ%Z1Rw)I|o&Jmowm z9i#-;=N*_;%Xob$ zzT5$D4tHl!DJn&-XhF@X21(taPmtiTIoZ+aVxmIicJ!}@7d4BnVKn^@$^wpVAFJoK z^PmV5x}tVgLpZ{lmTIPQ0%TS~&`IJGUiC*_3|0H{q{(qsRrU{_nt--l13D@59Rg|~K`}|xl=B|*Z+hTWT6*}`G=VeIH!DoarG!(BNSaBy$ z$NQ98C!M01O*5~}(14f}-dn{Q6n{oqY)g6_n+hwfb!)Nf2nz{$f;`n|+n0VC38o43w~s66iBpelOVu~W0ry3c$pw%D8Hlyt34`6Y__;{Lqk)eEI?CTmww#; zfo3nX!0t!=7W~n6?tRxj-6@E-1W^6xj!d*TSaD{cW^|LXGe^WeZ~>T^nC z57)rVgYH^aVfc&fHRN`(Ca*n{DKYLBHr31)FtL!ZFj_1fLC)yQP*(on*%lM3XBfRg z3b?=Yv2;bz5VoN7Xe0PUPn7EBTR z0ve7O(&5~eSZhKArqxEJ>cxPrSU9xC8c+Atuo;j}MXLX7w!BR>@ymI88zxdsr-|_0 zf^PIr_#8KS>xBB2OxKyfQdmH{lm%nd(uAI`*PMvyKi=2RGAO~_6tcfkrFE-yBP-E7 z_h1>bsUdkFPg>LA5Q;ipr^<2ArYm+v4gO@7iH1BGV+;^O?&b4PklwzNAuZg!v$0@M zb}HZHs{+teLI@7Y4}LpFrj1{U>fl*$*p}tL{F!&pVnlsGuW{bLoX)5oJ^?(twX9>| z@f+Iq3Qfg*ohG}=@IrXYmQ5xJjEmm$=6arA@}~08cK$k^*aY~Mc0B$-V%gf#%M7#i zKhJK_;#obyrOwO6aqa8fhmiMW%)Kk5G>_=cJ(YMyDuCd{`0Qs=vDlg#6wwn8zs%v$ zMVq)4c8O>MBhJT9`I5QAb>*V4wOfA3iKrjn($nRm50Xw^;P?@jTwvfM?u%&Pw#w>a-rBnU@g8eF<6KRqWYB=;=zLu^BSJ$Z-5-%*{gYHS(Ql* zB9-iS#R&yo_}~gQ(jqR4sdlivVIEDIXf{kBb>BREG>h&Oye7N@e4O|yzcP@cL1v1# zmZd&1hQ5ryX>4pfdo$gE0mg-ehJ|@_z@mk0sz-dNcq)g?crz^IR$B|D!xrV_9q5)X z-tu$M0riTpHIX0L@LAFGOWQnwK*c3g9dfu-AEIL&eA|8Nu2G5ggv62`>FR02`!hm5 zhwOzwAoM^%rAlIu8i+yqo3zqvf`XPuwZ|c4GZPVSNg*zN^9%pIvPhf$PC*^-Y2oCA z`P4f0me7t4$BUF|x_S&B(P3`g0!yJ~5gIppHWcy7-jp9%kauWUHqoUuoIzk>JMk?o zadgDiU62w83D-;bI@vffL#nWU*cbSt)(9{hjLz9=MQJp{B}&$g)UAboJ$IZg!H7`ARF+D?&I; zF$^~iFY2JGF+()pHWu5_=9=HUg9&{qfKQ3?l@AFT|7>dhx%z67U;!yr#P4B~tmHlvNAdr671_m|Drx{v6tKB^E?q&kF2Ns0qvo>@D2QNyVu zv|+bBy8X&yxG7r2U2Ad(@5-TUC#oQWPoO*W@Z{yEoW@21`$}#ryHaLWjYHY9NpoTddn|+Rnru=F8MV;_o9M@Kxds=6pkDK|tP&@)VJMAov>Ulyqy~gQP+Ok&Gxpg? zarnL+;NRgpMYX~S!tHc05%iB@8&{h<`9yz-#G)5$5i^P|&9EG;QBuQARSc)1EgP&6 zx2ff?w)j)XnnNqT*_A6%2Z6f%idx(&<3>FhQD3c-43o>N5CRyC>S8l(DA%Vh#oBOm z^Y`m4Q%?2`H{}~i0B>72uK`{ERXfDK75yKoaAyH$b*?AnNd`EfUM^!XkgJ$Z{&YmF z9|)^z0jcI&Fw8dc%pFr?2BalZs;B0257?b~fD&7&Hhu@gIYFzq6cN!0be&d&OpG?` z$r1bFq#Fy`?4Q}?9zKU+=v^G7x;!3hET*7`_)(|T>;d4bXY^i~%n?_P^~Nbw+{wi@ z+Exuai{a9!!cG#j)f<(#kPme|=B+&hnJB`St|<>xCwvn_Xd-;!rSi_wSF{asJuAa> zbNty+T(u&$Kd|=mT*s&U*nF7L`45<|8a0<2s@4&z>0@mvt(q-IfF@kR?lxVS*Co9V z;=ZRQ4YWN$q&0^#n4Y_WG%Y-IV`(I4A%PYl67qv027}!XmJRB}_4-|n9wmx zjo)-gZd+|-qWz02_I+cD=~%kEEM7pyUVMdgu2#}i0jg%ES|Y_8|4xsZ*`-$CqI;`@ z{%!Ky()8bIk)=K{xjA9C=n1=WHYV&ABBE9?VcEh{z$w{vYjjcO|9MlsAvx|pQkK}a zQK8@gU#`)#s=O;XvwL^ij{JSc`hdpEw9k|pa6v(V6V~H&$M#et@$NVBQQF~sqKlef zJG?%SXh@eRoYzXIAbev3V;VcXvZyuY>*TLL)%~N)b5^hEI(t?CEiNavg=qFVQtLyu zrM&Ll@H9j)!E}MRw(*d?=+W-np=1V!Zmg!rC{$7xOA?S9-ulj9aMeDRcsX{(e>q4K zc&xayVANXoHjntPjZzMsD*uMxwDlJI`U{v4)-VdMNPI4Jp;!I<2S{C%BYNkj2LmNG zZgvr!-2&@H7bD!vDRIpML2?SnOk+BKSXu0uJoB;i8X5HR=58f)ei>6zi!_0*%`ElB zc5Y9LE5lB4>GLnZ2M>;ZwEd7GH0^JJE!xM!z zwl<>a8na!VCNOTTh1S7}eP6cW~x_%L?SCYcw)r0DeetXszocME77wi1JjGM4mWZ!MDk-3HV7vQ4e@$liZBAH$@qvsIf+iqj8(Bl>x`=j2aikTt6{& zu%5@r_38V(JydXx(Q}C*Xj|2I^cT8?E%SZ-N5!S1BDRAdddaQuGV{1Ra*f3CbA2kv z7l3QF2THD$x2LvW+36okQy|epYdYCe>x^3Np01UE_RaDZ$E>Y@U>cgF+g_i%4C|9- z>XtQ8=#8&60bdiFYszQGfzFO8btPUfO~sZ~GD%RYX>*~ix9)PDd!w)eC( zdWbFrt6RSFjvV|1giX{Y-KYt+qek_?qedjLpq`#%Nlzg_7v>hK9`}$&`iU=9%$szWk^@ zvc=W)*#?hJ&}Wm&8TspQow%%mP*b91kvR3hdHwi(E$=hvK^H2RNC_|FuC5z_=d)vMMlKa@S$_i1luKHq7`~#-g{`a)T{USM=|4 zX1Of}V6>>Js_o^VXHZ<~+3Y0$1x!CUK^_?2rwIQ2FJ{3lXdbg?-Euwo2kiBg7y3{3 z5Y%iZuc|^2!R&G%(RTzIiQCjD+cu+1Kfx)K^%FeKq08O`f44~vtgq3$BaWRk;2czA z^t|o_F4<9(*EKIC5clAoMHS$=k*ikUo zT(M;3sG5si9YQSh63Lmn=IWx#@}rm2EoZmGS7!b&!-uoL-P%Idv~ad z63$1u>5XsKVEbCy;8lYjq&FeVc3g6{DAAVy)U_)@u&Ld34EjAMS9*oA`M&lLZ)bTD0yyRe+!9yeF>5n-FgF?*%!_^&vyZJ`RR_7TF zN_XBy{4HAl-~2y_fER36ngz8Bxy@^t5W823`o%fQ9^w}jdoRKlu)1RPi;DI|9YX_^ zAAZ&L*3;K9@Kz5vgBcK8Uiiy0E;7nD6tMM;@{Nd8u?>liyr6PB=3bbJ)xBU9`}+}r dVd4&PLq}U%o0|5);@bpn|6+Z;_NrIX{{V$ooSOgu diff --git a/applications/Volkov/artifacts/mame-p5/copy-faults/return-to-dss.png b/applications/Volkov/artifacts/mame-p5/copy-faults/return-to-dss.png deleted file mode 100644 index 79378f8d9bc1bc84114cd0d007b8343883bf6465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5921 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 B?4AGs diff --git a/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0001.png deleted file mode 100644 index 69e036326c499287067707377b31d54542589347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7916 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 diff --git a/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0002.png deleted file mode 100644 index d3204d8fddea43af85643db54c51632befef0c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7871 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 N@g)nxY6G`Be+6e-`$_-+ diff --git a/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0003.png deleted file mode 100644 index 7d82a6754141ae94745cdb841612ef3e9deb02f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 diff --git a/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/enospc-precommit/sprinter/0004.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ}-`9_`uk+`e>pDO7A6VDB)_R`x+|Rx4^}Op% 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 B?4AGs diff --git a/applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0001.png deleted file mode 100644 index 2b27e3e4d31bda6de271c9b8fbb082039789b670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7916 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 b3*=vp8yOkVG6$U2O?I$zv8}VYbo<`{UP_+( diff --git a/applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/enospc-run/sprinter/0002.png deleted file mode 100644 index e8a93442552726dd09f024ae0384303578363e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7877 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 CdQFwlDN>~GOi>ll%kZRgoviHC`% z?;+jI#eUls^(_ht3fmmc+IlD`Y}los@Xg*$-^ypoFF`{T6tvtOY)^T`7jcXID>Z#q z)8ax-r#e1q!r!^LwJ8fYG z+62CRtQ?b?tUK_Hs;%~+qc1W8;&rC38@4ve>cOt8{{EI3f8z#W>q25lTH3%|BQ2nT z3J*F!f~k!4Y?K@Fd0d*ATLlOw;xHpD!FVKwmAgJ$16x~JjAI~#FYjyxNf%LApq@+7 z!!I(8n=7B*MCbC zwc;ahhH^HU5YKvw@RnfNCyLO0c}M2!l`#cl1#z^3Y+r+;8kV;U~mh&yf7eX zv2$@|t9;ib1$~>^nwoQakV`q3ow(}i>Q2rw83bu9u}XmER;??(P^wW%rO`5JjI|ll zP7Z}a!7tKCQvQs65V_=N03`nX9ryC}%eZt$KGL+{!SJ;PjHKqS<1hoHX$_Aad)CzC zZIaBgWawvO;Imaz@gmo9`TBnu{huNm*QY)~?z*i%-+o`Z{`fq;ds;Hx4RAd9C>U(zhmCD5?gD6A1z|hpCY4QnL%Jv&w1v(e04VAttnR^nq@*a1>&LOKd%29Oi zm_rFkIak}O+1=uSM_#%0v6&h0fEzR1KO)sJdYGllejFjxCn1;SXBN`R6{i`h;Z0u2 zKYB&viAfi)c-f_E_Y&SF@2@Dvpx`PNkX``Q}9?4N(P@5)P z+{1!lpv!+Tx*wRUslugHP#zY*2F~0hBSTl~v(s0$#?~X7E2K0RG@$?!(V#U@XiUBc z{GoKeO?dP3qtabZXk&%A8{D`%Vywik7WC=d4Rd`C5KTcF5P#G=5Wcy5JhI{t%^@O{ zBGZ1t8gsgx2y8n*QFCT49~O4MIHm2b9W$+E3jB5G$7a$U3UWlfwux??&M?M;xRueE z!Br``9f%Q|#Ek{N?)sg=GIeD?ABmr&9#hQQq^eYfr>MF~^o@nS-m+3pk$!{pbq&%^ z)N|g#PPY1ZGxnfoGI;f%MD=>m!0+hD6BztsYaK69vU|4MZbwXxi7;ffyMlL=T+A7Z zRyibds!E^t@kAtBqUS-s+E&J&#oC$F@O+>FbHq`DncP@=E-Wk*>6}?k z%4;Mi0Vz7qu$s!;k2*H0t!qntot)8XpSXode~mQ`M0O}3FE1~XmZRso3&$d37>%Jc z_HacXgfvg&7zDIFgRuq)jO4^YV}MdAUQ>E${P>e8ly=C4X|_5Uyn5x4ooLGgQ~QRV zEXfXRm}bz=`93Z~wTMdJZEnhJWjZDMZfx|9QUkwdZmo6l2+MHM8JU`zdinC@`&Vh1 z%urfgZC%~2AFI~*I0QEoDd9knt9=luWC4i@#D(8-8{3Y25-vC*G(@%?_mYGY+xV@u z6~S{geiMTFDA%Va%|m5iSL>+*Va@Jc#VFpFdlTJt6AKqWu$gmFzv1yF;g~a(i3@E) ziI72B9<c_^Ezv-5*aZY&*S^nHEJ%9oRVp{(+NL#hq$@Mj__ z4;9%Sv?a-*n>c#U+S5`V1#Dp|rQb`wl0|vT5bjHO_#(JrZF36f5%R~zf7Dpb-_$72 zZsG-!Y^E@>4(}=}WESAm=uzF8#t#d8%P889%+uZOCO2x80$1LpFuPHZ_N0W%mrLpG zO-<#iqBKDAg(S(S55(WkuV`T7Hf{8-FQ&>BpO7FwaNpE3`7{V7X-TFE{4em2M*2v{ zLUF1%%eeWZX|&G_P*^VyM|Wp*ZT5*q?NblMuTIM$Trtsc%r0*C`Nl{d)!{Gqt&@w6Cl##SN zWDh82)^yu_wSuF(W$CLz^yf5lH`qmc=Of6MDE^1r;Hgtc<091O`1!Ap_$RD<#@*j; z?w>&Rk68IXCXgeLk2OSuz&~{wCc6*ImNBxm^>VIdp*^u-x*8&x-JoP;l+&~OAN@M} z7zHG9o5nLz_WhMLf`#N@gGQ`V#`H~Otl|Sh5rK_nzohNDs6(XP&sP3V~wMu zqnT=kE+B+-mGwD0xGuYT=LTp?JNiGr)GZVxNDNmhEV zR$bSYZ630)5&4;Urn?zWPRsVlwAjukpdOI`~whbb?=uPkY;bv-t)l45mxk0oAO zIrdQ2bn<1*&sqaU8{Z0XH%WLDS<+&?&*tB*u3ge{VD~(Xz?n20>8dOjr!(tgvI{T^8MELA=m|1qB$vAyi+Nv|#aY7N6O*owApW;$_O;{e*^t?l;LF zY2RyWPo3OZ)UfYYcFv09D)@9`Wb%kb+G@Xj!L=(__@%QuT$D;;C|%3tX^x}`Z`~#f zf(iRnt^~%)KQHVcny}7iFI*|wX4l3$z3t^1*-X2c78EL@FN&Q(sLk;ejYQu(8wuBq zyC;K{*tR@3lVg?_2p=Z&npbr9SVVI44;2dz*4RD*bkBXsW32l6Rn!)GKtIkJmpM%pAq|jA7xKJao9-qp2** zoQOP&!{WGy716sS!~-WTcDwQxtg@ksJkI&-at(<3zBqu2c-ZXlK>sjvgj~(QzIDeq zz<*-LRy918oeQBOKiP)H^hKicUjDS!!KP1|VX0mDgB6RdwP1XGjNXn7R7UwYm^=>8 z=o<75y=TiDYdC4V=q|G99TRj|@oC|qijo!I>YuxI-vs&=>LctLCVh>n?(@-(kE4qc zGx8~BX||_!z#hz2u0{h*=0Wj~8i{-+59`JTd9|2q3%Sxz;!2&-CF-kHo6jd~k=z>p zkv`xGQDX0MmPIVrAV}?^@3Ii7mb`7md)1Jld&$;gjc?av!pZUve`5%tr?R1{~qXX3|>?Rx51f^YDlYTul}OXXJo748=dH@N?hB)*J(Q1B_C!_}ErP-8B$( zdr1Szf=C~XOu{Fro+h!>BhD68(D5By-yGMZ+>*aikMBwA)kJzcUeuY+r7WK-vN(2n z`W?j{?I|}S1wUVbH&A%(Nm_WmyLPlz!}R3IfNiy0zA`ZjmrqJgl0=a`gDnpF5Z%X$ zdeyMXP_@DfUh)nYl0zwD_P#tkp#nRLsbpF8Rd^fNf>vr!;5@1*gxda182G?DO~jAG zS@IZB9$2&l4tYLk%m^l4!wMYqZ=WqJ2S6GosRYsfJQ|i=QxwEpNx7F3;I*2W4rHGh zNHWpUoACu4J=UJQgCgNnRQFref2di+o|;{z8E&~`>4^-!WgHl#uWNAsR2Sgp*t=YF zKPA5q1tZVDh^}g!xrUH{9-xL}SG=eFQoxXGsML2Wrnr~|k@eo~b2r!*rF@{v;T|2< z#_svfDgBY3>pV^u@4&)e+8TFtFMHM-Ap~^ z*M`NI3s0l#fKHXU$E!(!029uvd4gnbdITF$my}z1l`ya%K#S_}tB3>U?=GslM^xeQ zUBKS`ag|r8Qi6f~MH|UuTjnh>#w-N0>}b75?{&g5pXP8S#P@b0(Z7SOJp1@WHY5C7 zwr@4pJIAm#vKG0TI8Vigw88~+cQ5H^~AW#Rqwo_Kn zbmj~0&Be1$!E{;I(HmAF%@u*(69NziewM(S!@L1Vq)tqh7Ars(y&1oKRNgQBO_U$R z)r)^bw(|qkp^APWjcI?t0X;~@X$!;YYy`O z6>fvIuR3*V?HWLuf}{0HzNgXd)cTm1-qi}d4X0j1I?z&ijuu4t1Wc*)6E}1ELb$Kv zg#zEq%Fn@5Jissf)=SIZR17FB`%@9qsYE>zty-#d7bZD9)C zqdj$Z{ol*~m2t~g3UKbZ;OKk&T$Nm*Rk7`NobC1+85}n=-Fxtg z(N&WZ$4#&52WwaK%2yuwyfOh6eLY;k?RxZeC~U7=SPbmQUWeGr5qq64hwk;f2@Q#m b3*=vp8yOkVG6$U2O?I$zv8}VYbo<`{UP_+( diff --git a/applications/Volkov/artifacts/mame-p5/enospc/enospc-cleanup.png b/applications/Volkov/artifacts/mame-p5/enospc/enospc-cleanup.png deleted file mode 100644 index e8a93442552726dd09f024ae0384303578363e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7877 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 F{{@9==cNDu diff --git a/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0002.png deleted file mode 100644 index b87e1613e457dac6c6c099b738a5172563c92a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8216 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 F{{@9==cNDu diff --git a/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0003.png deleted file mode 100644 index b0ceb449ae61fe53291e3f06c0ead34255276d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8162 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 diff --git a/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0005.png deleted file mode 100644 index ae5839728f6636ecf040d9e2b1c8d879f446a61b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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�m_V1j38a#rK4P;F?YQi74l?@6b6Py`v=d2hIk-5l}crQkmgiG25uJ?>n%3!{Jepjx}z$B>MN14vBeya0Z{-tc?vzG&;wchpWl2xL;`nlG|=%AkH z+zjr*jy&D5W3)P*&nBs&70_z3eP2@XzGf#A+{HS{+r{ZIWfrdFNTmDItjZQB&lHhI zk|uIPkYvAszWCcy`5u{BV`U-(B{jiUCp`+n`#ADxoUwfdEpHueV`7LA9|M{i zyP@-zl^jb>Vlnfj{Hfw^dK>>iekp%G$g_g??(OI4P2Mnt-lCJ}rpT=`0g6B?1N`Oc zW^|AHl_eMU#r0i+nW1-Ge$>a_)_kFTrn*JxLBN+fhiAwe8E8y9lQbWrUn7-YGH%%- zJ>!v*S(0z>eaq5ul$02loZaWyO{M4Q(+8irPVDA?tnubPtKEl{xN!t*G3V@HVRpYg zI(OJwqER~E9oEPieyMcNSr95i`E7@uXR*3|t(iqJY{=71`BK0N7c$c0}9y5r~{kdnT6wSqb z-ur%Cig)Tc6}y~3e{XG)=QFdMY?~$1*e!s7v%*ddYUAgHR1ehZ|d#p}Dg{bfRxrHb^2+Mq@q*Hbgl+1f1FR zo6n8D&XXjp`ohA*eiS=(d%jy{OyF){33XO7@zS3TDlAp3W{neKK0YYHGAR?2IErnJ zLT+nV&)3tflE=BO5+_1%2vx5s)^z90S!8N`^84KvUxIrqFgu_I#iaJve(%&v;6 zoVcK#QDxyk3+c)cfGZfI8*SJ528r#RA0GO~zxREI1vi({1+MVQwhL1VOzQYq0uUP! zdAFV6EmZ_t)vCJlVE0@haNV}%+&+f>fH7`idK!PhL9(b#R1$Z=8}1;`@+y)aK4;+d z93M1xKjnje!Vo<*)Zy~F?m1!2^e2gCiWgOSNSZX^hzpl_6T!I(l_Cmhd?iFRPi#OQ zrV#`_-oOD{J;!Wmh7G7*t&b0dH*yJEpBQz~Q|LE*cK#L>ze=CpkFM3>2q()G>$}nN z$P-JF-ZX1Og+YhsVHLzwouNc$kI8&0d2u-SWq7W_77FC0LF2h}$IDNrs<|eVSXgI8 zeYq}^kKFuVLAM#J9>L_u-gr1CtTsf2dIm7vxlAFQ` zF{`ea2s`{4P;clb6OKCciy!Q5NmLEv%(tWA##ngGLo`SJWaR@*n@o;f!+}?7TgO;i zK3vQQ#4_OHhcveyUCimDjyVhW>_K^-Wq`dBf1?*3xG_F`L?KW|I<<^-vuFNz}n^7V-0u~0)hQ4WdQ$mAikpqvU&>mvm z{LOelfT9h?VP=ckA+ChEg%DB9@p4yS) zCb5^l#i?13_piLu-vM$v>@;rfuMc{->z5ZM{(2+j-(Ix%U;cUDkpnTl*R*(iOGGlT zGfM{>+6P<1uLp;@2D*bTp1Wvx@Pw+G=9z=?S5LU9Yp9)ZQ}8^L-wc#g{$4U7DA?T( zWa%F49vF1c(l;bX`JhRttN+1^u098?Zv=Yz0}p@;wG$^!P!c|y0rfy8hUNw(dM+{l E1?gv?`v3p{ diff --git a/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0006.png b/applications/Volkov/artifacts/mame-p5/media-change-copy/sprinter/0006.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 z zMNgdlpPPUsy=Qsb75~shU)$=RfiK(PpO9>wn*J2SpJLc{xj)75rx^Ye!@u*yCsfs} z+UgA>Fb3*I$T`Ws5a_2o`pF}ARd4XZmosT#6U_EyPjsNDggb2BRPhFHReo4cZwXvb z_~nA8D|+d{+z^=?5>2+b(galY@UJ*XHb&32F6MBJj=JOjL12cE zY|MR+9bPI74HwpXtT#u>Wu=w544rnIL7^cNt-uEIRx>10Ru<`)o8B9@yg&O!t+;xYkD)cs4Y_ z0-vG~*k4=_t}%x?U-x0f1DKLM=lH8xHD#dX&^#!l9b6HxmoZiq;2wo+?CWyflT~Bw zGS7Y1F*m?|o|mn$^bEqd4;oT&BOxMbfCnGLv=!!zj6p1HH$40Jk6k65$%CPf`OcyI z%EP!M;*VY5wv9|ss(cD#efk54t_#V7lkl_>LG>ilPOF3wSskZb^-KM3e(AN0TG_3O zC3_$USrIVgM(nQ2k2=q>4Khd~@vi82gqU(eV-1;b(|({#Mti9In}AJE*2x`9^$A8S z_wuO&ac}j|rerv}(v_;|;QvnVNeszKu+QN|MwhF<^ZiU4#HkV3ovWMY%Xk+HnqnF| zv0Nd)!B(#nHaA%8yF_4%s;R(BF2EUX@@`8zC6X2%UhjvGN=J2 z7B#fe%X)nRR76?j93kQf=b3uUyaDfAi5*wg=gXDTwcrZAy|aK|Kl9M;06m9G(+(m{ zRv$k;See&2=|D0@wVb4zpJCYz0VUN8Yxh3;l-(EyI)&N~RYN@KsNrJz=S(XM$lqf_ z7ow47NNv~dp%Bp~>yoZL&6ci8I);Hd)wt1~v0Ru#Zi-5Z4mV9JRf} z7fFSK0gQ($wwx`V2uPdxL291Rg7CJgV(BHttM~s3fgZ zxR)M0MvbbTSBYb2f)fS%=zApk^SW0xw-knXyh=#YnoN6rKz%@~nB7L&?0tbj@bR7q zEVt#j+NHT6fZ*-G~|5SwsAqn0L$do%7 z=V?TLHo_?jvBi0VrG8BgZG&t9J8cHG*)aKTE}^pR#Bt zLM;VwanZx0SwB%{+W35RhtbR^3Kg*@Sdg~U44>(GEp?Wa8lkl-S3hGZ;&bQQrZ;V; z5*MD{eSUisuahDt<+vDFE0hp0*LgpF=Lr^N(iiF#?pG8eSg@iEptkipn zCcXByQ#aG#`}J4brsGfDsP7+~g>_7uxMHEAQCy=UHVF)Ey*b5FXe6MEuX>1nk<4u! z1>_jO1S2``ILj{ptUSo@@~dc@fklT>6MKdv?jdC!$E!$a-4hHz2k_3#!NJhn7v7Sw z5hvY5*O#c|mmx9F6=dq1QHx%;6@c&gLlfO2ZYx(PI|b=V;on{BzYZbr>(hLq;xgl3 z-HZN6wzltbR@J4TqiF*!5$P`5BfAeU3lE}=ifRJ2s1$btvcBXP-rNG?ln0N45? zDa&!HC0lLD$Eg$!)BX{oX5 zs|_E-l#%`(J#P4^7v_Ts1|I=m07IHEXpU-lxlv5H=>|TzeXaAj#&{XK%`0arM8Ikf zZM$hjKbJ8+4%YQ_K`kaMBArcwSgyRkn^D!h&}FP0JzPQ>Pv4+p!qcwF#|d=^eJUSR z8e}+bHpCx~z#U;i9l_&AbwU9i5t82Hg$-sLun4h(WKL3+s$HuqCo(nxc;$#I?t1ef zVdfBW@QN2o@VvKI4pdlG{c=FXFa0Xgw8|$?q4ud(@uwixm?jG(yYuWDYA2daQe_G# zi*21cxjeNhup{ewHw=P{7?#EPw+ym?i7K^xH!#WpOtL?Py*zUw78@2V4v2r8K6&!wc=~|-R>^kOj#f36m;e4B#T%1y diff --git a/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0001.png deleted file mode 100644 index ad59aaa33a78d0e15b883977e409a7439dcac323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7800 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 diff --git a/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0002.png deleted file mode 100644 index ad59aaa33a78d0e15b883977e409a7439dcac323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7800 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 diff --git a/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0003.png deleted file mode 100644 index ad59aaa33a78d0e15b883977e409a7439dcac323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7800 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 diff --git a/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0004.png deleted file mode 100644 index 8aac37c1ad01a6904405deb4ac189f7b27c1be7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8766 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 XKXvNV2!deFkpq|-Tb-{obdUcx=Hi42 diff --git a/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/media-change-run/sprinter/0005.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ9B%D%j(nYX0U((nSKX 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�m_V1j38a#rK4P;F?YQi74l?@6b6Py`v=d2hIk-5l}crQkmgiG25uJ?>n%3!{Jepjx}z$B>MN14vBeya0Z{-tc?vzG&;wchpWl2xL;`nlG|=%AkH z+zjr*jy&D5W3)P*&nBs&70_z3eP2@XzGf#A+{HS{+r{ZIWfrdFNTmDItjZQB&lHhI zk|uIPkYvAszWCcy`5u{BV`U-(B{jiUCp`+n`#ADxoUwfdEpHueV`7LA9|M{i zyP@-zl^jb>Vlnfj{Hfw^dK>>iekp%G$g_g??(OI4P2Mnt-lCJ}rpT=`0g6B?1N`Oc zW^|AHl_eMU#r0i+nW1-Ge$>a_)_kFTrn*JxLBN+fhiAwe8E8y9lQbWrUn7-YGH%%- zJ>!v*S(0z>eaq5ul$02loZaWyO{M4Q(+8irPVDA?tnubPtKEl{xN!t*G3V@HVRpYg zI(OJwqER~E9oEPieyMcNSr95i`E7@uXR*3|t(iqJY{=71`BK0N7c$c0}9y5r~{kdnT6wSqb z-ur%Cig)Tc6}y~3e{XG)=QFdMY?~$1*e!s7v%*ddYUAgHR1ehZ|d#p}Dg{bfRxrHb^2+Mq@q*Hbgl+1f1FR zo6n8D&XXjp`ohA*eiS=(d%jy{OyF){33XO7@zS3TDlAp3W{neKK0YYHGAR?2IErnJ zLT+nV&)3tflE=BO5+_1%2vx5s)^z90S!8N`^84KvUxIrqFgu_I#iaJve(%&v;6 zoVcK#QDxyk3+c)cfGZfI8*SJ528r#RA0GO~zxREI1vi({1+MVQwhL1VOzQYq0uUP! zdAFV6EmZ_t)vCJlVE0@haNV}%+&+f>fH7`idK!PhL9(b#R1$Z=8}1;`@+y)aK4;+d z93M1xKjnje!Vo<*)Zy~F?m1!2^e2gCiWgOSNSZX^hzpl_6T!I(l_Cmhd?iFRPi#OQ zrV#`_-oOD{J;!Wmh7G7*t&b0dH*yJEpBQz~Q|LE*cK#L>ze=CpkFM3>2q()G>$}nN z$P-JF-ZX1Og+YhsVHLzwouNc$kI8&0d2u-SWq7W_77FC0LF2h}$IDNrs<|eVSXgI8 zeYq}^kKFuVLAM#J9>L_u-gr1CtTsf2dIm7vxlAFQ` zF{`ea2s`{4P;clb6OKCciy!Q5NmLEv%(tWA##ngGLo`SJWaR@*n@o;f!+}?7TgO;i zK3vQQ#4_OHhcveyUCimDjyVhW>_K^-Wq`dBf1?*3xG_F`L?KW|I<<^-vuFNz}n^7V-0u~0)hQ4WdQ$mAikpqvU&>mvm z{LOelfT9h?VP=ckA+ChEg%DB9@p4yS) zCb5^l#i?13_piLu-vM$v>@;rfuMc{->z5ZM{(2+j-(Ix%U;cUDkpnTl*R*(iOGGlT zGfM{>+6P<1uLp;@2D*bTp1Wvx@Pw+G=9z=?S5LU9Yp9)ZQ}8^L-wc#g{$4U7DA?T( zWa%F49vF1c(l;bX`JhRttN+1^u098?Zv=Yz0}p@;wG$^!P!c|y0rfy8hUNw(dM+{l E1?gv?`v3p{ diff --git a/applications/Volkov/artifacts/mame-p5/media-change/retry-progress.png b/applications/Volkov/artifacts/mame-p5/media-change/retry-progress.png deleted file mode 100644 index 6221f8f7baac51b18fa9af2f6d61e2a38aea8f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8247 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 diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0000.png deleted file mode 100644 index de70a3fdf771c06426045543fbc59ce1014c0187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13528 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 H&F}m_m}y)z diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0001.png deleted file mode 100644 index 40604964f10db16ac358f0294b1272f8bbb643a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14135 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 N$w(^P$(DHN@qc)vfXM&= diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0002.png deleted file mode 100644 index 647eea1d29691b9e68c52163a709f03a2cf803dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14186 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 T-UwN6-VteWd9h4Uy=VUiJ08yM diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/panel-edges-run/sprinter/0003.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 CdQR&GN#gjHMn*;M`e_F{J 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 T-UwN6-VteWd9h4Uy=VUiJ08yM diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges/count-28-scrolls.png b/applications/Volkov/artifacts/mame-p5/panel-edges/count-28-scrolls.png deleted file mode 100644 index 40604964f10db16ac358f0294b1272f8bbb643a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14135 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 N$w(^P$(DHN@qc)vfXM&= diff --git a/applications/Volkov/artifacts/mame-p5/panel-edges/counts-27-28.png b/applications/Volkov/artifacts/mame-p5/panel-edges/counts-27-28.png deleted file mode 100644 index de70a3fdf771c06426045543fbc59ce1014c0187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13528 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 H&F}m_m}y)z diff --git a/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0000.png b/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0000.png deleted file mode 100644 index 7e36769228c3d8f120b635391ec2d8555c0d8a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8285 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 diff --git a/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0001.png deleted file mode 100644 index 11967ae573415ee5c2486ef15889a22c00737ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11208 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 KEL6Gw^#1{yalU#0 diff --git a/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0002.png deleted file mode 100644 index 89d9f910198186f337b979b622a10617ab9d9e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12719 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 diff --git a/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/stability-pass/sprinter/0004.png deleted file mode 100644 index 28a4dc965df1bf6c0fecccc5449c0fb5b1bc2b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12773 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 CdQCW3$j2t~o63X$HEu_B^Gq>Vs`3@2tQ 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 KEL6Gw^#1{yalU#0 diff --git a/applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0002.png deleted file mode 100644 index 62a4b0071a75ac8dfd4856d0396d808eea356cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12720 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 ja7o_({vKJv+*2un_#~wl>OxDT1 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 b55Nz%Z{50u3hPk^o+DFL)KDmrH~0U4T^8E< diff --git a/applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/stability-precommit/sprinter/0005.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 CdQ#%V4Me&N|NnRPP-h2oC%3B7)(1P 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 Xb#?X8gkJNV*_vLpFs{1d`shCZt7-XU diff --git a/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0001.png deleted file mode 100644 index 11967ae573415ee5c2486ef15889a22c00737ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11208 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 KEL6Gw^#1{yalU#0 diff --git a/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0002.png deleted file mode 100644 index 11b50695e9f3a7f2b42bf877331800851e7e08d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12498 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 K2ccjY{Qm$fF%-T4 diff --git a/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0003.png deleted file mode 100644 index c6a7eb7f3e0371349c52f4a6e48b30ff179e3041..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12569 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 C_-u^; diff --git a/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/stability-run/sprinter/0005.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 Wv9U2Dz0+w`WrtI)wpG^WulyJBlIl?a diff --git a/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0001.png deleted file mode 100644 index e99e281e971c9e231fc37011dd9ece212646806b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15833 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 CPYV?Q diff --git a/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0003.png deleted file mode 100644 index 2140158d248df49fba896adfcde290048983d1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18075 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 afD9u81B2_`XT5>?7(8A5T-G@yGywpxsEStr diff --git a/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0004.png deleted file mode 100644 index f6d1b58afad5a3a8de35a84e16392b4876187995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8475 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 Uy5DWWTL&=KH`goExpect0O{EO7ytkO diff --git a/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/viewer-openfix/sprinter/0005.png deleted file mode 100644 index c6f1929884edf204d6034df85e96f225c31ab445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9424 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 eLZg5Q;LqWM2M>;B^*e63d-{Zn9p2{LmHz^ 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 CPYV?Q diff --git a/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0003.png deleted file mode 100644 index 2140158d248df49fba896adfcde290048983d1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18075 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 afD9u81B2_`XT5>?7(8A5T-G@yGywpxsEStr diff --git a/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0004.png deleted file mode 100644 index 58cda43e61cb8a015365c9a32e951c627fc980b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8475 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 C$Q}#; diff --git a/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0006.png b/applications/Volkov/artifacts/mame-p5/viewer-pass/sprinter/0006.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 a^5^)mW5>o)`aqi|pF87VU2Api&VK=DnIOOb diff --git a/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0001.png deleted file mode 100644 index e99e281e971c9e231fc37011dd9ece212646806b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15833 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 CPYV?Q diff --git a/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0003.png deleted file mode 100644 index 2140158d248df49fba896adfcde290048983d1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18075 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 afD9u81B2_`XT5>?7(8A5T-G@yGywpxsEStr diff --git a/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0004.png deleted file mode 100644 index 0e7c4bb88e8da7aeb80568b331f8aaba7e4ff21a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8464 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 Gm;VFn8vP0Y diff --git a/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0005.png deleted file mode 100644 index ff7e047b8ab1b07d07fc028ceb9fd3332e814624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9414 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 bfd5D1*s)_naov`DIRMD?+?jG?x2XRDka70r diff --git a/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p5/viewer-run/sprinter/0006.png deleted file mode 100644 index 0b317b3ed6c63beda0b1bb7a9a7b2d5a97ce5d62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2875 zcmeHIdpOi-8-811Q!O7+o1FTnb{rQO$C;Lp!NfQ%XdTeQFa3W^k+iu?rtg?yKzKX}L86AYtq`$E*g;x6_5he}SC z$d<}h-K^fFqZ^Ed*_UQ#DJ!v#KGoTxm~c#0QPc3|c&M%J9Al!Z$DEl~U2BUx5d%Mw5!gFBNHDIE+CpL>TGQ4P_YA|l>(OSa_0swmv6fKw56y(2D$*K9%>}b zaoKE6&Tt(8Zl(v4W8nydWQ|8NHZWj)>c{rAxVyWXe+Eduj*X4+s0l`7c{w@zjqx<& zR11nnMtXY6sS6jr&ukNlM5(KbV@-o$qHelF>FeDff9LHx7%wj`dXjW=#i5SLjY8Q)$J)SuWQ(J-m~guCT;;}vZEbCL z3Kc-Nk*iyAaQPliS;IQ4GS~gUjCi^rqaWST*_kR5@_P+kR6%|~p=ZfKYTSM@H)&-U z19Rje)30B5qNLdCL?fi)WgP@j9Cx)qEB7<|UlvYXiW19%WT}_^7Vr+WP4;tCFkPms zYU76XnJugKZVq`pFnC*xKYg?4S}ne<6(5ekRz_k4SV^tn=DzSfYQ40GY{TbY0gn5v zNS@R9#{r+J@AG0*1!W^)HS;qkW4I@u;n!O03f6gMQ&HHcP13-_e&hRzem{S_ zM5DayK69S*W;|w+W+M2Q=z7pXwEN@$*Ee9}KpT5}T)p$eY}vUbxsUi&W^mEFI$s$p zFx1md%j%<24+qKg$+fz>tdbwW*T}}z5|M=(( z_0v4oOiE76Hd61UElS?8D$lNQU&Z+RuFnXHidZvr&Drt7u#ofbD)G~)+d00D;vro$ zFUM9zWPT%2+|Uw}?i(}W z(yCaWabpn{tX2{?Q#PwNSTkka=0)y8PPO#Up`Q_7>Z<1`SH!rx_OSE6)CML$mTV=UsiFPZbT-Fz^tVksr z3oAoWU23Q0LHC_Ap`i}%2M6Pq#+#K2d->(%<4uMP+7YCY?f~EzHkTsZ=9M z!}<5s&CSgW2BQnH@uV$R22{SexUK5xQzeeS(QXYVJ#TA@#{9#F4p)Stukxm* z>}|}=y{+x?I-HPkMB(&XI5)APwic@Qs=d8^@^$v|nwSw#_i}7{8uyM}S-DGAMMdSf ziKV5Vfts_Elk3B>Z2$K)c-q~&XFYrV5H3}a*Chn^)p5_|fM)9YPG>AoV8c&U{i zees;~R)9mkU3fJ+H^+)w3U1}HedEHy47MIbQ+Ehnyf}i((6CYCG&D5$8`X^Q+Kv66 zD{&wOmw8=qI|4{nyXIOvI#e4)4+sbl@cH~z-oTE~iotFV50BJXBC(;aF5%)uX7oDb zjcSjI^?eyEVUHWCb05eL>31tmNlEFRimaVBfzf;T(Xgz&nwsA%aX2Rtv><y5al$C5;a(SyAmFHe-xQr1WfX01oE8rgxSQ|1 z(01a*rdhiTq-2%uaHU$;3M7k!ty-iZ0yjzLkXqVddE}iz&9iS+0Wc3JzGLqaJ@zuC`0~jw zDoIOAdpqd$&?6-_GSbvqygpmzumO!Ys^x`osJk6YBlQXRIzctY!_d&MY6==*ca7Iy z^3&lXtCQJ5_9k%nZVsJJpPrkW3&Wvl2n~%??JU=nQK->P$RlhdlE9hkHuDh9ispN6 zeHy%;-0@AaL;COT!eUaDZC$Rs@25M-v{HK%Hnt zJNiX?;m<@9eu@kMs2@;{+9pP(mT>Ju!6rYOA2x;m{2gxp!*(ds;7ewFRCLIBfC-5X ziHy?5gvCS|XuHJz6t0c>>72G#MC32w5C9!aO-xJ%(mLEebLHabage7Dzp1ZEI diff --git a/applications/Volkov/artifacts/mame-p5/viewer/clean-dss-return.png b/applications/Volkov/artifacts/mame-p5/viewer/clean-dss-return.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 afD9u81B2_`XT5>?7(8A5T-G@yGywpxsEStr diff --git a/applications/Volkov/artifacts/mame-p5/viewer/mdview-raw.png b/applications/Volkov/artifacts/mame-p5/viewer/mdview-raw.png deleted file mode 100644 index b13058faefb49fba631c6043ac1457d2559a2eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18104 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 CPYV?Q diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0000.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0000.png deleted file mode 100644 index c468ad793ce26a3e6c5c2e91ec06f41596f6d967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8658 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

      KFzaU-#*BU2U6N-A=G15#bfEkHR6+7icNoE;| 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0002.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0002.png deleted file mode 100644 index 4d43936f79eb92e7be4522b8ae81a2afcde855d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9170 zcmeHtdpML`+qaTbin|mc*+=%flI`527^6%!iR?;DC{y-{<&__dAa7kMGZWj$^Lln(JEUxz;+@xqiRjTC-BY zmu(ImkUk(FAaDq1Ywai?ASfXquuFd5ZvK->pO63n0VN}#wWV`ZF}1|ITGo}`?eIz= zF{>um{gXRbCIEEUN|6D)P)(n;+Yi9y?>nnJ^*-MAm|R?wbsAvi{5y>68iio^;>jE2 zU6tFH`h|{JE2?YZgyrH6uYMNxhHa&r)5G)|M_*tz`itFy5cqtt6k~S(l3U}*Bs&fg zlGX3OPvOyTR=+Ok^(nkszAczYnT%cW^tau4JQBVzg!JaF<-68Cb23X3|EGAvm0b8~Y_ z8D{#P?K_V5I-|i5JiN{ew)tM}D#{2tIgW+FnpfM%Tg&Dv(Rdmj;CWadf(d_9lbNz)ts|(w{U;nE$nK(9v^nz_I zdb^@zWMpVv2+nuaCmGrvZ^0M~_EKZ^qqOaQ-?|VK6og<6Rn3veJnn`@ts#sXHvJ(r zdS>=xer=ad!s?S@Mz({6+g&_NKl$I0`k$C>-}$e@KFe>1qZIupc_)^35)udgqf8PJ zIGt|fFEYL1K&_eZBDZj_*vBrMNfeyqRNW6Mi=v!OOvjzyEp9d0^0{%+;b$3|UAQ-( zW1bxup%On7JvkKdAc{*#H{wzN=OHZHThC)vT+PETI7y66i9SI)#`+={r1o<-ai9h8 zKH$kH>w0IJkZIY$6{PQ8ciFD)MfR3qkqeaA(@CTThlaiPO7d|h>C=h1kjsDYet(>My5A?lW1yl z9!>+~f^(TVr|VVb0-WND)f_S$wVXLg)$ma-!In{yua%r3>vciQOG0YXP}d24=VG6d zp(^mIT)2BJ$v5f^wlVfXQiEG1)|?_N>7DzHGd!DlGCN|^uV5kVc+x=Z4=bCuih z2%N>GW}L$QUah2!lcoA(!yTM*$jdMP)VaS$qQ-20MSRdV_=-M#L)dWNh~MY0TxT*C zBN&c;{B}=dQE-`M~>TeC)B8O}JWLCkKMpGAtw~GziEBDXAF+!it(lYWFF+4}y%KbVSN-bx&+56~ZH@EYb_>RR zV)WL7+!IZSxT9%}y^Y{LoiwvnwI5X+tC#_8u`e!v#d5(65U0 zHl3?;iZ7?)pn~L~H217=ZKXyx2ti#zZ=Uk7BwV*%|RmzDaxiJRAeQ+~&ohxL}i+ zH}Dpm|pY@`lyfrJeh!f2k9q&^WoNO@*9#YB3UzP9?NLw ztbH8rVzF4g*{ZeaRfvSv81o&B{2=b&j1m?*IZh;++?)EnEM+BrC6>I|Wz@lFMrj$Z z{ZP(5d&qBh)#dQKsX=GqQ2jgb-u6ouUxPD~QkW#UxfS)9_f{@3-;(+D6d6I6$yh9L za|6rs!~_QiUqwL%i;-SBo~=z#az`j-a99jG^USo~3)338GU?5kmIOVEGXYi%SR?vZ zLFa!yKAuy25Dv*;LOq<76t+mJ-A|HV=NT#K!hF{n?P#L~5)uo2xf;WZBO@am>bO-M z3WchxlQoTaN$dz;9APjb{0bIQV5~0)?ngdLl*w()ufTZh@z}Zt<%Bth2b~cOdfer{ zp-<@Z{b^$WyfXPznS1q=t0*n89shCLk{HIbH1@Fp7X&D-$B{^p5p|DphwVA!# zh9Y)Et=^=^tj~XDeJd&|qRGJl+|3y>mx0cgVLNBp6+La*qvnJOU2FU;tg?0DD*#_U zp($>We3L6GM2qx$6m?W-xxu1mcY&%On7tdOco9W3^GBq{r z&X7aNbu@THPDWG48X@^d*FW%`Uu0{)={T_mQK^n@*TiM+&tD^};=hmUgWiDq$(j7& zJ~g6s)GpuIT|ifur+xH+_YSDs6=i8T6DC}K{`TC_+y@S9^UGsguZBBh7Gm}IE=E-O zZPdS3y~ZD9srdZ`y?ZsjX1o@hk6uJT2*G(O9Lq`j<1+o^(!bN`;q6PZNLgUTC8ZFH zZhL-8Y&t`7;G19Kde9on2 z8!(`y>pH%3D^ovYb?_%?*ckq}Hh_O**_rl#Ldc$0xQ=tcJuxEbwJ*ZA=( zx~0PGCoA$p2yQJWR30|q(PhR9>g7*Cw`lgn0euE9v+9lkEG3cI_S&bkFWZ@DxK20P zG<1o+)p?{i=jRQY{h-#&EcE*@`7+!vNf+iSz9_NqEk!P2zBFaIgS~u_%^{!2Fm5LZ z12%Dotqe4fO#(imTu(It>@_qPh2^r4PF3~Z*p4@Eu0pYK%#i+X+jL(0emmLfQK$^@ zKP~xrY>CZubT3c&Iwn?~gdQrP0;=Cdtr91%p0w`11KLu<^#@1V;()_nOEG|hm!I~& zX<)dqEef{7KOOIIuOo7@zPwefqSohUO#i3s0-TRB@A4c-eraR%5pUpLzXB`Hp$`I2&Z<0n&??q1FRhbvXu8YFvn8Y= zW`an3fi1aSO{Z^zo^SUv7ZN&nf;c(Z5kn8$`swNw?YA%ChmXbU)uGtYW=S4(v9j>!PPxMeVpOd8>OPM zCShC-Gtig+nY2KI#ms*G6@kmEO8NRm2UFTFBOn!5wyxWdtF29>?F0>h5~rJCbR z?DztFZB0Er3V-MryTJKiHD=8^a7QdDK*?}3zP$;Xsd@~=^Cw`tveuAsA`6v$?!9&w zYM>3jXMdQx!Il1!E@R{sPamdIsjXf(s#nDG>o5^a&HOLo-8frpAzM?Mch!FhS=;fI1r&b$Y6Ze z9J6X(bU|dW?3a8?6}wZ1l8{-)9(%>ip+t8kvXDUN&lRg(n?gIPqEcbvOxJklMGKd{ zbI`W)TkQ>dJjOdm&c85wY69YF9i>T1>%!RlbY3MNtO9N4WDV*ueUwFFaWl)j7i`=T zD`@YI{2`~Do!>>=z!mT3XMHD0iWcc|gUk3OTtoqF#Pe=g*d0LI zrJ;Qau<^fqV=D7P#D8m#{IO&mc!ikDyc6hHca$anDs<+ydV$Hs1Q8X#$IRBEuD!z^~9lq zeQZ`6k{1FfMW822L(qrbA8}*#&J;_v!Acs7tH6$?G|B&NA9KdVeNFQh;aHCp65!v{NY^4WNs8s7GAKak?>d!_EZk{t1mR@|UgyOP%TNM#d z`@q7dvd*e2>bhtI_u@%fWaka8{{y~satug8T*=nN5iqaA4mi>3oQcuFaXS94r3r5h z_sx(25cKS-7h3`lT zBf2gf;ke)btIsxs3+y=be>NIL7Wa@c&Hp&$a_xuu@%FJ6*S&g4I9qOAyj;KDn$g;V zmL3Voyz_Feo`m{aKK}MALT`+mE5!C-_<;3vwERcTtx|o?C3tdR$}U00iJHCGAk~aU zex{ajCDbj%(oNpn&DJlSrb&%E6_!`3yXeNu6=DzU1URBWp%yjRSGOQ9p*{x>7;(?P zG|=jJ#Vjm>OJ6lu;1A)o>Ozjn-5N(BgGp9P3{A2n-@6hA=r!X{v1FdLJxaKEITU~^X`2>JCs&{KUG{8?xcfq+;P?M@ zIJ}7Npx0rysL^gcxlPwrq(tW19Wx;czWpwkdM4*wfBy!O>M!$o_6*c?Pd*DCA?Els{&eR*9i zNBh5j?LgJPtK+Zrvg||z=KkWd(00Ust3xU^EB!x}-3I%=Er0RX?gz#VV1a~RXu{Wc z+g1NxEBnV}dmrJSi2ai=|I8P@(EJB3{z1!s$b!FD{l5|O|H73>CEpSMwN;bP%KKFn zzIHT~tI*r~W(@{yCDhMdRmFZy)$ivdzxuV%l1eITnYOp^swznc`xZS#J{K&b+7g;inzt`GD&t6pm*UaCGm}!IKBwyC;lHnc7JC^hX!roVZ=wE{v`MRflX=4d8i0?jaulLx%4MPrRJUz5jCe|~I)TBkO9eH`Y z2lH6!0JW_+wMwz(>e( zuvtURUvBm}>xwTL?R)KAG(_uy|Nh+4O`McLHBl~ICO*}!WYl*f=~TWm(ub`~zl##= zDKx1qGCWFzb_eI*yykBPOtliSl}n&HG^S{zIZw8Jc0=|gJhvR+))p|33#R8MhutR1 zOFtc#0Nu|2mnSirRCUo0q#hYtJ)fe+)__=A&JK8+Q;~}g4i5yoV)PQ)4tClPM|{*@ z{2xIFEfBBbd#RiC|>mLF!k8ZLL;;JYV(*HZe>$AAp%BOEF63*EygrJEf;_!z}LI6kGVyxvL9-pHCV`m2dgJJ09L}X7Jq5=}K8asTXnM zqKdOe_O>+Xzkal&@wQ%ZI|Q+@KX(~Mp+6e0IO8;SeMlKPE`Sr1NvEPS*`O=HT~ABC z4r$U?x^s#j%a+}sgyT}JE*fqRpl3ka{kMd=kk-NDIiD*xuu(-v11Zr-xbE&U3dBee zj}yqr>v@v)qoyM?P#3smqkaZ2r7B%6j-mN*+B|2@Hp6C*X0F6` zsGv=anbIU00q&Ouo=0}Nx)K$j*8@K%rDojNV03D4URj8qVUK1|3(;fLw3Y+2t%;te z^S?w_;JSJ^6wlAcql=o$yOAq$a=d!o`kckI9|p$*?Rj+B$7!nmrYj5OtsmCi$bcwk zT_~Z&UqNUiHRDij)zmr5?ZF(ZK}QBdL6D`VmL|}Kl=h69mx;{GkX}90$Ou9UtR|5{ zX!C5sPp1_~Mg#`L%o)!e9Xs3=Hu;D5f$$MWN1h`mom(MGthzh^vDcaw*Pu$>ajKuDzn+w96OZpdWFoS14mjY*b{yi)^0@HssXngS@PD2H8lR&kXmDiVVCVf+xwduv?C?a`-f-Q2gR>l2rMvh%7`r2K0wn0H=u@aT0D)zoxA~k4e!Ao~d4)mOJ|p ziCiuu3~?6o$7pMru~g;DpIPu|n{*@O&B3hrZ%UbxysvHpZD~DG(rwLRZgX$@=5g-( z9es6=@gC67w4Zv~XO#-mH=XeMOI*P@*qy|xpeE(?hg_W4uwcl`T~!`!*Zr!s+{@2j zl>Sr#1Z&q!SPWU)rF-MCA-#kamWNeY4v^jbU16>@X0IGM^>q=P(q&^OOUpt;+QweD zOF+mAx99z-=%nuHeh<+D8m#tpgzd+1gq@C>1;pbEs@K*Kh9}qa;A{eYQKGd1n);qJ`8iARlDLAP*0Wq zMa^>ReTy<%-=A>PBm&c0! z3^|}qItET(lrG;>LRrwXgq$>~ZRBv!g3no*S!T9t-G5*qJad#{0KVM434erNr5~dg z#(9;QDeQ1q>U!5yX1&TOfK;^8+Vde7&&=?p_ST+Fx(`?(P3}YbR>kFYMtf$}L0mcT zYe(^*Y+@rC-~2%sRi$mpOOjMXdQmyuLl+!6L)OUW$_?!LK}Vx@wB{l34CmHfv+h@CSd|35B0FS&B^9|{xf(N0nPlQbv8E?f(9g8GL=-U#s% zxMX?hg1oM_{y8IgwVS%WhG+DRd{5t2tm@;J)Z8f<9UA6$R{-o6<`)tw555x~swoeQ pxDhOW=|+&e)4h;@VEzmKjlQm~?&y;N5Z_J!c;T{jy_HYme*yF;l92!a diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0003.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0003.png deleted file mode 100644 index 85936753a2c06afe08f280ec2fe6bcefaaac0446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9132 zcmeHtXH-*LyEPn8j)J17R0RZ)E(i)pfC#8G1x}=Q1w=qPgc_nCA|fRcK!gyHARVMe zN{BhqTNDXMf&r;g0)`$4$rte4^M3b^_kLr1_t*V#{$%WAueJ8`%(dox=33ba=B5Tm z4htVTOuG`){mY-ns;Ovav}XH@c>45tc(im~}c@6XN}<&c?hb zNw@oCXD;Gta$HXWjFK4C3@>DhM}QT7c%qh=jQv_M5~yg z*5=nShSv(DH2lY}wdQdYI%8ccoy_nf-blWPbeMR9zvsBO%a-x-3|Bq z9Sol8gyA7eK|PdME?%ojXZnOd>9A`@GD0KZ4e>pgLd;V2*r1TCeSq6P@;&gmkSUnK zOrpU4$dBgv=SLfY2n(B7=I;FZP`Q2N=2E#@^lJ84^Md1Y1cNqPN|Cp&7!4VA#A|Pk zMo}g9LX}N*%TrTV&rBL)Y@kbr%gf8>*Rwowi=E7nI@%^h`*GP>pv_4n5@A6JO6!?l z@6A%}X&2l5VNmKQpyX8MgoJF2*y>&1YdY{IDJjV;YT`r>WjT7YDc#a8ni)*rqPkC} z%UhSUg#q6AVLOVPBC&;>=O0J;=g)=#agI!ihbW512W+X4 z_q3i32_mr%(2(lnEhO{^f+h*mok@3GA3dd5-FcAL29r({>8KscXgieAxngvDvnHY( zn`BevB0WGdv|cT^pt7!+Vm9aYoYv!Tuuy!pyCMP?IMi_1BxyiJ_)3{sj?2L=J%UJq zPgh7mt--bf=GL57%it-Sw2@h*pb??c<@gMd_2p+)ib+bT^OON9Zeu(|pnSOqwUErC zQn^@?spyeV>OaeOntoS|yAE7bXP)5Lm)Tei6wmf%%(Ne}dip-Al|zCu;8cuVWk}fIgmAXx>ZTojY9ytDP_QsuGPE@+O;3)Tc273k7zQ}1))GqN0{z!j5+`I2G z^!CKH`jY{QvSVt54x=ejz5{nUy0@hVR=l(>`-K7SYDXKti8lE@7Ntue~ zPH!pwVux|xxYpwFY+3QztHNIAch^5vuhC{?eP6~5Qx=2#-0<^^r>@LkuS1=1+Jh6;}E| z;i-wg0pPym^zbLy3>ij`w*%aCKb8%}p3RjH4Z!Oz0K3HPiuOCWnpYfWXYITW@%+>! zc{C|`9$LE3WqB>fbGt9d{1%uT$j|Te2`zVm;25{? zvCQ#g@Td0iF}(t2f$GaM3UJ_|g5AwOF>9J3fJM4X0Hd!Nn&F<4w4aI(ym#8@Skrzn+q|f^eviU7(gG($*8IzV0H6@l|qzr2@NNgUnLtk%A0*crMz)s?31JNotO*CMoY zL!eYuJO|fN`tC9mijO3#>IG{`rK@Fc@x4nG_~8PCaXcIYl_^fz%FHagDMN?(Dg5&j zZHa`13dbg=Xxg;bme$n&^__XTQ`q;o ze`zLzhKE{Jvh=llPX!$@PAyU4_+0H-JhBoQ-Ek(=p$Y7>x%3UVGlD;#9HnDa(C7M7 zN@MFP4=jf#*CUbUH)EM@nSQ$rQ6ehL$ z?gn19Yq+b3{}~Oy-a8i3{v=M*fBZunw?Ijfsz<*9DU*Nx5tnEfrEYksX}QH~XQ04@ zu<-q3{6Zm8I}%L$xY{8GrDu=PXKJhPQpL65s9xqq*-{Q&ffF$zDv3uqDyl|vx6#iW zo>?Zo`KI@+Iee91?fi{MY@E%FEJ1gqh&k6gW1}Gr0rP{!)9rcs@%3nQim0|75aQmj z)V$gsG~0jc{!HG>Nvew>5x}!a7?LoR;0YKXOEq|Le4apeqx8Mp=VMWkv+FoP6 z?lZF-##&)QEM6HED4x^F`jYu%Lts$c{Q*kLz85`WyX%9i*Xw_xV?3?zJnM$Q&~CQ?cHOYrC5Zv z=i$A)|0^G-u~%{fBMSD)z2xJ!Rv=IIt7qs<=4{~4zIjg2-SsqSGxGZYS6A13a`bd} zI{XWhJ`1!iWNvi;b-;^XHQ43g7DT=YUJ#6b&SY^ysVFvO5HXxS5q~Fvj(c1}Ur2Ck zbHm1Y2}ps;S}XOp@y@cSiMZdY4a*W=OtEgpfw}AGz!jD&SzqZRhtrzGrBk;Jf!1;}8;_yXAp@upnE;t`#WVI!%juVGN)T zzMz|bQaeDJ95#L~_tnD}|0zCf=CVSR7cj+x?)T)jX##$;EGolR#?$Mgc&+ulVw>JE z@p}q`gi`C$;l94UX;ML)CJWQ{_I8-0K?#e@etteaj!oe5=xzDR=4w{TJIh$+FqW~7 z3c$-2*G}uJxy#`1=kc$cv%WlX`b3qvHu6ktY~g#yXW$#PwnfwxS%@81q@Wl5swVE0 z3UrbsQd~z*zxV&HR~InTo8`VUpr`%w14kuhgUAwRYai#v;Nl4Fs4f59wP~>_%1F&D zD^p7CBfLy;Eu=8bErEEuLYt#tW0aN5Od|)d-m%44nLw zr_VBn1}UOGNXDLaQ9Hzt%Jbn;>EMS#QkUyzUtZeO+=1CiP+;K|Ue#C5-_3)c)U#9$ znc3wpQB{=XlJ0N1%Uw|Jmiwc&(|Dy)?xp5m^jUc%ubq7JL0(LXI6{oKWF{LZVHOYC zc^*)Y_VBpNO{lPj=(KyVd{VlGDN58Ly;q1jpbDMbD`j$uY(=q9fx{mz{8EefwZWGw zC$qQ8LAVgonf6NV6D||7^`ZldcLuYzSjysj{{x*83+8Tvs^%ya*J9eeqb`?WhsK6d z%uerufG{bW#tS#EZi{DOE)jKjGkUk6Q|06fFR=@USJA%&2|!=;;+@`F^R&fDBbF( z$r)w2A_#aLnw8=!C?bc(ef%Z1?LOLE#u?Tbd<-GscrQazpMg^v=xqnf-EPY=bx~ z_W>7y{Y3gCsh{2ItRtKfw5AmTbEPMSeL@ApiBIkrDeNu=T!3q1FJ#Tw%M>GM+<(VM z3ro*vAdot@eAmRwXAZ0us;bGF3LcaFPQ9q=S|lt{tcu&S5vib)Gk)y*GsuG17U2CuRCk_V_m>i_2Yld#x9Jq#dkU<6>(c$Dz{8ZBTVbL z?o?33hGnHo^Q~CoUN{Q}|DHVL9|IiS^W~Q~3T{tuaoK|^vIV7i4Cz63zYzXGXU#|G zEf>ZHC-<}&%PKv2Kw3c~56<^E|12{E4!~3GPz&{D&s#Y@O1Rrtu22+MHuS)C7Ra14 zeq#RyWW}?L`x12~W<0WHrBp*rv9f|(OYQez5>*$BUsOuJIF)Z#wDlmVHaOY@o{fjE z=Rq8OCOhPDJo3HRTtlm0i{g9OtxauQdR0(EuVb8~bzgx!0M+WSCZQG^A-_0u?9EJ7nc}cIiDLoUII!M^4oR5?mv{GtdG@>nUn-Tx=eYDo}Im0 z^3ME=I6>X!we8&nTDbDT6E;QfrMym$65QYoVtLPIf+ZfBTPl1yhVp~_c zse4;d;CitcWb31tQ(Y8&QVh!4INvyATD(`wOP)HG7vC$;{@J6%BgUZ<0D^{x$)t=eUTajGN>t=m}Ll|eFGfozvtQfSXxP_ zj9#bBB7qTW_X#UlzxhAoxGg7tRC&QHh^ja}dnwDJPt&8- zL~Qi3bt;82lC|hJ)#sZRI9r^Hn|#?C60*VfH4EDvyf9S03|WpOv=8V}{`R^(m=vAu zA0ss$*3K%F#l^*unnL3H$z(uo#C);WWSf99%ZmX@llHdlHLbvS)WB~KHMc_Z*cMr? z4grKRSmy;|J6}68_~%!qd(w?cgfk;69U20M9Ya|M1VKG$mT@m~TE=XWJ47QFRgtut zb-Qs&QQvu?Tl(%bI%|2neZgE`O!mZDAvB2h8YBq zsmZM3i&^QGSG@*I*-!i3FJsigSg*9M^n>n@psdAUB@%!143SKBVpuc}>>W#Bw8MUm zuTTJEw0@S8W*xs^x8}^C+avhsdav-sst!4UklpR|Y0`S?zHQ}a6_|gS*u8K2V#Uoi z|3Q!a>w$glvs{^t3|kXR!gpR=4n;-$ogFuSH}db$_H}sA3IBf#`5%RDANzfh9bgM_ zVa@K|?ytC(?e$TG|8UiR0s7xR^1qGypNFtGv$uHu(+vFs*FUT4KlA$^p8Ug;zZ~&D zD*XSbga6xjQt#rgVAZPw@<5zRbdigpB(+mPnFQ7A7CnaiavD}1*pV!iUV2>BhyA0P zQP^h(D-@;$rt=I$?C2TTo*L86x0CUdsladDVf+EKH(}0vrz^ExXnWAc%h*{*4=Id*T=o0eF z7K*;??YeI&?*HoQy4Q8kvm!fN%FPiLI2;<1j7JR3XN4#hr(Iug{a_oZ#S5UVh7Lw= zk5vwmg`g;HGIUmoM^;KCDI;O^STC>|)jvNpcK&D_f}URV9&={)67|}Jq$m@)2)COz zp4^{xg1@Pz0i1xUCC9xme-M4|Pdw~M3kFa&8sgNT}FHyd9q`k~=v6!P6 z7RIbUd)~E0rEm!HHVAt$GS>5NgFXx#SrTlh3^qciIc-+eT^&ldB$jya=;n<9 zi{AtRRSmZDV<~b%M*!D9_Ir0E=o!~u9U|B|dNu__ph%t5nyycu*M~7n(YASDCw0N7 z2rVjo@!ZrE!K)}K>RV7_iCB)vO)F+XcV7@L?%>=xa=0=BQ4x?$f==-zPz}GQw|xvyG{lwh*wyNef@?xB}%kogtcCZCHTMVZOU6%w2210KqQaK-``&ndHR@W?l# z5Tm)8=%}A%E@YIqqTXTAG*OY2!f_4VJtX=|(7e8WCf1A3bsK%(#aBDZ3Q$H*HB7@} z0f0Fz9c!F-Ta#m*(!ettez31+#LSgxzP96UgUL^w4~KjPSusKMBt`)TF|)tV!&q_P zg!~zy2Y6$TkGZAQ!h{rvIj1sPOQ&+P$u$;`x8fY-R`DW)i z_*%9XHmR^QZ*6jcLQM_yJFAU{H5ZgFDiq7hGF-xJX$e!##;`%ChcCCDS17p#=@JhJ z6b%HV1cUr|XS}2p@syg>NX68UKJCXtj&P2%kB4rnMor~Es>AFm&65HS_j@^b`?KN` zgbpR87zEHMx9>G0TJ4|m{Amb;sQxC11!PZ4V!=m z0U{nr0?c=ZdT)i`;WIP9=xl92v8-Y6%*k>wTkud=n%uNpo4O94J2eGCsBSWRUKn7r z1DEZv)a4}_r;5auY;oma5rruMH3zyLv?3$Z@1%$+GhI(KJLF4w^Q`ek7m23cIifL5 z{C49BvE;g@JBs~V*5l4wb)@)Lh7Ht?Rj~&5IXj4N-XGm%lebq=1D&;F&6dvv+GydE z9ATOnQrJcKMm?OaqkA+=NmuHvMPuFg#RRm2c}E#Nl$;#QO>u;^v$ICIk6bV|ILIMm z8ojNNFlxu&+1!0FpgA7whhy~o_SC>q&5ir*&_kR+D>8Ss|0N0Sd@S5bR5&Zs_yo2x zPX$S`H$Io-imIKRDOb%(KyaFMeG|=z!AXA8Q)c2$9#FCasz{Yo(>;>n!%Xm#k~AYc zb`ZJ*UK01@{4`=|s|7;O!91o<*n*I{qh#OB({osbhq;qsAwTbajv{4c!6}R{#R^O+ z|6GfNRL`?3rN|qHx|h7a_GV54t1jRisXK~^SE`VPJQRter#zUw=-8A|y}Qvd!+nj@ zIyApwi7;+hXS}A4HY4JLEOpj*HaV^R6rjnA%R$SuS|X(*mZuaiZn}K-y}F>$$g!K) z#P*A&=z#{=O@KR{RBkDmJG%ur0*dMP4#{|}%8MXm=`bm5sA$wV-WT+X6U!q|d{d{U zN-003l(RBBBpb4VjP|`dg)=$VZlxTCiZtpn(Y17GfeJn7jzQdujOGGgxZR| zvfNyp2l@u&0ENkJrblCKL+vt{8&v%|6Ise)p&5g_-E4QfpN(j2Hm-iz6hhM$cnTJ}kqASf0=Cj_B5e>d>6MWn6 zUU2B0KzFuVy0@;2D_>C2P#2fEtL%E|vWmK^?0t#CZdOZ${g&ZD!R|h6=I+7nfkEQt w4?=C5Mv6PRtx9+bEQ6?9)_s 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0005.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0005.png deleted file mode 100644 index ee0350cbaf81556a0fbde4b48ce70711de4aaa01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8940 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0006.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0006.png deleted file mode 100644 index 904a45e2ed069f8e2aa17e9c9aa72cb3a61b61d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9289 zcmeHtcUV(d*Dnq#0xA|dA_&q&nn;HM6r@){K$?^o5Q6m3qA~eXd!_>%6G(h-#hm{_j|tk+`s3a^Cai&b@tk;{MK*nvme`9o1Wkj z=3--GJ7IR?nmrpEJ3kxSA@O6s0C&o~Lcwfok~L=63>~9ikl;2I?#`4hNZp0RrBMzo>!f7*nc!96;BuHCRwGvw}LUKrlcXzL>Eywxk{-J(gS#Lw?^ zZ4EEJ96EDOGeqLsr-#Fyu&!AuG_>DimDn+W#ZVb>v=FVRxiG2==yk^q1CdkYTled+ z3%{K*I=I{o*P}O`kJ~T=7ssx5MD=7H+^=4J_xLQ9zNm!0-LeH=k29SlEPTjucyu7O z@T=*QbF@DNI%}u(qc^-Ldy7i2mKb+WPlE({H0C~KWpudQW__v|J(;jQXgcshi`*@l z*(ad%W5TRMqlzOF4WOzqG3G|f=<3HJjh(d_w;=jj6gGAsc9u*h4>(WdD|vRV*0dpF z*IH=buK&rUvRqN34NwEIwE4qZL8MH{a3 z>3Ws{%v>Xk-F>g*G-abt^Tl+~Kk)uE)Pc4Bb}1ZWT~9hN*6bO6t{?W4b-5+`Z?gge zj|V6`)|kCTJcWe?IFqP*{gli*lMd+9=QfrMGTcPoyEUJ_cl`XBf>T@l83;;3q8OvO z7@D<|)(HbS51GOVRzV!U6JWE^^Dw4b_)_Mzqb<&%qYlnj{IXB1)sme8AjIK>A_19b zi4QVzYajxK=~Q3)}uk>We%H8J?m&n;XQ8AGa-#LqI; zAxXZ-m5iaLh1NThdHPYa_;7X471inwL~?%1Z9$!ZlxHFo&~+Wf42~O=NHEJQcB4J* zvzq*JyJXU|Ldy!Y*JVL|y5%s37|{pmbh3e8zP^fPpTEQ58}@N-L=(rITJ(6@5S*`{ zx0kLprYXJ?Q}qn;4t&~GD(~&;TPaFY#D(d{OD?i{)(aM*{3}g|f;Z(H(Sba#-*0vu zCD`?~EIr4n+?VjQzirVsT(+lahd5vATCvMvr-$x18j5B;;f(+Ez4y*aow>}Ay+~NM z?ft|E`(mT_uo3X<;3B=AFlolHWeK#0e#G;zqD8TcO{+H-qPbxJhcn8PK{XB?yUVmH z94UQWcS*hq6q|kGG76Wl*Tq?uU2Vw-nwMl`b;EsPg3s~kgQfKpb5%26vKNFi{ku5v zgK%3$zJ1yoQ-^qj_3}Q?G5$(jv(h8V>D#8E9^D-qOdBMdKd5Xjcz_3Z!dZHg8P0y` zQ-yUymoJd1jAWJdVgnd!lkM+aHqa?2WeIMEP0{~wD$HnQB?@?$?T_MQSO_F--h~` z@I!1mzgvWu>adODT9adTzov-Ad`GseceV{Oza;VCqqgcYfv9F8t}a%sKi&Ww@!n-FBo z3?^`_R|$JNs2YtHGe~HkjNV%=uNq6@;Bi9R=x$!4w8B`-jEs!c|*y8-gmQ zG8kmb$&ae@4zf$@wt%7dSNT`)86xP;y_KbvRr zb|VH8vHg8;@2k$U)qb6I-B>E|n&H4DzzdD*cUF51H^7yly}f776^6*M;~)@+7nv-?Jt#k?DdOacRg;BU4$~<@eNJDT%bU`k$-0vQ5$0y>b)k z`~J*}+zlXV`xWOGAq%5({fH|`fR1MYZvaV}@Ew`5*15lCvcENVE>o+0h{IqPciKoz z0oBOnb&}~W%Z9zxY>UP+_a2{>sqw^iHZ?gxuyM4|zOOLGs%O<(*xqn)4H}(!_Fsl( zr5_Ek+4im_DdQ776-mt_a6;a<6mL7G*Po6|(zW`xzS!gdf$MTk3-eh_vNM-lEb_rc ziPbw7X^|2W0BX20#h`7Gq!`*_z5s-Y{j)1m41E=mu(!NI`GQLtT|H}~YuB+hhlTn0 zyxMHr%J+yt#mscX?xZPoYC?%&X7WMk&B3+CA;@p>HX)r+vo$5HvZYmC8!>&Katd%>7g^STClnPOO9eclkue=m^3rTa ztN?_i@fOto0_9-?*S^`|(HagOKy~LO{8>izn9Sg;+&j3yimEh};2PZYirE!QZGom-y0XBJVQ( zhs1^g1a9vux_zr>ZKiD<%VGja*PMgbD=!&Z;+ZHw>b^>L?arAV@l_CfZ$xR2I(`yC zjFg)cs`E$Ud&{?jM2X%No9vs11AFMBo8HKi05N6KX#w-w%fr3Y(&U&g4>>$yNtpe$ zHuPj?^yVE(%UTWZ2jiQD%LbqjFGyMCf&!0aJzA~LkVG%(FvGmO@ne-SBvr%H35r*x zZ!$6;L90qSfRICfoTIndvL*baDd21RuD`dZWwdlzrOIr{<)cJU_V@1#xbc9g$}5(1 zw~7Lq4pH|6^%T^jfNcpPR_!LsEc$w&0~$Usp0_#k-7wTgh+M9ARnA)Ql-$?7f0P_!3V3VoEyWV`}d#}KViIym@?Vv zf=|2E+jiE++Rz)t?PgI9IB39Y2?cJl2Kxa3>Cn@kzc-Sr3ftfdQ^=H_M)=s67D?k+sDc-Sq*wIZ4Bcdt@H;TTy%WR;(*6sXfn-<_KxxcOdW!5tK& z5f{1nrp55Tx^f8|b?Qjpyn5m?!l-oV1oz^xQi;Af>mNKrK8QK;G}tzBwrPrDybVuM zR3T)fpFMhwg=h+!zbjv$ZIZw()Q9G}%9rdPSxLs{5M$r z1%CGHcPOU%n>#1=pi`n-72wF*y2+I(S7HSt%Aj0Q7!E@A(7*$7Yr1z5lvkH9Ls0KuzHxjYmex_@Ykd;|@Wy1BJFyyB?a%tF-bugb zWdD;+;yhrSq6v{l1a2?ttH)x3iZ%9w1@Xp!oA_lR=d2&VvDxJ%ep%2Ns0ZUJC;kzw z=+J@8$8#7G?bY;&^Z+FPmhV+{l+!72)}@ibrz2sna@wg>DzVQGC}74%8*O{&ClG%+ z)|n^Micb6`%jk)0Pd10A+>$l@?wLwSj;4yANKhz>=i;Lqk#Yw5BaBnKtm}GAHYXZv zgbc_6E%}a3wMpl0uewuJt(cSWe zviRRU6v-e(F5{*AzbjY-5n?Kf1DVmG5S0gJnX^$dk$%RZovi>R@dtmx|-C91wES`;P}V znk#YZlN0mzAOrms*yPj!<5y3Drb;X;cH@rjI7*{X=6vZ0=o0#upRT^wy;9W>TBZGa za%v06weho`Lqm-tFAp3Ji>Ie+&z2qH#$;hjtZr6%;oS_JAxw!Kpf>brGA2YFB8buo}y0Po;|?Y`~J z;EDfktg?^Y=~!pSs#E0dTpoT$(u$K&Bm1U$ z74c!DTH$!dHZF6CtG+`|Cx?;IKB4HiqKi?B=8_I|hj$!K0E+BPJCqC%4MR*_qwW6A z`rP>Vcr#>fYuHpQejA|8Iy{9<&CNT+35THR`(2_odK5>@=C?GZSttQMig(8DjkMckNs6hJn^dYge(0`0Nhu`}Cs zK9(3(ynh?RC{>DIwt?+A_%-NnWoPz<9~rigS7a+-=RWd9fP=rX{+d$9_Rx^gOlw47 zSQvR_w5r#p7`jxrLK#6h^fqH@A0d@v01KE0R2(U0(Fp8v(m(Hx+1PUl?AHxo* z-T3MVHDH$JNKg zZhXNlPDKIRGvzkL%u#d#1!$fQ8mQ5&ai7eamsfsp@8+rt2W;;W?*mVuTIF8;&%Xmq z{I@+0Y6>^o(jP{LcHg%qPYS$lk;F*;KaDk7ero=gP?A1&AZoVu>P60SiSgOH=aeGM z^c=1=r28TheIlr7aJjdAo`T#z_pDSjXP-A$={_t)zbv3`ZZ-Ar$)(#V=3e1-2GNya z-i|-JB>b0xJL)Rd8z*mq^PiA(ulFg|Z`n!KdO52QMr}?csWl}Ji5hPz!$3-g6F)n$ zbR6>I24CSz9Jlji(u9Roef{fj#CDz#?6P299ZOtEGq?~7XmJ?OVh;k|zniV87K`Yw zed#p&yA-;OW%%sNmy`B9xOE=n>5S6*(z(=JDZjWF0dg~OuV3ksqqp!U&y=zJJR?`3 zJU%r!pCLrHMaY7gq`+qP_#gUv4{pPIQ~_;psSl?E3y|V7->St`qGE-(Z`T%k@xXVg z?Pc~%Q36Mv+;SPXSei)V&Ur8$NL4w^##WmsPMGB9ZO9D0!KkR4no_Y0nZ0h2?PBC7 zn-GFOUP(2bH}QOFPoRu5{xuEwrqEMfyZCb*gTvRIn^vM$WE+ZTT&l z0j7pr&+c*4&{p7^;8Cr3Ka~nDuIl7oaEFgt33Fw5s~EQNl6(n4#lm@tsA&@NrP#se zgCltwFiK;24ZBI>8+QtRm!!(8c5_P6;d9i(_Ns^#a9I7Y68>%&Y*jWeI#9m0 zjcOFY7R=zIL6B8rWF6}YX}Ifb;WIDCO;UGRBE=qG(g};@z#CUSdX9xM#&daV!yisr z*C==lExsFzzo(cL1@tZ8E0)9OVVp_Lkn({mVAe>&C!)FN#UUnXR`57fIDqND?PIDk zAJP{26&Lv8^7LTiT{8#-cE$NccVU^3?2j*im4R#Puo1V-Qc=kE@!7D2iP-b{J{t`7 zyXO=lFvI7yqDvS)e+ov_s`qP-$SsMo3q6mYJ}I$y=4eZ!YW;6Sg*P=4HY?S^v9TM6 zu0%Hvzlf^&lE?PVIND)TwSpX+;Se-uhm^v%MW3bL+QH25ZT!U#?w{bQND; zsjg|9(Y(Fvq~#7e-g9?&e-2v28$f_2;kvqB5kNW;130$aXWeP3%axsB0m^0!Q+f3P zAsOM4vmInF`jq?pRSayAH+%EO*Twh4LcW#;W@92Su2S-s2^}(jgMq6RV5RrY&XX4) zZUKWyk2AgZsqZiE+O0t6_s23xh0X6tsV!WKt%>e(`NPms9KM@Qa32(ex;2(`q1MI3 zSWU_`xvQzmYJvflEQ;u(R2hGr^_7y=ciS#=2GNenkf9d-3rBVyXP(F_|DtJ#7;%~D zuWXJAhFE}z>4w^n+LZRpJJyr5?9dM?I#H2BEwIW&!cf}`*z+BqiV|^TXuB`0Pp)1v zeYyQKmUrc4X$iA*SA=1q(`W;KK2YHLPR40cZ5)x?*xjGUdqhM8YH@-yukz=7W)lLwK z-x%(^jBPMU%i7-6@ezD=nbiB(Kpqo@vNI<(Wf6$S>{Ph=l@`oYO7rw5pWI5!tGV-M z)+1Mt0UT}$e0F3-LQu49qm_1#<*ePb0PN`Ss4bmIiPS3@vG{$U;c0X9qNr4a)O)ex zN^%C~%u-%6M%2<($&yHd-acpK8%4qeOjv17Osul=)O~2MSaRyvFVL}RC+l?4?O!IVlCJD?)K`GCjdD2oW*4h(3#i*$bo~Ia++;xeeFER7+Gi7#A<0r1k2F z8Ew7&-13=8F}V!(B~LAIG1)x!D0{bc0$tPYvLfe#2Q=x{I&#LXmetO-U9t7(9)3hv zc{hD`o;)oSw!ft&VbfzQNwx=XuL{ePQ62BE4UL2;_gKY2T*2oxZ9#6d@;Nk*b9%HsRc=2^{YuEE?2b#$|4=eoWJ< z7n6Dvc{(Mv0k$-SQ^-G6So{T=bGgNaIfXgqk$8q?yWiF2$)hRF93hR|AJX&zIg=hV zbeY*N#OQX{?H&KNdp@!FsN@Hc#7*bHaS-8k_`N=gwGhiGaP$+o+H*`?>btHph*O*V z$pyYlo;&&LimCaQ_y;jbCW5iko?4=p6ELW6vC(dpKOw`~>@qPquY2A1o=}o$>$3v7 z?}F6_V|(X_>!0h$D-!c#NruU?38yru`Pze1WD|ty;T&o2{ZQ?wWBs%GV`s$L5v@cz zkH_yNF&MI#gMc32@B;S!4GdlBU^VvAZUJ|x#(u$qdUEm8Q`3yWnTCrfi9 zslzfXq51O8Fc4eN`;seVZ~LRS`*W;?!`!jUS`a;vbVXI$yeury{XIQ_Si7k?dX z`P*TQAICHP|NmyWFboRq3lnraSkHk2Jm&@ge^dl6xm#LXhTgT<}91H~OeLczhn b1K@|Mva<46+D8jOj?L`4^|cx!uf+cX^SRt8 diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0007.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0007.png deleted file mode 100644 index c492657abf0614e9f9e050e792d88ef918779086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8934 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 J8e@;d{{Xe47!m*g diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0008.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0008.png deleted file mode 100644 index ee5922776b339706eac1819b64235280671399fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9291 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0009.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0009.png deleted file mode 100644 index 091349bf73dea743178b9ef32a7336e23c13f4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8955 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 Q&NwcRiN)1&Bj=d^2aK>Eod5s; diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0010.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0010.png deleted file mode 100644 index cb6fa5a842ebefdb8de879efc3c79a8b8438c5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8805 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 NvA(%pna-`4{{=LYw|@Wt diff --git a/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0011.png b/applications/Volkov/artifacts/mame-p6/sort-final/sprinter/0011.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ1Dd&WS*UN*4p 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

      KFzaU-#*BU2U6N-A=G15#bfEkHR6+7icNoE;| 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0002.png deleted file mode 100644 index 4d43936f79eb92e7be4522b8ae81a2afcde855d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9170 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0003.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0003.png deleted file mode 100644 index 85936753a2c06afe08f280ec2fe6bcefaaac0446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9132 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 w4?=C5Mv6PRtx9+bEQ6?9)_s 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0005.png deleted file mode 100644 index ee0350cbaf81556a0fbde4b48ce70711de4aaa01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8940 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0006.png deleted file mode 100644 index 904a45e2ed069f8e2aa17e9c9aa72cb3a61b61d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9289 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 b1K@|Mva<46+D8jOj?L`4^|cx!uf+cX^SRt8 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0007.png deleted file mode 100644 index c492657abf0614e9f9e050e792d88ef918779086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8934 zcmeHtX*iqd-?kZA?U>R(Eo~{SWi-|nEv>D#BB)GkMTwy(idth$4AoYxv9_b7T8dIj zl~j{RwboFSpcO>L($I)lB8i0OrZe;WpW}F*=Y5ak{qla8e8`dGzOVcG{jT%3oac4r zPJvuDKk(DBpZNIr4p>^4Lizak#rgPtII-_X;L01jO!;ij_~5xH_yY1!4t4{Mhn#3Vwj(O%e*c> zx^VW-n|s68zJ63kvU^r(CU=An*Y1o<9UUGX7E`=@NU}g3=I-iB!XuIOye_%S>e^bv zwE>f%_S7ANr5C-0BIbG@Os{tuZiO&nc${@y?1s1`lJ#E3fcr%R&zeqcXO4`F(9q?(gO0HOb=9k@%>I@o^RR;@G9;>Gd`0P|mG;yHlHa3pL_!ZrCj* z8n5a;Ix;esZn*imUmVj{YzV^|Y;#xt9;vLXT)a6xKSweIYzkFrZEsOo49aT9ix)4R zFqC0za6NA($5x!QT5SC{Q2zIOYd$vWAn+Es;|_E zQ3Fe>sJGRiG3lM<;TonqXwTH4Ywn+&gX`@S>>VeWRC<*-L(|p>7}= z%0MF6?#&-TUtO-`bT1aTM0QMXmas3eF;C2_W`#;aG2wA_`cV_kG+ia?8~&tTW!*(u zenXqX>yZ7zi2BTAmkUIfinf|(l5ZlB7tcBH<~sH}-hKU`jbD~F=w8{M8*qSMqZS^< zj{L)?#6cr8Ci=~cK~vu?#gCEVO45oi%k~OI3<->~RPD=SMP9U1=l3q2nsu=o4hBE$ z%9pKCm?b@1(MySo%?&6S#NSciPrh`I60Rlqg%sFcE);*M5DGEvvab>x{8Am_9}g@^l6N|#$|D8 zx`PiA?pob6(fwLVL4#1_C6yBOGXmm-;#{R7neS?@OC4lOzLd#pj71QMGAHXU5-gf=q1MZ}T?|y!TlwATuglGj z4uJAcZS@3P&At5nfoHR^h$&*RY~Aq>X33gKDM3^t?YFAqyQlSTJ=va^Mo3Y+SZo zrg>jVCD(9&Wjy>#kxX{WfKcZ=lV7zX`r{R{q+tt!k3D$%H88*L7wYEEAC_G!%JvA& z+8X<#$vr`n#_A6TpD1@7Tkv-bFb8*z#>zSW^e;>BmuWSJlR)ms&~5D~cx@ zbC5oKZ+{HgA9P)iPyad^vdN^yF1HHOUsE!`oBSerS(Dx6hCHf!5>yS;7#{r1-e`o_X4c8*hhRzIGf&-;->aDGUo_EtM z>69BGTxD&CqghL|9Itj`KS^x`2p&XfuwJjS77~h}4wg+v0KIlAGN{DSX$O@IX?>R) z|LVtPAy)8 z2$}IR_|`GKpXwljBGP*BrK|PzO-<*5i(M-=>GOdDAt0EwWA=YnjPp)_Zjl%GFgyU!W&r0184S7F~h* zuVyWrUkUV|K@}+I1ialm?%Q!yQ_l6&0{lb;dDaw@Y|PGv3h^yWk&}O{69US#lsNZm z^u6bCpowX!Qq)iOd%?%hYLwo(0H0T6AY4htJT=8Dr;s}VElpGI37M(xYR)nUn&^D+ zn^Vs|WR~_*gy8M(Uh}&DxB%7P9hnej^+@4$NJWy@AbmIVea3m{O7a&VM~?zkWmy?$ ziM>BmaGN7RJdytC;=e~wb8RP^jY<%99lj41oF3Fc0FOy6eBz|mjC%C}c!|j7nlMcc3lV&ct?|TPH~n>4S+t z&4C)DiFh4Vb-~tPyChnk_(&ov!HPomet0zO!xgq<^ej3@`I-acxbFu-Ic`VBsdyazvFiqAUF*Lx^S}&k%gwRXI9FWHQ7a!^-`w%C7lz)78~lTJeK_f`UOEbM%}D{O}+cO zh{G(b!KH5RS(247?>}5CjMZ^#(7)tN-{fZS?a@&{6AhKyO4LfIyN@^c_J3~h?J3`0 zgl#KbB^Cqq8yrWGlruMYR7z}8f6*37a7lEn&ZOl}#T*%sW0-#;oXP2QCKo;2zg_qx z*RBFahTxB%@hVYsdt;9cx^bhI+^0$eS`C3f`1sU3l_sejbR#Ipy(O+WjuTLeYl_`i z+FZiWH}KoMiV$0%gW+sGvqYuh;&R6tz{by+9wK?|P7cG-3M)s)W4M%6-vRbH;W3p% z>zG#%ylUNVCBo8rQA^{^o?d~0fs+Pk$Oaj?Eg6grq2o5hNfK&TPq}AGorfC4ZwW>N zorg`4+13e~5(9$+4ejs-Nfb?8_r1>R57sLWVn=4y=OjV+RskE)!gu|Yk6V}APuplN zNIdbn%G|_jQ;Kh_Njn1tPo=X)%? z<#vh>vrF%R(t~zh1iKpqJ3q|gh;AB8;?mnTyBp_AyWgMETmi}tR&kLRX@p6h#vkni zOkG|*+j1-)))U;*so008EbbCjag(@oB0k%?=vZK}VAwBQ!xiyhUn2dbF)va8ph2K_ z*4A+BGYs)_20h?(x1#Ldbf(38#snG*@5r5|AvLAWm-W2<6)#?baQ*I|s&60;A#2N@ zq}Hn0eBa^lu&As}wsUyXwe_piQny%OK^^ST?n>C*i@c^w-@6zolxf~HR4_Gu;oAOl zrt)%m$x$mObP>`&|DLk5giZ+F?JXc#0QbudNAKHbfYFMSZ8RN|Td#gzk$;aR|8aGy zLg~H+7$KyP{`2~xBmnJhqa*ncM%<7%{nyGN3*~xzdopie)zVC6sE}d1r$AFH!Fjn? zz)qR`wbCCh9_L~pe33h%0_g0bGB)C|W%GGmc6}=I(Xxn%m^-NQz^?^uL|f^3>(8r; z4?|j#v&Sl7e}{%PU-hb2b@I|2yiCyVZ1As!>GhT&#+erU(#4u$x1XQP){x_h-{U0b zmI8_VeMMVU$~=_T7Wa=Uhto&X^*&y9_v^VB_s+U7S$s86YK@z&w*c?{8(W?eQQoR< zty;y+*Z~(^X3&?{-#+4es#wkD-5Qg_oU!%>;JTY;xL&w#mk^pB@=!FOwp6-02Ei$c z0sDoeMNAH|9~Q+82b>{y7}3xWAk;>@CcfQJlbmwb5?)3rJ3I~tbEiD42oYkGThb}W z%Zt%B?GIZYeYBgo0{;%LDw5~-7|Y$$e{W4L?-o(k4UO=Wm;Nf@cgx{G%Pz)dP{1W1 z34ho%@n11M*CqpzRZX{j05t@mOp7dJZR>L+3cV8Ls&8`FO<#KKu(WYZ84 zNj*Vz`iK{86^Ze4%%9!vW@2wA*G|Mq{%(X6$}Yc4z1mC7^F_H7!xdC!+!rAji&$>Zc%A*t*Kl*dMC5?z zL#SmX&EBci<(}SAi^kDUnM6^)Ok(qM&oJw2`yI3QIke^;Wdo5@FP%x|*Z@i(X7L4j z>CIw|r&lcI{A+WW__eXd05Y)IgvBx1y*e`vt8Q;(^gYsb(h`=g5(k*eFr=&#g({eu zlCzk3@y=WvX<8)gpnrDE8PM~XYl<2G5TQT=0H%He$hu6#+EY)jpc3I-VyZ`OZ?PxM zrK7LK$Hy}ihWh&Yiu7aerSE9F%JL$mbM6TCtZOi?@e^xK8-L!CYi9vg<*P_SO8oRz z4UnV&+4Mg=zq5fm6Wf!L&}W0&7?X@KHQ9mUXFHtRd3H>V}= zS8gC_0kF*;*cS9tH6ZMA#3ou4^ss(? zCv1^He9RUTj^A`+a31u>%>f>A0HOm#Bb*#B!+I`j-i%~Slv0GgB^g4UKxEQZ`&e75FUV3KyH!mb-sMv=dryfBHMAOC^ z7aK?23r}$T9q z?T*1(Nn>LpnG4{?omI!Lm8lhCoJGUZSCw}ZgWeg*0el-8BM zcmV*MUuchq1Wnu@`SMwYeP$`~$Ak-Ye>FE3K8T<=5RTn0324ZjN&auA+!cL*T-rhE zy9NUoN##(2+s;nzuQh+yqyHz9|Fhr!82N7^^bcHrR@6V)^;doWQz!q_$v<6q=NROF z=fVHq>SV4j?eq49gOh59S7TuZgKM>fwXZwttA}xNHM4--q4LIM-n)a}cX&&^`>Iv) za5=W*UzOzJC?MMV^ud)heC*yvKmo1`C4J}MW=+bo`P2DRpFhZ0K{4S$9N^4E`H^W+ zQBrH$d#i6Udp)lMS{jN!E%p5fNLTZ@f*TU^v%)c%J2A1mwze%XwA>@#_-oH#LVLZx z8g@NJRKku31GwRe$Aa$ZmnDP8s8)c=mCAg=(&->1d9u$%`! zSz+eDCjUZ?1=PRYv$>x+!0J_s5GCiu+Ij3-K!?(a>S;e})OODw%uwljV+uFyA&b_xja46Dll0--Hv8+>bCOc4DLr7~1vUI-9jM5+T!tt<5+?g$l zSnPI()e$J+y1mOK={r*_IV=C(Aa>xi{ikkNiVJ#_BBfZ=RfY<-w9M@7?m84Wo(d(_ zAnq*s8ao)PYJ*9K)1{VgW(So|8aN=5D48miXE5tDmVJek;pI&hLtfbG^z*gIQoGhT zv$>s<{vUepTwQm-(>NbNAP?$Zc-pwrn^KZx|K`9SCl?9ez>ynA%Jq5TF~Q{SS}iJT z95FCMcqBi_Sf9NAGmYrPYx-)Q37z|Lnc9)Gq2vBK$l7@Q!C}3NyHA4PHTHQ=x&*`K&2f=K&?iS<)^vOWlk$e-CN8Os9x=Jr)V>MBe)y@8@uqcZh?0`ofBBt` zAphN0@{{&pr`e>ir0xa7Uz;i8)5f@PQM%rd?aM>h4>ZHjl(wkS<+1jmBiF!&&Kre@ z6pQ)RD(wtc0^|DmvnC^XMQ+rDND|aa@BZ46$RPJ`iI~vZ!bv1|JcDu$;|zlTtGU+0 z2}Sb54taP@v(T8QCp!Wi?ezLs3@U@ZZ&fK228!QnVnfBpU4$`8Z=f-{AaziDex^v# zVJU5@OG8#-XKCkcE=b2VOW~{!`pn{b(jsZ_u%uU3jpVnIiJIKhb4&NeLkX?vkF=zV ztEL*KC)CD#{VZ=tL1mj@b`W0A-oAxZ`ff^l@IK~IRLUgg{GOiLMC zsylRVAmbc^wX~6kh)ZSIV!=zzRDG-FuZwR`TasZ~LLh0R*Uu(1We8oW?`)*nSuj6F zE-h?vA4+o1qL4Eb>|f@lyWi?&X;tp&(#nxfwqEloqk-S>ldelFi<4(3Ys0}Dn_+Ut zovJ5mlpY!*D>V3I{6jfPeodsWrJE%~@O{s*;x3kziTpZQr%BcLIefCd*yE1wiq1@= zG_`bGTB_>NtB{)FqVG;U80SGV9ee+V-!L8AH?6gvOY1gl-DM zcY<~ERR$hGxP{J%5<*!Xp(+lBb#A5$4p|Y_enu>A9zVHK&9+05qGFb?{&1n@4N`EZ zvhM*2B%c4iF7fysEjX8g{>)&aq62;Nud}-%eGfR0Df}PRwo1$!C*0&a?9Nvs z2=`Z?n~97;vm}$Avtp~s9Yc3se-=-2PBGk2;z^S!ED@XK(7gQW^8@;b4PN{wu;3BPta zVI-;8z*ZKWzel4sGDm091c&z6ru}%=d^m{Ebn1n4Qt-c!93AbBt9YI`$~WD_d!~%o zMz5+x_0v=pvI%Df>*h0DDIUK>is~uAF>n`aX{vZ4MMmn$lv$7YGt=Q9Zo`}jwv56+ zF)U?}mD}UAaZBj_$Msc_42y|p=0#_Vy0YI`Pje!1^A>>JuR56$g8e?j=ybW9mlL>$ zW9dk&*_&Dm!b{J-h4Spg$cI+)BjeO8yMe1`4v z8)x*mH+Qjl-=wkpN=t@qCSK|$nA=QhUM&r6@2FY$0bQi%jOwHq-5&N9E#EjeE}2$3 zamX59&83}==yL;jSg}KeT>Zog+1w`{?jpVe-h$Y=8C-)|lpyryhH3Sm&8~vA;2X>nGU$0;MzyGQn-sbn*Q+fNF zb20>YyF@zN>`J&@uunMrw@`0B8zURD6Q|WQbhJ;L@;vRObyh>$3v^w!oB)he*&P`j z7VaI$2k{Q~4h=g2xe*bja>6q5x1bX?zXhDIyBX>i1l$0AXq-NMdNlQe74RINrP*cE J8e@;d{{Xe47!m*g diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0008.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0008.png deleted file mode 100644 index ee5922776b339706eac1819b64235280671399fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9291 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0009.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0009.png deleted file mode 100644 index 091349bf73dea743178b9ef32a7336e23c13f4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8955 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 Q&NwcRiN)1&Bj=d^2aK>Eod5s; diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0010.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0010.png deleted file mode 100644 index cb6fa5a842ebefdb8de879efc3c79a8b8438c5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8805 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 NvA(%pna-`4{{=LYw|@Wt diff --git a/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0011.png b/applications/Volkov/artifacts/mame-p6/sort-run/sprinter/0011.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 CdQ^5z1Le$mTfbtw>T0D~FUrip(M87{e&1 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort/date-descending.png b/applications/Volkov/artifacts/mame-p6/sort/date-descending.png deleted file mode 100644 index 904a45e2ed069f8e2aa17e9c9aa72cb3a61b61d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9289 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 b1K@|Mva<46+D8jOj?L`4^|cx!uf+cX^SRt8 diff --git a/applications/Volkov/artifacts/mame-p6/sort/extension-ascending.png b/applications/Volkov/artifacts/mame-p6/sort/extension-ascending.png deleted file mode 100644 index 9fa4db64e5a7d188b846d61acf659c592c166797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9087 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

      KFzaU-#*BU2U6N-A=G15#bfEkHR6+7icNoE;| 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort/extension-descending.png b/applications/Volkov/artifacts/mame-p6/sort/extension-descending.png deleted file mode 100644 index 4d43936f79eb92e7be4522b8ae81a2afcde855d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9170 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort/independent-panels.png b/applications/Volkov/artifacts/mame-p6/sort/independent-panels.png deleted file mode 100644 index 091349bf73dea743178b9ef32a7336e23c13f4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8955 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 Q&NwcRiN)1&Bj=d^2aK>Eod5s; diff --git a/applications/Volkov/artifacts/mame-p6/sort/name-ascending.png b/applications/Volkov/artifacts/mame-p6/sort/name-ascending.png deleted file mode 100644 index c468ad793ce26a3e6c5c2e91ec06f41596f6d967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8658 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 diff --git a/applications/Volkov/artifacts/mame-p6/sort/name-reset-ascending.png b/applications/Volkov/artifacts/mame-p6/sort/name-reset-ascending.png deleted file mode 100644 index c492657abf0614e9f9e050e792d88ef918779086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8934 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 J8e@;d{{Xe47!m*g diff --git a/applications/Volkov/artifacts/mame-p6/sort/refresh-keeps-mode.png b/applications/Volkov/artifacts/mame-p6/sort/refresh-keeps-mode.png deleted file mode 100644 index cb6fa5a842ebefdb8de879efc3c79a8b8438c5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8805 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 NvA(%pna-`4{{=LYw|@Wt diff --git a/applications/Volkov/artifacts/mame-p6/sort/size-ascending.png b/applications/Volkov/artifacts/mame-p6/sort/size-ascending.png deleted file mode 100644 index 85936753a2c06afe08f280ec2fe6bcefaaac0446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9132 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 w4?=C5Mv6PRtx9+bEQ6?9)_s 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0000.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0000.png deleted file mode 100644 index e9a4b885050938c7f00a8a4b29ff9a3d5c59b37f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8829 zcmeHNX;c&0wvO#pTVjJ#gCdiP0?MF>q6|Sn#ek3qK_Ey_5s@j8c}$`x7j1|rqXQ5F zgi%0*$Ph?GAxKc80m4j>h)5tnfG~s%FKBn)UT?j1-|+YKkE&Ix>YO@z@3X&ef2U5} zh1y&HBBv||004dgpE>CO0IXI709I-I{FCfX{>3040AS}Z_~Z##L?$oGqfpgZ&;qI0 z8Jk?327gX^dW8AUUAIs6YPsEpdz7U<9kTt$j?L4bL3uXnF;ypjvuKaM9gS+m+qQpe zxb~#?d@QT!0`!Dt4s&zNbfeNH_2r=wG0vPfcI7JTG0FRDrmG*Gk)aTOYnLA?Xk={7Mvd;;wND*m?5Yb^weNOGfiDG9iJ5QWw!xk@p452 zi4@uwP~9;78pvr*Sh4iW@#MJP?(T<2WX&ve)r^ge6I#5pBl9E7(84)w!uMB4p6js; zK%tb9sA3)}p@l>u`EVGR`N|&KQ3l>X4Ud&9owGc(;`K~UT3XsV^_c5*;)zOz;(4Da z>DVHl(@rZbEzRMVc!+%~#7$cuTl?DaXa5zczh2$nA@17nJyKE5F4`-O5w2V!{1H=G z%b-G@<{&28@Xa6_1gotO6^C3XqK5oTJalq6%L3;HZ|*bx)ZJZU`)2*l@Up~bN$rcw zWlo|MS2(J2vnGbetESFVM@%uAhT8SXCD~C<0TUk8haIp*ZVu8Hzm{0UMQAQ*HjCe> zwLyN}&pLW%4z}I5zC)(~;fDom+qxCe>NIs791waA$HN(CCW-|bk7wl2Moy;Mg!XH{f|j7q()jFQ6lTslGQPJ4&0J;XvKg*UX*Y6 zIbnDh^R2M-*@=9>z3YC2L@QiI9n#}UF#XkYZ6vMxgii({jaH@N2YNakRh^FNGulKs z>L|>JhF?hK>!;4`$qLdHJk?Hy>vq@y`#J7~h+q_g$wIe{+Ky@ZTBH*#EEP#650T*o z`?OBU3}fHn9t+on*+*gRx-SH082qHndth{?#L0JHfEl0EQ2}lMdSQz?;R7M_+6#~7 zoK1IS6#zllRZ+}quEPFE<}Z$%K(`hZ6U~lF z%=vs#)l4!ap`z033mx%(9q$YT=;XSD{@`%~^v%9dWLtEX$AaO>j#1K8jg})?MOA=% z4=BkAmR)xjsK7M`Om>UIqGO&zm%!SkGrYACPaU#+o&3xN5<$jkyhiFKgGN1`IlGff z-BiT>_5RulQRW_jv3AeLS)`3$vNc}AC^n7`vGid#T!)Yo#gbLODvulbJ);&cl!rf^ z9Nf6l{d6k(X$StuOD%zcTZOQF;uF=~MrfBryfU;-=GkVOWeF*|*KeYFBy$1%CY*ogH=pXzqsySh{34p^}rx@d4lkJWzpZmOg$oq7BsVI~FI`$V7Je$SJd z@aiQzVa7HMiHmkpvZPn^GoQa&7oZ-1VD70Qn%~XC_i)c^j8Wds)U)>=;$0=A8XVt! z)kzo|R5<@>B`kz00^54_bn%(m24+EEhHI{5U&QhHe^gh6M=SXGf6`l-e4}TWkBQqw z`mk~HebcKI_gSnbq8DD9^Da|A0>zFkH{~O<53@Wvm%B`%2B8`gk}%FdHmj$99Q+~s2@S4QnSN4Zgg z)k^L~nl*i!x(>8rR5s`fKBeoWRJ{6bZ7$Ut@M;5pb3aoafSE=T=6QYLQt<*Cv&>7I zU!Ej0KySS*mU~Xz3eqpCa{p*yxd&Ybf31*@b}+w~4JLc548|p|En+MCpmlW4jIa`d zoc-tIPM-ijP6j(i&TnbmFr~Je}v}=0@8juV%J5g_SOQsxNn| z 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0001.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0001.png deleted file mode 100644 index 05ff151ab655295fd8667ca25fdd3442b6603824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8694 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 AK>z>% diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0002.png deleted file mode 100644 index 9da86d6bef8b3897565bf0dd526f145bb4f09396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8913 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�sAi@W;rx2<{pcmtYO#u?u^0b-`*%T2{)NX}+OGM^jW|$l`=Z#9ZX$ zoqKu0;#%+O>H^2w9?{DZbXY$pCMKppg%k<}&R)4KutCQxOto)|HS-Y}HWK0)I7h6E z2uxYUy|AQV;b&qFHgy_(J~{y)Q>g!Z|7dt5^I@3q_!|e z*k4@};4{$NvUto=fil0vAWH9(40RR~6FuJYJLR7S?r+n-o%XXJ-HA`E?9mV(Ute%b zXdr7+wO7kR8+i%p!CF$stleB*oliilmlPpci@7`pu~9yt&IaQ&&u9it57zmeKKnSo z?@x#Cx|3Im^My0)5$vJS(#YqBm8}vC6U1{`L%+R`nw%f-%+1k336n^q(nvl9VdlroH)1i1NY&)OPmtg@5n_9yv|&(CP$A}w z6CE#`TaFah2@hs1QTRuEEEZcCv0RqRTc>S&%F=M+Vdeg}$Q6!RI*xn(GMay=*dPmk zy5KP%H#S@K-x>Y4$G6mA@7A1fYY!yq%Z zY*_Uw@DDC<+b_D=qylM*ET0lj8+n$3E|wX;=iYToT(HipFVi7snc&PbfxxUmPj`R+ zMGv6XSReJoRLWvEGtWam^mOT>wF91c-CeFLa2fPrOmR@(_Jl$E_{?a`{hHVk$c1Wz z;Lc6z%2#X+NC|J;ZEx9Y;2kkVJ)TgI7PBt=MdNV<&_?b#S5KUc{=m)AB&)Q}+Z@f{ z9N)*+FSMzab1K3(*~&bxvuUvtUB5Cf(6B>R^Sbn@QRApVB^G$0Xpq3KMrIvogs5giM~E z8oj+WihLI2>^|FIerCxu43)bzjw*Wq(tuGooa)q>dGO<7j;1%?F7s)C)4QV}9c`~3gR^EAG@dTP(Utk3Au{mN!PQ!xKH#6o{z!2C5t|l$~ECP>{Za z9rm+RJ*#d<0-1Y)BJ2!5bw(yh{IJRNs4=zLzxzefBR92a4v@;%vRrfbX*R1S0GXo# zJA0q)Fo%y(logi&Xy>L`q;R_lSvkOydHYi9AOa^0>6HOL_j=~~`BT4y1q}(C3sJ5y z3XKf#>58266Ac1JN8c)|!r`ZJw@ zICaR{&etIB4O88zf4?WG@GZ{kD9V&=wszDwjWOtI?=dcZif9e?UEy-b)7!6FTY1%3 zeHfeWwk|ToJu}=@t@hIBp6hY;#?kFlYV5KP&}HUg1EVv7?$PAFx9ehBUP{Px=g`T4 z3XvqWI&LYrA|(3|O>RCx#$Ef=P-?bYT+L7z<@KFTyY!9!%8p%e#qi#YRHp~|m3hu3 z##zsXu%5OvMefWvcoo|=`ORPF0G$;Bs=6Khib1hWJ2mbu1!_J`krz^_Q>lKkt`Gvg zn%HkgnV26FygTQd4y9B*w%+*?bjxUqqDEDN?WAtJ!j3&dubr8J z?J@c$=k>l2?HuXBGXd^4Km1YWK4MjLE7(-fKdM^*sJ$QZA)^3^QFxZ=P; zBNWjG6{VYbg^hMuSr&RR~_l02}rRGk>Om zHfWf3?_7Ui>b$-8c_X6)jN0#4`wK3Kv27b7L2>3TuqZ89{N6)v#<}{5Zt|$5zKU<6 zFOf^zR9eK(ogmHu;PD3s~9=O#f- z(d<8`z(Wxd3qOY&d7U`R>%7W#u%65idIepWW?adz6P0Uj1iHYVOx(rKH|=<3Nc6!6 zeYM-RbM$0H7}DMqVuCRkw+(sO)oghT?quMu13M2o1%>C=(k4)98CbofqH%E%ljsiV zn69dTv64bE?{SsI72m1Vo6QtUWci6MhPRE*DjcN zyV8RT4E$nImA&4Z)0asrzo#U}b?dR0RkJK*dtTn%tD?*fukjcJ^18VObs%{ku_9Bh zW_fNXjReT7&hJ;bz-69@v)h58g*CPPt?C%b^sdw|Lg3N<+?*K#4RH4Xn7IeI`$Hwo?gv5@C5?idA(A(py(KLk_ Ue%=k@uLBreHMvruf9LW40Vg(CL;wH) diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0004.png deleted file mode 100644 index ac7cb26de1db094b9319dd52e676f93fcc6db8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8910 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 diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0006.png deleted file mode 100644 index 60fd542174132ecf9cc561375638e2f5bed195e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9831 zcmeHtcTkgSw{MhC;-3)1OWD(;oQ%9^3uV}1ppBKtfO(m^ik$g)~$lm7VB+>6+$5iMakBG zS{t2o(K`$|OV!aVSfAGAQfo=&ls`YN4uXE*087SCbZx{v@D>i1(tlBZKV#TDr2oCG z(T(%DJx2nUTlf!yk<07;!M)jjN@-~|)M3O-rWGQmE0r%2Ngb+kUcyqd>Dl!P3RMCS zPNA@0zyI(Iyn`*YaDbDBM-gP~r-NL(BOeL*ML|UGFzCo7tJ?*`9 z0&^eZ&)wSWNu8Mv<=`_fzr~ohC?0TZi_KDen0wI{8{msXBFCDMX7p|?u&VdW=W{3( zS-YmawTJN4M$TQ?rS`$wlVFQ-1sHL((H~~E@eaJR+)Trg>9aZI9jVf{nit9%vk~9w zNfVm8>%7jiLp8!sRX%6KwW1WI%$^;ayvr3S7{&wY5b9V>{Hk zzJ<-r&8AgnwJj?~cQ_A!(SUOf((kXC_dPt8F6YocH*K@zzN*xv%o?_#z&RH7&4Kkr z+pDQK+vJ?U)%GG4X0q5{j@ncI?;o!h%*&yBE+ifSa_{;~)Y?+?r@5zG#h+$nS;b(n z*y4Lm6cbVt6hS(s>-aHBfqBK#@i>fd6Xrw~QauUr9G$l!=hI&JZ>B{Iu6Kc+1k!V| zvY2p3x&b)qV26FT6$)EKttAf&7Gm)dMabT#zGILe4f^>H41D>Qx~In%mNWv2edGvu zF&pVY5a1@eQ~6wph%Gc!s;I7+_9U?a3p(!~z8EiIS_QqRSM~{7zGj81*4o1|codLt^_;0yuIYTSZ<@~cdX;^6TsdGMm>C_ zB=15I&8uP#XiuAQP!5Dw5W!5S1&xeK$LJrsmWok@0NGFfHr!j-|MK@5BPxe6TU%`S zMICYpSB9Gb{l@ij)dVFjYs~o96!}0*XU1T@5fv5EKVM6Dq2k=5rmr!auSdiI*hn=J z>e(u!h(cOZ%QYAv6|jRV#N{T<-S;C&I#mC-XW-7oH_mk}yiJtHViV3CSWA^U^qwR82h+NU>`^Nj$B zm%GWHhJ4>g1`ck^zuaC7W-oUWs8Hl_vK1lZ?}v({+;Wa$oKCvqz%099S+IH@1KiG4 z%ZlC1dQ3cE8&0S^!{c=8AhfE0`lV(VX``|@mdw7VafpdTozy2`GnevA_LolGhUlb# zNp6xyxpaQAwfo|j*@5q~w35UfhlMTa`*dS1Zj(4pIrbTLLW21(zBUMn!B8y=#e4&6v@ZZu<#hw=?8)8C6+yX0!rDU6Xn zG+75F{ffzH=f@hhZUV)TSLgsVf21Kg&!7QyGX$*3UZ@gaoc&ZkyG7!}s%UqY%2rff zD{EKA`ha1!3Y@XIUQ<(Zk1_ozHAeN6;)C%q<_?YH+VT^2jad_@D~Du1u{gu0#jL^W zHHXUcu90Q zsa_pjkF|g$!oAIJZy^|cUwogWM|K)K=kA(6I&XD3S-!)9le6=c=M4!Shv5yzdy~Y- z@S?T1JkqBBf<Syy{9Att=RYg%``p`zkauyUPITkL5Y8yjV>DQ&Z6--Z5}nR`xuq(=r*t8y44 zEPzeS*`CT_ZqJS)N+0Lp4-wo``but*Z6%RvmQwcbX4BefI`+Z*MgE5m;nwe2--$=Xc zJcE0*voVPZrZtY)c`lmh=q^3a>bH>(iuc`Of6G^qBI=i&=2yoG(t<%R0;+jPatzpz zObxnzRtQ}-Gqj}tzA?Pv;bd!Zd2>U3J-kbmW(q@r)vlG}{Fa8B9?atl;a~qmtFsK% zLV-L$_BLh8zP&0~RtO z#g{OY+CvJhLtEw~a71~eL-U1$L>tq~Od$6MR=NRRhvInH)q1Fs6m0T54~O)O|$%a zUr&Ci|JyQ87)R1o0c5s!CbR!}LtW&P^~6N-SUB_$*GuT;$3ajY+>LJR*bzd>$qac& zE0+x`e6t4*lM+azocLDnNDnRa!^*)N=L=&Z^c}kbqM+V+K12$tSwj|uhXD{NnCs0J(jLD{`yfguI z0lfHmh5gGv@JNlBF`4pC9LeG!_Sf%w3S)qP(U!6B{U7esI=@H|8t|Xz)TDq9{oy1(mTOcEgt{d&N1Ec z)CSpWs!zES@=eq$OJXOxQ&TtdMM;Yox;=A_Difw9$TqK_{RI{ zjBqzv)9;bqANq_&qxR`CLj15sxDsN^KRf!;z>>vL!mw2CqU$Tr$9E93fUn^!PL!bl z`^MUkN)5goIP*DeetnJ9+qZzxOQkLjd4C(NpZUt%9Kc=VU*EOW?bggOE#FE>49x?Hmi| zv(w!r@X6v9MFTN0G4zr8a3#OR!QtWI_;XrCtEDz|@(K#&_Sj*S?PLr4AuNK%pp7xN z#+X5c4-Lgw0iq{AA4lB6Kqo1U>>Ax)#x3c6LPs-%zQoiMkFa|cug|>!S6omW`bKo$KxV= z#4@kGp4Um8X-``wLv$pUfUf;C@472IX8wH{a*kVlE%$G)bAc_@mL7>1wwz)`P;1P| z^5)I?nVA_?+NcRuHE4UIX=k{`jq zSWQ%Mtv~;|)WlsLVPDRjZgN&ovtk4H%l0YO{r*TBW<@et`O>n`T5>yDV%D|xmR0U{ zakmJ3M4C8JxZ;U6YRbdEl(zkZF`}nDH@$coA~pByeS2MNpj69~%_nfK3&s9V8?#e%~9uU1-dc|9Y?A-Q}vT%b4nRZJcB7{yJ@*=V|w075YGw z57!|)+hg!ZKJSa&=1H@xkGL zQ*^0X;UM7tS^E&Sb-*~scVZR7Air51Xtzikzop=}2M!J_ZuFh(-8_n5R&6u+2%VS% zaXcNtC(dHCtmUl(-xUzbblT^=X+h3=9S zx;r4((l!VK{x!c(uiJnV$bIJ49#(ps>LAOLB7Hs)>aa14(Y`Z4rlG*meu~$dAE&ER z7^BYYCnApO)*3-0<9MEiCkXy_;_Fn)m6m_aIM)vm8(U4*#i)PW??@Celmc=CZhq(3 z`yVU6G6K-QUt0U#oVFBw9Qd6u0>%$X9J}7U>%b&yzyprIbzv%_FfpxJA*dK9Z*^!<{r#vo~d;CF>ut|tGz7Yj*QOhgU5`DbL&+kSJ! z*ImIo6a~-GjTr?TeVft+W+hhdL%oqIP$fNF-J{8=AeIj8)DKm@h0^o_HorgwJM~eci2)?iPikD z@ll=8Y-g4-3qkU)trymZH~5gCP6v)z{14V&M1`W4hM=n~#*SHP56nOK?zik-6==5)qHWWo ziU8HXjpglL9)2m)@~&%Ji`yP%mNquU+~DnT4(3|E+81J=)Ot3p$$6m6uDofr`<{}B$-v0!-6Oow{})j zZ*5QT7pJ#@5G7v5tbH?ZcD$?_3*f(-8LX-SvhugayYTb((D$VI5pNR&$kJuEd2NRF zF5&t=!|5*++jZnKf1dD(z59JH(taNLzYF*;2lRiBnB|X0IxBjOOt&gJo3|5V66Pmooo%lR<}x+x4iVkq-5C7Fdf3F1%Zt9Ce< zznENFrwakTp9Kn!AtG>gEthN3Nvhg%1nTC{i_coHI;yu=@8Fg(SqN&;I(}HNY^EW7 zdq2C9vSq;ptNK-eruqRXnJ?hRDIJ@}0SIhYL#wQkDxP>Ux~IK!>Ck6csyUKe0pMZh zN#_4y88j8>pO~`Umb;LVBN*yVP3cd*8)~iUZ#aN(_|tb^G!O8i^d81ZKFX7N82L@J zQW2mT65he{!=ggH4K~0V$Ta(3iVI5|12~{p_y4G&=UE*bz$+v8lRduOa?Y2Fhn?ls zroUX*5Ej0l*L zoY?hxO7ZCalo{`$k3w2M8||`TSKDk>_iYHf4ux}_&oo#G*E75BJ9HN%AIFkdcPuS{Nd1zv?~}D8T=Em zh>4b;&XJ`@(%p;*%dmSQDc2CFzRBuLyP|`Ba_{AN{nc92_WhgA#-2Sjd4?GEXa=p> z!>{L}&larjppUVO2|mU|z_HHCJ+7m|QuO|lpAT+Sci+DqEUQ1H5Fi+;N#lFPeI9oA z=a>*|fnbxFrG8eq<=B2Tz@RqqGc=W18<`{^^b)9Zb` zOTqJqBiC>KW5R^kvFn%q@yvRW45=adiH}LSG1wl*OvOb1tot(tKO80*v!=(KqMd&n z{SSTKgXI9C5&u}?$RI5daa?6!MTSJQE`Hft=qhg7n7Ul?Q*O9yNTRoxiSI$sgPO78 zLO2ZcZqNc+Zp`5Hp}(=F;Yx0}E8#w77TBYuJDoxoxc>HBVgY4-Wlk=Q_!vPsnbD>> ztJn1civH!$g_auYuzu?{e6-)u6d0Ptu-zNkpHPFg0IvKtE;C5>{3V2I zG$J<*@M=r71U-v++9rgh*L+4JcOqxq4o{DpCTY0Ynnbeg^Lu6VK}UBNczBzHePByI|x;{8^Rb@C=jE^H=0|G*ND=8VY+Z8*G6bXZ6&^ z;~Pw;7!Hb#1g+!6`*u0wztCo)`OyDlH1cD0$$65G|Aqgu$X@{C$%S2f`+h+7-Azuw z8*!5y@ctk8`f=?r;IYNO?k*O!a>-%!WVczz%<6~y7pUcb&rSUQWU&7$X0H|WpQHW% z>$Lx|PHQcT9y)oN6K3(0KIj&*{sjdTG+X@jLXOTH>-ENm9gi4QS7s*=7e0h@dc2py zjux#R7IDdhcRi)r^_r5m%gp6ZPgfZ62$#0^S*dYt`TI3CT0>0#>YVyHjrtw78d4p@ z^7)F~9oG<6o0!LHU9_|6EY1D&$Mm^i_G!H?N_H^V7&-cxw1&f$B>yV!9bM*22l zHkiAq^2=-+5mzD6_jyWL;}r+P_LUKk5voFkz1{IR?M522G!MAPoY{TLgH0U1eFTTm z5id0QUKZS60izg%^0Zz>6&%yEP3+kF&D@Bjsc5gVw}p@ z5RWwD%Ay0X$euj;R=ro3v|69Nz9helY7Vv#sjAqrNK^l$LhG*zw%|&_wpwwEBfccR zgfMIQw}JN;asF>52mGh=dbEr~Lz*0zwXL8={8Hm%1`n?hH9e4b9{^BtM%3Gbr?T4k zkPAr89Jyd39D(`pf`ipeePI&uY$Uf-Q5eRFq(vGH>Z#u0AMWxStIY8|b{w@9 ze<{1-O1ln^5v=*nz&l8vU5@Bw_NtRL#~NU5MPw;O)d=DDN9EMG+N>jbi*#anC9R;9 zAyJ^gt~hU= zk%UDO1F(q&XkH7751|s|Oo=1b+xaZ_b|kd5i=Z1ljqj!V?c04zU0hg5X5N3bSZFso zFMypD&OBQ`D;(XREg8@n4Np@+mYfQE+8u{b@IpKIHBNW)|2apfRiXg{X>Y^X5?m%U0n*(Oq)a50~!^-qt&9Hl|Hml|~ITU64D?vtU}8}m4N zZCwdU;RLP+b?v4jv-MHLd$FuKM9IVZP$yHh))rl`&SXqX+avo=k3uQYzoxrIc%`Z~ zLPM)7O&z108@*@aI{QX~A!_d?hvYx!YjROeMfdjL@P;z@uawa(QrwE}l4NMY@JL&3 z-M|)U>8f9o@yeV>gUMlpeVDlwc8ha5&%rO$iY)&v1#|g;W1QfC6DC-7XE11OJd~k5 zZK=tt%M?{~VZBO5ADGp8s-Dc!Q%Fl|jW zSX}X$6&f^ys2ERg)|hc-vkP5Oum6-_O?u(+wP#34cfRAuO;Z&%L&3%Tx@P66@xr=r zF>V70gqZ?=^;W+b&h}gJGU9BNP*Sn+j{h3!nkupS*_)jWXrkg ziFEX+-1-s7$oX6Ve8ikMaf8#hW^PN_x~aC7_}r>rN3qDatebSG?L;vC4ZoJxHbMQu zsn~~{9cN8h)i_AeUiA-S=#2AfVq0U_#~1yEG>_%wLEmKgu)&qsjM0AMXU~F1xuUb? zpO^?LGdE>84uPG@OFv2uyQlf#C*+f-CED3;{pzwJ9bn#j^LBK8UkT!)?0^}Bj|lzs zWN7h*)+ny!9si}luy*$kU_{Ep5tJhH*-M&FX?lU2jLJquz;yw)_mTrk=2ou0F+Lwd zfIbh7B;D{`XdBk9SXrQyAGA^$h!d)Y3iJ_W`BEP89wZW@dVb59?bp%;^Y_*c1^3d!p@zSYUF&N3qw$^L?<%e!>&w!Zo8SS<%ixg=;RN%O zF2jzql8R}q1_69gk|=|>6Y&v$Dl@Srctp=VJv~zw3b+Qemi}ZZnO@O_!w0)x^^33G z&*_&8MBz(SR}1JGS6x1y{g%?GD$dAfmw9k{AjY|hIx_y*vg2Ky$?*1qT+i#IB+U<} z`V7U{T_y$nXL@JG{zxUF)>dAAa9`AlLT9|Mm^gKfLKsgLIx(A1Ycf^`$ubGHYlm(` z1(r~$8yWj-CQy=XWr_U)p?1D(2KFMx@e3=@qvh@%9zo18sudEdh3|tki}e}iO8v4# zr&e5Fz3UvM1m%`=?3b?NzukBM3K_E6+4g6P+l;>ePinuVvCXyxR(x8JVq8C$jbTZA zcS@E?b&QFpWxqXP!}37uowS@VxXFxAQSr-Y_`%rD6FAVpiyBnTQCDf-+=2X36(_En z9&f)r2;mLzC&yI`h7ROQ!FRL_HB6fuD6sZt*N%TmWA+QRz+*dRLMF&rl=0`S>GNMN zp9yysNJTaopVQA^dTv$BW5jr=m+$Tz?KiA?DD${X!o-y%a{@(#<8>q_A!%Y)X>2RM zvc1WT@2^kv-~=2E`SGdK-yiS%^!d|&^_f>OlOq9@PiTB0*2Ma}3*@6|>0<)B=i`6d z%L$-=LtpcZjFhaR!Wq#!GLBc|WEC96?w`%?V9k`+n+f;!aq<8dIr%twd7m+I_w|-I rqvLnm^Njv&w=*UWyj(n41FS!?GBPp)&%Wrf)&X=h4K&Ii4k7;mh9&2+ diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0007.png deleted file mode 100644 index 63dcd255a88660712d455933809ac90f45211238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9878 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 A0{{R3 diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0008.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0008.png deleted file mode 100644 index 011fb04024b34d801bdbc80fc5bd8554a9ebeac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8721 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 bI5!v1pFcnHvd4%s4`6W3_-YCG&XfNIEYqbJ diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0009.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0009.png deleted file mode 100644 index cbb846d8a19b4e754ca3c87b425ae1293453ca4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8738 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 diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0010.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0010.png deleted file mode 100644 index 9a7ac8e3ff7dde9c2b3bfb93823b9352b31eace9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8737 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 We7G;6)j>QC06y(#Q)G4J-v0o}x0zo6 diff --git a/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0011.png b/applications/Volkov/artifacts/mame-p8/masks-run/sprinter/0011.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 diff --git a/applications/Volkov/artifacts/mame-p8/masks/bin-selected.png b/applications/Volkov/artifacts/mame-p8/masks/bin-selected.png deleted file mode 100644 index 011fb04024b34d801bdbc80fc5bd8554a9ebeac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8721 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 bI5!v1pFcnHvd4%s4`6W3_-YCG&XfNIEYqbJ diff --git a/applications/Volkov/artifacts/mame-p8/masks/cancel-preserves.png b/applications/Volkov/artifacts/mame-p8/masks/cancel-preserves.png deleted file mode 100644 index 9a7ac8e3ff7dde9c2b3bfb93823b9352b31eace9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8737 zcmeHNX;@O**T>APxL0rGkd{N5r8$*1vz#ck6fH5OG)SpP4NVPm%871fW=^G|xBd#( zfs72T9B?Kru{0-~2h=1rM??e_1YWHBzxRH5pZCN2^*#^JdCuAFz4lsbul3u%b@qvO zaHwB-FQV61P0R5{Lo-_B{aGoPvgB&1WNCsJL>PAaC~F zOMQujb-h@(UvMVuw{5SpdA(0UZNd8G>R6tZ^SYAS&V|}kQ0DW_h>l}r zq|K!G%0KSeJ+gOLtd~aEL@w96^7ll{O<(uweOBf@nRUq*-<~NOcY;4RP{M^pw6EcA z2lyY@b^jNut^0ml6pADRrt78E(s{!X%-WWpwr#Y3taij(3JMW|nP#l+s9+(KVCmhK zb;--_`zVQ^^;MQ(Ls zx;|;r$e>cGuUG{j!Sp&ILD5hlrQMwUSvyB#!{|GmgM)(wmK@>$OE!8jrr}U)9me#| z($`mLZ|{N|>*IulIdz!#?4ll@Z|)S!g?V z(cF%QEtw->3j97FgUp36hqREYC%`}&)8=$mUv zF?JAa4%H$1EeFPzeD}v6i}pp~ad4l)1fQD$>kXg!5wfYFv5R&JFNd{N9Ew_KMTsXc zK1x0{-2|9+gb6^C&5ZMso?t$j)W;e=Zk~4*QMuGvN1xI2;6C@m+BK<#BlFQdq33z+ zbNNp=#c#Jf-E_Qx6l)}7>@ia%Q2&p<yrMu>b zh|SOK%AB}{x#4XpKy2EG$F5_2!xPdHNnAVS{GLN)IREMQwln?t(LhfOu?I#kk4R@e zU3N9onD5eJBJSdj!ZIvJ&8Hs_Syd#YjEuq|5SW0yc$aH9mZ;es=c58Dqld+7%_+HU zO~vYfNHzKRYjZc1Dg!UFPn*%YtS(%P#tVQQ()4XujEm1TzR$~cvP-x~qTXuaAh8sX z{3Lq6VrLEreHG3T+*z~)BY|2~xy2!x|CQ@jS9vwcT^)^mW{q{=EQW|v7;7U%$8OFI17JOD5EX-P+ z49s3(g1JLAYiC|TDC#xFb(bDAI@KNsSQukkNqlImjy1hC_RdN=3oN5>c8+Nj4oS51wbceg^(_W^+45tqPisCJEX8ZbjdzqH$Ssgjna5!9AR`pfl zqJW7J{YMNzeH0-_%hnQ?PdiZDNA-KoG|+>Rp$F;os)?tc`TILYV^fp)#ige#txozr z2nJre1Yl5^2XQBk=s|O)@R+)=nmg=Cp@5$dgAwsZ8yS<6UaT zBiEMA7AhDsJ%te~3xWwlOy$>)P2#nY==GoVx#%A&13DS@F3fh%{`MVg#8ar&KEaUf z!QRo>mxc`&O-4_&Eop@(%Z76mLc4Z{h-7xsUf+M?Af z&wbwn34{Ao=`9ZS8Y*{b+8#4qh3!g0AG5qbjT6r1lzC`wVd}q(#{gq#T37|ZaQ$fP zriZ}qnL2+@C~rq2YewEWYtOlR=fFG;y{eyn^x^V_$DY4U_mP5JcrhNM;WMyVY!IGx zc%t*Y_77l@9?4AtR-xmo1v0&|;Um1Mr=``6Q%tKenG2VmX7u!gxoaKMadg^AfIIUm zWda6e^ywccv8FeA`=9WhKnJguzYu6SV4MPtZsI=GK*ojc+7ogXstnt=`!VIs-+FB+ z=lh#jCz?8c09=gzfPcXJM(~{c^l9u)^6#SN{Fwk*3vuu)jK(@UqVx&Nsc%4bcM4a} zBR|2|qm`TAFCaX(BY*pjT5*?nJfDl)0y2Rqoxqs>9tRcTIC#^z6HJ4LAu*3r5tYb; zbdywrqs`Yr?@dE|Q6hrrRp~FVA%g7I(mm`+ z4gx~wK{IruHQPT&X7BOE4r^JuIN-3{fziF>ERSz7YU^X0tZwUyF@8)&Xdrj;at-`N z9|9v-p6==^Mj+sDT{3fS&dpIYix9!Gge7>vO>v4GkuXgc17bgDlQKyDf-<4tm#r;i zPsc~I2UAbvVSog(gS8UH!hU;dKmiYWshEFvJ`WPIe7HG`>{KGs3~0w$7}hS+zP5^7 zSG$QWjrA@NiwoweCj#@sBG*|>2~E~^QCo{V908(TConlncpYZm_n%-zDVnR8-+Dn2D4GoF;qds1^ z)MCh_SFZ^9Oc9+KP42E}N{7PyQ1(G?6G>Bt^esW~lRG)vWiB8DQKn_J(dMQMq5F&Q zPw6$&!PBUmWv3*8tF*-@(j8w?wUJ}oaaWYcwCl5#ie=<#LoBedeuEuGdF7~vjs4c= z5iwuKU(ii9bgzP%tD1$pisa2n-w{JB|Gk><_3%4e@yxSU%$l>*uWI%VkwJQQmw(QIbD+>!ubfG1qYx48cf%?uo+k&p?_+1BQ3PkHuAk5sGri|U3id1{w z!Shu3RffjG&76FRdJyj(i(TJ&;jrf!QMD7P;HauD@=#qRr|yW3l4eU;v%ocDzsP49 zJi<*NhfRtDOxxWVRc&~=h2*rB{>RZnl2&rdr^mm#AhY1N93tAQN)-x^oaU6|3kntK zfukLMY26r4)aU|Ea zoRwpY>P&$iL7c_m-bmINJAu@`N4 zLu*7PCPO63p^dWxxYj$HF}pP^R7~1BHFaYC+DLjjM6!B}YDW`b&nn{DDZL=zM14gC zXVy*oZp9CJ=A|qeYV$|z&;eDPhebx40Kj@hb-ZV1{W5b^cIb(b?X}Yy_z>xVfb=5x zF%K<3A-zFNpU00x0ZL}CrY7$GHI+Q7)RI@grJCflDcCFjlKY37Hu3$#9m%R^mHrar zr%Y6^UrYaoC)~6FyZ8Q=|Gg8_KPeyQp*&4_O@hqrbGvgEPaARFMWwq^RT<+_#?Osk_wDR2Ga)r}T1M`c9-^uERvSO}U zB_?08nAP{=SG;m$R7^|D%7Pci>IVu_%$Gh+PEM{nJg3v?VvLlR4jo1}r9mt&?X6jC z0EUj-@kTF}6-W7{uQok~!T`6VHx_q9zk7{6)t+s(5)X;I=9OcBsJr}oelD6j^LM4& zhV!6A*M`-sj6|qKEqAs@Er<)@Ov?I%xP*now(>sOS{l)Q$}s%CIc+#@liQ1iowcju z3BLk^XM0KW^YewS#cdu@yy=33rV{V=Hk^=4rs%6~061vvYnqr2;}aNsCPk#e470sj zP~={HtZnm|zqORmgR)lV12BB?501VyO(Tr6`rjZ+Tn#;H+{`W6pMNbWXsjO`grOIO zD-=iS=g{Tndf*}=d0@_*pXzi{y{T>Oicf1{;~EA=Zyax293(ZKLjX?Z3Bb^}Uu*=>>L z(1N;dbsT}LF`@6Xtr9j6__fJOKfUyTtG6Ji zpOQ92@7bAq?@uP&jYSWgyY9IXDTsQ3dyI>pS(kTZMC2Q#PgL;;S8pl!<>)2vLprZ8 zZOSiEp?!M>C`vzGy12NW33lki7d0sKusfcq@mHxxqNfJMx-|I@1W=(l7xTDDIR6@> zI|ZYfsOoB#U^F+XqkznE{09h%X5S1&g?g;@_F4+n$zxO*+Sa51f|VvLU7;kWR4`Pk z8h9a703TJ(U=2_Tb@ZTK%FUO_b6@07RsA|M&&>x%C6ccolM+qP$eUwoQKBM8PnVVA zRBH#^o+0so&D)EwW;8U9+$KQ3;khu7lyXzR*@_8a(Pe134$Ao#AUD8sf#^W51NKv# zHpTXR^W6#nT#-6eU#9z!W_yAV+3Pfqb;a(^P)Jcdi-a(A>@kG%;g9yd3_c(12FpOF z*Uu}?9}`+N4fw&hY0px}pLiHie@)*~`OU39MK{VFJfKavehHu5=NA=~d&P(3KdW(L z&KzS3jfkqBKBBh|m%ko#yw51x-eIc0BUMYju&l$PY5KPQbQP7QXxirQ2kdU|LHNz% z)A16oFSHUchfL0g3V5K_Q2euq_kW7HS~!7^VLgBeu*KSto>TH+ljYD zyy>*ms@OPcD)d|6Da9j>GxxgNvD}tG>YL^CkR*#^4nMuOkG~pNtvrP7eCs+3^ZD$I zG@2E_n~1W6&GDOB-fq@^7FzU^Wmp9AihYX}Lx;TE`XUc%`B zd^h)x<vm2Hi4|s`^@v4% zDpF}^`8J$#rd1p^v)f}^9a^I$-geu`_JRqy9~G#B-3=Qp(vU>cd7iF{>4yRDtnRR7 z9KAe7&YIj=g>rUbIAjPNk|Qtou$??yxt<3&5S4>Ej&fj9kFh~Q^IbM0XV66w9%K&w zg!tMOOH!NDxd{TinBfs3lqtB@B=tFc}6cyq( zdal%o#C{7=+IPQW^J!OS)E<6!3c;Tz&p|KyPU~kN`91tZylJt2A8ax*)Ysv3)*p}@?R7>=8MjZf&k!bC7c4HQXuorP%ebhd(Lhpn4R}5y5;iG5 z!@TjF7bP#1<}t|Y3ambQZ{jk4iB_yt>l1(OL}Bnz)ZU2Cbn5i&R|xk2=2M8+6Y}Sr zf~E<6kuXbgpp#lTEf)b*Dp;av3=+1cQNhn%q1Wj!+@2;i-GC(Y0Z+ib`xl*d$+;s9 zHx3tX$QyI{pqb+7WlDNVuxZwX%HFZ=0%RfxHJ*@nd!6HQCMy}ey;%cFJ%4851j6F? zQ}&Yw*RrRo?|)3|g$Piy)5O`ALvqejW;fBg-uec@tGj-GHiOeS*GjQ$#dXnh96 z<;G_W@{zJ3YylPj5-v>ZjTxbpP*T+*ganpLii;vx>uzsORioz5zA5H9c)p3 z!13gr*0m3<8wWsa&KOo_H@hp0p0Bg=2~(?(~E_L5>D41AZdDxS6vJn@KR-6OeB zeI4vq?Y@t9mUV5zE_eq>BrRZVROi zZJcXo*2vwbA&r4ch!X_kc5u&Sr}d;00omP7#09*Bj(JPX9Q)ie6nVXmFWX~4C=JfC zTw}hDZq9~FzGz8xZn;ZheTzBh-fd(kcQ)I1beHTAfSxic+ic(g;IPJjKU4U}(fVJX zF8qJn$UIDr)N{R$iRPZ-4>MGQPP+xU1b797UJdjFoI7>ywEAHKqvIy(+Sd*vj~W}9 zAa!nN6f}!_>V5Bd=XQ{%AHc~o$TRS^y3@_z+j{EYkgNXc=dSvyyW9#y`HTM$-xwV} We7G;6)j>QC06y(#Q)G4J-v0o}x0zo6 diff --git a/applications/Volkov/artifacts/mame-p8/masks/clean-dss-return.png b/applications/Volkov/artifacts/mame-p8/masks/clean-dss-return.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 diff --git a/applications/Volkov/artifacts/mame-p8/masks/edited-bin-mask.png b/applications/Volkov/artifacts/mame-p8/masks/edited-bin-mask.png deleted file mode 100644 index 63dcd255a88660712d455933809ac90f45211238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9878 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 A0{{R3 diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0000.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0000.png deleted file mode 100644 index ea147685d4d290e065569248f67e70e6aafd5f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8389 zcmeHNc~FztvPT&Ql@Z2a1{4MmL1hoJ3xp^x>;ze4Q-TA?utwQJAR#J)3?Lv&K=wfi zVG$4!V%Q=spe#m05;h@>Y_dy20@=t5cxUF;t9RdDuWsE}HC3t9`M#Xf-KS6ge%<|j zNp^IwJg{GOzley)0c)#sP9h?r(jp?ej_lnnyi?&59w;JmMBVz_8JC!%D)>+%~O+AV4CgQR{85IK? z?+u%3zp71!|90Ez9Ojtu^~rOu%0#g&*itA2`p!JKw263Xqoj$-N3gG-f|Vj!-f{Kq zM1DsE#QV6^FW*}1Rr>NZTPF&g?-WzaS@;mQ+MfE&zU}*OS{zEv`85#!LJwMl#$SP9 zOak5&dH7lFtdfZ2ZLR?jzl#q}DO;wy)I-=kZq-8+3dI@g;40=;?|sF~%QWV*PZaNs za>k?jdJymP%c<9?+dBPDH%c#jz(-IPGve1DE-+{N3%MJs^%C&{E{!k;T!pXT=c=b_ zYinCqS{6qFO639GJ7$VzX_C9Tx}JWHqj9~NEqJ^~yE%V-kg_<^7+|^YhaHBI|C)5~ zOsLEnXEFQAI@7BcMx)Atd*w8qmIU2}fcEQj%b{dp*M5M~F8E%ZI(9(LqV96=DVoDn z6>jWs5{XGv*hN6hGlvN4gc;L#72P-ODUIH-ZlRArabkHPgVWLC=#J13!X-Um?&vP? z_w4e!+!16kvasQ&v@|QIo_(586p8wtEOztEnHAR}rUZ_>o<+r4=GT;W8K6xicZDc< zRE}88yN6#XpxYI;LJhW8V5Dsz2Ts3TVU*2xE;T+F&l(ji9|^CD_l5fsvZoKD$*V;> z(!w?dsQ@w^^4z~gyOsvu>$A5}+Gd0t<2H)5&BK){)~}OI>Il z&xXIt0gW9DEY*$?>|QS)c(M+s=NQ?g@td1Z8M{};WI1WnimZtnGi3|x{Gcwudcd%@ z$0rrkUcAdpP*Ty*<2FaDqmrLIshAmc?Jtfl$0qhH0ir~fWDnhJlPcibS0%3uxRhd@ z*&NZ^i76-4nndnoc4RRuhHh=3_V3X#QRc6(Hhs!IT3dzAjvaV>TFaFA=(qucIq3XQ z^4n_%p`BVY=M@9zz2@Vj=V6v4dY5xkdhTb@rn$kKzBVn2ev7F14`7QRTH6h9&0Riw zmw_zfiP!y-{voi&Jy`IsxXIk`WAnHZYzWwz5Kv`cz`YctLUZt;)3kr!J7nn3+3IGm zJhynAeQy-EIzH&>i~8lcw$p`cy}?nkfVX7g`tFBECT@H6pr4up3vy6TgVk{*DM|Xn zPPRE!gb?S2y_zm&`>NWPS-@Ij7Itq)K*Y(o>Pxk2)f@}e`CiQf;)wV3fv#iY+ahw} zcNxX059UMXT5iAn!rwGs5gpgKpc-I4HA{*w-|HF16f!GF4&{p3!J zc$k`77Q1hSv1hP+8CIsd{8a_{J9K;|E`%}v#qRNVjaGl7*x$1x?9U9i3^f*za~80* znVJb-{6-46KDD9T*qtWR9FNP2ZVxHtu;IbQrPQ{&=BI!DYRB=Gf$^7&awVC2R)Y^X;O@%ao=S&=*3{q=#KXXWHvCBBOa-=!Mh#wuhtXetsv6$b5l zi#T~zU9IAF{!i0tIkOkD>1r;=6_;j`Jr*VsR)@U#mT-p)O=k)aS zgs`d9+$V`IlOzR;5J4=BJ7JXcDa6Jmw4PZ&Se)y)eAU9BOYbTqBS{xu%d}Lyo#_+Z5LTw`-R9oDGSWDQ$@8w3xa8&r zE;ezMH)E2WDT|rPmeoVuim0|&VC1LwLT2qu5DV5q2w7M#YeZl(>ru$g%nV_GkHfBP z8Dat8!k}eOsf-Sf`%-K+?w)*t;y&jk-jzx!cx0$kHnX#;;kp(7wrkBfFHbrgmmS$idZgf*>+%{ImxxJ9B z@Gn~B-D)Eti;s&}VMd!kVk!2)7N$LISlhmy-Eo zDRSabGd<{qC|_S+PIOS2aJz1oE~P7iyya;vQNa-rjk6XyPoGC@Yrts5E zj?=nTPL96JpU*1R%3GL&RdfUgo>gCb`O_OBA#uqHH#^Y4fR)*7#4U$hba9I2=u0H{ zbRBnK5Hm?}gS4-9aI2?m^R!*-yVKdQ(jFw#pP%T)g?n z5cSaYUH4N^k&nD8<&47G=sg;Rg@qd*BEU@6^xNz~dhk%4z2v*1Q+hz-*!52=7Aslm z#5Dk|=`w5rK8KH(lm34FO_tM`|63anz5?{^&piw|;z{ukYrjlkqmZ3)T)Jj!qEZ{wFV!HPT0p%35>-mpe0&SOmkwEk3PB^l=DiYwk ztVhy3Tv`rtpczJART5%lI9Elp>= zy`NknetM)=Rk`U~qV`{#2hd5qdLWK%Mh;2r>)N$Li03}}edRORXs}1e!-4KXg^ctl z@ueu3@a1i{m*nTODFJ`p_CaAcZ4X6 z^XJIcPpA-?}jvLg14=?vUuJWmH$2krPl%d2D zAfSDnG@T}J+ay;xQ#zf&K-YGKQ{m;YNZwj^&CuB-iO`S`a(q4SwG8Bu_cjDyhyygu zSPd!|X_3B$n*h3sDQV8Q$<(R%f#V5#f?&d=Xdv5I8XjDOYh#;ScpO-Obg#4_f&>U= zEMvBx&)on|aG-aFhK6c}8Uu)z>hl1Q2^^HhX3PZu1alyP2fh--p9c#IOE;Mx*}{A* z^!oh`=Sl>gq;8$2Z$A76p*}Yif(XhoJW7EW=A6n(#{@WVUZv@}2RGmw9Np?JS9u#5 z8dgBD(m_#CQU3ljn`={)wOTKnp^;I&ce_a(yB9!cgRM?*R|x_bfje$7rQp01h!OlN zl{}nYJ|NN)RQEN`k?n|P<|Xk|Y~P}cN?nsG6&I5 zCVN#{4{n5=1tu2wX}S3FXOw)e4kj0q-xqO`gFf&No=_>)umD2_5_cI6M-8p zP;iOaDJ??u^62_xU%uX8!b8i9FetRt_{Pz8A&Cmuz8S#g=at>)9Zk;&;uw7Sn(<(T zi{*kzs10q%51-}|_>mqF%&yAVCX%o+M|?SX_svrmcrx%bbO7yIT~jh4uLQSm*Ke?r+uh=YF=R6Y`#-`|8hc3j(u!CQ&D zKa2li(EqCP-=ajgFV5#AkQs3EeUf>3m0)6{V?(c$-De5n42)-iRYDvaK__^>OQPK6?X<{cXOj#K4J8!JjDg%Qjn%5T-{{E52o4H~y521hGh%y-NRdsH!g7 ze_s8|U=_koqS_$3Jo-;-{&g%1v8Dbc&u$~_pTYERiR{0X2s7S)7~A}PCV!vF|MP_T zcL@I-!vA?8+#Km|w>5P0b9B}HbY$KGI{t#I$u9!|-#N|tl?@Y`8WuO8%S*fm>hdo> z>Frb7$;DnRx?!yen#=MYvd=0I@r_T-7>Xr$PgNFleyg@$fh$AbDQrXMd!8*Hf1wo< z&h5@}(Y{hsy72Td)oQBB((<$4!T|nAm zp?OzRXXli(O51Hv0*a#TF)6mxgQi3TM8|EGe_nx$`&p2?vWK;rm5`W%#W|0G@mNiJ zFO%v!ct+5u;x&AL z1Q3ZPq~ep1y3%7+>2&Ewb}97Zb$1Uez1%96uZkC3n|0J9rp+wT{CDGrbZoB%uHs29 z)2Pv!ac#N9;8AGN^?p8Z@L{A4NcFlH7iY*KVd`jmmLT_c;fFp2?-dd8*>~n$ld_fb ziHNsLt_*FkuRFr5N6q4DIi#rIJi4R+x_;2L1vNJ=A$uh)Ul;vq-TY=zl|k!yTP39F zYPi~+^IgvR7gcZ4djY^PIQ}T6W!%V94-+DGm^`h8Nt|DEFF3Lq)E_qBRH>D^C&zX` z`w{JF@b_L$ErXaWf{HU}P&~*5$1f~pk+{!q8{n@rCUT~Rdosu`%FsS$a!Qdt(!43Z1}L+2LdAuD~Mst3WL{M!jZwsJaxR%^pa$YuSm=F;fu&X*z z-%C|~=;`E5nR=d%mYs#K_q`KM*NlMg0EwRb*EtzKWQ2zYU7YXDv^SX5Xgn@_UcCQN zk`sD`)`cq`JM8Ai|es98t1_fGt6nRQlW9DO3 zv5oj3)%}}smzH|iFI6k=-+jb*Kuz^TLw@Z2_~Od5@?!q`tOyuWQmj52I%eu)2!v=^;p zpkUNBC`*V}FP{_(A)Jg4G(MkZlx`7p0#v7O_{)dD+if)lt@AfH&CRmWzl;^lx;v8& z-F-qUNmw@1w&xWXGavrEjB9e}XbR)!&Yq93CbEYtooXJ1K;YGti&VO~mXX5H9kW%l z=1aCOProTX{-)Klu}}dE)nj55812{qbSIfZS*Kw6yk{g|BtL9H2bv$FznsU?=uZfD z%&*|Ad+9UM()>pAEYz2coCysGh3vLCb-l`xE2`bDWCIIB$}__DS;Mf)qEF8L?l6YD z-n>ZVu(kD-DNiB6*vQMkxieJ=ab$Y%u>xbc6NJcfrYY=I!(8g7mxjg|^e!k=XsMkQ zr>5Lw{)Wj{{14QY%Koz*#a%c2wJ%<{eea;b3Sip0hirqTC$gQ{I-HHdKy_#P1vd{A zt5%mh^1?27{NvE8L3b_C0ySQ5ZEkF6{eCh;&l|~OJIJ+Wj{@YcR0P|5AIH^zxwR2q z`ce7ua*I||Jw>5uUnwaIK_(lwuiy6UfrwZ5l;R_pwtCmqHOXVMyUJYnpw5Be(TOd^ z#%{RDW!J^v>!jaRrvS2>yiY%(V&DGy@}h)N<6gaGKhKp@69}Dz^1gS|Foo6KM**Io z`7vs*?T{-@DJLB^JWZ`Dfbd>A_{_U(6p=`5qGaRT=ghcJnXrM8g7LZnS_NsH1fPs} z;KgHB19Tp;3G1P7X_Cd!!Pc=3QNsG!`%_8d^QA z2V_4f@*K5}bjx1v#q?jx9Suv4d|MHv=si7pFD}aK6seH<*pw zls^h6NE+?4t$LdgT$v9DwU@H4P1j$>FsLT^Jr`sFYCwe|iBwBjiz%Lw!$n_gqk+N2 zs6xR5<~_i?2T1q;lASjS0BT=RX%g`)T#(KnKQgC3V4o`?2OPw92lnQ(TKBw73>(3&K$+01!>Ia@NOw>}$6eYtS znWwtbET%@ftXj0r@KuANqG>imL0zqHHgVal7vf78Q?e?1YLQJ9zeOo{Ha2du!J_v@ zGmpdXy)Cum0moKPr93D&kGF~oT*Cc)A2|y_)#}o_v~wDw+|5Yt`i#M=6S@pXGWk&s zJVd@&cMGAT`s;e?vrCX5705*BjDN1rz;U~zLC>-q8?3{r=9@fnREeNd>S9iP4M59_b9d774o=?k{40#{T>f9c^7>qa&(6>GgebUrS{tj*NIr4 McQ{vP;dA@H00AS%TL1t6 diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0001.png deleted file mode 100644 index e64dcf49752853a3fa30286a0208f4761e8c6d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9308 zcmeHtdpy(s+y7KjRwjuMD&#bWL?NaSp;#!VOg?gEE9bLL^2wp)oWxq@Fg0@~j8aj2 z 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

      PxGg~s@h>kl8XgPY6L|dd^qFCeu)1gL} z<-5mh)UAq>55jn$ZeH#1ZY+O;cpWUxIc;8ANl@Vob5b~pv>I^ED6kG*;nvy@@+%x5 z^D4ewuzrFb?0GVTu|nUpfB6g+7vws6-ypY4ChxS)A;j?%tg6U zZSeTFS4K9(>rfkuJ=19`xl|7uZZjttkRpFOu+;=N;27ntbD*jlZt3AZmmV`ze(bqF$GEAO-kJNZENhPnr;9A> z`Gdj*`_c#!tJdmHty-MNI$}2<7==K#5hdumyS>S6ll=pJLhO+4;ODXD9-{}-Qc0L{ zXAL?-eh;LW*bw+&hW-JUAZsz2TcS3Tn1ar-T&Aa&5XG5x1n@Yyw|hsfznx=^Vjmc~ zl>2ccp8IYYkyx<#sIp?e2Aw5IPd{GSWznKjS=IcVl4XD558Cy|x4s=YCK9Y8gIhoB z=@sypXzPWdF{ht=MB4JVI%dO3A5!eg>onf)^`lFLK{dS*(_fTw(5dQpE@9`w;vj37 zX*QU2TlCwphxyjtL3s-oY6fCarf==09M+PW(^_$h8Vr23#S?^Px~0nlCsE=-WFAD@ zRo<_yb}}XI;d34rl+8i(ag2wSsD<}BBk$22$r855dUrswHu97HlriV3nErt0eLoxT zptpW2RX0!i?9R|K8?fBJw^=E!;x#Sp{0kq{aLd~>Y`$6 zr=n8T1H2!-sP%$?v;JsLoMbMg*u1phKXL1)LkbYyx?-R%{G$RH+~>} zcD4@twpM=LmT4hwW6v{+NiAk3WK}G5nWt{#J+f@MOfsHsvHixBa<$ZrRsE#s>2WVY zp|%lf?$!SN3VCmt0rd(w@J8rFFN4XSo@viSETw4UbEdDQ4jZ8Sa+?L*1Lm#VD_m{a zaDUIlM$Xe{PQ1=GCI*T}29U|5d(<1ej7r}mEFc+ zc^gR*M(mqu#i?%HHO-7RL?T+*Mu89*PZ6-F$b?My-b`DeZzxGA%sY&EBb_AGwVx8B zr)E;oN}-uU#Sm6?v2S;`{HPK6{GuhqH*v=iSx$Fp(B;+B?>`y4=Y2WoPC_f|YP;?R z`knS+!6LT!p^LcH^}XqB+Tstr5;Qcw1|-bOUX0MuZjqEw<9x7!n(OCD=8fkp_S_Yb zc8wBhT#T^c5A9yv-{7mOL$9AY8ADv<%NlIHH2Pj|W?Q~;V28{_$LPo>x&_FxKAoHK z%GEPL#E`63HPi72NWtc}sXxQ?R=-n49JcEt6Smf~mzW9MZ z^#W6!$)K7Im;K_!mr?@wmOxR363}MR8*MQ|3I+C#QsQdeyN7CbwPKo>=#!RS>rAGi zReJN(i5Me=6p};l8#R2+8}jK(PbQ}aSI&QQseVrjI&YgU)M)W&`zINN(PUGr_^RXP zuM8wodK&|^y9Jw&sjXanP9hZ@HI{82fNWt(RF0gL*)~@^T()%Bpx>c_4d~mVEFpk&&#t4XZY+tcldE-s0N#Qi0w`9Z%g$=2QLx zvD6axJdW2T9prR#x!t1gbgOMEtJ zB{vs6(>=}tv2o?>*4Q_SR;tAo0fQL%WjnU2aF@JX5~ycbg6;P@eTCz8+{EQwZ*kMD z(I~Q5F*y@Y1#6MMAX1RgI;<-f@ldy!I_#7tc;> zSGc*;rzLkDrb{U;9FEsBTGw5pX~kpGOGa7G zc&oN_U?tc^!ol4=!3nhUz|l36K@XL{=Y7Ga7gMcNJ@?=L?CHxtM2H;w0|axb{WPr? zax{72Kyjmt3e)nX8%r#}_KlrdokTd-7MQ88BRyX`S;hYPcH)^V?s(tb8 RW}I~ZlXK>V#roIo{2w6ZxN86a diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0002.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0002.png deleted file mode 100644 index b10bf0fe8ede054d1955ea1a39a3a0cf68d21543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8471 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 diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0005.png deleted file mode 100644 index 9dd7b0598ce53af9b057717d28577319fe3a24df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8329 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 diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0006.png deleted file mode 100644 index ac231903b5640e3c4523104ef3445e37cbd93076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8287 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 Ieg67?0Tm$ong9R* diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0007.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0007.png deleted file mode 100644 index 8b2b3abb3720cd6c33e8784c344176411d65b41d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8536 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 aeK@7BuTM|!u$Ha^SXtU#sxtSz`#%5^zcyn4 diff --git a/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0008.png b/applications/Volkov/artifacts/mame-p9/mkdir-run/sprinter/0008.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 CdQenBtx+-<+-rRGt_t|Ujwb!YW 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

      PxGg~s@h>kl8XgPY6L|dd^qFCeu)1gL} z<-5mh)UAq>55jn$ZeH#1ZY+O;cpWUxIc;8ANl@Vob5b~pv>I^ED6kG*;nvy@@+%x5 z^D4ewuzrFb?0GVTu|nUpfB6g+7vws6-ypY4ChxS)A;j?%tg6U zZSeTFS4K9(>rfkuJ=19`xl|7uZZjttkRpFOu+;=N;27ntbD*jlZt3AZmmV`ze(bqF$GEAO-kJNZENhPnr;9A> z`Gdj*`_c#!tJdmHty-MNI$}2<7==K#5hdumyS>S6ll=pJLhO+4;ODXD9-{}-Qc0L{ zXAL?-eh;LW*bw+&hW-JUAZsz2TcS3Tn1ar-T&Aa&5XG5x1n@Yyw|hsfznx=^Vjmc~ zl>2ccp8IYYkyx<#sIp?e2Aw5IPd{GSWznKjS=IcVl4XD558Cy|x4s=YCK9Y8gIhoB z=@sypXzPWdF{ht=MB4JVI%dO3A5!eg>onf)^`lFLK{dS*(_fTw(5dQpE@9`w;vj37 zX*QU2TlCwphxyjtL3s-oY6fCarf==09M+PW(^_$h8Vr23#S?^Px~0nlCsE=-WFAD@ zRo<_yb}}XI;d34rl+8i(ag2wSsD<}BBk$22$r855dUrswHu97HlriV3nErt0eLoxT zptpW2RX0!i?9R|K8?fBJw^=E!;x#Sp{0kq{aLd~>Y`$6 zr=n8T1H2!-sP%$?v;JsLoMbMg*u1phKXL1)LkbYyx?-R%{G$RH+~>} zcD4@twpM=LmT4hwW6v{+NiAk3WK}G5nWt{#J+f@MOfsHsvHixBa<$ZrRsE#s>2WVY zp|%lf?$!SN3VCmt0rd(w@J8rFFN4XSo@viSETw4UbEdDQ4jZ8Sa+?L*1Lm#VD_m{a zaDUIlM$Xe{PQ1=GCI*T}29U|5d(<1ej7r}mEFc+ zc^gR*M(mqu#i?%HHO-7RL?T+*Mu89*PZ6-F$b?My-b`DeZzxGA%sY&EBb_AGwVx8B zr)E;oN}-uU#Sm6?v2S;`{HPK6{GuhqH*v=iSx$Fp(B;+B?>`y4=Y2WoPC_f|YP;?R z`knS+!6LT!p^LcH^}XqB+Tstr5;Qcw1|-bOUX0MuZjqEw<9x7!n(OCD=8fkp_S_Yb zc8wBhT#T^c5A9yv-{7mOL$9AY8ADv<%NlIHH2Pj|W?Q~;V28{_$LPo>x&_FxKAoHK z%GEPL#E`63HPi72NWtc}sXxQ?R=-n49JcEt6Smf~mzW9MZ z^#W6!$)K7Im;K_!mr?@wmOxR363}MR8*MQ|3I+C#QsQdeyN7CbwPKo>=#!RS>rAGi zReJN(i5Me=6p};l8#R2+8}jK(PbQ}aSI&QQseVrjI&YgU)M)W&`zINN(PUGr_^RXP zuM8wodK&|^y9Jw&sjXanP9hZ@HI{82fNWt(RF0gL*)~@^T()%Bpx>c_4d~mVEFpk&&#t4XZY+tcldE-s0N#Qi0w`9Z%g$=2QLx zvD6axJdW2T9prR#x!t1gbgOMEtJ zB{vs6(>=}tv2o?>*4Q_SR;tAo0fQL%WjnU2aF@JX5~ycbg6;P@eTCz8+{EQwZ*kMD z(I~Q5F*y@Y1#6MMAX1RgI;<-f@ldy!I_#7tc;> zSGc*;rzLkDrb{U;9FEsBTGw5pX~kpGOGa7G zc&oN_U?tc^!ol4=!3nhUz|l36K@XL{=Y7Ga7gMcNJ@?=L?CHxtM2H;w0|axb{WPr? zax{72Kyjmt3e)nX8%r#}_KlrdokTd-7MQ88BRyX`S;hYPcH)^V?s(tb8 RW}I~ZlXK>V#roIo{2w6ZxN86a diff --git a/applications/Volkov/artifacts/mame-p9/mkdir/duplicate-error.png b/applications/Volkov/artifacts/mame-p9/mkdir/duplicate-error.png deleted file mode 100644 index 5da14024f58998980abaa87bc5a0664ec2d0a5eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8461 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 Ieg67?0Tm$ong9R* diff --git a/applications/Volkov/artifacts/mame-p9/mkdir/invalid-name.png b/applications/Volkov/artifacts/mame-p9/mkdir/invalid-name.png deleted file mode 100644 index 3685e64be3bb1650e20412a275074dd6c2e90049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8581 zcmeHtcT|&Ew?679DkID&f{kJUqzOY2sTnCEAO-^p5^2(jBq|*Ou}owH1q}ftln4^4 zfC8aIEQ0|gln_8_l#)n?gai^&ZeYGU-`u;_UH6Z>)?L5y{gJG^?d*N_e)hAUlk+}y zxNN;|?~%P?Vq*JjE?R=b#CFJtiEUHdy^G{HWqCg*jxA(t)^uw{H^CjnQ2RxQWd^-Oj2FRfI>S5w* zii4E`>^pZHv^=4v`TqV6l@pS3=lHCM`QQoz`aHgSm_8cP?K&6N05kMTINcb8 z?JERo>7LrUDsB`$|3$WC89B4^?PGi?Q47KO+&{_Xa@$i>N*|UwS3qywI(F{%OQX2e zUTXsb1BIxm=PMIdn>KY`MoEOR=Z9uj;sHD_RwR=~;%}@uixW1+md2SmYbHV-vwvm! zbNW)lTsb`_2HF()^QNCaUaWKggTZ~Dmg3eL`zP7#aMpUKZnsmie^=IFC8sU7)G@UV z#>U3|lNAX5-0U51Z|~vt6fDn&O-4${mJt21vEgWkt#fd1C;cTKO{tym@?k$=0l z?PYjE?)hc9=Ui{8EA8BcYR3k6z^Pn zy1=;W9J(CA-n~AJ7>}Gp2&&-3WXoOk&UgClmP*>vj8|ETi1rl|gIJ=FAob87`yhef~_1$M1VxN=J?zf`u=yphEgwI?JyhOr3 z+EzaZ#=|WNAFsD&d_lDM&l!ZKw8rkm8R9~@ZNIx}P=X~!Ckh>!X*mtDbKUlfS|q$4 z|7UVh|NGF5(2^QeTTQg!VNp&9(cFrR82pWVE@J(JVqgSD!4{uXv0`x;n5H0Za)qmk z7T~Ty!bTR`;azA1{v_GVjUm|i-G*Gb%9&Dyy+92H%Y}UN%$=}NE34lAht^jLBtYkR z^OfLE+8xFpJ|>{wvQLUzT)gHd2wcGNR6Dvb&msOet>Nc6GHO)>%CfZTp4`*~bM4E&A5$|>|&=E5$Qm)EkRuO2mJ z@-wxbnw@`P-L$i|TDBRdkF}*%T_hNjZvk7J8hiG(HKGQ9$;#8P1x#0&R;vZ( zR<7z;E`;-A@WJmlI*aGFaqDQ)@5w%j-EkL?}-8v#rd^u6YS ztu5hRCPGygU4SSsmA6$Wu64-J`qk9$YSr$I>SRe7wVdC`4RH!jpE^C~uwAiJs#TwO zrJmb1r{KOipx++1G{AH`O;Rm=_W^)BflGR4-kRbtTnioTJHtKN+(QUG_Wc?CuetmF zIrme{oH4pYfz8O0x$mbvmx`6t_$OffjG5gUP9}SBV^NI_z6R0X(2^GCuawMP4PHfa z4Xj_e?D`qD>2Utq*QvFWOk(>1FaaFs9^F6AVn#toK#1D~tm3KnTlRaYx?-M>A|;@K z;$p@wwGL7M-m-<1Y3SNm#Ne<3eEB?IQDNf?QRWExjtx%p6|3;ea5tz!K(ebAP>i|C z*Ci9Vs@I|eSNE9jKZ!LDGz$X7?M;1bedN>uddZmhqgNxbADtNXJ9S$dkkNeBATZk~ zjL&7^@pumVbGnwg^|{dRJpdu6d#!mXc88_EBPh^#v6eO*yjbn?Dl`*1wm$=6rG$+a zM1h~{MgP%8MS|pkp#+K4C;oRgP-(lcOFi>aV-7O4c;RQMMzHX4|yW_0u}W4$J}Q?KMf;_(qrbrZRJ7)0^}qbNu3vKt1R~o@GUJZH8rB{^>%iBpbR`R zGLq_r0r2~jRzBVB?2-5Md>pcalpcAiSD`Ah~v^D$slS{zWqH@Ni2_)jaV-6IL7 z`sBg|XV3+vA-Q=)s0EGT>6i82Tyq$VDRI_KdTdeUf~_a} zk>8kk?p+()PO*^Xh+Hw=17w0qakVd6;8X&0b~g~-aiXty?Ow$i9eNUS<8|!bR8CRx zh#*@5a3J}8|4nROYE(5o2v(j5hY9r8!KB0l8f5@ES9hbAZfWT)3zfOjODox=UVM z5JEAWE2^9ld@Md_iV4d#+NC)ry@8M|(euV^Jfy{K=Q^o?^Gj6M%xQ7Pid9?02^+QNnQkb$3R01~E z3L?B77w9W%IMs{dNyU;EQHxcviv*728;7&)bgFq+KA8Fai?GoFcM!d}M?$wM_`&30ThYeW&-I!Cb%tbOAr0YwXekf;}jj@-mlOPRNvaYvvqg3(q(ydt^N3a-6WS7T|nkkl)FLC16c5kFs1u@GodKVZVAX_s=y(bn4difi$m!1#jM3A%`O z$GuuoD1xgs^tsd5{b$UcJtk6u-X{A|eJ}S`L)_gM@J!+>ksqeK<&RRPt36{8R5u7# zK)OSkNi|!4FD3aC=K4R=eRIsbS-_nWDaD33K6iL{7``DAZu*5nRt2K$vTz27XlQ9M zyL4}tQmTwt=Py~vAbx-Yx5$Qh9?5XTSU0+W<#@sP@Y#c%(sMFFT*TDE zP!)YT-6N-oBixHMiK;Y;_cHTRgoLK3C$G{t6ijS4Q*jsBT<0v60lGoTW8pS7=&lDIm9 zlyxtXhmAMYBZPwX5g}=rM)PAu(mFF{SI8oD!(K3sSRCce2-k@KHCYxBAXriN;B=r) zDu__B?cFg8#NJexv#V0zvnlbT84=U)tahM1=HW%Y^FH6F`Q9_SDzV=#WW2_I`EO~+ zxxzggz)y8{A8L$P;;&JKBUC|n@ttJV;%YI^r1J<_HQ~Y~nnd-jJW3NvpYyC2N=T9&!E|~{jwvqS$gyvpMhf3lI13vhtPJ!PT^>|)! zGCtBzWT5EAR*+8$5}SPJoWhK%Q{Y#^8~KKntH0Rz!5x`RaT@nwkpB%FWwXLl+=*E=dr2YHt~KRxqVqeB!T{W zlm9D5MDyY<#{*1E*L&j4@@ItOq7JW%<#bvDxV_gus{lCd*78w4&%QpfRnz>(6h*?p zL&zNzH(S0x>*-%;S|>_kl_=}$+(CkX$Lv-B#5DzRs0LvI9;f8avP;>;zduSNWdcN$ zQSz`DX(X!Gfq{YhJH!hr%(&lQWoBkpNo9mbM64~0ILnRRA<6+wSx#Zg6Ny^mQS|Ko z_s#@v|CI>^i>>@`hF*jQdRMk_40~S1Y~^t=vLSQ^ky`Gou9vv8z z3mt2~H#f(!X8UJKyG@vvwn$*6kIJJN^iOWqePK@YY&Sv>5(XFY*9enxOGWb(QG5NA z@ox8DXlcEVERiR$%3yp^M=zB;_M@3Pqh!Zfe2+^m)RX%3^ZHJXxV|Xw(RR1qXCWc8MJN^p6e+^KP zq}Yc4ltlTbH~*oY{(mT$|CPG@my!STxbj~)`BzTb zUw!xKAO*b=vg(r@n*g0>$eY3eS~-<~caBdi3Elh3e?MkRu?Ej{)GbI>Rz~;)PGH#I zDyxk+Qr$0Q68PW-1Z2otXfD5{Wi{On*N$1%?F2#*VAL=!gjEbZJFv^9#YsZL5KU{~ z*nRwPc-Z_c!fvest>;^k`E;K8?%&5Rg3ZwSu71hmnCOkryUA1piwOE`85bWQcO0R4 z2%Sr4^A^f1P|3~j1a5ak0(q56W;-rArcu(8N+yh9I(C>9*}D>#!=GJf+aQb_?R7vw zNv77m!j|Gn{>Z2-thP3}Ti|BzmHQy@3eBiC-kI(%H`Db3Ht26N`>JWDdSYJFV|DKx z8*dPF{}L)8<5&z2Q;e1BWBOqKLCc8)skgs{(j4tT#~C1uaxC{4K8hGYjxfqg{3pIQV+D&t+!obr0mRElq~vdgVePU|^?Z0MZ3{AoNsAg}`+Bft%?>PPBg zWZdkIdZ|V$}h4$ zGd{RADDPA9IHK9&q}_)5(=Up=u5af{6=n;cAH_04NX#)p6#S+AXgCqN}BPq}k7Y*;odFbkhUdgvB4#%_W# zZ~V54{6kcF!8=eQ%?02JiMcYx5pY%_4%W`|;H)V1W@ua`M?f+oNvFEk>g7N=6ps@b z;F)4S9<=auOq#sGoKkjW5zmeYvYSIgzG)uM$(vg|3o6T!GnW%V3#a;ql4l4lNAcEi zgZ-A}O;CoksyF9Q!bJBC=Mc^5_4f5lEgPn0sx(kg_r0Mk3SwqoBi&l@ynsNl#$w^N zvZ+G2e1cBOV@Jf8}`|=zB4(+#O=tbzB6t`-C??hs!u}%{R0Bd`TSf)Y`$G50X^S$1f`6kg)wD2 z)&_q((`u+%oUSAAnM#x+=))R^^k#`7s){~74F{)W9JWr-J)GkQ;-u%Vuu`lp7Vlw{ zzfJ$i_OoZkyyXMG%9@KZ<;w>wOJC=X5B4&utC$M3WM=5O((p25UsjTiAn&o1HGMs^ z@X0y3X=$BAZQaX$Q#nkMc-1r1kWCz&bLKcBkJSesj*gybm_3UmbI#P%;j11cBHr%N zuowNGl|};qNI8Ahi+IO6D|$@0F{I8OS8q#yEM-}{9^VyId;RoeaTp}0vNNpT>j#L^ z>8J0VcoL(8vO=j}h9uixw|YdUwz54u1@X#J^{#fkN4_iY@-FOk8%+Oe-(uD6g&WKfOd0{4>Ab)HIeB4~NBc+%Qyz>(6b? z4Vn|Y-K1XBWQ2sG!qr-(5if|Q_PXTC9CP$YNC;Q%gjR=zCKD9MV7fZd?5z7NL31Z@ z&3dr1b|*=c32rs=Td0c(SsKLw7Mzai<>X+B8m0*Wrc>Z(cK4Ju77@rJPm--b5--Dw zpeq+Y&YsljP+{boCDuia9y8R9s}+kbpS(_Q&lgnd>tZGaBgJ3=QL8q~zx#qtaw&$G;x8CI-8 zB0%AdvOr`v4AgjY&Vh8#xFRL5jk%&ooUQtub@G&l{RMLHo>~7ZbGk8V*`*mvI+N7E zQGG^KS2yIiQb6-H$R1Z_k8AccopAV`UJ`l=c?$9SdQ1{EM8?WAF{ro6meF986evH((8O{*`$>}bVyM$P5Rq|OQsKl{+v zX$PR@WrTl5R0;Ejap;<)J{6(dKsTH|Aci65JL!5tOgQfo&y-}y-Yw|DFFi&c5_@#P zm42b-xY(23f7`VF`v&*Fzaa2GIoI}Dps?U&c-(j1XrJii2l-GdmrzHTUucBaU0*T# z^Y&JX+Gljm87Q89e7eqgFw6(Pd6G?WW=frHRE?btHdp`I#VNP0L diff --git a/applications/Volkov/artifacts/mame-ui/selected-footer-clean.png b/applications/Volkov/artifacts/mame-ui/selected-footer-clean.png deleted file mode 100644 index 4526c9989ce5a540f1931382830892f7c7782250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9202 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 Kr^|p|H~#}xg36cx diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0001.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0001.png deleted file mode 100644 index e661562944febda12c1811a84febb2f961101065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8715 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 Y%B4$}24Xw)So7F)?ik)KRkx4$FIkX#0ssI2 diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0002.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0002.png deleted file mode 100644 index f9fe8fae566792f4911d47a4a9c6d8834fdc9166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9093 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 DFoaTW diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0003.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0003.png deleted file mode 100644 index 0349009c50afc8b4d82e27e9090ade11dbcf34f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9234 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 L+Y8lZ*B<;YKcn2g diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0004.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0004.png deleted file mode 100644 index 1b20ed37eb153880cb250c55314bacb5227b4500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9087 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 WR8$;K=s&mvhl!!(m1={VkNyuz{8YyP diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0005.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0005.png deleted file mode 100644 index c43b1edac9509549fa402c7e4530b007886247bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8861 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ý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 OkCB1-wMxC)QU4ER|NNT( diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0006.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0006.png deleted file mode 100644 index 9929f6e4ddb301d18b48764d66119aeb61d74555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9838 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 U(9>=m#yo(Qy6&}7HS4hd2Ko>jr~m)} diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0008.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0008.png deleted file mode 100644 index 5f2b8a53a8cb401b999c3c08052fc6a9353739c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8907 zcmeHtXH-*L*KRx<4=O4a1d*;%q>F`46jVx-j&!2Zj0h1zkpzf}C`ywqLV}1$6%I8( z2(cVNL@AMg5JHdu0YV5Zp{3k_=R5EC#`x~I_s9Kr&!0W^-fOM7=9+8HXFhYU{lwPV ze9x{Uy8r;d9!rZ0_5gs8H~_Fse#dWuH*cpuiSeEElzZp;s7;u<~s*0S9Yey#p< z-@e^`w9j;h!o#gg&j;4LJAD4VaFNN%2!g3&w$-v&=}>IVUChR}M6E4Gv@Xe%c29pV z&Xzo|*=h@rF$|v-0k3|D+L-_Okx0+Rb0%iO!opbN9qGijOf~2J{{FqvdbWYU^{GNS zot|Q}_&Idp=;nm_wq#S3F`@y^{V9rc!Hu*;!uUKcv5gtCf?a8$8FvHuQT4d``mh1d z2;-Gu*!NEfn`(}qON$%&@#DF!pd00_m#(gE`G7w<@(tV=Hu?2^@dY0Fsuxjd8N=1Xo_a2b5PVC#KNT--la-Dmo_ zprQ6IHED1!o5wDgNn+U)QLVT|W-2I!15h4hct~}mHOa?2B>S(O3K2nx6)EYQDMs)c zg$OPz`J4xjmZZz00XrksEqrY6`Z^o0l)adxG@P+Vmbzc%Hy;YX$KCZ=JN}6~+tN=_ zy{fJszkF5lR&(EpVlRIr;P4?auR$kfuq7kZu7f=;r0k6}wwT-XGgaLYXE&7PkzM2| z38TIBEt$5@4k(x<0}^MAAvzdU#mX7WWyzkx5Kq>`r5iN z>Q)pOkWk>#%(i}!_-?L%|IDh|p(@f>k zIzV!2%yEgh)`N09v0c|fl-9|N>0d3QFYZ&?GV;014|F$qasPru`fIM^xg&oq($$;r zvG%+3@YsV}x`@Q|=3D!7tNSIi0#uTM@GMGpoojon3dZ_oY1cc4;<7n znw^SH(^b;j-}v_06l8=`cUiIrvcFfl-4+Ow{3T4*t}>CU`TmQj?NP6|BDp(>L=$}x zu4hSC7-7(LCM9kr?*t8su*Z&aF8)-^6wlLH$NcDGHjX~N$Tw)Zkr^sN^g_6lRCI*! z=KlE8cEVCMP|j-IWISgWbc=TJEInu2<@jz&93i6H_`<>+-kjUteg3os9gFO}Y*KIC zpq!6zQ0MD$BqFoIsR~LqOu{IKjJj6vCEd{ta7P#^u}fZaM5FJcD3H@*CQ6Q8At$i~ zaMfe-x!r_aZ5JD&Sy~r)7@ui{RiR#Por>1!$GA)vb|~+#ls1V=`vU?zGR;v@vzX{j zSaiI-xa-k7ul8}x^mec)WKnzOF2+_6@$01y#g(4ehMF3CC}n6!C;84)PXUs*l+Q#^ zHpKU#Y%Ggp>Ri&Db*CSc@1B^Kp1+62{ESp$1TCy#ZLY$v#(y*&X zDY=9Av7jh-4Pz^z=~3dfGCR1m*s0|#RbF1MY=f>ii;h{Jo?&gl-$5HAJDjZ1-8W*;F!@=Daz{5Kx@PJ=i+q7p;?wH%C8A?>#={K8r*{?Io!R9BNl8g-q^3AG zPft%*SN-r=m-=XW|J!fhzJ1XqM(~%5f!s~lHwUiwZenQD%Fy;SE5l`<+6q4|oOWw^ z<9*0QDYSnYGu;I#q1v?L@kW?>pUz1)73aa^r9+={CdFrZ3e0HT`Bi5H*O^1#3V4S$!nN=-p-kSJb3vksQ3jF+c0ngTgT>1>gQ zav>UaL1;^?dlXO8agN=kx88vcOYidJzw9Y|S!vH;D~*v&J@GMIqBEF0JlsMrQGHF$k_daW(>n0W&RlOhN7qC~fckRxd*|8BIWea}IVYGA%1=`8Py^L-yg z;V0ruL|n$E=g`o>t6Ga`3>G<)M+la}N(nsIsqOJF>l!5AXfcN>@*+YcZcz|#fZ_L) zxZmPM#LJ8>vn-5jW%Pxy zq0Z;!{1;Ey$X@z|V1|n)UU>ANXvH64?}XqZk7zk{*iSU3Y1m$(OHLLs)2Q-5u9&jQ z6M{x5!5shLZsWbXOE6fAdx?XAOvqE^;z-%jPMSPtVwie_K6dvmO^ zCc482)<&h>Zfjwc%t1sR?O zpcBzPv!eDRN6?n~+m{Vgsmlp>GM1d5hMR7I1Vax527mj)>Ln3YVm~eH?mpGAHEZVW z>I-SU1!>&#Rx#A4fh}U8>jNECvR}A2-CEpLGPFwTxZO6~gyb028MFI}(2q-(hsa|~ z5e12&0QEUajE8q#kE{FyJlD6365vhZ{ zKKEsn5tK!3h{#xv&9Ip+4BvPctds{uAVLJjc`O&RTJTu5d1DSM#aP1Y2Myu~!obz{ z+aFF|wTEnbC&Tenx!3qVf=taUZvfA$AL0sPVR~j}=EiTKDy4PNeE*2yvFRt?($2H5IMsKF0y}NO!o)} z8E1nwat$=%E`KM|e|~&iKA?=g`wDJ+cYd_3?Gkn63m86KG!w=g!D+RwjuE``t?VIJ z=!6=Sp>;?E_vvmsZOy}?ELP-q6g#2-4#hB%`;^uC2Ho*XK8caV{J9I5hVahvm0;6n zO9O&PEF*|$wb=d_8LP$ca(}W|tQpqVoKr-45h$C@AVtg#H?7a{SKEQA60CM0Z$S;b z_9g9DzO_AMBmb#u?D2>J`~jAs^j$N2l#M$W6BGRbFXB7cFAV9?BC@JmpwbB39JvTSkxzeMQ$@`*K zHA}{>@HUuy1{8_yYb?%ibPI%7ExSx~L}!ZUQ#9lg!ne1VRmJ3Y3Fx0qR~=HK%u`1Z z3itfOO~u&Jn@^5Kj}I^PHXeqzH|2JL{a?73m_6Q$0wP<7T-@DrG2I${LZU|VLjhIf z2ud`O{V74Be4x-gr9UE{FE2pZXgr_G%$8bxm}V8=IfctEt-;Q}jZ{KeO5F1!_A9%b)cJA~*}}*@szmX;!3a0|v>s ztGSEbSYG?v?374bx6=$ZEh%y{WeojnGop53Cu;PfH%fovY-aC8? z7I^xvxRR)xurG-M*&fNKTN+0G(zOnEbjq;x=Ng;BNT@PwlsZotmnVT;-gnV>u7 zhJe-g*tjvgWLLJW+l071wC=Y1oJ|ssL8c@R4C40GY&j~9p`K#|B?$D80dVfcsoI!A zSh<6NLZM_C81qdBS<1XFQM4;n{2T(Z_9U?8?(1KYw+X`jAz=oS{+IUKl*EWqA7qgt zecx#MrZ+%CeAz()Z^$}1ePFnEFCb<OsIfNc zYPS~Gm8>%$=}Mjt42QP86Wv^EM#EB&Kc!1Xd61$bziJNFCcx(p(tH*yvPYA{0rNrv zjNDoD4F@~^hj@?$iko@K_uP*A)pO|*7}?l_|E{Dp;v?Xm!PtLRCkdS zd${~}IwN80t|jBhC)=xgG%|##WBpa$1%R;!0z=wEz8~k4x?)n|GvtO zfW$2U3!A$;Q(9b>Bms_E=rUwhoNZkvR#_k5i=|nK0OsBa_VyDt&Om^qgSGy^g(o&& zHTneLs+#V2rVB_O8fvCjV$q1XrZrN)K&4aFW;O1eV$5#pj;VW5$ySA3z%;ydozucfQKMw3R(Kw^^`f zn+lW<2tFjB1UjUYCml0Sz72(TBb{0Z={6>=IOC|*c@6_h;m!%lb})Cw8OUD~dz-8i9r5DZsi8b89pTBqYZ+7*6^cUf;FAVH~|E%s;eEoLM@K0Mn@ZTlf=w5ZP za~^+VB;eQ67K8aONBC7~{o2I;y?}p*SpE|_|61(-!sGsRn13DS?^N?|y!;z4|9|I~ zT&#{CU-H~tEa|xoKJ`B85-22*oMxyA_wrU$Zt`1Z7aa=td{e}D{eij|4T?S5#u{7= z4Yr%GzP@f$f~tPt>|w!NORrm?ZTp>Ar!K<>DvDq(GU|mz5nOf;#nVQ-_p=4cdCJ(shn?a`M3dmu)Cz| zu0q(up99;b_6XQB&U5Jc0eq3A+6m(?eW0j$$yc6b_Rc;hMLP=C$sfYNX)t~R_(gqK zTA2TVWMZl=xoWv97hM@c{jt~|oa_?bXYSNR>1(la8d<+R;0&yS4aC;WWOzOT3uk3B z$;Bjk{D*)jdQW8WiNoBQn=J>W9@}fy<3uw^wUpOG*eOO+@MN1`3nVNV(#?Mssqq_^ z!`k;#XXzR^-)gT$q;-RPe`bu{2E2rx?b(+!ryki zfk`XMMoWV%T!U4Y+(Hpoc~Y4uPSj6M;D91Mqrna z;*w!zF6_d;P6c!vCa4^lh)=&@@;1$(q0jC_G)>Pn;We((Ry*t}2DbmWA+trM9ETfS zKAg4B=4uRlHXz5kuqfj8&5pFEMAxbN)ZO}7p&ry#5gFPgy4X!-Inn@bt*raBjOs0yg`OlgIZyx2ILKjbw#O`jI0RLG3zCI zADTf)#iop)cVC9M-ZWx~dq17Us&E-g7tzE@N4&vga$(&RqqbjPCHl4QWb*f%`)xNn z#$DR%#_aYgB&FvHD+0eXhCh=~*F*%u@6oC#FlK^udNB2aidDYO`M3 z8g5XYALW%ECwi7bb@c6#(I^!mRchh0nd)7vqMj+>RYcIWgk)tkebjZDbuC#?M=u^L zZ6v^@0;F;Hg_l`+wbr{3d0D-$#X-;3TV_)e6+yDIO>Qw92TL$%9UhQ!j3w6^NeX>q#T6`jtgqzo2cWJY8wS4M%H`DpU9F;% zO`!gkOLp9NMxdev0#RBsUVygg)FU*f4b?ulpx_Hm-8=+60&<}6d#_CwWsb02jvBL3 z-#f{_aUXK@;b3iK6raKsZNq5!Ezn9e3>Ha~v@^}_IZl21~R!-L?mjJ`_g;AM`yK${ZDr<%CB4h$<=N{Vq^N@M+e zX7CX?jaQyewFB}hI?lG8oU6p7JkMuWC!P`S+sj`yH}ETk~PAhZM9aZRS(`y8S(uveYp6gx~Z?U@A&;CVytA5PfQvG(F%$; z3gFgJ!spP~%JnM>5v^2lO!dInn4IqYrc&AGgkcW-yR=@km=`Ih_$JODj}woucTFZB z#zbC$ISF02@UDlckk9~T&DSuZ_wP`}&q?o{ILFX<6jtj-jd9vwJa9#Y%9cCHPf&_% zyaeh$a#)t*a_r^1BMTV;qUGxKC~-*kc8#g7<0|R5Fezb2Cj7q5z3kVCCo3;9&*?u_3t= zNyjF^`cu!SR>tYumaSU_LE+H(TbwigVns@itcHFJ9|#U^OIx#fqY~Kzw*fhF z7xU|7m$UA3GdVw&w370%D6GYiZJ~RKTCxxq#JKC)h1AnN`!N{OF*WLn$hA>}k!hpc zGn8<@wi;tj=u9>eckxBGeNDyl+BQhWOG-=IwS)+Oj&&HH$Y zvezr;!AW2T)$dBA1&>s3VSWBdR0WT{O5f%_)=lp6R8Be;zL&VSamAqHsYip=tJKmP{&zrPD&@ejRz6ZPcMu^GWH zB(k9wT|yn8exVW9Lwo^O&R@AGudS)0rz@{=L)-iG8692k6E}|*e-ZRl-|86&3-t{I z*!qV0hQQ=)Z->Fu?+Mf^-E8DkxQohzb!Qp#+G^pdwBBpcLs%U=Tt; znq>$@ii8A&K%xW)B!mDVp@by&fODOD|IhD!`+uAd=RBwEy;s?Lz3W|PpJ-cavpu`S zc7Z^kJr?E{At2CJVGwA`alzk!Cq-@#eL$cSr!6jCxEh>E&vGr1uxGW~R7*WcDoefj z^``AnAFKUFC)gGyC9FxyorWLN1M&-L`& zf4a{|Q0n*1)7MX|dB@QCj{=1T%R~f2&3N<8Vx?WNHFq(+wJB_MF{p(pQQ9{%P@FD$ zVB@VVNJ1ArE9AQJDU37!<1?O?-nu?Xg~4E~iOys^CRNdXaBy(1xR$N2;o5XQjYdn* zTkHs2II$s6+jh(-OCM1e%KZUGIy4iTLIU_aE*`^(SZ-WyqUiS-^21QgC=_hSIY@tb zG+>}DW<$-1^GQ)7-@g5!2{a>BxM*r>mJfMnhZKeC2TXNK=WY%ia%IfO7YennYUQ!2 z%7;)WR0!E7Vlg=@LB*-ww%LF)Ta*0zi_OtY6crV7)^NpB1QMUOtXQsrOP~6+`8mo za@_Df zqWRj>S1Pcs(jkH*$aMQgA9a<|W|gvege@K~eMO!evA`U#rS5*vi-j=Aarb zu+$1=%k~4A!n46Wn$*4*@S9@bmsC20-^=bL_ulL)DIlvHIporLt*nC zmm}NB%{&Y2s>Vg;nNzE6(aH}JY;t$>G$Sk=mn(8qQOPBIhcuqx4IIsFG28mA^^2=Q zUdVlCAIv$FBrUOD{n;>;DY-3h5TVkqfye2R%V*)*%Z=&wLU6-P$e%Kc%dzF8=G=tucds%E3%HRLdC{?z!78IWt zAuSR$8VyG7+J0L5Aa{OFQ3>%?ve2@DoEDcAx zAitxRG`3T?OwXcld+W4KadL$0o0_fmx6n!*M#CbJIOS4gctssa7))VQZWp?iU4VUJ zr-WAdB6Dq~N_=~fSHDee3Y@%aX0}ST*ctUr3mK&DP_ihUDy*01B+69z*afyd;SyCS z`5+c=pe@98E+N9Ogd5a^C~B5G1&V+)eqT5FA(JYcskVmxMr71~e`dnhX>d;s6vDe8 z97+m0AM)mQ{AoLBq2Rk$CR}py5>*DZeB$*|H|W$~6o%1EWAU-PU_h$!rqpu+N;vFv z(;c`0YVJNGZ0>UPI(go8;>Jkavp@8jtsv z^qVuxEG{S{xTF-jC)=Oi#@2z)sfDbwUY-Ky#|H_q)@W5ZIxy-8>K+i;EOteOGFkB1 zUWqk|A%C@Hxf!~pe>LUm$b}dblX}YeL29me_SR!xndkKS3dWQTkRn}bS1DShvIq~= zm?-KjxH)7_xe_-wLH+R++q3RiA|#@6wF<$W4OyK`FOS3H@yW6_*N@s5asyeREAv07 ztZ3Qn5*P3>z542E|L-3jV+2VY;&RJE95jr6&(-na!~o#a#n4pi8k{5Qb4~wYQTysx zz2uObZEKCTSoVDCxh{Lb>7ECKC)4zZcXZ`!33rDQOVy@%BUUJLs)x&2wm%BsRBQPV zi^Za{x--=Av_h+NHk}YOH`=f^7c}bM4xlc3Zj2M-y6)bYXag+MlW)g}__t2GBqAQq zKT1mOXNsTU$61^`pw<-r(4FfnH#2un+wX2B%XqiAk(G*#dLOp> zkoCU0`V3MRZChSm4mh_{ zd6s=Y4gc1a;iMdH=umm*GxO47_yHQj2&VGsM}&kB>Qbz5*R?uw*!G7-4N*FQ(_dGa zl=8R@tmcdw>Cb=ITGh-R311$w_jPRwt`5}?UAhy#3|PIYnr+BiA(MD)box=w)g(*Z z=}WZHa}kL!&h}5>(loiVe@~?X4B;)#^|X0!QCx|%?T{-ezuMRw4J^K)Dpw>6Zx5sn zMgt|AN{>D$J4Lsza>;^b8ia?o_)l~s(&=<^d%{ol#l2 z#&uQU>oD<-KWfccYSK42yR*StoEOv7%U+waM9$R5jm7!HTdrZA;aF}yIeLp3WT96< zLQz;C;6S4vNm0K&7upQ{o(uf0q@}>W@IhkFVp)gEmWA}|KmD+i^Vv6Z<)zo-nReem zyR}Fc5}X>!L6^TtP+v`v1?TVG>?^T)i0<^YnNs{Y;KSBX;!{dSZDSh{nykHehm15l zKEz4poV>N|fkH<}VM0XI!h;aM04}s`o3@4c1pJ8< zIur5QN5c{-wJ)vM%lZXPHc8?Xa#tbR%2+h#n9TOhfl{e!gS5&N)6N3)?#5lW0Sr6K zH(X@T4l@_OsP+-pkx@3;dN+LaxJv_g+K94|A@e-vkJZ$2Qn4L@KuA`nlcMgXU+R4AlKxoO z5{&%NeKG~T& z`6?;60l(ba&W1r>YHW3lVb^;$Bs+YA=iR2R-WeStgvqLY6lVxi*I2ZwmNhD1AV6{L zn)Ut1|7zk=@#W08fnu9J&3JL`cg@Y=>njWFIYZ8H-!bI+f{dv?uo&5ItvPVajUj|Y z5bXLRiSUmr4Z9k574=RaMaqKGdwsnwwP`N9Xx={S;i-MSnP1uFqNR^E4x7IkkO|1$ zRcNK)%lm|K+La33X_>Ef{Ne>yY3r7=n1*f3wcxi_&}tn!9MMV#$;xxAJo?@@X^nBS z0DGjb9Y%_|DSj%|dQvw)z*}RX9CC zjBNP;-oOo@EE;Ap!vv6AWo?ZhpH2sXA$yTLL*xDX#Q`| zz`?mXnT&T-VKL8>W%A@im5=&#(02g<`VLr@kJ6RU7)*Q?S(=63EyzoJ!DENs51&xz z?HvDK4PS>+rjIz(OR?DYVyRoCwqf4exQvGGR{7tpbm@Dxf~e1bDzx=yD)`6?a$BWM zG>T5zT;Z&4ZHHtIJo%L<4kz;95mav9BHvKsW*Dz0!rW+;Bwc_Wz-Wg^!~O&y=_ef( zTjM|WYNActDCy-N5OU9TlmlbhDqP!*w*2*zMZyPGN$@HC6Of1p`L!!y=Rg)pl`U(p zF8QYCW$jZsblz!`^Hn_MUdQR0BO1ANH8nYnVg=)Tc@Ipe%U%b7yZxlMiPp4yhxgv;<$S*$SrVFf-Nkp8T+ zje>8Z+%$R;pa4+ypJO#SmLRz_SILzR0%dV@I`6vy5LGU%5x_J48ne$334~hNB$9;N zAS0NlcB;uHZQZaO$Pb!O;`&E$gspG4GVWuffabY#Ky7=PztnFg>FnxC3h4+WW8%U& z>}y9ic$l4y{x#pGmGKyWL3pDU@Kq78q?O{AS8swI2ng>wu0mACH3U$4v-LUAHev35 zxhl@@uVxgK`SWIgqS-lUj5Qk2*F$n?gja+%0|mJxVz#<3d@cabPH$N%G~~|Mr1q?J zm>H<`?@m+wW#DfPC0z%am#|gk?JK(t!>2O5%ZAjwd%H=zDb3bW7XY;r z3|TlkB#)U>PUkRM`4Ws^Gq2)Gmu8)wZKwXxa*NVc)>;KLoCZa598vxY<84&dbbmh6 zM)ki-X(k$v>FTmXEdacf4@Rzhp6#JP7@Dz zjP->Cq?50>_Crq~MtSAqso7zRom4uIX&~);O|NNKL_}?%g>7MUyuEbng1@B4bb~HUVzUu{{e6Qg^PdT0{A}mFIxUY z%Mo1a8BQPQ6T!JdZ!0~smJruSNNAk4h)Wgqh?uoFS`OK2<~ZFi;+d<3BpkNTL5jS; z=p9YFtC`-Xy$LbrU|yr}?ZcCl2OP+2|Cp|hTz;)p$e*>UBPN&6#!CvF^=wGHKwZ1< z*|)m(d*@I7T&hT}i|Oz)pdg@p3vgZv=CO_c5)^M4{S1sf_BAO7r$t}ZF1(Vn_>RNQ)lH3HJU5Y%KX3f<|?)0!F%!}H@|q=*_$#`{94EM6yKqES$Enn zY_Wv_gRss)$E9#P?{v+g7VCobZz2ge-~Ay+)#9(Ze%>a+iPY;Q6|gdzd2xiU4#<(_ zle=5@o<9dzwFLKhX0e`js-j@-N|DQWWZ%mvC;wkBn1>N|&!zby_1#5=%oX4iU2l_9BRwJiA@2AAwO7#X^2sh%k{^muX-u{^`p z$(t7&(3z&J`x!SV-&o9dy#-Tz8U6;B9g=*Pk%unEWQe_9D8lO&>GO@JP=ZU$A>-e_ zbVr7VD`?kFG}Mf}t6cg#JQQ$O^2pIcE@Y)BXG9PFpnI)>r9mnWLkp%{NPaRSVHRyB zS*%%Lnm?8&$~^6kfbfo{X03<)Soa;0nMvt%%*)z|&Kwd=jD<-&x^m&i*;TP8+v+E_ zfKqm$zguR*3G%4HdbD!M=;l-|c63hqxjn zL3#S;tXZ`8VA7d_D;izE)T`|frLfiKIHeq}vT zanHnUFJ&lZseTbPqn0Lk%v4c)`yt~wW0k#dui9~ZW13D4E~6XHuO95&ZIbS_^JeWp z!p5>`vZ@ zd0&-ZC|_DjPe^eVqtkuKxw-`1peq;)Uxr?#SD4Q}au`AVZkRMm(||5cdN@k#2eu63 z@_?07fQ7StpjKl`C#mG=cC4ckft?Q)b+yk&Vx*q7BlE9?BGv&NXJ6$`W33S63eujk zpfuB$Pf_BP=+6ltct6i`TDF}Ip=@Bal?9x6R8M<}oQm79BN~2>1 z)57UrtPInZN@dP@RT29O{AbTBv(pu1P>N>a`i6jn9e1DRS*iL`2x~2IaqK_igt>3J zwBizk`&CT-(6GjO9wi?M8X}l=+i)B(qQIso6~EhL2xlb-vntzur`4e6@qpP6R95hdLBtdtRiE7TFl9Dc z^?B2ZNEW{7#u2hl;628>ZdmG>C+GtOnC}X_{e2|jn8=yoSkH6gHu_!lT(fR|-i)48 zzKqYF-Qb9~`)%Fgg1b=9uBDAw$JBm#A{+=kkYa%%wCf~p_^;~H4V}T4@*0*II8u_p zm!=&%ppqA7iYN^WiIDcD2?`xcOiMD9?$}Sk%6nKAmcrO)thMvwEmj#>@fuNVGfVRG zRr|d<6ZMe3UeLQ_sHib^RVKe;-%Kt6D)Rox^@pklf9Vrn|S zfb|Bwd$ww#Jsat>j-%sDu!3)bN}7TTZqXBECl8unUz&^({Sw~B=7@aw0BafuId`vx z-V^JESeZ#lM>d#C2pbcoeggBa7CEHt(yZB<2`M<2Xq+*e~zb;a^4;w|yO(o`;5=Sv?_7vv)@-a50`q$IyKTwVpV)z+x`Elv##8QK7aM0d&rJ0qqsY zR;bx$fp@Z9&(daO;T%ejWp9z!`_eSay!^_?g-77F-%W>%==Q!`_kNobN+E(q-WA}~ z+@N}E-z@}C-9p>#;B9_^_mf!Kqx9%Ocd+^Z54|oAwsGUB2dMKvH3g`#2FtNT^ JY2^0gzW`2!G8X^< diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0010.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0010.png deleted file mode 100644 index 4b863b7b53b552e20290661d293398a189757ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8905 zcmeHNXIPWjwvIZ=D2|{ajM7v@Iw+`gq98&*2_)1|6=@hz>ecT?&RMobPMtU08XlcE?=?^&!T6$7E9W(+Q5}3 z?kAU|!Fphp;yy+P4NtN`#>K2@v%UN9mw!F6LwdoeWOe+FEM()T^r3~OWMD>NZ&dFE zZ21r6PwHOZH;pqh|JE$vdKt0YY_~41%MMl7@Ffmu1b3BTyQ!VAzhxoW^A1tv`Wh6C zl^M?qMn9f-C~Ua>CfoL|wx~r{4n|Krk&B}<>%M2(hnrw~`7Nb+H?QaYgKSVS z{nS{vdu@CZ0a<*@odunJ3qj2an|VF{@CtPdR~3f~c!RBkXQUrCTyPS1kS=1q!L?;R z>SJ|l?+jcci3cEN37uga)0>vzvUd8clA$4jk8eH~g3IUHD3K9@OQsA^-1-+}Io_ts zo_3t%=utciDawk>-rV74y)~w(O&0sv7+Z@oxTDS0_S3ue1!i8*8%~)wu7C|d52>;O`~vhB%9aw$bQZEM{hsE;iXMPA#FJ2- za!<>E9mhQOjsJ)f?a=BALDNgYwRlvu`w8E6FEh3|?4LSwqO8-zZB;)hUqO`BBp+LwL?ViFB>EK!wVe9GhRyi88 zx$Mh2U@-)D=l=Zus{Ij+eDOl^WN4zcj(zdQsWe;Ijv>Nbjl>>_lHiTL(8&{`ce>s= zJuAD)@}tWj#oWC*+p$eULPII{L`!NJu~`IwQBSrdOS8bU)&y#lV==pF@`GSnZa!(J z))mfkClQVXVihWX_haVQFkF$q_LKX*d!ogm(QLxQ0qn(3-G)a8Kuq-AbC0J793UtG zS#d2?#$jda=wvg&=-yllxlN0Uz5*5R{WDWys?_$N9U;6qm>-@f)kP`T{aqha8K>GQ zYcq?H*j?x`2F^_H6-jjs1T5siM z)p1p=sXDXs%B(g+cvmVDr;V1?LRp3L#fuWSDz!{q)z#}`1d9rL*-^vu15%=jK2>~; zfNhO*BMVBbUP>g0-q?OxU*qoHrL_i2&H_5N{ZHH2I|Q+3U}`VR!R3y_j=51#WuDfC zSVTJCv8Ta{@5eWsEq=9J11YKi-aa4*?iLnX6rFo_Z$5i@g7(z5>d6qVS!IYI*5A)$8K}Ny=v6{=RYUSSxy1uejIq}=D zoE(`Fle~aWpDb*3(EspmsX2%4$%wrfHNvz@LLGWll0lyiwLjEO0X=t=0R5t*>6(J0q1&r)+^4t=e=HuX8-ez+nW#R`}t9n@* z&R4sig~WsdqANZ$#OQdF`<`>2TMq?VSgo6+b6-#09MMaO$o;U{VA-J>sn?3R3F6+) z?4?^5#mwDaa&sCPyS!~J-P^pDQa<`y#8+Wixi?hp8(iO%TP|dQTCl|kL9k$+G~>PnPiL*)s80G?e3)PiNj9yPw}wXb_JWO(^1n{~vC`C~9d}zc zhm(904(kZ!I|Za%P0OX#mb(4vpDs031F$j9G(tSbD`??pEbk-++f?769$o!v`Ylni zfO~uz$|?S0a3^aob$BF4;=h5C8gJ&U$BLo!#<&1g_@yHsECFHP!twwU6QhPrTn?=W zoQsd%hO9CF zAxShCQe2ITrhfdH>Ccx<<`aa|sx0tV8j*UmSVFZyZkK zQY7D?2^M3zbDd4sMR5`E71YM0bWA*FE9d($(eUrcwh3;@zXS^#ARJ=pN`xB`5MW1F zTr~1MLD1t1SpeOu*5B_AqLb(-2IJb}$}6PMU@;u^F?H~N!QoGUy!Um%=YGt8` z$6ZIQG*DE|EhxyQ**d;Fq;DHR!<)r-FN!|9Tz%iY-;Mw-s@25Fc?}T+`;{}3HJem- zsiaDkRPq?F<+NFdbE=QV0#!e+(XJN6=pa_V#R!VUJ;h?NRZTUPLVDlc`C^(vDae&0 z!x^g1iY`f#y0)WD8<)oL$aU_wSfKKSZ+m6a$n`x@YEX}`7DH^#JK=+~5Ut=l{VA%% z6pi2ch#EPh(pN^O`fn=tEm)S@Xs}(SLiTiX1qdK2YJTq}i3F4fU7Mj|_>5TL19mFmV*cW#$6egYJR}kuXpJ-9DR5 zm-2F^!bkcYc7!hPo}?=BgGVui=Um+748x_JJwh3Y7=2-r@O;|7pKBi9bSKh3c6A&* zqoqBjB4UyA)t*mKeh*CYCP`*fX2+7 zNcNlNTX6so{myV&F0V%4-?Kj_y(yJT91RfEmQ}nHUjrzKVT%smTr$lVPYeZo+r{T8 zdkfP1<+8)FaRO33u09~0A6D}nnk(mqtKJFJ@Z+HKMabR-Zvg->9A_!-Z0Pf9<-+7> zCq9EjsEewuKCAfciZ9*YFZq`xTiN>$Mwb~91bRSa@}x_F3L ziou_T4i|XK{qU!r>x3il1EdjuydQm@TCoScis~42*H_!4{P)ULZd%IfC17!54NmnhS7NaQZncaw)H`1G5 z{X6A=Yae5!qr+93wbQI&fI9-B`;M#f`5}SJ!U!S8ceS*#L&NTD!F2#X3!ercCi(5A zZs5e_UIr>)j?YDmCr8{_C%23CmKlwX#ry{Kd;XgV!oT+9J$?H0fq+nYt^uQ6hDM_` z2xW$bhO+6ycDF|Y+a$pTYd0&G-V3UY@Cigq>j0jO1x@4{LVR|-lib=8ekk%88!&8P zM9yI83CYkIkElBXGIn2^C6md{VWX`1>hAOaj4Q#VaV%=FDanBIm1?k3cVm5vY2|X4 zi{5)8r(~ovz4ydt{IR|r%GTGPxbO=C$#AqD?i(D;oa-;0E&>BLL$)EDK@UK!4^ObR zP&f3KtTk^y{0NoVg|8d2%`7zl29kwLfRj8z`F#d_3MNsRVuxZopgX7E|H7!29=K zDx4c^@y-YSQDjVN0b-B)0~)vo+Y%zbah{-ZGc zYsglk{GTNDUmp9*V}AwAzh4Od%9p?L<^NN@6jmgBK?w+tsh;rI^HSTVRy+(R9X6J7 zOi814V=(1{ZNZ+z3j=SuKN<#dFDNC4aJ%47x(*HWt7mj;Z@=EX0QVRP-R-~#ej9EIxv%mZXAUa_C30<1!NJH4tzWnQgjOsV0RU z)?-|_DS^g6+S|1v5RpXy(W+NCn*K^M=GQ|K&ur)bn)r;m2xqQ)bpm(JM;4o;&N?KG zc+?l5?QD1RtWddKeKhXQXh!}Bfu7;%m%X2$0iU_HqSVAJEGngF)i%PjWYQ&BR%uL} zpG%#hAF_iQwX&MddY!XVaskl}cMDu|F&K3*5pi*c32bJ$UPv8ImIZQ-*y46J38fBI zQ}SOne5IoU3tK%Kec*{c-MnWJ#9f;kEaBfzGTmHr%?_wU`1|3?ls50MSy@8@t$Shy zw9K#jVCo_b6UZhXi%67k$pC$C$eHX(`K7OuA&;zmYaGwHOI^7Q?m(4SrR1t*5s3At zveh@!y?x)SP~l0Yt@Q`q6~F%W67kceolXn@AZW+#fyCqH(jFOeF7DU?1DhN6_Iio+Jlp>p{xc=dYRa>-+a*UZU31he{A}3%4LJPWw@+| zkphyc1&YtFtFSx+x5Wh?tO*@M>e@yHH_x6`KAw}mu{=1So((f!9PGI-d!)3wXIIF^uA*yhPU)gUsK#{= z%a`&zBfz(YnJA~A4KZz6*9^gmc6zfx~4Ek#*s06CGq3rZ|$yuX)xJ^yH+=Gc{hfM^&#TTx23z01whPt4zayWOr! zuEb{>UzL=DJAV-xy^Y&{<7k_@H6cRbX?epbqOXWe(%^{g{Tdv#e5TA1S~T^csv^Hx z7dkqhbRSKrzsx_$>k+<&iBby1Mx{9In8hbC4Cd>^`fK?zi3> zn~A4$Ka{|09d$P5S#?Z*d`v+1N4 zYT6)H)9u6s+-ArC>5r>>E;xE3qhUN$XatD^gmn`Y)`^X5`kIs10}9Q^;VZA9VpuE1`%$sJi}vzEMOqZs6e;FX!$l zTq6<;i1$95{Ep2IkF$+p5Bo;TrA^B>$r;FTT7ZjX>{l^ob6~g`)p#d6{VU&W@Av)e z)B>DX8?IZ|J3TCuiCu*zsr&N|GJydwAv<3XY}aoOq1+404BPx*jeU+|^bvkJzJsEha z{UDX3=x$bk#SVfz=E9e9m^JYWVSrid}oXu!MH4` zN1`0Q5xwK970a6k@Cb$Xz)!B{-pbz+8VOGsyV}5pX_U6b1gO*7@R2+VwNrvOwz(0T7EU~ zHghop} zC%~f?&T?3p&;$MZ->&F@;+&EMc9WkO-*4R}OAeqjEoq~wi=55PMc_o_|jGOgohtYAs6&Jjp{=VdH_OviY7;P&k8o2Hr30GoMgk3HS$M^g ztHauz=9_6~S~jm&@VPa{ldA&ng;u`U7zmyH6bv~}6+!uS>B^nAEs6EIxUXAXZ5@%~ zIi$uTa^11!3UmoCQ*KmQ?k#E;;AK^QpSqiu9%mdRfc+%68@f0o^ucI9fO!Q*wXiS( zyb#|0u;BmZ=b7UsFfA|g-Kvr2A^ry>QX$6nA(SAHR0p_c-)UkdHtA b0slh%%$YL-@kDd}H~`4l;&O$d+x`CnVSnf1 diff --git a/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0011.png b/applications/Volkov/artifacts/mame-ui/vc-footer/sprinter/0011.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ PREPARE -> RUN_CHUNK -> PRE_COMMIT -> COMMIT -> DONE - | | | - +-> CANCEL ----+-----------+ - +-> ERROR -----+-----------+ -``` - -Один шаг не должен надолго захватывать управление. Между блоками приложение -может обновить прогресс и проверить отмену. Даже последний успешно записанный -блок завершает только `RUN_CHUNK`: отдельный вызов переводит job через -`PRE_COMMIT` к атомарному rename. Поэтому `Esc`, полученный после отображения -`N/N`, всё ещё успевает закрыть и удалить temp до появления целевого файла. - -### ADR-009. Viewer, editor и setup сначала отдельные программы - -Основной Commander отвечает за панели и операции с файлами. Просмотрщик, -редактор и настройка первоначально запускаются через `EXEC` как отдельные -`.EXE`. Это уменьшает HOME, число банков и последствия ошибки компонента. - -После 1.0 они могут быть интегрированы банками, если измерения покажут -реальную пользу. - -## 3. Слои системы - -```text -+------------------------------------------------------+ -| app: main loop, mode, active panel, command dispatch | -+----------------------+-------------------------------+ -| panels/model | UI/dialogs/status | -+----------------------+-------------------------------+ -| sources | renderer/screen buffer | -+----------------------+-------------------------------+ -| jobs: copy/... | storage: EMM/page access | -+----------------------+-------------------------------+ -| platform: ESTEX, keyboard, exec, screen, filesystem | -+------------------------------------------------------+ -| libc + Sprinter DSS/BIOS | -+------------------------------------------------------+ -``` - -Зависимости направлены вниз. `platform` не знает о панелях; `storage` не -показывает сообщения; renderer не читает файловую систему. - -## 4. Предлагаемая структура исходников - -```text -Makefile -src/ - sprcmd.c точка входа и аварийная очистка - sc_app.c главный цикл и состояние приложения - sc_command.c преобразование событий в команды и dispatch - sc_input.c клавиатурные события - sc_screen.c EMM framebuffer и dirty rows - sc_video_system.c координатный вывод ESTEX/BIOS без оконных ID - sc_draw.c рамки, строки, числа, сокращение путей - sc_panel.c состояние и поведение панели - sc_panel_draw.c представление панели - sc_dir_store.c записи каталога в EMM - sc_sort.c сравнение и сортировка записей - sc_source.c диспетчер источников - sc_source_fs.c настоящий каталог DSS - sc_copy_job.c PoC-копирование одного файла - sc_copy_ui.c банковая оркестрация F5 и прогресс - sc_dialog.c сообщения и подтверждения - sc_path.c безопасная работа с путями 8.3 - sc_error.c нормализация errno/ESTEX ошибок - sc_platform_exec.c ESTEX EXEC/WAIT - sc_platform_screen.c wrappers WINREST/WRCHAR/SCROLL и screen mode -include/ - sc_app.h - sc_command.h - sc_glyphs.h raw-коды CP866 для рамок и стрелок - sc_input.h - sc_screen.h - sc_panel.h - sc_store.h - sc_source.h - sc_job.h - sc_path.h - sc_platform.h -banks/ - bank1_panel.c чтение/сортировка/обновление панелей - bank2_fileops.c копирование и диалоги операции -tests/ - ... target-тесты и данные для MAME -docs/ - ... -``` - -Граница файлов может уточняться по карте линковки. Нельзя объединять всё в -один большой модуль: SDCC/линкер должны иметь возможность не тянуть лишний -код и разнести холодные функции по банкам. - -## 5. Состояние приложения - -### 5.1. `ScApp` - -В W2 хранится единственный объект состояния: - -```c -typedef struct { - ScPanel panels[2]; - uint8_t active_panel; - uint8_t running; - uint8_t video_mode_saved; - uint8_t original_video_mode; - uint8_t emm_block; - uint8_t panel_page[2]; - uint8_t screen_page; - ScJob job; - int16_t last_error; -} ScApp; -``` - -Фактическое определение может отличаться, но следующие инварианты обязательны: - -- `active_panel` равен 0 или 1; -- обе панели ссылаются на разные EMM-страницы; -- `job` либо неактивен, либо является единственным владельцем своих fd; -- номера блоков и страниц обнуляются сразу после освобождения; -- cleanup можно вызвать после любой частично завершённой стадии init. - -### 5.2. `ScPanel` - -```c -typedef struct { - char path[256]; - uint16_t count; - uint16_t cursor; - uint16_t top; - uint32_t total_size; - uint8_t source_kind; - uint8_t phys_page; - uint8_t truncated; - uint8_t dirty; -} ScPanel; -``` - -Ограничения: - -- `cursor < count`, если `count != 0`; -- `cursor == 0`, если `count == 0`; -- `top <= cursor`; -- видимый курсор лежит в диапазоне `top..top+26`; -- `count <= 640` для всей линейки 0.1–1.0; -- `path` всегда завершён нулём. - -## 6. Хранилище каталогов - -Публичный интерфейс не возвращает указатель в W3: - -```c -int sc_store_get(const ScPanel *panel, uint16_t index, ScDirEntry *out); -int sc_store_put(ScPanel *panel, uint16_t index, const ScDirEntry *entry); -void sc_store_clear(ScPanel *panel); -``` - -Для пакетных операций допускается закрытая функция, которая отображает -страницу на короткое время. Она должна: - -1. Сохранить текущую страницу W3. -2. Подключить страницу панели. -3. Выполнить только вычисления над памятью. -4. Не вызывать ESTEX, renderer, банковский dispatch или пользовательский - callback. -5. Восстановить W3 перед возвратом. - -Сортировка PoC должна быть нерекурсивной и не использовать callback `qsort`, -чтобы избежать лишнего кода и банковских переходов. Предпочтительный первый -вариант — Shell sort над одной отображённой страницей. - -## 7. Чтение настоящего каталога - -Последовательность `sc_source_fs_scan()`: - -1. Проверить и нормализовать путь. -2. Сохранить имя записи под курсором, если панель уже заполнена. -3. Очистить счётчики панели, но не освобождать её страницу. -4. При необходимости добавить синтетическую запись `..`. -5. Выполнить `ffirst("*.*")/fnext` с одним общим 256-байтовым near-буфером. - Шаблон `*` запрещён: P1 и P3 подтвердили, что DSS считает его именем без - расширения и не возвращает обычные `NAME.EXT`. -6. Пропустить `.` и `..` от DSS. -7. Преобразовать `ffblk_t` в `ScDirEntry` и последовательно записать в EMM. -8. При достижении 640 записей установить `truncated` и немедленно закончить - scan: следующий `F_FIRST` сам переинициализирует глобальный итератор DSS. -9. На стабильном DSS 1.71 код 35 означает, что закончилась единственная - 16-КБ страница кэша каталога, а не весь каталог. Принять уже прочитанные - записи, установить `truncated` и добавить последней красную виртуальную - запись `>>> MORE...` с флагом `SC_ENTRY_DSS_LIMIT`. Она занимает один - слот, не является файлом и не участвует в файловых операциях. -10. Отсортировать записи: `..`, каталоги, файлы, маркер ограничения; внутри - обычных групп применить ключ и направление конкретной панели. -11. Найти прежнее имя и восстановить курсор. -12. Пометить панель и её экранные строки грязными. - -Переборы двух панелей никогда не активны одновременно. `ffblk_t` не хранится -в EMM и не является частью состояния панели. Причина и варианты снятия -предела DSS разобраны в [dss-large-directories.md](dss-large-directories.md). - -Флаг `SC_ENTRY_SELECTED` хранится в самой 24-байтовой EMM-записи и переезжает -вместе с ней при сортировке. Резидентная `ScPanel` содержит только счётчик и -32-битную сумму выбранных обычных файлов. `..` и виртуальные маркеры никогда -не выбираются; refresh в текущем срезе 0.2 явно сбрасывает выбор и статистику. -Одиночный `Insert` может менять флаг каталога, но все групповые операции -`+`, `-`, `*` сначала отбрасывают `FA_DIREC` и никогда не меняют ранее -установленный на каталоге флаг. - -Маски `+`/`-` используют ASCII case-insensitive matcher с `*` и `?` только -для файлов; специальный DOS-шаблон `*.*` совпадает также с именами файлов -без точки. Редактор -маски является общей координатной модальной поверхностью в BANK2: он рисует -поле в экранной EMM-модели, поддерживает insertion, Backspace, Delete, -Left/Right/Home/End и не создаёт BIOS-окно. - -F6/F7 используют тот же editor и один validator компонента DOS 8.3. Локальный -F6 не передаёт полные пути в DSS `RENAME`: отдельный банковый helper сохраняет -CWD в резидентный scratch, входит в каталог панели, проверяет отсутствие -target, вызывает `rename(old_basename, new_basename)` и восстанавливает CWD. -Перезапись существующей записи запрещена до системного вызова. - -F8 без выбора удаляет один объект после подтверждения: `unlink` для файла и -`rmdir` для пустого каталога. Непустой каталог и виртуальная запись не -запускают разрушительную операцию. При наличии выбора F8 одним -подтверждением сначала удаляет выбранные файлы верхнего уровня, затем -обходит все выбранные directory roots общей BFS-очередью, удаляет найденные -файлы и выполняет `rmdir` каталогов обратным проходом. При ошибке или Esc -уже выполненные действия не откатываются; CWD и EMM-страница освобождаются. - -Групповой F5 проходит EMM-store по индексам и передаёт `sc_copy_begin/step` -только записи с одновременно установленным `SC_ENTRY_SELECTED` и снятым -`FA_DIREC`. Между файлами долговременный указатель W3 не сохраняется. При -ошибке уже committed-файлы остаются, активный temp удаляется прежней job; -это первая зафиксированная политика частично успешной группы. - -F5 одного текущего каталога использует `sc_tree`: на время операции он -выделяет отдельную EMM-страницу с BFS-очередью до 1008 каталогов. Узел хранит -только parent-index, компонент DOS 8.3 и depth; путь восстанавливается перед -действием. Первый 256-байтовый диапазон страницы хранит исходный CWD. -Глубина ограничена 32, а путь — 255 символами. Файлы по-прежнему проходят -через единственную 4-КБ copy-page. Existing target не merge-ится; target -внутри source запрещается до создания root. Групповой F5 добавляет все -выбранные каталоги верхнего уровня как независимые roots той же очереди -после завершения выбранных top-level файлов. - -## 8. Renderer - -### 8.1. Интерфейс - -Минимальные операции: - -```c -void sc_screen_clear(uint8_t attr); -void sc_screen_cell(uint8_t x, uint8_t y, uint8_t ch, uint8_t attr); -void sc_screen_text(uint8_t x, uint8_t y, const char *s, uint8_t attr, - uint8_t max_width); -void sc_screen_fill(uint8_t x, uint8_t y, uint8_t width, - uint8_t ch, uint8_t attr); -int sc_screen_scroll_rows(uint8_t x, uint8_t y, uint8_t width, - uint8_t height, int8_t delta); -void sc_screen_mark_rows(uint8_t first, uint8_t count); -int sc_screen_flush(void); -``` - -Экранный буфер — источник истины. Диалог рисуется в тот же буфер поверх -панелей. Для PoC допустима перерисовка панелей после закрытия диалога вместо -отдельного стека сохранённых окон. - -### 8.2. Обновление - -- Dirty mask занимает 32 бита в W2. -- Изменение курсора помечает старую и новую строку. -- Прокрутка панели помечает строки 1–27 её половины экрана. -- При изменении `top` ровно на одну строку `sc_screen_scroll_rows()` сдвигает - одновременно EMM-модель и экранный прямоугольник, затем renderer строит - только открытую строку. PgUp/PgDn и большой скачок делают полный redraw - области панели. -- Смена каталога перерисовывает соответствующую половину и общие строки - 29–31. -- Полный `sc_video_present_full()` используется после запуска, возврата из - `.EXE` и крупных изменений. -- `sc_video_present_rect()` группирует соседние грязные строки. - -App-local WINREST wrapper проверен P1-пробой Commander: полный экран 80x32 и -окно 20x2 из offset `0x2000` восстановились корректно. P2.1 затем подтвердил -полную сверку через `RDCHAR`, оба направления прямоугольного scroll и 1000 -операций. Координатный backend принят как основной пакетный способ вывода; -ограничения и артефакты описаны в -[результатах P2.1](p2-screen-probe-results.md). - -## 9. Ввод и команды - -`sc_input.c` преобразует `getkey()` и `kbd_mod_state()` в `ScKeyEvent`: - -```c -typedef struct { - uint8_t ascii; - uint8_t scan; - uint8_t modifiers; -} ScKeyEvent; -``` - -Модификаторы хранят только Shift, Ctrl и Alt; состояния CapsLock, NumLock и -Rus/Lat не участвуют в выборе команды. - -P1 установил особенность DSS: при модифицированной клавише бит 7 raw -scan-кода установлен. Например, Ctrl+R даёт `93`, Ctrl+PgUp — `D9`, Alt+F1 -— `BB`. `sc_input` нормализует их в `13`, `59`, `3B` через `scan & 0x7F`, -но только после чтения compact modifiers. Таблица команд никогда не содержит -raw-коды с битом 7. - -`sc_command.c` превращает событие в `ScCommand`. Остальные модули не должны -сравнивать scan-коды непосредственно. Команды описаны в -[commander-keymap.md](commander-keymap.md). - -В MAME `kbd_mod_state()` в момент возврата `getkey()` сохранил активный -модификатор: compact Ctrl=`02`, Alt=`04`, Shift=`01`. Для переносимости -управляющие ASCII-коды (`Ctrl+R` и подобные) всё равно имеют явные алиасы, -не зависящие от live-состояния. - -## 10. Копирование как конечный автомат - -Состояния PoC: - -```text -IDLE - -> VALIDATE - -> CREATE_TEMP - -> OPEN_SOURCE - -> COPY_CHUNK <----+ - -> CLOSE_FILES | - -> RENAME_TEMP | - -> REFRESH | - -> DONE | - | -COPY_CHUNK -----------+ пока done < total - |-> CANCEL -> CLEANUP -> DONE - +-> ERROR -> CLEANUP -> DONE -``` - -Правила: - -- конечное имя проверяется до создания temp; -- temp создаётся в целевом каталоге с `O_CREAT|O_EXCL`; -- имя temp имеет форму `~SCxxxx.TMP` и перебирается с ограниченным числом - попыток; -- рабочая область находится в отдельной EMM-странице и временно отображается - в W3; 4-КБ массива в W2 и изменяемого буфера в банке кода нет; -- начальный логический размер блока — 4096 байт, чтобы между блоками часто - обновлять прогресс и проверять отмену; после измерений он может быть увеличен - вплоть до размера страницы; -- чтение выполняется существующим `bank_read_page()` прямо из открытого fd в - страницу; для записи нужен симметричный `bank_write_page()`, который сохраняет - и восстанавливает отображение W3; -- открыто не более двух fd; -- успешность `write()` определяется его библиотечным контрактом, а не - сырым DE ESTEX; -- при short write оставшаяся часть блока дописывается или операция завершается - ошибкой; -- после успешного закрытия temp конечное имя проверяется повторно, и только - затем temp переименовывается в него; -- FAT date/time задаются temp через `PUT_D_T` перед close; после rename - конечное имя получает исходные R/H/S/A через `ATTRIB`; -- ошибка после rename помечается как ошибка финализации уже committed-файла, - а не как полное отсутствие результата; -- любое завершение проходит через единый cleanup; -- после успеха перечитывается пассивная панель. - -P19 добавляет policy существующего файла. Safe overwrite сначала переводит -старый target в уникальный `~SBxxxx.BAK`, затем commit-ит temp. При отказе -второго rename backup возвращается на место вместе с исходными атрибутами; -после успешных метаданных нового target backup удаляется. `overwrite all` и -`skip all` — локальное состояние одного F5. Readonly не наследует молча -`overwrite all`, а повторно показывает choice-dialog. - -Для версии 0.2 этот автомат расширяется очередью файлов, обходом каталогов, -политиками overwrite/skip/rename и сохранением метаданных. - -## 11. Запуск дочерней программы - -Последовательность: - -1. Завершить или запретить активный job. -2. Сформировать проверенный абсолютный путь `.EXE`. -3. Запомнить активную панель, курсоры и ожидаемый CWD; временно сделать путь - активной панели текущим каталогом child. -4. Выполнить синхронный ESTEX `EXEC` с `B=1` и сразу сохранить его результат - до других вызовов libc. -5. Восстановить ожидаемые диск и CWD. -6. Повторно установить текстовый режим 80x32 и палитру Commander, не меняя - сохранённую палитру для финального shutdown. -7. Перечитать обе панели: внешняя программа потенциально могла изменить оба - их каталога. -8. Полностью вывести экран из screen page. -9. При ошибке показать её штатной строкой состояния Commander. - -P1 подтвердил контракт wrapper: C-сигнатура -`p1_exec(uint8_t path_mode, const char *path)` получает mode в A и path в DE, -затем перекладывает их в B и HL для ESTEX. `B=0` с коротким именем и `B=1` -с явным относительным путём работают; probe получил `0x5A`. В Commander -низкоуровневый `sc_platform_exec(path)` фиксирует `B=1`, принимает путь в HL -по `__sdcccall(1)` и возвращает код завершения как `int` в DE. - -### 11.1. Командная строка и `Ctrl+O` в 1.0 - -В VC 4.05/4.99 `Ctrl+O` переключает панели и user screen, а редактор `DosBuf` -работает вместе с prompt и историей. Dos Navigator дополнительно показывает -самостоятельный `TCommandLine` с горизонтальной прокруткой и историей. На Sprinter -родительская DSS-shell приостановлена, поэтому её нельзя превратить в интерактивный -фон простым скрытием панелей. - -Поэтому 1.0 использует собственный pseudo-shell: - -- однострочный prompt на экране панелей и полноэкранный режим делят один - редактор, историю и модель текущего каталога; -- `Ctrl+O` переключает режимы; возврат к панелям полностью строит их из - `ScPanel`, поэтому отдельная копия экрана панелей не нужна; -- builtin-команды минимум `cd`, смена диска, `dir`, `cls`, `pwd`, `help`; -- внешняя команда запускается через подтверждённый ESTEX `EXEC`; после возврата - pseudo-shell восстанавливает видеорежим, CWD и свою экранную модель; -- вывод и скролл идут через тот же безоконный screen backend; прямой VRAM и BIOS - window manager не используются; -- полноэкранные ячейки могут повторно использовать текущую screen page. До - фиксации поведения внешнего `.EXE` отдельной пробой проверяется `WINCOPY`. - -## 12. Ошибки и владение ресурсами - -Низкий уровень возвращает `0/-1` и устанавливает `errno`. UI не анализирует -Carry Flag или регистры DSS. - -Каждый ресурс имеет одного владельца: - -| Ресурс | Владелец | -|---|---| -| общий EMM-блок PoC | `ScApp` | -| физическая страница панели | `ScPanel`, без права освобождения блока | -| экранная страница | `sc_screen`, без права освобождения блока | -| рабочая страница копирования | `ScApp`/copy job, без права освобождения блока | -| fd источника и temp | активный `ScCopyJob` | -| исходный видеорежим | `ScApp` | -| временно отображённая W3 | текущая функция storage/screen | - -Cleanup выполняется в обратном порядке инициализации. Нельзя прятать -владение fd или EMM-блоком в локальном static-состоянии модуля. - -## 13. Предварительная карта кода - -HOME/W2 содержит только постоянно необходимое: - -- crt0, банковские трамплины и используемую libc; -- init/cleanup; -- главный цикл; -- ввод и базовый dispatch; -- EMM accessors; -- screen flush; -- критическую обработку ошибок. - -Предварительные банки: - -| Банк | PoC | Полная версия | -|---:|---|---| -| 1 | panel scan, sort, redraw model | панели, сортировки, режимы панели | -| 2 | copy job, operation dialog | копирование/перемещение/удаление | -| 3 | не нужен | меню, конфигурация, история | -| 4 | не нужен | поиск и дерево | -| 5 | не нужен | архивные/виртуальные источники | - -Номер банка является деталью сборки, а не публичным ABI. Банковские модули -не должны хранить долгоживущие payload-данные в локальном сегменте банка. -Краткоживущий `ffblk_t` является обычным near-буфером; закреплять его в хвосте -W1 бессмысленно, поскольку граница больших каталогов находится внутри DSS. - -После каждой сборки проверяются: - -- размер HOME вместе с DATA/BSS и heap; -- запас каждого банка до 16 КБ; -- отсутствие прямых вызовов в чужой банк; -- расположение трамплинов; -- стек W2 при всех вызовах ESTEX. - -## 14. Эволюция после PoC - -### Версия 0.2 - -- одностраничное хранилище остаётся ограничено 640 записями; -- выбранные файлы и маски; -- очередь операций; -- рекурсивный обход; -- local rename, mkdir, recursive group copy/delete выполнены; group move и - защитная policy остаются; -- транзакционная перезапись файлов и conflict-policy выполнены; directory - merge и delete/move policy остаются; -- атрибуты и время обычных файлов выполнены; метаданные каталогов — позже. - -### Версия 0.4 - -- командная строка, история и полноэкранный pseudo-shell по `Ctrl+O`; -- associations/user menu; -- внешний viewer/editor/setup; -- конфигурационный файл; -- переключение дисков. - -### Версия 0.6 - -- quick view и info source; -- дерево и поиск; -- фильтры и сравнение каталогов; -- подсчёт размеров каталогов; -- описания файлов. - -### Версия 0.8+ - -- `SC_SOURCE_SEARCH` как виртуальная панель; -- `SC_SOURCE_ARCHIVE`; -- протокол внешних helper-программ; -- мышь, помощь, локализация; -- измеренная оптимизация кэшей и renderer. - -### Версия 2.0+ - -- динамическое выделение EMM-страниц панели; -- предел 1024/2048 или отсутствие продуктового предела после измерений; -- межстраничная сортировка без полной копии каталога в W2; -- деградация при нехватке EMM и тесты частично выделенных цепочек страниц. - -## 15. Архитектурные запреты - -- Нельзя вызывать DSS при стеке вне W2. -- Нельзя держать одновременно восемь файловых дескрипторов. -- Нельзя сохранять W3 pointer в состоянии приложения. -- Нельзя менять W1 вручную из банковской функции. -- Нельзя вызывать чужой код при оставленной временной странице W3. -- Нельзя выполнять разрушительную операцию без известного cleanup-path. -- Нельзя смешивать вывод через `printf` с экранной моделью во время работы UI. -- Нельзя добавлять функцию DN только потому, что она присутствует в DN; - каждая функция должна соответствовать roadmap Commander. diff --git a/applications/Volkov/docs/commander-keymap.md b/applications/Volkov/docs/commander-keymap.md deleted file mode 100644 index f81ebf3..0000000 --- a/applications/Volkov/docs/commander-keymap.md +++ /dev/null @@ -1,324 +0,0 @@ -# Sprinter Commander: клавиши и команды - -Статус: PoC и первые команды 0.2 подтверждены в MAME - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[план разработки](commander-roadmap.md) - -## 1. Назначение - -Документ отделяет физические клавиши Sprinter от логических команд -Commander. Только модуль `sc_input.c` знает scan-коды, а только -`sc_command.c` знает таблицу их назначения. - -Панели и операции получают значения `ScCommand`, а не результаты `getkey()`. -Это позволяет позднее добавить мышь, переназначение клавиш и альтернативную -клавиатуру без изменений файловых функций. - -## 2. Формат события - -```c -enum { - SC_MOD_SHIFT = 0x01, - SC_MOD_CTRL = 0x02, - SC_MOD_ALT = 0x04 -}; - -typedef struct { - uint8_t ascii; - uint8_t scan; - uint8_t modifiers; -} ScKeyEvent; -``` - -Правила нормализации: - -- обычный символ записывается в `ascii`; -- расширенная клавиша записывается в `scan`, `ascii == 0`; -- при активном Ctrl/Alt/Shift DSS может установить бит 7 scan-кода; - диагностическая трассировка показывает raw-значение, а `sc_input` - передаёт командам базовый `scan & 0x7F`; -- левый и правый Shift объединяются в `SC_MOD_SHIFT`; -- левый и правый Ctrl объединяются в `SC_MOD_CTRL`; -- левый и правый Alt объединяются в `SC_MOD_ALT`; -- CapsLock, NumLock, ScrollLock, Insert и Rus/Lat не являются модификаторами - команды; -- управляющий ASCII-код имеет приоритет над live-состоянием модификатора; -- неизвестная комбинация преобразуется в `SC_CMD_NONE`. - -## 3. Подтверждённые расширенные scan-коды - -Значения уже объявлены в ``: - -| Клавиша | Scan-код | Макрос | -|---|---:|---| -| F1 | `0x3B` | `KEY_F1` | -| F2 | `0x3C` | `KEY_F2` | -| F3 | `0x3D` | `KEY_F3` | -| F4 | `0x3E` | `KEY_F4` | -| F5 | `0x3F` | `KEY_F5` | -| F6 | `0x40` | `KEY_F6` | -| F7 | `0x41` | `KEY_F7` | -| F8 | `0x42` | `KEY_F8` | -| F9 | `0x43` | `KEY_F9` | -| F10 | `0x44` | `KEY_F10` | -| End | `0x51` | `KEY_END` | -| Down | `0x52` | `KEY_DOWN` | -| PgDn | `0x53` | `KEY_PGDN` | -| Left | `0x54` | `KEY_LEFT` | -| Delete | `0x55` | `KEY_DEL` | -| Right | `0x56` | `KEY_RIGHT` | -| Home | `0x57` | `KEY_HOME` | -| Up | `0x58` | `KEY_UP` | -| PgUp | `0x59` | `KEY_PGUP` | -| Insert | `0x50` | `KEY_INS` | - -Все значения таблицы, включая `Insert` и `Delete`, подтверждены P1-пробой в -MAME. `F11` и `F12` в P1 не проверялись и остаются неподтверждёнными до -появления команды, которая их использует. - -Фактическая последовательность MAME для навигации была: -`Up=58`, `Down=52`, `Left=54`, `Right=56`, `Home=57`, `End=51`, -`PgUp=59`, `PgDn=53`, `Insert=50`, `Delete=55`. F1–F10 дали непрерывный -диапазон `3B..44`. - -## 4. Логические команды - -Численные значения enum не являются стабильным ABI до версии 0.2. - -```c -typedef enum { - SC_CMD_NONE = 0, - - SC_CMD_CURSOR_UP, - SC_CMD_CURSOR_DOWN, - SC_CMD_CURSOR_LEFT, - SC_CMD_CURSOR_RIGHT, - SC_CMD_PAGE_UP, - SC_CMD_PAGE_DOWN, - SC_CMD_HOME, - SC_CMD_END, - SC_CMD_PANEL_SWITCH, - SC_CMD_OPEN, - SC_CMD_PARENT, - SC_CMD_ROOT, - SC_CMD_REFRESH, - SC_CMD_CANCEL, - - SC_CMD_SELECT, - SC_CMD_SELECT_MASK, - SC_CMD_UNSELECT_MASK, - SC_CMD_INVERT_SELECTION, - - SC_CMD_HELP, - SC_CMD_USER_MENU, - SC_CMD_VIEW, - SC_CMD_EDIT, - SC_CMD_COPY, - SC_CMD_MOVE_RENAME, - SC_CMD_MKDIR, - SC_CMD_DELETE, - SC_CMD_MAIN_MENU, - SC_CMD_QUIT, - - SC_CMD_LEFT_DRIVE, - SC_CMD_RIGHT_DRIVE, - SC_CMD_SWAP_PANELS, - SC_CMD_TOGGLE_SHELL, - SC_CMD_QUICK_VIEW, - SC_CMD_INFO_PANEL, - SC_CMD_FIND, - SC_CMD_TREE -} ScCommand; -``` - -Дополнительные команды вводятся при появлении соответствующей функции, а не -заранее в обработчиках-заглушках. - -## 5. Клавиши PoC 0.1 - -### 5.1. Навигация панели - -| Клавиша | Команда | Поведение PoC | -|---|---|---| -| `Up` | `SC_CMD_CURSOR_UP` | На одну запись вверх | -| `Down` | `SC_CMD_CURSOR_DOWN` | На одну запись вниз | -| `PgUp` | `SC_CMD_PAGE_UP` | На 27 записей вверх | -| `PgDn` | `SC_CMD_PAGE_DOWN` | На 27 записей вниз | -| `Home` | `SC_CMD_HOME` | Первая запись | -| `End` | `SC_CMD_END` | Последняя запись | -| `Left` | `SC_CMD_NONE` | Не используется в одноколоночной панели PoC | -| `Right` | `SC_CMD_NONE` | Не используется в одноколоночной панели PoC | -| `Tab` | `SC_CMD_PANEL_SWITCH` | Переключить активную панель | -| `Enter` | `SC_CMD_OPEN` | Войти в каталог или запустить `.EXE` | -| `Ctrl+PgUp` | `SC_CMD_PARENT` | Перейти в родительский каталог | -| `Backspace` | `SC_CMD_PARENT` | То же, пока командной строки нет | -| `Ctrl+R` | `SC_CMD_REFRESH` | Перечитать активную панель | -| `Ctrl+F3` | `SC_CMD_SORT_NAME` | Имя; повторное нажатие меняет направление | -| `Ctrl+F4` | `SC_CMD_SORT_EXTENSION` | Расширение; повтор меняет направление | -| `Ctrl+F5` | `SC_CMD_SORT_DATE` | Дата/время; повтор меняет направление | -| `Ctrl+F6` | `SC_CMD_SORT_SIZE` | Размер; повтор меняет направление | -| `Insert` | `SC_CMD_SELECT` | Выбрать/снять текущую запись и перейти вниз | -| `*` | `SC_CMD_INVERT_SELECTION` | Инвертировать только файлы панели; каталоги не менятся | - -`SC_CMD_CURSOR_LEFT/RIGHT` сохраняются в enum для будущего многоколоночного -режима, но PoC их не генерирует. - -### 5.2. Функциональные клавиши PoC - -| Клавиша | Команда | Состояние | -|---|---|---| -| `F1` | `SC_CMD_HELP` | Зарезервирована, неактивна | -| `F2` | `SC_CMD_USER_MENU` | Зарезервирована, неактивна | -| `F3` | `SC_CMD_VIEW` | Зарезервирована, неактивна | -| `F4` | `SC_CMD_EDIT` | Зарезервирована, неактивна | -| `F5` | `SC_CMD_COPY` | Один файл/каталог либо группа выбранных файлов и directory roots | -| `F6` | `SC_CMD_MOVE_RENAME` | Локальный rename одной записи; move/group позже в 0.2 | -| `F7` | `SC_CMD_MKDIR` | Создать каталог; 0.2, выполнено | -| `F8` | `SC_CMD_DELETE` | Одна запись либо выбранная группа; каталоги группы удаляются рекурсивно после одного подтверждения | -| `F9` | `SC_CMD_MAIN_MENU` | Зарезервирована, неактивна | -| `F10` | `SC_CMD_QUIT` | Открыть подтверждение штатного выхода | - -PoC не должен выполнять разрушительное действие по неактивной клавише. - -### 5.3. Общие клавиши PoC - -| Клавиша | Команда | Контекст | -|---|---|---| -| `Esc` | `SC_CMD_CANCEL` | Закрыть сообщение или отменить job | -| `Esc` | `SC_CMD_NONE` | Обычный режим панелей | -| `Enter` | подтвердить | Диалог сообщения | -| `Y`/`N` | да/нет | Диалог подтверждения, если он появится | - -## 6. Контекстная обработка - -Одна клавиша может иметь разное действие в зависимости от режима. Приоритет -обработчиков фиксирован: - -1. Активная аварийная ошибка. -2. Модальный диалог. -3. Активный job. -4. Командная строка или полноэкранный pseudo-shell версии 1.0. -5. Активная панель. -6. Глобальные команды приложения. - -Примеры: - -- Во время копирования `Esc` запрашивает отмену, но `F10` не завершает - процесс немедленно. -- В диалоге `Enter` подтверждает кнопку, а не открывает файл под курсором. -- После закрытия диалога то же событие не передаётся панели повторно. -- `F10` во время job игнорируется с подсказкой отменять операцию через `Esc`; - подтверждение выхода открывается только после завершения или отмены job. -- В режиме панелей печатный символ передаётся однострочному редактору; - `Enter` выполняет непустую строку, а при пустой строке открывает запись. -- В pseudo-shell `Up/Down` листают историю команд, а не панель; `Ctrl+O` - возвращает панели с сохранёнными путями и курсорами. -- `Esc` сначала очищает непустую команду, затем закрывает полноэкранный режим; - событие не передаётся следующему контексту повторно. - -## 7. Нормализация управляющих ASCII-кодов - -На части клавиатур `Ctrl+буква` может приходить как ASCII `0x01–0x1A` без -надёжного сохранения состояния Ctrl. Поэтому ввод должен распознавать -следующие значения независимо от `kbd_mod_state()`: - -| ASCII | Комбинация | Команда | -|---:|---|---| -| `0x12` | `Ctrl+R` | `SC_CMD_REFRESH` | -| `0x15` | `Ctrl+U` | `SC_CMD_SWAP_PANELS`, после PoC | -| `0x0F` | `Ctrl+O` | `SC_CMD_TOGGLE_SHELL`, обязательно к 1.0 | -| `0x11` | `Ctrl+Q` | `SC_CMD_QUICK_VIEW`, после PoC | -| `0x0C` | `Ctrl+L` | `SC_CMD_INFO_PANEL`, после PoC | - -`Tab` (`0x09`), `Enter` (`0x0D`), `Esc` (`0x1B`) и `Backspace` (`0x08`) -обрабатываются как обычные управляющие ASCII-клавиши. - -P1 в MAME показал второй, фактически основной для текущего DSS путь: - -| Комбинация | ASCII | Raw scan | Base scan | `kbd_mod_state()` | Compact | -|---|---:|---:|---:|---:|---:| -| `Ctrl+R` | `00` | `93` | `13` | `0028` | `02` | -| `Ctrl+PgUp` | `00` | `D9` | `59` | `0028` | `02` | -| `Alt+F1` | `00` | `BB` | `3B` | `0014` | `04` | -| `Esc` | `1B` | `01` | `01` | `0000` | `00` | - -Таким образом, `sc_input` обязан поддерживать оба представления: сначала -управляющий ASCII-код, затем пару `(base scan, modifiers)`. Проверять raw -scan `93/D9/BB` прямо в таблице команд нельзя: базовый scan с модификатором -получается снятием бита 7. Скриншоты пробы находятся в -[`artifacts/mame-p1/keyboard-commander`](../artifacts/mame-p1/keyboard-commander/sprinter/0003.png). - -## 8. Предварительная карта полной версии - -Эта таблица резервирует привычные сочетания VC, но не является требованием -PoC. - -| Клавиша | Команда | Планируемая версия | -|---|---|---:| -| `Insert` | Выделить/снять выделение и перейти вниз | 0.2, выполнено | -| `Gray +` или `+` | Выделить по маске | 0.2, обычный `+` выполнен | -| `Gray -` или `-` | Снять выделение по маске | 0.2, обычный `-` выполнен | -| `Gray *` или `*` | Инвертировать выделение | 0.2, `*` выполнено | -| `F1` | Помощь | 0.4 | -| `F2` | Пользовательское меню | 0.4 | -| `F3` | Просмотр | 0.4 | -| `F4` | Редактор | 0.4 | -| `F5` | Копирование | 0.1/0.2 | -| `F6` | Перемещение/переименование | 0.2, локальный rename выполнен | -| `F7` | Создать каталог | 0.2, выполнено | -| `F8` | Удалить | 0.2, single и recursive group выполнены | -| `F9` | Главное меню | 0.4 | -| `F10` | Выход | 0.1 | -| `Alt+F1` | Диск левой панели | 0.4 | -| `Alt+F2` | Диск правой панели | 0.4 | -| `Alt+F7` | Поиск файлов | 0.6 | -| `Alt+F10` | Дерево каталогов | 0.6 | -| `Ctrl+R` | Перечитать панель | 0.1 | -| `Ctrl+F3..F6` | Name/ext/date/size, повтор меняет направление | 0.2 | -| `Ctrl+U` | Обменять панели местами | 0.4 | -| `Ctrl+O` | Панели / интерактивный полноэкранный pseudo-shell | 0.4/1.0 | -| `Ctrl+PgUp` | Родительский каталог | 0.1 | -| `Ctrl+\` | Корень текущего диска | 0.2 | -| `Ctrl+Q` | Quick view | 0.6 | -| `Ctrl+L` | Информационная панель | 0.6 | - -Shift-варианты функциональных клавиш не резервируются до появления -конкретной необходимости. Это предотвращает преждевременное копирование всей -таблицы VC без соответствующей функции. - -## 9. Нижняя строка клавиш - -Строка 31 содержит десять сегментов шириной по восемь символов. В PoC: - -```text -1 Help 2 Menu 3 View 4 Edit 5 Copy 6 Ren 7 Mkdir 8 Delete9 Menu 10 Quit -``` - -Это логическая схема, а не точная строка байтов. Названия сокращаются до -доступной ширины. Поддерживаемые действия (`F5`, `F10`) рисуются активным -цветом, остальные — неактивным. - -После добавления модификатора строка клавиш может временно показывать -назначения `Alt`/`Ctrl`, но это не входит в PoC. - -## 10. Проверки клавиатуры P1/P2 - -В P1 на MAME подтверждены F1–F10, восемь навигационных клавиш, -Insert/Delete, Esc, Ctrl+R, Ctrl+PgUp и Alt+F1. Отдельная проба также -подтвердила compact-состояния Shift=`01`, Ctrl=`02`, Alt=`04`. - -В P2 остаются поведенческие проверки уже внутри UI: - -1. `Tab`, `Enter` и `Backspace` во всех контекстах. -2. Одновременное удержание нескольких модификаторов. -3. CapsLock, NumLock и Rus/Lat. -4. Отсутствие повторного выполнения события после закрытия диалога. -5. Keyboard repeat на границах списка. -6. Приём `Esc` во время копирования большого файла. -7. Повтор P1-набора на реальном Sprinter. - -Любое расхождение с таблицей сначала оформляется отдельным репро и только -затем учитывается в Commander. diff --git a/applications/Volkov/docs/commander-requirements.md b/applications/Volkov/docs/commander-requirements.md deleted file mode 100644 index 699087d..0000000 --- a/applications/Volkov/docs/commander-requirements.md +++ /dev/null @@ -1,427 +0,0 @@ -# Sprinter Commander: требования к PoC и границы проекта - -Статус: требования PoC зафиксированы; gate P1 и ядро P2.1 пройдены в MAME - -Целевая платформа: Sprinter Sp2000, Z80, DSS 1.71.57 - -Инструментарий: SDCC 4.5, `sprinter-cc`, MAME 0.287 / BIOS 3.06 - -Связанные документы: -[архитектура](commander-architecture.md), -[клавиши и команды](commander-keymap.md), -[план разработки](commander-roadmap.md), -[экранный backend P2](p2-screen-backend.md), -[результаты P2.1](p2-screen-probe-results.md), -[результаты skeleton P2](p2-skeleton-results.md), -[результаты файловых панелей P3](p3-panel-results.md) - -## 1. Назначение документа - -Документ фиксирует проверяемые требования к первой работающей версии -файлового менеджера для Sprinter. Рабочее имя проекта — **Sprinter -Commander**, рабочее имя исполняемого файла — `SPRCMD.EXE`. - -PoC не является портом Volkov Commander. Это новая программа на C, -повторяющая привычную модель двухпанельного файлового менеджера с учётом -архитектуры памяти и API Sprinter. - -## 2. Референсы и правила их использования - -### 2.1. Volkov Commander 4.05 - -Используется как минимальный поведенческий образец: - -- компоновка двух панелей; -- клавиатурная навигация; -- назначение функциональных клавиш; -- общий сценарий работы пользователя. - -### 2.2. Volkov Commander 4.99 - -Используется как образец декомпозиции и источник функций для дальнейших -версий: - -- отдельные подсистемы панелей, экрана, клавиатуры и диалогов; -- отдельные операции копирования, удаления и изменения атрибутов; -- просмотрщик, редактор, поиск и дерево каталогов; -- описания файлов и архивные панели; -- разделение резидентного ядра и загружаемых частей. - -### 2.3. Dos Navigator 1.51 - -Используется только как архитектурный референс: - -- единый цикл событий и команды приложения; -- отделение модели панели от её представления; -- абстракция источника файлов; -- длительные операции с прогрессом и отменой; -- виртуальные панели для архивов и результатов поиска; -- история, конфигурация и внешние инструменты. - -Объектная система Turbo Vision, DOS overlays, XMS/EMS-код и прикладные -модули DN не переносятся. - -Исходный код, строки интерфейса и ресурсы референсов не копируются без -отдельного решения по лицензированию. Реализация проекта должна оставаться -собственной реализацией по описанному поведению. - -## 3. Определения версий - -**PoC 0.1** доказывает техническую реализуемость панелей, EMM-хранилища, -экранного буфера, копирования и запуска программ. - -**Рабочая версия** пригодна для повседневной работы с файлами и включает -безопасные групповые и рекурсивные операции. - -**Полная версия 1.0** соответствует основным возможностям VC 4.99, но не -пытается повторить весь набор утилит Dos Navigator. - -## 4. Пользовательский сценарий PoC - -После запуска программа переключается в текстовый режим 80x32, выделяет -необходимую память и показывает две панели. Обе панели первоначально -открывают текущий каталог запуска. - -Пользователь может: - -1. Перемещать курсор по активной панели. -2. Переключать активную панель клавишей `Tab`. -3. Входить в каталог клавишей `Enter`. -4. Возвращаться в родительский каталог. -5. Перечитывать содержимое активной панели. -6. Копировать один обычный файл в каталог пассивной панели. -7. Запускать выбранный `.EXE` и возвращаться в Commander. -8. Выйти по `F10` с освобождением всех ресурсов. - -## 5. Компоновка экрана PoC - -Экран имеет 80 столбцов и 32 строки. - -| Строки | Назначение | -|---:|---| -| 0 | Заголовки и текущие пути обеих панелей | -| 1–27 | Списки файлов, по 27 видимых записей | -| 28 | Итоги панелей: число записей и общий размер | -| 29 | Информация о текущей записи активной панели | -| 30 | Строка состояния, ошибок и прогресса | -| 31 | Подсказки функциональных клавиш | - -Левая панель занимает столбцы 0–39, правая — 40–79. Точные символы рамок -и палитра не являются контрактом PoC, но все символы должны корректно -отображаться в CP866. - -Renderer задаёт смысловые роли атрибутов независимо от конкретной палитры. -P2.2 подтвердил многоцветные планы в MAME: тема сохраняет исходные записи, -задаёт обе FLASH-пары и восстанавливает палитру при выходе. До аппаратного -подтверждения активная и пассивная панели всё равно различаются не только -цветом, но и глифами/маркерами. - -Полная перерисовка выполняется из собственного экранного буфера через -`sc_video`. Commander не использует дескрипторы окон BIOS: панели, меню и -диалоги — логические прямоугольники приложения. `sc_video` выводит их в -координаты глобального экрана через ESTEX/BIOS-функции без идентификатора -окна; прямой доступ к VRAM не используется. -Изменение курсора или одной строки панели не должно требовать повторного -чтения каталога. - -Прокрутка списка на одну строку может использовать прямоугольный ESTEX -`SCROLL 55h`, как `mdview2`, но рамка и соседняя панель остаются неподвижны, -а экранный EMM-буфер обновляется синхронно. Эта служба не является BIOS- -дескриптором окна; её аппаратная реализация исходниками `mdview2` не -доказана. Псевдографика задаётся raw-кодами CP866 из единого `sc_glyphs.h`. - -## 6. Функциональные требования PoC - -### REQ-BOOT: запуск и завершение - -- **REQ-BOOT-01.** Программа должна явно установить текстовый режим 80x32. -- **REQ-BOOT-02.** Перед изменением видеорежима и текущего каталога должны - быть сохранены исходные значения, если DSS позволяет их получить. -- **REQ-BOOT-03.** При штатном выходе освобождаются все EMM-блоки и закрываются - все открытые файлы. -- **REQ-BOOT-04.** Ошибка инициализации не должна оставлять изменённый - видеорежим или выделенную память. -- **REQ-BOOT-05.** Если обязательные четыре EMM-страницы выделить нельзя, - программа выводит понятную ошибку и завершает работу. -- **REQ-BOOT-06.** `F10` в обычном режиме открывает подтверждение выхода; - положительный ответ запускает штатный cleanup, отрицательный возвращает к - панелям. - -### REQ-PANEL: панели - -- **REQ-PANEL-01.** Панели имеют независимые пути, курсор и позицию прокрутки. -- **REQ-PANEL-02.** Активная панель визуально отличается от пассивной. -- **REQ-PANEL-03.** Каталоги отображаются перед обычными файлами. -- **REQ-PANEL-04.** Внутри групп записи сортируются по имени без учёта - регистра ASCII. -- **REQ-PANEL-05.** Для записи отображаются имя, размер, дата, время и - атрибут каталога/файла в объёме, который помещается в ширину панели. -- **REQ-PANEL-06.** После перечитывания каталог по возможности сохраняет - курсор на прежнем имени; если оно исчезло — на ближайшей допустимой - позиции. -- **REQ-PANEL-07.** Полный scan DSS использует `*.*`; шаблон `*` не считается - эквивалентным, поскольку не возвращает обычные имена с расширением. -- **REQ-PANEL-08.** Пустой каталог отображается корректно и остаётся - управляемым. -- **REQ-PANEL-09.** Родительский каталог представлен синтетической записью - `..`, кроме корня диска. -- **REQ-PANEL-10.** Записи `.` и `..`, возвращённые DSS, не должны - дублировать синтетическую запись. -- **REQ-PANEL-11.** Во всей линейке 0.1–1.0 панель хранит не более - 640 записей, включая синтетическую `..`. При превышении лимита - показывается предупреждение; запись за границу EMM-страницы - запрещена. Многостраничные панели и предел более 640 записей - относятся только к версии 2.0+. -- **REQ-PANEL-12.** Если DSS завершил `F_FIRST/F_NEXT` кодом 35 - (`TOO_MANY_FILES_IN_DIR`), уже прочитанные записи остаются доступны, а - последней добавляется красная виртуальная запись `>>> MORE...`. Она - сообщает о недоступном остатке каталога, не сортируется вместе с файлами - и не может быть целью файловой операции. - -### REQ-NAV: навигация - -- **REQ-NAV-01.** Поддерживаются `Up`, `Down`, `PgUp`, `PgDn`, `Home`, `End`. -- **REQ-NAV-02.** `Tab` переключает активную панель без изменения каталогов. -- **REQ-NAV-03.** `Enter` на каталоге открывает его в активной панели. -- **REQ-NAV-04.** `Ctrl+PgUp` и `Backspace` открывают родительский каталог. -- **REQ-NAV-05.** `Ctrl+R` перечитывает активную панель. -- **REQ-NAV-06.** Навигация внутри уже прочитанной панели не обращается к - файловой системе. -- **REQ-NAV-07.** Операция с активной панелью не должна неожиданно менять - путь пассивной панели. - -### REQ-FS: работа с DSS и путями - -- **REQ-FS-01.** PoC работает с именами DOS 8.3. Длинные имена не входят в - требования до отдельного подтверждения поддержки DSS. -- **REQ-FS-02.** Максимальный внутренний путь — 255 байт плюс завершающий - ноль. -- **REQ-FS-03.** Склейка пути и имени проверяет переполнение до обращения к - DSS. -- **REQ-FS-04.** Контекст текущего каталога DSS считается глобальным - ресурсом. После временной смены каталога модуль обязан восстановить - ожидаемый каталог приложения. -- **REQ-FS-05.** Одновременно приложение держит не более трёх файловых - дескрипторов; штатная операция копирования использует два. -- **REQ-FS-06.** Конец перебора каталога отличается от настоящей ошибки - `fnext()` по `errno` и контексту операции. - -### REQ-COPY: безопасное копирование одного файла - -- **REQ-COPY-01.** `F5` копирует выбранный обычный файл в текущий каталог - пассивной панели. -- **REQ-COPY-02.** Копирование каталогов и групп файлов в PoC запрещено с - явным сообщением. -- **REQ-COPY-03.** Если конечное имя уже существует, PoC отказывается от - операции и не изменяет существующий файл. -- **REQ-COPY-04.** Данные копируются блоками, а общий размер и позиция имеют - 32-битный тип. -- **REQ-COPY-05.** Поддерживаются файлы больше 64 КБ. -- **REQ-COPY-06.** Целевой файл сначала создаётся под уникальным временным - именем через семантику `O_EXCL`, после успешного закрытия переименовывается - в конечное имя. -- **REQ-COPY-07.** При ошибке или отмене временный файл закрывается и - удаляется. -- **REQ-COPY-08.** Между блоками проверяется `Esc`, а строка состояния - обновляет прогресс. -- **REQ-COPY-09.** Нулевой файл копируется корректно. -- **REQ-COPY-10.** В PoC сохранение времени и атрибутов файла не обязательно, - но должно быть предусмотрено в интерфейсе операции. -- **REQ-COPY-11.** Непосредственно перед переименованием временного файла - конечное имя проверяется повторно. Если оно появилось, операция завершается - без его изменения. -- **REQ-COPY-12.** Данные между открытыми файлами проходят непосредственно - через выделенную EMM-страницу, отображаемую в W3. Полноразмерный блоковый - буфер в W2 и изменяемый буфер внутри банка кода запрещены. -- **REQ-COPY-13.** Начиная с P18 успешно скопированный обычный файл получает - исходные FAT date/time и атрибуты readonly/hidden/system/archive. Время - задаётся temp до `close`, атрибуты — конечному имени после commit. -- **REQ-COPY-14.** Начиная с P19 существующий файл обрабатывается policy - overwrite/skip/rename; варианты overwrite-all и skip-all ограничены одним - F5. Overwrite использует backup в том же каталоге и rollback при отказе - commit, а readonly требует явного повторного решения. - -### REQ-EXEC: запуск программ - -- **REQ-EXEC-01.** `Enter` на имени с расширением `.EXE` запускает программу - через ESTEX `EXEC`. -- **REQ-EXEC-02.** Перед запуском Commander сохраняет логическое состояние - панелей и закрывает временные ресурсы операции. -- **REQ-EXEC-03.** После возврата восстанавливаются видеорежим, экран и - ожидаемый текущий каталог. -- **REQ-EXEC-04.** Активная панель перечитывается после возврата; пассивная - перечитывается, если запущенная программа могла изменить её каталог. -- **REQ-EXEC-05.** Ошибка загрузки `.EXE` показывается без завершения - Commander. -- **REQ-EXEC-06.** Обычный файл неизвестного типа в PoC не запускается. - -### REQ-UI: сообщения и состояние - -- **REQ-UI-01.** Ошибки не выводятся поверх структуры панели случайными - вызовами `printf`; они проходят через единый модуль сообщений. -- **REQ-UI-02.** Для каждой ошибки показываются действие, имя объекта и - текст/код ошибки, если они доступны. -- **REQ-UI-03.** `Esc` закрывает сообщение или отменяет текущую длительную - операцию; в обычном состоянии он не завершает программу. -- **REQ-UI-04.** Неподдерживаемые в PoC функциональные клавиши либо не - показаны, либо показаны неактивным цветом. -- **REQ-UI-05.** F6 local rename и F7 mkdir принимают только один проверенный - компонент DOS 8.3; `..`, маркер DSS и неоднозначная группа не передаются - файловой системе. -- **REQ-UI-06.** Rename обязан проверить отсутствие нового имени до DSS - `RENAME`, сохранить CWD и восстановить его после успеха или ошибки. -- **REQ-UI-05.** После закрытия сообщения восстанавливается экран из - логического экранного буфера. - -### REQ-MEM: память - -- **REQ-MEM-01.** Целевая конфигурация PoC — `--memory big --safe`. -- **REQ-MEM-02.** W2 содержит резидентное ядро, обычные данные, heap и стек; - банковские функции размещаются в W1; W3 используется только для EMM- - данных. -- **REQ-MEM-03.** PoC выделяет четыре 16-КБ страницы: две для панелей, одну - для экранного буфера и одну для рабочей области копирования. -- **REQ-MEM-04.** Прикладной код не хранит указатели в диапазон - `0xC000–0xFFFF` между вызовами хранилища. -- **REQ-MEM-05.** Любой модуль, временно меняющий W3, восстанавливает прежнюю - страницу до возврата и до вызова чужого кода. -- **REQ-MEM-06.** Повторное чтение каталогов не выделяет новые блоки. -- **REQ-MEM-07.** Освобождение частично созданного приложения идемпотентно на - уровне состояния приложения: каждый реально выделенный блок освобождается - ровно один раз. -- **REQ-MEM-08.** Рабочая EMM-страница копирования принадлежит общему блоку - `ScApp`; copy job не выделяет и не освобождает её на каждый файл. - -## 7. Формат записи каталога PoC - -Логический формат записи фиксирован как 24 байта: - -```c -typedef struct { - char name[13]; - uint32_t size; - uint16_t date; - uint16_t time; - uint8_t attr; - uint8_t flags; - uint8_t reserved; -} ScDirEntry; -``` - -На этапе реализации обязательна compile-time или build-time проверка -`sizeof(ScDirEntry) == 24`. - -Флаги PoC: - -- `SC_ENTRY_PARENT` — синтетическая запись `..`; -- `SC_ENTRY_SELECTED` — выбор обычной записи в версии 0.2; -- `SC_ENTRY_DSS_LIMIT` — виртуальная запись о недоступном остатке каталога; -- остальные биты должны быть нулевыми. - -В одной странице используется не более 640 записей; последние 1024 байта -остаются резервом и не входят в массив записей. Служебное -состояние панели хранится в W2, а не в начале EMM-страницы. - -## 8. Нефункциональные требования - -- **REQ-NF-01.** Исходный код и комментарии проекта ведутся на русском. -- **REQ-NF-02.** Сборка выполняется штатным `sprinter-cc` без отдельной - проприетарной цепочки. -- **REQ-NF-03.** После каждого этапа сохраняется отчёт размеров HOME и - банков; переполнение банка является ошибкой сборки. -- **REQ-NF-04.** Реакция на навигационную клавишу в уже прочитанной панели не - должна визуально зависать; целевой ориентир в MAME — менее 100 мс. -- **REQ-NF-05.** Операция дольше 500 мс должна показывать состояние или - прогресс. -- **REQ-NF-06.** Все воспроизводимые дефекты DSS или SDCC подтверждаются - отдельным тестом, `.asm`, дампом или другим артефактом. -- **REQ-NF-07.** Рабочая версия должна проверяться в MAME и на реальном - Sprinter; PoC может быть принят по MAME с обязательным последующим - hardware smoke-test. - -## 9. Что не входит в PoC 0.1 - -- удаление файлов; -- перезапись существующих файлов; -- перемещение и переименование пользователем; -- создание каталогов; -- рекурсивные операции; -- групповое выделение и маски; -- командная строка и история; -- встроенные viewer/editor; -- дерево и поиск; -- архивы и виртуальные панели; -- мышь; -- конфигурационный файл, темы и локализация; -- длинные имена; -- фоновые операции и многозадачность. - -## 10. Критерии приёмки PoC - -PoC считается завершённым, если одновременно выполнены условия: - -1. Программа стабильно запускается в MAME с двухпанельным экраном. -2. Обе панели независимо проходят дерево каталогов и корректно работают с - пустым каталогом. -3. Хранилище панели проверено синтетическим source на границах 640/641 без - выхода за EMM-страницу; на DSS 1.71 превышение его границы 512 физических - FAT-записей даёт управляемый частичный список с красным маркером. - Оба случая подтверждены MAME-пробами в - [результатах P3](p3-panel-results.md). -4. Сто последовательных перечитываний и переходов не меняют число свободных - EMM-страниц. -5. Копируются и побайтно совпадают файлы размеров 0, 1, 4095, 4096, 65535, - 65536 байт и более 1 МБ. -6. Отмена и ошибка записи не оставляют временный файл. -7. Существующий целевой файл никогда не меняется. -8. Тестовый `.EXE` запускается, завершается, после чего Commander полностью - восстанавливает экран и продолжает работу. -9. Все пути ошибок возвращают приложение в управляемое состояние. -10. На выходе восстановлен видеорежим, закрыты дескрипторы и освобождены - выделенные EMM-блоки. - -## 11. Граница полной версии 1.0 - -Версия 1.0 должна дополнительно включать: - -- групповые и рекурсивные копирование, перемещение и удаление; -- безопасную политику перезаписи; -- сохранение атрибутов и времени; -- независимую для каждой панели сортировку по имени, расширению, - размеру и дате файла в обоих направлениях; -- переключение дисков; -- командную строку, историю, интерактивный полноэкранный - режим псевдооболочки по `Ctrl+O` и ассоциации; -- настраиваемую подсветку имён по расширению; -- просмотрщик и редактор, допустимо отдельными `.EXE`; -- меню, диалоги, помощь и конфигурацию; -- быстрый поиск, дерево и поиск файлов; -- информационную и quick-view панели; -- базовую работу с архивами; -- мышь. - -Обязательные детали этих функций: - -- групповые `+`, `-` и `*` работают только над файлами и не меняют флаг - каталога, даже если он был установлен отдельным `Insert`; -- `Ctrl+O` не просто скрывает панели, а переключает между ними и - управляемым полноэкранным режимом командной строки; -- полноэкранный режим и однострочный prompt используют один редактор строки и - общую историю; внешние `.EXE` запускаются через ESTEX `EXEC`; -- синтетическая `..` всегда первая, каталоги остаются перед файлами, - а направление применяется внутри этих групп; -- пункт сортировки «дата» использует метку создания/модификации, которую - реально возвращает файловая система; DSS `F_FIRST/F_NEXT` сейчас даёт - метку last-write, поэтому отдельный выбор creation не имитируется - дубликатом даты и требует отдельной платформенной пробы; -- при отсутствии файла цветов каталоги и `..` имеют белый цвет, `.EXE` — - жёлтый, остальные файлы — светло-серый; -- предел 640 записей не снимается ни одной из этих функций. - -Многостраничное/динамическое хранилище панели, межстраничная сортировка и -показ 1024/2048 или неограниченного числа файлов не входят в 1.0 и -резервируются для 2.0+. - -Терминал, модем, CD-плеер, форматирование, восстановление дисков, электронная -таблица, игры и многооконный desktop Dos Navigator не входят в определение -Commander 1.0. diff --git a/applications/Volkov/docs/commander-roadmap.md b/applications/Volkov/docs/commander-roadmap.md deleted file mode 100644 index 0717a46..0000000 --- a/applications/Volkov/docs/commander-roadmap.md +++ /dev/null @@ -1,751 +0,0 @@ -# Sprinter Commander: план разработки - -Статус: рабочий план - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[клавиши и команды](commander-keymap.md), -[платформенные пробы P1](p1-platform-probes.md), -[экранный backend P2](p2-screen-backend.md), -[результаты P2.1](p2-screen-probe-results.md), -[результаты P2.2](p2-palette-results.md), -[результаты skeleton P2](p2-skeleton-results.md), -[результаты файловых панелей P3](p3-panel-results.md), -[результаты копирования P4.1](p4-copy-results.md), -[результаты запуска EXE P4.2](p4-exec-results.md), -[результаты P5](p5-stability-results.md), -[результаты F7/P9](p9-mkdir-results.md), -[результаты F6/P10](p10-rename-results.md), -[результаты F8/P11](p11-delete-results.md), -[результаты group-copy/P12](p12-group-copy-results.md), -[результаты group-delete/P13](p13-group-delete-results.md), -[результаты стандартных цветов/P14](p14-default-colors-results.md), -[результаты recursive copy/P15](p15-tree-copy-results.md), -[результаты recursive group-copy/P16](p16-group-tree-copy-results.md), -[результаты recursive group-delete/P17](p17-tree-delete-results.md), -[результаты сохранения метаданных/P18](p18-metadata-results.md), -[результаты conflict-policy/P19](p19-copy-policy-results.md), -[UI-ориентир VC](ui-reference.md) - -Текущее состояние: - -- P0 — завершена первая редакция документации; -- P1 — обязательные платформенные примитивы подтверждены в MAME 0.287; - проверка на реальном Sprinter ожидается; -- P2.1 — ядро координатного экранного backend прошло MAME 0.287; -- P2 — многоцветный двухпанельный skeleton прошёл полный MAME-сценарий, - включая scroll, диалоги и повторный cleanup; аппаратная проверка ожидается; -- P2.2 — системная многоцветная палитра прошла отдельный MAME-тест; - аппаратная проверка ожидается; -- P3 — реальные две панели, EMM-store с границей 640/641, сортировка, - навигация, синтетическая `..` и предел DSS 35 прошли диагностические и - интеграционные MAME-тесты; аппаратная проверка ожидается. -- P4 — безопасное однофайловое копирование через EMM/W3 и запуск `.EXE` с - полным восстановлением окружения прошли HDD-сценарии MAME; аппаратная - проверка ожидается. -- P5 — завершён в MAME: пройдены 20 последовательных copy со всеми граничными - размерами, 100 refresh, три lifecycle, ENOSPC, readonly, ошибки - read/rename/ENOENT, отмена перед commit, смена носителя, отсутствующий EXE и - реальный `mdview2`. Аппаратный smoke-тест остаётся внешней проверкой. -- 0.2 — начат: независимые сортировки name/ext/size/date и reverse, выбор - `Insert`, `*`, `+`/`-` с масками, F7 mkdir и локальный F6 rename - реализованы и прошли target/UI-сценарии MAME; следующим идёт расширение - файловой job и рекурсивная обработка каталогов. Групповые F5 и F8 уже - обрабатывают файлы и выбранные directory roots; для F8 каталоги удаляются - после файлов обратным проходом очереди. F5 сохраняет FAT date/time и - файловые атрибуты R/H/S/A. Conflict-policy overwrite/skip/rename и all, - readonly re-prompt, backup/rollback выполнены; P5/P18 повторно пройдены. - Также досрочно реализован стандартный fallback цветов имён без файла - конфигурации. - -## 1. Целевые результаты - -Проект делится на три продуктовых рубежа: - -1. **PoC 0.1** — доказана работа архитектуры на Sprinter. -2. **Рабочая версия 0.4** — Commander пригоден для повседневных файловых - операций. -3. **Полная версия 1.0** — реализован основной набор возможностей VC 4.99 с - адаптацией к Sprinter. - -Dos Navigator задаёт идеи для расширяемости, но не объём версии 1.0. - -Вся линейка до 1.0 включительно использует одну EMM-страницу на панель и -жёсткий предел 640 показываемых записей. Его снятие — отдельная архитектурная -задача 2.0+. - -## 2. Допущения для оценки - -Оценки приведены для одного разработчика, знакомого с текущим Sprinter -C-Compiler и имеющего доступ к MAME. Один рабочий день означает день -сосредоточенной разработки, а не календарный день. - -В оценку входят: - -- реализация; -- целевые тесты; -- анализ `.asm`/`.map` при платформенной проблеме; -- MAME-прогон; -- обновление документации. - -В оценку не входят: - -- исправление неизвестных дефектов DSS; -- разработка отсутствующего архиватора; -- длительное ожидание доступа к реальному железу; -- перенос стороннего editor/viewer; -- создание графического режима интерфейса. - -Ожидаемая точность оценки: - -- PoC: `-20% / +40%`; -- этапы после PoC: `-25% / +60%`; -- архивы и editor: оцениваются повторно после исследования доступных программ. - -## 3. Сводный план - -| Этап | Результат | Оценка | -|---|---|---:| -| P0 | Спецификация и архитектура | 2–3 дня | -| P1 | Проверенные платформенные примитивы | 3–5 дней | -| P2 | Запускаемый двухпанельный skeleton | 4–5 дней | -| P3 | Полноценная навигация по двум панелям | 5–7 дней | -| P4 | Копирование одного файла и EXEC | 5–7 дней | -| P5 | Стабилизация PoC | 3–5 дней | -| 0.2 | Безопасное файловое ядро | 5–7 недель | -| 0.4 | Рабочая оболочка и внешние инструменты | 4–6 недель | -| 0.6 | Поиск, дерево и расширенные панели | 5–7 недель | -| 0.8 | Виртуальные источники и архивы | 6–10 недель | -| 1.0 | Надёжность, производительность, релиз | 5–8 недель | - -PoC требует ориентировочно 22–32 рабочих дня. Полная версия 1.0 — примерно -29–44 рабочих недели с учётом PoC. После исследования P1 оценки должны быть -пересмотрены по фактической скорости разработки. - -## 4. Зависимости этапов - -```text -P0 documentation - | - v -P1 platform probes - | - +------> EXEC probe -------------------+ - | | - v v -P2 app/screen/input skeleton P4 EXEC - | ^ - v | -P3 panel/store/filesystem --------> P4 copy - | | - +------------------+-------------------+ - v - P5 PoC hardening - | - v - 0.2 safe file core - | - +----------+-----------+ - v v - 0.4 shell/helpers 0.6 search/tree - +----------+-----------+ - v - 0.8 virtual sources - | - v - 1.0 - | - v - 2.0+ dynamic panel store -``` - -0.6 допускается начинать после стабилизации интерфейса панелей 0.2, но релиз -0.8 требует законченных 0.4 и 0.6. - -## 5. Фаза P0 — проектирование - -### Цель - -Превратить общую идею Commander в набор контрактов, по которым можно писать -и проверять код без постоянного возврата к исходникам VC. - -### Работы - -- зафиксировать границы PoC и версии 1.0; -- определить компоновку экрана; -- определить `ScDirEntry`, `ScPanel`, события и команды; -- выбрать режим памяти и владение EMM; -- описать безопасное копирование; -- описать запуск дочерней программы; -- определить клавиши PoC и будущий keymap; -- составить acceptance tests; -- зафиксировать лицензионное правило для референсов. - -### Артефакты - -- `docs/commander-requirements.md`; -- `docs/commander-architecture.md`; -- `docs/commander-keymap.md`; -- `docs/commander-roadmap.md`. - -### Критерий выхода - -Нет неизвестного продуктового решения, мешающего начать платформенные тесты. -Непроверенные технические детали перечислены как задачи P1, а не скрыты в -предположениях архитектуры. - -## 6. Фаза P1 — платформенные пробы - -### Цель - -Получить минимальные воспроизводимые программы для всех примитивов, от -которых зависит PoC. - -### P1.1. Каталоги и пути - -Проверить: - -- `getcwd`, абсолютные и относительные пути; -- `chdir` между двумя каталогами и дисками; -- шаблон для перечисления всех файлов; -- возвращает ли DSS `.` и `..`; -- конец `fnext()` и значение `errno`; -- имя корня и переход к родителю; -- максимальную практическую длину пути; -- поведение при смене/отсутствии носителя. - -Результат: таблица фактического поведения и тестовый `.exe`. - -### P1.2. EMM - -Проверить: - -- выделение блока из трёх страниц; -- получение всех физических страниц; -- чтение/запись начала и конца каждой страницы; -- сохранение W3 вокруг `bank_read/bank_write`; -- повторное выделение/освобождение; -- понятную ошибку при нехватке памяти. - -Результат: подтверждённая схема трёх страниц PoC. - -### P1.3. Экран - -На базе существующего теста `winrest` проверить app-local wrapper: - -- полный экран 80x32; -- вывод с ненулевого offset; -- частичный диапазон строк; -- все используемые атрибуты; -- восстановление после смены видеорежима; -- сохранность IX и W3. - -Результат: утверждённый ABI `sc_platform_winrest()`. - -### P1.4. Клавиатура - -Записать фактические `ascii`, `scan`, `kbd_mod_state` для клавиш из -`commander-keymap.md`. Отдельно проверить быстрое отпускание Ctrl после -`Ctrl+PgUp` и `Ctrl+R`. - -Результат: тестовая таблица и список подтверждённых комбинаций. - -### P1.5. EXEC - -Проверить: - -- формат параметров ESTEX `EXEC`; -- требуется ли отдельный `WAIT`; -- возврат к вызывающей программе; -- состояние W1/W2/W3 после возврата; -- состояние видеорежима и CWD; -- коды ошибок отсутствующего и повреждённого `.EXE`; -- взаимодействие с открытым загрузочным fd multi-bank программы. - -Результат: app-local wrapper и отдельный repro. - -### P1.6. Информация о диске и метаданные - -`DSKINFO` подтверждён в P1. `ATTRIB`, получение и установка даты/времени не -блокируют базовый PoC и проверяются перед реализацией соответствующих -операций версии 0.2. - -### Критерий выхода P1 - -- Все обязательные wrappers имеют воспроизводимый тест. -- Необъяснённых регистровых соглашений нет. -- Известно минимальное число требуемых страниц и fd. -- Архитектура обновлена по результатам проб. - -Критерий достигнут для MAME 0.287 / BIOS 3.06. Подтверждены EMM, DSKINFO, -F_FIRST/F_NEXT, полный и частичный WINREST, клавиши PoC, EXEC обоих режимов, -WAIT=`0x5A`, восстановление W1/W2/W3 и повторный EMM-тест после child. -Фактические значения и скриншоты приведены в -[p1-platform-probes.md](p1-platform-probes.md). - -Расширенные отрицательные случаи не блокируют skeleton P2 и перенесены к -этапам, где появится использующий их код: - -- переходы между дисками, корень, длинный путь и смена носителя — P3/P5; -- исчерпание EMM — P5; -- отсутствующий/повреждённый EXE и multi-bank loader fd — P4/P5; -- ATTRIB и изменение даты/времени — версия 0.2. - -## 7. Фаза P2 — skeleton приложения - -### Цель - -Получить запускаемое приложение с двумя пустыми панелями, экранной моделью и -управлением, но без чтения каталога. - -### Работы - -1. Создать `Makefile`, `src/`, `include/`, `banks/`, `tests/`. -2. Добавить `ScApp` и init/cleanup. -3. Настроить сборку `--memory big --safe`. -4. Выделить EMM-блок и получить три страницы. -5. Зафиксировать прошедший P2.1 coordinate-screen probe: полный и частичный - `WINREST`, `RDCHAR`, оба направления прямоугольного `SCROLL`, 1000 - операций и сохранение W3. -6. Реализовать `sc_video_system` на `WINREST`/`WRCHAR`/`SCROLL`; не - использовать BIOS window descriptors и прямой доступ к VRAM. -7. Реализовать screen buffer и полный/частичный present через `sc_video`. -8. Добавить `sc_glyphs.h` с CP866-глифами и test рамок, стрелок и block- - элементов. -9. Реализовать прямоугольный scroll одной панели в обоих направлениях; - синхронно сдвигать экранную EMM-модель и проверять границы прямоугольника. -10. Нарисовать две панели и нижнюю строку клавиш. -11. Реализовать `ScKeyEvent`, `ScCommand` и главный цикл. -12. Реализовать `Tab`, навигационные команды-заглушки и подтверждение `F10`. -13. Добавить единый message dialog. -14. Настроить первый интерактивный MAME-тест со скриншотом. -15. Подключить прошедший P2.2 модуль темы: сохранить затрагиваемые записи - четырёх планов, задать одинаковые normal/FLASH-пары и восстановить их при - cleanup. Повторить тот же тест на реальном Sprinter. - -### Критерий выхода P2 - -- `SPRCMD.EXE` собирается в `big`. -- Экран соответствует схеме 80x32. -- `Tab` меняет активную рамку. -- Однострочный scroll не двигает рамку, соседнюю панель и общие строки. -- Все соединения рамок, стрелки и block-элементы отображаются ожидаемыми - CP866-глифами. -- Экран остаётся читаемым во времени с подключённым многоцветным профилем. -- Диалог F10 работает в обоих направлениях. -- Выход освобождает EMM; повторные запуски не уменьшают свободную память. -- В `.map` есть зафиксированный запас HOME и банков. - -MAME-часть этих критериев достигнута 6 сентября 2026 года. Текущий skeleton -имеет 7 276 байт heap в HOME, пока не использует W1-банки и дважды подряд -восстановил число свободных EMM-страниц после выхода. Отдельный `sc_theme` -сохранил/установил/восстановил четыре палитровых плана. Подробный сценарий и -кадры: [p2-skeleton-results.md](p2-skeleton-results.md). - -Аппаратный прогон остаётся внешним gate. Многоцветная тема P2.2 прошла MAME; -на реальном Sprinter она проверяется вместе с остальными критериями P2. - -## 8. Фаза P3 — панели и каталог - -### Цель - -Реализовать независимую навигацию по настоящей файловой системе. - -### Работы - -- `ScDirEntry` и build-time проверка размера 24 байта; -- EMM store get/put/clear; -- scan настоящего каталога; -- синтетический `..`; -- сортировка каталогов и файлов; -- panel renderer; -- cursor/top и постраничная навигация; -- вход в каталог, parent, refresh; -- сохранение позиции по имени; -- отдельные пути панелей; -- предупреждение о пределе 640 записей и отдельный красный маркер - ограничения DSS после ошибки 35; -- отображение ошибок носителя. - -### Порядок реализации - -1. Одна панель, маленький каталог. -2. Пустой каталог и корень. -3. Сортировка. -4. Прокрутка за 27 строк. -5. Вторая независимая панель. -6. Большой каталог и предел страницы. -7. Ошибки и восстановление CWD. - -### Критерий выхода P3 - -- Выполнены `REQ-PANEL`, `REQ-NAV` и `REQ-FS` PoC. -- Сто переходов/refresh не меняют EMM free pages. -- Каталог на пределе не повреждает screen page. -- Перемещение курсора не вызывает `ffirst/fnext`. -- После ошибки обе панели остаются управляемыми. - -## 9. Фаза P4 — копирование и запуск - -### P4.1. Копирование - -Порядок работ: - -1. Проверка выбранной записи и построение путей. -2. Проверка отсутствия конечного имени. -3. Генерация temp с `O_EXCL`. -4. Зарезервировать четвёртую EMM-страницу как рабочую область copy job. -5. Добавить симметричные операции `bank_read_page()`/`bank_write_page()` для - файлового обмена через W3 без полноразмерного буфера в W2. -6. Копирование логическими блоками 4096 байт; возможное увеличение блока — - только после измерения отзывчивости и скорости. -5. 32-битный прогресс. -6. Отмена через `Esc`. -7. Cleanup на каждой точке ошибки. -8. Повторная проверка конечного имени. -9. Rename temp и refresh пассивной панели. -10. Тесты размеров и побайтовое сравнение. - -### P4.2. EXEC - -Порядок работ: - -1. Запуск минимального дочернего `.EXE`. -2. Восстановление видеорежима и экрана. -3. Восстановление CWD. -4. Refresh панелей. -5. Обработка ошибки запуска. -6. Запуск существующего viewer как интеграционный тест. - -### Критерий выхода P4 - -- Выполнены `REQ-COPY` и `REQ-EXEC`. -- Большой файл копируется без 16-битного переполнения. -- Cancel/error не оставляют temp. -- Существующий файл не изменяется. -- После дочерней программы Commander продолжает принимать команды. - -## 10. Фаза P5 — стабилизация PoC 0.1 - -### Обязательная матрица - -| Область | Сценарии | -|---|---| -| Каталог | пустой, один файл, 27/28, synthetic 640/641, DSS >512 физических записей | -| Навигация | границы, repeat, две разные глубины каталогов | -| Файлы | 0, 1, 4095, 4096, 65535, 65536, более 1 МБ | -| Ошибки | ENOENT, EACCES/readonly, ENOSPC, смена носителя | -| Copy cleanup | cancel в начале/середине/конце, ошибка read/write/rename | -| EXEC | успех, отсутствующий файл, плохой EXE, возврат с другим экраном | -| Ресурсы | 100 refresh, 20 copy, повторные запуск/выход | -| Экран | полный redraw, dirty rows, диалог, возврат из EXE | - -### Артефакты релиза PoC - -- `SPRCMD.EXE`; -- Makefile с `floppy`, `hdd` и `run`; -- MAME-тесты и контрольные скриншоты; -- test files с известными размерами/checksum; -- отчёт размеров HOME/банков; -- список известных ограничений; -- инструкция запуска. - -### Release gate 0.1 - -Все десять критериев раздела 10 требований выполнены. Наличие известной -ошибки, способной повредить чужой файл или потерять EMM-блок, блокирует релиз. - -Release gate выполнен в MAME 0.288 / BIOS 3.06 / DSS 1.71.57. Сводка, -команды воспроизведения и ограничения зафиксированы в -[p5-stability-results.md](p5-stability-results.md) и -[poc-0.1-release.md](poc-0.1-release.md). Проверка на реальном Sprinter не -подменяется MAME и остаётся обязательным последующим smoke-тестом. - -## 11. Версия 0.2 — безопасное файловое ядро - -### Цель - -Сделать Commander пригодным для реальной работы с файлами без viewer/editor. - -### Функции - -- одна EMM-страница на панель и предел 640 записей сохраняются; -- `Insert`, `*`, `+`/`-` и маски выбора — выполнены; -- сортировки name/ext/size/date и reverse — выполнены и проверены в MAME; -- последовательная очередь выбранных файлов F5 — выполнена; -- рекурсивное копирование одного каталога и группы directory roots — - выполнено; traversal hardening для больших деревьев остаётся; -- F6 local rename — выполнено; межкаталожный/group move остаётся в работе; -- F7 mkdir — выполнено и проверено в MAME; -- F8 single file/empty-directory delete и recursive group delete выбранных - файлов и каталогов — выполнены, включая runtime-cancel; защитная policy - остаётся; -- cancel между файлами и блоками; -- overwrite/skip/rename и варианты all — выполнены для файлов, включая - backup/rollback и readonly re-prompt; merge существующих каталогов позже; -- проверка свободного места; -- сохранение даты, времени и атрибутов обычных файлов — выполнено и - проверено exact FAT-тестом; метаданные каталогов не входят в P18; -- защита readonly при overwrite — выполнена; delete/move policy остаётся; -- подсчёт итогов выбранной группы; -- переключение дисков минимум через диалог. - -### Внутренние работы - -- сохранить одностраничный store и добавить к `ScPanel` ключ и направление сортировки; -- расширить `ScJob` очередью и стеком каталогов; -- сохранить crash-safe temp/commit модель; -- добавить единый policy object для ошибок; -- определить поведение при частично успешной группе. - -### Критерий выхода 0.2 - -- Неделя dogfood без повреждения данных. -- Рекурсивные операции проходят дерево глубиной не менее 16 уровней. -- Рекурсивная job обрабатывает более 640 файлов суммарно в нескольких - каталогах, не превращая саму панель в многостраничную. -- Cancel оставляет уже завершённые файлы в определённом документированном - состоянии и не оставляет temp. -- Все разрушительные команды требуют подтверждения. - -## 12. Версия 0.4 — рабочая оболочка - -### Функции - -- однострочная командная строка; -- история команд и каталогов; -- интерактивный полноэкранный pseudo-shell по `Ctrl+O`; -- вставка имени/пути активной и пассивной панели; -- запуск `.EXE` с параметрами; -- file associations; -- пользовательское меню; -- F3 через отдельный viewer; -- F4 через отдельный editor; -- F9 и базовое меню; -- режимы панелей `Brief`/`Details` по образцу VC; -- конфигурационный файл; -- сохранение путей, sort mode и палитры; -- цветовые правила по расширениям; без файла: каталоги белые, EXE жёлтые, - остальные файлы светло-серые; -- `Ctrl+U`, `Ctrl+O`, root; -- полноценный drive dialog; -- краткая встроенная помощь. - -### Протокол helper-программ - -До реализации F3/F4 фиксируется небольшой контракт: - -- полный путь передаётся аргументом; -- код возврата различает успех, отмену и ошибку; -- helper не обязан восстанавливать экран; -- Commander всегда восстанавливает режим и перечитывает затронутую панель; -- для editor предусматривается признак изменения файла. - -### Критерий выхода 0.4 - -Commander можно использовать как основную оболочку DSS для навигации, -операций, запуска программ, просмотра и редактирования файлов. - -## 13. Версия 0.6 — возможности VC-класса - -### Функции - -- quick search по текущей панели; -- постоянные фильтры/маски панели; -- quick-view panel; -- info panel; -- размеры каталогов; -- сравнение каталогов; -- поиск файлов по имени; -- поиск текста в файлах, если скорость приемлема; -- виртуальная панель результатов поиска; -- дерево каталогов; -- история посещённых каталогов; -- descriptions (`description.ion`/настраиваемое имя), если формат выбран; -- изменение атрибутов и времени через UI. - -### Архитектурный gate - -Перед началом поиска должен быть стабилен интерфейс `ScSource`. Результаты -поиска не должны притворяться настоящим каталогом с помощью специальных -проверок по всему UI: они реализуются как отдельный source kind. - -### Критерий выхода 0.6 - -Поиск и дерево работают на объёмах, превышающих near-memory, а возврат из -виртуальной панели не теряет прежнее состояние настоящей панели. - -## 14. Версия 0.8 — виртуальные источники и архивы - -### Обязательные исследования - -- какие архиваторы реально существуют для Sprinter; -- можно ли получить листинг без распаковки; -- достаточно ли внешнего процесса и list-файла; -- какие форматы стоит поддерживать первыми; -- сколько памяти требует нативный decoder; -- разрешает ли лицензия включать выбранную реализацию. - -### Предпочтительная последовательность - -1. Внешний архиватор по шаблону команды. -2. Просмотр архива как read-only `SC_SOURCE_ARCHIVE`. -3. Извлечение выбранных файлов. -4. Копирование файла в архив, если внешний инструмент поддерживает. -5. Только затем — нативный decoder для одного востребованного формата. - -### Дополнительные функции - -- мышь; -- локализация строк через resource file; -- расширенная помощь; -- bookmarks; -- protocol внешних plugin/helper-программ; -- сохранённые наборы конфигурации. - -### Критерий выхода 0.8 - -Архивная и поисковая панели используют тот же panel UI без специальных -ветвей в renderer и навигации. Ошибка внешнего архиватора не повреждает -исходный архив. - -## 15. Версия 1.0 — релизная стабилизация - -К этому этапу уже должны быть закончены все назначенные функции 0.2–0.8. -Отдельно проверяются три обязательных релизных контракта: - -- командная строка и интерактивный полноэкранный pseudo-shell по `Ctrl+O`; -- сортировка каждой панели по имени, расширению, размеру и дате, по - возрастанию и убыванию; -- подсветка по типу файла с настраиваемыми цветами и заданным поведением - при отсутствии конфигурации. - -Предел панели 640 записей в 1.0 остаётся штатным документированным -ограничением. - -### Надёжность - -- проверка всех cleanup-path; -- защита от двойного освобождения; -- тесты нехватки EMM; -- тесты предела файловых дескрипторов; -- смена и извлечение носителя; -- read-only и disk full; -- повреждённые каталоги/архивы; -- отмена каждой длительной операции; -- безопасное обновление конфигурации через temp/rename. - -### Производительность - -- профилирование чтения больших каталогов; -- профилирование сортировок EMM; -- минимизация переключений W3; -- группировка dirty rows; -- размер блока copy по фактическим измерениям; -- размер HOME и каждого банка; -- время холодного запуска и возврата из helper. - -### Совместимость - -- MAME 0.287 / BIOS 3.06; -- реальный Sprinter Sp2000; -- DSS 1.71.57; -- floppy и HDD; -- минимум две конфигурации доступной EMM; -- CP866 и Rus/Lat состояние клавиатуры. - -### Документация релиза - -- руководство пользователя; -- полный keymap; -- описание конфигурации; -- восстановление после прерванной операции; -- ограничения файловой системы; -- лицензии и благодарности; -- руководство сборки; -- архитектурная памятка для добавления source/job/bank. - -### Release gate 1.0 - -- Нет известных дефектов потери или скрытой порчи данных. -- Все обязательные функции требований 1.0 реализованы; перенос любой из них - требует нового явного решения о составе релиза. -- Пройдены автоматические MAME-тесты и ручной hardware checklist. -- Размеры HOME/банков имеют документированный запас. -- Чистая сборка воспроизводима штатной командой проекта. - -## 16. Версия 2.0+ - -Первый архитектурный рубеж после 1.0 — просмотр каталогов, содержащих более -640 записей. Перед реализацией сравниваются два варианта. - -**Вариант A: потоковые логические страницы.** Рекомендуемый первый шаг: - -- в EMM по-прежнему находится только текущая страница и не более 640 строк; -- виртуальные `<<< PAGE n` и `>>> PAGE n` занимают места в этом лимите; -- при переходе каталог сканируется заново до требуемой логической позиции; -- каталоги и файлы отбираются двумя проходами, чтобы каталоги оставались - первыми во всём потоке; -- сортировка выполняется только внутри текущей страницы и так обозначается - в UI; -- изменение каталога между проходами сбрасывает просмотр на первую страницу. - -Текущий DSS API `F_FIRST/F_NEXT` не принимает ключ или направление -сортировки. Незавершённые итераторы двух панелей не сохраняются: каждый -переход заканчивает перебор либо начинает новый. - -Платформенная предпосылка варианта A: стабильный DSS 1.71 не умеет перейти -за 512-ю физическую FAT-запись и возвращает код 35. Потоковые страницы -становятся реализуемыми только после перехода на расширенный режим -`F_FIRST` (`B=0x80/0x81`) из экспериментальной ветки `beta_cdfs` либо после -эквивалентного исправления DSS. До этого `>>> MORE...` является только -информирующим маркером, а не переходом на страницу 2. Детали: -[dss-large-directories.md](dss-large-directories.md). - -**Вариант B: динамический EMM-store.** Он нужен, только если потребуются -глобальная сортировка и произвольный переход между страницами: - -- выбор модели 1024, 2048 или динамического предела по результатам замеров; -- выделение и освобождение динамической цепочки EMM-страниц; -- межстраничная сортировка или индекс без полной копии списка в W2; -- определённое поведение при нехватке EMM на части каталога; -- нагрузочные тесты многостраничных списков и отмены во время scan/sort. - -Для обоих вариантов виртуальные записи имеют отдельный тип и не участвуют в -выделении, файловых операциях и сортировке. Точный номер версии после 1.0 -фиксируется отдельным release gate; базовый релиз 1.0 от этого не зависит. - -Прочий backlog, не влияющий на релиз 1.0: - -- нативные архивные codecs; -- FTP/serial/network source при наличии транспорта; -- disk image source; -- сравнение и синхронизация деревьев; -- макросы; -- очередь нескольких jobs; -- background copy, только если появится безопасная модель многозадачности; -- интеграция viewer/editor в банки Commander; -- дополнительные режимы экрана. - -DOS-специфические функции DN — CD player, modem terminal, disk recovery, -spreadsheet, games и desktop окон — остаются отдельными приложениями. - -## 17. Правило изменения плана - -После каждого release gate обновляются: - -1. Фактическое время этапа. -2. Размер HOME и банков. -3. Число обязательных EMM-страниц. -4. Открытые платформенные риски. -5. Состав следующей версии. - -Новая функция не добавляется в текущий этап без одного из решений: - -- она устраняет блокирующий риск текущего release gate; -- она дешевле сейчас из-за уже изменяемого интерфейса; -- другая функция того же объёма явно исключается из этапа. - -Такой обмен фиксируется в этом документе, чтобы PoC и 1.0 не расширялись -неуправляемо. diff --git a/applications/Volkov/docs/dss-large-directories.md b/applications/Volkov/docs/dss-large-directories.md deleted file mode 100644 index 17292ef..0000000 --- a/applications/Volkov/docs/dss-large-directories.md +++ /dev/null @@ -1,100 +0,0 @@ -# DSS: большие каталоги и `F_FIRST/F_NEXT` - -## Вывод - -Стабильный DSS 1.71 не может перечислить каталог за пределами первых 512 -физических FAT-записей. Это ограничение внутреннего 16-КБ кэша DSS, а не -размера `ffblk_t`, адреса DTA, W2, W3 или EMM-хранилища Commander. - -Commander хранит до 640 элементов в EMM, но на стабильном DSS источник -может закончиться раньше. Код ошибки 35 принимается как частичный успех: -полученные элементы сохраняются, а последней добавляется красная виртуальная -строка `>>> MORE...`. - -## Подтверждение исходниками DSS - -Исходники находятся в `../../docs/sources/Estex-DSS` и закодированы в CP866. -Для чтения комментариев они просматривались через `iconv`, без изменения -оригинальных файлов. - -Стабильная ветка `master`, релизный срез `6078563`: - -- `DSS/defines.inc`: `DIRPAGE.buffer = 0xC000`; -- `DSS/FS/FAT.asm:LOADDIR`: за один раз читается ровно `0x4000` байт; -- размер `FAT_DIRECTORY_RECORD` равен 32 байтам; -- `SEARCH.Custom` начинает с `IX=0xC000` и прибавляет 32; -- после 512 записей IX переходит через `0xFFFF`, а - `SEARCH.error_too_many_files` возвращает - `DSS_Error.sys.TOO_MANY_FILES_IN_DIR`; -- `DSS/API/Find.asm:F_NEXT` отдельно проверяет `IX==0` и направляет выполнение - на ту же ошибку; -- комментарии `TODO` прямо требуют record index и загрузку другой части - каталога размером более `0x4000` байт. - -В системном `SYSTEM.DOS`, реально используемом MAME, найдены обе характерные -последовательности стабильной реализации: проверка `LD IX,0` и цикл -`ADD IX,32` до переноса. Бинарник на HDD и `dss171u.img` совпадают по SHA-256. - -## Почему старый тест показывал 682 - -Один ранний экран `P3DIR` показывал `count=682, errno=0`, но поле `last` -содержало `B0000599.DAT`. Проверка физического порядка тестового FAT-образа -показала: - -- записи 0 и 1 — `.` и `..`; -- `B0000599.DAT` — запись 511, то есть 512-я физическая запись; -- запись 512 уже имеет другое имя. - -Следовательно, DSS завершил реальный перебор точно на системной границе, а -старый диагностический `.EXE` исказил локальный счётчик и `errno`. Этот экран -не является доказательством чтения 682 записей. Исправленная проба хранит -счётчик и контрольные имена 511/512/513 в статической памяти. - -Матрица `tests/p3_enum_matrix` независимо получила для всех проверенных -вариантов `count=512, end_errno=35`: обычный wrapper, wrapper и цикл в W1, -чтение W3 и запись в EMM. - -## Семантика Commander 0.1–1.0 - -При `fnext() == -1 && errno == 35`: - -1. Ошибка не откатывает уже прочитанный каталог. -2. `panel.truncated` устанавливается в 1. -3. В конец добавляется `ScDirEntry` с флагом `SC_ENTRY_DSS_LIMIT` и именем - `>>> MORE...`. -4. Маркер всегда сортируется после файлов, рисуется красным и занимает один - из 640 слотов панели. -5. `Enter` и файловые команды не трактуют маркер как файл или каталог. - -Число видимых файлов может быть меньше 510: в 512 физических записей входят -`.`/`..`, удалённые записи и служебные записи длинных имён, которые DSS или -Commander отфильтровывают. - -## Расширенная ветка DSS - -В `origin/beta_cdfs` существует незавершённая реализация больших каталогов: - -- `B=0x80` — короткое имя и обход без старого предела; -- `B=0x81` — DOS-имя и обход без старого предела; -- хранится record index; -- при окончании страницы вызывается `LOAD_NEXT_DIR_PART_TO_DIR_CACHE`; -- старые режимы `B=0/1` намеренно ограничиваются 512 результатами для - совместимости. - -Это хороший upstream-прототип для версии 2.0, но не контракт стабильного DSS -1.71. До отдельной сборки и тестирования Commander не должен зависеть от -него. - -## Следствие для логических страниц Commander - -Предложенные `<<< PAGE n`/`>>> PAGE n` реализуемы без дополнительной памяти, -если DSS способен продолжить физический перебор после первой 16-КБ части. -На стабильном DSS повторный `F_FIRST/F_NEXT` снова остановится на тех же 512 -записях, поэтому настоящее переключение на PAGE2 требует одного из вариантов: - -1. стабилизировать расширенный режим `B=0x80/0x81`; -2. добавить эквивалентный API DSS с record index/offset; -3. как нежелательный запасной путь — реализовать raw FAT source вне DSS. - -Выбор делается после релиза 1.0; текущий красный маркер уже имеет отдельный -тип и сможет позднее стать переходом без изменения формата `ScDirEntry`. diff --git a/applications/Volkov/docs/p1-platform-probes.md b/applications/Volkov/docs/p1-platform-probes.md deleted file mode 100644 index 8819a85..0000000 --- a/applications/Volkov/docs/p1-platform-probes.md +++ /dev/null @@ -1,324 +0,0 @@ -# Sprinter Commander: платформенные пробы P1 - -Статус: MAME 0.287 / BIOS 3.06 — `PASS`; проверка на реальном Sprinter ожидается - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[клавиши](commander-keymap.md), -[roadmap](commander-roadmap.md), -[экранный backend P2](p2-screen-backend.md) - -## 1. Назначение - -Программа `p1probe.exe` объединяет платформенные проверки, которые должны -быть завершены до реализации UI Commander. Она не является ранней версией -Commander и не определяет его пользовательский интерфейс. - -Исходники находятся в `tests/p1_platform/`. - -Вторая программа, `p1child.exe`, используется только для проверки ESTEX -`EXEC`, возврата к родителю и кода завершения. - -## 2. Ограничения безопасности - -- Пробы не создают, не изменяют и не удаляют файлы. -- Каталожная проба выполняет только `getcwd`, `chdir(".")` и - `ffirst/fnext`. -- EMM-проба пишет только в выделенный ей блок из трёх страниц. -- Screen-проба пишет только в отдельную выделенную EMM-страницу. -- Дочерняя программа меняет видеорежим, но не пишет на диск. -- Проба не открывает файловые дескрипторы приложения напрямую. -- MAME не запускается целями `make` и `make all`. - -Первый MAME-прогон выполнен 6 сентября 2026 года после отдельного согласования. -Все запуски использовали автоматически пересоздаваемый `mc.img`; исходные -дисковые образы не изменялись программами-пробами. - -## 3. Состав - -| Файл | Назначение | -|---|---| -| `p1probe.c` | меню, общие сообщения, последовательность тестов | -| `p1_sys.c` | app-local wrappers DSKINFO, EXEC, WAIT, WINREST | -| `p1_emm.c` | выделение трёх страниц и проверка границ | -| `p1_dir.c` | CURDIR/CHDIR/F_FIRST/F_NEXT и DSKINFO output | -| `p1_screen.c` | полный и частичный WINREST с ненулевым offset | -| `p1_keyboard.c` | вывод `ascii/scan/live modifiers` | -| `p1_exec_test.c` | два режима EXEC и проверка состояния родителя | -| `p1child.c` | дочерний EXE, меняющий режим на 40x32 и возвращающий `0x5A` | -| `mame_dump_keys.lua` | вывод карты полей AT-клавиатуры MAME | -| `mame_p1_keyboard.lua` | воспроизводимый ввод стрелок, F1–F10 и сочетаний | -| `Makefile` | сборка обоих EXE | - -## 4. Сборка - -```sh -cd applications/Volkov/tests/p1_platform -make -``` - -Диагностическая программа собирается в режиме `small --safe`. Это сделано -намеренно: P1 проверяет платформенные ABI и не должен одновременно отлаживать -банковую topology Commander. Сборка `big --safe` является критерием P2. - -Дочерняя программа собирается как `tiny --safe`. - -### Результат текущей сборки - -`p1probe.exe`: - -- `_CODE`: 11 062 байта; -- данные: 2 741 байт; -- файл EXE: 11 835 байт; -- heap после статики: 17 429 байт; -- стек: 1 279 байт. - -`p1child.exe`: - -- `_CODE`: 3 907 байт; -- данные: 849 байт; -- файл EXE: 4 453 байта; -- heap после статики: 10 092 байта; -- стек: 1 279 байт. - -Компиляция выполнена без ошибок. Значения относятся к текущей диагностической -сборке и не являются бюджетом Commander. - -## 5. Статическая проверка ABI - -### 5.1. DSKINFO - -Сигнатура: - -```c -int p1_disk_info(uint8_t disk, P1DiskInfo *out); -``` - -Сгенерированный вызов передаёт `disk` в A, `out` в DE. Wrapper сохраняет IX, -а после RST сохраняет: - -- A — sectors per cluster; -- HL — total clusters; -- DE — free clusters; -- BC — bytes per sector. - -Размер `P1DiskInfo` проверяется typedef-assert и равен семи байтам. - -### 5.2. EXEC - -Сигнатура намеренно имеет 8-битный аргумент первым: - -```c -int p1_exec(uint8_t path_mode, const char *path); -``` - -Для этого порядка SDCC передаёт `path_mode` в A и `path` в DE. Wrapper -перекладывает их в B и HL соответственно. Вариант -`p1_exec(const char *path, uint8_t mode)` был отвергнут после просмотра -сгенерированного ASM: второй 8-битный аргумент SDCC помещал на стек, а не в -DE. - -На успехе A сохраняется как `p1_exec_exit_code`; на ошибке код из A проходит -через `__errno_set`. - -### 5.3. WINREST - -Wrapper повторяет уже подтверждённую раскладку `tests/winrest` и `mdview2`: - -```text -A row -L column -SP+2 height -SP+3 width -SP+4 physical page -SP+5..6 offset in 16-KB page -``` - -IX сохраняется, перед RST устанавливается в `0xC000 + offset`. Сгенерированный -вызов проверен для полного экрана `32x80` и окна `2x20` с offset `0x2000`. - -## 6. Меню `p1probe.exe` - -| Клавиша | Проба | Автоматическая оценка | -|---|---|---| -| `1` | Каталог и F_FIRST/F_NEXT | да, плюс наблюдаемые коды | -| `2` | EMM: три страницы | да | -| `3` | WINREST full/partial | только завершение; изображение оценивается визуально | -| `4` | Клавиатурные коды | сбор наблюдений | -| `5` | EXEC и возврат | да для режима B=1 | -| `6` | DSKINFO текущего диска | да | -| `A` | Пробы 1, 2 и 6 | да | -| `0`/`Esc` | Выход | — | - -## 7. Ожидаемые проверки - -### 7.1. Каталог - -Проба дважды перечисляет каталог по маскам `*.*` и `*`, печатает первые 20 -записей и итоговые значения: - -- число записей; -- наличие `.`; -- наличие `..`; -- `errno` последнего `fnext()`; -- совпадение результатов двух масок; -- сохранение CWD после `chdir(".")`. - -Фактический результат DSS различается: `*.*` вернул обе записи с расширением, -а `*` завершился как пустой список с `ENOENT`. Поэтому `*.*` принят как -обязательный шаблон полного scan; совпадение масок не предполагается. - -MAME-прогон установил фактическое завершение перечисления: `fnext()` -возвращает ошибку с `errno=3` (`ENOENT`). Код `0x0F` из старого описания DSS -для этой операции не подтверждён. Проба после измерения принимает только -`ENOENT`, чтобы возможная смена поведения не осталась незамеченной. - -### 7.2. EMM - -Проверяются: - -- `mem_alloc_pages(3)`; -- три различных физических номера; -- первые 64 байта каждой страницы; -- последние 64 байта каждой страницы; -- независимые patterns страниц; -- восстановление `mem_info.free_pages` после освобождения блока. - -### 7.3. Screen/WINREST - -Первый вызов должен показать полный экран 80x32 с рамкой и цветными строками. -После клавиши второй вызов должен наложить окно 20x2 в позиции row 14, -column 30. Данные второго окна лежат по offset `0x2000`, поэтому тест -одновременно проверяет корректность IX. - -Тест не открывает окно через BIOS: ESTEX WINREST здесь только копирует -прямоугольник в текущий текстовый экран. Повтор со снимками в `t=20` и `t=24` -без промежуточных вызовов подтвердил, что фон вне прямоугольника сохранён. - -Первая версия pattern использовала арифметически полученные атрибуты -`0x11..0x17`. Верхняя граница `0x11` была обычным blue-on-blue, а часть -остальных сочетаний выглядела неоднозначно в разных моментах палитрового -цикла. Замечание о синих символах на синем фоне подтвердилось; raw-арифметика -атрибутов в UI запрещается. - -После замены на именованные `COLOR(LIGHTBLUE..WHITE, BLUE)` полный экран и -частичное окно были видимы на кадрах `t=20` и `t=24`. Повторная проверка -исходных PNG установила, что их декодированные RGB-пиксели полностью -идентичны. Прежнее сообщение о чередовании P2 было ошибкой встроенного -предпросмотра, а не поведением MAME. - -Отдельная проба P2.2 сохранила, установила, прочитала обратно и восстановила -шесть атрибутов во всех четырёх планах; многоцветная сцена осталась стабильной. -Строка P1-SCR-03 ниже подтверждена как `PASS`. Детали — в -[результатах P2.2](p2-palette-results.md). - -### 7.4. Keyboard - -Для 24 событий печатаются: - -```text -ascii, scan, полное kbd_mod_state, compact Shift/Ctrl/Alt -``` - -`Esc` печатается последним и завершает сбор. В автоматическом MAME-сценарии -использован следующий набор из 24 событий: - -- стрелки, Home/End, PgUp/PgDn; -- F1–F10; -- Insert/Delete; -- Ctrl+R; -- Ctrl+PgUp; -- Alt+F1; -- Esc. - -### 7.5. EXEC - -Выполняются два случая: - -1. `B=0`, `P1CHILD.EXE` — наблюдение short-name/PATH semantics. -2. `B=1`, `.\\P1CHILD.EXE` — обязательный случай PoC. - -Дочерняя программа: - -- переключается в 40x32; -- показывает свои W1/W2/W3 и CWD; -- ждёт клавишу; -- возвращает `0x5A`. - -После возврата родитель проверяет: - -- результат непосредственного EXEC; -- результат WAIT; -- восстановление W1/W2/W3; -- восстановление CWD; -- возможность вернуть 80x32 и продолжить работу. - -Ошибка случая B=0 записывается как наблюдение и не проваливает PoC. Ошибка -B=1 проваливает тест. - -## 8. Выполненный порядок первого прогона - -1. `2` — EMM. -2. `6` — DSKINFO. -3. `1` — каталог. -4. `3` — WINREST. -5. `4` — клавиатура. -6. `5` — EXEC последним. -7. Повторно `2` в том же процессе после EXEC, чтобы проверить EMM. -8. Возврат в меню; независимые запуски дополнительно подтвердили повторный - старт программы. - -Такой порядок сначала проверяет неразрушительные примитивы и оставляет -наиболее сложное переключение контекста на конец. - -## 9. Таблица runtime-результатов - -Окружение MAME: `mame.arm` 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`, запуск -`p1probe.exe` с дискеты A:. `PENDING` в аппаратной колонке означает только -отсутствие прогона на реальном Sprinter и не отменяет результата MAME. - -| ID | Проверка | MAME 0.287 / BIOS 3.06 | Реальный Sprinter | Артефакт | -|---|---|---|---|---| -| P1-DIR-01 | CWD и `chdir(".")` | PASS | PENDING | [результат](../artifacts/mame-p1/directory/strict-enoent.png) | -| P1-DIR-02 | `*.*` против `*` | PASS: `2` против `0`; полный scan использует только `*.*` | PENDING | [результат](../artifacts/mame-p1/directory/strict-enoent.png) | -| P1-DIR-03 | Код конца F_NEXT | PASS, `ENOENT=3` | PENDING | [строгая проверка](../artifacts/mame-p1/directory/strict-enoent.png) | -| P1-EMM-01 | Блок 3 страницы | PASS, страницы `EF/F0/F1` | PENDING | [результат](../artifacts/mame-p1/emm/result.png) | -| P1-EMM-02 | Границы страниц | PASS | PENDING | [результат](../artifacts/mame-p1/emm/result.png) | -| P1-EMM-03 | Счётчик после free | PASS, `221 → 221` | PENDING | [результат](../artifacts/mame-p1/emm/result.png) | -| P1-SCR-01 | Полный WINREST 80x32 | PASS, визуально | PENDING | [контрастный экран](../artifacts/mame-p1/winrest/full-contrast.png) | -| P1-SCR-02 | Offset WINREST | PASS, row 14 / col 30 / `0x2000` | PENDING | [фон и окно вместе](../artifacts/mame-p1/winrest/partial-contrast-stable.png) | -| P1-SCR-03 | Цветные атрибуты в двух моментах цикла | PASS, RGB кадров идентичен; P2.2 подтвердил 6 атрибутов × 4 плана | PENDING | [кадр 1](../artifacts/mame-p1/winrest/partial-flash-phase.png), [кадр 2](../artifacts/mame-p1/winrest/partial-contrast-stable.png), [P2.2](p2-palette-results.md) | -| P1-SCR-04 | Raw-атрибуты `0x11..0x17` | OBSERVED, raw-арифметика запрещена | PENDING | [неудачный исходный pattern](../artifacts/mame-p1/winrest/partial-phase-hidden.png) | -| P1-KBD-01 | Базовые scan-коды | PASS | PENDING | [таблица](../artifacts/mame-p1/keyboard-commander/sprinter/0002.png) | -| P1-KBD-02 | Ctrl/Alt modifiers | PASS | PENDING | [сочетания](../artifacts/mame-p1/keyboard-commander/sprinter/0003.png) | -| P1-EXE-01 | EXEC B=0 | PASS | PENDING | [результат](../artifacts/mame-p1/exec/result.png) | -| P1-EXE-02 | EXEC B=1 | PASS | PENDING | [результат](../artifacts/mame-p1/exec/result.png) | -| P1-EXE-03 | Exit/WAIT `0x5A` | PASS / PASS | PENDING | [результат](../artifacts/mame-p1/exec/result.png) | -| P1-EXE-04 | Восстановление W1/W2/W3 | PASS, `F3/F2/FF` | PENDING | [результат](../artifacts/mame-p1/exec/result.png) | -| P1-EXE-05 | EMM после двух EXEC | PASS | PENDING | [контроль](../artifacts/mame-p1/exec-then-emm/emm-result.png) | -| P1-DSK-01 | DSKINFO | PASS | PENDING | [результат](../artifacts/mame-p1/dskinfo/result.png) | - -### 9.1. Зафиксированные значения - -- DSKINFO: 1 сектор на кластер, 512 байт на сектор, 2847 кластеров всего, - 2814 свободно. -- EMM до выделения: 256 страниц всего, 221 свободна; после освобождения - снова 221. -- Оба режима EXEC: `rc=0`, `errno=0`, непосредственный exit=`5A`, WAIT=`5A`. -- CWD до и после child: `\`; страницы W1/W2/W3 до и после: `F3/F2/FF`. -- Модифицированная клавиша приходит с установленным битом 7 scan-кода: - Ctrl+R=`93`, Ctrl+PgUp=`D9`, Alt+F1=`BB`. После `scan & 0x7F` получаются - базовые коды `13`, `59`, `3B`; compact modifiers равны `02`, `02`, `04`. -- Esc: `ascii=1B`, `scan=01`. - -## 10. Условия завершения P1 - -MAME-часть P1 завершена: все обязательные строки имеют `PASS`, фактические -клавиатурные коды перенесены в keymap, завершение `fnext()` уточнено, -`EXEC B=1`/WAIT и EMM после child подтверждены, артефакты сохранены. - -Проверка на реальном Sprinter остаётся желательной аппаратной валидацией, -но не блокирует переход к P2 и реализацию platform API PoC. Если реальное -железо даст расхождение, оно оформляется отдельным репро и не маскируется -адаптацией UI. diff --git a/applications/Volkov/docs/p10-rename-results.md b/applications/Volkov/docs/p10-rename-results.md deleted file mode 100644 index 6d1ead5..0000000 --- a/applications/Volkov/docs/p10-rename-results.md +++ /dev/null @@ -1,77 +0,0 @@ -# Sprinter Commander: локальный rename 0.2/P10 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализованный срез F6 - -`F6` переименовывает одну текущую обычную запись внутри активного каталога. -Поддержаны как файлы, так и каталоги. Диалог начинает с текущего имени и -использует общий редактор; новое имя проходит тот же строгий validator одного -компонента DOS 8.3, что и F7. - -Это пока локальный `Rename`, а не полный VC `Move/Rename`: - -- межкаталожный move в пассивную панель ещё не выполняется; -- если в панели есть неоднозначная группа, команда явно отказывается от - операции; единственная выбранная текущая запись допустима; -- `..` и маркер предела DSS никогда не передаются файловой системе; -- совпадающее без учёта ASCII-регистра имя считается no-op. - -Низкоуровневый `sc_rename_local()` учитывает подтверждённое ограничение DSS -1.71: `RENAME` принимает два basename относительно CWD. Helper сохраняет CWD, -временно входит в активный каталог, проверяет отсутствие target через -`F_FIRST`, выполняет `rename()` и восстанавливает CWD. Таким образом -существующая запись не перезаписывается даже при иной семантике конкретной -версии DSS. - -## Проверка - -`RENRT.EXE` вызывает тот же helper и проверяет: - -- rename файла с побайтно неизменным содержимым; -- отказ при существующем target и сохранность обоих файлов; -- rename непустого каталога с сохранностью вложенного файла; -- CWD после успеха, collision и ошибки входа в каталог. - -После UI-сценария внешний checker извлекает HDD и подтверждает окончательные -имена и содержимое: - -```text -PASS: file/dir rename, no-overwrite, CWD restore и UI F6. -``` - -Контрольные состояния UI: - -- [диалог с исходным именем](../artifacts/mame-p10/rename/dialog-default.png); -- [`FINAL.BIN` создан и остался под cursor](../artifacts/mame-p10/rename/renamed-focused.png); -- [неизменное имя обработано как no-op](../artifacts/mame-p10/rename/unchanged-name.png); -- [существующий target отвергнут](../artifacts/mame-p10/rename/collision.png); -- [`..` не переименовывается](../artifacts/mame-p10/rename/virtual-guard.png); -- [неоднозначная группа не превращается в rename cursor](../artifacts/mame-p10/rename/group-guard.png); -- [штатный возврат в DSS](../artifacts/mame-p10/rename/clean-dss-return.png). - -## Размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P9 + UI footer | После P10 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9449 | 9463 | +14 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2143 | 2129 | -14 | -| BANK1 | 6477 | 6477 | 0 | -| BANK2 | 8303 | 10008 | +1705 | -| `SPRCMD.EXE` | 43026 | 43040 | +14 | - -В BANK2 остаётся 6376 байт, в BANK1 — 9907 байт. Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p10-rename ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p10_rename.chd \ - tests/mame_p10_rename.lua artifacts/mame-p10/local 65 -tests/check_p10_rename_hdd.sh build/hdd/p10_rename.chd -``` diff --git a/applications/Volkov/docs/p11-delete-results.md b/applications/Volkov/docs/p11-delete-results.md deleted file mode 100644 index f354f7e..0000000 --- a/applications/Volkov/docs/p11-delete-results.md +++ /dev/null @@ -1,71 +0,0 @@ -# Sprinter Commander: однообъектный delete 0.2/P11 - -Дата: 9 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализованный срез F8 - -`F8` удаляет одну текущую обычную запись только после модального -подтверждения: - -- обычный файл удаляется через `unlink()`; -- пустой каталог — через `rmdir()`; -- непустой каталог сохраняется и даёт управляемую ошибку; -- `N`/`Esc` отменяют команду без изменения носителя; -- `..` и маркер предела DSS не передаются файловой системе; -- в срезе P11 неоднозначная выбранная группа отклонялась; начиная с P13 - выбранные файлы удаляются группой, а выбранные каталоги пропускаются. - Это исторический контракт P11/P13; начиная с P17 каталоги выбранной группы - удаляются рекурсивно. - -Рекурсивное и групповое удаление намеренно не имитируются циклом вокруг -текущего cursor. Они будут реализованы общей файловой job с определённой -политикой частичного успеха и cancel. - -## Проверка - -Target-проба `DELRT.EXE` проверяет удаление обычного файла и пустого каталога -по полным путям, отказ для непустого каталога, сохранность соседнего файла и -неизменность CWD. UI-сценарий затем проверяет обе стороны подтверждения и -защитные ветки. После выхода дерево извлекается из CHD и проверяется -побайтно: - -```text -PASS: file/empty-dir delete, cancel, guards, nonempty и CWD. -``` - -Контрольные состояния: - -- [подтверждение удаления файла](../artifacts/mame-p11/delete/file-confirm.png); -- [cancel сохранил файл](../artifacts/mame-p11/delete/cancel-preserves.png); -- [файл удалён после подтверждения](../artifacts/mame-p11/delete/file-deleted.png); -- [пустой каталог удалён](../artifacts/mame-p11/delete/empty-dir-deleted.png); -- [непустой каталог сохранён](../artifacts/mame-p11/delete/nonempty-preserved.png); -- [`..` заблокирован](../artifacts/mame-p11/delete/virtual-guard.png); -- [неоднозначная группа заблокирована](../artifacts/mame-p11/delete/group-guard.png); -- [штатный возврат в DSS](../artifacts/mame-p11/delete/clean-dss-return.png). - -## Размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P10 | После P11 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9463 | 9496 | +33 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2129 | 2096 | -33 | -| BANK1 | 6477 | 6477 | 0 | -| BANK2 | 10008 | 10942 | +934 | -| `SPRCMD.EXE` | 43040 | 43073 | +33 | - -В BANK2 остаётся 5442 байта, в BANK1 — 9907 байт. Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p11-delete ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p11_delete.chd \ - tests/mame_p11_delete.lua artifacts/mame-p11/local 67 -tests/check_p11_delete_hdd.sh build/hdd/p11_delete.chd -``` diff --git a/applications/Volkov/docs/p12-group-copy-results.md b/applications/Volkov/docs/p12-group-copy-results.md deleted file mode 100644 index ee74acb..0000000 --- a/applications/Volkov/docs/p12-group-copy-results.md +++ /dev/null @@ -1,78 +0,0 @@ -# Sprinter Commander: групповое копирование файлов 0.2/P12 - -Дата: 9 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -Примечание: документ фиксирует исторический срез P12, где directory roots -ещё пропускались. Начиная с P16 текущий F5 копирует их рекурсивно; fixture и -checker P12 обновлены как регрессия нового контракта, а исходные кадры ниже -оставлены для истории этапа. - -## Контракт первого группового среза - -Если в активной панели нет выбора, F5 сохраняет проверенное поведение -однофайлового PoC. При ненулевом выборе F5: - -1. Считает выбранные обычные файлы и отдельно выбранные каталоги. -2. Последовательно копирует только файлы в порядке текущей сортировки панели. -3. Для каждого файла использует прежний crash-safe `temp -> commit` и общую - 4-КБ EMM-страницу W3. -4. Проверяет Esc между блоками и файлами. -5. При cancel/error удаляет только незавершённый temp; уже завершённые файлы - сохраняются. -6. Останавливается на первой ошибке и сообщает `copied/total`, число - пропущенных каталогов и errno. -7. Перечитывает passive panel один раз после завершённых копий. - -Выбранные каталоги намеренно игнорируются до появления рекурсивной job. Это -не меняет их флаг выбора и согласуется с правилом: групповые `+`, `-`, `*` -работают только над файлами. - -Overwrite по-прежнему запрещён. Повторный запуск поверх уже скопированных -файлов останавливается на первом `EEXIST`; существующие targets не меняются. - -## Проверка - -HDD-fixture содержит выбранный вручную `ADIR` и три файла размером 10, 4097 -и 0 байт. После первого F5 внешний checker подтверждает три побайтно точные -копии, отсутствие каталога и temp. Второй F5 проверяет управляемую остановку -на существующем `A.BIN`. - -```text -PASS: 3 selected files copied; selected directory skipped; no temp. -``` - -Контрольные состояния: - -- [каталог и три файла выбраны](../artifacts/mame-p12/group-copy/selected-files-and-dir.png); -- [скопировано 3/3, один каталог пропущен](../artifacts/mame-p12/group-copy/copied-and-skipped-dir.png); -- [повтор остановлен на EEXIST](../artifacts/mame-p12/group-copy/repeat-stops-eexist.png); -- [passive panel перечитана](../artifacts/mame-p12/group-copy/passive-refreshed.png); -- [штатный возврат в DSS](../artifacts/mame-p12/group-copy/clean-dss-return.png). - -## Компоновка и размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P11 | После P12 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9496 | 9496 | 0 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2096 | 2096 | 0 | -| BANK1 | 6477 | 6477 | 0 | -| BANK2 | 10942 | 12256 | +1314 | -| `SPRCMD.EXE` | 43073 | 43073 | 0 | - -Пробный перенос обработчика в новый BANK3 увеличивал EXE ровно на 16384 -байта при 2823 байтах полезного кода. Поэтому P12 оставлен в BANK2: там ещё -4128 байт запаса, а размер файла не вырос. Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p12-group-copy ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p12_group_copy.chd \ - tests/mame_p12_group_copy.lua artifacts/mame-p12/local 57 -tests/check_p12_group_copy_hdd.sh build/hdd/p12_group_copy.chd -``` diff --git a/applications/Volkov/docs/p13-group-delete-results.md b/applications/Volkov/docs/p13-group-delete-results.md deleted file mode 100644 index 8f11f44..0000000 --- a/applications/Volkov/docs/p13-group-delete-results.md +++ /dev/null @@ -1,78 +0,0 @@ -# Sprinter Commander: групповое удаление файлов 0.2/P13 - -Дата: 9 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -Это исторический контракт P13. Начиная с P17 выбранные каталоги не -пропускаются, а удаляются рекурсивно после одного общего подтверждения; новый -контракт и актуальные артефакты описаны в -[p17-tree-delete-results.md](p17-tree-delete-results.md). Текущий P13 fixture -оставлен как регрессия file-only группы. - -## Контракт первого группового среза F8 - -Если в активной панели есть выбранные записи, F8: - -1. Считает выбранные обычные файлы и выбранные каталоги отдельно. -2. Если выбранных файлов нет, не открывает подтверждение и сообщает, что - рекурсивное удаление каталогов ещё не реализовано. -3. Показывает одно подтверждение для всей группы файлов. -4. После подтверждения проходит EMM-store в порядке панели и удаляет только - выбранные записи без `FA_DIREC`. -5. Останавливается на первой ошибке. Уже удалённые файлы не восстанавливаются; - итог сообщает `deleted/total`, число пропущенных каталогов и errno. -6. После хотя бы одного успешного удаления перечитывает активную панель. - -Выбранные каталоги не удаляются и не обходятся рекурсивно. Это согласуется с -контрактом групповых `+`, `-`, `*`: групповые файловые команды отделяют файлы -от каталогов. При отсутствии выбора сохранён однообъектный F8 из P11: файл -удаляется через `unlink()`, пустой каталог — через `rmdir()`. - -## Проверка - -HDD-fixture содержит два выбранных файла, один невыбранный файл, выбранный -пустой каталог и выбранный непустой каталог. Сценарий сначала отменяет -групповое подтверждение, затем повторяет операцию с подтверждением. После -refresh отдельно выбирается только каталог: F8 обязан отказать без диалога и -без изменения носителя. - -После чистого выхода MAME дерево извлекается из CHD и проверяется побайтно: - -```text -PASS: selected files deleted; selected directories and KEEP preserved. -``` - -Контрольные состояния: - -- [два файла и два каталога выбраны](../artifacts/mame-p13/group-delete/selected-files-and-dirs.png); -- [одно подтверждение группы](../artifacts/mame-p13/group-delete/group-confirm.png); -- [отмена сохранила группу](../artifacts/mame-p13/group-delete/cancel-preserves.png); -- [файлы удалены, каталоги сохранены](../artifacts/mame-p13/group-delete/files-deleted-dirs-preserved.png); -- [directory-only группа отклонена](../artifacts/mame-p13/group-delete/directory-only-refused.png); -- [штатный возврат в DSS](../artifacts/mame-p13/group-delete/clean-dss-return.png). - -## Компоновка и размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P12 | После P13 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9496 | 9496 | 0 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2096 | 2096 | 0 | -| BANK1 | 6477 | 6477 | 0 | -| BANK2 | 12256 | 13267 | +1011 | -| `SPRCMD.EXE` | 43073 | 43073 | 0 | - -В BANK2 остаётся 3117 байт. HOME и размер EXE не выросли; межбанковый аудит -чист. - -## Воспроизведение - -```sh -make hdd-p13-group-delete ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p13_group_delete.chd \ - tests/mame_p13_group_delete.lua artifacts/mame-p13/local 58 -tests/check_p13_group_delete_hdd.sh build/hdd/p13_group_delete.chd -``` diff --git a/applications/Volkov/docs/p14-default-colors-results.md b/applications/Volkov/docs/p14-default-colors-results.md deleted file mode 100644 index 77cc493..0000000 --- a/applications/Volkov/docs/p14-default-colors-results.md +++ /dev/null @@ -1,62 +0,0 @@ -# Sprinter Commander: стандартные цвета имён P14 - -Дата: 9 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализованный профиль без конфигурации - -Renderer выбирает атрибут обычной строки по типу записи: - -- каталоги и синтетическая `..` — белые; -- файлы с точным регистронезависимым расширением `.EXE` — жёлтые; -- остальные файлы, в том числе без расширения, — светло-серые; -- виртуальный маркер предела DSS остаётся красным; -- cursor активной панели сохраняет отдельную контрастную cyan-подсветку. - -Цвет применяется ко всей строке записи, поэтому имя, размер и атрибуты не -расходятся визуально. `SC_ATTR_DIR` и `SC_ATTR_EXE` переиспользуют уже -сохранённые палитровые атрибуты frame/title; новый атрибут потребовался только -для обычного файла. - -Настраиваемые правила по расширениям и файл конфигурации ещё не реализованы. -Текущий профиль является обязательным fallback при отсутствии такого файла. - -## Проверка - -Отдельный HDD содержит `SUBDIR`, `APP.EXE`, `ARCHIVE.ZIP`, `README.TXT` и -`NOEXT`. [Контрольный кадр](../artifacts/mame-p14/default-colors/file-types.png) -показывает все три класса одновременно в активной и passive панелях. После -F10 [палитра DSS восстановлена](../artifacts/mame-p14/default-colors/clean-dss-palette.png). -Внешняя проверка извлечённого CHD подтверждает, что визуальный тест не изменил -fixture: - -```text -PASS: colour fixture preserved. -``` - -## Компоновка и размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P13 | После P14 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9496 | 9503 | +7 | -| данные W2 | 3256 | 3268 | +12 | -| свободная куча W2 | 2096 | 2077 | -19 | -| BANK1 | 6477 | 6477 | 0 | -| BANK2 | 13267 | 13388 | +121 | -| `SPRCMD.EXE` | 43073 | 43080 | +7 | - -Двенадцать байт DATA/BSS — сохранённые RGB трёх компонент для четырёх -палитровых планов нового атрибута. В BANK2 остаётся 2996 байт; межбанковый -аудит чист. - -## Воспроизведение - -```sh -make hdd-p14-default-colors ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p14_default_colors.chd \ - tests/mame_p14_default_colors.lua artifacts/mame-p14/local 36 -tests/check_p14_default_colors_hdd.sh build/hdd/p14_default_colors.chd -``` diff --git a/applications/Volkov/docs/p15-tree-copy-results.md b/applications/Volkov/docs/p15-tree-copy-results.md deleted file mode 100644 index 033d6a0..0000000 --- a/applications/Volkov/docs/p15-tree-copy-results.md +++ /dev/null @@ -1,117 +0,0 @@ -# Sprinter Commander: рекурсивный F5 одного каталога 0.2/P15 - -Дата: 9 сентября 2026 года. - -Статус: основной и отрицательные сценарии `PASS` в MAME 0.288 / BIOS 3.06 / -DSS 1.71.57 на HDD `D:`. - -## Реализованный контракт - -Если в активной панели нет выбранной группы и cursor стоит на обычном -каталоге, F5 рекурсивно создаёт одноимённое дерево в каталоге passive panel: - -- обход breadth-first, без рекурсии C-стека; -- каждый файл проходит прежний crash-safe `temp -> commit` и общий 4-КБ - copy-buffer в выделенной странице W3; -- одновременно открыты не более source и temp; -- пустые каталоги создаются; -- existing target не объединяется и не перезаписывается; -- Esc проверяется между каталогами и на каждом 4-КБ шаге файла; -- при cancel/error уже committed-файлы и созданные каталоги остаются, temp - текущего файла удаляется; -- CWD процесса восстанавливается и passive panel перечитывается после - изменения target. - -Начиная с P16 выбранные каталоги также добавляются как несколько roots в ту -же очередь. Этот документ фиксирует более узкий single-root срез P15. - -## Память обхода - -`sc_tree` на время одной операции выделяет одну дополнительную EMM-страницу. -Первые 256 байт сохраняют исходный CWD. Остаток содержит 1008 узлов по 16 -байт: `parent index + DOS 8.3 component + depth`. Абсолютный путь строится -перед операцией по цепочке parent; фиксированный предел глубины — 32, а общий -предел пути остаётся 255 символов. - -4-КБ данные файла не смешиваются с traversal queue и не размещаются в W2. -W3 отображается только внутри `bank_read/write` и `bank_read_page/ -bank_write_page`; вызовы сами восстанавливают прежнюю страницу. - -До добавления root проверяется, что каталог passive panel не совпадает с -source root и не лежит внутри него. Это запрещает саморастущее копирование. - -## Проверка - -Fixture включает пустой каталог, файлы размером 0, 15, 16 и 4097 байт и -цепочку из 16 вложенных уровней. MAME сообщил точный итог: - -```text -Tree copied: 4 files; 19 dirs. -``` - -После выхода source и target извлечены из CHD и сравнены как полные деревья: - -```text -PASS: recursive tree copied exactly; depth=16; no temp. -``` - -Повторный F5 остановился до изменения файлов: DSS вернул `EISDIR` (`errno -15`) для уже существующего target-каталога. Контрольные состояния: - -- [source TREE и пустой target](../artifacts/mame-p15/tree-copy/before.png); -- [успех 4 files / 19 dirs](../artifacts/mame-p15/tree-copy/success.png); -- [repeat остановлен на existing target](../artifacts/mame-p15/tree-copy/repeat-existing-target.png); -- [passive panel перечитана](../artifacts/mame-p15/tree-copy/passive-refreshed.png); -- [Esc удалил temp большого файла](../artifacts/mame-p15/tree-copy/cancel-clean.png); -- [target внутри source отклонён до mutation](../artifacts/mame-p15/tree-copy/self-target-refused.png); -- [чистый возврат в DSS](../artifacts/mame-p15/tree-copy/clean-dss-return.png). - -Отдельный cancel-fixture начал копирование `BIG.BIN` размером 4 МБ и подал -Esc до commit. Target root остался как определённый частичный результат, -файл и temp отсутствуют, source не изменён: - -```text -PASS: tree cancel removed active temp; source intact; no BIG commit. -``` - -Self-target fixture расположил passive panel в `SOURCE\TREE\INNER`. Операция -остановилась с `errno 14` (`EINVAL` отображается libc на родной DSS -`EUNKOP`) до первого `mkdir`; `INNER` остался пустым: - -```text -PASS: target-inside-source refused before mutation. -``` - -## Компоновка и размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P14 | После P15 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9503 | 9503 | 0 | -| данные W2 | 3268 | 3524 | +256 | -| свободная куча W2 | 2077 | 1821 | -256 | -| BANK1 | 6477 | 9687 | +3210 | -| BANK2 | 13388 | 14547 | +1159 | -| `SPRCMD.EXE` | 43080 | 43080 | 0 | - -256 байт W2 — единственный `ffblk_t` traversal engine. Крупная очередь -динамическая и в эти числа не входит. BANK1/BANK2 имеют соответственно 6697 -и 1837 байт запаса; межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p15-tree-copy ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p15_tree_copy.chd \ - tests/mame_p15_tree_copy.lua artifacts/mame-p15/local 60 -tests/check_p15_tree_copy_hdd.sh build/hdd/p15_tree_copy.chd - -make hdd-p15-tree-cancel hdd-p15-tree-self ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p15_tree_cancel.chd \ - tests/mame_p15_tree_cancel.lua artifacts/mame-p15/cancel 48 -tests/check_p15_tree_cancel_hdd.sh build/hdd/p15_tree_cancel.chd -tests/run_mame_hdd.sh build/hdd/p15_tree_self.chd \ - tests/mame_p15_tree_self.lua artifacts/mame-p15/self 48 -tests/check_p15_tree_self_hdd.sh build/hdd/p15_tree_self.chd -``` diff --git a/applications/Volkov/docs/p16-group-tree-copy-results.md b/applications/Volkov/docs/p16-group-tree-copy-results.md deleted file mode 100644 index 8a2714b..0000000 --- a/applications/Volkov/docs/p16-group-tree-copy-results.md +++ /dev/null @@ -1,72 +0,0 @@ -# Sprinter Commander: рекурсивный group F5 0.2/P16 - -Дата: 9 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализованный контракт - -При групповом F5 Commander сначала последовательно копирует выбранные файлы, -а затем добавляет все выбранные каталоги текущего уровня как независимые -roots в одну traversal queue P15. Для каждого root действует тот же контракт: - -- breadth-first обход и пустые каталоги; -- crash-safe temp/commit для файлов; -- cancel между файлами, каталогами и 4-КБ блоками; -- no-overwrite и self-target guard; -- один динамический EMM-блок очереди на всю группу; -- один refresh passive panel после операции. - -Если top-level файл даёт ошибку или cancel до запуска обхода, directory roots -остаются `unprocessed`. При ошибке одного tree root операция останавливается; -уже committed-файлы и созданные каталоги сохраняются. - -Это не меняет семантику `+`, `-`, `*`: групповые команды выделения по-прежнему -игнорируют каталоги. Каталог может попасть в F5-группу только после отдельного -`Insert`. - -## Проверка - -В active panel вручную выбраны `ADIR`, `BDIR` и `ROOT.BIN`; `KEEP.TXT` -оставлен невыбранным. Два root-каталога содержат по файлу, а `ADIR` — ещё и -пустой вложенный каталог. UI сообщил: - -```text -Tree copied: 3 files; 3 dirs. -``` - -Внешний checker сравнил target с точным ожидаемым множеством и подтвердил -отсутствие `KEEP.TXT` и temp: - -```text -PASS: selected file and two directory roots copied exactly. -``` - -Контрольные состояния: - -- [два каталога и файл выбраны](../artifacts/mame-p16/group-tree/selected-roots.png); -- [группа скопирована](../artifacts/mame-p16/group-tree/copied.png); -- [passive panel перечитана](../artifacts/mame-p16/group-tree/passive-refreshed.png); -- [чистый возврат в DSS](../artifacts/mame-p16/group-tree/clean-dss-return.png). - -## Компоновка - -`_CODE` W2, DATA, BANK1 и размер EXE не изменились относительно P15. BANK2 -вырос с 14547 до 14918 байт (+371); остаётся 1466 байт. Итоговая сборка: - -```text -_CODE 9503; DATA 3524; heap 1821 -BANK1 9687/16384; BANK2 14918/16384 -SPRCMD.EXE 43080 -``` - -Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p16-group-tree-copy ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p16_group_tree_copy.chd \ - tests/mame_p16_group_tree_copy.lua artifacts/mame-p16/local 60 -tests/check_p16_group_tree_copy_hdd.sh build/hdd/p16_group_tree_copy.chd -``` diff --git a/applications/Volkov/docs/p17-tree-delete-results.md b/applications/Volkov/docs/p17-tree-delete-results.md deleted file mode 100644 index e2cd426..0000000 --- a/applications/Volkov/docs/p17-tree-delete-results.md +++ /dev/null @@ -1,101 +0,0 @@ -# Sprinter Commander: рекурсивный group F8 0.2/P17 - -Дата: 10 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Контракт - -Если в панели есть выбранные записи, F8 показывает одно подтверждение для -всей группы. После подтверждения: - -1. выбранные обычные файлы верхнего уровня удаляются в порядке панели; -2. выбранные каталоги становятся корнями одного BFS-job; -3. содержимое каталогов перечисляется через `F_FIRST/F_NEXT`, файлы удаляются - по мере обхода, а найденные подкаталоги добавляются в очередь; -4. после полного scan очередь проходится в обратном порядке, поэтому каждый - дочерний каталог удаляется раньше родителя; -5. исходный CWD восстанавливается, динамическая EMM-страница освобождается, - активная панель перечитывается. - -Очередь та же, что у recursive F5: одна динамическая 16-КБ страница, 1008 -узлов по 16 байт, максимальная глубина 32. В W2 дерево не хранится. `Esc` -проверяется между шагами; уже выполненные удаления при ошибке или отмене не -откатываются, что явно отражается в статусе. - -При отсутствии группового выбора однообъектный F8 сохраняет прежний контракт: -файл удаляется, а каталог должен быть пустым. - -## Проверка - -Fixture содержит два выбранных дерева и выбранный файл, а также невыбранные -`KEEPDIR/SAFE.BIN` и `KEEP.TXT`. Первое дерево имеет пустой каталог, четыре -файла размеров 0/1/16/4097 и цепочку глубиной 12. Несколько файлов в одном -каталоге отдельно проверяют продолжение `F_NEXT` после `unlink` текущей -записи. - -Сценарий сначала отменяет общее подтверждение и убеждается, что выбор и -панель не изменились, затем подтверждает удаление. После выхода содержимое -CHD извлекается и проверяется побайтно: - -```text -PASS: selected file and two directory trees deleted; KEEP preserved. -``` - -Отдельный runtime-cancel fixture выбирает `TOP.BIN` и дерево из 180 -подкаталогов. `TOP.BIN` удаляется до начала обхода, затем Lua подаёт `Esc` во -время заполнения очереди. После отмены дерево остаётся доступным, завершённое -удаление не откатывается, `KEEP.TXT` не меняется: - -```text -PASS: runtime cancel kept remaining tree; completed TOP delete remains. -``` - -Чтобы `Esc` не ждал завершения длинной серии `F_NEXT`, delete-итератор -возвращает управление вызывающему коду после каждого добавленного каталога. - -Контрольные кадры: - -- [исходное дерево](../artifacts/mame-p17/tree-delete/before.png); -- [два каталога и файл выбраны](../artifacts/mame-p17/tree-delete/selected-file-and-trees.png); -- [общее подтверждение](../artifacts/mame-p17/tree-delete/group-confirm.png); -- [отмена до mutation сохранила группу](../artifacts/mame-p17/tree-delete/cancel-preserves.png); -- [после удаления остались только KEEP-объекты](../artifacts/mame-p17/tree-delete/deleted-keep-preserved.png); -- [чистый возврат в DSS](../artifacts/mame-p17/tree-delete/clean-dss-return.png). - -Runtime-cancel: - -- [выбранное дерево и верхнеуровневый файл](../artifacts/mame-p17/tree-delete-cancel/selected-before-cancel.png); -- [подтверждение](../artifacts/mame-p17/tree-delete-cancel/group-confirm.png); -- [частичный результат после Esc](../artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png); -- [чистый возврат в DSS](../artifacts/mame-p17/tree-delete-cancel/clean-dss-return.png). - -## Компоновка - -P17 остаётся в двух банках и не увеличивает образ EXE: каждый дополнительный -банк добавил бы 16 КБ независимо от фактического заполнения. Текущая сборка -`--memory big --safe --max-allocs 3000`: - -```text -_CODE 9503; DATA 3524; heap 1821 -BANK1 10562/16384; BANK2 15904/16384 -SPRCMD.EXE 43080 -``` - -В BANK2 остаётся 480 байт, поэтому следующий функциональный этап потребует -осмысленной перекладки модулей в BANK3. Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p17-tree-delete ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p17_tree_delete.chd \ - tests/mame_p17_tree_delete.lua artifacts/mame-p17/local 58 -tests/check_p17_tree_delete_hdd.sh build/hdd/p17_tree_delete.chd - -make hdd-p17-tree-delete-cancel ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p17_tree_delete_cancel.chd \ - tests/mame_p17_tree_delete_cancel.lua artifacts/mame-p17/cancel-local 50 -tests/check_p17_tree_delete_cancel_hdd.sh \ - build/hdd/p17_tree_delete_cancel.chd -``` diff --git a/applications/Volkov/docs/p18-metadata-results.md b/applications/Volkov/docs/p18-metadata-results.md deleted file mode 100644 index 94e583f..0000000 --- a/applications/Volkov/docs/p18-metadata-results.md +++ /dev/null @@ -1,89 +0,0 @@ -# Sprinter Commander: сохранение метаданных F5 0.2/P18 - -Дата: 10 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Контракт - -Одиночный, групповой и рекурсивный F5 сохраняют у каждого обычного файла: - -- FAT date/time, включая двухсекундную точность; -- атрибуты readonly, hidden, system и archive. - -Date/time задаются вызовом DSS `PUT_D_T` на открытом temp-файле после -последней записи и до `close()`. Атрибуты задаются через `ATTRIB` только -после атомарного rename temp в конечное имя. Такой порядок не делает temp -readonly до commit и сохраняет прежнюю защиту существующего target. - -Если ошибка происходит до rename, общий cleanup закрывает дескрипторы и -удаляет temp. Если `ATTRIB` или восстановление CWD завершаются ошибкой уже -после rename, `ScCopyJob.committed` не позволяет выдавать результат за -отсутствующий файл: UI сообщает `File committed; finalization failed`. - -Метаданные каталогов на этом этапе не переносятся. - -## Проверка - -Fixture создаёт `MSRC/META.BIN` размером 4097 байт с контролируемым payload, -датой `2001-02-03`, временем `04:05:06` и набором атрибутов `R/H/S/A`. -Подготовленный raw FAT проверяется до MAME, чтобы текущая дата сборки не могла -дать ложный положительный результат. - -После F5 извлекается конечный CHD и собственным FAT16-reader проверяются обе -32-байтовые directory entries и цепочка кластеров: - -```text -PASS: F5 preserved exact FAT date/time and R/H/S/A attributes. -``` - -На экране обе панели показывают одинаковые размер, `RHSA` и -`2001-02-03 04:05`; секунды и payload подтверждает raw-проверка. - -Контрольные кадры: - -- [исходные метаданные](../artifacts/mame-p18/metadata/source-metadata.png); -- [файл скопирован с теми же полями](../artifacts/mame-p18/metadata/copied-metadata.png); -- [пассивная панель после переключения](../artifacts/mame-p18/metadata/passive-metadata.png); -- [чистый возврат в DSS](../artifacts/mame-p18/metadata/clean-dss-return.png). - -После P18 повторно пройдены: - -- P5 copy-fault matrix: `ALL PASS`, CHD-check `PASS`; -- P16 recursive group F5: UI корректен, все выбранные деревья и файлы - совпали побайтно. - -## ABI DSS - -`sc_metadata_set_datetime()` раскрывает packed FAT date/time в поля -`PUT_D_T $18`. Низкоуровневый leaf получает handle в `A`, near-указатель на -семибайтовую структуру в `DE`, загружает год в `IX` и сохраняет caller IX. - -Для `ATTRIB $16` сгенерированный `.asm` подтвердил важную особенность -`__sdcccall(1)`: второй однобайтовый аргумент banked-wrapper лежит на стеке, -а `E` занят номером банка. Поэтому публичная banked-функция вызывает -локальный raw-leaf с обычным ABI; leaf снимает однобайтовый аргумент и адрес -возврата явно. Оба пути переводят `CF/A` в `errno`. - -## Компоновка - -Сборка `--memory big --safe --max-allocs 3000` остаётся двухбанковой и не -увеличивает EXE за счёт пустого третьего банка: - -```text -_CODE 9503; DATA 3531; heap 1814 -BANK1 11011/16384; BANK2 16145/16384 -SPRCMD.EXE 43080 -``` - -В BANK2 остаётся 239 байт. Следующий заметный UI/policy-модуль следует -размещать с осмысленной перекладкой в BANK3. Межбанковый аудит чист. - -## Воспроизведение - -```sh -make hdd-p18-metadata ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p18_metadata.chd \ - tests/mame_p18_metadata.lua artifacts/mame-p18/local 48 -tests/check_p18_metadata_hdd.sh build/hdd/p18_metadata.chd -``` diff --git a/applications/Volkov/docs/p19-copy-policy-results.md b/applications/Volkov/docs/p19-copy-policy-results.md deleted file mode 100644 index eccb5d1..0000000 --- a/applications/Volkov/docs/p19-copy-policy-results.md +++ /dev/null @@ -1,129 +0,0 @@ -# Sprinter Commander: conflict-policy F5 0.2/P19 - -Дата: 10 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Поведение - -Если конечное имя файла существует, F5 показывает единый choice-dialog: - -- `O` — безопасно заменить только этот файл; -- `S` — пропустить только этот файл; -- `R` — ввести другое DOS 8.3-имя; -- `A` — заменить этот и все следующие конфликтующие файлы текущей группы; -- `N` — пропустить этот и все следующие конфликты текущей группы; -- `Esc` — отменить текущую операцию. - -Policy `all` живёт только до завершения одного вызова F5 и распространяется -на top-level группу и файлы рекурсивной job. Readonly target не заменяется -молча даже после ранее выбранного `overwrite all`: для него снова появляется -диалог `Read-only target`. Групповые `+/-/*` по-прежнему работают только над -файлами; выбор каталогов через `Insert` не менялся. - -`Rename` меняет только имя target, проверяет один компонент DOS 8.3 и не -переименовывает source. Если новое имя тоже занято, policy запрашивается -повторно. - -## Транзакционная замена - -Существующий target не удаляется перед копированием. После полной записи и -закрытия нового temp выполняется последовательность: - -1. выбирается отсутствующее имя `~SBxxxx.BAK` в том же каталоге; -2. readonly временно снимается только после явного разрешения overwrite; -3. старый target переименовывается в backup; -4. новый temp переименовывается в target; -5. новому target назначаются исходные date/time и R/H/S/A; -6. backup удаляется. - -Если шаг commit нового temp не проходит, старый target переименовывается -обратно и его атрибуты восстанавливаются. Заранее существующие backup-имена -пропускаются, а не перезаписываются. Ошибка после необратимого commit -помечается `ScCopyJob.committed`, поэтому UI не сообщает, что target якобы -отсутствует. - -## Проверка - -Отдельная target-проба прошла на реальном DSS-пути: - -```text -PASS default still refuses existing target -PASS overwrite commits through backup -PASS explicit readonly overwrite -PASS pre-existing backup name skipped -PASS replace policy accepts vanished target -PASS distinct destination name -PASS rename failure rolls original target back -PASS EMM restored -ALL PASS -``` - -CHD-check побайтно подтвердил заменённые файлы, rollback исходного payload, -сохранность заранее созданного `~SB0000.BAK` и отсутствие новых backup/temp: - -```text -PASS: transactional overwrite, readonly, collision and rollback. -``` - -Полный UI-сценарий выбрал три файла для `overwrite all`, получил отдельный -readonly prompt, затем применил `skip all` к двум файлам, скопировал -`REN.BIN` как `NEXT.BIN` и отменил конфликт `CANCEL.BIN`. Итоговая проверка: - -```text -PASS: overwrite-all, readonly prompt, skip-all, rename and cancel. -``` - -Контрольные кадры target-пробы: - -- [ALL PASS](../artifacts/mame-p19/overwrite-core/all-pass.png); -- [чистый возврат](../artifacts/mame-p19/overwrite-core/clean-dss-return.png). - -UI policy: - -- [выбор overwrite all](../artifacts/mame-p19/policy/overwrite-choice.png); -- [повторный readonly prompt](../artifacts/mame-p19/policy/readonly-reprompt.png); -- [три файла заменены](../artifacts/mame-p19/policy/overwrite-complete.png); -- [выбор skip all](../artifacts/mame-p19/policy/skip-all-choice.png); -- [оба файла пропущены](../artifacts/mame-p19/policy/skip-complete.png); -- [rename-conflict](../artifacts/mame-p19/policy/rename-choice.png); -- [`NEXT.BIN` создан](../artifacts/mame-p19/policy/renamed.png); -- [отмена конфликта](../artifacts/mame-p19/policy/cancel-choice.png); -- [диалог полностью убран после Esc](../artifacts/mame-p19/policy/cancel-cleared.png); -- [итог пассивной панели](../artifacts/mame-p19/policy/target-result.png); -- [чистый возврат в DSS](../artifacts/mame-p19/policy/clean-dss-return.png). - -В процессе визуальная проверка нашла и устранила stale-dialog: после -одиночных conflict `error/cancel/skip` теперь выполняется полный redraw, а не -обновление только двух нижних строк. - -После итоговой правки повторно пройдены P5 copy-fault matrix и P18 exact FAT -metadata. - -## Компоновка - -EXEC-модуль перенесён из почти полного BANK2 в BANK1. Его строковые статусы -теперь всегда копируются в W2 BSS, поэтому наружу не уходит указатель на -bank-local literal. Это позволило оставить приложение двухбанковым: - -```text -_CODE 9503; DATA 3561; heap 1784 -BANK1 14374/16384; BANK2 15665/16384 -SPRCMD.EXE 43080 -``` - -Межбанковый аудит чист. В BANK1 остаётся 2010 байт, в BANK2 — 719. - -## Воспроизведение - -```sh -make hdd-p19-overwrite ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p19_overwrite.chd \ - tests/mame_p19_overwrite.lua artifacts/mame-p19/core-local 180 -tests/check_p19_overwrite_hdd.sh build/hdd/p19_overwrite.chd - -make hdd-p19-policy ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p19_policy.chd \ - tests/mame_p19_policy.lua artifacts/mame-p19/policy-local 200 -tests/check_p19_policy_hdd.sh build/hdd/p19_policy.chd -``` diff --git a/applications/Volkov/docs/p2-palette-results.md b/applications/Volkov/docs/p2-palette-results.md deleted file mode 100644 index c5bd447..0000000 --- a/applications/Volkov/docs/p2-palette-results.md +++ /dev/null @@ -1,81 +0,0 @@ -# Sprinter Commander: результаты палитровой пробы P2.2 - -Дата: 6 сентября 2026 года. - -Статус: `PASS` в MAME; проверка на реальном Sprinter ожидается. - -Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`. -Исходник пробы находится в `tests/p2_palette/p2palette.c`, кадры — в -[`artifacts/mame-p2/palette/`](../artifacts/mame-p2/palette/). - -## 1. Проверенный контракт - -Проба использует только публичные системные функции -`text_pal_get_color()`/`text_pal_set_color()`: - -- сохраняет шесть применяемых атрибутов во всех четырёх текстовых планах; -- задаёт normal-paper и flash-paper одинаковыми; -- задаёт normal-ink и flash-ink одинаковыми; -- читает обратно все 24 записи и сравнивает каждый RGB-компонент; -- показывает одновременно шесть контрастных цветовых сочетаний; -- перед выходом восстанавливает каждую сохранённую запись. - -Проверенные сочетания: white/blue, yellow/green, white/red, -white/magenta, black/lightgray и black/cyan. Runtime-результат: - -```text -Readback of 6 attrs x 4 planes: PASS (0 mismatches) -``` - -## 2. Стабильность изображения - -Пять кадров одной неизменной сцены сняты в разных моментах. После -декодирования PNG область экрана Sprinter во всех кадрах пиксельно идентична. -Единственное различие между первым и остальными кадрами — 42 пикселя в -прямоугольнике `x=0..13, y=42..44`: это внешний индикатор обращения к -`Drive A` в layout MAME, а не видеовыход Sprinter. Его состояние в экранных -тестах не учитывается. - -Файлы `phase-b.png`–`phase-e.png` идентичны целиком. Их SHA-256: - -```text -5eda33a6289dcd0afbb10573b70bcd701c428d6ed8f2aaae55d16c8d32dbe9cb -``` - -Артефакты: - -- [phase-a.png](../artifacts/mame-p2/palette/phase-a.png) — горит индикатор - Drive A; -- [phase-b.png](../artifacts/mame-p2/palette/phase-b.png), - [phase-c.png](../artifacts/mame-p2/palette/phase-c.png), - [phase-d.png](../artifacts/mame-p2/palette/phase-d.png), - [phase-e.png](../artifacts/mame-p2/palette/phase-e.png) — стабильная сцена; -- [restored-dos.png](../artifacts/mame-p2/palette/restored-dos.png) — возврат - в DSS после восстановления палитры. - -## 3. Исправление прежней интерпретации - -Ранее встроенный предпросмотр двух PNG ошибочно показал исчезновение части -цветных строк. Проверка исходных файлов опровергла это: - -- `partial-flash-phase.png` и `partial-contrast-stable.png` из P1 имеют - идентичные декодированные RGB-пиксели; -- все три исторически названных `flash-before-*.png` из P2.1 также полностью - идентичны; -- текущая P2.2-сцена различается только внешним LED дисковода MAME. - -Следовательно, гипотеза о нестабильных FLASH-планах была артефактом -предпросмотра. Она не является ограничением BIOS, libc, MAME или Commander. - -## 4. Принятое решение - -Многоцветная тема разрешена для Commander. Модуль `sc_theme`: - -- владеет точными RGB смысловых атрибутов; -- сохраняет только затрагиваемые записи всех четырёх планов; -- устанавливает одинаковые normal/FLASH-пары; -- восстанавливает исходные записи при любом штатном cleanup. - -До аппаратного прогона `PASS` относится к MAME 0.287 / BIOS 3.06. На реальном -Sprinter требуется проверить те же цвета и возврат исходной палитры после -выхода. diff --git a/applications/Volkov/docs/p2-screen-backend.md b/applications/Volkov/docs/p2-screen-backend.md deleted file mode 100644 index 522ae87..0000000 --- a/applications/Volkov/docs/p2-screen-backend.md +++ /dev/null @@ -1,270 +0,0 @@ -# Sprinter Commander: экранный backend P2 - -Статус: ядро P2.1 и многоцветная тема P2.2 прошли MAME; аппаратная проверка, -восстановление после child и измерение времени ожидаются. - -Связанные документы: -[архитектура](commander-architecture.md), -[требования](commander-requirements.md), -[roadmap](commander-roadmap.md), -[результаты P1](p1-platform-probes.md), -[результаты P2.1](p2-screen-probe-results.md), -[результаты P2.2](p2-palette-results.md) - -## 1. Решение - -Commander не использует систему оконных дескрипторов BIOS (`WIN_OPEN`, -`WIN_CLOSE`, `WIN_COPY_WIN`, `WIN_RESTORE_WIN`). Текущий BIOS хранит только -один описатель с идентификатором 0; открытие нового окна уничтожает прежнее -состояние. Диалоги, панели и меню поэтому являются прямоугольниками внутри -собственной модели экрана Commander, а не окнами BIOS. - -Целевой backend выводит в координаты полного экрана через системные функции, -но не открывает и не переключает BIOS-окна. Основной пакетный примитив — -ESTEX `WINREST`; для специальных операций доступны координатные `WRCHAR`, -`CLEAR` и `SCROLL`. Прямой доступ к VRAM не используется. - -## 2. Что уже доказано - -P1 и `examples/mdview2` подтвердили формат логического буфера: - -```text -(char, attr), по строкам, stride = width * 2, без padding -``` - -`WINREST` корректно выводит полный экран, отдельную строку и прямоугольник из -ненулевого смещения EMM-страницы. Эта функция ESTEX не создаёт BIOS-окно и не -использует его идентификатор; слово `WIN` здесь означает прямоугольную область -текущего экрана. - -`mdview2` — полезный образец полноэкранного приложения: состояние документа -принадлежит программе, строки материала выводятся из собственного кэша, а -status/menu рисуются координатными примитивами. Commander сохраняет этот -принцип, но выносит способ вывода в отдельный backend. - -## 3. Почему используем системный координатный вывод - -- DSS/BIOS уже знают реальное устройство текстового режима, знакогенератора, - активной screen page и системной палитры. -- `WINREST` выводит сразу прямоугольник из EMM, поэтому не требуется RST на - каждую ячейку. -- Координатные ESTEX-функции не используют идентификатор глобального окна. -- После возврата из child достаточно снова установить 80x32 и вывести всю - экранную модель. -- Один путь работает и в MAME, и на реальном Sprinter без предположений о - внутренней раскладке VRAM. - -## 4. Граница между оконными и безоконными функциями - -Запрещены функции управления глобальными окнами, где передаётся window ID: -`WIN_OPEN`, `WIN_CLOSE`, `WIN_COPY_WIN`, `WIN_RESTORE_WIN`, `WIN_MOVE_WIN`. -Они зависят от единственного поддерживаемого описателя 0. - -Разрешены: - -- ESTEX `WINREST 5Ah` — прямоугольник `(row, col, height, width)`, EMM page - и source address, без window ID; -- ESTEX `WRCHAR 58h`, `CLEAR 56h`, `SCROLL 55h` — абсолютные координаты - активной screen page; -- BIOS `LP_SET_PLACE`/`LP_PRINT_*`/`LP_CLS_WIN*` — только как пакетные - оптимизации для глобального экрана, без открытия новых окон. - -Системные вызовы чтения и записи текстовой палитры также разрешены. Их -отсутствие в P2.1 — способ изолировать экранный backend, а не архитектурный -запрет. Выделенный модуль темы использует их для полного save/set/restore; -контракт подтверждён P2.2. - -Чтобы renderer не зависел от текущего cursor/place, основным остаётся -`WINREST`. Если применяется BIOS `LP_*`, backend всегда сам устанавливает -place непосредственно перед операцией и не оставляет его частью состояния UI. - -## 5. Палитра и FLASH - -У Sprinter атрибут — индекс в четыре текстовых палитровых плана: paper, ink, -flash-paper и flash-ink. Сигнал FLASH переключает пары глобально. Чтобы тема -Commander не мигала, для каждого используемого атрибута normal-paper и -flash-paper задаются одинаково, как и normal-ink с flash-ink. - -Первый pattern P1 с raw-атрибутами `0x11..0x17` действительно содержал -blue-on-blue. Это ошибка выбора атрибутов, а не нестабильность палитры; -арифметическое построение атрибутов для UI поэтому по-прежнему запрещено. - -Прежняя гипотеза о пропадающих цветных строках была вызвана неверным -предпросмотром PNG. Проверка декодированных файлов показала, что именованные -цветные кадры P1 и три диагностических кадра P2.1 пиксельно идентичны. - -P2.2 отдельно проверил шесть цветовых атрибутов: - -- сохранены все 24 исходные записи (6 атрибутов × 4 плана); -- установлены одинаковые normal/FLASH-пары; -- обратное чтение дало `PASS (0 mismatches)`; -- пять временных кадров имеют одинаковый viewport Sprinter; -- перед выходом исходные записи восстановлены. - -Единственное изменение между двумя полными PNG находилось в служебной панели -MAME: 42 пикселя LED `Drive A`. Элементы layout вне viewport Sprinter в -экранных сравнениях не учитываются. Подробности — в -[результатах P2.2](p2-palette-results.md). - -## 6. Интерфейс backend - -Минимальный интерфейс не раскрывает ESTEX/BIOS остальным модулям: - -```c -int sc_video_init(void); -void sc_video_shutdown(void); -int sc_video_present_full(uint8_t emm_page); -int sc_video_present_rect(uint8_t emm_page, uint16_t offset, - uint8_t row, uint8_t col, - uint8_t height, uint8_t width); -int sc_video_scroll_rect(uint8_t row, uint8_t col, - uint8_t height, uint8_t width, - int8_t delta); -``` - -`sc_screen` строит `(char, attr)` в EMM и вызывает backend. Он не вызывает -`WIN_OPEN`, `WRCHAR`, `WINREST` или BIOS непосредственно. Единственная -реализация PoC — `sc_video_system.c`; выбор конкретного системного примитива -остаётся внутри неё. - -## 7. Вертикальный текстовый scroll - -`mdview2` использует эффективную схему для перемещения на одну строку: - -```text -Down: scroll(rect, UP) → нарисовать новую нижнюю строку -Up: scroll(rect, DOWN) → нарисовать новую верхнюю строку -PgUp/PgDn/Home/End → полный redraw области -``` - -Его viewport — `(col=0, row=1, width=80, height=30)`. Вызов libc -`scroll()` обращается к ESTEX `SCROLL 55h`, который сдвигает прямоугольник -активной screen page на одну строку. Он не использует идентификатор окна -BIOS и совместим с решением не применять window descriptors. - -Исходники `mdview2` и контракт ESTEX не доказывают, что операция реализована -аппаратным регистром видеоконтроллера: для документации это **системный -прямоугольный scroll**, пока не появится измерение или исходник DSS. Возможный -глобальный аппаратный сдвиг начала экрана для Commander всё равно неудобен — -он одновременно сдвинет рамки и обе панели. Реализация -`sc_video_scroll_rect()` делегирует прямоугольник ESTEX; это не создаёт -зависимости от BIOS-окон. - -Для Commander эта оптимизация применяется только когда `top` панели -изменился ровно на один. Прямоугольники — внутренности панелей без рамок: - -```text -left: col=1, row=1, width=38, height=27 -right: col=41, row=1, width=38, height=27 -``` - -Точные размеры уточняются renderer-геометрией, но центральный разделитель, -заголовок, footer и пассивная панель не должны входить в scroll rectangle. - -Экранный EMM-буфер остаётся источником истины. Поэтому -`sc_screen_scroll_rows()` сначала сдвигает соответствующие `(char, attr)` в -модели и строит открытую строку, затем вызывает `sc_video_scroll_rect()` и -выводит эту строку. Системный scroll без синхронизации модели запрещён: -после диалога или EXEC полный redraw иначе вернул бы старые строки. - -Fallback при любой неопределённости — present всех 27 строк активной панели. -P2.1 должен проверить четыре границы прямоугольника, оба направления, верх и -низ списка, 1000 последовательных scroll и неизменность соседней панели. - -## 8. Псевдографика и CP866 - -`mdview2` подтверждает стандартный light box-drawing набор CP866/CP437: - -| Имя | Код | Глиф | Имя | Код | Глиф | -|---|---:|:---:|---|---:|:---:| -| `SC_G_H` | `C4` | ─ | `SC_G_V` | `B3` | │ | -| `SC_G_TL` | `DA` | ┌ | `SC_G_TR` | `BF` | ┐ | -| `SC_G_BL` | `C0` | └ | `SC_G_BR` | `D9` | ┘ | -| `SC_G_TM` | `C2` | ┬ | `SC_G_BM` | `C1` | ┴ | -| `SC_G_ML` | `C3` | ├ | `SC_G_MR` | `B4` | ┤ | -| `SC_G_X` | `C5` | ┼ | | | | - -Стрелки для подсказок, если понадобятся: Up=`18`, Down=`19`, Right=`1A`, -Left=`1B`. Это управляющий диапазон ASCII, поэтому такие байты нельзя -передавать через API, интерпретирующий CR/LF/BEL/Esc. Они кладутся как raw -glyph непосредственно в `ScCell`. - -Правила Commander: - -- все коды сосредоточены в `sc_glyphs.h`, чисел `0xB3` по renderer-модулям - быть не должно; -- исходная рамка строится из глифов, а не из UTF-8-литералов; -- строки UI хранятся в CP866 или проходят явную build-time конвертацию; -- border test рисует все 11 соединений и четыре стрелки; -- атрибут каждого глифа задаётся через `COLOR(fg, bg)`; -- при координатном raw-выводе символы `<0x20` считаются глифами, а не - командами. - -Для PoC достаточно одинарных рамок. Двойные рамки VC-класса добавляются -после проверки полного набора соединений, чтобы не смешивать несовместимые -single/double junctions. - -Расширенный набор, уже подтверждённый таблицей конвертации `mdview2`, можно -зарезервировать для прогресса, отметок и будущих тем: - -| Имя | Код | Глиф | Назначение | -|---|---:|:---:|---| -| `SC_G_SHADE_LIGHT` | `B0` | ░ | светлая заливка | -| `SC_G_SHADE_MEDIUM` | `B1` | ▒ | средняя заливка | -| `SC_G_SHADE_DARK` | `B2` | ▓ | тёмная заливка | -| `SC_G_BLOCK` | `DB` | █ | полный блок | -| `SC_G_HALF_UP` | `DF` | ▀ | верхняя половина | -| `SC_G_HALF_DOWN` | `DC` | ▄ | нижняя половина | -| `SC_G_HALF_LEFT` | `DD` | ▌ | левая половина | -| `SC_G_HALF_RIGHT` | `DE` | ▐ | правая половина | -| `SC_G_BULLET` | `F9` | ∙ | маркер | -| `SC_G_CHECK` | `FB` | √ | отметка | -| `SC_G_SQUARE` | `FE` | ■ | квадрат | - -`mdview2_help.c` рисует рамку этими кодами через `wrchar()` и BIOS fill- -функции. Commander заимствует таблицу глифов и геометрию, но обращается к ним -только через `ScCell`/`sc_video`: текущий cursor/place не становится частью -модели интерфейса. - -## 9. Coordinate-screen probe P2.1 - -Отдельный `tests/p2_screen/p2screen.exe` выполнен в MAME 0.287 / BIOS 3.06: - -1. Режим 80x32 и одна EMM-страница экранной модели — `PASS`. -2. Полный экран одним `WINREST` с полной сверкой через `RDCHAR` — `PASS`. -3. Прямоугольник 20x2 из offset `0x2000` — `PASS`. -4. Две рамки и таблица CP866-глифов — `PASS` визуально и по `RDCHAR`. -5. Левая панель вверх и правая панель вниз — `PASS`; рамки и соседние клетки - совпали с моделью. -6. Синхронизация EMM-модели после системного `SCROLL` — `PASS`. -7. 1000 чередующихся однострочных scroll с итоговой полной сверкой — `PASS`. -8. Сохранение W3 вокруг `WINREST`, `RDCHAR` и `SCROLL` — `PASS`. -9. Один системный атрибут стабилен в трёх временных фазах — `PASS`, кадры - пиксельно идентичны. -10. Шесть атрибутов и четыре палитровых плана — `PASS` отдельной пробой P2.2. - -Остались отдельные проверки, не нужные для начала skeleton: - -11. Повторить полную инициализацию после child, изменившего видеорежим. -12. Сравнить время полного, однострочного и scroll-вывода. -13. Повторить принятый сценарий на реальном Sprinter. - -Подробные значения и кадры приведены в -[результатах P2.1](p2-screen-probe-results.md). - -## 10. Критерий выбора - -Системный backend принят для реализации skeleton по результату MAME, потому -что: - -- совпадает с EMM-моделью по символам и атрибутам; -- изолирует палитру в модуле темы и сохраняет отображение W3; -- частичное обновление не затрагивает соседние клетки; -- scroll прямоугольника не двигает рамку и пассивную панель; -- все псевдографические соединения совпадают с CP866; -- базовый системный атрибут стабилен во времени; -- код не обращается к `RGADR`, `RGMOD` и VRAM-банкам напрямую. - -До аппаратного принятия backend остаются прогон на реальном Sprinter и -повторная инициализация после EXEC. Многоцветность подтверждена отдельным -критерием P2.2 и не выводится из результата P2.1. diff --git a/applications/Volkov/docs/p2-screen-probe-results.md b/applications/Volkov/docs/p2-screen-probe-results.md deleted file mode 100644 index 0d29213..0000000 --- a/applications/Volkov/docs/p2-screen-probe-results.md +++ /dev/null @@ -1,81 +0,0 @@ -# Sprinter Commander: результаты экранной пробы P2.1 - -Дата: 6 сентября 2026 года. - -Статус: `PASS` в MAME; проверка на реальном Sprinter ожидается. - -Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`. -Исходники пробы находятся в `tests/p2_screen/`, сохранённые кадры — в -[`artifacts/mame-p2/`](../artifacts/mame-p2/README.md). - -## 1. Проверяемая граница - -`p2screen.exe` проверяет системный координатный backend, а не интерфейс -готового Commander: - -- экранная модель 80x32 хранится в EMM как пары `(char, attr)`; -- прямоугольники выводятся ESTEX `WINREST`; -- фактические клетки читаются ESTEX `RDCHAR`; -- области панелей сдвигаются ESTEX `SCROLL`; -- BIOS window descriptors не открываются; -- к `RGADR`, `RGMOD` и VRAM-банкам программа не обращается; -- палитра в принятом варианте теста не читается и не изменяется. - -Сборка: `--memory big --safe`. - -| Область | Значение | -|---|---:| -| `_CODE` | 4 458 байт (`0x8100..0x926A`) | -| данные | 581 байт (конец `0x94AF`) | -| EXE | 5 004 байта | -| heap после статики | 9 809 байт | -| стек | 1 279 байт | - -## 2. Runtime-результаты - -| Этап | Результат | Артефакт | -|---|---|---| -| Полный `WINREST` 80x32 и полная сверка `RDCHAR` | PASS | [full.png](../artifacts/mame-p2/screen/full.png) | -| Частичный `WINREST` 20x2 из offset `0x2000` | PASS | [partial-offset.png](../artifacts/mame-p2/screen/partial-offset.png) | -| Scroll внутренности левой панели вверх | PASS | [left-scroll-up.png](../artifacts/mame-p2/screen/left-scroll-up.png) | -| Scroll внутренности правой панели вниз | PASS | [right-scroll-down.png](../artifacts/mame-p2/screen/right-scroll-down.png) | -| 1000 scroll, синхронная EMM-модель, итоговая сверка `RDCHAR` и W3 | PASS | [stress-final.png](../artifacts/mame-p2/screen/stress-final.png) | -| Финальная сцена в трёх временных точках | PASS, файлы идентичны | [phase A](../artifacts/mame-p2/screen/stable-phase-a.png), [B](../artifacts/mame-p2/screen/stable-phase-b.png), [C](../artifacts/mame-p2/screen/stable-phase-c.png) | - -SHA-256 каждого из трёх финальных кадров: - -```text -dabeb114f8a7574462aeeb0731363608c1afa940da66d518f734335b36fe8f3b -``` - -Полная сверка после каждого функционального этапа сравнивала все 2560 клеток -экрана с EMM-моделью, включая рамки, пассивную панель и общие строки. Поэтому -`PASS` scroll означает не только появление новой строки, но и отсутствие -побочного сдвига соседней области. - -## 3. Граница палитры и исправление диагностики - -P2.1 намеренно принят с одним системным атрибутом `0x30` и не вызывает -палитровые функции: так координатный backend проверяется отдельно от темы. - -Первичная визуальная интерпретация диагностических PNG ошибочно сообщала, что -в одной временной фазе часть цветных символов исчезает. Проверка самих файлов -показала обратное: три `flash-before-*.png` имеют одинаковые SHA-256 и -одинаковые декодированные RGB-пиксели. Два именованных цветных кадра P1 также -пиксельно идентичны. - -Отдельная проба P2.2 затем подтвердила save/set/readback/restore всех четырёх -планов и стабильную сцену с шестью атрибутами. Подробности и исправление -ошибочной гипотезы приведены в -[результатах P2.2](p2-palette-results.md). - -## 4. Что ещё не проверено - -- повторная инициализация backend после child, сменившего видеорежим; -- измерение времени полного present, одной строки и системного scroll; -- тот же сценарий на реальном Sprinter; -- интеграционный прогон многоцветного `SPRCMD.EXE` после подключения темы. - -Эти пункты не блокируют реализацию экранной модели и skeleton P2. Аппаратный -прогон остаётся gate перед признанием backend полностью платформенно -подтверждённым. Многоцветная тема уже прошла отдельный MAME-gate P2.2. diff --git a/applications/Volkov/docs/p2-skeleton-results.md b/applications/Volkov/docs/p2-skeleton-results.md deleted file mode 100644 index d524927..0000000 --- a/applications/Volkov/docs/p2-skeleton-results.md +++ /dev/null @@ -1,98 +0,0 @@ -# Sprinter Commander: результаты двухпанельного skeleton P2 - -Дата: 6 сентября 2026 года. - -Статус: многоцветный skeleton `PASS` в MAME; файловая система и аппаратная -проверка ожидаются. - -Связанные документы: -[архитектура](commander-architecture.md), -[roadmap](commander-roadmap.md), -[экранный backend](p2-screen-backend.md), -[результаты P2.1](p2-screen-probe-results.md) - -## 1. Реализованная граница - -`build/sprcmd.exe` — первая запускаемая форма Commander, а не очередная -платформенная проба. В ней уже разделены: - -- `ScApp`, инициализация, главный цикл и идемпотентное состояние cleanup; -- три EMM-страницы: левая панель, правая панель и screen model; -- `sc_screen` — единственный владелец модели 80x32 `(char, attr)`; -- `sc_video_system` — `WINREST` и прямоугольный `SCROLL` без BIOS-окон; -- renderer двух панелей, status и строки функциональных клавиш; -- нормализованные `ScKeyEvent` и `ScCommand`; -- навигация по синтетическим P2-записям, включая системный scroll; -- единая модальная поверхность для сообщений и подтверждения выхода. - -Синтетические строки нужны только для проверки cursor/top и scroll. Они не -являются подменой каталога: `ffirst/fnext` skeleton не вызывает, настоящий -источник файлов добавляется в P3. - -## 2. Сборка - -Команда: `make`, конфигурация `--memory big --safe`. - -| Область | Значение | -|---|---:| -| `_CODE` | 7 129 байт (`0x8100..0x9CD9`) | -| данные | 443 байта (конец `0x9E94`) | -| EXE | 7 675 байт | -| heap после статики | 7 276 байт | -| стек | 1 279 байт | - -Банков кода skeleton пока не требует. Контракты уже рассчитаны на `big`, а -холодные функции будут переноситься в W1 по мере появления P3/P4-кода. - -## 3. MAME-сценарий - -Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`. -Сценарий воспроизводится файлом `tests/mame_p2_skeleton.lua`. - -| Действие | Наблюдение | Результат | -|---|---|---| -| Первый экран | две многоцветные панели 80x32, левая `[ACTIVE]`, cursor/top `0/0` | [PASS](../artifacts/mame-p2/skeleton-color/initial-left-active.png) | -| `Tab` | `[ACTIVE]` и `>` перешли на правую панель | [PASS](../artifacts/mame-p2/skeleton-color/tab-right-active.png) | -| `PgDn`, `Down` | правая панель показывает строки 002–028, cursor/top `28/2`; сосед и рамки неподвижны | [PASS](../artifacts/mame-p2/skeleton-color/navigation-scroll.png) | -| `F10` | красный диалог подтверждения поверх модели | [PASS](../artifacts/mame-p2/skeleton-color/quit-dialog.png) | -| `N` | обе панели и тема полностью восстановлены из EMM | [PASS](../artifacts/mame-p2/skeleton-color/quit-cancelled-restored.png) | -| `F1`, `Esc` | общий message dialog открылся и восстановил экран | [PASS](../artifacts/mame-p2/skeleton-color/reserved-command-dialog.png), [после закрытия](../artifacts/mame-p2/skeleton-color/message-closed-restored.png) | -| повторный `F10`, `Enter` | палитра восстановлена, штатный выход в DSS | [PASS](../artifacts/mame-p2/skeleton-color/clean-exit-dos.png) | -| второй запуск после выхода | приложение снова инициализировало EMM и тему | [PASS](../artifacts/mame-p2/skeleton-color/repeat-second-launch.png) | -| второй cleanup | возврат в DSS без сообщения об утечке EMM | [PASS](../artifacts/mame-p2/skeleton-color/repeat-second-clean-exit.png) | - -## 4. Проверка ресурсов - -В начале `sc_app_init()` сохраняет `mem_info.total/free`, затем выделяет один -блок из трёх страниц. `sc_app_cleanup()` освобождает блок, повторяет -`mem_info()` и возвращает ошибку, если оба значения не восстановились. При -ошибке основной модуль печатает отдельное сообщение и возвращает код 4. - -В MAME этого сообщения не было ни после первого, ни после второго процесса. -Второй процесс успешно выделил тот же объём и полностью отрисовался. Таким -образом, проверка включает и внутреннее сравнение счётчиков, и повторный -запуск с чистого состояния. - -## 5. Экран и палитра - -Skeleton не открывает BIOS window descriptors и не обращается к VRAM -напрямую. Панели и диалоги — прямоугольники в собственной EMM-модели. - -Системные BIOS/ESTEX-вызовы палитры **не запрещены**. Первый зафиксированный -skeleton намеренно отображал все semantic attributes системным `0x30`, чтобы -изолировать проверку приложения. После успешной отдельной пробы P2.2 добавлен -`sc_theme`: разные смысловые атрибуты, save/set всех четырёх планов и restore -при cleanup. Renderer и формат экранной модели при этом не изменились. - -Интеграционный MAME-сценарий прошёл с белыми/жёлтыми/светло-голубыми -элементами на синем фоне, чёрным на cyan/lightgray и белыми красными -диалогами. Второй запуск подтвердил повторную инициализацию темы после её -восстановления первым процессом. - -## 6. Следующие работы - -- повторить палитровую пробу P2.2 на реальном Sprinter; -- повторная инициализация `sc_video` после child, сменившего видеорежим; -- измерение full/row/scroll present; -- аппаратный прогон P2.1 и skeleton; -- P3: заменить синтетические строки настоящими независимыми каталогами. diff --git a/applications/Volkov/docs/p3-panel-results.md b/applications/Volkov/docs/p3-panel-results.md deleted file mode 100644 index 0c88c2d..0000000 --- a/applications/Volkov/docs/p3-panel-results.md +++ /dev/null @@ -1,146 +0,0 @@ -# Sprinter Commander: результаты файловых панелей P3 - -Дата: 7 сентября 2026 года. - -Статус: `PASS` в MAME для навигации, независимых панелей, EMM-store на -границе 640/641, сортировки и явной обработки предела каталога DSS 1.71. - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[roadmap](commander-roadmap.md), -[большие каталоги DSS](dss-large-directories.md) - -## 1. Проверенная граница - -В P3 синтетические записи заменены настоящим источником `F_FIRST/F_NEXT`. -Каждая панель имеет собственные путь, cursor/top и физическую EMM-страницу. -Запись панели занимает 24 байта, поэтому одна 16-КБ страница вмещает -жёсткий продуктовый предел 640 записей и оставляет 1024 байта запаса. - -Реализованы и проверены: - -- шаблон перечисления `*.*` и имена DOS 8.3; -- синтетическая `..` в некорневом каталоге без дублей `.`/`..` от DSS; -- каталоги перед файлами и сортировка имён без учёта регистра ASCII; -- вход в каталог, возврат через `..`/`Ctrl+PgUp`, refresh и независимость - пассивной панели; -- навигация `Up/Down/PgUp/PgDn/Home/End` без повторного scan; -- частичный результат при ошибке DSS 35 и отдельная виртуальная запись - `>>> MORE...`. - -## 2. Сборка - -Основная команда: `make`. - -Конфигурация: `--memory big --safe --max-allocs 3000`. - -| Область | Значение | -|---|---:| -| `_CODE` | 7728 байт (`0x8100..0x9F30`) | -| данные | 2281 байт (конец `0xA819`) | -| свободная куча W2 | 4839 байт | -| стек | 1279 байт | -| `_BANK1` — scan/sort | 2299 / 16384 байт (14,0%) | -| `_BANK2` — renderer | 2902 / 16384 байт (17,7%) | -| EXE | 41305 байт | - -`check_bank_calls.py` не нашёл прямых вызовов в чужой банк или публикации -указателей на данные банка. - -## 3. Прямая диагностика DSS - -Образ содержит `BIGDIR` из 680 обычных файлов. Исправленная проба `P3DIR` -получила: - -```text -count=512 -errno=35 -511=B0000598.DAT -512=B0000599.DAT -513= -``` - -Это подтверждает границу стабильного DSS и отсутствие продолжения за ней. -Конкретные последние имена отражают физический порядок записей, созданный -`mcopy`, и сами по себе не являются контрактом теста. - -Артефакт: [экран P3DIR](../artifacts/mame-p3/panels/dss-enum-limit.png). - -## 4. Диагностика общего пути Commander - -Проба `P3SCAN` использует те же `sc_source_fs`, `sc_store` и `sc_sort`, что -основная программа. Получен результат: - -```text -scan: rc=0 errno=35 count=512 trunc=1 -first: .. attr=10 flags=01 -last : >>> MORE... attr=00 flags=04 -``` - -Ошибка 35 сознательно остаётся в `errno` как причина усечения, но scan -возвращает успешный частичный снимок. Красный маркер занимает последний -элемент снимка и сортируется после файлов. - -Артефакт: [экран P3SCAN](../artifacts/mame-p3/panels/scan-marker.png). - -## 5. Интеграционный сценарий Commander - -Исторические артефакты ниже сняты в MAME 0.287 с FDD `A:`. Текущий -регрессионный сценарий предельного каталога переведён на HDD `D:`: -`make hdd-stress` создаёт `build/hdd/p3_stress.chd`, а -`tests/mame_p3_stress.lua` сначала переключает DSS на `D:`. FDD-сборщик -`tests/make_p3_stress_floppy.sh` оставлен только для smoke-совместимости. - -| Действие | Подтверждённое наблюдение | Результат | -|---|---|---| -| Корень | обе панели независимо открыли один реальный каталог | [PASS](../artifacts/mame-p3/panels/root-both-panels.png) | -| Вход и `..` | левая панель вошла в `TESTDIR` и вернулась в корень | [PASS](../artifacts/mame-p3/panels/left-testdir-parent.png), [возврат](../artifacts/mame-p3/panels/enter-parent-return.png) | -| `Ctrl+R` | после refresh сохранён выбор `INNER.TXT` | [PASS](../artifacts/mame-p3/panels/refresh-preserves-inner.png) | -| `Tab` и навигация справа | пути и cursor/top панелей не смешиваются | [PASS](../artifacts/mame-p3/panels/independent-panel-state.png) | -| `Ctrl+PgUp` слева | изменена только активная левая панель | [PASS](../artifacts/mame-p3/panels/ctrl-pgup-left-only.png) | -| Вход в `EMPTY` | единственная запись — синтетическая `..`, count=1 | [PASS](../artifacts/mame-p3/panels/empty-parent.png) | -| Вход в `MANY`, `PgDn`, `Down` | cursor/top меняются до 28/2 без rescan, рамки и соседняя панель сохраняются | [PASS](../artifacts/mame-p3/panels/navigation-scroll.png) | -| Вход в `BIGDIR` | показан частичный снимок, count=512 и признак `entries+` | [PASS](../artifacts/mame-p3/panels/bigdir-partial.png) | -| `End` | выбран последний красный `>>> MORE...`, info показывает `` | [PASS](../artifacts/mame-p3/panels/dss-marker-selected.png) | -| `Enter` на маркере | выведено сообщение о недоступном остатке DSS; переход или EXEC не выполнен | [PASS](../artifacts/mame-p3/panels/dss-marker-message.png) | -| `F10` | открыт диалог выхода поверх текущего состояния | [PASS](../artifacts/mame-p3/panels/dss-limit-quit-dialog.png) | -| `Enter` в диалоге | выполнен cleanup и возврат в `A:\>` | [PASS](../artifacts/mame-p3/panels/dss-limit-clean-exit.png) | - -Скриншот фиксирует только состояние изображения в конкретный момент и не -используется в одиночку для вывода о причине возможного дефекта. Подозрение -на ошибку должно дополнительно подтверждаться соседними кадрами, ожидаемым -состоянием сценария и, при необходимости, отдельной диагностической пробой. - -## 6. Синтетическая граница EMM-store - -Проба `tests/p3_store_probe/p3store.c` не вызывает DSS и поэтому достигает -продуктового предела, который нельзя получить из реального каталога DSS -1.71. Сборка выполнена с `--max-allocs 3000`. - -```text -entry=24 capacity=640 bytes=15360 reserve=1024 -write: count=640 first=1 middle=1 last=1 -guard: put640=1 get640=1 tail=1 -cleanup: free_after=222 restored=1 -PASS: store boundary is intact. -``` - -Проверены записи 0, 319 и 639. Запись и чтение индекса 640 отклонены, -байты в начале и конце 1024-байтового резерва не изменились, EMM-страница -освобождена без утечки. - -Артефакт: -[граница 640/641](../artifacts/mame-p3/panels/store-boundary-640-641.png). - -## 7. Итог и следующая граница - -Функциональный gate файловых панелей P3 закрыт в MAME. Аппаратный прогон на -реальном Sprinter ещё нужен, но не блокирует начало P4. - -Следующая работа PoC: - -1. копирование одного файла через отдельную EMM-страницу в W3; -2. безопасный временный файл, обработка ошибок и cleanup; -3. запуск `.EXE` через ESTEX с восстановлением экрана после child; -4. регрессионный MAME-сценарий для копирования, файлов больше 64 КБ и EXEC. diff --git a/applications/Volkov/docs/p4-copy-results.md b/applications/Volkov/docs/p4-copy-results.md deleted file mode 100644 index b9cf986..0000000 --- a/applications/Volkov/docs/p4-copy-results.md +++ /dev/null @@ -1,98 +0,0 @@ -# Sprinter Commander: результаты копирования P4.1 - -Дата: 7 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:` для -однофайлового F5, прогресса, отмены, запрета overwrite и нулевого файла. - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[roadmap](commander-roadmap.md), -[носители тестов](test-media.md). - -## Реализация - -- F5 берёт обычный файл активной панели и каталог пассивной панели; -- каталоги и виртуальный маркер DSS явно отклоняются; -- source и уникальный temp открыты одновременно — не более двух fd; -- блок 4096 байт находится только в четвёртой EMM-странице `ScApp` и - временно отображается в W3 функциями `bank_read_page()` и - `bank_write_page()`; -- счётчики размера/позиции 32-битные; -- temp создаётся через `O_CREAT|O_EXCL`, на ошибке или Esc закрывается и - удаляется; -- перед commit конечное имя проверяется повторно; -- commit вызывает DSS `RENAME` двумя basename в каталоге пассивной панели и - восстанавливает глобальный CWD; -- после успеха пассивная панель перечитывается. - -UI-оркестрация и форматирование прогресса вынесены из резидентного W2 в -`sc_copy_ui.c` (BANK2). Полноразмерного статического буфера нет ни в W2, ни в -банке кода. - -## Найденная особенность DSS RENAME - -Первый HDD-прогон перенёс все 131109 байт во временный файл, но завершился -`errno 16` (`EINAME`), а валидатор CHD подтвердил отсутствие результата. -Причина установлена не по одиночному кадру, а по сочетанию: - -1. позднего прогресса `122880/131109`; -2. отдельного итогового кадра с `errno 16`; -3. извлечённого состояния HDD; -4. исходника `DSS/API/Rename.asm`: операция переименовывает записи текущего - каталога, а полный новый путь не является допустимым новым именем. - -Исправление ограничено commit-фазой: job сохраняет CWD, временно входит в -target-dir, передаёт два коротких имени и восстанавливает CWD на всех обычных -путях возврата. - -## Матрица MAME - -Образ создаёт `tests/make_p4_copy_hdd.sh`, сценарий выполняет -`tests/mame_p4_copy_hdd.lua`, итог проверяет `tests/check_p4_copy_hdd.sh`. - -| Сценарий | Результат | -|---|---| -| `LARGE.BIN`, 131109 байт | скопирован, passive refresh показывает файл; содержимое побайтно совпало | -| `EXIST.TXT` | F5 отказал до изменения существующего целевого файла | -| `CANCEL.BIN`, 4194341 байт | виден промежуточный прогресс; Esc удалил temp и не создал target | -| `EMPTY.ZRO`, 0 байт | создан корректный пустой файл и показан passive refresh | -| cleanup/exit | временных `~SC*.TMP` нет; возврат в `D:\>` | - -Артефакты: - -- [успешный файл больше 64 КБ](../artifacts/mame-p4/copy/hdd-copy-success.png); -- [отказ overwrite](../artifacts/mame-p4/copy/hdd-existing-refused.png); -- [прогресс до Esc](../artifacts/mame-p4/copy/hdd-cancel-progress.png); -- [состояние после отмены](../artifacts/mame-p4/copy/hdd-cancel-cleanup.png); -- [успешный нулевой файл](../artifacts/mame-p4/copy/hdd-zero-copy-success.png); -- [чистый выход на HDD](../artifacts/mame-p4/copy/hdd-clean-exit.png); -- [низкоуровневый read/write EMM-page probe](../artifacts/mame-p4/copy/bank-page-io.png). - -Финальный файловый валидатор сообщил: - -```text -PASS: LARGE/EMPTY скопированы; EXIST сохранён; cancel/temp отсутствуют. -``` - -## Размер сборки - -Конфигурация: `--memory big --safe --max-allocs 3000`. - -| Область | Размер | -|---|---:| -| `_CODE` W2 | 8795 байт | -| данные W2 | 3161 байт | -| свободная куча W2 | 2892 байта | -| стек | 1279 байт | -| BANK1: scan/sort/copy job | 4327 / 16384 байт | -| BANK2: draw/copy UI | 4411 / 16384 байт | -| `SPRCMD.EXE` | 42372 байта | - -`check_bank_calls.py` — чисто. Общий `make size-check` — 67 программ без -роста; отдельно отмечается уже существующий новый тест `hello3`, не связанный -с Commander. - -P4.1 закрыт для требований PoC `REQ-COPY-01..12`; запуск `.EXE` и вся -стабилизация PoC продолжены в отчётах P4.2 и P5. diff --git a/applications/Volkov/docs/p4-exec-results.md b/applications/Volkov/docs/p4-exec-results.md deleted file mode 100644 index 22f040b..0000000 --- a/applications/Volkov/docs/p4-exec-results.md +++ /dev/null @@ -1,100 +0,0 @@ -# Sprinter Commander: результаты запуска EXE P4.2 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. -Выполнены требования `REQ-EXEC-01..06`: запуск по `Enter`, возврат в -Commander после изменившей окружение программы, обработка плохого EXE и отказ -для неподдерживаемого типа файла. - -Связанные документы: -[требования](commander-requirements.md), -[архитектура](commander-architecture.md), -[roadmap](commander-roadmap.md), -[носители тестов](test-media.md). - -## Реализация - -- `Enter` запускает только обычную запись с расширением `.EXE` без учёта - регистра; каталог, маркер предела DSS и иной тип файла не передаются EXEC; -- полный путь строится в резидентной памяти, ESTEX `EXEC $40` вызывается с - `B=1` и синхронно возвращает код завершения в диапазоне `00..FF`; -- перед запуском сохраняются текущий диск и 256-байтный CWD; -- child получает каталог активной панели как CWD, что позволяет программам - без аргументов открывать соседние файлы; затем CWD Commander возвращается; -- одновременный copy job запрещён; пути временно используют уже существующие - строковые поля `ScCopyJob`, поэтому EXEC не добавил два новых буфера в W2; -- после child восстанавливаются диск/CWD, режим 80x32 и восемь записей - палитры Commander во всех четырёх planes; -- повторная установка темы не перезаписывает снимок исходной системной - палитры, который нужен штатному cleanup; -- обе панели перечитываются, затем экран полностью строится из EMM-модели; -- успешный статус показывает код завершения, ошибка загрузчика — имя и - `errno`; Commander остаётся управляемым. - -Низкоуровневая обёртка находится в `sc_platform_exec.c`, а холодная -оркестрация и форматирование статуса — в `sc_exec_ui.c` (BANK2). - -## Интеграционный child - -`tests/p4_exec_child/p4child.exe` намеренно создаёт неблагоприятное для -родителя состояние: - -1. создаёт `EXECLEFT/CREATED.TXT` и `EXECRGHT/PASSIVE.TXT`; -2. оставляет CWD в `EXECLEFT`; -3. переключает экран в 40x32; -4. заменяет используемые Commander цвета ярко-зелёной/пурпурной палитрой; -5. ждёт `Enter` и возвращает код `5A`. - -Имена каталогов теста строго соответствуют 8.3. Промежуточный вариант -`EXECRIGHT` оказался VFAT long name и был виден DSS как `EXECRI~1`; отказ -`chdir("EXECRIGHT")` был ошибкой fixture, а не доказательством дефекта DSS. - -## Матрица MAME - -Образ создаёт `tests/make_p4_exec_hdd.sh`, сценарий выполняет -`tests/mame_p4_exec_hdd.lua`, итоговое содержимое проверяет -`tests/check_p4_exec_hdd.sh`. - -| Сценарий | Результат | -|---|---| -| `P4CHILD.EXE` | child показал `active=0 passive=0` и CWD `\\EXECLEFT` | -| возврат из child | Commander снова в 80x32 с исходной темой; статус содержит `5A` | -| refresh активной панели | появился `CREATED.TXT`, размер 19 | -| refresh пассивной панели | появился `PASSIVE.TXT`, размер 27 | -| `BROKEN.EXE` | показано `Cannot execute BROKEN.EXE (errno 17)`; приложение продолжило работу | -| `NOTE.TXT` | показано имя объекта и явный отказ: поддерживаются только `.EXE` | -| cleanup/exit | диалог работает; системная палитра восстановлена; возврат в `D:\>` | - -После остановки MAME CHD был извлечён и оба marker-файла сравнены побайтно: - -```text -PASS: child создал active/passive markers с ожидаемым содержимым. -``` - -Артефакты: - -- [child после изменения режима, палитры и CWD](../artifacts/mame-p4/exec/child-mode-palette-cwd.png); -- [Commander после восстановления и refresh обеих панелей](../artifacts/mame-p4/exec/commander-restored-both-panels.png); -- [ошибка повреждённого EXE](../artifacts/mame-p4/exec/broken-exe-error.png); -- [отказ для обычного TXT](../artifacts/mame-p4/exec/unsupported-file.png); -- [диалог выхода после EXEC](../artifacts/mame-p4/exec/quit-after-exec.png); -- [чистый возврат в DSS](../artifacts/mame-p4/exec/clean-dss-return.png). - -## Размер сборки - -Конфигурация: `--memory big --safe --max-allocs 3000`. - -| Область | Размер | -|---|---:| -| `_CODE` W2 | 8870 байт | -| данные W2 | 3240 байт | -| свободная куча W2 | 2738 байт | -| стек | 1279 байт | -| BANK1: scan/sort/copy job | 4242 / 16384 байт | -| BANK2: draw/copy/EXEC UI | 5973 / 16384 байт | -| `SPRCMD.EXE` | 42447 байт | - -`check_bank_calls.py` — чисто. Таблица актуализирована по финальной сборке P5 -после исправления режима `O_RDONLY` в libc; P4.1 и P4.2 вместе закрывают -критерий выхода P4. diff --git a/applications/Volkov/docs/p5-stability-results.md b/applications/Volkov/docs/p5-stability-results.md deleted file mode 100644 index 471c5d3..0000000 --- a/applications/Volkov/docs/p5-stability-results.md +++ /dev/null @@ -1,215 +0,0 @@ -# Sprinter Commander: результаты стабилизации P5 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. -Release gate PoC 0.1 закрыт в эмуляторе: пройдены граничные размеры, серия из -20 копирований, 100 refresh, повторный lifecycle, расширенная матрица ошибок, -смена носителя и запуск реальной внешней программы. Проверка на настоящем -Sprinter остаётся отдельным аппаратным smoke-тестом. - -## 20 copy и граничные размеры - -`tests/p5_fixture.py` создаёт двадцать файлов `F00.BIN..F19.BIN`. В набор -обязательно входят размеры: - -```text -0, 1, 4095, 4096, 65535, 65536, 1048613 байт -``` - -Остальные тринадцать файлов проверяют повторное использование copy job, -временных имён и файловых дескрипторов. Lua-сценарий последовательно вызывает -F5 двадцать раз, не меняя активную панель. После остановки MAME -`tests/check_p5_hdd.sh` извлекает оба дерева и сравнивает каждую пару -побайтно: - -```text -PASS: 20/20 файлов совпали; все граничные размеры и >1 МБ пройдены. -``` - -Первый вариант расписания успел выполнить только 17 команд: кадр показывал -активный прогресс `F16.BIN`, когда Lua уже отпустил следующие клавиши. Это не -трактовалось как ошибка Commander. Финальный сценарий разносит команды с -учётом числа 4-КБ блоков и получает все двадцать результатов на CHD. - -## Refresh и EMM lifecycle - -После copy тот же процесс получает 100 отдельных `Ctrl+R` с интервалом 0,5 -секунды. Затем Commander штатно завершается и ещё дважды запускается и -завершается на том же HDD. - -`sc_app_cleanup()` сравнивает `mem_info()` до выделения и после возврата общего -четырёхстраничного EMM-блока. При несовпадении программа печатает -`SPRCMD cleanup did not restore EMM free pages.` и возвращает код 4. Во всех -трёх контрольных кадрах присутствует только чистый prompt `D:\>`; повторные -инициализации также состоялись. - -Артефакты: - -- [прогресс файла больше 1 МБ](../artifacts/mame-p5/stability/copy-large-progress.png); -- [20 файлов после ста refresh](../artifacts/mame-p5/stability/twenty-copy-hundred-refresh.png); -- [cleanup-цикл 1](../artifacts/mame-p5/stability/cleanup-cycle-1.png); -- [cleanup-цикл 2](../artifacts/mame-p5/stability/cleanup-cycle-2.png); -- [cleanup-цикл 3](../artifacts/mame-p5/stability/cleanup-cycle-3.png). - -## Реальный ENOSPC - -Отдельный образ содержит `SOURCE/FULL.BIN` размером 262181 байт и filler -размером 32850000 байт. До запуска копирования на FAT16 свободно 104448 байт: -temp успевает создаться и частично вырасти, но не может вместить исходник. - -Commander показал `Copy failed (errno 10); temporary file removed.` и остался -управляемым. После выхода валидатор подтвердил: - -```text -PASS: ENOSPC не изменил source/filler и не оставил target/temp. -``` - -То есть проверен именно путь ошибки записи после создания temp, а не ранний -отказ `open()`. - -Артефакты: - -- [начало копирования на почти полном диске](../artifacts/mame-p5/enospc/copy-progress.png); -- [управляемый errno 10 и пустая target-панель](../artifacts/mame-p5/enospc/enospc-cleanup.png); -- [диалог после ошибки](../artifacts/mame-p5/enospc/quit-after-error.png); -- [чистый возврат в DSS](../artifacts/mame-p5/enospc/clean-dss-return.png). - -## Точная граница видимой области 27/28 - -`N27` содержит 26 физических файлов плюс синтетический `..`, а `N28` — 27 -файлов плюс `..`. Первый кадр одновременно показывает `027 entries` и -`028 entries`. После `End` панель N28 имеет `cursor=27`, первая видимая запись -становится `B0000000.TXT`, то есть `top=1`. Для N27 `End` даёт `cursor=26`, -`A0000000.TXT` остаётся первой строкой, то есть `top=0`. - -- [обе точные границы](../artifacts/mame-p5/panel-edges/counts-27-28.png); -- [28-я запись включает прокрутку](../artifacts/mame-p5/panel-edges/count-28-scrolls.png); -- [27 записей помещаются без прокрутки](../artifacts/mame-p5/panel-edges/count-27-fits.png); -- [cleanup после проверки](../artifacts/mame-p5/panel-edges/clean-dss-return.png). - -## Детерминированная матрица отказов copy/EXEC - -`CPERR.EXE` вызывает то же банковое ядро `sc_copy_job.c`, но останавливает его -в точно известных состояниях. Это позволило проверить случаи, которые нельзя -надёжно поймать Lua-клавишей между двумя соседними 4-КБ блоками: - -- отсутствующий EXE возвращает `ENOENT` (`errno 3`); -- отсутствующий source не оставляет уже созданный temp; -- отмена до первого read не создаёт target; -- после записи последнего блока job останавливается в отдельной точке - pre-commit, и отмена удаляет temp; -- принудительная ошибка read удаляет temp; -- temp, повторно открытый с `O_RDONLY`, даёт реальный отказ write - `EROFS` (`errno 8`) и удаляется; -- исчезновение temp непосредственно перед rename даёт управляемую ошибку; -- target, появившийся между begin и commit, сохраняет содержимое `KEEP`; -- после всей матрицы число свободных EMM-страниц полностью восстановлено. - -Проверка выявила ошибку общего libc: исторические Sprinter-флаги имеют -значения `O_WRONLY=1`, `O_RDONLY=2`, `O_RDWR=3`, а `open()` трактовал младшие -биты как POSIX-нумерацию. Исправлены `libc/include/fcntl.h` и `libc/io/open.c`, -добавлен постоянный режимный тест в `tests/openenv`. После пересборки fast и -safe libc матрица прошла целиком, а основной F5-сценарий был повторён. - -Результат внутри CHD проверяется не только по экрану: `RESULT.TXT` обязан -содержать все строки `PASS`, в `TARGET` разрешён только неизменённый -`RACE.BIN`, временные `~SC*.TMP` запрещены. - -- [вся fault-matrix: ALL PASS](../artifacts/mame-p5/copy-faults/fault-matrix-all-pass.png); -- [возврат CPERR в DSS](../artifacts/mame-p5/copy-faults/return-to-dss.png). - -## Смена HDD во время копирования - -Lua физически выгружает только тестовый `hard2` во время первого F5 и через -несколько секунд подключает тот же CHD обратно. На DSS 1.71 активный системный -вызов ожидает возврата устройства; после подключения Commander получает -управляемый `errno 3`, удаляет temp и продолжает принимать команды. Повторный -F5 без перезапуска приложения успешно копирует `DATA.BIN` размером 262181 байт. - -Посмертная проверка CHD подтверждает точное совпадение source/target и -отсутствие temp: - -```text -PASS: HDD removal дал управляемый отказ; после возврата DATA совпал, temp нет. -``` - -- [управляемый отказ первого F5](../artifacts/mame-p5/media-change/managed-error.png); -- [прогресс повторного F5](../artifacts/mame-p5/media-change/retry-progress.png); -- [восстановленный target](../artifacts/mame-p5/media-change/recovered-copy.png); -- [чистый возврат в DSS](../artifacts/mame-p5/media-change/clean-dss-return.png). - -## Реальный viewer и восстановление окружения - -Внешним приложением служит не специальный test child, а полноэкранный -`examples/mdview2`. Commander перед EXEC устанавливает CWD активной панели, -поэтому viewer без передачи аргументов открывает лежащий рядом `README.MD`. -Проверены обычный вид, raw-режим, PageDown, выход и возврат в Commander с -восстановленными режимом, палитрой, CWD и обеими панелями. - -Тест обнаружил в самом `mdview2` утечку scratch-блока EMM. Viewer переведён -на явное владение блоком: результат `mem_alloc_pages()` проверяется, а блок -освобождается в `unload_file()`. После исправления Commander штатно завершает -собственную lifecycle-проверку EMM. - -- [главный экран mdview2](../artifacts/mame-p5/viewer/mdview-main.png); -- [mdview2 после PageDown](../artifacts/mame-p5/viewer/mdview-pagedown.png); -- [Commander после возврата](../artifacts/mame-p5/viewer/commander-restored.png); -- [чистый возврат в DSS](../artifacts/mame-p5/viewer/clean-dss-return.png). - -## Финальный размер PoC - -Конфигурация: `--memory big --safe --max-allocs 3000`. - -| Область | Размер | -|---|---:| -| `_CODE` W2 | 8870 байт | -| данные W2 | 3240 байт | -| свободная куча W2 | 2738 байт | -| стек | 1279 байт | -| BANK1: scan/sort/copy job | 4242 / 16384 байт | -| BANK2: draw/copy/EXEC UI | 5973 / 16384 байт | -| `SPRCMD.EXE` | 42447 байт | - -Проверка межбанковых вызовов чистая. Общий `make size-check` ожидаемо сообщает -рост `openenv` на 188 байт: это не скрытый рост libc, а добавленный постоянный -тест `write()` через `O_RDONLY` вместе с исправленной веткой mode mapping. -Эталон размеров автоматически не обновлялся, поскольку в общем дереве также -присутствует посторонний новый `hello3`. - -## Команды воспроизведения - -```sh -make hdd-p5 ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_stability.chd \ - tests/mame_p5_stability.lua artifacts/mame-p5/local 205 -tests/check_p5_hdd.sh build/hdd/p5_stability.chd - -make hdd-p5-enospc ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_enospc.chd \ - tests/mame_p5_enospc.lua artifacts/mame-p5/enospc-local 55 -tests/check_p5_enospc_hdd.sh build/hdd/p5_enospc.chd - -make hdd-p5-panels ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_panel_edges.chd \ - tests/mame_p5_panel_edges.lua artifacts/mame-p5/panels-local 50 - -make hdd-p5-copy-faults ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_copy_faults.chd \ - tests/mame_p5_copy_faults.lua artifacts/mame-p5/faults-local 180 -tests/check_p5_copy_faults_hdd.sh build/hdd/p5_copy_faults.chd - -make hdd-p5-viewer ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_viewer.chd \ - tests/mame_p5_viewer.lua artifacts/mame-p5/viewer-local 65 - -make hdd-p5-media ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p5_media.chd \ - tests/mame_p5_media_change.lua artifacts/mame-p5/media-local 50 -tests/check_p5_media_hdd.sh build/hdd/p5_media.chd -``` - -Перед каждым запуском должен отсутствовать другой процесс MAME Sprinter. -`run_mame_hdd.sh` проверяет это сам. Единственный незакрытый пункт за пределами -эмуляторного release gate — повторить короткий smoke-сценарий на реальном -Sprinter Sp2000. diff --git a/applications/Volkov/docs/p6-sort-results.md b/applications/Volkov/docs/p6-sort-results.md deleted file mode 100644 index 7e9ed49..0000000 --- a/applications/Volkov/docs/p6-sort-results.md +++ /dev/null @@ -1,98 +0,0 @@ -# Sprinter Commander: сортировки 0.2/P6 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализация - -Каждая `ScPanel` хранит собственные `sort_key` и `sort_descending`. Доступны -четыре ключа: - -| Комбинация | Ключ | -|---|---| -| `Ctrl+F3` | имя | -| `Ctrl+F4` | расширение | -| `Ctrl+F5` | дата и время last-write | -| `Ctrl+F6` | размер | - -Выбор другого ключа включает прямой порядок; повтор текущей комбинации меняет -направление. На нижней рамке каждой панели постоянно виден режим `N/E/D/S` и -знак `+`/`-`. Refresh и переходы в каталог используют сохранённый режим этой -же панели. - -Порядок групп не зависит от reverse: синтетический `..` всегда первый, -затем идут каталоги, затем обычные файлы, а красный маркер ограничения DSS -остаётся последним. Направление применяется только внутри групп. При равном -основном ключе детерминированным вторичным ключом служит имя без учёта регистра. -Дата сравнивается как FAT date, затем FAT time; отдельная creation date не -имитируется, потому что текущий `F_FIRST/F_NEXT` возвращает last-write. - -Shell sort по-прежнему работает непосредственно с 24-байтовыми записями EMM -через `sc_store_get/put` и не сохраняет указатели W3. Выбранная запись после -пересортировки находится по имени; cursor/top нормализуются без повторного -сканирования каталога. - -## Автоматическая проверка - -`SORTRT.EXE` заполняет две разные EMM-страницы намеренно перемешанными -записями и пишет `SORTRES.TXT`. Посмертный валидатор подтвердил: - -```text -PASS: 4 sort keys, reverse, fixed groups, selection, two panels. -``` - -Проверяются восемь точных порядков, неизменность `..` и `>>> MORE...`, -сохранение `BETA.TXT` под курсором и отсутствие влияния режима первой панели -на вторую. - -Затем тот же MAME-сценарий запускает Commander, открывает `SORTL` и `SORTR`, -подаёт реальные `Ctrl+F3..F6`, переключает активную панель и делает refresh. -Два полных UI-прогона дали побайтно одинаковые контрольные кадры. - -- [name ascending](../artifacts/mame-p6/sort/name-ascending.png); -- [extension ascending](../artifacts/mame-p6/sort/extension-ascending.png); -- [extension descending](../artifacts/mame-p6/sort/extension-descending.png); -- [size ascending](../artifacts/mame-p6/sort/size-ascending.png); -- [size descending](../artifacts/mame-p6/sort/size-descending.png); -- [date ascending](../artifacts/mame-p6/sort/date-ascending.png); -- [date descending](../artifacts/mame-p6/sort/date-descending.png); -- [left `S-`, right `E+`](../artifacts/mame-p6/sort/independent-panels.png); -- [refresh сохранил `E+`](../artifacts/mame-p6/sort/refresh-keeps-mode.png); -- [штатный cleanup](../artifacts/mame-p6/sort/clean-dss-return.png). - -В текущем общем HDD-builder файлы fixture получают одинаковую дату при -копировании дерева, поэтому точный порядок date проверяет target-проба; -UI-сценарий независимо подтверждает доставку `Ctrl+F5`, оба состояния `D+/-` -и обратный redraw. Этот предел fixture не выдаётся за проверку разных FAT-дат -по скриншоту. - -## Размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | P5 | После сортировок | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 8870 | 9125 | +255 | -| данные W2 | 3240 | 3244 | +4 | -| свободная куча W2 | 2738 | 2479 | -259 | -| BANK1 | 4242 | 5137 | +895 | -| BANK2 | 5973 | 6053 | +80 | -| `SPRCMD.EXE` | 42447 | 42702 | +255 | - -Рост BANK1 содержит компараторы и сохранение выбора, W2 — команды и один -банковый вызов. Первоначальный вариант с восемью статусными строками давал -рост W2 на 736 байт и был сокращён до общего статуса плюс компактный индикатор -на рамке. Межбанковый аудит финальной сборки чистый. - -## Воспроизведение - -```sh -make hdd-p6-sort ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p6_sort.chd \ - tests/mame_p6_sort.lua artifacts/mame-p6/local 90 -tests/check_p6_sort_hdd.sh build/hdd/p6_sort.chd -``` - -Перед запуском требуется убедиться, что другого MAME Sprinter нет; -`run_mame_hdd.sh` выполняет эту проверку. diff --git a/applications/Volkov/docs/p7-selection-results.md b/applications/Volkov/docs/p7-selection-results.md deleted file mode 100644 index d77ef51..0000000 --- a/applications/Volkov/docs/p7-selection-results.md +++ /dev/null @@ -1,73 +0,0 @@ -# Sprinter Commander: выбор записей 0.2/P7 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Контракт - -- `Insert` меняет выбор текущей обычной записи и передвигает cursor вниз; -- `*` инвертирует выбор только файлов текущей панели; -- файлы и каталоги можно выбирать, синтетический `..` и виртуальный маркер - DSS нельзя; -- групповые `+`, `-` и `*` игнорируют каталоги и не снимают выбор, - ранее поставленный с каталога через `Insert`; -- выбранная запись отмечается `*` слева от имени; -- footer активной панели показывает ` bytes in selected`, а - общая строка информации пока сохраняет компактное `sel размер/количество`; -- размер каталога в этой статистике равен нулю: рекурсивный подсчёт появится - вместе с групповой job; -- сортировка переносит `SC_ENTRY_SELECTED` вместе с записью и сохраняет - текущий файл под cursor; -- refresh текущего среза явно очищает выбор; режим сортировки сохраняется; -- панели имеют независимые EMM-страницы и независимую статистику. - -Функции выбора находятся в BANK1 и работают только через -`sc_store_get/put`; указатель на W3 не сохраняется. Для toggle и invert -используется один банковый entry point, чтобы не плодить resident thunk’и. - -## Проверка - -Target-проба `SELRT.EXE` проверяет Insert двух файлов, точную сумму 30, -отказы для `..`/DSS-маркера, две инверсии, выбор каталога, сброс статистики -через `sc_store_clear()` и возврат EMM. Результат извлекается из CHD: - -```text -PASS: Insert/invert/masks, virtual guards, totals, refresh и EMM. -``` - -UI-сценарий выбирает два каталога и `A.BIN`, меняет порядок на `N-`, -инвертирует выбор и перечитывает каталог. Контрольные состояния: - -- [виртуальная запись не выбирается](../artifacts/mame-p7/select/virtual-entry-guard.png); -- [три записи, `sel 10/003`](../artifacts/mame-p7/select/insert-three.png); -- [сортировка сохранила flags и cursor](../artifacts/mame-p7/select/sort-keeps-selection.png); -- [инверсия файлов не изменила ранее выбранные каталоги, `sel 50/004`](../artifacts/mame-p7/select/inverted.png); -- [refresh очистил выбор и сохранил `N-`](../artifacts/mame-p7/select/refresh-clears.png); -- [штатный возврат в DSS](../artifacts/mame-p7/select/clean-dss-return.png). - -## Размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P6 | После P7 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9125 | 9434 | +309 | -| данные W2 | 3244 | 3256 | +12 | -| свободная куча W2 | 2479 | 2158 | -321 | -| BANK1 | 5137 | 6033 | +896 | -| BANK2 | 6053 | 6213 | +160 | -| `SPRCMD.EXE` | 42702 | 43011 | +309 | - -Первый вариант имел два банковых entry point и оставлял 2069 байт heap. -После объединения и сокращения резидентных сообщений финальная сборка -возвращает 2158 байт. Межбанковый аудит чистый. - -## Воспроизведение - -```sh -make hdd-p7-select ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p7_select.chd \ - tests/mame_p7_select.lua artifacts/mame-p7/local 65 -tests/check_p7_select_hdd.sh build/hdd/p7_select.chd -``` diff --git a/applications/Volkov/docs/p8-mask-results.md b/applications/Volkov/docs/p8-mask-results.md deleted file mode 100644 index b9f020d..0000000 --- a/applications/Volkov/docs/p8-mask-results.md +++ /dev/null @@ -1,69 +0,0 @@ -# Sprinter Commander: выбор по маске 0.2/P8 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Реализация - -Обычный `+` открывает `Select by mask`, обычный `-` — `Unselect by mask`. -Начальное значение `*.*`; Enter применяет действие, Esc отменяет его без -изменения панели. Доступны wildcard `*` и `?`, сравнение ASCII-букв не зависит -от регистра. Как в DOS, `*.*` означает все имена файлов, включая имена без точки. -Все групповые операции `+`, `-`, `*` игнорируют каталоги; синтетический `..` и виртуальный -маркер DSS также не участвуют. Выбор, поставленный на каталог отдельным `Insert`, не меняется. - -Модальный редактор не использует консольные окна или прямой VRAM. Диалог и -поле находятся в общей EMM-модели Commander и выводятся координатными -функциями. Реализованы insertion в позиции cursor, Backspace, Delete, -Left/Right, Home/End, Enter и Esc. Для текущих DSS 8.3-масок ввод ограничен -12 символами; тот же editor будет переиспользован командами F7/F6 и -командной строкой. - -Существующий `sc_dialog.c` вместе с новым editor перенесён из HOME в BANK2. -Mask matcher находится в BANK1 рядом с выбором; приложение передаёт ему -резидентный scratch-буфер copy job, пока файловая job не активна. - -## Проверка - -Target-часть проверяет: - -- `*.bin` в нижнем регистре против имён верхнего регистра; -- `?.b?n`; -- `*.*` для файла без точки и неизменность каталога; -- последовательное set/clear с точными count/size; -- неизменность `..` и DSS-маркера. - -UI-сценарий редактирует `*.*` в `*.bin`, получает три выбранных файла и -`sel 60/003`, затем снимает `b.bin`, получая `sel 40/002`. Следующий диалог -закрывается Esc, состояние не меняется. - -- [диалог с `*.*`](../artifacts/mame-p8/masks/default-dialog.png); -- [поле после редактирования в `*.bin`](../artifacts/mame-p8/masks/edited-bin-mask.png); -- [три BIN выбраны](../artifacts/mame-p8/masks/bin-selected.png); -- [`b.bin` снят](../artifacts/mame-p8/masks/b-unselected.png); -- [Esc сохранил выбор](../artifacts/mame-p8/masks/cancel-preserves.png); -- [штатный cleanup](../artifacts/mame-p8/masks/clean-dss-return.png). - -## Размер - -| Область | После P7 | После P8 | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9434 | 9416 | -18 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2158 | 2176 | +18 | -| BANK1 | 6033 | 6451 | +418 | -| BANK2 | 6213 | 7268 | +1055 | -| `SPRCMD.EXE` | 43011 | 42993 | -18 | - -Несмотря на новую функцию, HOME стал меньше благодаря переносу диалогов. -Оба банка имеют более 9 КБ резерва; межбанковый аудит чистый. - -## Воспроизведение - -```sh -make hdd-p8-masks ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p7_select.chd \ - tests/mame_p7_select.lua artifacts/mame-p8/local 80 -tests/check_p7_select_hdd.sh build/hdd/p7_select.chd -``` diff --git a/applications/Volkov/docs/p9-mkdir-results.md b/applications/Volkov/docs/p9-mkdir-results.md deleted file mode 100644 index 65f4248..0000000 --- a/applications/Volkov/docs/p9-mkdir-results.md +++ /dev/null @@ -1,71 +0,0 @@ -# Sprinter Commander: создание каталога 0.2/P9 - -Дата: 8 сентября 2026 года. - -Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. - -## Контракт - -- `F7` открывает общий координатный редактор и принимает один компонент - DOS 8.3 длиной до 12 символов; -- разрешены база до 8 и расширение до 3 символов, одна необязательная точка, - ASCII-буквы/цифры, допустимая DOS-пунктуация и CP866-байты `80h..FFh`; -- пустое имя, `.`/`..`, разделители пути, пробелы, wildcard, лишние точки и - превышение 8.3 отвергаются до вызова DSS; -- полный путь строится в уже принадлежащем `ScApp` scratch-буфере; -- `mkdir()` получает полный путь и не меняет глобальный CWD DSS; -- после успеха перечитывается только активная панель; -- существующий каталог и невалидное имя дают управляемое сообщение, `Esc` - закрывает редактор без файловой операции. - -Валидатор вынесен в отдельный банковый модуль `sc_name.c`. Сам Commander -размещает редактор, оркестрацию F7 и валидатор в BANK2; HOME/W2 содержит -только dispatch и банковые трамплины. - -## Проверка - -Target-проба `MKRT.EXE` проверяет допустимые и запрещённые имена, построение -полного пути, реальный цикл `mkdir`/duplicate/`rmdir` и неизменность CWD. -После MAME дерево извлекается из CHD: внешний checker подтверждает созданный -`MKTEST/NEWDIR`, неизменный `KEEP.TXT` и отсутствие пробных каталогов. - -```text -PASS: validator, mkdir/error/rmdir/CWD и F7 NEWDIR. -``` - -UI-сценарий отдельно подтверждает: - -- [пустой редактор F7](../artifacts/mame-p9/mkdir/dialog-empty.png); -- [создание и refresh активной панели](../artifacts/mame-p9/mkdir/created.png); -- [управляемую ошибку повторного имени](../artifacts/mame-p9/mkdir/duplicate-error.png); -- [отказ для имени длиннее 8.3](../artifacts/mame-p9/mkdir/invalid-name.png); -- [вход в созданный каталог](../artifacts/mame-p9/mkdir/entered-newdir.png); -- [штатный возврат в DSS](../artifacts/mame-p9/mkdir/clean-dss-return.png). - -## Размер - -Конфигурация `--memory big --safe --max-allocs 3000`: - -| Область | После P8 | После P9 и уточнения group select | Изменение | -|---|---:|---:|---:| -| `_CODE` W2 | 9416 | 9449 | +33 | -| данные W2 | 3256 | 3256 | 0 | -| свободная куча W2 | 2176 | 2143 | -33 | -| BANK1 | 6451 | 6477 | +26 | -| BANK2 | 7268 | 8156 | +888 | -| `SPRCMD.EXE` | 42993 | 43026 | +33 | - -Оба банка сохраняют более 8 КБ резерва. Межбанковый аудит чист. - -Общий `size-check` по всему C-Compiler пока ожидаемо отмечает посторонний -новый `hello3` и намеренный рост `openenv` после постоянной проверки -`O_RDONLY`; эталон размеров из Commander не обновлялся. - -## Воспроизведение - -```sh -make hdd-p9-mkdir ALLOCS=3000 -tests/run_mame_hdd.sh build/hdd/p9_mkdir.chd \ - tests/mame_p9_mkdir.lua artifacts/mame-p9/local 70 -tests/check_p9_mkdir_hdd.sh build/hdd/p9_mkdir.chd -``` diff --git a/applications/Volkov/docs/poc-0.1-release.md b/applications/Volkov/docs/poc-0.1-release.md deleted file mode 100644 index d49c9f3..0000000 --- a/applications/Volkov/docs/poc-0.1-release.md +++ /dev/null @@ -1,85 +0,0 @@ -# Sprinter Commander PoC 0.1 - -Дата: 8 сентября 2026 года. - -Статус: техническая архитектура подтверждена в MAME 0.288 / BIOS 3.06 / -DSS 1.71.57. `SPRCMD.EXE` является proof of concept, а не готовым файловым -менеджером для повседневной работы. Аппаратный smoke-тест на Sprinter Sp2000 -ещё требуется. - -## Что уже работает - -- полноэкранный двухпанельный интерфейс 80x32 через безоконные координатные - функции BIOS/ESTEX, без прямой записи в VRAM; -- независимые пути и навигация обеих панелей, синтетический `..`, Home/End, - PgUp/PgDn, Tab и refresh; -- одна EMM-страница на панель, максимум 640 записей без заполнения страницы - целиком, красный `>>> MORE...` при известном ограничении DSS; -- каталоги перед файлами и сортировка по имени; -- безопасное копирование одного файла по F5 через отдельную EMM-страницу W3, - 4-КБ блоками и temp/rename commit; -- отмена по Esc между блоками и в отдельной точке перед commit; -- запрет перезаписи уже существующего target; -- запуск `.EXE` по Enter с временным CWD активной панели и восстановлением - экрана, палитры, CWD и панелей; -- штатное освобождение EMM, закрытие fd и восстановление системного экрана - при выходе. - -## Сборка и запуск - -Из каталога приложения: - -```sh -make ALLOCS=3000 -make hdd -``` - -Результат — `build/sprcmd.exe`; образ для быстрого интеграционного запуска — -`build/hdd/sprcmd.chd`. Для MAME штатно используются системный HDD как `C:` и -отдельный тестовый `hard2` как `D:`. Одновременно разрешён только один процесс -MAME Sprinter. - -Полный перечень автоматизированных образов и команд находится в -[test-media.md](test-media.md), доказательства P5 — в -[p5-stability-results.md](p5-stability-results.md). - -Финальная конфигурация PoC: `--memory big --safe --max-allocs 3000`; -`SPRCMD.EXE` — 42447 байт, `_CODE` W2 — 8870 байт, свободная куча W2 — -2738 байт, BANK1 — 4242 байта, BANK2 — 5973 байта. - -## Клавиши PoC - -| Клавиша | Действие | -|---|---| -| стрелки, Home/End, PgUp/PgDn | перемещение по активной панели | -| `Tab` | сменить активную панель | -| `Enter` | войти в каталог/`..` или запустить `.EXE` | -| `Ctrl+R` | перечитать активную панель | -| `F5` | скопировать текущий обычный файл в пассивную панель | -| `Esc` | отменить активное копирование | -| `F10` | подтверждение выхода | - -Надписи F6/F7/F8 и меню пока являются зарезервированными командами следующих -этапов, а не обещанием выполненной операции. - -## Известные ограничения - -- в панели показывается не более 640 записей; многостраничный режим относится - только к 2.0+; -- стабильный DSS 1.71 может остановить физическое перечисление около 512-й - FAT-записи с ошибкой 35 — показывается информирующий красный маркер; -- сортировка PoC только по имени; ext/size/date и обратный порядок входят в - следующую функциональную фазу; -- нет выбора нескольких файлов, масок, очереди и рекурсивных операций; -- F6 move/rename, F7 mkdir, F8 delete и overwrite policy ещё не реализованы; -- нет командной строки, `Ctrl+O`, истории, associations и передачи аргументов - внешней программе; -- нет конфигурационного файла цветов, viewer/editor вызываются только как - обычные внешние `.EXE`; -- нет длинных имён: DSS-контракт текущего слоя — 8.3; -- floppy поддерживается лишь как медленный smoke-носитель; основная матрица - выполнялась на HDD `D:`; -- проверка на реальном Sprinter пока не выполнена. - -Эти ограничения намеренно отделяют доказанную платформенную основу PoC от -безопасного файлового ядра 0.2 и полного набора функций версии 1.0. diff --git a/applications/Volkov/docs/test-media.md b/applications/Volkov/docs/test-media.md deleted file mode 100644 index 869e575..0000000 --- a/applications/Volkov/docs/test-media.md +++ /dev/null @@ -1,90 +0,0 @@ -# Носители для тестов Commander - -Дата: 8 сентября 2026 года. - -## Решение - -Стандартный носитель интеграционных и нагрузочных тестов Commander — -отдельный FAT16 HDD-образ, подключаемый к MAME как `hard2`. DSS видит его как -диск `D:`; системный `hard1` остаётся диском `C:`. - -MAME качественно эмулирует механические задержки FDD. Это полезно для проверки -совместимости, но делает повторяющиеся scan/copy-прогоны на порядок медленнее и -не даёт пользы большинству функциональных тестов. Поэтому FDD `A:` сохраняется -только для отдельных smoke-тестов чтения/запуска с дискеты. - -## Образы - -Все рабочие образы Commander лежат локально в `build/hdd/` и не подменяют -общий `mame/v306/IMG/test_hdd.chd`: - -```sh -make hdd # только SPRCMD.EXE -> build/hdd/sprcmd.chd -make hdd-stress # P3: EMPTY/MANY/BIGDIR -> build/hdd/p3_stress.chd -make hdd-copy # P4: COPYFROM/COPYTO -> build/hdd/p4_copy.chd -make hdd-exec # P4: EXECLEFT/EXECRGHT -> build/hdd/p4_exec.chd -make hdd-p5 # P5: 20 copy + resource cycles -> p5_stability.chd -make hdd-p5-enospc # P5: почти полный HDD -> p5_enospc.chd -make hdd-p5-panels # P5: 27/28 записей -> p5_panel_edges.chd -make hdd-p5-copy-faults # P5: copy/EXEC fault matrix -> p5_copy_faults.chd -make hdd-p5-viewer # P5: SPRCMD + реальный mdview2 -> p5_viewer.chd -make hdd-p5-media # P5: hot-unplug hard2 во время F5 -> p5_media.chd -make hdd-p6-sort # 0.2: target/UI сортировки -> p6_sort.chd -make hdd-p7-select # 0.2: target/UI выбора -> p7_select.chd -make hdd-p8-masks # 0.2: расширение того же образа масками +/− -make hdd-p9-mkdir # 0.2: validator и UI F7 mkdir -> p9_mkdir.chd -make hdd-p10-rename # 0.2: file/dir rename и UI F6 -> p10_rename.chd -make hdd-p11-delete # 0.2: confirm/cancel и UI F8 -> p11_delete.chd -make hdd-p12-group-copy # 0.2: выбранные файлы -> p12_group_copy.chd -make hdd-p13-group-delete # 0.2: выбранные файлы -> p13_group_delete.chd -make hdd-p14-default-colors # UI: dir/EXE/file -> p14_default_colors.chd -make hdd-p15-tree-copy # 0.2: recursive current dir -> p15_tree_copy.chd -make hdd-p15-tree-cancel # 0.2: cancel/cleanup -> p15_tree_cancel.chd -make hdd-p15-tree-self # 0.2: self-target guard -> p15_tree_self.chd -make hdd-p16-group-tree-copy # 0.2: multi-root F5 -> p16_group_tree_copy.chd -make hdd-p17-tree-delete # 0.2: recursive group F8 -> p17_tree_delete.chd -make hdd-p17-tree-delete-cancel # runtime Esc -> p17_tree_delete_cancel.chd -make hdd-p18-metadata # exact FAT metadata F5 -> p18_metadata.chd -make hdd-p19-overwrite # backup/rollback probe -> p19_overwrite.chd -make hdd-p19-policy # UI conflict policy -> p19_policy.chd -``` - -Сборщик `toolchain/make_hdd.sh` принимает как отдельные файлы, так и готовые -деревья каталогов. Рекурсивное копирование дерева одной командой особенно -важно для `BIGDIR`: 680 файлов не требуют 680 отдельных запусков `mcopy`. - -## Запуск и проверка - -Lua-сценарий сначала вводит `D:`, а затем запускает `SPRCMD.EXE`. Благодаря -этому текущий диск DSS и оба относительных контекста панелей находятся на -тестовом HDD, а не на системном `C:` или медленном `A:`. - -Пример полного теста F5: - -```sh -make hdd-copy ALLOCS=3000 -tests/run_mame_hdd.sh \ - build/hdd/p4_copy.chd tests/mame_p4_copy_hdd.lua \ - artifacts/mame-p4/copy-hdd-local 75 -tests/check_p4_copy_hdd.sh build/hdd/p4_copy.chd -``` - -После пересборки CHD MAME требуется полностью перезапустить. Нельзя извлекать -или проверять образ во время работающего MAME: окончательное состояние -валидируется только после чистого выхода эмулятора. - -Скриншоты подтверждают состояние интерфейса, но не заменяют файловую -проверку. Для copy-теста после MAME CHD преобразуется обратно в RAW, файлы -извлекаются через mtools и сравниваются с детерминированными шаблонами. - -Для EXEC-теста аналогичная тройка команд использует -`tests/mame_p4_exec_hdd.lua` и `tests/check_p4_exec_hdd.sh`. Все имена, -которые должен открыть DSS, задаются в формате 8.3: VFAT long name на образе -не является доступным DSS-именем и может отображаться как alias с `~1`. - -Сценарий смены носителя управляет только тестовым `hard2`. Перед запуском -любой автоматизации проверяется, что другого экземпляра MAME Sprinter нет: -одновременный доступ двух процессов к CHD запрещён. После физического unload -DSS может ожидать возврата устройства внутри системного вызова; Lua возвращает -тот же образ, после чего Commander получает управляемую ошибку и продолжает -работу. diff --git a/applications/Volkov/docs/ui-reference.md b/applications/Volkov/docs/ui-reference.md deleted file mode 100644 index 82c49d4..0000000 --- a/applications/Volkov/docs/ui-reference.md +++ /dev/null @@ -1,53 +0,0 @@ -# Sprinter Commander: направление развития UI - -Дата: 8 сентября 2026 года. - -## Референс - -Volkov Commander используется как поведенческий и композиционный образец, -но интерфейс не переносится побайтно. Цель — узнаваемая двухпанельная модель -VC, адаптированная к текстовому экрану Sprinter 80x32 и к координатному -BIOS/ESTEX backend без консольных окон и прямого доступа к VRAM. - -По предоставленным контрольным экранам фиксируются следующие ориентиры: - -- независимый режим панели `Brief` с несколькими колонками коротких имён; -- режим `Details` с колонками `Name`, `Size`, `Date`, `Time`; -- строка итога выбора внизу соответствующей панели вида - `N bytes in M selected files`; -- верхняя полоса меню, открываемая `F9`, с разделами панелей, файлов, - команд и настроек; -- однострочный prompt под панелями и полоса функциональных клавиш внизу; -- путь активной панели должен читаться как единая строка и визуально - отличаться от содержимого панели; -- активность панели определяется cursor/title, а не лишними служебными - словами внутри рамки. - -## Поэтапное сближение - -1. В 0.2 сохранить устойчивую текущую геометрию, но заменить диагностическую - статистику выбора пользовательской строкой итога и привести подписи - F-клавиш к реально работающим командам. Строка итога в footer панели уже - реализована и подтверждена - [кадром MAME](../artifacts/mame-ui/selected-footer-clean.png); - окончательная геометрия появится вместе с режимами панелей. -2. После безопасных F6/F7/F8 добавить модель режима панели и `Details` с - заголовками колонок; затем `Brief` с расчётом числа колонок из ширины. -3. В 0.4 добавить верхнее меню `F9`, настоящую командную строку и - полноэкранную псевдооболочку `Ctrl+O` на общем редакторе строки. -4. Стандартный fallback цветов уже добавлен: белые каталоги, жёлтые `.EXE`, - светло-серые остальные файлы. После стабилизации режимов добавить загрузку - конфигурируемых правил расширений и сохранение режима отдельно для левой и - правой панели. - -До появления отдельного счётчика файлов строка итога не должна называть -каталоги файлами: `Insert` может выбирать каталог, тогда как групповые -`+`, `-`, `*` его обязаны игнорировать. Это различие остаётся частью модели, -а не только правилом renderer. - -## Проверка - -Каждый визуальный шаг принимается не по одному кадру, а по сценарию с -известным содержимым панели, соседним контрольным кадрам и, где применимо, -извлечённому состоянию HDD. Зона имитации индикаторов дисководов MAME не -участвует в сравнении интерфейса Commander. diff --git a/applications/Volkov/include/sc_app.h b/applications/Volkov/include/sc_app.h deleted file mode 100644 index 32ab5df..0000000 --- a/applications/Volkov/include/sc_app.h +++ /dev/null @@ -1,49 +0,0 @@ -/* sc_app.h — состояние и главный цикл Sprinter Commander. */ - -#ifndef SC_APP_H -#define SC_APP_H - -#include -#include "sc_command.h" -#include "sc_copy.h" -#include "sc_panel.h" - -#define SC_PANEL_COUNT 2u -#define SC_PANEL_VISIBLE 27u -#define SC_EMM_PAGE_COUNT 4u -typedef struct ScApp { - ScPanel panels[SC_PANEL_COUNT]; - uint8_t active_panel; - uint8_t running; - uint8_t emm_block; - uint8_t screen_page; - uint8_t copy_page; - uint16_t emm_total_before; - uint16_t emm_free_before; - ScCopyJob copy_job; - const char *status; -} ScApp; - -int sc_app_init(ScApp *app); -void sc_app_run(ScApp *app); -int sc_app_cleanup(ScApp *app); - -void sc_draw_all(const ScApp *app) __banked; -void sc_draw_panel_rows(const ScApp *app, uint8_t panel_index) __banked; -void sc_draw_panel_row(const ScApp *app, uint8_t panel_index, - uint8_t row) __banked; -void sc_draw_info(const ScApp *app) __banked; -void sc_draw_status(const ScApp *app) __banked; - -uint8_t sc_dialog_confirm_quit(void) __banked; -uint8_t sc_dialog_confirm(const char *title, const char *message) __banked; -void sc_dialog_message(const char *title, const char *message) __banked; -uint8_t sc_dialog_choice(const char *title, const char *message, - const char *keys, const char *buttons) __banked; -uint8_t sc_dialog_input(const char *title, const char *prompt, - char *buffer, uint8_t capacity) __banked; -/* Возвращает выбранную ASCII-клавишу из keys в верхнем регистре; Esc = 0. */ -uint8_t sc_dialog_choice(const char *title, const char *message, - const char *keys, const char *buttons) __banked; - -#endif diff --git a/applications/Volkov/include/sc_command.h b/applications/Volkov/include/sc_command.h deleted file mode 100644 index b8b765f..0000000 --- a/applications/Volkov/include/sc_command.h +++ /dev/null @@ -1,43 +0,0 @@ -/* sc_command.h — логические команды Commander. */ - -#ifndef SC_COMMAND_H -#define SC_COMMAND_H - -#include "sc_input.h" - -typedef enum { - SC_CMD_NONE = 0, - SC_CMD_CURSOR_UP, - SC_CMD_CURSOR_DOWN, - SC_CMD_PAGE_UP, - SC_CMD_PAGE_DOWN, - SC_CMD_HOME, - SC_CMD_END, - SC_CMD_PANEL_SWITCH, - SC_CMD_OPEN, - SC_CMD_PARENT, - SC_CMD_REFRESH, - SC_CMD_SORT_NAME, - SC_CMD_SORT_EXTENSION, - SC_CMD_SORT_DATE, - SC_CMD_SORT_SIZE, - SC_CMD_SELECT, - SC_CMD_INVERT_SELECTION, - SC_CMD_SELECT_MASK, - SC_CMD_UNSELECT_MASK, - SC_CMD_HELP, - SC_CMD_USER_MENU, - SC_CMD_VIEW, - SC_CMD_EDIT, - SC_CMD_COPY, - SC_CMD_MOVE_RENAME, - SC_CMD_MKDIR, - SC_CMD_DELETE, - SC_CMD_MAIN_MENU, - SC_CMD_QUIT, - SC_CMD_CANCEL -} ScCommand; - -ScCommand sc_command_from_event(const ScKeyEvent *event); - -#endif diff --git a/applications/Volkov/include/sc_copy.h b/applications/Volkov/include/sc_copy.h deleted file mode 100644 index a4b5aef..0000000 --- a/applications/Volkov/include/sc_copy.h +++ /dev/null @@ -1,59 +0,0 @@ -/* sc_copy.h — состояние безопасного однофайлового copy-job PoC. */ - -#ifndef SC_COPY_H -#define SC_COPY_H - -#include - -#define SC_COPY_PATH_CAPACITY 256u -#define SC_COPY_CHUNK_SIZE 4096u - -#define SC_COPY_IDLE 0u -#define SC_COPY_RUNNING 1u -#define SC_COPY_DONE 2u -#define SC_COPY_CANCELLED 3u -#define SC_COPY_ERROR 4u - -#define SC_COPY_STEP_ERROR (-1) -#define SC_COPY_STEP_DONE 0 -#define SC_COPY_STEP_MORE 1 /* нужен ещё шаг; done==total означает pre-commit */ - -typedef struct { - char source_path[SC_COPY_PATH_CAPACITY]; - char target_path[SC_COPY_PATH_CAPACITY]; - char temp_path[SC_COPY_PATH_CAPACITY]; - uint32_t total; - uint32_t done; - uint16_t source_date; - uint16_t source_time; - int source_fd; - int temp_fd; - int error; - uint8_t page; - uint8_t state; - uint8_t temp_exists; - uint8_t source_attr; - uint8_t existing_attr; - uint8_t preserve_metadata; - uint8_t replace_existing; - uint8_t committed; -} ScCopyJob; - -int sc_copy_begin(ScCopyJob *job, const char *source_dir, - const char *target_dir, const char *name, - uint32_t size, uint8_t page) __banked; -/* source_name и target_name могут различаться; replace включает backup/rollback. */ -int sc_copy_begin_policy(ScCopyJob *job, const char *source_dir, - const char *target_dir, const char *source_name, - const char *target_name, uint32_t size, - uint8_t page, uint8_t replace) __banked; -/* Для tree-job: CWD уже равен source-dir, а target_path подготовлен целиком. */ -int sc_copy_begin_prepared(ScCopyJob *job, const char *name, - uint32_t size, uint8_t page) __banked; -int sc_copy_begin_prepared_policy(ScCopyJob *job, const char *name, - uint32_t size, uint8_t page, - uint8_t replace) __banked; -int sc_copy_step(ScCopyJob *job) __banked; -void sc_copy_cancel(ScCopyJob *job) __banked; - -#endif diff --git a/applications/Volkov/include/sc_copy_ui.h b/applications/Volkov/include/sc_copy_ui.h deleted file mode 100644 index 250b00b..0000000 --- a/applications/Volkov/include/sc_copy_ui.h +++ /dev/null @@ -1,10 +0,0 @@ -/* sc_copy_ui.h — банковый обработчик команды F5 и её прогресса. */ - -#ifndef SC_COPY_UI_H -#define SC_COPY_UI_H - -struct ScApp; - -void sc_copy_selected(struct ScApp *app) __banked; - -#endif diff --git a/applications/Volkov/include/sc_disk.h b/applications/Volkov/include/sc_disk.h deleted file mode 100644 index 06d5958..0000000 --- a/applications/Volkov/include/sc_disk.h +++ /dev/null @@ -1,11 +0,0 @@ -/* sc_disk.h — проверка свободных кластеров целевого диска через DSKINFO. */ - -#ifndef SC_DISK_H -#define SC_DISK_H - -#include - -/* 1 — места достаточно; 0 — недостаточно; -1 — ошибка DSS. */ -int sc_disk_has_space(const char *path, uint32_t bytes) __banked; - -#endif diff --git a/applications/Volkov/include/sc_entry.h b/applications/Volkov/include/sc_entry.h deleted file mode 100644 index b7a839c..0000000 --- a/applications/Volkov/include/sc_entry.h +++ /dev/null @@ -1,27 +0,0 @@ -/* sc_entry.h — компактная 24-байтовая запись каталога в EMM. */ - -#ifndef SC_ENTRY_H -#define SC_ENTRY_H - -#include - -#define SC_ENTRY_PARENT 0x01u -#define SC_ENTRY_SELECTED 0x02u -#define SC_ENTRY_DSS_LIMIT 0x04u - -#define SC_DIR_CAPACITY 640u - -typedef struct { - char name[13]; - uint32_t size; - uint16_t date; - uint16_t time; - uint8_t attr; - uint8_t flags; - uint8_t reserved; -} ScDirEntry; - -/* SDCC обязан сохранить зафиксированный дисковый формат без padding. */ -typedef char ScDirEntry_must_be_24_bytes[(sizeof(ScDirEntry) == 24u) ? 1 : -1]; - -#endif diff --git a/applications/Volkov/include/sc_exec.h b/applications/Volkov/include/sc_exec.h deleted file mode 100644 index fc64788..0000000 --- a/applications/Volkov/include/sc_exec.h +++ /dev/null @@ -1,8 +0,0 @@ -/* sc_exec.h — низкоуровневый запуск EXE через ESTEX. */ - -#ifndef SC_EXEC_H -#define SC_EXEC_H - -int sc_platform_exec(const char *path); - -#endif diff --git a/applications/Volkov/include/sc_exec_ui.h b/applications/Volkov/include/sc_exec_ui.h deleted file mode 100644 index 4ac11ba..0000000 --- a/applications/Volkov/include/sc_exec_ui.h +++ /dev/null @@ -1,10 +0,0 @@ -/* sc_exec_ui.h — банковый обработчик Enter на EXE. */ - -#ifndef SC_EXEC_UI_H -#define SC_EXEC_UI_H - -struct ScApp; - -void sc_exec_selected(struct ScApp *app) __banked; - -#endif diff --git a/applications/Volkov/include/sc_file_ops.h b/applications/Volkov/include/sc_file_ops.h deleted file mode 100644 index 3f45e76..0000000 --- a/applications/Volkov/include/sc_file_ops.h +++ /dev/null @@ -1,17 +0,0 @@ -/* sc_file_ops.h — низкоуровневые безопасные файловые операции Commander. */ - -#ifndef SC_FILE_OPS_H -#define SC_FILE_OPS_H - -#include - -/* Переименовать old_name в new_name внутри directory и восстановить CWD. - * 0 — успех; -1 — операция отклонена, CWD восстановлен; - * -2 — восстановить CWD после попытки не удалось. */ -int sc_rename_local(const char *directory, - const char *old_name, - const char *new_name, - char *cwd_buffer, - uint16_t cwd_capacity) __banked; - -#endif diff --git a/applications/Volkov/include/sc_file_ui.h b/applications/Volkov/include/sc_file_ui.h deleted file mode 100644 index e90339f..0000000 --- a/applications/Volkov/include/sc_file_ui.h +++ /dev/null @@ -1,12 +0,0 @@ -/* sc_file_ui.h — банковые UI-команды безопасных файловых операций. */ - -#ifndef SC_FILE_UI_H -#define SC_FILE_UI_H - -#include "sc_app.h" - -void sc_mkdir_command(ScApp *app) __banked; -void sc_rename_command(ScApp *app) __banked; -void sc_delete_command(ScApp *app) __banked; - -#endif diff --git a/applications/Volkov/include/sc_glyphs.h b/applications/Volkov/include/sc_glyphs.h deleted file mode 100644 index 10ebfa5..0000000 --- a/applications/Volkov/include/sc_glyphs.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * sc_glyphs.h — raw-коды CP866/CP437 для интерфейса Commander. - * - * Управляющие байты 0x18..0x1B здесь являются экранными глифами. Их нельзя - * передавать функциям, интерпретирующим CR/LF/BS/TAB. - */ - -#ifndef SC_GLYPHS_H -#define SC_GLYPHS_H - -#define SC_G_H 0xC4u -#define SC_G_V 0xB3u -#define SC_G_TL 0xDAu -#define SC_G_TR 0xBFu -#define SC_G_BL 0xC0u -#define SC_G_BR 0xD9u -#define SC_G_TM 0xC2u -#define SC_G_BM 0xC1u -#define SC_G_ML 0xC3u -#define SC_G_MR 0xB4u -#define SC_G_X 0xC5u - -#define SC_G_ARROW_UP 0x18u -#define SC_G_ARROW_DOWN 0x19u -#define SC_G_ARROW_RIGHT 0x1Au -#define SC_G_ARROW_LEFT 0x1Bu - -#define SC_G_SHADE_LIGHT 0xB0u -#define SC_G_SHADE_MEDIUM 0xB1u -#define SC_G_SHADE_DARK 0xB2u -#define SC_G_BLOCK 0xDBu -#define SC_G_HALF_UP 0xDFu -#define SC_G_HALF_DOWN 0xDCu -#define SC_G_HALF_LEFT 0xDDu -#define SC_G_HALF_RIGHT 0xDEu -#define SC_G_BULLET 0xF9u -#define SC_G_CHECK 0xFBu -#define SC_G_SQUARE 0xFEu - -#endif diff --git a/applications/Volkov/include/sc_input.h b/applications/Volkov/include/sc_input.h deleted file mode 100644 index 76d2ea4..0000000 --- a/applications/Volkov/include/sc_input.h +++ /dev/null @@ -1,21 +0,0 @@ -/* sc_input.h — нормализованное событие клавиатуры. */ - -#ifndef SC_INPUT_H -#define SC_INPUT_H - -#include - -#define SC_MOD_SHIFT 0x01u -#define SC_MOD_CTRL 0x02u -#define SC_MOD_ALT 0x04u - -typedef struct { - uint8_t ascii; - uint8_t scan; - uint8_t modifiers; -} ScKeyEvent; - -void sc_input_read(ScKeyEvent *event); -uint8_t sc_input_poll(ScKeyEvent *event); - -#endif diff --git a/applications/Volkov/include/sc_metadata.h b/applications/Volkov/include/sc_metadata.h deleted file mode 100644 index a13fddd..0000000 --- a/applications/Volkov/include/sc_metadata.h +++ /dev/null @@ -1,13 +0,0 @@ -/* sc_metadata.h — узкие wrappers записи файловых метаданных DSS. */ - -#ifndef SC_METADATA_H -#define SC_METADATA_H - -#include - -int sc_metadata_set_datetime(uint8_t fd, uint16_t date, - uint16_t time) __banked; -int sc_metadata_get_attributes(const char *path, uint8_t *attr) __banked; -int sc_metadata_set_attributes(const char *path, uint8_t attr) __banked; - -#endif diff --git a/applications/Volkov/include/sc_panel.h b/applications/Volkov/include/sc_panel.h deleted file mode 100644 index 0f4f0e2..0000000 --- a/applications/Volkov/include/sc_panel.h +++ /dev/null @@ -1,41 +0,0 @@ -/* sc_panel.h — состояние одной независимой файловой панели. */ - -#ifndef SC_PANEL_H -#define SC_PANEL_H - -#include -#include "sc_entry.h" - -#define SC_SOURCE_REAL_FS 0u - -typedef enum { - SC_SORT_NAME = 0, - SC_SORT_EXTENSION, - SC_SORT_SIZE, - SC_SORT_DATE -} ScSortKey; - -typedef struct { - char path[256]; - uint16_t count; - uint16_t cursor; - uint16_t top; - uint32_t total_size; - uint16_t selected_count; - uint32_t selected_size; - uint8_t source_kind; - uint8_t phys_page; - uint8_t truncated; - uint8_t dirty; - uint8_t sort_key; - uint8_t sort_descending; -} ScPanel; - -int sc_panel_init(ScPanel *panel, uint8_t phys_page); -int sc_panel_refresh(ScPanel *panel); -int sc_panel_selected(const ScPanel *panel, ScDirEntry *entry); -int sc_panel_open_selected(ScPanel *panel); -int sc_panel_parent(ScPanel *panel); -void sc_panel_normalize_view(ScPanel *panel); - -#endif diff --git a/applications/Volkov/include/sc_path.h b/applications/Volkov/include/sc_path.h deleted file mode 100644 index 84d108c..0000000 --- a/applications/Volkov/include/sc_path.h +++ /dev/null @@ -1,12 +0,0 @@ -/* sc_path.h — безопасные операции над путями DOS 8.3 Commander. */ - -#ifndef SC_PATH_H -#define SC_PATH_H - -#include - -int sc_path_join(char *out, uint16_t capacity, - const char *directory, const char *name); -int sc_path_validate_component(const char *name) __banked; - -#endif diff --git a/applications/Volkov/include/sc_screen.h b/applications/Volkov/include/sc_screen.h deleted file mode 100644 index 13db63f..0000000 --- a/applications/Volkov/include/sc_screen.h +++ /dev/null @@ -1,38 +0,0 @@ -/* sc_screen.h — экранная EMM-модель Commander 80x32. */ - -#ifndef SC_SCREEN_API_H -#define SC_SCREEN_API_H - -#include - -#define SC_SCREEN_W 80u -#define SC_SCREEN_H 32u -#define SC_ROW_BYTES 160u -#define SC_SCREEN_BYTES 5120u - -#define SC_SCROLL_UP 1u -#define SC_SCROLL_DOWN 2u - -typedef struct { - uint8_t ch; - uint8_t attr; -} ScCell; - -typedef char ScCell_must_be_2_bytes[(sizeof(ScCell) == 2) ? 1 : -1]; - -void sc_screen_attach(uint8_t page); -void sc_screen_detach(void); -void sc_screen_clear(uint8_t attr); -void sc_screen_cell(uint8_t x, uint8_t y, uint8_t ch, uint8_t attr); -void sc_screen_fill(uint8_t x, uint8_t y, uint8_t width, - uint8_t ch, uint8_t attr); -void sc_screen_text(uint8_t x, uint8_t y, const char *text, - uint8_t attr, uint8_t max_width); -int sc_screen_present_full(void); -int sc_screen_present_row(uint8_t x, uint8_t y, uint8_t width); -int sc_screen_present_rows(uint8_t first, uint8_t count); -int sc_screen_scroll_rows(uint8_t x, uint8_t y, - uint8_t width, uint8_t height, - uint8_t direction, uint8_t fill_attr); - -#endif diff --git a/applications/Volkov/include/sc_select.h b/applications/Volkov/include/sc_select.h deleted file mode 100644 index b7f6a66..0000000 --- a/applications/Volkov/include/sc_select.h +++ /dev/null @@ -1,16 +0,0 @@ -/* sc_select.h — выбор записей текущей панели для групповых операций. */ - -#ifndef SC_SELECT_H -#define SC_SELECT_H - -#include "sc_panel.h" - -#define SC_SELECT_TOGGLE 0u -#define SC_SELECT_INVERT 1u -#define SC_SELECT_MASK_SET 2u -#define SC_SELECT_MASK_CLEAR 3u - -int sc_select_apply(ScPanel *panel, uint8_t action, - const char *mask) __banked; - -#endif diff --git a/applications/Volkov/include/sc_sort.h b/applications/Volkov/include/sc_sort.h deleted file mode 100644 index 0a40019..0000000 --- a/applications/Volkov/include/sc_sort.h +++ /dev/null @@ -1,11 +0,0 @@ -/* sc_sort.h — сортировка EMM-записей панели. */ - -#ifndef SC_SORT_H -#define SC_SORT_H - -#include "sc_panel.h" - -int sc_sort_panel(ScPanel *panel) __banked; -int sc_sort_set(ScPanel *panel, uint8_t key) __banked; - -#endif diff --git a/applications/Volkov/include/sc_source.h b/applications/Volkov/include/sc_source.h deleted file mode 100644 index 33e545a..0000000 --- a/applications/Volkov/include/sc_source.h +++ /dev/null @@ -1,11 +0,0 @@ -/* sc_source.h — источник настоящего каталога DSS для P3. */ - -#ifndef SC_SOURCE_H -#define SC_SOURCE_H - -#include "sc_panel.h" - -int sc_source_fs_scan(ScPanel *panel) __banked; -int sc_source_fs_change_dir(ScPanel *panel, const char *name) __banked; - -#endif diff --git a/applications/Volkov/include/sc_store.h b/applications/Volkov/include/sc_store.h deleted file mode 100644 index 8674144..0000000 --- a/applications/Volkov/include/sc_store.h +++ /dev/null @@ -1,14 +0,0 @@ -/* sc_store.h — доступ к записям панели без публикации W3-указателей. */ - -#ifndef SC_STORE_H -#define SC_STORE_H - -#include -#include "sc_panel.h" - -int sc_store_get(const ScPanel *panel, uint16_t index, ScDirEntry *out); -int sc_store_put(const ScPanel *panel, uint16_t index, - const ScDirEntry *entry); -void sc_store_clear(ScPanel *panel); - -#endif diff --git a/applications/Volkov/include/sc_theme.h b/applications/Volkov/include/sc_theme.h deleted file mode 100644 index baaa8d2..0000000 --- a/applications/Volkov/include/sc_theme.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * sc_theme.h — смысловые атрибуты интерфейса. - * - * P2.2 подтвердил системный save/set/restore четырёх текстовых палитровых - * планов. Renderer знает только эти роли, а точные RGB принадлежат модулю - * sc_theme.c. - */ - -#ifndef SC_THEME_H -#define SC_THEME_H - -#include - -#define SC_ATTR_FRAME COLOR(COLOR_WHITE, COLOR_BLUE) -#define SC_ATTR_TITLE COLOR(COLOR_YELLOW, COLOR_BLUE) -#define SC_ATTR_NORMAL COLOR(COLOR_LIGHTCYAN, COLOR_BLUE) -#define SC_ATTR_FILE COLOR(COLOR_LIGHTGRAY, COLOR_BLUE) -#define SC_ATTR_DIR SC_ATTR_FRAME -#define SC_ATTR_EXE SC_ATTR_TITLE -#define SC_ATTR_ACTIVE COLOR(COLOR_BLACK, COLOR_CYAN) -#define SC_ATTR_STATUS COLOR(COLOR_BLACK, COLOR_LIGHTGRAY) -#define SC_ATTR_DIALOG COLOR(COLOR_WHITE, COLOR_RED) -#define SC_ATTR_LIMIT COLOR(COLOR_LIGHTRED, COLOR_BLUE) -#define SC_ATTR_LIMIT_ACTIVE COLOR(COLOR_LIGHTRED, COLOR_CYAN) -#define SC_ATTR_KEYS SC_ATTR_ACTIVE - -int sc_theme_init(void); -void sc_theme_reapply(void); -void sc_theme_shutdown(void); - -#endif diff --git a/applications/Volkov/include/sc_tree.h b/applications/Volkov/include/sc_tree.h deleted file mode 100644 index 4adcc6e..0000000 --- a/applications/Volkov/include/sc_tree.h +++ /dev/null @@ -1,43 +0,0 @@ -/* sc_tree.h — пошаговый BFS-обход дерева для рекурсивных файловых jobs. */ - -#ifndef SC_TREE_H -#define SC_TREE_H - -#include -#include "sc_copy.h" -#include "sc_entry.h" - -#define SC_TREE_STEP_ERROR (-1) -#define SC_TREE_STEP_DONE 0 -#define SC_TREE_STEP_FILE 1 -#define SC_TREE_STEP_DIRECTORY 2 -#define SC_TREE_STEP_SCAN_DIR 3 - -typedef struct { - uint8_t block; - uint8_t page; - uint8_t active; - uint8_t scan_state; - uint16_t head; - uint16_t tail; - uint16_t current; - uint16_t reverse; - uint16_t created_directories; - uint16_t files_seen; - int error; -} ScTreeJob; - -int sc_tree_begin(ScTreeJob *job, ScCopyJob *copy) __banked; -int sc_tree_add_root(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, const char *target_base, - const char *name) __banked; -int sc_tree_add_delete_root(ScTreeJob *job, const char *name) __banked; -int sc_tree_next(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, const char *target_base, - ScDirEntry *entry) __banked; -int sc_tree_delete_next(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, - ScDirEntry *entry) __banked; -int sc_tree_finish(ScTreeJob *job, ScCopyJob *copy) __banked; - -#endif diff --git a/applications/Volkov/include/sc_video.h b/applications/Volkov/include/sc_video.h deleted file mode 100644 index e9de2e8..0000000 --- a/applications/Volkov/include/sc_video.h +++ /dev/null @@ -1,22 +0,0 @@ -/* sc_video.h — системный координатный вывод без BIOS window descriptors. */ - -#ifndef SC_VIDEO_H -#define SC_VIDEO_H - -#include - -int sc_video_init(void); -int sc_video_restore(void); -void sc_video_shutdown(void); -int sc_video_present_rect(uint8_t page, uint16_t offset, - uint8_t row, uint8_t col, - uint8_t height, uint8_t width); -int sc_video_scroll_rect(uint8_t row, uint8_t col, - uint8_t height, uint8_t width, - uint8_t direction); - -void sc_platform_winrest(uint8_t row, uint8_t col, - uint8_t height, uint8_t width, - uint8_t page, uint16_t offset); - -#endif diff --git a/applications/Volkov/sdk.mk b/applications/Volkov/sdk.mk deleted file mode 100644 index b0d0882..0000000 --- a/applications/Volkov/sdk.mk +++ /dev/null @@ -1,11 +0,0 @@ -# Общая привязка Commander и его target-проб к Sprinter-CC. -VOLKOV_ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) --include $(VOLKOV_ROOT)/local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(VOLKOV_ROOT)/../../bin/sprinter-cc),$(abspath $(VOLKOV_ROOT)/../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT или создайте Volkov/local.mk) -endif -PROJ_ROOT := $(SPRINTER_ROOT) -export SPRINTER_ROOT MAME_HOME MAME_BIN MAME_ROMPATH MAME_DSS_IMAGE -export MAME_SYSTEM_HDD_IMAGE MAME_BIOS CHDMAN_BIN -include $(PROJ_ROOT)/app.mk diff --git a/applications/Volkov/src/sc_app.c b/applications/Volkov/src/sc_app.c deleted file mode 100644 index e48e520..0000000 --- a/applications/Volkov/src/sc_app.c +++ /dev/null @@ -1,405 +0,0 @@ -/* sc_app.c — инициализация, команды и главный цикл Commander. */ - -#include -#include -#include -#include "sc_app.h" -#include "sc_copy_ui.h" -#include "sc_exec_ui.h" -#include "sc_file_ui.h" -#include "sc_input.h" -#include "sc_panel.h" -#include "sc_screen.h" -#include "sc_select.h" -#include "sc_sort.h" -#include "sc_theme.h" -#include "sc_video.h" - -static void sc_app_redraw(ScApp *app) -{ - sc_draw_all(app); - (void)sc_screen_present_full(); -} - -static void sc_app_redraw_info(ScApp *app) -{ - sc_draw_info(app); - sc_draw_status(app); - (void)sc_screen_present_rows(29u, 2u); -} - -static void sc_app_move_cursor(ScApp *app, ScCommand command) -{ - ScPanel *panel = &app->panels[app->active_panel]; - uint16_t old_cursor = panel->cursor; - uint16_t old_top = panel->top; - uint16_t last; - uint8_t left = app->active_panel ? 41u : 1u; - uint8_t old_row; - uint8_t new_row; - - if (panel->count == 0u) return; - last = (uint16_t)(panel->count - 1u); - - switch (command) { - case SC_CMD_CURSOR_UP: - if (panel->cursor != 0u) panel->cursor--; - break; - case SC_CMD_CURSOR_DOWN: - if (panel->cursor < last) panel->cursor++; - break; - case SC_CMD_PAGE_UP: - panel->cursor = (panel->cursor > SC_PANEL_VISIBLE) ? - (uint16_t)(panel->cursor - SC_PANEL_VISIBLE) : 0u; - break; - case SC_CMD_PAGE_DOWN: - panel->cursor = (uint16_t)(panel->cursor + SC_PANEL_VISIBLE); - if (panel->cursor > last) panel->cursor = last; - break; - case SC_CMD_HOME: - panel->cursor = 0u; - break; - case SC_CMD_END: - panel->cursor = last; - break; - default: - return; - } - - if (panel->cursor < panel->top) panel->top = panel->cursor; - if (panel->cursor >= (uint16_t)(panel->top + SC_PANEL_VISIBLE)) { - panel->top = (uint16_t)(panel->cursor - SC_PANEL_VISIBLE + 1u); - } - if (panel->cursor == old_cursor && panel->top == old_top) return; - - app->status = "Navigation uses only panel state; no directory rescan."; - - if (panel->top == (uint16_t)(old_top + 1u)) { - (void)sc_screen_scroll_rows(left, 1u, 38u, SC_PANEL_VISIBLE, - SC_SCROLL_UP, SC_ATTR_NORMAL); - sc_draw_panel_row(app, app->active_panel, - (uint8_t)(SC_PANEL_VISIBLE - 1u)); - sc_draw_panel_row(app, app->active_panel, - (uint8_t)(old_cursor - panel->top)); - (void)sc_screen_present_row(left, 27u, 38u); - (void)sc_screen_present_row(left, - (uint8_t)(old_cursor - panel->top + 1u), - 38u); - } else if (old_top == (uint16_t)(panel->top + 1u)) { - (void)sc_screen_scroll_rows(left, 1u, 38u, SC_PANEL_VISIBLE, - SC_SCROLL_DOWN, SC_ATTR_NORMAL); - sc_draw_panel_row(app, app->active_panel, 0u); - sc_draw_panel_row(app, app->active_panel, - (uint8_t)(old_cursor - panel->top)); - (void)sc_screen_present_row(left, 1u, 38u); - (void)sc_screen_present_row(left, - (uint8_t)(old_cursor - panel->top + 1u), - 38u); - } else if (panel->top != old_top) { - sc_draw_panel_rows(app, app->active_panel); - sc_app_redraw(app); - return; - } else { - old_row = (uint8_t)(old_cursor - panel->top); - new_row = (uint8_t)(panel->cursor - panel->top); - sc_draw_panel_row(app, app->active_panel, old_row); - sc_draw_panel_row(app, app->active_panel, new_row); - (void)sc_screen_present_row(left, (uint8_t)(old_row + 1u), 38u); - (void)sc_screen_present_row(left, (uint8_t)(new_row + 1u), 38u); - } - sc_app_redraw_info(app); -} - -static void sc_app_stub_dialog(ScApp *app) -{ - sc_dialog_message(" Sprinter Commander ", - "Command is reserved for a later phase."); - app->status = "Reserved command closed; screen restored from EMM model."; - sc_app_redraw(app); -} - -static void sc_app_open(ScApp *app) -{ - ScPanel *panel = &app->panels[app->active_panel]; - int result = sc_panel_open_selected(panel); - - if (result == 0) { - app->status = panel->truncated ? - "Directory opened; not all entries are shown." : - "Directory opened; inactive panel kept its own path."; - sc_app_redraw(app); - } else if (result == 2) { - app->status = "More entries exist, but DSS 1.71 cannot enumerate them."; - sc_app_redraw_info(app); - } else if (result > 0) { - sc_exec_selected(app); - } else { - app->status = "Cannot open directory; DSS path/CWD was restored."; - sc_app_redraw_info(app); - } -} - -static void sc_app_parent(ScApp *app) -{ - ScPanel *panel = &app->panels[app->active_panel]; - if (sc_panel_parent(panel) == 0) { - app->status = panel->truncated ? - "Parent opened; not all entries are shown." : - "Parent directory opened; other panel is unchanged."; - sc_app_redraw(app); - } else { - app->status = "Cannot open parent; DSS path/CWD was restored."; - sc_app_redraw_info(app); - } -} - -static void sc_app_refresh(ScApp *app) -{ - ScPanel *panel = &app->panels[app->active_panel]; - if (sc_panel_refresh(panel) == 0) { - app->status = panel->truncated ? - "Panel refreshed; not all entries are shown." : - "Panel refreshed; cursor restored by entry name."; - sc_app_redraw(app); - } else { - app->status = "Refresh failed; DSS path/CWD was restored."; - sc_app_redraw_info(app); - } -} - -static void sc_app_sort(ScApp *app, uint8_t key) -{ - ScPanel *panel = &app->panels[app->active_panel]; - - if (sc_sort_set(panel, key) != 0) { - app->status = "Cannot sort panel; EMM access failed."; - sc_app_redraw_info(app); - return; - } - - app->status = "Panel sort changed: N/E/D/S and +/- are shown on its frame."; - sc_app_redraw(app); -} - -static void sc_app_select(ScApp *app, uint8_t action) -{ - ScPanel *panel = &app->panels[app->active_panel]; - int result = sc_select_apply(panel, action, 0); - - if (result < 0) { - app->status = "Selection failed: EMM access error."; - } else if (result > 0) { - app->status = "This virtual entry cannot be selected."; - } else { - app->status = "Selection changed; virtual entries are excluded."; - } - sc_app_redraw(app); -} - -static void sc_app_select_mask(ScApp *app, uint8_t action) -{ - ScPanel *panel = &app->panels[app->active_panel]; - char *mask = app->copy_job.source_path; - int result; - - mask[0] = '*'; - mask[1] = '.'; - mask[2] = '*'; - mask[3] = '\0'; - if (!sc_dialog_input(action == SC_SELECT_MASK_SET ? - " Select by mask " : " Unselect by mask ", - "DOS mask (* and ?):", mask, 13u)) { - app->status = "Mask selection cancelled."; - sc_app_redraw(app); - return; - } - - result = sc_select_apply(panel, action, mask); - app->status = result == 0 ? "Mask selection applied." : - "Mask selection failed."; - sc_app_redraw(app); -} - -static void sc_app_dispatch(ScApp *app, ScCommand command) -{ - switch (command) { - case SC_CMD_CURSOR_UP: - case SC_CMD_CURSOR_DOWN: - case SC_CMD_PAGE_UP: - case SC_CMD_PAGE_DOWN: - case SC_CMD_HOME: - case SC_CMD_END: - sc_app_move_cursor(app, command); - break; - - case SC_CMD_PANEL_SWITCH: - app->active_panel ^= 1u; - app->status = "Tab switched the active panel."; - sc_app_redraw(app); - break; - - case SC_CMD_OPEN: - sc_app_open(app); - break; - - case SC_CMD_PARENT: - sc_app_parent(app); - break; - - case SC_CMD_REFRESH: - sc_app_refresh(app); - break; - - case SC_CMD_SORT_NAME: - sc_app_sort(app, SC_SORT_NAME); - break; - - case SC_CMD_SORT_EXTENSION: - sc_app_sort(app, SC_SORT_EXTENSION); - break; - - case SC_CMD_SORT_DATE: - sc_app_sort(app, SC_SORT_DATE); - break; - - case SC_CMD_SORT_SIZE: - sc_app_sort(app, SC_SORT_SIZE); - break; - - case SC_CMD_SELECT: - sc_app_select(app, SC_SELECT_TOGGLE); - break; - - case SC_CMD_INVERT_SELECTION: - sc_app_select(app, SC_SELECT_INVERT); - break; - - case SC_CMD_SELECT_MASK: - sc_app_select_mask(app, SC_SELECT_MASK_SET); - break; - - case SC_CMD_UNSELECT_MASK: - sc_app_select_mask(app, SC_SELECT_MASK_CLEAR); - break; - - case SC_CMD_COPY: - sc_copy_selected(app); - break; - - case SC_CMD_MKDIR: - sc_mkdir_command(app); - break; - - case SC_CMD_MOVE_RENAME: - sc_rename_command(app); - break; - - case SC_CMD_DELETE: - sc_delete_command(app); - break; - - case SC_CMD_HELP: - case SC_CMD_USER_MENU: - case SC_CMD_VIEW: - case SC_CMD_EDIT: - case SC_CMD_MAIN_MENU: - sc_app_stub_dialog(app); - break; - - case SC_CMD_QUIT: - if (sc_dialog_confirm_quit()) { - app->running = 0u; - } else { - app->status = "Exit cancelled; screen restored from EMM model."; - sc_app_redraw(app); - } - break; - - case SC_CMD_CANCEL: - case SC_CMD_NONE: - default: - break; - } -} - -int sc_app_init(ScApp *app) -{ - uint8_t i; - - memset(app, 0, sizeof(*app)); - if (sc_video_init() != 0) return -1; - if (sc_theme_init() != 0) { - sc_video_shutdown(); - return -2; - } - - mem_info(&app->emm_total_before, &app->emm_free_before); - app->emm_block = mem_alloc_pages(SC_EMM_PAGE_COUNT); - if (app->emm_block == 0u) { - sc_theme_shutdown(); - sc_video_shutdown(); - return -3; - } - - for (i = 0u; i < SC_PANEL_COUNT; i++) { - app->panels[i].phys_page = mem_get_page(app->emm_block, i); - } - app->screen_page = mem_get_page(app->emm_block, 2u); - app->copy_page = mem_get_page(app->emm_block, 3u); - if (app->panels[0].phys_page == 0u || - app->panels[1].phys_page == 0u || app->screen_page == 0u || - app->copy_page == 0u) { - mem_free_block(app->emm_block); - app->emm_block = 0u; - sc_theme_shutdown(); - sc_video_shutdown(); - return -4; - } - - for (i = 0u; i < SC_PANEL_COUNT; i++) { - if (sc_panel_init(&app->panels[i], app->panels[i].phys_page) != 0) { - mem_free_block(app->emm_block); - app->emm_block = 0u; - sc_theme_shutdown(); - sc_video_shutdown(); - return -5; - } - } - - app->active_panel = 0u; - app->running = 1u; - app->status = "0.2: independent panel sorting; safe F5 copy and EXEC."; - sc_screen_attach(app->screen_page); - sc_app_redraw(app); - return 0; -} - -void sc_app_run(ScApp *app) -{ - ScKeyEvent event; - - while (app->running) { - sc_input_read(&event); - sc_app_dispatch(app, sc_command_from_event(&event)); - } -} - -int sc_app_cleanup(ScApp *app) -{ - uint16_t total_after = 0u; - uint16_t free_after = 0u; - - if (app->copy_job.state == SC_COPY_RUNNING) { - sc_copy_cancel(&app->copy_job); - } - sc_screen_detach(); - if (app->emm_block != 0u) { - mem_free_block(app->emm_block); - app->emm_block = 0u; - } - mem_info(&total_after, &free_after); - sc_theme_shutdown(); - sc_video_shutdown(); - return (total_after == app->emm_total_before && - free_after == app->emm_free_before) ? 0 : -1; -} diff --git a/applications/Volkov/src/sc_command.c b/applications/Volkov/src/sc_command.c deleted file mode 100644 index efe521f..0000000 --- a/applications/Volkov/src/sc_command.c +++ /dev/null @@ -1,49 +0,0 @@ -/* sc_command.c — перевод физических клавиш в команды приложения. */ - -#include -#include "sc_command.h" - -ScCommand sc_command_from_event(const ScKeyEvent *event) -{ - if (event->ascii == 0x1Bu) return SC_CMD_CANCEL; - if (event->ascii == 0x09u) return SC_CMD_PANEL_SWITCH; - if (event->ascii == 0x0Du) return SC_CMD_OPEN; - if (event->ascii == 0x08u) return SC_CMD_PARENT; - if (event->ascii == 0x12u) return SC_CMD_REFRESH; - if (event->ascii == '*') return SC_CMD_INVERT_SELECTION; - if (event->ascii == '+') return SC_CMD_SELECT_MASK; - if (event->ascii == '-') return SC_CMD_UNSELECT_MASK; - - if ((event->modifiers & SC_MOD_CTRL) != 0u) { - if (event->scan == KEY_PGUP) return SC_CMD_PARENT; - if (event->scan == 0x13u) return SC_CMD_REFRESH; - if (event->scan == KEY_F3) return SC_CMD_SORT_NAME; - if (event->scan == KEY_F4) return SC_CMD_SORT_EXTENSION; - if (event->scan == KEY_F5) return SC_CMD_SORT_DATE; - if (event->scan == KEY_F6) return SC_CMD_SORT_SIZE; - return SC_CMD_NONE; - } - - if (event->ascii != 0u) return SC_CMD_NONE; - - switch (event->scan) { - case KEY_UP: return SC_CMD_CURSOR_UP; - case KEY_DOWN: return SC_CMD_CURSOR_DOWN; - case KEY_PGUP: return SC_CMD_PAGE_UP; - case KEY_PGDN: return SC_CMD_PAGE_DOWN; - case KEY_HOME: return SC_CMD_HOME; - case KEY_END: return SC_CMD_END; - case KEY_INS: return SC_CMD_SELECT; - case KEY_F1: return SC_CMD_HELP; - case KEY_F2: return SC_CMD_USER_MENU; - case KEY_F3: return SC_CMD_VIEW; - case KEY_F4: return SC_CMD_EDIT; - case KEY_F5: return SC_CMD_COPY; - case KEY_F6: return SC_CMD_MOVE_RENAME; - case KEY_F7: return SC_CMD_MKDIR; - case KEY_F8: return SC_CMD_DELETE; - case KEY_F9: return SC_CMD_MAIN_MENU; - case KEY_F10: return SC_CMD_QUIT; - default: return SC_CMD_NONE; - } -} diff --git a/applications/Volkov/src/sc_copy_job.c b/applications/Volkov/src/sc_copy_job.c deleted file mode 100644 index 4d4d527..0000000 --- a/applications/Volkov/src/sc_copy_job.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * sc_copy_job.c — безопасное копирование одного файла для PoC. - * - * Код живёт в W1-банке, данные job — в W2, единственный блок данных — в - * выделенной EMM-странице W3. Target никогда не открывается с усечением: - * сначала создаётся уникальный temp через O_EXCL, а после закрытия обоих fd - * target проверяется повторно и temp атомарно переименовывается. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "sc_copy.h" -#include "sc_disk.h" -#include "sc_metadata.h" -#include "sc_path.h" - -#define SC_COPY_TEMP_ATTEMPTS 256u -#define SC_COPY_BACKUP_ATTEMPTS 256u - -static uint16_t sc_copy_temp_sequence; -static uint16_t sc_copy_backup_sequence; -static char sc_copy_temp_name[13]; -static char sc_copy_backup_name[13]; - -static char sc_hex_digit(uint8_t value) -{ - value &= 0x0Fu; - return (char)(value < 10u ? '0' + value : 'A' + value - 10u); -} - -static void sc_make_temp_name(uint16_t value) -{ - sc_copy_temp_name[0] = '~'; - sc_copy_temp_name[1] = 'S'; - sc_copy_temp_name[2] = 'C'; - sc_copy_temp_name[3] = sc_hex_digit((uint8_t)(value >> 12)); - sc_copy_temp_name[4] = sc_hex_digit((uint8_t)(value >> 8)); - sc_copy_temp_name[5] = sc_hex_digit((uint8_t)(value >> 4)); - sc_copy_temp_name[6] = sc_hex_digit((uint8_t)value); - sc_copy_temp_name[7] = '.'; - sc_copy_temp_name[8] = 'T'; - sc_copy_temp_name[9] = 'M'; - sc_copy_temp_name[10] = 'P'; - sc_copy_temp_name[11] = '\0'; -} - -static void sc_make_backup_name(uint16_t value) -{ - sc_copy_backup_name[0] = '~'; - sc_copy_backup_name[1] = 'S'; - sc_copy_backup_name[2] = 'B'; - sc_copy_backup_name[3] = sc_hex_digit((uint8_t)(value >> 12)); - sc_copy_backup_name[4] = sc_hex_digit((uint8_t)(value >> 8)); - sc_copy_backup_name[5] = sc_hex_digit((uint8_t)(value >> 4)); - sc_copy_backup_name[6] = sc_hex_digit((uint8_t)value); - sc_copy_backup_name[7] = '.'; - sc_copy_backup_name[8] = 'B'; - sc_copy_backup_name[9] = 'A'; - sc_copy_backup_name[10] = 'K'; - sc_copy_backup_name[11] = '\0'; -} - -/* 1 — существует; 0 — достоверно отсутствует; -1 — проверить не удалось. */ -static int sc_path_exists(const char *path) -{ - int fd; - int saved_errno; - - errno = 0; - fd = open(path, O_RDONLY); - if (fd >= 0) { - if (close(fd) != 0) return -1; - return 1; - } - saved_errno = errno; - if (saved_errno == ENOENT || saved_errno == ENOPATH) return 0; - errno = saved_errno; - return -1; -} - -static void sc_copy_close_fd(int *fd) -{ - int owned = *fd; - *fd = -1; - if (owned >= 0) (void)close(owned); -} - -static void sc_copy_remove_temp(ScCopyJob *job) -{ - if (job->temp_exists) { - (void)unlink(job->temp_path); - job->temp_exists = 0u; - } -} - -static int sc_copy_fail(ScCopyJob *job, int error) -{ - if (error == 0) error = EUNKERR; - sc_copy_close_fd(&job->source_fd); - sc_copy_close_fd(&job->temp_fd); - sc_copy_remove_temp(job); - job->error = error; - job->state = SC_COPY_ERROR; - errno = error; - return SC_COPY_STEP_ERROR; -} - -static int sc_copy_create_temp(ScCopyJob *job, const char *target_dir) -{ - uint16_t attempt; - - for (attempt = 0u; attempt < SC_COPY_TEMP_ATTEMPTS; attempt++) { - sc_make_temp_name(sc_copy_temp_sequence++); - if (sc_path_join(job->temp_path, SC_COPY_PATH_CAPACITY, - target_dir, sc_copy_temp_name) != 0) return -1; - errno = 0; - job->temp_fd = open(job->temp_path, - O_WRONLY | O_CREAT | O_EXCL); - if (job->temp_fd >= 0) { - job->temp_exists = 1u; - return 0; - } - if (errno != EEXIST) return -1; - } - errno = EEXIST; - return -1; -} - -static char *sc_copy_path_name(char *path) -{ - char *name = path; - char *scan = path; - - while (*scan != '\0') { - if (*scan == '\\' || *scan == '/') name = scan + 1; - scan++; - } - return name; -} - -/* - * Возвращает байт, который можно временно заменить нулём, чтобы получить - * каталог temp. Для корня режется первый байт имени (`\NAME` -> `\`), - * для обычного пути — предшествующий разделитель (`\DIR\NAME` -> `\DIR`). - */ -static char *sc_copy_directory_cut(char *path, char *name) -{ - char *separator; - - if (name == path) return 0; - separator = name - 1; - if (separator == path || - (separator == path + 2 && path[1] == ':')) return name; - return separator; -} - -/* Выбирает отсутствующее backup-имя, не создавая файла. Полный путь временно - * строится в source_path: source fd к этому моменту уже закрыт. */ -static int sc_copy_choose_backup(ScCopyJob *job, char *target_name) -{ - char *directory_cut = sc_copy_directory_cut(job->target_path, - target_name); - char saved_cut = '\0'; - uint16_t attempt; - int exists; - - if (directory_cut) { - saved_cut = *directory_cut; - *directory_cut = '\0'; - } - for (attempt = 0u; attempt < SC_COPY_BACKUP_ATTEMPTS; attempt++) { - sc_make_backup_name(sc_copy_backup_sequence++); - if (directory_cut) { - if (sc_path_join(job->source_path, SC_COPY_PATH_CAPACITY, - job->target_path, sc_copy_backup_name) != 0) { - *directory_cut = saved_cut; - return -1; - } - } else { - strncpy(job->source_path, sc_copy_backup_name, - SC_COPY_PATH_CAPACITY - 1u); - job->source_path[SC_COPY_PATH_CAPACITY - 1u] = '\0'; - } - exists = sc_path_exists(job->source_path); - if (exists == 0) { - if (directory_cut) *directory_cut = saved_cut; - return 0; - } - if (exists < 0) { - if (directory_cut) *directory_cut = saved_cut; - return -1; - } - } - if (directory_cut) *directory_cut = saved_cut; - errno = EEXIST; - return -1; -} - -static int sc_copy_finish(ScCopyJob *job) -{ - int exists; - int saved_errno; - int rename_errno = 0; - int final_errno = 0; - char *temp_name; - char *target_name; - char *directory_cut; - char saved_cut = '\0'; - uint8_t changed_directory = 0u; - uint8_t replace_target = 0u; - uint8_t backup_exists = 0u; - uint8_t readonly_cleared = 0u; - - if (job->source_fd >= 0) { - int fd = job->source_fd; - job->source_fd = -1; - if (close(fd) != 0) return sc_copy_fail(job, errno); - } - if (job->temp_fd >= 0) { - int fd = job->temp_fd; - if (job->preserve_metadata && - sc_metadata_set_datetime((uint8_t)fd, job->source_date, - job->source_time) != 0) { - return sc_copy_fail(job, errno); - } - job->temp_fd = -1; - if (close(fd) != 0) return sc_copy_fail(job, errno); - } - - exists = sc_path_exists(job->target_path); - if (exists < 0) return sc_copy_fail(job, errno); - if (exists > 0) { - if (!job->replace_existing) return sc_copy_fail(job, EEXIST); - if (sc_metadata_get_attributes(job->target_path, - &job->existing_attr) != 0) { - return sc_copy_fail(job, errno); - } - replace_target = 1u; - } - - /* DSS 1.71 RENAME принимает два имени из текущего каталога. Полный - * путь старого файла он частично разбирает, но полный новый путь затем - * отвергает как EINAME. Поэтому commit выполняется локально в target-dir - * с обязательным восстановлением глобального CWD приложения. */ - temp_name = sc_copy_path_name(job->temp_path); - target_name = sc_copy_path_name(job->target_path); - if (*temp_name == '\0' || *target_name == '\0') { - return sc_copy_fail(job, EINAME); - } - directory_cut = sc_copy_directory_cut(job->temp_path, temp_name); - if (replace_target && sc_copy_choose_backup(job, target_name) != 0) { - return sc_copy_fail(job, errno); - } - if (directory_cut) { - if (!getcwd(job->source_path, SC_COPY_PATH_CAPACITY)) { - return sc_copy_fail(job, errno); - } - saved_cut = *directory_cut; - *directory_cut = '\0'; - if (chdir(job->temp_path) != 0) { - saved_errno = errno; - *directory_cut = saved_cut; - return sc_copy_fail(job, saved_errno); - } - *directory_cut = saved_cut; - changed_directory = 1u; - } - - if (replace_target && (job->existing_attr & FA_RDONLY)) { - if (sc_metadata_set_attributes(target_name, - (uint8_t)(job->existing_attr & (uint8_t)~FA_RDONLY)) != 0) { - rename_errno = errno; - } else { - readonly_cleared = 1u; - } - } - if (replace_target && rename_errno == 0) { - if (rename(target_name, sc_copy_backup_name) != 0) { - rename_errno = errno; - } else { - backup_exists = 1u; - } - } - if (rename_errno == 0 && rename(temp_name, target_name) != 0) { - rename_errno = errno; - } else if (rename_errno == 0) { - job->temp_exists = 0u; - job->committed = 1u; - } - - /* До удаления backup новая запись должна получить все метаданные. При - * отказе ATTRIB возвращаем старый target на место. */ - if (job->committed && job->preserve_metadata && - sc_metadata_set_attributes(target_name, job->source_attr) != 0) { - rename_errno = errno; - } - if (rename_errno != 0 && backup_exists) { - if (job->committed && unlink(target_name) != 0) { - final_errno = errno; - } else if (rename(sc_copy_backup_name, target_name) != 0) { - final_errno = errno; - } else { - backup_exists = 0u; - job->committed = 0u; - if (readonly_cleared && - sc_metadata_set_attributes(target_name, - job->existing_attr) != 0) { - final_errno = errno; - } - } - } - if (rename_errno == 0 && backup_exists) { - if (unlink(sc_copy_backup_name) != 0) final_errno = errno; - else backup_exists = 0u; - } - if (rename_errno != 0 && readonly_cleared && !backup_exists && - !job->committed) { - if (sc_metadata_set_attributes(target_name, - job->existing_attr) != 0 && - final_errno == 0) final_errno = errno; - } - if (changed_directory && chdir(job->source_path) != 0) { - saved_errno = errno; - if (rename_errno != 0) return sc_copy_fail(job, - final_errno != 0 ? - final_errno : rename_errno); - job->error = saved_errno; - job->state = SC_COPY_ERROR; - errno = saved_errno; - return SC_COPY_STEP_ERROR; - } - if (rename_errno != 0) { - return sc_copy_fail(job, final_errno != 0 ? final_errno : rename_errno); - } - if (final_errno != 0) { - job->error = final_errno; - job->state = SC_COPY_ERROR; - errno = final_errno; - return SC_COPY_STEP_ERROR; - } - - job->state = SC_COPY_DONE; - job->error = 0; - return SC_COPY_STEP_DONE; -} - -static int sc_copy_begin_policy_impl(ScCopyJob *job, const char *source_dir, - const char *target_dir, - const char *source_name, - const char *target_name, uint32_t size, - uint8_t page, uint8_t replace) -{ - int exists; - - if (!job || !source_dir || !target_dir || !source_name || !target_name || - source_name[0] == '\0' || target_name[0] == '\0' || page == 0u) { - errno = EINVAL; - return -1; - } - memset(job, 0, sizeof(*job)); - job->source_fd = -1; - job->temp_fd = -1; - job->page = page; - job->total = size; - job->replace_existing = replace ? 1u : 0u; - - if (sc_path_join(job->source_path, SC_COPY_PATH_CAPACITY, - source_dir, source_name) != 0 || - sc_path_join(job->target_path, SC_COPY_PATH_CAPACITY, - target_dir, target_name) != 0) { - return sc_copy_fail(job, errno); - } - - exists = sc_path_exists(job->target_path); - if (exists < 0) return sc_copy_fail(job, errno); - if (exists > 0) { - if (sc_metadata_get_attributes(job->target_path, - &job->existing_attr) != 0) { - return sc_copy_fail(job, errno); - } - if (!job->replace_existing) return sc_copy_fail(job, EEXIST); - } - exists = sc_disk_has_space(job->target_path, size); - if (exists <= 0) return sc_copy_fail(job, exists == 0 ? ENOSPC : errno); - if (sc_copy_create_temp(job, target_dir) != 0) { - return sc_copy_fail(job, errno); - } - job->source_fd = open(job->source_path, O_RDONLY); - if (job->source_fd < 0) return sc_copy_fail(job, errno); - - job->state = SC_COPY_RUNNING; - return 0; -} - -int sc_copy_begin(ScCopyJob *job, const char *source_dir, - const char *target_dir, const char *name, - uint32_t size, uint8_t page) __banked -{ - return sc_copy_begin_policy_impl(job, source_dir, target_dir, name, name, - size, page, 0u); -} - -int sc_copy_begin_policy(ScCopyJob *job, const char *source_dir, - const char *target_dir, const char *source_name, - const char *target_name, uint32_t size, - uint8_t page, uint8_t replace) __banked -{ - return sc_copy_begin_policy_impl(job, source_dir, target_dir, - source_name, target_name, size, page, - replace); -} - -static int sc_copy_begin_prepared_impl(ScCopyJob *job, const char *name, - uint32_t size, uint8_t page, - uint8_t replace) -{ - char *target_name; - char *directory_cut; - char saved_cut; - int exists; - int saved_errno; - - if (!job || !name || name[0] == '\0' || page == 0u || - job->target_path[0] == '\0') { - errno = EINVAL; - return -1; - } - job->source_fd = -1; - job->temp_fd = -1; - job->total = size; - job->done = 0ul; - job->error = 0; - job->page = page; - job->state = SC_COPY_IDLE; - job->temp_exists = 0u; - job->preserve_metadata = 0u; - job->replace_existing = replace ? 1u : 0u; - job->committed = 0u; - job->existing_attr = 0u; - strncpy(job->source_path, name, SC_COPY_PATH_CAPACITY - 1u); - job->source_path[SC_COPY_PATH_CAPACITY - 1u] = '\0'; - - exists = sc_path_exists(job->target_path); - if (exists < 0) return sc_copy_fail(job, errno); - if (exists > 0) { - if (sc_metadata_get_attributes(job->target_path, - &job->existing_attr) != 0) { - return sc_copy_fail(job, errno); - } - if (!job->replace_existing) return sc_copy_fail(job, EEXIST); - } - - exists = sc_disk_has_space(job->target_path, size); - if (exists <= 0) return sc_copy_fail(job, exists == 0 ? ENOSPC : errno); - - target_name = sc_copy_path_name(job->target_path); - directory_cut = sc_copy_directory_cut(job->target_path, target_name); - if (!directory_cut || *target_name == '\0') { - return sc_copy_fail(job, EINAME); - } - saved_cut = *directory_cut; - *directory_cut = '\0'; - if (sc_copy_create_temp(job, job->target_path) != 0) { - saved_errno = errno; - *directory_cut = saved_cut; - return sc_copy_fail(job, saved_errno); - } - *directory_cut = saved_cut; - - job->source_fd = open(job->source_path, O_RDONLY); - if (job->source_fd < 0) return sc_copy_fail(job, errno); - job->state = SC_COPY_RUNNING; - return 0; -} - -int sc_copy_begin_prepared(ScCopyJob *job, const char *name, - uint32_t size, uint8_t page) __banked -{ - return sc_copy_begin_prepared_impl(job, name, size, page, 0u); -} - -int sc_copy_begin_prepared_policy(ScCopyJob *job, const char *name, - uint32_t size, uint8_t page, - uint8_t replace) __banked -{ - return sc_copy_begin_prepared_impl(job, name, size, page, replace); -} - -int sc_copy_step(ScCopyJob *job) __banked -{ - uint32_t remaining; - uint16_t chunk; - int count; - - if (!job || job->state != SC_COPY_RUNNING) { - errno = EINVAL; - return SC_COPY_STEP_ERROR; - } - remaining = job->total - job->done; - if (remaining == 0ul) return sc_copy_finish(job); - chunk = remaining > SC_COPY_CHUNK_SIZE ? - SC_COPY_CHUNK_SIZE : (uint16_t)remaining; - - count = bank_read_page(job->source_fd, job->page, 0u, chunk); - if (count != (int)chunk) { - return sc_copy_fail(job, count < 0 ? errno : EREAD); - } - count = bank_write_page(job->temp_fd, job->page, 0u, chunk); - if (count != (int)chunk) { - return sc_copy_fail(job, count < 0 ? errno : EWRITE); - } - job->done += (uint32_t)chunk; - /* Даже после последнего блока сначала возвращаем управление UI. Так - * между полной записью temp и commit/rename остаётся точка отмены. - * Следующий вызов попадёт в remaining == 0 и выполнит commit. */ - return SC_COPY_STEP_MORE; -} - -void sc_copy_cancel(ScCopyJob *job) __banked -{ - if (!job || job->state != SC_COPY_RUNNING) return; - sc_copy_close_fd(&job->source_fd); - sc_copy_close_fd(&job->temp_fd); - sc_copy_remove_temp(job); - job->error = 0; - job->state = SC_COPY_CANCELLED; -} diff --git a/applications/Volkov/src/sc_copy_ui.c b/applications/Volkov/src/sc_copy_ui.c deleted file mode 100644 index cac913c..0000000 --- a/applications/Volkov/src/sc_copy_ui.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * sc_copy_ui.c — банковая оркестрация F5 и отображение прогресса. - * - * Обработчик остаётся синхронным, но после каждого блока возвращает W3, - * обновляет строку состояния и проверяет Esc. Сам блок данных здесь не - * хранится: copy job переносит его через выделенную EMM-страницу ScApp. - */ - -#include -#include -#include -#include "sc_app.h" -#include "sc_copy_ui.h" -#include "sc_input.h" -#include "sc_panel.h" -#include "sc_path.h" -#include "sc_screen.h" -#include "sc_store.h" -#include "sc_tree.h" - -#define SC_COPY_RUN_DONE 0 -#define SC_COPY_RUN_ERROR -1 -#define SC_COPY_RUN_CANCELLED 1 -#define SC_COPY_RUN_SKIPPED 2 - -#define SC_COPY_POLICY_ASK 0u -#define SC_COPY_POLICY_OVERWRITE_ALL 1u -#define SC_COPY_POLICY_SKIP_ALL 2u - -static char sc_copy_status_text[79]; -static char sc_copy_rename_name[13]; - -static char *sc_copy_status_append(char *out, const char *text) -{ - char *limit = sc_copy_status_text + sizeof(sc_copy_status_text) - 1u; - - while (*text != '\0' && out < limit) *out++ = *text++; - *out = '\0'; - return out; -} - -static char *sc_copy_status_u32(char *out, uint32_t value) -{ - char digits[10]; - uint8_t count = 0u; - - do { - digits[count++] = (char)('0' + value % 10ul); - value /= 10ul; - } while (value != 0ul); - while (count != 0u) { - char one[2]; - one[0] = digits[--count]; - one[1] = '\0'; - out = sc_copy_status_append(out, one); - } - return out; -} - -static void sc_copy_redraw_info(ScApp *app) -{ - sc_draw_info(app); - sc_draw_status(app); - (void)sc_screen_present_rows(29u, 2u); -} - -static void sc_copy_redraw_all(ScApp *app) -{ - sc_draw_all(app); - (void)sc_screen_present_full(); -} - -static void sc_copy_progress(ScApp *app, const char *name, - uint16_t number, uint16_t total) -{ - char *out = sc_copy_status_text; - - out = sc_copy_status_append(out, "Copying "); - if (total > 1u) { - out = sc_copy_status_u32(out, number); - out = sc_copy_status_append(out, "/"); - out = sc_copy_status_u32(out, total); - out = sc_copy_status_append(out, " "); - } - out = sc_copy_status_append(out, name); - out = sc_copy_status_append(out, ": "); - out = sc_copy_status_u32(out, app->copy_job.done); - out = sc_copy_status_append(out, "/"); - out = sc_copy_status_u32(out, app->copy_job.total); - (void)sc_copy_status_append(out, " bytes; Esc cancels."); - app->status = sc_copy_status_text; -} - -static void sc_copy_group_status(ScApp *app, const char *prefix, - uint16_t copied, uint16_t total, - uint16_t directories, int error) -{ - char *out = sc_copy_status_text; - - out = sc_copy_status_append(out, prefix); - out = sc_copy_status_u32(out, copied); - out = sc_copy_status_append(out, "/"); - out = sc_copy_status_u32(out, total); - out = sc_copy_status_append(out, " files"); - if (directories != 0u) { - out = sc_copy_status_append(out, "; unprocessed "); - out = sc_copy_status_u32(out, directories); - out = sc_copy_status_append(out, " dirs"); - } - if (error != 0) { - out = sc_copy_status_append(out, "; errno "); - out = sc_copy_status_u32(out, (uint16_t)error); - } - (void)sc_copy_status_append(out, "."); - app->status = sc_copy_status_text; -} - -static void sc_copy_error(ScApp *app, int error) -{ - char *out; - - if (app->copy_job.committed) { - out = sc_copy_status_text; - out = sc_copy_status_append(out, "File committed; finalization failed (errno "); - out = sc_copy_status_u32(out, (uint16_t)error); - (void)sc_copy_status_append(out, ")."); - app->status = sc_copy_status_text; - return; - } - if (error == EEXIST) { - app->status = "Copy refused: target file already exists."; - return; - } - if (error == ENOSPC) { - app->status = "Copy refused: not enough free space; no temp created."; - return; - } - out = sc_copy_status_text; - out = sc_copy_status_append(out, "Copy failed (errno "); - out = sc_copy_status_u32(out, (uint16_t)error); - (void)sc_copy_status_append(out, "); temporary file removed."); - app->status = sc_copy_status_text; -} - -static int sc_copy_run(ScApp *app, const ScDirEntry *entry, - uint16_t number, uint16_t total) -{ - ScKeyEvent event; - int result; - - sc_copy_progress(app, entry->name, number, total); - sc_copy_redraw_info(app); - for (;;) { - if (sc_input_poll(&event) && event.ascii == 0x1Bu) { - sc_copy_cancel(&app->copy_job); - return SC_COPY_RUN_CANCELLED; - } - result = sc_copy_step(&app->copy_job); - if (result == SC_COPY_STEP_MORE) { - sc_copy_progress(app, entry->name, number, total); - sc_copy_redraw_info(app); - continue; - } - if (result == SC_COPY_STEP_ERROR) return SC_COPY_RUN_ERROR; - return SC_COPY_RUN_DONE; - } -} - -static void sc_copy_set_metadata(ScApp *app, const ScDirEntry *entry) -{ - app->copy_job.source_date = entry->date; - app->copy_job.source_time = entry->time; - app->copy_job.source_attr = entry->attr; - app->copy_job.preserve_metadata = 1u; -} - -static uint8_t sc_copy_conflict_action(ScApp *app, uint8_t *policy) -{ - uint8_t action; - - if (*policy == SC_COPY_POLICY_SKIP_ALL) return 'S'; - if (*policy == SC_COPY_POLICY_OVERWRITE_ALL && - !(app->copy_job.existing_attr & FA_RDONLY)) return 'O'; - - action = sc_dialog_choice( - (app->copy_job.existing_attr & FA_RDONLY) ? - " Read-only target " : " Target exists ", - "Choose action for the existing file.", - "OSRAN", "O/S/R A=all N=skip all Esc"); - if (action == 'A') { - *policy = SC_COPY_POLICY_OVERWRITE_ALL; - return 'O'; - } - if (action == 'N') { - *policy = SC_COPY_POLICY_SKIP_ALL; - return 'S'; - } - return action; -} - -static uint8_t sc_copy_input_rename(void) -{ - for (;;) { - sc_copy_rename_name[0] = '\0'; - if (!sc_dialog_input(" Copy under new name ", - "New DOS 8.3 name:", - sc_copy_rename_name, - sizeof(sc_copy_rename_name))) return 0u; - if (sc_path_validate_component(sc_copy_rename_name) == 0) return 1u; - sc_dialog_message(" Invalid target name ", - "Use one DOS 8.3 component."); - } -} - -static int sc_copy_target_set_name(ScCopyJob *job, const char *name) -{ - char *target = job->target_path; - char *write = target; - uint16_t prefix; - uint8_t length = 0u; - - while (*target != '\0') { - if (*target == '\\' || *target == '/') write = target + 1; - target++; - } - prefix = (uint16_t)(write - job->target_path); - while (name[length] != '\0') length++; - if (prefix + length + 1u > SC_COPY_PATH_CAPACITY) { - errno = EINAME; - return -1; - } - while ((*write++ = *name++) != '\0') {} - return 0; -} - -static int sc_copy_one(ScApp *app, const ScPanel *source, - const ScPanel *target, const ScDirEntry *entry, - uint16_t number, uint16_t total, uint8_t *policy) -{ - const char *target_name = entry->name; - uint8_t replace = 0u; - uint8_t action; - - for (;;) { - if (sc_copy_begin_policy(&app->copy_job, source->path, target->path, - entry->name, target_name, entry->size, - app->copy_page, replace) == 0) break; - if (errno != EEXIST || replace) return SC_COPY_RUN_ERROR; - action = sc_copy_conflict_action(app, policy); - if (action == 0u) return SC_COPY_RUN_CANCELLED; - if (action == 'S') return SC_COPY_RUN_SKIPPED; - if (action == 'R') { - if (!sc_copy_input_rename()) return SC_COPY_RUN_CANCELLED; - target_name = sc_copy_rename_name; - replace = 0u; - } else { - replace = 1u; - } - } - sc_copy_set_metadata(app, entry); - return sc_copy_run(app, entry, number, total); -} - -static int sc_copy_tree_file(ScApp *app, const ScDirEntry *entry, - uint16_t number, uint8_t *policy) -{ - uint8_t replace = 0u; - uint8_t action; - - for (;;) { - if (sc_copy_begin_prepared_policy(&app->copy_job, entry->name, - entry->size, app->copy_page, - replace) == 0) break; - if (errno != EEXIST || replace) return SC_COPY_RUN_ERROR; - action = sc_copy_conflict_action(app, policy); - if (action == 0u) return SC_COPY_RUN_CANCELLED; - if (action == 'S') return SC_COPY_RUN_SKIPPED; - if (action == 'R') { - if (!sc_copy_input_rename()) return SC_COPY_RUN_CANCELLED; - if (sc_copy_target_set_name(&app->copy_job, - sc_copy_rename_name) != 0) { - return SC_COPY_RUN_ERROR; - } - replace = 0u; - } else { - replace = 1u; - } - } - sc_copy_set_metadata(app, entry); - return sc_copy_run(app, entry, number, 0u); -} - -static void sc_copy_tree_status(ScApp *app, const char *prefix, - uint16_t files, uint16_t directories, - int error) -{ - char *out = sc_copy_status_text; - - out = sc_copy_status_append(out, prefix); - out = sc_copy_status_u32(out, files); - out = sc_copy_status_append(out, " files; "); - out = sc_copy_status_u32(out, directories); - out = sc_copy_status_append(out, " dirs"); - if (error != 0) { - out = sc_copy_status_append(out, "; errno "); - out = sc_copy_status_u32(out, (uint16_t)error); - } - (void)sc_copy_status_append(out, "."); - app->status = sc_copy_status_text; -} - -static void sc_copy_directory(ScApp *app, ScPanel *source, - ScPanel *target, const ScDirEntry *root, - uint16_t copied_before, uint8_t *policy) -{ - ScTreeJob tree; - ScDirEntry entry; - ScKeyEvent event; - uint16_t copied = copied_before; - uint16_t skipped = 0u; - uint16_t created = 0u; - uint16_t i; - int step = SC_TREE_STEP_DONE; - int result = SC_COPY_RUN_DONE; - int operation_error = 0; - - if (sc_tree_begin(&tree, &app->copy_job) != 0) { - if (copied_before != 0u) { - app->status = sc_panel_refresh(target) != 0 ? - "Files copied, but traversal alloc and refresh failed." : - "Files copied; tree traversal page allocation failed."; - } else { - app->status = "Tree copy failed: cannot allocate traversal page."; - } - sc_copy_redraw_all(app); - return; - } - if (root) { - if (sc_tree_add_root(&tree, &app->copy_job, source->path, - target->path, root->name) != 0) { - operation_error = errno; - step = SC_TREE_STEP_ERROR; - } - } else { - for (i = 0u; i < source->count; i++) { - if (sc_store_get(source, i, &entry) != 0) { - operation_error = ENOMEM; - step = SC_TREE_STEP_ERROR; - break; - } - if (!(entry.flags & SC_ENTRY_SELECTED) || - !(entry.attr & FA_DIREC) || - (entry.flags & (SC_ENTRY_PARENT | SC_ENTRY_DSS_LIMIT))) { - continue; - } - if (sc_tree_add_root(&tree, &app->copy_job, source->path, - target->path, entry.name) != 0) { - operation_error = errno; - step = SC_TREE_STEP_ERROR; - break; - } - } - } - - while (step != SC_TREE_STEP_ERROR) { - if (sc_input_poll(&event) && event.ascii == 0x1Bu) { - result = SC_COPY_RUN_CANCELLED; - break; - } - step = sc_tree_next(&tree, &app->copy_job, source->path, - target->path, &entry); - if (step == SC_TREE_STEP_DONE) break; - if (step == SC_TREE_STEP_ERROR) { - operation_error = tree.error; - break; - } - created = tree.created_directories; - if (step == SC_TREE_STEP_DIRECTORY) { - sc_copy_tree_status(app, "Copying tree: ", copied, created, 0); - sc_copy_redraw_info(app); - continue; - } - result = sc_copy_tree_file(app, &entry, - (uint16_t)(copied + skipped + 1u), policy); - if (result == SC_COPY_RUN_SKIPPED) { - skipped++; - result = SC_COPY_RUN_DONE; - continue; - } - if (result != SC_COPY_RUN_DONE) { - operation_error = app->copy_job.error; - break; - } - copied++; - } - - created = tree.created_directories; - if (sc_tree_finish(&tree, &app->copy_job) != 0 && - operation_error == 0) { - operation_error = errno; - step = SC_TREE_STEP_ERROR; - } - - if ((created != 0u || copied != 0u) && sc_panel_refresh(target) != 0) { - app->status = "Tree copied partly, but passive panel refresh failed."; - } else if (result == SC_COPY_RUN_CANCELLED) { - sc_copy_tree_status(app, "Tree cancelled after ", copied, created, 0); - } else if (step == SC_TREE_STEP_ERROR || result == SC_COPY_RUN_ERROR) { - sc_copy_tree_status(app, "Tree stopped after ", copied, created, - operation_error); - } else { - sc_copy_tree_status(app, "Tree copied: ", copied, created, 0); - } - sc_copy_redraw_all(app); -} - -static int sc_copy_count_group(const ScPanel *source, - uint16_t *files, uint16_t *directories) -{ - ScDirEntry entry; - uint16_t i; - - *files = 0u; - *directories = 0u; - for (i = 0u; i < source->count; i++) { - if (sc_store_get(source, i, &entry) != 0) return -1; - if (!(entry.flags & SC_ENTRY_SELECTED)) continue; - if (entry.attr & FA_DIREC) (*directories)++; - else if (!(entry.flags & SC_ENTRY_DSS_LIMIT)) (*files)++; - } - return 0; -} - -static void sc_copy_group(ScApp *app, ScPanel *source, ScPanel *target, - uint8_t *policy) -{ - ScDirEntry entry; - uint16_t files; - uint16_t directories; - uint16_t copied = 0u; - uint16_t skipped = 0u; - uint16_t i; - int result = SC_COPY_RUN_DONE; - int operation_error = 0; - - if (sc_copy_count_group(source, &files, &directories) != 0) { - app->status = "Group copy failed: EMM access error."; - sc_copy_redraw_info(app); - return; - } - if (files == 0u && directories == 0u) { - app->status = "Copy refused: selected group has no real entries."; - sc_copy_redraw_info(app); - return; - } - - for (i = 0u; i < source->count; i++) { - if (sc_store_get(source, i, &entry) != 0) { - result = SC_COPY_RUN_ERROR; - operation_error = ENOMEM; - break; - } - if (!(entry.flags & SC_ENTRY_SELECTED) || - (entry.attr & FA_DIREC) || - (entry.flags & SC_ENTRY_DSS_LIMIT)) continue; - result = sc_copy_one(app, source, target, &entry, - (uint16_t)(copied + skipped + 1u), files, - policy); - if (result == SC_COPY_RUN_SKIPPED) { - skipped++; - result = SC_COPY_RUN_DONE; - continue; - } - if (result != SC_COPY_RUN_DONE) { - operation_error = app->copy_job.error; - break; - } - copied++; - } - - if (result == SC_COPY_RUN_DONE && directories != 0u) { - sc_copy_directory(app, source, target, 0, copied, policy); - return; - } - - if (copied != 0u && sc_panel_refresh(target) != 0) { - app->status = "Files copied, but passive panel refresh failed."; - } else if (result == SC_COPY_RUN_CANCELLED) { - sc_copy_group_status(app, "Group cancelled after ", copied, files, - directories, 0); - } else if (result == SC_COPY_RUN_ERROR) { - sc_copy_group_status(app, "Group stopped after ", copied, files, - directories, operation_error); - } else { - sc_copy_group_status(app, "Copied ", copied, files, - directories, 0); - } - sc_copy_redraw_all(app); -} - -void sc_copy_selected(ScApp *app) __banked -{ - ScPanel *source = &app->panels[app->active_panel]; - ScPanel *target = &app->panels[app->active_panel ^ 1u]; - ScDirEntry entry; - int result; - uint8_t policy = SC_COPY_POLICY_ASK; - - if (source->selected_count != 0u) { - sc_copy_group(app, source, target, &policy); - return; - } - - if (sc_panel_selected(source, &entry) != 0) { - app->status = "Copy refused: active panel has no selected entry."; - sc_copy_redraw_info(app); - return; - } - if ((entry.flags & SC_ENTRY_DSS_LIMIT) != 0u) { - app->status = "Copy refused: the DSS limit marker is not a file."; - sc_copy_redraw_info(app); - return; - } - if ((entry.attr & FA_DIREC) != 0u) { - sc_copy_directory(app, source, target, &entry, 0u, &policy); - return; - } - - result = sc_copy_one(app, source, target, &entry, 1u, 1u, &policy); - if (result == SC_COPY_RUN_ERROR) { - sc_copy_error(app, app->copy_job.error); - sc_copy_redraw_all(app); - return; - } - if (result == SC_COPY_RUN_CANCELLED) { - app->status = "Copy cancelled; temporary file removed."; - sc_copy_redraw_all(app); - return; - } - if (result == SC_COPY_RUN_SKIPPED) { - app->status = "Copy skipped; existing target was not changed."; - sc_copy_redraw_all(app); - return; - } - - if (sc_panel_refresh(target) != 0) { - app->status = "File copied, but passive panel refresh failed."; - } else { - char *out = sc_copy_status_text; - out = sc_copy_status_append(out, "Copied "); - out = sc_copy_status_append(out, entry.name); - (void)sc_copy_status_append(out, " to the passive panel."); - app->status = sc_copy_status_text; - } - sc_copy_redraw_all(app); -} diff --git a/applications/Volkov/src/sc_dialog.c b/applications/Volkov/src/sc_dialog.c deleted file mode 100644 index 6441689..0000000 --- a/applications/Volkov/src/sc_dialog.c +++ /dev/null @@ -1,169 +0,0 @@ -/* sc_dialog.c — единая модальная поверхность сообщений Commander. */ - -#include -#include -#include "sc_app.h" -#include "sc_glyphs.h" -#include "sc_input.h" -#include "sc_screen.h" -#include "sc_theme.h" - -#define DIALOG_X 18u -#define DIALOG_Y 11u -#define DIALOG_W 44u -#define DIALOG_H 8u - -static void sc_dialog_box(const char *title, const char *message, - const char *buttons) -{ - uint8_t x; - uint8_t y; - uint8_t right = (uint8_t)(DIALOG_X + DIALOG_W - 1u); - uint8_t bottom = (uint8_t)(DIALOG_Y + DIALOG_H - 1u); - - for (y = DIALOG_Y; y <= bottom; y++) { - sc_screen_fill(DIALOG_X, y, DIALOG_W, ' ', SC_ATTR_DIALOG); - } - sc_screen_cell(DIALOG_X, DIALOG_Y, SC_G_TL, SC_ATTR_DIALOG); - sc_screen_cell(right, DIALOG_Y, SC_G_TR, SC_ATTR_DIALOG); - sc_screen_cell(DIALOG_X, bottom, SC_G_BL, SC_ATTR_DIALOG); - sc_screen_cell(right, bottom, SC_G_BR, SC_ATTR_DIALOG); - for (x = (uint8_t)(DIALOG_X + 1u); x < right; x++) { - sc_screen_cell(x, DIALOG_Y, SC_G_H, SC_ATTR_DIALOG); - sc_screen_cell(x, bottom, SC_G_H, SC_ATTR_DIALOG); - } - for (y = (uint8_t)(DIALOG_Y + 1u); y < bottom; y++) { - sc_screen_cell(DIALOG_X, y, SC_G_V, SC_ATTR_DIALOG); - sc_screen_cell(right, y, SC_G_V, SC_ATTR_DIALOG); - } - sc_screen_text((uint8_t)(DIALOG_X + 3u), DIALOG_Y, title, - SC_ATTR_DIALOG, 34u); - sc_screen_text((uint8_t)(DIALOG_X + 3u), (uint8_t)(DIALOG_Y + 3u), - message, SC_ATTR_DIALOG, 38u); - sc_screen_text((uint8_t)(DIALOG_X + 3u), (uint8_t)(DIALOG_Y + 5u), - buttons, SC_ATTR_DIALOG, 38u); - (void)sc_screen_present_full(); -} - -uint8_t sc_dialog_confirm(const char *title, const char *message) __banked -{ - ScKeyEvent event; - - sc_dialog_box(title, message, "Y/Enter = yes N/Esc = no"); - for (;;) { - sc_input_read(&event); - if (event.ascii == 'y' || event.ascii == 'Y' || - event.ascii == 0x0Du) return 1u; - if (event.ascii == 'n' || event.ascii == 'N' || - event.ascii == 0x1Bu) return 0u; - } -} - -uint8_t sc_dialog_confirm_quit(void) __banked -{ - return sc_dialog_confirm(" Exit Commander ", - "Leave Sprinter Commander?"); -} - -void sc_dialog_message(const char *title, const char *message) __banked -{ - ScKeyEvent event; - - sc_dialog_box(title, message, "Enter/Esc = close"); - for (;;) { - sc_input_read(&event); - if (event.ascii == 0x0Du || event.ascii == 0x1Bu) return; - } -} - -uint8_t sc_dialog_choice(const char *title, const char *message, - const char *keys, const char *buttons) __banked -{ - ScKeyEvent event; - const char *scan; - uint8_t key; - - sc_dialog_box(title, message, buttons); - for (;;) { - sc_input_read(&event); - if (event.ascii == 0x1Bu) return 0u; - key = event.ascii; - if (key >= 'a' && key <= 'z') key -= (uint8_t)('a' - 'A'); - scan = keys; - while (*scan != '\0') { - if ((uint8_t)*scan++ == key) return key; - } - } -} - -static void sc_dialog_input_row(const char *buffer, uint8_t cursor) -{ - uint8_t length = 0u; - - while (buffer[length] != '\0' && length < 38u) length++; - sc_screen_fill((uint8_t)(DIALOG_X + 3u), - (uint8_t)(DIALOG_Y + 4u), 38u, ' ', SC_ATTR_ACTIVE); - sc_screen_text((uint8_t)(DIALOG_X + 3u), - (uint8_t)(DIALOG_Y + 4u), buffer, - SC_ATTR_ACTIVE, 38u); - sc_screen_cell((uint8_t)(DIALOG_X + 3u + cursor), - (uint8_t)(DIALOG_Y + 4u), - cursor < length ? (uint8_t)buffer[cursor] : ' ', - SC_ATTR_DIALOG); - (void)sc_screen_present_row((uint8_t)(DIALOG_X + 3u), - (uint8_t)(DIALOG_Y + 4u), 38u); -} - -uint8_t sc_dialog_input(const char *title, const char *prompt, - char *buffer, uint8_t capacity) __banked -{ - ScKeyEvent event; - uint8_t length = 0u; - uint8_t cursor; - uint8_t limit; - uint8_t i; - - if (!buffer || capacity < 2u) return 0u; - limit = (uint8_t)(capacity - 1u); - if (limit > 37u) limit = 37u; - while (buffer[length] != '\0' && length < limit) length++; - buffer[length] = '\0'; - cursor = length; - - sc_dialog_box(title, prompt, "Enter = apply Esc = cancel"); - sc_dialog_input_row(buffer, cursor); - for (;;) { - sc_input_read(&event); - if (event.ascii == 0x0Du) return 1u; - if (event.ascii == 0x1Bu) return 0u; - - if (event.ascii == 0x08u) { - if (cursor != 0u) { - cursor--; - for (i = cursor; i < length; i++) buffer[i] = buffer[i + 1u]; - length--; - } - } else if (event.ascii >= 0x20u && event.ascii != 0x7Fu) { - if (length < limit) { - i = length; - while (i > cursor) { - buffer[i] = buffer[i - 1u]; - i--; - } - buffer[cursor++] = (char)event.ascii; - length++; - buffer[length] = '\0'; - } - } else if (event.ascii == 0u) { - if (event.scan == KEY_LEFT && cursor != 0u) cursor--; - else if (event.scan == KEY_RIGHT && cursor < length) cursor++; - else if (event.scan == KEY_HOME) cursor = 0u; - else if (event.scan == KEY_END) cursor = length; - else if (event.scan == KEY_DEL && cursor < length) { - for (i = cursor; i < length; i++) buffer[i] = buffer[i + 1u]; - length--; - } - } - sc_dialog_input_row(buffer, cursor); - } -} diff --git a/applications/Volkov/src/sc_disk.c b/applications/Volkov/src/sc_disk.c deleted file mode 100644 index c9b9eb0..0000000 --- a/applications/Volkov/src/sc_disk.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * sc_disk.c — preflight свободного места через ESTEX DSKINFO ($03). - * - * DSS 1.71 возвращает free clusters как DE':DE, bytes/sector в BC и - * sectors/cluster в A. Raw-leaf сохраняет обе половины shadow-регистров; - * C-обвязка сравнивает кластеры без округления размера вниз. - */ - -#include -#include -#include -#include "sc_disk.h" - -typedef struct { - uint32_t free_clusters; - uint16_t bytes_per_sector; - uint8_t sectors_per_cluster; -} ScDiskInfo; - -static ScDiskInfo sc_disk_raw_info; - -static int sc_disk_info_raw(uint8_t disk) __naked -{ - (void)disk; - __asm - ;; __sdcccall(1): disk в A. - push ix - ld b, #1 ; DSS 1.71: пересчитать free clusters - ld c, #0x03 ; ESTEX DSKINFO - rst #0x10 - jr c, _sc_disk_info_error - ld (_sc_disk_raw_info + 0), de - exx - ld (_sc_disk_raw_info + 2), de - exx - ld (_sc_disk_raw_info + 4), bc - ld (_sc_disk_raw_info + 6), a - pop ix - ld de, #0 - ret - _sc_disk_info_error: - pop ix - call __errno_set - ld de, #-1 - ret - __endasm; -} - -int sc_disk_has_space(const char *path, uint32_t bytes) __banked -{ - uint32_t cluster_bytes; - uint32_t required_clusters; - uint8_t disk; - uint8_t first; - - if (!path) { - errno = EINVAL; - return -1; - } - if (path[0] != '\0' && path[1] == ':') { - first = (uint8_t)path[0]; - if (first >= 'a' && first <= 'z') first -= (uint8_t)('a' - 'A'); - if (first < 'A' || first > 'Z') { - errno = ENODRV; - return -1; - } - disk = (uint8_t)(first - 'A'); - } else { - disk = getdisk(); - } - if (sc_disk_info_raw(disk) != 0) return -1; - if (bytes == 0ul) return 1; - cluster_bytes = (uint32_t)sc_disk_raw_info.bytes_per_sector * - (uint32_t)sc_disk_raw_info.sectors_per_cluster; - if (cluster_bytes == 0ul) { - errno = EMEDIA; - return -1; - } - required_clusters = bytes / cluster_bytes; - if (bytes % cluster_bytes != 0ul) required_clusters++; - return sc_disk_raw_info.free_clusters >= required_clusters ? 1 : 0; -} diff --git a/applications/Volkov/src/sc_draw.c b/applications/Volkov/src/sc_draw.c deleted file mode 100644 index 5db628c..0000000 --- a/applications/Volkov/src/sc_draw.c +++ /dev/null @@ -1,358 +0,0 @@ -/* sc_draw.c — renderer двух независимых файловых панелей, не знающий ESTEX. */ - -#include -#include -#include "sc_app.h" -#include "sc_glyphs.h" -#include "sc_screen.h" -#include "sc_store.h" -#include "sc_theme.h" - -#define PANEL_W 40u -#define PANEL_INNER_W 38u -#define PANEL_TOP 0u -#define PANEL_FIRST 1u -#define PANEL_BOTTOM 28u - -/* Стандартный профиль 1.0: отдельный цвет только для точного `.EXE`. */ -static uint8_t sc_draw_is_exe(const char *name) -{ - const char *extension = 0; - - while (*name != '\0') { - if (*name == '.') extension = name + 1; - name++; - } - if (extension == 0) return 0u; - return (uint8_t)((extension[0] == 'E' || extension[0] == 'e') && - (extension[1] == 'X' || extension[1] == 'x') && - (extension[2] == 'E' || extension[2] == 'e') && - extension[3] == '\0'); -} - -static void sc_draw_dec3(uint8_t x, uint8_t y, uint16_t value, - uint8_t attr) -{ - sc_screen_cell(x, y, (uint8_t)('0' + (value / 100u) % 10u), attr); - sc_screen_cell((uint8_t)(x + 1u), y, - (uint8_t)('0' + (value / 10u) % 10u), attr); - sc_screen_cell((uint8_t)(x + 2u), y, - (uint8_t)('0' + value % 10u), attr); -} - -static void sc_draw_dec5(uint8_t x, uint8_t y, uint16_t value, - uint8_t attr) -{ - uint16_t divisor = 10000u; - uint8_t i; - for (i = 0u; i < 5u; i++) { - sc_screen_cell((uint8_t)(x + i), y, - (uint8_t)('0' + (value / divisor) % 10u), attr); - divisor /= 10u; - } -} - -static void sc_draw_dec2(uint8_t x, uint8_t y, uint8_t value, - uint8_t attr) -{ - sc_screen_cell(x, y, (uint8_t)('0' + (value / 10u) % 10u), attr); - sc_screen_cell((uint8_t)(x + 1u), y, - (uint8_t)('0' + value % 10u), attr); -} - -static void sc_draw_dec4(uint8_t x, uint8_t y, uint16_t value, - uint8_t attr) -{ - uint16_t divisor = 1000u; - uint8_t i; - for (i = 0u; i < 4u; i++) { - sc_screen_cell((uint8_t)(x + i), y, - (uint8_t)('0' + (value / divisor) % 10u), attr); - divisor /= 10u; - } -} - -static void sc_draw_u32_right(uint8_t x, uint8_t y, uint32_t value, - uint8_t width, uint8_t attr) -{ - uint8_t i; - for (i = 0u; i < width; i++) { - uint8_t pos = (uint8_t)(width - i - 1u); - uint8_t ch = (uint8_t)('0' + (uint8_t)(value % 10ul)); - sc_screen_cell((uint8_t)(x + pos), y, ch, attr); - value /= 10ul; - if (value == 0ul) { - while (pos != 0u) { - pos--; - sc_screen_cell((uint8_t)(x + pos), y, ' ', attr); - } - break; - } - } -} - -static void sc_draw_path_tail(uint8_t x, uint8_t y, const char *path, - uint8_t width, uint8_t attr) -{ - uint16_t length = 0u; - const char *shown = path; - - while (path[length] != '\0') length++; - if (length > width) { - shown = &path[length - width + 1u]; - sc_screen_cell(x, y, '<', attr); - sc_screen_text((uint8_t)(x + 1u), y, shown, attr, - (uint8_t)(width - 1u)); - } else { - sc_screen_text(x, y, shown, attr, width); - } -} - -static void sc_draw_date(uint8_t x, uint8_t y, uint16_t date, uint8_t attr) -{ - uint16_t year = (uint16_t)(1980u + (date >> 9)); - uint8_t month = (uint8_t)((date >> 5) & 0x0Fu); - uint8_t day = (uint8_t)(date & 0x1Fu); - - if (date == 0u) { - sc_screen_text(x, y, "----------", attr, 10u); - return; - } - sc_draw_dec4(x, y, year, attr); - sc_screen_cell((uint8_t)(x + 4u), y, '-', attr); - sc_draw_dec2((uint8_t)(x + 5u), y, month, attr); - sc_screen_cell((uint8_t)(x + 7u), y, '-', attr); - sc_draw_dec2((uint8_t)(x + 8u), y, day, attr); -} - -static void sc_draw_time(uint8_t x, uint8_t y, uint16_t time, uint8_t attr) -{ - sc_draw_dec2(x, y, (uint8_t)(time >> 11), attr); - sc_screen_cell((uint8_t)(x + 2u), y, ':', attr); - sc_draw_dec2((uint8_t)(x + 3u), y, - (uint8_t)((time >> 5) & 0x3Fu), attr); -} - -static void sc_draw_frame(uint8_t left) -{ - uint8_t y; - uint8_t right = (uint8_t)(left + PANEL_W - 1u); - - sc_screen_cell(left, PANEL_TOP, SC_G_TL, SC_ATTR_FRAME); - sc_screen_fill((uint8_t)(left + 1u), PANEL_TOP, PANEL_INNER_W, - SC_G_H, SC_ATTR_FRAME); - sc_screen_cell(right, PANEL_TOP, SC_G_TR, SC_ATTR_FRAME); - for (y = PANEL_FIRST; y < PANEL_BOTTOM; y++) { - sc_screen_cell(left, y, SC_G_V, SC_ATTR_FRAME); - sc_screen_cell(right, y, SC_G_V, SC_ATTR_FRAME); - } - sc_screen_cell(left, PANEL_BOTTOM, SC_G_BL, SC_ATTR_FRAME); - sc_screen_fill((uint8_t)(left + 1u), PANEL_BOTTOM, PANEL_INNER_W, - SC_G_H, SC_ATTR_FRAME); - sc_screen_cell(right, PANEL_BOTTOM, SC_G_BR, SC_ATTR_FRAME); -} - -static void sc_draw_title(const ScApp *app, uint8_t panel_index) -{ - uint8_t left = panel_index ? 40u : 0u; - const ScPanel *panel = &app->panels[panel_index]; - - sc_screen_cell((uint8_t)(left + 2u), 0u, - panel_index ? 'R' : 'L', SC_ATTR_TITLE); - sc_draw_path_tail((uint8_t)(left + 4u), 0u, panel->path, - 23u, SC_ATTR_TITLE); - if (app->active_panel == panel_index) { - sc_screen_text((uint8_t)(left + 29u), 0u, "[ACTIVE]", - SC_ATTR_ACTIVE, 8u); - } else { - sc_screen_text((uint8_t)(left + 29u), 0u, "passive ", - SC_ATTR_NORMAL, 9u); - } -} - -static void sc_draw_sort_mode(uint8_t left, const ScPanel *panel) -{ - uint8_t key; - - switch (panel->sort_key) { - case SC_SORT_EXTENSION: key = 'E'; break; - case SC_SORT_SIZE: key = 'S'; break; - case SC_SORT_DATE: key = 'D'; break; - default: key = 'N'; break; - } - sc_screen_cell((uint8_t)(left + 3u), PANEL_BOTTOM, key, SC_ATTR_TITLE); - sc_screen_cell((uint8_t)(left + 4u), PANEL_BOTTOM, - panel->sort_descending ? '-' : '+', SC_ATTR_TITLE); -} - -static void sc_draw_panel_footer(uint8_t left, const ScPanel *panel) -{ - if (panel->selected_count != 0u) { - /* Footer выбора — цельная строка, а не подписи поверх линии рамки. */ - sc_screen_fill((uint8_t)(left + 2u), PANEL_BOTTOM, - 36u, ' ', SC_ATTR_TITLE); - } - sc_draw_sort_mode(left, panel); - if (panel->selected_count != 0u) { - sc_draw_u32_right((uint8_t)(left + 6u), PANEL_BOTTOM, - panel->selected_size, 10u, SC_ATTR_TITLE); - sc_screen_text((uint8_t)(left + 17u), PANEL_BOTTOM, - "bytes in", SC_ATTR_TITLE, 8u); - sc_draw_dec3((uint8_t)(left + 26u), PANEL_BOTTOM, - panel->selected_count, SC_ATTR_TITLE); - sc_screen_text((uint8_t)(left + 30u), PANEL_BOTTOM, - "selected", SC_ATTR_TITLE, 8u); - } else { - sc_draw_dec3((uint8_t)(left + 14u), PANEL_BOTTOM, - panel->count, SC_ATTR_TITLE); - sc_screen_text((uint8_t)(left + 18u), PANEL_BOTTOM, - panel->truncated ? "entries+" : "entries", - SC_ATTR_TITLE, 8u); - } -} - -void sc_draw_panel_row(const ScApp *app, uint8_t panel_index, - uint8_t row) __banked -{ - const ScPanel *panel = &app->panels[panel_index]; - uint8_t left = panel_index ? 41u : 1u; - uint16_t item = (uint16_t)(panel->top + row); - uint8_t y = (uint8_t)(PANEL_FIRST + row); - uint8_t attr; - ScDirEntry entry; - - if (row >= SC_PANEL_VISIBLE) return; - sc_screen_fill(left, y, PANEL_INNER_W, ' ', SC_ATTR_NORMAL); - if (item >= panel->count) return; - - if (sc_store_get(panel, item, &entry) != 0) { - sc_screen_text((uint8_t)(left + 2u), y, "", - SC_ATTR_DIALOG, 13u); - return; - } - - if (entry.flags & SC_ENTRY_DSS_LIMIT) { - attr = (app->active_panel == panel_index && item == panel->cursor) ? - SC_ATTR_LIMIT_ACTIVE : SC_ATTR_LIMIT; - } else if (app->active_panel == panel_index && item == panel->cursor) { - attr = SC_ATTR_ACTIVE; - } else if (entry.attr & FA_DIREC) { - attr = SC_ATTR_DIR; - } else if (sc_draw_is_exe(entry.name)) { - attr = SC_ATTR_EXE; - } else { - attr = SC_ATTR_FILE; - } - sc_screen_fill(left, y, PANEL_INNER_W, ' ', attr); - - sc_screen_cell(left, y, - (app->active_panel == panel_index && - item == panel->cursor) ? '>' : ' ', - attr); - sc_screen_cell((uint8_t)(left + 1u), y, - (entry.flags & SC_ENTRY_SELECTED) ? '*' : ' ', attr); - sc_screen_text((uint8_t)(left + 2u), y, entry.name, attr, 13u); - if (entry.flags & SC_ENTRY_DSS_LIMIT) { - sc_screen_text((uint8_t)(left + 17u), y, "", attr, 11u); - return; - } - if (entry.attr & FA_DIREC) { - sc_screen_text((uint8_t)(left + 17u), y, "

      ", attr, 5u); - } else { - sc_draw_u32_right((uint8_t)(left + 17u), y, entry.size, 10u, attr); - } - sc_screen_cell((uint8_t)(left + 29u), y, - (entry.attr & FA_RDONLY) ? 'R' : '-', attr); - sc_screen_cell((uint8_t)(left + 30u), y, - (entry.attr & FA_HIDDEN) ? 'H' : '-', attr); - sc_screen_cell((uint8_t)(left + 31u), y, - (entry.attr & FA_SYSTEM) ? 'S' : '-', attr); - sc_screen_cell((uint8_t)(left + 32u), y, - (entry.attr & FA_ARCH) ? 'A' : '-', attr); -} - -void sc_draw_panel_rows(const ScApp *app, uint8_t panel_index) __banked -{ - uint8_t row; - for (row = 0u; row < SC_PANEL_VISIBLE; row++) { - sc_draw_panel_row(app, panel_index, row); - } -} - -void sc_draw_info(const ScApp *app) __banked -{ - const ScPanel *panel = &app->panels[app->active_panel]; - ScDirEntry entry; - - sc_screen_fill(0u, 29u, SC_SCREEN_W, ' ', SC_ATTR_STATUS); - sc_screen_cell(1u, 29u, app->active_panel ? 'R' : 'L', SC_ATTR_STATUS); - sc_draw_dec5(3u, 29u, panel->cursor, SC_ATTR_STATUS); - sc_screen_cell(8u, 29u, '/', SC_ATTR_STATUS); - sc_draw_dec5(9u, 29u, panel->count, SC_ATTR_STATUS); - if (sc_panel_selected(panel, &entry) == 0) { - sc_screen_text(15u, 29u, entry.name, SC_ATTR_STATUS, 13u); - if (entry.flags & SC_ENTRY_DSS_LIMIT) { - sc_screen_text(29u, 29u, "", SC_ATTR_STATUS, 11u); - } else if (entry.attr & FA_DIREC) { - sc_screen_text(29u, 29u, " ", SC_ATTR_STATUS, 10u); - } else { - sc_draw_u32_right(29u, 29u, entry.size, 10u, SC_ATTR_STATUS); - } - if (!(entry.flags & SC_ENTRY_DSS_LIMIT)) { - sc_draw_date(40u, 29u, entry.date, SC_ATTR_STATUS); - sc_draw_time(51u, 29u, entry.time, SC_ATTR_STATUS); - sc_screen_cell(57u, 29u, - (entry.attr & FA_RDONLY) ? 'R' : '-', SC_ATTR_STATUS); - sc_screen_cell(58u, 29u, - (entry.attr & FA_HIDDEN) ? 'H' : '-', SC_ATTR_STATUS); - sc_screen_cell(59u, 29u, - (entry.attr & FA_SYSTEM) ? 'S' : '-', SC_ATTR_STATUS); - sc_screen_cell(60u, 29u, - (entry.attr & FA_ARCH) ? 'A' : '-', SC_ATTR_STATUS); - } - } - sc_screen_text(61u, 29u, - panel->selected_count ? "sel" : "sum", - SC_ATTR_STATUS, 3u); - sc_draw_u32_right(65u, 29u, - panel->selected_count ? panel->selected_size : - panel->total_size, - 10u, SC_ATTR_STATUS); - if (panel->selected_count) { - sc_screen_cell(75u, 29u, '/', SC_ATTR_STATUS); - sc_draw_dec3(76u, 29u, panel->selected_count, SC_ATTR_STATUS); - } - if (panel->truncated) sc_screen_cell(79u, 29u, '+', SC_ATTR_DIALOG); -} - -void sc_draw_status(const ScApp *app) __banked -{ - sc_screen_fill(0u, 30u, SC_SCREEN_W, ' ', SC_ATTR_STATUS); - sc_screen_text(1u, 30u, app->status, SC_ATTR_STATUS, 78u); -} - -static void sc_draw_keys(void) -{ - sc_screen_fill(0u, 31u, SC_SCREEN_W, ' ', SC_ATTR_KEYS); - sc_screen_text(0u, 31u, - "1 Help 2 Menu 3 View 4 Edit 5 Copy 6 Ren 7 Mkdir 8 Delete9 Menu 10 Quit", - SC_ATTR_KEYS, SC_SCREEN_W); -} - -void sc_draw_all(const ScApp *app) __banked -{ - uint8_t p; - - sc_screen_clear(SC_ATTR_NORMAL); - for (p = 0u; p < SC_PANEL_COUNT; p++) { - const ScPanel *panel = &app->panels[p]; - uint8_t left = p ? 40u : 0u; - sc_draw_frame(p ? 40u : 0u); - sc_draw_title(app, p); - sc_draw_panel_rows(app, p); - sc_draw_panel_footer(left, panel); - } - sc_draw_info(app); - sc_draw_status(app); - sc_draw_keys(); -} diff --git a/applications/Volkov/src/sc_exec_ui.c b/applications/Volkov/src/sc_exec_ui.c deleted file mode 100644 index 82c39ca..0000000 --- a/applications/Volkov/src/sc_exec_ui.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * sc_exec_ui.c — запуск EXE из панели и полное восстановление UI. - * - * EXEC синхронен. Пока copy-job не активен, его строковые поля служат - * scratch-буферами пути запуска и сохранённого CWD; это экономит 512 байт - * W2 и безопасно, потому что диспетчер Commander не выполняет jobs параллельно. - */ - -#include -#include -#include -#include -#include -#include "sc_app.h" -#include "sc_exec.h" -#include "sc_exec_ui.h" -#include "sc_path.h" -#include "sc_screen.h" -#include "sc_theme.h" -#include "sc_video.h" - -static char sc_exec_status_text[79]; - -static void sc_exec_status_plain(ScApp *app, const char *text) -{ - char *out = sc_exec_status_text; - char *limit = sc_exec_status_text + sizeof(sc_exec_status_text) - 1u; - - while (*text != '\0' && out < limit) *out++ = *text++; - *out = '\0'; - app->status = sc_exec_status_text; -} - -static uint8_t sc_exec_upper(uint8_t ch) -{ - if (ch >= 'a' && ch <= 'z') return (uint8_t)(ch - ('a' - 'A')); - return ch; -} - -static uint8_t sc_exec_is_exe(const char *name) -{ - uint8_t length = 0u; - - while (name[length] != '\0' && length < 12u) length++; - if (length < 4u || name[length - 4u] != '.') return 0u; - return sc_exec_upper((uint8_t)name[length - 3u]) == 'E' && - sc_exec_upper((uint8_t)name[length - 2u]) == 'X' && - sc_exec_upper((uint8_t)name[length - 1u]) == 'E'; -} - -static char *sc_exec_status_append(char *out, const char *text) -{ - char *limit = sc_exec_status_text + sizeof(sc_exec_status_text) - 1u; - - while (*text != '\0' && out < limit) *out++ = *text++; - *out = '\0'; - return out; -} - -static char *sc_exec_status_uint(char *out, uint16_t value) -{ - char digits[5]; - uint8_t count = 0u; - - do { - digits[count++] = (char)('0' + value % 10u); - value /= 10u; - } while (value != 0u); - while (count != 0u) { - char one[2]; - one[0] = digits[--count]; - one[1] = '\0'; - out = sc_exec_status_append(out, one); - } - return out; -} - -static void sc_exec_status_error(ScApp *app, const char *name, int error) -{ - char *out = sc_exec_status_text; - - out = sc_exec_status_append(out, "Cannot execute "); - out = sc_exec_status_append(out, name); - out = sc_exec_status_append(out, " (errno "); - out = sc_exec_status_uint(out, (uint16_t)error); - (void)sc_exec_status_append(out, ")."); - app->status = sc_exec_status_text; -} - -static void sc_exec_status_unsupported(ScApp *app, const char *name) -{ - char *out = sc_exec_status_text; - - out = sc_exec_status_append(out, "Cannot execute "); - out = sc_exec_status_append(out, name); - (void)sc_exec_status_append(out, ": only .EXE files are supported."); - app->status = sc_exec_status_text; -} - -static void sc_exec_status_success(ScApp *app, int exit_code) -{ - static const char hex[] = "0123456789ABCDEF"; - char *out = sc_exec_status_text; - char code[3]; - - code[0] = hex[((uint8_t)exit_code >> 4) & 0x0Fu]; - code[1] = hex[(uint8_t)exit_code & 0x0Fu]; - code[2] = '\0'; - out = sc_exec_status_append(out, "Program returned "); - out = sc_exec_status_append(out, code); - (void)sc_exec_status_append(out, "; screen, CWD and panels restored."); - app->status = sc_exec_status_text; -} - -static void sc_exec_redraw(ScApp *app) -{ - sc_draw_all(app); - (void)sc_screen_present_full(); -} - -void sc_exec_selected(ScApp *app) __banked -{ - ScPanel *panel = &app->panels[app->active_panel]; - ScDirEntry entry; - ScCopyJob *scratch = &app->copy_job; - uint8_t saved_drive; - int exit_code; - int exec_errno = 0; - int restore_errno = 0; - int video_errno = 0; - int refresh_errno = 0; - uint8_t i; - - if (sc_panel_selected(panel, &entry) != 0 || - (entry.attr & FA_DIREC) != 0u || - (entry.flags & SC_ENTRY_DSS_LIMIT) != 0u) { - sc_exec_status_plain(app, - "Cannot execute: the selected entry is not a file."); - sc_exec_redraw(app); - return; - } - if (!sc_exec_is_exe(entry.name)) { - sc_exec_status_unsupported(app, entry.name); - sc_exec_redraw(app); - return; - } - if (scratch->state == SC_COPY_RUNNING) { - sc_exec_status_plain(app, - "Cannot execute while a copy job is active."); - sc_exec_redraw(app); - return; - } - - saved_drive = getdisk(); - if (!getcwd(scratch->target_path, SC_COPY_PATH_CAPACITY) || - sc_path_join(scratch->source_path, SC_COPY_PATH_CAPACITY, - panel->path, entry.name) != 0) { - sc_exec_status_error(app, entry.name, errno); - sc_exec_redraw(app); - return; - } - - /* Как в классическом Commander, child получает каталог активной панели - * текущим. Это позволяет утилитам без argv открывать соседние файлы. - * Полный путь EXE уже построен; исходный CWD восстановится после EXEC. */ - if (chdir(panel->path) != 0) { - sc_exec_status_error(app, entry.name, errno); - sc_exec_redraw(app); - return; - } - - sc_exec_status_plain(app, - "Starting selected EXE; Commander state is preserved."); - sc_draw_status(app); - (void)sc_screen_present_rows(30u, 1u); - - errno = 0; - exit_code = sc_platform_exec(scratch->source_path); - if (exit_code < 0) exec_errno = errno; - - if (setdisk(saved_drive) < 0) { - restore_errno = errno; - } else if (chdir(scratch->target_path) != 0) { - restore_errno = errno; - } - if (sc_video_restore() != 0) video_errno = errno; - sc_theme_reapply(); - - for (i = 0u; i < SC_PANEL_COUNT; i++) { - if (sc_panel_refresh(&app->panels[i]) != 0 && refresh_errno == 0) { - refresh_errno = errno; - } - } - - if (restore_errno != 0) { - sc_exec_status_error(app, "CWD restore", restore_errno); - } else if (video_errno != 0) { - sc_exec_status_error(app, "video restore", video_errno); - } else if (exit_code < 0) { - sc_exec_status_error(app, entry.name, exec_errno); - } else if (refresh_errno != 0) { - sc_exec_status_error(app, "panel refresh", refresh_errno); - } else { - sc_exec_status_success(app, exit_code); - } - sc_exec_redraw(app); -} diff --git a/applications/Volkov/src/sc_file_ui.c b/applications/Volkov/src/sc_file_ui.c deleted file mode 100644 index ec2139f..0000000 --- a/applications/Volkov/src/sc_file_ui.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * sc_file_ui.c — оркестрация безопасных файловых команд версии 0.2. - * - * F7 принимает только один компонент DOS 8.3, строит полный путь в - * резидентном scratch copy job и не меняет глобальный CWD DSS. - */ - -#include -#include -#include -#include -#include "sc_file_ui.h" -#include "sc_file_ops.h" -#include "sc_input.h" -#include "sc_path.h" -#include "sc_screen.h" -#include "sc_store.h" -#include "sc_tree.h" - -#define SC_DELETE_TREE_ERROR (-1) -#define SC_DELETE_TREE_DONE 0 -#define SC_DELETE_TREE_CANCELLED 1 -#define SC_DELETE_DSS_LIMIT 35 - -static void sc_file_redraw(ScApp *app) -{ - sc_draw_all(app); - (void)sc_screen_present_full(); -} - -static uint8_t sc_file_upper(uint8_t ch) -{ - if (ch >= 'a' && ch <= 'z') return (uint8_t)(ch - ('a' - 'A')); - return ch; -} - -static uint8_t sc_file_same_name(const char *left, const char *right) -{ - while (*left != '\0' && *right != '\0') { - if (sc_file_upper((uint8_t)*left) != - sc_file_upper((uint8_t)*right)) return 0u; - left++; - right++; - } - return *left == *right; -} - -static void sc_file_copy_name(char *target, const char *source) -{ - uint8_t i = 0u; - while (i < 12u && source[i] != '\0') { - target[i] = source[i]; - i++; - } - target[i] = '\0'; -} - -static void sc_file_focus_name(ScPanel *panel, const char *name) -{ - ScDirEntry entry; - uint16_t i; - - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) break; - if (sc_file_same_name(entry.name, name)) { - panel->cursor = i; - sc_panel_normalize_view(panel); - return; - } - } -} - -void sc_mkdir_command(ScApp *app) __banked -{ - ScPanel *panel = &app->panels[app->active_panel]; - char *name = app->copy_job.source_path; - char *path = app->copy_job.target_path; - - name[0] = '\0'; - if (!sc_dialog_input(" Make directory ", "New DOS 8.3 name:", - name, 13u)) { - app->status = "Create directory cancelled."; - sc_file_redraw(app); - return; - } - if (sc_path_validate_component(name) != 0 || - sc_path_join(path, SC_COPY_PATH_CAPACITY, panel->path, name) != 0) { - app->status = "Invalid directory name; one DOS 8.3 component required."; - sc_file_redraw(app); - return; - } - - errno = 0; - if (mkdir(path) != 0) { - app->status = (errno == EEXIST || errno == EISDIR) ? - "Cannot create directory: it already exists." : - "Cannot create directory; DSS rejected the request."; - sc_file_redraw(app); - return; - } - - if (sc_panel_refresh(panel) != 0) { - app->status = "Directory created, but panel refresh failed."; - } else { - app->status = "Directory created; active panel refreshed."; - } - sc_file_redraw(app); -} - -void sc_rename_command(ScApp *app) __banked -{ - ScPanel *panel = &app->panels[app->active_panel]; - ScDirEntry entry; - char *new_name = app->copy_job.source_path; - int result; - int saved_errno; - - if (sc_panel_selected(panel, &entry) != 0 || - (entry.flags & (SC_ENTRY_PARENT | SC_ENTRY_DSS_LIMIT))) { - app->status = "This virtual entry cannot be renamed."; - sc_file_redraw(app); - return; - } - if (panel->selected_count != 0u && - !(panel->selected_count == 1u && - (entry.flags & SC_ENTRY_SELECTED))) { - app->status = "Group move/rename is not implemented yet."; - sc_file_redraw(app); - return; - } - - sc_file_copy_name(new_name, entry.name); - if (!sc_dialog_input(" Rename ", "New DOS 8.3 name:", - new_name, 13u)) { - app->status = "Rename cancelled."; - sc_file_redraw(app); - return; - } - if (sc_path_validate_component(new_name) != 0) { - app->status = "Invalid name; one DOS 8.3 component required."; - sc_file_redraw(app); - return; - } - if (sc_file_same_name(entry.name, new_name)) { - app->status = "Rename skipped: the name is unchanged."; - sc_file_redraw(app); - return; - } - - errno = 0; - result = sc_rename_local(panel->path, entry.name, new_name, - app->copy_job.temp_path, - SC_COPY_PATH_CAPACITY); - saved_errno = errno; - if (result == -2) { - app->status = "Rename attempted, but DSS CWD restore failed."; - sc_file_redraw(app); - return; - } - if (result != 0) { - app->status = (saved_errno == EEXIST || saved_errno == EISDIR) ? - "Cannot rename: target already exists." : - "Cannot rename; DSS rejected the request."; - sc_file_redraw(app); - return; - } - - if (sc_panel_refresh(panel) != 0) { - app->status = "Renamed, but panel refresh failed."; - } else { - sc_file_focus_name(panel, new_name); - app->status = "Renamed in active directory."; - } - sc_file_redraw(app); -} - -static int sc_file_count_selected(const ScPanel *panel, - uint16_t *files, - uint16_t *directories) -{ - ScDirEntry entry; - uint16_t i; - - *files = 0u; - *directories = 0u; - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) return -1; - if (!(entry.flags & SC_ENTRY_SELECTED)) continue; - if (entry.attr & FA_DIREC) (*directories)++; - else if (!(entry.flags & SC_ENTRY_DSS_LIMIT)) (*files)++; - } - return 0; -} - -static void sc_file_redraw_info(ScApp *app) -{ - sc_draw_info(app); - sc_draw_status(app); - (void)sc_screen_present_rows(29u, 2u); -} - -static int sc_delete_tree(ScApp *app, ScPanel *panel, - uint16_t *deleted_files, - uint16_t *deleted_directories, - int *operation_error) -{ - ScTreeJob tree; - ScDirEntry entry; - ScKeyEvent event; - uint16_t i; - int step = SC_TREE_STEP_DONE; - int result = SC_DELETE_TREE_DONE; - - if (sc_tree_begin(&tree, &app->copy_job) != 0) { - *operation_error = errno; - return SC_DELETE_TREE_ERROR; - } - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) { - *operation_error = ENOMEM; - step = SC_TREE_STEP_ERROR; - result = SC_DELETE_TREE_ERROR; - break; - } - if (!(entry.flags & SC_ENTRY_SELECTED) || - !(entry.attr & FA_DIREC) || - (entry.flags & (SC_ENTRY_PARENT | SC_ENTRY_DSS_LIMIT))) continue; - if (sc_tree_add_delete_root(&tree, entry.name) != 0) { - *operation_error = errno; - step = SC_TREE_STEP_ERROR; - result = SC_DELETE_TREE_ERROR; - break; - } - } - - while (step != SC_TREE_STEP_ERROR) { - if (sc_input_poll(&event) && event.ascii == 0x1Bu) { - result = SC_DELETE_TREE_CANCELLED; - break; - } - step = sc_tree_delete_next(&tree, &app->copy_job, - panel->path, &entry); - if (step == SC_TREE_STEP_DONE) break; - if (step == SC_TREE_STEP_ERROR) { - *operation_error = tree.error; - result = SC_DELETE_TREE_ERROR; - break; - } - if (step == SC_TREE_STEP_SCAN_DIR) { - app->status = "Scanning directory tree for delete; Esc cancels."; - sc_file_redraw_info(app); - } else if (step == SC_TREE_STEP_FILE) { - if (unlink(app->copy_job.target_path) != 0) { - *operation_error = errno; - result = SC_DELETE_TREE_ERROR; - break; - } - (*deleted_files)++; - } else { - if (rmdir(app->copy_job.target_path) != 0) { - *operation_error = errno; - result = SC_DELETE_TREE_ERROR; - break; - } - (*deleted_directories)++; - } - } - - if (sc_tree_finish(&tree, &app->copy_job) != 0 && - *operation_error == 0) { - *operation_error = errno; - result = SC_DELETE_TREE_ERROR; - } - return result; -} - -static void sc_delete_group(ScApp *app, ScPanel *panel) -{ - ScDirEntry entry; - char *path = app->copy_job.target_path; - uint16_t files; - uint16_t directories; - uint16_t deleted = 0u; - uint16_t deleted_directories = 0u; - uint16_t i; - uint8_t failed = 0u; - uint8_t cancelled = 0u; - int operation_error = 0; - - if (sc_file_count_selected(panel, &files, &directories) != 0) { - app->status = "Group delete failed: EMM access error."; - sc_file_redraw(app); - return; - } - if (files == 0u && directories == 0u) { - app->status = "No real selected entries to delete."; - sc_file_redraw(app); - return; - } - if (!sc_dialog_confirm(" Delete group ", - directories ? - "Delete selected files and trees?" : - "Delete all selected files?")) { - app->status = "Group delete cancelled; nothing changed."; - sc_file_redraw(app); - return; - } - - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) { - failed = 1u; - operation_error = ENOMEM; - break; - } - if (!(entry.flags & SC_ENTRY_SELECTED) || - (entry.attr & FA_DIREC) || - (entry.flags & SC_ENTRY_DSS_LIMIT)) continue; - if (sc_path_join(path, SC_COPY_PATH_CAPACITY, - panel->path, entry.name) != 0) { - failed = 1u; - operation_error = errno; - break; - } - if (unlink(path) != 0) { - failed = 1u; - operation_error = errno; - break; - } - deleted++; - } - - if (!failed && directories != 0u) { - int tree_result = sc_delete_tree(app, panel, &deleted, - &deleted_directories, - &operation_error); - if (tree_result == SC_DELETE_TREE_CANCELLED) cancelled = 1u; - else if (tree_result == SC_DELETE_TREE_ERROR) failed = 1u; - } - - if ((deleted != 0u || deleted_directories != 0u) && - sc_panel_refresh(panel) != 0) { - app->status = "Objects deleted, but panel refresh failed."; - } else if (cancelled) { - app->status = "Recursive delete cancelled; completed changes remain."; - } else if (failed) { - app->status = operation_error == SC_DELETE_DSS_LIMIT ? - "Recursive delete stopped at DSS directory limit; changes remain." : - "Group delete stopped on first error; completed changes remain."; - } else if (directories != 0u) { - app->status = "Selected files and directory trees deleted."; - } else { - app->status = "Selected files deleted."; - } - sc_file_redraw(app); -} - -void sc_delete_command(ScApp *app) __banked -{ - ScPanel *panel = &app->panels[app->active_panel]; - ScDirEntry entry; - char *path = app->copy_job.target_path; - int result; - int saved_errno; - - if (panel->selected_count != 0u) { - sc_delete_group(app, panel); - return; - } - if (sc_panel_selected(panel, &entry) != 0 || - (entry.flags & (SC_ENTRY_PARENT | SC_ENTRY_DSS_LIMIT))) { - app->status = "This virtual entry cannot be deleted."; - sc_file_redraw(app); - return; - } - if (sc_path_join(path, SC_COPY_PATH_CAPACITY, - panel->path, entry.name) != 0) { - app->status = "Cannot build the path to delete."; - sc_file_redraw(app); - return; - } - if (!sc_dialog_confirm(" Delete ", - (entry.attr & FA_DIREC) ? - "Delete this empty directory?" : - "Delete this file?")) { - app->status = "Delete cancelled; nothing changed."; - sc_file_redraw(app); - return; - } - - errno = 0; - result = (entry.attr & FA_DIREC) ? rmdir(path) : unlink(path); - saved_errno = errno; - if (result != 0) { - app->status = (saved_errno == ENOTEMPTY) ? - "Cannot delete: directory is not empty." : - "Cannot delete; DSS rejected the request."; - sc_file_redraw(app); - return; - } - if (sc_panel_refresh(panel) != 0) { - app->status = "Deleted, but panel refresh failed."; - } else { - app->status = (entry.attr & FA_DIREC) ? - "Empty directory deleted." : "File deleted."; - } - sc_file_redraw(app); -} diff --git a/applications/Volkov/src/sc_input.c b/applications/Volkov/src/sc_input.c deleted file mode 100644 index 7d8849d..0000000 --- a/applications/Volkov/src/sc_input.c +++ /dev/null @@ -1,35 +0,0 @@ -/* sc_input.c — нормализация getkey() и live-модификаторов DSS. */ - -#include -#include -#include "sc_input.h" - -static uint8_t sc_compact_modifiers(uint16_t state) -{ - uint8_t result = 0u; - if (state & (KBD_MOD_LSHIFT | KBD_MOD_RSHIFT)) result |= SC_MOD_SHIFT; - if (state & (KBD_MOD_CTRL | KBD_MOD_LCTRL | KBD_MOD_RCTRL)) { - result |= SC_MOD_CTRL; - } - if (state & (KBD_MOD_ALT | KBD_MOD_LALT | KBD_MOD_RALT)) { - result |= SC_MOD_ALT; - } - return result; -} - -void sc_input_read(ScKeyEvent *event) -{ - uint16_t key = getkey(); - uint16_t state = kbd_mod_state(); - - event->ascii = (uint8_t)key; - event->scan = (uint8_t)(key >> 8) & 0x7Fu; - event->modifiers = sc_compact_modifiers(state); -} - -uint8_t sc_input_poll(ScKeyEvent *event) -{ - if (!kbhit()) return 0u; - sc_input_read(event); - return 1u; -} diff --git a/applications/Volkov/src/sc_metadata.c b/applications/Volkov/src/sc_metadata.c deleted file mode 100644 index fbdaf2d..0000000 --- a/applications/Volkov/src/sc_metadata.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * sc_metadata.c — запись FAT date/time и атрибутов через DSS. - * - * PUT_D_T ($18) принимает раскрытые поля даты/времени по открытому handle; - * изменение фиксируется при CLOSE. ATTRIB ($16) вызывается после commit и - * получает полный путь. Оба wrapper сохраняют IX и переводят CF/A в errno. - */ - -#include -#include -#include "sc_metadata.h" - -typedef struct { - uint8_t day; - uint8_t month; - uint16_t year; - uint8_t hour; - uint8_t minute; - uint8_t second; -} ScMetadataDateTime; - -static int sc_metadata_put_raw(uint8_t fd, - const ScMetadataDateTime *value) __naked -{ - (void)fd; - (void)value; - __asm - ;; __sdcccall(1): fd в A, value в DE. - push ix ; IX caller - push af ; handle - push de - pop ix ; IX = value - - ld c, 2 (ix) ; год сначала сохраняем на стеке - ld b, 3 (ix) - push bc - ld d, 0 (ix) ; день - ld e, 1 (ix) ; месяц - ld h, 4 (ix) ; час - ld l, 5 (ix) ; минуты - ld b, 6 (ix) ; секунды - pop ix ; IX = год - pop af ; A = handle - ld c, #0x18 ; ESTEX PUT_D_T - rst #0x10 - jr c, _sc_metadata_put_error - pop ix - ld de, #0 - ret - _sc_metadata_put_error: - pop ix - call __errno_set - ld de, #-1 - ret - __endasm; -} - -int sc_metadata_set_datetime(uint8_t fd, uint16_t date, - uint16_t time) __banked -{ - ScMetadataDateTime value; - - value.day = (uint8_t)(date & 0x1Fu); - value.month = (uint8_t)((date >> 5) & 0x0Fu); - value.year = (uint16_t)(1980u + (date >> 9)); - value.hour = (uint8_t)(time >> 11); - value.minute = (uint8_t)((time >> 5) & 0x3Fu); - value.second = (uint8_t)((time & 0x1Fu) << 1); - - if (value.day == 0u || value.month == 0u || value.month > 12u || - value.hour > 23u || value.minute > 59u || value.second > 59u) { - errno = EINVAL; - return -1; - } - return sc_metadata_put_raw(fd, &value); -} - -static int sc_metadata_attr_raw(const char *path, uint8_t attr) __naked -{ - (void)path; - (void)attr; - __asm - ;; __sdcccall(1): path в HL, 8-битный attr в [SP+2]. - ld iy, #2 - add iy, sp - ld a, 0 (iy) - push ix - and #0x27 ; readonly/hidden/system/archive - ld b, #1 ; SET - ld c, #0x16 ; ESTEX ATTRIB - rst #0x10 - pop ix - pop hl ; адрес возврата - inc sp ; снять однобайтовый attr - jr c, _sc_metadata_attr_raw_error - ld de, #0 - jp (hl) - _sc_metadata_attr_raw_error: - call __errno_set - ld de, #-1 - jp (hl) - __endasm; -} - -static int sc_metadata_attr_get_raw(const char *path, - uint8_t *attr) __naked -{ - (void)path; - (void)attr; - __asm - ;; __sdcccall(1): path в HL, attr в DE. DSS клобберит регистры, - ;; поэтому near-указатель переживает RST на стеке. - push ix - push de - ld b, #0 ; GET - ld c, #0x16 ; ESTEX ATTRIB - rst #0x10 - pop de - pop ix - jr c, _sc_metadata_attr_get_error - ld (de), a - ld de, #0 - ret - _sc_metadata_attr_get_error: - call __errno_set - ld de, #-1 - ret - __endasm; -} - -int sc_metadata_get_attributes(const char *path, uint8_t *attr) __banked -{ - if (!path || !attr) { - errno = EINVAL; - return -1; - } - return sc_metadata_attr_get_raw(path, attr); -} - -int sc_metadata_set_attributes(const char *path, uint8_t attr) __banked -{ - return sc_metadata_attr_raw(path, (uint8_t)(attr & 0x27u)); -} diff --git a/applications/Volkov/src/sc_name.c b/applications/Volkov/src/sc_name.c deleted file mode 100644 index e6730cd..0000000 --- a/applications/Volkov/src/sc_name.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * sc_name.c — строгая проверка одного пользовательского компонента DOS 8.3. - * - * Разделители, wildcard и неоднозначные `.`/`..` запрещены до вызова DSS; - * CP866-байты 80h..FFh разрешены как буквы имени. - */ - -#include -#include -#include "sc_path.h" - -static uint8_t sc_name_char(uint8_t ch) -{ - if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || - (ch >= '0' && ch <= '9') || ch >= 0x80u) return 1u; - switch (ch) { - case '_': case '-': case '$': case '~': case '!': case '#': - case '%': case '&': case '\'': case '(': case ')': case '@': - case '^': case '`': case '{': case '}': - return 1u; - default: - return 0u; - } -} - -int sc_path_validate_component(const char *name) __banked -{ - uint8_t base = 0u; - uint8_t extension = 0u; - uint8_t have_dot = 0u; - uint8_t ch; - - if (!name || name[0] == '\0') goto invalid; - while ((ch = (uint8_t)*name++) != 0u) { - if (ch == '.') { - if (have_dot || base == 0u) goto invalid; - have_dot = 1u; - } else { - if (!sc_name_char(ch)) goto invalid; - if (have_dot) { - if (++extension > 3u) goto invalid; - } else if (++base > 8u) { - goto invalid; - } - } - } - if (base == 0u || (have_dot && extension == 0u)) goto invalid; - return 0; - -invalid: - errno = EINAME; - return -1; -} diff --git a/applications/Volkov/src/sc_panel.c b/applications/Volkov/src/sc_panel.c deleted file mode 100644 index 49135d7..0000000 --- a/applications/Volkov/src/sc_panel.c +++ /dev/null @@ -1,63 +0,0 @@ -/* sc_panel.c — инварианты панели и переходы по настоящим каталогам. */ - -#include -#include -#include -#include "sc_panel.h" -#include "sc_source.h" -#include "sc_store.h" - -void sc_panel_normalize_view(ScPanel *panel) -{ - if (panel->count == 0u) { - panel->cursor = 0u; - panel->top = 0u; - return; - } - if (panel->cursor >= panel->count) panel->cursor = panel->count - 1u; - if (panel->top > panel->cursor) panel->top = panel->cursor; - if (panel->cursor >= (uint16_t)(panel->top + 27u)) { - panel->top = (uint16_t)(panel->cursor - 26u); - } -} - -int sc_panel_init(ScPanel *panel, uint8_t phys_page) -{ - panel->phys_page = phys_page; - panel->source_kind = SC_SOURCE_REAL_FS; - panel->count = 0u; - panel->cursor = 0u; - panel->top = 0u; - panel->total_size = 0ul; - panel->truncated = 0u; - panel->dirty = 1u; - panel->sort_key = SC_SORT_NAME; - panel->sort_descending = 0u; - if (!getcwd(panel->path, (uint16_t)sizeof(panel->path))) return -1; - return sc_source_fs_scan(panel); -} - -int sc_panel_refresh(ScPanel *panel) -{ - return sc_source_fs_scan(panel); -} - -int sc_panel_selected(const ScPanel *panel, ScDirEntry *entry) -{ - if (panel->count == 0u) return -1; - return sc_store_get(panel, panel->cursor, entry); -} - -int sc_panel_open_selected(ScPanel *panel) -{ - ScDirEntry entry; - if (sc_panel_selected(panel, &entry) != 0) return -1; - if (entry.flags & SC_ENTRY_DSS_LIMIT) return 2; - if (!(entry.attr & FA_DIREC)) return 1; - return sc_source_fs_change_dir(panel, entry.name); -} - -int sc_panel_parent(ScPanel *panel) -{ - return sc_source_fs_change_dir(panel, ".."); -} diff --git a/applications/Volkov/src/sc_path.c b/applications/Volkov/src/sc_path.c deleted file mode 100644 index 16fa04c..0000000 --- a/applications/Volkov/src/sc_path.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * sc_path.c — построение завершённого абсолютного/корневого пути. - * - * Функция не предполагает наличие или отсутствие завершающего `\` у - * каталога и до записи имени проверяет вместимость всего результата. - */ - -#include -#include -#include "sc_path.h" - -int sc_path_join(char *out, uint16_t capacity, - const char *directory, const char *name) -{ - uint16_t dir_len = 0u; - uint16_t name_len = 0u; - uint16_t pos; - uint8_t need_separator; - - if (!out || !directory || !name || capacity == 0u || name[0] == '\0') { - errno = EINVAL; - return -1; - } - while (directory[dir_len] != '\0') dir_len++; - while (name[name_len] != '\0') name_len++; - need_separator = dir_len != 0u && directory[dir_len - 1u] != '\\' && - directory[dir_len - 1u] != '/'; - if (dir_len + (uint16_t)need_separator + name_len + 1u > capacity) { - errno = EINAME; - return -1; - } - - for (pos = 0u; pos < dir_len; pos++) out[pos] = directory[pos]; - if (need_separator) out[pos++] = '\\'; - for (name_len = 0u; name[name_len] != '\0'; name_len++) { - out[pos++] = name[name_len]; - } - out[pos] = '\0'; - return 0; -} diff --git a/applications/Volkov/src/sc_platform_exec.c b/applications/Volkov/src/sc_platform_exec.c deleted file mode 100644 index 8dc9c9f..0000000 --- a/applications/Volkov/src/sc_platform_exec.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * sc_platform_exec.c — минимальная обёртка ESTEX EXEC $40. - * - * Вход: HL = ASCIIZ-путь в W1..W3. B=1 сообщает DSS, что передан явный - * путь. На успехе функция возвращает код завершения 0..255 как int в DE; - * на ошибке — -1 и errno. IX сохраняется согласно ABI SDCC. - */ - -#include -#include "sc_exec.h" - -int sc_platform_exec(const char *path) __naked -{ - (void)path; - __asm - push ix - ld b, #1 - ld c, #0x40 - rst #0x10 - pop ix - jr c, _sc_platform_exec_error - ld e, a - ld d, #0 - ret - _sc_platform_exec_error: - call __errno_set - ld de, #-1 - ret - __endasm; -} diff --git a/applications/Volkov/src/sc_platform_screen.c b/applications/Volkov/src/sc_platform_screen.c deleted file mode 100644 index afc0845..0000000 --- a/applications/Volkov/src/sc_platform_screen.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * sc_platform_screen.c — app-local wrapper ESTEX WINREST 5Ah. - * - * ABI SDCC __sdcccall(1): row в A, col в L, остальные аргументы на стеке. - * IX callee-saved. Источник — физическая EMM-страница B и 0xC000+offset. - */ - -#include -#include "sc_video.h" - -void sc_platform_winrest(uint8_t row, uint8_t col, - uint8_t height, uint8_t width, - uint8_t page, uint16_t offset) __naked -{ - (void)row; - (void)col; - (void)height; - (void)width; - (void)page; - (void)offset; - __asm - ld iy, #2 - add iy, sp - ld d, a - ld e, l - - push ix - ld l, 3 (iy) - ld h, 4 (iy) - ld bc, #0xC000 - add hl, bc - push hl - pop ix - - ld h, 0 (iy) - ld a, 1 (iy) - ld l, a - ld a, 2 (iy) - ld b, a - ld c, #0x5A - di - rst #0x10 - ei - pop ix - - pop hl - inc sp - inc sp - inc sp - inc sp - inc sp - jp (hl) - __endasm; -} diff --git a/applications/Volkov/src/sc_rename.c b/applications/Volkov/src/sc_rename.c deleted file mode 100644 index a6292b7..0000000 --- a/applications/Volkov/src/sc_rename.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * sc_rename.c — локальный RENAME DSS с обязательным возвратом CWD. - * - * DSS 1.71 принимает два basename только относительно текущего каталога. - * Все строки и scratch принадлежат вызывающему W2-коду; банковый модуль не - * публикует указателей на свои данные и не хранит глобального состояния. - */ - -#include -#include -#include -#include -#include -#include "sc_file_ops.h" - -#define SC_RENAME_FIND_ATTRS \ - (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) - -int sc_rename_local(const char *directory, - const char *old_name, - const char *new_name, - char *cwd_buffer, - uint16_t cwd_capacity) __banked -{ - ffblk_t found; - int operation_result; - int operation_errno; - - if (!directory || !old_name || !new_name || !cwd_buffer || - old_name[0] == '\0' || new_name[0] == '\0' || cwd_capacity < 2u) { - errno = EINVAL; - return -1; - } - if (!getcwd(cwd_buffer, cwd_capacity)) return -1; - if (chdir(directory) != 0) return -1; - - errno = 0; - if (ffirst(new_name, &found, SC_RENAME_FIND_ATTRS) == 0) { - operation_result = -1; - operation_errno = EEXIST; - } else if (errno != ENOENT) { - operation_result = -1; - operation_errno = errno; - } else { - errno = 0; - operation_result = rename(old_name, new_name); - operation_errno = errno; - } - if (chdir(cwd_buffer) != 0) return -2; - if (operation_result != 0) { - errno = operation_errno ? operation_errno : EUNKERR; - return -1; - } - return 0; -} diff --git a/applications/Volkov/src/sc_screen.c b/applications/Volkov/src/sc_screen.c deleted file mode 100644 index c921f6e..0000000 --- a/applications/Volkov/src/sc_screen.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * sc_screen.c — единственный владелец экранной EMM-модели. - * - * Указатель 0xC000 существует только внутри короткой операции; исходное - * отображение W3 восстанавливается до возврата вызывающему коду. - */ - -#include -#include -#include -#include "sc_screen.h" -#include "sc_video.h" - -static uint8_t sc_screen_page; -static uint8_t sc_screen_attached; - -static uint16_t sc_cell_offset(uint8_t x, uint8_t y) -{ - return (uint16_t)y * SC_ROW_BYTES + (uint16_t)x * 2u; -} -void sc_screen_attach(uint8_t page) -{ - sc_screen_page = page; - sc_screen_attached = 1u; -} - -void sc_screen_detach(void) -{ - sc_screen_attached = 0u; -} - -void sc_screen_clear(uint8_t attr) -{ - uint8_t saved; - ScCell *cells; - uint16_t i; - - if (!sc_screen_attached) return; - saved = _io_page_w3; - sprinter_page_w3(sc_screen_page); - cells = (ScCell *)0xC000u; - for (i = 0u; i < (uint16_t)SC_SCREEN_W * SC_SCREEN_H; i++) { - cells[i].ch = ' '; - cells[i].attr = attr; - } - sprinter_page_w3(saved); -} - -void sc_screen_cell(uint8_t x, uint8_t y, uint8_t ch, uint8_t attr) -{ - uint8_t saved; - ScCell *cell; - - if (!sc_screen_attached || x >= SC_SCREEN_W || y >= SC_SCREEN_H) return; - saved = _io_page_w3; - sprinter_page_w3(sc_screen_page); - cell = (ScCell *)(0xC000u + sc_cell_offset(x, y)); - cell->ch = ch; - cell->attr = attr; - sprinter_page_w3(saved); -} - -void sc_screen_fill(uint8_t x, uint8_t y, uint8_t width, - uint8_t ch, uint8_t attr) -{ - uint8_t saved; - ScCell *cell; - uint8_t i; - - if (!sc_screen_attached || y >= SC_SCREEN_H || x >= SC_SCREEN_W) return; - if ((uint16_t)x + width > SC_SCREEN_W) width = (uint8_t)(SC_SCREEN_W - x); - - saved = _io_page_w3; - sprinter_page_w3(sc_screen_page); - cell = (ScCell *)(0xC000u + sc_cell_offset(x, y)); - for (i = 0u; i < width; i++) { - cell[i].ch = ch; - cell[i].attr = attr; - } - sprinter_page_w3(saved); -} - -void sc_screen_text(uint8_t x, uint8_t y, const char *text, - uint8_t attr, uint8_t max_width) -{ - uint8_t saved; - ScCell *cell; - uint8_t i = 0u; - - if (!sc_screen_attached || !text || y >= SC_SCREEN_H || - x >= SC_SCREEN_W) return; - if ((uint16_t)x + max_width > SC_SCREEN_W) { - max_width = (uint8_t)(SC_SCREEN_W - x); - } - - saved = _io_page_w3; - sprinter_page_w3(sc_screen_page); - cell = (ScCell *)(0xC000u + sc_cell_offset(x, y)); - while (text[i] && i < max_width) { - cell[i].ch = (uint8_t)text[i]; - cell[i].attr = attr; - i++; - } - sprinter_page_w3(saved); -} - -int sc_screen_present_full(void) -{ - if (!sc_screen_attached) return -1; - return sc_video_present_rect(sc_screen_page, 0u, 0u, 0u, - SC_SCREEN_H, SC_SCREEN_W); -} - -int sc_screen_present_row(uint8_t x, uint8_t y, uint8_t width) -{ - if (!sc_screen_attached || y >= SC_SCREEN_H || x >= SC_SCREEN_W || - width == 0u || (uint16_t)x + width > SC_SCREEN_W) return -1; - return sc_video_present_rect(sc_screen_page, sc_cell_offset(x, y), - y, x, 1u, width); -} - -int sc_screen_present_rows(uint8_t first, uint8_t count) -{ - if (!sc_screen_attached || first >= SC_SCREEN_H || count == 0u || - (uint16_t)first + count > SC_SCREEN_H) return -1; - return sc_video_present_rect(sc_screen_page, - (uint16_t)first * SC_ROW_BYTES, - first, 0u, count, SC_SCREEN_W); -} - -int sc_screen_scroll_rows(uint8_t x, uint8_t y, - uint8_t width, uint8_t height, - uint8_t direction, uint8_t fill_attr) -{ - uint8_t saved; - uint8_t i; - uint8_t j; - ScCell *model; - ScCell *open_row; - - if (!sc_screen_attached || width == 0u || height < 2u || - x >= SC_SCREEN_W || y >= SC_SCREEN_H || - (uint16_t)x + width > SC_SCREEN_W || - (uint16_t)y + height > SC_SCREEN_H || - (direction != SC_SCROLL_UP && direction != SC_SCROLL_DOWN)) return -1; - - saved = _io_page_w3; - sprinter_page_w3(sc_screen_page); - model = (ScCell *)0xC000u; - - if (direction == SC_SCROLL_UP) { - for (i = 0u; i + 1u < height; i++) { - memmove(model + (uint16_t)(y + i) * SC_SCREEN_W + x, - model + (uint16_t)(y + i + 1u) * SC_SCREEN_W + x, - (uint16_t)width * sizeof(ScCell)); - } - open_row = model + (uint16_t)(y + height - 1u) * SC_SCREEN_W + x; - } else { - i = (uint8_t)(height - 1u); - while (i != 0u) { - memmove(model + (uint16_t)(y + i) * SC_SCREEN_W + x, - model + (uint16_t)(y + i - 1u) * SC_SCREEN_W + x, - (uint16_t)width * sizeof(ScCell)); - i--; - } - open_row = model + (uint16_t)y * SC_SCREEN_W + x; - } - - for (j = 0u; j < width; j++) { - open_row[j].ch = ' '; - open_row[j].attr = fill_attr; - } - sprinter_page_w3(saved); - - return sc_video_scroll_rect(y, x, height, width, direction); -} diff --git a/applications/Volkov/src/sc_select.c b/applications/Volkov/src/sc_select.c deleted file mode 100644 index 15b6c7a..0000000 --- a/applications/Volkov/src/sc_select.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * sc_select.c — флаги выбора непосредственно в EMM-store панели. - * - * `..` и виртуальный маркер DSS никогда не выбираются. Insert может - * выбрать каталог, но групповые `+`, `-` и `*` работают только с файлами. - * Размер выбранного каталога пока нулевой; его рекурсивный размер будет считать job. - * Долгоживущих указателей W3 нет. - */ - -#include -#include -#include "sc_select.h" -#include "sc_store.h" - -static uint8_t sc_select_allowed(const ScDirEntry *entry) -{ - return (entry->flags & (SC_ENTRY_PARENT | SC_ENTRY_DSS_LIMIT)) == 0u; -} - -static uint8_t sc_select_group_allowed(const ScDirEntry *entry) -{ - return sc_select_allowed(entry) && !(entry->attr & FA_DIREC); -} - -static uint8_t sc_select_upper(uint8_t ch) -{ - if (ch >= 'a' && ch <= 'z') return (uint8_t)(ch - ('a' - 'A')); - return ch; -} - -static uint8_t sc_select_mask_match(const char *pattern, const char *name) -{ - const char *star = 0; - const char *retry = 0; - - /* DOS `*.*` означает все имена файлов, включая имена без точки. */ - if (pattern[0] == '*' && pattern[1] == '.' && pattern[2] == '*' && - pattern[3] == '\0') pattern = "*"; - - while (*name != '\0') { - if (*pattern == '?' || - sc_select_upper((uint8_t)*pattern) == - sc_select_upper((uint8_t)*name)) { - pattern++; - name++; - } else if (*pattern == '*') { - star = pattern++; - retry = name; - } else if (star) { - pattern = star + 1; - name = ++retry; - } else { - return 0u; - } - } - while (*pattern == '*') pattern++; - return *pattern == '\0'; -} - -static int sc_select_toggle(ScPanel *panel) -{ - ScDirEntry entry; - uint8_t was_selected; - - if (panel->count == 0u || - sc_store_get(panel, panel->cursor, &entry) != 0) return -1; - if (!sc_select_allowed(&entry)) return 1; - - was_selected = (entry.flags & SC_ENTRY_SELECTED) != 0u; - entry.flags ^= SC_ENTRY_SELECTED; - if (sc_store_put(panel, panel->cursor, &entry) != 0) return -1; - - if (was_selected) { - if (panel->selected_count != 0u) panel->selected_count--; - if (!(entry.attr & FA_DIREC)) panel->selected_size -= entry.size; - } else { - panel->selected_count++; - if (!(entry.attr & FA_DIREC)) panel->selected_size += entry.size; - } - - if (panel->cursor + 1u < panel->count) panel->cursor++; - sc_panel_normalize_view(panel); - panel->dirty = 1u; - return 0; -} - -static int sc_select_many(ScPanel *panel, uint8_t action, - const char *mask) -{ - ScDirEntry entry; - uint16_t i; - uint16_t selected_count = 0u; - uint32_t selected_size = 0ul; - - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) return -1; - if (sc_select_group_allowed(&entry)) { - uint8_t old_flags = entry.flags; - if (action == SC_SELECT_INVERT) { - entry.flags ^= SC_ENTRY_SELECTED; - } else if (sc_select_mask_match(mask, entry.name)) { - if (action == SC_SELECT_MASK_SET) { - entry.flags |= SC_ENTRY_SELECTED; - } else { - entry.flags &= (uint8_t)~SC_ENTRY_SELECTED; - } - } - if (entry.flags != old_flags && - sc_store_put(panel, i, &entry) != 0) return -1; - } - if (sc_select_allowed(&entry) && - (entry.flags & SC_ENTRY_SELECTED)) { - selected_count++; - if (!(entry.attr & FA_DIREC)) selected_size += entry.size; - } - } - panel->selected_count = selected_count; - panel->selected_size = selected_size; - panel->dirty = 1u; - return 0; -} - -int sc_select_apply(ScPanel *panel, uint8_t action, - const char *mask) __banked -{ - if (action == SC_SELECT_TOGGLE) return sc_select_toggle(panel); - if (action > SC_SELECT_MASK_CLEAR || - (action != SC_SELECT_INVERT && !mask)) return -1; - return sc_select_many(panel, action, mask); -} diff --git a/applications/Volkov/src/sc_sort.c b/applications/Volkov/src/sc_sort.c deleted file mode 100644 index 87cb77c..0000000 --- a/applications/Volkov/src/sc_sort.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * sc_sort.c — нерекурсивная Shell sort записей непосредственно в EMM. - * Порядок: синтетический `..`, каталоги, файлы, предупреждение о пределе - * DSS. Внутри каталогов и файлов действует независимый режим панели: - * name/ext/size/date и прямое/обратное направление. Callback qsort и - * долгоживущие W3-указатели не нужны. - */ - -#include -#include -#include -#include "sc_sort.h" -#include "sc_store.h" - -static uint8_t sc_ascii_upper(uint8_t ch) -{ - if (ch >= 'a' && ch <= 'z') return (uint8_t)(ch - ('a' - 'A')); - return ch; -} - -static uint8_t sc_entry_group(const ScDirEntry *entry) -{ - if (entry->flags & SC_ENTRY_PARENT) return 0u; - if (entry->flags & SC_ENTRY_DSS_LIMIT) return 3u; - if (entry->attr & FA_DIREC) return 1u; - return 2u; -} - -static int sc_compare_text(const char *left, const char *right) -{ - uint8_t i; - - for (i = 0u; i < 13u; i++) { - uint8_t a = sc_ascii_upper((uint8_t)left[i]); - uint8_t b = sc_ascii_upper((uint8_t)right[i]); - if (a != b) return a < b ? -1 : 1; - if (a == 0u) break; - } - return 0; -} - -static const char *sc_extension(const char *name) -{ - const char *result = &name[12]; - uint8_t i; - - for (i = 0u; i < 13u && name[i] != '\0'; i++) { - if (name[i] == '.') result = &name[i + 1u]; - } - return result; -} - -static int sc_compare_u16(uint16_t left, uint16_t right) -{ - if (left == right) return 0; - return left < right ? -1 : 1; -} - -static int sc_compare_u32(uint32_t left, uint32_t right) -{ - if (left == right) return 0; - return left < right ? -1 : 1; -} - -static int sc_entry_compare(const ScPanel *panel, - const ScDirEntry *left, - const ScDirEntry *right) -{ - uint8_t left_group = sc_entry_group(left); - uint8_t right_group = sc_entry_group(right); - int result = 0; - - if (left_group != right_group) { - return left_group < right_group ? -1 : 1; - } - - switch (panel->sort_key) { - case SC_SORT_EXTENSION: - result = sc_compare_text(sc_extension(left->name), - sc_extension(right->name)); - break; - case SC_SORT_SIZE: - result = sc_compare_u32(left->size, right->size); - break; - case SC_SORT_DATE: - result = sc_compare_u16(left->date, right->date); - if (result == 0) { - result = sc_compare_u16(left->time, right->time); - } - break; - case SC_SORT_NAME: - default: - break; - } - if (result == 0) result = sc_compare_text(left->name, right->name); - return panel->sort_descending ? -result : result; -} - -int sc_sort_panel(ScPanel *panel) __banked -{ - uint16_t gap; - uint16_t i; - uint16_t j; - ScDirEntry moving; - ScDirEntry previous; - - for (gap = (uint16_t)(panel->count / 2u); gap != 0u; gap /= 2u) { - for (i = gap; i < panel->count; i++) { - if (sc_store_get(panel, i, &moving) != 0) return -1; - j = i; - while (j >= gap) { - if (sc_store_get(panel, (uint16_t)(j - gap), - &previous) != 0) return -1; - if (sc_entry_compare(panel, &previous, &moving) <= 0) break; - if (sc_store_put(panel, j, &previous) != 0) return -1; - j = (uint16_t)(j - gap); - } - if (sc_store_put(panel, j, &moving) != 0) return -1; - } - } - return 0; -} - -int sc_sort_set(ScPanel *panel, uint8_t key) __banked -{ - ScDirEntry selected; - ScDirEntry current; - uint8_t have_selection = 0u; - uint8_t old_key = panel->sort_key; - uint8_t old_descending = panel->sort_descending; - uint16_t i; - - if (key > SC_SORT_DATE) return -1; - if (panel->count != 0u && - sc_store_get(panel, panel->cursor, &selected) == 0) { - have_selection = 1u; - } - - if (panel->sort_key == key) { - panel->sort_descending ^= 1u; - } else { - panel->sort_key = key; - panel->sort_descending = 0u; - } - - if (sc_sort_panel(panel) != 0) { - panel->sort_key = old_key; - panel->sort_descending = old_descending; - return -1; - } - - if (have_selection) { - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, ¤t) != 0) return -1; - if (strcmp(current.name, selected.name) == 0) { - panel->cursor = i; - break; - } - } - } - sc_panel_normalize_view(panel); - panel->dirty = 1u; - return 0; -} diff --git a/applications/Volkov/src/sc_source_fs.c b/applications/Volkov/src/sc_source_fs.c deleted file mode 100644 index 1646051..0000000 --- a/applications/Volkov/src/sc_source_fs.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * sc_source_fs.c — чтение каталога DSS в одну EMM-страницу панели. - * - * F_FIRST/F_NEXT используют один общий near-буфер. DSS имеет глобальный CWD, - * поэтому каждый scan/change_dir сохраняет его и восстанавливает до возврата. - */ - -#include -#include -#include -#include -#include -#include "sc_source.h" -#include "sc_sort.h" -#include "sc_store.h" - -#define SC_FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) - -/* DSS 1.71: каталог больше одной 16-КБ страницы завершается этим - * недокументированным в libc кодом. Это не потеря уже прочитанных данных: - * панель принимает частичный список и показывает признак усечения. */ -#define SC_DSS_TOO_MANY_FILES 35 - -/* Один near-буфер обязателен для всей пары F_FIRST/F_NEXT. Его адрес не - * влияет на системный предел DSS и не должен отнимать хвост банка W1. */ -static ffblk_t sc_source_find; -static char sc_source_process_cwd[256]; -static char sc_source_old_path[256]; -static char sc_source_new_path[256]; - -static void sc_copy_string(char *dst, const char *src, uint16_t capacity) -{ - uint16_t i = 0u; - if (capacity == 0u) return; - while (i + 1u < capacity && src[i] != '\0') { - dst[i] = src[i]; - i++; - } - dst[i] = '\0'; -} - -static uint8_t sc_path_is_root(const char *path) -{ - uint16_t i = 0u; - uint8_t separators = 0u; - - if (path[0] == '\\' && path[1] == '\0') return 1u; - if (path[0] != '\0' && path[1] == ':') i = 2u; - for (; path[i] != '\0'; i++) { - if (path[i] == '\\' || path[i] == '/') separators++; - else return 0u; - } - return separators <= 1u; -} - -static uint8_t sc_is_dot_name(const char *name) -{ - return (name[0] == '.' && name[1] == '\0') || - (name[0] == '.' && name[1] == '.' && name[2] == '\0'); -} - -static int sc_source_add_parent(ScPanel *panel) -{ - ScDirEntry entry; - memset(&entry, 0, sizeof(entry)); - entry.name[0] = '.'; - entry.name[1] = '.'; - entry.attr = FA_DIREC; - entry.flags = SC_ENTRY_PARENT; - if (sc_store_put(panel, panel->count, &entry) != 0) return -1; - panel->count++; - return 0; -} - -static int sc_source_add_found(ScPanel *panel) -{ - ScDirEntry entry; - - if (panel->count >= SC_DIR_CAPACITY) { - panel->truncated = 1u; - return 1; - } - memset(&entry, 0, sizeof(entry)); - sc_copy_string(entry.name, sc_source_find.found_name, - (uint16_t)sizeof(entry.name)); - entry.size = sc_source_find.size; - entry.date = sc_source_find.date; - entry.time = sc_source_find.time; - entry.attr = sc_source_find.found_attr; - if (sc_store_put(panel, panel->count, &entry) != 0) return -1; - panel->count++; - if (!(entry.attr & FA_DIREC)) panel->total_size += entry.size; - return 0; -} - -static int sc_source_add_dss_limit(ScPanel *panel) -{ - ScDirEntry entry; - - /* Предупреждение обязано быть видимым. Если будущий DSS когда-нибудь - * вернёт код 35 уже после заполнения нашей страницы, уступаем маркеру - * последнюю строку и корректируем сумму удалённого файла. */ - if (panel->count >= SC_DIR_CAPACITY) { - if (sc_store_get(panel, (uint16_t)(SC_DIR_CAPACITY - 1u), - &entry) != 0) return -1; - if (!(entry.attr & FA_DIREC)) panel->total_size -= entry.size; - panel->count = (uint16_t)(SC_DIR_CAPACITY - 1u); - } - - memset(&entry, 0, sizeof(entry)); - sc_copy_string(entry.name, ">>> MORE...", (uint16_t)sizeof(entry.name)); - entry.flags = SC_ENTRY_DSS_LIMIT; - if (sc_store_put(panel, panel->count, &entry) != 0) return -1; - panel->count++; - panel->truncated = 1u; - return 0; -} - -static void sc_source_restore_selection(ScPanel *panel, - const char *previous_name) -{ - ScDirEntry entry; - uint16_t i; - - if (previous_name[0] == '\0') { - sc_panel_normalize_view(panel); - return; - } - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0) break; - if (strcmp(entry.name, previous_name) == 0) { - panel->cursor = i; - break; - } - } - sc_panel_normalize_view(panel); -} - -int sc_source_fs_scan(ScPanel *panel) __banked -{ - ScDirEntry selected; - char previous_name[13]; - int rc; - int scan_errno = 0; - uint8_t done = 0u; - uint8_t dss_limited = 0u; - - previous_name[0] = '\0'; - if (panel->count != 0u && - sc_store_get(panel, panel->cursor, &selected) == 0) { - sc_copy_string(previous_name, selected.name, - (uint16_t)sizeof(previous_name)); - } - if (!getcwd(sc_source_process_cwd, - (uint16_t)sizeof(sc_source_process_cwd))) return -1; - if (chdir(panel->path) != 0) return -1; - - sc_store_clear(panel); - if (!sc_path_is_root(panel->path) && sc_source_add_parent(panel) != 0) { - scan_errno = ENOMEM; - done = 1u; - } - - if (!done) { - errno = 0; - /* DSS 1.71/BIOS 3.06 трактует `*` как имя без расширения. Только - * подтверждённый P1-шаблон `*.*` перечисляет полный каталог. */ - rc = ffirst("*.*", &sc_source_find, SC_FIND_ATTRS); - if (rc != 0) { - if (errno == SC_DSS_TOO_MANY_FILES) dss_limited = 1u; - else if (errno != ENOENT) scan_errno = errno; - } else { - for (;;) { - if (!sc_is_dot_name(sc_source_find.found_name) && - !(sc_source_find.found_attr & FA_LABEL)) { - rc = sc_source_add_found(panel); - if (rc < 0) { - scan_errno = ENOMEM; - break; - } - /* 641-я подходящая запись уже доказала усечение. DSS - * хранит итератор глобально, но следующий F_FIRST его - * переинициализирует; дочитывать огромный каталог нельзя. */ - if (rc > 0) break; - } - errno = 0; - if (fnext(&sc_source_find) != 0) { - if (errno == SC_DSS_TOO_MANY_FILES) { - dss_limited = 1u; - } else if (errno != ENOENT) { - scan_errno = errno; - } - break; - } - } - } - } - - if (dss_limited && scan_errno == 0 && - sc_source_add_dss_limit(panel) != 0) scan_errno = ENOMEM; - - if (chdir(sc_source_process_cwd) != 0) return -2; - if (scan_errno != 0) { - errno = scan_errno; - return -1; - } - if (sc_sort_panel(panel) != 0) { - errno = ENOMEM; - return -1; - } - sc_source_restore_selection(panel, previous_name); - panel->dirty = 1u; - return 0; -} - -int sc_source_fs_change_dir(ScPanel *panel, const char *name) __banked -{ - int result; - - sc_copy_string(sc_source_old_path, panel->path, - (uint16_t)sizeof(sc_source_old_path)); - if (!getcwd(sc_source_process_cwd, - (uint16_t)sizeof(sc_source_process_cwd))) return -1; - if (chdir(panel->path) != 0) return -1; - if (chdir(name) != 0) { - (void)chdir(sc_source_process_cwd); - return -1; - } - if (!getcwd(sc_source_new_path, - (uint16_t)sizeof(sc_source_new_path))) { - (void)chdir(sc_source_process_cwd); - return -1; - } - if (chdir(sc_source_process_cwd) != 0) return -2; - - sc_copy_string(panel->path, sc_source_new_path, - (uint16_t)sizeof(panel->path)); - panel->count = 0u; - result = sc_source_fs_scan(panel); - if (result != 0) { - sc_copy_string(panel->path, sc_source_old_path, - (uint16_t)sizeof(panel->path)); - (void)sc_source_fs_scan(panel); - } - return result; -} diff --git a/applications/Volkov/src/sc_store.c b/applications/Volkov/src/sc_store.c deleted file mode 100644 index 35ef5ba..0000000 --- a/applications/Volkov/src/sc_store.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * sc_store.c — поэлементный доступ к странице каталога через W3. - * - * bank_read/bank_write сами сохраняют и восстанавливают страницу W3. - * Ни одна функция не возвращает указатель внутрь отображённой страницы. - */ - -#include -#include -#include "sc_store.h" - -static uint16_t sc_store_offset(uint16_t index) -{ - return (uint16_t)(index * (uint16_t)sizeof(ScDirEntry)); -} - -int sc_store_get(const ScPanel *panel, uint16_t index, ScDirEntry *out) -{ - if (!panel || !out || index >= panel->count || - index >= SC_DIR_CAPACITY || panel->phys_page == 0u) return -1; - bank_read(panel->phys_page, sc_store_offset(index), out, - (uint16_t)sizeof(*out)); - return 0; -} - -int sc_store_put(const ScPanel *panel, uint16_t index, - const ScDirEntry *entry) -{ - if (!panel || !entry || index >= SC_DIR_CAPACITY || - panel->phys_page == 0u) return -1; - bank_write(panel->phys_page, sc_store_offset(index), entry, - (uint16_t)sizeof(*entry)); - return 0; -} - -void sc_store_clear(ScPanel *panel) -{ - panel->count = 0u; - panel->cursor = 0u; - panel->top = 0u; - panel->total_size = 0ul; - panel->selected_count = 0u; - panel->selected_size = 0ul; - panel->truncated = 0u; - panel->dirty = 1u; -} diff --git a/applications/Volkov/src/sc_theme.c b/applications/Volkov/src/sc_theme.c deleted file mode 100644 index ae0d80a..0000000 --- a/applications/Volkov/src/sc_theme.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * sc_theme.c — владение многоцветной текстовой палитрой Commander. - * - * BIOS-функции работают с четырьмя планами: paper, ink, flash-paper и - * flash-ink. Для каждого используемого атрибута исходные RGB сохраняются, - * обе пары задаются одинаково, а при shutdown полностью восстанавливаются. - */ - -#include -#include -#include "sc_theme.h" - -#define SC_THEME_COLOR_COUNT 9u -#define SC_THEME_PLANE_COUNT 4u - -typedef struct { - uint8_t attr; - uint8_t paper_r; - uint8_t paper_g; - uint8_t paper_b; - uint8_t ink_r; - uint8_t ink_g; - uint8_t ink_b; -} ScThemeColor; - -static const ScThemeColor sc_theme_colors[SC_THEME_COLOR_COUNT] = { - { SC_ATTR_FRAME, 0x00, 0x00, 0xA8, 0xFF, 0xFF, 0xFF }, - { SC_ATTR_TITLE, 0x00, 0x00, 0xA8, 0xFF, 0xFF, 0x00 }, - { SC_ATTR_NORMAL, 0x00, 0x00, 0xA8, 0x55, 0xFF, 0xFF }, - { SC_ATTR_FILE, 0x00, 0x00, 0xA8, 0xC0, 0xC0, 0xC0 }, - { SC_ATTR_ACTIVE, 0x00, 0xA8, 0xA8, 0x00, 0x00, 0x00 }, - { SC_ATTR_STATUS, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00 }, - { SC_ATTR_DIALOG, 0xA8, 0x00, 0x00, 0xFF, 0xFF, 0xFF }, - { SC_ATTR_LIMIT, 0x00, 0x00, 0xA8, 0xFF, 0x55, 0x55 }, - { SC_ATTR_LIMIT_ACTIVE, - 0x00, 0xA8, 0xA8, 0xFF, 0x55, 0x55 } -}; - -/* Static-буфер гарантированно находится в W2, как требует BIOS $A4. */ -static uint8_t sc_theme_saved[SC_THEME_COLOR_COUNT] - [SC_THEME_PLANE_COUNT][3u]; -static uint8_t sc_theme_started; - -static void sc_theme_set_plane(uint8_t plane, const ScThemeColor *color) -{ - if (plane == TEXT_PAL_PAPER || plane == TEXT_PAL_BLINK_PAPER) { - text_pal_set_color(plane, color->attr, - color->paper_r, color->paper_g, color->paper_b); - } else { - text_pal_set_color(plane, color->attr, - color->ink_r, color->ink_g, color->ink_b); - } -} - -int sc_theme_init(void) -{ - uint8_t color_index; - uint8_t plane; - - if (sc_theme_started) return 0; - for (color_index = 0u; color_index < SC_THEME_COLOR_COUNT; - color_index++) { - const ScThemeColor *color = &sc_theme_colors[color_index]; - for (plane = 0u; plane < SC_THEME_PLANE_COUNT; plane++) { - text_pal_get_color(plane, color->attr, - &sc_theme_saved[color_index][plane][0], - &sc_theme_saved[color_index][plane][1], - &sc_theme_saved[color_index][plane][2]); - sc_theme_set_plane(plane, color); - } - } - sc_theme_started = 1u; - return 0; -} - -void sc_theme_reapply(void) -{ - uint8_t color_index; - uint8_t plane; - - if (!sc_theme_started) return; - for (color_index = 0u; color_index < SC_THEME_COLOR_COUNT; - color_index++) { - const ScThemeColor *color = &sc_theme_colors[color_index]; - for (plane = 0u; plane < SC_THEME_PLANE_COUNT; plane++) { - sc_theme_set_plane(plane, color); - } - } -} - -void sc_theme_shutdown(void) -{ - uint8_t color_index; - uint8_t plane; - - if (!sc_theme_started) return; - for (color_index = 0u; color_index < SC_THEME_COLOR_COUNT; - color_index++) { - for (plane = 0u; plane < SC_THEME_PLANE_COUNT; plane++) { - text_pal_set_color( - plane, sc_theme_colors[color_index].attr, - sc_theme_saved[color_index][plane][0], - sc_theme_saved[color_index][plane][1], - sc_theme_saved[color_index][plane][2]); - } - } - sc_theme_started = 0u; -} diff --git a/applications/Volkov/src/sc_tree.c b/applications/Volkov/src/sc_tree.c deleted file mode 100644 index 0d53fda..0000000 --- a/applications/Volkov/src/sc_tree.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * sc_tree.c — пошаговый BFS-обход каталога для рекурсивных F5/F8. - * - * Очередь компонентов хранится в отдельной динамической EMM-странице W3. - * Каждый узел содержит parent-index и DOS 8.3 name; абсолютные пути - * восстанавливаются перед операцией. Первый 256-байтовый диапазон страницы - * хранит исходный CWD процесса, поэтому job всегда может его восстановить. - */ - -#include -#include -#include -#include -#include -#include -#include "sc_path.h" -#include "sc_tree.h" - -#define SC_TREE_SAVED_CWD_SIZE 256u -#define SC_TREE_NODE_OFFSET 256u -#define SC_TREE_NODE_NONE 0xFFFFu -#define SC_TREE_MAX_DEPTH 32u -#define SC_TREE_FIND_ATTRS \ - (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) -#define SC_TREE_DSS_LIMIT 35 - -typedef struct { - uint16_t parent; - char name[13]; - uint8_t depth; -} ScTreeNode; - -typedef char ScTreeNode_must_be_16_bytes[ - (sizeof(ScTreeNode) == 16u) ? 1 : -1]; - -#define SC_TREE_NODE_CAPACITY \ - ((16384u - SC_TREE_NODE_OFFSET) / (uint16_t)sizeof(ScTreeNode)) - -static ffblk_t sc_tree_find; - -static uint8_t sc_tree_upper(uint8_t ch) -{ - if (ch >= 'a' && ch <= 'z') return (uint8_t)(ch - ('a' - 'A')); - if (ch == '/') return '\\'; - return ch; -} - -/* Истина, если path совпадает с root либо лежит внутри него. */ -static uint8_t sc_tree_path_contains(const char *root, const char *path) -{ - while (*root != '\0' && *path != '\0') { - if (sc_tree_upper((uint8_t)*root) != - sc_tree_upper((uint8_t)*path)) return 0u; - root++; - path++; - } - if (*root != '\0') return 0u; - if (*path == '\0') return 1u; - return (uint8_t)(*path == '\\' || *path == '/'); -} - -static uint16_t sc_tree_node_offset(uint16_t index) -{ - return (uint16_t)(SC_TREE_NODE_OFFSET + - index * (uint16_t)sizeof(ScTreeNode)); -} - -static int sc_tree_get(const ScTreeJob *job, uint16_t index, - ScTreeNode *node) -{ - if (!job || !node || index >= job->tail || - index >= SC_TREE_NODE_CAPACITY || job->page == 0u) { - errno = EINVAL; - return -1; - } - bank_read(job->page, sc_tree_node_offset(index), node, - (uint16_t)sizeof(*node)); - return 0; -} - -static int sc_tree_put(ScTreeJob *job, uint16_t parent, - const char *name, uint8_t depth) -{ - ScTreeNode node; - uint8_t i = 0u; - - if (job->tail >= SC_TREE_NODE_CAPACITY || depth > SC_TREE_MAX_DEPTH) { - errno = depth > SC_TREE_MAX_DEPTH ? EINAME : ENOMEM; - return -1; - } - memset(&node, 0, sizeof(node)); - node.parent = parent; - node.depth = depth; - while (i < 12u && name[i] != '\0') { - node.name[i] = name[i]; - i++; - } - if (name[i] != '\0') { - errno = EINAME; - return -1; - } - bank_write(job->page, sc_tree_node_offset(job->tail), &node, - (uint16_t)sizeof(node)); - job->tail++; - return 0; -} - -static int sc_tree_copy_base(char *out, const char *base) -{ - uint16_t i = 0u; - - while (base[i] != '\0') { - if (i + 1u >= SC_COPY_PATH_CAPACITY) { - errno = EINAME; - return -1; - } - out[i] = base[i]; - i++; - } - out[i] = '\0'; - return 0; -} - -static int sc_tree_append(char *out, const char *name) -{ - uint16_t pos = 0u; - uint16_t i = 0u; - - while (out[pos] != '\0') pos++; - if (pos != 0u && out[pos - 1u] != '\\' && out[pos - 1u] != '/') { - if (pos + 1u >= SC_COPY_PATH_CAPACITY) { - errno = EINAME; - return -1; - } - out[pos++] = '\\'; - } - while (name[i] != '\0') { - if (pos + 1u >= SC_COPY_PATH_CAPACITY) { - errno = EINAME; - return -1; - } - out[pos++] = name[i++]; - } - out[pos] = '\0'; - return 0; -} - -static int sc_tree_build_path(const ScTreeJob *job, uint16_t index, - const char *base, char *out) -{ - uint16_t chain[SC_TREE_MAX_DEPTH]; - uint8_t count = 0u; - ScTreeNode node; - - while (index != SC_TREE_NODE_NONE) { - if (count >= SC_TREE_MAX_DEPTH || sc_tree_get(job, index, &node) != 0) { - errno = EINAME; - return -1; - } - chain[count++] = index; - index = node.parent; - } - if (sc_tree_copy_base(out, base) != 0) return -1; - while (count != 0u) { - if (sc_tree_get(job, chain[--count], &node) != 0 || - sc_tree_append(out, node.name) != 0) return -1; - } - return 0; -} - -static uint8_t sc_tree_is_dot(const char *name) -{ - return (uint8_t)((name[0] == '.' && name[1] == '\0') || - (name[0] == '.' && name[1] == '.' && - name[2] == '\0')); -} - -static void sc_tree_found_entry(ScDirEntry *entry) -{ - memset(entry, 0, sizeof(*entry)); - strncpy(entry->name, sc_tree_find.found_name, - (uint16_t)(sizeof(entry->name) - 1u)); - entry->name[sizeof(entry->name) - 1u] = '\0'; - entry->size = sc_tree_find.size; - entry->date = sc_tree_find.date; - entry->time = sc_tree_find.time; - entry->attr = sc_tree_find.found_attr; -} - -static int sc_tree_fail(ScTreeJob *job, int error) -{ - if (error == 0) error = EUNKERR; - job->error = error; - errno = error; - return SC_TREE_STEP_ERROR; -} - -int sc_tree_begin(ScTreeJob *job, ScCopyJob *copy) __banked -{ - if (!job || !copy) { - errno = EINVAL; - return -1; - } - memset(job, 0, sizeof(*job)); - job->block = mem_alloc_pages(1u); - if (job->block == 0u) return -1; - job->page = mem_get_page(job->block, 0u); - if (job->page == 0u) { - mem_free_block(job->block); - job->block = 0u; - return -1; - } - if (!getcwd(copy->source_path, SC_COPY_PATH_CAPACITY)) { - mem_free_block(job->block); - job->block = 0u; - job->page = 0u; - return -1; - } - bank_write(job->page, 0u, copy->source_path, SC_TREE_SAVED_CWD_SIZE); - job->active = 1u; - return 0; -} - -int sc_tree_add_root(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, const char *target_base, - const char *name) __banked -{ - if (!job || !copy || !job->active || !source_base || !target_base || - !name || name[0] == '\0') { - errno = EINVAL; - return -1; - } - if (sc_path_join(copy->source_path, SC_COPY_PATH_CAPACITY, - source_base, name) != 0) return -1; - if (sc_tree_path_contains(copy->source_path, target_base)) { - errno = EINVAL; - return -1; - } - return sc_tree_put(job, SC_TREE_NODE_NONE, name, 1u); -} - -int sc_tree_add_delete_root(ScTreeJob *job, const char *name) __banked -{ - if (!job || !job->active || !name || name[0] == '\0') { - errno = EINVAL; - return -1; - } - return sc_tree_put(job, SC_TREE_NODE_NONE, name, 1u); -} - -int sc_tree_next(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, const char *target_base, - ScDirEntry *entry) __banked -{ - int rc; - int scan_errno; - ScTreeNode node; - - if (!job || !copy || !entry || !job->active) { - errno = EINVAL; - return SC_TREE_STEP_ERROR; - } - - while (job->head < job->tail) { - job->current = job->head; - if (job->scan_state == 0u) { - if (sc_tree_build_path(job, job->current, source_base, - copy->source_path) != 0) { - return sc_tree_fail(job, errno); - } - if (chdir(copy->source_path) != 0) { - return sc_tree_fail(job, errno); - } - if (sc_tree_build_path(job, job->current, target_base, - copy->target_path) != 0) { - return sc_tree_fail(job, errno); - } - if (mkdir(copy->target_path) != 0) { - return sc_tree_fail(job, errno); - } - job->created_directories++; - job->scan_state = 1u; - return SC_TREE_STEP_DIRECTORY; - } - - errno = 0; - if (job->scan_state == 1u) { - rc = ffirst("*.*", &sc_tree_find, SC_TREE_FIND_ATTRS); - if (rc == 0) job->scan_state = 2u; - } else { - rc = fnext(&sc_tree_find); - } - if (rc != 0) { - scan_errno = errno; - if (scan_errno == ENOENT) { - job->head++; - job->scan_state = 0u; - continue; - } - if (scan_errno == SC_TREE_DSS_LIMIT) { - return sc_tree_fail(job, scan_errno); - } - return sc_tree_fail(job, scan_errno); - } - - if (sc_tree_is_dot(sc_tree_find.found_name) || - (sc_tree_find.found_attr & FA_LABEL)) continue; - if (sc_tree_find.found_attr & FA_DIREC) { - if (sc_tree_get(job, job->current, &node) != 0 || - sc_tree_put(job, job->current, sc_tree_find.found_name, - (uint8_t)(node.depth + 1u)) != 0) { - return sc_tree_fail(job, errno); - } - continue; - } - - sc_tree_found_entry(entry); - if (sc_tree_build_path(job, job->current, target_base, - copy->target_path) != 0 || - sc_tree_append(copy->target_path, entry->name) != 0) { - return sc_tree_fail(job, errno); - } - job->files_seen++; - return SC_TREE_STEP_FILE; - } - return SC_TREE_STEP_DONE; -} - -int sc_tree_delete_next(ScTreeJob *job, ScCopyJob *copy, - const char *source_base, - ScDirEntry *entry) __banked -{ - int rc; - int scan_errno; - ScTreeNode node; - - if (!job || !copy || !source_base || !entry || !job->active) { - errno = EINVAL; - return SC_TREE_STEP_ERROR; - } - - for (;;) { - if (job->scan_state == 3u) { - if (job->reverse == 0u) return SC_TREE_STEP_DONE; - job->reverse--; - if (sc_tree_build_path(job, job->reverse, source_base, - copy->target_path) != 0) { - return sc_tree_fail(job, errno); - } - return SC_TREE_STEP_DIRECTORY; - } - - if (job->head >= job->tail) { - if (chdir(source_base) != 0) return sc_tree_fail(job, errno); - job->reverse = job->tail; - job->scan_state = 3u; - continue; - } - - job->current = job->head; - if (job->scan_state == 0u) { - if (sc_tree_build_path(job, job->current, source_base, - copy->source_path) != 0 || - chdir(copy->source_path) != 0) { - return sc_tree_fail(job, errno); - } - job->scan_state = 1u; - return SC_TREE_STEP_SCAN_DIR; - } - - errno = 0; - if (job->scan_state == 1u) { - rc = ffirst("*.*", &sc_tree_find, SC_TREE_FIND_ATTRS); - if (rc == 0) job->scan_state = 2u; - } else { - rc = fnext(&sc_tree_find); - } - if (rc != 0) { - scan_errno = errno; - if (scan_errno == ENOENT) { - job->head++; - job->scan_state = 0u; - continue; - } - return sc_tree_fail(job, scan_errno); - } - - if (sc_tree_is_dot(sc_tree_find.found_name) || - (sc_tree_find.found_attr & FA_LABEL)) continue; - if (sc_tree_find.found_attr & FA_DIREC) { - if (sc_tree_get(job, job->current, &node) != 0 || - sc_tree_put(job, job->current, sc_tree_find.found_name, - (uint8_t)(node.depth + 1u)) != 0) { - return sc_tree_fail(job, errno); - } - /* Возвращаем управление после каждого enqueue: иначе каталог с - * сотнями подкаталогов надолго задержит проверку Esc. */ - return SC_TREE_STEP_SCAN_DIR; - } - - sc_tree_found_entry(entry); - if (sc_tree_build_path(job, job->current, source_base, - copy->target_path) != 0 || - sc_tree_append(copy->target_path, entry->name) != 0) { - return sc_tree_fail(job, errno); - } - job->files_seen++; - return SC_TREE_STEP_FILE; - } -} - -int sc_tree_finish(ScTreeJob *job, ScCopyJob *copy) __banked -{ - int restore_errno = 0; - - if (!job || !copy) { - errno = EINVAL; - return -1; - } - if (!job->active) return 0; - bank_read(job->page, 0u, copy->source_path, SC_TREE_SAVED_CWD_SIZE); - if (chdir(copy->source_path) != 0) restore_errno = errno; - mem_free_block(job->block); - job->block = 0u; - job->page = 0u; - job->active = 0u; - if (restore_errno != 0) { - errno = restore_errno; - return -1; - } - return 0; -} diff --git a/applications/Volkov/src/sc_video_system.c b/applications/Volkov/src/sc_video_system.c deleted file mode 100644 index dd31f69..0000000 --- a/applications/Volkov/src/sc_video_system.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * sc_video_system.c — полноэкранный системный backend Commander. - * - * Использует только абсолютные ESTEX WINREST/SCROLL. Окна BIOS и прямая - * адресация VRAM не применяются. Палитрой владеет отдельный sc_theme. - */ - -#include -#include -#include "sc_video.h" - -static uint8_t sc_previous_mode; -static uint8_t sc_video_started; - -int sc_video_init(void) -{ - sc_previous_mode = gettextmode(); - if (settextmode(TEXT_MODE_80x32) != 0) return -1; - sc_video_started = 1u; - return 0; -} - -int sc_video_restore(void) -{ - if (!sc_video_started) return -1; - return settextmode(TEXT_MODE_80x32); -} - -void sc_video_shutdown(void) -{ - if (!sc_video_started) return; - - textattr(COLOR(COLOR_WHITE, COLOR_BLACK)); - clrscr(); - if (sc_previous_mode == TEXT_MODE_40x32 || - sc_previous_mode == TEXT_MODE_80x32) { - (void)settextmode(sc_previous_mode); - } - sc_video_started = 0u; -} - -int sc_video_present_rect(uint8_t page, uint16_t offset, - uint8_t row, uint8_t col, - uint8_t height, uint8_t width) -{ - if (height == 0u || width == 0u) return 0; - sc_platform_winrest(row, col, height, width, page, offset); - return 0; -} - -int sc_video_scroll_rect(uint8_t row, uint8_t col, - uint8_t height, uint8_t width, - uint8_t direction) -{ - if (height == 0u || width == 0u) return 0; - scroll(col, row, width, height, direction, 0u); - return 0; -} diff --git a/applications/Volkov/src/sprcmd.c b/applications/Volkov/src/sprcmd.c deleted file mode 100644 index 5d4fdfe..0000000 --- a/applications/Volkov/src/sprcmd.c +++ /dev/null @@ -1,23 +0,0 @@ -/* sprcmd.c — точка входа Sprinter Commander. */ - -#include -#include -#include "sc_app.h" - -static ScApp sc_app; - -int main(void) -{ - int result = sc_app_init(&sc_app); - - if (result != 0) { - cputs("SPRCMD initialization failed.\r\n"); - return (uint8_t)(-result); - } - sc_app_run(&sc_app); - if (sc_app_cleanup(&sc_app) != 0) { - cputs("SPRCMD cleanup did not restore EMM free pages.\r\n"); - return 4; - } - return 0; -} diff --git a/applications/Volkov/tests/check_p10_rename_hdd.sh b/applications/Volkov/tests/check_p10_rename_hdd.sh deleted file mode 100755 index 08b08af..0000000 --- a/applications/Volkov/tests/check_p10_rename_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает результат target-пробы и дерево после UI F6. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p10_rename.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-rename-check.XXXXXX") -RAW="$TEMP_DIR/p10_rename.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/RENTEST z:/RENRES.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p10_rename_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p11_delete_hdd.sh b/applications/Volkov/tests/check_p11_delete_hdd.sh deleted file mode 100755 index 8c4a8b5..0000000 --- a/applications/Volkov/tests/check_p11_delete_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает результат target-пробы и дерево после UI F8. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p11_delete.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-delete-check.XXXXXX") -RAW="$TEMP_DIR/p11_delete.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/DELTEST z:/DELRES.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p11_delete_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p12_group_copy_hdd.sh b/applications/Volkov/tests/check_p12_group_copy_hdd.sh deleted file mode 100755 index d6f8c09..0000000 --- a/applications/Volkov/tests/check_p12_group_copy_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает обе стороны группового F5 и сравнивает их побайтно. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p12_group_copy.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-copy-check.XXXXXX") -RAW="$TEMP_DIR/p12_group_copy.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/GRSRC z:/GRDST "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p12_group_copy_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p13_group_delete_hdd.sh b/applications/Volkov/tests/check_p13_group_delete_hdd.sh deleted file mode 100755 index 5dacd2e..0000000 --- a/applications/Volkov/tests/check_p13_group_delete_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает дерево после группового F8 и проверяет его. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p13_group_delete.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-delete-check.XXXXXX") -RAW="$TEMP_DIR/p13_group_delete.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/GDEL "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p13_group_delete_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p14_default_colors_hdd.sh b/applications/Volkov/tests/check_p14_default_colors_hdd.sh deleted file mode 100755 index f6e5fc8..0000000 --- a/applications/Volkov/tests/check_p14_default_colors_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Проверяет неизменность HDD-fixture после визуального теста цветов. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p14_default_colors.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-default-colors-check.XXXXXX") -RAW="$TEMP_DIR/p14_default_colors.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/COLORS "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p14_default_colors_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p15_tree_cancel_hdd.sh b/applications/Volkov/tests/check_p15_tree_cancel_hdd.sh deleted file mode 100755 index b63961f..0000000 --- a/applications/Volkov/tests/check_p15_tree_cancel_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Проверяет носитель после отмены рекурсивного F5. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_cancel.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-cancel-check.XXXXXX") -RAW="$TEMP_DIR/p15_tree_cancel.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/CSRC z:/CDST "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p15_tree_cancel_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p15_tree_copy_hdd.sh b/applications/Volkov/tests/check_p15_tree_copy_hdd.sh deleted file mode 100755 index 9257426..0000000 --- a/applications/Volkov/tests/check_p15_tree_copy_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает дерево после рекурсивного F5 и сравнивает его побайтно. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_copy.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-copy-check.XXXXXX") -RAW="$TEMP_DIR/p15_tree_copy.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/SRC z:/DST "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p15_tree_copy_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p15_tree_self_hdd.sh b/applications/Volkov/tests/check_p15_tree_self_hdd.sh deleted file mode 100755 index 2fffc24..0000000 --- a/applications/Volkov/tests/check_p15_tree_self_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Проверяет неизменность source после self-target guard. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_self.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-self-check.XXXXXX") -RAW="$TEMP_DIR/p15_tree_self.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/SRC "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p15_tree_self_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p16_group_tree_copy_hdd.sh b/applications/Volkov/tests/check_p16_group_tree_copy_hdd.sh deleted file mode 100755 index 2602ae1..0000000 --- a/applications/Volkov/tests/check_p16_group_tree_copy_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает и проверяет результат group F5 с directory roots. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p16_group_tree_copy.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-tree-check.XXXXXX") -RAW="$TEMP_DIR/p16_group_tree_copy.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/GSRC z:/GDST "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p16_group_tree_copy_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p17_tree_delete_cancel_hdd.sh b/applications/Volkov/tests/check_p17_tree_delete_cancel_hdd.sh deleted file mode 100755 index 989a772..0000000 --- a/applications/Volkov/tests/check_p17_tree_delete_cancel_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает и проверяет состояние после runtime-cancel рекурсивного F8. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p17_tree_delete_cancel.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-delete-cancel-check.XXXXXX") -RAW="$TEMP_DIR/p17_tree_delete_cancel.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/CDEL "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p17_tree_delete_cancel_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p17_tree_delete_hdd.sh b/applications/Volkov/tests/check_p17_tree_delete_hdd.sh deleted file mode 100755 index 04bcc2c..0000000 --- a/applications/Volkov/tests/check_p17_tree_delete_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает и проверяет результат рекурсивного группового F8. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p17_tree_delete.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-delete-check.XXXXXX") -RAW="$TEMP_DIR/p17_tree_delete.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/RDEL "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p17_tree_delete_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p18_metadata_hdd.sh b/applications/Volkov/tests/check_p18_metadata_hdd.sh deleted file mode 100755 index 8b4ad31..0000000 --- a/applications/Volkov/tests/check_p18_metadata_hdd.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# Извлекает raw FAT16 и сверяет payload, date/time и атрибуты source/target. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p18_metadata.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-metadata-check.XXXXXX") -RAW="$TEMP_DIR/p18_metadata.raw" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -python3 "$PROJECT_DIR/tests/p18_metadata_fixture.py" verify "$RAW" diff --git a/applications/Volkov/tests/check_p19_overwrite_hdd.sh b/applications/Volkov/tests/check_p19_overwrite_hdd.sh deleted file mode 100755 index 773da35..0000000 --- a/applications/Volkov/tests/check_p19_overwrite_hdd.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# Извлекает результат target-пробы P19 и сверяет все файлы побайтно. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p19_overwrite.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p19-check.XXXXXX") -RAW="$TEMP_DIR/p19.raw" -MTC="$TEMP_DIR/mtools.conf" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir -p "$TEMP_DIR/out" -mcopy -s z:/* "$TEMP_DIR/out" -python3 "$PROJECT_DIR/tests/p19_overwrite_fixture.py" verify "$TEMP_DIR/out" diff --git a/applications/Volkov/tests/check_p19_policy_hdd.sh b/applications/Volkov/tests/check_p19_policy_hdd.sh deleted file mode 100755 index 46e2b87..0000000 --- a/applications/Volkov/tests/check_p19_policy_hdd.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# Извлекает UI-результат P19 и сверяет policy-последствия побайтно. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p19_policy.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p19-ui-check.XXXXXX") -RAW="$TEMP_DIR/p19.raw" -MTC="$TEMP_DIR/mtools.conf" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir -p "$TEMP_DIR/out" -mcopy -s z:/* "$TEMP_DIR/out" -python3 "$PROJECT_DIR/tests/p19_policy_fixture.py" verify "$TEMP_DIR/out" diff --git a/applications/Volkov/tests/check_p4_copy_hdd.sh b/applications/Volkov/tests/check_p4_copy_hdd.sh deleted file mode 100755 index 433571d..0000000 --- a/applications/Volkov/tests/check_p4_copy_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Проверяет изменённый MAME-образ после tests/mame_p4_copy_hdd.lua. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p4_copy.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-copy-check.XXXXXX") -RAW="$TEMP_DIR/p4_copy.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/COPYFROM z:/COPYTO "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p4_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p4_exec_hdd.sh b/applications/Volkov/tests/check_p4_exec_hdd.sh deleted file mode 100755 index 0651d97..0000000 --- a/applications/Volkov/tests/check_p4_exec_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает изменённый HDD и проверяет результаты P4CHILD. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p4_exec.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-exec-check.XXXXXX") -RAW="$TEMP_DIR/p4_exec.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/EXECLEFT z:/EXECRGHT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p4_exec_verify.py" "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p5_copy_faults_hdd.sh b/applications/Volkov/tests/check_p5_copy_faults_hdd.sh deleted file mode 100755 index 8f3a39d..0000000 --- a/applications/Volkov/tests/check_p5_copy_faults_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает результат низкоуровневой матрицы copy-job из CHD. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p5_copy_faults.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-copy-faults-check.XXXXXX") -RAW="$TEMP_DIR/p5_copy_faults.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/SOURCE z:/TARGET z:/RESULT.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p5_copy_faults_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p5_enospc_hdd.sh b/applications/Volkov/tests/check_p5_enospc_hdd.sh deleted file mode 100755 index bc38a5e..0000000 --- a/applications/Volkov/tests/check_p5_enospc_hdd.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# Проверяет cleanup почти полного HDD после ошибки копирования. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p5_enospc.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-enospc-check.XXXXXX") -RAW="$TEMP_DIR/enospc.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/SOURCE z:/TARGET "$EXTRACTED/" -mcopy z:/FILLER.BIN "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p5_enospc_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p5_hdd.sh b/applications/Volkov/tests/check_p5_hdd.sh deleted file mode 100755 index 2a94601..0000000 --- a/applications/Volkov/tests/check_p5_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает HDD после P5 и сравнивает все двадцать копий. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p5_stability.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p5-check.XXXXXX") -RAW="$TEMP_DIR/p5.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/SOURCE z:/TARGET "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p5_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p5_media_hdd.sh b/applications/Volkov/tests/check_p5_media_hdd.sh deleted file mode 100755 index 6182d19..0000000 --- a/applications/Volkov/tests/check_p5_media_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Проверяет HDD после unload/load и повторного F5. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p5_media.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-media-check.XXXXXX") -RAW="$TEMP_DIR/p5_media.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/MEDIA z:/DATA.BIN "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p5_media_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p6_sort_hdd.sh b/applications/Volkov/tests/check_p6_sort_hdd.sh deleted file mode 100755 index 4236ba8..0000000 --- a/applications/Volkov/tests/check_p6_sort_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает SORTRES.TXT и проверяет target-регрессию сортировки. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p6_sort.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-sort-check.XXXXXX") -RAW="$TEMP_DIR/p6_sort.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy z:/SORTRES.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p6_sort_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p7_select_hdd.sh b/applications/Volkov/tests/check_p7_select_hdd.sh deleted file mode 100755 index 57b92a1..0000000 --- a/applications/Volkov/tests/check_p7_select_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает SELRES.TXT и проверяет target-регрессию выбора. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p7_select.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-select-check.XXXXXX") -RAW="$TEMP_DIR/p7_select.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy z:/SELRES.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p7_select_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/check_p9_mkdir_hdd.sh b/applications/Volkov/tests/check_p9_mkdir_hdd.sh deleted file mode 100755 index 739b79d..0000000 --- a/applications/Volkov/tests/check_p9_mkdir_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Извлекает результат target-пробы и дерево после F7. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p9_mkdir.chd} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-mkdir-check.XXXXXX") -RAW="$TEMP_DIR/p9_mkdir.raw" -MTC="$TEMP_DIR/mtools.conf" -EXTRACTED="$TEMP_DIR/extracted" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -chdman extractraw -i "$IMAGE" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mkdir "$EXTRACTED" -mcopy -s z:/MKTEST z:/MKRES.TXT "$EXTRACTED/" -python3 "$PROJECT_DIR/tests/p9_mkdir_fixture.py" verify "$EXTRACTED" diff --git a/applications/Volkov/tests/fixtures/mdview2/LICENSE b/applications/Volkov/tests/fixtures/mdview2/LICENSE deleted file mode 100644 index 217ff75..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -================================================================================ - -Vendored third-party components are under their own licenses: - - third_party/sdcc/ — SDCC 4.5 under GPL v2 with linking exception. - See third_party/sdcc/COPYING.txt. - third_party/solid-c/ — Original Sprinter Solid C, used only as a reference - for compatibility. Licence not specified upstream; - treat as reference material, do not redistribute - original binaries. - mame/v306/ — MAME (https://www.mamedev.org), GPL v2+. - mame/v306/IMG/*.img *.chd *.iso — Sprinter ROM / DSS / sample disk images - from Peters Plus. Redistribution policy: see - Peters Plus documentation. - -Documentation in docs/converted/, docs/reference/, docs/samples/, and -docs/memory management/ contains material originally published by Peters Plus -team (Иван Мак, Дмитрий Паринов and others). Used here for cross-compilation -reference; original copyrights apply. diff --git a/applications/Volkov/tests/fixtures/mdview2/ORIGIN.md b/applications/Volkov/tests/fixtures/mdview2/ORIGIN.md deleted file mode 100644 index e16bcf3..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/ORIGIN.md +++ /dev/null @@ -1,8 +0,0 @@ -# MDVIEW2 fixture для теста запуска дочернего приложения - -Снимок исходников `examples/mdview2` из Sprinter-SDCC commit `5323b16` -(2026-09-15). Лицензия MIT находится в `LICENSE`. Fixture специально -зафиксирован: тест Commander должен проверять запуск полноэкранного viewer, -PageDown/raw-режим и восстановление окружения после возврата, независимо от -последующих изменений проекта Examples. Обновлять снимок только вместе с -повторной проверкой сценария `mame_p5_viewer.lua` и эталонных кадров. diff --git a/applications/Volkov/tests/fixtures/mdview2/README.md b/applications/Volkov/tests/fixtures/mdview2/README.md deleted file mode 100644 index 0cc3c6a..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# MDView v1.0 (b3) — просмотрщик Markdown для Sprinter - -**MDView** — программа просмотра документов Markdown для компьютера -**Sprinter-2000** (Z80, ОС ESTEX). Файл загружается в расширенную память (EMM) -и один раз «прогоняется» через парсер: готовые к показу строки (пары -символ+атрибут) складываются в **рендер-кэш** в EMM, после чего прокрутка в -любую сторону — это просто копирование готовых строк на экран, без повторного -парсинга. Даже на файлах в сотни килобайт листание остаётся мгновенным. - -Текстовый режим 80×32, цветное оформление элементов разметки, три режима -просмотра (MD / RAW / HEX) и четыре кодировки с автоопределением. - ---- - -## Возможности - -* **Markdown-рендеринг** с цветовым оформлением: - * заголовки `#`…`######` (H5/H6 отображаются как H4); - * **жирный** (`**текст**`), *курсив* (`*текст*`), подчёркнутый (`_текст_`), - ~~зачёркнутый~~ (`~~текст~~`), `встроенный код` (`` `текст` ``); - * экранирование `\*`, `\_`, `` \` `` и любой ASCII-пунктуации; - * чекбоксы `[x]` / `[ ]` в списках; - * ненумерованные (`-`, `*`, `+`) и нумерованные (`1.`, `1)`) списки - с базовой вложенностью по отступам; - * цитаты `>` (склейка многострочных, маркер │ на переносах); - * fenced-блоки кода ` ``` ` (без переносов, горизонтальный скролл); - * таблицы `| … | … |` — рисуются псевдографической рамкой, ширины колонок - вычисляются по содержимому (до 16 колонок); - * горизонтальные разделители `---` / `***` / `___`; - * жёсткие переносы (два пробела или `\` в конце строки); - * мягкая склейка абзацев с переносом по словам под ширину экрана. -* **Кодировки: CP866, CP1251, KOI8-R, UTF-8.** - * автоопределение при открытии (BOM → UTF-8; валидность multibyte-структуры; - частотный анализ ходовых русских букв для 8-битных); - * переключение по кругу клавишей **F8** в любой момент; - * 8-битные кодировки отличаются только перекодировкой глифов на отрисовке — - переключение мгновенно; - * UTF-8 декодируется в CP866 в **отдельный набор** (файл + индекс + кэш); - второй набор готовится **в фоне**, пока вы читаете документ, — обычно - к первому нажатию F8 он уже построен и переключение мгновенно, - с сохранением позиции. Если фон не успел, F8 докручивает начатую - сборку (со спиннером), а не начинает её заново. -* **Три режима просмотра:** - * **MD** — форматированный Markdown (по умолчанию); - * **RAW** (**F2**) — исходный текст без разметки: перенос строк кратно 80 - (**F3** — режим панорамы с горизонтальным скроллом); - * **HEX** (**F4**) — дамп *оригинального* файла: - `0x012340 │ 16 байт hex │ 16 печатных символов`. Печатная колонка - интерпретируется текущей кодировкой; для UTF-8 глиф ставится на позиции - лид-байта, continuation-байты показываются точкой. -* **Единая позиция** при любых переключениях: MD ↔ RAW ↔ HEX и смена - кодировки сохраняют текущее место в документе (между наборами разного - размера — пропорционально, с точностью до строки). -* **Прогрессивная загрузка**: первый экран показывается сразу, индексация - продолжается в фоне; по готовой части документа уже можно листать, - **Esc**/**F10** прерывают загрузку. -* **Фоновая работа незаметна**: второй набор кодировки строится только в - паузах между клавишами (после нажатия выдерживается пауза), поэтому - скролл — в том числе с автоповтором — не теряет плавности. - ---- - -## Запуск - -``` -MDVIEW2.EXE <файл.md> -``` - -Без аргумента открывается `README.MD` из текущего каталога. - -## Клавиши - -| Клавиша | Действие | -|--------------|-------------------------------------------------------------| -| ↑ / ↓ | прокрутка на одну строку | -| PgUp / PgDn | прокрутка на экран (30 строк) | -| Home / End | в начало / в конец документа | -| ← / → | горизонтальный сдвиг: код/таблицы в MD, панорама в RAW | -| F1 | справка | -| F2 | RAW-режим ↔ MD | -| F3 | в RAW: перенос строк ↔ панорама | -| F4 | HEX-режим ↔ прежний вид | -| F8 | кодировка: CP866 → CP1251 → KOI8-R → UTF-8 → … | -| Esc / F10 | выход (во время загрузки — прервать её) | - -Статус-бар (верхняя строка): имя файла, кодировка, диапазон видимых строк -и процент прокрутки. Нижняя строка — меню доступных F-клавиш. - ---- - -## Ограничения - -| Параметр | Значение | -|---------------------------------|-------------------------------------------| -| Размер файла | до 256 КБ (больший — обрезается с предупреждением) | -| Логических строк (после переносов) | до 18 432 | -| Длина строки в рендер-кэше | 255 ячеек (RAW/HEX ограничения не имеют) | -| Колонок в таблице | до 16 | -| Шаг табуляции | 4 | - -При исчерпании любого лимита документ завершается строкой-сообщением -с указанием причины обрыва; всё, что вошло, доступно для просмотра. - -## Требования - -* Sprinter-2000 с ОС ESTEX; -* расширенная память (EMM): в худшем случае (файл 256 КБ + оба набора - кодировок) — до ~150 страниц по 16 КБ (~2,4 МБ). Для типичных файлов - в десятки килобайт достаточно нескольких десятков страниц. - -Код, данные, стек и куча программы занимают окна W1+W2 (32 КБ, режим -памяти `small`); окно W3 используется только для доступа к EMM-страницам. - ---- - -## Сборка - -Требуется тулчейн этого репозитория (обёртка `sprinter-cc` над SDCC 4.5). -Из каталога `examples/mdview2`: - -``` -make # собрать mdview2.exe -make floppy # собрать и упаковать дискету для MAME (mc.img) -make run # floppy + автоматический прогон в MAME (скриншоты) -``` - -На дискету кладутся: `MDVIEW2.EXE` и три документа, каждый в своей кодировке -(заодно покрывают все пути автодетекта): `README.MD` — этот файл, как есть -(UTF-8); `DEMO.MD` — демонстрация всех элементов разметки (CP1251); -`CHANGES.MD` — история версий (CP866). - -## Структура исходников - -| Файл | Назначение | -|------------------|--------------------------------------------------------------| -| `mdview2.c` | ядро: EMM-аллокации, рендер-кэш, наборы кодировок, загрузка файла, главный цикл | -| `mdview2_index.c`| парсер/индексатор Markdown — единственный проход по файлу | -| `mdview2_md.c` | MD-вид: отрисовка из кэша, прокрутка | -| `mdview2_raw.c` | RAW-вид (F2/F3) | -| `mdview2_hex.c` | HEX-вид (F4) | -| `mdview2_enc.c` | кодировки: детект, ремап-таблицы, конвертер UTF-8 → CP866 | -| `mdview2_table.c`| отрисовка таблиц | -| `mdview2_status.c`| статус-бар, меню, спиннер | -| `mdview2_help.c` | справка (F1) | -| `mdview2_conf.h` | конфигурация: `WITH_RAW` / `WITH_HEX` (модули отключаемы) | -| `mdview2.h` | общие константы, атрибуты, межмодульный API | - -Подробности архитектуры — в `docs/mdview2-plan.md`. - -## Лицензия и авторы - -© 2026 Петров А.Г. Часть проекта Sprinter C Compiler -(см. LICENSE в корне репозитория). diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2.c b/applications/Volkov/tests/fixtures/mdview2/mdview2.c deleted file mode 100644 index c4f2898..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2.c +++ /dev/null @@ -1,1338 +0,0 @@ -/* - * mdview2 — просмотрщик Markdown для Sprinter (render-cache версия). - * - * Этот файл — ЯДРО (инфраструктура + точка входа). Прикладные подсистемы - * вынесены в отдельные модули (общий интерфейс — mdview2.h): - * mdview2_index.c — парсер/индексатор markdown (построение рендер-кэша) - * mdview2_md.c — представление MD-документа (отрисовка из кэша + скролл) - * mdview2_raw.c — RAW-просмотр исходного текста (F2/F3) - * mdview2_enc.c — кодировки CP866/CP1251/KOI8R + UTF-8 конвертер - * mdview2_table.c — выровненная отрисовка таблиц - * mdview2_help.c — диалог справки (F1) - * - * В ядре остаётся: пул рендер-кэша, доступ к EMM/окну W3 (fb/win_rest), - * примитивы экрана, загрузка файла, наборы документа (doc-slots), кооператив- - * ная loading-loop и диспетчер клавиш, сборка наборов и main(). - * - * Разметка экрана (80x32): - * строка 0 — статус-бар (имя файла / диапазон строк / всего / %) - * строки 1..30 — область документа (30 видимых строк текста) - * строка 31 — меню (F1 Help / F2 RAW / F3 Wrap / F8 CodePg / F10 Exit) - * - * Память: - * CODE → W1 (режим sprinter-cc --memory small) - * STACK/HEAP/DATA → W2 - * Буфер файла → страницы EMM (до 8 × 16 КБ = 128 КБ), - * отображаемые в W3 по требованию через fb(). - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mdview2.h" /* геометрия, атрибуты, общий интерфейс модулей */ - -/* ---- Палитра атрибутов ------------------------------------------- */ - -static const uint8_t md_pallete[16 * 4] = { - 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, - 0xC8, 0xC8, 0xC8, 0x00, - 0xA0, 0xA0, 0x80, 0x00, - 0xFF, 0xAA, 0xAA, 0x00, - 0xAA, 0xFF, 0xAA, 0x00, - 0xFF, 0xFF, 0xAA, 0x00, - 0xAA, 0xAA, 0xFF, 0x00, - 0xFF, 0xAA, 0xFF, 0x00, - 0xAA, 0xFF, 0xFF, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF -}; - -/* Атрибуты экрана/справки и геометрия — в mdview2.h (общие со всеми модулями). - * Типы записей (idx_rec_t — в mdview2_index.c, cache_rec_t — в mdview2.h), - * словари флагов/стилей (IF_, CK_, INIT_STYLE_) и константы индекса - * (INDEX_RECS_PER_PAGE, MAX_CACHE_LINE_LEN) — в mdview2.h. - * - * В SDCC/z80 критично явно инициализировать static-переменные (`= 0`): - * неинициализированные static-объекты могут конфликтовать по размещению - * и перезаписывать друг друга (см. memory/sdcc_static_storage_gotcha). */ - -#define MAX_INDEX_PAGES 9u /* максимум 9 * 2048 = 18432 сегментов индекса (256 КБ) */ - -/* ================================================================== - * Рендер-кэш: директория и пул EMM-страниц - * ================================================================== - * Каждая логическая строка экрана рендерится РОВНО ОДИН РАЗ (Фаза 2) - * в готовый буфер и больше никогда не парсится повторно при скролле. - * Содержимое живёт в ОТДЕЛЬНОМ пуле EMM-страниц (cache_content_*), - * не путать с idx_rec_t/index_phys[] выше — те остаются неизменными, - * ими пользуется рендер-воркер ПРИ построении кэша (Фаза 2), и их - * нельзя перезатирать, т.к. воркер для одной строки может заглядывать - * в idx-записи СОСЕДНИХ строк (откат cont-сегментов). - * - * ЕДИНЫЙ формат для ВСЕХ строк (решено 2026-06-23 — изначальный план - * различал тип 1/тип 2 по экономии памяти, но строки таблиц — IF_NOWRAP, - * но НЕ IF_CODE — всё равно проходят inline-парсер и могут содержать - * несколько атрибутов, так что "один стиль" для них неверно; бюджет EMM - * (см. sprinter_emm_budget) с большим запасом покрывает (char,attr) - * для всех строк без исключения): контент — `len` пар (char,attr), - * `len` — реальная длина в ЯЧЕЙКАХ без паддинга до SCREEN_W, капается на - * 255 (патологически длинные nowrap-строки урезаются; индикатор обрезки - * добавляется на этапе вывода из кэша, не при рендере в кэш). - */ -/* cache_rec_t (РОВНО 8 байт, см. sprinter_winrest_format) — в mdview2.h. */ - -#define CACHE_DIR_REC_SIZE ((uint16_t)sizeof(cache_rec_t)) -#define CACHE_DIR_RECS_PER_PAGE (16384 / CACHE_DIR_REC_SIZE) /* 2048 */ -#define MAX_CACHE_DIR_PAGES 9u /* симметрично индексу: 9 * 2048 = 18432 записей */ -/* MAX_CACHE_LINE_LEN — в mdview2.h (буфер ячеек g_cells живёт в mdview2_index.c). */ -#define MAX_CACHE_CONTENT_PAGES 40u /* кап контента на набор: 40 * 16 КБ = 640 КБ (80 на оба набора) */ - -static uint8_t cache_dir_blk; -static uint8_t cache_dir_pages; -static uint8_t cache_dir_phys[MAX_CACHE_DIR_PAGES]; - -static uint8_t cache_content_blk[MAX_CACHE_CONTENT_PAGES]; /* id блока на каждую выделенную страницу */ -static uint8_t cache_content_phys[MAX_CACHE_CONTENT_PAGES]; -static uint8_t cache_content_n_pages; /* сколько страниц уже выделено */ -static uint8_t cache_cur_page_idx; /* индекс текущей страницы записи в cache_content_phys */ -static uint16_t cache_cur_off; /* текущее смещение записи в этой странице */ - -/* Доступ к директории рендер-кэша — тот же приём, что у idx_get/idx_put. */ -void cache_dir_get(uint16_t idx, cache_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 0x07FF) << 3); /* 2047 */ - bank_read(cache_dir_phys[page], off, r, CACHE_DIR_REC_SIZE); -} - -void cache_dir_put(uint16_t idx, const cache_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 0x07FF) << 3); /* 2047 */ - bank_write(cache_dir_phys[page], off, r, CACHE_DIR_REC_SIZE); -} - -/* Резервирует nbytes подряд в пуле контента рендер-кэша. - * Запись никогда не разбивается через границу страницы: если остаток - * текущей страницы недостаточен — переходим на следующую целиком, - * жертвуя остатком (проще и безопаснее, чем page-crossing в fb()). - * При нехватке текущего пула — лениво доращиваем его на 1 страницу. - * Возврат: 1 — успех (out_page и out_off заполнены), 0 — EMM кончилась. */ -uint8_t cache_reserve(uint16_t nbytes, uint8_t *out_page, uint16_t *out_off) -{ - if (nbytes == 0 || nbytes > PAGE_SIZE) return 0; - - if (cache_content_n_pages == 0 || - (uint16_t)(cache_cur_off + nbytes) > PAGE_SIZE) { - /* Нужна новая страница: либо пул ещё пуст, либо текущая страница - * не вмещает запись целиком. */ - uint8_t next_idx = (cache_content_n_pages == 0) ? 0 : (uint8_t)(cache_cur_page_idx + 1); - if (next_idx >= cache_content_n_pages) { - if (cache_content_n_pages >= MAX_CACHE_CONTENT_PAGES) - return 0; - uint8_t blk = mem_alloc_pages(1); - if (blk == 0) - return 0; - cache_content_blk[cache_content_n_pages] = blk; - cache_content_phys[cache_content_n_pages] = mem_get_page(blk, 0); - cache_content_n_pages++; - } - cache_cur_page_idx = next_idx; - cache_cur_off = 0; - } - - *out_page = cache_content_phys[cache_cur_page_idx]; - *out_off = cache_cur_off; - cache_cur_off = (uint16_t)(cache_cur_off + nbytes); - return 1; -} - -/* Копирует уже готовый буфер (рендер одной строки, собранный в W1/W2 — - * НЕ в W3, чтобы не конфликтовать с fb()/чтением исходника во время - * рендера) в зарезервированное место в пуле контента. Один bank_write - * на строку, а не по байту. len — РОВНО как у cache_reserve()/bank_write - * — uint16_t, не uint8_t: строка до MAX_CACHE_LINE_LEN=255 ячеек даёт - * до 510 байт (char,attr), это уже не лезет в uint8_t. */ -void cache_commit(uint8_t page, uint16_t off, const void *buf, uint16_t len) -{ - bank_write(page, off, buf, len); -} - -/* emph_to_attr определена ниже (рядом с inline-логикой), нужна в inline_scan. */ -/* emph_to_attr — в mdview2_index.c. */ - -uint16_t n_lines; /* extern: всего строк в индексе текущего набора */ -uint16_t max_lines; /* extern: ёмкость индекса: index_pages * 2048 */ -uint16_t top_line; /* extern: верхняя видимая строка */ -uint32_t file_size; /* extern: размер активного буфера документа */ -static uint8_t file_blk; -static uint8_t file_pages; -static uint8_t file_phys[MAX_PAGES]; -uint8_t index_blk; /* extern: дескриптор EMM-блока индекса */ -uint8_t index_pages; /* */ -uint8_t index_phys[MAX_INDEX_PAGES]; /* extern: физ. страницы индекса */ -uint8_t index_truncated; /* выставляется при исчерпании ёмкости индекса */ -uint8_t g_file_clamped; /* extern: файл >256 КБ обрезан до MAX_FILE при загрузке */ - -/* cur_seg_off/cur_rec (near-состояние индексатора) — в mdview2_index.c. */ -uint8_t cur_page = 0xFF; /* extern: 0xFF = в W3 ещё не показана ни одна страница (extern: кодек инвалидирует) */ -uint8_t viewport_x; /* extern: горизонтальный сдвиг для nowrap-строк */ -char filename[64]; /* extern: статус-бар */ - -/* Прогрессивная загрузка: рисуем первый экран и пускаем скролл, пока - * index_lines() ещё досканирует файл (кооперативно, без прерываний). */ -uint8_t g_view = VIEW_MD; /* extern: активный режим просмотра (существует даже когда доступен только MD режим) */ -#if WITH_RAW -uint8_t g_ready; /* extern: 1 когда первичный документ построен — F2 (RAW) рабочий */ -static uint8_t g_raw_last = VIEW_RAW_WRAP; /* последний под-режим RAW (возврат по F2) */ -#if WITH_HEX -static uint8_t g_hex_last = VIEW_MD; /* вид, из которого вошли в HEX (возврат по F4) */ -#endif -#endif -uint8_t g_loading; /* extern: 1 во время видимой индексации (build_doc) */ -static uint8_t g_first_drawn; /* первый экран уже нарисован */ -uint8_t g_f8_enabled; /* extern: можно ли сейчас переключать кодировку */ -static uint8_t g_utf_failed; /* UTF-8 набор не удалось построить (нет EMM) — пропускаем UTF-8 в цикле F8 */ -uint8_t g_bg_building; /* extern: 1 во время фонового index_step — гасит спиннер индексатора */ -static uint8_t g_bg_doc = 0xFF; /* слот, строящийся в фоне (bg_step); 0xFF = фоновой сборки нет */ -uint8_t g_abort; /* extern: F10/Esc во время загрузки → прервать индексацию */ -static uint16_t g_last_prog; /* n_lines на последнем обновлении статуса */ - -/* Кодировки (ENC_*) и g_encoding — в mdview2.h / mdview2_enc.c. */ -const uint8_t *g_remap; /* extern: активная таблица ремапа (CP1251/KOI8), 0 = без ремапа (CP866)*/ -uint8_t g_scratch_phys; /* extern: EMM-страница под ремап-буфер строки для win_rest */ -static uint8_t g_scratch_blk; /* handle scratch-блока: нужен для освобождения при exit */ - -/* UTF-8 набор (utf_blk/utf_pages/utf_phys/utf_size/utf_avail, конвертер и его - * состояние) — в mdview2_enc.c; разделяемые символы и API — в mdview2.h. - * build_doc() ниже перенаправляет живой file_* на utf_phys и оркеструет - * инкрементальную конвертацию (utf_conv_reset/utf_convert_more). */ - -/* Снимок исходного (8-битного) файлового буфера — набор DOC_8BIT читает его - * как есть, набор DOC_UTF8 читает utf_phys. */ -static uint8_t orig_file_blk; -uint8_t orig_file_pages; /* extern: читает кодек (utf_alloc) */ -uint32_t orig_file_size; /* extern: читает кодек (utf_convert_more) */ -uint8_t orig_file_phys[MAX_PAGES]; /* extern: читает кодек (cv_read) */ - -/* ----------------- Два сосуществующих набора индекс/кэш ----------------- - * DOC_8BIT — исходные байты (CP866/CP1251/KOI8R, различаются ремапом на - * отрисовке); DOC_UTF8 — UTF-8, декодированный в CP866. Оба строятся eager - * при старте (кооперативно), поэтому F8 переключает активный набор мгновенно. - * fb()/idx/cache-аксессоры работают по «живым» глобалам; doc_switch() свапает - * их с сохранённой копией нужного набора. */ -typedef struct { - uint8_t built; - uint8_t enc; /* кодировка отображения этого набора */ - uint8_t file_blk, file_pages; - uint32_t file_size; - uint8_t file_phys[MAX_PAGES]; - uint8_t index_blk, index_pages, index_truncated; - uint16_t n_lines, max_lines; - uint8_t index_phys[MAX_INDEX_PAGES]; - uint8_t cache_dir_blk, cache_dir_pages; - uint8_t cache_dir_phys[MAX_CACHE_DIR_PAGES]; - uint8_t cache_content_n_pages, cache_cur_page_idx; - uint16_t cache_cur_off; - uint8_t cache_content_blk[MAX_CACHE_CONTENT_PAGES]; - uint8_t cache_content_phys[MAX_CACHE_CONTENT_PAGES]; - uint16_t top_line; - uint8_t viewport_x; -} docset_t; - -#define DOC_8BIT 0 -#define DOC_UTF8 1 -static docset_t g_doc[2]; /* built=0 для обоих: _DATA зануляется в crt0 gsinit - * (с 2026-07-04), явный {0}-инициализатор больше - * не нужен — он стоил ~260 байт _INITIALIZER */ -static uint8_t g_active_doc = DOC_8BIT; /* какой набор сейчас в живых глобалах */ -static uint8_t g_disp_doc = DOC_8BIT; /* какой набор показан пользователю */ - -static void doc_switch(uint8_t target); /* forward (нужна в progress_tick) */ - -/* Статус-бар, меню и спиннер — в mdview2_status.c. */ - -/* ================================================================== - * Примитивы экрана, доступ к EMM/окну W3 (fb/win_rest), палитра - * ================================================================== */ - -/* Печатает строку с указанным атрибутом, начиная с позиции (x,y), - * и останавливается на конце строки или правой границе экрана. - * `s` — литерал/статический буфер (CODE/DATA, окна 1/2), поэтому его - * можно передать в BIOS LP_PRINT_LN напрямую, без промежуточной копии. */ -void put_str_attr(uint8_t x, uint8_t y, const char *s, uint8_t attr) -{ - uint8_t len = (x < SCREEN_W) ? (uint8_t)(SCREEN_W - x) : 0; - len = min(len, strlen(s)); - if (len == 0) return; - bios_set_place(y, x); - bios_writeattr_until(s, len, attr, 0); -} - - -/* Полностью очищает указанную строку экрана символами пробела с attr. */ -void fill_row(uint8_t y, uint8_t attr) -{ - bios_clearwin(y, 0, 1, SCREEN_W, attr); -} - -/* Процент 0..100 = num*100/den на чистой 16-битной арифметике — чтобы НЕ - * тянуть 32-битное деление __divulong (~760 Б) ради показа процента в статусе. - * Оба вызова (MD/RAW) дают операнды, влезающие в 16 бит (≤18432 и ≤1024), - * переполняет только *100 — поэтому масштабируем оба вниз, пока num*100 не - * влезёт в uint16, затем считаем долю циклом-вычитанием (без div-хелпера). - * Инвариант вызовов: num ≤ den; результат всё равно ограничен 100. */ -uint8_t pct16(uint16_t num, uint16_t den) -{ - if (den == 0) return 0; - while (num > 655) { num >>= 1; den >>= 1; } /* num*100 ≤ 65500 < 65536 */ - if (den == 0) return 100; /* страховка от num>den */ - uint16_t n = (uint16_t)(num * 100u); - uint8_t p = 0; - while (n >= den && p < 100) { n = (uint16_t)(n - den); p++; } - return p; -} - - -/* Отображает указанную EMM-страницу файла в окно W3. - * Если эта страница уже активна, переключение не выполняется. */ -// static inline void map_page(uint8_t page) -// { -// if (page != cur_page) { -// /* file_phys[] позволяет не вызывать mem_get_page() на каждом свопе. */ -// sprinter_page_w3(file_phys[page]); -// cur_page = page; -// } -// } - - -/* Читает один байт логического файла по смещению p. - * При переходе между страницами автоматически переключает W3. - * Проверка границ выполняется вызывающей стороной. - * - * Эквивалент C-кода (оставлен для справки): - * uint8_t *pb = (uint8_t *)&p; - * uint8_t page = (pb[1] >> 6) | (pb[2] << 2); - * uint16_t off = ((pb[1] & 0x3F) << 8) | pb[0]; - * map_page(page); // if (page!=cur_page){cur_page=page; OUT W3,file_phys[page];} - * return FILE_BUF[off]; // *(0xC000 + off) - * - * Ручной asm — это горячая примитивная операция (вызывается сотни тысяч раз - * при индексации 50КБ-файла); C-версия тратила вызов функции + 32-битную - * арифметику на КАЖДЫЙ байт. Раскладка __sdcccall(1): аргумент uint32_t в - * HLDE (E=pb[0], D=pb[1], L=pb[2], H=pb[3] — проверено sdcc -S), возврат - * char в A. Координация маппинга с bank_read/bank_write держится на том, - * что _io_page_w3 — это ПОРТ (__sfr 0xE2): здесь пишем его через OUT, - * bank_read читает через IN — общий аппаратный регистр, без теневой RAM. - * NB: __naked обязателен (внутри собственный ret); IX/IY не трогаем - * (callee-saved), BC/DE/HL/AF — caller-saved, можно клобберить. */ -char fb(uint32_t p) __naked -{ - (void)p; /* p = HLDE; доступ только из asm */ - __asm - ; off -> BC = 0xC000 + ((pb[1]&0x3F)<<8 | pb[0]) ; D=pb[1], E=pb[0] - ld a, d - or a, #0xC0 ; (D|0xC0) == (D&0x3F)|0xC0 — старший байт окна W3 - ld b, a - ld c, e ; C = pb[0] - - ; page = (pb[1]>>6) | (pb[2]<<2) ; L=pb[2] - ld a, l - add a, a - add a, a ; A = pb[2]<<2 - ld e, a ; E свободен (pb[0] уже сохранён в C) - - ld a, d - rlca - rlca - and a, #0x03 ; A = pb[1]>>6 - or a, e ; A = page - ld e, a ; E = page - - ; map_page(page) - ld a, (_cur_page) - cp e - jr Z, fb_same - ld a, e - ld (_cur_page), a - ld hl, #_file_phys - ld d, #0x00 - add hl, de ; hl = &file_phys[page] - ld a, (hl) - out (#0xE2), a ; OUT PORT_PAGE_W3 (== _io_page_w3 sfr) - fb_same: - ld a, (bc) ; A = *(0xC000 + off) - ret - __endasm; -} - -/* ESTEX WINREST (5Ah, RST 0x10) — копирует готовый буфер (char,attr) - * из смещения `off` ВНУТРИ EMM-страницы `page` прямо в текстовое окно - * экрана, минуя любые BIOS print-вызовы. Формат буфера подтверждён - * эмпирически в MAME (см. memory/sprinter_winrest_format.md и - * tests/winrest/winrest.c): пары (char,attr) по ячейкам, по строкам, - * шаг строки = width*2, без паддинга. row/col — левый верхний угол - * вывода на экране, h/w — высота/ширина в символах. - * - * Регистровая раскладка SDCC __sdcccall(1) для (row,col,h,w,page,off) - * проверена через `sdcc -S` (пробный non-naked враппер): A=row, L=col, - * стек [SP+2]=h [SP+3]=w [SP+4]=page [SP+5..6]=off (little-endian). - * - * История: до 2026-06-23 `off` не было — IX всегда указывал на самое - * начало страницы (#0xC000), это работало только пока в кэше было - * РОВНО ОДНА запись на странице со смещением 0 (Фаза 1 self-test). - * Когда Фаза 2 начала пакетировать много строк на одной странице с - * РАЗНЫМИ off, всё стало читать с начала страницы (т.е. контент первой - * записи) независимо от реальной строки — добавлен off, IX = 0xC000+off. */ -void win_rest(uint8_t row, uint8_t col, uint8_t h, uint8_t w, uint8_t page, uint16_t off) __naked -{ - (void)row; (void)col; (void)h; (void)w; (void)page; (void)off; - __asm - ld iy, #2 - add iy, sp - ld d, a ; D = row - ld e, l ; E = col - push ix ; сохранить IX вызывающей функции (callee-saved) - ld l, 3 (iy) ; off (младший байт), SP+5 - ld h, 4 (iy) ; off (старший байт), SP+6 - ld bc, #0xC000 - add hl, bc - push hl - pop ix ; IX = 0xC000 + off - ld h, 0 (iy) ; H = height - ld a, 1 (iy) ; width -> L - ld l, a - ld a, 2 (iy) ; page -> B - ld b, a - ld c, #0x5A ; ESTEX WINREST - di - rst #0x10 - ei - pop ix ; восстановить IX вызывающей функции - pop hl ; адрес возврата - inc sp - inc sp - inc sp - inc sp - inc sp ; снять h,w,page,off (1+1+1+2 байт) со стека - jp (hl) - __endasm; -} - -/* Char-хелперы, idx_get/idx_put/seg_off, set_*_cur — в mdview2_index.c. */ - -/* Загружает 16 текстовых атрибутов в палитры ink/paper/blink. */ -static void set_pallete(void) { - uint8_t buff[64]; - for(int i = 0; i < 16; i++) { - for(int j = 0; j < 16; j++) { - buff[j * 4] = md_pallete[i * 4]; - buff[j * 4 + 1] = md_pallete[i * 4 + 1]; - buff[j * 4 + 2] = md_pallete[i * 4 + 2]; - buff[j * 4 + 3] = md_pallete[i * 4 + 3]; - } - - text_pal_load(TEXT_PAL_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_BLINK_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_PAPER, i * 16, 16, buff); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16, 8, buff + 32); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16 + 8, 8, buff + 32); - } -} - -/* ================================================================== - * Загрузка/выгрузка файла - * ================================================================== */ - -/* Загружает исходные байты файла в EMM-страницы (без индекса/кэша — те - * выделяются отдельно на КАЖДЫЙ набор через alloc_set_storage()). - * Возврат: 0 — успех, отрицательное значение — код ошибки. */ -static int load_file(const char *path) -{ - int fd = open(path, O_RDONLY); - if (fd < 0) - return -1; - - long sz = lseek(fd, 0, SEEK_END); - if (sz < 0) { - close(fd); - return -2; - } - /* Файл больше MAX_FILE (256 КБ) не отвергаем, а КЛАМПим: читаем первые - * 256 КБ, индексатор допишет строку-предупреждение (TRUNC_FILE). */ - g_file_clamped = 0; - if ((uint32_t)sz > MAX_FILE) { - sz = (long)MAX_FILE; - g_file_clamped = 1; - } - - file_size = (uint32_t)sz; - lseek(fd, 0, SEEK_SET); - - /* Выделяем ровно столько EMM-страниц, сколько нужно под файл. */ - file_pages = (uint8_t)((file_size + PAGE_SIZE - 1u) / PAGE_SIZE); - if (file_pages == 0) file_pages = 1; - file_blk = mem_alloc_pages(file_pages); - if (file_blk == 0) { - close(fd); - return -3; - } - - /* Читаем файл кусками по 16 КБ, последовательно маппя страницы в W3. - * На последней итерации читаем остаток меньше PAGE_SIZE. */ - uint32_t remaining = file_size; - for (uint8_t page = 0; page < file_pages; page++) { - spinner_tick(); - uint8_t phys = mem_get_page(file_blk, page); - file_phys[page] = phys; - sprinter_page_w3(phys); - cur_page = page; - uint16_t chunk = (remaining > PAGE_SIZE) - ? (uint16_t)PAGE_SIZE - : (uint16_t)remaining; - int n = read(fd, FILE_BUF, chunk); - if (n != (int)chunk) { - close(fd); - return -4; - } - remaining -= chunk; - } - close(fd); - return 0; -} - -/* Выделяет в живые глобалы блок индекса + директорию рендер-кэша под текущий - * набор. file_pages должно быть уже выставлено (размер набора). Сбрасывает - * пул контента в пустое состояние (страницы доращиваются лениво при рендере). - * Возврат: 0 — успех, -5/-6 — нехватка EMM. */ -static int alloc_set_storage(void) -{ - uint8_t want; - - want = (uint8_t)((file_pages >> 1) + 1u); - if (want > MAX_INDEX_PAGES) want = MAX_INDEX_PAGES; - index_blk = mem_alloc_pages(want); - if (index_blk == 0) return -5; - index_pages = want; - for (uint8_t i = 0; i < index_pages; i++) - index_phys[i] = mem_get_page(index_blk, i); - max_lines = (uint16_t)index_pages * INDEX_RECS_PER_PAGE; - - want = (uint8_t)((file_pages >> 1) + 1u); - if (want > MAX_CACHE_DIR_PAGES) want = MAX_CACHE_DIR_PAGES; - cache_dir_blk = mem_alloc_pages(want); - if (cache_dir_blk == 0) return -6; - cache_dir_pages = want; - for (uint8_t i = 0; i < cache_dir_pages; i++) - cache_dir_phys[i] = mem_get_page(cache_dir_blk, i); - - cache_content_n_pages = 0; - cache_cur_page_idx = 0; - cache_cur_off = 0; - return 0; -} - -static void doc_save_live(uint8_t i); /* forward */ - -/* Освобождает все EMM-блоки обоих наборов (индекс/директория/пул контента) - * плюс два файловых буфера (исходный 8-битный и UTF-8). */ -static void unload_file(void) -{ - doc_save_live(g_active_doc); /* зафиксировать живой набор в g_doc */ - for (uint8_t s = 0; s < 2; s++) { - docset_t *d = &g_doc[s]; - if (d->index_blk) { mem_free_block(d->index_blk); d->index_blk = 0; } - if (d->cache_dir_blk) { mem_free_block(d->cache_dir_blk); d->cache_dir_blk = 0; } - for (uint8_t i = 0; i < d->cache_content_n_pages; i++) - if (d->cache_content_blk[i]) mem_free_block(d->cache_content_blk[i]); - d->cache_content_n_pages = 0; - } - if (orig_file_blk) { mem_free_block(orig_file_blk); orig_file_blk = 0; } - if (utf_blk) { mem_free_block(utf_blk); utf_blk = 0; } - if (g_scratch_blk) { mem_free_block(g_scratch_blk); g_scratch_blk = 0; } - file_blk = 0; -} - -/* Парсер/индексатор (classify_line, scan_join_stream, inline_scan, index_lines, emph_to_attr) — в mdview2_index.c. */ - - -/* Таблицы ремапа, set_encoding, кодировки и UTF-8 конвертер — в mdview2_enc.c. */ - -/* ================================================================== - * Наборы документа (doc-slots): сохранение/свап - * ================================================================== - * Два сосуществующих набора (DOC_8BIT / DOC_UTF8) живут как копии всего - * состояния (file/index/cache/позиция) в g_doc[]; «живые» глобалы — это - * активный набор. doc_save_live: живые → g_doc[i]; doc_load_live: g_doc[i] - * → живые (+ инвалидация маппинга fb() и активной кодировки). */ -static void doc_save_live(uint8_t i) -{ - docset_t *d = &g_doc[i]; - d->enc = g_encoding; - d->file_blk = file_blk; d->file_pages = file_pages; d->file_size = file_size; - memcpy(d->file_phys, file_phys, MAX_PAGES); - d->index_blk = index_blk; d->index_pages = index_pages; d->index_truncated = index_truncated; - d->n_lines = n_lines; d->max_lines = max_lines; - memcpy(d->index_phys, index_phys, MAX_INDEX_PAGES); - d->cache_dir_blk = cache_dir_blk; d->cache_dir_pages = cache_dir_pages; - memcpy(d->cache_dir_phys, cache_dir_phys, MAX_CACHE_DIR_PAGES); - d->cache_content_n_pages = cache_content_n_pages; - d->cache_cur_page_idx = cache_cur_page_idx; d->cache_cur_off = cache_cur_off; - memcpy(d->cache_content_blk, cache_content_blk, MAX_CACHE_CONTENT_PAGES); - memcpy(d->cache_content_phys, cache_content_phys, MAX_CACHE_CONTENT_PAGES); - d->top_line = top_line; d->viewport_x = viewport_x; -} - -static void doc_load_live(uint8_t i) -{ - docset_t *d = &g_doc[i]; - file_blk = d->file_blk; file_pages = d->file_pages; file_size = d->file_size; - memcpy(file_phys, d->file_phys, MAX_PAGES); - index_blk = d->index_blk; index_pages = d->index_pages; index_truncated = d->index_truncated; - n_lines = d->n_lines; max_lines = d->max_lines; - memcpy(index_phys, d->index_phys, MAX_INDEX_PAGES); - cache_dir_blk = d->cache_dir_blk; cache_dir_pages = d->cache_dir_pages; - memcpy(cache_dir_phys, d->cache_dir_phys, MAX_CACHE_DIR_PAGES); - cache_content_n_pages = d->cache_content_n_pages; - cache_cur_page_idx = d->cache_cur_page_idx; cache_cur_off = d->cache_cur_off; - memcpy(cache_content_blk, d->cache_content_blk, MAX_CACHE_CONTENT_PAGES); - memcpy(cache_content_phys, d->cache_content_phys, MAX_CACHE_CONTENT_PAGES); - top_line = d->top_line; viewport_x = d->viewport_x; - cur_page = 0xFF; /* следующий fb() пере-смаппит страницу */ - set_encoding(d->enc); -} - -static void doc_switch(uint8_t target) -{ - if (target == g_active_doc) - return; - doc_save_live(g_active_doc); - doc_load_live(target); - g_active_doc = target; -} - -/* Автоопределение/имя кодировки, ремап-вывод и UTF-8→CP866 конвертер — в mdview2_enc.c. */ - -/* Отрисовка области/статус-бара/меню и прокрутка — в модуле mdview2_md.c. */ - - - -/* ================================================================== - * Прогрессивная загрузка и диспетчер клавиш (MD) - * ================================================================== - * index_lines() строит индекс кооперативно и периодически зовёт - * progress_tick(): тот рисует первый готовый экран, крутит спиннер и - * обрабатывает клавиши на лету (load_key). Диалог справки (F1) — в - * mdview2_help.c, RAW-навигация — в mdview2_raw.c. */ - -/* Обработка клавиши во время прогрессивной загрузки: скролл строго в - * пределах готовых строк (drawable_lines); End = последняя готовая страница; - * F1 = справка (show_help сам блокирует и перерисовывает). */ -static void load_key(uint16_t k) -{ - uint8_t ascii = (uint8_t)(k & 0xFF); - uint8_t scan = (uint8_t)((k >> 8) & 0x7F); - uint16_t dr = drawable_lines(); - uint16_t maxtop = (dr > VIEW_H) ? (uint16_t)(dr - VIEW_H) : 0; - uint16_t nt = top_line; - - if (ascii == 0x1B || scan == KEY_F10) { - g_abort = 1; - return; - } /* Esc/F10 → выход */ - if (ascii) - return; /* прочие ascii игнорируем */ - - switch (scan) { - case KEY_UP: - nt = (top_line >= 1) ? (uint16_t)(top_line - 1) : 0; - break; - case KEY_DOWN: - nt = top_line + 1; - break; - case KEY_PGUP: - nt = (top_line >= VIEW_H) ? (uint16_t)(top_line - VIEW_H) : 0; - break; - case KEY_PGDN: - nt = top_line + VIEW_H; - break; - case KEY_HOME: - top_line = 0; - viewport_x = 0; - draw_viewport_from_cache(); - render_md_status_numbers(); - return; - case KEY_END: - top_line = maxtop; - viewport_x = 0; - draw_viewport_from_cache(); - render_md_status_numbers(); - return; - case KEY_LEFT: - md_scroll_horizon(-(int8_t)HPAN_STEP); - render_md_status_numbers(); - return; - case KEY_RIGHT: - md_scroll_horizon(+(int8_t)HPAN_STEP); - render_md_status_numbers(); - return; - case KEY_F1: - show_help(); - return; - case KEY_F8: - /* во время сборки крутим ТОЛЬКО 8-бит и только если набор 8-битный - * (ремап на отрисовке; индексация не зависит от кодировки) */ - if (g_f8_enabled && g_active_doc == DOC_8BIT) { - uint8_t nx = (g_encoding == ENC_CP866) ? ENC_CP1251 : - (g_encoding == ENC_CP1251) ? ENC_KOI8R : ENC_CP866; - set_encoding(nx); - g_doc[DOC_8BIT].enc = nx; - draw_viewport_from_cache(); - render_full_status(); - } - return; - default: - return; - } - - if (nt > maxtop) - nt = maxtop; - if (nt != top_line) { - top_line = nt; - draw_viewport_from_cache(); - render_md_status_numbers(); - } -} - -/* Кооперативный «тик» прогрессивной загрузки — вызывается из index_lines(). */ -void progress_tick(void) -{ -#if WITH_RAW - /* В RAW-режиме буфер документа готов сразу после конвертации (до индекса), - * поэтому первый экран RAW можно показать немедленно — рисуем raw_draw, а - * не MD-вид (иначе мелькал бы MD). Индекс при этом строится дальше (нужен - * для MD-вида). */ - if (g_view != VIEW_MD) { -#if WITH_HEX - if (g_view == VIEW_HEX) { /* HEX показывает оригинал — экран уже актуален */ - spinner_tick(); - return; - } -#endif - if (!g_first_drawn) { - raw_draw(); - // render_raw_status(); - g_first_drawn = 1; - cur_page = 0xFF; /* raw_draw сбил W3-маппинг, на который опирается fb() */ - } - spinner_tick(); - return; - } -#endif - /* Прогрессивная отрисовка строящегося (всегда показываемого) набора. */ - uint8_t touched = 0; - if (!g_first_drawn && drawable_lines() >= VIEW_H) { - draw_viewport_from_cache(); - render_md_status_numbers(); - g_first_drawn = 1; - touched = 1; - } - if (n_lines >= (uint16_t)(g_last_prog + 10)) { - g_last_prog = n_lines; - spinner_tick(); - if (g_first_drawn) - render_md_status_numbers(); - touched = 1; - } - if (g_first_drawn && kbhit()) { - load_key(getkey()); - touched = 1; - } - /* Отрисовка/WINREST/BIOS могли сбить маппинг W3, на который опирается fb() - * при индексации → форсируем ре-маппинг страницы файла на следующем fb(). */ - if (touched) - cur_page = 0xFF; -} - -/* ================================================================== - * Точка входа - * ================================================================== */ - -/* Строит набор `slot` кооперативно (index_step + progress_tick). - * visible=1 — первичный (показываемый): прогрессивная отрисовка первого экрана - * и скролл по готовым строкам. visible=0 — вторичный: индексация идёт в живых - * глобалах, а progress_tick через свап показывает/листает уже готовый - * g_disp_doc. Возврат: 0 — успех, <0 — нехватка EMM (-5/-6/-7). - * - * Если slot прямо сейчас строится ФОНОМ (g_bg_doc, см. bg_step ниже) — - * не начинаем заново, а ДОКРУЧИВАЕМ: загружаем частично построенный набор - * и продолжаем с сохранённой позиции индексатора (его межшаговое состояние - * живёт в статиках модуля index и переживает свапы наборов). - * - * UTF-8 набор конвертируется ИНКРЕМЕНТАЛЬНО: выделяем страницы, переключаем - * живой буфер на utf и запускаем конвертацию первого чанка; дальше index_step - * докручивает её впереди позиции чтения (g_utf_building). Конвертер читает - * оригинал из orig_file_phys[] через cv_read (не через fb, который теперь - * указывает на utf). */ -/* Настраивает живые глобалы под сборку набора slot: файловый буфер (utf/orig), - * индекс + директория кэша, сброс индексатора. Общая часть build_doc и - * bg_build_start. Возврат: 0 — успех, <0 — нехватка EMM (-5/-6/-7). */ -static int doc_setup(uint8_t slot) -{ - if (slot == DOC_UTF8) { - if (!utf_avail) { /* первый вход: выделить страницы */ - if (!utf_alloc()) - return -7; /* выделяет страницы + сбрасывает конвертер */ - utf_avail = 1; - } - file_blk = utf_blk; - file_pages = utf_pages; - memcpy(file_phys, utf_phys, MAX_PAGES); - if (g_utf_building) { - file_size = 0; - cur_page = 0xFF; - utf_convert_more(CONV_MARGIN); /* первый чанк — для первого экрана */ - } else { - file_size = utf_size; - } - } else { - file_blk = orig_file_blk; - file_pages = orig_file_pages; - file_size = orig_file_size; - memcpy(file_phys, orig_file_phys, MAX_PAGES); - } - cur_page = 0xFF; - - int rc = alloc_set_storage(); - if (rc < 0) - return rc; - index_begin(); - return 0; -} - -static int build_doc(uint8_t slot, uint8_t enc, uint8_t visible) -{ - if (g_bg_doc == slot) { /* фон уже строит его — продолжить */ - doc_load_live(slot); - g_bg_doc = 0xFF; - } else { - int rc = doc_setup(slot); - if (rc < 0) - return rc; - } - - set_encoding(enc); - top_line = 0; - viewport_x = 0; - g_active_doc = slot; - if (visible) { - g_disp_doc = slot; - g_first_drawn = 0; - status_encoding(); /* показать кодировку сразу (детект/F8), не дожидаясь индексации */ - cur_page = 0xFF; /* BIOS-вывод мог сбить W3-маппинг, на который опирается fb() */ - } - - g_loading = 1; - g_last_prog = 0; - while (!index_step(255)) {} - g_loading = 0; - - /* Зафиксировать конвертацию (на случай обрыва индекса по max_lines до конца - * исходника) — иначе g_utf_building остался бы 1 и сломал бы следующую сборку. */ - if (g_utf_building) { - utf_size = file_size; - g_utf_building = 0; - } - - g_doc[slot].built = 1; - doc_save_live(slot); - return 0; -} - -/* ================================================================== - * Фоновая сборка второго набора (idle-time, между клавишами) - * ================================================================== - * Пока пользователь читает документ, главный цикл в паузах между клавишами - * докручивает индексацию второго набора (UTF-8 при 8-битном первичном и - * наоборот) порциями index_step: свап на bg-набор → несколько итераций → - * свап обратно. Экран при этом не трогается (g_bg_building гасит спиннер), - * задержка реакции на клавишу — не больше одного шага. По готовности F8 - * переключает наборы мгновенно; F8 ДО готовности докручивает сборку видимо - * (ветка resume в build_doc), не начиная её заново. */ - -#define BG_STEP_BUDGET 2u /* итераций индексатора на idle-шаг: латентность клавиши - * = длительность шага (~единицы мс на обычном абзаце) */ -#define BG_KEY_HOLDOFF 300u /* пустых опросов kbhit после клавиши до возобновления - * фона — при автоповторе (скролл) фон не вклинивается */ - -/* Готовит фоновую сборку второго набора: настраивает живые глобалы (буфер, - * индекс, кэш, index_begin) так же, как build_doc, но БЕЗ индексации, и - * возвращает живым прежний набор. При нехватке EMM фон просто не стартует — - * остаётся сегодняшний ленивый путь по F8. */ -static void bg_build_start(void) -{ - uint8_t slot = (uint8_t)((g_active_doc == DOC_8BIT) ? DOC_UTF8 : DOC_8BIT); - uint8_t vis = g_active_doc; - if (g_doc[slot].built || (slot == DOC_UTF8 && g_utf_failed)) - return; /* строить нечего */ - - doc_save_live(vis); - if (doc_setup(slot) < 0) { /* нет EMM — как и в ленивом пути */ - if (slot == DOC_UTF8) g_utf_failed = 1; - doc_load_live(vis); - return; - } - top_line = 0; - viewport_x = 0; - - g_active_doc = slot; /* живые глобалы = bg-набор... */ - doc_switch(vis); /* ...сохранить его и вернуть видимый */ - g_bg_doc = slot; -} - -/* Один idle-шаг фона: свап на строящийся набор, порция индексации, свап - * обратно. Межшаговое состояние индексатора/UTF-конвертера — статики их - * модулей, обработчики клавиш видимого набора их не трогают. По завершении - * финализирует набор (дальше F8 переключается мгновенно). */ -static void bg_step(void) -{ - uint8_t vis = g_active_doc; - doc_switch(g_bg_doc); - g_bg_building = 1; - uint8_t done = index_step(BG_STEP_BUDGET); - g_bg_building = 0; - if (done) { - if (g_utf_building) { /* как build_doc: обрыв индекса до конца исходника */ - utf_size = file_size; - g_utf_building = 0; - } - g_doc[g_bg_doc].built = 1; /* doc_save_live поле built не трогает */ - g_bg_doc = 0xFF; - } - doc_switch(vis); -} - -/* Пропорциональный перенос байт-позиции между буферами разного размера - * (8bit ↔ UTF-8 при F8): off * to / from БЕЗ __mullong/__divulong. Один - * цикл restoring-деления: бит k дроби off/from (сравнение с from/2^k) - * сразу добавляет to/2^k в результат — сумма to/2^k по установленным - * битам и есть off*to/from. Точность from/65536 (≤4 байта на максимальном - * файле); ляжет на границу строки через line_at_off / raw_reanchor. */ -static uint32_t map_off(uint32_t off, uint32_t from, uint32_t to) -{ - if (from == to || from == 0) return off; - uint32_t res = 0; - for (uint8_t i = 0; i < 16; i++) { - from >>= 1; - to >>= 1; - if (off >= from) { off -= from; res += to; } - } - return res; -} - -/* Байт-позиция текущего вида (верх экрана) — единая «валюта» для переноса - * позиции между видами/наборами. Валюта = offset АКТИВНОГО буфера; HEX живёт - * в байтах оригинала, для UTF-набора конвертируем через map_off. */ -static uint32_t view_pos(void) -{ -#if WITH_HEX - if (g_view == VIEW_HEX) - return (g_active_doc == DOC_UTF8) - ? map_off(hex_pos(), orig_file_size, file_size) - : hex_pos(); -#endif -#if WITH_RAW - if (g_view != VIEW_MD) return raw_pos(); -#endif - return seg_off(top_line); -} - -/* Поставить текущий вид на байт-позицию off (активного буфера). */ -static void view_reanchor(uint32_t off) -{ -#if WITH_HEX - if (g_view == VIEW_HEX) { - hex_reanchor((g_active_doc == DOC_UTF8) - ? map_off(off, file_size, orig_file_size) - : off); - return; - } -#endif -#if WITH_RAW - if (g_view != VIEW_MD) { raw_reanchor(off); return; } -#endif - top_line = line_at_off(off); -} - -/* Переключает кодировку на `next` (вызывается из главного цикла по F8). - * 8-бит↔8-бит внутри одного набора — мгновенный ремап; переход в другой набор - * — мгновенный doc_switch, если он построен, иначе ЛЕНИВАЯ сборка по месту - * (со спиннером), результат кэшируется. */ -/* Меняет кодировку: тот же набор — ремап; другой готовый — doc_switch; - * непостроенный — ЛЕНИВАЯ ТИХАЯ сборка (спиннер, без отрисовки документа). - * НЕ перерисовывает документ/статус — это делает вызывающий в своём режиме - * (MD: draw_viewport_from_cache; RAW: raw_draw), чтобы не мелькал чужой вид. */ -static void switch_encoding(uint8_t next) -{ - uint8_t target = (next == ENC_UTF8) ? DOC_UTF8 : DOC_8BIT; - - if (target == g_active_doc) { /* тот же набор — только ремап */ - set_encoding(next); - g_doc[target].enc = next; - } else if (g_doc[target].built) { /* набор готов — мгновенный свап */ - /* Позицию переносим пропорцией байтов (буферы наборов разного - * размера), а не из сохранённой в g_doc копии — иначе каждый набор - * скачет по своей старой позиции. */ - uint32_t old_off = view_pos(); - uint32_t old_size = file_size; - doc_switch(target); - g_disp_doc = target; - set_encoding(next); - g_doc[target].enc = next; - view_reanchor(map_off(old_off, old_size, file_size)); - } else { /* строим набор лениво */ - doc_save_live(g_active_doc); /* сохранить текущий (позиция и т.п.) */ -#if WITH_RAW - uint32_t raw_save = raw_pos(); - if (VIEW_IS_RAW(g_view)) /* HEX показывает оригинал — его позиция инвариантна */ - raw_reanchor(0); /* прогрессивный показ нового буфера — с начала */ - g_ready = 0; - render_menu(); /* идёт индексация — прячем F2 */ -#endif - spinner_show(1); - int rc = build_doc(target, next, 1); /* visible: прогрессивный показ первого экрана - * (progress_tick рисует по текущему виду — MD/RAW) */ - spinner_show(0); -#if WITH_RAW - g_ready = 1; - render_menu(); -#endif - if (rc < 0) { /* нет EMM — откат на текущий набор */ - if (target == DOC_UTF8) - g_utf_failed = 1; - doc_load_live(g_active_doc); -#if WITH_RAW - if (VIEW_IS_RAW(g_view)) - raw_reanchor(raw_save); /* буфер прежний — вернуть позицию RAW */ -#endif - return; - } - g_disp_doc = target; /* build_doc уже выставил active/enc */ - } - clamp_top(); /* привести top_line к новому набору (для MD) */ -} - -/* ================================================================== - * Вывод ошибки - * ================================================================== */ - -static void on_exit(void) { - unload_file(); - pal_reset(PAL_CGA); -} - -int main(int argc, char **argv) -{ - const char *path; - if (argc >= 2) { - path = argv[1]; - } else { - path = "README.MD"; - /* Дефолтный файл отсутствует — выводим подсказку без смены режима экрана. */ - { - int chk = open(path, O_RDONLY); - if (chk < 0) { - // settextmode(TEXT_MODE_80x32); - clrscr_attr(ATTR_TEXT); - cputs("MDView v0.3 -- Markdown Viewer for Sprinter\r\n" \ - "(c) 2026 Petrov A.G.\r\n\r\n" \ - "Usage: mdview2 \r\n" \ - " Displays a Markdown document (CP866/CP1251/KOI8R/UTF8, up to 128 KB).\r\n"); - exit(-1); - } - close(chk); - } - } - - atexit(on_exit); - - /* Копируем путь в static filename[] для отображения в статус-баре. */ - { - uint8_t i = 0; - while (i < (uint8_t)(sizeof(filename) - 1) && path[i]) { - filename[i] = path[i]; - i++; - } - filename[i] = 0; - } - - /* Сначала поднимаем UI, чтобы пользователь видел шапку/меню/спиннер - * уже во время загрузки файла и построения индекса. */ - settextmode(TEXT_MODE_80x32); - clrscr_attr(ATTR_TEXT); - set_pallete(); - prerender_status(); - render_menu(); - render_full_status(); - render_percent_progress(0); - spinner_show(1); - - int rc = load_file(path); - if (rc < 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: cannot load file '"); - cputs(path); - cputs("'\n\rError: "); - switch (rc) { - case -1: cputs("open failed"); break; - case -2: cputs("seek failed"); break; - case -3: cputs("mem_alloc_pages failed"); break; - case -4: cputs("short read"); break; - case -5: cputs("index alloc failed"); break; - case -6: cputs("render-cache dir alloc failed"); break; - } - cputs("\n\r\n\r"); - exit(-1); - } - /* Scratch-страница под ремап-буфер строки (win_rest_remap). Handle - * сохраняем отдельно: физический номер страницы нельзя передавать - * mem_free_block(), а on_exit() обязан вернуть EMM системе. */ - g_scratch_blk = mem_alloc_pages(1); - if (g_scratch_blk == 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: scratch page allocation failed\n\r"); - exit(-1); - } - g_scratch_phys = mem_get_page(g_scratch_blk, 0); - - /* Оба набора пока не построены (страховка к инициализатору g_doc). */ - g_doc[DOC_8BIT].built = 0; - g_doc[DOC_UTF8].built = 0; - - /* Снимок исходного 8-битного буфера (его читает набор DOC_8BIT). */ - orig_file_blk = file_blk; orig_file_pages = file_pages; orig_file_size = file_size; - memcpy(orig_file_phys, file_phys, MAX_PAGES); - - /* Детекция кодировки по оригиналу. UTF-8 конвертацию НЕ делаем здесь — - * она дорогая (полный проход) и нужна только для UTF-8 набора, который - * строится через build_doc лениво. Так первый экран рисуется по индексации - * первичного набора без лишнего прохода. */ - uint8_t det = detect_encoding(); - - /* Первичный (показываемый) набор — по детекции; второй строится ЛЕНИВО по - * первому F8 (switch_encoding). Во время сборки 8-битного первичного F8 - * разрешён (ремап 8-бит, см. load_key) → показываем метку F8; для UTF-8 - * первичного переключаться пока некуда → метку прячем. */ - uint8_t prim_enc = det; - uint8_t prim_doc = (prim_enc == ENC_UTF8) ? DOC_UTF8 : DOC_8BIT; - g_f8_enabled = (prim_doc == DOC_8BIT); - render_menu(); - - rc = build_doc(prim_doc, prim_enc, 1); /* первичный — видимый */ - if (rc < 0 && prim_doc == DOC_UTF8) { /* UTF-8 не вышел (нет EMM) → 8-бит */ - prim_doc = DOC_8BIT; prim_enc = ENC_CP866; - rc = build_doc(DOC_8BIT, ENC_CP866, 1); - } - if (rc < 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: index/cache alloc failed\n\r\n\r"); - exit(-1); - } - if (g_abort) - exit(0); /* F10/Esc во время загрузки — корректный выход */ - if (n_lines == 0) { - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("mdview: empty file"); - exit(-1); - } - - /* Первичный готов — гасим спиннер, включаем F8 (второй набор дособерётся - * лениво по первому переключению) и рисуем финальный статус с ПОЛНЫМ - * счётчиком строк. */ - spinner_show(0); - g_f8_enabled = 1; -#if WITH_RAW - g_ready = 1; /* документ построен — теперь доступен F2 (RAW) */ -#endif - render_menu(); - clamp_top(); - render_full_status(); - draw_viewport_from_cache(); - - /* Второй набор (UTF-8 при 8-битном первичном и наоборот) готовим фоном - * в паузах между клавишами — к первому F8 он обычно уже построен. */ - bg_build_start(); - - for (;;) { - /* Idle-фон: пока второй набор не достроен, вместо блокирующего getkey - * опрашиваем клавиатуру и тратим паузы на bg_step. Холдаун после - * каждой клавиши: при активном скролле (автоповтор) фон молчит и - * плавность не страдает. После достройки — снова блокирующий getkey. */ - if (g_bg_doc != 0xFF) { - uint16_t idle = 0; - while (!kbhit()) { - if (idle < BG_KEY_HOLDOFF) { - idle++; - continue; - } - bg_step(); - if (g_bg_doc == 0xFF) - break; - } - } - uint16_t k = getkey(); - uint8_t ascii = (uint8_t)(k & 0xFF); - uint8_t scan = (uint8_t)((k >> 8) & 0x7F); - - if (ascii) { - if (ascii == 0x1B) - break; /* клавиша Esc */ - continue; - } - if (scan == KEY_F10) { - break; - } - if (scan == KEY_F1) { - show_help(); - continue; - } /* show_help сам перерисует */ - /* F2 — тумблер RAW ↔ MD (из HEX тоже уводит в MD). - * Рабочий только после постройки документа. */ - if (scan == KEY_F2) { - if (!g_ready) continue; - if (g_view == VIEW_MD) { - g_view = g_raw_last; /* → RAW (последний под-режим) */ - raw_seed_from(top_line); /* позиция из MD */ - raw_screen_init(); - status_encoding(); - render_menu(); - render_raw_status(); - raw_draw(); - } else { - uint32_t off = view_pos(); /* позиция из RAW/HEX */ - if (VIEW_IS_RAW(g_view)) - g_raw_last = g_view; /* запомнить под-режим RAW */ - g_view = VIEW_MD; - top_line = line_at_off(off); - clamp_top(); - render_full_status(); render_menu(); - draw_viewport_from_cache(); - } - continue; - } -#if WITH_HEX - /* F4 — тумблер HEX ↔ прежний вид (MD/RAW). */ - if (scan == KEY_F4) { - if (!g_ready) continue; - uint32_t off = view_pos(); /* позиция текущего вида */ - if (g_view == VIEW_HEX) { /* HEX → прежний вид */ - g_view = g_hex_last; - view_reanchor(off); - if (g_view == VIEW_MD) { - clamp_top(); - render_full_status(); render_menu(); - draw_viewport_from_cache(); - } else { - raw_screen_init(); - status_encoding(); render_menu(); - render_raw_status(); raw_draw(); - } - } else { /* MD/RAW → HEX */ - g_hex_last = g_view; - g_view = VIEW_HEX; - view_reanchor(off); /* active → байты оригинала */ - hex_screen_init(); - status_encoding(); render_menu(); - render_hex_status(); hex_draw(); - } - continue; - } -#endif - /* цикл CP866→CP1251→KOI8R→UTF8→CP866; набор дособерётся лениво */ - if (scan == KEY_F8) { - uint8_t next = (g_encoding == ENC_CP866) ? ENC_CP1251 : - (g_encoding == ENC_CP1251) ? ENC_KOI8R : - (g_encoding == ENC_KOI8R) ? ENC_UTF8 : ENC_CP866; - if (next == ENC_UTF8 && g_utf_failed) - next = ENC_CP866; /* UTF-8 недоступен */ - switch_encoding(next); - if (g_abort) - exit(0); /* Esc/F10 во время ленивой досборки */ - /* Перерисовка — по текущему виду (switch_encoding сам не рисует). */ -#if WITH_HEX - if (g_view == VIEW_HEX) { - status_encoding(); - render_hex_status(); - hex_draw(); /* printable-колонка в новой кодировке */ - continue; - } -#endif -#if WITH_RAW - if (g_view != VIEW_MD) { - status_encoding(); - render_raw_status(); - raw_draw(); - continue; - } -#endif - render_full_status(); - draw_viewport_from_cache(); - continue; - } - switch(g_view) { - case VIEW_MD: - /* MD-режим: F1/F8/F10 здесь, навигация — в md_key() (peer к raw_key). */ - md_key(scan); /* навигация MD (сама рисует+статус); незнакомые игнорит */ - continue; -#if WITH_HEX - case VIEW_HEX: - hex_key(scan); /* навигация HEX (сама рисует+процент) */ - continue; -#endif -#if WITH_RAW - case VIEW_RAW_WRAP: - case VIEW_RAW_HSCROLL: - /* RAW-режим: F3 Wrap/Unwrap, своя навигация; F8 — кодировка; F1/F10. */ - /* Wrap ↔ Unwrap */ - if (scan == KEY_F3) { - g_view = (g_view == VIEW_RAW_WRAP) ? VIEW_RAW_HSCROLL : VIEW_RAW_WRAP; - g_raw_last = g_view; - raw_renorm(); - raw_screen_init(); - render_menu(); - render_raw_status(); - raw_draw(); - continue; - } - raw_key(scan); - continue; -#endif /* WITH_RAW */ - default: - break; - } - } - clrscr_attr(ATTR_TEXT); - exit(0); - return 0; -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2.h b/applications/Volkov/tests/fixtures/mdview2/mdview2.h deleted file mode 100644 index 1c53d6f..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - * mdview2.h — общие определения и интерфейс между модулями mdview2. - * - * Монолит mdview2.c расщеплён на ядро + модули: index (парсер), md/raw (виды), - * enc (кодировки), table, help. Здесь — разделяемые константы экрана/атрибутов, - * словари флагов/стилей, тип cache_rec_t, extern-объявления разделяемого - * состояния ядра и API каждого модуля (сгруппированы по секциям ниже). - */ -#ifndef MDVIEW2_H -#define MDVIEW2_H - -#include -#include /* COLOR(), COLOR_* */ -#include "mdview2_conf.h" /* WITH_RAW / WITH_HEX — выбор опциональных модулей */ - -/* ---- Геометрия экрана -------------------------------------------- */ -#define SCREEN_W 80 -#define SCREEN_H 32 -#define VIEW_TOP_ROW 1 -#define VIEW_H 30 /* видимая область: строки 1..30 включительно */ -#define MENU_ROW 31 -#define TAB_STOP 4 -#define HPAN_STEP 8u /* шаг горизонтального сдвига (←/→) */ - -/* ---- Геометрия статус-бара (строка 0): фиксированные поля и разделители ---- */ -#define SPINNER_COL 8 /* слот спиннера загрузки */ -#define DIV1_X 45 /* разделитель │ перед числами диапазона строк */ -#define DIV2_X 71 /* разделитель │ перед процентом */ -/* Числа/метка пишутся с DIVn_X+2; область между разделителями — [DIV1_X+1 .. DIV2_X-1]. */ - -/* ---- Параметры файла и памяти ------------------------------------ */ -#define PAGE_BITS 14u -#define PAGE_SIZE (1u << PAGE_BITS) /* размер EMM-страницы: 16 КБ */ -#define PAGE_MASK ((uint16_t)(PAGE_SIZE - 1u)) -#define MAX_PAGES 16 /* 16 страниц × 16 КБ = 256 КБ */ -#define MAX_FILE ((uint32_t)MAX_PAGES * PAGE_SIZE) -#define FILE_BUF ((char *)0xC000) /* окно W3, куда мапится текущая EMM-страница */ - -/* ---- Палитра атрибутов ------------------------------------------- */ -#define ATTR_RESET COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_TEXT COLOR(COLOR_LIGHTGRAY, COLOR_BLUE) -#define ATTR_TEXT_TITLE1 COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_TEXT_TITLE2 COLOR(COLOR_LIGHTBLUE, COLOR_BLUE) -#define ATTR_TEXT_TITLE3 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_TITLE4 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_BOLD COLOR(COLOR_LIGHTRED, COLOR_BLUE) -#define ATTR_TEXT_ITALIC COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_UNDERSORE COLOR(COLOR_LIGHTMAGENTA, COLOR_BLUE) -#define ATTR_TEXT_CODE COLOR(COLOR_WHITE, COLOR_BLUE) -#define ATTR_TEXT_STRIKE COLOR(COLOR_DARKGRAY, COLOR_BLUE) -#define ATTR_LIST_MARKER COLOR(COLOR_LIGHTCYAN, COLOR_BLUE) -#define ATTR_QUOTE_MARKER COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_HR COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_BOX COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_TRUNC COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_BAR COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_BAR_SPINNER COLOR(COLOR_WHITE, COLOR_LIGHTCYAN) -#define ATTR_MENU_T COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_MENU_K COLOR(COLOR_YELLOW, COLOR_BLACK) -#define ATTR_WARN COLOR(COLOR_YELLOW, COLOR_RED) /* строка-обрыв (исчерпан кэш/лимит) */ - -/* ---- Атрибуты диалога справки ------------------------------------ */ -#define ATTR_HELP_BG COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_HELP_BDR COLOR(COLOR_WHITE, COLOR_BLACK) -#define ATTR_HELP_TIT COLOR(COLOR_YELLOW, COLOR_BLACK) -#define ATTR_HELP_HDR COLOR(COLOR_WHITE, COLOR_BLACK) - -/* ---- Режимы просмотра -------------------------------------------- */ -#define VIEW_MD 0 /* markdown с форматированием (по умолчанию) */ -#define VIEW_RAW_WRAP 1 /* RAW: длинные строки переносятся кратно 80 */ -#define VIEW_RAW_HSCROLL 2 /* RAW: длинные строки в одну, гориз. скролл */ -#define VIEW_HEX 3 /* HEX-дамп оригинального файла */ -#define VIEW_IS_RAW(v) ((v) == VIEW_RAW_WRAP || (v) == VIEW_RAW_HSCROLL) - -/* ---- Кодировки --------------------------------------------------- */ -/* 8-битные (CP866/CP1251/KOI8R) различаются только ремапом глифов [128-255] - * на отрисовке; UTF-8 — отдельный декодированный набор. */ -#define ENC_CP866 0 -#define ENC_CP1251 1 -#define ENC_KOI8R 2 -#define ENC_UTF8 3 -#define ENC_UNSUPPORTED -1 /* UTF16 / UTF32 */ -#define CONV_MARGIN 4096u /* на сколько байт держать UTF-конвертацию впереди индексатора */ - -/* ---- Флаги сегмента индекса (IF_*) — общие для индексатора/кэша/вью ---- */ -#define IF_CONT 0x01u /* сегмент является продолжением перенесённой строки */ -#define IF_NOWRAP 0x02u /* строка не переносится (кодовый блок / HR / таблица) */ -#define IF_BLANK 0x04u /* визуально пустая строка */ -#define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */ -#define IF_HSCROLL 0x10u /* блок горизонтально скроллируется ЦЕЛИКОМ (код/таблица), - * включая строки короче 80 — двигаются как единый блок. - * НЕ ставится на HR и границы fence (им нечего прятать). */ -#define IF_TRUNC_MSG 0x20u /* строка-обрыв: рисуется ВЖИВУЮ фикс. текстом (без контент-кэша); - * cache_rec.reserved несёт код причины (TRUNC_*). */ - -/* ---- Причина обрыва индексации (cache_rec.reserved при IF_TRUNC_MSG) ---- */ -#define TRUNC_CONTENT 1 /* исчерпан контент-кэш (MAX_CACHE_CONTENT_PAGES) */ -#define TRUNC_LINES 2 /* исчерпана ёмкость индекса (max_lines) */ -#define TRUNC_FILE 3 /* файл больше MAX_FILE — прочитаны первые 256 КБ */ - -/* ---- Словарь сегментов/стилей (общий для индексатора и таблиц) ---- */ -/* Тип сегмента-продолжения, передаваемый в emit_seg()/inline_scan(). */ -#define CK_PLAIN 0 -#define CK_QUOTE 1 -#define CK_LIST 2 -#define CK_OTHER 3 - -/* Начальный inline-стиль сегмента (INIT_STYLE_*). */ -#define INIT_STYLE_PLAIN 0x0 -#define INIT_STYLE_BOLD 0x1 -#define INIT_STYLE_ITALIC 0x2 -#define INIT_STYLE_UNDER 0x3 -#define INIT_STYLE_CODE 0x4 -#define INIT_STYLE_STRIKE 0x5 - -/* ---- Таблицы: CP866 light box-drawing (общий для индексатора и модуля) ---- */ -#define TBL_MAX_COLS 16 -#define TBL_ATTR ATTR_BOX -#define TBL_H 0xC4 /* ─ */ -#define TBL_V 0xB3 /* │ */ -#define TBL_TL 0xDA /* ┌ */ -#define TBL_TM 0xC2 /* ┬ */ -#define TBL_TR 0xBF /* ┐ */ -#define TBL_ML 0xC3 /* ├ */ -#define TBL_MM 0xC5 /* ┼ */ -#define TBL_MR 0xB4 /* ┤ */ -#define TBL_BL 0xC0 /* └ */ -#define TBL_BM 0xC1 /* ┴ */ -#define TBL_BR 0xD9 /* ┘ */ - -/* ================================================================== * - * Разделяемые символы mdview2.c, используемые модулем RAW. - * ================================================================== */ -extern uint8_t g_view; /* активный режим просмотра (VIEW_*) */ -extern uint32_t file_size; /* размер активного буфера документа */ -extern const uint8_t *g_remap; /* таблица ремапа [128-255] (0 = нет) */ -extern uint8_t g_scratch_phys; /* scratch EMM-страница для win_rest */ - -char fb(uint32_t p); /* байт активного буфера (W3-маппинг) */ -void win_rest(uint8_t row, uint8_t col, uint8_t h, uint8_t w, uint8_t page, uint16_t off); -void fill_row(uint8_t y, uint8_t attr); -uint8_t pct16(uint16_t num, uint16_t den); /* num*100/den (0..100), 16-бит, без __divulong */ -uint32_t seg_off(uint16_t idx); /* offset исходника для логической строки idx */ -uint16_t line_at_off(uint32_t off); /* обратно: последняя строка с seg_off <= off */ - -/* ================================================================== * - * API модуля RAW (mdview2_raw.c). - * ================================================================== */ -void raw_seed_from(uint16_t md_top_line); /* вход в RAW: позиция по top_line */ -uint32_t raw_pos(void); /* текущий байт-offset верха экрана RAW */ -void raw_reanchor(uint32_t off); /* поставить RAW на строку с байтом off */ -void raw_draw(void); /* перерисовать область документа в RAW */ -uint8_t raw_pct(void); /* % прокрутки по байтам (для render_raw_status_numbers) */ -uint8_t raw_key(uint8_t scan); /* навигация RAW; 1 = обработано */ -void raw_screen_init(void); /* очистка экрана с нужным аттрибутом */ -void raw_renorm(void); /* выровнять позицию при смене под-режима (F3) */ - -/* ================================================================== * - * API модуля HEX (mdview2_hex.c) — дамп ОРИГИНАЛЬНОГО файла (F4). - * Позиция hex_pos/hex_reanchor — в байтах ОРИГИНАЛА (orig_file_*); - * конвертацию в/из активного буфера делает ядро (map_off). - * ================================================================== */ -uint32_t hex_pos(void); /* offset верхнего ряда (кратен 16) */ -void hex_reanchor(uint32_t orig_off); /* поставить на ряд с байтом orig_off */ -void hex_draw(void); /* перерисовать область документа */ -uint8_t hex_key(uint8_t scan); /* навигация HEX; 1 = обработано */ -void hex_screen_init(void); /* очистка экрана */ - -/* ================================================================== * - * Запись директории рендер-кэша (одна на видимую строку, РОВНО 8 байт — - * cache_dir_get/put адресуют сдвигом idx<<3). Контент — len пар (char,attr). - * ================================================================== */ -typedef struct cache_rec_s { - uint8_t page; /* EMM-страница рендер-кэша (физический номер) */ - uint16_t off; /* смещение в странице, 0..16383 (байты, не ячейки) */ - uint8_t len; /* длина контента в ЯЧЕЙКАХ (char,attr пар), 0..255; 0 = пустая/HR */ - uint8_t flags; /* копия IF_NOWRAP/IF_CODE/IF_BLANK на момент рендера */ - uint8_t reserved; /* не используется */ - uint8_t pad[2]; /* явный резерв, добивка до 8 байт */ -} cache_rec_t; - -void cache_dir_get(uint16_t idx, cache_rec_t *r); /* читатель директории кэша (ядро) */ -void put_str_attr(uint8_t x, uint8_t y, const char *s, uint8_t attr); /* печать строки с атрибутом */ - -/* ================================================================== * - * Состояние навигации/представления (определено в mdview2.c). - * ================================================================== */ -extern uint16_t n_lines; /* всего строк в индексе текущего набора */ -extern uint16_t top_line; /* верхняя видимая строка */ -extern uint8_t viewport_x; /* горизонтальный сдвиг (nowrap-строки) */ -extern char filename[]; /* имя файла для статус-бара */ -extern uint8_t g_loading; /* 1 во время index_lines() */ -extern uint8_t g_ready; /* 1 когда первичный документ построен (F2 RAW) */ -extern uint8_t g_f8_enabled; /* можно ли сейчас переключать кодировку */ - -/* ================================================================== * - * Статус-бар (строка 0), меню (строка 31), спиннер — mdview2_status.c. - * Атомарные части: prerender (фикс. хром, один раз) / encoding (поле кодировки) - * / numbers (диапазон строк + %) / menu / spinner — обновляются по отдельности. - * ================================================================== */ -void prerender_status(void); /* фикс. часть: фон, разделители, MDVIEW, имя файла (1 раз) */ -void status_encoding(void); /* только поле кодировки (col 37) */ -void render_md_status_numbers(void); /* числа MD: диапазон строк + % */ -void render_raw_status(void); /* RAW mode: метка режима */ -void render_hex_status(void); /* HEX mode: метка режима */ -void render_full_status(void); /* encoding + numbers (MD) */ -void render_menu(void); /* строка меню (по смене режима/готовности) */ -uint16_t drawable_lines(void); /* число строк, готовых к показу */ -void spinner_tick(void); /* кадр спиннера загрузки */ -void spinner_show(uint8_t on); /* вкл/выкл спиннер */ -void render_percent_progress(uint8_t pct); /* показать процентный прогресс просмотра */ - -/* ================================================================== * - * Отрисовка области MD-документа и прокрутка (mdview2_md.c). - * ================================================================== */ -void draw_viewport_from_cache(void); /* перерисовать область документа из кэша */ -void clamp_top(void); /* привести top_line к диапазону */ -void md_scroll_up(uint16_t n); -void md_scroll_down(uint16_t n); -void md_scroll_horizon(int8_t delta); /* горизонтальный сдвиг nowrap-блоков */ -uint8_t md_key(uint8_t scan); /* навигация MD (после загрузки); 1 = обработано */ - -/* ================================================================== * - * API модуля справки (mdview2_help.c). - * ================================================================== */ -void show_help(void); /* модальный диалог F1 */ - -/* ================================================================== * - * Парсер/индексатор (mdview2_index.c) и разделяемое с ним состояние. - * Хранилище индекса (index_blk/pages/phys, n_lines/max_lines) — в ядре - * (аллокация/doc-slot), индексатор пишет в него; cache_*-писатели и - * progress_tick ядро экспортирует индексатору (spinner_tick — из status). - * ================================================================== */ -#define INDEX_RECS_PER_PAGE 2048u /* 16384 / 8; запись всегда в одной странице */ -#define MAX_CACHE_LINE_LEN 255u /* кап длины контента строки в ячейках (буфер g_cells) */ - -extern uint16_t max_lines; /* ёмкость индекса: index_pages * 2048 */ -extern uint8_t index_blk, index_pages; /* дескриптор EMM-блока индекса */ -extern uint8_t index_phys[]; /* физ. страницы индекса */ -extern uint8_t index_truncated; /* индекс упёрся в ёмкость */ -extern uint8_t g_abort; /* F10/Esc во время загрузки → прервать индексацию */ -extern uint8_t g_file_clamped; /* файл был обрезан до MAX_FILE при загрузке (>256 КБ) */ - -uint8_t cache_reserve(uint16_t nbytes, uint8_t *out_page, uint16_t *out_off); -void cache_commit(uint8_t page, uint16_t off, const void *buf, uint16_t len); -void cache_dir_put(uint16_t idx, const cache_rec_t *r); -void progress_tick(void); /* кооперативный шаг loading-loop (рисует/листает) */ - -/* Резюмируемая индексация (для фоновой сборки второго набора): begin сбрасывает - * проход, step выполняет до budget итераций (блоков исходника) и возвращает 1, - * когда индекс финализирован. Межшаговое состояние — статики модуля index; - * оно не входит в docset_t (см. bg_step ядра). */ -void index_begin(void); -uint8_t index_step(uint8_t budget); -extern uint8_t g_bg_building; /* 1 = фоновый шаг индексации: не трогать экран (спиннер) */ - -/* ================================================================== * - * Буфер ячеек рендера (mdview2.c) — общий с модулем таблиц. - * Таблицы эмитят свои строки теми же примитивами, что и индексатор. - * ================================================================== */ -extern uint8_t g_ncells; /* ячеек в текущем сегменте */ -void gc_put(char ch, uint8_t attr); /* добавить ячейку в g_cells */ -void gc_fill(char ch, uint8_t attr, uint8_t n); /* n одинаковых ячеек */ -uint8_t inline_scan(uint32_t q, uint32_t q_end, uint8_t col, - uint8_t ckind, uint8_t line_style, uint8_t base_attr, - uint8_t nowrap); - -/* ================================================================== * - * API модуля таблиц (mdview2_table.c) — вызывается из index_lines(). - * ================================================================== */ -uint32_t row_end(uint32_t p); /* offset завершающего '\n' (или file_size) */ -uint32_t table_first_cell(uint32_t row_start); /* контент первой ячейки строки */ -uint8_t table_next_cell(uint32_t *pp, uint32_t lineend, uint32_t *cs, uint32_t *ce); -uint8_t table_is_sep_row(uint32_t row_start, uint32_t lineend); -void table_border(const uint8_t *widths, uint8_t ncols, char left, char mid, char right); -void table_data_row(uint32_t row_start, uint32_t lineend, const uint8_t *widths, uint8_t ncols); - -/* ================================================================== * - * Кодировки и UTF-8 конвертация (mdview2_enc.c). - * Состояние кодека владеется модулем; build_doc()/index_lines() ядра - * оркестрируют его (привязка UTF-буфера к живому file_*, сборка наборов). - * ================================================================== */ -extern uint8_t g_encoding; /* активная кодировка (ENC_*) */ -extern uint8_t g_utf_building; /* 1 пока UTF-конвертация не дошла до конца исходника */ -extern uint8_t utf_avail; /* 1 = страницы UTF-8 выделены */ -extern uint8_t utf_blk, utf_pages; /* дескриптор EMM-буфера UTF-набора */ -extern uint8_t utf_phys[]; /* физ. страницы UTF-буфера */ -extern uint32_t utf_size; /* размер сконвертированного UTF-потока */ - -/* Ядро-owned состояние, читаемое кодеком (определено в mdview2.c). */ -extern uint8_t cur_page; /* текущая страница файла в W3 (инвалидация маппинга) */ -extern uint8_t orig_file_phys[]; /* физ. страницы снимка исходного файла */ -extern uint8_t orig_file_pages; -extern uint32_t orig_file_size; - -void set_encoding(uint8_t enc); /* активная кодировка + таблица ремапа */ -const char *enc_name(uint8_t enc); /* короткое имя для статус-бара */ -uint8_t detect_encoding(void); /* автоопределение по сэмплу байт */ -void win_rest_remap(uint8_t row, uint8_t w, uint8_t page, uint16_t off); /* вывод среза с ремапом */ -void utf_convert_more(uint32_t target); /* инкрементальная конвертация до target байт */ -uint8_t utf_alloc(void); /* выделить EMM-страницы под UTF-набор; 0 = нет EMM */ -uint8_t utf_cp_glyph(uint32_t cp); /* кодпойнт → один CP866-глиф ('?' без аналога) */ - -#endif /* MDVIEW2_H */ diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_conf.h b/applications/Volkov/tests/fixtures/mdview2/mdview2_conf.h deleted file mode 100644 index 330505e..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_conf.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * mdview2_conf.h — конфигурация сборки mdview2: какие опциональные модули - * просмотра включать. 1 = включить (код входит в бинарь), 0 = исключить - * полностью (нулевой расход кода/памяти). - * - * Модули обёрнуты в #if WITH_xxx целиком, поэтому файлы можно держать в - * сборке всегда (при 0 они компилируются в пустой объектник) — менять - * нужно только эти define. - */ -#ifndef MDVIEW2_CONF_H -#define MDVIEW2_CONF_H - -#define WITH_RAW 1 /* RAW-просмотр исходника (F2): mdview2_raw.c */ -#define WITH_HEX 1 /* HEX-дамп оригинального файла (F4): mdview2_hex.c */ - -#endif /* MDVIEW2_CONF_H */ diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_enc.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_enc.c deleted file mode 100644 index 2bf83dc..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_enc.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * mdview2_enc.c — кодировки и конвертация UTF-8 → CP866. - * - * Две связанные подсистемы: - * 1. 8-битные кодировки (CP866/CP1251/KOI8-R) — различаются только ремапом - * старших байтов [128-255] на ОТРИСОВКЕ (g_remap, win_rest_remap). - * Автоопределение — detect_encoding по частоте ходовых букв. - * 2. UTF-8 — отдельный набор: исходник инкрементально декодируется в - * utf_phys[] как чистый CP866 (utf_convert_more), после чего весь - * конвейер индексации/кэша работает по нему без ремапа. - * - * Владеет состоянием кодека (conv-буфер, позиция конвертации, UTF-страницы); - * описание разделяемых символов и API — в mdview2.h. Оркестрацией (привязка - * UTF-буфера к живому file_*, сборка наборов) занимается build_doc() ядра. - */ - -#include -#include /* COLOR()/COLOR_* для ATTR_* в attr_is_content */ -#include /* sprinter_page_w3 */ -#include /* bank_read/bank_write/mem_alloc_pages/mem_get_page */ -#include "mdview2.h" - -/* ---- Состояние кодировки/UTF (владелец — этот модуль) ------------- */ -uint8_t g_encoding = ENC_CP866; /* активная кодировка */ - -uint8_t utf_blk; -uint8_t utf_pages; -uint8_t utf_phys[MAX_PAGES]; -uint32_t utf_size; -uint8_t utf_avail; /* 1 = страницы UTF-8 выделены */ -uint8_t g_utf_building; /* 1 пока конвертация не дошла до конца исходника */ - -/* Приватное состояние конвертера (наружу не торчит — сброс через - * utf_conv_reset(), чтение оригинала через cv_read). */ -static uint32_t utf_src; /* позиция чтения ОРИГИНАЛА (utf-8) */ -static uint8_t cv_page = 0xFF; /* orig-страница в W3 для cv_read (своя от cur_page) */ - -/* Таблицы ремапа СТАРШИХ байтов [128-255] в CP866. Индексируются (ch-0x80): - * младшие 128 (ASCII) — identity, в ремапе не участвуют (win_rest_remap - * трогает только ch>=0x80), поэтому в таблицах их нет. Кириллица + ходовая - * пунктуация; неизвестное → '?' (0x3F). Сгенерированы Python codecs. */ -static const uint8_t cp1251_to_866[128] = { - /* 80 */ 0x3F, 0x3F, 0x27, 0x3F, 0x22, 0x2E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3C, 0x3F, 0x3F, 0x3F, 0x3F, - /* 90 */ 0x3F, 0x27, 0x27, 0x22, 0x22, 0x07, 0x2D, 0x2D, 0x3F, 0x3F, 0x3F, 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, - /* A0 */ 0xFF, 0xF6, 0xF7, 0x3F, 0xFD, 0x3F, 0x3F, 0x3F, 0xF0, 0x63, 0xF2, 0x3C, 0x3F, 0x3F, 0x72, 0xF4, - /* B0 */ 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xF1, 0xFC, 0xF3, 0x3E, 0x3F, 0x3F, 0x3F, 0xF5, - /* C0 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - /* D0 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - /* E0 */ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - /* F0 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, -}; -static const uint8_t koi8r_to_866[128] = { - /* 80 */ 0xC4, 0xB3, 0xDA, 0xBF, 0xC0, 0xD9, 0xC3, 0xB4, 0xC2, 0xC1, 0xC5, 0xDF, 0xDC, 0xDB, 0xDD, 0xDE, - /* 90 */ 0xB0, 0xB1, 0xB2, 0x3F, 0xFE, 0xF9, 0xFB, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0xF8, 0x3F, 0xFA, 0x3F, - /* A0 */ 0xCD, 0xBA, 0xD5, 0xF1, 0xD6, 0xC9, 0xB8, 0xB7, 0xBB, 0xD4, 0xD3, 0xC8, 0xBE, 0xBD, 0xBC, 0xC6, - /* B0 */ 0xC7, 0xCC, 0xB5, 0xF0, 0xB6, 0xB9, 0xD1, 0xD2, 0xCB, 0xCF, 0xD0, 0xCA, 0xD8, 0xD7, 0xCE, 0x63, - /* C0 */ 0xEE, 0xA0, 0xA1, 0xE6, 0xA4, 0xA5, 0xE4, 0xA3, 0xE5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, - /* D0 */ 0xAF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xA6, 0xA2, 0xEC, 0xEB, 0xA7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA, - /* E0 */ 0x9E, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83, 0x95, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, - /* F0 */ 0x8F, 0x9F, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82, 0x9C, 0x9B, 0x87, 0x98, 0x9D, 0x99, 0x97, 0x9A, -}; - -/* Устанавливает активную кодировку и таблицу ремапа (для 8-битных). */ -void set_encoding(uint8_t enc) -{ - g_encoding = enc; - g_remap = (enc == ENC_CP1251) ? cp1251_to_866 : - (enc == ENC_KOI8R) ? koi8r_to_866 : (const uint8_t *)0; -} - -/* Самые ходовые строчные русские буквы (о е а и н т с р в л) — их байты - * различают 8-битные кодировки по частоте. */ -// static const uint8_t common866 [10] = {0xAE,0xA5,0xA0,0xA8,0xAD,0xE2,0xE1,0xE0,0xA2,0xAB}; -// static const uint8_t common1251[10] = {0xEE,0xE5,0xE0,0xE8,0xED,0xF2,0xF1,0xF0,0xE2,0xEB}; -// static const uint8_t commonkoi [10] = {0xCF,0xC5,0xC1,0xC9,0xCE,0xD4,0xD3,0xD2,0xD7,0xCC}; -// static uint8_t in_set10(const uint8_t *s, uint8_t b) -// { -// for (uint8_t i = 0; i < 10; i++) if (s[i] == b) return 1; -// return 0; -// } - -/* Проверяем только пять самых популярных символов (о е а и н) */ -static const uint8_t common866 [5] = {0xAE,0xA5,0xA0,0xA8,0xAD}; -static const uint8_t common1251[5] = {0xEE,0xE5,0xE0,0xE8,0xED}; -static const uint8_t commonkoi [5] = {0xCF,0xC5,0xC1,0xC9,0xCE}; -static uint8_t in_set10(const uint8_t *s, uint8_t b) -{ - for (uint8_t i = 0; i < 5; i++) if (s[i] == b) return 1; - return 0; -} - -/* Автоопределение кодировки дешёвым сканом байтов (до построения индекса). - * BOM → UTF8; иначе валидность UTF-8 (структура multibyte); иначе 8-бит по - * частоте ходовых букв; фолбэк CP866. */ -uint8_t detect_encoding(void) -{ - if (file_size >= 3 && (uint8_t)fb(0) == 0xEF && (uint8_t)fb(1) == 0xBB && (uint8_t)fb(2) == 0xBF) - return ENC_UTF8; - - uint32_t n = file_size; - if (n > 1024u) n = 1024u; /* сэмпл: первый 1 КБ — детекции хватает */ - uint8_t utf_ok = 1, has_mb = 0, has_high = 0, cont = 0; - uint16_t s866 = 0, s1251 = 0, skoi = 0; - - for (uint32_t p = 0; p < n; p++) { - uint8_t b = (uint8_t)fb(p); - if (b < 0x80) { if (cont) { utf_ok = 0; cont = 0; } continue; } - has_high = 1; - if (in_set10(common866, b)) s866++; - if (in_set10(common1251, b)) s1251++; - if (in_set10(commonkoi, b)) skoi++; - if (cont) { - if ((b & 0xC0) == 0x80) cont--; - else { utf_ok = 0; cont = 0; } - } - else if (b >= 0xC2 && b <= 0xDF) { cont = 1; has_mb = 1; } - else if (b >= 0xE0 && b <= 0xEF) { cont = 2; has_mb = 1; } - else if (b >= 0xF0 && b <= 0xF4) { cont = 3; has_mb = 1; } - else utf_ok = 0; /* битый лид/одиночный континюэйшн */ - } - /* Незавершённая multibyte-последовательность на КОНЦЕ — нарушение только - * если это настоящий EOF; на границе сэмпла (n= s866 && s1251 >= skoi) return ENC_CP1251; - if (skoi >= s866) return ENC_KOI8R; - return ENC_CP866; -} - -const char *enc_name(uint8_t enc) -{ - return (enc == ENC_CP1251) ? "CP1251" : - (enc == ENC_KOI8R) ? "KOI8-R" : - (enc == ENC_UTF8) ? "UTF-8 " : "CP866 "; -} - -/* Контентный глиф (ремапим при смене кодировки) vs структурный (рамка/HR/ - * маркеры — уже CP866, не трогаем). Различаем по attr. */ -static uint8_t attr_is_content(uint8_t a) -{ - return (uint8_t)(a != ATTR_BOX && a != ATTR_HR && - a != ATTR_LIST_MARKER && a != ATTR_QUOTE_MARKER); -} - -/* Вывод среза строки кэша с ремапом контентных глифов [128-255] через - * g_remap (CP1251/KOI8). Без активной таблицы — прямой win_rest. */ -void win_rest_remap(uint8_t row, uint8_t w, uint8_t page, uint16_t off) -{ - if (!g_remap || w == 0) { - win_rest(row, 0, 1, w, page, off); - return; - } - uint8_t buf[SCREEN_W * 2]; - bank_read(page, off, buf, (uint16_t)w * 2u); - for (uint8_t i = 0; i < w; i++) { - uint8_t ch = buf[(uint16_t)i * 2u]; - if (ch >= 0x80 && attr_is_content(buf[(uint16_t)i * 2u + 1u])) - buf[(uint16_t)i * 2u] = g_remap[ch - 0x80]; /* таблицы хранят только старшие 128 */ - } - bank_write(g_scratch_phys, 0, buf, (uint16_t)w * 2u); - win_rest(row, 0, 1, w, g_scratch_phys, 0); -} - -/* ========================= UTF-8 → CP866 (Фаза 2) ======================== */ - -/* Кириллица U+0400..U+045F → CP866. Русский набор + Ё/ё и часть украинских - * (Є є Ї ї Ў ў), которые есть в CP866; пропуски → '?' (0x3F). */ -static const uint8_t utf_cyr_to_866[96] = { - /* 0400 */ 0x3F, 0xF0, 0x3F, 0x3F, 0xF2, 0x3F, 0x3F, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0x3F, - /* 0410 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - /* 0420 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - /* 0430 */ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - /* 0440 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - /* 0450 */ 0x3F, 0xF1, 0x3F, 0x3F, 0xF3, 0x3F, 0x3F, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0x3F, -}; - -/* Поток вывода конвертера: пишем в utf_phys чанками по странице, буфер в - * near-памяти, флаш через один bank_write (не побайтовый swap W3). */ -static uint8_t conv_buf[256]; -static uint16_t conv_n; /* байт в буфере, ещё не сброшено */ -static uint8_t conv_page; /* индекс текущей страницы в utf_phys */ -static uint16_t conv_off; /* уже сброшенное смещение в этой странице */ - -static void conv_flush(void) -{ - if (conv_n) { - bank_write(utf_phys[conv_page], conv_off, conv_buf, conv_n); - conv_off = (uint16_t)(conv_off + conv_n); - conv_n = 0; - } -} - -/* Добавляет один CP866-байт в выходной поток. Запись никогда не пересекает - * границу страницы (256 делит 16384 нацело). */ -static void conv_put(uint8_t b) -{ - if ((uint16_t)(conv_off + conv_n) == PAGE_SIZE) { /* страница заполнена */ - conv_flush(); - conv_page++; - conv_off = 0; - } - conv_buf[conv_n++] = b; - if (conv_n == (uint16_t)sizeof(conv_buf)) conv_flush(); -} - -/* Подстановки одиночных не-кириллических символов UTF-8 → один CP866-байт. - * Таблица вместо switch (экономия кода); линейный поиск дёшев — вызывается - * лишь при конвертации на редких символьных кодпойнтах. Чтобы добавить новый - * символ — достаточно дописать одну строку {кодпойнт, байт-CP866}. - * (Символы с НЕ-1:1 заменой, напр. … -> "...", обрабатываются отдельно ниже.) */ -typedef struct { uint16_t utf8; uint8_t cp866; } utf_sym_t; -static const utf_sym_t utf_sym[] = { - {0x00A0, 0x20}, {0x00AB, 0x3C}, {0x00BB, 0x3E}, /* nbsp « » → space < > */ - {0x00B0, 0xF8}, {0x00B7, 0xFA}, /* ° · */ - {0x2013, 0x2D}, {0x2014, 0x2D}, /* – — → '-' */ - {0x2018, 0x27}, {0x2019, 0x27}, /* ‘ ’ → '\'' */ - {0x201C, 0x22}, {0x201D, 0x22}, /* “ ” → '"' */ - {0x2022, 0xF9}, {0x2116, 0xFC}, /* • → ∙ № */ - {0x2190, 0x1B}, {0x2191, 0x18}, {0x2192, 0x1A}, {0x2193, 0x19}, /* ← ↑ → ↓ */ - {0x2500, 0xC4}, {0x2502, 0xB3}, {0x250C, 0xDA}, {0x2510, 0xBF}, /* ─ │ ┌ ┐ */ - {0x2514, 0xC0}, {0x2518, 0xD9}, {0x251C, 0xC3}, {0x2524, 0xB4}, /* └ ┘ ├ ┤ */ - {0x252C, 0xC2}, {0x2534, 0xC1}, {0x253C, 0xC5}, /* ┬ ┴ ┼ */ - {0x2580, 0xDF}, {0x2584, 0xDC}, {0x2588, 0xDB}, /* ▀ ▄ █ */ - {0x2591, 0xB0}, {0x2592, 0xB1}, {0x2593, 0xB2}, {0x25A0, 0xFE}, /* ░ ▒ ▓ ■ */ - {0x2713, 0xFB}, {0x2714, 0xFB}, /* ✓ ✔ → галка */ - {0x2715, 0x78}, {0x2717, 0x78}, {0x2718, 0x78}, /* ✕ ✗ ✘ → 'x' */ -}; -#define UTF_SYM_N (uint8_t)(sizeof(utf_sym) / sizeof(utf_sym[0])) - -/* Кодпойнт → ОДИН CP866-глиф: кириллица по таблице, ходовые символы по - * utf_sym[], прочее → '?'. Общая для конвертера и HEX-printable (F4). */ -uint8_t utf_cp_glyph(uint32_t cp) -{ - if (cp < 0x80) return (uint8_t)cp; - if (cp >= 0x0400 && cp <= 0x045F) return utf_cyr_to_866[cp - 0x0400]; - for (uint8_t i = 0; i < UTF_SYM_N; i++) - if (utf_sym[i].utf8 == (uint16_t)cp) return utf_sym[i].cp866; - return '?'; -} - -/* Кодпойнт → CP866-глиф(ы) в поток конвертера. Спецслучаи с НЕ-1:1 заменой - * (… → "...", BOM → ничего) здесь; остальное через utf_cp_glyph(). */ -static void conv_emit_cp(uint32_t cp) -{ - if (cp == 0x2026) { conv_put('.'); conv_put('.'); conv_put('.'); return; } /* … → "..." */ - if (cp == 0xFEFF) return; /* BOM/ZWNBSP — выкинуть */ - conv_put(utf_cp_glyph(cp)); -} - -/* Последовательное чтение байта ОРИГИНАЛА (utf-8) конвертером. Оригинал лежит - * в orig_file_phys[]; мапим его страницу в W3 напрямую, со своей кэш-переменной - * cv_page (отдельной от cur_page индексатора, т.к. оба используют W3 и - * чередуются). На границе с fb()-чтением utf-буфера кэши взаимно сбрасываются. */ -static uint8_t cv_read(uint32_t s) -{ - uint8_t pg = (uint8_t)(s >> PAGE_BITS); - if (pg != cv_page) { sprinter_page_w3(orig_file_phys[pg]); cv_page = pg; } - return *((volatile uint8_t *)(0xC000u + (uint16_t)(s & PAGE_MASK))); -} - -/* Возобновляемая конвертация: дописывает utf_phys из оригинала, пока - * сконвертированных (flushed) байт меньше target и не достигнут конец - * исходника. По выходу file_size = доступная (сконвертированная) часть; при - * достижении конца фиксирует utf_size и снимает g_utf_building. */ -void utf_convert_more(uint32_t target) -{ - cv_page = 0xFF; /* W3 был на utf (fb индексатора) — пере-смаппим orig */ - uint32_t n = orig_file_size; - while (utf_src < n && - (uint32_t)((uint32_t)conv_page * PAGE_SIZE + conv_off) < target) { - uint8_t b = (uint8_t)cv_read(utf_src++); - if (b < 0x80) { - conv_emit_cp(b); - continue; - } - - uint32_t cp; - uint8_t need; - if ((b & 0xE0) == 0xC0) { cp = (uint32_t)(b & 0x1F); need = 1; } - else if ((b & 0xF0) == 0xE0) { cp = (uint32_t)(b & 0x0F); need = 2; } - else if ((b & 0xF8) == 0xF0) { cp = (uint32_t)(b & 0x07); need = 3; } - else { conv_put('?'); continue; } - - uint8_t ok = 1; - for (uint8_t k = 0; k < need; k++) { - if (utf_src >= n) { ok = 0; break; } - uint8_t cb = (uint8_t)cv_read(utf_src); - if ((cb & 0xC0) != 0x80) { ok = 0; break; } - cp = (cp << 6) | (uint32_t)(cb & 0x3F); - utf_src++; - } - if (!ok || need == 3) { conv_put('?'); continue; } - conv_emit_cp(cp); - } - conv_flush(); - file_size = (uint32_t)conv_page * PAGE_SIZE + conv_off; /* доступно индексатору */ - if (utf_src >= n) { utf_size = file_size; g_utf_building = 0; } - cur_page = 0xFF; /* W3 был на orig — fb индексатора пере-смаппит utf */ -} - -/* Выделяет страницы под UTF-8 набор (конвертированный ≤ оригинала по размеру) - * и сбрасывает приватное состояние конвертера в начало (conv-буфер, utf_src, - * g_utf_building). Сама конвертация — инкрементальная, через utf_convert_more(). - * Возврат: 1 — успех, 0 — нет EMM. */ -uint8_t utf_alloc(void) -{ - utf_pages = orig_file_pages; - utf_blk = mem_alloc_pages(utf_pages); - if (utf_blk == 0) return 0; - for (uint8_t i = 0; i < utf_pages; i++) - utf_phys[i] = mem_get_page(utf_blk, i); - conv_n = 0; conv_page = 0; conv_off = 0; /* converter reset (вызывается один раз) */ - utf_src = 0; - g_utf_building = 1; - return 1; -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_help.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_help.c deleted file mode 100644 index 6999f0d..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_help.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * mdview2_help.c — диалог справки (F1). - * - * Модальное окно поверх документа: рамка с заголовком, список горячих - * клавиш и поддерживаемых markdown-элементов. Блокирует до нажатия любой - * клавиши, после чего восстанавливает статус-бар, область документа и меню. - * - * Зависимости от ядра (mdview2.c): render_full_status / draw_viewport_from_cache - * / render_menu для восстановления экрана. Текст справки — в CP866. - */ - -#include -#include -#include -#include -#include "mdview2.h" - -/* Геометрия диалога справки (в символьных координатах 80×32). */ -#define HELP_X 8u /* левая граница рамки */ -#define HELP_Y 3u /* верхняя граница рамки */ -#define HELP_W 64u /* ширина рамки (включая │) */ -#define HELP_H 26u /* высота рамки (включая ─) */ - -/* Заполняет одну внутреннюю строку диалога (r=0 — первая строка за рамкой). - * Строка s в кодировке CP866; остаток до края дополняется пробелами. */ -static void help_line(uint8_t r, const char *s, uint8_t attr) -{ - uint8_t x = HELP_X + 1u; - uint8_t y = HELP_Y + 1u + r; - uint8_t len = (uint8_t)strlen(s); - - if (len > HELP_W - 2u) - len = HELP_W - 2u; - - bios_set_place(y, x); - if (len > 0) - bios_writeattr(s, len, attr); - /* place уже продвинут bios_writeattr на len колонок (verified). */ - if (len < HELP_W - 2u) { - bios_fillcharattr(' ', ATTR_HELP_BG, (uint8_t)(HELP_W - 2u - len)); - } -} - -void show_help(void) -{ - /* " Помощь " в CP866 (8 байт) */ - static const char title[] = " \x8F\xAE\xAC\xAE\xE9\xEC "; - uint8_t tlen = 8u; - uint8_t lft = (uint8_t)((HELP_W - 2u - tlen) / 2u); /* = 27 */ - uint8_t rgt = (uint8_t)(HELP_W - 2u - tlen - lft); - /* Верхняя граница рамки с заголовком по центру. - * place продвигается каждым BIOS-вызовом (verified), поэтому - * достаточно одной установки места на всю строку рамки. */ - wrchar(HELP_X, HELP_Y, 0xDA, ATTR_HELP_BDR); /* ┌ */ - bios_set_place(HELP_Y, (uint8_t)(HELP_X + 1u)); - if (lft > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, lft); - if (tlen > 0) bios_writeattr(title, tlen, ATTR_HELP_TIT); - if (rgt > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, rgt); - wrchar(HELP_X + HELP_W - 1u, HELP_Y, 0xBF, ATTR_HELP_BDR); /* ┐ */ - - /* Боковые границы (левый и правый │ для каждой строки тела) */ - for (uint8_t r = 1u; r < HELP_H - 1u; r++) { - wrchar(HELP_X, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - wrchar(HELP_X + HELP_W - 1u, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - } - - /* Нижняя граница рамки */ - wrchar(HELP_X, HELP_Y + HELP_H - 1u, 0xC0, ATTR_HELP_BDR); /* └ */ - bios_set_place((uint8_t)(HELP_Y + HELP_H - 1u), (uint8_t)(HELP_X + 1u)); - bios_fillcharattr(0xC4, ATTR_HELP_BDR, (uint8_t)(HELP_W - 2u)); - wrchar(HELP_X + HELP_W - 1u, HELP_Y + HELP_H - 1u, 0xD9, ATTR_HELP_BDR); /* ┘ */ - - /* Содержимое (20 внутренних строк) */ - uint8_t r = 0; - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " MDView v1.0 (b3) -- Markdown Viewer for Sprinter", ATTR_HELP_HDR); - help_line(r++, " (c) 2026 \x8F\xA5\xE2\xE0\xAE\xA2 \x80\x2E\x83\x2E", - ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Navigation:", ATTR_HELP_HDR); - help_line(r++, " \x18 \x19 Scroll one line up / down", ATTR_HELP_BG); - help_line(r++, " PgUp PgDn Scroll one page up / down", ATTR_HELP_BG); - help_line(r++, " Home End Jump to beginning / end of document", ATTR_HELP_BG); - help_line(r++, " \x1B \x1A Horizontal pan (code blocks/tables/unwrap)", ATTR_HELP_BG); - help_line(r++, " Esc F10 Exit", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Markdown elements:", ATTR_HELP_HDR); - help_line(r++, " # ## ### Headings H1-H6, **bold**, *italic*,", ATTR_HELP_BG); - help_line(r++, " `code`, ``` code ```, ~~strike~~, > quote", ATTR_HELP_BG); - help_line(r++, " - * + 1. 2. Ordered list, |----|----| Tables", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Encoding and View modes:", ATTR_HELP_HDR); - help_line(r++, " F2 RAW Mode", ATTR_HELP_BG); - help_line(r++, " F3 Wrap/Unwrap Mode for RAW View", ATTR_HELP_BG); - help_line(r++, " F4 HEX Mode (dump of original file)", ATTR_HELP_BG); - help_line(r++, " F8 Cycle CP866 / CP1251 / KOI8-R / UTF-8", ATTR_HELP_BG); - help_line(r++, " Auto-detected on open; F8 to override", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " File size: up to 256 KB (EMM). Lines: up to 18432.", ATTR_HELP_BG); - - (void)getkey(); - - render_full_status(); - draw_viewport_from_cache(); - render_menu(); -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_hex.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_hex.c deleted file mode 100644 index c1eb72e..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_hex.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - * mdview2_hex.c — HEX-дамп ОРИГИНАЛЬНОГО файла (F4). - * - * Показывает исходные байты файла (orig_file_phys), а не активный буфер: - * hex-дамп декодированного UTF-набора был бы искажением. Printable-колонка - * интерпретируется ТЕКУЩЕЙ кодировкой: CP866 как есть, CP1251/KOI8 через - * g_remap, UTF-8 — глиф на позиции лид-байта (continuation-байты → '.'). - * - * Формат ряда (79 колонок, один атрибут ATTR_TEXT — как RAW): - * 0x012340 │ XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX │ 16 символов - * - * Ряд выровнен на 16 байт и никогда не пересекает границу EMM-страницы - * (16 делит 16384 нацело) — один bank_read на ряд, fb()/W3-маппинг не нужны. - * Позиция (hex_top) живёт в байтах ОРИГИНАЛА; конвертацию в/из байт-позиции - * активного буфера делает ядро (view_pos/view_reanchor через map_off). - */ - -#include -#include -#include -#include -#include /* bank_read (чтение оригинала по страницам EMM) */ -#include "mdview2.h" - -#if WITH_HEX /* весь модуль опционален (mdview2_conf.h); при 0 пустой объектник */ - -#define HEX_BPR 16u /* байт на ряд */ -#define HEX_SPAN ((uint32_t)(VIEW_H - 1) * HEX_BPR) - -/* Геометрия ряда (колонки). */ -#define HX_OFF 1u /* "0x012340" */ -#define HX_SEP1 10u /* │ */ -#define HX_DUMP 12u /* пары hex-цифр */ -#define HX_SEP2 61u /* │ */ -#define HX_PRINT 63u /* printable */ - -static uint32_t hex_top; /* offset верхнего ряда (кратен 16) */ - -uint32_t hex_pos(void) { return hex_top; } - -/* Максимальный hex_top: последний ряд файла на нижней строке экрана. */ -static uint32_t hex_max_top(void) -{ - uint32_t last = (orig_file_size == 0) ? 0 - : ((orig_file_size - 1u) & ~(uint32_t)(HEX_BPR - 1u)); - return (last > HEX_SPAN) ? (last - HEX_SPAN) : 0; -} - -void hex_reanchor(uint32_t orig_off) -{ - uint32_t mt = hex_max_top(); - orig_off &= ~(uint32_t)(HEX_BPR - 1u); - hex_top = (orig_off > mt) ? mt : orig_off; -} - -void hex_screen_init(void) -{ - bios_clearwin(VIEW_TOP_ROW, 0, VIEW_H, SCREEN_W, ATTR_TEXT); -} - -/* ---- отрисовка ----------------------------------------------------- */ - -static uint8_t hexdig(uint8_t v) -{ - v &= 15u; - return (uint8_t)((v < 10u) ? ('0' + v) : ('A' - 10 + v)); -} - -/* Один байт оригинала (для UTF-lookahead за границей ряда — редкий путь). */ -static uint8_t fbo(uint32_t off) -{ - uint8_t b; - bank_read(orig_file_phys[off >> PAGE_BITS], (uint16_t)(off & PAGE_MASK), &b, 1); - return b; -} - -/* Printable-глиф для n байт ряда b[] (off — offset b[0] в файле) → out[]. */ -static void hex_print_cells(const uint8_t *b, uint32_t off, uint8_t n, uint8_t *out) -{ - for (uint8_t i = 0; i < n; i++) { - uint8_t c = b[i]; - uint8_t g; - if (c < 0x20u) { - g = '.'; - } else if (c < 0x80u || g_encoding != ENC_UTF8) { - g = (uint8_t)((c >= 0x80u && g_remap) ? g_remap[c - 0x80u] : c); - } else if ((c & 0xC0u) == 0x80u) { - g = '.'; /* continuation-байт */ - } else { - /* Лид-байт: собрать кодпойнт (хвост может выйти за ряд → fbo). - * 4-байтовые (за пределами CP866) и битые последовательности → '.'. */ - uint32_t cp; - uint8_t need, ok = 1; - if ((c & 0xE0u) == 0xC0u) { cp = (uint32_t)(c & 0x1Fu); need = 1; } - else if ((c & 0xF0u) == 0xE0u) { cp = (uint32_t)(c & 0x0Fu); need = 2; } - else { out[i] = '.'; continue; } - for (uint8_t k = 1; k <= need; k++) { - uint32_t p = off + i + k; - if (p >= orig_file_size) { ok = 0; break; } - uint8_t cb = (uint8_t)((i + k < n) ? b[i + k] : fbo(p)); - if ((cb & 0xC0u) != 0x80u) { ok = 0; break; } - cp = (cp << 6) | (uint32_t)(cb & 0x3Fu); - } - g = ok ? utf_cp_glyph(cp) : '.'; - if (g < 0x20u) g = '.'; /* overlong мог дать управляющий */ - } - out[i] = g; - } -} - -static uint8_t hex_line[SCREEN_W]; /* собранный ряд (только символы, единый attr) */ - -static void hex_draw_row(uint32_t off, uint8_t row) -{ - uint8_t buf[HEX_BPR]; - uint8_t n = 0; - - memset(hex_line, ' ', SCREEN_W); - if (off < orig_file_size) { - uint32_t rem = orig_file_size - off; - n = (rem >= HEX_BPR) ? (uint8_t)HEX_BPR : (uint8_t)rem; - bank_read(orig_file_phys[off >> PAGE_BITS], (uint16_t)(off & PAGE_MASK), buf, n); - } - if (n) { /* ряды за EOF — пустые */ - hex_line[HX_OFF] = '0'; - hex_line[HX_OFF + 1] = 'x'; - hex_line[HX_OFF + 2] = hexdig((uint8_t)(off >> 20)); - hex_line[HX_OFF + 3] = hexdig((uint8_t)(off >> 16)); - hex_line[HX_OFF + 4] = hexdig((uint8_t)(off >> 12)); - hex_line[HX_OFF + 5] = hexdig((uint8_t)(off >> 8)); - hex_line[HX_OFF + 6] = hexdig((uint8_t)(off >> 4)); - hex_line[HX_OFF + 7] = hexdig((uint8_t)off); - hex_line[HX_SEP1] = TBL_V; - for (uint8_t i = 0; i < n; i++) { - uint8_t x = (uint8_t)(HX_DUMP + i * 3u + ((i >= 8u) ? 1u : 0u)); - hex_line[x] = hexdig((uint8_t)(buf[i] >> 4)); - hex_line[x + 1] = hexdig(buf[i]); - } - hex_line[HX_SEP2] = TBL_V; - hex_print_cells(buf, off, n, hex_line + HX_PRINT); - } - bios_set_place(row, 0); - bios_write_until((const char *)hex_line, SCREEN_W, 0); -} - -void hex_draw(void) -{ - uint32_t off = hex_top; - for (uint8_t r = 0; r < VIEW_H; r++) { - hex_draw_row(off, (uint8_t)(VIEW_TOP_ROW + r)); - off += HEX_BPR; - } -} - -/* ---- статус-бар: % по байтам (как calc_raw_pct) --------------------- */ - -static uint8_t calc_hex_pct(void) -{ - return pct16((uint16_t)(hex_top >> 8), (uint16_t)(orig_file_size >> 8)); -} - -/* ---- навигация (вызывается из главного цикла при g_view == VIEW_HEX) */ - -uint8_t hex_key(uint8_t scan) -{ - uint32_t mt = hex_max_top(); - switch (scan) { - /* Одна строка — аппаратный скролл окна + подрисовка одного ряда - * (как в MD/RAW), без перерисовки всего экрана. */ - case KEY_DOWN: - if (hex_top < mt) { - hex_top += HEX_BPR; - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); /* содержимое вверх */ - hex_draw_row(hex_top + HEX_SPAN, (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); - } - break; - case KEY_UP: - if (hex_top) { - hex_top -= HEX_BPR; - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); /* содержимое вниз */ - hex_draw_row(hex_top, VIEW_TOP_ROW); - } - break; - case KEY_PGDN: { - uint32_t nt = hex_top + (uint32_t)VIEW_H * HEX_BPR; - if (nt > mt) nt = mt; - if (nt != hex_top) { hex_top = nt; hex_draw(); } - break; - } - case KEY_PGUP: { - uint32_t d = (uint32_t)VIEW_H * HEX_BPR; - uint32_t nt = (hex_top >= d) ? hex_top - d : 0; - if (nt != hex_top) { hex_top = nt; hex_draw(); } - break; - } - case KEY_HOME: - if (hex_top) { hex_top = 0; hex_draw(); } - break; - case KEY_END: - if (hex_top != mt) { hex_top = mt; hex_draw(); } - break; - default: - return 0; /* не наша клавиша */ - } - render_percent_progress(calc_hex_pct()); - return 1; -} - -#endif /* WITH_HEX */ diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_index.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_index.c deleted file mode 100644 index 2740fbb..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_index.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* - * mdview2_index.c — парсер/индексатор markdown (сердце приложения). - * - * Единственный проход по исходному файлу (index_begin/index_step): классификация строк - * (classify_line, is_*_raw), сборка абзацев с переносом (scan_join_stream), - * inline-разметка (inline_marker/inline_scan) и эмиссия готовых (char,attr)- - * ячеек в рендер-кэш (gc_put → seg_commit_cells → cache_*). Ведёт индекс - * сегментов в EMM (idx_get/idx_put) и докручивает UTF-конвертацию впереди - * позиции чтения. Разделяемые символы и API — в mdview2.h. - * - * Приватно (не торчит в .h): idx_rec_t, cur_rec/cur_seg_off, буфер ячеек - * g_cells, idx_get/idx_put и все классификаторы/сканеры. - */ - -#include -#include -#include /* COLOR()/COLOR_* для ATTR_* в сканерах */ -#include -#include /* bank_read/bank_write (idx_get/idx_put) */ -#include "mdview2.h" - -static uint8_t emph_to_attr(uint8_t emph, uint8_t base_attr); /* forward (нужна в inline-сканере) */ -static uint8_t is_hr_raw(uint32_t p); /* forward (нужна в classify_line) */ - -/* Начало следующей физической строки (байт после '\n', либо file_size). */ -static uint32_t next_line(uint32_t p) -{ - p = row_end(p); - return (p < file_size) ? p + 1 : p; -} - -typedef struct idx_rec_s { - uint32_t off; /* смещение первого байта исходного текста для сегмента */ - uint8_t flags; /* битовые флаги IF_* ниже */ - uint8_t style; /* начальный стиль INIT_STYLE_* в начале сегмента */ - uint8_t pad0; /* добивка до 8 байт (2048 записей на страницу 16 КБ) */ - uint8_t pad1; -} idx_rec_t; - -#define INDEX_REC_SIZE 8u - -static uint32_t cur_seg_off; /* смещение последнего emit_seg (кэш в near-памяти) */ -static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */ - -/* Для проверки границ выделения считаем пробел/таб/конец строки/0 пробельными. */ -static uint8_t ws_or_eol(char c) -{ - return (uint8_t)(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -static uint8_t ws_or_eol_or_delim(char c) -{ - return (uint8_t)(c == ' ' || c == ',' || c == '.' || c == '!' || c == '?' || c == ':' || c == ';' || c == '/' - || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -/* Маркер inline-выделения (*, **, _) распознаётся только если - * пробельная граница есть ровно с одной стороны (XOR-правило). - * Это защищает выражения вроде "2 * 3", "2 ** 3" и внутрисловные - * случаи (например COLOR_YELLOW) от ложного форматирования. */ -static uint8_t is_emph_flanked(char prev_ch, char next_ch) -{ - return (uint8_t)(ws_or_eol(prev_ch) != ws_or_eol_or_delim(next_ch)); -} - -/* Символ можно экранировать обратным слешем (\X): любая печатная ASCII- - * пунктуация (как в CommonMark). \* \_ \` \[ и т.п. → литерал X. */ -static uint8_t is_escapable(char c) -{ - return (uint8_t)(c >= '!' && c <= '~' && - !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))); -} - -/* Типы сегмента CK_* и стили INIT_STYLE_* — в mdview2.h (общие с таблицами). */ - -/* Доступ к индексу в EMM. - * Размер записи 8 байт, поэтому запись не пересекает границу страницы - * и bank_read/bank_write работают с цельным блоком. */ -static void idx_get(uint16_t idx, idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); /* номер страницы: idx / 2048 */ - uint16_t off = (uint16_t)((idx & 2047u) << 3); /* смещение записи: (idx % 2048) * 8 */ - bank_read(index_phys[page], off, r, INDEX_REC_SIZE); -} - -static void idx_put(uint16_t idx, const idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 2047u) << 3); - bank_write(index_phys[page], off, r, INDEX_REC_SIZE); -} - -uint32_t seg_off(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return file_size; - idx_get(idx, &r); - return r.off; -} - -/* Последняя строка индекса с исходным offset <= off — обратный перевод - * байт-позиции в MD-строку (позиционирование при F2/F8). Оффсеты сегментов - * монотонны, поэтому бинарный поиск (~15 bank-чтений). */ -uint16_t line_at_off(uint32_t off) -{ - uint16_t lo = 0, hi = n_lines; - while (lo < hi) { - uint16_t mid = (uint16_t)((lo + hi) >> 1); - if (seg_off(mid) <= off) lo = (uint16_t)(mid + 1); - else hi = mid; - } - return (lo > 0) ? (uint16_t)(lo - 1) : 0; -} - -/* Установка флагов (маска IF_*) всегда идёт в последний emit_seg (n_lines-1). - * Используется near-копия cur_rec, чтобы не делать обратное чтение из банка. */ -static void set_cur_flags(uint8_t f) { cur_rec.flags |= f; idx_put((uint16_t)(n_lines - 1), &cur_rec); } - -/* ================================================================== - * Индексация строк - * ================================================================== */ - -/* INIT_STYLE_* — в mdview2.h (общие с модулем таблиц). */ - -/* Тип строки, который возвращает classify_line(). */ -#define LK_PLAIN 0 -#define LK_H1 1 -#define LK_H2 2 -#define LK_H3 3 -#define LK_H4 4 /* также используется для H5/H6 */ -#define LK_HR 5 -#define LK_ULIST 6 /* маркер ненумерованного списка */ -#define LK_OLIST 7 /* маркер нумерованного списка */ -#define LK_QUOTE 8 /* маркер цитаты */ - -/* Классифицирует логическую строку. - * - Заголовки: 1..4 символа '#' и затем пробел/таб (H5/H6 сводятся к H4). - * - Горизонтальная линия: только '-', '*' или '_' (одного вида, >=3), - * возможно с пробелами/табами между символами. - * - Ненумерованный список: "- ", "* " или "+ " перед содержимым. - * - Нумерованный список: цифры + '.'/ ')' + пробел. - * - Цитата: '>' с опциональным пробелом. - * - Иначе обычный текст. - * Для заголовков/списков/цитат out_content указывает на первый байт - * содержимого после маркера и завершающего пробела. */ -static uint8_t classify_line(uint32_t p_start, uint32_t *out_content) -{ - if (p_start >= file_size) return LK_PLAIN; - - char c0 = fb(p_start); - - /* Заголовок? */ - if (c0 == '#') { - uint8_t lvl = 0; - uint32_t p = p_start; - while (p < file_size && fb(p) == '#' && lvl < 6) { - lvl++; p++; - } - if (p < file_size) { - char ch = fb(p); - if (ch == ' ' || ch == '\t') { - p++; - *out_content = p; - if (lvl > 4) lvl = 4; - return lvl; /* LK_H1 .. LK_H4 */ - } - } - /* Символ '#' без пробела после него не считается заголовком. */ - } - - /* Горизонтальный разделитель. - * Проверяется до списков, чтобы `- - -` не стало маркером списка. */ - if (is_hr_raw(p_start)) return LK_HR; - - /* Для списков/цитат дополнительно допускаем ведущие пробелы - * (базовая поддержка вложенности). */ - uint32_t lp = p_start; - while (lp < file_size && fb(lp) == ' ') lp++; - char cl = (lp < file_size) ? fb(lp) : 0; - - /* Ненумерованный список? */ - if ((cl == '-' || cl == '*' || cl == '+') && - (lp + 1) < file_size && - fb(lp + 1) == ' ') { - *out_content = lp + 2; - return LK_ULIST; - } - - /* Нумерованный список? */ - if (cl >= '0' && cl <= '9') { - uint32_t p = lp; - while (p < file_size) { - char ch = fb(p); - if (ch < '0' || ch > '9') break; - p++; - } - if (p < file_size) { - char ch = fb(p); - if ((ch == '.' || ch == ')') && - (p + 1) < file_size && fb(p + 1) == ' ') { - *out_content = p + 2; - return LK_OLIST; - } - } - } - - /* Цитата? */ - if (cl == '>') { - uint32_t p = lp + 1; - if (p < file_size && fb(p) == ' ') p++; - *out_content = p; - return LK_QUOTE; - } - - return LK_PLAIN; -} - -/* Возвращает видимую ширину префикса (отступ + маркер) в колонках. */ -static uint8_t marker_visible_col(uint8_t kind, uint32_t p_start, uint32_t content_off) -{ - switch (kind) { - case LK_ULIST: - case LK_QUOTE: - case LK_OLIST: return (uint8_t)(content_off - p_start); - default: return 0; /* plain/headers спец-префикса не имеют */ - } -} - -/* ================== Merge: сборка ячеек на этапе индекс-скана ============== - * Форвард-сканер (scan_join_stream/inline_scan + прямые emit'ы в index_lines) - * собирает готовые (char,attr)-ячейки в g_cells ПО ХОДУ единственного прохода - * по файлу — без отдельного второго скана. На каждом emit_seg ячейки - * ПРЕДЫДУЩего сегмента флашатся в кэш (lag-1: к этому моменту сегмент уже - * полностью просканирован); последний сегмент флашится после цикла index_lines. - * g_ncells_at_space — снимок длины на последнем пробеле для усечения буфера - * при переносе строки (отбрасываем уехавшее за границу слово). */ -static uint8_t g_cells[MAX_CACHE_LINE_LEN * 2]; -uint8_t g_ncells; /* ячеек в текущем сегменте (общий с таблицами) */ -static uint8_t g_ncells_at_space; /* снимок g_ncells на последнем пробеле (для усечения при переносе) */ -static uint8_t g_skip_flush; /* следующий emit_seg пропустит lag-флаш (pending уже зафлашен вручную, напр. перед таблицей) */ - -/* Обрыв индексации: причина (0 / TRUNC_CONTENT / TRUNC_LINES) и строка, на - * которой упёрлись. Выставляются ОДИН раз (первая причина побеждает); по ним - * index_lines() в конце пишет строку-сообщение (IF_TRUNC_MSG, рисуется вживую). */ -static uint8_t g_trunc_cause; -static uint16_t g_trunc_line; - -/* Пишет одну (char,attr)-ячейку в g_cells, молча игнорируя переполнение - * MAX_CACHE_LINE_LEN. Оставлена ФУНКЦИЕЙ намеренно: инлайн в сильно - * регистро-нагруженный скан-цикл на Z80/SDCC увеличивает спиллы и замедляет - * (проверено замером — макро-инлайн дал регрессию ~11→13с). */ -void gc_put(char ch, uint8_t attr) -{ - if (g_ncells < MAX_CACHE_LINE_LEN) { - uint16_t i = (uint16_t)g_ncells * 2u; - g_cells[i] = (uint8_t)ch; - g_cells[i + 1] = attr; - g_ncells++; - } -} -void gc_fill(char ch, uint8_t attr, uint8_t n) { while (n-- > 0) gc_put(ch, attr); } - -/* Пишет g_cells как контент кэша для line_idx: flags берём из idx-записи, - * пустой буфер/blank → len 0; иначе резервируем место в пуле и коммитим. */ -static void seg_commit_cells(uint16_t line_idx) -{ - cache_rec_t out_rec; - out_rec.flags = 0; out_rec.reserved = 0; out_rec.pad[0] = 0; out_rec.pad[1] = 0; - idx_rec_t r; - uint8_t have = (uint8_t)(line_idx < n_lines); - if (have) { idx_get(line_idx, &r); out_rec.flags = r.flags; } - if (!have || (r.flags & IF_BLANK) || g_ncells == 0) { - out_rec.page = 0; out_rec.off = 0; out_rec.len = 0; - cache_dir_put(line_idx, &out_rec); - return; - } - out_rec.len = g_ncells; - if (cache_reserve((uint16_t)(g_ncells * 2u), &out_rec.page, &out_rec.off)) { - cache_commit(out_rec.page, out_rec.off, g_cells, (uint16_t)(g_ncells * 2u)); - } else { - /* Контент-кэш исчерпан: фиксируем причину и строку обрыва (один раз). - * index_lines() оборвёт цикл и перезапишет эту строку сообщением. */ - if (!g_trunc_cause) { g_trunc_cause = TRUNC_CONTENT; g_trunc_line = line_idx; } - out_rec.page = 0; out_rec.off = 0; out_rec.len = 0; - } - cache_dir_put(line_idx, &out_rec); -} - - -static void emit_seg(uint32_t off, uint8_t style, uint8_t ckind, uint8_t cont) -{ - (void)ckind; /* тип сегмента восстанавливается флагами idx-записи */ - if (n_lines >= max_lines) { - index_truncated = 1; - if (!g_trunc_cause) { g_trunc_cause = TRUNC_LINES; g_trunc_line = (uint16_t)(max_lines - 1); } - return; - } - cur_rec.off = off; - cur_rec.flags = (uint8_t)(cont ? IF_CONT : 0); - cur_rec.style = (uint8_t)(style & 7u); - cur_rec.pad0 = 0; - cur_rec.pad1 = 0; - idx_put(n_lines, &cur_rec); - cur_seg_off = off; - n_lines++; - /* Флаш ячеек ПРЕДЫДУЩего сегмента (lag-1): он полностью собран форвард-сканером. */ - if (n_lines >= 2) { - if (g_skip_flush) g_skip_flush = 0; /* pending уже зафлашен вручную */ - else seg_commit_cells((uint16_t)(n_lines - 2)); - } - g_ncells = 0; /* буфер ячеек под новый сегмент */ - g_ncells_at_space = 0; -} - -/* Проверяет, что физическая строка пуста (только пробелы/таб + перевод строки). */ -static uint8_t is_line_blank(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == '\n') return 1; - if (c != ' ' && c != '\t') return 0; - p++; - } - return 1; -} - -/* Число ведущих пробелов строки (отступ). Используется для отделения - * dedent-пунктов списка (#3) и для отступа обычного абзаца (#4). */ -static uint8_t leading_spaces(uint32_t p) -{ - uint8_t n = 0; - while (p < file_size && fb(p) == ' ' && n < 250) { n++; p++; } - return n; -} - -/* Быстрая проверка границы fenced-блока по маркеру ``` . - * Ведущие пробелы/табы пропускаются — fence может быть с отступом - * (например, ``` ```c ``` внутри элемента списка с отступом 2+ пробела). - * Язык после бэктиков (```c, ```sh) игнорируется: достаточно трёх ` подряд. */ -static uint8_t is_fence_raw(uint32_t p) -{ - while (p < file_size && (fb(p) == ' ' || fb(p) == '\t')) p++; - if (p + 2 >= file_size) return 0; - return (fb(p) == '`' && fb(p + 1) == '`' && fb(p + 2) == '`'); -} - -/* Быстрая проверка горизонтального разделителя (`---`, `***`, `___`). */ -static uint8_t is_hr_raw(uint32_t p) -{ - char c0 = fb(p); - if (c0 != '-' && c0 != '*' && c0 != '_') return 0; - char marker = 0; - uint8_t count = 0, ok = 1; - uint32_t hr_p = p; - while (hr_p < file_size) { - char ch = fb(hr_p++); - if (ch == '\n' || ch == '\r') break; - if (ch == ' ' || ch == '\t') continue; - if (ch != '-' && ch != '*' && ch != '_') { ok = 0; break; } - if (marker == 0) marker = ch; - else if (ch != marker) { ok = 0; break; } - count++; - } - return ok && count >= 3; -} - -/* Строка таблицы: первый непустой символ — '|'. - * Ведущие пробелы разрешены; такие строки не склеиваются и не переносятся. */ -static uint8_t is_table_raw(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == ' ' || c == '\t') { p++; continue; } - return (uint8_t)(c == '|'); - } - return 0; -} - -/* Разбор одного inline-МАРКЕРА в позиции *pq (< bound): \X, [x], `, **, ~~, - * *, _, \t. Общий код для inline_scan() и scan_join_stream(). Возврат: 1 — - * маркер обработан (вызывающий делает continue), 0 — символ обычный (пробел/ - * текст), его кладёт сам вызывающий (и проверяет перенос). Меняет - * *pq/*pls/*pseg/*pprev. attr берётся как emph_to_attr(line_style, base) — - * для join base=ATTR_TEXT (атрибут «обычного» текста). */ -static uint8_t inline_marker(uint32_t *pq, uint32_t bound, uint8_t *pls, - uint8_t *pseg, char *pprev, uint8_t base) -{ - uint32_t q = *pq; - uint8_t ls = *pls; - char ch = fb(q); - uint8_t at = emph_to_attr(ls, base); /* атрибут литералов текущего стиля */ - - if (ls != INIT_STYLE_CODE && ch == '\\' && (q + 1) < bound && is_escapable(fb(q + 1))) { - char nb = fb(q + 1); - gc_put(nb, at); - *pseg += 1; *pq = q + 2; *pprev = nb; return 1; - } - if (ls != INIT_STYLE_CODE && ch == '[' && (q + 2) < bound && fb(q + 2) == ']') { - gc_put('[', ATTR_TEXT_BOLD); gc_put(fb(q + 1), ATTR_TEXT_BOLD); gc_put(']', ATTR_TEXT_BOLD); - *pseg += 3; *pq = q + 3; *pprev = ']'; return 1; - } - if (ch == '`') { - if (ls == INIT_STYLE_PLAIN) { *pls = INIT_STYLE_CODE; *pq = q + 1; return 1; } - if (ls == INIT_STYLE_CODE) { *pls = INIT_STYLE_PLAIN; *pq = q + 1; return 1; } - gc_put('`', at); *pseg += 1; *pq = q + 1; *pprev = '`'; return 1; - } - if (ch == '*' && (q + 1) < bound && fb(q + 1) == '*') { - char nx = ((q + 2) < bound) ? fb(q + 2) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = INIT_STYLE_BOLD; *pq = q + 2; return 1; } - if (ls == INIT_STYLE_BOLD && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 2; return 1; } - } - gc_put('*', at); gc_put('*', at); - *pseg += 2; *pq = q + 2; *pprev = '*'; return 1; - } - if (ch == '~' && (q + 1) < bound && fb(q + 1) == '~') { - char nx = ((q + 2) < bound) ? fb(q + 2) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = INIT_STYLE_STRIKE; *pq = q + 2; return 1; } - if (ls == INIT_STYLE_STRIKE && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 2; return 1; } - } - gc_put('~', at); gc_put('~', at); - *pseg += 2; *pq = q + 2; *pprev = '~'; return 1; - } - if (ch == '*' || ch == '_') { - char nx = ((q + 1) < bound) ? fb(q + 1) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - uint8_t ns = (ch == '*') ? INIT_STYLE_ITALIC : INIT_STYLE_UNDER; - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = ns; *pq = q + 1; return 1; } - if (ls != INIT_STYLE_PLAIN && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 1; return 1; } - } - gc_put(ch, at); *pseg += 1; *pq = q + 1; *pprev = ch; return 1; - } - if (ch == '\t') { - uint8_t old_sc = *pseg; - uint8_t tgt_full = (uint8_t)((old_sc & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - uint8_t tgt = tgt_full; if (tgt > SCREEN_W) tgt = SCREEN_W; - gc_fill(' ', at, (uint8_t)(tgt_full - old_sc)); - *pseg = tgt; *pq = q + 1; *pprev = ' '; return 1; - } - return 0; /* пробел или обычный символ — обрабатывает вызывающий */ -} - -#define JOIN_MODE_NONE 0u -#define JOIN_MODE_LIST 1u -#define JOIN_MODE_QUOTE 2u -#define JOIN_MODE_PLAIN 3u - -/* ================== Единый сканер сегмента ================================ - * Общий цикл inline-форматирования, переносов и (в join-режимах) склейки - * физических строк — бывшие inline_scan + scan_join_stream. mode: - * JOIN_MODE_NONE — сканировать РОВНО [q, bound) без склейки; '\n' в - * диапазоне не ожидается (вызывающие дают строку/ячейку до EOL); - * активны base_attr (title-attr заголовка) и nowrap (замер таблиц); - * ckind всегда CK_OTHER (continuation-префикс не эмитится). - * JOIN_MODE_LIST/QUOTE/PLAIN — правила '\n'-склейки; bound == file_size, - * base_attr == ATTR_TEXT (emph_to_attr(ls, ATTR_TEXT) тождественно - * бывшему styles_map[ls]), nowrap == 0. - * Возвращает позицию останова; итоговый стиль — через *io_line_style. */ -static uint32_t scan_stream(uint32_t q, uint32_t bound, uint32_t para_start, - uint8_t col, uint8_t ckind, uint8_t *io_line_style, - uint8_t base_attr, uint8_t nowrap, uint8_t mode) -{ - uint32_t last_space = 0xFFFFFFFFu; - uint8_t last_space_style = *io_line_style; /* снимок line_style на момент last_space */ - char prev_ch = ' '; - uint8_t seg_col = col; - uint8_t line_style = *io_line_style; - /* base — атрибут «обычного» текста сегмента. Для заголовка первый сегмент - * имеет title-attr, а continuation-сегменты render рисует как PLAIN — - * переключаем base после 1-го переноса (в join-режимах base == ATTR_TEXT - * и присваивание ничего не меняет). */ - uint8_t base = base_attr; - - while (q < bound && n_lines < max_lines) { - char ch = fb(q); - uint8_t soft_break = 0; - - if (ch == '\n') { - uint32_t next = q + 1; - if (mode == JOIN_MODE_NONE) break; /* NONE: '\n' в [q,bound) не ожидается */ - if (next >= bound) break; - - if (mode == JOIN_MODE_LIST) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind == LK_ULIST || next_kind == LK_OLIST || - next_kind == LK_QUOTE || - (next_kind >= LK_H1 && next_kind <= LK_H4) || - next_kind == LK_HR) { - break; - } - } - while (next < bound) { - char ws = fb(next); - if (ws == ' ' || ws == '\t') next++; - else break; - } - q = next; - soft_break = 1; - ch = ' '; - } else if (mode == JOIN_MODE_QUOTE) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind != LK_QUOTE) break; - - { - uint32_t next_line_end = row_end(next_content); - - { - uint8_t empty_quote = 1; - for (uint32_t z = next_content; z < next_line_end; z++) { - char c = fb(z); - if (c != ' ' && c != '\t') { empty_quote = 0; break; } - } - if (empty_quote) break; - } - - { - uint32_t t = next_content; - while (t < next_line_end && (fb(t) == ' ' || fb(t) == '\t')) t++; - if (t < next_line_end && fb(t) == '>') break; - } - - while (next_content < next_line_end) { - char ws = fb(next_content); - if (ws == ' ' || ws == '\t') next_content++; - else break; - } - if (next_content < next_line_end && fb(next_content) == '>') { - next_content++; - if (next_content < next_line_end && fb(next_content) == ' ') next_content++; - } - q = next_content; - soft_break = 1; - ch = ' '; - } - } - } else { /* JOIN_MODE_PLAIN */ - if (fb(next) == '\n') break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - { - uint32_t dummy; - if (classify_line(next, &dummy) != LK_PLAIN) break; - } - if (is_line_blank(next)) break; - - { - uint8_t is_hard = 0; - if (q >= para_start + 1) { - char b1 = fb(q - 1); - if (b1 == '\\') { - is_hard = 1; - } else if (q >= para_start + 2) { - char b2 = fb(q - 2); - if ((b1 == ' ' || b1 == '\t') && (b2 == ' ' || b2 == '\t')) - is_hard = 1; - } - } - if (is_hard) { - q++; - emit_seg(q, line_style, ckind, 0); - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - seg_col = col; - continue; - } - } - - q++; - /* как render: пропускаем ведущие пробелы/табы строки-продолжения, - * склейка даёт РОВНО один пробел (иначе merge эмитит отступ как лишние ячейки) */ - while (q < bound && (fb(q) == ' ' || fb(q) == '\t')) q++; - soft_break = 1; - ch = ' '; - } - } - - /* Inline-маркеры (\X [x] ` ** ~~ * _ \t) — общий разбор; при - * soft_break ch==' ' (синтетический пробел склейки) — маркеры - * пропускаем, его кладёт ветка пробела ниже. */ - if (!soft_break && inline_marker(&q, bound, &line_style, &seg_col, &prev_ch, base)) - continue; - - if (ch == ' ') { - gc_put(' ', emph_to_attr(line_style, base)); - if (soft_break) { - last_space = q; /* синтетический пробел склейки */ - } else { - last_space = q + 1; - q++; - } - last_space_style = line_style; - g_ncells_at_space = g_ncells; /* снимок для усечения */ - seg_col++; - prev_ch = ' '; - } else { - gc_put(ch, emph_to_attr(line_style, base)); - seg_col++; - q++; /* soft_break здесь всегда 0 (ch != ' ') */ - prev_ch = ch; - } - if (!nowrap && seg_col >= SCREEN_W) { - uint8_t use_ls = (uint8_t)(last_space != 0xFFFFFFFFu && last_space > cur_seg_off); - uint32_t wrap_at = use_ls ? last_space : q; - if (wrap_at >= bound || wrap_at == cur_seg_off) break; - uint8_t wrap_style = use_ls ? last_space_style : line_style; - if (use_ls) g_ncells = g_ncells_at_space; /* усечь до пробела */ - emit_seg(wrap_at, wrap_style, ckind, 1); - base = ATTR_TEXT; /* continuation заголовка → PLAIN (в join base и так ATTR_TEXT) */ - /* Префикс continuation-сегмента: список и отступленный абзац (#4) — - * col пробелов выравнивания; цитата — отступ + маркер 0xB3 + пробел. - * Для обычного абзаца без отступа col==0 → префикса нет; CK_OTHER - * (заголовки/таблицы, NONE-режим) — префикса нет. */ - if (ckind == CK_LIST || ckind == CK_PLAIN) { - gc_fill(' ', ATTR_TEXT, col); - } else if (ckind == CK_QUOTE) { - uint32_t content_off2 = para_start + col; - uint8_t qsp = 0; - while (qsp + 2 < content_off2 && qsp < SCREEN_W && fb(para_start + qsp) == ' ') qsp++; - gc_fill(' ', ATTR_TEXT, qsp); - gc_put(0xB3, ATTR_QUOTE_MARKER); - gc_put(' ', ATTR_TEXT); - } - seg_col = col; - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - q = wrap_at; - /* Откатываем line_style к снимку на момент wrap_at: диапазон - * [wrap_at, q_old) будет пересканирован заново, и переключающие - * символы (обратная кавычка, звёздочка, подчёркивание, тильда) - * внутри него иначе применились бы дважды — именно так возникал - * баг: code-маркер на границе переноса ломает цвет следующего слова (mdview.c, отчёт пользователя - * 2026-06-23). */ - line_style = wrap_style; - } - } - - *io_line_style = line_style; - return q; -} - -/* Тонкая обёртка прежнего API: скан ровно [q, q_end) без склейки строк. - * Вызывается для заголовков и ячеек таблиц (всегда CK_OTHER, col=0). */ -uint8_t inline_scan(uint32_t q, uint32_t q_end, uint8_t col, - uint8_t ckind, uint8_t line_style, uint8_t base_attr, - uint8_t nowrap) -{ - (void)scan_stream(q, q_end, q, col, ckind, &line_style, base_attr, nowrap, - JOIN_MODE_NONE); - return line_style; -} - -/* Потоковый сканер для index_lines(): mode задаёт правила '\n'-склейки. */ -static uint32_t scan_join_stream(uint32_t q, uint32_t para_start, uint8_t col, - uint8_t ckind, uint8_t *io_line_style, uint8_t mode) -{ - return scan_stream(q, file_size, para_start, col, ckind, io_line_style, - ATTR_TEXT, 0, mode); -} - -/* Отрисовка таблиц (row_end/table_*) — в модуле mdview2_table.c. */ - -/* ================== Резюмируемый проход индексации ======================= - * Бывший монолит index_lines() порезан на begin/step/finish, чтобы фоновая - * сборка второго набора (bg_step ядра) могла выполнять индексацию порциями - * в паузах между клавишами. Всё межшаговое состояние — в статиках модуля - * (idx_p/idx_in_block ниже + g_cells/cur_rec/g_trunc_* выше); оно НЕ входит - * в docset_t и переживает свапы наборов, потому что обработчики клавиш - * видимого набора индексатор не трогают. */ -static uint32_t idx_p; /* позиция чтения исходника между шагами */ -static uint8_t idx_in_block; /* внутри fenced code-блока */ -static uint8_t idx_active; /* 1 = проход начат и ещё не финализирован */ - -/* Начинает новый проход (сброс позиции/буферов/причин обрыва). */ -void index_begin(void) -{ - idx_p = 0; - idx_in_block = 0; - n_lines = 0; - index_truncated = 0; - g_trunc_cause = 0; - g_trunc_line = 0; - cur_seg_off = 0xFFFFFFFFu; /* пока не эмитили ни одного сегмента */ - g_ncells = 0; - g_ncells_at_space = 0; - g_skip_flush = 0; - idx_active = 1; -} - -/* Хвост прохода: финальный флаш ячеек + строка-обрыв (бывший финал index_lines). */ -static void index_finish(void) -{ - idx_active = 0; - /* emit_seg() флашит ячейки с отставанием на одну строку (см. её - * комментарий) — последняя эмитированная строка файла так и остаётся - * незафлашенной, её ячейки ещё в g_cells; коммитим здесь. */ - if (n_lines > 0) seg_commit_cells((uint16_t)(n_lines - 1)); - - /* Лимит строк ловим ЗДЕСЬ, а не в emit_seg: главный цикл выходит по - * `n_lines < max_lines` ДО того, как emit_seg будет вызван в переполненном - * состоянии (для code-block — один emit_seg на строку, эта ветка не - * достигается). Признак — остановились, а файл не кончился; g_abort и - * исчерпание контента (TRUNC_CONTENT) уже обработаны/исключены. */ - if (!g_trunc_cause && !g_abort && idx_p < file_size) { - g_trunc_cause = TRUNC_LINES; - g_trunc_line = (uint16_t)(max_lines - 1); - } - - /* Файл был обрезан до 256 КБ при загрузке, а индексация дошла до конца - * клампнутых данных без исчерпания контента/строк → ДОПИСЫВАЕМ строку - * (место есть: n_lines < max_lines). Приоритет ниже content/lines — - * те означают, что обрезали ещё раньше, их сообщение точнее. */ - if (!g_trunc_cause && !g_abort && g_file_clamped) { - g_trunc_cause = TRUNC_FILE; - g_trunc_line = n_lines; - } - - /* Обрыв по контенту/лимиту строк (не путать с пользовательским g_abort): - * документ заканчиваем строкой-сообщением на g_trunc_line. Сообщение - * рисуется вживую (IF_TRUNC_MSG) — место в контент-кэше ему не нужно, что - * и снимает тупик «кэш полон, а сообщение тоже надо закэшировать». */ - if (g_trunc_cause && !g_abort) { - cache_rec_t r; - r.page = 0; r.off = 0; r.len = 0; - r.flags = IF_TRUNC_MSG; r.reserved = g_trunc_cause; - r.pad[0] = 0; r.pad[1] = 0; - cache_dir_put(g_trunc_line, &r); - n_lines = (uint16_t)(g_trunc_line + 1); /* документ кончается на строке-обрыве */ - } -} - -/* Одна итерация бывшего главного цикла index_lines(): классифицирует и - * эмитит очередной блок исходника (параграф/строку кода/таблицу целиком). - * do{}while(0) сохраняет исходные `continue` тела как выход из итерации - * с записью локальной p обратно в idx_p. */ -static void index_iter(void) -{ - if (g_loading) - progress_tick(); /* первый экран + статус + скролл по готовым данным */ - else if (!g_bg_building && (n_lines & 15) == 0) - spinner_tick(); - - uint32_t p = idx_p; - do { - /* Пустая строка — разделитель параграфов. - * В индекс добавляем не более одной пустой экранной строки подряд. */ - if (is_line_blank(p)) { - p = next_line(p); - /* Серия пустых строк схлопывается в одну визуальную строку. */ - if (n_lines == 0 || !(cur_rec.flags & IF_BLANK)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_PLAIN, 0); - set_cur_flags(IF_BLANK); - } - continue; - } - - /* ---- fenced code-блок (граница или тело) ---- */ - if (is_fence_raw(p)) { - idx_in_block = !idx_in_block; - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP); - p = next_line(p); - continue; - } - if (idx_in_block) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_CODE | IF_HSCROLL); /* код скроллится целым блоком */ - { - uint8_t ccx = 0; - uint32_t pp = p; - while (pp < file_size && fb(pp) != '\n') { - char ch = fb(pp); - if (ch == '\t') { - uint8_t tgt = (uint8_t)((ccx & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - gc_fill(' ', ATTR_TEXT_CODE, (uint8_t)(tgt - ccx)); - ccx = tgt; - } else if (ch == '\r') { - gc_put(' ', ATTR_TEXT_CODE); ccx++; /* как render: \r → пробел */ - } else { - gc_put(ch, ATTR_TEXT_CODE); ccx++; - } - pp++; - } - } - p = next_line(p); - continue; - } - - /* ---- горизонтальный разделитель ---- */ - if (is_hr_raw(p)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP); - gc_fill(0xC4, ATTR_HR, SCREEN_W); - p = next_line(p); - continue; - } - - /* ---- строка таблицы (| ... |): один nowrap-сегмент на исходную строку ---- */ - if (is_table_raw(p)) { - /* Освобождаем g_cells под измерение ширин: коммитим pending-сегмент - * сейчас; первый emit_seg таблицы пропустит свой lag-флаш. */ - if (n_lines >= 1) { seg_commit_cells((uint16_t)(n_lines - 1)); g_skip_flush = 1; } - g_ncells = 0; - - /* Проход 1: границы блока + ОТРЕНДЕРЕННЫЕ ширины колонок (мерим тем же - * inline_scan, что и при отрисовке — невидимые маркеры стиля не считаются). */ - uint8_t widths[TBL_MAX_COLS]; - for (uint8_t i = 0; i < TBL_MAX_COLS; i++) widths[i] = 0; - uint8_t ncols = 0; - uint32_t r = p; - while (r < file_size && is_table_raw(r)) { - uint32_t le = row_end(r); - uint8_t sep = table_is_sep_row(r, le); - uint32_t cp = table_first_cell(r); - uint32_t cs, ce; - uint8_t c = 0; - while (c < TBL_MAX_COLS && table_next_cell(&cp, le, &cs, &ce)) { - if (!sep && ce > cs) { - g_ncells = 0; - (void)inline_scan(cs, ce, 0, CK_OTHER, INIT_STYLE_PLAIN, ATTR_TEXT, 1); - if (g_ncells > widths[c]) widths[c] = g_ncells; - } - c++; - } - if (c > ncols) ncols = c; - r = (le < file_size) ? le + 1 : le; - } - g_ncells = 0; /* чисто для верхней рамки */ - uint32_t tbl_end = r; - if (ncols == 0) ncols = 1; - - /* Проход 2: верхняя рамка → строки/разделитель → нижняя рамка. */ - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - table_border(widths, ncols, TBL_TL, TBL_TM, TBL_TR); - - r = p; - while (r < tbl_end) { - uint32_t le = row_end(r); - emit_seg(r, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - if (table_is_sep_row(r, le)) table_border(widths, ncols, TBL_ML, TBL_MM, TBL_MR); - else table_data_row(r, le, widths, ncols); - r = (le < file_size) ? le + 1 : le; - } - - emit_seg(tbl_end, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - table_border(widths, ncols, TBL_BL, TBL_BM, TBL_BR); - - p = tbl_end; - continue; - } - - /* ---- классификация текущей строки ---- */ - uint32_t content_off = p; - uint8_t kind = classify_line(p, &content_off); - - /* ---- Заголовок: отдельная строка, не склеивается с параграфом ---- */ - if (kind >= LK_H1 && kind <= LK_H4) { - uint8_t hbase; /* title-attr, как в render */ - switch (kind) { - case LK_H1: hbase = ATTR_TEXT_TITLE1; break; - case LK_H2: hbase = ATTR_TEXT_TITLE2; break; - case LK_H3: hbase = ATTR_TEXT_TITLE3; break; - default: hbase = ATTR_TEXT_TITLE4; break; - } - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - uint32_t line_end = row_end(content_off); - (void)inline_scan(content_off, line_end, 0, CK_OTHER, INIT_STYLE_PLAIN, hbase, 0); - p = next_line(p); - continue; - } - - /* ---- Пункт списка: может занимать несколько физических строк ---- */ - if (kind == LK_ULIST || kind == LK_OLIST) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_LIST, 0); - /* Префикс ПЕРВОГО сегмента: отступ + маркер + пробел (как render). */ - { - uint32_t qq = p, qmax = p + SCREEN_W; - if (kind == LK_ULIST) { - while (qq + 2 < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - gc_put(0x07, ATTR_LIST_MARKER); - gc_put(' ', ATTR_TEXT); - } else { - while (qq < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - while (qq < content_off - 1) { gc_put(fb(qq), ATTR_LIST_MARKER); qq++; } - gc_put(' ', ATTR_TEXT); - } - } - q = scan_join_stream(q, p, col, CK_LIST, &line_style, JOIN_MODE_LIST); - - /* Переходим к началу следующей физической строки после пункта. */ - q = next_line(q); - - /* Одна пустая строка между соседними маркерами списка подавляется. - * Две и более пустых строки оставляют видимый разделитель. */ - if (q < file_size && is_line_blank(q)) { - uint32_t t = q; - uint8_t blanks = 0; - while (t < file_size && is_line_blank(t)) { - t = next_line(t); - blanks++; - // if (blanks >= 2) break; - } - if (blanks == 1 && t < file_size) { - uint32_t d = t; - uint8_t nk = classify_line(t, &d); - if (nk == LK_ULIST || nk == LK_OLIST) { - /* #3: подавляем blank только если следующий пункт того же - * уровня или глубже; при МЕНЬШЕМ отступе (dedent) пустую - * строку оставляем — пункты должны визуально разделиться. */ - if (leading_spaces(t) >= leading_spaces(p)) { - p = t; /* подавляем единственную пустую строку */ - continue; - } - } - } - } - - p = q; - continue; - } - - /* ---- Параграф цитаты: может покрывать несколько физических строк ---- */ - if (kind == LK_QUOTE) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_QUOTE, 0); - /* Префикс ПЕРВОГО сегмента: отступ + маркер 0xB3 + пробел (как render LK_QUOTE). */ - { - uint32_t qq = p, qmax = p + SCREEN_W; - while (qq + 1 < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - gc_put(0xB3, ATTR_QUOTE_MARKER); - gc_put(' ', ATTR_TEXT); - } - q = scan_join_stream(q, p, col, CK_QUOTE, &line_style, JOIN_MODE_QUOTE); - - p = next_line(q); - continue; - } - - /* ---- Обычный текстовый параграф: склейка через soft-break ---- */ - { - uint8_t line_style = INIT_STYLE_PLAIN; - /* #4: если абзац начинается с отступа — все его перенесённые строки - * получают такой же отступ (как continuation-префикс списка, но без - * маркера). Контент сканируем после отступа. Патологически большой - * отступ игнорируем. */ - uint8_t indent = leading_spaces(p); - if (indent >= SCREEN_W / 2) indent = 0; - - emit_seg(p, line_style, CK_PLAIN, 0); - if (indent) gc_fill(' ', ATTR_TEXT, indent); /* префикс первого сегмента */ - - uint32_t q = p + indent; - q = scan_join_stream(q, p, indent, CK_PLAIN, &line_style, JOIN_MODE_PLAIN); - - if (q >= file_size) { - p = file_size; - } else { - /* q стоит на завершающем newline параграфа. - * Переходим на следующую строку, чтобы внешняя петля её - * корректно переклассифицировала. */ - p = next_line(q); - } - } - } while (0); - idx_p = p; -} - -/* Выполняет до budget итераций индексации. Возврат: 1 — проход завершён - * (индекс финализирован index_finish), 0 — есть ещё работа. - * Конвертация UTF-8 держится впереди позиции чтения ЗДЕСЬ, до проверки - * условия останова: пока исходник не сконвертирован до конца, idx_p не - * может «догнать» file_size и оборвать проход преждевременно. */ -uint8_t index_step(uint8_t budget) -{ - if (!idx_active) return 1; - while (budget-- > 0) { - /* UTF-8: держим конвертацию впереди позиции чтения (включая look-ahead - * склейки/классификации ~ один абзац). file_size при этом = доступная - * сконвертированная часть и растёт по ходу. */ - if (g_utf_building && (uint32_t)(idx_p + CONV_MARGIN) > file_size) - utf_convert_more((uint32_t)(idx_p + CONV_MARGIN)); - - if (!(idx_p < file_size && n_lines < max_lines && !g_abort && !g_trunc_cause)) { - index_finish(); - return 1; - } - index_iter(); - } - return 0; -} -#define EM_NONE 0 -#define EM_BOLD 1 -#define EM_ITALIC 2 -#define EM_UNDER 3 -#define EM_CODE 4 -#define EM_STRIKE 5 - -/* Преобразует внутреннее состояние emphasis в экранный атрибут. */ -static uint8_t emph_to_attr(uint8_t emph, uint8_t base_attr) -{ - switch (emph) { - case EM_BOLD: return ATTR_TEXT_BOLD; - case EM_ITALIC: return ATTR_TEXT_ITALIC; - case EM_UNDER: return ATTR_TEXT_UNDERSORE; - case EM_CODE: return ATTR_TEXT_CODE; - case EM_STRIKE: return ATTR_TEXT_STRIKE; - default: return base_attr; - } -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_md.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_md.c deleted file mode 100644 index 712d949..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_md.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * mdview2_md.c — представление MD-документа (peer к mdview2_raw.c): отрисовка - * области из рендер-кэша + прокрутка (верт./гориз.) + навигация md_key(). - * Статус-бар, меню и спиннер — в mdview2_status.c (общие для MD/RAW). - * - * Работает поверх готового рендер-кэша (cache_dir_get → cache_rec_t) и - * состояния навигации (top_line/viewport_x/n_lines, см. mdview2.h). Никакого - * парсинга/обращения к исходному файлу: всё рисуется из (char,attr)-ячеек кэша - * через win_rest_remap (ремап 8-битных кодировок — в mdview2_enc.c). - * - * Пара видов: mdview2_md.c (MD, из кэша) ↔ mdview2_raw.c (RAW, из fb()). - */ - -#include -#include /* wrchar/scroll/COLOR */ -#include /* bios_set_place/bios_fillcharattr */ -#include "mdview2.h" - -/* Фаза 4-5 — cache-only draw path: рисует одну строку ИЗ КЭША, без - * единого обращения к fb()/исходному файлу. Горизонтальный скролл для - * nowrap-строк (Фаза 5) — это просто смещение начала среза на vx*2 - * байт ВНУТРИ ТОГО ЖЕ кэш-буфера (cache_reserve гарантирует, что вся - * строка лежит в одной странице, так что off+vx*2 не пересекает - * границу страницы); не nowrap-строки игнорируют viewport_x, как и - * раньше в живом render_line() (там это называлось effective_vx). */ -static void draw_line_from_cache(uint16_t line_idx, uint8_t row) -{ - cache_rec_t rec; - cache_dir_get(line_idx, &rec); - - /* Строка-обрыв (исчерпан контент-кэш / лимит строк): фикс. текст вживую, - * без обращения к контент-кэшу (см. index_lines финализацию). */ - if (rec.flags & IF_TRUNC_MSG) { - const char *msg; - switch (rec.reserved) { - case TRUNC_LINES: msg = "*** Line limit reached - document truncated ***"; break; - case TRUNC_FILE: msg = "*** File too large - truncated at 256 KB ***"; break; - default: msg = "*** Content cache exhausted - document truncated ***"; break; - } - bios_set_place(row, 0); - bios_fillcharattr(' ', ATTR_WARN, SCREEN_W); - put_str_attr(2, row, msg, ATTR_WARN); - return; - } - - bios_set_place(row, 0); - bios_fillcharattr(' ', ATTR_TEXT, SCREEN_W); - - /* Горизонтальный сдвиг применяется ко ВСЕМ строкам hscroll-блока (код, - * таблицы) — по ТИПУ, а не по длине: блок двигается целиком, включая - * строки короче 80 (короткая строка, ушедшая за левый край, просто - * показывает маркер '<' на пустом месте). HR и границы fence не имеют - * IF_HSCROLL и не сдвигаются. */ - uint8_t vx = (rec.flags & IF_HSCROLL) ? viewport_x : 0; - - if (rec.len > vx) { - uint16_t remaining = (uint16_t)(rec.len - vx); - uint8_t w = (remaining > SCREEN_W) ? SCREEN_W : (uint8_t)remaining; - uint16_t off = (uint16_t)(rec.off + (uint16_t)vx * 2u); - win_rest_remap(row, w, rec.page, off); - if (remaining > SCREEN_W) { - wrchar(SCREEN_W - 1, row, '>', ATTR_TRUNC); - } - } - if (vx > 0) { - wrchar(0, row, '<', ATTR_TRUNC); - } -} - -/* Перерисовывает все VIEW_H строк окна из кэша — основной путь - * перерисовки видимой области после загрузки файла (Фаза 3-4). */ -void draw_viewport_from_cache(void) -{ - for (uint8_t i = 0; i < VIEW_H; i++) { - draw_line_from_cache((uint16_t)(top_line + i), (uint8_t)(VIEW_TOP_ROW + i)); - } -} - - -/* ================================================================== - * Прокрутка - * ================================================================== */ - -/* Ограничивает top_line допустимым диапазоном с учётом высоты окна. */ -void clamp_top(void) -{ - if (n_lines <= VIEW_H) { - top_line = 0; - } else if (top_line > n_lines - VIEW_H) { - top_line = (uint16_t)(n_lines - VIEW_H); - } -} - -/* Прокрутка вверх на n строк с частичной перерисовкой при n == 1. */ -void md_scroll_up(uint16_t n) -{ - uint16_t new_top_line = (top_line >= n) ? (uint16_t)(top_line - n) : 0; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); - draw_line_from_cache((uint16_t)(top_line), (uint8_t)(VIEW_TOP_ROW)); - } else { - draw_viewport_from_cache(); - } - } -} - -/* Прокрутка вниз на n строк с частичной перерисовкой при n == 1. */ -void md_scroll_down(uint16_t n) -{ - uint16_t new_top_line = (top_line + n < n_lines - VIEW_H) ? - (uint16_t)(top_line + n) : n_lines - VIEW_H; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); - draw_line_from_cache((uint16_t)(top_line + VIEW_H - 1), (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); - } else { - clamp_top(); - draw_viewport_from_cache(); - } - } -} - -/* Горизонтальный сдвиг (только если в окне есть nowrap-строки). - * Максимум сдвига ограничен самой широкой nowrap-строкой на экране. - * Фаза 5: ширина берётся прямо из директории кэша (rec.len — уже - * посчитанная реальная длина в ячейках после рендера), без единого - * обращения к fb()/seg_off()/исходному файлу. */ -void md_scroll_horizon(int8_t delta) -{ - uint16_t maxw = 0; - for (uint8_t i = 0; i < VIEW_H; i++) { - uint16_t li = (uint16_t)(top_line + i); - if (li >= n_lines) break; - cache_rec_t rec; - cache_dir_get(li, &rec); - if (!(rec.flags & IF_HSCROLL)) continue; /* только код/таблицы */ - if (rec.len > maxw) maxw = rec.len; /* самая широкая строка блока */ - } - if (maxw == 0) return; /* нет строк шире экрана */ - - /* Максимальный сдвиг = ширина за пределами экрана, в границах uint8. */ - uint16_t over = (maxw > SCREEN_W) ? (uint16_t)(maxw - SCREEN_W) : 0; - if (over > 248u) over = 248u; - uint8_t max_vx = (uint8_t)over; - - int16_t nx = (int16_t)viewport_x + delta; - if (nx < 0) nx = 0; - if (nx > (int16_t)max_vx) nx = max_vx; - - /* ПОРЯДОК ВАЖЕН: записываем viewport_x ДО сравнения, а сравниваем уже - * сохранённую копию old_vx с new_vx. Иначе SDCC генерирует для - * `if (new_vx != viewport_x) viewport_x = new_vx;` такой код: - * ld a, new_vx ; sub a,(viewport_x) ; jr Z,.. ; ld (viewport_x),a - * — т.е. для записи переиспользует регистр A, испорченный вычитанием в - * сравнении, и кладёт в viewport_x не new_vx, а (new_vx - old_vx). - * (asm-дамп 2026-06-24 подтвердил; даёт 10-8=2, 10-2=8 — ровно - * наблюдавшийся "прыжок" скролла.) Записав viewport_x первой, мы убираем - * портящий sub с пути записи; сравнение ниже только решает, перерисовывать - * ли экран. */ - uint8_t new_vx = (uint8_t)nx; - uint8_t old_vx = viewport_x; - viewport_x = new_vx; - if (new_vx != old_vx) - draw_viewport_from_cache(); -} - -/* Процент прокрутки (0..100) относительно доступного диапазона. */ -static uint8_t calc_md_pct(void) -{ - uint16_t total = drawable_lines(); - if (total <= VIEW_H) return 100; - return pct16(top_line, (uint16_t)(total - VIEW_H)); -} - -/* ---- навигация MD после загрузки (peer к raw_key) ---------------- */ - -/* Обрабатывает навигационную клавишу в MD-режиме (вызывается из главного - * цикла). Сама перерисовывает область/статус. Возврат: 1 — обработано, - * 0 — не наша клавиша (F1/F8/F10 разбирает main). */ -uint8_t md_key(uint8_t scan) -{ - switch (scan) { - case KEY_UP: - md_scroll_up(1); - break; - case KEY_DOWN: - md_scroll_down(1); - break; - case KEY_LEFT: - md_scroll_horizon(-(int8_t)HPAN_STEP); - break; - case KEY_RIGHT: - md_scroll_horizon(+(int8_t)HPAN_STEP); - break; - case KEY_PGUP: - md_scroll_up(VIEW_H); - break; - case KEY_PGDN: - md_scroll_down(VIEW_H); - break; - case KEY_HOME: - if(top_line != 0 || viewport_x != 0 ) { - top_line = 0; - viewport_x = 0; - draw_viewport_from_cache(); - } - break; - case KEY_END: - uint16_t new_top_line = (n_lines > VIEW_H) ? (uint16_t)(n_lines - VIEW_H) : 0; - if(top_line != new_top_line || viewport_x != 0 ) { - top_line = new_top_line; - viewport_x = 0; - draw_viewport_from_cache(); - } - break; - - default: - return 0; /* не наша клавиша */ - } - - render_percent_progress(calc_md_pct()); - render_md_status_numbers(); - return 1; -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_raw.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_raw.c deleted file mode 100644 index 051214b..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_raw.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * mdview2_raw.c — RAW-просмотр исходного текста (без markdown-форматирования). - * - * Работает по АКТИВНОМУ буферу документа через fb() (8-бит = исходные байты, - * UTF-8 = декодированный в CP866 буфер), ремап ≥0x80 (CP1251/KOI8) — на - * отрисовке. Индекс/кэш markdown не используются: позиция — байт-offset, - * 1 байт = 1 ячейка, \t показываем пробелом. Два режима: - * VIEW_RAW_WRAP — длинные строки переносятся кратно 80 (рвём слова); - * VIEW_RAW_HSCROLL — строка в один ряд, горизонтальный скролл. - * - * Память: 0 доп. EMM; near-буфер строки + переиспользование g_scratch_phys. - */ - -#include -#include -#include -#include -#include "mdview2.h" - -#if WITH_RAW /* весь модуль — опционален (mdview_conf.h); при 0 пустой объектник */ - -static uint32_t raw_top; /* байт-offset верхней строки экрана */ -static uint16_t raw_hpan; /* гориз. сдвиг (только HSCROLL) */ - -/* ---- примитивы навигации по физическим строкам / переносам -------- */ - -static uint32_t raw_line_start(uint32_t off) -{ - while (off && fb(off - 1) != '\n') off--; - return off; -} - -/* WRAP: начало следующего ряда от off (\n завершает строку; иначе +80). */ -static uint32_t raw_next_wrap(uint32_t off) -{ - uint32_t e = off, lim = off + SCREEN_W; - while (e < file_size) { - if (fb(e) == '\n') return e + 1; - e++; - if (e >= lim) { /* прошли 80 без \n */ - if (e < file_size && fb(e) == '\n') return e + 1; /* ровно 80 + \n */ - return e; /* длинная строка → продолжение */ - } - } - return e; /* EOF */ -} - -static uint32_t raw_prev_wrap(uint32_t off) -{ - if (off == 0) return 0; - uint32_t pls = raw_line_start(off - 1); /* off-1 — это \n пред. строки */ - while (pls + SCREEN_W < (off - 1)) pls += SCREEN_W; - return pls; -} - -/* HSCROLL: начало следующей/предыдущей физической строки. */ -static uint32_t raw_next_line(uint32_t off) -{ - while (off < file_size && fb(off) != '\n') off++; - return (off < file_size) ? off + 1 : off; -} - -static uint32_t raw_prev_line(uint32_t off) -{ - if (off == 0) return 0; - return raw_line_start(off - 1); -} - -/* ---- отрисовка ряда (общий near-буфер → g_scratch_phys → win_rest) - */ - -static uint8_t raw_buf[SCREEN_W + 1]; /* только символы (атрибут единый, задаётся при выводе) */ - -/* В RAW атрибут единый (ATTR_TEXT): буфер — только 80 символов, без пар - * (char,attr). Кладём один байт-глиф (\t→пробел, ремап ≥0x80). */ -static void raw_cell(uint8_t i, uint8_t ch) -{ - if (ch >= 0x80 && g_remap) ch = g_remap[ch - 0x80]; - raw_buf[i] = ch; -} -/* Вывод готового 80-символьного буфера в строку экрана одним BIOS-вызовом - * (char-буфер + единый attr — без WINREST/scratch-страницы). */ -static void raw_flush(uint8_t row) -{ - bios_set_place(row, 0); - // bios_writeattr((const char *)raw_buf, SCREEN_W, ATTR_TEXT); - // bios_writeattr_until((const char *)raw_buf, SCREEN_W, ATTR_TEXT, 0); - bios_write_until((const char *)raw_buf, SCREEN_W, 0); -} - -static uint32_t raw_draw_wrap_row(uint32_t off, uint8_t row) -{ - uint8_t i = 0; - uint32_t e = off, lim = off + SCREEN_W; - while (i < SCREEN_W && e < file_size) { - char c = fb(e); - if (c == '\n') { - raw_cell(i, 0); - break; - } - raw_cell(i, (uint8_t)(c == '\t' ? ' ' : c)); - i++; e++; - } - raw_flush(row); - return raw_next_wrap(off); -} - -static uint32_t raw_draw_hscroll_row(uint32_t off, uint8_t row) -{ - uint32_t e = off; - while (e < file_size && fb(e) != '\n') e++; /* e = конец строки */ - uint16_t len = e - off; - - uint8_t i = 0; - uint32_t p = off + raw_hpan; - while (i < SCREEN_W && p < e) { - char c = fb(p); - raw_cell(i, (uint8_t)(c == '\t' ? ' ' : c)); - i++; p++; - } - // raw_buf[i] = 0; - - if (raw_hpan > 0) - raw_buf[0] = '<'; - if (len > (uint16_t)raw_hpan + SCREEN_W) - raw_buf[SCREEN_W - 1] = '>'; - if (i < SCREEN_W) - raw_buf[i] = 0; - raw_flush(row); - return (e < file_size) ? e + 1 : e; -} - -/* Рисует один ряд от off (по режиму) и возвращает offset следующего ряда. */ -static uint32_t raw_draw_one(uint32_t off, uint8_t row) -{ - if (off >= file_size) { fill_row(row, ATTR_TEXT); return off; } - return (g_view == VIEW_RAW_WRAP) ? raw_draw_wrap_row(off, row) - : raw_draw_hscroll_row(off, row); -} - -void raw_draw(void) -{ - uint32_t off = raw_top; - for (uint8_t r = 0; r < VIEW_H; r++) - off = raw_draw_one(off, (uint8_t)(VIEW_TOP_ROW + r)); -} - -/* Прокрутка на одну строку: аппаратный scroll окна документа + отрисовка - * ОДНОЙ новой строки (как в MD-режиме). Смещение нижнего ряда вычисляется - * проходом VIEW_H рядов от raw_top — без отдельного инкрементального счётчика, - * который рассинхронизировался, когда контент кончается в середине экрана - * (короче окна после wrap→unwrap у конца файла). */ -static uint32_t raw_next(uint32_t off) -{ - return (g_view == VIEW_RAW_WRAP) ? raw_next_wrap(off) : raw_next_line(off); -} -static uint32_t raw_prev(uint32_t off) -{ - return (g_view == VIEW_RAW_WRAP) ? raw_prev_wrap(off) : raw_prev_line(off); -} - -/* ---- статус-бар: % по байтам (отрисовка — render_raw_status_numbers - * в mdview2_status.c, читает позицию через этот raw_pct) ---- */ - -/* Процент по байтам без 32-битного деления: масштабируем offset'ы (>>8 → - * ≤1024), дальше 16-битный pct16 (без __divulong). raw_top приватен модулю, - * поэтому % считаем здесь и отдаём готовым числом в статус-модуль. */ -uint8_t calc_raw_pct(void) -{ - uint16_t a = (uint16_t)(raw_top >> 8); - uint16_t b = (uint16_t)(file_size >> 8); - return pct16(a, b); /* den==0 (файл < 1 КБ) → pct16 вернёт 0 */ -} - -/* ---- посев позиции / пересев при смене активного буфера ----------- */ - -uint32_t raw_pos(void) -{ - return raw_top; -} - -/* Поставить RAW на начало строки, содержащей байт off (позиционирование - * при F2 MD→RAW и F8-переносе позиции между наборами). */ -void raw_reanchor(uint32_t off) -{ - if (off > file_size) off = file_size; - raw_top = raw_line_start(off); - raw_hpan = 0; -} - -void raw_seed_from(uint16_t md_top_line) -{ - raw_reanchor(seg_off(md_top_line)); -} - -/* Сброс в начало (клавиша Home). */ -static void raw_home(void) -{ - raw_top = 0; - raw_hpan = 0; -} - -void raw_end(void) -{ - raw_top = file_size; /* отмотать VIEW_H рядов назад */ - for (uint8_t k = 0; k < VIEW_H; k++) - raw_top = raw_prev(raw_top); - raw_hpan = 0; -} - -void raw_screen_init(void) { - bios_clearwin(1, 0, 30, 80, ATTR_TEXT); -} - -/* Нормализация позиции при смене под-режима RAW (F3 Wrap/Unwrap): выровнять - * raw_top на начало физической строки и снять горизонтальный сдвиг. */ -void raw_renorm(void) -{ - raw_top = raw_line_start(raw_top); - raw_hpan = 0; -} - -void raw_scroll_down(uint8_t delta) { - uint32_t off = raw_top; - for (uint8_t r = 0; r < VIEW_H; r++) { - if (off >= file_size) - return; /* экран не заполнен контентом */ - off = raw_next(off); - } - if (off >= file_size) - return; /* контент ровно по экран, ниже пусто */ - - if(delta ==1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); /* содержимое вверх */ - off = raw_draw_one(off, (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); /* новый нижний ряд */ - raw_top = raw_next(raw_top); - } else { - for (uint8_t k = 0; k < delta; k++) { - uint32_t n2 = raw_next(raw_top); - if (n2 >= file_size) - break; - raw_top = n2; - } - raw_draw(); /* PgUp/PgDn/Home/End — полный экран */ - } -} - -void raw_scroll_up(uint8_t delta) { - if (raw_top == 0) - return; - - if (delta == 1) { - raw_top = raw_prev(raw_top); - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); /* содержимое вниз */ - (void)raw_draw_one(raw_top, VIEW_TOP_ROW); - } else { - for (uint8_t k = 0; k < delta; k++) - raw_top = raw_prev(raw_top); - raw_draw(); /* PgUp/PgDn/Home/End — полный экран */ - } -} - -/* ---- навигация (вызывается из главного цикла при g_view != VIEW_MD) - */ - -uint8_t raw_key(uint8_t scan) -{ - switch (scan) { - case KEY_DOWN: - raw_scroll_down(1); - break; - case KEY_UP: - raw_scroll_up(1); - break; - case KEY_PGDN: - raw_scroll_down(VIEW_H); - break; - case KEY_PGUP: - raw_scroll_up(VIEW_H); - break; - case KEY_HOME: - raw_home(); - raw_draw(); - break; - case KEY_END: - raw_end(); - raw_draw(); - break; - case KEY_LEFT: - if (g_view == VIEW_RAW_HSCROLL && raw_hpan) { - raw_hpan = (raw_hpan >= HPAN_STEP) ? (uint16_t)(raw_hpan - HPAN_STEP) : 0; - raw_draw(); - } - break; - case KEY_RIGHT: - if (g_view == VIEW_RAW_HSCROLL && raw_hpan < 248u) { - raw_hpan = (uint16_t)(raw_hpan + HPAN_STEP); - raw_draw(); - } - break; - default: - return 0; /* не наша клавиша */ - } - - // render_raw_status_numbers(); - render_percent_progress(calc_raw_pct()); - return 1; -} - -#endif /* WITH_RAW */ diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_status.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_status.c deleted file mode 100644 index c767fbc..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_status.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * mdview2_status.c — статус-бар (строка 0), нижнее меню (строка 31) и спиннер. - * - * Хром бара АТОМИЗИРОВАН — обновляется по частям, без перерисовки всего бара: - * prerender_status() — фон + разделители │ + "MDVIEW" + имя файла (1 раз); - * status_encoding() — только поле кодировки (col 37), по F8; - * render_md_status_numbers() — числа MD: диапазон строк + % (при скролле); - * render_raw_status_numbers()— числа RAW: метка режима + % по байтам; - * render_full_status() — encoding + numbers (MD), при смене набора/режима; - * render_menu() — строка меню, по смене режима/готовности; - * spinner_tick/show — индикатор занятости во время загрузки. - * Оба *_status_numbers() самоочищаются по геометрии разделителей (DIV1_X/DIV2_X - * в mdview2.h) — фикс. хром не перерисовывается. RAW-позицию даёт raw_pct() - * из mdview2_raw.c (raw_top там приватен). - * - * Раскладка строки 0: - * 0 1..6 8 10.. 37..43 45 46..70 71 72..79 - * . MDVIEW spinner filename encod. │ L a-b / total │ pct% - */ - -#include -#include /* dec8/dec16, cputs */ -#include /* textattr/gotoxy/wrchar/COLOR */ -#include -#include /* bios_fillcharattr/bios_write_until */ -#include "mdview2.h" - -/* ---- Спиннер (слот SPINNER_COL в баре) --------------------------- */ -static const char spinner_chars[4] = { '|', '/', '-', '\\' }; -static uint8_t spinner_phase = 0; -static uint8_t spinner_active = 0; - -/* Продвигает спиннер на один кадр (если включён). */ -void spinner_tick(void) -{ - if (!spinner_active) - return; - wrchar(SPINNER_COL, 0, spinner_chars[spinner_phase & 3], ATTR_BAR_SPINNER); - spinner_phase++; -} - -/* Вкл/выкл спиннер; при выключении гасит его позицию. */ -void spinner_show(uint8_t on) -{ - spinner_active = on; - if (!on) wrchar(SPINNER_COL, 0, ' ', ATTR_BAR); -} - -/* ---- Вычисления для чисел статус-бара ----------------------------- */ - -/* Число строк, готовых к показу. Во время загрузки последняя эмитированная - * строка ещё в g_cells (не зафлашена), поэтому доступны [0..n_lines-2]. */ -uint16_t drawable_lines(void) -{ - if (g_loading) - return (n_lines >= 1) ? (uint16_t)(n_lines - 1) : 0; - return n_lines; -} - - -/* ---- Атомарные части статус-бара ---------------------------------- */ - -/* Фиксированный хром бара — рисуется ОДИН раз при старте: фон, два - * разделителя │, метка "MDVIEW" и имя файла (они не меняются за сессию). */ -void prerender_status(void) -{ - fill_row(0, ATTR_BAR); - wrchar(DIV1_X, 0, 0xB3, ATTR_BAR); /* │ */ - wrchar(DIV2_X, 0, 0xB3, ATTR_BAR); /* │ */ - put_str_attr(1, 0, "MDVIEW", ATTR_BAR); - put_str_attr(10, 0, filename, ATTR_BAR); -} - -/* Поле текущей кодировки (col 37, 7 ячеек). Меняется только по F8. */ -void status_encoding(void) -{ - textattr(ATTR_BAR); - gotoxy(DIV1_X - 10, 0); - bios_write_until(enc_name(g_encoding), 8, 0); -} - -static uint16_t local_total = UINT_MAX; -static uint16_t local_last = UINT_MAX; -static uint8_t local_loading = UCHAR_MAX; -static uint8_t local_pct = UCHAR_MAX; - -/* Числовая часть (MD): "L a-b / total" между разделителями + "pct%" справа. - * Перезаписывает ТОЛЬКО области между/после разделителей, сами │ и фикс. - * хром не трогает. */ -void render_md_status_numbers(void) -{ - uint16_t total = drawable_lines(); - uint16_t last = top_line + VIEW_H; - if (last > total) - last = total; - - if(local_total != total || local_last != last || local_loading != g_loading) { - local_total = total; local_last = last; local_loading = g_loading; - textattr(ATTR_BAR); - gotoxy(DIV1_X + 2, 0); - bios_fillcharattr(' ', ATTR_BAR, DIV2_X - DIV1_X - 2); /* очистить [DIV1_X+1 .. DIV2_X-1] */ - gotoxy(DIV1_X + 2, 0); - cputs("L "); - dec16(top_line + 1); - cputs("-"); - dec16(last); - cputs(" / "); - dec16(total); - if (g_loading) cputs("..."); /* ещё грузится */ - } - -} - -/* Полное обновление переменной части (MD): кодировка + числа. */ -void render_full_status(void) -{ - local_loading = UCHAR_MAX; - status_encoding(); - render_md_status_numbers(); -} - -void render_percent_progress(uint8_t pct) { - if (local_pct != pct) { - local_pct = pct; - gotoxy(DIV2_X + 2, 0); - bios_fillcharattr(' ', ATTR_BAR, SCREEN_W - DIV2_X - 2); /* очистить [DIV2_X+1 .. конец] */ - gotoxy(DIV2_X + 2, 0); - dec8(pct); - cputs("%"); - } -} - -#if WITH_RAW -/* RAW-вариант числовой части бара (peer к render_md_status_numbers): метка - * режима между разделителями + процент справа. Сам очищает свои области (та же - * геометрия DIVn_X), атомарен — не требует общего fill всего бара. Позиция - * берётся готовым числом из raw_pct() (raw_top приватен mdview2_raw.c). */ -void render_raw_status(void) -{ - // uint8_t pct = raw_pct(); - textattr(ATTR_BAR); - gotoxy(DIV1_X + 1, 0); - bios_writeattr_until(g_view == VIEW_RAW_WRAP ? " RAW wrap" : " RAW pan", - DIV2_X - DIV1_X - 1, ATTR_BAR, 0); /* метка + пад до DIV2_X-1 */ -} -#endif /* WITH_RAW */ - -#if WITH_HEX -/* HEX-вариант числовой части бара (peer к render_raw_status). */ -void render_hex_status(void) -{ - textattr(ATTR_BAR); - gotoxy(DIV1_X + 1, 0); - bios_writeattr_until(" HEX", DIV2_X - DIV1_X - 1, ATTR_BAR, 0); -} -#endif /* WITH_HEX */ - -/* ---- Нижнее меню (строка 31) -------------------------------------- */ - -void render_menu(void) -{ - /* Блок i = колонка i*8 (8 шириной): 2 поз. НОМЕР клавиши без 'F' (стиль - * ATTR_MENU_K, ведущий «чёрный» пробел кроме F10) + 6 поз. ТЕКСТ-функция - * (ATTR_MENU_T) сразу за номером. Номера рисуем для ВСЕХ 10 клавиш; текст — - * только у задействованных и доступных сейчас. */ - char num[3]; - - fill_row(MENU_ROW, ATTR_MENU_T); - - num[2] = 0; - for (uint8_t i = 0; i < 9; i++) { /* F1..F9: ' 1'..' 9' */ - num[0] = ' '; num[1] = (char)('1' + i); - put_str_attr((uint8_t)(i * 8), MENU_ROW, num, ATTR_MENU_K); - } - put_str_attr(9 * 8, MENU_ROW, "10", ATTR_MENU_K); /* F10 */ - - put_str_attr(0 * 8 + 2, MENU_ROW, "Help", ATTR_MENU_T); -#if WITH_RAW - if (g_ready) /* RAW доступен после постройки документа */ - put_str_attr(1 * 8 + 2, MENU_ROW, (g_view == VIEW_MD) ? "RAW" : "MD", ATTR_MENU_T); - if (VIEW_IS_RAW(g_view)) /* Wrap/Unwrap — только в RAW */ - put_str_attr(2 * 8 + 2, MENU_ROW, - (g_view == VIEW_RAW_WRAP) ? "UnWrap" : "Wrap", ATTR_MENU_T); -#endif -#if WITH_HEX - if (g_ready) /* HEX доступен после постройки документа */ - put_str_attr(3 * 8 + 2, MENU_ROW, (g_view == VIEW_HEX) ? "Back" : "Hex", ATTR_MENU_T); -#endif - if (g_f8_enabled) /* смена кодировки сейчас возможна */ - put_str_attr(7 * 8 + 2, MENU_ROW, "CodePg", ATTR_MENU_T); - put_str_attr(9 * 8 + 2, MENU_ROW, "Exit", ATTR_MENU_T); -} diff --git a/applications/Volkov/tests/fixtures/mdview2/mdview2_table.c b/applications/Volkov/tests/fixtures/mdview2/mdview2_table.c deleted file mode 100644 index d0d3aa5..0000000 --- a/applications/Volkov/tests/fixtures/mdview2/mdview2_table.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * mdview2_table.c — выровненная отрисовка markdown-таблиц. - * - * Разбор |-разделённых ячеек и эмиссия рамок/строк в общий буфер ячеек - * рендера (gc_put/gc_fill, см. mdview2.h). Вызывается из index_lines() - * ядра при обнаружении таблицы. Геометрия рамок (TBL_n), словарь стилей - * (CK_n, INIT_STYLE_n) и cell-buffer API объявлены в mdview2.h. - */ - -#include -#include /* COLOR() / COLOR_* для атрибутов TBL_ATTR/ATTR_TEXT */ -#include "mdview2.h" - -uint32_t row_end(uint32_t p) -{ - while (p < file_size && fb(p) != '\n') p++; - return p; -} - -/* Начало контента первой ячейки строки (после ведущих пробелов и '|'). */ -uint32_t table_first_cell(uint32_t row_start) -{ - uint32_t p = row_start; - while (p < file_size && fb(p) == ' ') p++; - if (p < file_size && fb(p) == '|') p++; - return p; -} - -/* Следующая ячейка: [*cs,*ce) — обрезанный диапазон; *pp продвигается за '|'. - * 0 — ячеек больше нет (включая хвостовую пустоту после последнего '|'). */ -uint8_t table_next_cell(uint32_t *pp, uint32_t lineend, uint32_t *cs, uint32_t *ce) -{ - uint32_t p = *pp; - if (p >= lineend) return 0; - uint32_t a = p; - while (p < lineend && fb(p) != '|') p++; - uint32_t b = p; - uint8_t had_pipe = (uint8_t)(p < lineend && fb(p) == '|'); - if (had_pipe) p++; - *pp = p; - while (a < b && fb(a) == ' ') a++; - while (b > a && fb(b - 1) == ' ') b--; - if (!had_pipe && a == b) return 0; - *cs = a; *ce = b; - return 1; -} - -/* Строка-разделитель (|---|:-:|): каждая ячейка непустая и только '-'/':'. */ -uint8_t table_is_sep_row(uint32_t row_start, uint32_t lineend) -{ - uint32_t p = table_first_cell(row_start); - uint32_t cs, ce; - uint8_t n = 0; - while (table_next_cell(&p, lineend, &cs, &ce)) { - if (cs >= ce) return 0; - for (uint32_t q = cs; q < ce; q++) { char c = fb(q); if (c != '-' && c != ':') return 0; } - n++; - } - return (uint8_t)(n > 0); -} - -/* Горизонтальная рамка в g_cells: left + (H×(w+2) + mid|right) по колонкам. */ -void table_border(const uint8_t *widths, uint8_t ncols, char left, char mid, char right) -{ - gc_put(left, TBL_ATTR); - for (uint8_t c = 0; c < ncols; c++) { - gc_fill(TBL_H, TBL_ATTR, (uint8_t)(widths[c] + 2)); - gc_put((c == (uint8_t)(ncols - 1)) ? right : mid, TBL_ATTR); - } -} - -/* Строка данных в g_cells: │ <ячейка, добитая до widths[c]> │ … */ -void table_data_row(uint32_t row_start, uint32_t lineend, const uint8_t *widths, uint8_t ncols) -{ - uint32_t p = table_first_cell(row_start); - uint32_t cs, ce; - gc_put(TBL_V, TBL_ATTR); - for (uint8_t c = 0; c < ncols; c++) { - uint8_t got = table_next_cell(&p, lineend, &cs, &ce); - gc_put(' ', TBL_ATTR); - uint8_t rendered = 0; - if (got && ce > cs) { - uint8_t before = g_ncells; - (void)inline_scan(cs, ce, 0, CK_OTHER, INIT_STYLE_PLAIN, ATTR_TEXT, 1); - rendered = (uint8_t)(g_ncells - before); - } - if (rendered < widths[c]) gc_fill(' ', ATTR_TEXT, (uint8_t)(widths[c] - rendered)); - gc_put(' ', TBL_ATTR); - gc_put(TBL_V, TBL_ATTR); - } -} diff --git a/applications/Volkov/tests/make_p10_rename_hdd.sh b/applications/Volkov/tests/make_p10_rename_hdd.sh deleted file mode 100755 index e0a1a75..0000000 --- a/applications/Volkov/tests/make_p10_rename_hdd.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# Создаёт HDD с target-пробой и UI-fixture F6 local rename. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p10_rename.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -PROBE=${3:-$PROJECT_DIR/build/tests/renrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-rename.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p10_rename_fixture.py" create "$TEMP_DIR" -sh "$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$PROBE" "$TEMP_DIR/RENTEST" -printf 'P10 rename HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p11_delete_hdd.sh b/applications/Volkov/tests/make_p11_delete_hdd.sh deleted file mode 100755 index bdded54..0000000 --- a/applications/Volkov/tests/make_p11_delete_hdd.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# Создаёт HDD с target-пробой и UI-fixture F8 delete. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p11_delete.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -PROBE=${3:-$PROJECT_DIR/build/tests/delrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-delete.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p11_delete_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$PROBE" "$TEMP_DIR/DELTEST" -printf 'P11 delete HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p12_group_copy_hdd.sh b/applications/Volkov/tests/make_p12_group_copy_hdd.sh deleted file mode 100755 index 6ef3c9b..0000000 --- a/applications/Volkov/tests/make_p12_group_copy_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD с двумя панелями для группового F5. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p12_group_copy.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-copy.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p12_group_copy_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/GRSRC" "$TEMP_DIR/GRDST" -printf 'P12 group-copy HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p13_group_delete_hdd.sh b/applications/Volkov/tests/make_p13_group_delete_hdd.sh deleted file mode 100755 index 9794464..0000000 --- a/applications/Volkov/tests/make_p13_group_delete_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture группового F8. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p13_group_delete.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-delete.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p13_group_delete_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/GDEL" -printf 'P13 group-delete HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p14_default_colors_hdd.sh b/applications/Volkov/tests/make_p14_default_colors_hdd.sh deleted file mode 100755 index c1dd8c5..0000000 --- a/applications/Volkov/tests/make_p14_default_colors_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture стандартных цветов имён. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p14_default_colors.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-default-colors.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p14_default_colors_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/COLORS" -printf 'P14 default-colours HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p15_tree_cancel_hdd.sh b/applications/Volkov/tests/make_p15_tree_cancel_hdd.sh deleted file mode 100755 index badd603..0000000 --- a/applications/Volkov/tests/make_p15_tree_cancel_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture отмены рекурсивного F5. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_cancel.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-cancel.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p15_tree_cancel_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/CSRC" "$TEMP_DIR/CDST" -printf 'P15 tree-cancel HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p15_tree_copy_hdd.sh b/applications/Volkov/tests/make_p15_tree_copy_hdd.sh deleted file mode 100755 index 60578e4..0000000 --- a/applications/Volkov/tests/make_p15_tree_copy_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture рекурсивного F5 одного каталога. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_copy.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-copy.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p15_tree_copy_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/SRC" "$TEMP_DIR/DST" -printf 'P15 tree-copy HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p15_tree_self_hdd.sh b/applications/Volkov/tests/make_p15_tree_self_hdd.sh deleted file mode 100755 index 0e017db..0000000 --- a/applications/Volkov/tests/make_p15_tree_self_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture target-inside-source guard. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p15_tree_self.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-self.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p15_tree_self_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/SRC" -printf 'P15 tree-self HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p16_group_tree_copy_hdd.sh b/applications/Volkov/tests/make_p16_group_tree_copy_hdd.sh deleted file mode 100755 index df21ae0..0000000 --- a/applications/Volkov/tests/make_p16_group_tree_copy_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture group F5 с двумя directory roots. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p16_group_tree_copy.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-group-tree.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p16_group_tree_copy_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/GSRC" "$TEMP_DIR/GDST" -printf 'P16 group-tree HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p17_tree_delete_cancel_hdd.sh b/applications/Volkov/tests/make_p17_tree_delete_cancel_hdd.sh deleted file mode 100755 index cec1bbf..0000000 --- a/applications/Volkov/tests/make_p17_tree_delete_cancel_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture runtime-cancel рекурсивного группового F8. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p17_tree_delete_cancel.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-delete-cancel.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p17_tree_delete_cancel_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/CDEL" -printf 'P17 tree-delete cancel HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p17_tree_delete_hdd.sh b/applications/Volkov/tests/make_p17_tree_delete_hdd.sh deleted file mode 100755 index 7e2670b..0000000 --- a/applications/Volkov/tests/make_p17_tree_delete_hdd.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Создаёт HDD-fixture рекурсивного группового F8. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p17_tree_delete.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-tree-delete.XXXXXX") - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p17_tree_delete_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$TEMP_DIR/RDEL" -printf 'P17 tree-delete HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p18_metadata_hdd.sh b/applications/Volkov/tests/make_p18_metadata_hdd.sh deleted file mode 100755 index 8036cc5..0000000 --- a/applications/Volkov/tests/make_p18_metadata_hdd.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -# Создаёт HDD с точными FAT date/time и R/H/S/A у source-файла. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p18_metadata.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-metadata.XXXXXX") -BASE_CHD="$TEMP_DIR/base.chd" -RAW="$TEMP_DIR/p18_metadata.raw" -MTC="$TEMP_DIR/mtools.conf" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p18_metadata_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$BASE_CHD" \ - "$COMMANDER" "$TEMP_DIR/MSRC" "$TEMP_DIR/MDST" - -chdman extractraw -i "$BASE_CHD" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -# Базовый make_hdd копирует дерево без host mtime. Повторная запись с -m -# задаёт контролируемые FAT date/time до включения readonly. -mcopy -m -o "$TEMP_DIR/MSRC/META.BIN" z:/MSRC/META.BIN -mattrib +r +h +s +a z:/MSRC/META.BIN -python3 "$PROJECT_DIR/tests/p18_metadata_fixture.py" verify-source "$RAW" - -mkdir -p "$(dirname -- "$IMAGE")" -chdman createhd -i "$RAW" -o "$IMAGE" -c none \ - -chs 128,16,32 -ss 512 -f -printf 'P18 metadata HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p19_overwrite_hdd.sh b/applications/Volkov/tests/make_p19_overwrite_hdd.sh deleted file mode 100755 index 29578f7..0000000 --- a/applications/Volkov/tests/make_p19_overwrite_hdd.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# Создаёт HDD для target-пробы транзакционного overwrite. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p19_overwrite.chd} -PROBE=${2:-$PROJECT_DIR/build/tests/p19/delrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p19.XXXXXX") -BASE_CHD="$TEMP_DIR/base.chd" -RAW="$TEMP_DIR/p19.raw" -MTC="$TEMP_DIR/mtools.conf" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p19_overwrite_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$BASE_CHD" \ - "$PROBE" "$TEMP_DIR/SOURCE" "$TEMP_DIR/TARGET" -chdman extractraw -i "$BASE_CHD" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mattrib +r z:/TARGET/READONLY.BIN -mkdir -p "$(dirname -- "$IMAGE")" -chdman createhd -i "$RAW" -o "$IMAGE" -c none \ - -chs 128,16,32 -ss 512 -f -printf 'P19 overwrite HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p19_policy_hdd.sh b/applications/Volkov/tests/make_p19_policy_hdd.sh deleted file mode 100755 index 6fc1897..0000000 --- a/applications/Volkov/tests/make_p19_policy_hdd.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# Создаёт HDD полного UI-сценария conflict-policy P19. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p19_policy.chd} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p19-ui.XXXXXX") -BASE_CHD="$TEMP_DIR/base.chd" -RAW="$TEMP_DIR/p19.raw" -MTC="$TEMP_DIR/mtools.conf" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -python3 "$PROJECT_DIR/tests/p19_policy_fixture.py" create "$TEMP_DIR" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$BASE_CHD" \ - "$COMMANDER" "$TEMP_DIR/P19SRC" "$TEMP_DIR/P19DST" -chdman extractraw -i "$BASE_CHD" -o "$RAW" -f >/dev/null -printf 'drive z: file="%s" partition=1\n' "$RAW" > "$MTC" -export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 -mattrib +r z:/P19DST/RONLY.BIN -mkdir -p "$(dirname -- "$IMAGE")" -chdman createhd -i "$RAW" -o "$IMAGE" -c none \ - -chs 128,16,32 -ss 512 -f -printf 'P19 policy HDD ready: %s\n' "$IMAGE" diff --git a/applications/Volkov/tests/make_p3_stress_floppy.sh b/applications/Volkov/tests/make_p3_stress_floppy.sh deleted file mode 100644 index ba509b3..0000000 --- a/applications/Volkov/tests/make_p3_stress_floppy.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# Создаёт стандартную FAT12-дискету для P3 stress-теста. -# Аргументы: [образ [исполняемый файл]]; по умолчанию — локальный образ. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/media/p3_stress.img" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p3.XXXXXX") -mkdir -p "$(dirname -- "$IMAGE")" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir "$TEMP_DIR/MANY" "$TEMP_DIR/BIGDIR" - -i=0 -while [ "$i" -lt 40 ]; do - name=$(printf 'M%07d.TXT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" "$TEMP_DIR/MANY/$name" - i=$((i + 1)) -done - -i=0 -while [ "$i" -lt 680 ]; do - name=$(printf 'B%07d.DAT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" "$TEMP_DIR/BIGDIR/$name" - i=$((i + 1)) -done - -mformat -C -i "$IMAGE" -f 1440 -v SPRCMD :: -mcopy -i "$IMAGE" "$EXECUTABLE" :: -mmd -i "$IMAGE" ::EMPTY -mmd -i "$IMAGE" ::TESTDIR -mcopy -i "$IMAGE" "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" :: -mcopy -i "$IMAGE" "$PROJECT_DIR/tests/p3_data/ZETA.BIN" :: -mcopy -i "$IMAGE" "$PROJECT_DIR/tests/p3_data/INNER.TXT" ::TESTDIR/ -mcopy -i "$IMAGE" -s "$TEMP_DIR/MANY" :: -mcopy -i "$IMAGE" -s "$TEMP_DIR/BIGDIR" :: - -mdir -i "$IMAGE" :: -echo "P3 stress floppy ready: $IMAGE (executable: $EXECUTABLE)" diff --git a/applications/Volkov/tests/make_p3_stress_hdd.sh b/applications/Volkov/tests/make_p3_stress_hdd.sh deleted file mode 100755 index 3516eed..0000000 --- a/applications/Volkov/tests/make_p3_stress_hdd.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -# Создаёт отдельный FAT16 HDD для интеграционных тестов Commander. -# Аргументы: [образ [исполняемый файл]]; по умолчанию — локальный build/HDD. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p3_stress.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-hdd.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P3DATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -mkdir "$FIXTURE_ROOT" -mkdir "$FIXTURE_ROOT/EMPTY" "$FIXTURE_ROOT/TESTDIR" \ - "$FIXTURE_ROOT/MANY" "$FIXTURE_ROOT/BIGDIR" - -cp "$PROJECT_DIR/tests/p3_data/INNER.TXT" \ - "$FIXTURE_ROOT/TESTDIR/INNER.TXT" - -i=0 -while [ "$i" -lt 40 ]; do - name=$(printf 'M%07d.TXT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" \ - "$FIXTURE_ROOT/MANY/$name" - i=$((i + 1)) -done - -i=0 -while [ "$i" -lt 680 ]; do - name=$(printf 'B%07d.DAT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" \ - "$FIXTURE_ROOT/BIGDIR/$name" - i=$((i + 1)) -done - -cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" "$FIXTURE_ROOT/P3ROOT.TXT" -cp "$PROJECT_DIR/tests/p3_data/ZETA.BIN" "$FIXTURE_ROOT/ZETA.BIN" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" \ - "$FIXTURE_ROOT/EMPTY" "$FIXTURE_ROOT/TESTDIR" \ - "$FIXTURE_ROOT/MANY" "$FIXTURE_ROOT/BIGDIR" \ - "$FIXTURE_ROOT/P3ROOT.TXT" "$FIXTURE_ROOT/ZETA.BIN" - -echo "P3 stress HDD ready: $IMAGE (D:, executable: SPRCMD.EXE)" diff --git a/applications/Volkov/tests/make_p4_copy_hdd.sh b/applications/Volkov/tests/make_p4_copy_hdd.sh deleted file mode 100755 index bc5d76a..0000000 --- a/applications/Volkov/tests/make_p4_copy_hdd.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -# Создаёт отдельный FAT16 HDD для интеграционного теста F5. -# Аргументы: [образ [исполняемый файл]]. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p4_copy.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-copy.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P4DATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p4_fixture.py" create "$FIXTURE_ROOT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/COPYFROM" "$FIXTURE_ROOT/COPYTO" - -echo "P4 copy HDD ready: $IMAGE (D:, executable: SPRCMD.EXE)" diff --git a/applications/Volkov/tests/make_p4_exec_hdd.sh b/applications/Volkov/tests/make_p4_exec_hdd.sh deleted file mode 100755 index 2a76f40..0000000 --- a/applications/Volkov/tests/make_p4_exec_hdd.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -# Создаёт отдельный HDD для EXEC/restore-теста P4.2. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p4_exec.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -CHILD=${3:-$PROJECT_DIR/tests/p4_exec_child/p4child.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-exec.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P4EXEC" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -mkdir -p "$FIXTURE_ROOT/EXECLEFT" "$FIXTURE_ROOT/EXECRGHT" -cp "$CHILD" "$FIXTURE_ROOT/EXECLEFT/P4CHILD.EXE" -cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" \ - "$FIXTURE_ROOT/EXECLEFT/BROKEN.EXE" -cp "$PROJECT_DIR/tests/p3_data/INNER.TXT" \ - "$FIXTURE_ROOT/EXECLEFT/NOTE.TXT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$FIXTURE_ROOT/EXECLEFT" "$FIXTURE_ROOT/EXECRGHT" - -echo "P4 EXEC HDD ready: $IMAGE (D:, child: EXECLEFT/P4CHILD.EXE)" diff --git a/applications/Volkov/tests/make_p5_copy_faults_hdd.sh b/applications/Volkov/tests/make_p5_copy_faults_hdd.sh deleted file mode 100755 index 3293a2e..0000000 --- a/applications/Volkov/tests/make_p5_copy_faults_hdd.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# Создаёт HDD с отдельной матрицей отказов банкового copy-job. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_copy_faults.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/tests/cperr.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-copy-faults.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P5COPY" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p5_copy_faults_fixture.py" create "$FIXTURE_ROOT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/SOURCE" "$FIXTURE_ROOT/TARGET" - -echo "P5 copy-fault HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p5_enospc_hdd.sh b/applications/Volkov/tests/make_p5_enospc_hdd.sh deleted file mode 100755 index aafc0b6..0000000 --- a/applications/Volkov/tests/make_p5_enospc_hdd.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# Создаёт почти полный HDD для реальной ошибки записи ENOSPC. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_enospc.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-enospc.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/ENOSPC" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p5_enospc_fixture.py" create "$FIXTURE_ROOT" -python3 "$PROJECT_DIR/tests/p5_enospc_fixture.py" verify-initial "$FIXTURE_ROOT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/SOURCE" "$FIXTURE_ROOT/TARGET" \ - "$FIXTURE_ROOT/FILLER.BIN" - -echo "P5 ENOSPC HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p5_hdd.sh b/applications/Volkov/tests/make_p5_hdd.sh deleted file mode 100755 index 3091c01..0000000 --- a/applications/Volkov/tests/make_p5_hdd.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -# Создаёт HDD для P5: 20 копирований, 100 refresh и cleanup-циклы. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_stability.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-p5.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P5DATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p5_fixture.py" create "$FIXTURE_ROOT" -python3 "$PROJECT_DIR/tests/p5_fixture.py" verify-initial "$FIXTURE_ROOT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/SOURCE" "$FIXTURE_ROOT/TARGET" - -echo "P5 stability HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p5_media_hdd.sh b/applications/Volkov/tests/make_p5_media_hdd.sh deleted file mode 100755 index e5aa06d..0000000 --- a/applications/Volkov/tests/make_p5_media_hdd.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# Создаёт HDD для физического unload/load во время F5. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_media.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-media.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/P5MEDIA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p5_media_fixture.py" create "$FIXTURE_ROOT" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/MEDIA" - -echo "P5 media-change HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p5_panel_edges_hdd.sh b/applications/Volkov/tests/make_p5_panel_edges_hdd.sh deleted file mode 100755 index 65414a2..0000000 --- a/applications/Volkov/tests/make_p5_panel_edges_hdd.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/sh -# Создаёт каталоги с итоговыми panel.count ровно 27 и 28 (включая `..`). - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_panel_edges.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-panel-edge.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/EDGES" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" "$FIXTURE_ROOT/N27" "$FIXTURE_ROOT/N28" - -i=0 -while [ "$i" -lt 26 ]; do - name=$(printf 'A%07d.TXT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" "$FIXTURE_ROOT/N27/$name" - i=$((i + 1)) -done - -i=0 -while [ "$i" -lt 27 ]; do - name=$(printf 'B%07d.TXT' "$i") - cp "$PROJECT_DIR/tests/p3_data/P3ROOT.TXT" "$FIXTURE_ROOT/N28/$name" - i=$((i + 1)) -done - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$FIXTURE_ROOT/N27" "$FIXTURE_ROOT/N28" - -echo "P5 panel-edge HDD ready: N27=26+parent, N28=27+parent" diff --git a/applications/Volkov/tests/make_p5_viewer_hdd.sh b/applications/Volkov/tests/make_p5_viewer_hdd.sh deleted file mode 100755 index 68f4b3a..0000000 --- a/applications/Volkov/tests/make_p5_viewer_hdd.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# Создаёт HDD для запуска реального полноэкранного mdview2 из Commander. - -set -eu - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -DEFAULT_IMAGE="$PROJECT_DIR/build/hdd/p5_viewer.chd" -IMAGE=${1:-$DEFAULT_IMAGE} -COMMANDER=${2:-$PROJECT_DIR/build/sprcmd.exe} -VIEWER=${3:-$PROJECT_DIR/build/external/mdview2.exe} -README=${4:-$PROJECT_DIR/tests/fixtures/mdview2/README.md} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-viewer.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/VIEWDATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" "$FIXTURE_ROOT/VIEWER" -cp "$VIEWER" "$FIXTURE_ROOT/VIEWER/MDVIEW2.EXE" -cp "$README" "$FIXTURE_ROOT/VIEWER/README.MD" - -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$COMMANDER" "$FIXTURE_ROOT/VIEWER" - -echo "P5 viewer HDD ready: VIEWER/MDVIEW2.EXE + README.MD" diff --git a/applications/Volkov/tests/make_p6_sort_hdd.sh b/applications/Volkov/tests/make_p6_sort_hdd.sh deleted file mode 100755 index fbd8e09..0000000 --- a/applications/Volkov/tests/make_p6_sort_hdd.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# Собирает HDD с target-регрессией и двумя каталогами UI-сортировки. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p6_sort.chd} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -PROBE=${3:-$PROJECT_DIR/build/tests/sortrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-sort.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/SORTDATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p6_sort_fixture.py" create "$FIXTURE_ROOT" - -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$PROBE" "$FIXTURE_ROOT/SORTL" "$FIXTURE_ROOT/SORTR" - -echo "P6 sort HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p7_select_hdd.sh b/applications/Volkov/tests/make_p7_select_hdd.sh deleted file mode 100755 index 6f03e50..0000000 --- a/applications/Volkov/tests/make_p7_select_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Собирает HDD target/UI-регрессии выбора записей. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p7_select.chd} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -PROBE=${3:-$PROJECT_DIR/build/tests/selrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-select.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/SELDATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p7_select_fixture.py" create "$FIXTURE_ROOT" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$PROBE" "$FIXTURE_ROOT/SELECT" -echo "P7 selection HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/make_p9_mkdir_hdd.sh b/applications/Volkov/tests/make_p9_mkdir_hdd.sh deleted file mode 100755 index d5d73ac..0000000 --- a/applications/Volkov/tests/make_p9_mkdir_hdd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# Собирает HDD target/UI-регрессии F7 mkdir. - -set -eu -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для упаковки HDD}" - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -IMAGE=${1:-$PROJECT_DIR/build/hdd/p9_mkdir.chd} -EXECUTABLE=${2:-$PROJECT_DIR/build/sprcmd.exe} -PROBE=${3:-$PROJECT_DIR/build/tests/mkrt.exe} -TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/sprcmd-mkdir.XXXXXX") -FIXTURE_ROOT="$TEMP_DIR/MKDATA" - -cleanup() -{ - rm -rf -- "$TEMP_DIR" -} -trap cleanup EXIT HUP INT TERM - -mkdir -p "$(dirname -- "$IMAGE")" -python3 "$PROJECT_DIR/tests/p9_mkdir_fixture.py" create "$FIXTURE_ROOT" -"$SPRINTER_ROOT/toolchain/make_hdd.sh" "$IMAGE" \ - "$EXECUTABLE" "$PROBE" "$FIXTURE_ROOT/MKTEST" -echo "P9 mkdir HDD ready: $IMAGE" diff --git a/applications/Volkov/tests/mame_image_probe.lua b/applications/Volkov/tests/mame_image_probe.lua deleted file mode 100644 index c608fcc..0000000 --- a/applications/Volkov/tests/mame_image_probe.lua +++ /dev/null @@ -1,15 +0,0 @@ --- Диагностический список MAME image-устройств Sprinter и их свойств. - -local done = false - -emu.register_periodic(function() - if done then return end - done = true - for tag, image in pairs(manager.machine.images) do - print(string.format( - "[image-probe] tag=%s instance=%s exists=%s readonly=%s file=%s", - tag, image.instance_name, tostring(image.exists), - tostring(image.readonly), image.filename)) - end - manager.machine:exit() -end) diff --git a/applications/Volkov/tests/mame_p10_rename.lua b/applications/Volkov/tests/mame_p10_rename.lua deleted file mode 100644 index 8edaabe..0000000 --- a/applications/Volkov/tests/mame_p10_rename.lua +++ /dev/null @@ -1,148 +0,0 @@ --- 0.2/P10: F6 local rename, unchanged name, collision и group guard. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, b={"P1.5",0x10}, c={"P1.4",0x08}, - d={"P1.4",0x04}, e={"P1.4",0x20}, f={"P1.5",0x02}, - i={"P1.4",0x01}, l={"P2.2",0x08}, m={"P2.0",0x10}, - n={"P2.0",0x08}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, t={"P1.5",0x20}, x={"P1.2",0x10}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -local function backspaces(t, count) - for _ = 1, count do - key(t, "P2.1", 0x20) - t = t + 0.18 - end - return t -end - -type_text(8.0, "d:\n") -type_text(9.0, "RENRT.EXE\n") -type_text(12.0, "SPRCMD.EXE\n") - -key(18.0, "P2.1", 0x10) -- enter RENTEST. -key(20.0, "P2.3", 0x10) -- Down x4 -> UIOLD.TXT. -key(20.5, "P2.3", 0x10) -key(21.0, "P2.3", 0x10) -key(21.5, "P2.3", 0x10) -key(23.0, "P2.1", 0x80) -- F6. -local t = backspaces(24.0, 9) -type_text(t, "final.bin") -key(t + 1.4, "P2.1", 0x10) - -key(32.0, "P2.1", 0x80) -- F6, имя без изменений. -key(33.0, "P2.1", 0x10) - -key(36.0, "P2.1", 0x80) -- F6, collision с EXIST.TXT. -t = backspaces(37.0, 9) -type_text(t, "exist.txt") -key(t + 1.4, "P2.1", 0x10) - -key(44.0, "P2.5", 0x01) -- Home -> `..`. -key(45.0, "P2.1", 0x80) -- F6 guard virtual. -key(48.0, "P2.3", 0x10) -- NEWDIR. -key(49.0, "P2.6", 0x01) -- Insert dir; cursor -> file. -key(50.0, "P2.1", 0x80) -- group ambiguity guard. - -key(54.0, "P2.3", 0x80) -- F10. -key(56.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 19.0, -- target probe already renamed file and directory; - 23.5, -- dialog default UIOLD.TXT; - 30.5, -- FINAL.BIN created and focused; - 34.0, -- unchanged name skipped; - 42.0, -- existing target rejected; - 46.0, -- virtual `..` rejected; - 51.0, -- selected dir elsewhere makes group action explicit; - 58.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p10-rename] snapshot t=" .. elapsed) - end - end - - if elapsed >= 60.0 then - print("[p10-rename] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p11_delete.lua b/applications/Volkov/tests/mame_p11_delete.lua deleted file mode 100644 index 4b9d5dd..0000000 --- a/applications/Volkov/tests/mame_p11_delete.lua +++ /dev/null @@ -1,140 +0,0 @@ --- 0.2/P11: F8 cancel, file, empty/nonempty directory и guards. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - l={"P2.2",0x08}, m={"P2.0",0x10}, n={"P2.0",0x08}, - p={"P2.3",0x20}, r={"P1.5",0x01}, s={"P1.2",0x08}, - t={"P1.5",0x20}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "DELRT.EXE\n") -type_text(12.0, "SPRCMD.EXE\n") - -key(18.0, "P2.1", 0x10) -- enter DELTEST. -key(20.0, "P2.3", 0x10) -- Down x4 -> REMOVE.TXT. -key(20.5, "P2.3", 0x10) -key(21.0, "P2.3", 0x10) -key(21.5, "P2.3", 0x10) -key(23.0, "P2.2", 0x80) -- F8 file, then cancel. -key(25.0, "P2.0", 0x08) -- N. - -key(28.0, "P2.2", 0x80) -- F8 file, confirm. -key(30.0, "P2.1", 0x10) - -key(34.0, "P2.3", 0x10) -- EMPTYDIR. -key(35.0, "P2.2", 0x80) -key(37.0, "P2.1", 0x10) - -key(40.0, "P2.3", 0x10) -- NONEMPTY. -key(41.0, "P2.2", 0x80) -key(43.0, "P2.1", 0x10) - -key(46.0, "P2.5", 0x01) -- Home -> `..`. -key(47.0, "P2.2", 0x80) -- virtual guard. -key(50.0, "P2.3", 0x10) -- NONEMPTY. -key(51.0, "P2.6", 0x01) -- select dir, cursor -> KEEP. -key(52.0, "P2.2", 0x80) -- group ambiguity guard. - -key(56.0, "P2.3", 0x80) -- F10. -key(58.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 19.0, -- target probe left UI fixture intact; - 23.5, -- file confirmation; - 26.0, -- cancel preserved REMOVE.TXT; - 32.0, -- file deleted; - 39.0, -- empty directory deleted; - 45.0, -- nonempty directory rejected; - 48.0, -- virtual `..` rejected; - 53.0, -- ambiguous group rejected; - 60.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p11-delete] snapshot t=" .. elapsed) - end - end - - if elapsed >= 62.0 then - print("[p11-delete] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p12_group_copy.lua b/applications/Volkov/tests/mame_p12_group_copy.lua deleted file mode 100644 index 80b993e..0000000 --- a/applications/Volkov/tests/mame_p12_group_copy.lua +++ /dev/null @@ -1,125 +0,0 @@ --- Регрессия P12/P16: выбранные файлы и каталог копируются одним F5. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(16.0, "P1.6", 0x20) -- Tab -> right, cursor GRDST. -key(17.0, "P2.1", 0x10) -- right enters GRDST. -key(18.0, "P1.6", 0x20) -- Tab -> left. -key(19.0, "P2.3", 0x10) -- left GRDST -> GRSRC. -key(20.0, "P2.1", 0x10) -- enter GRSRC. - -key(23.0, "P2.3", 0x10) -- ADIR. -key(24.0, "P2.6", 0x01) -- select ADIR, cursor A.BIN. -key(25.0, "P2.6", 0x01) -- A.BIN. -key(26.0, "P2.6", 0x01) -- B.BIN. -key(27.0, "P2.6", 0x01) -- C.BIN. -key(30.0, "P2.1", 0x40) -- F5 group success. -key(36.0, "P2.1", 0x40) -- second F5 stops at existing A.BIN. -key(41.0, "P1.6", 0x20) -- show refreshed passive panel. -key(46.0, "P2.3", 0x80) -- F10. -key(48.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 21.5, -- source/target panels opened; - 28.5, -- ADIR + three files selected; - 34.0, -- top-level files and selected directory copied; - 39.0, -- repeat stopped at existing target; - 43.0, -- passive panel shows three files; - 50.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p12-group-copy] snapshot t=" .. elapsed) - end - end - - if elapsed >= 52.0 then - print("[p12-group-copy] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p13_group_delete.lua b/applications/Volkov/tests/mame_p13_group_delete.lua deleted file mode 100644 index ae4312e..0000000 --- a/applications/Volkov/tests/mame_p13_group_delete.lua +++ /dev/null @@ -1,121 +0,0 @@ --- 0.2/P13 regression: file-only group F8 leaves unselected directories. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(17.0, "P2.1", 0x10) -- enter GDEL. -key(20.0, "P2.3", 0x10) -- ADIR. -key(21.0, "P2.3", 0x10) -- EMPTYDIR. -key(22.0, "P2.3", 0x10) -- A.TXT. -key(23.0, "P2.6", 0x01) -- select A.TXT -> B.BIN. -key(24.0, "P2.6", 0x01) -- select B.BIN -> KEEP.TXT. -key(27.0, "P2.2", 0x80) -- F8 group, cancel. -key(29.0, "P2.0", 0x08) -- N. -key(32.0, "P2.2", 0x80) -- F8 group, confirm. -key(34.0, "P2.1", 0x10) - -key(42.0, "P2.3", 0x80) -- F10. -key(44.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 19.0, -- исходное дерево; - 25.0, -- два каталога и два файла выбраны; - 27.5, -- group confirmation; - 30.0, -- cancel сохранил всё; - 36.0, -- файлы удалены, невыбранные каталоги сохранены; - 46.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p13-group-delete] snapshot t=" .. elapsed) - end - end - - if elapsed >= 48.0 then - print("[p13-group-delete] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p14_default_colors.lua b/applications/Volkov/tests/mame_p14_default_colors.lua deleted file mode 100644 index b879534..0000000 --- a/applications/Volkov/tests/mame_p14_default_colors.lua +++ /dev/null @@ -1,106 +0,0 @@ --- 1.0/P14: стандартные цвета каталогов, EXE и остальных файлов. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") -key(17.0, "P2.1", 0x10) -- enter COLORS. -key(24.0, "P2.3", 0x80) -- F10. -key(26.0, "P2.1", 0x10) -- confirm exit. - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 19.0, -- известный набор: dir, EXE, ZIP, no-ext, TXT; - 29.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p14-default-colors] snapshot t=" .. elapsed) - end - end - - if elapsed >= 31.0 then - print("[p14-default-colors] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p15_tree_cancel.lua b/applications/Volkov/tests/mame_p15_tree_cancel.lua deleted file mode 100644 index 0ee4424..0000000 --- a/applications/Volkov/tests/mame_p15_tree_cancel.lua +++ /dev/null @@ -1,105 +0,0 @@ --- 0.2/P15 hardening: Esc посреди 4-МБ файла tree-job. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") -key(16.0, "P1.6", 0x20) -- right. -key(17.0, "P2.1", 0x10) -- enter CDST. -key(18.0, "P1.6", 0x20) -- left. -key(19.0, "P2.3", 0x10) -- CDST -> CSRC. -key(20.0, "P2.1", 0x10) -- enter CSRC. -key(21.0, "P2.3", 0x10) -- TREE. -key(23.0, "P2.1", 0x40) -- F5. -key(24.5, "P1.6", 0x40) -- Esc during BIG.BIN. -key(31.0, "P2.3", 0x80) -- F10. -key(33.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = {22.0, 27.0, 36.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p15-tree-cancel] snapshot t=" .. elapsed) - end - end - if elapsed >= 38.0 then - print("[p15-tree-cancel] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p15_tree_copy.lua b/applications/Volkov/tests/mame_p15_tree_copy.lua deleted file mode 100644 index 74d6b55..0000000 --- a/applications/Volkov/tests/mame_p15_tree_copy.lua +++ /dev/null @@ -1,119 +0,0 @@ --- 0.2/P15: рекурсивный F5 текущего каталога, depth=16 и EEXIST repeat. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(16.0, "P1.6", 0x20) -- right panel. -key(17.0, "P2.1", 0x10) -- enter DST. -key(18.0, "P1.6", 0x20) -- left panel. -key(19.0, "P2.3", 0x10) -- DST -> SRC. -key(20.0, "P2.1", 0x10) -- enter SRC. -key(21.0, "P2.3", 0x10) -- `..` -> TREE. - -key(23.0, "P2.1", 0x40) -- F5 recursive success. -key(34.0, "P2.1", 0x40) -- repeat: target TREE exists. -key(39.0, "P1.6", 0x20) -- show refreshed passive panel. -key(44.0, "P2.3", 0x80) -- F10. -key(46.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 22.0, -- source TREE and empty destination; - 31.0, -- recursive success; - 37.0, -- repeat stopped on EEXIST; - 41.0, -- passive panel contains TREE; - 49.0 -- clean DSS prompt, including dynamic EMM cleanup. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p15-tree-copy] snapshot t=" .. elapsed) - end - end - - if elapsed >= 51.0 then - print("[p15-tree-copy] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p15_tree_self.lua b/applications/Volkov/tests/mame_p15_tree_self.lua deleted file mode 100644 index a178c3f..0000000 --- a/applications/Volkov/tests/mame_p15_tree_self.lua +++ /dev/null @@ -1,109 +0,0 @@ --- 0.2/P15 hardening: passive target лежит внутри копируемого source root. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(16.0, "P1.6", 0x20) -- right. -key(17.0, "P2.1", 0x10) -- enter SRC. -key(18.0, "P2.3", 0x10) -- TREE. -key(19.0, "P2.1", 0x10) -- enter TREE. -key(20.0, "P2.3", 0x10) -- INNER. -key(21.0, "P2.1", 0x10) -- enter INNER: passive target. -key(22.0, "P1.6", 0x20) -- left root. -key(23.0, "P2.1", 0x10) -- enter SRC. -key(24.0, "P2.3", 0x10) -- TREE: source root. -key(26.0, "P2.1", 0x40) -- F5 must refuse before mkdir. -key(32.0, "P2.3", 0x80) -- F10. -key(34.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = {25.0, 29.0, 37.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p15-tree-self] snapshot t=" .. elapsed) - end - end - if elapsed >= 39.0 then - print("[p15-tree-self] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p16_group_tree_copy.lua b/applications/Volkov/tests/mame_p16_group_tree_copy.lua deleted file mode 100644 index 49a320a..0000000 --- a/applications/Volkov/tests/mame_p16_group_tree_copy.lua +++ /dev/null @@ -1,109 +0,0 @@ --- 0.2/P16: выбранный файл и два выбранных каталога копируются одним F5. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") -key(16.0, "P1.6", 0x20) -- right. -key(17.0, "P2.1", 0x10) -- enter GDST. -key(18.0, "P1.6", 0x20) -- left. -key(19.0, "P2.3", 0x10) -- GDST -> GSRC. -key(20.0, "P2.1", 0x10) -- enter GSRC. -key(21.0, "P2.3", 0x10) -- ADIR. -key(22.0, "P2.6", 0x01) -- select ADIR -> BDIR. -key(23.0, "P2.6", 0x01) -- select BDIR -> KEEP.TXT. -key(24.0, "P2.3", 0x10) -- KEEP.TXT -> ROOT.BIN. -key(25.0, "P2.6", 0x01) -- select ROOT.BIN. -key(28.0, "P2.1", 0x40) -- group F5. -key(39.0, "P1.6", 0x20) -- passive panel. -key(44.0, "P2.3", 0x80) -- F10. -key(46.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = {26.0, 36.0, 41.0, 49.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p16-group-tree] snapshot t=" .. elapsed) - end - end - if elapsed >= 51.0 then - print("[p16-group-tree] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p17_tree_delete.lua b/applications/Volkov/tests/mame_p17_tree_delete.lua deleted file mode 100644 index 68cdea0..0000000 --- a/applications/Volkov/tests/mame_p17_tree_delete.lua +++ /dev/null @@ -1,121 +0,0 @@ --- 0.2/P17: group F8 удаляет выбранные файлы и каталоги рекурсивно. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(17.0, "P2.1", 0x10) -- enter RDEL. -key(20.0, "P2.3", 0x10) -- `..` -> ADIR. -key(21.0, "P2.6", 0x01) -- select ADIR -> BDIR. -key(22.0, "P2.6", 0x01) -- select BDIR -> KEEPDIR. -key(23.0, "P2.3", 0x10) -- KEEPDIR -> KEEP.TXT. -key(24.0, "P2.3", 0x10) -- KEEP.TXT -> TOP.BIN. -key(25.0, "P2.6", 0x01) -- select TOP.BIN. - -key(27.0, "P2.2", 0x80) -- first group F8: cancel confirmation. -key(29.0, "P2.0", 0x08) -- N. -key(32.0, "P2.2", 0x80) -- second group F8. -key(34.0, "P2.1", 0x10) -- confirm. - -key(42.0, "P2.3", 0x80) -- F10. -key(44.0, "P2.1", 0x10) -- confirm exit. - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = { - 19.0, -- исходное дерево; - 25.5, -- два каталога и файл выбраны; - 27.5, -- подтверждение группы; - 30.0, -- cancel до mutation сохранил всё; - 39.0, -- выбранные деревья удалены; - 46.0 -- clean DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p17-tree-delete] snapshot t=" .. elapsed) - end - end - - if elapsed >= 48.0 then - print("[p17-tree-delete] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p17_tree_delete_cancel.lua b/applications/Volkov/tests/mame_p17_tree_delete_cancel.lua deleted file mode 100644 index e2fc3dc..0000000 --- a/applications/Volkov/tests/mame_p17_tree_delete_cancel.lua +++ /dev/null @@ -1,110 +0,0 @@ --- 0.2/P17: Esc во время рекурсивного group F8. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(17.0, "P2.1", 0x10) -- enter CDEL. -key(20.0, "P2.3", 0x10) -- `..` -> TREE. -key(21.0, "P2.6", 0x01) -- select TREE -> KEEP.TXT. -key(22.0, "P2.3", 0x10) -- KEEP.TXT -> TOP.BIN. -key(23.0, "P2.6", 0x01) -- select TOP.BIN. -key(25.0, "P2.2", 0x80) -- group F8. -key(27.0, "P2.1", 0x10) -- confirm; TOP.BIN удаляется первым. -key(27.5, "P1.6", 0x40) -- Esc во время enqueue большого дерева. - -key(35.0, "P2.3", 0x80) -- F10 после cleanup job. -key(37.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = {24.0, 25.5, 31.0, 39.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p17-tree-delete-cancel] snapshot t=" .. elapsed) - end - end - - if elapsed >= 41.0 then - print("[p17-tree-delete-cancel] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p18_metadata.lua b/applications/Volkov/tests/mame_p18_metadata.lua deleted file mode 100644 index 50b405f..0000000 --- a/applications/Volkov/tests/mame_p18_metadata.lua +++ /dev/null @@ -1,109 +0,0 @@ --- 0.2/P18: F5 сохраняет точные FAT date/time и R/H/S/A. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") - -key(16.0, "P1.6", 0x20) -- right panel. -key(17.0, "P2.1", 0x10) -- enter MDST. -key(18.0, "P1.6", 0x20) -- left panel. -key(19.0, "P2.3", 0x10) -- MDST -> MSRC. -key(20.0, "P2.1", 0x10) -- enter MSRC. -key(22.0, "P2.3", 0x10) -- `..` -> META.BIN. -key(25.0, "P2.1", 0x40) -- F5. -key(31.0, "P1.6", 0x20) -- inspect refreshed MDST. -key(36.0, "P2.3", 0x80) -- F10. -key(38.0, "P2.1", 0x10) - -table.sort(events, function(left, right) return left[1] < right[1] end) - -local snap_times = {23.0, 29.0, 33.0, 40.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p18-metadata] snapshot t=" .. elapsed) - end - end - - if elapsed >= 42.0 then - print("[p18-metadata] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p19_overwrite.lua b/applications/Volkov/tests/mame_p19_overwrite.lua deleted file mode 100644 index c7cd432..0000000 --- a/applications/Volkov/tests/mame_p19_overwrite.lua +++ /dev/null @@ -1,88 +0,0 @@ --- P19: запускает target-пробу overwrite и фиксирует итоговую таблицу. --- Запас на I/O MAME 0.287: ранний выход обрывал пробу до ALL PASS. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - d={"P1.4",0x04}, e={"P1.4",0x20}, l={"P2.2",0x08}, - r={"P1.5",0x01}, t={"P1.5",0x20}, x={"P1.2",0x10}, - ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then chord(t, "P1.7", 0x02, def[1], def[2]) - else key(t, def[1], def[2]) end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(10.0, "DELRT.EXE\n") -key(90.0, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) -local snap_times = {80.0, 95.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - end - end - if elapsed >= 100.0 then manager.machine:exit() end -end) diff --git a/applications/Volkov/tests/mame_p19_policy.lua b/applications/Volkov/tests/mame_p19_policy.lua deleted file mode 100644 index 1e683e4..0000000 --- a/applications/Volkov/tests/mame_p19_policy.lua +++ /dev/null @@ -1,139 +0,0 @@ --- P19 UI: overwrite-all, readonly re-prompt, skip-all, rename и cancel. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, b={"P1.5",0x10}, c={"P1.4",0x08}, - d={"P1.4",0x04}, e={"P1.4",0x20}, i={"P1.4",0x01}, - m={"P2.0",0x10}, n={"P2.0",0x08}, o={"P2.2",0x02}, - p={"P2.3",0x20}, r={"P1.5",0x01}, s={"P1.2",0x08}, - t={"P1.5",0x20}, x={"P1.2",0x10}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then chord(t, "P1.7", 0x02, def[1], def[2]) - else key(t, def[1], def[2]) end - t = t + 0.14 - end - return t -end - -type_text(8.0, "d:\n") -type_text(10.0, "SPRCMD.EXE\n") -key(16.0, "P1.6", 0x20) -- right root. -key(17.0, "P2.1", 0x10) -- enter P19DST. -key(18.0, "P1.6", 0x20) -- left root. -key(19.0, "P2.3", 0x10) -- P19DST -> P19SRC. -key(20.0, "P2.1", 0x10) -- enter P19SRC. - -key(22.0, "P2.3", 0x10) -- AONE. -key(23.0, "P2.6", 0x01) -- select AONE -> ATWO. -key(24.0, "P2.6", 0x01) -- select ATWO -> CANCEL. -key(25.0, "P2.3", 0x10) -- REN. -key(26.0, "P2.3", 0x10) -- RONLY. -key(27.0, "P2.6", 0x01) -- select RONLY -> SONE. -key(30.0, "P2.1", 0x40) -- group F5. -key(33.0, "P1.6", 0x04) -- A = overwrite all. -key(40.0, "P2.2", 0x02) -- O = explicit readonly overwrite. - -chord(47.0, "P1.1", 0x02, "P1.5", 0x01) -- refresh/reset selection. -key(49.0, "P2.6", 0x01) -- select SONE -> STWO. -key(50.0, "P2.6", 0x01) -- select STWO. -key(52.0, "P2.1", 0x40) -- group F5. -key(56.0, "P2.0", 0x08) -- N = skip all. - -chord(60.0, "P1.1", 0x02, "P1.5", 0x01) -key(62.0, "P2.5", 0x01) -- Home -> `..`. -key(63.0, "P2.3", 0x10) -- AONE. -key(64.0, "P2.3", 0x10) -- ATWO. -key(65.0, "P2.3", 0x10) -- CANCEL. -key(66.0, "P2.3", 0x10) -- REN. -key(68.0, "P2.1", 0x40) -- single F5. -key(72.0, "P1.5", 0x01) -- R = rename. -type_text(74.0, "NEXT.BIN\n") - -key(80.0, "P2.5", 0x01) -- Home -> `..`. -key(80.5, "P2.3", 0x10) -- AONE. -key(81.0, "P2.3", 0x10) -- ATWO. -key(81.5, "P2.3", 0x10) -- CANCEL. -key(83.0, "P2.1", 0x40) -key(87.0, "P1.6", 0x40) -- Esc conflict. -key(90.0, "P1.6", 0x20) -- inspect target. -key(95.0, "P2.3", 0x80) -- F10. -key(97.0, "P2.1", 0x10) - --- Запас на I/O MAME 0.287: ответ readonly должен идти после двух копий. -for _, event in ipairs(events) do - if event[1] >= 40.0 then event[1] = event[1] + 20.0 end -end - -table.sort(events, function(left, right) return left[1] < right[1] end) -local snap_times = {31.5, 38.0, 44.0, 54.0, 58.0, 70.0, 76.0, 85.0, 89.0, 92.0, 99.0} -for i, t in ipairs(snap_times) do - if t >= 40.0 then snap_times[i] = t + 20.0 end -end -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local value = manager.machine.time - return value.seconds + value.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p19-policy] snapshot t=" .. elapsed) - end - end - if elapsed >= 121.0 then manager.machine:exit() end -end) diff --git a/applications/Volkov/tests/mame_p2_skeleton.lua b/applications/Volkov/tests/mame_p2_skeleton.lua deleted file mode 100644 index bb4d97e..0000000 --- a/applications/Volkov/tests/mame_p2_skeleton.lua +++ /dev/null @@ -1,130 +0,0 @@ --- Автоматический MAME-сценарий для двухпанельного skeleton P2. --- Использует реальные поля AT-клавиатуры, включая PgDn и F1/F10, которых --- нет в текстовом алфавите mame_interactive.py. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local chars = { - a={"P1.6",0x04}, c={"P1.4",0x08}, d={"P1.4",0x04}, - e={"P1.4",0x20}, m={"P2.0",0x10}, n={"P2.0",0x08}, - p={"P2.3",0x20}, r={"P1.5",0x01}, s={"P1.2",0x08}, - x={"P1.2",0x10}, y={"P2.0",0x01}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "a:\\SPRCMD .EXE\n") - -key(17.0, "P1.6", 0x20) -- Tab: активировать правую панель. -key(21.0, "P1.2", 0x20) -- PgDn: cursor 27, top 1, системный scroll. -key(22.0, "P2.3", 0x10) -- Down: cursor 28, top 2, ещё один scroll. -key(25.0, "P2.3", 0x80) -- F10: диалог выхода. -key(29.0, "P2.0", 0x08) -- N: отменить выход и восстановить экран. -key(33.0, "P1.2", 0x40) -- F1: единый диалог заглушки. -key(37.0, "P1.6", 0x40) -- Esc: закрыть сообщение. -key(40.0, "P2.3", 0x80) -- F10 повторно. -key(44.0, "P2.1", 0x10) -- Enter: подтвердить штатный выход. - --- Немедленный второй запуск ловит утечку EMM между процессами. Сам EXE --- дополнительно сравнивает free pages до alloc и после cleanup. -type_text(50.0, "a:\\SPRCMD .EXE\n") -key(59.0, "P2.3", 0x80) -- F10 во втором процессе. -key(63.0, "P2.1", 0x10) -- Подтвердить второй cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 15.0, 19.0, 23.0, 27.0, 31.0, 35.0, 39.0, 42.0, 47.0, - 57.0, 61.0, 66.0 -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p2-ui] snapshot t=" .. elapsed) - end - end - - if elapsed >= 68.0 then - print("[p2-ui] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p3_dir_probe.lua b/applications/Volkov/tests/mame_p3_dir_probe.lua deleted file mode 100644 index f6c5ab2..0000000 --- a/applications/Volkov/tests/mame_p3_dir_probe.lua +++ /dev/null @@ -1,104 +0,0 @@ --- Изолированная MAME-проба предельного каталога DSS. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, d={"P1.4",0x04}, e={"P1.4",0x20}, - i={"P1.4",0x01}, p={"P2.3",0x20}, r={"P1.5",0x01}, - x={"P1.2",0x10}, ["3"]={"P1.4",0x40}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "a:\\P3DIR .EXE\n") - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local start_time = nil -local ports = nil -local index = 1 -local snapped = false -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - if not snapped and elapsed >= 18.0 then - snapped = true - manager.machine.video:snapshot() - print("[p3-dir-probe] snapshot t=" .. elapsed) - end - if elapsed >= 20.0 then - print("[p3-dir-probe] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p3_enum_matrix.lua b/applications/Volkov/tests/mame_p3_enum_matrix.lua deleted file mode 100644 index a0e84f4..0000000 --- a/applications/Volkov/tests/mame_p3_enum_matrix.lua +++ /dev/null @@ -1,98 +0,0 @@ --- Запуск P3MAP.EXE и снимок матрицы влияния W3 на F_NEXT. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, e={"P1.4",0x20}, m={"P2.0",0x10}, - p={"P2.3",0x20}, x={"P1.2",0x10}, ["3"]={"P1.4",0x40}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "a:\\P3MAP .EXE\n") -table.sort(events, function(a, b) return a[1] < b[1] end) - -local start_time = nil -local ports = nil -local index = 1 -local snapped = false -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() start_time = now() end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - if not snapped and elapsed >= 30.0 then - snapped = true - manager.machine.video:snapshot() - print("[p3-enum-matrix] snapshot t=" .. elapsed) - end - if elapsed >= 32.0 then - print("[p3-enum-matrix] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p3_panels.lua b/applications/Volkov/tests/mame_p3_panels.lua deleted file mode 100644 index 566c93b..0000000 --- a/applications/Volkov/tests/mame_p3_panels.lua +++ /dev/null @@ -1,137 +0,0 @@ --- Автоматический MAME-сценарий P3: настоящие каталоги и две панели. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, c={"P1.4",0x08}, d={"P1.4",0x04}, - e={"P1.4",0x20}, m={"P2.0",0x10}, p={"P2.3",0x20}, - r={"P1.5",0x01}, s={"P1.2",0x08}, x={"P1.2",0x10}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "a:\\SPRCMD .EXE\n") - -key(17.0, "P2.1", 0x10) -- Enter: левая -> TESTDIR. -key(22.0, "P2.1", 0x10) -- Enter на `..`: обратно в корень. -key(27.0, "P2.1", 0x10) -- Снова открыть TESTDIR. -key(29.0, "P2.3", 0x10) -- Выбрать INNER.TXT. -chord(31.0, "P1.1", 0x02, "P1.5", 0x01) -- Ctrl+R: сохранить выбор имени. -key(36.0, "P1.6", 0x20) -- Tab: правая панель. -key(38.0, "P2.3", 0x10) -- Выбрать P3ROOT.TXT справа. -key(43.0, "P1.6", 0x20) -- Tab: вернуться в левую. -chord(45.0, "P1.1", 0x02, "P1.2", 0x01) -- Ctrl+PgUp: левая -> корень. -key(50.0, "P2.3", 0x80) -- F10. -key(55.0, "P2.1", 0x10) -- Enter: cleanup. - --- Второй процесс проверяет освобождение EMM и повторную инициализацию темы. -type_text(61.0, "a:\\SPRCMD .EXE\n") -key(70.0, "P2.3", 0x80) -key(74.0, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 15.0, -- root/root: TESTDIR должен быть первым; - 20.0, -- left TESTDIR: `..`, INNER.TXT; right root; - 25.0, -- Enter на `..` вернул left в root; - 34.0, -- refresh сохранил INNER.TXT и cursor=1; - 41.0, -- right root cursor=1, left TESTDIR cursor=1; - 48.0, -- Ctrl+PgUp изменил только left; - 53.0, -- quit dialog; - 58.0, -- DSS после первого cleanup; - 68.0, -- второй root/root; - 72.0, -- второй quit dialog; - 77.0 -- DSS после второго cleanup. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p3-panels] snapshot t=" .. elapsed) - end - end - - if elapsed >= 79.0 then - print("[p3-panels] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p3_scan_probe.lua b/applications/Volkov/tests/mame_p3_scan_probe.lua deleted file mode 100644 index f28015b..0000000 --- a/applications/Volkov/tests/mame_p3_scan_probe.lua +++ /dev/null @@ -1,107 +0,0 @@ --- Полная MAME-проба scan/store/sort большого каталога P3. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, c={"P1.4",0x08}, d={"P1.4",0x04}, - e={"P1.4",0x20}, n={"P2.0",0x08}, p={"P2.3",0x20}, - s={"P1.2",0x08}, x={"P1.2",0x10}, - ["3"]={"P1.4",0x40}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\\"]={"P2.1",0x04}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "a:\\P3SCAN .EXE\n") - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = {20.0, 45.0, 75.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p3-scan-probe] snapshot t=" .. elapsed) - end - end - if elapsed >= 78.0 then - print("[p3-scan-probe] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p3_stress.lua b/applications/Volkov/tests/mame_p3_stress.lua deleted file mode 100644 index 6997333..0000000 --- a/applications/Volkov/tests/mame_p3_stress.lua +++ /dev/null @@ -1,137 +0,0 @@ --- P3 stress: пустой каталог, 40 строк и явный маркер предела DSS. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, - e={"P1.4",0x20}, m={"P2.0",0x10}, p={"P2.3",0x20}, - r={"P1.5",0x01}, s={"P1.2",0x08}, x={"P1.2",0x10}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - --- Root order: BIGDIR, EMPTY, MANY, TESTDIR, P3ROOT, SPRCMD, ZETA. -key(17.0, "P2.3", 0x10) -- EMPTY. -key(18.0, "P2.1", 0x10) -- Enter EMPTY. -key(24.0, "P2.1", 0x10) -- Enter `..`. -key(27.0, "P2.3", 0x10) -- EMPTY. -key(28.0, "P2.3", 0x10) -- MANY. -key(29.0, "P2.1", 0x10) -- Enter MANY. -key(36.0, "P1.2", 0x20) -- PgDn -> cursor 27/top 1. -key(38.0, "P2.3", 0x10) -- Down -> cursor 28/top 2. -chord(43.0, "P1.1", 0x02, "P1.2", 0x01) -- Ctrl+PgUp -> root. -key(46.0, "P2.1", 0x10) -- Enter BIGDIR (index 0). - --- BIGDIR scan может быть долгим; последующие события намеренно отнесены. -key(76.0, "P2.5", 0x20) -- End: красный `>>> MORE...`. -key(81.0, "P2.1", 0x10) -- Enter: пояснение, без перехода. -key(86.0, "P2.3", 0x80) -- F10. -key(90.0, "P2.1", 0x10) -- cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 15.0, -- root count=7, dirs before files; - 21.0, -- EMPTY: only synthetic `..`, count=1; - 32.0, -- MANY: count=41; - 40.0, -- real list cursor=28/top=2; - 73.0, -- BIGDIR: частичный список и признак усечения DSS; - 79.0, -- End: выбран красный виртуальный `>>> MORE...`; - 84.0, -- Enter: статус о недоступном остатке, каталог не меняется; - 88.0, -- quit dialog over intact screen; - 93.0 -- DSS after cleanup. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p3-stress] snapshot t=" .. elapsed) - end - end - - if elapsed >= 95.0 then - print("[p3-stress] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p4_copy_hdd.lua b/applications/Volkov/tests/mame_p4_copy_hdd.lua deleted file mode 100644 index 30c8773..0000000 --- a/applications/Volkov/tests/mame_p4_copy_hdd.lua +++ /dev/null @@ -1,142 +0,0 @@ --- P4/F5 на HDD D: успех >64 КБ, отказ overwrite и отмена с cleanup. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, m={"P2.0",0x10}, - p={"P2.3",0x20}, r={"P1.5",0x01}, s={"P1.2",0x08}, - x={"P1.2",0x10}, [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- Enter: левая -> COPYFROM. -key(17.0, "P1.6", 0x20) -- Tab: правая панель. -key(18.0, "P2.3", 0x10) -- Down: COPYTO. -key(19.0, "P2.1", 0x10) -- Enter: правая -> COPYTO. -key(21.0, "P1.6", 0x20) -- Tab: левая панель. - --- `..`, CANCEL, EMPTY, EXIST, F65535, F65536, K4095, K4096, LARGE. -for i = 1, 8 do key(22.0 + (i - 1) * 0.20, "P2.3", 0x10) end -key(25.0, "P2.1", 0x40) -- F5: LARGE.BIN (131109 байт). - -key(31.0, "P2.5", 0x01) -- Home. -for i = 1, 3 do key(32.0 + (i - 1) * 0.20, "P2.3", 0x10) end -key(33.5, "P2.1", 0x40) -- F5: EXIST.TXT, overwrite запрещён. - -key(36.0, "P2.5", 0x01) -- Home. -key(37.0, "P2.3", 0x10) -- CANCEL.BIN. -key(38.0, "P2.1", 0x40) -- F5: начать 4-МБ копирование. -key(41.0, "P1.6", 0x40) -- Esc: отменить между блоками. - -key(44.0, "P2.3", 0x10) -- Down: EMPTY.ZRO. -key(44.5, "P2.1", 0x40) -- F5: нулевой файл. - -key(48.0, "P2.3", 0x80) -- F10. -key(50.0, "P2.1", 0x10) -- Enter: cleanup и возврат в DSS. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 14.0, -- обе панели в корне D:; - 20.5, -- COPYFROM/COPYTO разведены по панелям; - 25.8, 28.5, 30.0, -- начало, поздний прогресс и результат LARGE.BIN; - 35.0, -- отказ перезаписи EXIST.TXT; - 39.5, -- активный прогресс CANCEL.BIN; - 43.0, -- отмена и cleanup temp; - 46.0, -- нулевой EMPTY.ZRO скопирован; - 49.0, -- диалог выхода; - 52.0 -- возврат в D:\>. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p4-copy-hdd] snapshot t=" .. elapsed) - end - end - - if elapsed >= 54.0 then - print("[p4-copy-hdd] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p4_exec_hdd.lua b/applications/Volkov/tests/mame_p4_exec_hdd.lua deleted file mode 100644 index 7d98d2e..0000000 --- a/applications/Volkov/tests/mame_p4_exec_hdd.lua +++ /dev/null @@ -1,141 +0,0 @@ --- P4.2 на HDD D: child меняет mode/palette/CWD и обе панели. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- левая -> EXECLEFT. -key(17.0, "P1.6", 0x20) -- Tab. -key(18.0, "P2.3", 0x10) -- EXECRGHT. -key(19.0, "P2.1", 0x10) -- правая -> EXECRGHT. -key(21.0, "P1.6", 0x20) -- Tab влево. - --- `..`, BROKEN.EXE, NOTE.TXT, P4CHILD.EXE. -for i = 1, 3 do key(22.0 + (i - 1) * 0.20, "P2.3", 0x10) end -key(23.5, "P2.1", 0x10) -- Enter: P4CHILD.EXE. -key(28.0, "P2.1", 0x10) -- Enter внутри child: return 5A. - --- После refresh: `..`, BROKEN, CREATED, NOTE, P4CHILD. -key(34.0, "P2.5", 0x01) -- Home. -key(35.0, "P2.3", 0x10) -- BROKEN.EXE. -key(36.0, "P2.1", 0x10) -- ошибка загрузчика EXE. - -key(40.0, "P2.5", 0x01) -- Home. -for i = 1, 3 do key(41.0 + (i - 1) * 0.20, "P2.3", 0x10) end -key(42.5, "P2.1", 0x10) -- NOTE.TXT: тип не поддерживается. - -key(47.0, "P2.3", 0x80) -- F10. -key(49.0, "P2.1", 0x10) -- cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 14.0, -- root D:; - 20.5, -- панели EXECLEFT/EXECRIGHT; - 26.0, -- экран дочерней программы 40x32; - 32.0, -- Commander восстановлен, обе панели refreshed; - 38.0, -- ошибка BROKEN.EXE без завершения Commander; - 45.0, -- NOTE.TXT не запускается; - 48.0, -- quit dialog поверх восстановленного экрана; - 51.0 -- чистый возврат в D:\>. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p4-exec-hdd] snapshot t=" .. elapsed) - end - end - - if elapsed >= 53.0 then - print("[p4-exec-hdd] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_copy_faults.lua b/applications/Volkov/tests/mame_p5_copy_faults.lua deleted file mode 100644 index 3385d18..0000000 --- a/applications/Volkov/tests/mame_p5_copy_faults.lua +++ /dev/null @@ -1,108 +0,0 @@ --- Запас на завершение target-пробы в MAME 0.287. --- P5: отдельная детерминированная матрица состояний copy-job на HDD D:. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - p={"P2.3",0x20}, r={"P1.5",0x01}, x={"P1.2",0x10}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "CPERR.EXE\n") -key(90.0, "P2.1", 0x10) -- Enter после итоговой таблицы. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = {80.0, 95.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-copy-faults] snapshot t=" .. elapsed) - end - end - - if elapsed >= 100.0 then - print("[p5-copy-faults] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_enospc.lua b/applications/Volkov/tests/mame_p5_enospc.lua deleted file mode 100644 index 905116a..0000000 --- a/applications/Volkov/tests/mame_p5_enospc.lua +++ /dev/null @@ -1,125 +0,0 @@ --- P5 на HDD D: реальный disk-full при F5 и обязательный cleanup temp. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- левая -> SOURCE. -key(17.0, "P1.6", 0x20) -- Tab. -key(18.0, "P2.3", 0x10) -- TARGET. -key(19.0, "P2.1", 0x10) -- правая -> TARGET. -key(21.0, "P1.6", 0x20) -- Tab влево. -key(22.0, "P2.3", 0x10) -- FULL.BIN после `..`. -key(23.0, "P2.1", 0x40) -- F5, ожидается ENOSPC. - -key(35.0, "P2.3", 0x80) -- F10 после управляемой ошибки. -key(37.0, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 20.5, -- SOURCE/TARGET на почти полном диске; - 25.0, -- промежуточный progress либо уже ошибка; - 32.0, -- управляемый ENOSPC, TARGET пуст; - 36.0, -- диалог выхода после ошибки; - 40.0 -- чистый prompt DSS. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-enospc] snapshot t=" .. elapsed) - end - end - - if elapsed >= 42.0 then - print("[p5-enospc] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_media_change.lua b/applications/Volkov/tests/mame_p5_media_change.lua deleted file mode 100644 index 60d190d..0000000 --- a/applications/Volkov/tests/mame_p5_media_change.lua +++ /dev/null @@ -1,133 +0,0 @@ --- P5: извлечение и возврат тестового HDD D: во время работы Commander. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local HDD_TAG = ":ata2:1:hdd:image" -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- левая панель -> MEDIA. -key(17.0, "P2.3", 0x10) -- DEEP. -key(17.3, "P2.3", 0x10) -- DATA.BIN. -key(19.0, "P2.1", 0x40) -- F5 при отсутствующем HDD. -key(26.0, "P2.1", 0x40) -- тот же F5 после возврата HDD. -key(34.0, "P2.3", 0x80) -- F10. -key(36.0, "P2.1", 0x10) -- подтвердить выход. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = {14.0, 17.7, 21.0, 24.5, 31.0, 35.0, 38.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} -local image_path = nil -local media_phase = 0 - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - if media_phase == 0 and elapsed >= 18.0 then - local hdd = assert(manager.machine.images[HDD_TAG], "hard2 image not found") - image_path = hdd.filename - hdd:unload() - media_phase = 1 - print("[p5-media] hard2 unloaded, exists=" .. tostring(hdd.exists)) - elseif media_phase == 1 and elapsed >= 23.0 then - local hdd = assert(manager.machine.images[HDD_TAG], "hard2 image not found") - local err = hdd:load(image_path) - media_phase = 2 - print("[p5-media] hard2 loaded, exists=" .. tostring(hdd.exists) .. - " err=" .. tostring(err)) - end - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-media] snapshot t=" .. elapsed) - end - end - - if elapsed >= 40.0 then - print("[p5-media] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_panel_edges.lua b/applications/Volkov/tests/mame_p5_panel_edges.lua deleted file mode 100644 index 951d2a8..0000000 --- a/applications/Volkov/tests/mame_p5_panel_edges.lua +++ /dev/null @@ -1,124 +0,0 @@ --- P5: ровно 27/28 записей и начало прокрутки на 28-й. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- левая -> N27. -key(17.0, "P1.6", 0x20) -- Tab. -key(18.0, "P2.3", 0x10) -- N28. -key(19.0, "P2.1", 0x10) -- правая -> N28. -key(23.0, "P2.5", 0x20) -- End: cursor=27, top=1. -key(27.0, "P1.6", 0x20) -- Tab: N27. -key(28.0, "P2.5", 0x20) -- End: cursor=26, top=0. -key(32.0, "P2.3", 0x80) -- F10. -key(34.0, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 20.5, -- count 27/28, обе панели top=0; - 25.0, -- N28 cursor=27/top=1; - 30.0, -- N27 cursor=26/top=0; - 36.0 -- чистый prompt DSS. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-panel-edges] snapshot t=" .. elapsed) - end - end - - if elapsed >= 38.0 then - print("[p5-panel-edges] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_stability.lua b/applications/Volkov/tests/mame_p5_stability.lua deleted file mode 100644 index 71bd4f5..0000000 --- a/applications/Volkov/tests/mame_p5_stability.lua +++ /dev/null @@ -1,166 +0,0 @@ --- На медленном DSS можно растянуть расписание, сохранив всю матрицу. -local time_scale = tonumber(os.getenv("SPRCMD_TEST_TIME_SCALE") or "1") -assert(time_scale and time_scale >= 1, "SPRCMD_TEST_TIME_SCALE должен быть >= 1") -if os.getenv("SPRCMD_TEST_UNTHROTTLED") == "1" then - manager.machine.video.throttled = false -end - --- P5 на HDD D: 20 copy, 100 refresh и три полных cleanup-цикла. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local function refresh_chord(t) - add(t, "P1.1", 0x02, 1) - add(t + 0.03, "P1.5", 0x01, 1) - add(t + 0.20, "P1.5", 0x01, 0) - add(t + 0.23, "P1.1", 0x02, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- левая -> SOURCE. -key(17.0, "P1.6", 0x20) -- Tab. -key(18.0, "P2.3", 0x10) -- TARGET. -key(19.0, "P2.1", 0x10) -- правая -> TARGET. -key(21.0, "P1.6", 0x20) -- Tab влево. - --- В SOURCE: `..`, затем F00.BIN..F19.BIN. Copy не меняет active selection. --- Интервалы растут вместе с числом 4-КБ блоков: ввод во время синхронного --- copy не буферизуется и не должен считаться выполненной командой. -local copy_times = { - 22.0, 24.0, 26.0, 28.0, 30.0, 34.0, 38.0, 40.0, 42.0, 44.0, - 46.0, 48.0, 50.0, 52.0, 54.0, 57.0, 60.0, 64.0, 68.0, 75.0 -} -for i = 0, 19 do - local t = copy_times[i + 1] - key(t, "P2.3", 0x10) -- Down. - key(t + 0.25, "P2.1", 0x40) -- F5. -end - --- Последний файл больше 1 МБ; оставляем запас до refresh. -for i = 0, 99 do - refresh_chord(105.0 + i * 0.50) -end - -key(160.0, "P2.3", 0x80) -- F10 первого запуска. -key(161.5, "P2.1", 0x10) - -type_text(167.0, "SPRCMD .EXE\n") -key(173.0, "P2.3", 0x80) -key(174.5, "P2.1", 0x10) - -type_text(180.0, "SPRCMD .EXE\n") -key(186.0, "P2.3", 0x80) -key(187.5, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 14.0, -- root D:; - 20.5, -- SOURCE/TARGET; - 80.0, -- прогресс последнего файла больше 1 МБ; - 100.0, -- 20 файлов показаны в TARGET; - 157.0, -- состояние после 100 refresh; - 164.0, -- первый cleanup, чистый prompt; - 177.0, -- второй cleanup; - 190.0 -- третий cleanup. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = (now() - start_time) / time_scale - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-stability] snapshot t=" .. elapsed) - end - end - - if elapsed >= 192.0 then - print("[p5-stability] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p5_viewer.lua b/applications/Volkov/tests/mame_p5_viewer.lua deleted file mode 100644 index e64019c..0000000 --- a/applications/Volkov/tests/mame_p5_viewer.lua +++ /dev/null @@ -1,127 +0,0 @@ --- P5: запуск реального mdview2, переключение вида и возврат в Commander. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, x={"P1.2",0x10}, [" "]={"P2.4",0x80}, - ["."]={"P2.2",0x10}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SPRCMD .EXE\n") - -key(15.0, "P2.1", 0x10) -- Commander -> VIEWER. -key(17.0, "P2.3", 0x10) -- MDVIEW2.EXE после `..`. -key(18.0, "P2.1", 0x10) -- Enter/EXEC; README.MD берётся из child CWD. - -key(28.0, "P1.2", 0x20) -- PgDn внутри mdview2. -key(31.0, "P1.2", 0x80) -- F2: RAW. -key(36.0, "P2.3", 0x80) -- F10: выход из mdview2. - -key(44.0, "P2.3", 0x80) -- F10 Commander. -key(46.0, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 16.0, -- Commander в VIEWER; - 25.0, -- реальный MD-экран mdview2; - 29.5, -- mdview2 после PgDn; - 33.5, -- RAW-режим mdview2; - 40.0, -- Commander восстановлен после viewer; - 45.0, -- диалог выхода Commander; - 49.0 -- чистый prompt DSS. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p5-viewer] snapshot t=" .. elapsed) - end - end - - if elapsed >= 51.0 then - print("[p5-viewer] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p6_sort.lua b/applications/Volkov/tests/mame_p6_sort.lua deleted file mode 100644 index 5f20b80..0000000 --- a/applications/Volkov/tests/mame_p6_sort.lua +++ /dev/null @@ -1,143 +0,0 @@ --- 0.2/P6: четыре сортировки, reverse, независимость панелей и refresh. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - m={"P2.0",0x10}, o={"P2.2",0x02}, p={"P2.3",0x20}, - r={"P1.5",0x01}, s={"P1.2",0x08}, t={"P1.5",0x20}, - x={"P1.2",0x10}, [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -local function ctrl_f(t, tag, mask) - chord(t, "P1.1", 0x02, tag, mask) -end - -type_text(8.0, "d:\n") -type_text(9.0, "SORTRT.EXE\n") -type_text(12.0, "SPRCMD.EXE\n") - -key(18.0, "P2.1", 0x10) -- left -> SORTL. -key(20.0, "P1.6", 0x20) -- Tab -> right. -key(21.0, "P2.3", 0x10) -- Down -> SORTR. -key(22.0, "P2.1", 0x10) -- right -> SORTR. -key(24.0, "P1.6", 0x20) -- left active again. - -ctrl_f(27.0, "P2.6", 0x80) -- Ctrl+F4: extension ascending. -ctrl_f(31.0, "P2.6", 0x80) -- extension descending. -ctrl_f(35.0, "P2.1", 0x80) -- Ctrl+F6: size ascending. -ctrl_f(39.0, "P2.1", 0x80) -- size descending. -ctrl_f(43.0, "P2.1", 0x40) -- Ctrl+F5: date ascending. -ctrl_f(47.0, "P2.1", 0x40) -- date descending. -ctrl_f(51.0, "P2.6", 0x40) -- Ctrl+F3: name ascending. -ctrl_f(55.0, "P2.6", 0x40) -- name descending. - -ctrl_f(59.0, "P2.1", 0x80) -- left size ascending. -ctrl_f(61.0, "P2.1", 0x80) -- left size descending. -key(63.0, "P1.6", 0x20) -- right active, still N+. -ctrl_f(65.0, "P2.6", 0x80) -- right extension ascending. -chord(68.0, "P1.1", 0x02, "P1.5", 0x01) -- refresh keeps E+. - -key(72.0, "P2.3", 0x80) -- F10. -key(74.0, "P2.1", 0x10) -- Enter: cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 25.5, -- обе панели N+; - 29.0, -- left E+; - 33.0, -- left E-; - 37.0, -- left S+; - 41.0, -- left S-; - 45.0, -- left D+; - 49.0, -- left D-; - 53.0, -- left N+; - 57.0, -- left N-; - 66.5, -- left S-, right E+; - 70.0, -- refresh сохранил right E+; - 76.0 -- чистый DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p6-sort] snapshot t=" .. elapsed) - end - end - - if elapsed >= 78.0 then - print("[p6-sort] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p7_select.lua b/applications/Volkov/tests/mame_p7_select.lua deleted file mode 100644 index ffe86af..0000000 --- a/applications/Volkov/tests/mame_p7_select.lua +++ /dev/null @@ -1,148 +0,0 @@ --- 0.2/P7: Insert, invert, перенос flags через sort и сброс на refresh. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - b={"P1.5",0x10}, c={"P1.4",0x08}, d={"P1.4",0x04}, - e={"P1.4",0x20}, i={"P1.4",0x01}, l={"P2.2",0x08}, - m={"P2.0",0x10}, n={"P2.0",0x08}, p={"P2.3",0x20}, - r={"P1.5",0x01}, s={"P1.2",0x08}, t={"P1.5",0x20}, - x={"P1.2",0x10}, [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "SELRT.EXE\n") -type_text(12.0, "SPRCMD.EXE\n") - -key(18.0, "P2.1", 0x10) -- left -> SELECT. -key(21.0, "P2.6", 0x01) -- Insert на `..`: запрещён. -key(23.0, "P2.3", 0x10) -- Down -> ADIR. -key(24.0, "P2.6", 0x01) -- выбрать ADIR, cursor -> ZDIR. -key(26.0, "P2.6", 0x01) -- выбрать ZDIR, cursor -> A.BIN. -key(28.0, "P2.6", 0x01) -- выбрать A.BIN, cursor -> B.BIN. -chord(32.0, "P1.1", 0x02, "P2.6", 0x40) -- Ctrl+F3: N-. -chord(36.0, "P1.7", 0x02, "P1.4", 0x80) -- Shift+8 = `*`. -chord(40.0, "P1.1", 0x02, "P1.5", 0x01) -- Ctrl+R: выбор сброшен. - -chord(43.0, "P1.7", 0x02, "P2.1", 0x01) -- Shift+=: `+`. -key(44.0, "P2.1", 0x20) -- стереть default `*.*`. -key(44.3, "P2.1", 0x20) -key(44.6, "P2.1", 0x20) -chord(45.0, "P1.7", 0x02, "P1.4", 0x80) -- `*`. -key(45.3, "P2.2", 0x10) -- `.`. -type_text(45.6, "bin") -key(46.4, "P2.1", 0x10) -- apply `*.bin`. - -key(50.0, "P2.2", 0x20) -- `-`. -key(51.0, "P2.1", 0x20) -- стереть default `*.*`. -key(51.3, "P2.1", 0x20) -key(51.6, "P2.1", 0x20) -type_text(52.0, "b.bin") -key(53.0, "P2.1", 0x10) -- unselect B.BIN. - -chord(56.0, "P1.7", 0x02, "P2.1", 0x01) -- `+`, затем cancel. -key(57.0, "P1.6", 0x40) -- Esc. -key(60.0, "P2.3", 0x80) -- F10. -key(62.0, "P2.1", 0x10) -- Enter: cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 20.0, -- исходный список; - 22.0, -- `..` не выбран; - 29.5, -- два каталога и A.BIN выбраны, sel=10/003; - 33.5, -- sort N- сохранил flags и текущий B.BIN; - 37.5, -- invert оставил каталоги и B.BIN/C.BIN, sel=50/004; - 41.5, -- refresh сбросил выбор, N- сохранён; - 43.5, -- mask dialog с default `*.*`; - 46.1, -- отредактировано `*.bin`; - 48.0, -- маска выбрала три BIN, sel=60/003; - 54.5, -- `- b.bin` оставил A/C, sel=40/002; - 58.0, -- cancel следующего `+` сохранил выбор; - 64.0 -- чистый DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p7-select] snapshot t=" .. elapsed) - end - end - - if elapsed >= 66.0 then - print("[p7-select] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/mame_p9_mkdir.lua b/applications/Volkov/tests/mame_p9_mkdir.lua deleted file mode 100644 index 3852e11..0000000 --- a/applications/Volkov/tests/mame_p9_mkdir.lua +++ /dev/null @@ -1,136 +0,0 @@ --- 0.2/P9: F7 success, duplicate, invalid 8.3, cancel и навигация. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - c={"P1.4",0x08}, d={"P1.4",0x04}, e={"P1.4",0x20}, - g={"P1.5",0x04}, i={"P1.4",0x01}, k={"P1.4",0x02}, - l={"P2.2",0x08}, m={"P2.0",0x10}, n={"P2.0",0x08}, - o={"P2.2",0x02}, p={"P2.3",0x20}, r={"P1.5",0x01}, - s={"P1.2",0x08}, t={"P1.5",0x20}, w={"P1.2",0x04}, - x={"P1.2",0x10}, ["9"]={"P2.2",0x01}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\n"]={"P2.1",0x10}, [":"]={"P2.3",0x02,true} -} - -local function type_text(t, value) - for i = 1, #value do - local ch = value:sub(i, i) - local def = chars[ch] or chars[ch:lower()] - local shifted = def[3] or ch ~= ch:lower() - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - -type_text(8.0, "d:\n") -type_text(9.0, "MKRT.EXE\n") -type_text(12.0, "SPRCMD.EXE\n") - -key(18.0, "P2.1", 0x10) -- left -> MKTEST. -key(20.0, "P2.2", 0x40) -- F7. -type_text(21.0, "newdir") -key(22.2, "P2.1", 0x10) -- create. - -key(26.0, "P2.2", 0x40) -- F7 duplicate. -type_text(27.0, "newdir") -key(28.2, "P2.1", 0x10) - -key(32.0, "P2.2", 0x40) -- F7 invalid basename > 8. -type_text(33.0, "toolong99") -key(34.5, "P2.1", 0x10) - -key(38.0, "P2.2", 0x40) -- F7 then cancel. -key(39.0, "P1.6", 0x40) -key(42.0, "P2.3", 0x10) -- Down -> NEWDIR. -key(43.0, "P2.1", 0x10) -- enter NEWDIR. -key(47.0, "P2.1", 0x20) -- Backspace -> MKTEST. -key(51.0, "P2.3", 0x80) -- F10. -key(53.0, "P2.1", 0x10) -- cleanup. - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = { - 19.0, -- исходный MKTEST; - 20.5, -- пустой F7 dialog; - 23.5, -- NEWDIR создан; - 29.5, -- duplicate managed error; - 35.5, -- invalid 8.3 rejected; - 40.0, -- cancel не изменил каталог; - 44.5, -- вошли в NEWDIR; - 48.5, -- вернулись в MKTEST; - 55.0 -- чистый DSS prompt. -} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p9-mkdir] snapshot t=" .. elapsed) - end - end - - if elapsed >= 57.0 then - print("[p9-mkdir] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/p10_rename_fixture.py b/applications/Volkov/tests/p10_rename_fixture.py deleted file mode 100755 index c25516b..0000000 --- a/applications/Volkov/tests/p10_rename_fixture.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture команды F6 local rename.""" - -from __future__ import annotations - -import pathlib -import sys - - -def create(root: pathlib.Path) -> None: - panel = root / "RENTEST" - panel.mkdir(parents=True) - (panel / "OLD.TXT").write_bytes(b"old payload\r\n") - (panel / "EXIST.TXT").write_bytes(b"existing payload\r\n") - (panel / "UIOLD.TXT").write_bytes(b"ui payload\r\n") - old_dir = panel / "OLDDIR" - old_dir.mkdir() - (old_dir / "KEEP.BIN").write_bytes(b"dir payload\r\n") - - -def verify(root: pathlib.Path) -> None: - expected = [ - "PASS CWD captured before rename matrix", - "PASS file renamed without data change", - "PASS existing target blocks rename and stays intact", - "PASS directory renamed with contents intact", - "PASS failed directory change preserves CWD", - "PASS successful and rejected renames restore CWD", - "ALL PASS", - ] - failures: list[str] = [] - result = root / "RENRES.TXT" - panel = root / "RENTEST" - - if not result.is_file(): - failures.append("нет RENRES.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected: - if line not in text: - failures.append(f"нет строки результата: {line}") - - files = { - "NEW.TXT": b"old payload\r\n", - "EXIST.TXT": b"existing payload\r\n", - "FINAL.BIN": b"ui payload\r\n", - "NEWDIR/KEEP.BIN": b"dir payload\r\n", - } - for relative, content in files.items(): - path = panel / relative - if not path.is_file() or path.read_bytes() != content: - failures.append(f"неверное содержимое {relative}") - for unwanted in ("OLD.TXT", "UIOLD.TXT", "OLDDIR"): - if (panel / unwanted).exists(): - failures.append(f"старое имя осталось: {unwanted}") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: file/dir rename, no-overwrite, CWD restore и UI F6.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p10_rename_probe.c b/applications/Volkov/tests/p10_rename_probe.c deleted file mode 100644 index 9c25636..0000000 --- a/applications/Volkov/tests/p10_rename_probe.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * p10_rename_probe.c — target-регрессия локального F6/RENAME. - * - * Проверяет файл, каталог, запрет overwrite и восстановление CWD через тот - * же низкоуровневый helper, который вызывает Commander. - */ - -#include -#include -#include -#include -#include -#include "sc_file_ops.h" - -static int result_fd = -1; -static uint8_t failures; -static char cwd_before[256]; -static char cwd_after[256]; -static char cwd_scratch[256]; - -static void log_text(const char *text) -{ - const char *end = text; - while (*end != '\0') end++; - if (result_fd >= 0) { - (void)write(result_fd, text, (uint16_t)(end - text)); - } -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -static uint8_t file_has(const char *path, const char *expected) -{ - char data[24]; - int fd = open(path, O_RDONLY); - int got; - uint16_t length = 0u; - - if (fd < 0) return 0u; - while (expected[length] != '\0') length++; - got = read(fd, data, sizeof(data)); - (void)close(fd); - return got == (int)length && memcmp(data, expected, length) == 0; -} - -static uint8_t file_absent(const char *path) -{ - int fd; - errno = 0; - fd = open(path, O_RDONLY); - if (fd >= 0) { - (void)close(fd); - return 0u; - } - return errno == ENOENT || errno == ENOPATH; -} - -int main(void) -{ - int rc; - int collision_errno; - int entered; - - result_fd = open("D:\\RENRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); - check(getcwd(cwd_before, sizeof(cwd_before)) != 0, - "CWD captured before rename matrix"); - - rc = sc_rename_local("D:\\RENTEST", "OLD.TXT", "NEW.TXT", - cwd_scratch, sizeof(cwd_scratch)); - check(rc == 0 && file_absent("D:\\RENTEST\\OLD.TXT") && - file_has("D:\\RENTEST\\NEW.TXT", "old payload\r\n"), - "file renamed without data change"); - - errno = 0; - rc = sc_rename_local("D:\\RENTEST", "NEW.TXT", "EXIST.TXT", - cwd_scratch, sizeof(cwd_scratch)); - collision_errno = errno; - check(rc != 0 && collision_errno == EEXIST && - file_has("D:\\RENTEST\\NEW.TXT", "old payload\r\n") && - file_has("D:\\RENTEST\\EXIST.TXT", "existing payload\r\n"), - "existing target blocks rename and stays intact"); - - rc = sc_rename_local("D:\\RENTEST", "OLDDIR", "NEWDIR", - cwd_scratch, sizeof(cwd_scratch)); - entered = chdir("D:\\RENTEST\\NEWDIR"); - if (entered == 0) entered = chdir(cwd_before); - check(rc == 0 && entered == 0 && - file_has("D:\\RENTEST\\NEWDIR\\KEEP.BIN", "dir payload\r\n"), - "directory renamed with contents intact"); - - errno = 0; - rc = sc_rename_local("D:\\MISSING", "A.TXT", "B.TXT", - cwd_scratch, sizeof(cwd_scratch)); - check(rc != 0 && getcwd(cwd_after, sizeof(cwd_after)) != 0 && - strcmp(cwd_before, cwd_after) == 0, - "failed directory change preserves CWD"); - check(getcwd(cwd_after, sizeof(cwd_after)) != 0 && - strcmp(cwd_before, cwd_after) == 0, - "successful and rejected renames restore CWD"); - - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return failures; -} diff --git a/applications/Volkov/tests/p11_delete_fixture.py b/applications/Volkov/tests/p11_delete_fixture.py deleted file mode 100755 index c09b7d1..0000000 --- a/applications/Volkov/tests/p11_delete_fixture.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture команды F8 delete.""" - -from __future__ import annotations - -import pathlib -import sys - - -def create(root: pathlib.Path) -> None: - panel = root / "DELTEST" - panel.mkdir(parents=True) - (panel / "TARGET.TXT").write_bytes(b"target payload\r\n") - (panel / "REMOVE.TXT").write_bytes(b"remove payload\r\n") - (panel / "KEEP.TXT").write_bytes(b"keep remains\r\n") - (panel / "TEMPDIR").mkdir() - (panel / "EMPTYDIR").mkdir() - nonempty = panel / "NONEMPTY" - nonempty.mkdir() - (nonempty / "CHILD.TXT").write_bytes(b"child remains\r\n") - - -def verify(root: pathlib.Path) -> None: - expected = [ - "PASS CWD captured before delete matrix", - "PASS unlink removes one regular file", - "PASS rmdir removes one empty directory", - "PASS nonempty directory is not removed", - "PASS unrelated file remains intact", - "PASS full-path delete operations preserve CWD", - "ALL PASS", - ] - failures: list[str] = [] - result = root / "DELRES.TXT" - panel = root / "DELTEST" - - if not result.is_file(): - failures.append("нет DELRES.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected: - if line not in text: - failures.append(f"нет строки результата: {line}") - - absent = ("TARGET.TXT", "TEMPDIR", "REMOVE.TXT", "EMPTYDIR") - for name in absent: - if (panel / name).exists(): - failures.append(f"объект не удалён: {name}") - remaining = { - "KEEP.TXT": b"keep remains\r\n", - "NONEMPTY/CHILD.TXT": b"child remains\r\n", - } - for name, content in remaining.items(): - path = panel / name - if not path.is_file() or path.read_bytes() != content: - failures.append(f"объект изменён: {name}") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: file/empty-dir delete, cancel, guards, nonempty и CWD.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p11_delete_probe.c b/applications/Volkov/tests/p11_delete_probe.c deleted file mode 100644 index ce7d60e..0000000 --- a/applications/Volkov/tests/p11_delete_probe.c +++ /dev/null @@ -1,85 +0,0 @@ -/* p11_delete_probe.c — target-регрессия однообъектного F8 delete. */ - -#include -#include -#include -#include -#include - -static int result_fd = -1; -static uint8_t failures; -static char cwd_before[256]; -static char cwd_after[256]; - -static void log_text(const char *text) -{ - const char *end = text; - while (*end != '\0') end++; - if (result_fd >= 0) { - (void)write(result_fd, text, (uint16_t)(end - text)); - } -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -static uint8_t file_has(const char *path, const char *expected) -{ - char data[24]; - int fd = open(path, O_RDONLY); - int got; - uint16_t length = 0u; - - if (fd < 0) return 0u; - while (expected[length] != '\0') length++; - got = read(fd, data, sizeof(data)); - (void)close(fd); - return got == (int)length && memcmp(data, expected, length) == 0; -} - -static uint8_t file_absent(const char *path) -{ - int fd; - errno = 0; - fd = open(path, O_RDONLY); - if (fd >= 0) { - (void)close(fd); - return 0u; - } - return errno == ENOENT || errno == ENOPATH; -} - -int main(void) -{ - int rc; - - result_fd = open("D:\\DELRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); - check(getcwd(cwd_before, sizeof(cwd_before)) != 0, - "CWD captured before delete matrix"); - check(unlink("D:\\DELTEST\\TARGET.TXT") == 0 && - file_absent("D:\\DELTEST\\TARGET.TXT"), - "unlink removes one regular file"); - check(rmdir("D:\\DELTEST\\TEMPDIR") == 0, - "rmdir removes one empty directory"); - - errno = 0; - rc = rmdir("D:\\DELTEST\\NONEMPTY"); - check(rc != 0 && - file_has("D:\\DELTEST\\NONEMPTY\\CHILD.TXT", - "child remains\r\n"), - "nonempty directory is not removed"); - check(file_has("D:\\DELTEST\\KEEP.TXT", "keep remains\r\n"), - "unrelated file remains intact"); - check(getcwd(cwd_after, sizeof(cwd_after)) != 0 && - strcmp(cwd_before, cwd_after) == 0, - "full-path delete operations preserve CWD"); - - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return failures; -} diff --git a/applications/Volkov/tests/p12_group_copy_fixture.py b/applications/Volkov/tests/p12_group_copy_fixture.py deleted file mode 100755 index f7d59d4..0000000 --- a/applications/Volkov/tests/p12_group_copy_fixture.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture группового F5.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(size: int, seed: int) -> bytes: - return bytes(((index * 37 + seed) & 0xFF) for index in range(size)) - - -def create(root: pathlib.Path) -> None: - source = root / "GRSRC" - target = root / "GRDST" - source.mkdir(parents=True) - target.mkdir() - (source / "A.BIN").write_bytes(payload(10, 3)) - (source / "B.BIN").write_bytes(payload(4097, 11)) - (source / "C.BIN").write_bytes(b"") - directory = source / "ADIR" - directory.mkdir() - (directory / "INSIDE.TXT").write_bytes(b"must not be copied\r\n") - - -def verify(root: pathlib.Path) -> None: - source = root / "GRSRC" - target = root / "GRDST" - failures: list[str] = [] - expected = { - "A.BIN": payload(10, 3), - "B.BIN": payload(4097, 11), - "C.BIN": b"", - } - - for name, content in expected.items(): - source_path = source / name - target_path = target / name - if not source_path.is_file() or source_path.read_bytes() != content: - failures.append(f"source изменён: {name}") - if not target_path.is_file() or target_path.read_bytes() != content: - failures.append(f"target не совпадает: {name}") - target_inside = target / "ADIR" / "INSIDE.TXT" - if (not target_inside.is_file() or - target_inside.read_bytes() != b"must not be copied\r\n"): - failures.append("выбранный каталог не скопирован рекурсивно") - temporary = [path.name for path in target.rglob("*") - if path.name.upper().endswith(".TMP")] - if temporary: - failures.append(f"остались temp: {temporary}") - inside = source / "ADIR" / "INSIDE.TXT" - if not inside.is_file() or inside.read_bytes() != b"must not be copied\r\n": - failures.append("исходный выбранный каталог изменён") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: 3 selected files and selected directory copied; no temp.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p13_group_delete_fixture.py b/applications/Volkov/tests/p13_group_delete_fixture.py deleted file mode 100755 index 0a2998c..0000000 --- a/applications/Volkov/tests/p13_group_delete_fixture.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture группового F8.""" - -from __future__ import annotations - -import pathlib -import sys - - -def create(root: pathlib.Path) -> None: - panel = root / "GDEL" - panel.mkdir(parents=True) - (panel / "A.TXT").write_bytes(b"delete A\r\n") - (panel / "B.BIN").write_bytes(b"delete B payload\r\n") - (panel / "KEEP.TXT").write_bytes(b"keep payload\r\n") - directory = panel / "ADIR" - directory.mkdir() - (directory / "INSIDE.TXT").write_bytes(b"directory payload\r\n") - (panel / "EMPTYDIR").mkdir() - - -def verify(root: pathlib.Path) -> None: - panel = root / "GDEL" - failures: list[str] = [] - - for name in ("A.TXT", "B.BIN"): - if (panel / name).exists(): - failures.append(f"выбранный файл не удалён: {name}") - expected = { - "KEEP.TXT": b"keep payload\r\n", - "ADIR/INSIDE.TXT": b"directory payload\r\n", - } - for name, content in expected.items(): - path = panel / name - if not path.is_file() or path.read_bytes() != content: - failures.append(f"сохранённый объект изменён: {name}") - if not (panel / "EMPTYDIR").is_dir(): - failures.append("выбранный пустой каталог ошибочно удалён") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: selected files deleted; selected directories and KEEP preserved.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p14_default_colors_fixture.py b/applications/Volkov/tests/p14_default_colors_fixture.py deleted file mode 100755 index ac31e55..0000000 --- a/applications/Volkov/tests/p14_default_colors_fixture.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture стандартных цветов имён.""" - -from __future__ import annotations - -import pathlib -import sys - - -CONTENTS = { - "APP.EXE": b"EXE colour sample\r\n", - "ARCHIVE.ZIP": b"ZIP colour sample\r\n", - "NOEXT": b"no extension sample\r\n", - "README.TXT": b"text colour sample\r\n", - "SUBDIR/INSIDE.DAT": b"directory sample\r\n", -} - - -def create(root: pathlib.Path) -> None: - panel = root / "COLORS" - for name, content in CONTENTS.items(): - path = panel / name - path.parent.mkdir(parents=True, exist_ok=True) - path.write_bytes(content) - - -def verify(root: pathlib.Path) -> None: - panel = root / "COLORS" - failures: list[str] = [] - for name, content in CONTENTS.items(): - path = panel / name - if not path.is_file() or path.read_bytes() != content: - failures.append(f"объект отсутствует или изменён: {name}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: colour fixture preserved.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p15_tree_cancel_fixture.py b/applications/Volkov/tests/p15_tree_cancel_fixture.py deleted file mode 100755 index 9064042..0000000 --- a/applications/Volkov/tests/p15_tree_cancel_fixture.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет fixture отмены рекурсивного F5.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(size: int) -> bytes: - return bytes(((index * 29 + 17) & 0xFF) for index in range(size)) - - -BIG = payload(4 * 1024 * 1024) -AFTER = b"may be committed before traversal reaches BIG\r\n" - - -def create(root: pathlib.Path) -> None: - tree = root / "CSRC" / "TREE" - tree.mkdir(parents=True) - (root / "CDST").mkdir() - (tree / "BIG.BIN").write_bytes(BIG) - (tree / "AFTER.TXT").write_bytes(AFTER) - - -def verify(root: pathlib.Path) -> None: - source = root / "CSRC" / "TREE" - target = root / "CDST" / "TREE" - failures: list[str] = [] - - if (source / "BIG.BIN").read_bytes() != BIG: - failures.append("source BIG.BIN изменён") - if (source / "AFTER.TXT").read_bytes() != AFTER: - failures.append("source AFTER.TXT изменён") - if not target.is_dir(): - failures.append("root target-каталог не был создан до cancel") - else: - big_target = target / "BIG.BIN" - if big_target.exists(): - failures.append("BIG.BIN committed несмотря на ранний cancel") - after_target = target / "AFTER.TXT" - if after_target.exists() and after_target.read_bytes() != AFTER: - failures.append("частично завершённый AFTER.TXT повреждён") - temporary = [path.name for path in target.iterdir() - if path.name.upper().endswith(".TMP")] - if temporary: - failures.append(f"после cancel остались temp: {temporary}") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: tree cancel removed active temp; source intact; no BIG commit.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p15_tree_copy_fixture.py b/applications/Volkov/tests/p15_tree_copy_fixture.py deleted file mode 100755 index fd6f0f2..0000000 --- a/applications/Volkov/tests/p15_tree_copy_fixture.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture рекурсивного F5 одного каталога.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(size: int, seed: int) -> bytes: - return bytes(((index * 53 + seed) & 0xFF) for index in range(size)) - - -def create(root: pathlib.Path) -> None: - tree = root / "SRC" / "TREE" - (root / "DST").mkdir(parents=True) - (tree / "EMPTY").mkdir(parents=True) - (tree / "ROOT.TXT").write_bytes(b"recursive root\r\n") - sub = tree / "SUB" - sub.mkdir() - (sub / "A.BIN").write_bytes(payload(4097, 7)) - (sub / "ZERO.DAT").write_bytes(b"") - - deep = sub - for level in range(1, 17): - deep = deep / f"L{level:02d}" - deep.mkdir() - (deep / "BOTTOM.TXT").write_bytes(b"depth sixteen\r\n") - - -def tree_snapshot(root: pathlib.Path) -> dict[str, bytes | None]: - result: dict[str, bytes | None] = {} - for path in sorted(root.rglob("*")): - relative = path.relative_to(root).as_posix().upper() - result[relative] = None if path.is_dir() else path.read_bytes() - return result - - -def verify(root: pathlib.Path) -> None: - source = root / "SRC" / "TREE" - target = root / "DST" / "TREE" - failures: list[str] = [] - - if not source.is_dir() or not target.is_dir(): - failures.append("source или target TREE отсутствует") - elif tree_snapshot(source) != tree_snapshot(target): - failures.append("рекурсивное дерево target не совпадает с source") - - temporary = [path.as_posix() for path in (root / "DST").rglob("*") - if path.name.upper().endswith(".TMP")] - if temporary: - failures.append(f"остались temp: {temporary}") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: recursive tree copied exactly; depth=16; no temp.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p15_tree_self_fixture.py b/applications/Volkov/tests/p15_tree_self_fixture.py deleted file mode 100755 index 0a5578d..0000000 --- a/applications/Volkov/tests/p15_tree_self_fixture.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет fixture запрета target внутри source.""" - -from __future__ import annotations - -import pathlib -import sys - - -CONTENT = b"self-target guard\r\n" - - -def create(root: pathlib.Path) -> None: - tree = root / "SRC" / "TREE" - (tree / "INNER").mkdir(parents=True) - (tree / "FILE.TXT").write_bytes(CONTENT) - - -def verify(root: pathlib.Path) -> None: - tree = root / "SRC" / "TREE" - failures: list[str] = [] - if (tree / "FILE.TXT").read_bytes() != CONTENT: - failures.append("source FILE.TXT изменён") - inner = tree / "INNER" - if not inner.is_dir() or any(inner.iterdir()): - failures.append("внутри source появился рекурсивный target") - temporary = [path.as_posix() for path in tree.rglob("*") - if path.name.upper().endswith(".TMP")] - if temporary: - failures.append(f"остались temp: {temporary}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: target-inside-source refused before mutation.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p16_group_tree_copy_fixture.py b/applications/Volkov/tests/p16_group_tree_copy_fixture.py deleted file mode 100755 index d0ddf56..0000000 --- a/applications/Volkov/tests/p16_group_tree_copy_fixture.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет group F5 с несколькими directory roots.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(size: int, seed: int) -> bytes: - return bytes(((index * 41 + seed) & 0xFF) for index in range(size)) - - -def create(root: pathlib.Path) -> None: - source = root / "GSRC" - target = root / "GDST" - target.mkdir(parents=True) - adir = source / "ADIR" - bdir = source / "BDIR" - (adir / "EMPTY").mkdir(parents=True) - bdir.mkdir(parents=True) - (adir / "A1.BIN").write_bytes(payload(10, 3)) - (bdir / "B1.TXT").write_bytes(b"second root\r\n") - (source / "ROOT.BIN").write_bytes(payload(4097, 9)) - (source / "KEEP.TXT").write_bytes(b"not selected\r\n") - - -def snapshot(root: pathlib.Path) -> dict[str, bytes | None]: - result: dict[str, bytes | None] = {} - for path in sorted(root.rglob("*")): - name = path.relative_to(root).as_posix().upper() - result[name] = None if path.is_dir() else path.read_bytes() - return result - - -def verify(root: pathlib.Path) -> None: - source = root / "GSRC" - target = root / "GDST" - failures: list[str] = [] - expected = { - "ADIR": None, - "ADIR/A1.BIN": payload(10, 3), - "ADIR/EMPTY": None, - "BDIR": None, - "BDIR/B1.TXT": b"second root\r\n", - "ROOT.BIN": payload(4097, 9), - } - if snapshot(target) != expected: - failures.append("target не равен двум выбранным деревьям и ROOT.BIN") - if not (source / "KEEP.TXT").is_file(): - failures.append("source KEEP.TXT отсутствует") - if (target / "KEEP.TXT").exists(): - failures.append("невыбранный KEEP.TXT ошибочно скопирован") - temporary = [path.as_posix() for path in target.rglob("*") - if path.name.upper().endswith(".TMP")] - if temporary: - failures.append(f"остались temp: {temporary}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: selected file and two directory roots copied exactly.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p17_tree_delete_cancel_fixture.py b/applications/Volkov/tests/p17_tree_delete_cancel_fixture.py deleted file mode 100644 index 6be2c6f..0000000 --- a/applications/Volkov/tests/p17_tree_delete_cancel_fixture.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет runtime-cancel рекурсивного группового F8.""" - -from __future__ import annotations - -import pathlib -import sys - - -DIRECTORY_COUNT = 180 - - -def payload(index: int) -> bytes: - return bytes(((offset * 17 + index) & 0xFF) for offset in range(97)) - - -def create(root: pathlib.Path) -> None: - panel = root / "CDEL" - tree = panel / "TREE" - tree.mkdir(parents=True) - - for index in range(DIRECTORY_COUNT): - child = tree / f"D{index:03d}" - child.mkdir() - (child / "ITEM.BIN").write_bytes(payload(index)) - - (panel / "TOP.BIN").write_bytes(b"top-level selected file\r\n") - (panel / "KEEP.TXT").write_bytes(b"unselected cancel sentinel\r\n") - - -def verify(root: pathlib.Path) -> None: - panel = root / "CDEL" - failures: list[str] = [] - - if (panel / "TOP.BIN").exists(): - failures.append("завершённое удаление TOP.BIN ошибочно откатилось") - - keep = panel / "KEEP.TXT" - if not keep.is_file() or keep.read_bytes() != b"unselected cancel sentinel\r\n": - failures.append("невыбранный KEEP.TXT отсутствует или изменён") - - tree = panel / "TREE" - if not tree.is_dir(): - failures.append("TREE успел удалиться целиком: runtime-cancel не подтверждён") - else: - remaining = list(tree.glob("D*/ITEM.BIN")) - if not remaining: - failures.append("после cancel не осталось ни одного файла дерева") - for path in remaining: - index = int(path.parent.name[1:]) - if path.read_bytes() != payload(index): - failures.append(f"повреждён оставшийся файл: {path.name}") - break - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: runtime cancel kept remaining tree; completed TOP delete remains.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p17_tree_delete_fixture.py b/applications/Volkov/tests/p17_tree_delete_fixture.py deleted file mode 100644 index df90169..0000000 --- a/applications/Volkov/tests/p17_tree_delete_fixture.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture рекурсивного группового F8.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(size: int, seed: int) -> bytes: - return bytes(((index * 29 + seed) & 0xFF) for index in range(size)) - - -def create(root: pathlib.Path) -> None: - panel = root / "RDEL" - adir = panel / "ADIR" - bdir = panel / "BDIR" - keepdir = panel / "KEEPDIR" - - (adir / "EMPTY").mkdir(parents=True) - bdir.mkdir(parents=True) - keepdir.mkdir(parents=True) - - # Несколько файлов в одном каталоге проверяют, что F_NEXT продолжает - # перечисление после удаления только что возвращённой записи. - for index, size in enumerate((0, 1, 16, 4097)): - (adir / f"A{index}.BIN").write_bytes(payload(size, index + 3)) - - deep = adir - for depth in range(1, 13): - deep = deep / f"D{depth:02d}" - deep.mkdir() - (deep / f"F{depth:02d}.TXT").write_bytes( - payload(depth * 7, depth + 19) - ) - - (bdir / "B0.TXT").write_bytes(b"delete second root\r\n") - (bdir / "B1.BIN").write_bytes(payload(513, 71)) - (panel / "TOP.BIN").write_bytes(payload(33, 91)) - - (panel / "KEEP.TXT").write_bytes(b"keep top-level payload\r\n") - (keepdir / "SAFE.BIN").write_bytes(payload(257, 111)) - - -def verify(root: pathlib.Path) -> None: - panel = root / "RDEL" - failures: list[str] = [] - - for name in ("ADIR", "BDIR", "TOP.BIN"): - if (panel / name).exists(): - failures.append(f"выбранный объект не удалён: {name}") - - keep_file = panel / "KEEP.TXT" - if not keep_file.is_file() or keep_file.read_bytes() != b"keep top-level payload\r\n": - failures.append("невыбранный KEEP.TXT отсутствует или изменён") - - safe = panel / "KEEPDIR" / "SAFE.BIN" - if not safe.is_file() or safe.read_bytes() != payload(257, 111): - failures.append("невыбранное дерево KEEPDIR изменено") - - remaining = sorted( - path.relative_to(panel).as_posix().upper() - for path in panel.rglob("*") - ) - if remaining != ["KEEP.TXT", "KEEPDIR", "KEEPDIR/SAFE.BIN"]: - failures.append(f"неожиданный остаток RDEL: {remaining}") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: selected file and two directory trees deleted; KEEP preserved.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p18_metadata_fixture.py b/applications/Volkov/tests/p18_metadata_fixture.py deleted file mode 100644 index 5bdb120..0000000 --- a/applications/Volkov/tests/p18_metadata_fixture.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт payload и проверяет точные FAT16-метаданные после F5.""" - -from __future__ import annotations - -import datetime -import os -import pathlib -import struct -import sys - - -EXPECTED_ATTR = 0x27 # readonly + hidden + system + archive -EXPECTED_DATE = ((2001 - 1980) << 9) | (2 << 5) | 3 -EXPECTED_TIME = (4 << 11) | (5 << 5) | (6 // 2) -PAYLOAD = bytes(((index * 43 + 17) & 0xFF) for index in range(4097)) - - -def create(root: pathlib.Path) -> None: - source = root / "MSRC" - target = root / "MDST" - source.mkdir(parents=True) - target.mkdir(parents=True) - path = source / "META.BIN" - path.write_bytes(PAYLOAD) - timestamp = datetime.datetime(2001, 2, 3, 4, 5, 6).timestamp() - os.utime(path, (timestamp, timestamp)) - - -class Fat16: - def __init__(self, raw: bytes) -> None: - self.raw = raw - part = struct.unpack_from(" int: - return self.data + (cluster - 2) * self.cluster_size - - def next_cluster(self, cluster: int) -> int: - return struct.unpack_from(" bytes: - if cluster is None: - return self.raw[self.root:self.root + self.root_entries * 32] - result = bytearray() - while 2 <= cluster < 0xFFF8: - offset = self.cluster_offset(cluster) - result += self.raw[offset:offset + self.cluster_size] - cluster = self.next_cluster(cluster) - return bytes(result) - - @staticmethod - def short_name(name: str) -> bytes: - stem, dot, ext = name.upper().partition(".") - if len(stem) > 8 or len(ext) > 3: - raise ValueError(f"not an 8.3 name: {name}") - return stem.ljust(8).encode("ascii") + ext.ljust(3).encode("ascii") - - def find(self, directory: int | None, name: str) -> bytes | None: - wanted = self.short_name(name) - data = self.directory_bytes(directory) - for offset in range(0, len(data), 32): - entry = data[offset:offset + 32] - if entry[0] == 0x00: - break - if entry[0] == 0xE5 or entry[11] == 0x0F: - continue - if entry[:11] == wanted: - return entry - return None - - @staticmethod - def cluster(entry: bytes) -> int: - return struct.unpack_from(" bytes: - remaining = struct.unpack_from(" tuple[int, int, int]: - return ( - entry[11], - struct.unpack_from(" tuple[Fat16, bytes, bytes | None]: - fat = Fat16(raw_path.read_bytes()) - source_dir = fat.find(None, "MSRC") - target_dir = fat.find(None, "MDST") - if source_dir is None or target_dir is None: - raise RuntimeError("MSRC/MDST отсутствуют в root FAT") - source = fat.find(fat.cluster(source_dir), "META.BIN") - target = fat.find(fat.cluster(target_dir), "META.BIN") - if source is None: - raise RuntimeError("MSRC/META.BIN отсутствует") - return fat, source, target - - -def verify_source(raw_path: pathlib.Path) -> None: - fat, source, target = records(raw_path) - failures: list[str] = [] - if target is not None: - failures.append("MDST не пуст до MAME") - if metadata(source) != (EXPECTED_ATTR, EXPECTED_DATE, EXPECTED_TIME): - failures.append(f"неверные source metadata: {metadata(source)!r}") - if fat.file_bytes(source) != PAYLOAD: - failures.append("source payload повреждён") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: source FAT metadata prepared exactly.") - - -def verify(raw_path: pathlib.Path) -> None: - fat, source, target = records(raw_path) - failures: list[str] = [] - if target is None: - failures.append("MDST/META.BIN не создан") - else: - if metadata(target) != metadata(source): - failures.append( - f"metadata differ: src={metadata(source)!r} dst={metadata(target)!r}" - ) - if fat.file_bytes(target) != PAYLOAD: - failures.append("target payload не совпадает") - if metadata(source) != (EXPECTED_ATTR, EXPECTED_DATE, EXPECTED_TIME): - failures.append("source metadata изменены") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: F5 preserved exact FAT date/time and R/H/S/A attributes.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in { - "create", "verify-source", "verify" - }: - raise SystemExit( - f"usage: {sys.argv[0]} create|verify-source|verify PATH" - ) - path = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(path) - elif sys.argv[1] == "verify-source": - verify_source(path) - else: - verify(path) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p19_overwrite_fixture.py b/applications/Volkov/tests/p19_overwrite_fixture.py deleted file mode 100644 index 157d8c1..0000000 --- a/applications/Volkov/tests/p19_overwrite_fixture.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -"""Fixture и побайтная проверка транзакционного overwrite P19.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(seed: int, size: int) -> bytes: - return bytes(((index * 29 + seed) & 0xFF) for index in range(size)) - - -SOURCES = { - "NORMAL.BIN": payload(11, 4097), - "READONLY.BIN": payload(23, 8193), - "ABSENT.BIN": payload(37, 17), - "COLLIDE.BIN": payload(51, 4096), - "ROLLBACK.BIN": payload(67, 4096), -} -OLD = { - "NORMAL.BIN": b"old-normal-target", - "READONLY.BIN": b"old-readonly-target", - "COLLIDE.BIN": b"old-collision-target", - "ROLLBACK.BIN": b"old-rollback-must-survive", -} -COLLISION = b"pre-existing backup name must survive" - - -def create(root: pathlib.Path) -> None: - source = root / "SOURCE" - target = root / "TARGET" - source.mkdir(parents=True) - target.mkdir(parents=True) - for name, data in SOURCES.items(): - (source / name).write_bytes(data) - for name, data in OLD.items(): - (target / name).write_bytes(data) - (target / "~SB0000.BAK").write_bytes(COLLISION) - - -def verify(root: pathlib.Path) -> None: - target = root / "TARGET" - expected = { - "NORMAL.BIN": SOURCES["NORMAL.BIN"], - "READONLY.BIN": SOURCES["READONLY.BIN"], - "COLLIDE.BIN": SOURCES["COLLIDE.BIN"], - "ABSENT.BIN": SOURCES["ABSENT.BIN"], - "RENAMED.BIN": SOURCES["ABSENT.BIN"], - "ROLLBACK.BIN": OLD["ROLLBACK.BIN"], - "~SB0000.BAK": COLLISION, - } - failures: list[str] = [] - for name, data in expected.items(): - path = target / name - if not path.is_file() or path.read_bytes() != data: - failures.append(f"неверный target {name}") - unexpected = sorted( - path.name for path in target.glob("~SB*.BAK") - if path.name.upper() != "~SB0000.BAK" - ) - if unexpected: - failures.append(f"оставлены служебные backup: {unexpected!r}") - result = root / "RESULT.TXT" - text = result.read_text("ascii", errors="replace") if result.exists() else "" - if "ALL PASS" not in text: - failures.append("target-probe не записал ALL PASS") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: transactional overwrite, readonly, collision and rollback.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify PATH") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p19_overwrite_probe.c b/applications/Volkov/tests/p19_overwrite_probe.c deleted file mode 100644 index e9a9565..0000000 --- a/applications/Volkov/tests/p19_overwrite_probe.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * p19_overwrite_probe.c — target-проверка backup/commit/rollback copy-job. - * - * UI-policy проверяется отдельно. Здесь ошибки подаются точно между - * последним write и commit, чтобы доказать сохранность старого target. - */ - -#include -#include -#include -#include -#include -#include -#include "sc_copy.h" - -static ScCopyJob job; -static int result_fd = -1; -static uint8_t failures; - -static void log_text(const char *text) -{ - const char *end = text; - uint16_t length; - - cputs(text); - while (*end != '\0') end++; - length = (uint16_t)(end - text); - if (result_fd >= 0) (void)write(result_fd, text, length); -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -static int copy_file(const char *source_name, const char *target_name, - uint32_t size, uint8_t page, uint8_t replace) -{ - int step; - - if (sc_copy_begin_policy(&job, "D:\\SOURCE", "D:\\TARGET", - source_name, target_name, size, page, - replace) != 0) return SC_COPY_STEP_ERROR; - do { - step = sc_copy_step(&job); - } while (step == SC_COPY_STEP_MORE); - return step; -} - -int main(void) -{ - uint16_t total_before = 0u; - uint16_t free_before = 0u; - uint16_t total_after = 0u; - uint16_t free_after = 0u; - uint8_t block; - uint8_t page; - int step; - - textattr(0x07u); - clrscr_attr(0x07u); - cputs("P19 transactional overwrite\r\n\r\n"); - result_fd = open("D:\\RESULT.TXT", O_WRONLY | O_CREAT | O_TRUNC); - mem_info(&total_before, &free_before); - block = mem_alloc_pages(1u); - if (block == 0u) return 1; - page = mem_get_page(block, 0u); - - errno = 0; - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "NORMAL.BIN", 4097ul, page); - check(step != 0 && job.error == EEXIST, - "default still refuses existing target"); - - step = copy_file("NORMAL.BIN", "NORMAL.BIN", 4097ul, page, 1u); - check(step == SC_COPY_STEP_DONE && job.committed, - "overwrite commits through backup"); - - step = copy_file("READONLY.BIN", "READONLY.BIN", 8193ul, page, 1u); - check(step == SC_COPY_STEP_DONE && job.committed && - (job.existing_attr & 1u), "explicit readonly overwrite"); - - step = copy_file("COLLIDE.BIN", "COLLIDE.BIN", 4096ul, page, 1u); - check(step == SC_COPY_STEP_DONE && job.committed, - "pre-existing backup name skipped"); - - step = copy_file("ABSENT.BIN", "ABSENT.BIN", 17ul, page, 1u); - check(step == SC_COPY_STEP_DONE && job.committed, - "replace policy accepts vanished target"); - - step = copy_file("ABSENT.BIN", "RENAMED.BIN", 17ul, page, 0u); - check(step == SC_COPY_STEP_DONE && job.committed, - "distinct destination name"); - - step = sc_copy_begin_policy(&job, "D:\\SOURCE", "D:\\TARGET", - "ROLLBACK.BIN", "ROLLBACK.BIN", - 4096ul, page, 1u); - if (step == 0) step = sc_copy_step(&job); - if (step == SC_COPY_STEP_MORE) { - (void)close(job.temp_fd); - job.temp_fd = -1; - (void)unlink(job.temp_path); - step = sc_copy_step(&job); - } - check(step == SC_COPY_STEP_ERROR && !job.committed, - "rename failure rolls original target back"); - - mem_free_block(block); - mem_info(&total_after, &free_after); - check(total_before == total_after && free_before == free_after, - "EMM restored"); - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - cputs("\r\nPress Enter to return to DSS.\r\n"); - while (kbhit()) (void)getkey(); - (void)getkey(); - return failures; -} diff --git a/applications/Volkov/tests/p19_policy_fixture.py b/applications/Volkov/tests/p19_policy_fixture.py deleted file mode 100644 index 7554930..0000000 --- a/applications/Volkov/tests/p19_policy_fixture.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -"""Fixture и проверка UI-policy overwrite/skip/rename/cancel P19.""" - -from __future__ import annotations - -import pathlib -import sys - - -def payload(seed: int, size: int) -> bytes: - return bytes(((index * 31 + seed) & 0xFF) for index in range(size)) - - -SOURCES = { - "AONE.BIN": payload(1, 4097), - "ATWO.BIN": payload(2, 8193), - "CANCEL.BIN": payload(3, 33), - "REN.BIN": payload(4, 257), - "RONLY.BIN": payload(5, 5000), - "SONE.BIN": payload(6, 65), - "STWO.BIN": payload(7, 66), -} -OLD = {name: ("old-" + name).encode("ascii") for name in SOURCES} - - -def create(root: pathlib.Path) -> None: - source = root / "P19SRC" - target = root / "P19DST" - source.mkdir(parents=True) - target.mkdir(parents=True) - for name, data in SOURCES.items(): - (source / name).write_bytes(data) - for name, data in OLD.items(): - (target / name).write_bytes(data) - - -def verify(root: pathlib.Path) -> None: - target = root / "P19DST" - expected = { - "AONE.BIN": SOURCES["AONE.BIN"], - "ATWO.BIN": SOURCES["ATWO.BIN"], - "RONLY.BIN": SOURCES["RONLY.BIN"], - "SONE.BIN": OLD["SONE.BIN"], - "STWO.BIN": OLD["STWO.BIN"], - "REN.BIN": OLD["REN.BIN"], - "CANCEL.BIN": OLD["CANCEL.BIN"], - "NEXT.BIN": SOURCES["REN.BIN"], - } - failures: list[str] = [] - for name, data in expected.items(): - path = target / name - if not path.is_file() or path.read_bytes() != data: - failures.append(f"неверный target {name}") - garbage = sorted( - path.name for path in target.iterdir() - if path.name.upper().startswith(("~SC", "~SB")) - ) - if garbage: - failures.append(f"оставлены служебные файлы: {garbage!r}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: overwrite-all, readonly prompt, skip-all, rename and cancel.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify PATH") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p1_platform/Makefile b/applications/Volkov/tests/p1_platform/Makefile deleted file mode 100644 index b995b0c..0000000 --- a/applications/Volkov/tests/p1_platform/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# P1 platform probe для Sprinter Commander. -# -# Собирает два файла: -# p1probe.exe — интерактивные пробы каталогов, EMM, экрана, клавиатуры, -# DSKINFO и EXEC; -# p1child.exe — дочерняя программа для проверки EXEC/возврата. -# -# Пробы намеренно собираются в small: это изолированный диагностический -# инструмент, а не topology будущего Commander. Сборка big проверяется в P2. - -EXAMPLE := p1probe -MEMORY := small -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -EXTRA_SRCS := p1_sys.c p1_emm.c p1_dir.c p1_screen.c p1_keyboard.c p1_exec_test.c -EXTRA_DATA := p1child.exe - -include $(CURDIR)/../../sdk.mk - -# EXEC-тест ожидает дочерний EXE рядом с основной пробой. -$(EXE): Makefile p1child.exe - -p1child.exe: p1child.c - $(SPRINTER_CC) --memory tiny --safe --max-allocs $(ALLOCS) -o $@ $< - -clean-child: - rm -f p1child.exe - -clean: clean-child - -.PHONY: clean-child diff --git a/applications/Volkov/tests/p1_platform/mame_dump_keys.lua b/applications/Volkov/tests/p1_platform/mame_dump_keys.lua deleted file mode 100644 index 62b3238..0000000 --- a/applications/Volkov/tests/p1_platform/mame_dump_keys.lua +++ /dev/null @@ -1,25 +0,0 @@ --- Диагностическая проба полей AT-клавиатуры MAME. --- Нужна для воспроизводимого ввода навигационных и функциональных клавиш. - -local ready = false -local done = false - -emu.add_machine_reset_notifier(function() - ready = true -end) - -emu.register_periodic(function() - if not ready or done then return end - done = true - - for tag, port in pairs(manager.machine.ioport.ports) do - if tostring(tag):find(":kbd:ms_naturl:P", 1, true) then - for name, field in pairs(port.fields) do - print(string.format("[p1-key] %s mask=0x%02X name=%s", - tostring(tag), field.mask, tostring(name))) - end - end - end - - manager.machine:exit() -end) diff --git a/applications/Volkov/tests/p1_platform/mame_p1_keyboard.lua b/applications/Volkov/tests/p1_platform/mame_p1_keyboard.lua deleted file mode 100644 index 485e7cb..0000000 --- a/applications/Volkov/tests/p1_platform/mame_p1_keyboard.lua +++ /dev/null @@ -1,147 +0,0 @@ --- Автоматический MAME-сценарий для P1-пробы клавиатуры. --- Ввод идёт прямо в поля AT-клавиатуры Sprinter, как в --- toolchain/mame_interactive.py, но дополнен именованными клавишами. - -local KB = ":kbd:ms_naturl:" -local HOLD = 0.06 -local events = {} - -local function add(t, tag, mask, value) - events[#events + 1] = {t, KB .. tag, mask, value} -end - -local function key(t, tag, mask) - add(t, tag, mask, 1) - add(t + HOLD, tag, mask, 0) -end - -local function chord(t, mod_tag, mod_mask, key_tag, key_mask) - add(t, mod_tag, mod_mask, 1) - add(t + 0.02, key_tag, key_mask, 1) - add(t + 0.08, key_tag, key_mask, 0) - add(t + 0.10, mod_tag, mod_mask, 0) -end - -local chars = { - a={"P1.6",0x04}, b={"P1.5",0x10}, e={"P1.4",0x20}, - o={"P2.2",0x02}, p={"P2.3",0x20}, r={"P1.5",0x01}, - x={"P1.2",0x10}, ["1"]={"P1.6",0x01}, - [" "]={"P2.4",0x80}, ["."]={"P2.2",0x10}, - ["\\"]={"P2.1",0x04}, ["\n"]={"P2.1",0x10}, - [":"]={"P2.3",0x02,true} -} - -local function type_text(t, text) - for i = 1, #text do - local ch = text:sub(i, i) - local def = chars[ch] - local shifted = false - if not def then - local lower = ch:lower() - def = chars[lower] - shifted = ch ~= lower - else - shifted = def[3] or false - end - if shifted then - chord(t, "P1.7", 0x02, def[1], def[2]) - else - key(t, def[1], def[2]) - end - t = t + 0.14 - end -end - --- Запуск P1PROBE.EXE из приглашения DSS и выбор клавиатурной пробы. -type_text(8.0, "a:\\P1PROBE .EXE\n") -key(14.0, "P1.5", 0x40) -- 4 - --- 24 события: навигация, F1..F10, комбинации Commander и завершающий Esc. -local sequence = { - {"P2.4",0x01}, -- Up - {"P2.3",0x10}, -- Down - {"P2.1",0x08}, -- Left - {"P2.4",0x40}, -- Right - {"P2.5",0x01}, -- Home - {"P2.5",0x20}, -- End - {"P1.2",0x01}, -- Page Up - {"P1.2",0x20}, -- Page Down - {"P2.6",0x01}, -- Insert - {"P2.6",0x02}, -- Delete - {"P1.2",0x40}, -- F1 - {"P1.2",0x80}, -- F2 - {"P2.6",0x40}, -- F3 - {"P2.6",0x80}, -- F4 - {"P2.1",0x40}, -- F5 - {"P2.1",0x80}, -- F6 - {"P2.2",0x40}, -- F7 - {"P2.2",0x80}, -- F8 - {"P2.3",0x40}, -- F9 - {"P2.3",0x80} -- F10 -} - -for i, def in ipairs(sequence) do - key(16.0 + (i - 1) * 0.35, def[1], def[2]) -end -chord(23.00, "P1.1", 0x02, "P1.5", 0x01) -- Ctrl+R -chord(23.35, "P1.1", 0x02, "P1.2", 0x01) -- Ctrl+PgUp -chord(23.70, "P1.3", 0x04, "P1.2", 0x40) -- Alt+F1 -key(24.05, "P1.6", 0x40) -- Esc - --- Закрыть итоговый экран и подтвердить возврат к главному меню. -key(27.5, "P2.1", 0x10) - -table.sort(events, function(a, b) return a[1] < b[1] end) - -local snap_times = {17.8, 20.6, 23.4, 25.2, 29.0} -local snaps_done = {} -local start_time = nil -local ports = nil -local index = 1 -local field_cache = {} - -local function now() - local t = manager.machine.time - return t.seconds + t.attoseconds / 1e18 -end - -local function field(tag, mask) - local cache_key = tag .. "/" .. mask - if field_cache[cache_key] then return field_cache[cache_key] end - for _, candidate in pairs(ports[tag].fields) do - if candidate.mask == mask then - field_cache[cache_key] = candidate - return candidate - end - end - error("Не найдено поле " .. cache_key) -end - -emu.add_machine_reset_notifier(function() - start_time = now() -end) - -emu.register_periodic(function() - if not start_time then return end - if not ports then ports = manager.machine.ioport.ports end - local elapsed = now() - start_time - - while index <= #events and elapsed >= events[index][1] do - local event = events[index] - field(event[2], event[3]):set_value(event[4]) - index = index + 1 - end - - for _, snap_time in ipairs(snap_times) do - if not snaps_done[snap_time] and elapsed >= snap_time then - snaps_done[snap_time] = true - manager.machine.video:snapshot() - print("[p1-kbd] snapshot t=" .. elapsed) - end - end - - if elapsed >= 31.0 then - print("[p1-kbd] exit t=" .. elapsed) - manager.machine:exit() - end -end) diff --git a/applications/Volkov/tests/p1_platform/p1_dir.c b/applications/Volkov/tests/p1_platform/p1_dir.c deleted file mode 100644 index 25171ae..0000000 --- a/applications/Volkov/tests/p1_platform/p1_dir.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * p1_dir.c — наблюдаемая проверка CURDIR/CHDIR/F_FIRST/F_NEXT. - * - * Тест не меняет файлы. chdir(".") используется только для проверки - * сохранения текущего каталога. - */ - -#include -#include -#include -#include -#include -#include -#include "p1_platform.h" - -#define P1_FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) -#define P1_FIND_LIMIT 4096u - -static char cwd_before[256]; -static char cwd_after[256]; -static ffblk_t find_buf; - -static int scan_pattern(const char *pattern, uint16_t *out_count, - uint8_t *out_dot, uint8_t *out_dotdot) -{ - uint16_t count = 0; - uint8_t dot = 0; - uint8_t dotdot = 0; - int rc; - int end_errno; - - errno = 0; - rc = ffirst(pattern, &find_buf, P1_FIND_ATTRS); - if (rc != 0) { - if (errno == ENOENT) { - printf("Pattern %-4s: empty (ffirst errno=%d)\n", pattern, errno); - *out_count = 0; - *out_dot = 0; - *out_dotdot = 0; - return 0; - } - printf("ffirst(%s) failed: errno=%d\n", pattern, errno); - return -1; - } - - for (;;) { - if (strcmp(find_buf.found_name, ".") == 0) dot = 1; - if (strcmp(find_buf.found_name, "..") == 0) dotdot = 1; - - if (count < 20) { - printf(" %02X %10lu %04X/%04X %s\n", - (unsigned)find_buf.found_attr, - (unsigned long)find_buf.size, - (unsigned)find_buf.date, - (unsigned)find_buf.time, - find_buf.found_name); - } - - count++; - if (count >= P1_FIND_LIMIT) { - puts("Enumeration limit reached: possible F_NEXT loop."); - return -1; - } - - errno = 0; - if (fnext(&find_buf) != 0) break; - } - - end_errno = errno; - printf("Pattern %-4s: count=%u dot=%u dotdot=%u end_errno=%d\n", - pattern, (unsigned)count, (unsigned)dot, (unsigned)dotdot, - end_errno); - - /* MAME 0.287 / BIOS 3.06 подтвердил ENOENT (3) для конца F_NEXT. - * Код 0x0F из старого описания DSS здесь не является штатным. */ - if (end_errno != ENOENT) { - puts("Unexpected F_NEXT termination code."); - return -1; - } - - *out_count = count; - *out_dot = dot; - *out_dotdot = dotdot; - return 0; -} - -int p1_test_directory(void) -{ - uint16_t count_star_dot; - uint16_t count_star; - uint8_t dot1, dotdot1, dot2, dotdot2; - int failed = 0; - - p1_heading("Directory: CURDIR, CHDIR, F_FIRST/F_NEXT"); - - errno = 0; - if (getcwd(cwd_before, sizeof(cwd_before)) == 0) { - printf("getcwd failed: errno=%d\n", errno); - return -1; - } - printf("CWD before: %s\n", cwd_before); - - if (chdir(".") != 0) { - printf("chdir(.) failed: errno=%d\n", errno); - failed++; - } - - if (getcwd(cwd_after, sizeof(cwd_after)) == 0) { - printf("second getcwd failed: errno=%d\n", errno); - return -1; - } - printf("CWD after : %s\n", cwd_after); - if (strcmp(cwd_before, cwd_after) != 0) { - puts("CWD changed after chdir(.)."); - failed++; - } - - puts("\nFirst entries for *.*:"); - if (scan_pattern("*.*", &count_star_dot, &dot1, &dotdot1) != 0) { - failed++; - } - - puts("\nFirst entries for *:"); - if (scan_pattern("*", &count_star, &dot2, &dotdot2) != 0) { - failed++; - } - - if (count_star != count_star_dot) { - printf("NOTE: * count (%u) differs from *.* count (%u).\n", - (unsigned)count_star, (unsigned)count_star_dot); - } - if (dot1 != dot2 || dotdot1 != dotdot2) { - puts("NOTE: dot entries differ between patterns."); - } - - printf("Directory checks failed: %u\n", (unsigned)failed); - return failed ? -1 : 0; -} - -int p1_test_disk_info(void) -{ - P1DiskInfo info; - uint32_t cluster_bytes; - uint32_t total_bytes; - uint32_t free_bytes; - - p1_heading("DSKINFO: current disk"); - errno = 0; - if (p1_disk_info(0xFF, &info) != 0) { - printf("DSKINFO failed: errno=%d\n", errno); - return -1; - } - - cluster_bytes = (uint32_t)info.sectors_per_cluster * - (uint32_t)info.bytes_per_sector; - total_bytes = cluster_bytes * (uint32_t)info.total_clusters; - free_bytes = cluster_bytes * (uint32_t)info.free_clusters; - - printf("Sectors/cluster : %u\n", (unsigned)info.sectors_per_cluster); - printf("Bytes/sector : %u\n", (unsigned)info.bytes_per_sector); - printf("Total clusters : %u\n", (unsigned)info.total_clusters); - printf("Free clusters : %u\n", (unsigned)info.free_clusters); - printf("Cluster bytes : %lu\n", (unsigned long)cluster_bytes); - printf("Total bytes : %lu\n", (unsigned long)total_bytes); - printf("Free bytes : %lu\n", (unsigned long)free_bytes); - - if (info.sectors_per_cluster == 0 || info.bytes_per_sector == 0 || - info.total_clusters == 0 || info.free_clusters > info.total_clusters) { - puts("DSKINFO returned inconsistent values."); - return -1; - } - return 0; -} diff --git a/applications/Volkov/tests/p1_platform/p1_emm.c b/applications/Volkov/tests/p1_platform/p1_emm.c deleted file mode 100644 index 2844a1c..0000000 --- a/applications/Volkov/tests/p1_platform/p1_emm.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * p1_emm.c — проверка выделения трёх EMM-страниц и доступа через W3. - */ - -#include -#include -#include -#include -#include -#include "p1_platform.h" - -#define P1_PAGE_SIZE 0x4000u -#define P1_BLOCK 64u - -static uint8_t write_buf[P1_BLOCK]; -static uint8_t read_buf[P1_BLOCK]; - -static void make_pattern(uint8_t page_index, uint8_t salt) -{ - uint8_t i; - for (i = 0; i < P1_BLOCK; i++) { - write_buf[i] = (uint8_t)(salt ^ (uint8_t)(page_index * 0x41u + i)); - read_buf[i] = 0; - } -} - -static int check_region(uint8_t page, uint8_t page_index, - uint16_t offset, uint8_t salt) -{ - make_pattern(page_index, salt); - bank_write(page, offset, write_buf, P1_BLOCK); - bank_read(page, offset, read_buf, P1_BLOCK); - if (memcmp(write_buf, read_buf, P1_BLOCK) != 0) { - printf("Mismatch: logical=%u phys=%02X offset=%04X\n", - (unsigned)page_index, (unsigned)page, (unsigned)offset); - return -1; - } - return 0; -} - -int p1_test_emm(void) -{ - uint16_t total_before, free_before; - uint16_t total_after, free_after; - uint8_t block; - uint8_t page[3]; - uint8_t i; - int failed = 0; - - p1_heading("EMM: 3-page allocation and W3 access"); - errno = 0; - mem_info(&total_before, &free_before); - printf("Before: total=%u free=%u pages\n", - (unsigned)total_before, (unsigned)free_before); - - block = mem_alloc_pages(3); - if (block == 0) { - printf("mem_alloc_pages(3) failed: errno=%d\n", errno); - return -1; - } - - printf("Block id: %u\n", (unsigned)block); - for (i = 0; i < 3; i++) { - page[i] = mem_get_page(block, i); - printf(" logical %u -> physical %02X\n", - (unsigned)i, (unsigned)page[i]); - if (page[i] == 0) failed++; - } - - if (page[0] == page[1] || page[0] == page[2] || page[1] == page[2]) { - puts("Physical page numbers are not distinct."); - failed++; - } - - for (i = 0; i < 3; i++) { - if (page[i] == 0) continue; - if (check_region(page[i], i, 0, 0x5A) != 0) failed++; - if (check_region(page[i], i, - (uint16_t)(P1_PAGE_SIZE - P1_BLOCK), 0xA5) != 0) { - failed++; - } - } - - mem_free_block(block); - mem_info(&total_after, &free_after); - printf("After : total=%u free=%u pages\n", - (unsigned)total_after, (unsigned)free_after); - - if (total_before != total_after || free_before != free_after) { - puts("EMM counters were not restored after free."); - failed++; - } - - printf("EMM checks failed: %u\n", (unsigned)failed); - return failed ? -1 : 0; -} diff --git a/applications/Volkov/tests/p1_platform/p1_exec_test.c b/applications/Volkov/tests/p1_platform/p1_exec_test.c deleted file mode 100644 index 559eab2..0000000 --- a/applications/Volkov/tests/p1_platform/p1_exec_test.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * p1_exec_test.c — проверка EXEC, возврата к родителю и WAIT. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "p1_platform.h" - -typedef struct { - int rc; - int error; - uint8_t exit_code; - uint8_t wait_code; - uint8_t page_w1; - uint8_t page_w2; - uint8_t page_w3; - char cwd[256]; -} P1ExecResult; - -static P1ExecResult short_result; -static P1ExecResult path_result; -static char cwd_before[256]; - -static void run_exec_case(const char *label, const char *path, - uint8_t path_mode, P1ExecResult *result) -{ - p1_heading(label); - printf("Calling EXEC: B=%u, path=%s\n", (unsigned)path_mode, path); - cputs("The child switches to 40x32 and waits for one key.\r\n"); - cputs("After that it returns code 0x5A.\r\n\r\n"); - cputs("Press any key to call EXEC..."); - (void)getkey(); - - errno = 0; - result->rc = p1_exec(path_mode, path); - result->error = errno; - result->exit_code = p1_exec_exit_code; - result->wait_code = p1_wait_code(); - - /* Сначала снять страницы, затем исправлять видеорежим и печатать. */ - result->page_w1 = _io_page_w1; - result->page_w2 = _io_page_w2; - result->page_w3 = _io_page_w3; - - if (getcwd(result->cwd, sizeof(result->cwd)) == 0) { - result->cwd[0] = 0; - } - (void)settextmode(TEXT_MODE_80x32); -} - -static void print_result(const char *name, const P1ExecResult *result) -{ - printf("%s: rc=%d errno=%d exit=%02X wait=%02X pages=%02X/%02X/%02X\n", - name, result->rc, result->error, - (unsigned)result->exit_code, (unsigned)result->wait_code, - (unsigned)result->page_w1, (unsigned)result->page_w2, - (unsigned)result->page_w3); - printf(" cwd=%s\n", result->cwd[0] ? result->cwd : ""); -} - -int p1_test_exec(void) -{ - uint8_t before_w1 = _io_page_w1; - uint8_t before_w2 = _io_page_w2; - uint8_t before_w3 = _io_page_w3; - int failed = 0; - - if (getcwd(cwd_before, sizeof(cwd_before)) == 0) { - p1_heading("EXEC: setup failed"); - printf("getcwd failed: errno=%d\n", errno); - return -1; - } - - /* B=0 характеризуем для будущей командной строки. Ошибка этого случая - * не блокирует PoC: Commander будет передавать явный путь с B=1. */ - run_exec_case("EXEC case 1: short name / PATH", - "P1CHILD.EXE", 0, &short_result); - - /* B=1 и явный относительный путь — обязательный случай PoC. */ - run_exec_case("EXEC case 2: explicit path", - ".\\P1CHILD.EXE", 1, &path_result); - - p1_heading("EXEC results"); - printf("Parent before: pages=%02X/%02X/%02X cwd=%s\n", - (unsigned)before_w1, (unsigned)before_w2, (unsigned)before_w3, - cwd_before); - print_result("B=0", &short_result); - print_result("B=1", &path_result); - - if (path_result.rc != 0 || path_result.exit_code != 0x5A || - path_result.wait_code != 0x5A) { - puts("Required B=1 EXEC result is incorrect."); - failed++; - } - if (path_result.page_w1 != before_w1 || path_result.page_w2 != before_w2 || - path_result.page_w3 != before_w3) { - puts("Parent window mapping was not restored."); - failed++; - } - if (strcmp(path_result.cwd, cwd_before) != 0) { - puts("Parent CWD changed after child."); - failed++; - } - - if (short_result.rc != 0) { - puts("NOTE: B=0 short-name lookup failed; explicit B=1 remains usable."); - } - - printf("EXEC checks failed: %u\n", (unsigned)failed); - return failed ? -1 : 0; -} diff --git a/applications/Volkov/tests/p1_platform/p1_keyboard.c b/applications/Volkov/tests/p1_platform/p1_keyboard.c deleted file mode 100644 index 34ff3dc..0000000 --- a/applications/Volkov/tests/p1_platform/p1_keyboard.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * p1_keyboard.c — печать сырых событий getkey()/kbd_mod_state(). - */ - -#include -#include -#include -#include "p1_platform.h" - -static uint8_t compact_modifiers(uint16_t state) -{ - uint8_t result = 0; - if (state & (KBD_MOD_LSHIFT | KBD_MOD_RSHIFT)) result |= 0x01; - if (state & (KBD_MOD_CTRL | KBD_MOD_LCTRL | KBD_MOD_RCTRL)) result |= 0x02; - if (state & (KBD_MOD_ALT | KBD_MOD_LALT | KBD_MOD_RALT)) result |= 0x04; - return result; -} - -int p1_test_keyboard(void) -{ - uint8_t n = 0; - - p1_heading("Keyboard: raw event capture"); - cputs("Press navigation keys, F1..F10 and Ctrl combinations.\r\n"); - cputs("Esc finishes after its event is printed. Maximum: 24 events.\r\n\r\n"); - cputs(" n key ascii scan live_mod compact\r\n"); - - while (n < 24) { - uint16_t key = getkey(); - uint16_t live = kbd_mod_state(); - uint8_t ascii = (uint8_t)key; - uint8_t scan = (uint8_t)(key >> 8); - uint8_t compact = compact_modifiers(live); - char printable = (ascii >= 0x20 && ascii < 0x7F) ? (char)ascii : '.'; - - printf("%2u %c %02X %02X %04X %02X\n", - (unsigned)n, printable, (unsigned)ascii, (unsigned)scan, - (unsigned)live, (unsigned)compact); - n++; - if (ascii == 0x1B) break; - } - - cputs("\r\nCompare the captured values with commander-keymap.md.\r\n"); - return 0; -} diff --git a/applications/Volkov/tests/p1_platform/p1_platform.h b/applications/Volkov/tests/p1_platform/p1_platform.h deleted file mode 100644 index 3a279cd..0000000 --- a/applications/Volkov/tests/p1_platform/p1_platform.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * p1_platform.h — общий контракт платформенных проб Commander P1. - * - * Это диагностический код приложения, не публичный заголовок libc. После - * подтверждения в MAME стабильные wrappers либо останутся в Commander, - * либо будут перенесены в libc отдельными модулями и тестами. - */ - -#ifndef P1_PLATFORM_H -#define P1_PLATFORM_H - -#include - -typedef struct { - uint8_t sectors_per_cluster; - uint16_t total_clusters; - uint16_t free_clusters; - uint16_t bytes_per_sector; -} P1DiskInfo; - -typedef char P1DiskInfo_must_be_7_bytes[(sizeof(P1DiskInfo) == 7) ? 1 : -1]; - -/* Последний код завершения, возвращённый EXEC при CF=0. */ -extern uint8_t p1_exec_exit_code; - -int p1_disk_info(uint8_t disk, P1DiskInfo *out); -int p1_exec(uint8_t path_mode, const char *path); -uint8_t p1_wait_code(void); - -void p1_winrest(uint8_t row, uint8_t col, uint8_t height, uint8_t width, - uint8_t page, uint16_t offset); - -int p1_test_emm(void); -int p1_test_directory(void); -int p1_test_screen(void); -int p1_test_keyboard(void); -int p1_test_exec(void); -int p1_test_disk_info(void); - -void p1_heading(const char *title); -void p1_pause(void); - -#endif diff --git a/applications/Volkov/tests/p1_platform/p1_screen.c b/applications/Volkov/tests/p1_platform/p1_screen.c deleted file mode 100644 index fc1e411..0000000 --- a/applications/Volkov/tests/p1_platform/p1_screen.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * p1_screen.c — визуальная проверка экранной EMM-страницы и WINREST. - */ - -#include -#include -#include -#include -#include -#include -#include "p1_platform.h" - -#define P1_SCREEN_W 80u -#define P1_SCREEN_H 32u -#define P1_ROW_BYTES 160u -#define P1_MARKER_OFF 0x2000u - -static uint8_t row_buf[P1_ROW_BYTES]; -static uint8_t marker_buf[2u * 20u * 2u]; - -static void row_clear(uint8_t attr) -{ - uint8_t x; - for (x = 0; x < P1_SCREEN_W; x++) { - row_buf[(uint16_t)x * 2u] = ' '; - row_buf[(uint16_t)x * 2u + 1u] = attr; - } -} - -static void row_text(uint8_t x, const char *text, uint8_t attr) -{ - while (*text && x < P1_SCREEN_W) { - row_buf[(uint16_t)x * 2u] = (uint8_t)*text++; - row_buf[(uint16_t)x * 2u + 1u] = attr; - x++; - } -} - -static void marker_build(void) -{ - static const char top[] = "PARTIAL WINREST OK "; - static const char bot[] = "offset = 0x2000 "; - uint8_t x; - - for (x = 0; x < 20; x++) { - marker_buf[(uint16_t)x * 2u] = (uint8_t)top[x]; - marker_buf[(uint16_t)x * 2u + 1u] = - COLOR(COLOR_WHITE, COLOR_RED); - marker_buf[40u + (uint16_t)x * 2u] = (uint8_t)bot[x]; - marker_buf[40u + (uint16_t)x * 2u + 1u] = - COLOR(COLOR_YELLOW, COLOR_RED); - } -} - -int p1_test_screen(void) -{ - uint8_t block; - uint8_t page; - uint8_t y; - - p1_heading("WINREST: preparing EMM screen"); - - errno = 0; - block = mem_alloc_pages(1); - if (block == 0) { - printf("mem_alloc_pages failed: errno=%d\n", errno); - return -1; - } - page = mem_get_page(block, 0); - if (page == 0) { - printf("mem_get_page failed: errno=%d\n", errno); - mem_free_block(block); - return -1; - } - - for (y = 0; y < P1_SCREEN_H; y++) { - /* Только яркие foreground 9..15 на синем: граница не должна - * исчезать из-за комбинации blue-on-blue вроде прежнего 0x11. */ - uint8_t attr = COLOR((uint8_t)(COLOR_LIGHTBLUE + (y % 7u)), - COLOR_BLUE); - row_clear(attr); - row_buf[0] = (y == 0 || y == 31) ? '+' : '|'; - row_buf[158] = (y == 0 || y == 31) ? '+' : '|'; - - if (y == 0 || y == 31) { - uint8_t x; - for (x = 1; x < 79; x++) row_buf[(uint16_t)x * 2u] = '-'; - } - if (y == 2) row_text(4, "FULL 80x32 WINREST FROM EMM PAGE", - COLOR(COLOR_WHITE, COLOR_BLUE)); - if (y == 4) row_text(4, "Rows have different foreground colours.", - COLOR(COLOR_YELLOW, COLOR_BLUE)); - if (y == 6) row_text(4, "Expected: complete border, no shifted cells.", - COLOR(COLOR_YELLOW, COLOR_BLUE)); - if (y == 28) row_text(4, "Press a key for partial-offset test.", - COLOR(COLOR_WHITE, COLOR_BLUE)); - - bank_write(page, (uint16_t)y * P1_ROW_BYTES, - row_buf, P1_ROW_BYTES); - } - - marker_build(); - bank_write(page, P1_MARKER_OFF, marker_buf, sizeof(marker_buf)); - - p1_winrest(0, 0, P1_SCREEN_H, P1_SCREEN_W, page, 0); - (void)getkey(); - - /* Две строки по 20 ячеек поверх середины полного экрана. */ - p1_winrest(14, 30, 2, 20, page, P1_MARKER_OFF); - (void)getkey(); - - mem_free_block(block); - p1_heading("WINREST test finished"); - cputs("Visual checks:\r\n"); - cputs(" 1. Full 80x32 frame had no shifts or holes.\r\n"); - cputs(" 2. Red/yellow 20x2 marker appeared at row 14, col 30.\r\n"); - cputs(" 3. Marker text started at offset 0x2000.\r\n"); - cputs("\r\nReturn PASS only records that both calls completed.\r\n"); - return 0; -} diff --git a/applications/Volkov/tests/p1_platform/p1_sys.c b/applications/Volkov/tests/p1_platform/p1_sys.c deleted file mode 100644 index 6c040af..0000000 --- a/applications/Volkov/tests/p1_platform/p1_sys.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * p1_sys.c — отсутствующие в libc сырые ESTEX wrappers для проб P1. - * - * ABI SDCC __sdcccall(1): int возвращается в DE, uint8_t — в A. Каждый RST - * сохраняет IX, потому что IX callee-saved. Ошибка ESTEX (CF=1, код в A) - * проходит через общий libc-хелпер __errno_set. - */ - -#include -#include "p1_platform.h" - -uint8_t p1_exec_exit_code; - -/* ESTEX DSKINFO $03: - * A=disk (0xFF=current) - * out: A=sectors/cluster, HL=total clusters, - * DE=free clusters, BC=bytes/sector. - */ -int p1_disk_info(uint8_t disk, P1DiskInfo *out) __naked -{ - (void)disk; - (void)out; - __asm - ;; A = disk, DE = out. - push ix - push de - ld c, #0x03 - rst #0x10 - jr c, _p1_di_error - - ;; Забрать out в IX, пока все выходные регистры DSS ещё целы. - pop ix - ld 0 (ix), a - ld 1 (ix), l - ld 2 (ix), h - ld 3 (ix), e - ld 4 (ix), d - ld 5 (ix), c - ld 6 (ix), b - pop ix - ld de, #0 - ret - - _p1_di_error: - pop de ; снять сохранённый out - pop ix - call __errno_set - ld de, #-1 - ret - __endasm; -} - -/* ESTEX EXEC $40. path_mode: 0 — короткое имя/PATH, 1 — передан путь. - * На успехе код дочерней программы сохраняется в p1_exec_exit_code. - */ -int p1_exec(uint8_t path_mode, const char *path) __naked -{ - (void)path_mode; - (void)path; - __asm - ;; A = path_mode, DE = path. Такой порядок не оставляет 8-битный - ;; второй аргумент на стеке в ABI SDCC. - push ix - ld b, a - ex de, hl - ld c, #0x40 - rst #0x10 - pop ix - jr c, _p1_exec_error - ld (_p1_exec_exit_code), a - ld de, #0 - ret - - _p1_exec_error: - call __errno_set - ld de, #-1 - ret - __endasm; -} - -/* ESTEX WAIT $42 возвращает код последней завершившейся программы в A. */ -uint8_t p1_wait_code(void) __naked -{ - __asm - push ix - ld c, #0x42 - rst #0x10 - pop ix - ret - __endasm; -} - -/* ESTEX WINREST $5A: - * D=row, E=col, H=height, L=width, B=physical page, - * IX=0xC000+offset. - * - * Раскладка аргументов подтверждена существующим tests/winrest и mdview2: - * A=row, L=col, стек +2 height, +3 width, +4 page, +5..6 offset. - */ -void p1_winrest(uint8_t row, uint8_t col, uint8_t height, uint8_t width, - uint8_t page, uint16_t offset) __naked -{ - (void)row; - (void)col; - (void)height; - (void)width; - (void)page; - (void)offset; - __asm - ld iy, #2 - add iy, sp - ld d, a - ld e, l - - push ix - ld l, 3 (iy) - ld h, 4 (iy) - ld bc, #0xC000 - add hl, bc - push hl - pop ix - - ld h, 0 (iy) - ld a, 1 (iy) - ld l, a - ld a, 2 (iy) - ld b, a - ld c, #0x5A - di - rst #0x10 - ei - pop ix - - ;; Снять 5 стековых байтов height,width,page,offset. - pop hl - inc sp - inc sp - inc sp - inc sp - inc sp - jp (hl) - __endasm; -} diff --git a/applications/Volkov/tests/p1_platform/p1child.c b/applications/Volkov/tests/p1_platform/p1child.c deleted file mode 100644 index 056f133..0000000 --- a/applications/Volkov/tests/p1_platform/p1child.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * p1child.c — дочерняя программа для проверки ESTEX EXEC. - * - * Намеренно меняет видеорежим, ничего не пишет на диск и возвращает 0x5A. - */ - -#include -#include -#include -#include -#include - -static char child_cwd[256]; - -int main(void) -{ - (void)settextmode(TEXT_MODE_40x32); - clrscr_attr(0x27); - gotoxy(0, 0); - textattr(0x2F); - cputs("P1CHILD.EXE\r\n\r\n"); - textattr(0x27); - cputs("EXEC reached child successfully.\r\n"); - cprintf("W1/W2/W3: %02X/%02X/%02X\r\n", - (unsigned)_io_page_w1, (unsigned)_io_page_w2, - (unsigned)_io_page_w3); - if (getcwd(child_cwd, sizeof(child_cwd)) != 0) { - cprintf("CWD: %s\r\n", child_cwd); - } else { - cputs("CWD: \r\n"); - } - cputs("\r\nPress any key to return 0x5A..."); - (void)getkey(); - return 0x5A; -} diff --git a/applications/Volkov/tests/p1_platform/p1probe.c b/applications/Volkov/tests/p1_platform/p1probe.c deleted file mode 100644 index d53e2d3..0000000 --- a/applications/Volkov/tests/p1_platform/p1probe.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * p1probe.c — интерактивный набор платформенных проб Sprinter Commander. - * - * Программа ничего не удаляет и не изменяет в текущем каталоге. EMM-тест - * пишет исключительно в выделенный блок памяти, дочерняя программа также - * не выполняет дисковых записей. - */ - -#include -#include -#include -#include "p1_platform.h" - -void p1_heading(const char *title) -{ - clrscr_attr(0x17); - gotoxy(0, 0); - textattr(0x1F); - cprintf("Sprinter Commander - P1 platform probe\r\n"); - textattr(0x17); - cprintf("%s\r\n\r\n", title); -} - -void p1_pause(void) -{ - textattr(0x1E); - cputs("\r\nPress any key to return to menu..."); - (void)getkey(); -} - -static void show_menu(void) -{ - p1_heading("Main menu"); - cputs("1 Directory and F_FIRST/F_NEXT\r\n"); - cputs("2 EMM allocation and page access\r\n"); - cputs("3 WINREST full/partial screen\r\n"); - cputs("4 Keyboard event codes\r\n"); - cputs("5 EXEC child and return\r\n"); - cputs("6 DSKINFO current disk\r\n"); - cputs("A Automatic non-visual probes (1, 2, 6)\r\n"); - cputs("0 Exit\r\n\r\n"); - textattr(0x1E); - cputs("Select: "); -} - -static void report_result(int rc) -{ - if (rc == 0) { - textattr(0x2F); - cputs("\r\nRESULT: PASS\r\n"); - } else { - textattr(0x4F); - cputs("\r\nRESULT: FAIL\r\n"); - } -} - -static void run_automatic(void) -{ - int failed = 0; - - p1_heading("Automatic non-visual probes"); - cputs("[1/3] Directory\r\n"); - if (p1_test_directory() != 0) failed++; - - cputs("\r\n[2/3] EMM\r\n"); - if (p1_test_emm() != 0) failed++; - - cputs("\r\n[3/3] DSKINFO\r\n"); - if (p1_test_disk_info() != 0) failed++; - - textattr(failed ? 0x4F : 0x2F); - cprintf("\r\nAutomatic result: %u failed\r\n", (unsigned)failed); - p1_pause(); -} - -int main(void) -{ - uint16_t key; - uint8_t ch; - int rc; - - if (settextmode(TEXT_MODE_80x32) != 0) { - puts("Cannot set 80x32 text mode."); - return 1; - } - - for (;;) { - show_menu(); - key = getkey(); - ch = (uint8_t)key; - if (ch >= 'a' && ch <= 'z') ch = (uint8_t)(ch - 'a' + 'A'); - - if (ch == '0' || ch == 0x1B) break; - if (ch == 'A') { - run_automatic(); - continue; - } - - rc = -1; - switch (ch) { - case '1': rc = p1_test_directory(); break; - case '2': rc = p1_test_emm(); break; - case '3': rc = p1_test_screen(); break; - case '4': rc = p1_test_keyboard(); break; - case '5': rc = p1_test_exec(); break; - case '6': rc = p1_test_disk_info(); break; - default: continue; - } - - report_result(rc); - p1_pause(); - } - - textattr(0x0F); - clrscr(); - return 0; -} diff --git a/applications/Volkov/tests/p2_palette/Makefile b/applications/Volkov/tests/p2_palette/Makefile deleted file mode 100644 index 6883e0b..0000000 --- a/applications/Volkov/tests/p2_palette/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# P2.2 — отдельная проба системных BIOS/ESTEX-вызовов текстовой палитры. - -EXAMPLE := p2palette -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile diff --git a/applications/Volkov/tests/p2_palette/p2palette.c b/applications/Volkov/tests/p2_palette/p2palette.c deleted file mode 100644 index da63b01..0000000 --- a/applications/Volkov/tests/p2_palette/p2palette.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * p2palette — минимальная проба многоцветной текстовой темы P2.2. - * - * Использует публичные системные text_pal_get/set_color(). Для каждого - * применяемого атрибута обычный и FLASH-планы задаются попарно одинаково. - * Исходные записи сохраняются и восстанавливаются перед выходом. - */ - -#include -#include - -#define SAMPLE_COUNT 6u -#define ATTR_UI COLOR(COLOR_BLACK, COLOR_CYAN) - -typedef struct { - uint8_t attr; - uint8_t paper_r; - uint8_t paper_g; - uint8_t paper_b; - uint8_t ink_r; - uint8_t ink_g; - uint8_t ink_b; - const char *name; -} ThemeSample; - -static const ThemeSample samples[SAMPLE_COUNT] = { - { COLOR(COLOR_WHITE, COLOR_BLUE), 0x00, 0x00, 0xA8, - 0xFF, 0xFF, 0xFF, "WHITE / BLUE" }, - { COLOR(COLOR_YELLOW, COLOR_GREEN), 0x00, 0xA8, 0x00, - 0xFF, 0xFF, 0x00, "YELLOW / GREEN" }, - { COLOR(COLOR_WHITE, COLOR_RED), 0xA8, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, "WHITE / RED" }, - { COLOR(COLOR_WHITE, COLOR_MAGENTA), 0xA8, 0x00, 0xA8, - 0xFF, 0xFF, 0xFF, "WHITE / MAGENTA" }, - { COLOR(COLOR_BLACK, COLOR_LIGHTGRAY),0xC0, 0xC0, 0xC0, - 0x00, 0x00, 0x00, "BLACK / LIGHTGRAY" }, - { ATTR_UI, 0x00, 0xA8, 0xA8, - 0x00, 0x00, 0x00, "BLACK / CYAN" } -}; - -/* [sample][plane][RGB]. Static: буферы BIOS остаются в W2, не на стеке. */ -static uint8_t saved[SAMPLE_COUNT][4u][3u]; -static uint8_t readback[SAMPLE_COUNT][4u][3u]; - -static void save_palette(void) -{ - uint8_t i; - uint8_t p; - for (i = 0u; i < SAMPLE_COUNT; i++) { - for (p = 0u; p < 4u; p++) { - text_pal_get_color(p, samples[i].attr, - &saved[i][p][0], &saved[i][p][1], - &saved[i][p][2]); - } - } -} -static void set_sample(uint8_t i) -{ - const ThemeSample *s = &samples[i]; - text_pal_set_color(TEXT_PAL_PAPER, s->attr, - s->paper_r, s->paper_g, s->paper_b); - text_pal_set_color(TEXT_PAL_BLINK_PAPER, s->attr, - s->paper_r, s->paper_g, s->paper_b); - text_pal_set_color(TEXT_PAL_INK, s->attr, - s->ink_r, s->ink_g, s->ink_b); - text_pal_set_color(TEXT_PAL_BLINK_INK, s->attr, - s->ink_r, s->ink_g, s->ink_b); -} - -static uint8_t verify_palette(void) -{ - uint8_t i; - uint8_t p; - uint8_t failed = 0u; - - for (i = 0u; i < SAMPLE_COUNT; i++) { - for (p = 0u; p < 4u; p++) { - const ThemeSample *s = &samples[i]; - uint8_t want_r = (p == TEXT_PAL_PAPER || - p == TEXT_PAL_BLINK_PAPER) ? - s->paper_r : s->ink_r; - uint8_t want_g = (p == TEXT_PAL_PAPER || - p == TEXT_PAL_BLINK_PAPER) ? - s->paper_g : s->ink_g; - uint8_t want_b = (p == TEXT_PAL_PAPER || - p == TEXT_PAL_BLINK_PAPER) ? - s->paper_b : s->ink_b; - - text_pal_get_color(p, s->attr, - &readback[i][p][0], &readback[i][p][1], - &readback[i][p][2]); - if (readback[i][p][0] != want_r || - readback[i][p][1] != want_g || - readback[i][p][2] != want_b) failed++; - } - } - return failed; -} - -static void restore_palette(void) -{ - uint8_t i; - uint8_t p; - for (i = 0u; i < SAMPLE_COUNT; i++) { - for (p = 0u; p < 4u; p++) { - text_pal_set_color(p, samples[i].attr, - saved[i][p][0], saved[i][p][1], - saved[i][p][2]); - } - } -} - -static void fill_row(uint8_t y, uint8_t attr, const char *name) -{ - uint8_t x; - for (x = 0u; x < 80u; x++) wrchar(x, y, ' ', attr); - for (x = 0u; name[x] && x < 30u; x++) { - wrchar((uint8_t)(4u + x), y, name[x], attr); - } - for (x = 42u; x < 76u; x++) { - wrchar(x, y, (x & 1u) ? '#' : '@', attr); - } -} - -static void draw_screen(uint8_t failed) -{ - uint8_t i; - - clrscr_attr(ATTR_UI); - textattr(ATTR_UI); - gotoxy(1u, 0u); - cputs("P2.2 SYSTEM TEXT PALETTE PROBE - BIOS CALLS ARE ALLOWED"); - gotoxy(1u, 2u); - cprintf("Readback of 6 attrs x 4 planes: %s (%u mismatches)", - failed ? "FAIL" : "PASS", (unsigned)failed); - gotoxy(1u, 3u); - cputs("Each PAPER pair and INK pair is identical; scene must not flash."); - - for (i = 0u; i < SAMPLE_COUNT; i++) { - fill_row((uint8_t)(6u + i * 3u), samples[i].attr, samples[i].name); - fill_row((uint8_t)(7u + i * 3u), samples[i].attr, - "same attribute, second row"); - } - - gotoxy(1u, 26u); - cputs("If any coloured band disappears, compare MAME phase with readback."); - gotoxy(1u, 28u); - cputs("Press a key to restore every saved palette entry and exit."); -} - -int main(void) -{ - uint8_t previous_mode = gettextmode(); - uint8_t i; - uint8_t failed; - - if (settextmode(TEXT_MODE_80x32) != 0) return 1; - save_palette(); - for (i = 0u; i < SAMPLE_COUNT; i++) set_sample(i); - failed = verify_palette(); - draw_screen(failed); - (void)getkey(); - restore_palette(); - textattr(COLOR(COLOR_WHITE, COLOR_BLACK)); - clrscr(); - if (previous_mode == TEXT_MODE_40x32 || - previous_mode == TEXT_MODE_80x32) { - (void)settextmode(previous_mode); - } - return failed ? 2 : 0; -} diff --git a/applications/Volkov/tests/p2_screen/Makefile b/applications/Volkov/tests/p2_screen/Makefile deleted file mode 100644 index 9602872..0000000 --- a/applications/Volkov/tests/p2_screen/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# P2.1 — координатный экранный backend Sprinter Commander. -# -# Тест использует системные ESTEX-функции WINREST/RDCHAR/SCROLL, не -# открывает BIOS-окна и не обращается к текстовой VRAM напрямую. - -EXAMPLE := p2screen -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -EXTRA_SRCS := p2_platform.c - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile p2_screen.h sc_glyphs.h diff --git a/applications/Volkov/tests/p2_screen/p2_platform.c b/applications/Volkov/tests/p2_screen/p2_platform.c deleted file mode 100644 index 849e2d3..0000000 --- a/applications/Volkov/tests/p2_screen/p2_platform.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * p2_platform.c — пакетный координатный вывод screen model через ESTEX. - * - * WINREST 5Ah не принимает идентификатор BIOS-окна: D/E/H/L задают - * абсолютный прямоугольник активной текстовой страницы, B:IX — источник. - * ABI SDCC __sdcccall(1) подтверждён P1-пробой. - */ - -#include -#include "p2_screen.h" - -void p2_winrest(uint8_t row, uint8_t col, uint8_t height, uint8_t width, - uint8_t page, uint16_t offset) __naked -{ - (void)row; - (void)col; - (void)height; - (void)width; - (void)page; - (void)offset; - __asm - ld iy, #2 - add iy, sp - ld d, a - ld e, l - - push ix - ld l, 3 (iy) - ld h, 4 (iy) - ld bc, #0xC000 - add hl, bc - push hl - pop ix - - ld h, 0 (iy) - ld a, 1 (iy) - ld l, a - ld a, 2 (iy) - ld b, a - ld c, #0x5A - di - rst #0x10 - ei - pop ix - - pop hl - inc sp - inc sp - inc sp - inc sp - inc sp - jp (hl) - __endasm; -} diff --git a/applications/Volkov/tests/p2_screen/p2_screen.h b/applications/Volkov/tests/p2_screen/p2_screen.h deleted file mode 100644 index 85379d6..0000000 --- a/applications/Volkov/tests/p2_screen/p2_screen.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * p2_screen.h — общий контракт координатной экранной пробы P2.1. - */ - -#ifndef P2_SCREEN_API_H -#define P2_SCREEN_API_H - -#include - -#define P2_SCREEN_W 80u -#define P2_SCREEN_H 32u -#define P2_ROW_BYTES 160u -#define P2_MODEL_BYTES 5120u -#define P2_MARKER_OFF 0x2000u - -typedef struct { - uint8_t ch; - uint8_t attr; -} P2Cell; - -typedef char P2Cell_must_be_2_bytes[(sizeof(P2Cell) == 2) ? 1 : -1]; - -void p2_winrest(uint8_t row, uint8_t col, uint8_t height, uint8_t width, - uint8_t page, uint16_t offset); - -#endif diff --git a/applications/Volkov/tests/p2_screen/p2screen.c b/applications/Volkov/tests/p2_screen/p2screen.c deleted file mode 100644 index f2c47c8..0000000 --- a/applications/Volkov/tests/p2_screen/p2screen.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * p2screen — проверка системного координатного backend Commander P2.1. - * - * Экранная модель лежит в одной EMM-странице как 80x32 пар (char, attr). - * Вывод: WINREST; проверка: RDCHAR; сдвиг: прямоугольный SCROLL 55h. - * BIOS window descriptors и прямой доступ к VRAM не используются. - */ - -#include -#include -#include -#include -#include -#include "p2_screen.h" -#include "sc_glyphs.h" - -#define LEFT_X 1u -#define RIGHT_X 41u -#define PANEL_Y 1u -#define PANEL_W 38u -#define PANEL_H 27u - -#define ATTR_UI COLOR(COLOR_BLACK, COLOR_CYAN) -#define ATTR_FRAME ATTR_UI -#define ATTR_TITLE ATTR_UI -#define ATTR_TEXT ATTR_UI -#define ATTR_DIM ATTR_UI -#define ATTR_ACTIVE ATTR_UI -#define ATTR_MARK1 ATTR_UI -#define ATTR_MARK2 ATTR_UI -#define ATTR_PASS ATTR_UI -#define ATTR_FAIL ATTR_UI -#define ATTR_KEYS ATTR_UI - -static P2Cell row_buf[P2_SCREEN_W]; -static P2Cell marker_buf[40u]; -static uint8_t fail_x; -static uint8_t fail_y; -static uint16_t fail_want; -static uint16_t fail_got; -static uint8_t w3_bad; - -static uint16_t cell_offset(uint8_t x, uint8_t y) -{ - return (uint16_t)y * P2_ROW_BYTES + (uint16_t)x * 2u; -} - -static void row_fill(uint8_t ch, uint8_t attr) -{ - uint8_t x; - for (x = 0; x < P2_SCREEN_W; x++) { - row_buf[x].ch = ch; - row_buf[x].attr = attr; - } -} - -static void cells_fill(P2Cell *cells, uint8_t count, - uint8_t ch, uint8_t attr) -{ - uint8_t i; - for (i = 0; i < count; i++) { - cells[i].ch = ch; - cells[i].attr = attr; - } -} - -static void cells_text(P2Cell *cells, uint8_t width, uint8_t x, - const char *text, uint8_t attr) -{ - while (*text && x < width) { - cells[x].ch = (uint8_t)*text++; - cells[x].attr = attr; - x++; - } -} - -static void cells_bytes(P2Cell *cells, uint8_t width, uint8_t x, - const uint8_t *bytes, uint8_t count, uint8_t attr) -{ - while (count-- && x < width) { - cells[x].ch = *bytes++; - cells[x].attr = attr; - x++; - } -} - -static void cells_dec2(P2Cell *cells, uint8_t width, uint8_t x, - uint8_t value, uint8_t attr) -{ - if (x + 1u >= width) return; - cells[x].ch = (uint8_t)('0' + (value / 10u) % 10u); - cells[x].attr = attr; - cells[x + 1u].ch = (uint8_t)('0' + value % 10u); - cells[x + 1u].attr = attr; -} - -static void cells_dec4(P2Cell *cells, uint8_t width, uint8_t x, - uint16_t value, uint8_t attr) -{ - uint16_t div = 1000u; - uint8_t i; - for (i = 0; i < 4u && x + i < width; i++) { - cells[x + i].ch = (uint8_t)('0' + (value / div) % 10u); - cells[x + i].attr = attr; - div /= 10u; - } -} - -static void row_panel_frame(uint8_t left, uint8_t y) -{ - uint8_t x; - uint8_t right = (uint8_t)(left + 39u); - - if (y == 0u || y == 28u) { - row_buf[left].ch = (y == 0u) ? SC_G_TL : SC_G_BL; - row_buf[right].ch = (y == 0u) ? SC_G_TR : SC_G_BR; - row_buf[left].attr = ATTR_FRAME; - row_buf[right].attr = ATTR_FRAME; - for (x = (uint8_t)(left + 1u); x < right; x++) { - row_buf[x].ch = SC_G_H; - row_buf[x].attr = ATTR_FRAME; - } - } else { - row_buf[left].ch = SC_G_V; - row_buf[right].ch = SC_G_V; - row_buf[left].attr = ATTR_FRAME; - row_buf[right].attr = ATTR_FRAME; - } -} - -static void build_model(uint8_t page) -{ - static const uint8_t boxes[] = { - SC_G_H, SC_G_V, SC_G_TL, SC_G_TR, SC_G_BL, SC_G_BR, - SC_G_TM, SC_G_BM, SC_G_ML, SC_G_MR, SC_G_X - }; - static const uint8_t arrows[] = { - SC_G_ARROW_UP, SC_G_ARROW_DOWN, SC_G_ARROW_LEFT, SC_G_ARROW_RIGHT - }; - static const uint8_t blocks[] = { - SC_G_SHADE_LIGHT, SC_G_SHADE_MEDIUM, SC_G_SHADE_DARK, - SC_G_BLOCK, SC_G_HALF_UP, SC_G_HALF_DOWN, - SC_G_HALF_LEFT, SC_G_HALF_RIGHT, SC_G_BULLET, - SC_G_CHECK, SC_G_SQUARE - }; - uint8_t y; - - for (y = 0; y < P2_SCREEN_H; y++) { - row_fill(' ', (y < 29u) ? ATTR_TEXT : ATTR_KEYS); - - if (y <= 28u) { - row_panel_frame(0u, y); - row_panel_frame(40u, y); - } - - if (y == 0u) { - cells_text(row_buf, P2_SCREEN_W, 11u, - " LEFT PANEL ", ATTR_TITLE); - cells_text(row_buf, P2_SCREEN_W, 50u, - " RIGHT PANEL ", ATTR_TITLE); - } else if (y >= 1u && y <= 27u) { - cells_text(row_buf, P2_SCREEN_W, 2u, "L ROW", ATTR_TEXT); - cells_dec2(row_buf, P2_SCREEN_W, 8u, y, ATTR_ACTIVE); - cells_text(row_buf, P2_SCREEN_W, 42u, "R ROW", ATTR_DIM); - cells_dec2(row_buf, P2_SCREEN_W, 48u, y, ATTR_DIM); - } - - if (y == 20u) { - cells_text(row_buf, P2_SCREEN_W, 2u, "BOX", ATTR_TITLE); - cells_bytes(row_buf, P2_SCREEN_W, 6u, boxes, - (uint8_t)sizeof(boxes), ATTR_FRAME); - } else if (y == 21u) { - cells_text(row_buf, P2_SCREEN_W, 2u, "ARROWS", ATTR_TITLE); - cells_bytes(row_buf, P2_SCREEN_W, 10u, arrows, - (uint8_t)sizeof(arrows), ATTR_FRAME); - } else if (y == 22u) { - cells_text(row_buf, P2_SCREEN_W, 2u, "BLOCKS", ATTR_TITLE); - cells_bytes(row_buf, P2_SCREEN_W, 10u, blocks, - (uint8_t)sizeof(blocks), ATTR_FRAME); - } else if (y == 28u) { - cells_text(row_buf, P2_SCREEN_W, 13u, " 27 rows ", ATTR_TITLE); - cells_text(row_buf, P2_SCREEN_W, 53u, " 27 rows ", ATTR_TITLE); - } else if (y == 29u) { - cells_text(row_buf, P2_SCREEN_W, 1u, - "P2.1 SYSTEM COORDINATE BACKEND - NO BIOS WINDOWS, NO VRAM ACCESS", - ATTR_KEYS); - } else if (y == 30u) { - cells_text(row_buf, P2_SCREEN_W, 1u, - "STAGE 1: FULL WINREST + RDCHAR VERIFY", - ATTR_KEYS); - } else if (y == 31u) { - cells_text(row_buf, P2_SCREEN_W, 1u, - "SYSTEM ATTR 0x30: NO PALETTE WRITES KEY: next stage", - ATTR_KEYS); - } - - bank_write(page, (uint16_t)y * P2_ROW_BYTES, - row_buf, P2_ROW_BYTES); - } -} - -static void build_marker(uint8_t page) -{ - cells_fill(marker_buf, 20u, ' ', ATTR_MARK1); - cells_fill(marker_buf + 20u, 20u, ' ', ATTR_MARK2); - cells_text(marker_buf, 20u, 0u, "PARTIAL RECT PASS", ATTR_MARK1); - cells_text(marker_buf + 20u, 20u, 0u, "OFFSET 0x2000 OK", ATTR_MARK2); - bank_write(page, P2_MARKER_OFF, marker_buf, sizeof(marker_buf)); -} - -static void model_apply_marker(uint8_t page, uint8_t x, uint8_t y) -{ - uint8_t saved = _io_page_w3; - P2Cell *model; - - sprinter_page_w3(page); - model = (P2Cell *)0xC000u; - memcpy(model + (uint16_t)y * P2_SCREEN_W + x, - marker_buf, 20u * sizeof(P2Cell)); - memcpy(model + (uint16_t)(y + 1u) * P2_SCREEN_W + x, - marker_buf + 20u, 20u * sizeof(P2Cell)); - sprinter_page_w3(saved); -} - -static void model_status(uint8_t page, const char *text, uint8_t ok) -{ - bank_read(page, 30u * P2_ROW_BYTES, row_buf, P2_ROW_BYTES); - cells_fill(row_buf, P2_SCREEN_W, ' ', ATTR_KEYS); - cells_text(row_buf, P2_SCREEN_W, 1u, text, ATTR_KEYS); - cells_text(row_buf, P2_SCREEN_W, 62u, - ok ? "PASS" : "FAIL", ok ? ATTR_PASS : ATTR_FAIL); - if (!ok) { - cells_text(row_buf, P2_SCREEN_W, 68u, "AT", ATTR_FAIL); - cells_dec2(row_buf, P2_SCREEN_W, 71u, fail_x, ATTR_FAIL); - row_buf[73u].ch = ','; - row_buf[73u].attr = ATTR_FAIL; - cells_dec2(row_buf, P2_SCREEN_W, 74u, fail_y, ATTR_FAIL); - } - bank_write(page, 30u * P2_ROW_BYTES, row_buf, P2_ROW_BYTES); -} - -static void present_rect(uint8_t page, uint8_t x, uint8_t y, - uint8_t width, uint8_t height, uint16_t offset) -{ - uint8_t saved = _io_page_w3; - p2_winrest(y, x, height, width, page, offset); - if (_io_page_w3 != saved) w3_bad = 1u; -} - -static void present_model_row(uint8_t page, uint8_t x, - uint8_t y, uint8_t width) -{ - present_rect(page, x, y, width, 1u, cell_offset(x, y)); -} - -static uint8_t verify_model(uint8_t page) -{ - uint8_t saved = _io_page_w3; - uint8_t x; - uint8_t y; - - for (y = 0; y < P2_SCREEN_H; y++) { - bank_read(page, (uint16_t)y * P2_ROW_BYTES, - row_buf, P2_ROW_BYTES); - for (x = 0; x < P2_SCREEN_W; x++) { - uint16_t got = rdchar(x, y); - uint16_t want = ((uint16_t)row_buf[x].attr << 8) | - row_buf[x].ch; - if (got != want) { - fail_x = x; - fail_y = y; - fail_want = want; - fail_got = got; - return 0u; - } - } - } - - if (_io_page_w3 != saved) w3_bad = 1u; - return w3_bad ? 0u : 1u; -} - -static uint8_t report_verify(uint8_t page, const char *stage) -{ - uint8_t ok = verify_model(page); - model_status(page, stage, ok); - present_model_row(page, 0u, 30u, P2_SCREEN_W); - return ok; -} - -static void mapped_new_row(P2Cell *line, uint8_t width, - uint8_t direction, uint16_t sequence) -{ - cells_fill(line, width, ' ', ATTR_ACTIVE); - cells_text(line, width, 1u, - (direction == 1u) ? "NEW BOTTOM ROW" : "NEW TOP ROW", - ATTR_ACTIVE); - cells_dec4(line, width, 17u, sequence, ATTR_ACTIVE); -} - -static void model_scroll(uint8_t page, uint8_t x, uint8_t y, - uint8_t width, uint8_t height, - uint8_t direction, uint16_t sequence) -{ - uint8_t saved = _io_page_w3; - P2Cell *model; - uint8_t i; - - sprinter_page_w3(page); - model = (P2Cell *)0xC000u; - - if (direction == 1u) { - for (i = 0; i + 1u < height; i++) { - memmove(model + (uint16_t)(y + i) * P2_SCREEN_W + x, - model + (uint16_t)(y + i + 1u) * P2_SCREEN_W + x, - (uint16_t)width * sizeof(P2Cell)); - } - mapped_new_row(model + (uint16_t)(y + height - 1u) * P2_SCREEN_W + x, - width, direction, sequence); - } else { - i = (uint8_t)(height - 1u); - while (i != 0u) { - memmove(model + (uint16_t)(y + i) * P2_SCREEN_W + x, - model + (uint16_t)(y + i - 1u) * P2_SCREEN_W + x, - (uint16_t)width * sizeof(P2Cell)); - i--; - } - mapped_new_row(model + (uint16_t)y * P2_SCREEN_W + x, - width, direction, sequence); - } - - sprinter_page_w3(saved); -} - -static void system_scroll(uint8_t page, uint8_t x, uint8_t y, - uint8_t width, uint8_t height, - uint8_t direction, uint16_t sequence) -{ - uint8_t saved; - uint8_t open_y; - - model_scroll(page, x, y, width, height, direction, sequence); - saved = _io_page_w3; - scroll(x, y, width, height, direction, 0u); - if (_io_page_w3 != saved) w3_bad = 1u; - - open_y = (direction == 1u) ? (uint8_t)(y + height - 1u) : y; - present_model_row(page, x, open_y, width); -} - -static uint8_t wait_stage(void) -{ - uint16_t key = getkey(); - return ((uint8_t)key == 0x1Bu) ? 0u : 1u; -} - -int main(void) -{ - uint8_t previous_mode = gettextmode(); - uint8_t block; - uint8_t page; - uint8_t ok = 1u; - uint16_t i; - - (void)fail_want; - (void)fail_got; - - if (settextmode(TEXT_MODE_80x32) != 0) return 1; - - block = mem_alloc_pages(1u); - if (block == 0u) { - if (previous_mode == TEXT_MODE_40x32 || - previous_mode == TEXT_MODE_80x32) { - (void)settextmode(previous_mode); - } - return 2; - } - page = mem_get_page(block, 0u); - if (page == 0u) { - mem_free_block(block); - if (previous_mode == TEXT_MODE_40x32 || - previous_mode == TEXT_MODE_80x32) { - (void)settextmode(previous_mode); - } - return 3; - } - build_model(page); - build_marker(page); - - present_rect(page, 0u, 0u, P2_SCREEN_W, P2_SCREEN_H, 0u); - if (!report_verify(page, "STAGE 1: FULL WINREST + RDCHAR")) ok = 0u; - if (!wait_stage()) goto done; - - present_rect(page, 30u, 14u, 20u, 2u, P2_MARKER_OFF); - model_apply_marker(page, 30u, 14u); - if (!report_verify(page, "STAGE 2: PARTIAL OFFSET 0x2000")) ok = 0u; - if (!wait_stage()) goto done; - - build_model(page); - present_rect(page, 0u, 0u, P2_SCREEN_W, P2_SCREEN_H, 0u); - system_scroll(page, LEFT_X, PANEL_Y, PANEL_W, PANEL_H, 1u, 1u); - if (!report_verify(page, "STAGE 3: LEFT RECT SCROLL UP")) ok = 0u; - if (!wait_stage()) goto done; - - system_scroll(page, RIGHT_X, PANEL_Y, PANEL_W, PANEL_H, 2u, 2u); - if (!report_verify(page, "STAGE 4: RIGHT RECT SCROLL DOWN")) ok = 0u; - if (!wait_stage()) goto done; - - model_status(page, "STAGE 5: 1000 RECT SCROLL OPERATIONS", 1u); - present_model_row(page, 0u, 30u, P2_SCREEN_W); - for (i = 0u; i < 1000u; i++) { - uint8_t direction = (i & 1u) ? 2u : 1u; - system_scroll(page, LEFT_X, PANEL_Y, PANEL_W, PANEL_H, - direction, (uint16_t)(i + 1u)); - } - if (!report_verify(page, "FINAL: MODEL/RDCHAR/W3 AFTER 1000")) ok = 0u; - if (!ok) { - model_status(page, "FINAL P2.1 RESULT", 0u); - present_model_row(page, 0u, 30u, P2_SCREEN_W); - } - (void)wait_stage(); - -done: - mem_free_block(block); - textattr(COLOR(COLOR_WHITE, COLOR_BLACK)); - clrscr(); - if (previous_mode == TEXT_MODE_40x32 || - previous_mode == TEXT_MODE_80x32) { - (void)settextmode(previous_mode); - } - return ok ? 0 : 1; -} diff --git a/applications/Volkov/tests/p2_screen/sc_glyphs.h b/applications/Volkov/tests/p2_screen/sc_glyphs.h deleted file mode 100644 index 0d293ea..0000000 --- a/applications/Volkov/tests/p2_screen/sc_glyphs.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * sc_glyphs.h — raw-коды CP866/CP437 для интерфейса Commander. - * - * Байты ниже являются экранными глифами, включая управляющий диапазон - * 0x18..0x1B. Их следует класть в ScCell или передавать WRCHAR/WINREST, - * но не печатать функцией, интерпретирующей CR/LF/BS/TAB. - */ - -#ifndef SC_GLYPHS_H -#define SC_GLYPHS_H - -#define SC_G_H 0xC4u -#define SC_G_V 0xB3u -#define SC_G_TL 0xDAu -#define SC_G_TR 0xBFu -#define SC_G_BL 0xC0u -#define SC_G_BR 0xD9u -#define SC_G_TM 0xC2u -#define SC_G_BM 0xC1u -#define SC_G_ML 0xC3u -#define SC_G_MR 0xB4u -#define SC_G_X 0xC5u - -#define SC_G_ARROW_UP 0x18u -#define SC_G_ARROW_DOWN 0x19u -#define SC_G_ARROW_RIGHT 0x1Au -#define SC_G_ARROW_LEFT 0x1Bu - -#define SC_G_SHADE_LIGHT 0xB0u -#define SC_G_SHADE_MEDIUM 0xB1u -#define SC_G_SHADE_DARK 0xB2u -#define SC_G_BLOCK 0xDBu -#define SC_G_HALF_UP 0xDFu -#define SC_G_HALF_DOWN 0xDCu -#define SC_G_HALF_LEFT 0xDDu -#define SC_G_HALF_RIGHT 0xDEu -#define SC_G_BULLET 0xF9u -#define SC_G_CHECK 0xFBu -#define SC_G_SQUARE 0xFEu - -#endif diff --git a/applications/Volkov/tests/p3_data/INNER.TXT b/applications/Volkov/tests/p3_data/INNER.TXT deleted file mode 100644 index b897cf7..0000000 --- a/applications/Volkov/tests/p3_data/INNER.TXT +++ /dev/null @@ -1 +0,0 @@ -File inside TESTDIR used to verify independent panel paths and synthetic parent. diff --git a/applications/Volkov/tests/p3_data/P3ROOT.TXT b/applications/Volkov/tests/p3_data/P3ROOT.TXT deleted file mode 100644 index 98d0bb5..0000000 --- a/applications/Volkov/tests/p3_data/P3ROOT.TXT +++ /dev/null @@ -1 +0,0 @@ -Sprinter Commander P3 root fixture. diff --git a/applications/Volkov/tests/p3_data/README.md b/applications/Volkov/tests/p3_data/README.md deleted file mode 100644 index 9a5776c..0000000 --- a/applications/Volkov/tests/p3_data/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Данные MAME-сценария P3 - -После `make floppy` сценарий создаёт на тестовой FAT12-дискете каталог -`TESTDIR`, кладёт в него `INNER.TXT`, а в корень — `P3ROOT.TXT` и `ZETA.BIN`. - -Ожидаемая сортировка корня: каталог `TESTDIR`, затем файлы по имени. Внутри -`TESTDIR` Commander сам добавляет синтетическую запись `..` перед -`INNER.TXT`; DSS-записи `.`/`..` в EMM не копируются. - -Fixture также является регрессией wildcard: первый P3-прогон с `ffirst("*")` -увидел только `TESTDIR`. Принятый источник обязан использовать `*.*`, иначе -DSS не возвращает имена с расширением. diff --git a/applications/Volkov/tests/p3_data/ZETA.BIN b/applications/Volkov/tests/p3_data/ZETA.BIN deleted file mode 100644 index 94ea3ed..0000000 --- a/applications/Volkov/tests/p3_data/ZETA.BIN +++ /dev/null @@ -1 +0,0 @@ -Second root file used to verify directory-first and alphabetical sorting. diff --git a/applications/Volkov/tests/p3_dir_probe/Makefile b/applications/Volkov/tests/p3_dir_probe/Makefile deleted file mode 100644 index 12f2dfd..0000000 --- a/applications/Volkov/tests/p3_dir_probe/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Диагностическая проба предельного каталога P3. - -EXAMPLE := p3dir -MEMORY := small -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile diff --git a/applications/Volkov/tests/p3_dir_probe/p3dir.c b/applications/Volkov/tests/p3_dir_probe/p3dir.c deleted file mode 100644 index 1a0898f..0000000 --- a/applications/Volkov/tests/p3_dir_probe/p3dir.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * p3dir.c — изолированная диагностика большого FAT-каталога DSS. - * - * Проба ничего не изменяет: входит в BIGDIR, полностью исчерпывает - * F_FIRST/F_NEXT, печатает фактический предел и проверяет возврат в корень. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) - -static ffblk_t find_buf; -static char cwd[256]; -static char last_name[13]; -static char name_511[13]; -static char name_512[13]; -static char name_513[13]; -static uint16_t enum_count; -static int enum_errno; - -static void save_name(char *dst) -{ - strncpy(dst, find_buf.found_name, 12u); - dst[12] = '\0'; -} - -int main(void) -{ - int rc; - - (void)settextmode(TEXT_MODE_80x32); - clrscr_attr(0x17); - gotoxy(0, 0); - textattr(0x1Fu); - cputs("P3 BIGDIR diagnostic\r\n\r\n"); - textattr(0x17u); - - errno = 0; - rc = chdir("\\BIGDIR"); - printf("1 chdir BIGDIR: rc=%d errno=%d\n", rc, errno); - if (rc != 0) goto done; - - errno = 0; - if (getcwd(cwd, (uint16_t)sizeof(cwd))) - printf("2 cwd: %s\n", cwd); - else - printf("2 getcwd failed: errno=%d\n", errno); - - errno = 0; - rc = ffirst("*.*", &find_buf, FIND_ATTRS); - printf("3 ffirst: rc=%d errno=%d\n", rc, errno); - enum_count = 0u; - if (rc == 0) { - for (;;) { - enum_count++; - save_name(last_name); - if (enum_count == 511u) save_name(name_511); - if (enum_count == 512u) save_name(name_512); - if (enum_count == 513u) save_name(name_513); - errno = 0; - if (fnext(&find_buf) != 0) break; - if (enum_count == 2000u) { - puts("Loop guard reached."); - break; - } - } - } - enum_errno = errno; - printf("4 enum: count=%u errno=%d last=%s\n", - (unsigned)enum_count, enum_errno, last_name); - printf("5 boundary: 511=%s 512=%s 513=%s\n", - name_511, name_512, name_513); - - errno = 0; - rc = chdir("\\"); - printf("6 chdir root: rc=%d errno=%d\n", rc, errno); - errno = 0; - if (getcwd(cwd, (uint16_t)sizeof(cwd))) - printf("7 cwd: %s\n", cwd); - else - printf("7 getcwd failed: errno=%d\n", errno); - -done: - textattr(0x1Eu); - cputs("\r\nProbe stopped; MAME test will take a snapshot."); - for (;;) (void)getkey(); -} diff --git a/applications/Volkov/tests/p3_enum_matrix/Makefile b/applications/Volkov/tests/p3_enum_matrix/Makefile deleted file mode 100644 index 6302b04..0000000 --- a/applications/Volkov/tests/p3_enum_matrix/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Матрица влияния W3/EMM на длинный F_FIRST/F_NEXT. - -EXAMPLE := p3map -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) --bank 1=bank1_enum.c - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile bank1_enum.c diff --git a/applications/Volkov/tests/p3_enum_matrix/bank1_enum.c b/applications/Volkov/tests/p3_enum_matrix/bank1_enum.c deleted file mode 100644 index df14333..0000000 --- a/applications/Volkov/tests/p3_enum_matrix/bank1_enum.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * bank1_enum.c — отделяет влияние адреса ffblk от переключений W3. - * - * Весь перебор исполняется при подключённом BANK1, а диагностический DTA - * занимает последние 256 байт W1. Это историческая матрица, доказавшая, - * что ни адрес DTA, ни чтение/запись W3 не снимают предел DSS. mode=0 не - * трогает W3, mode=1 читает байт EMM, mode=2 пишет 24 байта EMM. - */ - -#include -#include -#include -#include - -#define FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH) - -__at (0x7F00) static ffblk_t find_buf; - -/* Копии wrapper находятся в том же W1, что и цикл. Так проверяется не - * только адрес ffblk, но и адрес самой инструкции RST/возврата из DSS. */ -static int p3_ffirst_local(const char *pattern, ffblk_t *buf, - uint8_t attrib) __naked -{ - (void)pattern; (void)buf; (void)attrib; - __asm - ld iy, #2 - add iy, sp - ld a, 0 (iy) - push ix - ld bc, #0x0119 - rst #0x10 - pop ix - pop hl - inc sp - jr c, p3_ffirst_fail$ - ld de, #0 - jp (hl) - p3_ffirst_fail$: - call __errno_set - ld de, #-1 - jp (hl) - __endasm; -} - -static int p3_fnext_local(ffblk_t *buf) __naked -{ - (void)buf; - __asm - push ix - ex de, hl - ld c, #0x1A - rst #0x10 - pop ix - jr c, p3_fnext_fail$ - ld de, #0 - ret - p3_fnext_fail$: - call __errno_set - ld de, #-1 - ret - __endasm; -} - -uint16_t p3_enum_mode(uint8_t mode, uint8_t page, int *end_errno) __banked -{ - uint16_t count = 0u; - uint8_t payload[24]; - uint16_t offset; - - errno = 0; - if ((mode >= 3u ? - p3_ffirst_local("*.*", &find_buf, FIND_ATTRS) : - ffirst("*.*", &find_buf, FIND_ATTRS)) == 0) { - for (;;) { - count++; - if (mode == 1u) { - payload[0] = bank_load_byte(page, 0u); - } else if (mode == 2u || mode == 4u) { - offset = (uint16_t)(((count - 1u) % 640u) * 24u); - bank_write(page, offset, payload, 24u); - } - errno = 0; - if ((mode >= 3u ? p3_fnext_local(&find_buf) : - fnext(&find_buf)) != 0) break; - if (count == 2000u) break; - } - } - *end_errno = errno; - return count; -} diff --git a/applications/Volkov/tests/p3_enum_matrix/p3map.c b/applications/Volkov/tests/p3_enum_matrix/p3map.c deleted file mode 100644 index dd18eb7..0000000 --- a/applications/Volkov/tests/p3_enum_matrix/p3map.c +++ /dev/null @@ -1,56 +0,0 @@ -/* p3map.c — экранный отчёт матрицы длинного перебора каталога. */ - -#include -#include -#include -#include -#include -#include - -uint16_t p3_enum_mode(uint8_t mode, uint8_t page, int *end_errno) __banked; - -int main(void) -{ - uint8_t block; - uint8_t page; - uint8_t mode; - uint16_t count; - int end_errno; - - (void)settextmode(TEXT_MODE_80x32); - clrscr_attr(0x17u); - gotoxy(0u, 0u); - textattr(0x1Fu); - cputs("P3 F_NEXT / W3 matrix\r\n\r\n"); - textattr(0x17u); - - block = mem_alloc_pages(1u); - page = block ? mem_get_page(block, 0u) : 0u; - printf("EMM: block=%u page=%02X errno=%d\n", - (unsigned)block, (unsigned)page, errno); - if (!block || !page) goto done; - - for (mode = 0u; mode != 5u; mode++) { - errno = 0; - if (chdir("\\BIGDIR") != 0) { - printf("mode %u: chdir error=%d\n", (unsigned)mode, errno); - break; - } - count = p3_enum_mode(mode, page, &end_errno); - printf("mode %u: count=%u end_errno=%d\n", - (unsigned)mode, (unsigned)count, end_errno); - errno = 0; - if (chdir("\\") != 0) { - printf("root after mode %u: error=%d\n", - (unsigned)mode, errno); - break; - } - } - - mem_free_block(block); - -done: - textattr(0x1Eu); - cputs("\r\nProbe stopped; MAME test will take a snapshot."); - for (;;) (void)getkey(); -} diff --git a/applications/Volkov/tests/p3_scan_probe/Makefile b/applications/Volkov/tests/p3_scan_probe/Makefile deleted file mode 100644 index 2c52f01..0000000 --- a/applications/Volkov/tests/p3_scan_probe/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Полный scan/store/sort большого каталога теми же модулями, что Commander. - -EXAMPLE := p3scan -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -I ../../include \ - --bank 1=../../src/sc_source_fs.c \ - --bank 1=../../src/sc_sort.c -EXTRA_SRCS := ../../src/sc_panel.c ../../src/sc_store.c - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile ../../src/sc_source_fs.c ../../src/sc_sort.c diff --git a/applications/Volkov/tests/p3_scan_probe/p3scan.c b/applications/Volkov/tests/p3_scan_probe/p3scan.c deleted file mode 100644 index 64b579e..0000000 --- a/applications/Volkov/tests/p3_scan_probe/p3scan.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * p3scan.c — диагностика полного пути scan/store/sort большого каталога. - * - * Использует те же банковые модули P3, но не делает panel change/rollback, - * поэтому сохраняет точные rc, errno и состояние панели в точке отказа. - */ - -#include -#include -#include -#include -#include -#include -#include "sc_panel.h" -#include "sc_source.h" -#include "sc_store.h" - -static ScPanel panel; -static ScDirEntry entry; - -int main(void) -{ - uint8_t block; - uint8_t page; - int rc; - int saved_errno; - - (void)settextmode(TEXT_MODE_80x32); - clrscr_attr(0x17); - gotoxy(0, 0); - textattr(0x1Fu); - cputs("P3 scan/store/sort diagnostic\r\n\r\n"); - textattr(0x17u); - - block = mem_alloc_pages(1u); - page = block ? mem_get_page(block, 0u) : 0u; - printf("EMM: block=%u page=%02X errno=%d\n", - (unsigned)block, (unsigned)page, errno); - if (!block || !page) goto done; - - memset(&panel, 0, sizeof(panel)); - strcpy(panel.path, "\\BIGDIR"); - panel.phys_page = page; - - puts("Calling sc_source_fs_scan..."); - errno = 0; - rc = sc_source_fs_scan(&panel); - saved_errno = errno; - printf("scan: rc=%d errno=%d count=%u trunc=%u\n", - rc, saved_errno, (unsigned)panel.count, - (unsigned)panel.truncated); - printf("view: cursor=%u top=%u total=%lu\n", - (unsigned)panel.cursor, (unsigned)panel.top, - (unsigned long)panel.total_size); - - if (panel.count != 0u && sc_store_get(&panel, 0u, &entry) == 0) - printf("first: %s attr=%02X flags=%02X\n", entry.name, - (unsigned)entry.attr, (unsigned)entry.flags); - if (panel.count != 0u && - sc_store_get(&panel, (uint16_t)(panel.count - 1u), &entry) == 0) - printf("last : %s attr=%02X flags=%02X\n", entry.name, - (unsigned)entry.attr, (unsigned)entry.flags); - - mem_free_block(block); - -done: - textattr(0x1Eu); - cputs("\r\nProbe stopped; MAME test will take snapshots."); - for (;;) (void)getkey(); -} diff --git a/applications/Volkov/tests/p3_store_probe/Makefile b/applications/Volkov/tests/p3_store_probe/Makefile deleted file mode 100644 index 830850a..0000000 --- a/applications/Volkov/tests/p3_store_probe/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# Синтетическая проверка границы одной EMM-страницы панели: 640/641. - -EXAMPLE := p3store -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) -I ../../include -EXTRA_SRCS := ../../src/sc_store.c - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile ../../src/sc_store.c ../../include/sc_entry.h \ - ../../include/sc_panel.h ../../include/sc_store.h diff --git a/applications/Volkov/tests/p3_store_probe/p3store.c b/applications/Volkov/tests/p3_store_probe/p3store.c deleted file mode 100644 index 906b526..0000000 --- a/applications/Volkov/tests/p3_store_probe/p3store.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * p3store.c — синтетическая проверка предела EMM-store панели. - * - * DSS не участвует: проба обязана дойти до продуктовой границы 640/641, - * которая недостижима через каталог стабильного DSS 1.71 с пределом 512. - */ - -#include -#include -#include -#include -#include -#include "sc_panel.h" -#include "sc_store.h" - -#define STORE_BYTES ((uint16_t)(SC_DIR_CAPACITY * sizeof(ScDirEntry))) - -static ScPanel panel; -static ScDirEntry entry; -static ScDirEntry check; - -static uint32_t expected_size(uint16_t index) -{ - return (uint32_t)index * 257ul + 3ul; -} - -static uint8_t verify_entry(uint16_t index) -{ - if (sc_store_get(&panel, index, &check) != 0) return 0u; - return check.name[0] == 'R' && check.name[1] == (char)(index & 0x7Fu) && - check.size == expected_size(index) && check.date == index && - check.time == (uint16_t)(index ^ 0x55AAu) && - check.reserved == 0xA5u; -} - -int main(void) -{ - uint16_t total_before; - uint16_t free_before; - uint16_t total_after; - uint16_t free_after; - uint16_t written = 0u; - uint16_t i; - uint8_t block; - uint8_t page; - uint8_t first_ok; - uint8_t middle_ok; - uint8_t last_ok; - uint8_t put_641_blocked; - uint8_t get_641_blocked; - uint8_t tail_ok; - uint8_t emm_restored; - - (void)settextmode(TEXT_MODE_80x32); - clrscr_attr(0x17u); - gotoxy(0u, 0u); - textattr(0x1Fu); - cputs("P3 EMM store 640/641 diagnostic\r\n\r\n"); - textattr(0x17u); - - printf("entry=%u capacity=%u bytes=%u reserve=%u\n", - (unsigned)sizeof(ScDirEntry), (unsigned)SC_DIR_CAPACITY, - (unsigned)STORE_BYTES, (unsigned)(0x4000u - STORE_BYTES)); - - mem_info(&total_before, &free_before); - block = mem_alloc_pages(1u); - page = block ? mem_get_page(block, 0u) : 0u; - printf("EMM: block=%u page=%02X free_before=%u\n", - (unsigned)block, (unsigned)page, (unsigned)free_before); - if (!block || !page) goto failed_alloc; - - memset(&panel, 0, sizeof(panel)); - panel.phys_page = page; - bank_store_byte(page, STORE_BYTES, 0x5Au); - bank_store_byte(page, 0x3FFFu, 0xC3u); - - for (i = 0u; i < SC_DIR_CAPACITY; i++) { - memset(&entry, 0, sizeof(entry)); - entry.name[0] = 'R'; - entry.name[1] = (char)(i & 0x7Fu); - entry.size = expected_size(i); - entry.date = i; - entry.time = (uint16_t)(i ^ 0x55AAu); - entry.reserved = 0xA5u; - if (sc_store_put(&panel, i, &entry) != 0) break; - written++; - } - panel.count = written; - - first_ok = verify_entry(0u); - middle_ok = verify_entry(319u); - last_ok = verify_entry(639u); - put_641_blocked = (sc_store_put(&panel, 640u, &entry) != 0); - get_641_blocked = (sc_store_get(&panel, 640u, &check) != 0); - tail_ok = bank_load_byte(page, STORE_BYTES) == 0x5Au && - bank_load_byte(page, 0x3FFFu) == 0xC3u; - - printf("write: count=%u first=%u middle=%u last=%u\n", - (unsigned)written, (unsigned)first_ok, - (unsigned)middle_ok, (unsigned)last_ok); - printf("guard: put640=%u get640=%u tail=%u\n", - (unsigned)put_641_blocked, (unsigned)get_641_blocked, - (unsigned)tail_ok); - - mem_free_block(block); - mem_info(&total_after, &free_after); - emm_restored = total_before == total_after && free_before == free_after; - printf("cleanup: free_after=%u restored=%u\n", - (unsigned)free_after, (unsigned)emm_restored); - - textattr((written == 640u && first_ok && middle_ok && last_ok && - put_641_blocked && get_641_blocked && tail_ok && emm_restored) ? - 0x1Eu : 0x4Fu); - cputs((written == 640u && first_ok && middle_ok && last_ok && - put_641_blocked && get_641_blocked && tail_ok && emm_restored) ? - "\r\nPASS: store boundary is intact." : - "\r\nFAIL: store boundary violation."); - goto stopped; - -failed_alloc: - textattr(0x4Fu); - cputs("\r\nFAIL: cannot allocate EMM page."); - -stopped: - textattr(0x1Eu); - cputs("\r\nProbe stopped; MAME test will take a snapshot."); - for (;;) (void)getkey(); -} diff --git a/applications/Volkov/tests/p4_bank_io_probe/Makefile b/applications/Volkov/tests/p4_bank_io_probe/Makefile deleted file mode 100644 index a2f2549..0000000 --- a/applications/Volkov/tests/p4_bank_io_probe/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# P4 — прямой файловый обмен через EMM-страницу в W3. - -EXAMPLE := p4bio -MEMORY := big -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) - -include $(CURDIR)/../../sdk.mk - -$(EXE): Makefile diff --git a/applications/Volkov/tests/p4_bank_io_probe/p4bio.c b/applications/Volkov/tests/p4_bank_io_probe/p4bio.c deleted file mode 100644 index 1938591..0000000 --- a/applications/Volkov/tests/p4_bank_io_probe/p4bio.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * p4bio.c — целевая проба bank_read_page()/bank_write_page(). - * - * Проверяет перенос 4096 байт через одну EMM-страницу без полноразмерного - * near-буфера, восстановление W3, контроль границ и отсутствие утечки EMM. - * Временный файл создаётся только на тестовой дискете A: и удаляется. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define TEST_PATH "A:\\P4BIO.TMP" -#define TEST_SIZE 4096u -#define READ_OFFSET 4096u - -static uint8_t chunk[256]; - -static uint8_t pattern(uint16_t pos) -{ - return (uint8_t)((uint8_t)(pos * 37u) + (uint8_t)(pos >> 8) + 0x5Au); -} - -static void prepare_page(uint8_t page) -{ - uint16_t base; - uint16_t i; - - for (base = 0u; base < TEST_SIZE; base += (uint16_t)sizeof(chunk)) { - for (i = 0u; i < (uint16_t)sizeof(chunk); i++) { - chunk[i] = pattern((uint16_t)(base + i)); - } - bank_write(page, base, chunk, (uint16_t)sizeof(chunk)); - } -} - -static uint8_t verify_page(uint8_t page) -{ - uint16_t i; - - for (i = 0u; i < TEST_SIZE; i++) { - if (bank_load_byte(page, (uint16_t)(READ_OFFSET + i)) != pattern(i)) { - return 0u; - } - } - return 1u; -} - -int main(void) -{ - uint16_t total_before; - uint16_t free_before; - uint16_t total_after; - uint16_t free_after; - uint8_t block = 0u; - uint8_t page = 0u; - uint8_t w3_before; - uint8_t write_w3_ok = 0u; - uint8_t read_w3_ok = 0u; - uint8_t data_ok = 0u; - uint8_t range_ok = 0u; - uint8_t cleanup_ok; - int fd = -1; - int written = -1; - int loaded = -1; - - (void)settextmode(TEXT_MODE_80x32); - clrscr_attr(0x17u); - gotoxy(0u, 0u); - textattr(0x1Fu); - cputs("P4 bank page file I/O diagnostic\r\n\r\n"); - textattr(0x17u); - - (void)unlink(TEST_PATH); - mem_info(&total_before, &free_before); - block = mem_alloc_pages(1u); - page = block ? mem_get_page(block, 0u) : 0u; - if (!block || !page) goto cleanup; - - prepare_page(page); - fd = open(TEST_PATH, O_WRONLY | O_CREAT | O_EXCL); - if (fd < 0) goto cleanup; - w3_before = _io_page_w3; - written = bank_write_page(fd, page, 0u, TEST_SIZE); - write_w3_ok = (_io_page_w3 == w3_before); - if (close(fd) != 0) goto cleanup; - fd = -1; - if (written != TEST_SIZE) goto cleanup; - - fd = open(TEST_PATH, O_RDONLY); - if (fd < 0) goto cleanup; - w3_before = _io_page_w3; - loaded = bank_read_page(fd, page, READ_OFFSET, TEST_SIZE); - read_w3_ok = (_io_page_w3 == w3_before); - if (close(fd) != 0) goto cleanup; - fd = -1; - if (loaded != TEST_SIZE) goto cleanup; - - data_ok = verify_page(page); - errno = 0; - w3_before = _io_page_w3; - range_ok = bank_write_page(-1, page, 0x3FFFu, 2u) == -1 && - errno == EINVAL && _io_page_w3 == w3_before; - -cleanup: - if (fd >= 0) (void)close(fd); - (void)unlink(TEST_PATH); - if (block != 0u) mem_free_block(block); - mem_info(&total_after, &free_after); - cleanup_ok = total_before == total_after && free_before == free_after; - - printf("page=%02X write=%d read=%d data=%u\n", - (unsigned)page, written, loaded, (unsigned)data_ok); - printf("W3: write=%u read=%u range=%u errno=%d\n", - (unsigned)write_w3_ok, (unsigned)read_w3_ok, - (unsigned)range_ok, errno); - printf("EMM: before=%u after=%u restored=%u\n", - (unsigned)free_before, (unsigned)free_after, - (unsigned)cleanup_ok); - - textattr((written == TEST_SIZE && loaded == TEST_SIZE && data_ok && - write_w3_ok && read_w3_ok && range_ok && cleanup_ok) ? - 0x1Eu : 0x4Fu); - cputs((written == TEST_SIZE && loaded == TEST_SIZE && data_ok && - write_w3_ok && read_w3_ok && range_ok && cleanup_ok) ? - "\r\nPASS: bank page file I/O is intact." : - "\r\nFAIL: bank page file I/O violation."); - textattr(0x1Eu); - cputs("\r\nProbe stopped; MAME test will take a snapshot."); - for (;;) (void)getkey(); -} diff --git a/applications/Volkov/tests/p4_exec_child/Makefile b/applications/Volkov/tests/p4_exec_child/Makefile deleted file mode 100644 index 507718a..0000000 --- a/applications/Volkov/tests/p4_exec_child/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# Дочерняя программа для интеграционного EXEC-теста Commander. - -EXAMPLE := p4child -MEMORY := tiny -ALLOCS ?= 3000 -EXTRA_FLAGS := --safe --max-allocs $(ALLOCS) - -include $(CURDIR)/../../sdk.mk diff --git a/applications/Volkov/tests/p4_exec_child/p4child.c b/applications/Volkov/tests/p4_exec_child/p4child.c deleted file mode 100644 index 89294d3..0000000 --- a/applications/Volkov/tests/p4_exec_child/p4child.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * p4child.c — дочерняя программа, намеренно меняющая состояние системы. - * - * Создаёт по одному файлу в каталогах обеих панелей, оставляет CWD в - * EXECLEFT, переключает экран в 40x32 и портит используемые Commander - * записи палитры. Родитель обязан восстановить всё это после EXEC. - */ - -#include -#include -#include -#include - -static char child_cwd[256]; - -static int write_marker(const char *path, const char *text, uint16_t size) -{ - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); - int result = 0; - - if (fd < 0) return -1; - if (write(fd, text, size) != (int)size) result = -1; - if (close(fd) != 0) result = -1; - return result; -} - -static void damage_commander_palette(void) -{ - static const uint8_t attrs[] = { - 0x1Fu, 0x1Eu, 0x1Bu, 0x30u, 0x70u, 0x4Fu, 0x1Cu, 0x3Cu - }; - uint8_t i; - uint8_t plane; - - for (i = 0u; i < (uint8_t)sizeof(attrs); i++) { - for (plane = 0u; plane < 4u; plane++) { - text_pal_set_color(plane, attrs[i], 0xFFu, 0x00u, 0xFFu); - } - } -} - -int main(void) -{ - static const char left_text[] = "created by P4CHILD\n"; - static const char right_text[] = "passive refresh by P4CHILD\n"; - int left_result; - int right_result; - - left_result = chdir("\\EXECLEFT"); - if (left_result == 0) { - left_result = write_marker("CREATED.TXT", left_text, - (uint16_t)(sizeof(left_text) - 1u)); - } - /* Идём через корень, оставляя проверяемые каталоги в формате 8.3. */ - right_result = chdir(".."); - if (right_result == 0) right_result = chdir("EXECRGHT"); - if (right_result == 0) { - right_result = write_marker("PASSIVE.TXT", right_text, - (uint16_t)(sizeof(right_text) - 1u)); - } - /* Родитель должен вернуть собственный CWD даже из этого каталога. */ - (void)chdir(".."); - (void)chdir("EXECLEFT"); - - (void)settextmode(TEXT_MODE_40x32); - damage_commander_palette(); - clrscr_attr(0x27u); - textattr(0x2Fu); - gotoxy(0u, 0u); - cputs("P4CHILD.EXE\r\n\r\n"); - textattr(0x27u); - cputs("Child changed mode, palette and CWD.\r\n"); - cprintf("markers: active=%d passive=%d\r\n", left_result, right_result); - if (getcwd(child_cwd, (uint16_t)sizeof(child_cwd))) { - cprintf("child CWD: %s\r\n", child_cwd); - } - cputs("\r\nPress Enter to return code 5A..."); - (void)getkey(); - return 0x5A; -} diff --git a/applications/Volkov/tests/p4_exec_verify.py b/applications/Volkov/tests/p4_exec_verify.py deleted file mode 100755 index 6bcf28f..0000000 --- a/applications/Volkov/tests/p4_exec_verify.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -"""Проверка файлов, созданных дочерней программой P4CHILD.""" - -from __future__ import annotations - -import pathlib -import sys - - -def main() -> None: - if len(sys.argv) != 2: - raise SystemExit(f"usage: {sys.argv[0]} EXTRACTED_ROOT") - root = pathlib.Path(sys.argv[1]) - expected = { - root / "EXECLEFT" / "CREATED.TXT": b"created by P4CHILD\n", - root / "EXECRGHT" / "PASSIVE.TXT": b"passive refresh by P4CHILD\n", - } - failures = [] - for path, content in expected.items(): - if not path.is_file(): - failures.append(f"нет {path.relative_to(root)}") - elif path.read_bytes() != content: - failures.append(f"неверное содержимое {path.relative_to(root)}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: child создал active/passive markers с ожидаемым содержимым.") - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p4_fixture.py b/applications/Volkov/tests/p4_fixture.py deleted file mode 100755 index 3ac749b..0000000 --- a/applications/Volkov/tests/p4_fixture.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 -"""Создание и проверка детерминированного HDD-набора для P4 copy.""" - -from __future__ import annotations - -import pathlib -import sys - - -SOURCE_FILES = { - "CANCEL.BIN": (4 * 1024 * 1024 + 37, 0x31), - "EMPTY.ZRO": (0, 0x42), - "EXIST.TXT": (513, 0x53), - "F65535.BIN": (65535, 0x64), - "F65536.BIN": (65536, 0x75), - "K4095.BIN": (4095, 0x86), - "K4096.BIN": (4096, 0x97), - "LARGE.BIN": (131109, 0xA8), - "ONE.BIN": (1, 0xB9), -} -TARGET_EXISTING = b"TARGET MUST SURVIVE AN F5 REFUSAL\n" - - -def pattern(size: int, seed: int) -> bytes: - return bytes(((index * 37 + (index >> 8) * 11 + seed) & 0xFF) - for index in range(size)) - - -def create(root: pathlib.Path) -> None: - source = root / "COPYFROM" - target = root / "COPYTO" - source.mkdir(parents=True) - target.mkdir(parents=True) - for name, (size, seed) in SOURCE_FILES.items(): - (source / name).write_bytes(pattern(size, seed)) - (target / "EXIST.TXT").write_bytes(TARGET_EXISTING) - - -def verify_common(root: pathlib.Path) -> list[str]: - source = root / "COPYFROM" - target = root / "COPYTO" - failures: list[str] = [] - - for name, (size, seed) in SOURCE_FILES.items(): - path = source / name - expected = pattern(size, seed) - if not path.is_file() or path.read_bytes() != expected: - failures.append(f"повреждён источник {name}") - - if not (target / "EXIST.TXT").is_file(): - failures.append("нет исходного COPYTO/EXIST.TXT") - elif (target / "EXIST.TXT").read_bytes() != TARGET_EXISTING: - failures.append("существующий COPYTO/EXIST.TXT был изменён") - return failures - - -def verify_initial(root: pathlib.Path) -> None: - target = root / "COPYTO" - failures = verify_common(root) - - if (target / "LARGE.BIN").exists(): - failures.append("COPYTO/LARGE.BIN существует до теста") - if (target / "CANCEL.BIN").exists(): - failures.append("COPYTO/CANCEL.BIN существует до теста") - if list(target.glob("~SC*.TMP")): - failures.append("в исходном образе есть временный ~SC*.TMP") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: исходный HDD-набор цел и готов к P4 copy-тесту.") - - -def verify(root: pathlib.Path) -> None: - target = root / "COPYTO" - failures = verify_common(root) - - large_expected = pattern(*SOURCE_FILES["LARGE.BIN"]) - if not (target / "LARGE.BIN").is_file(): - failures.append("нет скопированного COPYTO/LARGE.BIN") - elif (target / "LARGE.BIN").read_bytes() != large_expected: - failures.append("COPYTO/LARGE.BIN отличается от источника") - - if (target / "CANCEL.BIN").exists(): - failures.append("отменённый COPYTO/CANCEL.BIN остался на диске") - if not (target / "EMPTY.ZRO").is_file(): - failures.append("нет скопированного нулевого COPYTO/EMPTY.ZRO") - elif (target / "EMPTY.ZRO").stat().st_size != 0: - failures.append("COPYTO/EMPTY.ZRO имеет ненулевой размер") - if list(target.glob("~SC*.TMP")): - failures.append("после операции остался временный ~SC*.TMP") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: LARGE/EMPTY скопированы; EXIST сохранён; cancel/temp отсутствуют.") - - -def main() -> None: - commands = {"create", "verify-initial", "verify"} - if len(sys.argv) != 3 or sys.argv[1] not in commands: - raise SystemExit( - f"usage: {sys.argv[0]} create|verify-initial|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - elif sys.argv[1] == "verify-initial": - verify_initial(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p5_copy_faults.c b/applications/Volkov/tests/p5_copy_faults.c deleted file mode 100644 index 553c1c5..0000000 --- a/applications/Volkov/tests/p5_copy_faults.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * p5_copy_faults.c — детерминированные отрицательные сценарии copy-job. - * - * Это не подмена интерактивного теста F5: программа вызывает то же банковое - * ядро копирования и останавливает его в состояниях, которые невозможно - * надёжно поймать клавишей с точностью до одного sc_copy_step(). - */ - -#include -#include -#include -#include -#include -#include -#include "sc_copy.h" -#include "sc_exec.h" - -static ScCopyJob job; -static int result_fd = -1; -static uint8_t failures; - -static void log_text(const char *text) -{ - const char *end = text; - uint16_t length; - - cputs(text); - while (*end != '\0') end++; - length = (uint16_t)(end - text); - if (result_fd >= 0) (void)write(result_fd, text, length); -} - -static void check(uint8_t condition, const char *name) -{ - if (condition) { - log_text("PASS "); - } else { - log_text("FAIL "); - failures++; - } - log_text(name); - log_text("\r\n"); -} - -static uint8_t path_absent(const char *path) -{ - int fd = open(path, O_RDONLY); - - if (fd < 0) return 1u; - (void)close(fd); - return 0u; -} - -static int write_small(const char *path, const char *data, uint16_t size) -{ - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); - int result = 0; - - if (fd < 0) return -1; - if (write(fd, data, size) != (int)size) result = -1; - if (close(fd) != 0) result = -1; - return result; -} - -int main(void) -{ - uint16_t total_before = 0u; - uint16_t free_before = 0u; - uint16_t total_after = 0u; - uint16_t free_after = 0u; - uint8_t block; - uint8_t page; - int step; - - textattr(0x07u); - clrscr_attr(0x07u); - cputs("P5 copy-job fault matrix\r\n\r\n"); - result_fd = open("D:\\RESULT.TXT", O_WRONLY | O_CREAT | O_TRUNC); - - mem_info(&total_before, &free_before); - block = mem_alloc_pages(1u); - if (block == 0u) { - log_text("FAIL EMM allocation\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return 1; - } - page = mem_get_page(block, 0u); - - errno = 0; - step = sc_platform_exec("D:\\MISSING.EXE"); - check(step < 0 && errno == ENOENT, "missing EXE errno 3"); - - /* Temp создаётся раньше открытия source: ENOENT обязан убрать его. */ - check(sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "MISSING.BIN", 4096ul, page) != 0 && - job.state == SC_COPY_ERROR && - path_absent("D:\\TARGET\\MISSING.BIN"), - "missing source cleanup"); - - /* Отмена до первого чтения. */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "BEGIN.BIN", 8192ul, page); - if (step == 0) sc_copy_cancel(&job); - check(step == 0 && job.state == SC_COPY_CANCELLED && job.done == 0ul && - path_absent("D:\\TARGET\\BEGIN.BIN"), - "cancel before first read"); - - /* Последний блок записан, но rename ещё не выполнялся: точка pre-commit. */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "LATE.BIN", 4096ul, page); - if (step == 0) step = sc_copy_step(&job); - check(step == SC_COPY_STEP_MORE && job.state == SC_COPY_RUNNING && - job.done == job.total && path_absent("D:\\TARGET\\LATE.BIN"), - "last block stops before commit"); - sc_copy_cancel(&job); - check(job.state == SC_COPY_CANCELLED && - path_absent("D:\\TARGET\\LATE.BIN"), - "cancel at pre-commit"); - - /* Закрытый source fd даёт реальную ошибку bank_read_page(). */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "READERR.BIN", 4096ul, page); - if (step == 0) { - (void)close(job.source_fd); - job.source_fd = -1; - step = sc_copy_step(&job); - } - check(step == SC_COPY_STEP_ERROR && job.state == SC_COPY_ERROR && - path_absent("D:\\TARGET\\READERR.BIN"), - "read error cleanup"); - - /* Реальный DSS READONLY: temp повторно открыт только для чтения, поэтому - * WRITE обязан вернуть errno 8, а job — удалить файл после close. */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "RONLY.BIN", 4096ul, page); - if (step == 0) { - (void)close(job.temp_fd); - job.temp_fd = open(job.temp_path, O_RDONLY); - if (job.temp_fd >= 0) { - step = sc_copy_step(&job); - } else { - sc_copy_cancel(&job); - step = -2; - } - } - check(step == SC_COPY_STEP_ERROR && job.state == SC_COPY_ERROR && - job.error == EROFS && path_absent("D:\\TARGET\\RONLY.BIN"), - "readonly write cleanup"); - - /* Удаляем уже записанный temp перед commit: RENAME обязан отказать. */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "RENAME.BIN", 4096ul, page); - if (step == 0) step = sc_copy_step(&job); - if (step == SC_COPY_STEP_MORE) { - (void)close(job.temp_fd); - job.temp_fd = -1; - (void)unlink(job.temp_path); - step = sc_copy_step(&job); - } - check(step == SC_COPY_STEP_ERROR && job.state == SC_COPY_ERROR && - path_absent("D:\\TARGET\\RENAME.BIN"), - "rename error cleanup"); - - /* Имитируем гонку: target появился после begin, но до commit. */ - step = sc_copy_begin(&job, "D:\\SOURCE", "D:\\TARGET", - "RACE.BIN", 4096ul, page); - if (step == 0) step = sc_copy_step(&job); - if (step == SC_COPY_STEP_MORE && - write_small("D:\\TARGET\\RACE.BIN", "KEEP", 4u) == 0) { - step = sc_copy_step(&job); - } - check(step == SC_COPY_STEP_ERROR && job.error == EEXIST, - "target race refuses overwrite"); - - mem_free_block(block); - mem_info(&total_after, &free_after); - check(total_before == total_after && free_before == free_after, - "EMM restored"); - - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - cputs("\r\nPress Enter to return to DSS.\r\n"); - while (kbhit()) (void)getkey(); - (void)getkey(); - return failures; -} diff --git a/applications/Volkov/tests/p5_copy_faults_fixture.py b/applications/Volkov/tests/p5_copy_faults_fixture.py deleted file mode 100755 index cdfecf4..0000000 --- a/applications/Volkov/tests/p5_copy_faults_fixture.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -"""Создание и проверка HDD-набора отрицательных сценариев copy-job.""" - -from __future__ import annotations - -import pathlib -import sys - - -SIZES = { - "BEGIN.BIN": 8192, - "LATE.BIN": 4096, - "READERR.BIN": 4096, - "RONLY.BIN": 4096, - "RENAME.BIN": 4096, - "RACE.BIN": 4096, -} - - -def content(name: str, size: int) -> bytes: - seed = sum(name.encode("ascii")) & 0xFF - return bytes((seed + index * 29 + (index >> 7)) & 0xFF - for index in range(size)) - - -def create(root: pathlib.Path) -> None: - source = root / "SOURCE" - (root / "TARGET").mkdir(parents=True) - source.mkdir() - for name, size in SIZES.items(): - (source / name).write_bytes(content(name, size)) - - -def verify(root: pathlib.Path) -> None: - failures: list[str] = [] - source = root / "SOURCE" - target = root / "TARGET" - result = root / "RESULT.TXT" - - for name, size in SIZES.items(): - path = source / name - if not path.is_file() or path.read_bytes() != content(name, size): - failures.append(f"повреждён SOURCE/{name}") - - expected_lines = [ - "PASS missing EXE errno 3", - "PASS missing source cleanup", - "PASS cancel before first read", - "PASS last block stops before commit", - "PASS cancel at pre-commit", - "PASS read error cleanup", - "PASS readonly write cleanup", - "PASS rename error cleanup", - "PASS target race refuses overwrite", - "PASS EMM restored", - "ALL PASS", - ] - if not result.is_file(): - failures.append("не создан RESULT.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected_lines: - if line not in text: - failures.append(f"нет строки результата: {line}") - - if not target.is_dir(): - failures.append("исчез TARGET") - else: - unexpected = sorted(path.name for path in target.iterdir() - if path.name.upper() != "RACE.BIN") - if unexpected: - failures.append("лишние файлы TARGET: " + ", ".join(unexpected)) - race = target / "RACE.BIN" - if not race.is_file() or race.read_bytes() != b"KEEP": - failures.append("RACE.BIN перезаписан или отсутствует") - temporaries = sorted(path.name for path in target.glob("~SC*.TMP")) - if temporaries: - failures.append("остались temp: " + ", ".join(temporaries)) - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: missing EXE, cancel, read/readonly/rename, race и EMM cleanup.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p5_enospc_fixture.py b/applications/Volkov/tests/p5_enospc_fixture.py deleted file mode 100755 index e2b10ec..0000000 --- a/applications/Volkov/tests/p5_enospc_fixture.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -"""Набор почти полного HDD для проверки ENOSPC и удаления copy-temp.""" - -from __future__ import annotations - -import pathlib -import sys - - -SOURCE_SIZE = 262_181 -FILLER_SIZE = 32_850_000 - - -def source_content() -> bytes: - return bytes(((index * 37 + (index >> 8) * 11 + 0xA7) & 0xFF) - for index in range(SOURCE_SIZE)) - - -def write_filler(path: pathlib.Path) -> None: - chunk = bytes(((index * 17 + 0x53) & 0xFF) for index in range(65536)) - remaining = FILLER_SIZE - with path.open("wb") as stream: - while remaining: - part = min(remaining, len(chunk)) - stream.write(chunk[:part]) - remaining -= part - - -def create(root: pathlib.Path) -> None: - source = root / "SOURCE" - target = root / "TARGET" - source.mkdir(parents=True) - target.mkdir(parents=True) - (source / "FULL.BIN").write_bytes(source_content()) - write_filler(root / "FILLER.BIN") - - -def verify_initial(root: pathlib.Path) -> None: - failures = [] - source = root / "SOURCE" / "FULL.BIN" - target = root / "TARGET" - filler = root / "FILLER.BIN" - if not source.is_file() or source.read_bytes() != source_content(): - failures.append("повреждён SOURCE/FULL.BIN") - if not filler.is_file() or filler.stat().st_size != FILLER_SIZE: - failures.append("неверный FILLER.BIN") - if not target.is_dir() or list(target.iterdir()): - failures.append("TARGET не пуст до теста") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: ENOSPC fixture готов, SOURCE/FULL.BIN сохранён.") - - -def verify(root: pathlib.Path) -> None: - failures = [] - source = root / "SOURCE" / "FULL.BIN" - target = root / "TARGET" - filler = root / "FILLER.BIN" - if not source.is_file() or source.read_bytes() != source_content(): - failures.append("исходный FULL.BIN изменён") - if not filler.is_file() or filler.stat().st_size != FILLER_SIZE: - failures.append("FILLER.BIN изменён") - if (target / "FULL.BIN").exists(): - failures.append("после ENOSPC остался конечный TARGET/FULL.BIN") - temporaries = sorted(target.glob("~SC*.TMP")) - if temporaries: - failures.append("после ENOSPC остался временный файл") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: ENOSPC не изменил source/filler и не оставил target/temp.") - - -def main() -> None: - commands = {"create", "verify-initial", "verify"} - if len(sys.argv) != 3 or sys.argv[1] not in commands: - raise SystemExit( - f"usage: {sys.argv[0]} create|verify-initial|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - elif sys.argv[1] == "verify-initial": - verify_initial(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p5_fixture.py b/applications/Volkov/tests/p5_fixture.py deleted file mode 100755 index 70b7570..0000000 --- a/applications/Volkov/tests/p5_fixture.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -"""Детерминированный набор для P5: 20 copy и граничные размеры.""" - -from __future__ import annotations - -import pathlib -import sys - - -SIZES = [ - 0, - 1, - 4095, - 4096, - 65535, - 65536, - 37, - 511, - 512, - 513, - 1023, - 1024, - 2047, - 2048, - 8191, - 8192, - 16383, - 16384, - 32769, - 1024 * 1024 + 37, -] - - -def content(index: int, size: int) -> bytes: - seed = (0x31 + index * 13) & 0xFF - return bytes(((position * 37 + (position >> 8) * 11 + seed) & 0xFF) - for position in range(size)) - - -def create(root: pathlib.Path) -> None: - source = root / "SOURCE" - target = root / "TARGET" - source.mkdir(parents=True) - target.mkdir(parents=True) - for index, size in enumerate(SIZES): - (source / f"F{index:02d}.BIN").write_bytes(content(index, size)) - - -def verify_initial(root: pathlib.Path) -> None: - source = root / "SOURCE" - target = root / "TARGET" - failures = [] - for index, size in enumerate(SIZES): - path = source / f"F{index:02d}.BIN" - if not path.is_file() or path.read_bytes() != content(index, size): - failures.append(f"повреждён SOURCE/{path.name}") - if not target.is_dir() or list(target.iterdir()): - failures.append("TARGET не пуст до теста") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: P5 fixture содержит 20 источников, TARGET пуст.") - - -def verify(root: pathlib.Path) -> None: - source = root / "SOURCE" - target = root / "TARGET" - failures = [] - for index, size in enumerate(SIZES): - name = f"F{index:02d}.BIN" - source_path = source / name - target_path = target / name - if not target_path.is_file(): - failures.append(f"нет TARGET/{name}") - elif target_path.read_bytes() != source_path.read_bytes(): - failures.append(f"TARGET/{name} не совпадает с источником") - elif target_path.stat().st_size != size: - failures.append(f"неверный размер TARGET/{name}") - temporaries = sorted(target.glob("~SC*.TMP")) - if temporaries: - failures.append("остались временные файлы: " + - ", ".join(path.name for path in temporaries)) - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: 20/20 файлов совпали; все граничные размеры и >1 МБ пройдены.") - - -def main() -> None: - commands = {"create", "verify-initial", "verify"} - if len(sys.argv) != 3 or sys.argv[1] not in commands: - raise SystemExit( - f"usage: {sys.argv[0]} create|verify-initial|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - elif sys.argv[1] == "verify-initial": - verify_initial(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p5_media_fixture.py b/applications/Volkov/tests/p5_media_fixture.py deleted file mode 100755 index b0d69be..0000000 --- a/applications/Volkov/tests/p5_media_fixture.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -"""Набор для отключения/возврата HDD во время F5.""" - -from __future__ import annotations - -import pathlib -import sys - - -SIZE = 262_181 - - -def data() -> bytes: - return bytes(((index * 41 + (index >> 9) * 7 + 0x35) & 0xFF) - for index in range(SIZE)) - - -def create(root: pathlib.Path) -> None: - media = root / "MEDIA" - (media / "DEEP").mkdir(parents=True) - (media / "DATA.BIN").write_bytes(data()) - (media / "DEEP" / "INNER.TXT").write_text( - "media-change fixture\n", encoding="ascii") - - -def verify(root: pathlib.Path) -> None: - failures: list[str] = [] - source = root / "MEDIA" / "DATA.BIN" - target = root / "DATA.BIN" - - if not source.is_file() or source.read_bytes() != data(): - failures.append("исходный MEDIA/DATA.BIN повреждён") - if not target.is_file() or target.read_bytes() != data(): - failures.append("DATA.BIN не скопирован после возврата HDD") - temporaries = sorted(root.glob("~SC*.TMP")) - if temporaries: - failures.append("после media-change остался временный файл") - inner = root / "MEDIA" / "DEEP" / "INNER.TXT" - if not inner.is_file() or inner.read_bytes() != b"media-change fixture\n": - failures.append("вложенный контрольный файл повреждён") - - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: HDD removal дал управляемый отказ; после возврата DATA совпал, temp нет.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p6_sort_fixture.py b/applications/Volkov/tests/p6_sort_fixture.py deleted file mode 100755 index ee5adca..0000000 --- a/applications/Volkov/tests/p6_sort_fixture.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт каталоги UI-пробы сортировки и проверяет target-результат.""" - -from __future__ import annotations - -import os -import pathlib -import sys -from datetime import datetime - - -FILES = { - "ALPHA.BIN": (50, datetime(2025, 1, 2, 12, 0, 0)), - "BETA.TXT": (20, datetime(2023, 1, 2, 12, 0, 0)), - "GAMMA.TXT": (10, datetime(2024, 1, 2, 12, 0, 0)), - "DELTA.EXE": (30, datetime(2022, 1, 2, 12, 0, 0)), -} - - -def create(root: pathlib.Path) -> None: - for panel_name in ("SORTL", "SORTR"): - panel = root / panel_name - panel.mkdir(parents=True) - for directory in ("ADIR", "ZDIR"): - (panel / directory).mkdir() - for name, (size, stamp) in FILES.items(): - path = panel / name - path.write_bytes(bytes((index * 37 + size) & 0xFF - for index in range(size))) - timestamp = stamp.timestamp() - os.utime(path, (timestamp, timestamp)) - - -def verify(root: pathlib.Path) -> None: - result = root / "SORTRES.TXT" - expected = [ - "PASS name ascending and fixed groups", - "PASS selection fixture points to BETA", - "PASS name descending toggle", - "PASS selection preserved after sort", - "PASS extension ascending", - "PASS extension descending toggle", - "PASS size ascending", - "PASS size descending toggle", - "PASS date ascending", - "PASS date descending toggle", - "PASS panel sort modes are independent", - "PASS second EMM page sorted independently", - "ALL PASS", - ] - failures: list[str] = [] - if not result.is_file(): - failures.append("нет SORTRES.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected: - if line not in text: - failures.append(f"нет строки результата: {line}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: 4 sort keys, reverse, fixed groups, selection, two panels.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p6_sort_probe.c b/applications/Volkov/tests/p6_sort_probe.c deleted file mode 100644 index b87fe91..0000000 --- a/applications/Volkov/tests/p6_sort_probe.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * p6_sort_probe.c — target-регрессия четырёх ключей сортировки панели. - * - * Проверяет реальный EMM-store и банковый sc_sort.c. Записи намеренно - * перемешаны; `..` и маркер DSS обязаны сохранять крайние позиции, а - * каталоги — оставаться перед файлами при любом направлении. - */ - -#include -#include -#include -#include -#include -#include -#include "sc_panel.h" -#include "sc_sort.h" -#include "sc_store.h" - -static int result_fd = -1; -static uint8_t failures; - -static void log_text(const char *text) -{ - const char *end = text; - uint16_t length; - - while (*end != '\0') end++; - length = (uint16_t)(end - text); - if (result_fd >= 0) (void)write(result_fd, text, length); -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -/* sc_sort_set() вызывает общий panel-инвариант. В probe достаточно той же - * нормализации cursor/top без подтягивания файлового source-модуля. */ -void sc_panel_normalize_view(ScPanel *panel) -{ - if (panel->count == 0u) { - panel->cursor = 0u; - panel->top = 0u; - return; - } - if (panel->cursor >= panel->count) panel->cursor = panel->count - 1u; - if (panel->top > panel->cursor) panel->top = panel->cursor; - if (panel->cursor >= (uint16_t)(panel->top + 27u)) { - panel->top = (uint16_t)(panel->cursor - 26u); - } -} - -static void put_entry(ScPanel *panel, uint16_t index, const char *name, - uint32_t size, uint16_t date, uint8_t attr, - uint8_t flags) -{ - ScDirEntry entry; - - memset(&entry, 0, sizeof(entry)); - strcpy(entry.name, name); - entry.size = size; - entry.date = date; - entry.time = (uint16_t)(index << 5); - entry.attr = attr; - entry.flags = flags; - (void)sc_store_put(panel, index, &entry); -} - -static void fill_panel(ScPanel *panel, uint8_t page) -{ - memset(panel, 0, sizeof(*panel)); - panel->phys_page = page; - panel->count = 8u; - panel->sort_key = SC_SORT_NAME; - put_entry(panel, 0u, "BETA.TXT", 20ul, 0x5621u, 0u, 0u); - put_entry(panel, 1u, ">>> MORE...", 0ul, 0u, 0u, - SC_ENTRY_DSS_LIMIT); - put_entry(panel, 2u, "ZDIR", 0ul, 0x5A21u, FA_DIREC, 0u); - put_entry(panel, 3u, "ALPHA.BIN", 50ul, 0x5A21u, 0u, 0u); - put_entry(panel, 4u, "..", 0ul, 0u, FA_DIREC, - SC_ENTRY_PARENT); - put_entry(panel, 5u, "GAMMA.TXT", 10ul, 0x5821u, 0u, 0u); - put_entry(panel, 6u, "ADIR", 0ul, 0x5421u, FA_DIREC, 0u); - put_entry(panel, 7u, "DELTA.EXE", 30ul, 0x5421u, 0u, 0u); -} - -static uint8_t order_is(const ScPanel *panel, const char *const *names) -{ - ScDirEntry entry; - uint16_t i; - - for (i = 0u; i < panel->count; i++) { - if (sc_store_get(panel, i, &entry) != 0 || - strcmp(entry.name, names[i]) != 0) return 0u; - } - return 1u; -} - -static uint8_t selected_is(const ScPanel *panel, const char *name) -{ - ScDirEntry entry; - return sc_store_get(panel, panel->cursor, &entry) == 0 && - strcmp(entry.name, name) == 0; -} - -int main(void) -{ - static const char *const name_up[] = { - "..", "ADIR", "ZDIR", "ALPHA.BIN", "BETA.TXT", "DELTA.EXE", - "GAMMA.TXT", ">>> MORE..." - }; - static const char *const name_down[] = { - "..", "ZDIR", "ADIR", "GAMMA.TXT", "DELTA.EXE", "BETA.TXT", - "ALPHA.BIN", ">>> MORE..." - }; - static const char *const ext_up[] = { - "..", "ADIR", "ZDIR", "ALPHA.BIN", "DELTA.EXE", "BETA.TXT", - "GAMMA.TXT", ">>> MORE..." - }; - static const char *const ext_down[] = { - "..", "ZDIR", "ADIR", "GAMMA.TXT", "BETA.TXT", "DELTA.EXE", - "ALPHA.BIN", ">>> MORE..." - }; - static const char *const size_up[] = { - "..", "ADIR", "ZDIR", "GAMMA.TXT", "BETA.TXT", "DELTA.EXE", - "ALPHA.BIN", ">>> MORE..." - }; - static const char *const size_down[] = { - "..", "ZDIR", "ADIR", "ALPHA.BIN", "DELTA.EXE", "BETA.TXT", - "GAMMA.TXT", ">>> MORE..." - }; - static const char *const date_up[] = { - "..", "ADIR", "ZDIR", "DELTA.EXE", "BETA.TXT", "GAMMA.TXT", - "ALPHA.BIN", ">>> MORE..." - }; - static const char *const date_down[] = { - "..", "ZDIR", "ADIR", "ALPHA.BIN", "GAMMA.TXT", "BETA.TXT", - "DELTA.EXE", ">>> MORE..." - }; - ScPanel left; - ScPanel right; - uint8_t block; - uint8_t left_page; - uint8_t right_page; - - result_fd = open("D:\\SORTRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); - block = mem_alloc_pages(2u); - if (block == 0u) { - log_text("FAIL EMM allocation\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return 1; - } - left_page = mem_get_page(block, 0u); - right_page = mem_get_page(block, 1u); - fill_panel(&left, left_page); - fill_panel(&right, right_page); - - check(sc_sort_panel(&left) == 0 && order_is(&left, name_up), - "name ascending and fixed groups"); - left.cursor = 4u; /* BETA.TXT в уже отсортированном списке. */ - check(selected_is(&left, "BETA.TXT"), - "selection fixture points to BETA"); - - check(sc_sort_set(&left, SC_SORT_NAME) == 0 && - left.sort_descending && order_is(&left, name_down), - "name descending toggle"); - check(selected_is(&left, "BETA.TXT"), - "selection preserved after sort"); - check(sc_sort_set(&left, SC_SORT_EXTENSION) == 0 && - !left.sort_descending && order_is(&left, ext_up), - "extension ascending"); - check(sc_sort_set(&left, SC_SORT_EXTENSION) == 0 && - left.sort_descending && order_is(&left, ext_down), - "extension descending toggle"); - check(sc_sort_set(&left, SC_SORT_SIZE) == 0 && - !left.sort_descending && order_is(&left, size_up), - "size ascending"); - check(sc_sort_set(&left, SC_SORT_SIZE) == 0 && - left.sort_descending && order_is(&left, size_down), - "size descending toggle"); - check(sc_sort_set(&left, SC_SORT_DATE) == 0 && - !left.sort_descending && order_is(&left, date_up), - "date ascending"); - check(sc_sort_set(&left, SC_SORT_DATE) == 0 && - left.sort_descending && order_is(&left, date_down), - "date descending toggle"); - - check(sc_sort_set(&right, SC_SORT_EXTENSION) == 0 && - right.sort_key == SC_SORT_EXTENSION && !right.sort_descending && - left.sort_key == SC_SORT_DATE && left.sort_descending, - "panel sort modes are independent"); - check(order_is(&right, ext_up), "second EMM page sorted independently"); - - mem_free_block(block); - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return failures; -} diff --git a/applications/Volkov/tests/p7_select_fixture.py b/applications/Volkov/tests/p7_select_fixture.py deleted file mode 100755 index fa639e4..0000000 --- a/applications/Volkov/tests/p7_select_fixture.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт UI-каталог выбора и проверяет SELRES.TXT target-пробы.""" - -from __future__ import annotations - -import pathlib -import sys - - -def create(root: pathlib.Path) -> None: - panel = root / "SELECT" - panel.mkdir(parents=True) - (panel / "ADIR").mkdir() - (panel / "ZDIR").mkdir() - for name, size in (("A.BIN", 10), ("B.BIN", 20), ("C.BIN", 30)): - (panel / name).write_bytes(bytes((index * 19 + size) & 0xFF - for index in range(size))) - - -def verify(root: pathlib.Path) -> None: - result = root / "SELRES.TXT" - expected = [ - "PASS parent cannot be selected", - "PASS Insert selects file and advances", - "PASS second Insert accumulates size", - "PASS DSS marker cannot be selected", - "PASS invert changes files only", - "PASS second invert restores file selection", - "PASS individual Insert may select directory", - "PASS clear group ignores selected directory", - "PASS mask is ASCII case insensitive", - "PASS question wildcard clears matching files", - "PASS DOS star-dot-star selects all files only", - "PASS group mask never changes directory flag", - "PASS refresh clear resets selection totals", - "PASS EMM restored", - "ALL PASS", - ] - failures: list[str] = [] - if not result.is_file(): - failures.append("нет SELRES.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected: - if line not in text: - failures.append(f"нет строки результата: {line}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: Insert/invert/masks, virtual guards, totals, refresh и EMM.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p7_select_probe.c b/applications/Volkov/tests/p7_select_probe.c deleted file mode 100644 index 4e1902f..0000000 --- a/applications/Volkov/tests/p7_select_probe.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * p7_select_probe.c — target-регрессия выбора записей панели. - * - * Проверяет Insert/invert через настоящий EMM-store, статистику выбора и - * запрет синтетических записей без зависимости от UI-таймингов. - */ - -#include -#include -#include -#include -#include -#include -#include "sc_panel.h" -#include "sc_select.h" -#include "sc_store.h" - -static int result_fd = -1; -static uint8_t failures; - -static void log_text(const char *text) -{ - const char *end = text; - while (*end != '\0') end++; - if (result_fd >= 0) { - (void)write(result_fd, text, (uint16_t)(end - text)); - } -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -void sc_panel_normalize_view(ScPanel *panel) -{ - if (panel->count == 0u) { - panel->cursor = 0u; - panel->top = 0u; - return; - } - if (panel->cursor >= panel->count) panel->cursor = panel->count - 1u; - if (panel->top > panel->cursor) panel->top = panel->cursor; - if (panel->cursor >= (uint16_t)(panel->top + 27u)) { - panel->top = (uint16_t)(panel->cursor - 26u); - } -} - -static void put_entry(ScPanel *panel, uint16_t index, const char *name, - uint32_t size, uint8_t attr, uint8_t flags) -{ - ScDirEntry entry; - memset(&entry, 0, sizeof(entry)); - strcpy(entry.name, name); - entry.size = size; - entry.attr = attr; - entry.flags = flags; - (void)sc_store_put(panel, index, &entry); -} - -static uint8_t selected(const ScPanel *panel, uint16_t index) -{ - ScDirEntry entry; - return sc_store_get(panel, index, &entry) == 0 && - (entry.flags & SC_ENTRY_SELECTED) != 0u; -} - -int main(void) -{ - ScPanel panel; - uint16_t total_before = 0u; - uint16_t free_before = 0u; - uint16_t total_after = 0u; - uint16_t free_after = 0u; - uint8_t block; - uint8_t page; - - result_fd = open("D:\\SELRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); - mem_info(&total_before, &free_before); - block = mem_alloc_pages(1u); - page = block ? mem_get_page(block, 0u) : 0u; - if (!block || !page) { - log_text("FAIL EMM allocation\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return 1; - } - - memset(&panel, 0, sizeof(panel)); - panel.phys_page = page; - panel.count = 5u; - put_entry(&panel, 0u, "..", 0ul, FA_DIREC, SC_ENTRY_PARENT); - put_entry(&panel, 1u, "ADIR", 0ul, FA_DIREC, 0u); - put_entry(&panel, 2u, "A.BIN", 10ul, 0u, 0u); - put_entry(&panel, 3u, "B.BIN", 20ul, 0u, 0u); - put_entry(&panel, 4u, ">>> MORE...", 0ul, 0u, SC_ENTRY_DSS_LIMIT); - - check(sc_select_apply(&panel, SC_SELECT_TOGGLE, 0) == 1 && - panel.cursor == 0u && - panel.selected_count == 0u, "parent cannot be selected"); - - panel.cursor = 2u; - check(sc_select_apply(&panel, SC_SELECT_TOGGLE, 0) == 0 && - panel.cursor == 3u && - panel.selected_count == 1u && panel.selected_size == 10ul && - selected(&panel, 2u), "Insert selects file and advances"); - check(sc_select_apply(&panel, SC_SELECT_TOGGLE, 0) == 0 && - panel.cursor == 4u && - panel.selected_count == 2u && panel.selected_size == 30ul && - selected(&panel, 3u), "second Insert accumulates size"); - check(sc_select_apply(&panel, SC_SELECT_TOGGLE, 0) == 1 && - panel.cursor == 4u && - panel.selected_count == 2u && !selected(&panel, 4u), - "DSS marker cannot be selected"); - - check(sc_select_apply(&panel, SC_SELECT_INVERT, 0) == 0 && - panel.selected_count == 0u && panel.selected_size == 0ul && - !selected(&panel, 1u) && !selected(&panel, 2u) && - !selected(&panel, 3u), "invert changes files only"); - check(sc_select_apply(&panel, SC_SELECT_INVERT, 0) == 0 && - panel.selected_count == 2u && panel.selected_size == 30ul && - !selected(&panel, 1u) && selected(&panel, 2u) && - selected(&panel, 3u), "second invert restores file selection"); - - panel.cursor = 1u; - check(sc_select_apply(&panel, SC_SELECT_TOGGLE, 0) == 0 && - panel.selected_count == 3u && panel.selected_size == 30ul && - selected(&panel, 1u), "individual Insert may select directory"); - check(sc_select_apply(&panel, SC_SELECT_MASK_CLEAR, "*") == 0 && - panel.selected_count == 1u && panel.selected_size == 0ul && - selected(&panel, 1u), "clear group ignores selected directory"); - check(sc_select_apply(&panel, SC_SELECT_MASK_SET, "*.bin") == 0 && - panel.selected_count == 3u && panel.selected_size == 30ul && - selected(&panel, 1u) && - selected(&panel, 2u) && selected(&panel, 3u), - "mask is ASCII case insensitive"); - check(sc_select_apply(&panel, SC_SELECT_MASK_CLEAR, "?.b?n") == 0 && - panel.selected_count == 1u && panel.selected_size == 0ul && - selected(&panel, 1u), - "question wildcard clears matching files"); - check(sc_select_apply(&panel, SC_SELECT_MASK_SET, "*.*") == 0 && - panel.selected_count == 3u && panel.selected_size == 30ul && - selected(&panel, 1u), "DOS star-dot-star selects all files only"); - check(sc_select_apply(&panel, SC_SELECT_MASK_CLEAR, "A*") == 0 && - panel.selected_count == 2u && panel.selected_size == 20ul && - selected(&panel, 1u) && !selected(&panel, 2u) && - selected(&panel, 3u), "group mask never changes directory flag"); - - sc_store_clear(&panel); - check(panel.count == 0u && panel.selected_count == 0u && - panel.selected_size == 0ul, "refresh clear resets selection totals"); - - mem_free_block(block); - mem_info(&total_after, &free_after); - check(total_before == total_after && free_before == free_after, - "EMM restored"); - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return failures; -} diff --git a/applications/Volkov/tests/p9_mkdir_fixture.py b/applications/Volkov/tests/p9_mkdir_fixture.py deleted file mode 100755 index 8459b43..0000000 --- a/applications/Volkov/tests/p9_mkdir_fixture.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python3 -"""Создаёт и проверяет HDD-fixture команды F7 mkdir.""" - -from __future__ import annotations - -import pathlib -import sys - - -def create(root: pathlib.Path) -> None: - panel = root / "MKTEST" - panel.mkdir(parents=True) - (panel / "KEEP.TXT").write_bytes(b"must remain\r\n") - - -def verify(root: pathlib.Path) -> None: - expected = [ - "PASS valid DOS 8.3 components accepted", - "PASS length and dot violations rejected", - "PASS path injection and wildcard rejected", - "PASS validated component joins full path", - "PASS CWD captured before mkdir", - "PASS mkdir creates directory", - "PASS duplicate mkdir is managed error", - "PASS rmdir removes probe directory", - "PASS mkdir/rmdir preserve process CWD", - "ALL PASS", - ] - failures: list[str] = [] - result = root / "MKRES.TXT" - panel = root / "MKTEST" - - if not result.is_file(): - failures.append("нет MKRES.TXT") - else: - text = result.read_bytes().decode("cp866", errors="replace") - for line in expected: - if line not in text: - failures.append(f"нет строки результата: {line}") - if not (panel / "NEWDIR").is_dir(): - failures.append("F7 не создал MKTEST/NEWDIR") - elif any((panel / "NEWDIR").iterdir()): - failures.append("NEWDIR неожиданно не пуст") - if not (panel / "KEEP.TXT").is_file() or \ - (panel / "KEEP.TXT").read_bytes() != b"must remain\r\n": - failures.append("KEEP.TXT изменён") - for unwanted in ("PROBE", "TOOLONG9", "TOOLONG99"): - if (panel / unwanted).exists(): - failures.append(f"остался лишний MKTEST/{unwanted}") - if failures: - for failure in failures: - print(f"FAIL: {failure}") - raise SystemExit(1) - print("PASS: validator, mkdir/error/rmdir/CWD и F7 NEWDIR.") - - -def main() -> None: - if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: - raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") - root = pathlib.Path(sys.argv[2]) - if sys.argv[1] == "create": - create(root) - else: - verify(root) - - -if __name__ == "__main__": - main() diff --git a/applications/Volkov/tests/p9_mkdir_probe.c b/applications/Volkov/tests/p9_mkdir_probe.c deleted file mode 100644 index 784ffde..0000000 --- a/applications/Volkov/tests/p9_mkdir_probe.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * p9_mkdir_probe.c — target-регрессия validator и libc mkdir/rmdir. - */ - -#include -#include -#include -#include -#include -#include "sc_path.h" - -static int result_fd = -1; -static uint8_t failures; -static char cwd_before[256]; -static char cwd_after[256]; -static char joined[256]; - -static void log_text(const char *text) -{ - const char *end = text; - while (*end != '\0') end++; - if (result_fd >= 0) { - (void)write(result_fd, text, (uint16_t)(end - text)); - } -} - -static void check(uint8_t condition, const char *name) -{ - log_text(condition ? "PASS " : "FAIL "); - if (!condition) failures++; - log_text(name); - log_text("\r\n"); -} - -int main(void) -{ - int rc; - - result_fd = open("D:\\MKRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); - check(sc_path_validate_component("A") == 0 && - sc_path_validate_component("ABCDEFGH") == 0 && - sc_path_validate_component("ABCDEFGH.XYZ") == 0 && - sc_path_validate_component("A_B-1.2") == 0, - "valid DOS 8.3 components accepted"); - check(sc_path_validate_component("") != 0 && - sc_path_validate_component(".") != 0 && - sc_path_validate_component("..") != 0 && - sc_path_validate_component("ABCDEFGHI") != 0 && - sc_path_validate_component("A.ABCD") != 0 && - sc_path_validate_component("A.B.C") != 0, - "length and dot violations rejected"); - check(sc_path_validate_component("BAD\\NAME") != 0 && - sc_path_validate_component("BAD/NAME") != 0 && - sc_path_validate_component("*.BIN") != 0 && - sc_path_validate_component("BAD NAME") != 0, - "path injection and wildcard rejected"); - check(sc_path_join(joined, sizeof(joined), - "D:\\MKTEST", "NEWDIR") == 0 && - strcmp(joined, "D:\\MKTEST\\NEWDIR") == 0, - "validated component joins full path"); - - check(getcwd(cwd_before, sizeof(cwd_before)) != 0, - "CWD captured before mkdir"); - (void)rmdir("D:\\MKTEST\\PROBE"); - errno = 0; - rc = mkdir("D:\\MKTEST\\PROBE"); - check(rc == 0, "mkdir creates directory"); - errno = 0; - rc = mkdir("D:\\MKTEST\\PROBE"); - check(rc != 0 && (errno == EEXIST || errno == EISDIR), - "duplicate mkdir is managed error"); - check(rmdir("D:\\MKTEST\\PROBE") == 0, - "rmdir removes probe directory"); - check(getcwd(cwd_after, sizeof(cwd_after)) != 0 && - strcmp(cwd_before, cwd_after) == 0, - "mkdir/rmdir preserve process CWD"); - - if (failures == 0u) log_text("ALL PASS\r\n"); - if (result_fd >= 0) (void)close(result_fd); - return failures; -} diff --git a/applications/Volkov/tests/run_mame_hdd.sh b/applications/Volkov/tests/run_mame_hdd.sh deleted file mode 100755 index e852498..0000000 --- a/applications/Volkov/tests/run_mame_hdd.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# Запускает MAME с локальным тестовым CHD как hard2 (D:) и заданным Lua. -# Состояние эмулятора изолировано; каталог кадров задаёт вызывающий. - -set -eu - -if [ "$#" -lt 3 ] || [ "$#" -gt 4 ]; then - echo "usage: $0 IMAGE.chd SCENARIO.lua SNAPSHOT_DIR [TIMEOUT]" >&2 - exit 1 -fi - -PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -if [ -z "${SPRINTER_ROOT:-}" ] && [ -f "$PROJECT_DIR/../../bin/sprinter-cc" ]; then - SPRINTER_ROOT="$PROJECT_DIR/../.." -fi -if [ -z "${MAME_HOME:-}" ] && [ -f "$PROJECT_DIR/../../mame/v306/mame.arm" ]; then - MAME_HOME="$PROJECT_DIR/../../mame/v306" -fi -: "${SPRINTER_ROOT:?задайте SPRINTER_ROOT для запуска теста}" -export MAME_HOME -IMAGE=$(CDPATH= cd -- "$(dirname -- "$1")" && pwd)/$(basename -- "$1") -LUA=$(CDPATH= cd -- "$(dirname -- "$2")" && pwd)/$(basename -- "$2") -SNAPSHOT_DIR=$(mkdir -p "$3" && CDPATH= cd -- "$3" && pwd) -TIMEOUT=${4:-75} - -exec python3 "$SPRINTER_ROOT/toolchain/run_sprinter_mame.py" \ - --hdd "$IMAGE" --script "$LUA" --snapshot-dir "$SNAPSHOT_DIR" \ - --timeout "$TIMEOUT" --video opengl diff --git a/docs/TODO.md b/docs/TODO.md index df68f5f..520829c 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -279,6 +279,12 @@ Quick wins: ## Прочий backlog +- [ ] **Несколько одновременных экземпляров MAME и MCP bridge (отдельная + задача, позже).** Проверить два изолированных процесса с разными + дискетами/CHD/state и двумя MCP-сессиями; в протоколе явно связывать + команду с PID/session ID, не допускать ответа от чужого процесса, + проверить сброс/exit и одновременные команды. До успешного end-to-end + теста параллельная работа MAME через MCP не гарантируется. - [ ] factoring parse_argv из crt0/crt0_banked в общий argv.s - [ ] `restore SP on EXIT` (паттерн z88dk +pps) — проверить нужность - [x] ~~CI: MAME с -aviwrite для screenshot-сравнения без человека~~ — diff --git a/docs/host-tests-plan.md b/docs/host-tests-plan.md index 0cc50fd..6c48b82 100644 --- a/docs/host-tests-plan.md +++ b/docs/host-tests-plan.md @@ -2,7 +2,7 @@ Статус: **не начато**, задача на будущее. Обвязка уже готова и обкатана — `testkit/` (см. `testkit/README.md`); первый потребитель — -`applications/PoP/roomtest/tests-host/`. Этот документ — про то, как накрыть +`../Applications/PoP-Archive/roomtest/tests-host/`. Этот документ — про то, как накрыть тем же способом основной продукт репозитория. ## Что это НЕ заменяет diff --git a/docs/im2_isr_design.md b/docs/im2_isr_design.md index c9f89c1..de4fd70 100644 --- a/docs/im2_isr_design.md +++ b/docs/im2_isr_design.md @@ -387,7 +387,7 @@ User's ISR НЕ должен: ## Phase 1 acceptance -- `examples/irq_test/` — счётчик тиков растёт с 50 Hz +- `../Examples/irq_test/` — будущий пример: счётчик тиков растёт с 50 Hz - Клавиатура продолжает работать через DSS chain (можно прервать тест клавишей) - Корректный exit — DSS shell получает управление обратно без crash - Работает во всех memory modes (tiny, small, big, huge) diff --git a/docs/kbd-games.md b/docs/kbd-games.md index b9be025..a13f279 100644 --- a/docs/kbd-games.md +++ b/docs/kbd-games.md @@ -2,7 +2,7 @@ Как правильно читать клавиатуру в play-цикле: что даёт платформа, чего она НЕ даёт, и какие паттерны использовать. Выжато из порта Prince of -Persia (applications/PoP/roomtest) и отладки багов «залипание клавиш» +Persia (`../Applications/PoP-Archive/roomtest`) и отладки багов «залипание клавиш» (2026-07-16) и «отвал Shift» (2026-07-22). ## Почему не ESTEX @@ -130,4 +130,4 @@ kbd_raw_close(); // вернуть клавиатуру DSS (ест сохраняются), см. libc/kbd/kbd_raw_sync.c. Связанные документы: docs/mame-autotest.md, docs/im2_isr_design.md, -docs/converted/IvanMak.txt §9.4, applications/PoP/docs/PORT_PLAN.md §2. +docs/converted/IvanMak.txt §9.4, `../Applications/PoP-Archive/docs/PORT_PLAN.md` §2. diff --git a/docs/libc-reference.md b/docs/libc-reference.md index a68313d..4ceceeb 100644 --- a/docs/libc-reference.md +++ b/docs/libc-reference.md @@ -269,7 +269,7 @@ tests/bgi_img. колоночный accel-проход: STOP между чтением и записью позволяет безопасно сменить Port_Y, промежуточный RAM-буфер не нужен). Копия = скролл + heal цели (банк 0x50). Открывшуюся полосу |d| не заполняют — возвращают в -*dirty (NULL = не нужно). Пример: examples/scroll. +*dirty (NULL = не нужно). Пример: `../Examples/scroll`. Для произвольных EMM-данных, которые затем маппятся в W0, `gfx_w0_page_prepare(page)` устанавливает IRQ/NMI-стабы в `0x38/0x66` и запоминает штатную DSS-страницу. `atlas_load()` вызывает её автоматически. @@ -306,7 +306,7 @@ banked-функции; только volatile-глобалы и быстрая р ## — эксклюзивный raw-канал клавиатуры (вектор 0xFF, свой путь) -Мотивация — applications/PoP/docs/PORT_PLAN.md §2: ESTEX +Мотивация — `../Applications/PoP-Archive/docs/PORT_PLAN.md` §2: ESTEX kbhit/getch/getkey/kbd_mod_state — событийные, без held-state для обычных (не модификаторных) клавиш. Decode make/break (PS/2 Scan Code Set 2: `0xF0` — префикс отпускания, `0xE0` — префикс расширенной @@ -332,7 +332,7 @@ UP/DOWN/RIGHT — из этого сделан ОШИБОЧНЫЙ вывод « нажать». На самом деле причина была в неудачном таймінге снимков относительно дуги прыжка, а не в отсутствии сигнала. Подтверждено брейкпоинтом в отладчике MAME (adress уровня приложения на входе в -код `jumping=1` в `applications/PoP/poc/poc.c`): `press_key('up')` +код `jumping=1` в `../Applications/PoP-Archive/poc/poc.c`): `press_key('up')` ЧЕСТНО доходит до raw-декодера и триггерит код прыжка — брейкпоинт сработал ровно один раз за одно удержание клавиши (это же заодно подтвердило фикс двойного триггера через `up_prev` edge-detect в @@ -373,7 +373,7 @@ FIFO SIO — 3 байта, и рассчитывать на «каждый ба опрос луча, а это ~2/3 периода кадра. Проверено: 35 нажатий стрелки с зажатым Shift → 35 дошедших make против 9 из 10 без хука. Остаточные редкие потери возможны (пачка целиком внутри DI-окна одного accel-прохода); -полный протокол и что делать дальше — `applications/PoP/roomtest/TASKS_CLOSED.md`, +полный протокол и что делать дальше — `../Applications/PoP-Archive/roomtest/TASKS_CLOSED.md`, задача KBD-1. **ГЛАВНОЕ СЛЕДСТВИЕ:** пока `kbd_raw_open()` активен, `kbhit/getch/getkey/ @@ -387,7 +387,7 @@ MAME дёргает ОБЕ клавиатуры (PC ms_naturl + ZX-матриц одновременно — наблюдался паразитный незатухающий бит от ZX-пути (обычный код без EXT-префикса, застревал в DOWN) — не воспроизводится на реальном сценарии (только PC/AT-клавиатура, без матрицы, см. -applications/PoP/docs/PORT_PLAN.md §2 — пользователь подтвердил, что +`../Applications/PoP-Archive/docs/PORT_PLAN.md` §2 — пользователь подтвердил, что матрица на Sprinter давно не используется). Для будущих MAME-тестов этой функции — бить только по `:kbd:ms_naturl:*`, не через удобный `press_key` (или перепроверить точную семантику полей моста). diff --git a/docs/mame-autotest.md b/docs/mame-autotest.md index 7f000c1..c10892c 100644 --- a/docs/mame-autotest.md +++ b/docs/mame-autotest.md @@ -17,21 +17,21 @@ make -C tests/bgitest # запустить в MAME, снять экран, выйти по таймауту python3 toolchain/mame_interactive.py tests/bgitest/bgitest.exe \ - --snap 12,14 --timeout 16 + --mame-home /путь/к/MAME/runtime --snap 12,14 --timeout 16 ``` Инструмент сам: -1. проверит, что нет висящих копий MAME; -2. положит `.exe` на дискету A: (`mame/v306/IMG/mc.img`); +1. соберёт отдельную временную FAT12-дискету с `.exe`; +2. создаст отдельные каталоги MAME для cfg/NVRAM/diff/snapshot; 3. запустит MAME с драйвером `sprinter`; -4. дождётся приглашения `C:\>` и **напечатает `a:\bgitest.exe` + Enter** - (эмулируя нажатия клавиш); +4. в момент `--launch-at` **напечатает `a:\bgitest.exe` + Enter** + (эмулируя нажатия клавиш); выбирайте время после загрузки DSS; 5. снимет скриншоты в указанные секунды эмулированного времени; 6. завершит сессию по таймауту; 7. выведет пути к PNG-скриншотам. -Скриншоты лежат в `mame/v306/snap_auto/sprinter/` (`0000.png`, `0001.png`, -…). Их читает Claude визуально (инструментом Read) — текст с экрана +Скриншоты лежат в `build/mame-autotest//sprinter/` (`0000.png`, +`0001.png`, …) относительно каталога запуска. Их можно читать визуально — текст с экрана программно НЕ распознаётся. --- @@ -40,7 +40,8 @@ python3 toolchain/mame_interactive.py tests/bgitest/bgitest.exe \ ``` python3 toolchain/mame_interactive.py [exe] [--data f ...] \ - [--launch-at T] [--step "T:TEXT" ...] [--snap t1,t2,...] [--timeout N] + [--mame-home DIR] [--mame-bin FILE] [--launch-at T] \ + [--step "T:TEXT" ...] [--snap t1,t2,...] [--timeout N] ``` | Аргумент | Назначение | @@ -51,6 +52,9 @@ python3 toolchain/mame_interactive.py [exe] [--data f ...] \ | `--step "T:TEXT"` | в момент `T` сек напечатать `TEXT`. Можно много раз — диалог с уже запущенной программой. В `TEXT`: `\n`=Enter, `\t`=Tab; заглавные и символы через Shift — автоматически. | | `--snap t1,t2,...` | секунды эмуляции для скриншотов. По умолчанию: `launch_at+4` и `+6` (для `exe`), либо сразу после последнего ввода. | | `--timeout N` | секунд эмуляции до принудительного выхода. По умолчанию — чуть позже последнего скриншота. | +| `--mame-home DIR` | установленная среда MAME; можно задать переменной `MAME_HOME`. | +| `--mame-bin`, `--mame-rompath`, `--mame-dss-image`, `--mame-system-hdd-image`, `--mame-bios` | выбор отдельных частей профиля; соответствуют `MAME_*` из окружения. | +| `--snapshot-dir DIR` | локальный каталог кадров вместо `build/mame-autotest`. | **Важно:** все времена — это **секунды эмулированного времени от старта машины** (не от нажатий, их «нет»). Загрузка DSS до `C:\>` занимает @@ -72,7 +76,7 @@ python3 toolchain/mame_interactive.py tests/menu/menu.exe \ --step "13:2\n" --snap 15 --timeout 17 # 4. Тест с файлом-данными на дискете -python3 toolchain/mame_interactive.py examples/mdview2/mdview2.exe \ +python3 toolchain/mame_interactive.py /путь/к/Examples/mdview2/mdview2.exe \ --data doc.md --step "13:mdview2 doc.md\n" --snap 16 --timeout 18 ``` @@ -82,11 +86,12 @@ python3 toolchain/mame_interactive.py examples/mdview2/mdview2.exe \ ### 3.1 Запуск MAME -Нативный `mame.arm` (arm64) в `mame/v306/`, драйвер `sprinter`, BIOS -v3.06. Полный набор аргументов зашит в `COMMON_ARGS` внутри скрипта: -две дискеты (A: наш `mc.img`, B: DSS 1.71u), два HDD-образа (система + -медиа), CD-ROM, ZX-Bus карта NeoGS, `-video opengl -window`, -`-snapshot_directory`, `-autoboot_script <сгенерированный .lua>`. +Профиль `MAME_HOME` выбирает `mame.arm`, `roms/`, DSS-дискету и системный +CHD. A: — временная дискета этого запуска; B: — DSS. При наличии в +установленной среде CD/NeoGS/медиа скрипт подключает их как необязательные +устройства. `-cfg_directory`, `-nvram_directory`, `-diff_directory` и +`-snapshot_directory` указывают в изолированный каталог сессии; +`-autoboot_script` получает сгенерированный Lua-файл. ### 3.2 Ввод с клавиатуры — ключевой момент @@ -118,7 +123,7 @@ AT-клавиатуре есть (поле `P2.1`/0x4) — путь `a:\name.exe ### 3.3 Тайминг (Lua) -Генерируется `_interactive_gen.lua`, который через +Временный Lua-файл через `emu.register_periodic` на каждом кадре сверяет **эмулированное время** и проигрывает события ввода, снимает скриншоты и завершает сессию. @@ -132,32 +137,33 @@ AT-клавиатуре есть (поле `P2.1`/0x4) — путь `a:\name.exe ### 3.4 Скриншоты `manager.machine.video:snapshot()` пишет PNG в каталог из -`-snapshot_directory` (`mame/v306/snap_auto/sprinter/`). Скрипт перед -запуском чистит этот каталог, потом печатает пути к готовым файлам. -Claude открывает их инструментом Read (визуальный анализ). +`-snapshot_directory` внутри `build/mame-autotest//sprinter/`. +Каждый запуск создаёт свой каталог и печатает пути к PNG; другие сессии не +затрагиваются. ### 3.5 Завершение сессии -Два рубежа, чтобы MAME гарантированно не «завис»: +Два рубежа, чтобы MAME гарантированно завершился: - в Lua: при `elapsed >= timeout` → `manager.machine:exit()` (чистый выход); -- снаружи: shell-обёртка `timeout ./mame.arm …` как страховка. +- снаружи: `subprocess` ожидает с ограничением wall-clock времени, затем + завершает только собственный процесс MAME. --- ## 4. Предпосылки (окружение) -- **MAME**: `mame/v306/mame.arm` + образы в `mame/v306/IMG/` - (`mc.img` — наш перезаписываемый A:, `dss171u.img`, HDD `.chd`, CD - `.iso`). Каталог `mame/` целиком в `.gitignore` — поэтому инструмент - живёт в `toolchain/`, а не рядом с MAME. +- **MAME**: задайте `MAME_HOME=/путь/к/MAME/runtime` с бинарником, + `roms/`, `IMG/dss171u.img` и `IMG/sp_hdd_sys.chd`. Исходники fork не нужны. - **Загрузка должна доходить до `C:\>`.** `system.bat` на системном диске НЕ должен автоматически запускать Flex Navigator или приложение — иначе мы не попадём на командную строку и ввод уйдёт в чужую программу. (Это файл на HDD-образе, вне репозитория; правится один раз.) -- **Нет висящих копий MAME.** Несколько одновременных инстансов пишут в - один `mc.img` и дают недостоверный результат. Скрипт проверяет это сам - (`pgrep`), но при ручных запусках MAME — проверяйте `ps aux | grep mame`. +- **Одновременный запуск нескольких MAME не проверялся.** Автотест создаёт + отдельные A:, state и снимки и при необходимости копирует системный CHD, + но это ещё не доказывает корректность параллельной работы. Особенно не + гарантируется работа нескольких процессов через MCP bridge: выбор процесса, + идентификатор сессии и арбитраж требуют отдельной проверки. --- @@ -237,14 +243,14 @@ end анимацией/звуком, где скриншотов мало. Пока не подключено к скрипту. - **Ручная отладка ввода.** Запуск MAME с `-console` даёт интерактивный Lua-REPL — удобно нащупывать поля/тайминги вживую перед скриптованием. -- **Второй видеорежим/варианты BIOS** — при необходимости менять - `COMMON_ARGS`. +- **Второй видеорежим/варианты BIOS** — выбирать `MAME_BIOS` или отдельные + аргументы профиля. -## 10. Тайминги MCP-моста (run_bridge.sh) — НЕ ждать дольше +## 10. Архивные тайминги старого MCP-моста -Запуск через `mame/v306/run_bridge.sh` + `bridge_cmd.sh` / MCP `mame-z80`. -Паузы ниже — измеренные на этой машине; ждать дольше бессмысленно, а -привычка ставить `sleep 30..60` съедает минуты на каждый прогон: +Ниже сохранены измерения прежнего ручного запуска через `run_bridge.sh` и +`bridge_cmd.sh`. Они не задают таймауты нового автотеста и DAP: автотест +использует изолированные носители, а DAP ждёт стабильный prompt DSS в VRAM. | шаг | пауза ПОСЛЕ шага | |-----|------------------| diff --git a/docs/mame-source-debug-status.md b/docs/mame-source-debug-status.md index d953061..1bb1b42 100644 --- a/docs/mame-source-debug-status.md +++ b/docs/mame-source-debug-status.md @@ -293,6 +293,9 @@ host-моста пока не готова: FileBridge использует `fcn живой bridge-тест не использует такой скрипт. Повторная загрузка autoboot на reset защищена от дублирования callback. Старый mamebridge параллельно с sdbgbridge не загружать: общая арбитрирующая сессия ещё не реализована. +Два одновременно запущенных процесса MAME через MCP bridge не проверялись; +корректная маршрутизация команд между ними не гарантируется. Это отдельная +отложенная задача в [TODO.md](TODO.md). ## Размерный регресс и оставшаяся работа diff --git a/docs/mame-source-debug.md b/docs/mame-source-debug.md index 8202b36..d08a556 100644 --- a/docs/mame-source-debug.md +++ b/docs/mame-source-debug.md @@ -55,8 +55,10 @@ CLI или MCP. [sprinter-cc](../bin/sprinter-cc), [app.mk](../app.mk), [mame_interactive.py](../toolchain/mame_interactive.py), [bank.s](../runtime/bank.s), [crt0_banked.s](../runtime/crt0_banked.s). -Локальная интеграция: `mame/sources/MAME/plugins/mamebridge/init.lua`, -`mame/sources/MAME/src/mame_mcp.py`. +MAME fork теперь самостоятельный проект: `MAME/plugins/mamebridge/init.lua`, +`MAME/src/mame_mcp.py`; среда запуска задаётся `MAME_HOME`, а исходники +fork приложению не нужны. Расширение VS Code находится в отдельном +`VSCode-Sprinter`; Python DAP backend остаётся в SDK. ## 2. Доказательства и пределы выводов @@ -559,7 +561,7 @@ Stdout адаптера содержит только DAP, диагностик ### 8.3 Разработка и запуск из редактора **Архитектурное решение:** Sprinter-специфичный цикл реализуется собственным -расширением `toolchain/vscode-sprinter-debug`. Готовые C/C++ или clangd можно +расширением `VSCode-Sprinter`. Готовые C/C++ или clangd можно использовать для подсветки, completion и навигации, а VS Code Tasks и Debug UI — как стандартные интерфейсы. Они не знают ABI SDCC/Z80, пакет `.sprinter-cc-*`, DSS, банковую адресацию и протокол MAME, поэтому не могут diff --git a/docs/mdview_guide_and_test_patterns.md b/docs/mdview_guide_and_test_patterns.md index 222baf6..4207591 100644 --- a/docs/mdview_guide_and_test_patterns.md +++ b/docs/mdview_guide_and_test_patterns.md @@ -41,7 +41,7 @@ ## Сборка и запуск ```bash -make -C examples/mdview +make -C ../Examples/mdview ``` Запуск на целевой системе: diff --git a/docs/project-reorganization.md b/docs/project-reorganization.md index 6e059f2..147e9c9 100644 --- a/docs/project-reorganization.md +++ b/docs/project-reorganization.md @@ -1,7 +1,7 @@ # Разделение Sprinter-CC, MAME и приложений -Статус: реализация. Контракт SDK и локальных образов готов; выделение Git -репозиториев и физический перенос выполняются. Дата: 2026-09-15. +Статус: физическое разделение выполнено; завершаются локальные коммиты, +проверка документов и публикация Sprinter-CC. Дата обновления: 2026-09-16. ## Цель и границы @@ -26,24 +26,40 @@ MAME приложению не нужны. └── VSCode-Sprinter/ # Git-репозиторий расширения VS Code ``` -Имена `C-Compiler`, `Volkov` и `PoP-Archive` пока локальные; адреса Git remote -новых репозиториев будут добавлены после создания доступных для записи URL. +Имена `C-Compiler`, `Volkov` и `PoP-Archive` приняты для локальной раскладки; +адреса Git remote новых репозиториев будут добавлены после создания доступных +для записи URL. Отсутствие remote не мешает сохранить независимую локальную историю. Папка `Applications/` не становится общим репозиторием: каждый продукт имеет свою историю, релизы, игнорируемые ресурсы и тесты. Физическое расположение рядом удобно, но не входит в контракт сборки. +Локальные точки истории после разделения: + +| Репозиторий | Split/base | Итоговый локальный commit | +|---|---|---| +| Examples | `502d735` | `a76852d` | +| SprPoP | `4507ba9` | `bd300b3` | +| Volkov | `a71e3c5` | `3c1956b` | +| PoP-Archive | `716c639` | `54d0b3d` | +| VSCode-Sprinter | `68a821e` | `901d91a` | +| MAME | baseline `b0c4527c`, backend/MCP `fe7ee37a` | `37b89b78` | + +Первые пять base-коммитов получены из подготовительного коммита Sprinter-CC +через `git subtree split`; поэтому их история прослеживается до исходного +монорепозитория. У выделенных репозиториев пока нет настроенных remote. + ## Что принадлежит каждому проекту | Проект | Что остаётся/переходит | Причина | |---|---|---| | Sprinter-CC | `bin/`, `runtime/`, `libc/`, `libbgi/`, `lib/`, общие `toolchain/`, `tests/`, `testkit/`, `app.mk`, справочник API, платформенные исследования, `release_docs/`, рецепт SDCC в `third_party/` | Это target SDK, его ABI, инструменты и собственные регрессионные тесты. libc/libbgi пока остаются вместе: их версия и ABI тесно связаны с `sprinter-cc`; дальнейшее выделение возможно после стабильного интерфейса. | -| MAME | Нынешний `mame/sources/MAME` со своим Git, изменения драйвера/OSD, патч debugger backend, общие `mamebridge` и `mame_mcp.py`, рецепты stock/sdbg сборок | Изменения ядра и общий транспорт MCP должны проверяться и выпускаться вместе с конкретной ревизией MAME. | -| Examples | Нынешние `examples/balls`, `mdview`, `mdview2`, `rpgwalk`, `scroll`, `space` и относящиеся к ним ресурсы/документы | Это демонстрации SDK с общей версией. Один репозиторий избегает множества мелких релизов. | -| SprPoP | Всё `applications/SprPoP/`: исходники, конверторы, тесты, собственные ресурсы и планы | Уже почти автономное приложение; оригинальные ресурсы и дальше остаются внешними. | -| Volkov | Всё `applications/Volkov/`: исходники, сценарии MAME, собственные тестовые носители и документы | Продукт и его проверки должны развиваться без дерева тулкита. | -| PoP-Archive | `applications/PoP/` как архив прежних PoC/roomtest и исследований | Не смешивать прежнюю историю с активным SprPoP. Если архив не нужен как рабочий клон, сохранить Git-историю и документы в отдельном архивном репозитории. | -| VSCode-Sprinter | Нынешний `toolchain/vscode-sprinter-debug`: extension, задачи сборки, конфигурации и тесты клиентской части | У расширения свои версии, упаковка VSIX и цикл обновления. Отладочный Python backend остаётся в SDK. | +| MAME | Выделенный `../MAME` со своим Git, изменения драйвера/OSD, патч debugger backend, общие `mamebridge` и `mame_mcp.py`, рецепты stock/sdbg сборок | Изменения ядра и общий транспорт MCP должны проверяться и выпускаться вместе с конкретной ревизией MAME. | +| Examples | Выделенный `../Examples`: `balls`, `mdview`, `mdview2`, `rpgwalk`, `scroll`, `space` и относящиеся к ним ресурсы/документы | Это демонстрации SDK с общей версией. Один репозиторий избегает множества мелких релизов. | +| SprPoP | Всё из прежнего `applications/SprPoP/`: исходники, конверторы, тесты, собственные ресурсы и планы | Уже почти автономное приложение; оригинальные ресурсы и дальше остаются внешними. | +| Volkov | Всё из прежнего `applications/Volkov/`: исходники, сценарии MAME, собственные тестовые носители и документы | Продукт и его проверки должны развиваться без дерева тулкита. | +| PoP-Archive | Прежний `applications/PoP/` как архив PoC/roomtest и исследований | Не смешивать прежнюю историю с активным SprPoP. Архив сохранён самостоятельным рабочим репозиторием. | +| VSCode-Sprinter | Выделенный `../VSCode-Sprinter`: extension, задачи сборки, конфигурации и тесты клиентской части | У расширения свои версии, упаковка VSIX и цикл обновления. Отладочный Python backend остаётся в SDK. | `applications/DN/DosNavigator` и вложенные чужие клоны в PoP/Volkov — референсы, не Sprinter-приложения. Их не превращать в продуктовые репозитории @@ -67,8 +83,8 @@ MAME приложению не нужны. переноса такой путь может случайно указывать на чужой каталог. `MAME_HOME` — необязательный для сборки путь к подготовленной **среде запуска** -MAME, а не к его исходникам. Стандартные пути соответствуют нынешнему -`mame/v306` и допускают переопределение из окружения, аргументов `make` или +MAME, а не к его исходникам. Стандартные пути внутри `MAME_HOME` задают +контракт установленной среды и допускают переопределение из окружения, аргументов `make` или локального игнорируемого файла настроек. Если `MAME_HOME` не задан, необходимые пути можно указать отдельно; отсутствие обоих источников диагностировать в цели запуска, не превращая пустое значение в `/mame.arm`: @@ -103,7 +119,9 @@ DAP-launch должны брать один источник настройки, `IMG/mc.img` и `IMG/test_hdd.chd` больше не являются выходами сборки приложения. `make hdd` готовит локальный образ; `make run` запускает его без `mame-link`. Для нескольких сценариев создавать отдельные носители и -state-каталоги, чтобы параллельный запуск не перезаписывал чужой тест. +state-каталоги, чтобы один запуск не перезаписывал чужие файлы. Одновременная +работа нескольких процессов MAME, особенно с MCP bridge, не проверялась и +не гарантируется; отдельная отложенная задача есть в [TODO.md](TODO.md). Конфигурация разработчика не содержит абсолютных личных путей в Git. Для `.img` нужен упаковщик из SDK; для `.chd` нынешний `make_hdd.sh` дополнительно использует внешние `mtools` и `chdman`. Зафиксировать эти @@ -179,16 +197,13 @@ MAME документируются вместе; extension не копируе ## История Git, внешние ресурсы и совместимость -До выделения репозиториев инвентаризировать незакоммиченные/неотслеживаемые -файлы в корне и отдельный dirty checkout MAME. Среди новых файлов сейчас -находятся DAP, extension, MCP-плагин, MAME patch и документы: простое -`git subtree split` по старому HEAD их потеряет. Сначала сохранить работу -в подходящих коммитах/ветках или проверенных патчах; не сбрасывать и не -перезаписывать пользовательские изменения. Затем выделить историю -`examples/`, `applications/SprPoP/`, `applications/Volkov/` и PoP через -`git subtree split` либо `git filter-repo`, проверяя состав каждого нового -Git дерева. Для MAME использовать его существующую историю, а не историю -родительского SDK, где `mame/` игнорируется. +Перед выделением были инвентаризированы незакоммиченные/неотслеживаемые +файлы в корне и отдельный dirty checkout MAME. Работу DAP, extension, +MCP-плагина, MAME patch и документов сначала сохранили в подготовительном +коммите. Истории `examples/`, `applications/SprPoP/`, +`applications/Volkov/` и PoP выделены через `git subtree split`, после чего +каждый результат импортирован как `main` самостоятельного Git-репозитория. +MAME сохранил свою исходную историю и не получил историю родительского SDK. Новый `.gitignore` каждого проекта покрывает собственные `.exe`, объекты, debug packages, носители, снимки, внешние источники и секреты локального @@ -207,47 +222,66 @@ debug packages, носители, снимки, внешние источник ## Порядок работ и критерии готовности -1. **Зафиксировать текущую базу.** Список tracked/untracked файлов, +1. **Выполнено — зафиксировать текущую базу.** Список tracked/untracked файлов, отдельный Git MAME, лицензии/внешние ресурсы, базовые результаты сборок и smoke-тестов. Сохранить незавершённую отладочную и прикладную работу. Критерий: никакой исходник не теряется при выделении истории. -2. **Стабилизировать контракт SDK.** В `app.mk` разделить build и run, +2. **Выполнено — стабилизировать контракт SDK.** В `app.mk` разделить build и run, реализовать `SPRINTER_ROOT`, `MAME_HOME` и переопределения, упаковку локального образа с проверкой `mtools`/`chdman`, общий профиль путей и диагностику отсутствующих файлов. Перевести автотесты/launcher без переноса дерева. Критерий: приложение собирается без MAME и запускается с нестандартным `MAME_BIN`/ROM/DSS/System HDD. -3. **Подготовить MAME отдельно.** Сохранить fork с точной baseline-revision, +3. **Выполнено локально — подготовить MAME отдельно.** Сохранить fork с точной baseline-revision, stock/sdbg сборки и проверенным способом подготовки `MAME_HOME`. Перенести MAME patch/общий MCP к их владельцу, проверить обоих провайдеров. Критерий: два бинарника существуют одновременно, ROM/CHD и state не коммитятся, patched DAP launch проверен. -4. **Выделить Examples.** Переписать относительные пути и источник RPG +4. **Выполнено — выделить Examples.** Переписать относительные пути и источник RPG графики, определить формат релиза SDK+Examples. Критерий: каждый пример собирается из собственного клона Examples при одном `SPRINTER_ROOT`, локальные диски не затрагивают MAME или соседние проекты. -5. **Выделить приложения по одному.** Сначала SprPoP как наиболее близкий +5. **Выполнено — выделить приложения по одному.** Сначала SprPoP как наиболее близкий к автономному контракту, затем Volkov с локальным viewer fixture, затем архив PoP с его референсами. Переписать тесты и run-скрипты, сохраняя их документы и историю. Критерий: каждый продукт собирается и проходит доступные host/MAME проверки из изолированного клона без Examples и других приложений. -6. **Выделить extension.** Научить VS Code находить SDK DAP независимо от +6. **Реализовано; остаётся ручная проверка установленного VSIX после разделения — выделить extension.** Научить VS Code находить SDK DAP независимо от workspace, запускать build/run/debug приложения и показывать ошибки разрешения путей/версий. Проверить VSIX в отдельном workspace SprPoP или Volkov, а не только в `C-Compiler`. Критерий: F5 строит debug package, ждёт DSS, доходит до `main`, принимает breakpoint/logpoint и клавиатуру; опция родного окна MAME работает на macOS. Windows остаётся явно ограниченной до отдельной реализации host transport. -7. **Очистить SDK и документы.** Заменить корневые цели, release-скрипт, +7. **Завершается — очистить SDK и документы.** Заменить корневые цели, release-скрипт, README, `AGENTS.md`, инструкции автотеста/отладки и рабочие ссылки. Проверить `make`, `make -C libc`, `make -C libbgi`, `make size-check`, SDK host/sdbg tests и отдельные проекты. Критерий: в SDK нет tracked приложений/примеров и игнорируемого вложенного MAME; инструкции используют новые пути, а архивные исследования остаются доступны. -Каждый этап заканчивается проверкой в отдельном клоне и просмотром Git diff, -а не одним успешным запуском в старом общем дереве. Реальные переносы, -новые Git remote и публикация релизов выполняются отдельной задачей после -согласования этого плана. +## Проверка реализации на 2026-09-16 + +Успешно выполнены сборка SDK (`make`), отдельные сборки libc/libbgi, +создание `build/media/toolkit-tests.img`, release-smoke, 36 Python-тестов +source debugger (один platform skip), 12 тестов extension, все Examples, +SprPoP в обычном и `SRC_DEBUG=1` режимах с локальным CHD, 17 host-наборов +SprPoP, Volkov и PoP-Archive PoC. Живые последовательные DAP-прогоны +подтвердили patched `sdbg`, stock MAME с `osx`, клавиатурный ввод, +`SDBG_LOG` в обеих консолях и запуск SprPoP с собственного `hard2` до +`main`. + +`make size-check` пока не принят: текущий baseline показывает 12 старых +увеличений (обычно +9 байт, `openenv` +188) и несколько исчезнувших прежних +тестов. Реорганизация не меняла libc/libbgi, поэтому эталон автоматически не +перезаписывался; расхождения нужно разобрать отдельно. После разделения ещё +нужна ручная проверка установленного VSIX в чистом workspace. Несколько +одновременных MAME, маршрутизация MCP между ними и Windows transport остаются +явно непроверенными сценариями. + +Каждый этап заканчивается проверкой в отдельном репозитории и просмотром Git +diff. Новые Git remote для выделенных репозиториев и публикация их релизов +остаются отдельной задачей. MAME пока не публикуется: существующий `origin` +доступен только для чтения. Sprinter-CC публикуется в своём прежнем remote. diff --git a/docs/sprite-api-design.md b/docs/sprite-api-design.md index ee1b5c0..22dd245 100644 --- a/docs/sprite-api-design.md +++ b/docs/sprite-api-design.md @@ -335,7 +335,7 @@ while (game) { } ``` -Курсор мыши (пример examples/, не API): то же самое с +Курсор мыши (пример в отдельном репозитории `../Examples`, не API): то же самое с `GFX_BANK_SPRITE`; фон под курсором живёт в ОЗУ-копии, никакой getimage/буфер не нужен. Перерисовка — из главного цикла по `mouse_getxy()`. @@ -451,7 +451,7 @@ getimage/буфер не нужен. Перерисовка — из главн цела (проверки A/B PASS). size-check: роста существующих программ нет (новые модули тянутся только пользователями API). - Демо **examples/balls** (2026-07-11): 8 разноцветных шаров 16×16 + Демо **../Examples/balls** (2026-07-11): 8 разноцветных шаров 16×16 (по спрайту на цвет, прозрачные углы) над чёрно-белой шахматкой; скорости 1..4 привязаны к кадрам (gfx_wait_vsync, speed = кадров на шаг: 50/25/~17/12.5 px/с — подтверждено покадровыми скриншотами), @@ -463,7 +463,7 @@ getimage/буфер не нужен. Перерисовка — из главн Требует зеркалирования палитры в палитру 1 (initgraph грузит EGA только в 0) и координат drawn[2][N] per-page. Побочно ушли и одно-кадровые артефакты перекрытий/снапшотов. -- **Фаза C — пример курсора** (examples/): мышь + putsprite/gfx_heal, +- **Фаза C — пример курсора** (`../Examples`): мышь + putsprite/gfx_heal, он же живой тест temp-режима. - Документация: libc-reference (раздел «Спрайты»), обновить TODO. @@ -505,7 +505,7 @@ getimage/буфер не нужен. Перерисовка — из главн ## 9.1 Эскиз managed-движка: sprite_t + retained-модель (v2, НЕ реализовано) -Мотивация — опыт examples/balls (2026-07-11): при двойной буферизации +Мотивация — опыт `../Examples/balls` (2026-07-11): при двойной буферизации приложение обязано помнить, где каждый спрайт РЕАЛЬНО нарисован на КАЖДОЙ из двух страниц (drawn[2][N]), и соблюдать двухпроходную дисциплину «heal все → блит все». Оба правила легко нарушить (heal по @@ -643,7 +643,7 @@ src[0] предчитывался до армирования и подстав перед триггером. **ФИКС СНЯТ 2026-07-13.** Точная dev-MAME (сборка разработчиков -Sprinter, `mame/sources/MAME`) эмулирует ПЛМ, подавляющую CPU-байт +Sprinter, `../MAME`) эмулирует ПЛМ, подавляющую CPU-байт триггера при активном burst'е — квирк был артефактом стоковой MAME 0.283. Проверено pixel-точно: tests/blitw, col0 @(200,150) = 0x02 GREEN по байтам VRAM (read_vram через MCP-мост). Для heal фикс был diff --git a/docs/vscode-sprinter-debug.md b/docs/vscode-sprinter-debug.md index 701bf8b..e5f21b5 100644 --- a/docs/vscode-sprinter-debug.md +++ b/docs/vscode-sprinter-debug.md @@ -15,8 +15,8 @@ ## Какие расширения нужны -Для build/run/debug используется собственное расширение этого проекта — -`toolchain/vscode-sprinter-debug`. Только оно знает формат source-debug +Для build/run/debug используется отдельный проект `VSCode-Sprinter`. Только +его расширение знает формат source-debug пакета, загрузку приложения через DSS, банки Sprinter и DAP-сессию MAME. Microsoft C/C++ или clangd можно поставить дополнительно ради completion, @@ -41,7 +41,7 @@ pyenv exec make -C tests/hello SRC_DEBUG=1 Из корня репозитория откройте VS Code с распакованным расширением: ```sh -code --extensionDevelopmentPath="$PWD/toolchain/vscode-sprinter-debug" "$PWD" +code --extensionDevelopmentPath="/путь/к/VSCode-Sprinter" "$PWD" ``` Если команда `code` не добавлена в `PATH`, на macOS этого проекта доступен @@ -50,10 +50,16 @@ code --extensionDevelopmentPath="$PWD/toolchain/vscode-sprinter-debug" "$PWD" ```sh "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code" \ --new-window \ - --extensionDevelopmentPath="$PWD/toolchain/vscode-sprinter-debug" \ + --extensionDevelopmentPath="/путь/к/VSCode-Sprinter" \ "$PWD" ``` +В локальных настройках workspace задайте `sprinterDebugger.sdkRoot` и +`sprinterDebugger.mameHome`. Первый указывает на установленный C-Compiler, +второй — на среду `MAME/runtime` с бинарником, ROM и DSS/CHD. Для выбора +stock/sdbg или нестандартной установки используются поля `mameBin`, +`mameRompath`, `mameDssImage`, `mameSystemHddImage`, `mameBios` профиля launch. + Расширение в режиме `auto` использует `~/.pyenv/shims/python` при наличии local `.python-version`; для внешнего workspace ищет установленный `~/.pyenv/versions/3.12*/bin/python`, затем `.venv/bin/python` и известные @@ -98,8 +104,29 @@ service-точка `main` и вводится `a:\\HELLO.EXE`. После сов наличие prompt всё равно обязательно. Перед вводом сохраняется диагностический снимок DSS. -Дополнительные файлы на floppy задаются массивом `data`, путь к другому MAME — -полем `mame`. +Для перенесённого SprPoP его workspace содержит локальный профиль F5: + +```json +{ + "type": "sprinter-mame", + "request": "launch", + "name": "Sprinter: SprPoP (VS Code)", + "build": "${workspaceFolder}/build/.sprinter-cc-sprpop", + "buildTarget": "hdd", + "appHdd": "${workspaceFolder}/build/hdd/sprpop.chd", + "launchPath": "d:\\games\\sprpop\\sprpop.exe" +} +``` + +Расширение перед F5 запускает `make SRC_DEBUG=1 hdd` в каталоге игры, +затем загружает EXE с её локального диска. Для такого профиля нужен +`SPRINTER_ROOT` только на этапе сборки и `MAME_HOME` при запуске. + +Дополнительные файлы на floppy задаются массивом `data`; для приложения с +собственным CHD задайте `appHdd`, `launchPath` и `buildTarget: "hdd"`. +Launcher монтирует временную копию CHD как `-hard2`, а DSS вводит путь EXE +из `launchPath`. Сам debug EXE остаётся также на временной A: для проверки +сигнатуры; несовпадение кода на диске с пакетом отладки останавливает launch. ## Ручная проверка VS Code @@ -117,7 +144,7 @@ service-точка `main` и вводится `a:\\HELLO.EXE`. После сов launcher дождётся prompt DSS, введёт `A:\\HELLO.EXE` и VS Code остановится в `main`. 4. Проверьте Call Stack, scope Registers и Debug Console. После Continue - должна сработать подтверждённая точка строки 31 по адресу `0x824b`. + должна сработать подтверждённая точка строки 31. 5. На остановке проверьте F11 и F10. Курсор должен переходить только после фактической остановки CPU, а не сразу после отправки команды. На строке 62 (`getchar`) нажмите F10, щёлкните окно Sprinter MAME и нажмите латинскую `x`: @@ -205,16 +232,19 @@ reset в native console обходят модель состояния VS Code; локального RPC и launcher; выбор `windows` решает только сторону MAME и не обеспечивает работу VS Code-интеграции. -Backend `sdbg` входит как воспроизводимый patch к MAME 0.287. Для локального -checkout достаточно: +Backend `sdbg` входит как воспроизводимый patch к MAME 0.287. Исходники и +рецепты теперь принадлежат самостоятельному проекту MAME: ```sh -make mame-sdbg +cd /путь/к/MAME +scripts/sprinter/build-variants.sh stock +scripts/sprinter/build-variants.sh sdbg ``` -Команда идемпотентно применяет -`toolchain/mame-patches/0001-sdbg-debugger-backend.patch`, инкрементально -собирает MAME и устанавливает `mame/v306/mame.arm`. +В fork patch уже зафиксирован в Git; для чистого baseline сохранён +`scripts/sprinter/apply-sdbg-patch.sh`. Каждый вариант копируется в +`MAME_HOME/bin/stock/mame.arm` или `MAME_HOME/bin/sdbg/mame.arm` без подмены +активного `MAME_HOME/mame.arm`. ## Logpoints diff --git a/examples/.gitignore b/examples/.gitignore deleted file mode 100644 index 1e6abea..0000000 --- a/examples/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -local.mk -build/ -.sprinter-cc-*/ -.resource-stamps/ -.disk_tmp/ -*.exe -*.asm -*.lst -*.lk -*.ihx -*.noi -*.sym -*.map -*.rel -*.cdb -*.mem -*.rst -__pycache__/ -*.py[cod] -.DS_Store -._* -.vscode/ diff --git a/examples/.python-version b/examples/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/examples/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/examples/LICENSE b/examples/LICENSE deleted file mode 100644 index a738358..0000000 --- a/examples/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index 455cf6c..0000000 --- a/examples/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# Примеры Sprinter-CC: каждый образ и сборка принадлежат своему примеру. -EXAMPLES := balls mdview mdview2 rpgwalk scroll space -.PHONY: all clean $(EXAMPLES) - -all: $(EXAMPLES) - -$(EXAMPLES): - $(MAKE) -C $@ - -clean: - @for project in $(EXAMPLES); do $(MAKE) -C $$project clean || exit 1; done diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 2b8f604..0000000 --- a/examples/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Примеры Sprinter-CC - -Один репозиторий демонстраций SDK: `balls`, `mdview`, `mdview2`, -`rpgwalk`, `scroll`, `space`. Каждая программа собирается отдельно, а её -дискета находится в `build/media/` внутри каталога примера. - -Для сборки укажите путь к установленному SDK: - -```sh -export SPRINTER_ROOT=/путь/к/C-Compiler -make # все примеры -make -C mdview2 # один пример -make -C mdview2 floppy -``` - -Для запуска дополнительно укажите `MAME_HOME` — каталог подготовленной -среды MAME с `mame.arm`, `roms/` и `IMG/`. `MAME_BIN`, `MAME_ROMPATH`, -`MAME_DSS_IMAGE`, `MAME_SYSTEM_HDD_IMAGE`, `MAME_BIOS` переопределяют -отдельные пути/вариант. Персональные значения можно хранить в игнорируемом -`local.mk`; после перемещения репозитория соседство с SDK не требуется. -Исходник RPG-спрайта хранится в `third_party/16x16-RPG-characters` вместе -с лицензией и нужен только `rpgwalk`. diff --git a/examples/balls/Makefile b/examples/balls/Makefile deleted file mode 100644 index c47c1d3..0000000 --- a/examples/balls/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -EXAMPLE := balls -EXTRA_FLAGS ?= --gfx 256 -include $(CURDIR)/../sdk.mk diff --git a/examples/balls/balls.c b/examples/balls/balls.c deleted file mode 100644 index c3edad1..0000000 --- a/examples/balls/balls.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * balls — демо спрайтового движка v2 (): N шаров 16×16 летают - * над чёрно-белой шахматкой, отражаясь от краёв. Esc — выход. - * - * РАНЬШЕ (до движка) приложение вело drawn[2][N] координаты вручную и - * само соблюдало дисциплину «heal ВСЕ → блит ВСЕ» на скрытой странице. - * Теперь это работа движка: sprite_move меняет только состояние, - * sprite_flip(sp, N) за кадр делает draw-page=скрытая → heal все старые → - * блит все видимые (одна W3-скобка + один банк на проход) → vsync → флип. - * Учёт drawn[2] спрятан в sprite_t. Профиль/дизайн: - * docs/sprite-api-design.md §9.1. - * - * BOUNDARY-ТЕСТ клипа: диапазон движения выходит ЗА края экрана на - * половину спрайта — шары штатно наполовину уходят за все 4 края, - * включая ОТРИЦАТЕЛЬНЫЕ x/y слева/сверху. Клип _gfx_blit_clip (общий - * для putsprite и движка) обязан авто-обрезать: правый/нижний — урезать - * w/h, левый/верхний — сдвинуть начало источника (sx/sy) и урезать. - * - * Двойная буферизация: рисуем на скрытой странице, флип по vsync (иначе - * heal+блит на видимой ловятся лучом — мерцание). Палитру страницы 1 - * зеркалим из 0 (initgraph грузит EGA только в палитру 0). - * - * Скорость привязана к КАДРАМ (50 Гц): один проход цикла = один шаг. - */ - -#include -#include -#include -#include -#include - -#define FPS_METER 1 /* 1 = счётчик кадров/с слева-сверху (диагностика) */ - -#define NBALLS 16 /* количество шаров */ -#define BW 16 /* сторона спрайта */ -#define CELL 16 /* клетка шахматки */ - -/* Диапазон отражения — на пол-спрайта ЗА каждым краем (boundary-тест): - * x ∈ [-8 .. 312], y ∈ [-8 .. 248]. */ -#define MINY (0) /* -8: половина за левым/верхним краем */ -#define MINX (0) /* -8: половина за левым/верхним краем */ -#define MAXX (320 - BW) /* 312: половина за правым краем */ -#define MAXY (256 - BW) /* 248: половина за нижним краем */ - -/* Цвета шаров (не совпадают с фоном BLACK/WHITE) */ -static const uint8_t ball_colors[] = { - YELLOW, LIGHTRED, LIGHTGREEN, LIGHTCYAN, - LIGHTMAGENTA, LIGHTBLUE, RED, GREEN -}; -#define NCOLORS ((uint8_t)sizeof(ball_colors)) - -static sprite_t sp[NBALLS]; /* спрайты — движок ведёт drawn[2] */ -static int8_t vx[NBALLS], vy[NBALLS]; /* направление ±1 (физика — наша) */ -static uint8_t spr[NCOLORS][4 + BW * BW]; /* по спрайту на цвет */ -static uint8_t egapal[16 * 4]; - -static void build_sprites(void) -{ - uint8_t c; - int x, y; - - for (c = 0; c < NCOLORS; c++) { - uint8_t *p = spr[c]; - - *p++ = BW; *p++ = 0; *p++ = BW; *p++ = 0; - for (y = 0; y < BW; y++) - for (x = 0; x < BW; x++) { - int dx = 2 * x - (BW - 1), dy = 2 * y - (BW - 1); /* ×2: центр между пикселями */ - *p++ = (dx * dx + dy * dy <= 15 * 15) - ? ball_colors[c] : GFX_TRANSPARENT; - } - } -} - -static void draw_board(void) -{ - int cx, cy; - - for (cy = 0; cy < 256; cy += CELL) - for (cx = 0; cx < 320; cx += CELL) { - setfillstyle(SOLID_FILL, - (((cx ^ cy) >> 4) & 1) ? WHITE : BLACK); - bar(cx, cy, cx + CELL - 1, cy + CELL - 1); - } -} - -static void init_balls(void) -{ - uint8_t i; - - for (i = 0; i < NBALLS; i++) { - sprite_init(&sp[i], spr[i % NCOLORS]); - sp[i].x = (20 + i * 37) % (MAXX - 1) + 1; - sp[i].y = (20 + i * 53) % (MAXY - 1) + 1; - sprite_show(&sp[i]); - vx[i] = (i & 1) ? 1 : -1; - vy[i] = (i & 2) ? 1 : -1; - } -} - -#if FPS_METER -/* Кадров за последнюю RTC-секунду — белым в чёрной плашке слева-сверху - * на ТЕКУЩЕЙ draw-странице (рисуем ДО sprite_update, чтобы шары легли - * поверх и heal учитывал плашку через ОЗУ-копию). */ -static void show_fps(uint8_t v) -{ - char buf[4]; - - buf[0] = (char)('0' + (v / 100) % 10); - buf[1] = (char)('0' + (v / 10) % 10); - buf[2] = (char)('0' + v % 10); - buf[3] = 0; - setcolor(WHITE); - setfillstyle(SOLID_FILL, BLACK); - bar(0, 0, 27, 9); - outtextxy(2, 1, buf); -} -#endif - -int main(void) -{ - uint8_t i, page, hidden; -#if FPS_METER - datetime_t dt; - uint8_t frames = 0, last_sec; -#endif - - build_sprites(); - initgraph(); - gfx_sprite_clip(0); - - /* Палитра страницы 1 = палитре страницы 0. */ - gfx_pal_get(0, 0, 16, egapal); - gfx_pal_load(1, 0, 16, egapal); - - init_balls(); - - /* Обе страницы: шахматка (в ОЗУ-копию — бэкап для heal) + шары в - * стартовых позициях (sprite_update рисует на текущей draw-странице - * и снимает её dirty-бит). */ - for (page = 0; page < 2; page++) { - gfx_set_draw_page(page); - draw_board(); - sprite_update(sp, NBALLS); - } - gfx_set_visible_page(0); -#if FPS_METER - getdatetime(&dt); - last_sec = dt.second; -#endif - - for (;;) { - if (kbhit() && getch() == 27) - break; - - /* Физика: обновить позиции (только состояние спрайтов). */ - for (i = 0; i < NBALLS; i++) { - int nx = sp[i].x + vx[i]; - int ny = sp[i].y + vy[i]; - if (nx <= MINX || nx >= MAXX) vx[i] = -vx[i]; - if (ny <= MINY || ny >= MAXY) vy[i] = -vy[i]; - sprite_move(&sp[i], nx, ny); - } - - /* Кадр: рисуем на скрытой странице. sprite_flip развёрнут, чтобы - * плашку FPS нарисовать на скрытой странице ДО sprite_update. */ - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden); -#if FPS_METER - frames++; - getdatetime(&dt); - if (dt.second != last_sec) { - last_sec = dt.second; - show_fps(frames); - frames = 0; - } -#endif - sprite_update(sp, NBALLS); - gfx_wait_vsync(); - gfx_set_visible_page(hidden); /* флип в vblank — без мерцания */ - } - - closegraph(); - return 0; -} diff --git a/examples/balls/run.sh b/examples/balls/run.sh deleted file mode 100755 index e9e8c78..0000000 --- a/examples/balls/run.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -make clean -make run diff --git a/examples/mdview/Makefile b/examples/mdview/Makefile deleted file mode 100644 index 67c7ba1..0000000 --- a/examples/mdview/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Build mdview.exe — Markdown viewer for Sprinter. -# -# small memory mode: code in W1, data/stack/heap in W2 (32 KB total). -# W3 stays free for the file buffer (EMM-mapped). - -EXAMPLE := mdview -MEMORY := small - -include $(CURDIR)/../sdk.mk - -# ------------------------------------------------------------------ -# Образ дискеты: только mdview.exe + README.MD (перекодированный -# из UTF-8 в CP866 — рабочую кодировку Sprinter). -# -# README.MD хранится в репозитории в UTF-8; iconv -c конвертирует -# его в CP866, отбрасывая символы без аналога в целевой кодировке. -# Результат кладётся в .disk_tmp/README.MD, чтобы make_disk.py -# использовал правильное имя файла на диске. -# -# iconv -c возвращает ненулевой код, если хоть один символ отброшен -# (даже с -c) — это ОЖИДАЕМО при потере символов без аналога в CP866, -# не ошибка конвертации; вывод при этом всё равно корректно записан. -# Поэтому код возврата iconv игнорируется (|| true). -# ------------------------------------------------------------------ -DISK_TMP := .disk_tmp -README_DISK := $(DISK_TMP)/README.MD - -$(DISK_TMP): - mkdir -p $@ - -$(README_DISK): README.MD | $(DISK_TMP) - iconv -c -f UTF-8 -t CP866 README.MD > $@ || true - -floppy: $(EXAMPLE).exe $(README_DISK) - $(PYTHON) $(MAKE_DISK) "$(FLOPPY_IMG)" $(EXAMPLE).exe $(README_DISK) - @echo - @echo "Floppy ready: $(FLOPPY_IMG)" - @echo "Run: make run MAME_HOME=/путь/к/MAME/runtime" - -clean: - rm -rf .sprinter-cc-* $(EXAMPLE).exe $(DISK_TMP) - -.PHONY: all clean floppy run diff --git a/examples/mdview/README.MD b/examples/mdview/README.MD deleted file mode 100644 index f0d40d8..0000000 --- a/examples/mdview/README.MD +++ /dev/null @@ -1,133 +0,0 @@ -# MDView — Просмотрщик Markdown для Sprinter - -**MDView** — программа для просмотра документов в формате *Markdown* на компьютере -Sprinter (процессор Z80). Документ хранится в отдельном W3 окне и не занимает -основную RAM программы. - -## Возможности - -- Документы до **128 КБ** (8 страниц EMM по 16 КБ каждая) -- До **16 384** экранных строк в индексе -- Автоматический перенос слов по ширине экрана (80 столбцов) -- Горизонтальный сдвиг для широких строк (блоки кода, таблицы) -- Статус-бар: имя файла, диапазон строк, процент прокрутки -- Спиннер в строке состояния во время загрузки и индексации -- Поддержка «мягкого» склеивания строк в абзацах и цитатах - -## Запуск - -``` -mdview [имя_файла.md] -``` - -Если имя файла не задано, загружается `README.MD`. - -## Управление - -``` -Клавиша Действие -───────────── ──────────────────────────────────────── -Up Down Прокрутка на одну строку вверх / вниз -PgUp PgDn Прокрутка на страницу (30 строк) -Home Начало документа -End Конец документа -Left Right Горизонтальный сдвиг (только nowrap-строки) -F1 Окно справки -F10 / Esc Выход из программы -``` - -## Синтаксис Markdown - -### Заголовки - -Поддерживаются уровни H1–H4. Уровни H5 и H6 отображаются как H4. - - # Заголовок первого уровня - ## Заголовок второго уровня - ### Заголовок третьего уровня - #### Заголовок четвёртого уровня - -### Текстовое форматирование - -**Жирный текст** выделяется двойными звёздочками: `**текст**` - -*Курсив* выделяется одиночными звёздочками `*текст*` или знаком подчёркивания `_текст_` - -`Встроенный код` обозначается обратными кавычками - -~~Зачёркнутый текст~~ — двойные тильды: `~~текст~~` - -### Ненумерованный список - -Маркеры `-`, `*` или `+`: - -- Первый пункт списка -- Второй пункт списка -- Третий пункт с достаточно длинным текстом, который при необходимости - будет перенесён на следующую строку с сохранением отступа - -### Нумерованный список - -1. Первый элемент -2. Второй элемент -3. Третий элемент - -### Цитата - -> Блок цитаты начинается с символа `>`. Несколько последовательных -> строк одной цитаты склеиваются в единый абзац с автоматическим -> переносом слов. - -### Блок кода (verbatim) - -Блок кода заключается в тройные обратные кавычки. Внутри блока -текст отображается «как есть» без разбора Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### Горизонтальная линия - -Три или более символов `---`, `***` или `___` на отдельной строке: - ---- - -## Технические характеристики - -- **Платформа:** Sprinter, процессор Z80 @ 21 МГц -- **Кодировка:** CP866 (DOS Cyrillic) -- **Максимальный размер файла:** 128 КБ -- **Максимальное число строк в индексе:** 16 384 -- **Режим памяти:** small - - Код программы, cтек, данные, куча — окнa W1-W2 (32 КБ, адреса 0x4000–0xBFFF). - - Буфер файла — страницы EMM, отображаемые в W3 (0xC000–0xFFFF) - -## TODO - -1. **Увеличение размера документов.** Снять лимит 128 КБ: Достаточно - разрешить работать с большим кол-вом страниц памяти, пока оттестированно - на работе с 8-мю страницами по 16Кб. - -2. **Форматированные таблицы.** Разбирать строки вида `| ячейка | ячейка |` - с автоматическим выравниванием столбцов и отрисовкой разделительных - линий (строки `|---|---|`). На текущий момент таблицы отображаются - как обычные nowrap-строки без выравнивания. - -3. **Поддержка кодировок CP1251 и UTF-8.** Автоопределение кодировки - по BOM, явное указание через аргумент командной строки (`--encoding cp1251`), - возможность переключения кодировки во время просмотра (`F8`). - Нужно прежде всего для документов на русском языке; CP866 кодировака уже поддерживается. - -4. **Ускорение рендеринга.** Кэш строк экрана. Оптимизация цикла вывода - символов через BIOS WRCHAR (пакетный вывод, DMA). - ---- - -*MDView v0.2 · (c) 2026 Петров А.Г.* diff --git a/examples/mdview/SAMPLE.MD b/examples/mdview/SAMPLE.MD deleted file mode 100644 index 130155c..0000000 --- a/examples/mdview/SAMPLE.MD +++ /dev/null @@ -1,5 +0,0 @@ -MDVIEW Sample Document - -This is a sample Markdown file for testing the Sprinter *mdview text -viewer*. Phase 3 adds inline emphasis: bold, italic and underscore -runs render with distinct background colours. diff --git a/examples/mdview/docs/mdview-модель-документа-и-рендеринг.md b/examples/mdview/docs/mdview-модель-документа-и-рендеринг.md deleted file mode 100644 index df7e910..0000000 --- a/examples/mdview/docs/mdview-модель-документа-и-рендеринг.md +++ /dev/null @@ -1,103 +0,0 @@ -# mdview — модель документа и рендеринг (единый смешанный режим) -Дизайн-документ переработки `mdview.c` под новое ТЗ форматирования (`examples/mdview/todo2`). Описывает решение по хранению данных, разбор документа при загрузке, упрощение рендера и снятие лимита на число строк. -## 1. Контекст и главный вопрос -Мы отказываемся от двух режимов показа (Wrap/UnWrap-переключатель) и переходим к единому смешанному режиму: тип переноса задаётся типом блока (обычный текст/заголовки/списки/цитаты — Wrap; код/таблицы — UnWrap). -Главный вопрос: нужно ли хранить оригинальный байтовый контент файла, или при загрузке сразу преобразовать его в «готовый к показу» текст (склеить строки параграфов, убрать маркеры, развернуть отступы и т.п.)? -Ответ: **оригинал храним; отдельный «готовый» текстовый/ячеечный буфер не строим.** «Подготовка при загрузке» реализуется как построение компактного *индекса метаданных*, а не как преобразование *содержимого*. -## 2. Решение по архитектуре -### 2.1 Текущее состояние (база) -* Файл целиком лежит в EMM-страницах (до 8×16 КБ). В окно W3 (`0xC000`) в каждый момент замаплена ровно одна страница; доступ к байту — через `fb()`/`map_page()` (`mdview.c:198-213`). -* Индекс — это параллельные массивы по экранным сегментам: `line_offset[]` (смещение в файле) + битфлаги `cont/nowrap/blank/in_code`, 2-битный `line_kind[]`, `init_style[]` (`mdview.c:122-135`). -* `index_lines()` за один проход уже делает склейку параграфов обычного текста, перенос по словам на 80 колонок и перенос emphasis через soft/hard break (`mdview.c:692-911`). -* `render_line()` при каждой отрисовке заново читает байты из оригинала и заново парсит inline-разметку (`mdview.c:918-1156`). -Вывод: «готовим при загрузке» мы уже делаем — но готовим **индекс**, а не текст. -### 2.2 Почему не материализуем содержимое -* **Одно свободное окно W3.** Режим памяти `small`: код в W1, данные/стек/куча в W2, для банкуемых данных свободен только W3. Преобразование «оригинал → готовый буфер» требует одновременно держать замапленными исходную страницу (чтение) и страницу-приёмник (запись). При единственном окне это поток swap-ов на каждую границу. In-place преобразование тоже невозможно: склейка меняет длины, смещения «съезжают», параграф пересекает границу 16 КБ. -* **Удвоение памяти и срыв гарантии 128 КБ.** Оригинал может занимать все 8 страниц; готовой копии нужны свои страницы — гарантировать, что влезут обе, нельзя. -* **Готовая форма не обязательно меньше.** Снятие маркеров экономит байты, но добавляются отступы-продолжения у переносов списков/цитат. В лучшем случае ≈ размер оригинала, в худшем — больше. Ячеечная модель (символ+атрибут) — это ×2 (до 256 КБ), невозможно. -* **Покадровая стоимость и так мала.** За кадр рисуются только 30 видимых строк (~30×80 чтений). Единственный дорогой проход — `index_lines()` — неизбежен в любой архитектуре (нужен полный скан для `n_lines` и процента прокрутки). -### 2.3 Что реально оптимизировать -Не текст, а повторную работу `render_line()`: -* вызов `classify_line()` на каждый кадр (`mdview.c:984`); -* обратный проход к первому не-cont сегменту ради отступа продолжения (`mdview.c:944-970`). -Это снимается переносом результата классификации (`kind`, ширина отступа/контент-колонка) в сам индекс на этапе `index_lines()`. -## 3. Модель данных индекса -### 3.1 Запись сегмента -Единая запись на экранный сегмент полностью заменяет нынешние параллельные массивы (`line_offset`, `cont_flag`, `in_code`, `nowrap_flag`, `blank_flag`, `line_kind`, `init_style`); `index_lines()` переписывается с нуля под эту модель. Цель размера записи — 5–6 байт: -* `offset` — 3 байта (24-битное смещение в файле, покрывает 128 КБ). -* `flags` — 1 байт: биты `cont`, `nowrap`, `blank`, `in_code` + 2-битный `ckind` (тип продолжения: PLAIN/QUOTE/LIST/OTHER). -* `style` — 1 байт: стартовый стиль сегмента (`init_style`, теперь включая STRIKE) + при необходимости глубина вложенности. -* `indent` — 1 байт: предвычисленная контент-колонка/ширина префикса, чтобы рендер не вызывал `classify_line()` и не делал обратный проход. -### 3.2 Размещение и снятие лимита `MAX_LINES` -Проблема: `line_offset` сейчас `uint32_t[2048]` = 8 КБ, `init_style` = 2 КБ; суммарно статический индекс ~11.6 КБ near-памяти (W2). Рост лимита в near невозможен — W2 переполнится. -Решение: -* **Индекс храним в отдельном EMM-блоке** (свои страницы, помимо файловых), доступ — через тот же W3. -* **Near-кэш viewport**: перед отрисовкой кадра разово вычитываем записи для `VIEW_H+1` видимых сегментов в маленький near-массив (≈ `(VIEW_H+1)×6` ≈ 186 байт). Рендер работает по near-кэшу + читает только контент-страницы. Это устраняет per-byte thrashing между страницей индекса и страницей контента: переключений на кадр — единицы, а не тысячи. -* **Динамический размер**: число страниц под индекс выделяем пропорционально размеру файла (число сегментов ∈ размеру). `MAX_LINES` становится функцией от выделенных страниц индекса. Это прямо ложится на заметку v2 («чем больше банков под файл, тем больше буферы»). -* **Без регресса скорости при индексе в EMM**: чтобы вынос индекса в банки не замедлил сборку (W3 делится между чтением контента и записью индекса), записи копим в near-буфере батчами и сбрасываем в EMM-блок через `bank_write()` (он сам сохраняет/восстанавливает маппинг W3). Переключений окна на всю сборку — единицы, а не на каждый сегмент. -* Если индекс-страницы выделить не удалось — деградируем до текущего near-лимита и показываем явную диагностику обрезки (а не молчаливый обрыв в `emit_seg()` — `mdview.c:574`). -## 4. `index_lines()` — разбор по новому ТЗ -Единый проход по файлу строит сегменты. Деление на параграфы — по пустым строкам; несколько пустых строк подряд схлопываются в одну. -### 4.0 Скорость подготовки — главный приоритет -Требование: подготовка максимально быстрая (сейчас ~25 КБ готовятся 6–10 с). Две структурные причины медленности и их устранение: -* **Per-byte `fb(uint32_t)`.** Каждый доступ к байту пересчитывает страницу 32-битными `p >> 14` и `p & 0x3FFF` (`mdview.c:209-213`). На Z80 32-битная арифметика — это программные подпрограммы на каждый символ. Замена: **потоковый разбор** — мапим страницу один раз, идём по окну `char *`/16-битным индексом, страницу переключаем только на границе 16 КБ. 32-битным остаётся лишь сохраняемый в индекс `offset`. -* **Многократные пере-сканы.** На каждом `\n` внутри параграфа вызываются `is_fence_raw()`, `is_hr_raw()`, `classify_line()`, `is_line_blank()` (`mdview.c:800-809`) — каждая заново сканирует следующую строку, а `classify_line()` ещё и повторяет цикл детекции HR. Для параграфа из N строк — O(N×длина) лишней работы. Замена: **один проход** — каждую строку классифицируем ровно один раз в момент её начала, lookahead — минимальный (несколько первых байт). -* **32-битные сравнения.** Курсор скана — (страница:8 бит, смещение:16 бит); сравнение с концом — сначала по странице, потом 16-битно. -Ожидаемый эффект: подготовка — по сути один линейный проход с 16-битными операциями, кратное ускорение относительно текущего multi-pass + 32-bit. (`render_line()` может остаться на `fb()` — там только ~30×80 байт за кадр.) -### 4.1 Обычный текст (Wrap) -* **Soft break** (одиночный `\n`): склейка, следующая строка продолжается через пробел. -* **Wide break**: 2+ пробелов перед `\n` **или** символ `\` перед `\n` → принудительный перенос внутри параграфа, стиль сохраняется. (Текущий код ловит только 2 пробела — `mdview.c:813-818`; добавить ветку для `\`.) -* **Hard break** (пустая строка): новый параграф, отделяется ОДНОЙ пустой строкой независимо от числа пустых строк в оригинале. -* **Модификаторы** bold/italic/strike/code действуют через soft/wide break внутри параграфа и сбрасываются на границе параграфа. (Добавить STRIKE `~~…~~` — сейчас его нет в `INIT_STYLE_*`/`ATTR_*`.) -### 4.2 Заголовки (Wrap) -Один оригинальный абзац-строка; стартовый стиль по уровню. Во входе распознаём H1–H6, но H4/H5/H6 далее обрабатываются одинаково как H4 (сливаются в один стиль; `classify_line()` уже сворачивает `lvl>4` → `LK_H4`, `mdview.c:488`). Внутри допустимы bold/italic/code/strike. После заголовка всегда пустая строка. -### 4.3 Горизонтальный разделитель HR -Всегда одна строка, после неё всегда пустая строка (новый абзац). -### 4.4 Списки (Wrap) — НОВОЕ: многострочная склейка -* Пункт может занимать несколько оригинальных строк; soft break внутри пункта склеивается через пробел (как обычный текст). Сейчас списки эмитятся построчно (`mdview.c:762-772`) — переписать на paragraph-модель. -* Новая строка с префиксом пункта → новый пункт. -* Пустая строка завершает пункт. Следующая непустая НЕ-пункт строка не является продолжением. -* **Группировка**: если после ОДНОЙ пустой строки идёт снова пункт — это тот же список, пустая строка в показе подавляется (пункты идут вплотную). Только ДВЕ+ пустые строки между пунктами разрывают на разные списки (в показе — одна пустая строка между ними). -* Перенос продолжения пункта печатается с отступом до контент-колонки (для уровня 1 — 2 пробела). -* Незакрытые модификаторы НЕ переносятся на следующий пункт (каждый пункт — свой параграф). -* Вложенные списки поддерживаются (отступ растёт с ведущими пробелами). -* Отдельные стили: префикс маркера и текст списка. -Пример соответствует разделу «Списки» в `todo2` (строки 1–6). -### 4.5 Цитаты (Wrap) -* Отдельный параграф; перед текстом — префикс цитаты, перенесённые строки тоже предваряются префиксом. -* Многострочная склейка как у текста; пустая строка-цитата (`>`) показывается как пустая строка с префиксом. -* Вложенность (`> >` → двойной префикс). Отдельные стили: префикс и текст цитаты. -### 4.6 Блок кода ``` ``` ``` (UnWrap) -Весь блок одним стилем кода, без inline-модификаторов. После блока обязательна пустая строка. Строки не переносятся (truncate + горизонтальный скролл). -### 4.7 Таблицы (UnWrap) -Пока as-is, без переноса. Выравнивание столбцов — v2. -## 5. `render_line()` — упрощение -* Убрать ветку truncate-режима и `wrap_mode` (уже частично снято; `toggle_wrap()` — мёртвая заглушка `mdview.c:1286-1291`, удалить вместе с упоминаниями F2). -* Не вызывать `classify_line()` и не делать обратный проход: использовать `kind`/`indent`/`style` из индекса. -* Для cont-сегментов списков/цитат — печать отступа/префикса по `kind`+`indent` из записи сегмента. -* Inline-парсинг emphasis выполняется только в пределах видимого сегмента (дёшево); для кода/таблиц — отключён. -## 6. Горизонтальный скроллинг (UnWrap) -* Скроллится только UnWrap-текст (код/таблицы). Грануляция 8 символов (`HPAN_STEP`). -* Правый край: индикатор `>` своим стилем, если есть скрытый контент справа (есть — `mdview.c:1135-1155`). -* **Добавить** левый индикатор `<` в первой колонке, когда `viewport_x > 0`. -* **Границы скролла по факту**: текущий кламп жёстко до 240 (`mdview.c:1275`). Заменить на вычисление максимального переполнения среди UnWrap-строк в текущем viewport, чтобы вправо нельзя было уйти за самую длинную строку, а влево — до колонки 0. -## 7. Чеклист расхождений с текущим кодом -* [индекс] Перейти на запись-на-сегмент в EMM-банке + near-кэш viewport; снять `MAX_LINES=2048`. -* [скорость] Потоковый разбор: один проход, 16-битный курсор в окне (без per-byte `fb()` с 32-битной арифметикой), классификация строки один раз, минимальный lookahead; батч-флеш индекса. -* [текст] Wide break по символу `\`. -* [текст] Модификатор strikethrough `~~…~~` (+ стиль). -* [списки] Многострочная склейка пунктов и правило группировки по одной/двум пустым строкам. -* [цитаты] Многострочная склейка и повтор префикса (в т.ч. вложенные) на переносах. -* [заголовки] Читать H1–H6; H4/H5/H6 трактовать как H4 (частично уже есть — `mdview.c:488`). -* [скролл] Индикатор `<` и корректные границы по фактическому переполнению. -* [рендер] Снять per-кадровый `classify_line()` и обратный проход (данные — из индекса). -* [очистка] Удалить `toggle_wrap()` и упоминания F2 (`mdview.c:1286-1291`, `1311`). -## 8. Память: бюджет -* near (W2): текущий статический индекс ~11.6 КБ — у предела окна. После переноса `line_offset`/`init_style` в EMM в near остаётся near-кэш viewport (~0.2 КБ) + мелкие флаги → запас под стек/кучу растёт. -* EMM: файл до 8 страниц + индекс ~1–2 страницы (при 5–6 байт/сегмент и нескольких тысячах сегментов). Перед выделением проверять `mem_info()` на доступность страниц. -## 9. Заметки для v2 -* **Прогрессивный показ**: отрисовать первую страницу (первые ~30 сегментов) ДО завершения полной подготовки; остальное доиндексировать дальше или по мере прокрутки. Процент и `End` показывать как «вычисляется», пока не готов полный `n_lines`. (Синергия с потоковым разбором §4.0: первый экран готов после разбора лишь нескольких КБ.) -* Разделители переноса Wrap: точка/запятая/`!`/`?`/дефис; правило «новая строка не начинается с разделителя», серия разделителей остаётся на первой строке. -* Таблицы: вычисление ширины столбцов и выравнивание. -* Подсветка синтаксиса внутри блоков кода. -* URL/Images и прочие типы строк. diff --git a/examples/mdview/mdview — унифицированный рендеринг (Unified Wrap + Paragraph Model).md b/examples/mdview/mdview — унифицированный рендеринг (Unified Wrap + Paragraph Model).md deleted file mode 100644 index cf30db4..0000000 --- a/examples/mdview/mdview — унифицированный рендеринг (Unified Wrap + Paragraph Model).md +++ /dev/null @@ -1,90 +0,0 @@ -# mdview — унифицированный рендеринг (Unified Wrap + Paragraph Model) - - -## Цель -Отказаться от двух режимов Wrap/Unwrap. Ввести единую модель отображения Markdown-документов, соответствующую стандарту CommonMark: -* Обычный текст: параграфы склеиваются по soft breaks (`\n` → пробел), перенос по словам на 80 колонок. -* Hard break (` \n`): принудительный перенос внутри параграфа. -* Paragraph break (`\n\n`): новый абзац (пустая строка между блоками). -* Fenced code block и таблицы (будущее): не переносятся, работают как truncate + горизонтальный скроллинг + индикатор `>`. -* Горизонтальный скроллинг активен только когда в текущем viewport есть nowrap-строки. - -## Текущее состояние -* `mdview.c` использует `wrap_mode` (0 = truncate, 1 = wrap) и `toggle_wrap()` (F2). -* `index_lines()` делает два разных прохода: truncate (1 строка файла = 1 строка экрана) и wrap (сегментация по SCREEN_W). -* `render_line()` имеет ветвление по `wrap_mode` и `cont`. -* `line_offset[]`, `cont_flag[]`, `in_code[]`, `init_style[]` — существующие структуры. - -## Предлагаемые изменения - -### 1. Новые структуры данных -* Добавить `nowrap_flag[]` (битмап, аналогично `cont_flag[]`): строка не должна переноситься (code block, HR, таблица). -* Добавить `line_kind[]` (2 бита на строку, 512 байт для 2048 строк): хранит классификацию (PLAIN, H1-H4, HR, ULIST, OLIST, QUOTE, CODE, TABLE). Нужен для continuation-сегментов, чтобы render_line знал, какой префикс/отступ повторять. -* Убрать `wrap_mode` и `toggle_wrap()`. -* Убрать truncate-ветку из `index_lines()` и `render_line()`. -* `viewport_x` остаётся глобальным, но применяется только к `nowrap` строкам. - -### 2. Новый `index_lines()` — paragraph scanner -Единый проход по файлу, без двух режимов. - -#### 2.1 Сканирование «сущностей» -Walk по файлу от `p = 0` до `file_size`: -1. Если `fb(p) == '`' × 3 → Fenced code block. Все строки до закрывающего ` ``` ` — `nowrap_flag = 1`, `in_code = 1` (для body), `line_kind = CODE`. Длинные строки не wrap'аются. -2. Если строка начинается с `|...|` (будущее) → Table. `nowrap_flag = 1`, `line_kind = TABLE`. -3. Если строка — HR (`---`/`***`/`___`) → `nowrap_flag = 1`, `line_kind = HR`. 1 строка экрана. -4. Если строка — Header (`#...`), List (`- ` / `* ` / `+ ` / `N. ` / `N) `), Quote (`> `) → начало **Normal paragraph / block**. Обрабатывается как единый параграф до `\n\n` или EOF или code block. -5. Иначе — Normal paragraph (plain text). - -#### 2.2 Normal paragraph — обработка -Внутри параграфа символы читаются как единый поток (не прерываясь на `\n`): -* `\n\n` → конец параграфа. Emit текущую сегментную строку (если есть). Добавить пустую строку (1 строка экрана с нулевой длиной, или offset указывающий на второй `\n`). -* ` \n` (два пробела или таб + пробел перед `\n`) → **Hard break**. Emit текущую сегментную строку. Начать новую сегментную строку с того же абзаца, **сохранив `line_style`**. `prev_ch = ' '`. -* Обычный `\n` → **Soft break**. Считаем как 1 пробел: `visible col++`, `prev_ch = ' '`. Продолжаем текущую сегментную строку. -* Wrap at `SCREEN_W` — так же как сейчас, по `last_space`. При создании continuation-сегмента: `set_cont()`, `set_init_style_raw()` (carry emphasis), `set_line_kind()` (carry list/quote kind для отступа/префикса). -* Emphasis tracking (`line_style`) работает через весь параграф, через soft/hard breaks. - -#### 2.3 Fenced code block — обработка -* Delimiter строка (` `): `line_kind = CODE`, `nowrap_flag = 1`, рендерится как пустая строка (или строка с ` ` — но сейчас пустая). -* Body строки: каждая физическая строка = 1 строка экрана. `nowrap_flag = 1`, `in_code = 1`, `line_kind = CODE`. Нет inline parsing, нет wrap. -* Если строка длиннее `SCREEN_W` — truncation (не wrap). `render_line()` рисует `>` в последней колонке, если есть content за пределами `SCREEN_W + viewport_x`. - -#### 2.4 List continuation -* Первая строка list item: `line_kind = ULIST/OLIST`, `marker_visible_col` определяет отступ. Текст начинается после маркера. -* Wrap внутри list item: `set_line_kind()` = тот же `ULIST`/`OLIST`. `render_line()` для continuation-сегмента не рисует маркер, но добавляет отступ = `marker_visible_col` (т.е. количество пробелов до текста первой строки). -* Для вложенных списков отступ растёт, потому что `marker_visible_col` учитывает ведущие пробелы. - -#### 2.5 Quote continuation -* Первая строка quote: `line_kind = QUOTE`, `marker_visible_col` = отступ + 2 (для `│ `). -* Wrap внутри quote: `set_line_kind()` = `QUOTE`. `render_line()` для continuation рисует префикс `│ ` (или пробелы, если символ не нужен на всех кроме первой строки). - -### 3. Изменения в `render_line()` -* Убрать ветку `if (!wrap_mode)` (truncate mode больше не существует). -* Добавить `if (is_nowrap(line_idx))`: применяется `viewport_x`, отображается `>` в колонке 79 если контент выходит за пределы. -* Для `cont` сегментов (wrap continuation): - * Если `line_kind` == `QUOTE`: повторить префикс отступа + `│ ` (или только отступ, если решено показывать `│` только на первой строке). - * Если `line_kind` == `ULIST`/`OLIST`: повторить отступ = `marker_visible_col` (без маркера/цифр). Текст начинается с той же колонки, что и на первой строке item. - * Для plain text: просто продолжить текст без префиксов. -* Для `nowrap` строк: применять `viewport_x` как смещение. Текст сдвигается влево, скрытые символы не рисуются. Если за пределами видимой зоны есть ещё контент — `>` в колонке 79. - -### 4. Горизонтальный скроллинг -* `scroll_h()` проверяет: есть ли в текущем viewport (top_line .. top_line+VIEW_H-1) хотя бы одна строка с `nowrap_flag == 1`. Если нет — return (no-op). -* Для `nowrap` строк `render_line()` использует `viewport_x` при отображении: символы с `cc < viewport_x` пропускаются, `cc >= viewport_x` рисуются. -* Для wrap-строк `viewport_x` игнорируется (эффективно = 0). -* При `Home`/`End`/`PgUp`/`PgDn`/`Up`/`Down` — `viewport_x` не сбрасывается (пользователь может скроллить по вертикали, оставаясь на горизонтальном смещении для code block). - -### 5. Очистка и навигация -* Убрать `wrap_mode`, `toggle_wrap()`. -* Убрать F2 из меню и help. -* `scroll_up`/`scroll_down`/`scroll_h`/`clamp_top` — обновить без ссылок на `wrap_mode`. -* `calc_pct` и статусная строка — обновить, убрать ссылку на wrap/unwrap. - -### 6. Порядок реализации (по файлу mdview.c) -1. **Структуры данных**: добавить `nowrap_flag[]`, `line_kind[]`, убрать `wrap_mode`. -2. **`index_lines()`**: полностью переписать в paragraph scanner. Это самый сложный и объёмный блок. -3. **`render_line()`**: убрать truncate, добавить nowrap/quote/list continuation, добавить `viewport_x` для nowrap. -4. **`scroll_h()`**: добавить проверку наличия nowrap в viewport. -5. **Очистка**: убрать toggle_wrap, обновить меню/help, обновить main() (убрать F2). -6. **Тестирование**: soft breaks, hard breaks, paragraph breaks, emphasis через soft breaks, fenced code blocks, list wrap с отступом, quote wrap с префиксом, горизонтальный скролл только для code. - -## Orchestration -План реализуется одним агентом (последовательно в одном файле), параллелизм не требуется. Дочерние агенты не используются. \ No newline at end of file diff --git a/examples/mdview/mdview.c b/examples/mdview/mdview.c deleted file mode 100644 index ab472f3..0000000 --- a/examples/mdview/mdview.c +++ /dev/null @@ -1,2024 +0,0 @@ -/* - * mdview — просмотрщик Markdown для Sprinter. - * - * Разметка экрана (80x32): - * строка 0 — статус-бар (имя файла / диапазон строк / всего / %) - * строки 1..30 — область документа (30 видимых строк текста) - * строка 31 — меню (F1 Help / F2 Reserved / F10 Exit) - * - * Навигация: - * стрелки, PgUp/PgDn, Home/End, F1 (справка), F10/Esc (выход). - * Горизонтальный сдвиг доступен только для nowrap-строк. - * - * Память: - * CODE → W1 (режим sprinter-cc --memory small) - * STACK/HEAP/DATA → W2 - * Буфер файла → страницы EMM (до 8 × 16 КБ = 128 КБ), - * отображаемые в W3 по требованию через fb()/map_page(). - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* ---- Геометрия экрана -------------------------------------------- */ - -#define SCREEN_W 80 -#define SCREEN_H 32 -#define VIEW_TOP_ROW 1 -#define VIEW_H 30 /* видимая область: строки 1..30 включительно */ -#define MENU_ROW 31 -#define TAB_STOP 4 - -/* ---- Параметры файла и памяти ------------------------------------ */ - -#define PAGE_BITS 14u -#define PAGE_SIZE (1u << PAGE_BITS) /* размер EMM-страницы: 16 КБ */ -#define PAGE_MASK ((uint16_t)(PAGE_SIZE - 1u)) -#define MAX_PAGES 8 /* 8 страниц × 16 КБ = 128 КБ */ -#define MAX_FILE ((uint32_t)MAX_PAGES * PAGE_SIZE) /* максимальный размер файла: 131072 байт */ -// #define MAX_LINES 2048 -#define FILE_BUF ((char *)0xC000) /* окно W3, куда мапится текущая EMM-страница */ - -/* ---- Палитра атрибутов ------------------------------------------- */ - -static const uint8_t md_pallete[16 * 4] = { - 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, - 0xC8, 0xC8, 0xC8, 0x00, - 0xA0, 0xA0, 0x80, 0x00, - 0xFF, 0xAA, 0xAA, 0x00, - 0xAA, 0xFF, 0xAA, 0x00, - 0xFF, 0xFF, 0xAA, 0x00, - 0xAA, 0xAA, 0xFF, 0x00, - 0xFF, 0xAA, 0xFF, 0x00, - 0xAA, 0xFF, 0xFF, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF -}; - -#define ATTR_RESET COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_TEXT COLOR(COLOR_LIGHTGRAY, COLOR_BLUE) -#define ATTR_TEXT_TITLE1 COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_TEXT_TITLE2 COLOR(COLOR_LIGHTBLUE, COLOR_BLUE) -#define ATTR_TEXT_TITLE3 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_TITLE4 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_BOLD COLOR(COLOR_LIGHTRED, COLOR_BLUE) -#define ATTR_TEXT_ITALIC COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_UNDERSORE COLOR(COLOR_LIGHTMAGENTA, COLOR_BLUE) -#define ATTR_TEXT_CODE COLOR(COLOR_WHITE, COLOR_BLUE) -#define ATTR_TEXT_STRIKE COLOR(COLOR_DARKGRAY, COLOR_BLUE) -#define ATTR_LIST_MARKER COLOR(COLOR_LIGHTCYAN, COLOR_BLUE) -#define ATTR_QUOTE_MARKER COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_HR COLOR(COLOR_LIGHTGRAY, COLOR_BLUE) -#define ATTR_TRUNC COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_BAR COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_BAR_SPINNER COLOR(COLOR_WHITE, COLOR_LIGHTCYAN) -#define ATTR_MENU_T COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_MENU_K COLOR(COLOR_YELLOW, COLOR_BLACK) - -/* ---- Атрибуты диалога справки ------------------------------------ */ - -#define ATTR_HELP_BG COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_HELP_BDR COLOR(COLOR_WHITE, COLOR_BLACK) -#define ATTR_HELP_TIT COLOR(COLOR_YELLOW, COLOR_BLACK) -#define ATTR_HELP_HDR COLOR(COLOR_WHITE, COLOR_BLACK) -#define ATTR_HELP_HINT COLOR(COLOR_YELLOW, COLOR_BLACK) - -/* Геометрия диалога справки (в символьных координатах 80×32). */ -#define HELP_X 8u /* левая граница рамки */ -#define HELP_Y 4u /* верхняя граница рамки */ -#define HELP_W 64u /* ширина рамки (включая │) */ -#define HELP_H 22u /* высота рамки (включая ─) */ - -/* ---- Глобальное состояние ---------------------------------------- */ - -/* Файл до 128 КБ хранится в наборе EMM-страниц (до 8 шт. по 16 КБ). - * В окно W3 одновременно отображается только одна страница (FILE_BUF): - * функция fb() при необходимости переключает маппинг и кэширует текущую - * страницу в cur_page, чтобы не делать лишние переключения. - * - * Индекс экранных сегментов хранится отдельно в EMM (записи по 8 байт, - * одна запись на видимую строку). Каждая запись содержит: - * - смещение первого байта сегмента в исходном файле, - * - флаги (continuation/nowrap/blank/code), - * - начальный inline-стиль сегмента. - * Правая граница сегмента определяется смещением следующей записи. - * Такой подход освобождает около 11 КБ ближней RAM и снимает старый - * лимит MAX_LINES для near-массивов. - */ - -/* В SDCC/z80 критично явно инициализировать static-переменные (`= 0`). - * Неинициализированные static-объекты могут конфликтовать по размещению - * и перезаписывать друг друга. См. заметку memory/sdcc_static_storage_gotcha. */ -/* Компактная запись индекса сегмента. - * Каждый элемент соответствует одной строке рендера в viewport. */ -typedef struct idx_rec_s { - uint32_t off; /* смещение первого байта исходного текста для сегмента */ - uint8_t flags; /* битовые флаги IF_* ниже */ - uint8_t style; /* начальный стиль INIT_STYLE_* в начале сегмента */ - uint8_t pad0; /* добивка до 8 байт (2048 записей на страницу 16 КБ) */ - uint8_t pad1; -} idx_rec_t; - -#define INDEX_REC_SIZE 8u -#define INDEX_RECS_PER_PAGE 2048u /* 16384 / 8; запись всегда целиком в одной странице */ -#define MAX_INDEX_PAGES 8u /* максимум 8 * 2048 = 16384 сегментов индекса */ - -#define IF_CONT 0x01u /* сегмент является продолжением перенесённой строки */ -#define IF_NOWRAP 0x02u /* строка не переносится (кодовый блок / HR / таблица) */ -#define IF_BLANK 0x04u /* визуально пустая строка */ -#define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */ - -static uint16_t n_lines = 0; -static uint16_t max_lines = 0; /* ёмкость индекса: index_pages * 2048 */ -static uint16_t top_line = 0; -static uint32_t file_size = 0; -static uint8_t file_blk = 0; -static uint8_t file_pages = 0; -static uint8_t file_phys[MAX_PAGES] = {0}; -static uint8_t index_blk = 0; -static uint8_t index_pages = 0; -static uint8_t index_phys[MAX_INDEX_PAGES] = {0}; -static uint8_t index_truncated = 0; /* выставляется при исчерпании ёмкости индекса */ -static uint32_t cur_seg_off = 0; /* смещение последнего emit_seg (кэш в near-памяти) */ -static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */ -static uint8_t cur_page = 0xFF; /* 0xFF = в W3 ещё не отображена ни одна страница */ -static uint8_t viewport_x = 0; /* горизонтальный сдвиг для nowrap-строк */ -static char filename[64] = {0}; - -#define HPAN_STEP 8u - -/* Спиннер в статус-баре (col=8,row=0). - * Включается во время загрузки/индексации, чтобы показать, - * что программа занята и не зависла. */ -#define SPINNER_COL 8 -static const char spinner_chars[4] = { '|', '/', '-', '\\' }; -static uint8_t spinner_phase = 0; -static uint8_t spinner_active = 0; - -/* ================================================================== - * Вспомогательные функции - * ================================================================== */ - -/* Печатает строку с указанным атрибутом, начиная с позиции (x,y), - * и останавливается на конце строки или правой границе экрана. - * `s` — литерал/статический буфер (CODE/DATA, окна 1/2), поэтому его - * можно передать в BIOS LP_PRINT_LN напрямую, без промежуточной копии. */ -static void put_str_attr(uint8_t x, uint8_t y, const char *s, uint8_t attr) -{ - uint8_t maxlen = (x < SCREEN_W) ? (uint8_t)(SCREEN_W - x) : 0; - uint8_t len = (uint8_t)strlen(s); - if (len > maxlen) len = maxlen; - if (len == 0) return; - bios_set_place(y, x); - bios_writeattr(s, len, attr); -} - - -/* Полностью очищает указанную строку экрана символами пробела с attr. */ -static void fill_row(uint8_t y, uint8_t attr) -{ - bios_set_place(y, 0); - bios_fillcharattr(' ', attr, SCREEN_W); -} - -/* Продвигает спиннер на один кадр. - * Если спиннер выключен — функция ничего не делает. */ -static void spinner_tick(void) -{ - if (!spinner_active) return; - wrchar(SPINNER_COL, 0, spinner_chars[spinner_phase & 3], ATTR_BAR_SPINNER); - spinner_phase++; -} - -/* Включает/выключает спиннер. - * При выключении очищает его позицию пробелом в статус-баре. */ -static void spinner_show(uint8_t on) -{ - spinner_active = on; - if (!on) wrchar(SPINNER_COL, 0, ' ', ATTR_BAR); -} - -/* Отображает указанную EMM-страницу файла в окно W3. - * Если эта страница уже активна, переключение не выполняется. */ -static inline void map_page(uint8_t page) -{ - if (page != cur_page) { - /* file_phys[] позволяет не вызывать mem_get_page() на каждом свопе. */ - sprinter_page_w3(file_phys[page]); - cur_page = page; - } -} -/* Читает один байт логического файла по смещению p. - * При переходе между страницами автоматически переключает W3. - * Проверка границ выполняется вызывающей стороной. - */ - -static char fb(uint32_t p) -{ - uint8_t *pb = (uint8_t *)&p; - uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2)); - uint16_t off = (uint16_t)(((uint16_t)(pb[1] & 0x3F) << 8) | pb[0]); - map_page(page); - return FILE_BUF[off]; -/* - // p = HLDE - (void)p; - - __asm -; uint16_t off = (uint16_t)(((uint16_t)(pb[1] | 0xC0) << 8) | pb[0]); - ld a, d - or a, #0xC0 - ld b, a - ld c, e - -; uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2)); - ld a, l ;; pb[2] << 2 - add a, a - add a, a - ld e, a ;; e = pb[2] << 2 - - ld a, d ;; pb[1] >> 6 - rlca - rlca - and a, #0x03 - - or a, e ;; a = (pb[2] << 2) | (pb[1] >> 6) - ld e, a -; map_page(page); -; if (page != cur_page) { - ld a, (_cur_page) - cp e - jr Z, __fbl0 -; cur_page = page; - ld a, e - ld (_cur_page), a -; sprinter_page_w3(file_phys[page]); - ld hl, #_file_phys - ld d, #0x00 - add hl, de - ld a, (hl) - out (__io_page_w3), a -; } -__fbl0: -; return FILE_BUF[off]; - ld a, (bc) - ret - __endasm; -*/ -} - -/* Для проверки границ выделения считаем пробел/таб/конец строки/0 пробельными. */ -static uint8_t ws_or_eol(char c) -{ - return (uint8_t)(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -static uint8_t ws_or_eol_or_delim(char c) -{ - return (uint8_t)(c == ' ' || c == ',' || c == '.' || c == '!' || c == '?' || c == ':' || c == ';' || c == '/' - || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -/* Маркер inline-выделения (*, **, _) распознаётся только если - * пробельная граница есть ровно с одной стороны (XOR-правило). - * Это защищает выражения вроде "2 * 3", "2 ** 3" и внутрисловные - * случаи (например COLOR_YELLOW) от ложного форматирования. */ -static uint8_t is_emph_flanked(char prev_ch, char next_ch) -{ - return (uint8_t)(ws_or_eol(prev_ch) != ws_or_eol_or_delim(next_ch)); -} - -/* Тип сегмента-продолжения, передаваемый в emit_seg(). - * Явно в индексе не хранится: рендер при необходимости восстанавливает - * тип через classify_line(), но параметр оставлен для читаемости вызовов. */ -#define CK_PLAIN 0 -#define CK_QUOTE 1 -#define CK_LIST 2 -#define CK_OTHER 3 - -/* Доступ к индексу в EMM. - * Размер записи 8 байт, поэтому запись не пересекает границу страницы - * и bank_read/bank_write работают с цельным блоком. */ -static void idx_get(uint16_t idx, idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); /* номер страницы: idx / 2048 */ - uint16_t off = (uint16_t)((idx & 2047u) << 3); /* смещение записи: (idx % 2048) * 8 */ - bank_read(index_phys[page], off, r, INDEX_REC_SIZE); -} - -static void idx_put(uint16_t idx, const idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 2047u) << 3); - bank_write(index_phys[page], off, r, INDEX_REC_SIZE); -} - -/* Чтение полей индекса для рендера и навигации (построчный доступ). */ -static uint8_t seg_flags(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return 0; - idx_get(idx, &r); - return r.flags; -} - -static uint32_t seg_off(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return file_size; - idx_get(idx, &r); - return r.off; -} - -static uint8_t is_cont(uint16_t idx) { return (uint8_t)((seg_flags(idx) & IF_CONT) != 0); } -static uint8_t is_nowrap(uint16_t idx) { return (uint8_t)((seg_flags(idx) & IF_NOWRAP) != 0); } -static uint8_t is_blank(uint16_t idx) { return (uint8_t)((seg_flags(idx) & IF_BLANK) != 0); } -static uint8_t is_code_body(uint16_t idx){ return (uint8_t)((seg_flags(idx) & IF_CODE) != 0); } - -/* Установка флагов всегда идёт в последний emit_seg (n_lines-1). - * Используется near-копия cur_rec, чтобы не делать обратное чтение из банка. */ -static void set_nowrap_cur(void) { cur_rec.flags |= IF_NOWRAP; idx_put((uint16_t)(n_lines - 1), &cur_rec); } -static void set_blank_cur(void) { cur_rec.flags |= IF_BLANK; idx_put((uint16_t)(n_lines - 1), &cur_rec); } -static void set_code_cur(void) { cur_rec.flags |= IF_CODE; idx_put((uint16_t)(n_lines - 1), &cur_rec); } - -/* Загружает 16 текстовых атрибутов в палитры ink/paper/blink. */ -static void set_pallete(void) { - uint8_t buff[64]; - for(int i = 0; i < 16; i++) { - for(int j = 0; j < 16; j++) { - buff[j * 4] = md_pallete[i * 4]; - buff[j * 4 + 1] = md_pallete[i * 4 + 1]; - buff[j * 4 + 2] = md_pallete[i * 4 + 2]; - buff[j * 4 + 3] = md_pallete[i * 4 + 3]; - } - - text_pal_load(TEXT_PAL_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_BLINK_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_PAPER, i * 16, 16, buff); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16, 8, buff + 32); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16 + 8, 8, buff + 32); - } -} - -/* ================================================================== - * Загрузка/выгрузка файла - * ================================================================== */ - -/* Загружает файл в EMM-страницы и подготавливает EMM-индекс. - * Возврат: 0 — успех, отрицательное значение — код ошибки. */ -static int load_file(const char *path) -{ - int fd = open(path, O_RDONLY); - if (fd < 0) return -1; - - long sz = lseek(fd, 0, SEEK_END); - if (sz < 0 || (uint32_t)sz > MAX_FILE) { - close(fd); - return -2; - } - file_size = (uint32_t)sz; - lseek(fd, 0, SEEK_SET); - - /* Выделяем ровно столько EMM-страниц, сколько нужно под файл. */ - file_pages = (uint8_t)((file_size + PAGE_SIZE - 1u) / PAGE_SIZE); - if (file_pages == 0) file_pages = 1; - file_blk = mem_alloc_pages(file_pages); - if (file_blk == 0) { - close(fd); - return -3; - } - - /* Читаем файл кусками по 16 КБ, последовательно маппя страницы в W3. - * На последней итерации читаем остаток меньше PAGE_SIZE. */ - uint32_t remaining = file_size; - for (uint8_t page = 0; page < file_pages; page++) { - spinner_tick(); - uint8_t phys = mem_get_page(file_blk, page); - file_phys[page] = phys; - sprinter_page_w3(phys); - cur_page = page; - uint16_t chunk = (remaining > PAGE_SIZE) - ? (uint16_t)PAGE_SIZE - : (uint16_t)remaining; - int n = read(fd, FILE_BUF, chunk); - if (n != (int)chunk) { - close(fd); - return -4; - } - remaining -= chunk; - } - close(fd); - - /* Выделяем блок индекса в EMM (8 байт на сегмент, 2048 записей/страница). - * Размер берем с запасом относительно файла; если памяти мало — - * уменьшаем количество страниц индекса до доступного значения. */ - { - uint8_t want = (uint8_t)(file_pages + 1u); - if (want > MAX_INDEX_PAGES) want = MAX_INDEX_PAGES; - index_blk = 0; - while (want >= 1u) { - index_blk = mem_alloc_pages(want); - if (index_blk) break; - want--; - } - if (index_blk == 0) return -5; - index_pages = want; - for (uint8_t i = 0; i < index_pages; i++) - index_phys[i] = mem_get_page(index_blk, i); - max_lines = (uint16_t)index_pages * INDEX_RECS_PER_PAGE; - } - return 0; -} - -/* Освобождает выделенные EMM-блоки файла и индекса. */ -static void unload_file(void) -{ - if (file_blk) { - mem_free_block(file_blk); - file_blk = 0; - } - if (index_blk) { - mem_free_block(index_blk); - index_blk = 0; - } -} - -/* ================================================================== - * Индексация строк - * ================================================================== */ - -/* Возвращает 1, если сегмент idx — это старт логической строки, - * и эта строка начинается с ``` (граница блока кода). - * Сегменты-продолжения никогда не считаются такими границами. */ -static uint8_t is_fence_delim(uint16_t idx) -{ - if (idx >= n_lines) return 0; - if (is_cont(idx)) return 0; - uint32_t off = seg_off(idx); - if (off + 2 >= file_size) return 0; - return (uint8_t)(fb(off) == '`' && - fb(off + 1) == '`' && - fb(off + 2) == '`'); -} - -#define INIT_STYLE_PLAIN 0x0 -#define INIT_STYLE_BOLD 0x1 -#define INIT_STYLE_ITALIC 0x2 -#define INIT_STYLE_UNDER 0x3 -#define INIT_STYLE_CODE 0x4 -#define INIT_STYLE_STRIKE 0x5 - -/* Таблица сопоставления init-style -> атрибут. - * Порядок должен совпадать с INIT_STYLE_* / EM_* ниже. */ -static const uint8_t styles_map[] = { - ATTR_TEXT, ATTR_TEXT_BOLD, ATTR_TEXT_ITALIC, ATTR_TEXT_UNDERSORE, ATTR_TEXT_CODE, ATTR_TEXT_STRIKE -}; - -/* Возвращает стартовый атрибут сегмента из индексной записи. */ -static uint8_t get_init_style(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return styles_map[INIT_STYLE_PLAIN]; - idx_get(idx, &r); - return styles_map[r.style & 7u]; -} - -/* Возвращает «сырой» INIT_STYLE_* из индексной записи. */ -static uint8_t get_init_style_raw(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return INIT_STYLE_PLAIN; - idx_get(idx, &r); - return (uint8_t)(r.style & 7u); -} - - -/* Тип строки, который возвращает classify_line(). */ -#define LK_PLAIN 0 -#define LK_H1 1 -#define LK_H2 2 -#define LK_H3 3 -#define LK_H4 4 /* также используется для H5/H6 */ -#define LK_HR 5 -#define LK_ULIST 6 /* маркер ненумерованного списка */ -#define LK_OLIST 7 /* маркер нумерованного списка */ -#define LK_QUOTE 8 /* маркер цитаты */ - -/* Классифицирует логическую строку. - * - Заголовки: 1..4 символа '#' и затем пробел/таб (H5/H6 сводятся к H4). - * - Горизонтальная линия: только '-', '*' или '_' (одного вида, >=3), - * возможно с пробелами/табами между символами. - * - Ненумерованный список: "- ", "* " или "+ " перед содержимым. - * - Нумерованный список: цифры + '.'/ ')' + пробел. - * - Цитата: '>' с опциональным пробелом. - * - Иначе обычный текст. - * Для заголовков/списков/цитат out_content указывает на первый байт - * содержимого после маркера и завершающего пробела. */ -static uint8_t classify_line(uint32_t p_start, uint32_t *out_content) -{ - if (p_start >= file_size) return LK_PLAIN; - - char c0 = fb(p_start); - - /* Заголовок? */ - if (c0 == '#') { - uint8_t lvl = 0; - uint32_t p = p_start; - while (p < file_size && fb(p) == '#' && lvl < 6) { - lvl++; p++; - } - if (p < file_size) { - char ch = fb(p); - if (ch == ' ' || ch == '\t') { - p++; - *out_content = p; - if (lvl > 4) lvl = 4; - return lvl; /* LK_H1 .. LK_H4 */ - } - } - /* Символ '#' без пробела после него не считается заголовком. */ - } - - /* Горизонтальный разделитель. - * Проверяется до списков, чтобы `- - -` не стало маркером списка. */ - if (c0 == '-' || c0 == '*' || c0 == '_') { - char marker = 0; - uint8_t count = 0; - uint8_t ok = 1; - uint32_t p = p_start; - while (p < file_size) { - char ch = fb(p++); - if (ch == '\n' || ch == '\r') break; - if (ch == ' ' || ch == '\t') continue; - if (ch != '-' && ch != '*' && ch != '_') { ok = 0; break; } - if (marker == 0) marker = ch; - else if (ch != marker) { ok = 0; break; } - count++; - } - if (ok && count >= 3) return LK_HR; - } - - /* Для списков/цитат дополнительно допускаем ведущие пробелы - * (базовая поддержка вложенности). */ - uint32_t lp = p_start; - while (lp < file_size && fb(lp) == ' ') lp++; - char cl = (lp < file_size) ? fb(lp) : 0; - - /* Ненумерованный список? */ - if ((cl == '-' || cl == '*' || cl == '+') && - (lp + 1) < file_size && - fb(lp + 1) == ' ') { - *out_content = lp + 2; - return LK_ULIST; - } - - /* Нумерованный список? */ - if (cl >= '0' && cl <= '9') { - uint32_t p = lp; - while (p < file_size) { - char ch = fb(p); - if (ch < '0' || ch > '9') break; - p++; - } - if (p < file_size) { - char ch = fb(p); - if ((ch == '.' || ch == ')') && - (p + 1) < file_size && fb(p + 1) == ' ') { - *out_content = p + 2; - return LK_OLIST; - } - } - } - - /* Цитата? */ - if (cl == '>') { - uint32_t p = lp + 1; - if (p < file_size && fb(p) == ' ') p++; - *out_content = p; - return LK_QUOTE; - } - - return LK_PLAIN; -} - -/* Возвращает видимую ширину префикса (отступ + маркер) в колонках. */ -static uint8_t marker_visible_col(uint8_t kind, uint32_t p_start, uint32_t content_off) -{ - switch (kind) { - case LK_ULIST: - case LK_QUOTE: - case LK_OLIST: return (uint8_t)(content_off - p_start); - default: return 0; /* plain/headers спец-префикса не имеют */ - } -} - -/* Добавляет запись сегмента в EMM-индекс. - * near-копии cur_rec/cur_seg_off используются для быстрых последующих - * операций без повторного чтения последней записи из банка. */ -static void emit_seg(uint32_t off, uint8_t style, uint8_t ckind, uint8_t cont) -{ - (void)ckind; /* тип сегмента восстанавливается на этапе рендера */ - if (n_lines >= max_lines) { index_truncated = 1; return; } - cur_rec.off = off; - cur_rec.flags = (uint8_t)(cont ? IF_CONT : 0); - cur_rec.style = (uint8_t)(style & 7u); - cur_rec.pad0 = 0; - cur_rec.pad1 = 0; - idx_put(n_lines, &cur_rec); - cur_seg_off = off; - n_lines++; -} - -/* Проверяет, что физическая строка пуста (только пробелы/таб + перевод строки). */ -static uint8_t is_line_blank(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == '\n') return 1; - if (c != ' ' && c != '\t') return 0; - p++; - } - return 1; -} - -/* Быстрая проверка начала блока кода по маркеру ``` . */ -static uint8_t is_fence_raw(uint32_t p) -{ - if (p + 2 >= file_size) return 0; - return (fb(p) == '`' && fb(p + 1) == '`' && fb(p + 2) == '`'); -} - -/* Быстрая проверка горизонтального разделителя (`---`, `***`, `___`). */ -static uint8_t is_hr_raw(uint32_t p) -{ - char c0 = fb(p); - if (c0 != '-' && c0 != '*' && c0 != '_') return 0; - char marker = 0; - uint8_t count = 0, ok = 1; - uint32_t hr_p = p; - while (hr_p < file_size) { - char ch = fb(hr_p++); - if (ch == '\n' || ch == '\r') break; - if (ch == ' ' || ch == '\t') continue; - if (ch != '-' && ch != '*' && ch != '_') { ok = 0; break; } - if (marker == 0) marker = ch; - else if (ch != marker) { ok = 0; break; } - count++; - } - return ok && count >= 3; -} - -/* Строка таблицы: первый непустой символ — '|'. - * Ведущие пробелы разрешены; такие строки не склеиваются и не переносятся. */ -static uint8_t is_table_raw(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == ' ' || c == '\t') { p++; continue; } - return (uint8_t)(c == '|'); - } - return 0; -} - -/* Общий сканер inline-форматирования и переносов. - * Идёт от q до q_end, учитывает стартовую колонку col и при необходимости - * эмитит continuation-сегменты. Возвращает итоговый line_style. */ -static uint8_t inline_scan(uint32_t q, uint32_t q_end, uint8_t col, - uint8_t ckind, uint8_t line_style) -{ - uint32_t last_space = 0xFFFFFFFFu; - uint8_t last_space_style = line_style; /* снимок line_style на момент last_space */ - char prev_ch = ' '; - uint8_t seg_col = col; - - while (q < q_end && n_lines < max_lines) { - char ch = fb(q); - - if (ch == '\n') { - /* Жёсткий перенос (уже проверен снаружи) или конец потока. */ - q++; - emit_seg(q, line_style, ckind, (ckind == CK_LIST || ckind == CK_QUOTE) ? 1 : 0); - last_space = 0xFFFFFFFFu; prev_ch = ' '; seg_col = col; - continue; - } - - if (ch == '`') { - if (line_style == INIT_STYLE_CODE) line_style = INIT_STYLE_PLAIN; - else line_style = INIT_STYLE_CODE; - q++; continue; - } - if (ch == '*' && (q + 1) < q_end && fb(q + 1) == '*') { - char next_ch = ((q + 2) < q_end) ? fb(q + 2) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = INIT_STYLE_BOLD; q += 2; continue; - } else if (line_style == INIT_STYLE_BOLD && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; q += 2; continue; - } - } - seg_col += 2; q += 2; prev_ch = '*'; continue; - } - if (ch == '~' && (q + 1) < q_end && fb(q + 1) == '~') { - char next_ch = ((q + 2) < q_end) ? fb(q + 2) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = INIT_STYLE_STRIKE; q += 2; continue; - } else if (line_style == INIT_STYLE_STRIKE && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; q += 2; continue; - } - } - seg_col += 2; q += 2; prev_ch = '~'; continue; - } - if (ch == '*' || ch == '_') { - char next_ch = ((q + 1) < q_end) ? fb(q + 1) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - uint8_t new_style = (ch == '*') ? INIT_STYLE_ITALIC : INIT_STYLE_UNDER; - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = new_style; q++; continue; - } else if (line_style == new_style && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; q++; continue; - } - } - seg_col++; q++; prev_ch = ch; continue; - } - if (ch == '\t') { - uint8_t tgt = (uint8_t)((seg_col & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - if (tgt > SCREEN_W) tgt = SCREEN_W; - seg_col = tgt; q++; prev_ch = ' '; continue; - } - if (ch == ' ') { - last_space = q + 1; - last_space_style = line_style; - seg_col++; q++; prev_ch = ' '; - } else { - seg_col++; q++; prev_ch = ch; - } - if (seg_col >= SCREEN_W) { - uint8_t use_ls = (uint8_t)(last_space != 0xFFFFFFFFu && last_space > cur_seg_off); - uint32_t wrap_at = use_ls ? last_space : q; - if (wrap_at >= q_end || wrap_at == cur_seg_off) break; - uint8_t wrap_style = use_ls ? last_space_style : line_style; - emit_seg(wrap_at, wrap_style, ckind, 1); - seg_col = col; last_space = 0xFFFFFFFFu; prev_ch = ' '; q = wrap_at; - /* Откатываем line_style к снимку на момент wrap_at: диапазон - * [wrap_at, q_old) будет пересканирован заново, и переключающие - * символы (обратная кавычка, звёздочка, подчёркивание, тильда) - * внутри него иначе применились бы дважды — именно так возникал - * баг: code-маркер на границе переноса ломает цвет следующего слова. */ - line_style = wrap_style; - } - } - return line_style; -} - -#define JOIN_MODE_LIST 1u -#define JOIN_MODE_QUOTE 2u -#define JOIN_MODE_PLAIN 3u - -/* Общий потоковый сканер для index_lines(). - * Убирает дублирование между ветками list/quote/plain: - * - mode задаёт правила обработки перевода строки, - * - остальная inline-логика (emphasis/таб/перенос) едина. - * Возвращает позицию q, на которой сканер остановился, и обновляет стиль. */ -static uint32_t scan_join_stream(uint32_t q, uint32_t para_start, uint8_t col, - uint8_t ckind, uint8_t *io_line_style, uint8_t mode) -{ - uint32_t last_space = 0xFFFFFFFFu; - uint8_t last_space_style = *io_line_style; /* снимок line_style на момент last_space */ - char prev_ch = ' '; - uint8_t seg_col = col; - uint8_t line_style = *io_line_style; - - while (q < file_size && n_lines < max_lines) { - char ch = fb(q); - uint8_t soft_break = 0; - - if (ch == '\n') { - uint32_t next = q + 1; - if (next >= file_size) break; - - if (mode == JOIN_MODE_LIST) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind == LK_ULIST || next_kind == LK_OLIST || - next_kind == LK_QUOTE || - (next_kind >= LK_H1 && next_kind <= LK_H4) || - next_kind == LK_HR) { - break; - } - } - while (next < file_size) { - char ws = fb(next); - if (ws == ' ' || ws == '\t') next++; - else break; - } - q = next; - soft_break = 1; - ch = ' '; - } else if (mode == JOIN_MODE_QUOTE) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind != LK_QUOTE) break; - - { - uint32_t next_line_end = next_content; - while (next_line_end < file_size && fb(next_line_end) != '\n') next_line_end++; - - { - uint8_t empty_quote = 1; - for (uint32_t z = next_content; z < next_line_end; z++) { - char c = fb(z); - if (c != ' ' && c != '\t') { empty_quote = 0; break; } - } - if (empty_quote) break; - } - - { - uint32_t t = next_content; - while (t < next_line_end && (fb(t) == ' ' || fb(t) == '\t')) t++; - if (t < next_line_end && fb(t) == '>') break; - } - - while (next_content < next_line_end) { - char ws = fb(next_content); - if (ws == ' ' || ws == '\t') next_content++; - else break; - } - if (next_content < next_line_end && fb(next_content) == '>') { - next_content++; - if (next_content < next_line_end && fb(next_content) == ' ') next_content++; - } - q = next_content; - soft_break = 1; - ch = ' '; - } - } - } else { /* JOIN_MODE_PLAIN */ - if (fb(next) == '\n') break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - { - uint32_t dummy; - if (classify_line(next, &dummy) != LK_PLAIN) break; - } - if (is_line_blank(next)) break; - - { - uint8_t is_hard = 0; - if (q >= para_start + 1) { - char b1 = fb(q - 1); - if (b1 == '\\') { - is_hard = 1; - } else if (q >= para_start + 2) { - char b2 = fb(q - 2); - if ((b1 == ' ' || b1 == '\t') && (b2 == ' ' || b2 == '\t')) - is_hard = 1; - } - } - if (is_hard) { - q++; - emit_seg(q, line_style, ckind, 0); - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - seg_col = col; - continue; - } - } - - q++; - soft_break = 1; - ch = ' '; - } - } - - if (ch == '`') { - if (line_style == INIT_STYLE_CODE) line_style = INIT_STYLE_PLAIN; - else line_style = INIT_STYLE_CODE; - if (!soft_break) q++; - continue; - } - if (ch == '*' && (q + 1) < file_size && fb(q + 1) == '*') { - char next_ch = ((q + 2) < file_size) ? fb(q + 2) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = INIT_STYLE_BOLD; - if (!soft_break) q += 2; else q++; - continue; - } else if (line_style == INIT_STYLE_BOLD && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; - if (!soft_break) q += 2; else q++; - continue; - } - } - seg_col += 2; - if (!soft_break) q += 2; else q++; - prev_ch = '*'; - continue; - } - if (ch == '~' && (q + 1) < file_size && fb(q + 1) == '~') { - char next_ch = ((q + 2) < file_size) ? fb(q + 2) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = INIT_STYLE_STRIKE; - if (!soft_break) q += 2; else q++; - continue; - } else if (line_style == INIT_STYLE_STRIKE && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; - if (!soft_break) q += 2; else q++; - continue; - } - } - seg_col += 2; - if (!soft_break) q += 2; else q++; - prev_ch = '~'; - continue; - } - if (ch == '*' || ch == '_') { - char next_ch = ((q + 1) < file_size) ? fb(q + 1) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - uint8_t new_style = (ch == '*') ? INIT_STYLE_ITALIC : INIT_STYLE_UNDER; - if (line_style == INIT_STYLE_PLAIN && ws_or_eol(prev_ch)) { - line_style = new_style; - if (!soft_break) q++; else q++; - continue; - } else if (line_style == new_style && ws_or_eol_or_delim(next_ch)) { - line_style = INIT_STYLE_PLAIN; - if (!soft_break) q++; else q++; - continue; - } - } - seg_col++; - if (!soft_break) q++; else q++; - prev_ch = ch; - continue; - } - if (ch == '\t') { - uint8_t tgt = (uint8_t)((seg_col & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - if (tgt > SCREEN_W) tgt = SCREEN_W; - seg_col = tgt; - if (!soft_break) q++; else q++; - prev_ch = ' '; - continue; - } - if (ch == ' ') { - if (soft_break) { - last_space = q; - last_space_style = line_style; - seg_col++; - } else { - last_space = q + 1; - last_space_style = line_style; - seg_col++; - q++; - } - prev_ch = ' '; - } else { - seg_col++; - if (!soft_break) q++; else q++; - prev_ch = ch; - } - if (seg_col >= SCREEN_W) { - uint8_t use_ls = (uint8_t)(last_space != 0xFFFFFFFFu && last_space > cur_seg_off); - uint32_t wrap_at = use_ls ? last_space : q; - if (wrap_at >= file_size || wrap_at == cur_seg_off) break; - uint8_t wrap_style = use_ls ? last_space_style : line_style; - emit_seg(wrap_at, wrap_style, ckind, 1); - seg_col = col; - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - q = wrap_at; - /* Откатываем line_style к снимку на момент wrap_at: диапазон - * [wrap_at, q_old) будет пересканирован заново, и переключающие - * символы (обратная кавычка, звёздочка, подчёркивание, тильда) - * внутри него иначе применились бы дважды — именно так возникал - * баг: code-маркер на границе переноса ломает цвет следующего слова (mdview.c, отчёт пользователя - * 2026-06-23). */ - line_style = wrap_style; - } - } - - *io_line_style = line_style; - return q; -} - -/* Строит индекс сегментов рендера по загруженному файлу. */ -static void index_lines(void) -{ - uint8_t in_block = 0; - n_lines = 0; - index_truncated = 0; - cur_seg_off = 0xFFFFFFFFu; /* пока не эмитили ни одного сегмента */ - if (file_size == 0) return; - - uint32_t p = 0; - while (p < file_size && n_lines < max_lines) { - - if ((n_lines & 15) == 0) - spinner_tick(); - - /* Пустая строка — разделитель параграфов. - * В индекс добавляем не более одной пустой экранной строки подряд. */ - if (is_line_blank(p)) { - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - /* Серия пустых строк схлопывается в одну визуальную строку. */ - if (n_lines == 0 || !(cur_rec.flags & IF_BLANK)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_PLAIN, 0); - set_blank_cur(); - } - continue; - } - - /* ---- fenced code-блок (граница или тело) ---- */ - if (is_fence_raw(p)) { - in_block = !in_block; - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_nowrap_cur(); - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - continue; - } - if (in_block) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_nowrap_cur(); - set_code_cur(); - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - continue; - } - - /* ---- горизонтальный разделитель ---- */ - if (is_hr_raw(p)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_nowrap_cur(); - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - continue; - } - - /* ---- строка таблицы (| ... |): один nowrap-сегмент на исходную строку ---- */ - if (is_table_raw(p)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_nowrap_cur(); - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - continue; - } - - /* ---- классификация текущей строки ---- */ - uint32_t content_off = p; - uint8_t kind = classify_line(p, &content_off); - - /* ---- Заголовок: отдельная строка, не склеивается с параграфом ---- */ - if (kind >= LK_H1 && kind <= LK_H4) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - uint32_t line_end = content_off; - while (line_end < file_size && fb(line_end) != '\n') line_end++; - (void)inline_scan(content_off, line_end, 0, CK_OTHER, INIT_STYLE_PLAIN); - while (p < file_size && fb(p) != '\n') p++; - if (p < file_size) p++; - continue; - } - - /* ---- Пункт списка: может занимать несколько физических строк ---- */ - if (kind == LK_ULIST || kind == LK_OLIST) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_LIST, 0); - q = scan_join_stream(q, p, col, CK_LIST, &line_style, JOIN_MODE_LIST); - - /* Переходим к началу следующей физической строки после пункта. */ - if (q < file_size) { - while (q < file_size && fb(q) != '\n') q++; - if (q < file_size) q++; - } - - /* Одна пустая строка между соседними маркерами списка подавляется. - * Две и более пустых строки оставляют видимый разделитель. */ - if (q < file_size && is_line_blank(q)) { - uint32_t t = q; - uint8_t blanks = 0; - while (t < file_size && is_line_blank(t)) { - while (t < file_size && fb(t) != '\n') t++; - if (t < file_size) t++; - blanks++; - // if (blanks >= 2) break; - } - if (blanks == 1 && t < file_size) { - uint32_t d = t; - uint8_t nk = classify_line(t, &d); - if (nk == LK_ULIST || nk == LK_OLIST) { - p = t; /* подавляем единственную пустую строку */ - continue; - } - } - } - - p = q; - continue; - } - - /* ---- Параграф цитаты: может покрывать несколько физических строк ---- */ - if (kind == LK_QUOTE) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_QUOTE, 0); - q = scan_join_stream(q, p, col, CK_QUOTE, &line_style, JOIN_MODE_QUOTE); - - while (q < file_size && fb(q) != '\n') q++; - if (q < file_size) q++; - p = q; - continue; - } - - /* ---- Обычный текстовый параграф: склейка через soft-break ---- */ - { - uint8_t line_style = INIT_STYLE_PLAIN; - emit_seg(p, line_style, CK_PLAIN, 0); - - uint32_t q = p; - q = scan_join_stream(q, p, 0, CK_PLAIN, &line_style, JOIN_MODE_PLAIN); - - if (q >= file_size) { - p = file_size; - } else { - /* q стоит на завершающем newline параграфа. - * Переходим на следующую строку, чтобы внешняя петля её - * корректно переклассифицировала. */ - while (q < file_size && fb(q) != '\n') q++; - if (q < file_size) q++; - p = q; - } - } - } -} -#define EM_NONE 0 -#define EM_BOLD 1 -#define EM_ITALIC 2 -#define EM_UNDER 3 -#define EM_CODE 4 -#define EM_STRIKE 5 - -/* Преобразует внутреннее состояние emphasis в экранный атрибут. */ -static uint8_t emph_to_attr(uint8_t emph, uint8_t base_attr) -{ - switch (emph) { - case EM_BOLD: return ATTR_TEXT_BOLD; - case EM_ITALIC: return ATTR_TEXT_ITALIC; - case EM_UNDER: return ATTR_TEXT_UNDERSORE; - case EM_CODE: return ATTR_TEXT_CODE; - case EM_STRIKE: return ATTR_TEXT_STRIKE; - default: return base_attr; - } -} - -/* Единая обработка inline-маркеров в render_line(). - * Возврат: - * 0 = маркер не поглощён (символ выводится как есть), - * 1 = маркер поглощён как управляющий (ничего не рисуем), - * 2 = литеральный двойной маркер (`**` или `~~`), нужно вывести две копии out_ch. */ -static uint8_t handle_inline_marker(char ch, uint32_t *io_p, uint32_t seg_end, - char prev_ch, uint8_t *io_emph, char *out_ch) -{ - uint32_t p = *io_p; - - *out_ch = 0; - - if (ch == '`') { - if (*io_emph == EM_NONE) { - *io_emph = EM_CODE; - *io_p = p + 1; - return 1; - } - if (*io_emph == EM_CODE) { - *io_emph = EM_NONE; - *io_p = p + 1; - return 1; - } - return 0; - } - - if ((ch == '*' || ch == '~') && (p + 1) < seg_end && fb(p + 1) == ch) { - uint8_t pair_emph = (ch == '*') ? EM_BOLD : EM_STRIKE; - char next_ch = ((p + 2) < seg_end) ? fb(p + 2) : '\n'; - - if (is_emph_flanked(prev_ch, next_ch)) { - if (*io_emph == EM_NONE && ws_or_eol(prev_ch)) { - *io_emph = pair_emph; - *io_p = p + 2; - return 1; - } else if (*io_emph == pair_emph && ws_or_eol_or_delim(next_ch)) { - *io_emph = EM_NONE; - *io_p = p + 2; - return 1; - } - } - - /* Невалидный по границам двойной маркер отображаем как литерал. */ - *io_p = p + 2; - *out_ch = ch; - return 2; - } - - if (ch == '*' || ch == '_') { - char next_ch = ((p + 1) < seg_end) ? fb(p + 1) : '\n'; - if (is_emph_flanked(prev_ch, next_ch)) { - uint8_t active = (ch == '*') ? EM_ITALIC : EM_UNDER; - if (*io_emph == EM_NONE && ws_or_eol(prev_ch)) { - *io_emph = active; - *io_p = p + 1; - return 1; - } else if (*io_emph != EM_NONE && ws_or_eol_or_delim(next_ch)) { - *io_emph = EM_NONE; - *io_p = p + 1; - return 1; - } - } - } - - return 0; -} - -/* Сбрасывает накопленный "прогон" из *col символов одного атрибута - * одним bios_writeattr() вместо посимвольных wrchar(). *need_place - * лениво ставит BIOS-курсор перед первым выводом в текущей строке — - * далее place продвигается сам (verified), повторный bios_set_place - * не нужен пока *col растёт монотонно. */ -static void flush_run(uint8_t row, uint8_t *col, const char *buf, - uint8_t len, uint8_t attr, uint8_t *need_place) -{ - if (len == 0) return; - /* *col уже указывает на конец прогона (вызывающий цикл инкрементит - * col на каждый символ ещё во время накопления в буфер — это нужно - * для верных проверок col < SCREEN_W до сброса). Поэтому начало - * прогона на экране = *col - len, а не *col; и *col второй раз - * наращивать НЕ нужно — он уже корректен. */ - if (*need_place) { - bios_set_place(row, (uint8_t)(*col - len)); - *need_place = 0; - } - bios_writeattr(buf, len, attr); -} - -static void render_line(uint16_t line_idx, uint8_t row) -{ - /* Один idx_get() на line_idx вместо ~13 отдельных is_blank/is_cont/ - * is_nowrap/is_code_body/seg_off/get_init_style* вызовов. Каждый из - * них шёл через seg_flags()/seg_off() -> idx_get() -> bank_read(), - * а bank_read() ДВАЖДЫ переключает банк окна 3 (на страницу индекса - * и обратно) плюс memcpy — это оказалось главным узким местом - * рендера (≈700+ переключений банка на кадр), а не сам вывод на - * экран. Все нужные поля (off/flags/style) лежат в одной 8-байтовой - * записи idx_rec_t — читаем её один раз и используем дальше. */ - uint8_t have_rec = (line_idx < n_lines); - idx_rec_t rec; - if (have_rec) idx_get(line_idx, &rec); - - uint8_t col = 0; - uint8_t base_attr = ATTR_TEXT; - uint8_t is_code = (uint8_t)(have_rec && (rec.flags & IF_CODE)); - uint8_t cur_attr = is_code ? ATTR_TEXT_CODE - : styles_map[(have_rec ? rec.style : INIT_STYLE_PLAIN) & 7u]; - uint8_t emph = is_code ? EM_CODE - : (uint8_t)((have_rec ? rec.style : INIT_STYLE_PLAIN) & 7u); - uint8_t parse_inline = 1; /* 1: включён парсер выделений, 0: выводим код как есть */ - - if (have_rec && (rec.flags & IF_BLANK)) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, (uint8_t)(SCREEN_W - col)); - return; - } - - if (have_rec) { - uint32_t p = rec.off; - uint32_t content_off = p; - uint8_t cont = (uint8_t)((rec.flags & IF_CONT) != 0); - /* Правая граница сегмента: начало следующего сегмента или конец файла. */ - uint32_t seg_end; - if ((uint16_t)(line_idx + 1) < n_lines) { - idx_rec_t rec_next; - idx_get((uint16_t)(line_idx + 1), &rec_next); - seg_end = rec_next.off; - } else { - seg_end = file_size; - } - if (seg_end > file_size) seg_end = file_size; - uint8_t kind; - uint8_t quote_stream = 0; /* 1: текущий сегмент относится к потоку цитаты */ - - /* Для сегмента-продолжения повторяем префикс/отступ - * от первого не-CONT сегмента логической строки. */ - if (cont) { - uint16_t first = line_idx; - idx_rec_t rec_first = rec; /* rec.flags здесь уже содержит IF_CONT */ - /* Для любого сегмента-продолжения откатываемся к первому - * НЕ-cont сегменту этой логической строки — один idx_get() - * на шаг вместо двух (is_cont + повторный seg_off). */ - while (first > 0 && (rec_first.flags & IF_CONT)) { - first--; - idx_get(first, &rec_first); - } - uint32_t p_start = rec_first.off; - uint32_t content_off = p_start; - uint8_t first_kind = classify_line(p_start, &content_off); - uint8_t indent = marker_visible_col(first_kind, p_start, content_off); - if (first_kind == LK_QUOTE) { - /* Для продолжения цитаты нужно помнить тип потока, - * чтобы далее на newline корректно пропускать сырой `>`. */ - quote_stream = 1; - uint8_t q = 0; - while (q + 2 < content_off && q < SCREEN_W && fb(p_start + q) == ' ') q++; - if (q > (uint8_t)(SCREEN_W - col)) q = (uint8_t)(SCREEN_W - col); - if (q > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, q); - col = (uint8_t)(col + q); - } - if (col < SCREEN_W) wrchar(col++, row, 0xB3, ATTR_QUOTE_MARKER); - if (col < SCREEN_W) wrchar(col++, row, ' ', ATTR_TEXT); - } else if (first_kind == LK_ULIST || first_kind == LK_OLIST) { - uint8_t q = indent; - if (q > (uint8_t)(SCREEN_W - col)) q = (uint8_t)(SCREEN_W - col); - if (q > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, q); - col = (uint8_t)(col + q); - } - } - /* p/content_off уже равны rec.off — внутри cont-блока они не - * менялись (там свои локальные тени с тем же именем), - * пересчитывать через seg_off() заново не нужно. */ - } - - /* Кодовый блок: - * - строка-разделитель показывается как пустая; - * - тело рисуется «как есть» с ATTR_TEXT_CODE без inline-парсинга. - * is_fence_delim(line_idx) разворачено на месте: cont и p уже - * известны, повторный idx_get()/is_cont() не нужен. */ - if (!cont && p + 2 < file_size && - fb(p) == '`' && fb(p + 1) == '`' && fb(p + 2) == '`') { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, (uint8_t)(SCREEN_W - col)); - return; - } - if (is_code) { - base_attr = ATTR_TEXT_CODE; - cur_attr = ATTR_TEXT_CODE; - parse_inline = 0; - kind = LK_PLAIN; - quote_stream = 0; - } else if (cont) { - /* Строка-продолжение: префикс уже нарисован выше. - * Содержимое рисуем как plain, без повторной классификации, - * иначе начало слова могло бы ложно стать маркером. */ - kind = LK_PLAIN; - } else { - kind = classify_line(p, &content_off); - if (kind == LK_QUOTE) quote_stream = 1; - } - - if (kind == LK_HR) { - bios_set_place(row, col); - bios_fillcharattr(0xC4, ATTR_HR, (uint8_t)(SCREEN_W - col)); - return; - } - if (kind >= LK_H1 && kind <= LK_H4) { - switch (kind) { - case LK_H1: base_attr = ATTR_TEXT_TITLE1; break; - case LK_H2: base_attr = ATTR_TEXT_TITLE2; break; - case LK_H3: base_attr = ATTR_TEXT_TITLE3; break; - default: base_attr = ATTR_TEXT_TITLE4; break; - } - cur_attr = base_attr; - p = content_off; - } else if (kind == LK_ULIST) { - /* Базовая поддержка вложенности: ведущие пробелы сохраняем, - * затем рисуем маркер списка и пробел перед содержимым. */ - uint32_t q = p; - uint32_t qmax = p + SCREEN_W; - while (q + 2 < content_off && q < qmax && fb(q) == ' ') q++; - uint8_t nsp = (uint8_t)(q - p); - if (nsp > (uint8_t)(SCREEN_W - col)) nsp = (uint8_t)(SCREEN_W - col); - if (nsp > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, nsp); - col = (uint8_t)(col + nsp); - } - if (col < SCREEN_W) wrchar(col++, row, 0x07, ATTR_LIST_MARKER); /* символ маркера списка */ - if (col < SCREEN_W) wrchar(col++, row, ' ', ATTR_TEXT); - p = content_off; - } else if (kind == LK_OLIST) { - /* Отступ -> пробелы; цифры и '.' / ')' рисуем как маркер; - * завершающий пробел — обычным атрибутом текста. */ - uint32_t q = p; - uint32_t qmax = p + SCREEN_W; - while (q < content_off && q < qmax && fb(q) == ' ') q++; - uint8_t nsp = (uint8_t)(q - p); - if (nsp > (uint8_t)(SCREEN_W - col)) nsp = (uint8_t)(SCREEN_W - col); - if (nsp > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, nsp); - col = (uint8_t)(col + nsp); - } - /* Маркер (цифры/'.'/')') читается из fb() — это окно 3, - * BIOS принимает указатели только из #4000..#BFFF, поэтому - * сначала копируем во временный буфер на стеке (окно 2), - * чанками по 8 байт (маркер почти всегда короче, но длинный - * корректно не обрезается, просто шлётся несколькими - * bios_writeattr вместо одного). */ - { - char mkbuf[8]; - uint8_t first_chunk = 1; - while (q < content_off - 1 && col < SCREEN_W) { - uint8_t n = 0; - while (q < content_off - 1 && - (uint8_t)(col + n) < SCREEN_W && - n < sizeof(mkbuf)) { - mkbuf[n] = fb(q); - q++; - n++; - } - if (n == 0) break; - if (first_chunk) { bios_set_place(row, col); first_chunk = 0; } - bios_writeattr(mkbuf, n, ATTR_LIST_MARKER); - col = (uint8_t)(col + n); - } - } - if (col < SCREEN_W) wrchar(col++, row, ' ', ATTR_TEXT); - p = content_off; - } else if (kind == LK_QUOTE) { - /* Отступ -> пробелы; затем quote-префикс '│' (0xB3), - * пробел и далее содержимое. */ - uint32_t q = p; - uint32_t qmax = p + SCREEN_W; - while (q + 1 < content_off && q < qmax && fb(q) == ' ') q++; - uint8_t nsp = (uint8_t)(q - p); - if (nsp > (uint8_t)(SCREEN_W - col)) nsp = (uint8_t)(SCREEN_W - col); - if (nsp > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', ATTR_TEXT, nsp); - col = (uint8_t)(col + nsp); - } - if (col < SCREEN_W) wrchar(col++, row, 0xB3, ATTR_QUOTE_MARKER); - if (col < SCREEN_W) wrchar(col++, row, ' ', ATTR_TEXT); - p = content_off; - } - - /* Эффективный горизонтальный сдвиг: применяется только к nowrap-строкам. */ - uint8_t effective_vx = (rec.flags & IF_NOWRAP) ? viewport_x : 0; - /* cc — видимая колонка внутри области контента - * (после фиксированного префикса строки). */ - uint8_t cc = 0; - char prev_ch = ' '; /* используется в проверке границ emphasis */ - - /* Буферизация "ровного" прогона одного атрибута: символ и атрибут - * внутри этого while переменные (emphasis/tab/soft-wrap), поэтому - * весь цикл одним BIOS-вызовом не свернуть — но между сменами - * атрибута почти всегда идёт протяжённый одноцветный текст, и - * именно его стоит копить в runbuf и сбрасывать одним - * bios_writeattr() вместо посимвольных wrchar(). - * runbuf вмещает целую строку экрана — переполнение невозможно, - * т.к. весь цикл и так ограничен col < SCREEN_W. */ - char runbuf[SCREEN_W]; - uint8_t run_len = 0; - uint8_t run_attr = cur_attr; - uint8_t need_place = 1; - - while (p < seg_end && col < SCREEN_W) { - uint8_t soft_join = 0; /* 1: вставлен виртуальный пробел мягкой склейки, p уже сдвинут */ - char ch = fb(p); - /* '\' - * перед концом сегмента — это маркер wide-break: - * поглощаем его без вывода (кроме verbatim code-body). */ - if (parse_inline && ch == '\\' && (p + 1) < seg_end) { - char nb = fb(p + 1); - if (nb == '\n' || nb == '\r') { p++; continue; } - } - /* Мягкий перенос (перевод строки внутри одного сегмента). - * Рендер должен повторить логику индексатора: - * - quote: пропустить сырой `> ` следующей строки; - * - list/plain: схлопнуть перенос + ведущий отступ в 1 пробел. */ - if (parse_inline && (ch == '\n' || ch == '\r')) { - uint32_t next = p + 1; - if (quote_stream && next < seg_end) { - uint32_t next_content = next; - if (classify_line(next, &next_content) == LK_QUOTE) { - /* Мягкая склейка quote-строк: `> ` не рендерим. */ - p = next_content; - ch = ' '; - soft_join = 1; - } else { - /* Защита: если внутри quote-сегмента встретился - * не-цитатный перенос, работаем как обычная мягкая склейка. */ - while (next < seg_end) { - char ws = fb(next); - if (ws == ' ' || ws == '\t') next++; - else break; - } - if (next > (p + 1)) { - p = next; - soft_join = 1; - } - ch = ' '; - } - } else { - while (next < seg_end) { - char ws = fb(next); - if (ws == ' ' || ws == '\t') next++; - else break; - } - if (next > (p + 1)) { - /* Схлопываем перенос + отступ (ленивое продолжение). */ - p = next; - soft_join = 1; - } - ch = ' '; - } - } else if (ch == '\n' || ch == '\r') { - ch = ' '; - } - - /* inline-маркеры (**, ~~, *, _, `): - * helper синхронизирует состояние emphasis и возвращает режим - * обработки текущего токена (поглотить/вывести литерал/обычный символ). */ - if (parse_inline) { - char lit_ch = 0; - uint8_t mk = handle_inline_marker(ch, &p, seg_end, prev_ch, &emph, &lit_ch); - if (mk == 1) { - /* Атрибут меняется -> сбросить накопленный прогон - * со СТАРЫМ атрибутом, прежде чем переключиться. */ - flush_run(row, &col, runbuf, run_len, run_attr, &need_place); - run_len = 0; - cur_attr = emph_to_attr(emph, base_attr); - run_attr = cur_attr; - continue; - } - if (mk == 2) { - if (cc >= effective_vx && col < SCREEN_W && run_len < sizeof(runbuf)) { - runbuf[run_len++] = lit_ch; - col++; - } - cc++; - if (cc >= effective_vx && col < SCREEN_W && run_len < sizeof(runbuf)) { - runbuf[run_len++] = lit_ch; - col++; - } - cc++; - prev_ch = lit_ch; - continue; - } - } - - if (!soft_join) p++; - if (ch == '\t') { - /* Таб расширяется в координатах контента (cc). - * Сначала сбросить накопленный текстовый прогон — таб - * выводится отдельным bios_fillcharattr(), не через runbuf. */ - flush_run(row, &col, runbuf, run_len, run_attr, &need_place); - run_len = 0; - - uint8_t cc_start = cc; - uint8_t tgt = (uint8_t)((cc & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - uint8_t n_total = (uint8_t)(tgt - cc_start); - uint8_t skip = (effective_vx > cc_start) ? (uint8_t)(effective_vx - cc_start) : 0; - if (skip > n_total) skip = n_total; - uint8_t want = (uint8_t)(n_total - skip); - if (want > (uint8_t)(SCREEN_W - col)) want = (uint8_t)(SCREEN_W - col); - if (want > 0) { - bios_set_place(row, col); - bios_fillcharattr(' ', cur_attr, want); - col = (uint8_t)(col + want); - need_place = 0; - } - cc = (uint8_t)(cc_start + skip + want); - prev_ch = ' '; - } else { - if (cc >= effective_vx && col < SCREEN_W && run_len < sizeof(runbuf)) { - runbuf[run_len++] = ch; - col++; - } - cc++; - prev_ch = ch; - } - } - flush_run(row, &col, runbuf, run_len, run_attr, &need_place); - - /* Индикатор обрезки справа для nowrap-строки: - * если после текущей позиции есть ещё видимый контент, - * поверх последней колонки рисуем '>'. */ - if ((rec.flags & IF_NOWRAP) && col >= SCREEN_W) { - uint32_t pp = p; - uint32_t left_bound = rec.off; - while (pp < seg_end) { - char c = fb(pp); - if (c == '\n' || c == '\r') break; - if (c == '`') { pp++; continue; } - if (c == '*' && (pp + 1) < seg_end && fb(pp + 1) == '*') { - char pc = (pp > left_bound) ? fb(pp - 1) : ' '; - char nc = (pp + 2 < seg_end) ? fb(pp + 2) : '\n'; - if (is_emph_flanked(pc, nc)) { pp += 2; continue; } - /* Литерал `**` тоже считается видимым контентом справа. */ - } else if (c == '*' || c == '_') { - char pc = (pp > left_bound) ? fb(pp - 1) : ' '; - char nc = (pp + 1 < seg_end) ? fb(pp + 1) : '\n'; - if (is_emph_flanked(pc, nc)) { pp++; continue; } - } - wrchar(SCREEN_W - 1, row, '>', ATTR_TRUNC); - break; - } - } - - /* Индикатор скрытого контента слева при горизонтальном сдвиге. */ - if ((rec.flags & IF_NOWRAP) && viewport_x > 0) { - wrchar(0, row, '<', ATTR_TRUNC); - } - } - /* Дозаполняем остаток строки пробелами, чтобы стереть хвост - * от предыдущего кадра рендера. */ - { - uint8_t pad_attr = (parse_inline ? ATTR_TEXT : ATTR_TEXT_CODE); - if (col < SCREEN_W) { - bios_set_place(row, col); - bios_fillcharattr(' ', pad_attr, (uint8_t)(SCREEN_W - col)); - } - } -} - -/* Рендерит все 30 строк окна, начиная от top_line. */ -static void render_viewport(void) -{ - for (uint8_t i = 0; i < VIEW_H; i++) { - render_line((uint16_t)(top_line + i), (uint8_t)(VIEW_TOP_ROW + i)); - } -} - -/* Возвращает процент прокрутки (0..100) относительно доступного диапазона. */ -static uint8_t calc_pct(void) -{ - uint8_t pct; - if (n_lines <= VIEW_H) - pct = 100; - else - pct = (uint8_t)((uint32_t)top_line * 100UL / (uint32_t)(n_lines - VIEW_H)); - return pct; -} - -/* Рисует динамическую часть статус-бара без printf. - * Полностью перезаписывает колонки 45..79, чтобы не оставлять «хвосты». */ -static void render_status_numbers(void) -{ - uint16_t last = top_line + VIEW_H; - if (last > n_lines) last = n_lines; - uint8_t pct = calc_pct(); - - textattr(ATTR_BAR); - bios_set_place(0, 45); - bios_fillcharattr(' ', ATTR_BAR, (uint8_t)(SCREEN_W - 45)); - - wrchar(45, 0, 0xB3, ATTR_BAR); /* вертикальный разделитель */ - gotoxy(47, 0); - cputs("L "); - dec16(top_line + 1); - cputs("-"); - dec16(last); - cputs(" / "); - dec16(n_lines); - - - wrchar(70, 0, 0xB3, ATTR_BAR); /* вертикальный разделитель */ - gotoxy( 73, 0); - dec8(pct); - cputs("%"); -} - -/* Полностью перерисовывает статус-бар (заголовок + числа). */ -static void render_full_status(void) -{ - - fill_row(0, ATTR_BAR); - /* Размещение в шапке: "MDVIEW", затем слот спиннера и имя файла. */ - put_str_attr(1, 0, "MDVIEW", ATTR_BAR); - put_str_attr(10, 0, filename, ATTR_BAR); - render_status_numbers(); -} - -/* Обновляет только изменяемую числовую часть статус-бара. */ -static void render_updated_status(void) -{ - render_status_numbers(); -} - -/* Отрисовывает нижнюю строку меню. */ -static void render_menu(void) -{ - fill_row(MENU_ROW, ATTR_MENU_T); - put_str_attr(1, MENU_ROW, "F1", ATTR_MENU_K); - put_str_attr(4, MENU_ROW, "Help", ATTR_MENU_T); - /* F2 зарезервирован: режимов wrap/unwrap больше нет. */ - put_str_attr(SCREEN_W - 10, MENU_ROW, "F10", ATTR_MENU_K); - put_str_attr(SCREEN_W - 5, MENU_ROW, "Exit", ATTR_MENU_T); -} - -/* ================================================================== - * Прокрутка - * ================================================================== */ - -/* Ограничивает top_line допустимым диапазоном с учётом высоты окна. */ -static void clamp_top(void) -{ - if (n_lines <= VIEW_H) { - top_line = 0; - } else if (top_line > n_lines - VIEW_H) { - top_line = (uint16_t)(n_lines - VIEW_H); - } -} - -/* Прокрутка вверх на n строк с частичной перерисовкой при n == 1. */ -static void md_scroll_up(uint16_t n) -{ - uint16_t new_top_line = (top_line >= n) ? (uint16_t)(top_line - n) : 0; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); - render_line((uint16_t)(top_line), (uint8_t)(VIEW_TOP_ROW)); - } else { - render_viewport(); - } - } -} - -/* Прокрутка вниз на n строк с частичной перерисовкой при n == 1. */ -static void md_scroll_down(uint16_t n) -{ - uint16_t new_top_line = (top_line + n < n_lines - VIEW_H) ? - (uint16_t)(top_line + n) : n_lines - VIEW_H; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); - render_line((uint16_t)(top_line + VIEW_H - 1), (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); - } else { - clamp_top(); - render_viewport(); - } - } -} - -/* Горизонтальный сдвиг (только если в окне есть nowrap-строки). - * Максимум сдвига ограничен самой широкой nowrap-строкой на экране. */ -static void md_scroll_horizon(int8_t delta) -{ - uint16_t maxw = 0; - for (uint8_t i = 0; i < VIEW_H; i++) { - uint16_t li = (uint16_t)(top_line + i); - if (li >= n_lines) break; - if (!is_nowrap(li)) continue; - uint32_t a = seg_off(li); - uint32_t b = seg_off((uint16_t)(li + 1)); - if (b > file_size) b = file_size; - uint16_t w = (b > a) ? (uint16_t)(b - a) : 0; /* приблизительная видимая ширина */ - if (w > maxw) maxw = w; - } - if (maxw == 0) return; /* в окне нет nowrap-контента */ - - /* Максимальный сдвиг = ширина за пределами экрана, в границах uint8. */ - uint16_t over = (maxw > SCREEN_W) ? (uint16_t)(maxw - SCREEN_W) : 0; - if (over > 248u) over = 248u; - uint8_t max_vx = (uint8_t)over; - - int16_t nx = (int16_t)viewport_x + delta; - if (nx < 0) nx = 0; - if (nx > (int16_t)max_vx) nx = max_vx; - if ((uint8_t)nx != viewport_x) { - viewport_x = (uint8_t)nx; - render_viewport(); - } -} - - -/* ================================================================== - * Вывод ошибки - * ================================================================== */ - -/* Печатает сообщение об ошибке и ждёт нажатия клавиши. */ -static void die(const char *msg) -{ - clrscr_attr(ATTR_TEXT); - puts(msg); - puts("Press any key to exit..."); - (void)getkey(); -} - -/* ================================================================== - * Диалог справки (F1) - * ================================================================== */ - -/* Заполняет одну внутреннюю строку диалога (r=0 — первая строка за рамкой). - * Строка s в кодировке CP866; остаток до края дополняется пробелами. */ -static void help_line(uint8_t r, const char *s, uint8_t attr) -{ - uint8_t x = HELP_X + 1u; - uint8_t y = HELP_Y + 1u + r; - uint8_t len = (uint8_t)strlen(s); - if (len > HELP_W - 2u) len = HELP_W - 2u; - - bios_set_place(y, x); - if (len > 0) bios_writeattr(s, len, attr); - /* place уже продвинут bios_writeattr на len колонок (verified). */ - if (len < HELP_W - 2u) { - bios_fillcharattr(' ', ATTR_HELP_BG, (uint8_t)(HELP_W - 2u - len)); - } -} - -static void show_help(void) -{ - /* " Помощь " в CP866 (8 байт) */ - static const char title[] = " \x8F\xAE\xAC\xAE\xE9\xEC "; - uint8_t tlen = 8u; - uint8_t lft = (uint8_t)((HELP_W - 2u - tlen) / 2u); /* = 27 */ - uint8_t rgt = (uint8_t)(HELP_W - 2u - tlen - lft); - /* Верхняя граница рамки с заголовком по центру. - * place продвигается каждым BIOS-вызовом (verified), поэтому - * достаточно одной установки места на всю строку рамки. */ - wrchar(HELP_X, HELP_Y, 0xDA, ATTR_HELP_BDR); /* ┌ */ - bios_set_place(HELP_Y, (uint8_t)(HELP_X + 1u)); - if (lft > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, lft); - if (tlen > 0) bios_writeattr(title, tlen, ATTR_HELP_TIT); - if (rgt > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, rgt); - wrchar(HELP_X + HELP_W - 1u, HELP_Y, 0xBF, ATTR_HELP_BDR); /* ┐ */ - - /* Боковые границы (левый и правый │ для каждой строки тела) */ - for (uint8_t r = 1u; r < HELP_H - 1u; r++) { - wrchar(HELP_X, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - wrchar(HELP_X + HELP_W - 1u, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - } - - /* Нижняя граница рамки */ - wrchar(HELP_X, HELP_Y + HELP_H - 1u, 0xC0, ATTR_HELP_BDR); /* └ */ - bios_set_place((uint8_t)(HELP_Y + HELP_H - 1u), (uint8_t)(HELP_X + 1u)); - bios_fillcharattr(0xC4, ATTR_HELP_BDR, (uint8_t)(HELP_W - 2u)); - wrchar(HELP_X + HELP_W - 1u, HELP_Y + HELP_H - 1u, 0xD9, ATTR_HELP_BDR); /* ┘ */ - - /* Содержимое (20 внутренних строк) */ - uint8_t r = 0; - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " MDView v0.2 -- Markdown Viewer for Sprinter", ATTR_HELP_HDR); - help_line(r++, " (c) 2026 Petrov A.G.", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Navigation:", ATTR_HELP_HDR); - help_line(r++, " \x18 \x19 Scroll one line up / down", ATTR_HELP_BG); - help_line(r++, " PgUp PgDn Scroll one page up / down", ATTR_HELP_BG); - help_line(r++, " Home End Jump to beginning / end of document", ATTR_HELP_BG); - help_line(r++, " \x1B \x1A Horizontal pan (code blocks/tables)", ATTR_HELP_BG); - help_line(r++, " Esc F10 Exit", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Markdown elements:", ATTR_HELP_HDR); - help_line(r++, " # ## ### Headings H1-H6", ATTR_HELP_BG); - help_line(r++, " **bold** *italic* `code` ~~strike~~", ATTR_HELP_BG); - help_line(r++, " > quote ``` ... ``` Fenced code block", ATTR_HELP_BG); - help_line(r++, " - * + item 1. 2. Ordered list", ATTR_HELP_BG); - help_line(r++, " |----|----| Tables", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " File size: up to 128 KB (EMM). Lines: up to 16384.", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - - (void)getkey(); - - render_full_status(); - render_viewport(); - render_menu(); -} - -/* ================================================================== - * Точка входа - * ================================================================== */ - -int main(int argc, char **argv) -{ - const char *path; - if (argc >= 2) { - path = argv[1]; - } else { - path = "README.MD"; - /* Дефолтный файл отсутствует — выводим подсказку без смены режима экрана. */ - { - int chk = open(path, O_RDONLY); - if (chk < 0) { - cputs("MDView v0.2 -- Markdown Viewer for Sprinter\r\n"); - cputs("(c) 2026 Petrov A.G.\r\n\r\n"); - cputs("Usage: mdview \r\n"); - cputs(" Displays a Markdown document (CP866, up to 128 KB).\r\n"); - return 1; - } - close(chk); - } - } - - /* Копируем путь в static filename[] для отображения в статус-баре. */ - { - uint8_t i = 0; - while (i < (uint8_t)(sizeof(filename) - 1) && path[i]) { - filename[i] = path[i]; - i++; - } - filename[i] = 0; - } - - /* Сначала поднимаем UI, чтобы пользователь видел шапку/меню/спиннер - * уже во время загрузки файла и построения индекса. */ - settextmode(TEXT_MODE_80x32); - clrscr_attr(ATTR_TEXT); - set_pallete(); - render_menu(); - render_full_status(); - spinner_show(1); - - int rc = load_file(path); - if (rc < 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: cannot load file '"); - cputs(path); - cputs("'\n\rError: "); - switch (rc) { - case -1: cputs("open failed"); break; - case -2: cputs("size > 128K or seek failed"); break; - case -3: cputs("mem_alloc_pages failed"); break; - case -4: cputs("short read"); break; - case -5: cputs("index alloc failed"); break; - } - cputs("\n\r\n\r"); - return 1; - } - index_lines(); - spinner_show(0); - if (n_lines == 0) { - die("mdview: empty file"); - unload_file(); - return 1; - } - - render_full_status(); - render_viewport(); - - for (;;) { - uint16_t k = getkey(); - uint8_t ascii = (uint8_t)(k & 0xFF); - uint8_t scan = (uint8_t)((k >> 8) & 0x7F); - - if (ascii) { - if (ascii == 0x1B) break; /* клавиша Esc */ - continue; - } - switch (scan) { - case KEY_F1: show_help(); break; - case KEY_F10: goto exit_loop; - case KEY_UP: md_scroll_up(1); break; - case KEY_DOWN: md_scroll_down(1); break; - case KEY_LEFT: md_scroll_horizon(-(int8_t)HPAN_STEP); break; - case KEY_RIGHT: md_scroll_horizon(+(int8_t)HPAN_STEP); break; - case KEY_PGUP: md_scroll_up(VIEW_H); break; - case KEY_PGDN: md_scroll_down(VIEW_H); break; - case KEY_HOME: top_line = 0; - viewport_x = 0; - render_viewport(); break; - case KEY_END: top_line = (n_lines > VIEW_H) - ? (uint16_t)(n_lines - VIEW_H) : 0; - viewport_x = 0; - render_viewport(); break; - default: continue; - } - render_updated_status(); - } -exit_loop: - unload_file(); - pal_reset(PAL_CGA); - clrscr_attr(ATTR_TEXT); - return 0; -} diff --git a/examples/mdview/todo2 b/examples/mdview/todo2 deleted file mode 100644 index 0244b94..0000000 --- a/examples/mdview/todo2 +++ /dev/null @@ -1,180 +0,0 @@ -Новое требование к первоначальной подготовке документа. - -Правила форматирования и показа - -1) Деление на параграфы. Параграфы разделяются пустыми строками. -2) Заголовки H1-H6 - отдельные параграфы (после них всегда пустые строки) -3) Разделители (---) - тоже - после них всегда пустые строки. -4) Таблица/код (через ```)/списки - это единый параграф. - -Типы текста (строк) - - -Обычный текст - -Может в оригинале находиться на нескольких строках. -Строки могут разделяться -- обычный break - это когда на строке после текста идет перевод строки - -такой текст просто объединяется (в нашем случае если возможно то следующая строка продолжает -выводиться на той же строке что и предыдущая, только отделяется от нее уже не переводом строки -а через пробел. -- широкий break - это когда перед переводом строки есть два или более пробелов или перед переводом -строки находится символ обратный слэш '\' - в этом случае и когда мы выводим текст на экран следующая -строка начинается с новой строки. -- жесткий break - это когда две строки обычного текста разделяются двумя или более переводами -стрки (то есть между ними как минимум есть одна пустая строка) - в этом случае вторая строка -будет считаться новым параграфом и отделяться от предыдущей строки ОДНОЙ пустой строкой (вне -зависимости от того сколько пустых строк в оригинале. -Должно сохраняться действие модификатора bold/italic/strike начатое на одной строке на следующие -если они так же находятся в этом параграфе. Новый параграф (после пустой строки) теряет воздействие -незакрытого модификатора из предыдущего параграфа. -Тип переноса строк - Wrap. - -Заголовки - - -абзацы из одной оригинальной строки. Начальный стиль зависит от типа заголовка (в нем могут встречаться -модификаторы bold/italic/code/strike. -Тип переноса строк - Wrap. - -Разделитель (horizontal rules) - - -Всегда одна строка. После нее выводим пустую строку всегда (следующий текст - новый абзац) - -Списки - -как и в обычном тексте - один пункт списка может находиться в оригинале на нескольких строках. -если появляется новая строка с префиксом пункта списка - это означает что с этой строки начинается -новый пункт списка. если появляется пустая строка - это означает что следующая за пустой строкой -непустая строка уже не является продолжением пункта списка. -Если следующая за пустой строкой строка так же является пунктом списка то такая строка считается -продолжением текущего списка. Только если две строки списков разделены ДВУМЯ и более пустыми -строками то вторая строка с пунктом списка будет считаться началом нового списка - -Пример - - -- строка 1 -- строка 2 -строка 3 -- строка 4 - -- строка 5 - - -- строка 6 - -Должно отображаться так - - -- строка 1 -- строка 2 строка 3 -- строка 4 -- строка 5 - -- строка 6 - -Тип переноса строк - Wrap. -Замечание - перенесенная строка продолжение пункта списка должна начинаться с отступа в -несколько пробелов (для списка первого уровня - два пробела) - то есть с той же позиции -что и начальный текст строки - -Пример - - -- длинная строка которая не может поместиться и будет перенесена по слову 'будет' - -Должно отображаться так - -- длинная строка которая не может поместиться и - будет перенесена по слову 'будет' - -Незакрытые модификаторы типа (bold/etc.) не переносят свою модификацию не последующие пункты списка. -Действуют только в пределах одного пункта. -(то есть фактически - пункт списка - это отдельный параграф но следующий пункт списка (тоже отдельный -параграф) не отделяется от него пустой строкой. -Вложенные списки - поддерживаются. -Для отображения префиксов пунктов списка используется свой стиль. Так же для текста списков используется -отдельный (от обычного текста) стиль. - -Блок Кода - - -Весь блок кода отображается только одним стилем - стилем Кода. В нем не действуют модификаторы -bold/italic/etc (возможно в дальнейшей использование парсера языка для кода что бы отобразить -этот код с подсветкой синтаксиса этого языка, но сейчас весь блок рисуется только одним стилем) -После блока кода - обязательна пустая строка. -Тип переноса строк - UnWrap. - То есть строки НЕ ПЕРЕНОСЯТСЯ. - -Quoted - - -Отображается как отдельный параграф. Перед отображением текста отображается символ префикса Цитирования -Способы переноса текста аналогичны обычному тексту, за исключение того что перенесенные строки так же -предваряются префиксом Цитирования -Для отображения префиксов Цитирования используется свой стиль. Так же для текста цитирования используется -отдельный (от обычного текста) стиль. -Тип переноса строк - Wrap. -Пример форматирования - - -> Первый параграф -> -> Второй параграф -> > Вложенный параграф -> -> Продолжение основной цитаты - длинная строка (переносится по слову 'строка') - -Будет отображаться так - -| Первый параграф -| -| Второй параграф -| | Вложенный параграф -| -| Продолжение основной цитаты - длинная -| строка (переносится по слову 'строка') - - -Таблицы - - -Пока отображаются as is. -Дальше возможно предусмотрим вариант вычисления ширины столбцов и форматирование -вывода что бы все ячейки столбца имели одинаковую ширину. -Тип переноса строк - UnWrap. - -Типы переноса строк - - -Wrap - - -происходит перенос текста с одной строки на другую по разделителям пробелам (предусмотреть -во второй версии возможность использовать разделителем знаков точка, запятая, восклицательный -знак, вопросительный знак, дефис. Замечание - новая строка не может начинаться со знаков -разделителей - то есть если у нас идет многоточие (три точки) то нельзя что бы одна точка -была в конце первой строки а остальные две на другой - если идут несколько разделителей подряд -то они считаются как один и должны оставаться на первой строке). - -UnWrap - - -Текст НЕ ПЕРЕНОСИТСЯ. -Если строка не помещается на экране - то в конец строки на экране выводим символ-знак наличия -продолжения строки справа за краем экрана (свой стиль для этого символа). -Символ '>'. -Если есть хотя бы одна строка которая не помещается на экране - то разрешаем горизонтальный -скроллинг. -ЗАМЕЧАНИЕ - скроллируется только текст выводящийся в режиме UnWrap. -Если произведен скроллинг влево (строки UnWrap начинаются показываться не с первой позиции) -то на первой позиции отображем другой символ '<' сообщающий пользователю что есть текст -за левым краем экрана. -Скроллирование не бесконечно - если на экране нет строк UnWrap для которых есть скрытый текст -за правым краем экрана то скроллирование влево больше не возможно, и наоборот - если при -скроллировании вправо дошли до показа строк UnWrap с первой позиции то дальше скроллинг в этом -направлении так же невозможен. Скроллинг идет с грануляцией по 8 символов. -(сейчас UnWrap текст это только блоки кода и таблицы). - - -Проанализируй данную постановку задачи. - -Что требуется - - -Мы более не поддерживаем два режима показа - Wrap/UnWrap - только один (смешанный). -Потому вопрос - надо ли нам сохранять оригинальный контент считанного файла с диска ? -Или при подготовке данных считываемых с диска можно сразу преобразовывать его в формат -готовый для показа (объединять строки в одном параграфе и так далее) ? -Ограничения - не забывать о том что это все работает на компьютере с 8-ми битным процессором. -Потому очень экономно относимся к памяти и лишней работе процессора - все должно быть весьма -быстрым и компактным. -Требования для работы с файлами 128 Кб сохраняется. - -Для версии 2 - -Подумай о возможности использования банков памяти не только для содержимого файла а например -для буферов типа line_offset/init_style и прочих (тогда их размер может так же быть динамическим -и чем больше банков памяти будет использовано для чтения файла тем больше станут размеры этих -буферов. \ No newline at end of file diff --git a/examples/mdview2/CHANGELOG.md b/examples/mdview2/CHANGELOG.md deleted file mode 100644 index 377c447..0000000 --- a/examples/mdview2/CHANGELOG.md +++ /dev/null @@ -1,79 +0,0 @@ -# MDView - CHANGELOG - -ଠ: ᨨ git-ਨ ஥. ࠭ CP866 - - 㤮 ᠬ MDView ( ⮤⥪ ஢). - -## v1.0 (b3) - 2026-07-05 - -- ⮢ ண ஢: 짮⥫ ⠥ - 㬥, 蠬 ண - (UTF-8 8-⭮ ࢨ筮 ). ࢮ F8 筮 - 㦥 ⮢ - ४祭 . F8 ⮢ ந - , 稢 ⮥ 䮭 ( ). -- : ࠭ ண, ᫥ - 뤥ন 宫 - ஫ ⮯஬ 䮭 . -- ॢ १㥬 蠣 (index_begin/index_step); - 筮 ࠩ: UTF-樨 ᢥ夫 (>4 ) - १ ⮪ 㬥. -- ஢ - 뢠 ࠧ: ⥪஢ - - 砫 ࢮ 樨, F8 - ४祭, - ᡮન . - -## v1.0 (b1) - 2026-07-05 - -- HEX-० (F4): 䠩 ଠ - "0x012340 : 16 hex : 16 ᨬ". - ⭠ 뢠 ⥪ ஢; UTF-8 - ⠢ 樨 -, continuation- - 窮. - ஢ (F8) HEX ⮫쪮 . -- ப⪠ HEX ப - ஫ ᮢ - 鸞 ( MD/RAW). -- ࠢ: F4, v1.0 (b1). - -## v1.0 (a4) - 2026-07-04 - -- ४祭 ஢: F2 (MD/RAW), - F8 (8- / UTF-8) ࠭ ⥪饥 㬥. - ࠬ ࠧ ࠧ ७ ய樮쭮 - ⠬ 筮 ப. -- ࠢ: F8 RAW-० ᮢ MD- RAW. -- ⨬ ࠧ: exe 28215 -> 25100 (-11%): - ᨢ ॣ஢ SDCC (--max-allocs), 㫥 - _DATA crt0 ( "= 0" ⨪), 㯫 , - ᫨ﭨ ᪠஢ inline-ࠧ⪨ scan_stream. - -## v1.0 (a3) - 2026-06-30 - -- 䠩 256 : 訩 䠩 १ ।०, - ⠭ 㯭. -- ௠ / 蠥 ப-ᮮ饭 - 稭 ( 宩 ப). -- ஢ - ࠢ; 業 ப⪨ 16-⭮ - 䬥⨪ ( 32-⭮ ). -- ⮢ 䠩 ࠭ 砥 (testfiles/, ). - -## v1.0 (a2) - 2026-06-26 - -- 饯 㫨: + index/md/raw/enc/table/status/help - (ࠧ-ࠫ쭮, ⠥). -- ࠢ 㡫 ப RAW ஫ 䠩. - -## v1.0 (a1) - 2026-06-25 - -- প ஢ CP866/CP1251/KOI8-R/UTF-8 (F8): - ⮮। ⨨, ६ 8-, - UTF-8 ⤥ (६⠫쭮). -- RAW-ᬮ 室 (F2): ७ ⭮ 80 ࠬ (F3). -- ⨬ ࠧ (-1.9 ). - -## v1.0 (a0) - 2026-06-23..24 - -- : render-cache ⥪ - 室 , - ⮢ ப (ᨬ+ਡ) EMM, ப⪠. -- Markdown: , ᯨ᪨, , ࠧ⥫, fenced-, - ⠡ ࠬ -ਭ , inline-ࠧ⪠ - (/ᨢ/ભ/ભ/, ࠭஢). -- ணᨢ 㧪: ࠭ ࠧ, 䮭, - ⮢ , Esc/F10 뢠. -- ਧ⠫ ஫ ⠡. -- ᪮७ ९ᨭ (22 -> 10 讬 䠩). diff --git a/examples/mdview2/DEMO.MD b/examples/mdview2/DEMO.MD deleted file mode 100644 index e4b414e..0000000 --- a/examples/mdview2/DEMO.MD +++ /dev/null @@ -1,840 +0,0 @@ -# MDView — Просмотрщик Markdown для Sprinter - -**MDView** — программа для просмотра документов в формате *Markdown* на компьютере -Sprinter (процессор Z80). Документ хранится в отдельном W3 окне и не занимает -основную RAM программы. - -## Возможности - -- Документы до **128 КБ** (8 страниц EMM по 16 КБ каждая) -- До **16 384** экранных строк в индексе -- Автоматический перенос слов по ширине экрана (80 столбцов) -- Горизонтальный сдвиг для широких строк (блоки кода, таблицы) -- Статус-бар: имя файла, диапазон строк, процент прокрутки -- Спиннер в строке состояния во время загрузки и индексации -- Поддержка «мягкого» склеивания строк в абзацах и цитатах - -## Запуск - -``` -mdview [имя_файла.md] -``` - -Если имя файла не задано, загружается `README.MD`. - -## Управление - -``` -Клавиша Действие -───────────── ──────────────────────────────────────── -Up Down Прокрутка на одну строку вверх / вниз -PgUp PgDn Прокрутка на страницу (30 строк) -Home Начало документа -End Конец документа -Left Right Горизонтальный сдвиг (только nowrap-строки) -F1 Окно справки -F8 Кодировка: CP866 → CP1251 → KOI8-R → UTF-8 → ... -F10 / Esc Выход из программы -``` - -Кодировка определяется автоматически при открытии (BOM + эвристика по -первым 4 КБ); `F8` переключает её вручную, если детекция ошиблась. -8-битные кодировки (CP866/CP1251/KOI8-R) переключаются мгновенно (ремап на -отрисовке). Второй набор индекс/кэша (например UTF-8) строится лениво — при -первом переключении в него (короткая пауза со спиннером), дальше мгновенно. - -## Синтаксис Markdown - -### Заголовки - -Поддерживаются уровни H1–H4. Уровни H5 и H6 отображаются как H4. - - # Заголовок первого уровня - ## Заголовок второго уровня - ### Заголовок третьего уровня - #### Заголовок четвёртого уровня - -### Текстовое форматирование - -**Жирный текст** выделяется двойными звёздочками: `**текст**` - -*Курсив* выделяется одиночными звёздочками `*текст*` или знаком подчёркивания `_текст_` - -`Встроенный код` обозначается обратными кавычками - -~~Зачёркнутый текст~~ — двойные тильды: `~~текст~~` - -### Ненумерованный список - -Маркеры `-`, `*` или `+`: - -- Первый пункт списка -- Второй пункт списка -- Третий пункт с достаточно длинным текстом, который при необходимости - будет перенесён на следующую строку с сохранением отступа - -### Нумерованный список - -1. Первый элемент -2. Второй элемент -3. Третий элемент - -### Цитата - -> Блок цитаты начинается с символа `>`. Несколько последовательных -> строк одной цитаты склеиваются в единый абзац с автоматическим -> переносом слов. - -### Блок кода (verbatim) - -Блок кода заключается в тройные обратные кавычки. Внутри блока -текст отображается «как есть» без разбора Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### Горизонтальная линия - -Три или более символов `---`, `***` или `___` на отдельной строке: - ---- - -## Технические характеристики - -- **Платформа:** Sprinter, процессор Z80 @ 21 МГц -- **Кодировки:** CP866 / CP1251 / KOI8-R / UTF-8 (автоопределение, `F8`) -- **Максимальный размер файла:** 128 КБ -- **Максимальное число строк в индексе:** 16 384 -- **Максимальная длина строки в рендер-кэше:** 255 ячеек (см. ограничение ниже) -- **Режим памяти:** small - - Код программы, cтек, данные, куча — окнa W1-W2 (32 КБ, адреса 0x4000–0xBFFF). - - Буфер файла — страницы EMM, отображаемые в W3 (0xC000–0xFFFF) - -## Известные ограничения - -### Длина строки в MD-режиме — 255 ячеек - -Рендер-кэш хранит каждую логическую строку как **не более 255 пар (символ, атрибут)** -— константа `MAX_CACHE_LINE_LEN`. Лимит задан типами: `g_ncells` и -`cache_rec_t.len` — `uint8_t`. Касается всех строк, но заметнее всего на -**горизонтально скроллируемых** строках (блоки кода и строки таблиц, флаг -`IF_HSCROLL`), которые в MD-режиме можно листать вправо. - -**Что происходит с более длинной строкой:** при индексации `gc_put()` молча -отбрасывает каждую ячейку после 255-й (`if (g_ncells < MAX_CACHE_LINE_LEN)`). -В кэш попадают только первые 255 ячеек, остаток **теряется** — до него нельзя -доскроллить и **нет маркера обрезки** на 255-й позиции (маркер `>` означает лишь -«есть ещё в пределах кэша»). Переполнения буфера нет — `gc_put` проверяет границу. - -Важно: «255 ячеек» — это **отрендеренная ширина**, не байты исходника. Табы в -коде разворачиваются в пробелы (до `TAB_STOP`), а ячейки таблицы добиваются -пробелами до ширины колонки + рамки `│` — поэтому кап достигается раньше, чем -255 «полезных» символов. - -> **RAW-режим (`F2`) этого лимита не имеет** — он рисует прямо из файла -> побайтово, длинные строки видны целиком (через wrap `F3` или гориз. скролл). - -**Идея снятия лимита** (оценка, не реализовано) — расширить длину до `uint16_t`: -- `cache_rec_t.len` `uint8_t→uint16_t` — структура остаётся **ровно 8 байт** - (len съедает один pad-байт), адресация `idx<<3` не меняется. Бесплатно. -- `g_ncells` / `g_ncells_at_space` → `uint16_t` — главная цена по **коду/скорости**: - 16-битная арифметика на Z80 в горячем `gc_put` (вызов на каждую ячейку) и в - scan-циклах. Ориентир: **+0.2…0.4 КБ кода** + замедление индексации. -- Буфер `g_cells[MAX_CACHE_LINE_LEN*2]` в near-RAM (W2) — главная цена по - **памяти**: `2 × кап` байт. Сейчас 510 Б; кап 512 → +0.5 КБ, 1024 → +1.5 КБ. - EMM-кэш контента (1 МБ) длинные строки тянет легко — узкое место именно near. -- `viewport_x` (и копия в `docset_t`) + потолок `max_vx` (сейчас 248) → `uint16_t`, - иначе хранить >255 можно, а доскроллить нельзя. Плюс `widths[]`/`ccx` в таблицах/коде. - - Реалистичный компромисс — кап 512–1023: хватит почти всем листингам/таблицам, - цена ~+0.3 КБ кода и +0.5…1.5 КБ near-RAM. **Дешёвая полумера без `uint16_t`** — - ставить честный маркер обрезки на 255-й позиции, чтобы потеря была видна. - -## TODO - -1. **Увеличение размера документов.** Снять лимит 128 КБ: Достаточно - разрешить работать с большим кол-вом страниц памяти, пока оттестированно - на работе с 8-мю страницами по 16Кб. - -Сделано: форматированные таблицы с рамкой; поддержка кодировок -CP866 / CP1251 / KOI8-R / UTF-8 с автоопределением и переключением по `F8` -(второй набор строится лениво, по первому переключению). - -4. **Ускорение рендеринга.** Кэш строк экрана. Оптимизация цикла вывода - символов через BIOS WRCHAR (пакетный вывод, DMA). - ---- - -*MDView v0.2 · (c) 2026 Петров А.Г.* - - ---- - -# Sprinter C Compiler — v1.0 - -C toolchain for **Sprinter** — the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** — one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` — see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320×256×256 and 640×256×16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it — `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size — small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O — read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320×256×256 lines / rects / accelerator | -| `gfx_d16` | 640×256×16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` — puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` — atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` — from SDCC z80.lib -* `` — read / write / close / lseek / unlink -* `` — open / creat + O\_RDONLY / O\_CREAT / ... -* `` — errno + error names + strerror -* `` — stat / fstat -* `` / `` — from SDCC - -Sprinter-specific: -* `` — putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` — gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text — for both 320 and 640 modes (gfx_\*16 variants) -* `` — full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` — chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` — getdatetime / setdatetime + POSIX time / localtime / etc. -* `` — raw ports, ESTEX/BIOS function numbers, env API -* `` — exit / \_exit / atexit -* `` — mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` — Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE — verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** — `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) — see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** — research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) — requires IM2 -* **ISA-8 slot drivers** — requires IM2 (???) - -## Documentation - -* `docs/TODO.md` — roadmap and open work items -* `docs/solid_c_compatibility.md` — gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` — interrupt handler design (v2) -* `docs/converted/` — source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` — original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` — - MIT-licensed. -* `third_party/sdcc/` — SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` — original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** — Иван Мак, Дмитрий Паринов and the original team -* **SDCC** — for the underlying Z80 compiler -* **MAME** — for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - -Открытые задачи в порядке убывания приоритета. По мере появления реальных программ — приоритеты будут смещаться. - -## Этап 5 — malloc / free + banking-aware page allocator ✅ ГОТОВО - -- [x] SDCC's `malloc`/`free` + наш `runtime/heap.s` (полностью заменяет library heap.rel, 14000-байтный heap в окне 2) -- [x] `libc/mem/mem_alloc.c` — page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` через ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` — HOME-резидентные `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` со свопом W3 внутри -- [x] `examples/malloc_test/` — проверка SDCC's malloc (~210 64-байтных allocations через всю heap) -- [x] `examples/mem_test/` — проверка page allocator: 3 страницы, разные паттерны через bank_write, верификация через bank_read - -## Этап 6 — argv parsing + sprinter-cc wrapper ✅ ГОТОВО - -- [x] crt0 парсит ESTEX command-line из IX-prefix (inline asm в `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] Передача `argc`/`argv` в main() через HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE через ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` — opt-out для очень маленьких программ -- [x] `runtime/crt0_banked.s` — теперь тоже парсит argv (parse_argv + get_progname скопированы из crt0.s; будет factored в argv.s когда возьмёмся за libsprinter.lib) -- [x] Bash-обёртка `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` одной строкой -- [x] Поддержка опций: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## Этап 8 — графика (320×256×256 + 640×256×16 + accel + bitmap font) ✅ ГОТОВО - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). Палитра через BIOS PIC_SET_PAL ($A4). Verified 320×256×256. -- [x] **8b** Линии/прямоугольники/fill через accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` через accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` с heuristic выбором ориентации (h/v bursts count), `gfx_line` с Bresenham для диагоналей. `gfx_clear` тоже переписан на column-major accel (~4× быстрее). -- [x] **8c** 640×256×16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (документация misleading), per-row RMW для vline (один байт = 2 горизонтальных пикселя). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): шрифт через BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` для 320 mode, `gfx_text16`/`gfx_putchar16` для 640 mode с pair-table lookup. - -См. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - -Открытые мелочи (не блокируют): -- [ ] Шрифт-quad для 640: per-cell палитра (mode 0x82 разрешает 1 из 4 палитр per 16×8 cell) — через прямой доступ к area-описания экрана 0x0300..0x039F - -## Auto-banking (см. `memory/banking_roadmap.md` для деталей) - -Phase 1 — file-level bin-packing — реализовывать когда проект перерастёт ~30 KB кода. - -- [ ] `toolchain/auto_bank.py`: - - Парсит размеры из `.rel`-файлов (или из .map после dry-run link'а) - - First-fit-decreasing bin-packing - - Уважает `#pragma codeseg BANKn` как manual override - - Перелинковывает с новыми `-Wl-b_BANKn=...` параметрами - - Печатает план распределения - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. Только если/когда понадобится. - -## Bank-local static data (mutable data в том же банке что и код) — ✅ ГОТОВО - -- [x] Пример `examples/bank_local_data/` — функция в BANK1 со своим writable BSS array + const table + malloc-тест -- [x] `mkexe -p 0` для нулевого padding банков (BSS-storage обнуляется при загрузке) -- [x] Канонический рецепт: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` для bank1.c + `-Wl-b_BANK1=0x1C000` для линковки. **`--dataseg BANK1` РАБОТАЕТ** — раньше казалось обратное из-за trampoline bug который маскировал результат. -- [x] **Критичный фикс trampoline'a в runtime/bank.s** — старый `pop af; out (n), a` клобберил A → все banked-функции возвращающие uint8_t тихо возвращали мусор. Новый `pop bc; out (c), b` сохраняет A. -- [x] **malloc из banked-функции работает прозрачно** — heap живёт в W2 (HOME), W2 никогда не свапается trampoline'ом, pointer валиден из любого контекста. См. memory/bank_local_data_pattern.md. -- [x] Документация в memory: `memory/bank_local_data_pattern.md` (полный рецепт + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] Опционально — расширить `check_banks.py` чтобы показывать разбивку size = code + const + bss per bank (cosmetic) - -Зачем: для модулей с большим private state (level loader, audio engine, scene data). Экономит W2 heap для динамики, а статика остаётся в бэке. - -## Подсказки из solid-c (нативный Sprinter C — `third_party/solid-c/`) - -После анализа solid-c'овской libc (см. `memory/solid_c_findings.md`) выявлены готовые паттерны для следующих недостающих функций. Приоритет от **высокого** к низкому: - -### High-priority gaps (легко портировать, большая польза) -- [x] **`errno` + `strerror`/`perror`** — табличка 32 ошибок (libc/io/errno.c) -- [x] **Расширенный `open()`** для O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** — 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** — 6-байт jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** — 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) — libc/io/env.c. Учли doc-bug: реально A=0 это NOT FOUND - -### Medium-priority (нужно для shell-like утилит) -- [ ] **Mouse driver** — `rst $30h`, 17 функций. **Сначала тест что работает в MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** для directory listing — реализовано, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** через ESTEX $21/$22 — libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** — wrappers для ESTEX $1B-$1E — libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** — реализовано -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority — ✅ FILE* stack ГОТОВО - -- [x] **Минимальный unbuffered FILE\*** — `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr как pseudo-streams. См. `memory/file_star_design.md` и `examples/filetest`. -- [ ] fprintf / fscanf — нужна printf-через-callback machinery. Пока пользователь может `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] Опциональный buffered mode (setvbuf, line/block buffering) — если когда-то понадобится. - -### POSIX time API — ✅ ГОТОВО -- [x] `libc/io/posix_time.c` — time/localtime/gmtime/mktime/asctime/ctime поверх getdatetime. SDCC's time.rel избегаем (нельзя override _RtcRead). См. `examples/ptime`. - -### sys/stat — ✅ ГОТОВО -- [x] `libc/io/stat.c` — POSIX stat/fstat. Гибрид open+fstat для файлов, ffirst+iter для папок (включая "."/".."). См. `examples/stattest` и `memory/estex_ffirst_dotdot.md`. - -### assert — ✅ ГОТОВО (используем SDCC's __assert через fallback include path) - -## libc/stdlib — ✅ не нужно делать (см. memory/sdcc_stdlib_works.md) - -Проверено через `examples/stdlib_test/`: SDCC z80.lib содержит работающие реализации: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- Полный `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - -Линкер автоматически тянет из z80.lib когда нужно. **НЕ переписывать**. - -Наши Sprinter-specific обязательные модули остаются: atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc — ✅ ГОТОВО - -- [x] `lib/Makefile` — собирает каждый libc/*.c в `.rel`, архивирует через sdar в `lib/sprinter.lib` -- [x] Включает runtime/bank.s и runtime/heap.s (auto-pulled при __banked/malloc) -- [x] `bin/sprinter-cc` — bash-wrapper: `sprinter-cc -o foo.exe foo.c` одной строкой -- [x] Поддержка опций `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` — демо: `hello.c` собирается за один shell-вызов, размер совпадает с ручным Makefile (925 байт) -- [x] Split `putchar.c` → `putchar.c` + `puts.c` для per-function granularity (puts override SDCC's z80.lib version) -- [x] Включён в `make all` (зависимость `lib` перед `examples`) - -Возможные улучшения (опционально): -- [ ] Мигрировать остальные examples на sprinter-cc вместо ручных Makefile (косметика) -- [ ] Дальнейшая декомпозиция libc/*.c per-function (но текущая granularity уже даёт нужный размер — линкер пакетует .rel целиком, и для большинства файлов это одна функция) - -## Этап 9 — memory modes для sprinter-cc - -DSS выделяет страницы памяти по размеру приложения: < 16 KB → одна страница, в остальные окна подключается «страница #FF» (read=0xFF, write игнорится). Из-за этого CODE-в-W1 + DATA-в-W2 для маленькой программы молча ломается. См. [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: всё (CODE+DATA+стек) в W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` флаг в sprinter-cc**: parser + per-mode дефолты CODE_LOC/DATA_LOC, override через явные `--code-loc`/`--data-loc`. tiny работает; small/big/huge компилируются с warning'ом (runtime не готов). Реализовано 2026-05-30. -- [x] **`--memory-manual SPEC`**: парсит `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. Реализовано 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` использует ESTEX `$3D GETMEM` + `$3A SETWIN2` чтобы выделить и замапить W2-страницу ДО gsinit. **НЕ** BIOS `$C4` — стек на этом этапе в W1 (boot_stack в HOME), а BIOS требует стек в W2. После маппинга SP переключается на 0xBFFE, дальше стандартный flow. Реализовано 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect для >16 KB программ**: `crt0_small.s` читает порт `0xC2` (текущая страница в W2 — не `0xA2`! это W1). Если 0xFF — выделяет page; иначе DSS уже сделала это (программа сама вылезла в W2). Один crt0 покрывает 0..30 KB. mkexe также разрешает HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB файл, SETWIN2 path) + 32 KB файл (auto-skip). Реализовано 2026-05-30. -- [x] **`big` runtime** (tiny + banked code в W1): параметризовали `crt0_banked.s` + `bank.s` через `.ifdef BANK_W1` — другой banking port (0xA2 vs 0xE2), другой load-addr (0x4000 vs 0xC000). sprinter-cc prepend'ит `BANK_W1 = 1` при `--memory big`, передаёт `mkexe -B 0x4000`. Пример `examples/banked_big/`. Реализовано 2026-05-30. -- [x] **`huge` runtime** (small + banked code в W3): merge W2-detect логики из `crt0_small.s` в `crt0_banked.s`. Существующий пример `examples/banked/` теперь использует MEMORY=huge. Реализовано 2026-05-30. -- [x] **`--debug` флаг**: prepend `DEBUG_RT = 1` в crt0 + `-DDEBUG_RT` в sdcc. Открывает symbol `_w2_self_allocated` (uint8_t) — runtime diagnostic кто аллоцировал W2. Реализовано 2026-05-30. - -### Дизайн-решения по libc и crt0 - -**Одна `sprinter.lib`** работает для всех memory mode — `.rel`-члены relocatable, SDLD делает dead-code elimination per-member (без графики не подтягивает `gfx_core.rel` и т.д.). Verified hello vs malloc_test через map-файлы. - -**`gfx.lib` отдельно — НЕ нужен**: dead-code elimination уже работает. - -**`libc_banked` (libc в bank вместо HOME)** — идея на потом, когда HOME (16 KB) забит user-кодом + libc в `huge` mode. Реализуется через `--codeseg BANK0` при компиляции libc; trade-off: trampoline ~30 циклов на каждый libc-вызов. Триггер: реальная программа упрётся в HOME budget. - -**HW-зависимые модули — `sprinter_home.lib` отдельно.** Часть libc физически не может быть забанкована в W3, потому что она РАБОТАЕТ с W3: -- `gfx_*` — пишет в видеопамять `0xC000+` после swap W3 на video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) — swap'ит W3 через `OUT (0xE2)` -- Будущие ISR — прерывание может прийти когда W3 на чём угодно - -В huge mode эти модули ДОЛЖНЫ остаться в HOME (W1). Когда будем делать `libc_banked`, **одновременно** выделяем `sprinter_home.lib` (HOME-only) из `sprinter.lib` (bankable). Финальная схема: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib тот же sprinter.lib но --codeseg BANK0 (для huge) -``` -Триггер: реализация `--memory huge` runtime. - -**crt0 — по одному на mode:** -- `crt0.s` — текущий, для **tiny/big**: SP=0xBFFE, парсит argv (W2-ресурс уже выделен DSS). -- `crt0_minimal.s` — текущий, для tiny без argv. -- `crt0_small.s` — **новый, step 3**: для **small/huge**, аллоцирует W2 через `mem_alloc_pages` ДО gsinit, маппит в порт `0xA2`, потом стандартный flow. -- `crt0_banked.s` — текущий, для **big**: trampoline-таблица для W3 банков, CODE в W2. -- `crt0_banked_small.s` — **новый**: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc подбирает crt0 по `--memory` mode (сейчас `--crt0=` это override). -- [x] **Настраиваемый размер стека**: флаг `sprinter-cc --stack-size BYTES`. Wrapper генерирует `heap_top.s` с `___sdcc_heap_end = stack_top + 1 - stack_size`, отдельный .rel линкуется per-program. Default ≈1278 байт (heap_top=0xBB00) из `runtime/heap_top.s`. Реализовано 2026-05-30. - -Интерфейс: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` имеет смысл только с `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ✅ работает. Док-ция в `DiskSyscalls.txt v1.6` ошибочно описывает return-status — A=0 это NOT FOUND, не FOUND. Зафиксировано в `memory/sprinter_platform.md`. - -## ОБЯЗАТЕЛЬНЫЕ ЗАДАЧИ ДЛЯ V2 (после релиза v1) - -### Turbo-C-style graphics API (BGI-like) — **MUST для v2** - -Расширить наш `gfx_*` API до уровня **Turbo-C ``** (BGI) для MS-DOS. -Программисты привыкшие к Turbo-C должны переносить графический код 1-в-1. - -**Что должно быть** (на основе Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` — у нас сейчас `gfx_init`/`gfx_done`, добавить alias -- `getmaxx()` / `getmaxy()` — макрос на GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` — alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` — у нас get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` — current draw color -- `setbkcolor(c)`, `getbkcolor()` — background color -- `setpalette(idx, c)` — палитра entry -- `getpalette(&info)` — read all palette - -Primitives (мы уже имеем эквиваленты — добавить BGI-имена как aliases): -- `putpixel(x, y, c)` — есть как gfx_putpixel -- `getpixel(x, y)` — нужно реализовать (RMW обратное — IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` — current point + line drawing -- `line(x1, y1, x2, y2)` — есть как gfx_line -- `rectangle(x1, y1, x2, y2)` — есть как gfx_rect (но другой API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` — есть как gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` — новое: rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` — новые primitives -- `fillpoly()`, `drawpoly()` — полигоны -- `floodfill(x, y, border_color)` — заливка - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` — есть как gfx_text (alias) -- `settextstyle(font, dir, size)` — multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` — measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` — bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` — save rect to buffer -- `putimage(x, y, buf, op)` — paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` — drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` — двойная буферизация (Sprinter имеет 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` — SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** перенос типичной Turbo-C BGI программы (рисующей с использованием -moveto/lineto/circle/bar/setcolor) должен работать без существенных правок. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) — у нас один BIOS font, остальные нужно - добавить (как bitmap data в lib) -- imagesize/getimage/putimage — самые востребованные для game/animation -- Active/visual page (двойная буферизация) — Sprinter поддерживает 2 graphics pages, - нужен API switching - -См. также `examples/` Turbo C 2.x BGIDEMO как reference что нужно. - -### IM2 Interrupt Handlers — **MUST для v2** - -User-задаваемые ISR через Z80 IM 2 mode. Нужны для: -- Timer ticks (50 Hz frame counter, плавная анимация) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render в interrupt-driven) -- Async keyboard / mouse handling - -**Status:** ОТЛОЖЕНО до v2. Полный research + design в `docs/im2_isr_design.md`. - -**Решение по архитектуре:** реализовать как отдельный memory mode `--memory im2` -(вместо того чтобы лезть во все существующие crt0). Detail'и в design-doc. - -**Резюме research'а** (полный текст в `docs/im2_isr_design.md`): -- Vector 0xFF — frame + keyboard + CBL. Disambiguation по портам 0x19 / 0xFE -- Mouse hardware-IRQ не приходит (на текущей плате) -- Vector table / ISR / stack ОБЯЗАНЫ быть в W2 (0x8000..0xBFFF) -- DSS имеет свой IM 2 handler — нужно chain'иться (иначе клавиатура / SYSTIME ломаются) - -### Прочие крупные пункты для v2 - -- [ ] **FILE API rewrite — buffered streams** — текущая реализация в - `libc/stdio/file.c` это provisional unbuffered shim (каждый fputc/fgetc - = один read/write syscall). Нужна полноценная buffered семантика - как в Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr — fd-маркеры `0 / -1 / -2`. Отрицательные для - stdout/stderr выбраны намеренно: ESTEX OPEN может вернуть positive - small fd (1, 2, …) для обычного файла → если бы stdout=1, реальный - fd=1 сталкивался бы с идентификатором. fd=0 для stdin безопасно - (ESTEX 0 не возвращает). Сами fd не передаются в syscall'ы — - диспетчеризация по флагам `_F_CONIN/_F_CONOUT`. - - Принтер-потоки (stdaux/stdprn) НЕ реализуем — Sprinter принтерной - API не имеет. - - Альтернатива — взять реализацию из third_party/solid-c (sources в - `SRC/CLIB/`); там есть готовый buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf и т.д. Адаптировать к нашим open/read/write/lseek. - - При rewrite заодно решить deferred issues stdio-review: - - `fwrite` short-write должен ставить `_F_ERROR` - - `fgets(buf, 1, fp)` — стандарт говорит "empty string", мы вернули NULL - - `mode_to_flags` — break-out на '+' (cosmetic) - -- [ ] **Audio API** — AY-3-8910 + COVOX через прерывания (требует IM2) -- [ ] **ISA-8 slot support** — ZX-Bus карты (sound, network, etc.) — требует IM2 + чтения portов - -## Прочие задачи (v1 backlog, не блокирующие) - -- [x] **#9: text I/O split (Turbo-C style)** — stdio (puts/printf/putchar) теперь fast no-attr через PCHARS/PUTCHAR. conio (cputs/cprintf/putch) применяет attr через textcolor/textbackground/textattr. KEEP_EXIST_ATTR → conio fallback на fast path. Verified в hello.exe. См. `memory/text_output_api_split.md`. Реализовано 2026-05-31. -- [x] **Mouse API полный** (резидентный driver, RST 30h) — все 14 функций обёрнуты (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). См. `memory/mouse_api.md`. Verified в MAME 2026-05-31. Sensitivity = divider (меньше = быстрее). -- [ ] Interrupt handlers — IM 2 vector table в HOME для user ISR'ов -- [ ] Поддержка `restore SP on EXIT` (паттерн из z88dk +pps) — проверить нужно ли -- [ ] CI: автоматически запускать MAME с `-aviwrite` для screenshot-сравнения, чтобы тесты примеров проходили без человека - -## Идеи на потом - -- Поддержка `` (есть в SDCC stdlib — нужно протестировать что наш crt0 совместим) -- `` через ESTEX SYSTIME (`$21`) и CMOS BIOS-функции -- ZX Spectrum-совместимый режим как отдельный target (для портирования спектрумовских программ) -- Поддержка ZX-Bus карт (sound, network, etc.) — нужны драйверы -- Profile-guided optimization tools (hot/cold detection) для крупных программ - -## Linker duplicate-symbol warnings (благоприятные, отфильтрованы) - -Когда мы сознательно overrides'им SDCC z80.lib функции собственной версией в `sprinter.lib`, `sdldz80` пишет `?ASlink-Warning-Definition of public symbol '...' found more than once`. Линкер берёт первое найденное определение (наше), поэтому поведение корректное — warning только noise. - -Текущие overrides: -- `_puts` — наша версия через PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` — наш heap в W2 vs SDCC's стандартный -- `_asctime`, `_localtime` (и возможно другие из time) — наш `posix_time.c` через ESTEX SYSTIME vs SDCC's `time.rel` который зависит от `_RtcRead` - -**Текущее решение:** `bin/sprinter-cc` отфильтровывает warning-блок (warning + 2 follow-up `Library:` строки) из вывода `sdcc`. Через `-v` (verbose) всё показывается. Реализовано через awk-pipe. - -**Возможные улучшения:** -- Перейти на explicit `--nostdlib` + ручной список нужных модулей из z80.lib (string, math, stdlib без override'нутых) — убрать ИСТОЧНИК warning'ов, не маскировать -- Или: переименовать наши `_puts` → `_puts_sprinter` + alias через linker flag (не уверен что SDCC поддерживает) -- Или: оставить как сейчас (рабочее и benign) — приоритет низкий - -## TODO: проверить на реальном железе - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - доку утверждает что после `OUT (0x89), Y` адреса 0xC000+0x400*N в окне W3 - маппятся на строки Y..Y+15 (одно программирование → 16 строк). - Empirical 2026-06-01 в MAME 0.283 этот trick **не работает** — пиксели - по адресам выше 0xC000+row_width уходят в невидимую область. Канонический - `docs/samples/plasma2.asm` тоже не использует banking, переустанавливает - Port_Y per row. - План: - 1. Получить доступ к реальному Sprinter - 2. Запустить тест dual-write (`_gfx_putpixel_raw` + второй write в `0xD000+x`) - 3. Если на железе видны двойные линии → бага MAME, открыть issue с - минимальным репро - 4. Если на железе тоже одна линия → документ неверный, удалить упоминание - из доки и просто оставить текущую реализацию (Port_Y per pixel) - 5. Если banking работает на железе → внедрить кэширование Port_Y в - `_gfx_putpixel_raw` (sentinel out-of-range, см. memory/gfx_port_y_banking.md) - - Связанный выигрыш для Bresenham (60-pixel диагональ) — около 8× меньше - OUT (0x89) операций, для `gfx_fill_rect 320x256` — 16× меньше. Не блокирует - release v1. - -## GFX: расширения по `docs/part2/accelerator_doc.txt` - -После прочтения детального accelerator doc выявлены незакрытые направления. -Сейчас в коде используется только горизонтальный/вертикальный Fill mode. - -### Quick wins для текущих primitives - -- [ ] **Заменить SMC на `LD A, (var)` для block-size**. Документ явно - разрешает `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` (но не `LD A, r`). - Это уберёт SMC complexity в `gfx_lines.c:hfill_chunk/vfill_chunk` и - `gfx_16.c:g16_hfill_chunk`. Запрещено только register-to-register. -- [ ] **Кэширование block-size**. Документ показывает что accel запоминает - block size между bursts (см. `Horizontal_Line_Fill`: устанавливают - size + `LD B,B` отключение, потом включают Fill mode и используют - сохранённый size). Для `gfx_fill_rect` с 100 одинаковыми - строками — установить size 1 раз, а не 100. - -### Bank-prefix modes (port 0xE2 bits) - -Документ показывает три варианта банка видеостраницы помимо стандартного 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write — пишется в shadow + видимый | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** — байт 0xFF при write оставляет background | -| 0x5C | both | - -Bank 0x58 объясняет почему mouse cursor рисуется с 0xFF-прозрачностью. -Это путь к **sprite-blending через accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** или флаг в `gfx_set_bank` для - выбора 0x50/0x58 при отрисовке sprite'ов -- [ ] Использовать в новом `gfx_blit()` чтобы по факту получать - transparent sprites через accel-копию - -### Block copy mode (sprite blit'ы) - -`LD L,L` (horizontal) и `LD A,A` (vertical) — режим копирования блока через -256-байтную accel memory. Это базис для blit'ов. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** — копирование sprite'а - (произвольный размер, через accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** — с использованием bank 0x58 - -См. `Draw_Restangle_Data` в accelerator_doc.txt как референс. - -### AND / OR / XOR operations через accel - -Документ показывает что accel поддерживает логические операции с блоками -данных. Применения: -- XOR — инверсия области (выделение selection в UI) -- OR / AND — masking, alpha-style blending -- См. пример в accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** — - примитивы логических операций над прямоугольником -- [ ] **`gfx_invert_rect(x, y, w, h)`** — alias на xor с 0xFF - -### Bitmap fonts разных размеров - -Сейчас `gfx_text` / `gfx_putchar` хардкоженно работают с 8×8 шрифтом -(BIOS WIN_GET_ZG возвращает 256×8 байт). Для будущих UI / титульников -нужны: -- [ ] **`gfx_set_font_size(w, h)`** — переключить ширину/высоту glyph'а -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** — заменить указатель - на пользовательский шрифт + размеры -- [ ] Поддержка **proportional** (advance != w) шрифтов — добавить - array advance[256] на ширину каждого glyph'а -- [ ] **Big-font режимы**: 8×16, 16×16, 16×8 (для титульников) -- [ ] Возможно отдельный API `gfx_text_ex(x, y, str, font_id)` где - font_id выбирает один из загруженных шрифтов -- [ ] **Anti-alias 2-bit шрифты** (бит фон / бит граница / 2-бит alpha?) - — far future, для smooth UI - -## Финальный этап оптимизаций (не сейчас) - -- **`gfx_line` через accel для пологих диагоналей** — Bresenham для линии с |dy| << |dx| (или наоборот) выдаёт длинные runs одинакового Y (или X): пиксель, пиксель, пиксель, шаг Y, пиксель, пиксель... Каждый такой run — это готовый аргумент для `gfx_hline` (или `vline`). - План исследования: посчитать длину runs как функцию от наклона; решить минимальный run length, при котором выгоднее accel hline чем N×putpixel (overhead accel ~20µs, putpixel ~5µs — accel выгоднее при run ≥ 4-5 px); для крутых диагоналей (dx ≈ dy) оставить Bresenham, для пологих — run-length-based fill. - Сейчас `gfx_line` orthogonal cases уже через accel — оптимизировать только косые. - -- **`gfx_fill_rect` с одним W3-swap на всю операцию** — сейчас каждый внутренний `gfx_hline`/`gfx_vline` делает свой DI/save-W3/restore-W3/EI. Можно сделать internal `_fill_rect_inner` который держит W3 замапленным и DI весь цикл; ~20µs × количество строк/столбцов экономии. Применимо ко всем композитным примитивам. diff --git a/examples/mdview2/Makefile b/examples/mdview2/Makefile deleted file mode 100644 index 9933047..0000000 --- a/examples/mdview2/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Build mdview2.exe — Markdown viewer for Sprinter (render-cache version). -# -# Фаза 0: скаффолдинг — копия mdview.c как baseline, без изменений -# логики. План — docs/mdview2-plan.md. -# -# small memory mode: code in W1, data/stack/heap in W2 (32 KB total). -# W3 stays free for the file buffer (EMM-mapped). - -EXAMPLE := mdview2 -EXTRA_SRCS := mdview2_raw.c mdview2_hex.c mdview2_help.c mdview2_table.c mdview2_enc.c mdview2_md.c mdview2_status.c mdview2_index.c -MEMORY := small -# --max-allocs 100000: агрессивнее аллокация регистров SDCC — минус ~850 байт -# кода на всём приложении (замер 2026-07-04) ценой более долгой компиляции. -EXTRA_FLAGS := --max-allocs 100000 - -include $(CURDIR)/../sdk.mk - -# ------------------------------------------------------------------ -# Образ дискеты: mdview2.exe + документация. Каждый документ — в СВОЕЙ -# кодировке, чтобы дискета заодно покрывала все пути автодетекта: -# README.MD — документация, ОРИГИНАЛЬНЫЙ UTF-8 (как в репозитории); -# CHANGES.MD — история версий, CP866 (хранится так, кладётся как есть; -# имя укорочено: "CHANGELOG" не влезает в FAT 8.3); -# DEMO.MD — демонстрация разметки, конвертируется UTF-8 → CP1251. -# -# iconv -c возвращает ненулевой код, если хоть один символ отброшен -# (даже с -c) — это ОЖИДАЕМО при потере символов без аналога в целевой -# кодировке, не ошибка конвертации; вывод при этом корректно записан. -# Поэтому код возврата iconv игнорируется (|| true). -# -# Тестовые файлы лимита 256 КБ лежат в testfiles/ (генератор gen_testfiles.py); -# на диск НЕ кладутся — при необходимости добавить вручную в список ниже. -# ------------------------------------------------------------------ -DISK_TMP := .disk_tmp -DEMO_DISK := $(DISK_TMP)/DEMO.MD -CHLOG_DISK := $(DISK_TMP)/CHANGES.MD - -$(DISK_TMP): - mkdir -p $@ - -$(CHLOG_DISK): CHANGELOG.md | $(DISK_TMP) - cp CHANGELOG.md $@ - -$(DEMO_DISK): DEMO.MD | $(DISK_TMP) - iconv -c -f UTF-8 -t CP1251 DEMO.MD > $@ || true - -floppy: $(EXAMPLE).exe $(DEMO_DISK) $(CHLOG_DISK) - $(PYTHON) $(MAKE_DISK) "$(FLOPPY_IMG)" $(EXAMPLE).exe README.md $(DEMO_DISK) $(CHLOG_DISK) - @echo - @echo "Floppy ready: $(FLOPPY_IMG)" - @echo "Run: make run MAME_HOME=/путь/к/MAME/runtime" - -clean: - rm -rf .sprinter-cc-* $(EXAMPLE).exe $(DISK_TMP) - -.PHONY: all clean floppy run diff --git a/examples/mdview2/README.md b/examples/mdview2/README.md deleted file mode 100644 index 0cc3c6a..0000000 --- a/examples/mdview2/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# MDView v1.0 (b3) — просмотрщик Markdown для Sprinter - -**MDView** — программа просмотра документов Markdown для компьютера -**Sprinter-2000** (Z80, ОС ESTEX). Файл загружается в расширенную память (EMM) -и один раз «прогоняется» через парсер: готовые к показу строки (пары -символ+атрибут) складываются в **рендер-кэш** в EMM, после чего прокрутка в -любую сторону — это просто копирование готовых строк на экран, без повторного -парсинга. Даже на файлах в сотни килобайт листание остаётся мгновенным. - -Текстовый режим 80×32, цветное оформление элементов разметки, три режима -просмотра (MD / RAW / HEX) и четыре кодировки с автоопределением. - ---- - -## Возможности - -* **Markdown-рендеринг** с цветовым оформлением: - * заголовки `#`…`######` (H5/H6 отображаются как H4); - * **жирный** (`**текст**`), *курсив* (`*текст*`), подчёркнутый (`_текст_`), - ~~зачёркнутый~~ (`~~текст~~`), `встроенный код` (`` `текст` ``); - * экранирование `\*`, `\_`, `` \` `` и любой ASCII-пунктуации; - * чекбоксы `[x]` / `[ ]` в списках; - * ненумерованные (`-`, `*`, `+`) и нумерованные (`1.`, `1)`) списки - с базовой вложенностью по отступам; - * цитаты `>` (склейка многострочных, маркер │ на переносах); - * fenced-блоки кода ` ``` ` (без переносов, горизонтальный скролл); - * таблицы `| … | … |` — рисуются псевдографической рамкой, ширины колонок - вычисляются по содержимому (до 16 колонок); - * горизонтальные разделители `---` / `***` / `___`; - * жёсткие переносы (два пробела или `\` в конце строки); - * мягкая склейка абзацев с переносом по словам под ширину экрана. -* **Кодировки: CP866, CP1251, KOI8-R, UTF-8.** - * автоопределение при открытии (BOM → UTF-8; валидность multibyte-структуры; - частотный анализ ходовых русских букв для 8-битных); - * переключение по кругу клавишей **F8** в любой момент; - * 8-битные кодировки отличаются только перекодировкой глифов на отрисовке — - переключение мгновенно; - * UTF-8 декодируется в CP866 в **отдельный набор** (файл + индекс + кэш); - второй набор готовится **в фоне**, пока вы читаете документ, — обычно - к первому нажатию F8 он уже построен и переключение мгновенно, - с сохранением позиции. Если фон не успел, F8 докручивает начатую - сборку (со спиннером), а не начинает её заново. -* **Три режима просмотра:** - * **MD** — форматированный Markdown (по умолчанию); - * **RAW** (**F2**) — исходный текст без разметки: перенос строк кратно 80 - (**F3** — режим панорамы с горизонтальным скроллом); - * **HEX** (**F4**) — дамп *оригинального* файла: - `0x012340 │ 16 байт hex │ 16 печатных символов`. Печатная колонка - интерпретируется текущей кодировкой; для UTF-8 глиф ставится на позиции - лид-байта, continuation-байты показываются точкой. -* **Единая позиция** при любых переключениях: MD ↔ RAW ↔ HEX и смена - кодировки сохраняют текущее место в документе (между наборами разного - размера — пропорционально, с точностью до строки). -* **Прогрессивная загрузка**: первый экран показывается сразу, индексация - продолжается в фоне; по готовой части документа уже можно листать, - **Esc**/**F10** прерывают загрузку. -* **Фоновая работа незаметна**: второй набор кодировки строится только в - паузах между клавишами (после нажатия выдерживается пауза), поэтому - скролл — в том числе с автоповтором — не теряет плавности. - ---- - -## Запуск - -``` -MDVIEW2.EXE <файл.md> -``` - -Без аргумента открывается `README.MD` из текущего каталога. - -## Клавиши - -| Клавиша | Действие | -|--------------|-------------------------------------------------------------| -| ↑ / ↓ | прокрутка на одну строку | -| PgUp / PgDn | прокрутка на экран (30 строк) | -| Home / End | в начало / в конец документа | -| ← / → | горизонтальный сдвиг: код/таблицы в MD, панорама в RAW | -| F1 | справка | -| F2 | RAW-режим ↔ MD | -| F3 | в RAW: перенос строк ↔ панорама | -| F4 | HEX-режим ↔ прежний вид | -| F8 | кодировка: CP866 → CP1251 → KOI8-R → UTF-8 → … | -| Esc / F10 | выход (во время загрузки — прервать её) | - -Статус-бар (верхняя строка): имя файла, кодировка, диапазон видимых строк -и процент прокрутки. Нижняя строка — меню доступных F-клавиш. - ---- - -## Ограничения - -| Параметр | Значение | -|---------------------------------|-------------------------------------------| -| Размер файла | до 256 КБ (больший — обрезается с предупреждением) | -| Логических строк (после переносов) | до 18 432 | -| Длина строки в рендер-кэше | 255 ячеек (RAW/HEX ограничения не имеют) | -| Колонок в таблице | до 16 | -| Шаг табуляции | 4 | - -При исчерпании любого лимита документ завершается строкой-сообщением -с указанием причины обрыва; всё, что вошло, доступно для просмотра. - -## Требования - -* Sprinter-2000 с ОС ESTEX; -* расширенная память (EMM): в худшем случае (файл 256 КБ + оба набора - кодировок) — до ~150 страниц по 16 КБ (~2,4 МБ). Для типичных файлов - в десятки килобайт достаточно нескольких десятков страниц. - -Код, данные, стек и куча программы занимают окна W1+W2 (32 КБ, режим -памяти `small`); окно W3 используется только для доступа к EMM-страницам. - ---- - -## Сборка - -Требуется тулчейн этого репозитория (обёртка `sprinter-cc` над SDCC 4.5). -Из каталога `examples/mdview2`: - -``` -make # собрать mdview2.exe -make floppy # собрать и упаковать дискету для MAME (mc.img) -make run # floppy + автоматический прогон в MAME (скриншоты) -``` - -На дискету кладутся: `MDVIEW2.EXE` и три документа, каждый в своей кодировке -(заодно покрывают все пути автодетекта): `README.MD` — этот файл, как есть -(UTF-8); `DEMO.MD` — демонстрация всех элементов разметки (CP1251); -`CHANGES.MD` — история версий (CP866). - -## Структура исходников - -| Файл | Назначение | -|------------------|--------------------------------------------------------------| -| `mdview2.c` | ядро: EMM-аллокации, рендер-кэш, наборы кодировок, загрузка файла, главный цикл | -| `mdview2_index.c`| парсер/индексатор Markdown — единственный проход по файлу | -| `mdview2_md.c` | MD-вид: отрисовка из кэша, прокрутка | -| `mdview2_raw.c` | RAW-вид (F2/F3) | -| `mdview2_hex.c` | HEX-вид (F4) | -| `mdview2_enc.c` | кодировки: детект, ремап-таблицы, конвертер UTF-8 → CP866 | -| `mdview2_table.c`| отрисовка таблиц | -| `mdview2_status.c`| статус-бар, меню, спиннер | -| `mdview2_help.c` | справка (F1) | -| `mdview2_conf.h` | конфигурация: `WITH_RAW` / `WITH_HEX` (модули отключаемы) | -| `mdview2.h` | общие константы, атрибуты, межмодульный API | - -Подробности архитектуры — в `docs/mdview2-plan.md`. - -## Лицензия и авторы - -© 2026 Петров А.Г. Часть проекта Sprinter C Compiler -(см. LICENSE в корне репозитория). diff --git a/examples/mdview2/READMEBG.MD b/examples/mdview2/READMEBG.MD deleted file mode 100644 index 4952b65..0000000 --- a/examples/mdview2/READMEBG.MD +++ /dev/null @@ -1,799 +0,0 @@ -# MDView — Просмотрщик Markdown для Sprinter - -**MDView** — программа для просмотра документов в формате *Markdown* на компьютере -Sprinter (процессор Z80). Документ хранится в отдельном W3 окне и не занимает -основную RAM программы. - -## Возможности - -- Документы до **128 КБ** (8 страниц EMM по 16 КБ каждая) -- До **16 384** экранных строк в индексе -- Автоматический перенос слов по ширине экрана (80 столбцов) -- Горизонтальный сдвиг для широких строк (блоки кода, таблицы) -- Статус-бар: имя файла, диапазон строк, процент прокрутки -- Спиннер в строке состояния во время загрузки и индексации -- Поддержка «мягкого» склеивания строк в абзацах и цитатах - -## Запуск - -``` -mdview [имя_файла.md] -``` - -Если имя файла не задано, загружается `README.MD`. - -## Управление - -``` -Клавиша Действие -───────────── ──────────────────────────────────────── -Up Down Прокрутка на одну строку вверх / вниз -PgUp PgDn Прокрутка на страницу (30 строк) -Home Начало документа -End Конец документа -Left Right Горизонтальный сдвиг (только nowrap-строки) -F1 Окно справки -F8 Кодировка: CP866 → CP1251 → KOI8-R → UTF-8 → ... -F10 / Esc Выход из программы -``` - -Кодировка определяется автоматически при открытии (BOM + эвристика по -первым 4 КБ); `F8` переключает её вручную, если детекция ошиблась. -8-битные кодировки (CP866/CP1251/KOI8-R) переключаются мгновенно (ремап на -отрисовке). Второй набор индекс/кэша (например UTF-8) строится лениво — при -первом переключении в него (короткая пауза со спиннером), дальше мгновенно. - -## Синтаксис Markdown - -### Заголовки - -Поддерживаются уровни H1–H4. Уровни H5 и H6 отображаются как H4. - - # Заголовок первого уровня - ## Заголовок второго уровня - ### Заголовок третьего уровня - #### Заголовок четвёртого уровня - -### Текстовое форматирование - -**Жирный текст** выделяется двойными звёздочками: `**текст**` - -*Курсив* выделяется одиночными звёздочками `*текст*` или знаком подчёркивания `_текст_` - -`Встроенный код` обозначается обратными кавычками - -~~Зачёркнутый текст~~ — двойные тильды: `~~текст~~` - -### Ненумерованный список - -Маркеры `-`, `*` или `+`: - -- Первый пункт списка -- Второй пункт списка -- Третий пункт с достаточно длинным текстом, который при необходимости - будет перенесён на следующую строку с сохранением отступа - -### Нумерованный список - -1. Первый элемент -2. Второй элемент -3. Третий элемент - -### Цитата - -> Блок цитаты начинается с символа `>`. Несколько последовательных -> строк одной цитаты склеиваются в единый абзац с автоматическим -> переносом слов. - -### Блок кода (verbatim) - -Блок кода заключается в тройные обратные кавычки. Внутри блока -текст отображается «как есть» без разбора Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### Горизонтальная линия - -Три или более символов `---`, `***` или `___` на отдельной строке: - ---- - -## Технические характеристики - -- **Платформа:** Sprinter, процессор Z80 @ 21 МГц -- **Кодировки:** CP866 / CP1251 / KOI8-R / UTF-8 (автоопределение, `F8`) -- **Максимальный размер файла:** 128 КБ -- **Максимальное число строк в индексе:** 16 384 -- **Режим памяти:** small - - Код программы, cтек, данные, куча — окнa W1-W2 (32 КБ, адреса 0x4000–0xBFFF). - - Буфер файла — страницы EMM, отображаемые в W3 (0xC000–0xFFFF) - -## TODO - -1. **Увеличение размера документов.** Снять лимит 128 КБ: Достаточно - разрешить работать с большим кол-вом страниц памяти, пока оттестированно - на работе с 8-мю страницами по 16Кб. - -Сделано: форматированные таблицы с рамкой; поддержка кодировок -CP866 / CP1251 / KOI8-R / UTF-8 с автоопределением и переключением по `F8` -(второй набор строится лениво, по первому переключению). - -4. **Ускорение рендеринга.** Кэш строк экрана. Оптимизация цикла вывода - символов через BIOS WRCHAR (пакетный вывод, DMA). - ---- - -*MDView v0.2 · (c) 2026 Петров А.Г.* - - ---- - -# Sprinter C Compiler — v1.0 - -C toolchain for **Sprinter** — the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** — one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` — see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320×256×256 and 640×256×16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it — `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size — small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O — read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320×256×256 lines / rects / accelerator | -| `gfx_d16` | 640×256×16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` — puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` — atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` — from SDCC z80.lib -* `` — read / write / close / lseek / unlink -* `` — open / creat + O\_RDONLY / O\_CREAT / ... -* `` — errno + error names + strerror -* `` — stat / fstat -* `` / `` — from SDCC - -Sprinter-specific: -* `` — putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` — gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text — for both 320 and 640 modes (gfx_\*16 variants) -* `` — full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` — chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` — getdatetime / setdatetime + POSIX time / localtime / etc. -* `` — raw ports, ESTEX/BIOS function numbers, env API -* `` — exit / \_exit / atexit -* `` — mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` — Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE — verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** — `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) — see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** — research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) — requires IM2 -* **ISA-8 slot drivers** — requires IM2 (???) - -## Documentation - -* `docs/TODO.md` — roadmap and open work items -* `docs/solid_c_compatibility.md` — gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` — interrupt handler design (v2) -* `docs/converted/` — source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` — original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` — - MIT-licensed. -* `third_party/sdcc/` — SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` — original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** — Иван Мак, Дмитрий Паринов and the original team -* **SDCC** — for the underlying Z80 compiler -* **MAME** — for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - -Открытые задачи в порядке убывания приоритета. По мере появления реальных программ — приоритеты будут смещаться. - -## Этап 5 — malloc / free + banking-aware page allocator ✅ ГОТОВО - -- [x] SDCC's `malloc`/`free` + наш `runtime/heap.s` (полностью заменяет library heap.rel, 14000-байтный heap в окне 2) -- [x] `libc/mem/mem_alloc.c` — page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` через ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` — HOME-резидентные `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` со свопом W3 внутри -- [x] `examples/malloc_test/` — проверка SDCC's malloc (~210 64-байтных allocations через всю heap) -- [x] `examples/mem_test/` — проверка page allocator: 3 страницы, разные паттерны через bank_write, верификация через bank_read - -## Этап 6 — argv parsing + sprinter-cc wrapper ✅ ГОТОВО - -- [x] crt0 парсит ESTEX command-line из IX-prefix (inline asm в `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] Передача `argc`/`argv` в main() через HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE через ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` — opt-out для очень маленьких программ -- [x] `runtime/crt0_banked.s` — теперь тоже парсит argv (parse_argv + get_progname скопированы из crt0.s; будет factored в argv.s когда возьмёмся за libsprinter.lib) -- [x] Bash-обёртка `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` одной строкой -- [x] Поддержка опций: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## Этап 8 — графика (320×256×256 + 640×256×16 + accel + bitmap font) ✅ ГОТОВО - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). Палитра через BIOS PIC_SET_PAL ($A4). Verified 320×256×256. -- [x] **8b** Линии/прямоугольники/fill через accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` через accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` с heuristic выбором ориентации (h/v bursts count), `gfx_line` с Bresenham для диагоналей. `gfx_clear` тоже переписан на column-major accel (~4× быстрее). -- [x] **8c** 640×256×16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (документация misleading), per-row RMW для vline (один байт = 2 горизонтальных пикселя). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): шрифт через BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` для 320 mode, `gfx_text16`/`gfx_putchar16` для 640 mode с pair-table lookup. - -См. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - -Открытые мелочи (не блокируют): -- [ ] Шрифт-quad для 640: per-cell палитра (mode 0x82 разрешает 1 из 4 палитр per 16×8 cell) — через прямой доступ к area-описания экрана 0x0300..0x039F - -## Auto-banking (см. `memory/banking_roadmap.md` для деталей) - -Phase 1 — file-level bin-packing — реализовывать когда проект перерастёт ~30 KB кода. - -- [ ] `toolchain/auto_bank.py`: - - Парсит размеры из `.rel`-файлов (или из .map после dry-run link'а) - - First-fit-decreasing bin-packing - - Уважает `#pragma codeseg BANKn` как manual override - - Перелинковывает с новыми `-Wl-b_BANKn=...` параметрами - - Печатает план распределения - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. Только если/когда понадобится. - -## Bank-local static data (mutable data в том же банке что и код) — ✅ ГОТОВО - -- [x] Пример `examples/bank_local_data/` — функция в BANK1 со своим writable BSS array + const table + malloc-тест -- [x] `mkexe -p 0` для нулевого padding банков (BSS-storage обнуляется при загрузке) -- [x] Канонический рецепт: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` для bank1.c + `-Wl-b_BANK1=0x1C000` для линковки. **`--dataseg BANK1` РАБОТАЕТ** — раньше казалось обратное из-за trampoline bug который маскировал результат. -- [x] **Критичный фикс trampoline'a в runtime/bank.s** — старый `pop af; out (n), a` клобберил A → все banked-функции возвращающие uint8_t тихо возвращали мусор. Новый `pop bc; out (c), b` сохраняет A. -- [x] **malloc из banked-функции работает прозрачно** — heap живёт в W2 (HOME), W2 никогда не свапается trampoline'ом, pointer валиден из любого контекста. См. memory/bank_local_data_pattern.md. -- [x] Документация в memory: `memory/bank_local_data_pattern.md` (полный рецепт + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] Опционально — расширить `check_banks.py` чтобы показывать разбивку size = code + const + bss per bank (cosmetic) - -Зачем: для модулей с большим private state (level loader, audio engine, scene data). Экономит W2 heap для динамики, а статика остаётся в бэке. - -## Подсказки из solid-c (нативный Sprinter C — `third_party/solid-c/`) - -После анализа solid-c'овской libc (см. `memory/solid_c_findings.md`) выявлены готовые паттерны для следующих недостающих функций. Приоритет от **высокого** к низкому: - -### High-priority gaps (легко портировать, большая польза) -- [x] **`errno` + `strerror`/`perror`** — табличка 32 ошибок (libc/io/errno.c) -- [x] **Расширенный `open()`** для O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** — 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** — 6-байт jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** — 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) — libc/io/env.c. Учли doc-bug: реально A=0 это NOT FOUND - -### Medium-priority (нужно для shell-like утилит) -- [ ] **Mouse driver** — `rst $30h`, 17 функций. **Сначала тест что работает в MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** для directory listing — реализовано, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** через ESTEX $21/$22 — libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** — wrappers для ESTEX $1B-$1E — libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** — реализовано -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority — ✅ FILE* stack ГОТОВО - -- [x] **Минимальный unbuffered FILE\*** — `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr как pseudo-streams. См. `memory/file_star_design.md` и `examples/filetest`. -- [ ] fprintf / fscanf — нужна printf-через-callback machinery. Пока пользователь может `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] Опциональный buffered mode (setvbuf, line/block buffering) — если когда-то понадобится. - -### POSIX time API — ✅ ГОТОВО -- [x] `libc/io/posix_time.c` — time/localtime/gmtime/mktime/asctime/ctime поверх getdatetime. SDCC's time.rel избегаем (нельзя override _RtcRead). См. `examples/ptime`. - -### sys/stat — ✅ ГОТОВО -- [x] `libc/io/stat.c` — POSIX stat/fstat. Гибрид open+fstat для файлов, ffirst+iter для папок (включая "."/".."). См. `examples/stattest` и `memory/estex_ffirst_dotdot.md`. - -### assert — ✅ ГОТОВО (используем SDCC's __assert через fallback include path) - -## libc/stdlib — ✅ не нужно делать (см. memory/sdcc_stdlib_works.md) - -Проверено через `examples/stdlib_test/`: SDCC z80.lib содержит работающие реализации: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- Полный `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - -Линкер автоматически тянет из z80.lib когда нужно. **НЕ переписывать**. - -Наши Sprinter-specific обязательные модули остаются: atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc — ✅ ГОТОВО - -- [x] `lib/Makefile` — собирает каждый libc/*.c в `.rel`, архивирует через sdar в `lib/sprinter.lib` -- [x] Включает runtime/bank.s и runtime/heap.s (auto-pulled при __banked/malloc) -- [x] `bin/sprinter-cc` — bash-wrapper: `sprinter-cc -o foo.exe foo.c` одной строкой -- [x] Поддержка опций `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` — демо: `hello.c` собирается за один shell-вызов, размер совпадает с ручным Makefile (925 байт) -- [x] Split `putchar.c` → `putchar.c` + `puts.c` для per-function granularity (puts override SDCC's z80.lib version) -- [x] Включён в `make all` (зависимость `lib` перед `examples`) - -Возможные улучшения (опционально): -- [ ] Мигрировать остальные examples на sprinter-cc вместо ручных Makefile (косметика) -- [ ] Дальнейшая декомпозиция libc/*.c per-function (но текущая granularity уже даёт нужный размер — линкер пакетует .rel целиком, и для большинства файлов это одна функция) - -## Этап 9 — memory modes для sprinter-cc - -DSS выделяет страницы памяти по размеру приложения: < 16 KB → одна страница, в остальные окна подключается «страница #FF» (read=0xFF, write игнорится). Из-за этого CODE-в-W1 + DATA-в-W2 для маленькой программы молча ломается. См. [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: всё (CODE+DATA+стек) в W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` флаг в sprinter-cc**: parser + per-mode дефолты CODE_LOC/DATA_LOC, override через явные `--code-loc`/`--data-loc`. tiny работает; small/big/huge компилируются с warning'ом (runtime не готов). Реализовано 2026-05-30. -- [x] **`--memory-manual SPEC`**: парсит `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. Реализовано 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` использует ESTEX `$3D GETMEM` + `$3A SETWIN2` чтобы выделить и замапить W2-страницу ДО gsinit. **НЕ** BIOS `$C4` — стек на этом этапе в W1 (boot_stack в HOME), а BIOS требует стек в W2. После маппинга SP переключается на 0xBFFE, дальше стандартный flow. Реализовано 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect для >16 KB программ**: `crt0_small.s` читает порт `0xC2` (текущая страница в W2 — не `0xA2`! это W1). Если 0xFF — выделяет page; иначе DSS уже сделала это (программа сама вылезла в W2). Один crt0 покрывает 0..30 KB. mkexe также разрешает HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB файл, SETWIN2 path) + 32 KB файл (auto-skip). Реализовано 2026-05-30. -- [x] **`big` runtime** (tiny + banked code в W1): параметризовали `crt0_banked.s` + `bank.s` через `.ifdef BANK_W1` — другой banking port (0xA2 vs 0xE2), другой load-addr (0x4000 vs 0xC000). sprinter-cc prepend'ит `BANK_W1 = 1` при `--memory big`, передаёт `mkexe -B 0x4000`. Пример `examples/banked_big/`. Реализовано 2026-05-30. -- [x] **`huge` runtime** (small + banked code в W3): merge W2-detect логики из `crt0_small.s` в `crt0_banked.s`. Существующий пример `examples/banked/` теперь использует MEMORY=huge. Реализовано 2026-05-30. -- [x] **`--debug` флаг**: prepend `DEBUG_RT = 1` в crt0 + `-DDEBUG_RT` в sdcc. Открывает symbol `_w2_self_allocated` (uint8_t) — runtime diagnostic кто аллоцировал W2. Реализовано 2026-05-30. - -### Дизайн-решения по libc и crt0 - -**Одна `sprinter.lib`** работает для всех memory mode — `.rel`-члены relocatable, SDLD делает dead-code elimination per-member (без графики не подтягивает `gfx_core.rel` и т.д.). Verified hello vs malloc_test через map-файлы. - -**`gfx.lib` отдельно — НЕ нужен**: dead-code elimination уже работает. - -**`libc_banked` (libc в bank вместо HOME)** — идея на потом, когда HOME (16 KB) забит user-кодом + libc в `huge` mode. Реализуется через `--codeseg BANK0` при компиляции libc; trade-off: trampoline ~30 циклов на каждый libc-вызов. Триггер: реальная программа упрётся в HOME budget. - -**HW-зависимые модули — `sprinter_home.lib` отдельно.** Часть libc физически не может быть забанкована в W3, потому что она РАБОТАЕТ с W3: -- `gfx_*` — пишет в видеопамять `0xC000+` после swap W3 на video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) — swap'ит W3 через `OUT (0xE2)` -- Будущие ISR — прерывание может прийти когда W3 на чём угодно - -В huge mode эти модули ДОЛЖНЫ остаться в HOME (W1). Когда будем делать `libc_banked`, **одновременно** выделяем `sprinter_home.lib` (HOME-only) из `sprinter.lib` (bankable). Финальная схема: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib тот же sprinter.lib но --codeseg BANK0 (для huge) -``` -Триггер: реализация `--memory huge` runtime. - -**crt0 — по одному на mode:** -- `crt0.s` — текущий, для **tiny/big**: SP=0xBFFE, парсит argv (W2-ресурс уже выделен DSS). -- `crt0_minimal.s` — текущий, для tiny без argv. -- `crt0_small.s` — **новый, step 3**: для **small/huge**, аллоцирует W2 через `mem_alloc_pages` ДО gsinit, маппит в порт `0xA2`, потом стандартный flow. -- `crt0_banked.s` — текущий, для **big**: trampoline-таблица для W3 банков, CODE в W2. -- `crt0_banked_small.s` — **новый**: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc подбирает crt0 по `--memory` mode (сейчас `--crt0=` это override). -- [x] **Настраиваемый размер стека**: флаг `sprinter-cc --stack-size BYTES`. Wrapper генерирует `heap_top.s` с `___sdcc_heap_end = stack_top + 1 - stack_size`, отдельный .rel линкуется per-program. Default ≈1278 байт (heap_top=0xBB00) из `runtime/heap_top.s`. Реализовано 2026-05-30. - -Интерфейс: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` имеет смысл только с `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ✅ работает. Док-ция в `DiskSyscalls.txt v1.6` ошибочно описывает return-status — A=0 это NOT FOUND, не FOUND. Зафиксировано в `memory/sprinter_platform.md`. - -## ОБЯЗАТЕЛЬНЫЕ ЗАДАЧИ ДЛЯ V2 (после релиза v1) - -### Turbo-C-style graphics API (BGI-like) — **MUST для v2** - -Расширить наш `gfx_*` API до уровня **Turbo-C ``** (BGI) для MS-DOS. -Программисты привыкшие к Turbo-C должны переносить графический код 1-в-1. - -**Что должно быть** (на основе Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` — у нас сейчас `gfx_init`/`gfx_done`, добавить alias -- `getmaxx()` / `getmaxy()` — макрос на GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` — alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` — у нас get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` — current draw color -- `setbkcolor(c)`, `getbkcolor()` — background color -- `setpalette(idx, c)` — палитра entry -- `getpalette(&info)` — read all palette - -Primitives (мы уже имеем эквиваленты — добавить BGI-имена как aliases): -- `putpixel(x, y, c)` — есть как gfx_putpixel -- `getpixel(x, y)` — нужно реализовать (RMW обратное — IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` — current point + line drawing -- `line(x1, y1, x2, y2)` — есть как gfx_line -- `rectangle(x1, y1, x2, y2)` — есть как gfx_rect (но другой API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` — есть как gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` — новое: rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` — новые primitives -- `fillpoly()`, `drawpoly()` — полигоны -- `floodfill(x, y, border_color)` — заливка - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` — есть как gfx_text (alias) -- `settextstyle(font, dir, size)` — multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` — measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` — bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` — save rect to buffer -- `putimage(x, y, buf, op)` — paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` — drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` — двойная буферизация (Sprinter имеет 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` — SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** перенос типичной Turbo-C BGI программы (рисующей с использованием -moveto/lineto/circle/bar/setcolor) должен работать без существенных правок. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) — у нас один BIOS font, остальные нужно - добавить (как bitmap data в lib) -- imagesize/getimage/putimage — самые востребованные для game/animation -- Active/visual page (двойная буферизация) — Sprinter поддерживает 2 graphics pages, - нужен API switching - -См. также `examples/` Turbo C 2.x BGIDEMO как reference что нужно. - -### IM2 Interrupt Handlers — **MUST для v2** - -User-задаваемые ISR через Z80 IM 2 mode. Нужны для: -- Timer ticks (50 Hz frame counter, плавная анимация) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render в interrupt-driven) -- Async keyboard / mouse handling - -**Status:** ОТЛОЖЕНО до v2. Полный research + design в `docs/im2_isr_design.md`. - -**Решение по архитектуре:** реализовать как отдельный memory mode `--memory im2` -(вместо того чтобы лезть во все существующие crt0). Detail'и в design-doc. - -**Резюме research'а** (полный текст в `docs/im2_isr_design.md`): -- Vector 0xFF — frame + keyboard + CBL. Disambiguation по портам 0x19 / 0xFE -- Mouse hardware-IRQ не приходит (на текущей плате) -- Vector table / ISR / stack ОБЯЗАНЫ быть в W2 (0x8000..0xBFFF) -- DSS имеет свой IM 2 handler — нужно chain'иться (иначе клавиатура / SYSTIME ломаются) - -### Прочие крупные пункты для v2 - -- [ ] **FILE API rewrite — buffered streams** — текущая реализация в - `libc/stdio/file.c` это provisional unbuffered shim (каждый fputc/fgetc - = один read/write syscall). Нужна полноценная buffered семантика - как в Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr — fd-маркеры `0 / -1 / -2`. Отрицательные для - stdout/stderr выбраны намеренно: ESTEX OPEN может вернуть positive - small fd (1, 2, …) для обычного файла → если бы stdout=1, реальный - fd=1 сталкивался бы с идентификатором. fd=0 для stdin безопасно - (ESTEX 0 не возвращает). Сами fd не передаются в syscall'ы — - диспетчеризация по флагам `_F_CONIN/_F_CONOUT`. - - Принтер-потоки (stdaux/stdprn) НЕ реализуем — Sprinter принтерной - API не имеет. - - Альтернатива — взять реализацию из third_party/solid-c (sources в - `SRC/CLIB/`); там есть готовый buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf и т.д. Адаптировать к нашим open/read/write/lseek. - - При rewrite заодно решить deferred issues stdio-review: - - `fwrite` short-write должен ставить `_F_ERROR` - - `fgets(buf, 1, fp)` — стандарт говорит "empty string", мы вернули NULL - - `mode_to_flags` — break-out на '+' (cosmetic) - -- [ ] **Audio API** — AY-3-8910 + COVOX через прерывания (требует IM2) -- [ ] **ISA-8 slot support** — ZX-Bus карты (sound, network, etc.) — требует IM2 + чтения portов - -## Прочие задачи (v1 backlog, не блокирующие) - -- [x] **#9: text I/O split (Turbo-C style)** — stdio (puts/printf/putchar) теперь fast no-attr через PCHARS/PUTCHAR. conio (cputs/cprintf/putch) применяет attr через textcolor/textbackground/textattr. KEEP_EXIST_ATTR → conio fallback на fast path. Verified в hello.exe. См. `memory/text_output_api_split.md`. Реализовано 2026-05-31. -- [x] **Mouse API полный** (резидентный driver, RST 30h) — все 14 функций обёрнуты (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). См. `memory/mouse_api.md`. Verified в MAME 2026-05-31. Sensitivity = divider (меньше = быстрее). -- [ ] Interrupt handlers — IM 2 vector table в HOME для user ISR'ов -- [ ] Поддержка `restore SP on EXIT` (паттерн из z88dk +pps) — проверить нужно ли -- [ ] CI: автоматически запускать MAME с `-aviwrite` для screenshot-сравнения, чтобы тесты примеров проходили без человека - -## Идеи на потом - -- Поддержка `` (есть в SDCC stdlib — нужно протестировать что наш crt0 совместим) -- `` через ESTEX SYSTIME (`$21`) и CMOS BIOS-функции -- ZX Spectrum-совместимый режим как отдельный target (для портирования спектрумовских программ) -- Поддержка ZX-Bus карт (sound, network, etc.) — нужны драйверы -- Profile-guided optimization tools (hot/cold detection) для крупных программ - -## Linker duplicate-symbol warnings (благоприятные, отфильтрованы) - -Когда мы сознательно overrides'им SDCC z80.lib функции собственной версией в `sprinter.lib`, `sdldz80` пишет `?ASlink-Warning-Definition of public symbol '...' found more than once`. Линкер берёт первое найденное определение (наше), поэтому поведение корректное — warning только noise. - -Текущие overrides: -- `_puts` — наша версия через PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` — наш heap в W2 vs SDCC's стандартный -- `_asctime`, `_localtime` (и возможно другие из time) — наш `posix_time.c` через ESTEX SYSTIME vs SDCC's `time.rel` который зависит от `_RtcRead` - -**Текущее решение:** `bin/sprinter-cc` отфильтровывает warning-блок (warning + 2 follow-up `Library:` строки) из вывода `sdcc`. Через `-v` (verbose) всё показывается. Реализовано через awk-pipe. - -**Возможные улучшения:** -- Перейти на explicit `--nostdlib` + ручной список нужных модулей из z80.lib (string, math, stdlib без override'нутых) — убрать ИСТОЧНИК warning'ов, не маскировать -- Или: переименовать наши `_puts` → `_puts_sprinter` + alias через linker flag (не уверен что SDCC поддерживает) -- Или: оставить как сейчас (рабочее и benign) — приоритет низкий - -## TODO: проверить на реальном железе - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - доку утверждает что после `OUT (0x89), Y` адреса 0xC000+0x400*N в окне W3 - маппятся на строки Y..Y+15 (одно программирование → 16 строк). - Empirical 2026-06-01 в MAME 0.283 этот trick **не работает** — пиксели - по адресам выше 0xC000+row_width уходят в невидимую область. Канонический - `docs/samples/plasma2.asm` тоже не использует banking, переустанавливает - Port_Y per row. - План: - 1. Получить доступ к реальному Sprinter - 2. Запустить тест dual-write (`_gfx_putpixel_raw` + второй write в `0xD000+x`) - 3. Если на железе видны двойные линии → бага MAME, открыть issue с - минимальным репро - 4. Если на железе тоже одна линия → документ неверный, удалить упоминание - из доки и просто оставить текущую реализацию (Port_Y per pixel) - 5. Если banking работает на железе → внедрить кэширование Port_Y в - `_gfx_putpixel_raw` (sentinel out-of-range, см. memory/gfx_port_y_banking.md) - - Связанный выигрыш для Bresenham (60-pixel диагональ) — около 8× меньше - OUT (0x89) операций, для `gfx_fill_rect 320x256` — 16× меньше. Не блокирует - release v1. - -## GFX: расширения по `docs/part2/accelerator_doc.txt` - -После прочтения детального accelerator doc выявлены незакрытые направления. -Сейчас в коде используется только горизонтальный/вертикальный Fill mode. - -### Quick wins для текущих primitives - -- [ ] **Заменить SMC на `LD A, (var)` для block-size**. Документ явно - разрешает `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` (но не `LD A, r`). - Это уберёт SMC complexity в `gfx_lines.c:hfill_chunk/vfill_chunk` и - `gfx_16.c:g16_hfill_chunk`. Запрещено только register-to-register. -- [ ] **Кэширование block-size**. Документ показывает что accel запоминает - block size между bursts (см. `Horizontal_Line_Fill`: устанавливают - size + `LD B,B` отключение, потом включают Fill mode и используют - сохранённый size). Для `gfx_fill_rect` с 100 одинаковыми - строками — установить size 1 раз, а не 100. - -### Bank-prefix modes (port 0xE2 bits) - -Документ показывает три варианта банка видеостраницы помимо стандартного 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write — пишется в shadow + видимый | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** — байт 0xFF при write оставляет background | -| 0x5C | both | - -Bank 0x58 объясняет почему mouse cursor рисуется с 0xFF-прозрачностью. -Это путь к **sprite-blending через accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** или флаг в `gfx_set_bank` для - выбора 0x50/0x58 при отрисовке sprite'ов -- [ ] Использовать в новом `gfx_blit()` чтобы по факту получать - transparent sprites через accel-копию - -### Block copy mode (sprite blit'ы) - -`LD L,L` (horizontal) и `LD A,A` (vertical) — режим копирования блока через -256-байтную accel memory. Это базис для blit'ов. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** — копирование sprite'а - (произвольный размер, через accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** — с использованием bank 0x58 - -См. `Draw_Restangle_Data` в accelerator_doc.txt как референс. - -### AND / OR / XOR operations через accel - -Документ показывает что accel поддерживает логические операции с блоками -данных. Применения: -- XOR — инверсия области (выделение selection в UI) -- OR / AND — masking, alpha-style blending -- См. пример в accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** — - примитивы логических операций над прямоугольником -- [ ] **`gfx_invert_rect(x, y, w, h)`** — alias на xor с 0xFF - -### Bitmap fonts разных размеров - -Сейчас `gfx_text` / `gfx_putchar` хардкоженно работают с 8×8 шрифтом -(BIOS WIN_GET_ZG возвращает 256×8 байт). Для будущих UI / титульников -нужны: -- [ ] **`gfx_set_font_size(w, h)`** — переключить ширину/высоту glyph'а -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** — заменить указатель - на пользовательский шрифт + размеры -- [ ] Поддержка **proportional** (advance != w) шрифтов — добавить - array advance[256] на ширину каждого glyph'а -- [ ] **Big-font режимы**: 8×16, 16×16, 16×8 (для титульников) -- [ ] Возможно отдельный API `gfx_text_ex(x, y, str, font_id)` где - font_id выбирает один из загруженных шрифтов -- [ ] **Anti-alias 2-bit шрифты** (бит фон / бит граница / 2-бит alpha?) - — far future, для smooth UI - -## Финальный этап оптимизаций (не сейчас) - -- **`gfx_line` через accel для пологих диагоналей** — Bresenham для линии с |dy| << |dx| (или наоборот) выдаёт длинные runs одинакового Y (или X): пиксель, пиксель, пиксель, шаг Y, пиксель, пиксель... Каждый такой run — это готовый аргумент для `gfx_hline` (или `vline`). - План исследования: посчитать длину runs как функцию от наклона; решить минимальный run length, при котором выгоднее accel hline чем N×putpixel (overhead accel ~20µs, putpixel ~5µs — accel выгоднее при run ≥ 4-5 px); для крутых диагоналей (dx ≈ dy) оставить Bresenham, для пологих — run-length-based fill. - Сейчас `gfx_line` orthogonal cases уже через accel — оптимизировать только косые. - -- **`gfx_fill_rect` с одним W3-swap на всю операцию** — сейчас каждый внутренний `gfx_hline`/`gfx_vline` делает свой DI/save-W3/restore-W3/EI. Можно сделать internal `_fill_rect_inner` который держит W3 замапленным и DI весь цикл; ~20µs × количество строк/столбцов экономии. Применимо ко всем композитным примитивам. diff --git a/examples/mdview2/UTF8TEST.MD b/examples/mdview2/UTF8TEST.MD deleted file mode 100644 index e9891b2..0000000 --- a/examples/mdview2/UTF8TEST.MD +++ /dev/null @@ -1,28 +0,0 @@ -# Тест UTF-8 - -Это **проверка** кодировки _UTF-8_ в `mdview2`. -Кириллица должна читаться: съешь же ещё этих мягких булок. - -## Символы и пунктуация - -Тире — длинное, и – короткое. Кавычки: «ёлочки» и “лапки”. -Многоточие… стрелки → ← ↑ ↓, галочка ✓ и крестик ✗. -Градус 25°, пункт списка • буллет, номер № 7. - -## Список - -- Первый пункт -- Второй пункт с длинным текстом, чтобы проверить перенос строки по словам на границе экрана восемьдесят символов -- Ёжик, ёлка, объём - -> Цитата: «Краткость — сестра таланта». - -## Таблица - -| Язык | Привет | Число | -|----------|---------------|-------| -| Русский | Здравствуйте | 42 | -| English | Hello | 7 | -| Deutsch | Grüße | 100 | - -Конец файла. diff --git a/examples/mdview2/docs/encoding-plan.md b/examples/mdview2/docs/encoding-plan.md deleted file mode 100644 index cf70860..0000000 --- a/examples/mdview2/docs/encoding-plan.md +++ /dev/null @@ -1,144 +0,0 @@ -# mdview2 — поддержка кодировок (CP866 / CP1251 / KOI8-R / UTF-8) - -Статус: РЕАЛИЗОВАНО (2026-06-25). Все фазы сделаны; Фаза 4 — eager-кооперативным -вариантом (см. ниже), а не idle-build. Осталась только проверка на железе и -возможная оптимизация «не строить заведомо бесполезный вторичный набор». - -## Цель - -- CP1251, KOI8-R — простой 1:1 маппинг байтов [128-255] в CP866 (кириллица - + основная пунктуация). KOI8-R равнозначна, входит в общий цикл. -- UTF-8 — декодирование с маппингом кириллицы в CP866 + подстановка части - некириллических символов (стрелки, галочки, тире, буллеты, box-drawing) в - CP866/ASCII-глифы. -- Автоопределение кодировки при открытии (BOM + дешёвая эвристика). -- F8 (Codepage) — переключение по циклу CP866 → CP1251 → KOI8-R → UTF8. - -## Ключевые наблюдения (определяют архитектуру) - -1. **8-битные кодировки имеют ОДНУ структуру.** markdown-разметка вся в ASCII - (`# * | -` …); 8-битные различаются только глифами [128-255]. Значит индекс - и кэш (смещения, переносы, ширины таблиц) для CP866/CP1251/KOI8-R — - **общие**; переключение между ними = ремап глифов [128-255], БЕЗ - переиндексации. -2. **UTF-8 — другая структура** (кириллица 2 байта). Нужен отдельный - конвертированный CP866-буфер со своим индексом/кэшем. -3. **Проблема рамок таблиц / маркеров.** В кэше намешаны контентные глифы - (байты-из-источника [128-255] — НАДО ремапить) и вставленные нами CP866- - глифы (box `│─┼…`, маркер списка 0x07, цитата 0xB3, HR 0xC4 — ремапить - НЕЛЬЗЯ). По значению байта не различить → различаем по **атрибуту**. - -## Архитектура - -### Буферы -- `src_phys[]` — оригинальные байты файла (грузим как сейчас; храним всегда — - под ремап и raw-view, см. memory/mdview2_file_phys_preserve). -- 8-битный режим: `fb()` читает `src_phys` напрямую. Кэш контентных ячеек - хранит **исходный байт** (не пред-конвертированный). -- UTF-8 режим: отдельные EMM-страницы `utf_phys[]` = UTF8→CP866 конвертация - src; свой индекс/кэш; `fb()` читает `utf_phys`. - -### Различение контент/структура по attr -Каждый структурный глиф получает НЕ-контентный attr: -- box-рамка таблиц → новый `ATTR_BOX` (сейчас TBL_ATTR=ATTR_TEXT — поменять); -- HR (0xC4) → ATTR_HR; маркер списка (0x07) → ATTR_LIST_MARKER; цитата - (0xB3) → ATTR_QUOTE_MARKER — уже различимы. -Правило ремапа: ремапить `char>=128` только если attr ∈ контентных -(TEXT/BOLD/ITALIC/UNDER/CODE/STRIKE/TITLE1-4). Структурные — как есть. - -### Ремап на этапе отрисовки -`draw_line_from_cache`: -- encoding == CP866 или UTF-8: прямой `win_rest` из кэш-страницы (ремап не - нужен — CP866 identity; UTF-8-кэш уже CP866). -- encoding == CP1251/KOI8-R: читаем кэш-строку в near-буфер, ремапим - контентные байты [128-255] через активную таблицу (структурные пропускаем - по attr), пишем в scratch-страницу, `win_rest` из неё. Только видимые ~30 - строк, на скролле — дёшево. - -Итого: переключение между 8-битными — мгновенно (меняем активную таблицу + -redraw, draw ремапит). Переиндексация только при переходе в/из UTF-8. - -## Детекция кодировки (дешёвый скан байтов, ДО построения) - -1. **BOM**: первые 3 байта EF BB BF → UTF8 (и пропустить BOM). -2. **UTF-8 валидность** (если нет BOM): проход, проверка структуры - (лид-байты 0xC2-0xDF/0xE0-0xEF/0xF0-0xF4 + континюэйшны 0x80-0xBF; - одиночный 0x80-0xBF, 0xC0/0xC1, 0xF5+ → нарушение). 0 нарушений И есть - ≥1 multibyte → UTF8. Любое нарушение → 8-бит. -3. **8-бит дизамбигуация** (CP866/CP1251/KOI8-R): счёт попаданий в байты - самых ходовых строчных русских букв (о е а и н т с р в л) каждой кодировки; - максимум выигрывает. (Предрасчёт байт-наборов по таблицам.) -4. **Фолбэк**: нет байт ≥0x80 или неоднозначно → CP866 (родная). - -## Таблицы (static const, CODE/const-сегмент) - -- `cp1251_to_866[256]`, `koi8r_to_866[256]` — байт→байт (ASCII identity; - кириллица по раскладкам; en/em-dash, «ёлочки», … → CP866-аналоги или '?'). -- UTF-8: `utf_cyr_to_866[]` для U+0400..U+045F + компактная таблица символов - `utf_sym[]` (codepoint→CP866): U+2192→'>'/стрелка, U+2190→'<', U+2713/14 ✓ - →'v'/box, U+2022 •→0x07/0xF9, U+2014/2013 —→'-', U+2026 …→"...", - U+00A0→' ', U+2500.. box→CP866 box; прочее → '?'. - -## Поток загрузки - -1. Грузим в `src_phys`. Детект-скан → кодировка E. -2. Если E ∈ {UTF8}: строим UTF-8-набор (utf_phys + конвертация + индекс), - показываем UTF-8. Иначе: показываем 8-битный (общий индекс на src, - активная таблица = E). -3. **Ленивый build второго набора в простое.** Главный цикл — НЕ блокирующий - getkey, а kbhit-поллинг: пока нет клавиш и второй набор (UTF-8 при - стартовом 8-бит, либо 8-бит при стартовом UTF-8) не построен — докручиваем - его инкрементально. После — F8 в любую сторону мгновенно. - -## F8 — переключение - -- Цикл g_encoding: CP866 → CP1251 → KOI8-R → UTF8 → CP866. -- 8-бит↔8-бит: сменить активную таблицу + redraw (без переиндексации). -- в/из UTF-8: переключить активный индекс/кэш на соответствующий набор - (если построен; иначе достроить — но при ленивом build обычно уже готов). -- Статус-бар: имя кодировки; меню (строка 31): «F8 Codepage». - -## Фазы реализации (ИТОГ) - -1. ✅ **Ядро 8-бит**: ATTR_BOX; кэш хранит исходный байт; таблицы CP1251/KOI8R; - ремап в draw (`win_rest_remap`). -2. ✅ **UTF-8 набор**: `alloc_and_convert_utf8` + `utf8_convert` (декодер 1/2/3- - байт, 4-байтные/битые → `?`); `utf_cyr_to_866[96]` + символьные подстановки - в `conv_emit_cp` (стрелки 0x18-0x1B, галка 0xFB, буллет 0xF9, тире/кавычки/ - box/° и т.п.; «» → `<`/`>`, т.к. в CP866 гильеметов нет). -3. ✅ **Детекция** (BOM + эвристика), сэмпл — первые **4 КБ** (быстро); хвост- - обрезка multibyte на границе сэмпла не штрафуется. -4. ✅ **Сосуществование 2 наборов** (`docset_t g_doc[2]` + `doc_save/load/switch`, - свап «живых» глобалов). Сборка — **ленивая (build-on-demand)**: при старте - строится только первичный (показываемый) набор; UTF-8 конвертация тоже - ленивая (в `build_doc`, не до первого экрана → старт быстрый). Второй набор - достраивается `switch_encoding()` при первом F8-переходе в него (спиннер, - потом кэш). Eager-вариант отвергнут: удваивал старт и блокировал F8 на время - фоновой сборки. -5. ✅ **F8** полный цикл CP866→CP1251→KOI8R→UTF8→CP866 (внутри 8-бит — ремап, - на границе — `doc_switch`/ленивая сборка). Статус: `enc_name` кол.37. Меню - «F8 Codepage» показывается только когда переключение возможно (`g_f8_enabled`): - во время сборки 8-битного первичного F8 разрешён в `load_key` (только цикл - 8-бит); во время сборки UTF-8 первичного метка F8 скрыта. F1-справка: секция - Encoding. - -NB: меню-строка разбита на 10 блоков по 8 колонок, метки Fn кладутся в блок -(n-1)*8 (F1→0, F8→7, F10→9). - -## Память -- 8-бит: src + scratch-страница для ремапа (1 стр.). Доп. индекса нет. -- UTF-8 набор: utf_phys (≤8 стр.) + свой индекс/кэш-контент. Строится лениво. -- Бюджет 215 свободных страниц (sprinter_emm_budget) — с запасом. - -## Открытые вопросы (к реализации) -1. Имя кодировки в статусе — где (зона имени файла / отдельный слот). -2. Набор UTF-8-подстановок символов — приоритет (→ ← ✓ ✗ • — … « » box). -3. Глубина таблиц пунктуации CP1251/KOI8 (минимум кириллица+dash или полнее). -4. Объём детект-сэмпла (весь файл или первые N КБ). - -## Риски -- Корректность различения контент/структура по attr — нужно, чтобы ВСЕ - вставленные глифы имели не-контентный attr (проверить box/markers). -- Два набора индекс/кэш (8-бит + UTF-8) + переключение активного — учёт - страниц, чтобы не течь и не путать. -- Точность таблиц (особенно UTF-8 символы) — итеративно по факту. diff --git a/examples/mdview2/docs/mdview2-plan.md b/examples/mdview2/docs/mdview2-plan.md deleted file mode 100644 index 6bfa8a9..0000000 --- a/examples/mdview2/docs/mdview2-plan.md +++ /dev/null @@ -1,164 +0,0 @@ -# mdview2 — план: рендер-кэш вместо живого парсинга на каждый скролл - -Контекст и обоснование — см. обсуждение 2026-06-23 (после оптимизации mdview через -``, см. `mdview-модель-документа-и-рендеринг.md`). Идея: вместо того -чтобы при каждом скролле повторно идти в файл (`fb()`, W3-банкинг) и гонять -markdown inline-парсер (`handle_inline_marker`/emphasis state machine), один раз -отрендерить каждую логическую строку в готовый байтовый буфер и дальше выводить -его на экран напрямую — без парсинга, без обращения к исходному файлу. - -Ключевые подтверждённые факты (эмпирически в MAME, не из документации): - -- **Формат буфера ESTEX `WINCOPY`(59h)/`WINREST`(5Ah)** — пара байт `(char, attr)` - на ячейку, по строкам, шаг строки = `width*2`, без паддинга. Можно генерировать - самим, не вызывая `WINCOPY`. `WINREST` копирует сразу `H` строк одним вызовом. - Детали ABI и регистров — см. `tests/winrest/winrest.c`. -- **Бюджет EMM**: 256 страниц (4 МБ) total, 215 (3440 КБ) free на старте программы. - Файл+индекс в худшем случае (128 КБ файл) съедают 16 страниц (256 КБ) — остаётся - ≈199 страниц (3184 КБ). Кэш всего документа целиком (даже худший случай: - 16384 строк × 160 байт = 2.6 МБ) укладывается без LRU/частичного кэша. - -## Единый формат строки (пересмотрено 2026-06-23) - -Исходно планировалось два типа строк (тип 1 — многоцветные, помещающиеся; -тип 2 — nowrap/code, один стиль, чистый текст для экономии памяти). От этого -деления отказались: строки таблиц (`IF_NOWRAP`, но не `IF_CODE`) всё равно -проходят inline-парсер и могут содержать несколько атрибутов (bold/italic в -ячейках) — предположение "один стиль" для них неверно. Бюджет EMM -([[sprinter_emm_budget]]) с большим запасом покрывает (char,attr)-формат для -ВСЕХ строк без исключения, поэтому усложнение не оправдано. - -**Единый формат**: кэш-запись = `len` пар `(char,attr)` — реальная длина -контента в ячейках, без паддинга до 80, капается на `MAX_CACHE_LINE_LEN`=255. -Вывод: `bios_fillcharattr(' ', base_attr, SCREEN_W)` (очистить строку) → -`win_rest(row, left_margin, 1, len, page)` (контент). Для широких nowrap-строк -горизонтальный скролл (Фаза 5) — это просто смещение НАЧАЛА среза внутри ТОГО -ЖЕ (char,attr)-буфера на `hscroll*2` байт, тот же `win_rest`, без отдельного -плain-текстового формата и без необходимости на лету "разворачивать" текст+ -атрибут в пары. - -## Фазы реализации - -### Фаза 0 — скаффолдинг `examples/mdview2/` [СДЕЛАНО 2026-06-23] -Новая директория со своим `Makefile`/`app.mk` (по аналогии с `mdview/`, не -модифицируем `mdview.c`). `mdview2.c` — копия `mdview.c` без изменений логики -(только usage-строка/заголовок комментария). Собирается чисто, дискета собрана. - -### Фаза 1 — формат кэша и директория строк [СДЕЛАНО и ЗАКРЫТО 2026-06-23] -Реализовано в `mdview2.c`: -- `cache_rec_t` (РОВНО 8 байт: `page`, `off` (uint16_t), `len`, `flags`, - `reserved`, `pad[2]`; размер задаётся `CACHE_DIR_REC_SIZE = sizeof(cache_rec_t)`, - НЕ хардкодом — см. разобранный инцидент ниже) — **отдельная** директория - (`cache_dir_phys[]`/`cache_dir_get`/`cache_dir_put`), своя ёмкость = - `file_pages+1` страниц (как у индекса). **Важное уточнение к исходному тексту - плана ниже**: директория НЕ переиспользует слоты `idx_rec_t` in-place — - рендер-воркер (Фаза 2) при обработке строки N может заглядывать в idx-записи - СОСЕДНИХ строк (откат cont-сегментов, line_idx+1 для границы сегмента); если - бы строка N-1 была перезатёрта сразу после своего рендера, воркер строки N - прочитал бы уже не исходные off/flags, а указатель в кэш — поломав откат. - Бюджет EMM ([[sprinter_emm_budget]]) позволяет отдельный массив — он безопаснее. -- Пул контента — отдельные EMM-страницы (`cache_content_phys[]`), ленивый рост - по 1 странице в `cache_reserve()` (bump-allocator, запись никогда не - разбивается через границу страницы; длина капается на `MAX_CACHE_LINE_LEN`=255 - ячеек). -- `cache_commit()` = один `bank_write()` на строку (буфер строки собирается - локально в W1/W2 заранее, не в W3 — иначе конфликт с `fb()` при чтении - исходника во время рендера). -- `win_rest()` (ESTEX WINREST 5Ah) — вывод готового буфера на экран. -- `phase1_selftest()` — самопроверка (резервирует/коммитит 4 тестовые ячейки, - кладёт запись в директорию по индексу 0, рисует через `win_rest` дважды - подряд с координатами через параметры функции) — убрать в Фазе 2. - -**Подтверждено визуально в MAME (2026-06-23)**: оба квадрата 2×2 на месте, без -единой задержки, с координатами через переменные — Фаза 1 полностью закрыта. - -**Разобранный инцидент (НЕ платформенный квирк)**: по пути долго казалось, что -`win_rest()` после "всплеска" обычных BIOS print-вызовов рисует буфер в -неправильном месте, причём воспроизводилось только когда `row`/`col` приходили -через переменные, а не как константы — это и было ключом. Настоящая причина: -`cache_rec_t` фактически занимал 7 байт (SDCC z80 не паддит структуры), а -`CACHE_DIR_REC_SIZE` был захардкожен как 8 — `bank_read`/`bank_write` копировали -8 байт в 7-байтный буфер на стеке, затирая соседнюю переменную (параметр `col`) -вызывающей функции. Фикс — `cache_rec_t` явно до 8 байт + размер через -`sizeof()`. Полная история и общий урок — [[sprinter_winrest_format]] и -[[defer_unexplained_quirks]]. - -### Фаза 2 — рендер-воркер (бывший `render_line`) [СДЕЛАНО 2026-06-23] -`render_line_to_cache(line_idx)` — адаптация `render_line()`: та же классификация -строк/префиксов/inline-парсинг (`handle_inline_marker`, emphasis state machine, -soft-wrap join) БЕЗ ИЗМЕНЕНИЙ, но вместо `bios_writeattr`/`flush_run`/`wrchar`/ -`bios_fillcharattr` на экран — пишем `(char,attr)` пары через `cc_put`/`cc_fill` -в локальный `cellbuf` (без батчинга через `runbuf`/`flush_run` — тот паттерн был -нужен только чтобы минимизировать число BIOS-вызовов, при записи в локальный -буфер смысла нет, пишем посимвольно сразу по месту), затем ОДНИМ -`cache_reserve()`+`cache_commit()`+`cache_dir_put()` коммитим всю строку. -Кэшируется ПОЛНЫЙ контент строки до `MAX_CACHE_LINE_LEN`, без обрезки по -`SCREEN_W` и без среза по `viewport_x` (view/scroll-time понятия, Фаза 4-5). -Также найден и исправлен по ходу баг в `win_rest()`: `IX` всегда указывал на -начало страницы (`#0xC000`), полностью игнорируя `off` — работало только в -Фазе 1, где в кэше была ровно одна запись со смещением 0; как только Фаза 2 -начала пакетировать много строк на одной странице с разными `off`, все строки -стали читаться с начала страницы. Фикс: `win_rest()` принимает `off` -(uint16_t), `IX = 0xC000 + off` (новая раскладка ABI сверена через `sdcc -S` -с непустым телом — у `__naked` с пустым телом SDCC не генерирует код доступа -к параметрам, нужен пробный non-naked враппер). Подтверждено визуально в MAME. - -### Фаза 3 — фоновый пре-рендер с прогрессом [СДЕЛАНО 2026-06-23] -`emit_seg()` вызывает `render_line_to_cache()` **interleaved** с построением -индекса — но с отставанием на одну строку: рендер строки N требует уже -существующей idx-записи N+1 (источник `seg_end`), которой ещё нет в момент, -когда строка N только создана. Поэтому `emit_seg()` для новой строки рендерит -ПРЕДЫДУЩУЮ (`n_lines-2` после инкремента) — её флаги (`IF_NOWRAP`/`IF_CODE`/ -`IF_BLANK`) к этому моменту уже дописаны вызовом `set_*_cur()` на предыдущей -итерации `index_lines()`. Последнюю строку файла (у которой "следующей" не -будет) дорендеривает сам `index_lines()` после выхода из цикла, как и -`render_line()` делал для последней строки при живом рендере (`seg_end = -file_size`). Требует, чтобы `cache_dir_phys[]` был выделен ДО `index_lines()` — -это уже так (`load_file()` выделяет директорию кэша, затем вызывается -`index_lines()`). - -**Важное сужение скоупа относительно исходного текста плана ниже**: пункты -"спиннер крутится, пока `rendered_up_to < n_lines`" и "скролл ограничен -диапазоном `[0, rendered_up_to]`" **не реализованы и не нужны** в этой -архитектуре — рендеринг происходит СИНХРОННО внутри той же однопроходной -`index_lines()`, без событийного цикла во время загрузки; пользователь -физически не может начать скроллить, пока `index_lines()` не вернёт -управление, а к этому моменту весь документ уже полностью в кэше. Спиннер -из `index_lines()` (каждые 16 строк) сохранён как есть — он покрывает -индексацию+рендер вместе, отдельный прогресс-индикатор не нужен. - -### Фаза 4 — cache-only draw path при скролле -Цикл перерисовки видимой области (после пре-рендера) идёт **только** по -директории строк → `win_rest` (тип 1) или срез текста+`bios_writeattr` (тип 2). -Никаких обращений к `fb()`/исходному файлу в steady-state скролле. - -### Фаза 5 — горизонтальный скролл для широких nowrap-строк -Срез ТОГО ЖЕ (char,attr)-кэш-буфера по текущему `hscroll`-офсету (смещение -начала на `hscroll*2` байт внутри буфера строки), `win_rest(row, col, 1, -visible_len, page)` с новым `off`. Никакого отдельного плоско-текстового -формата не нужно (см. пересмотр "Единый формат строки" выше). - -### Фаза 6 — тестирование в MAME -Тот же набор паттернов, что использовался для mdview1 (заголовки/списки/цитаты/ -code-block/bold-italic/nowrap-обрезка), ПЛЮС: реальный замер EMM на большом -документе (не синтетика — проверить, что бюджет из [[sprinter_emm_budget]] -действительно держится на чём-то близком к 128 КБ); UX пре-рендера (спиннер + -ограничение скролла, отсутствие "дыр" в недорендеренной области); проверка -`win_rest` на РЕАЛЬНОМ отрендеренном контенте (не только синтетический A/B/C/D -тест из `tests/winrest`). - -## Открытые вопросы (решить по ходу, не блокируют старт Фазы 0) - -- ~~Хранение длины строки в директории~~ — решено в Фазе 1: поле `len` (uint8_t) - прямо в `cache_rec_t`. -- ~~Деление строк на тип 1/тип 2~~ — отказались (см. "Единый формат строки" - выше): единый (char,attr)-формат для всех строк, капается на - `MAX_CACHE_LINE_LEN`=255 ячеек (с тем же индикатором обрезки на этапе вывода, - что уже есть в рендере для nowrap-строк). -- Освобождать ли страницы исходного файла после того, как все его строки - отрендерены (вернуть EMM в пул) — даёт больше места про запас, но усложняет - (нужна гарантия, что назад к файлу обращаться больше не придётся — а это не - так, если позже добавится поиск по тексту). Не делать в v1. -- BIOS-вариант `WIN_COPY_WIN`/`WIN_RESTORE_WIN` (0B2h/0B3h, RST 8) не проверен - (см. [[sprinter_winrest_format]]) — ESTEX-варианта достаточно для v1, проверять - BIOS-вариант только если понадобится экономия на RST-диспетчеризации. diff --git a/examples/mdview2/mdview2.c b/examples/mdview2/mdview2.c deleted file mode 100644 index b228b46..0000000 --- a/examples/mdview2/mdview2.c +++ /dev/null @@ -1,1338 +0,0 @@ -/* - * mdview2 — просмотрщик Markdown для Sprinter (render-cache версия). - * - * Этот файл — ЯДРО (инфраструктура + точка входа). Прикладные подсистемы - * вынесены в отдельные модули (общий интерфейс — mdview2.h): - * mdview2_index.c — парсер/индексатор markdown (построение рендер-кэша) - * mdview2_md.c — представление MD-документа (отрисовка из кэша + скролл) - * mdview2_raw.c — RAW-просмотр исходного текста (F2/F3) - * mdview2_enc.c — кодировки CP866/CP1251/KOI8R + UTF-8 конвертер - * mdview2_table.c — выровненная отрисовка таблиц - * mdview2_help.c — диалог справки (F1) - * - * В ядре остаётся: пул рендер-кэша, доступ к EMM/окну W3 (fb/win_rest), - * примитивы экрана, загрузка файла, наборы документа (doc-slots), кооператив- - * ная loading-loop и диспетчер клавиш, сборка наборов и main(). - * - * Разметка экрана (80x32): - * строка 0 — статус-бар (имя файла / диапазон строк / всего / %) - * строки 1..30 — область документа (30 видимых строк текста) - * строка 31 — меню (F1 Help / F2 RAW / F3 Wrap / F8 CodePg / F10 Exit) - * - * Память: - * CODE → W1 (режим sprinter-cc --memory small) - * STACK/HEAP/DATA → W2 - * Буфер файла → страницы EMM (до 8 × 16 КБ = 128 КБ), - * отображаемые в W3 по требованию через fb(). - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mdview2.h" /* геометрия, атрибуты, общий интерфейс модулей */ - -/* ---- Палитра атрибутов ------------------------------------------- */ - -static const uint8_t md_pallete[16 * 4] = { - 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, - 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x00, - 0x60, 0x00, 0x60, 0x00, - 0x00, 0x60, 0x60, 0x00, - 0xC8, 0xC8, 0xC8, 0x00, - 0xA0, 0xA0, 0x80, 0x00, - 0xFF, 0xAA, 0xAA, 0x00, - 0xAA, 0xFF, 0xAA, 0x00, - 0xFF, 0xFF, 0xAA, 0x00, - 0xAA, 0xAA, 0xFF, 0x00, - 0xFF, 0xAA, 0xFF, 0x00, - 0xAA, 0xFF, 0xFF, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF -}; - -/* Атрибуты экрана/справки и геометрия — в mdview2.h (общие со всеми модулями). - * Типы записей (idx_rec_t — в mdview2_index.c, cache_rec_t — в mdview2.h), - * словари флагов/стилей (IF_, CK_, INIT_STYLE_) и константы индекса - * (INDEX_RECS_PER_PAGE, MAX_CACHE_LINE_LEN) — в mdview2.h. - * - * В SDCC/z80 критично явно инициализировать static-переменные (`= 0`): - * неинициализированные static-объекты могут конфликтовать по размещению - * и перезаписывать друг друга (см. memory/sdcc_static_storage_gotcha). */ - -#define MAX_INDEX_PAGES 9u /* максимум 9 * 2048 = 18432 сегментов индекса (256 КБ) */ - -/* ================================================================== - * Рендер-кэш: директория и пул EMM-страниц - * ================================================================== - * Каждая логическая строка экрана рендерится РОВНО ОДИН РАЗ (Фаза 2) - * в готовый буфер и больше никогда не парсится повторно при скролле. - * Содержимое живёт в ОТДЕЛЬНОМ пуле EMM-страниц (cache_content_*), - * не путать с idx_rec_t/index_phys[] выше — те остаются неизменными, - * ими пользуется рендер-воркер ПРИ построении кэша (Фаза 2), и их - * нельзя перезатирать, т.к. воркер для одной строки может заглядывать - * в idx-записи СОСЕДНИХ строк (откат cont-сегментов). - * - * ЕДИНЫЙ формат для ВСЕХ строк (решено 2026-06-23 — изначальный план - * различал тип 1/тип 2 по экономии памяти, но строки таблиц — IF_NOWRAP, - * но НЕ IF_CODE — всё равно проходят inline-парсер и могут содержать - * несколько атрибутов, так что "один стиль" для них неверно; бюджет EMM - * (см. sprinter_emm_budget) с большим запасом покрывает (char,attr) - * для всех строк без исключения): контент — `len` пар (char,attr), - * `len` — реальная длина в ЯЧЕЙКАХ без паддинга до SCREEN_W, капается на - * 255 (патологически длинные nowrap-строки урезаются; индикатор обрезки - * добавляется на этапе вывода из кэша, не при рендере в кэш). - */ -/* cache_rec_t (РОВНО 8 байт, см. sprinter_winrest_format) — в mdview2.h. */ - -#define CACHE_DIR_REC_SIZE ((uint16_t)sizeof(cache_rec_t)) -#define CACHE_DIR_RECS_PER_PAGE (16384 / CACHE_DIR_REC_SIZE) /* 2048 */ -#define MAX_CACHE_DIR_PAGES 9u /* симметрично индексу: 9 * 2048 = 18432 записей */ -/* MAX_CACHE_LINE_LEN — в mdview2.h (буфер ячеек g_cells живёт в mdview2_index.c). */ -#define MAX_CACHE_CONTENT_PAGES 40u /* кап контента на набор: 40 * 16 КБ = 640 КБ (80 на оба набора) */ - -static uint8_t cache_dir_blk; -static uint8_t cache_dir_pages; -static uint8_t cache_dir_phys[MAX_CACHE_DIR_PAGES]; - -static uint8_t cache_content_blk[MAX_CACHE_CONTENT_PAGES]; /* id блока на каждую выделенную страницу */ -static uint8_t cache_content_phys[MAX_CACHE_CONTENT_PAGES]; -static uint8_t cache_content_n_pages; /* сколько страниц уже выделено */ -static uint8_t cache_cur_page_idx; /* индекс текущей страницы записи в cache_content_phys */ -static uint16_t cache_cur_off; /* текущее смещение записи в этой странице */ - -/* Доступ к директории рендер-кэша — тот же приём, что у idx_get/idx_put. */ -void cache_dir_get(uint16_t idx, cache_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 0x07FF) << 3); /* 2047 */ - bank_read(cache_dir_phys[page], off, r, CACHE_DIR_REC_SIZE); -} - -void cache_dir_put(uint16_t idx, const cache_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 0x07FF) << 3); /* 2047 */ - bank_write(cache_dir_phys[page], off, r, CACHE_DIR_REC_SIZE); -} - -/* Резервирует nbytes подряд в пуле контента рендер-кэша. - * Запись никогда не разбивается через границу страницы: если остаток - * текущей страницы недостаточен — переходим на следующую целиком, - * жертвуя остатком (проще и безопаснее, чем page-crossing в fb()). - * При нехватке текущего пула — лениво доращиваем его на 1 страницу. - * Возврат: 1 — успех (out_page и out_off заполнены), 0 — EMM кончилась. */ -uint8_t cache_reserve(uint16_t nbytes, uint8_t *out_page, uint16_t *out_off) -{ - if (nbytes == 0 || nbytes > PAGE_SIZE) return 0; - - if (cache_content_n_pages == 0 || - (uint16_t)(cache_cur_off + nbytes) > PAGE_SIZE) { - /* Нужна новая страница: либо пул ещё пуст, либо текущая страница - * не вмещает запись целиком. */ - uint8_t next_idx = (cache_content_n_pages == 0) ? 0 : (uint8_t)(cache_cur_page_idx + 1); - if (next_idx >= cache_content_n_pages) { - if (cache_content_n_pages >= MAX_CACHE_CONTENT_PAGES) - return 0; - uint8_t blk = mem_alloc_pages(1); - if (blk == 0) - return 0; - cache_content_blk[cache_content_n_pages] = blk; - cache_content_phys[cache_content_n_pages] = mem_get_page(blk, 0); - cache_content_n_pages++; - } - cache_cur_page_idx = next_idx; - cache_cur_off = 0; - } - - *out_page = cache_content_phys[cache_cur_page_idx]; - *out_off = cache_cur_off; - cache_cur_off = (uint16_t)(cache_cur_off + nbytes); - return 1; -} - -/* Копирует уже готовый буфер (рендер одной строки, собранный в W1/W2 — - * НЕ в W3, чтобы не конфликтовать с fb()/чтением исходника во время - * рендера) в зарезервированное место в пуле контента. Один bank_write - * на строку, а не по байту. len — РОВНО как у cache_reserve()/bank_write - * — uint16_t, не uint8_t: строка до MAX_CACHE_LINE_LEN=255 ячеек даёт - * до 510 байт (char,attr), это уже не лезет в uint8_t. */ -void cache_commit(uint8_t page, uint16_t off, const void *buf, uint16_t len) -{ - bank_write(page, off, buf, len); -} - -/* emph_to_attr определена ниже (рядом с inline-логикой), нужна в inline_scan. */ -/* emph_to_attr — в mdview2_index.c. */ - -uint16_t n_lines; /* extern: всего строк в индексе текущего набора */ -uint16_t max_lines; /* extern: ёмкость индекса: index_pages * 2048 */ -uint16_t top_line; /* extern: верхняя видимая строка */ -uint32_t file_size; /* extern: размер активного буфера документа */ -static uint8_t file_blk; -static uint8_t file_pages; -static uint8_t file_phys[MAX_PAGES]; -uint8_t index_blk; /* extern: дескриптор EMM-блока индекса */ -uint8_t index_pages; /* */ -uint8_t index_phys[MAX_INDEX_PAGES]; /* extern: физ. страницы индекса */ -uint8_t index_truncated; /* выставляется при исчерпании ёмкости индекса */ -uint8_t g_file_clamped; /* extern: файл >256 КБ обрезан до MAX_FILE при загрузке */ - -/* cur_seg_off/cur_rec (near-состояние индексатора) — в mdview2_index.c. */ -uint8_t cur_page = 0xFF; /* extern: 0xFF = в W3 ещё не показана ни одна страница (extern: кодек инвалидирует) */ -uint8_t viewport_x; /* extern: горизонтальный сдвиг для nowrap-строк */ -char filename[64]; /* extern: статус-бар */ - -/* Прогрессивная загрузка: рисуем первый экран и пускаем скролл, пока - * index_lines() ещё досканирует файл (кооперативно, без прерываний). */ -uint8_t g_view = VIEW_MD; /* extern: активный режим просмотра (существует даже когда доступен только MD режим) */ -#if WITH_RAW -uint8_t g_ready; /* extern: 1 когда первичный документ построен — F2 (RAW) рабочий */ -static uint8_t g_raw_last = VIEW_RAW_WRAP; /* последний под-режим RAW (возврат по F2) */ -#if WITH_HEX -static uint8_t g_hex_last = VIEW_MD; /* вид, из которого вошли в HEX (возврат по F4) */ -#endif -#endif -uint8_t g_loading; /* extern: 1 во время видимой индексации (build_doc) */ -static uint8_t g_first_drawn; /* первый экран уже нарисован */ -uint8_t g_f8_enabled; /* extern: можно ли сейчас переключать кодировку */ -static uint8_t g_utf_failed; /* UTF-8 набор не удалось построить (нет EMM) — пропускаем UTF-8 в цикле F8 */ -uint8_t g_bg_building; /* extern: 1 во время фонового index_step — гасит спиннер индексатора */ -static uint8_t g_bg_doc = 0xFF; /* слот, строящийся в фоне (bg_step); 0xFF = фоновой сборки нет */ -uint8_t g_abort; /* extern: F10/Esc во время загрузки → прервать индексацию */ -static uint16_t g_last_prog; /* n_lines на последнем обновлении статуса */ - -/* Кодировки (ENC_*) и g_encoding — в mdview2.h / mdview2_enc.c. */ -const uint8_t *g_remap; /* extern: активная таблица ремапа (CP1251/KOI8), 0 = без ремапа (CP866)*/ -uint8_t g_scratch_phys; /* extern: EMM-страница под ремап-буфер строки для win_rest */ -static uint8_t g_scratch_blk; /* handle scratch-блока: нужен для освобождения при exit */ - -/* UTF-8 набор (utf_blk/utf_pages/utf_phys/utf_size/utf_avail, конвертер и его - * состояние) — в mdview2_enc.c; разделяемые символы и API — в mdview2.h. - * build_doc() ниже перенаправляет живой file_* на utf_phys и оркеструет - * инкрементальную конвертацию (utf_conv_reset/utf_convert_more). */ - -/* Снимок исходного (8-битного) файлового буфера — набор DOC_8BIT читает его - * как есть, набор DOC_UTF8 читает utf_phys. */ -static uint8_t orig_file_blk; -uint8_t orig_file_pages; /* extern: читает кодек (utf_alloc) */ -uint32_t orig_file_size; /* extern: читает кодек (utf_convert_more) */ -uint8_t orig_file_phys[MAX_PAGES]; /* extern: читает кодек (cv_read) */ - -/* ----------------- Два сосуществующих набора индекс/кэш ----------------- - * DOC_8BIT — исходные байты (CP866/CP1251/KOI8R, различаются ремапом на - * отрисовке); DOC_UTF8 — UTF-8, декодированный в CP866. Оба строятся eager - * при старте (кооперативно), поэтому F8 переключает активный набор мгновенно. - * fb()/idx/cache-аксессоры работают по «живым» глобалам; doc_switch() свапает - * их с сохранённой копией нужного набора. */ -typedef struct { - uint8_t built; - uint8_t enc; /* кодировка отображения этого набора */ - uint8_t file_blk, file_pages; - uint32_t file_size; - uint8_t file_phys[MAX_PAGES]; - uint8_t index_blk, index_pages, index_truncated; - uint16_t n_lines, max_lines; - uint8_t index_phys[MAX_INDEX_PAGES]; - uint8_t cache_dir_blk, cache_dir_pages; - uint8_t cache_dir_phys[MAX_CACHE_DIR_PAGES]; - uint8_t cache_content_n_pages, cache_cur_page_idx; - uint16_t cache_cur_off; - uint8_t cache_content_blk[MAX_CACHE_CONTENT_PAGES]; - uint8_t cache_content_phys[MAX_CACHE_CONTENT_PAGES]; - uint16_t top_line; - uint8_t viewport_x; -} docset_t; - -#define DOC_8BIT 0 -#define DOC_UTF8 1 -static docset_t g_doc[2]; /* built=0 для обоих: _DATA зануляется в crt0 gsinit - * (с 2026-07-04), явный {0}-инициализатор больше - * не нужен — он стоил ~260 байт _INITIALIZER */ -static uint8_t g_active_doc = DOC_8BIT; /* какой набор сейчас в живых глобалах */ -static uint8_t g_disp_doc = DOC_8BIT; /* какой набор показан пользователю */ - -static void doc_switch(uint8_t target); /* forward (нужна в progress_tick) */ - -/* Статус-бар, меню и спиннер — в mdview2_status.c. */ - -/* ================================================================== - * Примитивы экрана, доступ к EMM/окну W3 (fb/win_rest), палитра - * ================================================================== */ - -/* Печатает строку с указанным атрибутом, начиная с позиции (x,y), - * и останавливается на конце строки или правой границе экрана. - * `s` — литерал/статический буфер (CODE/DATA, окна 1/2), поэтому его - * можно передать в BIOS LP_PRINT_LN напрямую, без промежуточной копии. */ -void put_str_attr(uint8_t x, uint8_t y, const char *s, uint8_t attr) -{ - uint8_t len = (x < SCREEN_W) ? (uint8_t)(SCREEN_W - x) : 0; - len = min(len, strlen(s)); - if (len == 0) return; - bios_set_place(y, x); - bios_writeattr_until(s, len, attr, 0); -} - - -/* Полностью очищает указанную строку экрана символами пробела с attr. */ -void fill_row(uint8_t y, uint8_t attr) -{ - bios_clearwin(y, 0, 1, SCREEN_W, attr); -} - -/* Процент 0..100 = num*100/den на чистой 16-битной арифметике — чтобы НЕ - * тянуть 32-битное деление __divulong (~760 Б) ради показа процента в статусе. - * Оба вызова (MD/RAW) дают операнды, влезающие в 16 бит (≤18432 и ≤1024), - * переполняет только *100 — поэтому масштабируем оба вниз, пока num*100 не - * влезёт в uint16, затем считаем долю циклом-вычитанием (без div-хелпера). - * Инвариант вызовов: num ≤ den; результат всё равно ограничен 100. */ -uint8_t pct16(uint16_t num, uint16_t den) -{ - if (den == 0) return 0; - while (num > 655) { num >>= 1; den >>= 1; } /* num*100 ≤ 65500 < 65536 */ - if (den == 0) return 100; /* страховка от num>den */ - uint16_t n = (uint16_t)(num * 100u); - uint8_t p = 0; - while (n >= den && p < 100) { n = (uint16_t)(n - den); p++; } - return p; -} - - -/* Отображает указанную EMM-страницу файла в окно W3. - * Если эта страница уже активна, переключение не выполняется. */ -// static inline void map_page(uint8_t page) -// { -// if (page != cur_page) { -// /* file_phys[] позволяет не вызывать mem_get_page() на каждом свопе. */ -// sprinter_page_w3(file_phys[page]); -// cur_page = page; -// } -// } - - -/* Читает один байт логического файла по смещению p. - * При переходе между страницами автоматически переключает W3. - * Проверка границ выполняется вызывающей стороной. - * - * Эквивалент C-кода (оставлен для справки): - * uint8_t *pb = (uint8_t *)&p; - * uint8_t page = (pb[1] >> 6) | (pb[2] << 2); - * uint16_t off = ((pb[1] & 0x3F) << 8) | pb[0]; - * map_page(page); // if (page!=cur_page){cur_page=page; OUT W3,file_phys[page];} - * return FILE_BUF[off]; // *(0xC000 + off) - * - * Ручной asm — это горячая примитивная операция (вызывается сотни тысяч раз - * при индексации 50КБ-файла); C-версия тратила вызов функции + 32-битную - * арифметику на КАЖДЫЙ байт. Раскладка __sdcccall(1): аргумент uint32_t в - * HLDE (E=pb[0], D=pb[1], L=pb[2], H=pb[3] — проверено sdcc -S), возврат - * char в A. Координация маппинга с bank_read/bank_write держится на том, - * что _io_page_w3 — это ПОРТ (__sfr 0xE2): здесь пишем его через OUT, - * bank_read читает через IN — общий аппаратный регистр, без теневой RAM. - * NB: __naked обязателен (внутри собственный ret); IX/IY не трогаем - * (callee-saved), BC/DE/HL/AF — caller-saved, можно клобберить. */ -char fb(uint32_t p) __naked -{ - (void)p; /* p = HLDE; доступ только из asm */ - __asm - ; off -> BC = 0xC000 + ((pb[1]&0x3F)<<8 | pb[0]) ; D=pb[1], E=pb[0] - ld a, d - or a, #0xC0 ; (D|0xC0) == (D&0x3F)|0xC0 — старший байт окна W3 - ld b, a - ld c, e ; C = pb[0] - - ; page = (pb[1]>>6) | (pb[2]<<2) ; L=pb[2] - ld a, l - add a, a - add a, a ; A = pb[2]<<2 - ld e, a ; E свободен (pb[0] уже сохранён в C) - - ld a, d - rlca - rlca - and a, #0x03 ; A = pb[1]>>6 - or a, e ; A = page - ld e, a ; E = page - - ; map_page(page) - ld a, (_cur_page) - cp e - jr Z, fb_same - ld a, e - ld (_cur_page), a - ld hl, #_file_phys - ld d, #0x00 - add hl, de ; hl = &file_phys[page] - ld a, (hl) - out (#0xE2), a ; OUT PORT_PAGE_W3 (== _io_page_w3 sfr) - fb_same: - ld a, (bc) ; A = *(0xC000 + off) - ret - __endasm; -} - -/* ESTEX WINREST (5Ah, RST 0x10) — копирует готовый буфер (char,attr) - * из смещения `off` ВНУТРИ EMM-страницы `page` прямо в текстовое окно - * экрана, минуя любые BIOS print-вызовы. Формат буфера подтверждён - * эмпирически в MAME (см. memory/sprinter_winrest_format.md и - * tests/winrest/winrest.c): пары (char,attr) по ячейкам, по строкам, - * шаг строки = width*2, без паддинга. row/col — левый верхний угол - * вывода на экране, h/w — высота/ширина в символах. - * - * Регистровая раскладка SDCC __sdcccall(1) для (row,col,h,w,page,off) - * проверена через `sdcc -S` (пробный non-naked враппер): A=row, L=col, - * стек [SP+2]=h [SP+3]=w [SP+4]=page [SP+5..6]=off (little-endian). - * - * История: до 2026-06-23 `off` не было — IX всегда указывал на самое - * начало страницы (#0xC000), это работало только пока в кэше было - * РОВНО ОДНА запись на странице со смещением 0 (Фаза 1 self-test). - * Когда Фаза 2 начала пакетировать много строк на одной странице с - * РАЗНЫМИ off, всё стало читать с начала страницы (т.е. контент первой - * записи) независимо от реальной строки — добавлен off, IX = 0xC000+off. */ -void win_rest(uint8_t row, uint8_t col, uint8_t h, uint8_t w, uint8_t page, uint16_t off) __naked -{ - (void)row; (void)col; (void)h; (void)w; (void)page; (void)off; - __asm - ld iy, #2 - add iy, sp - ld d, a ; D = row - ld e, l ; E = col - push ix ; сохранить IX вызывающей функции (callee-saved) - ld l, 3 (iy) ; off (младший байт), SP+5 - ld h, 4 (iy) ; off (старший байт), SP+6 - ld bc, #0xC000 - add hl, bc - push hl - pop ix ; IX = 0xC000 + off - ld h, 0 (iy) ; H = height - ld a, 1 (iy) ; width -> L - ld l, a - ld a, 2 (iy) ; page -> B - ld b, a - ld c, #0x5A ; ESTEX WINREST - di - rst #0x10 - ei - pop ix ; восстановить IX вызывающей функции - pop hl ; адрес возврата - inc sp - inc sp - inc sp - inc sp - inc sp ; снять h,w,page,off (1+1+1+2 байт) со стека - jp (hl) - __endasm; -} - -/* Char-хелперы, idx_get/idx_put/seg_off, set_*_cur — в mdview2_index.c. */ - -/* Загружает 16 текстовых атрибутов в палитры ink/paper/blink. */ -static void set_pallete(void) { - uint8_t buff[64]; - for(int i = 0; i < 16; i++) { - for(int j = 0; j < 16; j++) { - buff[j * 4] = md_pallete[i * 4]; - buff[j * 4 + 1] = md_pallete[i * 4 + 1]; - buff[j * 4 + 2] = md_pallete[i * 4 + 2]; - buff[j * 4 + 3] = md_pallete[i * 4 + 3]; - } - - text_pal_load(TEXT_PAL_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_BLINK_INK, i * 16, 16, md_pallete); - text_pal_load(TEXT_PAL_PAPER, i * 16, 16, buff); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16, 8, buff + 32); - text_pal_load(TEXT_PAL_BLINK_PAPER, i * 16 + 8, 8, buff + 32); - } -} - -/* ================================================================== - * Загрузка/выгрузка файла - * ================================================================== */ - -/* Загружает исходные байты файла в EMM-страницы (без индекса/кэша — те - * выделяются отдельно на КАЖДЫЙ набор через alloc_set_storage()). - * Возврат: 0 — успех, отрицательное значение — код ошибки. */ -static int load_file(const char *path) -{ - int fd = open(path, O_RDONLY); - if (fd < 0) - return -1; - - long sz = lseek(fd, 0, SEEK_END); - if (sz < 0) { - close(fd); - return -2; - } - /* Файл больше MAX_FILE (256 КБ) не отвергаем, а КЛАМПим: читаем первые - * 256 КБ, индексатор допишет строку-предупреждение (TRUNC_FILE). */ - g_file_clamped = 0; - if ((uint32_t)sz > MAX_FILE) { - sz = (long)MAX_FILE; - g_file_clamped = 1; - } - - file_size = (uint32_t)sz; - lseek(fd, 0, SEEK_SET); - - /* Выделяем ровно столько EMM-страниц, сколько нужно под файл. */ - file_pages = (uint8_t)((file_size + PAGE_SIZE - 1u) / PAGE_SIZE); - if (file_pages == 0) file_pages = 1; - file_blk = mem_alloc_pages(file_pages); - if (file_blk == 0) { - close(fd); - return -3; - } - - /* Читаем файл кусками по 16 КБ, последовательно маппя страницы в W3. - * На последней итерации читаем остаток меньше PAGE_SIZE. */ - uint32_t remaining = file_size; - for (uint8_t page = 0; page < file_pages; page++) { - spinner_tick(); - uint8_t phys = mem_get_page(file_blk, page); - file_phys[page] = phys; - sprinter_page_w3(phys); - cur_page = page; - uint16_t chunk = (remaining > PAGE_SIZE) - ? (uint16_t)PAGE_SIZE - : (uint16_t)remaining; - int n = read(fd, FILE_BUF, chunk); - if (n != (int)chunk) { - close(fd); - return -4; - } - remaining -= chunk; - } - close(fd); - return 0; -} - -/* Выделяет в живые глобалы блок индекса + директорию рендер-кэша под текущий - * набор. file_pages должно быть уже выставлено (размер набора). Сбрасывает - * пул контента в пустое состояние (страницы доращиваются лениво при рендере). - * Возврат: 0 — успех, -5/-6 — нехватка EMM. */ -static int alloc_set_storage(void) -{ - uint8_t want; - - want = (uint8_t)((file_pages >> 1) + 1u); - if (want > MAX_INDEX_PAGES) want = MAX_INDEX_PAGES; - index_blk = mem_alloc_pages(want); - if (index_blk == 0) return -5; - index_pages = want; - for (uint8_t i = 0; i < index_pages; i++) - index_phys[i] = mem_get_page(index_blk, i); - max_lines = (uint16_t)index_pages * INDEX_RECS_PER_PAGE; - - want = (uint8_t)((file_pages >> 1) + 1u); - if (want > MAX_CACHE_DIR_PAGES) want = MAX_CACHE_DIR_PAGES; - cache_dir_blk = mem_alloc_pages(want); - if (cache_dir_blk == 0) return -6; - cache_dir_pages = want; - for (uint8_t i = 0; i < cache_dir_pages; i++) - cache_dir_phys[i] = mem_get_page(cache_dir_blk, i); - - cache_content_n_pages = 0; - cache_cur_page_idx = 0; - cache_cur_off = 0; - return 0; -} - -static void doc_save_live(uint8_t i); /* forward */ - -/* Освобождает все EMM-блоки обоих наборов (индекс/директория/пул контента) - * плюс два файловых буфера (исходный 8-битный и UTF-8). */ -static void unload_file(void) -{ - doc_save_live(g_active_doc); /* зафиксировать живой набор в g_doc */ - for (uint8_t s = 0; s < 2; s++) { - docset_t *d = &g_doc[s]; - if (d->index_blk) { mem_free_block(d->index_blk); d->index_blk = 0; } - if (d->cache_dir_blk) { mem_free_block(d->cache_dir_blk); d->cache_dir_blk = 0; } - for (uint8_t i = 0; i < d->cache_content_n_pages; i++) - if (d->cache_content_blk[i]) mem_free_block(d->cache_content_blk[i]); - d->cache_content_n_pages = 0; - } - if (orig_file_blk) { mem_free_block(orig_file_blk); orig_file_blk = 0; } - if (utf_blk) { mem_free_block(utf_blk); utf_blk = 0; } - if (g_scratch_blk) { mem_free_block(g_scratch_blk); g_scratch_blk = 0; } - file_blk = 0; -} - -/* Парсер/индексатор (classify_line, scan_join_stream, inline_scan, index_lines, emph_to_attr) — в mdview2_index.c. */ - - -/* Таблицы ремапа, set_encoding, кодировки и UTF-8 конвертер — в mdview2_enc.c. */ - -/* ================================================================== - * Наборы документа (doc-slots): сохранение/свап - * ================================================================== - * Два сосуществующих набора (DOC_8BIT / DOC_UTF8) живут как копии всего - * состояния (file/index/cache/позиция) в g_doc[]; «живые» глобалы — это - * активный набор. doc_save_live: живые → g_doc[i]; doc_load_live: g_doc[i] - * → живые (+ инвалидация маппинга fb() и активной кодировки). */ -static void doc_save_live(uint8_t i) -{ - docset_t *d = &g_doc[i]; - d->enc = g_encoding; - d->file_blk = file_blk; d->file_pages = file_pages; d->file_size = file_size; - memcpy(d->file_phys, file_phys, MAX_PAGES); - d->index_blk = index_blk; d->index_pages = index_pages; d->index_truncated = index_truncated; - d->n_lines = n_lines; d->max_lines = max_lines; - memcpy(d->index_phys, index_phys, MAX_INDEX_PAGES); - d->cache_dir_blk = cache_dir_blk; d->cache_dir_pages = cache_dir_pages; - memcpy(d->cache_dir_phys, cache_dir_phys, MAX_CACHE_DIR_PAGES); - d->cache_content_n_pages = cache_content_n_pages; - d->cache_cur_page_idx = cache_cur_page_idx; d->cache_cur_off = cache_cur_off; - memcpy(d->cache_content_blk, cache_content_blk, MAX_CACHE_CONTENT_PAGES); - memcpy(d->cache_content_phys, cache_content_phys, MAX_CACHE_CONTENT_PAGES); - d->top_line = top_line; d->viewport_x = viewport_x; -} - -static void doc_load_live(uint8_t i) -{ - docset_t *d = &g_doc[i]; - file_blk = d->file_blk; file_pages = d->file_pages; file_size = d->file_size; - memcpy(file_phys, d->file_phys, MAX_PAGES); - index_blk = d->index_blk; index_pages = d->index_pages; index_truncated = d->index_truncated; - n_lines = d->n_lines; max_lines = d->max_lines; - memcpy(index_phys, d->index_phys, MAX_INDEX_PAGES); - cache_dir_blk = d->cache_dir_blk; cache_dir_pages = d->cache_dir_pages; - memcpy(cache_dir_phys, d->cache_dir_phys, MAX_CACHE_DIR_PAGES); - cache_content_n_pages = d->cache_content_n_pages; - cache_cur_page_idx = d->cache_cur_page_idx; cache_cur_off = d->cache_cur_off; - memcpy(cache_content_blk, d->cache_content_blk, MAX_CACHE_CONTENT_PAGES); - memcpy(cache_content_phys, d->cache_content_phys, MAX_CACHE_CONTENT_PAGES); - top_line = d->top_line; viewport_x = d->viewport_x; - cur_page = 0xFF; /* следующий fb() пере-смаппит страницу */ - set_encoding(d->enc); -} - -static void doc_switch(uint8_t target) -{ - if (target == g_active_doc) - return; - doc_save_live(g_active_doc); - doc_load_live(target); - g_active_doc = target; -} - -/* Автоопределение/имя кодировки, ремап-вывод и UTF-8→CP866 конвертер — в mdview2_enc.c. */ - -/* Отрисовка области/статус-бара/меню и прокрутка — в модуле mdview2_md.c. */ - - - -/* ================================================================== - * Прогрессивная загрузка и диспетчер клавиш (MD) - * ================================================================== - * index_lines() строит индекс кооперативно и периодически зовёт - * progress_tick(): тот рисует первый готовый экран, крутит спиннер и - * обрабатывает клавиши на лету (load_key). Диалог справки (F1) — в - * mdview2_help.c, RAW-навигация — в mdview2_raw.c. */ - -/* Обработка клавиши во время прогрессивной загрузки: скролл строго в - * пределах готовых строк (drawable_lines); End = последняя готовая страница; - * F1 = справка (show_help сам блокирует и перерисовывает). */ -static void load_key(uint16_t k) -{ - uint8_t ascii = (uint8_t)(k & 0xFF); - uint8_t scan = (uint8_t)((k >> 8) & 0x7F); - uint16_t dr = drawable_lines(); - uint16_t maxtop = (dr > VIEW_H) ? (uint16_t)(dr - VIEW_H) : 0; - uint16_t nt = top_line; - - if (ascii == 0x1B || scan == KEY_F10) { - g_abort = 1; - return; - } /* Esc/F10 → выход */ - if (ascii) - return; /* прочие ascii игнорируем */ - - switch (scan) { - case KEY_UP: - nt = (top_line >= 1) ? (uint16_t)(top_line - 1) : 0; - break; - case KEY_DOWN: - nt = top_line + 1; - break; - case KEY_PGUP: - nt = (top_line >= VIEW_H) ? (uint16_t)(top_line - VIEW_H) : 0; - break; - case KEY_PGDN: - nt = top_line + VIEW_H; - break; - case KEY_HOME: - top_line = 0; - viewport_x = 0; - draw_viewport_from_cache(); - render_md_status_numbers(); - return; - case KEY_END: - top_line = maxtop; - viewport_x = 0; - draw_viewport_from_cache(); - render_md_status_numbers(); - return; - case KEY_LEFT: - md_scroll_horizon(-(int8_t)HPAN_STEP); - render_md_status_numbers(); - return; - case KEY_RIGHT: - md_scroll_horizon(+(int8_t)HPAN_STEP); - render_md_status_numbers(); - return; - case KEY_F1: - show_help(); - return; - case KEY_F8: - /* во время сборки крутим ТОЛЬКО 8-бит и только если набор 8-битный - * (ремап на отрисовке; индексация не зависит от кодировки) */ - if (g_f8_enabled && g_active_doc == DOC_8BIT) { - uint8_t nx = (g_encoding == ENC_CP866) ? ENC_CP1251 : - (g_encoding == ENC_CP1251) ? ENC_KOI8R : ENC_CP866; - set_encoding(nx); - g_doc[DOC_8BIT].enc = nx; - draw_viewport_from_cache(); - render_full_status(); - } - return; - default: - return; - } - - if (nt > maxtop) - nt = maxtop; - if (nt != top_line) { - top_line = nt; - draw_viewport_from_cache(); - render_md_status_numbers(); - } -} - -/* Кооперативный «тик» прогрессивной загрузки — вызывается из index_lines(). */ -void progress_tick(void) -{ -#if WITH_RAW - /* В RAW-режиме буфер документа готов сразу после конвертации (до индекса), - * поэтому первый экран RAW можно показать немедленно — рисуем raw_draw, а - * не MD-вид (иначе мелькал бы MD). Индекс при этом строится дальше (нужен - * для MD-вида). */ - if (g_view != VIEW_MD) { -#if WITH_HEX - if (g_view == VIEW_HEX) { /* HEX показывает оригинал — экран уже актуален */ - spinner_tick(); - return; - } -#endif - if (!g_first_drawn) { - raw_draw(); - // render_raw_status(); - g_first_drawn = 1; - cur_page = 0xFF; /* raw_draw сбил W3-маппинг, на который опирается fb() */ - } - spinner_tick(); - return; - } -#endif - /* Прогрессивная отрисовка строящегося (всегда показываемого) набора. */ - uint8_t touched = 0; - if (!g_first_drawn && drawable_lines() >= VIEW_H) { - draw_viewport_from_cache(); - render_md_status_numbers(); - g_first_drawn = 1; - touched = 1; - } - if (n_lines >= (uint16_t)(g_last_prog + 10)) { - g_last_prog = n_lines; - spinner_tick(); - if (g_first_drawn) - render_md_status_numbers(); - touched = 1; - } - if (g_first_drawn && kbhit()) { - load_key(getkey()); - touched = 1; - } - /* Отрисовка/WINREST/BIOS могли сбить маппинг W3, на который опирается fb() - * при индексации → форсируем ре-маппинг страницы файла на следующем fb(). */ - if (touched) - cur_page = 0xFF; -} - -/* ================================================================== - * Точка входа - * ================================================================== */ - -/* Строит набор `slot` кооперативно (index_step + progress_tick). - * visible=1 — первичный (показываемый): прогрессивная отрисовка первого экрана - * и скролл по готовым строкам. visible=0 — вторичный: индексация идёт в живых - * глобалах, а progress_tick через свап показывает/листает уже готовый - * g_disp_doc. Возврат: 0 — успех, <0 — нехватка EMM (-5/-6/-7). - * - * Если slot прямо сейчас строится ФОНОМ (g_bg_doc, см. bg_step ниже) — - * не начинаем заново, а ДОКРУЧИВАЕМ: загружаем частично построенный набор - * и продолжаем с сохранённой позиции индексатора (его межшаговое состояние - * живёт в статиках модуля index и переживает свапы наборов). - * - * UTF-8 набор конвертируется ИНКРЕМЕНТАЛЬНО: выделяем страницы, переключаем - * живой буфер на utf и запускаем конвертацию первого чанка; дальше index_step - * докручивает её впереди позиции чтения (g_utf_building). Конвертер читает - * оригинал из orig_file_phys[] через cv_read (не через fb, который теперь - * указывает на utf). */ -/* Настраивает живые глобалы под сборку набора slot: файловый буфер (utf/orig), - * индекс + директория кэша, сброс индексатора. Общая часть build_doc и - * bg_build_start. Возврат: 0 — успех, <0 — нехватка EMM (-5/-6/-7). */ -static int doc_setup(uint8_t slot) -{ - if (slot == DOC_UTF8) { - if (!utf_avail) { /* первый вход: выделить страницы */ - if (!utf_alloc()) - return -7; /* выделяет страницы + сбрасывает конвертер */ - utf_avail = 1; - } - file_blk = utf_blk; - file_pages = utf_pages; - memcpy(file_phys, utf_phys, MAX_PAGES); - if (g_utf_building) { - file_size = 0; - cur_page = 0xFF; - utf_convert_more(CONV_MARGIN); /* первый чанк — для первого экрана */ - } else { - file_size = utf_size; - } - } else { - file_blk = orig_file_blk; - file_pages = orig_file_pages; - file_size = orig_file_size; - memcpy(file_phys, orig_file_phys, MAX_PAGES); - } - cur_page = 0xFF; - - int rc = alloc_set_storage(); - if (rc < 0) - return rc; - index_begin(); - return 0; -} - -static int build_doc(uint8_t slot, uint8_t enc, uint8_t visible) -{ - if (g_bg_doc == slot) { /* фон уже строит его — продолжить */ - doc_load_live(slot); - g_bg_doc = 0xFF; - } else { - int rc = doc_setup(slot); - if (rc < 0) - return rc; - } - - set_encoding(enc); - top_line = 0; - viewport_x = 0; - g_active_doc = slot; - if (visible) { - g_disp_doc = slot; - g_first_drawn = 0; - status_encoding(); /* показать кодировку сразу (детект/F8), не дожидаясь индексации */ - cur_page = 0xFF; /* BIOS-вывод мог сбить W3-маппинг, на который опирается fb() */ - } - - g_loading = 1; - g_last_prog = 0; - while (!index_step(255)) {} - g_loading = 0; - - /* Зафиксировать конвертацию (на случай обрыва индекса по max_lines до конца - * исходника) — иначе g_utf_building остался бы 1 и сломал бы следующую сборку. */ - if (g_utf_building) { - utf_size = file_size; - g_utf_building = 0; - } - - g_doc[slot].built = 1; - doc_save_live(slot); - return 0; -} - -/* ================================================================== - * Фоновая сборка второго набора (idle-time, между клавишами) - * ================================================================== - * Пока пользователь читает документ, главный цикл в паузах между клавишами - * докручивает индексацию второго набора (UTF-8 при 8-битном первичном и - * наоборот) порциями index_step: свап на bg-набор → несколько итераций → - * свап обратно. Экран при этом не трогается (g_bg_building гасит спиннер), - * задержка реакции на клавишу — не больше одного шага. По готовности F8 - * переключает наборы мгновенно; F8 ДО готовности докручивает сборку видимо - * (ветка resume в build_doc), не начиная её заново. */ - -#define BG_STEP_BUDGET 2u /* итераций индексатора на idle-шаг: латентность клавиши - * = длительность шага (~единицы мс на обычном абзаце) */ -#define BG_KEY_HOLDOFF 300u /* пустых опросов kbhit после клавиши до возобновления - * фона — при автоповторе (скролл) фон не вклинивается */ - -/* Готовит фоновую сборку второго набора: настраивает живые глобалы (буфер, - * индекс, кэш, index_begin) так же, как build_doc, но БЕЗ индексации, и - * возвращает живым прежний набор. При нехватке EMM фон просто не стартует — - * остаётся сегодняшний ленивый путь по F8. */ -static void bg_build_start(void) -{ - uint8_t slot = (uint8_t)((g_active_doc == DOC_8BIT) ? DOC_UTF8 : DOC_8BIT); - uint8_t vis = g_active_doc; - if (g_doc[slot].built || (slot == DOC_UTF8 && g_utf_failed)) - return; /* строить нечего */ - - doc_save_live(vis); - if (doc_setup(slot) < 0) { /* нет EMM — как и в ленивом пути */ - if (slot == DOC_UTF8) g_utf_failed = 1; - doc_load_live(vis); - return; - } - top_line = 0; - viewport_x = 0; - - g_active_doc = slot; /* живые глобалы = bg-набор... */ - doc_switch(vis); /* ...сохранить его и вернуть видимый */ - g_bg_doc = slot; -} - -/* Один idle-шаг фона: свап на строящийся набор, порция индексации, свап - * обратно. Межшаговое состояние индексатора/UTF-конвертера — статики их - * модулей, обработчики клавиш видимого набора их не трогают. По завершении - * финализирует набор (дальше F8 переключается мгновенно). */ -static void bg_step(void) -{ - uint8_t vis = g_active_doc; - doc_switch(g_bg_doc); - g_bg_building = 1; - uint8_t done = index_step(BG_STEP_BUDGET); - g_bg_building = 0; - if (done) { - if (g_utf_building) { /* как build_doc: обрыв индекса до конца исходника */ - utf_size = file_size; - g_utf_building = 0; - } - g_doc[g_bg_doc].built = 1; /* doc_save_live поле built не трогает */ - g_bg_doc = 0xFF; - } - doc_switch(vis); -} - -/* Пропорциональный перенос байт-позиции между буферами разного размера - * (8bit ↔ UTF-8 при F8): off * to / from БЕЗ __mullong/__divulong. Один - * цикл restoring-деления: бит k дроби off/from (сравнение с from/2^k) - * сразу добавляет to/2^k в результат — сумма to/2^k по установленным - * битам и есть off*to/from. Точность from/65536 (≤4 байта на максимальном - * файле); ляжет на границу строки через line_at_off / raw_reanchor. */ -static uint32_t map_off(uint32_t off, uint32_t from, uint32_t to) -{ - if (from == to || from == 0) return off; - uint32_t res = 0; - for (uint8_t i = 0; i < 16; i++) { - from >>= 1; - to >>= 1; - if (off >= from) { off -= from; res += to; } - } - return res; -} - -/* Байт-позиция текущего вида (верх экрана) — единая «валюта» для переноса - * позиции между видами/наборами. Валюта = offset АКТИВНОГО буфера; HEX живёт - * в байтах оригинала, для UTF-набора конвертируем через map_off. */ -static uint32_t view_pos(void) -{ -#if WITH_HEX - if (g_view == VIEW_HEX) - return (g_active_doc == DOC_UTF8) - ? map_off(hex_pos(), orig_file_size, file_size) - : hex_pos(); -#endif -#if WITH_RAW - if (g_view != VIEW_MD) return raw_pos(); -#endif - return seg_off(top_line); -} - -/* Поставить текущий вид на байт-позицию off (активного буфера). */ -static void view_reanchor(uint32_t off) -{ -#if WITH_HEX - if (g_view == VIEW_HEX) { - hex_reanchor((g_active_doc == DOC_UTF8) - ? map_off(off, file_size, orig_file_size) - : off); - return; - } -#endif -#if WITH_RAW - if (g_view != VIEW_MD) { raw_reanchor(off); return; } -#endif - top_line = line_at_off(off); -} - -/* Переключает кодировку на `next` (вызывается из главного цикла по F8). - * 8-бит↔8-бит внутри одного набора — мгновенный ремап; переход в другой набор - * — мгновенный doc_switch, если он построен, иначе ЛЕНИВАЯ сборка по месту - * (со спиннером), результат кэшируется. */ -/* Меняет кодировку: тот же набор — ремап; другой готовый — doc_switch; - * непостроенный — ЛЕНИВАЯ ТИХАЯ сборка (спиннер, без отрисовки документа). - * НЕ перерисовывает документ/статус — это делает вызывающий в своём режиме - * (MD: draw_viewport_from_cache; RAW: raw_draw), чтобы не мелькал чужой вид. */ -static void switch_encoding(uint8_t next) -{ - uint8_t target = (next == ENC_UTF8) ? DOC_UTF8 : DOC_8BIT; - - if (target == g_active_doc) { /* тот же набор — только ремап */ - set_encoding(next); - g_doc[target].enc = next; - } else if (g_doc[target].built) { /* набор готов — мгновенный свап */ - /* Позицию переносим пропорцией байтов (буферы наборов разного - * размера), а не из сохранённой в g_doc копии — иначе каждый набор - * скачет по своей старой позиции. */ - uint32_t old_off = view_pos(); - uint32_t old_size = file_size; - doc_switch(target); - g_disp_doc = target; - set_encoding(next); - g_doc[target].enc = next; - view_reanchor(map_off(old_off, old_size, file_size)); - } else { /* строим набор лениво */ - doc_save_live(g_active_doc); /* сохранить текущий (позиция и т.п.) */ -#if WITH_RAW - uint32_t raw_save = raw_pos(); - if (VIEW_IS_RAW(g_view)) /* HEX показывает оригинал — его позиция инвариантна */ - raw_reanchor(0); /* прогрессивный показ нового буфера — с начала */ - g_ready = 0; - render_menu(); /* идёт индексация — прячем F2 */ -#endif - spinner_show(1); - int rc = build_doc(target, next, 1); /* visible: прогрессивный показ первого экрана - * (progress_tick рисует по текущему виду — MD/RAW) */ - spinner_show(0); -#if WITH_RAW - g_ready = 1; - render_menu(); -#endif - if (rc < 0) { /* нет EMM — откат на текущий набор */ - if (target == DOC_UTF8) - g_utf_failed = 1; - doc_load_live(g_active_doc); -#if WITH_RAW - if (VIEW_IS_RAW(g_view)) - raw_reanchor(raw_save); /* буфер прежний — вернуть позицию RAW */ -#endif - return; - } - g_disp_doc = target; /* build_doc уже выставил active/enc */ - } - clamp_top(); /* привести top_line к новому набору (для MD) */ -} - -/* ================================================================== - * Вывод ошибки - * ================================================================== */ - -static void on_exit(void) { - unload_file(); - pal_reset(PAL_CGA); -} - -int main(int argc, char **argv) -{ - const char *path; - if (argc >= 2) { - path = argv[1]; - } else { - path = "README.MD"; - /* Дефолтный файл отсутствует — выводим подсказку без смены режима экрана. */ - { - int chk = open(path, O_RDONLY); - if (chk < 0) { - // settextmode(TEXT_MODE_80x32); - clrscr_attr(ATTR_TEXT); - cputs("MDView v0.3 -- Markdown Viewer for Sprinter\r\n" \ - "(c) 2026 Petrov A.G.\r\n\r\n" \ - "Usage: mdview2 \r\n" \ - " Displays a Markdown document (CP866/CP1251/KOI8R/UTF8, up to 128 KB).\r\n"); - exit(-1); - } - close(chk); - } - } - - atexit(on_exit); - - /* Копируем путь в static filename[] для отображения в статус-баре. */ - { - uint8_t i = 0; - while (i < (uint8_t)(sizeof(filename) - 1) && path[i]) { - filename[i] = path[i]; - i++; - } - filename[i] = 0; - } - - /* Сначала поднимаем UI, чтобы пользователь видел шапку/меню/спиннер - * уже во время загрузки файла и построения индекса. */ - settextmode(TEXT_MODE_80x32); - clrscr_attr(ATTR_TEXT); - set_pallete(); - prerender_status(); - render_menu(); - render_full_status(); - render_percent_progress(0); - spinner_show(1); - - int rc = load_file(path); - if (rc < 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: cannot load file '"); - cputs(path); - cputs("'\n\rError: "); - switch (rc) { - case -1: cputs("open failed"); break; - case -2: cputs("seek failed"); break; - case -3: cputs("mem_alloc_pages failed"); break; - case -4: cputs("short read"); break; - case -5: cputs("index alloc failed"); break; - case -6: cputs("render-cache dir alloc failed"); break; - } - cputs("\n\r\n\r"); - exit(-1); - } - /* Scratch-страница под ремап-буфер строки (win_rest_remap). Handle - * сохраняем отдельно: физический номер страницы нельзя передавать - * mem_free_block(), а on_exit() обязан вернуть EMM системе. */ - g_scratch_blk = mem_alloc_pages(1); - if (g_scratch_blk == 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: scratch page allocation failed\n\r"); - exit(-1); - } - g_scratch_phys = mem_get_page(g_scratch_blk, 0); - - /* Оба набора пока не построены (страховка к инициализатору g_doc). */ - g_doc[DOC_8BIT].built = 0; - g_doc[DOC_UTF8].built = 0; - - /* Снимок исходного 8-битного буфера (его читает набор DOC_8BIT). */ - orig_file_blk = file_blk; orig_file_pages = file_pages; orig_file_size = file_size; - memcpy(orig_file_phys, file_phys, MAX_PAGES); - - /* Детекция кодировки по оригиналу. UTF-8 конвертацию НЕ делаем здесь — - * она дорогая (полный проход) и нужна только для UTF-8 набора, который - * строится через build_doc лениво. Так первый экран рисуется по индексации - * первичного набора без лишнего прохода. */ - uint8_t det = detect_encoding(); - - /* Первичный (показываемый) набор — по детекции; второй строится ЛЕНИВО по - * первому F8 (switch_encoding). Во время сборки 8-битного первичного F8 - * разрешён (ремап 8-бит, см. load_key) → показываем метку F8; для UTF-8 - * первичного переключаться пока некуда → метку прячем. */ - uint8_t prim_enc = det; - uint8_t prim_doc = (prim_enc == ENC_UTF8) ? DOC_UTF8 : DOC_8BIT; - g_f8_enabled = (prim_doc == DOC_8BIT); - render_menu(); - - rc = build_doc(prim_doc, prim_enc, 1); /* первичный — видимый */ - if (rc < 0 && prim_doc == DOC_UTF8) { /* UTF-8 не вышел (нет EMM) → 8-бит */ - prim_doc = DOC_8BIT; prim_enc = ENC_CP866; - rc = build_doc(DOC_8BIT, ENC_CP866, 1); - } - if (rc < 0) { - spinner_show(0); - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("MDView: index/cache alloc failed\n\r\n\r"); - exit(-1); - } - if (g_abort) - exit(0); /* F10/Esc во время загрузки — корректный выход */ - if (n_lines == 0) { - clrscr_attr(ATTR_RESET); - textattr(ATTR_RESET); - cputs("mdview: empty file"); - exit(-1); - } - - /* Первичный готов — гасим спиннер, включаем F8 (второй набор дособерётся - * лениво по первому переключению) и рисуем финальный статус с ПОЛНЫМ - * счётчиком строк. */ - spinner_show(0); - g_f8_enabled = 1; -#if WITH_RAW - g_ready = 1; /* документ построен — теперь доступен F2 (RAW) */ -#endif - render_menu(); - clamp_top(); - render_full_status(); - draw_viewport_from_cache(); - - /* Второй набор (UTF-8 при 8-битном первичном и наоборот) готовим фоном - * в паузах между клавишами — к первому F8 он обычно уже построен. */ - bg_build_start(); - - for (;;) { - /* Idle-фон: пока второй набор не достроен, вместо блокирующего getkey - * опрашиваем клавиатуру и тратим паузы на bg_step. Холдаун после - * каждой клавиши: при активном скролле (автоповтор) фон молчит и - * плавность не страдает. После достройки — снова блокирующий getkey. */ - if (g_bg_doc != 0xFF) { - uint16_t idle = 0; - while (!kbhit()) { - if (idle < BG_KEY_HOLDOFF) { - idle++; - continue; - } - bg_step(); - if (g_bg_doc == 0xFF) - break; - } - } - uint16_t k = getkey(); - uint8_t ascii = (uint8_t)(k & 0xFF); - uint8_t scan = (uint8_t)((k >> 8) & 0x7F); - - if (ascii) { - if (ascii == 0x1B) - break; /* клавиша Esc */ - continue; - } - if (scan == KEY_F10) { - break; - } - if (scan == KEY_F1) { - show_help(); - continue; - } /* show_help сам перерисует */ - /* F2 — тумблер RAW ↔ MD (из HEX тоже уводит в MD). - * Рабочий только после постройки документа. */ - if (scan == KEY_F2) { - if (!g_ready) continue; - if (g_view == VIEW_MD) { - g_view = g_raw_last; /* → RAW (последний под-режим) */ - raw_seed_from(top_line); /* позиция из MD */ - raw_screen_init(); - status_encoding(); - render_menu(); - render_raw_status(); - raw_draw(); - } else { - uint32_t off = view_pos(); /* позиция из RAW/HEX */ - if (VIEW_IS_RAW(g_view)) - g_raw_last = g_view; /* запомнить под-режим RAW */ - g_view = VIEW_MD; - top_line = line_at_off(off); - clamp_top(); - render_full_status(); render_menu(); - draw_viewport_from_cache(); - } - continue; - } -#if WITH_HEX - /* F4 — тумблер HEX ↔ прежний вид (MD/RAW). */ - if (scan == KEY_F4) { - if (!g_ready) continue; - uint32_t off = view_pos(); /* позиция текущего вида */ - if (g_view == VIEW_HEX) { /* HEX → прежний вид */ - g_view = g_hex_last; - view_reanchor(off); - if (g_view == VIEW_MD) { - clamp_top(); - render_full_status(); render_menu(); - draw_viewport_from_cache(); - } else { - raw_screen_init(); - status_encoding(); render_menu(); - render_raw_status(); raw_draw(); - } - } else { /* MD/RAW → HEX */ - g_hex_last = g_view; - g_view = VIEW_HEX; - view_reanchor(off); /* active → байты оригинала */ - hex_screen_init(); - status_encoding(); render_menu(); - render_hex_status(); hex_draw(); - } - continue; - } -#endif - /* цикл CP866→CP1251→KOI8R→UTF8→CP866; набор дособерётся лениво */ - if (scan == KEY_F8) { - uint8_t next = (g_encoding == ENC_CP866) ? ENC_CP1251 : - (g_encoding == ENC_CP1251) ? ENC_KOI8R : - (g_encoding == ENC_KOI8R) ? ENC_UTF8 : ENC_CP866; - if (next == ENC_UTF8 && g_utf_failed) - next = ENC_CP866; /* UTF-8 недоступен */ - switch_encoding(next); - if (g_abort) - exit(0); /* Esc/F10 во время ленивой досборки */ - /* Перерисовка — по текущему виду (switch_encoding сам не рисует). */ -#if WITH_HEX - if (g_view == VIEW_HEX) { - status_encoding(); - render_hex_status(); - hex_draw(); /* printable-колонка в новой кодировке */ - continue; - } -#endif -#if WITH_RAW - if (g_view != VIEW_MD) { - status_encoding(); - render_raw_status(); - raw_draw(); - continue; - } -#endif - render_full_status(); - draw_viewport_from_cache(); - continue; - } - switch(g_view) { - case VIEW_MD: - /* MD-режим: F1/F8/F10 здесь, навигация — в md_key() (peer к raw_key). */ - md_key(scan); /* навигация MD (сама рисует+статус); незнакомые игнорит */ - continue; -#if WITH_HEX - case VIEW_HEX: - hex_key(scan); /* навигация HEX (сама рисует+процент) */ - continue; -#endif -#if WITH_RAW - case VIEW_RAW_WRAP: - case VIEW_RAW_HSCROLL: - /* RAW-режим: F3 Wrap/Unwrap, своя навигация; F8 — кодировка; F1/F10. */ - /* Wrap ↔ Unwrap */ - if (scan == KEY_F3) { - g_view = (g_view == VIEW_RAW_WRAP) ? VIEW_RAW_HSCROLL : VIEW_RAW_WRAP; - g_raw_last = g_view; - raw_renorm(); - raw_screen_init(); - render_menu(); - render_raw_status(); - raw_draw(); - continue; - } - raw_key(scan); - continue; -#endif /* WITH_RAW */ - default: - break; - } - } - clrscr_attr(ATTR_TEXT); - exit(0); - return 0; -} diff --git a/examples/mdview2/mdview2.h b/examples/mdview2/mdview2.h deleted file mode 100644 index 1c53d6f..0000000 --- a/examples/mdview2/mdview2.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - * mdview2.h — общие определения и интерфейс между модулями mdview2. - * - * Монолит mdview2.c расщеплён на ядро + модули: index (парсер), md/raw (виды), - * enc (кодировки), table, help. Здесь — разделяемые константы экрана/атрибутов, - * словари флагов/стилей, тип cache_rec_t, extern-объявления разделяемого - * состояния ядра и API каждого модуля (сгруппированы по секциям ниже). - */ -#ifndef MDVIEW2_H -#define MDVIEW2_H - -#include -#include /* COLOR(), COLOR_* */ -#include "mdview2_conf.h" /* WITH_RAW / WITH_HEX — выбор опциональных модулей */ - -/* ---- Геометрия экрана -------------------------------------------- */ -#define SCREEN_W 80 -#define SCREEN_H 32 -#define VIEW_TOP_ROW 1 -#define VIEW_H 30 /* видимая область: строки 1..30 включительно */ -#define MENU_ROW 31 -#define TAB_STOP 4 -#define HPAN_STEP 8u /* шаг горизонтального сдвига (←/→) */ - -/* ---- Геометрия статус-бара (строка 0): фиксированные поля и разделители ---- */ -#define SPINNER_COL 8 /* слот спиннера загрузки */ -#define DIV1_X 45 /* разделитель │ перед числами диапазона строк */ -#define DIV2_X 71 /* разделитель │ перед процентом */ -/* Числа/метка пишутся с DIVn_X+2; область между разделителями — [DIV1_X+1 .. DIV2_X-1]. */ - -/* ---- Параметры файла и памяти ------------------------------------ */ -#define PAGE_BITS 14u -#define PAGE_SIZE (1u << PAGE_BITS) /* размер EMM-страницы: 16 КБ */ -#define PAGE_MASK ((uint16_t)(PAGE_SIZE - 1u)) -#define MAX_PAGES 16 /* 16 страниц × 16 КБ = 256 КБ */ -#define MAX_FILE ((uint32_t)MAX_PAGES * PAGE_SIZE) -#define FILE_BUF ((char *)0xC000) /* окно W3, куда мапится текущая EMM-страница */ - -/* ---- Палитра атрибутов ------------------------------------------- */ -#define ATTR_RESET COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_TEXT COLOR(COLOR_LIGHTGRAY, COLOR_BLUE) -#define ATTR_TEXT_TITLE1 COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_TEXT_TITLE2 COLOR(COLOR_LIGHTBLUE, COLOR_BLUE) -#define ATTR_TEXT_TITLE3 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_TITLE4 COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_BOLD COLOR(COLOR_LIGHTRED, COLOR_BLUE) -#define ATTR_TEXT_ITALIC COLOR(COLOR_LIGHTGREEN, COLOR_BLUE) -#define ATTR_TEXT_UNDERSORE COLOR(COLOR_LIGHTMAGENTA, COLOR_BLUE) -#define ATTR_TEXT_CODE COLOR(COLOR_WHITE, COLOR_BLUE) -#define ATTR_TEXT_STRIKE COLOR(COLOR_DARKGRAY, COLOR_BLUE) -#define ATTR_LIST_MARKER COLOR(COLOR_LIGHTCYAN, COLOR_BLUE) -#define ATTR_QUOTE_MARKER COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_HR COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_BOX COLOR(COLOR_CYAN, COLOR_BLUE) -#define ATTR_TRUNC COLOR(COLOR_YELLOW, COLOR_BLUE) -#define ATTR_BAR COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_BAR_SPINNER COLOR(COLOR_WHITE, COLOR_LIGHTCYAN) -#define ATTR_MENU_T COLOR(COLOR_BLACK, COLOR_LIGHTCYAN) -#define ATTR_MENU_K COLOR(COLOR_YELLOW, COLOR_BLACK) -#define ATTR_WARN COLOR(COLOR_YELLOW, COLOR_RED) /* строка-обрыв (исчерпан кэш/лимит) */ - -/* ---- Атрибуты диалога справки ------------------------------------ */ -#define ATTR_HELP_BG COLOR(COLOR_LIGHTGRAY, COLOR_BLACK) -#define ATTR_HELP_BDR COLOR(COLOR_WHITE, COLOR_BLACK) -#define ATTR_HELP_TIT COLOR(COLOR_YELLOW, COLOR_BLACK) -#define ATTR_HELP_HDR COLOR(COLOR_WHITE, COLOR_BLACK) - -/* ---- Режимы просмотра -------------------------------------------- */ -#define VIEW_MD 0 /* markdown с форматированием (по умолчанию) */ -#define VIEW_RAW_WRAP 1 /* RAW: длинные строки переносятся кратно 80 */ -#define VIEW_RAW_HSCROLL 2 /* RAW: длинные строки в одну, гориз. скролл */ -#define VIEW_HEX 3 /* HEX-дамп оригинального файла */ -#define VIEW_IS_RAW(v) ((v) == VIEW_RAW_WRAP || (v) == VIEW_RAW_HSCROLL) - -/* ---- Кодировки --------------------------------------------------- */ -/* 8-битные (CP866/CP1251/KOI8R) различаются только ремапом глифов [128-255] - * на отрисовке; UTF-8 — отдельный декодированный набор. */ -#define ENC_CP866 0 -#define ENC_CP1251 1 -#define ENC_KOI8R 2 -#define ENC_UTF8 3 -#define ENC_UNSUPPORTED -1 /* UTF16 / UTF32 */ -#define CONV_MARGIN 4096u /* на сколько байт держать UTF-конвертацию впереди индексатора */ - -/* ---- Флаги сегмента индекса (IF_*) — общие для индексатора/кэша/вью ---- */ -#define IF_CONT 0x01u /* сегмент является продолжением перенесённой строки */ -#define IF_NOWRAP 0x02u /* строка не переносится (кодовый блок / HR / таблица) */ -#define IF_BLANK 0x04u /* визуально пустая строка */ -#define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */ -#define IF_HSCROLL 0x10u /* блок горизонтально скроллируется ЦЕЛИКОМ (код/таблица), - * включая строки короче 80 — двигаются как единый блок. - * НЕ ставится на HR и границы fence (им нечего прятать). */ -#define IF_TRUNC_MSG 0x20u /* строка-обрыв: рисуется ВЖИВУЮ фикс. текстом (без контент-кэша); - * cache_rec.reserved несёт код причины (TRUNC_*). */ - -/* ---- Причина обрыва индексации (cache_rec.reserved при IF_TRUNC_MSG) ---- */ -#define TRUNC_CONTENT 1 /* исчерпан контент-кэш (MAX_CACHE_CONTENT_PAGES) */ -#define TRUNC_LINES 2 /* исчерпана ёмкость индекса (max_lines) */ -#define TRUNC_FILE 3 /* файл больше MAX_FILE — прочитаны первые 256 КБ */ - -/* ---- Словарь сегментов/стилей (общий для индексатора и таблиц) ---- */ -/* Тип сегмента-продолжения, передаваемый в emit_seg()/inline_scan(). */ -#define CK_PLAIN 0 -#define CK_QUOTE 1 -#define CK_LIST 2 -#define CK_OTHER 3 - -/* Начальный inline-стиль сегмента (INIT_STYLE_*). */ -#define INIT_STYLE_PLAIN 0x0 -#define INIT_STYLE_BOLD 0x1 -#define INIT_STYLE_ITALIC 0x2 -#define INIT_STYLE_UNDER 0x3 -#define INIT_STYLE_CODE 0x4 -#define INIT_STYLE_STRIKE 0x5 - -/* ---- Таблицы: CP866 light box-drawing (общий для индексатора и модуля) ---- */ -#define TBL_MAX_COLS 16 -#define TBL_ATTR ATTR_BOX -#define TBL_H 0xC4 /* ─ */ -#define TBL_V 0xB3 /* │ */ -#define TBL_TL 0xDA /* ┌ */ -#define TBL_TM 0xC2 /* ┬ */ -#define TBL_TR 0xBF /* ┐ */ -#define TBL_ML 0xC3 /* ├ */ -#define TBL_MM 0xC5 /* ┼ */ -#define TBL_MR 0xB4 /* ┤ */ -#define TBL_BL 0xC0 /* └ */ -#define TBL_BM 0xC1 /* ┴ */ -#define TBL_BR 0xD9 /* ┘ */ - -/* ================================================================== * - * Разделяемые символы mdview2.c, используемые модулем RAW. - * ================================================================== */ -extern uint8_t g_view; /* активный режим просмотра (VIEW_*) */ -extern uint32_t file_size; /* размер активного буфера документа */ -extern const uint8_t *g_remap; /* таблица ремапа [128-255] (0 = нет) */ -extern uint8_t g_scratch_phys; /* scratch EMM-страница для win_rest */ - -char fb(uint32_t p); /* байт активного буфера (W3-маппинг) */ -void win_rest(uint8_t row, uint8_t col, uint8_t h, uint8_t w, uint8_t page, uint16_t off); -void fill_row(uint8_t y, uint8_t attr); -uint8_t pct16(uint16_t num, uint16_t den); /* num*100/den (0..100), 16-бит, без __divulong */ -uint32_t seg_off(uint16_t idx); /* offset исходника для логической строки idx */ -uint16_t line_at_off(uint32_t off); /* обратно: последняя строка с seg_off <= off */ - -/* ================================================================== * - * API модуля RAW (mdview2_raw.c). - * ================================================================== */ -void raw_seed_from(uint16_t md_top_line); /* вход в RAW: позиция по top_line */ -uint32_t raw_pos(void); /* текущий байт-offset верха экрана RAW */ -void raw_reanchor(uint32_t off); /* поставить RAW на строку с байтом off */ -void raw_draw(void); /* перерисовать область документа в RAW */ -uint8_t raw_pct(void); /* % прокрутки по байтам (для render_raw_status_numbers) */ -uint8_t raw_key(uint8_t scan); /* навигация RAW; 1 = обработано */ -void raw_screen_init(void); /* очистка экрана с нужным аттрибутом */ -void raw_renorm(void); /* выровнять позицию при смене под-режима (F3) */ - -/* ================================================================== * - * API модуля HEX (mdview2_hex.c) — дамп ОРИГИНАЛЬНОГО файла (F4). - * Позиция hex_pos/hex_reanchor — в байтах ОРИГИНАЛА (orig_file_*); - * конвертацию в/из активного буфера делает ядро (map_off). - * ================================================================== */ -uint32_t hex_pos(void); /* offset верхнего ряда (кратен 16) */ -void hex_reanchor(uint32_t orig_off); /* поставить на ряд с байтом orig_off */ -void hex_draw(void); /* перерисовать область документа */ -uint8_t hex_key(uint8_t scan); /* навигация HEX; 1 = обработано */ -void hex_screen_init(void); /* очистка экрана */ - -/* ================================================================== * - * Запись директории рендер-кэша (одна на видимую строку, РОВНО 8 байт — - * cache_dir_get/put адресуют сдвигом idx<<3). Контент — len пар (char,attr). - * ================================================================== */ -typedef struct cache_rec_s { - uint8_t page; /* EMM-страница рендер-кэша (физический номер) */ - uint16_t off; /* смещение в странице, 0..16383 (байты, не ячейки) */ - uint8_t len; /* длина контента в ЯЧЕЙКАХ (char,attr пар), 0..255; 0 = пустая/HR */ - uint8_t flags; /* копия IF_NOWRAP/IF_CODE/IF_BLANK на момент рендера */ - uint8_t reserved; /* не используется */ - uint8_t pad[2]; /* явный резерв, добивка до 8 байт */ -} cache_rec_t; - -void cache_dir_get(uint16_t idx, cache_rec_t *r); /* читатель директории кэша (ядро) */ -void put_str_attr(uint8_t x, uint8_t y, const char *s, uint8_t attr); /* печать строки с атрибутом */ - -/* ================================================================== * - * Состояние навигации/представления (определено в mdview2.c). - * ================================================================== */ -extern uint16_t n_lines; /* всего строк в индексе текущего набора */ -extern uint16_t top_line; /* верхняя видимая строка */ -extern uint8_t viewport_x; /* горизонтальный сдвиг (nowrap-строки) */ -extern char filename[]; /* имя файла для статус-бара */ -extern uint8_t g_loading; /* 1 во время index_lines() */ -extern uint8_t g_ready; /* 1 когда первичный документ построен (F2 RAW) */ -extern uint8_t g_f8_enabled; /* можно ли сейчас переключать кодировку */ - -/* ================================================================== * - * Статус-бар (строка 0), меню (строка 31), спиннер — mdview2_status.c. - * Атомарные части: prerender (фикс. хром, один раз) / encoding (поле кодировки) - * / numbers (диапазон строк + %) / menu / spinner — обновляются по отдельности. - * ================================================================== */ -void prerender_status(void); /* фикс. часть: фон, разделители, MDVIEW, имя файла (1 раз) */ -void status_encoding(void); /* только поле кодировки (col 37) */ -void render_md_status_numbers(void); /* числа MD: диапазон строк + % */ -void render_raw_status(void); /* RAW mode: метка режима */ -void render_hex_status(void); /* HEX mode: метка режима */ -void render_full_status(void); /* encoding + numbers (MD) */ -void render_menu(void); /* строка меню (по смене режима/готовности) */ -uint16_t drawable_lines(void); /* число строк, готовых к показу */ -void spinner_tick(void); /* кадр спиннера загрузки */ -void spinner_show(uint8_t on); /* вкл/выкл спиннер */ -void render_percent_progress(uint8_t pct); /* показать процентный прогресс просмотра */ - -/* ================================================================== * - * Отрисовка области MD-документа и прокрутка (mdview2_md.c). - * ================================================================== */ -void draw_viewport_from_cache(void); /* перерисовать область документа из кэша */ -void clamp_top(void); /* привести top_line к диапазону */ -void md_scroll_up(uint16_t n); -void md_scroll_down(uint16_t n); -void md_scroll_horizon(int8_t delta); /* горизонтальный сдвиг nowrap-блоков */ -uint8_t md_key(uint8_t scan); /* навигация MD (после загрузки); 1 = обработано */ - -/* ================================================================== * - * API модуля справки (mdview2_help.c). - * ================================================================== */ -void show_help(void); /* модальный диалог F1 */ - -/* ================================================================== * - * Парсер/индексатор (mdview2_index.c) и разделяемое с ним состояние. - * Хранилище индекса (index_blk/pages/phys, n_lines/max_lines) — в ядре - * (аллокация/doc-slot), индексатор пишет в него; cache_*-писатели и - * progress_tick ядро экспортирует индексатору (spinner_tick — из status). - * ================================================================== */ -#define INDEX_RECS_PER_PAGE 2048u /* 16384 / 8; запись всегда в одной странице */ -#define MAX_CACHE_LINE_LEN 255u /* кап длины контента строки в ячейках (буфер g_cells) */ - -extern uint16_t max_lines; /* ёмкость индекса: index_pages * 2048 */ -extern uint8_t index_blk, index_pages; /* дескриптор EMM-блока индекса */ -extern uint8_t index_phys[]; /* физ. страницы индекса */ -extern uint8_t index_truncated; /* индекс упёрся в ёмкость */ -extern uint8_t g_abort; /* F10/Esc во время загрузки → прервать индексацию */ -extern uint8_t g_file_clamped; /* файл был обрезан до MAX_FILE при загрузке (>256 КБ) */ - -uint8_t cache_reserve(uint16_t nbytes, uint8_t *out_page, uint16_t *out_off); -void cache_commit(uint8_t page, uint16_t off, const void *buf, uint16_t len); -void cache_dir_put(uint16_t idx, const cache_rec_t *r); -void progress_tick(void); /* кооперативный шаг loading-loop (рисует/листает) */ - -/* Резюмируемая индексация (для фоновой сборки второго набора): begin сбрасывает - * проход, step выполняет до budget итераций (блоков исходника) и возвращает 1, - * когда индекс финализирован. Межшаговое состояние — статики модуля index; - * оно не входит в docset_t (см. bg_step ядра). */ -void index_begin(void); -uint8_t index_step(uint8_t budget); -extern uint8_t g_bg_building; /* 1 = фоновый шаг индексации: не трогать экран (спиннер) */ - -/* ================================================================== * - * Буфер ячеек рендера (mdview2.c) — общий с модулем таблиц. - * Таблицы эмитят свои строки теми же примитивами, что и индексатор. - * ================================================================== */ -extern uint8_t g_ncells; /* ячеек в текущем сегменте */ -void gc_put(char ch, uint8_t attr); /* добавить ячейку в g_cells */ -void gc_fill(char ch, uint8_t attr, uint8_t n); /* n одинаковых ячеек */ -uint8_t inline_scan(uint32_t q, uint32_t q_end, uint8_t col, - uint8_t ckind, uint8_t line_style, uint8_t base_attr, - uint8_t nowrap); - -/* ================================================================== * - * API модуля таблиц (mdview2_table.c) — вызывается из index_lines(). - * ================================================================== */ -uint32_t row_end(uint32_t p); /* offset завершающего '\n' (или file_size) */ -uint32_t table_first_cell(uint32_t row_start); /* контент первой ячейки строки */ -uint8_t table_next_cell(uint32_t *pp, uint32_t lineend, uint32_t *cs, uint32_t *ce); -uint8_t table_is_sep_row(uint32_t row_start, uint32_t lineend); -void table_border(const uint8_t *widths, uint8_t ncols, char left, char mid, char right); -void table_data_row(uint32_t row_start, uint32_t lineend, const uint8_t *widths, uint8_t ncols); - -/* ================================================================== * - * Кодировки и UTF-8 конвертация (mdview2_enc.c). - * Состояние кодека владеется модулем; build_doc()/index_lines() ядра - * оркестрируют его (привязка UTF-буфера к живому file_*, сборка наборов). - * ================================================================== */ -extern uint8_t g_encoding; /* активная кодировка (ENC_*) */ -extern uint8_t g_utf_building; /* 1 пока UTF-конвертация не дошла до конца исходника */ -extern uint8_t utf_avail; /* 1 = страницы UTF-8 выделены */ -extern uint8_t utf_blk, utf_pages; /* дескриптор EMM-буфера UTF-набора */ -extern uint8_t utf_phys[]; /* физ. страницы UTF-буфера */ -extern uint32_t utf_size; /* размер сконвертированного UTF-потока */ - -/* Ядро-owned состояние, читаемое кодеком (определено в mdview2.c). */ -extern uint8_t cur_page; /* текущая страница файла в W3 (инвалидация маппинга) */ -extern uint8_t orig_file_phys[]; /* физ. страницы снимка исходного файла */ -extern uint8_t orig_file_pages; -extern uint32_t orig_file_size; - -void set_encoding(uint8_t enc); /* активная кодировка + таблица ремапа */ -const char *enc_name(uint8_t enc); /* короткое имя для статус-бара */ -uint8_t detect_encoding(void); /* автоопределение по сэмплу байт */ -void win_rest_remap(uint8_t row, uint8_t w, uint8_t page, uint16_t off); /* вывод среза с ремапом */ -void utf_convert_more(uint32_t target); /* инкрементальная конвертация до target байт */ -uint8_t utf_alloc(void); /* выделить EMM-страницы под UTF-набор; 0 = нет EMM */ -uint8_t utf_cp_glyph(uint32_t cp); /* кодпойнт → один CP866-глиф ('?' без аналога) */ - -#endif /* MDVIEW2_H */ diff --git a/examples/mdview2/mdview2_conf.h b/examples/mdview2/mdview2_conf.h deleted file mode 100644 index 330505e..0000000 --- a/examples/mdview2/mdview2_conf.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * mdview2_conf.h — конфигурация сборки mdview2: какие опциональные модули - * просмотра включать. 1 = включить (код входит в бинарь), 0 = исключить - * полностью (нулевой расход кода/памяти). - * - * Модули обёрнуты в #if WITH_xxx целиком, поэтому файлы можно держать в - * сборке всегда (при 0 они компилируются в пустой объектник) — менять - * нужно только эти define. - */ -#ifndef MDVIEW2_CONF_H -#define MDVIEW2_CONF_H - -#define WITH_RAW 1 /* RAW-просмотр исходника (F2): mdview2_raw.c */ -#define WITH_HEX 1 /* HEX-дамп оригинального файла (F4): mdview2_hex.c */ - -#endif /* MDVIEW2_CONF_H */ diff --git a/examples/mdview2/mdview2_enc.c b/examples/mdview2/mdview2_enc.c deleted file mode 100644 index 14d0ad9..0000000 --- a/examples/mdview2/mdview2_enc.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * mdview2_enc.c — кодировки и конвертация UTF-8 → CP866. - * - * Две связанные подсистемы: - * 1. 8-битные кодировки (CP866/CP1251/KOI8-R) — различаются только ремапом - * старших байтов [128-255] на ОТРИСОВКЕ (g_remap, win_rest_remap). - * Автоопределение — detect_encoding по частоте ходовых букв. - * 2. UTF-8 — отдельный набор: исходник инкрементально декодируется в - * utf_phys[] как чистый CP866 (utf_convert_more), после чего весь - * конвейер индексации/кэша работает по нему без ремапа. - * - * Владеет состоянием кодека (conv-буфер, позиция конвертации, UTF-страницы); - * описание разделяемых символов и API — в mdview2.h. Оркестрацией (привязка - * UTF-буфера к живому file_*, сборка наборов) занимается build_doc() ядра. - */ - -#include -#include /* COLOR()/COLOR_* для ATTR_* в attr_is_content */ -#include /* sprinter_page_w3 */ -#include /* bank_read/bank_write/mem_alloc_pages/mem_get_page */ -#include "mdview2.h" - -/* ---- Состояние кодировки/UTF (владелец — этот модуль) ------------- */ -uint8_t g_encoding = ENC_CP866; /* активная кодировка */ - -uint8_t utf_blk; -uint8_t utf_pages; -uint8_t utf_phys[MAX_PAGES]; -uint32_t utf_size; -uint8_t utf_avail; /* 1 = страницы UTF-8 выделены */ -uint8_t g_utf_building; /* 1 пока конвертация не дошла до конца исходника */ - -/* Приватное состояние конвертера (наружу не торчит — сброс через - * utf_conv_reset(), чтение оригинала через cv_read). */ -static uint32_t utf_src; /* позиция чтения ОРИГИНАЛА (utf-8) */ -static uint8_t cv_page = 0xFF; /* orig-страница в W3 для cv_read (своя от cur_page) */ - -/* Таблицы ремапа СТАРШИХ байтов [128-255] в CP866. Индексируются (ch-0x80): - * младшие 128 (ASCII) — identity, в ремапе не участвуют (win_rest_remap - * трогает только ch>=0x80), поэтому в таблицах их нет. Кириллица + ходовая - * пунктуация; неизвестное → '?' (0x3F). Сгенерированы Python codecs. */ -static const uint8_t cp1251_to_866[128] = { - /* 80 */ 0x3F, 0x3F, 0x27, 0x3F, 0x22, 0x2E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3C, 0x3F, 0x3F, 0x3F, 0x3F, - /* 90 */ 0x3F, 0x27, 0x27, 0x22, 0x22, 0x07, 0x2D, 0x2D, 0x3F, 0x3F, 0x3F, 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, - /* A0 */ 0xFF, 0xF6, 0xF7, 0x3F, 0xFD, 0x3F, 0x3F, 0x3F, 0xF0, 0x63, 0xF2, 0x3C, 0x3F, 0x3F, 0x72, 0xF4, - /* B0 */ 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xF1, 0xFC, 0xF3, 0x3E, 0x3F, 0x3F, 0x3F, 0xF5, - /* C0 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - /* D0 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - /* E0 */ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - /* F0 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, -}; -static const uint8_t koi8r_to_866[128] = { - /* 80 */ 0xC4, 0xB3, 0xDA, 0xBF, 0xC0, 0xD9, 0xC3, 0xB4, 0xC2, 0xC1, 0xC5, 0xDF, 0xDC, 0xDB, 0xDD, 0xDE, - /* 90 */ 0xB0, 0xB1, 0xB2, 0x3F, 0xFE, 0xF9, 0xFB, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0xF8, 0x3F, 0xFA, 0x3F, - /* A0 */ 0xCD, 0xBA, 0xD5, 0xF1, 0xD6, 0xC9, 0xB8, 0xB7, 0xBB, 0xD4, 0xD3, 0xC8, 0xBE, 0xBD, 0xBC, 0xC6, - /* B0 */ 0xC7, 0xCC, 0xB5, 0xF0, 0xB6, 0xB9, 0xD1, 0xD2, 0xCB, 0xCF, 0xD0, 0xCA, 0xD8, 0xD7, 0xCE, 0x63, - /* C0 */ 0xEE, 0xA0, 0xA1, 0xE6, 0xA4, 0xA5, 0xE4, 0xA3, 0xE5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, - /* D0 */ 0xAF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xA6, 0xA2, 0xEC, 0xEB, 0xA7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA, - /* E0 */ 0x9E, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83, 0x95, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, - /* F0 */ 0x8F, 0x9F, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82, 0x9C, 0x9B, 0x87, 0x98, 0x9D, 0x99, 0x97, 0x9A, -}; - -/* Устанавливает активную кодировку и таблицу ремапа (для 8-битных). */ -void set_encoding(uint8_t enc) -{ - g_encoding = enc; - g_remap = (enc == ENC_CP1251) ? cp1251_to_866 : - (enc == ENC_KOI8R) ? koi8r_to_866 : (const uint8_t *)0; -} - -/* Самые ходовые строчные русские буквы (о е а и н т с р в л) — их байты - * различают 8-битные кодировки по частоте. */ -// static const uint8_t common866 [10] = {0xAE,0xA5,0xA0,0xA8,0xAD,0xE2,0xE1,0xE0,0xA2,0xAB}; -// static const uint8_t common1251[10] = {0xEE,0xE5,0xE0,0xE8,0xED,0xF2,0xF1,0xF0,0xE2,0xEB}; -// static const uint8_t commonkoi [10] = {0xCF,0xC5,0xC1,0xC9,0xCE,0xD4,0xD3,0xD2,0xD7,0xCC}; -// static uint8_t in_set10(const uint8_t *s, uint8_t b) -// { -// for (uint8_t i = 0; i < 10; i++) if (s[i] == b) return 1; -// return 0; -// } - -/* Проверяем только пять самых популярных символов (о е а и н) */ -static const uint8_t common866 [5] = {0xAE,0xA5,0xA0,0xA8,0xAD}; -static const uint8_t common1251[5] = {0xEE,0xE5,0xE0,0xE8,0xED}; -static const uint8_t commonkoi [5] = {0xCF,0xC5,0xC1,0xC9,0xCE}; -static uint8_t in_set10(const uint8_t *s, uint8_t b) -{ - for (uint8_t i = 0; i < 5; i++) if (s[i] == b) return 1; - return 0; -} - -/* Автоопределение кодировки дешёвым сканом байтов (до построения индекса). - * BOM → UTF8; иначе валидность UTF-8 (структура multibyte); иначе 8-бит по - * частоте ходовых букв; фолбэк CP866. */ -uint8_t detect_encoding(void) -{ - if (file_size >= 3 && (uint8_t)fb(0) == 0xEF && (uint8_t)fb(1) == 0xBB && (uint8_t)fb(2) == 0xBF) - return ENC_UTF8; - - uint32_t n = file_size; - if (n > 1024u) n = 1024u; /* сэмпл: первый 1 КБ — детекции хватает */ - uint8_t utf_ok = 1, has_mb = 0, has_high = 0, cont = 0; - uint16_t s866 = 0, s1251 = 0, skoi = 0; - - for (uint32_t p = 0; p < n; p++) { - uint8_t b = (uint8_t)fb(p); - if (b < 0x80) { if (cont) { utf_ok = 0; cont = 0; } continue; } - has_high = 1; - if (in_set10(common866, b)) s866++; - if (in_set10(common1251, b)) s1251++; - if (in_set10(commonkoi, b)) skoi++; - if (cont) { - if ((b & 0xC0) == 0x80) cont--; - else { utf_ok = 0; cont = 0; } - } - else if (b >= 0xC2 && b <= 0xDF) { cont = 1; has_mb = 1; } - else if (b >= 0xE0 && b <= 0xEF) { cont = 2; has_mb = 1; } - else if (b >= 0xF0 && b <= 0xF4) { cont = 3; has_mb = 1; } - else utf_ok = 0; /* битый лид/одиночный континюэйшн */ - } - /* Незавершённая multibyte-последовательность на КОНЦЕ — нарушение только - * если это настоящий EOF; на границе сэмпла (n= s866 && s1251 >= skoi) return ENC_CP1251; - if (skoi >= s866) return ENC_KOI8R; - return ENC_CP866; -} - -const char *enc_name(uint8_t enc) -{ - return (enc == ENC_CP1251) ? "CP1251" : - (enc == ENC_KOI8R) ? "KOI8-R" : - (enc == ENC_UTF8) ? "UTF-8 " : "CP866 "; -} - -/* Контентный глиф (ремапим при смене кодировки) vs структурный (рамка/HR/ - * маркеры — уже CP866, не трогаем). Различаем по attr. */ -static uint8_t attr_is_content(uint8_t a) -{ - return (uint8_t)(a != ATTR_BOX && a != ATTR_HR && - a != ATTR_LIST_MARKER && a != ATTR_QUOTE_MARKER); -} - -/* Вывод среза строки кэша с ремапом контентных глифов [128-255] через - * g_remap (CP1251/KOI8). Без активной таблицы — прямой win_rest. */ -void win_rest_remap(uint8_t row, uint8_t w, uint8_t page, uint16_t off) -{ - if (!g_remap || w == 0) { - win_rest(row, 0, 1, w, page, off); - return; - } - uint8_t buf[SCREEN_W * 2]; - bank_read(page, off, buf, (uint16_t)w * 2u); - for (uint8_t i = 0; i < w; i++) { - uint8_t ch = buf[(uint16_t)i * 2u]; - if (ch >= 0x80 && attr_is_content(buf[(uint16_t)i * 2u + 1u])) - buf[(uint16_t)i * 2u] = g_remap[ch - 0x80]; /* таблицы хранят только старшие 128 */ - } - bank_write(g_scratch_phys, 0, buf, (uint16_t)w * 2u); - win_rest(row, 0, 1, w, g_scratch_phys, 0); -} - -/* ========================= UTF-8 → CP866 (Фаза 2) ======================== */ - -/* Кириллица U+0400..U+045F → CP866. Русский набор + Ё/ё и часть украинских - * (Є є Ї ї Ў ў), которые есть в CP866; пропуски → '?' (0x3F). */ -static const uint8_t utf_cyr_to_866[96] = { - /* 0400 */ 0x3F, 0xF0, 0x3F, 0x3F, 0xF2, 0x3F, 0x3F, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0x3F, - /* 0410 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - /* 0420 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, - /* 0430 */ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - /* 0440 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, - /* 0450 */ 0x3F, 0xF1, 0x3F, 0x3F, 0xF3, 0x3F, 0x3F, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0x3F, -}; - -/* Поток вывода конвертера: пишем в utf_phys чанками по странице, буфер в - * near-памяти, флаш через один bank_write (не побайтовый swap W3). */ -static uint8_t conv_buf[256]; -static uint16_t conv_n; /* байт в буфере, ещё не сброшено */ -static uint8_t conv_page; /* индекс текущей страницы в utf_phys */ -static uint16_t conv_off; /* уже сброшенное смещение в этой странице */ - -static void conv_flush(void) -{ - if (conv_n) { - bank_write(utf_phys[conv_page], conv_off, conv_buf, conv_n); - conv_off = (uint16_t)(conv_off + conv_n); - conv_n = 0; - } -} - -/* Добавляет один CP866-байт в выходной поток. Запись никогда не пересекает - * границу страницы (256 делит 16384 нацело). */ -static void conv_put(uint8_t b) -{ - if ((uint16_t)(conv_off + conv_n) == PAGE_SIZE) { /* страница заполнена */ - conv_flush(); - conv_page++; - conv_off = 0; - } - conv_buf[conv_n++] = b; - if (conv_n == (uint16_t)sizeof(conv_buf)) conv_flush(); -} - -/* Подстановки одиночных не-кириллических символов UTF-8 → один CP866-байт. - * Таблица вместо switch (экономия кода); линейный поиск дёшев — вызывается - * лишь при конвертации на редких символьных кодпойнтах. Чтобы добавить новый - * символ — достаточно дописать одну строку {кодпойнт, байт-CP866}. - * (Символы с НЕ-1:1 заменой, напр. … -> "...", обрабатываются отдельно ниже.) */ -typedef struct { uint16_t utf8; uint8_t cp866; } utf_sym_t; -static const utf_sym_t utf_sym[] = { - {0x00A0, 0x20}, {0x00AB, 0x3C}, {0x00BB, 0x3E}, /* nbsp « » → space < > */ - {0x00B0, 0xF8}, {0x00B7, 0xFA}, /* ° · */ - {0x2013, 0x2D}, {0x2014, 0x2D}, /* – — → '-' */ - {0x2018, 0x27}, {0x2019, 0x27}, /* ‘ ’ → '\'' */ - {0x201C, 0x22}, {0x201D, 0x22}, /* “ ” → '"' */ - {0x2022, 0xF9}, {0x2116, 0xFC}, /* • → ∙ № */ - {0x2190, 0x1B}, {0x2191, 0x18}, {0x2192, 0x1A}, {0x2193, 0x19}, /* ← ↑ → ↓ */ - {0x2500, 0xC4}, {0x2502, 0xB3}, {0x250C, 0xDA}, {0x2510, 0xBF}, /* ─ │ ┌ ┐ */ - {0x2514, 0xC0}, {0x2518, 0xD9}, {0x251C, 0xC3}, {0x2524, 0xB4}, /* └ ┘ ├ ┤ */ - {0x252C, 0xC2}, {0x2534, 0xC1}, {0x253C, 0xC5}, /* ┬ ┴ ┼ */ - {0x2580, 0xDF}, {0x2584, 0xDC}, {0x2588, 0xDB}, /* ▀ ▄ █ */ - {0x2591, 0xB0}, {0x2592, 0xB1}, {0x2593, 0xB2}, {0x25A0, 0xFE}, /* ░ ▒ ▓ ■ */ - {0x2713, 0xFB}, {0x2714, 0xFB}, /* ✓ ✔ → галка */ - {0x2715, 0x78}, {0x2717, 0x78}, {0x2718, 0x78}, /* ✕ ✗ ✘ → 'x' */ -}; -#define UTF_SYM_N (uint8_t)(sizeof(utf_sym) / sizeof(utf_sym[0])) - -/* Кодпойнт → ОДИН CP866-глиф: кириллица по таблице, ходовые символы по - * utf_sym[], прочее → '?'. Общая для конвертера и HEX-printable (F4). */ -uint8_t utf_cp_glyph(uint32_t cp) -{ - if (cp < 0x80) return (uint8_t)cp; - if (cp >= 0x0400 && cp <= 0x045F) return utf_cyr_to_866[cp - 0x0400]; - for (uint8_t i = 0; i < UTF_SYM_N; i++) - if (utf_sym[i].utf8 == (uint16_t)cp) return utf_sym[i].cp866; - return '?'; -} - -/* Кодпойнт → CP866-глиф(ы) в поток конвертера. Спецслучаи с НЕ-1:1 заменой - * (… → "...", BOM → ничего) здесь; остальное через utf_cp_glyph(). */ -static void conv_emit_cp(uint32_t cp) -{ - if (cp == 0x2026) { conv_put('.'); conv_put('.'); conv_put('.'); return; } /* … → "..." */ - if (cp == 0xFEFF) return; /* BOM/ZWNBSP — выкинуть */ - conv_put(utf_cp_glyph(cp)); -} - -/* Последовательное чтение байта ОРИГИНАЛА (utf-8) конвертером. Оригинал лежит - * в orig_file_phys[]; мапим его страницу в W3 напрямую, со своей кэш-переменной - * cv_page (отдельной от cur_page индексатора, т.к. оба используют W3 и - * чередуются). На границе с fb()-чтением utf-буфера кэши взаимно сбрасываются. */ -static uint8_t cv_read(uint32_t s) -{ - uint8_t pg = (uint8_t)(s >> PAGE_BITS); - if (pg != cv_page) { sprinter_page_w3(orig_file_phys[pg]); cv_page = pg; } - return *((volatile uint8_t *)(0xC000u + (uint16_t)(s & PAGE_MASK))); -} - -/* Возобновляемая конвертация: дописывает utf_phys из оригинала, пока - * сконвертированных (flushed) байт меньше target и не достигнут конец - * исходника. По выходу file_size = доступная (сконвертированная) часть; при - * достижении конца фиксирует utf_size и снимает g_utf_building. */ -void utf_convert_more(uint32_t target) -{ - cv_page = 0xFF; /* W3 был на utf (fb индексатора) — пере-смаппим orig */ - uint32_t n = orig_file_size; - while (utf_src < n && - (uint32_t)((uint32_t)conv_page * PAGE_SIZE + conv_off) < target) { - uint8_t b = (uint8_t)cv_read(utf_src++); - if (b < 0x80) { - conv_emit_cp(b); - continue; - } - - uint32_t cp; - uint8_t need; - if ((b & 0xE0) == 0xC0) { cp = (uint32_t)(b & 0x1F); need = 1; } - else if ((b & 0xF0) == 0xE0) { cp = (uint32_t)(b & 0x0F); need = 2; } - else if ((b & 0xF8) == 0xF0) { cp = (uint32_t)(b & 0x07); need = 3; } - else { conv_put('?'); continue; } - - uint8_t ok = 1; - for (uint8_t k = 0; k < need; k++) { - if (utf_src >= n) { ok = 0; break; } - uint8_t cb = (uint8_t)cv_read(utf_src); - if ((cb & 0xC0) != 0x80) { ok = 0; break; } - cp = (cp << 6) | (uint32_t)(cb & 0x3F); - utf_src++; - } - if (!ok || need == 3) { conv_put('?'); continue; } - conv_emit_cp(cp); - } - conv_flush(); - file_size = (uint32_t)conv_page * PAGE_SIZE + conv_off; /* доступно индексатору */ - if (utf_src >= n) { utf_size = file_size; g_utf_building = 0; } - cur_page = 0xFF; /* W3 был на orig — fb индексатора пере-смаппит utf */ -} - -/* Выделяет страницы под UTF-8 набор (конвертированный ≤ оригинала по размеру) - * и сбрасывает приватное состояние конвертера в начало (conv-буфер, utf_src, - * g_utf_building). Сама конвертация — инкрементальная, через utf_convert_more(). - * Возврат: 1 — успех, 0 — нет EMM. */ -uint8_t utf_alloc(void) -{ - utf_pages = orig_file_pages; - utf_blk = mem_alloc_pages(utf_pages); - if (utf_blk == 0) return 0; - for (uint8_t i = 0; i < utf_pages; i++) - utf_phys[i] = mem_get_page(utf_blk, i); - conv_n = 0; conv_page = 0; conv_off = 0; /* converter reset (вызывается один раз) */ - utf_src = 0; - g_utf_building = 1; - return 1; -} diff --git a/examples/mdview2/mdview2_help.c b/examples/mdview2/mdview2_help.c deleted file mode 100644 index 3ea3b5c..0000000 --- a/examples/mdview2/mdview2_help.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * mdview2_help.c — диалог справки (F1). - * - * Модальное окно поверх документа: рамка с заголовком, список горячих - * клавиш и поддерживаемых markdown-элементов. Блокирует до нажатия любой - * клавиши, после чего восстанавливает статус-бар, область документа и меню. - * - * Зависимости от ядра (mdview2.c): render_full_status / draw_viewport_from_cache - * / render_menu для восстановления экрана. Текст справки — в CP866. - */ - -#include -#include -#include -#include -#include "mdview2.h" - -/* Геометрия диалога справки (в символьных координатах 80×32). */ -#define HELP_X 8u /* левая граница рамки */ -#define HELP_Y 3u /* верхняя граница рамки */ -#define HELP_W 64u /* ширина рамки (включая │) */ -#define HELP_H 26u /* высота рамки (включая ─) */ - -/* Заполняет одну внутреннюю строку диалога (r=0 — первая строка за рамкой). - * Строка s в кодировке CP866; остаток до края дополняется пробелами. */ -static void help_line(uint8_t r, const char *s, uint8_t attr) -{ - uint8_t x = HELP_X + 1u; - uint8_t y = HELP_Y + 1u + r; - uint8_t len = (uint8_t)strlen(s); - - if (len > HELP_W - 2u) - len = HELP_W - 2u; - - bios_set_place(y, x); - if (len > 0) - bios_writeattr(s, len, attr); - /* place уже продвинут bios_writeattr на len колонок (verified). */ - if (len < HELP_W - 2u) { - bios_fillcharattr(' ', ATTR_HELP_BG, (uint8_t)(HELP_W - 2u - len)); - } -} - -void show_help(void) -{ - /* " Помощь " в CP866 (8 байт) */ - static const char title[] = " \x8F\xAE\xAC\xAE\xE9\xEC "; - uint8_t tlen = 8u; - uint8_t lft = (uint8_t)((HELP_W - 2u - tlen) / 2u); /* = 27 */ - uint8_t rgt = (uint8_t)(HELP_W - 2u - tlen - lft); - /* Верхняя граница рамки с заголовком по центру. - * place продвигается каждым BIOS-вызовом (verified), поэтому - * достаточно одной установки места на всю строку рамки. */ - wrchar(HELP_X, HELP_Y, 0xDA, ATTR_HELP_BDR); /* ┌ */ - bios_set_place(HELP_Y, (uint8_t)(HELP_X + 1u)); - if (lft > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, lft); - if (tlen > 0) bios_writeattr(title, tlen, ATTR_HELP_TIT); - if (rgt > 0) bios_fillcharattr(0xC4, ATTR_HELP_BDR, rgt); - wrchar(HELP_X + HELP_W - 1u, HELP_Y, 0xBF, ATTR_HELP_BDR); /* ┐ */ - - /* Боковые границы (левый и правый │ для каждой строки тела) */ - for (uint8_t r = 1u; r < HELP_H - 1u; r++) { - wrchar(HELP_X, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - wrchar(HELP_X + HELP_W - 1u, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */ - } - - /* Нижняя граница рамки */ - wrchar(HELP_X, HELP_Y + HELP_H - 1u, 0xC0, ATTR_HELP_BDR); /* └ */ - bios_set_place((uint8_t)(HELP_Y + HELP_H - 1u), (uint8_t)(HELP_X + 1u)); - bios_fillcharattr(0xC4, ATTR_HELP_BDR, (uint8_t)(HELP_W - 2u)); - wrchar(HELP_X + HELP_W - 1u, HELP_Y + HELP_H - 1u, 0xD9, ATTR_HELP_BDR); /* ┘ */ - - /* Содержимое (20 внутренних строк) */ - uint8_t r = 0; - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " MDView v1.0 (b3) -- Markdown Viewer for Sprinter", ATTR_HELP_HDR); - help_line(r++, " (c) 2026 \x8F\xA5\xE2\xE0\xAE\xA2 \x80\x2E\x83\x2E", - ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Navigation:", ATTR_HELP_HDR); - help_line(r++, " \x18 \x19 Scroll one line up / down", ATTR_HELP_BG); - help_line(r++, " PgUp PgDn Scroll one page up / down", ATTR_HELP_BG); - help_line(r++, " Home End Jump to beginning / end of document", ATTR_HELP_BG); - help_line(r++, " \x1B \x1A Horizontal pan (code blocks/tables/unwrap)", ATTR_HELP_BG); - help_line(r++, " Esc F10 Exit", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Markdown elements:", ATTR_HELP_HDR); - help_line(r++, " # ## ### Headings H1-H6, **bold**, *italic*,", ATTR_HELP_BG); - help_line(r++, " `code`, ``` code ```, ~~strike~~, > quote", ATTR_HELP_BG); - help_line(r++, " - * + 1. 2. Ordered list, |----|----| Tables", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " Encoding and View modes:", ATTR_HELP_HDR); - help_line(r++, " F2 RAW Mode", ATTR_HELP_BG); - help_line(r++, " F3 Wrap/Unwrap Mode for RAW View", ATTR_HELP_BG); - help_line(r++, " F4 HEX Mode (dump of original file)", ATTR_HELP_BG); - help_line(r++, " F8 Cycle CP866 / CP1251 / KOI8-R / UTF-8", ATTR_HELP_BG); - help_line(r++, " Auto-detected on open; F8 to override", ATTR_HELP_BG); - help_line(r++, "", ATTR_HELP_BG); - help_line(r++, " File size: up to 256 KB (EMM). Lines: up to 18432.", ATTR_HELP_BG); - - (void)getkey(); - - render_full_status(); - draw_viewport_from_cache(); - render_menu(); -} diff --git a/examples/mdview2/mdview2_hex.c b/examples/mdview2/mdview2_hex.c deleted file mode 100644 index c1eb72e..0000000 --- a/examples/mdview2/mdview2_hex.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - * mdview2_hex.c — HEX-дамп ОРИГИНАЛЬНОГО файла (F4). - * - * Показывает исходные байты файла (orig_file_phys), а не активный буфер: - * hex-дамп декодированного UTF-набора был бы искажением. Printable-колонка - * интерпретируется ТЕКУЩЕЙ кодировкой: CP866 как есть, CP1251/KOI8 через - * g_remap, UTF-8 — глиф на позиции лид-байта (continuation-байты → '.'). - * - * Формат ряда (79 колонок, один атрибут ATTR_TEXT — как RAW): - * 0x012340 │ XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX │ 16 символов - * - * Ряд выровнен на 16 байт и никогда не пересекает границу EMM-страницы - * (16 делит 16384 нацело) — один bank_read на ряд, fb()/W3-маппинг не нужны. - * Позиция (hex_top) живёт в байтах ОРИГИНАЛА; конвертацию в/из байт-позиции - * активного буфера делает ядро (view_pos/view_reanchor через map_off). - */ - -#include -#include -#include -#include -#include /* bank_read (чтение оригинала по страницам EMM) */ -#include "mdview2.h" - -#if WITH_HEX /* весь модуль опционален (mdview2_conf.h); при 0 пустой объектник */ - -#define HEX_BPR 16u /* байт на ряд */ -#define HEX_SPAN ((uint32_t)(VIEW_H - 1) * HEX_BPR) - -/* Геометрия ряда (колонки). */ -#define HX_OFF 1u /* "0x012340" */ -#define HX_SEP1 10u /* │ */ -#define HX_DUMP 12u /* пары hex-цифр */ -#define HX_SEP2 61u /* │ */ -#define HX_PRINT 63u /* printable */ - -static uint32_t hex_top; /* offset верхнего ряда (кратен 16) */ - -uint32_t hex_pos(void) { return hex_top; } - -/* Максимальный hex_top: последний ряд файла на нижней строке экрана. */ -static uint32_t hex_max_top(void) -{ - uint32_t last = (orig_file_size == 0) ? 0 - : ((orig_file_size - 1u) & ~(uint32_t)(HEX_BPR - 1u)); - return (last > HEX_SPAN) ? (last - HEX_SPAN) : 0; -} - -void hex_reanchor(uint32_t orig_off) -{ - uint32_t mt = hex_max_top(); - orig_off &= ~(uint32_t)(HEX_BPR - 1u); - hex_top = (orig_off > mt) ? mt : orig_off; -} - -void hex_screen_init(void) -{ - bios_clearwin(VIEW_TOP_ROW, 0, VIEW_H, SCREEN_W, ATTR_TEXT); -} - -/* ---- отрисовка ----------------------------------------------------- */ - -static uint8_t hexdig(uint8_t v) -{ - v &= 15u; - return (uint8_t)((v < 10u) ? ('0' + v) : ('A' - 10 + v)); -} - -/* Один байт оригинала (для UTF-lookahead за границей ряда — редкий путь). */ -static uint8_t fbo(uint32_t off) -{ - uint8_t b; - bank_read(orig_file_phys[off >> PAGE_BITS], (uint16_t)(off & PAGE_MASK), &b, 1); - return b; -} - -/* Printable-глиф для n байт ряда b[] (off — offset b[0] в файле) → out[]. */ -static void hex_print_cells(const uint8_t *b, uint32_t off, uint8_t n, uint8_t *out) -{ - for (uint8_t i = 0; i < n; i++) { - uint8_t c = b[i]; - uint8_t g; - if (c < 0x20u) { - g = '.'; - } else if (c < 0x80u || g_encoding != ENC_UTF8) { - g = (uint8_t)((c >= 0x80u && g_remap) ? g_remap[c - 0x80u] : c); - } else if ((c & 0xC0u) == 0x80u) { - g = '.'; /* continuation-байт */ - } else { - /* Лид-байт: собрать кодпойнт (хвост может выйти за ряд → fbo). - * 4-байтовые (за пределами CP866) и битые последовательности → '.'. */ - uint32_t cp; - uint8_t need, ok = 1; - if ((c & 0xE0u) == 0xC0u) { cp = (uint32_t)(c & 0x1Fu); need = 1; } - else if ((c & 0xF0u) == 0xE0u) { cp = (uint32_t)(c & 0x0Fu); need = 2; } - else { out[i] = '.'; continue; } - for (uint8_t k = 1; k <= need; k++) { - uint32_t p = off + i + k; - if (p >= orig_file_size) { ok = 0; break; } - uint8_t cb = (uint8_t)((i + k < n) ? b[i + k] : fbo(p)); - if ((cb & 0xC0u) != 0x80u) { ok = 0; break; } - cp = (cp << 6) | (uint32_t)(cb & 0x3Fu); - } - g = ok ? utf_cp_glyph(cp) : '.'; - if (g < 0x20u) g = '.'; /* overlong мог дать управляющий */ - } - out[i] = g; - } -} - -static uint8_t hex_line[SCREEN_W]; /* собранный ряд (только символы, единый attr) */ - -static void hex_draw_row(uint32_t off, uint8_t row) -{ - uint8_t buf[HEX_BPR]; - uint8_t n = 0; - - memset(hex_line, ' ', SCREEN_W); - if (off < orig_file_size) { - uint32_t rem = orig_file_size - off; - n = (rem >= HEX_BPR) ? (uint8_t)HEX_BPR : (uint8_t)rem; - bank_read(orig_file_phys[off >> PAGE_BITS], (uint16_t)(off & PAGE_MASK), buf, n); - } - if (n) { /* ряды за EOF — пустые */ - hex_line[HX_OFF] = '0'; - hex_line[HX_OFF + 1] = 'x'; - hex_line[HX_OFF + 2] = hexdig((uint8_t)(off >> 20)); - hex_line[HX_OFF + 3] = hexdig((uint8_t)(off >> 16)); - hex_line[HX_OFF + 4] = hexdig((uint8_t)(off >> 12)); - hex_line[HX_OFF + 5] = hexdig((uint8_t)(off >> 8)); - hex_line[HX_OFF + 6] = hexdig((uint8_t)(off >> 4)); - hex_line[HX_OFF + 7] = hexdig((uint8_t)off); - hex_line[HX_SEP1] = TBL_V; - for (uint8_t i = 0; i < n; i++) { - uint8_t x = (uint8_t)(HX_DUMP + i * 3u + ((i >= 8u) ? 1u : 0u)); - hex_line[x] = hexdig((uint8_t)(buf[i] >> 4)); - hex_line[x + 1] = hexdig(buf[i]); - } - hex_line[HX_SEP2] = TBL_V; - hex_print_cells(buf, off, n, hex_line + HX_PRINT); - } - bios_set_place(row, 0); - bios_write_until((const char *)hex_line, SCREEN_W, 0); -} - -void hex_draw(void) -{ - uint32_t off = hex_top; - for (uint8_t r = 0; r < VIEW_H; r++) { - hex_draw_row(off, (uint8_t)(VIEW_TOP_ROW + r)); - off += HEX_BPR; - } -} - -/* ---- статус-бар: % по байтам (как calc_raw_pct) --------------------- */ - -static uint8_t calc_hex_pct(void) -{ - return pct16((uint16_t)(hex_top >> 8), (uint16_t)(orig_file_size >> 8)); -} - -/* ---- навигация (вызывается из главного цикла при g_view == VIEW_HEX) */ - -uint8_t hex_key(uint8_t scan) -{ - uint32_t mt = hex_max_top(); - switch (scan) { - /* Одна строка — аппаратный скролл окна + подрисовка одного ряда - * (как в MD/RAW), без перерисовки всего экрана. */ - case KEY_DOWN: - if (hex_top < mt) { - hex_top += HEX_BPR; - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); /* содержимое вверх */ - hex_draw_row(hex_top + HEX_SPAN, (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); - } - break; - case KEY_UP: - if (hex_top) { - hex_top -= HEX_BPR; - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); /* содержимое вниз */ - hex_draw_row(hex_top, VIEW_TOP_ROW); - } - break; - case KEY_PGDN: { - uint32_t nt = hex_top + (uint32_t)VIEW_H * HEX_BPR; - if (nt > mt) nt = mt; - if (nt != hex_top) { hex_top = nt; hex_draw(); } - break; - } - case KEY_PGUP: { - uint32_t d = (uint32_t)VIEW_H * HEX_BPR; - uint32_t nt = (hex_top >= d) ? hex_top - d : 0; - if (nt != hex_top) { hex_top = nt; hex_draw(); } - break; - } - case KEY_HOME: - if (hex_top) { hex_top = 0; hex_draw(); } - break; - case KEY_END: - if (hex_top != mt) { hex_top = mt; hex_draw(); } - break; - default: - return 0; /* не наша клавиша */ - } - render_percent_progress(calc_hex_pct()); - return 1; -} - -#endif /* WITH_HEX */ diff --git a/examples/mdview2/mdview2_index.c b/examples/mdview2/mdview2_index.c deleted file mode 100644 index 2740fbb..0000000 --- a/examples/mdview2/mdview2_index.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* - * mdview2_index.c — парсер/индексатор markdown (сердце приложения). - * - * Единственный проход по исходному файлу (index_begin/index_step): классификация строк - * (classify_line, is_*_raw), сборка абзацев с переносом (scan_join_stream), - * inline-разметка (inline_marker/inline_scan) и эмиссия готовых (char,attr)- - * ячеек в рендер-кэш (gc_put → seg_commit_cells → cache_*). Ведёт индекс - * сегментов в EMM (idx_get/idx_put) и докручивает UTF-конвертацию впереди - * позиции чтения. Разделяемые символы и API — в mdview2.h. - * - * Приватно (не торчит в .h): idx_rec_t, cur_rec/cur_seg_off, буфер ячеек - * g_cells, idx_get/idx_put и все классификаторы/сканеры. - */ - -#include -#include -#include /* COLOR()/COLOR_* для ATTR_* в сканерах */ -#include -#include /* bank_read/bank_write (idx_get/idx_put) */ -#include "mdview2.h" - -static uint8_t emph_to_attr(uint8_t emph, uint8_t base_attr); /* forward (нужна в inline-сканере) */ -static uint8_t is_hr_raw(uint32_t p); /* forward (нужна в classify_line) */ - -/* Начало следующей физической строки (байт после '\n', либо file_size). */ -static uint32_t next_line(uint32_t p) -{ - p = row_end(p); - return (p < file_size) ? p + 1 : p; -} - -typedef struct idx_rec_s { - uint32_t off; /* смещение первого байта исходного текста для сегмента */ - uint8_t flags; /* битовые флаги IF_* ниже */ - uint8_t style; /* начальный стиль INIT_STYLE_* в начале сегмента */ - uint8_t pad0; /* добивка до 8 байт (2048 записей на страницу 16 КБ) */ - uint8_t pad1; -} idx_rec_t; - -#define INDEX_REC_SIZE 8u - -static uint32_t cur_seg_off; /* смещение последнего emit_seg (кэш в near-памяти) */ -static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */ - -/* Для проверки границ выделения считаем пробел/таб/конец строки/0 пробельными. */ -static uint8_t ws_or_eol(char c) -{ - return (uint8_t)(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -static uint8_t ws_or_eol_or_delim(char c) -{ - return (uint8_t)(c == ' ' || c == ',' || c == '.' || c == '!' || c == '?' || c == ':' || c == ';' || c == '/' - || c == '\t' || c == '\n' || c == '\r' || c == 0); -} - -/* Маркер inline-выделения (*, **, _) распознаётся только если - * пробельная граница есть ровно с одной стороны (XOR-правило). - * Это защищает выражения вроде "2 * 3", "2 ** 3" и внутрисловные - * случаи (например COLOR_YELLOW) от ложного форматирования. */ -static uint8_t is_emph_flanked(char prev_ch, char next_ch) -{ - return (uint8_t)(ws_or_eol(prev_ch) != ws_or_eol_or_delim(next_ch)); -} - -/* Символ можно экранировать обратным слешем (\X): любая печатная ASCII- - * пунктуация (как в CommonMark). \* \_ \` \[ и т.п. → литерал X. */ -static uint8_t is_escapable(char c) -{ - return (uint8_t)(c >= '!' && c <= '~' && - !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))); -} - -/* Типы сегмента CK_* и стили INIT_STYLE_* — в mdview2.h (общие с таблицами). */ - -/* Доступ к индексу в EMM. - * Размер записи 8 байт, поэтому запись не пересекает границу страницы - * и bank_read/bank_write работают с цельным блоком. */ -static void idx_get(uint16_t idx, idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); /* номер страницы: idx / 2048 */ - uint16_t off = (uint16_t)((idx & 2047u) << 3); /* смещение записи: (idx % 2048) * 8 */ - bank_read(index_phys[page], off, r, INDEX_REC_SIZE); -} - -static void idx_put(uint16_t idx, const idx_rec_t *r) -{ - uint8_t page = (uint8_t)(idx >> 11); - uint16_t off = (uint16_t)((idx & 2047u) << 3); - bank_write(index_phys[page], off, r, INDEX_REC_SIZE); -} - -uint32_t seg_off(uint16_t idx) -{ - idx_rec_t r; - if (idx >= n_lines) return file_size; - idx_get(idx, &r); - return r.off; -} - -/* Последняя строка индекса с исходным offset <= off — обратный перевод - * байт-позиции в MD-строку (позиционирование при F2/F8). Оффсеты сегментов - * монотонны, поэтому бинарный поиск (~15 bank-чтений). */ -uint16_t line_at_off(uint32_t off) -{ - uint16_t lo = 0, hi = n_lines; - while (lo < hi) { - uint16_t mid = (uint16_t)((lo + hi) >> 1); - if (seg_off(mid) <= off) lo = (uint16_t)(mid + 1); - else hi = mid; - } - return (lo > 0) ? (uint16_t)(lo - 1) : 0; -} - -/* Установка флагов (маска IF_*) всегда идёт в последний emit_seg (n_lines-1). - * Используется near-копия cur_rec, чтобы не делать обратное чтение из банка. */ -static void set_cur_flags(uint8_t f) { cur_rec.flags |= f; idx_put((uint16_t)(n_lines - 1), &cur_rec); } - -/* ================================================================== - * Индексация строк - * ================================================================== */ - -/* INIT_STYLE_* — в mdview2.h (общие с модулем таблиц). */ - -/* Тип строки, который возвращает classify_line(). */ -#define LK_PLAIN 0 -#define LK_H1 1 -#define LK_H2 2 -#define LK_H3 3 -#define LK_H4 4 /* также используется для H5/H6 */ -#define LK_HR 5 -#define LK_ULIST 6 /* маркер ненумерованного списка */ -#define LK_OLIST 7 /* маркер нумерованного списка */ -#define LK_QUOTE 8 /* маркер цитаты */ - -/* Классифицирует логическую строку. - * - Заголовки: 1..4 символа '#' и затем пробел/таб (H5/H6 сводятся к H4). - * - Горизонтальная линия: только '-', '*' или '_' (одного вида, >=3), - * возможно с пробелами/табами между символами. - * - Ненумерованный список: "- ", "* " или "+ " перед содержимым. - * - Нумерованный список: цифры + '.'/ ')' + пробел. - * - Цитата: '>' с опциональным пробелом. - * - Иначе обычный текст. - * Для заголовков/списков/цитат out_content указывает на первый байт - * содержимого после маркера и завершающего пробела. */ -static uint8_t classify_line(uint32_t p_start, uint32_t *out_content) -{ - if (p_start >= file_size) return LK_PLAIN; - - char c0 = fb(p_start); - - /* Заголовок? */ - if (c0 == '#') { - uint8_t lvl = 0; - uint32_t p = p_start; - while (p < file_size && fb(p) == '#' && lvl < 6) { - lvl++; p++; - } - if (p < file_size) { - char ch = fb(p); - if (ch == ' ' || ch == '\t') { - p++; - *out_content = p; - if (lvl > 4) lvl = 4; - return lvl; /* LK_H1 .. LK_H4 */ - } - } - /* Символ '#' без пробела после него не считается заголовком. */ - } - - /* Горизонтальный разделитель. - * Проверяется до списков, чтобы `- - -` не стало маркером списка. */ - if (is_hr_raw(p_start)) return LK_HR; - - /* Для списков/цитат дополнительно допускаем ведущие пробелы - * (базовая поддержка вложенности). */ - uint32_t lp = p_start; - while (lp < file_size && fb(lp) == ' ') lp++; - char cl = (lp < file_size) ? fb(lp) : 0; - - /* Ненумерованный список? */ - if ((cl == '-' || cl == '*' || cl == '+') && - (lp + 1) < file_size && - fb(lp + 1) == ' ') { - *out_content = lp + 2; - return LK_ULIST; - } - - /* Нумерованный список? */ - if (cl >= '0' && cl <= '9') { - uint32_t p = lp; - while (p < file_size) { - char ch = fb(p); - if (ch < '0' || ch > '9') break; - p++; - } - if (p < file_size) { - char ch = fb(p); - if ((ch == '.' || ch == ')') && - (p + 1) < file_size && fb(p + 1) == ' ') { - *out_content = p + 2; - return LK_OLIST; - } - } - } - - /* Цитата? */ - if (cl == '>') { - uint32_t p = lp + 1; - if (p < file_size && fb(p) == ' ') p++; - *out_content = p; - return LK_QUOTE; - } - - return LK_PLAIN; -} - -/* Возвращает видимую ширину префикса (отступ + маркер) в колонках. */ -static uint8_t marker_visible_col(uint8_t kind, uint32_t p_start, uint32_t content_off) -{ - switch (kind) { - case LK_ULIST: - case LK_QUOTE: - case LK_OLIST: return (uint8_t)(content_off - p_start); - default: return 0; /* plain/headers спец-префикса не имеют */ - } -} - -/* ================== Merge: сборка ячеек на этапе индекс-скана ============== - * Форвард-сканер (scan_join_stream/inline_scan + прямые emit'ы в index_lines) - * собирает готовые (char,attr)-ячейки в g_cells ПО ХОДУ единственного прохода - * по файлу — без отдельного второго скана. На каждом emit_seg ячейки - * ПРЕДЫДУЩего сегмента флашатся в кэш (lag-1: к этому моменту сегмент уже - * полностью просканирован); последний сегмент флашится после цикла index_lines. - * g_ncells_at_space — снимок длины на последнем пробеле для усечения буфера - * при переносе строки (отбрасываем уехавшее за границу слово). */ -static uint8_t g_cells[MAX_CACHE_LINE_LEN * 2]; -uint8_t g_ncells; /* ячеек в текущем сегменте (общий с таблицами) */ -static uint8_t g_ncells_at_space; /* снимок g_ncells на последнем пробеле (для усечения при переносе) */ -static uint8_t g_skip_flush; /* следующий emit_seg пропустит lag-флаш (pending уже зафлашен вручную, напр. перед таблицей) */ - -/* Обрыв индексации: причина (0 / TRUNC_CONTENT / TRUNC_LINES) и строка, на - * которой упёрлись. Выставляются ОДИН раз (первая причина побеждает); по ним - * index_lines() в конце пишет строку-сообщение (IF_TRUNC_MSG, рисуется вживую). */ -static uint8_t g_trunc_cause; -static uint16_t g_trunc_line; - -/* Пишет одну (char,attr)-ячейку в g_cells, молча игнорируя переполнение - * MAX_CACHE_LINE_LEN. Оставлена ФУНКЦИЕЙ намеренно: инлайн в сильно - * регистро-нагруженный скан-цикл на Z80/SDCC увеличивает спиллы и замедляет - * (проверено замером — макро-инлайн дал регрессию ~11→13с). */ -void gc_put(char ch, uint8_t attr) -{ - if (g_ncells < MAX_CACHE_LINE_LEN) { - uint16_t i = (uint16_t)g_ncells * 2u; - g_cells[i] = (uint8_t)ch; - g_cells[i + 1] = attr; - g_ncells++; - } -} -void gc_fill(char ch, uint8_t attr, uint8_t n) { while (n-- > 0) gc_put(ch, attr); } - -/* Пишет g_cells как контент кэша для line_idx: flags берём из idx-записи, - * пустой буфер/blank → len 0; иначе резервируем место в пуле и коммитим. */ -static void seg_commit_cells(uint16_t line_idx) -{ - cache_rec_t out_rec; - out_rec.flags = 0; out_rec.reserved = 0; out_rec.pad[0] = 0; out_rec.pad[1] = 0; - idx_rec_t r; - uint8_t have = (uint8_t)(line_idx < n_lines); - if (have) { idx_get(line_idx, &r); out_rec.flags = r.flags; } - if (!have || (r.flags & IF_BLANK) || g_ncells == 0) { - out_rec.page = 0; out_rec.off = 0; out_rec.len = 0; - cache_dir_put(line_idx, &out_rec); - return; - } - out_rec.len = g_ncells; - if (cache_reserve((uint16_t)(g_ncells * 2u), &out_rec.page, &out_rec.off)) { - cache_commit(out_rec.page, out_rec.off, g_cells, (uint16_t)(g_ncells * 2u)); - } else { - /* Контент-кэш исчерпан: фиксируем причину и строку обрыва (один раз). - * index_lines() оборвёт цикл и перезапишет эту строку сообщением. */ - if (!g_trunc_cause) { g_trunc_cause = TRUNC_CONTENT; g_trunc_line = line_idx; } - out_rec.page = 0; out_rec.off = 0; out_rec.len = 0; - } - cache_dir_put(line_idx, &out_rec); -} - - -static void emit_seg(uint32_t off, uint8_t style, uint8_t ckind, uint8_t cont) -{ - (void)ckind; /* тип сегмента восстанавливается флагами idx-записи */ - if (n_lines >= max_lines) { - index_truncated = 1; - if (!g_trunc_cause) { g_trunc_cause = TRUNC_LINES; g_trunc_line = (uint16_t)(max_lines - 1); } - return; - } - cur_rec.off = off; - cur_rec.flags = (uint8_t)(cont ? IF_CONT : 0); - cur_rec.style = (uint8_t)(style & 7u); - cur_rec.pad0 = 0; - cur_rec.pad1 = 0; - idx_put(n_lines, &cur_rec); - cur_seg_off = off; - n_lines++; - /* Флаш ячеек ПРЕДЫДУЩего сегмента (lag-1): он полностью собран форвард-сканером. */ - if (n_lines >= 2) { - if (g_skip_flush) g_skip_flush = 0; /* pending уже зафлашен вручную */ - else seg_commit_cells((uint16_t)(n_lines - 2)); - } - g_ncells = 0; /* буфер ячеек под новый сегмент */ - g_ncells_at_space = 0; -} - -/* Проверяет, что физическая строка пуста (только пробелы/таб + перевод строки). */ -static uint8_t is_line_blank(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == '\n') return 1; - if (c != ' ' && c != '\t') return 0; - p++; - } - return 1; -} - -/* Число ведущих пробелов строки (отступ). Используется для отделения - * dedent-пунктов списка (#3) и для отступа обычного абзаца (#4). */ -static uint8_t leading_spaces(uint32_t p) -{ - uint8_t n = 0; - while (p < file_size && fb(p) == ' ' && n < 250) { n++; p++; } - return n; -} - -/* Быстрая проверка границы fenced-блока по маркеру ``` . - * Ведущие пробелы/табы пропускаются — fence может быть с отступом - * (например, ``` ```c ``` внутри элемента списка с отступом 2+ пробела). - * Язык после бэктиков (```c, ```sh) игнорируется: достаточно трёх ` подряд. */ -static uint8_t is_fence_raw(uint32_t p) -{ - while (p < file_size && (fb(p) == ' ' || fb(p) == '\t')) p++; - if (p + 2 >= file_size) return 0; - return (fb(p) == '`' && fb(p + 1) == '`' && fb(p + 2) == '`'); -} - -/* Быстрая проверка горизонтального разделителя (`---`, `***`, `___`). */ -static uint8_t is_hr_raw(uint32_t p) -{ - char c0 = fb(p); - if (c0 != '-' && c0 != '*' && c0 != '_') return 0; - char marker = 0; - uint8_t count = 0, ok = 1; - uint32_t hr_p = p; - while (hr_p < file_size) { - char ch = fb(hr_p++); - if (ch == '\n' || ch == '\r') break; - if (ch == ' ' || ch == '\t') continue; - if (ch != '-' && ch != '*' && ch != '_') { ok = 0; break; } - if (marker == 0) marker = ch; - else if (ch != marker) { ok = 0; break; } - count++; - } - return ok && count >= 3; -} - -/* Строка таблицы: первый непустой символ — '|'. - * Ведущие пробелы разрешены; такие строки не склеиваются и не переносятся. */ -static uint8_t is_table_raw(uint32_t p) -{ - while (p < file_size) { - char c = fb(p); - if (c == ' ' || c == '\t') { p++; continue; } - return (uint8_t)(c == '|'); - } - return 0; -} - -/* Разбор одного inline-МАРКЕРА в позиции *pq (< bound): \X, [x], `, **, ~~, - * *, _, \t. Общий код для inline_scan() и scan_join_stream(). Возврат: 1 — - * маркер обработан (вызывающий делает continue), 0 — символ обычный (пробел/ - * текст), его кладёт сам вызывающий (и проверяет перенос). Меняет - * *pq/*pls/*pseg/*pprev. attr берётся как emph_to_attr(line_style, base) — - * для join base=ATTR_TEXT (атрибут «обычного» текста). */ -static uint8_t inline_marker(uint32_t *pq, uint32_t bound, uint8_t *pls, - uint8_t *pseg, char *pprev, uint8_t base) -{ - uint32_t q = *pq; - uint8_t ls = *pls; - char ch = fb(q); - uint8_t at = emph_to_attr(ls, base); /* атрибут литералов текущего стиля */ - - if (ls != INIT_STYLE_CODE && ch == '\\' && (q + 1) < bound && is_escapable(fb(q + 1))) { - char nb = fb(q + 1); - gc_put(nb, at); - *pseg += 1; *pq = q + 2; *pprev = nb; return 1; - } - if (ls != INIT_STYLE_CODE && ch == '[' && (q + 2) < bound && fb(q + 2) == ']') { - gc_put('[', ATTR_TEXT_BOLD); gc_put(fb(q + 1), ATTR_TEXT_BOLD); gc_put(']', ATTR_TEXT_BOLD); - *pseg += 3; *pq = q + 3; *pprev = ']'; return 1; - } - if (ch == '`') { - if (ls == INIT_STYLE_PLAIN) { *pls = INIT_STYLE_CODE; *pq = q + 1; return 1; } - if (ls == INIT_STYLE_CODE) { *pls = INIT_STYLE_PLAIN; *pq = q + 1; return 1; } - gc_put('`', at); *pseg += 1; *pq = q + 1; *pprev = '`'; return 1; - } - if (ch == '*' && (q + 1) < bound && fb(q + 1) == '*') { - char nx = ((q + 2) < bound) ? fb(q + 2) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = INIT_STYLE_BOLD; *pq = q + 2; return 1; } - if (ls == INIT_STYLE_BOLD && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 2; return 1; } - } - gc_put('*', at); gc_put('*', at); - *pseg += 2; *pq = q + 2; *pprev = '*'; return 1; - } - if (ch == '~' && (q + 1) < bound && fb(q + 1) == '~') { - char nx = ((q + 2) < bound) ? fb(q + 2) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = INIT_STYLE_STRIKE; *pq = q + 2; return 1; } - if (ls == INIT_STYLE_STRIKE && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 2; return 1; } - } - gc_put('~', at); gc_put('~', at); - *pseg += 2; *pq = q + 2; *pprev = '~'; return 1; - } - if (ch == '*' || ch == '_') { - char nx = ((q + 1) < bound) ? fb(q + 1) : '\n'; - if (is_emph_flanked(*pprev, nx)) { - uint8_t ns = (ch == '*') ? INIT_STYLE_ITALIC : INIT_STYLE_UNDER; - if (ls == INIT_STYLE_PLAIN && ws_or_eol(*pprev)) { *pls = ns; *pq = q + 1; return 1; } - if (ls != INIT_STYLE_PLAIN && ws_or_eol_or_delim(nx)) { *pls = INIT_STYLE_PLAIN; *pq = q + 1; return 1; } - } - gc_put(ch, at); *pseg += 1; *pq = q + 1; *pprev = ch; return 1; - } - if (ch == '\t') { - uint8_t old_sc = *pseg; - uint8_t tgt_full = (uint8_t)((old_sc & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - uint8_t tgt = tgt_full; if (tgt > SCREEN_W) tgt = SCREEN_W; - gc_fill(' ', at, (uint8_t)(tgt_full - old_sc)); - *pseg = tgt; *pq = q + 1; *pprev = ' '; return 1; - } - return 0; /* пробел или обычный символ — обрабатывает вызывающий */ -} - -#define JOIN_MODE_NONE 0u -#define JOIN_MODE_LIST 1u -#define JOIN_MODE_QUOTE 2u -#define JOIN_MODE_PLAIN 3u - -/* ================== Единый сканер сегмента ================================ - * Общий цикл inline-форматирования, переносов и (в join-режимах) склейки - * физических строк — бывшие inline_scan + scan_join_stream. mode: - * JOIN_MODE_NONE — сканировать РОВНО [q, bound) без склейки; '\n' в - * диапазоне не ожидается (вызывающие дают строку/ячейку до EOL); - * активны base_attr (title-attr заголовка) и nowrap (замер таблиц); - * ckind всегда CK_OTHER (continuation-префикс не эмитится). - * JOIN_MODE_LIST/QUOTE/PLAIN — правила '\n'-склейки; bound == file_size, - * base_attr == ATTR_TEXT (emph_to_attr(ls, ATTR_TEXT) тождественно - * бывшему styles_map[ls]), nowrap == 0. - * Возвращает позицию останова; итоговый стиль — через *io_line_style. */ -static uint32_t scan_stream(uint32_t q, uint32_t bound, uint32_t para_start, - uint8_t col, uint8_t ckind, uint8_t *io_line_style, - uint8_t base_attr, uint8_t nowrap, uint8_t mode) -{ - uint32_t last_space = 0xFFFFFFFFu; - uint8_t last_space_style = *io_line_style; /* снимок line_style на момент last_space */ - char prev_ch = ' '; - uint8_t seg_col = col; - uint8_t line_style = *io_line_style; - /* base — атрибут «обычного» текста сегмента. Для заголовка первый сегмент - * имеет title-attr, а continuation-сегменты render рисует как PLAIN — - * переключаем base после 1-го переноса (в join-режимах base == ATTR_TEXT - * и присваивание ничего не меняет). */ - uint8_t base = base_attr; - - while (q < bound && n_lines < max_lines) { - char ch = fb(q); - uint8_t soft_break = 0; - - if (ch == '\n') { - uint32_t next = q + 1; - if (mode == JOIN_MODE_NONE) break; /* NONE: '\n' в [q,bound) не ожидается */ - if (next >= bound) break; - - if (mode == JOIN_MODE_LIST) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind == LK_ULIST || next_kind == LK_OLIST || - next_kind == LK_QUOTE || - (next_kind >= LK_H1 && next_kind <= LK_H4) || - next_kind == LK_HR) { - break; - } - } - while (next < bound) { - char ws = fb(next); - if (ws == ' ' || ws == '\t') next++; - else break; - } - q = next; - soft_break = 1; - ch = ' '; - } else if (mode == JOIN_MODE_QUOTE) { - if (is_line_blank(next)) break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - - { - uint32_t next_content = next; - uint8_t next_kind = classify_line(next, &next_content); - if (next_kind != LK_QUOTE) break; - - { - uint32_t next_line_end = row_end(next_content); - - { - uint8_t empty_quote = 1; - for (uint32_t z = next_content; z < next_line_end; z++) { - char c = fb(z); - if (c != ' ' && c != '\t') { empty_quote = 0; break; } - } - if (empty_quote) break; - } - - { - uint32_t t = next_content; - while (t < next_line_end && (fb(t) == ' ' || fb(t) == '\t')) t++; - if (t < next_line_end && fb(t) == '>') break; - } - - while (next_content < next_line_end) { - char ws = fb(next_content); - if (ws == ' ' || ws == '\t') next_content++; - else break; - } - if (next_content < next_line_end && fb(next_content) == '>') { - next_content++; - if (next_content < next_line_end && fb(next_content) == ' ') next_content++; - } - q = next_content; - soft_break = 1; - ch = ' '; - } - } - } else { /* JOIN_MODE_PLAIN */ - if (fb(next) == '\n') break; - if (is_fence_raw(next) || is_hr_raw(next) || is_table_raw(next)) break; - { - uint32_t dummy; - if (classify_line(next, &dummy) != LK_PLAIN) break; - } - if (is_line_blank(next)) break; - - { - uint8_t is_hard = 0; - if (q >= para_start + 1) { - char b1 = fb(q - 1); - if (b1 == '\\') { - is_hard = 1; - } else if (q >= para_start + 2) { - char b2 = fb(q - 2); - if ((b1 == ' ' || b1 == '\t') && (b2 == ' ' || b2 == '\t')) - is_hard = 1; - } - } - if (is_hard) { - q++; - emit_seg(q, line_style, ckind, 0); - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - seg_col = col; - continue; - } - } - - q++; - /* как render: пропускаем ведущие пробелы/табы строки-продолжения, - * склейка даёт РОВНО один пробел (иначе merge эмитит отступ как лишние ячейки) */ - while (q < bound && (fb(q) == ' ' || fb(q) == '\t')) q++; - soft_break = 1; - ch = ' '; - } - } - - /* Inline-маркеры (\X [x] ` ** ~~ * _ \t) — общий разбор; при - * soft_break ch==' ' (синтетический пробел склейки) — маркеры - * пропускаем, его кладёт ветка пробела ниже. */ - if (!soft_break && inline_marker(&q, bound, &line_style, &seg_col, &prev_ch, base)) - continue; - - if (ch == ' ') { - gc_put(' ', emph_to_attr(line_style, base)); - if (soft_break) { - last_space = q; /* синтетический пробел склейки */ - } else { - last_space = q + 1; - q++; - } - last_space_style = line_style; - g_ncells_at_space = g_ncells; /* снимок для усечения */ - seg_col++; - prev_ch = ' '; - } else { - gc_put(ch, emph_to_attr(line_style, base)); - seg_col++; - q++; /* soft_break здесь всегда 0 (ch != ' ') */ - prev_ch = ch; - } - if (!nowrap && seg_col >= SCREEN_W) { - uint8_t use_ls = (uint8_t)(last_space != 0xFFFFFFFFu && last_space > cur_seg_off); - uint32_t wrap_at = use_ls ? last_space : q; - if (wrap_at >= bound || wrap_at == cur_seg_off) break; - uint8_t wrap_style = use_ls ? last_space_style : line_style; - if (use_ls) g_ncells = g_ncells_at_space; /* усечь до пробела */ - emit_seg(wrap_at, wrap_style, ckind, 1); - base = ATTR_TEXT; /* continuation заголовка → PLAIN (в join base и так ATTR_TEXT) */ - /* Префикс continuation-сегмента: список и отступленный абзац (#4) — - * col пробелов выравнивания; цитата — отступ + маркер 0xB3 + пробел. - * Для обычного абзаца без отступа col==0 → префикса нет; CK_OTHER - * (заголовки/таблицы, NONE-режим) — префикса нет. */ - if (ckind == CK_LIST || ckind == CK_PLAIN) { - gc_fill(' ', ATTR_TEXT, col); - } else if (ckind == CK_QUOTE) { - uint32_t content_off2 = para_start + col; - uint8_t qsp = 0; - while (qsp + 2 < content_off2 && qsp < SCREEN_W && fb(para_start + qsp) == ' ') qsp++; - gc_fill(' ', ATTR_TEXT, qsp); - gc_put(0xB3, ATTR_QUOTE_MARKER); - gc_put(' ', ATTR_TEXT); - } - seg_col = col; - last_space = 0xFFFFFFFFu; - prev_ch = ' '; - q = wrap_at; - /* Откатываем line_style к снимку на момент wrap_at: диапазон - * [wrap_at, q_old) будет пересканирован заново, и переключающие - * символы (обратная кавычка, звёздочка, подчёркивание, тильда) - * внутри него иначе применились бы дважды — именно так возникал - * баг: code-маркер на границе переноса ломает цвет следующего слова (mdview.c, отчёт пользователя - * 2026-06-23). */ - line_style = wrap_style; - } - } - - *io_line_style = line_style; - return q; -} - -/* Тонкая обёртка прежнего API: скан ровно [q, q_end) без склейки строк. - * Вызывается для заголовков и ячеек таблиц (всегда CK_OTHER, col=0). */ -uint8_t inline_scan(uint32_t q, uint32_t q_end, uint8_t col, - uint8_t ckind, uint8_t line_style, uint8_t base_attr, - uint8_t nowrap) -{ - (void)scan_stream(q, q_end, q, col, ckind, &line_style, base_attr, nowrap, - JOIN_MODE_NONE); - return line_style; -} - -/* Потоковый сканер для index_lines(): mode задаёт правила '\n'-склейки. */ -static uint32_t scan_join_stream(uint32_t q, uint32_t para_start, uint8_t col, - uint8_t ckind, uint8_t *io_line_style, uint8_t mode) -{ - return scan_stream(q, file_size, para_start, col, ckind, io_line_style, - ATTR_TEXT, 0, mode); -} - -/* Отрисовка таблиц (row_end/table_*) — в модуле mdview2_table.c. */ - -/* ================== Резюмируемый проход индексации ======================= - * Бывший монолит index_lines() порезан на begin/step/finish, чтобы фоновая - * сборка второго набора (bg_step ядра) могла выполнять индексацию порциями - * в паузах между клавишами. Всё межшаговое состояние — в статиках модуля - * (idx_p/idx_in_block ниже + g_cells/cur_rec/g_trunc_* выше); оно НЕ входит - * в docset_t и переживает свапы наборов, потому что обработчики клавиш - * видимого набора индексатор не трогают. */ -static uint32_t idx_p; /* позиция чтения исходника между шагами */ -static uint8_t idx_in_block; /* внутри fenced code-блока */ -static uint8_t idx_active; /* 1 = проход начат и ещё не финализирован */ - -/* Начинает новый проход (сброс позиции/буферов/причин обрыва). */ -void index_begin(void) -{ - idx_p = 0; - idx_in_block = 0; - n_lines = 0; - index_truncated = 0; - g_trunc_cause = 0; - g_trunc_line = 0; - cur_seg_off = 0xFFFFFFFFu; /* пока не эмитили ни одного сегмента */ - g_ncells = 0; - g_ncells_at_space = 0; - g_skip_flush = 0; - idx_active = 1; -} - -/* Хвост прохода: финальный флаш ячеек + строка-обрыв (бывший финал index_lines). */ -static void index_finish(void) -{ - idx_active = 0; - /* emit_seg() флашит ячейки с отставанием на одну строку (см. её - * комментарий) — последняя эмитированная строка файла так и остаётся - * незафлашенной, её ячейки ещё в g_cells; коммитим здесь. */ - if (n_lines > 0) seg_commit_cells((uint16_t)(n_lines - 1)); - - /* Лимит строк ловим ЗДЕСЬ, а не в emit_seg: главный цикл выходит по - * `n_lines < max_lines` ДО того, как emit_seg будет вызван в переполненном - * состоянии (для code-block — один emit_seg на строку, эта ветка не - * достигается). Признак — остановились, а файл не кончился; g_abort и - * исчерпание контента (TRUNC_CONTENT) уже обработаны/исключены. */ - if (!g_trunc_cause && !g_abort && idx_p < file_size) { - g_trunc_cause = TRUNC_LINES; - g_trunc_line = (uint16_t)(max_lines - 1); - } - - /* Файл был обрезан до 256 КБ при загрузке, а индексация дошла до конца - * клампнутых данных без исчерпания контента/строк → ДОПИСЫВАЕМ строку - * (место есть: n_lines < max_lines). Приоритет ниже content/lines — - * те означают, что обрезали ещё раньше, их сообщение точнее. */ - if (!g_trunc_cause && !g_abort && g_file_clamped) { - g_trunc_cause = TRUNC_FILE; - g_trunc_line = n_lines; - } - - /* Обрыв по контенту/лимиту строк (не путать с пользовательским g_abort): - * документ заканчиваем строкой-сообщением на g_trunc_line. Сообщение - * рисуется вживую (IF_TRUNC_MSG) — место в контент-кэше ему не нужно, что - * и снимает тупик «кэш полон, а сообщение тоже надо закэшировать». */ - if (g_trunc_cause && !g_abort) { - cache_rec_t r; - r.page = 0; r.off = 0; r.len = 0; - r.flags = IF_TRUNC_MSG; r.reserved = g_trunc_cause; - r.pad[0] = 0; r.pad[1] = 0; - cache_dir_put(g_trunc_line, &r); - n_lines = (uint16_t)(g_trunc_line + 1); /* документ кончается на строке-обрыве */ - } -} - -/* Одна итерация бывшего главного цикла index_lines(): классифицирует и - * эмитит очередной блок исходника (параграф/строку кода/таблицу целиком). - * do{}while(0) сохраняет исходные `continue` тела как выход из итерации - * с записью локальной p обратно в idx_p. */ -static void index_iter(void) -{ - if (g_loading) - progress_tick(); /* первый экран + статус + скролл по готовым данным */ - else if (!g_bg_building && (n_lines & 15) == 0) - spinner_tick(); - - uint32_t p = idx_p; - do { - /* Пустая строка — разделитель параграфов. - * В индекс добавляем не более одной пустой экранной строки подряд. */ - if (is_line_blank(p)) { - p = next_line(p); - /* Серия пустых строк схлопывается в одну визуальную строку. */ - if (n_lines == 0 || !(cur_rec.flags & IF_BLANK)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_PLAIN, 0); - set_cur_flags(IF_BLANK); - } - continue; - } - - /* ---- fenced code-блок (граница или тело) ---- */ - if (is_fence_raw(p)) { - idx_in_block = !idx_in_block; - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP); - p = next_line(p); - continue; - } - if (idx_in_block) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_CODE | IF_HSCROLL); /* код скроллится целым блоком */ - { - uint8_t ccx = 0; - uint32_t pp = p; - while (pp < file_size && fb(pp) != '\n') { - char ch = fb(pp); - if (ch == '\t') { - uint8_t tgt = (uint8_t)((ccx & (uint8_t)~(TAB_STOP - 1)) + TAB_STOP); - gc_fill(' ', ATTR_TEXT_CODE, (uint8_t)(tgt - ccx)); - ccx = tgt; - } else if (ch == '\r') { - gc_put(' ', ATTR_TEXT_CODE); ccx++; /* как render: \r → пробел */ - } else { - gc_put(ch, ATTR_TEXT_CODE); ccx++; - } - pp++; - } - } - p = next_line(p); - continue; - } - - /* ---- горизонтальный разделитель ---- */ - if (is_hr_raw(p)) { - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP); - gc_fill(0xC4, ATTR_HR, SCREEN_W); - p = next_line(p); - continue; - } - - /* ---- строка таблицы (| ... |): один nowrap-сегмент на исходную строку ---- */ - if (is_table_raw(p)) { - /* Освобождаем g_cells под измерение ширин: коммитим pending-сегмент - * сейчас; первый emit_seg таблицы пропустит свой lag-флаш. */ - if (n_lines >= 1) { seg_commit_cells((uint16_t)(n_lines - 1)); g_skip_flush = 1; } - g_ncells = 0; - - /* Проход 1: границы блока + ОТРЕНДЕРЕННЫЕ ширины колонок (мерим тем же - * inline_scan, что и при отрисовке — невидимые маркеры стиля не считаются). */ - uint8_t widths[TBL_MAX_COLS]; - for (uint8_t i = 0; i < TBL_MAX_COLS; i++) widths[i] = 0; - uint8_t ncols = 0; - uint32_t r = p; - while (r < file_size && is_table_raw(r)) { - uint32_t le = row_end(r); - uint8_t sep = table_is_sep_row(r, le); - uint32_t cp = table_first_cell(r); - uint32_t cs, ce; - uint8_t c = 0; - while (c < TBL_MAX_COLS && table_next_cell(&cp, le, &cs, &ce)) { - if (!sep && ce > cs) { - g_ncells = 0; - (void)inline_scan(cs, ce, 0, CK_OTHER, INIT_STYLE_PLAIN, ATTR_TEXT, 1); - if (g_ncells > widths[c]) widths[c] = g_ncells; - } - c++; - } - if (c > ncols) ncols = c; - r = (le < file_size) ? le + 1 : le; - } - g_ncells = 0; /* чисто для верхней рамки */ - uint32_t tbl_end = r; - if (ncols == 0) ncols = 1; - - /* Проход 2: верхняя рамка → строки/разделитель → нижняя рамка. */ - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - table_border(widths, ncols, TBL_TL, TBL_TM, TBL_TR); - - r = p; - while (r < tbl_end) { - uint32_t le = row_end(r); - emit_seg(r, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - if (table_is_sep_row(r, le)) table_border(widths, ncols, TBL_ML, TBL_MM, TBL_MR); - else table_data_row(r, le, widths, ncols); - r = (le < file_size) ? le + 1 : le; - } - - emit_seg(tbl_end, INIT_STYLE_PLAIN, CK_OTHER, 0); - set_cur_flags(IF_NOWRAP | IF_HSCROLL); - table_border(widths, ncols, TBL_BL, TBL_BM, TBL_BR); - - p = tbl_end; - continue; - } - - /* ---- классификация текущей строки ---- */ - uint32_t content_off = p; - uint8_t kind = classify_line(p, &content_off); - - /* ---- Заголовок: отдельная строка, не склеивается с параграфом ---- */ - if (kind >= LK_H1 && kind <= LK_H4) { - uint8_t hbase; /* title-attr, как в render */ - switch (kind) { - case LK_H1: hbase = ATTR_TEXT_TITLE1; break; - case LK_H2: hbase = ATTR_TEXT_TITLE2; break; - case LK_H3: hbase = ATTR_TEXT_TITLE3; break; - default: hbase = ATTR_TEXT_TITLE4; break; - } - emit_seg(p, INIT_STYLE_PLAIN, CK_OTHER, 0); - uint32_t line_end = row_end(content_off); - (void)inline_scan(content_off, line_end, 0, CK_OTHER, INIT_STYLE_PLAIN, hbase, 0); - p = next_line(p); - continue; - } - - /* ---- Пункт списка: может занимать несколько физических строк ---- */ - if (kind == LK_ULIST || kind == LK_OLIST) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_LIST, 0); - /* Префикс ПЕРВОГО сегмента: отступ + маркер + пробел (как render). */ - { - uint32_t qq = p, qmax = p + SCREEN_W; - if (kind == LK_ULIST) { - while (qq + 2 < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - gc_put(0x07, ATTR_LIST_MARKER); - gc_put(' ', ATTR_TEXT); - } else { - while (qq < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - while (qq < content_off - 1) { gc_put(fb(qq), ATTR_LIST_MARKER); qq++; } - gc_put(' ', ATTR_TEXT); - } - } - q = scan_join_stream(q, p, col, CK_LIST, &line_style, JOIN_MODE_LIST); - - /* Переходим к началу следующей физической строки после пункта. */ - q = next_line(q); - - /* Одна пустая строка между соседними маркерами списка подавляется. - * Две и более пустых строки оставляют видимый разделитель. */ - if (q < file_size && is_line_blank(q)) { - uint32_t t = q; - uint8_t blanks = 0; - while (t < file_size && is_line_blank(t)) { - t = next_line(t); - blanks++; - // if (blanks >= 2) break; - } - if (blanks == 1 && t < file_size) { - uint32_t d = t; - uint8_t nk = classify_line(t, &d); - if (nk == LK_ULIST || nk == LK_OLIST) { - /* #3: подавляем blank только если следующий пункт того же - * уровня или глубже; при МЕНЬШЕМ отступе (dedent) пустую - * строку оставляем — пункты должны визуально разделиться. */ - if (leading_spaces(t) >= leading_spaces(p)) { - p = t; /* подавляем единственную пустую строку */ - continue; - } - } - } - } - - p = q; - continue; - } - - /* ---- Параграф цитаты: может покрывать несколько физических строк ---- */ - if (kind == LK_QUOTE) { - uint8_t col = marker_visible_col(kind, p, content_off); - uint8_t line_style = INIT_STYLE_PLAIN; - uint32_t q = content_off; - - emit_seg(p, line_style, CK_QUOTE, 0); - /* Префикс ПЕРВОГО сегмента: отступ + маркер 0xB3 + пробел (как render LK_QUOTE). */ - { - uint32_t qq = p, qmax = p + SCREEN_W; - while (qq + 1 < content_off && qq < qmax && fb(qq) == ' ') qq++; - gc_fill(' ', ATTR_TEXT, (uint8_t)(qq - p)); - gc_put(0xB3, ATTR_QUOTE_MARKER); - gc_put(' ', ATTR_TEXT); - } - q = scan_join_stream(q, p, col, CK_QUOTE, &line_style, JOIN_MODE_QUOTE); - - p = next_line(q); - continue; - } - - /* ---- Обычный текстовый параграф: склейка через soft-break ---- */ - { - uint8_t line_style = INIT_STYLE_PLAIN; - /* #4: если абзац начинается с отступа — все его перенесённые строки - * получают такой же отступ (как continuation-префикс списка, но без - * маркера). Контент сканируем после отступа. Патологически большой - * отступ игнорируем. */ - uint8_t indent = leading_spaces(p); - if (indent >= SCREEN_W / 2) indent = 0; - - emit_seg(p, line_style, CK_PLAIN, 0); - if (indent) gc_fill(' ', ATTR_TEXT, indent); /* префикс первого сегмента */ - - uint32_t q = p + indent; - q = scan_join_stream(q, p, indent, CK_PLAIN, &line_style, JOIN_MODE_PLAIN); - - if (q >= file_size) { - p = file_size; - } else { - /* q стоит на завершающем newline параграфа. - * Переходим на следующую строку, чтобы внешняя петля её - * корректно переклассифицировала. */ - p = next_line(q); - } - } - } while (0); - idx_p = p; -} - -/* Выполняет до budget итераций индексации. Возврат: 1 — проход завершён - * (индекс финализирован index_finish), 0 — есть ещё работа. - * Конвертация UTF-8 держится впереди позиции чтения ЗДЕСЬ, до проверки - * условия останова: пока исходник не сконвертирован до конца, idx_p не - * может «догнать» file_size и оборвать проход преждевременно. */ -uint8_t index_step(uint8_t budget) -{ - if (!idx_active) return 1; - while (budget-- > 0) { - /* UTF-8: держим конвертацию впереди позиции чтения (включая look-ahead - * склейки/классификации ~ один абзац). file_size при этом = доступная - * сконвертированная часть и растёт по ходу. */ - if (g_utf_building && (uint32_t)(idx_p + CONV_MARGIN) > file_size) - utf_convert_more((uint32_t)(idx_p + CONV_MARGIN)); - - if (!(idx_p < file_size && n_lines < max_lines && !g_abort && !g_trunc_cause)) { - index_finish(); - return 1; - } - index_iter(); - } - return 0; -} -#define EM_NONE 0 -#define EM_BOLD 1 -#define EM_ITALIC 2 -#define EM_UNDER 3 -#define EM_CODE 4 -#define EM_STRIKE 5 - -/* Преобразует внутреннее состояние emphasis в экранный атрибут. */ -static uint8_t emph_to_attr(uint8_t emph, uint8_t base_attr) -{ - switch (emph) { - case EM_BOLD: return ATTR_TEXT_BOLD; - case EM_ITALIC: return ATTR_TEXT_ITALIC; - case EM_UNDER: return ATTR_TEXT_UNDERSORE; - case EM_CODE: return ATTR_TEXT_CODE; - case EM_STRIKE: return ATTR_TEXT_STRIKE; - default: return base_attr; - } -} diff --git a/examples/mdview2/mdview2_md.c b/examples/mdview2/mdview2_md.c deleted file mode 100644 index 712d949..0000000 --- a/examples/mdview2/mdview2_md.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * mdview2_md.c — представление MD-документа (peer к mdview2_raw.c): отрисовка - * области из рендер-кэша + прокрутка (верт./гориз.) + навигация md_key(). - * Статус-бар, меню и спиннер — в mdview2_status.c (общие для MD/RAW). - * - * Работает поверх готового рендер-кэша (cache_dir_get → cache_rec_t) и - * состояния навигации (top_line/viewport_x/n_lines, см. mdview2.h). Никакого - * парсинга/обращения к исходному файлу: всё рисуется из (char,attr)-ячеек кэша - * через win_rest_remap (ремап 8-битных кодировок — в mdview2_enc.c). - * - * Пара видов: mdview2_md.c (MD, из кэша) ↔ mdview2_raw.c (RAW, из fb()). - */ - -#include -#include /* wrchar/scroll/COLOR */ -#include /* bios_set_place/bios_fillcharattr */ -#include "mdview2.h" - -/* Фаза 4-5 — cache-only draw path: рисует одну строку ИЗ КЭША, без - * единого обращения к fb()/исходному файлу. Горизонтальный скролл для - * nowrap-строк (Фаза 5) — это просто смещение начала среза на vx*2 - * байт ВНУТРИ ТОГО ЖЕ кэш-буфера (cache_reserve гарантирует, что вся - * строка лежит в одной странице, так что off+vx*2 не пересекает - * границу страницы); не nowrap-строки игнорируют viewport_x, как и - * раньше в живом render_line() (там это называлось effective_vx). */ -static void draw_line_from_cache(uint16_t line_idx, uint8_t row) -{ - cache_rec_t rec; - cache_dir_get(line_idx, &rec); - - /* Строка-обрыв (исчерпан контент-кэш / лимит строк): фикс. текст вживую, - * без обращения к контент-кэшу (см. index_lines финализацию). */ - if (rec.flags & IF_TRUNC_MSG) { - const char *msg; - switch (rec.reserved) { - case TRUNC_LINES: msg = "*** Line limit reached - document truncated ***"; break; - case TRUNC_FILE: msg = "*** File too large - truncated at 256 KB ***"; break; - default: msg = "*** Content cache exhausted - document truncated ***"; break; - } - bios_set_place(row, 0); - bios_fillcharattr(' ', ATTR_WARN, SCREEN_W); - put_str_attr(2, row, msg, ATTR_WARN); - return; - } - - bios_set_place(row, 0); - bios_fillcharattr(' ', ATTR_TEXT, SCREEN_W); - - /* Горизонтальный сдвиг применяется ко ВСЕМ строкам hscroll-блока (код, - * таблицы) — по ТИПУ, а не по длине: блок двигается целиком, включая - * строки короче 80 (короткая строка, ушедшая за левый край, просто - * показывает маркер '<' на пустом месте). HR и границы fence не имеют - * IF_HSCROLL и не сдвигаются. */ - uint8_t vx = (rec.flags & IF_HSCROLL) ? viewport_x : 0; - - if (rec.len > vx) { - uint16_t remaining = (uint16_t)(rec.len - vx); - uint8_t w = (remaining > SCREEN_W) ? SCREEN_W : (uint8_t)remaining; - uint16_t off = (uint16_t)(rec.off + (uint16_t)vx * 2u); - win_rest_remap(row, w, rec.page, off); - if (remaining > SCREEN_W) { - wrchar(SCREEN_W - 1, row, '>', ATTR_TRUNC); - } - } - if (vx > 0) { - wrchar(0, row, '<', ATTR_TRUNC); - } -} - -/* Перерисовывает все VIEW_H строк окна из кэша — основной путь - * перерисовки видимой области после загрузки файла (Фаза 3-4). */ -void draw_viewport_from_cache(void) -{ - for (uint8_t i = 0; i < VIEW_H; i++) { - draw_line_from_cache((uint16_t)(top_line + i), (uint8_t)(VIEW_TOP_ROW + i)); - } -} - - -/* ================================================================== - * Прокрутка - * ================================================================== */ - -/* Ограничивает top_line допустимым диапазоном с учётом высоты окна. */ -void clamp_top(void) -{ - if (n_lines <= VIEW_H) { - top_line = 0; - } else if (top_line > n_lines - VIEW_H) { - top_line = (uint16_t)(n_lines - VIEW_H); - } -} - -/* Прокрутка вверх на n строк с частичной перерисовкой при n == 1. */ -void md_scroll_up(uint16_t n) -{ - uint16_t new_top_line = (top_line >= n) ? (uint16_t)(top_line - n) : 0; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); - draw_line_from_cache((uint16_t)(top_line), (uint8_t)(VIEW_TOP_ROW)); - } else { - draw_viewport_from_cache(); - } - } -} - -/* Прокрутка вниз на n строк с частичной перерисовкой при n == 1. */ -void md_scroll_down(uint16_t n) -{ - uint16_t new_top_line = (top_line + n < n_lines - VIEW_H) ? - (uint16_t)(top_line + n) : n_lines - VIEW_H; - if( new_top_line != top_line) { - top_line = new_top_line; - if (n == 1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); - draw_line_from_cache((uint16_t)(top_line + VIEW_H - 1), (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); - } else { - clamp_top(); - draw_viewport_from_cache(); - } - } -} - -/* Горизонтальный сдвиг (только если в окне есть nowrap-строки). - * Максимум сдвига ограничен самой широкой nowrap-строкой на экране. - * Фаза 5: ширина берётся прямо из директории кэша (rec.len — уже - * посчитанная реальная длина в ячейках после рендера), без единого - * обращения к fb()/seg_off()/исходному файлу. */ -void md_scroll_horizon(int8_t delta) -{ - uint16_t maxw = 0; - for (uint8_t i = 0; i < VIEW_H; i++) { - uint16_t li = (uint16_t)(top_line + i); - if (li >= n_lines) break; - cache_rec_t rec; - cache_dir_get(li, &rec); - if (!(rec.flags & IF_HSCROLL)) continue; /* только код/таблицы */ - if (rec.len > maxw) maxw = rec.len; /* самая широкая строка блока */ - } - if (maxw == 0) return; /* нет строк шире экрана */ - - /* Максимальный сдвиг = ширина за пределами экрана, в границах uint8. */ - uint16_t over = (maxw > SCREEN_W) ? (uint16_t)(maxw - SCREEN_W) : 0; - if (over > 248u) over = 248u; - uint8_t max_vx = (uint8_t)over; - - int16_t nx = (int16_t)viewport_x + delta; - if (nx < 0) nx = 0; - if (nx > (int16_t)max_vx) nx = max_vx; - - /* ПОРЯДОК ВАЖЕН: записываем viewport_x ДО сравнения, а сравниваем уже - * сохранённую копию old_vx с new_vx. Иначе SDCC генерирует для - * `if (new_vx != viewport_x) viewport_x = new_vx;` такой код: - * ld a, new_vx ; sub a,(viewport_x) ; jr Z,.. ; ld (viewport_x),a - * — т.е. для записи переиспользует регистр A, испорченный вычитанием в - * сравнении, и кладёт в viewport_x не new_vx, а (new_vx - old_vx). - * (asm-дамп 2026-06-24 подтвердил; даёт 10-8=2, 10-2=8 — ровно - * наблюдавшийся "прыжок" скролла.) Записав viewport_x первой, мы убираем - * портящий sub с пути записи; сравнение ниже только решает, перерисовывать - * ли экран. */ - uint8_t new_vx = (uint8_t)nx; - uint8_t old_vx = viewport_x; - viewport_x = new_vx; - if (new_vx != old_vx) - draw_viewport_from_cache(); -} - -/* Процент прокрутки (0..100) относительно доступного диапазона. */ -static uint8_t calc_md_pct(void) -{ - uint16_t total = drawable_lines(); - if (total <= VIEW_H) return 100; - return pct16(top_line, (uint16_t)(total - VIEW_H)); -} - -/* ---- навигация MD после загрузки (peer к raw_key) ---------------- */ - -/* Обрабатывает навигационную клавишу в MD-режиме (вызывается из главного - * цикла). Сама перерисовывает область/статус. Возврат: 1 — обработано, - * 0 — не наша клавиша (F1/F8/F10 разбирает main). */ -uint8_t md_key(uint8_t scan) -{ - switch (scan) { - case KEY_UP: - md_scroll_up(1); - break; - case KEY_DOWN: - md_scroll_down(1); - break; - case KEY_LEFT: - md_scroll_horizon(-(int8_t)HPAN_STEP); - break; - case KEY_RIGHT: - md_scroll_horizon(+(int8_t)HPAN_STEP); - break; - case KEY_PGUP: - md_scroll_up(VIEW_H); - break; - case KEY_PGDN: - md_scroll_down(VIEW_H); - break; - case KEY_HOME: - if(top_line != 0 || viewport_x != 0 ) { - top_line = 0; - viewport_x = 0; - draw_viewport_from_cache(); - } - break; - case KEY_END: - uint16_t new_top_line = (n_lines > VIEW_H) ? (uint16_t)(n_lines - VIEW_H) : 0; - if(top_line != new_top_line || viewport_x != 0 ) { - top_line = new_top_line; - viewport_x = 0; - draw_viewport_from_cache(); - } - break; - - default: - return 0; /* не наша клавиша */ - } - - render_percent_progress(calc_md_pct()); - render_md_status_numbers(); - return 1; -} diff --git a/examples/mdview2/mdview2_raw.c b/examples/mdview2/mdview2_raw.c deleted file mode 100644 index db2be7b..0000000 --- a/examples/mdview2/mdview2_raw.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * mdview2_raw.c — RAW-просмотр исходного текста (без markdown-форматирования). - * - * Работает по АКТИВНОМУ буферу документа через fb() (8-бит = исходные байты, - * UTF-8 = декодированный в CP866 буфер), ремап ≥0x80 (CP1251/KOI8) — на - * отрисовке. Индекс/кэш markdown не используются: позиция — байт-offset, - * 1 байт = 1 ячейка, \t показываем пробелом. Два режима: - * VIEW_RAW_WRAP — длинные строки переносятся кратно 80 (рвём слова); - * VIEW_RAW_HSCROLL — строка в один ряд, горизонтальный скролл. - * - * Память: 0 доп. EMM; near-буфер строки + переиспользование g_scratch_phys. - */ - -#include -#include -#include -#include -#include "mdview2.h" - -#if WITH_RAW /* весь модуль — опционален (mdview_conf.h); при 0 пустой объектник */ - -static uint32_t raw_top; /* байт-offset верхней строки экрана */ -static uint16_t raw_hpan; /* гориз. сдвиг (только HSCROLL) */ - -/* ---- примитивы навигации по физическим строкам / переносам -------- */ - -static uint32_t raw_line_start(uint32_t off) -{ - while (off && fb(off - 1) != '\n') off--; - return off; -} - -/* WRAP: начало следующего ряда от off (\n завершает строку; иначе +80). */ -static uint32_t raw_next_wrap(uint32_t off) -{ - uint32_t e = off, lim = off + SCREEN_W; - while (e < file_size) { - if (fb(e) == '\n') return e + 1; - e++; - if (e >= lim) { /* прошли 80 без \n */ - if (e < file_size && fb(e) == '\n') return e + 1; /* ровно 80 + \n */ - return e; /* длинная строка → продолжение */ - } - } - return e; /* EOF */ -} - -static uint32_t raw_prev_wrap(uint32_t off) -{ - if (off == 0) return 0; - uint32_t pls = raw_line_start(off - 1); /* off-1 — это \n пред. строки */ - while (pls + SCREEN_W < (off - 1)) pls += SCREEN_W; - return pls; -} - -/* HSCROLL: начало следующей/предыдущей физической строки. */ -static uint32_t raw_next_line(uint32_t off) -{ - while (off < file_size && fb(off) != '\n') off++; - return (off < file_size) ? off + 1 : off; -} - -static uint32_t raw_prev_line(uint32_t off) -{ - if (off == 0) return 0; - return raw_line_start(off - 1); -} - -/* ---- отрисовка ряда (общий near-буфер → g_scratch_phys → win_rest) - */ - -static uint8_t raw_buf[SCREEN_W + 1]; /* только символы (атрибут единый, задаётся при выводе) */ - -/* В RAW атрибут единый (ATTR_TEXT): буфер — только 80 символов, без пар - * (char,attr). Кладём один байт-глиф (\t→пробел, ремап ≥0x80). */ -static void raw_cell(uint8_t i, uint8_t ch) -{ - if (ch >= 0x80 && g_remap) ch = g_remap[ch - 0x80]; - raw_buf[i] = ch; -} -/* Вывод готового 80-символьного буфера в строку экрана одним BIOS-вызовом - * (char-буфер + единый attr — без WINREST/scratch-страницы). */ -static void raw_flush(uint8_t row) -{ - bios_set_place(row, 0); - // bios_writeattr((const char *)raw_buf, SCREEN_W, ATTR_TEXT); - // bios_writeattr_until((const char *)raw_buf, SCREEN_W, ATTR_TEXT, 0); - bios_write_until((const char *)raw_buf, SCREEN_W, 0); -} - -static uint32_t raw_draw_wrap_row(uint32_t off, uint8_t row) -{ - uint8_t i = 0; - uint32_t e = off, lim = off + SCREEN_W; - while (i < SCREEN_W && e < file_size) { - char c = fb(e); - if (c == '\n') { - raw_cell(i, 0); - break; - } - raw_cell(i, (uint8_t)(c == '\t' ? ' ' : c)); - i++; e++; - } - raw_flush(row); - return raw_next_wrap(off); -} - -static uint32_t raw_draw_hscroll_row(uint32_t off, uint8_t row) -{ - uint32_t e = off; - while (e < file_size && fb(e) != '\n') e++; /* e = конец строки */ - uint16_t len = e - off; - - uint8_t i = 0; - uint32_t p = off + raw_hpan; - while (i < SCREEN_W && p < e) { - char c = fb(p); - raw_cell(i, (uint8_t)(c == '\t' ? ' ' : c)); - i++; p++; - } - // raw_buf[i] = 0; - - if (raw_hpan > 0) - raw_buf[0] = '<'; - if (len > (uint16_t)raw_hpan + SCREEN_W) - raw_buf[SCREEN_W - 1] = '>'; - if (i < SCREEN_W) - raw_buf[i] = 0; - raw_flush(row); - return (e < file_size) ? e + 1 : e; -} - -/* Рисует один ряд от off (по режиму) и возвращает offset следующего ряда. */ -static uint32_t raw_draw_one(uint32_t off, uint8_t row) -{ - if (off >= file_size) { fill_row(row, ATTR_TEXT); return off; } - return (g_view == VIEW_RAW_WRAP) ? raw_draw_wrap_row(off, row) - : raw_draw_hscroll_row(off, row); -} - -void raw_draw(void) -{ - uint32_t off = raw_top; - for (uint8_t r = 0; r < VIEW_H; r++) - off = raw_draw_one(off, (uint8_t)(VIEW_TOP_ROW + r)); -} - -/* Прокрутка на одну строку: аппаратный scroll окна документа + отрисовка - * ОДНОЙ новой строки (как в MD-режиме). Смещение нижнего ряда вычисляется - * проходом VIEW_H рядов от raw_top — без отдельного инкрементального счётчика, - * который рассинхронизировался, когда контент кончается в середине экрана - * (короче окна после wrap→unwrap у конца файла). */ -static uint32_t raw_next(uint32_t off) -{ - return (g_view == VIEW_RAW_WRAP) ? raw_next_wrap(off) : raw_next_line(off); -} -static uint32_t raw_prev(uint32_t off) -{ - return (g_view == VIEW_RAW_WRAP) ? raw_prev_wrap(off) : raw_prev_line(off); -} - -/* ---- статус-бар: % по байтам (отрисовка — render_raw_status_numbers - * в mdview2_status.c, читает позицию через этот raw_pct) ---- */ - -/* Процент по байтам без 32-битного деления: масштабируем offset'ы (>>8 → - * ≤1024), дальше 16-битный pct16 (без __divulong). raw_top приватен модулю, - * поэтому % считаем здесь и отдаём готовым числом в статус-модуль. */ -uint8_t calc_raw_pct(void) -{ - uint16_t a = (uint16_t)(raw_top >> 8); - uint16_t b = (uint16_t)(file_size >> 8); - return pct16(a, b); /* den==0 (файл < 1 КБ) → pct16 вернёт 0 */ -} - -/* ---- посев позиции / пересев при смене активного буфера ----------- */ - -uint32_t raw_pos(void) -{ - return raw_top; -} - -/* Поставить RAW на начало строки, содержащей байт off (позиционирование - * при F2 MD→RAW и F8-переносе позиции между наборами). */ -void raw_reanchor(uint32_t off) -{ - if (off > file_size) off = file_size; - raw_top = raw_line_start(off); - raw_hpan = 0; -} - -void raw_seed_from(uint16_t md_top_line) -{ - raw_reanchor(seg_off(md_top_line)); -} - -/* Сброс в начало (клавиша Home). */ -static void raw_home(void) -{ - raw_top = 0; - raw_hpan = 0; -} - -void raw_end(void) -{ - raw_top = file_size; /* отмотать VIEW_H рядов назад */ - for (uint8_t k = 0; k < VIEW_H; k++) - raw_top = raw_prev(raw_top); - raw_hpan = 0; -} - -void raw_screen_init(void) { - bios_clearwin(1, 0, 30, 80, ATTR_TEXT); -} - -/* Нормализация позиции при смене под-режима RAW (F3 Wrap/Unwrap): выровнять - * raw_top на начало физической строки и снять горизонтальный сдвиг. */ -void raw_renorm(void) -{ - raw_top = raw_line_start(raw_top); - raw_hpan = 0; -} - -void raw_scroll_down(uint8_t delta) { - uint32_t off = raw_top; - for (uint8_t r = 0; r < VIEW_H; r++) { - if (off >= file_size) - return; /* экран не заполнен контентом */ - off = raw_next(off); - } - if (off >= file_size) - return; /* контент ровно по экран, ниже пусто */ - - if(delta ==1) { - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 1, 0); /* содержимое вверх */ - off = raw_draw_one(off, (uint8_t)(VIEW_TOP_ROW + VIEW_H - 1)); /* новый нижний ряд */ - raw_top = raw_next(raw_top); - } else { - for (uint8_t k = 0; k < delta; k++) { - uint32_t n2 = raw_next(raw_top); - if (n2 >= file_size) - break; - raw_top = n2; - } - raw_draw(); /* PgUp/PgDn/Home/End — полный экран */ - } -} - -void raw_scroll_up(uint8_t delta) { - if (raw_top == 0) - return; - - if (delta == 1) { - raw_top = raw_prev(raw_top); - scroll(0, VIEW_TOP_ROW, SCREEN_W, VIEW_H, 2, 0); /* содержимое вниз */ - (void)raw_draw_one(raw_top, VIEW_TOP_ROW); - } else { - for (uint8_t k = 0; k < delta; k++) - raw_top = raw_prev(raw_top); - raw_draw(); /* PgUp/PgDn/Home/End — полный экран */ - } -} - -/* ---- навигация (вызывается из главного цикла при g_view != VIEW_MD) - */ - -uint8_t raw_key(uint8_t scan) -{ - switch (scan) { - case KEY_DOWN: - raw_scroll_down(1); - break; - case KEY_UP: - raw_scroll_up(1); - break; - case KEY_PGDN: - raw_scroll_down(VIEW_H); - break; - case KEY_PGUP: - raw_scroll_up(VIEW_H); - break; - case KEY_HOME: - raw_home(); - raw_draw(); - break; - case KEY_END: - raw_end(); - raw_draw(); - break; - case KEY_LEFT: - if (g_view == VIEW_RAW_HSCROLL && raw_hpan) { - raw_hpan = (raw_hpan >= HPAN_STEP) ? (uint16_t)(raw_hpan - HPAN_STEP) : 0; - raw_draw(); - } - break; - case KEY_RIGHT: - if (g_view == VIEW_RAW_HSCROLL && raw_hpan < 248u) { - raw_hpan = (uint16_t)(raw_hpan + HPAN_STEP); - raw_draw(); - } - break; - default: - return 0; /* не наша клавиша */ - } - - // render_raw_status_numbers(); - render_percent_progress(calc_raw_pct()); - return 1; -} - -#endif /* WITH_RAW */ diff --git a/examples/mdview2/mdview2_status.c b/examples/mdview2/mdview2_status.c deleted file mode 100644 index 6a0c32f..0000000 --- a/examples/mdview2/mdview2_status.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * mdview2_status.c — статус-бар (строка 0), нижнее меню (строка 31) и спиннер. - * - * Хром бара АТОМИЗИРОВАН — обновляется по частям, без перерисовки всего бара: - * prerender_status() — фон + разделители │ + "MDVIEW" + имя файла (1 раз); - * status_encoding() — только поле кодировки (col 37), по F8; - * render_md_status_numbers() — числа MD: диапазон строк + % (при скролле); - * render_raw_status_numbers()— числа RAW: метка режима + % по байтам; - * render_full_status() — encoding + numbers (MD), при смене набора/режима; - * render_menu() — строка меню, по смене режима/готовности; - * spinner_tick/show — индикатор занятости во время загрузки. - * Оба *_status_numbers() самоочищаются по геометрии разделителей (DIV1_X/DIV2_X - * в mdview2.h) — фикс. хром не перерисовывается. RAW-позицию даёт raw_pct() - * из mdview2_raw.c (raw_top там приватен). - * - * Раскладка строки 0: - * 0 1..6 8 10.. 37..43 45 46..70 71 72..79 - * . MDVIEW spinner filename encod. │ L a-b / total │ pct% - */ - -#include -#include /* dec8/dec16, cputs */ -#include /* textattr/gotoxy/wrchar/COLOR */ -#include -#include /* bios_fillcharattr/bios_write_until */ -#include "mdview2.h" - -/* ---- Спиннер (слот SPINNER_COL в баре) --------------------------- */ -static const char spinner_chars[4] = { '|', '/', '-', '\\' }; -static uint8_t spinner_phase = 0; -static uint8_t spinner_active = 0; - -/* Продвигает спиннер на один кадр (если включён). */ -void spinner_tick(void) -{ - if (!spinner_active) - return; - wrchar(SPINNER_COL, 0, spinner_chars[spinner_phase & 3], ATTR_BAR_SPINNER); - spinner_phase++; -} - -/* Вкл/выкл спиннер; при выключении гасит его позицию. */ -void spinner_show(uint8_t on) -{ - spinner_active = on; - if (!on) wrchar(SPINNER_COL, 0, ' ', ATTR_BAR); -} - -/* ---- Вычисления для чисел статус-бара ----------------------------- */ - -/* Число строк, готовых к показу. Во время загрузки последняя эмитированная - * строка ещё в g_cells (не зафлашена), поэтому доступны [0..n_lines-2]. */ -uint16_t drawable_lines(void) -{ - if (g_loading) - return (n_lines >= 1) ? (uint16_t)(n_lines - 1) : 0; - return n_lines; -} - - -/* ---- Атомарные части статус-бара ---------------------------------- */ - -/* Фиксированный хром бара — рисуется ОДИН раз при старте: фон, два - * разделителя │, метка "MDVIEW" и имя файла (они не меняются за сессию). */ -void prerender_status(void) -{ - fill_row(0, ATTR_BAR); - wrchar(DIV1_X, 0, 0xB3, ATTR_BAR); /* │ */ - wrchar(DIV2_X, 0, 0xB3, ATTR_BAR); /* │ */ - put_str_attr(1, 0, "MDVIEW", ATTR_BAR); - put_str_attr(10, 0, filename, ATTR_BAR); -} - -/* Поле текущей кодировки (col 37, 7 ячеек). Меняется только по F8. */ -void status_encoding(void) -{ - textattr(ATTR_BAR); - gotoxy(DIV1_X - 10, 0); - bios_write_until(enc_name(g_encoding), 8, 0); -} - -static uint16_t local_total = UINT_MAX; -static uint16_t local_last = UINT_MAX; -static uint8_t local_loading = UCHAR_MAX; -static uint8_t local_pct = UCHAR_MAX; - -/* Числовая часть (MD): "L a-b / total" между разделителями + "pct%" справа. - * Перезаписывает ТОЛЬКО области между/после разделителей, сами │ и фикс. - * хром не трогает. */ -void render_md_status_numbers(void) -{ - uint16_t total = drawable_lines(); - uint16_t last = top_line + VIEW_H; - if (last > total) - last = total; - - if(local_total != total || local_last != last || local_loading != g_loading) { - local_total = total; local_last = last; local_loading = g_loading; - textattr(ATTR_BAR); - gotoxy(DIV1_X + 2, 0); - bios_fillcharattr(' ', ATTR_BAR, DIV2_X - DIV1_X - 2); /* очистить [DIV1_X+1 .. DIV2_X-1] */ - gotoxy(DIV1_X + 2, 0); - cputs("L "); - dec16(top_line + 1); - cputs("-"); - dec16(last); - cputs(" / "); - dec16(total); - if (g_loading) cputs("..."); /* ещё грузится */ - } - -} - -/* Полное обновление переменной части (MD): кодировка + числа. */ -void render_full_status(void) -{ - local_loading = UCHAR_MAX; - status_encoding(); - render_md_status_numbers(); -} - -void render_percent_progress(uint8_t pct) { - if (local_pct != pct) { - local_pct = pct; - gotoxy(DIV2_X + 2, 0); - bios_fillcharattr(' ', ATTR_BAR, SCREEN_W - DIV2_X - 2); /* очистить [DIV2_X+1 .. конец] */ - gotoxy(DIV2_X + 2, 0); - dec8(pct); - cputs("%"); - } -} - -#if WITH_RAW -/* RAW-вариант числовой части бара (peer к render_md_status_numbers): метка - * режима между разделителями + процент справа. Сам очищает свои области (та же - * геометрия DIVn_X), атомарен — не требует общего fill всего бара. Позиция - * берётся готовым числом из raw_pct() (raw_top приватен mdview2_raw.c). */ -void render_raw_status(void) -{ - // uint8_t pct = raw_pct(); - textattr(ATTR_BAR); - gotoxy(DIV1_X + 1, 0); - bios_writeattr_until(g_view == VIEW_RAW_WRAP ? " RAW wrap" : " RAW pan", - DIV2_X - DIV1_X - 1, ATTR_BAR, 0); /* метка + пад до DIV2_X-1 */ -} -#endif /* WITH_RAW */ - -#if WITH_HEX -/* HEX-вариант числовой части бара (peer к render_raw_status). */ -void render_hex_status(void) -{ - textattr(ATTR_BAR); - gotoxy(DIV1_X + 1, 0); - bios_writeattr_until(" HEX", DIV2_X - DIV1_X - 1, ATTR_BAR, 0); -} -#endif /* WITH_HEX */ - -/* ---- Нижнее меню (строка 31) -------------------------------------- */ - -void render_menu(void) -{ - /* Блок i = колонка i*8 (8 шириной): 2 поз. НОМЕР клавиши без 'F' (стиль - * ATTR_MENU_K, ведущий «чёрный» пробел кроме F10) + 6 поз. ТЕКСТ-функция - * (ATTR_MENU_T) сразу за номером. Номера рисуем для ВСЕХ 10 клавиш; текст — - * только у задействованных и доступных сейчас. */ - char num[3]; - - fill_row(MENU_ROW, ATTR_MENU_T); - - num[2] = 0; - for (uint8_t i = 0; i < 9; i++) { /* F1..F9: ' 1'..' 9' */ - num[0] = ' '; num[1] = (char)('1' + i); - put_str_attr((uint8_t)(i * 8), MENU_ROW, num, ATTR_MENU_K); - } - put_str_attr(9 * 8, MENU_ROW, "10", ATTR_MENU_K); /* F10 */ - - put_str_attr(0 * 8 + 2, MENU_ROW, "Help", ATTR_MENU_T); -#if WITH_RAW - if (g_ready) /* RAW доступен после постройки документа */ - put_str_attr(1 * 8 + 2, MENU_ROW, (g_view == VIEW_MD) ? "RAW" : "MD", ATTR_MENU_T); - if (VIEW_IS_RAW(g_view)) /* Wrap/Unwrap — только в RAW */ - put_str_attr(2 * 8 + 2, MENU_ROW, - (g_view == VIEW_RAW_WRAP) ? "UnWrap" : "Wrap", ATTR_MENU_T); -#endif -#if WITH_HEX - if (g_ready) /* HEX доступен после постройки документа */ - put_str_attr(3 * 8 + 2, MENU_ROW, (g_view == VIEW_HEX) ? "Back" : "Hex", ATTR_MENU_T); -#endif - if (g_f8_enabled) /* смена кодировки сейчас возможна */ - put_str_attr(7 * 8 + 2, MENU_ROW, "CodePg", ATTR_MENU_T); - put_str_attr(9 * 8 + 2, MENU_ROW, "Exit", ATTR_MENU_T); -} diff --git a/examples/mdview2/mdview2_table.c b/examples/mdview2/mdview2_table.c deleted file mode 100644 index d0d3aa5..0000000 --- a/examples/mdview2/mdview2_table.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * mdview2_table.c — выровненная отрисовка markdown-таблиц. - * - * Разбор |-разделённых ячеек и эмиссия рамок/строк в общий буфер ячеек - * рендера (gc_put/gc_fill, см. mdview2.h). Вызывается из index_lines() - * ядра при обнаружении таблицы. Геометрия рамок (TBL_n), словарь стилей - * (CK_n, INIT_STYLE_n) и cell-buffer API объявлены в mdview2.h. - */ - -#include -#include /* COLOR() / COLOR_* для атрибутов TBL_ATTR/ATTR_TEXT */ -#include "mdview2.h" - -uint32_t row_end(uint32_t p) -{ - while (p < file_size && fb(p) != '\n') p++; - return p; -} - -/* Начало контента первой ячейки строки (после ведущих пробелов и '|'). */ -uint32_t table_first_cell(uint32_t row_start) -{ - uint32_t p = row_start; - while (p < file_size && fb(p) == ' ') p++; - if (p < file_size && fb(p) == '|') p++; - return p; -} - -/* Следующая ячейка: [*cs,*ce) — обрезанный диапазон; *pp продвигается за '|'. - * 0 — ячеек больше нет (включая хвостовую пустоту после последнего '|'). */ -uint8_t table_next_cell(uint32_t *pp, uint32_t lineend, uint32_t *cs, uint32_t *ce) -{ - uint32_t p = *pp; - if (p >= lineend) return 0; - uint32_t a = p; - while (p < lineend && fb(p) != '|') p++; - uint32_t b = p; - uint8_t had_pipe = (uint8_t)(p < lineend && fb(p) == '|'); - if (had_pipe) p++; - *pp = p; - while (a < b && fb(a) == ' ') a++; - while (b > a && fb(b - 1) == ' ') b--; - if (!had_pipe && a == b) return 0; - *cs = a; *ce = b; - return 1; -} - -/* Строка-разделитель (|---|:-:|): каждая ячейка непустая и только '-'/':'. */ -uint8_t table_is_sep_row(uint32_t row_start, uint32_t lineend) -{ - uint32_t p = table_first_cell(row_start); - uint32_t cs, ce; - uint8_t n = 0; - while (table_next_cell(&p, lineend, &cs, &ce)) { - if (cs >= ce) return 0; - for (uint32_t q = cs; q < ce; q++) { char c = fb(q); if (c != '-' && c != ':') return 0; } - n++; - } - return (uint8_t)(n > 0); -} - -/* Горизонтальная рамка в g_cells: left + (H×(w+2) + mid|right) по колонкам. */ -void table_border(const uint8_t *widths, uint8_t ncols, char left, char mid, char right) -{ - gc_put(left, TBL_ATTR); - for (uint8_t c = 0; c < ncols; c++) { - gc_fill(TBL_H, TBL_ATTR, (uint8_t)(widths[c] + 2)); - gc_put((c == (uint8_t)(ncols - 1)) ? right : mid, TBL_ATTR); - } -} - -/* Строка данных в g_cells: │ <ячейка, добитая до widths[c]> │ … */ -void table_data_row(uint32_t row_start, uint32_t lineend, const uint8_t *widths, uint8_t ncols) -{ - uint32_t p = table_first_cell(row_start); - uint32_t cs, ce; - gc_put(TBL_V, TBL_ATTR); - for (uint8_t c = 0; c < ncols; c++) { - uint8_t got = table_next_cell(&p, lineend, &cs, &ce); - gc_put(' ', TBL_ATTR); - uint8_t rendered = 0; - if (got && ce > cs) { - uint8_t before = g_ncells; - (void)inline_scan(cs, ce, 0, CK_OTHER, INIT_STYLE_PLAIN, ATTR_TEXT, 1); - rendered = (uint8_t)(g_ncells - before); - } - if (rendered < widths[c]) gc_fill(' ', ATTR_TEXT, (uint8_t)(widths[c] - rendered)); - gc_put(' ', TBL_ATTR); - gc_put(TBL_V, TBL_ATTR); - } -} diff --git a/examples/mdview2/testfiles/BIG.MD b/examples/mdview2/testfiles/BIG.MD deleted file mode 100644 index c425eab..0000000 --- a/examples/mdview2/testfiles/BIG.MD +++ /dev/null @@ -1,3278 +0,0 @@ -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. diff --git a/examples/mdview2/testfiles/HUGE.MD b/examples/mdview2/testfiles/HUGE.MD deleted file mode 100644 index cdfc5b7..0000000 --- a/examples/mdview2/testfiles/HUGE.MD +++ /dev/null @@ -1,6556 +0,0 @@ -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- **ᨬ쭠 ப ७-:** 255 祥 (. ࠭祭 ) -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## ࠭祭 - -### ப MD-० ? 255 祥 - -- ࠭ ப ** 255 (ᨬ, ਡ)** -? ⠭ `MAX_CACHE_LINE_LEN`. ⨯: `g_ncells` -`cache_rec_t.len` ? `uint8_t`. ᠥ ப, ⭥ ᥣ -**ਧ⠫쭮 ஫㥬** ப ( ப ⠡, 䫠 -`IF_HSCROLL`), MD-० ࠢ. - -** ந室 ப:** 樨 `gc_put()` -뢠 祩 ᫥ 255- (`if (g_ncells < MAX_CACHE_LINE_LEN)`). - ⮫쪮 255 祥, ⮪ **** ? -஫ ** થ १** 255- 樨 (થ `>` 砥 -? । ?). ९ ? `gc_put` ஢ ࠭. - -: ?255 祥? ? **७७ ਭ**, 室. - ࠧ稢 ஡ ( `TAB_STOP`), 祩 ⠡ -஡ ਭ + ࠬ `` ? ⮬ ⨣ ࠭, 祬 -255 ?? ᨬ. - -> **RAW-० (`F2`) ⮣ ** ? אַ 䠩 -> ⮢, ப 楫 (१ wrap `F3` ਧ. ஫). - -** ** (業, ॠ) ? `uint16_t`: -- `cache_rec_t.len` `uint8_t?uint16_t` ? **஢ 8 ** - (len ꥤ pad-), `idx<<3` . ᯫ⭮. -- `g_ncells` / `g_ncells_at_space` ? `uint16_t` ? 業 **/᪮**: - 16-⭠ 䬥⨪ Z80 祬 `gc_put` (맮 祩) - scan-横. ਥ: **+0.2?0.4 ** + 樨. -- `g_cells[MAX_CACHE_LINE_LEN*2]` near-RAM (W2) ? 業 - ****: `2 ? ` . 510 ; 512 ? +0.5 , 1024 ? +1.5 . - EMM- ⥭ (1 ) ப ﭥ ? 㧪 near. -- `viewport_x` ( `docset_t`) + ⮫ `max_vx` (ᥩ 248) ? `uint16_t`, - ࠭ >255 , ஫ . `widths[]`/`ccx` ⠡/. - - ஬ ? 512?1023: 墠 ᥬ ⨭/⠡栬, - 業 ~+0.3 +0.5?1.5 near-RAM. ** 㬥 `uint16_t`** ? - ⠢ થ १ 255- 樨, ⮡ 뫠 . - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. -# MDView ? ᬮ騪 Markdown Sprinter - -**MDView** ? ணࠬ ᬮ 㬥⮢ ଠ *Markdown* -Sprinter ( Z80). 㬥 ࠭ ⤥쭮 W3 -᭮ RAM ணࠬ. - -## - -- 㬥 **128 ** (8 ࠭ EMM 16 ) -- **16 384** ࠭ ப -- ⮬᪨ ७ ᫮ ਭ ࠭ (80 ⮫殢) -- ਧ⠫ ᤢ ப ப ( , ⠡) -- -: 䠩, ப, 業 ப⪨ -- ப ﭨ ६ 㧪 樨 -- প ?? ᪫ ப - -## - -``` -mdview [_䠩.md] -``` - -᫨ 䠩 , 㦠 `README.MD`. - -## ࠢ - -``` - ⢨ - -Up Down ப⪠ ப / -PgUp PgDn ப⪠ ࠭ (30 ப) -Home 砫 㬥 -End 㬥 -Left Right ਧ⠫ ᤢ (⮫쪮 nowrap-ப) -F1 ࠢ -F8 ஢: CP866 ? CP1251 ? KOI8-R ? UTF-8 ? ... -F10 / Esc 室 ணࠬ -``` - -஢ । ⮬᪨ ⨨ (BOM + ⨪ - 4 ); `F8` ४砥 , ᫨ ⥪ 訡. -8- ஢ (CP866/CP1251/KOI8-R) ४ (६ -ᮢ). ன / (ਬ UTF-8) ந ? -ࢮ ४祭 (⪠ 㧠 ᯨ஬), . - -## ⠪ Markdown - -### - -ন ஢ H1?H4. ஢ H5 H6 ⮡ࠦ H4. - - # ࢮ ஢ - ## ண ஢ - ### 쥣 ஢ - #### ⮣ ஢ - -### ⮢ ଠ஢ - -** ⥪** 뤥 묨 񧤮窠: `**⥪**` - -*ᨢ* 뤥 묨 񧤮窠 `*⥪*` ન `_⥪_` - -`஥ ` 砥 묨 窠 - -~~ભ ⥪~~ ? ⨫: `~~⥪~~` - -### 㬥஢ ᯨ᮪ - -થ `-`, `*` `+`: - -- 㭪 ᯨ᪠ -- ன 㭪 ᯨ᪠ -- ⨩ 㭪 筮 ⥪⮬, 室 - 㤥 ७ ᫥ ப ࠭ 㯠 - -### 㬥஢ ᯨ᮪ - -1. -2. ன -3. ⨩ - -### - -> 稭 ᨬ `>`. ᪮쪮 ᫥⥫ -> ப ᪫ ⮬᪨ -> ७ᮬ ᫮. - -### (verbatim) - - 砥 ன 窨. -⥪ ⮡ࠦ ? ? ࠧ Markdown: - -``` -#include -#include - -int main(void) { - puts("Hello, Sprinter!"); - return 0; -} -``` - -### ਧ⠫쭠 - - ᨬ `---`, `***` `___` ⤥쭮 ப: - ---- - -## 孨᪨ ࠪ⨪ - -- **ଠ:** Sprinter, Z80 @ 21 -- **஢:** CP866 / CP1251 / KOI8-R / UTF-8 (⮮।, `F8`) -- **ᨬ ࠧ 䠩:** 128 -- **ᨬ쭮 ᫮ ப :** 16 384 -- ** :** small - - ணࠬ, c⥪, , ? a W1-W2 (32 , 0x4000?0xBFFF). - - 䠩 ? ࠭ EMM, ⮡ࠦ W3 (0xC000?0xFFFF) - -## TODO - -1. **祭 ࠧ 㬥⮢.** 128 : 筮 - ࠧ ࠡ 訬 - ࠭ , ஢ - ࠡ 8- ࠭栬 16. - -: ଠ஢ ⠡ ࠬ; প ஢ -CP866 / CP1251 / KOI8-R / UTF-8 ⮮। ४祭 `F8` -(ன ந , ࢮ ४祭). - -4. **᪮७ ७ਭ.** ப ࠭. ⨬ 横 뢮 - ᨬ १ BIOS WRCHAR ( 뢮, DMA). - ---- - -*MDView v0.2 (c) 2026 ஢ ..* - - ---- - -# Sprinter C Compiler ? v1.0 - -C toolchain for **Sprinter** ? the Z80-based home computer by Peters Plus, running -ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. - -Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds -everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, -banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the -`mkexe` utility for producing SprintEXE images. - -## What you get - -* **`bin/sprinter-cc`** ? one-line driver: `sprinter-cc -o foo.exe foo.c` -* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` ? see below. -* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. -* **Graphics**: 320?256?256 and 640?256?16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. -* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. -* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. -* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). -* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. -* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. -* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. - -## Quick start - -```sh -git clone sprinter-c -cd sprinter-c -make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) -make all # build mkexe + libsprinter.lib + 27 examples -make floppy # pack everything into mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME -``` - -Compile a single program: - -```sh -cat > hello.c < -int main(void) { puts("Hello, Sprinter!"); return 0; } -EOF - -bin/sprinter-cc -o hello.exe hello.c -``` - -That's it ? `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. - -## Memory modes - -Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates -pages by program size ? small programs get only one page. Pick a memory mode based -on what your program needs: - -| Mode | Code lives in | Banking | Use when | Note | -|---|---|---|---|---| -| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | | -| `small` | W1-W2 (0x4100+) | no | code+data < 30 KB | | -| `big` | W2 + W1 banking | yes (W1) | tiny + extra code modules | | -| `huge` | W1-W2 + W3 banking | yes (W3) | small + extra code modules | | -| `manual` | user-specified | optional | special layouts | Not implemented | - -```sh -sprinter-cc --memory small -o big.exe bigprog.c -sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c -``` - -Banked functions are declared with `__banked`: - -```c -void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped -``` - -## Examples (27 total) - -| Example | What it demonstrates | -|---|---| -| `hello` | Hello world with stdio + conio Turbo-C-style colors | -| `argv` | argv parsing in crt0 | -| `cat` | File I/O ? read & print TEST.TXT | -| `seek` | 32-bit lseek over a 100 KB file | -| `ls` | Directory listing via ffirst/fnext | -| `filetest` | FILE\* streams (fopen/fread/...) | -| `stattest` | `stat`/`fstat` on files and directories | -| `errno` | errno / strerror / perror | -| `mem_test` | Page allocator + bank\_read/bank\_write | -| `malloc` | Heap stress test (200+ allocations) | -| `banked` | Banked code in W3 (huge mode) | -| `bankedbg` | Banked code in W1 (big mode) | -| `banklocl` | Bank-local static data and BSS | -| `mouse` | Mouse driver in text mode | -| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | -| `gfx_demo` | 320?256?256 lines / rects / accelerator | -| `gfx_d16` | 640?256?16 same primitives | -| `gfx_text` | Bitmap-font text on graphics screen | -| `timedir` | Date/time + directory listing | -| `ptime` | POSIX time API | -| `openenv` | open() flags + environment vars | -| `conio` | conio API smoke test | -| `attrprob` | Probe Sprinter text attribute byte layout | -| `strtest` | string.h test (from SDCC's z80.lib) | -| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | -| `assrtest` | assert() | -| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | - -## Headers - -Standard: -* `` ? puts / printf / FILE\* + Sprinter-specific dec/hex helpers -* `` ? atoi / atof / malloc / qsort / ... (from SDCC z80.lib) -* `` / `` / `` ? from SDCC z80.lib -* `` ? read / write / close / lseek / unlink -* `` ? open / creat + O\_RDONLY / O\_CREAT / ... -* `` ? errno + error names + strerror -* `` ? stat / fstat -* `` / `` ? from SDCC - -Sprinter-specific: -* `` ? putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y -* `` ? gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text ? for both 320 and 640 modes (gfx_\*16 variants) -* `` ? full 14-function driver wrapper + mouse_cursor_t with bitmap support -* `` ? chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk -* `` ? getdatetime / setdatetime + POSIX time / localtime / etc. -* `` ? raw ports, ESTEX/BIOS function numbers, env API -* `` ? exit / \_exit / atexit -* `` ? mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write -* `` ? Solid-C compatibility layer (aliases + BOOL/WORD/uint types) - -## Toolchain commands - -```sh -make all # build mkexe + lib + every example -make floppy # repack mame/v306/IMG/mc.img with all .exe files -make check # 17 mkexe unit-tests -make clean # remove all build artefacts -make sdcc # one-time: fetch SDCC 4.5 binary -``` - -### sprinter-cc options - -``` -sprinter-cc -o foo.exe foo.c [more.c ...] [options] - - --memory MODE tiny | small | big | huge | manual (default: tiny) - --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) - --stack-size N bytes reserved for the stack (default ~1278) - --crt0=TYPE default | minimal | banked | small - --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) - --debug enable runtime diagnostics (defines DEBUG_RT) - -I PATH extra include path - -L 0xADDR / -E / -S override load / entry / stack addresses - -Wl FLAG pass FLAG to sdldz80 - --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) - -v verbose -``` - -## Status - -What works in v1.0: -* Compile / link / pack to SprintEXE ? verified on all 27 examples -* Four memory modes (tiny / small / big / huge) -* Graphics (both modes) with accelerator -* Mouse (text + graphics cursor) -* File I/O, directories, environment, time -* All headers listed above - -Deferred to v2.0 (see `docs/TODO.md`): -* **Turbo-C-style BGI graphics API** ? `initgraph` / `setcolor` / `circle` / - `getimage` / `putimage` / etc. on top of our `gfx_*` primitives -* Remaining Solid-C compatibility gaps (Phase 2/3) ? see `docs/solid_c_compatibility.md` -* Manual memory mode -* Rewrite FILE\* stream API (current implementation is very primitive and doesn't use buffers) - -Deferred to v3.0: -* **IM2 interrupt handlers** ? research complete (`docs/im2_isr_design.md`), - implementation scheduled for v3 -* **Audio API** (AY-3-8910 + COVOX) ? requires IM2 -* **ISA-8 slot drivers** ? requires IM2 (???) - -## Documentation - -* `docs/TODO.md` ? roadmap and open work items -* `docs/solid_c_compatibility.md` ? gap analysis vs Solid-C 2004 -* `docs/im2_isr_design.md` ? interrupt handler design (v2) -* `docs/converted/` ? source documentation (ESTEX, BIOS, architecture) - converted to plain text for `grep` -* `docs/reference/`, `docs/samples/`, `docs/memory management/` ? original - Russian docs and code samples from Peters Plus - -## Repository layout - -``` -bin/sprinter-cc one-line compiler driver (bash) -toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE -toolchain/check_banks.py post-link bank size enforcer -runtime/ crt0 variants (default, minimal, small, banked) - bank trampolines, heap, heap_top -libc/include/ headers -libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib -lib/ Makefile that archives libsprinter.lib via sdar -examples/ 27 example programs -mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script -third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) -third_party/solid-c/ reference: original Sprinter native C (for compat target) -docs/ documentation -``` - -## License - -This repository contains: -* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` ? - MIT-licensed. -* `third_party/sdcc/` ? SDCC 4.5 under GPLv2 with linking exception - (see `third_party/sdcc/COPYING.txt`) -* `third_party/solid-c/` ? original Sprinter Solid C, used only as a reference - -## Credits - -* **Sprinter / Peters Plus** ? , ਩ ਭ and the original team -* **SDCC** ? for the underlying Z80 compiler -* **MAME** ? for the Sprinter Sp2000 emulation - ---- - -For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. - ---- - -# TODO / Roadmap - - 浪 뢠 ਮ.  ॠ ணࠬ ? ਮ ᬥ. - -## ⠯ 5 ? malloc / free + banking-aware page allocator ? - -- [x] SDCC's `malloc`/`free` + `runtime/heap.s` ( library heap.rel, 14000- heap 2) -- [x] `libc/mem/mem_alloc.c` ? page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` १ ESTEX `$3C/$3D/$3E` + BIOS `$C4` -- [x] `libc/mem/bank_io.c` ? HOME-१ `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` ᢮ W3 -- [x] `examples/malloc_test/` ? ஢ઠ SDCC's malloc (~210 64- allocations १ heap) -- [x] `examples/mem_test/` ? ஢ઠ page allocator: 3 ࠭, ࠧ १ bank_write, 䨪 १ bank_read - -## ⠯ 6 ? argv parsing + sprinter-cc wrapper ? - -- [x] crt0 ESTEX command-line IX-prefix (inline asm `runtime/crt0.s`) -- [x] Strip leading CP/M-style space (DSS quirk) -- [x] । `argc`/`argv` main() १ HL/DE (SDCC __sdcccall(1) ABI) -- [x] argv[0] = basename .EXE १ ESTEX APPINFO ($47 subfn 2) -- [x] `runtime/crt0_minimal.s` ? opt-out 祭 쪨 ணࠬ -- [x] `runtime/crt0_banked.s` ? ⥯ ⮦ argv (parse_argv + get_progname ᪮஢ crt0.s; 㤥 factored argv.s libsprinter.lib) -- [x] Bash-⪠ `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` - -## ⠯ 8 ? 䨪 (320?256?256 + 640?256?16 + accel + bitmap font) ? - -- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). १ BIOS PIC_SET_PAL ($A4). Verified 320?256?256. -- [x] **8b** /אַ㣮쭨/fill १ accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` १ accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` heuristic 롮஬ ਥ樨 (h/v bursts count), `gfx_line` Bresenham . `gfx_clear` ⮦ ९ᠭ column-major accel (~4? ॥). -- [x] **8c** 640?256?16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (㬥 misleading), per-row RMW vline ( = 2 ਧ⠫ ᥫ). -- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): १ BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` 320 mode, `gfx_text16`/`gfx_putchar16` 640 mode pair-table lookup. - -. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. - - ( ): -- [ ] -quad 640: per-cell (mode 0x82 ࠧ蠥 1 4 per 16?8 cell) ? १ אַ area-ᠭ ࠭ 0x0300..0x039F - -## Auto-banking (. `memory/banking_roadmap.md` ⠫) - -Phase 1 ? file-level bin-packing ? ॠ뢠 ஥ ~30 KB . - -- [ ] `toolchain/auto_bank.py`: - - ࠧ `.rel`-䠩 ( .map ᫥ dry-run link') - - First-fit-decreasing bin-packing - - `#pragma codeseg BANKn` manual override - - ५뢠 묨 `-Wl-b_BANKn=...` ࠬࠬ - - ⠥ । - -Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. 쪮 ᫨/ . - -## Bank-local static data (mutable data ⮬ ) ? ? - -- [x] ਬ `examples/bank_local_data/` ? 㭪 BANK1 ᢮ writable BSS array + const table + malloc- -- [x] `mkexe -p 0` 㫥 padding (BSS-storage 㧪) -- [x] ᪨ 楯: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` bank1.c + `-Wl-b_BANK1=0x1C000` . **`--dataseg BANK1` ** ? ࠭ ⭮ - trampoline bug ᪨஢ १. -- [x] ** 䨪 trampoline'a runtime/bank.s** ? `pop af; out (n), a` ਫ A ? banked-㭪樨 騥 uint8_t 頫 . `pop bc; out (c), b` ࠭ A. -- [x] **malloc banked-㭪樨 ࠡ⠥ ஧筮** ? heap W2 (HOME), W2 ᢠ trampoline', pointer  ⥪. . memory/bank_local_data_pattern.md. -- [x] 㬥 memory: `memory/bank_local_data_pattern.md` ( 楯 + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) -- [ ] 樮쭮 ? `check_banks.py` ⮡ 뢠 ࠧ size = code + const + bss per bank (cosmetic) - -祬: 㫥 訬 private state (level loader, audio engine, scene data). W2 heap , ⨪ . - -## ᪠ solid-c (⨢ Sprinter C ? `third_party/solid-c/`) - -᫥ solid-c'᪮ libc (. `memory/solid_c_findings.md`)  ⮢ ᫥ 㭪権. ਮ **᮪** : - -### High-priority gaps ( ஢, 짠) -- [x] **`errno` + `strerror`/`perror`** ? ⠡窠 32 訡 (libc/io/errno.c) -- [x] **७ `open()`** O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine -- [x] **`atexit`** ? 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) -- [x] **`setjmp`/`longjmp`** ? 6- jmp_buf={sp,ix,pc} (libc/io/setjmp.c) -- [x] **`sleep(seconds)`** ? 50Hz halt-loop (libc/io/sleep.c) -- [x] **ESTEX ENV API** ($46, getenv/putenv) ? libc/io/env.c. 竨 doc-bug: ॠ쭮 A=0 NOT FOUND - -### Medium-priority (㦭 shell-like ⨫) -- [ ] **Mouse driver** ? `rst $30h`, 17 㭪権. **砫 ࠡ⠥ MAME**. -- [x] **`ffirst`/`fnext` + ffblk_t struct** directory listing ? ॠ, demo: ls.exe -- [x] **`getdatetime`/`setdatetime`** १ ESTEX $21/$22 ? libc/io/time.c, demo: time_dir_test -- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** ? wrappers ESTEX $1B-$1E ? libc/io/fsdir.c -- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** ? ॠ -- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros - -### Low-priority ? ? FILE* stack - -- [x] ** unbuffered FILE\*** ? `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr pseudo-streams. . `memory/file_star_design.md` `examples/filetest`. -- [ ] fprintf / fscanf ? 㦭 printf-१-callback machinery. 짮⥫ `sprintf(buf, ...) + fputs(buf, fp)`. -- [ ] 樮 buffered mode (setvbuf, line/block buffering) ? ᫨ - . - -### POSIX time API ? ? -- [x] `libc/io/posix_time.c` ? time/localtime/gmtime/mktime/asctime/ctime getdatetime. SDCC's time.rel ( override _RtcRead). . `examples/ptime`. - -### sys/stat ? ? -- [x] `libc/io/stat.c` ? POSIX stat/fstat. ਤ open+fstat 䠩, ffirst+iter ( "."/".."). . `examples/stattest` `memory/estex_ffirst_dotdot.md`. - -### assert ? ? (ᯮ㥬 SDCC's __assert १ fallback include path) - -## libc/stdlib ? ? 㦭 (. memory/sdcc_stdlib_works.md) - -஢७ १ `examples/stdlib_test/`: SDCC z80.lib ᮤন ࠡ騥 ॠ樨: -- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` -- `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) -- `` (toupper/tolower) -- `` (sinf/cosf/sqrtf/etc.) - - ⮬᪨ ﭥ z80.lib 㦭. ** ९뢠**. - - Sprinter-specific 易⥫ 㫨 : atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. - -## Build-system: libsprinter.lib + sprinter-cc ? ? - -- [x] `lib/Makefile` ? ᮡࠥ libc/*.c `.rel`, 娢 १ sdar `lib/sprinter.lib` -- [x] 砥 runtime/bank.s runtime/heap.s (auto-pulled __banked/malloc) -- [x] `bin/sprinter-cc` ? bash-wrapper: `sprinter-cc -o foo.exe foo.c` ப -- [x] প 権 `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` -- [x] `examples/hello_sccc/` ? : `hello.c` ᮡࠥ shell-맮, ࠧ ᮢ Makefile (925 ) -- [x] Split `putchar.c` ? `putchar.c` + `puts.c` per-function granularity (puts override SDCC's z80.lib version) -- [x] `make all` (ᨬ `lib` । `examples`) - - 襭 (樮쭮): -- [ ] ஢ ⠫ examples sprinter-cc Makefile (ᬥ⨪) -- [ ] 쭥 libc/*.c per-function ( ⥪ granularity 㦥 㦭 ࠧ ? .rel 楫, 設⢠ 䠩 㭪) - -## ⠯ 9 ? memory modes sprinter-cc - -DSS 뤥 ࠭ ࠧ ਫ: < 16 KB ? ࠭, ⠫ 砥 ?࠭ #FF? (read=0xFF, write ). - ⮣ CODE--W1 + DATA--W2 쪮 ணࠬ . . [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). - -- [x] **`tiny`**: (CODE+DATA+⥪) W2. Default. Verified hello/argv/conio/malloc/file/etc. -- [x] **`--memory MODE` 䫠 sprinter-cc**: parser + per-mode 䮫 CODE_LOC/DATA_LOC, override १  `--code-loc`/`--data-loc`. tiny ࠡ⠥; small/big/huge warning' (runtime ⮢). 2026-05-30. -- [x] **`--memory-manual SPEC`**: `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. 2026-05-30. -- [x] **`small` runtime**: `runtime/crt0_small.s` ᯮ ESTEX `$3D GETMEM` + `$3A SETWIN2` ⮡ 뤥 W2-࠭ gsinit. **** BIOS `$C4` ? ⥪ ⮬ ⠯ W1 (boot_stack HOME), BIOS ॡ ⥪ W2. ᫥ SP ४砥 0xBFFE, ⠭ flow. 2026-05-30, verified hello.exe. -- [x] **`small` auto-detect >16 KB ணࠬ**: `crt0_small.s` ⠥ `0xC2` (⥪ ࠭ W2 ? `0xA2`! W1). ᫨ 0xFF ? 뤥 page; DSS 㦥 ᤥ (ணࠬ ᠬ 뫥 W2). crt0 뢠 0..30 KB. mkexe ⠪ ࠧ蠥 HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB 䠩, SETWIN2 path) + 32 KB 䠩 (auto-skip). 2026-05-30. -- [x] **`big` runtime** (tiny + banked code W1): ࠬਧ `crt0_banked.s` + `bank.s` १ `.ifdef BANK_W1` ? 㣮 banking port (0xA2 vs 0xE2), 㣮 load-addr (0x4000 vs 0xC000). sprinter-cc prepend' `BANK_W1 = 1` `--memory big`, । `mkexe -B 0x4000`. ਬ `examples/banked_big/`. 2026-05-30. -- [x] **`huge` runtime** (small + banked code W3): merge W2-detect `crt0_small.s` `crt0_banked.s`. 騩 ਬ `examples/banked/` ⥯ ᯮ MEMORY=huge. 2026-05-30. -- [x] **`--debug` 䫠**: prepend `DEBUG_RT = 1` crt0 + `-DDEBUG_RT` sdcc. 뢠 symbol `_w2_self_allocated` (uint8_t) ? runtime diagnostic ஢ W2. 2026-05-30. - -### -襭 libc crt0 - -** `sprinter.lib`** ࠡ⠥ memory mode ? `.rel`-童 relocatable, SDLD dead-code elimination per-member ( 䨪  `gfx_core.rel` ..). Verified hello vs malloc_test १ map-䠩. - -**`gfx.lib` ⤥쭮 ? 㦥**: dead-code elimination 㦥 ࠡ⠥. - -**`libc_banked` (libc bank HOME)** ? ⮬, HOME (16 KB) user- + libc `huge` mode. १ `--codeseg BANK0` 樨 libc; trade-off: trampoline ~30 横 libc-맮. ਣ: ॠ쭠 ணࠬ HOME budget. - -**HW-ᨬ 㫨 ? `sprinter_home.lib` ⤥쭮.** libc 䨧᪨ W3, ⮬ W3: -- `gfx_*` ? `0xC000+` ᫥ swap W3 video page -- `bank_io` (mem_alloc_pages/bank_read/bank_write) ? swap' W3 १ `OUT (0xE2)` -- 騥 ISR ? 뢠 ਩ W3 㣮 - - huge mode 㫨 HOME (W1). 㤥 `libc_banked`, **६** 뤥塞 `sprinter_home.lib` (HOME-only) `sprinter.lib` (bankable). 쭠 奬: -``` -sprinter_home.lib HOME-only: gfx, bank_io, ISR shims -sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... -sprinter_banked.lib sprinter.lib --codeseg BANK0 ( huge) -``` -ਣ: ॠ `--memory huge` runtime. - -**crt0 ? mode:** -- `crt0.s` ? ⥪騩, **tiny/big**: SP=0xBFFE, argv (W2- 㦥 뤥 DSS). -- `crt0_minimal.s` ? ⥪騩, tiny argv. -- `crt0_small.s` ? **, step 3**: **small/huge**, W2 १ `mem_alloc_pages` gsinit, `0xA2`, ⮬ ⠭ flow. -- `crt0_banked.s` ? ⥪騩, **big**: trampoline-⠡ W3 , CODE W2. -- `crt0_banked_small.s` ? ****: huge = small (W2-alloc) + banked (W3 trampolines). - -sprinter-cc ࠥ crt0 `--memory` mode (ᥩ `--crt0=` override). -- [x] **ࠨ ࠧ ⥪**: 䫠 `sprinter-cc --stack-size BYTES`. Wrapper `heap_top.s` `___sdcc_heap_end = stack_top + 1 - stack_size`, ⤥ .rel per-program. Default ?1278 (heap_top=0xBB00) `runtime/heap_top.s`. 2026-05-30. - -䥩: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` ⮫쪮 `--memory manual`. - -## Known issues / quirks - -- **ESTEX $46 ENV API**: ? ࠡ⠥. - `DiskSyscalls.txt v1.6` 訡筮 뢠 return-status ? A=0 NOT FOUND, FOUND. 䨪஢ `memory/sprinter_platform.md`. - -## V2 (᫥ ५ v1) - -### Turbo-C-style graphics API (BGI-like) ? **MUST v2** - - `gfx_*` API ஢ **Turbo-C ``** (BGI) MS-DOS. -ணࠬ ਢ訥 Turbo-C ७ ᪨ 1--1. - -** ** ( ᭮ Borland BGI): - -Setup/teardown: -- `initgraph()` / `closegraph()` ? ᥩ `gfx_init`/`gfx_done`, alias -- `getmaxx()` / `getmaxy()` ? GFX_WIDTH-1 / GFX_HEIGHT-1 -- `cleardevice()` ? alias to gfx_clear -- `getgraphmode()` / `setgraphmode()` ? get_videomode/set_videomode - -Color/palette: -- `setcolor(c)`, `getcolor()` ? current draw color -- `setbkcolor(c)`, `getbkcolor()` ? background color -- `setpalette(idx, c)` ? entry -- `getpalette(&info)` ? read all palette - -Primitives ( 㦥 ? BGI- aliases): -- `putpixel(x, y, c)` ? gfx_putpixel -- `getpixel(x, y)` ? 㦭 ॠ (RMW ⭮ ? IN) -- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` ? current point + line drawing -- `line(x1, y1, x2, y2)` ? gfx_line -- `rectangle(x1, y1, x2, y2)` ? gfx_rect ( 㣮 API: x1,y1,x2,y2 vs x,y,w,h!) -- `bar(x1, y1, x2, y2)` ? gfx_fill_rect -- `bar3d(x1, y1, x2, y2, depth, topflag)` ? : rect + 3d edges -- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` ? primitives -- `fillpoly()`, `drawpoly()` ? -- `floodfill(x, y, border_color)` ? - -Text on graphics screen: -- `outtext(s)` / `outtextxy(x, y, s)` ? gfx_text (alias) -- `settextstyle(font, dir, size)` ? multiple bitmap fonts -- `gettextsettings(&info)` -- `textwidth(s)` / `textheight(s)` ? measure - -Image manipulation: -- `imagesize(x1, y1, x2, y2)` ? bytes needed for getimage -- `getimage(x1, y1, x2, y2, buf)` ? save rect to buffer -- `putimage(x, y, buf, op)` ? paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT - -Clipping/viewport: -- `setviewport(x1, y1, x2, y2, clip)` ? drawing clip rect -- `getviewsettings(&info)` -- `clearviewport()` -- `setactivepage(p)` / `setvisualpage(p)` ? ਧ (Sprinter 2 screen) - -Line style: -- `setlinestyle(style, pattern, thickness)` ? SOLID_LINE / DOTTED_LINE / etc. -- `getlinesettings(&info)` - -**Acceptance:** ७ ⨯筮 Turbo-C BGI ணࠬ (饩 ᯮ짮 -moveto/lineto/circle/bar/setcolor) ࠡ ⢥ ࠢ. - -**Notes:** -- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) ? BIOS font, ⠫ 㦭 - ( bitmap data lib) -- imagesize/getimage/putimage ? ᠬ ॡ game/animation -- Active/visual page ( ਧ) ? Sprinter ন 2 graphics pages, - 㦥 API switching - -. ⠪ `examples/` Turbo C 2.x BGIDEMO reference 㦭. - -### IM2 Interrupt Handlers ? **MUST v2** - -User- ISR १ Z80 IM 2 mode. 㦭 : -- Timer ticks (50 Hz frame counter, ) -- Music playback (AY, COVOX) -- Real-time games (input + game logic + render interrupt-driven) -- Async keyboard / mouse handling - -**Status:** v2. research + design `docs/im2_isr_design.md`. - -**襭 ⥪:** ॠ ⤥ memory mode `--memory im2` -( ⮣ ⮡ 騥 crt0). Detail' design-doc. - -** research'** ( ⥪ `docs/im2_isr_design.md`): -- Vector 0xFF ? frame + keyboard + CBL. Disambiguation ⠬ 0x19 / 0xFE -- Mouse hardware-IRQ 室 ( ⥪饩 ) -- Vector table / ISR / stack W2 (0x8000..0xBFFF) -- DSS ᢮ IM 2 handler ? 㦭 chain' ( / SYSTIME ) - -### 稥 㯭 㭪 v2 - -- [ ] **FILE API rewrite ? buffered streams** ? ⥪ ॠ - `libc/stdio/file.c` provisional unbuffered shim ( fputc/fgetc - = read/write syscall). 㦭 業 buffered ᥬ⨪ - Solid-C: - - ```c - typedef struct { - uint flags; // +0..1 file status flags - int level; // +2..3 empty/fill level of buffer - char *curp; // +4..5 current active pointer - int fd; // +6..7 underlying low-level fd - char *buffer; // +8..9 data transfer buffer - char hold; // +10 ungetc byte if no buffer - short token; // +11..12 reserved - char dummy; // +13 reserved - } FILE; - ``` - - stdin/stdout/stderr ? fd-થ `0 / -1 / -2`. ⥫ - stdout/stderr ࠭ ७: ESTEX OPEN positive - small fd (1, 2, ?) 筮 䠩 ? ᫨ stdout=1, ॠ - fd=1 ⠫ 䨪஬. fd=0 stdin ᭮ - (ESTEX 0 頥). fd । syscall' ? - ᯥਧ 䫠 `_F_CONIN/_F_CONOUT`. - - ਭ-⮪ (stdaux/stdprn) ॠ㥬 ? Sprinter ਭ୮ - API . - - ୠ⨢ ? ॠ third_party/solid-c (sources - `SRC/CLIB/`); ⠬ ⮢ buffered FILE + fopen/fread/fwrite/ - fseek/setvbuf .. ஢ 訬 open/read/write/lseek. - - rewrite deferred issues stdio-review: - - `fwrite` short-write ⠢ `_F_ERROR` - - `fgets(buf, 1, fp)` ? ⠭ "empty string", 㫨 NULL - - `mode_to_flags` ? break-out '+' (cosmetic) - -- [ ] **Audio API** ? AY-3-8910 + COVOX १ 뢠 (ॡ IM2) -- [ ] **ISA-8 slot support** ? ZX-Bus (sound, network, etc.) ? ॡ IM2 + ⥭ port - -## 稥 (v1 backlog, 騥) - -- [x] **#9: text I/O split (Turbo-C style)** ? stdio (puts/printf/putchar) ⥯ fast no-attr १ PCHARS/PUTCHAR. conio (cputs/cprintf/putch) ਬ attr १ textcolor/textbackground/textattr. KEEP_EXIST_ATTR ? conio fallback fast path. Verified hello.exe. . `memory/text_output_api_split.md`. 2026-05-31. -- [x] **Mouse API ** (१ driver, RST 30h) ? 14 㭪権 (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). . `memory/mouse_api.md`. Verified MAME 2026-05-31. Sensitivity = divider ( = ॥). -- [ ] Interrupt handlers ? IM 2 vector table HOME user ISR' -- [ ] প `restore SP on EXIT` ( z88dk +pps) ? ஢ 㦭 -- [ ] CI: ⮬᪨ ᪠ MAME `-aviwrite` screenshot-ࠢ, ⮡ ਬ஢ 室 祫 - -## ⮬ - -- প `` ( SDCC stdlib ? 㦭 ஢ crt0 ᮢ⨬) -- `` १ ESTEX SYSTIME (`$21`) CMOS BIOS-㭪樨 -- ZX Spectrum-ᮢ⨬ ० ⤥ target ( ஢ ᯥ㬮᪨ ணࠬ) -- প ZX-Bus (sound, network, etc.) ? 㦭 ࠩ -- Profile-guided optimization tools (hot/cold detection) 㯭 ணࠬ - -## Linker duplicate-symbol warnings (, 䨫஢) - - ᮧ⥫쭮 overrides' SDCC z80.lib 㭪樨 ᮡ⢥ ᨥ `sprinter.lib`, `sdldz80` `?ASlink-Warning-Definition of public symbol '...' found more than once`. ࢮ । (), ⮬ ४⭮ ? warning ⮫쪮 noise. - -騥 overrides: -- `_puts` ? १ PCHARS+\r\n vs SDCC posix puts -- `___sdcc_heap` ? heap W2 vs SDCC's ⠭ -- `_asctime`, `_localtime` ( 㣨 time) ? `posix_time.c` १ ESTEX SYSTIME vs SDCC's `time.rel` `_RtcRead` - -**饥 襭:** `bin/sprinter-cc` 䨫஢뢠 warning- (warning + 2 follow-up `Library:` ப) 뢮 `sdcc`. १ `-v` (verbose) 뢠. १ awk-pipe. - -** 襭:** -- ३ explicit `--nostdlib` + 筮 ᯨ᮪ 㦭 㫥 z80.lib (string, math, stdlib override') ? warning', ᪨஢ -- : २ `_puts` ? `_puts_sprinter` + alias १ linker flag ( 㢥७ SDCC ন) -- : ⠢ ᥩ (ࠡ祥 benign) ? ਮ - -## TODO: ஢ ॠ쭮 - -- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): - ⢥ত ᫥ `OUT (0x89), Y` 0xC000+0x400*N W3 - ப Y..Y+15 ( ணࠬ஢ ? 16 ப). - Empirical 2026-06-01 MAME 0.283 trick ** ࠡ⠥** ? ᥫ - ᠬ 0xC000+row_width 室 . ᪨ - `docs/samples/plasma2.asm` ⮦ ᯮ banking, ⠭ - Port_Y per row. - : - 1. ॠ쭮 Sprinter - 2. dual-write (`_gfx_putpixel_raw` + ன write `0xD000+x`) - 3. ᫨ ? MAME, issue - ९ - 4. ᫨ ⮦ ? 㬥 , 㤠 㯮 - ⠢ ⥪ ॠ (Port_Y per pixel) - 5. ᫨ banking ࠡ⠥ ? ஢ Port_Y - `_gfx_putpixel_raw` (sentinel out-of-range, . memory/gfx_port_y_banking.md) - - 易 먣 Bresenham (60-pixel ) ? 8? - OUT (0x89) 権, `gfx_fill_rect 320x256` ? 16? . - release v1. - -## GFX: ७ `docs/part2/accelerator_doc.txt` - -᫥ ⥭ ⠫쭮 accelerator doc  ࠢ. - ᯮ ⮫쪮 ਧ⠫/⨪ Fill mode. - -### Quick wins ⥪ primitives - -- [ ] ** SMC `LD A, (var)` block-size**. 㬥  - ࠧ蠥 `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` ( `LD A, r`). - 㡥 SMC complexity `gfx_lines.c:hfill_chunk/vfill_chunk` - `gfx_16.c:g16_hfill_chunk`. 饭 ⮫쪮 register-to-register. -- [ ] **஢ block-size**. 㬥 뢠 accel - block size bursts (. `Horizontal_Line_Fill`: ⠭ - size + `LD B,B` ⪫祭, ⮬ Fill mode ᯮ - ࠭ size). `gfx_fill_rect` 100 묨 - ப ? ⠭ size 1 ࠧ, 100. - -### Bank-prefix modes (port 0xE2 bits) - -㬥 뢠 ਠ ࠭ ⠭⭮ 0x50: - -| Bank byte | Effect | -|---|---| -| 0x50 | Normal write ? shadow + | -| 0x54 | "no copy in main shadow RAM" | -| 0x58 | **"FF is transparent"** ? 0xFF write ⠢ background | -| 0x5C | both | - -Bank 0x58 祬 mouse cursor 0xFF-஧筮. - **sprite-blending १ accel block copy**: - -- [ ] **`gfx_set_bank_transparent(on)`** 䫠 `gfx_set_bank` - 롮 0x50/0x58 ᮢ sprite' -- [ ] ᯮ짮 `gfx_blit()` ⮡ 䠪 - transparent sprites १ accel- - -### Block copy mode (sprite blit') - -`LD L,L` (horizontal) `LD A,A` (vertical) ? ० ஢ १ -256- accel memory. blit'. - -- [ ] **`gfx_blit(src_data, x, y, w, h)`** ? ஢ sprite' - (ந ࠧ, १ accel) -- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** ? ᯮ짮 bank 0x58 - -. `Draw_Restangle_Data` accelerator_doc.txt ७. - -### AND / OR / XOR operations १ accel - -㬥 뢠 accel ন ᪨ 樨 -. ਬ: -- XOR ? (뤥 selection UI) -- OR / AND ? masking, alpha-style blending -- . ਬ accelerator_doc.txt: "256 bytes block coding via XOR" - -- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** ? - ਬ⨢ ᪨ 権 אַ㣮쭨 -- [ ] **`gfx_invert_rect(x, y, w, h)`** ? alias xor 0xFF - -### Bitmap fonts ࠧ ࠧ஢ - - `gfx_text` / `gfx_putchar` प ࠡ 8?8 ⮬ -(BIOS WIN_GET_ZG 頥 256?8 ). UI / 쭨 -㦭: -- [ ] **`gfx_set_font_size(w, h)`** ? ४ ਭ/ glyph' -- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** ? 㪠⥫ - 짮⥫᪨ + ࠧ -- [ ] প **proportional** (advance != w) ⮢ ? - array advance[256] ਭ glyph' -- [ ] **Big-font ०**: 8?16, 16?16, 16?8 ( 쭨) -- [ ] ⤥ API `gfx_text_ex(x, y, str, font_id)` - font_id 롨ࠥ 㦥 ⮢ -- [ ] **Anti-alias 2-bit ** ( 䮭 / ࠭ / 2- alpha?) - ? far future, smooth UI - -## ⠯ ⨬権 ( ᥩ) - -- **`gfx_line` १ accel ** ? Bresenham |dy| << |dx| ( ) 뤠 runs Y ( X): ᥫ, ᥫ, ᥫ, 蠣 Y, ᥫ, ᥫ... ⠪ run ? ⮢ 㬥 `gfx_hline` ( `vline`). - ᫥: runs 㭪 ; run length, ஬ 룮 accel hline 祬 N?putpixel (overhead accel ~20?s, putpixel ~5?s ? accel 룮 run ? 4-5 px); (dx ? dy) ⠢ Bresenham, ? run-length-based fill. - `gfx_line` orthogonal cases 㦥 १ accel ? ⨬஢ ⮫쪮 . - -- **`gfx_fill_rect` W3-swap ** ? ᥩ ७ `gfx_hline`/`gfx_vline` ᢮ DI/save-W3/restore-W3/EI. ᤥ internal `_fill_rect_inner` ন W3 DI 横; ~20?s ? ⢮ ப/⮫殢 . ਬ ᥬ ਬ⨢. diff --git a/examples/mdview2/testfiles/LINES.MD b/examples/mdview2/testfiles/LINES.MD deleted file mode 100644 index 80273ed..0000000 --- a/examples/mdview2/testfiles/LINES.MD +++ /dev/null @@ -1,25004 +0,0 @@ -# Short lines test - line limit trigger - -``` -row 00001 -row 00002 -row 00003 -row 00004 -row 00005 -row 00006 -row 00007 -row 00008 -row 00009 -row 00010 -row 00011 -row 00012 -row 00013 -row 00014 -row 00015 -row 00016 -row 00017 -row 00018 -row 00019 -row 00020 -row 00021 -row 00022 -row 00023 -row 00024 -row 00025 -row 00026 -row 00027 -row 00028 -row 00029 -row 00030 -row 00031 -row 00032 -row 00033 -row 00034 -row 00035 -row 00036 -row 00037 -row 00038 -row 00039 -row 00040 -row 00041 -row 00042 -row 00043 -row 00044 -row 00045 -row 00046 -row 00047 -row 00048 -row 00049 -row 00050 -row 00051 -row 00052 -row 00053 -row 00054 -row 00055 -row 00056 -row 00057 -row 00058 -row 00059 -row 00060 -row 00061 -row 00062 -row 00063 -row 00064 -row 00065 -row 00066 -row 00067 -row 00068 -row 00069 -row 00070 -row 00071 -row 00072 -row 00073 -row 00074 -row 00075 -row 00076 -row 00077 -row 00078 -row 00079 -row 00080 -row 00081 -row 00082 -row 00083 -row 00084 -row 00085 -row 00086 -row 00087 -row 00088 -row 00089 -row 00090 -row 00091 -row 00092 -row 00093 -row 00094 -row 00095 -row 00096 -row 00097 -row 00098 -row 00099 -row 00100 -row 00101 -row 00102 -row 00103 -row 00104 -row 00105 -row 00106 -row 00107 -row 00108 -row 00109 -row 00110 -row 00111 -row 00112 -row 00113 -row 00114 -row 00115 -row 00116 -row 00117 -row 00118 -row 00119 -row 00120 -row 00121 -row 00122 -row 00123 -row 00124 -row 00125 -row 00126 -row 00127 -row 00128 -row 00129 -row 00130 -row 00131 -row 00132 -row 00133 -row 00134 -row 00135 -row 00136 -row 00137 -row 00138 -row 00139 -row 00140 -row 00141 -row 00142 -row 00143 -row 00144 -row 00145 -row 00146 -row 00147 -row 00148 -row 00149 -row 00150 -row 00151 -row 00152 -row 00153 -row 00154 -row 00155 -row 00156 -row 00157 -row 00158 -row 00159 -row 00160 -row 00161 -row 00162 -row 00163 -row 00164 -row 00165 -row 00166 -row 00167 -row 00168 -row 00169 -row 00170 -row 00171 -row 00172 -row 00173 -row 00174 -row 00175 -row 00176 -row 00177 -row 00178 -row 00179 -row 00180 -row 00181 -row 00182 -row 00183 -row 00184 -row 00185 -row 00186 -row 00187 -row 00188 -row 00189 -row 00190 -row 00191 -row 00192 -row 00193 -row 00194 -row 00195 -row 00196 -row 00197 -row 00198 -row 00199 -row 00200 -row 00201 -row 00202 -row 00203 -row 00204 -row 00205 -row 00206 -row 00207 -row 00208 -row 00209 -row 00210 -row 00211 -row 00212 -row 00213 -row 00214 -row 00215 -row 00216 -row 00217 -row 00218 -row 00219 -row 00220 -row 00221 -row 00222 -row 00223 -row 00224 -row 00225 -row 00226 -row 00227 -row 00228 -row 00229 -row 00230 -row 00231 -row 00232 -row 00233 -row 00234 -row 00235 -row 00236 -row 00237 -row 00238 -row 00239 -row 00240 -row 00241 -row 00242 -row 00243 -row 00244 -row 00245 -row 00246 -row 00247 -row 00248 -row 00249 -row 00250 -row 00251 -row 00252 -row 00253 -row 00254 -row 00255 -row 00256 -row 00257 -row 00258 -row 00259 -row 00260 -row 00261 -row 00262 -row 00263 -row 00264 -row 00265 -row 00266 -row 00267 -row 00268 -row 00269 -row 00270 -row 00271 -row 00272 -row 00273 -row 00274 -row 00275 -row 00276 -row 00277 -row 00278 -row 00279 -row 00280 -row 00281 -row 00282 -row 00283 -row 00284 -row 00285 -row 00286 -row 00287 -row 00288 -row 00289 -row 00290 -row 00291 -row 00292 -row 00293 -row 00294 -row 00295 -row 00296 -row 00297 -row 00298 -row 00299 -row 00300 -row 00301 -row 00302 -row 00303 -row 00304 -row 00305 -row 00306 -row 00307 -row 00308 -row 00309 -row 00310 -row 00311 -row 00312 -row 00313 -row 00314 -row 00315 -row 00316 -row 00317 -row 00318 -row 00319 -row 00320 -row 00321 -row 00322 -row 00323 -row 00324 -row 00325 -row 00326 -row 00327 -row 00328 -row 00329 -row 00330 -row 00331 -row 00332 -row 00333 -row 00334 -row 00335 -row 00336 -row 00337 -row 00338 -row 00339 -row 00340 -row 00341 -row 00342 -row 00343 -row 00344 -row 00345 -row 00346 -row 00347 -row 00348 -row 00349 -row 00350 -row 00351 -row 00352 -row 00353 -row 00354 -row 00355 -row 00356 -row 00357 -row 00358 -row 00359 -row 00360 -row 00361 -row 00362 -row 00363 -row 00364 -row 00365 -row 00366 -row 00367 -row 00368 -row 00369 -row 00370 -row 00371 -row 00372 -row 00373 -row 00374 -row 00375 -row 00376 -row 00377 -row 00378 -row 00379 -row 00380 -row 00381 -row 00382 -row 00383 -row 00384 -row 00385 -row 00386 -row 00387 -row 00388 -row 00389 -row 00390 -row 00391 -row 00392 -row 00393 -row 00394 -row 00395 -row 00396 -row 00397 -row 00398 -row 00399 -row 00400 -row 00401 -row 00402 -row 00403 -row 00404 -row 00405 -row 00406 -row 00407 -row 00408 -row 00409 -row 00410 -row 00411 -row 00412 -row 00413 -row 00414 -row 00415 -row 00416 -row 00417 -row 00418 -row 00419 -row 00420 -row 00421 -row 00422 -row 00423 -row 00424 -row 00425 -row 00426 -row 00427 -row 00428 -row 00429 -row 00430 -row 00431 -row 00432 -row 00433 -row 00434 -row 00435 -row 00436 -row 00437 -row 00438 -row 00439 -row 00440 -row 00441 -row 00442 -row 00443 -row 00444 -row 00445 -row 00446 -row 00447 -row 00448 -row 00449 -row 00450 -row 00451 -row 00452 -row 00453 -row 00454 -row 00455 -row 00456 -row 00457 -row 00458 -row 00459 -row 00460 -row 00461 -row 00462 -row 00463 -row 00464 -row 00465 -row 00466 -row 00467 -row 00468 -row 00469 -row 00470 -row 00471 -row 00472 -row 00473 -row 00474 -row 00475 -row 00476 -row 00477 -row 00478 -row 00479 -row 00480 -row 00481 -row 00482 -row 00483 -row 00484 -row 00485 -row 00486 -row 00487 -row 00488 -row 00489 -row 00490 -row 00491 -row 00492 -row 00493 -row 00494 -row 00495 -row 00496 -row 00497 -row 00498 -row 00499 -row 00500 -row 00501 -row 00502 -row 00503 -row 00504 -row 00505 -row 00506 -row 00507 -row 00508 -row 00509 -row 00510 -row 00511 -row 00512 -row 00513 -row 00514 -row 00515 -row 00516 -row 00517 -row 00518 -row 00519 -row 00520 -row 00521 -row 00522 -row 00523 -row 00524 -row 00525 -row 00526 -row 00527 -row 00528 -row 00529 -row 00530 -row 00531 -row 00532 -row 00533 -row 00534 -row 00535 -row 00536 -row 00537 -row 00538 -row 00539 -row 00540 -row 00541 -row 00542 -row 00543 -row 00544 -row 00545 -row 00546 -row 00547 -row 00548 -row 00549 -row 00550 -row 00551 -row 00552 -row 00553 -row 00554 -row 00555 -row 00556 -row 00557 -row 00558 -row 00559 -row 00560 -row 00561 -row 00562 -row 00563 -row 00564 -row 00565 -row 00566 -row 00567 -row 00568 -row 00569 -row 00570 -row 00571 -row 00572 -row 00573 -row 00574 -row 00575 -row 00576 -row 00577 -row 00578 -row 00579 -row 00580 -row 00581 -row 00582 -row 00583 -row 00584 -row 00585 -row 00586 -row 00587 -row 00588 -row 00589 -row 00590 -row 00591 -row 00592 -row 00593 -row 00594 -row 00595 -row 00596 -row 00597 -row 00598 -row 00599 -row 00600 -row 00601 -row 00602 -row 00603 -row 00604 -row 00605 -row 00606 -row 00607 -row 00608 -row 00609 -row 00610 -row 00611 -row 00612 -row 00613 -row 00614 -row 00615 -row 00616 -row 00617 -row 00618 -row 00619 -row 00620 -row 00621 -row 00622 -row 00623 -row 00624 -row 00625 -row 00626 -row 00627 -row 00628 -row 00629 -row 00630 -row 00631 -row 00632 -row 00633 -row 00634 -row 00635 -row 00636 -row 00637 -row 00638 -row 00639 -row 00640 -row 00641 -row 00642 -row 00643 -row 00644 -row 00645 -row 00646 -row 00647 -row 00648 -row 00649 -row 00650 -row 00651 -row 00652 -row 00653 -row 00654 -row 00655 -row 00656 -row 00657 -row 00658 -row 00659 -row 00660 -row 00661 -row 00662 -row 00663 -row 00664 -row 00665 -row 00666 -row 00667 -row 00668 -row 00669 -row 00670 -row 00671 -row 00672 -row 00673 -row 00674 -row 00675 -row 00676 -row 00677 -row 00678 -row 00679 -row 00680 -row 00681 -row 00682 -row 00683 -row 00684 -row 00685 -row 00686 -row 00687 -row 00688 -row 00689 -row 00690 -row 00691 -row 00692 -row 00693 -row 00694 -row 00695 -row 00696 -row 00697 -row 00698 -row 00699 -row 00700 -row 00701 -row 00702 -row 00703 -row 00704 -row 00705 -row 00706 -row 00707 -row 00708 -row 00709 -row 00710 -row 00711 -row 00712 -row 00713 -row 00714 -row 00715 -row 00716 -row 00717 -row 00718 -row 00719 -row 00720 -row 00721 -row 00722 -row 00723 -row 00724 -row 00725 -row 00726 -row 00727 -row 00728 -row 00729 -row 00730 -row 00731 -row 00732 -row 00733 -row 00734 -row 00735 -row 00736 -row 00737 -row 00738 -row 00739 -row 00740 -row 00741 -row 00742 -row 00743 -row 00744 -row 00745 -row 00746 -row 00747 -row 00748 -row 00749 -row 00750 -row 00751 -row 00752 -row 00753 -row 00754 -row 00755 -row 00756 -row 00757 -row 00758 -row 00759 -row 00760 -row 00761 -row 00762 -row 00763 -row 00764 -row 00765 -row 00766 -row 00767 -row 00768 -row 00769 -row 00770 -row 00771 -row 00772 -row 00773 -row 00774 -row 00775 -row 00776 -row 00777 -row 00778 -row 00779 -row 00780 -row 00781 -row 00782 -row 00783 -row 00784 -row 00785 -row 00786 -row 00787 -row 00788 -row 00789 -row 00790 -row 00791 -row 00792 -row 00793 -row 00794 -row 00795 -row 00796 -row 00797 -row 00798 -row 00799 -row 00800 -row 00801 -row 00802 -row 00803 -row 00804 -row 00805 -row 00806 -row 00807 -row 00808 -row 00809 -row 00810 -row 00811 -row 00812 -row 00813 -row 00814 -row 00815 -row 00816 -row 00817 -row 00818 -row 00819 -row 00820 -row 00821 -row 00822 -row 00823 -row 00824 -row 00825 -row 00826 -row 00827 -row 00828 -row 00829 -row 00830 -row 00831 -row 00832 -row 00833 -row 00834 -row 00835 -row 00836 -row 00837 -row 00838 -row 00839 -row 00840 -row 00841 -row 00842 -row 00843 -row 00844 -row 00845 -row 00846 -row 00847 -row 00848 -row 00849 -row 00850 -row 00851 -row 00852 -row 00853 -row 00854 -row 00855 -row 00856 -row 00857 -row 00858 -row 00859 -row 00860 -row 00861 -row 00862 -row 00863 -row 00864 -row 00865 -row 00866 -row 00867 -row 00868 -row 00869 -row 00870 -row 00871 -row 00872 -row 00873 -row 00874 -row 00875 -row 00876 -row 00877 -row 00878 -row 00879 -row 00880 -row 00881 -row 00882 -row 00883 -row 00884 -row 00885 -row 00886 -row 00887 -row 00888 -row 00889 -row 00890 -row 00891 -row 00892 -row 00893 -row 00894 -row 00895 -row 00896 -row 00897 -row 00898 -row 00899 -row 00900 -row 00901 -row 00902 -row 00903 -row 00904 -row 00905 -row 00906 -row 00907 -row 00908 -row 00909 -row 00910 -row 00911 -row 00912 -row 00913 -row 00914 -row 00915 -row 00916 -row 00917 -row 00918 -row 00919 -row 00920 -row 00921 -row 00922 -row 00923 -row 00924 -row 00925 -row 00926 -row 00927 -row 00928 -row 00929 -row 00930 -row 00931 -row 00932 -row 00933 -row 00934 -row 00935 -row 00936 -row 00937 -row 00938 -row 00939 -row 00940 -row 00941 -row 00942 -row 00943 -row 00944 -row 00945 -row 00946 -row 00947 -row 00948 -row 00949 -row 00950 -row 00951 -row 00952 -row 00953 -row 00954 -row 00955 -row 00956 -row 00957 -row 00958 -row 00959 -row 00960 -row 00961 -row 00962 -row 00963 -row 00964 -row 00965 -row 00966 -row 00967 -row 00968 -row 00969 -row 00970 -row 00971 -row 00972 -row 00973 -row 00974 -row 00975 -row 00976 -row 00977 -row 00978 -row 00979 -row 00980 -row 00981 -row 00982 -row 00983 -row 00984 -row 00985 -row 00986 -row 00987 -row 00988 -row 00989 -row 00990 -row 00991 -row 00992 -row 00993 -row 00994 -row 00995 -row 00996 -row 00997 -row 00998 -row 00999 -row 01000 -row 01001 -row 01002 -row 01003 -row 01004 -row 01005 -row 01006 -row 01007 -row 01008 -row 01009 -row 01010 -row 01011 -row 01012 -row 01013 -row 01014 -row 01015 -row 01016 -row 01017 -row 01018 -row 01019 -row 01020 -row 01021 -row 01022 -row 01023 -row 01024 -row 01025 -row 01026 -row 01027 -row 01028 -row 01029 -row 01030 -row 01031 -row 01032 -row 01033 -row 01034 -row 01035 -row 01036 -row 01037 -row 01038 -row 01039 -row 01040 -row 01041 -row 01042 -row 01043 -row 01044 -row 01045 -row 01046 -row 01047 -row 01048 -row 01049 -row 01050 -row 01051 -row 01052 -row 01053 -row 01054 -row 01055 -row 01056 -row 01057 -row 01058 -row 01059 -row 01060 -row 01061 -row 01062 -row 01063 -row 01064 -row 01065 -row 01066 -row 01067 -row 01068 -row 01069 -row 01070 -row 01071 -row 01072 -row 01073 -row 01074 -row 01075 -row 01076 -row 01077 -row 01078 -row 01079 -row 01080 -row 01081 -row 01082 -row 01083 -row 01084 -row 01085 -row 01086 -row 01087 -row 01088 -row 01089 -row 01090 -row 01091 -row 01092 -row 01093 -row 01094 -row 01095 -row 01096 -row 01097 -row 01098 -row 01099 -row 01100 -row 01101 -row 01102 -row 01103 -row 01104 -row 01105 -row 01106 -row 01107 -row 01108 -row 01109 -row 01110 -row 01111 -row 01112 -row 01113 -row 01114 -row 01115 -row 01116 -row 01117 -row 01118 -row 01119 -row 01120 -row 01121 -row 01122 -row 01123 -row 01124 -row 01125 -row 01126 -row 01127 -row 01128 -row 01129 -row 01130 -row 01131 -row 01132 -row 01133 -row 01134 -row 01135 -row 01136 -row 01137 -row 01138 -row 01139 -row 01140 -row 01141 -row 01142 -row 01143 -row 01144 -row 01145 -row 01146 -row 01147 -row 01148 -row 01149 -row 01150 -row 01151 -row 01152 -row 01153 -row 01154 -row 01155 -row 01156 -row 01157 -row 01158 -row 01159 -row 01160 -row 01161 -row 01162 -row 01163 -row 01164 -row 01165 -row 01166 -row 01167 -row 01168 -row 01169 -row 01170 -row 01171 -row 01172 -row 01173 -row 01174 -row 01175 -row 01176 -row 01177 -row 01178 -row 01179 -row 01180 -row 01181 -row 01182 -row 01183 -row 01184 -row 01185 -row 01186 -row 01187 -row 01188 -row 01189 -row 01190 -row 01191 -row 01192 -row 01193 -row 01194 -row 01195 -row 01196 -row 01197 -row 01198 -row 01199 -row 01200 -row 01201 -row 01202 -row 01203 -row 01204 -row 01205 -row 01206 -row 01207 -row 01208 -row 01209 -row 01210 -row 01211 -row 01212 -row 01213 -row 01214 -row 01215 -row 01216 -row 01217 -row 01218 -row 01219 -row 01220 -row 01221 -row 01222 -row 01223 -row 01224 -row 01225 -row 01226 -row 01227 -row 01228 -row 01229 -row 01230 -row 01231 -row 01232 -row 01233 -row 01234 -row 01235 -row 01236 -row 01237 -row 01238 -row 01239 -row 01240 -row 01241 -row 01242 -row 01243 -row 01244 -row 01245 -row 01246 -row 01247 -row 01248 -row 01249 -row 01250 -row 01251 -row 01252 -row 01253 -row 01254 -row 01255 -row 01256 -row 01257 -row 01258 -row 01259 -row 01260 -row 01261 -row 01262 -row 01263 -row 01264 -row 01265 -row 01266 -row 01267 -row 01268 -row 01269 -row 01270 -row 01271 -row 01272 -row 01273 -row 01274 -row 01275 -row 01276 -row 01277 -row 01278 -row 01279 -row 01280 -row 01281 -row 01282 -row 01283 -row 01284 -row 01285 -row 01286 -row 01287 -row 01288 -row 01289 -row 01290 -row 01291 -row 01292 -row 01293 -row 01294 -row 01295 -row 01296 -row 01297 -row 01298 -row 01299 -row 01300 -row 01301 -row 01302 -row 01303 -row 01304 -row 01305 -row 01306 -row 01307 -row 01308 -row 01309 -row 01310 -row 01311 -row 01312 -row 01313 -row 01314 -row 01315 -row 01316 -row 01317 -row 01318 -row 01319 -row 01320 -row 01321 -row 01322 -row 01323 -row 01324 -row 01325 -row 01326 -row 01327 -row 01328 -row 01329 -row 01330 -row 01331 -row 01332 -row 01333 -row 01334 -row 01335 -row 01336 -row 01337 -row 01338 -row 01339 -row 01340 -row 01341 -row 01342 -row 01343 -row 01344 -row 01345 -row 01346 -row 01347 -row 01348 -row 01349 -row 01350 -row 01351 -row 01352 -row 01353 -row 01354 -row 01355 -row 01356 -row 01357 -row 01358 -row 01359 -row 01360 -row 01361 -row 01362 -row 01363 -row 01364 -row 01365 -row 01366 -row 01367 -row 01368 -row 01369 -row 01370 -row 01371 -row 01372 -row 01373 -row 01374 -row 01375 -row 01376 -row 01377 -row 01378 -row 01379 -row 01380 -row 01381 -row 01382 -row 01383 -row 01384 -row 01385 -row 01386 -row 01387 -row 01388 -row 01389 -row 01390 -row 01391 -row 01392 -row 01393 -row 01394 -row 01395 -row 01396 -row 01397 -row 01398 -row 01399 -row 01400 -row 01401 -row 01402 -row 01403 -row 01404 -row 01405 -row 01406 -row 01407 -row 01408 -row 01409 -row 01410 -row 01411 -row 01412 -row 01413 -row 01414 -row 01415 -row 01416 -row 01417 -row 01418 -row 01419 -row 01420 -row 01421 -row 01422 -row 01423 -row 01424 -row 01425 -row 01426 -row 01427 -row 01428 -row 01429 -row 01430 -row 01431 -row 01432 -row 01433 -row 01434 -row 01435 -row 01436 -row 01437 -row 01438 -row 01439 -row 01440 -row 01441 -row 01442 -row 01443 -row 01444 -row 01445 -row 01446 -row 01447 -row 01448 -row 01449 -row 01450 -row 01451 -row 01452 -row 01453 -row 01454 -row 01455 -row 01456 -row 01457 -row 01458 -row 01459 -row 01460 -row 01461 -row 01462 -row 01463 -row 01464 -row 01465 -row 01466 -row 01467 -row 01468 -row 01469 -row 01470 -row 01471 -row 01472 -row 01473 -row 01474 -row 01475 -row 01476 -row 01477 -row 01478 -row 01479 -row 01480 -row 01481 -row 01482 -row 01483 -row 01484 -row 01485 -row 01486 -row 01487 -row 01488 -row 01489 -row 01490 -row 01491 -row 01492 -row 01493 -row 01494 -row 01495 -row 01496 -row 01497 -row 01498 -row 01499 -row 01500 -row 01501 -row 01502 -row 01503 -row 01504 -row 01505 -row 01506 -row 01507 -row 01508 -row 01509 -row 01510 -row 01511 -row 01512 -row 01513 -row 01514 -row 01515 -row 01516 -row 01517 -row 01518 -row 01519 -row 01520 -row 01521 -row 01522 -row 01523 -row 01524 -row 01525 -row 01526 -row 01527 -row 01528 -row 01529 -row 01530 -row 01531 -row 01532 -row 01533 -row 01534 -row 01535 -row 01536 -row 01537 -row 01538 -row 01539 -row 01540 -row 01541 -row 01542 -row 01543 -row 01544 -row 01545 -row 01546 -row 01547 -row 01548 -row 01549 -row 01550 -row 01551 -row 01552 -row 01553 -row 01554 -row 01555 -row 01556 -row 01557 -row 01558 -row 01559 -row 01560 -row 01561 -row 01562 -row 01563 -row 01564 -row 01565 -row 01566 -row 01567 -row 01568 -row 01569 -row 01570 -row 01571 -row 01572 -row 01573 -row 01574 -row 01575 -row 01576 -row 01577 -row 01578 -row 01579 -row 01580 -row 01581 -row 01582 -row 01583 -row 01584 -row 01585 -row 01586 -row 01587 -row 01588 -row 01589 -row 01590 -row 01591 -row 01592 -row 01593 -row 01594 -row 01595 -row 01596 -row 01597 -row 01598 -row 01599 -row 01600 -row 01601 -row 01602 -row 01603 -row 01604 -row 01605 -row 01606 -row 01607 -row 01608 -row 01609 -row 01610 -row 01611 -row 01612 -row 01613 -row 01614 -row 01615 -row 01616 -row 01617 -row 01618 -row 01619 -row 01620 -row 01621 -row 01622 -row 01623 -row 01624 -row 01625 -row 01626 -row 01627 -row 01628 -row 01629 -row 01630 -row 01631 -row 01632 -row 01633 -row 01634 -row 01635 -row 01636 -row 01637 -row 01638 -row 01639 -row 01640 -row 01641 -row 01642 -row 01643 -row 01644 -row 01645 -row 01646 -row 01647 -row 01648 -row 01649 -row 01650 -row 01651 -row 01652 -row 01653 -row 01654 -row 01655 -row 01656 -row 01657 -row 01658 -row 01659 -row 01660 -row 01661 -row 01662 -row 01663 -row 01664 -row 01665 -row 01666 -row 01667 -row 01668 -row 01669 -row 01670 -row 01671 -row 01672 -row 01673 -row 01674 -row 01675 -row 01676 -row 01677 -row 01678 -row 01679 -row 01680 -row 01681 -row 01682 -row 01683 -row 01684 -row 01685 -row 01686 -row 01687 -row 01688 -row 01689 -row 01690 -row 01691 -row 01692 -row 01693 -row 01694 -row 01695 -row 01696 -row 01697 -row 01698 -row 01699 -row 01700 -row 01701 -row 01702 -row 01703 -row 01704 -row 01705 -row 01706 -row 01707 -row 01708 -row 01709 -row 01710 -row 01711 -row 01712 -row 01713 -row 01714 -row 01715 -row 01716 -row 01717 -row 01718 -row 01719 -row 01720 -row 01721 -row 01722 -row 01723 -row 01724 -row 01725 -row 01726 -row 01727 -row 01728 -row 01729 -row 01730 -row 01731 -row 01732 -row 01733 -row 01734 -row 01735 -row 01736 -row 01737 -row 01738 -row 01739 -row 01740 -row 01741 -row 01742 -row 01743 -row 01744 -row 01745 -row 01746 -row 01747 -row 01748 -row 01749 -row 01750 -row 01751 -row 01752 -row 01753 -row 01754 -row 01755 -row 01756 -row 01757 -row 01758 -row 01759 -row 01760 -row 01761 -row 01762 -row 01763 -row 01764 -row 01765 -row 01766 -row 01767 -row 01768 -row 01769 -row 01770 -row 01771 -row 01772 -row 01773 -row 01774 -row 01775 -row 01776 -row 01777 -row 01778 -row 01779 -row 01780 -row 01781 -row 01782 -row 01783 -row 01784 -row 01785 -row 01786 -row 01787 -row 01788 -row 01789 -row 01790 -row 01791 -row 01792 -row 01793 -row 01794 -row 01795 -row 01796 -row 01797 -row 01798 -row 01799 -row 01800 -row 01801 -row 01802 -row 01803 -row 01804 -row 01805 -row 01806 -row 01807 -row 01808 -row 01809 -row 01810 -row 01811 -row 01812 -row 01813 -row 01814 -row 01815 -row 01816 -row 01817 -row 01818 -row 01819 -row 01820 -row 01821 -row 01822 -row 01823 -row 01824 -row 01825 -row 01826 -row 01827 -row 01828 -row 01829 -row 01830 -row 01831 -row 01832 -row 01833 -row 01834 -row 01835 -row 01836 -row 01837 -row 01838 -row 01839 -row 01840 -row 01841 -row 01842 -row 01843 -row 01844 -row 01845 -row 01846 -row 01847 -row 01848 -row 01849 -row 01850 -row 01851 -row 01852 -row 01853 -row 01854 -row 01855 -row 01856 -row 01857 -row 01858 -row 01859 -row 01860 -row 01861 -row 01862 -row 01863 -row 01864 -row 01865 -row 01866 -row 01867 -row 01868 -row 01869 -row 01870 -row 01871 -row 01872 -row 01873 -row 01874 -row 01875 -row 01876 -row 01877 -row 01878 -row 01879 -row 01880 -row 01881 -row 01882 -row 01883 -row 01884 -row 01885 -row 01886 -row 01887 -row 01888 -row 01889 -row 01890 -row 01891 -row 01892 -row 01893 -row 01894 -row 01895 -row 01896 -row 01897 -row 01898 -row 01899 -row 01900 -row 01901 -row 01902 -row 01903 -row 01904 -row 01905 -row 01906 -row 01907 -row 01908 -row 01909 -row 01910 -row 01911 -row 01912 -row 01913 -row 01914 -row 01915 -row 01916 -row 01917 -row 01918 -row 01919 -row 01920 -row 01921 -row 01922 -row 01923 -row 01924 -row 01925 -row 01926 -row 01927 -row 01928 -row 01929 -row 01930 -row 01931 -row 01932 -row 01933 -row 01934 -row 01935 -row 01936 -row 01937 -row 01938 -row 01939 -row 01940 -row 01941 -row 01942 -row 01943 -row 01944 -row 01945 -row 01946 -row 01947 -row 01948 -row 01949 -row 01950 -row 01951 -row 01952 -row 01953 -row 01954 -row 01955 -row 01956 -row 01957 -row 01958 -row 01959 -row 01960 -row 01961 -row 01962 -row 01963 -row 01964 -row 01965 -row 01966 -row 01967 -row 01968 -row 01969 -row 01970 -row 01971 -row 01972 -row 01973 -row 01974 -row 01975 -row 01976 -row 01977 -row 01978 -row 01979 -row 01980 -row 01981 -row 01982 -row 01983 -row 01984 -row 01985 -row 01986 -row 01987 -row 01988 -row 01989 -row 01990 -row 01991 -row 01992 -row 01993 -row 01994 -row 01995 -row 01996 -row 01997 -row 01998 -row 01999 -row 02000 -row 02001 -row 02002 -row 02003 -row 02004 -row 02005 -row 02006 -row 02007 -row 02008 -row 02009 -row 02010 -row 02011 -row 02012 -row 02013 -row 02014 -row 02015 -row 02016 -row 02017 -row 02018 -row 02019 -row 02020 -row 02021 -row 02022 -row 02023 -row 02024 -row 02025 -row 02026 -row 02027 -row 02028 -row 02029 -row 02030 -row 02031 -row 02032 -row 02033 -row 02034 -row 02035 -row 02036 -row 02037 -row 02038 -row 02039 -row 02040 -row 02041 -row 02042 -row 02043 -row 02044 -row 02045 -row 02046 -row 02047 -row 02048 -row 02049 -row 02050 -row 02051 -row 02052 -row 02053 -row 02054 -row 02055 -row 02056 -row 02057 -row 02058 -row 02059 -row 02060 -row 02061 -row 02062 -row 02063 -row 02064 -row 02065 -row 02066 -row 02067 -row 02068 -row 02069 -row 02070 -row 02071 -row 02072 -row 02073 -row 02074 -row 02075 -row 02076 -row 02077 -row 02078 -row 02079 -row 02080 -row 02081 -row 02082 -row 02083 -row 02084 -row 02085 -row 02086 -row 02087 -row 02088 -row 02089 -row 02090 -row 02091 -row 02092 -row 02093 -row 02094 -row 02095 -row 02096 -row 02097 -row 02098 -row 02099 -row 02100 -row 02101 -row 02102 -row 02103 -row 02104 -row 02105 -row 02106 -row 02107 -row 02108 -row 02109 -row 02110 -row 02111 -row 02112 -row 02113 -row 02114 -row 02115 -row 02116 -row 02117 -row 02118 -row 02119 -row 02120 -row 02121 -row 02122 -row 02123 -row 02124 -row 02125 -row 02126 -row 02127 -row 02128 -row 02129 -row 02130 -row 02131 -row 02132 -row 02133 -row 02134 -row 02135 -row 02136 -row 02137 -row 02138 -row 02139 -row 02140 -row 02141 -row 02142 -row 02143 -row 02144 -row 02145 -row 02146 -row 02147 -row 02148 -row 02149 -row 02150 -row 02151 -row 02152 -row 02153 -row 02154 -row 02155 -row 02156 -row 02157 -row 02158 -row 02159 -row 02160 -row 02161 -row 02162 -row 02163 -row 02164 -row 02165 -row 02166 -row 02167 -row 02168 -row 02169 -row 02170 -row 02171 -row 02172 -row 02173 -row 02174 -row 02175 -row 02176 -row 02177 -row 02178 -row 02179 -row 02180 -row 02181 -row 02182 -row 02183 -row 02184 -row 02185 -row 02186 -row 02187 -row 02188 -row 02189 -row 02190 -row 02191 -row 02192 -row 02193 -row 02194 -row 02195 -row 02196 -row 02197 -row 02198 -row 02199 -row 02200 -row 02201 -row 02202 -row 02203 -row 02204 -row 02205 -row 02206 -row 02207 -row 02208 -row 02209 -row 02210 -row 02211 -row 02212 -row 02213 -row 02214 -row 02215 -row 02216 -row 02217 -row 02218 -row 02219 -row 02220 -row 02221 -row 02222 -row 02223 -row 02224 -row 02225 -row 02226 -row 02227 -row 02228 -row 02229 -row 02230 -row 02231 -row 02232 -row 02233 -row 02234 -row 02235 -row 02236 -row 02237 -row 02238 -row 02239 -row 02240 -row 02241 -row 02242 -row 02243 -row 02244 -row 02245 -row 02246 -row 02247 -row 02248 -row 02249 -row 02250 -row 02251 -row 02252 -row 02253 -row 02254 -row 02255 -row 02256 -row 02257 -row 02258 -row 02259 -row 02260 -row 02261 -row 02262 -row 02263 -row 02264 -row 02265 -row 02266 -row 02267 -row 02268 -row 02269 -row 02270 -row 02271 -row 02272 -row 02273 -row 02274 -row 02275 -row 02276 -row 02277 -row 02278 -row 02279 -row 02280 -row 02281 -row 02282 -row 02283 -row 02284 -row 02285 -row 02286 -row 02287 -row 02288 -row 02289 -row 02290 -row 02291 -row 02292 -row 02293 -row 02294 -row 02295 -row 02296 -row 02297 -row 02298 -row 02299 -row 02300 -row 02301 -row 02302 -row 02303 -row 02304 -row 02305 -row 02306 -row 02307 -row 02308 -row 02309 -row 02310 -row 02311 -row 02312 -row 02313 -row 02314 -row 02315 -row 02316 -row 02317 -row 02318 -row 02319 -row 02320 -row 02321 -row 02322 -row 02323 -row 02324 -row 02325 -row 02326 -row 02327 -row 02328 -row 02329 -row 02330 -row 02331 -row 02332 -row 02333 -row 02334 -row 02335 -row 02336 -row 02337 -row 02338 -row 02339 -row 02340 -row 02341 -row 02342 -row 02343 -row 02344 -row 02345 -row 02346 -row 02347 -row 02348 -row 02349 -row 02350 -row 02351 -row 02352 -row 02353 -row 02354 -row 02355 -row 02356 -row 02357 -row 02358 -row 02359 -row 02360 -row 02361 -row 02362 -row 02363 -row 02364 -row 02365 -row 02366 -row 02367 -row 02368 -row 02369 -row 02370 -row 02371 -row 02372 -row 02373 -row 02374 -row 02375 -row 02376 -row 02377 -row 02378 -row 02379 -row 02380 -row 02381 -row 02382 -row 02383 -row 02384 -row 02385 -row 02386 -row 02387 -row 02388 -row 02389 -row 02390 -row 02391 -row 02392 -row 02393 -row 02394 -row 02395 -row 02396 -row 02397 -row 02398 -row 02399 -row 02400 -row 02401 -row 02402 -row 02403 -row 02404 -row 02405 -row 02406 -row 02407 -row 02408 -row 02409 -row 02410 -row 02411 -row 02412 -row 02413 -row 02414 -row 02415 -row 02416 -row 02417 -row 02418 -row 02419 -row 02420 -row 02421 -row 02422 -row 02423 -row 02424 -row 02425 -row 02426 -row 02427 -row 02428 -row 02429 -row 02430 -row 02431 -row 02432 -row 02433 -row 02434 -row 02435 -row 02436 -row 02437 -row 02438 -row 02439 -row 02440 -row 02441 -row 02442 -row 02443 -row 02444 -row 02445 -row 02446 -row 02447 -row 02448 -row 02449 -row 02450 -row 02451 -row 02452 -row 02453 -row 02454 -row 02455 -row 02456 -row 02457 -row 02458 -row 02459 -row 02460 -row 02461 -row 02462 -row 02463 -row 02464 -row 02465 -row 02466 -row 02467 -row 02468 -row 02469 -row 02470 -row 02471 -row 02472 -row 02473 -row 02474 -row 02475 -row 02476 -row 02477 -row 02478 -row 02479 -row 02480 -row 02481 -row 02482 -row 02483 -row 02484 -row 02485 -row 02486 -row 02487 -row 02488 -row 02489 -row 02490 -row 02491 -row 02492 -row 02493 -row 02494 -row 02495 -row 02496 -row 02497 -row 02498 -row 02499 -row 02500 -row 02501 -row 02502 -row 02503 -row 02504 -row 02505 -row 02506 -row 02507 -row 02508 -row 02509 -row 02510 -row 02511 -row 02512 -row 02513 -row 02514 -row 02515 -row 02516 -row 02517 -row 02518 -row 02519 -row 02520 -row 02521 -row 02522 -row 02523 -row 02524 -row 02525 -row 02526 -row 02527 -row 02528 -row 02529 -row 02530 -row 02531 -row 02532 -row 02533 -row 02534 -row 02535 -row 02536 -row 02537 -row 02538 -row 02539 -row 02540 -row 02541 -row 02542 -row 02543 -row 02544 -row 02545 -row 02546 -row 02547 -row 02548 -row 02549 -row 02550 -row 02551 -row 02552 -row 02553 -row 02554 -row 02555 -row 02556 -row 02557 -row 02558 -row 02559 -row 02560 -row 02561 -row 02562 -row 02563 -row 02564 -row 02565 -row 02566 -row 02567 -row 02568 -row 02569 -row 02570 -row 02571 -row 02572 -row 02573 -row 02574 -row 02575 -row 02576 -row 02577 -row 02578 -row 02579 -row 02580 -row 02581 -row 02582 -row 02583 -row 02584 -row 02585 -row 02586 -row 02587 -row 02588 -row 02589 -row 02590 -row 02591 -row 02592 -row 02593 -row 02594 -row 02595 -row 02596 -row 02597 -row 02598 -row 02599 -row 02600 -row 02601 -row 02602 -row 02603 -row 02604 -row 02605 -row 02606 -row 02607 -row 02608 -row 02609 -row 02610 -row 02611 -row 02612 -row 02613 -row 02614 -row 02615 -row 02616 -row 02617 -row 02618 -row 02619 -row 02620 -row 02621 -row 02622 -row 02623 -row 02624 -row 02625 -row 02626 -row 02627 -row 02628 -row 02629 -row 02630 -row 02631 -row 02632 -row 02633 -row 02634 -row 02635 -row 02636 -row 02637 -row 02638 -row 02639 -row 02640 -row 02641 -row 02642 -row 02643 -row 02644 -row 02645 -row 02646 -row 02647 -row 02648 -row 02649 -row 02650 -row 02651 -row 02652 -row 02653 -row 02654 -row 02655 -row 02656 -row 02657 -row 02658 -row 02659 -row 02660 -row 02661 -row 02662 -row 02663 -row 02664 -row 02665 -row 02666 -row 02667 -row 02668 -row 02669 -row 02670 -row 02671 -row 02672 -row 02673 -row 02674 -row 02675 -row 02676 -row 02677 -row 02678 -row 02679 -row 02680 -row 02681 -row 02682 -row 02683 -row 02684 -row 02685 -row 02686 -row 02687 -row 02688 -row 02689 -row 02690 -row 02691 -row 02692 -row 02693 -row 02694 -row 02695 -row 02696 -row 02697 -row 02698 -row 02699 -row 02700 -row 02701 -row 02702 -row 02703 -row 02704 -row 02705 -row 02706 -row 02707 -row 02708 -row 02709 -row 02710 -row 02711 -row 02712 -row 02713 -row 02714 -row 02715 -row 02716 -row 02717 -row 02718 -row 02719 -row 02720 -row 02721 -row 02722 -row 02723 -row 02724 -row 02725 -row 02726 -row 02727 -row 02728 -row 02729 -row 02730 -row 02731 -row 02732 -row 02733 -row 02734 -row 02735 -row 02736 -row 02737 -row 02738 -row 02739 -row 02740 -row 02741 -row 02742 -row 02743 -row 02744 -row 02745 -row 02746 -row 02747 -row 02748 -row 02749 -row 02750 -row 02751 -row 02752 -row 02753 -row 02754 -row 02755 -row 02756 -row 02757 -row 02758 -row 02759 -row 02760 -row 02761 -row 02762 -row 02763 -row 02764 -row 02765 -row 02766 -row 02767 -row 02768 -row 02769 -row 02770 -row 02771 -row 02772 -row 02773 -row 02774 -row 02775 -row 02776 -row 02777 -row 02778 -row 02779 -row 02780 -row 02781 -row 02782 -row 02783 -row 02784 -row 02785 -row 02786 -row 02787 -row 02788 -row 02789 -row 02790 -row 02791 -row 02792 -row 02793 -row 02794 -row 02795 -row 02796 -row 02797 -row 02798 -row 02799 -row 02800 -row 02801 -row 02802 -row 02803 -row 02804 -row 02805 -row 02806 -row 02807 -row 02808 -row 02809 -row 02810 -row 02811 -row 02812 -row 02813 -row 02814 -row 02815 -row 02816 -row 02817 -row 02818 -row 02819 -row 02820 -row 02821 -row 02822 -row 02823 -row 02824 -row 02825 -row 02826 -row 02827 -row 02828 -row 02829 -row 02830 -row 02831 -row 02832 -row 02833 -row 02834 -row 02835 -row 02836 -row 02837 -row 02838 -row 02839 -row 02840 -row 02841 -row 02842 -row 02843 -row 02844 -row 02845 -row 02846 -row 02847 -row 02848 -row 02849 -row 02850 -row 02851 -row 02852 -row 02853 -row 02854 -row 02855 -row 02856 -row 02857 -row 02858 -row 02859 -row 02860 -row 02861 -row 02862 -row 02863 -row 02864 -row 02865 -row 02866 -row 02867 -row 02868 -row 02869 -row 02870 -row 02871 -row 02872 -row 02873 -row 02874 -row 02875 -row 02876 -row 02877 -row 02878 -row 02879 -row 02880 -row 02881 -row 02882 -row 02883 -row 02884 -row 02885 -row 02886 -row 02887 -row 02888 -row 02889 -row 02890 -row 02891 -row 02892 -row 02893 -row 02894 -row 02895 -row 02896 -row 02897 -row 02898 -row 02899 -row 02900 -row 02901 -row 02902 -row 02903 -row 02904 -row 02905 -row 02906 -row 02907 -row 02908 -row 02909 -row 02910 -row 02911 -row 02912 -row 02913 -row 02914 -row 02915 -row 02916 -row 02917 -row 02918 -row 02919 -row 02920 -row 02921 -row 02922 -row 02923 -row 02924 -row 02925 -row 02926 -row 02927 -row 02928 -row 02929 -row 02930 -row 02931 -row 02932 -row 02933 -row 02934 -row 02935 -row 02936 -row 02937 -row 02938 -row 02939 -row 02940 -row 02941 -row 02942 -row 02943 -row 02944 -row 02945 -row 02946 -row 02947 -row 02948 -row 02949 -row 02950 -row 02951 -row 02952 -row 02953 -row 02954 -row 02955 -row 02956 -row 02957 -row 02958 -row 02959 -row 02960 -row 02961 -row 02962 -row 02963 -row 02964 -row 02965 -row 02966 -row 02967 -row 02968 -row 02969 -row 02970 -row 02971 -row 02972 -row 02973 -row 02974 -row 02975 -row 02976 -row 02977 -row 02978 -row 02979 -row 02980 -row 02981 -row 02982 -row 02983 -row 02984 -row 02985 -row 02986 -row 02987 -row 02988 -row 02989 -row 02990 -row 02991 -row 02992 -row 02993 -row 02994 -row 02995 -row 02996 -row 02997 -row 02998 -row 02999 -row 03000 -row 03001 -row 03002 -row 03003 -row 03004 -row 03005 -row 03006 -row 03007 -row 03008 -row 03009 -row 03010 -row 03011 -row 03012 -row 03013 -row 03014 -row 03015 -row 03016 -row 03017 -row 03018 -row 03019 -row 03020 -row 03021 -row 03022 -row 03023 -row 03024 -row 03025 -row 03026 -row 03027 -row 03028 -row 03029 -row 03030 -row 03031 -row 03032 -row 03033 -row 03034 -row 03035 -row 03036 -row 03037 -row 03038 -row 03039 -row 03040 -row 03041 -row 03042 -row 03043 -row 03044 -row 03045 -row 03046 -row 03047 -row 03048 -row 03049 -row 03050 -row 03051 -row 03052 -row 03053 -row 03054 -row 03055 -row 03056 -row 03057 -row 03058 -row 03059 -row 03060 -row 03061 -row 03062 -row 03063 -row 03064 -row 03065 -row 03066 -row 03067 -row 03068 -row 03069 -row 03070 -row 03071 -row 03072 -row 03073 -row 03074 -row 03075 -row 03076 -row 03077 -row 03078 -row 03079 -row 03080 -row 03081 -row 03082 -row 03083 -row 03084 -row 03085 -row 03086 -row 03087 -row 03088 -row 03089 -row 03090 -row 03091 -row 03092 -row 03093 -row 03094 -row 03095 -row 03096 -row 03097 -row 03098 -row 03099 -row 03100 -row 03101 -row 03102 -row 03103 -row 03104 -row 03105 -row 03106 -row 03107 -row 03108 -row 03109 -row 03110 -row 03111 -row 03112 -row 03113 -row 03114 -row 03115 -row 03116 -row 03117 -row 03118 -row 03119 -row 03120 -row 03121 -row 03122 -row 03123 -row 03124 -row 03125 -row 03126 -row 03127 -row 03128 -row 03129 -row 03130 -row 03131 -row 03132 -row 03133 -row 03134 -row 03135 -row 03136 -row 03137 -row 03138 -row 03139 -row 03140 -row 03141 -row 03142 -row 03143 -row 03144 -row 03145 -row 03146 -row 03147 -row 03148 -row 03149 -row 03150 -row 03151 -row 03152 -row 03153 -row 03154 -row 03155 -row 03156 -row 03157 -row 03158 -row 03159 -row 03160 -row 03161 -row 03162 -row 03163 -row 03164 -row 03165 -row 03166 -row 03167 -row 03168 -row 03169 -row 03170 -row 03171 -row 03172 -row 03173 -row 03174 -row 03175 -row 03176 -row 03177 -row 03178 -row 03179 -row 03180 -row 03181 -row 03182 -row 03183 -row 03184 -row 03185 -row 03186 -row 03187 -row 03188 -row 03189 -row 03190 -row 03191 -row 03192 -row 03193 -row 03194 -row 03195 -row 03196 -row 03197 -row 03198 -row 03199 -row 03200 -row 03201 -row 03202 -row 03203 -row 03204 -row 03205 -row 03206 -row 03207 -row 03208 -row 03209 -row 03210 -row 03211 -row 03212 -row 03213 -row 03214 -row 03215 -row 03216 -row 03217 -row 03218 -row 03219 -row 03220 -row 03221 -row 03222 -row 03223 -row 03224 -row 03225 -row 03226 -row 03227 -row 03228 -row 03229 -row 03230 -row 03231 -row 03232 -row 03233 -row 03234 -row 03235 -row 03236 -row 03237 -row 03238 -row 03239 -row 03240 -row 03241 -row 03242 -row 03243 -row 03244 -row 03245 -row 03246 -row 03247 -row 03248 -row 03249 -row 03250 -row 03251 -row 03252 -row 03253 -row 03254 -row 03255 -row 03256 -row 03257 -row 03258 -row 03259 -row 03260 -row 03261 -row 03262 -row 03263 -row 03264 -row 03265 -row 03266 -row 03267 -row 03268 -row 03269 -row 03270 -row 03271 -row 03272 -row 03273 -row 03274 -row 03275 -row 03276 -row 03277 -row 03278 -row 03279 -row 03280 -row 03281 -row 03282 -row 03283 -row 03284 -row 03285 -row 03286 -row 03287 -row 03288 -row 03289 -row 03290 -row 03291 -row 03292 -row 03293 -row 03294 -row 03295 -row 03296 -row 03297 -row 03298 -row 03299 -row 03300 -row 03301 -row 03302 -row 03303 -row 03304 -row 03305 -row 03306 -row 03307 -row 03308 -row 03309 -row 03310 -row 03311 -row 03312 -row 03313 -row 03314 -row 03315 -row 03316 -row 03317 -row 03318 -row 03319 -row 03320 -row 03321 -row 03322 -row 03323 -row 03324 -row 03325 -row 03326 -row 03327 -row 03328 -row 03329 -row 03330 -row 03331 -row 03332 -row 03333 -row 03334 -row 03335 -row 03336 -row 03337 -row 03338 -row 03339 -row 03340 -row 03341 -row 03342 -row 03343 -row 03344 -row 03345 -row 03346 -row 03347 -row 03348 -row 03349 -row 03350 -row 03351 -row 03352 -row 03353 -row 03354 -row 03355 -row 03356 -row 03357 -row 03358 -row 03359 -row 03360 -row 03361 -row 03362 -row 03363 -row 03364 -row 03365 -row 03366 -row 03367 -row 03368 -row 03369 -row 03370 -row 03371 -row 03372 -row 03373 -row 03374 -row 03375 -row 03376 -row 03377 -row 03378 -row 03379 -row 03380 -row 03381 -row 03382 -row 03383 -row 03384 -row 03385 -row 03386 -row 03387 -row 03388 -row 03389 -row 03390 -row 03391 -row 03392 -row 03393 -row 03394 -row 03395 -row 03396 -row 03397 -row 03398 -row 03399 -row 03400 -row 03401 -row 03402 -row 03403 -row 03404 -row 03405 -row 03406 -row 03407 -row 03408 -row 03409 -row 03410 -row 03411 -row 03412 -row 03413 -row 03414 -row 03415 -row 03416 -row 03417 -row 03418 -row 03419 -row 03420 -row 03421 -row 03422 -row 03423 -row 03424 -row 03425 -row 03426 -row 03427 -row 03428 -row 03429 -row 03430 -row 03431 -row 03432 -row 03433 -row 03434 -row 03435 -row 03436 -row 03437 -row 03438 -row 03439 -row 03440 -row 03441 -row 03442 -row 03443 -row 03444 -row 03445 -row 03446 -row 03447 -row 03448 -row 03449 -row 03450 -row 03451 -row 03452 -row 03453 -row 03454 -row 03455 -row 03456 -row 03457 -row 03458 -row 03459 -row 03460 -row 03461 -row 03462 -row 03463 -row 03464 -row 03465 -row 03466 -row 03467 -row 03468 -row 03469 -row 03470 -row 03471 -row 03472 -row 03473 -row 03474 -row 03475 -row 03476 -row 03477 -row 03478 -row 03479 -row 03480 -row 03481 -row 03482 -row 03483 -row 03484 -row 03485 -row 03486 -row 03487 -row 03488 -row 03489 -row 03490 -row 03491 -row 03492 -row 03493 -row 03494 -row 03495 -row 03496 -row 03497 -row 03498 -row 03499 -row 03500 -row 03501 -row 03502 -row 03503 -row 03504 -row 03505 -row 03506 -row 03507 -row 03508 -row 03509 -row 03510 -row 03511 -row 03512 -row 03513 -row 03514 -row 03515 -row 03516 -row 03517 -row 03518 -row 03519 -row 03520 -row 03521 -row 03522 -row 03523 -row 03524 -row 03525 -row 03526 -row 03527 -row 03528 -row 03529 -row 03530 -row 03531 -row 03532 -row 03533 -row 03534 -row 03535 -row 03536 -row 03537 -row 03538 -row 03539 -row 03540 -row 03541 -row 03542 -row 03543 -row 03544 -row 03545 -row 03546 -row 03547 -row 03548 -row 03549 -row 03550 -row 03551 -row 03552 -row 03553 -row 03554 -row 03555 -row 03556 -row 03557 -row 03558 -row 03559 -row 03560 -row 03561 -row 03562 -row 03563 -row 03564 -row 03565 -row 03566 -row 03567 -row 03568 -row 03569 -row 03570 -row 03571 -row 03572 -row 03573 -row 03574 -row 03575 -row 03576 -row 03577 -row 03578 -row 03579 -row 03580 -row 03581 -row 03582 -row 03583 -row 03584 -row 03585 -row 03586 -row 03587 -row 03588 -row 03589 -row 03590 -row 03591 -row 03592 -row 03593 -row 03594 -row 03595 -row 03596 -row 03597 -row 03598 -row 03599 -row 03600 -row 03601 -row 03602 -row 03603 -row 03604 -row 03605 -row 03606 -row 03607 -row 03608 -row 03609 -row 03610 -row 03611 -row 03612 -row 03613 -row 03614 -row 03615 -row 03616 -row 03617 -row 03618 -row 03619 -row 03620 -row 03621 -row 03622 -row 03623 -row 03624 -row 03625 -row 03626 -row 03627 -row 03628 -row 03629 -row 03630 -row 03631 -row 03632 -row 03633 -row 03634 -row 03635 -row 03636 -row 03637 -row 03638 -row 03639 -row 03640 -row 03641 -row 03642 -row 03643 -row 03644 -row 03645 -row 03646 -row 03647 -row 03648 -row 03649 -row 03650 -row 03651 -row 03652 -row 03653 -row 03654 -row 03655 -row 03656 -row 03657 -row 03658 -row 03659 -row 03660 -row 03661 -row 03662 -row 03663 -row 03664 -row 03665 -row 03666 -row 03667 -row 03668 -row 03669 -row 03670 -row 03671 -row 03672 -row 03673 -row 03674 -row 03675 -row 03676 -row 03677 -row 03678 -row 03679 -row 03680 -row 03681 -row 03682 -row 03683 -row 03684 -row 03685 -row 03686 -row 03687 -row 03688 -row 03689 -row 03690 -row 03691 -row 03692 -row 03693 -row 03694 -row 03695 -row 03696 -row 03697 -row 03698 -row 03699 -row 03700 -row 03701 -row 03702 -row 03703 -row 03704 -row 03705 -row 03706 -row 03707 -row 03708 -row 03709 -row 03710 -row 03711 -row 03712 -row 03713 -row 03714 -row 03715 -row 03716 -row 03717 -row 03718 -row 03719 -row 03720 -row 03721 -row 03722 -row 03723 -row 03724 -row 03725 -row 03726 -row 03727 -row 03728 -row 03729 -row 03730 -row 03731 -row 03732 -row 03733 -row 03734 -row 03735 -row 03736 -row 03737 -row 03738 -row 03739 -row 03740 -row 03741 -row 03742 -row 03743 -row 03744 -row 03745 -row 03746 -row 03747 -row 03748 -row 03749 -row 03750 -row 03751 -row 03752 -row 03753 -row 03754 -row 03755 -row 03756 -row 03757 -row 03758 -row 03759 -row 03760 -row 03761 -row 03762 -row 03763 -row 03764 -row 03765 -row 03766 -row 03767 -row 03768 -row 03769 -row 03770 -row 03771 -row 03772 -row 03773 -row 03774 -row 03775 -row 03776 -row 03777 -row 03778 -row 03779 -row 03780 -row 03781 -row 03782 -row 03783 -row 03784 -row 03785 -row 03786 -row 03787 -row 03788 -row 03789 -row 03790 -row 03791 -row 03792 -row 03793 -row 03794 -row 03795 -row 03796 -row 03797 -row 03798 -row 03799 -row 03800 -row 03801 -row 03802 -row 03803 -row 03804 -row 03805 -row 03806 -row 03807 -row 03808 -row 03809 -row 03810 -row 03811 -row 03812 -row 03813 -row 03814 -row 03815 -row 03816 -row 03817 -row 03818 -row 03819 -row 03820 -row 03821 -row 03822 -row 03823 -row 03824 -row 03825 -row 03826 -row 03827 -row 03828 -row 03829 -row 03830 -row 03831 -row 03832 -row 03833 -row 03834 -row 03835 -row 03836 -row 03837 -row 03838 -row 03839 -row 03840 -row 03841 -row 03842 -row 03843 -row 03844 -row 03845 -row 03846 -row 03847 -row 03848 -row 03849 -row 03850 -row 03851 -row 03852 -row 03853 -row 03854 -row 03855 -row 03856 -row 03857 -row 03858 -row 03859 -row 03860 -row 03861 -row 03862 -row 03863 -row 03864 -row 03865 -row 03866 -row 03867 -row 03868 -row 03869 -row 03870 -row 03871 -row 03872 -row 03873 -row 03874 -row 03875 -row 03876 -row 03877 -row 03878 -row 03879 -row 03880 -row 03881 -row 03882 -row 03883 -row 03884 -row 03885 -row 03886 -row 03887 -row 03888 -row 03889 -row 03890 -row 03891 -row 03892 -row 03893 -row 03894 -row 03895 -row 03896 -row 03897 -row 03898 -row 03899 -row 03900 -row 03901 -row 03902 -row 03903 -row 03904 -row 03905 -row 03906 -row 03907 -row 03908 -row 03909 -row 03910 -row 03911 -row 03912 -row 03913 -row 03914 -row 03915 -row 03916 -row 03917 -row 03918 -row 03919 -row 03920 -row 03921 -row 03922 -row 03923 -row 03924 -row 03925 -row 03926 -row 03927 -row 03928 -row 03929 -row 03930 -row 03931 -row 03932 -row 03933 -row 03934 -row 03935 -row 03936 -row 03937 -row 03938 -row 03939 -row 03940 -row 03941 -row 03942 -row 03943 -row 03944 -row 03945 -row 03946 -row 03947 -row 03948 -row 03949 -row 03950 -row 03951 -row 03952 -row 03953 -row 03954 -row 03955 -row 03956 -row 03957 -row 03958 -row 03959 -row 03960 -row 03961 -row 03962 -row 03963 -row 03964 -row 03965 -row 03966 -row 03967 -row 03968 -row 03969 -row 03970 -row 03971 -row 03972 -row 03973 -row 03974 -row 03975 -row 03976 -row 03977 -row 03978 -row 03979 -row 03980 -row 03981 -row 03982 -row 03983 -row 03984 -row 03985 -row 03986 -row 03987 -row 03988 -row 03989 -row 03990 -row 03991 -row 03992 -row 03993 -row 03994 -row 03995 -row 03996 -row 03997 -row 03998 -row 03999 -row 04000 -row 04001 -row 04002 -row 04003 -row 04004 -row 04005 -row 04006 -row 04007 -row 04008 -row 04009 -row 04010 -row 04011 -row 04012 -row 04013 -row 04014 -row 04015 -row 04016 -row 04017 -row 04018 -row 04019 -row 04020 -row 04021 -row 04022 -row 04023 -row 04024 -row 04025 -row 04026 -row 04027 -row 04028 -row 04029 -row 04030 -row 04031 -row 04032 -row 04033 -row 04034 -row 04035 -row 04036 -row 04037 -row 04038 -row 04039 -row 04040 -row 04041 -row 04042 -row 04043 -row 04044 -row 04045 -row 04046 -row 04047 -row 04048 -row 04049 -row 04050 -row 04051 -row 04052 -row 04053 -row 04054 -row 04055 -row 04056 -row 04057 -row 04058 -row 04059 -row 04060 -row 04061 -row 04062 -row 04063 -row 04064 -row 04065 -row 04066 -row 04067 -row 04068 -row 04069 -row 04070 -row 04071 -row 04072 -row 04073 -row 04074 -row 04075 -row 04076 -row 04077 -row 04078 -row 04079 -row 04080 -row 04081 -row 04082 -row 04083 -row 04084 -row 04085 -row 04086 -row 04087 -row 04088 -row 04089 -row 04090 -row 04091 -row 04092 -row 04093 -row 04094 -row 04095 -row 04096 -row 04097 -row 04098 -row 04099 -row 04100 -row 04101 -row 04102 -row 04103 -row 04104 -row 04105 -row 04106 -row 04107 -row 04108 -row 04109 -row 04110 -row 04111 -row 04112 -row 04113 -row 04114 -row 04115 -row 04116 -row 04117 -row 04118 -row 04119 -row 04120 -row 04121 -row 04122 -row 04123 -row 04124 -row 04125 -row 04126 -row 04127 -row 04128 -row 04129 -row 04130 -row 04131 -row 04132 -row 04133 -row 04134 -row 04135 -row 04136 -row 04137 -row 04138 -row 04139 -row 04140 -row 04141 -row 04142 -row 04143 -row 04144 -row 04145 -row 04146 -row 04147 -row 04148 -row 04149 -row 04150 -row 04151 -row 04152 -row 04153 -row 04154 -row 04155 -row 04156 -row 04157 -row 04158 -row 04159 -row 04160 -row 04161 -row 04162 -row 04163 -row 04164 -row 04165 -row 04166 -row 04167 -row 04168 -row 04169 -row 04170 -row 04171 -row 04172 -row 04173 -row 04174 -row 04175 -row 04176 -row 04177 -row 04178 -row 04179 -row 04180 -row 04181 -row 04182 -row 04183 -row 04184 -row 04185 -row 04186 -row 04187 -row 04188 -row 04189 -row 04190 -row 04191 -row 04192 -row 04193 -row 04194 -row 04195 -row 04196 -row 04197 -row 04198 -row 04199 -row 04200 -row 04201 -row 04202 -row 04203 -row 04204 -row 04205 -row 04206 -row 04207 -row 04208 -row 04209 -row 04210 -row 04211 -row 04212 -row 04213 -row 04214 -row 04215 -row 04216 -row 04217 -row 04218 -row 04219 -row 04220 -row 04221 -row 04222 -row 04223 -row 04224 -row 04225 -row 04226 -row 04227 -row 04228 -row 04229 -row 04230 -row 04231 -row 04232 -row 04233 -row 04234 -row 04235 -row 04236 -row 04237 -row 04238 -row 04239 -row 04240 -row 04241 -row 04242 -row 04243 -row 04244 -row 04245 -row 04246 -row 04247 -row 04248 -row 04249 -row 04250 -row 04251 -row 04252 -row 04253 -row 04254 -row 04255 -row 04256 -row 04257 -row 04258 -row 04259 -row 04260 -row 04261 -row 04262 -row 04263 -row 04264 -row 04265 -row 04266 -row 04267 -row 04268 -row 04269 -row 04270 -row 04271 -row 04272 -row 04273 -row 04274 -row 04275 -row 04276 -row 04277 -row 04278 -row 04279 -row 04280 -row 04281 -row 04282 -row 04283 -row 04284 -row 04285 -row 04286 -row 04287 -row 04288 -row 04289 -row 04290 -row 04291 -row 04292 -row 04293 -row 04294 -row 04295 -row 04296 -row 04297 -row 04298 -row 04299 -row 04300 -row 04301 -row 04302 -row 04303 -row 04304 -row 04305 -row 04306 -row 04307 -row 04308 -row 04309 -row 04310 -row 04311 -row 04312 -row 04313 -row 04314 -row 04315 -row 04316 -row 04317 -row 04318 -row 04319 -row 04320 -row 04321 -row 04322 -row 04323 -row 04324 -row 04325 -row 04326 -row 04327 -row 04328 -row 04329 -row 04330 -row 04331 -row 04332 -row 04333 -row 04334 -row 04335 -row 04336 -row 04337 -row 04338 -row 04339 -row 04340 -row 04341 -row 04342 -row 04343 -row 04344 -row 04345 -row 04346 -row 04347 -row 04348 -row 04349 -row 04350 -row 04351 -row 04352 -row 04353 -row 04354 -row 04355 -row 04356 -row 04357 -row 04358 -row 04359 -row 04360 -row 04361 -row 04362 -row 04363 -row 04364 -row 04365 -row 04366 -row 04367 -row 04368 -row 04369 -row 04370 -row 04371 -row 04372 -row 04373 -row 04374 -row 04375 -row 04376 -row 04377 -row 04378 -row 04379 -row 04380 -row 04381 -row 04382 -row 04383 -row 04384 -row 04385 -row 04386 -row 04387 -row 04388 -row 04389 -row 04390 -row 04391 -row 04392 -row 04393 -row 04394 -row 04395 -row 04396 -row 04397 -row 04398 -row 04399 -row 04400 -row 04401 -row 04402 -row 04403 -row 04404 -row 04405 -row 04406 -row 04407 -row 04408 -row 04409 -row 04410 -row 04411 -row 04412 -row 04413 -row 04414 -row 04415 -row 04416 -row 04417 -row 04418 -row 04419 -row 04420 -row 04421 -row 04422 -row 04423 -row 04424 -row 04425 -row 04426 -row 04427 -row 04428 -row 04429 -row 04430 -row 04431 -row 04432 -row 04433 -row 04434 -row 04435 -row 04436 -row 04437 -row 04438 -row 04439 -row 04440 -row 04441 -row 04442 -row 04443 -row 04444 -row 04445 -row 04446 -row 04447 -row 04448 -row 04449 -row 04450 -row 04451 -row 04452 -row 04453 -row 04454 -row 04455 -row 04456 -row 04457 -row 04458 -row 04459 -row 04460 -row 04461 -row 04462 -row 04463 -row 04464 -row 04465 -row 04466 -row 04467 -row 04468 -row 04469 -row 04470 -row 04471 -row 04472 -row 04473 -row 04474 -row 04475 -row 04476 -row 04477 -row 04478 -row 04479 -row 04480 -row 04481 -row 04482 -row 04483 -row 04484 -row 04485 -row 04486 -row 04487 -row 04488 -row 04489 -row 04490 -row 04491 -row 04492 -row 04493 -row 04494 -row 04495 -row 04496 -row 04497 -row 04498 -row 04499 -row 04500 -row 04501 -row 04502 -row 04503 -row 04504 -row 04505 -row 04506 -row 04507 -row 04508 -row 04509 -row 04510 -row 04511 -row 04512 -row 04513 -row 04514 -row 04515 -row 04516 -row 04517 -row 04518 -row 04519 -row 04520 -row 04521 -row 04522 -row 04523 -row 04524 -row 04525 -row 04526 -row 04527 -row 04528 -row 04529 -row 04530 -row 04531 -row 04532 -row 04533 -row 04534 -row 04535 -row 04536 -row 04537 -row 04538 -row 04539 -row 04540 -row 04541 -row 04542 -row 04543 -row 04544 -row 04545 -row 04546 -row 04547 -row 04548 -row 04549 -row 04550 -row 04551 -row 04552 -row 04553 -row 04554 -row 04555 -row 04556 -row 04557 -row 04558 -row 04559 -row 04560 -row 04561 -row 04562 -row 04563 -row 04564 -row 04565 -row 04566 -row 04567 -row 04568 -row 04569 -row 04570 -row 04571 -row 04572 -row 04573 -row 04574 -row 04575 -row 04576 -row 04577 -row 04578 -row 04579 -row 04580 -row 04581 -row 04582 -row 04583 -row 04584 -row 04585 -row 04586 -row 04587 -row 04588 -row 04589 -row 04590 -row 04591 -row 04592 -row 04593 -row 04594 -row 04595 -row 04596 -row 04597 -row 04598 -row 04599 -row 04600 -row 04601 -row 04602 -row 04603 -row 04604 -row 04605 -row 04606 -row 04607 -row 04608 -row 04609 -row 04610 -row 04611 -row 04612 -row 04613 -row 04614 -row 04615 -row 04616 -row 04617 -row 04618 -row 04619 -row 04620 -row 04621 -row 04622 -row 04623 -row 04624 -row 04625 -row 04626 -row 04627 -row 04628 -row 04629 -row 04630 -row 04631 -row 04632 -row 04633 -row 04634 -row 04635 -row 04636 -row 04637 -row 04638 -row 04639 -row 04640 -row 04641 -row 04642 -row 04643 -row 04644 -row 04645 -row 04646 -row 04647 -row 04648 -row 04649 -row 04650 -row 04651 -row 04652 -row 04653 -row 04654 -row 04655 -row 04656 -row 04657 -row 04658 -row 04659 -row 04660 -row 04661 -row 04662 -row 04663 -row 04664 -row 04665 -row 04666 -row 04667 -row 04668 -row 04669 -row 04670 -row 04671 -row 04672 -row 04673 -row 04674 -row 04675 -row 04676 -row 04677 -row 04678 -row 04679 -row 04680 -row 04681 -row 04682 -row 04683 -row 04684 -row 04685 -row 04686 -row 04687 -row 04688 -row 04689 -row 04690 -row 04691 -row 04692 -row 04693 -row 04694 -row 04695 -row 04696 -row 04697 -row 04698 -row 04699 -row 04700 -row 04701 -row 04702 -row 04703 -row 04704 -row 04705 -row 04706 -row 04707 -row 04708 -row 04709 -row 04710 -row 04711 -row 04712 -row 04713 -row 04714 -row 04715 -row 04716 -row 04717 -row 04718 -row 04719 -row 04720 -row 04721 -row 04722 -row 04723 -row 04724 -row 04725 -row 04726 -row 04727 -row 04728 -row 04729 -row 04730 -row 04731 -row 04732 -row 04733 -row 04734 -row 04735 -row 04736 -row 04737 -row 04738 -row 04739 -row 04740 -row 04741 -row 04742 -row 04743 -row 04744 -row 04745 -row 04746 -row 04747 -row 04748 -row 04749 -row 04750 -row 04751 -row 04752 -row 04753 -row 04754 -row 04755 -row 04756 -row 04757 -row 04758 -row 04759 -row 04760 -row 04761 -row 04762 -row 04763 -row 04764 -row 04765 -row 04766 -row 04767 -row 04768 -row 04769 -row 04770 -row 04771 -row 04772 -row 04773 -row 04774 -row 04775 -row 04776 -row 04777 -row 04778 -row 04779 -row 04780 -row 04781 -row 04782 -row 04783 -row 04784 -row 04785 -row 04786 -row 04787 -row 04788 -row 04789 -row 04790 -row 04791 -row 04792 -row 04793 -row 04794 -row 04795 -row 04796 -row 04797 -row 04798 -row 04799 -row 04800 -row 04801 -row 04802 -row 04803 -row 04804 -row 04805 -row 04806 -row 04807 -row 04808 -row 04809 -row 04810 -row 04811 -row 04812 -row 04813 -row 04814 -row 04815 -row 04816 -row 04817 -row 04818 -row 04819 -row 04820 -row 04821 -row 04822 -row 04823 -row 04824 -row 04825 -row 04826 -row 04827 -row 04828 -row 04829 -row 04830 -row 04831 -row 04832 -row 04833 -row 04834 -row 04835 -row 04836 -row 04837 -row 04838 -row 04839 -row 04840 -row 04841 -row 04842 -row 04843 -row 04844 -row 04845 -row 04846 -row 04847 -row 04848 -row 04849 -row 04850 -row 04851 -row 04852 -row 04853 -row 04854 -row 04855 -row 04856 -row 04857 -row 04858 -row 04859 -row 04860 -row 04861 -row 04862 -row 04863 -row 04864 -row 04865 -row 04866 -row 04867 -row 04868 -row 04869 -row 04870 -row 04871 -row 04872 -row 04873 -row 04874 -row 04875 -row 04876 -row 04877 -row 04878 -row 04879 -row 04880 -row 04881 -row 04882 -row 04883 -row 04884 -row 04885 -row 04886 -row 04887 -row 04888 -row 04889 -row 04890 -row 04891 -row 04892 -row 04893 -row 04894 -row 04895 -row 04896 -row 04897 -row 04898 -row 04899 -row 04900 -row 04901 -row 04902 -row 04903 -row 04904 -row 04905 -row 04906 -row 04907 -row 04908 -row 04909 -row 04910 -row 04911 -row 04912 -row 04913 -row 04914 -row 04915 -row 04916 -row 04917 -row 04918 -row 04919 -row 04920 -row 04921 -row 04922 -row 04923 -row 04924 -row 04925 -row 04926 -row 04927 -row 04928 -row 04929 -row 04930 -row 04931 -row 04932 -row 04933 -row 04934 -row 04935 -row 04936 -row 04937 -row 04938 -row 04939 -row 04940 -row 04941 -row 04942 -row 04943 -row 04944 -row 04945 -row 04946 -row 04947 -row 04948 -row 04949 -row 04950 -row 04951 -row 04952 -row 04953 -row 04954 -row 04955 -row 04956 -row 04957 -row 04958 -row 04959 -row 04960 -row 04961 -row 04962 -row 04963 -row 04964 -row 04965 -row 04966 -row 04967 -row 04968 -row 04969 -row 04970 -row 04971 -row 04972 -row 04973 -row 04974 -row 04975 -row 04976 -row 04977 -row 04978 -row 04979 -row 04980 -row 04981 -row 04982 -row 04983 -row 04984 -row 04985 -row 04986 -row 04987 -row 04988 -row 04989 -row 04990 -row 04991 -row 04992 -row 04993 -row 04994 -row 04995 -row 04996 -row 04997 -row 04998 -row 04999 -row 05000 -row 05001 -row 05002 -row 05003 -row 05004 -row 05005 -row 05006 -row 05007 -row 05008 -row 05009 -row 05010 -row 05011 -row 05012 -row 05013 -row 05014 -row 05015 -row 05016 -row 05017 -row 05018 -row 05019 -row 05020 -row 05021 -row 05022 -row 05023 -row 05024 -row 05025 -row 05026 -row 05027 -row 05028 -row 05029 -row 05030 -row 05031 -row 05032 -row 05033 -row 05034 -row 05035 -row 05036 -row 05037 -row 05038 -row 05039 -row 05040 -row 05041 -row 05042 -row 05043 -row 05044 -row 05045 -row 05046 -row 05047 -row 05048 -row 05049 -row 05050 -row 05051 -row 05052 -row 05053 -row 05054 -row 05055 -row 05056 -row 05057 -row 05058 -row 05059 -row 05060 -row 05061 -row 05062 -row 05063 -row 05064 -row 05065 -row 05066 -row 05067 -row 05068 -row 05069 -row 05070 -row 05071 -row 05072 -row 05073 -row 05074 -row 05075 -row 05076 -row 05077 -row 05078 -row 05079 -row 05080 -row 05081 -row 05082 -row 05083 -row 05084 -row 05085 -row 05086 -row 05087 -row 05088 -row 05089 -row 05090 -row 05091 -row 05092 -row 05093 -row 05094 -row 05095 -row 05096 -row 05097 -row 05098 -row 05099 -row 05100 -row 05101 -row 05102 -row 05103 -row 05104 -row 05105 -row 05106 -row 05107 -row 05108 -row 05109 -row 05110 -row 05111 -row 05112 -row 05113 -row 05114 -row 05115 -row 05116 -row 05117 -row 05118 -row 05119 -row 05120 -row 05121 -row 05122 -row 05123 -row 05124 -row 05125 -row 05126 -row 05127 -row 05128 -row 05129 -row 05130 -row 05131 -row 05132 -row 05133 -row 05134 -row 05135 -row 05136 -row 05137 -row 05138 -row 05139 -row 05140 -row 05141 -row 05142 -row 05143 -row 05144 -row 05145 -row 05146 -row 05147 -row 05148 -row 05149 -row 05150 -row 05151 -row 05152 -row 05153 -row 05154 -row 05155 -row 05156 -row 05157 -row 05158 -row 05159 -row 05160 -row 05161 -row 05162 -row 05163 -row 05164 -row 05165 -row 05166 -row 05167 -row 05168 -row 05169 -row 05170 -row 05171 -row 05172 -row 05173 -row 05174 -row 05175 -row 05176 -row 05177 -row 05178 -row 05179 -row 05180 -row 05181 -row 05182 -row 05183 -row 05184 -row 05185 -row 05186 -row 05187 -row 05188 -row 05189 -row 05190 -row 05191 -row 05192 -row 05193 -row 05194 -row 05195 -row 05196 -row 05197 -row 05198 -row 05199 -row 05200 -row 05201 -row 05202 -row 05203 -row 05204 -row 05205 -row 05206 -row 05207 -row 05208 -row 05209 -row 05210 -row 05211 -row 05212 -row 05213 -row 05214 -row 05215 -row 05216 -row 05217 -row 05218 -row 05219 -row 05220 -row 05221 -row 05222 -row 05223 -row 05224 -row 05225 -row 05226 -row 05227 -row 05228 -row 05229 -row 05230 -row 05231 -row 05232 -row 05233 -row 05234 -row 05235 -row 05236 -row 05237 -row 05238 -row 05239 -row 05240 -row 05241 -row 05242 -row 05243 -row 05244 -row 05245 -row 05246 -row 05247 -row 05248 -row 05249 -row 05250 -row 05251 -row 05252 -row 05253 -row 05254 -row 05255 -row 05256 -row 05257 -row 05258 -row 05259 -row 05260 -row 05261 -row 05262 -row 05263 -row 05264 -row 05265 -row 05266 -row 05267 -row 05268 -row 05269 -row 05270 -row 05271 -row 05272 -row 05273 -row 05274 -row 05275 -row 05276 -row 05277 -row 05278 -row 05279 -row 05280 -row 05281 -row 05282 -row 05283 -row 05284 -row 05285 -row 05286 -row 05287 -row 05288 -row 05289 -row 05290 -row 05291 -row 05292 -row 05293 -row 05294 -row 05295 -row 05296 -row 05297 -row 05298 -row 05299 -row 05300 -row 05301 -row 05302 -row 05303 -row 05304 -row 05305 -row 05306 -row 05307 -row 05308 -row 05309 -row 05310 -row 05311 -row 05312 -row 05313 -row 05314 -row 05315 -row 05316 -row 05317 -row 05318 -row 05319 -row 05320 -row 05321 -row 05322 -row 05323 -row 05324 -row 05325 -row 05326 -row 05327 -row 05328 -row 05329 -row 05330 -row 05331 -row 05332 -row 05333 -row 05334 -row 05335 -row 05336 -row 05337 -row 05338 -row 05339 -row 05340 -row 05341 -row 05342 -row 05343 -row 05344 -row 05345 -row 05346 -row 05347 -row 05348 -row 05349 -row 05350 -row 05351 -row 05352 -row 05353 -row 05354 -row 05355 -row 05356 -row 05357 -row 05358 -row 05359 -row 05360 -row 05361 -row 05362 -row 05363 -row 05364 -row 05365 -row 05366 -row 05367 -row 05368 -row 05369 -row 05370 -row 05371 -row 05372 -row 05373 -row 05374 -row 05375 -row 05376 -row 05377 -row 05378 -row 05379 -row 05380 -row 05381 -row 05382 -row 05383 -row 05384 -row 05385 -row 05386 -row 05387 -row 05388 -row 05389 -row 05390 -row 05391 -row 05392 -row 05393 -row 05394 -row 05395 -row 05396 -row 05397 -row 05398 -row 05399 -row 05400 -row 05401 -row 05402 -row 05403 -row 05404 -row 05405 -row 05406 -row 05407 -row 05408 -row 05409 -row 05410 -row 05411 -row 05412 -row 05413 -row 05414 -row 05415 -row 05416 -row 05417 -row 05418 -row 05419 -row 05420 -row 05421 -row 05422 -row 05423 -row 05424 -row 05425 -row 05426 -row 05427 -row 05428 -row 05429 -row 05430 -row 05431 -row 05432 -row 05433 -row 05434 -row 05435 -row 05436 -row 05437 -row 05438 -row 05439 -row 05440 -row 05441 -row 05442 -row 05443 -row 05444 -row 05445 -row 05446 -row 05447 -row 05448 -row 05449 -row 05450 -row 05451 -row 05452 -row 05453 -row 05454 -row 05455 -row 05456 -row 05457 -row 05458 -row 05459 -row 05460 -row 05461 -row 05462 -row 05463 -row 05464 -row 05465 -row 05466 -row 05467 -row 05468 -row 05469 -row 05470 -row 05471 -row 05472 -row 05473 -row 05474 -row 05475 -row 05476 -row 05477 -row 05478 -row 05479 -row 05480 -row 05481 -row 05482 -row 05483 -row 05484 -row 05485 -row 05486 -row 05487 -row 05488 -row 05489 -row 05490 -row 05491 -row 05492 -row 05493 -row 05494 -row 05495 -row 05496 -row 05497 -row 05498 -row 05499 -row 05500 -row 05501 -row 05502 -row 05503 -row 05504 -row 05505 -row 05506 -row 05507 -row 05508 -row 05509 -row 05510 -row 05511 -row 05512 -row 05513 -row 05514 -row 05515 -row 05516 -row 05517 -row 05518 -row 05519 -row 05520 -row 05521 -row 05522 -row 05523 -row 05524 -row 05525 -row 05526 -row 05527 -row 05528 -row 05529 -row 05530 -row 05531 -row 05532 -row 05533 -row 05534 -row 05535 -row 05536 -row 05537 -row 05538 -row 05539 -row 05540 -row 05541 -row 05542 -row 05543 -row 05544 -row 05545 -row 05546 -row 05547 -row 05548 -row 05549 -row 05550 -row 05551 -row 05552 -row 05553 -row 05554 -row 05555 -row 05556 -row 05557 -row 05558 -row 05559 -row 05560 -row 05561 -row 05562 -row 05563 -row 05564 -row 05565 -row 05566 -row 05567 -row 05568 -row 05569 -row 05570 -row 05571 -row 05572 -row 05573 -row 05574 -row 05575 -row 05576 -row 05577 -row 05578 -row 05579 -row 05580 -row 05581 -row 05582 -row 05583 -row 05584 -row 05585 -row 05586 -row 05587 -row 05588 -row 05589 -row 05590 -row 05591 -row 05592 -row 05593 -row 05594 -row 05595 -row 05596 -row 05597 -row 05598 -row 05599 -row 05600 -row 05601 -row 05602 -row 05603 -row 05604 -row 05605 -row 05606 -row 05607 -row 05608 -row 05609 -row 05610 -row 05611 -row 05612 -row 05613 -row 05614 -row 05615 -row 05616 -row 05617 -row 05618 -row 05619 -row 05620 -row 05621 -row 05622 -row 05623 -row 05624 -row 05625 -row 05626 -row 05627 -row 05628 -row 05629 -row 05630 -row 05631 -row 05632 -row 05633 -row 05634 -row 05635 -row 05636 -row 05637 -row 05638 -row 05639 -row 05640 -row 05641 -row 05642 -row 05643 -row 05644 -row 05645 -row 05646 -row 05647 -row 05648 -row 05649 -row 05650 -row 05651 -row 05652 -row 05653 -row 05654 -row 05655 -row 05656 -row 05657 -row 05658 -row 05659 -row 05660 -row 05661 -row 05662 -row 05663 -row 05664 -row 05665 -row 05666 -row 05667 -row 05668 -row 05669 -row 05670 -row 05671 -row 05672 -row 05673 -row 05674 -row 05675 -row 05676 -row 05677 -row 05678 -row 05679 -row 05680 -row 05681 -row 05682 -row 05683 -row 05684 -row 05685 -row 05686 -row 05687 -row 05688 -row 05689 -row 05690 -row 05691 -row 05692 -row 05693 -row 05694 -row 05695 -row 05696 -row 05697 -row 05698 -row 05699 -row 05700 -row 05701 -row 05702 -row 05703 -row 05704 -row 05705 -row 05706 -row 05707 -row 05708 -row 05709 -row 05710 -row 05711 -row 05712 -row 05713 -row 05714 -row 05715 -row 05716 -row 05717 -row 05718 -row 05719 -row 05720 -row 05721 -row 05722 -row 05723 -row 05724 -row 05725 -row 05726 -row 05727 -row 05728 -row 05729 -row 05730 -row 05731 -row 05732 -row 05733 -row 05734 -row 05735 -row 05736 -row 05737 -row 05738 -row 05739 -row 05740 -row 05741 -row 05742 -row 05743 -row 05744 -row 05745 -row 05746 -row 05747 -row 05748 -row 05749 -row 05750 -row 05751 -row 05752 -row 05753 -row 05754 -row 05755 -row 05756 -row 05757 -row 05758 -row 05759 -row 05760 -row 05761 -row 05762 -row 05763 -row 05764 -row 05765 -row 05766 -row 05767 -row 05768 -row 05769 -row 05770 -row 05771 -row 05772 -row 05773 -row 05774 -row 05775 -row 05776 -row 05777 -row 05778 -row 05779 -row 05780 -row 05781 -row 05782 -row 05783 -row 05784 -row 05785 -row 05786 -row 05787 -row 05788 -row 05789 -row 05790 -row 05791 -row 05792 -row 05793 -row 05794 -row 05795 -row 05796 -row 05797 -row 05798 -row 05799 -row 05800 -row 05801 -row 05802 -row 05803 -row 05804 -row 05805 -row 05806 -row 05807 -row 05808 -row 05809 -row 05810 -row 05811 -row 05812 -row 05813 -row 05814 -row 05815 -row 05816 -row 05817 -row 05818 -row 05819 -row 05820 -row 05821 -row 05822 -row 05823 -row 05824 -row 05825 -row 05826 -row 05827 -row 05828 -row 05829 -row 05830 -row 05831 -row 05832 -row 05833 -row 05834 -row 05835 -row 05836 -row 05837 -row 05838 -row 05839 -row 05840 -row 05841 -row 05842 -row 05843 -row 05844 -row 05845 -row 05846 -row 05847 -row 05848 -row 05849 -row 05850 -row 05851 -row 05852 -row 05853 -row 05854 -row 05855 -row 05856 -row 05857 -row 05858 -row 05859 -row 05860 -row 05861 -row 05862 -row 05863 -row 05864 -row 05865 -row 05866 -row 05867 -row 05868 -row 05869 -row 05870 -row 05871 -row 05872 -row 05873 -row 05874 -row 05875 -row 05876 -row 05877 -row 05878 -row 05879 -row 05880 -row 05881 -row 05882 -row 05883 -row 05884 -row 05885 -row 05886 -row 05887 -row 05888 -row 05889 -row 05890 -row 05891 -row 05892 -row 05893 -row 05894 -row 05895 -row 05896 -row 05897 -row 05898 -row 05899 -row 05900 -row 05901 -row 05902 -row 05903 -row 05904 -row 05905 -row 05906 -row 05907 -row 05908 -row 05909 -row 05910 -row 05911 -row 05912 -row 05913 -row 05914 -row 05915 -row 05916 -row 05917 -row 05918 -row 05919 -row 05920 -row 05921 -row 05922 -row 05923 -row 05924 -row 05925 -row 05926 -row 05927 -row 05928 -row 05929 -row 05930 -row 05931 -row 05932 -row 05933 -row 05934 -row 05935 -row 05936 -row 05937 -row 05938 -row 05939 -row 05940 -row 05941 -row 05942 -row 05943 -row 05944 -row 05945 -row 05946 -row 05947 -row 05948 -row 05949 -row 05950 -row 05951 -row 05952 -row 05953 -row 05954 -row 05955 -row 05956 -row 05957 -row 05958 -row 05959 -row 05960 -row 05961 -row 05962 -row 05963 -row 05964 -row 05965 -row 05966 -row 05967 -row 05968 -row 05969 -row 05970 -row 05971 -row 05972 -row 05973 -row 05974 -row 05975 -row 05976 -row 05977 -row 05978 -row 05979 -row 05980 -row 05981 -row 05982 -row 05983 -row 05984 -row 05985 -row 05986 -row 05987 -row 05988 -row 05989 -row 05990 -row 05991 -row 05992 -row 05993 -row 05994 -row 05995 -row 05996 -row 05997 -row 05998 -row 05999 -row 06000 -row 06001 -row 06002 -row 06003 -row 06004 -row 06005 -row 06006 -row 06007 -row 06008 -row 06009 -row 06010 -row 06011 -row 06012 -row 06013 -row 06014 -row 06015 -row 06016 -row 06017 -row 06018 -row 06019 -row 06020 -row 06021 -row 06022 -row 06023 -row 06024 -row 06025 -row 06026 -row 06027 -row 06028 -row 06029 -row 06030 -row 06031 -row 06032 -row 06033 -row 06034 -row 06035 -row 06036 -row 06037 -row 06038 -row 06039 -row 06040 -row 06041 -row 06042 -row 06043 -row 06044 -row 06045 -row 06046 -row 06047 -row 06048 -row 06049 -row 06050 -row 06051 -row 06052 -row 06053 -row 06054 -row 06055 -row 06056 -row 06057 -row 06058 -row 06059 -row 06060 -row 06061 -row 06062 -row 06063 -row 06064 -row 06065 -row 06066 -row 06067 -row 06068 -row 06069 -row 06070 -row 06071 -row 06072 -row 06073 -row 06074 -row 06075 -row 06076 -row 06077 -row 06078 -row 06079 -row 06080 -row 06081 -row 06082 -row 06083 -row 06084 -row 06085 -row 06086 -row 06087 -row 06088 -row 06089 -row 06090 -row 06091 -row 06092 -row 06093 -row 06094 -row 06095 -row 06096 -row 06097 -row 06098 -row 06099 -row 06100 -row 06101 -row 06102 -row 06103 -row 06104 -row 06105 -row 06106 -row 06107 -row 06108 -row 06109 -row 06110 -row 06111 -row 06112 -row 06113 -row 06114 -row 06115 -row 06116 -row 06117 -row 06118 -row 06119 -row 06120 -row 06121 -row 06122 -row 06123 -row 06124 -row 06125 -row 06126 -row 06127 -row 06128 -row 06129 -row 06130 -row 06131 -row 06132 -row 06133 -row 06134 -row 06135 -row 06136 -row 06137 -row 06138 -row 06139 -row 06140 -row 06141 -row 06142 -row 06143 -row 06144 -row 06145 -row 06146 -row 06147 -row 06148 -row 06149 -row 06150 -row 06151 -row 06152 -row 06153 -row 06154 -row 06155 -row 06156 -row 06157 -row 06158 -row 06159 -row 06160 -row 06161 -row 06162 -row 06163 -row 06164 -row 06165 -row 06166 -row 06167 -row 06168 -row 06169 -row 06170 -row 06171 -row 06172 -row 06173 -row 06174 -row 06175 -row 06176 -row 06177 -row 06178 -row 06179 -row 06180 -row 06181 -row 06182 -row 06183 -row 06184 -row 06185 -row 06186 -row 06187 -row 06188 -row 06189 -row 06190 -row 06191 -row 06192 -row 06193 -row 06194 -row 06195 -row 06196 -row 06197 -row 06198 -row 06199 -row 06200 -row 06201 -row 06202 -row 06203 -row 06204 -row 06205 -row 06206 -row 06207 -row 06208 -row 06209 -row 06210 -row 06211 -row 06212 -row 06213 -row 06214 -row 06215 -row 06216 -row 06217 -row 06218 -row 06219 -row 06220 -row 06221 -row 06222 -row 06223 -row 06224 -row 06225 -row 06226 -row 06227 -row 06228 -row 06229 -row 06230 -row 06231 -row 06232 -row 06233 -row 06234 -row 06235 -row 06236 -row 06237 -row 06238 -row 06239 -row 06240 -row 06241 -row 06242 -row 06243 -row 06244 -row 06245 -row 06246 -row 06247 -row 06248 -row 06249 -row 06250 -row 06251 -row 06252 -row 06253 -row 06254 -row 06255 -row 06256 -row 06257 -row 06258 -row 06259 -row 06260 -row 06261 -row 06262 -row 06263 -row 06264 -row 06265 -row 06266 -row 06267 -row 06268 -row 06269 -row 06270 -row 06271 -row 06272 -row 06273 -row 06274 -row 06275 -row 06276 -row 06277 -row 06278 -row 06279 -row 06280 -row 06281 -row 06282 -row 06283 -row 06284 -row 06285 -row 06286 -row 06287 -row 06288 -row 06289 -row 06290 -row 06291 -row 06292 -row 06293 -row 06294 -row 06295 -row 06296 -row 06297 -row 06298 -row 06299 -row 06300 -row 06301 -row 06302 -row 06303 -row 06304 -row 06305 -row 06306 -row 06307 -row 06308 -row 06309 -row 06310 -row 06311 -row 06312 -row 06313 -row 06314 -row 06315 -row 06316 -row 06317 -row 06318 -row 06319 -row 06320 -row 06321 -row 06322 -row 06323 -row 06324 -row 06325 -row 06326 -row 06327 -row 06328 -row 06329 -row 06330 -row 06331 -row 06332 -row 06333 -row 06334 -row 06335 -row 06336 -row 06337 -row 06338 -row 06339 -row 06340 -row 06341 -row 06342 -row 06343 -row 06344 -row 06345 -row 06346 -row 06347 -row 06348 -row 06349 -row 06350 -row 06351 -row 06352 -row 06353 -row 06354 -row 06355 -row 06356 -row 06357 -row 06358 -row 06359 -row 06360 -row 06361 -row 06362 -row 06363 -row 06364 -row 06365 -row 06366 -row 06367 -row 06368 -row 06369 -row 06370 -row 06371 -row 06372 -row 06373 -row 06374 -row 06375 -row 06376 -row 06377 -row 06378 -row 06379 -row 06380 -row 06381 -row 06382 -row 06383 -row 06384 -row 06385 -row 06386 -row 06387 -row 06388 -row 06389 -row 06390 -row 06391 -row 06392 -row 06393 -row 06394 -row 06395 -row 06396 -row 06397 -row 06398 -row 06399 -row 06400 -row 06401 -row 06402 -row 06403 -row 06404 -row 06405 -row 06406 -row 06407 -row 06408 -row 06409 -row 06410 -row 06411 -row 06412 -row 06413 -row 06414 -row 06415 -row 06416 -row 06417 -row 06418 -row 06419 -row 06420 -row 06421 -row 06422 -row 06423 -row 06424 -row 06425 -row 06426 -row 06427 -row 06428 -row 06429 -row 06430 -row 06431 -row 06432 -row 06433 -row 06434 -row 06435 -row 06436 -row 06437 -row 06438 -row 06439 -row 06440 -row 06441 -row 06442 -row 06443 -row 06444 -row 06445 -row 06446 -row 06447 -row 06448 -row 06449 -row 06450 -row 06451 -row 06452 -row 06453 -row 06454 -row 06455 -row 06456 -row 06457 -row 06458 -row 06459 -row 06460 -row 06461 -row 06462 -row 06463 -row 06464 -row 06465 -row 06466 -row 06467 -row 06468 -row 06469 -row 06470 -row 06471 -row 06472 -row 06473 -row 06474 -row 06475 -row 06476 -row 06477 -row 06478 -row 06479 -row 06480 -row 06481 -row 06482 -row 06483 -row 06484 -row 06485 -row 06486 -row 06487 -row 06488 -row 06489 -row 06490 -row 06491 -row 06492 -row 06493 -row 06494 -row 06495 -row 06496 -row 06497 -row 06498 -row 06499 -row 06500 -row 06501 -row 06502 -row 06503 -row 06504 -row 06505 -row 06506 -row 06507 -row 06508 -row 06509 -row 06510 -row 06511 -row 06512 -row 06513 -row 06514 -row 06515 -row 06516 -row 06517 -row 06518 -row 06519 -row 06520 -row 06521 -row 06522 -row 06523 -row 06524 -row 06525 -row 06526 -row 06527 -row 06528 -row 06529 -row 06530 -row 06531 -row 06532 -row 06533 -row 06534 -row 06535 -row 06536 -row 06537 -row 06538 -row 06539 -row 06540 -row 06541 -row 06542 -row 06543 -row 06544 -row 06545 -row 06546 -row 06547 -row 06548 -row 06549 -row 06550 -row 06551 -row 06552 -row 06553 -row 06554 -row 06555 -row 06556 -row 06557 -row 06558 -row 06559 -row 06560 -row 06561 -row 06562 -row 06563 -row 06564 -row 06565 -row 06566 -row 06567 -row 06568 -row 06569 -row 06570 -row 06571 -row 06572 -row 06573 -row 06574 -row 06575 -row 06576 -row 06577 -row 06578 -row 06579 -row 06580 -row 06581 -row 06582 -row 06583 -row 06584 -row 06585 -row 06586 -row 06587 -row 06588 -row 06589 -row 06590 -row 06591 -row 06592 -row 06593 -row 06594 -row 06595 -row 06596 -row 06597 -row 06598 -row 06599 -row 06600 -row 06601 -row 06602 -row 06603 -row 06604 -row 06605 -row 06606 -row 06607 -row 06608 -row 06609 -row 06610 -row 06611 -row 06612 -row 06613 -row 06614 -row 06615 -row 06616 -row 06617 -row 06618 -row 06619 -row 06620 -row 06621 -row 06622 -row 06623 -row 06624 -row 06625 -row 06626 -row 06627 -row 06628 -row 06629 -row 06630 -row 06631 -row 06632 -row 06633 -row 06634 -row 06635 -row 06636 -row 06637 -row 06638 -row 06639 -row 06640 -row 06641 -row 06642 -row 06643 -row 06644 -row 06645 -row 06646 -row 06647 -row 06648 -row 06649 -row 06650 -row 06651 -row 06652 -row 06653 -row 06654 -row 06655 -row 06656 -row 06657 -row 06658 -row 06659 -row 06660 -row 06661 -row 06662 -row 06663 -row 06664 -row 06665 -row 06666 -row 06667 -row 06668 -row 06669 -row 06670 -row 06671 -row 06672 -row 06673 -row 06674 -row 06675 -row 06676 -row 06677 -row 06678 -row 06679 -row 06680 -row 06681 -row 06682 -row 06683 -row 06684 -row 06685 -row 06686 -row 06687 -row 06688 -row 06689 -row 06690 -row 06691 -row 06692 -row 06693 -row 06694 -row 06695 -row 06696 -row 06697 -row 06698 -row 06699 -row 06700 -row 06701 -row 06702 -row 06703 -row 06704 -row 06705 -row 06706 -row 06707 -row 06708 -row 06709 -row 06710 -row 06711 -row 06712 -row 06713 -row 06714 -row 06715 -row 06716 -row 06717 -row 06718 -row 06719 -row 06720 -row 06721 -row 06722 -row 06723 -row 06724 -row 06725 -row 06726 -row 06727 -row 06728 -row 06729 -row 06730 -row 06731 -row 06732 -row 06733 -row 06734 -row 06735 -row 06736 -row 06737 -row 06738 -row 06739 -row 06740 -row 06741 -row 06742 -row 06743 -row 06744 -row 06745 -row 06746 -row 06747 -row 06748 -row 06749 -row 06750 -row 06751 -row 06752 -row 06753 -row 06754 -row 06755 -row 06756 -row 06757 -row 06758 -row 06759 -row 06760 -row 06761 -row 06762 -row 06763 -row 06764 -row 06765 -row 06766 -row 06767 -row 06768 -row 06769 -row 06770 -row 06771 -row 06772 -row 06773 -row 06774 -row 06775 -row 06776 -row 06777 -row 06778 -row 06779 -row 06780 -row 06781 -row 06782 -row 06783 -row 06784 -row 06785 -row 06786 -row 06787 -row 06788 -row 06789 -row 06790 -row 06791 -row 06792 -row 06793 -row 06794 -row 06795 -row 06796 -row 06797 -row 06798 -row 06799 -row 06800 -row 06801 -row 06802 -row 06803 -row 06804 -row 06805 -row 06806 -row 06807 -row 06808 -row 06809 -row 06810 -row 06811 -row 06812 -row 06813 -row 06814 -row 06815 -row 06816 -row 06817 -row 06818 -row 06819 -row 06820 -row 06821 -row 06822 -row 06823 -row 06824 -row 06825 -row 06826 -row 06827 -row 06828 -row 06829 -row 06830 -row 06831 -row 06832 -row 06833 -row 06834 -row 06835 -row 06836 -row 06837 -row 06838 -row 06839 -row 06840 -row 06841 -row 06842 -row 06843 -row 06844 -row 06845 -row 06846 -row 06847 -row 06848 -row 06849 -row 06850 -row 06851 -row 06852 -row 06853 -row 06854 -row 06855 -row 06856 -row 06857 -row 06858 -row 06859 -row 06860 -row 06861 -row 06862 -row 06863 -row 06864 -row 06865 -row 06866 -row 06867 -row 06868 -row 06869 -row 06870 -row 06871 -row 06872 -row 06873 -row 06874 -row 06875 -row 06876 -row 06877 -row 06878 -row 06879 -row 06880 -row 06881 -row 06882 -row 06883 -row 06884 -row 06885 -row 06886 -row 06887 -row 06888 -row 06889 -row 06890 -row 06891 -row 06892 -row 06893 -row 06894 -row 06895 -row 06896 -row 06897 -row 06898 -row 06899 -row 06900 -row 06901 -row 06902 -row 06903 -row 06904 -row 06905 -row 06906 -row 06907 -row 06908 -row 06909 -row 06910 -row 06911 -row 06912 -row 06913 -row 06914 -row 06915 -row 06916 -row 06917 -row 06918 -row 06919 -row 06920 -row 06921 -row 06922 -row 06923 -row 06924 -row 06925 -row 06926 -row 06927 -row 06928 -row 06929 -row 06930 -row 06931 -row 06932 -row 06933 -row 06934 -row 06935 -row 06936 -row 06937 -row 06938 -row 06939 -row 06940 -row 06941 -row 06942 -row 06943 -row 06944 -row 06945 -row 06946 -row 06947 -row 06948 -row 06949 -row 06950 -row 06951 -row 06952 -row 06953 -row 06954 -row 06955 -row 06956 -row 06957 -row 06958 -row 06959 -row 06960 -row 06961 -row 06962 -row 06963 -row 06964 -row 06965 -row 06966 -row 06967 -row 06968 -row 06969 -row 06970 -row 06971 -row 06972 -row 06973 -row 06974 -row 06975 -row 06976 -row 06977 -row 06978 -row 06979 -row 06980 -row 06981 -row 06982 -row 06983 -row 06984 -row 06985 -row 06986 -row 06987 -row 06988 -row 06989 -row 06990 -row 06991 -row 06992 -row 06993 -row 06994 -row 06995 -row 06996 -row 06997 -row 06998 -row 06999 -row 07000 -row 07001 -row 07002 -row 07003 -row 07004 -row 07005 -row 07006 -row 07007 -row 07008 -row 07009 -row 07010 -row 07011 -row 07012 -row 07013 -row 07014 -row 07015 -row 07016 -row 07017 -row 07018 -row 07019 -row 07020 -row 07021 -row 07022 -row 07023 -row 07024 -row 07025 -row 07026 -row 07027 -row 07028 -row 07029 -row 07030 -row 07031 -row 07032 -row 07033 -row 07034 -row 07035 -row 07036 -row 07037 -row 07038 -row 07039 -row 07040 -row 07041 -row 07042 -row 07043 -row 07044 -row 07045 -row 07046 -row 07047 -row 07048 -row 07049 -row 07050 -row 07051 -row 07052 -row 07053 -row 07054 -row 07055 -row 07056 -row 07057 -row 07058 -row 07059 -row 07060 -row 07061 -row 07062 -row 07063 -row 07064 -row 07065 -row 07066 -row 07067 -row 07068 -row 07069 -row 07070 -row 07071 -row 07072 -row 07073 -row 07074 -row 07075 -row 07076 -row 07077 -row 07078 -row 07079 -row 07080 -row 07081 -row 07082 -row 07083 -row 07084 -row 07085 -row 07086 -row 07087 -row 07088 -row 07089 -row 07090 -row 07091 -row 07092 -row 07093 -row 07094 -row 07095 -row 07096 -row 07097 -row 07098 -row 07099 -row 07100 -row 07101 -row 07102 -row 07103 -row 07104 -row 07105 -row 07106 -row 07107 -row 07108 -row 07109 -row 07110 -row 07111 -row 07112 -row 07113 -row 07114 -row 07115 -row 07116 -row 07117 -row 07118 -row 07119 -row 07120 -row 07121 -row 07122 -row 07123 -row 07124 -row 07125 -row 07126 -row 07127 -row 07128 -row 07129 -row 07130 -row 07131 -row 07132 -row 07133 -row 07134 -row 07135 -row 07136 -row 07137 -row 07138 -row 07139 -row 07140 -row 07141 -row 07142 -row 07143 -row 07144 -row 07145 -row 07146 -row 07147 -row 07148 -row 07149 -row 07150 -row 07151 -row 07152 -row 07153 -row 07154 -row 07155 -row 07156 -row 07157 -row 07158 -row 07159 -row 07160 -row 07161 -row 07162 -row 07163 -row 07164 -row 07165 -row 07166 -row 07167 -row 07168 -row 07169 -row 07170 -row 07171 -row 07172 -row 07173 -row 07174 -row 07175 -row 07176 -row 07177 -row 07178 -row 07179 -row 07180 -row 07181 -row 07182 -row 07183 -row 07184 -row 07185 -row 07186 -row 07187 -row 07188 -row 07189 -row 07190 -row 07191 -row 07192 -row 07193 -row 07194 -row 07195 -row 07196 -row 07197 -row 07198 -row 07199 -row 07200 -row 07201 -row 07202 -row 07203 -row 07204 -row 07205 -row 07206 -row 07207 -row 07208 -row 07209 -row 07210 -row 07211 -row 07212 -row 07213 -row 07214 -row 07215 -row 07216 -row 07217 -row 07218 -row 07219 -row 07220 -row 07221 -row 07222 -row 07223 -row 07224 -row 07225 -row 07226 -row 07227 -row 07228 -row 07229 -row 07230 -row 07231 -row 07232 -row 07233 -row 07234 -row 07235 -row 07236 -row 07237 -row 07238 -row 07239 -row 07240 -row 07241 -row 07242 -row 07243 -row 07244 -row 07245 -row 07246 -row 07247 -row 07248 -row 07249 -row 07250 -row 07251 -row 07252 -row 07253 -row 07254 -row 07255 -row 07256 -row 07257 -row 07258 -row 07259 -row 07260 -row 07261 -row 07262 -row 07263 -row 07264 -row 07265 -row 07266 -row 07267 -row 07268 -row 07269 -row 07270 -row 07271 -row 07272 -row 07273 -row 07274 -row 07275 -row 07276 -row 07277 -row 07278 -row 07279 -row 07280 -row 07281 -row 07282 -row 07283 -row 07284 -row 07285 -row 07286 -row 07287 -row 07288 -row 07289 -row 07290 -row 07291 -row 07292 -row 07293 -row 07294 -row 07295 -row 07296 -row 07297 -row 07298 -row 07299 -row 07300 -row 07301 -row 07302 -row 07303 -row 07304 -row 07305 -row 07306 -row 07307 -row 07308 -row 07309 -row 07310 -row 07311 -row 07312 -row 07313 -row 07314 -row 07315 -row 07316 -row 07317 -row 07318 -row 07319 -row 07320 -row 07321 -row 07322 -row 07323 -row 07324 -row 07325 -row 07326 -row 07327 -row 07328 -row 07329 -row 07330 -row 07331 -row 07332 -row 07333 -row 07334 -row 07335 -row 07336 -row 07337 -row 07338 -row 07339 -row 07340 -row 07341 -row 07342 -row 07343 -row 07344 -row 07345 -row 07346 -row 07347 -row 07348 -row 07349 -row 07350 -row 07351 -row 07352 -row 07353 -row 07354 -row 07355 -row 07356 -row 07357 -row 07358 -row 07359 -row 07360 -row 07361 -row 07362 -row 07363 -row 07364 -row 07365 -row 07366 -row 07367 -row 07368 -row 07369 -row 07370 -row 07371 -row 07372 -row 07373 -row 07374 -row 07375 -row 07376 -row 07377 -row 07378 -row 07379 -row 07380 -row 07381 -row 07382 -row 07383 -row 07384 -row 07385 -row 07386 -row 07387 -row 07388 -row 07389 -row 07390 -row 07391 -row 07392 -row 07393 -row 07394 -row 07395 -row 07396 -row 07397 -row 07398 -row 07399 -row 07400 -row 07401 -row 07402 -row 07403 -row 07404 -row 07405 -row 07406 -row 07407 -row 07408 -row 07409 -row 07410 -row 07411 -row 07412 -row 07413 -row 07414 -row 07415 -row 07416 -row 07417 -row 07418 -row 07419 -row 07420 -row 07421 -row 07422 -row 07423 -row 07424 -row 07425 -row 07426 -row 07427 -row 07428 -row 07429 -row 07430 -row 07431 -row 07432 -row 07433 -row 07434 -row 07435 -row 07436 -row 07437 -row 07438 -row 07439 -row 07440 -row 07441 -row 07442 -row 07443 -row 07444 -row 07445 -row 07446 -row 07447 -row 07448 -row 07449 -row 07450 -row 07451 -row 07452 -row 07453 -row 07454 -row 07455 -row 07456 -row 07457 -row 07458 -row 07459 -row 07460 -row 07461 -row 07462 -row 07463 -row 07464 -row 07465 -row 07466 -row 07467 -row 07468 -row 07469 -row 07470 -row 07471 -row 07472 -row 07473 -row 07474 -row 07475 -row 07476 -row 07477 -row 07478 -row 07479 -row 07480 -row 07481 -row 07482 -row 07483 -row 07484 -row 07485 -row 07486 -row 07487 -row 07488 -row 07489 -row 07490 -row 07491 -row 07492 -row 07493 -row 07494 -row 07495 -row 07496 -row 07497 -row 07498 -row 07499 -row 07500 -row 07501 -row 07502 -row 07503 -row 07504 -row 07505 -row 07506 -row 07507 -row 07508 -row 07509 -row 07510 -row 07511 -row 07512 -row 07513 -row 07514 -row 07515 -row 07516 -row 07517 -row 07518 -row 07519 -row 07520 -row 07521 -row 07522 -row 07523 -row 07524 -row 07525 -row 07526 -row 07527 -row 07528 -row 07529 -row 07530 -row 07531 -row 07532 -row 07533 -row 07534 -row 07535 -row 07536 -row 07537 -row 07538 -row 07539 -row 07540 -row 07541 -row 07542 -row 07543 -row 07544 -row 07545 -row 07546 -row 07547 -row 07548 -row 07549 -row 07550 -row 07551 -row 07552 -row 07553 -row 07554 -row 07555 -row 07556 -row 07557 -row 07558 -row 07559 -row 07560 -row 07561 -row 07562 -row 07563 -row 07564 -row 07565 -row 07566 -row 07567 -row 07568 -row 07569 -row 07570 -row 07571 -row 07572 -row 07573 -row 07574 -row 07575 -row 07576 -row 07577 -row 07578 -row 07579 -row 07580 -row 07581 -row 07582 -row 07583 -row 07584 -row 07585 -row 07586 -row 07587 -row 07588 -row 07589 -row 07590 -row 07591 -row 07592 -row 07593 -row 07594 -row 07595 -row 07596 -row 07597 -row 07598 -row 07599 -row 07600 -row 07601 -row 07602 -row 07603 -row 07604 -row 07605 -row 07606 -row 07607 -row 07608 -row 07609 -row 07610 -row 07611 -row 07612 -row 07613 -row 07614 -row 07615 -row 07616 -row 07617 -row 07618 -row 07619 -row 07620 -row 07621 -row 07622 -row 07623 -row 07624 -row 07625 -row 07626 -row 07627 -row 07628 -row 07629 -row 07630 -row 07631 -row 07632 -row 07633 -row 07634 -row 07635 -row 07636 -row 07637 -row 07638 -row 07639 -row 07640 -row 07641 -row 07642 -row 07643 -row 07644 -row 07645 -row 07646 -row 07647 -row 07648 -row 07649 -row 07650 -row 07651 -row 07652 -row 07653 -row 07654 -row 07655 -row 07656 -row 07657 -row 07658 -row 07659 -row 07660 -row 07661 -row 07662 -row 07663 -row 07664 -row 07665 -row 07666 -row 07667 -row 07668 -row 07669 -row 07670 -row 07671 -row 07672 -row 07673 -row 07674 -row 07675 -row 07676 -row 07677 -row 07678 -row 07679 -row 07680 -row 07681 -row 07682 -row 07683 -row 07684 -row 07685 -row 07686 -row 07687 -row 07688 -row 07689 -row 07690 -row 07691 -row 07692 -row 07693 -row 07694 -row 07695 -row 07696 -row 07697 -row 07698 -row 07699 -row 07700 -row 07701 -row 07702 -row 07703 -row 07704 -row 07705 -row 07706 -row 07707 -row 07708 -row 07709 -row 07710 -row 07711 -row 07712 -row 07713 -row 07714 -row 07715 -row 07716 -row 07717 -row 07718 -row 07719 -row 07720 -row 07721 -row 07722 -row 07723 -row 07724 -row 07725 -row 07726 -row 07727 -row 07728 -row 07729 -row 07730 -row 07731 -row 07732 -row 07733 -row 07734 -row 07735 -row 07736 -row 07737 -row 07738 -row 07739 -row 07740 -row 07741 -row 07742 -row 07743 -row 07744 -row 07745 -row 07746 -row 07747 -row 07748 -row 07749 -row 07750 -row 07751 -row 07752 -row 07753 -row 07754 -row 07755 -row 07756 -row 07757 -row 07758 -row 07759 -row 07760 -row 07761 -row 07762 -row 07763 -row 07764 -row 07765 -row 07766 -row 07767 -row 07768 -row 07769 -row 07770 -row 07771 -row 07772 -row 07773 -row 07774 -row 07775 -row 07776 -row 07777 -row 07778 -row 07779 -row 07780 -row 07781 -row 07782 -row 07783 -row 07784 -row 07785 -row 07786 -row 07787 -row 07788 -row 07789 -row 07790 -row 07791 -row 07792 -row 07793 -row 07794 -row 07795 -row 07796 -row 07797 -row 07798 -row 07799 -row 07800 -row 07801 -row 07802 -row 07803 -row 07804 -row 07805 -row 07806 -row 07807 -row 07808 -row 07809 -row 07810 -row 07811 -row 07812 -row 07813 -row 07814 -row 07815 -row 07816 -row 07817 -row 07818 -row 07819 -row 07820 -row 07821 -row 07822 -row 07823 -row 07824 -row 07825 -row 07826 -row 07827 -row 07828 -row 07829 -row 07830 -row 07831 -row 07832 -row 07833 -row 07834 -row 07835 -row 07836 -row 07837 -row 07838 -row 07839 -row 07840 -row 07841 -row 07842 -row 07843 -row 07844 -row 07845 -row 07846 -row 07847 -row 07848 -row 07849 -row 07850 -row 07851 -row 07852 -row 07853 -row 07854 -row 07855 -row 07856 -row 07857 -row 07858 -row 07859 -row 07860 -row 07861 -row 07862 -row 07863 -row 07864 -row 07865 -row 07866 -row 07867 -row 07868 -row 07869 -row 07870 -row 07871 -row 07872 -row 07873 -row 07874 -row 07875 -row 07876 -row 07877 -row 07878 -row 07879 -row 07880 -row 07881 -row 07882 -row 07883 -row 07884 -row 07885 -row 07886 -row 07887 -row 07888 -row 07889 -row 07890 -row 07891 -row 07892 -row 07893 -row 07894 -row 07895 -row 07896 -row 07897 -row 07898 -row 07899 -row 07900 -row 07901 -row 07902 -row 07903 -row 07904 -row 07905 -row 07906 -row 07907 -row 07908 -row 07909 -row 07910 -row 07911 -row 07912 -row 07913 -row 07914 -row 07915 -row 07916 -row 07917 -row 07918 -row 07919 -row 07920 -row 07921 -row 07922 -row 07923 -row 07924 -row 07925 -row 07926 -row 07927 -row 07928 -row 07929 -row 07930 -row 07931 -row 07932 -row 07933 -row 07934 -row 07935 -row 07936 -row 07937 -row 07938 -row 07939 -row 07940 -row 07941 -row 07942 -row 07943 -row 07944 -row 07945 -row 07946 -row 07947 -row 07948 -row 07949 -row 07950 -row 07951 -row 07952 -row 07953 -row 07954 -row 07955 -row 07956 -row 07957 -row 07958 -row 07959 -row 07960 -row 07961 -row 07962 -row 07963 -row 07964 -row 07965 -row 07966 -row 07967 -row 07968 -row 07969 -row 07970 -row 07971 -row 07972 -row 07973 -row 07974 -row 07975 -row 07976 -row 07977 -row 07978 -row 07979 -row 07980 -row 07981 -row 07982 -row 07983 -row 07984 -row 07985 -row 07986 -row 07987 -row 07988 -row 07989 -row 07990 -row 07991 -row 07992 -row 07993 -row 07994 -row 07995 -row 07996 -row 07997 -row 07998 -row 07999 -row 08000 -row 08001 -row 08002 -row 08003 -row 08004 -row 08005 -row 08006 -row 08007 -row 08008 -row 08009 -row 08010 -row 08011 -row 08012 -row 08013 -row 08014 -row 08015 -row 08016 -row 08017 -row 08018 -row 08019 -row 08020 -row 08021 -row 08022 -row 08023 -row 08024 -row 08025 -row 08026 -row 08027 -row 08028 -row 08029 -row 08030 -row 08031 -row 08032 -row 08033 -row 08034 -row 08035 -row 08036 -row 08037 -row 08038 -row 08039 -row 08040 -row 08041 -row 08042 -row 08043 -row 08044 -row 08045 -row 08046 -row 08047 -row 08048 -row 08049 -row 08050 -row 08051 -row 08052 -row 08053 -row 08054 -row 08055 -row 08056 -row 08057 -row 08058 -row 08059 -row 08060 -row 08061 -row 08062 -row 08063 -row 08064 -row 08065 -row 08066 -row 08067 -row 08068 -row 08069 -row 08070 -row 08071 -row 08072 -row 08073 -row 08074 -row 08075 -row 08076 -row 08077 -row 08078 -row 08079 -row 08080 -row 08081 -row 08082 -row 08083 -row 08084 -row 08085 -row 08086 -row 08087 -row 08088 -row 08089 -row 08090 -row 08091 -row 08092 -row 08093 -row 08094 -row 08095 -row 08096 -row 08097 -row 08098 -row 08099 -row 08100 -row 08101 -row 08102 -row 08103 -row 08104 -row 08105 -row 08106 -row 08107 -row 08108 -row 08109 -row 08110 -row 08111 -row 08112 -row 08113 -row 08114 -row 08115 -row 08116 -row 08117 -row 08118 -row 08119 -row 08120 -row 08121 -row 08122 -row 08123 -row 08124 -row 08125 -row 08126 -row 08127 -row 08128 -row 08129 -row 08130 -row 08131 -row 08132 -row 08133 -row 08134 -row 08135 -row 08136 -row 08137 -row 08138 -row 08139 -row 08140 -row 08141 -row 08142 -row 08143 -row 08144 -row 08145 -row 08146 -row 08147 -row 08148 -row 08149 -row 08150 -row 08151 -row 08152 -row 08153 -row 08154 -row 08155 -row 08156 -row 08157 -row 08158 -row 08159 -row 08160 -row 08161 -row 08162 -row 08163 -row 08164 -row 08165 -row 08166 -row 08167 -row 08168 -row 08169 -row 08170 -row 08171 -row 08172 -row 08173 -row 08174 -row 08175 -row 08176 -row 08177 -row 08178 -row 08179 -row 08180 -row 08181 -row 08182 -row 08183 -row 08184 -row 08185 -row 08186 -row 08187 -row 08188 -row 08189 -row 08190 -row 08191 -row 08192 -row 08193 -row 08194 -row 08195 -row 08196 -row 08197 -row 08198 -row 08199 -row 08200 -row 08201 -row 08202 -row 08203 -row 08204 -row 08205 -row 08206 -row 08207 -row 08208 -row 08209 -row 08210 -row 08211 -row 08212 -row 08213 -row 08214 -row 08215 -row 08216 -row 08217 -row 08218 -row 08219 -row 08220 -row 08221 -row 08222 -row 08223 -row 08224 -row 08225 -row 08226 -row 08227 -row 08228 -row 08229 -row 08230 -row 08231 -row 08232 -row 08233 -row 08234 -row 08235 -row 08236 -row 08237 -row 08238 -row 08239 -row 08240 -row 08241 -row 08242 -row 08243 -row 08244 -row 08245 -row 08246 -row 08247 -row 08248 -row 08249 -row 08250 -row 08251 -row 08252 -row 08253 -row 08254 -row 08255 -row 08256 -row 08257 -row 08258 -row 08259 -row 08260 -row 08261 -row 08262 -row 08263 -row 08264 -row 08265 -row 08266 -row 08267 -row 08268 -row 08269 -row 08270 -row 08271 -row 08272 -row 08273 -row 08274 -row 08275 -row 08276 -row 08277 -row 08278 -row 08279 -row 08280 -row 08281 -row 08282 -row 08283 -row 08284 -row 08285 -row 08286 -row 08287 -row 08288 -row 08289 -row 08290 -row 08291 -row 08292 -row 08293 -row 08294 -row 08295 -row 08296 -row 08297 -row 08298 -row 08299 -row 08300 -row 08301 -row 08302 -row 08303 -row 08304 -row 08305 -row 08306 -row 08307 -row 08308 -row 08309 -row 08310 -row 08311 -row 08312 -row 08313 -row 08314 -row 08315 -row 08316 -row 08317 -row 08318 -row 08319 -row 08320 -row 08321 -row 08322 -row 08323 -row 08324 -row 08325 -row 08326 -row 08327 -row 08328 -row 08329 -row 08330 -row 08331 -row 08332 -row 08333 -row 08334 -row 08335 -row 08336 -row 08337 -row 08338 -row 08339 -row 08340 -row 08341 -row 08342 -row 08343 -row 08344 -row 08345 -row 08346 -row 08347 -row 08348 -row 08349 -row 08350 -row 08351 -row 08352 -row 08353 -row 08354 -row 08355 -row 08356 -row 08357 -row 08358 -row 08359 -row 08360 -row 08361 -row 08362 -row 08363 -row 08364 -row 08365 -row 08366 -row 08367 -row 08368 -row 08369 -row 08370 -row 08371 -row 08372 -row 08373 -row 08374 -row 08375 -row 08376 -row 08377 -row 08378 -row 08379 -row 08380 -row 08381 -row 08382 -row 08383 -row 08384 -row 08385 -row 08386 -row 08387 -row 08388 -row 08389 -row 08390 -row 08391 -row 08392 -row 08393 -row 08394 -row 08395 -row 08396 -row 08397 -row 08398 -row 08399 -row 08400 -row 08401 -row 08402 -row 08403 -row 08404 -row 08405 -row 08406 -row 08407 -row 08408 -row 08409 -row 08410 -row 08411 -row 08412 -row 08413 -row 08414 -row 08415 -row 08416 -row 08417 -row 08418 -row 08419 -row 08420 -row 08421 -row 08422 -row 08423 -row 08424 -row 08425 -row 08426 -row 08427 -row 08428 -row 08429 -row 08430 -row 08431 -row 08432 -row 08433 -row 08434 -row 08435 -row 08436 -row 08437 -row 08438 -row 08439 -row 08440 -row 08441 -row 08442 -row 08443 -row 08444 -row 08445 -row 08446 -row 08447 -row 08448 -row 08449 -row 08450 -row 08451 -row 08452 -row 08453 -row 08454 -row 08455 -row 08456 -row 08457 -row 08458 -row 08459 -row 08460 -row 08461 -row 08462 -row 08463 -row 08464 -row 08465 -row 08466 -row 08467 -row 08468 -row 08469 -row 08470 -row 08471 -row 08472 -row 08473 -row 08474 -row 08475 -row 08476 -row 08477 -row 08478 -row 08479 -row 08480 -row 08481 -row 08482 -row 08483 -row 08484 -row 08485 -row 08486 -row 08487 -row 08488 -row 08489 -row 08490 -row 08491 -row 08492 -row 08493 -row 08494 -row 08495 -row 08496 -row 08497 -row 08498 -row 08499 -row 08500 -row 08501 -row 08502 -row 08503 -row 08504 -row 08505 -row 08506 -row 08507 -row 08508 -row 08509 -row 08510 -row 08511 -row 08512 -row 08513 -row 08514 -row 08515 -row 08516 -row 08517 -row 08518 -row 08519 -row 08520 -row 08521 -row 08522 -row 08523 -row 08524 -row 08525 -row 08526 -row 08527 -row 08528 -row 08529 -row 08530 -row 08531 -row 08532 -row 08533 -row 08534 -row 08535 -row 08536 -row 08537 -row 08538 -row 08539 -row 08540 -row 08541 -row 08542 -row 08543 -row 08544 -row 08545 -row 08546 -row 08547 -row 08548 -row 08549 -row 08550 -row 08551 -row 08552 -row 08553 -row 08554 -row 08555 -row 08556 -row 08557 -row 08558 -row 08559 -row 08560 -row 08561 -row 08562 -row 08563 -row 08564 -row 08565 -row 08566 -row 08567 -row 08568 -row 08569 -row 08570 -row 08571 -row 08572 -row 08573 -row 08574 -row 08575 -row 08576 -row 08577 -row 08578 -row 08579 -row 08580 -row 08581 -row 08582 -row 08583 -row 08584 -row 08585 -row 08586 -row 08587 -row 08588 -row 08589 -row 08590 -row 08591 -row 08592 -row 08593 -row 08594 -row 08595 -row 08596 -row 08597 -row 08598 -row 08599 -row 08600 -row 08601 -row 08602 -row 08603 -row 08604 -row 08605 -row 08606 -row 08607 -row 08608 -row 08609 -row 08610 -row 08611 -row 08612 -row 08613 -row 08614 -row 08615 -row 08616 -row 08617 -row 08618 -row 08619 -row 08620 -row 08621 -row 08622 -row 08623 -row 08624 -row 08625 -row 08626 -row 08627 -row 08628 -row 08629 -row 08630 -row 08631 -row 08632 -row 08633 -row 08634 -row 08635 -row 08636 -row 08637 -row 08638 -row 08639 -row 08640 -row 08641 -row 08642 -row 08643 -row 08644 -row 08645 -row 08646 -row 08647 -row 08648 -row 08649 -row 08650 -row 08651 -row 08652 -row 08653 -row 08654 -row 08655 -row 08656 -row 08657 -row 08658 -row 08659 -row 08660 -row 08661 -row 08662 -row 08663 -row 08664 -row 08665 -row 08666 -row 08667 -row 08668 -row 08669 -row 08670 -row 08671 -row 08672 -row 08673 -row 08674 -row 08675 -row 08676 -row 08677 -row 08678 -row 08679 -row 08680 -row 08681 -row 08682 -row 08683 -row 08684 -row 08685 -row 08686 -row 08687 -row 08688 -row 08689 -row 08690 -row 08691 -row 08692 -row 08693 -row 08694 -row 08695 -row 08696 -row 08697 -row 08698 -row 08699 -row 08700 -row 08701 -row 08702 -row 08703 -row 08704 -row 08705 -row 08706 -row 08707 -row 08708 -row 08709 -row 08710 -row 08711 -row 08712 -row 08713 -row 08714 -row 08715 -row 08716 -row 08717 -row 08718 -row 08719 -row 08720 -row 08721 -row 08722 -row 08723 -row 08724 -row 08725 -row 08726 -row 08727 -row 08728 -row 08729 -row 08730 -row 08731 -row 08732 -row 08733 -row 08734 -row 08735 -row 08736 -row 08737 -row 08738 -row 08739 -row 08740 -row 08741 -row 08742 -row 08743 -row 08744 -row 08745 -row 08746 -row 08747 -row 08748 -row 08749 -row 08750 -row 08751 -row 08752 -row 08753 -row 08754 -row 08755 -row 08756 -row 08757 -row 08758 -row 08759 -row 08760 -row 08761 -row 08762 -row 08763 -row 08764 -row 08765 -row 08766 -row 08767 -row 08768 -row 08769 -row 08770 -row 08771 -row 08772 -row 08773 -row 08774 -row 08775 -row 08776 -row 08777 -row 08778 -row 08779 -row 08780 -row 08781 -row 08782 -row 08783 -row 08784 -row 08785 -row 08786 -row 08787 -row 08788 -row 08789 -row 08790 -row 08791 -row 08792 -row 08793 -row 08794 -row 08795 -row 08796 -row 08797 -row 08798 -row 08799 -row 08800 -row 08801 -row 08802 -row 08803 -row 08804 -row 08805 -row 08806 -row 08807 -row 08808 -row 08809 -row 08810 -row 08811 -row 08812 -row 08813 -row 08814 -row 08815 -row 08816 -row 08817 -row 08818 -row 08819 -row 08820 -row 08821 -row 08822 -row 08823 -row 08824 -row 08825 -row 08826 -row 08827 -row 08828 -row 08829 -row 08830 -row 08831 -row 08832 -row 08833 -row 08834 -row 08835 -row 08836 -row 08837 -row 08838 -row 08839 -row 08840 -row 08841 -row 08842 -row 08843 -row 08844 -row 08845 -row 08846 -row 08847 -row 08848 -row 08849 -row 08850 -row 08851 -row 08852 -row 08853 -row 08854 -row 08855 -row 08856 -row 08857 -row 08858 -row 08859 -row 08860 -row 08861 -row 08862 -row 08863 -row 08864 -row 08865 -row 08866 -row 08867 -row 08868 -row 08869 -row 08870 -row 08871 -row 08872 -row 08873 -row 08874 -row 08875 -row 08876 -row 08877 -row 08878 -row 08879 -row 08880 -row 08881 -row 08882 -row 08883 -row 08884 -row 08885 -row 08886 -row 08887 -row 08888 -row 08889 -row 08890 -row 08891 -row 08892 -row 08893 -row 08894 -row 08895 -row 08896 -row 08897 -row 08898 -row 08899 -row 08900 -row 08901 -row 08902 -row 08903 -row 08904 -row 08905 -row 08906 -row 08907 -row 08908 -row 08909 -row 08910 -row 08911 -row 08912 -row 08913 -row 08914 -row 08915 -row 08916 -row 08917 -row 08918 -row 08919 -row 08920 -row 08921 -row 08922 -row 08923 -row 08924 -row 08925 -row 08926 -row 08927 -row 08928 -row 08929 -row 08930 -row 08931 -row 08932 -row 08933 -row 08934 -row 08935 -row 08936 -row 08937 -row 08938 -row 08939 -row 08940 -row 08941 -row 08942 -row 08943 -row 08944 -row 08945 -row 08946 -row 08947 -row 08948 -row 08949 -row 08950 -row 08951 -row 08952 -row 08953 -row 08954 -row 08955 -row 08956 -row 08957 -row 08958 -row 08959 -row 08960 -row 08961 -row 08962 -row 08963 -row 08964 -row 08965 -row 08966 -row 08967 -row 08968 -row 08969 -row 08970 -row 08971 -row 08972 -row 08973 -row 08974 -row 08975 -row 08976 -row 08977 -row 08978 -row 08979 -row 08980 -row 08981 -row 08982 -row 08983 -row 08984 -row 08985 -row 08986 -row 08987 -row 08988 -row 08989 -row 08990 -row 08991 -row 08992 -row 08993 -row 08994 -row 08995 -row 08996 -row 08997 -row 08998 -row 08999 -row 09000 -row 09001 -row 09002 -row 09003 -row 09004 -row 09005 -row 09006 -row 09007 -row 09008 -row 09009 -row 09010 -row 09011 -row 09012 -row 09013 -row 09014 -row 09015 -row 09016 -row 09017 -row 09018 -row 09019 -row 09020 -row 09021 -row 09022 -row 09023 -row 09024 -row 09025 -row 09026 -row 09027 -row 09028 -row 09029 -row 09030 -row 09031 -row 09032 -row 09033 -row 09034 -row 09035 -row 09036 -row 09037 -row 09038 -row 09039 -row 09040 -row 09041 -row 09042 -row 09043 -row 09044 -row 09045 -row 09046 -row 09047 -row 09048 -row 09049 -row 09050 -row 09051 -row 09052 -row 09053 -row 09054 -row 09055 -row 09056 -row 09057 -row 09058 -row 09059 -row 09060 -row 09061 -row 09062 -row 09063 -row 09064 -row 09065 -row 09066 -row 09067 -row 09068 -row 09069 -row 09070 -row 09071 -row 09072 -row 09073 -row 09074 -row 09075 -row 09076 -row 09077 -row 09078 -row 09079 -row 09080 -row 09081 -row 09082 -row 09083 -row 09084 -row 09085 -row 09086 -row 09087 -row 09088 -row 09089 -row 09090 -row 09091 -row 09092 -row 09093 -row 09094 -row 09095 -row 09096 -row 09097 -row 09098 -row 09099 -row 09100 -row 09101 -row 09102 -row 09103 -row 09104 -row 09105 -row 09106 -row 09107 -row 09108 -row 09109 -row 09110 -row 09111 -row 09112 -row 09113 -row 09114 -row 09115 -row 09116 -row 09117 -row 09118 -row 09119 -row 09120 -row 09121 -row 09122 -row 09123 -row 09124 -row 09125 -row 09126 -row 09127 -row 09128 -row 09129 -row 09130 -row 09131 -row 09132 -row 09133 -row 09134 -row 09135 -row 09136 -row 09137 -row 09138 -row 09139 -row 09140 -row 09141 -row 09142 -row 09143 -row 09144 -row 09145 -row 09146 -row 09147 -row 09148 -row 09149 -row 09150 -row 09151 -row 09152 -row 09153 -row 09154 -row 09155 -row 09156 -row 09157 -row 09158 -row 09159 -row 09160 -row 09161 -row 09162 -row 09163 -row 09164 -row 09165 -row 09166 -row 09167 -row 09168 -row 09169 -row 09170 -row 09171 -row 09172 -row 09173 -row 09174 -row 09175 -row 09176 -row 09177 -row 09178 -row 09179 -row 09180 -row 09181 -row 09182 -row 09183 -row 09184 -row 09185 -row 09186 -row 09187 -row 09188 -row 09189 -row 09190 -row 09191 -row 09192 -row 09193 -row 09194 -row 09195 -row 09196 -row 09197 -row 09198 -row 09199 -row 09200 -row 09201 -row 09202 -row 09203 -row 09204 -row 09205 -row 09206 -row 09207 -row 09208 -row 09209 -row 09210 -row 09211 -row 09212 -row 09213 -row 09214 -row 09215 -row 09216 -row 09217 -row 09218 -row 09219 -row 09220 -row 09221 -row 09222 -row 09223 -row 09224 -row 09225 -row 09226 -row 09227 -row 09228 -row 09229 -row 09230 -row 09231 -row 09232 -row 09233 -row 09234 -row 09235 -row 09236 -row 09237 -row 09238 -row 09239 -row 09240 -row 09241 -row 09242 -row 09243 -row 09244 -row 09245 -row 09246 -row 09247 -row 09248 -row 09249 -row 09250 -row 09251 -row 09252 -row 09253 -row 09254 -row 09255 -row 09256 -row 09257 -row 09258 -row 09259 -row 09260 -row 09261 -row 09262 -row 09263 -row 09264 -row 09265 -row 09266 -row 09267 -row 09268 -row 09269 -row 09270 -row 09271 -row 09272 -row 09273 -row 09274 -row 09275 -row 09276 -row 09277 -row 09278 -row 09279 -row 09280 -row 09281 -row 09282 -row 09283 -row 09284 -row 09285 -row 09286 -row 09287 -row 09288 -row 09289 -row 09290 -row 09291 -row 09292 -row 09293 -row 09294 -row 09295 -row 09296 -row 09297 -row 09298 -row 09299 -row 09300 -row 09301 -row 09302 -row 09303 -row 09304 -row 09305 -row 09306 -row 09307 -row 09308 -row 09309 -row 09310 -row 09311 -row 09312 -row 09313 -row 09314 -row 09315 -row 09316 -row 09317 -row 09318 -row 09319 -row 09320 -row 09321 -row 09322 -row 09323 -row 09324 -row 09325 -row 09326 -row 09327 -row 09328 -row 09329 -row 09330 -row 09331 -row 09332 -row 09333 -row 09334 -row 09335 -row 09336 -row 09337 -row 09338 -row 09339 -row 09340 -row 09341 -row 09342 -row 09343 -row 09344 -row 09345 -row 09346 -row 09347 -row 09348 -row 09349 -row 09350 -row 09351 -row 09352 -row 09353 -row 09354 -row 09355 -row 09356 -row 09357 -row 09358 -row 09359 -row 09360 -row 09361 -row 09362 -row 09363 -row 09364 -row 09365 -row 09366 -row 09367 -row 09368 -row 09369 -row 09370 -row 09371 -row 09372 -row 09373 -row 09374 -row 09375 -row 09376 -row 09377 -row 09378 -row 09379 -row 09380 -row 09381 -row 09382 -row 09383 -row 09384 -row 09385 -row 09386 -row 09387 -row 09388 -row 09389 -row 09390 -row 09391 -row 09392 -row 09393 -row 09394 -row 09395 -row 09396 -row 09397 -row 09398 -row 09399 -row 09400 -row 09401 -row 09402 -row 09403 -row 09404 -row 09405 -row 09406 -row 09407 -row 09408 -row 09409 -row 09410 -row 09411 -row 09412 -row 09413 -row 09414 -row 09415 -row 09416 -row 09417 -row 09418 -row 09419 -row 09420 -row 09421 -row 09422 -row 09423 -row 09424 -row 09425 -row 09426 -row 09427 -row 09428 -row 09429 -row 09430 -row 09431 -row 09432 -row 09433 -row 09434 -row 09435 -row 09436 -row 09437 -row 09438 -row 09439 -row 09440 -row 09441 -row 09442 -row 09443 -row 09444 -row 09445 -row 09446 -row 09447 -row 09448 -row 09449 -row 09450 -row 09451 -row 09452 -row 09453 -row 09454 -row 09455 -row 09456 -row 09457 -row 09458 -row 09459 -row 09460 -row 09461 -row 09462 -row 09463 -row 09464 -row 09465 -row 09466 -row 09467 -row 09468 -row 09469 -row 09470 -row 09471 -row 09472 -row 09473 -row 09474 -row 09475 -row 09476 -row 09477 -row 09478 -row 09479 -row 09480 -row 09481 -row 09482 -row 09483 -row 09484 -row 09485 -row 09486 -row 09487 -row 09488 -row 09489 -row 09490 -row 09491 -row 09492 -row 09493 -row 09494 -row 09495 -row 09496 -row 09497 -row 09498 -row 09499 -row 09500 -row 09501 -row 09502 -row 09503 -row 09504 -row 09505 -row 09506 -row 09507 -row 09508 -row 09509 -row 09510 -row 09511 -row 09512 -row 09513 -row 09514 -row 09515 -row 09516 -row 09517 -row 09518 -row 09519 -row 09520 -row 09521 -row 09522 -row 09523 -row 09524 -row 09525 -row 09526 -row 09527 -row 09528 -row 09529 -row 09530 -row 09531 -row 09532 -row 09533 -row 09534 -row 09535 -row 09536 -row 09537 -row 09538 -row 09539 -row 09540 -row 09541 -row 09542 -row 09543 -row 09544 -row 09545 -row 09546 -row 09547 -row 09548 -row 09549 -row 09550 -row 09551 -row 09552 -row 09553 -row 09554 -row 09555 -row 09556 -row 09557 -row 09558 -row 09559 -row 09560 -row 09561 -row 09562 -row 09563 -row 09564 -row 09565 -row 09566 -row 09567 -row 09568 -row 09569 -row 09570 -row 09571 -row 09572 -row 09573 -row 09574 -row 09575 -row 09576 -row 09577 -row 09578 -row 09579 -row 09580 -row 09581 -row 09582 -row 09583 -row 09584 -row 09585 -row 09586 -row 09587 -row 09588 -row 09589 -row 09590 -row 09591 -row 09592 -row 09593 -row 09594 -row 09595 -row 09596 -row 09597 -row 09598 -row 09599 -row 09600 -row 09601 -row 09602 -row 09603 -row 09604 -row 09605 -row 09606 -row 09607 -row 09608 -row 09609 -row 09610 -row 09611 -row 09612 -row 09613 -row 09614 -row 09615 -row 09616 -row 09617 -row 09618 -row 09619 -row 09620 -row 09621 -row 09622 -row 09623 -row 09624 -row 09625 -row 09626 -row 09627 -row 09628 -row 09629 -row 09630 -row 09631 -row 09632 -row 09633 -row 09634 -row 09635 -row 09636 -row 09637 -row 09638 -row 09639 -row 09640 -row 09641 -row 09642 -row 09643 -row 09644 -row 09645 -row 09646 -row 09647 -row 09648 -row 09649 -row 09650 -row 09651 -row 09652 -row 09653 -row 09654 -row 09655 -row 09656 -row 09657 -row 09658 -row 09659 -row 09660 -row 09661 -row 09662 -row 09663 -row 09664 -row 09665 -row 09666 -row 09667 -row 09668 -row 09669 -row 09670 -row 09671 -row 09672 -row 09673 -row 09674 -row 09675 -row 09676 -row 09677 -row 09678 -row 09679 -row 09680 -row 09681 -row 09682 -row 09683 -row 09684 -row 09685 -row 09686 -row 09687 -row 09688 -row 09689 -row 09690 -row 09691 -row 09692 -row 09693 -row 09694 -row 09695 -row 09696 -row 09697 -row 09698 -row 09699 -row 09700 -row 09701 -row 09702 -row 09703 -row 09704 -row 09705 -row 09706 -row 09707 -row 09708 -row 09709 -row 09710 -row 09711 -row 09712 -row 09713 -row 09714 -row 09715 -row 09716 -row 09717 -row 09718 -row 09719 -row 09720 -row 09721 -row 09722 -row 09723 -row 09724 -row 09725 -row 09726 -row 09727 -row 09728 -row 09729 -row 09730 -row 09731 -row 09732 -row 09733 -row 09734 -row 09735 -row 09736 -row 09737 -row 09738 -row 09739 -row 09740 -row 09741 -row 09742 -row 09743 -row 09744 -row 09745 -row 09746 -row 09747 -row 09748 -row 09749 -row 09750 -row 09751 -row 09752 -row 09753 -row 09754 -row 09755 -row 09756 -row 09757 -row 09758 -row 09759 -row 09760 -row 09761 -row 09762 -row 09763 -row 09764 -row 09765 -row 09766 -row 09767 -row 09768 -row 09769 -row 09770 -row 09771 -row 09772 -row 09773 -row 09774 -row 09775 -row 09776 -row 09777 -row 09778 -row 09779 -row 09780 -row 09781 -row 09782 -row 09783 -row 09784 -row 09785 -row 09786 -row 09787 -row 09788 -row 09789 -row 09790 -row 09791 -row 09792 -row 09793 -row 09794 -row 09795 -row 09796 -row 09797 -row 09798 -row 09799 -row 09800 -row 09801 -row 09802 -row 09803 -row 09804 -row 09805 -row 09806 -row 09807 -row 09808 -row 09809 -row 09810 -row 09811 -row 09812 -row 09813 -row 09814 -row 09815 -row 09816 -row 09817 -row 09818 -row 09819 -row 09820 -row 09821 -row 09822 -row 09823 -row 09824 -row 09825 -row 09826 -row 09827 -row 09828 -row 09829 -row 09830 -row 09831 -row 09832 -row 09833 -row 09834 -row 09835 -row 09836 -row 09837 -row 09838 -row 09839 -row 09840 -row 09841 -row 09842 -row 09843 -row 09844 -row 09845 -row 09846 -row 09847 -row 09848 -row 09849 -row 09850 -row 09851 -row 09852 -row 09853 -row 09854 -row 09855 -row 09856 -row 09857 -row 09858 -row 09859 -row 09860 -row 09861 -row 09862 -row 09863 -row 09864 -row 09865 -row 09866 -row 09867 -row 09868 -row 09869 -row 09870 -row 09871 -row 09872 -row 09873 -row 09874 -row 09875 -row 09876 -row 09877 -row 09878 -row 09879 -row 09880 -row 09881 -row 09882 -row 09883 -row 09884 -row 09885 -row 09886 -row 09887 -row 09888 -row 09889 -row 09890 -row 09891 -row 09892 -row 09893 -row 09894 -row 09895 -row 09896 -row 09897 -row 09898 -row 09899 -row 09900 -row 09901 -row 09902 -row 09903 -row 09904 -row 09905 -row 09906 -row 09907 -row 09908 -row 09909 -row 09910 -row 09911 -row 09912 -row 09913 -row 09914 -row 09915 -row 09916 -row 09917 -row 09918 -row 09919 -row 09920 -row 09921 -row 09922 -row 09923 -row 09924 -row 09925 -row 09926 -row 09927 -row 09928 -row 09929 -row 09930 -row 09931 -row 09932 -row 09933 -row 09934 -row 09935 -row 09936 -row 09937 -row 09938 -row 09939 -row 09940 -row 09941 -row 09942 -row 09943 -row 09944 -row 09945 -row 09946 -row 09947 -row 09948 -row 09949 -row 09950 -row 09951 -row 09952 -row 09953 -row 09954 -row 09955 -row 09956 -row 09957 -row 09958 -row 09959 -row 09960 -row 09961 -row 09962 -row 09963 -row 09964 -row 09965 -row 09966 -row 09967 -row 09968 -row 09969 -row 09970 -row 09971 -row 09972 -row 09973 -row 09974 -row 09975 -row 09976 -row 09977 -row 09978 -row 09979 -row 09980 -row 09981 -row 09982 -row 09983 -row 09984 -row 09985 -row 09986 -row 09987 -row 09988 -row 09989 -row 09990 -row 09991 -row 09992 -row 09993 -row 09994 -row 09995 -row 09996 -row 09997 -row 09998 -row 09999 -row 10000 -row 10001 -row 10002 -row 10003 -row 10004 -row 10005 -row 10006 -row 10007 -row 10008 -row 10009 -row 10010 -row 10011 -row 10012 -row 10013 -row 10014 -row 10015 -row 10016 -row 10017 -row 10018 -row 10019 -row 10020 -row 10021 -row 10022 -row 10023 -row 10024 -row 10025 -row 10026 -row 10027 -row 10028 -row 10029 -row 10030 -row 10031 -row 10032 -row 10033 -row 10034 -row 10035 -row 10036 -row 10037 -row 10038 -row 10039 -row 10040 -row 10041 -row 10042 -row 10043 -row 10044 -row 10045 -row 10046 -row 10047 -row 10048 -row 10049 -row 10050 -row 10051 -row 10052 -row 10053 -row 10054 -row 10055 -row 10056 -row 10057 -row 10058 -row 10059 -row 10060 -row 10061 -row 10062 -row 10063 -row 10064 -row 10065 -row 10066 -row 10067 -row 10068 -row 10069 -row 10070 -row 10071 -row 10072 -row 10073 -row 10074 -row 10075 -row 10076 -row 10077 -row 10078 -row 10079 -row 10080 -row 10081 -row 10082 -row 10083 -row 10084 -row 10085 -row 10086 -row 10087 -row 10088 -row 10089 -row 10090 -row 10091 -row 10092 -row 10093 -row 10094 -row 10095 -row 10096 -row 10097 -row 10098 -row 10099 -row 10100 -row 10101 -row 10102 -row 10103 -row 10104 -row 10105 -row 10106 -row 10107 -row 10108 -row 10109 -row 10110 -row 10111 -row 10112 -row 10113 -row 10114 -row 10115 -row 10116 -row 10117 -row 10118 -row 10119 -row 10120 -row 10121 -row 10122 -row 10123 -row 10124 -row 10125 -row 10126 -row 10127 -row 10128 -row 10129 -row 10130 -row 10131 -row 10132 -row 10133 -row 10134 -row 10135 -row 10136 -row 10137 -row 10138 -row 10139 -row 10140 -row 10141 -row 10142 -row 10143 -row 10144 -row 10145 -row 10146 -row 10147 -row 10148 -row 10149 -row 10150 -row 10151 -row 10152 -row 10153 -row 10154 -row 10155 -row 10156 -row 10157 -row 10158 -row 10159 -row 10160 -row 10161 -row 10162 -row 10163 -row 10164 -row 10165 -row 10166 -row 10167 -row 10168 -row 10169 -row 10170 -row 10171 -row 10172 -row 10173 -row 10174 -row 10175 -row 10176 -row 10177 -row 10178 -row 10179 -row 10180 -row 10181 -row 10182 -row 10183 -row 10184 -row 10185 -row 10186 -row 10187 -row 10188 -row 10189 -row 10190 -row 10191 -row 10192 -row 10193 -row 10194 -row 10195 -row 10196 -row 10197 -row 10198 -row 10199 -row 10200 -row 10201 -row 10202 -row 10203 -row 10204 -row 10205 -row 10206 -row 10207 -row 10208 -row 10209 -row 10210 -row 10211 -row 10212 -row 10213 -row 10214 -row 10215 -row 10216 -row 10217 -row 10218 -row 10219 -row 10220 -row 10221 -row 10222 -row 10223 -row 10224 -row 10225 -row 10226 -row 10227 -row 10228 -row 10229 -row 10230 -row 10231 -row 10232 -row 10233 -row 10234 -row 10235 -row 10236 -row 10237 -row 10238 -row 10239 -row 10240 -row 10241 -row 10242 -row 10243 -row 10244 -row 10245 -row 10246 -row 10247 -row 10248 -row 10249 -row 10250 -row 10251 -row 10252 -row 10253 -row 10254 -row 10255 -row 10256 -row 10257 -row 10258 -row 10259 -row 10260 -row 10261 -row 10262 -row 10263 -row 10264 -row 10265 -row 10266 -row 10267 -row 10268 -row 10269 -row 10270 -row 10271 -row 10272 -row 10273 -row 10274 -row 10275 -row 10276 -row 10277 -row 10278 -row 10279 -row 10280 -row 10281 -row 10282 -row 10283 -row 10284 -row 10285 -row 10286 -row 10287 -row 10288 -row 10289 -row 10290 -row 10291 -row 10292 -row 10293 -row 10294 -row 10295 -row 10296 -row 10297 -row 10298 -row 10299 -row 10300 -row 10301 -row 10302 -row 10303 -row 10304 -row 10305 -row 10306 -row 10307 -row 10308 -row 10309 -row 10310 -row 10311 -row 10312 -row 10313 -row 10314 -row 10315 -row 10316 -row 10317 -row 10318 -row 10319 -row 10320 -row 10321 -row 10322 -row 10323 -row 10324 -row 10325 -row 10326 -row 10327 -row 10328 -row 10329 -row 10330 -row 10331 -row 10332 -row 10333 -row 10334 -row 10335 -row 10336 -row 10337 -row 10338 -row 10339 -row 10340 -row 10341 -row 10342 -row 10343 -row 10344 -row 10345 -row 10346 -row 10347 -row 10348 -row 10349 -row 10350 -row 10351 -row 10352 -row 10353 -row 10354 -row 10355 -row 10356 -row 10357 -row 10358 -row 10359 -row 10360 -row 10361 -row 10362 -row 10363 -row 10364 -row 10365 -row 10366 -row 10367 -row 10368 -row 10369 -row 10370 -row 10371 -row 10372 -row 10373 -row 10374 -row 10375 -row 10376 -row 10377 -row 10378 -row 10379 -row 10380 -row 10381 -row 10382 -row 10383 -row 10384 -row 10385 -row 10386 -row 10387 -row 10388 -row 10389 -row 10390 -row 10391 -row 10392 -row 10393 -row 10394 -row 10395 -row 10396 -row 10397 -row 10398 -row 10399 -row 10400 -row 10401 -row 10402 -row 10403 -row 10404 -row 10405 -row 10406 -row 10407 -row 10408 -row 10409 -row 10410 -row 10411 -row 10412 -row 10413 -row 10414 -row 10415 -row 10416 -row 10417 -row 10418 -row 10419 -row 10420 -row 10421 -row 10422 -row 10423 -row 10424 -row 10425 -row 10426 -row 10427 -row 10428 -row 10429 -row 10430 -row 10431 -row 10432 -row 10433 -row 10434 -row 10435 -row 10436 -row 10437 -row 10438 -row 10439 -row 10440 -row 10441 -row 10442 -row 10443 -row 10444 -row 10445 -row 10446 -row 10447 -row 10448 -row 10449 -row 10450 -row 10451 -row 10452 -row 10453 -row 10454 -row 10455 -row 10456 -row 10457 -row 10458 -row 10459 -row 10460 -row 10461 -row 10462 -row 10463 -row 10464 -row 10465 -row 10466 -row 10467 -row 10468 -row 10469 -row 10470 -row 10471 -row 10472 -row 10473 -row 10474 -row 10475 -row 10476 -row 10477 -row 10478 -row 10479 -row 10480 -row 10481 -row 10482 -row 10483 -row 10484 -row 10485 -row 10486 -row 10487 -row 10488 -row 10489 -row 10490 -row 10491 -row 10492 -row 10493 -row 10494 -row 10495 -row 10496 -row 10497 -row 10498 -row 10499 -row 10500 -row 10501 -row 10502 -row 10503 -row 10504 -row 10505 -row 10506 -row 10507 -row 10508 -row 10509 -row 10510 -row 10511 -row 10512 -row 10513 -row 10514 -row 10515 -row 10516 -row 10517 -row 10518 -row 10519 -row 10520 -row 10521 -row 10522 -row 10523 -row 10524 -row 10525 -row 10526 -row 10527 -row 10528 -row 10529 -row 10530 -row 10531 -row 10532 -row 10533 -row 10534 -row 10535 -row 10536 -row 10537 -row 10538 -row 10539 -row 10540 -row 10541 -row 10542 -row 10543 -row 10544 -row 10545 -row 10546 -row 10547 -row 10548 -row 10549 -row 10550 -row 10551 -row 10552 -row 10553 -row 10554 -row 10555 -row 10556 -row 10557 -row 10558 -row 10559 -row 10560 -row 10561 -row 10562 -row 10563 -row 10564 -row 10565 -row 10566 -row 10567 -row 10568 -row 10569 -row 10570 -row 10571 -row 10572 -row 10573 -row 10574 -row 10575 -row 10576 -row 10577 -row 10578 -row 10579 -row 10580 -row 10581 -row 10582 -row 10583 -row 10584 -row 10585 -row 10586 -row 10587 -row 10588 -row 10589 -row 10590 -row 10591 -row 10592 -row 10593 -row 10594 -row 10595 -row 10596 -row 10597 -row 10598 -row 10599 -row 10600 -row 10601 -row 10602 -row 10603 -row 10604 -row 10605 -row 10606 -row 10607 -row 10608 -row 10609 -row 10610 -row 10611 -row 10612 -row 10613 -row 10614 -row 10615 -row 10616 -row 10617 -row 10618 -row 10619 -row 10620 -row 10621 -row 10622 -row 10623 -row 10624 -row 10625 -row 10626 -row 10627 -row 10628 -row 10629 -row 10630 -row 10631 -row 10632 -row 10633 -row 10634 -row 10635 -row 10636 -row 10637 -row 10638 -row 10639 -row 10640 -row 10641 -row 10642 -row 10643 -row 10644 -row 10645 -row 10646 -row 10647 -row 10648 -row 10649 -row 10650 -row 10651 -row 10652 -row 10653 -row 10654 -row 10655 -row 10656 -row 10657 -row 10658 -row 10659 -row 10660 -row 10661 -row 10662 -row 10663 -row 10664 -row 10665 -row 10666 -row 10667 -row 10668 -row 10669 -row 10670 -row 10671 -row 10672 -row 10673 -row 10674 -row 10675 -row 10676 -row 10677 -row 10678 -row 10679 -row 10680 -row 10681 -row 10682 -row 10683 -row 10684 -row 10685 -row 10686 -row 10687 -row 10688 -row 10689 -row 10690 -row 10691 -row 10692 -row 10693 -row 10694 -row 10695 -row 10696 -row 10697 -row 10698 -row 10699 -row 10700 -row 10701 -row 10702 -row 10703 -row 10704 -row 10705 -row 10706 -row 10707 -row 10708 -row 10709 -row 10710 -row 10711 -row 10712 -row 10713 -row 10714 -row 10715 -row 10716 -row 10717 -row 10718 -row 10719 -row 10720 -row 10721 -row 10722 -row 10723 -row 10724 -row 10725 -row 10726 -row 10727 -row 10728 -row 10729 -row 10730 -row 10731 -row 10732 -row 10733 -row 10734 -row 10735 -row 10736 -row 10737 -row 10738 -row 10739 -row 10740 -row 10741 -row 10742 -row 10743 -row 10744 -row 10745 -row 10746 -row 10747 -row 10748 -row 10749 -row 10750 -row 10751 -row 10752 -row 10753 -row 10754 -row 10755 -row 10756 -row 10757 -row 10758 -row 10759 -row 10760 -row 10761 -row 10762 -row 10763 -row 10764 -row 10765 -row 10766 -row 10767 -row 10768 -row 10769 -row 10770 -row 10771 -row 10772 -row 10773 -row 10774 -row 10775 -row 10776 -row 10777 -row 10778 -row 10779 -row 10780 -row 10781 -row 10782 -row 10783 -row 10784 -row 10785 -row 10786 -row 10787 -row 10788 -row 10789 -row 10790 -row 10791 -row 10792 -row 10793 -row 10794 -row 10795 -row 10796 -row 10797 -row 10798 -row 10799 -row 10800 -row 10801 -row 10802 -row 10803 -row 10804 -row 10805 -row 10806 -row 10807 -row 10808 -row 10809 -row 10810 -row 10811 -row 10812 -row 10813 -row 10814 -row 10815 -row 10816 -row 10817 -row 10818 -row 10819 -row 10820 -row 10821 -row 10822 -row 10823 -row 10824 -row 10825 -row 10826 -row 10827 -row 10828 -row 10829 -row 10830 -row 10831 -row 10832 -row 10833 -row 10834 -row 10835 -row 10836 -row 10837 -row 10838 -row 10839 -row 10840 -row 10841 -row 10842 -row 10843 -row 10844 -row 10845 -row 10846 -row 10847 -row 10848 -row 10849 -row 10850 -row 10851 -row 10852 -row 10853 -row 10854 -row 10855 -row 10856 -row 10857 -row 10858 -row 10859 -row 10860 -row 10861 -row 10862 -row 10863 -row 10864 -row 10865 -row 10866 -row 10867 -row 10868 -row 10869 -row 10870 -row 10871 -row 10872 -row 10873 -row 10874 -row 10875 -row 10876 -row 10877 -row 10878 -row 10879 -row 10880 -row 10881 -row 10882 -row 10883 -row 10884 -row 10885 -row 10886 -row 10887 -row 10888 -row 10889 -row 10890 -row 10891 -row 10892 -row 10893 -row 10894 -row 10895 -row 10896 -row 10897 -row 10898 -row 10899 -row 10900 -row 10901 -row 10902 -row 10903 -row 10904 -row 10905 -row 10906 -row 10907 -row 10908 -row 10909 -row 10910 -row 10911 -row 10912 -row 10913 -row 10914 -row 10915 -row 10916 -row 10917 -row 10918 -row 10919 -row 10920 -row 10921 -row 10922 -row 10923 -row 10924 -row 10925 -row 10926 -row 10927 -row 10928 -row 10929 -row 10930 -row 10931 -row 10932 -row 10933 -row 10934 -row 10935 -row 10936 -row 10937 -row 10938 -row 10939 -row 10940 -row 10941 -row 10942 -row 10943 -row 10944 -row 10945 -row 10946 -row 10947 -row 10948 -row 10949 -row 10950 -row 10951 -row 10952 -row 10953 -row 10954 -row 10955 -row 10956 -row 10957 -row 10958 -row 10959 -row 10960 -row 10961 -row 10962 -row 10963 -row 10964 -row 10965 -row 10966 -row 10967 -row 10968 -row 10969 -row 10970 -row 10971 -row 10972 -row 10973 -row 10974 -row 10975 -row 10976 -row 10977 -row 10978 -row 10979 -row 10980 -row 10981 -row 10982 -row 10983 -row 10984 -row 10985 -row 10986 -row 10987 -row 10988 -row 10989 -row 10990 -row 10991 -row 10992 -row 10993 -row 10994 -row 10995 -row 10996 -row 10997 -row 10998 -row 10999 -row 11000 -row 11001 -row 11002 -row 11003 -row 11004 -row 11005 -row 11006 -row 11007 -row 11008 -row 11009 -row 11010 -row 11011 -row 11012 -row 11013 -row 11014 -row 11015 -row 11016 -row 11017 -row 11018 -row 11019 -row 11020 -row 11021 -row 11022 -row 11023 -row 11024 -row 11025 -row 11026 -row 11027 -row 11028 -row 11029 -row 11030 -row 11031 -row 11032 -row 11033 -row 11034 -row 11035 -row 11036 -row 11037 -row 11038 -row 11039 -row 11040 -row 11041 -row 11042 -row 11043 -row 11044 -row 11045 -row 11046 -row 11047 -row 11048 -row 11049 -row 11050 -row 11051 -row 11052 -row 11053 -row 11054 -row 11055 -row 11056 -row 11057 -row 11058 -row 11059 -row 11060 -row 11061 -row 11062 -row 11063 -row 11064 -row 11065 -row 11066 -row 11067 -row 11068 -row 11069 -row 11070 -row 11071 -row 11072 -row 11073 -row 11074 -row 11075 -row 11076 -row 11077 -row 11078 -row 11079 -row 11080 -row 11081 -row 11082 -row 11083 -row 11084 -row 11085 -row 11086 -row 11087 -row 11088 -row 11089 -row 11090 -row 11091 -row 11092 -row 11093 -row 11094 -row 11095 -row 11096 -row 11097 -row 11098 -row 11099 -row 11100 -row 11101 -row 11102 -row 11103 -row 11104 -row 11105 -row 11106 -row 11107 -row 11108 -row 11109 -row 11110 -row 11111 -row 11112 -row 11113 -row 11114 -row 11115 -row 11116 -row 11117 -row 11118 -row 11119 -row 11120 -row 11121 -row 11122 -row 11123 -row 11124 -row 11125 -row 11126 -row 11127 -row 11128 -row 11129 -row 11130 -row 11131 -row 11132 -row 11133 -row 11134 -row 11135 -row 11136 -row 11137 -row 11138 -row 11139 -row 11140 -row 11141 -row 11142 -row 11143 -row 11144 -row 11145 -row 11146 -row 11147 -row 11148 -row 11149 -row 11150 -row 11151 -row 11152 -row 11153 -row 11154 -row 11155 -row 11156 -row 11157 -row 11158 -row 11159 -row 11160 -row 11161 -row 11162 -row 11163 -row 11164 -row 11165 -row 11166 -row 11167 -row 11168 -row 11169 -row 11170 -row 11171 -row 11172 -row 11173 -row 11174 -row 11175 -row 11176 -row 11177 -row 11178 -row 11179 -row 11180 -row 11181 -row 11182 -row 11183 -row 11184 -row 11185 -row 11186 -row 11187 -row 11188 -row 11189 -row 11190 -row 11191 -row 11192 -row 11193 -row 11194 -row 11195 -row 11196 -row 11197 -row 11198 -row 11199 -row 11200 -row 11201 -row 11202 -row 11203 -row 11204 -row 11205 -row 11206 -row 11207 -row 11208 -row 11209 -row 11210 -row 11211 -row 11212 -row 11213 -row 11214 -row 11215 -row 11216 -row 11217 -row 11218 -row 11219 -row 11220 -row 11221 -row 11222 -row 11223 -row 11224 -row 11225 -row 11226 -row 11227 -row 11228 -row 11229 -row 11230 -row 11231 -row 11232 -row 11233 -row 11234 -row 11235 -row 11236 -row 11237 -row 11238 -row 11239 -row 11240 -row 11241 -row 11242 -row 11243 -row 11244 -row 11245 -row 11246 -row 11247 -row 11248 -row 11249 -row 11250 -row 11251 -row 11252 -row 11253 -row 11254 -row 11255 -row 11256 -row 11257 -row 11258 -row 11259 -row 11260 -row 11261 -row 11262 -row 11263 -row 11264 -row 11265 -row 11266 -row 11267 -row 11268 -row 11269 -row 11270 -row 11271 -row 11272 -row 11273 -row 11274 -row 11275 -row 11276 -row 11277 -row 11278 -row 11279 -row 11280 -row 11281 -row 11282 -row 11283 -row 11284 -row 11285 -row 11286 -row 11287 -row 11288 -row 11289 -row 11290 -row 11291 -row 11292 -row 11293 -row 11294 -row 11295 -row 11296 -row 11297 -row 11298 -row 11299 -row 11300 -row 11301 -row 11302 -row 11303 -row 11304 -row 11305 -row 11306 -row 11307 -row 11308 -row 11309 -row 11310 -row 11311 -row 11312 -row 11313 -row 11314 -row 11315 -row 11316 -row 11317 -row 11318 -row 11319 -row 11320 -row 11321 -row 11322 -row 11323 -row 11324 -row 11325 -row 11326 -row 11327 -row 11328 -row 11329 -row 11330 -row 11331 -row 11332 -row 11333 -row 11334 -row 11335 -row 11336 -row 11337 -row 11338 -row 11339 -row 11340 -row 11341 -row 11342 -row 11343 -row 11344 -row 11345 -row 11346 -row 11347 -row 11348 -row 11349 -row 11350 -row 11351 -row 11352 -row 11353 -row 11354 -row 11355 -row 11356 -row 11357 -row 11358 -row 11359 -row 11360 -row 11361 -row 11362 -row 11363 -row 11364 -row 11365 -row 11366 -row 11367 -row 11368 -row 11369 -row 11370 -row 11371 -row 11372 -row 11373 -row 11374 -row 11375 -row 11376 -row 11377 -row 11378 -row 11379 -row 11380 -row 11381 -row 11382 -row 11383 -row 11384 -row 11385 -row 11386 -row 11387 -row 11388 -row 11389 -row 11390 -row 11391 -row 11392 -row 11393 -row 11394 -row 11395 -row 11396 -row 11397 -row 11398 -row 11399 -row 11400 -row 11401 -row 11402 -row 11403 -row 11404 -row 11405 -row 11406 -row 11407 -row 11408 -row 11409 -row 11410 -row 11411 -row 11412 -row 11413 -row 11414 -row 11415 -row 11416 -row 11417 -row 11418 -row 11419 -row 11420 -row 11421 -row 11422 -row 11423 -row 11424 -row 11425 -row 11426 -row 11427 -row 11428 -row 11429 -row 11430 -row 11431 -row 11432 -row 11433 -row 11434 -row 11435 -row 11436 -row 11437 -row 11438 -row 11439 -row 11440 -row 11441 -row 11442 -row 11443 -row 11444 -row 11445 -row 11446 -row 11447 -row 11448 -row 11449 -row 11450 -row 11451 -row 11452 -row 11453 -row 11454 -row 11455 -row 11456 -row 11457 -row 11458 -row 11459 -row 11460 -row 11461 -row 11462 -row 11463 -row 11464 -row 11465 -row 11466 -row 11467 -row 11468 -row 11469 -row 11470 -row 11471 -row 11472 -row 11473 -row 11474 -row 11475 -row 11476 -row 11477 -row 11478 -row 11479 -row 11480 -row 11481 -row 11482 -row 11483 -row 11484 -row 11485 -row 11486 -row 11487 -row 11488 -row 11489 -row 11490 -row 11491 -row 11492 -row 11493 -row 11494 -row 11495 -row 11496 -row 11497 -row 11498 -row 11499 -row 11500 -row 11501 -row 11502 -row 11503 -row 11504 -row 11505 -row 11506 -row 11507 -row 11508 -row 11509 -row 11510 -row 11511 -row 11512 -row 11513 -row 11514 -row 11515 -row 11516 -row 11517 -row 11518 -row 11519 -row 11520 -row 11521 -row 11522 -row 11523 -row 11524 -row 11525 -row 11526 -row 11527 -row 11528 -row 11529 -row 11530 -row 11531 -row 11532 -row 11533 -row 11534 -row 11535 -row 11536 -row 11537 -row 11538 -row 11539 -row 11540 -row 11541 -row 11542 -row 11543 -row 11544 -row 11545 -row 11546 -row 11547 -row 11548 -row 11549 -row 11550 -row 11551 -row 11552 -row 11553 -row 11554 -row 11555 -row 11556 -row 11557 -row 11558 -row 11559 -row 11560 -row 11561 -row 11562 -row 11563 -row 11564 -row 11565 -row 11566 -row 11567 -row 11568 -row 11569 -row 11570 -row 11571 -row 11572 -row 11573 -row 11574 -row 11575 -row 11576 -row 11577 -row 11578 -row 11579 -row 11580 -row 11581 -row 11582 -row 11583 -row 11584 -row 11585 -row 11586 -row 11587 -row 11588 -row 11589 -row 11590 -row 11591 -row 11592 -row 11593 -row 11594 -row 11595 -row 11596 -row 11597 -row 11598 -row 11599 -row 11600 -row 11601 -row 11602 -row 11603 -row 11604 -row 11605 -row 11606 -row 11607 -row 11608 -row 11609 -row 11610 -row 11611 -row 11612 -row 11613 -row 11614 -row 11615 -row 11616 -row 11617 -row 11618 -row 11619 -row 11620 -row 11621 -row 11622 -row 11623 -row 11624 -row 11625 -row 11626 -row 11627 -row 11628 -row 11629 -row 11630 -row 11631 -row 11632 -row 11633 -row 11634 -row 11635 -row 11636 -row 11637 -row 11638 -row 11639 -row 11640 -row 11641 -row 11642 -row 11643 -row 11644 -row 11645 -row 11646 -row 11647 -row 11648 -row 11649 -row 11650 -row 11651 -row 11652 -row 11653 -row 11654 -row 11655 -row 11656 -row 11657 -row 11658 -row 11659 -row 11660 -row 11661 -row 11662 -row 11663 -row 11664 -row 11665 -row 11666 -row 11667 -row 11668 -row 11669 -row 11670 -row 11671 -row 11672 -row 11673 -row 11674 -row 11675 -row 11676 -row 11677 -row 11678 -row 11679 -row 11680 -row 11681 -row 11682 -row 11683 -row 11684 -row 11685 -row 11686 -row 11687 -row 11688 -row 11689 -row 11690 -row 11691 -row 11692 -row 11693 -row 11694 -row 11695 -row 11696 -row 11697 -row 11698 -row 11699 -row 11700 -row 11701 -row 11702 -row 11703 -row 11704 -row 11705 -row 11706 -row 11707 -row 11708 -row 11709 -row 11710 -row 11711 -row 11712 -row 11713 -row 11714 -row 11715 -row 11716 -row 11717 -row 11718 -row 11719 -row 11720 -row 11721 -row 11722 -row 11723 -row 11724 -row 11725 -row 11726 -row 11727 -row 11728 -row 11729 -row 11730 -row 11731 -row 11732 -row 11733 -row 11734 -row 11735 -row 11736 -row 11737 -row 11738 -row 11739 -row 11740 -row 11741 -row 11742 -row 11743 -row 11744 -row 11745 -row 11746 -row 11747 -row 11748 -row 11749 -row 11750 -row 11751 -row 11752 -row 11753 -row 11754 -row 11755 -row 11756 -row 11757 -row 11758 -row 11759 -row 11760 -row 11761 -row 11762 -row 11763 -row 11764 -row 11765 -row 11766 -row 11767 -row 11768 -row 11769 -row 11770 -row 11771 -row 11772 -row 11773 -row 11774 -row 11775 -row 11776 -row 11777 -row 11778 -row 11779 -row 11780 -row 11781 -row 11782 -row 11783 -row 11784 -row 11785 -row 11786 -row 11787 -row 11788 -row 11789 -row 11790 -row 11791 -row 11792 -row 11793 -row 11794 -row 11795 -row 11796 -row 11797 -row 11798 -row 11799 -row 11800 -row 11801 -row 11802 -row 11803 -row 11804 -row 11805 -row 11806 -row 11807 -row 11808 -row 11809 -row 11810 -row 11811 -row 11812 -row 11813 -row 11814 -row 11815 -row 11816 -row 11817 -row 11818 -row 11819 -row 11820 -row 11821 -row 11822 -row 11823 -row 11824 -row 11825 -row 11826 -row 11827 -row 11828 -row 11829 -row 11830 -row 11831 -row 11832 -row 11833 -row 11834 -row 11835 -row 11836 -row 11837 -row 11838 -row 11839 -row 11840 -row 11841 -row 11842 -row 11843 -row 11844 -row 11845 -row 11846 -row 11847 -row 11848 -row 11849 -row 11850 -row 11851 -row 11852 -row 11853 -row 11854 -row 11855 -row 11856 -row 11857 -row 11858 -row 11859 -row 11860 -row 11861 -row 11862 -row 11863 -row 11864 -row 11865 -row 11866 -row 11867 -row 11868 -row 11869 -row 11870 -row 11871 -row 11872 -row 11873 -row 11874 -row 11875 -row 11876 -row 11877 -row 11878 -row 11879 -row 11880 -row 11881 -row 11882 -row 11883 -row 11884 -row 11885 -row 11886 -row 11887 -row 11888 -row 11889 -row 11890 -row 11891 -row 11892 -row 11893 -row 11894 -row 11895 -row 11896 -row 11897 -row 11898 -row 11899 -row 11900 -row 11901 -row 11902 -row 11903 -row 11904 -row 11905 -row 11906 -row 11907 -row 11908 -row 11909 -row 11910 -row 11911 -row 11912 -row 11913 -row 11914 -row 11915 -row 11916 -row 11917 -row 11918 -row 11919 -row 11920 -row 11921 -row 11922 -row 11923 -row 11924 -row 11925 -row 11926 -row 11927 -row 11928 -row 11929 -row 11930 -row 11931 -row 11932 -row 11933 -row 11934 -row 11935 -row 11936 -row 11937 -row 11938 -row 11939 -row 11940 -row 11941 -row 11942 -row 11943 -row 11944 -row 11945 -row 11946 -row 11947 -row 11948 -row 11949 -row 11950 -row 11951 -row 11952 -row 11953 -row 11954 -row 11955 -row 11956 -row 11957 -row 11958 -row 11959 -row 11960 -row 11961 -row 11962 -row 11963 -row 11964 -row 11965 -row 11966 -row 11967 -row 11968 -row 11969 -row 11970 -row 11971 -row 11972 -row 11973 -row 11974 -row 11975 -row 11976 -row 11977 -row 11978 -row 11979 -row 11980 -row 11981 -row 11982 -row 11983 -row 11984 -row 11985 -row 11986 -row 11987 -row 11988 -row 11989 -row 11990 -row 11991 -row 11992 -row 11993 -row 11994 -row 11995 -row 11996 -row 11997 -row 11998 -row 11999 -row 12000 -row 12001 -row 12002 -row 12003 -row 12004 -row 12005 -row 12006 -row 12007 -row 12008 -row 12009 -row 12010 -row 12011 -row 12012 -row 12013 -row 12014 -row 12015 -row 12016 -row 12017 -row 12018 -row 12019 -row 12020 -row 12021 -row 12022 -row 12023 -row 12024 -row 12025 -row 12026 -row 12027 -row 12028 -row 12029 -row 12030 -row 12031 -row 12032 -row 12033 -row 12034 -row 12035 -row 12036 -row 12037 -row 12038 -row 12039 -row 12040 -row 12041 -row 12042 -row 12043 -row 12044 -row 12045 -row 12046 -row 12047 -row 12048 -row 12049 -row 12050 -row 12051 -row 12052 -row 12053 -row 12054 -row 12055 -row 12056 -row 12057 -row 12058 -row 12059 -row 12060 -row 12061 -row 12062 -row 12063 -row 12064 -row 12065 -row 12066 -row 12067 -row 12068 -row 12069 -row 12070 -row 12071 -row 12072 -row 12073 -row 12074 -row 12075 -row 12076 -row 12077 -row 12078 -row 12079 -row 12080 -row 12081 -row 12082 -row 12083 -row 12084 -row 12085 -row 12086 -row 12087 -row 12088 -row 12089 -row 12090 -row 12091 -row 12092 -row 12093 -row 12094 -row 12095 -row 12096 -row 12097 -row 12098 -row 12099 -row 12100 -row 12101 -row 12102 -row 12103 -row 12104 -row 12105 -row 12106 -row 12107 -row 12108 -row 12109 -row 12110 -row 12111 -row 12112 -row 12113 -row 12114 -row 12115 -row 12116 -row 12117 -row 12118 -row 12119 -row 12120 -row 12121 -row 12122 -row 12123 -row 12124 -row 12125 -row 12126 -row 12127 -row 12128 -row 12129 -row 12130 -row 12131 -row 12132 -row 12133 -row 12134 -row 12135 -row 12136 -row 12137 -row 12138 -row 12139 -row 12140 -row 12141 -row 12142 -row 12143 -row 12144 -row 12145 -row 12146 -row 12147 -row 12148 -row 12149 -row 12150 -row 12151 -row 12152 -row 12153 -row 12154 -row 12155 -row 12156 -row 12157 -row 12158 -row 12159 -row 12160 -row 12161 -row 12162 -row 12163 -row 12164 -row 12165 -row 12166 -row 12167 -row 12168 -row 12169 -row 12170 -row 12171 -row 12172 -row 12173 -row 12174 -row 12175 -row 12176 -row 12177 -row 12178 -row 12179 -row 12180 -row 12181 -row 12182 -row 12183 -row 12184 -row 12185 -row 12186 -row 12187 -row 12188 -row 12189 -row 12190 -row 12191 -row 12192 -row 12193 -row 12194 -row 12195 -row 12196 -row 12197 -row 12198 -row 12199 -row 12200 -row 12201 -row 12202 -row 12203 -row 12204 -row 12205 -row 12206 -row 12207 -row 12208 -row 12209 -row 12210 -row 12211 -row 12212 -row 12213 -row 12214 -row 12215 -row 12216 -row 12217 -row 12218 -row 12219 -row 12220 -row 12221 -row 12222 -row 12223 -row 12224 -row 12225 -row 12226 -row 12227 -row 12228 -row 12229 -row 12230 -row 12231 -row 12232 -row 12233 -row 12234 -row 12235 -row 12236 -row 12237 -row 12238 -row 12239 -row 12240 -row 12241 -row 12242 -row 12243 -row 12244 -row 12245 -row 12246 -row 12247 -row 12248 -row 12249 -row 12250 -row 12251 -row 12252 -row 12253 -row 12254 -row 12255 -row 12256 -row 12257 -row 12258 -row 12259 -row 12260 -row 12261 -row 12262 -row 12263 -row 12264 -row 12265 -row 12266 -row 12267 -row 12268 -row 12269 -row 12270 -row 12271 -row 12272 -row 12273 -row 12274 -row 12275 -row 12276 -row 12277 -row 12278 -row 12279 -row 12280 -row 12281 -row 12282 -row 12283 -row 12284 -row 12285 -row 12286 -row 12287 -row 12288 -row 12289 -row 12290 -row 12291 -row 12292 -row 12293 -row 12294 -row 12295 -row 12296 -row 12297 -row 12298 -row 12299 -row 12300 -row 12301 -row 12302 -row 12303 -row 12304 -row 12305 -row 12306 -row 12307 -row 12308 -row 12309 -row 12310 -row 12311 -row 12312 -row 12313 -row 12314 -row 12315 -row 12316 -row 12317 -row 12318 -row 12319 -row 12320 -row 12321 -row 12322 -row 12323 -row 12324 -row 12325 -row 12326 -row 12327 -row 12328 -row 12329 -row 12330 -row 12331 -row 12332 -row 12333 -row 12334 -row 12335 -row 12336 -row 12337 -row 12338 -row 12339 -row 12340 -row 12341 -row 12342 -row 12343 -row 12344 -row 12345 -row 12346 -row 12347 -row 12348 -row 12349 -row 12350 -row 12351 -row 12352 -row 12353 -row 12354 -row 12355 -row 12356 -row 12357 -row 12358 -row 12359 -row 12360 -row 12361 -row 12362 -row 12363 -row 12364 -row 12365 -row 12366 -row 12367 -row 12368 -row 12369 -row 12370 -row 12371 -row 12372 -row 12373 -row 12374 -row 12375 -row 12376 -row 12377 -row 12378 -row 12379 -row 12380 -row 12381 -row 12382 -row 12383 -row 12384 -row 12385 -row 12386 -row 12387 -row 12388 -row 12389 -row 12390 -row 12391 -row 12392 -row 12393 -row 12394 -row 12395 -row 12396 -row 12397 -row 12398 -row 12399 -row 12400 -row 12401 -row 12402 -row 12403 -row 12404 -row 12405 -row 12406 -row 12407 -row 12408 -row 12409 -row 12410 -row 12411 -row 12412 -row 12413 -row 12414 -row 12415 -row 12416 -row 12417 -row 12418 -row 12419 -row 12420 -row 12421 -row 12422 -row 12423 -row 12424 -row 12425 -row 12426 -row 12427 -row 12428 -row 12429 -row 12430 -row 12431 -row 12432 -row 12433 -row 12434 -row 12435 -row 12436 -row 12437 -row 12438 -row 12439 -row 12440 -row 12441 -row 12442 -row 12443 -row 12444 -row 12445 -row 12446 -row 12447 -row 12448 -row 12449 -row 12450 -row 12451 -row 12452 -row 12453 -row 12454 -row 12455 -row 12456 -row 12457 -row 12458 -row 12459 -row 12460 -row 12461 -row 12462 -row 12463 -row 12464 -row 12465 -row 12466 -row 12467 -row 12468 -row 12469 -row 12470 -row 12471 -row 12472 -row 12473 -row 12474 -row 12475 -row 12476 -row 12477 -row 12478 -row 12479 -row 12480 -row 12481 -row 12482 -row 12483 -row 12484 -row 12485 -row 12486 -row 12487 -row 12488 -row 12489 -row 12490 -row 12491 -row 12492 -row 12493 -row 12494 -row 12495 -row 12496 -row 12497 -row 12498 -row 12499 -row 12500 -row 12501 -row 12502 -row 12503 -row 12504 -row 12505 -row 12506 -row 12507 -row 12508 -row 12509 -row 12510 -row 12511 -row 12512 -row 12513 -row 12514 -row 12515 -row 12516 -row 12517 -row 12518 -row 12519 -row 12520 -row 12521 -row 12522 -row 12523 -row 12524 -row 12525 -row 12526 -row 12527 -row 12528 -row 12529 -row 12530 -row 12531 -row 12532 -row 12533 -row 12534 -row 12535 -row 12536 -row 12537 -row 12538 -row 12539 -row 12540 -row 12541 -row 12542 -row 12543 -row 12544 -row 12545 -row 12546 -row 12547 -row 12548 -row 12549 -row 12550 -row 12551 -row 12552 -row 12553 -row 12554 -row 12555 -row 12556 -row 12557 -row 12558 -row 12559 -row 12560 -row 12561 -row 12562 -row 12563 -row 12564 -row 12565 -row 12566 -row 12567 -row 12568 -row 12569 -row 12570 -row 12571 -row 12572 -row 12573 -row 12574 -row 12575 -row 12576 -row 12577 -row 12578 -row 12579 -row 12580 -row 12581 -row 12582 -row 12583 -row 12584 -row 12585 -row 12586 -row 12587 -row 12588 -row 12589 -row 12590 -row 12591 -row 12592 -row 12593 -row 12594 -row 12595 -row 12596 -row 12597 -row 12598 -row 12599 -row 12600 -row 12601 -row 12602 -row 12603 -row 12604 -row 12605 -row 12606 -row 12607 -row 12608 -row 12609 -row 12610 -row 12611 -row 12612 -row 12613 -row 12614 -row 12615 -row 12616 -row 12617 -row 12618 -row 12619 -row 12620 -row 12621 -row 12622 -row 12623 -row 12624 -row 12625 -row 12626 -row 12627 -row 12628 -row 12629 -row 12630 -row 12631 -row 12632 -row 12633 -row 12634 -row 12635 -row 12636 -row 12637 -row 12638 -row 12639 -row 12640 -row 12641 -row 12642 -row 12643 -row 12644 -row 12645 -row 12646 -row 12647 -row 12648 -row 12649 -row 12650 -row 12651 -row 12652 -row 12653 -row 12654 -row 12655 -row 12656 -row 12657 -row 12658 -row 12659 -row 12660 -row 12661 -row 12662 -row 12663 -row 12664 -row 12665 -row 12666 -row 12667 -row 12668 -row 12669 -row 12670 -row 12671 -row 12672 -row 12673 -row 12674 -row 12675 -row 12676 -row 12677 -row 12678 -row 12679 -row 12680 -row 12681 -row 12682 -row 12683 -row 12684 -row 12685 -row 12686 -row 12687 -row 12688 -row 12689 -row 12690 -row 12691 -row 12692 -row 12693 -row 12694 -row 12695 -row 12696 -row 12697 -row 12698 -row 12699 -row 12700 -row 12701 -row 12702 -row 12703 -row 12704 -row 12705 -row 12706 -row 12707 -row 12708 -row 12709 -row 12710 -row 12711 -row 12712 -row 12713 -row 12714 -row 12715 -row 12716 -row 12717 -row 12718 -row 12719 -row 12720 -row 12721 -row 12722 -row 12723 -row 12724 -row 12725 -row 12726 -row 12727 -row 12728 -row 12729 -row 12730 -row 12731 -row 12732 -row 12733 -row 12734 -row 12735 -row 12736 -row 12737 -row 12738 -row 12739 -row 12740 -row 12741 -row 12742 -row 12743 -row 12744 -row 12745 -row 12746 -row 12747 -row 12748 -row 12749 -row 12750 -row 12751 -row 12752 -row 12753 -row 12754 -row 12755 -row 12756 -row 12757 -row 12758 -row 12759 -row 12760 -row 12761 -row 12762 -row 12763 -row 12764 -row 12765 -row 12766 -row 12767 -row 12768 -row 12769 -row 12770 -row 12771 -row 12772 -row 12773 -row 12774 -row 12775 -row 12776 -row 12777 -row 12778 -row 12779 -row 12780 -row 12781 -row 12782 -row 12783 -row 12784 -row 12785 -row 12786 -row 12787 -row 12788 -row 12789 -row 12790 -row 12791 -row 12792 -row 12793 -row 12794 -row 12795 -row 12796 -row 12797 -row 12798 -row 12799 -row 12800 -row 12801 -row 12802 -row 12803 -row 12804 -row 12805 -row 12806 -row 12807 -row 12808 -row 12809 -row 12810 -row 12811 -row 12812 -row 12813 -row 12814 -row 12815 -row 12816 -row 12817 -row 12818 -row 12819 -row 12820 -row 12821 -row 12822 -row 12823 -row 12824 -row 12825 -row 12826 -row 12827 -row 12828 -row 12829 -row 12830 -row 12831 -row 12832 -row 12833 -row 12834 -row 12835 -row 12836 -row 12837 -row 12838 -row 12839 -row 12840 -row 12841 -row 12842 -row 12843 -row 12844 -row 12845 -row 12846 -row 12847 -row 12848 -row 12849 -row 12850 -row 12851 -row 12852 -row 12853 -row 12854 -row 12855 -row 12856 -row 12857 -row 12858 -row 12859 -row 12860 -row 12861 -row 12862 -row 12863 -row 12864 -row 12865 -row 12866 -row 12867 -row 12868 -row 12869 -row 12870 -row 12871 -row 12872 -row 12873 -row 12874 -row 12875 -row 12876 -row 12877 -row 12878 -row 12879 -row 12880 -row 12881 -row 12882 -row 12883 -row 12884 -row 12885 -row 12886 -row 12887 -row 12888 -row 12889 -row 12890 -row 12891 -row 12892 -row 12893 -row 12894 -row 12895 -row 12896 -row 12897 -row 12898 -row 12899 -row 12900 -row 12901 -row 12902 -row 12903 -row 12904 -row 12905 -row 12906 -row 12907 -row 12908 -row 12909 -row 12910 -row 12911 -row 12912 -row 12913 -row 12914 -row 12915 -row 12916 -row 12917 -row 12918 -row 12919 -row 12920 -row 12921 -row 12922 -row 12923 -row 12924 -row 12925 -row 12926 -row 12927 -row 12928 -row 12929 -row 12930 -row 12931 -row 12932 -row 12933 -row 12934 -row 12935 -row 12936 -row 12937 -row 12938 -row 12939 -row 12940 -row 12941 -row 12942 -row 12943 -row 12944 -row 12945 -row 12946 -row 12947 -row 12948 -row 12949 -row 12950 -row 12951 -row 12952 -row 12953 -row 12954 -row 12955 -row 12956 -row 12957 -row 12958 -row 12959 -row 12960 -row 12961 -row 12962 -row 12963 -row 12964 -row 12965 -row 12966 -row 12967 -row 12968 -row 12969 -row 12970 -row 12971 -row 12972 -row 12973 -row 12974 -row 12975 -row 12976 -row 12977 -row 12978 -row 12979 -row 12980 -row 12981 -row 12982 -row 12983 -row 12984 -row 12985 -row 12986 -row 12987 -row 12988 -row 12989 -row 12990 -row 12991 -row 12992 -row 12993 -row 12994 -row 12995 -row 12996 -row 12997 -row 12998 -row 12999 -row 13000 -row 13001 -row 13002 -row 13003 -row 13004 -row 13005 -row 13006 -row 13007 -row 13008 -row 13009 -row 13010 -row 13011 -row 13012 -row 13013 -row 13014 -row 13015 -row 13016 -row 13017 -row 13018 -row 13019 -row 13020 -row 13021 -row 13022 -row 13023 -row 13024 -row 13025 -row 13026 -row 13027 -row 13028 -row 13029 -row 13030 -row 13031 -row 13032 -row 13033 -row 13034 -row 13035 -row 13036 -row 13037 -row 13038 -row 13039 -row 13040 -row 13041 -row 13042 -row 13043 -row 13044 -row 13045 -row 13046 -row 13047 -row 13048 -row 13049 -row 13050 -row 13051 -row 13052 -row 13053 -row 13054 -row 13055 -row 13056 -row 13057 -row 13058 -row 13059 -row 13060 -row 13061 -row 13062 -row 13063 -row 13064 -row 13065 -row 13066 -row 13067 -row 13068 -row 13069 -row 13070 -row 13071 -row 13072 -row 13073 -row 13074 -row 13075 -row 13076 -row 13077 -row 13078 -row 13079 -row 13080 -row 13081 -row 13082 -row 13083 -row 13084 -row 13085 -row 13086 -row 13087 -row 13088 -row 13089 -row 13090 -row 13091 -row 13092 -row 13093 -row 13094 -row 13095 -row 13096 -row 13097 -row 13098 -row 13099 -row 13100 -row 13101 -row 13102 -row 13103 -row 13104 -row 13105 -row 13106 -row 13107 -row 13108 -row 13109 -row 13110 -row 13111 -row 13112 -row 13113 -row 13114 -row 13115 -row 13116 -row 13117 -row 13118 -row 13119 -row 13120 -row 13121 -row 13122 -row 13123 -row 13124 -row 13125 -row 13126 -row 13127 -row 13128 -row 13129 -row 13130 -row 13131 -row 13132 -row 13133 -row 13134 -row 13135 -row 13136 -row 13137 -row 13138 -row 13139 -row 13140 -row 13141 -row 13142 -row 13143 -row 13144 -row 13145 -row 13146 -row 13147 -row 13148 -row 13149 -row 13150 -row 13151 -row 13152 -row 13153 -row 13154 -row 13155 -row 13156 -row 13157 -row 13158 -row 13159 -row 13160 -row 13161 -row 13162 -row 13163 -row 13164 -row 13165 -row 13166 -row 13167 -row 13168 -row 13169 -row 13170 -row 13171 -row 13172 -row 13173 -row 13174 -row 13175 -row 13176 -row 13177 -row 13178 -row 13179 -row 13180 -row 13181 -row 13182 -row 13183 -row 13184 -row 13185 -row 13186 -row 13187 -row 13188 -row 13189 -row 13190 -row 13191 -row 13192 -row 13193 -row 13194 -row 13195 -row 13196 -row 13197 -row 13198 -row 13199 -row 13200 -row 13201 -row 13202 -row 13203 -row 13204 -row 13205 -row 13206 -row 13207 -row 13208 -row 13209 -row 13210 -row 13211 -row 13212 -row 13213 -row 13214 -row 13215 -row 13216 -row 13217 -row 13218 -row 13219 -row 13220 -row 13221 -row 13222 -row 13223 -row 13224 -row 13225 -row 13226 -row 13227 -row 13228 -row 13229 -row 13230 -row 13231 -row 13232 -row 13233 -row 13234 -row 13235 -row 13236 -row 13237 -row 13238 -row 13239 -row 13240 -row 13241 -row 13242 -row 13243 -row 13244 -row 13245 -row 13246 -row 13247 -row 13248 -row 13249 -row 13250 -row 13251 -row 13252 -row 13253 -row 13254 -row 13255 -row 13256 -row 13257 -row 13258 -row 13259 -row 13260 -row 13261 -row 13262 -row 13263 -row 13264 -row 13265 -row 13266 -row 13267 -row 13268 -row 13269 -row 13270 -row 13271 -row 13272 -row 13273 -row 13274 -row 13275 -row 13276 -row 13277 -row 13278 -row 13279 -row 13280 -row 13281 -row 13282 -row 13283 -row 13284 -row 13285 -row 13286 -row 13287 -row 13288 -row 13289 -row 13290 -row 13291 -row 13292 -row 13293 -row 13294 -row 13295 -row 13296 -row 13297 -row 13298 -row 13299 -row 13300 -row 13301 -row 13302 -row 13303 -row 13304 -row 13305 -row 13306 -row 13307 -row 13308 -row 13309 -row 13310 -row 13311 -row 13312 -row 13313 -row 13314 -row 13315 -row 13316 -row 13317 -row 13318 -row 13319 -row 13320 -row 13321 -row 13322 -row 13323 -row 13324 -row 13325 -row 13326 -row 13327 -row 13328 -row 13329 -row 13330 -row 13331 -row 13332 -row 13333 -row 13334 -row 13335 -row 13336 -row 13337 -row 13338 -row 13339 -row 13340 -row 13341 -row 13342 -row 13343 -row 13344 -row 13345 -row 13346 -row 13347 -row 13348 -row 13349 -row 13350 -row 13351 -row 13352 -row 13353 -row 13354 -row 13355 -row 13356 -row 13357 -row 13358 -row 13359 -row 13360 -row 13361 -row 13362 -row 13363 -row 13364 -row 13365 -row 13366 -row 13367 -row 13368 -row 13369 -row 13370 -row 13371 -row 13372 -row 13373 -row 13374 -row 13375 -row 13376 -row 13377 -row 13378 -row 13379 -row 13380 -row 13381 -row 13382 -row 13383 -row 13384 -row 13385 -row 13386 -row 13387 -row 13388 -row 13389 -row 13390 -row 13391 -row 13392 -row 13393 -row 13394 -row 13395 -row 13396 -row 13397 -row 13398 -row 13399 -row 13400 -row 13401 -row 13402 -row 13403 -row 13404 -row 13405 -row 13406 -row 13407 -row 13408 -row 13409 -row 13410 -row 13411 -row 13412 -row 13413 -row 13414 -row 13415 -row 13416 -row 13417 -row 13418 -row 13419 -row 13420 -row 13421 -row 13422 -row 13423 -row 13424 -row 13425 -row 13426 -row 13427 -row 13428 -row 13429 -row 13430 -row 13431 -row 13432 -row 13433 -row 13434 -row 13435 -row 13436 -row 13437 -row 13438 -row 13439 -row 13440 -row 13441 -row 13442 -row 13443 -row 13444 -row 13445 -row 13446 -row 13447 -row 13448 -row 13449 -row 13450 -row 13451 -row 13452 -row 13453 -row 13454 -row 13455 -row 13456 -row 13457 -row 13458 -row 13459 -row 13460 -row 13461 -row 13462 -row 13463 -row 13464 -row 13465 -row 13466 -row 13467 -row 13468 -row 13469 -row 13470 -row 13471 -row 13472 -row 13473 -row 13474 -row 13475 -row 13476 -row 13477 -row 13478 -row 13479 -row 13480 -row 13481 -row 13482 -row 13483 -row 13484 -row 13485 -row 13486 -row 13487 -row 13488 -row 13489 -row 13490 -row 13491 -row 13492 -row 13493 -row 13494 -row 13495 -row 13496 -row 13497 -row 13498 -row 13499 -row 13500 -row 13501 -row 13502 -row 13503 -row 13504 -row 13505 -row 13506 -row 13507 -row 13508 -row 13509 -row 13510 -row 13511 -row 13512 -row 13513 -row 13514 -row 13515 -row 13516 -row 13517 -row 13518 -row 13519 -row 13520 -row 13521 -row 13522 -row 13523 -row 13524 -row 13525 -row 13526 -row 13527 -row 13528 -row 13529 -row 13530 -row 13531 -row 13532 -row 13533 -row 13534 -row 13535 -row 13536 -row 13537 -row 13538 -row 13539 -row 13540 -row 13541 -row 13542 -row 13543 -row 13544 -row 13545 -row 13546 -row 13547 -row 13548 -row 13549 -row 13550 -row 13551 -row 13552 -row 13553 -row 13554 -row 13555 -row 13556 -row 13557 -row 13558 -row 13559 -row 13560 -row 13561 -row 13562 -row 13563 -row 13564 -row 13565 -row 13566 -row 13567 -row 13568 -row 13569 -row 13570 -row 13571 -row 13572 -row 13573 -row 13574 -row 13575 -row 13576 -row 13577 -row 13578 -row 13579 -row 13580 -row 13581 -row 13582 -row 13583 -row 13584 -row 13585 -row 13586 -row 13587 -row 13588 -row 13589 -row 13590 -row 13591 -row 13592 -row 13593 -row 13594 -row 13595 -row 13596 -row 13597 -row 13598 -row 13599 -row 13600 -row 13601 -row 13602 -row 13603 -row 13604 -row 13605 -row 13606 -row 13607 -row 13608 -row 13609 -row 13610 -row 13611 -row 13612 -row 13613 -row 13614 -row 13615 -row 13616 -row 13617 -row 13618 -row 13619 -row 13620 -row 13621 -row 13622 -row 13623 -row 13624 -row 13625 -row 13626 -row 13627 -row 13628 -row 13629 -row 13630 -row 13631 -row 13632 -row 13633 -row 13634 -row 13635 -row 13636 -row 13637 -row 13638 -row 13639 -row 13640 -row 13641 -row 13642 -row 13643 -row 13644 -row 13645 -row 13646 -row 13647 -row 13648 -row 13649 -row 13650 -row 13651 -row 13652 -row 13653 -row 13654 -row 13655 -row 13656 -row 13657 -row 13658 -row 13659 -row 13660 -row 13661 -row 13662 -row 13663 -row 13664 -row 13665 -row 13666 -row 13667 -row 13668 -row 13669 -row 13670 -row 13671 -row 13672 -row 13673 -row 13674 -row 13675 -row 13676 -row 13677 -row 13678 -row 13679 -row 13680 -row 13681 -row 13682 -row 13683 -row 13684 -row 13685 -row 13686 -row 13687 -row 13688 -row 13689 -row 13690 -row 13691 -row 13692 -row 13693 -row 13694 -row 13695 -row 13696 -row 13697 -row 13698 -row 13699 -row 13700 -row 13701 -row 13702 -row 13703 -row 13704 -row 13705 -row 13706 -row 13707 -row 13708 -row 13709 -row 13710 -row 13711 -row 13712 -row 13713 -row 13714 -row 13715 -row 13716 -row 13717 -row 13718 -row 13719 -row 13720 -row 13721 -row 13722 -row 13723 -row 13724 -row 13725 -row 13726 -row 13727 -row 13728 -row 13729 -row 13730 -row 13731 -row 13732 -row 13733 -row 13734 -row 13735 -row 13736 -row 13737 -row 13738 -row 13739 -row 13740 -row 13741 -row 13742 -row 13743 -row 13744 -row 13745 -row 13746 -row 13747 -row 13748 -row 13749 -row 13750 -row 13751 -row 13752 -row 13753 -row 13754 -row 13755 -row 13756 -row 13757 -row 13758 -row 13759 -row 13760 -row 13761 -row 13762 -row 13763 -row 13764 -row 13765 -row 13766 -row 13767 -row 13768 -row 13769 -row 13770 -row 13771 -row 13772 -row 13773 -row 13774 -row 13775 -row 13776 -row 13777 -row 13778 -row 13779 -row 13780 -row 13781 -row 13782 -row 13783 -row 13784 -row 13785 -row 13786 -row 13787 -row 13788 -row 13789 -row 13790 -row 13791 -row 13792 -row 13793 -row 13794 -row 13795 -row 13796 -row 13797 -row 13798 -row 13799 -row 13800 -row 13801 -row 13802 -row 13803 -row 13804 -row 13805 -row 13806 -row 13807 -row 13808 -row 13809 -row 13810 -row 13811 -row 13812 -row 13813 -row 13814 -row 13815 -row 13816 -row 13817 -row 13818 -row 13819 -row 13820 -row 13821 -row 13822 -row 13823 -row 13824 -row 13825 -row 13826 -row 13827 -row 13828 -row 13829 -row 13830 -row 13831 -row 13832 -row 13833 -row 13834 -row 13835 -row 13836 -row 13837 -row 13838 -row 13839 -row 13840 -row 13841 -row 13842 -row 13843 -row 13844 -row 13845 -row 13846 -row 13847 -row 13848 -row 13849 -row 13850 -row 13851 -row 13852 -row 13853 -row 13854 -row 13855 -row 13856 -row 13857 -row 13858 -row 13859 -row 13860 -row 13861 -row 13862 -row 13863 -row 13864 -row 13865 -row 13866 -row 13867 -row 13868 -row 13869 -row 13870 -row 13871 -row 13872 -row 13873 -row 13874 -row 13875 -row 13876 -row 13877 -row 13878 -row 13879 -row 13880 -row 13881 -row 13882 -row 13883 -row 13884 -row 13885 -row 13886 -row 13887 -row 13888 -row 13889 -row 13890 -row 13891 -row 13892 -row 13893 -row 13894 -row 13895 -row 13896 -row 13897 -row 13898 -row 13899 -row 13900 -row 13901 -row 13902 -row 13903 -row 13904 -row 13905 -row 13906 -row 13907 -row 13908 -row 13909 -row 13910 -row 13911 -row 13912 -row 13913 -row 13914 -row 13915 -row 13916 -row 13917 -row 13918 -row 13919 -row 13920 -row 13921 -row 13922 -row 13923 -row 13924 -row 13925 -row 13926 -row 13927 -row 13928 -row 13929 -row 13930 -row 13931 -row 13932 -row 13933 -row 13934 -row 13935 -row 13936 -row 13937 -row 13938 -row 13939 -row 13940 -row 13941 -row 13942 -row 13943 -row 13944 -row 13945 -row 13946 -row 13947 -row 13948 -row 13949 -row 13950 -row 13951 -row 13952 -row 13953 -row 13954 -row 13955 -row 13956 -row 13957 -row 13958 -row 13959 -row 13960 -row 13961 -row 13962 -row 13963 -row 13964 -row 13965 -row 13966 -row 13967 -row 13968 -row 13969 -row 13970 -row 13971 -row 13972 -row 13973 -row 13974 -row 13975 -row 13976 -row 13977 -row 13978 -row 13979 -row 13980 -row 13981 -row 13982 -row 13983 -row 13984 -row 13985 -row 13986 -row 13987 -row 13988 -row 13989 -row 13990 -row 13991 -row 13992 -row 13993 -row 13994 -row 13995 -row 13996 -row 13997 -row 13998 -row 13999 -row 14000 -row 14001 -row 14002 -row 14003 -row 14004 -row 14005 -row 14006 -row 14007 -row 14008 -row 14009 -row 14010 -row 14011 -row 14012 -row 14013 -row 14014 -row 14015 -row 14016 -row 14017 -row 14018 -row 14019 -row 14020 -row 14021 -row 14022 -row 14023 -row 14024 -row 14025 -row 14026 -row 14027 -row 14028 -row 14029 -row 14030 -row 14031 -row 14032 -row 14033 -row 14034 -row 14035 -row 14036 -row 14037 -row 14038 -row 14039 -row 14040 -row 14041 -row 14042 -row 14043 -row 14044 -row 14045 -row 14046 -row 14047 -row 14048 -row 14049 -row 14050 -row 14051 -row 14052 -row 14053 -row 14054 -row 14055 -row 14056 -row 14057 -row 14058 -row 14059 -row 14060 -row 14061 -row 14062 -row 14063 -row 14064 -row 14065 -row 14066 -row 14067 -row 14068 -row 14069 -row 14070 -row 14071 -row 14072 -row 14073 -row 14074 -row 14075 -row 14076 -row 14077 -row 14078 -row 14079 -row 14080 -row 14081 -row 14082 -row 14083 -row 14084 -row 14085 -row 14086 -row 14087 -row 14088 -row 14089 -row 14090 -row 14091 -row 14092 -row 14093 -row 14094 -row 14095 -row 14096 -row 14097 -row 14098 -row 14099 -row 14100 -row 14101 -row 14102 -row 14103 -row 14104 -row 14105 -row 14106 -row 14107 -row 14108 -row 14109 -row 14110 -row 14111 -row 14112 -row 14113 -row 14114 -row 14115 -row 14116 -row 14117 -row 14118 -row 14119 -row 14120 -row 14121 -row 14122 -row 14123 -row 14124 -row 14125 -row 14126 -row 14127 -row 14128 -row 14129 -row 14130 -row 14131 -row 14132 -row 14133 -row 14134 -row 14135 -row 14136 -row 14137 -row 14138 -row 14139 -row 14140 -row 14141 -row 14142 -row 14143 -row 14144 -row 14145 -row 14146 -row 14147 -row 14148 -row 14149 -row 14150 -row 14151 -row 14152 -row 14153 -row 14154 -row 14155 -row 14156 -row 14157 -row 14158 -row 14159 -row 14160 -row 14161 -row 14162 -row 14163 -row 14164 -row 14165 -row 14166 -row 14167 -row 14168 -row 14169 -row 14170 -row 14171 -row 14172 -row 14173 -row 14174 -row 14175 -row 14176 -row 14177 -row 14178 -row 14179 -row 14180 -row 14181 -row 14182 -row 14183 -row 14184 -row 14185 -row 14186 -row 14187 -row 14188 -row 14189 -row 14190 -row 14191 -row 14192 -row 14193 -row 14194 -row 14195 -row 14196 -row 14197 -row 14198 -row 14199 -row 14200 -row 14201 -row 14202 -row 14203 -row 14204 -row 14205 -row 14206 -row 14207 -row 14208 -row 14209 -row 14210 -row 14211 -row 14212 -row 14213 -row 14214 -row 14215 -row 14216 -row 14217 -row 14218 -row 14219 -row 14220 -row 14221 -row 14222 -row 14223 -row 14224 -row 14225 -row 14226 -row 14227 -row 14228 -row 14229 -row 14230 -row 14231 -row 14232 -row 14233 -row 14234 -row 14235 -row 14236 -row 14237 -row 14238 -row 14239 -row 14240 -row 14241 -row 14242 -row 14243 -row 14244 -row 14245 -row 14246 -row 14247 -row 14248 -row 14249 -row 14250 -row 14251 -row 14252 -row 14253 -row 14254 -row 14255 -row 14256 -row 14257 -row 14258 -row 14259 -row 14260 -row 14261 -row 14262 -row 14263 -row 14264 -row 14265 -row 14266 -row 14267 -row 14268 -row 14269 -row 14270 -row 14271 -row 14272 -row 14273 -row 14274 -row 14275 -row 14276 -row 14277 -row 14278 -row 14279 -row 14280 -row 14281 -row 14282 -row 14283 -row 14284 -row 14285 -row 14286 -row 14287 -row 14288 -row 14289 -row 14290 -row 14291 -row 14292 -row 14293 -row 14294 -row 14295 -row 14296 -row 14297 -row 14298 -row 14299 -row 14300 -row 14301 -row 14302 -row 14303 -row 14304 -row 14305 -row 14306 -row 14307 -row 14308 -row 14309 -row 14310 -row 14311 -row 14312 -row 14313 -row 14314 -row 14315 -row 14316 -row 14317 -row 14318 -row 14319 -row 14320 -row 14321 -row 14322 -row 14323 -row 14324 -row 14325 -row 14326 -row 14327 -row 14328 -row 14329 -row 14330 -row 14331 -row 14332 -row 14333 -row 14334 -row 14335 -row 14336 -row 14337 -row 14338 -row 14339 -row 14340 -row 14341 -row 14342 -row 14343 -row 14344 -row 14345 -row 14346 -row 14347 -row 14348 -row 14349 -row 14350 -row 14351 -row 14352 -row 14353 -row 14354 -row 14355 -row 14356 -row 14357 -row 14358 -row 14359 -row 14360 -row 14361 -row 14362 -row 14363 -row 14364 -row 14365 -row 14366 -row 14367 -row 14368 -row 14369 -row 14370 -row 14371 -row 14372 -row 14373 -row 14374 -row 14375 -row 14376 -row 14377 -row 14378 -row 14379 -row 14380 -row 14381 -row 14382 -row 14383 -row 14384 -row 14385 -row 14386 -row 14387 -row 14388 -row 14389 -row 14390 -row 14391 -row 14392 -row 14393 -row 14394 -row 14395 -row 14396 -row 14397 -row 14398 -row 14399 -row 14400 -row 14401 -row 14402 -row 14403 -row 14404 -row 14405 -row 14406 -row 14407 -row 14408 -row 14409 -row 14410 -row 14411 -row 14412 -row 14413 -row 14414 -row 14415 -row 14416 -row 14417 -row 14418 -row 14419 -row 14420 -row 14421 -row 14422 -row 14423 -row 14424 -row 14425 -row 14426 -row 14427 -row 14428 -row 14429 -row 14430 -row 14431 -row 14432 -row 14433 -row 14434 -row 14435 -row 14436 -row 14437 -row 14438 -row 14439 -row 14440 -row 14441 -row 14442 -row 14443 -row 14444 -row 14445 -row 14446 -row 14447 -row 14448 -row 14449 -row 14450 -row 14451 -row 14452 -row 14453 -row 14454 -row 14455 -row 14456 -row 14457 -row 14458 -row 14459 -row 14460 -row 14461 -row 14462 -row 14463 -row 14464 -row 14465 -row 14466 -row 14467 -row 14468 -row 14469 -row 14470 -row 14471 -row 14472 -row 14473 -row 14474 -row 14475 -row 14476 -row 14477 -row 14478 -row 14479 -row 14480 -row 14481 -row 14482 -row 14483 -row 14484 -row 14485 -row 14486 -row 14487 -row 14488 -row 14489 -row 14490 -row 14491 -row 14492 -row 14493 -row 14494 -row 14495 -row 14496 -row 14497 -row 14498 -row 14499 -row 14500 -row 14501 -row 14502 -row 14503 -row 14504 -row 14505 -row 14506 -row 14507 -row 14508 -row 14509 -row 14510 -row 14511 -row 14512 -row 14513 -row 14514 -row 14515 -row 14516 -row 14517 -row 14518 -row 14519 -row 14520 -row 14521 -row 14522 -row 14523 -row 14524 -row 14525 -row 14526 -row 14527 -row 14528 -row 14529 -row 14530 -row 14531 -row 14532 -row 14533 -row 14534 -row 14535 -row 14536 -row 14537 -row 14538 -row 14539 -row 14540 -row 14541 -row 14542 -row 14543 -row 14544 -row 14545 -row 14546 -row 14547 -row 14548 -row 14549 -row 14550 -row 14551 -row 14552 -row 14553 -row 14554 -row 14555 -row 14556 -row 14557 -row 14558 -row 14559 -row 14560 -row 14561 -row 14562 -row 14563 -row 14564 -row 14565 -row 14566 -row 14567 -row 14568 -row 14569 -row 14570 -row 14571 -row 14572 -row 14573 -row 14574 -row 14575 -row 14576 -row 14577 -row 14578 -row 14579 -row 14580 -row 14581 -row 14582 -row 14583 -row 14584 -row 14585 -row 14586 -row 14587 -row 14588 -row 14589 -row 14590 -row 14591 -row 14592 -row 14593 -row 14594 -row 14595 -row 14596 -row 14597 -row 14598 -row 14599 -row 14600 -row 14601 -row 14602 -row 14603 -row 14604 -row 14605 -row 14606 -row 14607 -row 14608 -row 14609 -row 14610 -row 14611 -row 14612 -row 14613 -row 14614 -row 14615 -row 14616 -row 14617 -row 14618 -row 14619 -row 14620 -row 14621 -row 14622 -row 14623 -row 14624 -row 14625 -row 14626 -row 14627 -row 14628 -row 14629 -row 14630 -row 14631 -row 14632 -row 14633 -row 14634 -row 14635 -row 14636 -row 14637 -row 14638 -row 14639 -row 14640 -row 14641 -row 14642 -row 14643 -row 14644 -row 14645 -row 14646 -row 14647 -row 14648 -row 14649 -row 14650 -row 14651 -row 14652 -row 14653 -row 14654 -row 14655 -row 14656 -row 14657 -row 14658 -row 14659 -row 14660 -row 14661 -row 14662 -row 14663 -row 14664 -row 14665 -row 14666 -row 14667 -row 14668 -row 14669 -row 14670 -row 14671 -row 14672 -row 14673 -row 14674 -row 14675 -row 14676 -row 14677 -row 14678 -row 14679 -row 14680 -row 14681 -row 14682 -row 14683 -row 14684 -row 14685 -row 14686 -row 14687 -row 14688 -row 14689 -row 14690 -row 14691 -row 14692 -row 14693 -row 14694 -row 14695 -row 14696 -row 14697 -row 14698 -row 14699 -row 14700 -row 14701 -row 14702 -row 14703 -row 14704 -row 14705 -row 14706 -row 14707 -row 14708 -row 14709 -row 14710 -row 14711 -row 14712 -row 14713 -row 14714 -row 14715 -row 14716 -row 14717 -row 14718 -row 14719 -row 14720 -row 14721 -row 14722 -row 14723 -row 14724 -row 14725 -row 14726 -row 14727 -row 14728 -row 14729 -row 14730 -row 14731 -row 14732 -row 14733 -row 14734 -row 14735 -row 14736 -row 14737 -row 14738 -row 14739 -row 14740 -row 14741 -row 14742 -row 14743 -row 14744 -row 14745 -row 14746 -row 14747 -row 14748 -row 14749 -row 14750 -row 14751 -row 14752 -row 14753 -row 14754 -row 14755 -row 14756 -row 14757 -row 14758 -row 14759 -row 14760 -row 14761 -row 14762 -row 14763 -row 14764 -row 14765 -row 14766 -row 14767 -row 14768 -row 14769 -row 14770 -row 14771 -row 14772 -row 14773 -row 14774 -row 14775 -row 14776 -row 14777 -row 14778 -row 14779 -row 14780 -row 14781 -row 14782 -row 14783 -row 14784 -row 14785 -row 14786 -row 14787 -row 14788 -row 14789 -row 14790 -row 14791 -row 14792 -row 14793 -row 14794 -row 14795 -row 14796 -row 14797 -row 14798 -row 14799 -row 14800 -row 14801 -row 14802 -row 14803 -row 14804 -row 14805 -row 14806 -row 14807 -row 14808 -row 14809 -row 14810 -row 14811 -row 14812 -row 14813 -row 14814 -row 14815 -row 14816 -row 14817 -row 14818 -row 14819 -row 14820 -row 14821 -row 14822 -row 14823 -row 14824 -row 14825 -row 14826 -row 14827 -row 14828 -row 14829 -row 14830 -row 14831 -row 14832 -row 14833 -row 14834 -row 14835 -row 14836 -row 14837 -row 14838 -row 14839 -row 14840 -row 14841 -row 14842 -row 14843 -row 14844 -row 14845 -row 14846 -row 14847 -row 14848 -row 14849 -row 14850 -row 14851 -row 14852 -row 14853 -row 14854 -row 14855 -row 14856 -row 14857 -row 14858 -row 14859 -row 14860 -row 14861 -row 14862 -row 14863 -row 14864 -row 14865 -row 14866 -row 14867 -row 14868 -row 14869 -row 14870 -row 14871 -row 14872 -row 14873 -row 14874 -row 14875 -row 14876 -row 14877 -row 14878 -row 14879 -row 14880 -row 14881 -row 14882 -row 14883 -row 14884 -row 14885 -row 14886 -row 14887 -row 14888 -row 14889 -row 14890 -row 14891 -row 14892 -row 14893 -row 14894 -row 14895 -row 14896 -row 14897 -row 14898 -row 14899 -row 14900 -row 14901 -row 14902 -row 14903 -row 14904 -row 14905 -row 14906 -row 14907 -row 14908 -row 14909 -row 14910 -row 14911 -row 14912 -row 14913 -row 14914 -row 14915 -row 14916 -row 14917 -row 14918 -row 14919 -row 14920 -row 14921 -row 14922 -row 14923 -row 14924 -row 14925 -row 14926 -row 14927 -row 14928 -row 14929 -row 14930 -row 14931 -row 14932 -row 14933 -row 14934 -row 14935 -row 14936 -row 14937 -row 14938 -row 14939 -row 14940 -row 14941 -row 14942 -row 14943 -row 14944 -row 14945 -row 14946 -row 14947 -row 14948 -row 14949 -row 14950 -row 14951 -row 14952 -row 14953 -row 14954 -row 14955 -row 14956 -row 14957 -row 14958 -row 14959 -row 14960 -row 14961 -row 14962 -row 14963 -row 14964 -row 14965 -row 14966 -row 14967 -row 14968 -row 14969 -row 14970 -row 14971 -row 14972 -row 14973 -row 14974 -row 14975 -row 14976 -row 14977 -row 14978 -row 14979 -row 14980 -row 14981 -row 14982 -row 14983 -row 14984 -row 14985 -row 14986 -row 14987 -row 14988 -row 14989 -row 14990 -row 14991 -row 14992 -row 14993 -row 14994 -row 14995 -row 14996 -row 14997 -row 14998 -row 14999 -row 15000 -row 15001 -row 15002 -row 15003 -row 15004 -row 15005 -row 15006 -row 15007 -row 15008 -row 15009 -row 15010 -row 15011 -row 15012 -row 15013 -row 15014 -row 15015 -row 15016 -row 15017 -row 15018 -row 15019 -row 15020 -row 15021 -row 15022 -row 15023 -row 15024 -row 15025 -row 15026 -row 15027 -row 15028 -row 15029 -row 15030 -row 15031 -row 15032 -row 15033 -row 15034 -row 15035 -row 15036 -row 15037 -row 15038 -row 15039 -row 15040 -row 15041 -row 15042 -row 15043 -row 15044 -row 15045 -row 15046 -row 15047 -row 15048 -row 15049 -row 15050 -row 15051 -row 15052 -row 15053 -row 15054 -row 15055 -row 15056 -row 15057 -row 15058 -row 15059 -row 15060 -row 15061 -row 15062 -row 15063 -row 15064 -row 15065 -row 15066 -row 15067 -row 15068 -row 15069 -row 15070 -row 15071 -row 15072 -row 15073 -row 15074 -row 15075 -row 15076 -row 15077 -row 15078 -row 15079 -row 15080 -row 15081 -row 15082 -row 15083 -row 15084 -row 15085 -row 15086 -row 15087 -row 15088 -row 15089 -row 15090 -row 15091 -row 15092 -row 15093 -row 15094 -row 15095 -row 15096 -row 15097 -row 15098 -row 15099 -row 15100 -row 15101 -row 15102 -row 15103 -row 15104 -row 15105 -row 15106 -row 15107 -row 15108 -row 15109 -row 15110 -row 15111 -row 15112 -row 15113 -row 15114 -row 15115 -row 15116 -row 15117 -row 15118 -row 15119 -row 15120 -row 15121 -row 15122 -row 15123 -row 15124 -row 15125 -row 15126 -row 15127 -row 15128 -row 15129 -row 15130 -row 15131 -row 15132 -row 15133 -row 15134 -row 15135 -row 15136 -row 15137 -row 15138 -row 15139 -row 15140 -row 15141 -row 15142 -row 15143 -row 15144 -row 15145 -row 15146 -row 15147 -row 15148 -row 15149 -row 15150 -row 15151 -row 15152 -row 15153 -row 15154 -row 15155 -row 15156 -row 15157 -row 15158 -row 15159 -row 15160 -row 15161 -row 15162 -row 15163 -row 15164 -row 15165 -row 15166 -row 15167 -row 15168 -row 15169 -row 15170 -row 15171 -row 15172 -row 15173 -row 15174 -row 15175 -row 15176 -row 15177 -row 15178 -row 15179 -row 15180 -row 15181 -row 15182 -row 15183 -row 15184 -row 15185 -row 15186 -row 15187 -row 15188 -row 15189 -row 15190 -row 15191 -row 15192 -row 15193 -row 15194 -row 15195 -row 15196 -row 15197 -row 15198 -row 15199 -row 15200 -row 15201 -row 15202 -row 15203 -row 15204 -row 15205 -row 15206 -row 15207 -row 15208 -row 15209 -row 15210 -row 15211 -row 15212 -row 15213 -row 15214 -row 15215 -row 15216 -row 15217 -row 15218 -row 15219 -row 15220 -row 15221 -row 15222 -row 15223 -row 15224 -row 15225 -row 15226 -row 15227 -row 15228 -row 15229 -row 15230 -row 15231 -row 15232 -row 15233 -row 15234 -row 15235 -row 15236 -row 15237 -row 15238 -row 15239 -row 15240 -row 15241 -row 15242 -row 15243 -row 15244 -row 15245 -row 15246 -row 15247 -row 15248 -row 15249 -row 15250 -row 15251 -row 15252 -row 15253 -row 15254 -row 15255 -row 15256 -row 15257 -row 15258 -row 15259 -row 15260 -row 15261 -row 15262 -row 15263 -row 15264 -row 15265 -row 15266 -row 15267 -row 15268 -row 15269 -row 15270 -row 15271 -row 15272 -row 15273 -row 15274 -row 15275 -row 15276 -row 15277 -row 15278 -row 15279 -row 15280 -row 15281 -row 15282 -row 15283 -row 15284 -row 15285 -row 15286 -row 15287 -row 15288 -row 15289 -row 15290 -row 15291 -row 15292 -row 15293 -row 15294 -row 15295 -row 15296 -row 15297 -row 15298 -row 15299 -row 15300 -row 15301 -row 15302 -row 15303 -row 15304 -row 15305 -row 15306 -row 15307 -row 15308 -row 15309 -row 15310 -row 15311 -row 15312 -row 15313 -row 15314 -row 15315 -row 15316 -row 15317 -row 15318 -row 15319 -row 15320 -row 15321 -row 15322 -row 15323 -row 15324 -row 15325 -row 15326 -row 15327 -row 15328 -row 15329 -row 15330 -row 15331 -row 15332 -row 15333 -row 15334 -row 15335 -row 15336 -row 15337 -row 15338 -row 15339 -row 15340 -row 15341 -row 15342 -row 15343 -row 15344 -row 15345 -row 15346 -row 15347 -row 15348 -row 15349 -row 15350 -row 15351 -row 15352 -row 15353 -row 15354 -row 15355 -row 15356 -row 15357 -row 15358 -row 15359 -row 15360 -row 15361 -row 15362 -row 15363 -row 15364 -row 15365 -row 15366 -row 15367 -row 15368 -row 15369 -row 15370 -row 15371 -row 15372 -row 15373 -row 15374 -row 15375 -row 15376 -row 15377 -row 15378 -row 15379 -row 15380 -row 15381 -row 15382 -row 15383 -row 15384 -row 15385 -row 15386 -row 15387 -row 15388 -row 15389 -row 15390 -row 15391 -row 15392 -row 15393 -row 15394 -row 15395 -row 15396 -row 15397 -row 15398 -row 15399 -row 15400 -row 15401 -row 15402 -row 15403 -row 15404 -row 15405 -row 15406 -row 15407 -row 15408 -row 15409 -row 15410 -row 15411 -row 15412 -row 15413 -row 15414 -row 15415 -row 15416 -row 15417 -row 15418 -row 15419 -row 15420 -row 15421 -row 15422 -row 15423 -row 15424 -row 15425 -row 15426 -row 15427 -row 15428 -row 15429 -row 15430 -row 15431 -row 15432 -row 15433 -row 15434 -row 15435 -row 15436 -row 15437 -row 15438 -row 15439 -row 15440 -row 15441 -row 15442 -row 15443 -row 15444 -row 15445 -row 15446 -row 15447 -row 15448 -row 15449 -row 15450 -row 15451 -row 15452 -row 15453 -row 15454 -row 15455 -row 15456 -row 15457 -row 15458 -row 15459 -row 15460 -row 15461 -row 15462 -row 15463 -row 15464 -row 15465 -row 15466 -row 15467 -row 15468 -row 15469 -row 15470 -row 15471 -row 15472 -row 15473 -row 15474 -row 15475 -row 15476 -row 15477 -row 15478 -row 15479 -row 15480 -row 15481 -row 15482 -row 15483 -row 15484 -row 15485 -row 15486 -row 15487 -row 15488 -row 15489 -row 15490 -row 15491 -row 15492 -row 15493 -row 15494 -row 15495 -row 15496 -row 15497 -row 15498 -row 15499 -row 15500 -row 15501 -row 15502 -row 15503 -row 15504 -row 15505 -row 15506 -row 15507 -row 15508 -row 15509 -row 15510 -row 15511 -row 15512 -row 15513 -row 15514 -row 15515 -row 15516 -row 15517 -row 15518 -row 15519 -row 15520 -row 15521 -row 15522 -row 15523 -row 15524 -row 15525 -row 15526 -row 15527 -row 15528 -row 15529 -row 15530 -row 15531 -row 15532 -row 15533 -row 15534 -row 15535 -row 15536 -row 15537 -row 15538 -row 15539 -row 15540 -row 15541 -row 15542 -row 15543 -row 15544 -row 15545 -row 15546 -row 15547 -row 15548 -row 15549 -row 15550 -row 15551 -row 15552 -row 15553 -row 15554 -row 15555 -row 15556 -row 15557 -row 15558 -row 15559 -row 15560 -row 15561 -row 15562 -row 15563 -row 15564 -row 15565 -row 15566 -row 15567 -row 15568 -row 15569 -row 15570 -row 15571 -row 15572 -row 15573 -row 15574 -row 15575 -row 15576 -row 15577 -row 15578 -row 15579 -row 15580 -row 15581 -row 15582 -row 15583 -row 15584 -row 15585 -row 15586 -row 15587 -row 15588 -row 15589 -row 15590 -row 15591 -row 15592 -row 15593 -row 15594 -row 15595 -row 15596 -row 15597 -row 15598 -row 15599 -row 15600 -row 15601 -row 15602 -row 15603 -row 15604 -row 15605 -row 15606 -row 15607 -row 15608 -row 15609 -row 15610 -row 15611 -row 15612 -row 15613 -row 15614 -row 15615 -row 15616 -row 15617 -row 15618 -row 15619 -row 15620 -row 15621 -row 15622 -row 15623 -row 15624 -row 15625 -row 15626 -row 15627 -row 15628 -row 15629 -row 15630 -row 15631 -row 15632 -row 15633 -row 15634 -row 15635 -row 15636 -row 15637 -row 15638 -row 15639 -row 15640 -row 15641 -row 15642 -row 15643 -row 15644 -row 15645 -row 15646 -row 15647 -row 15648 -row 15649 -row 15650 -row 15651 -row 15652 -row 15653 -row 15654 -row 15655 -row 15656 -row 15657 -row 15658 -row 15659 -row 15660 -row 15661 -row 15662 -row 15663 -row 15664 -row 15665 -row 15666 -row 15667 -row 15668 -row 15669 -row 15670 -row 15671 -row 15672 -row 15673 -row 15674 -row 15675 -row 15676 -row 15677 -row 15678 -row 15679 -row 15680 -row 15681 -row 15682 -row 15683 -row 15684 -row 15685 -row 15686 -row 15687 -row 15688 -row 15689 -row 15690 -row 15691 -row 15692 -row 15693 -row 15694 -row 15695 -row 15696 -row 15697 -row 15698 -row 15699 -row 15700 -row 15701 -row 15702 -row 15703 -row 15704 -row 15705 -row 15706 -row 15707 -row 15708 -row 15709 -row 15710 -row 15711 -row 15712 -row 15713 -row 15714 -row 15715 -row 15716 -row 15717 -row 15718 -row 15719 -row 15720 -row 15721 -row 15722 -row 15723 -row 15724 -row 15725 -row 15726 -row 15727 -row 15728 -row 15729 -row 15730 -row 15731 -row 15732 -row 15733 -row 15734 -row 15735 -row 15736 -row 15737 -row 15738 -row 15739 -row 15740 -row 15741 -row 15742 -row 15743 -row 15744 -row 15745 -row 15746 -row 15747 -row 15748 -row 15749 -row 15750 -row 15751 -row 15752 -row 15753 -row 15754 -row 15755 -row 15756 -row 15757 -row 15758 -row 15759 -row 15760 -row 15761 -row 15762 -row 15763 -row 15764 -row 15765 -row 15766 -row 15767 -row 15768 -row 15769 -row 15770 -row 15771 -row 15772 -row 15773 -row 15774 -row 15775 -row 15776 -row 15777 -row 15778 -row 15779 -row 15780 -row 15781 -row 15782 -row 15783 -row 15784 -row 15785 -row 15786 -row 15787 -row 15788 -row 15789 -row 15790 -row 15791 -row 15792 -row 15793 -row 15794 -row 15795 -row 15796 -row 15797 -row 15798 -row 15799 -row 15800 -row 15801 -row 15802 -row 15803 -row 15804 -row 15805 -row 15806 -row 15807 -row 15808 -row 15809 -row 15810 -row 15811 -row 15812 -row 15813 -row 15814 -row 15815 -row 15816 -row 15817 -row 15818 -row 15819 -row 15820 -row 15821 -row 15822 -row 15823 -row 15824 -row 15825 -row 15826 -row 15827 -row 15828 -row 15829 -row 15830 -row 15831 -row 15832 -row 15833 -row 15834 -row 15835 -row 15836 -row 15837 -row 15838 -row 15839 -row 15840 -row 15841 -row 15842 -row 15843 -row 15844 -row 15845 -row 15846 -row 15847 -row 15848 -row 15849 -row 15850 -row 15851 -row 15852 -row 15853 -row 15854 -row 15855 -row 15856 -row 15857 -row 15858 -row 15859 -row 15860 -row 15861 -row 15862 -row 15863 -row 15864 -row 15865 -row 15866 -row 15867 -row 15868 -row 15869 -row 15870 -row 15871 -row 15872 -row 15873 -row 15874 -row 15875 -row 15876 -row 15877 -row 15878 -row 15879 -row 15880 -row 15881 -row 15882 -row 15883 -row 15884 -row 15885 -row 15886 -row 15887 -row 15888 -row 15889 -row 15890 -row 15891 -row 15892 -row 15893 -row 15894 -row 15895 -row 15896 -row 15897 -row 15898 -row 15899 -row 15900 -row 15901 -row 15902 -row 15903 -row 15904 -row 15905 -row 15906 -row 15907 -row 15908 -row 15909 -row 15910 -row 15911 -row 15912 -row 15913 -row 15914 -row 15915 -row 15916 -row 15917 -row 15918 -row 15919 -row 15920 -row 15921 -row 15922 -row 15923 -row 15924 -row 15925 -row 15926 -row 15927 -row 15928 -row 15929 -row 15930 -row 15931 -row 15932 -row 15933 -row 15934 -row 15935 -row 15936 -row 15937 -row 15938 -row 15939 -row 15940 -row 15941 -row 15942 -row 15943 -row 15944 -row 15945 -row 15946 -row 15947 -row 15948 -row 15949 -row 15950 -row 15951 -row 15952 -row 15953 -row 15954 -row 15955 -row 15956 -row 15957 -row 15958 -row 15959 -row 15960 -row 15961 -row 15962 -row 15963 -row 15964 -row 15965 -row 15966 -row 15967 -row 15968 -row 15969 -row 15970 -row 15971 -row 15972 -row 15973 -row 15974 -row 15975 -row 15976 -row 15977 -row 15978 -row 15979 -row 15980 -row 15981 -row 15982 -row 15983 -row 15984 -row 15985 -row 15986 -row 15987 -row 15988 -row 15989 -row 15990 -row 15991 -row 15992 -row 15993 -row 15994 -row 15995 -row 15996 -row 15997 -row 15998 -row 15999 -row 16000 -row 16001 -row 16002 -row 16003 -row 16004 -row 16005 -row 16006 -row 16007 -row 16008 -row 16009 -row 16010 -row 16011 -row 16012 -row 16013 -row 16014 -row 16015 -row 16016 -row 16017 -row 16018 -row 16019 -row 16020 -row 16021 -row 16022 -row 16023 -row 16024 -row 16025 -row 16026 -row 16027 -row 16028 -row 16029 -row 16030 -row 16031 -row 16032 -row 16033 -row 16034 -row 16035 -row 16036 -row 16037 -row 16038 -row 16039 -row 16040 -row 16041 -row 16042 -row 16043 -row 16044 -row 16045 -row 16046 -row 16047 -row 16048 -row 16049 -row 16050 -row 16051 -row 16052 -row 16053 -row 16054 -row 16055 -row 16056 -row 16057 -row 16058 -row 16059 -row 16060 -row 16061 -row 16062 -row 16063 -row 16064 -row 16065 -row 16066 -row 16067 -row 16068 -row 16069 -row 16070 -row 16071 -row 16072 -row 16073 -row 16074 -row 16075 -row 16076 -row 16077 -row 16078 -row 16079 -row 16080 -row 16081 -row 16082 -row 16083 -row 16084 -row 16085 -row 16086 -row 16087 -row 16088 -row 16089 -row 16090 -row 16091 -row 16092 -row 16093 -row 16094 -row 16095 -row 16096 -row 16097 -row 16098 -row 16099 -row 16100 -row 16101 -row 16102 -row 16103 -row 16104 -row 16105 -row 16106 -row 16107 -row 16108 -row 16109 -row 16110 -row 16111 -row 16112 -row 16113 -row 16114 -row 16115 -row 16116 -row 16117 -row 16118 -row 16119 -row 16120 -row 16121 -row 16122 -row 16123 -row 16124 -row 16125 -row 16126 -row 16127 -row 16128 -row 16129 -row 16130 -row 16131 -row 16132 -row 16133 -row 16134 -row 16135 -row 16136 -row 16137 -row 16138 -row 16139 -row 16140 -row 16141 -row 16142 -row 16143 -row 16144 -row 16145 -row 16146 -row 16147 -row 16148 -row 16149 -row 16150 -row 16151 -row 16152 -row 16153 -row 16154 -row 16155 -row 16156 -row 16157 -row 16158 -row 16159 -row 16160 -row 16161 -row 16162 -row 16163 -row 16164 -row 16165 -row 16166 -row 16167 -row 16168 -row 16169 -row 16170 -row 16171 -row 16172 -row 16173 -row 16174 -row 16175 -row 16176 -row 16177 -row 16178 -row 16179 -row 16180 -row 16181 -row 16182 -row 16183 -row 16184 -row 16185 -row 16186 -row 16187 -row 16188 -row 16189 -row 16190 -row 16191 -row 16192 -row 16193 -row 16194 -row 16195 -row 16196 -row 16197 -row 16198 -row 16199 -row 16200 -row 16201 -row 16202 -row 16203 -row 16204 -row 16205 -row 16206 -row 16207 -row 16208 -row 16209 -row 16210 -row 16211 -row 16212 -row 16213 -row 16214 -row 16215 -row 16216 -row 16217 -row 16218 -row 16219 -row 16220 -row 16221 -row 16222 -row 16223 -row 16224 -row 16225 -row 16226 -row 16227 -row 16228 -row 16229 -row 16230 -row 16231 -row 16232 -row 16233 -row 16234 -row 16235 -row 16236 -row 16237 -row 16238 -row 16239 -row 16240 -row 16241 -row 16242 -row 16243 -row 16244 -row 16245 -row 16246 -row 16247 -row 16248 -row 16249 -row 16250 -row 16251 -row 16252 -row 16253 -row 16254 -row 16255 -row 16256 -row 16257 -row 16258 -row 16259 -row 16260 -row 16261 -row 16262 -row 16263 -row 16264 -row 16265 -row 16266 -row 16267 -row 16268 -row 16269 -row 16270 -row 16271 -row 16272 -row 16273 -row 16274 -row 16275 -row 16276 -row 16277 -row 16278 -row 16279 -row 16280 -row 16281 -row 16282 -row 16283 -row 16284 -row 16285 -row 16286 -row 16287 -row 16288 -row 16289 -row 16290 -row 16291 -row 16292 -row 16293 -row 16294 -row 16295 -row 16296 -row 16297 -row 16298 -row 16299 -row 16300 -row 16301 -row 16302 -row 16303 -row 16304 -row 16305 -row 16306 -row 16307 -row 16308 -row 16309 -row 16310 -row 16311 -row 16312 -row 16313 -row 16314 -row 16315 -row 16316 -row 16317 -row 16318 -row 16319 -row 16320 -row 16321 -row 16322 -row 16323 -row 16324 -row 16325 -row 16326 -row 16327 -row 16328 -row 16329 -row 16330 -row 16331 -row 16332 -row 16333 -row 16334 -row 16335 -row 16336 -row 16337 -row 16338 -row 16339 -row 16340 -row 16341 -row 16342 -row 16343 -row 16344 -row 16345 -row 16346 -row 16347 -row 16348 -row 16349 -row 16350 -row 16351 -row 16352 -row 16353 -row 16354 -row 16355 -row 16356 -row 16357 -row 16358 -row 16359 -row 16360 -row 16361 -row 16362 -row 16363 -row 16364 -row 16365 -row 16366 -row 16367 -row 16368 -row 16369 -row 16370 -row 16371 -row 16372 -row 16373 -row 16374 -row 16375 -row 16376 -row 16377 -row 16378 -row 16379 -row 16380 -row 16381 -row 16382 -row 16383 -row 16384 -row 16385 -row 16386 -row 16387 -row 16388 -row 16389 -row 16390 -row 16391 -row 16392 -row 16393 -row 16394 -row 16395 -row 16396 -row 16397 -row 16398 -row 16399 -row 16400 -row 16401 -row 16402 -row 16403 -row 16404 -row 16405 -row 16406 -row 16407 -row 16408 -row 16409 -row 16410 -row 16411 -row 16412 -row 16413 -row 16414 -row 16415 -row 16416 -row 16417 -row 16418 -row 16419 -row 16420 -row 16421 -row 16422 -row 16423 -row 16424 -row 16425 -row 16426 -row 16427 -row 16428 -row 16429 -row 16430 -row 16431 -row 16432 -row 16433 -row 16434 -row 16435 -row 16436 -row 16437 -row 16438 -row 16439 -row 16440 -row 16441 -row 16442 -row 16443 -row 16444 -row 16445 -row 16446 -row 16447 -row 16448 -row 16449 -row 16450 -row 16451 -row 16452 -row 16453 -row 16454 -row 16455 -row 16456 -row 16457 -row 16458 -row 16459 -row 16460 -row 16461 -row 16462 -row 16463 -row 16464 -row 16465 -row 16466 -row 16467 -row 16468 -row 16469 -row 16470 -row 16471 -row 16472 -row 16473 -row 16474 -row 16475 -row 16476 -row 16477 -row 16478 -row 16479 -row 16480 -row 16481 -row 16482 -row 16483 -row 16484 -row 16485 -row 16486 -row 16487 -row 16488 -row 16489 -row 16490 -row 16491 -row 16492 -row 16493 -row 16494 -row 16495 -row 16496 -row 16497 -row 16498 -row 16499 -row 16500 -row 16501 -row 16502 -row 16503 -row 16504 -row 16505 -row 16506 -row 16507 -row 16508 -row 16509 -row 16510 -row 16511 -row 16512 -row 16513 -row 16514 -row 16515 -row 16516 -row 16517 -row 16518 -row 16519 -row 16520 -row 16521 -row 16522 -row 16523 -row 16524 -row 16525 -row 16526 -row 16527 -row 16528 -row 16529 -row 16530 -row 16531 -row 16532 -row 16533 -row 16534 -row 16535 -row 16536 -row 16537 -row 16538 -row 16539 -row 16540 -row 16541 -row 16542 -row 16543 -row 16544 -row 16545 -row 16546 -row 16547 -row 16548 -row 16549 -row 16550 -row 16551 -row 16552 -row 16553 -row 16554 -row 16555 -row 16556 -row 16557 -row 16558 -row 16559 -row 16560 -row 16561 -row 16562 -row 16563 -row 16564 -row 16565 -row 16566 -row 16567 -row 16568 -row 16569 -row 16570 -row 16571 -row 16572 -row 16573 -row 16574 -row 16575 -row 16576 -row 16577 -row 16578 -row 16579 -row 16580 -row 16581 -row 16582 -row 16583 -row 16584 -row 16585 -row 16586 -row 16587 -row 16588 -row 16589 -row 16590 -row 16591 -row 16592 -row 16593 -row 16594 -row 16595 -row 16596 -row 16597 -row 16598 -row 16599 -row 16600 -row 16601 -row 16602 -row 16603 -row 16604 -row 16605 -row 16606 -row 16607 -row 16608 -row 16609 -row 16610 -row 16611 -row 16612 -row 16613 -row 16614 -row 16615 -row 16616 -row 16617 -row 16618 -row 16619 -row 16620 -row 16621 -row 16622 -row 16623 -row 16624 -row 16625 -row 16626 -row 16627 -row 16628 -row 16629 -row 16630 -row 16631 -row 16632 -row 16633 -row 16634 -row 16635 -row 16636 -row 16637 -row 16638 -row 16639 -row 16640 -row 16641 -row 16642 -row 16643 -row 16644 -row 16645 -row 16646 -row 16647 -row 16648 -row 16649 -row 16650 -row 16651 -row 16652 -row 16653 -row 16654 -row 16655 -row 16656 -row 16657 -row 16658 -row 16659 -row 16660 -row 16661 -row 16662 -row 16663 -row 16664 -row 16665 -row 16666 -row 16667 -row 16668 -row 16669 -row 16670 -row 16671 -row 16672 -row 16673 -row 16674 -row 16675 -row 16676 -row 16677 -row 16678 -row 16679 -row 16680 -row 16681 -row 16682 -row 16683 -row 16684 -row 16685 -row 16686 -row 16687 -row 16688 -row 16689 -row 16690 -row 16691 -row 16692 -row 16693 -row 16694 -row 16695 -row 16696 -row 16697 -row 16698 -row 16699 -row 16700 -row 16701 -row 16702 -row 16703 -row 16704 -row 16705 -row 16706 -row 16707 -row 16708 -row 16709 -row 16710 -row 16711 -row 16712 -row 16713 -row 16714 -row 16715 -row 16716 -row 16717 -row 16718 -row 16719 -row 16720 -row 16721 -row 16722 -row 16723 -row 16724 -row 16725 -row 16726 -row 16727 -row 16728 -row 16729 -row 16730 -row 16731 -row 16732 -row 16733 -row 16734 -row 16735 -row 16736 -row 16737 -row 16738 -row 16739 -row 16740 -row 16741 -row 16742 -row 16743 -row 16744 -row 16745 -row 16746 -row 16747 -row 16748 -row 16749 -row 16750 -row 16751 -row 16752 -row 16753 -row 16754 -row 16755 -row 16756 -row 16757 -row 16758 -row 16759 -row 16760 -row 16761 -row 16762 -row 16763 -row 16764 -row 16765 -row 16766 -row 16767 -row 16768 -row 16769 -row 16770 -row 16771 -row 16772 -row 16773 -row 16774 -row 16775 -row 16776 -row 16777 -row 16778 -row 16779 -row 16780 -row 16781 -row 16782 -row 16783 -row 16784 -row 16785 -row 16786 -row 16787 -row 16788 -row 16789 -row 16790 -row 16791 -row 16792 -row 16793 -row 16794 -row 16795 -row 16796 -row 16797 -row 16798 -row 16799 -row 16800 -row 16801 -row 16802 -row 16803 -row 16804 -row 16805 -row 16806 -row 16807 -row 16808 -row 16809 -row 16810 -row 16811 -row 16812 -row 16813 -row 16814 -row 16815 -row 16816 -row 16817 -row 16818 -row 16819 -row 16820 -row 16821 -row 16822 -row 16823 -row 16824 -row 16825 -row 16826 -row 16827 -row 16828 -row 16829 -row 16830 -row 16831 -row 16832 -row 16833 -row 16834 -row 16835 -row 16836 -row 16837 -row 16838 -row 16839 -row 16840 -row 16841 -row 16842 -row 16843 -row 16844 -row 16845 -row 16846 -row 16847 -row 16848 -row 16849 -row 16850 -row 16851 -row 16852 -row 16853 -row 16854 -row 16855 -row 16856 -row 16857 -row 16858 -row 16859 -row 16860 -row 16861 -row 16862 -row 16863 -row 16864 -row 16865 -row 16866 -row 16867 -row 16868 -row 16869 -row 16870 -row 16871 -row 16872 -row 16873 -row 16874 -row 16875 -row 16876 -row 16877 -row 16878 -row 16879 -row 16880 -row 16881 -row 16882 -row 16883 -row 16884 -row 16885 -row 16886 -row 16887 -row 16888 -row 16889 -row 16890 -row 16891 -row 16892 -row 16893 -row 16894 -row 16895 -row 16896 -row 16897 -row 16898 -row 16899 -row 16900 -row 16901 -row 16902 -row 16903 -row 16904 -row 16905 -row 16906 -row 16907 -row 16908 -row 16909 -row 16910 -row 16911 -row 16912 -row 16913 -row 16914 -row 16915 -row 16916 -row 16917 -row 16918 -row 16919 -row 16920 -row 16921 -row 16922 -row 16923 -row 16924 -row 16925 -row 16926 -row 16927 -row 16928 -row 16929 -row 16930 -row 16931 -row 16932 -row 16933 -row 16934 -row 16935 -row 16936 -row 16937 -row 16938 -row 16939 -row 16940 -row 16941 -row 16942 -row 16943 -row 16944 -row 16945 -row 16946 -row 16947 -row 16948 -row 16949 -row 16950 -row 16951 -row 16952 -row 16953 -row 16954 -row 16955 -row 16956 -row 16957 -row 16958 -row 16959 -row 16960 -row 16961 -row 16962 -row 16963 -row 16964 -row 16965 -row 16966 -row 16967 -row 16968 -row 16969 -row 16970 -row 16971 -row 16972 -row 16973 -row 16974 -row 16975 -row 16976 -row 16977 -row 16978 -row 16979 -row 16980 -row 16981 -row 16982 -row 16983 -row 16984 -row 16985 -row 16986 -row 16987 -row 16988 -row 16989 -row 16990 -row 16991 -row 16992 -row 16993 -row 16994 -row 16995 -row 16996 -row 16997 -row 16998 -row 16999 -row 17000 -row 17001 -row 17002 -row 17003 -row 17004 -row 17005 -row 17006 -row 17007 -row 17008 -row 17009 -row 17010 -row 17011 -row 17012 -row 17013 -row 17014 -row 17015 -row 17016 -row 17017 -row 17018 -row 17019 -row 17020 -row 17021 -row 17022 -row 17023 -row 17024 -row 17025 -row 17026 -row 17027 -row 17028 -row 17029 -row 17030 -row 17031 -row 17032 -row 17033 -row 17034 -row 17035 -row 17036 -row 17037 -row 17038 -row 17039 -row 17040 -row 17041 -row 17042 -row 17043 -row 17044 -row 17045 -row 17046 -row 17047 -row 17048 -row 17049 -row 17050 -row 17051 -row 17052 -row 17053 -row 17054 -row 17055 -row 17056 -row 17057 -row 17058 -row 17059 -row 17060 -row 17061 -row 17062 -row 17063 -row 17064 -row 17065 -row 17066 -row 17067 -row 17068 -row 17069 -row 17070 -row 17071 -row 17072 -row 17073 -row 17074 -row 17075 -row 17076 -row 17077 -row 17078 -row 17079 -row 17080 -row 17081 -row 17082 -row 17083 -row 17084 -row 17085 -row 17086 -row 17087 -row 17088 -row 17089 -row 17090 -row 17091 -row 17092 -row 17093 -row 17094 -row 17095 -row 17096 -row 17097 -row 17098 -row 17099 -row 17100 -row 17101 -row 17102 -row 17103 -row 17104 -row 17105 -row 17106 -row 17107 -row 17108 -row 17109 -row 17110 -row 17111 -row 17112 -row 17113 -row 17114 -row 17115 -row 17116 -row 17117 -row 17118 -row 17119 -row 17120 -row 17121 -row 17122 -row 17123 -row 17124 -row 17125 -row 17126 -row 17127 -row 17128 -row 17129 -row 17130 -row 17131 -row 17132 -row 17133 -row 17134 -row 17135 -row 17136 -row 17137 -row 17138 -row 17139 -row 17140 -row 17141 -row 17142 -row 17143 -row 17144 -row 17145 -row 17146 -row 17147 -row 17148 -row 17149 -row 17150 -row 17151 -row 17152 -row 17153 -row 17154 -row 17155 -row 17156 -row 17157 -row 17158 -row 17159 -row 17160 -row 17161 -row 17162 -row 17163 -row 17164 -row 17165 -row 17166 -row 17167 -row 17168 -row 17169 -row 17170 -row 17171 -row 17172 -row 17173 -row 17174 -row 17175 -row 17176 -row 17177 -row 17178 -row 17179 -row 17180 -row 17181 -row 17182 -row 17183 -row 17184 -row 17185 -row 17186 -row 17187 -row 17188 -row 17189 -row 17190 -row 17191 -row 17192 -row 17193 -row 17194 -row 17195 -row 17196 -row 17197 -row 17198 -row 17199 -row 17200 -row 17201 -row 17202 -row 17203 -row 17204 -row 17205 -row 17206 -row 17207 -row 17208 -row 17209 -row 17210 -row 17211 -row 17212 -row 17213 -row 17214 -row 17215 -row 17216 -row 17217 -row 17218 -row 17219 -row 17220 -row 17221 -row 17222 -row 17223 -row 17224 -row 17225 -row 17226 -row 17227 -row 17228 -row 17229 -row 17230 -row 17231 -row 17232 -row 17233 -row 17234 -row 17235 -row 17236 -row 17237 -row 17238 -row 17239 -row 17240 -row 17241 -row 17242 -row 17243 -row 17244 -row 17245 -row 17246 -row 17247 -row 17248 -row 17249 -row 17250 -row 17251 -row 17252 -row 17253 -row 17254 -row 17255 -row 17256 -row 17257 -row 17258 -row 17259 -row 17260 -row 17261 -row 17262 -row 17263 -row 17264 -row 17265 -row 17266 -row 17267 -row 17268 -row 17269 -row 17270 -row 17271 -row 17272 -row 17273 -row 17274 -row 17275 -row 17276 -row 17277 -row 17278 -row 17279 -row 17280 -row 17281 -row 17282 -row 17283 -row 17284 -row 17285 -row 17286 -row 17287 -row 17288 -row 17289 -row 17290 -row 17291 -row 17292 -row 17293 -row 17294 -row 17295 -row 17296 -row 17297 -row 17298 -row 17299 -row 17300 -row 17301 -row 17302 -row 17303 -row 17304 -row 17305 -row 17306 -row 17307 -row 17308 -row 17309 -row 17310 -row 17311 -row 17312 -row 17313 -row 17314 -row 17315 -row 17316 -row 17317 -row 17318 -row 17319 -row 17320 -row 17321 -row 17322 -row 17323 -row 17324 -row 17325 -row 17326 -row 17327 -row 17328 -row 17329 -row 17330 -row 17331 -row 17332 -row 17333 -row 17334 -row 17335 -row 17336 -row 17337 -row 17338 -row 17339 -row 17340 -row 17341 -row 17342 -row 17343 -row 17344 -row 17345 -row 17346 -row 17347 -row 17348 -row 17349 -row 17350 -row 17351 -row 17352 -row 17353 -row 17354 -row 17355 -row 17356 -row 17357 -row 17358 -row 17359 -row 17360 -row 17361 -row 17362 -row 17363 -row 17364 -row 17365 -row 17366 -row 17367 -row 17368 -row 17369 -row 17370 -row 17371 -row 17372 -row 17373 -row 17374 -row 17375 -row 17376 -row 17377 -row 17378 -row 17379 -row 17380 -row 17381 -row 17382 -row 17383 -row 17384 -row 17385 -row 17386 -row 17387 -row 17388 -row 17389 -row 17390 -row 17391 -row 17392 -row 17393 -row 17394 -row 17395 -row 17396 -row 17397 -row 17398 -row 17399 -row 17400 -row 17401 -row 17402 -row 17403 -row 17404 -row 17405 -row 17406 -row 17407 -row 17408 -row 17409 -row 17410 -row 17411 -row 17412 -row 17413 -row 17414 -row 17415 -row 17416 -row 17417 -row 17418 -row 17419 -row 17420 -row 17421 -row 17422 -row 17423 -row 17424 -row 17425 -row 17426 -row 17427 -row 17428 -row 17429 -row 17430 -row 17431 -row 17432 -row 17433 -row 17434 -row 17435 -row 17436 -row 17437 -row 17438 -row 17439 -row 17440 -row 17441 -row 17442 -row 17443 -row 17444 -row 17445 -row 17446 -row 17447 -row 17448 -row 17449 -row 17450 -row 17451 -row 17452 -row 17453 -row 17454 -row 17455 -row 17456 -row 17457 -row 17458 -row 17459 -row 17460 -row 17461 -row 17462 -row 17463 -row 17464 -row 17465 -row 17466 -row 17467 -row 17468 -row 17469 -row 17470 -row 17471 -row 17472 -row 17473 -row 17474 -row 17475 -row 17476 -row 17477 -row 17478 -row 17479 -row 17480 -row 17481 -row 17482 -row 17483 -row 17484 -row 17485 -row 17486 -row 17487 -row 17488 -row 17489 -row 17490 -row 17491 -row 17492 -row 17493 -row 17494 -row 17495 -row 17496 -row 17497 -row 17498 -row 17499 -row 17500 -row 17501 -row 17502 -row 17503 -row 17504 -row 17505 -row 17506 -row 17507 -row 17508 -row 17509 -row 17510 -row 17511 -row 17512 -row 17513 -row 17514 -row 17515 -row 17516 -row 17517 -row 17518 -row 17519 -row 17520 -row 17521 -row 17522 -row 17523 -row 17524 -row 17525 -row 17526 -row 17527 -row 17528 -row 17529 -row 17530 -row 17531 -row 17532 -row 17533 -row 17534 -row 17535 -row 17536 -row 17537 -row 17538 -row 17539 -row 17540 -row 17541 -row 17542 -row 17543 -row 17544 -row 17545 -row 17546 -row 17547 -row 17548 -row 17549 -row 17550 -row 17551 -row 17552 -row 17553 -row 17554 -row 17555 -row 17556 -row 17557 -row 17558 -row 17559 -row 17560 -row 17561 -row 17562 -row 17563 -row 17564 -row 17565 -row 17566 -row 17567 -row 17568 -row 17569 -row 17570 -row 17571 -row 17572 -row 17573 -row 17574 -row 17575 -row 17576 -row 17577 -row 17578 -row 17579 -row 17580 -row 17581 -row 17582 -row 17583 -row 17584 -row 17585 -row 17586 -row 17587 -row 17588 -row 17589 -row 17590 -row 17591 -row 17592 -row 17593 -row 17594 -row 17595 -row 17596 -row 17597 -row 17598 -row 17599 -row 17600 -row 17601 -row 17602 -row 17603 -row 17604 -row 17605 -row 17606 -row 17607 -row 17608 -row 17609 -row 17610 -row 17611 -row 17612 -row 17613 -row 17614 -row 17615 -row 17616 -row 17617 -row 17618 -row 17619 -row 17620 -row 17621 -row 17622 -row 17623 -row 17624 -row 17625 -row 17626 -row 17627 -row 17628 -row 17629 -row 17630 -row 17631 -row 17632 -row 17633 -row 17634 -row 17635 -row 17636 -row 17637 -row 17638 -row 17639 -row 17640 -row 17641 -row 17642 -row 17643 -row 17644 -row 17645 -row 17646 -row 17647 -row 17648 -row 17649 -row 17650 -row 17651 -row 17652 -row 17653 -row 17654 -row 17655 -row 17656 -row 17657 -row 17658 -row 17659 -row 17660 -row 17661 -row 17662 -row 17663 -row 17664 -row 17665 -row 17666 -row 17667 -row 17668 -row 17669 -row 17670 -row 17671 -row 17672 -row 17673 -row 17674 -row 17675 -row 17676 -row 17677 -row 17678 -row 17679 -row 17680 -row 17681 -row 17682 -row 17683 -row 17684 -row 17685 -row 17686 -row 17687 -row 17688 -row 17689 -row 17690 -row 17691 -row 17692 -row 17693 -row 17694 -row 17695 -row 17696 -row 17697 -row 17698 -row 17699 -row 17700 -row 17701 -row 17702 -row 17703 -row 17704 -row 17705 -row 17706 -row 17707 -row 17708 -row 17709 -row 17710 -row 17711 -row 17712 -row 17713 -row 17714 -row 17715 -row 17716 -row 17717 -row 17718 -row 17719 -row 17720 -row 17721 -row 17722 -row 17723 -row 17724 -row 17725 -row 17726 -row 17727 -row 17728 -row 17729 -row 17730 -row 17731 -row 17732 -row 17733 -row 17734 -row 17735 -row 17736 -row 17737 -row 17738 -row 17739 -row 17740 -row 17741 -row 17742 -row 17743 -row 17744 -row 17745 -row 17746 -row 17747 -row 17748 -row 17749 -row 17750 -row 17751 -row 17752 -row 17753 -row 17754 -row 17755 -row 17756 -row 17757 -row 17758 -row 17759 -row 17760 -row 17761 -row 17762 -row 17763 -row 17764 -row 17765 -row 17766 -row 17767 -row 17768 -row 17769 -row 17770 -row 17771 -row 17772 -row 17773 -row 17774 -row 17775 -row 17776 -row 17777 -row 17778 -row 17779 -row 17780 -row 17781 -row 17782 -row 17783 -row 17784 -row 17785 -row 17786 -row 17787 -row 17788 -row 17789 -row 17790 -row 17791 -row 17792 -row 17793 -row 17794 -row 17795 -row 17796 -row 17797 -row 17798 -row 17799 -row 17800 -row 17801 -row 17802 -row 17803 -row 17804 -row 17805 -row 17806 -row 17807 -row 17808 -row 17809 -row 17810 -row 17811 -row 17812 -row 17813 -row 17814 -row 17815 -row 17816 -row 17817 -row 17818 -row 17819 -row 17820 -row 17821 -row 17822 -row 17823 -row 17824 -row 17825 -row 17826 -row 17827 -row 17828 -row 17829 -row 17830 -row 17831 -row 17832 -row 17833 -row 17834 -row 17835 -row 17836 -row 17837 -row 17838 -row 17839 -row 17840 -row 17841 -row 17842 -row 17843 -row 17844 -row 17845 -row 17846 -row 17847 -row 17848 -row 17849 -row 17850 -row 17851 -row 17852 -row 17853 -row 17854 -row 17855 -row 17856 -row 17857 -row 17858 -row 17859 -row 17860 -row 17861 -row 17862 -row 17863 -row 17864 -row 17865 -row 17866 -row 17867 -row 17868 -row 17869 -row 17870 -row 17871 -row 17872 -row 17873 -row 17874 -row 17875 -row 17876 -row 17877 -row 17878 -row 17879 -row 17880 -row 17881 -row 17882 -row 17883 -row 17884 -row 17885 -row 17886 -row 17887 -row 17888 -row 17889 -row 17890 -row 17891 -row 17892 -row 17893 -row 17894 -row 17895 -row 17896 -row 17897 -row 17898 -row 17899 -row 17900 -row 17901 -row 17902 -row 17903 -row 17904 -row 17905 -row 17906 -row 17907 -row 17908 -row 17909 -row 17910 -row 17911 -row 17912 -row 17913 -row 17914 -row 17915 -row 17916 -row 17917 -row 17918 -row 17919 -row 17920 -row 17921 -row 17922 -row 17923 -row 17924 -row 17925 -row 17926 -row 17927 -row 17928 -row 17929 -row 17930 -row 17931 -row 17932 -row 17933 -row 17934 -row 17935 -row 17936 -row 17937 -row 17938 -row 17939 -row 17940 -row 17941 -row 17942 -row 17943 -row 17944 -row 17945 -row 17946 -row 17947 -row 17948 -row 17949 -row 17950 -row 17951 -row 17952 -row 17953 -row 17954 -row 17955 -row 17956 -row 17957 -row 17958 -row 17959 -row 17960 -row 17961 -row 17962 -row 17963 -row 17964 -row 17965 -row 17966 -row 17967 -row 17968 -row 17969 -row 17970 -row 17971 -row 17972 -row 17973 -row 17974 -row 17975 -row 17976 -row 17977 -row 17978 -row 17979 -row 17980 -row 17981 -row 17982 -row 17983 -row 17984 -row 17985 -row 17986 -row 17987 -row 17988 -row 17989 -row 17990 -row 17991 -row 17992 -row 17993 -row 17994 -row 17995 -row 17996 -row 17997 -row 17998 -row 17999 -row 18000 -row 18001 -row 18002 -row 18003 -row 18004 -row 18005 -row 18006 -row 18007 -row 18008 -row 18009 -row 18010 -row 18011 -row 18012 -row 18013 -row 18014 -row 18015 -row 18016 -row 18017 -row 18018 -row 18019 -row 18020 -row 18021 -row 18022 -row 18023 -row 18024 -row 18025 -row 18026 -row 18027 -row 18028 -row 18029 -row 18030 -row 18031 -row 18032 -row 18033 -row 18034 -row 18035 -row 18036 -row 18037 -row 18038 -row 18039 -row 18040 -row 18041 -row 18042 -row 18043 -row 18044 -row 18045 -row 18046 -row 18047 -row 18048 -row 18049 -row 18050 -row 18051 -row 18052 -row 18053 -row 18054 -row 18055 -row 18056 -row 18057 -row 18058 -row 18059 -row 18060 -row 18061 -row 18062 -row 18063 -row 18064 -row 18065 -row 18066 -row 18067 -row 18068 -row 18069 -row 18070 -row 18071 -row 18072 -row 18073 -row 18074 -row 18075 -row 18076 -row 18077 -row 18078 -row 18079 -row 18080 -row 18081 -row 18082 -row 18083 -row 18084 -row 18085 -row 18086 -row 18087 -row 18088 -row 18089 -row 18090 -row 18091 -row 18092 -row 18093 -row 18094 -row 18095 -row 18096 -row 18097 -row 18098 -row 18099 -row 18100 -row 18101 -row 18102 -row 18103 -row 18104 -row 18105 -row 18106 -row 18107 -row 18108 -row 18109 -row 18110 -row 18111 -row 18112 -row 18113 -row 18114 -row 18115 -row 18116 -row 18117 -row 18118 -row 18119 -row 18120 -row 18121 -row 18122 -row 18123 -row 18124 -row 18125 -row 18126 -row 18127 -row 18128 -row 18129 -row 18130 -row 18131 -row 18132 -row 18133 -row 18134 -row 18135 -row 18136 -row 18137 -row 18138 -row 18139 -row 18140 -row 18141 -row 18142 -row 18143 -row 18144 -row 18145 -row 18146 -row 18147 -row 18148 -row 18149 -row 18150 -row 18151 -row 18152 -row 18153 -row 18154 -row 18155 -row 18156 -row 18157 -row 18158 -row 18159 -row 18160 -row 18161 -row 18162 -row 18163 -row 18164 -row 18165 -row 18166 -row 18167 -row 18168 -row 18169 -row 18170 -row 18171 -row 18172 -row 18173 -row 18174 -row 18175 -row 18176 -row 18177 -row 18178 -row 18179 -row 18180 -row 18181 -row 18182 -row 18183 -row 18184 -row 18185 -row 18186 -row 18187 -row 18188 -row 18189 -row 18190 -row 18191 -row 18192 -row 18193 -row 18194 -row 18195 -row 18196 -row 18197 -row 18198 -row 18199 -row 18200 -row 18201 -row 18202 -row 18203 -row 18204 -row 18205 -row 18206 -row 18207 -row 18208 -row 18209 -row 18210 -row 18211 -row 18212 -row 18213 -row 18214 -row 18215 -row 18216 -row 18217 -row 18218 -row 18219 -row 18220 -row 18221 -row 18222 -row 18223 -row 18224 -row 18225 -row 18226 -row 18227 -row 18228 -row 18229 -row 18230 -row 18231 -row 18232 -row 18233 -row 18234 -row 18235 -row 18236 -row 18237 -row 18238 -row 18239 -row 18240 -row 18241 -row 18242 -row 18243 -row 18244 -row 18245 -row 18246 -row 18247 -row 18248 -row 18249 -row 18250 -row 18251 -row 18252 -row 18253 -row 18254 -row 18255 -row 18256 -row 18257 -row 18258 -row 18259 -row 18260 -row 18261 -row 18262 -row 18263 -row 18264 -row 18265 -row 18266 -row 18267 -row 18268 -row 18269 -row 18270 -row 18271 -row 18272 -row 18273 -row 18274 -row 18275 -row 18276 -row 18277 -row 18278 -row 18279 -row 18280 -row 18281 -row 18282 -row 18283 -row 18284 -row 18285 -row 18286 -row 18287 -row 18288 -row 18289 -row 18290 -row 18291 -row 18292 -row 18293 -row 18294 -row 18295 -row 18296 -row 18297 -row 18298 -row 18299 -row 18300 -row 18301 -row 18302 -row 18303 -row 18304 -row 18305 -row 18306 -row 18307 -row 18308 -row 18309 -row 18310 -row 18311 -row 18312 -row 18313 -row 18314 -row 18315 -row 18316 -row 18317 -row 18318 -row 18319 -row 18320 -row 18321 -row 18322 -row 18323 -row 18324 -row 18325 -row 18326 -row 18327 -row 18328 -row 18329 -row 18330 -row 18331 -row 18332 -row 18333 -row 18334 -row 18335 -row 18336 -row 18337 -row 18338 -row 18339 -row 18340 -row 18341 -row 18342 -row 18343 -row 18344 -row 18345 -row 18346 -row 18347 -row 18348 -row 18349 -row 18350 -row 18351 -row 18352 -row 18353 -row 18354 -row 18355 -row 18356 -row 18357 -row 18358 -row 18359 -row 18360 -row 18361 -row 18362 -row 18363 -row 18364 -row 18365 -row 18366 -row 18367 -row 18368 -row 18369 -row 18370 -row 18371 -row 18372 -row 18373 -row 18374 -row 18375 -row 18376 -row 18377 -row 18378 -row 18379 -row 18380 -row 18381 -row 18382 -row 18383 -row 18384 -row 18385 -row 18386 -row 18387 -row 18388 -row 18389 -row 18390 -row 18391 -row 18392 -row 18393 -row 18394 -row 18395 -row 18396 -row 18397 -row 18398 -row 18399 -row 18400 -row 18401 -row 18402 -row 18403 -row 18404 -row 18405 -row 18406 -row 18407 -row 18408 -row 18409 -row 18410 -row 18411 -row 18412 -row 18413 -row 18414 -row 18415 -row 18416 -row 18417 -row 18418 -row 18419 -row 18420 -row 18421 -row 18422 -row 18423 -row 18424 -row 18425 -row 18426 -row 18427 -row 18428 -row 18429 -row 18430 -row 18431 -row 18432 -row 18433 -row 18434 -row 18435 -row 18436 -row 18437 -row 18438 -row 18439 -row 18440 -row 18441 -row 18442 -row 18443 -row 18444 -row 18445 -row 18446 -row 18447 -row 18448 -row 18449 -row 18450 -row 18451 -row 18452 -row 18453 -row 18454 -row 18455 -row 18456 -row 18457 -row 18458 -row 18459 -row 18460 -row 18461 -row 18462 -row 18463 -row 18464 -row 18465 -row 18466 -row 18467 -row 18468 -row 18469 -row 18470 -row 18471 -row 18472 -row 18473 -row 18474 -row 18475 -row 18476 -row 18477 -row 18478 -row 18479 -row 18480 -row 18481 -row 18482 -row 18483 -row 18484 -row 18485 -row 18486 -row 18487 -row 18488 -row 18489 -row 18490 -row 18491 -row 18492 -row 18493 -row 18494 -row 18495 -row 18496 -row 18497 -row 18498 -row 18499 -row 18500 -row 18501 -row 18502 -row 18503 -row 18504 -row 18505 -row 18506 -row 18507 -row 18508 -row 18509 -row 18510 -row 18511 -row 18512 -row 18513 -row 18514 -row 18515 -row 18516 -row 18517 -row 18518 -row 18519 -row 18520 -row 18521 -row 18522 -row 18523 -row 18524 -row 18525 -row 18526 -row 18527 -row 18528 -row 18529 -row 18530 -row 18531 -row 18532 -row 18533 -row 18534 -row 18535 -row 18536 -row 18537 -row 18538 -row 18539 -row 18540 -row 18541 -row 18542 -row 18543 -row 18544 -row 18545 -row 18546 -row 18547 -row 18548 -row 18549 -row 18550 -row 18551 -row 18552 -row 18553 -row 18554 -row 18555 -row 18556 -row 18557 -row 18558 -row 18559 -row 18560 -row 18561 -row 18562 -row 18563 -row 18564 -row 18565 -row 18566 -row 18567 -row 18568 -row 18569 -row 18570 -row 18571 -row 18572 -row 18573 -row 18574 -row 18575 -row 18576 -row 18577 -row 18578 -row 18579 -row 18580 -row 18581 -row 18582 -row 18583 -row 18584 -row 18585 -row 18586 -row 18587 -row 18588 -row 18589 -row 18590 -row 18591 -row 18592 -row 18593 -row 18594 -row 18595 -row 18596 -row 18597 -row 18598 -row 18599 -row 18600 -row 18601 -row 18602 -row 18603 -row 18604 -row 18605 -row 18606 -row 18607 -row 18608 -row 18609 -row 18610 -row 18611 -row 18612 -row 18613 -row 18614 -row 18615 -row 18616 -row 18617 -row 18618 -row 18619 -row 18620 -row 18621 -row 18622 -row 18623 -row 18624 -row 18625 -row 18626 -row 18627 -row 18628 -row 18629 -row 18630 -row 18631 -row 18632 -row 18633 -row 18634 -row 18635 -row 18636 -row 18637 -row 18638 -row 18639 -row 18640 -row 18641 -row 18642 -row 18643 -row 18644 -row 18645 -row 18646 -row 18647 -row 18648 -row 18649 -row 18650 -row 18651 -row 18652 -row 18653 -row 18654 -row 18655 -row 18656 -row 18657 -row 18658 -row 18659 -row 18660 -row 18661 -row 18662 -row 18663 -row 18664 -row 18665 -row 18666 -row 18667 -row 18668 -row 18669 -row 18670 -row 18671 -row 18672 -row 18673 -row 18674 -row 18675 -row 18676 -row 18677 -row 18678 -row 18679 -row 18680 -row 18681 -row 18682 -row 18683 -row 18684 -row 18685 -row 18686 -row 18687 -row 18688 -row 18689 -row 18690 -row 18691 -row 18692 -row 18693 -row 18694 -row 18695 -row 18696 -row 18697 -row 18698 -row 18699 -row 18700 -row 18701 -row 18702 -row 18703 -row 18704 -row 18705 -row 18706 -row 18707 -row 18708 -row 18709 -row 18710 -row 18711 -row 18712 -row 18713 -row 18714 -row 18715 -row 18716 -row 18717 -row 18718 -row 18719 -row 18720 -row 18721 -row 18722 -row 18723 -row 18724 -row 18725 -row 18726 -row 18727 -row 18728 -row 18729 -row 18730 -row 18731 -row 18732 -row 18733 -row 18734 -row 18735 -row 18736 -row 18737 -row 18738 -row 18739 -row 18740 -row 18741 -row 18742 -row 18743 -row 18744 -row 18745 -row 18746 -row 18747 -row 18748 -row 18749 -row 18750 -row 18751 -row 18752 -row 18753 -row 18754 -row 18755 -row 18756 -row 18757 -row 18758 -row 18759 -row 18760 -row 18761 -row 18762 -row 18763 -row 18764 -row 18765 -row 18766 -row 18767 -row 18768 -row 18769 -row 18770 -row 18771 -row 18772 -row 18773 -row 18774 -row 18775 -row 18776 -row 18777 -row 18778 -row 18779 -row 18780 -row 18781 -row 18782 -row 18783 -row 18784 -row 18785 -row 18786 -row 18787 -row 18788 -row 18789 -row 18790 -row 18791 -row 18792 -row 18793 -row 18794 -row 18795 -row 18796 -row 18797 -row 18798 -row 18799 -row 18800 -row 18801 -row 18802 -row 18803 -row 18804 -row 18805 -row 18806 -row 18807 -row 18808 -row 18809 -row 18810 -row 18811 -row 18812 -row 18813 -row 18814 -row 18815 -row 18816 -row 18817 -row 18818 -row 18819 -row 18820 -row 18821 -row 18822 -row 18823 -row 18824 -row 18825 -row 18826 -row 18827 -row 18828 -row 18829 -row 18830 -row 18831 -row 18832 -row 18833 -row 18834 -row 18835 -row 18836 -row 18837 -row 18838 -row 18839 -row 18840 -row 18841 -row 18842 -row 18843 -row 18844 -row 18845 -row 18846 -row 18847 -row 18848 -row 18849 -row 18850 -row 18851 -row 18852 -row 18853 -row 18854 -row 18855 -row 18856 -row 18857 -row 18858 -row 18859 -row 18860 -row 18861 -row 18862 -row 18863 -row 18864 -row 18865 -row 18866 -row 18867 -row 18868 -row 18869 -row 18870 -row 18871 -row 18872 -row 18873 -row 18874 -row 18875 -row 18876 -row 18877 -row 18878 -row 18879 -row 18880 -row 18881 -row 18882 -row 18883 -row 18884 -row 18885 -row 18886 -row 18887 -row 18888 -row 18889 -row 18890 -row 18891 -row 18892 -row 18893 -row 18894 -row 18895 -row 18896 -row 18897 -row 18898 -row 18899 -row 18900 -row 18901 -row 18902 -row 18903 -row 18904 -row 18905 -row 18906 -row 18907 -row 18908 -row 18909 -row 18910 -row 18911 -row 18912 -row 18913 -row 18914 -row 18915 -row 18916 -row 18917 -row 18918 -row 18919 -row 18920 -row 18921 -row 18922 -row 18923 -row 18924 -row 18925 -row 18926 -row 18927 -row 18928 -row 18929 -row 18930 -row 18931 -row 18932 -row 18933 -row 18934 -row 18935 -row 18936 -row 18937 -row 18938 -row 18939 -row 18940 -row 18941 -row 18942 -row 18943 -row 18944 -row 18945 -row 18946 -row 18947 -row 18948 -row 18949 -row 18950 -row 18951 -row 18952 -row 18953 -row 18954 -row 18955 -row 18956 -row 18957 -row 18958 -row 18959 -row 18960 -row 18961 -row 18962 -row 18963 -row 18964 -row 18965 -row 18966 -row 18967 -row 18968 -row 18969 -row 18970 -row 18971 -row 18972 -row 18973 -row 18974 -row 18975 -row 18976 -row 18977 -row 18978 -row 18979 -row 18980 -row 18981 -row 18982 -row 18983 -row 18984 -row 18985 -row 18986 -row 18987 -row 18988 -row 18989 -row 18990 -row 18991 -row 18992 -row 18993 -row 18994 -row 18995 -row 18996 -row 18997 -row 18998 -row 18999 -row 19000 -row 19001 -row 19002 -row 19003 -row 19004 -row 19005 -row 19006 -row 19007 -row 19008 -row 19009 -row 19010 -row 19011 -row 19012 -row 19013 -row 19014 -row 19015 -row 19016 -row 19017 -row 19018 -row 19019 -row 19020 -row 19021 -row 19022 -row 19023 -row 19024 -row 19025 -row 19026 -row 19027 -row 19028 -row 19029 -row 19030 -row 19031 -row 19032 -row 19033 -row 19034 -row 19035 -row 19036 -row 19037 -row 19038 -row 19039 -row 19040 -row 19041 -row 19042 -row 19043 -row 19044 -row 19045 -row 19046 -row 19047 -row 19048 -row 19049 -row 19050 -row 19051 -row 19052 -row 19053 -row 19054 -row 19055 -row 19056 -row 19057 -row 19058 -row 19059 -row 19060 -row 19061 -row 19062 -row 19063 -row 19064 -row 19065 -row 19066 -row 19067 -row 19068 -row 19069 -row 19070 -row 19071 -row 19072 -row 19073 -row 19074 -row 19075 -row 19076 -row 19077 -row 19078 -row 19079 -row 19080 -row 19081 -row 19082 -row 19083 -row 19084 -row 19085 -row 19086 -row 19087 -row 19088 -row 19089 -row 19090 -row 19091 -row 19092 -row 19093 -row 19094 -row 19095 -row 19096 -row 19097 -row 19098 -row 19099 -row 19100 -row 19101 -row 19102 -row 19103 -row 19104 -row 19105 -row 19106 -row 19107 -row 19108 -row 19109 -row 19110 -row 19111 -row 19112 -row 19113 -row 19114 -row 19115 -row 19116 -row 19117 -row 19118 -row 19119 -row 19120 -row 19121 -row 19122 -row 19123 -row 19124 -row 19125 -row 19126 -row 19127 -row 19128 -row 19129 -row 19130 -row 19131 -row 19132 -row 19133 -row 19134 -row 19135 -row 19136 -row 19137 -row 19138 -row 19139 -row 19140 -row 19141 -row 19142 -row 19143 -row 19144 -row 19145 -row 19146 -row 19147 -row 19148 -row 19149 -row 19150 -row 19151 -row 19152 -row 19153 -row 19154 -row 19155 -row 19156 -row 19157 -row 19158 -row 19159 -row 19160 -row 19161 -row 19162 -row 19163 -row 19164 -row 19165 -row 19166 -row 19167 -row 19168 -row 19169 -row 19170 -row 19171 -row 19172 -row 19173 -row 19174 -row 19175 -row 19176 -row 19177 -row 19178 -row 19179 -row 19180 -row 19181 -row 19182 -row 19183 -row 19184 -row 19185 -row 19186 -row 19187 -row 19188 -row 19189 -row 19190 -row 19191 -row 19192 -row 19193 -row 19194 -row 19195 -row 19196 -row 19197 -row 19198 -row 19199 -row 19200 -row 19201 -row 19202 -row 19203 -row 19204 -row 19205 -row 19206 -row 19207 -row 19208 -row 19209 -row 19210 -row 19211 -row 19212 -row 19213 -row 19214 -row 19215 -row 19216 -row 19217 -row 19218 -row 19219 -row 19220 -row 19221 -row 19222 -row 19223 -row 19224 -row 19225 -row 19226 -row 19227 -row 19228 -row 19229 -row 19230 -row 19231 -row 19232 -row 19233 -row 19234 -row 19235 -row 19236 -row 19237 -row 19238 -row 19239 -row 19240 -row 19241 -row 19242 -row 19243 -row 19244 -row 19245 -row 19246 -row 19247 -row 19248 -row 19249 -row 19250 -row 19251 -row 19252 -row 19253 -row 19254 -row 19255 -row 19256 -row 19257 -row 19258 -row 19259 -row 19260 -row 19261 -row 19262 -row 19263 -row 19264 -row 19265 -row 19266 -row 19267 -row 19268 -row 19269 -row 19270 -row 19271 -row 19272 -row 19273 -row 19274 -row 19275 -row 19276 -row 19277 -row 19278 -row 19279 -row 19280 -row 19281 -row 19282 -row 19283 -row 19284 -row 19285 -row 19286 -row 19287 -row 19288 -row 19289 -row 19290 -row 19291 -row 19292 -row 19293 -row 19294 -row 19295 -row 19296 -row 19297 -row 19298 -row 19299 -row 19300 -row 19301 -row 19302 -row 19303 -row 19304 -row 19305 -row 19306 -row 19307 -row 19308 -row 19309 -row 19310 -row 19311 -row 19312 -row 19313 -row 19314 -row 19315 -row 19316 -row 19317 -row 19318 -row 19319 -row 19320 -row 19321 -row 19322 -row 19323 -row 19324 -row 19325 -row 19326 -row 19327 -row 19328 -row 19329 -row 19330 -row 19331 -row 19332 -row 19333 -row 19334 -row 19335 -row 19336 -row 19337 -row 19338 -row 19339 -row 19340 -row 19341 -row 19342 -row 19343 -row 19344 -row 19345 -row 19346 -row 19347 -row 19348 -row 19349 -row 19350 -row 19351 -row 19352 -row 19353 -row 19354 -row 19355 -row 19356 -row 19357 -row 19358 -row 19359 -row 19360 -row 19361 -row 19362 -row 19363 -row 19364 -row 19365 -row 19366 -row 19367 -row 19368 -row 19369 -row 19370 -row 19371 -row 19372 -row 19373 -row 19374 -row 19375 -row 19376 -row 19377 -row 19378 -row 19379 -row 19380 -row 19381 -row 19382 -row 19383 -row 19384 -row 19385 -row 19386 -row 19387 -row 19388 -row 19389 -row 19390 -row 19391 -row 19392 -row 19393 -row 19394 -row 19395 -row 19396 -row 19397 -row 19398 -row 19399 -row 19400 -row 19401 -row 19402 -row 19403 -row 19404 -row 19405 -row 19406 -row 19407 -row 19408 -row 19409 -row 19410 -row 19411 -row 19412 -row 19413 -row 19414 -row 19415 -row 19416 -row 19417 -row 19418 -row 19419 -row 19420 -row 19421 -row 19422 -row 19423 -row 19424 -row 19425 -row 19426 -row 19427 -row 19428 -row 19429 -row 19430 -row 19431 -row 19432 -row 19433 -row 19434 -row 19435 -row 19436 -row 19437 -row 19438 -row 19439 -row 19440 -row 19441 -row 19442 -row 19443 -row 19444 -row 19445 -row 19446 -row 19447 -row 19448 -row 19449 -row 19450 -row 19451 -row 19452 -row 19453 -row 19454 -row 19455 -row 19456 -row 19457 -row 19458 -row 19459 -row 19460 -row 19461 -row 19462 -row 19463 -row 19464 -row 19465 -row 19466 -row 19467 -row 19468 -row 19469 -row 19470 -row 19471 -row 19472 -row 19473 -row 19474 -row 19475 -row 19476 -row 19477 -row 19478 -row 19479 -row 19480 -row 19481 -row 19482 -row 19483 -row 19484 -row 19485 -row 19486 -row 19487 -row 19488 -row 19489 -row 19490 -row 19491 -row 19492 -row 19493 -row 19494 -row 19495 -row 19496 -row 19497 -row 19498 -row 19499 -row 19500 -row 19501 -row 19502 -row 19503 -row 19504 -row 19505 -row 19506 -row 19507 -row 19508 -row 19509 -row 19510 -row 19511 -row 19512 -row 19513 -row 19514 -row 19515 -row 19516 -row 19517 -row 19518 -row 19519 -row 19520 -row 19521 -row 19522 -row 19523 -row 19524 -row 19525 -row 19526 -row 19527 -row 19528 -row 19529 -row 19530 -row 19531 -row 19532 -row 19533 -row 19534 -row 19535 -row 19536 -row 19537 -row 19538 -row 19539 -row 19540 -row 19541 -row 19542 -row 19543 -row 19544 -row 19545 -row 19546 -row 19547 -row 19548 -row 19549 -row 19550 -row 19551 -row 19552 -row 19553 -row 19554 -row 19555 -row 19556 -row 19557 -row 19558 -row 19559 -row 19560 -row 19561 -row 19562 -row 19563 -row 19564 -row 19565 -row 19566 -row 19567 -row 19568 -row 19569 -row 19570 -row 19571 -row 19572 -row 19573 -row 19574 -row 19575 -row 19576 -row 19577 -row 19578 -row 19579 -row 19580 -row 19581 -row 19582 -row 19583 -row 19584 -row 19585 -row 19586 -row 19587 -row 19588 -row 19589 -row 19590 -row 19591 -row 19592 -row 19593 -row 19594 -row 19595 -row 19596 -row 19597 -row 19598 -row 19599 -row 19600 -row 19601 -row 19602 -row 19603 -row 19604 -row 19605 -row 19606 -row 19607 -row 19608 -row 19609 -row 19610 -row 19611 -row 19612 -row 19613 -row 19614 -row 19615 -row 19616 -row 19617 -row 19618 -row 19619 -row 19620 -row 19621 -row 19622 -row 19623 -row 19624 -row 19625 -row 19626 -row 19627 -row 19628 -row 19629 -row 19630 -row 19631 -row 19632 -row 19633 -row 19634 -row 19635 -row 19636 -row 19637 -row 19638 -row 19639 -row 19640 -row 19641 -row 19642 -row 19643 -row 19644 -row 19645 -row 19646 -row 19647 -row 19648 -row 19649 -row 19650 -row 19651 -row 19652 -row 19653 -row 19654 -row 19655 -row 19656 -row 19657 -row 19658 -row 19659 -row 19660 -row 19661 -row 19662 -row 19663 -row 19664 -row 19665 -row 19666 -row 19667 -row 19668 -row 19669 -row 19670 -row 19671 -row 19672 -row 19673 -row 19674 -row 19675 -row 19676 -row 19677 -row 19678 -row 19679 -row 19680 -row 19681 -row 19682 -row 19683 -row 19684 -row 19685 -row 19686 -row 19687 -row 19688 -row 19689 -row 19690 -row 19691 -row 19692 -row 19693 -row 19694 -row 19695 -row 19696 -row 19697 -row 19698 -row 19699 -row 19700 -row 19701 -row 19702 -row 19703 -row 19704 -row 19705 -row 19706 -row 19707 -row 19708 -row 19709 -row 19710 -row 19711 -row 19712 -row 19713 -row 19714 -row 19715 -row 19716 -row 19717 -row 19718 -row 19719 -row 19720 -row 19721 -row 19722 -row 19723 -row 19724 -row 19725 -row 19726 -row 19727 -row 19728 -row 19729 -row 19730 -row 19731 -row 19732 -row 19733 -row 19734 -row 19735 -row 19736 -row 19737 -row 19738 -row 19739 -row 19740 -row 19741 -row 19742 -row 19743 -row 19744 -row 19745 -row 19746 -row 19747 -row 19748 -row 19749 -row 19750 -row 19751 -row 19752 -row 19753 -row 19754 -row 19755 -row 19756 -row 19757 -row 19758 -row 19759 -row 19760 -row 19761 -row 19762 -row 19763 -row 19764 -row 19765 -row 19766 -row 19767 -row 19768 -row 19769 -row 19770 -row 19771 -row 19772 -row 19773 -row 19774 -row 19775 -row 19776 -row 19777 -row 19778 -row 19779 -row 19780 -row 19781 -row 19782 -row 19783 -row 19784 -row 19785 -row 19786 -row 19787 -row 19788 -row 19789 -row 19790 -row 19791 -row 19792 -row 19793 -row 19794 -row 19795 -row 19796 -row 19797 -row 19798 -row 19799 -row 19800 -row 19801 -row 19802 -row 19803 -row 19804 -row 19805 -row 19806 -row 19807 -row 19808 -row 19809 -row 19810 -row 19811 -row 19812 -row 19813 -row 19814 -row 19815 -row 19816 -row 19817 -row 19818 -row 19819 -row 19820 -row 19821 -row 19822 -row 19823 -row 19824 -row 19825 -row 19826 -row 19827 -row 19828 -row 19829 -row 19830 -row 19831 -row 19832 -row 19833 -row 19834 -row 19835 -row 19836 -row 19837 -row 19838 -row 19839 -row 19840 -row 19841 -row 19842 -row 19843 -row 19844 -row 19845 -row 19846 -row 19847 -row 19848 -row 19849 -row 19850 -row 19851 -row 19852 -row 19853 -row 19854 -row 19855 -row 19856 -row 19857 -row 19858 -row 19859 -row 19860 -row 19861 -row 19862 -row 19863 -row 19864 -row 19865 -row 19866 -row 19867 -row 19868 -row 19869 -row 19870 -row 19871 -row 19872 -row 19873 -row 19874 -row 19875 -row 19876 -row 19877 -row 19878 -row 19879 -row 19880 -row 19881 -row 19882 -row 19883 -row 19884 -row 19885 -row 19886 -row 19887 -row 19888 -row 19889 -row 19890 -row 19891 -row 19892 -row 19893 -row 19894 -row 19895 -row 19896 -row 19897 -row 19898 -row 19899 -row 19900 -row 19901 -row 19902 -row 19903 -row 19904 -row 19905 -row 19906 -row 19907 -row 19908 -row 19909 -row 19910 -row 19911 -row 19912 -row 19913 -row 19914 -row 19915 -row 19916 -row 19917 -row 19918 -row 19919 -row 19920 -row 19921 -row 19922 -row 19923 -row 19924 -row 19925 -row 19926 -row 19927 -row 19928 -row 19929 -row 19930 -row 19931 -row 19932 -row 19933 -row 19934 -row 19935 -row 19936 -row 19937 -row 19938 -row 19939 -row 19940 -row 19941 -row 19942 -row 19943 -row 19944 -row 19945 -row 19946 -row 19947 -row 19948 -row 19949 -row 19950 -row 19951 -row 19952 -row 19953 -row 19954 -row 19955 -row 19956 -row 19957 -row 19958 -row 19959 -row 19960 -row 19961 -row 19962 -row 19963 -row 19964 -row 19965 -row 19966 -row 19967 -row 19968 -row 19969 -row 19970 -row 19971 -row 19972 -row 19973 -row 19974 -row 19975 -row 19976 -row 19977 -row 19978 -row 19979 -row 19980 -row 19981 -row 19982 -row 19983 -row 19984 -row 19985 -row 19986 -row 19987 -row 19988 -row 19989 -row 19990 -row 19991 -row 19992 -row 19993 -row 19994 -row 19995 -row 19996 -row 19997 -row 19998 -row 19999 -row 20000 -row 20001 -row 20002 -row 20003 -row 20004 -row 20005 -row 20006 -row 20007 -row 20008 -row 20009 -row 20010 -row 20011 -row 20012 -row 20013 -row 20014 -row 20015 -row 20016 -row 20017 -row 20018 -row 20019 -row 20020 -row 20021 -row 20022 -row 20023 -row 20024 -row 20025 -row 20026 -row 20027 -row 20028 -row 20029 -row 20030 -row 20031 -row 20032 -row 20033 -row 20034 -row 20035 -row 20036 -row 20037 -row 20038 -row 20039 -row 20040 -row 20041 -row 20042 -row 20043 -row 20044 -row 20045 -row 20046 -row 20047 -row 20048 -row 20049 -row 20050 -row 20051 -row 20052 -row 20053 -row 20054 -row 20055 -row 20056 -row 20057 -row 20058 -row 20059 -row 20060 -row 20061 -row 20062 -row 20063 -row 20064 -row 20065 -row 20066 -row 20067 -row 20068 -row 20069 -row 20070 -row 20071 -row 20072 -row 20073 -row 20074 -row 20075 -row 20076 -row 20077 -row 20078 -row 20079 -row 20080 -row 20081 -row 20082 -row 20083 -row 20084 -row 20085 -row 20086 -row 20087 -row 20088 -row 20089 -row 20090 -row 20091 -row 20092 -row 20093 -row 20094 -row 20095 -row 20096 -row 20097 -row 20098 -row 20099 -row 20100 -row 20101 -row 20102 -row 20103 -row 20104 -row 20105 -row 20106 -row 20107 -row 20108 -row 20109 -row 20110 -row 20111 -row 20112 -row 20113 -row 20114 -row 20115 -row 20116 -row 20117 -row 20118 -row 20119 -row 20120 -row 20121 -row 20122 -row 20123 -row 20124 -row 20125 -row 20126 -row 20127 -row 20128 -row 20129 -row 20130 -row 20131 -row 20132 -row 20133 -row 20134 -row 20135 -row 20136 -row 20137 -row 20138 -row 20139 -row 20140 -row 20141 -row 20142 -row 20143 -row 20144 -row 20145 -row 20146 -row 20147 -row 20148 -row 20149 -row 20150 -row 20151 -row 20152 -row 20153 -row 20154 -row 20155 -row 20156 -row 20157 -row 20158 -row 20159 -row 20160 -row 20161 -row 20162 -row 20163 -row 20164 -row 20165 -row 20166 -row 20167 -row 20168 -row 20169 -row 20170 -row 20171 -row 20172 -row 20173 -row 20174 -row 20175 -row 20176 -row 20177 -row 20178 -row 20179 -row 20180 -row 20181 -row 20182 -row 20183 -row 20184 -row 20185 -row 20186 -row 20187 -row 20188 -row 20189 -row 20190 -row 20191 -row 20192 -row 20193 -row 20194 -row 20195 -row 20196 -row 20197 -row 20198 -row 20199 -row 20200 -row 20201 -row 20202 -row 20203 -row 20204 -row 20205 -row 20206 -row 20207 -row 20208 -row 20209 -row 20210 -row 20211 -row 20212 -row 20213 -row 20214 -row 20215 -row 20216 -row 20217 -row 20218 -row 20219 -row 20220 -row 20221 -row 20222 -row 20223 -row 20224 -row 20225 -row 20226 -row 20227 -row 20228 -row 20229 -row 20230 -row 20231 -row 20232 -row 20233 -row 20234 -row 20235 -row 20236 -row 20237 -row 20238 -row 20239 -row 20240 -row 20241 -row 20242 -row 20243 -row 20244 -row 20245 -row 20246 -row 20247 -row 20248 -row 20249 -row 20250 -row 20251 -row 20252 -row 20253 -row 20254 -row 20255 -row 20256 -row 20257 -row 20258 -row 20259 -row 20260 -row 20261 -row 20262 -row 20263 -row 20264 -row 20265 -row 20266 -row 20267 -row 20268 -row 20269 -row 20270 -row 20271 -row 20272 -row 20273 -row 20274 -row 20275 -row 20276 -row 20277 -row 20278 -row 20279 -row 20280 -row 20281 -row 20282 -row 20283 -row 20284 -row 20285 -row 20286 -row 20287 -row 20288 -row 20289 -row 20290 -row 20291 -row 20292 -row 20293 -row 20294 -row 20295 -row 20296 -row 20297 -row 20298 -row 20299 -row 20300 -row 20301 -row 20302 -row 20303 -row 20304 -row 20305 -row 20306 -row 20307 -row 20308 -row 20309 -row 20310 -row 20311 -row 20312 -row 20313 -row 20314 -row 20315 -row 20316 -row 20317 -row 20318 -row 20319 -row 20320 -row 20321 -row 20322 -row 20323 -row 20324 -row 20325 -row 20326 -row 20327 -row 20328 -row 20329 -row 20330 -row 20331 -row 20332 -row 20333 -row 20334 -row 20335 -row 20336 -row 20337 -row 20338 -row 20339 -row 20340 -row 20341 -row 20342 -row 20343 -row 20344 -row 20345 -row 20346 -row 20347 -row 20348 -row 20349 -row 20350 -row 20351 -row 20352 -row 20353 -row 20354 -row 20355 -row 20356 -row 20357 -row 20358 -row 20359 -row 20360 -row 20361 -row 20362 -row 20363 -row 20364 -row 20365 -row 20366 -row 20367 -row 20368 -row 20369 -row 20370 -row 20371 -row 20372 -row 20373 -row 20374 -row 20375 -row 20376 -row 20377 -row 20378 -row 20379 -row 20380 -row 20381 -row 20382 -row 20383 -row 20384 -row 20385 -row 20386 -row 20387 -row 20388 -row 20389 -row 20390 -row 20391 -row 20392 -row 20393 -row 20394 -row 20395 -row 20396 -row 20397 -row 20398 -row 20399 -row 20400 -row 20401 -row 20402 -row 20403 -row 20404 -row 20405 -row 20406 -row 20407 -row 20408 -row 20409 -row 20410 -row 20411 -row 20412 -row 20413 -row 20414 -row 20415 -row 20416 -row 20417 -row 20418 -row 20419 -row 20420 -row 20421 -row 20422 -row 20423 -row 20424 -row 20425 -row 20426 -row 20427 -row 20428 -row 20429 -row 20430 -row 20431 -row 20432 -row 20433 -row 20434 -row 20435 -row 20436 -row 20437 -row 20438 -row 20439 -row 20440 -row 20441 -row 20442 -row 20443 -row 20444 -row 20445 -row 20446 -row 20447 -row 20448 -row 20449 -row 20450 -row 20451 -row 20452 -row 20453 -row 20454 -row 20455 -row 20456 -row 20457 -row 20458 -row 20459 -row 20460 -row 20461 -row 20462 -row 20463 -row 20464 -row 20465 -row 20466 -row 20467 -row 20468 -row 20469 -row 20470 -row 20471 -row 20472 -row 20473 -row 20474 -row 20475 -row 20476 -row 20477 -row 20478 -row 20479 -row 20480 -row 20481 -row 20482 -row 20483 -row 20484 -row 20485 -row 20486 -row 20487 -row 20488 -row 20489 -row 20490 -row 20491 -row 20492 -row 20493 -row 20494 -row 20495 -row 20496 -row 20497 -row 20498 -row 20499 -row 20500 -row 20501 -row 20502 -row 20503 -row 20504 -row 20505 -row 20506 -row 20507 -row 20508 -row 20509 -row 20510 -row 20511 -row 20512 -row 20513 -row 20514 -row 20515 -row 20516 -row 20517 -row 20518 -row 20519 -row 20520 -row 20521 -row 20522 -row 20523 -row 20524 -row 20525 -row 20526 -row 20527 -row 20528 -row 20529 -row 20530 -row 20531 -row 20532 -row 20533 -row 20534 -row 20535 -row 20536 -row 20537 -row 20538 -row 20539 -row 20540 -row 20541 -row 20542 -row 20543 -row 20544 -row 20545 -row 20546 -row 20547 -row 20548 -row 20549 -row 20550 -row 20551 -row 20552 -row 20553 -row 20554 -row 20555 -row 20556 -row 20557 -row 20558 -row 20559 -row 20560 -row 20561 -row 20562 -row 20563 -row 20564 -row 20565 -row 20566 -row 20567 -row 20568 -row 20569 -row 20570 -row 20571 -row 20572 -row 20573 -row 20574 -row 20575 -row 20576 -row 20577 -row 20578 -row 20579 -row 20580 -row 20581 -row 20582 -row 20583 -row 20584 -row 20585 -row 20586 -row 20587 -row 20588 -row 20589 -row 20590 -row 20591 -row 20592 -row 20593 -row 20594 -row 20595 -row 20596 -row 20597 -row 20598 -row 20599 -row 20600 -row 20601 -row 20602 -row 20603 -row 20604 -row 20605 -row 20606 -row 20607 -row 20608 -row 20609 -row 20610 -row 20611 -row 20612 -row 20613 -row 20614 -row 20615 -row 20616 -row 20617 -row 20618 -row 20619 -row 20620 -row 20621 -row 20622 -row 20623 -row 20624 -row 20625 -row 20626 -row 20627 -row 20628 -row 20629 -row 20630 -row 20631 -row 20632 -row 20633 -row 20634 -row 20635 -row 20636 -row 20637 -row 20638 -row 20639 -row 20640 -row 20641 -row 20642 -row 20643 -row 20644 -row 20645 -row 20646 -row 20647 -row 20648 -row 20649 -row 20650 -row 20651 -row 20652 -row 20653 -row 20654 -row 20655 -row 20656 -row 20657 -row 20658 -row 20659 -row 20660 -row 20661 -row 20662 -row 20663 -row 20664 -row 20665 -row 20666 -row 20667 -row 20668 -row 20669 -row 20670 -row 20671 -row 20672 -row 20673 -row 20674 -row 20675 -row 20676 -row 20677 -row 20678 -row 20679 -row 20680 -row 20681 -row 20682 -row 20683 -row 20684 -row 20685 -row 20686 -row 20687 -row 20688 -row 20689 -row 20690 -row 20691 -row 20692 -row 20693 -row 20694 -row 20695 -row 20696 -row 20697 -row 20698 -row 20699 -row 20700 -row 20701 -row 20702 -row 20703 -row 20704 -row 20705 -row 20706 -row 20707 -row 20708 -row 20709 -row 20710 -row 20711 -row 20712 -row 20713 -row 20714 -row 20715 -row 20716 -row 20717 -row 20718 -row 20719 -row 20720 -row 20721 -row 20722 -row 20723 -row 20724 -row 20725 -row 20726 -row 20727 -row 20728 -row 20729 -row 20730 -row 20731 -row 20732 -row 20733 -row 20734 -row 20735 -row 20736 -row 20737 -row 20738 -row 20739 -row 20740 -row 20741 -row 20742 -row 20743 -row 20744 -row 20745 -row 20746 -row 20747 -row 20748 -row 20749 -row 20750 -row 20751 -row 20752 -row 20753 -row 20754 -row 20755 -row 20756 -row 20757 -row 20758 -row 20759 -row 20760 -row 20761 -row 20762 -row 20763 -row 20764 -row 20765 -row 20766 -row 20767 -row 20768 -row 20769 -row 20770 -row 20771 -row 20772 -row 20773 -row 20774 -row 20775 -row 20776 -row 20777 -row 20778 -row 20779 -row 20780 -row 20781 -row 20782 -row 20783 -row 20784 -row 20785 -row 20786 -row 20787 -row 20788 -row 20789 -row 20790 -row 20791 -row 20792 -row 20793 -row 20794 -row 20795 -row 20796 -row 20797 -row 20798 -row 20799 -row 20800 -row 20801 -row 20802 -row 20803 -row 20804 -row 20805 -row 20806 -row 20807 -row 20808 -row 20809 -row 20810 -row 20811 -row 20812 -row 20813 -row 20814 -row 20815 -row 20816 -row 20817 -row 20818 -row 20819 -row 20820 -row 20821 -row 20822 -row 20823 -row 20824 -row 20825 -row 20826 -row 20827 -row 20828 -row 20829 -row 20830 -row 20831 -row 20832 -row 20833 -row 20834 -row 20835 -row 20836 -row 20837 -row 20838 -row 20839 -row 20840 -row 20841 -row 20842 -row 20843 -row 20844 -row 20845 -row 20846 -row 20847 -row 20848 -row 20849 -row 20850 -row 20851 -row 20852 -row 20853 -row 20854 -row 20855 -row 20856 -row 20857 -row 20858 -row 20859 -row 20860 -row 20861 -row 20862 -row 20863 -row 20864 -row 20865 -row 20866 -row 20867 -row 20868 -row 20869 -row 20870 -row 20871 -row 20872 -row 20873 -row 20874 -row 20875 -row 20876 -row 20877 -row 20878 -row 20879 -row 20880 -row 20881 -row 20882 -row 20883 -row 20884 -row 20885 -row 20886 -row 20887 -row 20888 -row 20889 -row 20890 -row 20891 -row 20892 -row 20893 -row 20894 -row 20895 -row 20896 -row 20897 -row 20898 -row 20899 -row 20900 -row 20901 -row 20902 -row 20903 -row 20904 -row 20905 -row 20906 -row 20907 -row 20908 -row 20909 -row 20910 -row 20911 -row 20912 -row 20913 -row 20914 -row 20915 -row 20916 -row 20917 -row 20918 -row 20919 -row 20920 -row 20921 -row 20922 -row 20923 -row 20924 -row 20925 -row 20926 -row 20927 -row 20928 -row 20929 -row 20930 -row 20931 -row 20932 -row 20933 -row 20934 -row 20935 -row 20936 -row 20937 -row 20938 -row 20939 -row 20940 -row 20941 -row 20942 -row 20943 -row 20944 -row 20945 -row 20946 -row 20947 -row 20948 -row 20949 -row 20950 -row 20951 -row 20952 -row 20953 -row 20954 -row 20955 -row 20956 -row 20957 -row 20958 -row 20959 -row 20960 -row 20961 -row 20962 -row 20963 -row 20964 -row 20965 -row 20966 -row 20967 -row 20968 -row 20969 -row 20970 -row 20971 -row 20972 -row 20973 -row 20974 -row 20975 -row 20976 -row 20977 -row 20978 -row 20979 -row 20980 -row 20981 -row 20982 -row 20983 -row 20984 -row 20985 -row 20986 -row 20987 -row 20988 -row 20989 -row 20990 -row 20991 -row 20992 -row 20993 -row 20994 -row 20995 -row 20996 -row 20997 -row 20998 -row 20999 -row 21000 -row 21001 -row 21002 -row 21003 -row 21004 -row 21005 -row 21006 -row 21007 -row 21008 -row 21009 -row 21010 -row 21011 -row 21012 -row 21013 -row 21014 -row 21015 -row 21016 -row 21017 -row 21018 -row 21019 -row 21020 -row 21021 -row 21022 -row 21023 -row 21024 -row 21025 -row 21026 -row 21027 -row 21028 -row 21029 -row 21030 -row 21031 -row 21032 -row 21033 -row 21034 -row 21035 -row 21036 -row 21037 -row 21038 -row 21039 -row 21040 -row 21041 -row 21042 -row 21043 -row 21044 -row 21045 -row 21046 -row 21047 -row 21048 -row 21049 -row 21050 -row 21051 -row 21052 -row 21053 -row 21054 -row 21055 -row 21056 -row 21057 -row 21058 -row 21059 -row 21060 -row 21061 -row 21062 -row 21063 -row 21064 -row 21065 -row 21066 -row 21067 -row 21068 -row 21069 -row 21070 -row 21071 -row 21072 -row 21073 -row 21074 -row 21075 -row 21076 -row 21077 -row 21078 -row 21079 -row 21080 -row 21081 -row 21082 -row 21083 -row 21084 -row 21085 -row 21086 -row 21087 -row 21088 -row 21089 -row 21090 -row 21091 -row 21092 -row 21093 -row 21094 -row 21095 -row 21096 -row 21097 -row 21098 -row 21099 -row 21100 -row 21101 -row 21102 -row 21103 -row 21104 -row 21105 -row 21106 -row 21107 -row 21108 -row 21109 -row 21110 -row 21111 -row 21112 -row 21113 -row 21114 -row 21115 -row 21116 -row 21117 -row 21118 -row 21119 -row 21120 -row 21121 -row 21122 -row 21123 -row 21124 -row 21125 -row 21126 -row 21127 -row 21128 -row 21129 -row 21130 -row 21131 -row 21132 -row 21133 -row 21134 -row 21135 -row 21136 -row 21137 -row 21138 -row 21139 -row 21140 -row 21141 -row 21142 -row 21143 -row 21144 -row 21145 -row 21146 -row 21147 -row 21148 -row 21149 -row 21150 -row 21151 -row 21152 -row 21153 -row 21154 -row 21155 -row 21156 -row 21157 -row 21158 -row 21159 -row 21160 -row 21161 -row 21162 -row 21163 -row 21164 -row 21165 -row 21166 -row 21167 -row 21168 -row 21169 -row 21170 -row 21171 -row 21172 -row 21173 -row 21174 -row 21175 -row 21176 -row 21177 -row 21178 -row 21179 -row 21180 -row 21181 -row 21182 -row 21183 -row 21184 -row 21185 -row 21186 -row 21187 -row 21188 -row 21189 -row 21190 -row 21191 -row 21192 -row 21193 -row 21194 -row 21195 -row 21196 -row 21197 -row 21198 -row 21199 -row 21200 -row 21201 -row 21202 -row 21203 -row 21204 -row 21205 -row 21206 -row 21207 -row 21208 -row 21209 -row 21210 -row 21211 -row 21212 -row 21213 -row 21214 -row 21215 -row 21216 -row 21217 -row 21218 -row 21219 -row 21220 -row 21221 -row 21222 -row 21223 -row 21224 -row 21225 -row 21226 -row 21227 -row 21228 -row 21229 -row 21230 -row 21231 -row 21232 -row 21233 -row 21234 -row 21235 -row 21236 -row 21237 -row 21238 -row 21239 -row 21240 -row 21241 -row 21242 -row 21243 -row 21244 -row 21245 -row 21246 -row 21247 -row 21248 -row 21249 -row 21250 -row 21251 -row 21252 -row 21253 -row 21254 -row 21255 -row 21256 -row 21257 -row 21258 -row 21259 -row 21260 -row 21261 -row 21262 -row 21263 -row 21264 -row 21265 -row 21266 -row 21267 -row 21268 -row 21269 -row 21270 -row 21271 -row 21272 -row 21273 -row 21274 -row 21275 -row 21276 -row 21277 -row 21278 -row 21279 -row 21280 -row 21281 -row 21282 -row 21283 -row 21284 -row 21285 -row 21286 -row 21287 -row 21288 -row 21289 -row 21290 -row 21291 -row 21292 -row 21293 -row 21294 -row 21295 -row 21296 -row 21297 -row 21298 -row 21299 -row 21300 -row 21301 -row 21302 -row 21303 -row 21304 -row 21305 -row 21306 -row 21307 -row 21308 -row 21309 -row 21310 -row 21311 -row 21312 -row 21313 -row 21314 -row 21315 -row 21316 -row 21317 -row 21318 -row 21319 -row 21320 -row 21321 -row 21322 -row 21323 -row 21324 -row 21325 -row 21326 -row 21327 -row 21328 -row 21329 -row 21330 -row 21331 -row 21332 -row 21333 -row 21334 -row 21335 -row 21336 -row 21337 -row 21338 -row 21339 -row 21340 -row 21341 -row 21342 -row 21343 -row 21344 -row 21345 -row 21346 -row 21347 -row 21348 -row 21349 -row 21350 -row 21351 -row 21352 -row 21353 -row 21354 -row 21355 -row 21356 -row 21357 -row 21358 -row 21359 -row 21360 -row 21361 -row 21362 -row 21363 -row 21364 -row 21365 -row 21366 -row 21367 -row 21368 -row 21369 -row 21370 -row 21371 -row 21372 -row 21373 -row 21374 -row 21375 -row 21376 -row 21377 -row 21378 -row 21379 -row 21380 -row 21381 -row 21382 -row 21383 -row 21384 -row 21385 -row 21386 -row 21387 -row 21388 -row 21389 -row 21390 -row 21391 -row 21392 -row 21393 -row 21394 -row 21395 -row 21396 -row 21397 -row 21398 -row 21399 -row 21400 -row 21401 -row 21402 -row 21403 -row 21404 -row 21405 -row 21406 -row 21407 -row 21408 -row 21409 -row 21410 -row 21411 -row 21412 -row 21413 -row 21414 -row 21415 -row 21416 -row 21417 -row 21418 -row 21419 -row 21420 -row 21421 -row 21422 -row 21423 -row 21424 -row 21425 -row 21426 -row 21427 -row 21428 -row 21429 -row 21430 -row 21431 -row 21432 -row 21433 -row 21434 -row 21435 -row 21436 -row 21437 -row 21438 -row 21439 -row 21440 -row 21441 -row 21442 -row 21443 -row 21444 -row 21445 -row 21446 -row 21447 -row 21448 -row 21449 -row 21450 -row 21451 -row 21452 -row 21453 -row 21454 -row 21455 -row 21456 -row 21457 -row 21458 -row 21459 -row 21460 -row 21461 -row 21462 -row 21463 -row 21464 -row 21465 -row 21466 -row 21467 -row 21468 -row 21469 -row 21470 -row 21471 -row 21472 -row 21473 -row 21474 -row 21475 -row 21476 -row 21477 -row 21478 -row 21479 -row 21480 -row 21481 -row 21482 -row 21483 -row 21484 -row 21485 -row 21486 -row 21487 -row 21488 -row 21489 -row 21490 -row 21491 -row 21492 -row 21493 -row 21494 -row 21495 -row 21496 -row 21497 -row 21498 -row 21499 -row 21500 -row 21501 -row 21502 -row 21503 -row 21504 -row 21505 -row 21506 -row 21507 -row 21508 -row 21509 -row 21510 -row 21511 -row 21512 -row 21513 -row 21514 -row 21515 -row 21516 -row 21517 -row 21518 -row 21519 -row 21520 -row 21521 -row 21522 -row 21523 -row 21524 -row 21525 -row 21526 -row 21527 -row 21528 -row 21529 -row 21530 -row 21531 -row 21532 -row 21533 -row 21534 -row 21535 -row 21536 -row 21537 -row 21538 -row 21539 -row 21540 -row 21541 -row 21542 -row 21543 -row 21544 -row 21545 -row 21546 -row 21547 -row 21548 -row 21549 -row 21550 -row 21551 -row 21552 -row 21553 -row 21554 -row 21555 -row 21556 -row 21557 -row 21558 -row 21559 -row 21560 -row 21561 -row 21562 -row 21563 -row 21564 -row 21565 -row 21566 -row 21567 -row 21568 -row 21569 -row 21570 -row 21571 -row 21572 -row 21573 -row 21574 -row 21575 -row 21576 -row 21577 -row 21578 -row 21579 -row 21580 -row 21581 -row 21582 -row 21583 -row 21584 -row 21585 -row 21586 -row 21587 -row 21588 -row 21589 -row 21590 -row 21591 -row 21592 -row 21593 -row 21594 -row 21595 -row 21596 -row 21597 -row 21598 -row 21599 -row 21600 -row 21601 -row 21602 -row 21603 -row 21604 -row 21605 -row 21606 -row 21607 -row 21608 -row 21609 -row 21610 -row 21611 -row 21612 -row 21613 -row 21614 -row 21615 -row 21616 -row 21617 -row 21618 -row 21619 -row 21620 -row 21621 -row 21622 -row 21623 -row 21624 -row 21625 -row 21626 -row 21627 -row 21628 -row 21629 -row 21630 -row 21631 -row 21632 -row 21633 -row 21634 -row 21635 -row 21636 -row 21637 -row 21638 -row 21639 -row 21640 -row 21641 -row 21642 -row 21643 -row 21644 -row 21645 -row 21646 -row 21647 -row 21648 -row 21649 -row 21650 -row 21651 -row 21652 -row 21653 -row 21654 -row 21655 -row 21656 -row 21657 -row 21658 -row 21659 -row 21660 -row 21661 -row 21662 -row 21663 -row 21664 -row 21665 -row 21666 -row 21667 -row 21668 -row 21669 -row 21670 -row 21671 -row 21672 -row 21673 -row 21674 -row 21675 -row 21676 -row 21677 -row 21678 -row 21679 -row 21680 -row 21681 -row 21682 -row 21683 -row 21684 -row 21685 -row 21686 -row 21687 -row 21688 -row 21689 -row 21690 -row 21691 -row 21692 -row 21693 -row 21694 -row 21695 -row 21696 -row 21697 -row 21698 -row 21699 -row 21700 -row 21701 -row 21702 -row 21703 -row 21704 -row 21705 -row 21706 -row 21707 -row 21708 -row 21709 -row 21710 -row 21711 -row 21712 -row 21713 -row 21714 -row 21715 -row 21716 -row 21717 -row 21718 -row 21719 -row 21720 -row 21721 -row 21722 -row 21723 -row 21724 -row 21725 -row 21726 -row 21727 -row 21728 -row 21729 -row 21730 -row 21731 -row 21732 -row 21733 -row 21734 -row 21735 -row 21736 -row 21737 -row 21738 -row 21739 -row 21740 -row 21741 -row 21742 -row 21743 -row 21744 -row 21745 -row 21746 -row 21747 -row 21748 -row 21749 -row 21750 -row 21751 -row 21752 -row 21753 -row 21754 -row 21755 -row 21756 -row 21757 -row 21758 -row 21759 -row 21760 -row 21761 -row 21762 -row 21763 -row 21764 -row 21765 -row 21766 -row 21767 -row 21768 -row 21769 -row 21770 -row 21771 -row 21772 -row 21773 -row 21774 -row 21775 -row 21776 -row 21777 -row 21778 -row 21779 -row 21780 -row 21781 -row 21782 -row 21783 -row 21784 -row 21785 -row 21786 -row 21787 -row 21788 -row 21789 -row 21790 -row 21791 -row 21792 -row 21793 -row 21794 -row 21795 -row 21796 -row 21797 -row 21798 -row 21799 -row 21800 -row 21801 -row 21802 -row 21803 -row 21804 -row 21805 -row 21806 -row 21807 -row 21808 -row 21809 -row 21810 -row 21811 -row 21812 -row 21813 -row 21814 -row 21815 -row 21816 -row 21817 -row 21818 -row 21819 -row 21820 -row 21821 -row 21822 -row 21823 -row 21824 -row 21825 -row 21826 -row 21827 -row 21828 -row 21829 -row 21830 -row 21831 -row 21832 -row 21833 -row 21834 -row 21835 -row 21836 -row 21837 -row 21838 -row 21839 -row 21840 -row 21841 -row 21842 -row 21843 -row 21844 -row 21845 -row 21846 -row 21847 -row 21848 -row 21849 -row 21850 -row 21851 -row 21852 -row 21853 -row 21854 -row 21855 -row 21856 -row 21857 -row 21858 -row 21859 -row 21860 -row 21861 -row 21862 -row 21863 -row 21864 -row 21865 -row 21866 -row 21867 -row 21868 -row 21869 -row 21870 -row 21871 -row 21872 -row 21873 -row 21874 -row 21875 -row 21876 -row 21877 -row 21878 -row 21879 -row 21880 -row 21881 -row 21882 -row 21883 -row 21884 -row 21885 -row 21886 -row 21887 -row 21888 -row 21889 -row 21890 -row 21891 -row 21892 -row 21893 -row 21894 -row 21895 -row 21896 -row 21897 -row 21898 -row 21899 -row 21900 -row 21901 -row 21902 -row 21903 -row 21904 -row 21905 -row 21906 -row 21907 -row 21908 -row 21909 -row 21910 -row 21911 -row 21912 -row 21913 -row 21914 -row 21915 -row 21916 -row 21917 -row 21918 -row 21919 -row 21920 -row 21921 -row 21922 -row 21923 -row 21924 -row 21925 -row 21926 -row 21927 -row 21928 -row 21929 -row 21930 -row 21931 -row 21932 -row 21933 -row 21934 -row 21935 -row 21936 -row 21937 -row 21938 -row 21939 -row 21940 -row 21941 -row 21942 -row 21943 -row 21944 -row 21945 -row 21946 -row 21947 -row 21948 -row 21949 -row 21950 -row 21951 -row 21952 -row 21953 -row 21954 -row 21955 -row 21956 -row 21957 -row 21958 -row 21959 -row 21960 -row 21961 -row 21962 -row 21963 -row 21964 -row 21965 -row 21966 -row 21967 -row 21968 -row 21969 -row 21970 -row 21971 -row 21972 -row 21973 -row 21974 -row 21975 -row 21976 -row 21977 -row 21978 -row 21979 -row 21980 -row 21981 -row 21982 -row 21983 -row 21984 -row 21985 -row 21986 -row 21987 -row 21988 -row 21989 -row 21990 -row 21991 -row 21992 -row 21993 -row 21994 -row 21995 -row 21996 -row 21997 -row 21998 -row 21999 -row 22000 -row 22001 -row 22002 -row 22003 -row 22004 -row 22005 -row 22006 -row 22007 -row 22008 -row 22009 -row 22010 -row 22011 -row 22012 -row 22013 -row 22014 -row 22015 -row 22016 -row 22017 -row 22018 -row 22019 -row 22020 -row 22021 -row 22022 -row 22023 -row 22024 -row 22025 -row 22026 -row 22027 -row 22028 -row 22029 -row 22030 -row 22031 -row 22032 -row 22033 -row 22034 -row 22035 -row 22036 -row 22037 -row 22038 -row 22039 -row 22040 -row 22041 -row 22042 -row 22043 -row 22044 -row 22045 -row 22046 -row 22047 -row 22048 -row 22049 -row 22050 -row 22051 -row 22052 -row 22053 -row 22054 -row 22055 -row 22056 -row 22057 -row 22058 -row 22059 -row 22060 -row 22061 -row 22062 -row 22063 -row 22064 -row 22065 -row 22066 -row 22067 -row 22068 -row 22069 -row 22070 -row 22071 -row 22072 -row 22073 -row 22074 -row 22075 -row 22076 -row 22077 -row 22078 -row 22079 -row 22080 -row 22081 -row 22082 -row 22083 -row 22084 -row 22085 -row 22086 -row 22087 -row 22088 -row 22089 -row 22090 -row 22091 -row 22092 -row 22093 -row 22094 -row 22095 -row 22096 -row 22097 -row 22098 -row 22099 -row 22100 -row 22101 -row 22102 -row 22103 -row 22104 -row 22105 -row 22106 -row 22107 -row 22108 -row 22109 -row 22110 -row 22111 -row 22112 -row 22113 -row 22114 -row 22115 -row 22116 -row 22117 -row 22118 -row 22119 -row 22120 -row 22121 -row 22122 -row 22123 -row 22124 -row 22125 -row 22126 -row 22127 -row 22128 -row 22129 -row 22130 -row 22131 -row 22132 -row 22133 -row 22134 -row 22135 -row 22136 -row 22137 -row 22138 -row 22139 -row 22140 -row 22141 -row 22142 -row 22143 -row 22144 -row 22145 -row 22146 -row 22147 -row 22148 -row 22149 -row 22150 -row 22151 -row 22152 -row 22153 -row 22154 -row 22155 -row 22156 -row 22157 -row 22158 -row 22159 -row 22160 -row 22161 -row 22162 -row 22163 -row 22164 -row 22165 -row 22166 -row 22167 -row 22168 -row 22169 -row 22170 -row 22171 -row 22172 -row 22173 -row 22174 -row 22175 -row 22176 -row 22177 -row 22178 -row 22179 -row 22180 -row 22181 -row 22182 -row 22183 -row 22184 -row 22185 -row 22186 -row 22187 -row 22188 -row 22189 -row 22190 -row 22191 -row 22192 -row 22193 -row 22194 -row 22195 -row 22196 -row 22197 -row 22198 -row 22199 -row 22200 -row 22201 -row 22202 -row 22203 -row 22204 -row 22205 -row 22206 -row 22207 -row 22208 -row 22209 -row 22210 -row 22211 -row 22212 -row 22213 -row 22214 -row 22215 -row 22216 -row 22217 -row 22218 -row 22219 -row 22220 -row 22221 -row 22222 -row 22223 -row 22224 -row 22225 -row 22226 -row 22227 -row 22228 -row 22229 -row 22230 -row 22231 -row 22232 -row 22233 -row 22234 -row 22235 -row 22236 -row 22237 -row 22238 -row 22239 -row 22240 -row 22241 -row 22242 -row 22243 -row 22244 -row 22245 -row 22246 -row 22247 -row 22248 -row 22249 -row 22250 -row 22251 -row 22252 -row 22253 -row 22254 -row 22255 -row 22256 -row 22257 -row 22258 -row 22259 -row 22260 -row 22261 -row 22262 -row 22263 -row 22264 -row 22265 -row 22266 -row 22267 -row 22268 -row 22269 -row 22270 -row 22271 -row 22272 -row 22273 -row 22274 -row 22275 -row 22276 -row 22277 -row 22278 -row 22279 -row 22280 -row 22281 -row 22282 -row 22283 -row 22284 -row 22285 -row 22286 -row 22287 -row 22288 -row 22289 -row 22290 -row 22291 -row 22292 -row 22293 -row 22294 -row 22295 -row 22296 -row 22297 -row 22298 -row 22299 -row 22300 -row 22301 -row 22302 -row 22303 -row 22304 -row 22305 -row 22306 -row 22307 -row 22308 -row 22309 -row 22310 -row 22311 -row 22312 -row 22313 -row 22314 -row 22315 -row 22316 -row 22317 -row 22318 -row 22319 -row 22320 -row 22321 -row 22322 -row 22323 -row 22324 -row 22325 -row 22326 -row 22327 -row 22328 -row 22329 -row 22330 -row 22331 -row 22332 -row 22333 -row 22334 -row 22335 -row 22336 -row 22337 -row 22338 -row 22339 -row 22340 -row 22341 -row 22342 -row 22343 -row 22344 -row 22345 -row 22346 -row 22347 -row 22348 -row 22349 -row 22350 -row 22351 -row 22352 -row 22353 -row 22354 -row 22355 -row 22356 -row 22357 -row 22358 -row 22359 -row 22360 -row 22361 -row 22362 -row 22363 -row 22364 -row 22365 -row 22366 -row 22367 -row 22368 -row 22369 -row 22370 -row 22371 -row 22372 -row 22373 -row 22374 -row 22375 -row 22376 -row 22377 -row 22378 -row 22379 -row 22380 -row 22381 -row 22382 -row 22383 -row 22384 -row 22385 -row 22386 -row 22387 -row 22388 -row 22389 -row 22390 -row 22391 -row 22392 -row 22393 -row 22394 -row 22395 -row 22396 -row 22397 -row 22398 -row 22399 -row 22400 -row 22401 -row 22402 -row 22403 -row 22404 -row 22405 -row 22406 -row 22407 -row 22408 -row 22409 -row 22410 -row 22411 -row 22412 -row 22413 -row 22414 -row 22415 -row 22416 -row 22417 -row 22418 -row 22419 -row 22420 -row 22421 -row 22422 -row 22423 -row 22424 -row 22425 -row 22426 -row 22427 -row 22428 -row 22429 -row 22430 -row 22431 -row 22432 -row 22433 -row 22434 -row 22435 -row 22436 -row 22437 -row 22438 -row 22439 -row 22440 -row 22441 -row 22442 -row 22443 -row 22444 -row 22445 -row 22446 -row 22447 -row 22448 -row 22449 -row 22450 -row 22451 -row 22452 -row 22453 -row 22454 -row 22455 -row 22456 -row 22457 -row 22458 -row 22459 -row 22460 -row 22461 -row 22462 -row 22463 -row 22464 -row 22465 -row 22466 -row 22467 -row 22468 -row 22469 -row 22470 -row 22471 -row 22472 -row 22473 -row 22474 -row 22475 -row 22476 -row 22477 -row 22478 -row 22479 -row 22480 -row 22481 -row 22482 -row 22483 -row 22484 -row 22485 -row 22486 -row 22487 -row 22488 -row 22489 -row 22490 -row 22491 -row 22492 -row 22493 -row 22494 -row 22495 -row 22496 -row 22497 -row 22498 -row 22499 -row 22500 -row 22501 -row 22502 -row 22503 -row 22504 -row 22505 -row 22506 -row 22507 -row 22508 -row 22509 -row 22510 -row 22511 -row 22512 -row 22513 -row 22514 -row 22515 -row 22516 -row 22517 -row 22518 -row 22519 -row 22520 -row 22521 -row 22522 -row 22523 -row 22524 -row 22525 -row 22526 -row 22527 -row 22528 -row 22529 -row 22530 -row 22531 -row 22532 -row 22533 -row 22534 -row 22535 -row 22536 -row 22537 -row 22538 -row 22539 -row 22540 -row 22541 -row 22542 -row 22543 -row 22544 -row 22545 -row 22546 -row 22547 -row 22548 -row 22549 -row 22550 -row 22551 -row 22552 -row 22553 -row 22554 -row 22555 -row 22556 -row 22557 -row 22558 -row 22559 -row 22560 -row 22561 -row 22562 -row 22563 -row 22564 -row 22565 -row 22566 -row 22567 -row 22568 -row 22569 -row 22570 -row 22571 -row 22572 -row 22573 -row 22574 -row 22575 -row 22576 -row 22577 -row 22578 -row 22579 -row 22580 -row 22581 -row 22582 -row 22583 -row 22584 -row 22585 -row 22586 -row 22587 -row 22588 -row 22589 -row 22590 -row 22591 -row 22592 -row 22593 -row 22594 -row 22595 -row 22596 -row 22597 -row 22598 -row 22599 -row 22600 -row 22601 -row 22602 -row 22603 -row 22604 -row 22605 -row 22606 -row 22607 -row 22608 -row 22609 -row 22610 -row 22611 -row 22612 -row 22613 -row 22614 -row 22615 -row 22616 -row 22617 -row 22618 -row 22619 -row 22620 -row 22621 -row 22622 -row 22623 -row 22624 -row 22625 -row 22626 -row 22627 -row 22628 -row 22629 -row 22630 -row 22631 -row 22632 -row 22633 -row 22634 -row 22635 -row 22636 -row 22637 -row 22638 -row 22639 -row 22640 -row 22641 -row 22642 -row 22643 -row 22644 -row 22645 -row 22646 -row 22647 -row 22648 -row 22649 -row 22650 -row 22651 -row 22652 -row 22653 -row 22654 -row 22655 -row 22656 -row 22657 -row 22658 -row 22659 -row 22660 -row 22661 -row 22662 -row 22663 -row 22664 -row 22665 -row 22666 -row 22667 -row 22668 -row 22669 -row 22670 -row 22671 -row 22672 -row 22673 -row 22674 -row 22675 -row 22676 -row 22677 -row 22678 -row 22679 -row 22680 -row 22681 -row 22682 -row 22683 -row 22684 -row 22685 -row 22686 -row 22687 -row 22688 -row 22689 -row 22690 -row 22691 -row 22692 -row 22693 -row 22694 -row 22695 -row 22696 -row 22697 -row 22698 -row 22699 -row 22700 -row 22701 -row 22702 -row 22703 -row 22704 -row 22705 -row 22706 -row 22707 -row 22708 -row 22709 -row 22710 -row 22711 -row 22712 -row 22713 -row 22714 -row 22715 -row 22716 -row 22717 -row 22718 -row 22719 -row 22720 -row 22721 -row 22722 -row 22723 -row 22724 -row 22725 -row 22726 -row 22727 -row 22728 -row 22729 -row 22730 -row 22731 -row 22732 -row 22733 -row 22734 -row 22735 -row 22736 -row 22737 -row 22738 -row 22739 -row 22740 -row 22741 -row 22742 -row 22743 -row 22744 -row 22745 -row 22746 -row 22747 -row 22748 -row 22749 -row 22750 -row 22751 -row 22752 -row 22753 -row 22754 -row 22755 -row 22756 -row 22757 -row 22758 -row 22759 -row 22760 -row 22761 -row 22762 -row 22763 -row 22764 -row 22765 -row 22766 -row 22767 -row 22768 -row 22769 -row 22770 -row 22771 -row 22772 -row 22773 -row 22774 -row 22775 -row 22776 -row 22777 -row 22778 -row 22779 -row 22780 -row 22781 -row 22782 -row 22783 -row 22784 -row 22785 -row 22786 -row 22787 -row 22788 -row 22789 -row 22790 -row 22791 -row 22792 -row 22793 -row 22794 -row 22795 -row 22796 -row 22797 -row 22798 -row 22799 -row 22800 -row 22801 -row 22802 -row 22803 -row 22804 -row 22805 -row 22806 -row 22807 -row 22808 -row 22809 -row 22810 -row 22811 -row 22812 -row 22813 -row 22814 -row 22815 -row 22816 -row 22817 -row 22818 -row 22819 -row 22820 -row 22821 -row 22822 -row 22823 -row 22824 -row 22825 -row 22826 -row 22827 -row 22828 -row 22829 -row 22830 -row 22831 -row 22832 -row 22833 -row 22834 -row 22835 -row 22836 -row 22837 -row 22838 -row 22839 -row 22840 -row 22841 -row 22842 -row 22843 -row 22844 -row 22845 -row 22846 -row 22847 -row 22848 -row 22849 -row 22850 -row 22851 -row 22852 -row 22853 -row 22854 -row 22855 -row 22856 -row 22857 -row 22858 -row 22859 -row 22860 -row 22861 -row 22862 -row 22863 -row 22864 -row 22865 -row 22866 -row 22867 -row 22868 -row 22869 -row 22870 -row 22871 -row 22872 -row 22873 -row 22874 -row 22875 -row 22876 -row 22877 -row 22878 -row 22879 -row 22880 -row 22881 -row 22882 -row 22883 -row 22884 -row 22885 -row 22886 -row 22887 -row 22888 -row 22889 -row 22890 -row 22891 -row 22892 -row 22893 -row 22894 -row 22895 -row 22896 -row 22897 -row 22898 -row 22899 -row 22900 -row 22901 -row 22902 -row 22903 -row 22904 -row 22905 -row 22906 -row 22907 -row 22908 -row 22909 -row 22910 -row 22911 -row 22912 -row 22913 -row 22914 -row 22915 -row 22916 -row 22917 -row 22918 -row 22919 -row 22920 -row 22921 -row 22922 -row 22923 -row 22924 -row 22925 -row 22926 -row 22927 -row 22928 -row 22929 -row 22930 -row 22931 -row 22932 -row 22933 -row 22934 -row 22935 -row 22936 -row 22937 -row 22938 -row 22939 -row 22940 -row 22941 -row 22942 -row 22943 -row 22944 -row 22945 -row 22946 -row 22947 -row 22948 -row 22949 -row 22950 -row 22951 -row 22952 -row 22953 -row 22954 -row 22955 -row 22956 -row 22957 -row 22958 -row 22959 -row 22960 -row 22961 -row 22962 -row 22963 -row 22964 -row 22965 -row 22966 -row 22967 -row 22968 -row 22969 -row 22970 -row 22971 -row 22972 -row 22973 -row 22974 -row 22975 -row 22976 -row 22977 -row 22978 -row 22979 -row 22980 -row 22981 -row 22982 -row 22983 -row 22984 -row 22985 -row 22986 -row 22987 -row 22988 -row 22989 -row 22990 -row 22991 -row 22992 -row 22993 -row 22994 -row 22995 -row 22996 -row 22997 -row 22998 -row 22999 -row 23000 -row 23001 -row 23002 -row 23003 -row 23004 -row 23005 -row 23006 -row 23007 -row 23008 -row 23009 -row 23010 -row 23011 -row 23012 -row 23013 -row 23014 -row 23015 -row 23016 -row 23017 -row 23018 -row 23019 -row 23020 -row 23021 -row 23022 -row 23023 -row 23024 -row 23025 -row 23026 -row 23027 -row 23028 -row 23029 -row 23030 -row 23031 -row 23032 -row 23033 -row 23034 -row 23035 -row 23036 -row 23037 -row 23038 -row 23039 -row 23040 -row 23041 -row 23042 -row 23043 -row 23044 -row 23045 -row 23046 -row 23047 -row 23048 -row 23049 -row 23050 -row 23051 -row 23052 -row 23053 -row 23054 -row 23055 -row 23056 -row 23057 -row 23058 -row 23059 -row 23060 -row 23061 -row 23062 -row 23063 -row 23064 -row 23065 -row 23066 -row 23067 -row 23068 -row 23069 -row 23070 -row 23071 -row 23072 -row 23073 -row 23074 -row 23075 -row 23076 -row 23077 -row 23078 -row 23079 -row 23080 -row 23081 -row 23082 -row 23083 -row 23084 -row 23085 -row 23086 -row 23087 -row 23088 -row 23089 -row 23090 -row 23091 -row 23092 -row 23093 -row 23094 -row 23095 -row 23096 -row 23097 -row 23098 -row 23099 -row 23100 -row 23101 -row 23102 -row 23103 -row 23104 -row 23105 -row 23106 -row 23107 -row 23108 -row 23109 -row 23110 -row 23111 -row 23112 -row 23113 -row 23114 -row 23115 -row 23116 -row 23117 -row 23118 -row 23119 -row 23120 -row 23121 -row 23122 -row 23123 -row 23124 -row 23125 -row 23126 -row 23127 -row 23128 -row 23129 -row 23130 -row 23131 -row 23132 -row 23133 -row 23134 -row 23135 -row 23136 -row 23137 -row 23138 -row 23139 -row 23140 -row 23141 -row 23142 -row 23143 -row 23144 -row 23145 -row 23146 -row 23147 -row 23148 -row 23149 -row 23150 -row 23151 -row 23152 -row 23153 -row 23154 -row 23155 -row 23156 -row 23157 -row 23158 -row 23159 -row 23160 -row 23161 -row 23162 -row 23163 -row 23164 -row 23165 -row 23166 -row 23167 -row 23168 -row 23169 -row 23170 -row 23171 -row 23172 -row 23173 -row 23174 -row 23175 -row 23176 -row 23177 -row 23178 -row 23179 -row 23180 -row 23181 -row 23182 -row 23183 -row 23184 -row 23185 -row 23186 -row 23187 -row 23188 -row 23189 -row 23190 -row 23191 -row 23192 -row 23193 -row 23194 -row 23195 -row 23196 -row 23197 -row 23198 -row 23199 -row 23200 -row 23201 -row 23202 -row 23203 -row 23204 -row 23205 -row 23206 -row 23207 -row 23208 -row 23209 -row 23210 -row 23211 -row 23212 -row 23213 -row 23214 -row 23215 -row 23216 -row 23217 -row 23218 -row 23219 -row 23220 -row 23221 -row 23222 -row 23223 -row 23224 -row 23225 -row 23226 -row 23227 -row 23228 -row 23229 -row 23230 -row 23231 -row 23232 -row 23233 -row 23234 -row 23235 -row 23236 -row 23237 -row 23238 -row 23239 -row 23240 -row 23241 -row 23242 -row 23243 -row 23244 -row 23245 -row 23246 -row 23247 -row 23248 -row 23249 -row 23250 -row 23251 -row 23252 -row 23253 -row 23254 -row 23255 -row 23256 -row 23257 -row 23258 -row 23259 -row 23260 -row 23261 -row 23262 -row 23263 -row 23264 -row 23265 -row 23266 -row 23267 -row 23268 -row 23269 -row 23270 -row 23271 -row 23272 -row 23273 -row 23274 -row 23275 -row 23276 -row 23277 -row 23278 -row 23279 -row 23280 -row 23281 -row 23282 -row 23283 -row 23284 -row 23285 -row 23286 -row 23287 -row 23288 -row 23289 -row 23290 -row 23291 -row 23292 -row 23293 -row 23294 -row 23295 -row 23296 -row 23297 -row 23298 -row 23299 -row 23300 -row 23301 -row 23302 -row 23303 -row 23304 -row 23305 -row 23306 -row 23307 -row 23308 -row 23309 -row 23310 -row 23311 -row 23312 -row 23313 -row 23314 -row 23315 -row 23316 -row 23317 -row 23318 -row 23319 -row 23320 -row 23321 -row 23322 -row 23323 -row 23324 -row 23325 -row 23326 -row 23327 -row 23328 -row 23329 -row 23330 -row 23331 -row 23332 -row 23333 -row 23334 -row 23335 -row 23336 -row 23337 -row 23338 -row 23339 -row 23340 -row 23341 -row 23342 -row 23343 -row 23344 -row 23345 -row 23346 -row 23347 -row 23348 -row 23349 -row 23350 -row 23351 -row 23352 -row 23353 -row 23354 -row 23355 -row 23356 -row 23357 -row 23358 -row 23359 -row 23360 -row 23361 -row 23362 -row 23363 -row 23364 -row 23365 -row 23366 -row 23367 -row 23368 -row 23369 -row 23370 -row 23371 -row 23372 -row 23373 -row 23374 -row 23375 -row 23376 -row 23377 -row 23378 -row 23379 -row 23380 -row 23381 -row 23382 -row 23383 -row 23384 -row 23385 -row 23386 -row 23387 -row 23388 -row 23389 -row 23390 -row 23391 -row 23392 -row 23393 -row 23394 -row 23395 -row 23396 -row 23397 -row 23398 -row 23399 -row 23400 -row 23401 -row 23402 -row 23403 -row 23404 -row 23405 -row 23406 -row 23407 -row 23408 -row 23409 -row 23410 -row 23411 -row 23412 -row 23413 -row 23414 -row 23415 -row 23416 -row 23417 -row 23418 -row 23419 -row 23420 -row 23421 -row 23422 -row 23423 -row 23424 -row 23425 -row 23426 -row 23427 -row 23428 -row 23429 -row 23430 -row 23431 -row 23432 -row 23433 -row 23434 -row 23435 -row 23436 -row 23437 -row 23438 -row 23439 -row 23440 -row 23441 -row 23442 -row 23443 -row 23444 -row 23445 -row 23446 -row 23447 -row 23448 -row 23449 -row 23450 -row 23451 -row 23452 -row 23453 -row 23454 -row 23455 -row 23456 -row 23457 -row 23458 -row 23459 -row 23460 -row 23461 -row 23462 -row 23463 -row 23464 -row 23465 -row 23466 -row 23467 -row 23468 -row 23469 -row 23470 -row 23471 -row 23472 -row 23473 -row 23474 -row 23475 -row 23476 -row 23477 -row 23478 -row 23479 -row 23480 -row 23481 -row 23482 -row 23483 -row 23484 -row 23485 -row 23486 -row 23487 -row 23488 -row 23489 -row 23490 -row 23491 -row 23492 -row 23493 -row 23494 -row 23495 -row 23496 -row 23497 -row 23498 -row 23499 -row 23500 -row 23501 -row 23502 -row 23503 -row 23504 -row 23505 -row 23506 -row 23507 -row 23508 -row 23509 -row 23510 -row 23511 -row 23512 -row 23513 -row 23514 -row 23515 -row 23516 -row 23517 -row 23518 -row 23519 -row 23520 -row 23521 -row 23522 -row 23523 -row 23524 -row 23525 -row 23526 -row 23527 -row 23528 -row 23529 -row 23530 -row 23531 -row 23532 -row 23533 -row 23534 -row 23535 -row 23536 -row 23537 -row 23538 -row 23539 -row 23540 -row 23541 -row 23542 -row 23543 -row 23544 -row 23545 -row 23546 -row 23547 -row 23548 -row 23549 -row 23550 -row 23551 -row 23552 -row 23553 -row 23554 -row 23555 -row 23556 -row 23557 -row 23558 -row 23559 -row 23560 -row 23561 -row 23562 -row 23563 -row 23564 -row 23565 -row 23566 -row 23567 -row 23568 -row 23569 -row 23570 -row 23571 -row 23572 -row 23573 -row 23574 -row 23575 -row 23576 -row 23577 -row 23578 -row 23579 -row 23580 -row 23581 -row 23582 -row 23583 -row 23584 -row 23585 -row 23586 -row 23587 -row 23588 -row 23589 -row 23590 -row 23591 -row 23592 -row 23593 -row 23594 -row 23595 -row 23596 -row 23597 -row 23598 -row 23599 -row 23600 -row 23601 -row 23602 -row 23603 -row 23604 -row 23605 -row 23606 -row 23607 -row 23608 -row 23609 -row 23610 -row 23611 -row 23612 -row 23613 -row 23614 -row 23615 -row 23616 -row 23617 -row 23618 -row 23619 -row 23620 -row 23621 -row 23622 -row 23623 -row 23624 -row 23625 -row 23626 -row 23627 -row 23628 -row 23629 -row 23630 -row 23631 -row 23632 -row 23633 -row 23634 -row 23635 -row 23636 -row 23637 -row 23638 -row 23639 -row 23640 -row 23641 -row 23642 -row 23643 -row 23644 -row 23645 -row 23646 -row 23647 -row 23648 -row 23649 -row 23650 -row 23651 -row 23652 -row 23653 -row 23654 -row 23655 -row 23656 -row 23657 -row 23658 -row 23659 -row 23660 -row 23661 -row 23662 -row 23663 -row 23664 -row 23665 -row 23666 -row 23667 -row 23668 -row 23669 -row 23670 -row 23671 -row 23672 -row 23673 -row 23674 -row 23675 -row 23676 -row 23677 -row 23678 -row 23679 -row 23680 -row 23681 -row 23682 -row 23683 -row 23684 -row 23685 -row 23686 -row 23687 -row 23688 -row 23689 -row 23690 -row 23691 -row 23692 -row 23693 -row 23694 -row 23695 -row 23696 -row 23697 -row 23698 -row 23699 -row 23700 -row 23701 -row 23702 -row 23703 -row 23704 -row 23705 -row 23706 -row 23707 -row 23708 -row 23709 -row 23710 -row 23711 -row 23712 -row 23713 -row 23714 -row 23715 -row 23716 -row 23717 -row 23718 -row 23719 -row 23720 -row 23721 -row 23722 -row 23723 -row 23724 -row 23725 -row 23726 -row 23727 -row 23728 -row 23729 -row 23730 -row 23731 -row 23732 -row 23733 -row 23734 -row 23735 -row 23736 -row 23737 -row 23738 -row 23739 -row 23740 -row 23741 -row 23742 -row 23743 -row 23744 -row 23745 -row 23746 -row 23747 -row 23748 -row 23749 -row 23750 -row 23751 -row 23752 -row 23753 -row 23754 -row 23755 -row 23756 -row 23757 -row 23758 -row 23759 -row 23760 -row 23761 -row 23762 -row 23763 -row 23764 -row 23765 -row 23766 -row 23767 -row 23768 -row 23769 -row 23770 -row 23771 -row 23772 -row 23773 -row 23774 -row 23775 -row 23776 -row 23777 -row 23778 -row 23779 -row 23780 -row 23781 -row 23782 -row 23783 -row 23784 -row 23785 -row 23786 -row 23787 -row 23788 -row 23789 -row 23790 -row 23791 -row 23792 -row 23793 -row 23794 -row 23795 -row 23796 -row 23797 -row 23798 -row 23799 -row 23800 -row 23801 -row 23802 -row 23803 -row 23804 -row 23805 -row 23806 -row 23807 -row 23808 -row 23809 -row 23810 -row 23811 -row 23812 -row 23813 -row 23814 -row 23815 -row 23816 -row 23817 -row 23818 -row 23819 -row 23820 -row 23821 -row 23822 -row 23823 -row 23824 -row 23825 -row 23826 -row 23827 -row 23828 -row 23829 -row 23830 -row 23831 -row 23832 -row 23833 -row 23834 -row 23835 -row 23836 -row 23837 -row 23838 -row 23839 -row 23840 -row 23841 -row 23842 -row 23843 -row 23844 -row 23845 -row 23846 -row 23847 -row 23848 -row 23849 -row 23850 -row 23851 -row 23852 -row 23853 -row 23854 -row 23855 -row 23856 -row 23857 -row 23858 -row 23859 -row 23860 -row 23861 -row 23862 -row 23863 -row 23864 -row 23865 -row 23866 -row 23867 -row 23868 -row 23869 -row 23870 -row 23871 -row 23872 -row 23873 -row 23874 -row 23875 -row 23876 -row 23877 -row 23878 -row 23879 -row 23880 -row 23881 -row 23882 -row 23883 -row 23884 -row 23885 -row 23886 -row 23887 -row 23888 -row 23889 -row 23890 -row 23891 -row 23892 -row 23893 -row 23894 -row 23895 -row 23896 -row 23897 -row 23898 -row 23899 -row 23900 -row 23901 -row 23902 -row 23903 -row 23904 -row 23905 -row 23906 -row 23907 -row 23908 -row 23909 -row 23910 -row 23911 -row 23912 -row 23913 -row 23914 -row 23915 -row 23916 -row 23917 -row 23918 -row 23919 -row 23920 -row 23921 -row 23922 -row 23923 -row 23924 -row 23925 -row 23926 -row 23927 -row 23928 -row 23929 -row 23930 -row 23931 -row 23932 -row 23933 -row 23934 -row 23935 -row 23936 -row 23937 -row 23938 -row 23939 -row 23940 -row 23941 -row 23942 -row 23943 -row 23944 -row 23945 -row 23946 -row 23947 -row 23948 -row 23949 -row 23950 -row 23951 -row 23952 -row 23953 -row 23954 -row 23955 -row 23956 -row 23957 -row 23958 -row 23959 -row 23960 -row 23961 -row 23962 -row 23963 -row 23964 -row 23965 -row 23966 -row 23967 -row 23968 -row 23969 -row 23970 -row 23971 -row 23972 -row 23973 -row 23974 -row 23975 -row 23976 -row 23977 -row 23978 -row 23979 -row 23980 -row 23981 -row 23982 -row 23983 -row 23984 -row 23985 -row 23986 -row 23987 -row 23988 -row 23989 -row 23990 -row 23991 -row 23992 -row 23993 -row 23994 -row 23995 -row 23996 -row 23997 -row 23998 -row 23999 -row 24000 -row 24001 -row 24002 -row 24003 -row 24004 -row 24005 -row 24006 -row 24007 -row 24008 -row 24009 -row 24010 -row 24011 -row 24012 -row 24013 -row 24014 -row 24015 -row 24016 -row 24017 -row 24018 -row 24019 -row 24020 -row 24021 -row 24022 -row 24023 -row 24024 -row 24025 -row 24026 -row 24027 -row 24028 -row 24029 -row 24030 -row 24031 -row 24032 -row 24033 -row 24034 -row 24035 -row 24036 -row 24037 -row 24038 -row 24039 -row 24040 -row 24041 -row 24042 -row 24043 -row 24044 -row 24045 -row 24046 -row 24047 -row 24048 -row 24049 -row 24050 -row 24051 -row 24052 -row 24053 -row 24054 -row 24055 -row 24056 -row 24057 -row 24058 -row 24059 -row 24060 -row 24061 -row 24062 -row 24063 -row 24064 -row 24065 -row 24066 -row 24067 -row 24068 -row 24069 -row 24070 -row 24071 -row 24072 -row 24073 -row 24074 -row 24075 -row 24076 -row 24077 -row 24078 -row 24079 -row 24080 -row 24081 -row 24082 -row 24083 -row 24084 -row 24085 -row 24086 -row 24087 -row 24088 -row 24089 -row 24090 -row 24091 -row 24092 -row 24093 -row 24094 -row 24095 -row 24096 -row 24097 -row 24098 -row 24099 -row 24100 -row 24101 -row 24102 -row 24103 -row 24104 -row 24105 -row 24106 -row 24107 -row 24108 -row 24109 -row 24110 -row 24111 -row 24112 -row 24113 -row 24114 -row 24115 -row 24116 -row 24117 -row 24118 -row 24119 -row 24120 -row 24121 -row 24122 -row 24123 -row 24124 -row 24125 -row 24126 -row 24127 -row 24128 -row 24129 -row 24130 -row 24131 -row 24132 -row 24133 -row 24134 -row 24135 -row 24136 -row 24137 -row 24138 -row 24139 -row 24140 -row 24141 -row 24142 -row 24143 -row 24144 -row 24145 -row 24146 -row 24147 -row 24148 -row 24149 -row 24150 -row 24151 -row 24152 -row 24153 -row 24154 -row 24155 -row 24156 -row 24157 -row 24158 -row 24159 -row 24160 -row 24161 -row 24162 -row 24163 -row 24164 -row 24165 -row 24166 -row 24167 -row 24168 -row 24169 -row 24170 -row 24171 -row 24172 -row 24173 -row 24174 -row 24175 -row 24176 -row 24177 -row 24178 -row 24179 -row 24180 -row 24181 -row 24182 -row 24183 -row 24184 -row 24185 -row 24186 -row 24187 -row 24188 -row 24189 -row 24190 -row 24191 -row 24192 -row 24193 -row 24194 -row 24195 -row 24196 -row 24197 -row 24198 -row 24199 -row 24200 -row 24201 -row 24202 -row 24203 -row 24204 -row 24205 -row 24206 -row 24207 -row 24208 -row 24209 -row 24210 -row 24211 -row 24212 -row 24213 -row 24214 -row 24215 -row 24216 -row 24217 -row 24218 -row 24219 -row 24220 -row 24221 -row 24222 -row 24223 -row 24224 -row 24225 -row 24226 -row 24227 -row 24228 -row 24229 -row 24230 -row 24231 -row 24232 -row 24233 -row 24234 -row 24235 -row 24236 -row 24237 -row 24238 -row 24239 -row 24240 -row 24241 -row 24242 -row 24243 -row 24244 -row 24245 -row 24246 -row 24247 -row 24248 -row 24249 -row 24250 -row 24251 -row 24252 -row 24253 -row 24254 -row 24255 -row 24256 -row 24257 -row 24258 -row 24259 -row 24260 -row 24261 -row 24262 -row 24263 -row 24264 -row 24265 -row 24266 -row 24267 -row 24268 -row 24269 -row 24270 -row 24271 -row 24272 -row 24273 -row 24274 -row 24275 -row 24276 -row 24277 -row 24278 -row 24279 -row 24280 -row 24281 -row 24282 -row 24283 -row 24284 -row 24285 -row 24286 -row 24287 -row 24288 -row 24289 -row 24290 -row 24291 -row 24292 -row 24293 -row 24294 -row 24295 -row 24296 -row 24297 -row 24298 -row 24299 -row 24300 -row 24301 -row 24302 -row 24303 -row 24304 -row 24305 -row 24306 -row 24307 -row 24308 -row 24309 -row 24310 -row 24311 -row 24312 -row 24313 -row 24314 -row 24315 -row 24316 -row 24317 -row 24318 -row 24319 -row 24320 -row 24321 -row 24322 -row 24323 -row 24324 -row 24325 -row 24326 -row 24327 -row 24328 -row 24329 -row 24330 -row 24331 -row 24332 -row 24333 -row 24334 -row 24335 -row 24336 -row 24337 -row 24338 -row 24339 -row 24340 -row 24341 -row 24342 -row 24343 -row 24344 -row 24345 -row 24346 -row 24347 -row 24348 -row 24349 -row 24350 -row 24351 -row 24352 -row 24353 -row 24354 -row 24355 -row 24356 -row 24357 -row 24358 -row 24359 -row 24360 -row 24361 -row 24362 -row 24363 -row 24364 -row 24365 -row 24366 -row 24367 -row 24368 -row 24369 -row 24370 -row 24371 -row 24372 -row 24373 -row 24374 -row 24375 -row 24376 -row 24377 -row 24378 -row 24379 -row 24380 -row 24381 -row 24382 -row 24383 -row 24384 -row 24385 -row 24386 -row 24387 -row 24388 -row 24389 -row 24390 -row 24391 -row 24392 -row 24393 -row 24394 -row 24395 -row 24396 -row 24397 -row 24398 -row 24399 -row 24400 -row 24401 -row 24402 -row 24403 -row 24404 -row 24405 -row 24406 -row 24407 -row 24408 -row 24409 -row 24410 -row 24411 -row 24412 -row 24413 -row 24414 -row 24415 -row 24416 -row 24417 -row 24418 -row 24419 -row 24420 -row 24421 -row 24422 -row 24423 -row 24424 -row 24425 -row 24426 -row 24427 -row 24428 -row 24429 -row 24430 -row 24431 -row 24432 -row 24433 -row 24434 -row 24435 -row 24436 -row 24437 -row 24438 -row 24439 -row 24440 -row 24441 -row 24442 -row 24443 -row 24444 -row 24445 -row 24446 -row 24447 -row 24448 -row 24449 -row 24450 -row 24451 -row 24452 -row 24453 -row 24454 -row 24455 -row 24456 -row 24457 -row 24458 -row 24459 -row 24460 -row 24461 -row 24462 -row 24463 -row 24464 -row 24465 -row 24466 -row 24467 -row 24468 -row 24469 -row 24470 -row 24471 -row 24472 -row 24473 -row 24474 -row 24475 -row 24476 -row 24477 -row 24478 -row 24479 -row 24480 -row 24481 -row 24482 -row 24483 -row 24484 -row 24485 -row 24486 -row 24487 -row 24488 -row 24489 -row 24490 -row 24491 -row 24492 -row 24493 -row 24494 -row 24495 -row 24496 -row 24497 -row 24498 -row 24499 -row 24500 -row 24501 -row 24502 -row 24503 -row 24504 -row 24505 -row 24506 -row 24507 -row 24508 -row 24509 -row 24510 -row 24511 -row 24512 -row 24513 -row 24514 -row 24515 -row 24516 -row 24517 -row 24518 -row 24519 -row 24520 -row 24521 -row 24522 -row 24523 -row 24524 -row 24525 -row 24526 -row 24527 -row 24528 -row 24529 -row 24530 -row 24531 -row 24532 -row 24533 -row 24534 -row 24535 -row 24536 -row 24537 -row 24538 -row 24539 -row 24540 -row 24541 -row 24542 -row 24543 -row 24544 -row 24545 -row 24546 -row 24547 -row 24548 -row 24549 -row 24550 -row 24551 -row 24552 -row 24553 -row 24554 -row 24555 -row 24556 -row 24557 -row 24558 -row 24559 -row 24560 -row 24561 -row 24562 -row 24563 -row 24564 -row 24565 -row 24566 -row 24567 -row 24568 -row 24569 -row 24570 -row 24571 -row 24572 -row 24573 -row 24574 -row 24575 -row 24576 -row 24577 -row 24578 -row 24579 -row 24580 -row 24581 -row 24582 -row 24583 -row 24584 -row 24585 -row 24586 -row 24587 -row 24588 -row 24589 -row 24590 -row 24591 -row 24592 -row 24593 -row 24594 -row 24595 -row 24596 -row 24597 -row 24598 -row 24599 -row 24600 -row 24601 -row 24602 -row 24603 -row 24604 -row 24605 -row 24606 -row 24607 -row 24608 -row 24609 -row 24610 -row 24611 -row 24612 -row 24613 -row 24614 -row 24615 -row 24616 -row 24617 -row 24618 -row 24619 -row 24620 -row 24621 -row 24622 -row 24623 -row 24624 -row 24625 -row 24626 -row 24627 -row 24628 -row 24629 -row 24630 -row 24631 -row 24632 -row 24633 -row 24634 -row 24635 -row 24636 -row 24637 -row 24638 -row 24639 -row 24640 -row 24641 -row 24642 -row 24643 -row 24644 -row 24645 -row 24646 -row 24647 -row 24648 -row 24649 -row 24650 -row 24651 -row 24652 -row 24653 -row 24654 -row 24655 -row 24656 -row 24657 -row 24658 -row 24659 -row 24660 -row 24661 -row 24662 -row 24663 -row 24664 -row 24665 -row 24666 -row 24667 -row 24668 -row 24669 -row 24670 -row 24671 -row 24672 -row 24673 -row 24674 -row 24675 -row 24676 -row 24677 -row 24678 -row 24679 -row 24680 -row 24681 -row 24682 -row 24683 -row 24684 -row 24685 -row 24686 -row 24687 -row 24688 -row 24689 -row 24690 -row 24691 -row 24692 -row 24693 -row 24694 -row 24695 -row 24696 -row 24697 -row 24698 -row 24699 -row 24700 -row 24701 -row 24702 -row 24703 -row 24704 -row 24705 -row 24706 -row 24707 -row 24708 -row 24709 -row 24710 -row 24711 -row 24712 -row 24713 -row 24714 -row 24715 -row 24716 -row 24717 -row 24718 -row 24719 -row 24720 -row 24721 -row 24722 -row 24723 -row 24724 -row 24725 -row 24726 -row 24727 -row 24728 -row 24729 -row 24730 -row 24731 -row 24732 -row 24733 -row 24734 -row 24735 -row 24736 -row 24737 -row 24738 -row 24739 -row 24740 -row 24741 -row 24742 -row 24743 -row 24744 -row 24745 -row 24746 -row 24747 -row 24748 -row 24749 -row 24750 -row 24751 -row 24752 -row 24753 -row 24754 -row 24755 -row 24756 -row 24757 -row 24758 -row 24759 -row 24760 -row 24761 -row 24762 -row 24763 -row 24764 -row 24765 -row 24766 -row 24767 -row 24768 -row 24769 -row 24770 -row 24771 -row 24772 -row 24773 -row 24774 -row 24775 -row 24776 -row 24777 -row 24778 -row 24779 -row 24780 -row 24781 -row 24782 -row 24783 -row 24784 -row 24785 -row 24786 -row 24787 -row 24788 -row 24789 -row 24790 -row 24791 -row 24792 -row 24793 -row 24794 -row 24795 -row 24796 -row 24797 -row 24798 -row 24799 -row 24800 -row 24801 -row 24802 -row 24803 -row 24804 -row 24805 -row 24806 -row 24807 -row 24808 -row 24809 -row 24810 -row 24811 -row 24812 -row 24813 -row 24814 -row 24815 -row 24816 -row 24817 -row 24818 -row 24819 -row 24820 -row 24821 -row 24822 -row 24823 -row 24824 -row 24825 -row 24826 -row 24827 -row 24828 -row 24829 -row 24830 -row 24831 -row 24832 -row 24833 -row 24834 -row 24835 -row 24836 -row 24837 -row 24838 -row 24839 -row 24840 -row 24841 -row 24842 -row 24843 -row 24844 -row 24845 -row 24846 -row 24847 -row 24848 -row 24849 -row 24850 -row 24851 -row 24852 -row 24853 -row 24854 -row 24855 -row 24856 -row 24857 -row 24858 -row 24859 -row 24860 -row 24861 -row 24862 -row 24863 -row 24864 -row 24865 -row 24866 -row 24867 -row 24868 -row 24869 -row 24870 -row 24871 -row 24872 -row 24873 -row 24874 -row 24875 -row 24876 -row 24877 -row 24878 -row 24879 -row 24880 -row 24881 -row 24882 -row 24883 -row 24884 -row 24885 -row 24886 -row 24887 -row 24888 -row 24889 -row 24890 -row 24891 -row 24892 -row 24893 -row 24894 -row 24895 -row 24896 -row 24897 -row 24898 -row 24899 -row 24900 -row 24901 -row 24902 -row 24903 -row 24904 -row 24905 -row 24906 -row 24907 -row 24908 -row 24909 -row 24910 -row 24911 -row 24912 -row 24913 -row 24914 -row 24915 -row 24916 -row 24917 -row 24918 -row 24919 -row 24920 -row 24921 -row 24922 -row 24923 -row 24924 -row 24925 -row 24926 -row 24927 -row 24928 -row 24929 -row 24930 -row 24931 -row 24932 -row 24933 -row 24934 -row 24935 -row 24936 -row 24937 -row 24938 -row 24939 -row 24940 -row 24941 -row 24942 -row 24943 -row 24944 -row 24945 -row 24946 -row 24947 -row 24948 -row 24949 -row 24950 -row 24951 -row 24952 -row 24953 -row 24954 -row 24955 -row 24956 -row 24957 -row 24958 -row 24959 -row 24960 -row 24961 -row 24962 -row 24963 -row 24964 -row 24965 -row 24966 -row 24967 -row 24968 -row 24969 -row 24970 -row 24971 -row 24972 -row 24973 -row 24974 -row 24975 -row 24976 -row 24977 -row 24978 -row 24979 -row 24980 -row 24981 -row 24982 -row 24983 -row 24984 -row 24985 -row 24986 -row 24987 -row 24988 -row 24989 -row 24990 -row 24991 -row 24992 -row 24993 -row 24994 -row 24995 -row 24996 -row 24997 -row 24998 -row 24999 -row 25000 -``` diff --git a/examples/mdview2/testfiles/TABLES.MD b/examples/mdview2/testfiles/TABLES.MD deleted file mode 100644 index b5e6360..0000000 --- a/examples/mdview2/testfiles/TABLES.MD +++ /dev/null @@ -1,10502 +0,0 @@ -# Tables test - content cache exhaustion trigger - -## Table 1 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 2 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 3 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 4 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 5 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 6 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 7 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 8 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 9 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 10 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 11 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 12 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 13 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 14 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 15 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 16 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 17 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 18 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 19 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 20 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 21 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 22 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 23 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 24 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 25 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 26 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 27 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 28 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 29 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 30 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 31 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 32 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 33 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 34 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 35 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 36 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 37 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 38 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 39 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 40 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 41 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 42 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 43 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 44 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 45 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 46 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 47 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 48 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 49 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 50 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 51 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 52 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 53 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 54 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 55 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 56 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 57 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 58 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 59 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 60 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 61 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 62 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 63 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 64 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 65 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 66 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 67 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 68 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 69 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 70 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 71 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 72 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 73 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 74 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 75 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 76 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 77 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 78 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 79 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 80 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 81 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 82 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 83 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 84 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 85 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 86 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 87 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 88 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 89 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 90 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 91 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 92 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 93 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 94 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 95 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 96 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 97 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 98 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 99 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 100 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 101 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 102 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 103 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 104 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 105 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 106 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 107 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 108 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 109 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 110 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 111 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 112 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 113 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 114 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 115 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 116 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 117 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 118 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 119 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 120 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 121 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 122 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 123 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 124 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 125 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 126 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 127 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 128 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 129 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 130 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 131 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 132 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 133 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 134 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 135 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 136 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 137 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 138 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 139 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 140 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 141 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 142 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 143 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 144 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 145 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 146 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 147 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 148 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 149 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 150 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 151 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 152 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 153 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 154 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 155 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 156 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 157 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 158 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 159 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 160 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 161 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 162 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 163 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 164 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 165 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 166 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 167 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 168 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 169 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 170 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 171 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 172 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 173 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 174 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 175 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 176 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 177 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 178 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 179 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 180 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 181 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 182 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 183 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 184 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 185 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 186 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 187 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 188 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 189 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 190 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 191 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 192 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 193 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 194 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 195 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 196 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 197 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 198 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 199 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 200 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 201 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 202 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 203 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 204 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 205 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 206 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 207 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 208 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 209 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 210 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 211 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 212 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 213 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 214 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 215 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 216 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 217 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 218 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 219 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 220 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 221 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 222 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 223 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 224 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 225 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 226 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 227 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 228 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 229 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 230 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 231 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 232 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 233 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 234 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 235 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 236 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 237 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 238 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 239 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 240 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 241 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 242 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 243 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 244 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 245 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 246 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 247 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 248 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 249 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 250 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 251 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 252 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 253 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 254 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 255 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 256 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 257 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 258 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 259 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 260 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 261 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 262 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 263 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 264 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 265 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 266 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 267 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 268 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 269 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 270 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 271 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 272 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 273 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 274 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 275 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 276 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 277 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 278 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 279 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 280 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 281 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 282 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 283 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 284 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 285 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 286 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 287 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 288 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 289 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 290 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 291 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 292 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 293 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 294 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 295 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 296 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 297 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 298 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 299 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - -## Table 300 -| Column A | B | -|---|---| -| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | y | -| a0 | b | -| a1 | b | -| a2 | b | -| a3 | b | -| a4 | b | -| a5 | b | -| a6 | b | -| a7 | b | -| a8 | b | -| a9 | b | -| a10 | b | -| a11 | b | -| a12 | b | -| a13 | b | -| a14 | b | -| a15 | b | -| a16 | b | -| a17 | b | -| a18 | b | -| a19 | b | -| a20 | b | -| a21 | b | -| a22 | b | -| a23 | b | -| a24 | b | -| a25 | b | -| a26 | b | -| a27 | b | -| a28 | b | -| a29 | b | - diff --git a/examples/mdview2/testfiles/gen_testfiles.py b/examples/mdview2/testfiles/gen_testfiles.py deleted file mode 100644 index 47fe694..0000000 --- a/examples/mdview2/testfiles/gen_testfiles.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -"""Генератор тестовых файлов mdview2 для проверки лимита 256 КБ и путей обрыва. - -Результат кладётся рядом со скриптом (examples/mdview2/testfiles/): - BIG.MD — ~216 КБ обычной прозы (CP866): успешный рендер большого файла. - TABLES.MD — таблично-тяжёлый (ASCII): пробивает кап контент-кэша (40 стр./набор), - т.к. неровные таблицы (короткие ячейки + один широкий столбец) - раздувают число (символ,атрибут)-ячеек кратно относительно источника. - LINES.MD — ~22000 коротких строк (ASCII): пробивает лимит строк (18432). - -Запуск: python3 gen_testfiles.py -""" -import os - -HERE = os.path.dirname(os.path.abspath(__file__)) -ROOT = os.path.dirname(HERE) - - -def write(name, data): - path = os.path.join(HERE, name) - mode = 'wb' if isinstance(data, (bytes, bytearray)) else 'w' - with open(path, mode) as f: - f.write(data) - print(f"{name}: {os.path.getsize(path)} bytes") - - -# --- BIG.MD / HUGE.MD: склейка README + READMEBG, перекодировано в CP866 ----- -# BIG (×2 ≈170 КБ) — успешный рендер большого файла (<256 КБ). -# HUGE (×4 ≈340 КБ) — БОЛЬШЕ 256 КБ: проверка клампа (читаются первые 256 КБ + -# строка-предупреждение TRUNC_FILE). -prose = bytearray() -for fn in ('README.MD', 'READMEBG.MD'): - with open(os.path.join(ROOT, fn), encoding='utf-8') as f: - prose += f.read().encode('cp866', errors='replace') -write('BIG.MD', bytes(prose * 2)) -write('HUGE.MD', bytes(prose * 4)) - -# --- TABLES.MD: неровные таблицы -> исчерпание контент-кэша ------------------ -# Один широкий столбец (72 симв.) на таблицу задаёт ширину; остальные ячейки -# короткие, но при рендере добиваются до этой ширины -> ~80 ячеек/строка из -# ~8 байт источника. ~300 таблиц × 30 строк дают ~840K ячеек (1.68 МБ контента) -# при ~108 КБ источника -> кап 640 КБ/набор пробивается, строк (~11K) < 18432, -# значит первой срабатывает причина TRUNC_CONTENT. -NT, ROWS = 300, 30 -wide = 'x' * 72 -out = ['# Tables test - content cache exhaustion trigger', ''] -for t in range(NT): - out.append(f'## Table {t + 1}') - out.append('| Column A | B |') - out.append('|---|---|') - out.append(f'| {wide} | y |') - for r in range(ROWS): - out.append(f'| a{r} | b |') - out.append('') -write('TABLES.MD', '\n'.join(out) + '\n') - -# --- LINES.MD: масса коротких строк -> исчерпание лимита строк --------------- -# ВАЖНО: вьювер склеивает подряд идущие непустые строки в один параграф -# (markdown soft-wrap), поэтому простые строки потекли бы в абзац. Нужен -# контент БЕЗ склейки -> кладём всё в fenced code block (verbatim, 1:1 -# строка-источник = экранная строка). 22000 строк > 18432 -> TRUNC_LINES; -# контент мал (~9 ячеек/строка), кап контента не задевается. -N = 25000 # ~250 КБ -> 16 страниц -> max_lines = 18432; строк больше -> обрыв на 18432 -out = ['# Short lines test - line limit trigger', '', '```'] -out += [f'row {i:05d}' for i in range(1, N + 1)] -out.append('```') -write('LINES.MD', '\n'.join(out) + '\n') diff --git a/examples/rpgwalk/.gitignore b/examples/rpgwalk/.gitignore deleted file mode 100644 index 7db6d1a..0000000 --- a/examples/rpgwalk/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.raw -*.atl -bard.pal -sprites.stamp diff --git a/examples/rpgwalk/Makefile b/examples/rpgwalk/Makefile deleted file mode 100644 index ecfe305..0000000 --- a/examples/rpgwalk/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -EXAMPLE := rpgwalk -EXTRA_FLAGS ?= --gfx 256 --memory tiny -# rpgprof.exe в EXTRA_DATA — `make floppy` кладёт на дискету ОБА exe. -EXTRA_DATA := bard1.atl bard2.atl bard.pal rpgprof.exe -include $(CURDIR)/../sdk.mk - -# Профилировочная копия демо (бордер-полосы + маркеры для wpiset) — -# собирается вместе с rpgwalk; инструкция в шапке rpgprof.c. -# ВНИМАНИЕ: --memory small (не tiny!) — rpgprof толще rpgwalk -# (my_update + профиль-обвязка): в tiny его BSS вылезал за W2 -# (0xC05B > 0xBFFF) → мгновенный «Unexpected application termination» -# (кусало 2026-07-14; mkexe это переполнение пока НЕ ловит). -all: rpgprof.exe -floppy: rpgprof.exe - -rpgprof.exe: rpgprof.c $(MKEXE) $(LIB) $(RUNTIME_DEPS) $(PROJ_ROOT)/libbgi/_bgi.h - $(SPRINTER_CC) --gfx 256 --memory small -o $@ rpgprof.c - -clean: clean-prof -clean-prof: - rm -f rpgprof.exe -.PHONY: clean-prof - -# 8 персонажей по 12 кадров = 24 КБ пикселей — НЕ лезут в одну -# EMM-страницу (лимит 16К-0x100): два атласа по 4 персонажа. -sprites.stamp: conv_sprites.py $(PROJ_ROOT)/toolchain/mkatlas.py - python3 conv_sprites.py - python3 $(PROJ_ROOT)/toolchain/mkatlas.py bard1.atl \ - char0.raw:16x16:1x12 char1.raw:16x16:1x12 \ - char2.raw:16x16:1x12 char3.raw:16x16:1x12 - python3 $(PROJ_ROOT)/toolchain/mkatlas.py bard2.atl \ - char4.raw:16x16:1x12 char5.raw:16x16:1x12 \ - char6.raw:16x16:1x12 char7.raw:16x16:1x12 - touch $@ - -$(EXAMPLE).exe: sprites.stamp diff --git a/examples/rpgwalk/conv_sprites.py b/examples/rpgwalk/conv_sprites.py deleted file mode 100644 index 97778a3..0000000 --- a/examples/rpgwalk/conv_sprites.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -"""Конвертер third_party/16x16-RPG-characters (02-bard.png) → ленты -атласа + палитра для examples/rpgwalk. - -Источник: RGBA 192×128 = 8 рядов × 12 картинок 16×16; персонаж = -блок 3×4 (4 блока в ряду, 2 ряда блоков = 8 персонажей): - строка блока 0 — идёт ВНИЗ (на нас), кадры 0/1/2 (маятник); - строка 1 — ВЛЕВО; строка 2 — ВПРАВО; строка 3 — ВВЕРХ. - -Выход: - char0.raw..char7.raw — вертикальные ленты 16×192 (12 кадров: - dir*3 + frame — sprite_anim(dir*3, dir*3+2, PINGPONG)); - bard.pal — палитра gfx_pal_fload: слоты 0..15 = EGA (как ставит - initgraph, таблица из _bgi_mode_set), слоты 16.. = цвета PNG. -Пиксели: прозрачное (alpha<128) → 0xFF, цвет → 16 + индекс. -""" -from PIL import Image - -SRC = ("../third_party/16x16-RPG-characters/sprites/" - "old-style/02-bard.png") -BASE = 16 # цвета PNG кладём после EGA-шестнадцати - -# B, G, R, pad — как в libbgi/bgi256/_bgi_mode_set.c -EGA = [ - (0, 0, 0), (168, 0, 0), (0, 168, 0), (168, 168, 0), - (0, 0, 168), (168, 0, 168), (0, 84, 168), (168, 168, 168), - (84, 84, 84), (255, 84, 84), (84, 255, 84), (255, 255, 84), - (84, 84, 255), (255, 84, 255), (84, 255, 255), (255, 255, 255), -] - -im = Image.open(SRC).convert("RGBA") -assert im.size == (192, 128), im.size - -colors = {} # (r,g,b) -> палитровый индекс - - -def px(x, y): - r, g, b, a = im.getpixel((x, y)) - if a < 128: - return 0xFF - key = (r, g, b) - if key not in colors: - assert BASE + len(colors) < 0xFF, "палитра переполнена" - colors[key] = BASE + len(colors) - return colors[key] - - -for c in range(8): - bx, by = (c % 4) * 48, (c // 4) * 64 - data = bytearray() - for d in range(4): # вниз/влево/вправо/вверх - for f in range(3): # кадры маятника - for y in range(16): - for x in range(16): - data.append(px(bx + f * 16 + x, by + d * 16 + y)) - open(f"char{c}.raw", "wb").write(data) - -pal = bytearray() -for b, g, r in EGA: - pal += bytes((b, g, r, 0)) -for (r, g, b) in colors: # dict сохраняет порядок вставки - pal += bytes((b, g, r, 0)) -open("bard.pal", "wb").write(pal) - -print(f"conv_sprites: 8 лент 16x192, палитра EGA+{len(colors)} цветов " - f"({len(pal)} Б)") diff --git a/examples/rpgwalk/rpgprof.c b/examples/rpgwalk/rpgprof.c deleted file mode 100644 index ce46e3f..0000000 --- a/examples/rpgwalk/rpgprof.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * rpgprof — профилировочная копия rpgwalk (НЕ собирается по умолчанию). - * Два инструмента в одном: - * - * 1. ВИЗУАЛЬНЫЙ профайлер — цвет ГРАНИЦЫ экрана меняется на входе в - * каждую секцию кадра; луч бежит сверху вниз (~320 строк растра за - * кадр 48.83 Гц, 1344 такта на строку), так что толщина цветной - * полосы бордера ∝ времени секции. - * ВНИМАНИЕ: бордер принимает только биты 1-2 порта #FE (бит 0 = - * красный ИГНОРИРУЕТСЯ — проверено 2026-07-14) → доступны РОВНО - * четыре цвета: 0 чёрный, 2 синий, 4 зелёный, 6 голубой: - * синий (2) — логика (короткая) и blit-проход (банк 0x5C) - * зелёный (4) — тик авто-анимаций (_spr_tick_fn) - * голубой (6) — heal-проход (банк 0x50) - * чёрный (0) — gfx_wait_vsync (простой до конца кадра) - * Много чёрного = запас; синий+зелёный через весь бордер = не - * влезаем. dev-MAME перерисовывает бордер крупными кусками (не - * per-scanline) — полосы приблизительные, для точных цифр см. п.2. - * - * 2. ТАКТОВЫЙ профайлер — те же OUT'ы ловятся watchpoint'ом дебаггера - * dev-MAME (рецепт: memory/mame_mcp_bridge и docs/sprite-api-design.md - * §9д): wpiset по маске порта + printf totalcycles/wpdata + авто-g, - * затем оп clog моста. Для уникальности wpdata при одинаковом цвете - * можно кодировать секцию в битах 3+ (бордер их не видит): - * напр. логика 0x12, blit 0x02 — оба синие, но различимы в логе. - * - * Сборка и запуск (из этого каталога; атласы уже собраны make'ом): - * ../../bin/sprinter-cc --memory tiny --gfx 256 -o rpgprof.exe rpgprof.c - * cd ../../mame/v306 && python3 make_disk.py IMG/mc.img \ - * ../../examples/rpgwalk/rpgprof.exe \ - * ../../examples/rpgwalk/bard1.atl ../../examples/rpgwalk/bard2.atl \ - * ../../examples/rpgwalk/bard.pal - * ./run_mame.sh (или ./run_bridge.sh для тактового профиля) - * в CLI Sprinter: a:\rpgprof.exe - * - * my_update — копия libbgi sprite_update с воткнутыми маркерами; при - * изменении оригинала синхронизировать вручную. - */ -#include -#include -#include -#include -#include -#include -#include -#include "../../libbgi/_bgi.h" - -__sfr __at (0xFE) io_border; - -/* Копия sprite_update с суб-маркерами (см. шапку): 6 тик анимаций, - * 3 heal-проход, 7 blit-проход. */ -static void my_update(sprite_t *arr, uint8_t count) -{ - uint8_t p = gfx_get_draw_page(); - uint8_t dbit = p ? _SPR_DIRTY1 : _SPR_DIRTY0; - uint8_t saved = gfx_get_bank(); - uint8_t i; - const uint8_t *rec; - sprite_t *s; - - io_border = 4; /* зеленый: тик анимаций */ - if (_spr_tick_fn) - (*_spr_tick_fn)(arr, count); - - io_border = 6; /* голубой: heal */ - gfx_set_bank(GFX_BANK_NORMAL); - _bgi_begin(); - for (i = 0, s = arr; i < count; i++, s++) { - if (s->drawn[p].on && (s->flags & (dbit | SPR_ALWAYS))) { - (*_gfx_heal_fn)(s->drawn[p].x, s->drawn[p].y, s->w, s->h); - s->drawn[p].on = 0; - } - } - _bgi_end(); - - /* Y-сортировка (как в sprite_update; входит в «синюю» blit-секцию - * профиля — её цену видно по маркерам). */ - io_border = 2; /* синий: blit (+ сортировка) */ - rec = 0; - if (_spr_ysort_fn && count <= _GFX_YSORT_MAX) - rec = (*_spr_ysort_fn)(arr, count) + 2; - gfx_set_bank(GFX_BANK_SPRITE); - _bgi_begin(); - { - uint8_t mapped = 0; - - for (i = 0; i < count; i++) { - if (rec) { - s = *(sprite_t * const *)rec; /* Y-порядок */ - rec += 4; - } else - s = arr + i; - if (s->flags & (dbit | SPR_ALWAYS)) { - if (s->flags & SPR_VISIBLE) { - if (s->page != mapped && s->page) { - _gfx_w0_cur = s->page; - _io_page_w0 = s->page; - mapped = s->page; - } - (*_gfx_blit_fn)(s->x, s->y, s->src, s->stride, s->w, s->h); - s->drawn[p].x = s->x; - s->drawn[p].y = s->y; - s->drawn[p].on = 1; - } - s->flags &= ~dbit; - } - } - if (mapped) - _io_page_w0 = _gfx_w0_dss; - } - _bgi_end(); - - gfx_set_bank(saved); -} - -#define NCHR 15 -#define MINX 0 -#define MAXX (320 - 16) -#define MINY 14 -#define MAXY (256 - 16) -#define QX 80 -#define QY 64 - -static atlas_t at1, at2; -static sprite_t sp[NCHR]; -static uint8_t dir[NCHR]; -static uint8_t phase[NCHR]; - -static void set_dir(uint8_t i, uint8_t d) -{ - dir[i] = d; -// sprite_anim(&sp[i], (uint8_t)(d * 3), (uint8_t)(d * 3 + 2), -// (uint8_t)(5 + (i & 3)), ANIM_PINGPONG); - sprite_anim(&sp[i], (uint8_t)(d * 3), (uint8_t)(d * 3 + 2), - (uint8_t)5, ANIM_PINGPONG); -} - -static void go_edge(uint8_t i) -{ - sprite_t *s = &sp[i]; - int tx = s->x, ty = s->y; - - switch (dir[i]) { - case 0: ty = MAXY; break; - case 1: tx = MINX; break; - case 2: tx = MAXX; break; - default: ty = MINY; break; - } - sprite_moveto(s, tx, ty, 1, (uint8_t)(1 + (i & 1))); - phase[i] = 0; -} - -static void go_back_random(uint8_t i) -{ - sprite_t *s = &sp[i]; - int tx = s->x, ty = s->y, avail, dist; - uint8_t d = dir[i]; - - d = (uint8_t)(3 - d); /* 0↔3, 1↔2 — разворот */ - set_dir(i, d); - switch (d) { - case 0: avail = MAXY - s->y; dist = QY; break; - case 1: avail = s->x - MINX; dist = QX; break; - case 2: avail = MAXX - s->x; dist = QX; break; - default: avail = s->y - MINY; dist = QY; break; - } - if (avail > dist) - dist += rand() % (avail - dist + 1); - else - dist = avail; - switch (d) { - case 0: ty += dist; break; - case 1: tx -= dist; break; - case 2: tx += dist; break; - default: ty -= dist; break; - } - sprite_moveto(s, tx, ty, 1, (uint8_t)(1 + (i & 1))); - phase[i] = 1; -} - -static void turn_90(uint8_t i) -{ - uint8_t d = dir[i]; - uint8_t vert = (d == 0 || d == 3); - - set_dir(i, vert ? (uint8_t)(1 + (rand() & 1)) - : (uint8_t)((rand() & 1) ? 0 : 3)); - go_edge(i); -} - -// static void show_fps(uint8_t v) -// { -// char buf[4]; - -// buf[0] = (char)('0' + (v / 100) % 10); -// buf[1] = (char)('0' + (v / 10) % 10); -// buf[2] = (char)('0' + v % 10); -// buf[3] = 0; -// setcolor(WHITE); -// setfillstyle(SOLID_FILL, BLACK); -// bar(0, 0, 27, 9); -// outtextxy(2, 1, buf); -// } - -static void show_fps(uint8_t v) -{ - uint8_t color = BLACK; - setfillstyle(SOLID_FILL, color); - bar(0, 2, 60, 5); - if(v < 30) { - color = RED; - } else if(v < 40) { - color = BLUE; - } else if(v < 47) { - color = MAGENTA; - } else if(v < 52) { - color = CYAN; - } else { - color = YELLOW; - } - setfillstyle(SOLID_FILL, color); - bar(0, 2, v, 5); -} - -static void draw_field(void) -{ - int i; - - srand(4321); - setfillstyle(SOLID_FILL, GREEN); - bar(0, 0, 319, 255); - for (i = 0; i < 400; i++) - putpixel(rand() % 320, rand() % 244 + 12, - (i & 3) ? LIGHTGREEN : BROWN); - for (i = 0; i < 24; i++) { - int x = rand() % 312 + 4, y = rand() % 232 + 16; - putpixel(x, y, (i & 1) ? WHITE : YELLOW); - putpixel(x - 1, y, LIGHTGREEN); - putpixel(x + 1, y, LIGHTGREEN); - } - setfillstyle(SOLID_FILL, BLACK); - setcolor(BLACK); - line(0, 0, 0, 7); - line(10, 0, 10, 7); - line(20, 0, 20, 7); - line(30, 0, 30, 7); - line(40, 0, 40, 7); - line(50, 0, 50, 7); - line(60, 0, 60, 7); - - setcolor(WHITE); - outtextxy(52, 3, "RPGPROF: border = frame profile, ESC"); -} - -int main(void) -{ - uint8_t i, page, hidden; - uint8_t frames = 0, last_sec, fps_val = 0, fps_draw = 0; - datetime_t dt; - - if (atlas_load(&at1, "bard1.atl") != 0 && - atlas_load(&at1, "a:\\bard1.atl") != 0) - return 1; - if (atlas_load(&at2, "bard2.atl") != 0 && - atlas_load(&at2, "a:\\bard2.atl") != 0) - return 1; - - initgraph(); - gfx_sprite_clip(0); - if (gfx_pal_fload(0, "bard.pal") < 0) - gfx_pal_fload(0, "a:\\bard.pal"); - gfx_pal_sync(); - gfx_sprite_ysort(YSORT_Y); - - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); - - for (i = 0; i < NCHR; i++) { - /* Персонажи циклом из двух атласов: 0-3 at1, 4-7 at2, 8-11 at1… - * (группы по 4 подряд — минимум смен W0-страницы за проход). */ - atlas_sprite_init(&sp[i], (i & 4) ? &at2 : &at1, (uint8_t)(i & 3)); - sp[i].x = 24 + (rand() % (MAXX - 48)); - sp[i].y = MINY + 8 + (rand() % (MAXY - MINY - 16)); - set_dir(i, (uint8_t)(rand() & 3)); - go_edge(i); - sprite_show(&sp[i]); - } - - for (page = 0; page < 2; page++) { - gfx_set_draw_page(page); - draw_field(); - sprite_update(sp, NCHR); - } - gfx_set_visible_page(0); - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); - last_sec = dt.second; - - for (;;) { - io_border = 2; /* синий: логика */ - if (kbhit() && getch() == 27) - break; - - for (i = 0; i < NCHR; i++) - if (!sprite_moving(&sp[i])) { - if (phase[i] == 0) - go_back_random(i); - else - turn_90(i); - } - - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden); - frames++; - getdatetime(&dt); - if (dt.second != last_sec) { - last_sec = dt.second; - fps_val = frames; - frames = 0; - fps_draw = 2; - } - if (fps_draw) { - fps_draw--; - show_fps(fps_val); - } - my_update(sp, NCHR); /* маркеры 2/4/6 внутри */ - io_border = 0; /* черный: ждём vsync */ - gfx_wait_vsync(); - gfx_set_visible_page(hidden); - } - - io_border = 0; - closegraph(); - atlas_free(&at2); - atlas_free(&at1); - return 0; -} diff --git a/examples/rpgwalk/rpgwalk.c b/examples/rpgwalk/rpgwalk.c deleted file mode 100644 index bd2687f..0000000 --- a/examples/rpgwalk/rpgwalk.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * rpgwalk — демо: 8 уникальных RPG-персонажей ходят по травяному полю. - * - * Спрайты — third_party/16x16-RPG-characters (bard, CC), два W0-атласа - * по 4 персонажа (12 кадров каждому не лезут в одну страницу на - * восьмерых); палитра — из PNG через gfx_pal_fload (слоты 0..15 EGA, - * 16+ цвета художника) + gfx_pal_sync для дабл-буфера. - * - * Лента персонажа: 12 кадров вертикально, dir*3 + кадр: - * dir 0 = вниз (на нас), 1 = влево, 2 = вправо, 3 = вверх; - * шаг ноги — sprite_anim(dir*3, dir*3+2, ANIM_PINGPONG) (маятник 0/1/2). - * - * Правила хождения (машина из двух фаз на sprite_moveto): - * фаза 0: идём ДО КРАЯ экрана; у края — разворот на 180° и - * фаза 1: идём до случайной точки (но не меньше ЧЕТВЕРТИ экрана); - * там — поворот на ±90° (случайно) и снова фаза 0. - * - * ESC — выход. - */ -#include -#include -#include -#include -#include -#include - -#define NCHR 15 -#define MINX 0 -#define MAXX (320 - 16) -#define MINY 14 /* под заголовком */ -#define MAXY (256 - 16) -#define QX 80 /* четверть экрана */ -#define QY 64 - -static atlas_t at1, at2; -static sprite_t sp[NCHR]; -static uint8_t dir[NCHR]; /* 0 вниз / 1 влево / 2 вправо / 3 вверх */ -static uint8_t phase[NCHR]; /* 0 = до края, 1 = до случайной точки */ - -/* Направление → шаг ноги той же скоростью (у всех чуть разной). */ -static void set_dir(uint8_t i, uint8_t d) -{ - dir[i] = d; -// sprite_anim(&sp[i], (uint8_t)(d * 3), (uint8_t)(d * 3 + 2), -// (uint8_t)(5 + (i & 3)), ANIM_PINGPONG); - sprite_anim(&sp[i], (uint8_t)(d * 3), (uint8_t)(d * 3 + 2), - (uint8_t)20, ANIM_PINGPONG); -} - -/* Идти до края экрана вдоль dir[i] (скорость: 1px, интервал 1-2). */ -static void go_edge(uint8_t i) -{ - sprite_t *s = &sp[i]; - int tx = s->x, ty = s->y; - - switch (dir[i]) { - case 0: ty = MAXY; break; - case 1: tx = MINX; break; - case 2: tx = MAXX; break; - default: ty = MINY; break; - } - sprite_moveto(s, tx, ty, 1, (uint8_t)(1 + (i & 1))); - phase[i] = 0; -} - -/* Развернуться на 180° и идти до случайной точки (≥ четверти экрана). */ -static void go_back_random(uint8_t i) -{ - sprite_t *s = &sp[i]; - int tx = s->x, ty = s->y, avail, dist; - uint8_t d = dir[i]; - - // d = (uint8_t)(d ^ ((d < 2) ? 3 : 1)); /* 0↔3, 1↔2 — разворот */ - d = 3 - d; /* 0↔3, 1↔2 — разворот */ - set_dir(i, d); - switch (d) { - case 0: avail = MAXY - s->y; dist = QY; break; - case 1: avail = s->x - MINX; dist = QX; break; - case 2: avail = MAXX - s->x; dist = QX; break; - default: avail = s->y - MINY; dist = QY; break; - } - if (avail > dist) - dist += rand() % (avail - dist + 1); - else - dist = avail; /* некуда — до края */ - switch (d) { - case 0: ty += dist; break; - case 1: tx -= dist; break; - case 2: tx += dist; break; - default: ty -= dist; break; - } - sprite_moveto(s, tx, ty, 1, (uint8_t)(1 + (i & 1))); - phase[i] = 1; -} - -/* Повернуть на ±90° (случайно) и идти до края. */ -static void turn_90(uint8_t i) -{ - uint8_t d = dir[i]; - uint8_t vert = (d == 0 || d == 3); - - set_dir(i, vert ? (uint8_t)(1 + (rand() & 1)) /* → влево/вправо */ - : (uint8_t)((rand() & 1) ? 0 : 3)); /* → вниз/вверх */ - go_edge(i); -} - -/* FPS-плашка слева-сверху: значение раз в секунду, рисуется на ОБЕИХ - * страницах (fps_draw = 2 кадра), банк 0x50 — heal её учитывает. */ -static void show_fps(uint8_t v) -{ - char buf[4]; - - buf[0] = (char)('0' + (v / 100) % 10); - buf[1] = (char)('0' + (v / 10) % 10); - buf[2] = (char)('0' + v % 10); - buf[3] = 0; - setcolor(WHITE); - setfillstyle(SOLID_FILL, BLACK); - bar(0, 0, 27, 9); - outtextxy(2, 1, buf); -} - -static void draw_field(void) -{ - int i; - - srand(4321); /* фон идентичен на обеих страницах */ - setfillstyle(SOLID_FILL, GREEN); - bar(0, 0, 319, 255); - for (i = 0; i < 400; i++) /* травинки */ - putpixel(rand() % 320, rand() % 244 + 12, - (i & 3) ? LIGHTGREEN : BROWN); - for (i = 0; i < 24; i++) { /* цветочки */ - int x = rand() % 312 + 4, y = rand() % 232 + 16; - putpixel(x, y, (i & 1) ? WHITE : YELLOW); - putpixel(x - 1, y, LIGHTGREEN); - putpixel(x + 1, y, LIGHTGREEN); - } - setcolor(WHITE); - outtextxy(52, 3, "RPGWALK: 8 bards on patrol, ESC"); -} - -int main(void) -{ - uint8_t i, page, hidden; - uint8_t frames = 0, last_sec, fps_val = 0, fps_draw = 0; - datetime_t dt; - - if (atlas_load(&at1, "bard1.atl") != 0 && - atlas_load(&at1, "a:\\bard1.atl") != 0) - return 1; - if (atlas_load(&at2, "bard2.atl") != 0 && - atlas_load(&at2, "a:\\bard2.atl") != 0) - return 1; - - initgraph(); - gfx_sprite_clip(0); /* маршруты в пределах */ - if (gfx_pal_fload(0, "bard.pal") < 0) - gfx_pal_fload(0, "a:\\bard.pal"); /* EGA + цвета PNG */ - gfx_pal_sync(); - - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); - - for (i = 0; i < NCHR; i++) { - /* Персонажи 0-3 из первого атласа, 4-7 из второго: спрайты - * лежат подряд по атласам — один OUT смены страницы на кадр. */ - atlas_sprite_init(&sp[i], (i < 4) ? &at1 : &at2, (uint8_t)(i & 3)); - sp[i].x = 24 + (rand() % (MAXX - 48)); - sp[i].y = MINY + 8 + (rand() % (MAXY - MINY - 16)); - set_dir(i, (uint8_t)(rand() & 3)); - go_edge(i); - sprite_show(&sp[i]); - } - - for (page = 0; page < 2; page++) { /* фон на обе страницы */ - gfx_set_draw_page(page); - draw_field(); - sprite_update(sp, NCHR); - } - gfx_set_visible_page(0); - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); - last_sec = dt.second; - - for (;;) { - if (kbhit()) { - int c = getch(); - if (c == 27) - break; - /* 1/2/3 — FPS-делитель: логический кадр = n vsync'ов. - * Скорость персонажей (пикселей на итерацию) не меняется, но - * итераций/сек делится на n — визуальная проверка стабильности - * тайминга (метр стоит ровно на 50/25/16). */ - if (c >= '1' && c <= '9') - gfx_set_fps_div((uint8_t)(c - '0')); - } - - for (i = 0; i < NCHR; i++) - if (!sprite_moving(&sp[i])) { - if (phase[i] == 0) - go_back_random(i); /* у края: разворот */ - else - turn_90(i); /* дошли: поворот ±90° */ - } - - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden); - frames++; - getdatetime(&dt); - if (dt.second != last_sec) { - last_sec = dt.second; - fps_val = frames; - frames = 0; - fps_draw = 2; - } - if (fps_draw) { - fps_draw--; - show_fps(fps_val); - } - sprite_update(sp, NCHR); - gfx_wait_vsync(); - gfx_set_visible_page(hidden); - } - - closegraph(); - atlas_free(&at2); - atlas_free(&at1); - return 0; -} diff --git a/examples/scroll/Makefile b/examples/scroll/Makefile deleted file mode 100644 index 13c1bda..0000000 --- a/examples/scroll/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -EXAMPLE := scroll -EXTRA_FLAGS ?= --gfx 256 -include $(CURDIR)/../sdk.mk diff --git a/examples/scroll/run.sh b/examples/scroll/run.sh deleted file mode 100755 index e9e8c78..0000000 --- a/examples/scroll/run.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -make clean -make run diff --git a/examples/scroll/scroll-impl-guide.md b/examples/scroll/scroll-impl-guide.md deleted file mode 100644 index 52d9380..0000000 --- a/examples/scroll/scroll-impl-guide.md +++ /dev/null @@ -1,226 +0,0 @@ -# Руководство: скроллинг-примитивы для libbgi - -Самодостаточное ТЗ на реализацию двух функций скролла в libbgi. Написано так, -чтобы реализовать с нуля без остального контекста. Итог изысканий по железу -Sprinter (см. §1) и разбора существующего кода libbgi (см. §3). - -**Что делаем:** `gfx_scroll_h` (горизонтальный — нужен Loom для комнат шире -320 px) и `gfx_scroll_v` (вертикальный — для симметрии API; Loom пока не -требует, высота комнат 144 < 256). - -**Где живёт:** расширение `C-Compiler/libbgi` — accel-leaf в `bgi256/`, -обёртка в `common/`, объявление в `include/gfx.h`. - -**СНАЧАЛА прочти §7 (блокеры).** Два пункта надо проверить в dev-MAME до -написания рабочего кода — если они не пройдут, схема «чистого фона» едет. - ---- - -## 1. Аппаратная модель (всё, что нужно знать) - -**Режим `0x81`: 320×256×256, chunky — 1 байт/пиксель.** Пиксель (x,y): CPU-адрес -`0xC000 + x`, строку выбирает **Port_Y** (порт `0x89`) `= y`. Горизонталь — в -адресе, вертикаль — в Port_Y. (Ссылка: `libbgi/include/gfx.h` шапка.) - -**Две видеостраницы различаются ТОЛЬКО базой строки:** page0 → `0xC000`, -page1 → `0xC140` (шаг `0x140` = 320). Обе адресуемы в W3 **одновременно**; -Port_Y и номера банков — общие для обеих. Значит: -> `dst_addr = src_addr + 0x140` копирует page0→page1 без ремаппинга W3. -> Со сдвигом: `dst = src ± 0x140 + dx`. - -**Банки (значение W3-страницы, порт `0xE2` = `0x50..0x5F`)** — режим ЗАПИСИ, -действует на все примитивы до смены (`libbgi/include/gfx.h`): -| Банк | Имя | Запись | Чтение | -|---|---|---|---| -| `0x50` | `GFX_BANK_NORMAL` | VRAM **+ ОЗУ-копия** | ОЗУ-копия | -| `0x54` | `GFX_BANK_NOSHADOW` | только VRAM | ОЗУ-копия | -| `0x58` | `GFX_BANK_TRANSPARENT` | VRAM, байт `0xFF` не пишется | ОЗУ-копия | -| `0x5C` | `GFX_BANK_SPRITE` | VRAM, `0xFF` не пишется | ОЗУ-копия | - -Чтение `#50..#5F` **всегда** отдаёт ОЗУ-копию (видео-ОЗУ write-only). `0xFF` — -аппаратно-прозрачный цвет (`GFX_TRANSPARENT`). - -**Акселератор** (`C-Compiler/docs/converted/accel_r.txt`): внутр. ОЗУ-буфер -1..256 байт. Управление опкодами-«NOP»: -- `LD B,B` — стоп; `LD D,D` затем `LD A,n` — размер блока (`n=0` → 256); -- `LD L,L` — **горизонтальная** копия (буфер ← `LD A,(HL)`; буфер → `LD (DE),A`); -- `LD A,A` (`0x7F`) — **вертикальная** копия (линии экрана, Port_Y шагает внутри - burst'а); -- `LD C,C` / `LD E,E` — fill (гориз./верт.). - -Скорость ≈ **байт / 7 мкс**. Полный экран 320×256 ≈ **26 мс** (это **>1 кадра** -@ 50 Гц — держать в уме, §9). На время работы акселератора — **DI** (меняется -система команд, ISR сломается). - ---- - -## 2. Ключевой инсайт: чистый фон достаётся бесплатно - -- Спрайты рисуются банком с битом 2 (`0x54`/`0x5C`) → **только VRAM**, - ОЗУ-копию не трогают. -- ⇒ ОЗУ-копия (`0x50`) любой страницы — это фон **без спрайтов**, всегда. -- ⇒ скролл-копия из `0x50` в `0x50` читает чистый фон и пишет VRAM+тень — это - **одновременно скролл И heal** целевой страницы (её старые спрайты затираются - сдвинутым фоном). - -Ровно так работает `gfx_heal` (частный случай `src==dst`, §3). Скролл — тот же -механизм, но `src != dst`. - ---- - -## 3. Что уже есть в libbgi — образцы для копирования - -| Файл | Что | Зачем образец | -|---|---|---| -| `bgi256/_bgi_copy_rows_raw.c` | гориз. leaf (`LD L,L`), src/dst + страйды, Port_Y на строку | ядро всех блитов; страйды, SMC, DI | -| `bgi256/_bgi_heal_rows_raw.c` | `src==dst==экран`, страйды 0 | спец-случай heal | -| `bgi256/_bgi_blit_cols_raw.c` | **верт. leaf** (`LD A,A`), колонка=burst, Port_Y сброс на колонку, `dst+=1` | **прямой образец для `scroll_h`** | -| `common/_gfx_heal_full.c` | клип по экрану + нарезка полос >256 + вызов leaf | образец обёртки-ядра | -| `common/gfx_heal.c` | save-банк → `0x50` → `_bgi_begin` → ядро → `_bgi_end` → restore | образец верхней обёртки | -| `docs/converted/accel_r.txt` | screen→screen верт. копия LDIR-идиомом, `dst=src+0x140` | канонический скролл-паттерн | - -Правило из `_bgi_copy_rows_raw`: **одна сторона копии — видео (в W3, строку даёт -Port_Y), другая может быть линейным буфером ВНЕ W3** (`< 0xC000`). Для скролла -обе стороны — видео (см. §4). - ---- - -## 4. `gfx_scroll_h` — горизонтальный (наш, приоритет) - -**Идиом: вертикальный режим `LD A,A`, проход по колонкам.** Высота playfield -(144) ≤ 256 → одна колонка = один burst, **резать 320-строку на 256+64 НЕ надо** -(главная причина брать верт. режим). Это доковый screen→screen паттерн -(`accel_r.txt`) + `_bgi_blit_cols_raw`. - -Параметры на колонку: -- `src = base(src_page) + x` — банк `0x50`, чтение = ОЗУ-копия = чистый фон; -- `dst = base(dst_page) + x + dx` — банк `0x50`, запись = VRAM + тень dst; -- `base`: page0 `0xC000`, page1 `0xC140`; -- размер блока = высота playfield (`h`, для Loom 144); -- Port_Y start = верх playfield (`y0`, для Loom 0); -- копируем `(w − |dx|)` колонок; вакантные `|dx|` колонок **не трогаем**. - -**Знак:** зафиксировать `dx > 0` = сдвиг вправо (открывается слева), `dx < 0` = -влево; вернуть открывшийся край в `*dirty`. - -**Порядок (по образцу докового LDIR-примера + `_bgi_blit_cols_raw`):** банда -колонок под DI → `LD D,D`/`LD A,h` (block) → `LD A,A` (верт. режим) → на колонку -`{ read col в accel; write col из accel; src++; dst++ }` → `EI`. При straight-copy -Port_Y авто-шагает (доковый LDIR его не трогает) — но `_bgi_blit_cols_raw` -сбрасывает Port_Y=`y0` на каждую колонку; **проверить, нужен ли сброс** (§7.1 -покажет). - -**Возврат:** `*dirty` = прямоугольник `|dx|` колонок с открывшегося края; -полосу не чистим — её дозаполняет вызывающий (в Loom — декодер EGA-страйпов). - -```c -/* Горизонтальный скролл playfield. Копирует чистый фон (ОЗУ-копия src_page) - со сдвигом dx в dst_page (обе стороны банк 0x50: запись бьёт VRAM+тень). - dx>0 — вправо. Вакантную полосу НЕ заполняет — возвращает в *dirty. */ -void gfx_scroll_h(uint8_t src_page, uint8_t dst_page, - const gfx_rect_t *area, int dx, gfx_rect_t *dirty); -``` - ---- - -## 5. `gfx_scroll_v` — вертикальный (симметрия; Loom не нужен) - -**Асимметрия железа:** горизонтальный сдвиг — это смещение CPU-адреса (src и dst -независимы) → легко. **Вертикальный сдвиг — это смещение Port_Y, а Port_Y один -на burst** → в простом LDIR-идиоме read и write идут с одного Port_Y, сдвига по -Y нет. Поэтому `scroll_v` сложнее `scroll_h`. Два пути: - -- **(A) менять Port_Y между fill и flush одного burst'а**: `OUT Port_Y=y_src`; - read col в accel; `OUT Port_Y=y_src+dy`; write col из accel. Требует, чтобы - accel-буфер пережил `OUT` между чтением и записью — **не доказано** доком/ - тестами (§7.3). Если пройдёт — симметрично `scroll_h`, верт. режим. -- **(B) безопасный fallback**: grab (video→RAM-буфер вне W3, гориз. режим), - затем blit (буфер→video со сдвигом Y — буферная сторона CPU-адресуема, сдвиг - любой). Два прохода + буфер, но заведомо работает. - -**Рекомендация:** реализовать (A), если §7.3 пройдёт; иначе (B). Делать -**последним** — для Loom не критично. API симметричный (`dy` вместо `dx`): - -```c -void gfx_scroll_v(uint8_t src_page, uint8_t dst_page, - const gfx_rect_t *area, int dy, gfx_rect_t *dirty); -``` - ---- - -## 6. Общие требования реализации - -- **DI по банде, НЕ один DI на весь проход.** Полный playfield ~14 мс под DI - порвёт будущий CBL-звук. Одна колонка (144 Б ≈ 20 мкс) — безопасное DI-окно; - резать проход на банды колонок/строк с `EI` между (как `_bgi_copy_rows_raw` - режет ≤16 строк). Пока звука нет — не критично, но заложить сразу. -- **Клип по `area`** (образец — `_gfx_heal_full`). -- **Буфер (если путь (B))** — вне W3 (`< 0xC000`). -- **Верхняя обёртка**: save банк → `gfx_set_bank(GFX_BANK_NORMAL)` → - `_bgi_begin()` → ядро → `_bgi_end()` → restore (образец — `gfx_heal.c`). -- **Размещение**: leaf `bgi256/_bgi_scroll_cols_raw.c` (+ `_rows_raw` для (A)), - обёртки `common/gfx_scroll_h.c` / `gfx_scroll_v.c`, объявления в - `include/gfx.h`. `gfx_rect_t` — если ещё нет, определить там же - (`int x,y,w,h`). -- **Для Loom (не требование к примитиву, но контекст)**: вызывающий держит - `dx` кратным 8 (ширина EGA-страйпа) → `dirty` = целые страйпы. Обёртка этому - не мешает, но и не навязывает. - ---- - -## 7. ПРОВЕРИТЬ ПЕРВЫМ — блокеры (dev-MAME) - -1. **Верт. режим (`LD A,A`) в банке `0x50` читает ОЗУ-копию (чистый фон) и - пишет VRAM+тень.** Гориз. heal это доказывает построчно; для верт. прохода — - прогон: нарисовать фон, поверх спрайт банком `0x5C`, сделать `scroll_h` на - dx>0, убедиться что спрайт **не размазался** (копировался фон, не VRAM со - спрайтом). Заодно выяснить, нужен ли сброс Port_Y на колонку (§4). -2. **ОЗУ-копия per-page или общая.** Ранний план дабл-буфера PoP исходил из - «теневая копия одна — общая»; **практикой это опровергнуто**: у каждой - страницы СВОЯ теневая ОЗУ-копия, heal берёт фон из копии той страницы, в - которую рисуем (`applications/PoP/roomtest/CLAUDE.md`, раздел - «Дабл-буфер»; `roomtest.c enter_room` рисует фон в обе страницы по - отдельности именно поэтому). Значит пинг-понг (§8) в принципе рабочий, - но перед опорой на него — подтвердить на своём коде: записать разный фон - в page0 и page1 банком `0x50`, сверить чтение обеих. -3. **(только для `scroll_v`, путь A)** accel-буфер переживает `OUT Port_Y` между - fill и flush одного burst'а. Доковый straight-copy этого не проверяет. - ---- - -## 8. Порядок кадра в Loom (контекст использования `scroll_h`) - -Пинг-понг двух страниц; спрайты в VRAM-only банк, поэтому тень каждой страницы -остаётся чистым фоном: - -1. `gfx_set_draw_page(B)` — B = скрытая; -2. `gfx_scroll_h(A, B, area, dx, &dirty)` — B получает сдвинутый чистый фон в - VRAM+тень; старые спрайты B затёрты (copy = heal); -3. декодировать EGA-страйпы фона в `dirty`, **банк `0x50`** (иначе тень B - останется с дырой — следующий скролл из B прочитает мусор); -4. вывести актора/спрайты в B, банк `0x5C`; -5. `gfx_wait_vsync()` → `gfx_set_visible_page(B)`. - -Следующий кадр: роли A/B меняются, читаем уже чистую тень B. Смаза нет by design -(§2). При `dx==0` (камера стоит) — обычный per-sprite `gfx_heal`, а не полная -копия. - ---- - -## 9. Бюджет и проверка корректности - -- 320×256 ≈ 26 мс (**>кадр**); playfield 320×144 ≈ **14–15 мс** (<кадр); скролл - копирует `(320−dx)` колонок → чуть меньше. Итого копия ~кадр + докод полосы + - спрайты; целевой бюджет ~2 кадра/шаг (plan.md §6). **Замерить на PoC-1** - маркерами `OUT (0xFE)` (до появления звука порт свободен). -- Корректность — визуально/дифф-тестом в dev-MAME. Фон-декодер уже проверен - диффом против ScummVM; скролл проверять на реальной комнате шире 320. - ---- - -## 10. Связанные документы - -`plan.md §6` (графика, скроллинг), `toolchain-requirements.md §1` (этот -примитив), `decisions.md`. Железо: `C-Compiler/docs/converted/accel_r.txt`, -`libbgi/include/gfx.h`, `C-Compiler/docs/sprite-api-design.md`, -`C-Compiler/docs/memory-management.md`. diff --git a/examples/scroll/scroll.c b/examples/scroll/scroll.c deleted file mode 100644 index 7be012f..0000000 --- a/examples/scroll/scroll.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * scroll — визуальная проверка скролл-примитивов libbgi (gfx_scroll_h / - * gfx_scroll_v). Копирует регион из НЕактивной страницы в активную со - * сдвигом и переключает страницы. - * - * ДИАГНОСТИКА. Страница 0 — диагональные полосы color=((x+y)>>3)&15 - * (любой сдвиг ломает непрерывность диагоналей; фаза по Y ловит - * вертикальный «съезд» Port_Y-квирка). Страница 1 — сплошной серый - * фон-маркер: после скролла на нём проступают ровно скопированные - * прямоугольники, по их границам видно корректность (позицию/высоту). - * - * Два региона в одном кадре: слева ГОРИЗОНТАЛЬНЫЙ скролл (dx>0 — картинка - * вправо, открывается серая полоса слева), справа ВЕРТИКАЛЬНЫЙ (dy>0 — - * вниз, открывается серая полоса сверху). Если верт. Port_Y-квирк не - * вылечен — правый прямоугольник съедет вниз/опустеет сверху. Esc — - * выход. - */ - -#include -#include -#include -#include - -static uint8_t egapal[16 * 4]; - -__sfr __at (0xFE) io_border; - -/* Диагональные полосы 16-цветной палитры (8-пиксельные ступени). */ -static void draw_diagonals(void) -{ - int bx, by; - for (by = 0; by < 256; by += 8) - for (bx = 0; bx < 320; bx += 8) { - setfillstyle(SOLID_FILL, (((bx + by) >> 3) & 15)); - bar(bx, by, bx + 7, by + 7); - } -} - -/* Регион горизонтального скролла (слева) и вертикального (справа). */ -static gfx_rect_t area_h = { 0, 56, 320, 144 }; -// static gfx_rect_t area_h = { 16, 48, 80, 80 }; -// static gfx_rect_t area_v = { 176, 48, 80, 80 }; - -int main(void) -{ - uint8_t hidden; - - initgraph(); - - /* Палитра страницы 1 = палитре страницы 0 (initgraph грузит EGA - * только в палитру 0). */ - gfx_pal_get(0, 0, 16, egapal); - gfx_pal_load(1, 0, 16, egapal); - - /* Страница 0 — диагонали (источник фона). */ - gfx_set_draw_page(0); - draw_diagonals(); - - gfx_set_draw_page(1); - draw_diagonals(); - - gfx_set_visible_page(0); - - /* Рисуем на скрытой странице (1), потом флип. */ - hidden = gfx_get_visible_page() ^ 1; /* = 1 */ - gfx_set_draw_page(hidden); - - - - for (;;) { - if (kbhit() && getch() == 27) - break; - io_border = 2; - gfx_scroll_v(&area_h, 2, 0); /* вправо на 48 px */ - // gfx_scroll_v(&area_v, 2, 0); /* вниз на 48 px */ - io_border = 0; - gfx_wait_vsync(); - gfx_wait_vsync(); - - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden ^ 1); - gfx_set_visible_page(hidden); - } - - closegraph(); - return 0; -} diff --git a/examples/sdk.mk b/examples/sdk.mk deleted file mode 100644 index 66c24be..0000000 --- a/examples/sdk.mk +++ /dev/null @@ -1,8 +0,0 @@ -# Общая привязка примеров к установленному Sprinter-CC. --include $(CURDIR)/../local.mk -SPRINTER_ROOT ?= $(if $(wildcard $(CURDIR)/../../bin/sprinter-cc),$(abspath $(CURDIR)/../..),) -ifeq ($(strip $(SPRINTER_ROOT)),) -$(error Задайте SPRINTER_ROOT или создайте Examples/local.mk) -endif -PROJ_ROOT := $(SPRINTER_ROOT) -include $(PROJ_ROOT)/app.mk diff --git a/examples/space/.gitignore b/examples/space/.gitignore deleted file mode 100644 index 948892b..0000000 --- a/examples/space/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -space.atl -*.raw diff --git a/examples/space/Makefile b/examples/space/Makefile deleted file mode 100644 index 35b13ef..0000000 --- a/examples/space/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -EXAMPLE := space -EXTRA_FLAGS ?= --gfx 256 --memory tiny -EXTRA_DATA := space.atl -include $(CURDIR)/../sdk.mk - -# Атлас: три ленты 16×16×4 (астероид/взрыв/маяк) → одна EMM-страница. -space.atl: gen_sprites.py $(PROJ_ROOT)/toolchain/mkatlas.py - python3 gen_sprites.py - python3 $(PROJ_ROOT)/toolchain/mkatlas.py $@ \ - asteroid.raw:16x16:1x4 explode.raw:16x16:1x4 beacon.raw:16x16:1x4 - -$(EXAMPLE).exe: space.atl diff --git a/examples/space/gen_sprites.py b/examples/space/gen_sprites.py deleted file mode 100644 index e8670e7..0000000 --- a/examples/space/gen_sprites.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -"""Генератор спрайтов для examples/space (raw-ленты для mkatlas.py). - -asteroid.raw — 16×16×4 (LOOP): серый астероид, кратеры вращаются по -фазам (шаг 22.5°). -explode.raw — 16×16×4 (ONCE): расширяющийся взрыв (жёлтое ядро → -кольца → разлёт искр). -beacon.raw — 16×16×4 (PINGPONG): пульсирующий маяк (крест с -растущим свечением). - -Палитра — дефолтная EGA (индексы 0..15), 0xFF = прозрачно. -""" -import math - -T = 0xFF # прозрачный -W = H = 16 -CX = CY = 7.5 - - -def blank(): - return [[T] * W for _ in range(H)] - - -def disc(px, cx, cy, r, c): - for y in range(H): - for x in range(W): - if (x - cx) ** 2 + (y - cy) ** 2 <= r * r: - px[y][x] = c - - -def ring(px, cx, cy, r, c): - for a in range(0, 360, 4): - x = int(round(cx + r * math.cos(math.radians(a)))) - y = int(round(cy + r * math.sin(math.radians(a)))) - if 0 <= x < W and 0 <= y < H: - px[y][x] = c - - -def dot(px, x, y, c): - if 0 <= x < W and 0 <= y < H: - px[int(y)][int(x)] = c - - -def asteroid(phase): - px = blank() - disc(px, CX, CY, 6.8, 7) # LIGHTGRAY тело - ring(px, CX, CY, 6.8, 8) # DARKGRAY контур - for i in range(3): # кратеры на орбите - a = math.radians(phase * 22.5 + i * 120) - disc(px, CX + 3.6 * math.cos(a), CY + 3.6 * math.sin(a), 1.4, 8) - dot(px, CX - 2, CY - 3, 15) # блик WHITE - return px - - -def explode(phase): - px = blank() - if phase == 0: - disc(px, CX, CY, 2.2, 14) # YELLOW ядро - elif phase == 1: - disc(px, CX, CY, 3.8, 14) - ring(px, CX, CY, 4.6, 12) # LIGHTRED - elif phase == 2: - ring(px, CX, CY, 4.2, 14) - ring(px, CX, CY, 6.0, 12) - ring(px, CX, CY, 7.0, 4) # RED - else: - for a in range(0, 360, 30): # разлёт искр - r = 6.5 - dot(px, CX + r * math.cos(math.radians(a)), - CY + r * math.sin(math.radians(a)), 4) - dot(px, CX + 4 * math.cos(math.radians(a + 15)), - CY + 4 * math.sin(math.radians(a + 15)), 6) # BROWN - return px - - -def beacon(phase): - px = blank() - r = 2 + phase * 1.6 - for d in range(int(r) + 1): # крест-лучи - for xx, yy in ((CX - d, CY), (CX + d, CY), (CX, CY - d), (CX, CY + d)): - dot(px, round(xx), round(yy), 11) # LIGHTCYAN - disc(px, CX, CY, 1.4, 15) # WHITE ядро - if phase >= 2: - ring(px, CX, CY, r + 1, 9) # LIGHTBLUE ореол - return px - - -def save(name, frames): - with open(name, "wb") as f: - for fr in frames: - for row in fr: - f.write(bytes(row)) - print(f"gen_sprites: {name} ({len(frames)} кадров)") - - -save("asteroid.raw", [asteroid(k) for k in range(4)]) -save("explode.raw", [explode(k) for k in range(4)]) -save("beacon.raw", [beacon(k) for k in range(4)]) diff --git a/examples/space/space.c b/examples/space/space.c deleted file mode 100644 index 98c3f82..0000000 --- a/examples/space/space.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * space — демо всего спрайтового стека libbgi (2026-07-13): - * - * .atl-атлас с диска (mkatlas.py) → EMM-страница, подключаемая в W0 - * (atlas_load: ISR-стаб, ESTEX READ в W3) → движок sprite_t.page - * (sprite_update сам мапит страницу на блит-проход) → авто-анимации: - * - * - 5 астероидов: кадровая ANIM_LOOP (вращение, 4 кадра) + - * sprite_moveto к случайным целям с разными скоростями; - * по прибытии (sprite_moving()==0) — ВЗРЫВ в точке + новая цель; - * - 5 взрывов: ANIM_ONCE (4 кадра); по SPR_ANIM_DONE — sprite_hide; - * - маяк: ANIM_PINGPONG (пульс 0..3..0); - * - дабл-буфер: фон (звёзды + планеты) на обеих страницах, кадр = - * sprite_update на скрытой + vsync + флип; FPS-метр. - * - * Цели держатся в пределах экрана → gfx_sprite_clip(0) (noclip-ядра). - * ESC — выход. - */ -#include -#include -#include -#include -#include -#include - -#define NAST 5 /* астероиды: sp[0..4] */ -#define NEX NAST /* взрывы: sp[5..9] */ -#define IBEAC (NAST + NEX) /* маяк: sp[10] */ -#define NSPR (IBEAC + 1) - -#define MAXX (320 - 16) -#define MAXY (256 - 16) - -static atlas_t at; -static sprite_t sp[NSPR]; - -/* Случайная точка в пределах экрана (модуль — не горячий путь). */ -static int rnd_x(void) { return rand() % (MAXX - 32) + 16; } -static int rnd_y(void) { return rand() % (MAXY - 48) + 32; } - -/* Новая цель астероиду i: скорость по номеру (шаг 1..3, интервал 1..2). */ -static void new_target(uint8_t i) -{ - sprite_moveto(&sp[i], rnd_x(), rnd_y(), - (uint8_t)(1 + i % 3), (uint8_t)(1 + (i & 1))); -} - -static void draw_space(void) -{ - int i; - - /* Фон обязан быть ИДЕНТИЧЕН на обеих страницах (иначе флип 25 Гц - * мерцает разными звёздами) — фиксированный seed на отрисовку. */ - srand(1234); - - cleardevice(); - setfillstyle(SOLID_FILL, BLUE); /* планеты */ - fillellipse(60, 200, 26, 26); - setfillstyle(SOLID_FILL, LIGHTBLUE); - fillellipse(60, 200, 18, 18); - setfillstyle(SOLID_FILL, BROWN); - fillellipse(270, 190, 14, 14); - - for (i = 0; i < 90; i++) /* звёзды */ - putpixel(rand() % 320, rand() % 256, - (i & 3) ? DARKGRAY : WHITE); - - setcolor(WHITE); - outtextxy(36, 4, "SPACE: atlas W0 + auto-anim, ESC"); -} - -#define FPS_METER 1 -#if FPS_METER -static void show_fps(uint8_t v) -{ - char buf[4]; - - buf[0] = (char)('0' + (v / 100) % 10); - buf[1] = (char)('0' + (v / 10) % 10); - buf[2] = (char)('0' + v % 10); - buf[3] = 0; - setcolor(WHITE); - setfillstyle(SOLID_FILL, BLACK); - bar(0, 0, 27, 9); - outtextxy(2, 1, buf); -} -#endif - -int main(void) -{ - uint8_t i, page, hidden; - datetime_t dt; -#if FPS_METER - uint8_t frames = 0, last_sec, fps_val = 0, fps_draw = 0; -#endif - - if (atlas_load(&at, "space.atl") != 0 && - atlas_load(&at, "a:\\space.atl") != 0) - return 1; - - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); - - initgraph(); - gfx_sprite_clip(0); /* цели в пределах */ - - gfx_pal_sync(); /* обязательный шаг дабл-буфера (см. gfx.h) */ - - /* Спрайты: астероиды (LOOP + цель), взрывы (скрыты), маяк (PINGPONG). */ - for (i = 0; i < NAST; i++) { - atlas_sprite_init(&sp[i], &at, 0); - sp[i].x = rnd_x(); - sp[i].y = rnd_y(); - sprite_anim(&sp[i], 0, 3, (uint8_t)(4 + i), ANIM_LOOP); - new_target(i); - sprite_show(&sp[i]); - } - for (i = 0; i < NEX; i++) - atlas_sprite_init(&sp[NAST + i], &at, 1); - atlas_sprite_init(&sp[IBEAC], &at, 2); - sp[IBEAC].x = 292; sp[IBEAC].y = 20; - sprite_anim(&sp[IBEAC], 0, 3, 6, ANIM_PINGPONG); - sprite_show(&sp[IBEAC]); - - /* Фон на обеих страницах (ОЗУ-копия = бэкап для heal). */ - for (page = 0; page < 2; page++) { - gfx_set_draw_page(page); - draw_space(); - sprite_update(sp, NSPR); - } - gfx_set_visible_page(0); - getdatetime(&dt); - srand((unsigned)(dt.second * 77u + dt.minute)); /* цели — случайные */ -#if FPS_METER - getdatetime(&dt); - last_sec = dt.second; -#endif - - for (;;) { - if (kbhit() && getch() == 27) - break; - - /* Прибывшие астероиды: взрыв в точке + новая цель. */ - for (i = 0; i < NAST; i++) { - if (!sprite_moving(&sp[i])) { - sprite_t *ex = &sp[NAST + i]; - - sprite_move(ex, sp[i].x, sp[i].y); - sprite_anim(ex, 0, 3, 4, ANIM_ONCE); - sprite_show(ex); - new_target(i); - } - } - /* Отгоревшие взрывы — спрятать. */ - for (i = 0; i < NEX; i++) { - sprite_t *ex = &sp[NAST + i]; - - if ((sprite_anim_status(ex) & SPR_ANIM_DONE) && - (ex->flags & SPR_VISIBLE)) - sprite_hide(ex); - } - - hidden = gfx_get_visible_page() ^ 1; - gfx_set_draw_page(hidden); -#if FPS_METER - /* Свежую цифру рисовать на ОБЕИХ страницах (fps_draw = 2 кадра - * подряд) — иначе она живёт на одной и мерцает при флипе. */ - frames++; - getdatetime(&dt); - if (dt.second != last_sec) { - last_sec = dt.second; - fps_val = frames; - frames = 0; - fps_draw = 2; - } - if (fps_draw) { - fps_draw--; - show_fps(fps_val); - } -#endif - sprite_update(sp, NSPR); - gfx_wait_vsync(); - gfx_set_visible_page(hidden); - } - - closegraph(); - atlas_free(&at); - return 0; -} diff --git a/examples/third_party/16x16-RPG-characters/LICENSE b/examples/third_party/16x16-RPG-characters/LICENSE deleted file mode 100644 index 604209a..0000000 --- a/examples/third_party/16x16-RPG-characters/LICENSE +++ /dev/null @@ -1,359 +0,0 @@ -Creative Commons Legal Code - -Attribution-ShareAlike 3.0 Unported - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR - DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE -COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY -COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS -AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY -BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS -CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. - -1. Definitions - - a. "Adaptation" means a work based upon the Work, or upon the Work and - other pre-existing works, such as a translation, adaptation, - derivative work, arrangement of music or other alterations of a - literary or artistic work, or phonogram or performance and includes - cinematographic adaptations or any other form in which the Work may be - recast, transformed, or adapted including in any form recognizably - derived from the original, except that a work that constitutes a - Collection will not be considered an Adaptation for the purpose of - this License. For the avoidance of doubt, where the Work is a musical - work, performance or phonogram, the synchronization of the Work in - timed-relation with a moving image ("synching") will be considered an - Adaptation for the purpose of this License. - b. "Collection" means a collection of literary or artistic works, such as - encyclopedias and anthologies, or performances, phonograms or - broadcasts, or other works or subject matter other than works listed - in Section 1(f) below, which, by reason of the selection and - arrangement of their contents, constitute intellectual creations, in - which the Work is included in its entirety in unmodified form along - with one or more other contributions, each constituting separate and - independent works in themselves, which together are assembled into a - collective whole. A work that constitutes a Collection will not be - considered an Adaptation (as defined below) for the purposes of this - License. - c. "Creative Commons Compatible License" means a license that is listed - at https://creativecommons.org/compatiblelicenses that has been - approved by Creative Commons as being essentially equivalent to this - License, including, at a minimum, because that license: (i) contains - terms that have the same purpose, meaning and effect as the License - Elements of this License; and, (ii) explicitly permits the relicensing - of adaptations of works made available under that license under this - License or a Creative Commons jurisdiction license with the same - License Elements as this License. - d. "Distribute" means to make available to the public the original and - copies of the Work or Adaptation, as appropriate, through sale or - other transfer of ownership. - e. "License Elements" means the following high-level license attributes - as selected by Licensor and indicated in the title of this License: - Attribution, ShareAlike. - f. "Licensor" means the individual, individuals, entity or entities that - offer(s) the Work under the terms of this License. - g. "Original Author" means, in the case of a literary or artistic work, - the individual, individuals, entity or entities who created the Work - or if no individual or entity can be identified, the publisher; and in - addition (i) in the case of a performance the actors, singers, - musicians, dancers, and other persons who act, sing, deliver, declaim, - play in, interpret or otherwise perform literary or artistic works or - expressions of folklore; (ii) in the case of a phonogram the producer - being the person or legal entity who first fixes the sounds of a - performance or other sounds; and, (iii) in the case of broadcasts, the - organization that transmits the broadcast. - h. "Work" means the literary and/or artistic work offered under the terms - of this License including without limitation any production in the - literary, scientific and artistic domain, whatever may be the mode or - form of its expression including digital form, such as a book, - pamphlet and other writing; a lecture, address, sermon or other work - of the same nature; a dramatic or dramatico-musical work; a - choreographic work or entertainment in dumb show; a musical - composition with or without words; a cinematographic work to which are - assimilated works expressed by a process analogous to cinematography; - a work of drawing, painting, architecture, sculpture, engraving or - lithography; a photographic work to which are assimilated works - expressed by a process analogous to photography; a work of applied - art; an illustration, map, plan, sketch or three-dimensional work - relative to geography, topography, architecture or science; a - performance; a broadcast; a phonogram; a compilation of data to the - extent it is protected as a copyrightable work; or a work performed by - a variety or circus performer to the extent it is not otherwise - considered a literary or artistic work. - i. "You" means an individual or entity exercising rights under this - License who has not previously violated the terms of this License with - respect to the Work, or who has received express permission from the - Licensor to exercise rights under this License despite a previous - violation. - j. "Publicly Perform" means to perform public recitations of the Work and - to communicate to the public those public recitations, by any means or - process, including by wire or wireless means or public digital - performances; to make available to the public Works in such a way that - members of the public may access these Works from a place and at a - place individually chosen by them; to perform the Work to the public - by any means or process and the communication to the public of the - performances of the Work, including by public digital performance; to - broadcast and rebroadcast the Work by any means including signs, - sounds or images. - k. "Reproduce" means to make copies of the Work by any means including - without limitation by sound or visual recordings and the right of - fixation and reproducing fixations of the Work, including storage of a - protected performance or phonogram in digital form or other electronic - medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, -limit, or restrict any uses free from copyright or rights arising from -limitations or exceptions that are provided for in connection with the -copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, -Licensor hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license to -exercise the rights in the Work as stated below: - - a. to Reproduce the Work, to incorporate the Work into one or more - Collections, and to Reproduce the Work as incorporated in the - Collections; - b. to create and Reproduce Adaptations provided that any such Adaptation, - including any translation in any medium, takes reasonable steps to - clearly label, demarcate or otherwise identify that changes were made - to the original Work. For example, a translation could be marked "The - original work was translated from English to Spanish," or a - modification could indicate "The original work has been modified."; - c. to Distribute and Publicly Perform the Work including as incorporated - in Collections; and, - d. to Distribute and Publicly Perform Adaptations. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor - reserves the exclusive right to collect such royalties for any - exercise by You of the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme can be waived, the Licensor waives the - exclusive right to collect such royalties for any exercise by You - of the rights granted under this License; and, - iii. Voluntary License Schemes. The Licensor waives the right to - collect royalties, whether individually or, in the event that the - Licensor is a member of a collecting society that administers - voluntary licensing schemes, via that society, from any exercise - by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now -known or hereafter devised. The above rights include the right to make -such modifications as are technically necessary to exercise the rights in -other media and formats. Subject to Section 8(f), all rights not expressly -granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made -subject to and limited by the following restrictions: - - a. You may Distribute or Publicly Perform the Work only under the terms - of this License. You must include a copy of, or the Uniform Resource - Identifier (URI) for, this License with every copy of the Work You - Distribute or Publicly Perform. You may not offer or impose any terms - on the Work that restrict the terms of this License or the ability of - the recipient of the Work to exercise the rights granted to that - recipient under the terms of the License. You may not sublicense the - Work. You must keep intact all notices that refer to this License and - to the disclaimer of warranties with every copy of the Work You - Distribute or Publicly Perform. When You Distribute or Publicly - Perform the Work, You may not impose any effective technological - measures on the Work that restrict the ability of a recipient of the - Work from You to exercise the rights granted to that recipient under - the terms of the License. This Section 4(a) applies to the Work as - incorporated in a Collection, but this does not require the Collection - apart from the Work itself to be made subject to the terms of this - License. If You create a Collection, upon notice from any Licensor You - must, to the extent practicable, remove from the Collection any credit - as required by Section 4(c), as requested. If You create an - Adaptation, upon notice from any Licensor You must, to the extent - practicable, remove from the Adaptation any credit as required by - Section 4(c), as requested. - b. You may Distribute or Publicly Perform an Adaptation only under the - terms of: (i) this License; (ii) a later version of this License with - the same License Elements as this License; (iii) a Creative Commons - jurisdiction license (either this or a later license version) that - contains the same License Elements as this License (e.g., - Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible - License. If you license the Adaptation under one of the licenses - mentioned in (iv), you must comply with the terms of that license. If - you license the Adaptation under the terms of any of the licenses - mentioned in (i), (ii) or (iii) (the "Applicable License"), you must - comply with the terms of the Applicable License generally and the - following provisions: (I) You must include a copy of, or the URI for, - the Applicable License with every copy of each Adaptation You - Distribute or Publicly Perform; (II) You may not offer or impose any - terms on the Adaptation that restrict the terms of the Applicable - License or the ability of the recipient of the Adaptation to exercise - the rights granted to that recipient under the terms of the Applicable - License; (III) You must keep intact all notices that refer to the - Applicable License and to the disclaimer of warranties with every copy - of the Work as included in the Adaptation You Distribute or Publicly - Perform; (IV) when You Distribute or Publicly Perform the Adaptation, - You may not impose any effective technological measures on the - Adaptation that restrict the ability of a recipient of the Adaptation - from You to exercise the rights granted to that recipient under the - terms of the Applicable License. This Section 4(b) applies to the - Adaptation as incorporated in a Collection, but this does not require - the Collection apart from the Adaptation itself to be made subject to - the terms of the Applicable License. - c. If You Distribute, or Publicly Perform the Work or any Adaptations or - Collections, You must, unless a request has been made pursuant to - Section 4(a), keep intact all copyright notices for the Work and - provide, reasonable to the medium or means You are utilizing: (i) the - name of the Original Author (or pseudonym, if applicable) if supplied, - and/or if the Original Author and/or Licensor designate another party - or parties (e.g., a sponsor institute, publishing entity, journal) for - attribution ("Attribution Parties") in Licensor's copyright notice, - terms of service or by other reasonable means, the name of such party - or parties; (ii) the title of the Work if supplied; (iii) to the - extent reasonably practicable, the URI, if any, that Licensor - specifies to be associated with the Work, unless such URI does not - refer to the copyright notice or licensing information for the Work; - and (iv) , consistent with Ssection 3(b), in the case of an - Adaptation, a credit identifying the use of the Work in the Adaptation - (e.g., "French translation of the Work by Original Author," or - "Screenplay based on original Work by Original Author"). The credit - required by this Section 4(c) may be implemented in any reasonable - manner; provided, however, that in the case of a Adaptation or - Collection, at a minimum such credit will appear, if a credit for all - contributing authors of the Adaptation or Collection appears, then as - part of these credits and in a manner at least as prominent as the - credits for the other contributing authors. For the avoidance of - doubt, You may only use the credit required by this Section for the - purpose of attribution in the manner set out above and, by exercising - Your rights under this License, You may not implicitly or explicitly - assert or imply any connection with, sponsorship or endorsement by the - Original Author, Licensor and/or Attribution Parties, as appropriate, - of You or Your use of the Work, without the separate, express prior - written permission of the Original Author, Licensor and/or Attribution - Parties. - d. Except as otherwise agreed in writing by the Licensor or as may be - otherwise permitted by applicable law, if You Reproduce, Distribute or - Publicly Perform the Work either by itself or as part of any - Adaptations or Collections, You must not distort, mutilate, modify or - take other derogatory action in relation to the Work which would be - prejudicial to the Original Author's honor or reputation. Licensor - agrees that in those jurisdictions (e.g. Japan), in which any exercise - of the right granted in Section 3(b) of this License (the right to - make Adaptations) would be deemed to be a distortion, mutilation, - modification or other derogatory action prejudicial to the Original - Author's honor and reputation, the Licensor will waive or not assert, - as appropriate, this Section, to the fullest extent permitted by the - applicable national law, to enable You to reasonably exercise Your - right under Section 3(b) of this License (right to make Adaptations) - but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR -OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY -KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, -INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, -FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF -LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, -WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION -OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE -LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR -ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES -ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - a. This License and the rights granted hereunder will terminate - automatically upon any breach by You of the terms of this License. - Individuals or entities who have received Adaptations or Collections - from You under this License, however, will not have their licenses - terminated provided such individuals or entities remain in full - compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will - survive any termination of this License. - b. Subject to the above terms and conditions, the license granted here is - perpetual (for the duration of the applicable copyright in the Work). - Notwithstanding the above, Licensor reserves the right to release the - Work under different license terms or to stop distributing the Work at - any time; provided, however that any such election will not serve to - withdraw this License (or any other license that has been, or is - required to be, granted under the terms of this License), and this - License will continue in full force and effect unless terminated as - stated above. - -8. Miscellaneous - - a. Each time You Distribute or Publicly Perform the Work or a Collection, - the Licensor offers to the recipient a license to the Work on the same - terms and conditions as the license granted to You under this License. - b. Each time You Distribute or Publicly Perform an Adaptation, Licensor - offers to the recipient a license to the original Work on the same - terms and conditions as the license granted to You under this License. - c. If any provision of this License is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of - the remainder of the terms of this License, and without further action - by the parties to this agreement, such provision shall be reformed to - the minimum extent necessary to make such provision valid and - enforceable. - d. No term or provision of this License shall be deemed waived and no - breach consented to unless such waiver or consent shall be in writing - and signed by the party to be charged with such waiver or consent. - e. This License constitutes the entire agreement between the parties with - respect to the Work licensed here. There are no understandings, - agreements or representations with respect to the Work not specified - here. Licensor shall not be bound by any additional provisions that - may appear in any communication from You. This License may not be - modified without the mutual written agreement of the Licensor and You. - f. The rights granted under, and the subject matter referenced, in this - License were drafted utilizing the terminology of the Berne Convention - for the Protection of Literary and Artistic Works (as amended on - September 28, 1979), the Rome Convention of 1961, the WIPO Copyright - Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 - and the Universal Copyright Convention (as revised on July 24, 1971). - These rights and subject matter take effect in the relevant - jurisdiction in which the License terms are sought to be enforced - according to the corresponding provisions of the implementation of - those treaty provisions in the applicable national law. If the - standard suite of rights granted under applicable copyright law - includes additional rights not granted under this License, such - additional rights are deemed to be included in the License; this - License is not intended to restrict the license of any rights under - applicable law. - - -Creative Commons Notice - - Creative Commons is not a party to this License, and makes no warranty - whatsoever in connection with the Work. Creative Commons will not be - liable to You or any party on any legal theory for any damages - whatsoever, including without limitation any general, special, - incidental or consequential damages arising in connection to this - license. Notwithstanding the foregoing two (2) sentences, if Creative - Commons has expressly identified itself as the Licensor hereunder, it - shall have all rights and obligations of Licensor. - - Except for the limited purpose of indicating to the public that the - Work is licensed under the CCPL, Creative Commons does not authorize - the use by either party of the trademark "Creative Commons" or any - related trademark or logo of Creative Commons without the prior - written consent of Creative Commons. Any permitted use will be in - compliance with Creative Commons' then-current trademark usage - guidelines, as may be published on its website or otherwise made - available upon request from time to time. For the avoidance of doubt, - this trademark restriction does not form part of the License. - - Creative Commons may be contacted at https://creativecommons.org/. diff --git a/examples/third_party/16x16-RPG-characters/README.md b/examples/third_party/16x16-RPG-characters/README.md deleted file mode 100644 index b3b78a0..0000000 --- a/examples/third_party/16x16-RPG-characters/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# 16x16 RPG characters `v3.0` - -16x16px RPG character sprite sheet for up to down games. - -This asset pack has been downloaded from https://route1rodent.itch.io/16x16-rpg-character-sprite-sheet - -Adapted from opengameart.org 's "[NES-Style RPG Characters](https://opengameart.org/content/nes-style-rpg-characters)" and "[More NES-style RPG Characters](https://opengameart.org/content/more-nes-style-rpg-characters)", with additional content made by [@route1rodent](https://route1rodent.itch.io). - -## License - -16x16 RPG character sprite sheet (c) by @route1rodent - -"16x16 RPG character sprite sheet" is licensed under a -Creative Commons Attribution-ShareAlike 3.0 Unported License (CC BY-SA 3.0). - -You should have received a copy of the license along with this -work. If not, see http://creativecommons.org/licenses/by-sa/3.0/. - - -## Credits - -Maintained by @route1rodent: - -- itch.io: https://route1rodent.itch.io -- Twitter: https://twitter.com/route1rodent -- Github: https://github.com/itsjavi -- Blog: https://blog.itsjavi.com diff --git a/examples/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png b/examples/third_party/16x16-RPG-characters/sprites/old-style/02-bard.png deleted file mode 100644 index 98bf1c74f65525aaaca2783040619e148fe7ecca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7830 zcmaKx2T)U6*Mxh0ivno+}xo7xIIK3I7tp0eWq&p!2cXqPLt_0DPqqI)M zT6P*QKyy(WgMhQs2aldp5+<0;;#U2`9J`t-3xBii+67I_gw>Z?1{@ z31QGVX`4Px5n_L9N(?taD}P5V<%S#k*~Pv=FW(1TOYC>>pHKcy!q{gIk#<}@HEFCN zh%1{b-FK+sG*!^D%No6JoUukvyvg4&MNTv%_@d2Ook27#gZ@*0VZ% zWBbocJMWUW8uB2a4{2VN%vJ7hjMqs;6cBoEWq?jy zTiJs7`GulCsx+BM?ZKxz|hA2n421l#jg0>eui&$OnpI zGo6;2-MtdAamc|D zYT5m6Su*#;pE=&3JS8E_LU0Yq2dgil+IU!6-`9#vcBMV$ED6x?RHVIW57q{X(9#g& z0fhbS&c{GQ&NAF{MQ9QCd}|m*)qY$pyGB4%J$%>y>QHMA#mWc-mv@-GTG25tI5!;cRL_PuqAh@aDudP(a)rnINtB2^X^PfJ~Cs=~KgH z4=1|z=^L_%3t<87ta%W(4$mqkCr`ZX#?~zp}HXf?&A8{#$H=n4jDa@g!kRA zj%z2Q<4Q!F_(WSnR!Nh3Ng7#Gv)|AYFhS8hs~Jobv%Bl8bbXUX(VU`T6qGjei%PzG zXWq_sg+woIkLq>9r8O_xjMgj6GYCf#F0nqnarHu81l;Cu?3q$%fW2s~Ye+~?#t9D@ z=$QEf`0@)V!v-hWdkU!s^P#N%+?SH+h5GT`fUYlxlzlX{tJ&H}Zn%AXCoHXHxfBHT zqWTl5Q>5axA>9waViB;>qqV-2lA%lR*2sPm@cvMm+;g$#oesW^RrLCR`-T?o$>{l( zEz$}M&}_3=w_W@=!c43AsfJ_%f0h)(dkNXbm9ai_6Pt9k8$aF9$*_Q>m}$ZK8R_;3 z^irDHl#{=RwbU$enQRxfUyXhWCmgC!@hv?k@rnsvLbkt1MRMcEqd5DRNW2njv$_Z> zJCm=w&CH{es7~h|w4ozx}vcG-j3j1i9;)%9b#v)h~gPfyyn#+?yv|@=R{6)M|vtXh4XhL z4mIS7Pd7}zU8nn8qzTY;*T2rQ%_$@y?l{VXIl$hoGpXZ=2tu$AKRt27i}8T`xS$Y; zk4inImVwUALWJ#Zc6*+Nal*uM+kIk%Fg9I8)bYfnZFgk$piduE8a)kaNj@6X(Nvrz z>~@D#7PPudi!M3`lYyNr+jvare2SdP*x`OG;}fqVPD|x!P5QXwH|Vmh9i+82JdQ*Z zMv+nEr9;z8!(|-uC`$(|5~{I)^-jOWE1W3@o<1>}<}(2K)u`|~8ALt;YHrea>xPzf z@uXU@HR`x6d$`T|)qU8M?Nj$2trJ{#u}JyKJ0K0yk}*YukHq0Hfi+!Lz`(#mDubrPs8%)sw9l&R3f$bj*;$S8Hcur=xi#jwDXcV zPFBtAmvZmX%RCDr*94={1*!KQG!`xtiJlYxYgwD@0nW~vYqqeic`~L*R6B_pc0VGI zb{NE%83TUygAa06AmO{A5z`?lbK%vZfCNjK>oV>(MSLyR+(SKsJVl`QS#BtZHFrd( zbcz^Xb?NUMj-?>?C44N{zkJ#^U3oV~-cv2$3E0v#1)t&v6=o#kv#+D9DfbR4Z{16( zMk|S^wIQT0_XhXoTBy*ZFq#R@H3Sn}%gZJ#bYf z_TPe|duBc;zfn$9J%Z-@k@u9j^wm3uI@osp1uq_JNd;tvA-HDc?^?YmTd%#(AOCOw z@?;%kO%7}P+*EhV6}2;9jFH>qp5TU3OjY(pMN*k^1}yi+azSOy;hdA))r6|gvthlp zH#QnqVrK$a3*{rMr3a0IXpco&R=o}IXS{{nw>u-<21x<#^vTaKH|o;DOv@}7io#GO zp_@O}V|Ph{^L29fqxq#i{4}E~>&kwvttiagSUth*qJ{e0Wg)MnZbGyU-$18NYuF}Y z+t6+}GrXK`3gd*RxMFQ-e2tR~3x>h=uxg4=(P4Ki5*3^P%oEK7y2sOPD5ef)FxDJH zZSpR7K9HWK3TTLjTDQI5lUq-oKElse(&0%xl;V;J@-a%*?k%y@m$n z0NU|6zaTMD3ETTzQ{Ow{>NZxzQ1vI2htf)FS<5gbVJhJ@bj+!9Imm;ElU4t8!|P%6 z^VX+M)ppB^b+#S$B^`NO(#^rTA(EtdaehSOx=l8KM;_mi!f~Uf9oxtw?{h)4vDPLL z1g?iFZym%)Ms)P5qn6l5c0XnzWB8pnkG(0>>2)df3pdmR?6`p2^27`JQBdP+#$Qqp zb2E-Ixsw%_CaiJ7%}Pl=MIcAmh7L3!zgm@VQ0ns>sg7^h(<<3amUv+gV1@t*VUYuf zJjK#_TDCLv1R}IiT)UJ){vX0E{+84z%Z2?Egz>H`)1_Bu%E#V5_nyFsQNhMNz$wNh z`xtFqMrg!Q_!)%LEqLEu?vq#q?%q+|#d1)^HvbBnwXlE-+(-r$zRUhhrJ|sH-0Y9} z`XAOCg+6FHpMtR0J_Qo3qRY}AfY0Gt;D^Kc8ea)ECm%Sj#p+VTxoDOxZmrTqSi>Uj z6j)p=JWtGv)8iZ1QKm@M*QoJ}r^}9hK_EN=mA~Aggvz|ahxQQoy~lyhCEAI+dCq2% zcaNY?L_7u|aE1~uO4pw)lgA~s`y&k(>yVN{o(FkWK^`7Ucp@)oz`%$3zz$yD|I5o^ zh8`>>9q5L(dCFb&+jjmvWD2VQvjTzT8!L9pOUlK%%2Z8Sbik@L%cFLFvNC=uXCNzn zrA?k#HCjh6?u5FmK;`W7>BW+!e6TtB zr*GwVw{F<}5u6J=f6GAskmtCf#nC?u-7cnUJ$d#-K|Hk7MD@r$%z*<>tDSoR$dmB4SOoRnji z?Zx~)$<+vJuf_lixBtdmp?JaGfrdbs%{tiWwXcw+^Rosc~&&$izFguFn;3LQgGQ`ziPz<+h8fD z&l?dzoeq! z)Y@t|SIz=*)1l2~#zDu+}FWXB#&6Zm+73EKEp|^PpXJO?UUN zks!mtZt&pBhs*#Py@t8w{0$VMX>-dNjuKb&owo_o1mN-;8)_z5bwnJt+LCn)@edty zfRz2kA1+W`!l-owaeI}DzcnRTU^HicBxOo{+dF`?rEIzuC6Iw$ZkfLD>daO^Z~A@j z+m2q0OyCYGV8fFckogxpI~r0QnhdHTHk>}^iU+3(T?m%zY%JbQW#BjeMd9+fe6|<} zInr}$RkE_%=#BvtxlQJeSv6C9060}`GAo; zLf_-AYPHs;eT_mhoC>E0)e4uvw26A={%Gb_IXrbQlXi7IJ)K3L%=#G-+Czp{D|{>H z&VP_EUQTM5s-tTt~AVJ=GLpEs{ETedW4lNnK%kd-(*A z7SL>L&_X2V46JaQ{iyv=Ee9NBXN*+G^2uA}a~D2oW$Ymyz!LHB@2dx1dX_$B!;EQh z7}MOc8q)SpHtV}4f#OsE+2T77WQab=a84>E=gn7#2Q<_Mf)$P?$`9Xv7k-?fxPkxl zaJ?oD6Q4ptXUpDVs&g|}_W*SF=Oe^Ud|?^L{Tn6%FJ`T?O)R3M8Q%21q*SnXG--k* zKG?*xA=Dm0IV_UqD+t6daXn!r1Ev@-~nQq76VPNm=clD|!Jp!b`7|s3wHVD`o$MscXNh z&bG8Z0UCA>U~Bxv)h;wooYix4iTwj#P&=yUy?7lv9?7x?j-mkd9Nl%ra4t8Pn#08# zO}!oU+hJW;m1h0e7zdL4@-JEifvbKyz3BKGInT!rp=73AlHc3Ej`5CDd!tk0jM_1% z7HwbgT|V$qt*SRUz`wxkSJf#b;fLR1_aT7+Mpu5qFxfxwR>sfaao6w0!M< zTPMp=P3+B=RlveO(NrSGhIH6E@J6E&IC~*b`0)FC1veX$BmM6aKA#UvCREb>*bR;E z-<>x8GpmNKYVQW>Nb;8BLqesXY)e1V+@a=9(UM??_B?1n^_aM?_~(}|(sw5Q6JEz$ zT9*iyL`9|@Bi^0PXrN9`o3!VNdQxo&-?dtG4d3~E<=1Xsz*w}Nzb-Ax^w9A7@@Vhk zJsm*~(Y<7x0}D!fRX#2jeN!xj_WB^Bbe>sgsL6BNRA$QE|N5dUN?)^p+36C!6k5SBr^5kP+G0)Wj#u_@4T&Am4x)KJuKT+t`I#C;BlttwZkSb zd7CJ^s2WmNS}yr3ANowtlx?iV@!&>P*yNlnYf)6ObWhUcuJwk`KS--}<_FTgW7T^h z>Gs!WnrF5?9F}@XV_rfF$8d*RaM`DKbaQHsq=`@6fU2LsrpOA znHUVBk>%;9QU?+}PNoEWKMKEjAS2Ukv(deKkCOfhQjlyEO{j(xUU3n8B9X;1*yt-) zIlNHdQRI@R7cB5H_FE8(TN#W;ALWcn{{+wjYOnY~R?w>C!TmNwt4VeC2|ZNef(x%e zZ^Gc2JIu|Lgk<1 zxWj^XnUjNmV{6>pDG$l+yRR`Gu`FYqdK}k{Lt=Xp1~(h7HIZqFtk|ycy??niheX0q z2D$7SKV9MNKy=E3IAK!_{#XeTZrl#s%YvVtoUEfdL^XwBg)GW4P3Ipbl{azUpM=D@ zd!vIdOSK_zfsVP@OUX-Ll$0Si6M(Eud3O+uH17LvWc7hju5L08x?3VO*Elb+C>9LH zUUJF*&1y!TWp3awTeZt-6_QzOol*PS4SM1lmXPl4#t+deTOv#4stPaB@)7=QbGD-L zOsh?dWW_bH3|=AZKSJrI4{jy9vhPdzQtQetp*MPxEPI&vN=V<;6$U?n5Re&4OGh*9 z7Z+`w`TeR%+n!f~8D48#>^gNe4dc)*-lZ1Bzl>yh1vOeoE;`-reQk6tRjd8a^7f-+0lR76fJOh|G zUcpl*<57*f8@tc`;_AtemAciRB&%IbFXeTVc(_h8F#cPb-1SQAcWRB!{0BjWjc?Jp zcN3#NzrFGQqAIf}Z}$s^G2Q2FNDZ@iVpHflsz>$TK$myW$3I-moniofaH>m^YvR+o zRqc}6S|bj0@F5RQMv8Mv5ivdKU1&t&&ys(e1Q`dq`m$J+bww}0--QBHxA19fN!ti) z3nol6LU@0_4-iJtFaH6fYyJA`Y!%Q>vyQ0R*ALiA_5h_cnU_BZmXDgZ2e4{%mU6x} zbF&68@hcC@)M-X^Mkee5o;HMUN}XJC0}U+UPA^R^I!TSQj~(C1qgjCDf^s>6DbwcX zdIq^Ndpjis%f93pumHI6{WWQ{a!{hYrxv7H><64KK+D7HjCH>t1Ld4J86&;vg9v&2 z$g(L+nALZhxW~KHtA-qELrd^}R##YFvhk;=?&qMOlGXF#v}wDjDm7Uet7!fOq+l#E z*zsR-%}_*maKdEmS4xaISjJ{zg;C{u)U`8=Jgx;;nacz2U?kR9TM;h%KLc#i%q|AN z6lC8YGty6qWuyk0mKmQrql9&5cXw+SOlo-uLm9XY~H?f_> z+|j2-9g(FKW(M&M-YN-dyr(?XgTR7fWik^mQTx;2rNOn|hrxS^~z2bvaJqoVM=HML%XMg?Mp$5PURc|31Ji?%PFTiy z3fWp!@RVPm<=S0Il*upsEdNAsa#izyRD)SOL zmX)Wp-72T$M*VE$oP&WQ%SJ63U70floe6&ftqfXcTF!r)CCgjjOk;U5>bZ@l!w4@E z^yl_uO#tze!bKA0XeFfGgcx+jWJb0t8eyv;6#TgTv^H)jYicxQ`miH?Gp=rywq37X zC)JQ(XruyesCKgFs-x4Oj+X{FtRAhgjtPoIRQks2rba#;KU9}9E76tC(@GA=tZeu= z_GAYABfVSIkd8X-K*htw0%b(~_hf6U%h+2tC4=L?>~UNy0=)>;m}2ew8Cj;H&*K+I zY!a|a8sCXHn;oJ*+J)s1mDTe!1V__*@lr9YF0y{RNxFCvA`34I&RYG#=uU~PK&#k{ zKF|j1T_fX4L2)cnOca{CM(-_#)Y1i-q3dj7G*gX*jz1iEs0lj&AjrOxn1Y%$(|dQ% z_*@$T>g_exWA`d0{g5;S_Y{~>Z+JE&f)U>82JJ% ztAq2Vj5r{ZmvEPG)0*e_U2Ds|USgeFIB)*n1WUYF{=6UjdVYSj%1W4cJ)ykBO^V7BcUK?YRI1~ z+s{}PsaS6Linrj$+dDB@Dh&;#A%^{tRi7+L%%aSMnVgA@eFFE$TTi0=Dc*HwRo+h* zY7+Zc9ZHsmJ+Mrm+r~cQ+C*V`9l{POj3lU@{8qg^V-~P@xTei+IUhB|$0@)aLFZ!_ zsI}^b3ik~t1s>%+=5$j{%&IsE^;>EtU3WD0_REun`QlOiYoAH1cEHCJhU48|6hqnm z#Z`TB{Ph2dvoO};>HJTOon=j@mUPGj29er%s{{%d^&?0YP9xYHQK1(U?n1hpisC6h6J-r!QU8ZPL=dmq!e zX73!?yySG(^)HOw`&#mBa-bEz_=kS`ithT8ZS~26Wnn80A%E%i@qqcV%kKKe)Nj8U zS%x)Poo?xVG{w^#vxGJzr*G2Q0z*ouyJ8kI;!_`hirKgnMwn@0loDGCX%Jib6JWuU zOQTM+Wc^QNo+@k z-UTr#Fzy~(h9|o~-VhM&RL@ONGj{QXa&?IJVT7XJ9^ZT`g@ S$U0~S7+g2jE&I(e>i+;CrcmSn diff --git a/release_docs/en/examples.md b/release_docs/en/examples.md index 6a4a0e2..338462a 100644 --- a/release_docs/en/examples.md +++ b/release_docs/en/examples.md @@ -1,76 +1,30 @@ -# Examples tour +# Programs and examples -The release ships with 27 example programs in `examples/`. Every one of them -is a self-contained demo with comments — they were used as regression tests -during development. +The SDK release includes its regression programs in `tests/`: `hello`, +`cat`, `gfx_demo`, `bgitest` and others. They exercise compiler, libc, +graphics and Sprinter runtime behavior. Build them with `make`; `make floppy` +packs them into a local `build/media/toolkit-tests.img`. -## Build any example +Larger demonstrations (`balls`, `mdview`, `mdview2`, `rpgwalk`, `scroll`, +`space`) are published in the separate Examples project. Clone it separately +and point it at this installed SDK: ```sh -cd examples/hello +export SPRINTER_ROOT=/path/to/sprinter-c +cd /path/to/Examples +pyenv exec python -m pip install -r requirements.txt make ``` -That produces `hello.exe` next to `hello.c` using `examples/example.mk`. - -## Categories - -### Hello world / basics -* **`hello`** — stdio + conio Turbo-C-style colours -* **`argv`** — argv parsing in crt0 -* **`conio`** — conio API smoke test -* **`attrprob`** — probe Sprinter text-attribute byte layout - -### File I/O -* **`cat`** — read & print TEST.TXT -* **`seek`** — 32-bit lseek over a 100 KB file -* **`ls`** — directory listing via ffirst/fnext -* **`filetest`** — FILE* streams (`fopen`/`fread`/`fwrite`/`fclose`) -* **`stattest`** — `stat`/`fstat` on files and directories -* **`openenv`** — open() flags + environment variables - -### Memory & banking -* **`malloc`** — heap stress test (200+ allocations) -* **`mem_test`** — page allocator + `bank_read`/`bank_write` -* **`banked`** — banked code in W3 (huge mode) -* **`bankedbg`** — banked code in W1 (big mode) -* **`banklocl`** — bank-local static data and BSS - -### Mouse -* **`mouse`** — driver in text mode -* **`gfx_mous`** — mouse with custom bitmap cursor in graphics mode - -### Graphics -* **`gfx_demo`** — 320×256×256: lines, rectangles, fill via accelerator -* **`gfx_d16`** — 640×256×16: same primitives in 16-color mode -* **`gfx_text`** — bitmap-font text on graphics screen - -### Misc -* **`errno`** — errno / strerror / perror -* **`timedir`** — date/time + directory listing -* **`ptime`** — POSIX time API (time / localtime / mktime) -* **`strtest`** — `` test (from SDCC's z80.lib) -* **`stdlib`** — `` test (qsort / rand / strtol / etc.) -* **`assrtest`** — assert() -* **`rt_test`** — runtime helpers (sleep, setjmp, atexit) - -## Example.mk - -Every example uses `examples/example.mk`. A minimal Makefile looks like: +For your own program, use the SDK's `app.mk`: ```makefile -PROJ_ROOT := $(abspath $(CURDIR)/../..) -EXAMPLE := my_app -include $(PROJ_ROOT)/examples/example.mk +SPRINTER_ROOT ?= /path/to/sprinter-c +EXAMPLE := my_app +include $(SPRINTER_ROOT)/app.mk ``` -Optional knobs (set before `include`): - -```makefile -MEMORY := huge # default tiny -STACK_SIZE := 4096 # default ~1278 -EXTRA_SRCS := helper.c util.c # extra .c files in same dir -EXTRA_FLAGS := --bank 1=engine.c --debug # pass-through to sprinter-cc -``` - -Use this template for your own programs. +`make floppy` creates an image under the application's `build/media/`. +For an emulator launch, set `MAME_HOME` to a prepared MAME runtime with +`mame.arm`, `roms/` and `IMG/`; `MAME_BIN`, `MAME_ROMPATH`, `MAME_DSS_IMAGE`, +`MAME_SYSTEM_HDD_IMAGE` and `MAME_BIOS` can override each part. diff --git a/release_docs/en/getting_started.md b/release_docs/en/getting_started.md index 3e25adc..dccf295 100644 --- a/release_docs/en/getting_started.md +++ b/release_docs/en/getting_started.md @@ -10,14 +10,15 @@ After extracting `sprinter-c-v1.0-.tar.gz` you've got: * **`lib/sprinter.lib`** — the Sprinter target libc (prebuilt; rebuilt by `make` if you modify libc sources). * **`runtime/`** — crt0 variants and runtime helpers (assembled per-build). * **`toolchain/mkexe/`** — host utility that packs SDCC's `.ihx` into a SprintEXE. -* **`examples/`** — 27 ready-to-build programs. +* **`tests/` + `testkit/`** — SDK regression programs and host tests. +* **`app.mk`** — standalone application build/run rules. * **`docs/{en,ru}/`** — this documentation. ## First build ```sh cd sprinter-c-v1.0- -make all # rebuild lib + every example (~30 s) +make all # rebuild tools, libraries and SDK tests ``` If `make` complains about a missing SDCC binary, fetch it once: @@ -48,8 +49,9 @@ ESTEX DSS shell. The release does **not** include the MAME emulator or the Sprinter ROM / DSS / HDD images — those are large and have their own licensing. To test: -* **MAME:** install MAME 0.283+ separately, obtain Sprinter Sp2000 images from - Peters Plus, mount a FAT12 floppy with your `.exe` files as `-flop1`. +* **MAME:** install a build with the Sprinter driver and prepare `MAME_HOME` + containing `mame.arm`, `roms/`, DSS floppy and system CHD. `make floppy` + creates a local SDK test disk; `make run MAME_HOME=/path/to/runtime` mounts it. * **Real Sprinter:** copy `.exe` to a floppy or HDD partition that DSS can see, then `RUN HELLO` from the shell. @@ -57,5 +59,5 @@ DSS / HDD images — those are large and have their own licensing. To test: * Read `sprinter_cc.md` for compiler flags. * Read `memory_modes.md` when you start needing more than 14 KB of code. -* Browse `examples/` — every file is a working program with comments. +* See `examples.md` for SDK tests and the separate Examples project. * See `headers.md` for the public API surface. diff --git a/release_docs/ru/examples.md b/release_docs/ru/examples.md index 9104a97..51e345c 100644 --- a/release_docs/ru/examples.md +++ b/release_docs/ru/examples.md @@ -1,75 +1,30 @@ -# Обзор примеров +# Программы и примеры -Релиз содержит 27 примеров в каталоге `examples/`. Каждый — самодостаточная -демо-программа с комментариями (использовались как regression-тесты при разработке). +Релиз SDK содержит регрессионные программы в `tests/`: `hello`, `cat`, +`gfx_demo`, `bgitest` и другие. Они проверяют компилятор, libc, графику и +runtime Sprinter. `make` собирает их, а `make floppy` упаковывает в локальный +`build/media/toolkit-tests.img`. -## Сборка примера +Большие демонстрации (`balls`, `mdview`, `mdview2`, `rpgwalk`, `scroll`, +`space`) выпускаются отдельным проектом Examples. Для него задаётся только +путь к установленному SDK: ```sh -cd examples/hello +export SPRINTER_ROOT=/путь/к/sprinter-c +cd /путь/к/Examples +pyenv exec python -m pip install -r requirements.txt make ``` -Результат — `hello.exe` рядом с `hello.c` через `examples/example.mk`. - -## Категории - -### Hello world / основы -* **`hello`** — stdio + conio Turbo-C-стиль цвета -* **`argv`** — парсинг argv в crt0 -* **`conio`** — smoke test conio API -* **`attrprob`** — пробинг байта атрибутов Sprinter - -### Файловый ввод-вывод -* **`cat`** — читает и печатает TEST.TXT -* **`seek`** — 32-битный lseek по файлу в 100 КБ -* **`ls`** — листинг каталога через ffirst/fnext -* **`filetest`** — FILE* стримы (`fopen`/`fread`/`fwrite`/`fclose`) -* **`stattest`** — `stat`/`fstat` для файлов и каталогов -* **`openenv`** — флаги open() + environment variables - -### Память и банки -* **`malloc`** — стресс-тест heap (200+ allocations) -* **`mem_test`** — page allocator + `bank_read`/`bank_write` -* **`banked`** — banked-код в W3 (huge mode) -* **`bankedbg`** — banked-код в W1 (big mode) -* **`banklocl`** — bank-local статические данные и BSS - -### Мышь -* **`mouse`** — драйвер в текстовом режиме -* **`gfx_mous`** — мышь с пользовательским bitmap-курсором в графическом режиме - -### Графика -* **`gfx_demo`** — 320×256×256: линии, прямоугольники, fill через accelerator -* **`gfx_d16`** — 640×256×16: те же примитивы в 16-цветном режиме -* **`gfx_text`** — bitmap-текст на графическом экране - -### Прочее -* **`errno`** — errno / strerror / perror -* **`timedir`** — дата/время + листинг каталога -* **`ptime`** — POSIX time API (time / localtime / mktime) -* **`strtest`** — `` тест (из SDCC's z80.lib) -* **`stdlib`** — `` тест (qsort / rand / strtol / etc.) -* **`assrtest`** — assert() -* **`rt_test`** — runtime helpers (sleep, setjmp, atexit) - -## Example.mk - -Каждый пример использует `examples/example.mk`. Минимальный Makefile: +Для своей программы подключайте `app.mk` SDK: ```makefile -PROJ_ROOT := $(abspath $(CURDIR)/../..) -EXAMPLE := my_app -include $(PROJ_ROOT)/examples/example.mk +SPRINTER_ROOT ?= /путь/к/sprinter-c +EXAMPLE := my_app +include $(SPRINTER_ROOT)/app.mk ``` -Опциональные параметры (задаются до `include`): - -```makefile -MEMORY := huge # по умолчанию tiny -STACK_SIZE := 4096 # по умолчанию ~1278 -EXTRA_SRCS := helper.c util.c # дополнительные .c в той же папке -EXTRA_FLAGS := --bank 1=engine.c --debug # pass-through в sprinter-cc -``` - -Используйте этот template для своих программ. +`make floppy` создаёт образ в локальном `build/media/` приложения. Для +запуска в эмуляторе задайте `MAME_HOME` с `mame.arm`, `roms/` и `IMG/`; +`MAME_BIN`, `MAME_ROMPATH`, `MAME_DSS_IMAGE`, `MAME_SYSTEM_HDD_IMAGE` и +`MAME_BIOS` позволяют переопределить отдельные пути. diff --git a/release_docs/ru/getting_started.md b/release_docs/ru/getting_started.md index bc62b8e..468caf5 100644 --- a/release_docs/ru/getting_started.md +++ b/release_docs/ru/getting_started.md @@ -10,14 +10,15 @@ * **`lib/sprinter.lib`** — целевая libc для Sprinter (предсобрана; пересобирается через `make`, если изменили исходники libc). * **`runtime/`** — варианты crt0 и runtime-помощники (ассемблируются per-build). * **`toolchain/mkexe/`** — host-утилита, упаковывающая `.ihx` SDCC в SprintEXE. -* **`examples/`** — 27 готовых программ. +* **`tests/` + `testkit/`** — регрессионные программы и host-тесты SDK. +* **`app.mk`** — правила сборки и запуска автономных приложений. * **`docs/{en,ru}/`** — эта документация. ## Первая сборка ```sh cd sprinter-c-v1.0- -make all # пересобрать lib + все примеры (~30 с) +make all # пересобрать инструменты, библиотеки и SDK-тесты ``` Если `make` жалуется на отсутствующий бинарник SDCC — загрузите его один раз: @@ -48,8 +49,9 @@ Sprinter / MAME / в любом ESTEX DSS шелле. Релиз **не содержит** эмулятор MAME или образы ROM / DSS / HDD Sprinter — они большие и имеют свои лицензии. Для тестирования: -* **MAME:** установите MAME 0.283+ отдельно, получите образы Sprinter Sp2000 - у Peters Plus, смонтируйте FAT12-флоп с вашими `.exe` файлами как `-flop1`. +* **MAME:** установите сборку с драйвером Sprinter и подготовьте `MAME_HOME` + с `mame.arm`, `roms/`, дискетой DSS и системным CHD. `make floppy` создаёт + локальный диск SDK-тестов; `make run MAME_HOME=/путь/к/runtime` монтирует его. * **Реальный Sprinter:** скопируйте `.exe` на флоп или раздел HDD, видимый для DSS, затем `RUN HELLO` в шелле. @@ -57,6 +59,6 @@ Sprinter / MAME / в любом ESTEX DSS шелле. * Прочитайте `sprinter_cc.md` про флаги компилятора. * Прочитайте `memory_modes.md` когда не хватит 14 КБ кода. -* Просмотрите `examples/` — каждый файл это рабочая программа с комментариями. +* `examples.md` описывает SDK-тесты и отдельный проект Examples. * `headers.md` — список публичных API. * `platform_reference.md` — глубокие нюансы платформы и компилятора (от граблей до подводных камней). diff --git a/release_docs/ru/platform_reference.md b/release_docs/ru/platform_reference.md index 26416ed..0104e76 100644 --- a/release_docs/ru/platform_reference.md +++ b/release_docs/ru/platform_reference.md @@ -366,8 +366,8 @@ Prepend'ит `DEBUG_RT = 1` в crt0 + передаёт `-DDEBUG_RT` в SDCC. О ### MAME testing workflow ```sh -make floppy # пакует все .exe + data в mame/v306/IMG/mc.img -cd mame/v306 && ./run_mame.sh +make floppy # пакует SDK-тесты в build/media/toolkit-tests.img +make run MAME_HOME=/путь/к/MAME/runtime ``` Имена файлов на флопе должны быть 8.3 (FAT12). Все примеры названы соответственно — `banked_big → bankedbg`, `seek_demo → seek`, `time_dir_test → timedir`, etc. diff --git a/tests/sdbg/run_mame_probe.py b/tests/sdbg/run_mame_probe.py index 5ee3625..9c0ea05 100644 --- a/tests/sdbg/run_mame_probe.py +++ b/tests/sdbg/run_mame_probe.py @@ -153,8 +153,6 @@ void worker(void) __banked { try: launcher.wait(timeout=8) except subprocess.TimeoutExpired: launcher.kill();launcher.wait() profile=MameProfile.resolve() - if profile.binary is None and (ROOT/'mame/v306/mame.arm').is_file(): - profile=MameProfile.resolve({'MAME_HOME':str(ROOT/'mame/v306')}) profile.validate(dss=True) create_floppy_image(str(work/'probe.img'),[('PROBE.EXE',str(exe))]) system=work/'system.chd' @@ -264,9 +262,6 @@ end) installed = profile.home.parent / 'plugins' if installed.is_dir(): plugin_paths.append(installed) - legacy = ROOT / 'mame/sources/MAME/plugins' - if legacy.is_dir(): - plugin_paths.append(legacy) command.extend(['-verbose','-plugin','sdbgbridge','-pluginspath', ';'.join(map(str, plugin_paths))]) with (work/'mame.log').open('w') as log: diff --git a/tests/sdbg/run_vscode_dap_probe.py b/tests/sdbg/run_vscode_dap_probe.py index 85ddf9f..3813de0 100644 --- a/tests/sdbg/run_vscode_dap_probe.py +++ b/tests/sdbg/run_vscode_dap_probe.py @@ -5,6 +5,7 @@ """ from __future__ import annotations +import argparse import json import os from pathlib import Path @@ -85,9 +86,15 @@ def wait_event(process, buffer, event, timeout): def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--build', default=None) + parser.add_argument('--app-hdd', default=None) + parser.add_argument('--launch-path', default=None) + options, _ = parser.parse_known_args() if not PYTHON.is_file(): raise RuntimeError('Нет local pyenv shim: '+str(PYTHON)) - build = ROOT/'tests/hello/.sprinter-cc-hello' + build = Path(options.build).resolve() if options.build else \ + ROOT/'tests/hello/.sprinter-cc-hello' command = [str(PYTHON), str(ROOT/'toolchain/sdbg_dap.py')] process = subprocess.Popen(command, cwd=ROOT, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -95,8 +102,13 @@ def main(): try: send(process, 1, 'initialize') _, buffer, _ = wait_response(process, buffer, 'initialize', 10) - send(process, 2, 'launch', {'build': str(build), 'debugger': 'sdbg', - 'dssTimeout': 30}) + debugger = 'osx' if '--osx' in sys.argv else 'sdbg' + launch = {'build': str(build), 'debugger': debugger, 'dssTimeout': 30} + if options.app_hdd: + launch['appHdd'] = str(Path(options.app_hdd).resolve()) + if options.launch_path: + launch['launchPath'] = options.launch_path + send(process, 2, 'launch', launch) launched, buffer, events = wait_response(process, buffer, 'launch', 80) if not any(item.get('event') == 'initialized' for item in events): initialized, buffer = receive(process, buffer, 5) diff --git a/tests/sdbg/test_dap.py b/tests/sdbg/test_dap.py index 1d3edbc..ed168b5 100644 --- a/tests/sdbg/test_dap.py +++ b/tests/sdbg/test_dap.py @@ -128,19 +128,5 @@ class DapTests(unittest.TestCase): self.assertEqual([item['type'] for item in messages], ['response', 'response']) - def test_vscode_extension_activates_before_debug_adapter_factory(self): - extension_dir = ROOT / 'toolchain' / 'vscode-sprinter-debug' - manifest = json.loads((extension_dir / 'package.json').read_text()) - self.assertIn('onDebug', manifest['activationEvents']) - self.assertNotIn('onDebug:sprinter-mame', manifest['activationEvents']) - self.assertEqual('auto', manifest['contributes']['configuration'] - ['properties']['sprinterDebugger.pythonCommand']['default']) - self.assertTrue((extension_dir / manifest['main']).is_file()) - debugger_types = { - item['type'] for item in manifest['contributes']['debuggers'] - } - self.assertIn('sprinter-mame', debugger_types) - - if __name__ == '__main__': unittest.main() diff --git a/tests/sdbg/test_sdbg.py b/tests/sdbg/test_sdbg.py index acde7ae..2038cf8 100644 --- a/tests/sdbg/test_sdbg.py +++ b/tests/sdbg/test_sdbg.py @@ -114,6 +114,22 @@ class Integration(unittest.TestCase): self.assertEqual(value['bank'],1) self.assertEqual(value['window'],1) + def test_04a_absolute_variable_is_not_confused_with_code(self): + source=self.work/'absolute.c' + source.write_text(''' +__at (0x4000) volatile unsigned char scratch; +int main(void) { scratch = 42; return 0; } +''') + self.build('absolute',[source],'--src-debug') + model=self.model('absolute') + scratch=next(v for v in model.variables if v['name']=='scratch') + self.assertEqual(scratch['section'],'_ABS') + self.assertEqual(scratch['logical_address'],0x4000) + self.assertEqual(scratch['window'],1) + self.assertIsNone(scratch['bank']) + with self.assertRaisesRegex(ValueError,'секция'): + model.location(0x4000) + def test_05_stale_sources_and_corrupt_artifacts(self): source=self.work/'stale.c' source.write_text('int main(void) {return 42;}') diff --git a/third_party/16x16-RPG-characters/LICENSE b/third_party/16x16-RPG-characters/LICENSE deleted file mode 100644 index 604209a..0000000 --- a/third_party/16x16-RPG-characters/LICENSE +++ /dev/null @@ -1,359 +0,0 @@ -Creative Commons Legal Code - -Attribution-ShareAlike 3.0 Unported - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR - DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE -COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY -COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS -AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY -BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS -CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. - -1. Definitions - - a. "Adaptation" means a work based upon the Work, or upon the Work and - other pre-existing works, such as a translation, adaptation, - derivative work, arrangement of music or other alterations of a - literary or artistic work, or phonogram or performance and includes - cinematographic adaptations or any other form in which the Work may be - recast, transformed, or adapted including in any form recognizably - derived from the original, except that a work that constitutes a - Collection will not be considered an Adaptation for the purpose of - this License. For the avoidance of doubt, where the Work is a musical - work, performance or phonogram, the synchronization of the Work in - timed-relation with a moving image ("synching") will be considered an - Adaptation for the purpose of this License. - b. "Collection" means a collection of literary or artistic works, such as - encyclopedias and anthologies, or performances, phonograms or - broadcasts, or other works or subject matter other than works listed - in Section 1(f) below, which, by reason of the selection and - arrangement of their contents, constitute intellectual creations, in - which the Work is included in its entirety in unmodified form along - with one or more other contributions, each constituting separate and - independent works in themselves, which together are assembled into a - collective whole. A work that constitutes a Collection will not be - considered an Adaptation (as defined below) for the purposes of this - License. - c. "Creative Commons Compatible License" means a license that is listed - at https://creativecommons.org/compatiblelicenses that has been - approved by Creative Commons as being essentially equivalent to this - License, including, at a minimum, because that license: (i) contains - terms that have the same purpose, meaning and effect as the License - Elements of this License; and, (ii) explicitly permits the relicensing - of adaptations of works made available under that license under this - License or a Creative Commons jurisdiction license with the same - License Elements as this License. - d. "Distribute" means to make available to the public the original and - copies of the Work or Adaptation, as appropriate, through sale or - other transfer of ownership. - e. "License Elements" means the following high-level license attributes - as selected by Licensor and indicated in the title of this License: - Attribution, ShareAlike. - f. "Licensor" means the individual, individuals, entity or entities that - offer(s) the Work under the terms of this License. - g. "Original Author" means, in the case of a literary or artistic work, - the individual, individuals, entity or entities who created the Work - or if no individual or entity can be identified, the publisher; and in - addition (i) in the case of a performance the actors, singers, - musicians, dancers, and other persons who act, sing, deliver, declaim, - play in, interpret or otherwise perform literary or artistic works or - expressions of folklore; (ii) in the case of a phonogram the producer - being the person or legal entity who first fixes the sounds of a - performance or other sounds; and, (iii) in the case of broadcasts, the - organization that transmits the broadcast. - h. "Work" means the literary and/or artistic work offered under the terms - of this License including without limitation any production in the - literary, scientific and artistic domain, whatever may be the mode or - form of its expression including digital form, such as a book, - pamphlet and other writing; a lecture, address, sermon or other work - of the same nature; a dramatic or dramatico-musical work; a - choreographic work or entertainment in dumb show; a musical - composition with or without words; a cinematographic work to which are - assimilated works expressed by a process analogous to cinematography; - a work of drawing, painting, architecture, sculpture, engraving or - lithography; a photographic work to which are assimilated works - expressed by a process analogous to photography; a work of applied - art; an illustration, map, plan, sketch or three-dimensional work - relative to geography, topography, architecture or science; a - performance; a broadcast; a phonogram; a compilation of data to the - extent it is protected as a copyrightable work; or a work performed by - a variety or circus performer to the extent it is not otherwise - considered a literary or artistic work. - i. "You" means an individual or entity exercising rights under this - License who has not previously violated the terms of this License with - respect to the Work, or who has received express permission from the - Licensor to exercise rights under this License despite a previous - violation. - j. "Publicly Perform" means to perform public recitations of the Work and - to communicate to the public those public recitations, by any means or - process, including by wire or wireless means or public digital - performances; to make available to the public Works in such a way that - members of the public may access these Works from a place and at a - place individually chosen by them; to perform the Work to the public - by any means or process and the communication to the public of the - performances of the Work, including by public digital performance; to - broadcast and rebroadcast the Work by any means including signs, - sounds or images. - k. "Reproduce" means to make copies of the Work by any means including - without limitation by sound or visual recordings and the right of - fixation and reproducing fixations of the Work, including storage of a - protected performance or phonogram in digital form or other electronic - medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, -limit, or restrict any uses free from copyright or rights arising from -limitations or exceptions that are provided for in connection with the -copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, -Licensor hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license to -exercise the rights in the Work as stated below: - - a. to Reproduce the Work, to incorporate the Work into one or more - Collections, and to Reproduce the Work as incorporated in the - Collections; - b. to create and Reproduce Adaptations provided that any such Adaptation, - including any translation in any medium, takes reasonable steps to - clearly label, demarcate or otherwise identify that changes were made - to the original Work. For example, a translation could be marked "The - original work was translated from English to Spanish," or a - modification could indicate "The original work has been modified."; - c. to Distribute and Publicly Perform the Work including as incorporated - in Collections; and, - d. to Distribute and Publicly Perform Adaptations. - e. For the avoidance of doubt: - - i. Non-waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme cannot be waived, the Licensor - reserves the exclusive right to collect such royalties for any - exercise by You of the rights granted under this License; - ii. Waivable Compulsory License Schemes. In those jurisdictions in - which the right to collect royalties through any statutory or - compulsory licensing scheme can be waived, the Licensor waives the - exclusive right to collect such royalties for any exercise by You - of the rights granted under this License; and, - iii. Voluntary License Schemes. The Licensor waives the right to - collect royalties, whether individually or, in the event that the - Licensor is a member of a collecting society that administers - voluntary licensing schemes, via that society, from any exercise - by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now -known or hereafter devised. The above rights include the right to make -such modifications as are technically necessary to exercise the rights in -other media and formats. Subject to Section 8(f), all rights not expressly -granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made -subject to and limited by the following restrictions: - - a. You may Distribute or Publicly Perform the Work only under the terms - of this License. You must include a copy of, or the Uniform Resource - Identifier (URI) for, this License with every copy of the Work You - Distribute or Publicly Perform. You may not offer or impose any terms - on the Work that restrict the terms of this License or the ability of - the recipient of the Work to exercise the rights granted to that - recipient under the terms of the License. You may not sublicense the - Work. You must keep intact all notices that refer to this License and - to the disclaimer of warranties with every copy of the Work You - Distribute or Publicly Perform. When You Distribute or Publicly - Perform the Work, You may not impose any effective technological - measures on the Work that restrict the ability of a recipient of the - Work from You to exercise the rights granted to that recipient under - the terms of the License. This Section 4(a) applies to the Work as - incorporated in a Collection, but this does not require the Collection - apart from the Work itself to be made subject to the terms of this - License. If You create a Collection, upon notice from any Licensor You - must, to the extent practicable, remove from the Collection any credit - as required by Section 4(c), as requested. If You create an - Adaptation, upon notice from any Licensor You must, to the extent - practicable, remove from the Adaptation any credit as required by - Section 4(c), as requested. - b. You may Distribute or Publicly Perform an Adaptation only under the - terms of: (i) this License; (ii) a later version of this License with - the same License Elements as this License; (iii) a Creative Commons - jurisdiction license (either this or a later license version) that - contains the same License Elements as this License (e.g., - Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible - License. If you license the Adaptation under one of the licenses - mentioned in (iv), you must comply with the terms of that license. If - you license the Adaptation under the terms of any of the licenses - mentioned in (i), (ii) or (iii) (the "Applicable License"), you must - comply with the terms of the Applicable License generally and the - following provisions: (I) You must include a copy of, or the URI for, - the Applicable License with every copy of each Adaptation You - Distribute or Publicly Perform; (II) You may not offer or impose any - terms on the Adaptation that restrict the terms of the Applicable - License or the ability of the recipient of the Adaptation to exercise - the rights granted to that recipient under the terms of the Applicable - License; (III) You must keep intact all notices that refer to the - Applicable License and to the disclaimer of warranties with every copy - of the Work as included in the Adaptation You Distribute or Publicly - Perform; (IV) when You Distribute or Publicly Perform the Adaptation, - You may not impose any effective technological measures on the - Adaptation that restrict the ability of a recipient of the Adaptation - from You to exercise the rights granted to that recipient under the - terms of the Applicable License. This Section 4(b) applies to the - Adaptation as incorporated in a Collection, but this does not require - the Collection apart from the Adaptation itself to be made subject to - the terms of the Applicable License. - c. If You Distribute, or Publicly Perform the Work or any Adaptations or - Collections, You must, unless a request has been made pursuant to - Section 4(a), keep intact all copyright notices for the Work and - provide, reasonable to the medium or means You are utilizing: (i) the - name of the Original Author (or pseudonym, if applicable) if supplied, - and/or if the Original Author and/or Licensor designate another party - or parties (e.g., a sponsor institute, publishing entity, journal) for - attribution ("Attribution Parties") in Licensor's copyright notice, - terms of service or by other reasonable means, the name of such party - or parties; (ii) the title of the Work if supplied; (iii) to the - extent reasonably practicable, the URI, if any, that Licensor - specifies to be associated with the Work, unless such URI does not - refer to the copyright notice or licensing information for the Work; - and (iv) , consistent with Ssection 3(b), in the case of an - Adaptation, a credit identifying the use of the Work in the Adaptation - (e.g., "French translation of the Work by Original Author," or - "Screenplay based on original Work by Original Author"). The credit - required by this Section 4(c) may be implemented in any reasonable - manner; provided, however, that in the case of a Adaptation or - Collection, at a minimum such credit will appear, if a credit for all - contributing authors of the Adaptation or Collection appears, then as - part of these credits and in a manner at least as prominent as the - credits for the other contributing authors. For the avoidance of - doubt, You may only use the credit required by this Section for the - purpose of attribution in the manner set out above and, by exercising - Your rights under this License, You may not implicitly or explicitly - assert or imply any connection with, sponsorship or endorsement by the - Original Author, Licensor and/or Attribution Parties, as appropriate, - of You or Your use of the Work, without the separate, express prior - written permission of the Original Author, Licensor and/or Attribution - Parties. - d. Except as otherwise agreed in writing by the Licensor or as may be - otherwise permitted by applicable law, if You Reproduce, Distribute or - Publicly Perform the Work either by itself or as part of any - Adaptations or Collections, You must not distort, mutilate, modify or - take other derogatory action in relation to the Work which would be - prejudicial to the Original Author's honor or reputation. Licensor - agrees that in those jurisdictions (e.g. Japan), in which any exercise - of the right granted in Section 3(b) of this License (the right to - make Adaptations) would be deemed to be a distortion, mutilation, - modification or other derogatory action prejudicial to the Original - Author's honor and reputation, the Licensor will waive or not assert, - as appropriate, this Section, to the fullest extent permitted by the - applicable national law, to enable You to reasonably exercise Your - right under Section 3(b) of this License (right to make Adaptations) - but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR -OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY -KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, -INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, -FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF -LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, -WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION -OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE -LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR -ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES -ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - a. This License and the rights granted hereunder will terminate - automatically upon any breach by You of the terms of this License. - Individuals or entities who have received Adaptations or Collections - from You under this License, however, will not have their licenses - terminated provided such individuals or entities remain in full - compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will - survive any termination of this License. - b. Subject to the above terms and conditions, the license granted here is - perpetual (for the duration of the applicable copyright in the Work). - Notwithstanding the above, Licensor reserves the right to release the - Work under different license terms or to stop distributing the Work at - any time; provided, however that any such election will not serve to - withdraw this License (or any other license that has been, or is - required to be, granted under the terms of this License), and this - License will continue in full force and effect unless terminated as - stated above. - -8. Miscellaneous - - a. Each time You Distribute or Publicly Perform the Work or a Collection, - the Licensor offers to the recipient a license to the Work on the same - terms and conditions as the license granted to You under this License. - b. Each time You Distribute or Publicly Perform an Adaptation, Licensor - offers to the recipient a license to the original Work on the same - terms and conditions as the license granted to You under this License. - c. If any provision of this License is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of - the remainder of the terms of this License, and without further action - by the parties to this agreement, such provision shall be reformed to - the minimum extent necessary to make such provision valid and - enforceable. - d. No term or provision of this License shall be deemed waived and no - breach consented to unless such waiver or consent shall be in writing - and signed by the party to be charged with such waiver or consent. - e. This License constitutes the entire agreement between the parties with - respect to the Work licensed here. There are no understandings, - agreements or representations with respect to the Work not specified - here. Licensor shall not be bound by any additional provisions that - may appear in any communication from You. This License may not be - modified without the mutual written agreement of the Licensor and You. - f. The rights granted under, and the subject matter referenced, in this - License were drafted utilizing the terminology of the Berne Convention - for the Protection of Literary and Artistic Works (as amended on - September 28, 1979), the Rome Convention of 1961, the WIPO Copyright - Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 - and the Universal Copyright Convention (as revised on July 24, 1971). - These rights and subject matter take effect in the relevant - jurisdiction in which the License terms are sought to be enforced - according to the corresponding provisions of the implementation of - those treaty provisions in the applicable national law. If the - standard suite of rights granted under applicable copyright law - includes additional rights not granted under this License, such - additional rights are deemed to be included in the License; this - License is not intended to restrict the license of any rights under - applicable law. - - -Creative Commons Notice - - Creative Commons is not a party to this License, and makes no warranty - whatsoever in connection with the Work. Creative Commons will not be - liable to You or any party on any legal theory for any damages - whatsoever, including without limitation any general, special, - incidental or consequential damages arising in connection to this - license. Notwithstanding the foregoing two (2) sentences, if Creative - Commons has expressly identified itself as the Licensor hereunder, it - shall have all rights and obligations of Licensor. - - Except for the limited purpose of indicating to the public that the - Work is licensed under the CCPL, Creative Commons does not authorize - the use by either party of the trademark "Creative Commons" or any - related trademark or logo of Creative Commons without the prior - written consent of Creative Commons. Any permitted use will be in - compliance with Creative Commons' then-current trademark usage - guidelines, as may be published on its website or otherwise made - available upon request from time to time. For the avoidance of doubt, - this trademark restriction does not form part of the License. - - Creative Commons may be contacted at https://creativecommons.org/. diff --git a/third_party/16x16-RPG-characters/README.md b/third_party/16x16-RPG-characters/README.md deleted file mode 100644 index b3b78a0..0000000 --- a/third_party/16x16-RPG-characters/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# 16x16 RPG characters `v3.0` - -16x16px RPG character sprite sheet for up to down games. - -This asset pack has been downloaded from https://route1rodent.itch.io/16x16-rpg-character-sprite-sheet - -Adapted from opengameart.org 's "[NES-Style RPG Characters](https://opengameart.org/content/nes-style-rpg-characters)" and "[More NES-style RPG Characters](https://opengameart.org/content/more-nes-style-rpg-characters)", with additional content made by [@route1rodent](https://route1rodent.itch.io). - -## License - -16x16 RPG character sprite sheet (c) by @route1rodent - -"16x16 RPG character sprite sheet" is licensed under a -Creative Commons Attribution-ShareAlike 3.0 Unported License (CC BY-SA 3.0). - -You should have received a copy of the license along with this -work. If not, see http://creativecommons.org/licenses/by-sa/3.0/. - - -## Credits - -Maintained by @route1rodent: - -- itch.io: https://route1rodent.itch.io -- Twitter: https://twitter.com/route1rodent -- Github: https://github.com/itsjavi -- Blog: https://blog.itsjavi.com diff --git a/third_party/16x16-RPG-characters/preview.png b/third_party/16x16-RPG-characters/preview.png deleted file mode 100644 index 2d1a7b926918e8e539ea131f7233f44da36c9adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3387 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 diff --git a/third_party/16x16-RPG-characters/sprites/new-style/chibi-layered.aseprite b/third_party/16x16-RPG-characters/sprites/new-style/chibi-layered.aseprite deleted file mode 100644 index b2cc1f78a3e181676774e4235c455a9a5ada7f28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3645 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 z 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 S$U0~S7+g2jE&I(e>i+;CrcmSn diff --git a/third_party/16x16-RPG-characters/sprites/old-style/03-soldier.png b/third_party/16x16-RPG-characters/sprites/old-style/03-soldier.png deleted file mode 100644 index a6d640875fe0f97d20e9f5e76cd4ccfe7c02aee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8203 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 xpQdt=G0`p-_zw-({+h#3qieZ z(EtL}TF<=l>$PaKvs!9n=_PLWHMXD=VD$*6`xa;HR5uZcO?kN;2-ar$={`VD+vrxw IP1wu-0!x*&fB*mh diff --git a/third_party/16x16-RPG-characters/sprites/old-style/04-scout.png b/third_party/16x16-RPG-characters/sprites/old-style/04-scout.png deleted file mode 100644 index dfbf05bd596fdf8aab64e073463a73e3ffb5f847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7222 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 AF#rGn diff --git a/third_party/16x16-RPG-characters/sprites/old-style/05-devout.png b/third_party/16x16-RPG-characters/sprites/old-style/05-devout.png deleted file mode 100644 index 6e9db7fd4c7042e372c46fe0a8da9f02ee048388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8706 zcmaKycT^KyyY?r9jue$9B@qw>K|uxSgrXu%s-l8)=}ke2lq5N#7R!X8q2&xD&VTKYQbwge(*m zbXEW5oOq}FnXr}wug}wq8+ZZF#7jH`XSN5GSH#`kRCQIBp6e2GOFY-b-F4GVAj<2+ zv4XqmVgqsKt{e|mpY-aGs6B`7^0Jf}mCMse8_<%^J6|m=BSTLn!%D)#AApP>TwhEO z5t3vq;V_38c9jNPQo{@Wsu-M|vD!y!E4?JGw-S3h1{9|Sn+Sy2&rJ1>&UdEG9aj5% zkWcdq34+-ti`c~*O-+<|A56eKQ_8v%6gp)B4v3AkHLp+|dy7M-E}~KZKB-~B?t+1r z!!LR*NE#psgChAP)4XnXWB~Xy7hb@?{GNlD&dGydaZ6(WE#MPBKe&8uB5-z76*UN4 zp?12n1wt!m3 zTyu7L0I#E)I-s1UW9$GK_mW|~t~3k%LO<=nNLHJv zh^=*!U;*uPlYo`tF9HTSKW<0pYHrjA?Y(_3la6f#199zghCsccsCVf#T_<^%9#Vq; zd3O9Esp0K|go9LKK8)3E<}wY_K7$7V9WJR-s2@^^Ar*SM&_v|3$3K8qVdsyuJmAcA zW9_UCevC+(DF}g6o(|W1ws5CPqkOMw10BI2VYRX;GtH;^3q7fA6pAJ%h;g(iVD zT_J8AEw1OsxisdnSN1S=-l<+J(-4JW5cxw%+mc?ev3J!f+L5?j6V1sL!x)&Vl|GAk(Finro6-D5VFo0^vVtt#x_p#QTwyAQPue1L%QG5e8?L}pN53e9-hjL zA86fmS$($qq_+E2Iq;$+Ij#`hO8-5#Zrj9?A4U`~po!QcxvlxHB@^Bh(I$mj@}gF^ z$xfeHE|u#_XG7QzRwqc0!`R{|P+ozzdQt5B#wyyUKK%NgE$yqRena#_QLA|Sc5L1R z4yonODIf8Tq2hIRh%ss7p1`;#dSd0p6SdeS-tJ$>Nr6(`OPAkfD+;R!YY*KW8K8?Q zIr`{%A-B4D;1P9XJ#KgY=7E8g9#?(0)(dxTNS4tY8;4Qf5y^~V+70Mc`aa%X)=8Jf zdUpESY*jAB={`LJydNOh!@aX0s)+1>(t<+8L zOT&nOgeA3w@fm!A-_oA%hms*HsgRm2Vub10i>{`>Kqh3N#)Nc>$gow=eTocRE!0@2 z<@y2U??5S4p_l_dE)@c=Y5++*$?kt+&x4;W)V#k6Qh&%P>F5^#pmPc@ERC{skU1ic zB*GoR$Cs}XqSA>=?8>gZ$FdY=jkNU!UXEvu0i2pCbfsAwuXBgk`70drB15@#z&nbz zFezV|zcug>UUS*voV_tC$%OJh;?6G_NA$EST+TpI(!(*|Ksu5OI|-P8GdyjR>S3`pc}iyEEcCyC zY~0ei*<*Lc3JzLeduSB(w<3T_g)}~*_>E96gUo136Icx$)8e4*eQPO8c+RtW*tOF` ztWlU{vwry{;!y8t!p!`=)kRN@clA@AMoulucwN6|0mTO+YaO*Wc-|1eyU835} zZLnm#1zXTpdKv$8Ns?!w&*{zQRNH9a8uz-6{6hqC^dDI|qYU(>n$exLX@^Ayuk9fd zXB>_gKT%4<@dL;Eq`)ob8~j(pH{Z`Qng$Nefr*|=bK+}i<}SipB@Js`5%dh2|NS4I zp?=rZ=!H--X8#zA=$aa3rd>%Dl>t)Gx^OEMwX~IZ?F{)0H3q(Fm>NUtOH3*d@Q_3J z0^K3GeA?-rAwI2vvq~MGsmT{KUm0XLAiOz;pR5GM>^0lZgo`vKN^!C4D8ySurMs#k zM6&ZQs3Gl@e!gvpC~mp)5=6FV49#+{N6yfW>n7@nD=*)&N)&6HLOh*`DqQ*2H{-z= zx+U>PDNPsnv`WO6JRf|c!unu#wsUaD`^Iy(_Ln>J7mxWjx?H=Gr>VFKGQQc|{Jh{e zS~&NQ)UO)+a{T7)Ixf?p!dv=DToyygBsE&kx+L?y#i)qAs!%$ya!#moTl!c@Y2Zd3 zdhx4N52Z(!nW+P)%;)(AvldF2msG2igscjok{FZ-SU-0Gyg>Yp;|aGkQh&aVq8*>{ zpTvFf(QFrVy}X@SP zOolzZJX3f1vVo5NSEM|{zD63$OZR+4^GK!1Dd@JvVK9*;buEn5@ylGNYWvwVr%znv2-=*Q5MYb_xV@A{ zoOZp$TPeY!QIG*Ww-7;}mR=9kt8!?*=P$mXmHjr1Qi7!I+cDM1?R2d)qOSZhQi87j z-^C;{l!9Oo)W1T_(S#+(^xMGY?z&Vy z9tzMGgpM1*H?Xyn)h7*!!6fEz(o&X=Dc)Ohj|wB3f<<#M2TElh8ch&qvjKKM{dMB? zgWzg?H>#_q3a+XCkk0b((!_vB=Pnq6I9u!5XgV+M+|lho#5^9M-2p_;kk@hY>Fs1!=iW^! zc#)_RCDY`5YTNqOOi0aRau_%?WL{0EU`r#$HS&nLFF`%2@5$3rNo8rFc-4v5q#;8mlhmD|9U@fMKWUs)9Mvgm}e25Y5x^R z3i0okIM5jN#l~PnI>Gpt!zaB8%r~sP`+#0Ys_S|02l*cNvR9nMyNCm{kqz>U`bEv>v$y!o3l~N0yAnzs z<@+HPX;iv;AOqu`ba8mia{L17$4ri2h^K?lUl~y6!!0UskQvCKMwP1NdS?bovHvWt zm8f6?xU(y7`HKHMW)~Ag+JANVsZd=9O9neEt!}0E0;_@XO5DVAAH5jRl)c#7jos_j zBR=s^@J$7ur)9uY%PXkPZBFTNNXdtG;!=u*MRoRqcgsk?U|$|-Hrcu2xdkM_k(7ivh%zmt_&wd zM05%j7R>Zh&K(uxe~&h)0DaHp;CDua0E59*ONDl*;UlZI*bZox)Le}^HSOEgU5PJM zM<9%AD=oR1?nduH1OJEocK@7Wm>=E5BmdHjRcUlL)}Uv_ z@3|>gr?qxk|3%}qD+1lweM=9bVGoZ^Jc=I=`1tdXcco`KQRg7-T%!kUOkX4Ia?|jn zBWf`S&F2!d3}R=Pwo8dkQLhL_jzu^ck=@iR8BHqX_@7JXC+E(%4A8hSYF0IEoy%0w;cKUdzBAk ze%e_gYw&S9)GSXKAFj$Kf%!hrderzgHc!rd6dYtG54k6-Sc4rAdQu|S9Hr2C)V^`g zbL3A)^Du+ZC;w?Yi6%?VV2ngQId@8Y>lf&~6P9d#VCfwh%uksI z{h)i?it9?19wh!&z4{{D5sj~diZPbTamnd4reUV9;0wep)Dx)56mqeNay;9X<+o3r zr@OZ`S%WoIxW$KP*b)x-_H1?cIDFcb;f%F1S%+nu*}S!p^y;%MJr~lFk(_-Lkc!Tn z`=}CTwztHNukWP4`8P~)tDb4YR)?W*^{0r$h=x*1`>sYrn2PGWDcO_-g>!GDD1S%l zG6x`Z%gp3k{c)Z$+BQw&4J7Go3^Ru}F!()W#2V!k<^uz#Av0^`o!jJ-83FD+<~AI- zBss)Y`cU$ffIq7SjB>8<=W%Xk;=u@pvU#2Nv44qC6ikdNW*!8izaYNE|a1v+qf z*q*aEZs|-m!lN}AsJ$&1=YNj2B0SmGL zA5ME4iE5@k{Z=UQ52S#Rv~$Lpj7Tqw2{FD)er?Pic~6t2f+w6h*RVS8-%G8l`M->J zE#`oKY$j7@A7Nu^HoxrxH|XsA0=F=*T|J)g!#yt+w$rv`MAC^KWMUK21 z5Ku6OZh2cJ^VQ1UReSqKt{n3(=z!bpqE?U!-x&_@Y5Mm#xi#kvWe-Di&-@yA{Nd`j z<5_{dMhxW4Rx{3GPoxRHZK+V_t~p0mU^pIK(9?pHDh)N(yBG;ZKkx*y%A zl|>N^+TjjjKIuUX8aI|LL1%MiwrG(rJU6mPC@VKto&FU&#;Wl>i9&A-R()Q6Xg#!V zWOKKsQ)8TG+m1)rnQ|iC5#$KtDHiumgT;5g8g1w#&3b#PR?>Kmv=-Q@x)s}+Zdk%i7;UDvxkB6g%@-$BQU>~v(m+`-~>0|$a6iF2n zq2mOkieAVQ)iS&GVAm49b@}RdQEo9V31W@sv;);MY1I0m*ynBCREsFWd0K_ei zT0aFM4|ju42bIzbd0T%O+79=2*Av=I$=@PbCZR8_EWZ2xi#u58paj1h+huJkiDhDm zM%8DATl#!|s06l~LFEo0JzhZaH(%dc9J0XAtqUR^?H8WRD}c7}Tgdzci~Zr+iJH_9Z=SHJd!)USJ1$EKJ)wrea#1xvhk%iv1Ah0|n$$M61?`3YztDm7HX$`W&y1s<@ZFCBmk>%jnwHXq1}qZ@L+U)HM(AS|He|zG7Dv>PW$NQrvf~GumN#z^V0a zzqae!>Hoydf5Xs76p-`-riq67M;8A6Ng9hHm8`N@9cEFN-@#Z^@sBOJJ}gSZwq`mLSd>f-Jo$-id)ad_OT(T zSCAk;9R-qB3?$)aam&L`X4;(MLMc$s5XA?q4b(w_BDTLV0TMocXXkwE34fE|dbumS zj`1U89e8H{8XJR!&Xn}JEq z1P2^mr4pGbw2(nmp@|}gIJA%pTiCkiSK7CBV^YFcjQ>j6A~z{$Z_m>uQ*PT<-J#v^N#ZdK@@8{HR%#gqe>8JT;#&X-uFRQIXIlXTW!?a{LwO z$l*L_$lw~BHD0-kKK0Ua5l34JCl*DiLV969TyjU)lT?N^ec!ROyoPaW{@ejHAwEBh zWdlZnpwe{*_eW*hH27LRG(O~%`Wh&7AJI8&AEQ+D;!Sh=U7aN4!3SODFA+~j5hRM? z~HW3v`Ods zL=pMFyCo9i&c7S zvgmzXWZ;WEwH!D#Iik<-LK-ZSuMgLBwho9-^0nbtj%HL;3+oNs(_!*RmYZ#Sxp^Uh z0BY5S-||R{*#2FT4YjV6Lyp&30&6pSz?#qWyG42V5WVY%9`X1t5}6>uk{K>dfj&qb z1{cLk1-g_8B9*kh2((zOVCFwl2~R|2(r!)UfK`qs6Nm45*DYS(`Ufx=)t|Nf zH$~WiAI$fM_kNGM7MU#>IWRPPSP7P1CgQ7%*s0Z#(>>fW(zX4lipEAglO2C|Ss(4x z9eOrQQ+sZ4X=|X2=VK(Z{P~+DYHDi(VbtvHGs^Hj#+ZV7uqTL>0JgT(v>P_`eyoBT)+To@7>FUiwQ?>{;oM$6+u3N z=y~O!Jvmp0O@)dBK&{$ahuT{b3k%*j2UiODKcwLt@-&BR+CRKNn&XN?+}Ky#gS5Fn zECFKrH%s8?_}^H(eS?FOL7i66%)^+r@rxF6P_ZD>5YJ@#otvOGK12WT+<@ zrV57Pw9TK82g(R};{E#+?=vWoUVnTzyHQx{H9|pkZ9`Ae6npgJj-kJFrnLVkVrBxm z?u(PNThB3uzM0|`c+U|>mAbp2y15*&Ed`y|t9UhzwP@d5gd^s`K{s zAIk7?kI4b?fh^4@fFo*Fate#s4RQ(qX=6a>)Wp0v_rwE^w3J~_6arVc6Rj|>lvYAe zGLB?l-k&nD(B)*}eiQKc_b4MKxl=(=8nQ#?m>-~Di^eBYiYYh))BE61PsN5np0N*F zIBBsCFu!XjDSchPfS0pVyu}MvzWO&S!1N}kh_?(9V}jFdI}6ASaIok)@@HeAZ&cXY zJ~8y2KJ!mQ3LIiNunn8ZZuw(Gnsru|hq4K;wt}_qWL@Y+B<)UaE{?I>tTd{_WFvh; z*_mEsYVyurSk;nP0ae0cjPR`rKi)x2P1gx+1R^M<1Btg-;R)5X+gW* zwle2KhTIYqYXsf_MIFJFDn-2ynxC-a{)31oe>Zx$j_*Ba!;-%uxo?pJv|_puw`Ls5yamh%dgO{tcOoi@3xeSxg^)+YY3 z`Y+xV#)&49EeyM_!UK@54{G!Iz7{L~Dj3~kIti^1&L~5EWwMhP-vFMlFTMPku&vn! z{mivNhDIGmtEel!AWk9t4^>Ry9#~$xd-b-rS}VEm6YfZ)jHp2SLn8N$&VTGbiO{ac zb9cD(k`Jsx9#4)=;>(WvrPUKVoz5j$vIpDX?W&TO0&GILS~V0`)7rE&x3C;tWN;%0RK diff --git a/third_party/16x16-RPG-characters/sprites/old-style/06-conjurer.png b/third_party/16x16-RPG-characters/sprites/old-style/06-conjurer.png deleted file mode 100644 index 296c43436b49eec168f74f97c50259d26bd08c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8565 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 diff --git a/toolchain/apply-mame-sdbg-patch.sh b/toolchain/apply-mame-sdbg-patch.sh deleted file mode 100755 index d366d26..0000000 --- a/toolchain/apply-mame-sdbg-patch.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# Применяет воспроизводимый backend sdbg к checkout MAME 0.287. -set -eu - -project_dir=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -mame_source=${1:-"$project_dir/mame/sources/MAME"} -patch_file="$project_dir/toolchain/mame-patches/0001-sdbg-debugger-backend.patch" - -if git -C "$mame_source" apply --reverse --check "$patch_file" 2>/dev/null; then - echo "MAME sdbg backend уже применён: $mame_source" -elif git -C "$mame_source" apply --check "$patch_file"; then - git -C "$mame_source" apply "$patch_file" - echo "MAME sdbg backend применён: $mame_source" -else - echo "Не удалось применить sdbg patch к $mame_source" >&2 - echo "Ожидается MAME 0.287, commit b0c4527c." >&2 - exit 1 -fi diff --git a/toolchain/make_hdd.sh b/toolchain/make_hdd.sh index 3e007d7..6146818 100755 --- a/toolchain/make_hdd.sh +++ b/toolchain/make_hdd.sh @@ -11,7 +11,7 @@ # Sprinter DSS штатно монтирует стандартный MBR+FAT16 (подтверждено). # # Использование: -# toolchain/make_hdd.sh mame/v306/IMG/test_hdd.chd prog.exe data1 data2 ... +# toolchain/make_hdd.sh build/hdd/test.chd prog.exe data1 data2 ... # toolchain/make_hdd.sh --dest games/sprpop out.chd prog.exe data1 ... # toolchain/make_hdd.sh out.chd prog.exe KID:kid0.atl GUARD:g0.atl ... # — аргумент вида КАТАЛОГ:файл кладёт файл в подкаталог относительно diff --git a/toolchain/make_release.sh b/toolchain/make_release.sh index c49e856..e020c16 100755 --- a/toolchain/make_release.sh +++ b/toolchain/make_release.sh @@ -13,9 +13,10 @@ # - runtime/ : crt0 + bank/heap support # - libc/include/ : public headers # - libc/{io,stdio,mem,gfx}/ : libc sources (assembled into sprinter.lib) -# - lib/Makefile + lib/sprinter.lib : prebuilt library + recipe to rebuild +# - lib/*.lib : prebuilt libc/BGI variants # - app.mk + disk/run tools : standalone application integration # - libbgi/ + lib/bgi256*.lib : graphics library +# - tests/ + testkit/ : SDK regression programs # - third_party/sdcc/ : vendored SDCC 4.5 # - release_docs/ → docs/ : user-facing documentation # - root Makefile, README, RELEASE_NOTES, LICENSE @@ -54,7 +55,7 @@ mkdir -p "$STAGE" cp README.md RELEASE_NOTES.md LICENSE Makefile app.mk "$STAGE/" # Toolchain -cp -R bin runtime libc libbgi "$STAGE/" +cp -R bin runtime libc libbgi tests testkit "$STAGE/" # Core tools and source debugger backend needed by sprinter-cc/app.mk. mkdir -p "$STAGE/toolchain/mkexe" cp toolchain/mkexe/mkexe "$STAGE/toolchain/mkexe/" @@ -72,9 +73,8 @@ cp -R toolchain/mcp "$STAGE/toolchain/" # Lib — keep Makefile and the prebuilt archive only; sources are in libc/ mkdir -p "$STAGE/lib" -cp lib/Makefile "$STAGE/lib/" -cp lib/sprinter.lib "$STAGE/lib/" -cp lib/sprinter_safe.lib lib/bgi256.lib lib/bgi256_safe.lib "$STAGE/lib/" +cp lib/sprinter.lib lib/sprinter_safe.lib \ + lib/bgi256.lib lib/bgi256_safe.lib "$STAGE/lib/" # Vendored SDCC — follow symlinks so the real content lands in the tarball mkdir -p "$STAGE/third_party" @@ -90,6 +90,7 @@ mkdir -p "$STAGE/third_party" echo ">> stripping build artefacts and macOS metadata" find "$STAGE" \( \ -name '.sprinter-cc-*' -o \ + -name '.resource-stamps' -o -name build -o \ -name '*.rel' -o -name '*.lst' -o -name '*.sym' -o -name '*.asm' -o \ -name '*.ihx' -o -name '*.lk' -o -name '*.map' -o -name '*.noi' -o \ -name '*.exe' -o \ diff --git a/toolchain/mame-patches/0001-sdbg-debugger-backend.patch b/toolchain/mame-patches/0001-sdbg-debugger-backend.patch deleted file mode 100644 index 67e46b9..0000000 --- a/toolchain/mame-patches/0001-sdbg-debugger-backend.patch +++ /dev/null @@ -1,129 +0,0 @@ -diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua ---- a/scripts/src/osd/modules.lua -+++ b/scripts/src/osd/modules.lua -@@ -69,6 +69,7 @@ - MAME_DIR .. "src/osd/modules/debugger/debugkeyconfig.h", - MAME_DIR .. "src/osd/modules/debugger/debuggdbstub.cpp", - MAME_DIR .. "src/osd/modules/debugger/debugimgui.cpp", -+ MAME_DIR .. "src/osd/modules/debugger/sdbg.cpp", - MAME_DIR .. "src/osd/modules/debugger/debugwin.cpp", - MAME_DIR .. "src/osd/modules/debugger/none.cpp", - MAME_DIR .. "src/osd/modules/debugger/xmlconfig.cpp", -diff --git a/scripts/src/osd/mac.lua b/scripts/src/osd/mac.lua ---- a/scripts/src/osd/mac.lua -+++ b/scripts/src/osd/mac.lua -@@ -78,6 +78,7 @@ - - files { - MAME_DIR .. "src/osd/modules/debugger/debugosx.mm", -+ MAME_DIR .. "src/osd/modules/debugger/sdbgmac.mm", - MAME_DIR .. "src/osd/modules/debugger/osx/breakpointsview.mm", - MAME_DIR .. "src/osd/modules/debugger/osx/breakpointsview.h", - MAME_DIR .. "src/osd/modules/debugger/osx/consoleview.mm", -diff --git a/src/osd/modules/debugger/sdbg.cpp b/src/osd/modules/debugger/sdbg.cpp -new file mode 100644 ---- /dev/null -+++ b/src/osd/modules/debugger/sdbg.cpp -@@ -0,0 +1,72 @@ -+// license:BSD-3-Clause -+// copyright-holders:Sprinter C-Compiler contributors -+//============================================================ -+// -+// sdbg.cpp - headless debugger wait loop for an external DAP bridge -+// -+//============================================================ -+ -+#include "emu.h" -+#include "debug_module.h" -+#include "modules/lib/osdobj_common.h" -+ -+#if defined(OSD_MAC) -+void sdbg_poll_mac_events(); -+#endif -+ -+ -+namespace osd { -+ -+namespace { -+ -+class debug_sdbg : public osd_module, public debug_module -+{ -+public: -+ debug_sdbg() : osd_module(OSD_DEBUG_PROVIDER, "sdbg"), debug_module(), -+ m_osd(nullptr), m_next_host_poll(0) -+ { } -+ -+ virtual int init(osd_interface &osd, const osd_options &options) override -+ { -+ m_osd = &dynamic_cast(osd); -+ return 0; -+ } -+ virtual void exit() override { } -+ -+ virtual void init_debugger(running_machine &machine) override { } -+ virtual void wait_for_debugger(device_t &device, bool firststop) override; -+ virtual void debugger_update() override { } -+ -+private: -+ osd_common_t *m_osd; -+ osd_ticks_t m_next_host_poll; -+}; -+ -+void debug_sdbg::wait_for_debugger(device_t &device, bool firststop) -+{ -+ // debugger_cpu::wait_for_debugger вызывает Lua periodic перед каждым -+ // обращением сюда. Короткий sleep исключает busy-loop, после возврата -+ // внешний bridge получает следующую возможность обработать RPC. -+ // Без обработки событий окон macOS считает MAME зависшим, пока CPU -+ // удерживается на точке VS Code. 100 Hz достаточно для Dock/Cmd-Tab. -+ osd_ticks_t const current = osd_ticks(); -+ if (current >= m_next_host_poll) -+ { -+#if defined(OSD_MAC) -+ sdbg_poll_mac_events(); -+#else -+ // Текущий mame.arm собран на SDL3: pump + poll необходимы, -+ // поскольку обычный frame_update не выполняется при остановке CPU. -+ m_osd->input_update(false); -+ m_osd->process_events(); -+#endif -+ m_next_host_poll = current + osd_ticks_per_second() / 100; -+ } -+ osd_sleep(osd_ticks_per_second() / 1000); -+} -+ -+} // anonymous namespace -+ -+} // namespace osd -+ -+MODULE_DEFINITION(DEBUG_SDBG, osd::debug_sdbg) -diff --git a/src/osd/modules/debugger/sdbgmac.mm b/src/osd/modules/debugger/sdbgmac.mm -new file mode 100644 ---- /dev/null -+++ b/src/osd/modules/debugger/sdbgmac.mm -@@ -0,0 +1,14 @@ -+// license:BSD-3-Clause -+// copyright-holders:Sprinter C-Compiler contributors -+// Прокачка событий Cocoa в headless debugger без окна штатного debugger. -+ -+#import -+ -+extern void MacPollInputs(); -+ -+void sdbg_poll_mac_events() -+{ -+ NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; -+ MacPollInputs(); -+ [pool release]; -+} -diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp ---- a/src/osd/modules/lib/osdobj_common.cpp -+++ b/src/osd/modules/lib/osdobj_common.cpp -@@ -282,6 +282,7 @@ - REGISTER_MODULE(m_mod_man, DEBUG_QT); - REGISTER_MODULE(m_mod_man, DEBUG_IMGUI); - REGISTER_MODULE(m_mod_man, DEBUG_GDBSTUB); -+ REGISTER_MODULE(m_mod_man, DEBUG_SDBG); - REGISTER_MODULE(m_mod_man, DEBUG_NONE); - #endif - diff --git a/toolchain/mame_interactive.py b/toolchain/mame_interactive.py index c68c991..8f3c635 100644 --- a/toolchain/mame_interactive.py +++ b/toolchain/mame_interactive.py @@ -221,8 +221,6 @@ def main(): ap.add_argument("--snapshot-dir", help="каталог кадров, по умолчанию build/mame-autotest") args = ap.parse_args() profile = from_arguments(args) - if profile.binary is None and (Path(PROJECT_ROOT)/"mame/v306/mame.arm").is_file(): - profile = MameProfile.resolve({"MAME_HOME":str(Path(PROJECT_ROOT)/"mame/v306")}) try: profile.validate(dss=True) except ValueError as error: diff --git a/toolchain/png_strip.py b/toolchain/png_strip.py index d7c860a..5165b4a 100644 --- a/toolchain/png_strip.py +++ b/toolchain/png_strip.py @@ -27,7 +27,7 @@ png_strip.py — генерик-конвертер произвольного н следующего вызова. Так несколько независимо собранных лент (напр. разные типы тайлов) можно свести в ОДНУ палитру для одновременного показа - на экране (см. applications/PoP/poc/tools/ + на экране (см. ../Applications/PoP-Archive/poc/tools/ build_room_palette.py). Каждая картинка — источник ОДНОГО кадра ленты (не атлас-сетка; diff --git a/toolchain/pop_extract_font.py b/toolchain/pop_extract_font.py deleted file mode 100644 index 12c939e..0000000 --- a/toolchain/pop_extract_font.py +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python3 -"""pop_extract_font.py — SDLPoP-шрифты в один Sprinter .atl-ресурс. - -Источник истины — оригинальные встроенные шрифты SDLPoP: - * hc_small_font_data[] из menu.c — пункты меню; - * hc_font_data[] из seg009.c — крупные сообщения/заголовки. - -В исходнике глиф — IMAGE_DATA(height, width, flags) и 1-битные строки. -Здесь его силуэт переводится в getimage (0xFF = прозрачность) и пакуется в -FONT\\FONT.ATL. Это именно шрифтовой атлас, а не заранее нарисованные -строки: номер ленты = код ASCII, поэтому runtime сохраняет произвольный -текст и пропорциональную ширину оригинала. - -Хвост страницы [0x3C00..0x3FFF] намеренно оставлен свободным: pop_menu.c -кладёт туда снимок игровой палитры на время паузы. Тогда 1 КБ не занимает -дефицитную W2. -""" -import re -from pathlib import Path - -ROOT = Path(__file__).resolve().parent.parent -SRC_SMALL = ROOT / "applications" / "PoP" / "SDLPoP" / "src" / "menu.c" -SRC_BIG = ROOT / "applications" / "PoP" / "SDLPoP" / "src" / "seg009.c" -OUT_DIR = ROOT / "applications" / "PoP" / "poc" / "res" / "font" -OUT_ATL = OUT_DIR / "font.atl" -OUT_H = ROOT / "applications" / "PoP" / "roomtest" / "pop_font.h" - -FIRST, LAST = 32, 126 -FONT_COLOR = 0x3F -# ВТОРОЙ ЦВЕТ КРУПНОГО ШРИФТА. У SDLPoP шрифт — маска, и цвет задаётся -# параметром рисования (show_hof_text рисует текст дважды: тень цветом 0 со -# сдвигом (1,1) и сам текст цветом 0xB7). У нас цвет запечён в пиксели -# глифа, поэтому второй цвет — это второй набор глифов. Он нужен таблице -# рекордов: чёрная тень строк и тёмное имя на золотой полосе ввода. -# Набор крупный, потому что draw_text() рисует hc_font (seg009:1594). -FONT_DARK_COLOR = 0x3E -# Каталог SPA1 хранит число картинок одним байтом, а три полных набора по -# 95 глифов — это 285. Тёмному набору полный ASCII и не нужен: им пишется -# только таблица рекордов (имена A..Z, время вида 59:43 и курсор ввода -# '_'), поэтому он обрезан по '_'. 190 + 64 = 254 картинки — потолок. -DARK_FIRST, DARK_LAST = 32, 95 -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -SNAPSHOT_OFF = 0x3C00 -PAGE_SIZE = 16384 - - -def extract_array(path: Path, name: str) -> list[int]: - text = path.read_text() - match = re.search(rf"byte {name}\[\] = \{{(.*?)\n\}};", text, re.S) - assert match, f"{name} not found in {path}" - body = re.sub(r"//[^\n]*", "", match.group(1)) - body = re.sub(r"/\*.*?\*/", "", body, flags=re.S) - - def word(mm: re.Match) -> str: - value = int(mm.group(1), 0) - return f"{value & 0xFF}, {(value >> 8) & 0xFF}" - - def bin4(mm: re.Match) -> str: - b7, b6, b5, b4 = (int(v, 0) if v != "_" else 0 for v in mm.groups()) - return str((b4 << 4) | (b5 << 5) | (b6 << 6) | (b7 << 7)) - - def bin8(mm: re.Match) -> str: - bits = [int(v, 0) if v != "_" else 0 for v in mm.groups()] - return str(sum(bit << (7 - i) for i, bit in enumerate(bits))) - - def image_data(mm: re.Match) -> str: - h, w, flags = (int(v, 0) for v in mm.groups()) - return (f"{h & 0xFF}, {(h >> 8) & 0xFF}, " - f"{w & 0xFF}, {(w >> 8) & 0xFF}, " - f"{flags & 0xFF}, {(flags >> 8) & 0xFF}") - - body = re.sub(r"\bWORD\s*\(\s*(\w+)\s*\)", word, body) - body = re.sub(r"\bIMAGE_DATA\s*\(\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*\)", - image_data, body) - body = re.sub(r"\bBINARY_4\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin4, body) - body = re.sub(r"\bBINARY_8\s*\(\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*" - r"([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*,\s*([_\dxXa-fA-F]+)\s*\)", bin8, body) - body = re.sub(r"\b_\b", "0", body) - # Hex обязан идти первым: иначе regexp съедает в `0x20` только `0`. - return [int(v, 0) for v in re.findall(r"0[xX][0-9a-fA-F]+|\d+", body)] - - -def parse_glyphs(vals: list[int]) -> tuple[dict, list[dict]]: - first, last = vals[0], vals[1] - font = { - "first": first, - "last": last, - "ascent": vals[2] | (vals[3] << 8), - "below": vals[4] | (vals[5] << 8), - "space_lines": vals[6] | (vals[7] << 8), - "space_chars": vals[8] | (vals[9] << 8), - } - pos = 10 + (last - first + 1) * 2 # offsets у SDLPoP вычисляются в runtime - glyphs = [] - while pos < len(vals): - h = vals[pos] | (vals[pos + 1] << 8) - w = vals[pos + 2] | (vals[pos + 3] << 8) - pos += 6 # height, width, flags - stride = (w + 7) // 8 - rows = [] - for _ in range(h): - rows.append(vals[pos:pos + stride]) - pos += stride - glyphs.append({"h": h, "w": w, "rows": rows}) - assert len(glyphs) == last - first + 1, f"glyph count {len(glyphs)}" - return font, glyphs - - -def glyph_pixels(glyph: dict, color: int) -> bytes: - """1 бит/пиксель SDLPoP -> 8bpp getimage: 1 = color.""" - out = bytearray() - for row in glyph["rows"]: - for x in range(glyph["w"]): - byte = row[x // 8] - on = byte & (1 << (7 - (x & 7))) - out.append(color if on else 0xFF) - return bytes(out) - - -def pack_atlas(fonts: list[tuple[dict, list[dict], int]]) -> int: - entries = [] - for font, glyphs, color, first, last in fonts: - assert font["first"] <= first <= last <= font["last"] - entries.extend((glyph, color) for glyph in - glyphs[first - font["first"]:last - font["first"] + 1]) - assert len(entries) <= 255 - - data_off = ATL_DIR_OFF + len(entries) * 8 - out = bytearray(data_off) - out[0:4] = ATL_MAGIC - out[4] = len(entries) - for index, (glyph, color) in enumerate(entries): - offset = len(out) - pixels = glyph_pixels(glyph, color) - out += glyph["w"].to_bytes(2, "little") - out += glyph["h"].to_bytes(2, "little") - out += pixels - directory = ATL_DIR_OFF + index * 8 - out[directory:directory + 2] = offset.to_bytes(2, "little") - out[directory + 2] = glyph["w"] - out[directory + 3] = glyph["h"] - out[directory + 4] = 1 - out[directory + 5] = 1 - - if len(out) > SNAPSHOT_OFF: - raise SystemExit(f"font atlas: {len(out)} Б, нет места для palette snapshot @ {SNAPSHOT_OFF:#x}") - OUT_DIR.mkdir(parents=True, exist_ok=True) - OUT_ATL.write_bytes(out) - return len(out) - - -def emit_header(small: dict, big: dict, atlas_size: int) -> None: - small_n = LAST - FIRST + 1 - text = f"""/* - * pop_font.h — контракт FONT\\FONT.ATL, СГЕНЕРИРОВАН. - * Источник: SDLPoP hc_small_font_data[] и hc_font_data[]. - * Генератор: toolchain/pop_extract_font.py. Руками не править. - */ -#ifndef POP_FONT_H -#define POP_FONT_H - -#include - -#define POP_FONT_COLOR 0x{FONT_COLOR:02X} -#define POP_FONT_DARK_COLOR 0x{FONT_DARK_COLOR:02X} -#define POP_FONT_FIRST {FIRST} -#define POP_FONT_LAST {LAST} -#define POP_FONT_SMALL_BASE 0 -#define POP_FONT_SMALL_ASCENT {small['ascent']} -#define POP_FONT_SMALL_SPACE {small['space_chars']} -#define POP_FONT_BIG_BASE {small_n} -#define POP_FONT_BIG_ASCENT {big['ascent']} -#define POP_FONT_BIG_SPACE {big['space_chars']} -/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом. - * Набор обрезан по '_' — им пишется только таблица рекордов. */ -#define POP_FONT_DARK_BASE {2 * small_n} -#define POP_FONT_DARK_FIRST {DARK_FIRST} -#define POP_FONT_DARK_LAST {DARK_LAST} -#define POP_FONT_SNAPSHOT_OFF 0x{SNAPSHOT_OFF:04X} -#define POP_FONT_ATLAS_SIZE {atlas_size} - -#endif -""" - OUT_H.write_text(text) - - -def main() -> None: - parsed = [] - for path, name in ((SRC_SMALL, "hc_small_font_data"), (SRC_BIG, "hc_font_data")): - font, glyphs = parse_glyphs(extract_array(path, name)) - print(f"{name}: chars={font['first']}..{font['last']} ascent={font['ascent']} " - f"space={font['space_chars']}") - parsed.append((font, glyphs)) - sets = [(parsed[0][0], parsed[0][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_COLOR, FIRST, LAST), - (parsed[1][0], parsed[1][1], FONT_DARK_COLOR, DARK_FIRST, DARK_LAST)] - atlas_size = pack_atlas(sets) - emit_header(parsed[0][0], parsed[1][0], atlas_size) - print(f"{OUT_ATL}: 2 x {LAST - FIRST + 1} + {DARK_LAST - DARK_FIRST + 1} glyphs, " - f"{atlas_size} Б; " - f"snapshot from 0x{SNAPSHOT_OFF:04X}") - - -if __name__ == "__main__": - main() diff --git a/toolchain/pop_pack_intro.py b/toolchain/pop_pack_intro.py deleted file mode 100644 index 469b258..0000000 --- a/toolchain/pop_pack_intro.py +++ /dev/null @@ -1,349 +0,0 @@ -#!/usr/bin/env python3 -"""Упаковка story/PV intro SDLPoP в полосы SPA1 для Sprinter. - -Исходники остаются единственным источником истины: TITLE/res41..45, res51 и -PV/res800/850/950/980. Runtime получает только готовые 320x200 композиции -и 256-цветные палитры. Это намеренно переносит смешивание палитров Princess, -Jaffar, спальни и кровати из ограниченного Z80 в build-time. -""" -from pathlib import Path - -from PIL import Image - -ROOT = Path(__file__).resolve().parent.parent -TITLE = ROOT / "applications" / "PoP" / "SDLPoP" / "data" / "TITLE" -PV = ROOT / "applications" / "PoP" / "SDLPoP" / "data" / "PV" -PRINCE = ROOT / "applications" / "PoP" / "SDLPoP" / "data" / "PRINCE" -KID = ROOT / "applications" / "PoP" / "SDLPoP" / "data" / "KID" -OUT = ROOT / "applications" / "PoP" / "poc" / "res" / "pv" - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - -# ФОН ТЕКСТОВОЙ РАМКИ — ОТДЕЛЬНЫЙ ИНДЕКС. У оригинала это индекс 14 в -# строке палитры спрайтов title40, и load_title_images() красит его либо в -# #100060 (интро), либо в #800000 (финал, seg001:586). Раньше мы -# ремапили 14 в 9 — «тёмно-синий» палитры res51; подменить его нельзя, -# потому что тем же индексом нарисована сама титульная картинка (8265 -# пикселей). Поэтому фон уезжает в свободный индекс, и финал красит -# только его (pop_pal_story_ending). -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) -# Цвет текста таблицы рекордов: 0xB7 оригинала = седьмой цвет палитры -# title (224,160,0). Глифы шрифта запечены индексом POP_FONT_COLOR, так -# что цвет им даёт именно эта запись; тёмный набор (POP_FONT_DARK_COLOR) -# остаётся чёрным — старшие записи story.pal и так чёрные. -STORY_FONT_INDEX = 0x3F - - -def transpose_cols(width: int, height: int, rowmajor: bytes) -> bytes: - """Row-major -> column-major для бесплатного horizontal flip в BGI.""" - out = bytearray(width * height) - for column in range(width): - base = column * height - for row in range(height): - out[base + row] = rowmajor[row * width + column] - return bytes(out) - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"intro atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def sprite_atlas(path: Path, entries: dict[int, tuple[int, int, bytes]]) -> None: - """Атлас небольших прозрачных кадров, целиком живущий в одной EMM. - - В отличие от atlas_blob() для полноэкранной полосы, здесь нужен каталог - нескольких картинок: runtime держит страницу открытой всю PV-сцену и - переключает только idx. Пустые индексы не требуются — все наборы ниже - нумеруются подряд с нуля. - """ - count = len(entries) - if not count or count > 255: - raise SystemExit(f"{path}: bad sprite atlas count {count}") - data_off = ATL_DIR_OFF + count * 8 - directory = bytearray(count * 8) - blobs = bytearray() - for idx in range(count): - width, height, pixels = entries[idx] - offset = data_off + len(blobs) - blobs += width.to_bytes(2, "little") + height.to_bytes(2, "little") - blobs += pixels - d = idx * 8 - directory[d:d + 2] = offset.to_bytes(2, "little") - directory[d + 2] = width - directory[d + 3] = height - directory[d + 4] = directory[d + 5] = 1 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = count - out[ATL_DIR_OFF:ATL_DIR_OFF + len(directory)] = directory - out += blobs - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"{path}: {len(out)} B > one EMM page") - path.write_bytes(out) - - -def sprite_frames(directory: Path, first: int, last: int, - color_base: int, column_major: bool = False - ) -> dict[int, tuple[int, int, bytes]]: - """PNG-кадры -> getimage. Ноль PNG становится прозрачным 0xFF BGI.""" - result = {} - for index, number in enumerate(range(first, last + 1)): - image = png(directory, number) - pixels = bytes(0xFF if pixel == 0 else color_base + pixel - for pixel in image.tobytes()) - if column_major: - pixels = transpose_cols(image.width, image.height, pixels) - result[index] = image.width, image.height, pixels - return result - - -def png(directory: Path, number: int) -> Image.Image: - image = Image.open(directory / f"res{number}.png") - if image.mode != "P": - raise SystemExit(f"res{number}.png: expected indexed PNG, got {image.mode}") - return image.copy() - - -def pal_file(path: Path) -> list[tuple[int, int, int]]: - """16 цветов из .pal ресурса (4 байта заголовка, дальше RGB по 6 бит).""" - raw = path.read_bytes() - return [(raw[4 + i * 3] << 2, raw[5 + i * 3] << 2, raw[6 + i * 3] << 2) - for i in range(16)] - - -def palette(image: Image.Image) -> list[tuple[int, int, int]]: - raw = image.getpalette() - return [tuple(raw[index * 3:index * 3 + 3]) for index in range(16)] - - -def write_palette(path: Path, entries: list[tuple[int, int, int]], - extra=None) -> None: - """B,G,R,0 — ровно формат gfx_pal_fload; незадействованное чёрное.""" - out = bytearray() - entries = (entries + [(0, 0, 0)] * 256)[:256] - for index, color in (extra or {}).items(): - entries[index] = color - for red, green, blue in entries: - out += bytes((blue, green, red, 0)) - path.write_bytes(out) - - -def write_scene(prefix: str, number: int, canvas: Image.Image) -> None: - if canvas.size != (320, 200): - raise SystemExit(f"{prefix}{number}: expected 320x200, got {canvas.size}") - for part, top in enumerate(range(0, 200, STRIP_H)): - band = canvas.crop((0, top, 320, min(top + STRIP_H, 200))) - (OUT / f"{prefix}{number}_{part}.atl").write_bytes( - atlas_blob(band.tobytes(), band.width, band.height)) - - -def story_scenes() -> list[Image.Image]: - """show_title/end_sequence в единой с title палитре. - - res41 кодирует тёмный фон индексом 14, а его палитра делает этот индекс - чёрным; show_title() SDLPoP подменяет его #100060 либо #800000. Тексты - res42..45 имеют индекс 1, но этот индекс у res41 тоже тёмный; ремап на - индекс title/res51 15 (белый) позволяет проявлять историю прямо поверх - последнего title-экрана без смены палитры. Фон уезжает в - STORY_BG_INDEX, чтобы финал мог покрасить его отдельно. - - Последний экран — фон таблицы рекордов: та же рамка плюс логотип - PRINCE OF PERSIA на y=24 (HOF_POP оригинала — тот же спрайт res54, что - и в титрах, только выше). - """ - frame_raw = bytearray(png(TITLE, 41).tobytes()) - for offset, pixel in enumerate(frame_raw): - if pixel == 14: - frame_raw[offset] = STORY_BG_INDEX - frame = Image.frombytes("P", (320, 200), bytes(frame_raw)) - result = [] - for text_number, ypos in ((42, 25), (43, 25), (45, 26), (44, 25)): - canvas = frame.copy() - raw = bytearray(canvas.tobytes()) - text = png(TITLE, text_number) - for sy in range(text.height): - for sx in range(text.width): - if text.getpixel((sx, sy)): - raw[(ypos + sy) * 320 + 24 + sx] = 15 - canvas.frombytes(bytes(raw)) - result.append(canvas) - result.append(frame) - - hof = frame.copy() - raw = bytearray(hof.tobytes()) - logo = png(TITLE, 54) - for sy in range(logo.height): - for sx in range(logo.width): - pixel = logo.getpixel((sx, sy)) - if pixel: # blitters_10h_transp: 0 сквозной - raw[(24 + sy) * 320 + 24 + sx] = pixel - hof.frombytes(bytes(raw)) - result.append(hof) - return result - - -def pv_palette_canvas() -> tuple[Image.Image, list[tuple[int, int, int]]]: - """Спальня + bed. Номера 0..15=room, 16..31=Princess, - 32..47=Jaffar, 48..63=bed. Благодаря этому у смешанных PNG не теряются - исходные цвета при одном gfx_pal_fload() на весь PV.""" - room = png(PV, 951) - bed = png(PV, 981) - raw = bytearray(room.tobytes()) - bed_raw = bed.tobytes() - for sy in range(bed.height): - for sx in range(bed.width): - pixel = bed_raw[sy * bed.width + sx] - if pixel: - raw[(142 + sy) * 320 + sx] = 48 + pixel - canvas = Image.frombytes("P", room.size, bytes(raw)) - # 80..95 — пламя факелов. Это отдельный chtab PRINCE в оригинале; без - # отдельной строки цвета динамические кадры становились бы цветами стены. - # 112..127 (0x70) — палитра КИДА: на PV-экране финала и сцен 8/9 он и - # мышь рисуются СВОИМИ атласами (chtab_2), а их индексы запечены под - # игровые слоты 0x70. Без этой строки они выходили бы чёрными. - return (canvas, palette(room) + palette(png(PV, 801)) + - palette(png(PV, 851)) + palette(bed) + palette(png(PV, 901)) + - palette(png(PRINCE, 151)) + [(0, 0, 0)] * 16 + - pal_file(KID / "res400.pal")) - - -def sprite_paste(dst: Image.Image, sprite: Image.Image, x: int, floor: int, - color_base: int) -> None: - """Положить спрайт ногами на floor, remap его палитру в отдельную строку.""" - raw = bytearray(dst.tobytes()) - src = sprite.tobytes() - y = floor - sprite.height - for sy in range(sprite.height): - dy = y + sy - if dy < 0 or dy >= 200: - continue - for sx in range(sprite.width): - dx = x + sx - pixel = src[sy * sprite.width + sx] - if pixel and 0 <= dx < 320: - raw[dy * 320 + dx] = color_base + pixel - dst.frombytes(bytes(raw)) - - -def pv_scenes() -> tuple[list[Image.Image], list[tuple[int, int, int]]]: - base, colors = pv_palette_canvas() - - # Позиции Char из init_princess()/init_vizier(): x=120/198, y=166. - # В оригинале точный offset задаёт frame table; статические композиции - # выравнивают персонажей по полу y=166, не хранят таблицы PV-анимации. - waiting = base.copy() - sprite_paste(waiting, png(PV, 801), 110, 166, 16) - - jaffar = waiting.copy() - sprite_paste(jaffar, png(PV, 851), 188, 166, 32) - - magic = base.copy() - sprite_paste(magic, png(PV, 805), 110, 166, 16) - sprite_paste(magic, png(PV, 870), 188, 166, 32) - # res953 — первый полный кадр песочных часов; он использует палитру room. - sprite_paste(magic, png(PV, 953), 18, 166, 0) - - alone = base.copy() - sprite_paste(alone, png(PV, 816), 110, 166, 16) - sprite_paste(alone, png(PV, 959), 18, 166, 0) - - # FG9: статические ключевые позы тех же scene 2/4/6/8/9/12. PV2 - # использует второй набор Princess (res900), поэтому он лежит в строке - # палитры 64..79. Мышь в оригинале меняет только короткую позу рядом с - # Princess; здесь соответствующая стадия выделена отдельным кадром. - stand = base.copy() - sprite_paste(stand, png(PV, 801), 134, 166, 16) - - lying = base.copy() - sprite_paste(lying, png(PV, 901), 78, 162, 64) - # Часы для cutscene_4 выбираются runtime по оставшимся минутам и - # анимируются вместе с песком; в статической основе их быть не должно. - - mouse = base.copy() - sprite_paste(mouse, png(PV, 920), 120, 169, 64) - sprite_paste(mouse, png(PV, 959), 18, 166, 0) - - short_time = base.copy() - sprite_paste(short_time, png(PV, 816), 146, 166, 16) - sprite_paste(short_time, png(PV, 953), 18, 166, 0) - - return [waiting, jaffar, magic, alone, stand, lying, mouse, short_time], colors - - -def pv_animation_assets() -> None: - """Ресурсы покадрового intro. - - `b0_*` — единственный чистый фон. Он копируется accelerator-ом между - обеими экранными страницами; спрайты рисуются банком без shadow, так что - следующий кадр автоматически начинает с фона. Каждый actor-атлас <=16K, - поэтому нет чтения 320x200 с HDD в анимационном цикле. - """ - base, _ = pv_palette_canvas() - write_scene("b", 0, base) - # frame_tbl_cuts из SDLPoP адресует Princess как image 0..16 ресурса - # 800 (то есть PNG res801..817). Для Jaffar PV1 адресуется ресурс 850: - # image 0..37 = res851..888. Все 38 кадров не помещаются в одну EMM, - # поэтому сохраняем их тремя последовательными атласами. Runtime знает - # границы, но номер кадра остаётся исходным image-id 0..37. - sprite_atlas(OUT / "a0.atl", sprite_frames(PV, 801, 817, 16, True)) - sprite_atlas(OUT / "j0.atl", sprite_frames(PV, 851, 863, 32, True)) - sprite_atlas(OUT / "j1.atl", sprite_frames(PV, 864, 874, 32, True)) - sprite_atlas(OUT / "j2.atl", sprite_frames(PV, 875, 888, 32, True)) - # ВТОРОЙ набор Princess (PV2, res901..930 = image 0..29 ресурса 900). - # Он нужен сценам 8/9 (сидит и гладит мышь, встаёт, приседает) и финалу - # (поворачивается и обнимает Кида) — поз PV1 для этого не хватает. - # 26.7 КБ не влезают в одну EMM, поэтому два атласа; номер кадра при - # этом остаётся исходным image-id 0..29, границу знает runtime. - # Палитровая строка 64..79 — та же, что у PV2 в статических сценах. - sprite_atlas(OUT / "a1.atl", sprite_frames(PV, 901, 917, 64, True)) - sprite_atlas(OUT / "a2.atl", sprite_frames(PV, 918, 930, 64, True)) - # res953/res954 — состояния часов, res960..962 — три фазы песка. - sprite_atlas(OUT / "h0.atl", sprite_frames(PV, 952, 962, 0)) - sprite_atlas(OUT / "t0.atl", sprite_frames(PRINCE, 151, 159, 80)) - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - - stories = story_scenes() - write_palette(OUT / "story.pal", palette(png(TITLE, 51)), - {STORY_BG_INDEX: STORY_BG_COLOR, - STORY_FONT_INDEX: (224, 160, 0)}) - for number, scene in enumerate(stories): - write_scene("s", number, scene) - - scenes, colors = pv_scenes() - write_palette(OUT / "pv.pal", colors) - for number, scene in enumerate(scenes): - write_scene("p", number, scene) - - pv_animation_assets() - - print(f"{OUT}: {len(stories)} story + 8 PV compositions + base x 5 strips, " - f"6 animated actor atlases, one strip/page <= {STRIP_H} rows") - - -if __name__ == "__main__": - main() diff --git a/toolchain/pop_pack_title.py b/toolchain/pop_pack_title.py deleted file mode 100644 index f94eaf1..0000000 --- a/toolchain/pop_pack_title.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python3 -"""pop_pack_title.py — титульные композиции SDLPoP для Sprinter. - -Исходник — PNG-ресурсы ``data/TITLE/res51..55`` из локального SDLPoP. -Runtime не должен держать 320x200 картинку в W2 и не разбирает PNG: каждая -готовая композиция разрезана на пять getimage-лент высотой не более 49 -строк. Лента вместе с заголовком атласа занимает одну EMM-страницу; экран -рисуется лента за лентой, и страница сразу освобождается. - -Композиции в точности повторяют ``show_title()`` до story/intro: - t0 — основной рисунок; - t1 — рисунок + PRESENTS; - t2 — рисунок + название игры; - t3 — рисунок + логотип PRINCE OF PERSIA и Jordan Mechner. -""" -from pathlib import Path - -from PIL import Image - -ROOT = Path(__file__).resolve().parent.parent -SRC = ROOT / "applications" / "PoP" / "SDLPoP" / "data" / "TITLE" -OUT = ROOT / "applications" / "PoP" / "poc" / "res" / "title" - -ATL_MAGIC = b"SPA1" -ATL_DIR_OFF = 0x68 -ATL_MIN_SIZE = 0x100 -PAGE_SIZE = 16384 -STRIP_H = 49 - - -def atlas_blob(pixels: bytes, width: int, height: int) -> bytes: - """Один непрозрачный getimage в минимальном SPA1-атласе.""" - data_off = ATL_DIR_OFF + 8 - out = bytearray(data_off) - out[:4] = ATL_MAGIC - out[4] = 1 - out[ATL_DIR_OFF:ATL_DIR_OFF + 2] = data_off.to_bytes(2, "little") - # Каталог хранит preview-габарит в uint8, но atlas_image читает только - # offset; реальный getimage-width — u16 в блобе. Так уже пакуются - # широкие 320-пиксельные полосы фона. - out[ATL_DIR_OFF + 2] = min(width, 255) - out[ATL_DIR_OFF + 3] = height - out[ATL_DIR_OFF + 4] = out[ATL_DIR_OFF + 5] = 1 - out += width.to_bytes(2, "little") + height.to_bytes(2, "little") - out += pixels - if len(out) < ATL_MIN_SIZE: - out += bytes(ATL_MIN_SIZE - len(out)) - if len(out) > PAGE_SIZE: - raise SystemExit(f"title atlas {len(out)} B > {PAGE_SIZE} B") - return bytes(out) - - -def image(n: int) -> Image.Image: - im = Image.open(SRC / f"res{n}.png") - if im.mode != "P": - raise SystemExit(f"res{n}.png: expected indexed PNG, got {im.mode}") - return im.copy() - - -def assert_palette(base: Image.Image, overlay: Image.Image, n: int) -> None: - if base.getpalette()[:48] != overlay.getpalette()[:48]: - raise SystemExit(f"res{n}.png uses a palette different from res51.png") - - -def paste_opaque(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - dst.paste(src, (x, y)) - - -def paste_transparent(dst: Image.Image, src: Image.Image, x: int, y: int, n: int) -> None: - assert_palette(dst, src, n) - # TITLE_POP — единственный из пяти элементов, который SDLPoP рисует - # blitters_10h_transp. В PNG тот же факт записан colour-key index 0. - # Image.point() у P-изображения возвращает снова P, а paste() принимает - # маску только L/1/RGBA. Строим L явно, не меняя индексы самой картинки. - mask = Image.frombytes("L", src.size, - bytes(0 if p == 0 else 255 for p in src.tobytes())) - dst.paste(src, (x, y), mask) - - -# Семнадцатая запись — фон текстовой рамки story (STORY_BG_INDEX в -# pop_pack_intro.py). Она нужна здесь потому, что «In the absence…» -# проявляется полосами ПОВЕРХ последнего кадра титров, то есть при ещё -# загруженной title.pal: без этой записи фон рамки был бы чёрным. -STORY_BG_INDEX = 16 -STORY_BG_COLOR = (0x10, 0x00, 0x60) - - -def write_palette(base: Image.Image) -> None: - rgb = base.getpalette()[:48] - pal = bytearray() - for i in range(16): - r, g, b = rgb[i * 3:i * 3 + 3] - pal += bytes((b, g, r, 0)) # родной формат gfx_pal_fload - assert len(pal) == STORY_BG_INDEX * 4 - r, g, b = STORY_BG_COLOR - pal += bytes((b, g, r, 0)) - (OUT / "title.pal").write_bytes(pal) - - -def write_scene(scene: int, canvas: Image.Image) -> int: - count = 0 - for part, top in enumerate(range(0, canvas.height, STRIP_H)): - band = canvas.crop((0, top, canvas.width, - min(top + STRIP_H, canvas.height))) - path = OUT / f"t{scene}_{part}.atl" - path.write_bytes(atlas_blob(band.tobytes(), band.width, band.height)) - count += 1 - return count - - -def main() -> None: - OUT.mkdir(parents=True, exist_ok=True) - main_image = image(51) - if main_image.size != (320, 200): - raise SystemExit(f"res51.png: expected 320x200, got {main_image.size}") - - presents = main_image.copy() - paste_opaque(presents, image(52), 96, 106, 52) - - game = main_image.copy() - paste_opaque(game, image(53), 96, 122, 53) - - logo = main_image.copy() - paste_transparent(logo, image(54), 24, 107, 54) - paste_opaque(logo, image(55), 48, 184, 55) - - write_palette(main_image) - scenes = (main_image, presents, game, logo) - strips = [write_scene(i, scene) for i, scene in enumerate(scenes)] - assert strips == [5, 5, 5, 5] - print(f"{OUT}: {len(scenes)} title compositions x {strips[0]} strips, " - f"one strip <= {STRIP_H} rows / one EMM page") - - -if __name__ == "__main__": - main() diff --git a/toolchain/room_compose.py b/toolchain/room_compose.py index e438178..ce25b9f 100644 --- a/toolchain/room_compose.py +++ b/toolchain/room_compose.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ room_compose.py — генерик-компоновщик полноэкранного фона комнаты из -тайлов ПРОИЗВОЛЬНОГО размера (см. applications/PoP/docs/PORT_PLAN.md §4: +тайлов ПРОИЗВОЛЬНОГО размера (см. ../Applications/PoP-Archive/docs/PORT_PLAN.md §4: один полноэкранный фон на комнату готовится офлайн, поверх — спрайты через sprite.h). Не завязан ни на какой конкретный проект/игру — просто берёт раскладку тайлов, которую вы сами опишете, и картинки, которые diff --git a/toolchain/run-mame-mcp.sh b/toolchain/run-mame-mcp.sh index 3db93ac..ce5d8ec 100644 --- a/toolchain/run-mame-mcp.sh +++ b/toolchain/run-mame-mcp.sh @@ -6,7 +6,7 @@ if [ -f "$mame_root/.codex/mame.local.env" ]; then . "$mame_root/.codex/mame.local.env" fi : "${MAME_UV:=uv}" -: "${MAME_MCP_SCRIPT:=mame/sources/MAME/src/mame_mcp.py}" +: "${MAME_MCP_SCRIPT:=../MAME/src/mame_mcp.py}" cd "$mame_root" if ! command -v "$MAME_UV" >/dev/null 2>&1; then echo "mame-z80: uv не найден; добавьте его в PATH или задайте MAME_UV в .codex/mame.local.env" >&2 @@ -16,4 +16,11 @@ if [ ! -f "$MAME_MCP_SCRIPT" ]; then echo "mame-z80: сервер не найден: $MAME_MCP_SCRIPT; задайте MAME_MCP_SCRIPT в .codex/mame.local.env" >&2 exit 1 fi -exec "$MAME_UV" run --python 3.12 --no-project --with 'mcp<2' "$MAME_MCP_SCRIPT" +if [ -z "${MAME_PYTHON:-}" ]; then + if ! command -v pyenv >/dev/null 2>&1; then + echo "mame-z80: pyenv не найден; задайте MAME_PYTHON" >&2 + exit 1 + fi + MAME_PYTHON=$(pyenv which python) +fi +exec "$MAME_UV" run --python "$MAME_PYTHON" --no-project --with 'mcp<2' "$MAME_MCP_SCRIPT" diff --git a/toolchain/sdbg/model.py b/toolchain/sdbg/model.py index 4b874f8..12afb48 100644 --- a/toolchain/sdbg/model.py +++ b/toolchain/sdbg/model.py @@ -66,6 +66,20 @@ class DebugMap: logical = address & 0xffff return asdict(Location(address, logical, section, bank, logical >> 14)) + def variable_location(self, address, symbol): + """Разрешить доказанный linker-символ `__at` вне обычных секций. + + Код/точки по-прежнему обязаны принадлежать ровно одной секции. Для + global/static SDCC может намеренно поместить объект по абсолютному + адресу (например, scratch в W1); его адрес подтверждают и CDB, и NOI. + """ + try: + return self.location(address) + except ValueError: + if not (0 <= address <= 0xffff and self.symbols.get(symbol) == address): + raise + return asdict(Location(address, address, '_ABS', None, address >> 14)) + def _load(self, records): addresses, declarations = {}, [] module = None @@ -128,10 +142,12 @@ class DebugMap: if address is None and parts[0] == 'G': address = self.symbols.get('_'+parts[1]) if address is None: continue supported = bool(re.fullmatch(r'S[ICL]:[SU]', ctype) or ctype.startswith('DG,')) + linker_symbol = key if key in self.symbols else '_'+parts[1] variable = {'name': parts[1], 'module': module if parts[0] != 'G' else None, 'size': int(size), 'type': ctype, 'signed': ctype.endswith(':S') and not ctype.startswith('D'), - 'supported': supported, **self.location(address)} + 'supported': supported, + **self.variable_location(address, linker_symbol)} if variable not in self.variables: self.variables.append(variable) self.functions.sort(key=lambda f: f['start']) self.markers.sort(key=lambda m: m['link_address']) diff --git a/toolchain/sdbg_dap.py b/toolchain/sdbg_dap.py index 5e4a431..106588f 100644 --- a/toolchain/sdbg_dap.py +++ b/toolchain/sdbg_dap.py @@ -106,6 +106,10 @@ class Protocol: for key, option in profile_arguments.items(): if arguments.get(key): command.extend([option, arguments[key]]) + if arguments.get('appHdd'): + command.extend(['--app-hdd', arguments['appHdd']]) + if arguments.get('launchPath'): + command.extend(['--launch-path', arguments['launchPath']]) if arguments.get('debugger'): command.extend(['--debugger', arguments['debugger']]) if arguments.get('launchAt') is not None: diff --git a/toolchain/sdbg_driver.py b/toolchain/sdbg_driver.py index 1a38b43..2820c13 100644 --- a/toolchain/sdbg_driver.py +++ b/toolchain/sdbg_driver.py @@ -84,8 +84,12 @@ def run(wrapper, args): locks.mkdir(exist_ok=True) with (locks / (final_work.name + '.lock')).open('a') as lock: fcntl.flock(lock, fcntl.LOCK_EX) - with tempfile.TemporaryDirectory(prefix='.sdbg-build-', dir=output.parent) as temporary: + keep_stage = bool(os.environ.get('SDBG_KEEP_FAILED_STAGE')) + with tempfile.TemporaryDirectory(prefix='.sdbg-build-', dir=output.parent, + delete=not keep_stage) as temporary: stage = Path(temporary) + if keep_stage: + print('sdbg: диагностическая stage ' + str(stage), file=sys.stderr) new_exe = stage / output.name command = list(args) command[command.index('-o')+1] = str(new_exe) diff --git a/toolchain/sdbg_launcher.py b/toolchain/sdbg_launcher.py index 8958c04..b6b2878 100644 --- a/toolchain/sdbg_launcher.py +++ b/toolchain/sdbg_launcher.py @@ -7,6 +7,7 @@ from contextlib import redirect_stdout import json import os from pathlib import Path +import re import shutil import signal import subprocess @@ -157,6 +158,10 @@ def main(): parser.add_argument('--build',required=True) parser.add_argument('--socket',required=True) parser.add_argument('--data',action='append',default=[]) + parser.add_argument('--app-hdd',default=None, + help='локальный CHD приложения для -hard2') + parser.add_argument('--launch-path',default=None, + help='путь к EXE в DSS, например d:\\games\\sprpop\\sprpop.exe') parser.add_argument('--launch-at',type=float,default=0, help='не начинать ввод раньше этой секунды эмуляции') parser.add_argument('--dss-timeout',type=float,default=30, @@ -181,8 +186,6 @@ def main(): if args.mame and not args.mame_bin: args.mame_bin=args.mame profile=from_arguments(args) - if profile.binary is None and (ROOT/'mame/v306/mame.arm').is_file(): - profile=MameProfile.resolve({'MAME_HOME':str(ROOT/'mame/v306')}) profile.validate(dss=True) mame=profile.binary stopping=False @@ -203,7 +206,15 @@ def main(): with redirect_stdout(sys.stderr): if not create_floppy_image(str(disk_path),files): raise RuntimeError('Не удалось создать debug-дискету') - command_text='a:\\'+basename_83(exe.name).replace(' ','')+'\n' + if args.launch_path: + launch_path=args.launch_path.replace('/', '\\') + if not re.fullmatch(r'[A-Za-z]:\\[A-Za-z0-9_.\\-]+',launch_path): + raise ValueError('launch-path: ожидается путь DOS вида d:\\dir\\app.exe') + if Path(launch_path.split('\\')[-1]).name.upper() != exe.name.upper(): + raise ValueError('launch-path должен заканчиваться именем debug EXE: '+exe.name) + command_text=launch_path+'\n' + else: + command_text='a:\\'+basename_83(exe.name).replace(' ','')+'\n' events=build_events([(0,command_text)]) ready=state/'main.json' lua=state/'launch.lua' @@ -215,9 +226,6 @@ def main(): installed_plugins=profile.home.parent/'plugins' if profile.home else None if installed_plugins and installed_plugins.is_dir(): plugin_paths.append(str(installed_plugins)) - legacy_plugins=ROOT/'mame/sources/MAME/plugins' - if legacy_plugins.is_dir(): - plugin_paths.append(str(legacy_plugins)) command=[str(mame),'sprinter','-noreadconfig','-rompath',str(profile.rompath), '-bios',profile.bios,'-kbd','ms_naturl,bios=sp2k','-video','soft','-window', '-sound','none','-skip_gameinfo','-beta:wd179x:0','35hd', @@ -226,6 +234,13 @@ def main(): '-debug','-debugger',args.debugger, '-plugin','sdbgbridge','-pluginspath',';'.join(plugin_paths), '-autoboot_delay','0','-autoboot_script',str(lua)] + if args.app_hdd: + app_hdd=Path(args.app_hdd).resolve() + if not app_hdd.is_file(): + raise ValueError('Не найден CHD приложения: '+str(app_hdd)) + mounted_app_hdd=state/'application.chd' + shutil.copyfile(app_hdd,mounted_app_hdd) + command.extend(['-hard2',str(mounted_app_hdd)]) for name in ('nvram','cfg','diff','snapshot'): command.extend(['-'+name+'_directory',str(state/name)]) log=(state/'mame.log').open('w') diff --git a/toolchain/size_check.py b/toolchain/size_check.py index 3316bb1..ca59336 100644 --- a/toolchain/size_check.py +++ b/toolchain/size_check.py @@ -13,9 +13,9 @@ docs/size_baseline.tsv. программы (нет в эталоне) — предупреждение, добавить через --update. Запускать после `make all`. -ТОЛЬКО tests/, без examples/: регресс ловит разжирение libc, а для этого +ТОЛЬКО tests/, без отдельного репозитория Examples: регресс ловит разжирение libc, а для этого хватает мелких тестов — каждый тянет свой кусок библиотеки и пересобирается -за секунды. Крупные приложения (examples/mdview компилируется минутами) +за секунды. Крупные приложения (`../Examples/mdview` компилируется минутами) не показывают ничего сверх этого и лишь удлиняют цикл, поэтому и из `make all` они убраны (см. корневой Makefile). """ diff --git a/toolchain/vscode-sprinter-debug/LICENSE b/toolchain/vscode-sprinter-debug/LICENSE deleted file mode 100644 index a738358..0000000 --- a/toolchain/vscode-sprinter-debug/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Sprinter C Compiler contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolchain/vscode-sprinter-debug/README.md b/toolchain/vscode-sprinter-debug/README.md deleted file mode 100644 index 2b9aa7c..0000000 --- a/toolchain/vscode-sprinter-debug/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Sprinter MAME Debug - -VS Code-клиент сборки и отладки для `toolchain/sdbg_dap.py`. Режим `launch` сам -поднимает изолированные MAME и session server; перед `attach` их запускают -вручную. - -> [!WARNING] -> Native Windows пока не поддерживает полный launch/attach: `windows` -> выбирает только debugger provider MAME, а host-часть всё ещё зависит от -> `fcntl`, Unix domain sockets и Unix launcher. - -Для разработки расширение можно открыть отдельным окном VS Code и запустить -Extension Development Host. Конфигурация проекта: - -```sh -code --extensionDevelopmentPath="$PWD/toolchain/vscode-sprinter-debug" "$PWD" -``` - -Python выбирается без зависимости от `PATH` GUI: при наличии local -`.python-version` используется `~/.pyenv/shims/python`; для внешнего workspace -без неё расширение ищет установленный `~/.pyenv/versions/3.12*/bin/python`. -Версия local передаётся задаче через `PYENV_VERSION`, поэтому сборка работает -и если `project` лежит вне workspace. При необходимости задайте абсолютный путь через -`sprinterDebugger.pythonCommand`. Выбранные пути печатаются в канале Output -`Sprinter MAME Debug`. - -```json -{ - "type": "sprinter-mame", - "request": "launch", - "name": "Sprinter MAME: Launch", - "build": "${workspaceFolder}/tests/hello/.sprinter-cc-hello" -} -``` - -Перед F5 расширение по умолчанию находит Makefile проекта по пути `build` и -выполняет задачу `make SRC_DEBUG=1` в каталоге проекта через local Python 3.12. -Ошибки SDCC с файлом и строкой попадают в Problems. При ненулевом коде -сборки debug launch отменяется до старта MAME. Для нестандартной раскладки -укажите `"project": "${workspaceFolder}/path/to/app"`; для уже собранного -пакета можно задать `"autoBuild": false`. Явный `preLaunchTask` остаётся под -контролем стандартного механизма VS Code и отключает автоматическую задачу -расширения. - -Команда палитры `Sprinter: Build Active Project` строит проект открытого -C-файла. В `Tasks: Run Task` доступны задачи `Sprinter: Build ...` для -Makefile, включающих `app.mk`. Сборка не заменяет исходный `make` и не пишет -в общий образ дискеты MAME. - -По умолчанию patched backend `sdbg` не открывает отдельное окно debugger MAME. -Чтобы пользоваться им одновременно с VS Code, добавьте в launch: - -```json -"debugger": "osx" -``` - -Без project patch можно задать `auto`; явные native provider: `osx` на macOS, -`windows` в Windows, `qt` или `imgui` в Linux. Host-инструменты sdbg сейчас -рассчитаны на macOS/Linux (`fcntl`, Unix sockets и Unix launcher); native -Windows transport и end-to-end тесты ещё требуются. - -Готовность DSS определяется по стабильному prompt в VRAM. `dssTimeout` -задаёт таймаут (по умолчанию 30 секунд), а `launchAt` — необязательное самое -раннее время ввода команды. - -Ручной attach: - -```json -{ - "type": "sprinter-mame", - "request": "attach", - "name": "Sprinter MAME: Attach", - "socket": "/tmp/sprinter-sdbg.sock" -} -``` - -Сейчас доступны точки по исходнику/функции, `logMessage` с безопасными -подстановками `{variable}`, один проверенный frame, регистры, поддержанные -global/static, continue/pause и instruction step. Source step поддержан для -F10/F11/Shift+F11; банковский step-over и step-out проходят -служебные trampoline до следующей C-позиции. diff --git a/toolchain/vscode-sprinter-debug/build.js b/toolchain/vscode-sprinter-debug/build.js deleted file mode 100644 index c03a6ca..0000000 --- a/toolchain/vscode-sprinter-debug/build.js +++ /dev/null @@ -1,53 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -function absolutePath(value, workspace) { - if (!value || !workspace) return null; - const expanded = value.replace(/\$\{workspaceFolder\}/g, workspace); - return path.resolve(workspace, expanded); -} - -function projectForLaunch(configuration, workspace) { - const explicit = absolutePath(configuration.project, workspace); - if (explicit) { - if (!fs.existsSync(path.join(explicit, 'Makefile'))) { - throw new Error(`Нет Makefile в каталоге проекта: ${explicit}`); - } - return explicit; - } - const build = absolutePath(configuration.build, workspace); - if (!build) return null; - let directory = path.dirname(build); - while (directory !== path.dirname(directory)) { - if (fs.existsSync(path.join(directory, 'Makefile'))) { - return directory; - } - if (directory === workspace) break; - directory = path.dirname(directory); - } - return null; -} - -function isSprinterMakefile(filename) { - try { - return /include\s+(?:\$\((?:PROJ_ROOT|SPRINTER_ROOT)\)\/app\.mk|\$\(CURDIR\)\/(?:\.\.\/){0,2}sdk\.mk)/.test( - fs.readFileSync(filename, 'utf8')); - } catch (_) { - return false; - } -} - -function taskLabel(project, workspace) { - const relative = path.relative(workspace, project); - return `Sprinter: Build ${relative || '.'}`; -} - -function makeCommand() { - if (process.platform === 'win32') { - throw new Error('Native Windows build/debug пока не поддерживается'); - } - return fs.existsSync('/usr/bin/make') ? '/usr/bin/make' : 'make'; -} - -module.exports = {absolutePath, projectForLaunch, isSprinterMakefile, - taskLabel, makeCommand}; diff --git a/toolchain/vscode-sprinter-debug/build.test.js b/toolchain/vscode-sprinter-debug/build.test.js deleted file mode 100644 index db6216d..0000000 --- a/toolchain/vscode-sprinter-debug/build.test.js +++ /dev/null @@ -1,40 +0,0 @@ -const assert = require('node:assert/strict'); -const path = require('node:path'); -const test = require('node:test'); -const {projectForLaunch, isSprinterMakefile, taskLabel} = - require('./build'); -const manifest = require('./package.json'); - -const workspace = path.resolve(__dirname, '..', '..'); -const hello = path.join(workspace, 'tests', 'hello'); - -test('launch находит Makefile рядом с debug-пакетом', () => { - assert.equal(projectForLaunch({ - build: '${workspaceFolder}/tests/hello/.sprinter-cc-hello', - }, workspace), hello); - assert.equal(taskLabel(hello, workspace), 'Sprinter: Build tests/hello'); - assert.equal(isSprinterMakefile(path.join(hello, 'Makefile')), true); -}); - -test('пакет в build/ находит Makefile приложения уровнем выше', () => { - const project = path.join(workspace, 'applications', 'SprPoP'); - assert.equal(projectForLaunch({ - build: '${workspaceFolder}/applications/SprPoP/build/.sprinter-cc-sprpop', - }, workspace), project); -}); - -test('явный project без Makefile даёт ошибку вместо stale запуска', () => { - assert.throws(() => projectForLaunch({ - project: 'tests/sdbg/fixtures', build: 'tests/hello/.sprinter-cc-hello', - }, workspace), /Нет Makefile/); -}); - -test('matcher разрешает относительную ошибку SDCC внутри проекта', () => { - const matcher = manifest.contributes.problemMatchers[0]; - const line = 'hello.c:62: error 20: Undefined identifier \'missing_name\''; - const match = new RegExp(matcher.pattern.regexp).exec(line); - assert.deepEqual(match?.slice(1), - ['hello.c', '62', 'error', '20', - "Undefined identifier 'missing_name'"]); - assert.equal(matcher.fileLocation, 'relative'); -}); diff --git a/toolchain/vscode-sprinter-debug/extension.js b/toolchain/vscode-sprinter-debug/extension.js deleted file mode 100644 index 5bc790a..0000000 --- a/toolchain/vscode-sprinter-debug/extension.js +++ /dev/null @@ -1,199 +0,0 @@ -const path = require('path'); -const vscode = require('vscode'); -const {resolvePython, pyenvEnvironment, resolveSdkRoot} = require('./runtime'); -const {projectForLaunch, isSprinterMakefile, taskLabel, makeCommand} = - require('./build'); - -class SprinterAdapterFactory { - constructor(output) { - this.output = output; - } - - createDebugAdapterDescriptor(session) { - const settings = vscode.workspace.getConfiguration('sprinterDebugger'); - const folder = session.workspaceFolder || vscode.workspace.workspaceFolders?.[0]; - const configured = session.configuration.adapterPath; - const sdk = configured ? null : resolveSdkRoot( - settings.get('sdkRoot'), folder?.uri.fsPath); - const adapter = configured || path.join(sdk, 'toolchain', 'sdbg_dap.py'); - const runtime = resolvePython({ - command: settings.get('pythonCommand', 'auto'), - args: settings.get('pythonArguments', []), - workspace: folder?.uri.fsPath, - }); - const cwd = folder?.uri.fsPath || path.dirname(adapter); - this.output.appendLine(`Python: ${runtime.command}`); - this.output.appendLine(`DAP: ${adapter}`); - const options = {cwd}; - const env = pyenvEnvironment(runtime.command, cwd); - if (env) options.env = env; - return new vscode.DebugAdapterExecutable( - runtime.command, [...runtime.args, adapter], options); - } -} - -class SprinterTaskProvider { - createTask(folder, project, definitionOverride) { - const settings = vscode.workspace.getConfiguration('sprinterDebugger'); - const runtime = resolvePython({ - command: settings.get('pythonCommand', 'auto'), - args: settings.get('pythonArguments', []), - workspace: folder.uri.fsPath, - }); - const relative = path.relative(folder.uri.fsPath, project); - const definition = definitionOverride || - {type: 'sprinter', project: relative || '.'}; - const options = {cwd: project}; - const sdk = resolveSdkRoot(settings.get('sdkRoot'), folder.uri.fsPath); - const env = {SPRINTER_ROOT: sdk, ...( - pyenvEnvironment(runtime.command, project) || - pyenvEnvironment(runtime.command, folder.uri.fsPath) || {})}; - if (env) options.env = env; - const task = new vscode.Task( - definition, folder, taskLabel(project, folder.uri.fsPath), 'sprinter', - new vscode.ProcessExecution(makeCommand(), [ - 'SRC_DEBUG=1', `PYTHON=${runtime.command}`, - ], options), ['$sprinter-sdcc']); - task.group = vscode.TaskGroup.Build; - return task; - } - - async provideTasks() { - const folders = vscode.workspace.workspaceFolders || []; - const results = []; - for (const folder of folders) { - const files = await vscode.workspace.findFiles( - new vscode.RelativePattern(folder, '**/Makefile'), - '**/{third_party,mame,libc,libbgi,toolchain}/**'); - for (const file of files) { - if (isSprinterMakefile(file.fsPath)) { - results.push(this.createTask(folder, path.dirname(file.fsPath))); - } - } - } - return results; - } - - resolveTask(task) { - const folder = task.scope?.uri ? task.scope : - vscode.workspace.workspaceFolders?.[0]; - const project = task.definition.project; - if (!folder || typeof project !== 'string') return undefined; - const directory = path.resolve(folder.uri.fsPath, project); - if (!isSprinterMakefile(path.join(directory, 'Makefile'))) return undefined; - return this.createTask(folder, directory, task.definition); - } -} - -async function runBuildTask(task) { - const early = [], ended = []; - let execution, resolveResult, completed = false; - const result = new Promise(resolve => {resolveResult = resolve;}); - function finish(code) { - if (!completed) { - completed = true; - resolveResult(code); - } - } - const processListener = vscode.tasks.onDidEndTaskProcess(event => { - early.push(event); - if (execution && event.execution === execution) finish(event.exitCode); - }); - const endListener = vscode.tasks.onDidEndTask(event => { - ended.push(event); - if (execution && event.execution === execution) { - // При отмене задачи process exit event может не появиться. - setTimeout(() => finish(undefined), 100); - } - }); - try { - execution = await vscode.tasks.executeTask(task); - const finished = early.find(event => event.execution === execution); - if (finished) finish(finished.exitCode); - if (ended.some(event => event.execution === execution)) { - setTimeout(() => finish(undefined), 100); - } - return await result; - } finally { - processListener.dispose(); - endListener.dispose(); - } -} - -class SprinterConfigurationProvider { - constructor(tasks, output) { - this.tasks = tasks; - this.output = output; - } - - async resolveDebugConfiguration(folder, configuration) { - if (configuration.type !== 'sprinter-mame' || - configuration.request !== 'launch' || - configuration.autoBuild === false || configuration.preLaunchTask) { - return configuration; - } - const workspace = folder?.uri.fsPath || - vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; - if (!workspace) return configuration; - const mameHome = vscode.workspace.getConfiguration('sprinterDebugger') - .get('mameHome'); - if (!configuration.mameHome && mameHome) configuration.mameHome = mameHome; - try { - const project = projectForLaunch(configuration, workspace); - if (project && isSprinterMakefile(path.join(project, 'Makefile'))) { - const scope = folder || vscode.workspace.workspaceFolders[0]; - const task = this.tasks.createTask(scope, project); - this.output.appendLine(`Build: ${project}`); - const code = await runBuildTask(task); - if (code !== 0) { - vscode.window.showErrorMessage( - `Сборка Sprinter не прошла (код ${code ?? 'отмена'}); MAME не запущен`); - return undefined; - } - } - } catch (error) { - vscode.window.showErrorMessage(`Sprinter Build: ${error.message}`); - return undefined; - } - return configuration; - } -} - -function activate(context) { - const output = vscode.window.createOutputChannel('Sprinter MAME Debug'); - context.subscriptions.push(output); - context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory( - 'sprinter-mame', new SprinterAdapterFactory(output))); - const tasks = new SprinterTaskProvider(); - context.subscriptions.push(vscode.tasks.registerTaskProvider('sprinter', tasks)); - context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider( - 'sprinter-mame', new SprinterConfigurationProvider(tasks, output))); - context.subscriptions.push(vscode.commands.registerCommand('sprinter.buildActive', async () => { - const editor = vscode.window.activeTextEditor; - const folder = editor && vscode.workspace.getWorkspaceFolder(editor.document.uri); - if (!editor || !folder) { - vscode.window.showErrorMessage('Откройте C-файл проекта Sprinter'); - return; - } - let directory = path.dirname(editor.document.uri.fsPath); - const root = folder.uri.fsPath; - while (directory !== path.dirname(directory)) { - if (isSprinterMakefile(path.join(directory, 'Makefile'))) { - try { - await vscode.tasks.executeTask(tasks.createTask(folder, directory)); - } catch (error) { - vscode.window.showErrorMessage(`Sprinter Build: ${error.message}`); - } - return; - } - if (directory === root) break; - directory = path.dirname(directory); - } - vscode.window.showErrorMessage('Не найден проект Sprinter с app.mk'); - })); -} - -function deactivate() {} - -module.exports = {activate, deactivate, SprinterTaskProvider, - SprinterConfigurationProvider, runBuildTask}; diff --git a/toolchain/vscode-sprinter-debug/extension.test.js b/toolchain/vscode-sprinter-debug/extension.test.js deleted file mode 100644 index 7f75d95..0000000 --- a/toolchain/vscode-sprinter-debug/extension.test.js +++ /dev/null @@ -1,134 +0,0 @@ -const assert = require('node:assert/strict'); -const fs = require('node:fs'); -const path = require('node:path'); -const test = require('node:test'); -const vm = require('node:vm'); - -test('F5 выполняет TaskProvider build и не запускает MAME после ошибки', async () => { - let factory, configurationProvider, taskProvider; - let onProcess, onEnd, exitCode = 0; - const errors = []; - const output = {appendLine() {}, dispose() {}}; - class DebugAdapterExecutable { - constructor(command, args, options) { - Object.assign(this, {command, args, options}); - } - } - class ProcessExecution { - constructor(command, args, options) { - Object.assign(this, {command, args, options}); - } - } - class Task { - constructor(definition, scope, name, source, execution, problemMatchers) { - Object.assign(this, {definition, scope, name, source, - execution, problemMatchers}); - } - } - class RelativePattern { - constructor(folder, pattern) {Object.assign(this, {folder, pattern});} - } - const vscode = { - workspace: { - workspaceFolders: [], - getConfiguration: () => ({get: (key, fallback) => fallback}), - findFiles: async () => [], - }, - window: {createOutputChannel: () => output, - showErrorMessage: message => errors.push(message)}, - debug: { - registerDebugAdapterDescriptorFactory: (type, value) => { - assert.equal(type, 'sprinter-mame'); - factory = value; - return {dispose() {}}; - }, - registerDebugConfigurationProvider: (type, value) => { - assert.equal(type, 'sprinter-mame'); - configurationProvider = value; - return {dispose() {}}; - }, - }, - tasks: { - registerTaskProvider: (type, value) => { - assert.equal(type, 'sprinter'); - taskProvider = value; - return {dispose() {}}; - }, - onDidEndTaskProcess: listener => { - onProcess = listener; - return {dispose() {onProcess = null;}}; - }, - onDidEndTask: listener => { - onEnd = listener; - return {dispose() {onEnd = null;}}; - }, - executeTask: async task => { - const execution = {task}; - onProcess({execution, exitCode}); - onEnd({execution}); - return execution; - }, - }, - commands: {registerCommand: (name) => { - assert.equal(name, 'sprinter.buildActive'); - return {dispose() {}}; - }}, - DebugAdapterExecutable, - ProcessExecution, Task, RelativePattern, - TaskGroup: {Build: 'build'}, - }; - const source = fs.readFileSync(path.join(__dirname, 'extension.js'), 'utf8'); - const module = {exports: {}}; - vm.runInNewContext(source, { - require: name => name === 'vscode' ? vscode : require(name), - module, setTimeout, - }, {filename: 'extension.js'}); - const context = {subscriptions: []}; - module.exports.activate(context); - assert.equal(context.subscriptions.length, 5); - - const workspace = path.resolve(__dirname, '..', '..'); - const session = { - workspaceFolder: {uri: {fsPath: workspace}}, - configuration: {}, - }; - const descriptor = factory.createDebugAdapterDescriptor(session); - assert.equal(descriptor.command, - path.join(require('node:os').homedir(), '.pyenv', 'shims', 'python')); - assert.equal(descriptor.args.at(-1), - path.join(workspace, 'toolchain', 'sdbg_dap.py')); - assert.equal(descriptor.options.cwd, workspace); - assert.equal(descriptor.options.env.PYENV_VERSION, '3.12'); - const configuration = { - type: 'sprinter-mame', request: 'launch', - build: '${workspaceFolder}/tests/hello/.sprinter-cc-hello', - }; - assert.equal(await configurationProvider.resolveDebugConfiguration( - session.workspaceFolder, configuration), configuration, errors.join('\n')); - const task = taskProvider.createTask(session.workspaceFolder, - path.join(workspace, 'tests', 'hello')); - assert.equal(task.name, 'Sprinter: Build tests/hello'); - assert.equal(task.execution.command, '/usr/bin/make'); - assert.equal(task.execution.options.cwd, - path.join(workspace, 'tests', 'hello')); - assert.equal(task.execution.options.env.PYENV_VERSION, '3.12'); - assert.deepEqual(Array.from(task.execution.args), - ['SRC_DEBUG=1', `PYTHON=${descriptor.command}`]); - assert.equal(task.problemMatchers[0], '$sprinter-sdcc'); - vscode.workspace.workspaceFolders = [session.workspaceFolder]; - vscode.workspace.findFiles = async () => [ - {fsPath: path.join(workspace, 'tests', 'hello', 'Makefile')}, - {fsPath: path.join(workspace, 'Makefile')}, - ]; - const discovered = await taskProvider.provideTasks(); - assert.equal(discovered.length, 1); - assert.equal(discovered[0].name, task.name); - const unresolved = {scope: session.workspaceFolder, - definition: {type: 'sprinter', project: 'tests/hello'}}; - assert.equal(taskProvider.resolveTask(unresolved).definition, - unresolved.definition); - exitCode = 1; - assert.equal(await configurationProvider.resolveDebugConfiguration( - session.workspaceFolder, {...configuration}), undefined); - assert.match(errors.at(-1), /MAME не запущен/); -}); diff --git a/toolchain/vscode-sprinter-debug/package.json b/toolchain/vscode-sprinter-debug/package.json deleted file mode 100644 index bf36466..0000000 --- a/toolchain/vscode-sprinter-debug/package.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "name": "sprinter-mame-debug", - "displayName": "Sprinter MAME Debug", - "description": "Сборка и DAP-отладка C-приложений Sprinter в MAME", - "version": "0.2.0", - "publisher": "sprinter-c-compiler", - "engines": {"vscode": "^1.85.0"}, - "categories": ["Debuggers"], - "main": "./extension.js", - "activationEvents": ["onDebug", "onTaskType:sprinter", "onCommand:sprinter.buildActive"], - "contributes": { - "commands": [ - {"command": "sprinter.buildActive", "title": "Sprinter: Build Active Project"} - ], - "taskDefinitions": [ - { - "type": "sprinter", - "required": ["project"], - "properties": { - "project": { - "type": "string", - "description": "Путь к каталогу с Makefile приложения относительно workspace" - } - } - } - ], - "problemMatchers": [ - { - "name": "sprinter-sdcc", - "owner": "sprinter-sdcc", - "fileLocation": "relative", - "pattern": { - "regexp": "^(.+?):(\\d+):\\s+(error|warning)\\s+(\\d+):\\s+(.+)$", - "file": 1, - "line": 2, - "severity": 3, - "code": 4, - "message": 5 - } - } - ], - "configuration": { - "title": "Sprinter MAME Debug", - "properties": { - "sprinterDebugger.pythonCommand": { - "type": "string", - "default": "auto", - "description": "Python 3.12 для DAP; auto выбирает local pyenv shim без зависимости от PATH GUI" - }, - "sprinterDebugger.pythonArguments": { - "type": "array", - "items": {"type": "string"}, - "default": [], - "description": "Аргументы пользовательской Python-команды перед путём DAP-адаптера" - }, - "sprinterDebugger.sdkRoot": { - "type": "string", - "default": "", - "description": "Путь к Sprinter-CC для внешнего проекта; можно задать SPRINTER_ROOT" - }, - "sprinterDebugger.mameHome": { - "type": "string", - "default": "", - "description": "Подготовленная среда MAME для launch, если не указана в launch.json" - } - } - }, - "debuggers": [ - { - "type": "sprinter-mame", - "label": "Sprinter MAME", - "languages": ["c"], - "configurationAttributes": { - "launch": { - "required": ["build"], - "properties": { - "build": { - "type": "string", - "description": "Путь к каталогу .sprinter-cc-NAME" - }, - "project": { - "type": "string", - "description": "Каталог с Makefile для сборки перед запуском; определяется из build, если не задан" - }, - "autoBuild": { - "type": "boolean", - "default": true, - "description": "Добавить Sprinter build task перед F5, когда найден app.mk" - }, - "data": { - "type": "array", - "items": {"type": "string"}, - "description": "Дополнительные файлы на debug-дискету" - }, - "mame": { - "type": "string", - "description": "Совместимый alias пути к mame.arm" - }, - "mameHome": { - "type": "string", - "description": "Среда MAME: стандартные пути к бинарнику, ROM и DSS" - }, - "mameBin": { - "type": "string", - "description": "Переопределить бинарник MAME (stock или sdbg)" - }, - "mameRompath": { - "type": "string", - "description": "Переопределить каталог ROM/BIOS MAME" - }, - "mameDssImage": { - "type": "string", - "description": "Переопределить образ DSS-дискеты" - }, - "mameSystemHddImage": { - "type": "string", - "description": "Переопределить системный HDD-образ Sprinter" - }, - "mameBios": { - "type": "string", - "default": "v3.06", - "description": "Имя варианта BIOS для -bios" - }, - "debugger": { - "type": "string", - "default": "sdbg", - "enum": ["sdbg", "auto", "osx", "windows", "qt", "imgui"], - "enumDescriptions": [ - "Только окно Sprinter и управление из VS Code", - "Выбрать доступный штатный backend MAME", - "VS Code вместе с Cocoa debugger MAME на macOS", - "VS Code вместе с native debugger MAME на Windows", - "Qt debugger MAME, если сборка включает USE_QTDEBUG", - "Debugger MAME внутри основного графического окна" - ], - "description": "OSD debugger provider; sdbg не открывает Cocoa debugger" - }, - "launchAt": { - "type": "number", - "default": 0, - "description": "Не начинать ввод раньше этой секунды эмуляции" - }, - "dssTimeout": { - "type": "number", - "default": 30, - "description": "Таймаут появления стабильного prompt DSS" - } - } - }, - "attach": { - "required": ["socket"], - "properties": { - "socket": { - "type": "string", - "description": "Unix socket запущенного sdbg_server.py" - }, - "adapterPath": { - "type": "string", - "description": "Путь к toolchain/sdbg_dap.py; по умолчанию из workspace" - } - } - } - }, - "configurationSnippets": [ - { - "label": "Sprinter MAME: Launch", - "description": "Запустить изолированный MAME и остановиться на main", - "body": { - "type": "sprinter-mame", - "request": "launch", - "name": "Sprinter MAME: Launch", - "build": "^\"${workspaceFolder}/tests/hello/.sprinter-cc-hello\"" - } - }, - { - "label": "Sprinter MAME: Launch + native debugger", - "description": "Запустить VS Code debugger вместе с Cocoa debugger MAME", - "body": { - "type": "sprinter-mame", - "request": "launch", - "name": "Sprinter MAME: Launch + native debugger", - "build": "^\"${workspaceFolder}/tests/hello/.sprinter-cc-hello\"", - "debugger": "osx" - } - }, - { - "label": "Sprinter MAME: Attach", - "description": "Подключиться к проверенной sdbg-сессии", - "body": { - "type": "sprinter-mame", - "request": "attach", - "name": "Sprinter MAME: Attach", - "socket": "^\"/tmp/sprinter-sdbg.sock\"" - } - } - ] - } - ] - }, - "scripts": { - "check": "node --check extension.js && node --check build.js && node --test runtime.test.js build.test.js extension.test.js" - }, - "files": ["extension.js", "runtime.js", "build.js", "README.md"], - "license": "MIT" -} diff --git a/toolchain/vscode-sprinter-debug/runtime.js b/toolchain/vscode-sprinter-debug/runtime.js deleted file mode 100644 index 7deab08..0000000 --- a/toolchain/vscode-sprinter-debug/runtime.js +++ /dev/null @@ -1,97 +0,0 @@ -const fs = require('fs'); -const os = require('os'); -const path = require('path'); - -function executable(filename) { - try { - fs.accessSync(filename, fs.constants.X_OK); - return true; - } catch (_) { - return false; - } -} - -function localPythonVersion(workspace) { - if (!workspace) return null; - let directory = path.resolve(workspace); - while (directory !== path.dirname(directory)) { - try { - const version = fs.readFileSync(path.join(directory, '.python-version'), - 'utf8').trim().split(/\s+/)[0]; - return /^[A-Za-z0-9._-]+$/.test(version) ? version : null; - } catch (_) {} - directory = path.dirname(directory); - } - return null; -} - -function installedPyenvPythons(home) { - try { - const versions = fs.readdirSync(path.join(home, '.pyenv', 'versions')); - return versions.filter(version => /^3\.12(?:\.\d+)?$/.test(version)) - .sort((a, b) => Number(b.split('.')[2] || 0) - - Number(a.split('.')[2] || 0)) - .map(version => path.join(home, '.pyenv', 'versions', version, - 'bin', 'python')); - } catch (_) { - return []; - } -} - -function resolvePython(options = {}) { - const command = String(options.command || 'auto').trim(); - const args = Array.isArray(options.args) ? options.args : []; - if (command !== 'auto') { - return {command, args}; - } - - const home = options.home || os.homedir(); - const workspace = options.workspace; - const isExecutable = options.isExecutable || executable; - const candidates = []; - const shim = path.join(home, '.pyenv', 'shims', 'python'); - const version = options.localVersion === undefined ? - localPythonVersion(workspace) : options.localVersion; - const installed = options.installedPyenv === undefined ? - installedPyenvPythons(home) : options.installedPyenv; - if (version) candidates.push(shim); - candidates.push(...installed); - if (!version) candidates.push(shim); - if (workspace) { - candidates.push(path.join(workspace, '.venv', 'bin', 'python')); - } - candidates.push( - '/opt/homebrew/bin/python3.12', - '/usr/local/bin/python3.12', - '/usr/bin/python3.12', - ); - const found = candidates.find(isExecutable); - if (!found) { - throw new Error( - 'Не найден Python 3.12. Задайте абсолютный путь в ' + - 'sprinterDebugger.pythonCommand.'); - } - return {command: found, args: []}; -} - -function pyenvEnvironment(command, workspace, home = os.homedir()) { - const shim = path.join(home, '.pyenv', 'shims', 'python'); - const version = command === shim ? localPythonVersion(workspace) : null; - return version ? {PYENV_VERSION: version} : undefined; -} - -function resolveSdkRoot(configured, workspace, environment = process.env) { - const candidates = [configured, environment.SPRINTER_ROOT, workspace] - .filter(Boolean).map(value => path.resolve(value)); - const found = candidates.find(root => - fs.existsSync(path.join(root, 'toolchain', 'sdbg_dap.py')) && - fs.existsSync(path.join(root, 'bin', 'sprinter-cc'))); - if (!found) { - throw new Error('Не найден Sprinter-CC: задайте sprinterDebugger.sdkRoot ' + - 'или SPRINTER_ROOT'); - } - return found; -} - -module.exports = {resolvePython, localPythonVersion, installedPyenvPythons, - pyenvEnvironment, resolveSdkRoot}; diff --git a/toolchain/vscode-sprinter-debug/runtime.test.js b/toolchain/vscode-sprinter-debug/runtime.test.js deleted file mode 100644 index 5ead0bd..0000000 --- a/toolchain/vscode-sprinter-debug/runtime.test.js +++ /dev/null @@ -1,67 +0,0 @@ -const assert = require('node:assert/strict'); -const path = require('node:path'); -const test = require('node:test'); -const {resolvePython, localPythonVersion, pyenvEnvironment} = require('./runtime'); - -test('auto использует pyenv shim без PATH GUI', () => { - const home = path.join(path.sep, 'Users', 'tester'); - const shim = path.join(home, '.pyenv', 'shims', 'python'); - const result = resolvePython({ - command: 'auto', - workspace: path.join(home, 'project'), - home, - isExecutable: filename => filename === shim, - }); - assert.deepEqual(result, {command: shim, args: []}); -}); - -test('local pyenv имеет приоритет над случайным .venv', () => { - const home = path.join(path.sep, 'Users', 'tester'); - const workspace = path.join(home, 'project'); - const shim = path.join(home, '.pyenv', 'shims', 'python'); - const venv = path.join(workspace, '.venv', 'bin', 'python'); - const result = resolvePython({ - command: 'auto', workspace, home, - isExecutable: filename => filename === shim || filename === venv, - }); - assert.equal(result.command, shim); -}); - -test('явная команда и аргументы сохраняются', () => { - const result = resolvePython({ - command: '/python/custom', - args: ['-I'], - isExecutable: () => false, - }); - assert.deepEqual(result, {command: '/python/custom', args: ['-I']}); -}); - -test('auto сообщает понятную ошибку без Python 3.12', () => { - assert.throws( - () => resolvePython({command: 'auto', isExecutable: () => false}), - /Задайте абсолютный путь/, - ); -}); - -test('внешний workspace без .python-version выбирает установленный pyenv 3.12', () => { - const home = path.join(path.sep, 'Users', 'tester'); - const installed = path.join(home, '.pyenv', 'versions', '3.12.14', - 'bin', 'python'); - const result = resolvePython({ - command: 'auto', workspace: '/tmp/external-project', home, - localVersion: null, installedPyenv: [installed], - isExecutable: filename => filename === installed || - filename === path.join(home, '.pyenv', 'shims', 'python'), - }); - assert.equal(result.command, installed); -}); - -test('shim получает версию workspace при сборке за пределами его дерева', () => { - const workspace = path.resolve(__dirname, '..', '..'); - const version = localPythonVersion(workspace); - assert.match(version, /^3\.12/); - const shim = path.join(require('node:os').homedir(), '.pyenv', - 'shims', 'python'); - assert.deepEqual(pyenvEnvironment(shim, workspace), - {PYENV_VERSION: version}); -});

      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 diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0003.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0003.png deleted file mode 100644 index c4d88ddf5a696ea1c723b96fd9b3179271501901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9056 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0004.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0004.png deleted file mode 100644 index 7c2056c7b7c0d4bce9533189f4b0885596166ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8919 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 YId$sPP-?G@;5s4TMf(di7FQDg9hk!r@&Et; diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0005.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0005.png deleted file mode 100644 index 41d2986748f065fafd025774a728f6062e9ec5f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8862 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0006.png b/applications/Volkov/artifacts/mame-p7/select-final/sprinter/0006.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 Kr^|p|H~#}xg36cx diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0001.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0001.png deleted file mode 100644 index e661562944febda12c1811a84febb2f961101065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8715 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 Y%B4$}24Xw)So7F)?ik)KRkx4$FIkX#0ssI2 diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0002.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0002.png deleted file mode 100644 index d6624f3c3b03e30084e5cce1d034dc2c59d929bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8930 zcmeHNc~nyCyQVswN-G<&NzI%+sFhv!*3_pEjAy8qli&RVR!HhX{H`@P@$J@4~A-`@M7 ztiS2B*ACTNNL zouquM%V!tcgNV~R&5m#_&0lfGthPwhpDC7KCpUXKe|hw!5^Qz9+^*TWB-6CK&WKJu zGU+$c!>Z?ZEFM`wzQ5Z9KNGq5&XIr6h#P!d8`(zF4s3r-?qIgwf1eq}opFvJ)iEPG zs`T~C_M2^%zq{k-A+Yau<>F|JlvUJh-O`Bpy|wG#+zC*eu%{>*HP(Wii(aaM;k3Qm zLB|z;+{FV7qgR)u>%Yg&FMmu_Xka+j&tt#(qfne~qFuwgo&v|d-rnu9#!iP!=RYb; zPftsku6_?+TM7iHY`vi6g0e>LyP!JwM=jac*)JbmP|(V zxrc!HGi6;3aXGG+|*p@k* zO}4SKp6`ttd*k7&U!~(1D%qhg3^dVR62AiV?~sYlh9*p}t_AS3=x*#v=MVjiKu8!f=eM4ZWO$gDkmRjD080TNASrw z(qlG2d2qlW1Y~a$9%0?@7KoGkt(>NScw$q~9afzyB}ep3=4qq|a&3^P!PyJ--c&g2 zVL4Q~7QOCws*m%%$c3DPdA-xY2`3DlUacx(FS@LwQEq7`d_I&PxY`}ePy!ZvU(&R= zn8z#UCPhCgDf9Y9b7o1inomkPxUQV$YQ5bNq+&0yCZ@9ri1KusNx`|_B(b<0>Ux8- zyhOJ>Je$bnN?Sm(cITWgR0^nWYMHySZ|kZ~-s%i`%N+9dQ(Wxv!sPMF_0+?uaBoY2 zOv?33B2ASwUx2GG&_-E{M(ap2ZzOBHY=ABG`*M6O1qDd*icUm71tR&=9>Hm(8dPbY zO9|NfG&Kw@nOlC)(E^E%I-${X#Z#oI{nME7i=qAe;X7El=VxjqA*Q4I3ZeqWc{R3K z(>Y~j-ExvWC+xU>fiOrh`a-DKNy1~HTE&94=JMqcicO)D(y*CspDa)vQ948S0<6uD zD^KV+oo!i{8$9x7a=rGgE$o#VTizrw?V~Jrj(R7y1qws(Z^gRoBk8yG`jNz7p)BP& z3H_I~=0U7R$ocG%*mpvAn_}A)OLYyvn;44Z#vRggz^S*lH%NgOKM#k{-H~W9U$J5$ zXFTN&>Z&r6tOhp;6zr*l0;SbUhKfB3(SI}r;MQ-pnkh-&-TT8paq;R0u)Y(j`H%#rPY(kUWdMX|MFh6$~2`f)i1Tl8{(3z zkS=Mdu9sQCy;UDpV1~rs7CvetLgG5;v87vk3~i>a7G-&r*pdWz?T)MlEG=sYe8{Cb z9W9Ase{J~c-;oX0s#}El7gtw@PjwT&juHvk>av(aCt$`V!evGS1AqFyo}S(h&O7*p zPZtUGDJyM7Xu-5(LZqQ(uC;4cqigXPiT1@e$Q)DSgfUJI!~G^+Au9VjRDl5)03emo0})X5}u-?thf8&GM&)U zR^dxzH+|jqDW%^Nq`24hlT8%|8MAP(&~mdUzR;}-X6$?YdI}UGNv^K0E-ejMU1on> z?j^a3NjLU#eztHDisosdS6VUXRR%>Qn9E&qS#Oz3)(nbLn=Wvs(5qZ{(ZxfZ_n7J5 z_=>&sSRePhsY{IR!v!qRxc@O1RmXvZg`FSMtt3&)-@iyoYwp>EL?XQ+5O~?p(c66< z5v+Rt>>mkQ?$!3jvPQwL!+AVj_(~iT1LpRJ)GuT;G@4*@sLz7!r&+Kn)Kti2ugGHN zjnHh%8rMjnru`Iq)_`{v8lG(9E_(j?HCK5b62{f`a;GM((392Vu6X|n6Nkq8-JDAZobh}*ho)&0!M*ZjwrCBFqP{ZJn^9BzQOy<^iO=nS$ZtYrjwCa zSWqi~dMI~H1m|~|p(;X;YWmX8tmQDNLMKC!rI{PJuq#Q3-|UQJ|YnY&=Tb4K8Y7h(-As_EHl*}3OOFoaq@hb{03Dk_-I0d1-iL zN$5~b$eg5BZSnVhLXy2pS9Qv4{^>@9JC7%`e?5MvD3{RHcp^;EAy44`YNW}!MuB4~ zf#UYg8SnQTVNo(CdV77tI3_lmOVL@xa@*K!v~cAsd%P`!zch!d?+RmZlSwsYl(?Pd^EAp1LBi5B2>|$-`$5)l+lO!*PJtM0ydhtR|VvT4vEzsE*0p5 zLZQ68#+KQP1~$pHQcqvM$fM2$EEr3JkBH|gSfYz+=mKB7KU9raPNSw+xRjEZRtnu* zN`d=2;-{i|-m~*J(q3deL5MW%yPoY^5>5cEqLIE(X}!uVVk|Gk{Bxc{w6 zioMIUSzlTJ#hp~!P~m&&fjN^u^o_$R$(DY9SIo9kh)UbC3S14R%(mt<`C^-RXj{;A z?F-r{(*qqGJ$f_5_Uo|O@Ed;y*3n~NXsDK%9r1{u0?h^u7P;44l+8R5m}hJdzBs|< zav$zic}DnA*U&R1O~8Gea&g@(F+?`;fL6n(EQL3;y-yxp!RKt>ebylCsDrXdObvvf z5xK`vIS~E(rSJk88c`zM9*tY7fY&yZ#r>qH;7>{gwO)FrN~-ZKw|1=e99Gft&2+ta zE`maxh}T}xxM&EWQNlYlmbMM+SqjpCM4c>R>O8&5UODsXLTJE$t@0rI=v`Jdf{Uoi zO6&5iLzNV&DmeC}MVul+06N~?{J#I9?>iY5V06IN zd3ev=cyibNL;J>~4zFa74E(G0n%O}{+iO}^Kq{3I#=9X;IJ40=5qOgPdE`n4NOlr9 z)VUoH{nl(u1z%1bv}D$_4{nf}C@NQUUmr<*J?g}{;XJy5meG{#b-sFINco0aa<#6i zDVq55wk17AO_~6di(Xi~>g{Pi8sAGBu28hQIP4bl+FaMmn5yySr3_&8mRR~s5|Fnq^|w(hOe5ABu`Ow->Acy(mt-B}sUo^uFyH z|4SU!T+@1b>D?5f--<}iN5e#P)wDnH(ZuH?5etDzPO7)w{3Je|@Y=4$GFy^J33%pA zrCnEV9|_)Mw(i5mHEEaEIcTP4+J(5mUKs``;#Z#sUy90=+p&c7lZ9>v{u(B}AyU!- z%v~t_UGU`fr%$($iDEv!ga>^6DgKfz1wE-FK&t~gRy|k041eRG_MYDh+H=xv4GcHr zVCbWLG&sWk_q(bSaUYs1O`KE#`((t6m}Dghn0@=p8!?*}i^=qzc-4sIfYI&0Oo&zE zh99EwZ@Y;3*JSmJRN5vv-sk%u0i8dx6g{quTbVd#T0J=542_=ua$hbRa?@t51m6}{ zU@_V`KP1@(x#g4o#dX6nL*AzRfrI+Kk&J`%(Ag@cO{T$x@>P09_02D4od!!zbrwIw z>zW&4?J8zLQ}KXtF;p`d!=P)Po{Z6VF=GW7BbIwlrgV)%__Ln1)Rw35FIU6aG^~` z5=JN%jf_w}dV8(L{aBSPm++68{LuVC@sIu}29l<^7t@p=^9Q^xlzoN0{7Jhb1sWHF z#bUpX3dGy@f}(oEh=mAZNZqu11a~HEWh_nQLG%Ifh651t136-ni<)+&tIN_?+Czlj zR7};jC&+@U>+0Nv`Jwn9+wIVBab26A6!ZBknM{U@czu-R1}ziON{6%t#)Nn6%ZoxW zA)2^v|Iaq@LBIa}#OAuUGQX0+1#olI4^WS2be}5AOX$Y@n%v(*ZVo7s`zxq_55T`S z@VA)#r_28~%m0bkKN0(1m4$x*^ABMD0nGngM*aWGm%PHq1L#dVvNiXP4TVfzFRIt+ zdj%sL4O7N9XM*J* zzL9#Yr|m4)ukoj(?#5oAQ`-ow#pWF2pz$V?dbX2Kdh^_lEQN`_J5|T$2r?}okZbIDct%Tuswn3<*u+djD zbp0N0kzVCJuSo7(fP^GAz43S-P1Ym3!;qSF!LQQWa>}!ImVXqWP^>C6skl%y@58+NcnJ^|3c7KA@9$2WQJW;#hhis=3r8qG)hD{Peq&YT@Io z5L`mfh}+HZt&$H^)J(zc(BfPFdv1{GLjN_B{p;HTIgUm}x;@#? z9CTW26+Y}al{JlDDId7zjDyug30}UPdReLj|itlxd;S_FFlQ%&9)Ng;#syRm1$GaizRCt4HSx&b* z949CRpYFt#3qe`P7|h7Xfv42teWCdpje7>57kGorIO76mVl?W!%sE8opm#i2wJt|L zFQF^_Htm|Fmh;)<`IoqiXPcBvTS{ch7N?F|G@nH3vIH6oC)n_7BMD_buPkT;oEv=9 zH$r2%_aR7GRtW&crHbR))|HW^A&=jJE%!Zl=-gyc(8NyW6Mq<^GlDy~9kx|)cADUP znxy5-(=rHXgS)OCwAm>6P=0;*-#1ngXRNVky3SOzb$6fq9+GX3z zN`1Hn&So!W*Pq@;%PQh;tZh?|I3DkT1(?vU{^7)xapGPeURv2lepB%fSme9KPuRkS8kn;`@CNBmtGV zv#Iia$#R?~=$5R46z0!kYSstPv|UCQDAhUHx-0k0K4L!kb$={ar0QWbB(J=V)s4)& zpc8hq4Ui|HW)-EPFCo>z`HZK-X{kKF^EBBuzmJYD8{Peh}DV4gzxC$X{Py-sRXROiVexO=z*<;9o* z=TX*s^@UQo!6r+riOuxK7B%kb+$+Cy?tV^dhtq;jJp5UTzeKok3rZsfQf7OVHls!E z$7HZAnl@{cJ>zfOnC#&qa59C=6=A9dsVAN(*?`B}g(NM`8(-x3rtzj1V}1`PZYL#>SjBBH;}MF_-iubJVe<+{I16mUK`_r7 zH6dj3d9a0(RfR!Y5FS*uENv=(dI8&5*)%ZVn|WuKH**HGkmND-3F@U17$A5 zqJyum%w11ww3LBMN#Vyjx0?5LL#{dNT%oBQGTZF+yrF*ZW!SX{KE)n`3eR+?>7CFa zcs@2od|h}Mvf5^+oSEP+(Q?GT@xobI1338U1*>tDl{#k4t&hpQ&;)-&&9S zpwV~eqO(tp230N4<#U#$t#Z$GIix~vV-XXcUK&J_w|j*>PNXPFrG{lnz9ZYyzX%E%c_JXB;LGa%3?!m<9!Fysn6(=2Lf#Oi;>?UV*wug}1&HT1C&S zq%}gpHtvdKfZ_cqX^hTm@O)0>3yTA#4>FqC60vOl#-lf7=7O`^rl3aJo+o7Mvv^~0 zzr^v}6p-3@j=zu6gnp5~HeE~9SY2M9(@_ck)aakG@0t0bKia>f`~6;Y{@qht@3gXY zn1wKdd@bwFt`#Q%i|x3f;sY)`v)abTapq9|{+n}Rv{cDTNxYVi>o+l*E+8c?y58YB zck^aUuVnW(QMWqI1c>$N9y<}rKv-ShK*!atCO z)WhKs6f6PsF2}k*)5iOL@37IIn%q%NH>X`R5o?j}s4YsZo*+7%7a|Ek<0pvE0v}Oy znOVsP{^)tHeK^)TJuRx>XkVYtvWx-*1H}kOEZ(cL0=s`|rOWSo?P1|9bd#Q6zXoCOI=aX8J=LxqA+(5Fg4SAw1qOND0N8p3c?AR> xw!MxD1Rb^vzU+J0`ZDsc-OT`mulR=eqDTuRh7baTBsbvvX6{}0u66JIzV&^7&01M!ot(U9@AuvN+0XmzbMnmE z(&)gx6Z-%FzyTBEtF{2ZE@1#*hr};Cc~|mp`hx+0GX#^XSL}l`7qhGi-5eP$(6^@_ zClw=IzPMPQ1RMOSeMEzo?y?m^fhD{K&v8cTGj`&{$X!FfqTE`9%#= zw!7?E$nTGhpPQOJnE3E4#(>{)kvaqcSuG7ivM@cGOcZ979lriR6FwfX>KsDI4T4YD4V)y<68?ahBP7>=F>0(vCbo&R&A&>G^bL zI(r&#-?bxfbB(4H{#BrF@~lyUeIjVR-Lbf3U|_(m!16l3V}-k$tE+bKkDIW~*0YJF z6&1kEAD~~= zWh_+pBpg%Pn(2#OCc<|;JUm9$8mJK!p=2_-R4hAkV~#>w7_QEF@_gI0Axr?%(BP)a znO4Uai478o`SC#ZoE02Y7fid&SnE{ji8~~>ZS7cDX=ymcF8j3@cY+^SSV~x76(mbr zS)Rn!)D(YKiloI3&<M!Z2ROwkR=V4n!o{||o zVvpX3&&8`Zu8dDS}25epPo$O4;CuIA9N7v}4eKHrdwI&Av)^Jv#XH!r&tR@I8^^!p&XBwPh9wC4^V0kS_is?%a~8lWG=E#4}~t z^STO(?Q04tD+XFqE)+wXa~P*WlJNT$C_1!Dw;{J|hR8I#e;5PmAc&uibrChkLJPdr z49lad5WfxtEIAb>t*pMTtesW_{$f0G7W~4Yq(8JSPe{DTBblX;!p?Jmz(`9rjXng> zV$3_MWA%s~p-J!LBN{^p2ke&X$~*)Gg^P7e@{kS>SCuB>&R%+YR}_dH4SvSAAo5Be z30VZp3NZmT4-G3XcRJ6-2IUq+zjj`aSXH_#9w=?kwJ3VFSW=`nZaK&1-z{(*l}p&E zac$$}jU#oI^<1nqAV-Bj^-UDocELBevUw?ga{;lJ3VHM@J6gFsc^bQuAdw34X=96~ z+`h?Gly)jyK8Fw!lVGzjD3^O!@@7Vv-YoZMNvoH4M6u-=`)Qo0QpqXaRJ@-4@&=8-;j&pB*O<`HESQeBQwXYu$x;8r}X{o&^{A zppTR;dgmrHM}Oht4=pNFA1e)=X+ zYZ$dTmT`N%{9%$fmZZHD0ZbQgxSMS&I#h9llFikRS6rm4lmjr zmD;hla~v=1Ue%Ja64B*^8s|Kz;C{dxj8z(Y`fP{CZHjN)0Qvu*$l+P)dIhWumA6RV zCpqWuzeqgz<@MKmzFrdBljN#{`=inti9&GJDYWUX3>K4GA;@7<5sr!T^Ya6f!___| zEgfk}R1%iDxlU*FQQuD{lsHx_jpCST_|2)uXT_~-!4|G&<7QY| zXx`@JAvNt;vwv*htO>Y^sk&M}qEc@_c%=_6eN%5(EQm{?CF&m+fK9a{DSkY<-3Yvk zc5rlbbZ|%z2fB-n*TEnG0oBUpjJ_>me=y7_X%p?RvlF(Zn*GCmQ#``WW>g~ zrEco3sCZn+{J*k^46D~pXdJE{%MBO=$^^<3me}JW4%2+mzU23`_VX3@e0|3PdUOZ+ zwiusO;f7Pw)d-mGT$z~d%^{IU(w3Qp*^Q9erFwdIz)ZJ-%^3{PFiI2Avpw?kEQzO^zh<1q1yQ-f?nwN!!7EUsKWcE%;XdR z@1yVnd{f!~#M`Pihm~{2v91dCkXZi7Z>ttRS?{iy-I-cXTmvR-=&7KMzj83@>@*0J z%qAI0FO5grT7nhwR+8QVjYBeM=Iz2?<_qKc6h2;AtvIq6vrQN-^ZJ8nRgJHatQ>3} zl|OcJF54%Gn*1JdOm6u0vvVE#lB}qd&2;S=n!^_g$Os=MLp7TGHmZ*fH_21I-~1i* zatt4jwa1D}Y`%az^QW7SjDDlT(QzPv6B*C0`>cV+TyAHpb=a@hLUH@@e{#NPaBNNF z16u9T(KAzJ2vl3G&nZr9y=NFZ&}-9My#tmZZOXpVUa(?Y-7uqZwi_Fwqcx_`|7aJ# zSm-PoM{NwtkJwOeQ7CZS;K>Ayr(ejXf9H}HP{tq#7_qU!m>=X-2xZaL)it$`SMhj< z0`7tj(ACW?%j%&Z4?F^^R;NE(si?#g?0$JNMN*b-W*lx)%s~j`Va*Ig@Vf2$lAr|} z_RbYJ+Y^$>W6BG1uVi`iSmCyks(pIQlo~FD(78wTU=(}UkA6F=>xo7Qr;5bH5t}p$ z?F-uAOk*XU!yVq4`wf;5cqBmllDdvxhQrNq%*wBhP{zV;GT zAExI!B3fkSP?(I3oM}5w_vKDq#nuFMlra7DU$E!R?F6pRtR_!dY9lz|>=nf3q&PBmV^W;EHc$}>YkHZuwSy2LGjW^$L{c-K2*4^z4OOvwzG zsXszaK@aG9S-5MT;B^o?LJQl#OX(!Xt`oQ^B3&|7$0^C)vt~~n4@qIEPRfTN1+Y9^kEnlit5{7%qANm?&KR%1Xp#mXdS-)}>Q~LXS(Naa(I9Rnc&Ooxn zdjYQ_BV3bS_^eJmekL@7IxG2#hw#z&ev?Q?_hB-*eg+j*Tp(?Q%B%t5g6@YtnC?uU zYwFE0!eX&jnHs%1>=__;-6K)A=0jl%(taeNM6EW~AMQ3EK^`avXm5lSWaBDJZc^en zaI}k+iP(7$xyD*Xk4_5*5uLU7g+BqlcH4gZuD6BltW>-sr3ou zj??=#&iE}CUF=qPpV#2y<`RoEx1q~}xfDYzSv`<+jsbGXB^+mZEJcKo!D@*{KN)G~ zL+v%3HNbCcyGOqxL9fHZNLO!9l(Ui7=45y4yPR{L_j!p<5c^!?FW?L22LOYy)|={| z)(@GIzAEI74g0?#;6pY@G_5dblzi@)8pVfi^%)1-{xy1wJgi3qq23HsYIO>ys}Cxm zDJ}OP_8ou{y(&z)Lo>!sqy_gLppD zBd(G9?bI=Oo_5;0L9Q%j1xpVY=gM=rpUh)>@WVpRGTe+OD}iJUqr_Z6;e8T{+uG8> zfD5dQqiT)H+b`q)c!vx%5>GxjF?(ZUqjx@R`b!)BwLIP) zx$CbjQUI{@;V%n3fK~oAcb=U5Pq*-x_!F-pS0)U^H(um%!+46XCwy8(oIPs5fi(_3k7Siq$n1Tufrxk$3w#>Pxk0C$C;PP|Tj@EA*8lh@03QqSf&IW#MBGnVYk6Vs0(ii`6>J{SuhVCGvb34c ztio^KMJs|DZ=~lI`)yGE?t(3|-SLqPq4mtMF!6|$-kyjhUX#3~^|oXfvTLK&NKcut zUzk_Vf5vC0Q(^m|hP7|8b^@@!sM8V@u`yRr(!$$QEVDVQSbUinkV8uZu76KPaOl}3 zlPoHpD@qME@+v6jsiN-P*Z!X64taaV+9DLe;(c6U5B|l7eU3`*^-j8a^iGw&f`O*? zc2n374o?maID)e3*BknAV~ld$u+{p_<&LvgfeHUU0ga3@==DTu_>4AUIXT;&-zZUR zbZiX8DGtt)Mg_kK4gKEwa;^`KXN^K25d2oUXtAJh-aIQ@#CS1iH+17sS9FH8RGo50WB=x5S?!ga?7Q74&)?|J;g-*rOU7MNuE-{R~~mi(_!x2@&= zTLasr`+tG$f4uw;vh+`oO}2FD|0#d|gRy@w_P^S2{{hTDfcgIdm<*h<6j$_eaGkyR zOrsejjGb3|4XGX7tFqT(+7ms5R|)7D!6&anZ>>T_em<5YBmGFCo?vF>ibHO_p@M{? znQOxGtCHv>;`im!Y(W;>ABS_fZ2#w@7@mD!+%x$_6tq!D^)NxjCJX<~w9!b;z`48x zbYhRsm~i{I8ZiQ4AGvc1nEs%H?N(d3 zVoS`G5MCHhubokZu@rA|^$#3z>K06di3%{Q1JVJ1G6vf*ri>8UUNqp~u1fS27ydc(w(W3zuw+KF&4&O8KMZSyL z%gYwmw5h>WNoS+`YZ3Gn6N}N01|BAIfepXYk4wX^P-aY7UKb~wLQQe`!-UQur<0~_ zQDS!?&1qLco0FYwDdiPCzQd^BXWLy6sog43LSv}?=HPUQ4nx@E`2uh8i*!TOK&d@e zYdRt4-RxrWXR#D_!pVRZaMy>s3_%t3-?&&KiZzjONmJWbhA_Kwz}DjEQQnPUy&GJ{!>PC6@jw{eX{-h zCws$!NP@QeN3YH2n;5jE$+M50s^vEksZ>&lh>&WrDOWU%+1c@)7uXE;)4M$f?v2qr zB@0v+cwITmb?LS}l#SNDaDzPZ`%lD74_@WfRQ zJU3^oDlI6o#OKG$ct>i;Mobe^=;rhdaN%gsXt@AZ+@+KTf{ddK!7k zG~IIEJURaJCOo58XITwwoM=adCL)ZS9NX*VJ){gUaUkjid!5ut-|A$_ZIS9RV2Fb< zlz@?vm1GTh7);65T3VmOIAAf9uI?_6x#wjUjR!3fzAQ?17`lRN^Y6`(wTvO$86m~`^ZJ|VVZ+W!O}##1Y^~+Jm_AC zFDm-^;BLdgA+tNfhMEWU?`W!ibk#fIL?UtXB1`+emZn1vSO#c)UaOYU18TL5>v;V! zcf8CiNL6*wV27?OM(tuqjUs%nJ|+}aJ5Y>jWa zzPW2@oY*&Waagb|^BIsS_i0u90+%ioQk$Mys`>@EhQ4I_&^ygcMRAgNl5CfU?0UrG zQx6nPMC{}&6oy+grUYS~?TGonT-i$?+Y|hqc>i9#L1d`ZuG!3RmX=L^D&M{e-&iMc zw5E&yrtgkf8<=aAXbtgU6Fg=dHA8%r(MLTP;vnX&tc1LlJ!qZYBiePS&0Jh|u{H!^ zk?;57yKHSsRNpO{v7PZWF#XMUL*8p&8(0T|82ZIEbk%X$qX&N}a>;M$O#0s6VTHal z<4+@Jd)lR+=jz424P-JDk-)TbnQHD{`JoA0gb zf(&)SJMeE6+tOCngJOp@5)K(u#~3sZ1L<88NZI4`vwfOqV6vvW+%%Td10`r6_029e2r)(Ngeg8=if` z<9nOgagX`R;M`iL<-XHUQ?aVwiaVTIh{Gb2gHczaTN`71Hq4@C7e^gXRlBRzZUtzS zi6-H&JvSDb=8NVtxlIBuuUB|;6kxq}Z(nWpWD;J_l-})@<#=|xN~_uzvwSY^>rqx> zg;#rzC~&(t1{gEh`=SL_9PQHV&>14&byaS^@=b`&#)R`ROs4>!-OLE{4}<*x`Zbps z%bL@GxL>yarttsf&|1b3xBm>l`o deR)6dPLwZPxG)&oWwzzQ#L)6;x&F<^{{~JlIfnoM diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0004.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0004.png deleted file mode 100644 index e906edd2f4e30daab4ada6a183aabe339ea2c34f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8938 zcmeHtcT`hL`))iIR1~bBNK*l60i;NWk0wna(jgS33Mf%ROCZD}a`-7iq)Qj+El3SL zdQ=buqCh}uJcJek!~jVkkmLqD*YCS)-Lmc<_pf_qW$m@I_slcz%)IY2&%5`23bHai zepKiv001~{Zf0x)0PGh40QQL={*8O30C36L+}OY_B4;Jny3Eay)(xq>_&B*D z&E<;==z_n|NyAHFMVE%PU^b5*ryRZ}@%{Vp!Dsv9(#@!T!V>Ka38d)FLQ28?0Pqo) z)2BfO5+=ox8jG(|F7b(IG-ADK5V|dXHK8MV3zLx}#+o7Oob~dOYB{zXu;NIA;|3s%M1n9cOLy0%p9%IfTW9i ztqy+qT4;)0ORKqo;uq1f(~TxxAe4zZIyzeCXxtKU?Tmumzki>@X5pzu{JIUDo$T*1 z{E32!yM4acj|UECs`yoO=d(9T@x+7+>h#qqu*eR{8p(XiqxWOE9_P>v27|*VA9kzY zbX45i_bla;a4t(oNbo1}BRAhKJ%mE*;ZaNFr4`*nrPioZvU|{iTxdEyjJCN=;B>-W z!Qkv`>={AqHyCMWYaLGXzVYr!Fc;5$SyPIH~b5G6lROkeN*Y>jHT6MAEFWTjvnAU-4*GW#nZs}n@eYvIS1znbI z=-9gO{YrJ~tS=j{*lu5~KKBWl(Zb4+b-J)AbE38^sTF!C)-epOq&})UAqVvG4Fbx+fHZHy_R1!Sk_p0xuDg=KoP8(bjX;|q8#RoEW@#b@ zG{{d%4J;QlNgDPn2y*@|ij7@TV{9Zh<$(!`jW>s*ftJW8@&TbrQ=Pe4V`o|fdf6s+ zxE8Mhi@~}eIh@Rn6jR&@wZsnOH8!r#)x&2@t zTr?l7+t`{nSHICiZc5bDa4K7qNON%6H;#RzlK4fqB6Mdmj3_Da#_zU*nL`OXWL}bW z#>?;XCl$Y9#qp#(fdJn*#uyfW_>v1^sTWH%)s!%!w2K*HC*~oHMD&nfyR2_44G+^DI`UaUH@UthY+V)WApmGc3oUD?< zI$OZPUmg9z8;Q^a;yt}M3MxN))pEIA@j^OP&K)zv3^*L z7q4YYhd^yC-ym;Am=_-`J;s)4qNyls-kHW)p`9eB4An+O1!M#3mI*!pUi-YF!LWiN zoKap+M{(1%cYUYIqm$IFHV~84k|8Zhrwl%hm9@66Si}o!#FA~y zp*dF@|8=Ek*)*$LUFQ*Bx4p}(YX>b0txqIt>Z_o$d=9qvK}4Mgl7rv?@oLp zztr*B*d$*}5WOx!5m;&*b=T(d6~5BZ(ZOM9g-ah@C;3EmHgQPyx{(<3i}34pnev8` zP)%rM@6u)9!_L$JS%dmoWS)5&IEt;1>QgqW(UOgrmyeINpvR5qU<4ck!h;zP?vkX~ zz~Qa+h01QXwy=)PnRxuWrKP2(r>|7RT*;5BgX@GWf@qtIg(wFU51;TiZowiseTVg# zUs0Xwxs<5w34;5BS)#e@{pqD)N{cfD&lg@Or#1OeYc{iQTjC2LHaT&-rolkZ@Lz#{ zWD6KW7%BH5)a4WJ4ejBpEejRh7u186r`j-Dn+z<+O&48Lb6EVb{|QfO&au3O|JurMm_Ng|L7h0;bO~-if%65l7`A-UEJKTnQ6#s5~e7pe>P_WuY z>2&l!(DEWz%M%q{n?bswn!!cUOm5i_#EHRXlPE~ec6@Hn# zM7w5+?(S{y2b(|sT3K1~>Q2O46KY*Cgy?PVMkR1&<5RN5gip`41nk-^@iD!jnE+aw zVK11YlLEzQ>;I7QdV|J1xdE%sFzQ3^YFa}gDw)pNWA2v4mP*Ug7I(a2ltIAX=`_(8Wvvq{s zFS|&5t~dAfeOb(2*xe)#uEn;5Y^S6*Pf%{NUM*DrcPF+ZgH+^(>ROXW?LAXw4oKc= zm9%FrhM(hCKLLpjdKS*xNT{m4OuJm(0IM8|;B8t~l~0x2f=6=40n7iuY6JDkz;(J% z-p=fMnO`Xr)dCfbA7dUq+?M(o?~TPWNv?HM)8o3!Msd=b=XG!=*K2Be*j#U7Pz+^C z8`5pyJ>SHN+WRA`Y?Z4%+hUkq=+H30S{*bMjeG(%OhV zZgx_Ik7MFq*Ad;S99^G1*V=!&m@PhM3ojp=hUT1Hn9vdBvPl4;6Tz?Z<85yEwC0c= zE1Q@;B!}226w5Wb8}#qBj1T9fjR)4`>cG~P@Rf3Max{8%HSja32Fr$rG8K_qpYeG7 z)`3M3mnv^_&Uo&qstif%#{SEx69~0&)lXVhVq!q>Hq}(>L}8WqR#=5~8m(2X_?9vW z_#XW@b7so$CI{92H|wNeI39nUzG7v^W39L4O^aCkQm{n*YARMO$}g<(rndI#dgPp9 z`wv4}GnWGv@{!Sh)uJSK3C~}1K;#OnHQMwK>2re5pp5;HMGWO3nLJX1 z+6*s{?`Ddtgjj~MTx{Al==$)j>mQshlbT`ACUj>so0J5W28%86#ICNc4bre-H5!es zsuI?PH)wUj*5|op?sEpY6uU8K$u+8zF&)X-?ABLMUA-!q<^aw*CE@^Eb1nY3;K%#v zwe!1zrAn;zLX$em)Q{_Bc=^m^^$rDHV5(?EEobf370qycAwi=BjSPQ|*8c?!ZScS% z>C0Q|`JDD|Z%tF}T*!u$_8VzKXL-{m-<~*0a?p7AU^FGDzffg{OYZP-;IIS@iU|@3 z@GJAiKWAm|eEjp;X|-F7LaHldU8LiHZ9BLua1`CKv-UYVJ3D+T)RDHaNhJ=^6BB<@Q`7dJjgv>ytdCd} zDvKK%ct}|3sdcp+#56FfECXwkWdiafS3Eiv)3^T!$}VDC#@h)Iqx(7_DDD1v>f%o= z19-rL6g(=fuq#GV!?tsmf*{#u$0i%GgS-B27B3OVl2;!7`u>|k&^zD?;5!dR;2FnP z!^6-&4f6tCIQMOhtvZB-G25tGk&qbq=e%7;2*{XZ;lj;Ut{wXyiS6=-bT!*I>@(m# zC9#E4(lg|TzI$FQ=Q8lo{NUQ@iMv!Y%=h##z>oc0f<01_&uj;PcX(_oa2XxK= zYXWxljIZ%v)H@TM{{g8R@gDFW%b+*>xs0qfW?xM=aWJnF5@0N zA-E@7vrW;lHhOb%3B8X_{N^=fs;D4v6maM#BXi~88?G9B$DOG12Ecc|Up)f>&HH~L z@B&uf{xbW2)`S~0DC7=tCM>TX|z&-(r!p9d4 z{@pWo7Ydqerl#cY6luM5DcjG(ckkZ4Wdat-T>6>ccCJef(a58WHN(PW-3nYzpOlRyFk`*<4<12 z8^GcIY_7;rSM=!ALD0%e^D0EG^YwHQ%sBm>0{G5GsXl9yh~lh3kd=v)4#qU2eL*)Z zw>5aKSL5_KgI`u2cmu){8J&y{_34O0t>y=R8PXzVKP8bW7jXGCqWRHG5@~4ZwvSJ- z*5(f`a<5#?jcK;~5`q#*K)bcM!%4*_UyGUkg5wUFz*-Hj?B0dc=WO9BW8TN{Lm&`q zq<#CK7fRPbS2tww%La*?y|Wt|8+R*n*Q*A*GpFbXjfHQf63 z?`I7BFWiOYn;=py#!Y_!;r|Y)zt`gzkL^17H1JGshMfzS)qc4=SHJ!KOTPUd0e&WB z|1|k$#(wJke;nq2A8`M~i^Oh*_z%PUoge=bFaJNsOTXLs6b_%bj+<-=lu*#v!5(xi z?9KgiG4qKOv<|dP$ZYXjA@uBEl(sR)eoEHW-sU;Jx`s$6xSY-OYk?P)#XwV7AKuVB zFc>ys9mmpc!Mg#)W&idrE`ES~TpO75)C*LKzX zXhM7o_qFtSSoS>#W{UM?DcjN}E zO((5?3Twd!gjqG!BQuViaepr#Timf=QT|1Lr7`-bYGVG4<~cUn)ebHbXmf&>PU)M3 zX0##%-yjPP9j*B~dIA7=d+PCHa;vzd*jy^p*{BiMUh(10n~06u$+`)p(yX-WB$?o{ z5fl6!f9I}ShcF%u6Pr+x1$e-iwNUTT>q7nKa3G=C*IozppQUQKj2N+sgNPyS5b2jL zm6bJs^7VnCg7Iu#E7YBRRPVXc_but9zJ`#*<3J~yS{L3aXpY`!GCEKgi6**2?)^UB z!mO+w6$-Sz86f0cw$C$I(Z3{J4Kj9_sXkqQqGRGnT7AR^C_G(%OGi6`XbcLZFch?2FO;>WHzr;j5XF zUPzxDZ!xbN>AYP#ANek1zT<&dA1Z0+Q_F+LUp1lIrn2c zg(4}Th1lSG+qa=AL%z^_>npCmKPFjh&I#oV4~3=nnb&1mbonwdO;=1)JdJ+$afJ<) zb`^i|n{yubdu(mxeU&P`Z*i+3=k*38Z+iLOks}FZRiWD7H7td-rt2rd zUU)8Eb5Xx3WYOtO!hZk6Ds$G}RvsEHoz9d0U0LsFc~zR9^HCL6TmbI)y=khqWU1Qn zr2jQ;E@~Vtan{iVVw6zGPb=>%2uedE5)^JxjEx$?crZBAT&i z4d6OmgRg1!<5hU2h{$z3X{dJQ*5iA}edo`Ve~flx$*f6vA;9r3wXIfL>pWV=g3fj1?9|6WZ_r5i(AK1x@{3V zozApmniLOI52-KVbFw*EQc7+w^sYNdS6GN%`mPF~6w zNbo>)zr2LlnYZ}^clT(LDOyT|o7=cDqCi#1CuX!rTBD8y_go8~GR*PHO} z+`_B_i5mVgLoatWYGrG*#xws`T)R1uU%93r;Nr)WNMJFN{4%}0G0`L6B#wO;ST7~r z`drPy0v+POBs*rf<7@6}4s>{u-}JUGchesR7o$>yoi#t^amY*H62$eXHI?D^WU6I~ zvXueKv<2<+z+a&EMmDQhVEdtpDCt~*j{_9@>h_>zr5M?d#G+jdcX2VT|4`mNIj+BD z6GxU(A*kpJs3}&U3Xe@!Sz>l3h?LBHUv`3Ht?|nVzY=878q}-oN&(a@m^@MMei)dx zYaiatJCcPTAP(m@4K#%2%z|hcSv54P8AyIK|p%uufUK!MAA(H>P*r1d3YEdZi2r&N84eeN?!v()Jd<&0M z<-ZT%WH4*3;_7|TY8w5db3|O$=FXxpay|8AsaMY9y2EJ?QFy)z+nJv6EYT;K|JTc|p#bBYihRajEn39{IjFQsIyBfyvjjys3dKLP?!# z@%o1aW6b74E=E!`FKgJaAZLACe2AM9H?d zik+_GG>=z_*cP`?*TtzQ%7iYb?*wrlpA^qBjs(ALk?^@uuG;7=MoiTnzADG59!e_t z5@qf$ti-hY$~^W8y0$_#&U6uwZf^y8BA(3O?V+|Ed}WHi-xK!DW&a_<#puX9 zuvd^3)@arl_OhqlP6**{Vq?LO(v-oe1TVwoNAaaXw-_wAyokW z!ZJNE+%F%f3}Nhod>z~u{~DGy8(Lp7c7;QSCL~=^yz{*J{Y=ulXODGUyA14;P=$h* z2-jDid+;ARdujVp9!c@|YfLy8)_baN{7FBlAn<<)*++k4pYW_YMozLyd>-|~&m>u4uW z_9okWepF3ejPY|DR#rT7BR7z6n*S=G?}C4>_Shc)rAvF?3j9AhV3^2Nt5`{_jnEJ7 z7bc=1CQc!?5Z{pSJHbAHn+7*c#FZ43HPpqWJ(avv)s)q}WbR%n?d8^#->V6OhWOkE zfP6xHf}!G|d!bNyar3Y{LE<;>1d7`}2=))+-r$}nD=8_B#`jxt+X2i?tc=lyw;%sE D80aHe diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0005.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0005.png deleted file mode 100644 index 0d7f85fdbd69cf4431be1dc538dcd7b93289f96d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8862 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0007.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0007.png deleted file mode 100644 index 31220ad63cd34ec1678541ade07a6a64ad57b31b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9886 zcmeHtXH-*Nw{8#t1r=YwAktL?Aqb)f(xMb;N)x0vBOo;jNC{OCv0-RIktRr}QX)+V z0Z|A=5R4#52}+BQ&`BVHBsZv^ukRh-x##{k0AQ2YwS#q~z{TGa064~OsC(WrBy&E?xk%KS+-{1Jj7cs* z*!9_&347}NrG1!Us8>XuHrfqtd9v%w(XTpU7HwSO@<|iD8;OYyojJyzuAdk#s6{+i zJ}GFq|9(;RPVw+1y;gnkaQfJIbz#;;clR<3r8~1~5Kma0e&?DKK_S_ORbV`tJQjL- zeD3bo-X(eG$4B4W8iJ_i*3vtRjLpU7sC3C6*Fy*I^Giq4iO$aT{?lROo7w#{Q=KXA z_w3%jE5k0T6~1BYOv5#Xe|>X%j$G)8pXAAnq5c12Yly;my0jAeM~V1^2G0gpk;Zhhm83K`$TufOF{u$+GXL}5Ij zSF;z)3~vbeYui>4gI8umB5}2AF^ai4K*VA%kZGhU)-r`ASw?)a+d~osmF4?qX57iN zk#R;XOf!PE*0|yU-n6BEjN=h386;$foiHr=;kQ$DZ7n6eH{9Kc!NRq%MN(G_A?=TQ z86jz9k?J`g82Q8lg4{ zUd5%kVPIU^@47emn97w_v8($l-aDyPwA(cT8x^~hr>&4Pj^3_xWh-{QYwl`)? zIPqEgO9tD);vC){o*oaqTbGDz7FAAO>zpREvbVEE8zFtX2FKmU;K)S9`&qXzAjE`1o447w<0Nd;XGT8j z(SZ8;LHhvlCe;g|fwng-frt zCYPM2Z08aR4YV-Ev2^sapDqAya777nOE@>$7ior3G*&u}tmDI=rHpU!;G-J*I!81)djUDTa|TZA?XE^&}?8e{4m^!6p+_Ofpq((rM(Hni_XHi#ZZBN#o7TaVBG(OKa&ihc4l=g_pkk zXMAZ!V2f3Q|7$Ld=e;8vq3*+D6RW|wAV)HVAN|E%-xg#E4cql0K(XEelTsS5W2~|Y z%{}4p+6=QWgqlQHI~8;5!^Jcsw?eE!X3{-M2HCmxSyq^8QLm93pyN$sG8q%LUJKi3 z;f-7>gGLaA$2YLaM@(6{_mOBd?2fAQibsDuz+QfpeI`A9-S9$`pph)x*)t_PF8b@9 zVEKDaiypO@w#zB;aV2XL4;8Lds6g?fn6O~04Ho0sW3tZ%6u>lZ%~_IRvpA$9Iw(s$ zxIA>jF?j42d2WF9gE42_Z0A2UdlVTIQzPuq(}nE&Cb)}NCP0a*K~QCuov%4|Ej+@1 zg@!i6jSc$ahg35P4}Jj;d7#y)5cjZQdTD#k9Uo9XLe9EmkmU_^q&`lK#p%Pt!{6S; zm#&oA*PS_YM)qC5##U7hoixs%)a7hVNi(+yU;^Hog9S@+uX^cDhY`GHH(UJmgu%TR zn@qRiFb{7uI=5@f^S_AmS015;bNCn3#|<|}F{!JB(zmmp3JK%@9&(=!FNQ%Q@@g!d zvuX-izDkCD@5`O}=J6pjojF0}H`Q1kTZ{~@M-?Wg4x6i&)%k24CQ^9rh+maACuy9T z_gki-%}~<~;t^H)WBHIlu*@EVqSE4^F#ct~T))xR%fsFkzCJ#q!Q&AFBimF@tZ+o1 zQOMK?^>_R8f~n&t9C zS&ntrdx$U|HsWbB-;Ba$8_V7$+@v&F(c*{5F2$x|)b3@D9(0`cafR=e9SlX(0R+cnzD2q+w{dADB3(9<7(0JC;UuVc-tMz;|b zwS~k1Hlxk-My#sjQ;BJquv^KNL!BeXr=P59(x?~f>=5p!S7-1eIsv_^TY{k&a?d*i z1Kk56%!|p?aCvGW;SJ;?n}(`*zq4oY^8MMGVPc_ENnwkaIx8?UV>0cXT*SsZai??F z{iKjUz-Y^O+>Q>xMc`b53SRZ*L@Sv%IQaSVGx8G!=UNfQdNUKF#>#&t_2UbDLH_4D z+gnVxzqdScvD5;_Bjg%tH*>T;@^G;sL%^uwNrRG><^%5J!po3XFA0u@2}&t=_aQ6A z02Vz`nMrl5q_lPlb)$S{%7t%jESD^GpX#-&;Mylr(m8i)yeWdEfXc?@qNvkP zN(WhIzG)3-Yz)^#$lEnlbHOy@9<{hYysV|sAal*ENNIbPA!ZO zoc-wJ;Jh{e*zmA?1s=OQo#gEC%)ZD-p=pD4+*W6L#?ZmNcq;U6Z|2#{m~6FMB`{3j zEUw%U{UJ+zP-DxPNwc2LW3W7qn)i0L|4B9-FwyXPW7>L-zAdL{)9SvFV>I%eD8Vj^ z&+48heM&M2$#ck&sFgLT)~82`M>SjL#g;|v&j9DT5OM=V8jZF!KdLRN2@CY~onQL) z&WifE%wAYn*t){WSBx=NTCp%%zuLkjzC~Y*YVLo1*~n;qNlN&Z!6L)bD?G9;TBboL zQ?{8Fp;p^uZ(=gs%rkH)T?qrIH6c71&yCi&hqHT`cm#fqBjsWf$sqr2ZXKu7lb7q@ac*R3M zvc($++jx>Ztluc+8-MF=u`+EqEiL_RJTBR8Sib+|BEjz+$a2gI`uWkkHCNl)AZf3H z1^r1B9-E=TvAxT}Dt?WWVQ-du>tn&rWXccI@C$or3=u71)JoPrGB~RYx9hR;DLWwQ08A(HG0UNi$dWa zz~dx0^o?lqC18cj2kV(_=O=(cwRk8Oa%7dmH^0r`00g__0#-PF>gs6qztP#=h;9S13bz*R zBm4u8IJH9`G{3Frq80*jHaFVAPJ`jJPdSlmAN2+KGA|nz|5~dJ9Y^bpVyx!!Mij~V z_}z`&+~%rDYyvcLHAA6s=`E|ompo%e7!!JPDr5!4N(KL%+7P-r1CLyLQKDF9wn>?{ zcXl2}2QO}YY8MM5b*G;q>lBogm9dnURUCSufjC>3Q_ih`S;LJ5k2@Y{VvsAO?}Ou5 z9l}pfCdRZ`1ie7|Qk6sNFPs6+;gH4%!xC9Sj#E=OH9Kq}ltCpBpcT%|P8fU?lMV+n zHUyiN;!3s<72(qgQB-5MDlG~ME_JA7%nzJ!YP7+KsRdqV%>Jum_G8q_zAP)Viet&z*eF)e-JzOKV7+1Zs_lB^ z9HD%E&GYE*U1n8ER_`4|rY!_FZx({-o>srK)s}UeoF=*d^1uj7Hg}IVtz#Cq`}6I6 zab~PMao(B`EPd849@Xe?K3MLU(d@YQw~ee#{UxRT*SW)r_`I^*t^CNp&G`?L?tgd9 zpJ(br?g{hKig4BGF1}rLzHpALEl7@513_}97l}7L1dr; z-=kI>9H({WgX;pni?&6M_>P~hEp_;t9HDZ)FNAFlMaG=3ec7$ZBUPVQq(y`;nI=By zC&UA`D*+OyVetgENDt!Z?e{8Jmly~fA$q`-#4%&Ty~vA@MSV=Xfum5Y{`JOZL|G~a zcVI2btZln-%|GF*FmqOaH4lU!zgVNda&9HK1;UCjDhH7%^Xj5c-AH9LJcJF%4U|>* z)$8V;kY6|^Plf9Zs(_U_zmR-wtdsY8kw-Nh7jK^*|a2Dr8$93`i%oDL=`wbCGb`Zy`i`WH+F)!F?2Y4jR?;(=q`U|!!m2sn{+)ZT4A{IcJpGQ=7{TV>qioE5zZ)L#Pjf0pZ zfebeXn1(rIH&)}hhnv}Jsmg!sg(0gUPr!v%lqSBsI|at7ib<6WNy?-Yr0U;QQ))BQ z_%raQbK{bIJ{^46M{31+ETUkUX;sFEmU8S+!SX`8>ZyNh(&^4i4QXq|f%i~Md|i); zU7R1Y>{-$YuOWe3la|;aU!ZWlKM2Te_ov-_br%0f3}g~;t|vS1HO6VmbT9oPkoVmA zJ@}4)SadrMrq0Zme{~1h(`T=@5_a&MHYfDjKY}-NykC?@GBEeaGcu*m$?f*PA9lz) zw{=>=`8y&FcIgEOn?e)gOiXMM7Wy-f`M_~rqPY3<*G2Aexkw2$CZYbwQco017Q;r$ z_S6a<@?HkKl#NwU`ZFu#Db7*(d8Gpy?s`LQ6t}5g$*wf_A78?im8k}f} ze3CTN{v=hAln*M5;s_X4g{O&ej#HMKCCwX4L^EK4H@r{jRMIHk`(Gsp3 zC;HM_yJwm6C7~|3@u7+BQe#i?6~05l%)EAl#>bwzf6jlf`hQ04KwU$lu8_djtTe$kzhz{1@e~{RN1&{=0wy zZp2rcvYzBJ{vgJSMtx}1W(Li^kp4wKa}PiI_B{a z*fnvG`&bb3!?g^z%sD@)%{rH#O*pCRI&^kn#A+yyrm>UIj&DYR2D+!zbt}2(4wYs= zdaMRzF`7Q2_8HfVdb!rk==qDai49r9H~E^8hH}MbZH}SS#`dq7h9_Dud-KI$P^7k$ zT`I6Dx0*guCuTH|NFNzHl*ahdTzVX2>H4h8fs3;AK*CXo4BN~%^nLWi1@icj;7y3n zSMdmDxrsYuy+SEIEp(yGgIUfe6LzUe;0ooL+@&~%ufm3W-%!-z9sBadE<+?dkCP*` zh2fi^8B{zH%(f|b=s5`yzLyOEcqt(h;Jf=(wfR0zF=eX=;$^A3$hH?;pGI&Y_i#?d zsrbY3+$T!djNh|5fqHuWJDT%#uzke)$j|1MiWX38NP$Ii3Q$7xzL)9hX|G655pN-rQuiA^*E^Gw4_sX9h{R?Zt5u+wag?foFFVE{WYbuJ zQB9%yUU?>oS`v)KzNG41zw2+Uh&DIQtpOc-InH;Y!lL@&V`(q{{6x;WMKLY!>oy@W zhy$DGj-tyb!{{%oxRCI*E>>f6s&7ty?uaoI zxAnap`yo~dY-9_!odXA*SxG*Pqm`wEe(&MwGHfB889(&oZCay+bTO1;Ts?8R^~KKT zy@k{Jw;xscL5vM#a`QgV-=WLQBRJV7L_V4NXu#gPj+}qsY6E?Dnpm`c1k!C`J>99q zYybX|TLo-2#@|8_J@%?ez;3><1ishjZMZ@iESDuFRH4uSr1=T#;e{kDfLN+m9e0)_HbhFfBCHu*Z2Q8WkuKjvmA5Xb= z8?UUP{P)XVfGmu4#KnA>Pm^{&ml8ZOH)_8$#xAJF%W?heDn!Hh?KPCiep$nm(N=RK zjw(5XeZ1V5Y#|S}&$l>7ZHW3cGM_TWe|!?LqpCNyKWfz%YAX&^j6{k@Ji;;(mLJ`} ztOi}Tne5B&DvEp*i_l8O3Jb%R8`G9K2||*m2lq^$2n#}TzU#6`kjgImkfoz$4P~;^ zgv5K(T(#s6DfYIg%F~VMJ9R|Cy_lTGLKXdZC7EJO1PB&}$-!qs+Jz6m@dfG!Pz1f} zhygU*%!HNVPsx6hezs~5Mb6@zj#p@dlkjj_fi(F7jJeyc?-?X$<9IwF;7eKgv>hCC8)qa3N3 z6)l*~A3H+{J*Y@9zc2O)j`OvY?%LY(IKaj!=G(3JHKeSe$=MG&m8ERUx(MRn70D3b zoj#VQ#$HHx?HyweqD--z@j>(DM;e}$Ie6MaVr(IvuRun1H#@DaJJ#(%J{EP}j<%@T zwxJq3Ij{Lp;DTk5ku_#njy|;QuRk77-F?@0w^;50R{YBQjd%Gb-PoRb&sX#MW)es#QO%7~iR&1F;d+o;Q${zedjv-nKMw-=-up?bXx`FPQq z*O%PRzW;h#;hyWV0_;kB!rOzUrMBydZsnzHnjyyLefE@3VY z9Ep5Obv}(L^d8VHyS?0EI>6p#!|zw`SJ!1x>Yc9xtbQJw@_bK;J$T^4g9PWCD7Ow= zJ$6qnqN|9K7Fzkp``Qx4B-Nd!QKx0GqUy5}FN%{lP5~e5*xinkn@ly*A^Ji@R-!d7 z^hDiI#qDnpKaSx4(Cm*pNkG_9I2A)y=83vOb^Rm%>Pm9MYeL3>PI))15+Oox|VcQYCE*hb+uy9VA8?@cp$(MTqdwbc(D2u*oTo2I!iYYU#xtZ zK$kfgn4)TxIqA_P+^Dp3a%(MH#j67{)12`TFDa8`I)E38I^|-#g_<6^g;Rr6mioPk z9W=C@f@#P=5^P&3VleQ0!nGm3YIxp2L8P3hx6q=}j^(CRzgCbccBQ+0N-XlGHJ>WE_TOnS%k}7quW;goX?la%VFc9ojUZ2? z#c8k}n8iVN!`}^#F~OIL7?Z|=LX8*8k8T6b8^V^Fu9%?KPlIGfLggY=O$*mvczf6h z!uIX6xFCB8Ew|ni()$A+1;sKNde`n0Uv2|<_0U7j-lOQ-6JU} zgTEeqxW{1k)=xo=CsntWx5+{4AgSSN#|*cwFPEmsn{P4+#D;)rvS`Gj0G5P>V#Fo) z{Py`J1blW@bzL!O*pNl|cT9e)tywU=VW<5zEElaJutvCNdFu znSXVAs@&Vsa@ltMJ#e#pz{kf&d>E4#Qaq3c3J-Z|@%s<2>We%IstJTx`a&d+<6Ku= zeO-KWT!J_dJiEbKX=YAi^7CY^wtP^7+1j#3Xdvr(-g>LPY6*n3F}=Pt;rf+Axo)}M zR~CUEh@7iveZpN}=q+ltBSa*Ka!tKA#8*SA4qxXF<^ zW`!?jmj*au8v}&U>KDi9`7OB4ak||t6)!!M>xGYLo+`8Ssz!#7?&l;Oo~_KDjIss> zrGHa59Fur)XSB5+1zJ{&V`NufE>^o{QVhpCcV+BJl+8!I$pq-mx2a_F7n3`$^ zw3BB`L;-~l-YIF%>ZxLLRg3ZUjQc4SjncBn=tU#(VweKmq_hK4T2-?`CieyyW_T3L z^#S7M&H+y#i@To$8heN)6;DFAlx4~aNvgXDwL+2DkPdcXiDfMy z;kIW%+z*r7&7`iU_wQJa#8o_is5U6!-L?C}&VOYP?HgS`UtNEn2_eEhkH3gBFF@&& z6=@LjC&#ew4Mx?Q^gz*4y=zQGZ@ubT#}lzd9Q$ zS2oN$H~k39sL%CI5D`D255}gs-D9eKiBma~J>#X19|?N0qeSwV@Y6JGV@U%V=v?CE zUK41=0f(yh81%VqCNYFh{xT|fji{(msh1_S9AI3gf6S(6Ll!Om_7pk)+lwB;#QS`M zZC6PbsiS$)%2p9iA;P7S>+V-s!@RwY{o7CJ3%lmXcVV_eWYWtjQ4zc34%!eq1h-t- zLHurxNom~I1H1pK+-~Y-!CcCP;&dybj&-(LWelUP%Bf&EB^7r2$t1I)@azzIku&(g|hmeV3Buw#->%fesCfaK(be ziz_iDR5whz6Zgd;-$ye^F4T*LuwQ&%Pc$pFksCG8ph=6Lz*d$}T>-*r`KVszQB1dC z9=HJ&=y)?FPx9@<^$pe3h@ct8*MGY<1ac}6zdU=Xl7YSJ89eLn`*ac*!#mau@j2K0 z?S0+Jf6WwtT&%MI+*$G|VA6-z-U^701k-Zy%bW!wb?hSs#K2lc`Kc=6-4E!e8OJEl zuY#t-)hQU8XDe*xt|@94kJTL+@!b%ZWf%aGLkITU^lqpHOW30oV?5sq zu;2U!L_8W*0TG2=-HY+Lz0Hog?al?TSwor@^0@U0q#xtCe+BwZ0oiW|;yHfe;nT8LiWEK1(czqF!!p;A(ST zK#Ex|?|F|*LFuC*y6K0y=-NQ~P=^|^zNRL)-vPN_EfJ{im=3S;Lyu_Row2I%Utj!6 zr_)_p6RwF;E9?o>2u|i{gt*x1ho_KXMEluz;>neA@zfHm3`0f{KcQ^Nu}fz^k867~(fN@hJHKF{81sGUfc{fCR;BA@0yLLT z6(6GR+zH+H(_*3NU<4shbhhW{zYsL#8t%mU_JQl5FquTMGWM06jXL9_(T!5xrk7}} z%RP3;m23RTZ1)z+9Y)N|R@&BpLbBNr1_pO;Xkg?qh29iL4%?OcO-=bA;`a(P7Y?~FU z#-~o`rO;1n!H)wYZZFk{jUJ01=0mSjZ(L+2!|ZM7XrE84;lC?DdGWNL?R@Fj;M~Q^m>*x z1TKGTdu3f#T2f-wL8z`)jv;QcXPdtgHzw7rt*vSMo*RO(^e8U$kEPF7aTXzh_sh?z z_&>GRPo6u;f+{rFd$g~wDkvJ|nf=!GIu9wQ(QXuS@P>6$Du2?GykvrBf2jmK><*L3 zQwkgZ@YtEwCZDfd9V2r1M0FyFeXBz6_LsMO{X-9(RI6V!s2JrZ{7Sbzad80iG!^!_ zzG@Cr{W;`K#HB|H2jt^oHrVykW*mp2F^*}SOdnY2E|Y}Ji#xT@3pWe!^d!`W9G3sZ zmPoRK6&ZBvt=U&J+?i})f0b^3ENbG$h=lsTsz%JgC^Ms7?1qhr|} z@Xh5e-w6MvWOF_$xf#w78C=XP@G(1Aq`m;&i0LY`BZ9sz7}zoympxVw&dk)H{HB@u z!R+H7p2@fqgZ~)T7}u^oDLz9+n=}WyxDJ!&rWd z#SF&~_qF-awXx6zAYZ3Nx9Fi!y&h2Li&kY{z3YlgtikP1Z@Jwr*_c_I?p>bR{C1U7 zXVI0aIPsF^`aGI!s6l~CuU;^7NNj2A(IvUUw&okPOEgaxSvp{AXQ$L*B7B#xcpKO= zuhvHV%_}0mzKeDa{q`|==IbPInK?JOLeu93SKK#OP{dOnkA-HPh*1(RzPruvBFf}z zXVW$F+B4>)hkQQmtFkMy9j1=5ZHsbW!YbWLi02fM@ce$x;jo&0Yo9BS4 z4Z{|#!gCHShzp@jjJ5iGt~)5)d-FqfBn{D#uj?ATU!cD>GSUpD z<$f{9k_E3Ik_*hFTdMu| zQ6iz_Xs9fM@ z6pTtfvVJB1BspwxAMNInQO1`9Kfs~@pK=7TrVaj8XOu^hbY_*JjidH#cNvp6_tDrX z@t<4eG9PUNT>J3Tmu){4R@0_#`GyWly>LSepAXbZAI}k2{;Nvh{#YGmVb}CKcsvWG zB~~^!>ESXFY@~*X_g^+Db}9gjKZtHOhj?hL@&r19`lk^EFrJC>AJIMq=MG2^A`T1h z*dwteM~BU3BZmhUeotPGIf(v1tK4Sf9Kq_N-Snstqd)w&apnjwNSCuXT^YDE?nvK} z{XBEY&`w(Oz3AYM5 z2McuMCWgyYv&fTny;Ii}dLZ9Rg`_$2wT7hbTd6Ao} zVP9gy0EM#KGFRG>-TC@(ulxx1^s;M3 z2gm0vcIM9!!)XKbx;ZHq|%R9efg z#-pV}=PJf03k+l0Gkz$^ehMXGt&Yn5v0lp=MElfp8;kFwV{82;jah!$e|s2<6pkj# z{pIgZc>WJq;dEu`K=l8{!j8WoRxow%*F!~PiEm&F$;Qz1l^M*VPnm@1 z*IJL_zz)RIgKm;BwYDGGT?e+ZlJD4zNiEAyGQ9{Sk~`tzOMRo3*7;5MB0`v5<5b$o z5e+V(O3xAkOVHsHjb!y%%^welSA9HUz#FN@yHHot0w>edyhrJYeu6%@Blw;WrTs#m z>d)lwK;x*@tfW`$66zGWysDe+V0NQG{j<$ft;=s}g5)$yHG*iCRcnyo*{P2~ziYPa z-2BwPuzd6EUG52&Taq-2A7w%P{yWbcYx0JEaWsj}{-8NE_DCiFTf>qfQg_hwR>iVJG z!&6~~O}&|;BybNbm^NuM*(Hc+Ex#A^v<1^zkv`vR9MbwoTv^dJ_p$TEExf_aYi!!K2|mvww5Xbc6n zrkv4&7&Y)gkbkXL?cA9()J5xkI*EZ0c~nG6m81CQ1oX=)k1V;a-?Kd~C{8?&8OmI$ zmt$CE`I7H5S%bb+2!+~^PJ;$N+|s8GI{~Qil$1ICgVseRf9A~1W8EHZ#c*lpu%+?p zvaQQ+#=g_hSb9Lhc^n=^P{x5L3W3==BJJx6oRCg(U9d@eKgopeJv%*6*>JQ|SLh{a z?mAowW007cVdW^?h?j|dd`0j)(7fZQF?Z@~S9^L=&qL!Zf=qQ`ul0%5Km3h!u}j}I zI4ZjoA4T98pGyiT1Z9TAAyyUHACd0{2}kEr4ys3dIdL_U=_Ju zpIh+V*w~xwb)cc1<-_tT4oW?u8-+c5EN!6s74hQO%}!s$Ug$75*P02{>`;lf8LBvg zUY)J2KLqPwTz*=6*1qqv##+jFj_jtOt7Obf5Ns&3i`RJXK^sWs$Gf*P=`S03g-v9r zQp4P-OCg7J+Z18LnMjGt$?76{;KTk-XDSW*@~r?j$Bx+a3`wwT*6ubeSdm2V<+_oE_YqQABEfWE=*0%;G& z7|WB>SntM?bQ2Yu1iZN#*PdLLK9E|dW0x{i(K=!aZ%?%<&AGF>bb%iRi_>BbAs%+{ z>xnq}nQUCzclm2W*anS6KgD;bz^6KPo~=P|96{sjXS!YI_#PFQby)P1`Bp$;YM zKHSr8C|uuHsO=ugAzH274LNj8xBvT@I+r+o?8HhTa-+-e_*_DTaJ#J4kR?od0Iv7U z5;BEY3|&KROP24-pXwmJhtjSQRZ&dj$Tvzt7JOqu#A(Jt^bomsslQIUoTE@*y)WYy z-i=r|MJQ56Oph*Ue^T2FPV^u;9+<#h^OS!5F}SaAhp(bheABfJnNlk0J?+z=bd+tZ zK0|qe0=%<9Go79GkOTWW1ueSZ?``+|AlL78J<~&1j(pTVt0y<=c|fr(h+<$I4+ln~ zJIFPU0t(XGQS9_P<*S}fi_FWZ9&D}tG05_O?;__gc_d?Jq*0O#6Me1aXj&}=);cgL z9eh=aN18WsxYdXjOVHYE2gl@C7Y|CEUuYt9??ZcnpD)g6K4yq#;qcW|HGp1m1hl%9 zEOlyKdTF?|=Jb@?TIj{RGa~rp3`pUcXGyZTch_DpF5%1^c7me)tmQIH6g&#dl}@=b zV=%i;5V4#EztT{#WE|w7SkE(lEh&pj4BtRAp=(fiu*yBsOLnu2hG*hA_j8uAzh!>t z;<|MhbGX|NXeA;~bh|M!a%EfwfsHxrc%tJmh6&gf(g~*bLVC*J6A59&CCw=`L#2Vp zbv|2N_@U?OxXm3AAj@shSR!uXbI2Gh> zXp7_y+HS0C3M36B?+i|D%D=K9Fbo`sMP-3&ZsnmF_2AJ%>YGfL_+&!fy90KKZ8D5z zb&y_*sbmc5WwH8HMJ2Ljo#AA0{I&TwjGu4~_0&%2ODFO%uRu(t!R*XovP9@2yN4mo z`?N1PwQOqLZuy01vvUhE(1@lb@9J;1L`VomU|OVRzRDblMoeck5W#wM&CM>hOPYz{ z&>$&kY2j34ahk5ct#)-(`cB=6PY2C)uxPl#vk+Ru5ou?@Gfnb2Kkx4!*K61HJzSsfXP?je{r+6vM>f{x`vt@W z006*#h{ai30Dw;v0N8P2&raTxmsf+m0RWjtkh8}25jixpTd|}Aqa9i$VRHjlBHx zyB3duz!rY#n1joo`Q2!N^FyN@U1eu{d%N_i2S9o1(g#AA!_{8hu;|{6+}8>U)yGWs z$lMqHc?lV8hOfTi6S9b1cs-MA_Tb0!DHjE3?pAjoB4n0`SwwO-ZS(Aktbv-c+r9Y! z{ixONnS`xx!JD7*OpsFoUiU{ zP1v?`>bI1*k)a_)3FOi}X%SR*c6KYJ4+?fM%mu|prPv(Y-b!P!Pkt>PpU_TbFTh(V zBO|ckb$T8*W(Gr_=@mou8q&LD^M4o-`MI;R(+j*g9K2}`W?j6N-nj{FM@g$o;A?9i zw^hb`Q)y*VP+(WTOt-9mc_Oe&8A7a`s#m3T{%!yTnqJ7Pw-@wS z+aCkgL)zGPVuMWABG&1R9+spkd)J(7Y2 zzU;w^cIxt8NnMNg%h;EgFzJ~nnHD~K$@~1rs%bufN-k*ynC|Iz^>wg{+m`5ClEu~^!J*-E0%%YOb&<9?U$FUQzZP}S`-d?CiKG)YCc%vF~} zH1O0Q(+7MLx*JwJ(k1;0vE#vWgZw!ijA!i?JJSX0S+@Bvg6VmM#GSh5SgFn;tlagb z1{*-?>CbR{5&w^#yS}>-;&vP+;r<}*x2|53V>1wX#ci#J->9lsvT?`mfyLmvah*_G z?-q5|_-x_gFE!y`l;<<_oD?^2B-hI^Dtk!Nee>7YYCy;0E!lL@oa>R)SI)NSoX(3^ zVbif)oe;P)-lO*p?MT+`Lf+ts+{b=AEdSTvAKZvY-!G%veE;mGQ1=4cAj0G=5>~ z*Dh#AZjqAZg$f?S1sT)Xfw_i}D|4h$6%`c{v%DNg*~2d+wKW6gZnOv?ZXNi%k!C+) zoQh-2$-CT2&p%$VL+E>?M6MTcK{SsX_i7(W-+JzPCC#JCrktIBx)f0NFm_zQZlskO<+S=ONm?!Zy z9=!Dx-b_aa#!{~cK8ewXU@qiV5;d)2OT+8LT|QHk2Tt|gm{7Qb5VIVS0`;BS*s}wD zEC43lG!Ct8YOOZiCwS@m#!Q~NRNz=$6?}2xI)%*Tz?bWqn_aizu0EnMVtF#xD7q)t z=*l>|b~K0;se_vo; zjw3-(u4xnYBwO5zAA)P`C8myG!%HFTC$y9SumeSGI?kvK@!CYKioSgKc zR&Q3t(xu88AdFOy}s`5?_chx4(w;Ik-2RWfn(8& zO|8s0L9xf}r_7(&!`&q06&2$xq z&LkeErAx#MNl#2nfWqe;!`37}hHcXDd3qt9#>P-pY)$M-zrJ-9>0Pigo-l3cZ55{7ur@1V=W#r-G81zw%kVAtUSERmn6qvu_`xSmH= zgXF>AI^GrkOgMAb7v+cRLt^!v`J_J4wGDd<$AKV%AW6^O-xKEPKn+SCD%3TGqy<3I zL98Qf?{>Y<&QnBhW}?SxM*#A#=gWO@+GOt+Jj{sJxhBl8V<`UkzLgJV~<8SJY;hChRWHxqV6^{K2= z@c`$993i|_+f_iHO`UQO`o_KqYrLYEriQIy4;FEZ&D|ceY_4{UE*YkVhiSQu!BJ`Z9* zL*Tfh;O>5LOp)-OkK>vOt&GDR2U5v##8FIsA{>=+cWR+OS(zH|qh>L~quk1+M~4+2Cl%#Jl|&eZez#d(A96<>LGd3rJ~T8`99y~7D(0pt z#X|-5TS0YILnc->eLzbcIEtmzEL6BXl@Vy$OUZ8rkwc5vYW9n?m*Y=avT^#+GX~JM z-{CBEg?b$Bifa?<@ZB;uFJ+*8{!AXSIifL$(l*f)?X|e2vn|(JDYJb=3GE4D>I=iw zGxNjMq;c*t3MryC*Nf!Pb()uxcA10Fg+!*?W5_+;Ymu^ZaNVT`h>hIZ<^VS9K0(l9 zcz_@KS)D|3htPQRgP(y?S$b z@CHrTA7cW+;H+0C`s{~YcoZRc^yEnw0j~oUQAA8+u>6*bBDQGUqI^C7egb&R>UykTW5MOr5|he zt?lc(csw4Dk~A0?V{d~i5Ay2Y6c?r2k31RnCNEUY=~q%JF7F!ptdN*j`Ufxc&vSSz z-%t~v;;!8MnqL2F>Csakt4i3JqS0Sh#||vF*r6#?5qKL#7hCU5sPjjR%|_aDEoD9v zkyXg#l%0Ey)h+YQH}#>SrDx2#n+h4FV&lQ%pZrt%k={=&-JMa`L7F$T`n8eXPc;G< zYgshe@qQOi>f9#=5bVZj{)d5lYqUx&OQ?)6Q5NzHoUku!MWZ&Ix2^$Ty`>>;l5osA z(`G~}P=?f#A(_tU9w#Ra4o6GK${eW**?Im*Nxa2hqj&sRmKkxnlvy*6Sq)r3Sbb2s zc;`ytUK?Nyen>vSy#5z>4c~3)ZPBAxz8X&4sGu*r;bW-)A@P7bEfw9%u~+2RZ!@Qv zH;$#MwMfzcU-%bA1u#~M{`98q^#u>I)hv0eX?XbPk%$6ZIR1P`nv>4p3Eztsj-f*L zF5Kh?fVZK<2KH^dXJx=~v??s8kdv{a1#J77j7BA8I=AXM84~5{3M2trw|Oeg#M_Rn z2iq+=k*vR|lGJ%yc&Gcgf_lK2-D1lYnO~lS1D5!BIJy^uX71+$lsx>;BM63ej}5=N z5w_xSZbQij48En>st0uZizQ$OXYq79GFO$$H7#$Q31pfc>g3AH7@@U$I!kL@LNk=9fSJ!LL=cY?r0AJ|1b?arU(Qr?*Hu&y|faf zU^j}nsql;7E@81BI9+-TsWNxG@b!4i$jESSgLvU2SIr%@(RlO^8$i%c<$SVyz?|DZ z!IJMEHG%NLM?_FA?01c~9rylW&V^GX6Q#VB^m87+?YUF6kSZo7xC>Bl?}yywA?e>% z!2q}TMFmc%{S{Mp{@&0o0Q@RXDgLCp|8B|zu)iI|tO}+SNVAJETz=5foozVETYs+* z4g=A%dJR`UnTG7`!T#XgZS#5j$6-_=W7pqFt7+Hb8}4ns6>Gjl8^Hx4H%EDe=2(?` z`{N95^p%+&w2JtQRH+yQ^QRd+Tpq6rqO^lKK~)!F#eDn+{QUgp$pk_S<7>RMtD777 zbw?n-N{nl6NP$`O98w=?@g)&@eRYz0}aYhE4nIpcHN3^LFUX6U# z>yL=PjXdbv$F4Qa7%eKz_wyvsOT9aLd8GzmZ2OO}0tj9*L@Y*=H%G~w%YM#vxAG$lgQqMu z<~Hav3GH6FkuPIler084A`;T9Pw}p?4ASuE8fKx6^2DVfyora`htGnO{^|ba&GAK1 z)MD&nG?H1JcjQm0rAAP8{l45Tt)45TA6gv4YF=yNaViZ@VACoQj8gU3Su3-TJP+8` z6{|Q@q(L)Hf6(!E5dDc~|6P3iGo%uD>`pGjo?@KB)&Ra7Q04LX&uR%!$M<*W^NN!< zJVa}4h%=c@vHbIH8{huk!O!^r-xm0H%D*1tDgFNd=Dz{+KPKG2`SNeR{F^WT!o{ER z5_{U6N#1e4$jU5o!63BO!R?u^J+??AQa-;UM^%K14_|;#;o4leE><_+56POXe>&jx zT~(TR#>C?^eDSU+AMcM(r9*Hw#2n|`jXrmFPe7Q1;6s5wwWOU_8&K>i#)aO!mhWk@ zTfSrsSTV3>;i333h++Efd)KIm({aHQq^zI)b;AKxDDxxt%X7+~ndj4Dq$R3429cDd*!bP1BaxPheUY zLO|;Y`Pr?H3>UrPRa+v&Sk;k$3xT5Nn3vwL;sg{MQ|k zD)OV1*S#^lDoPThOjUaITBCoDj>vg5iI($AIU1h(gfx+JD{7zMLj@(U5fhhVU57%b7CnPQ=|PG( zqDdsL+nO}bw`p^O2$$UE^3Od6xrI{}GK>ZCSnTDCgr!gRDFQCQ?}lv*2H9*j5bQSP)NRQqb)VCN{V z#_t#h`em;PSSj{K*#KGdi5#iBzTm26&)XGjkn-y9kq{d0%N6L2UzZhkeBY>)&-?;BIlB*bXAHujC3F)X69O5E~_E@Sq;nU;jw2J64GHtP07e!TqwRXAx$_b&@t<+R;{O`eB| zFm-_i`@N-A!0sKv&e47eiDRf|8=q&cgt%e3OOXbqpLrh?3WqhKqUofSS^H&0f zqh>x;(hkVSjUA5Uo|7-1r0Q4B#|PA2*fwgC?DJ7ni z6Ed1~`|Yc+$<3@YlUMYfokL@qKLAF8Jr%}+#M7814H zY{RiQ9eh%JfPdh)*)auN6QeF;8DpF{Giq2cVr3gmBMmGA+iA!5%iRB@_$>dsrLwnndSD|tDL#9GsRzqDSdV;P8&mbstoa$3YC%Da+4AAj!S<^7Ad z9C`_Qe8);`+OR-?s~Xw zt`bplO+Jq<43~yzc^{ANLbEZJ5L)L!^Ijp|Dd`=aHAJgXR!x1Ne}SG~xf!@v)0&2f ztg$*MpOhN<3Kx{vK&73UE{as89OE6w&h_sz8|=5+gR?3*h%?=jZ&>pNAEl+>AIQy| ztF=Zo`Lv6pr)Q5+p!&-jpA9(EYKL>5EQ_Q;iW3VG4VPjVSI;SBT8+khA@ufJ~ z?mJ&wP-k`ulpV};4srA-q19M4ba|V=<&E{Qo|}$>N@oy8+)gE{cJW{VoUJ?qKh+ZK z%6AVh^dhv6?i>xlx)Y|>Mlr8}a!8BhQ@K{9iAw3#l7FOZOTY67ax#{v;|$1-JkWon>PKSbDh2Os4fbw-|NXJ zLT6R^3AtIbS1R!qGnh10rRl;TAGz;vSBht|8z(8uI~D>aBYu@=zj*zoXi%AMyjSzF z#$bWAtr{tv*|hj6f>XkPoy|$ z^P91_GbsqWPY6*Q$N-9o1^JIVMJCza?Qsvwcz#+4O>&CiWbd$`SU{xY zHs}wLU)K40Ph!1nfzQmnjRJ_?2RaC`Zthd%@fvLdJRi(l?|`Bjl_D*~OO)Lu4SIWy z5~TKZo@GLusp|V*;McMvJ4MdJ?sxai&VQK+0thS^c@X=EjIp5?978d#y&?VuWYvA+%pds_mbN3%-?*ES$JPTRid}w&(#laFD zK}v<1IfmK=dWOQU1$zK47+)|up`oU!t8+r}x`w;f8BHB`rJE;77I5OiHQy6K#DEa#HAFyc2uN2c5lo1o ziUC4RL?hxGP-mD7MRY+K)jK#W;Q^Jr6Uq@ zli_V}Gcn}Fzv&-aF}nPQIcB_Dh;r$zw1DL7#oX1Q*RmGuqmsYQ)+B&abJ|1N&z2T! zFL+$>D#GxIF=W105OFDVxz>6^Onb#&Rn5JbuIAH{U)nm+^zdUkdgZ%qNI}g+XlsRr z2I;8&F6sOGe>{A8!pX}+ks`+E*&5csJBgNcwOx7EJ>A{=Ksq+!;Kk1}Gcz+H zVD`N4!m-V<=ghkFGqeK=1KI6yVKAM6>L4E;ms3|ehv99oswZ??by@aa)up9=Jq`i7 z8{bJCb41VAbTV~A{1eRnwrNWB8@H@7GC8_o zkUg$ZH$tbwzpZv)xxOrX^kEfXT&vE~Z^yH?ln82XY-}XxF^P+-g5cE)*OMFPu%?+h zwr4#(JPySm*u#gTN8~aCvo)15E7@SpoWq?-=M zXxys$y3zYE_pB8nx$qP-RXNM|fnoI;!Ru6B;Ko_Fm>m@PZNK*f{qwqJfl7^Ti#o0l zv$E^c7z9PRYby_&wR4*;(c0&dVu?Ux)N3tXmh@EGc}F`68z<>&hx#hZWx_ zh%|&IXXQXL-Z8Z{w!MGzYTmdoIL^+E5bfrH;(Yk>6(N!k5H)WI%%#gqKnj~^g-#0PN|I{_))uz(%Z9+x7uEo7+w?2rpByqbk zfrnk#K;w1k3~wc7wtRw?VyB02-w4?(a(sY-E10liL0k^_A)08C($QKHSE(q1TiUTM z{cqGqqM8AUFw@`=ldtwZSjp`rbQ$C`)4a~0O1y|9(K&HlDT#wOb@%I?HK(}J5RAtq z(8JXjft@rr+XtabII*1W8UNUGS~hRk$CIt#0(9y z{lRt9&{eV-AW^M-&J!vEJP9_!@95dXR?lI7$LyYS4}Xr0QY}mzC;vi|NY32;)n{tPR~U=yOV4H=KFOYCnYOWcMB2=#NO2e08Z>7y=$Tl85#lU#~LDn8A@q zosz;`=PXxHJ{FL-81q2Bl7y#Rg|a0z<<;v0RMSEm*?#>qJs{voKE`TiySELE8 z7c-4&@csig6DexgD|)fu>*%39 z;We=ZgsULT8QhnTZ-)EzYq;w(e88fFan>6fjZ4w)?oFB>e*gH8x7LcG%%SJfF8b=p zCi}PD@TjRW(y(`te;D$9Tkybxi5DeRbrW;?wh!DSU<~uE+hvE!k#T7u381};OLR;2FF)=Yg z5m0{2Jco~GX?z^&p>ml!4D>Q^v=c?v$TU3Vns#4I;iT8$nRr*#xy19B!^T=53hm0; zE`f}rp78xO{m`nkTaTD^&0;@yU7AfeB z7AzQ{%Zb&VEe~c+57dNU)|wE?nu}A%ll||P_Ex-1w#)h`vL9sTts0yuGfq8AgzG;b zLrwFk!m>3R@WM1vSLUzV8U#bi(!NM0FuYhrAl~u&#b(xp_6i`4vu7I#_$au8gM+Q@ zxiEI1SLjT4L34BShtt=fyk!EIlS*ZeHGsJbeBD^I5T$S&ZD0SLl&<{2IeR5E*k<yVy;49}+|CQ(%nS11VC7>#cgA8f0(lTT76mH>wKag`6A zx8KSJ56R^?MWeyk^7X4D&x$Eg)9mvig?Cq#lGGn9Uwh^fKGjp;XSp8fICyJXYeOUN zRh-&dlAOqEp)EL&2#PLKo^0Vv-4zKu-`YE`lju)gWjnlS$#Of@@vahHl=taG-EQM- zUr6q9``l@er_=!3{&9e?Ut2y=hABfV8M$M=0ZHM$8ok-4lNf~k#HliCR0!6okGpBa zz4M}-0V70B-&t_7@1s0+%34f>(c4q*P|5xx8*S3YrdL{hKCydFbX6CK+`*=o^CR~h zo|Hs`)N`fA3dUa~DZT13KT1H{fBhYyK;K=fKPJbYP!WwjbBbkvf((iP8`N}Kj}OXu z@swfi(Xt80g}dmIxY3^3ul05p2$&4^Y*w|TNpyg46iqg{jK}Q+PfpsIOA09liDkOd zW`S6$unYT__rqL9&zbt&89OXy$woPit?1rsr>|}KmhsuHWGOPbwO|tXpI4|JTuP>o_cPQ&2sB&Yr%AGMbC{9jyoQ#xY4~gshochP& zRolJkL0~w`Qyo1;2!yRIu?*$mVQb2pLGa+|ToRUZ$Is7CPe3aPM%ViajyeKv?i9rn z_U~#UyO=(ikxOtm!2=qjQXi;>g(Mw3K4`j^_|7o^uWo#z#^vj^)3O6fur$DVq#+GbIH`z;pn;%e!?RHe~*f4 z&`ZYAUUuWhH2u=MJDA$4mukzMbUJ$`(q>Dj!d)BX$N-$4QC7>qdWM|yZ&jSs1O0Tm zQqe%e?h7kLYRSOdwxw1u;!iS0B6HJzXEK??3*Wzy>PE(zQdx}N04{rNdWyH&02VsT z+|2nr1ZO%z25ZXS2~c&o3vg%;_*Z6?c;H1U8fu3ihoL|4*XvxjAhBJgtIOSpLF?s> zj-~B)j=_zLD|oUVO?>@e^X8Ow;lVgQXpVKz^a~0L3-j~E!C}>!6u+5nexmY;WFCRa zUTg|s&DQX^8yHsAppyEmf^4#t-OFEft%7DMjH6pyfzK|HBAmOdF<4U%6bRZ#Z2>QUfUDPPjRgABz%s9btXWJ$?fX4h*5UuT_qK1Fl=w!d|fF^!+kv!TC>#tK%&j z_4zlRD)!{AAmHDlI()Q02|~{_d|B|!GONVVRuJVWc3F!G7m%=>_vI&}KYbz8Ym$dz zSHk_K6s_E!ymU3%uvV!Yqh$4-Ao6I(lIzPQE$4bWOi4jH=YDVvKws@()Gv=V`N?j4 ze^_2+Z|@2C&e>iBGAUDE3U@i7Bn)_Tdi468Q+&DpfceM(;W~_3x^h;D?tp%7hLYS# zP8xwKQAA>$HPkIRJDEtb38&zxq zjPn(qy)6g;Z^Dxqe2Rfva+qL*3ocv36O;w?kXCo|*UJ>=1sKgEUsO-@M`+Up-ir(< z9W+igqmPHAE%Y~qrO>EB!6ee(PtIR)XL#BrDCBt-Ug*w#sS26`_Ol33^DYo)ch^80uqwdkO803w6rYkkiq+D7E7qdP z0@B;-E1`~kZhMr6<2`F77=R%`MOfIc#@Y?b1vDqt2 zg0Xl_!j4U%#2=7geCim7!R};%n|M4k_k}f$4e8xun8at9reYJL@vvHbfloWOsG8d( zPcUV{fq;#2B4ECpud;nNmnrO|?W<7?6W|x?ysvwlF zTD03xD*sXQj&;oR6djIZ4TQ|Sj?-JOXhj!lau@kzi%+?TZ*3*lJ{z2PSvxHIr;-qW z@HLz4!-&x05;L-AKfSN7I+*FUHvMOTTo$_CJIE~yWb@IRJDLdP@>#KR>>QQPD62;# zqB1J|8Fcjn&(B*R|5%mnZ_VmP$W#u4|3lT);vuO|8k`$qlZzay1B(Mg$6vTM66$LC zOxtUo%cAnStPvSCYc-u!1I$9*kdxolLk7SUWDPyY!=~I9(y7>#Xu5Wa@V}4 z(BTwT`Qbmy+(fiLX86H2_)P0(*z?PdZGTi9uWT(1rVV}?_isb)59;yX2H?LH@JG@1 zFJktuA&EaT;Lm;Jzs~Z%JocBz{#V<=Ujg%1!2A_3|8pAk|1V!Gt?R#2x9x(aKJlKd z@-4GQymW^VEuZTow%s%ZKH=D;s?v5cP4xFn%qRPLYL5QUOWqbJk2>|JrjacO&Y6Q z$6xmy_sCL=m3FpZ&0Q_Ct%qrdeWMfT4& zRe-|l%e+h-CuNmzddooG*RY)4KGBqgZ`39QMc6ITCi{Tzzsp{zRGVh3;Ed2u$xhBO zPc^)p?+i(zdCE{1OIA_BMM$PyFMq&xp(3x853~UvJZuuXq6OX|+JG`CALAC;sU{ACpO%*w0fgn{Q;rmj2PUdz_pJZjPy7v|{(N@B}51ph|M3(8YN6?DN=t!7Y1 z8xp2(^_!nQYJGjJv;1Iiel>0dK3{Oa_NtCCAXra{AkQy-HMH&Y^$(mx_Qz_*(hyT^ zGA+_0xcb+u?_>$wk@c8vDCq$l@opJ$ceEq-#lz{!cPeT`%(SMFSGM7Fexa9b=gvM| zP@e9Yw?PewN$D+bEeYSgqmJ%hi-*}GYhupC4h#mGL(+}XK7a@=CDIJ%F;_*~Liae2 z`1lQTHSl_{d*&&oB*oKJzLJ0BULtx0g`&XqGERbIKesr!5e$`9W~QO>8b@b(Z9jE- zS@a}xXwCjjQYl`F7ZsN1@#Kr{ReFZB&IftH72{qO>4~4f6)#DiCK(9_6uM}d#z-we zgN06%!{#m9?MFFbJcCGls#P%E`SG%5Kmw#BR&7q<>M;crXR+d*zRZ0yQ_&f;xJgb6 zZFWysfVlT;gi7%}GY6xWD5{R4-O8qn@%fZkU>=Tk7GYsZEY*mMN%izV>0Ul6S6aiY zOj*ERc)BE^8s@fPnjJNro{DbdU(Maxw5^v;2vYRxD0&n38UaBSi}x1k-DGzLF{`?d zO;mN*oE(Pn?+mZ0Uu?&x`cD)L?#=a2x$^8mseK`d3aSWezcrshn!S@+UxLUZL0#D? z?)Y&NH}YtQDuQnr{w3?$!K=Z@G-w`!wkySl(FCEUEa%Fe9m{WN$9aAKJ4?*bQKEIzo7*sP7`~ zG8(?r6?qhYGb~{+gd+S%2gy;#`e$ZV7OtB}`%y-KWdCmVu%t#fkqCND>txS#h-;z` zI`%%cE1{DHZI^msDS6A8tLc-6dDSF33RoZL*8h^A=W;CM!UCL{+2U3W@7>i%u_k-VZS%<@=X)dK@jLzpAWpOpzeS7s+2oANe4Y|Bk11 z!Z(f(`d-Hxt<9y!sz;4Oj7J`=Su1OeR$8=n1A^rSDW*w8+3*i}gU7lJZpU_Og;4>^ zZ`PH*f$ZEr4TXF{wfeaJ);z^}q@y5G`Wpn_K5@os+|qz_$znzZuX_fS@kMlJ=lBmWKXAzYT znSrc_Zq(foH+Y<7`>A+XJag^VeB;5VYseZ;TGGQ&s%><)f_!{j*C799%L&3JHV|iU z{&g)`F9leRaz^np3$NabzI()wDWT9sji|D>v6l;4XDz4fn?esC<@t{kW=+^)d*o#& ztF2sjYb~|eX4FkkkKR*{O&T>%0LQHg#)9txjdT;;+N+Ic{1S7{9p|n1#Ke;wKOC`( ztCMN2OTdDHEEk`t!>-k9`M0zjp@Q}_URt?qKcliYo6NEcYW(#o{eJV5umA1-nv3H% zL>!?GbL=?BN4VfKODJM==99Wns=u*oW@7F+!m6Fmz&T>Eg|5yvi@=niZxdXIqjiK1D!#q+JkN`NqXj{&{dum=x#+;JF4(E8yK;0Vn;f zYxe)6hbNO~_@Y^;T#Sg~|1|^Td)da<5_QWr;JUX9z~q9-WvSE3s+t;7@;6R9tDjNT za8|f|jL^vMskqfM$j8^k17POj>*DPrWp>BUM^Vbi|GKA?$#r)r%e&r4PyPq~i|Xmq Vr+cECA^dRwqsyk33iX{L{sY!ntEB({ diff --git a/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0011.png b/applications/Volkov/artifacts/mame-p7/select-regression-files-only/sprinter/0011.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmeH||2NcW8^`a+Dvlgd+vxEnT1Lb?+MyL@eVMQ`qaorUBSaF0F=H^ss1b{0cC(Tp z%qS*mM5R>5cAnay$(NDHY^{Wm8s8b3LHkjsA9l~4{R5u!T)*6(^SQ74+@JURbzRpd z7w_$%rJ=6@0MPRCboT{7bvpnXj5n!3Z)%Q_P6Dur=;iL>mr_3Y665*vw4wS8_hHp_ z%WY()^}+8pa((LaszgyHSycrtxvu&D2^4c9!#vG{;rq4{vY)Uy`5`}9vt8754x)GM z4Z4{dJ;@ zvr?(FXJKi{TsOC_uC9mp;?BQIvHXyG%?a}=K<{*;PF;1iX`kko)>#gYjz>_H2u*aG>nzBRd$xU@#coAn-Let8urBoc`( zE5(|{PDyTAE~sz$*CzVHW4(3N>+!94`9v2AfR(aMY5);t@^M4&qHKwDpTR8wAj7^| zJl+6%gQ_vH&;YOQy_k3VLf=N$%Ln{YIc2W1M|ij;6mkW(Lez=5Up8hAUa=5jDkp=) zT-gX#bTZa#=195jD8`v$1K|)71%4rVX04<5$}SmI)G@le8Io1$OlL#Z*<9EHs^AnVH7Cf|mozW!?0NW! zNcsLmlRk+=f~QXZZV*GEQ1%o?MwxHohr{6l0s^9SbKP$m zp?UuGM_Myh(>l(5#hIR%*nCSM$dJt*w}rK)2qJ`qBSO|VH5p{8!1VR+Ql|+H7b{SV zj6gext5Q`})#qt{|8^v#ZZNjFu`y9LD{eKQQrdC$u1i9x}^>gwtdjnAL2V$F&~ zvyhc%M+O=~S;CRFsBa-QTj?GIFRzZyGJA9SDq(oN6aL0`#c=D~PW$+*prD|%Ny)AI z-CF?O*e6SaPiWPDJ2R7zn)?0{F?3%!*32!ANYuV{`}XatSFhfeD*tY`aL@gWNzNd0l*CVw-x_6^-pVi z?PW~K!A?kRQVT;a8-xfD8p9vG>4Ls=fFGj7WUB(WcO{BJxPHtfx@l0xXiXKJ-|Ob) z2341UH1=IYM8xy=!T?BT*nCO12Egym&dKSna5^v%oK?r?dtdhT_xBe+E7)moR@5QR z!D<^hTUlCac8+!wX&X4`u}=-~aTgtsUn`fUZQ54=Q0o~S92AQi<6qu|yDrM**+1&p zRo9ndqohwt$Ga<8=b20<$NK1mm(NONH)0HYzEm|eOr z?-BPvs34#PS6DH9T@k0T6@UG z!lDJLfDJY30RDZo2P@klPI41dVtuxT&$lk?JlK$@zCH&<&}@kQCgRs0+)ZX*JzyT7 zPQ?xhoMf@THSfK|JAL|e^ybfO@H_m!v0S(W0NM>=c>$rb{{Q-a{0}&=d~rq7oi?X? zS@mZKFEAvd1IdSpQDkZuDH7mZaA;$Mwe5a;V|X|s;%lU>eS}4{N$q1O)9PbpY7#jz z4&Wonk)$MJd@Lo&%GfJ8EZ!IwcFOp00_kKtv;jTXA`pmy{7%feVP0r&cfRYfGk*a8 CdQ7a-rEm1&`L`j4QQX?W_KtOs=)Dcl>(p5@~h9(3= zO6ceaK|l!v2qi$22!TL=0HK7GFW{7Sed}Fc`}eIiKXTX2y=ULE&vW*E_H*vJk6{*O zziivT4FCZAVt&EY5&+mF1psW2|9PY6O3pQ3Bmi(|#N6~OJUD}uiO4%>!)b<=9J-(Q zCdKY;`O8z}hld}S4k+0_utO9jzx)dM>A>#UZ$KPaF1*b238*XTL6~<72GTWNcPo9s z`aY%60d`j56?u2~><8&xa;skp__0Q;i5oX5FUsA(}Rsl9ZqVZf`@q{{&eAHM=RFly8+Q zwQu*@T^Qh?QRspiVx`r8wF7I?MAxln$By^}1aKN3|JpFq5Y z-@s>iM>m(3mm}#U)M9Brgh9e+$zsrgmCMHG)0LxT9{-A6fZ)5A@Ed=HN>aNp7ym};U(cQ%;P-A{M=I3js`A>vus58se_|?X>6^z= z7)FI@e;lR(;Z-HPH~tR!4gNo8pD-QC1jX9hHBogt`}!&&AGaO~DvBwL?^-6W(ql}R zT!zfO%5WBo(6HDrYJgJER<2Df$O^sUIfWpcv_$9ITMFOpDF8(VE37Cq@juJ9LHDRp zPCr_J?{ly1R>^hpKm+zlN;jz6;uPOuGi8Go(yYdr=Pel24q)qkncdTu&6_h%tT`~u3Uv><%nb@8 zf8yc`&*lK)?s#BhOk&fjy%0D2THn7__9FJ3MW#8W5X)pdfG=l538~&xon7^(t+;7n zb`HsG&Ey5eOkZ`*OXWm6_3lgJgLKC{CqHi|G9{vo0hv&62c>3%jHSx;pLqr4sw$lm zIYxWL)C*FFTZE!7^*Q*ZX>HukO3=AbaK(LSh#VE)U1DA*?uyRuu^aMVR985A^&1U_pxu5kx_@E62WSC01NScpIM$nk3P!1hP_k#wA(e!3)VTj zvbn_i=#o;`@2yT>#8?-g;#X`}BH9smf#Vi=JV^dy76p!}u?iJ#_+UJ$lwSsjOQ=tb zHtv1A)F8h3nEnxdU|9HD*owI_evY*z_@!m0`xOr(j)0SP9wVQ;OY4IM%ZS#)Y}l1g z+w*iw2`@vDqpRHCG4BQTNHoL9>)elQg&HGib$6gOF?_*>J^LrMJqjD%EENa6oF3k} zW_~`I_OcsuszQmQWnaSWn(AzD1amLNXW#fLCK}mp@T#CZY`|lRu=ClWE4V?YiLT0M zGD2@#%>Cf4UPwZh`(yQ)NlP^UQbhjnoCc-q`r~9lTPpd?HSAmxY#?2e))nW{5dFTw zE_x1<;uRZqMcTNvWRU#!y_lz*rxRJRGTZ1e4%5%HmY=BqG*?SgJHfh%P1ZVd1%*j?-0sv^n|z%@R7cD{o+fiCgk%`;ieUDi=m6(Y`jf z7q*>0YyKk9+$Lo4*Ou)wQp_*9G{ca&?>z-JHrCdyEPH!<;;tRChRZW(;i`+=YM;!j zd6oRK-!gqu+H5CxGjhs~_gK0J4U+;1%RG%_*F2(+C3LaXNlLt@PtI<>kYTM-msAi{ zaP4L=0k%$PL977|v!Gb&KtVx)l0}B{sVo$CVuZcU$np~C~#}cS{K8@emp-0VMk<+~? z!T$Wn8N01+fedM)b0&M2ribir^B5qZifnIhZ*+54E>t>RTFYs$)Q!|%>eg06^KH{e z(?Sf_g)J4MI0c){fLS>5j*1&Kb>#*;z_$&GO20Amt_#$X-YDSEtK*H_8W`tXA9Kv0 z*%oL@Vjnt*F|kc`CeZ}!?G}5*118AXBR--baQ)q});4QE#>pDl-KJIgxcK>%9=kX? z)Ue#7C181@S6iT{ITBjn$E-^|V~LEi<#OFAB&ZF9CLz__1tKZXlu87eaQfk?ncfmu zbmK_YWUtWY*J;&f+Q-$qKl~;}$~3UKU5LkDqUK65hr?zf=&`!f^{dm@SAUNbZ=xq0 zF>9?UE-r?mg9Uvq@e#sRQF)tkF<13m>bh9vUy=2M3%k~0|L6R{nTxk&_%{gQc6qu3 z%^Mzj1+bGm3Eqc?HM+|^dY#aG&X+G=45lkz2Z!>O*~rxtHJh9RxfYo(ykvmk!C_&m zeI+iVLvE>)6nk$Yzp>Bv@5|b*jp|*i**)SSIJ%%`W}AvPfBs^-5q%c%{bWU2kPR2o zjGyv~DP`wt0~ZhysddC{_4P*j!y1y{G`Jn$ju={co4n>)`lOutg`Rr_DeaokDP0GB zSS{Yey(jDNZB{c`=aIkKr+4oc=+@OLd~DVg$dDB^;wTNOaAJ+)R6UEE27=|T=pRVI z%4BVl?U<*4NVp*lAX>afAMWaEXKh3G(dc~+&VaSY`?~IRr*0kQ4NA^Pxi{Flm@&;P zkx9KCuB=nQ^4co~pc7_F6ZitZtd?5nh`>?VRoX~)qLTczkV;9ekZSYYRkXx*u^p^` zyv9`UfhtTkd1Nv0RJCzS%h!;&XTnw-4ie5-?0mc$giUs|gQ(Qqn34bsvO~)$oxX>d zQr}<vN4*|iyi0W zB64I$p5GHuxh1kjy}z1m1Kg%lVPofjN7-BmnZ&sHPVb8n9xg7atF6&S)uoSCat>w- zMwik%#7ZB+=~o}RXWqL>sqO$p{P!tj8A0N@7wWcYw)AHROo>N36gOZTRGCU&49 zeU&22g_|)bX|Q+NL+xQB@V3MntB5y+y^boE$N|)kH_Rkn#{`L=i*u-LZ)%)SU=N#cALa6G{jS=z~-l+L>@wjk9^K8~T zrz8ukmz3&+yEsr(fTF}P9|;dsj)(%Stpa!<(kow64&t6RJZ7dvd$iX>!4qQLk{dZE zMT$8l#Uy8o=#EGvE=+VABZuH5!_=pP`-E(5_Ps6O)iN44QT*DXFM9<%zM&3!AB1iq##i6cwdtmbkR0 zWV~6NjLHmfN{Vh;R0-YDqka#4EWU#>A)2cYj>j&EN&(c=Q(43AmH#>FGg(K4$EN zH9fqjW>a)g*CJE@#S)ihW{q$}x*>R~q*-b&r!o;tb!`FXK4r&T;SvJx zo>7(pGml+=@LJ63=0bybPc?*Ip`9~_x*ZZ_p>JI!BwyFcNTzl}>M(k7aY5pdWD#he z6bouyDIi7V*w(u{H@Xa&X?bNp?m)r_~3IdtyL|!S79`YUP@J#APBNM<~FWkdc z$Ne%)_0gAu&9gTHf@XuTfRQyRWr^&%z|U)T%*$5fSj~)M<7Ch8Q(w;*WkLEkfAj21 zM>)g!qd;_a6Qj=d?U6m5*mH|xjGSwK*(ce?M7r}PHkq0dtmu?pJfhinL*wRk5;>a0 zJr_epAlV__fJ9h*9?KRnAwJ^85~c13QKP1sNaKk_aQf$s)5a+Ter>_o-Ld8KfoYfD zS-<`*a^oX$k>*)2GE0epUlT%>;m%p3&5 z1lQ>T%#{({i-pAtn|%n2+{N*~k?Oko*)eaf0uyv{{NWAPqdOd;Z{W|1{pDc#MJCi< z-(DGcW;UMPR?|5-DXO)9d!UI!9q;W!AmLjcD33=swm8bEO9HmGm`(MVTFcXr1GK1Zq0s1>|jP_5Rg0m8o?!}Jz*82`IG3CHpI4c&IA-4irc5|^p}%Ay@f?8 zhK{D#A7aAQaT5MmZ z)8&NA7{Nkri@{PhZ~-g98YrJE?{zwGi0h+}^2bz02Z?jKt)P42<#=Dk(A+MJ)PX1o zx#8jAECIZ><5#HRWkVzX@s5RwC=l37CHZ=Ko*7Tyor(B>Y9*&`~wV57Rl|ghCcw&bDw~ zxG36LuvKoSwGJk=(^_~?=XRRm+WWrzvV1jqj@l=(Q$qG*wXL>id{dQ#{U>b1n^vgb zc$tG!MN&KW{Gsu4iel0=4?Emf(rwVN9jM8!9#$S2aSxA&KYS-+1Jc>vUaKL=@FuSq zBzUGC@8O(pr^Wn`%=v1sL&3cm&5tT?7}%4bMRqLJvdt6~b?e|+kksdt5OhNGT5tF% zkA1XCe9Y&S1G_{zKD42XuYdxl>tM)Ls;pKu#K1ta-1psseP{P$*?9OZ)A>YyE{Ob9$1c=Cm33- zt`vOlNMsNL+i9*FBYTfQoRP&PIj`t#4=BY<-E`xMxYRi_v6Tt|CDpwPX9#zh}JXCZbbbv*#B!9n|a)3px zYDLXy9^Lb+q$9rPlHInHlO=ZpRl1uRt>S+g)yN(kO|$D|#5r%ZO{L&+YN;H``rk&>A`?Ar3Ned8qc8CudD--Gv_gkZ_&<1CjZmx~sP zs$m9m`NU8a56cExrsr<k`G=Lbfuq~!%>*iG3+f>%SS?C5tQM%uNqm{WS!y-NyoZjkSl2pO3|sX z-)bMfKHg*JhzvVi+uw^w+2MxtK4_+2R5qlKpf86CaVwPg?6RvPX*=9wn#sebT~&M` z!wcpoWzR_vfyJQ@h)?$u4$zUYw5)9^%Nv@#V-PPa$X{bipAtJ6SK@!c-g)tITr~X= zHG;Bt`vV`eWw=twzuH<8kEv)Aj6Z zoC%>~X{-*qKj!omhlA(-nTJkiEdgdNz9O+>9vVFVxK}! zW+6m7Rs}U(i(C4!KDjLYt3ZDbG=FF6b30;jOp<(219F`QA-L%`yWzNd2%;giB zP*p~x4fLNzx$rpH#2xqtH)s&16|D&RA&c62NHwIR8JUsxF8cWH2N`*6o^iqrb^Jo& za9#s0s#93m3Ipp-R1yWFxkOl7Z0oI|5kg~E-z7}Iq)*B+hpk}-A0d41m2E(E5I>sJ zbK5QS%Ca?+(tF%^l)IHsMWnlcgIvr2ZYyRrT9pl! zQk~`v^3}~I4B2{}8iEkFa;ka^8(!TLWc$6EdF(!6H;(vKRj`3XqYN>Q_wQ&aY{Y~n zJFiMS6NYpJSArqr{o`^x*pZj-_s=F5NEE1-+eVkQWk~sZ>`pfCp+@N^Skimvi!a*h zTVqt<;OE`6M6tHo&@J9_rV}}gs<}kVX0Mi+3P^-K7=@7+%YeL&QAx?6^fjLz-4SrH z6+P*XQ|U%n?ic&q;M)OgP6<7=r9*FJG2qoj4G{?rNtFPNBg%;En$0iGdOTYKPnU1m zUT?x%G$armFsP_cNprB4TKN75Clgm-fDS|<1!y^7HBWhQkuD!wgY%NGh-x}=342@^ ztKx2Wt14IVjn@j)P9hXS5`a-tD``aNkcFc{3cxOkDHX3%Xf%fle|3Rb`e>5MNk|cO z+TnMQqz^sXlZ$^|a(fAsSv`vIP8iEhR#zFr`KT(6pDK1fLDLWtt99yeB!c~CqEGT( z<~bSFcER&vvEqv#o?(deqnE0ng30n*8TWUu!1ye7+NO#|Om$|pg{s-@gKuQ-Fai=K zt7Ij%6#}FCfX4KK*aUz3`-`@4?&mD;w|;kvc2c^GoPnv0cx7T;{e7+7jF*$$XLZ^y8(Fahk{_18BL|GKmPFMIgw`}_a5 z!&7@c=xpHwHyMJntmvZ;S^sla{jI!j`Ug4tx&khpy>w3gn5On=U3ul}$6RzyYU{eF z+&Y}wDr%{|-ZI3`-_;WUbM<%i^^=F)4)9Z#HxG37lE38aA#ZiZ7wILsAv)1McI;Sh T^cRT84q$%H!nDZv+Wr3kl&k!6 diff --git a/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0001.png b/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0001.png deleted file mode 100644 index 1824d88244d3adda094351cc1056c8d34c25b538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8694 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%0DJX-ukzJ4w;X74W= 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 SS#Z{InVVQ$uQs~#_&)$`88iU^ diff --git a/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0004.png b/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0004.png deleted file mode 100644 index 8176ab446657a00f631dbfce4cb5cc464a03dec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8870 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0005.png b/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0005.png deleted file mode 100644 index 1b06831570360cbcf198ca03b9b56372741b2c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8853 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 diff --git a/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0006.png b/applications/Volkov/artifacts/mame-p7/select-run/sprinter/0006.png deleted file mode 100644 index 8f9b5c2de3793f633232e26a0c6e8f7b6c93d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 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 diff --git a/applications/Volkov/artifacts/mame-p7/select/inverted.png b/applications/Volkov/artifacts/mame-p7/select/inverted.png deleted file mode 100644 index e906edd2f4e30daab4ada6a183aabe339ea2c34f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8938 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 D80aHe diff --git a/applications/Volkov/artifacts/mame-p7/select/refresh-clears.png b/applications/Volkov/artifacts/mame-p7/select/refresh-clears.png deleted file mode 100644 index 41d2986748f065fafd025774a728f6062e9ec5f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8862 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 diff --git a/applications/Volkov/artifacts/mame-p7/select/sort-keeps-selection.png b/applications/Volkov/artifacts/mame-p7/select/sort-keeps-selection.png deleted file mode 100644 index c4d88ddf5a696ea1c723b96fd9b3179271501901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9056 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 diff --git a/applications/Volkov/artifacts/mame-p7/select/virtual-entry-guard.png b/applications/Volkov/artifacts/mame-p7/select/virtual-entry-guard.png deleted file mode 100644 index 05ff151ab655295fd8667ca25fdd3442b6603824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8694 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 diff --git a/applications/SprPoP/dist/SND/snd.idx b/applications/SprPoP/dist/SND/snd.idx deleted file mode 100644 index 950900dc53d70f540c9468f8853e467eaa5c596b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmdUpy$ZrW5QOLMvU~ATMDv4zkj6p-B5Glwy@j3N3(cduN?NN_ZZSKs>^Jj#J+KLc1Jxs;@Mu|kju6iSBp9a*C^=;2?gC*YTytqu z^okyZVoOo(nJG>X#f37Z&s@qIexsrlPmzhsXf>+b!kQe-M@Fu`(F@ahW{JOge*^I$ B6mS3l diff --git a/applications/SprPoP/docs/BUGS_OPEN.md b/applications/SprPoP/docs/BUGS_OPEN.md deleted file mode 100644 index 5bd5f4a..0000000 --- a/applications/SprPoP/docs/BUGS_OPEN.md +++ /dev/null @@ -1,1484 +0,0 @@ -# SprPoP — ОТКРЫТЫЕ баги и незакрытые оптимизации - -**Здесь ТОЛЬКО незакрытое.** Всё закрытое (и, что важнее, разбор корней) -живёт в [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md) — прежде чем заводить новый баг, -грепни там по симптому. Сырые формулировки пользователя с прогонов — -[`bugs_level1.md`](bugs_level1.md) / [`bugs_level2.md`](bugs_level2.md). - -Приоритеты работ — в [`TASKS_OPEN.md`](TASKS_OPEN.md) (закрытые задачи с -протоколами — [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md)), а не здесь. Правило -проекта: механику сверять с `../SDLPoP/src/` ДО кодинга. - -**Ревизия 2026-08-11:** файл вычищен от закрытых записей (правило «в `_OPEN` -только открытое»). Уровни 1-4 приняты smoke-тестами; крупных багов нет. - -| ID | что | тип | статус | -|----|-----|-----|--------| -| [SPRITE-ZERO-W0](#sprite-zero-w0) | кадр персонажа изредка отдаёт спрайт 0x0 (залипание уже вылечено) | **редкий** | открыт: нужна трасса маппинга W0 | -| [GATE-FORE-KID](#gate-fore-kid) | Кид в проёме ворот виден поверх решётки | окклюзия | **фикс есть, ждёт проверки в MAME** (2026-08-13) | -| [FORE-DUP](#fore-dup) | передний слой тайла рисуется дважды при перекрытии объектов | оптимизация | открыт: **сначала замерить**, потом чинить | -| [TORCH-ANIM-RIGHT](#torch-anim-right) | под запечённым пламенем застывают не только челюсти чомпера | **низкий** | открыт: на уровнях 1-4 такого соседства нет | -| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | -| [BUG-SPIKE-1](#bug-spike-1) | пики залипают выдвинутыми рядом с Кидом | **низкий** | маловоспроизводим: ни сценарием, ни попиксельной подгонкой X не поднимается | -| [BUG-CHOMP-JUMP-1](#bug-chomp-jump-1) | прыжок с места вплотную к чомперу: кадр с отступом назад | **низкий** | маловоспроизводим: на повторе не поднялся; на пререлиз | -| [GRAB-KBD-TIMING](#grab-kbd-timing) | зацеп в падении срабатывает менее стабильно, чем в оригинале | **после всех уровней** | подозрение на клавиатуру ПОДТВЕРДИЛОСЬ частично: кража байт DSS устранена 2026-08-28, перепроверить | -| [GUARD-ENTRY-DEATH](#guard-entry-death) | вход в комнату вплотную к стражу = мгновенная смерть (не портирован `bump_into_opponent`) | порт | **фикс есть, ждёт проверки в MAME** | -| [BUG-SHADOW-SET](#bug-shadow-set) | Тень на 12-м уровне дерётся спрайтами СТРАЖА: SHADOW.DAT у нас нет вовсе | порт | открыт, разбор готов | -| [PAL-L1-AFTER-INTRO](#pal-l1-after-intro) | вход в игру на уровень 1 после интро — игровая палитра не установлена (чёрный экран) | палитра/fade | открыт: воспроизведение нестабильно, корень не установлен | -| [PAL-DUNGEON-STALE](#pal-dungeon-stale) | переход 3→4 (подземелье→дворец): остаётся палитра подземелья | палитра/fade | открыт: КОРЕНЬ ЯСЕН — fade_in восстанавливает из протухшего снимка | -| [BUG-CORPSE-AIR](#bug-corpse-air) | труп Кида висит в воздухе, когда убившая его плита улетела вниз | физика | открыт | -| [LOOSE-ROOM-CHANGE](#loose-room-change) | расшатанная плита не доваливается, если Кид ушёл в соседнюю комнату | порт | закрыт 2026-08-13, кроме [LOOSE-SEAM-ANIM](#loose-seam-anim) | -| [JUMP-FLOOR-LEGS](#jump-floor-legs) | в прыжке с пола ноги Кида рисуются ПОВЕРХ кромки пола, а должны за ней | окклюзия | **корень найден и починен, ждёт проверки в MAME** | -| [MOB-CLIP-RIGHT](#mob-clip-right) | окна и узор кладки рисуются ПОВЕРХ падающих плит | окклюзия | открыт: корень найден 2026-08-13 | -| [MID-OVERLAY-LAYER](#mid-overlay-layer) | оверлей кромки всегда поверх плит и персонажей (у оригинала — midtable с сортировкой) | слои | открыт: нужен разбор архитектуры | -| [GUARD-FALLOUT-VICTORY](#guard-fallout-victory) | страж, выпавший из комнаты, не засчитывается убитым | порт | открыт: две строки | -| [KBD-STUCK-WAIT](#kbd-stuck-wait) | потерянный break-код клавиши вешает игру НАСМЕРТЬ в межуровневой заставке | клавиатура/клин | **корень найден и устранён** 2026-08-28 (байты крал KEYSCAN DSS); ждёт полевой проверки | -| [L10-BUTTON-DEBRIS](#l10-button-debris) | ур.10 к.1: плита упала на кнопку (1,8) — щебень есть, а решётки закрыты | кнопки/ворота | открыт: **не воспроизводится**, проверено многое (см. разбор) | -| [LOOSE-SEAM-ANIM](#loose-seam-anim) | плита в шве (col −1), уроненная в прошлой комнате, исчезает без анимации падения | **мелкий** | открыт по решению пользователя: «пока пусть будет так» | -| [SND-PACE-DEAD](#snd-pace-dead) | пейсинг сцен по насосу CBL не включается: признак «часы идут» вычисляется двумя чтениями подряд | **тайминг/звук** | **снят 2026-08-28**: ветка удалена, сцена на единых часах по лучу | -| [PV-RENDER-BOUND](#pv-render-bound) | сцена с принцессой рисуется дороже бюджета: ~49 тиков/с вместо 60, музыка уезжает от картинки | производительность | **исправлено 2026-08-28**: кадр разложен на блоки по интервалу, удешевлять не понадобилось | -| [MUS-LEFT-TEAR](#mus-left-tear) | `pop_mus_left` (16 бит, пишет прерывание) читается из главного цикла неатомарно — возможен ложный «трек кончился» | **потенциальный** | открыт: хазард показан рассуждением, в прогоне не проявился | -| [CLIMB-VS-GUARD](#climb-vs-guard) | Кид подтягивается к стражу этажом выше: у нас удар засчитывается и убивает, в оригинале Кид просто срывается без урона; страж при этом способен провалиться сквозь пол вслед за Кидом | бой/физика | открыт: цепочка удара сверена — совпадает, расходятся входные данные; толкование звука ИСПРАВЛЕНО 2026-09-02 (звук 11 = промах, а не «любой укол») — главный подозреваемый снова ПОРОГ ДИСТАНЦИИ | -| [HP-BAR-RESTART](#hp-bar-restart) | после гибели и Ctrl+A на ОДНОЙ из двух страниц остаётся полоса HP по результатам боя | дабл-буфер/UI | КОРЕНЬ НАЙДЕН, фикс есть, ждёт проверки (2026-08-31) | - ---- - - -## L10-BUTTON-DEBRIS. Плита, упавшая на кнопку (ур.10, к.1) — щебень есть, решётки закрыты - -**Наблюдение (пользователь, 2026-08-24).** Уровень 10, комната 1: Кид стоит -на кнопке `(1,8)` и роняет на неё плиту `(0,8)`. Кнопка превращается в -щебень, но решётки, которые она открывает, остаются закрытыми. Важная деталь -из того же прогона: на 10-й уровень пришли **телепортом Shift+L**, а не -проходом. - -**Ожидаемое поведение (оно же оригинал).** Плита, севшая на opener, жмёт его -ОДИН раз с `button_type = tiles_14_debris`; у `trigger_gate` это отдельная -ветка «открыть насовсем»: `modifier >= 188` -> сразу `0xFF`, иначе возврат 2 и -`animate_door` доводит створку до `0xFF`. Ворота с `0xFF` заморожены -открытыми, обычный opener их больше не трогает. Сама кнопка съедается в -щебень. Разобрано в [BUG-LOOSE-BUTTON-1](BUGS_CLOSED.md#bug-loose-button-1). - -**НЕ ВОСПРОИЗВЕЛОСЬ** (2026-08-24, отладочный старт `make LEVEL=10 ROOM=1 -POS=18`, MAME): Кид стоит на кнопке -> решётка `(2,7)` открылась; удар головой -роняет плиту `(0,8)`; кнопка стала щебнем; **решётка осталась открытой** и -после ухода Кида с тайла. Пользователь тоже не смог повторить в этой сборке. - -**Что проверено и совпадает с оригиналом:** - -* цепочка кнопки — ровно две цели, обе в комнате 1: `(2,9)` и `(2,7)` - (`bg = 20`, терминатор цепочки — бит 0x80 в LINKLOC, как в seg007:0C09); -* `trigger_gate` построчно равен оригиналу, включая обе ветки debris; -* `add_trob` дедуплицирует по (room, tilepos) — как `find_trob` оригинала, - двойных записей на одни ворота не бывает; -* `animate_door` гасит анимацию при `modifier == 0xFF` и доводит тип 2 до - `0xFF`; -* таймеры связей в файле уровня 10 нулевые (не «jammed» 0x1F); -* `pop_dl1/pop_dl2` перечитываются из файла при каждой загрузке уровня, а - `pop_level_reset_tiles` восстанавливает LINKMAP из эталонной страницы. - -**Живые гипотезы (по убыванию правдоподобия):** - -1. **Ветка `return 2` (створка ещё не «полностью» открыта).** Визуально - решётка выглядит открытой уже при `modifier ~ 140` (проходимость считается - как `(modifier >> 2) + 6 >= высота кадра`), а мгновенный `0xFF` требует - `modifier >= 188`. То есть глазами «открыто», а по коду — ветка с - анимацией; её в MAME поймать пока не удалось. -2. **Накопленное состояние после телепорта Shift+L** через несколько уровней - (у нас уже был такой класс: [GUARD-DROPPEDOUT-CARRY](BUGS_CLOSED.md#guard-droppedout-carry)). - Отладочный старт сразу на 10-м даёт чистое состояние — и баг не всплывает. -3. Кнопка была нажата/отпущена ранее в этой же сессии, и падение пришлось на - момент, когда trob кнопки уже умер, а таймер связи ещё не истёк. - -**Как ловить в следующий раз:** как только симптом повторится — сразу -**QuickSave (F6)**, не выходя из сцены. Сохранение везёт с собой LINKMAP -(`pop_level_qsave` пишет `pop_dl1/pop_dl2`) и модификаторы комнат, то есть даёт -ровно то состояние, которое сейчас не удаётся собрать искусственно. - ---- - - -## KBD-STUCK-WAIT. Потерянный break-код вешает игру насмерть в межуровневой заставке - -> **КОРЕНЬ НАЙДЕН И УСТРАНЁН 2026-08-28.** Байты у нас крал сам DSS — см. -> раздел «Корень» ниже. Правка в `libc/irq/_irq_tramp.c`. Запись остаётся -> открытой до полевой проверки и решения по страховке-таймауту. - -## Корень (2026-08-28): скан-коды воровал KEYSCAN DSS - -Пришёл из чтения исходников DSS (`docs/sources/Estex-DSS/DSS/`, подсказка -пользователя). Обработчик прерывания DSS живёт в IM1 по `0x0038` -(`DSS-MAIN.ASM`), и его `INTx38_Handler` ПЕРВЫМ ДЕЛОМ делает `CALL KEYSCAN`, -а `KEYSCAN.RESCAN` (`KEYINTER.ASM`) вычерпывает FIFO SIO досуха. - -Наш трамплин проверял «есть ли клавиатурный байт» ОДИН раз, на входе в -прерывание, а хвост кадрового пути уходил в DSS (`jp 0x0038`). Значит -скан-код, прилетевший ПОЗЖЕ этой проверки, доставался DSS и уезжал в его -буфер — при этом **Rx-overrun не взводится**, потому что байт не потерян -железом, он просто прочитан не тем владельцем. Отсюда и загадка -исходного диагноза: бит залип, а `_kbdraw_overrun == 0`. - -**Измерено в MAME (сессия 2026-08-28, брейки + `totalcycles`):** - -| Что | Значение | -|---|---| -| окно от входа трамплина до чтения байта DSS | **738 тактов ≈ 34 мкс**, на КАЖДОМ кадровом прерывании (50/с) | -| из них пролог самого DSS (`jp 0x38` → `.Handler` → `call INTx38_Handler` → 11 `push` → `call KEYSCAN`) | 481 такт ≈ 22 мкс | -| цепочка кадровых хендлеров у SprPoP | пуста (`_irq_chain_n = 0`) — окно уже минимальное | -| расчётная частота на железе при удержании клавиши (typematic 30 Гц = 60 байт/с) | потеря байта раз в ~10 с | - -Последняя строка сходится с полевым наблюдением пользователя: залипание -стрелки ловилось на ур. 14, когда Кид долго бежит влево через несколько -комнат. - -**Пойманный случай (MAME, старая сборка).** Стоп на `IN A,($18)` внутри -`KEYSCAN` при `_kbdraw_active = 1`: DSS прочитал `A = 0x74` — make стрелки -«вправо», при том что `_kbdraw_pending = 2` (EXT), то есть префикс `E0` уже -разобрали МЫ. Посылка `E0 74` разорвана пополам между двумя владельцами -канала. Злейший подвид — кража `E0` у break'а `E0 F0 6B`: тогда мы гасим -бит в PLAIN-половине, а взведённый бит в EXT остаётся навсегда, и это ровно -залипшая стрелка `0x6B`/`0x72` из исходного разбора. - -**Правка.** Пока raw-канал открыт, кадровый путь трамплина НЕ вызывает -обработчик DSS вообще (приватный `RETI` вместо `jp 0x0038`) — окно ровно -ноль. Промежуточный вариант «проверить FIFO перед chain'ом» пробовали и -отвергли замером: он снимает лишь свою треть окна (738 → 481 такт), кражи -продолжались. Цена принятого варианта: пока открыт raw, у DSS замирает -кадровое обслуживание — опрос мыши и мигание текстового курсора (PoP не -нужно ни то, ни другое; зафиксировано в ``). - -**Проверка (MAME 2026-08-28).** До правки брейк на входе `KEYSCAN` с -условием «страница точно DSS + наш raw открыт» срабатывал мгновенно (50/с); -после правки молчит, а положительный контроль — брейк на нашем приватном -`RETI` — срабатывает сразу. ВАЖНО про методику: первый брейк без проверки -сигнатуры байтов дал ЛОЖНОЕ срабатывание — в W0 периодически лежит -драйверная страница DSS, и по адресу `0x0570` там своя команда. - -**Что осталось открытым.** Кража устранена, но потерять break всё ещё -может настоящий Rx-overrun SIO (редкий: FIFO вычерпывает `kbd_raw_poll` из -главного цикла). Значит вариант A из таблицы ниже — таймаут в циклах -«ждём отпускания всех клавиш» — остаётся разумной страховкой от КЛАССА -отказа «вечный клин», и его стоит сделать отдельно. - -## Исходный разбор (2026-08-24) - -**Наблюдение (пользователь, 2026-08-24).** Нажат Shift+L (чит «следующий -уровень») — игра встала намертво: картинка прежнего уровня, реакции нет. - -**Диагноз (снят в живой сессии MAME).** Программа НЕ рухнула и не потеряла -кадровые прерывания — IRQ приходили штатно (вход по вектору виден в -`history`). Стояли в `pop_pre_cutscene_show` (pop_intro.c:949), в его первом -цикле: - -```c -while (kbd_raw_any_down()) { kbd_raw_sync(); gfx_wait_vsync(); } -``` - -Цикл намеренный: клавиша, которой закончили уровень (тот самый Shift+L), не -должна тут же сойти за «пропустить заставку». Внутри — `gfx_wait_vsync` -(опрос бита 5 порта #FE), он отрабатывал нормально; не выходил ВНЕШНИЙ цикл. - -Причина — залипший бит в `_kbdraw_down[]`: код `0x72` в PLAIN-половине карты -(то есть **keypad 2**; стрелка Down — это `E0 72` и живёт в EXT-половине, -байт 46). Состояние на момент разбора: `_kbdraw_active = 1`, -`_kbdraw_pending = 0`, `_kbdraw_overrun = 0` — то есть штатная страховка по -Rx-overrun не срабатывала. Гашение бита отладчиком (`_kbdraw_down[14] = 0`) -сразу вернуло игру к жизни: заставка прошла, уровень 2 загрузился. - -**Чем бит может залипнуть** (разбор `libc/irq/_irq_tramp.c`): - -1. **Потерянный break при переполнении FIFO SIO.** Приёмник глубиной 3 - байта; когда прерывания запрещены надолго (загрузка уровня через ESTEX — - ровно момент Shift+L), пачка `F0 code` не помещается. Защита есть - (чтение RR1 → `_kbdraw_overrun` → `kbd_raw_sync()` снимает held), но она - срабатывает, только если SIO успел выставить сам бит overrun. -2. **Разъехавшийся префиксный автомат.** `F0` (break) и `E0` (ext) — отдельные - байты, состояние копится в `_kbdraw_pending`; любой сброс между префиксом - и кодом переворачивает смысл, и break декодируется как MAKE. Ветка - «fake shift» (`E0 12` / `E0 59`) делает это по построению — она гасит - `pending` и пишет код как make даже у break-формы. -3. **Make и break у разных владельцев канала.** Пока `_kbdraw_active == 0`, - байты уходят DSS. Клавиша, нажатая до `kbd_raw_open()` (или в момент - close/open), даёт make одному владельцу, а break — другому: снимать - нечего, бит остаётся. -4. **Держащий вход эмулятора.** `set_input ... frames=0` из MCP-моста держит - клавишу нажатой, typematic шлёт make повторно (наблюдалось: погашенный - отладчиком бит возвращался). Это артефакт отладки, а не игры, но именно - он мог создать исходное состояние в этой сессии. - -**Варианты решения.** - -| Вариант | За | Против | -|---------|----|--------| -| **A. Таймаут в циклах ожидания** (ждать отпускания не дольше ~1 с, дальше идти) | Дёшево, локально; снимает КЛАСС отказа «вечный клин» независимо от причины; заставка от лишней секунды не страдает | Лечит симптом, а не причину: залипшая клавиша дальше продолжит «нажиматься» в gameplay | -| **B. Анти-залипание в `kbd_raw`** (гасить биты, которые давно не подтверждались typematic-повтором) | Чинит класс причин целиком, помогает и в gameplay | **Модификаторы typematic НЕ повторяют** (обжигались: `kbd_overrun_wipe_modifiers`) — значит Shift/Ctrl гасить нельзя, нужен список исключений; плюс хранение «свежести» на 512 кодов дорого, придётся огрублять | -| **C. Ужесточить страховку по overrun** (чистить held не только по биту RR1, но и по «подозрительным» ситуациям: длинный DI, возврат из загрузки) | Бьёт по самой вероятной причине (1); дёшево по памяти | Эвристика: можно снять РЕАЛЬНО зажатую клавишу (Кид перестанет бежать посреди разбега) | -| **D. Ничего, считать артефактом отладки** | Ноль работы | Если это не мост, а SIO, то на железе получаем намертво зависшую игру — худший класс отказа | - -**Если возвращаться — начинать с точной причины:** лог байтов SIO в -трамплине (кольцо на 32-64 байта + дамп по клавише) и повтор сценария -«Shift+L во время дисковой загрузки». Без этого выбор между B и C — гадание. - -**Смежное:** `kbd_raw_fifo_drain`, `kbd_overrun_wipe_modifiers` в memory — -там уже закрытые случаи залипания того же битмапа. - ---- - - -## GRAB-KBD-TIMING. Зацеп в падении срабатывает НЕ ТАК СТАБИЛЬНО, как в оригинале — РАЗБОР ПОСЛЕ ВСЕХ УРОВНЕЙ - -> **Решение пользователя (2026-08-12): отложено до готовности всех уровней.** -> Механика работает, это вопрос ощущения, а не проходимости. - -> **Обновление 2026-08-28.** Гипотеза «дело в клавиатурном модуле, а не в -> физике» подтвердилась ЧАСТИЧНО: найдена и устранена кража скан-кодов -> обработчиком DSS (разбор — [KBD-STUCK-WAIT](#kbd-stuck-wait)). Украденный -> make Shift'а или стрелки — это ровно «нажал, а не сработало», и на -> железе при удержании клавиши такое случалось раз в ~10 с. Перепроверить -> ощущение зацепа на новой сборке ДО того, как лезть в физику. - -**Наблюдение (пользователь).** Вход на уровень 7: Кид влетает в комнату сверху -и, пролетая мимо края пола, МОЖЕТ за него зацепиться — но получается заметно -реже, чем в оригинале. «Похоже, это проблемы нашего клавиатурного модуля». - -**Что уже сделано и почему это НЕ закрывает вопрос.** В ходе разбора -[GRAB-BELOW-ROOM](BUGS_CLOSED.md#grab-below-room) восстановлена ветка -`ACT_MIDAIR` в `check_action` (кадры 102..105 — начало падения, где `fall_y` ещё -не разогнан): раньше на этих четырёх кадрах `check_grab` не звался вовсе, то -есть окно зацепа было короче оригинального. Это должно было добавить -стабильности, но саму гипотезу про клавиатуру не проверяет. - -**Куда смотреть, когда дойдут руки.** Порядок именно такой — сначала -измерить, потом чинить: - -1. Снять, ЧТО видит движок в момент падения: `pop_ctrl_shift_held()` покадрово - (Shift зажат заранее — читается ли он каждый кадр, или FIFO SIO отдаёт - состояние с пропусками; см. memory `kbd_raw_fifo_drain`, - `kbd_overrun_wipe_modifiers` — оба прошлых бага были именно про модификаторы). -2. Сверить с оригиналом ширину окна по кадрам: у нас `check_grab` доступен на - 102..105 (midair) + весь `ACT_FREEFALL`, как в seg006 — расхождений в коде - быть не должно, значит расхождение либо во вводе, либо в темпе игры - ([L1-SPEED](TASKS_OPEN.md#l1-speed): игра идёт на ~39 % быстрее оригинала, - а окно зацепа отмеряется В КАДРАХ — то есть по времени оно у нас короче). -3. Хост-тест `t_grab.c` уже умеет мерить ширину окна (карта исходов по фазе X и - задержке нажатия) — на нём и проверять «стало стабильнее». - -### Протокол замера (написан 2026-08-12, чтобы следующий заход начался с фактов) - -Пользователь связывает с этим же и «двойные срабатывания не вовремя». Прежде -чем трогать драйвер — доказать, что он вообще виноват: **сегодняшний случай -«Кид ходит как с зажатым Shift» оказался артефактом MCP-моста, а не драйвера** -(`pause` освободил 6 незакрытых входов, которые плагин переустанавливал каждый -кадр; как только они отпустились, драйвер снял бит сам). То есть break-коды -драйвер обрабатывает верно, и ложная тревога здесь стоила часа. - -Что мерить: - -1. **Поток скан-кодов**: кольцевой лог в трамплине прерывания - (`libc/irq/_irq_tramp.c` / `kbd_raw_poll.c`) — байт кода, флаг make/break, - номер кадра. Читать из MAME по адресу буфера (`mem`), как читаем `_Kid`. -2. **Что увидел движок**: `pop_ctrl_shift_held()` и битмап `_kbdraw_down` - (адрес — из `.map`, для SprPoP 0xAEF9) на тех же кадрах. Расхождение - «код пришёл, а движок не увидел» = потеря в драйвере; «кода не было, а бит - стоит» = потеря break (то, что подозревает пользователь). -3. **Сцены**: бег с отпусканием, разворот, вис + отпускание Shift, падение с - зажатым заранее Shift (вход на уровень 7), быстрое повторное нажатие - (проверка «двойного срабатывания» — typematic, см. memory - `kbd_overrun_wipe_modifiers`). - -Что считать нормой: каждому make ровно один break; между make и видимым -`kbd_raw_down()` — не больше кадра; при удержании typematic-повторы НЕ должны -доходить до `pop_ctrl` как новые нажатия (диспетчер ждёт фронт). - -Отдельная гипотеза, которую замер тоже закроет: окно зацепа отмеряется В -КАДРАХ, а игра идёт на ~39 % быстрее оригинала ([L1-SPEED](TASKS_OPEN.md#l1-speed)) -— тогда «менее стабильно» это не клавиатура, а темп, и чинить надо темп. - ---- - - -# С приёмки уровня 2 (2026-08-07) - -Всё найденное тем прогоном закрыто, кроме двух записей ниже -(`BUG-SPIKE-1` — уровень 2, комната 6). Карта содержимого уровня 2 (что где -стоит по `res2002.bin`, какие кнопки какие ворота открывают) — в -[`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#l2-pass), по ней видно, «механика не -сработала» это или «так и задумано». - - -## BUG-SPIKE-1. Пики залипают выдвинутыми — НИЗКИЙ ПРИОРИТЕТ, МАЛОВОСПРОИЗВОДИМ - -> **Статус 2026-08-05, вечер.** Пользователь **повторить не смог**, а замер -> (ниже) показал, что чистый пробег по убранным пикам убивает штатно. То -> есть в смертельности бага, похоже, нет вовсе: наблюдался частный случай — -> пики, УЖЕ выдвинутые полностью (h = 1), для бегущего безвредны и в -> оригинале. Запись оставлена открытой ровно из-за визуального расхождения -> со скриншотом SDLPoP (у нас острия торчат, у него убраны) — см. конец. -> -> **Как получить состояние нарочно:** подойти к пикам вплотную (выдвинутся), -> отступить на полшага, НЕ выходя из зоны срабатывания, и пробежать по ним. -> Пользователь пробовал и это, и попиксельную подгонку X читом `[`/`]` — -> не поднялось. Вывод для будущего разбора: состояние **не чисто -> позиционное**, одной шириной габарита его не объяснить; следующий -> подозреваемый — момент, в который `process_trobs` застаёт модификатор -> относительно кадра Кида. - -**Наблюдение (пользователь, 2026-08-05).** Уровень 2, комната 6, пики (1,3): - -| действие | что происходит | -|----------|----------------| -| длинный прыжок с ряда 0 на пики | **смерть — правильно** (путь `fell_on_spikes`) | -| пробег по ряду 1 прямо по пикам | **урона нет** | -| после уборки пик | **на экране остаются белые остатки остриёв** (в оригинале чисто) | -| прыжок на месте, стоя на пиках | урона нет | -| просто стоять на выдвинутых пиках | можно сколько угодно | - -**Замер (MAME, чтение `room_modif` комнаты 6).** Пока Кид стоит на тайле, -модификатор пики (индекс 13) = **0x8E**, то есть «пики ПОЛНОСТЬЮ вышли и -идёт обратный отсчёт». Дальше вся арифметика сходится с оригиналом: - -``` -is_spike_harmful (seg007:1178): 0/-1 → 0; <0 → 1; 1..4 → 2; >=5 → 0 -check_spiked (seg006:0658): убивает при h>=2 на кадрах бега 7..14 - и при h!=0 на кадрах приземления 43/26 -``` - -То есть **при h = 1 (пики уже вышли) бегущий не гибнет и в оригинале** — -смертельно только окно ВЫДВИЖЕНИЯ (модификатор 1..4, h = 2). Наши -`animate_spike`, `start_anim_spike`, `is_spike_harmful`, `check_spiked` -сверены с seg006/seg007 построчно и совпадают дословно. - -**ВТОРОЕ НАБЛЮДЕНИЕ (то же место, сравнение с оригиналом).** Кид уронил -плиту-потолок и спрыгнул вниз; пики выдвинулись и «спрятались не все — часть -артефактов осталась». Скриншоты рядом: -[наш](bugscreens/l2-r6-spikes-ours.png) и -[SDLPoP](bugscreens/l2-r6-spikes-sdlpop.png) в той же позе. У нас из-под -щебня торчат белые острия, у оригинала пик не видно ВООБЩЕ. - -**ГИПОТЕЗА «ТРИГГЕР СРАБАТЫВАЕТ РАНО» ПРОВЕРЕНА И ОПРОВЕРГНУТА (замер -2026-08-05, MAME, watchpoint на `room_modif[13]` комнаты 6).** Чистый -пробег по УБРАННЫМ пикам убивает штатно: - -``` -запись modif=1 : кадр 11 (беговой), x=112, curr_col=2 ← пики пошли вверх -запись modif=2 : кадр 12 (беговой), x=117, curr_col=3 ← Кид уже НА тайле, h=2 -запись modif=3 : кадр 177 (frame_177_spiked) ← напоролся -``` - -То есть `check_spike_below`, `check_spiked`, `is_spike_harmful` и тайминг -выдвижения работают правильно, и «раннего» триггера нет. - -**Настоящий корень — пики ЗАЛИПАЮТ выдвинутыми.** Пока габарит Кида -накрывает колонку пики, `check_spike_below` каждый кадр зовёт -`start_anim_spike`, а тот при отрицательном модификаторе переставляет его -обратно в 0x8F — отсчёт до уборки не доходит. А выдвинутые пики (h = 1) -для бегущего БЕЗВРЕДНЫ по правилам оригинала. Отсюда обе жалобы: пробег -по уже вышедшим пикам не убивает, и они же остаются торчать на экране. - -**Что осталось выяснить (и это единственный открытый вопрос).** Код -`start_anim_spike` у нас с оригиналом совпадает дословно, значит оригинал -тоже удерживал бы пики, стой Кид там же. На скриншоте SDLPoP в похожей -позе пики УБРАНЫ — то есть его Кид стоит чуть левее и его габарит колонку -пики уже не задевает. Разница в 2–3 пикселя посадки, а у нас такие -расхождения по X уже ловились (см. заметку в BUG-GRAB-1: после касания -площадки SDLPoP уводит Кида на 134, мы — на 141). - -**Как закрывать:** инструментировать SDLPoP (печать `char_x_left/right`, -`left/right_checked_col` и модификатора пики каждый кадр), проиграть ту же -сцену — падение плиты-потолка в комнате 6 и остановку на щебне — и сверить -с нашей трассой ПОЗИЦИЮ КИДА после приземления. Если позиции совпадут, а -диапазоны колонок разойдутся — виноват габарит (`kid_fp` против -`set_char_collision` текущего кадра); если разойдутся позиции — это отдельный -баг посадки, а пики — его следствие. - ---- - - - ---- - -# Оптимизация отрисовки (записано 2026-07-29) - -Не баги — план работ. Оба пункта про одно: у оригинала пометка тайла к -перерисовке стоит копейки (бит в таблице, которая всё равно чистится каждый -кадр), а у нас каждая такая пометка превращается в реальный heal (копию из -ОЗУ-копии акселератора) плюс блиты. Поэтому буквальный порт «перерисовываем -безусловно» корректен, но дорог. - - -## T-1. Пики: перерисовывать по причине, а не безусловно - -**Сейчас:** `pop_process_trobs` зовёт `pop_spike_redraw` каждый кадр для -каждой живой пики в комнате (порт `redraw_21h`, который `animate_spike` -вызывает вне всяких `if`). Это корректно, но лишнее для пик, до которых -Киду дела нет. - -**Надо:** перерисовывать тайл пики, только если -1. **сменился её видимый кадр** (шаг выдвижения/уборки), ЛИБО -2. **её кто-то стёр** — а стереть у нас может только heal, то есть тайл - попал в прямоугольник `kid_heal` этого кадра. - -Это и есть модель оригинала, просто выраженная флагами: `redraw_at_char` -(seg003:0576) каждый кадр помечает `set_redraw_fore` тайлы персонажа, причём -**объединение текущего и предыдущего** прямоугольника -(`MIN(char_top_row, prev_char_top_row)` и т.д.), а `animate_spike` помечает -свой тайл. Итог = {тайл сменил кадр} ∪ {тайлы Кида}. - -**Как:** слой Кида и так считает `cL..cR`/`rT..rB` в `pop_fore_over_kid` — -пусть публикует их (плюс предыдущие, как в оригинале), а цикл trob'ов -сравнивает `tilepos` с диапазоном целочисленно. Никаких пересечений -прямоугольников (см. память `manual_hints_over_auto_detect`). - -**Приоритет:** отдаётся почти бесплатно ПОСЛЕ T-2, отдельно не окупается. - - - ---- - - - -## BUG-CHOMP-JUMP-1. Прыжок с места вплотную к чомперу: кадр с отступом назад — НИЗКИЙ ПРИОРИТЕТ, МАЛОВОСПРОИЗВОДИМ - -> **Статус 2026-08-08.** Наблюдение пользователя на приёмке L3-CHOMP: Кид -> стоит вплотную СЛЕВА от чомпера лицом вправо, прыжок с места — в анимации -> проскакивает кадр, где он «чуть отступил назад», и только потом идёт -> прыжок. В оригинале прыжок идёт прямо с места. **На повторе в тот же -> заход не воспроизвёлся** — отложено до пререлиза. - -**Что уже установлено (чтобы не разбирать заново).** - -1. **Это НЕ анимация.** `seq_3_standing_jump` (SDLPoP `seqtbl.c:382`) - состоит только из положительных смещений: - `act(run_jump), f16, f17, dx(2) f18…f22, dx(7) f23, dx(9) f24, dx(5) dy(-6) f25`. - Ни одного отрицательного `dx` — отката в последовательности нет вовсе. - Значит отступ даёт `bumped()`, то есть физика посчитала въезд в - препятствие и выровняла `Char.x` назад. - -2. **`is_obstacle` для чомпера у нас совпадает с оригиналом** (seg004:037E): - препятствие только при `modif == 2`, причём именно `== 2`, БЕЗ маски - `0x7F` — то есть окровавленный чомпер (`0x82`) в ванили не бампит вовсе. - Проверено, расхождения нет. - -3. **Прямая трасса прыжка отката НЕ показала.** Ввод «UP и RIGHT - одновременно» (mame bridge, `key UP 24` + `key RIGHT 24`) даёт чистое - движение вперёд: `x` 148 -> 155, кадр становится 178 (перемололо). Ни - одного кадра с уменьшением `x`. - -**Главная гипотеза — ПОРЯДОК НАЖАТИЙ.** Если ↑ приходит на кадр раньше →, -то `control_standing` уходит не в `standing_jump()`, а в `up_pressed()` — -вертикальный прыжок с зацепом, а он **выравнивает `Char.x`**. Отсюда и -«отступил, потом прыгнул». Проверять надо `check_jump_up` / -`jump_up_or_grab` / `grab_up_no_floor_behind` (seg005:0836 и далее), а не -прыжок с места. Внимание на `can_climb_up` (seg005:0828): там у чомпера -ЕСТЬ спецкейс (`seq_73_climb_up_to_closed_gate` при взгляде ВПРАВО) — он у -нас портирован (`pop_map.c`, ветка `TILE_MIRROR || TILE_CHOMPER`), но именно -вокруг него и стоит копать. - -**Как ловить.** Брейкпоинт на резидентном `_kid_tick` с -`{printf "f=%d x=%d act=%d col=%d",b@Kid+0,b@Kid+1,b@Kid+6,b@Kid+4; g}` — -одна строка на кадр, адрес `_Kid` из `.sprinter-cc-build/.sprinter-cc-sprpop/sprpop.map` -(после КАЖДОЙ пересборки другой). Плюс стоп-кадр `1` в момент отступа и -чтение `Kid` из памяти. Метод — memory `z80_profiling_method`. - ---- - -## Заметки (отладка) - -- Тестовые клавиши осторожного шага: **J** = шаг влево, **L** = шаг вправо - (эмуляция Shift+стрелка), см. `pop_ctrl.c` `KBD_DBG_STEP*`. Первый шаг в - сторону = разворот (как в оригинале safe_step), движение со второго. -- Читы (`pop_cheat.h`): **K** — убить стража, **I** — бессмертие (toggle), - **S** — выдать меч, **Shift+L** — следующий уровень, **`[`/`]`** — сдвиг - Кида на пиксель по X. -- Респавн после смерти — по **↑** (или авто через `RESPAWN_DELAY`); ставит - Kid в стартовую позицию УРОВНЯ (`pop_start_level`, порт do_startpos). -- **ROOMNAV (`=`/`-`) — тоже наш чит**, которого в оригинале не было, как и - `S`. Все они со временем съедутся в общий блок читов, разрешаемый в - настройках; пока просто включены (`pop_cheats = 1` в `sprpop.c`). - Известный баг этого чита закрыт — [BUG-CHEAT-FIGHT-1](BUGS_CLOSED.md#bug-cheat-fight-1). -- Комнаты **13, 18, 24 уровня 1 недостижимы** в обычной игре — это свойство - данных уровня (разбор — «НЕ БАГИ» в [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md)); - приоритет багов в них низкий. Аналогично 23/24 на уровне 3. - - ---- - - -## TORCH-ANIM-RIGHT. Под пламенем могут застыть не только челюсти чомпера - -Открыто 2026-08-10 при закрытии -[BUG-TORCH-CHOMP-2](BUGS_CLOSED.md). - -Пламя факела запекается в фон и рисуется в ячейке ПРАВОГО СОСЕДА. Оригинал -после каждого кадра факела метит этого соседа (`set_redraw_anim_right`, -seg007:0101) и перерисовывает весь его слой `anim` поверх огня; мы метим -только когда сосед — чомпер. Слой `draw_tile_anim` (seg008:0644) рисует -также **пики, зелье и меч** — если такой тайл окажется справа от факела и -будет в статике, пламя накроет и его. - -На уровнях 1–4 такого соседства не встретилось, поэтому расширять пометку -(она стоит перерисовки тайла каждый кадр на каждый факел) заранее не стали. - -**Как проверять:** поставить факел слева от пики/меча/зелья в тестовой -комнате и дождаться статики; либо пройти уровни 5+ и смотреть на клетку -справа от каждого факела. - -**Как чинить, если встретится:** там же, в ветке факела `pop_process_trobs`, -добавить в `trob_rcode`-проверку нужные коды и соответствующий вид пометки -(`POP_RD_SPIKE` / `POP_RD_FLOOR`), а зелье — переставить в порядке обхода -так, чтобы оно рисовалось ПОСЛЕ факела. - ---- - - -## FORE-DUP. Передний слой тайла рисуется ДВАЖДЫ при перекрытии объектов - -Найдено пользователем 2026-08-10 (вопросом, а не по симптому — картинка -верная, страдают только такты). - -**У нас.** Fore-проход зовёт КАЖДЫЙ рисующий по своему прямоугольнику: -`pop_char_fore` для слотов Кида и соперника, `pop_mirror_draw` для отражения. -Окно клипа (`pop_fore_set_clip`) у каждого своё. Если футпринты двух -объектов накрывают один тайл, его передний кусок рисуется два раза. - -Когда случается: -- **Кид и отражение** — ВСЕГДА (стоят на одном тайле зеркала); этот случай - создан фиксом fore-прохода над отражением 2026-08-10; -- **Кид и соперник в одном тайле** — то есть весь ближний бой; -- Кид и падающий кусок плиты. - -**Картинку не портит:** куски переднего слоя идут прозрачным блитом-копией, -операция идемпотентная. Портило бы при XOR/mono с накоплением — таких в -fore-слое нет. - -**Такты тратит,** и в самом дорогом месте: fore-проход исторически самая -тяжёлая часть кадра (memory `pop_fore_layer_cost` — было 78 % кадра, окно -клипа и кэш кладки дали 3.2×). - -**Как устроено в оригинале — дубль НЕВОЗМОЖЕН по построению.** -`redraw_at_char` (seg003:0427) ничего не рисует, а только помечает тайлы -своего прямоугольника: - -```c -for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row) - for (tile_col = x_col_left; tile_col <= x_col_right; ++tile_col) - set_redraw_fore(get_tilepos(tile_col, tile_row), 1); -``` - -а `set_redraw_fore` (seg007:0550) — это `redraw_frames_fore[tilepos] = frames`, -ПРИСВАИВАНИЕ. Два персонажа на одном тайле оставят там ту же единицу, и -единственный обход тайлов нарисует передний кусок один раз. - -**Что делать.** Механизм пометок у нас уже есть и прямо назван портом этой -архитектуры — `pop_redraw.h`. Fore-слой остался единственным местом на -прямом вызове. Приведение к оригиналу: `pop_char_fore`/`pop_mirror_draw` -вместо прохода ставят пометки, а один проход в конце кадра их разбирает. - -**СНАЧАЛА ЗАМЕРИТЬ, потом чинить.** Это самый горячий путь, и окно клипа -(вместо перебора тайлов) в своё время дало 3.2× — переход на пометки может -часть этого вернуть назад. Замер: брейкпоинт на листьях fore-слоя со -счётчиком, сцена «бой в комнате 3 уровня 1» и «Кид на тайле зеркала, -ур. 4»; сравнить число нарисованных кусков с числом уникальных тайлов. -Если дубль мал — оставить как есть и закрыть запись. - ---- - ---- - - -## SPRITE-ZERO-W0. Кадр персонажа изредка отдаёт спрайт 0x0 — РЕДКИЙ - -Всплыло при разборе [BUG-CHAR-STALE-PAGE](BUGS_CLOSED.md#bug-char-stale-page) -(тень застыла на двух страницах в разных позах). Залипание слота вылечено — -`cd_sig_make` больше не берёт снимок, если кадр не рисовали, — но САМА -причина нулевого спрайта не найдена: `atlas_image` для валидного кадра -изредка отдаёт запись 0x0. - -Подозрение: конкуренция за окно W0. `pop_char_draw` маппит страницу атласа -(`gfx_w0_map(pages[page].page)`) и держит её до `gfx_w0_unmap()` в конце, а -внутри этого окна успевают отработать `cd_splash` и `pop_sword_draw`; рядом -в кадре W0 маппят чтение данных уровня (`pop_level_tile`, `pop_level_set_tile`) -и mob-тик. Если какой-то путь размапливает окно раньше времени, чтение -заголовка спрайта даст нули. - -Как ловить: watchpoint на порт окна 0 либо счётчик «w==0 при непустом кадре» -в `pop_char_draw` с записью кадра/страницы/idx в отладочную ячейку, дальше -читать её из MAME. Симптом редкий (пользователь поймал дважды). - - -## GATE-FORE-KID. Кид, стоящий В ПРОЁМЕ ворот, виден ПОВЕРХ решётки — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -> **Портировано 2026-08-13** (повтор нашёлся на уровне 10, комната 7, тайл -> (2,6) — подтверждено чтением памяти MAME: `Kid.room=7, curr_row=2, -> curr_col=6`, код тайла `0x04`). Сделано так: -> -> * **решение** — `pop_gate_over_char(ch)` в `pop_map.c`: персонаж стоит на -> тайле ворот текущей комнаты (колонки 0..8; девятая отсекается, там бары -> легли бы в соседнюю комнату — у оригинала это `Kid.room != room_R`); -> * **отрисовка** — `draw_gate_fore` в `pop_bg.c`, точный порт seg008:1153: -> только прозрачные куски 51 + ломти 52, без непрозрачного 50 и без -> хвостового `DOOR_FRAM_SLICE` (фон под барами уже нарисован). Зовётся -> ОДИН раз на персонажа за кадр, не в тайловом цикле; -> * **тесты** — `tests-host/t_char.c`: `char_gate_covers_char_standing_in_it`, -> `char_gate_ignores_neighbour_tiles`, `char_gate_ignores_other_room`, -> `char_gate_never_in_last_column`. Отрисовка в харнесс не линкуется, -> поэтому проверяется именно решение — ради этого оно и вынесено в карту. -> -> Расхождение с оригиналом (осознанное, в `docs/impl_diff.md`): оригинал -> спрашивает жёстко про `Kid`, потому что foretable у него одна на проход -> тайлов; у нас fore-проход идёт по персонажу, поэтому спрашиваем про того, -> кого рисуем — страж в проёме тоже уходит за решётку. -> -> Шовный случай (ворота у СОСЕДА слева) работал и раньше — он ниже. -> Банк 2 +601 Б, банк 3 +92 Б, резидент не изменился. - -Нашёл пользователь 2026-08-11 (уровень 5, комната 24, верхние ворота): -Кид стоит на тайле ворот, а решётка рисуется ПОД ним — он виден целиком, -хотя должен быть за прутьями. - -**Как в оригинале.** `draw_tile_fore` (seg008:0D15) первой же строкой: - -```c -if (tile_left == tiles_4_gate && Kid.curr_row == drawn_row && - Kid.curr_col == drawn_col - 1 && Kid.room != room_R) { - draw_gate_fore(); -} -``` - -то есть когда Кид стоит ИМЕННО на тайле ворот, их решётка дорисовывается -в **foretable** — поверх персонажа: `draw_gate_fore` (seg008) кладёт спрайт -51 (низ решётки) и дальше вверх кусками по 8 px спрайтом 52, до -`gate_top_y`, прозрачным блитом. - -**Что есть у нас.** Портирован только ШОВНЫЙ случай (`pop_bg.c`, -`pop_fore_over_char`): если футпринт зашёл за левый шов и у соседа слева в -этом ряду ворота — их бары перерисовываются поверх персонажа через -`draw_gate_back`. Случая «ворота ВНУТРИ комнаты, персонаж на их тайле» -нет вовсе, отсюда симптом. - -**Почему не чинится одной строкой.** Правка идёт в `pop_fore_over_char` — -самый горячий путь кадра (memory `pop_fore_layer_cost`: когда-то 78 % -кадра, окно клипа дало 3.2×). Добавлять проверку надо так, чтобы она не -стоила ничего на каждом тайле футпринта: условие дешёвое (`тайл под -персонажем == ворота`), но рисование — это ещё один блит на кадр, пока -Кид стоит в проёме. Плюс нужен свой расчёт полосы (`gate_top_y` по -живому openness), а не готовый `draw_gate_back`, который рисует ЗА -персонажем. - -**Проверять:** уровень 5, комната 24 — встать в проём верхних ворот -(колонка 1 ряда 0) при частично поднятой решётке; прутья должны -перекрывать Кида. Тот же случай — любые ворота на уровнях 1-3. - ---- - - -## GUARD-ENTRY-DEATH. Вход в комнату со стражем вплотную = мгновенная смерть — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -**Наблюдение (пользователь, 2026-08-13).** В некоторых ситуациях (особенно -после телепортов) Кид, входя в комнату, сразу оказывается чуть ли не в одном -тайле со стражем и немедленно погибает: меч ещё в ножнах, а безоружному любой -укол смертелен. - -**Что в оригинале.** Стража при входе НЕ отбрасывает — проверено по SDLPoP: -`enter_guard` (seg002:0112) ставит его ровно в тайл из данных уровня -(`Char.x = level.guards_x[room-1]`), никаких проверок дистанции до Кида нет. -Ситуация «вошёл вплотную» возможна и там. Защит четыре: - -1. **`bump_into_opponent` (seg003:08AA)** — главная. Безоружный Кид - (`Char.sword == sword_0_sheathed`) при вооружённом сопернике - (`Opp.sword != sheathed`, `Opp.action < 2`), лицом к лицу - (`Char.direction != Opp.direction`) и `can_guard_see_kid >= 2`, на - `ABS(char_opp_dist()) <= 15` не получает укол, а ОТСКАКИВАЕТ: `Char.y` - прижимается к полу, `fall_y = 0`, `seq_47_bump`. -2. Кид сам достаёт меч — `control_standing` (seg005:0351). -3. Страж поднимается в стойке покоя с мечом в ножнах — `seq_77`, ему нужно - сперва заметить Кида (`autocontrol_guard_inactive` → `move_down_forw`). -4. Вплотную страж не колет: `autocontrol_guard_active` при `distance < 12` - (или `< 8` с убранным мечом) разворачивается/шагает, а `check_hurting` - требует `min_hurt_range = 8` для безоружного противника. - -**Корень у нас.** Пункты 2-4 были портированы верно (`pop_ctrl.c:288`, -`pop_guard_cold.c:107`, `guards.c:553`), а **пункт 1 не портирован вовсе**: -в `kid_phys` (`pop_map.c`) между `determine_col()` и `check_collisions()` -было пусто, тогда как `play_kid_frame` (seg000:1238) зовёт там -`bump_into_opponent`. Без отскока дистанция успевает вырасти в рабочий -диапазон удара 8..29 — и первый же `move_6_shift` стража даёт -`hurt_by_sword` с `take_hp(100)`. - -**Сделано.** `bump_into_opponent` портирован в `pop_map.c` (рядом с -`bumped_floor`) и вызывается из `kid_phys` на штатном месте. Резидент не -вырос, банк 3: 11066 → 11156 Б. Опциональные фиксы SDLPoP -(`fix_painless_fall_on_guard`, `fix_jumping_over_guard`) намеренно НЕ -портированы — оставлено базовое поведение движка 1989 года. - -**Проверять:** войти в комнату со стражем вплотную (телепортом `+`/`−` или -`Shift+L`) без меча в руке — Кид должен отскочить с `seq_47`, а не умереть; -падение на стража сверху по-прежнему безболезненно (это оригинал, не баг). - ---- - - -## LOOSE-ROOM-CHANGE. Расшатанная плита не доваливается, если Кид ушёл в соседнюю комнату — ФИКС ЕСТЬ, ЖДЁТ ПРОВЕРКИ - -**Наблюдение (пользователь, 2026-08-13).** Уровень 10, комната 2: в (2,9) -стоит плита, которая под бегом Кида должна разрушаться. Если Кид пробегает -по ней и уходит в правую комнату, плита не успевает разрушиться и упасть — -переключение комнаты обрывает алгоритм. - -**Что в оригинале.** loose-пол — обычный **trob** (`make_loose_fall`, -seg007:0EF6 → `add_trob(curr_room, curr_tilepos, 0)`), а `process_trobs` -(seg007:0000) крутит ВЕСЬ список каждый кадр, независимо от `drawn_room`: -`animate_tile` делает `get_room_address(trob.room)` и работает с таблицей -той комнаты, где trob живёт. Фаза лежит в `curr_room_modif`, то есть прямо -в таблице уровня. Поэтому брошенная плита досчитывает до -`loose_floor_delay`, `remove_loose` убирает тайл, `add_mob` рождает кусок — -и всё это без Кида в комнате. Ровно так же ведут себя `mobs[]` -(`do_mobs`, seg007:1063) — их список чистится только в `start_level`. - -**Корень у нас.** Падающие КУСКИ (mob) чужую комнату умели давно -(`pop_loose_mob_room_changed`, [BUG-LOOSE-2](BUGS_CLOSED.md)), а вот ФАЗА -тряски/отсчёта жила в `pop_loose_modif[30]` — массиве ТЕКУЩЕЙ комнаты, — -и `pop_loose_reset()` при смене комнаты обнулял его целиком. То есть -плита, брошенная на полпути, возвращалась в покой. То же для плит-потолков -(`pop_ceil_modif[10]`). - -**Сделано** (двухуровневое хранение вместо переноса всей механики в trob — -`pop_loose_modif` остаётся быстрым массивом отрисовки текущей комнаты): - -1. `pop_loose_leave_room()` (`pop_map.c`, зовётся первым делом в - `enter_room_side`, пока карта ещё описывает СТАРУЮ комнату) — сдаёт фазу - всех loose-тайлов в персистентный `room_modif` (это и есть - `curr_room_modif` оригинала) и заводит trob на незаконченные. -2. `animate_loose()` (`pop_trob.c`, case `TILE_LOOSE` в `pop_process_trobs`) - — досчитывает фазу заочно; на провале ставит тайл в EMPTY - (`pop_level_set_tile`), кладёт в модификатор тип уровня (`remove_loose`) - и рождает кусок через новый `pop_loose_mob_spawn_at(room, row, col)`. - Пока комната ОТРИСОВАНА, trob снимается сразу — хозяин фазы - `pop_loose_tick`. -3. `pop_loose_reset()` теперь не обнуляет, а ЗАБИРАЕТ фазу новой комнаты из - `room_modif`: вернувшийся Кид застаёт плиту на той же фазе. -4. `pop_loose_forget()` — старт/рестарт уровня: забыть фазы БЕЗ сдачи - (у оригинала всё сносит `load_level`). Без него первый же `enter_room` - после `pop_trob_reset()` занёс бы в свежий уровень дрожь из прошлой жизни. - -Резидент не изменился (20569 Б); банк 3 +451 Б, банк 6 +181 Б, банк 7 +62 Б. -Хост-тест `phys_loose_survives_room_change` (`tests-host/t_phys.c`) закрывает -передачу фазы. - -**Проверять:** уровень 10, комната 2 — пробежать по плите (2,9) в правую -комнату и вернуться: дыра должна быть на месте. Регресс: комната 7 -(две соседние плиты подряд), комната 12 плита (0,1) → уход в 15 -([BUG-LOOSE-2](BUGS_CLOSED.md)), плита-потолок, рестарт уровня после смерти -на дрожащей плите. - - ---- - - -## LOOSE-SEAM-ANIM. Плита в шве исчезает без анимации падения — МЕЛКИЙ, ОТЛОЖЕН - -> **Решение пользователя (2026-08-13):** «пока пусть будет так». - -**Наблюдение.** Уровень 10: Кид расшатывает плиту (2,9) комнаты 2 и убегает -вправо в комнату 7, где та же плита видна в шве как (2,−1). Плита -доваливается правильно (см. [LOOSE-ROOM-CHANGE](#loose-room-change)) и с -экрана исчезает, но **мгновенно** — без дрожания и без падающего куска. - -**Почему так.** Заочный досчёт (`animate_loose`, `pop_trob.c`) сознательно -не рисует: комната не отрисована, а фаза живёт в `room_modif`, мимо -`pop_loose_modif`, на который смотрит отрисовка дрожащего кадра. Исчезновение -видно только потому, что провал меняет ТАЙЛ, а по этому событию -(`pop_neigh_dirty`) главный цикл перечитывает кромку и перерисовывает шов. -Падающий кусок (mob) рождается в комнате 2 и честно летит, но `mob_tick_one` -рисует только `here` (своя комната), а комната 2 — не отрисованная. - -**Что надо, если браться.** Шов — это НЕ обычный тайл: чужая колонка 9 -рисуется внутри нашей колонки 0 (`draw_tile`, ветка `lcode == 11`), а -дрожащий кадр берётся из `pop_loose_modif[row*10 + (col-1)]`, то есть при -`col == 0` индекс уезжает за границу массива (для ряда 0 — в −1). Значит -анимация шва потребует не «включить рисование», а дать чужой колонке -собственный источник фазы. Заодно там же чинить и этот выход за границу. - -**Проверять:** тот же сценарий уровня 10; в оригинале плита в шве дрожит и -роняет кусок так же, как в своей комнате. - - ---- - - -## JUMP-FLOOR-LEGS. Прыжок с пола: ноги Кида поверх кромки пола — ПОЧИНЕН, ЖДЁТ ПРОВЕРКИ - -> **Корень (найден трассой 2026-08-13).** Проход оверлеев в -> `pop_fore_over_char` обходил **только два крайних ряда** футпринта: -> -> ```c -> if (action != 2) other_overlay_tile(rB, c); /* опорный */ -> if (rT != rB) other_overlay_tile(rT, c); /* верхний */ -> ``` -> -> Это буквальный порт `redraw_at_char2` (seg003:0645), и в оригинале он -> верен: там `char_top_row` и `char_bottom_row` ВСЕГДА соседние. У нас между -> ними появляется дыра — `char_footprint` форсит `rT = rB − 1` (голова торчит -> в ряд выше), а затем окно fore-клипа расширяет `rB` ещё на ряд вниз. -> -> На спорном кадре трасса из MAME дала `rT=0 rB=2 cL=0 cR=1 do_ov=1` и **ноль** -> вызовов `overlay_mid_tile`: ряды 0 и 2 обошли, ряд 1 — тот самый, где стоит -> плита пола, — пропустили. Отсюда и подсказка пользователя «глубже в падении -> плита рисуется правильно»: там `y_to_row` даёт уже 2, ряд 1 попадает в пару -> крайних, и всё сходится. -> -> **Фикс:** обходить ВЕСЬ диапазон `rB..rT`, сохранив правило оригинала «при -> `action == 2` опорный ряд не трогаем». После фикса трасса на том же кадре: -> один вызов `overlay_mid_tile`, исход для (1,1) = «нарисовали», коды тайлов -> `curr=3 left=0` — байт в байт как в отладочном выводе SDLPoP. -> -> Пилларный оверлей, который «работал и раньше», к этому отношения не имел: -> это `fore_id = 95` из отдельного fore-прохода, а не midtable-оверлей. -> -> Банк 2 +28 Б. Хост-тесты (6 наборов) проходят. - -### Разбор, по которому искали (оставлен: метод пригодится) - -**Наблюдение (пользователь, 2026-08-13).** Уровень 10, комната 1, прыжок с -пола. В оригинале нижняя часть Кида скрыта ЗА передней гранью пола, у нас -рисуется весь Кид поверх неё (за передней колонной он при этом уходит -правильно). Скриншоты — в переписке сессии. - -**Состояние кадра (снято из памяти MAME на замороженном кадре, сборка -2026-08-13):** - -| поле | значение | -|------|----------| -| `Kid.frame` | 103 (`frame_103_start_fall_2`) | -| `Kid.action` | 3 (`actions_3_in_midair`) | -| `Kid.x` / `Kid.y` | 69 / 127 | -| `Kid.direction` | −1 (влево) | -| `Kid.curr_col` / `curr_row` | 0 / 2 | -| `Kid.room` / `cur_room` | 1 / 1 | - -`pop_y_land[2] = 118` — то есть ноги на 9 px НИЖЕ уровня пола ряда 1, ровно в -полосе его передней грани (`draw_tile_bottom` рисует её на `63*row + 65 = 128`). - -Тайлы комнаты 1 (`room_fg`, прочитаны там же): - -``` -ряд 0: 01 01 00 00 00 00 00 00 04 0B -ряд 1: 04 00 03 13 10 11 13 01 07 0F -ряд 2: 0C 01 03 01 01 0F 01 01 04 03 -``` - -Кромочная колонка левого соседа (`lcol_fg[0..2]`): `04 0C 04`. - -**Что УЖЕ проверено и исключено.** - -1. **Гейт `redraw_at_char2` (seg003:0645) портирован верно.** Сверено строка - в строку: наш `do_ov` в `pop_fore_over_char` даёт то же множество поз - (захват 78-79, `action` 2/3/4/6, `bumped` 102-106, начало подъёма 135-136), - и climb-ветка 137..144 тоже совпадает. При `action == 3` оверлей - ВКЛЮЧАЕТСЯ — дело не в гейте. -2. **`draw_other_overlay` (seg008:1492) на колонке 0 не сработал бы и в - оригинале.** Обе его ветки требуют пустого соседа: `tile_left == empty` - (у нас `lcol_fg[1] = 0x0C`, doortop — не пусто) либо `drawn_col > 0` и - пустой тайл ЧЕРЕЗ ОДИН слева. Значит окклюдер — НЕ он, и наш порт этой - функции здесь ни при чём. -3. **`pop_tile_code(row, −1)` кромку читает правильно** — из `pop_t_lfg`, а не - «стена всегда». - -**Две живые гипотезы, проверять в этом порядке.** - -* **Это вообще не отрисовка, а физика.** У нас `Kid.y = 127` при уровне пола - 118 — Кид «утоплен» на 9 px, и ноги торчат ниже кромки просто потому, что - они там и есть. Проверяется дёшево: снять `Char.y` у SDLPoP на том же - кадре 103 той же последовательности. Если там 118..120 — искать надо в - seqtbl/`fall_speed`, а не в слое фона. -* **Окклюдер — другой тайл/другой механизм.** Тогда нужна очная ставка: - прогнать SDLPoP с трассой (`dbg_shots`-fprintf в `draw_other_overlay` и - `add_kid_to_objtable` уже стоят в нашей копии, см. memory - `pop_pixel_diff_vs_sdlpop`) и сравнить СПИСОК тайлов, попавших в midtable - на этом кадре, с тем, что рисуем мы. Гадать дальше по коду смысла нет — - два прохода по seg008 уже не дали ответа. - -**Проверять после починки:** тот же прыжок в комнате 1 уровня 10; за передней -колонной Кид уходит и сейчас — это не должно сломаться. - - ---- - - -## MOB-CLIP-RIGHT. Окна и узор кладки рисуются поверх падающих плит - -**Найдено прогонами 2026-08-13 (уровень 13, комнаты 16 и 23).** - -**Симптом.** На падающей плите проступают элементы ЗАДНЕЙ стены — узор -кладки, а на ряде 0 и целое окно. Плита при этом цела: элементы ложатся -поверх неё, не стирая. - -**Корень.** `mob_render` (`pop_room.c`) каждый кадр вызывает -`draw_tile(r, m->col + 1)` — перерисовывает ЦЕЛЫЙ соседний тайл поверх уже -нарисованного куска, чтобы спрятать его правую часть (спрайт 42 лежит в -столбце `col+1`). `draw_tile` кладёт всё содержимое тайла, включая декор -пустого тайла — окно и узор. Ряд берётся из координаты куска, поэтому на -ряде 0 перерисовывается тайл с окном. - -Правка [#6](#) (клип перерисовки окном коридора heal) сделала артефакт -ЗАМЕТНЕЕ: раньше перерисовка размазывалась вокруг, теперь попадает точно в -прямоугольник плиты. - -**Как в оригинале.** Такой перерисовки нет вовсе. `redraw_at_cur_mob` -(seg007:1094) зовётся ТОЛЬКО из `loose_fall`, один раз в момент сбития, и -лишь ставит пометки на тайл и соседа. Правая часть куска прячется -собственным клипом объекта: `add_mob_to_objtable` (seg007:1161) задаёт -`clip.right = 40`. - -**Что делать.** Портировать клип вместо подпорки: - -1. выяснить, во что превращается `clip.right = 40` в наших координатах - (у оригинала `obj_x` в удвоенных единицах: `char_x_left = obj_x / 2 + 58`); -2. блитить правую часть (env 42) с ограничением ширины — примитив с шириной - есть для персонажей (`gfx_blit_cols_part_w`), для env надо посмотреть; -3. убрать `draw_tile(r, col+1)` и окно fore-клипа вокруг него; -4. вернуть коридор heal к 64x32. - -**Побочная выгода:** уходит по одному полному `draw_tile` на кусок за кадр — -при шести падающих плитах это шесть отрисовок тайла. - ---- - - -## MID-OVERLAY-LAYER. Оверлей кромки всегда поверх, а должен сортироваться - -**Найдено разбором 2026-08-13.** - -`overlay_mid_tile` (`pop_bg.c`) выполняется в проходе ПОСЛЕ персонажей, то -есть безусловно поверх всего нарисованного. В оригинале это `draw_other_overlay` -(seg008:1499), и он переключает таблицу на **midtable** — -тот же слой, где живут персонажи и падающие куски (`add_mob_to_objtable`, -тип `0x80`), а внутри слоя всё сортируется по `y` (`compare_curr_objs`, -seg008:1572). - -Следствие: узор из оверлея выигрывает у плиты, даже когда плита ближе к -зрителю. Пока у нас нет сортируемого midtable, точечными правками это не -лечится. - -Связано с [BG-ONCE](TASKS_OPEN.md#bg-once) — там та же техническая -сердцевина: привести наши слои в соответствие с таблицами оригинала. - ---- - - -## GUARD-FALLOUT-VICTORY. Выпавший из комнаты страж не засчитывается убитым - -**Найдено разбором 2026-08-13** (при проверке чита `K` на Джафаре). - -У `on_guard_killed` в оригинале ДВА места вызова: - -| место | что | -|---|---| -| `play_guard`, seg006:1494 | HP кончились — **портировано** | -| `check_guard_fallout`, seg002:264 | страж выпал из комнаты — **НЕ портировано** | - -Наш `pop_guard_fallout` (`pop_guard.c`) просто гасит слот. Значит столкнуть -Джафара в пропасть на 13-м уровне можно, а выход на 14-й от этого не -откроется — расхождение с оригиналом. - -Правка: позвать `on_guard_killed()` в ветке «не скелет». Мешает только то, -что функция сейчас `static` в `guards.c` (банк 1), а `pop_guard_fallout` -живёт в резиденте. - ---- - - -## LEVELDOOR-STARTROOM-WIPE. В стартовой комнате за входной дверью рисуется лестница вместо черноты - -**Найдено разбором 2026-08-17** (попутно к фиксу -[LEVELDOOR-PALACE-CLIP](BUGS_CLOSED.md#leveldoor-palace-clip) — то же -`draw_leveldoor`). - -`draw_leveldoor` (seg008:1D29) в приподнятой створке различает две комнаты: - -```c -if (modifier_left) { - if (level.start_room != drawn_room) { - add_backtable(..., 144 /*level door stairs*/, ...); - } else { - short leveldoor_width = (tbl_level_type[current_level] == 0) ? 39 : 48; - sbyte x_low = (tbl_level_type[current_level] == 0) ? 2 : 0; - add_wipetable(0, 8*(draw_xh + 1) + x_low, ybottom - 4, 45, leveldoor_width, 0); - } -} -``` - -Смысл: за дверью, **через которую вошли на уровень**, лестницы нет — там -чернота, и оригинал её ЗАТИРАЕТ прямоугольником, а не рисует марш 144. -Ширина затирки дворцовая/подземная (48 против 39) и подземная сдвинута на -2 px вправо — то есть здесь ЕЩЁ одно расхождение подземелья и дворца, помимо -уже починенного `leveldoor_right += 8`. - -У нас (`pop_room.c`, `draw_leveldoor`) стоит безусловно: - -```c -if (modif) - pop_env_b(144, x, ybottom - 4); /* лестница (комната ≠ стартовой) */ -``` - -— условие названо в комментарии, но не реализовано. Различие стартовой -комнаты у нас есть только в логике входа (`pop_leveldoor_enter`, -`pop_map.c:1166`), не в отрисовке. - -**Когда видно:** только пока створка входной двери приподнята -(`modif != 0`) в стартовой комнате — то есть в анимации входа на уровень и -если дверь снова открыть. При закрытой двери `modif == 0`, и обе ветки -ничего не рисуют, поэтому баг и не попался на обходах уровней 1-4. - -**Что мешает сделать прямо:** у нас нет понятия wipetable — нужен чёрный -прямоугольник в проходе backtable, то есть либо прямой `gfx`-fill в -`draw_leveldoor`, либо запечка. Проверять на уровне 1 (подземелье, ширина -39, сдвиг 2) И на уровне 4 (дворец, 48, сдвиг 0) — иначе поймаем только -половину. - -### BUG-SHADOW-SET. Тень в бою рисуется спрайтами стража - -**Симптом** (найдено пользователем 2026-08-20): в бою Тень выглядит не -Кидом. В SDLPoP она Кид всегда. - -**Корень.** Набор спрайтов выбирает не charid, а поле `sword` САМОГО -КАДРА: `load_frame_to_obj` (`seg008.c:1752`) держит `chtab_base` жёстко -равным `id_chtab_2_kid` и прибавляет `cur_frame.sword >> 6`. У всех 241 -кадра `frame_table_kid` эти биты нулевые, у всех кадров `frame_tbl_guard` -— `0xC0`. Тень берёт таблицу стража для кадров 150..189 (`seg006.c:533`), -значит идёт через chtab_5. - -Дальше и кроется наша ошибка: **chtab_5 — это не «страж», а «соперник -уровня»**. Он грузится из `tbl_guard_dat[tbl_guard_type[уровень]]` -(`seg000.c:1117`), а `tbl_guard_type[12] == 4` → **SHADOW.DAT**, и это -графика КИДА в боевых позах (палитра SHADOW.DAT побайтно равна палитре -Кида; у GUARD.DAT там серая рампа под перекраску). - -**У нас** `pop_guard_load` (`pop_cdraw.c:98`) разбирает только типы 2 -(скелет) и 3 (визирь), а всё остальное — включая тип 4 — уводит в -`guard_names`. SHADOW.DAT в ассетах отсутствует, каталога нет, в -Makefile правила нет. - -**Починка** — часть работы по атласу Тени, см. -[`../docs/shadow_atlas_plan.md`](../../PoP/docs/shadow_atlas_plan.md) Ш0/Ш1: -довезти SHADOW.DAT и запечь его во вторую половину атласа Тени. Отдельно -чинить смысла нет: как только Тень поедет своим атласом, ветка выбора -набора для типа 4 исчезнет вместе с проблемой. - -**Оговорка.** `pop_guard_set_palette` для типа 4 звать НЕЛЬЗЯ — она -затрёт палитру Тени палитрой стража (`curr_guard_color` у не-стражей = 0, -`seg002:183`). - -### BUG-CORPSE-AIR. Труп висит в воздухе после падения плиты - -**Симптом** (найдено пользователем 2026-08-20, ур. 12 к. 15, старт с -`POS=15`): Кид встал на проваливающийся пол (0,6), плита обрушилась и -убила его, но ТЕЛО осталось лежать на уровне исчезнувшего пола, а плита -улетела дальше вниз. Труп висит в пустоте. - -**Где смотреть.** Кадр смерти — `actions_5_bumped` (см. seq в -`kid_data`), а гравитация в `check_action` (seg006:05CD) для действия 5 -включается только на кадрах приседа: у оригинала есть отдельные фиксы -`FIX_DEAD_FLOATING_IN_AIR` (кадры 177..185) именно про этот случай — -значит **в оригинале 1989 года труп в воздухе тоже висит**, и SDLPoP -чинит это опциональным фиксом, по умолчанию выключенным. - -**Отсюда вопрос к решению**, а не сразу правка: чинить ли вообще. Если -чинить — портировать `fix_dead_floating_in_air` и записать как -осознанное расхождение в `../docs/impl_diff.md` (мы уже отказались от -двух других опциональных фиксов SDLPoP в `bump_into_opponent`). - -**Приоритет низкий:** ситуация возникает только когда труп остаётся на -проваливающемся полу, играбельности не мешает. - ---- - -## BUG-SND-FIRSTRUN — при ПЕРВОМ запуске первый эффект слегка искажён - -**Симптом** (пользователь, 2026-08-20): после загрузки системы, при первом -запуске программы, самый первый звуковой эффект идёт с искажением; при -повторном запуске программы искажения нет. Наблюдалось ещё на тестовых -примерах CBL, до PoP. - -**Причина, скорее всего, уже устранена.** Аппаратный буфер CBL (256 -слотов) железо не чистит, а запись в порт управления сразу пускает -воспроизведение с нулевого слота — то есть первые 23,4 мс играет то, что -лежало в буфере раньше. При первом запуске это остатки после загрузки -системы, при втором — наша же тишина, поэтому и слышно только один раз. -Разбор — `../docs/sound_plan.md` §10.2. - -Лечение сделано в libc: `_cbl_prime` заливает буфер тишиной сразу после -включения (`cbl_open`). **В MAME проверить нельзя**: эмулируемый буфер -стартует нулями при двухдополнительном ЦАП, то есть там этот дефект нем -изначально — записи до и после фикса совпали побитово по огибающей. - -**Что нужно:** проверка на РЕАЛЬНОМ железе, первый запуск после холодной -загрузки. Если искажение осталось — значит мусор приходит не из буфера -CBL, и копать надо в системных буферах DSS. - -**Приоритет низкий:** один раз за сеанс, на играбельность не влияет. - ---- - - -## PAL-L1-AFTER-INTRO. Вход в игру на уровень 1 после интро — палитры нет (чёрный экран) - -**Наблюдение (пользователь, 2026-08-23).** После заставок (title → intro → -demo) нажатие клавиши в attract-demo начинает новую игру на уровне 1 — -экран ЧЁРНЫЙ при живом геймплее. При этом: - -- Shift+L с уровня 1 на уровень 2 (тот же маршрут через pre-cutscene) — - палитра появляется (закрыто быстрым фиксом `fade_in_pending` в - `sprpop.c`, маршрут CUTSCENE → LEVEL_LOAD → PLAYING); -- Restart Game через меню — уровень 1 с НОРМАЛЬНОЙ палитрой. - -**Контекст.** Маршрут demo_new_game (`sprpop.c` ~996): dispatch(NEW_GAME) -→ `pop_level_switch()` → dispatch(LEVEL_READY) → PLAYING. По коду палитру -там никто не трогает, а демо-ветка перед этим делает -snapshot+dim(4,0)+fade_in(4) — то есть к моменту новой игры палитра должна -быть яркой. Контрольный прогон в MAME (сборка с фиксом) демо и уровень 1 -за настройками показал ЯРКУЮ картинку — воспроизведение нестабильно. - -**Гипотезы для проверки (порядок дешевизны):** - -1. **Тайминг нажатия.** Клавиша, СОСКИПНУВШАЯ intro (intro_run абортится по - `kbd_raw_any_down`), остаётся в held-state и первым же кадром демо даёт - `demo_new_game` — но fade_in демо-ветки блокирующий и завершается ДО - входа в игровой цикл, так что в эту гипотезу код не верит. Проверить - трассой: снять обе экранные палитры (`gfx_pal_get` 0 и 1) на первом кадре - PLAYING. -2. **Снимок демо-ветки снят с чёрной палитры.** Если нажатие клавиши - приходится МЕЖДУ `intro_load_palette` (fload+sync+snapshot+dim(4,0)) и - `intro_restore_game_palette` — аборт оставляет экран чёрным, но restore - всё равно выполняется после... сверить фактический порядок вызовов - трассой. -3. **`font_ready`=0 в момент fade_in** — dim/fade молча выходят (guard в - `pop_ui.c`). Маловероятно (шрифт грузится в `pop_boot` → - `pop_menu_init`), но дёшево исключить. - -**Правильное решение, скорее всего, — этап B из -[`../docs/palette_plan.md`](palette_plan.md):** явный -«load → apply/fade» контракт на КАЖДОМ входе в PLAYING, а не точечные -fade_in в отдельных маршрутах. Точечно чинить только после стабильного -воспроизведения. - ---- - - -## PAL-DUNGEON-STALE. Переход 3→4 (подземелье→дворец): остаётся палитра подземелья - -**Наблюдение (пользователь, 2026-08-23).** Shift+L с уровня 3 на уровень 4: -pre-cutscene отыгрывает, уровень 4 начинается — но env/wall-цвета (слоты -0x50–0x6F) остаются ПОДЗЕМНЫМИ. На переходе 1→2 (оба подземелье) всё -правильно. - -**Корень ясен.** Быстрый фикс `fade_in_pending` (`sprpop.c`, маршрут -CUTSCENE → LEVEL_LOAD → PLAYING) восстанавливает яркость из СНИМКА, а снимок -делает `intro_restore_game_palette()` ДО `pop_level_switch()`: - -``` -pop_pre_cutscene_show(pre) → kid.pal + bg(СТАРЫЙ набор) + snapshot + dim(4,0) -pop_level_switch() → pop_bg_load(дворец): в палитры записаны - 32 записи ДВОРЦА (pal_tile.pal) -pop_ui_fade_in(4) → восстанавливает ОБЕ палитры ИЗ СНИМКА — - то есть ЗАЛИВАЕТ НАЗАД подземные 0x50..0x6F -``` - -fade_in по построению пишет все 256 записей из снимка — он затирает и только -что загруженный тайлсет. На 1→2 не видно, потому что наборы совпадают. - -**Как чинить (в порядке правильности):** - -1. **По плану (этап B `../docs/palette_plan.md`):** разделить «логическую - палитру» и «яркость» (pop_pal: load_* обновляет снимок ПОСЛЕ bg_load, - apply/fade только показывает). Тогда снимок на момент fade_in всегда - актуален. -2. Точечно: переставить обновление снимка ПОСЛЕ `pop_level_switch()` - (снять snapshot заново перед fade_in). Работает, но это ещё один пластырь - поверх модели, которая и так уже в трёх местах по-разному управляет - яркостью. - -**Проверять:** Shift+L 3→4 И 5→7 (дворец→подземелье, обратное направление), -плюс штатный проход уровня 3 через дверь (там же смена набора); после починки -сверить цвета кладки дворца с `pal_tile.pal` (таблица в palette_plan.md §1.3). - -**Решение пользователя (2026-08-23): пока не фиксить** — закрыть вместе с -этапом B плана палитр. - ---- - - -## SND-PACE-DEAD. Пейсинг сцен по насосу CBL не включается — СНЯТ 2026-08-28 - -> **Закрыт удалением самой ветки.** Сцена с Джафаром переведена на ЕДИНЫЕ -> часы — кадры луча (`intro_pv_animated`): вторая шкала по насосу и гонка, -> которая её выбирала, убраны целиком. Насос как часы был нужен потому, -> что кадр сцены рисовался дольше своего интервала; теперь отрисовка -> разложена по интервалам (`pv_restore_bg`), и счёт кадров честен. -> Побочный эффект гонки — «кода реплики каждый прогон в другом месте» — -> исчез; проверено пользователем. Ниже — исходный разбор. - -**Замер (MAME, 2026-08-27).** В сцене `intro_pv_scene()` зонды показали -`snd_done == 0` на всём прогоне — то есть ветка `if (snd_pace)`, ради -которой и заводилась вся арифметика 57/40, **не исполняется ни разу**. -Сцена идёт по запасной кадровой ветке (`POP_T60` + `gfx_wait_vsync`). - -**Корень.** `pop_intro.c`: - -```c -snd_prev = pop_snd_tick; -... -snd_pace = (uint8_t)(pop_snd_tick != snd_prev); /* часы реально идут? */ -``` - -`pop_snd_tick` — счётчик порций насоса, он растёт раз в 11,7 мс. Между -двумя этими чтениями проходят единицы микросекунд, поэтому значения -совпадают почти всегда и признак выходит НУЛЕВЫМ, даже когда звук -исправно играет. - -**Чем плохо.** Кадровая ветка не имеет догона вообще, и вся работа по -привязке сцены к часам звука пропадает впустую. Симптом — [PV-RENDER-BOUND](#pv-render-bound). - -**Как чинить.** Проверять «часы идут» с реальным зазором: снять -`pop_snd_tick`, подождать кадр (`gfx_wait_vsync()`), снять снова. Одна -строка, но включение ветки меняет темп ВСЕХ сцен — трогать только вместе -с прогоном каждой. - ---- - - -## PV-RENDER-BOUND. Сцена с принцессой не укладывается в свой бюджет кадра — ИСПРАВЛЕНО 2026-08-28 - -> **Причина оказалась не в цене кадра, а в том, ГДЕ отсчитывался интервал.** -> Кадр рисовался целиком, и только потом ждали vsync и ещё четыре — то есть -> отрисовка ПРИБАВЛЯЛАСЬ к делителю. Теперь она разложена на блоки, каждый -> из которых влезает в кадровый интервал, и после каждого ждём vsync -> (`pv_restore_bg` + раскладка кадра в `cut_run` / `pre_room_animated` / -> `intro_pv_draw_frame`); фон восстанавливаем только по картинке, 200 строк -> вместо 256. Удешевлять сцену не понадобилось: отрисовка ~2 кадра при -> бюджете 5. Подгонка `PV_MAGIC_LEAD` снята (0) — проверено пользователем: -> кода попадает в нужный кадр. Ниже — исходный замер. - -**Замер (MAME, 2026-08-27).** Реплика Джафара `m53` — 1403 порции насоса, -то есть 16,42 с реального времени. За это время шкала сцены прошла -**811 тиков вместо 985**: анимация идёт со скоростью ~49 тиков/с при -номинале 60. Отставание пропорционально времени, поэтому одинаково на -любом наборе записей (flac / mt32). - -Зонды исключили другие версии: длина трека отдана насосу полная -(`pop_mus_left` на пуске = 1403), курсор дошёл до последней страницы -(10 из 11) — **трек доигрывает целиком, отстаёт именно картинка**. - -**Следствие, которое важно понимать.** Звук, выданный САМОЙ анимацией -(створка ворот, дверь покоев), разъехаться с ней не может: у них общая -шкала. Уезжает только внешний по времени звук — музыка. Поэтому -эффекты дверей совпадают, а кода реплики приходит раньше молнии. - -**Обход (сделан 2026-08-27).** `PV_MAGIC_LEAD` в `pop_intro.c` двигает -жест заклинания целиком (замах, шаг назад, вспышка) на подобранную на -слух величину. Это подгонка, а не лечение. - -**Как чинить по-настоящему.** Удешевить кадр сцены: сейчас он -перерисовывается целиком (`gfx_copy_page` на весь экран + актёры + -факелы + звёзды). Кандидат — перерисовывать только изменившиеся куски, -как в игровом слое. - ---- - - -## MUS-LEFT-TEAR. Неатомарное чтение `pop_mus_left` - -**Хазард.** `pop_mus_left` — `volatile uint16_t`, который УМЕНЬШАЕТ -прерывание насоса (`pop_sfx.c`), а читают его из главного цикла обычным -чтением: `pop_music_busy()` (`pop_music.c`), `pop_ctrl.c`, `pop_music.c` -(освобождение трека). На Z80 это две загрузки по байту. Если насос -успеет между ними при заёме из старшего байта (`0x0100` → `0x00FF`), -сложится **ложный ноль** — «трек кончился» за 256 порций, то есть за три -секунды до настоящего конца. - -**Где выстрелит.** `pop_music_busy()` ждут `hof_wait_music()` (финальная -тема) и титры («держим логотип до конца темы»): ложный ноль оборвёт -ожидание на три секунды раньше. - -**Статус.** Показан рассуждением; в прогоне 2026-08-27 не проявился -(проверено зондом с устойчивым чтением — результат не изменился). Окно -узкое: несколько тактов из 245 000 между прерываниями. - -**Как чинить.** Геттер, читающий до совпадения двух подряд: - -```c -uint16_t pop_music_left(void) { uint16_t a, b; - do { a = pop_mus_left; b = pop_mus_left; } while (a != b); return a; } -``` - -Вариант с `di`/`ei` тоже годится и стоит те же копейки (десяток тактов -раз в кадр, задержка прерывания ничтожна против 11,7 мс периода насоса), -но двойное чтение не трогает состояние прерываний вовсе — на фоне -[cbl_w0_bios_conflict](../../PoP/roomtest/BUGS_CLOSED.md) это плюс. - - -## CLIMB-VS-GUARD - -Кид стоит рядом 2,6, страж — этажом выше на 1,6. Кид тянется подтянуться -на 1,6. - -**Оригинал (SDLPoP).** Страж машет мечом, Кид срывается обратно на 2,6 -**без потери HP**. - -**У нас.** Тот же замах убивает Кида на месте. Если Кид безоружен, это -мгновенная смерть (ветка «заколот без меча», HP разом в ноль) — и дальше -тело падает, что до 2026-08-31 давало отдельный симптом «мёртвый -вприсядку» (закрыт развилкой в `land()`, см. коммит того же дня). - -**Наблюдение сверх того (пользователь, 2026-08-31).** В этой же связке -поведение расходится сильнее: страж провалился с ряда 1 на ряд 2 ВМЕСТЕ с -Кидом — причём Кид ушёл в провал в колонке 7 (там дыра), а страж между -колонками 5 и 6, где на ряду 1 пол ЕСТЬ. То есть страж проваливается -сквозь целый пол. Это может быть тем же корнем, что и удар: обоим нужен -корректный ряд/колонка персонажа в момент подтягивания. - -**Что уже проверено статически (2026-08-31).** Вся цепочка засчитывания -удара сверена с оригиналом и совпадает ДОСЛОВНО: - -- гейт по кадру Кида (нулевой кадр и кадры выхода по лестнице пропускают - разбор целиком) — `pop_check_sword_hurting`; -- приоритет стража при встречном попадании (отметка «ранен» у Кида - снимается) — `pop_check_sword_hurt`; -- требование ОДНОГО ряда у бьющего и жертвы — `check_hurting`; -- кадры удара (укол/третий удар), диапазон дистанции (8 для безоружной - жертвы, 12 для вооружённой, верхняя граница 29); -- формула расстояния `pop_char_opp_dist` — совпадает с `char_opp_dist`. - -Значит расходятся не правила, а ВХОДНЫЕ данные: ряд, колонка или X -персонажа во время виса/подтягивания. Наиболее вероятный кандидат — -дистанция: висящий вплотную под кромкой в оригинале не дотягивает до -нижнего порога 8, а у нас пара пикселей переводит его через порог. - -**Как чинить.** Не гадать — замерить на живой сцене: в момент, когда -`Opp.action` становится «ранен», снять у обоих `curr_row`, `curr_col`, `x`, -`direction` и сравнить с теми же величинами в SDLPoP на том же кадре -(метод — lldb-трасса живого SDLPoP, как в -[[sdlpop_odd_pixel_char_x]]). Отдельно снять, почему страж теряет опору: -`get_tile_at_char` под ним в кадре провала. - -**Уточнение пользователя (2026-08-31, важное).** Оригинальное поведение — -Кид сорвался без потери HP — ВОСПРОИЗВОДИТСЯ и у нас: исход сильно зависит -от того, где именно стоит страж. То есть расхождение не абсолютное, а -пороговое, и это прямо подкрепляет версию про ДИСТАНЦИЮ: пара пикселей -переводит расстояние через нижний порог засчитывания удара (8 для -безоружной жертвы), и удар из «мимо» становится смертельным. Значит -искать надо не потерянную ветку, а сдвиг координаты/порога — сравнивать -`pop_char_opp_dist` в момент замаха при ОДИНАКОВОЙ расстановке. - -**ЗВУК КАК ИНДИКАТОР ПУТИ (пользователь, 2026-08-31) — лучшая зацепка.** -В той же сцене оригинал играет ВЗМАХ (звук 11, «клинок движется»), а у нас -слышен звук, похожий на упор Кида в стену (звук 8, `bumped`). - -Набор звуков проверен и НЕ виноват: в `assets/packed/SND/snd.idx` слот 11 -на месте и содержит собственный короткий сэмпл (1280 Б), слот 8 — другой -(1664 Б). Раскладка не сдвинута. - -**ПОПРАВКА 2026-09-02 — прежнее толкование звука было ОШИБОЧНЫМ.** - -Здесь стояло, будто оригинал играет звук 11 «сразу на кадре укола, ДО -проверки расстояния», то есть при ЛЮБОМ уколе, попал тот или нет. Это -описание НАШЕГО кода, а не оригинала: ровно так звук стоял у нас, внутри -ветки «не парировано» и до присвоения `Opp.action = 99_hurt`. В SDLPoP -(seg002:1039..1044) он стоит в ХВОСТЕ `check_hurting` и защищён условием -`Opp.action != actions_99_hurt`: - - if (Char.direction == dir_56_none) return; // Fix looping "sword moving" sound. - if (Char.frame == frame_154_poking && Opp.frame != frame_161_parry && - Opp.action != actions_99_hurt) - play_sound(sound_11_sword_moving); - -То есть звук 11 в оригинале — это индикатор **ПРОМАХА**, а не укола: на -попадании его нет (играет боль), на парировании нет (`Opp.frame` уже 161). -Расхождение найдено и исправлено 2026-09-02 по симптому «непрерывный взмах -клинка у безоружного Кида на подъёме» (звук опознан в живой сессии по -`snd_curr == 11`; указатели насоса при этом сошлись с `snd.idx` байт в -байт, то есть тракт звука был исправен). Заодно приехал и пропущенный -ранний выход по `dir_56_none` — тот самый, что автор SDLPoP подписал -«Fix looping sword moving sound». - -**Что из прежних выводов уцелело, а что нет.** - -* УЦЕЛЕЛО: наблюдение «в оригинале слышен 11, у нас 8» — это данные, и они - остаются. Арифметика приоритетов их подкрепляет: `snd_prio[11] = 0x12` - (18) против `snd_prio[8] = 0x4B` (75), меньше значит важнее, поэтому - взмах не мог быть заглушён упором в стену. При ТОГДАШНЕМ коде звук 11 - звучал на любом уколе, значит его отсутствие действительно означало, что - до кадра укола дело не дошло. -* ОТПАЛО: вывод «оригинал ведёт стража атакой с промахом, а мы — - столкновением» опирался на неверную посылку и больше не следует из звука - сам по себе. -* УСИЛИЛОСЬ: то, что в оригинале в этой сцене слышен ИМЕННО 11, теперь - доказывает, что укол у стража СОСТОЯЛСЯ и ПРОМАЗАЛ. А это ровно версия - про ПОРОГ ДИСТАНЦИИ (см. выше про пару пикселей и нижний порог 8), а не - про потерянную ветку. Прежняя «версия про столкновение» её вытеснила - зря — возвращаем дистанцию в главные подозреваемые. - -**ВНИМАНИЕ тому, кто вернётся к этому багу: диагностика по звуку с -2026-09-02 ЗНАЧИТ ДРУГОЕ.** Старые заметки прогона будут вводить в -заблуждение — переснимать сцену заново. Новая таблица: - -| слышно | что это значит | -|---|---| -| 11 (взмах) | укол состоялся и ПРОМАЗАЛ — поведение оригинала в этой сцене | -| 13 (боль Кида) | укол ПОПАЛ, `Opp.action = 99_hurt` | -| 8 (упор в стену) | укола не было вовсе, сработало столкновение | -| тишина | `check_hurting` вышел раньше: меч не вынут / ряды не совпали / кадр не 153-154 | - -На саму механику урона правка 2026-09-02 НЕ влияет (тронут только звук), -поэтому расхождение «удар убивает» остаётся открытым как было. - -**Решение пользователя:** отложено на будущее (2026-08-31) — поведение в -этой связке расходится широко, чинить нужно целиком, а не по одному -симптому. - - -## HP-BAR-RESTART - -**Симптом (пользователь, 2026-08-31).** Гибель на 2-м уровне, возврат к -началу по Ctrl+A: строка HP на одном из двух экранов остаётся отрисованной -по результатам боя. Замечание там же: «в начале уровня она отрисовывается -только в один экран». - -**Что уже известно.** - -Ctrl+A у нас — РЕСТАРТ УРОВНЯ (`sprpop_cold.c`, тот же путь, что пункт меню -`POP_MENU_RESTART_LEVEL`), а не возврат в заставку. - -Перерисовка полосы устроена счётчиком страниц, а не флагом: -`pop_hp_invalidate` ставит `hp_todo = 2`, и `pop_hp_draw` тратит по одной -странице за кадр (`src/pop_cdraw.c`). Все четыре холодных пути -(старт уровня, вход в комнату, быстрая загрузка, возврат из меню) -инвалидацию зовут — механизм на месте. - -**Главный подозреваемый — зона статус-строки.** Полоса HP делит строку со -статус-текстом, и пока текст висит (`pop_status_ticks != 0`), стирание -чистит ТОЛЬКО края — левее `POP_STATUS_L` и правее `POP_STATUS_R`, — -а середину не трогает, чтобы текст не мигал. При старте уровня текст как -раз висит («LEVEL 2»), поэтому всё, что от прошлой полосы попало в -середину, там и остаётся. Полоса стража рисуется справа налево от 314 и -при большом запасе HP заходит именно в эту незачищаемую зону. - -**КОРЕНЬ (2026-08-31).** Счётчик считает СТРАНИЦЫ, но тратился по КАДРАМ, -а это не одно и то же: между двумя вызовами отрисовки переворота может не -быть, и оба прохода уходили в одну страницу — вторая оставалась с -делениями прошлого боя. Фикс: проход тратится только когда -`gfx_get_draw_page()` отличается от страницы прошлого прохода (первый -проход идёт всегда). Полная чистка всей ширины при инвалидации добавлена -там же — старая полоса могла заходить под статус-текст, где щадящая чистка -её не трогала; текст сразу перезапрашивается, чтобы не пропал. - -**Что проверить при взятии в работу.** - -1. Значения `POP_STATUS_L`/`POP_STATUS_R` против реальной ширины полос: - при скольких делениях полоса стража (или Кида) заходит под текст. -2. Уходят ли оба прохода `hp_todo` в РАЗНЫЕ страницы на старте уровня — - если между ними нет переворота, обе перерисовки лягут в одну. -3. Возможное решение: на старте уровня чистить полосу во всю ширину - независимо от статус-текста (текст всё равно перерисовывается заново - через `pop_status_invalidate`), либо запоминать максимальную ширину - прошлой полосы и стирать по ней. diff --git a/applications/SprPoP/docs/KID_PLAN.md b/applications/SprPoP/docs/KID_PLAN.md deleted file mode 100644 index cc24ab3..0000000 --- a/applications/SprPoP/docs/KID_PLAN.md +++ /dev/null @@ -1,214 +0,0 @@ -# Prince of Persia — Kid (персонаж): анализ и план - -> **Статус: РЕАЛИЗОВАНО (2026-08-01).** Kid играется целиком: интерпретатор -> `seqtbl` + `frame_table` (`src/pop_kid.c`), диспетчер `control()` -> (`pop_ctrl.c`), коллизия/физика/зацеп (`pop_map.c`), бой и HP. Модель -> персонажа стала общей: `Char`-окно (`pop_state.c`) обслуживает и Кида, и -> стражей. Таблицы кадров и `seqtbl` уехали из `_CODE` в EMM-страницу -> (`kid_data.bin`, см. `layout_plan_v2.md` шаг 1). -> -> Отступление от §2.1 плана: выбран ПАДДИНГ кадров (общий канвас), а не -> per-frame offset — компромисс зафиксирован в `PORT_PLAN.md §6.1`. -> -> **Документ оставлен как СПРАВОЧНИК по модели персонажа** (`char_type`, -> категории `actions_*`, устройство `play_seq`, объём спрайтов) — он нужен -> при портировании остальных акторов (скелет, тень, визирь). Текущие -> задачи — `../TASKS_OPEN.md`. - -Составлен 2026-07-16. Опирается на разбор `SDLPoP/src/seg006.c` -(ядро физики/управления Kid), `seqtbl.c` (таблицы последовательностей), -`types.h` (char_type, seq_*, SEQ_*, actions_*), `SDLPoP/data/KID` (спрайты). -Фон уже готов и проверен на MAME (`applications/SprPoP`, см. -`memory/pop_background_strategy`) — Kid развиваем в том же `SprPoP` как -новый PoC (решение пользователя: старый `poc/` не трогаем). - -**Копирайт:** спрайты Kid (`SDLPoP/data/KID`) — Broderbund/Ubisoft. -Использование настоящей графики Kid — сознательное решение пользователя -(в отличие от плейсхолдера в старом `poc/`, см. PORT_PLAN §5.1). - ---- - -## 1. Как устроен персонаж в оригинале (что портируем) - -### 1.1 Состояние — `char_type` (14 полей, types.h) - -``` -frame текущий номер кадра (индекс во frame_table_kid) -x, y позиция (byte; x — с учётом direction) -direction -1 влево / 0 вправо -curr_col, логическая клетка (тайл), где персонаж -curr_row -action КАТЕГОРИЯ действия (actions_*, см. 1.2) -fall_x, скорость падения (fall_y<22 = 1 ряд, <33 = 2 ряда) -fall_y -room комната -repeat счётчик для удержания-ввода (напр. повторный прыжок) -sword есть ли меч (бой — вне Фазы 1) -alive жив/мёртв -curr_seq УКАЗАТЕЛЬ в seqtbl (байткод текущей последовательности) -``` - -Состояние крошечное — легко живёт в W2. - -### 1.2 Категории действия — `actions_*` (9 шт) - -`0 stand`, `1 run_jump`, `2 hang_climb`, `3 in_midair`, `4 in_freefall`, -`5 bumped`, `6 hang_straight`, `7 turn`, `99 hurt`. `action` определяет, -как `check_action()`/`play_kid()` реагируют на ввод и физику каждый тик. - -### 1.3 Движок анимации/движения — ГЛАВНОЕ - -**Движение НЕ физика, а байткод + per-frame смещения** (подтверждает -PORT_PLAN §6). Три уровня: - -1. **`seqtbl`** — байткод-программа на действие. Опкоды (types.h): - `SEQ_DX`(0xFB) сдвиг x на amount×direction, `SEQ_DY`(0xFA) сдвиг y, - `SEQ_FLIP`(0xFE) разворот, `SEQ_JMP`(0xFF)/`SEQ_JMP_IF_FEATHER`(0xF7), - `SEQ_UP`/`SEQ_DOWN`(0xFD/0xFC) смена ряда, `SEQ_ACTION`(0xF9) задать - `Char.action`, `SEQ_SET_FALL`(0xF8), `SEQ_KNOCK_UP/DOWN`, `SEQ_SOUND`, - `SEQ_DIE`/`SEQ_END_LEVEL`/`SEQ_GET_ITEM`. **Байт < 0xF0 = НОМЕР КАДРА** - → ставит `Char.frame` и play_seq возвращается (один кадр за тик). -2. **`play_seq()`** (seg006.c:570) — интерпретатор: крутит опкоды из - `seqtbl + Char.curr_seq`, пока не встретит кадр. ~15 case — портируется - 1-в-1. **Квирк:** seqtbl использует АБСОЛЮТНЫЕ DOS-адреса в JMP; - `SEQTBL_0 = seqtbl - SEQTBL_BASE(0x196E)` — при порте пересчитать - базу (JMP-адреса в наших данных). -3. **`frame_table_kid[]`** (seg006.c:127, ~180 кадров) — на КАЖДЫЙ кадр: - `{image, sword_flags, dx, dy, flags}`. `image` — индекс спрайта Kid; - `dx/dy` — смещение позиции ЭТОГО кадра; `flags`: 0x1F weight_x, 0x20 - thin, 0x40 needs_floor, 0x80 even/odd-pixel (влияет на x-рендер). - -**Тик персонажа:** `play_kid()` (диспетчер по action+вводу) → `play_seq()` -(двигает curr_seq, ставит кадр, применяет seq-dx/dy) → `frame_table[frame]` -даёт image+собственные dx/dy → позиция и спрайт. У нас это ложится на -`sprite_frame`+`sprite_move` (НЕ `sprite_anim`/`sprite_moveto` — см. -PORT_PLAN §6: авторские таблицы, не автопрогрессия). - -### 1.4 Управление — `control_kid()`/`read_user_control()` (seg006.c) - -Читает ввод (у нас — held-state `kbd_raw`, уже готово, §2 PORT_PLAN) и по -`Char.action` выбирает последовательность (`seqtbl_offset_char(seq_id)`). -Логика «что можно из какого состояния» — ядро ощущения PoP. - -### 1.5 Взаимодействие с картой — collision (seg006.c) - -`check_on_floor()`/`start_fall()` — пол под ногами / падение в яму; -`in_wall()` — упор в стену (сдвиг наружу); `check_grab()`/ -`can_grab_front_above()` — зацеп за уступ; `fell_out()` — вывалиться из -комнаты; `check_spiked()`/loose — ловушки; `fall_accel()`/`fall_speed()` — -ускорение падения. Всё читает ТИП тайла (`get_tile`) — у нас это уже -разобранные `fg[]/bg[]` (level.h/room1_data.h). - ---- - -## 2. Спрайты Kid (219 шт, 16 цветов, 177 КБ) - -- 219 PNG (`data/KID`), 16-цветные (палитра `res400.pal`, 16×RGB как env/ - wall), макс кадр **53×35** — влезает в лимит движка 64×64. 177 КБ в - 8bpp. -- `frame_table_kid` отображает кадр→`image` (индекс спрайта). Число - РАЗЛИЧНЫХ image — уточнить (≤219); паковать те, что реально используются - платформинг-последовательностями Фазы 1 (не все 219 — бой/катсцены - отдельно). -- **Палитра:** Kid 16 цветов → слоты Sprinter `0x70-0x7F` (env 0x50, wall - 0x60 уже заняты; Kid не пересекается). Пиксель i: 0→0xFF, i→0x70+i. - Тот же пайплайн, что `pop_pack_bg.py`. -- **Атлас:** прямая адресация по номеру image (как фон): `kid[img>>5]`, - idx `img&31`; ~7 EMM-страниц (или SHIFT=4). Свой пакер `pop_pack_kid.py` - (переиспользовать код `pop_pack_bg.py`). - -### 2.1 РЕШЕНИЕ ДО СТАРТА: per-frame offset vs padding - -Кадры Kid — РАЗНОГО размера, а `sprite_t` рисует от угла фикс. w/h. Два -пути (см. PORT_PLAN §6.1, `memory/png_strip_padding_tradeoff`): -- **Padding** (bottom-center) — просто, но 219×53×35 ≈ 406 КБ (раздув ×2.3). -- **Per-frame offset** — хранить XCO/YCO кадра (у оригинала он и есть, - `APPLEII_RESOURCE_FORMAT §2.2`), рисовать `blit(x+xco, y+yco)`; паддинг не - нужен, память по факту (177 КБ). Требует лёгкого расширения хранения - (offset рядом с кадром) ИЛИ ручного смещения в коде рендера Kid. -**Рекомендация:** per-frame offset — оригинал так и делает (frame_table dx/dy -+ image XCO/YCO), даёт точное позиционирование И экономию. Хранить xco/yco -в нашей копии frame_table (добавить 2 байта/кадр — ~360 Б). Не тянуть -расширение `sprite.h` — рисовать Kid прямым `gfx_blit(x+xco, y+yco, img)` -(как фон), НЕ через retained `sprite_t`, раз позиция и кадр всё равно -задаются вручную каждый тик. - ---- - -## 3. Данные для порта (объём) - -- `frame_table_kid` → C-массив ~180×(5+2 offset) ≈ 1.3 КБ (const, ROM). -- `seqtbl` (нужные последовательности) → C-массив байт. Весь seqtbl ~1-2 КБ; - для Фазы 1 можно взять только платформинг-последовательности (вырезать - бой/гардов 55-92) — оценить после разметки. JMP-адреса пересчитать под - свою базу. -- Спрайты — атласы (EMM, не W2). - ---- - -## 4. Фазы работы (по твоему списку, порядок по зависимостям) - -**Фаза K0 — конвейер спрайтов + отрисовка одного кадра** -- `pop_pack_kid.py`: 219 (или подмножество) → `kid*.atl` + `kid.pal` - (слоты 0x70), таблица кадр→image + xco/yco. -- Отрисовать Kid ОДНИМ кадром (stand) в SprPoP поверх фона на верном - тайле — проверить палитру/позицию/прозрачность на MAME. -- Артефакт-цель: Kid стоит на уступе комнаты 1 как в `1.1-2.png`. - -**Фаза K1 — движок анимации (play_seq + frame_table)** -- Портировать `play_seq()` (интерпретатор) + `frame_table_kid` + минимальный - `seqtbl` (stand/run/turn). -- Прогнать несколько последовательностей вручную (stand→run→stop) — - проверить, что кадры и смещения совпадают с оригиналом (сверять с - SDLPoP/скриншотами, тайминг 50 Гц). - -**Фаза K2 — управление на месте + ходьба (твои а, б)** -- `control_kid` подмножество: stand (2), run (1/84/13), turn (5/6), - standing_jump (3), crouch (50/49), safe_step (29-44 — аккуратный шаг). -- Held-state через `kbd_raw` (готово). - -**Фаза K3 — коллизия с картой (твой п.3)** -- `check_on_floor`/`start_fall` — падение в ямы (тип тайла под ногами из - `fg[]`); `in_wall`/стоп у стены; `fell_out` (край экрана — пока без - перехода комнат). -- Падения/приземления (seq 7/17/19/20) + `fall_accel/fall_speed`. - -**Фаза K4 — прыжки и повисание (твои а-прыжок, в)** -- run_jump (4), jump_up (28/14), grab (8/16/24), climb_up (10)/down (68), - hang (25/6), release (11/23). Это самый «PoP-овый» кусок — сверять - дистанции/тайминг с оригиналом (не на глаз). - -**Фаза K5 — прочее (твой г)** -- drink (78), level_door (70), crouch_hop (79), spiked/loose/chomped - (ловушки, если тайлы есть в комнате), death (71). - -Бой (меч, seq 55-92, стражники — seg005) — ВНЕ этого плана (отдельная фаза -полного приложения, PORT_PLAN §7 Фаза 3). - ---- - -## 5. Риски/решения ДО кода (правило defer_unexplained_quirks) - -1. **Per-frame offset** (§2.1) — решить до K0 (влияет на формат данных). - Рекомендация: xco/yco в frame_table, прямой blit. -2. **seqtbl rebasing** — JMP-адреса абсолютные (SEQTBL_BASE 0x196E); при - порте пересчитать в оффсеты своего массива. Проверить на 1-2 seq. -3. **Тайминг** — оригинал (DOS) фиксированный тик; наш 50 Гц. Если - логическая частота кадров иная — пересчёт dx/dy (PORT_PLAN §8.4). - Сверять дистанцию бега/прыжка с эталоном. -4. **Число реально нужных кадров/последовательностей** для Фазы 1 — - разметить (вырезать бой/катсцены/гардов), чтобы не тянуть все 219 - спрайта и весь seqtbl. -5. **Копирайт графики Kid** — подтверждено решение пользователя (§вводная). - ---- - -## 6. Что переиспользуем (готово) - -- Фон комнаты (`pop_bg.c`) — Kid рисуется ПОВЕРХ (сейчас — прямым blit; - heal против фона — когда/если понадобится через RAM-копию, фон её уже - заполняет, `GFX_BANK_TRANSPARENT`). -- `kbd_raw` held-state (§2 PORT_PLAN) — готов и проверен. -- Пакер спрайтов/палитра (`pop_pack_bg.py`) — шаблон для `pop_pack_kid.py`. -- Разобранная карта комнаты (`fg[]/bg[]`, level.h) — для коллизий. -- `gfx_blit`/`gfx_w0_map` из W0-атласа — проверенный путь (bgtest/SprPoP). diff --git a/applications/SprPoP/docs/PORT_PLAN.md b/applications/SprPoP/docs/PORT_PLAN.md deleted file mode 100644 index 9af3f17..0000000 --- a/applications/SprPoP/docs/PORT_PLAN.md +++ /dev/null @@ -1,555 +0,0 @@ -# Prince of Persia на ZX Sprinter — план порта - -## СТАТУС (обновлено 2026-08-01) - -Документ составлен 2026-07-15 как план «с нуля» и с тех пор во многом -исполнен. Читать его надо так: - -| Раздел | Что с ним сейчас | -|--------|------------------| -| §1 возможности библиотек | актуально как обзор, но **спрайтовый движок `sprite.h` для персонажей НЕ используется**: Kid/страж рисуются прямыми блитами атласов (`gfx_blit_cols_part*`) с ручным heal — так требует модель оригинала (§6) | -| §2 held-state клавиатуры | **сделано** (`kbd_mod_state`, ``). Открытая проблема — потеря байт при аккордах Shift+стрелка; диагноз и план в `../PoP/SprPoP/TASKS_CLOSED.md` (KBD-1) | -| §3 форматы данных | актуально; уровень читается живьём (`src/pop_level.c`) | -| §4 стратегия фона | **сделано** — тайловый рендерер в рантайме (`src/pop_bg.c`) | -| §5 PoC | **закрыт и превзойдён.** `poc/` (плейсхолдер-персонаж) — история; активная разработка ушла в `SprPoP/` с настоящей графикой | -| §6 модель движения | **сделано**: `play_seq` + `frame_table` оригинала, не физика с нуля | -| §7 фазы | см. отметки статуса прямо в разделе | -| §8 риски | п.1 закрыт, п.3 закрыт (28 страниц-атласов Кида), п.2/п.4 — см. отметки в разделе | -| §10 режим памяти | **сделано и переросло план**: `huge` + четыре банка кода; актуальная раскладка — `layout_plan_v2.md` | - -**Где смотреть текущее состояние, а не план:** `../SprPoP/README.md` -(что играется), `../TASKS_OPEN.md` (что в работе), `levels_plan.md` -(следующие уровни), `layout_plan_v2.md` (раскладка кода по окнам и банкам). - ---- - -Опирается на -`APPLEII_RESOURCE_FORMAT.md` / `MSDOS_RESOURCE_FORMAT.md` / `README.md` в -этой папке, на текущий sprinter-cc/libc/libbgi (см. §1) и на локальные копии -`applications/PoP/SDLPoP` (github.com/NagyD/SDLPoP, GPLv3) и -`applications/PoP/PR` (github.com/NagyD/PR, GPLv2) — используются только как -справочник по структурам/константам оригинального движка и как источник -готовых распакованных ассетов (`SDLPoP/data/`), не как код для копирования. - ---- - -## 1. Что уже есть в sprinter-cc и библиотеках (используем как есть) - -Собрано из `docs/TODO.md`, `docs/libc-reference.md`, `docs/sprite-api-design.md`, -`libbgi/include/{gfx.h,sprite.h,graphics.h}`, `examples/rpgwalk`. - -- **Графика 320×256×256** (`GFX_MODE_320x256x256`, режим 0x81) — разрешение и - глубина цвета совпадают почти впрямую с VGA-ассетами оригинала - (`SDLPoP/data/VPALACE`, `VDUNGEON` — уже 256-цветные PNG). Не нужно ужимать - в EGA/CGA палитру. -- **BGI-слой** (`graphics.h`) — примитивы, палитра, текст, `getimage/putimage` - — Фазы 1-2d готовы и проверены в MAME. -- **Спрайтовый движок v2** (`sprite.h`, ветка `sprite-engine-v2`) — ровно то, - что нужно персонажам PoP: - - retained-модель (`sprite_update`/`sprite_flip`, double-buffer, dirty-биты, - heal+blit за один проход); - - кадровая анимация по ленте (`sprite_anim`, LOOP/PINGPONG/ONCE, - горизонтальная/вертикальная лента) и tween-перемещение - (`sprite_moveto`, DDA без knowledge-heavy арифметики); - - Y-сортировка слоями (`gfx_sprite_ysort`, `layer`) — то, что нужно для - «Кид перед/за стражником» без ручной пересортировки; - - атласы в EMM-страницах (`atlas_t`/`atlas_load`) — на восьмерых - персонажей в `rpgwalk` уже работает: прямой прецедент для Кида/стражника; - - ограничение кадра ≤ 64×64 — с запасом (см. §3: кадры Кида в оригинале - ~12-30 × 39-42 px). -- **Frame pacing** (`gfx_set_fps_div`) + цепочка кадровых IRQ — стабильный - логический тик независимо от рендер-нагрузки экрана (проверено MAME). -- **EMM-бюджет**: ~3.3 МБ свободно на старте (`memory/sprinter_emm_budget`) — - с большим запасом на все спрайт-атласы и предрендеренные фоны комнат (см. - §4) даже без выгрузки неиспользуемых уровней. -- **Файловый ввод-вывод** (FILE* v2, `fopen/fread/...`) — для загрузки - уровней/атласов/палитр с дискеты, по образцу `rpgwalk` (`atlas_load`, - `gfx_pal_fload`). -- **Клавиатура (событийная)** — `kbhit/getch/getkey` (ASCII + `KEY_*` скан-код - для стрелок), см. §2 — это НЕ то, что нужно для управления Кидом один в - один (см. ниже). -- **Звук** — `cbl.h` (потоковый CBL/COVOX, callback-модель, verified MAME) — - подходит для оцифрованных эффектов (`digisnd*.dat` — PC-звук - ~11 кГц 8-бит, см. `MSDOS_RESOURCE_FORMAT.md` §4). - -Вывод: **движок отрисовки и анимации почти не требует нового кода** — -самый близкий по духу пример (`rpgwalk`: атласы, анимация, tween, дабл-буфер, -FPS-делитель) переносится на PoP почти без изменений архитектуры. - ---- - -## 2. Единственный принципиальный пробел: удержание клавиш - -**Спайк проведён (2026-07-15), вопрос закрыт артефактами — не догадкой.** - -`getch`/`getkey` — это события ESTEX WAITKEY/SCANKEY (по нажатию), без чёткой -информации о СОСТОЯНИИ (что зажато прямо сейчас, несколько клавиш -одновременно). Prince of Persia на управлении требует именно состояния: -держать направление (бег) + одновременно нажать вверх (прыжок вперёд), держать -Shift (модификатор) + направление и т.д. - -### 2.1 Находки - -1. **`docs/converted/ProgrammerManual.txt` документирует функцию, которую мы - раньше пропустили: `CTRLKEY` (ESTEX $33h)** — «Получить состояние - клавиатуры». Дословно: «данные берутся не из буфера клавиатуры (как в - остальных функциях), а непосредственно из результатов ПОСЛЕДНЕГО - сканирования» — то есть это НАСТОЯЩЕЕ live-state, не событие. Но - покрывает только модификаторы: Left/Right Shift, Ctrl, Alt, - Rus/Lat, Num/Scroll/Caps Lock, Insert (не обычные клавиши вроде стрелок). - Готовое решение для «держать Shift = бежать» — тривиальная обёртка, - без архитектурных рисков. -2. Для ОБЫЧНЫХ клавиш (стрелки, буквы) такого live-state нет нигде в ESTEX — - `WAITKEY`/`SCANKEY`/`TESTKEY` ($30/$31/$37h) — все три отдают ОДИНАКОВЫЙ - формат «очередное нажатие», без release. `TESTKEY` не удаляет событие из - буфера (полезно для «подсмотреть, не потребляя»), но это тоже разовое - нажатие, не состояние. -3. Автоповтор клавиатуры (typematic) не годится как замена held-state: - `MAME_MCP_GUIDE.md` фиксирует задержку до первого повтора ~1 секунда - (типично для PS/2) — на порядок медленнее кадра (20 мс), не подходит для - платформера. -4. **Решающий артефакт — `libc/irq/_irq_tramp.c` (сам трамплин прерывания, - не гипотеза):** вектор 0xFF общий для кадра/клавиатуры/CBL. Ветка - клавиатуры (бит 0 порта 0x19 = SIO-A RR0 «байт принят») делает буквально - `jp 0x0038` (прямиком в DSS) **до какого-либо чтения порта данных 0x18 И - до нашей кадровой цепочки (`_irq_chain`)** — наш `irq_chain_add` - вообще не видит клавиатурные прерывания, они физически не доходят до - цепочки (см. `tr_notkbd`/`tr_frame` разбор в файле). Значит текущая - инфраструктура (тот же механизм, что несёт FPS-делитель) НЕ дает - зацепки для клавиатуры без правки самого трамплина. -5. Регистр данных SIO (порт 0x18) — аппаратный приёмный буфer, чтение - деструктивно (дёргает байт из очереди); кто прочитал первым, тот и - владеет байтом. Значит «подглядеть, не мешая DSS» технически - невозможно — необходимо либо совсем не трогать этот путь (статус-кво), - либо взять его СЕБЕ полностью на время геймплея. - -### 2.2 Рекомендация (конкретная, не три равнозначных варианта) - -**A. Тривиально, почти без риска — обернуть `CTRLKEY` ($33h)** отдельной -функцией (например `kbd_mod_state()` в ``) — даёт настоящий -held-state для Shift/Ctrl/Alt. Можно делать хоть сейчас, не архитектурное -решение. - -**B. Для обычных клавиш (стрелки и т.д.) — по прецеденту CBL.** В -`_irq_tramp.c` уже есть пример «приватного» пути на том же векторе 0xFF, -который сознательно НЕ чейнится к DSS (CBL: бит 7 порта 0xFE, свой -хук `_irq_cbl_hook`, полный сейв, свой `reti`). Предлагаемый новый -компонент `` — симметричный: ветка по биту 0 порта 0x19 читает -порт 0x18 САМА (декодирует PS/2 make/break, `0xF0`-префикс — протокол -уже задокументирован в `docs/samples/sprinterKeybLib.asm`), ведёт битовую -карту «клавиша N зажата», и НЕ прыгает в DSS, пока путь активен — -жизненный цикл `kbd_raw_open()`/`kbd_raw_close()` один в один как у -`cbl_open`/`cbl_close`. - - **Важное следствие (сообщить пользователю явно, не прятать):** пока - `kbd_raw_open()` активен, DSS вообще не получает клавиатурных байт — - `kbhit/getch/getkey/CTRLKEY` заведомо не будут работать, ESC для выхода - в DSS-смысле тоже (нужно проверять raw-битовую карту самим). Это - нормально для активной фазы геймплея (у самой игры и так свой цикл - ввода), но означает: экраны/паузы, которым нужен ESTEX-ввод (например, - диалог сохранения через `fopen`, если тот когда-либо потребует ввода - с консоли), должны на это время `kbd_raw_close()`. - -**Не рекомендую вариант «таймаут-эвристика поверх SCANKEY»** — after -находки о typematic-задержке ~1с он не даёт нужной задержки для игры; -рекомендация A+B закрывает потребность без компромиссов. - -**Статус: A+B РЕАЛИЗОВАНЫ (2026-07-15, по согласованию с пользователем).** - -- A: `kbd_mod_state()` — `libc/conio/kbd_mod_state.c` + `` - (`KBD_MOD_*`). -- B: `` (`libc/kbd/`) + правка `libc/irq/_irq_tramp.c` - (новая ветка на бите 0 порта 0x19: raw активен → сама читает порт - 0x18, декодирует make/break, НЕ чейнится к DSS; raw выключен — - поведение как раньше, без изменений). Трамплин вырос со 150 до - 220 байт — `_IRQ_TRAMP_BUF_SIZE` поднят с 224 до 288 (было 4 байта - запаса, стало ≥60). `make -C libc` (fast+safe) — чисто. -- **Верификация в MAME** (`tests/kbdraw`, полный цикл open→держать→ - отпустить→ESC-выход→close): `KBD_LEFT` (0x16B, расширенный код - E0 6B) — down на нажатие, up на отпускание, ТОЧНО совпало с - константой из ``; `KBD_ESC` (0x76, обычный код) — - корректно закрыл raw-канал и вернул DSS (`IM` вернулся в 1). - Побочно найдено и задокументировано в `docs/libc-reference.md` - (``): MAME-мостовой `press_key` дёргает ОБЕ клавиатуры - (PC+ZX) одновременно и через ZX-путь давал паразitный незатухающий - бит — не относится к реальному сценарию (пользователь подтвердил: - матрица на Sprinter давно не используется), но означает, что - будущие MAME-тесты этой функции надо гонять через `:kbd:ms_naturl:*` - напрямую, не через удобный `press_key`. UP/DOWN/RIGHT/SPACE/SHIFT - константы — НЕ перепроверены поштучно (тот же общеизвестный - стандарт PS/2 Set 2, что и подтверждённые LEFT/ESC — проверить перед - использованием в PoC, если управление будет ощущаться неверно). -- На реальном железе — не проверено (только MAME). - ---- - -## 3. Формат данных — что напрямую переносим из docs/*RESOURCE_FORMAT.md - -- **Уровень** (`BLUETYPE`/`BLUESPEC`/`LINKLOC`/`LINKMAP`/`MAP`/`INFO`, - 2304 байта, 24 экрана × 30 тайлов) — читаем один раз при загрузке уровня - в свою C-структуру (прямой memcpy дампа файла, поля читаем по офсетам - из `APPLEII_RESOURCE_FORMAT.md` §1). DOS `levels.dat` даёт то же самое - +1 байт в конце записи — отбросить. -- **Графика фона/спрайтов** — кодек сжатия DOS `.DAT` не восстановлен и - восстанавливать не будем: используем уже распакованные PNG из - `SDLPoP/data/{KID,GUARD,VPALACE,VDUNGEON,...}` (см. - `MSDOS_RESOURCE_FORMAT.md` §5, §7 — тот же контейнерный формат/нумерация, - просто другой релиз сборки данных). Измерено локально: кадры Кида — - ~12×39 .. 30×42 px (P-режим, 4-бит палитра), фоновые тайлы подземелья — - 32 px по ширине (10 колонок × 32 = 320 — сходится с шириной экрана), высота - тайла 20/60/62 px (неоднородные ряды пола/потолка/арок) — укладывается в - лимит спрайтового движка (кадр ≤ 64×64) без всяких изменений движка. -- **Звук** — `digisnd*.dat` (PC-звук 8-бит ~11 кГц) — конвертация в сырой - PCM и проигрывание через `cbl_open`/`cbl_push_*`; `ibm_snd*.dat` (PC-спикер - тройки «частота×2Б + длительность») — тривиальный бипер, не требует CBL. - MIDI-семейство (`midisnd`, `mt32snd`, `prince.dat`) — вне скоупа (нет - синтеза MIDI на платформе; не блокирует геймплей). - ---- - -## 4. Стратегия фона — ПЕРЕСМОТРЕНО 2026-07-15: тайловый рендерер В РАНТАЙМЕ - -**Было** (первая версия плана): офлайн-склейка каждой комнаты в готовую -растровую картинку 320×~193, `gfx_blit` целиком при входе — обоснование -было «ноль нового кода в libbgi». Пересчёт по факту наличия структурных -данных комнаты (§3.4 формата, `level.h`) показал: 16 уровней × 24 комнаты × -~60-80 КБ/картинка — это **30+ МБ**, при том что одна и та же картинка -тайла (пол/стена/колонна) переиспользуется в десятках комнат — офлайн- -склейка печёт её заново в каждую копию. - -**Стало**: тайлы — переиспользуемый набор картинок ОДИН на визуальный -стиль (не на комнату), структурные данные комнаты — компактные (60 байт: -30×foretable+30×backtable, все 16 уровней ≈ 37 КБ, см. `level.h`). -`room_draw()` (applications/PoP/poc/room.c) проходит 30 тайлов комнаты и -зовёт `gfx_blit` для каждого, читая картинку из таблицы по типу тайла -(`tile_images[TILE_TYPE]`). Итог: десятки-сотни КБ переиспользуемых -тайл-картинок на весь визуальный стиль + ~37 КБ структуры уровней — -вместо 30+ МБ. - -**Почему это НЕ бьёт по бюджету кадра**: `room_draw()` зовётся ОДИН РАЗ -при входе в комнату (смена комнаты — не every-frame событие), не в -игровом цикле — это не `sprite_update`, тактовый бюджет кадра не -затронут. - -Анимированные тайлы (факел, шипы, дверь-плита) по-прежнему рисуются как -отдельные `sprite_t` поверх фона — движок это уже умеет (Y-order/layers, -dirty-биты, heal против фона через ОЗУ-копию); `room_draw()` кладёт в -ОЗУ-копию именно статичную геометрию (пол/стены/колонны Фазы 1 — §5.2), -поверх неё heal спрайтов работает как обычно. - -`toolchain/room_compose.py` (генерик-компоновщик тайлов в одну картинку, -§6.1) остаётся полезным ИНСТРУМЕНТОМ конвертации отдельных тайл-картинок -(PNG → getimage raw), просто теперь его выход — 32 маленьких файла -`tileNN.raw` (по одному на тип тайла), а не один большой файл на комнату; -сама раскладка/повторное использование по комнатам — в C-коде -(`room_draw`), не в офлайн-склейке. - ---- - -## 5. Proof-of-Concept — цель: доказать, что порт вообще ощущается как PoP - -> **Закрыт (исторический раздел).** PoC в `poc/` свою задачу выполнил и -> дальше не развивается: управление ощущается как PoP, held-state работает. -> Всё, что ниже про плейсхолдер-персонажа и приблизительную дугу прыжка, -> — уже неправда для активной ветки: в `SprPoP/` стоит настоящая графика -> Кида и авторские таблицы кадров (§6). Раздел оставлен ради истории -> решений (в частности §5.1 — почему сначала был плейсхолдер). - -**Объём**: одна комната (например Level 1, экран старта Кида), без -переходов между экранами, без стражников (стретч-цель, не обязательна). - -**Что показываем**: -1. Кид на экране, с закреплённым офлайн-конвертированным набором кадров - (подмножество: idle, walk L/R, jump-начало/дуга/приземление, стоп-на-краю, - возможно повисание на краю) — атлас в W0-странице, по образцу `rpgwalk`. -2. Управление: держать влево/вправо — идёт; отпустил — тормозит/стоит; - нажатие вверх во время бега — прыжок вперёд (дуга по авторским таблицам - смещений, не по gravity-физике «с нуля» — см. §6). Здесь же проверяется - решение по §2 (реальный held-state). -3. Столкновения: пол/край экрана/провал — по факту чтения тайла из - `BLUETYPE` под ногами (без LINKLOC-триггеров пока). -4. Стабильный кадр 50 Гц через уже готовый `gfx_wait_vsync`/дабл-буфер - (без FPS-делителя — Кид анимируется каждый видеокадр, как в оригинале). - -**Критерий успеха**: субъективно «прыжок ощущается как в PoP» (дистанция и -тайминг прыжка сверены с оригинальными таблицами, не подобраны на глаз — -см. §6), управление отзывчивое (не событийное с задержкой), сцена не мерцает -на стыке спрайт/фон. - -**Не входит в PoC**: стражники/бой, звук, HUD/таймер, переходы между -комнатами, ловушки/триггеры, титры/меню, сохранения. - -**Расположение**: `applications/PoP/poc/` (свой sprinter-cc проект + Python -конвертер ассетов, по структуре `examples/rpgwalk`). - -### 5.1 Статус (2026-07-15) — первая итерация: управление + коллизия края - -Сделано и проверено в MAME (`applications/PoP/poc/`, `make run`): -держать LEFT/RIGHT (`kbd_raw_down`, raw-канал из §2) — идёт непрерывно, -отпустил — стоит на месте (не событийно, реальный held-state); -столкновение с краями экрана (клип по `MINX`/`MAXX`); анимация -ходьбы/разворота лицом по направлению (`sprite_anim` пинг-понг); -дабл-буфер + `gfx_wait_vsync` — без видимого мерцания. Сборка — -`--memory huge` без `--bank` (§10, подтверждено рабочим). - -**Важное отступление от плана (осознанно, не молча):** персонаж — -ВРЕМЕННАЯ заглушка (лицензированный спрайт-пак -`third_party/16x16-RPG-characters` через `tools/gen_kid_placeholder.py`, -тот же источник, что уже использует `examples/rpgwalk`), а НЕ -конвертированная графика оригинальной Prince of Persia. Причина: -исходный набор кадров Кида (`SDLPoP/data/KID`) — копирайт -Broderbund/Ubisoft; автоматический конвейер, который систематически -извлекает и переупаковывает его в новый формат, — это на практике -внутрипроектное решение, которое стоит принимать пользователю явно -для каждого шага, а не проводить асинхронно агентом без лишнего -подтверждения. Сама графика — не то, что проверяет PoC (§5 явно: -цель — ощущение управления/коллизий, не визуальная точность). Замена -на настоящую графику Кида — отдельный шаг, на усмотрение пользователя. - -**Ещё не сделано** (следующие итерации §5): авторские таблицы -смещений кадров (§6 — движение при ходьбе линейное, px/кадр), -реальный уровень/фон по `BLUETYPE`/`LEVEL1` (сейчас — плейсхолдер: -плоский пол на весь экран, без ямы/выступа), `kbd_mod_state`/ -Shift-бег не подключены к игровому циклу (обёртка готова с Фазы A). - -**Прыжок/присед добавлены и ПРОВЕРЕНЫ (2026-07-15)**: состояние -`jumping`/`jump_t`/`crouching`, своя приблизительная дуга прыжка -(`jump_height[]`, 40 кадров) — не авторская таблица, см. §6.1. -HUD-текст статуса (нет отдельной позы). - -Живое тестирование пользователем нашло реальный баг: держа UP чуть -дольше 0.8 с (длительность дуги), получали ДВА прыжка подряд — код -проверял `kbd_raw_down(KBD_UP)` как уровень (держится, пока клавиша -физически зажата), а не как фронт нажатия, поэтому в момент -приземления «UP всё ещё зажат» тут же триггерил новый прыжок. -Исправлено edge-detect'ом (`up_prev` — предыдущее состояние UP, -триггер только на переход 0→1). Проверено брейкпоинтом в отладчике -MAME на адресе входа в код прыжка: за одно длинное удержание UP -брейкпоинт срабатывает РОВНО ОДИН РАЗ — фикс подтверждён на уровне -кода, не только «на глаз». - -Побочный урок (см. `docs/libc-reference.md` ``): моя -более ранняя попытка проверить UP/DOWN/RIGHT по скриншотам после -`press_key` ошибочно решила, что скрипт их не нажимает вообще — -на самом деле нажимает исправно, просто скриншот ловил случайный -момент дуги. Брейкпоинт/watchpoint на конкретный адрес кода — -надёжнее скриншота для таких проверок. - ---- - -## 6. Модель движения: авторские таблицы кадров, не физика с нуля - -Оригинальный движок PoP не считает прыжок как непрерывную физику -(gravity/velocity каждый тик) — движение персонажа задано таблицами кадров -анимации, где у части кадров зашито фиксированное смещение (dx, dy) для -ЭТОГО конкретного кадра последовательности (структура видна и в -исходниках Apple II — `SEQTABLE.S`/`MOVER.S`, и в SDLPoP `seg003.c`/`seq*` -таблицах). Практическое следствие для нашего движка: -- **Не использовать** `sprite_anim`/`sprite_moveto` для основного - персонажа как есть (они лианейно тянут по таймеру/тянут к линейной - цели) — вместо этого приложение само на каждый логический тик: - переключает кадр (`sprite_frame`, атлас как лента поз, не «прогрессия - первый..последний» автоматом) и одновременно применяет dx,dy ЭТОГО - кадра к позиции (`sprite_move`). -- Готовая автоматика движка (`sprite_anim`/`sprite_moveto`/tween, - Y-сортировка) остаётся полезной для декоративных/фоновых элементов - (факелы, патрулирующий стражник вне боя — почти один в один паттерн - `rpgwalk`). -- Источник таблиц смещений: переснять из `Prince-of-Persia-Apple-II/01 POP - Source/Source/{MOVER.S,SEQTABLE.S,FRAMEADV.S}` и/или - `SDLPoP/src/seq*.c` — задача Фазы 1 полной реализации (§7), не PoC - (для PoC можно взять урезанный набор смещений вручную по количеству - пикселей на кадр, посчитанному по видео/скриншотам оригинала, и уточнить - позже). - -### 6.1 Инструмент конвертации кадров разного размера (`toolchain/png_strip.py`) - -Кадры персонажа в оригинале — РАЗНОГО размера каждый (bbox зависит от -позы; `sprite_t` нашего движка (`libbgi/include/sprite.h`) хранит ОДИН -фиксированный w/h на весь спрайт и рисует от угла, без per-frame -смещения — в отличие от оригинала, где на каждый кадр было своё XCO/YCO -(`APPLEII_RESOURCE_FORMAT.md` §2.2). `toolchain/png_strip.py` (генерик, -не завязан на PoP — принимает произвольный список PNG) закрывает это -ПАДДИНГОМ: канвас = макс. w/h среди кадров ленты, якорь по умолчанию -bottom-center («ноги на месте»), остальное — прозрачность. - -**Компромисс, не полноценное решение**: один сильно выбивающийся по -размеру кадр в ленте раздувает канвас (и память) ВСЕХ кадров этой же -ленты. Смягчается группировкой по похожим размерам в отдельные атласы -(не одна лента на все позы актора — так уже сделано для ходьбы отдельно -от прыжка). - -**Полноценное решение (кандидат в будущее расширение библиотеки, НЕ -делать без предложения и подтверждения пользователя)**: per-frame -смещение в `sprite_t` (аналог XCO/YCO оригинала) — тогда паддинг -не нужен вообще, экономия памяти по полной. Делать только если память -станет РЕАЛЬНОЙ проблемой (не гипотетической) — тогда предложить как -отдельную правку `sprite.h`/движка. Подробности компромисса — -memory/png_strip_padding_tradeoff. - ---- - -## 7. Полноценное приложение — фазы (после PoC) - -Порядок — по риску и зависимостям, не по геймплейной важности. -**Отметки статуса — на 2026-08-01.** - -**Фаза 0 — инфраструктура порта** — **СДЕЛАНА**, но иначе, чем задумано: -- Хелд-стейт клавиатуры по §2 — сделан. -- Конвертер уровней не понадобился: `res200N.bin` из `SDLPoP/data/LEVELS` - кладётся на образ как есть и читается по офсетам в рантайме - (`src/pop_level.c`), уровень живёт в EMM-странице. -- Конвертер фона в растры **отменён осознанно** (§4): фон собирается - тайлами в рантайме. Спрайты — `toolchain/pop_pack_bg.py` / - `pop_pack_kid.py` / `pop_pack_guard.py` → атласы `.atl` (Kid — 28 - страниц, риск §8 п.3 закрыт). - -**Фаза 1 — Кид, полный набор действий** — **СДЕЛАНА**: стоять/идти/бежать/ -тормозить/разворот/прыжки/повисание/подтягивание/спуск/приседание/ -осторожный шаг/питьё зелья/смерть от провала и от пик; переходы между -комнатами во все четыре стороны. Осталось: **старт по данным уровня** -(`pop_level_start_*` реализованы, но не подключены) — задача L1-START в -`../TASKS_OPEN.md`. - -**Фаза 2 — мир и ловушки** — **СДЕЛАНА**: кнопки/ворота через -`LINKLOC`/`LINKMAP`, шипы, loose-полы (тряска, обрушение, щебень, пробой -потолка), зелья, дверь уровня (открывается), факелы. Подробности и -справочник — `gates_spikes_plan.md`. - -**Фаза 3 — бой** — **СДЕЛАНА в объёме обычного стражника**: подбор и -выхватывание меча, стойка, удар/парирование, коллизия клинков, HP обеих -сторон, смерть; ИИ стража (замечает Кида, подходит, боевые ветки), -персистентность трупа между комнатами. - -**Фаза 4 — разнообразие противников** — **НЕ НАЧАТА**. Скелет нужен на -уровне 3, толстый — на 6, тень — на 12, визирь — на 13; привязка -«уровень → тип стража» (`tbl_guard_type`) описана в `levels_plan.md` §1. - -**Фаза 5 — звук** — **НЕ НАЧАТА**: CBL-эффекты (шаги, удары, двери, -падение) из `digisnd*.dat`→PCM; PC-спикер тройки (`ibm_snd*.dat`) как -опциональный дешёвый бипер без CBL, если формат подтвердится простым -парсингом. Опкод `SOUND` в `play_seq` пока просто съедает свой аргумент — -точки вызова уже на месте. - -**Фаза 6 — оболочка** — **НЕ НАЧАТА**: титры, меню/выбор уровня, HUD -(таймер/жизни), сохранение прогресса (FILE*), финальные катсцены — по -минимуму, геймплейно не критично. Полоса HP — единственное, что уже есть. - -**Между Фазами 4 и 5 вклинивается то, чего в этом плане не было: -переход между УРОВНЯМИ** (загрузка следующего уровня, второй тайлсет -palace, потабличные различия уровней). Отдельный документ — -`levels_plan.md`. - -**Фаза 7 — стабилизация**: полный прогон всех 14 уровней в MAME -(`mame_interactive.py`), затем на реальном железе; профилирование бюджета -кадра по методике `sprite_engine_perf`/`sprite-api-design.md` §9д на самых -насыщенных экранах (несколько стражников + ловушки одновременно — -проверить лимит ~21 спрайт/кадр и Y-sort лимит 32); при необходимости — -банкинг (`--memory big/huge`) для кода/уровня, если размер вылезет за -tiny/small. - ---- - -## 8. Риски, требующие спайка/артефакта до架构 решений - -(по правилу `defer_unexplained_quirks` — не гадать, проверять) - -1. ~~**Held-state клавиатуры** (§2)~~ — **закрыт** (``). Открытый - остаток — не «есть ли held-state», а потеря байт при аккордах - Shift+стрелка: `../PoP/SprPoP/TASKS_CLOSED.md`, KBD-1. -2. **Бюджет кадра** — риск подтвердился, но не в том виде, в каком ожидался: - спрайтовый движок для персонажей не используется, поэтому лимит - «~21 спрайт/кадр» неприменим. Реальный бюджет упирается в heal+блиты и - перерисовку тайлов; замер 2026-07-30 — типичный кадр ~371 К тактов - (~86 % периода). Инструмент замера уже в коде: полосы бордюра `PROF()` - в `sprpop.c`. План выжимания — `../PoP/SprPoP/TASKS_CLOSED.md` (CLIP-1) и - `../BUGS_OPEN.md` (T-1/T-2). -3. ~~**Ёмкость атласа на актора**~~ — **закрыт**: Kid разложен на 28 - атласов-страниц по 8 спрайтов (`pop_pack_kid.py`), страж — на 5; - мульти-страничного формата `.atl` не потребовалось. Побочно - подтвердился компромисс паддинга (§6.1). -4. **Тайминг оригинала** — **ОТКРЫТ, и сверка 2026-08-01 показывает - расхождение.** Цифры оригинала (SDLPoP): базовый таймер `BASE_FPS = 60` - (`types.h:1373`), логический кадр игры — `base_speed = 5` тиков - (`data.h:869`), то есть **83.3 мс (12 лог. кадров/с)**; в бою - `fight_speed = 6` → **100 мс (10/с)**. У нас (`sprpop.c`) — три - ожидания `gfx_wait_vsync()` на итерацию, то есть **60 мс (16.7/с)** и - без отдельной скорости боя. Значит **игра идёт примерно на 39 % - быстрее эталона**. Точное соответствие даёт 4 ожидания vsync (80 мс - против 83.3) и 5 в бою (100 мс — совпадает точно). - Проверять не «на глаз», а секундомером по одинаковому отрезку - (SDLPoP рядом на том же экране), и только после того, как кадр - перестанет иногда вылезать за период (см. п.2) — иначе замедление - спрячет проблему бюджета вместо того, чтобы её показать. - ---- - -## 10. Режим памяти сборки - -Пользователь предложил `huge` (горячий код в W1, данные в W2, редко -вызываемая логика — банками в W3) как целевой режим. Согласен, с уточнением -по срокам принятия решения. - -**`huge` — правильная цель для ПОЛНОГО приложения**, но не то, с чего надо -стартовать: - -- Layout `huge` (см. `memory_modes_implemented`): CODE_LOC=0x4100 (W1), - DATA_LOC=0x8000 (W2), банки — W3 (порт 0xE2), `crt0_banked` + - автодетект W2 (как `small`). Состояние приложения (структуры Кида, - уровня, массив `sprite_t`) остаётся в обычном W2-heap ДАЖЕ если код, - который его трогает, забанкован — `malloc` из банка возвращает - W2-указатель (`bank_local_data_pattern`), так что данные не привязаны к - конкретному банку. -- Оверхед `__banked`-вызова (trampoline: +3 байта на стеке между ret и - аргументами, виртуальный 24-битный адрес, см. `sdcc_banking`) — фиксированная - небольшая цена ЗА ВЫЗОВ, не за такт. Это не страшно для функций, которые - вызываются РЕДКО за кадр (AI одного стражника, диалог, переход между - комнатами) — страшно было бы забанковать что-то, что дёргается ВНУТРИ - горячего цикла отрисовки (там уже и так основной бюджет уходит на - `sprite_update`/блиты — см. `sprite_engine_perf`, ~19.5К тактов/спрайт). - Правило простое: **не банковать код на пути "раз в кадр на объект", - банковать код на пути "раз в кадр на комнату/раз в переход/раз в - редкое событие"**: логика ИИ стражника целиком, диалоги/катсцены, меню/ - титры/выбор уровня, парсинг уровня при входе в комнату, сериализация - сохранений — хорошие кандидаты в банки; тик Кида, чтение столкновений, - вызов `sprite_update`/`gfx_wait_vsync`, обработка ввода — должны остаться - небанкованными (W1/W2). -- Гранулярность банкования — целый файл (`--bank N=FILE.c`), это уже - системный паттерн проекта (тот же принцип, что и «1 файл = 1 юнит DCE» в - libc) — значит выгодно с САМОГО начала Фазы 1 (не задним числом) резать - исходники приложения по границе «горячее/холодное» файл-в-файл: например - `kid_tick.c`/`collision.c`/`room.c`/`input.c` — неизменно вне банков; - `guard_ai_*.c`/`dialogue.c`/`menu.c`/`levelload.c`/`combat.c` — кандидаты - под `--bank`. Тогда переход на `huge` позже — это правка Makefile/ - sprinter-cc-вызова (`--memory huge --bank N=file.c ...`), а не рефакторинг - логики. - -**Уточнение (проверено в `bin/sprinter-cc`, строки ~342-350): можно сразу -собирать PoC на `--memory huge` без единого `--bank`.** Скрипт сам -подставляет стаб `const unsigned char n_banks = 0;`, когда `--bank` не -передан ни один раз — `crt0_banked` линкуется и корректно пропускает цикл -загрузки банков при старте. Layout при этом byte-в-byte совпадает с тем, -что делает `crt0_small` для режима `small` (CODE 0x4100/W1, DATA 0x8000/W2, -автодетект W2) — разница только в том, что попутно линкуется сам -`bank.s` (таблица `_bank_pages` + trampoline-инфраструктура), это -незначительный довесок к размеру, не к рантайм-цене. Значит **PoC можно -сразу собирать вызовом `sprinter-cc --memory huge` без `--bank`-флагов** — -и когда в полном приложении появятся первые «холодные» файлы, переход на -банкование — это просто добавление `--bank N=file.c`, без смены -`--memory`/адресов/crt0. Сборочная конфигурация не потребует миграции -между PoC и полным приложением. - -Единственное, что стоит сделать уже в Фазе 1 полного приложения (не в -PoC) — планировать структуру исходников с расчётом на будущий файл-в-файл -сплит под банки (см. выше), раз гранулярность банкования — целый файл. - ---- - -## 9. Что нужно от пользователя, прежде чем двигаться дальше - -- Подтверждение направления по §2 (какой из трёх вариантов held-state - клавиатуры пробовать первым, или сначала спайк-эксперимент в MAME). -- Подтверждение объёма PoC (§5) — устраивает ли «одна комната без - стражников», или сразу закладывать хотя бы одного патрулирующего - стражника (это не архитектурно сложнее — Y-order и tween уже есть, - просто больше конвертации ассетов). diff --git a/applications/SprPoP/docs/PoP/APPLEII_RESOURCE_FORMAT.md b/applications/SprPoP/docs/PoP/APPLEII_RESOURCE_FORMAT.md deleted file mode 100644 index a08fed1..0000000 --- a/applications/SprPoP/docs/PoP/APPLEII_RESOURCE_FORMAT.md +++ /dev/null @@ -1,283 +0,0 @@ -# Формат ресурсов Prince of Persia (Apple II, оригинальные исходники 1989) - -Источник — официально опубликованные Джорданом Мехнером исходники -(`Prince-of-Persia-Apple-II/`, 6502-ассемблер). В отличие от DOS-версии, здесь -формат восстановлен **напрямую по коду**, а не по догадкам о байтах — -уверенность высокая везде, где указана ссылка на конкретный файл/строки. - ---- - -## 1. Формат уровня (`01 POP Source/Levels/LEVEL0`…`LEVEL14`, 2304 байта) - -Файлы уровня — это побайтовый дамп структуры `blueprnt`, которая грузится по -фиксированному адресу `$b700` (`EQ.S:28`) и объявлена как `dum blueprnt` в -`EQ.S:258-266`. Никакого отдельного заголовка файла нет — это чистый образ -структуры в памяти: - -| Поле | Размер | Смещение в файле | Описание | -|---|---|---|---| -| `BLUETYPE` | 720 Б | 0–719 | 24 экрана × 30 тайлов: тип объекта/тайла | -| `BLUESPEC` | 720 Б | 720–1439 | 24 экрана × 30 тайлов: доп. байт состояния объекта | -| `LINKLOC` | 256 Б | 1440–1695 | Таблица связей нажимных плит/дверей, часть 1 | -| `LINKMAP` | 256 Б | 1696–1951 | Таблица связей, часть 2 | -| `MAP` | 96 Б | 1952–2047 | 24 экрана × 4 байта: граф соседних экранов | -| `INFO` | 256 Б | 2048–2303 | Метаданные уровня: старт Кида, стражников и т.д. | - -Сумма: 720+720+256+256+96+256 = **2304** — точно совпадает с размером файла, -что подтверждает: это чистый дамп структуры, без обёртки. - -### 1.1 Сетка тайлов (`BLUETYPE` / `BLUESPEC`) - -Каждый экран — ровно **30 тайлов** (10 столбцов × 3 ряда): подтверждено -таблицами `BlockTable`/`BlockEdge` (`TABLES.S:74-154`) и логикой перехода -между экранами в `CTRLSUBS.S:218-234` (при переходе через край экрана -`tempblockx` меняется на ±10, `tempblocky` — на ±3). - -Функция `CALCBLUE` (`GRAFIX.S:1757-1784`) вычисляет для экрана 1–24: -`BlueType = blueprnt + (screen-1)*30`, `BlueSpec = BlueType + 24*30`, -используя таблицу `Mult30` (`TABLES.S:131-140`). - -Байт `BLUETYPE` упакован битовыми полями (`EQ.S:484-486`): - -``` -бит 7-6: secmask (%11000000) — назначение не установлено по доступному коду - (возможно, служебное поле редактора) -бит 5: reqmask (%00100000) — флаг "необходимая опорная плитка" - (проверяется в BREAKLOOSE, MOVER.S:395-397) -бит 4-0: idmask (%00011111) — тип тайла/объекта, 0-29 -``` - -Перечень 30 типов объектов (`MOVEDATA.S:8-37`): - -``` -0 space 8 pillarbottom 16 exit 24 window2 -1 floor 9 pillartop 17 exit2 25 archbot -2 spikes 10 flask 18 slicer 26 archtop1 -3 posts 11 loose 19 torch 27 archtop2 -4 gate 12 panelwof 20 block 28 archtop3 -5 dpressplate 13 mirror 21 bones 29 archtop4 -6 pressplate 14 rubble 22 sword -7 panelwif 15 upressplate 23 window -``` - -Проверено вручную на дампе начала `LEVEL1` (`00 00 00 21 01 21 21 21 34 34 -33 33 21 23 00 34 14 14 14 34 14 34 34 2e 23 0b 01 21 34`) — например, -`0x33 → id=0x13=19 (torch)`+reqmask, `0x34 → id=20 (block)`+reqmask — -декодирование по таблице сходится чисто. - -`BLUESPEC` — доп. байт, чья семантика зависит от типа тайла (единой схемы -нет, разбирается объект-специфичным кодом): - -- **gate** (дверь, `FRAMEADV.S:2222-2234`): на диске — маленький enum (1 = - начинает открытой сверху, 2 = снизу, …), который через `initsettings` - (`FRAMEADV.S:22-23`, диапазон `gminval=0`..`gmaxval=188`, из - `MOVEDATA.S:56-57`) при инициализации уровня превращается в живой счётчик - "высоты двери" 0–188. -- **loose** (шаткая плитка, `FRAMEADV.S:2224-2237`): при инициализации всегда - принудительно обнуляется, независимо от значения на диске. -- **flask** (зелье, `FRAMEADV.S:2226,2239-2246`): значение×32 выбирает - цвет/тип зелья. -- **spikes** (шипы, `MOVER.S:365-382`, константы `spikeExt=5, spikeRet=9` в - `MOVEDATA.S:45-46`): 0 = безопасно/убраны, 1–8 — кадр анимации - выдвижения/втягивания, `$FF` = навсегда заклинило (тело наколото). -- **pressplate/upressplate** (нажимные плиты, `MOVER.S:425-464`, - `FRAMEADV.S:2059-2098`): значение — это **индекс в цепочке связей** - `LINKLOC`/`LINKMAP` (см. ниже); младшие 5 бит `LINKMAP` по этому индексу - одновременно служат счётчиком таймера плиты (0–31), определяющим - состояние "поднято/опущено". - -### 1.2 `LINKLOC` / `LINKMAP` — граф триггеров (нажимные плиты → двери и т.п.) - -Два параллельных массива по 256 байт кодируют цепочки "нажатие плиты X → -сработать объект на экране S, блок B". Восстановлено из `MOVER.S:506-537` -(цикл `trigger`) и `MOVER.S:1549-1581` (`gettimer/chgtimer/getloc/ -getlastflag/getscrn`): - -``` -LINKLOC[i]: бит 7 = флаг "последнее звено цепочки" - биты 6-5 = младшие 2 бита номера целевого экрана - биты 4-0 = номер целевого блока (0-29); $FF = "никуда не привязано" - -LINKMAP[i]: биты 7-5 = старшие 3 бита номера целевого экрана - (вместе с LINKLOC биты 6-5 → полный номер экрана 0-31) - биты 4-0 = таймер обратного отсчёта плиты (0-31, значим только - по индексу самой плиты) -``` - -`BLUESPEC` плиты хранит индекс `i` её *первого* звена; `getlastflag` идёт -вперёд (`inc linkindex`), пока не встретит бит 7 в `LINKLOC`. Сверено на -`LEVEL1`: байт по смещению 1440 (`0x89 = 10001001` → флаг конца цепочки, -целевой блок 9) и параллельно байт по смещению 1696 (`0x60 = 01100000` → -старшие биты номера экрана) — согласуется с этой раскладкой. Заполнены -реально используемые уровнем звенья, остальное — "мусорные" повторяющиеся -байты-заполнители. - -### 1.3 `MAP` — граф соседних экранов - -24 записи × 4 байта = 96 байт: для каждого экрана (1–24) -`MAP[(scrn-1)*4 + 0..3] = левый, правый, верхний, нижний соседние экраны`, -читается через `GETLEFT/GETRIGHT/GETUP/GETDOWN` (`CTRLSUBS.S:244-274`, -индексация `MAP-4..MAP-1,x` при `x = scrn*4`). Экран `0` зарезервирован как -"нет экрана" (проверка `beq ]rts` в этих же процедурах). - -### 1.4 `INFO` — метаданные уровня (256 байт, база = смещение файла 2048) - -Объявлено как `dum INFO` в `EQ.S:272-288`: - -| Смещение (от начала INFO) | Поле | Размер | -|---|---|---| -| 0 | "число экранов + 1" (используется в `SETINITIALS`, `SUBS.S:1441-1445`) | 1 | -| 1–63 | резерв/не используется | 63 | -| 64 | `KidStartScrn` | 1 | -| 65 | `KidStartBlock` | 1 | -| 66 | `KidStartFace` (направление; при загрузке инвертируется XOR `$ff`, `SUBS.S:1516-1518`) | 1 | -| 67 | заполнитель | 1 | -| 68 | `SwStartScrn` (стартовый экран меча) | 1 | -| 69 | `SwStartBlock` | 1 | -| 70 | заполнитель | 1 | -| 71–94 | `GdStartBlock[1..24]` — стартовый блок стражника на экране; **≥30 = "стражника нет"** (`AUTO.S:1832-1834`, `SUBS.S:1677-1679`) | 24 | -| 95–118 | `GdStartFace[1..24]` (86 = "стражника нет", см. `ShadFace cmp #86` по всему `AUTO.S`) | 24 | -| 119–142 | `GdStartX[1..24]` — пересчитывается заново из блока при старте уровня, значение на диске почти не используется (`SUBS.S:1674-1690`) | 24 | -| 143–166 | `GdStartSeqL[1..24]` | 24 | -| 167–190 | `GdStartProg[1..24]` — "программа"/поведение ИИ стражника | 24 | -| 191–214 | `GdStartSeqH[1..24]` — обнуляется при старте (`SUBS.S:1685-1686`) | 24 | -| 215–255 | резерв/не используется | 41 | - -Проверено на `LEVEL1`: байт по смещению файла 0x800 = `0x18`=24 (число -активных экранов = 23+1); по смещению 0x840 — `01 00 ff 00 00 00 ff 1e 1e -11 1e 1e ...` → `KidStartScrn=1, KidStartBlock=0, KidStartFace=$FF, -SwStartScrn=0, SwStartBlock=0`, далее 24 байта `GdStartBlock`, в основном -`0x1e`(30, "нет стражника"), с реальной расстановкой только на экране 3 -(`0x11`=17) и экране 23 (`0x06`) — согласуется с уровнем, где всего два -стражника. - -### 1.5 Как уровень попадает с диска (важно: имя файла — не игровой механизм) - -В рантайме нет чтения "по имени файла LEVELn" — это чисто утилита для -экспорта в этом репозитории. Реально `LOADLEVELX` (`MISC.S:795-809`) -использует фиксированные таблицы по номеру уровня `bluepTRKlst`/ -`bluepREGlst` (`MISC.S:776-787`), дающие физическую **дорожку (1-33)** и -**регион (0/1)**, затем `rdbluep` (`MASTER.S:598-616`) вызывает -низкоуровневое чтение `rw18` (`RdGrpErr`) 9 физических групп по 256 байт -(`$b7-$bf`) — 9×256=2304 байта — прямо в буфер blueprint; регион 0/1 выбирает -половину 18-секторной дорожки (два уровня делят одну дорожку). Файлы -`LEVELn` в этом репозитории — реконструкция этого сырого блока для удобства -работы с инструментами. - ---- - -## 2. Формат изображений/спрайтов (`IMG.CHTAB1-7`, `IMG.BGTAB1/2.DUN/.PAL`) - -Каждый такой файл грузится целиком по **фиксированному адресу**, заданному -константами `chtableN`/`bgtableN` (`GAMEEQ.S:9-18`): - -``` -chtable1=$6000 chtable2=$8400 chtable3=$0800 chtable4=$9600 -chtable5=$a800 chtable6=$6000 chtable7=$9f00 -bgtable1=$6000 bgtable2=$8400 -``` -— то есть смещения внутри файла один-в-один совпадают с адресами в памяти -после загрузки. - -### 2.1 Раскладка контейнера - -Восстановлено из заголовка-комментария "Image table format" в `HIRES.S:181-186`, -процедуры разрешения указателя `setimage` (`HIRES.S:263-277`) и -`GETWIDTH`/`PREPREP` (`HIRES.S:283-339`): - -``` -Смещение 0 : 1 байт — число изображений в таблице (максимум 127, - в образцах встречается 0x7f) -Смещение 1..254 : 127 × 2-байтных little-endian указателей - (указатель на изображение N — по смещению 1+(N-1)*2, - N=1..127) — АБСОЛЮТНЫЕ адреса в адресном пространстве - фиксированной загрузки этой таблицы, указывающие на - запись данных этого изображения -Смещение 255 : заполнитель (таблица указателей занимает ровно 256 байт) -Смещение 256 (база+0x100) и далее: - последовательно идущие записи данных изображений: - байт 0: ширина (в байтах на строку) - байт 1: высота (число строк) - байты 2..(2+ширина*высота-1): сырые байты пикселей, - слева направо, сверху вниз, БЕЗ сжатия -``` - -Проверено вручную на `IMG.BGTAB1.DUN`: с точной арифметикой индексов из -`setimage` (`Y = image*2 - 1`, `HIRES.S:264-267`) первые ~30 записей дают -строго возрастающую последовательность указателей `0x6101, 0x6133, 0x6159, -0x618b, 0x61c9, 0x61fb, 0x6221, 0x6313, 0x63c9, ...` — указатель -изображения #1 приходится ровно на `bgtable1 ($6000) + 0x100`, то есть точно -на конец 256-байтной таблицы указателей. Это независимо подтверждает и -размер таблицы, и семантику указателей. - -**Важно: сжатия в этом формате нет.** RLE/дельта-упаковка (`SngExpand`/ -`DblExpand`/`DeltaExpPop`/`DeltaExpWipe` в `01 POP Source/Source/UNPACK.S`) -применяется только к полноэкранным изображениям (титры/пролог/катсцены), но -не к CHTAB/BGTAB — спрайты и фоновые тайлы хранятся как чистые упакованные -байты hi-res/double-hi-res экрана Apple II, без какого-либо RLE или дельты. - -### 2.2 Параметры отрисовки (не часть файла ресурса) - -При выводе спрайта (`LAY`/`FASTLAY`/`PEEL` и т.д., `HIRES.S:658-1740`) -используются zero-page параметры `PAGE/XCO/YCO/OFFSET/IMAGE/OPACITY/TABLE/ -BANK` (описаны в `HIRES.S:155-178`): `OFFSET` (0–6) — горизontальный сдвиг на -под-байтовый пиксель, `OPACITY` выбирает режим совмещения (AND/OR/STA/XOR/ -маска-OR) плюс отдельный бит горизонтального зеркалирования (бит 7). Это -чисто рантайм-параметры отрисовки, не хранящиеся в файле ресурса. Точный -механизм барабанного сдвига для `OFFSET` (таблицы `HRTABLES.S`/`YLO`/`YHI`) -не прослежен до конца — при необходимости требует отдельного анализа. - -### 2.3 Инструмент DRAZ (авторская утилита создания спрайтов) - -В `04 Support/DRAZ` нет исходников самой утилиты DRAZ — только файлы данных -(`PAC.*` — позы персонажей, и уже скомпилированные `IMG.*`), поэтому -внутренний пайплайн DRAZ (как позы превращаются в CHTAB) напрямую не виден. -Формат контейнера выше выведен полностью из кода движка-потребителя, что -является надёжным, но косвенным источником. - -Отдельно: в игровой логике списков объектов (`ADDBACK`, `GRAFIX.S:191-214`) -встречается **рантайм-упаковка ссылки на фоновую картинку** в один байт: бит -7 выбирает `bgtable1` или `bgtable2`, биты 0-6 — номер картинки в таблице -(0-63). Это соглашение для внутриигровых списков объектов (`bgIMG` и т.п.), а -не свойство самих файлов CHTAB/BGTAB на диске. - ---- - -## 3. "Главного индекса ресурсов" не существует - -В отличие от DOS-версии (см. `docs/MSDOS_RESOURCE_FORMAT.md`), в рантайм-коде -Apple II **нет обобщённого справочника "имя ресурса → расположение на -диске"**. Расположение каждого ресурса зашито напрямую как таблицы -дорожка/группа-секторов прямо в коде загрузчика: - -- Уровни: `bluepTRKlst`/`bluepREGlst` (`MISC.S:776-787`), используются - `LOADLEVELX`/`LOADLEVEL` (`MISC.S:795-809`, `MASTER.S:467-481`). -- Альтернативные наборы фонов/персонажей: `bg1trk`/`bg2trk`/`ch4trk`/`ch4off` - (`MASTER.S:522-528`). -- Массовая загрузка при старте (chtable1-7, bgtable1-2, seqtable и т.д.): - прямые вызовы `rw18`/`RdGrp`/`RdSeq` с литеральными hex-списками - групп-секторов в `MASTER.S:1250-1360` и `BOOT.S:100-118`. - -Весь дисковый ввод-вывод идёт через нестандартный низкоуровневый драйвер -`rw18` (`rw18 = $d000`, `EQ.S:11-12`; папка `02 POP Disk Routines/RW1835`), -реализующий нестандартный формат **18 секторов/дорожку** (вместо 16 у -стандартного DOS 3.3) — этим объясняется, почему регионы уровня (9×256Б) -идут парами на одной физической дорожке. Символические имена -`chtableN`/`bgtableN` в `GAMEEQ.S` — ближайший аналог "индекса ресурсов", но -они связывают ресурс с **фиксированным адресом в ОЗУ**, а не с положением на -диске; связь с диском — отдельная, вручную сопровождаемая таблица, -сопоставленная с ресурсом лишь порядком вызовов загрузчика. - ---- - -## 4. Что ещё не восстановлено (открытые вопросы) - -- Точное назначение бит `secmask` (%11000000) в `BLUETYPE` — не встречено - использование в доступном игровом коде (возможно, поле только для - редактора уровней, не читается движком). -- Механизм барабанного сдвига `OFFSET` для суб-байтового позиционирования - спрайта по X (`HRTABLES.S`) — не прослежен в деталях. -- Внутренний формат авторских файлов `PAC.*` инструмента DRAZ (как позы - скелетной анимации превращаются в растровые кадры CHTAB) — исходники DRAZ - отсутствуют в репозитории, можно только косвенно восстановить по - результату (уже скомпилированным `IMG.*`). diff --git a/applications/SprPoP/docs/PoP/MSDOS_RESOURCE_FORMAT.md b/applications/SprPoP/docs/PoP/MSDOS_RESOURCE_FORMAT.md deleted file mode 100644 index 580e92b..0000000 --- a/applications/SprPoP/docs/PoP/MSDOS_RESOURCE_FORMAT.md +++ /dev/null @@ -1,301 +0,0 @@ -# Формат ресурсов Prince of Persia (MS-DOS, каталог `MSDOS/`) - -Документ описывает бинарный формат `*.DAT`-файлов ресурсов DOS-версии PoP. -Исходников для этой версии нет, поэтому всё, что ниже — результат -структурного (эмпирического) анализа реальных файлов из `MSDOS/`, а не чтения -кода. Уровень уверенности указан для каждого раздела. Все находки проверены -скриптами (Python), которые разбирают файл и валидируют согласованность -(например: смещение+размер последней записи таблицы точно совпадает с -началом самой таблицы — то есть данные и каталог стыкуются без дыр). - -**Основной источник спецификации формата — `POP-DAT-FormatSpecifications.pdf`** -(и его текстовая конверсия `POP-DAT-FormatSpecifications.txt` в этой же папке, -для grep/цитирования): *«Prince of Persia — Specifications of File Formats»*, -Princed Development Team, 2008 — каноническая спецификация формата `DAT v1.0`, -на которой построен и SDLPoP, и Princed Resources. Разбирает контейнер, индекс, -чек-сумму, кодеки изображений (RLE / LZG), палитры, формат уровней (room -mapping, wall-drawing, room-linking, guards, start position, door events), -звук (digital waves / MIDI / PC speaker), бинарные файлы и Mac-варианты. При -любом расхождении между эмпирическими находками ниже и этим документом — -источником истины считать спецификацию (сверять §-номера: её §3.x). - -Дополнительно как справка при реализации (порт на ZX Sprinter): - -- **SDLPoP** (github.com/NagyD/SDLPoP, GPLv3) — open-source реализация - DOS-версии на основе дизассемблирования оригинального `PRINCE.EXE`. Содержит - рабочий код чтения `.DAT`-файлов и полный кодек изображений/уровней. Точные - структуры (`dat_table_type` и т.п.), процитированные ниже, получены через - автоматический пересказ содержимого файла третьей стороной, а не через - прямое чтение исходника — поэтому такие детали помечены как "требует сверки - при реализации", в отличие от эмпирически подтверждённых байтовых оффсетов. -- **Princed Resources / PR** (github.com/NagyD/PR, princed.org, GPLv2) — это - профильный инструмент именно для распаковки/запаковки `.DAT`-ресурсов PoP - (версии DAT 1 и 2), сделанный тем же автором. В его документации - (`doc/Dataformats.md`) официально описаны экспортные форматы ресурсов — - это подтверждает и уточняет часть находок ниже (см. §3–4), и является более - надёжным источником, чем самостоятельная догадка по байтам. - -**Важная находка:** репозиторий SDLPoP в папке `data/` содержит не только -код движка, но и **реальные ресурсы игры** — как сырые `.DAT`-контейнеры, так -и уже распакованные поштучно файлы (PNG-кадры спрайтов, `.pal`-палитры, -`.bin`-дампы уровней), см. §7. Это готовый источник ассетов и одновременно -независимая проверка формата, описанного в этом документе. - ---- - -## 1. Общий контейнер `.DAT` (уверенность: высокая, подтверждено на 28 файлах) - -Каждый `*.DAT`-файл (кроме служебных `config.dat`/`setup.dat`, см. §5) — это -простой архив-контейнер: блок данных + оглавление (каталог ресурсов) в конце -файла. - -### 1.1 Заголовок файла (6 байт, смещение 0x00) - -| Смещение | Размер | Поле | Значение | -|----------|--------|--------------|----------| -| 0x00 | 4 | `tableOffset`| LE u32. Абсолютное смещение в файле, с которого начинается таблица оглавления. Совпадает с "концом данных". | -| 0x04 | 2 | `tableSize` | LE u16. Размер таблицы оглавления в байтах. | - -Инвариант, подтверждённый на всех 28 `.dat`-файлах в каталоге: - -``` -tableOffset + tableSize == размер файла (без исключений) -``` - -Данные ресурсов идут сразу после заголовка, начиная с байта 0x06, и -заканчиваются на `tableOffset`. - -### 1.2 Таблица оглавления (по смещению `tableOffset`, длиной `tableSize`) - -Таблица — плоский массив записей по 8 байт. Количество записей: -`tableSize / 8` (округление вниз; в файле почти всегда остаётся 2 "лишних" -байта в хвосте таблицы — назначение не установлено, вероятно, служебное поле -инструмента-упаковщика или паддинг; на итоговый разбор не влияет). - -Запись (8 байт): - -| Смещение в записи | Размер | Поле | Описание | -|---|---|---|---| -| 0 | 2 | `size` | LE u16 — размер данных ресурса в байтах | -| 2 | 2 | `id` | LE u16 — идентификатор ресурса | -| 4 | 2 | `offset` | LE u16 — **абсолютное** смещение данных ресурса в файле (не относительное!) | -| 6 | 2 | `reserved` | во всех проверенных записях (сотни штук) всегда `0x0000` | - -Проверено на `levels.dat`: 16 записей, `id`=2000..2015, и `offset[i] + size[i] -== offset[i+1]` для всех соседних записей, а последняя запись заканчивается -ровно на `tableOffset` — то есть данные абсолютно плотно упакованы, без -пробелов, для этого файла. В других файлах (например `guard.dat`) между -записями изредка есть небольшие зазоры в несколько байт (вероятно, выравнивание -или "мёртвые" байты от инструмента-компоновщика) — не является нарушением -формата. - -### 1.3 Диапазоны `id` по типам файлов (собрано эмпирически) - -Похоже, что числовые ID образуют условные "пространства имён" по типу -контента — вероятно, глобальные константы в оригинальном коде: - -| Файл(ы) | Диапазон `id` | Кол-во записей | Предполагаемое содержимое | -|---|---|---|---| -| `levels.dat` | 2000–2015 | 16 | id=2000 — служебный блок (16 байт, см. §3); id=2001..2015 — 15 уровней | -| `guard.dat`, `fat.dat`, `skel.dat`, `shadow.dat` | 750–784 (варьируется) | ~30–35 | id=751(750) — служебный блок; остальные — кадры анимации спрайта | -| `vizier.dat` | аналогично guard | — | кадры анимации визиря | -| `kid.dat` | ~400+ | 220 | кадры анимации игрока (намного больше — герой умеет гораздо больше действий) | -| `guard1.dat`, `guard2.dat` | 750 (1 запись) | 1 | вероятно, дополнительные/альтернативные кадры/варианты | -| `title.dat` | 40–55 | 12 | картинки титульного экрана/логотипов | -| `cpalace.dat`,`epalace.dat`,`vpalace.dat`,`cdungeon.dat`,`edungeon.dat`,`vdungeon.dat` | 200–1343 | 205–238 | фоновые тайлы дворца/подземелья, отдельно для CGA(`c*`)/EGA(`e*`)/VGA(`v*`) | -| `pv.dat` | 800–981 | 103 | доп. графика (возможно, "Prince/Vizier" катсцены) | -| `digisnd1/2/3.dat` | 10000+ | 20–44 | оцифрованный звук (Covox/Disney Sound Source) | -| `midisnd1/2.dat` | 10024+ / аналог | 16 | General MIDI музыка | -| `mt32snd1/2.dat` | 10000+ | 24/7 | музыка для Roland MT-32 | -| `ibm_snd1/2.dat` | 10000+ | 44 | музыка/эффекты через PC-спикер | -| `prince.dat` | — (1 крупный ресурс) | — | MIDI-тема (вероятно, финальная тема "Принц"/титры — см. текстовые события "The Princess awaits") | - -Во всех файлах первая (наименьшая по `id`) запись — маленький "служебный" -ресурс (6–44 байта), стоящий перед основным контентом. Скорее всего это -локальная мини-таблица/палитра/список ссылок для данного набора ресурсов — -по аналогии с тем, что у уровней id=2000 отдельно от самих уровней (см. §3). - ---- - -## 2. Формат уровня (`levels.dat`, id=2001..2015) — уверенность: высокая - -Каждая запись уровня имеет размер **2305 байт** и по данным полностью -совпадает по объёму с уровнями из Apple II версии (`01 POP Source/Levels/LEVELn` -— ровно **2304 байта** каждый, см. `docs/APPLEII_RESOURCE_FORMAT.md`). - -Вывод: формат карты уровня в DOS-версии, судя по всему, **унаследован -практически без изменений от оригинального Apple II формата** (Джордан -Мехнер писал игру на 6502 и данные уровней переносились как есть), с добавлением -одного лишнего байта в DOS-упаковке (2304+1=2305 — вероятно, контрольный байт/ -маркер конца, добавленный DOS-упаковщиком ресурсов, а не часть игровых данных). - -**Практическое следствие:** байтовая структура самого уровня (тайлы 3×10 на -экран, 24 экрана, таблицы стражников, дверей и т.д.) должна документироваться -один раз — по исходникам Apple II (см. соответствующий раздел), и напрямую -применяться к DOS `levels.dat`, отбросив 1 лишний байт в конце каждой записи. -Байтовые значения тайлов в дампе (в основном 0x00–0x39) визуально согласуются -с диапазоном небольших целых кодов тайлов, что для формата карты и ожидается. - -Первая запись, id=2000, размер 16 байт — не уровень, а отдельный маленький -блок (возможно: количество уровней, начальный уровень, версия формата, -стартовые координаты игрока/охраны по умолчанию). Точное назначение не -установлено — требует сопоставления с диз­ассемблированным кодом загрузчика -уровней (в SDLPoP это, по всем признакам, отдельная процедура чтения -`level` ресурса). - -**Сверка с независимой распаковкой SDLPoP (`data/LEVELS/`):** там лежат файлы -`res2000.bin`…`res2015.bin` (16 штук — количество совпадает). Байты -`res2001.bin` содержательно совпадают с тайловыми данными нашей записи -id=2001 (та же последовательность значений тайлов) — это подтверждает, что -нумерация id верна. Но есть нестыковка по размеру: у SDLPoP `res2000.bin` — -**2305 байт** (как и все остальные), тогда как в нашем локальном -`levels.dat` запись id=2000 — всего **16 байт**. Скорее всего, это разные -релизы/сборки игры (см. §7 — размеры некоторых `.dat` у SDLPoP и у нас уже -отличались), и в версии SDLPoP маленький служебный блок либо отсутствует, -либо пронумерован иначе. Это не меняет сам формат контейнера, но означает, -что **точную семантику 16-байтного блока id=2000 в нашей копии игры пока -нельзя проверить через данные SDLPoP** — открытый вопрос. - ---- - -### 2.1 Кросс-подтверждение по исходникам Apple II - -Фоновый анализ исходников Apple II (см. `docs/APPLEII_RESOURCE_FORMAT.md`) -подтверждает и объясняет структуру уровня напрямую по коду. Уровень на Apple -II — дамп структуры `blueprnt` (`EQ.S`): `BLUETYPE`(720Б, 24 экрана×30 тайлов) -+ `BLUESPEC`(720Б) + `LINKLOC`(256Б) + `LINKMAP`(256Б) + `MAP`(96Б, граф -соседних экранов) + `INFO`(256Б, метаданные/старт Кида/стражников) = ровно -2304 байта. Учитывая, что DOS-запись уровня — это ровно 2304+1 байт с -байтовыми значениями тайлов, укладывающимися в диапазон 0–29 (id тайла) плюс -служебные биты (аналогично `idmask=%00011111`, `reqmask=%00100000` из -`EQ.S:484-486`), можно с высокой уверенностью считать, что **DOS-версия -использует ту же самую раскладку `blueprnt`**, лишь с добавлением одного -байта (вероятно, контрольной суммы) в конце DOS-упаковки. Это снимает -необходимость отдельно реверсить формат уровня для DOS — таблица тайлов, -enum id (0=space...29=archtop4), формат `LINKLOC`/`LINKMAP` и `INFO` из -Apple II документа применимы напрямую. - -## 3. Графика (спрайты и фоновые тайлы) — уверенность: средняя/низкая - -Файлы `kid.dat`, `guard.dat`, `fat.dat`, `shadow.dat`, `skel.dat`, -`vizier.dat`, `title.dat`, `c/e/v-palace.dat`, `c/e/v-dungeon.dat`, `pv.dat` -хранят по контейнерному формату (§1) множество мелких чанков (десятки—сотни -байт каждый). - -Что подтверждено: -- Наборы `shadow.dat`/`kid.dat` и `fat.dat`/`vizier.dat` содержат **побайтово - идентичные фрагменты** данных в начале файла — это ожидаемо: "Тень" (Shadow) - визуально копирует анимацию Кида, а "Толстый страж" (Fat guard, пасхалка) - переиспользует модель Визиря. Подтверждает, что персонажи одного "типа - тела" используют общий набор геометрии/анимации. -- Отдельные чанки *не* имеют очевидного унифицированного заголовка - (высота/ширина/палитра) фиксированного размера — попытка интерпретировать - первые байты чанка как `{height:u16, width:u16, flags:u16}` не подтвердилась - на реальных данных (получаются нереалистичные размеры для маленьких чанков). - Вероятно, как и в Apple II версии (см. `FRAMEDEF.S`/`SEQTABLE.S`), геометрия - кадра (ширина, высота, точка привязки) хранится **отдельно от самих - пиксельных данных** — в таблицах внутри `PRINCE.EXE`, а не в `.DAT`-чанке. - Сам чанк, вероятно, содержит только упакованные пиксельные данные - (RLE/дельта-упаковка, по аналогии с `UNPACK.S` в Apple II исходниках). -- Точный алгоритм упаковки пикселей **не восстановлен** в рамках этого - анализа по сырым байтам — байт-в-байт разбор распаковщика без - дизассемблирования `PRINCE.EXE` надёжно не сделать. **Но для практических - целей это не требуется**: см. §7 — в SDLPoP уже есть тот же самый набор - изображений в готовом, распакованном виде (PNG), которым можно пользоваться - напрямую как источником ассетов, не реализуя свой декодер `.DAT`-пикселей. - Писать собственный декодер имеет смысл только если понадобится читать - оригинальные `.DAT` "на лету" (например, для точной сверки контента именно - нашей копии игры) — тогда ориентир — исходник SDLPoP (`src/seg009.c`). - ---- - -## 4. Звук — уверенность: высокая (по структуре), низкая (по деталям кодека) - -Обнаружено 4 параллельных набора звуковых ресурсов под разные звуковые -устройства DOS-эпохи — типично для игр начала 1990-х с "звуковым меню": - -| Файл | Устройство | Формат чанка | -|---|---|---| -| `midisnd1.dat`, `midisnd2.dat` | General MIDI / MPU-401 | каждый чанк = 2-байтовый LE-префикс длины + встроенный Standard MIDI File (`MThd`...`MTrk`...) | -| `mt32snd1.dat`, `mt32snd2.dat` | Roland MT-32/CM-32L | тот же формат: префикс длины + `MThd`/`MTrk`, с MT-32-специфичными SysEx (видны строки `MT-32.mff`, текстовые мета-события вроде `"The Princess awaits"`) | -| `prince.dat` | (аналогично MIDI) | отдельный крупный музыкальный ресурс, тот же MIDI-контейнер — вероятно, финальная тема | -| `digisnd1/2/3.dat` | Covox / Disney Sound Source / Sound Blaster (оцифрованный звук) | чанк начинается с нескольких служебных байт, среди которых слово `0x2AF8` = 11000 — похоже на частоту дискретизации 11 кГц; далее — сырые 8-битные PCM-сэмплы (значения кластеризуются вокруг ~0x7A–0x90, типично для беззнакового 8-бит аудио, смещённого к середине шкалы) | -| `ibm_snd1.dat`, `ibm_snd2.dat` | PC Speaker | чанк — последовательность троек байт похожих на (длительность, делитель_частоты) — простой формат "бипера", отличный от MIDI | - -Подтверждено разбором первых чанков в каждом файле (см. байтовые дампы, -проверялись скриптом). Точная семантика полей внутри `digisnd`/`ibm_snd` -(разрядность, порядок байт служебного заголовка) не выведена до конца — при -реализации порта достаточно распознавания по типу файла и (для MIDI-семейства) -можно напрямую воспроизводить встроенный Standard MIDI File, пропустив -2-байтовый префикс длины. - ---- - -## 5. Готовые распакованные ассеты в SDLPoP (`data/`) — практический источник для порта - -Репозиторий github.com/NagyD/SDLPoP содержит папку `data/`, где, помимо -самих `.DAT`-контейнеров, каждый ресурс **продублирован в виде отдельно -распакованного файла**, названного по его `id` из таблицы оглавления (§1.2). -Проверено через GitHub API (`api.github.com/repos/NagyD/SDLPoP/contents/...`): - -| Подпапка/файл в `data/` | Содержимое | Соответствие нашему разбору | -|---|---|---| -| `GUARD.DAT`, `GUARD1.DAT`, `GUARD2.DAT` | сырые `.DAT` | размер **побайтово совпадает** с нашими локальными `guard.dat`/`guard1.dat`/`guard2.dat` (6950 / 117 / 117 байт) | -| `DIGISND1.DAT`, `MIDISND2.DAT` и др. | сырые `.DAT` | размер **не совпадает** с нашими локальными файлами (48545 vs 50101, 18408 vs 18958) — другой релиз/сборка игры | -| `GUARD/res751.png` … `res784.png` | готовые PNG, по одному на кадр анимации, имя = `res.png` | id-диапазон (751-784) точно совпадает с нашим разбором `guard.dat` | -| `VPALACE/res200.pal`, `res201.png`, `res202.png`, … | палитра (JASC `.pal`) + PNG-кадры фонов дворца, **VGA-вариант (256 цветов)** | id-диапазон (200+) совпадает с `vpalace.dat` | -| `LEVELS/res2000.bin` … `res2015.bin` | сырые дампы уровней по 2304-2305 байт | id совпадает с `levels.dat`; содержимое `res2001.bin` **сверено побайтово** с нашим id=2001 — тайловые данные совпадают | -| `KID/`, `PRINCE/`, `SHADOW/`, `SKEL/`, `VIZIER/`, `FAT/`, `TITLE/`, `VDUNGEON/`, `PV/`, `IBM_SND1/`, `IBM_SND2/`, `font/`, `music/` | аналогичные наборы для остальных ресурсов | не проверялись по отдельности, но структура (папка на каждый `.dat`, файлы `res.ext`) наблюдается одинаково | - -**Вывод:** это данные из немного **другого релиза DOS-версии**, чем те, что -лежат у нас в `MSDOS/` (см. расхождение в размере `digisnd`/`midisnd`), но -формат контейнера и нумерация `id` — те же самые. Практически это значит: - -1. Для получения играбельных PNG-спрайтов и VGA-фонов **не нужно - реализовывать декодер сжатия пикселей** — можно взять готовые файлы - `data/<ИМЯ>/res.png` напрямую как исходный материал для конвертации - под видеорежим ZX Sprinter (в т.ч. `VPALACE`/`VDUNGEON` — уже - 256-цветный VGA-арт, что прямо отвечает на вопрос про полноцветность). -2. Если в проекте важно использовать именно ту версию контента, что в наших - `MSDOS/*.dat` (а не версию из SDLPoP) — распаковку своих файлов всё же - придётся делать (кодек пикселей по-прежнему не восстановлен для сырых - `.DAT`, см. §3), либо принять решение работать с версией SDLPoP как - мастер-источником ассетов вместо своей. - ---- - -## 6. Служебные не-ресурсные файлы - -- `config.dat`, `setup.dat` — 28 байт, не являются ресурсными контейнерами - (не проходят проверку §1.1 — "размер" получается больше самого файла). - Скорее всего простые бинарные структуры настроек (звук/видеорежим, - выбранный на этапе `SETUP.EXE`/`INSTALL.EXE`), не связаны с игровым - контентом. -- `desktopd.cfg`, `setup.cfg` — текстовые/бинарные конфиги DOS-инсталлятора, - вне скоупа игровых ресурсов. -- `PRINCE.EXE` / `PRINCE.REM` — почти идентичны (отличие в единичных байтах - в районе смещения ~0x4ED0), похоже на кряк/патч одного байта проверки — - не относится к формату ресурсов. -- `old-games.nfo` — ASCII-арт NFO релиз-группы (old-games.ru), не игровые - данные. - ---- - -## 7. Итоговая таблица уверенности - -| Раздел | Уверенность | Как подтверждено | -|---|---|---| -| Контейнер `.DAT` (заголовок + таблица) | Высокая | Проверено скриптом на всех 28 файлах, инвариант offset+size выполняется без исключений; независимо подтверждено именованием `res.*` в SDLPoP `data/` | -| ID-пространства ресурсов | Средняя-высокая | Наблюдение по диапазонам + сверка с `res` именами файлов SDLPoP и побайтовым содержимым `res2001.bin` | -| Формат уровня = формату Apple II | Высокая (по размеру и содержимому), служебный блок id=2000 — открытый вопрос | Совпадение размера (2304 vs 2305), тайловые байты сходятся с `res2001.bin` из SDLPoP | -| Формат изображений/спрайтов (сырой `.DAT`) | Низкая-средняя | Контейнер подтверждён, кодек пикселей — нет; но практически закрыто наличием готовых PNG в SDLPoP `data/` (§5) | -| Формат звука (тип контейнера) | Высокая для MIDI-семейств, средняя для digisnd/ibm_snd | Явные MIDI-сигнатуры `MThd`/`MTrk` видны в байтах | - -**Рекомендация для дальнейшей работы:** для получения арт-ассетов (спрайты, -фоны, палитры) — использовать готовые распакованные файлы из -`github.com/NagyD/SDLPoP/tree/master/data` (§5), это быстрее и надёжнее -самостоятельной реализации декодера. Декодер сырого `.DAT`-формата -изображений и точную семантику служебных полей `digisnd`/`ibm_snd` -(§3, §4) стоит восстанавливать только если понадобится читать именно нашу -локальную копию `MSDOS/*.dat` "как есть" — тогда ориентир прежний: исходник -SDLPoP (`src/seg009.c`, `src/data.c`/`data.h`). diff --git a/applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.pdf b/applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.pdf deleted file mode 100644 index 0d5c21968bec960e887a93174ee264584eb6c3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222037 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 diff --git a/applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.txt b/applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.txt deleted file mode 100644 index c2aa09a..0000000 --- a/applications/SprPoP/docs/PoP/POP-DAT-FormatSpecifications.txt +++ /dev/null @@ -1,2345 +0,0 @@ -Prince of Persia -Specifications of -File Formats -Princed Development Team -January 5, 2008 - -Contents -1 Preamble - -3 - -2 Introduction - -3 - -3 DAT v1.0 Format Specifications -3.1 General file specifications . . . . . . . . . . . . . . . . . . . . . . -3.1.1 Some definitions . . . . . . . . . . . . . . . . . . . . . . . -3.1.2 Index structures . . . . . . . . . . . . . . . . . . . . . . . -3.1.3 Checksums byte . . . . . . . . . . . . . . . . . . . . . . . -3.2 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.1 Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.2 Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . -3.2.3 Run length encoding (RLE) . . . . . . . . . . . . . . . . . -3.2.4 LZ variant (LZG) . . . . . . . . . . . . . . . . . . . . . . . -3.3 Palettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.4 Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.4.1 Unknown blocks . . . . . . . . . . . . . . . . . . . . . . . -3.4.2 Room mapping . . . . . . . . . . . . . . . . . . . . . . . . -3.4.3 Wall drawing algorithm . . . . . . . . . . . . . . . . . . . -3.4.4 Room linking . . . . . . . . . . . . . . . . . . . . . . . . -3.4.5 Guard handling . . . . . . . . . . . . . . . . . . . . . . . . -3.4.6 Start Position . . . . . . . . . . . . . . . . . . . . . . . . -3.4.7 Door events . . . . . . . . . . . . . . . . . . . . . . . . . . -3.5 Digital Waves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.6 Midi music . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.7 Internal PC Speaker . . . . . . . . . . . . . . . . . . . . . . . . . -3.8 Binary files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -3.9 Levels in POP1 for Mac . . . . . . . . . . . . . . . . . . . . . . . - -3 -3 -3 -4 -5 -5 -6 -6 -7 -7 -8 -10 -11 -11 -14 -15 -16 -16 -17 -17 -18 -18 -18 -18 - -1 - - 4 DAT v2.0 Format Specifications -19 -4.1 General file specifications . . . . . . . . . . . . . . . . . . . . . . 19 -4.1.1 The master index . . . . . . . . . . . . . . . . . . . . . . . 20 -4.1.2 The slave indexes . . . . . . . . . . . . . . . . . . . . . . 21 -4.2 Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 -4.2.1 Room mapping . . . . . . . . . . . . . . . . . . . . . . . 22 -4.2.2 Door events . . . . . . . . . . . . . . . . . . . . . . . . . 24 -4.2.3 Guard handling . . . . . . . . . . . . . . . . . . . . . . . . 24 -4.2.4 Static guards . . . . . . . . . . . . . . . . . . . . . . . . . 25 -4.2.5 Dynamic guards . . . . . . . . . . . . . . . . . . . . . . . 26 -5 PLV v1.0 Format Specifications -26 -5.1 User data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 -5.2 Allowed Date format . . . . . . . . . . . . . . . . . . . . . . . . . 27 -6 SAV v1.0 Format Specifications - -28 - -7 HOF v1.0 Format Specifications - -28 - -8 Credits - -29 - -9 License - -29 - -2 - - 1 - -Preamble - -This file was written thanks to the hard work on reverse engineering made by -several people, see the credits section. In case you find any mistake in the text -please report it. A copy of this document should be available in our official site -at http://www.princed.org. - -2 - -Introduction - -There are two versions of the DAT file format: DAT v1.0 used in POP 1.x and -DAT v2.0 used in POP 2. In this document we will specify DAT v1.0. -DAT files were made to store levels, images, palettes, wave, midi and internal -speaker sounds. Each type has its own format as described below in the following -sections. -As the format is very old and the original game was distributed in disks, it -is normal to think that the file format uses some kind of checksum validation -to detect file corruptions. -DAT files are indexed, this means that there is an index and you can access -each resource through an ID that is unique for the resource inside the file. -Images store their height and width but not their palette, so the palette is -another resource and must be shared by a group of images. -PLV files use the extension defined to support a format with only one level -inside. -Both versions of DAT are supported and may be manipulated by PR. This -program works like an archive manager (i.e. pkzip) and extracts the files in -known formats that may be handled by other programs. For more information -about PR check the Princed home page at http://www.princed.org. -In this document you will also find the SAV and HOF format specifications -and the algorithm used by POP1 to draw the dungeon walls. - -3 - -DAT v1.0 Format Specifications - -3.1 - -General file specifications - -All DAT files have an index, this index has one entry per item with information -on each one. -The index is stored at the very end of the file. But may be located reading -the first 6 bytes (as headers) of the file, that are reserved to locate the index -and know it’s size. The sum of the location and the index size should be the -size of the file. -3.1.1 - -Some definitions - -Let’s define the numbers as: - -3 - - SC Signed char: 8 bits, the first bit is for the sign and the 7 last for the number. -If the first bit is a 0, then the number is positive, if not the number is -negative, in that case invert all bits and add 1 to get the positive number. -i.e. -1 is FF (1111 1111), 1 is 01 (0000 0001) -Range: -128 to 127 -1 byte -UC Unsigned char: 8 bits that represent the number. -i.e. 32 is 20 (0010 0000) -Range: 0 to 255 -1 byte -US Unsigned Short: Little endian, 16 bits, storing two groups of 8 bits ordered -from the less representative to the most representative without sign. -i.e. 65534 is FFFE in hex and is stored FE FF (1111 1110 1111 1111) -Range: 0 to 65535 -2 bytes -SS Signed Short: Little endian, 16 bits, storing two groups of 8 bits ordered -from the less representative to the most representative with sign. If the -first byte is 0 then the number is positive, if not the number is negative, -in that case invert all bits and add 1 to get the positive number. -i.e. -2 is FFFE in hex and is stored FE FF (1111 1110 1111 1111) -Range: -32768 to 32767 -2 bytes -UL Unsigned long: Little endian, 32 bits, storing four groups of 8 bits each -ordered from the less representative to the most representative without -sign. -i.e. 65538 is 00010002 in hex and is stored 02 00 01 00 -(0000 0010 0000 0000 0000 0001 0000 0000) -Range: 0 to 232 − 1 -4 bytes -Sizes will always be expressed in bytes unless another unit is specified. - -3.1.2 - -Index structures - -Offset - -Size - -Type - -Name - -0 - -4 - -UL - -IndexOf f set - -4 - -2 - -US - -IndexSize1 - -1 IndexOf f set + IndexSize = f ilesize - -4 - -Description -The location where the index begins -The number of bytes the index has - - Offset - -Size - -Type - -Name - -IndexOf f set = α - -IndexSize - -↓ - -F ooter - -α - -2 - -US - -N umberOf Items - -α + 2 = β2 - -N umberOf Items ∗ 8 - -- - -Index - -β + 8i = γ - -8 - -↓ - -Entry - -γ+0 - -2 - -US - -Id(i)3 - -γ+2 - -4 - -UL - -Of f set(i)3 - -γ+6 - -2 - -US - -Size(i)3 - -Description -The DAT index -Resources count -A list of NumberOfItems -blocks of 8-bytes-length index record called Entry -The 8-bytes-length index -record (one per item) -Item ID -Absolute offset where the resource start -Size of the item not including the checksum byte - -Table 1: DAT file blocks -Note: POP1 doesn’t validate the DAT file checking IndexOf f set + -IndexSize = F ileSize, this means you can append data at the end of the -file. -PR validates that IndexOf f set + IndexSize ≤ F ileSize. It also compares -IndexSize with 8 ∗ numberOf Items + 2 to determine if a file is a valid POP1 -DAT file. -3.1.3 - -Checksums byte - -There is a checksum byte for each item (resource), this is the first byte of the -item, the rest of the bytes are the item data. The item type is not stored and may -only be determined by reading the data and applying some filters, unfortunately -this method may fail. When you extract an item you should know what kind -of item you are extracting. -If you add (sum) the whole item data including checksum and take the less -representative byte (modulus 256) you will get the sum of the file. This sum -must be FF in hex (255 in UC or -1 in SC). If the sum is not FF, then adjust -the checksum in order to set this value to the sum. The best way to do that -is adding all the bytes in the item data (excluding the checksum) and inverting -all the bits. The resulting byte will be the right checksum. -From now on the specification are special for each data type (that means we -won’t include the checksum byte anymore). - -3.2 - -Images - -Images are stored compressed and have a header and a compressed data area. -Each image only one header with 6 bytes in it as follows -2 so IndexSize = 8 ∗ numberOf Items + 2 -3 with 0 ≤ i < numberOf Items - -5 - - 3.2.1 - -Headers -Offset Size Type - -Name - -Description - -0 - -6 - -↓ - -ImageHeader - -0 - -2 - -US - -Height - -2 - -2 - -US - -W idth - -4 - -2 - -- - -ImageM ask - -The header of an image -The height of the image in -pixels -The width of the image in -pixels -Information on the compression algorithm and bitrate - -Table 2: Image headers - -ImageMask is a set of bits where: -⋄ the first 8 are zeros -⋄ the next 4 are the resolution -so if it is 1011 (B in hex) then the image has 16 colours; and if it is 0000 -(0 in hex) then the image has 2 colours. To calculate the bits per pixel -there are in the image, just take the last 2 bits and add 1. e. g. 11 is 4 -(24 = 16 colours) and 00 is 1 (21 = 2 colours). -⋄ the last 4 bits are the 5 compression types (from 0 to 4) as specified in -Table 3. -Dec -Bin -Algorithm -0 -0000 -RAW LR -1 -0001 -RLE LR -2 -0010 -RLE UD -3 -0011 -LZG LR -4 -0100 -LZG UD -Table 3: Algorithm codes - -The following data in the resource is the image compressed with the algorithm specified by those 4 bits. -3.2.2 - -Algorithms - -RAW LR means that the data has not been compressed in any way, it is used -for small images. The format is saved from left to right (LR) serialising a -line to the next integer byte if necessary. In case the image was 16 colours, -two pixels per byte (4bpp) will be used. In case the image was 2 colours, -8 pixels per byte (1bpp) will be used. - -6 - - RLE LR has a Run length encoding (RLE) algorithm, after uncompressed the -image can be read as a RAW LR. -RLE UD is the same as RLE LR except that after uncompressed the bytes in -the image must be drawn from up to down and then from left to right. -LZG LR has some kind of variant of the LZ77 algorithm (the sliding windows -algorithm), here we named it LZG in honour of Lance Groody, the original -coder. After decompressed it may be handled as RAW LR. -LZG UD Uses LZG compression but is drawn from top to bottom as RLE UD. -3.2.3 - -Run length encoding (RLE) - -The first byte is always a control byte, the format is SC. If the control byte is -negative, then the next byte must be repeated n times as the bit inverted control -byte says, after the next byte (the one that was repeated) another control byte -is stored. -If the control byte is positive or zero just copy textual the next n bytes where -n is the control byte plus one. After that, the next byte is the following control -byte. -If you reach a control byte but the image size is passed, then you have completed -the image. -3.2.4 - -LZ variant (LZG) - -This is a simplified algorithm explanation: -Definition: “print” means to commit a byte into the current location of the -output stream. -The output stream is a slide window initialised with zeros. -The first byte of the input stream is a maskbyte. -For each of the 8 bits in the maskbyte the next actions must be performed: -If the bit is 1 print the next unread byte to the slide window -If the bit is a zero read the next two bytes as control bytes with -the following format (RRRRRRSS SSSSSSSS): -· 6 bits for the copy size number (R). -Range: 2 to 26 + 2 = 66 - -Add 3 to this number. - -· 10 bits for the slide position (S). Add 66 to this number. -Range: 26 + 2 = 66 to 26 + 2 + 210 = 1090 -Then print in the slide window the next R bytes that are the same slide -window starting with the S th byte. -After all the maskbyte is read and processed, the following input byte is another -maskbyte. Use the same procedure to finish decompressing the file. Remaining -unused maskbits should be zeros to validate the file. -7 - - This is the modus operandi of the compression algorithm -For each input byte we take a window containing the 1023 previous bytes. -If the window goes out of bounds (ie, when the current input byte is before -position 210 = 1024), we consider it filled with zeros. - -Figure 1: Distribution of the sindow size. -The algorithm works as follows: -While there is unread input data: -Create a maskbyte. -For each bit in the maskbyte (and there is still unread input data): -Compare the following input bytes with the bytes in the window, -and search the longest pattern that is equal to the next bytes. -If we found a pattern of length n > 2: -Assign 0 to the current bit of the maskbyte. -In the next 2 bytes of the output, specify the relative -position and length of the pattern. -Advance output pointer by 2. -Advance input pointer by n. -Else: -Assign 1 to the current bit of the maskbyte. -Copy the current input byte in the next output byte. -Advance output pointer by 1. -Advance input pointer by 1. - -For a better understanding of the algorithm we strongly recommend to read -the PR source files lzg uncompress.c and lzg compress.c that may be located at -https://gforge.lug.fi.uba.ar/plugins/scmcvs/cvsweb.php/PR/src/lib/compression/?cvsroot=freeprince in the PR -repository module. - -3.3 - -Palettes - -Palette resources store a palette for the VGA and patterns for the CGA and -EGA. Each palette resource is sized 100 bytes distributed as explained in Table 25: -Length - -Offset - -Block Name - -8 - - 4 -0 -unknown (TGA?) -48 -4 -vga palette -16 -52 -cga patterns -32 -68 -ega patterns -Table 4: DAT 1.0 Palette blocks - -The vga palette block stores 16 records of three bytes each that is the palette -in the RGB-18-bits format (6 bits for each colour). Each colour is a number -from 0 to 63. Remember to shift the colour bytes by two to get the colour -number from 0 to 256. The format is 00rrrrrr 00gggggg 00bbbbbb where rrrrrr -is the 6 bit red, gggggg the 6 bits green and bbbbbb the 6 bits blue. -In the case of EGA and CGA, palettes are not stored. The palettes are -the standard ones defined by the adapter. In Table 5 the standard palettes are -shown. -EGA CGA1 CGA2 Color name -HTML -0 -0 -0 -black -#000000 -1 -blue -#0000aa -2 -1 -green -#00aa00 -3 -1 -cyan -#00aaaa -4 -2 -red -#aa0000 -5 -2 -magenta -#aa00aa -6 -3 -brown -#aa5500 -7 -3 -light gray -#aaaaaa -8 -dark gray -#555555 -9 -bright blue -#5555ff -10 -bright green -#55ff55 -11 -bright cyan -#55ffff -12 -bright red -#ff5555 -13 -bright magenta #ff55ff -14 -bright yellow -#ffff55 -15 -bright white -#ffffff -Table 5: EGA and CGA palettes - -rgbRGB -000000 -000001 -000010 -000011 -000100 -000101 -010100 -000111 -111000 -111001 -111010 -111011 -111100 -111101 -111110 -111111 - -Where EGA is the only one palette used in EGA mode of the game and -CGA1 and CGA2 are the two palettes used in the CGA mode. As the palettes -are always the same, but the graphics are in 16 colours, some patterns are used -instead of colours. Remember EGA has 16 colours, so is represented in 4 bits -and CGA has 4 simultaneous colours represented in 2 bits. -The cga patterns block stores 16 records of one byte each, separated in four -parts, so the format is a0 a1 b0 b1 c0 c1 d0 d1 where aa is a two bit colour in one of -the two CGA palettes (palette 1 is normally used in the dungeon environment -and 2 in the palace environment). -9 - - The pattern is arranged in a 2x2 box and each pixel is denoted: -a0 a1 -c0 c1 - -b0 b1 -d0 d1 - -So for example if the entry 1 is 00101000 (0x28) in mode CGA2, the pattern -will be a checkerboard of black and green like the following: -Bin -00 01 -01 00 - -Dec -Colour -0 1 black green -1 0 green black - -The ega patterns block stores 16 records of two bytes each, this time separated in two parts. So we have again, four parts per record in the format -aaaabbbb ccccdddd. -Now, using the EGA entries 0-15 (the four bits are represented) the same -patterns as the CGA may be used. -For example, with 00101111 11110010 (0x2ff2) you can create the following -pattern: -Bin -0010 1111 -1111 0010 - -3.4 - -Dec -2 15 -15 2 - -Hex -Colour -2 f brown white -f 2 white brown - -Levels - -This table has a summary of the blocks to be used in this section, you can refer -it from the text below. -Length -Offset -Block Name -720 -0 -pop1 foretable -720 -720 -pop1 backtable -256 -1440 -door I -256 -1696 -door II -96 -1952 -links -64 -2048 -unknown I -3 -2112 -start position -3 -2115 -unknown II -1 -2116 -unknown III -24 -2119 -guard location -24 -2143 -guard direction -24 -2167 -unknown IV (a) -24 -2191 -unknown IV (b) -24 -2215 -guard skill -24 -2239 -unknown IV (c) -24 -2263 -guard colour -16 -2287 -unknown IV (d) -2 -2303 -0F 09 (2319) -Table 6: DAT 1.0 Level blocks -10 - - All levels have a size of 2305, except in the original game, that the potion -level has a size of 2304 (may be it was wrong trimmed). -3.4.1 - -Unknown blocks - -Blocks described in this section are: Unknown from I to IV. -Unknown III and IV blocks does not affect the level if changed, if you find -out what they are used to we will welcome your specification text. -Unknown I may corrupt the level if edited. -We believe unknown II has something to do with the start position, but we -do not know about it. -As unknown II were all zeros for each level in the original set, it was a team -decision to use those bytes for format extension. If one of them is not the default -00 00 00 hex then the level was extended by the team. Those extensions are -only supported by RoomShaker at this moment. To see how those extensions -were defined read the appendix I will write some day. For the moment you may -contact us if you need to know that. -3.4.2 - -Room mapping - -This section explains how the main walls and objects are stored. The blocks -involved here are “pop1 foretable” and “pop1 backtable” -In a level you can store a maximum of 24 rooms (also called screens) of 30 -tiles each, having three stages of 10 tiles each. Screens are numbered from 1 to -24 (not 0 to 23) because the 0 was reserved for special cases. -The pop1 foretable and pop1 backtable blocks have 24 sub-blocks inside. -Those sub-blocks have a size of 30 bytes each and has a room associated. So, -for example, the sub-block staring in 0 corresponds to the room 1 and the -sub-block starting in 690 corresponds to the room 24. It is reserved 1 byte -from the pop1 foretable block and one from the pop1 backtable block for each -tile. To locate the appropriate tile you have to do the following calculation: -tile = (room − 1) ∗ 30 + tileOf f set where tileOffset is a number from 0 to 29 -that means a tile from 0 to 9 if in the upper stage, from 10 to 19 if in the middle -stage and 20 to 29 if in the bottom stage. We define this as the location format -and will be used also in the start position. Always looking from the left to the -right. So there is a pop1 foretable and pop1 backtable byte for each tile in the -level and this is stored this way. -The pop1 foretable part of the tile stores the main tile form according to the -table below. Note that those are just a limited number of tiles, each code has a -tile in the game. The tiles listed are all the ones needed to make a level so the -missing tiles have an equivalent in this list. -Each tile has a code id, as some codes are repeated this is how you have to -calculate the codes. A tile in the pop1 foretable part has 8 bits in this format -rrmccccc, where rr are random bits and can be ignored. m is a modifier of the -tile. For example modified loose floors do not fall down. The rest ccccc is the - -11 - - code of the tile tabled below. Tile names are the same as the ones used by -RoomShaker to keep compatibility. -Hex -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x08 -0x09 -0x0A -0x0B -0x0C -0x0D -0x0E -0x0F -0x10 -0x11 -0x12 -0x13 -0x14 -0x15 -0x16 -0x17 -0x18 -0x19 -0x1A -0x1B -0x1C -0x1D -0x1E -0x1F - -Binary -Group -Description -00000 -free -Empty -00001 -free -Floor -00010 -spike -Spikes -00011 -none -Pillar -00100 -gate -Gate -00101 -none -Stuck Button -00110 -event -Drop Button -00111 -tapest -Tapestry -01000 -none -Bottom Big-pillar -01001 -none -Top Big-pillar -01010 -potion -Potion -01011 -none -Loose Board -01100 -ttop -Tapestry Top -01101 -none -Mirror -01110 -none -Debris -01111 -event -Raise Button -10000 -none -Exit Left -10001 -none -Exit Right -10010 -chomp -Chopper -10011 -none -Torch -10100 -wall -Wall -10101 -none -Skeleton -10110 -none -Sword -10111 -none -Balcony Left -11000 -none -Balcony Right -11001 -none -Lattice Pillar -11010 -none -Lattice Support -11011 -none -Small Lattice -11100 -none -Lattice Left -11101 -none -Lattice Right -11110 -none -Torch with Debris -11111 -none -Null -Table 7: POP1 Foretable codes - -The pop1 backtable part of the tile stores a modifier or attribute of the -pop1 foretable part of the tile. This works independently of the modifier bit -in the code. The tile modifier depends on the group the tile belongs which are -wall, chomp, event, ttop, potion, tapp, gate, spike and free. The group event -allows the 256 modifiers and will be described in Section 4.2.2. -In the original game all elements are allowed in all levels, but it is possible -to set it up Hex-editing the uncompressed version. To do that, read the Hex -12 - - editing documentation. -Group -none -free -free -free -free -spike -spike -spike -spike -spike -spike -spike -spike -spike -spike -gate -gate -tapest -tapest -tapest -tapest -potion -potion -potion -potion -potion -potion -potion -ttop -ttop -ttop -ttop -ttop -ttop -ttop -ttop -chomp -chomp -chomp -chomp -chomp - -Code -0x00 -0x00 -0x01 -0x03 -0xFF -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x08 -0x09 -0x00 -0x01 -0x00 -0x01 -0x02 -0x03 -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x00 -0x01 -0x02 -0x03 -0x04 -0x05 -0x06 -0x07 -0x00 -0x01 -0x02 -0x03 -0x04 - -Description -This value is used always for this group -Nothing1 , Blue line2 -Spot11 , No blue line2 -Window -Spot31 , Blue line?2 -Normal (allows animation) -Barely Out -Half Out -Fully Out -Fully Out -Out? -Out? -Half Out? -Barely Out? -Disabled -Closed -Open -With Lattice2 -Alternative Design2 -Normal2 -Black2 -Empty -Health point -Life -Feather Fall -Invert -Poison -Open -With lattice2 -Alternative design2 -Normal2 -Black2 -Black2 -With alternative design and bottom2 -With bottom2 -With window2 -Normal -Half Open -Closed -Partially Open -Extra Open - -1 Dungeon environment -2 Dungeon environment - -13 - - Group -chomp - -Code -Description -0x05 -Stuck Open -Table 8: Background modifiers by group - -Note: Some modifiers have not been tested, there -may be any other unknown tile type we have not -still discover. - -3.4.3 - -Wall drawing algorithm - -This section does not have a direct relation with the format because it describes -how the walls must be drawn on the room. However, as this information should -be useful to recreate a cloned room read from the format we decided to include -this section to the document. -Wall drawing depends on what is in the right panel. If the right panel is not -a wall (binary code ends in 10100) a base wall will be drawn and other random -seed will be used. If the right panel is a wall then the main base wall will be -drawn and the described seed will be used. -When the base wall is drawn, the modifiers should be blitted over it. There -are 53 different types of walls using the same base image. We will call the seed -array to the one having the modifier information of those 53 panels. This array -has indexes from 1 to 53 included. -To calculate what value take from the array this calculation must be performed: panelInf o = seedArray[roomN umber + wallP osition] where panelInfo is the result modifier information that will be applied to the base image; -seedArray is this array that will be described above as a table; roomNumber -is the number of the room the wall is (from 1 to 24) and wallPosition is the -position the wall is (from 0 to 29), using the location format specified in section -3.4.2. This means the first value is 1 (roomNumber=1 and wallPosition=0) and -the last is 53 (roomNumber=24 and wallPosition=29). -Modifiers affects the corners of a stone. There are three stone rows per wall. -If the modifier is activated this corner will appear different (seems to be darker). -Another modifier is the grey stone. -Modifier -Grey stone -Left, bottom -Left, top -Right, bottom -Right, up - -Seed Positions -(First row) -2, 5, 14, 17, 26, 32, 35, 50 -2, 11, 36, 45 -37 -27, 33 -4, 10, 31, 37 - -Grey stone -Left, bottom - -(Second row) -none -34, 47 -14 - - Modifier -Left, top -Right, bottom -Right, top - -Seed Positions -9, 10 -2, 8, 25, 35 -6, 12, 23, 29, 39 - -(Third row) -Grey stone -none -Left, bottom -none -Left, top -16 -Right, bottom -none -Right, top -none -Table 9: Stone modifiers on seed position - -Another modifiers are saved in the seed too. Those modifiers are not boolean -values, they are offsets and sizes. As each stone has a different size the stone -separation offset is saved in the seed. -For the first row, the stones are all the same size and the seed is not needed. -For the second row we have got the first 20 values, ordered from 1 to 20. -Field -Values -position -1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -offsets -543315421 1 5 3 2 1 5 4 3 2 5 4 -separator size -011000110 0 1 1 1 0 0 1 1 1 0 0 -Table 10: First 20 seed values of the second row separator - -We will be adding the next values as soon as we count the pixels ;) This -information can be found in walls.conf file from FreePrince. -3.4.4 - -Room linking - -This section describes the links block. -Each room is linked to another by each of the four sides. Each link is stored. -There is no room mapping, just room linking. -The links block has 24 sub-blocks of 4 bytes each. All those sub-blocks has -its own correspondence with a room (the block starting at 0 is related to the -room 1 and the block starting at with 92 is related to room 24). Each block of -4 bytes stores the links this room links to reserving one byte per each side in -the order left (0), right (1), up (2), down (3). The number 0 is used when there -is no room there. Cross links should be made to allow the kid passing from a -room to another and then coming back to the same room but it is not a must. - -15 - - 3.4.5 - -Guard handling - -This section specifies the blocks: guard location, guard direction, guard skill -and guard colour. -Each guard section has 24 bytes, each byte of them corresponds to a room -so byte 0 is related to room 1 and byte 23 is related to room 24. This room is -where the guard is located. The format only allows one guard per room. Each -block describes a property or attribute of the guard. -The guard location part of a guard describes where in the room the guard -is located, this is a number from 0 to 29 if the guard is in the room or 30 if -there is no guard in this room. Other values are allowed but are equivalent to -30. The number from 0 to 29 is in the location format specified in Section 3.4.2. -The guard direction part describes where the guard looks at. If the value is -0, then the guard looks to the right, if the value is the hex FF (-1 or 255) then -he looks left. This is the direction format, and will be used in the start position -too. -The guard skill is how the guard fights, style and hit points. Note that the -hit points also depends on the level you are. Allowed numbers are from 0 to 9. -The guard colour is the palette the guard has (see Section 3.8). The default -colours are in this table: -Code -Pants -Cape -0x00 -Light -Blue Pink -0x01 -Red -Purple -0x02 -Orange -Yellow -0x03 -Green -Yellow -0x04 -Dark Blue -Beige -0x05 -Purple -Beige -0x06 -Yellow -Orange -Table 11: Default Guard colours - -Other codes may generate random colours because the game is reading the -palette from trashed memory. This may also cause a game crash. It is possible -to add new colours in the guard palette resource (see Section 3.8) avoiding the -crash. -3.4.6 - -Start Position - -This section describes the start position block. -This block stores where and how the kid starts in the level. Note that all -level doors that are on the starting room will be closed in the moment the level -starts. - -16 - - This block has 3 bytes. The first byte is the room, allowed values are from -1 to 24. The second byte is the location, see the section 3.4.2 for the location -format specifications. The third byte is the direction, see 3.4.5 for the direction -format specifications. -3.4.7 - -Door events - -This section explains how the doors are handled and specifies the blocks door I -and II. -First of all he have to define what an event line is in this file. An event line -is a link to a door that will be activated. If the event was triggered with the -action close, then the event will close the door, if the action was open then the -event will open the door. An event line has also a flag to trigger the next event -line or not. An event is defined as a list of event lines, from the first to the -last. The last must have the trigger-next-event-line flag off. This is like a list of -doors that performs an action. An event performs the action that it was called -to do: open those doors or close them. This action is defined by the type of tile -pressed. Each event line has an ID from 0 to 255. An event has the ID of the -first event line in it. -In section 3.4.2 it is explained how a door trigger is associated to an event -ID. Those are the tiles that starts the event depending on what are them: closers -or openers. -How events are stored: Each door block has 256 bytes, one per event line. -Each event line is located in an offset that is the event line ID, so event line 30 -is located in the byte 30 of each block. There is a door I part of an event line -and a door II part of it. We will define them as byte I and byte II. You can find -there: the door room, the door location, and the trigger-next flag. The format -is the following: -Let’s define Screen S = s1 s2 s3 s4 s5 as a 5-bit-number from 1 to 24 (5 bits) -where sn is the bit n of the binary representation and whose value represents -the screen number; Location L = l1 l2 l3 l4 l5 as another 5-bit-number from 0 to -29 where ln is the bit n of the binary representation whose value is according -to the location format specifications (See Section 3.4.5) ; Trigger-next T = t1 -as one bit having 1 for “off” or a 0 for “on”. -Byte I has the form: t1 s4 s5 l1 l2 l3 l4 l5 -Byte II has the form: s1 s2 s3 00000 - -3.5 - -Digital Waves - -Read them as raw digital wave sound using the following specifications: -Field -Size of Format -Format - -Value -16 -PCM - -17 - - Field Value -Attributes 8 bit, mono, unsigned -Channels 1 -Sample rate 11025 -Bytes/Second 11025 -Block Align 1 -Table 12: Wave Specifications - -GNU/Linux users can play the raw waves just dropping them inside /dev/dsp -As DAT headers are very small it is valid to type in a shell console with dsp -write access: cat digisnd?.dat>/dev/dsp to play the whole wave files. - -3.6 - -Midi music - -Standard MIDI files. There have been reports that some versions of MIDI did -not work, but we believe this can bi fixed saving in other MIDI format variant -(like type 0). - -3.7 - -Internal PC Speaker -Offset -Size -Type Name Description -0 -3 -↓ Header The file header -0 -2 -UC Junk 0x00 (or 0x80 sometimes) -2 -1 -US -bps -Beats per two seconds -0 -3numberOf N otes ↓ -Body The file body -3i -2 -US -F req frequency in hertz (0 if no -sound, 1 or 2 if marker) -3i + 2 -1 -US length length in beats -0 -2 -↓ -F ooter The file footer -0 -2 -Junk 0x12 0x00 -Table 13: DAT file blocks - -3.8 - -Binary files - -Some binary files contains relevant information The resource number 10 in -prince.dat has the VGA guard palettes in it saving n records of a 16-colourpalette of 3 bytes in the specified palette format. - -3.9 - -Levels in POP1 for Mac - -In the case of Mac, executable and resource data are embedded in the one runtime file. Level data is a part of resources, for examples graphics, icons and -sounds. Level blocks are very similar to PC but not exactly identical. Following -18 - - table has a summary of the blocks of DAT 1.0 for Mac. -Length -Offset -Block Name -720 -0 -pop1 foretable -720 -720 -pop1 backtable -256 -1440 -door I -256 -1696 -door II -96 -1952 -links -64 -2048 -unknown I -3 -2112 -start position -21 -2115 -unknown II+III -24 -2136 -guard location -24 -2160 -guard direction -24 -2184 -unknown IV (a) -24 -2208 -unknown IV (b) -24 -2232 -guard skill -24 -2256 -unknown IV (c) -24 -2280 -guard colour -4 -2304 -unknown IV (d) -Table 14: DAT 1.0 Level blocks for Mac - -All levels have a size of 2308. Also there are two different things in comparison with DAT 1.0 for PC. DAT 1.0 for Mac does not have any index and -checksums. 16 levels including demo and potion level are only chained in sequence. See 3.4 for reference on each block. - -4 - -DAT v2.0 Format Specifications - -4.1 - -General file specifications - -POP2 DAT files are not much different from their POP1 predecessors. The -format is similar in almost each way. The main difference is in the index. As -DAT v1.0 used an index in the high data, the DAT v2.0 indexes are two level -encapsulated inside a high data. So there is an index of indexes. -We will use the same conventions than in the prior chapter. The checksum -validations are still the same. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 15: High data structures - -19 - - This is similar to DAT v1.0 format, except that the index area is now called -high data. -The high data part of the file contains multiple encapsulated indexes. Each -of those index is indexed in a high data index of indexes. We will call this index -the master index and the sub index the slave indexes. Slave indexes are the real -file contents index. -4.1.1 - -The master index - -Offset - -Size - -Type - -Name - -0 - -4 - -UL - -IndexOf f set - -4 - -2 - -US - -IndexSize1 - -IndexOf f set = α - -IndexSize - -↓ - -F ooter - -α - -2 - -US - -N umberOf Items - -α + 2 = β2 - -N umberOf Items ∗ 8 - -- - -Index - -β + 8i = γ - -8 - -↓ - -Entry - -γ+0 - -2 - -US - -Id(i)3 - -γ+2 - -4 - -UL - -Of f set(i)3 - -γ+6 - -2 - -US - -Size(i)3 - -Description -The location where the index begins -The number of bytes the index has -The DAT index -Resources count -A list of NumberOfItems -blocks of 8-bytes-length index record called Entry -The 8-bytes-length index -record (one per item) -Item ID -Absolute offset where the resource start -Size of the item not including the checksum byte - -Table 16: DAT 2.0 Master index -Note: POP1 doesn’t validate the DAT file checking IndexOf f set + -IndexSize = F ileSize, this means you can append data at the end of the -file. -The master index is made with: - Offset HighDataOf f set, size 2, type US: -NumberOfSlaveIndexes (the number of the high data sections) - Offset HighDataOf f set+ -2, size N umberOf SlaveIndexes ∗ 6: The master index record (a list of NumberOfSlaveIndexes blocks of 6-bytes-length index record each corresponding to -one slave index) -The 6-bytes-length index record (one per item): Size = 6 bytes - Relative offset 0, size 4, type sting: 4 ASCII bytes string denoting the Slave Index ID. The character order is inverted. - Relative offset 4, size 2, type US: -SlaveIndexOf f set (slave index offset relative to HighDataOffset) -1 IndexOf f set + IndexSize = f ilesize -2 so IndexSize = 8 ∗ numberOf Items + 2 -3 with 0 ≤ i < numberOf Items - -20 - - From the end of the DAT High Data Master Index to the end of the file -we will find the High Data section contents (where the HighDataOffset relative -offsets points to). This content has a set of second indexes each called Slave -Index. So, to find a Slave Index offset you have to add the file HighDataOffset -to the SlaveIndexOffset for the desired index. -There are different 4-byte-length ASCII strings called Slave Index IDs. When -the string is less than 4 bytes, a tailing byte 0x00 is used. We will denote it -with the null-space symbol “ ”. The character order is inverted, so for example -the text SLAP becomes PALS, MARF becomes FRAM, -becomes empty or -RCS becomes SCR. They must be in upper case. -ID -“cust” -“font” -“fram” -“palc” -“pals” -“palt” -“piec” -“psl” -“scr” -“shap” -“shpl” -“strl” -“snd” -“seqs” -“txt4” -“” - -4.1.2 - -Stored -TSUC -TNOF -MARF -CLAP -SLAP -TLAP -CEIP -LSP -RCS -PAHS -LPHS -LRTS -DNS -SQES -4TXT - -Description -Custom -Fonts -Frames -CGA Palette -SVGA Palette -TGA Palette -Pieces -? -Screens (images that have the full room) -Shapes (normal graphics) -Shape palettes -Text -Sound -Midi sequences -Text -Levels -Table 17: Slave Index ID strings - -The slave indexes - -All encapsulated sections pointed by the Master Index are Slave Indexes. The -slave index is specified with: - Offset SlaveIndexOffset, size 2, type US: NumberOfItems (the number of the records referring to the file data) - Offset SlaveIndexOffset+2, size NumberOfItems*11: The slave index record (a list of NumberOfItems blocks of 11-byte-length index record each corresponding to one -slave index) -The 11-byte-length slave index record (one per item): Size = 11 bytes Relative offset 0, size 2, type US: Item ID - Relative offset 2, size 4, type UL: -Resource start (absolute offset in file) - Relative offset 6, size 2, type US: Size -of the item (not including the checksum byte) - Relative offset 8, size 3, type -binary: A flags mask (in “shap” indexes it is always 0x40 0x00 0x00; in others -0x00 0x00 0x00) -Finally, we can locate whatever item we want if we have the - Slave Index -21 - - ID - Item ID this is not a unique key, unfortunately we have found repeated -pairs of IDs for different items, so we have to use the “order” as a third key. -So, the way to find an item is: first read the High Data Offset, go there, read -the number of slave items, iterate the master index to find the desired slave item -comparing it with the Slave Index ID. Then go to the found Slave Index offset -(remember to add the High Data Offset) and read the number of items for this -index. Finally iterate the slave index to find the desired item comparing the -Item ID and read the offset and size. Now you will have the offset of the desired -item’s checksum, increasing the offset by one will give you the beginning of the -item content. - -4.2 - -Levels - -This table has a summary of the blocks to be used in this section. -Length -960 -3840 -1280 -128 -32 -3 -4 -3712 -1088 -978 - -Offset -0 -960 -4800 -6080 -6208 -6240 -6243 -6247 -9959 -11047 - -Block Name -pop2 foretable -pop2 backtable -pop2 doors -links (as explained in Section 3.4.4 but having 32 rooms) -unknown I -start position (as explained in Section 3.4.6) -unknown II (00 01 00 02) (check pop1) -pop2 static guard -pop2 dynamic guard -unknown III -Table 18: DAT 2.0 Level blocks - -All levels have a size of 12025. -4.2.1 - -Room mapping - -You should read section 3.4.2 before reading this one. A POP2 level can store -a maximum of 32 rooms of 30 tiles each, having three stages of 10 tiles each. -Rooms are numbered from 1 to 32 (not 0 to 31) because the 0 is be reserved to -the null-room. -The pop2 foretable block has 32 sub-blocks inside. Each sub-block has a size -of 30 bytes and has a room associated. For each byte in this room there is a -tile in the game. Each byte has a code to represent a tile. There are additional -attributes to this tile also. -To locate the 7th tile in the bottom floor of the room 27 you have to do the -same calculation as in 3.4.2: tile = (room − 1) ∗ 30 + tileOf f set = (27 − 1) ∗ -30 + 2 ∗ 10 + 7 = 807 -Dec Hex Bin -Caverns -00 0x00 000000 Empty - -Ruins -Empty -22 - -Temple -Empty - - Dec Hex Bin -Caverns -Ruins -Temple -01 0x01 000001 Floor -Floor -Floor -02 0x02 000010 Spikes -(?) -Spikes -03 0x03 000011 Pillar -Pillar -Pillar -04 0x04 000100 Door -Gate -Gate -05 0x05 000101 (?) -Raised Button -Raised Button -06 0x06 000110 (?) -Drop Button -Drop Button -07 0x07 000111 (?) -Tunnel -(?) -08 0x08 001000 Bottom Big Pillar -Bottom Big Pillar Bottom Big Pillar -09 0x09 001001 Top Big Pillar -Top Big Pillar -Top Big Pillar -10 0x0A 001010 Potion -Potion -Potion -11 0x0B 001011 Loose Floor -Loose Floor -Loose Floor -12 0x0C 001100 (?) -Slicer Left Half -Slicer Left Half -13 0x0D 001101 (?) -Slicer Right Half Slicer Right Half -14 0x0E 001110 Debris -Debris -Debris -15 0x0F 001111 (?) -Drop Floor -(?) -16 0x10 010000 Exit Half Left -Exit Half Left -Exit Half Left -17 0x11 010001 Exit Half Right -Exit Half Right Exit Half Right -18 0x12 010010 Magic Carpet -(?) -(?) -19 0x13 010011 Torch -(?) -Torch -20 0x14 010100 Wall -Wall -Wall -21 0x15 010101 (?) -Skeleton -(?) -22 0x16 010110 (?) -Sword -(?) -23 0x17 010111 Lava Pit Left -(?) -(?) -24 0x18 011000 Lava Pit Right -(?) -(?) -25 0x19 011001 (?) -(?) -Squash Wall -26 0x1A 011010 (?) -(?) -Flip Tile -27 0x1B 011011 (?) -(?) -(?) -28 0x1C 011100 (?) -(?) -(?) -29 0x1D 011101 (?) -(?) -(?) -30 0x1E 011110 (?) -(?) -(?) -31 0x1F 011111 (?) -(?) -(?) -32 0x20 100000 Torch w/Debris -(?) -Torch w/Debris -33 0x21 100001 Exit Door Top Left (?) -(?) -34 0x22 100010 Pressure Plate -(?) -(?) -35 0x23 100011 Exit Door Top Right (?) -(?) -36 0x24 100100 Dart Gun -(?) -(?) -37 0x25 100101 (?) -(?) -(?) -38 0x26 100110 (?) -(?) -(?) -39 0x27 100111 (?) -(?) -(?) -40 0x28 101000 (?) -(?) -(?) -41 0x29 101001 (?) -(?) -(?) -42 0x2A 101010 (?) -(?) -(?) -43 0x2B 101011 (?) -(?) -Blue Flame -44 0x2C 101100 Rope Bridge -(?) -(?) -45 0x2D 101101 (?) -(?) -(?) -23 - - Dec Hex Bin -Caverns -Ruins -46 0x2E 101110 (?) -(?) -47 0x2F 101111 (?) -(?) -Table 19: POP2 Foretable Codes - -Temple -(?) -(?) - -The pop2 backtable is an expansion if the pop1 backtable and it is sized 4 -times bigger. For each tile there are 4 additional bytes in the pop2 backtable -tiles -block to specify further actions or attributes. This block is sized 4 bytes -tile ∗10 f loor ∗ -loors -∗ 32rooms that is 3840bytes. We call background mask to each block of -3 froom -4 bytes associated to a tile. To locate a background mask you have to do the -following operation: 960 + (room − 1) ∗ 30 ∗ 4 + tileOf f set ∗ 4 Background masks -are stored consecutively each after another until the 960 tiles are specified. -The first byte is an unsigned char (UC) association to one of the 256 door -event registers (see Section 4.2.2) if the tile is an activator. In any other case -this byte is an extra attribute information byte. For example in wall (0x14) -having this byte in 0x04 means the wall is curved. -The second byte in a background mask is the attribute byte. For example -0x18 modifies the tile 0x01 and adds two small stalactites. -We believe the special images uses the 3rd or 4th byte. - -4.2.2 - -Door events - -This section explains how doors are handled and specifies the block pop2 door. -The pop2 door block has 1280 bytes. It is divided in 256 registers of 5 bytes -called door events. Like POP1 events have associations to doors and activate -them. In POP2 events can also activate a floor shooter. -An event is triggered when an activator button (0x22) is pressed. As it is -specified in the Section 4.2.1, the first byte of the attribute mask belonging to a -button tile points it to a door event that is triggered when the button is pressed. -There is a maximum of 256 events because of the unsigned char of the first byte -if the attribute mask in the pop2 backtable block and the 256 registers in the -pop2 door block. -Each event register is of the form “LL SS TT FD FD” which activates the -normal door (0x04), right exit door (0x11) or shooter (0x24) located in the tile -LL of the screen SS. TT is 00 for normal activation and FF for exit doors. -4.2.3 - -Guard handling - -This section explains how guards are handled. In POP2 there are two different -types of guards. We will call them static and dynamic guards. Static guards are -the normal guards that are waiting in a room like in POP1. In the other hand, -dynamic guards are the ones who appear in the room running from one of the -sides. Each type of guard is attached to a room and is handled in a different -way, so a room can have both types of guards, one or none depending on the -specifications. There is a block for each type of guard, pop2 static guard is the -24 - - specification of the static guards and pop2 dynamic guard is the specification -of the dynamic ones. Each block has different specifications and sizes as it is -mentioned bellow. -4.2.4 - -Static guards - -In this item static guards are explained and the pop2 static guard is specified. -For each screen there is reserved memory space for a maximum of 5 guards. -The pop2 static guard block has a size of 3712 divided in 32 sub-blocks of -116 bytes each. As there is a correspondence between each sub-block and the -room with this number, we will call them “room guard blocks”. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 20: High data structures -A room guard block has a size of 116 divided this way: -⋄ 1 byte for the number of guards present in this room. This byte may take -values from 0 to 5. -⋄ 5 block divisions of 23 bytes for each guard. The first divisions have the -guard information, if the number is less than 5, then the latest divisions -corresponding to the missing guards will be filled with zeros or garbage. -If there is a static guard corresponding to this division of 23 bytes, the -following bytes from 0 to 22 will specify the guard: -Byte 0 is a UC showing the location in this room (same as explained in -3.4.5) of the current guard. Bytes 1 and 2 are a SS with an offset in pixels -to reallocate the guard in the floor. Byte 3 is the facing direction as specified -in 3.4.5. Byte 4 is the skill Byte 5 is unknown Bytes 6,7 and 8 are always 0, -probably because 5 is a long from 0 to 255. Byte 9 is the guard colour in levels -where it is needed (0-3), ie. 1 white+blue, 2 white+black, 3 red. Byte 10 is the -guard number (0 for the first one, 1 for the second, etc). Bytes 11,12,13 and 14 -are unknown, mostly 0, but in 10 guards it is 0x52756e2d. Byte 15 is the type -(0-8 and 84), but does not apply in all levels, ie. 5 head, 8 snake. Byte 16 is -the hit points of the guard (0 to 8). Bytes 17 and 18 are the activate triggers -for skeletons, byte 17 is (0,1,-1) and 18 is (0,-1). Normal value is 0x0000 for a -sleeping skeleton. When set to -1 (0xffff) a trigger will be waiting to wake the -skeleton up, for example the exit door open. Other possible values are 0x0100 -that is the skeleton already awake and 0xff00 that seems to be similar than -0x0000. Bytes 19,20,21 are always 0. Byte 22 is unknown (mostly 0, but 1 and -3 where found for some guards). -25 - - 4.2.5 - -Dynamic guards - -The dynamic guards are the ones who appear running throw a room’s corner -and they are defined in the pop2 dynamic guard block. This block has 34 bytes -for each of the 32 rooms, so it is sized 1088 bytes. Each room has a specification -about those guards. There is only one different type of dynamic guard per room, -but it is possible to set the number of guards that will appear running. -Offset Size Type -Name -Description -0 -6 -↓ -Header -The file header -0 -4 -UL HighDataOf f set The location where the -highData begins -4 -2 -US -HighDataSize the number of bytes the -highData has -Table 21: High data structures - -A room guard block has a size of 116 divided this way: -The bytes are from 0 to 33: Bytes from 8 to 17 may take the value 0x5a and -0. Bytes 8,9,10,15,16 are always 0. Byte 18 activates dynamic guard. 1 is true -and 0 is false. Byte 19 is the skill (0-7, 8 to make it passive) Bytes 20, 21 and -22 are always 0. Byte 23 is the dynamic guard mode: 0 or 1 to make the guard -wait until all guards are dead to spawn and 2 to spawn even when the prior -guard is still alive. Byte 24 is the floor the guard will appear on. 0 is the upper -one and 2 is the lower. Another number will kill the guard playing the sound. -Byte 25 is the initial location of the guard. ie. 0 is the left side of the screen, 9 -is the right side, it is possible to locate them in the middle of the screen, they -will magically spawn in a position between 1 and 8. As they will run to the -center of the screen, this byte also sets the facing direction up (0 to 5 is right, 6 -to 9 is left). Byte 26 is the time in ticks the first guard will wait to spawn. Byte -27 is the time in ticks between guards spawn. Bytes 28 and 29 are unknown. -Byte 30 is the number of guards that will appear, there is a maximum of 5 per -room, including static guards. Byte 31 is the hit points the guards will have. - -5 - -PLV v1.0 Format Specifications - -PLV v1.0 files are defined in this table: -Size -7 -1 -1 -1 -4 -4 -B1 - -Offset -0 -7 -8 -9 -10 -14 -18 - -Description -Magic identifier -POP version -PLV version -Level Number -Number of fields -Block 1: Level size (B1 ) -Block 1: Level code -26 - -Type -Content -text “POP LVL” -UC -0x01 -UC -0x01 -UC -UL -UL 2306/2305 -- - - Size Offset Description -Type -4 18 + B1 Block 2: User data size (B2 ) UL -B2 22 + B1 Block 2: User data -Table 22: PLV blocks - -Content - -Level code is the exact level as described in Section 3.4 including the checksum byte. Note that Level size (B1 ) also includes the checksum byte in the -count. POP version is 1 for POP1 and 2 for POP2. PLV version is 1 for PLV -v1.0. Only one level may be saved in a PLV, the level number is saved inside. - -5.1 - -User data - -User data is a block of extensible information, Number of fields is the count of -each field/value information pair. A pair is saved in the following format: -field\_name\\0value\\0 -where \0 is the null byte (0x00) and field name and value are strings. -There are mandatory pairs that must be included in all PLV files. Those -are: -Field name -Description -Editor Name -The name of the editor used to save the file -Editor Version -The version of the editor used to save the file -Level Author -The author of the file -Level Title -A title for the level -Level Description -A description -Time Created -The time when the file was created -Time Last Modified -The time of the last modification to the file -Original Filename -The name of the original file name (levels.dat) -Original Level Number Optional. The level number it has when it was -first exported -Table 23: PLV Mandatory Fields - -The content values may be empty. There is no need to keep an order within -the fields. - -5.2 - -Allowed Date format - -To make easy time parsing the time format must be very strict. There are only -two allowed formats: with seconds and without. With seconds the format is -“YYYY-MM-DD HH:II:SS” Without seconds the format is “YYYY-MM-DD -HH:II” Where YYYY is the year in 4 digits, MM is the month in numbers, MM -the months, DD the days, HH the hour, II the minute and SS the second in the -military time: HH is a number from 00 to 23. -27 - - If the month, day, hour or second have only one digit, the other digit must -be completed with 0. -i.e. 2002-11-26 22:16:39 - -6 - -SAV v1.0 Format Specifications - -SAV v1.0 saves kid level, hit points and remaining time information in order to -restart the game from this position. -SAV files are 8 bytes length in the following format: -Offset Size Type Name Description -0 -2 -US -i -Remaining minutes -2 -2 -US -ii -Remaining ticks -4 -2 -US -iii Current level -6 -2 -US -iv Current hit points -Table 24: SAV blocks - -Remaining minutes (i) Range values: 0 to 32766 for minutes 32767 to 65534 -for NO TIME (but the time is stored) 65535 for game over -1 -Remaining ticks (ii) Seconds are stored in ticks, a tick is 12 -seconds. To get -the time in seconds you have to divide the integer “Remaining ticks” by 12. -Range values: 0.000 to 59.916 seconds (rounded by units of ≈ 83ms or -1 -seconds) -0 to 719 ticks -12 -Level (iii) Range values: 1 to 12 for normal levels 13 for 12bis 14 for princess -level 15 for potion level -Hit points (iv) Range values: 0 for an immediate death 1 to 65535 hit points - -7 - -HOF v1.0 Format Specifications - -HOF files are used to save the Hall of Fame information. -All HOF v1.0 files have a size of 176 bytes. The first 2 bytes belongs to the -record count. The format is US. The maximum number of records allowed is -6, so the second byte is always 0x00. Following those bytes there is an array -of records. This array has a full size of 29 bytes distributed according to the -following table. -Offset Size Type Name Description -0 -25 text -Player name -25 -2 US 1 -Remaining minutes -27 -2 US 1 -Remaining ticks -Table 25: HOF blocks -1 similar to SAV format - -28 - - In case there is no record, the 29 bytes spaces must be filled with zeros in -order to complete the whole file and give it the size of 2 + 29 ∗ 6 = 176. - -8 - -Credits - -This document -Writing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Patrik Jakobsson -Hubai Tamas -Reverse Engineering -Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enrique Calot -Brendon James -MAC Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dongsoo Lim -Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tammo Jan Dijkema -RLE Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tammo Jan Dijkema -LZG Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anke Balderer -Diego Essaya -Sounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Christian Lundheim -Palettes and Speaker Sounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . David -PLV v1.0 -Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Brendon James -Enrique Calot - -9 - -License - -c 2004 – 2008 The Princed Project Team Permission is granted to -Copyright ° -copy, distribute and/or modify this document under the terms of the GNU Free -Documentation License, Version 1.2 or any later version published by the Free -Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no -Back-Cover Texts. - -Indexes -List of Tables -1 -2 -3 -4 - -DAT file blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . -Image headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -Algorithm codes . . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Palette blocks . . . . . . . . . . . . . . . . . . . . . . . - -29 - -5 -6 -6 -9 - - 5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 - -EGA and CGA palettes . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Level blocks . . . . . . . . . . . . . . . . . . . . . . . . . -POP1 Foretable codes . . . . . . . . . . . . . . . . . . . . . . . . -Background modifiers by group . . . . . . . . . . . . . . . . . . . -Stone modifiers on seed position . . . . . . . . . . . . . . . . . . -First 20 seed values of the second row separator . . . . . . . . . . -Default Guard colours . . . . . . . . . . . . . . . . . . . . . . . . -Wave Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT file blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 1.0 Level blocks for Mac . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -DAT 2.0 Master index . . . . . . . . . . . . . . . . . . . . . . . . -Slave Index ID strings . . . . . . . . . . . . . . . . . . . . . . . . -DAT 2.0 Level blocks . . . . . . . . . . . . . . . . . . . . . . . . . -POP2 Foretable Codes . . . . . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -High data structures . . . . . . . . . . . . . . . . . . . . . . . . . -PLV blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -PLV Mandatory Fields . . . . . . . . . . . . . . . . . . . . . . . . -SAV blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -HOF blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - -9 -10 -12 -14 -15 -15 -16 -18 -18 -19 -19 -20 -21 -22 -24 -25 -26 -27 -27 -28 -28 - -List of Figures -1 - -Distribution of the sindow size. . . . . . . . . . . . . . . . . . . . - -30 - -8 - - \ No newline at end of file diff --git a/applications/SprPoP/docs/README.md b/applications/SprPoP/docs/README.md deleted file mode 100644 index 572563f..0000000 --- a/applications/SprPoP/docs/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# `SprPoP/docs` — индекс - -Актуальность на 2026-08-26 (перенос из `applications/PoP/roomtest`). -Сюда взято только то, что ещё читают. Исполненные планы остались архивом -в `../../PoP/docs/`, закрытые задачи и баги — в `../../PoP/roomtest/`. - -## Входные точки - -| Документ | О чём | -|----------|-------| -| [`TASKS_OPEN.md`](TASKS_OPEN.md) | **Что берётся в работу сейчас** — начинать отсюда | -| [`BUGS_OPEN.md`](BUGS_OPEN.md) | Открытые баги и незакрытые оптимизации | -| [`../CHANGELOG.md`](../CHANGELOG.md) | **Что менялось по релизам** глазами игрока; версия и дата берутся из git-тега | -| [`impl_diff.md`](impl_diff.md) | **Осознанные расхождения с SDLPoP**: где сделано не дословно и почему. Новое расхождение — записью сюда, а не только комментарием в коде | -| [`keys.txt`](keys.txt) | **Целевая раскладка управления**, к которой подгоняем SprPoP | -| [`keys_plan.md`](keys_plan.md) | План перевода на неё: что совпадает, что переназначить, каких функций нет вовсе | -| [`../assets/orig/README.md`](../assets/orig/README.md) | **Откуда берутся исходные данные**: `make fetch` (SDLPoP + музыка), зачем нужен и почему необязателен `MSDOS/`, `SND_SRC` | - -## Производительность - -| Документ | О чём | -|----------|-------| -| [`perf_registry.md`](perf_registry.md) | **Реестр оптимизаций**: всё отложенное одним списком | -| [`perf_backlog.md`](perf_backlog.md) | Отложенная оптимизация отрисовки + **как мерить** (wait-state'ы, границы кадра) | -| [`perf_green_phase.md`](perf_green_phase.md) | ЗЕЛЁНАЯ фаза (слой фона): раскладка тактов, способы ускорения G1..G6, журнал правок | -| [`perf_cyan_phase.md`](perf_cyan_phase.md) | ЦИАН фаза (персонажи + передний слой): раскладка тактов, C1..C7, журнал правок | -| [`perf_l11_room15.md`](perf_l11_room15.md) | Сцена и замер: факел + чомпер + страж (ур.11 к.15) | -| [`perf_l13_room23.md`](perf_l13_room23.md) | Сцена и метод замера кадра: каскад плит (ур.13 к.23), зонды, канал `clog` | -| [`resident_budget.md`](resident_budget.md) | Бюджет резидента W1/W2: как мерить и как освобождать | -| [`layout_plan_v2.md`](layout_plan_v2.md) | Раскладка кода по окнам/банкам/страницам + замеры скорости отрисовки | - -## Движок и содержание игры - -| Документ | О чём | -|----------|-------| -| [`full_game_plan.md`](full_game_plan.md) | Полноценная игра: автомат состояний, title/intro, demo, таймер, cutscenes, ending, Hall of Fame | -| [`levels_plan.md`](levels_plan.md) | Уровни: загрузка, переходы, тайлсеты, читы | -| [`levels_12_15_plan.md`](levels_12_15_plan.md) | Уровни 12/13 (тень, Джафар, падающие плиты) + что такое 14/15 и 0 | -| [`midtable_analysis.md`](midtable_analysis.md) | Слои отрисовки: back/mid/fore и objtable в оригинале, чего стоит порт | -| [`room_model_plan.md`](room_model_plan.md) | `kid_room ≠ drawn_room` (straddle): сделан S1, остальное впереди | -| [`quicksave_plan.md`](quicksave_plan.md) | QuickSave/QuickLoad (реализовано): формат снимка `POPQ` v3 — справочник | -| [`menu_settings_plan.md`](menu_settings_plan.md) | Pause menu и Settings, `POP.CFG`, VANILLA и задел под ENHANCED | -| [`palette_plan.md`](palette_plan.md) | Карта всех 256 слотов палитры + механика fade | -| [`status_line_text.md`](status_line_text.md) | Строка HP как статус-строка: инвентаризация ВСЕХ текстов SDLPoP | -| [`sound_plan.md`](sound_plan.md) | Звук через CBL: разбор и архитектура | -| [`music_runtime_index_plan.md`](music_runtime_index_plan.md) | Будущее улучшение: runtime-индексы музыки и PCM-эффектов, смена аудионаборов без перелинковки EXE | -| [`shadow_render.md`](shadow_render.md) | Вид Тени (OR+XOR) — отложено: почему XOR несовместим с прозрачностью `#FF` | -| [`roomnav_skip.md`](roomnav_skip.md) | Комнаты для отладочного телепорта `+`/`−`: какие пропускать и почему | -| [`host_tests_plan.md`](host_tests_plan.md) | Модульные тесты движка под ucsim_z80: два шва, регрессии, дифф против SDLPoP | - -## Справочники по оригиналу - -| Документ | О чём | -|----------|-------| -| [`PORT_PLAN.md`](PORT_PLAN.md) | Общая карта фаз со статусами; §6 модель движения, §10 режим памяти | -| [`KID_PLAN.md`](KID_PLAN.md) | Модель персонажа: `char_type`, `actions_*`, устройство `play_seq` | -| [`gates_spikes_plan.md`](gates_spikes_plan.md) | Раскладка объектов по комнатам, декод `LINKLOC`/`LINKMAP`, ссылки на seg-код | -| [`PoP/POP-DAT-FormatSpecifications.pdf`](PoP/POP-DAT-FormatSpecifications.pdf) | **Каноническая спецификация форматов `.DAT`** (грепаемая копия — `.txt`) | -| [`PoP/MSDOS_RESOURCE_FORMAT.md`](PoP/MSDOS_RESOURCE_FORMAT.md) | Наш разбор ресурсов MS-DOS-версии | -| [`PoP/APPLEII_RESOURCE_FORMAT.md`](PoP/APPLEII_RESOURCE_FORMAT.md) | Наш разбор ресурсов Apple II | - -## Заделы - -| Документ | О чём | -|----------|-------| -| [`ideas_backlog.md`](ideas_backlog.md) | Осознанно отложенные гипотезы (мышь, PRNG) | -| [`prng_alternatives.md`](prng_alternatives.md) | Запасные генераторы, если упрёмся в бюджет кадра | - -## Не переносилось - -Исполнено целиком, лежит в `../../PoP/docs/`: `frame_pacing_plan.md` -(фиксированный логический кадр), `l9_invert_plan.md` (зелье переворота), -`shadow_atlas_plan.md` (запечка атласа Тени). diff --git a/applications/SprPoP/docs/TASKS_OPEN.md b/applications/SprPoP/docs/TASKS_OPEN.md deleted file mode 100644 index c4e2dbd..0000000 --- a/applications/SprPoP/docs/TASKS_OPEN.md +++ /dev/null @@ -1,1678 +0,0 @@ -# SprPoP — доска ОТКРЫТЫХ задач (обновлено 2026-08-11) - -Что берём в работу сейчас и в каком порядке. Каждая запись: что сделать, -почему именно сейчас, чем подтверждать результат. - -- закрытые задачи с протоколами и замерами — [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md); -- открытые баги — [`BUGS_OPEN.md`](BUGS_OPEN.md), закрытые с разбором корней — - [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md); -- планы фаз — `../docs/PORT_PLAN.md`, `../docs/layout_plan_v2.md`, - `../docs/levels_plan.md`. - -**Состояние на 2026-08-11 (сверено с кодом, не только с доской):** - -- **уровни 1-4 приняты smoke-тестами** (пользователь). Полные обходы всех - комнат делаются по готовности ВСЕХ уровней — политика приёмок в - [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#pass-policy); отдельных задач - `L3-PASS`/`L4-PASS` больше нет. Уже сделанные полные обходы уровней 1 и 2 - остаются регресс-базой; -- **[L4-MIRROR](TASKS_CLOSED.md#l4-mirror) закрыта**: зеркало, отражение, - прыжок сквозь него и рождение тени проверены в MAME. Хвосты — вид тени - (отложен, [`../docs/shadow_render.md`](shadow_render.md)) и - [MIRROR-FG-STALE](BUGS_CLOSED.md#mirror-fg-stale) (закрыт как не баг); -- **[L3-CHOMP](TASKS_CLOSED.md#l3-chomp) и [L3-SKEL](TASKS_CLOSED.md#l3-skel) - закрыты** (2026-08-08 / 2026-08-07); -- **тайлсет palace сделан** — `pop_bg_load(type)`, `pal_*.atl`, дворцовая - кладка `wall_pattern`, решётчатые тайлы 25-29 и в `tile_table`, и в - коллизии (`tile_is_floor` совпадает с seg006:0628). То есть шаг 2 - `levels_plan.md` закрыт; -- **libbgi:** блочные AND/OR/XOR/NOT акселератора (2026-08-11, `tests/accop`) - — задел под вид тени и под любые эффекты «поверх того, что уже нарисовано». - -**Обход уровней после оптимизации фаз — идёт сейчас (начат 2026-08-17).** -Оптимизация зелёной/циан фаз тронула порядок пометок и перерисовок, поэтому -уровни проходятся заново подряд: - -| уровень | статус | что нашлось и закрыто по дороге | -|---|---|---| -| 1 | **принят** (2026-08-17) | мерцание торцов плит/полов/кнопок (запечка шире копируемого прямоугольника); потолочный fore поверх падающей плиты (не было ряда −1 в проходе foretable); соседний пол под плитой (потерянная половина `draw_mob` — `set_redraw2`); залипший блеск меча (`trob_drawn` не совпадал с тем, что нарисует полная отрисовка) | -| 2 | **принят** (2026-08-17) | чёрные бары поверх стража — `bar` с `x + w > 320` заворачивался в соседнюю страницу видеопамяти (`dd40c24`); [BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1) — боевая стойка без меча под читом бессмертия | -| 3 | **принят** (2026-08-17) | критичных багов не найдено — правок не потребовалось | -| 4 | **предварительно пройден** (2026-08-17) | [LEVELDOOR-PALACE-CLIP](BUGS_CLOSED.md#leveldoor-palace-clip) — во дворце проём двери уровня на 8 px шире, и контур Кида в анимации ухода обрезался раньше времени (`89b603a`) | -| 5 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 6 | **предварительно пройден** (2026-08-18) | [SHADOW-STALE-FRAME](BUGS_CLOSED.md#shadow-stale-frame) — тень залипала на страницах дабл-буфера в РАЗНЫХ позах (кадр брался из кэша, снимок писался по `Guard.frame`, `085a198`); [BLUELINE-NOBLUE](BUGS_CLOSED.md#blueline-noblue) — кусок синего узора на стене: модификатор стены не переводился при загрузке (`af4e644`) | -| 7 | **предварительно пройден** (2026-08-18) | [SPIKE-BAKED](BUGS_CLOSED.md#spike-baked) — выдвинутые пики консервировались в фон запечкой соседней кнопки и оставались навсегда (`980d48c`); [DIED-ON-BUTTON](BUGS_CLOSED.md#died-on-button) — смерть на кнопке не ломала её насовсем: до `check_press` труп не доходил, самой `died_on_button` не было, а таймер связи переживал респавн (`6feab5d`) | -| 8 | **предварительно пройден** (2026-08-18) | [GUARD-RESPAWN-COL0](BUGS_CLOSED.md#guard-respawn-col0) — при возврате в комнату страж телепортировался в колонку 0 и падал насмерть: колонку несёт `guards_x`, а не тайл (`c40ae3f`); [SEAM-FIGHT-FLICKER](BUGS_CLOSED.md#seam-fight-flicker) — бой у шва перерисовывал комнату туда-обратно: `leave_room` запрещает уход ещё и на кадрах меча (`a498255`, сверено с SDLPoP покадрово) | -| 9 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 10 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 11 | **предварительно пройден** (2026-08-18) | [MOB-NEIGHBOUR-ROOM](BUGS_CLOSED.md#mob-neighbour-room) — плиты нижнего ряда пропадали без кадров падения (кусок в соседней комнате не рисовался, `ed5615a`); порядок куска относительно соседней плиты и Кида — порт корзины 30 (`4db60c7`) | -| 12 | **предварительно пройден** (2026-08-18) | багов не найдено | -| 13+ | не начат | | - -«Предварительно пройден» ≠ «принят»: уровни 4-6 пройдены прогоном по -сценарию, а не обходом ВСЕХ комнат — полные обходы делаются по готовности -всех уровней ([политика приёмок](TASKS_CLOSED.md#pass-policy)). -Регресс-базой остаются полные обходы уровней 1 и 2. - -Критичных багов на уровнях 1-6 не осталось. Следом — регресс тактов на -23/13 (документы фаз: [`../docs/perf_green_phase.md`](perf_green_phase.md), -[`../docs/perf_cyan_phase.md`](perf_cyan_phase.md), сцена и метод — -[`../docs/perf_l13_room23.md`](perf_l13_room23.md)). - -Правило проекта в силе: механику сверять с `../SDLPoP/src/` ДО кодинга; -диагноз платформы подтверждать артефактом (брейкпоинт/дамп/.asm), а не -гипотезой (memory `defer_unexplained_quirks`). - ---- - -## ТЕКУЩАЯ ЦЕЛЬ: уровень 8 - -Уровни 1-7 играются (smoke; зелья уровней 2 и 7 приняты пользователем -2026-08-12). Уровень 8 **новых тайлов не приносит вовсе** (инвентарь -`res2008.bin` целиком покрыт уровнями 1-7), тайлсет — подземелье. -Спецсобытие уровня — мышь, [L8-MOUSE](TASKS_CLOSED.md#l8-mouse) закрыта -2026-08-12 (хост-набор `t_mouse` + живая проверка в MAME). - -Остаётся smoke-прогон самого уровня: он длинный и с возвратом через два -чомпера комнаты 4, а стражи там сильнее прежних (комната 5 — skill **7**, -это максимум из встречавшихся; 12/22/24 — skill 2/3/3). - - -### L9-INVERT. Зелье ПЕРЕВОРОТА — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Подробный план реализации — [`../docs/l9_invert_plan.md`](../../PoP/docs/l9_invert_plan.md)** -> (задачи libbgi, задачи приложения, порядок работ, риски, открытые вопросы). -> Ниже — механика и обоснование решений; план исполняется по документу. - -Единственное новое на уровнях 9-11: зелья типа 4 на `(1,7)` комнаты 7 и -`(0,4)` комнаты 10 (сверено по `res2009.bin`). Уровни 10 и 11 не приносят ни -тайлов, ни спецсобытий — только дворцовый тайлсет (есть) и стражи skill 3-4. - -Механика оригинала (seg000:15E9 `toggle_upside`, seg006:1886): -`upside_down = ~upside_down`, снимается смертью Кида (seg000:1224, при -`alive >= 0`) и стартом уровня (seg003:38/188); второе зелье переворачивает -обратно. Управление НЕ инвертируется. Переворот у оригинала — чисто вывод: -`flip_screen(offscreen)` перед копированием прямоугольников на экран и обратно -после (seg000:939/946); полоса HP рисуется прямо на экран (y = 194) и НЕ -переворачивается. - -**Приём оригинала — переворачивать буфер на выводе КАЖДЫЙ кадр — нам не -подходит:** страниц ровно две (`gfx_set_visible_page` → ESTEX $54 SELPAGE, -бит 0), рабочей третьей нет, а переворот в видимую страницу порвёт картинку -(проход не влезает в vblank). Значит переворачиваем ОДИН РАЗ в момент смены -флага, а дальше рисуем зеркально: -`y' = POP_YOFF + POP_PLAYFIELD_H - (y - POP_YOFF) - h` плюс вертикальное -зеркало самого спрайта. - -#### Момент переключения — accel-копия экрана (ОСНОВНОЙ ВАРИАНТ) - -Решение пользователя 2026-08-12. Уже нарисованное переворачиваем не -перерисовкой комнаты, а построчной копией акселератора: - -1. **проход A → B с реверсом Y**: строка `y` читается, пишется в `191-y` - (смена Port_Y между burst-чтением и burst-записью). 320 байт в один burst - не лезут — две скобки на строку; -2. **проход B → A без реверса**: вторая страница дабл-буфера получает то же - изображение. - -Почему это работает на нашем железе, а не только на бумаге: **accel читает -ОЗУ-КОПИЮ, а не VRAM** (memory `accel_block_ops`), то есть копируется ЧИСТЫЙ -фон без персонажей, а запись банком `GFX_BANK_NORMAL` идёт и в видео, и в -ОЗУ-копию приёмника. После двух проходов обе страницы имеют перевёрнутый фон -в обеих плоскостях — **heal не меняется ни на строку**, он и дальше -восстанавливает правильный фон по фактическим координатам отрисовки. - -Бюджет: 192 строки × 2 burst'а × 2 прохода = 768 burst-строк. По нашим -замерам строка-burst стоит ~300-530Т (`gfx_heal_noclip` 22×22 = 11 658Т → -530Т/строку; у заливки линия 51-53Т, но там нет данных) — итого -**230-410 К тактов, то есть 0.2-0.3 логического кадра** (логический = 3 -растровых ≈ 1.29 млн). Перерисовка комнаты в обе страницы стоила бы под -миллион тактов И требовала бы vflip-версии тайлового блита — здесь она не -нужна вовсе. - -Что дописать в libbgi: `_bgi_copy_rows_raw` умеет только ИНКРЕМЕНТ Port_Y на -строку (`y0` + шаг вперёд, страйды патчатся SMC) — нужен вариант с -декрементом одной стороны (параметр «шаг Y» либо отдельное ядро -`_bgi_flip_rows_raw`). Перед реализацией подтвердить ДАМПОМ, что обе -страницы одновременно адресуемы в W3: `gfx.h` говорит, что страница 1 -начинается на 320 байт дальше (0xC140), но это комментарий, а не проверка -(memory `defer_unexplained_quirks`). - -Зеркало по вертикали стоит по-разному в зависимости от раскладки спрайта: - -- **row-major** (весь слой фона: тайлы, кладка, факелы, зелья, обломки, - двери) — бесплатно: внешний цикл идёт по строкам источника снизу вверх, сама - строка копируется вперёд. В libbgi такого варианта СЕЙЧАС НЕТ (флип есть - только у `gfx_blit_cols*`, и он горизонтальный) — нужна пара - `gfx_blit*_vflip`; -- **column-major** (Кид, стражи, мышь, меч — 34 атласа, 228 563 Б) — реверс - ВНУТРИ колонки, а accel копирует блок только вперёд. Нужны перевёрнутые - копии в отдельных EMM-страницах (реверс через стек `pop`/`push`, ~10 тактов - на байт). - -**Когда делать копии — решать при реализации,** варианты в порядке -предпочтения: - -1. **ленивый постраничный кэш**: страница атласа (8 кадров, 3-10 КБ) - переворачивается при первом обращении в перевёрнутом режиме — ~0.2-0.4 - растрового кадра на страницу, размазано по времени; реально нужны 5-10 - страниц из 34, и если зелье не выпито, не тратится ничего; -2. на входе в уровень, где в данных есть зелье типа 4 (скан `bg` уровня) — - вся пачка разом, ~5-6 млн тактов ≈ 0.3 с, пауза прячется в загрузку; -3. офлайн в `pop_pack_kid.py`/`pop_pack_guard.py` — рантайм ноль, но +228 КБ - на диске и +34 страницы всегда, а на дискете это заметная загрузка. - -Не забыть при реализации: зеркалить надо и heal-прямоугольники, и футпринт -fore-слоя, и клип (`clip_char`), и брызги; полоса HP и лейбл комнаты остаются -как есть (они вне поля 192). - - -### UI-SPRITES. Деления HP — из атласов персонажей в константы резидента - -`pop_kid_img_blit` (**334 Б в W1/W2**) существует ради двух картинок 6×5: -полосе HP нужен блит по image id из кидовских атласов, а те column-major, и -обычным `gfx_blit_noclip` их не нарисовать. Деления Кида (images 216/217, -`kid27.atl`) и стража (idx 0 в `g0.atl`) — по 30 байт каждое. - -**Решение пользователя 2026-08-12: положить их const-массивами в РЕЗИДЕНТ** -(~68 Б данных), а не подселять в фоновый атлас: резидент всегда ниже -0xC000, значит `gfx_blit*` их видит (буфер обязан быть вне W3), EMM-страница -не тратится, упаковщики не трогаются. Чистая экономия ~266 Б. - -Побочный плюс для [L9-INVERT](#l9-invert): страницы `kid27` и `g0` сейчас -смешанные — деления HP (борт, не переворачиваются) лежат рядом с брызгами -крови 28×26 (поле, переворачиваются). После переноса обе страницы -становятся чисто «полевыми», и постраничный кэш перевёрнутых кадров получается -однородным, без спрайтов-исключений. - - -### MEM-COLD2. Второй шаг разгрузки резидента - -> **Пункт 2 сделан 2026-08-12**: `guard_over_kid` с хелперами -> (`objtile_at_char` / `char_x_left_of` / `tile_div_mod`) уехал в банк 8 — -> куча 1005 → **1574 Б**. Зовётся раз в кадр, то есть цена — один трамплин. -> Остались пункты 1 (`enter_room_side`) и 3 (блок редроя шва). - -После [MEM-COLD1](TASKS_CLOSED.md#mem-cold1) куча 1707 Б. Когда упрётся -снова, в банк 8 переезжают следующие кандидаты (в порядке выгоды): - -1. `enter_room_side` — самая большая функция `sprpop.c`, зовётся раз на - комнату. Требует вынести наружу рабочие массивы комнаты - (`room_bg`/`lcol_*`/`rcol_*`/`below_fg`/`above_*`) — сами данные останутся - в `_DATA`, уедет только код; -2. `guard_over_kid` + `objtile_at_char`/`char_x_left_of`/`tile_div_mod` — - зовётся КАЖДЫЙ кадр, но ровно один раз: цена выноса — один трамплин; -3. блок редроя левого шва в `main` (`seam_row_sig` + разбор сигнатуры). - -Если и этого не хватит — следующим уходит сам кадровый порядок отрисовки, -но тогда уже стоит мерить, а не выносить наугад. - ---- - -## ПРЕДЫДУЩАЯ ЦЕЛЬ: уровень 5 - -Уровни 1-4 играются (smoke). Дальше идём по порядку уровней; уровень 5 — -следующий. - -**Хорошая новость по ассетам: уровень 5 не приносит НИ ОДНОГО нового тайла.** -Инвентарь, снятый перебором `res2005.bin` (fg & 0x1F): - -``` -ур. 5: empty, floor, spike, pillar, gate, closer, doortop_with_floor(7), - bigpillar_bottom(8), bigpillar_top(9), potion, loose, doortop(12), - debris, opener, level_door L/R, chomper(18), torch, wall, - lattice_pillar(25)…lattice_right(29) -``` - -— всё это уже встречалось на уровнях 1-4 и портировано. Единственное новое -на уровне 5 — **спецсобытие «тень крадёт зелье»**. - -| # | Задача | Что | Блокирует | -|---|--------|-----|-----------| -| — | [DRAW-COST](#draw-cost) | **кадр уложился в бюджет 2026-08-09**: 470 964 -> 425 600 тактов, период цикла 4 растровых кадра -> **3**. Дальнейшее — запас, не срочность | плавность на ВСЕХ уровнях | -| ✔ | [L1-SPEED](#l1-speed) | **закрыта 2026-08-19** режимами скорости (NORMAL = 4/5 растров, как оригинал) | — | -| — | [TUNE-1](#tune-1) | параметры движка → cfg-файл (сейчас `pop_tune.h`) | отладка таймингов и моды; берётся по мере надобности | -| — | [TUNE-2](#tune-2) | параметры СТРАЖЕЙ (6 таблиц по 12 градаций мастерства + HP) → cfg-файл | подбор сложности боя без пересборки | -| — | [SND](#snd) | звук: эффекты через CBL, музыка на AY | разбор готов — `../docs/sound_plan.md` | -| — | [MEM](#mem-next) | следующий шаг разгрузки W1/W2 | берётся по факту нехватки места | - -Сделанное — в [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md): L4-MIRROR, L3-CHOMP, -L3-SKEL, L3-CHKP, L2 (машинерия уровней), L2-PASS, L1-PASS, DRAW-CHAR, -MEM-BANK2, MEM-BANK5, CLIP-1, KBD-1, DBG-CHEATS. - ---- - -## Ждёт ФИНАЛЬНОЙ приёмки (полные обходы по готовности всех уровней) - -Сюда попадает то, что уже работает в проверочном прогоне, но должно быть -подтверждено на сквозных прогонах уровней — потому что задевает механику -шире, чем собственный сценарий. - -- **Зацеп ПРЯМО В ПРЫЖКЕ** (`POP_ENABLE_JUMP_GRAB`, `pop_tune.h`, сделан - 2026-08-06, предварительно проверен пользователем). Почему нужен именно - финальный прогон: точки вызова стоят не только в `check_action`, но и в - ОБЕИХ ветках `check_bumped` — то есть код вклинивается перед обычным - ударом о стену. Регрессия проявится не в самом зацепе, а рядом: удар о - стену с зажатым Shift, осторожный шаг у стены, отскок в прыжке. На - уровнях 1–3 это надо специально потрогать в паре мест каждого уровня. - Напоминание: в ВАНИЛИ этого зацепа нет (у SDLPoP — `enable_jump_grab`), - так что сверять его с оригиналом «как есть» нельзя — только с SDLPoP при - включённых enhancements. - Прогон 2026-08-07 (уровни 1 и 2) регрессий рядом не показал, но специально - на удар о стену с Shift не проверялся. - -## P0 — делаем сейчас - -### CHAR-PARTIAL-REDRAW. Неподвижный персонаж перерисовывается зря: метка «фон трогали» слишком груба — ОБЯЗАТЕЛЬНО - -**Постановка (пользователь, 2026-08-19).** Проверять, нужна ли отрисовка -стража, когда он НЕ ДВИГАЕТСЯ. Если движется — лишние ~150 000 тактов -приемлемы: в оригинале во время боя число физических кадров на логический -тоже растёт на единицу. - -**Измерено** (сцена 11/15, чтение `pop_cd` из памяти машины): - -| объект | x | y | -|---|---|---| -| страж, спрайт | 257..284 | 18..56 | -| страж, клинок (накладной) | 241..261 | 31..37 | -| пламя факела (колонка 6 → рисуется в ячейке 7) | 232..247 | 5..22 | - -**Физического перекрытия НЕТ.** По x клинок и пламя пересекаются -(241..247), но по y расходятся: пламя кончается на 22, клинок начинается с -31 — девять пикселей чистого зазора. Пользователь увидел это на экране -раньше, чем я в числах: «страж полностью правее пламени, только меч может -пересекаться». - -**Почему тогда он перерисовывается.** Метка «фон трогали» (`pop_cd_touch` -в `pop_tile.c`) хранится как битовая маска КОЛОНОК по 32 px, отдельно на -каждый из ТРЁХ рядов по 63 px (`cd_row_of`). Пламя и клинок попадают в -один ряд 0 и в одну колонку 7 — и `cd_quiet` считает слот задетым. -Расплата: **148 302 такта, 23 % работы кадра** (85 524 спрайт с клинком и -снимком + 62 778 fore-проход) за перекрытие, которого нет. - -**Решение — поднять вертикальную точность метки.** Вместо «маска колонок × -3 ряда» хранить на каждую колонку ДИАПАЗОН y (`ymin`/`ymax`): 10 колонок × -2 байта × 2 страницы = 40 байт. `pop_cd_touch` расширяет диапазон -затронутых колонок, `pop_cd_hit` проверяет пересечение диапазонов. - -Проверка решения на обоих случаях сцены: - -- **страж:** клинок в колонках 7-8. В колонке 7 у метки лежит y 5..22 - (пламя), у клинка 31..37 — не пересекаются, колонку 8 пламя не трогало. - Слот остаётся «тихим» → экономия 148 302; -- **Кид в тяжёлой позиции:** пламя левого факела y 5..22, Кид y 15..55 — - пересечение НАСТОЯЩЕЕ, и он честно перерисовывается. Так и должно быть. - -Вариант с 8-пиксельными полосами вместо диапазонов тоже работает -(24 полосы), но 16-пиксельные УЖЕ НЕТ: пламя и клинок снова слипаются в -одной полосе. Диапазон на колонку точнее и не требует битовой возни. - -**Чего делать НЕ надо** (проверено расчётом, не повторять): частичную -перерисовку персонажа по пересечению и обрезку фона под ним. Обе правки -решают задачу, которой нет — перекрытия не существует. - -**Проверка:** замер 11/15 в обеих позициях Кида (лёгкая x = 99, тяжёлая -x = 106; разбор — [`../docs/perf_l11_room15.md`](perf_l11_room15.md) -§7), плюс визуальный прогон боя и прохода Кида под факелами: персонаж не -должен оставлять хвостов и не должен просвечивать сквозь пламя. - -**Место в очереди — [`../docs/perf_registry.md`](perf_registry.md), -позиция P15.** Смежное: P14 (fore-проход — вторая половина той же цены). - - -### HEAL-WIDTH. Ширина точечных heal'ов не совпадает со следом перерисовки — ОБЯЗАТЕЛЬНО - -**Постановка (пользователь, 2026-08-18).** Ширины heal'ов взяты «на глаз по -клеткам», а не по реальному следу. Сжатие до фактического следа даёт около -**10 % площади** самой дорогой операции акселератора; по оценке пользователя -5-6 % реального выигрыша. Задача обязательная. - -**Измерено** (каталоги атласов, спрайты плиты): - -| часть плиты | подземелье | дворец | -|---|---|---| -| верх (`41/69/70`) | 32 × 13-14 | 32 × 13-14 | -| правая грань (`42/71/72`) | **26** × 15-16 | **25** × 15-16 | - -То есть анимированный след ОДНОЙ плиты — `32 + 26 = 58` пикселей в -подземелье и `57` во дворце. - -**Что стоит сейчас.** В коде уживаются ДВЕ разные договорённости: - -- **60** = «свой тайл + свес соседа» — `pop_floor_bake` (там это записано - комментарием); -- **64** = «две клетки» — `pop_loose_shake_draw`, `pop_spike_redraw` - («ширина 64 = обе ячейки»). - -Для трясущейся плиты 64 избыточны: хватает 58 (подземелье) / 57 (дворец), -то есть **6 пикселей из 64 — впустую, 9,4 % площади heal'а**. - -**И обратная сторона, которую тоже надо разобрать.** Ни 60, ни 64 не -покрывают того, что перерисовка РИСУЕТ: два полных `draw_tile` красят до -**90** пикселей (32 свои + 32 соседа + 26 правой грани соседа, уходящей в -третью клетку). Видимого артефакта отсюда пока нет — содержимое третьей -клетки статично и перерисовывается одинаково, а трясущийся сосед накрывает -эту область своим heal'ом, — но несоответствие «heal уже, чем след» надо -либо закрыть, либо записать как осознанное. - -**Что сделать.** Свести ВСЕ точечные heal'ы (`pop_loose_shake_draw`, -`pop_spike_redraw`, `pop_chomp_redraw`, `pop_floor_bake`, `pop_loose_bake_empty`, -`pop_ceil_*`, коридор `mob_heal_*`) в таблицу «что рисует / что чистит» и -привести ширину каждого к фактическому следу. Ширины брать ИЗ АТЛАСА, а не -из номера клетки — они разные у двух тайлсетов (26 против 25). - -**Проверка:** замер 13/23 до/после (heal'ы — зелёная фаза) плюс визуальный -прогон комнат с плитами, пиками и чомперами: сужение heal'а — самый прямой -способ получить «недочищенный хвост». - -**Родня — [G8](perf_green_phase.md) (пометка соседа узкой полосой).** -Это две половины одной темы, и брать их логично вместе: G8 про ширину -ЗАПЕЧКИ соседнего тайла (60 вместо 28 нужных, да ещё `draw_tile` соседа -дважды на пометку), HEAL-WIDTH — про ширину HEAL'ов (64 вместо 58/57). -Числа там уже разобраны: 60 = 32 свой тайл + 28 собственный свес, и для -запечки САМОГО тайла 60 минимальны — сужать можно только пометку СОСЕДА. - -**Место в общей очереди — [`../docs/perf_registry.md`](perf_registry.md) -(позиция P8).** Там же собраны ВСЕ отложенные оптимизации из трёх фазовых -доков, отсортированные по измеренному эффекту, и разложена цена одного блита -(6 126 тактов фиксированной накладной на любой блит, независимо от размера). - - -### L12-SHADOW. Уровень 12: тень, бой, слияние — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-13: код написан, хост-тесты зелёные (45 проверок, -> `tests-host/t_shadow.c`), ЖИВОЙ ПРОВЕРКИ В MAME ЕЩЁ НЕ БЫЛО.** Для неё -> нужна сборка с `FIRST_LEVEL=12` и полный рестарт MAME после `make hdd`. - -План и сверка констант с оригинальными данными — -[`../docs/levels_12_15_plan.md`](levels_12_15_plan.md) §1 и §7. -Сделано ровно по нему: - -| кусок | где | порт | -|---|---|---| -| подъём тени в комнате 15 (условие «меч уже подобран») | `guards.c` `pop_check_shadow` | seg002:0070 | -| `init_shad_12` + вход ПАДЕНИЕМ (`seq_7`) | `guards.c` | data:0EFA | -| ИИ тени: ждать Кида / драться / сойтись / слиться | `guards.c` `autocontrol_shadow_level12` | seg002:1184 | -| «ранил тень — ранил себя» | `pop_guard.c` `pop_do_delta_hp` | seg000:1518 | -| «убил тень — убил себя» | `guards.c` `pop_check_killed_shadow` | seg006:2033 | -| таймер вспышки слияния (0 → счётчик → −1) | `pop_guard.c` `pop_shadow_timer` | seg003:0735 | -| меч исчезает при уходе вправо из комнаты 18 | `guards.c` `pop_sword_disappears` | seg002:0536 | -| появление плит в комнатах 2/13 после слияния | `pop_map.c` `floors_appear` | seg006:1063 | -| бесшовный переход 12 → 13 (комната 23, без двери) | `sprpop.c` + `pop_start_level` | seg000:0900 | - -Осознанное расхождение: мигания Кида спрайтами тени во время вспышки нет — -запись в [`../docs/impl_diff.md`](impl_diff.md). - - -### LOOSE-SHAKE-RUNS. Дрожание плит: пометки по сменам кадра, а не по кадрам - -**Идея пользователя 2026-08-13, на этап полиша.** - -`pop_loose_tick` на КАЖДОМ кадре отсчёта ставит `pop_set_redraw(pos, -POP_RD_LOOSE, 1)` — полную перерисовку тайла, десять раз за отсчёт. А -кадр дрожания меняется не каждую фазу: таблицы -(`POP_LOOSE_FRAM_BOTTOM` = 43,73,43,74,74,43,43,43,74,74,74) дают - - фаза 1 2 3 4 5 6 7 8 9 10 - кадр 73 43 74 74 43 43 43 74 74 74 - ^^^^^ ^^^^^^^^ ^^^^^^^^ - парами и тройками одно и то же - -С фазы 5 кадры идут ТРОЙКАМИ. Значит вместо шести пометок с `pages = 1` -хватит двух — на фазах 5 и 8 — но с `pages = 2` (обе страницы дабл-буфера, -иначе на второй застынет старый спрайт и пойдёт мерцание через кадр). - -**Выигрыш ~20 % работы зелёного блока и ТОЛЬКО на дрожащих плитах.** -Наивный вариант «ставить лишь на смене кадра» выигрыша НЕ даёт: пять смен -по две страницы — те же десять перерисовок (проверено арифметикой -2026-08-13, до правки). - -Вопрос к этапу полиша: стоит ли неочевидный код такого узкого выигрыша. - - -### BG-ONCE. Задний фон рисуется ОДИН раз; вместо чёрных баров — heal - -**Предложение пользователя 2026-08-13. Не делать сейчас — обязательно к -проверке и реализации на этапе полиша/оптимизации.** - -Суть: элементы САМОГО заднего фона — факелы без пламени, окна, узор кладки, -решётчатая кладка и что ещё найдётся — впечатываются в фон один раз и больше -не перерисовываются никогда. Ни один объект за ними оказаться не может, а -значит и возвращать их поверх чего-либо не нужно. Если такой элемент оказался -затёрт, это САМО ПО СЕБЕ сигнал об ошибке: либо бар/прямоугольник слишком -велик, либо что-то рисуется не в своём слое. - -Вторая половина предложения — и она про скорость: там, где мы гасим область -чёрным баром перед выводом спрайта, звать вместо бара **heal по координатам -бара**. Бар всё равно приходится потом закрывать фоном, то есть выходит две -операции; heal делает то же одной и сразу правильным содержимым. - -**Оценка: идея верная по направлению, но есть два известных препятствия.** - -1. **Узкий heal уже пробовали — и откатили.** В `pop_room.c` (`pop_clip_sprite`) - записано: per-спрайтовый heal не используется, потому что выравнивание - блока акселератора оставляет 1-2 px слайверы правой грани, и на одной - странице дабл-буфера это мерцает. Поэтому борта чистит полоса - `pop_room_clip_borders` с гейтом по флагу. Прежде чем менять бары на heal, - надо решить именно эту задачу — иначе получим мерцание вместо ускорения. -2. **Полный запрет «не перерисовывать фон» противоречит foretable.** - `draw_tile_fore` (seg008:715) кладёт в передний слой ГЛАВНУЮ ГРАНЬ стены - вместе с её узором — она обязана перекрывать персонажа. То есть запрет - должен различать «декор задней стены» и «передняя грань», а это ровно - различие backtable/foretable оригинала. Фактически предложение сводится к - «привести наши слои в соответствие с таблицами оригинала» — тот же вывод, - к которому пришёл разбор `overlay_mid_tile` (см. ниже). - -**Известное исключение**, которое надо не сломать: Кид, уходящий по лестнице -в дверь уровня, действительно уезжает за передний план — но он и рисуется -отдельно (`clip_char`, правая грань doortop; см. memory `pop_clip_char_todo`). - -**Критерий приёмки этапа:** пройти уровни с падающими плитами (13) и с -факелами/окнами (10-12) и убедиться, что ни один фоновый элемент не -перерисовывается в кадре, где его тайл не менялся; замерить кадр до и после. - - -### L12-SHADOW-SPR. Тень дерётся спрайтами СТРАЖА, а не своими - -**Найдено прогоном 2026-08-13.** `tbl_guard_type[12] = 4` — это SHADOW.DAT, -отдельный набор спрайтов (силуэт Кида), а `pop_guard_load` (`pop_cdraw.c`) -разбирает только тип 2 (SKEL) и 3 (VIZIER); тип 4 сваливается в набор -обычного стража. Ассеты есть: `SDLPoP/data/SHADOW` (32 кадра + `res750.pal`). - -Правка по образцу VIZIER (набор в `pop_pack_guard.py`, каталог в Makefile, -ветка в `pop_guard_load`), НО сначала проверить две вещи, иначе спрайты -поедут: (1) какую таблицу кадров получает `CHARID_1_SHADOW` в -`pop_frame_tbl_is_guard` — Кида или стража, и (2) сколько кадров в наборе -(32 против 34 у стража) и не выходит ли индекс за его пределы. - -Это НЕ полный «вид тени» (OR/XOR-блиттеры, [`../docs/shadow_render.md`]) — -только правильный набор спрайтов вместо чужого. - - -### L12-SEAM-POLISH. Переход 12 -> 13 выглядит коряво - -Механика работает (комната 23, без заставки и без сброса HP), но сама -анимация прохода рваная — замечено пользователем 2026-08-13. Полишинг, -берётся вместе с остальной шлифовкой переходов. - - -### L13-JAFFAR. Уровень 13: Джафар, победа, выход — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-13: код написан, хост-тесты зелёные (44 проверки, -> `tests-host/t_jaffar.c`), ЖИВОЙ ПРОВЕРКИ В MAME ЕЩЁ НЕ БЫЛО.** - -Своего ИИ у Джафара нет — это обычный страж (seg002:085A), skill 9 и 6 HP уже -лежат в `pop_level_cold.c`. Сделаны только события и данные: - -| кусок | где | порт | -|---|---|---| -| фора после встречи (`guard_notice_timer`) | `guards.c` `pop_meet_jaffar` + `autocontrol_guard_inactive` | seg002:0544 / 0736 | -| победа: белая вспышка + «выход разрешён» | `guards.c` `on_guard_killed` | seg006:1927 | -| выход: кнопка комнаты 24 при уходе ВЛЕВО | `guards.c` `pop_jaffar_exit` | seg002:0517 | -| гряда плит сверху при входе в комнаты 23/16 | `pop_map.c` `pop_check_fall_flo` | seg000:1317 | -| фазу со старшим битом на 13-м НЕ гасить | `pop_map.c` `pop_loose_tick`, `pop_trob.c` `animate_loose` | seg007:823 | -| сотрясение на 13-м плиты НЕ трясёт | `pop_map.c` `do_knock` | seg007:949 | -| плита бьёт и В БЕГЕ | `pop_map.c` `fell_on_your_head` | seg007:1218 | -| СПРАЙТЫ Джафара (VIZIER.DAT, своя палитра) | `pop_pack_guard.py`, `pop_cdraw.c`, `Makefile` | seg000:1092 | - -По ходу нашлась и починена смежная ошибка: цвет стража из данных комнаты -применялся к ЛЮБОМУ набору, хотя оригинал берёт его только у обычного стража -(`curr_guard_color = 0` при `tbl_guard_type != 0`, seg002:183) — скелета это -не задевало случайно, Джафара покрасило бы. - -Осознанное расхождение (представление фазы отложенного старта) — запись в -[`../docs/impl_diff.md`](impl_diff.md). - -**Не портировано намеренно:** `is_show_time` в `on_guard_killed` — это показ -ОСТАВШЕГОСЯ ВРЕМЕНИ, а часов на 60 минут у нас пока нет вовсе. - -**Что проверять в MAME** (`make LEVEL=13`): - -1. комната 23 (стартовая): плиты сверху сыплются ВРАЗНОБОЙ с первых кадров, - и они бьют, даже если пробегать под ними; -2. приземление Кида плиты НЕ трясёт (иначе гряда посыплется разом); -3. уход вправо из комнаты 3: Джафар виден СВОИМИ спрайтами и своей палитрой, - ~2 секунды стоит, не доставая клинок; -4. смерть Джафара — белая вспышка; уход ВЛЕВО открывает дверь уровня. - -**Что проверять в MAME** (по порядку прохождения уровня): - -1. комната 15: пока меч лежит — тени нет; подобрал меч, вышел и вернулся — - тень СВАЛИВАЕТСЯ сверху, а не стоит готовая; -2. бой: каждый удар по тени отнимает HP и у Кида; добить её нельзя — на её - смерти умирает и Кид (белая вспышка); -3. слияние: убрать меч (`Shift`+вниз), подойти — белая вспышка, тень исчезла, - потолок HP вырос на единицу; -4. после слияния в комнатах 2 и 13 (верхний ряд) под ногами появляются плиты; -5. уход ВПРАВО из комнаты 18 убирает меч из комнаты 15 (вернуться и взять - второй раз нельзя); -6. комната 23 — уровень молча становится 13-м, HP НЕ сбрасывается. - - -### L7-FEATHER. Зелье МЕДЛЕННОГО ПАДЕНИЯ — ЗАКРЫТА 2026-08-26 - -> Проверено пользователем в живой игре. - - -> **Статус 2026-08-12: код написан, ждёт живой проверки в MAME.** Сделаны все -> шесть шагов ниже плюс синие пузырьки зелья «−HP» (тип 5) — они всплыли по -> ходу: пользователь напомнил, что такое зелье стоит уже на уровне 2 (комната -> 13, тайл `(1,3)`; ещё ур.8 комн.2 и весь ур.15), а цвет у него был красный. -> Хост-тесты: `phys_feather_fall_is_slow_and_harmless` (скорость ≤ 4 и HP -> целое против обычного падения с двух рядов). **Осталось**: проверить в MAME -> — ур.7 комн.1 (зелёные пузырьки, зелёная вспышка, медленный спуск в шахту) и -> ур.2 комн.13 (синие пузырьки, −1 HP, экран краснеет один раз). - -Зелье на `(2,8)` комнаты 1 уровня 7 (сверено по `res2007.bin`: modifier 3, то -есть `potion_type = 3` — «slow fall»). Сейчас `pop_proc_get_object` -(`pop_map.c`) для типов 3/4/6 не делает НИЧЕГО (явный TODO): зелье выпивается -без эффекта. - -Механика оригинала (прочитана в SDLPoP до планирования, правило проекта): - -| что | где в SDLPoP | значение | -|---|---|---| -| включение | `feather_fall()`, seg000:15F8 | `is_feather_fall = 1`, зелёная вспышка (`flash_color = 2`, `flash_time = 3`), `stop_sounds` + `sound_39_low_weight` | -| физика | `fall_accel()`, seg006:057C | ускорение **1** вместо 3, потолок скорости **4** вместо 33 (`FALLING_SPEED_*_FEATHER`, types.h:1435) | -| анимация | опкод `SEQ_JMP_IF_FEATHER`, seg006:586 | в seqtbl есть ветки `stepfloat` / `bumpfloat` — «плавные» кадры падения и удара; таблица у нас из данных оригинала, ветки УЖЕ ЛЕЖАТ в ней | -| длительность | `do_timers`, seg003:517 | ваниль: пока играет звук (или 225 тиков); фикс SDLPoP `fix_quicksave_during_feather` — таймер `FEATHER_FALL_LENGTH = 18.75 c` | -| сброс | seg003:189 (`start_level`) | на старте уровня и, по фиксу, при смерти Кида | -| вид склянки | `draw_tile_fore`, seg008:740 | типы 2..4 — БОЛЬШАЯ склянка (id 13) — **у нас уже так** | -| цвет пузырьков | `draw_tile_anim`, seg008:652 | типы 3/4 — **зелёный** (`color = 10`), 5/6 — синий, остальные — красный (12) | - -Шаги (в порядке выполнения, каждый проверяем отдельно): - -1. **Состояние.** `pop_feather` (счётчик кадров) в `pop_map.c` рядом с - `fall_accel`; экспорт в `pop_map.h` для `play_seq`. Длительность — по - таймеру (ванильная привязка к звуку нам не подходит: звука нет), значение - пересчитать из 18,75 с в наши кадры и завести в `pop_tune.h`. Сброс — в - `pop_start_level` и по смерти Кида. -2. **Физика.** `fall_accel()`: при `pop_feather` — `FALL_ACCEL_FEATHER 1` / - `FALL_MAX_FEATHER 4`. Только для Кида (`charid == CHARID_0_KID`) — так - правильнее по смыслу, но это ОСОЗНАННОЕ расхождение с ванилью (там эффект - ловят все, и SDLPoP чинит это опцией) → запись в `../docs/impl_diff.md`. -3. **Анимация.** Опкод `0xF7` в `play_seq` (`pop_kid.c`) сейчас БЕЗУСЛОВНО - пропускает адрес; сделать как в оригинале: при `pop_feather` — прыжок по - адресу (это и даёт `stepfloat`/`bumpfloat`, то есть отсутствие урона и - «парение»). Правка на 3 строки, но именно она даёт весь визуальный эффект - падения. -4. **Вспышка.** Сейчас цвет вспышки — булев `pop_flash_red` (жёлтая/красная); - расширить до кода цвета и добавить ЗЕЛЁНУЮ (`flash_time = 3`). -5. **Зелёные пузырьки.** `pop_pack_bg.py` уже красит пузырёк mono-цветом - (`POT_BUBBLE_COLOR = VGA16 + 12`, красный). Добавить второй набор кадров - 16..22 в зелёном (`+10`) под своими id в атласе `pop_pot` и выбирать набор - по `potion_type` в `pop_potion_draw` (`pop_room.c`): 3/4 — зелёный, 5/6 — - синий, иначе красный. Цена — 7 маленьких спрайтов. -6. **Проверка.** Хост-тест: падение с трёх рядов под пером — скорость не выше - 4, урона нет, Кид жив (сцена в `t_phys`/`t_char`). MAME: комната 1 уровня - 7 — выпить, спрыгнуть в шахту, убедиться в плавном спуске и в том, что - эффект кончается по таймеру. - -### L3-COLOR. Палитра КЛАДКИ уровня 3 (в оригинале он зелёный) - -**Наблюдение (пользователь, 2026-08-07, со сравнением карт VGA).** В -оригинальной VGA-версии кладка уровня 3 ЗЕЛЁНАЯ, а уровней 1-2 — серо-синяя. -В SDLPoP все подземелья одинаковые, поэтому по нему разницу не увидеть. - -**Почему в SDLPoP её нет — проверено, не гипотеза.** Механизм там ЕСТЬ -(seg000:1140, «Level colors (1.3)»): - -```c -int level_color = custom->tbl_level_color[current_level]; -if (level_color != 0) { - byte* env_pal = level_var_palettes + 0x30*(level_color-1); - byte* wall_pal = env_pal + 0x30 * custom->tbl_level_type[current_level]; - set_pal_arr(0x50, 0x10, (rgb_type*)env_pal); /* chtab_6 environment */ - set_pal_arr(0x60, 0x10, (rgb_type*)wall_pal); /* chtab_7 wall */ -} -``` - -`tbl_level_color` (data.h:842) = `{0,0,0,1,0,0,0,1,2,2,0,0,3,3,4,0}` — у -уровня 3 цвет **1**, у 7 тоже 1, у 8/9 — 2, у 12/13 — 3, у 14 — 4. Но -`level_var_palettes` — это ресурс **20** из `PRINCE.DAT` (только версии -1.3/1.4), а в `SDLPoP/data/PRINCE/` его НЕТ: там лежит лишь `res10.bin` -(палитры стражей). Значит `level_var_palettes == NULL` и вся ветка молча -пропускается — отсюда одинаковые подземелья. - -**Данные у нас есть.** В `../MSDOS/PRINCE.DAT` ресурс 20 присутствует: -offset 22790, **240 байт** = 5 палитр × 16 цветов × 3 байта (6-битные -каналы, как res10). - -**Что делать (когда дойдём до вида уровня 3).** -1. Достать ресурс 20 из `MSDOS/PRINCE.DAT` (упаковщику придётся читать сам - `.DAT` — сейчас все скрипты берут распакованные PNG из SDLPoP); -2. сгенерировать таблицу палитр рядом с `pop_guard_pal.h`; -3. при загрузке уровня заливать слоты **0x50..0x5F** (env) и **0x60..0x6F** - (wall) — у нас ровно эти базы (`pop_pack_bg.load_indexed`: `pal_base = - 0x60` для WALL, `0x50` для env), то есть совпадение со `set_pal_arr` - один в один; -4. `wall_pal = env_pal + 0x30 * tbl_level_type[level]` — для подземелья - (`level_type == 0`) обе палитры одинаковые. - -**Грабли, уже пойманные на цвете стражей:** `gfx_pal_load` отдаёт указатель -в BIOS (`$A4` через `rst #0x08`), а BIOS читает только `#4000-#BFFF` — -таблицу нельзя передавать прямо из банка (0xC000+), надо копировать в -W1/W2 (см. [BUG-GUARD-COLOR-1](BUGS_CLOSED.md#bug-guard-color-1)). - -### DRAW-COST. Кадр НЕ УКЛАДЫВАЕТСЯ в бюджет — нужна оптимизация - -> **ШАГ 1 СДЕЛАН 2026-08-08: пропуск неизменившегося персонажа.** Комната -> 1.3, труп стража, Кид стоит: было **210 %** кадрового периода, стало -> **116 %** (500 772 такта при бюджете 430 000). Отрисовка перестала быть -> узким местом: персонажи в покое не рисуются ВООБЩЕ (ноль вызовов -> `pop_heal_fast` за кадр), весь фон — ДВА блита факелов (44 136 тактов). -> Механизм и почему метка позиционная — в шапке `pop_cdraw.h`. - -**Исходные замеры пользователя (полосы бордюра, до шага 1).** Уровень 1, -Кид СТОИТ — то есть НЕ худший случай, ни боя, ни движения: - -| комната | синяя (ввод+heal+логика) | зелёная (фон) | циан (спрайты) | итого | -|---|---|---|---|---| -| 3, страж УБИТ | ~80 % | ~20 % | ~110 % | **~210 %** | -| 2, стража НЕТ | ~60 % | ~20 % | ~60 % | ~140 % | - -Разница ровно в теле убитого стража: +20 % синей и +50 % циана. Труп -сохраняет `charid != 0`, поэтому каждый кадр честно проходил весь путь -живого персонажа (heal → спрайт+clip_char+брызги+клинок → fore-проход), хотя -его кадр постоянен до выхода из комнаты. - -**Что сделано (шаг 1).** Не спецкейс «мёртвый», а общее правило: у каждой -страницы дабл-буфера свой снимок ВХОДОВ отрисовки слота; совпал снимок, -спрайт этой страницы цел и фон в его прямоугольнике не трогали — heal, блит -и fore-проход пропускаются целиком. Покрывает и труп, и стоящего Кида, и -ждущего стража. Детали контракта — `pop_cdraw.h`, реализация — -`pop_char_skip_mask` / `cd_quiet` в `pop_cdraw.c`, метка фона — -`pop_cd_touch` в резидентном `pop_tile.c`. - -Грабли, на которые наступили по дороге: сначала метка была ФЛАГОМ «фон -трогали хоть где-то» — и выигрыш оказался ровно нулевым, потому что факелы -анимируются каждый кадр и гасили пропуск для всех персонажей сразу (замер: -597 684 такта, как без оптимизации). Метка обязана быть ПОЗИЦИОННОЙ. - -**Остаточный эффект от объединения прямоугольников.** Метка одна на -страницу — объединение всех правок фона. В комнате 1 два факела дают -прямоугольник x 40…88, а стоящий там Кид занимает x 32…44: пересечение 4 px, -и он перерисовывается каждый кадр (140 % против 94 %, если отойти). Если -понадобится — держать не один прямоугольник, а 3-4 отдельных и мержить -только при переполнении. - -### Шаг 2 сделан частично: ЛОГИКА (синяя полоса) 2026-08-09 - -Пользователь: «на стоящем Киде с двумя факелами на логику уходит 60 % -кадрового периода — недопустимо». Разобрано брейкпоинтами в MAME -(`z80_profiling_method`), сцена: уровень 1 комната 1, Кид СТОИТ вплотную к -левому факелу (то есть пропуск персонажа НЕ срабатывает — худший случай). - -**Калибровка, которую надо знать заранее.** Один такт `totalcycles` в MAME -— НЕ один номинальный T-такт Z80: у Sprinter на обращениях к ОЗУ есть -wait-state'ы, и замеренная стоимость выходит **≈ 2,4× номинала** -(`get_tile`: 574 номинальных против 1 422 замеренных). Считать бюджет по -таблице T-тактов из справочника нельзя — только мерить. Кадр растра = -430 000; главный цикл спейсится тремя `gfx_wait_vsync`, поэтому работа -СВЫШЕ 430 000 стоит сразу целый лишний кадр. - -**Что нашли и починили:** - -| правка | что было | стало | -|---|---|---| -| окно перебора коллизии как в оригинале (было: все 14 колонок каждый кадр) | `check_collisions` 60 888 | 50 940 | -| `get_tile_div_mod` — таблицей (`tile_div_tbl`/`tile_mod_tbl`), было `/14` и `%14` | 5 400 тактов на вызов, 13 вызовов за кадр ≈ 70 000 = **16 % кадра** | ~250 на вызов | -| разрешение ряда вынесено из цикла колонок + грань шагом 14 + `wall_type` таблицей | `check_collisions` 58 026 | 42 750 | -| `move_coll_to_prev` — `memcpy` (LDIR) вместо цикла на C | 14 байт за 5 514 тактов (390 на байт!) | ~1 200 | -| окно режется на непрерывные пробеги (левый сосед / своя / правый), пролог ряда вынесен на кадр | `check_collisions` 44 022 | **38 334** | - -Замер одной итерации перебора: **пустая колонка 750 тактов, колонка-стена -~1 700** (две 16-битные знаковые сверки граней — SDCC пишет их через -`jp PO / xor 0x80 / jp P`). Ловушка, на которую наступили: «быстрый путь для -окна внутри комнаты» не срабатывал ПОЧТИ НИКОГДА — Кид, стоящий в колонке 0, -даёт окно с −1, и шёл медленный сбор во временный буфер с тернарником на -колонку (1 340 тактов на колонку). Отсюда разбиение на пробеги: вопрос «чья -это колонка» решается раз на пробег, а `coll_scan` сам двигает `scan_left`. - -Самое дорогое было НЕ там, где ожидалось: `/14` и `%14` SDCC разворачивает -в `__divsint` + `__modsint`, а `__modsint` внутри зовёт `__divsint` ещё раз — -два полноценных 16-битных деления на каждый вопрос «в какой колонке точка». -Оригинал делит таблицей (seg006:702) — мы просто не портировали это место. - -**ГЛАВНОЕ: логический кадр уложился в бюджет.** Главный цикл спейсится -тремя `gfx_wait_vsync`, поэтому работа сверх 430 000 тактов стоит СРАЗУ -целый лишний растровый кадр. Было 470 964 (период цикла 4 кадра), стало -**409 956 + ~15 600 на ввод = 425 600** — период цикла **3 растровых кадра**. -Игра стала быстрее на треть (16,7 логических кадров/с против 12,5). - -Что дало последние тысячи (по убыванию): - -| правка | экономия | -|---|---| -| `pop_y_to_row` — цепочка сравнений вместо `/63 % 4` | ~12 000 | -| расширение окна fore-прохода арифметикой вместо перебора 10 колонок и 3 рядов | ~8 500 | -| `col_from_x` — таблицей (те же `POP_TILE_DIV`, вынесены в резидент) | ~11 000 | -| `pop_cd_touch` — развёрнутый цикл по страницам, `x+w`/`y+h` один раз | ~8 600 (зовётся с каждого блита фона) | -| `tp / 10`, `tp % 10` у факелов — таблицей | ~4 000 | -| пустой слот соперника считается «тихим» | ~8 200 | - -**Ловушка SDCC, на которой я потерял один прогон:** в `pop_y_to_row` одно и -то же выражение `t / 63 % 4 - 1` стояло в двух ветках, и компилятор поднял -деление В ВЕРШИНУ функции — быстрые возвраты не спасали, `__divsint` звался -всё равно. Лечится выносом медленного хвоста в ОТДЕЛЬНУЮ функцию. Тот же -эффект уже был описан в `pop_loose_tick`; теперь ясно, что это правило, а не -частный случай: **любое деление, встречающееся дважды, SDCC поднимает выше -всех проверок.** - -Приём, которым это ловится: брейкпоинт на `__divsint`/`__divuint`/ -`__divuchar` с печатью адреса возврата (`printf "%04X", w@(sp)`) — сразу -видно, кто и сколько раз делит за кадр. - -**Хвост подобран 2026-08-10.** После переписи `pop_y_to_row` в pop_room.c -осталось ТРИ места, считавших `(y+60)/63 % 4 - 1` вручную (927 в -`mob_tick_one`, 976/977 в `mob_render`) — сгенерированный asm подтвердил -пару `__divsint`+`__modsint` в каждом. Это ~16 200 тактов (3,8 % кадра), но -только пока кусок плиты в полёте — то есть ровно в самом тяжёлом кадре. -Заменены вызовом `pop_y_to_row`; в банке 7 теперь НОЛЬ `__divsint`. -Эквивалентность закреплена тестом `geom_y_to_row_matches_formula` -(перебор −400..400 против исходной формулы) — вызовы разбросаны по трём -банкам, и соблазн написать деление «по месту» возвращается. - -### Полная инвентаризация делений 2026-08-10 - -Способ (повторяемый одной командой из `.sprinter-cc-SprPoP/`): - -``` -awk '/^;[a-z_0-9]+\.[ch]:[0-9]+:/{s=$0} /^\tcall\t__(div|mod|mul)/{printf "%-22s %-12s %s\n",FILENAME,$2,s}' *.asm -``` - -Найден **31 вызов в 9 модулях**. Прибрано три места, остальное разобрано и -осознанно оставлено. - -Убрано: - -| место | что было | почему стоило | -|---|---|---| -| `pop_cdraw.c` `calc_screen_x_coord` (2 вызова) | `x * 8 / 7` = `__divsint`, **2 400 тактов НА ПЕРСОНАЖА КАЖДЫЙ КАДР** | последнее деление в горячем пути; ~4 800/кадр при живом сопернике | -| `pop_guard.c` `guard_col_from_x` | `/14` + `%14` **безусловно**, мимо `POP_TILE_DIV` | единственное 16-битное деление, у которого таблица вообще не была подключена | -| `pop_trob.c` `animate_chomper` | `tp / 10` = `__divuchar` на чомпера каждый кадр | таблицы `TP_ROW`/`TP_COL` уже лежали в ЭТОМ ЖЕ файле, но ниже по тексту — чомперы их не видели | - -Приём для `×8/7`: **таблица** `SCRX7[1152]` (int8_t, хранит `x/7`) в банке 4, -индекс `x + 448`, результат `x + SCRX7[i]`. 1 152 байта, резидент не тронут. - -Два решения по дороге, оба проверены, а не угаданы: - -1. **Диапазон — весь, включая отрицательные.** Первая версия крыла 0..255 по - тождеству `8x/7 == x + x/7` с байтовой таблицей `x/7`. Ошибка: `obj_x = - 2*fwd − 116` уходит в минус, как только `fwd < 58` (левее `x_bump[5]`) — - то есть у ЛЕВОЙ КРОМКИ комнаты, а это не экзотика, и там мы продолжали - делить. Границы взяты из фактических данных: `kid_data.bin` даёт `dx` - кадров Кида −5..+10, стража −2..+10; при `Char.x` типа uint8_t и - `render_dx ∈ {−140, 0, +140}` полный диапазон `obj_x` = **−416..695**. - Таблица кроет −448..703, деление стало недостижимым (оставлено - страховкой на третьего персонажа / другой `render_dx`). -2. **Хранить `x/7` байтом, а не готовое `x*8/7` словом** — по тождеству - `8x/7 == x + x/7`. Первая версия хранила готовое, «раз всё равно - индексация двухбайтная». Собраны ОБА варианта, такты посчитаны по - сгенерированному asm: - - | вариант | хвост после проверки границ | тактов | байт | - |---|---|---|---| - | `int16_t` готовое | `add hl,hl / add hl,de / ld e,(hl) / inc hl / ld d,(hl)` | **132** | 2 304 | - | `int8_t` `x/7` | `add hl,bc / ld a,(hl) / ld l,a / rlca / sbc a,a / ld h,a / add hl,de` | **131** | 1 152 | - - Расширение знака и 16-битное сложение стоят ровно столько же, сколько - лишний `add hl,hl` при двухбайтном индексе, а обращений к памяти на одно - меньше — под wait-state'ами Sprinter (такт ≈ 2,4× номинала именно на - обращениях к ОЗУ) байтовый вариант ещё чуть выгоднее номинала. Итог: - байтовая таблица не хуже по скорости и на килобайт меньше. **Урок: - «двухбайтный индекс съест выигрыш» — гипотеза; она не подтвердилась.** - -Кодоген проверен глазами (`bank4_pop_cdraw.asm`): `ld hl,#0x01C0; add hl,de`, -16-битное беззнаковое сравнение — индекс полный, старший байт не теряется -(грабли `sdcc_z80_const_ptr_index_bug` обойдены отдельной -`uint16_t`-переменной). 131 такт номинала против ~1 000 у `__divsint`. - -Проверка таблицы: все 1 152 записи сверены питоном обратно из `.c`, а ПРАВИЛА -генерации (тождество + усечение к нулю) — тестом `geom_mul8div7_table_rules` -на целевом компиляторе: округляй SDCC к минус бесконечности, вся -отрицательная половина уехала бы на пиксель, и поймалось бы это только -глазами на левой кромке. - -Оставлено сознательно (НЕ трогать, это не забытые места): - -- **Хвосты за таблицей** — `guards.c:84`, `pop_bg.c:497`, `sprpop.c:163`, - `pop_map.c:412`: срабатывают только при x вне 0..255, то есть когда - персонаж в соседней комнате. Убирать их — это расширять `POP_TILE_DIV` до - −140..395 (+280 Б резидента) ради редкого пути. -- **`pop_geom.c:21`** — намеренный медленный хвост `pop_y_to_row` (см. выше - про подъём деления SDCC). -- **`pop_geom.c:52`** — `v % n` в `pop_rnd_fit` для не-степени двойки: - оригинал зовёт `prandom(1)/(255)/(0xFF)`, все три идут веткой с маской, - сюда управление не приходит вовсе. -- **Холодные, раз на комнату/уровень/событие**: `pop_guard.c:266/268/269` - (вход стража), `pop_map.c:310` (пробуждение скелета), `pop_trob.c` дверь - уровня, `sprpop.c:473/663/887` (читы и старт), `pop_level.c:131/132` - (имя файла уровня), `sprpop.c:976/977` (отладочный HUD номера комнаты). - Каждое — единицы вызовов за секунды игры; таблицы под них только раздули - бы код. - -Итог: **в горячем пути делений не осталось**. В банках 4, 6, 7 — ноль -`__div*`; всё, что видно в списке выше, либо за быстрым путём, либо холодное. - -### Замер в MAME: A/B со сборкой `ec3cca5` (до правок) - -Обе сборки прогнаны через полный цикл (`make hdd` → рестарт MAME → загрузка -уровня 1), сцена — **комната 1, Кид стоит, соперника нет**; скриншоты обеих -сборок идентичны. Фазы сняты брейкпоинтами на инструкциях `out -(_io_border), a` профилировочного бордюра, медиана по 60 логическим кадрам: - -| фаза | до | после | Δ | -|---|---|---|---| -| ввод + heal | 62 361 | 62 364 | +3 | -| логика | 79 878 | 79 878 | 0 | -| фон | 119 502 | 119 502 | 0 | -| **спрайты** | **129 568** | **127 510** | **−2 058** | -| РАБОТА за кадр | 391 258 | 389 221 | −2 037 | - -Счётчик делений (брейкпоинты на `__divsint`/`__modsint`/`__divuchar`/ -`__moduchar` с печатью адреса возврата): - -| сцена | до | после | -|---|---|---| -| комната 1, только Кид | **1,00 `__divsint`/кадр** (возврат 0xD3AA = `pop_cdraw`) | **0** | -| комната 3, бой со стражем | **2,01 `__divsint`/кадр** | **0** (82 кадра боя) | - -Всё сходится в одну картину: единственное деление горячего пути — `×8/7` на -персонажа, по одному вызову на каждого Char. Экономия ровно в фазе спрайтов -и ровно на стоимость одного вызова: **2 058 тактов** (документированная -оценка была ~2 400). С соперником на сцене — вдвое. - -**Чего этот замер НЕ показывает, и это важно:** - -- Период цикла как был 3 растровых кадра, так и остался — 2 000 тактов его не - двигают. Выигрыш ушёл в запас: до нижней границы 430 000 стало 40 800 - тактов вместо 38 700. -- Остальные правки (три `y_to_row` в `pop_room`, `guard_col_from_x`, - `tp/10` у чомпера) в этой сцене **не срабатывают вовсе** — им нужны - падающая плита, переход стража между комнатами и уровень с чомперами. - Их стоимость известна поштучно, но в бою я их не ловил. -- Работа в комнате 3 между прогонами **несравнима** (391 204 против 318 145): - страж живой, фаза боя и срабатывание `pop_char_skip_mask` от прогона к - прогону разные. Оттуда взят только СЧЁТЧИК делений — он от таймингов не - зависит. - -**Профиль работы за логический кадр СЕЙЧАС (409 956 тактов + ~15 600 ввод):** - -| блок | тактов | % растрового кадра | -|---|---|---| -| see_kid + ctrl_tick + skip + heal + kid_tick | 52 536 | 12 | -| физика Кида + страж + боёвка | 73 452 | 17 | -| `pop_loose_tick` | 27 438 | 6,4 | -| **`pop_process_trobs`** (два факела) | **75 720** | **17,6** | -| `pop_redraw_needed` + шов + skip_mask | 10 932 | 2,5 | -| **`pop_char_draw` Кида** | **56 250** | **13** | -| **`pop_char_fore` Кида + борта** | **113 628** | **26** | - -Синяя полоса (ввод + логика) была ~60 % → стала ~29 %. - -**Оптимизация закрыта по решению пользователя 2026-08-10.** Всё, что -осталось неcделанным, вынесено с замерами в -[`../docs/perf_backlog.md`](perf_backlog.md) — там же протокол «как -мерить», чтобы не наступать заново на wait-state'ы и на устаревшие адреса -символов. Что доделано после таблицы выше: `pop_cd_touch` развёрнут, -tp/10 у факелов таблицей, пустой слот соперника считается тихим, ранний -выход в fore-проходе (нулевой эффект, оставлен как порт), быстрый путь без -клипа в `pop_blit_b` (факел 41 778 -> 31 218 тактов). - -**Что осталось (запас на будущее, срочности больше нет):** - -1. **`pop_char_fore` 113 628.** Внутри: `char_footprint` + расширение окна - ~21 000, дальше шесть `fore_tile`, из которых два реально рисуют (по - ~32 000). Дальше резать — кэш «в этом тайле переднего слоя нет вовсе». -2. **`pop_process_trobs` 75 720 на два факела** (~31 000 на факел). Внутри - одного факела: `gfx_blit_noclip` 8 700, чтение w/h и клип 6 400, - `pop_cd_touch` (теперь дешевле), маппинг окна 0 и возвраты. Пламя - перерисовывается каждый кадр обязательно (`TORCH_ANIM_DIV = 1`, кадр - меняется), так что пропуск тут не поможет — только удешевление блита. -3. `pop_loose_tick` 27 438 при полном отсутствии падающих плит. -4. Одно `__divsint` осталось в `pop_char_draw` (`obj_x * 8 / 7`) — ~2 400. - -### Шаг 2 (СЛЕДУЮЩИЙ, назначен пользователем): ДВИЖУЩИЙСЯ Кид - -Пропуск закрывает только покой. Наблюдение пользователя 2026-08-08: как -только Кид побежал, циан-полоса (спрайт + fore-проход) вырастает почти до -**100 % кадрового периода** — и это на ОДНОГО персонажа. То есть цена -одной перерисовки персонажа сама по себе непозволительно велика, и её надо -резать по существу, а не пропусками. - -Куда смотреть (мерить каждое, метод — `z80_profiling_method`): -1. разделить замером спрайт-блит и fore-проход: у fore уже была история - 78 % кадра до кэша кладки (`pop_fore_layer_cost`), он и сейчас главный - подозреваемый; -2. fore-проход перебирает 2×2…3 тайла и в каждом разбирает кладку заново — - кэш «в этом тайле переднего слоя нет вовсе» снял бы половину; -3. расширять перебор ТОЛЬКО по накладным спрайтам (клинок/брызги), а не по - всему окну клипа: габарит кадра уже покрыт футпринтом + правилом меча; -4. heal + блит спрайта: сейчас это два прохода по одной площади; посмотреть, - нельзя ли стирать только РАЗНОСТЬ прямоугольников при мелком сдвиге. - -**Куда идти дальше в ПОКОЕ — там это ЛОГИКА, а не отрисовка.** Разбивка -работы кадра брейкпоинтами (комната 3, труп, Кид стоит; всего 500 772 -такта): - -| участок | тактов | % кадра | -|---|---:|---:| -| ввод + `check_skel` + луч видимости + `ctrl_tick` + heal | 65 862 | 15 % | -| `kid_tick` + физика + страж + боёвка | **260 022** | **60 %** | -| `loose_tick` + `process_trobs` | 119 562 | 28 % | -| `redraw_needed` + шов + спрайты + метка | 55 152 | 13 % | -| — из них два блита факелов | 44 136 | 10 % | - -1. **60 % на тик персонажей** при том, что оба СТОЯТ — первый кандидат. - Смотреть `pop_phys_tick`/`pop_guard_phys_tick` (банк 3) и `pop_guard_tick` - (банк 1): сколько там работы, которую неподвижный персонаж делать не - обязан, и сколько стоит трамплин на каждом шаге. -2. **28 % на `loose_tick` + `process_trobs`** в комнате БЕЗ единой ловушки — - явно перебор; разобрать, что там сканируется каждый кадр (список trob, - `pop_trob_modif` соседа для шва, `pop_room_link`). -3. Запечь труп в фон (как щебень: тело в фоне + fore-часть поверх Кида) — - тогда бесплатным станет и проход Кида ПО телу, который сейчас снимает - пропуск по правилу «слоты рядом». Предложено пользователем 2026-08-08. - -Мерить в ЭТОЙ точке (комната 3, страж убит, Кид стоит) — она воспроизводима -и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать -отдельно. Метод — memory `z80_profiling_method` (брейкпоинты с -`totalcycles`); полосы бордюра показывают только одну картинку из периода и -годятся лишь для раскладки по фазам. - -**Наблюдение пользователя на приёмке DRAW-CHAR 2026-08-08:** циан-полоса -профиля (спрайты + fore) выросла — тогда «в пределах». - -**Отчего именно.** Раньше перебор тайлов у Кида шёл строго по футпринту -кадра (`char_x_left/right`, seg006:1021), а он УЖЕ спрайта; расширение -перебора окном спрайта (клинок и брызги уходят за габарит кадра) было -только у соперника. DRAW-CHAR сделала его общим — то есть у Кида теперь на -колонку-другую больше `fore_tile` за кадр. Это не регрессия «лишней -работы», а недостающая ранее корректность: тайл, который спрайт задевает, -обязан вернуть свой передний слой поверх него. - -**Если fore-проход снова станет узким местом** (сейчас он в покое не -выполняется вовсе): расширять перебор ТОЛЬКО по накладным спрайтам -(клинок/брызги), а не по всему окну; кэш «в этом тайле fore-слоя нет -вовсе»; считать окно клипа в тайловых координатах один раз. - -## P1 — берётся в любой момент - -### TIME-SPEED. Часы бегут быстрее в FAST/FASTEST — СДЕЛАНО 2026-08-31, остался вариант 3 (RTC) - -**Наблюдение (пользователь, 2026-08-31):** «при режиме FAST/FASTEST время -начинает бежать быстрее — похоже, время мы считаем в наших логических -кадрах, и если они отрисовываются чаще, то и время быстрее». - -Так и есть. `pop_timer_tick` (`src/pop_timer.c`) уменьшает счётчик на -КАЖДОМ логическом кадре — ровно как оригинал. Но длина логического кадра -у нас зависит от режима скорости (`src/pop_pace.h`): - -| режим | обычный кадр | бой | -|---|---|---| -| NORMAL | 4 кадра луча (81,9 мс) | 5 (102,4 мс) | -| FAST | 3 (61,4 мс) | 4 (81,9 мс) | -| FASTEST | 3 (61,4 мс) | 3 (61,4 мс) | - -Разная длина кадра в игре и в бою — ПОВЕДЕНИЕ ОРИГИНАЛА (подтверждено -пользователем), и часы, идущие в бою медленнее, трогать не нужно. -Расхождение только в наших добавочных режимах: NORMAL повторяет оригинал, -а FAST/FASTEST ускоряют всё разом, включая ход часов — минута игрового -времени проходит примерно на треть быстрее реальной. - -**Варианты.** - -1. Оставить как есть: быстрый режим ускоряет игру целиком, это честно и - предсказуемо. Ноль работы и ноль риска. -2. Развязать часы от темпа: тикать не по логическому кадру, а по - накопленным кадрам ЛУЧА (4 кадра луча = 1 тик). Тогда минута остаётся - минутой в любом режиме, а в бою часы по-прежнему замедляются, как в - оригинале. Цена — счётчик-накопитель в `pop_timer_tick`. - -3. **Часы от RTC** (идея пользователя, 2026-08-31). Брать время из - часов реального времени, а не считать кадры вовсе. - -**Почему третий вариант интереснее, чем кажется.** Погрешность есть уже -СЕЙЧАС и без всяких режимов: логический кадр NORMAL — 4 кадра луча, а это -81,93 мс, то есть 12,2 кадра в секунду вместо ровных 12. Оригинальная -минута из 720 тиков проходит у нас за 58,99 с — почти на секунду быстрее. -За час игры набегает около минуты. Ни один из первых двух вариантов этого -не лечит: они выравнивают режимы между собой, но обе шкалы остаются -привязанными к лучу, а луч не кратен игровой секунде. - -RTC (`ESTEX $21 SYSTIME`, memory `sprinter_systime_dow`) даёт абсолютную -шкалу и снимает накопление полностью. Подводные камни, которые надо -решить при взятии в работу: - -- вызов ESTEX стоит дорого и клобберит регистры — читать раз в тик, не в - кадре, и не из горячего пути (memory `estex_bios_abi`); -- разрешение RTC — секунда, а тик игры — 1/12 секунды: нужен гибрид - «кадры внутри секунды, синхронизация по RTC на границе», иначе часы - задёргаются; -- пауза, меню и загрузка НЕ должны съедать игровое время — при часах от - RTC это перестаёт получаться само собой и требует явного вычитания; -- быстрая загрузка/сохранение обязаны сохранять смещение, а не абсолютное - время. - -**Решать пользователю.** Порядок по цене: вариант 1 (ничего), вариант 2 -(счётчик кадров луча, лечит только разбег режимов), вариант 3 (RTC, лечит -и накопление — но требует разобраться с паузами). - - -### SND-SPEAKER-38. Звук мигания надписи — СДЕЛАНО и ПРОВЕРЕНО 2026-08-31 - -**Постановка (пользователь, 2026-08-31):** «когда надпись Press Button -начинает мигать — в SDLPoP воспроизводится звук на каждое моргание, у нас -тишина». Решение выбрано там же: «проще синтезировать как PCM и добавить -в наш SND атлас». - -**Наш код НЕ виноват и правки не требует.** `pop_dead_prompt` -(`src/pop_status.c`) уже зовёт звук 38 на каждом появлении строки — ровно -как оригинал. Пусто в НАБОРЕ: в `assets/packed/SND/snd.idx` слот 38 имеет -длину 0, играть нечего. - -**Почему его нет.** У оригинала три параллельных набора звука, и номера -разложены по ним не подряд: - -| набор | что | номера | у нас | -|---|---|---|---| -| `DIGISND1..3.DAT` | оцифровка | 0–23, 44–49, 51 | берём, это и есть наш SND | -| `MIDISND1..2.DAT` | мелодии | 24–30, 32, 33, 35–37, 39–41, 43, 50, 52–56 | берём отдельно, как музыку в `MUS/` | -| `IBM_SND1..2` | ноты PC-спикера | 0–56 (весь диапазон) | НЕ берём вовсе | - -Звук 38 есть ТОЛЬКО в наборе спикера — ни оцифровки, ни мелодии для него -не существует, поэтому он и провалился между двумя нашими конвейерами. - -**Полная ревизия недостающего (сделана 2026-08-31).** Номера, которых нет -ни в оцифровке, ни среди мелодий: **31, 34, 38, 42**. Из них 31, 34 и 42 — -пустые заглушки в один байт, нот внутри нет. **Реально звучит ровно один -номер — 38.** То есть задача закрывает единственную дыру в наборе, а не -открывает семейство. - -**Формат ресурса** (канон — `docs/PoP/POP-DAT-FormatSpecifications.pdf`, -раздел «Internal PC Speaker»): заголовок 3 байта, из них байт 1 — темп в -долях на две секунды; далее тройки «частота в герцах (2 байта) + длина в -долях (1 байт)», нулевая частота = пауза; в конце маркер `12 00`. - -Звук 38 (`IBM_SND1/res10038.bin`, 17 байт) — нисходящий сигнал из четырёх -нот: 2500, 2000, 1500, 1000 Гц по одной доле, темп 72 → около 110 мс. -Для сверки разбора: звук 17 (мягкое приземление) — одна нота 49 Гц на три -доли. - -**Что делать.** - -1. В `tools/pop_pack_sound.py` — генератор PCM из нот: меандр на нашей - частоте вывода (`RATE`), амплитуда умеренная (сигнал короткий и резкий, - полный размах будет колоть ухо), пауза = уровень тишины `0x80`. -2. Брать из спикера ТОЛЬКО те номера, которых нет ни в оцифровке, ни в - мелодиях — сейчас это ровно 38. Правило важнее списка: если брать всё - подряд, синтез перекроет собой мелодии, которые мы играем из `MUS/`. -3. Дальше всё уже готово: звук ложится в атлас и индекс общим путём, - `snd.idx` пересобирается, EXE не меняется (раскладка читается с диска). -4. Проверка: `make resources` → слот 38 в индексе получил ненулевую длину; - в MAME дождаться мигания надписи после смерти — должен звучать сигнал. - -**Цена.** Один короткий звук в наборе (~2 КБ после выравнивания на блок), -кода в игре — ноль. - - -### PERF-SWEEP. Поиск узких мест по ВСЕЙ игре, а не в одной сцене - -**Постановка (пользователь, 2026-08-18):** «пока мы тестируем на регресс -только одну сцену; надо придумать механизм проверки узких мест по всей -программе — ручной проход уровня, в логи пишутся такты каждой фазы с -информацией, в какой комнате это происходит (возможно, в каком тайле Кид), -ищем максимумы по уровню и оптимизируем уже конкретную комнату». - -Сцена 13/23 закрывает ПИК, но она одна: механики, которых в ней нет -(чомперы, бой, мышь, зеркало, толпа стражей), в бюджет никто не проверял. - -#### Чем НЕЛЬЗЯ это делать — и почему - -Тем, чем меряем сейчас. Брейкпоинты с `printf ...; g` на четырёх границах -фаз роняют эмуляцию в проценты от реального времени — **ручной проход так не -сыграть**, а именно ручной проход и есть суть задачи. Плюс две мелочи, -которые уже стоили времени: адреса зондов надо переснимать после КАЖДОЙ -пересборки (`.lst` + база модуля), а кольцо `clog` переполняется — сегодня -первый прогон принёс один «покой», каскад успел вытесниться за 75 с -ожидания. - -#### Куда смотреть - -**Вариант А — тап на порт бордюра в Lua-мосте (рекомендую).** `PROF(n)` -это `out (0xFE), a`, то есть границы фаз УЖЕ размечены в железе. -`install_write_tap` на порт даёт колбэк без остановки CPU — накладные -несравнимо меньше брейкпоинта, играть можно. Главный бонус: **тап не -привязан к адресам кода**, переснимать после пересборки нечего. «Где» берём -оттуда же: Lua читает `cur_room` и `Kid.curr_col/curr_row` по адресам из -`sprpop.map` (их выдавать в маленький файл при сборке, чтобы не парсить -map руками). Пишем CSV: кадр, комната, тайл Кида, синяя/зелёная/циан/работа, -период. - -**Вариант Б — программа меряет себя сама, в РАСТРАХ.** Тактов Z80 изнутри -не видно, но нам они и не нужны: бюджет сформулирован в растровых кадрах, а -позицию луча видно поллингом бита 5 порта 0xFE (то же, чем живёт -`gfx_wait_vsync`). Разрешение ~1/256 кадра ≈ 1 700 тактов — для поиска -узких мест с запасом. Дороже варианта А по месту в резиденте, но -единственный, который работает **на живом железе**, а не только в MAME — -а такт MAME это 2,4× номинала Z80 (memory `sprinter_wait_states_2x`), и -рано или поздно сверяться придётся с железом. - -#### Что считать результатом - -Не «дамп кадров», а сводка: максимум каждой фазы **по комнатам**, число -кадров сверх 400 000 и сверх растрового кадра 430 000, и топ комнат по -худшему кадру. Дальше — точечная оптимизация той комнаты, как делали с -13/23. - -Смежное: сцена и метод — [`../docs/perf_l13_room23.md`](perf_l13_room23.md); -фазы — [зелёная](perf_green_phase.md), [циан](perf_cyan_phase.md). - - -### T-RENDER. Тесты слоя отрисовки: «в запечку не попадает транзиент» - -**Откуда взялось** (пользователь, 2026-08-18, по итогам -[SPIKE-BAKED](BUGS_CLOSED.md#spike-baked)): «такой сценарий (и другие с -пиками) можно внести в наши тесткейсы?» - -**Что есть сейчас.** `tests-host/` — это ЛОГИКА: геометрия, физика Кида, -`Char`, спецсобытия. Отрисовки там нет вовсе (`stubs.c` глушит все блиты -пустышками), `pop_tile.c`/`pop_room.c`/`pop_bg.c` не линкуются — таблицы -деления на ширину тайла в стабах даже продублированы копией. **Ловушки не -покрыты ничем**: ни пик, ни чомперов, ни `animate_*`. То есть SPIKE-BAKED -тестами поймать было нельзя в принципе. - -**Что покрывать.** Не «картинку» (её проверяет глаз в MAME), а инвариант, -на котором держится вся наша запечка: - -> при `pop_t_bake_rest = 1` ни один слой отрисовки тайла не выдаёт -> ТРАНЗИЕНТНЫЙ спрайт — ни своей ячейки, ни соседней. - -Он проверяем механически и стоит ровно того: именно его нарушение дало -SPIKE-BAKED, а до того — мерцание плиты, ради которого флаг и заводился. - -**Как.** Новый набор `t_render`: линкуются НАСТОЯЩИЕ `pop_tile.c`, -`pop_room.c`, `pop_bg.c`, а `pop_env_b`/`pop_wall_b`/`pop_fore_b` подменяются -**записывающим** стабом — списком `(id, x, yb)` за вызов. Тогда проверка -пишется в одну строку: «`draw_tile` при `bake_rest=1` и modif пик 4 не выдал -ни одного id из `spikes_fram_*`». Тот же стаб сразу закрывает и чомпера, и -плиту, и будущие ловушки — по одному тесту на каждую. - -Отдельно и дёшево — характеризация автоматов `animate_spike`/`animate_chomper` -(сверка полного цикла модификатора с SDLPoP seg007), но она НЕ ловит этот -класс: автомат был верен, врал слой отрисовки. - -**Чего это стоит.** Не одна строка: набор тянет за собой атласы и -`pop_cd_*`, а `stubs.c` придётся разделить (сейчас он подменяет то, что -здесь нужно настоящим). Прикидка — отдельная сессия. Место в `DATA_LOC` -проверить заранее: набор линкует ещё три крупных модуля (см. грабли -раскладки в `tests-host/README.md`). - - -### QSAVE. QuickSave / QuickLoad — ЗАКРЫТА 2026-08-22 - -**Закрыта** (F6/F9, POP.SAV + POP.BAK, коммит f4b4852, тэг v0.6-pop-quicksave). -Протокол и устройство — [`TASKS_CLOSED.md`](../../PoP/roomtest/TASKS_CLOSED.md#qsave); -формат снимка и разбор SDLPoP — -[`../docs/quicksave_plan.md`](quicksave_plan.md). - -### L1-SPEED. Игра идёт быстрее оригинала (найдено 2026-08-01) — ЗАКРЫТА 2026-08-19 - -**Закрыта** режимами скорости (`pop_pace.h`, клавиша **P**): FASTEST 3/3, -FAST 3/4, **NORMAL 4/5 = 81,9 / 102,4 мс** против 83,3 / 100 мс у -оригинала. Условие боя взято буквально из SDLPoP (`seg003.c:363`): -`Kid.sword == SWORD_2_DRAWN`. Дефолт — FASTEST (решение пользователя). -Проверено в MAME: период ровно 4 и ровно 5 растров. Разбор и замеры — -`../docs/frame_pacing_plan.md`. Осталось из исходной формулировки только -сверить NORMAL секундомером рядом с живым SDLPoP. - -Исходная запись: - -Сверка таймингов: оригинал — `BASE_FPS = 60` при `base_speed = 5` тиков на -логический кадр (`SDLPoP/src/types.h:1373`, `data.h:869`) = **83.3 мс**, в бою -`fight_speed = 6` = **100 мс**. У нас `sprpop.c` ждёт **три** `gfx_wait_vsync()` -= 60 мс, и отдельной скорости боя нет — то есть примерно **+39 % к скорости -эталона**. Соответствие: 4 ожидания (80 мс) обычно, 5 (100 мс) в бою. -Условие «делать ПОСЛЕ CLIP-1» снято — CLIP-1 закрыт. Проверка — -секундомером по одинаковому отрезку рядом с живым SDLPoP, не «на глаз». - -### TUNE-1. Параметры движка — в конфиг, а не в код - -**Что уже есть.** `pop_tune.h` — все настраиваемые числа собраны в одном -заголовке: чекпойнт уровня 3 (`POP_CHKP_*`), отладочное окно решётки -(`POP_DBG_GATE_HOLD`), включатель зацепа в прыжке (`POP_ENABLE_JUMP_GRAB`). -Правило уже действует: новое «особое событие» или тайминг заводится ТАМ, а -не константой по месту. - -**Что нужно сделать.** Читать их из ФАЙЛА рядом с exe, чтобы менять без -пересборки — под отладку («растянуть решётку, чтобы успеть пройти») и под -моды. Формат: простой ini/`ключ=значение`, парсер на ~50 строк (числа, -комментарии `;`, неизвестные ключи игнорировать), файл необязателен — -нет файла, значит зашитые дефолты. Секции по смыслу: `[level]`, -`[debug]`, `[enhancements]`. - -**Ориентир — SDLPoP.** У него это `custom_options_type` (types.h) + -`SDLPoP.ini` + меню Settings/Mods; наши имена намеренно совпадают с его -(`custom->имя`), чтобы сверка оставалась механической. Осмотр его меню и -опций — часть задачи: у него уже разложены по группам стартовые -HP/минуты, номера «особых» комнат и уровней (шадоу, скелет, зеркало, -чекпойнт), тайминги ворот и пик, скорости, а отдельной группой — -`fixes`/`enhancements` (включая `enable_jump_grab`, который мы уже -портировали). Брать всё подряд не надо: переносим по мере того, как -константа реально понадобилась в игре. - -**Оговорка по памяти.** Парсер и таблица параметров — холодный код, -исполняется один раз при старте: кандидат в банк, а не в резидент W1. - -### TUNE-2. Параметры СТРАЖЕЙ — в CFG-файл - -Частный, но самый востребованный срез [TUNE-1](#tune-1): сейчас весь ИИ -стража зашит константами, и чтобы попробовать «а если он будет блокировать -пореже» — надо пересобирать. - -**Что настраивать.** Всё, что индексируется мастерством (12 градаций, -`NUM_GUARD_SKILLS`), — таблицы в `guards.c`: - -| таблица | что решает | дефолт для навыка 4 | -|---|---|---:| -| `STRIKEPROB` | вероятность удара | 61 | -| `RESTRIKEPROB` | добить из своего парирования | 5 | -| `BLOCKPROB` | заблокировать замах | 200 | -| `IMPBLOCKPROB` | то же, когда Кид только что пробил блок | 100 | -| `ADVPROB` | наступать | 255 | -| `REFRACTIMER` | «отдышка» после ранения, кадров | 8 | -| `extrastrength` | надбавка HP (сейчас зашита как `skill == 4 ? 1 : 0`, `pop_guard_cold.c`) | 1 | - -Плюс не зависящее от навыка: `tbl_guard_hp[16]` (`pop_level_cold.c`) — база -HP по уровню, и навык скелета (`SKEL_SKILL`) / тени (`SHADOW_SKILL`). - -**Формат — как у SDLPoP**, чтобы правки переносились в обе стороны без -перевода: секции `[Skill 0]`..`[Skill 11]`, внутри `strikeprob=`, -`blockprob=` и т.д. (`options.c:439`, пример — `SDLPoP/SDLPoP.ini:562`). -Имена ключей брать ЕГО, регистр игнорировать. - -**Чего НЕ делать.** Навык конкретного стража живёт в данных уровня -(`level.guards_skill[комната-1]`, читаем в `pop_level_guard`) — его в CFG -не тащим, иначе разъедется с файлами уровней. Переопределение «в комнате -N навык M» — отдельная надобность, если понадобится, то как явная секция -`[Level N]`, а не подмена данных. - -**Зачем это стоит сделать.** Прогон 2026-08-20 (11/22, навык 4) дал -ощущение «страж тяжелее, чем в SDLPoP». Сверка кода расхождений не нашла -(протокол — в `../docs/impl_diff.md` и в ответе сессии: дистанция, -диспетчер, три ветки ИИ, шесть таблиц, `justblocked`, `check_hurting`, -`parry`, `swordfight`, порядок тиков, откат seq_74 = −10 — всё совпало -побайтно). Проверить такую гипотезу можно только подбором чисел на живом -прогоне, а для этого их надо крутить без пересборки. - -**Оговорка по памяти** — та же, что в TUNE-1: парсер холодный, в банк. - -### SND. Звук — эффекты через CBL, музыка на AY — ЗАКРЫТА ИНАЧЕ 2026-08-26 - -> **Решение пересмотрено.** Музыка пошла НЕ на AY, а тем же PCM через CBL: -> записи DOS-версии укладываются в формат железа без единого преобразования -> в рантайме (`../docs/sound_plan.md` §4). Озвучены заставка, сцены между -> уровнями и игровые джинглы — 21 трек. Единственный неозвученный кусок — -> финал `won`, см. [MUS-WON](#mus-won). - -

  • 6UQm+<@S24BNM4-27@2BNI;|*1Iq& z!i_?i!C;Zu1;X-VL$@p?1d9IA6&aAjeigxN^Xpw@!nZD`pf5l z@Cna|2?>UT`3zv6?-PWTtktXJVpCvyp;xASB@spP4K(3j`lA;kKG69!Cg&I^I^vpP+RV@ti4V56`(yc^z8K z0Q{egIU$4zrv*UQG9y_42`Y>69MeRk4_0(234=7DDdU(xD@L>uQ;$PDUSO~phuW$+ zWoE3c4j~ynpp{b)_1D3)m`!V|GN>F3e;Cd`k_CsTx~LJqI|<3~T(hpQhNk()tJCX*7%~{!02BQf=OgWMoq{u%!lJ-~9^=wM5?U8O-Oxo@@ z3$wE)#sbu86$i6Ks6aEBkw)G9qF2BrcqK!Af^a3IxrDmcOz2lsR3;!aT)I6`6v0zE zL$`W+#Gr8Es{Nwp3_~a2BOPcSF>klK)pzhRM=?dV|1U%v-)70QzVL#ChgrOy&rQsS ziK7rft8P!(h80e0fPqXgAq8|v&|#5JowSO&h7Wapq}|=moE@=b9`REj1NC=yMX0zA zKe-{oNO|RCPCx(3lHmoZuB@;xd{@9 z4^xpqK)50~&PY!HR*3H!NFp(AK&*l(-hsYtR=||d3_KArTq1{YXVc0=iIPK!HE@ow z{WKkeow{At0N33cVT4FyzPG*KA#vGW&Fiwwl}lA)KxV0=#j*GSAj?djXoARF?n#YE z|N6fhl#`*UsY@lvBxE52aaZyBiIE5o-^dF?XB8}_@e8?d=!=VvJcRVx$ZnM)o6TG2 zN@2@?&Gf#iwPTFKQzfd-_+8w(hck z(5NDWzfEHB&#SC|dhx&vQ@8_i2BJVrEfc(DGXOYh$gWNjQBLf`UESJcdo$nHqLA{g z0~oZ51bP|MGS)_Q9j5uQ|-S1oe+FW diff --git a/applications/PoP/poc/res/kid/kid24.atl b/applications/PoP/poc/res/kid/kid24.atl deleted file mode 100644 index 57623df9b9fe6405166b1c9c435041d43349130e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5932 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 KyCJn;#{ECF=p!8f diff --git a/applications/PoP/poc/res/kid/kid25.atl b/applications/PoP/poc/res/kid/kid25.atl deleted file mode 100644 index e543d745c2da5d2e0ec2609b6d729d47279acd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6246 zcmc(jTZ$Ah6oyMg5d=pE2i$?^j1Mls9SE+ZrMl|Hp?2ewd(btxf%yODlAK(syH&&t zQ#r}`a;fA$Nq2wx_~HGN>EEYs)3dt=52oqW!>f19zdw2*`Hv^pZ&?2N^yMw{$5%IR znSZ&~{O8T{*DNzVo9?FcJ89c$dPAyfa;b5#DD0?#x{gO_EFd1M8=8B^^c*FnR1>je z^tPsLo=Hb%XQzAPmt~nxquYI8mnC*pm*_F}kUlTVF|rs(TVh-_$fD=N43|vT5#)qy zf<`NQnCAt5#|;en3%BlQvTzqR-{0J;O!^ckr@{R;1eUG=o^se{N0SwuK#JAEy+ao(Yb z%VXUz3D66bwk2nQ0308g4LUVi)&qV}P#2mNw)k?`z zM~Kg;X+2O4k5FgV5zx8Y3Ja~ax+-5!ZwBXdh3prwO8d^>v8^gu@CCE@ixu42EZ)k> zem5#_EC9gH+T^3aA|y6J8geB_&E5k$N|#(6Eu#~%S_2UU*m5U*%9cwtK>1L_fB`75 z`dzaqk)-sX={3uLPtvAQ4h%hu;?RZXHa0UCGlB$~3sMe@nHnOvA_%(bdrWH%iMN9a z9=+~is3(PVf^gR*+{@|q&sFXNU7AxZ+?Mk^shDp}ToH=@|0Fhb}!4-s-yRqmAGG`5h+`Sn(fpz2MLvagge9I!DPV+!5PgSL`?+T9)cru2PB&1DxL0vKnuxTZ%DTGDnEc#B3=vS zgrv0pa~8EIbDp*fjEI4qz9zQA0Q~sl^>ayq_LWKI%(Z%42YL)S_xtj+ajL; zA%6)Mp*l{NVM#{@YK)USZZR}U*jc!MiaT2RvKo4Fv9$AxFznoAQ{NZErPe#EnoBM# zYjFPZ8%G`Y;-ZAz2tT@vq+s1}->S67R*)5x&1b)MIRa5fk=5i5NVLQf`|Q9{CBoNn zBWUlg4s9Mt2+F&}tm2wVwUZ)X1N&8>qmcM!ydQN*Nel$pby1gRZ-&LEfQTs0qD69< zlRzx-L!?EWy81RGd5?vt11hhWdsBnlvX-b5hL48hcP&}F7V(_*pwx4D>u~baPkYKV<6e7 zG>IW0-+JMQKYC`&`j=tx%eI3!ChX94 qS5M(x%4u>6^I*pKwi2bYa^U2ccMOou%-&DY(3wRUs7w?CQ~L$vDf$%v diff --git a/applications/PoP/poc/res/kid/kid25_v.atl b/applications/PoP/poc/res/kid/kid25_v.atl deleted file mode 100644 index caece9ed90e029c12b420d841b9ec8993b34f108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6246 zcmcJTTaMf|5JhDK4h#hF*aHuc9T*);w6+ubMjU!K2~{_BhTcO3u!$D0rA zf4_Tp&;GxA?Y}*|ddo4}%jx5^|9sof>MZS8qT(c5Me|T%aarAx+2`}V)1f!=(6Qh5 zvoy}$_sf1Hl859xZ~Mx$mrIIt%=5e~i{8G&E=!&Q(%4I3F;^MH61<$3<#9i81-mW5 z?y_$%9F`vIMLz?+=yIL39zmp*E0&AD`Q&UvYG#s{v7b&Skg|r$5u`^+i2)R}4;t%1 zNAIRjBdzgSIDV}sXQCKmgbpp?stR!&FmnXWFnZZ!Q2eX5qrBJ`tB5drgkV@w@MG-R(Vt{yQVZ6dnI3K-E8qrXk4KyP6q?J zLyD`#De4h>SPI}VD0=7*NpAO2f`Z*o??(Id?KDa>52%{P*Hg7BS_TzkgAxs^hrt(d8dtTR z$?H1j7Z5Zizad*lRx74}G8J>{MsbVNLB-+PUkf(Sv|T30B3oKwAqq~c~7pt8_LWXzU|c~WiJ`D8O6 zruRQmU;0eSHP+D@1#zn-bnMZp@1Ye?1~tm}T4Ie=p&*-Z9%j_U$}rs-gH0Vc9i%&i zw||Hfbym^L(O#V`Spio1_bEUDaY?cOs}zr-FY8*F4Yc^U{6x`YSl3143=$)92hvz# z0CAqkX(kobf8X zCe@#G2)ZAAf%t6+bIO0diOLvHfP`g=H}$b#{Q0tTJ|~R7V^Lwmd}{QGQyre7@`Hg< gVfr9^gCG{4S2$eo)2g?2dmv9jTE=`r>KzN$cQGpZ6#xJL diff --git a/applications/PoP/poc/res/kid/kid26.atl b/applications/PoP/poc/res/kid/kid26.atl deleted file mode 100644 index 39ee166f69f19a9361bdd9fab97d7266e2adfd1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5390 zcmchbO>Pu15QRHJLP#hfgOmtm5y6HHD~^D~0T7&IP`YO|(--1othhn*Uj4dlcLv0d z7j661=d#;XZBO#$(}(xZhJRna4cBikE{5Uy$(__cp5DD<|MT-p>3_Vudc*$hi`_lz zSG${A*56;g-mzx69^MX1mTAiNW^4Kt3eY3I_RBKDKcQ`E|1f=}eMZ^FK(P=4HP5ze z=|^wb3pNVov>~i)kWk|&-a3?FdtycvKC&s^K!G#S)|Uud%jvXWVJMGLr_{y=`H_yUa1n*CJ~L3;%l*TsJe~9jh79 zuPEJV64{2dp`R~Kyx?@GNa*bPaiRR3qcsyjc&Ns zi1)e~;Ko(W-F|!xkyRkiuz`}?aEttc&2!a*-6W!pq0}Zl51JnZn z9!SO|oF1WPF`1;^#A0$dxtLX)7T2-z0s2VPGDOa}N$=!<*eF1t>l|Sq;}-A z8^^=SW98F^$%*GzbisGL@(_)CxwI9kzKZXXggad<`ZV6`Uvx0coT7O(CP| z#8OwnMi!d;m0QzT0Zw$3P;H^bDEU;tok1`83&PTMHM;3orZ)OokUO}3Y3paIcz){o z;;CDRr~1s)41$fIltc39Z$^U(vo~=xNRmBtGSV43lM8*nUs7vZamqBIFIhievvYoS7`l&;y08Set~Un+!Ljup0n2IAJ@ zP_Y?kG;7Y8Ev}POm~u1R{$>WGt897jQo$q()G9wX^Eg&{K~Yr($z4E0XOu`!NF4NG zQdP49?&a?k6)_N@;b$+5qyiom&fmaOA*C5le%^|1T%h-MsYn%@_&O*S@MYzf#!VPXik6^d2X zVh;s96lo%)2%-uM`+S&?FjUy)HctfNi#^Pv0>vlX3NoS~W)tXCiwKzZbTZ*U1;Q~D pTj%kJe*UwWOvLI`kY~KPX`TLR^I$Lg>}Fqj+3o!4^AoAGMUnsj diff --git a/applications/PoP/poc/res/kid/kid26_v.atl b/applications/PoP/poc/res/kid/kid26_v.atl deleted file mode 100644 index 82d69f1d183ce7e3cdf18c390a4dc4977f75b965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5390 zcmcJTOO6{i5Qf_bU>GpQ83phln1x|)yzweW2;c(*$w?GUw^kA_l#^wZ8_@q>FIG3% zk{rNXbQh~W79Uk?Qu^zU-+y~E{rK|F^!WMJt7&@t=~>?Yy?*|}`k!wfr2h5c-6z(c zem;EQ``5$!C%*sv<>P^GmdEMyRQJlV>{+sYxeEhzhc{Bh=30-rkCnVE1*L-gdwB_r zIus*IQ3@}Vpp*8<(z$^^xF;3QZKs_2rwqDr!I$)$w)d=7D6c)pfnXa<-2jl&`x zm#FRtBWg7dX(t`3FPi`umX%jhrV>gBd1Oo|%~!5QgCH5_I?Y!E(-rovslG5+$XAc$ z#-ov>n2AP7Kgmf)wE_1O(nIpqnGpe>>d|kCuiSpbf#QQTJpk;xlltRh6w`RQD;4Y)x01ct!dl z)bsRZ{|xcL+_N0YVwJtojW^?Q12Hqf5~%I@sAoZ3wk5xUTIa#aw-EW6y_xLebQ|(8 zz5yHDXXJh|>dnKe35iWxB|CPn@j-(zp(U|`>i5k3j#+7sndu>%T_isB0#r}p=2pAS z15u~#IKIxpVLFr7Lr8w4Rm84T(sm-Ty4~cU-c6tMOetLxQADuCLC0WWJM7kZQRb@y3Yh!-T7V? zXlqH5<}^vPbA(An@%{Al9T~7`+^VICF3q#_=vDjwK(viU9GD9XT%sj9St~Z%{WBv@ zg}kc898(i5o5JX^7AbElC=qB;K?&Ea$UlHAWjJdH=KNRm#Y}#Oz*G_g7F*}=Qn=U0Q>I?B= zj9Em%_{|y(y~apD8S#_t2T{z+?7`9Fcy=%FBSg3jh4!L72@(qQOofLPe=MN h*A%s0>~oGWVGW9GX=#E-ws zd78{#Y2S8U8B-RU?LjI09Ll}GafbufofSo*xG*P0M-^vVjcyfn)}XULNTPiOPXtL5 zzH}Tmb!2LwYe;1t1|cR-j)r8Tb>Wt1avTHcm V?5j!MM|dKwt|tv(RSLdjA|F?VZCL;S diff --git a/applications/PoP/poc/res/kid/kid2_v.atl b/applications/PoP/poc/res/kid/kid2_v.atl deleted file mode 100644 index 0969b6b52814ef2867211d7c3c8d79d8d31fa79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8145 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 bA1s(2SVOr0VWK|LbE5`p1`*Cq*rC4xZ*5U) diff --git a/applications/PoP/poc/res/kid/kid4.atl b/applications/PoP/poc/res/kid/kid4.atl deleted file mode 100644 index fe74474e526ef4430ee5058671a673b1696caf7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9758 zcmchcONtyv5Qbac*kBL_fx%iBMlgCHwD1wU^44JRJ=&eXxB|NHvoJ@0>i zdnf%rzq^0K{x9FZc*pziKis|N{ofxyNS_`)KfFE6Pkx=x9TSi1G3Tb~dYycF%_%mK z!Zj)R*yjui@)6u|o=>ih`}us%6wwQ?$K%KIAD9#1JWs?#CVe=EIVIRQpMy}{X}VlM z9wEq!N^*r9R)E#`iiJDDn1LBfZqG-8r)JEpx{kBpK*E9pau0Kk%@jN$HsXu8lbmYQ z{Oa&}Z_X?tokUVI;+)2`36EpUf){;n=&HQuG4{UQed*fOCvn0vC_!+@jDnK*%5dm4 zNHUa9m7EP*=)K24PnUUS&hf$n)!0+cA$cxH5M+p2;bV8qn)H+Zn3kUBOd-J}PiQF~ ze4?1$g1Kry^L%kB*i|gxM5$BuNq`p(H+uzPM;H&)NK1E~E@4xyX6{gKC+2}y!$UR1 zJ6vnUXth!d1US~xulW=2iKH>bZi&s}-Aziwc2PGWN!fiAa{lHu<@6iUu`7lICqV5m znYYE3T-#$?6gQ*HzdYRUtcR;|=r6ovXI%~Z5Vu(STItyEvKICj)Fr%>v=s8uHYV?G zR=D%&q`7n=ttOCyEgz)9eN^ar1tp9ovw4J@P&$Zj>uXpt86S;eDFt#2d=o===~S~zNTc2tOQUeT1S?IIX2zCVA%P8(Cz)n)6I;}}OekF1)3ov` z)I5s>Bc>0@%TR-65t5HMtFUw}CdPB{--Ymu>{xv9TQlGiMaMtrO!e?$j&kIo&tdL@vLWsRe#a5si zDisQg{ZW7rF8iKs7*Lu+UKXb-nZVqlXRX&o8OIq#)triS)WV2jEi)(zb8`Mi6RP$_V3#f--QR_KJ zoSgmXN_$A5v?!*jyad`K6%k+lX&o*`9CE2_oiNj)CC!{lWP?wf$o3wmFlsgSqMy+TI zsC7pwjDm^uvTe1A+Z!GT#&#pEaMN1Vvu`?iiPCKx7X&@SLiC~_Vv@N=NeiNQ1)(nU zNA^jEBtA(^zoCC6)B>*MY{|I?diWL+@v?v?J+4E#E#D-r@?;jAl987de+1Btr3fMf zOHg^yOo8U;U`Ig1Y~KE)&P;5O-|LKb1F)Eu60iqwEEVqlEc69sk?_Ash6y!%YXY~vgSe!D2e<*QUd+W7_QYcbS8@ zE4vF-7AKOyhD@rWoBpGyOm#Z))3Gz&8>(BkN3=06|HGF)o!pGM`?n{K!hQm{&p6|K z<7mkvs#Mgh*j^C6hFLZUU!^g^MtYUlxFzK>f!8l6+i^<}lJX@{3_bma9xkWzMH?1#skv`0*Q zuxx;GoK-|W`;zmK$LY)sB)x=XbRaorM%(QPlvY`ZkR!>}TVj|&sfwE)LrwZ(0pD~p zd=7s%B?Wi%Ht9?ItfYzV(EJ2)-hM<8Cd-vQ#?^ZI=D5j-j%V`>YHBT$d9t>b1+~uR K-V>1eI{qJUPs%y~ diff --git a/applications/PoP/poc/res/kid/kid4_v.atl b/applications/PoP/poc/res/kid/kid4_v.atl deleted file mode 100644 index 28ddd419c11be3b9b30a14dacd17c0d4f1249e98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9758 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 N)+CN-PA}sD?N2^)#G?QJ diff --git a/applications/PoP/poc/res/kid/kid5_v.atl b/applications/PoP/poc/res/kid/kid5_v.atl deleted file mode 100644 index b15e6f2c99c65b89552d05a17229ff43a941810b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7809 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 diff --git a/applications/PoP/poc/res/kid/kid7.atl b/applications/PoP/poc/res/kid/kid7.atl deleted file mode 100644 index a95a4f0b40ff9f65e5ac306d21d5c61a5345bf40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4085 zcmcImOKub~5bX#>3JMuTnN3ziNlw6q4J&Sd#7SD38MEo>n{Wa+7)wsjyjLH)-0kTJ z3V1PgSG_9N=h>dGUp{}h>i+-u(QThDF1qgHn>(4mUv8iI{po7+!1?#v+eglq?>6r_ z|Gc@m=lpAPEi)tBc2C{($}tRQ9HikKWE{^x(l}1XwS52>>o5+7LnQzpRRRDi%)$k< zl#R*l<_OahqrM4nF!xe>(F-P-zmkdwGQbuop=8t4V@yo|LL!2IzHcG~u#P}{O&=Ph zC!#)fyFHS%=$RS(mqh!1x07PZ57mp&@Aepzq83^R?*0K2TYmpSCg~lIr8#cPWJ8Z; zT&;8pi->6HPEfjXBu)SdA_8Qci?7Y8Ig-*hjGRP^B0z*QX$Wb}J~J>LNkwSy_6Cta zauPu74#^Sjg&gujOTb~T6(to8x>F$$_)d;^%|R8-H49n`IEfxwkib)_x83urZ@g(b zwstBqPy#$E-}TA~GYm^m%`|C(S5Ta|tuqNTg*TTx1t6DW(4AZ|B6u;0^UTXg z|Jk807+#RF+4`%cR)r{=?qP+TLjf+fgP=ht#Ng!^aVO>D3bbb-{bj5zCB#NZ zcM~inKUD{9MISYf+DWX+56T3WGSI7;F<|h|vt%!s+F3~13G)h!0%5X>i=fsUikD2` z=Y+D-8U<0J=p|(Ble5+LBJ)2KIwJ}T{I+{s>6(FFKKVAMER@Zsw2)U1bpu!am3RiE zYq`{l-sxjqaQ>CzNuj+Tg=d{s2l+Qa=Cy diff --git a/applications/PoP/poc/res/kid/kid7_v.atl b/applications/PoP/poc/res/kid/kid7_v.atl deleted file mode 100644 index afe4669ed5319154fbf8330500b58075c514ae68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4085 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 diff --git a/applications/PoP/poc/res/kid/kid8_v.atl b/applications/PoP/poc/res/kid/kid8_v.atl deleted file mode 100644 index 5813b5d2d244d9a3e5346a77435d3737a66e9b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9085 zcmchcO^)0)5QXJM0I$3VjBGNPU;x_#FSGCge1iZvi4Ava)!mEibCLi#P>{1I?^Ur_ z#UF{Bpc5`6{(O9-$f{~e{p&BEe}29E_vw%2@#Cvk%X0nh?KAJczkZhcZ*Lwxu>9xu zdjIQ($M-CM`tj)Vph&K_bsb1wE>{pYNr&(STBrTIPP3u7Pd_I3Yf6HV*&S&Ff zT>+j0=xw(M-q!O;I8zLQ0Hfsj1oGRL9=MhyKyW<}!zs%9dfSK<;L0R(6_Pa4xygCBDcE3$PG+boDIl?EhFFZNYMEJ6 zk%^rso!vgwc+62*Ud`$Gq%5;vha*N0wGa!c!@0wAawQb|2We+clu z&lcOTFEfkHakP<%M3cLYw+~n_%>!LMON<3Kwd^67toCkPa;u?UIy+5sH(!&knWyML zhtgD=9c#1aad8v`R+^_$G1xFqtl~7R=`zPFb%EMp00R}nX4GPwOqbihj=9w`tHrpC zNyeJ(?lF$dtQAahELmD}j8jahHpqF5+qO$yQ_wQetY$HeM&5H9eRPj;G;xwS)dY9_IHxt9<7uzc`CP-lw0DwtZY zx~iisR#k0L4OZ&gxtm4Ow3&#tOO_}P41G#|6oSXosT(o*?GOkT853BC^7p}gOn*2; zBwr+G@G)|Nf5vx9B{jBWMl)H&Gdk0jTMsH-~V=GU;p zpb7`-enVMXQW`7FD@(F2O;S^scx636Q-;4`gPZEALQZq>ce84@qB`YJPA&d_#?&*0 zgU(_SAI55T#ZsiO)!w_OAXb`T11GTowW%0CB<(${1PH;>=O(eIaAtHMQiv#UbNLp= zpifB0@)4QysCh``uV6fC?P=Z0s44SG7mOscmr3kIO+gXk7@c@BFFt<7^ZT8|$ZjKUL*-^;V zYFD|qlTm6keWh+Y8djaCf!K>EdW*?-?nw(qT))^wSeA>H4o9foJi_b0QsVO9LjS^4 zgffr!Us>AIWwR%bP_PZ2-!3Q%rc+N!=zsxp@Q@!Acjo}XYw~w=dw8F?gsQj&1Ro>Q>N$h3;!z7D@l{c%FcxX+DWh7T zF&WHRvvG5>K%#m~^#W!(7%T@h449SDnSz2VLX5|>1hHKvh&DoG;@^UZME)FTp>RG6 zNyqx4P^rfeU^pqTA>j&?wkOPb0n(LCdX0LVswntP^;kV~t(M&KgrhbAXVk$cpK*bpaoP z_U>-lJcnsmL%PTQL||Rg!oN#VEMFlaz*xa@N^ly@K|mBFmRPH9x)3-+hy|cK2Fk;$ z*`SE-N?S M_|bccs)5-40nfCo$^ZZW diff --git a/applications/PoP/poc/res/kid/kid9.atl b/applications/PoP/poc/res/kid/kid9.atl deleted file mode 100644 index ed13db5fbed814eebf18f5d975ac0f004b013498..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7885 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 D@eCPV diff --git a/applications/PoP/poc/res/kid/kid_atlas.h b/applications/PoP/poc/res/kid/kid_atlas.h deleted file mode 100644 index 709400b..0000000 --- a/applications/PoP/poc/res/kid/kid_atlas.h +++ /dev/null @@ -1,41 +0,0 @@ -/* kid_atlas.h — раскладка атласов Kid. Сгенерировано pop_pack_kid.py. */ -#ifndef KID_ATLAS_H -#define KID_ATLAS_H -#define KID_SHIFT 3 -#define KID_MASK 7 -#define KID_PAGES 28 -#define KID_PAL 0x70 -static const char *const kid_atl[KID_PAGES] = { - "kid0.atl", - "kid1.atl", - "kid2.atl", - "kid3.atl", - "kid4.atl", - "kid5.atl", - "kid6.atl", - "kid7.atl", - "kid8.atl", - "kid9.atl", - "kid10.atl", - "kid11.atl", - "kid12.atl", - "kid13.atl", - "kid14.atl", - "kid15.atl", - "kid16.atl", - "kid17.atl", - "kid18.atl", - "kid19.atl", - "kid20.atl", - "kid21.atl", - "kid22.atl", - "kid23.atl", - "kid24.atl", - "kid25.atl", - "kid26.atl", - "kid27.atl", -}; -#define KID_PAL_FILE "kid.pal" -#define KID_SWORD_ATL "sword.atl" /* chtab_0: меч в руке */ -#define KID_SWORD_ID0 0 /* индекс в атласе = sword_tbl.id - ID0 */ -#endif diff --git a/applications/PoP/poc/res/kid/sword.atl b/applications/PoP/poc/res/kid/sword.atl deleted file mode 100644 index 917470a753fb44ee33c4cdb3612235980cc619b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 zcmcgvxsnqx5S6bTU&vm&lsVdjm`@#6&7x1$@OFTH^jhUD|UAx^5Wg!R!n5`| zYO!FhP+ORzkvJ($kVNAf_QlZ*B2L9a1cH4-tk%psgOLF@#DA(9j48CZ1)Xaq_#71` zW?AGKVsRK<7wLfraTPnkM@>~0Bo!c|jY<<1@JVe7lbki{XI)M1U*y89iaEWMua+K^ znAQyB=U}-r`T~}~ge6Ed205m+WloqI?6RA9M%biixvB!@#5xA+FmDPji@$yD5#GsA zH)lcpNR3~U2(GH}M0V-v3WeyWXd5^rVmqAW>H{DpSPUK*z=Wf!G|q<4HtniJq6=<1 z#Ar#K8SB9mrUdiFOQlz?3HTzFR3*o*wARexdG`cKs+e}nl;~Z%A@+zJDoJ!gHro}L z2tUXU4~b|}BPRUWAzktDzJUgze3Y4UnEJ?P{rRpC62PSedwCHoP7Z#Tk&2&+gMYZ? z8u+4XSSDcK|A*Nto+(iUooc-6)Cgxnb(M%+4uWsnw#vn_MD}1}&02R`YJR<5Q3h_g zN_C8u)?{4q0H|$?NvcBGR6uR{>@Z}_!hZo}0*XZQh!umhh7%03Y>IB1FhYs(>J--T zAQrlT?|Ono9cA*;D`Mo!Jw6~7rAOhKacc!ZvWFI`%XdH~XCinXx;w|({f=(PL+|Vt z7AMZxMJ<vblNM>Y__EDTI+?ojL|78pj3DrWpe$j+!ixi{r$441KUJ7YGvGN2 zXHGKOVHBTT>Q8>hI>IOGB7!~R4(EXX@J~D66SX-YB^$8tnpY~278{#;`=A6(Ll=&; zk~|v5d_)({ePIyFOk~}ZFB{CdRa@CPUXYJ`uVH^xej-uIXhx4$O28iYpm8pFt2=>` T(A~!%z6KaVO!V8TuYk(GB}}|t diff --git a/applications/PoP/poc/res/kid/sword_v.atl b/applications/PoP/poc/res/kid/sword_v.atl deleted file mode 100644 index f4535476a99fc7007b5b073d78ae58f28d02f691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 zcmcgwy>b&V5SHyE=bs=u_Na4}hMGs9AuTf$R1ELIP|)DkHIG0+MF}&hsCfixhKeUR z_E)#7lg|k_D0f=zkG}m@(%pIT;`!4j*WuyY+fg$cjY7B`#WBhsqclNzJx*sR-;7g( z@@mqMd^SnvsDGZsOO&tA(u(x+nY$l?_?NlXc~Yk-#6RrF-f zkixmtqA)Be&~#>q0jy%r#EiQ%b~^0&Wi?qw!~r&f!TrtcFO?Kl2e}Hi zNrD!yS_(a95nHI`R0r(J!R0qzJk`RDgmWSZ=k4pg01I}4@iMHBt?6H9@wGwauGS+u zx^p}XoGxniBSjm}lnsE^;AW7qXG!5gR)k%ZzG5<1Lc0=FG08meFn{EnPWw!{qui}2 zWVVVOJIA2H6=4x}vF+Gpr)rOO+khVl*Dz1zM$&Y9_n=v(IQX{R>bK3?G5FpWq^Ao- z3RA5GfT)RlK((I1S60ztSSVNL#pUGI4Z4wd@}B1bZ%sK<^!tlgoC;(>H+001I|R<; zG)t1Xd5#7hH6UmP?nTG^vqLgr1T+>jk7wV{qy-3C!rx_t3MXp#4;H_vywRBnVsJBi zM26GqvBE$z{|8wV1FEc}mTGnM8h4@Yc01>8TeK84>~@7AhE4T3D#A{y7OaXwNaYY7 zVlM>t`(Bl3D(OMxeN$I{=@-YKPzH43H1e3S z=2v!rVcce@;P%a9+;&ej6x`jv8`Q{BW;)@vsJ3l)waFo2A;$~O7H1|={zMXTNJnlY aQ&;2h7n;BU0zzOL97s@JLZ#Zhef|JdTD)EW diff --git a/applications/PoP/poc/res/music/m24.bin b/applications/PoP/poc/res/music/m24.bin deleted file mode 100644 index d861766..0000000 --- a/applications/PoP/poc/res/music/m24.bin +++ /dev/null @@ -1 +0,0 @@ -{}|{~zwynvymo{|wvy|{svusnkoyzrx}w~uvsspwnvuswxywtlr|v~wxumwvlq|{vvz|wtvvrmkqzxq{}|y}uvsrrvlwvtwyyuqjwww~w~ur|tks{yvw|xxxwspovyqpy~|{vwtky~{z}zroypy}~~|ysyytu|{}~~}}{}xlr~zwqw}|}}s}z|z~wo}w~ywx~ysz|uvzx{|ym{yos{~~{|xtpx{ps|xrv~sr|ussywuyu{unxryw}ur}~ypmvzz~rfsxmjt|~{~vp}vkox}}|}{w|}w}~~z|~|xxqpvy~|||~u~qswt{np}vouy~wv|z{ury{w}omru{r{s|x}okyypz|ppzy}}qusjkpmqxv~x}qzyuvup|{z}q}uwpevkutytt{|kozwpsy}sujsx{ybj}w~}|}|xsz|nzx{~~y|wyuv|}lqx{zwytw|~x}sz{ik{}psls|t{}~|{tz{vwktvqt}~rz}{yy{oozqhtz~~zv~rynjnm{sr|pjk~ooknpqoxnw~p_vqu~yqrymszpwmyyzxsnx}yx~~txuolq{nnrwjg}wtwynZT`dqqvyzqyjvy_W^\lzofpwmdieWpmptzmfu|opzicfqyx}q][kok}owwqp~|pni^exzyx{h|wvmpgikz{ry|x|so}qmrquw~rfv{kt~ywnmzw~|zxuleksvyw||swzpnlshxplbvpoz|mwqj{{jptlkjmxq~zsyqnpmnruwqkqu|tqtuxl}{xhnvyo{h~~}wstyvni}wjrzqynehv~z|wyumlvtml_gv}gjzxsirzwnor{vm}ry|uvnhtzy{zqpyqtwp|unrguvvuiylktnlq{uvwtsqvqutwynz|zcm|qnwmw|r~z}{lusgcnpvs{}z~v~y{znxsmgos{sawj~ynqovd|zlgx|tluvTntiiu}~~wgv~kiton{pUSWnyo~r|vxtwtdzsl||~{~|pqnbqpmzu|~wmfzv|zi|}zzcZdmu|i^jtlo`jy|j\nc`eZXdru}}w{pj~torz}zkl}ROYWqupw{g\Yjhir|}xpo{rwqzz|wtxxwprjM_aPo|zwnj|ulqe`eXYmm|~vntswagld`CC^ks~stzpW[cRRl~yyv~zmpuvw~}s}tfzhmfWTZaU]glxs~}q{{ttuv{W\eOO^aprrsltoXT[aNGPdbjwvebg|evod`Zkegvypowhqdefagp|}jaslivur|~~{{x~phwwmp]kkdclk_jyxz{~qqtyz}{~_c|fhjDG7Khoqub^l]WM@WXhz||zjdpt_ekUJOZckjn}qrkroXWd`k{x}r|o]mjvwwx~ztrc\Y]b_QLbcxz}{t|{{{yytmxxzy}jywyiWF=@Ti|lbTaZUXYKKg__|{tx{lqXmzui_migdecckufry~p{iiophpqtxzsepugnufbywh}tp}yeszyuo\Ramckxqp~~}}ufihr||uwecy}yznLFEFPZbrgixcHOMFSRdb}wpi^ord[Y[b\WWdsnvvuz{zxgovc_pzx|}{o~u{|~{mbqbkblgewlmpng`aq\`dnfuv{r}vu|mx|~rs_`|{{w|tnrr}sz`RONGFKotgxgal[KY\LSkz~rnYplhX[ntqpl_k{senxkdpyu~~uyptwzwjy}xytckogpl`epqmwmt{|yuqu|oksthittr}fuyuzuyypcdkknfkzz~~lp{rlu`geZKDDWuºw]VcRYNSVWuuupj_TXXZ]Zc|s|xuwl{k]Zx|qp|~ztrymo~vbajYbZonw{wxyvuvrtnmxdWb~ywvv|t~wj}vbn^hwz}ypid\VUgkhz~{{pacj`]m|{utz|{uoffV]blponwtwwg`W[uvpqxtw~ntqigltfkvhbcdXRbkem~|s{xka[p{ke_rzsv}rpklb\]dp||vssqjc]colaprzihfbqcnutu{yxxrf[XZ^clvz}xqxkT^j`bq|}zp{uknrx}yxxk]fcXe\njh{xz}`Yhd^frur|ou|vqvdbfmu}|{vvvtqw~gkgjvt{s{{psxy|~{mrwpxh_bfijks{{th\]pgSLPil{z{swyrifhmv}ypgheYT_e^]iu{y|vkvxaTPcfewr{uyx|sf\[^iyy~zz{wqsobiplipv~w}}py}}}}xpnnu~rhdbdjwtqy}ws`jsc^[XWe|~vyurrroospdjkZg^fj]hptx~~~~}plzmdc]Yfwyxwtbrzlihgdchyt~yxzy}|z{{~{uuoamk_`usv_yt|rmmlfaamyyt|xqdhxfOQYKWYc~}~vmhgipz}xuh[[ee\Zcmrsu{~zuz|}vpu|{b[cV_d_vv{~|qv~{umhdcekmeyzz~um}}~|{~x||pd]VPf~|wstlhz}{{yvtpnptimxo}wwqdxocWPV][]lozvutsst|}ssoakcemcgnqqqokjquozxvsru{}teY[deck{gjtrnijlmlnswuryyzpq||~}zyz~yyjTNfmkrxub{zqqkkpsssu{|vrzzxsgn}pae]RZNS_`q{}zvux}{wkhkg^]fossqqngfm^o}|xnklpw~zxggf[gikz}rwvrpmkkmt~uy|s}~}jpussuy|}rdT[fZUdns~upzumnnpsx}zx}qu{sjzvnf_^cb\[cp|z}~z~{zzz|ztzyrwkoqjntuqlgb^ZVepmtz{xuv{zrpsohiq|njkjdbdgny|{~|nmllmrzthssb[XW]oyxzhlieflt}vmbeywkjombiealhflt|{{{{}~|r}}}vppsvvspkb[VPcm^eswy|}~y|}srw}~~rpokjknt~{ysuqpnhgks~vfixn^Y\]Xft|ursrooryuncn{snmjgiorolnqsstx~|}xvx}ogx~uu}ztssrokd[R\dVRZclu~~}}}qqngefiovwgq~yrliltyp}vle_Y[bkswuvqmmos{zfaqqggmpjptowxrpponmnsw~|~vzwuwz~{wsnhc[S`dSNV[`hs~~{yy{{y|{xsnmotyzxvqx{umikqz{kn|tigh`[`\`py}|zvuvz~}ou{ngddelsutuwyywtpljmktyxzxq~}omppt~zvqmh`YadWPPRU[er~zx{vt}|volklpvyyy}xmu{olsyyrppqs|zuvmgccc`[[an}zvuvz~tr|rhgedlmluyxyzyvrmjgacy||~|~pihnw~{tomgV[m`TSPNOT^jw{wrn|}zvtsrprzzywy|lden{~{{vsrtvx~{pxxqmfgh``b__fp}~}}|}re``ejllpv|ztqnbVgxsv~}zz|~xqjhnos~xsmbYcg[USQOOSZajwyhm}}yvttvwvuw{|tqzpgbhpv}|urvwxzyumiikkifeegils|xndcgfjsvy}~{wob]ilfir|}zrmlmnpu~xlZ`peXVTRPOPU]fox}st}ouxuy}}zy}{x{{xvsnuyqkgginwy~}yy|yq{~toihkiiorqpnllowumihhilry~}sbgvi]^dlu~|usrlmuzqekpcZWUTSTUWY]gqvx}xrlpty}}}}ztjcq|xyvrrplr}~z{}~{zurmn}tolkmoqruxzzxtqoqrqvy~xvpmqwz}}slwzka^^ahr}|||zxy{xmxvcYWWVVWZ]acdejr}{}wolmqwzqdcuzqnorvz}|zz}~yyz{~ynbi}~wusonpqpuz{{||{yumdf}|s{xvwz}|qqpfba`bhs}|~|}zwf^ZXXY[^_`adediqtus}|xzwrpos{|pcjxrkjlnt}~|{{}wf^nysonnoqsuwxy{|}}}{wnaex|zzx~|z{|~vq~yojgecdgnw~t~~}}|zyjc^[ZZ]`dfedcdgjkgh~}xv{zustyyjgvxledejqx}|{|zhhurkjllosssw{{{{|||{uidqsjlu||z{~{z{}}ynstnljgedfkr{yv}|}|xvwnhb_]]^_befdced`\Yg|yvuxyvvzujs|siecejns|}~}}}tlvviccglqtuvwxz{{{{{wlaluh`clx{y|}{{{xqqyromkigedgnwv~~}ztmx~wqke`^^_abcdeeda[TWlzxwwwvtrw~yvx~ttzlecdfimry|{}~{w{tgaafjlouxz{{{{{zxqhitob\]dmy~{{~}{wojw}tqpomkjihikov}|xy}|vml|}zwqkfb_`ceeefd`[TNZkkilrvxwuv{~~zymgefggkry{wrpqe`_bfkotx{}}}|{zukgt{nb]\]bly||}~}tkl{wrqqqponmnoonqx~xtux}shn~wwzzxtpligfeeffeb[RQ_f`^bjrxyz{}zqkihhikotzxki{{ofbaadksy|~}{xqikyyohda__ckwvjp}ypnoqqrsuvvutrrruwyxxuvy|wnu|tnorvy{zxusqnjhge`WOUb`WVY_hr{ztponmosw{~ts}{uw~~{tniffhlrw{~}ypgo|xokjihghjpyw|~tljknpsvxz|}}zwusoigv~{z|{wtkikou{{upljgaWR\e^WTTW^gp{}ux|ywvuuvwyz|y~spsz{~{wrmlmpsvy|}|vmkvzsmklmnnoopsyxnjjlptx|~|zvndcs}unjijou|ysoh^STabZTRRUZajt~{r{}{{|}||}~~y|upory~z~{xtpooqsvyxrjo{ypkikloqstuuux|snllnrvz}~|vkaftvtv|wqmkkmryzsi]U^f`XTRRTX\cmwyxu~}|{||{us~vqnot||~{wsqprturkly|sliijknpsuvvuuyvqmmorv{~{shdptnknt}~wrnlklpv}}sfZ[fdZTRQRSVZ`gpyvv|}{}~}|ztowzuqmlou~}xtqpqqojgsxojhhijloqrsrqqtx|ztpnnquz}}vkelunfeipx}xtqnmnqu{}re_hk`WRQQRRTY^elt|{t|}xy|~ztmo~zxvsomnrz~}~~ytqolhdkz{rlihhhiknrttsrqpoopxzurqsvy}|tklxvjb`cipx}zwtqooquy~~rgjqi\USRQRSUX\agmu|wx|y}|vvy}~xqksywwwvspopv}}}}zuoh``ozumjiiiijmortvvurokfes}ywwxz|~}wokt|tic`adjr{{w~}{ywuuuvx{~}tqyzl_XUTSSTWZ^aeinsxywwytuzzwwy}ynmzztsuwyyyxwwy~~~~}sh^`oslhhhiijloruxyyywrja_o}~~}}}~~|vnp}ulgdccejr|wt~~}}}||{zz|}|xsyqg_[XWWY[]`bdfhkmmkr~xvvz~{z{{qsvqpqtx|}ocgpmebcfiknqtvxyz{|{wofgsvqqv~}{wpjr~}tnkihhikou}zx}|}}{yxtnn|xpjea_^^`bcdeefgfb`m}{{}w}vqpqsw|}|vouvlc__aeinruxz{{{{zvmhoxtmikr{{tlkw{tpnmmnnoqsw|~zz{~~{vngk{}yuqmjgeddddddddc_YZjxzz}wsqqsv{~xrsy{{nd_^_chmrvxyzzzzwrjlx{tlhgkr||rio{|vrpoopqrrstuw{|xwy}|ukfp{{wvutrpmjiggfeddc`YU\kpoquzxusstwz}tmt~|pga^^aejotwyyzyxslhq{woifeglt|qnx}wronnopprssttuw{{wvwz~{qilwytrstuutqoljhfedb_ZSTbjhfiou{~yvtstvy}xnmy{pic`_aeinrvxyxwsmhmyyqjfcbcgnxzrw~zsonnoppqrssssstvwwyzvuvx|yomvzupoqtvvutroljgec`[UR[ed`_ciov{{xvuuvy|vot|{xy~|tmgcaacglptvwwtoiisztlhecbbdipz~|wpnmnooprstttsrqpoou}yvuwz~wqu|xplloruwyxwuqnkgd_XSVad^Z[^cjqx~~|zxxy{~~vu}}upqw}ytnifddgjnqtuurlhnxxpkhgfdddgls|wqnmnoqrtvwwwusplhgq~{yxz}xwxpkjknrvz|}|yupkf_WT[daZWWY]biqz}~z|~}}~}zvomot{|xsokiijknprqnhhszuokjjjjjjjlosz}uqonopsvxzzzxvrledo{|{~~x}zrmjjknsx|~ztlcYXae_YVVWZ^dkt|xw{}}yz}vqoosz|yvrnlkllkhdhuysnkkkmnpqssssux}zusrsuwz{||{yunfgqvsqsx~|z}wrommmpty}|ti_ahg_YWVWY\afmt|zy~yu{~zvttv{}xsnkie_^htuqmllmnqsvwxxwvuvvvx{xwxyz||}|zumhmvuollpv~|vz~yvsrqqrtvz}wlflpja[XWXZ]aejou{}||~}ut~~|zxxz}ytnhaZ]krpljjklnqsvxyyxwuroko}|{{{{{{xqjjtysmiikpw}vu~zxwutttuvxz}}unpwtja\YXXZ\`cgkptz}|}|{|ysx~~~~}|zz|xqg^Ybmnjhhijlnqsvxyyywtohdl~~|||{ytmjr{xpjgghlrzxsx~|zyxwwvvvwxy{}|xrrz}tib]ZXXZ\_behlptwxwy{xy|}{|~ww~|||}}}|zyz|ype]`kniedeghjlortvwwusngacq|~}|zxuojoz{slhfefjov{tt~{yyyxxwwwwwwxyywsrz}sic^[YYZ\^acfhknoopz}wuux}}}~|xzyz{|}}}|zyy{~{pebinidabdfhjloqsuvvtqkc`grtsuz}zwrlmv}xpkhfefhlryzuz}zxyyzzzzzzyxwwvtrpv}slfb^\[\]^`bdeggggl{|xutux~~}~{xxxz|~|zyyz{{tklrof`^_acfiloqsuuusoicdmrmjkqx{uokq{|uolihgghkot{~|zwvwxz{|}~~|{ywtplmw|vqmieca``abbcccb_`iy~}|zxwx{|yxyz||xtqq{yuyzrg`]]^aehlortuvusoifktskfehnvwomu|ztomlkkklmoruzzwvvxz}}ytnhkv~|yvusqnljhfeeddca^Z[fswvwz}|zz{}wolu~{pgb_^`bfknrtuvusoiiryvojggimt}~tsz}xronnnopqrrstvx{~~|yxy{}|vniluxusstuvvutrpmkhfda\WZemnmosy~~~|sqx~~~xqkfcbcehknqrssplhkuyvqmkjjlpv}|}xspoopqrtuuuuuuuutt}}||~~wolrxvqooqtwyzzyvsolie`YV\fjhgimry|~}wy~~zwx|}xrmifeegiknpqpmhhpxxspnmlllnrw~yspooprtuvvvvusrolo{~}vqsyztommnruy{}|zwsoje^XXagfcbdhmsz}z|{}wssw|{wrnkhgghikmmkhejtwtpmlkkklmosx~ztqpoprsuvvvutrnjho}zttz~ysnllmptx{}~}zvqkd\Y^ffb_^`dhnu|~zy{|}|{tppsx~}yuqmjhhhhijigdgpvtoljjiiiijlosx{urppqrsuvvvtrnifhs}|wu{xqmlkmpsw{~~{wqjb\^egb][[]`djpw~~yuw}~|yronosy|yurnkihhggcectwzx|yz{w~v}puvwyopwzzvohibXjlt}u}}zlwq}ux{zphtd_gqwqgfmsjdzqqxwbT[jsleZKL`eTN`s~{~x}vmro|ncs~qorzwpwp~uzuw|yz}yvxx^[^^swfdrz~zzb_q|[ZSi~wzwsurvuoZjupr[]Zcysur}wintrpppdx~z}hq{garffzcZwmhkttqtmv{pkqmpx{xw|zs}~xudcqp{ystuxl_`ysql|~iz{sxfqumluy}}or|~}{yjy|y{|xxkhf~n]eth_trnx}gd}|s{|wxz~wjsjmowxxvyzxxsqƴujor\Yjaazyvxxvvtai}ppkoy{~|s~wy}tr|mmwz}_RkdXf^V`ktxx~zlvy|swmq|jqwfchYam`afU`_dhuxmyuv~pjqwzywl|vvoupfwwl}zzz}xtwkevyhXxoXgcWZfouxrprtnro~o[pznp~qw~~wrlhisRSmnai`bqnswzsrrwwopeuzmpwl~{}vwn|c[`i]Sdi_n}vwy~f|tmtgy}z{sx|sxljyxqp~wtr|ey~{|fjqb[ZYrvlpmarmtu~|lSltSTYKCHQWZYXqluy^_tiVVblcgz{telr`WYJZeojqnblcX\fosvp}{~zj_yrp{~tzzrllnsd~xpqtrqk}r{yms|ufqznoxqmmp}tX]iiPXIJW[`ddajztgsxidaXfiVSEDWVkszkrx}rovon~nt}nuvrxmgehvzho{~qx~phkbkupgevlwr~ywmx|~|wz}xtj|vh]Zplqmrj`^NCCGIJIUh^kemfmqZLSfWT][MRb]\p{wuu|{gi`}}t}}yn~ug`sgqmuxvue_]ZURYnevzxz~omzthp}|tomov|hl\q}oviwyy}~qrjp|~ulht|pjvufcf_YnkVFSQLSM_Wk|vwppwtoc]]_]]_tuvom}rmpf\el`_oyxusw||q~t~{wuuup`ir^JN_Ymnzvqiqrog`bhkmn|{ztyyqe^XPMPbZfquy{xg]eeVWfqrrtzuwmbnoc^gkmjil|}yysfss[HPVN^Xmkr{prqq|||tkhigghyw~}mf{ztzukp}vnvypkjlfW`Pm|vyzxys}vs|}z{yz}wtmfws^NU`Vjgzxwod__`afus|}}ievohjeXWdcY^lqmgdehfU\Sk}mvv||wruwsuomfrrd]mjhuo~tnqxkeh_UPQRW`tvvvxrxx{ylhyp{}t}zry|upqw}rmy~vm{wh\`gXe_fpeqxxwwum`Wbsb[ef_[[\^cnsfurvx{kwzlkni^_nsmrnnq}ydrkdjpux{{k\\ok\UUknu}ux~{tsw{{rz~|wz~|ukggip}|wr{}row}|wtvwoYYdjiVcc\bioqsxrjrvj[MUhaQIGXVYlhzhivadjf`_chp|v{xswyqlwy~|{}{kbsyvvox|o~yyyzyvwymYcrcZMXsp~tccvnZfnopmz}ztyllgaWScgaetqadjpfcokkhdjrcUfkr~{x{ssz{zswuukjekolrm~rzyzdc]Y]OS]Wgwnz{pu}y|onznezqjjmqxynwzsly}~z|v^[Zpyu~ozy{}mmmemdPMZ[K`ggzxtxo~v]anbXX`[QTWcsxfhnwqstxtqmrxpoux{tgjlwlxotslgf~yz~mcfcvgbtrYg|s~hq~ysmnt~osdzureo{neYY\[cit|~w}~xvzz{oq||tqmRikq{jfomaWxefiorhbbT]skeicjhWx[fzvui}}sdljZTYe]oqw~gu^J\VVOP_t~xzffmedhtt{vpz~hWipec{su}lb}{lsw~xp{p^{wxjeWcxcXbTSXEjwkTWqzguyflr^xjwe_xn\`{qXaXQUY[oskxvhh\L_ybWX^\anu~{vxijsX`aSckksvuqvzzp[`oeYQPUVWY]bwrr|{rt~nv||e`gnqapwoy]cka}ww|x}{|k`]mthfkgp_Nrywpro~k]Zd_JPh`furt|{qf`hYI>JFKVeshpyx|ruvtbfe`cj~{|||aqUN|matspvnlwz{}wfimbUKNaoigobawivxtrsty|xvvdtznnlrs{w{tllpr}zmunsxrg^nze_rw~sm|||ymmdc[[NMbr~|TGfo_=@E>[Zlnx{\kr\gnp}vs~kafeo||ws`ngsn_]^ihjyxtacul|wcwuuz{xx[goaT^eaaxxx|uwr~y{sv~|polK\rc]ers{{xwbowvkkrrmgz~|glkxj[crw}mbe[`|usytnhX^|ivkml}¹}||tesvvufexxqthddixzzy|wnjw}mtjep}}y~tvo[vyw{}pysgmiWeXw|||c\]N`ujgu\aq|}vlshjIWRWld^awrgR\morlrqzmpmxusjmVbQ`qtkz~|snywg}|l|yw~v|r_]paomcvkfu^j`\U_|}rshwdpssgjyxxzyniggsh|m{u{oj[frp||lrdcXhvsz{~}~||ousue]qjk|r}mmqg_JT^YSXZFZRel~t{}ug^}izu{ymxyzknù~so}qnlkwnso~egfXlb`kdQhbJ_Y]WYhukvYgkk_mqu}l{lyuc_gR]hcjo{~peQ_]aykzw{trs{|xuajrfy|uz|us^sv[yrnv}tp\YR^mqo[hXV{ci||y{|tufvrgytklq{qpvh~{beist~pyqheixsx~z~mxsdno__pRTXVTP]_xu]gxMNVWMWaev|jvru}h`n_Yicgqyadi\uuox{vunei_p{}u~vstrww|qirly|~{honqi_`S`oiTSZ?cnVky}z{qqprzz|y{pmwz{ux~}xkptmod`\ckdpm{wwrbpcYaaN[_LW\da_lm^ywTX]__rv~pjot[WbPPbcjsymqunWbg`{}wy|{unvr}v|h`k\]nklq~x|krqpzz{ynpdj}x_[]Cjr]m{}ufowgbtkk~{tsgvxw}h~~gmv~pvh^khefnxtrxxglpbxmZd\`d^gmvtt^qr[XXZVirvpUhti[if[oyz{ytuw~~nxqqspw}}}}}yls^ecYo~uut{srsnkkdtt`UWPeokluf|m{}t}vf~x~z~o~|~t|ss|pun`qwpns|twu}rs{jjgbx]S^WZchlx|zwlb`bbw~^y|oX`_Tdpruzopwqt~rxx~{|~XtpbNYWSl|vvjkrzy}{}~tqf`bllljpx~_}o`okh}ysorrxspoxqwisf_quqn{yxxqqdpwU^^\]ilzqppbWNQQ_rup]zybV`TWlszvmw|~w|ywzxvyu}~}{nazcagZdy{}yyxzs}tvuyuxnwse^P_eadfoywqjqsix~n}yx~m~squ~x{l\gkhdnmmvqv|ygf`YmXZ_``hkx}j|k]VXYiwzko{i\^NM]goyxr`Ypzvywxz~{{wzt}{vfp|qb]YGP`jr}zursy|rtyxkluvTbyghkovxfw~tptmaowzztmsej}xdt~fein}}zv`NUXYZd`nzytqn`hmfcifjerz_uqUPOO\`ds{qi{oinhSN[bit~wim{{nx~vswsulz|wuqmkvpwpm{fdmeQSalv~~uzzz{||}xwjtvsfXczcVxodikp~w|v{lpx{z}skrjh{z{rjx~t{~sdpekr}y~u[Y\]\a]bssx|vmm`XddW^`cdd{~}qjZXV]d_rxzalvaKNV]eqp|}}xnflz}ytwmj{}q{x{wr|w||s|kvoP^l\KT`ks|ty{nk~mw}~}~~wsepgmnjmnv{vv~apr`gpuuwijmdksv|rslilr~htoWVX\\_Xdrpwradnh_fgknmwwx^TOOX__sywuWcqaKOZenyz}vpu}q{}vywuvn~z|tpsvn|}un}kQZldSXes{tz~xsabqentjjjpx~gnnp|ztzgyykz}yzzz}ymlls}rr|e_beefcbumriZihad`igus{kd]^drqx_]mlYS]gnvz|xsqs~wl~xyu|v{}zzztufOL^`RR_lv~s~{ngmr|ususx|tbav}ppzyqta{|q~rkjipz~icsud]`ccedhupogyommiqo~{tjb[\con~yp]Xjm^[bkqy|xt{|xw|y}|urvzu}~lzy_LI]bY\iv~}xjcbu}sttuy}vgg~z{wypj~lo~syu~zp~nlinvzhfywifhifgdrn{vdktgiaigqz|~vlb`blmyp^]li]]bhmsx}z|{}m{zys{v}ywys||qm|kTFJ[\Y`ktz|~pz~|}vif{ywy}~}{i`gvwtw{{wool^wzo|xpi|nklqy{|kcflha^]\Z[iimqiyuidliry|vu{h^YZ]]kv|{oaYY]^[^dkq{~~yvrqsntqs{wxplf`jjrvsyqeusXQNPX`djrxxpr~~~}zxnXmzwvwss}}zonmnv~}|zvprkajmtvmww}v\ovonpus{urlegjc]YWZfgj}xfp|g`gdkpsk~vjcab_jsz~kh_V[b``eju|zzyxz~~~poknhnmmv~zvog^egltrwvjkydTTMHR`ehnpvymgo~wx~lc|wryw}~u{tlokfp|{vqjjg\[m{oouz{m`v{vropop}womcW\c^WTT_eenzp|fkjiqs{{p{si`]Z\imyxpifZNUbcbgm{{|~ympminlpw}{{nf]ZbbjnmqlanqYTTMFSgoswy}om|xzfj~}xqqxw~}tsrtohrxrqk_c{vswkruwednltrooptwtqgZ_kkd_]ejftvtqcefeou}~|~uwnea`drx~toj_QUekklq{w||~{nnojpsv}wmgdlmpvqqjcumYVTOGOftwyz~}kqww}ox|{|zytommkek~wro\fy{xrrz{pskesurqtx{spmh^^lrleadibxvmjonwzmtpgcdht|~~rmibVUeqqqu}y~vqupv{}{ulgdjllrnkadufXUURLQgzqz~wp}rptyzqpqqmq{satz}soowy|qvb]lsssw{|vtsoecpytlhkkfqkinnytjstnklq}}~tpmg\Yguwvyyyqprow{~zypjiompsni_ns`XVWTORg{you|w~uw~xproosrnqysc_zxx~spvzvyv_^lvuuw~|vtppoi`]hrnhgjcpsnqpumgnrmijsy}|zuqnkcYWetxy~x~wssnquw{urxxndaeegkhe]^pdVUVVSQWlnxuwzvty|{}{}}xulsworuvtqt~vi^q~yy|rmqruumyj[`oyvty}|r|xrssog_]gpollhl}qmmjmtzxedmrmkrv|xysqme\VXgx{zwvuwzvsoiiijow~rotshab`dgec^WfiXVXXVTU^qzlhvrmvy|}zwzyurli{{nptutrpq{ug]cwyzyssuuw}zlvxfaft|xxxx}|yvon|opqng`XU^imjghw{utppuyodbkqnpqu|~}{tu|onkf_YUXh{y{sstw|xtlihfiov~xmgjjc^[\`_][SWg]SUWWVX\cttipypr|yz}||wvwuqmel}snsvwwwuu{tf`p~zuryutsv{~okxpcbdpyzywy|zwtluvqssoid]Z`msplo|y|vropuzogbjsuvw{{t}xqqmhb_\^k{vrqsv|~xqjhghkqyxnfgkieabdc`[S_hYUWXXZ]bhuskvulr{z~~|{xsmet|nnruwxzywzudauyvss|xwvzps|nfcbky~}|~{wpjx~qoppnkhc]_ltrkq~~{wsu{sibeqy{|}}wruqomifdbbh{ywuw{}wpmopsv{zodbikjfcdc^WRbdWUUWZ^dimvzuypv}x|~}ztkgxznoqvzji}yxtv}xwvy}owxiea_eu~yom}rrrtuutpifnxxnx}{xtv}vlddr}wwxurqonmlikz{xwx}}wqoqtvy|}sgckrqmhhf`UWibXWX[^djpswz|upu}|~vjn~vopsx|}|hq}twv}|{yr~uigdbeu|uiqvppqstttpidkvvo}z}wnedqzpzzsponmmnnlmzzwwywqprtvy~}yod^eopied_WN\eYUUX[`govx{zrrxy~|~wmet{onquz}~tm~|v}|{{{{|mtzkffebet}wmhy|poprsstspielwv|zx}yrkdes}sqrpnmkkloqqtvrpqu||}yojjkosx}~}{si^YcnmifaZPQc]RSVY]clu{}~{}rlqy{}}{~wodjzqknsw{{trrmxvx{r{|~zlkzrhiihehw|umclznhjlkjjjigccju{x|}ytoidgu{sjvoihfdcehnruxvolmot{t{~vlhgimrx||yyskaWU^ije_XOIW]OMQUX^fpx}}zyzzzmov~~{wywxpgcsvjkpux{~vmjmvy~yr}~~}vlcovifiihfht~wofduthhijihhhhgfekw|u~~~}uqnifiu~wnm}wigfecdglsx{{~qmkkns{xpvysjfeimsxzxy|vpi`XU\hlf^VLN^WMORW[bku}xssslqx}x{}y~yoeiyqimquy}~ujdi}|z~uq{|thfurgiklkjktwndixnfgiihhhijihehtzv}{vroljkuvkr}pgfecceiov{~|zrmlmpwwpsyvokkmqvyzv~zuoh`ZV[flh_TKS^RMORW]eoyzqsvru||v|~{oeoxnjmrw||nch~~vqv}tgkvmfgiklmmr~znepxmijlmnpqrrqojfr}vy~xusqppuvmx~qkjiijmqv|x{trrv|yoovxurqqsvyxt}xsnid__fnlcWO[`TRSW\clvrtyuv|}wrjwzonpuzrbf~~ysuujrxlggjnqssu}|ohvwljknpsuvvuurkcqxyzwvvvuv~up}{okjjkmpsx}v}wtuz{rouzzxvuvxyvv|wsokgb^ckkbTQ_[RQSX^foyqx{x{zy~onzumnqv}qamztuzmitqgegkosuutyyknyslkmortvwwvuslg|yy|xvvwxww}swvnkjjknqv{z{vtv{yplqxyvtsuvvr{}ytpmjgb^bji^SZaWRRUZajt}zp}{z}}vzox|qnpsx~xicu{ww{pelsjefimquwusx~skuvkhhijlnoqqrsqkq{z|xvuvxyww}xr|xkfdcceiov}}}vrqtz|umimuwtstvvst|vrnjfda]Z^dbWT_YONPUZblv}pr|{{}~|vy|~rr|tlmosw|xmdn}{xxwmbanjbcfjmqssrqu{xnpxmeeeeefgiloqsqr{{yusssuwwww{~uy|oeca``diqy~zspqty~wphejrussttspz}splhdb`^[Y\`^V]_SNORW]fpzunwwu}|xu~zz~{t||plnqtw{~yqhiw{|yyzqf]fmdaeilpsuusqrwtpxvhdccbbbegjnqrrz}}~vtsstwyzywy}{w~xic`^^_djs{y|ysqrv{{vogdisxwvvuqqwpmjfdba_\XX\ZYb[OMOSX_is}}stzrs~|vwzxzxyznmoqtx}~ypiq|x}~zyynb^kj``cgkosvvtqorqt}sgdccbcehknrttu~~{usrsux{|{wvxx|uhca_`chpx|x||wuuy~|wpidgrzzxvsotvqnkhggfd`[WXY`g\RPRV\doyw}}pp|}u{~xvvzqoqtx~|rlw|tx}|~rddoiaadimsx||ztonoztjgggiknprtuvtvzwvwz~{urtvkfdceint{}wz~|z{~~zuojjr|~|ytnxxtqomllkie^VSUdi\SRTX_hs}}qoz}uwpsyrprv|sq}svqdipfaaejou{~~|umglsliijmpsuvwxxt|~ywwy|{rlrtkgefhmry|uy|yupkjq{~yro~|vsqonnnnkg_UNVki\VUW]dnxqoyzwulvztsvyzpw{tvzjdnmb`bfkqw||tjcp~qkihiknprtvvuuzwvwz}ynhwqiecdglrywqu|~zwspkjpz~wpvvromkkkkjhd[PJ\lcYUUX^fpz}wop{x{nj}vssuy}zqqzwz~obfmc]^afkqvz||xodcxvmheddegjmpsuuvrqqsw{|tikvkea`adjrzzpmrz~~~{{xuqnjghoz|ustmjgdccdeec^UKPeh]XUWZ`ir{x}{qos||ulr}xuuuwz|}|zvpmzzz~~~|~tfbkg]\^bfkptwywriaj}{qjeb__`beinqtyxrpopsvz}~}wngqzphb_^`elt|unkqy~~}y||wuromjijp{{uzzojfcaaabcb`ZQKWeb\YXY]dlt{~xwvrrv}{rlx|xvuuwxyzxuqlq~}}}~{{~{ocgka[\_cglptwxvpgcpyuojea_^_bfjnruupoopsw{~|vmiuzuoic``chow~~unlpz|xyvtqonlkkoy~zwumhebaabccc`ZQO[a_^\[]ahpx~}w{vttx|rp|~}{yxy{|}|zvqmv~}}z{yoglk`\]adioswyzwqhhrtrqmieccdfimprvwsqrtw{~~wnnvusqlgdeglsyyrnpy|z{xvtsrqonou{zzwpligfgghhfc\ST]]]___afmu|{zxxz~tu}{{~~}|~zspz|zwolqka^^afkqvy{{xrilsporpmkjjkmoqsswzvtuwz}~worwqoqokijmqw}~xrrz{||ywvvvusporww}wqnljjjkkjhd\UZ^YZ`bcfkry}{|}~v{~wx~{sr{vsmptia^_chntx{}|xqkrtlmqrpnmnnoqrss{zvuvy|}uqxvmlppmlmosy~~xssyz~{yxwwwwuropsx~vqnkjjkkjigaYW_]VX_dfiou|~}}~~~zy|tw}|uowwpkltqe_^`diotxz{ytmowqhjpqomlllmoqru|vsstw{~~xquzqghmnlkmpu{zvrryzy}xvtsttuvuronr~xplhfefgggfc\W]cZSXagimrx~|z{{~~y|}yxrw~{wrmoxnfepvj`]^`chmruwwtnlvvidgmmjgffgjlor}|tpooqux{}|xrrzwhbejljjlqw||wtqoqx{w~}urpoopqsttronv}qjeb`_`abb`\WYc_TRYcilosx|~|xtzyy|yw~y|tqw~{yvsojjvzqf_ftre_]^adhlpstrokqypdadjkgdbcehknuwqnmnpswyzxtpv|qd`cilkknsy}}xusqprxyywqonmmoqsttrmm{xngb_]\]___]YW_f\SSZelprvz||xss~zxz~~ww{y|sqw~{xuqlhm}xma\hupe_^_adhlprrplmwynd`bikieddfiko{yspooqtvxwtqs{{pe`binooruy|}~zwusrrv~z~wrpoooprttsolo~{rjeb`___^]ZX\ef_XV[gpuwy{{zvty}|~{vy~|xux}xsnjjs~vlb_hqqkeccehknoppnnszzskeejonkhffhksyusstuvvutsw}|ulfejqsttvy|~~|ywuuz~yvutssssrpnlpzzsmifdba_][[_egc^\_gqx|~~||{wz~~~{|ysppw}ulfdhmonmkklnoqqqpoquyyuplknqrqnlklpx}zxxwwvutux{zvpkjlptvxz||yvuuw{~}zwutrqponmot{ytokheb`]\^befebbdkry~~zy}~zusuyyrlhgikmnoooppqqqpppsvxxuronnppponnpu}~{yxwutttuxxwtpmlmpsvy|}zwutuvy|}yvtrqoonopsx|}ytplheb`__adfgfefintz~{z||xuuw{zuokiijkmnpqrrrrrrqqsuwxwtrpnnnnnnnqu|~|zywvuuuuwxwurommnqtx|{xvuttuwz~}zvtqpoooqsvy}}yuqmifdbaabdfggghjnrx|~||~~{xvuw{~~zuqmkjjkmnprssttsssstuvwvuspnmlllmnqv|~|zyxwvuuvvwvurpnnnptx|~{xvutuvwy|}zwtrqppqsux{}~|yvrokifddcdfghijklosw{~}}~~}}~{ywvwz}{wspmlklmnoqsttutttuuvwwwvtrpnlkklnqv{~}{zyxxwwwwwwvtrqooprvz~|ywvuuvwxz}~{yvtrqqrsvx{}~}{xuroljhgffghijklmorvy}~}}}~~}~~|zxwwy{~{wspnmllmnprsuvvvvvvwxxxxwusqomllmosw}}|{zyyxxxxxxxwusrqpqsvz|zxvvvvwyz|~}{ywusrrstvy{}~~|zxurpmkjihiijklmnoqtwz}~~~~}~}{yxxy{~|xuronmlmnoqstuvvwwxxyyyyxwusqonnnpsw|}|{zyyyxxyyyxwvusrqrsvy}|ywvvvvwyz|}~}}{ywutssstvx{}~~}{ywtronlkkkklmnopqsux{~~~}{yxxy{}}zvsqommmnoqstuvwxxyyzz{zzxwusqpooqsw|~|{zyyyyyyyyyyxwutsrstvz}|zxwvvwxyz{|}||zywvttstuwy{}~~~}{yvtrpnmmlmmnoopqstwy|~~}~}{yxxy{~}yvsqonnnoprtuvwxyyz{{{{{zywusqpppruy}{zzyyyyzzzzzyxwutsstvx|}zywwwwxxyz{||{zyxvuttuvwy|}~|zxusqponnnnoopqrsuwy{~~~~~~}{yxxy{}}zwtrpooopqrtuvwxyzz{{{{{zywusqpppruy~}{zzyyyyzzzzyyxwvuttuwy|}zyxwwwxyyz{{{{zyxwvuvvwy{}~~|zxvtrqpoooppqrrsuvxz|~~}}~~}zyxxy{}~zxusqpppqrsuvwxyzz{||||{zywvtrqpqruy~}{zzzzzzz{{{zzyxwvuuvwz}|zyxwwxxyyz{{{zzyxwvvvwxz|~}{ywusrqqppqqrrstuwxz|~~}||}~}{yxxxz||ywtsqqqqrsuvwxyz{|||}}|{zywusrqqrtx|~|{zzzzzz{{{{zyxwvvuvwy|~|zyxxxxyyzzzzzzyxxwwwwxz{}~}{ywutsrrrrrsstuvwxz|~~}||}~}{yxxxz||ywusrqqrrtuvwxyz{||}}}|{zywvtsrrsux|~|{zzzzzzz{{{zzyxwwvwxz|~|zyyxxxyyzzzzzyyxwwvwwxz{}}{yxvussrrssstuvwxy{}~~}||}~~|zyxxy{~}{xvtsrrrstuvwxyz{||}}}}}|{yxvtsstux{~|{zzyyzzzz{{zzyxxwwwxy{~}{zyyyyyyzzzzzyyxwwwwwxy{}~~|zxwuttsssstuuvwxz{}}}}}~~~}{yxxy{}}{yvusrrrstuvxyyz{||}}}}}|{yxwuttuvy|~|{zzyyzzzzzzzzyyxxxxy{}~}{zyyyyyyyyyyyyxxwwwwxyz|}~|{ywvuttttuuvwwyz{}~~}||}~~~~|zyxyz|~~|zxvutssstuvwxyz{||}}}}}||zyxvuuuvx{~}|{zzzzzzz{{zzzyyxxxyz|}|zzyyyyzzzzzyyxxwwwwxyz|}}{zxwvuuuuuuvwxyz{}~~}|||}~~~|zyyyz|~|zxwuttttuvwxyz{||}}~~~}}|{yxwvuuvx{~}|{zzzzz{{{{{zzyyyyyz{}~|{zzyyyzzzzzzyyyxxwwxyz{}~}{zxwvvuuuvvwwxyz|}}|{{|}~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m25.bin b/applications/PoP/poc/res/music/m25.bin deleted file mode 100644 index 6559022..0000000 --- a/applications/PoP/poc/res/music/m25.bin +++ /dev/null @@ -1 +0,0 @@ -hzlpztpytncybxjehgl^{}d~tzmzm{}ztv~~]zsi{vrrtefzea}~yosthwx}wqzjcwgps`utxxe|Zyvfwyzlvts}zwvxtnleo{qvt{s]}y]s{zzi}ez~ykrtwlva{gpcuw|kefp~sfztr}k|~nxyakg~~vsruclubh|~y}q|un|{uq|rfyfnveizvsg|\y{pdtryusz~~xtvp{ick|r}ytxx_{y||atzz|nly{m}xu~hz`wni`|}csb}nsy`xr{m{yz|r|ttty_q{oswzphoxph|xx{zlkw}rusd|mvrkqszmeo|h}lhux|m{|x|nttifd~~uvsxevytzfuz||zvuw}pv|yl|drxm^~}vgve}oq|`{xxnywu~q{ptx^q{otwztl}jrrp~ywyr}lys|qhs}fxppvoivve|fovz~zoyvx|ed{qs]U|Vuzn`bVi||jj`qroywjggv{||w`z|thbulX{yF{~^ewrksrtoqzqtt\Jsevhp}]RWf}ihwxrj}w|swzpubxmiznuta|rr{yqh}soredxwrvtv|kuclqVsp{cLtrcqiee|{|lz~{|wpo~rimt`pPyynybgsxi~X~imt~qnfgkW`pz[v\v~`urx~|{sVwuwz{wixrY_xqx{wl~twrmn}vzbd{vqmg|kXsvvpv}rcz]wy^~Vbfw^}ht|~ty`tYly}|wx{tzmo|awz{wz}wb}ihbT~ygnysltrfofW~yjwvpyuvlZt{zy}woYxcr}inkizww`vjuizql_}lNxs}^sddjWww|nrzwmii{y_sexXqz]sxe\{lzhyx}p|k~|uqmpxwRr}yup~X\}wuhwZax}]myw|xibkrwp]pqvvsmqywzzvv{{w||erjo}lqcgRm}sqqaefxXnsgrxZkYtM`~t~hjzSndo~zeg\|tw~u~i}|LtxxrwWL|~dkmrnpujrekgl^rkkveS~j~{{cwaoyqc|Tsqy{l~sgr}nb|ekSIu}|d|op\{gW}ved>j|Q~n_tuzS^tX}puzVn}|{twycy~[b|n~ktbyrbdmugS`xdYj^mejsq{jjVWYjewjk{sztdutvS`HqjYaxyyuL`m~{ug}|gq`ces^rqnq_p{nFhhdtum]rgm}oolzxw|phfu{yw}l{`xzz|ngg|ixwxfnivxvmljv\ymp\|]|`cxoZt}l~nlaqw^qco}~_]y[ukvqw|q}ow{]wgsgw}ixsWnw|smshshds~se}}Qjhp~lfwwx\rsy{~onywtur~vzpnljvi|d^^ngtkgjl}z~pe]s~wvukuvpuQd]i{aryswttf}rknlwfzwwtpl線q~ql~βϴӾĪxɘиijt^baP]U642eB4UF~ogkjyu̬ȵvshΣ]agF^6HqspTQM[L?x|TsǾġ}gRn{~fLazcUlj^]I@Grimx[JMUSJbzvrmtau\vTxLZc&Wdyqz}}rȼqZ{VyXxlqfq}SI=OBNho}ncujmMui=YKgu֯rucacu\{whWHE9YSksɯȵǢlyerITwYEc`avtmO:.$RfeRaL]K=Y1>^?\_[EBV<|MBaRR4@QML6-YN.ccRnoou]cmxbpT^Vab8eZdMTZ2XYLechhysgfTblY;AWi\Xzx|m_a1IqLXWinny_^yk^nky˰ެܻȵlf[hx]jDGq\`iѼhsaPWL\.:Z]ORj7M=O`B\ZBgGXHfkIvV]M^qKnu_~q_Vbpv{zod~exslefSf_{_B[Yem~vk{om}zo{YpnY_7hNJgYga}|³ܱϵuĠѧsvZ]=/C-U\DZrSRZc/7]_RJhkOlZ>_RJ;;[>ZDKkDlkg`XgK^sdIJCR>)JJA.'1X`m{r}{rF\pwYPygdhkqefSfZCiUdj=i_mixga_k[K*D`UJS{q^jbszl~|UkRQ8@dPlǾ̸Ǧ¿༴x{a`bR[C(C@WQt|d|{^il]qNQhWV<^d@Y5R]RgS\U[h\~|quwnim}k`c|~mƺrl{vudM\GGZWiX[nWztx}rirpjfOeqa\ivxpvwmYzyst{r}nȳs}cuvq}{gzqT[bqbLaU{~o`dnxj[z}sukx[ZCfrOiFeqc~{ejt`|sdnmUr}nWCVxo|VYcnllei{}\i{uzg}bObrj]wqys|eL`lb\\gR_sW^nWF:ruc~atv|qk{ygYdLIi~ijǵþwkq\CZiLKSW=DR9GQ:&L-2H><=WVI3JWPhooga{}lpm|hawopfrry|tp`qqΫʾ~xpns{xhzvXlyY6ItPf^Oqejztmhͱҭs}}\g{ejnzkQ05+6KB5`WҲÛ}yxo}idu_@+VQ2K3M^R_fdPTc[omV>UtcEhz[Y_zv}ȭ}|ym~ynVIS:2L\cJZe]zurr{u|t~{jvnqm[uihiP\]ewqfZ~vuqm~{isytlW?KA*FbcTvuhyuzvf]^dga[XV^nkSalVXg\OV_gptof[TZk|ti`f|{spt||{ur{{~}}xh\fu{xd_elnjfd_VM@>SiYh{slktx`Wj[OcjZU^hryzskc_etsfZP]jlh`XQSZcloc[lxemli{~{~q`cormWJLSXXXXVOH>:J^NJme]v~vqoptwzpotre_agjgdabn}scwxfpujoxytrxwrxeciquwyytnf`hp}z}}}qfny}xeZ[`fiklhaWLL_n\asnvrtue[Y\\XUUZgo_Sik[etlcfpz|tmjprdftzyria^cjswnck|qh{fitwrkb]\\VJ<8EQXRDBIQUVWUOG=5>W^Pmwqoty}~xpeapxn~{xxxuqps~kvniyyjcflqspjc`co|zoeamy~{unikqx|vfeutbl}k]epvwsonmi_RIOZ^[K>=CILOPOKCF\nij|{oklpsuvupjjvx}{xttwopzhn{xjbbfgfd`_clvwoe^ajsvtqoptvsi\]ln\ZlkZS[cggec`[RICGPUTK?9:>CGIJGEEPdla_ysw}{yx{woup~{olnprqonqy{rq{{|}|vwwmkoty||zurw~{ru}|w{sorutplgbZQKMWcjiaXUVXZZWRLGJYhf]oy|~nuuopty|{z{vmmty{yvsrssnd\dspagxuhfox|}|zxrjb`fnrodXQOQTUUSNKMYhgY^uvhl|{{}xtrqsx}mn~~nm}zpllnonmnt}zsszwx|u|qs|~xphcfntuncZXZ^bddcabl}zuĻ}}x}{skdcipsodZTSUXYYVRPVdpk^f{ylpxw|}tnjiikqwypcgxxiixxokklljiimsxvmaWSW^cdcaabcaZTXhn`ZioaSPTVTPLF?81/5AKQPHBACFIJIE@@HXaZXo|~zrooprrpmkozyyvp~vkt~{pgdccbaadjqtqh_[^elpqqpookcYWbkbSYgeWPRX\]\YTNHCDJRVTLC<;=?CDDCEM[geYav{qp~}xyvuuuvx|zw{|}|z~}wst{{qkjlnpqpoowy{qkkpvy{|}~~|vpt~qw~nb`ab`]YTNIGKU`ghc[USSSSQNJJR`kjcnv~}}|uux}~|zxupg_amvmagwvjcflqssqnic__empng]VRRSTUUUW_jrlah{~spz~~||~{prvnwzsonmmoqv}zrorx~}unr~wkt|phinqrqnje_\^ekomf_ZYZ]_abchs{yzrruwwuqke`^aglnjaXRPPRSSSTZeprhbp|qr}ytuz|xuuvz~zoju|oo|xqmjgeefimni`UMJMSX[]^__^XSU`kfVT_bUE?=??><95214>IRVTMHDDDDDCCFO]jlgn||~zxzxqnnnoppqv~zryplv~{skgdcccfkpspja[Y\afijjheaZRT^faRP\c[OIJMOOMJFB@AFMRSOHB??@BEGIOYemiafy|v|{}~|yxwy|}|zvrnnrx~}wojhhijklnu|y~tkdcfkoqsttsokjq}ujmwvi\USRQOLHEDFLV_efb\WTRQPONOT^hjdct~~~{vogcfpvm`cpvnd`behiifc`^afmppkd^ZXWXXY[`istldl|xrwyszwpwyurqrsv{{tnkmquy{{zxsnijt|xkfpzvldbceedb_\Z[`fkmke^ZYY[\^afp{vy{~vqoppomiebacglnlg_YUSRRSTW]fmlc^gvypjoy{xx||spywpwztpnlkkmoniaXPJJLPRTVVUSOMR\ebVPYa]PD?<;9640//2:DLRSQMJHHGGGGJR[b`[_rƹ}z{zy{}~~|zxx{yurqqrsv{}x{}qqz~xrnkiijmqsrng_ZYZ]abbb`\WRQXbbXNP[`YPIGHIHGECBBEJPSTQLGDCDEGJOVahic^hxztw~|}y~{vttuuspnlmpuz}}xrmjhhhikov{t|}vnf`^`cfijkkigeirzzndenofZPKHGFDCBCFMU^dfea]YVTSRSU[cjkfeq|xrlggnuuj`cntofa_`aba`_^_bhmqqnida_^_`bgmuzxpltzzyv||rs||yvvwy{~~ytnjikmpqqpnjfdgowtiaeptne^\\\\[YXWY]bgkkhd`^^^`dgnv}|}v{}slihgfda^]^aeijid_ZWUUVWZ_fmpkccnz{smpx~yxy}{uwwrwysnkhggggd_XPIFFILORTSSPOPW`cZMJQVRF;521000026854444569>EMTY[YWUSRRRRUY_ehfbgvƾyw~xqnmmnmmllmpuz~~{xuttuwy}{y|wtrrrstusnhb^[[]^__][WSQRW^]TLMVZVOIGGGGGFEEGJOTXYWURPPQRUX]dkppkhp|zz}z|{tw~|uolkkkihfefimqssplifedefhlrx|ysouzz~ytqooooolhb]ZYZ]`cdeda_]^dif[RRXZSJC@??@ABCFIPW^ceea^[YXWXY\binokkt~yx|~sjjquphb_____^]]_bgmpqpmkihijlosy|xz{}zxvvwxzzxtniecdegggfc`\Z\bhf\VYad`YTRRSSSRQRTW]befeb`__`beinu|zy}z|wqu||vnhfedcb`^]_aeijjgc_]\\]^aekqsohhq{{uqsy{uw|}ysmhebaabba^YTPNOQTWYZYWTQQU[[SHDIMJB:6568:;=?CIPW]``]ZWUTTTVZ_gnqonv|st{~yrljijjjiiiknsx{|{xutttvwz~~x{}yusrqrstspke`]\\^__^\YURQU\^XNMTZYRLIHIIIIHHILQVZ\\ZXVVVX[^bhpvwrot|z{xru}~xqliiihgedcehlpqpmjgeddefimsyzvppz|y|~zupmkkkkkjfa\YXZ\_bccb_\Z[`dbWNNTUOGA>>>@ABDFJPW^cdc`][YXXXZ^cjnmjlw{qouyumfcbaaa`__`cglpqpmkiiijlosx|x~}~~{yxwxzzzwsmhdcdefffda^ZY\bfaXTZaa[UQPPQQQPOPSW\acba^\\\^`cflsy|xsv}}{su|~yrlihgfeca`acfjlkieb_^]^_adiorpignx{vqqw}z{~ysnjhffffeb^XTQQSVXZ[[ZWTSV\_YNHLQOH@:889:;;=@ELSY]_^[YWVVVWY\chkifjw»yw}}unjiiihgffgjnsvxwtrpopqrux}~~|~zxvuuvwwuqkfa__`aaa_]ZVSTY_^VOPW[XQLJJKKKJJJKOSX\]\ZXVWWY[^cipuupnt~~}{|zsu|~yrljiihgedcdfjmpomjgeccdegjouxvpmt~~xy~}||vqmkiiijjhe`\YYZ]_abb`^ZXX]a^SKKPRME?==>@ACDGKPW^bdca^[ZXXYZ^cjopmluzqqwyumgdccbba``adimprqnlkkklnquz~{}}~zxvvvwxxuqlgcaabcdcb_\XVX]b`XRU\_[TPOOOPPOOPQUZ_bcb`_^^`bdhlsz~}xw{y{vpsyztmhfeedcb``adgkllifcaaabceiotvsmmu~yux}ztvzzwqlhecbcddda]YUTUWZ\]]\ZVSRTYYQGCHLIB<99;=?ACEINT[`cb`]ZXWWXZ]bipsqpwþ}uu{}xpkhgggffeegjnsvwusqppqrtw{{~{wutstuutqlgb_^^_``_]ZVSSV\^XPNTZYSNKKKLLLKLMPTY]__]\[Z[]_bglsyyvsw|y{wqtz{vojhhggfdccdgjnoolifeddefimrwyupqz}y||x{~~ztokihghiihea]ZZ[]_aba`]YVVZ][QIINOKD?==?@BDEHLRX^bdb`][ZYYZ\_ekoolnxxw|~zrlhggfedcbceinpqpnljjjkmosx~{x~}~}zxvvvwxwuqkfcbbcddca^[XWY_b^URW]^XSOOOPPPOOPRV[_ab`^]]]^`cglrxzwrv~}vw}{uomllljihghjmprrpmjhggghjmqwywqou~|wx|~wx|~}ytpnlkklllifa]ZZ[\^__^\YVUW\^YPLOUUOIEDDEFFGHKNSY^aba_]\\\]_afkqrplpz}|{uqpoonmlklnquxyxusqpppqsv{}y}{z~}ywuttuvvtqlgca`aaba`^[XWX\a`YSTZ^\VRPPPPQPPQRUZ^acb`_^^^`beintxxsqw~xzytqppponmmnptwyywtrponopruy}}wuz}|xw{~~|xusqpqqrrpmhda``abcba_]ZYZ_b`XRSY]ZUPNNOPPQRSVY^cfggecbbbcegkpvyxtsyzzztqpoonmmmnpswyyxvtrqqqrtw{zx|}~|xw|~{xvtttuuutplgdbbbccba_][Z]bec\WY`ca\XVVVVVWWXZ^bfijihgffghknrw|~|xw~}x{zusrqqppooqswy{{yvtrqqrsuy}|ww}|{~z{xsuy|{yvsqqqqrrqnkfca``abba`][YZ^cc]VUZ_`\WTSSTUUVWY\`ehjjiggffgikosy||xuz||~yvtssrrrrsvy|}~}zxwvuvwy|{z~{|{vw{~}zxvuuuuuurnjfdbbcccba_]\]afga[Y^dea]YXXXYYYZ\^bfikkjihghikmquz}|xuyz}}xvuttssssuwz}~~}zxvuuvwy|}xy}|}{~xux}~|ywvuuvvvurnjgeeefffeca__afig`[\bfea\ZYZZ[[[]_bfjlmmkjijjkmptx{|yuv|}|{xvuttssstvy|~~}{ywvuvvx{~~yw{}{|~{|}ww{}zyxxxxxwurnkhgfgggfecbabfjlga^bhjgc_]]]]]^^`bfilnonlkkkkmorvz}|xux|}|ywvvuuuuvx{}~|zxwvvwy|~xw||z|}z{{vvy}~|zxwwwxwwuqnjhfffggfecbabfjkga^agigc`^]]]]^_`cfilnonmlkklmorvz|{wtv~~~~~{yxwwvvvwy|~~|zyxxy{}{x{||{z~xvy}~|zyxxyyxwtqmjhghhhhgedccfjmlfaagkkhda`````abcfimopponmlmnoruy|}zvuz}|~}zxxwwwwwx{}}{zyzz|zy}~||}z{}wvy}~|zyyyyyywtqnkiiiiiihgedehmomgbcimmjfcbbbbbcdfilorssrppopqrtx{~~|xw{|}}zxwwvvvwxz|~}{zyyz|~zy|~{{~~}~|yz~}wux|}{zyyyyyywuqnkjiiiiihgffgjnpnhdfkoolhfddddeegilortuttsrrrsuwz~|yy~|~}zyxxwwwxz|~}|{z{|~}yz}{|~}}~}zx{yuuy}~~|{zyyyyyxvsoljiiiiiihgffimppkedhnpnjgeddeefghknqsuutssrrstvy|~zx{}~|zyxxxxyz|}|||}~zz~~||~}}}}zy{zvvy}~~}|{zzzzzywtqnlkjjjjjihhhkorqlgfjoqpligfffgghjlortvvuttsstuwz}}yw{~|~|zyyyxyz{}}|||~}z{}{|~~}}~}zz}yvw{~~||{{{{{ywtqomlllllkjiiknrsqlhinrrpljhhhhhijlortvwwvuttuuwy|~~{xx~~~}}{zyyyyy{|~}||}~zy}{z|~~|||~~zy{|wvy}~}|||||{ywtqonmmmmllkjkmqttpkilqtspmkjiiijklnqtvwxwvuuuuvxz}}ywz~}}~~|{zzzzz|}~}}}~~zy}~{{|~}|||~}zy{|wvy|~}}||||{ywtqonmmmmmlkklnruuqkilqttqnlkjjjkkmoqtvwxxwvuuvwx{}}ywy}~~}{{zzz{|~~~~~{y||{|}~|||}~{yz~~yvx{~~}}}}}|zxvsqonnnnnmmllnquvtokkptutqnllkkllmoqtvxyyxwvvvwxz||xx|}}}~}{{{z{|}~~{z~|{|}}|||}}zy{~ywx{~~~}}}}|{xvsqpoooonnmmnosvwtolmquvurpnmmmmnoqsuwyzzzyxxxyz|~|yy}~}}}|{{zzz{|~~~~{z}|{{}~}|{|}~|zyz~}xvx{~~}}}}}|{yvtrppoooonnnoqtwxupmnrvwvsqonnnooqrtwyz{{{zyyyz{}|yz~~}~~}|{{{{|}}z{~{{|}}|{{|}~{yy|{wvy|~~~}}}}}{zwusqppoooonnnpsvxwrnmpuxwurpoooooprtvxz{|{{zzzz{}~zy|~~}~~||{{||~~{{|{{}~~}|{{|}~}{yy|{wwy|~~~~~}}|zxvtrqpppppoopqtwyxtonqvxxvtrppppqrsuwy{|||{{zz{|}}zy|}~}~~|||||}~}z{~{{|}~}|{{|}}zyz~zwxz}~~~~}|zxvtrrqqqqqppqsvyzwroptxyxvtrqqqqrstvxz||||{{{{|}~~{yz~~}~~}}||||}~~{z}|{{|}~~}|{{{|~~{yy|}ywy|~~~}|zxvtsrrrrqqqqsuxzzvrprvyzyvtsrrrrstvxz{|}}||{{{|}}zy{}}~~~}}||}}~}{{~|{{|}~~~}|{{{|~}{yz|}ywy|~~}|zxvtssrrrrqqrsvy{zvrprvyzywussrrssuvxz{|}}||{{|}~}zy{}}}~~~}}}}}~{z}}{{|}~~~~}|{{{|}~|zy{zxx{}~}{ywutssssrrrrsux{{yurruy{{ywutssstuvxz{}}}}}||||}|yz}~}}~}~~}}}}~~{{~}{{|}~~~~~}|{{{|}}{yz|~zxx{}~}{ywvutssssssstwy{|yursvz|{zwvutttuvwyz|}~~~}}}}~~|zz}}}~}}~}}}}~~{{~}{{|}}~~~}}|{{{|}~}{yy|~zxx{}~}{yxvutttsssstuxz||yusswz||zxwvuuuvwxz{}~~~~~~~|z{~}}~}~~}}}~~|{||{{|}}~~}}|{{{{|}~|zyz}|yxy|~~~|zywvuttttsstuwy|}{wtsuy||{yxvvuuvwxy{}~~~~~~}{z}~}~}~~~~~~}{{}{{{|}}~}}|{{{{|}~~|zyz}}yxy{~~}{yxvuutttttuvwz|}{xttvy|}|zywvvvwwxz{}~~~~}{z}}}}~}~~~~~|{|}{{||}~~}}|{{{{|~}{zz{|yxz}~|{yxvvuuuuuuuwy{}}zwtux{}}|zxwwwwwxy{|~~~{z{~}}}~~}~~~}{{~~|{{|}}}}}|{{{{|}~~|zzz}~zxy{~}|zyxwvvuuuuvwx{}~}yvtvy|~}|zyxwwxxyz| \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m26.bin b/applications/PoP/poc/res/music/m26.bin deleted file mode 100644 index ac75614..0000000 --- a/applications/PoP/poc/res/music/m26.bin +++ /dev/null @@ -1,3 +0,0 @@ -vmfa__bgmt||xvtuw{}~~|yutv~wqlmoszwh_m}trstvx{{jm|tmhb_`ciq{|gbrpuwrg`cqzijywxwxyyyxw{|t{omosvvussuy~fcobemuz~ur~jfowrfbo~~padzxx{xqtljnrttronprvy|h`yskpxvv{ooxzqegv~yx{~~{th^aw|{{vt||qkjmpqokihiknqsv{}xkbnyv|z{~x|}ogn}yttuurlc\_o~unoprywokjkmkgdbabdfhkosskch|~~ylkx~vsrrqkd\\i}ykiknt~wnhffggeb_^^_adgjnpleev~slt|usrple^\ex{||kdeipzyohedeeda^\\]_adhlnlfcozorxtrplf_\bs{ymbaelv{qiecddda^\[\^`cfjmmgbjsq||vspmga\_n{x~pc`cis}vmgeeeeb`]\\^`cgknnhbfztqz}wspmhb]^i}{w|sd`bgozzqjgffec`^\]^`cgkooiabuvpxxspmic]]fxzw{uf`afmw}umigfec`^]]^`cglooia`p~vqxxtqnjd_]duyv{ufabejs}xrmjigda_]]_afjorqi_]l}~vpxxtqnje`]bq~wv|ugbceipz|upljgda_^^`cfkpsri^[i}|vqwxtqnkfa^am}vu{ugbbdgmwysnkheb`__`cglqtsk_Ze}{~yrvzurolgb_`j||vtzwibbdfkt~|upmifca__`cglqtsl`Ybz}z{{ru{urolhc_`hw}wtyzkcaceir|xsokheb``acgkpttncZ^s~zztt|~xtpmid``es~wtw~od`adhoy{uqmjfdbabcgkostoe[[lzy~wsyzuqmjea_cnytu}sf`_bfmw~xsokhecbbcfinrsph]Ye~{y|}tv~xsokfb_ajz{utyyj`]_dku{uqnjgeccdfimprqk`Y_t{xzwtz{uqlhc``gt}xtv~pc]]ahr}}wsoligeddegjnppld[[j|yz}tv~ysnid`_co{vuyyi^Z]do{zuqnligedegiloomf^Zbw}yyyty~wqkfa_ajy~xtu|qbYY_kw}xspnkigfffhjmnmib\^m~zy}uu|ztmgb_`gt{vtxxh\W[eszuromjigfghjlmmjd^]g|{y|ytx~wpjd__do|wtv}}n`WXan||wsqnljhgghiklmkf`]cs|y{~vv}zrlea_blz}xtuzsdYW]ixyurpmkihghijllkfa]`m|yzxuz}zwuux|~}{yz|taRLQ\ky|{|}zvpiiilpsvtpeVHAOtrj}|~~r}j]QGGUnmtffknle^]ft}wykecaabfmu}w_GQ~rmvw|{y{vqjxrhc``ah{}xnnswvoe^\aotf|o``dhknrttttsodSI\~xuq{zvw{nfaZVYbpmrwot}tkhkrwvpr}udVXejfbbdec[OGRr~~|vwy|p^`}zzyzz}z~yihwzj\UTUXZ^i|vnfdnzwibdbXQXk|ztsv|zp|vnrrabjjedjt|}wu}}yz~wdVX^aahwxmd[TOMNSYbih\NNaxtrwjbfy{pfeq||wy|uxwld_^_a`^\^_ZOOb}|woe_eu{y~|pdbovkaXROOS]jw~yqtyslfdk~rjptoga__^]ZWXbt~{uwxogbbgp{rekss|}xqjbZTPPYnvkeirth\X[ZURXcjhfiouwwvw|tu~wux|yphddfilotzqq|p_WUQMQas|yri`YUSSW\beaVOVk}~vszwoowzqc^cjlnuxne_]^cjprl_NIVp~zungenslw~{xw~~y}}uor{{umfa]\^aeiic]czvi`bp~rtzztleb^[WTU`s|xx{{vwvuy|tmihjow{qt|xuvz}{urpmf\UUavumlsytfXTSSS[hsslc\Z\dmv}~rkv~y~{rkfb^\^j}vu}qe_[VV]jstqlhd_\[[^adcZNJXt}{zwuv|vw~yhZUW]hy{tnifeehlpneXR`{~wohekzyigr~ysos~yonpvyqljhgggijje[RXszspu{qrz{tle_XSQXh|{unjmyzokmtyurppruy{xpkuxqnt~|tmhc_`gv|wqpu{xiYOMQ[hsvrke`\ZZ]dnw~~wlhww|{skd]Z^lz{~m^XZakuzwqkgecbbabced_VMOd~{vqopyyw|ygZUW`n|~yuqnlklmnle\Wazzslimysjksyywvvuspr|}nffnzxqljjkmonjaWUfztu}~pmt}|ume^XVZgx}wpkimv}zqhfjq}}zwvuvxyxsjem~vrs~{slfaaiy|upnpw}{n]ROS[gsxupid`]\\^bgmolggvxqjd`bl}}oaZZ_jw{rjda``behigaVOSh~wrmmt{{vg]Z\alw}yvsrqqqstsndZYg{unknzqmqxzwqmihhjo{wkeeirytpoprsqj_Y^r{uu||qqw{{wrmgb][_kz|unlovzui^Z]clw~{yy{}~}wmddryuv~||vpjfflz|smmryzqdZUUW\fqxxtnidbabdghf`ZYd{~xsnifhqzz~xjb__ahs}{slfcbcfhid\ST_ufkrwvznnx|ozfVBGTFVbfxzwqcbUcxz~r}iqccq}mlwv|hqnjnghcrqw}r``\kt~vjrtWTA9Vuz~ll[byuhLT\Xclz~ysew||dbkWWUQlk`pnfhbi^cpoýwhywvh}ukpp|v}rk~zpiX_U?:4@GWtrt}sxtV38c~~åre}lbHPWNU`t|tofJNxujXLZWLNKUPSYKXbga^N]{~|r}yih`ssZL?EJVsw{Q?\~vf}~tso{xyTZw^\GNTFCHYs|[No~wl_liZZVbcjs`\sžwohgUZnqx}zzr~}lwoYTGZf\TFBCHbgniUjuSds|ţugmo[_eTKHNdsuK3H}id^Q^]MJEOT_qe^kgx°uxuccsqr{l{rhS_ibd`^ZSeeg`J^qA<=Ny|pvtxotgmvh[UTbkgCIzmjk`npa\V\`h}vq~uuz̷}lsm[Vd^X`ix~gSa{t^dkbcgnslvoioVg[K=:^ygg[cqgYRKSSm~}mD>fwYT\Vioc`]bgl}z}λx}kdpk`cg}nOR~fgk]XZbnmyn]kvbESWF6';O_y̭}tch{wmh`d_p{|]StZNUQfrieaehj{wsskg¶k{vn`Vb_SSTepzTO~zz~odcgvzrw|rS]iWJ5>DHaxrn|lURdd]]X\VaicvfceOSMbtpporxx|yjuĞ{pdnk^^[gm|QCi}kuknueVQQ^d{~nprnz~vW_o^VCGF>Lcqiùj`mmgjgmfnsgp}abdDB7GZZ]`djjzukzuaaxxrhtsed`ilyúaRtzcpnwyia]fj}x~`fl[WEHE42?^|^Ryobljchirnu{mpimwRL>HXWZbituytmxyxsitrc_[ack}|\LkiISUbxuibZ`bwnvwbbSYXD98JigWw}puodefqpw~nlzzuWZuND27FCBKVgm{yvvƗ}tpidilrſo_|vNNMZtyrnefcs}xv}clpTSGOSA2(+?YmZw|plkv{}]_eZD@KGCGOblvghWX˜ufqwj`XZ^cusrpeZQHMhttxuxqz{}gtf_PXaUF;49DliVopinomd^div|~\T~icQJQICGJZexnN@fȪvzvqifgj}}zqgeUG@Q\`imuru{rz|ox~vzhT_meQR^YQJBA>TiǾu^rznmkyooqyq_}mj\VZN@?BOUmzoI(5tz{|pklmml{|zŶyim[MVXWdpzoTWxud`cZUVRRIQUVx®vT]p`_Xhwwxsqps{qomfcmfUNIS[og=5]}x|sos||yx]nqaNQNCFQhw|{mTQy|ppwk\[^fcjg[eǶrtziTN=?_]fstž~zmX`^WHY{{prd{pw~oxpo_6?m{zttrrgq{ȗc_^JIC@Ws|~dSEcyYWiWRBOtox{q]c|nS]mzdbVX|ŒoT_h`kd\fk}xĴxeUFVh_[`Y|ump}pH=]|ySamu`sckUQTgyuautƔrxtp\HQblyŷxaLW=Di}{fIZzwww|``sr|osvIJunsrtpzjlejVDDO[»a]g7Oo}bxtgZpiV^hpgof`]naYPJ@S[`sǭfkUA-;:DkskDRxsxzss~wUZfdKQ[domnv{x}i[QSP@'#);XòyZ\_NYnffox{k\tslu|sdc]cw|qyrZGdbmgkdT_e|f_KDDAM\h}itZNNQHZecyrxKhu\gnww{}{wbwufRapߴr}tiXT`ie|Zmr|wzmWXhnZdpSD8TJEZvx\90+4HsýL]rbbawqmu|}eG[ssp|w_Vcs{~xe|ffRNU\YVM]i˴syjLLzʬzhkP@^VNczulVqcjohlsbopjyobXjutV`zq~fjpm]bcI;>]Sk}R{__RSSiej}~{a}joRev~otv[WWcpqieviiYoy__kWsged]t~|jTtik^NQZaPk»uTC]g_uy}rv|x{nmjfspZ^~k\~`hpoo^pe[m}[_dR1.;TnrdaGkipwjTfmum}iqbWSHdmory}{ykkmfTJ7:P{~T_qg`LRwtw~|oJeqjf~q`_ZZpmbmP\di`hXT`zΰry}[GAPMJ\i\]ssjnv}}|wxNXfr{msl^iqb`m_NEIlhppgpeaLR_t}~tdo[\p[\qpS9?|tmjmujfw{yqp\Y}omroz[EtpXhgMPdid˸uOmsM@Mmui|pp~v\mldYhy||^ShyogcxjlsNkiMH73;coP>fyvvinoog]y|{vmux[dQKSqus|̱{WirkOLB5J_ɨ~bqsKZPPfz}j{}r\YqoZjtcccgo~yVZwRVpnp]fZ_pýqz{lZKC@UEXzypiQ^`ka_oqykL|qXe~xhylWfoƏppitcaQJNikq~kl}r]YROZh}oobNV[SPn~rg@-\poopvtphiqwje}vlei|nbthxzjMn}kbjiMRW^fvɰbhzc44Bt}ztv~x^bpniidkbbl|qojYbmzsjfon_ov|oizcHI=-;Z_?Mx]lkmaegjey~zjVfuyt`]SSbj~ǚrWcxfUCB;@Usp^LKYR^nqim|dVl^b``o{ubljvumVPw{aVl}xggh]j}zyd[TA?LPTuomfZZXYXdYgog{w\UWvqxxoeUVaxrlvpob_TX[tvuY|krkSXTZjszthqlRTUNNYy}YCBhlujqr}z}pqwwdmwcllhb|wkxwYfqssoifhS[glnűjeuVD(4Fm|opcGTvajoW[|tw|yx~UhrVSrcaomczuebo\RZR84>JɫoBl|]ZTUmx\gsjnzr`Cnug}}y_Shqr|wrnШ~YW^Qeh_S_Vʺ`xgKD8QQJ^y}xSOVU\py~t}e^lowufpk}p\c`q}pVJ7Kq_oiuzb^NBXRdw^ixfZgT_nH,Ku^k}}m[azgwtZcvrf]Zko|XV{rUbk_[gcclXwnKHLe|ykvok\iyfqg^`z~}~u~dVaheZ\xv{|~Wns]I4<=R`Odut|poc^Oblasyq}ybLdq|ucl~kgcL\y~bXB:Nbbhss_zv]P\XPWtmzpr]TKNav}qcE:Gpyjy}qh^Lauv||omxseszmO^iahom|lcrXPQGY}kXO`^TMiolp{syrgjsbff\o{qrv{x~wfy~hepg_i\kk\y`=>BZlrtr{unkrxrn}|qkigroohp|yaqhek[cmvu{rbUx{UC6Nuwl`gZPsynihpmon|ry~}ypgaonlltyxihfaS@:@ijEFp~d^h}ttqrxiWTevrjcmuyybX\jgg\QUoſyo~lK@UONZsobyulacqtz~{ei|ran}}ieiz{|fGAMY\hxyb`w]RMQZsxedseVns]WEUuwvy{{b\`lsujuntxq^XVXjxb[uxohd_\feNRoaWl|uvlttpo|t|pkcghj||nulx}optiiovlqpr}rbriTE=7Sut[NKRwyy}vnhhp~vtqzjx}nc[_slupgjWNM<:R{{e[hkhUH_lsw~y}zx[Jatotok`o}}iZ}u_glb_fRP^{xzmF@IJDXd}vnzphc^nfew\Yys|kv{|xiW^fwufHBLNZcs|o^nPR^X\gnqribNPatz|bJ:3c}zyvsaWcanwv~ygyslmlzn[Ufgjzwi`uwng^\NKatzm\SjcCAh|urhjq^dulneaelg{ts{~}|vlszrqejjb\soj|U?A-/NtygMARptniclh`ryz~{veZpngb]r~yysvzu\jiVDF63KlqayrbRJNfrqvjoz~w|YZzysh_x}uked|}k`PUvZcod_ZUKUgr{eJCE@N^r}~yorfcTX^b]n}}}qafr^cn{tn|xgYRPa÷~~xyjTGJLZr|wkfs~pZZVVdjoz}~cZSGT_s^E46_{{w~pecagwkxkdhdq{kggfz~qhvrtjb]ZNYev~k_iyn]:.HxvdbjiSj|jgm^afep{zz~wguonwvqwqmvpknvz~tdKF9(:[pJ=bwipp|tkirln{zpk`Wr}ztvohu{}yxlooYbaWPNAG]ywVOPVS]f|mdnchgcrw}taV[ygdqmpnc]fivnSHMQ\cm}gdqs`aVYakj{~ho|eZ_s}ncXMDizpuwmab`mwwjd~|q{~reh`bpywbj{qdb[Ycj~tnRI[ka`s|tnvspz}kdfliqu}}w~{snhkikky~qYf}eZGBAUrs^PMY{uqkblu}|wyspeuyidkyyzz}}f]]VWQHITpô|sgqnfZZft||{x~lSYytw~snxq_uv^]^bhlb__m{x_NGMTamws{|b[_jgozad~v|wqqvzga^pyv|}iVNSfmy{rh|ocXR]ht}sizxqig_k|u\B6Uxvrhbs{y}m~shg{}vjhcixxeowlkjkijjnylfbevhPHZswgksc^c|ypoljg|~xu~}pjspomjw{{zy|jzlZN:=IcsSHVnxyy{sr{vs|y|xsjaby~rciow{y{}_ikdZSDGQ`}vlZSSZbvr~yX[m{vq}{vox}zjV]xbiqnpc\Z[^tZTLGUYd{~msk]Scjmox~wmxslhn{xvebUM[zqc[SP_jmse|~yi^UTanq~zvsraUV[_xvYL9=dxtfbktn||v|trkiw|pl_cq~rlp}znpbYZ_d|zlkjuqX99Nmscf_WUl|trkhpim{wr~~mpsirov}tyuiokoq^QC41@XeIPgurglxpqrnqxx{qsm^f|{uhelqzzqejrvjhh_\J@@EVt]RHTS]t}|~nbttieknrxqqv}kZJbujkopeVWSTkr]SKGOX_{|snl|~nfa`b^lov}pvfTY^qz|d[R=@XǴ~gaYSZfk~qopsuzpngadkjvunwvqfVNRVe|tYCHPZ^m~uehhkq{zejjdkuy}~qw|{uq{nmp_\`al_goW@08Dmk\RGTx{rvoegnju{xurjcqflywz{|swrq{vp`XOA66=Zt][ogcefps|{xv~thZi}rut|simx|q`YZzmec]`WOMMV~gQFDW]fzsr|}fhhhhns}r^bq~tn~ztrvsgcVQ^zxk\NHYkol`e{rh]_jkv{rwtbZ[Tj}{l^J18b~}{j`ev{~}rzlcl|}{rmox}si|qog`]aak{kZQZm]OLZurkmpfbhsegddj{{vsxouzztqvrruywvr`SF:?IcpUHVu~yvnmut}rg_nxmlo~|zl`XVSOILTcȵswq^ZY\f~hjxxpntu}~wgY^{teachdeacfv|k\RNX\j}whmo^`bhmu~yiesxkn|~xuyvplaYR]tǭz{uvlc^dnuk_v{ysja_iq~xss}sd_bddu{xp_SBIbs}rouuvwspknx|ytqx}sswphldcirr|z`W\s{kODDX{vj]XVh{tkirqswyy|ymosrnsuspwxt~}i`\TG?@Nx|\VdwzmlxuwurxsaTayrqqqywrjpm_Z\cYTOKVwylUO[W\p~tjuxqefrty|}qbYoveamtnecVYkraOPX\bx{ojq][ZY_rw~~rfyrc[`w~r~|mcPBFUyo^_dio~zvty}zztn]]`ak|tor|xvh^YT\n}|n\JIYc`pvpohmqqrux~sqlqrv}|pkroy|w{xoprndd]evpcpqQC:Mpüv]U_rwruzxy|~}kcm}{vvvw~xrk`gpc[ZTSMJTl¾oYR\^fuz|yw~tqqpt{~m_Zly}ojihdaVW`uyjXSZekzzreassnijksv}znwvjb_mzvqibSEBJp}{lfhpv~{qr~xu{}|srqqt|rlz{sia_]`k|raUHJWbag|xsnrqpurninqw{}~z}xqnmhjgnwfboxnYNEEKg{jYR^r{tqlow~|tpgem{sry||{z{wsu{{we^XLJHDLcsquysnejw}~|z~x}sa_qtx}{vxzoie]fk]_[XXXQVc|w_YVZcpzzw{xjbchgq{pdYj|~x}xilkijd[UYc~sb]Z`mt}urq|yhc`[bfnx}{syylcZ^fu~xvqo`M@;Pumiiuy|sotzuyxmghflqw~tqzvieb_Y\gtvg`[\ahXO[t~pjjg_iz~xxrrssx}zuuuut}|ux{{zurlinkfgoxwptnVH?9H_|y`SYm~|zrnqwtv}}zqj_[h{tooyy}~{y}tpkmt}}pchaVKD>GYt{n_[`ipwws|yi^p~|ysryy{vrunaTTmndijd^SPPXhsbZTR\erwtqne^dimpx~yrnq|}mhip|vuzvqdWQJJ[zwj`[Ybnwvpvxmc`_eot|zut~m`VT\cu{qaH?>Okxmghppx~zw~xuqmtztqllr}|ko|zple][bgvqceoshV@>Qlxf\WT\|~ztmsqqvy|~}wvmpzotuwz~zyxonopsp^PG:5BYznX[nvqps{~~y}~vkgfr{tpknw|wsi_^lxif^YSLDGVnhYQTZes{wsoq}|utrtz{}|zy|g^_mzuqokkcYQSZq{eWRR]gvrdgwxqpkmrw|wt|i`^guxvl\K<7Es{lc_fovyulsusqttv}rhg~zqkc^_duseYJMVYVatvjdigjt}sliflx}vtw~zvvtqlnovplxr\L>;D[xzbNJVo~ussst}xpqw}vnow{vtow~rg^RJC>FVrƽwrrrlfbiw}ymjz{z{wwtvxk`VZx}njc^XUNPWjzbWQVaq{sjemystwtuz{ocjwzrpwzsmhbZQPRdzƶxi^X\iv{kel{uplsx}~~|w~rg^]]i}}qi\L=4Bg}rjfqyzqkly~{{x}}uqxxpgb^`dkp]RS[bVMQe~qgghcj|zolkkn}}}wonx~xrrmjknp}~xiWLB;DUq}dTWk~}zsswv}wkbg{zw|~zrojimxibYRLEBJWn~|rgehnyunz|uopsvxi^RTk{jd`]ZQQSZgvib\]gl{|xuts|mdechmr{xmdjttlllv{pmkf[USLP`{vqjeemtwqjszpgdfhlvy~~|ufYVZak~qncTFCEYs|rpqtx{yz}|zxy~zoopqsz{}~w|yohdZZ^dmzc\^fldTIN]zwme^bn|wqpsxw~}wwomjhhwz|yspmhfjip{~rbYOEADQl~memw~|wy}{turu{~og_`o{wz}~zuqmfbei{yja]ZWLJIPeob`eeny}~~~~uwwogkruz|}qi`Z`u}rgehf^VTQZnuh^^bgn~zwu}sgdaafrx~vpp~yjaagwzqtsi[RE@Mi~vigimr}}vv~}vrhfhhmy~sr}vqh^[[apxpm`RLSZafu|roiikor}{ztux{}}wrusu|}y}|upqpgfdgrpfsyiUGBGUspbWVh}zyyz}xslllp|{ttvw}{z|~ztrmotzypd\PFCDMd|w{znigjt~uhdg{~~zttx|zqd\\g~slhc`VSQQ[t{hZU[`l}zmku{qstux{ulirz}vsz|vsph`[PMSew~qc[_fn~qr|ysmjnuy|xustxkgdal{|tk\P@8Hgwkfjmuxomrsvttx~{qjq{wpjhihl|rdZ\egXNN\sug_\Zbv|ztont{~yyyvz~}|}wvvtqx~pcVI?@KblWSas{zzz~yplsxrorw|tlfgm~ymb^WOGGM^zo_\_fu~zvwsmm||}{zz{wl^Ydw~slif^WQQWjtcWU]dt|ne`o|uuuz~vovwneht|vrg\RFAFZȻ{od_dlwvuyxwyywuvz}squyka]]_oxl\I>=K^mskhkpz|sljmt||uos|vtjdcdfqtebgkcTFDKbyi\SXfzrqnqs{~|xqjq|~~}vonjkow}i[OD=Mlyogjmt}wrvyqqnknsw{y|th[UQS`qvk_PFBN]emwtqossu{|spqw{~{xstsssqpt~smf`[XXes~lemtnZJEEOeynb\ey~ysqpov}xphb^gvzxrmicaemtocXMCBCI]w|tzzurx|||zxxzyxiem{~xrx}~{}~~uodZVW`xuf^\TOLMNZnvhdchpy~{y}wledgir|{mb[\lvwx~~sihc^ZUPPZh~ujfejs{~vqs||nhebdiowzyype_\akxyqlc\OC?Idzrpnuz|{uy|||snnkmrv}zu{vld_^\_ju~n`XW^baYVax~sjggeo}zxxzz|yvssprsty~~xtpkkjihntzy{|uiXLFCMc|zi_ew~|~zqgbbm}zwz~}}yxxsmkjir|zic`YPLIK[qsjgfnx}snmw|{}|~~zxnb\`n|oghfa[WRXctwhb`ciwtnqyqlloy|}tkmxyqlt{xusme\RJIOeumiinv{}ywpnnnu~|sop}yojefkv{ti]OGIVco|tlklpu}}xtruxywyx|~xy|ywvqommqwqgfmqi]QLO`wtcWW`w}z{wy}y{zxv}yutz{|~~{yuvuw}qf[RLGIUmzpnorqqx|~~|vngl|yvtw~yrkd^g}ule`YVPNTe|{g^^alz}rljkw}~~ujdjvyz~wqkfaZQOUcuwg^]clzvmoy|vvvx{~~||zx{yogcjt|sjaUE;=Pttkfhnwvqruvux{|wols{qkfbbgsyk\TNQTVXeztjcefkx{spmpx|~~wtw}xtplghjruuxugUIACPhp^SWh{zwvuv~}wrnu|yv{}zrkgffnv~~peYLE@@Ma~zywtolmw~{z|~}{sryzyyxwwx{naXRUhwlf\TLHFN\urd^\dp~{tolqxsrqpswz~~wlb`illmr}vof^VLGFM^xļ}pf``huzqmszvqnporvz~pbXTYarvk`TC97Ba{skhlw}{vu{}ywuvtuyyz{xsw{mc[TRW`pq`WSTWVPUf}~sihikp~wqqqt|~|wqmmhiryohc\Z[bn|ylZJ@=CUl|l_ao{xvsuwz|tkbcp~zsnf_[Y_jwug_SJB?CQd}voqu{~}}~~|vx}vpnorv}yocWON\vuic\UNHJQ]owmhfiqx}wtsx{pgfeimry{phfkokfinyvnhaZOJIJTjzsollsz}trt{tmihjlsw}}nbXUZcm~xkbVI?DObw}vrsuw|}|~}{|}vsrrquvw{|z|zpgb[Y]em{tc]afd^UNTcyylebhx|wv{|~yuojfgjz~zuolhdfims~}qbVOIFIVj~upw~~qhdgu~}xtlhe`_fwqe_XURONUawznginu~zuvy}vrrtzwnd\_iw{pjeb`[WTV_rwnghou{ut|}uokmpv~}xqms}}vmkkr~xpie\QGAG`{sosvz{|{wtrqsw|}vrxzsnkhhkp}}naXRQY_`do~~snlgir}yvy}}}|zy{{|||xtqrrqpst{umpvvl^TLNWi~{h]_l{~ztojkuywx{|}{|}zwtrpsuy}qh`XRMMUbvyqmpx~{uphhq~|{}xnf_`mxpkfa\XTW]j~vjbbhr}tkirxwy}|tolmw}}ywy}xrlf^WQNO]qzphfkr~yz}yusqry~ztqrwxnihhnywmcTH@BRk|qklou~}tprsvvwyupq||vpjgiimy{k`]_caWQUdysf^[^m~ytrvy}~}~}|wu{~}zwqnmlls|yk]QGBHVn{h_bny{zz}~yurnq|~yvx|~wpjb^_erwlaYOGDHSh|oefjs~zvssppx}{yyzxy}{pdZT[k{xogaXNJIO^t~oc^`hq{smkrzusruvwz~~yqpuunfccnzxqi^PGA>H\|¿~tidekt|z~}}yvuttwzy|}{y{wg[UUYdtrhXH>>GZluljinv~{urtw}||zxyxutspqvwneZVUYcrykgfe`SIFOa}zlc]_n|wtssw{zsoigkw|ulc^[Zaiup^QE==DUqtllsz~|zxz|~vpms|}yxyx|ukaYRQWd}ug]TJBBDQg}nhkqw|{yww{vnmmnrwzte[ST_lv{ne^VMHGJYmtiehnv}uopuwrliinouz|wvxsg^Z]hx{oh^RG?8>Oj}unlnu|}yx{|zwvutuuutts{|nc[USXan~o`XVWVTRWg}~sjefltxutuy|wrljilv|sjc]Z[ahuxj[MEBFUj|pggr}zzz|}unkmvvng_[YZ`onbXNGDEN`u~vstx|yxyxxz}yvuxz}{oeYRT_oujbYRMKMVdvwnlms{zsmoy~wsrtuz~~tllppokiluwmcZQJDDK\x~vrqtz~~}{xuvwz}|}vkd``enypbTJCDN\jy{vrsuy~~{zz~{yyyyyxx{wpjedchnwzldbdb\VSV_q|qgdkx~}~}{tpllq}{vrnkijmpu|se\SNMOWfzzz|~}{unlqz}wrlfb`afv{nd\WSSRV`pwqqu}{tqrx{xyz~|sic^alv|vmf`[XVSV]j{wqpt{}zzyurruz|wsruzzurnmov~vmd]UMGFQgytux|}||yvuttw{}z|xqkihilr{vh]UTU[^`fs|smlkoz~z{}|{ywuvvxz{|~ytpnlkknqw{urssndZSPTarwkglw~|xsnjio{}zvtrnkihiou}wnf]UPMPZj~ytsx~zvrnkpxzuph`\\fu~tnhaZTPPV`rulhlqzzurvzuuwz||uokjmqqqqt{|vpiaXOKJO]svnilqx~ytqprux}~|||~sia`bgq|~ukaTHCEQg~~tmlnrx}}xxxwvttvxy|~}}{wvz}skc^\^cmy}qhc`_\WSXdvvkebfq~ywxz{{yxxvtsrrw~}vohb_]`gpy}o_RHDHUhsjkqz}z{{}{xsqoov}|~wof_YVX`m~sh\RHDEN^uzqlot|zxusttx{yxwxz{~zncZTV`o{vmdZPHFISdx}qifipxysru}zvtsuvvx{}xsrrnfaaeozvmbVJB?BPhvnijov~}|{xwvuwyxy{{yz{rf[VW\fs|ocUHBEN\mwnkjnt|yuux{~}}{yxwurqqt|yog^YX[bn{{plje\SKJScy{md`dq|yvvy}~ztomns}~wpg`\[]dmvtcUKCBGUj{tsvy|{yyy|}{vtuz|||~yod[URVbu}qeYQIEGO]sumkqy}vqmnu|xwxy{~wla[]ckqw{pe[SKHHN[ntmjmv~vqt{}zyxyz}~||~}xogbcfp}zm`UI@MbþyZn{gqpyuww~|geztqs~tpllhrjjuw~qz~VRFJG<:CTlmYyqjqs~yvxv|}dnttow}tplkhpflsv~nqUREKD<=J[vc\morx~zwxw|~zdwquoy|tnliipemrw}nhVOEKA<@Pb~\`jrs}zwwwyudpsn|{snmhlncnpv}xp`UKEH>=CVktUhkvu~yvtwvogzopqztomiojcmnv}ruZTFEF=>I]s¾jTrzoxx~xvrx|tkksootytnmiofdlnx}o}yVQBEC;?Oc|aV{vsz}|vtqywuernpmvwsominbdkow}opSK>D>:CVkwY\ux}{tspxtxydzlqm{wsqlkm`fjoxqfPFKcy»~jSky}vrnpwqogxlnp{xrpjng`jjt{vwVL<;>9@Qj{dVu~|uqlrvrljsons{wrpjoecjlv}s{uRH8<;9CWox_X}|spltstiopplv~yuqokpdglpyrlOD5<9:F]u¼u[\zqolurxguopkx}wsqmmqeknt{qdL?5<7Kc|ye`womkuuykoxvqx}wrnkilchoultdH=2<=CTmxdf}smmmwv}hvxxr|}uolggiajqyhv|ZD94>@K^vwcnypmlozyxhyws}zrlhcgfams}udwuPA67AERftcxtnmls|{skzwv~wogc_dabovicxkI?5;FL[qqf~{rmmnx}~op{wx~tjc_\c_dq{`dwaD=6BJRdymj|xpmoq{~~ly|uz{ne_[[a]husZhvYB<9GO[m|iq{{~toops~~{m~|v{via[WZ_]mxfWmqPA=>NVdvxhz~w{|sqpqv}xq}{uzqe\XTZ]_p{}\YqkJA=DT]m~th}{v}{uqqrx|tu|xtxlaYUS[]bssW^teFA>KYdsnj|zw{urrrz}zr|{uvvi_XUT]\fvkTdv\CA@Q^jx{jo|yzzurqr{yyq|ztvsf]WUV]\jxcUltSB@CWco}wgv|y}xspprzvz|pyxrvoc[WTW]]m{z]XqoL@?G[es}sg~~{wqooqxtz~wryvrvlb[WSY\_q}sZ]tiG@?K]ix~zoi{}tonlrws{~ruytrtjaZVS[[bsoWau`B??Oan|}yln{yqmkjsut}oy}wrssh`YUT[[gviUesW@>?Sdq|xkt}vojijtsv}l}zwqtqg^YUV]]jycUioP>:BWm~utjb`civ}ms}urod\VTW`dr}`FPbR@@Hau~{sqgbafn{~}l{|sqk_WSRWbgytUCS`LAESmuqnfbdjs~yozpoeYRPPYckjKAW]IDL^w}qpledinv~wtvmj^TNMP\frv`CC[[IKTjxopkgimqz~}v|~rjdYPKMR`jz~lT>H_XLS_w~tnqmklpt{{{wzke_SKJLUeovdKWeWWctzxqtvqprrtwruy|}zmb^UMILRanzyhWAD_eX]j|y}wswwsrrqssotx|~uh^[SKKOVfr~tdQ?KedZcp}y|xuywsqqopomsx~|pc]ZQLMR[ku}o`M@Ric]ivz|}xvzvrqolommty{yl`\XPNOT_nw{l^JBYka`mzx}xwytqolknlnv|{ui^[WQOQWcpzwhYFF`kadp~x}wwwroljjmkqx}{rg]]WQPSYfs|~ufVCJdjags{|vwuoljikmmt|y|pe^^VQQU\ju~sdRBNfhajv{tuqljihlnoyv|nc_]VRRV_mv~paM@Rieamzxssmihhhnos~tymc`]URSXbox}n_IAVicco|uqpiffgipry{rwlca\VSV[er{{l\EBZhaeq~sokedeglsuwqvlcb\VUX]it~yjXBD]g`gs{olgcbdgovysrujcbZVUY_lvvfR?F`fajvxlidaaeiry~~ouuidaYUVYaoxqaLb|}y{}{nfhkkmopsxy~~m\QNJIOZh{uk^OA7Iqyx|}vmhmonnnnqtt{ycTLKHKS`pzneWK?Ei}zw|y|tpptroljhklqz|dTIIJLT`m|zmd\PHBPw}{yxu~vqsuqmifeikr{{v]OHJLPZfsuibYOIF[|{yz|u}vsutojfcdhjt}}zmXMHKOU_kw{qf`XPJJg||y|zw|vsurlgcadhmxxyfTKINRYcozwne`WPJPr}|y}x{|urtoida`eip{t{|bSKLQU]gr||tjc^VOKW|}{y~xztrrlfb`aglt|r}v_RMPTX`jtzric^UOL]}zzyxqqohca`cjozwq~r]SORV[cmvyqid]UONd}yz|uonkebaafntsqn\TQUX]eox~xphd\UOPk}xz|rmlidbbdkrzprl]UTWZ_hqy}xphc[TNRq|x{xojifcbdgpw{mtk^VVY[ajr{~xohcZSMUvzx|ukggdbcflu}wlv~k_XY[]ckt}~wnhbYRMX|~yx|qhffcceipzslz|k_Y[\^emv}ulf_VPL^|ww{|needbdhmv~pm~zi_Z[\_fnx|ske]UNMd~zuw|vjcdccfjqz|opwh^Z\\`hqzzphcZSMPl{wsw}qgbddeinu~znuse\Z[\ajs}wme`WQLUw|xsqw~|meceeglrxxoyobZZZ\clv}sib\TPM]xtpqywjcdfgkot{wq}|j^XXY^fpzyoe^XRPQg{sqnr|}ridghjmqu|vrudYTWY`it~}ti_ZTQQXt~uonnux~ohfikmorv|stm^TSV[cnyxnc[WSRUaxplloy{w{pjjmnnpru{~~rvyfXQRX_it~zqg\VTRU[o{rlkmstwyqmnponopsxzyov}p\RNS[do{|si_VSSU[eumilox{qyyspqqnllmptx~sluveUNNW`kv}tkbZSSV[dqypjins~up~zuqrpliiimrw~}lirp^QMQ\fr|}wme]VSVZal|unjkqx~rr{vrrnigfhmrwwggpjXONVbmwxph`YTTY`itzrmjnu|ypw{urpkfddgmrzoafndTOQ\is|yrkc]WTW^fp{wpllrxwp|ztpmgcbcgnt}{g^fl`SPUbmw}tng`[WV[dlv~upmot{urxqnjdaaciqxsa\gj]ST[gqzxpjc]YWX_gpz{tpoqw}}tvvokfa`aelt{~l\\ii\VW`ku|{slga]YX\dlt}ytporx~|uz|slhc``bgoxygY^ki]X[dow}}xqjf`]Z[_gowysposy|u}ypjfb`aekt|tbXami^[^hqx}~zvnie`]\]bjrzxsppuz|vvmgea`choyp^Xdoi_]aksy}~|ytmida_^_emt{xrpqv{{u~rifdabflt~}m\Zhrja`dmty|}{xsmieb`_agnv|~wroqw}yuzogfcbejqzzj[]mtkcbgouy||zxrmjfca`cipw}}vqorx~wuvkfecdhnvwg[`rvledhpux{{ywqmjgebaekry}{tpnsxtvsjfeeglrzsd[evvmgekqux{zyvqnkgdcbflsy~ysonsyrv{oheffjpw~qb]jyvmgglquxzyyuqnkgecbgntzwqmntz{owwmfeghmt{|oa_o{ukfgmqtxyyxtqnkgdbcipv||tnkmt|vnytjfghkpw}zl`bs{sjfhmquxyyxtqnifcadjqy~ypljmu~rmz|qighkntzxk`evzphehnrvyzyxtplhdaaelt|umhhnw}ml|yoihjmqv{vh_hwwmfdioswzzywrnjea_`foxzoifhpzvhm~wnijmosw|sd^jwshcdkquy{zyuokfa_]`it}÷tjedis~ofqvnkloptw{}n`]lvnebfmtx||{xrlga][[alx³znfcelwxjgvvpmopqsvy}wh[^mqicdjrx|~|ytmfa[XX\fsþ~rhcbgq}rgk}wqnoooqsvz~q`V]lmfcfow|~{uoga[VUY`m|øwmebdkvzngqvpmmlmnpty}yhXR]kjdekt|}xqiaZURU[fu{ricdhp|vljxuomlkklotzraRQ_kieipz{sld[UQQV_m}wngdflv}sln}smkjhiknt{{jYMQblihmv~wnf]UQORZfu|rkffjq{{smtzpjigfgjow~tbSJSemkls|{riaWQNOU_m~xpjginvzspzwnigefhlrz}m\NIWiomqx~wnd\SONQYetuojhlryysstkgedfinu}vfVJK\nrrv|{sh_WPMNS]k{}snjkou}ytv}qheddgkqy~paRINbrtuyxnd\TONPWbq{rnlmqxytwynfddeint}zl]PIRhvwx||tjaYRNOR[hvyrnmnszxsyvkedegkqxviZNKWnyz{~ypg^WQOPV`m|xronpv|xszsiffgjou}~sfYON]s||}~vmd]VRPSYdqwronqw~}vrz}qighjmsy|qeYPQdx~}~{tkb[VRRV]gtwroorx|spzzpihjmqw}zpdYQVj|yqia[VTUY`kxwroosyzqo{wojjmpu{xncYS[p}vof_[VUW[cn{~vqopt{wno|vnkmpty}ulbYVauzsld_ZWWZ^fr~}vqopu|~tlo|}tnmosw}{tkbZYfz}wqic^[XY\aju{tonqv}{qjo}{rnnrv{zsjbZ[l~~}ztnga][YZ]cmyyrnmqwxmhp~yroquy}~xrja[_q}|xrlfa^[Y[^ep|vplmqxtjgrwrqtx{}xri`[bu}|zvpje`]ZY\`hs|smklrz{pfgu~wrrvz}|wpg^[ey~|{ytoid_\YY[ajwwojils|wldix}vsux{}{vmd\[i|}{zxsmhb]ZWX[bm{~rkhhmv}rhdl|}xvwy{}~zri`Y\m~}|{wrlf`[WTV[dqxmhfipyxnffr}xuwxyz|}}vndZV]q~}{wqjc\WRQU\hxqifglt}}tlfjy|vtuvwxy{yqh^VT`v~|vog_WRNOU_nxlgfipyzrkhoztrsttux{~ulbXQSe|{tkbYRMKNWdurhfhlt}~xrljuxsqrrsux}zpf\SOVkyqg]TMIIP[k~{mggjpy|xrmnz~upoppruz~tjaWPO[s~wmbXOIFISasujginu~|xrnqzrnmnorv|zoe\SNPa{|sh]RJFFKWg{qihlry|xsotwollmosyujaXQNThyncXMFDFN]o|ojkpv}|xspwunklnqv|zoe\TOOYp~ui]RIDDHScwynjmsy}xrqz}rljlnsx~wlbZSOQ^x{pdXNFCDKXj~vmlpv|}wrq|zpkkmpu{}sh`YSQUewl_TKDCFO^qunnsx}vqr}wolmosx~yof^YTSYl~th[QIDDITdwtopu{|uor~vpmorv{wne_ZVV]r{pdXOGDFMYj}~tprw}zsnsvqoqtx~~vme`\YYbwxm`VMGFIP^o}tqsx~yqmswrrtw{|tlfb^\]g}ui]SLGHLUct|truz~wolu~wstw{yrjeb_^`l}qeZQKHJPZiz|utw|{tllv~xvxz~}wpjfdaadrxmbWPKIMT_n{uux~yqjkw~yx{}{tojgedchwti^UOKKPXdtzuvz~wnhky~zz}~xrnjigfek|{pe[SNLNS\iyyuv{{tkfm{~|}{vqmkjighowlbYRNMPV`n~wuw{xphfo~~}xtpmlkjhjs~rh_WQONRYdr|utw{|umffr~zvsomlkjikwzoe]VQOOT\hwyttw|~yqjdhw|yuromlkiimzvlc[UPNPU_l|wrtx~{ungdl|}zwspmkkihiosjbZSONPWbp{sqty|xrkffq~|yurnkihggir|qh`WQMLPYeuvqqv|~zvpjfiw~~~}zwsokhffefjwyne\TNJKR\j||tqsy|yuojhn}}}}}}zvqlhedddfm|wlcYQKIKS`pxrrv|}{xtokjr}{{|}|xsniecbbdhqti_UMHGLVewvrty~|zxtolmv{yz|~{vpjeb`abekw}qf[QIEGN[k~|utw}}|zyupmoz}yyz|ztmgc__acgn|zmaVLFDGQ`r}|zvv{}}|{yuqnq}zxy{~}wpjd`]^adjswi]RHCDIVfyz{{xz}}}}|zupns~yxz}{tmfa]\_bgmwrdXMEBDL[m}w{{z}~}}~}}zupnu}yxz~yrkd_]]`ejq|}m`SIBAEPasyu{||~}}~~~ztonv|yy|~wphb_]_chmtyi[OFAAHUfzvt|~}}}~ztoox|yz~|umfa^^afkpxtdWLC@CKZl}st}}}~~ysnpz}{|ztlfb``dint{p`SIBAEO_ryqt~~}~~ysnq|}|~yrlfcacglqv}}l]PGBBHSdxvpu~~~xrnr~~~wqjfdcfkpuyxgXMEBDKYkspw~|vpms{tniedeinsw{sbUKDCGP_r|qpz{tnmuxrlheehlrvz}n^RIDEJUexypr}~yrlmx{uojgfgkpvy|~yhYNGDGO[lvpu|vojm{}wqlhfginty|~sbULGFJTbsuqy~yslip~~ysnjggilrx|~~~m]RKGHNYhy~tr|{vojiszuokhghkpu{~~~xgYPJHKS^n|su|xrlhjw{vqlhggimrx}~~}rbVNJJNWdtzsx}yuojhm|}xsnigfhkotz}~|{}n_TNKLR\izwsz}yvqlhir~ytojgffhlqvz}}zzxi[RMKNU`o~ut}}zvsokhkx{vplheefimqv{|{yzteYQMLPXet{su}zwtqmjjo~}xsnjfddeimqvz{yx{pbVOLLR\iyvqv~|zxuspmklt{wqmieddeimrwzzyx}|m^TNKMT_n~}spw}{zywuspnmox~zuplhdccdhmrwzzyyxi[QKJNWcsxooy|zzyxvusqonq{}yupkfcabdhmrxzzz{tdWNJJOZhyslo{|zyxxxwutspos~}ytojeb`adhnty{{{}p`SKHJQ^m~zojp~}zxxwxxwvusppu}ytnhc`_`ciouz||||l\OIGKUbsukjs~zxwwxxyxxvsqqw}ysmgb_^`djqw|~}~xgWLGGMXgy}qijv{xvvwxyzzywtqrx}xrkf`^^`elszsbSIEGO\mymgky}yvuvwy{||zxtqrz}wqjd_^^agov}~n]OGEIRasukgm}|xuuvxz|}}|yurs{|vpic_^_cjqyzjYLFEJVfx~rigozwttvy|~~}zust}|voic`_afmu}vfVJEFMZk~{oggr~yvttwz}~zvsu{unhcaadipx~~raSIEGP^pxmgiv}xutux{~zvsvysmgbabelt|~}~zm]OGFJUdwtkgl{{wutvz}}ytsx~wqjeaachow}||uhYMGGNZk~}rjhozvuux{~|xssz|unhcaaeks{{yxpbTJGJR`rzqjjt}xvuwz}~zvrs|xqjea`bgnw}xwtk]PIHMXgzxpknz{xwwy|~|xtru|umgb_`djr|zuspeYNIKR^ovpmr{xxx{}}zvsrwxpic`_afnwvqpkaUMJNXfw}vqpv~zyyz|~~|zwtrs{{skd`]^cjr|zqmlg\RLMS_m~}vrs{}{z{|}~~}{ywusrv~vnf`]]_fnwumkjcZQNQYet|vsu~}||||}}|zxvusrsyyphb]\]bir{yoiihaXRQU_l{{vtw~}||||zywutsssv~}tkc][[^dlu~tjghf_WSTZeszutz~}|{zywutrrssuzwnf_[Z[`gpyyogfhe^WTW_kx~xtu{~|{zxvtsrrrtuw}{rjb]ZZ]bjr{~tkfghe]WVZco}|vsu}}{ywutrqqrtvwzxog`\Z[^dlt|zqifhid\WW]gsytru}{ywusrqqrtvwy|}tle_[Z\`fnv}xohfiic[WX`kw}vrqv~{ywtsrqqrtvxyz}zrjc^[[]agow~~umggjhaZVZbm{ztpqx|yvtsrqrstvxzz{~xpic^[[]bipx|tkghjg_YW\eq}vqor|~zvtsqqrrtvxzzz{~wohb^[[^cjqy{rjghie]WW]huysons{wtrqqrstvyz{{z{}vngb][\_dks{zqifhhbZVW_ky~vqnov}xtrqpqstwy{|}|z{|unga][\_emu}yphegf_XUXao}ztonpy{urppqrtwy|}~~|z{{umfa][]`gowxnfdec]VUZdrxrons}xspooqsvy|~|zz{tmfa^]^biqzvldcdaZUU[gv}uqnou|uqnnoruy||yz{tmga^^`dlt|ujbab_XTV^k{ztpoqxzsomnpsx||yzzslfa__agnw~rg`_`]WTWaoxspps|wqmlnquz~zxzyrke`^_biqz{oc^^^ZVUZfu|uqpqv|tommpsx|~yw{xpic_^`dkt}xk`[\\XUW^k{ztrrtz{tlkpssy~{zxz~smjb[]cfkwqf_YWZYUVduuqtxx}vmkpttw}~{vs}vpng^\^_dqxof[UXWSR^p|wrw|z|xnkrvuwz{z~|vqwytumb]ZZ]k~~wqaUTTRQ[kvzty~|||qmtxuvwww{}wruyzqd]WVYeyziXQOQQ[hpzx}}||~wrxzuuuuuy|yuwtf]VTUas}q^PKMQ\gks}~|{||v{|vtstsw}zywyxi^VSR]nv}yfTJIN\ginv|y{||xtqsrv|ywxv{}m_VSP[ipv|mYNHJ[fgjo}{x{{{tqsrv~}yssvv}q`XSPYdjotr_TJIXcgfjw{x|{}trtrw|zunptu~ub[UPX_ehlzwf\PKT^ecfs}{x|{uturw{xrknrt}}|haYSX\`aet}|meXPRX``cow|y|{wvwtxzxqhlps||pg^WY[][_mwsm`WUTYZalr~{}{}yxxuyywpgknqz|xpd]\Z[VYgp|yti`ZUTS\hnz}~{y}{zwzyxpgjmpy~{ylc`][TTaiu}{qibYSMTcjt|x|~|xzzxqgjlnw|~zvkf`]TQ\cn|wqj`WKL\ep{}wzz|zyrhjlmuz}ytnf`VPX^gu}wsh]MHS]iv~~xy|}|ytijmlty}}y~}wnf[QVZ`nx}{qfTHMS`pxxx~~zukjmlry|}y}wlaTUXZhrz~}zo^MKLUgrz}~xw~{vmjnkqy{}y{ui[WYWbmtyzwiWOKK\jrx{~zv|~wpjmknx{|{{re\[W]intw}tcVOGPaiqu~{vy~zskkkkv{{}|~{oc_ZZfjntx|o`VJIW_ipw|xw|}~vnjkis{z}}~}ykc]Zchips{yj^QIPV_jp{}yuxzzrkkhpzx{|}|}tic\bfekou}sfYMOPTait~{uvxwmjhmxwy|{}|{~ph`bfcgkox}|ocUROLWalw~wuw|}qlhkvvw{z~}yxnddgadfjsyvk]XRINWcp{xuuyuojkutuyw{}{ujghaacemt|sf`XKIMXht{utw{slltsswuy{}}plkb```ho}zmh`OIFM]l~xuuxpnusrtsvw~wqnc_\\ciytpgVLDFSc{zvutrwsrrqtt{}xre`ZZ_dtzwn]RECJXs}wuzvztsqosryxiaYX[_o{~tdWHDDOi{xw~~}}wtpoqow}|~|}ncWWX\ku}xk\MHCJ_qzz~|~~zvoppnvyxyv|teXWUYgox}}raSMDHVfy}~}{|yxprpouuusqy{|i[YSXbirv~xfZSHIP[n{~|zv}}{srpxwq^WHP|z~g}w}vlLztswzyoxd}y\XzuugzcK}zMLOLZk~x~tyRHuryxl]w|mT_f^ivtqjixVbzywfsMXldSUM\rtv~|^=[|t~Vqz|zargh^l{xjc{}{]Jx{~oaeEve}x[XRgursrsiE=t}wonX{|{qboieuujniphJS{e]ZUugrc[`mmj|{eU8Lmjgm}y{uij|smprkeytwdWDe~[\\l|mqlgehjhjpZG8cemm}xvxmgxvxvrngguj\LG~{Vccy|pn~gojghfp~dT>Aaup~vuz|dmtsmkcnzwaWDWsWle{{~iukteefdy~YM9Xygxpwtwpbwz~llgbyp}}XPFr{m_kjx{sj~~robgbevzRGAs|vktytv}gg}vllbemrRLRxm`iwwno}qide_lumMGQ{tiv|u}vdmyrmg`pk}hONbzh_qy{}ivxmhd_`zq~eLKa~ljy{}r_w}wribdfxaPTq~_dzxvdpog^^gk|^NPr~csy{h]vyjbblvcy[SY~|Yo|zhgnp]\asuk{XPW}b{|t[iwtacezgjvWTcs[t~t`wofX`ekrvUQfvc}|f[{ti`ejcqqTVu~lZy|hdh_[anixpPVwl`~nacjeafs}cxjP`}]\phlpb_]fwh~dNaZj}shbnojdbj{xg|^ThyOn|uoh{ef^aiyn{YSeuT}{uohdklcejrnvXVm}gR}}vtmn~fg`aluqtSQo}g[ytqnhnkmcaroprNW}|v^\vuwrotxgi]awntkFZzz_k}nqpnltyol]exhvbGfvtWrvpvutm}rmcZezkuVGizt^onprmiwqb]b}zkoROv~wm]oquxlori^Yb}iiLP|zqdzlmtoeqrk^UdwdgK]~wkazmtxmivihWSlqccGf}ikvktnffwlhSUnid_Otwaqusvmgf{i`PXxfc[Suuc|~trnhae{j^PY}cc^Z}}ma~ytmi_ktd[O`}^d\ZyoexmiaZqqdYNhx\j]aqkcwmi^]whbURts\kUerkhoiaX^}hcRYymblVo~neloj_Zbd^R`kcfTr}nguzkdZWd~d\Vc~lddZzvhgyylc\Xmy_\YgjaaY}tjkte]XVww^_Zi~fab^likte_WZ}o^aYp``^`kmn|m`[R`kb_Xt[c^i|hlp}ka[Uj|gc\[|zXb[ozjoxxe^VWpieX^tWc_xtgove_W]v}hbVdnV``|tiv|qbZVaz~i_VhjUcfogzzob[[e|e[XmgSchnlul^Y\fbZZp}cSgo}josk^]aiz|]Z\w~}^Rir}jwpg[^`lzy[[]{{|YUnzyi|of]bbsxsZ[`{ySXqxl{mc]aazzn[[c{uP]wunwncabezi[Yh|oMb{ustl`a_h|h[Xo}yiMh}ttslbb`pzeXYw}vdNm}vxqia_`uzcU\}zqaPu{uxpjc_eyx}^Sbvn_R|}u~mi_]g{z|YUhpm]V|smj^`k~|zvRXmlnZ\}smg[aiy~pQ\qxknWeyt|oe\cjv|fQ_xtlmVlwyym`\_lvzbTcpmkXtv{yk`]]sst_Uh}qmjZy}x}uh_Y\zpr^Wnxplj[{w}qg]U`jrZ[uypni[|vlfVRd~jsXayxoqe_zrleQUiskoXg|xqr`fvrj]NWlnom[jwsp_n~pv~hXOYtkok\l~ysm_ryo|zaSNZ}jqk\q}|pl^wrps]SN`guh\w{nkZ}}zpsiZONeiybazwogY~|unudZMRjzlw^fzun`]}}xsn{aWMUlyps]h|~uj]d}yuom|^VPUrwnp\i~qe\izvtlsw[WOUztnnYn}kd\rwupjyq[YLYmojYuyfd[~uunn}k]VJ_jqd]ysec_{vrlq~i`QKchp`b}{odaeyvpori]MMfgm_f~wncdmytooqhYLNlzcl_k{ukagrysqnrdVJOtubl_q}wthckwvtqku_THS|nal_zzwsegm{uvpjy|[REYgckbwvpeln~vwkj{uYNEaceii{vvmgmn|yuil~oVIHgafipwwsmjnq|{qhmkSGLmz_fmvuvqnjnu~znhmfOFPtw]hpy}uuqpiqywkgoaLGT}tZls|zusrpht{~tkgr}[KGYpZqtxtsuniw~{rifw}|VJH`k\vtxrtukkyxqhg|}vRJIjg_xuvrvtio{upeh}pPJNtecxwurwqhr}updl||kNJS}}dfx{~stwoiu|tmdpzzgMKZzchz}svvmkwztketxwcLMayci||swsllzxrigxutaMQixak{twqmm}wphk|qq^MVow`mzuuommvmhmmp\O[uv^rzvsnlm~sjipioXQ`zt]wzuqojp}oijs~hnVUcp]|{tpnht{kikxvhlUXfl`~zqpkg{whjm}qijV[k~hcxpphhqih}swsdnvg\~pkxt{wdLDuguwluqh|_[^[eqax?dkb`hrucn}tQ|tcbaqjnb@q_[hqwatnTO{qddtsX~|Ocf[XdxshqrhGswmir_YfMaZ\orbfoNQqrlpOtz_ZoeZgvfjnlZ?p}{fhcZ}p]~fa`und~msb?G~bgNwrh]ugYksfpo~dT;dqca^yn]uqifmcehX=Geb_{~zfa|kiokcg~~]M8Zx[di~~}qdxnnmifc{}lUD?gYis|||_inuhd_d}ZS;YYmh}}zlcsu}ob`YuyiRG?f]snxwz}akx~hcX`|[R9[[og}wri`vna\\ovmVIG|ocqiztvZg~gYW^s|_MF]immupxeWvv^ZYfzuuPMLsycsiwu~sUlfY]XocNOUkelov}}{]Yy|rZ]UixsyTWNlbmd|}}|lUj|{bZVWq~eRUWobiq{|}t_^uzpb[Qgvz[WOebah|xtf^hri^U[yxpXWUvuXds{xga]tvpgVUfpzeVU^eXozxkfbapt^VZw~owWWQpxShwymcf\vswlYYbo|kSQUcTs}|rde_aov`\[tm|[TKmyUfwxhecZsywl[YaqypQKUeWr|lgg^btue]Ymp}`JHms[`zrfg_`ssoaZ`||uwPEX|jVk}ikb^dxqj\YfrzgCMlseX{njh^dopsdYZqpyMB\~yrWeyil`ag|pr^X]xvk?MgvkQzmlf]dnougZVlowQB[x~x[^yll``e~pu_UXokALd|qRxomeaeltwlYQjrpWAUvy_[|ohabezrvaRVkkIG`rVpulddbi|tlVMiwh`CPvzfZqggectvtaMTjhS@_r^hyifjcgrmVLfdgFIvzm[}qfkgap}obLT|ne^=^ui`|ginbdrkVKcahKCx}tbqpeoh`mkdMStvacZoyj\q~vhMW|ifm`X?Hmoz^cwo^Gqtfirm^L?WrwqYl}yiSR}mfkcXBGhn|b]tpbLhvjgqu]NAT{ytuYg}{iZP}qhigWGHbrxhYqrdS`wmfr~]PFPuqv]`{|j]Qx{siinUMH\yrmXmtcXZ~woet_SKLopsb\z|k_UoytijuVRHWlqYhvc]X|vpgvcVNIjrnhYw|k`Yiwukm{ZVGShp\d}vc_Z|upkvkYPGevijXs~{k`]ivsmo}aWGPxim`a|td_`|upntu\OF^{ej[o}xl_alwrppy~jUHLplfd_zse_g}~srqp]NFWbh_l|un_foxstnv}rSJGkq_h_wrganwsvpm~_NDQ`eclytoajoyvtjtvSIBfs\ic}trhdoswxlj}bMAN|bahpusnfko~zqgoySEAaw[hkxsqlhms~vhfxhI@Kxg]pr~trolgo||nci}TCB]|Zis{wrppgjrsf`tkFAHxk[vrztprmdnu{k]d|}TBA]]kvxvqrregnr_[q|lG@Kxp_vs{sssjait|fWb~yxYADafixvvsumc`moZZluoIARuxbruz|uvpg\et}`W_|vu^@Kamdxqxxrj_[n|kYWipsJEUpbouv}zvlcXdt{`V\|utcCN_rauq}zpfZZn|l[UjosQGUmdgtw~uj]Xcu|cV]zyqhHN_wv]ouzo`XZlq[WipqZFVhh^wwueYY_xeW^ulnLL^qzZjz|{l[XYlu\ZgqpbFUc~iXxytaXY_{hZ^qkrQJYm|Yf~|{hZXYlx`[dvohGO_}jVv}r_YW_zk^\oԧif^V^fzTf\N_gugw|B[ǘif^jhtd`ziYh{RSZhfts2oΐgZYfmzarub}pHr|egdl~z^e;ƃaW[gw|cuh}ZB~o`h~uX^=`Y^n}nc{ejIGsmm{iUxXI|c\\kykvydrbER|ylu[Sr]Vv_U^xxfwfmW6\djOcpgekd\gxmfzuu`L8nz_kOo~sghng[lsdjyxkaD<{}^aL|tkhzģjf^omewzg_{zhdiw}{`o|pplqlhnsJ:Kx|edj||s]|ypkhsklmkG>St{`ej|p`spjotapq_C=_}uz^hqxkesshpl\{tSFCnuxz`ksx~fgqpgre_uyRHD{wv]k}{vdlpnjp^htpOEHw|s_p~ufjponiZn~lkNBR{t^wraiqqh^^xtgjLF]zq]}}q[pmqc^c}hklHFeyi^~}nV}so[^e`oeELpweg~gT{ueX`f[vaHP|}_i}yZ\yr[Zan{_y\IS~}^jqXfvjY__tsdxWEX~|ZjfXnsdY\a~pevRFe}Snxa[uh`[]fljxKIk~sJz{ma]bcZ_iipqDPo{gLyykc`}cdZ`hfvgDTrWT}}qj`gre`[_ljw`GSw|N]|}toibqmeb^Zsmu[BSrKi|wpohgvlgdWY|isU>\}nIxyppmigygkaR^~gtJ?dzfKrnmkkehpZSawjo>Cky_UklkpidnnUT`pkd:Jvw]a{kkmqbipfSTcnj]:Qs^hviiqm^smbSPhmgV7[{q_nrflse`|i`OOofdQ:kyu\uogro`czf]JQv`eJAyztWkksg]eqfXHV~}\cDM}pW}ipoc]hlfSHXwZ_CX~i\ylria[mjcNH^pX\H`{dbwqoe_Yth_LIhlW\Kesbh~yrjc\Z~e\JKufT_Mkocn}|ofbX]aYFO`XaLt~mbt|je_Tc{]UCZZ]_M}xmb|xfe\Uiƹt[REd|XbZQtmbrfdYVo˰nYNIm~xXdUZsmdmfaVWv˨hWLPt|u[cScqjgjf]UYȡcULWy|t[`TloilzidYT^ĝ`TO[}|tX^WrljquhaWUdš\TQ^}}rT_\yilv~tg^VWn}YVRbz~oQb`{gn{zse[VZx{YWRhzgOfdufsxsaYX_xXWRpyaQigohwxq\YYdĺuXVS{x}[Ujjil|ymYZ[kƲzrWUWy{WYjo}frxeW[^rƨwnXS]xvU[hxvfwv_Y\`xŸxkWRfwrS\jqh|p[Z[d~xhVTn~upQ[n|oj~iZ[\ixeTXs|tnM]vwomxe[[^mxaT\vxskHb~upood[[`qx\U]yuueDj}vntjdZ\cvz~YW]}sv[Ds{wmzgdX^d}~yWW\rsRJ{|wmhbX_f}tVT`rnLR~}uozi_Y^j{qTQg~phJY|urwg]Z^oymOQq|jdJ`{vuuf^Y_svgJVyxfbHj|wvqf\Xats]H\pebHu~u{mgYXatu~SKaig^L~sleUY_wwvMOf{gjZR{slaTW\ºumKSnuijYXxvj^TR]Ķ}rgLXwrijX^wvf]PLbƱundK_~~sjlTe~wszcZHKhkp_Mg{smlPp}rtrcRCMpȼfq[Sk{tqgN{zmynaJBOzǹfqZYmzwqaRrkjZEASƶ|fqZZs}zm]T|kmeTB@\ůwgsX\y~wi[Wviq^Q@Cf¨qktTa~rhW[}oiu|YN=InümqoQhngQb~xli|sWJ>PtõlviSl}lcNl~{sijlUGBS{mvcVnyi]Nv}wpfpfRGEUnt_WrweZQ{umdxaQIFZkr]Yw~t`YSwsjg\RJEahqY]|}o^XY|vqgmYTGEi~fpUb{i]WayunhrzXUCIqwflSi~wd\WmvtlkvuZS@NwpghTn}sb\Zzurlnwr[N?S~lfcWt~zo_\auqooyqYJAWhebZz}vl]^h|sqqn||oUGC\dd`]|sj[cnyrsrm{kQFDc`c_bypg[irwrupn{fNEFk[c_iuoe^outtvnq}_MCHt{We_r{rmcbsyswuluZMBM|¹tUeb{xpkbfusytmz}WLATĵmTffunicjx~tyrp}yVJA\ıfTilqlhdmz|uxqstTHCe®aUlrolgeo{vwru~qREHnÿ]Wow|njgfr{vutv}|nODNwż|ZZs{xnigfvzuuuvz|jJDUźxX^wvmhhf}ztutuv{dFG\ĸuVb{tlhhgysvrvt{]DJcõsTh~skigjwsupzsxUDNk±pTnrjifottsorsOGSt~lUspjhftstoqqmLIW~¿~iWw}nkggw~rrltnfJK]Ĺ|f[|znlgiy{qnkyzjbJMdızd]wojgj{yojm}sf`IQlybavoihhwjhpke^HVrz_eumighsfircf[J\xy\k~tlidimdku_hXN`uZq~qlgao|fhhܬ_VOLX]i^~hmY/\>8YrK]xqwi K:0G_miRqWQ^äy&S:7WbwhR}nkoo(W@5G_j~b@a[b}p*qGFROgwSu`fh3iJ?Jdku[8mfhzg2tڏYVIC_UqYbye>l|WMQijqU2|qfxu_9iۢke=?Z|Qn^btcDSh]VlbnpW0r|fy~}k[@`֬n8DWvP~qjcrcBCwm_q_ng\0gg}qwcXFZͱw=JUsNwxtfrzd@=|isZog_2^g~np^XMWzGOUrNoyhqvf>=orZo}pc5Th}tpk_]TT{QOUrRezkswi>;ukYmvua;Ml}qsfaaYQ~WJVrZ[xpuyjA:}zc\hqx_CGrzosabe^O^IXqycQxvx{}hE:m|\`aoz^LC{yups^dhcMndG[qsmHy}|sdJ:^~Ye[nx]TB{rtq\ekfJ^gG]rqtBzrdP8QXgVmu]\D~nvm]gnkHQlH`tqyBw~~tcT7G[gUkradImwjajroEIpKbvtyFkwx{eV5?aeVgmdiPt}nvgdltoBDuPdyxxuL_q|vhW6:g`YaihmYfzqtfiowmCA{Ve{~s|pVSnqlU89ém[\\goqcYwsnemt|jG?y`f~zrl_ImppT;9ɥrW_VcvumNvshgt{fM>fjfushfB|p~prSA<{͢wUaSb}yuGyrbjzaT>Uxiqugi@xwuzqtSGBoˢzT_RbzDz}q\m_Z?Em{lx|fgBqqzuqsUNId£}U\SdyCroYp\^@:rtj{wieFmo|prs[VQ[XVVhxHjoWr`_B3{njrkaNko{mrsd][V~^R]pvOaqZrh_D/sgjnl_WksxlqspfbT~eRcxtXYucpq]D2`dj~mn_`kzpkrs|ofVo}iThqaR~ypo{\C6PckxmnajkiissyjZZnZonjKu~~n}]B;GįemqondsldguwlYJqatkpEkq}]C>Bʳhoiqoiyk`du{oYBuizktC`v_EBDηmpbrqo~n`avsW?yq|lsEW{zbHEHϼup^rtvrc_uwTAywooJNv{dMHNͿ|m\qy}wyh^vzPFnsrhPJrqzgQLUi]o}|pm^uyOJZruaVFnkvkVPZsƽd^nf|r`vwONJsv[[FifqmZU_jaam_zvbwtSN>xvtV_Ifepo`ZcdaclZ~|ygxrYK7r{pUaNzefzppf_eaddmXw|myp]F5m}jWaTtggqrpkce`hdn|Yq}tzq`A5vl~eZ`Zolehsopfeamcpt^h~|{u_=7iwnzb^_aktabtoujfbpsdsle_}|y\;8^qqta_^gg|\^snymf``weufjV~w~X<9Umslb`_leX_qn{mf[T{gvcnN}tS>9O²msfe`andVamo}ngTMjwyemJwu|P@9Jôrpbf_cpeXbjo|oeNKnwrjiJowxvQ@:Gijyjaf^fpg^chp{qaIKtwlocNgqznT?;EŮede^ipjxgcgqzsYHKz{wjr^S_}p|iX=FŢag`_nqo^}t`isyuLOG_{wqoZ\Prxue`:?Gzcf^`proUy`lt{tHSBWsvj\]Lq}nf_:@Jqjf^bqtlR{bnu{oHU?Q~sxf_\L|ukj_=ALjqd_dqvhS|dpw}lMT?Kxvzcb[Mwzil_BAOcwa`gsxcV~|grz~hTP@FrzybcXOr|jm]GBQ]|`bjtw_[szks}}d[KABxn~vccVRmwll]NCSW`dmuu]`gzqtzcbFD>kmsebUVisoi]TFUQuafpxr^e\zvtwdiCF;^ori_V[fnpg_]KVLkeitznagT{|uthmCG:Tt~qm^WaelpfafSVHbklx|iehO}wqmmFF:M{yqp\Zffmoeem[TD]sp{~eifM|zorkKCHpns`aoltffpwoP@W{{dn`Qdok|eXBAKnmshfrrrybhx{xQBTuxin\VXhjc]EEPmmrqmrxf}bj~SEPftolW[Rdi}d`JKVynnr{vr{^}emVJKYpujR_QchxfbPR[rnprr|Z}kqYRGMoziO_SchoidWZ`moqttyYqu[XBEo}fO]Xgifkf]`bissxxqZ}~xz~_\?@r}dR[`}mi]lidfegwt}}i`t|e]>^{od`Zwu]Qdxrq_YZpTu~v{RFAY~lfc^xu\Ra{trZV`lQnuy{QIDVjhfcxw]T_~wrVU{gfPgm}wRKHUûjjijwz_U^{oSWyo^RahqULKUĶ{kjlnt}{dV_~iRXsztUU\}gkYLMVůunjosrp|jW`bTXd}vOXXwj}f\LOWçqoirvqezoYb\XTXtLZUsoud^MQVzqqiuyq}]zr\e}X\LOzoKYSqtmd_OSVtrphwzswY|r^g{zW^EKwiNXTsvde^QSUownhx{tnZrcizqZ\?HydQVV{u^f\TRUi|mix{te_rijyg`V>i{qgUR^nhaaX[PTNvrnt}e]nZrzqznblD@:amkURajgd_Z^RSErvpt|_blTs~txghhCB7ZkmTSchjg][_UO?o{sux\ggQuyubmbFB6T}lmUTegpg\]_XIg{wm`k\Wx}lfrWQ>8LxskZXgiy~f_dd_>A_ygfiYYmgkqUU=:Iyui^[hjkfagfa:EU|ycldWZccplVV<;G|vhb]hhafcija9IKux`q_W[[dtgXW>>G|whg`if[hfll^zdyriRQVz]bgltfu\rf`^gAR{iu_BBXɢ`^bpyxYztPdvTX-Xnm|aPWk}bcjvztpI{`{sb^6g{eveQFMj¦x[at|Vzrik[F/uc~cZTZrdUcowviMytrdRH{haRFOv͛nZbmpTtll}_XGD{}jo\XcǸl^iun^R~dcTK|nol_LS^Ժf[kyj_w}`ZGAʺz}gfUcfѤRVmvq`aohRK~hcM[]䮝]csy^ezo`^IMƮ~xq[kkѓ^k~pwJkmlgLTqjYPjmӜx^lLzikY>Zȳ}~gZ_vs`SgtqFz]Hk~|aU]nqΨhfwnKjmMKw{|mipzydmtZHrpRUw|pj[Yiy}ʾir}]VysbKP|ıd`dx~|Ƨ~\hxhUajXTª~]a`vqذk~wmYh}usSSQжziwuqˎvlkeOmwvZXP¨sg`dh}n̖yw|oVyqoPINigkvqijsui`ZXL\§hejpvlx}usec~~thCKjͲ|oy~sqzqkY`zcGRo»pnldllo{tw}ydgt|M?Hx˾wuluq~{rdnug]hTNPήonnojxfrvocixk=ITջysfrt~~{_Ve{iFT]ǰljokoiprbz}{cdk|qZ;J[ìz~uotwtgibfuSefeKZdæoylhlec^zpyt_h`krHHUfİwxx{qmljgv]SRdruQ[Tozg{bie`edsnl}faVkqogHJAz˿hoglpniVVvzQXMr|yYTN}rdc[^[d~zmkWcM|{ygscIIKsttrmoxpbkhBRC~liSTQst^a[\]npzyj~kU]Lpk|S@>JŹffcgp~sv]Xs}RPNSw]RJXzZ`X[dhcuwZ`Rdywe~lID>[ygvltyvlxqry~nCLFqsmVNJgxv]X\Viji`{{QbRuvr}ZA5;l̯he`h{utb|tgfy~z`D_IyjOIKv~]\Wei^`Z}{eYnNz{rvtO?@DǼhouyqk]qu{|xLNWE{xWNMPǭtfRZbmgg\\x]k`NmzeE:7NѸx_iqyusago`my}jOeMN|tYKJciXfik`\Pn{tdsQXxh{UG=GhħmlqnXrxsx~zfVZ=[x]UJ[v|rQ_kjobfN{~~khH`usqNB9Su̟httx}orQ~fgw}}f\\@c}fTRh{vbmipl[\F˜pkdEk~eueKBQe}}t~}ngQu}~]ZL9uykWSena`hnvgc]WqnWCwox[JHYa̵~zw~rqcc{jtyyZcLD|rfblntonxuaaRh}hnPKresTQVhpá{vr[ti_\LNq|}smii`~kgnv|`EXzy`[UX`_RTUW^mҷ|]zwV]7FʨWghuøP|Y1*3X{qun@Ndvj~ʝHB۬L# ?oyyvloG5g^sk~“^,~P,)Drr|tyiHQxsnvּPQq=%Ouz[o[<-Xlnul{RIqˢiG8Usnqvwe[IT|qlbRVQ%2exXqF;'QĤxdpkN]ceGaqn{n~stPMGMμ|}q}Z^aeDNswbr9:&Tş[|o}|\D_c֑{av{{oszqPE?>èzt~ybbd}ڭu\\tw{nqi7?+Rǩ]xvytbPDan؛nkzY:48~y}zi|wwf]kνser}zycnF;'NŲgr|h`UDSt˟oom=-8zos}xuwiZpǖ~irw_kR+ HxszxhgYFI}}vsvB(=|Ⱦ|mzslutiToȢtq~cj^ $Iryoon\GBėz~xrpCcwsnmedcUC?Xvذ~ddlQ51>`}xur|tc>Yeusn_PH>9Ir๳nvrxwilR?b\pd{NE5.=`έ|xo~xq>OnlicOL::Lqtypzwlm]8d`hjyQK4+?`ڦ{o{xGGreilQM5=Ppɦ~zp||yqke:`cc|snYM2*B`ަ|r~}zTBmdp}vUI1?QoΥys|z}tjhCUdd}|hfL0,B_٭~w}wxaA`izs~YC3AQnӬxvzyzviiPGej~g}sF0.A^ѻ|utvmBQql\<7@Rlٵ{{us~ykiZ8er~jv}B41?]Ȧ}lvvtAEzh^:<ZӧwexytC>}lz_<>:Pgʬyfpph[3]ziuJ:2UalV958T{ۻkhtbS:Cb|ᬵijm}z\XIMYg_983QpĨkjr{\\?pzTqM@7@Xo粰imk|vWZQLYcg>61Jb̨nlru^`HgzUoX>6;Ij漤pnpw~n[Z\Lc^pC21;XԦnrp}u`bS]~Xoc87,:fvsqn|wja]fJym]vB2+,Sڠrvj|wchWX^oe933`澐xnlsmkfefJs~uarH0"'Lՠ|rkw|~vlfYVjgh<*,_޿voighimhcQdaiQ(!#JЩpnnwzyr``Qu\m<%)`ŒrrcaejuecVW^cV$""K|бqmitxq]cNzzWl>#+\ɛtp^^aptcbWP`\W&!'Kqκpkhp{m^aQo|VdD /Rʪzl`Zcsnd^ZN}}iRY+!/DiǤnlgp{l^]WeWZM '/IϺibYhqjfZ^N{|rJY1$4=dөmkeswm][]`ZQT&-+DxŔhc\kkheW_S|y~wGT;*48_ٮqjhx~tk[Xad_JV3/)@oɗieckghbW]]wyzKMH/17Yٷygnyzuj[UekhEWB,)K@^Ȼk]LIYh|tqqsuiO-A;Dv²cQDBRbptbaiqym^:2NBaļg^KMWbzş}onpywfS':AExµdPEDS\mt^_gt|l_=*NHcþh^NPS_uƤ{mlq|vfV)3GKu»~kOHIQXizq]]fxzl^B'JSb~¿l_UQN\ozmku|tfU/*MQo»~sPNLLUcun_[iywm[G'E__{³~sa]NLWh{mmxxseT7%RVhɺ}|SSMIR^sm`ZkwunYL+@g]xĴv{ebMKSd{npyvseTA%Q[c̺u\WMHPZpob[lstmYO3;j`tŴuleOKN`}{rsxtrdTH+K`a̻nhXMGLVmtd_koslZQ?9egpƶx~seRJK^{|wvutqcVO6Bca|ͿlvYMGHTl~gcgmsj\SK9\omȹs{eWKI\y{wuvpcXUD:cetïpy[PHFSklgdkrh^UU>Qvm˻ng]LJ\x~yuwob[XR7^lmƮ{qbRIDSkskbjof`W[HGxp~ͽpjbML\v|vxmc]Y[`wñtXCDQkxiZ[bebcXVevWIZdyڸqD>wdUP'-r~xskgB7d}ğ`&V­one_M&On[L4OvrŤh*yմaIHGQ@5e{uzkRKjlnǢv;#v}YQ]pqQR||iqdQDSuwue[&. rN=BNEGc|w{UMSapxU:6àcS`^KXtmR?Q\yyrUve8=EȊmF?NHTrwzGJWYs{pg|jc`SqRbi^jvq|t=WU\wRY_owLJMg˲lT]PVjowVfQUc{t[invc_UtƩxpogsvw{]LUFRvnafJT`ydPVpԢ|gTDRl{ub`GEnfpgur{flwʓqjqlvz\vc]_CWRigBev~wkNr|ysVY`ispwkaL.PvTn]xuf{|ldZ]gkUU:?hpS|W]}spbO_bYS][dbSPzViiJa^v}w_bnCov[TNSzQNL_ze~kNY[xq{wZrmkZ^æ`OIc{Tr_O_jtmhdZLvncMKjeWLOarfMW`i|oookurWXjͧw_GNhtYqWNfli}UT]]qW=Zy…maPHWomXM_Yh^r|uwoZTnyɋvTGTxsXuT^n`o~Bcdc~eAHimucNO\{kQXVS||Oru|dTfrñ~hMI^l^tL^ZbeBr\luN@ShlsPJRgsq}QXNhd\p~lT_mt[TVqZfqO[ZwWPpWuv`KRZuqdKSZqp{PPRr~bhss\[gku^XWq`sjJWh}tSPhb~|mWUOZjYTWautiCQcw}ybf~zaWbaywnbV_wct]DaowuwPUvjym\XRKr{ddZYeyq]D^c{t{Ro}k]b`k}w]T`[qLIegvpggqn[drt}c]jYPPcniYQh`@sgpzu_]hmllZ\aD:>donURaxXFujx[_kvzxiwaiWQRr¡j^O^owPO{jy{cYbiolj`ta\C9Hpi_U\itOQ|pd]bpxywfrcfVO^sWTXg|}jN]j~iX^bnlpi\o^V<=UnX^[cu|oMasrb`duumaledRWasż|L[]qqmKlkr_^agpluYag_NJf{uswzoux|}sxq]QRT\rzk}QV`qĭror|rsr|}vftgjZRMIYn{h}`4GWstpzpruy{qvymWPHOgv~jeL`giv~wrqx}~conoeXJ?KbuzivE;Rfsszpusy{}}zhydUBDWm~vn{VWfvlz{xqvv~{q`~nnbO;BSmscd>E^uwmsuuvzyutp{s^E;K^yogtU_p|mt}wuty|pqejnX@?Ph{}QaZB_o|esz|zvxrlyzr[A@F\qsTun\pxo|nvssnpzpyweRB?DZnlOgUJdwxgx|~wyqmteLA@Ncv~hZ{lbt~kyttsjow~smXKC@M_vzfSjTPlzql}}xshrysXI@DWh~~wg_jgy{a|y}tjhw{t\RJAETf{yycVoQXouf}p|simyaVF@K]p}w{cegnuwz[|mfq{tQSDBKZmxx~]^qO^ix|gyw~yllv|\T@DPdty{~^pgppla~vgmxtqQNAHPanw}YioP]hrpx|rkty[M@JUis{z_|fmsfjnkt{siPHELTdm|z]qkN\pov}wmrxxVHELYjtyd}bm{dqwkqunbKIJLWcr{`tbKbxl~yonuylRLGL[h{{fuau^~qor|soXNNIMWezy^uXOj~h~qnqv{bWKEMZn~wgjhy|_wrowhw}SUJGLXm|o^qPYoo|xmpqvaWDDK`tlkgp}tntoqe|uXRDDH_pb^iQa|~vqnmyx`O??Ngwcmhvw{|qn}}dtTK>>OdyU_gRo|sqltyWG8@UkXv|jtxpxthiOC7BSmtJga]zrulr{kN96EZymXwzntxw}nzYF7:D]}_Llcrussrxw}}X?4:Ik}c`}mzusx{q|I=7;MmxUQvl{orzwsrs}~C;5?Yt}z]m~uounkpne>?7E[q{qId~orw}~|rkfr_>:;Oat|{|r]}h{m`dt}lzS@>BO_qw|wbNv{qlvg\guz~P=@HRbkt|zpiuynq]ZhwmftJCGHQ]gxyr]Urpo~i\]ivutEGIMTZgx{mruz~zz{a[^m[olHNHKMXlyxrT`}i~{{}q`]`tjzgGLJMK[m{izs}}k_\dwo[veLMHEI`q}xiOeyq}qia^j{i|aHMHDMaszczxph`amy{i_}_KM@AQfy~q`Fn}z|roicfnwmVJJ@FUh|p[sqgego|{{dk~TLC=HYp}xmPI}~|lqhhgsquxNH?BL]r{acqqjigrw{~ydtuMDDP^ltnicZbs{xnc]osba?=GT_lqsxztzwj__o|c]bA>HUboqqmf_lv{vh]cwh]]JP[fnwxque~ȮiT\`gw}v~mo_grfqgcgmsɹ}8$v-7K/.C`ogoxĸZuQ[vc]WeǼ͓>-d50D=37j|mpvR7MkBt{jVRuۭg/ڹV@2,1Gf^\UcrhsekљjmzsYѳƯ~),aJKP@)PfGKa`tTUpdgldbsʝ[*8Dⴔ~b0KSOMC`u_ZZNGZӣZX^yrɪU#'Cܱ]PBg?Qpʨg~l;.*rƲ|YuFDBbzs}lEa`bpuǢ|u{pRHaybeHcUfblDEEGMLpj~geg+$ 6_ͲzpBONcppt\B:Hmwl}zzpe?EѲh{]JJQxanBSadbiXng~vr|WN&@ʏU_d_iwhycgLCUd`Wzc_bnf&BӍzSPJ]xrr[EDCRxwf\ifz~kW_4``McqiWjZZgl~okNaxwks~l,9kYiei}{p]~eZEKYfKMBhsq|d~hj:"8}ܲȒz]Th{i|iuy`\IHhjEkzriqse<(sұgoZWwPi\LN]iuk\?-F``sml33 :zuyqjbFqzfMJnqhN[^dDzny`[QO$-dԮtV[~{uxOLCLRyo8;4UmйmrZ^xjJ3-S갞spIJ]fldnr}scLQ^aذtuyq|~|yvD-?wվ}twcdR_CWl{b:O&%DSҦiwmoxrMJ3)FYkϯ{T]NRvmrglsZDoKLAOڴunczougZG=-6PĜydrfS>S`liTS/'9{ٞ]cjm|ejM2 344:Ŭhj:OPU~GT^4GGbЛnnsq^]HIGB:}nf{Oic^elnu>PM2+.qɹÈo\ao}raWXʺgrp^\fzvbl]6,)=rĠzh[k`\a_M>-@[̴bUAL\qrL1()WuȔrkkcq}m\(2"JČzVST~zOa9<7):O^}ʝjbYa}{b8(5k؜qoYkx}~uN;/7Oe{ɡzk^gw?$>iյuebauwco<7&3S`\{q}r~ivyxcW3;5`ޮ{jXdt}sAFAFZhp}ikdz~FKZ򸑌\opzTrhC?BHNFVjsmkpywR"*.^z}x|ou[D?Jghqn¿}wxtubY[Siac|gnA;DYUZON6^ƶthvxIA3Xʙ^cpgXaYUQ`aɚgieWZ3%O۽ʖ|tv{iQJDR\c]C:fZuxrk]~gMPпogbaf~{PEG%=Eh֧xlzeeG8,31:N]fRTn}ug5D0+8Zƫi`orJ;)''@dĔ|q}i^OFJE9-@wvqlS]nmveMV#!#I˱ylvs|\aK:.495QtϺeab[uSFJ&29MmȶzjfKJB?@5HT|˿irnjnrlnETM85!GuٮwliqYU:BHI? GAs͛uv__zbkA++-:emklr_XNF>HL›lqc`vgIX80$*6Ti{q|yoR?EECI%17.b{͜qmmvsf`CF41:a~ö_mZUdl]@!!.g̲yif|{u^o_>1 $-Np}kdr`XTLG65->YmûzhgmvyR@0(>TgwrqsrYZid]D(1"Fr௪{qiXhDM@207H[RxuheTSgf[-)$@s׻Ƨwrx|`Q-*8H_zpxifios|m`3,!);i̼̝xt}noc>D+1HQSMBolx}kbak]M2C$.\Ο~~lwX\GBILYVWlg^fpg=@)nƻ\~iRH9[޾î}|eo@4/AKHIYNҽ~{iijptirKBD ';gҵsiwkac?>-8?=BQPկf]`vGC.4_j}kFD7?BAPJGđbnw~qZ1L7)-Ijəos{kU6-.FMDO9GxsÏolruVV("(KvԷʵ}`tMRMLSN<:My|lfkzRKD+SpĮm{QJ77==DK-[ag彠rjqX[G/,4Uu٭soFF>RdYL0EAi͛}u{{nVf;'&=bžb^PSGIL?>'XMkàznjvie.">]{~qcYLGQTKM!071_Ǡxx}SVQ78(2@Yr{ȳw~SS?@SXM96*2^߿|w}y`9'1KpnnTbYZ_UL)4$>[}ٻųvyz[g=4&+?Q^j\zbxi\EENFI,/91Gkߺʩ|{|ON617Kbni_\SLZogU$ -+Q°czmF>%*3D^``gr]ib\\WI83$(7DbګkQB+8KXdQh|onWO\`[D3? ;hڻƳsbyNQJ<9:?I5dupbcWTdf[0(+ $Gmս{shB04?O^Q|ƠnjfgjqeV1;)7_൫zrHN88HQR@-a]s²xwoyla\d\I2K*4\ҭpmqYLHBHAfșkjbs}tS2H$&>XytswzhzP6%!+9K[Ie{Ɣp}UAT24A]}ƸϽyenB82AMKDA'Tsɭzvx{rtSQN(&.JrǩcciFH:=@<;;1nx}Ʊtnz_[>'Diĭf|rLJ>BGDK?-^[pܮz}}c>S@44AXlϭe~cA<9ITJK4/VNoԫrvD1(8UxdwTLTV[[G?.POrշã~cZV*(,Jcscd`WOJGF@F,GNHaԾėlteC@9K^kɴRJGRbeYD!5(3_廴x[tU:61@Rd~_ndNX_`_RD(@:Lfɤ|Z?39Reovǽsva[\[\SQ78=$3Mѫj]e?DBFRVYcZpaVQV\e]L&3+6\ƺѲtbUA=FOhttǻ[Y_lmk^B!5$%5Uۭo_=86G\]dT\yƭdtrddcfaYO61D$'0Ovֿ˨umb_URSNVIphZY_lqi?;4 !R̸Թuv\QD?EKNXLsvsνw{WW\ourdL"3'-7Vt¹ibPMX[ZNHrkzǹ|xjiggbM=T,>jĻӪrePUQQULJ4Bie}¼za\[cksnG8;0WwnYOOHNBcmbvӹtkowzsa:D9"&>`Ǻ^WJFQ^[K1OHNkɼlrjlkmjV9T: &Baƨút}wogXI53ZUk{~ijmu{dLX( &Ge~siUKQPN;JY@M[xà{eccusG@H'#$0@Uij|vninfT3EE>WlxrpiH_\4, 1TnünmfeccU?+I0KRg}Ѳgoi82#"2;arYr\LC2%&)+$Lvrȩ~r{uLAQ*2:DYrrt{tqT=+$%4BD0OYUuټ\^_672;VvʴwooEA8?CC:&@Jaˮȟx{{xWeQ))(7Xz{\pmQR?:557)']Q[nď}goH*,8MgzpuSI90Ifٲkjb51/EYepladgb\TONNHC)F?.?ZҧqxWSDIQVgdq\QKSai`F%75dۼ̬deG@7ANXncrȵhseMVbij_N*=-9IhĶ״pVKGTaakUr˼medcaZU7?F!#,Q~ã|jvLJMRY[UUBrý~cVQ[elk]0=3&>lйvwocZTQVYUͣkddtytkP'?, -<]}ŻzPFEO_ddOKm_oʹ~x_ceqqg_B2Q.&,<[{ӯŸzxjqwtm]Q5KqoŸ|phmqqtMDN6]~ɴȺzrc[[XWSS@bi^oٷgTTe|yl7:9)6MgxļyqlqsrjT:\RUqϥxk[8XI*)'2IbǶ^\alle\;3WM_tŸrh]eptzdFZ0(Fgx}оvfX8KcN^lȫ¤|zxODQ+'.5@MXgmýo_^`ehZ:QN:LdɰvtrxzpdBS[7-*-:K^j|Ýzw}qJ-KDIbwͩ|wkUhT/%!(:ITUvèupf[P8CbLHO_{ķtim|x^O^?*.49BEFHvº}~mJPP51%$%(IVeo{ƶwt~\B5.),)#1RbqŶm_QNe`I@:@Qbyʶ|~{rnvlRC@>6/#7Wct̰~xuR517Jctrt~udUH6'=Y`n̸o\[^J@DHNSXgzrkowZD91-0.4HMM\rǸy~{^I<7=OZȩxơzfszlt`?jx__UHtiomf~gRSSX¿ἃTzʼ}y{{zV=SZL[cXSRpv_aL@P[trhyfPPVwyty~}YFA9D1;^Zh}îzm`WL'-0%4Z|{mru~ǰktt{yunx}hq^EACWVKYSPWYoz~~na_D;Nesjjp_QTarsxu|wYEHG;2:LWgȹor[C2#%'FVpzipžo{vxz{p}k][FJNEUMEPNdf^|~}uYSI>_hit`daSbX^rdp||uw\QV;:4-M]z~ԾqRH(%'>CNsxpirȴ{stmx}}v]VVRO>@J@@N`iZ^syzhRMPS]bhk^akeZOVc\hstmTJ703.SxuѻylK?*4:5BEiwvu|tfϿȸnxpvrwZQiRD:1I;>`[_WRtutlMVcLW]coZky]UFMaUputNB2221_yz{ǼľsaN>*#7819Gbuysv}ÿv}yqwtzxmc\aR864;GIVWPWUc{ea[_NE_bgpjr`IOHWlmxP8=*6FPsu{̲ǰsdY:?0(7,9C?b{|uzź´±y]aH5(*5Bgnzs~ȺurwwqzwtgW=@>@LAIPBEIWg\ju^M=BFO`aebSV^bd]grkq~i_WE835=C^zthN?*!%O\i}|m|΅qtzjlixxroYN6:QCDHFRFH^U[_`y{qNB4DVES^X]P_p^ccbtn}ygl]64-+?Lw}ĻĹ{WH."AVbxliѴxlrjelxtl[NHAEGED?HVVSTWYUgulYDABGKHLRWbbcke__kʻ~}p_Q0#'3SdzǿqC0$!0,Dddwwjxdzt]jkqw`_VTP8EG7AEZdMTRIX`r\`OKC:ND=QYjfYj`Wbj~̿raX2)7R\o~þpI1-,,+9P^qzx{ǭp]cwyuz|yh_d[L?7::@QZ`\KGHTkzs``dMA>;B?Nfde\RYV`ruvƮ}dM>%1@F`gw|t˼ïwkU9;+'/)EauwǬypaiuxxnzpjlTM;&6=JVP_W@FK`oqwufidKC33EJ[daeQIW^jknwsļx[LD87;HX^rxs̾ujbJ6+$%'Akw̧|tvq{zrurpeT@4$7MINLOR@K]^kpxubaG966W]Xe[XND`d^farursZPV:5>B[azyu|ŵtyj@2 &(Srx~yl~ynytvx}k^H>0,CGBEAMNKXXZdjp]VE;:I_\W[XTMN[XQUZiuti_U<-:GZq~u{ʸzj@&%);Mmr}yorvʡzdnzrdYN9?67D8AFG_VOTL_j{qRVI=MKX[M]YW_MPQFUVh~̽Ĺx\Q:+B[l{vpqzӷtfhwoZPHE8+4;>FP`\IFMXjo[LOMJJHTWT`d_Q?GNL]l~xí{cFB41Obtxt{sƿx^U3$1.8:Cjvptխpqbs~z~aYYB:&%<;KYT\J@MPl|pfLSVCC?NOcnp~x~ʺkNC>7JZdqpz|yzҹ}hXI61-,5>Tv}~švklo|{{zyzkYI4+$)ESWWQTKBUgwxifVNI79>JfgcaOI==Zbelk{|Dzn]G>LCHZ_qs{t|~ʫ~t`VV6)*&:Ebֹ~qqxhqypwvcO?**%7SQVTMUORbew{xrpfHA:-3>Xlb`YLJFRddjkmſfUJJIAER_rxtʽvnhZK3!"+B^t~Ū|}rnfepp{z^?4(09]g~tǷrmdUct}~{jF735;7BMJQXah\X\e}}m[@(,6=GQ_`UVZZVPU\_k|ƻzzwcRD=<>Tqx|ºztthQ<./CPgqxw}ӽzf\[]y~rgV=@94:1>NQcabeNRdxzqRB1+=;@MM^`\eYVQDUcoʹӽeU@3@EYqy}s{whK:6,4>K^cvxzsb^bhxznhaOA72.*8P^a_]ZNQiygTE=57=6EY[mxwyrèt]NWkluuӿv^KACW\]jmtwx{yvĸ}{m]QJE5,3?Rh̲rvvtlnzz|ykK0)#+9EWVQRNXabq{snhTD-,8;Shqt[LF;EKRdbht~IJtm`LROV_Wgpu|{|mswzɸr{oeaJB1#4@Yu{}}ĭtrfi}ugE.*'7==LLMRRde^iq{jQ='*9G^hllYLFDKGGT[ftvlf]WOOW[evxnonq}{}û~uw}qaJ61(0J]ou}ozɲsgjh{t^P3-65:49MLU`_eYZr}|mO:0%Siyí~rkVEELasyzpjam|ȿ{|{dL?2ICEOYk{жtijpuqt|xrleZB.('/=K[_ZUR[jvfQJ>4*):HWmvueLA*-2;OQX^TY]nzznRB>.-+3P`r{neO:;GQjyynjflhfsxȺtfSLIGKJNUU_oȱxvqmlksxrdP@6,.-#)4QoxxhWK9:GNVVawнŹs[K>N_ixy~}nqofbXdw|{¯|jdWMVNHFCSZb{ê}tlennxsaJ8916EEICBQU`otqP:' *5UqurcVPCDJHMLXrȺ¥s_QGR^dmt}|yqbYS]t~ytle`YVPB>CPamxʾmghkw}w\K>9@>@B9CLeusyx}ʼqegl{~wsaPF?HG<;8>DJ]fceizyzcC,%)8COaghea`TC==ERdŽƴvj\LBKYh}p`VRZh}ynsriXB<:=Pbqwqu|xkcpvxuhdYLMIGC58?DQhpʵ{cP@6H\sg^X]ik{ywxk`K79>L]esvqzþxtnmpnoh^^[VOEC=5;FRXUWZ[h}vxs^PA2+(-7F`txreXLAFUbltԿʼoW@45Nm~ygcfdikuvpaN@5@MR`gnxzǶw|vikdbb]e_PI<:>=KRSVLO[e}|ywj[U>*$*>Ts{tkWQOMY_emn˭w^@55Catypmeccez}n`OG@@INU\fxϺ{nc^_ehfaTD:8BJLPPLHIXkx|ukZH/$=Vhxte[TY\X]_`jzƷľz[G9>FTnw}}lfZYcsj^WNNBAJIUfxҼ{o\]bkqe]Q=;HMQLAABKV[got~wy{t[A/#4AS[`hcef_]PIPXoªg]NCCDXp~cWU\q||rlkZK:-9H^u}~µ}srnuyslXKIFKLII?;@HTUT^esuv~~iO>4-28BMT`knk`WOEFSduʺȷs_K>=Gao]W^gqwuhS>2.@Xfsvz~{¼~x~yxkbWLRQJG>A@=KPONGTfyyw|tdQEC615:KVevpfXJKGL]dowIJu[D8@LkxqaadcilwucK<54HYajmw|}ŵwpid]WWOD>;AFJNMFBBQi{~ug\RH7*.:L_ltl[PIKQTZ^amʹľwUD;BWkzvqea\\htt]P@=>BPV^lu}|yǶsmnhj_RL=:=APPIF<>BMl{}yoiXG7&+9MeklhYSOR]XUVXi|Ʒİ{YIAHXbs~k]VWetwcVLFB;@LYjz~|~ʳ}vopspdOA=:?JRTI?=@GUXdv}vz{~vbL6/-4FR[^Y]`be`\WOTbvžȸzhWMFGP\rzjZVaq|yuiYG6.0Cawðxsv~|vkWG99FKMMHGABMQTW^s{uty}wiP?21:;DNRY[bnjf`XZYbvûŻzmSE>=M_{rjaequ~zbO:+.8Smz}οwvyvlZKB=DJIIDEKMQRPPQ`}uw}~sgUD<8;;:@GR^gnng_X[dkt~ƽxbG76B[swqqonrux{pT=0.;J^ry|ó|yy{h\RJIBCE?BGPZUQNFKWr~|~q_WMFC::63BQbmjkdY[^jurx}Ͼŷ}hJ46AZo|~y|wmljp|~rV@76?GSdn{~͹~z~wi`\VNB;::ALW^YNFBIZqxl^YXPE;313@Velia]Z]houtptȻŻcM;;JXitzzmbfo|k\HB?Pl˱zvy|wkZE5,3DOUTOJBBMVam|ztonnf^M:1.;KT^`[WS\gghdbdgxÿwe_TLOR^lyogcct~z|ytoYE6,4AZy{۾|~weM;41@LMNHGIFMRS[cxxxy|rbUC86;KRTXWWXZdd_\X^fp}rgVIHQatvkhkpwzyvt{qV;=@GDBEFORMMJPaw|{nXKDPZirx~pjqµ~r_RHD@:;<@GNWVKDBL`yxgUKHGHGFHKQ[dgbWSRT]itxv|ʿ̿|cQGGXl|{wxxxsiims|kWC6:AJRXiwwplq̸~yi\VH>3.9?KWXVJ>AI_zud[NNPHC=?LS`kf`QKRVcnquqtŻɼeTMKYiryvx~~vqgfnvn_QDA@@EK\r~trvܿ|xm`O<0)/?MWWQKB@K]qsg]XSNG<7:FXdjg]SLO]hnpnqv¼úkZQUX^gjpu{znkjn}}v~ui_YJ?;8CQg|а}~~lWC/*+7LRURJKIM[drumea\MC9/3=Qdgf_URR\jlnnnxǺrd[Y[WZ_eq{}rlpv~|sq~~wrngZG838I_vé}wwx~{cI6+-7ALPMLLRXY^en|}rolaS@2..:LZed\YVZ`cjjhnvzmgaYWQR_l~|rpryqqwxvyyzp`P906E]n}yϼ{nox~mP=429;@GEIPX`]Z\ar~yseT@-*0;IS\`[\_bebbcdn{¿þ|xpeYQLM[n~ysu{{ups|}urzucN=38HXgqz{v~̽tmmz|jXE><8869BJW_`^UR]ovgP<0,6>DMQX_aihc_WZdpʾufXJKR_s|~tux|uttywuwu`LB<@KS^emwwƬrqtvk`SI?50,2BQ]_\WOP_uvaL>76:=?CKXfmmg]TOVgw¹̺uaQJO^jtzxtqvzxuw~~~~z|}k\NJIFIMR]ky}ǩx{{xqm_J<-'*4JWZZROPUi{n\OEC;787APbsrj`QNP\ox~ij~kYSR^jlqqptv{tsx{zvs~»}rg^WTLB@BN_sռ~r[B0&(2@MRPMKPYcoz|k`YPD7/2:J`oul^TMPYbloqxrg]^cglijos|}topuymjqyvrlj_SF8:CSiw~˺|w~oT:/*1<@FGFKNYbdjq{slbO?.)3AVhnodYUSX[[`cjx|qlhifdeekt}wqlmt~zogiu|uvzxo_L?7;J[jrv|tv̿}wwiS>457:99@EMX^b__kztcL7-*6JXdhgf^\]ZWQS^i{ttqic]_gn|{njmq|tkikzzxy}o]I@=@OZbgit|orİzxz}iZJ@=73//;FS]]\ZZh{yaJ7/.9HRZ_djihdZQKM[mï}ysg\X\iv~ulhnx|vnmryz|~o\MDEJOVX[cn{trͺ~x}|qc[OA7,(,4GV[[VU\e{fO?457;EKUakusg\NIMWm~ȱ}pdWTZgz|qmko{}xyxvzxy~½~xn^SLLRPOQS^l}{{}{vpi^K8+%)3CRWVSSZgxqZI@:622;GXkx{q`SKMXgwžɻq_UPTcq|~xsopuy||xx{{uqxviaYUVTRNIMWg{ͳ}xswxywiYD.'(2@GOQOSYhyviXMD6.'(9Mew{xjYST]gnxõƼt^POS_krxuqtw|{wwtu|tkm|}sf___]XQLGJWgxһwokoz}q]H5+-5=BDGKQ]kwzqi\K;*,F_pxumb[^bfilt·¾s_ROW]djmqux|umnt~riky{leacgaYOFGMYjt|´shio{~r^I=459:<:2++5Kdw|pbVRW`hmt±s^PKUft}wvwupjiovtkp|rd[UXZWTNMQVdouvrtx|ͽwtuy|o\G;207:<:9CO^r|skbO<,#*8Pjwztic\[__`ai}ǻn[SR\jrxz}|ri`bn{{niq~nd`]^\SLHLU_inmkjoy}uuz|kXH?<;;8314?Qbpz~wjS:)#);Pcpqolihe`[VYdx¿ǹqaYZ\chlv~}oa^anvpmt{qjhf_WMEHN[gijfdio|ſ|xxxiYOHHE<4-,3=P`ipvnX>,&*9HUahlqrtnaXQUbvʻxkb^YVZam}pc_cn|xuvzvspk_RHDFQ]gidabgr}ƶ|~|qg^VTQJ@2+*1?LX`emz}t\G6,/5INTZbrxeQC94214;H\p~|reZZdqȾ{kYIADUm~snprsstw{|ueSFAGRZ`bbceoz{}Ͼ|rhc`de]SE9318@DHHMZkwhZOH>2,(.=Rl}~rhcbjrxɳr\F=@Nex~zyuqmjp{~vyweSIFIQVYZ[bkt}}yuzͽznedfhh_RD:9;>AA@?DUk|sib\SF5'!'9Pgw|xqlmoqstv~ǷuZG>CP_py~vleem}xvzvcVNNNNQOQYds{|{uqszǹvkhjnle[LB>@FD@<69CUm~spnlgYH5# (;Qanspqrvysolmyļt[MGKRYenwrd`eqzuzte]YVOHFGN]ly|wqmnvºvprtsj^RHDGJIC922:IZkyvqtxuiWB0%&3BQ[biou{|xndcj|¿¿taWSOPRZjzyiablxzxzwmiaUI>=FTepuskhjq{ļ~ypbTOMNPKE:006CPYeo{ywytcN<305=DLS]kvwnb^erĺzmbVMIM]t~offlruuvvx~ym\J=9@P_ikigdhpvwusxĶte[TUWTNC9317AHMQ[l|zjYKB@=;<=ERbu~~wkc`bnyǷ½ubQEGRhzqmonljipv~|iTC<=IW^babfjptrmgiuɼ|md_\^ZQF;78:@BBBFUm|qdZSNIA748FWjy|vmecfkquy;v]LEK[o|wqib`ep}~zcQEBFLSVW\blturjbafv´wohge_WJ@<89CToskfa^WL@208G\ksuojikqrpopzȺw]NIO^kv~}oc[]er{xzdVMKJHHJOZfrxtkb]`ixпztrpi\PE?@DIIA836AUlzpjjjf\L<2/8IZeijjkouxvnikvĽzeUPTZagp{qb\^ht|~zuw~}oaZTKD=@JXiuyvkcadnw{{vj[KCADKMIB626AScswpmmpj]L;43:HS[^`fmu|{vogjuobZWUUX`pwgacktwwurvyqh]OA87BTgtxvpihlsxy}Ⱦ{m\MBBHMNJB;69CNYcn}{rprql`N?66>BIMNNMSby|thXMEBDCB?;?JYku{{usu}ŵziTC?FXl{zridfmxt]H=:AJQZ`fp{wmipųpbZVSNFA;97>M^kqrqos{}gSECLZhsy~zlcbgrzp]MEDDFHLVcs{nhis®~sje`VK>89?JQRND?DPf|}k]USURJA75;FVbhifipy¼wbUNOW]djp{rebfovwwvw|maXQJB>=DUhz|qiioyҼ|wobQB76>HPPKD>?JZkztg`^]YPD95;FR[__^ajw~{}¾qd^\YYY\erukfiorqlkpzzqlaRD74:I_qyztokjpsv{ɼ~mYF;8>ILLF@?AIU^hr~|rlkg^SF<;?JTVXVW^fs||zttzƿvpkcYST]l}xqnoqojebgt}s`K:14ARclnlkmpqpljn~|fSE@BFIFA??DLQUW]j}zxqfWIB?DLRTQPSYdouwspqvzoaSOUbu}xvxuog_]`k|r\E85;HS[`chmswrjb_i~ôxcVMJHDA=;?ENRPNNVh~q`PFDGMPONKMU`jooljlt~ù~m]RPYhw~xka[\cnzq[I>=BGLOU^ht{{se]]h~ïyj_YQI?76:CMSSMFHSgn\OHINOMIFJPZfkkfcfmxý~k\UU^jrwwx}xj`]`iptx|r`SJGECBDL[jy|sg_`j|Ű~vmdXI;12:FPTPKEGSe{p^SNNOMGBAGR^giea_dp}¼|k_Z\afjkmrzxlebglnnlq|th_YQH@:;DTix~|tlffoy͸{p^L:008FOQOIGJTdrue[USNG@:;CQ_eeb\]co}ý|mc_`dcaabkv}snmprojeepvpkf^PB75>Marz{wsrswz}Ŷ|iS?317AILKHIOXbks{of`YOC935?N[bb^[\doyļxngefea[X\et}wuxzwqg``i|zwuvqfWD75;9NX[YVX_oqZJ@>??@@CLXgopkc_cmþxl`YY`jopolnt}|qljknmkjn|~sg_ZXSKC=>HXjy}{tnnr|ï|vgR?/*/:HPRQPT^lz~iZQLG@:8=HXgpoh_[_iv|ne`bioqniilt~wqoqspkc^bp}tnjhe\PA88@P`kqomlnuz}¶vaI8019@EGFJP\jsy~zmd\QD816BSclmg_]_gpvz}tifhnqplgflt}{uqrvzwnbYYdvvrssqhYI;7=HU^bdfjpvzyvx·q[G<9:<<;=DLQUUYblv{ztnqλo^QGD?9416AO^fiijrwbL:23=LW]_`cgknlhdep|tqstpidchqz}volqx|rf\[`kvzy{~|qbSIFGJLKJLTapz|wplpֿrf]UL@5,+2AR]cccgq~eN=57>ELQU\entrlc_bmÿzxvqjb^ajv}}yqlmr|{qidchkosx~~yn`VPOQOKFCGRaqz{vonsŭ~vpjbTC4))1?OX\]^frmVF=;<=>BIVeryvlc]al}¼~xmc[X]it||volnu|zsonopnjhkvvjaZWXXUMEADP_nwyvssyлzxwvn`M9-*0FTevwpfTB/$$/BWfmnllmrwxyz}hYSU]dhiikqx~{tmlr|sf^al|{lcbege]RHFJQY]^^_gtų{w{sdUKFC?:537DVhu}|mX@-$'4DS]cgkrxzxtpr}þyg]Z]_```eny}tkhlwxmedis{wmikkf_TLILSXXVRT[hxDZxkaZVRI=3,.9J\iqtxkRFLQWaqo_TKD<637EXl{~yofbgq|Ķq`TQXgv~xrqsuupkijpvyvmecjztdYTV[]ZRIEDKU]`__ckx|ww{}vhVD947;>@AGTez|rhaUF8..8Kaqywpkijpux{Ǽk[TVaox|{xyy{{vnfbfnw|yqe_bnna[Z^_[SJFGLSXXVSWao}Ÿ|{scSGA??<868BTi|zujZE4+-:M_kponnrturopx¹~i\X\dkprtx~~sg``gs{|vkcagt}ndaba]ULHINUXVQMNUcr}̻{o`VOLJC:2.3@Thwp\F4-0?J\t}smjf_QA0'*7J[ipruyƻq[MHMW`hnrywj`_fq{~zslms}tcXSSROLIJPZdhe^XW^k|ȿztsrneZPKKNNJA96=Lavxtttm`N;.+3?MX_elv~y}m]UTVX[^fq~nc_cmtxuplnu~shb^XOFACKWbgd\USXcpz˼|sh[SPRUTOD947DUer~~{}~ykYG;68?EJOVap~{uvĹ}pgb]WSS[j{rgceknmkhiow~ysk_QD=?IU_a]VPPU^fkouózk^WVZ\YPD958BMX`ivq`QGDCCBABJXk{wrt}ʾ|th[PMTcwxoklljea`enx~|xy{kXG>>FRY[XRPQV\__^bnʼse^]`a\SG>:67AQcpvvtuyʿwbSOS`mv|}~}reYUXbnvxuqrxydTKILMLJILS[a`ZQLO\o·upnkdZOHFHLMHA<>J^wvmjihcWH;59DS`gjmqx}ŽweXUY`gkou|scYV[enrqnmr|{j]VRNIC@DLWbebXOLP]n~Ź~zumaTKHJOSPI?:=H\puomomdWG<8IWfs~zsrroeWI?=@FKNOS[iy~rkfb\VRT_o}qhegiifbcis{vpfXH;6:FVafd^ZY]ejnszķtbRJHNTVRJC@CLV_goz|ywodVJCBFIHGEHScuȺxtph]RJLWi{wsqqnha\^gt{o]J;6:FS\_^]^bgkkiiowcTMMQTSMGCEKRWZ\bnzn_SJGIKJF@>COar~ʻ~xm]NGIUfv~}}}ype\Y]hu~s_K>:?GOTVW\ckpnicaj|˻weYUUTQLFCELSWVTSZjzjZPMNQOIA;;DScovyzŸ|l[MHNZgpvy{|n`XYaluzzz{r^NECEHHIKR]iqrlc\^j~Ƹwjc_[SJC@CKTYWRMNYmvdYTUWUND<;@LYchjnvƾxgYRRX_dhjqzue[Z_gmpppu|k^UOLGB=>GTcnpkbZZapº|uofZLA=AJSXVPIIQatoc^]]YQF>=BKUZ\]akyqe_^_`^]_gtykb_bfgfdfmzvlf`WL?65=M]gjf^YY_is}þsbPB>BKSUQKFHO\juzokid\RGBCIQUVTSXcs·xqnmjd]XYbqyoighfb\Y\fv~zwqdSA529FU^`]YX[`ehkq~ømYJDFLQQLHFIQZbgmuzumaTJFHOUVSNMQ]lyƻ{{zul`VU\jy{urqpjbWQS]m}taL<57AKRUTTW]cec__h{̾~hXOMNNLGCDJRZ]^^cpxhYMILRWWRLIMWdovyy{ƿvh\VYcpy}}zxy{{ui[QNUaozs^L@@IUbjjd[UXeyƷtle\QE<9?IT[[WRS]nydWQQUVRMHHMV`eedelx}pe_`eikjijq|wi]WX^cfgjq}qe\VQKC:7:EUckjc\X\hwʼypcSC97>JUZYTRU^n~k^XVURLECFOY`b_]_gvymfceiifb`cmz|ofbcdda^_gv}rkfc]SF:36AQ`hjea`dlvƿ|lYF:7=CNY__[XZdrĻ~sjefikic\Z^iw|tonomg_XW`pwqnnmgZJ;35@O[bdccgmtxz}ùs]J>;@FKMMMQZfpvz|vndXJ>8:COY][VUZesúymffjnmh_XW]iv}}xuvxysh]TT]m~xporutl]K=7:CMTX[^dmuzyvu|̼t`OFDEFEDDIS`krsru}zkYG:6IXemomlqlUC::AJOQOOS[enrrsw½}qmossof^Z]clqqnlov{n`XX^fmrv|xsuz~{qcVMJIIFB@DN^mvwrlip˵~ric\RF:46@P^fhfejv~eQEADGIIHJQ\flmjgju|wwxvpg`]ahnpmhfir}}qf`^adeego|z{|sg^XVTOF=79CScmokfflxŶ~zul^L<33LY`b`_bju~ǿ{jTB76?CFFFJR_my}thYI=8=JXcfd^\^fpx|~xlgjrwxtlfejqwxuollpuunbVOQ\m~vomqusjZK?:GUerxzx{~lXE:9ANY__]\`fmrsst|skkpvwtmhgkrwwrkgipwzvl^TPUamw~sprvwqeWKEDEFC@>BM\iqrnlp~Ծuh_XRJ@749FWgpsstzoXF<=DLSUVX]emqqmjmxuopstqlgfjrxxtlfejt{}wk`YW\chmqxvtwxvnbWPNNMHA:9?L\ionkkq¯wpke[M?307EUbilmr|u^LCBDGHILS^jrtoieiv|vusoic`cluzyridelu||vmeabdeecelz|z{yri_XVWWTLA97>KZfkkjlt̺yvupeUC505AOY`cgo|kYOJFB><@JYhrupieitztlaYX^hsyxqhdfmuyytmjjlnke^\bpyod[XY]_ZQD;9@KX`degmxƻ{yz|xl[H:59AJQUYam}tg]TJ?516CUfprnhglwĸwi\ST\hrvsmhgkrvwsnkmqvuodZW]l~zl`XX]bb\PE>>ENUYZ]cn|ʿyz{n]LA>@DFHIP\m}tk^N=0+2ASbjkihkr|ĸxfXRU^iopmijnswvqkgjqy|xnaXX`n|xh]Z]bd`WLECGLPQPPVbqdz~xj[PJHGD@=@K\pucM9-,5CQ\`beksz~vcXV[bghgfipwzxqhcdlv|{sh^[^gqx}tf`adeaYPJILPPMHEIUeuȰ|pe]XVQI@86>Nbsw`I925=FMRW^hs|~{vtzÿrfaaccb`agq{{rhabisyysjc`chlnoszrljjgaXPLNRUSLC>@JYhswy{­~skgfc]QC627EVeouzoYH?=?ABDJUds|}xplq}ûvqmic]Z]gt~}shbcjqtrlgdeilkgegr{xtlaVOOSXYSI?9;ER]dgio{ϾuqprpgXF837ANW_dmyzhZQLF@;:AOaqzztlimxƼ|rf[W[ft~tlhimpojecdjnokc]_izrcWQRW\\UJ@:;BKRUVZcqǿzvx{zqbPB;;AGLOS]mynf^RF:48DWhsvrmknu~n_WXboz~|vqoprqld^^bjqrlc[Yap}l]UUZ^^WMD??DIJIHKUdwɸ|}yl\OGEEFDBDL\qyreSA42:IZflmklpv|~~~Ļ~j]Y]gqvvtstxzwpf]Y^gptqh^Z]gt{j^Z\_^YQIEFILJFA@FUgxι~tf[TQOLE>9=I\ryhR?54=JU]adipx~{vv~~la^bgkllnszzobZZ`jqrme_^clty||mdba`ZRKHINRQKB<=FUft|ӽznd^\\YQF;6:GYm{lWE;:?FLPU\gt~yss|qheedb`agq}|ob\]ckomhcbekprrqt|tmjf_VLGGMTXUMC<>GUblsxðujcabd`WI<69ETcowr^NDAAAABFQ`q{uu}ö{smibZTT]jyticchlliecekqtrmijs~ytmbTIDFNV[XQHBCKU_eioyɹsgabfhe[MA;=EPZbisudWPKF@:6:FYl{|xy˻~xnbULLUeu}unlmnmic`ahpwwrjegp~scSGCGPXZVOIGKRX\]_esºqfbeijdYMDADJPTW\h{uia\VL@5/3ATgu{{y{;sbRIJTcqxzwtsuvslc\[akuywogdisubQGFKRVUPLKNTXYWTV`qƽqihjkh_UMIKNONLLTd{}tolg]N=0-4CUclpsxɽs_QKOYckoprv|}th]X[dovvqifhoys`SMNQRPKHJOV[ZUNLR`svrqoiaWQPRUTOGCFSg}{xxul\J913DIMQYfuž{neba_\Y[cp~qd\\`fhgdbemu{{wst{zqkf_UI@>CMW[XPGCEO[gowƵrcYVZ_a]RG??GTbmv~o^QJHHGDBEN]p||ĵ}xsmd[TU_n~siccdda\Z\cmvzxsnpy}vj[K?=BLUXTLECFMTY]bm¸zi^\_dd_TIBBHPX^cl{ug]XVSLC<>DMTX[ajw{mc`addcdhq|scWSV]cfecelv{{zlc]XRI@;78BOY]ZSMKPYdmuǸxfVLKPY^\VNIKS_kt|~}xobULIJLLIEEL[n˾|urpme[ROUcszpjggfb\WW^kxxtv}|yxul^L=68AMWZWSQSY_dgjqķ|hWNNSY[XRMLRZbgkoy»xk^TOPQQLD??GXjzzyzxrfXNLSaoz~|xtstrlbXRT]kw~~zuuz||}raM?9IYhsz~ʽ|}~sdVNOXcmrttuy}}wk]SPVamuwvtv|}yzq_NC@CGIHHJPZcge_Z[ezƼ}lb^\YSMHIPYaca\[bqqb[Z]^YPE==DP[dinu»~}n`WTY_eghjoxtdWQS\ekmmnt|{vx{k\QLJIE@=@IUafe]VT[jþtnh_TJDEMX`b^XUZgy|lcbcc]SIBAFNUY[^ft¿vjb`acc`^`htyj^WW[`babfo{{wysha\WOE;57AO[a`YRPVbqĸwiXJCDLW^^YTRWbqxpmlh_TKGINSTRPR[k~ƽzrnnnke]X[esxlc^^_]ZVV]jz|zxsoleXH:23=JUYWQNOU^gnuȼt`OGGNVZXTPQWaksy~zulaVNMQVXUOJJSct´|xxzztj^WXanz~wojhgd^UNLSar~~{z{zseR@64:DLONLLPV]`acjyo\PNQTUSOMPXahklowtfYRRV\\WOHGMZiu|Ĺ~|~re[Y_isxxtqpqrneXMGKWft|~}}}z}tbN@:<@DEDDGNW^_\YYdxǻo`YWVSNIHMV`ghfdhtp`VSW]_[SKGJS_hnpt|ý|{nc^_fmppnmpvzzrcTJHO[fnrtx}y{q`QHDDC@<;>GS]a^XSVcxĻuke_WNFBEOZdge`_fto_XX\^\VNIJPX_cdflx~wlecfjkifehpz~teWONT[adgktyw{}pcYSPKD<54;HV_b]WSXdvƿxpfYK@>DP\dea^_gvte^]^\WPJINU[^][]fu|skhilmjd^^do{wj_YX[]\[\bn}yx|yofa_[SH;219FT^`]YX]hu|o^L@318EQY\[Z]dnv}ŻwcPB>CLTXXX[cny»|slbVJBAGPY\ZTQS^m~Ǿxngfkqsog]WXalvzxsonopmdZQOVeu|skhimok_O@66BFGGIOYgqwvrrzʶxfYRONLHEGO]lw|{yzycPC@ENTVSONR[fosv{»|nhiotuog_]`fkmjggks{~xl^SPT^gnruz~qjjouvqeXMHFGEB==BO^krrnko|ųuib]XOE>=EScpuust{t]NGIMQQNKMS\eijiluxppsvuohcbglnlfa`fpz{qdZVX]acdhp}xposwxrh^WSROI@748DTbjjgeitytneWH<9?M\gllloxm]USRQMHHLU_ffc_`jz}{|zunhfjptslc]]dox{wmd^]^_]ZX\gw~yy{|xqha__^YN@4/3?MX]]\^eq~¼~q_L>:?JU\`adlw|of`ZRIDELXbfd^YZcrvmhjpw{xod^^entuqjecdec\TOQ]nzphdehibUE702:DLOPQWamw~ʾlXIABHNQSU[eszqeWIAAIV`ec]XX_kwynhjrz~{sibbgmqpkgegkmi`TKKSctrifinpk_O@87:@CCCFNZhrwwy̺|iXNKKKJGHN[kzxeRD@EOZ``\XX^gouxztjiow||vmhgjopmgbafmrqi\PKMXeqy}ymhinrqh[MD@AA@<9:BO_kqqps~̷yj`ZVQJC?BM^o{~{dQECIQWYXVX]eloonq{slmrxxuokknrtph`]airvrh\SPT\cimqyxnkmqrmcXPLKJF?625@P_imllrϻzpjf`UI>9>K\kuyz{iUKHKOPONQXbkonigkwxrrttpkhhmtxvoe]\bksvqh_YY\`aaafq{spqroh_WTTUSK@504?O\ehhksözvtqi[K>8;GVdlpsysaUOMKGCDIUblpnhdhsyvtoha_cktyxoe^]bkrsoicacfeb\Y\gwywvslbYUVZ][RE936@LW^adjuúzy{yqbPB;=GR[aflv}nc[SJ@::BQ`knkfditźwlaYX_juyvne`agmpnjeehmnkbYTWcs}ui]UTX^a]SF<8IU\`adjrz|{oc`dkqsqopsxytj^TRWajnjc\Y\dlruwzxh^[\^\UNHFHKKG>76=M`rɱ~sha^^]YPF?AM_txcOB>BHNQTX`kw}xv}rifhjjhfhnw~~wj]TTZbijf`]^djmmklr}zmfca^WOHGJPSQI>65>L]ku|͹znebcfe^RF?AK\mz}hWKFFGFEGMZjx}wv}¸yqmkhb][_iv{nbZY^dgfb__djookeciu~uplg_UJDEKSXVNC;:@LXbjq{µykbaejibVJBCKWdnu}o`VQMGA;;BQdt~|xy̿{wqh]TRWds}zpgbbefe`\\`iptpib`er|zvobSGADLUYWOE@AGOV[^erwibchljbVLGIPX^bhqqhb\TI=43=M`pxzxy}³wiZOMTboxyuokjllhaYVYbmtuof``gr}sbQEBGOUVRKGFJOSSRT]nĶwjfhllf]TOOSWXXX]k~|uqmfYI:13>N^hnptzygWOPYdmqpooquupeZSS[fptqicbfnvz{zzr`PIHMQRNJGINSURLIMZn̹zqoomg^WSUX[YTPPYj}|{uiXE849DOX^bitžudYVZ`egghmt{}xl^TQWajnlgddipuvtqsz~m^URRQNIDDHPVWRICCM^rʴ}xqg]WUY^`]TLIN]qudRD=>CHLOS]k{qgbbcb_^`ht~}qbWSW]cecaaemsvtokmvwkd`\VMD>?GPWWQF?>FTcq{xj]XY^de_TJGKXgv}l\QKJJHECGSdvȽ}vspkc\X\ft~re\Y[^^\XX\eovvqjgkv~xtpi]NB<>GPVTLC==DMW^eo~̿oa[]chg_ULIMV`hovsg_[XSJA<>J[mz||´vi]VXbp|}ulecca\UPOVamuupifiswiWG>>ENRQKC?@EKNPRYh¸|kcbfig`WPNQW[^_cmypkif^RE;:BQanuvwyǺsdYX^jtzyupnnnjaULINZgprnifiq{xeSGCFKNMHCBDIMMIFHSg˽|ojjjg`XSRV[][XV\jwttsm`PB;=GS^fims}qc\^dlpqooquxul]PHIQ]gkjgfiqy}~{yzwdUMKLLID@@ELQQLD@DQf~пytpjbYSSX^a_XRQYi~}xyzxn`OC?BJQVY]eq¾rgcdgigffks{{o_RLMU]cdccfnw|}xsqvwh^XUQKC<;?IRVTLC?DRdw}th\SPT\bd_VPPXhy|~~yn_QHFHKMMMR]n¹umjjhd_[]er}seYTUY]^\[^fqz|uomr|xnhc_WL@87>ITYVOGEITany²{jZPMR[cd`XRSZfs~þym`UOMNNKFCGSfy²~wsrpkbYST^ly~vkb___^ZUTYdq|{tmkpz}vrpni^O@66=ISWUPKKQYbhnum[PNS[``\VTW_iqvzvi^VUUUQI@=AObtŵ{xyzwnaUOR]jvzxsmjjjf_VOOWdr{|xqmnt{~zutuxwpbP@88?IOQOMMRY`ccdjyȾo]SSW[\YUSW^flnnpw½rd\Z\]ZQF=:AP`nx}ö|z}zm^SPV`jpqpnpsuri\QKOYgrwuqoqv|~|vqpu{|q`OB=?DHIGGJQZac`[\ewþpb\[[YTPOS\eklhfit|lb^`caYMB<>GS^flr|Ǿ~{~wi]WX^dggghnu{{reVMLS^hmmmnrz|unmr{{l\PIGGFB?=BLW`b^WTYg{ĻumgbZQKIOZekje`aj{vjfgig_SHBCIPUX[am~¾}qgbbdec`^ait}xk]RPTZ_bbchq|unlr{~sg]WTPI@85:ER\^ZSOR]nôyn`SIGMXbgfa]^gtvqqpkbWOLMQTSQQVbtĿvpopokd]Z^ht|~wlaZXZ[ZXWZbo|}upqw~}tmjgc\PC95:DOVWSONR[fpyö}l\QOS\ceb^]`hr{~{vnd\WWZ\[VPNR^n}¾{z{|zsi`\_hryzungdcb_YSPS]jv~{vtv{zussspgZK@;=DLQQONOU\chkq{Ĺ|j^YZ^bb`]^cjrwz{~tia^_cdb[TPRZfr{}~zpfabhoturnlllkf^VPPWbnvxwuux}|xttwyyrfWKDCFJLLKKOV]accdkyĺ|ngddda^\^cjqtutu||pfbcfhgb[UUYbjquy}~xnhfimpqommostph^VRU\dkoqrty~}xtsw{}yqeYQMMMLJHIMU]bcb`bkyǽwrnjd_[\ahpttrqt|{oigikkga\Z\afjmosz~}volmnonljjmswwsja[Y[`ehiknt{ztrsw{|wof^YWURMIGIPX`ddbadlyú{vnf_\^dkqsrqqu}}rmkllie`^_bgijjkpyzurqrrpmigintxytmfa`acdddfksz}xtrtwzyunhda_\VOJHKRZaddccgnx}tjb_`ekprqqsw~yspolhda`bfijighmu|wtrsttqlhfhmswxuqljiihfcachpx}~{wtsuwwuqmjhgfb\TNKMSZ`cddfkqxyogccgknoopsxyurlgb`beilkihimu~~xtrsuvuqlhgjnsvvtqpoonkgb`bgnuyzxvvwxxvsolkklje^WRPRV[^`bdhnty}|sliijlmmmpu{|unhcbdhlmliijov}|wttuwwuqlijlprsrqqrttrmhcbdiosuvuvxyzxupmlmnnlg`ZVVWZ\]^`dkqvy{|~wronmlkjmqw}~vngeehkmlkjknsx|{vuvxxwtpnmnprrqppruwvrmheegknpqrtwz|{wsomnppokf`][[\[[Z\`fmruvwz{xurnkjkntz}~unjijlmlkklosvxz|{yyzzxurqprsrqooprvxxuplihijkllnrvz}|zvrqqrrqnieba`_]ZYY]binqrsvz}xsnkkmrwz{|}{upnnnmlklnqtvwwxz}}|{yvtttuvtrpnoruwwuqnlkkkjiikoty||zwuttttrnkigfec_[YY\afilmorw}}wqnmoruwxy{{wusqomlmpsuvvuvx}}zxvwxyxvsqpqsuwvtrpoonljhgimrwz{zxxxxwvspmlkkifb^[Z\`cfgikoty~}wsqqsttuvy}}zwtpnmnpsvwvuuw{{yxyz{zxvsrstuvutsrrrqolighkotvxxxyzzzxtqonnnmjfb_]^`acdehlquy|}yvuutsstw{}ytpnopsuvvuvwz}~{yyz{{zwuttuvvutsstttroliijmprtuwxz||zwtrppppmjfcaaabbbceimrvx{}|zxvtsstx|~ytqpqrtuuuvwy{}~{zz{{zxwvvwwwutsstuvuspmkklmopqsux{|{ywtrrrrpmjhfeedcbbceinqtvx{~{xussux{~{vsrrstttuvx{}~~~|{{{zxwvvwxxwutstuwwvtqonmnnnnoqtxz|{ywuttsrpnkjihhgedcdgjnqtux{}yvttvx{}~|xvttsssstvy{}~~~}|{zywvvvwxxwvttuvwwwusrqqponnnprvxzzywvuutsqnmkkkjigfefhjnprtvz~|yvvvxz{}~{ywvtsrrtvy{}~~~|zxvuuvwxxwvuuvwwwvuttssrpomnortwxxxxwwwusqonmmmlkigggikmoqsvy}}zyxxyyz{}}{ywusrrtvy{|}}~}{xvuvvwxwwvvvwwwwvuuuuusqonnoqtuvwwxxxxvtqpoonnmkjiiiklmnpruy}|{zyyyyz|}{yvtssuwy{|}~}zxwvwwwwwvvwxxxwwvvvwvutqpooprstuvwyyyxvtrqpppomlkjkklmmnprvy|~}|{zyyz}|ywutuvxyz{|~}zyxxxxwwwwwxyxxwvvwwwwusrqpqqrsstvxyzyxvtsrrqpomlllllllmnpsvy{}~}{yyy{~~|ywvvwxxyz{}}{zzyxxwwxxyzyxwwwwxxwvtsrrrrqrrsuwyzzyxwuutsqpnnmmmmlllmoqsvxz|~|{zz{}~~{zyxxxxxy{}}||zyxxxxyzzzyxxxxxxwvutsssrqqqsuwyzzyyxxwvtsqpooonnmllmnpqsuwy|~|{{{|}~~|{zyyxxyz|~~}|{yxxyzzzzyyyyyyxwvvuuttsrqqrtvwxyyyyyyxvtsqqppoonmmmnopqstwy|}||||}~~}|{zyyyz{}~}|zyyyzzzzzyyzzzyxwwvvvutsrqrstvwxxyzzzyxvussrqqponnnnoppqrtvy|~~}}||}~}{zyyy{|}~~|{zzzzzzzzzz{zzyxxwwwvutsrrrstuvwxyz{zzxwvutsrqppoooppppqrtvy{}~}||}~|{zzz{|}}~~|{zzzzyyyzz{{{zyyxxxxwvutssstttuvwxzzzzywwvutsrqppppppqqqstvxz|~~}}}}~~}{{z{{{|}~~}|{zzyyyyyz{{{zzyyyyxxwvutttttttuvxyzzzyxxwvutsrqqqqqqqqrstvxy{}~}}}~}|{{{{{||}~~}|{{zyyxxyyz{{{zzzzzyxwwvuuuttttuvwxyzyyyyxwvutsrrrrrrrrstuvwxz|~~~~~~}|||{{{|}~~}}|{zzyxxyzzz{{zzzzzzyxwwvvuutttuvwxxyyyyyyxwvutssssssssstuvwxy{}~~~~}}|||||}~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m27.bin b/applications/PoP/poc/res/music/m27.bin deleted file mode 100644 index 7472064..0000000 --- a/applications/PoP/poc/res/music/m27.bin +++ /dev/null @@ -1 +0,0 @@ -yl`Y\clty|||uhdeeedgkoqq{}{ytplnrigmnnmkkmplgpqnrvyz}{mmkgfddgltt{xrmlkjhbbib`gfghgghllgoqknpqnkjijmdahda``dffdahibgjjllnpszwz}wusstrniklccfddefhmuvy}~|wtqmlooimtporsqnljhjg`fgedgkpsrqtzsqvsrsrqtzzy~{xtpolbcda__bdhfeglgchhggijmuwv~}~tswvtswz~|}wyzxwvuty{w|{~}~z}zwtronqnjqwspttpligdg_Y^_]Z]afhfglpgflkmlmnrxvyz}~{z~x||{ywwvzyv~v|}{xy}~|~wrurqmkjikednrmlpnmhfeeh\[a`_]aejkikqrhkoopnpqvyu}}}}z~|}xxxx{vxvw|zxvy{~|zy~{orqpojjhihcirpmoonlghfje[bdcabgjmllovojppsqqstywx~y}}}{xyxzxvyt{zxvxy||zx{~rprpqkkjijegqrnoonojjikj_bgfdehjmnnovtkpqssqtuxxwz}}~}xzxzxu}{sz{yvxy{|zyztorqrmlljkegquppqopkkkmnadihgfjloooqwvlprtuquuxwv~~y}|~}xzxzwt~ysz{zvwz|{xz|spsqtmmlkleitwrrsqrlnmonafjkhfknqopszvlrruurutxuu}~y~{{xzx{tuvuz{{uy{~{y|~qssstnplnkenwxqstrqlpmqjbijmghmprnsw{qmsqvrstuyrx}~}{}{~yzxzyr{~ty{~yw|}y|zqvrtqpompghs{xqwusooqnpeeimnglnspovzznqrrurtrwvq}~~}{}|{|yzv{xr~|uy{zz}~x~ysvrtqqnnqgku}xryusprrooefionhmotooy{yorrqsrsqxtr~}}}|}{y{yyu|ws~{vx{{{}x{uwstssooshlv~yryvsrstpogghoqjootpoz|zrrrpsstpxvq}}||}|~}|wyzyt{ys}|wxz~|~~x}~wysrtupotklu}}ryxsstvpnighotmposrmy|{ustoqtupvxr{|{z~~wvyztv{sxzt|~|~z{~~z{{tqwnmu~v~}zy{zsvxoryzt{wuxzyrponoz}y}|~{}zrxsmt|yz}~vquwpnunlt|}rxysvz{somkjpwqqoppisxuronfflmfjpioy|~}~}x{}ywpjnpkhplkt~z}~xyw}yuy}zqomkjswqqnqmlwyxuupjmsqlttpx~~{vtrpv}vurrpkuxwtroghnngmqkq|~ywvtx}zxxyrz~|{rqwyrt{uw~}~y}y~~vz{y~ww{xpnmkmwtponphnwvurrjgnqlktopz~~|{yz~|~w{wry}wt}xw~~}{zvxv{|su|zt{usx}xnmljkvvpompjlxxwuumhntokurpz~}{{}y{ztz~yu~zx~}}zyuw~~uz|rt{ys{trx}xnmmkkwwqporjnzxxwwnipuomwrq{~~}}|}~x}yt{xvyy}}|zy~tx~u|{ru}vszrry~vmmnlnzvrpprjr|yyxwljrvnoxps~~~}}~{~wuv~~uzw|}}{|z|yt|yv~vryrxxpu|}rmnnkt|tsprojy{zzztjnvuluvpx~~}|}}{~{y}ty|u|w}|}zwvv~wy~tt{|qzvqw~|pnonmy{tsptnm|{zzzrjpxsmxuqz}}~|}~~}|~}{~zz{szzuzw|||yvuww|su|{q{tqx{pnpon{|tsquno}|{{{qjqxsmxtpz|}~{}}}}{}}z}zy|ry|t|v||}z~wvvyzut{~qzwpw~qnpqnz~utqupm|}{||tjoxumwvpx}|~|}~~}|z|}y}}vsv~s|~u{}z|zzyy{t}~xzsysuzpt}vnpsouxustulx|}~zllvynrzpt{}}z||}~}}z{~{}~}w}wr{wuwvz{|xuuxx~tv}{q|upy~porrp~vuswpo~}~~tjqzvmyvpy{{~{~|}}|zy{~y}~ust~tyuy~z{{x|v~t{w~txws}qr|zoptrs}vttwnt~~pks{ro{sq|z{}yz}~zy{y}~z~|zw|pv|r}{s|{z|y|y}|y}yv}~t{ytwzu}zx{yq|oq|}px{qw|y|{y|zx}x~yzuy|tvzv{zxy{q|qpz~ru}suy{|xwx|x||wvwtuywyzyy|rysnxts}tty{|xvx~|y{}vwvuuzyy{yx|txtnwur}tr~yz|wvy}}y{uxuuuzyx{yx}uwunvwq}ur}yy|wvy|}z{uyu~vuzzx{yx}uvunvwr}ur}yy|wvy}}y{uxuuuzyx{yx}twtnwvr}tr~yy|wvy~}y{}vwuuuzyy{yy}txsoxus}tsxy{vuy}y||vvvuv|y|zyy}s|qoysu}rt~xzzw|vy}x}xytx|tw|xzxz{s}oq|~qx{pv{x{yxyy}y~xv|~szytx|w}zx|zszns~|q{ypyzx{x|w|{{{yu~{s|xuy|x|zx|xtxnuzq|wpzyx{w}v}z|~{yuzs}wuz{x|zx}xvwnuzq}vp{yx{v~u}z|~zztzs}wv{|y|zx}wwvnvyr}uq|xxzvuy}}zztyt}wu{|z|zx}wwvnvyr}vp|xw{v~u}z|~{ytzs}wuz|y|zx}xvwnu{q}wpzyw{v|v|z|{yu~|s|xuz}y}zx|yuynt|q|xpyzwzw{wz{{}yu}}s{zuy~y~zx|{t{os~~rzzpv{wyxwyv~z~x~xysx}ux~z{y{}tpq{sw|qt~~wxyu}ty|x|{vvvvw}{}{yy}v{soywt~sq}wwzuty~}zzuys}wv{}z|zy}yvxov|r}wpyywzwzwy|{~xv{sy{uy~y{y{|t~pr|sx|pt~}vxyu|sy|y||vvvvw}|~|yy~w{toxxt~sp}}xvzu~t|~z}~{zu{s}xv{~z}zy}zvxou}r}woyyvyvyvx|{}yv|~rz{vzz{y||u|os~szzpu~{vxxvyu~z}x}yytx~vx~{{y{~uqq{uw}qs}~wwyu}sy|x||vvuvw~|~{yz~w|spzwv~rq|wvyt~r~y|y{}vwuww}}~|zy~x{tpyyu~sp~|wvyts}~y~|yzuyt~ww}}}|zy~yyuoxzt~tp|}wvyt~s|~z~}zzuzt~xw|}||zy~yyuoxzt~tp}}wvyts}~y~|yzvyu~ww}}}|zy~xztpyyu~sp~|wvyts~y|y{~vxuwx}}~|zzx|spzxv~rq|vvxt}sy|y||wwvwx~||yzxrq{vx}qr|~vvwtzsz|x}yzux~vy{{y{~w}ps~tz{ou~{uwvvwv|{~~xw}tz{vz{{y}}wzous|xoxyuxuyuy~{|~{yv}t|yw{~|~zy~{xxov}t}voy~xuxt{ty~z}}{zw}u}yw|~|~zy~{zwow}t}uoz}wuws{s{~z~|zzw|u}yw|~}}zy~{{vpx|u}to||wuws|s|~z~|zzw{u}xw}~}}zy~{{vpx|t}uo{}wuws{tz~z~}{zw|u}yw|~|~zy~|zwow}t}voz}xuwtzty~{}~{yw~u|zw{~|~{y}|yxov~t|wox~ytvtxux~{|~~|yxu{{w{|{y}~y{ouu{you~{uvuuxu}{|x~z|vy~wz||y{y~qr}vy|pr|~uuvs{sz{y|}yxwxy~}}zzzsqzyv}rp~|vtvs~~s}z|zzx|v}yx|~}~zy~|{wow~u|voy~ytvtxvw||}}yy~vz}wz||y|y}ps~vz{os|}uuuszszzy|}zyxxy~}}zz{tpz{v}sp}|wtvs{s{~z~|{zx~v}zx|~}{y~}{xovu|vnx~ytvswuw~||}}yyv{|x{|{y}~z{ptvzyou~|uutuxu~{{y~{|xyxz||y{zqr|xx{pr|uuus{szzy|~zzxxy~}}zz{rq{zw|qp|vtur~|s~zzy|z{xyy~~}zz{spz{w}rp~|vtur}}s|~z{y{z|wyy}~~zz|~upy|v}so||wtur{~s{~z~{z{z}w~zy}~~~zy|~upy|v|so||wtur|}s|~z{y{z|xyy}~~zz|tpz{w|rp~|vtur}|s}~zzy|z|xyy~}~zz{sqzzw|rp|vtur~|s~zzy|{{yyz~}}y{{rr|yxsh^fqtjjou}vnjh`hmilkf_hyvrmkvurrplaaliilnhgoumnyss{}sqldnnkljb^k|rgd]`kgegebW\gehkkehqtikrjiouqgnkafllb^abalmb^]bccsuuwulgq~zzzvvtpyvib_caapqqsqgdp~~{}pu{vwwtmouuilpggntngojdjqphgklmzyollrqs}qlv}x~ws|xw}ypwpimroeceeeqoe``fegvwxyvkhs}y{y|y~zy|}|~yx}||vow~v|uoz~xssqv~zos{wxzxpqwymnrihntoeliafllcadfeqtjeejllz}}~{pjsx{u~{qvwzvms~{yumlkkxyvywtigrpprrkioskfmhchppfhlcdkpidfjipzrkilqnywlp{y|~tyur{zwzom{~v|ymiifowsuuslclpmopmgjqpfjlefnsmgojejqphgkmmzzqmlrrt~smvx~ys~rt~wxwlo|zu}sjhgfrurutricnomoplgmrnfmkeiqtljrjhntqjkoorzropvty}qoy}zvtyqw~uyrjt{vw}nhheiutsusoegqnnppjjpsjioignutkpqimsvolnqpzxrptwuxnty}{szrs|xwwlm}|~zt|ujggepurutrjdnpnprnintqhoniltxpnvnlrxtnosrv}ursyv}}qq{|{~tuuqzzvxnly~}|tzxlhhenwsuvtmenroqspknusjnpjltysovqmrxwoossuwssyw{spy~z~vs~vqy{vyokx}}uzzmiigowtvwunfnsprtqloutkoqkmuztpwrnsywppttvwssyx|~rpz}z}us~~}tr{{wynm{~}v|ymjihqxuwxungqtqstqmqwtkqqlpw{tryqpuzwqqutywsuzx|pq|{{|ru}}}}ru~xyvlq}zxtljikwxvyxtjkussuupouxpmtomszzrvxpsx{tqsuu{uswyyvnuy|wqz||{xqxwzslw~x{rlkioywxzxsiowstvuoqwwnptnov|ysyvquzzsruvvzusyy{tow~y|uq}{|zx}|rpv{xt}|y~z|xqnjowtuwvqku}}z}~wuvuvwqpuux|pmv{yv|sqlqyuvxvrkt~~}{tvzyqoqqr}~upotuvzoipywpslep~xyru~{mhhflxwy||xpw~{|u}{{qjhgkvvwzzwou~~~~|xuxzx|qhmvxprnfm{}xwvonmp|~}}uu~}|~}|pqz~vutil{z{ws{ukiiitzy}}|ur}us|}y{qp~}wssrz{t}{~y}z|~{{z{{|}wuzz{{ohoxvoqjeoy{twrlkjo{|}|swwz}txxutuyv}zx}|w{~|zx|}wwxw{xsswv{~vjhpwrnphft}{|u{~rmmlt~}{s{~~x~{u~~wvuxvy{{zx}xw|{~~wy}yuvwv~{tqtwv{qgluwpqnfm~|~yxxpnnp|~~vv~~yzvyzwvuzv}y}~w{zvy}zyv{{uuwvzwrrwu{~vjirxspqiix~}x~soooxzu~}}~{xxv|wvu}|u}~y|wz{vx~zzvz}vuwvxxsrwvzxliqxuprkivy~uppov{u|}}~{x~xv|wvu||v}~y|wz{vx~zzvz}vuwwyxsswv{xljryuqrkjxzuqpox{u~|}}zx~ww|wvu~|v}y}w{zvy}{yw{|vvww{wstxw~~vkltysrrjm|~{}tqpp{xv~}|}wz~~|tzywuwxy{{{x|xw}{~~wy~zvwxx|vsvxy|qjoxxrsois|}xrqot}uz|~~~}~|v|}~xt~xvuzw|z|zz}wx~{|wzywxxy{utxx{zpkrywrsmjv|wrqpv|u||}~|~zv}|~wu}xvu{~w}~z}y{|wy{|x{ywxxz{utxx|zokrywrsmkw|wrqpv|u||}~|~~{u||}wt~xvuzw|{|{z}xy|}x{zwxyy|vtxy{|rkqyxrtojt}ysqpt~vz|~~}}}~}uy||yszyvuwyy||z|z|}||}}}y{~~{qs{~ywvosxtss}zw~{z~}z~~|||~}~zz~~~sry~zwxqryutsz|w~{~{}{}|}|~~{z~~vqv}|wxspz|vuswxz}}}{}|}~|}~|y|{rt{}xwvquxvuu}{x|{~~|~}|}~~zz~urx}zvxss~zvvty~x|~|~||}}}}|~{z}xrv|{wxurz|wvuwyz~}}}{~}}~~|~|y|zru{|wxvrx~xwuv~zy~~~}~{}~}|~}z{}ssz|xwwsvywvv||x}~~}{~}}|}~zz~~usy|ywxtuzwwv{}x}~~}{~~}|}~zz~vsx|ywxtu~{xwvz}y|~}}|~~}|}{z~vsx|zwxuu}{xwvz~y|~}~|}}|}{z}wsx|zwxuu}{xxvz}y|}}~|~}|~{z}vsx|ywxuv~{yxw{}y|}}~|~}|~~zz~vtx{ywxuv{yxw{}y|}}~|}|~z{~~uty{xwxuwzyxx||y||}~|~~}}}z{}{tv{|xxwtxzxwx~zz~|~}vvy{}u~{wvw}y~y}{tnotx}}pvu|yzsw{}{wxyzzz}y}ys}w}~|ztzyszsqr|z~}}xussvx~wx~wz{wxxyxz~zvsuuyzulyrz}ty|~~}xuv{|~~{y|yz{~||trr|yzw{~{t~}kvyzzywvvvytv}}{~v|tvwy}u{x}wkz}x~}y|yw|xtttvvnzzq|{tvsu|}uloux~xvtgq||{zzxnqyz|wivso|upspvuryxttjn~rgorfhlvxhkonvtm~qr}qoroxnlttw{quvfnpilgiu}~}tz|stmdyylo|srsowqmrprvksyq}|qnehy|}wuy{w~{r~klwnnomyonusvxipngwytwru{|wmdr}|zrznvvqkhtopwstwjsxq|xlmjqwsgkmhnnpxikxrrsr{}sqwsrxnqskz}uxqoz|iinkqmbswwsnkgr}omvut{povityqrnpxsv{tsmarwu}{zpr}tjpqnvonvju}tqkky{jnwtyzo{}vks|yqx~zuq{zruiivmx|sslm||tvxnpqi{yggtnott}pirsr{stxnx{uvnm|y~ot{v{ylwzfgwqmibj}}wzsnsimrkz~xxml}z}lpvpvumqvsnhcoy~{w~z{pqmgwwstlp}znuyquoj~tiuzzsmu~{u}}qx||}q|tsxqnfmyqwwpwonznwyqsmnrzikpjt{uxhn~z|wms~}xqyvt{nptp}|miy~tgovlqmfxqv{utnn}u~qs|vz{myjfsqw}||yywppq{ttwvy{mjz|{qv~nr}myugr|tpirt{tjvssugo~}wsz~wzvo|{gyqg{~wyprmr|uqrkvrhkmkqu|to}|kot}x{{}mpvxqm|~~fnrolpmnpfh}jzsixuq~y{tm|~|~~}qt|zxq~x|~}qsmZlyzpv~qoumpvc\wsr|y~w|ynnuvzt{wxmatvqo~~s~zqo{lntbccftrkdjrrryqfjus{zpdlnz}xw~{nffnyvstmg`lruokzmhyyvn^`nol~||or||mtqt~rz}qz}rvwjgs|xoo`]skkwflyyz{xunqjr|~~}zs}~{|u}xyx~rqs_`q{|{~}skszxudeeitqlmqrx{zzytzq{oh|{{vxzpo{ztj^ox~usmnkptnymi~zs}|x~uoutnl{{~x~~xqyzwst~~{xtbmomvpjtwu|lZjumvxw~}yuzqy|xw~nu~{wz}~wytil|kyvihegsxnmz|~z~pimsv{squvpn~uywxpkqw{~ru|wukl}yi_rwvwccqv{qjz~w{z}vw}|t~wrqzu~onrnlz|vuq{hjzpwtzgcjv}y|ycq~v~{}nyo|sv}yru~nouzwoimqrty}}xcgqmuw{gkrsp}vw}uu{}{~nvxws{|rkslktswqxtm|bhedux}xzqmmux{clsort|yuzx{rs}q}shuwmdo~jwkago}ykvvkedpyiuxuwksvfdpsnme|r{x{y~zhyh~|phdlt~{wnX`u~`atjojjx~zez{yt~uw{gxrmwp~xybkqtwjyw}yjh^_}~zgv{pqjq~nWwwzxsxutzt~nyppk}gfy~lu{v|q^`fv}zmziicglwqqt{mWzzvukx~vmoqvtcsxuxhgu|v}v~zqcixib~ujoij}zeuzw{}q~or{zfwr}ptfktvxsp}wok_cxwu{plhm}y]Yxxu}|}~~n}u}xrn}p~}owgr|vispcepu{u_spfc]l}s|ytmw~r_nvv{ttv~pzu{oj}s{oumf\mtqm}l`o}~uYoysxuh}wik~xpwzkw}^nsiwjztioi`w»}w}oMV_XWXLayzwnsQ^vigmVNdfgkjjwp|r|tmVH^b`_z|j{oQ^cZ\`U[mlbdrUk|cb{woridwupfmoVmxhHQgb`cXTok_a{hazlzz{~thormqcaupljbXtr^Vjpsxrg{xoppfgh_dupzu{pooUbjebbZ^noqulxo_pqoqlh~w~vqsxqu}zk|~trmZengjmtZn|s_^lkh^WXkorrrstvvmpt}}wt}xxqllwyzxomw~}virxvt~xe[noipvbjyxsx~`pzmTZh^^d_[oqsp{s^y~t_izxxylo~|~tho~ww|tq{y~qyly}|jv{ss}phrommfT_nmmp|k|uhgqjff_Xefmijqdywdgwqfihbwz~}sr~{|zwnpzxsslm}z}w}hswnmm_e{{tqjgunb^jgfro]lxvtqydqxl[_icenkbu|}|whzmv~yxvpx~up{xz}uuz{|vsthv|xytiu{|xlpzrjnmjg_Udnnln|qz|wjhqjgkdXhqtlwxlzoy{kirkl~~~{w|p~}y~ugwynqthq|~s}qovnjlgcxztpxubqrk^cjiruedyzys}rk{rkgljipsisvzp{uq}yswzt}wtv~yx~ynzz~|pxpyxttqs~{|t{qmuelohfeYbqpqsuv|rntmjng[mwupv|ruxvimwpm~|{{v|vr}~qr}rltrivr}ppskjpkl|uvu{pevskdlpstpgp~zys}oowtognmmuul{yutvx|sr}zq}z}y~}x|}pr|v~tz}wwypw{pz|wx{mykotifiaaqruvzpxnrpkmk_kytuuv~|wrjoxtn}|}|}w|}rr}}vvxpmuvjvx~urtlltspxv{uuqgvunhoyupsmr~{{u}olzyqjrpowxq~~stvwuxquxm~~|zz|~xz|qn~uyx~}xq{ry|yu}txoqujfkhbpuz~|pzrsskjkflxuxu{zqnoqwypx}z~{{}vpx|zvsnrxqr|zqsqms|soy{{rwmnytpp}ynsvpy}|yuxiuwnotrs{yv}ut~w|vwvt|}pr|~twyw}xws}x|{vxynu{x|}}ztt}w~|}{z|~}}}rv{uqnznlurqqzxzukuvwsx{zvsz|tvzqoww~{}rrwuogjjmuxx{~zo|~{qrqjwvst~zos{vu~}vxpsxrpuspvztxslqryouzsljmnpplhw}}|otxrprlhljfuvrsxw|tuzst~zvwpgltmoxxzxz}mjtspuvnuzxx}rx|yz|{w|ury{y}ww|yx~xigmjpwwvsxns}zqntst{~{}{~|z}zzxz~{|wuzztttq|{z}yy{|wtxywxv}|x{qnquolqtnt}xrju|vssuomqqqywxy}{|zvy|u{zy|u|~~}s~|z|yz{zzwnoxx{y{|}{vswsfkuyvtyqz}zz}|kfqsnx{{wwxruquyuxx{~{x}~ssxuxyuxzw~~uxysqswv}uq}{}}suqpstrnqwrttqrw~zwvwrosxutwz}}~{}{z|z{}{}u||zu|{~{yxz}wutlovy{|y~}~{zvtunfqzyvvyu|}~shnyur{||vyxxystzzv~yu}z}vpw{v{~}vu||~}yrxvrty{}|xsy~{~upttvturpxxt}uoyx|}ywwvqq{yovz|~|{~}}~|{~}vyw{x~~~z~|}{}x}urtonw{~}wz{ytrojt{yyv{x|zplszwsz|{wxz{~vtw|zyuw|}||sry}v~}}uv~~|~{xrwvux|}wyx|}|sowxvuxssxzx{rs}y{~zwvvrt}vmv}||~||~|~}|{{|xwvz||~{z~{{urtrnv}}x{}|soppsyz{w{{zvpquxzuw{zzw|}xwvy||}}~xv{}}{vsv}z{}~zw|x}{yvsxwy|vx|}}zvps{xvxxvvz~|}st{}x||xvwwtzyqpz}~~~}{}}~w|zy{yxzw{~{~~~{{~~uqttpx~|z}|~}rmqutx|{y|||~rqwwwzwuyzzx}}swx{{}~}~}}zxz{z~xvuw{|~~}{z|w||xwsvy{~ww~{~ztrr{zxyxzwyztw|}{y}zvwxwywsqv}}}{{}zw}wx|x|yxx~||~xvyyy}tsz}y~yszz{}zwz}||xsy|}{~}}xy}|}~~uv|~}{yqw|{{zyx}ztvwyz~{~{{x{|~~{wx{~~|~{}wy~~|~zxy{}xsuu{}~}~~}yyz~~{}xv{|z{}~|xtz~}}}xtxyz|yxy|~||vwy{}~vrx~z{ysz|z||ww|}~xsw}}||~zw{|~ut|}{wpy{}{xzx}wtw{zy}~~zzx{~yvz}}~~|}wt|~~{|yyy|urvy{}}|~||yx|}}ywy~~}{z~}{tx~~}|{wvy|}vvy|}|}}~}zvw|~yuv}}{|~{tx{z|zuy}xut{~|}~}|xx{}wsy~~}~ypw}{~|xzz{xtv||y}~{zy{zv{~{~~|vr}}}{yyzy}trv|z|||~{{zy}~zvx|~}{z~vu}~~~|{zxwx~|svz|~}}}|zvw~zwwz|}}{~uv}~|zzxwy}|tuw}|~}|{xw|~}xvv||~~}tt}}{|}zyz{~ztuy~{}~}~}{y{{xy~}||~|ru}|zwzz{zrsy}z{~}yzy{wuy~}}{|~ux}}~|zxzxyxru|||}{{wyxvz|{}~z~ztx~~}yyxxx|{tuy||~~{zzwz~}wvx|}|~~|uw|~}|z|zzz{~ytuy}}~~~}}~|yz~yyz~~|~}~|tu}~|zwx{{{usv}|~}~{yyz~yuw}~}~|}~ww~|}|{xx{x}|tsw~~}~~|zzy|{vw}}{~}{ut|}~}ywxzy}wuv|{}~~zzyx{{uvz}|}xtz~|}|zyz{{|~vtv{}}~~~|||z|}wx{}}}|~zsw~~|zwxz{yuuw||}~{yxz}zvv|~}~}~~}ww}}||{xw{{||utu}~~|zyz|~|wvz||~|~~xry~}}|wvyz{zvvz}{}yyyzwtx}}}~|sw}|}|yw{|{zsux}{~~}{{{{yuy}~|}~su}~}~{xwyz~|tuw{{~~|zxy~~{vvz~}~}}}vv|}|{{xwy{~|utv{}}{yy}|vvz~|}|~xsx}}||yvyz|~xvw{}{~~yyy|~wty~}}~~xsx}||{ywz|}wsuz}|~}zz{}}wuz~~~{~yrx~}~}zwyy{xtv{|{~~{zxzxvy}}}~|ysz~}|zywyz}wtuz||~}{zy||wuy~~~}{~ysw~}}|{zwxz|wuw{}|~~{xx|}xvx~}~}}xsx|{{ywy|~xtuz}|~~}{yz~|wvz~~{~~xry}}}}yxzy}~vtv|||~~{zy}}ww{}}~}|ut|~}|ywwzz~~ttw||~~~|zyz~xuw}~~{}tv|~}}|zxxy{{tuz}|~~|{xzxwx|~~~|~{sv}~~|zywxz}zutx}{~|zy{~xvx}|}~{tv}~}|{{xyz{~ytuy~|~}zy{~ywy~}}~|~zsw~}}{xwxz|ztty}|~}{zy{~vux~~~|}|tw}}||{ywzy{ytu{~|~~{{yz~xuy}}~~|~zsv}~}}zywxz|{uux|{~|zyz~~xvx}~|~|tv|~}}{zyyz{~zttx|}~~}|y{ywx}~}~|}~tu|}|zvwy{|vtv}|~|zyy~zuv{~~~~}~wu{~||{zxwzz}~vuv}~}~}{zz|{vv{~}}|wsx~}}}zxwy{}yuvz||~}|zy|~vvy~~|~{sw}}}|{yxzz|yttx}|~}|zzyvy}~~||ut{~~~|zwvyz~}vuv{}}~~{yy||wuz~~}}~xux~}||zxwy{|~xtuz~~~|zy|~wvx~}|~|sv|~}||ywxz|{vux|{~|{yzyux|~~}~ut|~|}{zwx{{|utv||~}{{z~zvw}~||~vty~}~}zxwyz}~wtw{}}~~|yy||wvy~}~|wuz~~|{zwwy{~~xtu{}~}{zy}|vvz~~~|~ysw}}}|{yvyz}xvvz}|~{zy|}wuy~~~}ytw~~|}zywy|}ytuy}}~|zz|}wvy~{~~ysw}~}}|xwxz|~ytuz|||zx{~wvy}~~~|~ysx~}}|zxvyz}xuuz}}xla`fjkqw{|xth_\]^^clpqt}zsporuxtlilpljkkfcbgmnstu|}ylc_`_`empou~yqkebefilfbbgjhjjidadimlmlkmloqrl`]cedc`_[[]]a`ZZ]egjsyzx{}ztnjgfegbZY\acgpvuuy~~zxwqifhmmllijkkoqrh_bhjiiiffhjmpmiinstx~}~|~~{{{y{{xmdejihfc`]_`cf`\]aghov{yx|{tv|}||zxvwyz}wstw|||yxy}}z|}zzysmjlqpomjllmoonc\_efddb_^`cfieabhlot||{~}zy}|y}{yusqqvy}~vtswvrrqmfcfjkkighijlnnd\^egfgedcdhjokfgjpqu}~|~}{}}~|wz}{wtrnnrtxzuppstqppnfcdgkjihgjjmppka_fjjjihefikppjikqsv|~~}}~}wwz{vtqnmnsvzyrpqtsppojdbfkkkjhjkmprqgacjlklkihjmpspkkotuy~~|}}}||vx|zvsqomptvzvqpqurqqojddilmlkikmortqgcgnnonlkjloruolnrww}}|~~~|~xvy{xtromnquyztpqttrqqmgdflnnnlloosuvoeflopponlmprvupnqvwz~{{~||~|vw{zvtqonpuw{xrqsvtrsqkgfkoopmlnoruwtifjpqqqommoruwqnpuxz~{{~~}ww|{wtrpnpux|ztrtxuttrmggkoqponoqsvxulgjpqrqpompruxspptyy}{z}~|xx||yvsqpquy|{trtwvuutniilqrqqnpqtwxwmhlqrrrqnnprvwsopuxz~{z~~~yy}}xvsqprwz~{utvywuvtniinrrsqprsvxzvlimrrsrpooqtwxrpqvyz}z{}x{~|yvtrrvy}yutxyvwvsmilqtssqqstwzyrjjqsstrqnpsuxupprxy}~|}~yvy~~|~{tv{}||zxvwz|{vux|}}{z{}x{zwutvxxqmsz~zvuwy}{usu{{||~|tuyywvtqnpruwplkotty}~}{~}yxz{~|usuz||}~woossrqnljknqsojknstx~~{y{|yyx{}}utwyvtronpty~zxz~zz}}|xtqoptw}}xvx}zz~}}}zwxy{}xrpswwy~~{xy~}zzz|ywz}{zwuuu{}~~ywzyy~||zyz~~}{}xuwzyvtqopty~}yz~{y{~z{~|zy}{vw{}|~wsw{||zxutvx{{urquxx}{y{~{xxy{~{uuz{xvtrqtz}}|}}yx|~~~|}~xuw|~~~{{}}{qpuyxwvtqrsvywqnostvz~|ww{~yyyy}zux||zxvttx}~||xy}{~~}~|wux|~~|yz|}vopuxwvtrppsuxtnmotuw|~{wx}|zzy|yx{~|zyvuvz~~zxz||}}}~xuvz}}}zy{|~{qnrvwvtspprtwwqmnstvz}}xx{|{{{}xy~~|{xwvy~~|xy}~z}~}}~zuuy}}}{yz{}}soqvwwvsqpqtvwrnnruvz~~zyz|{|{yz~~{ywvy}~}xx|y|~}}|}{utx|}}{yz{}}topuvwvsqprtvxsonquvz~~{y{}||}zz~~|zxwy~~|xx|}y{}}||~zuuy}~}{yz{}}sorvwwvtqpstwxsoosvw{~{z|}|}}z{~|zxwz~~|wx}|x|~||||~}xuv{~~}{z{|zqpswwwvsqqtvywroquwy}}zz~}}}}z|}{ywx|~ywy~xy~}{}}{}~~}wux}~|zz|}wpqvxxwusqruwyupprvw{}z|}}~|{~}{xxy}~}xwz~}xz~|{|{{~~}|vux}~}z{|~vprvxxwusqsvyzuqptwx||z}}~~|{}zywz~~|ww{~|wy~|{}{z}~}~|wux}~}z{|~wqrwyxxvsrsvyzvqpswx|}{}}~~}{~~|yxy~~}xvz~vprx}~zz}~|zxvtsu{x~}yxvux|~|w{~wz}}|}}|ywvy||}||z}z{|{zwvwz}}yx{vz}~|}~}~~}|}zxy|~}{{xvvtsrrv}|st}{vrstv}}|~}~|{yvtru||x{xwuw{~{x~|wz}||}}{xvv{{}}|{{~~y||{yxwy{}|xx{vy|~|{}~}~~~|~{z{}~|{}{xwvusrsw}|ss||wsstv}~}~}{yvtsu|}w~|ywvw{~~~~zw~}wy|||}~{xvw|{}}|{||y}}{zyy{|}{wy{vw{}{{~~~~~}|~||}~}z{~}~ywwvtsruz~zru}|xttuy~|}|{yustyzy{ywvy|~}}}|xy{wy{|}~~zwwzz}|{~~}zy~~}{zz{|}|ww}wux{{z|~~}{~}}~}zz|~~zwwwussty~|trz~zutux~~{}}|zvttx|x}yxwy{}}||{xx|wxz{|~{ww{z~}|~~}|yy~~}{z{|}}{vw}xuwzzy|~~}|~~~}yz{}~|xwwwvssvz|ss{~{vuuy|{~|}|zvtv{zx}zxwz|}|{{zwzzwxy{}~~zxy~}z~}}}|zy|~~|{{|}~}yuy}vuxyxy~~~~}{~}zx}}{}}ywwxwusuy}~wqw~}yvuw}}z~|}}{xuvz}w||ywy{||zzzxx~~xvwy|}}yy|z}~|~}{zyy}~~|{|~~}{vv|zuuxxw{~}|||xx|{|{wvwxwutw{~}uqx~}ywvy|z~}|}}{xvx{|w}|zxz||{yyxwy~}wvvy{}}zz}z}}|zyyz}}~|{}~}zuu|{uuwwwz~~}||}xw}{|{xvwxwvtw{~~vqv~~zxwx|y~~}{|}|yww{~xz~{xz|||yxxxx|yvuwz||z||z~~}zyyy}}||~~{|~|wsywtvwwx}~~|||~~zvz{{{yvvwxwvvy|{srz}zxw{zy~|{|}{ywy||w|~{x{||{wwxxy}~xvuwz||{~{z~|yyyz~}|{~~~{}~{vsy~wtvwvx}~~|||~~zvz|{|yvuwwwvvy||tqy}zywz{y~|{||{zwy|}w{{x{||{wwxxy}}wvuvy||{}|{~|yyzz~}||~~~{~}{usz}vtwwvx}~}|}}}yv{{|{xuvwwxvwz}{ss{|zyw|~yz~~{z|{{yxz}{x~zy|||yvwxxz~zvuuwz~~{}z}~zxyz|}|{}~|}~|xsv}ytvwvvz||}~~{vx|{|yvuvwxwwy|}ury~~zzwzzy~|z|{{zxz|}w}{x{||yvwxxz}{vutwy}|}z~}~zxyz|}|{|}~|}~|xrv}ytvwvvz~||}~~~{uy{{|yuuvvxwwy||trz}zzw{yy~~{z|{|zyz}{x~yy|||xvwxy{~yvuuwz~~|}~z~|xxz{~}|{|}|}{ury}wtwwvw|~||}}~}xu}~z|zwtvvwxwy{~~xqv}~{zxx{x~~|z{{{{yz|~w{|x{||zvvxyz||vvtvx|~}}~{|}zxyz|}|{{|}}||yrt|{uuwvvy~||}~~~|vw|{|yvtvvxwwy{~vqx~~{{xzzx~~|z{{{{yz|}w|{x|||yvvxyz}{vutvx|~}}z}}~zxyz|}|{{|}}||yrt|{uuwvvx~~||}~~~|vv~}z|zvtvvwxwy{~~xqw~~{{xy|w~~|z{{{|yz|xz}x{|}zwuxyz|~}wvtuwz~}~}z~~{xxz{~|{z{||}{urx~xtwwvv{~}{}~~}zty{{{xutvvxwxz|}trz}{{w{yx~~|y{{|{y{|~w||x|}|yvvxyz||vvtuw{~~}~|{~{xyz|~|{z{|||{try~wuwwvw{~}{}~~}zty{{{xutvvxxxy|}uqy~~{{x{zw~|y{{{|z{|~w{|x|}}yvuxy{||vvtuw{~~}~|{}{xy{|~|{z{|||zsrz}wuwwvw|~|{}~}}yt{{|{xttvvyxxz}|rs{}{{w}ofb^\^elw|y|~zqf_^]\]djrz|xwtuttpjjhggkqusuyxuuqlt~~qottpljflsy~{tsoha\RS\dea]]```bhlssrsuxvkgotsmjefklkgdccbcce`__`bdiprrz}{vnglqsokikkklrw}~~yyzzz{xvxwspiafnttolnlhcbdeijlmoqmehrxxwuqw}~zzy{yvuuvtkirxzxvpprqkfcegfghieefjosx|zy~zz}|}}|w{||zzsr|}~xs{~yuvxyywumihhjmqusptwvuunjpvvnfceeb]_`eikotyyphntvuwutxxvrqu{z}~||}y~|tpppollllnnpsxyrimvyxzzx||ztnjjlpsuqkkjklqwxqopnkjhemuyvpmprsqqrswwy}}xxy{|xsqqrx|upsttsspuzvtponpmjhfginpjeijhed`cjnkfbbehlnohddglq|xw~~|vrpsvtllprqrrow~~ywxwusttnjeehmuzxy|woid[]gnng`^]]\]cdghjntz|xz}|}yz~~zxx|xvqmuzzxsmlotxvtuy|zrw}wqklnnlheedfimpmlgeeiptsw}|zsu||{{{{|{~}ut~z|~}}zvv{}xz~zrjnuzyvrqnkfehhkhdachibcowxvvrswvtstwutwxyuuwyzz}}|rov|zxxx}{~~}zzyqpy~}tquvrnnrsrqmkfdefffjqsqvy{yvmkrwvplmpmheilrx{xpt{yzzyvuwzz{~}z{{|uvz}wqorrohggjprvwvtninv{}y{}yphgmruttusutux{~{rrutstuqu|~{y|~{uswy|{}|ytruy|utssuwxtnqvvuwxw||tstwurooqooqvzwkglommnmsvvqmnrvzzvrmnnqv|x||xssuz|shkrvuvvx{wutw{}ujiilqxzwrmgcjtxtmgiklkihhnsvy~~|{vvz~~|wtuz~|xrr}|yrmlrvvuvy{}x}{xyrotwvoifgkqu{wqmlnosz~~}upz~{~~|wy{|zv}}||~yz~~yy||zux|zz{}vrsx{{wz}{~||wy~ysytkihfelt|xy{{{xssu{|~~|zxwxrqnihkt|||}xuy}~~}rv|~{tnquvvwuvzzz|~|ullu~}~yrprqrttustrlinwztojjsvwvx{||~{qijnttv~tz{z}{{{z|wpsw}|yxwqnmrvw{~wrpsy~{z~zpdfpyxvvz{vstuttuzyss|}|xrqu|~~~}uouwvvxwvyxtrruzyvrqokjmt}~}z{|xyzxzy}{|}~zyxy|~vmq{}}|{|vtsw{ytqmqw{xqoqrsmfehqtuyww|}}|wvuy~|~~z{ztqw||xx~yttuywty|}|{}~}yw{{tmhlpu{{wqpqpnqy|y~{upmv|zz|~xwwx|}|~|zx||z}~}}zy||www{|uvsnuxssuvy{tpmnpquwuux|~{vnpywrvz~{uorx}}wst~{{}{{~}{~|~z{z|vx{y{wwtty~{zyy}~zrjhltz{pjmv~zqqqporv||y}{tpw|z~|tprx~~}~}}|x||qptz~{vpmqt{~yww||upw~{vsqssontw|}}{upvxrty}}zvpu}wuwzz}wt|}{~|}}ux|y}|}zvuy||}{}}vpqx{vy}|z{}{|~xssuy{|{{|{vsnmrwz|yuuw|||~}zz|}vuw|~rr|{uyz}|y~~|{~~{xwvsuz}{zuw~||ysssw}{|zyvoqvy{{z}yqjjqsx||y||||}yyy}{z|}|||zz}vwy|w|{vxz{snqv{|nrz||~~~|ummpuz{vvwyxttx~ztuw|~{}ywyyz{|y}~~~ut~}wttz{{yxy{~yyxtsr{|vxy{|xuruvssxwu~}wsrzzxy|sptuy~|wz~~~}w{}}{{~}~}|zz}~yyy}}zzztv~~{wzxnjntw}xlis}wxxxxtx{z}|{wv}|sosyz~}{}~~}~}}|~~zsw}zuos}~{uutvzzyxz~|xv|{wxyzunptx}~tpuxxv{{xrs|wvz{y|ztx|}|~~|xy~wv{}|~|zz{z{z{~vqu|}~~yy{{{|wszzx|{~|}||yqry|uuuty}wu{}~~|{}}|~|}wv}~}u}~yy|wx|}vw||~{z~~utxzusuww~|uw}~|~}{z~}|{z|}~{zzst|yy~{yv{}}{}{yxz~~~{v}||rsvz{rw{zwwx~~{y|~|}zxz}z~{~yx{{tx{x{~}{sqw}{~~|}zxww~}upx~}vqt{~~}|{~z}yyz}{wy}{z~}|y{~~~zvvtw}{vv{~{z~}qu}}uvuuy{xyz~xx~{z}zwz~{}{||y}|zz}y~wtvvxwqt~}~{|yz~~wsuwwzztu|}{|{|}{}}zyz{wz{tv|~||uruy{rqz||}}|{vuz{{{wrtw|xwww{zwyz|{~{z}~|z{z~~{|}}~||}xwv||st~|uqv}}~|z}~~yxvwytvxy}{vyzzz|~yy~zv{~yy|w{}y}{ysw{|xsuy~zz~~z||}xsuzwwz~~ywzwuz{y~~~|}~z~xou~yy{xux~{pq{}}~|z~~zzy|~|utw}}{z}zy}}z{x{~}|xuw}z|xwuv{|ysu||}}{|zvuz}{|z{~~uu~|w}}|}ytz}wv~vrt|vs}~yttz}zyvu{vrt{}{~~}|~}|{}|~wtx~~{{z|}y~}wsu|~rnv}}}||~zsrx{{wsu{}|}|}|zyy|~}~~~|y{yz}~}tz}|~{~}zuu|{zyyy}{uz{vvz|yyxvv|wsu}y|~~~~~|yz~~zz}xqv~|{|vuv{zuu~ztrvx}yuuv{{zwtw~zxz{~|{|yz}wy~{|yssz~xv||wvy}yy~}}}~yuty~}yxyvw}~xsx|||~~}y|}}}|}{||yx}}|~~~~~{ww~~|xuw}}xwx|}|}|{}vuv{yxxv|{wz|{vx}~zzy||wx~uqv||~|xw|xrtzw|~|xtx~xuxxy}xy~{x{{|z|~xrry~ww{}{zxz{~~xqt|}}~zusv}}}zzxuv{~xy{|}}{yyzxy}zwy|zyuqyzsux~||}yrwxuw|}y{~{z}|}~{yz|vux|~{vx~~w{{vuyxopz{xx}}zwsy}~{uux~~~|vtx}~}~~~}zvy~|wxz|~ww|xqvxtwz}xps{{z}|ww{{vvz~}{|~||~}}}{}~}yvx|~~y{}yxz~~}zx{zrqv{~{|}}{zxx{~~~xuv||{||}}yy~~~|xzvu{~{{}trw|~}{~|}|vtzvt{|usv{}{}~yvyyuv|}|zz~|{|{}}|}}}zww{~y|}{{{|{}}unr{}zxy~|{xx{}{zwuy~yz{}~{z{|{}~~yz|{|vsxz~}zwu{}}~~{zyyx{ytxz{~{trw}}zxyyxx~xvzzz|~}~z{~||upry}tpw~~{}~zvu{~uqsy|~{zz|{wxx|zzyw{|z|~|}|{z}}{|utz{vst{{xwx{~}}}yw|{{|}xuy}}uv|}{}{wtz|wwzz{}uv~|{{~|zzz{}~yustzxtv~~~|xx}{xx{||}|}wqry~}~{wyz}}yux~}z}~|~|}~{rryyvvvyzsqw}}}zz}|{|}xw{~~~y~~|yy}~zz{zwy|{}z{zuw{{vsvwzywx}}}|{{|{xx{}~zz~~~}wty}z|yvx~{{xvvz~z|zsuytsy|{utvz}{~~{z}~yx{~~}|y{{vw{{{~~|~wsv~}}}}~{yxx||snt{~yuv|~~}{{{}}|xww|~}}~{yy|~||~{|}}~|uuux}}zxxz}~}zsu|}uuwx{yuux~}yy{|yy{{xz}||~|~~|z|{y~}trtw{|srz~}{xy|~{squxz~xvy~zzy{|}{xx{~yx|}wvx|~}|{stx~~ztqw{zzy{zyz~~|~~|utx|}vvxz|~{vtw~z{{z{~zx{|}~~~}xwwy}zytt|{tuz|y}|||zxyx{}urtx{{|{z{|{m_Z^cehkpyxnd^YV[bfjqy~wwwxuuwuqjbagknooolifdirw{yvzyqmnljebejqw~|qie`]^cjmmllh`Y[cnsrolmnnllmomkkligedb^]]]^`cd_[Y\fnty}~~~tlgdeilpqoia]\`is}~~|vquz}}zxwtpiiljihjmmkf_aglonifiorpqv{~xpou}~}{rmouwtpppnlhghjhcbcbaadfhnruwxz}{yy}zsry}}~~xrtz{xvtw{}zywxyxwuwzxwxzz{}tpoqrmklmllloqnf^`dddegjllhefkqwyvsponpx}}{z|~}ywxz}|tmmswvwy|~|xtrsy}{qhdcfkqwywsomic^\bjnnkhhhigcacjqtuxzyst|||~|vsv|~}|ytpt|}vollopopsuuspmkmmmppmkllic`_afkoqlgcccdiquvvwvsploy{{{}|||~|z{|{zx{}}vnklotuvyxskhgglswwsmhdegknmhdehjiijorsuuroorvwtqty~}zxvx~yx|}{|~yvwxvsty}}xrprrrqrsrssrsqlhc`bhorruz{vqnihjnswxsmkjjnryzvsmms||}}}|{y{|{}~}smrwyzzzxrmgfintwtpljgcgow||zyvqjefjnmnpsuutsrrqpqqqqrstrruz|wvw|{{~{wrqty||{xvusrplklnpqqrttqsz~|vqprrmjmoqrstwwsjfilnqtutttrrsw{}}{{yurt{|}~}zyyyz{xrllpsux||{|~|wrpt{{uokhjntz~|vuurmkijmrtssttspjhjqwz~{x{~{yz|~~ystx~~~zwvx|ztrrrpmoux{{zytolmrtuuuvtoieejotwuroonlmsz}||~|wsqt}xvy}|zywy}{urpptw{||yromkkpy~}xrnmnprronmopqsutsuy{zvsuz|vux}}vsvz~~zwy~|~~}}}}~z|zxyz{zwx{|xuussvyyvtssvz{zsjeejoty}~ztminw~zvutssuy}|wsrw}yuuy~~}wusolloqu}}~~{uonty|~{z|}}}|z{{yurnmtzztporsuz~|x||unkkmosw|}~ztpqw|}xtrolnu|yxvrooqtuvuvxxxtniimqqrvxxuttw{||}~zvxz}}{tsstx|~{vphfjqx|{yx{|{{}~}}zwtssuvwwsqnmlnrx}}}}xvy~}yww{|xy|{wx{~{z{~{wrpqstspnopppnkmt{~}~}~{y{~|vux~zux||vstw|~~~|z|{xy{~}yxwttuwupkklpsuusrqrrsu{ytprxz~~{yy~~~~}{z{}||{}~|{~}zz|vonnqw|~}zuqollortuwvutuvvw{|zzxtru{{vwy||y{{tsvyxru}~}{zyy|~~~~{xurruwxyzyyyunjimqu{~{xtrrux{zvsstuz}{yxz~|zz||{yyz}}|z}|{}}xvx||usuvwxz{xtpnpv~{vttttx}}}|zupmqvwuuww{~~||~|xvtstw{|xvuw|}|y{~}zxsqty||zwuwz{zxvvz~~{yxvw{|~zrmmry~wronptz{vrpsy}~~~~}}}|||ztprx}~xsppqsyysqu|zzywuux{}|{|{xvtttsttsuwxwtppv~}{xy~|{}~~{||xy|{wuuwyz{|~}|||}~}zwwxxvw}{wwxwvvxyvrljnrwyxutvyyy|yssy}~~zyy|{y}~}}|}~{y{}~~|zzzz{~~|{{z|~xrnmou{~|zyxvtpmosy|||}~}zz|~ysu{|xvvx}|zy{~~|~}}}}{wvvz|wvx|~~}|{{yy|~~}|zvqqsv{~}zuqnoqt{zusv{~|yyyyyz}~{{}}zz{}~zusv{|z|{x{~}|{zy|}wvx|{vtsux{{{xtqpqu|}|{zy{~}zwvvuttvy|}~|z}ztqptz~|zww~}z||zz|{zz|}~|{yvstwyyxwwy|}{wuw{}xxy{}~|wtrsy~yvsprv{}{xvuwy{~~z{~}|}}~~~}}}{z}ysosz~~|z}zvvy}||}~~}xux~~|{|~~}~|wtv{~{urtz~{z|vutuv|{}{xvtvz|~|~zzyxuv{}|{vuttv{|wtrtx|yzyuty|~yx|~{zz{|zy{}}}}|{zyz~~~~~z{~~~~|~yx{|}{vrsv||}}yxxy~zz{|{}~}|wuu{|z}~~~{vsux|}}~}||yx{}yuu|~yvtuvx|z~~|y}}zwvz}|yxwwvtx}~~ywvwz~}}xvtqsz||zvuy||uty~~{y{||}||}{z|{zy~{yz}|}~|{~}xx~~wtvvy~~~~ytuwz|z~}{{~~wvvwvw|}}{xw{~}|}||{xrprwzyz|||}}xz}|wtx~wtsvuy~{|zz~~zzvvz~}zzyzxvy|{zxxy~}|||~}~{yvtv|}xy|yw{~zsrv{~||~~~}zz}}~~|{|}}{|zyzz{~|zz~}yy~ytuvy~zuuuv{~z}~{z}~ywwwvx}zwx~{zzxrnquyy{~~~xvx~}xv|ytrsssz||wz||~}{wz~|yzzzuux{~{yuuw}~}~|}~{zvtu{|y|{xx{|}~zsrw~~}~~~~|z{}}~~~|zyxy{z|}}}zz~zvxwz~}xttsv|~|}yx{zyyyxz~|wux~}}~~~z{zxrpsx|{~~~}ww{{uu{}}wtsttx~}zx|}}|xx{}|xxyyvuxy}~zyutv{~~}{yurryzz{wvyz|~}vtx~}|}||||}~~~~|zx|{z{}|~}}~xx|}zvwtx~~~xuutx~~|~}xx|~zyyxvx}|xvz~~|~|}|xqptz{{~}|}{xy}|wsx|}|wuuvu{z}z|~~}{yux{}zxyzzwyz|{{yuvz~~}}}||~{xsswzw|}xvy{}~xsvz~}~}||}|~}~}|~}{xz}{{}|~}||}xw||xuutx~zwwtx~{z}zz}|yxxvvy~}yx|~}~}|}zunptyy{~||}zwx}{vu{}zwuvtu|z}z}|}}|xvz~~zz{|zwzz|||wuw|||}}}|}~|xtty~xx}}yxz{}~}urv|~~}~{|}|~}~~|x}|z{|z}}|}~yy}}~xuvuyywusv}{{zy|}zyxww{}yx||~~}{|zvoosxz|~}~zvw{~ytx|~{wuuttz~|~~y{||}{wy|~|z{{{vxyy~}|yttw}}}}~~~}}~{urt{|x{{xyyz{~{tty~~|}}{}}~}zx~|{||{~}~xy||~ywvtyxwusv}||~yx|~|zyxwz}ywz~}~~~{|{xqpsy{{~}~|xx{~ysvy|}xvvvty~~}z{}}~}xwz}|yz{|xwyx|||vtuz}~~~|~}xsrw~yx|~yxyyz{ytv{~~}{~}~}~~{xx~}}~|}~~|wyy|xvtty~~yxutw{{}yz}~|zxvvz|yx||~}}|wppsyy{||}|xw{}}xsvy|}ywxutz}}}~{|}}~{vx{}{y{}}xyyx}~}|vtw|~~~~~}|{~|vstz}wx||yzyzz}~vtw}~}}}}||~~|zw|}~}{~~}}~yxyzywusx}zyvsu|{{}{y|~}zyvvz}zy}~{~~}}{wporxy{||~{wvz{}xtwy}|ywwtty{~~~~z|||~{xz|~{{|~|xzxx}}~zutx}~}}~}{|{usv}zvy|zzyyzztuz~|}||{~{xz~}~z|~}}~|yzy}|xwtv||xwrsx}|||yz~|zwvz~zy{{}~~~}}|wqosxy{}|~{wvy{}xuwy}|ywwtty{~~z||}{y{}}{{|~{xywx}}}xttx}~~}~}{~xsrw}ywz{yyxy{xuw|}|}|||}zx{~~~}{~~}}zyyy~~{yvtx|zxvrt{||}{y||zww{}yy}~{~~~~|wqptxy||{~{wvy{|wtwy~|zxxtuy{~~}~{}|}{yz|}{{}~{xyww|}}zutx|~~}{|zuru|{vx}|qf]_bbejov~ytpmmllmmliho~{vssusg`egfb`bcehkmrv{vja[Y]emqs|{unhdejlgclttld^XUTW[_bdgiiggjkntzuhbdec`][Z[_bdegkoty|}ysr{{xwxywrkfa^`elpqt~|}vmg`[Y[^acgihgfgggnwypgeilmlmnpquwxx{~~y{|}~zz|~wmhlqplmrvuqmlllossokgdejotvu{}wttw{}{zyxz}tu{xsuxwqprw~}xsssvy|{z}}sptxtonrsstuxz{~zsi^\dihfipttrrsuwy|{wsmjlqv{||yxx|vuyzuqrtx~~{vrljjlortsw|~tkkpqkgilnqstx{}~ztk`Y]fhfgov{{z||}}vpnprvxwz}}}x|{usstz|xrmhddgjnssv{~~wmjnrohghhknopstvy{yupf`clqonsw{{xyxx{~|wqorux{z{{tuxuomnpv{zwqmihjkknnotvwrieimmhgjknpqruwy|~yshabkqonsw|~|~}{tpsvz}~~~}}{|}|vwzwqpqrwzxtnjgfikkopsy{{vlhkooiilnrtvwz}~ysgackqooty}vqttwyy{}z{|~~}}}z}{usssxywrkfceijmrtx|}|vmknqpkkkmqrttvwz}~{xrhgluwtuy|~}|{~}zsrvwyzz~~z{z|~~wvzxsoppsyzxsnjhjllnpqvxxunhjmpnlooruvuwy{~{xnfgnvvtvy}~yrtwxz{}|yyx{|z{||~}xy|ztrrrvzyvqlhgkmmqsv|~~yqlmprnoqquyyy{}{wnefovusvyzstvvwwy}xxxy}|z||~z}yvutwzyuokfeilnsuz{soostqprpsvvvwxz~~zwpjkt{zwxz~ysuwwxxzzxxwz}{}~~~|}{vx|{vrqquz{ytpkhjmnqsu{}|xplmpsqqttuxyxyz||ysjiqyzxwy}|uuwxyy{|yxvx}xxz{|}{{~|~~xx|~{vtstyzyuqlhiloruv|~wqnpssqtvvy||}}{woimvyywx|zuvvvvv{|wwww|{xz{}~rhhmuy~{z||yzzutvutwy{}~yrpqqpnnv}{wsooopx|tkcadhloty}~zy}|uuz~~}{xvvw|{slmrvwrommswwurlgfgknqru{}ztnlmqssv{{{~|}~{zywx|wqjcehlopsxzxtu{~{~upsvxvrolntusroighlptxzxusuxxy}~{~~|{zzxrqpot|{xtroqvwtqtx~xskhjoqqsvyxtqt{|~|~}yx}}zsoorw{|yy|}}}z||xxvutsw~{tmkjiltz|}zwusrsy{yuvzzuoklquuvy{zvrsyzz|zzutvz~}zz}{xy~~xttrqqqv}}vnkkiksy{|zwvutuz}zvx|}wpkkptssuwvroqxyx}~|{wwy}|{~{yz}}xssqooptzyrkijjmu{}}zwutsuxzwuw|~xsnmrtssuvuqnqw~yy~zvwz~}}~zz|~{vttrpqsw|wpkjjkow}~~zwwvwy|}ywz{uqnqvxwwyyvqpt{yvy|}}zwz||{}|xz||xtstrpsw{xqlklmrz~~}xwwwy{}|yx|zsonqtuttvurnot}}wvx}|~|yw{~|||}yz}}xuttqoswz}unkkmot|}xuuuwyyyww{{tqpruvtuvtqnot|}wwz~~{xwz}||}}yz~}yvuusqswz~vokklosz~yvwwz||{zx{|tqpsvyxxzwtppu{|vuy}}~|}{ywz|{z{~yy}zuuutrsy}}tnlmosx~zvvxz}}|zzz~wqprtvwuwvronry~xtvz~~}~}|{yxy|~{{}}xz~xuvusquz~~vollnsw}}wtuvy{zxxw{|tpqtuwvvwtqnou}{vuz}}~~~ywwz||z{{y||wvwvtsx||tmllotx|xvwz}}zzz~zsqtvwzyzzvrorxyuvz~~{||~}xvwz}yx{~~yx}{vvvutu{|tnmnqv{zvvx{{zz{xqptuvwwxvroot||vsvz}|{}~|yvvy|}yy|~z|}z{zyx{{sqqsy~{xx{~~z{{~vrsvuwwxxtomov~vrswz~{vx|}z{~~}xrpswz~}xvy}~|{{|{zy{}uppqw}}zy|}|}xstxwxyzzwropv~vrrvz}{vvz}}|zz~~}ytqrwy|}xuw|~|{~{{{yy{wqqrv}}zy{~|}xrrvvuvxxupnpvwqquxz~|vvz}~|{{~~|xtpsxz~~yvx|~}|~{{{yx{|upprw~|ywy|y{ysswvuuxxtpmpvwqrvz}|xw|~}~{wsosx{}yvy}~}|~||{xy}ysoorx|yx|}{}~wsuxxwx{yupotz|sptx|~yvv|~}{|}yvrpuy{}zxv{~~~}}~}{{zx{xspptz{yy}|{~|uruwvtvyvropu|{rpswz|}~~yww|~}|~|xurpuz}}zyw{~~~~~}|{ywz~}vqoot{zxw{{y}}vsuvvtuxurnpv}|squy|~zyy~~}xtrpty}}zyx{~}|~~~}|{zwy~}vqonry}yx|~z|xuuwxvvyxtqqv|}upsx|~~zxw{~~}|~ytspsw|}yyxz}~{|}~~||zxx~ztqoqw~~zyz|{zuuuvvsvwtposzxqquy|||}|zxy|}}}|usrrv{{zzz{~}{|~}|{ywy{tqont{|xx{}z|xuuuvttvurpqw~}vqtx|~}}|{z|~ytrqsw|~zzz{}~{z|~}|zxw{xspnou|}yz}~{~xvwwxuvwvrqsy{tqty|~}}|zzy{~~}}~xsrrsw||yyz|}|zy|}}|zxy~~xsqopw|y{~}|{wvuuvtuuspqu|yrquy||{{~{{zz|}}}|urrsuz{z{||~|zz}}}{xwzytqpos{}yx{~~{|zwvuvttttqpsy|vrtx|~}|~||||}~~xsqrtw}|zz}}}{yx{}}|yxy}ztqpoqx}z|}}|yxvvvvvusqty}wssw{~~{|z{{||}}}ztqrtvz~{yy|~}}yxy~}}|zxz~}urqpqw}{|~~~{yxuuuutsqpsy}wtsvz}}zz~yz||||~|}ztqsuw{{zz}~}zxy~}}|yxz}{sqpprw~}{{}~~~|zyvututrpptz|wuuw|~~{||x{}~~}~ztqsvw|}zzz~{xvy}||{yx{~xqppqsy~}~~{{zvuvwtrqrw~zvvvx|~~z|yw{}~~~}|~~xsqtvx|zxy{zwvz{||zyz}wqpqru{~~~|{{yusturpory~xvvvx|}|y{xvz~~~~||~~xsquxz~zxy{{xvz{{{zxy}vpppsv{~~~}}}|~|{|yvsturoosy~xwxxy}~{|xvz~}|~ysquxz}zxy||xvy{{{zyy}xpopsvz}~}{}{xtuwtposyyvxyy|~~|{~xux}}|{}zuqswy{{vx{}xvw}{z{zyy}|soprvy~}|~{||yurutpnpv}{vvxxy|}|z{{uuz~|{||xsrvy{~xwy}|wvyzzzyx{~wpoqux{~~}z{|{|{xssusonry}yvyzz{~~}|}xuw}~||~{wrswz}}ww{~zvw{~}zzzyy|~uooqvy|~{|||}|ytuvsoot||wvy{z|~~}|~~vtw}}{{~~zvrsw{|zuw{}yvx|~|yyyxz~|topswz~}{}~{||zvrttqmpw~yvwzzz{}||{{uuy|{||yusuy}~xvy~}xwy~zyxxx{~wqoquy}~~zz}|{|{ytstsons{{xwy||{}~~}}wuw}~|{~}zwttw|~{vw|~~zwx|~{yxxxz~zsooty}~|z|}|}}{wtutqnry{wvx|}||}~~}xtuz~{z|}{xutv{~{wvz~~{xx{}ywwwz~{upoty}~|z{}{||{wsssqnqy{vvx{}{{|}~}yuvz{z|}{yvuv{{wvz~~|yy||ywvwz~zupoty~{yz}||{{wtrrqnqyzvvy|~}||~~yvv{{{}|zxwuv|zwv{}}{yz|~|xvuw|}xtppu{{y{}|}||{xusrqpt}xod^]`diryvpic`efffiotzztoifdeilprpokdba]_eltvx}yrke`[VTVX^hx~yuwwtqmg`ZXZ`flkebdhlnkhgghffkoqrqnid`^\afilkhfjkjhjpssqrvxz~~||unhdbb_^^]\[]`enzzwvx|{smmoppmhfffddinqqrpmifeejquxywuwyxvuz}|yxy{{}}{xvx}}{{ywwxxpifejquqkgdabdddefebcfjpy~}~}{~|xwwy}~{{|}|~zywsoqw{{wsmjhefkppnlmmllmolfbaemttokheehjiijkhfhkpw}~~||}}}}|~}uqqmhgjpuxyuplgcb``bhllihkkjlnojecektzvrnkjknnmmonjilpu}{}||~}}|{|~}~xpnmiddiosvvrlhdaa``cjmmjjmmmoqqmhgjpy}ytpnmorqqprqmknsy}z~}{|~}}{{|~}}~|unlkgcdjpuwvqkgdbbabflnnklooprtrnjjnu}zuqoorsrrrtqllpv|zy|{}~}|zz|}}~zqlkiecgmsvwtmheccccejopnknqqrttrnkmrzzuqpqttsrttplntz}y{|{|~~}{yz}}}~{tmkifcekqvwvpifdddefjorqnostuwwurnosy}xsqruvutuvsnntz~yy~}{{~~{zy|~}woljhefkrwyyskgeefghkprroosvwxxwtpptyytqqtvustusnmsy}yx|}{||zy|}xqlkhfglsxzyskfeffijmqssppsvwxxvtqquzztqruvustusonsz|yx|}{||zy}}wqljhginuyzyrieffhkmorutqrvyzzywurtw}xsqsuvutuusoov}zxx}|{~|zz~|wqlkiilqx{|yqifghkmoqtvtrrwz{{ywutuy~~wsqstuttuuropw}yxx|}|~|zz}xrljijmrx||yqiegiloqrtvussw{|{xwvuvzxsqstuututspqw}yxx|{wokkmrux~}{zz||sjdeglqvz~xtsssrppnmkinu|}ytpqqsy~}zwvusqpoptwz~||}~}~~~|wtsuspoqrqtw{{xuux}|xtmhghjnty|{voiilpuy}~|utuwwvvttvwvtssuwz||xwxxwy|~{wuvy~|ytnllnrv|xqmnrvz~}}}~~}}{zyx|{wuutw{|{{zyz}~}}}ztqruxxyxwxz{ywuuwy{}~~ztrrvy}zroquy}ywwvwwvutsrrv}|wroonnruvwxvwy|}|||ytstx{{|{yz}}zxvvwy|}}{~}wtvz}zspsw{zussrssrqpoopu}}wsnmmmnruvwxwx{~~}}|yuvx|~~}{{|~zxvvx{}~z{{vvy|~vqqty}~~}}vrrqqqrqonnoryytpnnnnqtwxyyy{~~}|xwx|}||}zwvwy|~zx{~xvx|yspsx|~}~~xsrqqqrqpoopsxzuqnnooptwxz{{{~}|ywx|~|{~~{wvvx{}~zwy~yvx|ztqrw|}~ytrpppqqpoortx{upnoppqsvx{|||}|zyz}}|~{wvvx{}}ywy~yvx|ytqrw|~}}yurpppqqpopsvzztpopqrrtwz|}}}}{zz{~}|~{wuux{~|xvx~~~~xvy}}xsqrx}~~~}yurppqrrpprvy}xrooqsssux{}~~{zyz|~||~~zvuux|}yvvy}~}xwz|wsqtz~~}|xurpoprrppsx{~vqnpqsttux|~~zyz{}||~~zvuux||xvvy}}|xvz~zvsqty~}|yvrpoprrqqty}~wqoprtuuux|~~zyz|~||~zvuux{|xvvx~~}|}yvy}{vtqsx~}|zxtqppssrqty~xroprtvvuw{~{xy|}}|}|wutwz~|xuuw|~}|}}zwx||xusrv|~|{yvrpoqsrqsx}{tooqtvvuvy}}yx{}||~~zvtux|zvuvy}|{~{xwy~}xusqsx~~|xuttvwvwz}vsuwz|{z|~{|~~}yvtvy}zvssty~|yxww{|zwuux}}zvtrrty~~|xutuwwwx||usuxz||z|}z|~~}xutvz~ytrsuy~~{ywwx||ywvvy~|yutrru{~~~{wutuvwwy~yssux{|{z}{z}~~~~{wtuw|}wsstw|}zxwwz}zxvvx|}zvtsstw~~~}yvttuvwx||ustwz||{|}z{~~~}yvtvy~ysrsvz~zxwwx|~{xwwwz}zvttstv|~~~{wttuvwx{}vssvy|}|{~~zz~~}~}zvtvx}ztrsuy}{xwwx{~{xwxxz~~zvttttv{}}~{xustuvx{}vrruy{}|{~~zz}~}}}zwuvx}{trsuy}{xwwx{~{xwxy{}yutttuv{}|}{xustuvx||vrsuy|}||~}zz~~}}|zwuvy~ysrsvz~~zwwwy|}zwwyz|{wtstuvx||}}{xtttuwzytrsvz}}|}|y{}||{yvuwz~wrrtx|}ywwxz}~|ywxz|~zusstvwy}~|||zwtttuw{}xsrswz}}}}{y{}|{{yvvw{~wrruy|}ywwxz}~{ywx{|~~yusstvxz}~~|||{wtssuw|}wsrsvz}~}~{z{}|zzzwvwz~xsrty|}ywwxz|}{ywx{}~zurrtvxz}~|||{yutstw{~xtrsuy|~~~~|zz~~|zzzxwwy}ysrtx|~zwwxz{~}|ywwz}{vsrsuxz|~}{{{zvtssuy~zurrtw{}~~~}zz|}{yzyxwx||vssvz}|ywwy{}~|zxwy|}xtrrtwy{}~}~|{z{yvtstw|}wsrsuy|~~{z{}~|zyyxxxz}zustx|{xwxz{}}{zxwz}|wrqruxz|~}}~|{z{xvtstx}|vsrsvy|~~{z{~~{yyyxxxz~~ytstx|~zxwxz|~~|{ywx{~~zurqsvy{}~}~}{zzzwutsuyytrrtwz}~|zz|}zxyyyxy|{wtsv{~|ywwy{}~|{yxwy||wsqrtwz}~~||zzzywustw}}vsrsux|~~{z{~{yxxyyy{~}xutuy}}zxwy{|~~}{yxwx{}xtqqsvy}~~|~}{yzzxuttv{wsrsuw{}{z{~|ywxxyy{}}yvtux|~{yxxz|}}}{yxwx{}ytqqrvy}~|}}{yyyxvttv{xsrsuwz}{z{~|ywwxzz{~}yvuuy}}{yxy{|}}~}zxwwx{|xtqprvy}~|}}{yyyxvttv|wsrsuwz}~{{||xwwxz{||xvvvz~~~~}{yxy{}}|~|ywwwy}{wsppsw{}|~}zxyyxvtux~}urrtvx{~}z{}~zwvwy{{}~zwwvx{~~}|zyyz|}}|~~{xwwxz~~zurpqtx|}||yxxxxvtuy{urrtvx{~|{{~~zwvwy{|~}ywwwy|}}}|zyyz|}||}~zxvvx{~~yurpqtx}|||yxxxxvuvz|urstvx{~}{|~~zwvvy{}~}ywwxz|}||{zzzz|}|{|~{xvvwz~zurppsw|}|~}zxxxxwvvy}vsstvxz}~{{}{xvvx{}~~zwwxz|~||{{zzz|}}{{}|xvuwz}|vsqprvz}|}{xwwxxvvw|ytrsuwy||{|}ywuvz|~|xwxy{~}|{{{zz{|}|{{~~zwuux{~ytqpqtx}||}zxwwxwvwz}wsstvxz}~||~|xvuw{}~zwwy{}~|{{zzz{|}}{z{}yvuvy|}wsqpquy~~|}}yxwwxwwx{|vssuwx{~}||{xvux{~}yvwy|}}{zzzz{{|}|{z||xuuvz~|vrqqrvz}|~{ywvwxwwy}zussuwy{}|}}zwuvy}~{wwy{}|zzzz{{|}}{zz}~zvtux|ytqpqtx}~|}~zxwwxxxx|}xtsuwyz}~|}{xvux{~|xwxz}}zyyz{{|}}|zz{{wttvz{urpqsv{||~{ywvwxxy{~yuttvxz}}}|yvuwz~|xvwz}~{yyz{||}}|{z}}rkgfgilptywohc_\[\airz}vropsrrpopoljgfecbeiqwz~xog`]\]`dioty{ria]]_bfggd_ZWWY[_fkoqqrsvxwtplihhjmopnkgdb^\ZZ[]`chow~~~~{xuqnlheb^]^`dhlptvy|}uojgggjnprsrrstuurnkhilosuvusqpmkjhijlorv||zyy{}~{{{}{vrmihikmmmllkjiihgfdbbdgkoruvwy{~~{ywutuwy{~zxvvwyz|~||}~}{yvrpliijmprrpmiea_`behjkklllklllkjhgilpsvxxxyz~}{zz{}~zwvuuvxz{}~|ywvuwy{{zxvutqnkifdcegknomkgc`^`bfjmnoopppppponlklorvxyyyyz}}}~zxvuuvwxz{}~|ywtsstvxxxusrqomjgecbdfjmonlieb`adhloqrrssrrssrqonnpswy{zyyz|~}~|xvutuvwxy{}~|yvtrrruwxxvtrqpnkhgdcdfimopolhebbdhlpsttuuuuuuttrpoqsvy{|{zz{}~}~~ywuuuuvwyz|~}{xusrrtvxxwusrqomjhfedfhkoqrplhecdgkptvwwwwwwwvvusrqrux{}|{zz|~}}~|xvuutuvwyz|~~~}zvtrqrtwxyxusrqomjhgffhjnqsspmifegjnsvxyyyyxxxwwvtsrtwz}~}{{{}}|}~zwuuuuvwxy{}~~|yusrrtwyzyxusrqomkigghjmpstsplhfgimrvyzzzzzyyxxwvtstvy|~~|{{|~~||}|xvuuuvwxyz|~~{xusstwy{{ywusrqoljihijmpsuurnjggimqvy{|{{{zzyyxwuttux{~~}|{{}~|{|~}xvuuvvwxz{}~|yvtsuwz{|{yvtsrpmkjijkmptvvtplihimqvy|||||{{zyxwvutux{}~|{{}~~|{|~}xvvvvwxyz{}}zvttvy|}}|zwutrpnmkjklnqtwwuqlihjnrwz|}}}|{{zyxwvuuvx{~}|{{}~~}|{|~|xvvvwxyz{|~}zwuuwz}~~}zxvtsqomlklnpsvwwupliikotx|~~~}||{zyxwvuuvy|~~}{{{}~}}|ywwx{~}|zxwvvx{{xwxz{|}~~zupmkkmqv||xtqommnqu{~{xvwy{}}|{zxwutssssux}|{{{|{zywwz~~{xvvuvwxxvqmhghkpuy|}~}}{zyxvusrqqrtuvtrpooqsvy{}~~}|{xvtrqqsv{~~}xussssstuvxz{}~}|zz{~{urrux|~|zywvtrqpqrtvwvusrsux{~~{xvtstvz}zyyy{~~|zxvuuux}zupnmnoqrsuwy|~}{|~~{{~~|{zz{|~}{zz|~~{xvtuvy}{xvuvwy|}}~|zwutqponorv{zuqnmnoqsuwy{}}|~~}~~~~zwuuuw{~{xutttvy{}|zz{}}zxvtrqonmnpsx~~ytqooqsuvxz|~}}~|}}zwuuvx|}zvtsstvy{}}zxyz|~~{ywusrponnoqu{~ytqpqrtvxz|~~~~}}~}{||yvtuvy}~|xusrstvy{}|yxy{}}{ywusrponoptx~}xtqqrtvxz|}~~}}}{{}~zwutux{~}zvtrrsuxz|~}zxxz|~|zxvtsqpoopsw|{vsrrtvxz|~~~~}||}{z{{wutuwz~}zwtsrsuwz|~~{yxz|}{ywutrqppqsw||wtsstvy{|~~}||{|~{zz}{xutuwz}~{wtsrsuxz|~|yyz}~|ywutsqqqqtw||xtsstwy{}~~~}|{{|~~{yz}{wutuw{~}zwtsstvx{}|yy{}~|ywutsqqqrux}|wtssuwy{}}|{{{|~}yyz~}zvttux||yvtstuwz|~~{zz|~{ywutsrqrtw{zvtstvx{}~~|{zz{|~{xy{~~|xvttvz}~|xvtstvx{}~{z{~~{ywutsrrsux|yussuwy{}~~|zzz{}}zxy{~~~|xuttwz~~{xuttuwy|~~{z|~~{ywutsrrsuy}yvttuwy|~}{zzyz|}yxx{~~~|xuttvz~}zwuuvx{~~|{yxwwxz}~zxwxz|~~|yxwwwy{}|yustvy~}{zyyz{}~~|{z{|~{xussuy}}zxvuvx{}}{zxwwxy|{xwxy{}}zxwwwxz|~zwtsux|~|{yyy{|~}|{z{}}zvtstw{|ywvvwy|~|zyxwwx{~~zwwxz|~~|yxwvwy{}|yustvy}}|zyyz{}~}{z{|~|yvtsux|~{xvuvxz}}{zyxwwy{}ywwxz}}{ywwvwy{~{xustwz~}{zyyz|~~|{z{|~~{wussvy}}zwvvwx{~}{zxwwxz}{xwxy{~|zxwvwxz}}zvtsux|~|zyyy{}~}{zz{}|yvtstw{~{xvuvwz}~|zyxwwy{}ywwy{}}{ywvvxy|~~{wtstw{~|{yyyz|~}|zz{}}zvtstvz~|ywvvwy|~|zyxwwy{~zwwxz|~{ywvvwy{~{xtstwz~}{zyyz|~~|{z{}}zwtstvz~|ywvvwy|~|zyxwwy{~zxwxz|}{ywvvwy|~~{wtstw{~|{yyyz|~~|zz{}}zvtstvz~|ywvvwy|~|zyxwxy|}ywwy{}}{ywvvxz|~}zvssux|~|zyyy{}~}{zz{}|xutsux|~{xvuvxz}}{zxwwxz}{xwxy{~|zxwvwx{}|xustvz}}{zyyz|}~|{zz|~~zwussvy}}zwvuwy{~}{yxwwx{~~zxwxz|~~|yxwvwy{}{xtstvz~}{yyyz|~~|zzz|~}zwtstvy}}zwvvwy|~}{yxwwy{~zxwxz|~~{yxwvwy{}~{xtstvz~}{yyyz|~~|zzz|~}zwtssvy}}zwvvwy{~}{yxwwx{~{xwxz|~|zxwvwx{}|xussvy}}{zyyz{}~}{zz{}~{xussux|~{xvuvxz}~|zxwwxz}|yxxy{}}{ywvvxz|~}zvsstx|~|zyyy{|~}{zzz||yvtstvz~|ywvvwy|}{yxwxy{~{xxxz|~~|zxwvwx{}|xussvy}}{zyyz{}}{zz{}~{xusstw{~~{yvvvxz}|zyxwxy|}zxxyz}~{yxwvwy{~~{wtstvz~}{yyyz|~~|{zz{~}zwtssuy|}zxvvvx{~~|zxwwxz~|yxxy{~}zxwvwxz|}yussux|~|zyyy{}}{zz{||xutstw{~~|ywvvwz|}{yxwxy|}zxxy{}}{yxwvwy{~}zvtstw{~|zyyyz|~~|zyz|~|yvtstvz}|zwvvwy|}{yxwxy|~zxxyz|~{yxwvwy{}~{wtstvz~~|{yyyz|~~|zyz{~}yvtstvy}}zwvvwy|~}{yxwxy|~zxxyz|~{yxwwwy{~~zwtstwz~~|zyyyz|~~|zzz|~|yvtstvz}|zwvvwy|}{yxwxy|}zxxy{}}{ywwwxz|~}yvsstx{}{zyyy{}}{zyz|~~{xusstw{~~{ywvvxz}~|zyxxxz~|yxxz|~|zxwwwxz}~{xtssvy}~|{yyyz|~~|{yz{}}zwtssuy|}zxvvwx{~~|zxxxy{{yxyz|~~|zxwwwy{}~{wtssvz~~|{yyyz|~~|zyz{}}yvtssvy}}zxvvwy{~~|zxxxy{{yxyz|~|zxwwwy{}~{wtssvz}~|{yyyz|~~|zyz{}}zvtssuy|}zxvvwx{~~|zyxxy{~{yxyz|~|zxwwwy{}~{xtssuy}~|{yyyz|~~|{zyz|}zwtssux{~~{ywvvxz}}{yxxxz}}zxxz{~}{yxwwxz|~}yvsstw{}{zyyy{}~}{zyz{~|xvsstvz}|zxvvwy|~~|zxxxy|{yxyz|~|zxwwwy{}~{xussuy}~|{yyyz|}~}{zyz|~~{wusstw{~~|ywvvxz|}{zxxxz|~zxxy{}~{yxwwxy{}}zwtssvz}~|zyyyz|~~|zyyz|}z|~vme_[Z\bju|wohb___aeiov|}xrnjhiiiiijieb^\^adinsy|~|tnjgffgikosx}{tojfddefgikmooonmjhjlostvvutqmkhfdbabdgkmppnjea^]^`dhlpuy~}ywvtrojeb_^_adhlpswz|~|wsqqrtuuutqoljhfeddfimqvy|{xtpmllnqtw{~{yy{~}zwsplifeddeefedb``acfjnrvy{}~~~}{zyxy{}zwwxz|~}zwvuttuwxyyxuqmihgilorsssrpnkifdba`abdfggfeddfhlptwz}~}|{z{~}}}~~|yvspnmmmnpqrrpmiebabdhkmopoomkigedbbbdfhjkkjihijmptwz}}|zxxy|~}~}yuromkkjklnopomieb``beilnppponljigeedegikmnmlkkkmpswz}~|zxwvx{}}~{wtqnlkjjkmnoonlieb`acfjmoqqqpomkjhgffgiknoponmlmorux{~~|ywvvwz}}~{xtqnlkjjkmnopomifcabdgknqrsrqpomkjhhhikmpqrqonnnpsvy|~~|ywuuvy}~}~|xuqomkjjkmnpppnjgdbbdgkorsttsrqomlkjjjlnqrssqpopqsvy|}zxvuvx|~}}~zvspnlkklmopqqpmjfdcdgkortuuutsqonlkkklnqsttsqppqsuy{~~{ywuuwz~}}~|yurpnlllmnpqrqolifddfjmqtuvvutsqpnmllmnqsuuusrqqruwz}}{xvuvx{~}}|xuronmlmnpqrsrplifefhkosuwxwwutrponmmnprtvvutrrrtvy|~}zxvuvy|~}}~~zwtqonmmnpqstsrolhffhkoruwxxxwutrponnnprtvwwutsrsux{~~|ywuuwz~~~}}|yusponnnpqsttsqmjhghjnruwyyyxvusqponoprtvwwvusssuwz}|ywuuvy}~~}{zz|~~xrmkklptx}~~ytpliggimsy~}zyxy{}~|zxvtsrrtvy~|xvttvz~}|{{{yvsokgfgjmquxz{zzyxvtrqqqrsuwwwurponoqsuwxyyyxvtqomllnrv{~~}~~zxwxyzz{||}|{zywwwz~}yvuuwz|}{yvtrqppqsuwwvtrqpqruwz|~~}{yvsqppruy}}{zyy{}~|zyz{~zvrppqrtvxz|}}~}|zyyz}~||~~|{z{|~~|zyxy{}|yvsrsux{~}{ywwwy{}~~~{xvtsssux|{vrpooqsuxz|~~|{{|~~~~}}~}}}~zwustvy|}zxvvvwz||{{}}zxusrqqrtw{{vsppprtwy|~}||}~}|}~|{|~{xvttvy|}{xvuuwy{}|zz{}}zxusrqqrtw{|xtrqqsuxz}}}}}|{|}~|z{}}yvutvx|~~{ywuuvxz||zz{|~{yvtrqqrsvz~zvsrrsuxz}~}}}|{{|}|zz{~~{xutuwz}~|zwvuuwy{~}{zz|~}zxutrqrsuy}}yvsssuwz|~~~~|{{{|~}zyy|~}yvutux{~~{ywuuuwy|~|zzz|~~|zwutrrrtwz}yvtttvy{~~~}|{z{|~|yxy|~~~|xvttvy|~}zxvuuvxz||zz{}~|zwutsstvy}|xuttvxz}~}{zz{}}zxxz}~~}~}yvttuwz}~|ywuuuwy{~}{z{}~{ywutstux{~zwuuvwz|~}|{z{|~}zxxy|~~~}}~~zwuttvy|~~|zwvuuwy{~~|{{}~|zwvtttux{{xuuvwz|~}|zzz{}~{xwx{~~}~~}}}~zwuttvy|~~}zxvuvwy{~|{{}}zxvuttvx|{xvuvxz}}{zzz{}}zxwx{~}}}~~}|}}zwtttvy|~|zxvuvwy|~|{|~}zxvutuvy}{xvvwx{}~|{zzz|}|ywwx{~}}}~}||~|xutsuwz}~|zxwwxz|~|{zyz|~{zz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxy{}|yvtssux{~~{yxwwxz}~|zzz{}}zyz{}~|zxxxyz|~~|yvtssvy}}{zxxxy{}~~|zxxy{}|yvsssux|~}{yxwwy{}~|zzz{~}zzz|~~|zxxxyz|~~|yvtssvy}}|zxxxy{}~~|zxxyz}|yvtssux{~~|yxwwxz}~|{zz{}}{zz{}|zxxxxz|}}zwtssux|~|zyxxyz|~~|zyxxz|}zvtsstw{}~|zxwwxz|}{zzz||zz{|}{yxxxy{}~~{xusstwz~}{yxxxy{}}{yxxy{}~{xusstvy|~}{yxwxy{~~|zzz{~}{zz|~~|zxxxyz|}}zwtssux|~|zxxxxz|~~|zyxxz|~}zwtsstwz}~}zxwwxz|}|zzz||zzz|~~{yxxxyz|~~|yvtssvy}}{yxxxy{}~~|zxxyz||yvtssux{~~|zxwwxz}}{zz{}~{zz{}|zyxxxz{}}{xusstw{~~|zyxxxz|~}{yxxy{~~zwusstvz}}{ywwxy|~~|zzz||zz{|~}{yxxxy{}~~|yvsstvz}}{yxwxy{}}{yxxyz}~{xusssvy|~}{yxwxy{~~|{zz|~}{zz|~~{yxxxyz|~~|yvtssvy}}{yxwxy{}~|yxxyz}|xusssuy|~}{yxwwy{}~|{zz|~}{zz|~~{yxxxy{|~~|yvsstvy}}{yxwxy{}}{yxxyz}~{xusstvy|~}{yxwxy{~~|zzz||zz{|~}{yxxxy{}~~{xusstwz~~|zxwwxz|~}{yxxy{}}zwtsstwz}~}zywwxz|}{zz{}~|zz{}|zxxxyz|~}zwtssux|}{yxwxyz|~~|zxxxz|~|yvtssux{~~|zxwwxz}}{zz{~~{zz|~~|zxxxyz|~~|yvtssuy|}{yxwxy{}~~|zxxxz||xvsssux|~~|zxwwy{}~|{zz|~}{zz|~~{zxxxyz|~~|yvtssuy|}{yxwxy{}~~|zxxxz|~|yvtssux{~~|zxwwxz}}{zz{~~{zz|~|zxxxyz|~}zwtssux|}{yxwwxz|~~|zxxxy{~}yvtssuwz}~}zyxwxz|}|{z{}|zz{}}{yxxxz{}~{xusstwz~~|zxwwxy{}}{yxxxz}~{xusstvy|~}{yxwxy{~~|{z{|~}{z{|~~|zxxxyz|~}zwtssux{}{yxwwxz|~~|zxxxy{}}zwtsstwz}}{yxwxy|~~|{z{|}{z{|~~{yxxxy{}~~|yvtssvy|}zyxwwy{}~~|zxwxy|~|yvtssux{~~|zxxwxz}}|{z{}|zz|}|zyxxyz|}}{wusstw{~~{zxwwxz|~}{yxxyz}}zwusstvz}}{yxwxy{~~|{z{|}{z{}}{yxxxy{}~~{xusstvy}~|zxwwxy{}}{yxwxz|~{xusstvy|~~|zxwxy{}~|{z{|}{z{|~~{yxxxy{}~~|yvtssvy|~|zywwxy{}~{yxwxz|~~{xusssvy|~~|zxwxy{}}{{{|}{z{|~~{yxxxy{}~~|yvtstvy}~|zxwwxy{}}{yxwxz|~~{xusstvy|~~|zxwxy{~~|{{{}}{z{}}{yxxyz{}}{xusstwz~}{yxwwxz|~~}zywwxz}}zwtsstwz}}{yxwxz|}|{{{}|{{|~|zyxxyz|~~}zwtssux|}{ywwwyz}~~|zxwxy{~|yvtssux{~~|zyxxyz}}{{{|~~|z{|~~|zxxxy{}~~|yvtssuy|~|zxwwwy{}~{yxwxy{~~{xvsssux|~~|zxxxy{}}{{{|~|{{|~~{zxxxy{}~~|yvtssuy|~|zxwwwy{}~~|yxwxy{~|yvtssux{~~|zyxxyz}}|{{|~~|{{|~|zxxxy{|~~|zwtssux{}zywwwxz|~~|zxwwy{}|yvtssuwz}}{yxxxz|~|{{|}}{{|}}{yxxyz{}~}{xutstwz}~|zxxwxy{}~~}{yxx~{qha^\]agou~wqlgeegimqtwy|~{yxy{yxuqolifdcdefhjnsuwxx|~~umga^]^`cgkpv{xpid`^^^_```__^_`acgjnrsvxyzwtrpnmklmmnmkjgecba`abeinrw{~}{xuplhea_]]^`bfjnrux{~}ywtqonmnoprsuvwvutrpnmmnpqssttsrqppppqsuy}~}||{zxurnkifffghhiihgfedcbbcdfiloruwy{|~}||}~~~~~|yvsqonmllkkkjhfdb`__`bdfghiiiiihhhijlnpsuwyz{|}~}||}}~~}|{zyyyz{|{{ywuromkihgggggggfdca```bdfhjklmmmmmmmmnoqrtvxyz{|}~}||{|||}}}}||{yxwwvwwxxxwvtrpnljhgggggggggfedccdegiklnoopppppppqqrtvwxyz{{|~~||{{{|||||{{zxwwvvvwxxxwvtrpnlkihhhhhhhhhgfeeefgikmnppqqqqqqqrrstuvxyyz{{|~~}|||||||||{zyxxwwwwxxxwvusrpnmkjiiiiiiiiihgggghjkmopqrrsssssssstuvwxyzz{{}~~}|||||||||{zyyxwwwwxxxwvutrpomlkkjjkkkkkjjiiijklnoqrsstttttttttuvwwxyzz{|}~~}}||||||||{{zyxxxxxxyyxwvusrponmlllllllllkkjjklmopqrsttuuuuuuuuuvwxxyzz{|}~~}}}}}}||||{{zyyyyyyyyyxwvtsrponmmmmmmmmmlllllmnoqrstuuuuvvuuuvvvwxxyzz{|}~~}}}}}}}}|||{{zzyyyyzzyyxwvtsrqponnnnnnnnnmmmmnopqrstuvvvvvvvvvvwwxxyzz{||}~}}}}}}}}|||{{zzzzzzzzzyxwvutrqppooooooooonnnoopqrstuvvwwwwwwwwwxxyyzz{||}~~~}}}}}}}}||||{{{zzz{{zzyyxvutsrqqppppppppoooopqqstuvvwwxxxxxxxxxxyyzz{||}~~}|||||||{{{{z{{{|}}~zvrpoopsvz|~{yxwvwxy{~~|{yxwwwwwwxxyzz{{}~}zwtrponnoqtwz~}{ywusrqqqqqqrssttttututtssstsstttssrrrssstuvvwxxyyzz{{|}~|zxvtsrqpppppqrstvy{}~~}}|{{zyxwvuttssssssssssttuuvwxz{||}~~}|{yxwutsrrqqqqrrsstuvwxz{}~}}}}}}||||||}}~~~~}}}}}}}}}}||||{{{{{zzyxwvvutsssssstttuuvwwxy{|}~~}}|{{zzzzzzzz{{zzzzzzzzzzzzyyxxwwvuuutuuuuvvvwwxxyz{|}~~~~~~}|{{zzyyyyyzzzzzzzzzzzz{{{{zzzyyxwwvvvvvvvwwwwxxyyz{||}~~~~~~~}}|{zzzyyyyyzzzzzzzz{{{{{{{{{{zzyyxxwwwwwwwwxxxxyyzz{|}}~~~~~~~~}}|{{zzzyyyzzzzz{{{{{{{{|||||{{{zzyyxxxwwxxxxxyyyyzz{|}}~~~~~~~~~}|{{zzzzzzzzzz{{{{{||||||||||||{{zzyyxxxxxxyyyyyzz{{||}~~~~~~~~~~}}||{{zzzzzz{{{{{|||||||}}}}}}||{{zzyyyyyyyyyyzzzz{{||}~~~~~~~~~}}||{{{zzz{{{{{||||||}}}}}}}}}}||{{zzzyyyyyyzzzzz{{||}}~~~~~~~~~}}||{{{{{{{{{||||}}}}}}}}~~~}}}||{{{zzzzzzzzzzz{{{||}}~~~~~~~~}}|||{{{{{|||||}}}}}}}}~~~~~}}}||{{{zzzzzzzzz{{{{||}}~~~~~}}||||{||||||}}}}}}~~~~~~~~~~}}||{{{zzzzzzz{{{{{||}}~~~~}}}}}}}||||}}}}}~~~~~~~~}}}}||}}}}~~~~~~~~}}}}}|||}}}}}}}}~~~~}}}}}}}}}|}}}}}}~~~~~~~~}}}}|}}}}}~~~~~~~}}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}~~~~~~~~~}}}}}}}~~~~~~~~~~}}}}}}}}}}}}~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}}}}}~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~~~~~~}}}}}}}~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sjc`_aflu{ytnhecbbdgkqw~}yvsrqomkkkkjjijlllmmqtux{xrlgdaabdhnu{{vqlhfdba``aabceffhikmmmnoopnnnnmljjihgfeddccccdefgiknpsvy|}zwtqmjhfdcccdegjlptw||zywutrqqpoonnnmmmlmmmmlmmnnnnopppqrsttuvxyz{|~~|{ywutrpnmkjigffeeeeeffgijlnprtwz|~~~~~}}||{zyxxwvutsqponmlkjiihggfffffffgghiiklmnpqstvwy{|~~~~}||{{{zzyyxxwwvvuttssrqpponnmlkkjiihhhhgggghhiiijkklmnopqrstuvxyz{}~~~}|{{zyyxxwvvuuttssrrqqppoonmmlllkkjjjjiiiiijjjkkllmmnopqqrstuvwxyz{|}~~}||{zyyxwwvvuuttssrrqqpppoonnnmmlllkkkkkkkkklllmmnnoopqrrstuvvwxyz{{|}~~}||{zzyxxwvvuuttsssrrqqpppooonnnmmmmllllllmmmmnnoopqqrrsttuvwwxyyz{||}~~}}|{zzyxxwvvuutttssrrrqqqpppoooooonnnnnnnnooooppqqrrssttuvvwxxyyz{{||}~~}}|{{zyyxwwvvvuutttsssrrrrqqqppppoooooooooppppqqqrrsstuuvvwwxyyzz{{|}}~~~~}||{zzyyxxwwvvvuuutttsssrrrrqqqqppppppppppqqqrrsssttuuvvwwxyyzz{{||}}~~~}}|{{zzyyxxxwwvvvuuuttttssssrrrrrrqqqqqqqrrrrssstttuuvvwwxxyyzz{{||}}~~~~}||{{zzyyyxxwwwvvvvuuuuttttsssssrrrrrrrrrsssstttuuuvvwwxxyyzz{{{||}}~~~~}}||{{zzzyyyxxxwwwvvvvuuuuuttttsssssssssssttttvwxyz{{|}}}~~~~~~~~~~~~~~~zvtsstwz}~|yvtsrqrstvy{~~|{yxxwwvuvvvuuuvwwwwxzz{|~|zwvuttuvx{}~|zxwvuuttttttuuuvvwxxxxyyyyxyxxxwwwvvuutttsssssttuuvwxyz|}~~|{zywvvuuttuuvwxy{}~~~}|{{zzyyyxxxxxxxxxxxxxxxxxyyyyyyyzzzz{{|||}}~~~~}|{{zyxxwvvuuuttttuuuvvwxyz{|}~~~~~~~~~~~~~~~~~}}}}}||||{{{{zzyyyxxwwwvvuuuuuttttuuuuvvwwxyyz{{|}~~~~~~~~~~}}}}}||||{{{zzzzyyyyyxxxxwwwwvvvvvuuuuuuuuuuvvvvwwxxyyzz{{||}~~~~~~~}}}}||||{{{zzzyyyyxxxxxxwwwwwwwwvvvvvvvvvvvvvvwwwwxxxyyzz{{||}}~~~~~~}}}}||||{{{zzzyyyyyxxxxxxxwwwwwwwwwwwwwwwwwwwwwwxxxxyyzzz{{||}}~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxxxxxxwwwwwwwwwwwwwwxxxxxyyyzzz{{|||}}}~~~~~~~}}}}|||{{{{zzzyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxyyyyzzz{{{|||}}}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyyyyxxxxxxxxxxxxyyyyyyyzzz{{{|||}}}~~~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~~~}}}}||||{{{{{zzzzzzzzzyyyyyyyyyyyyyyyyyyzzzzzzz{{{{|||}}}}~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{||||}}}~~~~~~~~~~}}}}}}||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~sjc``bgmv|~yslhdbaacfkpv}|xurqpmljjkjiiijllmmosuwz|xrlgdbbcfjpv}{vqmigecbaabbcdffghjklllmnnnmmmlljiihgfeddcccccddegikmorux{~~{wtqmjhfedcddfhknquy}}{zxvtsrqponmmmllkkllllkllmmmmnoopqqsstuvwxyz{}~}|yxvusqonlkihgffeeeefghikmoqsvx{}~~~~~~~~~~~~}}}|{{zzyxxwvutssrqponmlkjjihhgggggggghhijklmoprsuwxz|~~~}}}||{{zzyyxxwvvuutssrrqpponnmmllkkjjiiiihhhhhiijjkklmmnopqrtuvwyz{}~~}}||{zzyxxwwvuuttsrrqqppoonnmmllllkkkkkjjjjjkkkklllmmnoopqrstuvwxyz{|}~~}}|{zzyxxwvvuutssrrqqpppoonnnmmmmllllllllllllmmmnnnoopqqrsttuvwxyzz{|}~~}}|{{zyyxwwvuuttssrrqqpppooonnnnmmmmmmmmmmnnnnnooppqqrrsttuvvwxyyz{||}~~}}|{{zyyxwwvuuttssrrqqqpppoooooonnoooooooooppppqqqrrssttuuvwwxyyz{{|}}~~}}||{zzyxxwwvuuttssssrrqqqqqpppppppppppppppqqqqrrrsstttuvvwwxxyzz{||}~~~~}||{{zzyxxwwvvuuuttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxxyyz{{||}~~~}}||{{zzyxxwwwvvuuutttssssrrrrrrrrrrrrrrrrssssstttuuuvvwwxxyyzz{{||}~~~~}}||{zzyyyxxwwvvvuuuutttttsssssssssssssssstttttuuuvvvwwxxyyzzz{||}}~~~~}}||{{{zzyyxxxwwwvvvuuuuutttttttttttttttttttuuuuvvvwwwxxyyyzz{{||}}~~|xtsrstwz}}{xvtssrstvx{}}{zyyxwwvwvvvvvwwwxxz{|}~}{xvussstvx{~|zxwvutsssssttuuuvvwxwwxxxxxxxwwwvvvuuttttsssstttuvvwxy{|}~~}{zxwvuuttttuuvxy{|~~}}|{zzzyyxxxxwwwwwwwwwwwwwxxxxyyyyzzz{{||}}~~~~}||{{zyxxwwvuuuuutuuuvvwwxyz{|}~~~~~~}}}||||{{zzzyyxxxwwwvvvvvuuuuuuuvvvvwwxxyzz{||}~~~~~~}}}}}||||{{{{zzzzyyyyxxxxwwwwwvvvvvvvvvvvvvwwwwxxxyyyzz{{||}~~~~~~}}}}|||{{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwwwwxxxxxyyyzzz{{||}}}~~~~~}}}}|||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwwwwwwxxxxxxyyyyzzzz{{{||}}}~~~~~~}}}}|||{{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}~~~~~~}}}}||||{{{{zzzzzyyyyyyyxxxxxxxxxxxxyyyyyyyyyzzzzz{{{{||||}}}}~~~~~~~}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{|||||}}}~~~~~~~~}}}}}||||{{{{{{zzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~~}}}}}|||||{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{||||||}}}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{|||||||}}}}}~~~~~zogb``diqz|vqjfca`adhlrx~zwsqpolkiijiiihjklmnosvx{}}uojfcbbdhlry~ztplhfdcbbbbcdegghijlmmmnnonmmmlljihggfddccbbccdefhjknpsvy|}zvspljhfedddegilosw{}zyxvtrrqponmmmllkklkkkklllmmmnoopqqsstuvwyz{|}~~}{ywvtsqomlkihgffeeefggijlnprtwz|~~~~~~~~~~~~~~~~}}}|{{{zyxxwvvutsrqponmmlkjjihhhgggggghhijklmnoqstvxy{}~~}}}||{{zzyyxxwvvuuttsrrqppoonmmllkkjjjiiiiihiiijjjkkllmnopqrstuwxy{|}~~}||{zzyyxwwvvuttssrqqppoonnmmlllkkkkkkjjjjkkkkklllmmnoopqrrstuvwxyz{|~~}}|{{zyyxwwvuutssrrrqpppoonnnmmmlllllllllllllmmmnnnoopqqrsstuvvwxyz{|}~~}}|{{zyyxwwvvuttssrrqqpppooonnnnmmmmmmmmmmmnnnnooppqqrrsstuuvwxxyz{{|}~~}}|{{zyyxwwvvuttssrrqqqpppooooonnnnooooooooopppqqqrrssttuuvwwxxyzz{|}}~~~}||{zzyxxwwvvuuttsssrrqqqqppppppppppppppppqqqqrrrsstttuuvwwxxyyz{{|}}~~}}|{{zzyyxwwvvuuuttsssrrrrqqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxxyyzz{||}}~~~}||{{zzyyxxwwvvuuutttssssrrrrrrrrrrrrrrrrssssstttuuuvvwwxxyyzz{{||}}~~~}}||{{zzyyxxwwvvvuuuuttttssssssssssssssssstttttuuuvvvwwxxxyyzz{{||}}~~~}}|||{{zzyyxxxwwwvvvuuuutttttttttsstttttttttuuuuvvvwwwxxyyyzz{{||}}~~zvsrrsuw{~}zxutsrssuvy{~~|{zyyxwvvwvvvvvwwwxxz{|}~}zwutsssuvy{~~|zxvuutsssssttuuuvvwwwwxxxxxxxwwwvvuuutttssssstttuvwxyz{|}~|{zxwvutttttuvwxy{}~~}}|{zzzyyxxxxwwwwwwwwwwwwxxxxxyyyyzz{{{||}}~~~}||{zzyxxwvvuuuuuuuuuvvwxxyz{|~~~~~~}}}|||{{{zzzyyxxxwwwvvvvvuuuuuuuvvvvwwxxyzz{|}}~~~~~~~}}}}}||||{{{{zzzzyyyxxxxwwwwwvvvvvvvvvvvvvvwwwwxxxyyzzz{||}}~~~~~~}}}||||{{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwwwwxxxxyyyyzz{{{||}}~~~~~~~}}}||||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwwwwwxxxxxxxyyyyzzz{{{|||}}}~~~~~~}}}}|||{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{{|||}}}~~~~~~~}}}}|||{{{{{zzzzzyyyyyyyxxxxxxxxxxxxyyyyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{zzzzzzzzyyyyyyyyyyyyyyzzzzzzzz{{{{{{||||}}}}}~~~~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{||||||}}}}~~~~~~~~~~}}}}||||||{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{||||||}}}}}~~~~~~~~~}}}}}|||||||{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{|||||||}}}}}}~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m28.bin b/applications/PoP/poc/res/music/m28.bin deleted file mode 100644 index fbdd262..0000000 --- a/applications/PoP/poc/res/music/m28.bin +++ /dev/null @@ -1 +0,0 @@ -{wvtsttvxy}~||}}upnllnpqrsrqpnljgfffgknry}uy|ywwvxy|}ytqnlkklmoprttqi^Ydttjefkry~{yxxy{~|suwwz}}{wtqnmmnpsuvvuusrqppoonmlllmou||ywutrqppopt{{pgdj{wg\WUUVWXZ[[Z[_iw}yuqopu}~wu}wmb\euzvsqqokje`dptpmmnpsvy||zvqlo}yvtstw}}zvt}uhZ`hejvyupje^Wbz|vqmjiknrw{zu|wuttvwxxxxz}{yh_ryqpt|{ywyzxox{yz|~{tlcozslgdb`_^_bhpz|~{zz{|~yy{twwlaTQozpf_ZXWX[^acefgjmqqip}vssstttuvwxyz}|yxy|o_l}ofbeku}xqkgefd\Yig``abdfinrw{~{oh|urpqrtvxxxwx{{pw||}}uhnoa[[_grwj[fzme`_`cglquy{|~~{xss|tnkjkmoqrrsuy||uzsnrd[Z^huu~|yz{|}{qg]n|rkfb```aa`^]_cjrsv{t{xvvyn^^}|qf^WSQRTWZ]_`behjgamxonoqrrsuwy|}}}|{yvpk|}}~rixh\RNOV`my~yrffrkcccdddfimrvz}~zqeevpnmnpsvy{{{zyy{~~tjx}xutuwz}~~vozykeb_\\`hszkzricaabehlptwyz|z}wmbY_}vqnmnoqrrstvwunw~{~ux}od]YX[bmz|tj_Yoypjd`__`bccba``a`[_uzxvq~~}zxx|tv}pg^XUTTWY[]^_adeb\jtkjlnopqtwz~}xodZitmvh\SLIKPXcnx}{}rpnmlkkmptxz|~~|wnbb~~unlklorvy|~~}}}|yr~~rhvzurpqsvy{|}~xruqmjfcaadjr|zqmkjknqtvxyz|~y{{obUSt~{ywvuuvwvvuuuwxvnu~z{}wy{pida`achnv}uj_Vhyohc`__acdeeddded\Yinilszyp}|}ynfb`__`````bege]gunklmopruy}wk]bysqtywmvkaZURQRTW\cmx}{z{}zrf`yxqmlmptx|w{xlq|vsrrtwxyzz{}}u~yvtqomllmoqty~||}~{~ti]Vm{snkknsw{~}||~}uw}|}~{xztpmlllmmnorwxnbXe|rkfcbcdfgggggijjc^kpgegjou}u~}}}zxvtqmu|vrpnmljhhhjkiahvqllmopsvy}zobeyoihjpwum{rjd`]ZXWUTUY_gnowuiczyqmlmosw{~z~}qv|vrqqrtvwwxy{}~zt{yxwvututttsssssqli}}~uj^[szoga^^afmsx|x|~}}~wx{vtrrrrsrqpooquz{|~sg^mzqjebabcefghhijkjcanpgeefgimszz~|{}}wohaYU`~}{ywusrrpkdnwollmnoqsvz~}vlblwmgdcehnu|{qn|tmhdb`_][YXWXYYV_sxyxllxqmllnptw{}~x~~~~}v~wspopqsuvvwxyysq~{xxyxxwwxxyyxvsoiaXUk{rh_a{{pha\YXZ^chnsx|z}sz{wutttuvwvusrqpokjz{ohy~umhdbbbdfghiijkiccqqigghghikouz~~~~{si_TLUt~|||}}ztnw~uqqrrrsuwz}}vldoypifeefimqv{ypn|uokhfeedb`_]\ZWQUdedipxxvwsqpqsvy|~zyt|xusstuvwwxyyxtq}{yyzzzz{|}~~~|ytmdYSbwwqnosy|sjac{vnga][[\^`cfkouyzw}tx}ywvwxz|||{zxwvtnis|xx||twqljiijjkkklmnmgfsvolllllmoqtwz}yxypfZPRk}ysmkjlpu{|~|{zz{|~{qgmwpljjkmpsuwy|{ql~ysomlkkjigedcb_WVcd__bfls{~{zz{~}ytnis|{{{zzyyyz||wr|{z{{|}|wnbW`vxogddhnvxoeaw|slgca``aaaacfjopmtvv{yyz|~~~~}wov{vvx{~{vsqpppoonopqqkhtztqpppqrtvxz{|}}|zunk~vlaUUl~{rib^]_chou|~tjo|uqonoqtvwxyz{~{ql}{uqonnnmlkiihhd\Zfg`]]_aekrz}xqjb]g~~~~~~}|||}|wr|{zz{|}zqe\ez{pg`^^aelt|zofd{~voifccbbbbbbcefeahy{x{~uwzxxy{}ys{|vuuvwz}~zwvvuutssssqkiwzspppqrsuwz|}~}{xslcav}~wlaW\v}rh`YUSTV[`flrx~}sju{tpnnoqsuwyyzz{|zvwzooxrnkjjjjjjiihgb[^jh`]\]]^aejpw~~vndZVe}yvuuvwy{|}}}}}ztr~|yxyyz{|yoc^m}pf_[ZZ\`ekqw}{pgk~voiecbbbcccccca]Ycpmjmquz~~u|~ywvwy{~xu}xvvuuuvxz}|xtw~}||{zyyxwsmn{|trrrsstvx{}~~|wqh_^sysqrtx}vlbZb|vlc[VRPPRUY]aflquuwvp{~wsqqqsuxz{|||}|ztu|tt{upnllmmmmllljf_bnkda````acfjnrvy{|{ws{xpf]Wd|uqnlmorux{}~yw}|||}}{rgbpvle`^]^`cfjnquzxoq}vpljihhhhhhggfb]comhhknquzz~{{{}}y~|{zyyyyzzzyxurnjfg{}wu}zyyyyz|~}wnd`qyrnmnqv|{rh_cz}sjc]YWVVVWXZ]aeiijvy|yyy{}{xyv|xutsssrqqqqqnggrtmiggffgikmoprssrplgj}vmd\c{~wqmjjknqtwz}|yogp~unifefgijlmnpsvz|{~zwzwtsrrqpoononkdfrrmkklnquz~~}}}}||zwtpkfa[Zh|tjeq}upmmnrv{~uldezyqjea^]\[ZZZ[\_a`^hwzz}{~xv~{zyxwvuutttqkjuwrnlkkklmnopqqqomic]_ryqhag~wqkhffgilnqtw{~|{zqjsxqljiijklmmnnoqrror{ywvvutssrrqmgkutolllmoqtx|z~}}|zwsnhb[TRa{~||}}umjx|uolkkmoswz~~vmglzslgc`^]]\[[Z[[ZWV_jjilqv{~~|xsor|zyyyxwwvusojmwwqnmmllmmnpqqqomhc[UZm{ytqqsv{zqiepxqkgdcbcegikmprsqsxpmzxqmkiijklmnnnnnmkglx{xy||zyxxwvvutqmioxuommmmnoqsvy{}~}{xrpz~~|zwrmf_VPP`w~ytpmllnquz~vnn~~vqmkklnpsuxz}vniq|unidb`_^]]\[[ZXSR[db_adhmrx~}yuoiej~|{{{{zzyyxvrmpzzsppooopprstttrojd[TXkwtmhffhmrxvnjt|uojgedddefghjkkikx~}~|sq}}vronmnoqqrrrrqpmhkvyustwz}~}|{zxsns}{usrrrrstvxz{||zwrlhq|wqjbYRO]t|xrlhedegkosw{~usytrqrsuvxy{|~||smq|vplihfedcbaa`^YU[ed`_acfjou{~ytngaas~ztt|xvvvvwxyz{{{yvqjbYXhxwpieddgkpv|~unuxsomlkjjiiijkkgfp{{z{}{t}~yvuuvwxyyyxxxxuonx}yvuvwy|{~}vx{yyyyz|~}ytlei}}wph_VQ[r~{tmgca`acehlosx||x|yxyy{|}}~~{~wps|wspnlkihgfeeb^X]ggca`acfinrw|}ztme_^m~||}~~xy~|{{{{}~}yune\[jyyrkfcbceimrv{zt{~yusqponmlklkjecmwvttvy|}x~zyyyz{||||||zwqqzzvutuuwxz|~~~}{yuqot|~}}}~}xrjch{{xxy{~yqjaYUaw{tmfa^\[\]_bdhkorsrw~|{{|}~~{w|wsy~yuronmlkjihfc^Zaiga___`bdgjnqtvxxwtpp}zsld^`r{vsrrrtvxz|}~~{w{~}}||}}~}ytmd^aq|xphc`^^`behlosvz}~{{wtrqponmlljgcclspmmnqsvz~zz~{zzz{|}}}}}|yuqt}~yussrrrsstttsqnjfcbl}wpidl}ytqppruy}~yrkc\\j||tmga]ZYXYZ[]_aceeeky~~zw|{vt}}yvtrqponmkifa_flidaaaabcegikmnnmkgdes}vogbeu~xspnmmnpsuwy{||zw|}wqicfu{slfb```bdfhkmoqtttu|zxwvutsqplhgouqnmmopsvy}zz~zvw|xvuttsssrrpnkhd_[Zbw}vnio~|vrpoqsvy}xqibal~zrlfb_]\[[[\]^_`_^bnvvwy}}~ytry~|zyxwutsqojfkrqlihggghiklnnnnlid_^gz~woiht|wsponopqstvxz{zx{zrjjv{tnjhgghijklmnpqrpov}|{yvqntzyusrrsuwy|}yw}|}{zyxxwvusplhc_ZVYi}wpr}xustuwy|~xpifmztnjgdca``___``_\]foppruy}|ytpms}|{zyvqmpwxspnmmmmnoppppnlhc]Y`q}~{xwxz~}unlw{wsqoooopqrsuvusv~vonzztpmlkllmnnoopppmkp{~}~{vsx}yvuuuvwy{}~{wrq{~}|{zywuqmhb\VRUex~zwuttuwz}ztwzvtttvwy{}{sljt~wqlifdba`__^^][WXbihfgjmquz}yvqmhgp~}|zwrpu|zurpoonoopqqqomie_YW_pxuqmkkmpty~~wqs}wspnmllllmmnmkjp{}|}~vqt|vqnmllmmnnoonnlhgnwwtttvx{~}|ww~zwvvvvwxyz{{{ywsnjky~}|zywtplf`YSPWix{wsnkihhjlorux|~|x{wuttuvwyz{|}}{z|zsno}ztokhfdcba`^][XTW`eb``adgjnsw|~~{wrmgcbm}|||}}}}}|{xtsy}xussrrrrssssqnje^XV`pvrlhecdfjnrw|{vy{vspnmlllkkkigekvywvwy{~ytxzvsqppqqrrrrqpnjhowwsqqrstvx{}~~|yvtv||}|{{{{|}}~~}zwrlghu~|{|~~{xtoic\URXhx{xrmifdcdegjmoruwyxy~|zzz{|}}~~~}|yy}wrr~|wspnljigfeca]YZbgeb`abdgjnquy{}~}{xvzzuoicah{~|||}~~zx}}|{zzz{{|{zxuqle]Z`pxvpkgeefhknrvy}}}}{xwutsrqpolhktyxwwxz}~yz}{zzzzzzzyxwuqmqy{wtssstuvwxyyxwtrolmx|wqjhq}||~}wrkd]WXfw}{vplhedddeghjlorsssy}{zut}|ywusqonlkie`_ekjfdddegiloqtvwwwtqnq~ztmgcgw|{zz{|}~}{|xrkd_cqzytnjgffgiknpsvy|~~|{yxvusplmtyxvvvxz|z|~}|yuqt{}yvtsrrrssssrpnlifddnzsmkr}zxxz|~{uoha\^kz|wrmhecbbbbcdfgijiip{}|{wtu}{yxvtsqomiddjnlhfedefgiklnoonmjgehv|vojgm|~zwuttuvwxy{||{yy}ytmfdjw}ztnifdcdefhjlnprssrv}{zxvsomovxvsrrstvx{}|xw|}zvtx~}yusrqpoonnmkifc`][^j|ztoox~yvtssuwz|}wqkebgt~xrlhda_^^^^^__`_^`gqttuwz~~~~~~}zxurpt}|zyxvurokhioqnjgffeffghiiiigeb_]bp}~||}ysnmt}yvsrqqrrstuvvvtv}|wqkjq||vplhfedefghijkllkknw~~}~}{xtqtz{xtssssuvxz{}~}|zwtsy~zy}|yvusrqpomljgd`\XVXdu}|||}ytt||xutttvxz|~|vpkhly}wrmifdba``___^][\bjnmnoruy}~}zxuqmlo{~}|zxvrnotxuqnmlkkkllmmlkhea]Z]iv|{xvuvx{~ztqv~zwussrrssttutrry~xrotytpmlkkkllmmnnmljksz{{{|~}yy|zyyyyz|}~~}zwrps}|zyxvtrolhc^YUT\lz~~|zxwxyz||y|zzzz{|~}wqmny{vromjigfedcba^[_gllklnptw{~{xtpliis~zvuz}zwutssssssrqolid_ZZdqxxvsrrsux|zvy}{ywvuuttttsqpu~~wtx|xusrrqqqqqqqpmjjpwyxwwxz|~}{~~~~~|ytplo{~}{yvsoje_YTSZjw|{xusqqqrtvxz|~~}}}}~~~|~ysps~|wtqnljigfdc`]Z^eihgghjlosvz}~}~{wrmhefq~{wx~}zywwvvvvvutqnid^YZerwuqmkjjlnruy}~{}zxwuttsrqollrz|{zz{}}xv}~zwutttsssrrqoliipvurpppqrsuvwxxxwusqrx~}{xtokin{~}~}{yvsojd_YUV_oyzwsolihhhijlnprtuvvzvmrywzztokjkloswz||xob_c]UQOLIHIMQW]chmqstslk|{tmquq}|y}{|~wrnmha\XXY\`fjnruuo`LUvzstx{|~xs}vz~}ptfWIN]WW]__\YZ]afjoruwz||us{ov{mie]VZeoqmihijlnqqnfk}{n^QJg|wvvy|{po|vrvxxwuuvxz{zxtqnjg_Zltpw|}ztoiebackv|otww|x~yf_[Z_l|wme`[VO]srtyywspnopsvwxxyz{xnk{xqtuusrqqqrqnibZSMJJQt~{|~unhfgkt~||||{yuojbYPICSrwutqlfa^\\]^__^_acc\Wfg_bgnvwvh[RMWwnhd`]YVUSTTQGN[TSVY[\^aeinqstutrmdW^~}yxxyz{}|pfz}qismbaciq}}rdRH]ne\WUVXZ^bfikmnorvyyrywlcn~}|{yxyz{wny|{~|{wtrqrv}}zwutstuvvurnic[RGB^}~xsomlmoruxz||}~vv~vvx}}nj{{}}pcWMFYxohb^ZWTQOOORSOJYa\]afimrw|}rynm~|xqbah\TSU[do{}vl_OOkshb_`cgmsx~}rg]Wn}xutttttsstvyzus~tvojfb``adjqzzri^d}ywvwxyzzxwvvvupfmsiefims{wku}si^TJCEizvsqonljjjklldhxuqsuwxz}ykjzspnnopruy}}qhv{xvvwwwvtromkg\T^^SRTZbmyshz|urrsuy|wne\T\{yxxxxwvvvwwsluywxz{|}vjrvnjgedeglrzyqf[Voxqlhedeghjkkkkkkh``njcdgkpv~{nk}xuuwy||sjaXUi|yvromkjha\infegijklnqtx{}~zsias|tponnoqtw|}ukac~zwuuwy{|||{yxuoehrhcdhnu~{km{qjhgijmptwy{|}~|x~ulaWTlytomlkkkjjjjkjddtvoqtwy{~~yzvspppsw}}woeZQZ|{snifeefhjllllllic\fmc_`cfjpw~ylam}urrsvz~}sh]TVx}yvsqnkigfdaY]licdgijlnqty}zqeeumigffgilpty~um|}zwrh`jl`]^bgnwshvypkiiknquy|~|}yqh_TLPszvrppqrssttvxywqyy{unjgefgkpw~yqf[Tfyqjeb``acdddccccaYUbd[Z\_djqzxqypf]TMV}~|zxurpnnmh_gslgghijlnqtxz|}}{xrg\b~wmgdbcehlqu{wp~{yyyywusqnmkg\Xed[Z]bhq{xo}snkkmpsvyz{{|}~v}~wof]Ua}vxkutkfdcdgkpu||tk_SOh|rjd`__`bdffgghjkiacrpjilpu||yxog^UOa~|yvromlkjc\iphedeghkoswz}~wlbtwrppqtx|vkj{vuuuuutsqomljeZ]ic]]`dks}pqxokijmptwz|}~~|tkb]s~}|zyyz{ztr}||~rk~{pidbacfjnsy|ulbX_ztomllnpqrrrrrssmenwpklnqv|s}~{{}}une]TMNl~|{ywusrrqnfixuoopqsux|xmnvroooqtx{{piw}wsqpoonmkigec_VQ]`XVW[ahpy}u~xuuvy|zri_X_~{zyyzyyxxxyyuox~zz{|}{odkwkb]ZYZ\`ejqw{pebyysnkiijkllllkkjf_`mkddfilqw~wv{zz|~~zuoh`XPM_~}|yrnzwttuuvwx{~~vkdt{rliggikosw|zpgixrmigffgffecba^XQWb]XZ^cipy}zyy{}~yskc[Zo}{zyyyyxwvvvsmmz|ustvvwxz}{rgdv~sjd`__`dhmtz}tibizsnjgffghiiiiiifa]fnhdegknsyzr|yvuvwz}}xrkd\V[v}zvoq}{trrsstuwz}ypgi~wpkihhjlptx|}tkerytpmlllmmlkihgc]Ydib`bejpw{yyy{}}wog_X\x~{ywwwwwvvuuuuqlr~{vvxyz|~~tjntlgdccehmrw}|sidrzsnkihijjjjjiihf_^ilecdgjnsyyt|zz|~|vpib[V^|~yrx}xvvwwxz|xofl}tmhffgimptw{zqm~}xtrqppomljhgfc[Yega_aejpw~~~xrld\Wa~~~~~zu~{pgo{pidaabeinrw}|rhfyysnkjiijjiihhihe^`lmgfhkotz~~|wqke_XUp}vrsqr}wldo|pjjkheddfjnqtvtsqpyyidw{ph`YST`kkigghijje]_e\NLTXRNNQW_hr~o{xp{{mndSLHGINT[bhmmh[a}n_Xhyvmd_]^^_uy^DNujefhkmopmajpcb`[Vanmkkklopqxztlmnpsx|~|wsnmk~|mg_WXqzwsr}jYPJftaVSRTVZ]]Udg_ghfdq}{w|~{xtokz{wurqpqqng\RIFFfpeaaejpu{}wuxxhVHFo|l`WQLIHHA=NHFMMJGTehhiid^Rbysonopstrmgr|qvxz|zpin|yphhwewyvwz~qbQUrf_[ZXYXZQVdZ^bb]ZevxxyztiZtxqnnllkjgcaqznbTa|ofddgjmqswpyz}{tkh{vj}kZHXvg\TMGD@=2EMTY^bgcuŴhliJ4-@hsfIES@64459AKWcmrqf]qeYimgmsurmhp|~{n|xninzsjkknppponmoinu]IAi}hWOMORLP_XTXZSdkhsz{l\NHLexz{~wu}x{urpi_mwszw|xungdmt_Mgy\VRA:KZGCFGIKRZdmtxvqg}}uyw{|jUOVC::Fbdxr\SONQV]elsx|{v}x}zma_aqyk`YRJNa`]eltr~sfesv}spnlllmmkg_WL[z|skmp|sonnnkiytpj_Vszwy~rmfeokogXQPRW]elu||vffvha___Zarrtƻzp\I<:Jdx|unhbTYVGURJJMSY`eknlb^}{y|{kws}q]UNGBFY{|wugaadfikpw}z~zkWC\|k`\\][RYjheav}wqou}yvtsqlf^TI@_zrnorqxq{|vw]\}~qmow~ytqr~{ggg[WX[]biruunl}}uqoonial}q{ɽvg[RJEIZsykunb\PQ`^Z\_`ba]Q_tpry~}w}~z|wg`[XUTYkvzvsrsvyszk[Xyldistnhdbbc_Z^itnov~~z}ulbVJ:?ish`ZY]fpvv|j[}wkegluukfl{~se^kj`]_bfam}qncfv|urrrf\{yȾ©wmg_VNKThu}tmjfaZdne`\UHCcshdchnvoy~uqquywvwnie_XRRXs}|st{nnapp`SMTesuoiggd[bcjnint|{}{ydQ@5Qh\RKHIMSZbkrvyqu}vviehmsytcP?Cy|wsmcgqhbZYjhfmsz}q|rke`coxqfpsbgy{zöwoiaXJKet{vsrogckbM?PfZQNQW_iryw||~{mjknqsx|}}vulcUC4Khszz|}~q^b}mbZSMJM[ktrj^dnc_Zbpmowu~m_[GLhaRE<77;AIPW_fkit~ykhuvprvx{}~}kYIVmeeq|{yumgmhjjacehkrz|zwqppnkhjvxt{pllhdp}{}ºzochaSXh}|uiVKWjbRKHILS[dlsy~~wjivtmmopqon~x`KLaVFCQkymistpa\[ZWRPVcknyqgggfcbq|yz}|xq{x~~lVIk~fSF=7569>DJPVV\rtsu|ytz}}}|w~k`y~jYLITj~{ohsxqjhikou{wxs~zz{ytnjlqxsqpokkw{qlhdqyog`^ey|l\enhcTMLOTY^djpuwvsiy~ywsns}xsqkp~yzvifqucTICCMcwnxvidoohfec_ZQ^vz{wrpqsurq~tje}jn|e`ZJA>==>@EJNLXgejqx|~}gv}l^SKHO`w}rq|zuvy}~wu|~~rkvy~{zxshaf`Shzuqr|tucV]b]\^`bfjpnt}p}xrysz}vwz~xp}l]WTRQT_t|sl{xtlmxvpni`hg`hw|qihm}z}~|kYLRRHB@?ADBBU[Z_dlt~|sf_YSNMVj~w~}yqgt|wpoyvoeXEHvzuru{yw|xpjb`mnfdegfbq|y~xyyzqnyvvy}zzjmpgb`]YW[i|viq}}}}{unu~ooxohdaesvi\kvmns|vh_aymcYMKSNFB?7@LHKQW_gpyzzputib\VQNMSs~qb`{{vux}{vpmr~qaRH]sjij`\_foyn]c{xuogktme[`nihlrx~wgjxoiku|wps}wx{~t~xrikwtjea\VM[vqkzvtux{}}~|xkiqnmkgefpscm{h_hnjmt|~lXSqzphaZOGLN=8D>:?BHOW^ekopt|{zxt}|h_nteZXbsxy|{||}|umgvzpqlaYTPLGFJQWdi_ZXXWVZhrpoomjq|j]htdZTPPQTX]adddqxrooy~xtt|xury{xvqu~~tf_\T^nfYMGIUhy{u|}ytrs~yxsiab{~pic__hy{l\Zfb\WJCACFJOTZ_cco~}~~v|{ywpre[VV^o~|xtnhj{peckjb\XTMDDWbehfcbcddbdnnc\j²|urnbZWVWX[^`_csvsuxyxzuju~y~viZVryhZPHDEN^r~x}qklfg}wrnlnws{|iXOTXSQPQTW[[]mxwy}x~tlhedfn}wohan{vrlfgong`UV\TRYfpttrqpmfZT\t}xx|¿oglle_\\]\Ydrqrtx|yt}xnervrodYRMIFITfv}qbWl}xwy}zsmklp}~qh_WW_`ZWVVQWgjkoty~~{}xytpljluti_]v}zxxwuqkfjlejh^WSRWdr|}xqi^SWjuwqklrzľuo{~tihnkd^VVdgehlrw}ytwxuy{unfkse_dd\TNJGEDSsxrfj~}}unmnrv{whYRiysoib[^d_SNY]YZ]chnswyxund]r~}~yslcbs{utk_j~vpnmnprssrnf[eupf`\YVUW_jrqgZWksgZW`ggjpw~xo}~ukehg]ac\[\_ciov{~~zsjl{vtttw~{wqkc\^uzslf^Y\a\SKB=GLO^q|}~ywx{{usrgelmigiknppvqbftpghq{~zuog]VXbbWQQRSVY]acc`\X_y{xwwwz|wmqrigo}wh]iwoieddgilnnmhkslcgnkea_\XUSTW[lzrf]WRRZhmmptxz{obfvqe_^^`cglprrnii{xu|{zz{zz|~zoe\Wc}~xsnkigea[X\\QPTKEEJVh|ws{pfad|ypic`fnmihfeq}|{la[^hw|thaeddaYUSSSTUTRPMNb}}uopy}zyzzzyzvpkikuuo{vlgeefgiklkju{uqnjhpvsmhaXLBJfwume_\\\\^hsspnv}y{~potrlijkmmmkfbk|wtrx~x}yyrd_pzsolkllmlkhbXUfj]UQNMPXfwtgcuzurnifmsmityvy~vnheelwwkbbhe^ZWTPLGCIcxyvrpomkr~~zz{vqopv}uxytpnmnoolo|{{{{{yvu{~vi\QVeeachlmlkkkiggmr{~xz{wtpjdao}{|}~wjdp}uqnnopqrrqohhngbhhc_]\[\aiszy{~}zwrkep}wwy~|wsppv|ulfgjdZQIB>Iconkiijlnooow}{skdbdm{tszzvsqnjr|{z|~~vqpjdoul`XV[eotusqpmfdp{}||ukabu}xvwy|vnxxqmlklmopqnksxrmhcgonie`ZTON`{tsw{sotsqx{zz}~xrmjwype^]XK??Rcc_\Z[]`dgjlljit~reYOUqztosxtkjttqrtw{~tg^mrf]WTTXaltvtnipslglvyyy{~y|{ypgp|xqkijnsx|}z{wywpkhffffdbjtronnmjfgmog\PECTdjr{yrmknv~}w{~vpkjrz{z{||zwt{|qntsqy}thYKFIVcaYQLIIKNRW[_a``ipr{~~n_Zgvtqsz}xrkgmywnkjlnquy|}|wpin}|srog`\YWUV\djlrxrkhebdmsqmjheem~tiuwlebbdhmrvz{{z~|wropu{qjlrpieb_[^jlijkmopqokedcZOTa^TOQ\l{~xsnjikp{~xuspnq{{uoiiyxoklr|wi[OOaol_QIDAACFIMQSS\ijgfju{{vqqwylb]_hu~wnnssvupmnoruvwupkk|ynefmniea]YUSZnywtqmjhdabih`XWg|rkghilnqtuuy{sja_rytnkotof`fmjghknqtwxwsj^TYovi[QKIMWgyysjeo|}yuuxtjk~|upmnt|yngp~xi_]YPIFEEFHJJLZeefilnpuyrw{srh`\\bn|vqv~~|zzywtniq|xtpnrzztng^]ffiqx{yvsnh`WTW[m{~}ywvwwwu|tjhy~yrmnryyrnnprvz}~{ulcfsuspg^YVUV[et~z~xx~uifw}~yrkhilowugZUXYSNKJIFJY_`bfkpuy{z|}wwohc`bir{~|{tliv}yvz~ypstlecemu{|xqi_ULPl|wuvy~|wuwstsy}{|rqy~zvuvxz|}|ztljxvjdhkhc_][\_ft|x{|tpz}{}ti]UVl{ri_WVZXRJELUUUX]bhnsvxwrkjwzrke`[]nvln|{|~}upywojebadjooj`WUcsrmoqollnrv|{|}}|}}wogh~wsru|~xsu|}zxwwurnheo}vpkebellgb]WS\js~~{}{~~{urw{{z{~re[]o{}{tnf^VQQPPSPKJLOSY^dgiifaao~||}z{}xoe]_ddfp|yolryspprux{~}xw{zxzxqje`[WUVXXZevyqh`Z[bedcehkmp}~yvuuuvvvtqmhiw~wromlmry~{wstz|vqkd_du~ysolkjigddhjd[Z_\XZbo|~umo}yvvxztons{}{zzyy~|upy}slimsy{yung^TOW^YQMKKMPSVYZYWWbuzuopw|||}{xyvqrne``ckwvpt}upoprtwy{|zzytruxskd\TLEEQk|{skc]XTTZbca__erxy~{xvtrpmifen|vv{|wtqnkiis}zxy|zpgcmzzsnlkkmnoomidaenmc\YWX\eq{}xt{xon~}zxuv|zywstkebeltz{xqigh`WW[ZUSSSTSRPNRcrspmkjks~}v{yqkhfglu~y{|ywvwyz{{z}~zutvvnbWMHPcmoqplhc`]ZWW]a`fnoptz}xsnhddr}yvtw~~{vplqxy~~vqqs~xroopsuwxxwtmkoqqoic_\ZZ]ckqux~|}z}voieeipwzzypia^`ed`[WRMIPcnnlkkmprsv~zuqnmnqw}||~|{~xpkjg_\enniefinpomifb]WXgrrpqtyypieix{y}~|}zz~wpt~ywvwxyzzyvtx{wpiiljd]WQLJMVi{{{tmigkv{tme`a`ZRLLU_fhhijlnqsuussyvngdgpzytqpqty~~tjfhe]TKFITgzvlc[SNQ[bfkqw}~wrmgb`evzpklmjfeehmt}}wqppt{vsqonmlllnops|wnf`\]binppu|upnnqu}xy}wrpwwv}l_TMJKQYbipuwtlaXVZ[YXWWRIDOj{thddfhijox||{}}}}|ywvz}|zslgegkqy~}z|sopw}}zwvtru}iQId|nWLJLNPONLIE@>Kbf_\^bhpzp[Xshb^\]]]^ckj``oi_aemwt`qpebcdhlptvwvqkx|lilrrnlklkhd^Wbtjb^blstssrmrvnns{|qvx~qmib[XVSRSWWcyommgaZWYcmmg\N;QiVNMPTY`gmpru}{xuvz~y}zywttxyxxyxunf^}zwuv|~wp~zviZd{dTE<7;DNUVURNAFOGT\][^eo{~u^kvka\XY\adedbb^otehgfdgp|msqqpkjknrtvvwpnvtxuqnsz|wodUF8T{tmgddegnuwsguzs}zwsty}|ylvkddknjd^YRHZ`apvwsqooommleOGe_MIGJMSZbimqqriq~~z~{}~oZY|zsx~|{ygVuq_PD=:Nqod\UQNOPSUX_eg_hpgjpw~xqjedzogceknmkhd^kqimprsuwz{zwsnb_vt`UOORZbinnnkg^`porvwxy}~ws|{zyz|~{lnxroopswz}}}~~|me~wkb[YYZ\]]\WTb_VWUTV[]\\ZWRLFX}zxuuuuw|unkmsy||ytkgrliquussv{xo}zurty}}zwtqnk{zupmeWGFeobYPKGFHKORTUTR\pkgjkmpv|n`T\{uplihhknmdfrjhlnpruy}{rd[pwh]VRQSX_gmpojdondglsvvvxzywqkerywz|yrzvwponpsw|~~yv|r|xolieba```_\V^h_^`_][Z]cge^RE?Xg``elrvz~vpnorv{~}v}tqppsx|~~ynurYWydRIC><;@Nevxn`_srccfjqx{e\rn{ymZ@>djPDACEHIHLYb[QBD[VLMQW^iuO^vFUfv|skb[]tw\U_OB>@ENXdpyv[?ppegoyvuwafxnkmqy~{ôoA$jØkN@>CLT\djoicyzspjeu}|fpwtuwzyrguzchvljjns{}od~pms\jwomqwo\HE§r`UPOPQUX\TTlkijhbs~m~ywvuqi`ot|~rnjlosvvsmgb^TT|vstvx|}u{¹sdVELŲtfZPICBAB59LFGHGANa^`cfgcYKjxpkmrx}|vips~{vkwunxj~sh`Pdtlgc_\\\\PZf_bbb\gzxx{~~zme|{zzytk_g}}urpquz}{woh_ZPkwpoprtwzyɸ½tdWIhtg\SKFDEB7GKEIIJDMb`_acb]NPy|rmlpu{~wik|}}~unkyqovwnf]Y~tmgc_]]_YTfc_bcc^f{{yz|xrbq|{||zuk_dzvqpptxzxrjaXPU|qmmnprsx}yxð¸}n`QWsg\RJFDE.KG4BD[QHG`iC\e_[G?[d]pts^gj[uoU{_juaH_iOMN<^P+`\Q_owx{vjPBSL5(8R`(8fvolba~}{oafI13]UW[wxƿƴìܶͨchm<2V?@F`tq|ryd~ql}uzgpn>TFTXVTcZHfcu{tw{}ka`z{wtrZVenz}wngY?WoMOaGLFL`ST[GJYf]ZCLg]FYghdW\Wawpjct|xasuosu}|~wyzoz|ƞֶ~{jca_enrZsnctbkump{szxniwwtjizpRO^^inp}yfWu}Wfy_cQJYZ`WPTT^W\[k|kTcjhg^]SMQSPCT[P>cTNf[hg[Sbqchguz~lobfxwjd[GCATNO=RhKcicunfqzvvgNOMU[SNGS\H>GHZp^acfOUt^X}qyrzüütyv|}nohzwwp|_tqtzx~~xv{v{uz{w}r~utq{}da}hUixyohRPLQV\TSuYYui|r~uoovrYWdnvpgaSEiiJcaRbTReqvcfryugknxn~zp}|v}u{VV`_VUC;BAJGI?_aOnfhvw|}}vvzwy~ywzotpztlaqjv~|rov{ug_wm`{mexjgt{}qxvzuill{i]kw}{qjcrpnmss}~yxzup{x[]ltoiUQTRR@?>PE7][Yoniqtvriu{yqqk\_gsrkrdZJZjLOcKS[JN]if`e`dPINZmgVVdmoha[^kaiorz~z}wq~}qpttrgY^[fcXSdmQdr`r|pikp~y}zpcdkwptojjnxfubsiZ`hj^a_\[MQWgpjafouuk`SXTNRUmjQYqTRdT[llcfcepo|{wh[f|z`W`lom`VVMUJ;=W\F`j\oyojimtnregtyzl_\hrgUPWdofi`YU[qa[yof{tju}}x~yufe|kx~xuu{zv|{z~}}lbl~{bYbnsrh`d`g]MMfq]ss}qkt~we[]dkcd[SU[jVIhbRd_QYfmiqqpqegrvz{}~rxhkno{yxhajthK@@EGGJBCYj]]wret{zº}zy}sv{~uqv}|xmcn{nyttroplmz~inqdv{mehlpuqnkcfq}~tjjrz~|vrrpu}{ml~isthp|z{zvuj\TXdkdSHGMQSRSQKG=?S]MMijaq|z~~||yxwsz{oqq~qmquy{usnkr}vnr|}||ytmpw}}xphsy~z{zzvts~xv{{xstwylhmrm[I@?AEHNROMHGWkdYmyhfv{vwz~}zx{}{vttupkidit{z|lgwybcvn_dqyzwy|z{ukceowuj_Z\_bcfe_[TTdpd^vqsyzvpnkikjo{xgotfuujhlqusrrot~yw}~|}zphirxtfYTW\`acc^ZUVgvmg~|zmfhqywj]WX]adfgb_\^n|rjzrlhdedgsxn^dvl]jvnb`djoomnns~}y~{pbapnX[ok^_ktwwxxtneVKJPTM>/*,3:@GJJJJPdqe`v}ll}{rxrtvsxzojkoruwvrnkr{|{wsqqrzujynhw}rgegjkigfgmw}zqhgnv{{zzzz}}uhco{o`mxk_bkpqopmgbXOMS\_WKB@BFIKMKHHJYif[i{p{}~{~ywx|{xyx|}y}~~|vps|xlefjorvvrpouzxz|{q}}q~|wx|}~zmfp|rcn}uikt|~wnbVQSXXPB735:AFLLMOTcql_h{uhnzyzwtttz|pq}hfvvgahptuwwtqkdbfpwvmb\[]`cec_^_ix{oo}|xttwyrm|qkz|qjjlmkkmpxwpou}zpqwm|ujmty{{zvpi`Z\ckkbWOLNQTWWTSU^nujg{||}z}vnhiowyrg^[[^`bb^\]et}tl{|yustvz}odm{rcjxyphfhkkloszzuw~}zvl_YaldSXhfYU\ejmnlg`XOKLRSL@3+*-28=?@DM\ki^dxykjw|t{nntz}}yuomqy}tlijlnoolkmw{w~xp|yls~tkggggfhjpw{yqhegmty{zzyxumb`lvl]cqobZ]begfc^XRNMSZ^[RICABDFGFEGO\fcX`vyoo|~~}~{ysory|sjfegijjhhkt|u{s{st|wwxyz}~zpd_epm]Zjri`_ekoppke]UPPTWTK?62259=@BFO]lndaq{rgky~{po|}pedhmopplhd`afovvpha^^`bddcekv}rs~ws}os}tomlklnrw~xpkkpvz}~}yphhr|vfguxmb`cgiihc^YTSW^cc]UNKJLMOOORZfqqgi{z~}zvx{}}zvqlhglswwpha\[\]___bit~|rr~}~{njvwjm{~wrpqqrv{xrprvxyxuqle[RQ[e^OQ`f^TSX]`a_YRKD@BEHE>5/-/49?DHOZhrodev~tlq~suxmjlprsroligjpx}}xqkihjkmmns|~tvwnt{smjiijlpuzzvnfbdhmqstsqmf_[bnobX_ji]TRTVWWTPLHGJPWZWQJECCEGIKOYgtztsͽwvria_^_bdgbUP\gbUQ[de_XVVXZ`gpzrkgd_YQH@:79>AA;4,'%%&(+/8H_uzgN}TmھҠ{yvlc\WTSTW[_`^XSQSYaiotwyyxuv}uj_TKECB>7,"#',3?M[a__qydW[|´ʹ»xohc``befe`ZVW]dlsx|}~}yx}~}}~̴l_[ct~tj_RJP^bXPVbf_WQMKIIJLNOMF=40037<>@A@?<:>KY[RQ_orlilqx~źƴ}|lfklf^WSQPSVY]``\UMHIKNRTUUSPLHIS_aWQZinhbbglquxyz|Ǿƻxd\cljel{{ocZRMKKLMMHA93/013330+&$( *31+*.4:>AAAABFMTZ\ZWVW[aiqyŴxmbZVVX\_bb`\WPKKRXP@:BJG=41358:;<>AGQ[elnnnnquz}zpuwmdaagpy~~wlaYRMHE@;60)"!'13( +0+"$+39<;988:>CIOWcq{{z|xyznaXTX\UG?ENNF=87888753359@FIIFA?>?BEINVamttnq¾żſ~}~wojgeeghhfb^_b_Q>5:@<2)$###" !*5BMSPJO]jib`ht}{~}ygVJB<730,))+06;=;85211258=DMUVQLQalkddlwſ{qjgedegikkklrxvj^^jvxtokgd]WPG?9778984.($! !"%)08?@:5:HSRLKR]gnty~ýż~uoov}~}tpqty~~{xusqmf^SI@:632249?EE>68EOLD@EMU[^aceedb`_`emu|~shaac`THIUbfdaaaa_\YVUWZagjid[RJC?<::416?HPW]chlnnmlmqw}Ŀwh]XX[^adfikpu|}ug\]fh`UQTZ_bcccba]YURRV\bgjkklnpstsojjt~x|}qhb[SNIGGKR[dkmlhecceiov~|tw}xj^Y\_abaa`^[XROMNSY_cdeffhjlmjeadp{{spxwplkllljgeefikoqu|}wrlf^WOIFGJNRSSRQQRSTSOIFMZa\TWbmstttvx||wsqojcZQIDBCFLS]iu{yqnv~y}{vtsrokgc`_`bba\Y]jusjektywsoljknrw}}xsonorvtmhoztnjgc]TKFLUUJACLSTQNLLLOSX\_`^[XWY^cinqsutsv}vielrmc_eoyzmeflmbVTZab_[XVVWZ^addb^ZYY]bgknpqqpqw}plmnnnmnopppooqv}}wg`bghc]XUSRSUWXWSMFA>>?ABCCA?=:878>EMU[_cgnu|}xutuxyyxusrrtvwwtrwwnhd_XRMIFFIMQTTTTUY^dks}~}{yxxwtngdktumfhqxzyvuuvx|~}~|zyuplgdbbcca]VPKGEFGKPXblrqpv{tlgktvoffnuwusqpqsvz~}ywy|~|{|}~}xria[UQMJIKNSTOHJUbebbityrrz~wmjovywtqonnprtvurmgc`aceghhhfeehq{zuy~zwvuwyyxsnifcbaaabeggaULMSTKCBHR[dmv{xvuvvvtqliikouz~~}~~~ynlqunc\[_ceghjlmnoprw{yxxyywrlgb`acegiihfdcemuwpjmw~|wsrtvxyyy{}~wyvkffhihfc`^[WSPORYajrx~{tpnnopppomjgfjrxumiox|wrooprttuuvy~||trtvwurnje_XQKGGIMQUWZ\`elrwzz|~wromligc_[XX]ejf^^hqsniffgggfdbbcgkorqponoruy}xx{}xsonnmliea\YXY[\\Z\fwyw|}tmhfeeddccdglrwyywuttuwy|~}~~}yuplifd_YQMPZ_\VYcow{~xv{}unjhhhiihghkouxzywtrqqrsux}~}zwtqlcZRRY[TJHNV[\\]`ekrz}xusqqomkjlosvwurnkihhikmqw||vpq{xuw}|{|~{tleekmeZUX]^[WTRQSVZ_dghhhilqx|wqlihikmmliffegilosx~wppx}wolpw~|yvy|zskc]XUSSSTUTSRTY`is||xvtttux|}x|}wvz}{vpjeb_^]\ZWRLFCBDHMQUY\_afo|~~xtz{tty}}{z{z}{wsqpponlg`XQLJIJJKJJIGGJR]eebfsyw~~toptxz{{{{zxuqoorw|}}|zuof]VQNLJIGD@<97:AIKFCJW`a_`chmqvy|zwz~}wrooprssrolgb`bff^RNSXVOIGHJMQTX]cku~|}~|xwwxyxwuqlgdeikeYSV[ZRJDBBBCCCEHMT]fmruwz~xuy~vv}~~|yxy{|}}|yvropuyukcejjcZSOLJHEA?=>AEJMNNMMORW\bjs}}~|ztpmmnopqpomjikqyztmnv{xpida^[VOJEA@@BBA><99:=AFLT]gopnmvzwvwz~{tqolie`]ZYZ\\[XSMHDBAAADHNTVSOTalnlnw{xvwy|}~~}{xwx~xy}wuuutsqommnpssqmgb]XURPOOQTUPHCGPTPKLR[cjpv{zwvwyz{|{zwttw~xty~xtsstsspoooruwwuqlgb_\ZXWWYZXQGCGMJA;;?DHKNQTWY[]`elvyurrrssrqpmlmr{|uu}{wvuuspmjiiknqrqnkihhijklortpg\Y\^WKCBDGIKLNPRTTTUX]elsy}½{yxxvtsqqsvy|}{xtqonnnopswzxqjjqtofaadffeca_\XTOLLNRX]`dgjnsx}}zyzzzzyxy{{yxwwxy|yrqx|wnhhkmmljgea\VQKIIJMOPQPPQSVY[ZYZanxyw{}zxxwwvuttvy}~{xtrqppprtx|ztllsxtlggjmonmkifb]WSPPQTUVUSRQQRRROKJOZbb^`kv~}yurqqswz{zywvvwy{|~ut{}wnjlptxz|}~}{xtpmlmmlie`\XVTSPLGEJTYVQS\dijjklosyż~{yyxyz}|}~zvuvxz{zxuspnlie^UQTYXPHHMRSRPOPRV[agmqtuwz}{{~}yusstxzzzxvtrqomg`YW[_ZPJKPROKGECCDGJNPQQPPSW^emsy~zyytvz}}zvtsux|~|wplntumdadgfa\VRNKJIIHEA=8558>@CFJLNPQSW`krros~}z~}uuz~}zuqomlkkkjgb[UQNMNNMLJHEBBELRQLKS^ccbdhnuzyvy{srw||zvrponnopomhc]YVUUTTROLHDAAFJG?:>EIGCABFJNRVZ_fnw}zyxxxwtpjc^ZYXXXWVTQMKKPUVOHHNROHC@?>>=<<=?DKSZ`dhlqw~}xrmjjklnooomkhhjormc^aec[SMIGEC@=;;<@DIKMMMNPTY^elu|ywwxyyyxvrollptskcchkf_YUSRPNKIGFGJMOOMJHGGHJMRW^gnpnox}yvuuvwwwvspmkmruridgmmg`[XWVTQNKIIJKMMKGB>;9889;?DJLJGIS^a__enx}wtsstuvvusrpqu|{trx}|vojgeb_[VSPOOQRRPMJGFEEEFHJNQOIBAHNKFDHPX`gnv|{vtrqnjgdbbcdec`[VQNKIHGGILNLE?AHMJDBFLRVZ^behkmorv~ü|yxxwvusqqrtvwwtpkfc`^\[[\^_\TLLQTOGCCGJLMNNOPOOOORW_gntz~~zvuttsqpnnnqsutrnjeb`^\[[\_`^VNMRUQHCCEHIIHHGFDB@?@DJPV\`dinsy~~{yvspopruwxxusrppqqqrsuuqh_]aa[QLLORTUUUVUSPMJIJLNPPOOOPRUY[]]ajy{wtqpooopsvxunikqsnfcdgijigfc`]XSPNOQSTUTSSSSUVUSPQXbfdbhr{~~wtw|{tmkmoppomkhd`[VRQRSUTSQOMLKJIF@<=DJJDBHQX[\^aejpw~}}}~zssx|xqlmorsstsqolhd`^_acdedb`^]\[XSMIKPRLEDINPOMLLNPTY^bfghilpv}{trux{}~~|yusqrsrqnjgc`^\YVPKLRWUOKOTWVSPNLLLMPRSSRQQTX_fmu{¿}zyy{~~}{yxvuspic_bfe]VUY[ZWSOMLLLNOPPNKIHJMRV[_begjnuÿ}{{}}{yxwurlfachhaYWZ^]YUQNLKJJKKIEA=:9:<>@BCDDEGLU]`^^fqxzz|{vw|~xplnqqnid`\ZXVUTQMGA<999:;<<<<;=>?BDC>99@FD@>BGNSW[_bfikmpt{¼xspmjgd`^\\^`bba^[YWVUTSSTUUQHA?CE@968AEIKNOQSUY\_``_dnwzxy~zvrpnlkkkmnle^]ad`XTSUWWWWVTROLHEDEHKMOOPPQRTVVUSSXafebemuz|}»|rlmpmf^\^`bccccb`]ZVSRRSSRPLJGEDDCA>B>9972/,'""##$$#%(*-/0/3>IQST]ju}}y}}zyzzzyxvuuvwxxvsqpsyժdoƐNmwncYVUOB6/-+'  - -  (1<<>>>?@?>>=@FMPMJMU\]\[]`eimrw|¾wcI1'@\s~}q^J8+(267ACEIQY``^ahpsrqqtvy|ƹvomqz²wmcZSMIECA?<71+&"!   "#&(,18?FLPTW[`flt{ug[SMKMS]jzpbYSJ=0*++' $).5:753234441.*'$"! !"%('#&+*&%).49=AFJMPRTX\cks{ĿviZOGCCGNWcr{qhaZRG;1//+# !"""!  "&(*,,-.0369;<>DOZ_`eoz|ri_WPG=0&$)/26?O`r}tle_YSLFA=;9740-,079636=CGHIJLPSX]aehiiiknrw|vmd]WPI@7.&!#(/;Ncu|xtojd_[YZ[\]^__^]]`eiidaekmkgeeefggghijmqtwxwvuuvwy{~~wpic]WQLF@:40/18CRbsµ{vqnmmnnmlifdcba```acc_XRSWWRLJMPSVX[]_aaaabdhlorssssstuvusqsyzsnjfdcejr~|qhdca_\ZWTQNJFBAABDEFEDCCCCCB?<:GRZ_hvzoe[TNJGDB@=<:779>@>98=CCA>=>@ACEGJNRX_flpsvy|~wqibZQF;0& %,5?KWevytpnmmlkheb_]\\\]_bfhiebdkonkjlquxz{}~~~~wmhfd^TJC=84/,*+-2;ER^jwǿ}xtqnnoopppnmlkkjhea_`ehe`_cgijihhhjknprssrqppqtvxz{{{zz{~|zxwvtog_[\]YSPRX_hq{Ľwponlhb^YVTSRRRPNKHFEFGIKMNOONNPTY[XTTY]]ZWVWXY[\^`chntz~pxuywwy|~~·sijYGC>4-.+'&'%#""#(./-+/5?BEJOTY]chow~xrnkiecb`_]YWUSRTW_iw~vEQs>Lbglqwwrmlnqqopqsxǝ\:~[-?Xm|½zrmifd`YPJIF@5+%##%')-161)(+2;EPZagnu}ziZPMUiѿ}rkif^RF?70,+09ENSQJB:3,$  %-22039@CBAABDGILORUZ_fkpsvx|ƽn_SHBCKXlƳwi\PB3(" - - $WУkJ.&$(03DWYbt|{zy{}~sjdbcfkptvtofZL>1& &2@Rfx}lFNwQ5FUcnyŹÑrsofYSPSZes{hTB6219CNYfnrsrqsxiVrÞrnpsuvvusqnlhfggghjmqttqh]RKKP[k{omyljoyymZC-!*Ffuvqprsoe[UXezzyzvurpoopqsuwz~μskfb^[WSPOUe}maWOJGEEDDC@<70(!%,0110+''/=KUY[`gq~|~lXF83:Moukd`_`accc`\VPJGGJLNOMLKMQX`iqy}vngehp{ƿvgYLC>?HXn|phb__adghf^P<#  =R\bege_YSOLJJKMQV\bjqx|}{yyxxwwxy{}uicb^SE?EUj{vrpqv|s\F4& !@`}pcVMOURG>::=BHPW]``^\ZY[_bgkpuy~{ttz~vhZON`Ļwlc^]ajt~yqha\WTRQRSTUUUTRPPRV\chlllklmqstqnsÿrbQC835?Pf{m]QKIHJLNQTVUSOLLR]b]PC:6568:;<=>?@BCEGHKMPRVZ_dkrz|w{ytnhedgnzijwkdcfkpsuwwxz}|wz}|zwsj^PGEHE8%0Rm}zyz}{wsqonnmljigdb_^^_^\TJDQs|tlcZQG>5-'%&+5@MXbhjie`[VSQQSW^dije`blpiceo{|zz{{zui][m~fQC9437AQe|yohb^\[[\]^\WN@2+/63+$""$&).5>HS]cedjxwk`UKDABGQ]juz{xwywgZc}{z{|~|zvssv~Ǹ|vqlf_XPHA:546;BFD70)"!.AWjz~}{zxvtromjigghjmqstpg^]nzsmheb_]YURXfw~}~|~zqopl`WSRTSM@0%)8;FSZ_fs|yvrolihggjnruuphci|}zy{||zvpi`WMD;4/16ARew{xurpnljheb`]\]^aba\WW]`[TPRW^ekrx~~ysniea_]]]]\WPJK^}yyyttv{|xsnhb]XVX]hw}zxnfi{|wrnjgdb_]\ZYXWVVUUUUTTTTTTTSSSRRRRRSUX[^`_[WW^c]ODAIWaeflu{vpkgda_][XURPPQUZahlmican~|wlc_]]]]\ZYWUROLIFEEGMYi|Ľzy~tlgfghjmpuz~w{|{{}~{ywuuuuuuspmlr~ump{|xtoje_YSMG@:3-(##(,/2:Ou̿~xtqnkgc_[WSQONMMMMNOOPRTVY]afknnjffnvvqmmquy|~|skhkqpjeejr{~}~vt{tsvzxoga_`bdgilorrpjb`djh`Z[bo~ytoic]YWVX[_bcccgkjb[cyztoje`[VQLHC?<9777:=BIPX_gntz~{y~zx{|zvsokgb]YTPMKIIJMPTVUOE:7D[mndZUUX\`bcba`adly}}}uj_WUVTLA;;?GR_kw½~|zyxwvvuuttstuwz~}xvwxzwofbdgloqrqpnljgda^[WSNIFDEKUdt~zwutstuwy|~}yqe[\m}{ywurpnkihfdb`_][YWVTRQPPPQRRQMFABLUWVX_iu|wvwxxxuspmjihhjlqv|wno~{upkgc_[WSPMJHHJMRYco}zvsokfb_[YWWX[`fnuxvl\KGXtqb[\clu~}yuqmjfdbaabbbccdfikmlhbahquqnotzzx|{rlhghhgfda^[WSOKGC>:50,&!#2E[o{}}vpopruwyz{{|||}}|~~|yvsqommmoquy}xrsx{yusuy~~xrvzvrnjfb^ZWSPMKIGFEEFILPTWXTLDBLavztmhb]YURONNOQUY^cggc[ROYo~z{ukea^\[YXWWXZ\`djpuz~zz~wstwz~~}|{{{||~}vokmppi`VPMKIHGFDDEFIMQUWVQIABQgwyqgbbfmx{wsnid_YTNIEA=;::<@ELU`lx~{xvtrpnljhgeca_][YXWVVWXYXVQJDDIMKE@>AEJOTXZ[ZVPJJQ\gpw}zwutsux}zqoyyqmnqsnf_YWWWXXYZ[^bgmsy}~|xtplieb`^]]]^__^[YZalvyumc[Xatzy{~|yvspmjgdbbdiq}~{xtqmjfb^ZURNJGDBAABDFJMPQMG>7;J_ornklr|~}{zxvsqomkjjklnqtuurmiinsrlfccdeffedb_\YVSPMKIGFFFGGHIHD?821477548CRdvþ~~|ywz~sjhmstpkiijmoprtvy||wqlgb^\Z[\`dhmqsrmgbet|ztoje`\XTPMJHFEEDCBBA@?>?@CHQ\jx~|zxvtqokheb_^\\]^bejotutogabmzxy}}zwtrpoprux~}{yvtqnjgc_[WRMID?951.+**+.26:?ACDGJJE>=>@CGKORRNIEHVl}wpkjmqrpkfefjnqsrmifinokd]ZZ[\]]]\[YWVUTSRQPOMKIFC?<:8:=DMXblty|~øÿ~{xvsqpnnmmmlic\WW[aa^\]bhotwyz}{vpkfa]ZWTRQQQSVY]befd^VONXix}ypheehlptwyzzzyyxwvtrnib[WWZ^^ZTNKJJJJKLOT[fr|yvsqponmkie`ZVV\djlllnpqojd`eryuvx|vpryyqkhhknqsttsqolifb^[WSOKGB?;730-*'%$#"#$%(,/49>DHLNOPS^r½¾}xy}}wpkiijjihfca^[YWUTTTVWXXVTQORY`ffda`acgjnrvz~xqq|~zuqmiea^[XVUTTSQOLGA==AHORRQQQQPOQX`ca^^cly|ywvvwy|~{xusqppqrsvx{~~wrqsurkc\WTSRQOMKHDA=951.,*(()+.27<@BB>70-3CWdgb\WWY^dinrw|»|xuqmiea\XSOJFA=:64322468:;CIMNLJJLNRTWXYXWUSRRTX_gqzľ}zvrnkhfdccdefgeb_]`gpttrrv{~|zwtpkd\UPPQRPJC><<:850*# "!  %+29?CC@;9;:989:<@DIOW_gpx~|}|xtpmieb_\YWUTSRSSRPMHCABFJJGCAACFHJLMMMNNPSX^elrw|}|}|vohddfiihdbbdinswyz{~|xtplhd`\WSOJFB?<97544469=BHMRUTPG<42:J[dcZQJHKPW_gntz~}}}~{yvrnkgc_\XURPNMMMNQSWZ]``]XRNOXhx~~|yxvutsrqpmhb\XYZ[YSMHEDCCCBA@><:8653210/....-----../1258:742/.,,,-/148;>@@=81+).;JUYXSPPSYajrz½}{xvtrolhb[TMHGGIHEA<99;?ELSY_dffd`]_ix}{ywusplgb^]^bec]TJDCFIIEA?>>@ACDEEEEEEDDCBA@><97421126;BKT\dkptx{ľ|{yxwvtqlfa^_cffc_]^`ejpu{~~|vpligedca`_]\[[[[]^acfghfb\SKHKUblnjbZURRUX\_cfhjlmmnnopqrtuwyyxvrlgddfhihffioy}yurolihgfghjmpsvwwvtrqolf`^cmw|zupmmptzztqpswwrj`XQOPTWYVRKEA=;:876531/-*(&%#""!!"#$&)+/26:?CGKOQRRSWbsxqmjihgfdb_]ZXUSQOMLLLMNPRUWZ[\[YWWZ_gnrtuvx|yvy}|}~zwsokhd`]YVSQOMLLLNPRUX[]^^\YWUUVXYZXURRW_kwzxvuutssrpomkhd`YQJC@?@@=70)$  "%'+/37<@CEDA<759DTcmokfb__aejpv~¿~zvqmhd_[VRNJFB?;86433347:?ELT]fov{}zuoko{{wsojfc_\XVSRPOONLJE@;89>CFECA@@AAA@BDIORROJE@>>@CIPX`iqx}ü}|{zyyxyyz{{{yvrpqu{~{zz{~~{xtqmifb_\ZWVTSQPNKGB><=BHOSUUSPMIC>:;CO\egc\VRPRTY^bglptwy|~~|zxvutux||xtplieb_][YYXYZ[^`cfhhgc]VPOT`nz~|{}}{xtnf`[Z[[YTMFA><;;:986543211110/-*&#!!$(-/.,)''(*/4FLMIC<8:BP^innkijnv|yvtrqomkheb_[XUQNKHFDBA@@@ACFILQV\biov{~~{wuv~~}zxuspmifc`][YXWVVVUTQMIEEGKOOMIFDDDEFFFFFFGILQW^fnv|}yvvx}~|zxuuw{{yz~|xtplhc_[WSOKGC@=:754323357:=?BCCA>9559BMUWTOJIKPVZ^adhlqv{{tmgb_][ZYXXWVVWWYZ]_beghhea\XVXanz~xtrqqqrqokf`ZWWXXVPJD@=;;:::987654322100/..-,*)('&'(+/5>HT`my¾~zuqnoruupia[XX[agjkkigffgikmopqrrrrqpomljigfeddddfgikmoppnke]VQPU^hnnjc]XVVX\`ejnqstspnkjlorttrolihhijlmnooonnmmnqty{xxz~{usu}}{{}~}yskc\XVVVVVUTROLIEA>:62.+'$!#(-39?EJMOOMIFDHSdw¿xrnkjiihhggfdc`]YSNIFFHKMNLIFEEGJNRX]ciov|~|zxwutrokf`ZUQOQSVWVTRQQRTUVUTTVZ_cb^YUSSTW\ahov}~}|}}~|xvuvxywsmf_YTPMKIFDB?=:7520.-,+,,-/258;=??>:50-.5@NX^^\XVVX[`flrx}|xtokgc_\YVTRQPONMLIGDBCFMU]dhjkjhfcaaeo~~zvrnkigffffffea[RI@;ACEFFFFECA?=<:::CMZfnpnid`^_aels{Ļ}xtokfb^ZURNKHECA?>>>?@CFJNSY_ekptuutssv~{wrnjgca^\ZYXVTQMHB><;;=BGLORUX\`ejnsvy|~ſ}{zz|~}zxy{|zxyz{|}~~}|{ywtqnkhda]ZWTPNKIGFEEEGHKMOQRRQPMKIGEB><=BJQUVSPMKLNRW]cintx}}zwtpnkigeddddefhjlnoomie_YVX^ht|~{yy{ztmf_[YYXVQJC=853210.-,*)'&%$$$%&')+-/000/-+*+.4;AHMSYajt~ÿ¿}{{zyvpic][ZZ\^`bcdeeeeedddcccbbbaaaaaaabccdfgilnqtvxyywsoidbelvypga]^aflpqqpnmlmmnopqqrqqqppoonnmmmllllllllllllkihgjov~}vpkgdb`]ZWTPMID@<840,(%!#)/6>EKORRPKFBBFP]jswvsonqw~ytrqqrrqmhb\WROMLKJJJJIJJKLMNQSVZ^bglrw|}ywy~ztnhc`^\[ZZZZZ[\\]\ZXTQNMOSVWUQMJHFFFFFGHIKNQUZ_ejnruxy{|}~}yz~}yvvvxyz{{{yxuspliea]YURNJGCA>;:8776789;=?@@@>:50,+.6AMW]^][XVVVWZ^dlt|yslgdccdca]YTQOOQSW[`dhloppmjea`ckv|zz{||zvoh_WPLJKMONLGB>;:99::::::9987665321/.,+)(((*,06=ENYdozÿÿ~xrnkloqrpmjhfffffecbbcfimnnlifc`___`abcddeefghijlnpqstutqlf_WRPSZbilje^WRONNPSVZ^bfjnqtwyzzywtrqrtw{||yuqmjhhikotzumijq{~}~{xusplhda]XSNIEB@><;97531/-*(%#"  !#&)-26;@DILNONKGB?>CN\m}}vplifeca`^\[YXWVUUUTSQOLIFDDFJOUY]_`adglrx~||~|yvtqoljhgfeddcba`^[YXXZ^bfgea[VSSTVVTQOMMPTY`gnu|}|{{{|}~|ywwwxxwvsnib]XUTSSQMHA:4/+)''''()+-/258<::999999::<=@DHNU\cjqx~»zurqruwvtokgeeefgijjkkkjjjihhhgggfeda^ZVRONORVZ]_`_^\[ZYWSNIDCEKT^fihc]WRPOPSVZ^bgknruwz|}~~}|{yxwwwy|}zxvtrqpppqrsuwxzzywsniecfmxzusuz{slfa__^\WPIC>:8878888753/+&!!$&&%$"!"#&*/49?DIOTY^behjkmot|~wqlhfdcba`_^\[YWVTSQPPONNNNOPQSUX[_chmsy~~vojimu|tnjijlosvy|~~}{ywusqomkigfdcbbaabbcdefggec`\XWX\bhmoppqrtw{{upligec`]ZWSOKGC?<8530.-+**)(&$"  $*19?CFFDA>:768>HUakqqolheefjovû~|zxurnkgd`\YVSPNLJIIIIJLNPTX\`dhlnponkighnw|xuqnkigedb`^[WRMHEDEGIIHEA>;;;<=>@ABCCDDEFGGHIKNSYaipvyzzyxyz}¾ytqqtx||zxwxxyzz{zzxwurpmjgda^ZWTQNLIGFDCCCDEGJLORTVVTPKD<645;EPX]_]XSNLKMQV\ciouz}yvtrqponmmlllmmnpqstvvvtqmhb^\_enw~{yxy|}wqjea_^][VPJC=9643210/.,+*)('&&%%&&&')*,.02479DIMQRRQONMOT[dkpsuw{}{yxwtrnid_[XVVWWWUQMIFDCCEGJMQVZ_ejpuz{yy}ytokiiiiigd`\YWVWXYZZYWUTSUX[]][WSNKHGGGHJLORVZ_cglortvwwwwwxxy{~xtrrtvxxwtplhda_][ZXVTROMJHECA?=<;;;;<>?ACDEDC@<71-,/6@KT[^]\ZZZ]`ejoswy{{|}}{xvtromjfb]YVSSTX\aegiijjjjihgebachp{~zupjd_ZVSQPPOLHC<61-,-.1368:;<===<<;:865321001259>EMU^hq{½¾ytpnnopolida^^^`cehjlmlkhfb`^^_bdffeb_\ZYYY[^adhloruvwvsoib[VSTY`glnlg`ZTPNMNORUX[_bfilorvy|}yurpopsvy|~~voklqz{wttvz~zyz{{ytlcZQJEAAABCCA>93.)%" !#$&(*-047;?CGKNQRRQNJFCACJUdtýztnjgeca_][YVTRPOMLLLLMNOQRTUVVVVWY]cjrzztokknv~|zwtroljhecbaaaabdgilnpqpmhb[UQQTY]`_ZUNJHHLQY`iqx~~~|wrnkjiiiiihhfeb_[UOIB=854455530-*(''),059>BEGGEC?<;@AA?<8520025:AHPYajrz¾~{zz|~~}zvqmjihhhiiiiihgfdca_^\[ZYXXXXYZ[[\\\[ZYXXY[^aba]VNE?<=BKT[_`^[XUSTUW[_chlptx{}~|{yyyy{~~|zyxxxxyz{|}}}|yupjd`_agpzwpidb`_\XRKC<730.,+++*****+++++*)'%#""#'+16:=?@ABDGKPU[`dhlosy~}{yuqlhebaaaaabaa`_^][ZYXWVUUUUUUVWYZ\_beilptx|~zvrqrv{}zwuromjihhikmoqsuvwxxxwwvutsrqponnmmmmmnnnnmkhd_[WUVZ_dimqsvz~}vpkgda_\YVSOLHD@<730,)&$!  "$'*.269?CKVamv}»~ytqnmllkkjigeb_[VQMJHHILOQSTUTUUWY]bgmrw||zxy}}{xtplhd`^^`bfhjjie`ZTPMLNQTWWURNKIGGHILORVZ^cgkoruwyyzzzyyyyz{}º}}~~yuqnjhfeefghhfc_ZTOIEB?=<<;;<<=>?ABDFHIJKKIGD?:6337=FPX^bb`][YXY[^bglqv{{wtpmjhecba```aabbcbbbbcehlptvvtojeabgoy}|{zyxwtqlf^WPJFDCDDDB@>:7420..//1346788888877778:<@DJPX`hqz¿~yussstsplgb^[ZYZ[]^`bdeghiiihgda^[XVVXZ^beghhgfffghiihfc_ZURQTYahnrqnic]XTSRSUWZ]adgjmortvxyz|}~~~|{zyz|zwuux}ysolkkkigb\WQMJGDA=951-*)()*++*(%" $(,17@ABBA@?=;9767:AKVajoqpmieb`_`bejou{~zwsokgd`]ZXUSRRQQRTUX[^adgjlmmljihhkqy}zwuspmjfa[UOJGEEGHHGEB?=;;<=?@AA@><841/./26:?DHKOSW\ahov}¾¾zwvvwz}~}zwspmllkllllkkihgeca_][YWVUTSSSSTVXZ\_bdfgfda\UNGA>=@FNW^cec_YTPMLMPSX]chmrvz}~}}~{vqkfbachow~~}~wqmjhgd`[TME?:620.-+*)(''&&&&'()*,-/0122211236;@GNUZ^accddegls~xoha\XWVVWYZ[\]]]]]]]\\\[[\\]]^`acfhknpsvxyzzxvrnkhgjov~zrlgdcdfjnqtuutsqponnoopqrsttuuuuuvvvvvvutsqnjfa^[[\`dimoqstvx{~}ytojfc`^\ZWTRNKGC@<840-*'%#! !"$'+/38=BGKNOPOLHDA?AFNYcmsvvuronnqv|zuqnmllllkifb]YUQNLKKLMOQTWZ]aeilptwz{||{xurqprv}}ytpkhecbbbbbba_\YVSRRTUVVTQMIDA><;;::;;<=?ADGKPUZ`fkqv{¿~zxwxz|}}|zwtpmjhfeeeeeeeddcb`^][YWUSQPNMMLLLLMMNNNMKIEA<84348?HQZaeffdb_]\[[\^aekpv|{uqmjiijlnpqqpponnoppppomkhffhmt|{wpib[VSQOLIEA<9654445667776654321/.-,++**+,.15:@GOW`ir{ÿ|ywwxyxwtplifdba_^\ZYXXZ[^`bbb`^\ZXWXYZ]`cgjnrvy{}~~}zwqlfa^^`djptvuqlfa\YWVVXZ]`dhlosvxz{{zywusrrsuwyz{zxvsqpoopqrstvx{}xrlfa]ZXVTQNJEA<9530/-,++***)**+,-/1369FP\gpx}ľ~wrmjgedba`_^]\[[ZYXWVTRPNLKLNRW]dioruwxxwvtromllns{}{yxvutssrrrrrqpomkifca_]\[[[[[ZXTNIC>;9:;86668:=@CGILMMLJGD?<;<@FNW_ehhfb^[XVVVX[^afjou{þ|xtpliec`^\[ZZ[]_behloruvwvsokea]]_dmw}{ywurokgb]YUSRSTTROJC<50.-.158;<<;9630-,+*+,.037<==>?@ACFHKORVZ^cgkosw{}ysnjhgghjlmmljgda^[XWUTRRQQPPPPQQQRRSSSTTSRPMJFA=:88;?EMTY]```_^^^`bdgilnpqrstvx{~}{zywutqomkihghjlosvxyxvsojfb`adiqyxpib\XUUUVVTQLF?94/-+*+,-.0123444444433445679<@DINT[bhov|ÿ¿}ywutsrolieb_]]]]^`abccba`^][ZZ[\^aceghiiiijjlmoqstttsqnkgecdfinrvxxwsojfb_][[[\^_adfhkmprtvxyz{{{zxvtrqppqruwz}~~}||}|yxz~~|xtngaZSNIFCAA@@?>=:730,)'%$$%&(*,/259<<<=@DJQW]bdedca_^]]]_`cfimqv{}zvspmjgdba_^]]]^_`acegiklmmlkjihhilpu{{xtoje`\XTRQPPONLIFC@=:8643100001234554444579<:987666789:<=>?@AA@?>=<<<>AEJPV[`cefffggiknrw|¿~|zxuqnkgda_][ZYXXXYYZ[\]_`bdfhjlmnnnnnnnoqtw||zwutrpnligda]ZVTQPNMLKIGDA?<:987777899;<>@CEILPTX\aejnrvz}{zz{|||zxvsqnljiiiiiijjjjjiihgffedcba`__^^]]]\\\[ZZXWUSQPNMMNPSVZ]_``_^][[[[\^acfhklnopqstuwy{}~|{zyxxxxxwwwvutsrqqqsux||wrnjgeb`^[WTPMJGDB@><;98765433221111234568:=@CFJNRVZ^behkmpsw{|xtpmjgecbbbccccccba``___``acdfgikmoprtuvwwvvusrponmnoqtvxyzyxvtrqponnnnoopppppoonnnnoopqqqqqpponmmmlllllllllllmnpsuxz|~~}|zxvsolhea^[XVTRPNMKIHFDCB@?>==<<<<==>?@ABCDEEFGGFFGHILOTY^chlortvxz|~|zywvtsqomkigedcbbbcdefhijkllmnoppqqrrrsstvy|~|{ywusqomljihgfecb`^\ZXWVUTTSQPONMMLMMNOQRTVX[]`behknqsvy{~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m30.bin b/applications/PoP/poc/res/music/m30.bin deleted file mode 100644 index 744fa8d..0000000 --- a/applications/PoP/poc/res/music/m30.bin +++ /dev/null @@ -1 +0,0 @@ -~}~ywyz{|z}~z{|{zw}x|x|y~{zzw|yzy~~}z|x~y~v~x{z|}|z~}z{xy|zy~}y|x~zw{y{{~yy{}}~ywyz{{z}}y{{{yx|x~|w|y{zzx}z{z~~~|~zz~xy|{~}||}~zzxy{yx|{xzu{w}~uywzy~{x~~~y{|~~zy{|~}}}}~{z{{xv|vxw{y|ww~zy{wtws|wryzs||v}u{yz{{{}{}~~~{||}{wu~zuvxy|}t}|sw}}tyzy|ptqszqqy{ts|uwzs}~zxz}~|~{yxuv}uvtz}v~vs}vqv{wryuxvnrluvnqxwquyqyvt}}z{}y}}}}|{~y}wrxzttr{yy{ov{rpuzssvsyqnmlxqlryupwtszqv|w}zz|{}{~w|{tq{xtqs}xztn{xnpwzqtsvymnjrxmluzsqwrxxoz{vw}~~}{vy}szplxyqqqxxwvyknox~nxouqrshudlw|rwmt|hswxx{z~}|~s|~}qjo~spnyuxuythppupvpwnulpjgp}xsul{tg{zvyt||{}~zu}vvuit}opo|twtzmjotntqstnth{|djutvrq~mnxx~~x}}}}sx~spn|yqqvzzx{{lqr~~qyrzstqmsfmz|quluxfr|susy{x}y}z|u{~ypzim{omkv{rtouoell|qppltlrgpigoyvvown~~{}|~{}~yvyx{zryvvu}yutvzw}sxzvwk}llstullxjlxsrvvu|vv{yu|yz{~~yoz{mnszsokoxrxnkogkitrpueooqhfzmjjt}yzpz|t}|~x}~}}}{z{vx}x||u{yzzzww}ow{~lyptpwxyohsjnxv}xsr~utsl{~szzv|~y~~vp{vqwqospttixvnlkjcvtkfcl{o]ygiynuvowk|~z}v|uu{tw}y}vyy~s~x~w{~xv}{vv{~qi}pw~ku{xq~rbzngxuwynt{njp||{}y|v{~~|y}rxnsx|oksl|qp|hlmnjfwg}z]frsdrr\qto}npwx}{{{}qyrx{~wvwu}x}|{v~|vvrvuvlpsnlmxpx}y`kudzynxzvw|qxrqwx|ww}}y}u~tkyx{uonu{vpborlnsft~hern]rvbjhnxsh|ry~{x~||zx{z|xyxzyz{{yu~y~yu~r{}~p~n~pnqslsyehjfovwsrmtqwtnx{|s~t}~}}v~suyurhn{|rhxtuolrlnqns~ezwpefmokmzuu}m}nyz}{x~}}yy~||vvkx~wwtvyp}w}}~ox~v|yprtq{rlxfhoiun|pslvruvt{~uyozykw~sdlyvphlqqrlkhcdnusklmsohcgyzfhy{{|}{~}|~~~xy}}px{{xl{tpwz~y|{rnq{|xpt}|xrqy{gu}zsnqxiz~zsqty{xwsz~{z~zt}lt|ych{trikprrjpidclutohotojdgtifz~zw}~{~z|wz|ztryl~{wnux|zy~tpoy|xsq{}yuqwkp}~|tpowmr}t|wq|y{uzuz|zy{}oo|xlduxrnhrpsqklffjtwnolprlfcq{qfp}{|z~~}{}yzwywxuyro{w}uyrst}zp{rz}wrqxpt~zmpsovwwwt{{x||wy}tw~u|yxkz|jqksyqlkxmzsakflmzqk}eoribg~kpkpu~|~}~uwx~q}zyzwzq}zsw|uqq{s{kzuytothz|un|qrw|ugwktmyy{{psryy|}p~wp~r}hu{zxpsv{xrzshlnjzrkynkikj`xibrnwy{~xwv~~||{}y~wwy|to}~z|tou{zyyyu}zoyyrzuw}x}qlvmmqszvvmxo{vex~p}|{ztz~|~xyiyvmzup}vo{zrqo}umv|dnxo`jqljjmzrq}t~x}yrz~x{|w{~s|}~~{{yw}|tyszqqrsvpwsyfsts|w~z{mopkyr}{{|yxnkz|vu~~|~}{wxupuhjrvoitpvzozlopwz{w|vltwivshwpw}}z}wt~zzqtov{{z~x}~||}uw}y{yxzxz~zvt~{r~ruvwqmzr{s{nnnokit{{wo}u~~r~yp|z}xhxwloiwyijqv{tlkrqllu|wevwllh~wom{}z}}uo{||}}zw~}}}~x}~|{iyx~yy{|tvy|x~}{w|yqy{wuqw|xumfmhmfu|quxv~xxrv~~}z|{xurx}io~}xqykrzoqqyufyk`hbwqck|v{~yov~m||~vxx~~{m}wpnyseqt{s|nr}}zvu{}y~utznshjpx}jvytxpvtsw~~uw}}v}|wry|skl~mzz}uxq{jlz}uvrlj_njgyln{}wyx~zvx~}wxu}y}}|ztw||y}wnqnrwsw~xzu|{|y~swtw}tyklxhjq}zitw||lrzz~~yy{v}}w}ptuqrtvx}uypoyrw|y{jiojfemxxfozz|ywpqw|~zzyz~~~xs{vyx~xn~tpiyy}ytyy}zs|u{}|yzourqlfrwrlmzr}uwvu{~}~{{yqquzsot}rr{surtpxuzzlpihgouitly|}y}}szzy}zusyz}z~~yywups~{roqruq{~w~uu|{}tpnlsljmqsj|w{km}}{y~tu}|pztmv{xovvw~vrnl~tv~vwenrkaqqowl~}|{~ox{~|zww{|~~}~stxwzpszvqopz~~{{v}|zvozz~xkvngolrnlpys|iv|zvt}|z|wk|puxputxq{}uqsrvt|qntecrsmt{w{zyxsqv~||}zxt{{z~}{|zsr{}uu}|wxlr{t~}|zwyz}yvzzvmkhquhmqrywu}~llv{xs||}}~xp|vixutupy~|||~pirv}zwhnnbqpqv|}x||zqtxu~x~~~}yn}|~}w}v}}l{{|zrvsww||}}}o|wy~znnnqlipsvmst}xn}yw{}wuuz{}uvunursvtvtyz}soqx|wgpnhjl}~|x~~x{ko{vz}~~wxs}}|qv~tuzxxzwruu}yt{yww|vtrpvghmvzjq{|zw|yu|yxo~}{~}vnsxwnk~wpvt}yvr}uw~xopmesxy}zz{sosyvu}|~}vw}x}y}}}zwv~{twv~vrvrr{z{{z~{{p|~{zuznnpjpqtrq|x|y}~~strvu~v}~vnwrytjryxov{z}zyvty|~|pqjoyw~x{{}x~}nspvzy}}~vy{}}|}~~}y~}w{vwx}|vttozzz~u|zw}y~ztruuldoxtqv}v}xsuyxyxvvz|y{}ttsnxqlvwussy}zr{~rpynvw|}y~{t}qivttwz}~|wy|~~~{z~}p~yvt~oopw}{}wy{uv}w|xyshlksrqz}~q|~xpw~y}|rtvx}{pnxpropyooszy}z{v~wtvpww{~zzz}{zskuos|vy~~soy{~|yw~~}~uy{}z{~xquwt|}ss{zq|~qtoloktvwz}uq}qtyx{v|}utvoz~nnriwunqqxvw|{tw|uwyjo|{y{~ysmmxkqzwxvqx{}{us|~{wx~{{~|}ruwx{~|vuxvpxzwrqlqvqtw{~x~ww~{pqu}~y~|ursry||~nhsqlvsuwptz~wt{rqmlw}{xqtopno{t~ywyp}~~}}rxwz{yq{ywtxux{osyu|~}utptuuus}yy~xuyupr{vywp|tx}}~nnrlnwzupsw|}|ys|yoprrz|}vzzxxnjrruxxy~|~{wsr{{~y~}wpt~{~x~~xws}ztuqu|~xqx~vu}wuzsuux{uu{u|}wqvuyx}{xwwwy}|}yoiqrwypxwy|u|}w~trwpu}{uux}{rnoyqn|}|}vurv{|z||vtvxy|z~tvw~xrmuz~zyw}qyz~z{urvuvwx||z|}~ynm}~}~{xxux}v}~|}pkqsyvpy}rsv}wwmr{zywszx{wnspsy~}|svutuzz}xyvvwxx~}z}z~~}vxx~qprv~z|~zuwy|ztqlt{}~~{urntsw|zusttwxxqnrrs|w{~srvw~uqqr{~vxuv||zmmwx{yw~wvvmu}~z|w}|vxsv|y}xy}zvyrtrvz|wv|~z|{|rkou}x}zx~||zutxutv|}ywlmux{~~voloy~tvxswu|~svpt~zvtx|~wsszzpsy|}trrpz}||xy{yrvx{~zyvx|vposv}|{~{sy{ttntwv{{~~~}x}|movwuv~roouyx~}}~rlpz{vwuyws{|z}qqrw|ywx{y}{{uurnxxz}~|xssozzv}{{wz{xyt{~xx{v~xonqw~wuxux}xvxtvvu{|}|v{}{rlquww}}|swspxz~}~~|~wqrusw{xxyy}~z~yqsry}tt}xtqtpq{{||~~wtsmvu}{yx~trt{}xtyywwpnrsu||qvxv~}}xwuwus}pu|~spnt{y{}{tvntyw~{~~nmrqv|~|z{|~tsuw~xuv}ytqusuz|}|{}smkszw~y{}}|smryzxuyx{xxsrmow{tt}z~}zuvutw{}|rvvpsu|{zy}tspoyz}~|{|nhssw~{~{z~uvpq}zyz|~{vwqyxu||~tnmmvtv|w|wrpq{vx|}xz|}{rlot}~|t{}~zzuqvwz{}{tu~~~wssz}}zyvvsqntx}~|xy{}sknt{yvw}{qmqxxry|~ysx|yw~~~~{trnonw{}yuxywqsz~x|}|~}zx{|rposxw~~|z~|xrtu|~}|xr}yzxru}~sux}uonrwz~wv|{~zxpls}xvx|rqpsurt{}~y{~yyyx}|~|ropltz|{}~vtv|xsxx|}yw}ywwzwpnov~~}~xytuwx~zwx{{|zrtzvtw}rqnuwt|}zvz}~ynrx|{{{z~zwpot}xutvy~{|}yru{}|{toppsxvzyxvvz|{xyzvvw|~xvy{ypkq|{y{|zxssv}~{vz~}|z~{sksyx{yzvrqossyzvx{~|}~yqv{|z~~yy}|qoq}wwr{~{{usu~}{~}~vsrrnpy}zxu|}{xxx{wyv}~}{yvy|~qrryzz~uxy}yrqtz~ur||qkoz~wxy|wqokrw{}ww{~yyxrwzy}}zz|~xqrv{~xyw{uyxxz|}}z}}{yolnx~y|{{||{qpx}vxv|}xty|zwqqtzvu}~|sptwxy}}xx~xqrtz{uzw{ulmlvvx||~zx}|y|zmouz}{{z}~{uqpz{yzzxz~yyxz|~y}xqortxuu}}}|yqow~|vxwyuywpkqx~y{}xusutswwx~xttszxv{xvoonnuxzux}{~{{zkkx|z|}|}{qoq{~z|}|{zvxx}zxw{{zwusorqu|~y|xvtv~~wyzz~~~y}{ztnnpy|z{|}zxtotw|tq}}}{rpsx{xzyyrnjox~yyz}~~}|wnpx}}~}||~~rswz|uy{{zvx|}yuyz}~}~zqojquu~{wu{}ytsz}yvpxyu{ytonu|wy}}{uqsy|z~}xpwzw}tqpu}yy}|vlmovzx||}~z}}~~~xqrx|~~~}}}}wtrx~yttzz~xxz}{yyzywnllptv{wtv}ytqwvqtv}vw}xppt{|y|~}wxtvvw|yws{}yx|{uorz}|{yy|qoorrv~wvy~pms||xvzomt~zwv||}}zx}{wyx~wpnpnqyz}xww}~yvuuxysusv}{{{~xuqv~~y~~{xqpv~ztw||~|tpr}www}uoknw|usx|~|yoov{}xxzrnov}~||y~}}~|{zzzwz{}{yspopuy{}||zw{{ywtw~urst}~~~|x{vst||z}zuptz{{w{y~vrsy{vwzy~vlkqy|{zxuxyxx~vorz}{{w{{ppp}yv||xvw~}zz|xz}wqstrx{{y|}xvy{xut|yrsty~uv{|wrqw~}|~zvwuywx~zx~zx{}vqru{xyyx|rprtuvy|yuz}{{y~vos}~~{yw~~~zosv~{xx~ztxy}}vvx{zwuttyvrxzxyy}xvv{}xuvut{zux|}rmpzzz|}|ysstx~{v}{zy|~slpw|wxy{xsomswz|{z{}{}|vov}{z{|zsuw{x{{|xxyv~}vw||~|wwtpsrw~yzz{|zurw~|vqpy}~zv|uqqvuw|}wqotv{{quz{{rnpuxyy}|~|qljqwy~}z~~y}srvy~}}}}yuux{{y~z}|wvx}~{z|xx|~{tpmsww~}{{{vpqw~{rrsz}x|zusuyxx|{{rpptx|yrw}{|~uqoqy|}}v{ymmlqy|~}z|}zoktz{wz|}xvsv{{|}yvy|xxtx|toopvxvz|||}wsqsw|xuxvx{{{}zuot{xw{|vuqqw{|zv{}~~~tmow~|vyztomov{~{wx}|}slpx{~xy{~}}qor}|{}}z}{y{x~vuvx}ztqssrutw~}{xxzvsqs|zxrqx}}~{sosz{v}{vssvyxt}~{yxrptzyv|~~roptz}wvy}zpmrx}|}}|~rprz{ww{~~zvv}~xuyx{}zuusoqvxzxuv|xtrrx|or|yx}tsyrrso~y~w|~{~xqv{sr}zznnyrngp}||qyzzyyzzqxzu~{w{uvx||||xu|w{{nvy{qmtxur~~tlsxrt{zyzns}zrsqjvxq|z~svnow}rsyu}tr{xqfqz|tzw|x{{xrrljv{{toqoxx}|{|yvxu~w~vy~~{nltxrp|zzvpqrw}}~yynw|wz{qrjkxzz}|}r|tx~}sv}wwmmzvsmy~}nvtvuwwxpulr|z|}xqjsvpz~w~xuvr}u}vy~|sruyqlvsywqppw}}}spbsvysuir|y}{~~}}nqjt}w{wwhkuwsx}xxuoxw}x{y{mq~s|xpeytsyuw|{~xunvw~{uy|ytquyrw{yxyxsvuzyxsdsqnz}lrxm{{}zwx|~trnw~~}}ppv}wvxyv~zsqxsu|r}vfk{r~xofzqrwrz{{qih}|wv~~vpuznsrsytuxz{v{perop}pz~q|suuy~{sov|~yz}lq{vzzyux{rswv}v|koukv}qk{ovyv}{|rij|{u{{}vps|vqyyxz}~ys}txzmhvqw{n{wozsxwv~{ulky|ysz~~quosrtv~suxy~uufpsnz~~|pts}vtw~||yogl|{}mqzuwzzv{wyvw{py|nnwkvrkzwz}yuw}yopd~yhpg}wwuok~zxpxxvkq|rf|y{}~osvrszv}|ujeyuu}~||vs|yqkr~|y~yvz{zrkvvw|wknzjtxjx|~}}{tx{|or{v~{}ntqlyp||{xu}~uzoigs{uzshmx}wx{r{yvt|rs}py~owz|mimzm~{vt{wwu|wtywg_lxuzz~}zu|y|ywylovs||ugq{oispgmzsr|||{mksk|mjngzyy|{|rpij{~|~uffy~{ttqonz|sw{zvp{|zptljumnv~ztrjp~o}uxxmtmmgh|wzsqvu}{zswtzzw~v}yzsktzyv}yuxtzxn{}{uu}tfium|~|w}qzpgtoizpuwtr}vxvzz{}yxt}|uxx{~{wzwyw|upyspvx|kpemy{~ntwt|}u~~tv{wuuxx{szxxy}uxos~~z{n|xnuyztvqu~}wrtwykht~z}wvsbnwt~nu~rgtztqz|ys{turwy}xlvsp|zsdhr{v~|{qjogmtzuv|ikq}vtvq}{wxyrapx|~vmpooz}vx{~xtvvwvvyz}xs{xqefuwz{opx{xy{zetx{wpx~~~qwv}urp{||}oil{mnlpvl{~z{}zirlmt||ny~{sx}|vwhk{}|{zyuuz~rhsqw|ywkg{lw~opwr{vtny}~|sm}z~q{u|v}zntzl|ou|vszvywuvp{~}}tzvrs{vfrjs~u}w~u{sfx{qrowpzxbi{w~}zruwm~u{uwvspqen{~{|y~wxux}gkznixzw~x~{xgkuhzxv~q{ysndxnhtxrjfj|wpx~tkk~tp}~}rkn}~}vrnjmtzws}y}lrut|r|ouw{uvh{|{y~|oh}shsuxpif{~~z{vtrrtyy{ux|jooh}zsue^vykrpxzst}}xp{x{~ymz~pxx{swq~rgzv|uxy{w{zyr|pytrzpyzr|wzrpl}wlptp~y||vto`szx}}}ihotzz~~~syxbpypp{}~koo~ut~z}ufro||wxofj}~ln||~xv~yxrsr~w~~~}~~njq|k^lxy~~{rurvywsr{~vsw}markozuwmrZh|z{t|ovo{y}{{zuxgx|r{}x~}wk|kpvy{|x~~|ww~|touo}}x~ywy{w`Yulx{}zsxzmhtt{z~osmz|s}hwtwpmznrmsysw}xms|}~stzuympo{}omjvvv}xzy~zu~yxysrt~|w||uqldv{uot{tyrkjrwx|jgmx|wvv~puslyr~ppwfjzs}lw~umszu|k{szmnvxzlrqw{}xv~yu~lyuw{zrquyswl`wmu|{}u{omons{}~ohaz|{q~yqexoxlp|seu}smx||xnsws}~k~tzlpwz{lrnz{~ww~vy~ozru|wott{p{lavk~s}{x{woopooy}uhdyx}s~~{od}pynqzsesy}zrxyy|ussn}{k|u~lpv~~nql}x|y}|p~|z{qpz}{~qvu}{mnhpkz~r}vuwrqq~qs}|lixp~yx~~odzqxpuxztgqvzw{txzuonvpyypox{qpl}~}w}||xmx|oqt}txvwnnnljy{tzu~t~yuot{rq}~mowmu}~~lgvswqxs{~skovy~y|q{|wmo}ssv{ro{zsnny|w~{vlw}{prs}uyvsrmpil{yuzu{u~yuowyrs~luuns}}jmrtuswr}~omnyy{{yp}zult}qsv}}rp~z|rltxyxytow~wprv{tyvqzlnio}xtz}wvxvroyxpvykxrtu}zgupuutuv~inn~ywws|utm|nsywrs{uqk{zxx|}ztwxuov{wytwxsxglmttuz||t{nsp}ts}}rkwuzy}vjx}puvpyxvfnrsqyv{trvst~{qrq{xws|z}}v~poz~r|zzu~}wx~sfjsswsktrinrs}lmvuz{wwqovvtsk}|rus|}yrr}hlovz~yj||z|z~xsmyrs}|~~q|pzt}xxuyym`puwxl|tlutys{toot}pz~y}yzdv}y|mrnpx{~zwh|vmj{}vnty}y{u~txx}}t~|zoy}v|yyut{~zvs}wgp~nvx|ytv~rlrs{}|}|pmiy||khzxrrwzzdom|~yvssw}sjwz}um}kw{}wt~{{{~vtuv{w{~}tt{x}w|yqqfwtwwp|~||chosywxonyq}}{trlr~zlp~}viiy}yyzyw~ktp}rkuvuvmw|yz{xmwow|vvuws{{nfkuvwzr|wz~zzxuvfqwwxxtz}|v~wsogz}yuwokrz~vvuxurhv{|t}vy~t}rmz~y{|xv~zy~t}ysz}uzu~{onu{jyrprxvu{opw{}rvwywu~{siwxsx{yo|rmhr{suszl~~yrz|zt~z~~{|x|kn{~y}vwq|w}~{sw}}pw{|prpzokrzwvonvyxtvmr~~}}qvs{vxrp~|ilo{utsv~{{srxu{|r{y|xwvu~}zyrrr{}yz|x{x{~yq{vzslnkhytz|wx}{kuvt~xns|q{~{|znns~ntwglv{pvvzi~}xyx~|}v|zz{v|{wvv|yxo|rqs}|xz}z{x|}us}~vvsjohnuvz|u{|xkwty~unxwsy}|{}ykpv~lx|qho{srvwwlw}x{yt~w|}u~~}rwwxsuwosvyv}~{|}}y}yvv~yqqhqhwux}~{wzskvw}zpqoy|x}{}tfwwxn}qpku|lvtxtt}zs~}}|}w~u|~u{sq{z}|t}|opw{p{|y|zzv{zz|}unljrozt}}uzunj{tvm~o{wx}jm{ysu}vntm|uoxtwxxzuq}~{y|r~~tz}kxz~{ww|kww}p~}y{}xsy{omkkwq}uxyusjmztsr{rwz{~yxgszz~szzntss~rqxrzy|~znw}|{yzr{wzvm{{}}wxywmyyxt~x|}|z{ywx|~}mmjnxp|x~x~}srhr~wuqvytyw~|{uhvz{|s}zmvqv{qsxr|w|yl|~~|yzxty{|{so{|~|}xv{sny{uvz}~z~yvyy{{moiowrzy|{}~srhuwwpwww|v~{}tgwy|zs}|nvnwzouwszw}zn~~~xzwwx|{}tpz{~}zzz}rnxztw||z{wx}x|zppinstxx|~}vqku~yypwtyw}|ugvy}xr{rrmu~{nvvuuw{t|~~xyw{y|}yqwy}u}untyux||~{zvvx||vrjmky~xvz}}rptw|sus{~{z}visw~vrx{nls{}owswrv|{|x~~wyv}y|tsy}svqqzvy~z}|{~|vqy}|}ytklhz|wvx~stvt}uw|s~}~}y}vmrw}uswlkty|qwrwqv~||t~xxw{z|}vqz}svrp{}vz}z~{}||uoz~{}|{skkh|zwvyrvtu~{ux|~s{||xsnsx|stw}jmtzyrwrxpz~{zuxvyz|{|uq||tuqr}{v{~~{~y}~|rp{{y|plil}wxt}}qwrzzu{~{uz|{ypnuz{rvwwjov}stvsvq{~xz{yt|~~~}~xss{zxzspuzu}{x|yqu}{xymlht|yyuvqut~vu~wz|~zy||kqv|wtw||qmrz|owtvsw}xz|}zvu|~~|~zttxx~uptzvx~~}}{|wvwxxwrljow|{wx{ppu~~{rz~z|}}x|}rlt{zvxz~tsnx|sqvwswzzr}ytv{{|{tuv|~ypsv~~vz~}}z|xtzx}wsqjmswyyxtno|}wt}}{|{}yz}~|pmv{xyxwusq{~zrqwwtzztt|}wuuz{wtvy}|upux|wz}|}zzuu|x|urpipsz~yyxrmr~}vv~|~z}x{}yoow{xyyuvrt{wrryvuy|rw||vtv{{utuz||squz{x{}|{{zsw{yzuroipt{}zxzqmt~~uw||{{w||xnpw{vyyvvpt{vqtxvty}sy}|usx|~|vvty}~~sqtyxy{|z|ztwwxxwtojmuz|zw|rpt|uyz~~~zw{{ynqv}txy~zuntz~xovuwryxz|~|vr{~~~~xwsu{urrxwy|{~}y}wvruyyxolhvwyzu}vsvuwyw}yxyz~ort{tuyxtmrx}}oxtusw}}~y||xq}{}~~{yts|xtqwwx~yy|yvot}}{z{olhuwwzuyvwsyz~w~}yyy{~pruyttxwtmrw}}pwtssw{x{}ws}z|}yss}ztqx~ww~~y{|~zunu|~{{{plivvwyuyxvtz|}~wxyx||psvysuxyrnsx}zqxstrz|~x|}vt~z|~|ysu}ysry}vy}z~|||ysnv}y|yokkwtyxwwyuwy~~|x}wyy}xpsvxqxw|}qouytrxrus~}~|z|sv}|}}yxqz~}~uss||u|~y~z~}yvrqz~v}tohpxu{vxtxt}|x~x}~{uyyrrryus{w~yprxz}nvuutv}|}||}zqy}}xxvsvssvw{|z~y}~|rutu~wyxqmjuxx{u{wrw{w}~}z~~wv|{xsqtzszz}|yxpwxsqvvxuzw~}~|{ur{~}|tys|qus||y}{}zy~upyu|~}~wxtplnwyyztrrz~}~y}~{~|}ty{~ttpwxv{|wzusxzzqruxxv{{x~zyts{}wuxvyquu}z|{}~}yz~}przw~~{wwspmoyyzxv}qt}}|{}{||t{{|tsqxww{}v{tuw|xqsuxxv}y{~zystz}uvwwvruv}y}{}~}x{~|otyw~~~ywwsompzx{wx|pv}}{|}{|{s{z{ttqxvw||w|suw|wptuwwv~y|~{yruz~vwwvwsuv~x}|~|~x{~~}otwu~}xwxsolqyw{ww}rw{}|}~y~zr{y}tuqxtv|zx{rtxzyouuvvw~|}~}}zrv~{~xwxr{sut~xz}~zz{|~trus|~zw{tpkqvvzxvwwx~|~~w{twz~uuswtszx~~ztrxy}ptuusw~}~~|{swz~}{xxs}vuu{zw}y}|y}wrqry~{w{vpkrtuyxx}{yw}|x~zuuz~xtuvssyx}yurwz~}rtutrx~{~}~{txy~}|ywt{wtvzzv|~z|x}yspswzx{wpksruxxy|}yw~{x~yuu{~xtvvrtxy}xurwz~{rtutrz~{~}ztxy~||xwt}vuwzyw}}z{y{xqpsxyyzvnmtrwxyy}}wzzywtv{~vuuuqvyz~}xusxzwqutts||~~}wuw|}|yxvvzuux{wz~||~~x|~ztpst||vzxulostxyxy}yw}}~x{}usy|zvuutryz}~zxswx~}rrtvtv|~~}|uty}|{vyt}tvu{yz}~{|y{}}uousz}}xwyvqmouwyzvxw}~|z}zqxz}wwsutv{|~x|tvw{~uqsvvxw}}~|xsux|vwwywuuw{x~}~~}wz}{zntuw}~}ywwxtqnpzw{v{~t{}||||usz{yxuruvx}}{yztxxysqtvxyw}|xwqz}yzuxw~tvuzy{}}zt}{{unvu{}~{xwwwrrltzx{vzu~~|}}z{suz}~xxtrvwy~}~x{yuxyvrquvyyx~}~wwq}{yxuxxtvvzy|}}yu~z{sovu|}ywvwwrrlvyxzvyv~|}~z{rvz}}xxtruwy~|x{xvxyvrquvyyy~xwr}{zyvxxuvvzx{~}}{v|zzsoutz|yvwwwrqntyxzw|w~{{~}{ruz}}yxustvx}|zzyuxywsrtvvyz~zwty~zzvww}wvwyxz}~}}~yy|zvortw|{uwwxtoqrwwyx{y{}x~|urx}~zxvurtxz}|~yzwvy||strvtw}|wwu}{xwvz|vxyxy{~~{~v{zwqotu{|uwxwvnsqtxwzy}y~w}|wrw|}{yvvqswy}{yzxvy{~~turusw~{wxu~~{ywvy}wxyxyz~~zv{zwrotuz|uwxwvotqswwzx~y~w~|wrw}}{yvvqswy|{yzxvz{}tururx~{wxu~{yww{|wyyxyz}{~v|yvqotu{{txwwuouquwwzy|{|xzurx}|{xvupuwz||}x{wwz|yttrus{|}|xvw|zxvx|ywyxwz|{}yx{wtoruw}~wtyvxrrsrwvyy}yx{xst{}{{wvrrxx}z~zzzwx|}turuuv||xwu~}zxww||wxzwz|~}|{wzxupqtwzzrwvwvqrqwwwy|{}{zztsx}{{yvtrxx|||{zzxw{}utrsvw{{ywu{}yxxv{~yvywx|~~|{wzyvrqsvy}}ttwvwsspuxxx{}{~y~{wsu{|z{xvqvxz}|~~}{{yxx||tsquvzz}}wvw{wxwx}}wwyw{||~~wxzwtqrtwz~~yrvuwvtrqwxxx~|~|{zutv|{{zxuqxx{}|}|{zyxz|ytrrvw{z{wuyzwxvy~|wxxw{}|}vxyvsqrtx{}wrvuxutqrxxwy|{{yttv|z{zxtqxx{}|}~{|zzxz|xtsrvw{z|wux{wyvy}wxyv{||~~xxywsqqtxy~}xqvuwvtrrwxwy~}~}zzutu|z{{xvqwxz}{}|{z{xy|}zstqvvy{}~xwv}wxww~~ywzuz|~~{|wyxtqprww~~{qtwuxstrtxwx|}x}~wssz|y}ywrsxw}z}}{z{yw|{tvrsvw|{{yu{{xxv|~{x{wx||zxxyuqpquv{~{srwuxttsswwyz~}z{xssx|y|zwsqww|{|}zz{zw{{vvssuv{{|yuz|xxv{~|yzxw||~{~yxxvqprtvz~{tqwuwuusrvwyz}~z{ystx|y|zwsqww|{}}z{{zx{{vvssuw{{}yu{|xxv||y{wx||~{yxxuppruv{~~zrrwuwuursvxyz~z}wsty{y}ywrswx|z}~{z{{zx|{~uvrtuy{|{xv~yxww~~{yzuz|}}||xxvrpqsvw~~}wpuuvwutruwxy}~z{tsu|y{|xuqwwz|{}}z{{|x{|~xutruwz|}ywz|wyu|}x{ww}|~{}ywwsqrqvv{~~~zqqvuwvustxxw}z~}uuszzy}ywruyy|{z~~z}z|yy||{turuwy|~~xwy}vyvyyyyv||~}~}ywwupsqtwy}zuptuvwuttvyv{||wttu{x|{xusxyz|z{z||z|x|{wtssvxz~{vx|yvyw}~~xzvy|}~}zxvvqpspvw|~|xrqtuwwttuwxv{~~uusxzy}ywtuyy{|y|~y~{{{y}|~vtstwy{zuz}xwxx~}xzvz|}~~zxvvpqsqww}}{vqruuwwtuuxxw|~}tusxzy}ywtuyy{{y}~y~z{{z}|}vtsswy{zvz}xxyx~~y{vy|}~}zyvvpqspww|}{wqquuwwtuuwxw|~~uuswzx}zxtuyyz{y|~y}{{|y}{~wutswy{~|wy|zwyw}~z{ww||}}}zwvrospuwz~}~xrptuvwvtuvxv}}}yutu{x{|xuswxy{zz~{z|{}z{|~yvustxz|{wz~xywz|{zv{}||{yvtoqqsww|}zspsuuvxtuuwxy}}uttyxz}yusvxyz{y}}y|{|{z|}{wvtsxz{}wz~zxxy~}{zvz}||~{zvtporrvw{}{spstuvytuuwxx~~}utuyyz}zutuxyz{y}}x|{|{z|}{xutsxz{}w{~yxxz~}{zw{}{|{zutoprrvw|}zrprtuwxtvuwxy~~|ttuyxz}yttvxyz{x~~{y}{}z{|~~zwuttzy|{w|}xxx|~~|{xx|}{}}{xtrnrqtwy|~~vqqsuuxwtvvxx}~~wttwyy||wtuwyy{yz~}y{|||z{||xuuswzz}x{~yxxz}{zw{}||zzusoqrrvw{}yrpqtuwxuvuxw{~xutuxx{|yuuvyxzyy~~~y||{}{{|}yuutvzz~w{}zxxy~~{zxz}}}{zutopsquwz|{tqpsuvyuwvwxx~~|uutvxz|{wvuxyyzw|}~{y~{||{|~~{wtutyy}zx}~xwx{~}{yx{}|}{xtrnsrrvx{}wrqptuxwvxuxw|~~ytuuvx{|yvwvyxzxw}|~y{}{|{{|}{vttuzyxy~|xxy}}}zxy|}||{wtqosqsvy{~~uqppuuyvvxvxw~~xttuvy{|yvwvzxzxx}|}y|}{||{||{uutvzyxz~|xwy}~}zxy|}||{wtqosrsvy{~~vqqpuuxwvxvxx}~yuuuvx{|zvwvyxyyw|}}z{}{||{||{wuuuzy~{y~}yxy|~~~|yyz}|}{ztroqrruxy}yqqpsuvyvxvwxz~|vuuuwz||vvvwyxzwz~|{y|||}|z~{zuvtwzzy{{yx{}}~~zyz|}{{{wrporrtwx{|sqqqutzwvxvxy~~yuuuvy{}wuwvyxzxx~||y{}|}|z}{{vvtv{yz{|ywz}~~~{yz|}z}|xspnrrsvxz~}upqpttyxuxvxy}~yuuuvy{}xuwvyxzxx~|{yz}|}|z}{{wvuv{yz{|yx{}}~zyz|}z||wrporrtwx{~~|sqqqtuzwvxvxy~}xuuuvy{|vvwvywzwy}{{y{}|}|z~~z{vvtx{zz}~|yx|~|~~yzz}{{{{uqoprruxx}}yqqprtvzvxwwy{~~{vuvtxz|zuxvxxxyv{|{zz|||~{|{{yuvuzz}|{}zw{}~~~{zz{}{|{xrpprrswxz}{sqqpuuyxwxvx{~{wtvtvz{|wxwwywxvy|{zz|}|}|{|{zuvuyz}|z~}{wz}~}~~|y{z}{~{xsppqrrvyy~~|upqosuxxxywwz~}yuuutyz|yxyvyxxww{{zz{|||~{~~z|wvvwz{~z||yx}}~~yzz||}|zuqpqrssxx{~}yqqpquvxxyywx|{wtvtvzz{xywwywwvx{zy{{}|}}{|{{vvvxz}}{}~|xy}}~~~~y{z||~|ytppqrstxx|~|xqqoquwxxyyvy}~zwtvtwzz{xywwywwvxzzz{{}|}}|~{{zvvvxz}}{}~|yz}}~~~~z{z{|~|yuqqqrstxy|}{xrqqruwxyyxwy}{xuvuvyz{yyxxyxwwwyzz{{}}}~|~~}|{{xwwxz}}|}}{z|}~~~~|{zz|}}zwsqqrstwy{}|ytrrruvxyxxxy|~|ywvvvyyzzyyxyxxwwyz{{{|}}~}}~}}||zxwxz|}}}~~|{||}}~~~|{z||~|yusrrstwyz||zvtrrtvxzyxxy{}}zxwvwxyzzyyyyyxxwyz{{{|}~~}}~}|||{yxxz{}~~}~|{||}}~~~~}{{{|~}zvtrssuwxz||zwusstvxzyxxy{}~{yxwwxyzzyyyyyyxwyz{{{|}~~~~~}|||{zxyz{|~~~~}|||}}~~~}{{{|~|zvtsstuwy{||zwussuwyzyxxz{}}{yxwwyz{zzyyzyyxxyz{{{|}~~~~~}|||{zyy{|}~~~~|||}}}~~~}{{|}~~|yvtstuvxz|||ywuttvxzzyyy{|~|zyxwxyz{{zyzzyyxxz{{{|}~~~~}}|||{zyz|}~~~~~|}}}~~~~}|{|}~}zwuttuvxz{||{xvutvwyzzzyz|~}{yxxxyz{{{zzzyxxxyz{||}~~~~~}|||{zzz{}~~~~}|}}~~~~}|||}~}zxvuuuvwy{||{yvuuuwyz{zzz|~~{yxxxyz{||{zzzyxxyz{|||~~~~}}|||{zz{|~~~~~}}~~~~~~}||}~~|ywvvuvwx{|||{xvuvvxz{{{{{}}{yxxxy{{||{zzzyxyyz{|}}~~~~}}|||{z{{}~~~~~}}~~~~~}||}~~|ywvvvwxy{|}|zxvvvwyz{{{{{~|{yxyyz{|||{zzzyyyy{|}}}~~~~}}|||{{{|}~~~~}}~~~~~}||}~~|zxwvvwxy{|}|{xvvvwyz{{{{|~}{zyyyz{|||{zzzyyyyz|}}}~~~~}}|}}{{{|}~~~}~~~~~~}}}}~}{yxwwxxy{|}|{ywwvwyz||{{|~}|zzyyz{||||{{zzzyyz|||}~~~}}|}}|{{|}~}~~~~~~~~}}}}~~|zywwxxyz||}|zxxwwxz{|{{|}~~}{{zyz{||||{{{zzyzz{||}~~~~}|}}||||}}~~~~~~~~~~~}}}~~~}{ywwxxyz||}|zyxwwxz|||{|}~~}{{zyz{||||{{{{zzzz{||}~~~~}|}}}|||}}~~~~~~~~~}}~~~}{yxxxyz{||}|zyxwxy{|||{|}~~}|{zzz{||||{{{{zzzz||}~~~~}}}}}||}}~~~~~~~~~~~~}~~~|{yxxyyz{|}}{zyxxxz{||||}~~}|{{zz{||}||{{{{zzz{||}~~~}|}}}}|}}}~~~~~~~~~~~~~~~}{zyxyyz{|}}|{yyxxy{|||||~~~}{{{zz{|}}}|{{{zzz{|}}~~~~}|}~}||}~~~~~~~~~~~~~}|zzyyzz{|}}}|zyyyyz|}}}|}~}|{{{z{|}}}}|{{{zz{{|}}~~}}}}}}|}}~~~~~~~~~~}{zzyyz{|}}}|{zyyyz{|}}}}~~}|{{{{|}}}}||{{{zz{|}~~~~}}}}}}}}~~~~~~~~~~~~}{zzyz{{|}}}|{zyyzz{}}}}}~}}|{{{{|}}}}||{{{z{{|}~~~}}}~~}}}~~~~~~~~~~}{zzzz{{|}}}|{zyzzz|}}}}}~~}|{{{{|}}}}}||{{{{{|}~~~}}}~~}}~~~~~~~~~~~}|{zzz{{|}}}}{zzzzz|}}}}}~~}|||{{|}}}}}|||{{{{|}}~~~}}~~}}~~~~~~~~~||{z{{{|}}}}|{{zzz|}}}}}~~}}||{{|}}}}}||||{{{|}}~~~~}}~~}~~~~~~~~~~}|{{{{{|}}}}|{{zzz|}}}}}~~~~}}||{|}}}}}||||||{|}}~~~~}}~~~~~~~~~~~~~~~}|{{{{||}}}}||{{z{|}}}}~~~~}}||{|}}}}}}|||||{|}}~~~}}~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m32.bin b/applications/PoP/poc/res/music/m32.bin deleted file mode 100644 index 44fa7c7..0000000 --- a/applications/PoP/poc/res/music/m32.bin +++ /dev/null @@ -1 +0,0 @@ -û~~zpkU7&02LQfq{|s}PVMdzƳuzujMUF*&XmiU>L@zwjbλnǿxSjK!\fKOJH'/5Ypu|bxrzns|p|p}ioipjolxw}hrwzs{qe{~cyyhebjqqlxvvpo|xUWSDU99[zݸţuehbRigavYqlfunukx}sk|^TH_CVF:M8IP[elr|zz|cGZZ_5'2DRv}xestmvpkibyoxw{o}mmz]zq}}ezzj\loa{]lkcshmcj|nVlW]aAEVP_r۹ɼ{wl^w^kkVm^jokpi|os|÷{avtcejKaEAE7H>FIRs{i}dT_dsO8$6(,KCofmwzswpmarxatyz~z^tdercv~pcqo]w\bbcsgmdbulZtbcqUXbQSV]ҿwlhjrUcZhohpeponr|\grrq_n\GN@PGDE>VgZuynXcf|mL9@:!;&2Gapit~ttyvyhfvda~ntrz]pujUfv~lj{`pnWb[pnkn`jt\jvazrcodY]Q\mvѲu|e}iZ[[ofkmcrvd~th[jvslzh`WOQ[LOH@SROxw`\itkK>L5-<&+Kiyclyzdkuzz~ojt`jmuconVF]t~kqy_uo[\\pjmrgls]qxf{owf_bU\fixpͯzjrb]andineotexºc\o~oh{xgk_W[`RUSEPQInqw^^qzqNCM<+@% 6MYxųǴ}ak~bcvjo}~|oyljs|mijR@Wqnrgix`_\nkirqkylolxzrdc\Uffl`uþp|igfukiojjzn}wfbxrgx|e|wd_em^[^SQYMiqi~|aj}}sTIUG-A.!0>CZt÷ſzsav~card`~rtys}wtx|qfgOE_qw|xiukmzc]bumkpskyr}q{tli`TdgeSe|qxpjssqtniwpz~es~hdyvfsfaqtihfXZ^Xskgx}lb|zoRPZC:H/"#849H]cҿzybfvalqXercewxvwrmbJYnvqrc_wyg~wd]mtnpulkurxptpd]jeYNi_VimxĦss~|{}jnoxnot_mtar}jco{qsuo\b\rybw{zq]rcS^P>RE/%5427BBOg~ÿf`xijr]^p`Xc{z||qRZlzwsfUfj^yofstmrwrdnm{sxupgtkZMdXDMIJs˶|vonw~xyhmlXjwkcqwpuy{hkcx{hzwo]n{vdfPDXN>8C344=12@VɿƸojtvwqYgraVdkft~~{dkj~o^dUPqvnosroypgin|z}zyxpp~qZWhRDF28JcxztuzzxeTjoedvkkowxkssylur{~tinowpRL\REIR<;3?/+/@\VmĻí~v~v[fqf]id]cixp}s{pokSH`edmtysyqgotxs|um~vfdnXGI558@^tzz}}{uYdmd_rnhklventrv~w~tzq{m~fS_\NJXGI>>9+29OFFg˿Ǵigtlbkr]d\lbfv}o{y}zjNVb[Xpur{wikqr~owykdurTG?4?3HTkxwrqjpqdpladscojsncmz~|ppsyz{b`l`OSVCNCM9-4DTAD_pżҷydn|seomcj_m]^kyrhzu~|mXaf\Wiclxyrru|wyxjcssYM:/>:TT`faopx~rk_bu|ofxwgdo_njw{ho{~p~}wtu{|zwd`qo_ZZDNCPL::BUJGZephȽĬ~ggzzqso]netj_hz~y{vetzp[bpj^fcZoo|||pdls]LC2?=R]T`U]^Zw||l^Vptzeoytlq\cknuy~|~~ux~rv}vaZmskhhIPHKSCHMXLEXdj]tĬlhwysyyblatugkx~yuof|z`_oqimaXja~}{oru]G<6NKVUKZRSMI`|uj^^tu{nvyrsy^fbl~r{|xzpokz`[krmpjV]IVTFN[cNETabYqnԿtr|zs|omucvonuu|ticivipsoov^edfzq|{}tVG8DUViLKRPM=?Xkt¬i^[ssvqw}rwiin]soq~uh`mqflqnpt]i`Y`NOWe]PUW[SghfyoƲŧy|peykysgrtp}|g^`yyukw{qwfkl`ulo~lTCHQPn^WSHG97GSZgrs¸zhZmms}xtoju~|efretiftzk`fu{mjy|rpo^ocgmWV]eXS\`XKe`el[iq{˸nkthxmn|srw|urabli{lgvw`umlwglwxiUXLRk_jaO=/7FJHRLTruumm]um]Wl~gojg}lgn{{t}wgmhhpkxzj]rdmsgcdgXQZc^WdVdjW[\eyʽrrwg|yvz}xnt{{o{{|pjfZ|fcp|jukprot~vstjkSQmakj_L20@JII;=VOpzx|cqp\QYjw|~lutcvsstwskt~wsl^|ty~|coegzootraVY\^\odXgZ[ZXcw{v»}mx~t{tku~zww}~usx^j}scdrzz~ry~gz}z|{ps}~tqnYllhn`VF;<@EJG4DDGdmwzum~nWP\fhrqg{ppzpsrho{~zmkvxtq|clwsv{}l^_b\^tejhQWZ^gpmffpx|~~xuxyxvzsnqf~wykemruxvgys{{tu}xptnb|kk_Q@@FKNJ8>E@Yccl{ȴúz~|s`U_loj^Tieeww|{|ymefq~}uw{yzyvy}eho][]_aa]WQR]`}{|wx{uuz~suwo]V_pyzvmzuozw{wutkbPCGMJHA?P==W`fkprvżǷ~zuoebbinkZ^h[jy}yz~yv|}zjbjuyy|vv{|{~lui]X\flcOHLWV`xu{|~|php}xxrni`]dlsrgxkzy|uxuj\WVRQM?:QHBNOZdjc`juɻŶ{nhmrohh_glWerr|~z{|wzxy}sllrvvpsxwz|ma^\bliZIBMIZrdhpqv}xzymhhil}occkljifdwsp|s}umb^deZPBCM@LWOMW^XUW`i}ujoz|ueYnm^ikmqw}||yw|wxpqvprxytsih|~y}ncdijf_WOF8Qj``aa\]q~thibY|zg_fsul_Yqoi}}}zzy|mcfkmkbIHT?FVWVSOOQUWXj}t}tsw|~wdgjaqsklrpkt}}y~neritxjcvno{xolqm^WUUBJTXOOdakŰut}zxzzqaV[chptit{ksy|wy{z}x}{~zwtougaswvvwjYWXUZnfai_bhlpwztq}~ztzwz~wkmut|{rooptunj}s|}vmklaj}g][PE@BGFDJFMYL\ouɺ}xt|xui_\afebcvsm}{w{xsw~ltfc{nimdeggylWUUeuztolxlz{tnbTWntRW{tq}fdtxmaamylwkkYSuTQjrhnsrptfU^v}ydRA39IX`_QL?)Frm]r{qjn{v_OB7NWVhmke`[aq|mtlyyskipsy_V_mty|yvdSQQQYjypO\Ƚ{r~wldp{wv{sgbcZSsmYTb}tqYLdt{}vaKLiilshYOKLPOG0 +*=\lytaaqƹ|jWN^u~rx{nmw}nfe`Sowj\STbmqtwre[WTUTYRJULEDBAGS]flrketpuĴztszikpXOU`iv|zxvn`_glilvksnq}qlcWD/*././)3<5Pjtz|ynegrzƻzn_RMVcji`ntmwesxx{qzu|wk[W_gq~xtsmjsdR\SIJR^febgmsjhyqwyurz|tuvoumptw{ytz|{rhWKOYdllxz~teXPJJJF?J\RYfq{}qmmntyk_XXYVVZT[aTaln{}yuojt~mptpywu{{ugechsyqc]gqorsooqpw}yv}zrudciptnaYV]gnupe[TVYZ^dim|pknkb]TRb^dqlnyypnqszypdWX`c]SJUaRV_adjsqmopknvm{~oov}rnpstnf__dkponkely|z{qzpgagpl]OLVW`}vlni]QQ]geb^f}y{vwyzviX]dWdqqpnrrrrpq~se]\afe\KTZTa`]aecdknoq{uj|~wrr{utvmb^`f_g~uqohd`dszttplije\RQUThpjolh_VV^gleZipqxu|~zmag\[fioroddlqqtzygdggedZ]\M]fdbbb\\eop|szztzyx}|yzreZXa`esikplaY\fo{~zttwyrc[XYXPdlahmja]_abdfaigcx{|~qpu_^gdflng^]ekt{ny}|tppkc[hfV\aehg_XY[al}{vzppw{trt{yyi`\[Viuhfih_VV^ehmp|x{p_X^ZVhgcfcc_\age`Y[ne`ns|vw}mkjffgheca]_pymuxrtzzsk_iiake`fkg\XZ\_swt~vqpxukjrpux{}{jb_R_rnpi_ZWXZ\^_Zl}w}re]XVlofhe\TW_dgg^Tbdcnmnv~vvut{qjiha^cfbcokr{olotyikoakrnifheb`]]gnh{wwvux|{vkhhfwrvv~si[Wllmsl]NOX^]ZTUfgrvpkgWZsrqncYPOZege^^eZbssqsxz|~wyu}}xqjc^`egooapxpmkpy~uusfostusibehgclmdrxvvw{}yqmnnfdvot{~}~}vuhasojliaULOY^^URb^dzxmimehuorsj[ONRYaf^`m`alqy|ytv~s{zkccccmxjkolnoosxups~ntxtw{yoeflmtufoskqwzuhbhqn}~xtv{|zw}{vvvszjic\VRSSTY[V`a]nx~pijko|lkjdYQRWY[]_mihrqs{wx~~z}rigehslpvhdipuuohfk}||||xtojjv~prtkiku}~wmddlq}}{w{~|zyr}xqw}{tjcZPMSYYTQRcd]ksyxnrqsvod_[YZZYYSWlhjxywy}||~}{wogmqdouke`fpska^hs{|vvxunvxr|uihgktyqihnnp~yvsu{}tq{~~v{z|ufYPMRY[XLN_\dnnu}}{uz{vj\W\bb]WP[absxz}}yu{}~}xsujhpihfcchic]]gj{|wwzz~{mz}rlgilmljglro|vlkt}|qzyu|yiWQSUVWQPVNYikmqvvy~|vj^Z`ed\QY[Ufrvz~{srw~zz~omrfcdgie^[Z]_\o}}|{|vzwsrnlmld`dkjnz~znhmv{|wv~qr~tf\YYVRLUXJR\bgjhfjq}ypjgccd_X_WT`dmvywtrrt|}xvzy}}{vidadklbUQW[Vgrqz{pqstsmd]Zbei~~zuronprvssxtz{~~rnjb[VKPXOVWU]ef``ekruoqrme_\faV_abgqtqsutt}ytwrv}vjecehf^UORP]ojottru~~uosyxnb[[[Zr|xmipvtpnky{u{}{uttnbUNWOP\\XX^``abfn~wqsvtn_\h`bfbcfikosvx|y~|~xuo{{x~vkghf_ZVUPI^nkonkffpyuvxqg_][Yny|zohksxwnhuwv~{~vsvwtn`TYPNX[^^\XZaefkyv}}wwwvukfi_eoljjkggpxz}}~t|yv}wz{}xqkf^SNQVQ[gelnia_dn{~wnieec^nwr{|upopsvwptvp}}sqtvskadZNWYY_c`YX`hlvwt~}{vpmvmcmrtusmijowzxz|zz{~||~~zwvo`RKJRT`l`_egc]_govteagnjtzqqtvtprwwtrp{}qz|{|wtsrnelgZ\[Z[_`]\[^fvwr~~}|soysquqsy{tmmoqyupu~xtw}{zw{|{zyuhVLMRQbka_[[[[_dinpsxldgnr|qroljnty{xqm{{y~wx||}vpijrfgh`\]\YY]^\aomu{uvzuyzr|~yvxzvsqpq{vpv}yrot{}tp~}{}|tg\TTPXe_``YQNU^cdecm}}uponk~zwrlebjuyyvovuszv{}}~{niskkqnga^XTV[]`f_hupnns{v}|vsuvurz{u{xwxvzsoquxzvqxtyynfb_TZe]^`\SJJS[^]Wakj}zuxup}~zoeadksvrpzsp|}{yzuvttjqurqmcXTTUXbeYafeghjqusv~~}srvxx~wt~{}ytu{vx{rqsssos{or}|smjh_eg`a_ZSMKKNTUQY][iu|{xx~xkddghlmnysryy}{}xtw{t{y}~oqvvvuqf[WWU]c\caY]bfjkifhs~yuvzv}ytv}wrtty|zvsqkkxssyx}|}yqnoglvlge]SLLONJJIQZRZeku~w|umihgfdbqupz}{|~~~~xprtv|w~x{wwyyslg`ZZb\\f`YV[cig`^`hl~y{~vsru}|wuto}~}xqimsnw~{z~~~sonjw}vtj^RJJNQOHBNUR\aemv~{pmoolhc_knp|}zwtsou{||{}{zzwrpmgae\[b^[YVY`b]YZacr{}vssuy{xvvzu~~y{|ontls|~}{vsmy{zuhXLJKMONGJOM[ceipuxwlkprpiagjfv}vppvyvzvy{zuttropg[b^XYZZZXVVX_dj}|yuturmns{}zvz{x{pqz{{~xzy||zxpfXOMNLLHMSJQ^ejorrw}upnpqpgjlenw~unlrz||vw{~yuvvtysfg_WUUY[WNKQ^ej|~~}yzzxvoheky~~zz}{~xw|{}~z{|zxria\WRNJDMRMTX]fmomqw~{xxwsomksmhqswwmmtv~{yz|}}{zwvy~srp`XTSUWTLHLY_nysx}xvy{wmedkrz{|~}{z~~|~~~}wpiedaYPGHOIPXWX_fghlqv|{}}xogqslrrruz~yrssvzuw{}|zvv{{yx{pe[VVUQLJKNO_pmprsrt|xz{skfhkm{w{xu~~~{x{umllkf]NMOFMTUWWWY^dgju}}wnrnmvurstst{}{zrv|sqx}|yqt{wzvpia]YQKILMHWadlliefmyztplkfjz|}yy|yv}x}xvwz}spqqmg[YSINPQUWTOQY_blon||x|qluwwutpmpv}~}yz~xtsvyyssxqx{xspkbWNIIKHUZXbgf`]ahoxwpnqlivwy~{|}{{yzxwyvwx|zx{yvtrofeeVRTQQTUROOSYckemutzzuwvvyzuomorw{z~}|}wuwwtssrzurz|{ywvtj[PJKGL\[[]^^ZZ]bfknz{qmpmt}x{|{yxz}~|ysyz}}zy~||~wsv{~~xsnhlj``[UTTSQRSRS_fdnnlpv~z|xxzytrqqt~zw{{{tquxxtmnzvv||~zyyxqeYPNIN\\^_YTSV[_acck|~wrplw~|wqnsz~~|uw}y}}|xssww~{silofiib\YVQQTWW\`^joklou}{|yxxxvu{}z}z{|~vqqtwxuntuu{xwsja\ZTQ]]Z]\WOMT\acabpt|}wvyvvzrljow|~zzz|~}{yvtuzy~sorimpmjf^VSSUW^bZ`ihjkmsxy}xvy{z}~w|wyurtuutrxvq|~yrjdadb^d_YZXUQNOTZ__`klqxw}}~|tljlptyx{|~||}}tnpv~}~xzwlqsrqoi^WUUV^a\ba_dgknomnv~zxz}~y{y}{uv|yvtsoqzuu{}sidfjhmpb]ZUOMNPQRVW`gdoy}~|ysnlmnoor~~}}{z{}{slmw{z{yvwuuuslf_ZWY^Y_b[Y[agifcfo~{z|}wvw|}xvz}ztomusu|{{tkimlrzqjcZRKKORQNKT^\dlqxzsqqqomjhtxy}zzzxspnqr}~|{xxwrmje]]^V[^YWTV\`_\\ckr~}}wtsuz|zwx{y{potnsz{{{{|~~wspmx}xwpdWNLNOOLFLPQ]bdjqv}vqsusngfnkr~|{wqpqsnwz{|}ytsqojicY][VVUUUVVUVZ]bu}{wttutrtvzx}~yuvmpvwz|{vv{~}}zrz}|tfYRPOMKGLJFRY]aehjq}yutusmglhhrx~zsnnrpu~zxz}zvuustseb`XUTVWVPMNSXWdrv|{yxwtnkltwx~{xpuuvy|{wuw|}}}~vkb[UQMGHOIIORY_bbdjr{|xtrmopgkprx|rmnpo|{yz{{|}{xww{xnneZVSTVVOIGNSWfmpy|yyzytmhgmqx}}~{|xwyzzyyyx}}xojf`XQIINJMRQSZ_abekq|zslptmoqqsx}zspqp{~zyz|{zyv~|y|}tvrf]VTTSOKIJNRcmmrvwy~~xwyxqjgjmp~}z||zxz}}|yqmkje^SKOLJSUVWZ]`eimr~|tnspqwutvxx|~{yyuzztuz~}{vy~wyypiaYURLHHLQP\hinqqpqyzwtpljloo|~~|}yy{}}tnmmkg_VVOLRTWY[XY_fkpyzyvxoqxxxxxuuz|{~}{vtw{}|wz}yz|zrnhb\TKFELRS^aailljkqy{tljlqqs~|}{zz{~{wyztrqnjca_RRTSUXZWVY_entr{z~{svwy{{wttv{|y|~{wwwwwywx~y{xtpmicWLGHMNYa\^addcflrx~~umjost~}y|}~~~}}|z|{{}{vtw{wsoihi_\ZUTUVUUUVYbkjqutx~~z}zwy{yustuxyyzuuwywtpt|wy~zvtrndYPLMKV][^\ZYZ^cfilo~|uppot~|}zwux}zz}~||yy}{urtxzzslonfhd]XVSQQSTT[^_jjikpw}zywvutsu|z}{|||utuwwtmpusy||}|yxume]XRMWZZ_^YRQV\^``amsz|yxrs~}wqqv{~~zz~z~{~}|{yyyxussut}strlonjd^XRPQSTYXU_baceiouy~xuvwvvzvv}|}{|vuvuuqqtnsz{|}~|~~ztmhdaXZ]Z]^\WPNQVYZX_efs~~|x}uooquyyw~|y}zzz{{vrqrusv~{{rqtrpmg^VSSRV\VW[Y\_aeijkq{}xvxx|}uy{x{~zx{~|xvtrntunswz}~{|~unjjgche_`^ZTQPOPRTU]_`ks}~~vqoppqru}{{zyxz{xqlntu{~yvwutspia[WUW[WZ\VVY]bdcbemy}zx}y{{vuv{~zwy}{vsnruqvxwz~}~{qkkljrsjf`ZSOOQQOOOY^]fms{|vsrrpommw{{{xwwvrnmptz~{xwvrmid]Y\XV]ZWUUY^`^_dnw~|||yussvz{yxzzrrvrv|{{|~xrpqovzspi_VONPRRQLRZ[dknt{vrsutqnjqtv|xvtonotux|yuqolhcb[W[XVUTTVXY[`jp{z|zwsqrrrsv{ywwrw{|~}{}}yxyxu||wupg[SPPPPOMSST`gkpuy~ztrtusnlqor|}xrmlpww}}|~wtsqnmj^][USSSSRPPV_gkz~{xwtrqoklr|~wuyy{~|zz~~z|~|{xsjaYURPNKOSNTZ`flopu||yvtsqnromsw|zqmmsu{}{|~zwutttjfbXSQQRRNJKS\amvxxvuutpjhjrx~{{yyz|{zyyzzskfaZTOJNPLQSUZadeint|}{kgfggg`\Zd~lbvqd^]]^ehgskeziSW^ehikf\K1*Ko^FhpZ|Ĺx|zmgjq{sSV{olfq}~wfbhyfXhhefipuyzvkgtm}{blqf`gjihYB4>Yt|oYO`yòϴohc_WSVS[l}l^d{{qjgfhjltq\ft]autnvmcchy~|vpkbS@0-;99;@HU]_jnpu{~Ļwohc``dhijjkqnlonnqtutuuvw}|z{slfa[UK@649>I\dkrvxxy{}ž}||rkgcabfkpqqnqvsturqrrpmliginknqlheded`\]cnx|||uvtpnnmkkllkptt|~wwsmolgdcba``acjnpyzvtqoonjhipx}umgbZVXQMKHDCGOUZ^agsw|uohcacilxxtsuurkdeb\]YSMHC@ACFHNOPZ\\]_bglqxľyphfhjklhilhmrqrrsru{{tjikjlwwhaTSSTU_ml|ŨտrjiywWWn~dNL]swc`zY~t^tuaVQOU^k}kcxvst~zUSx|QGqiPKUfsz~xokpǴ~me\]ojJ\cO_{kf{srr{~sqpmg_\anlI56GZc`SE<97=BCPaxzrf\]qqbbm|{~xvpoonq|xigs{pmjbgr{nO41G`j\B738EQZ__\VSYao˹yw~jlvslls~{{|y{fWXjuieeghdYOGFHM`ny{kZNE?=?CMOPW[ds¹}mb\]cmv~}mb`lk]URRQMIFIS]s{smonikjks~oZMDDR\dkqyzj_]bm}sg^YY[ZXX\dlzoedebinsz~xuwtj]SH?::?GMPQS\_`eeca_^aivü{skjopwwvzzz|~~{xqrtnlifdeku}|si`XPNPTYcihljb[TNMMLLOWam{ofigfgjotxz{{|xvzxwwsnjjnqsrmjkfdfc_[WUW^gq}}|}{zsniea[[^^gpwywsld][]__]Y\][`ddddcchp{yuuy|yneWJHC??@BCDEGJOQT`elv{~~yvw{}zxz~{srtsvz|~~{vtssmlmgea[RHB>=;:8:;6:>AEIMR[hx{{zwwwvuqkfdefekkhjljgefilprsxwqsqonnkghkosxxrrlea]\[XTSXaiq{srlhghhhfcacjnqyxwxwvtsssttrprlffcbcefhlry|muuxuoefUGKACKLRY_q´}y_ijPTfr}~uk`e}pn~ebp{qehd~d~}s]eeJFXkrl^TMJSbsr[i{vvhrv]QPSRSUWX[opmx|i`iyhiyudqmLPmyjN93./447?Nav}lhqɾ}|xb`k|skkwpmtskcdxf[l}wz~l]W[ny|uh[OF>>EO]no`dvf^]agjjgba\]gr}iiy~oc_`pohq{cM=::9@CBA@AEP_qxihr~xpnkq}phgo}qjiflsuvwww{p`RF>82//4;@Papyjceq{uz}||tooqx}tqtrrrrqt{{tpmkjnt|xfZTSUV[^\`ccdc_YUTRPRUVcnzvnnllmoru}{wwy|nd^]`cktw}wrokbcb`___\WQLIJIFHFCHNV_k{ſ{sqsxzvojihnssy~~woiebbb^`aadhloponpuxx}|xyz|~vkfa]]^^^aelt~ɿzqigiefggijiea___digkmklnqturnmnnloojklnpu|~vld`abdnpqsroid`][[]cot{zvsqojc][[Y]a`chlqx|qg_XWSNMIECC@>>=<=CEGNPRX_hrx{~ztnga[]a`eiknruwyzyxxxsutmheca]WOHC?;@CCHJLOU^gov{ý|zxtpkimmouvvwxwutqmjjfehfdccdggeddggny|{tniea`abcfjiputvx|û|ysttromjgfecbdecknnǿ~j`UE?0/Vjj~}aM^t[XowowyueNZX_hoy}jZYUMjؿmVbg]Zjdjmwhjoi^qx|qcg]TGMtbSRG.-9?Uo^ZZPPlu[Re_N`u{v|~w{ypsuidaz}snlrs|slr}uYWn\84>IKfv{u~WFJMAGWX\clt~ww|hnvrnv}}|sanv`_c`qoX2>ZH3473.EP[fy|`YysVTWWHQUSR^h{vnuriaZ|vàmb[TAFDA;IMbmv}`MIF9>HKLX`gn^ZcmecJ[~kXYZV[vxqkjmjǼn|ja]QXbikrwtsicihgrxno__NU}gKltz]c|`JB?43770:>@:707=FVzxxm[su}˽|pXL>2) $1ZiŮobZOMHA9MJ_WRQZSSJ32TYIOdrjhgjoywvmkgghfgoifWUOSXdf}trjecSV{}zor`]q~{|wymez{ZGC:1'"1;at|iife`bUfnz~~i]cŸzk[_aemy{tuhIGC@:?3FOZjcjlpkoVJId]=8>FN]ag{vxwqshn_U[~æ~eSMA0*#&FQv|{`]VMCB4JIY[XZ\YYU>>Sx|spj^dfdmptȯgihc^aTkk|lei{bhxxuhe[cNIU|}}tzmdWZnfF9<92=DQqu|decZTXMdaoqprpouwfsƻ~ijyrSBLQP\js¨|pTSVMCG9JNU_Z^XWWX80AXYOWovqvpox{}utpzfUf{}rȫƹzcmtdI3:=:CONhdvzldeYLQCMOKRHLEIRdS]vgxtfNS\Y\t|̾ulwsgmlp|{xu|_Mrx}ovvqjiaaheFdxmy~x{}jC]eQO?G\`_mfpvryrammcfhdujsntwUhtXUC?U`lulwkbKRSHITQe\_\\\VU`R@t}rqyqitnwypuotkgijGd~u|xPnv_f\]pm`faeql{}s[dcSPUO_TXZfr{n~qt{ywKdrVXOJgyù|{{v]dkbeqo}tssvyvyyzz~|nnfeYQVY;bt~|t~~ku~roywzyvsicjVD>Hoοzxk]GTUJNTQ[PQRY\_jqq}}ho{pnyyzxsod_k`Gp{gqgfzyzü{w_\{}fhjXU`bomo|i]eXOWXbjjyew|wody|v~vrvRJj`V]Xtyyubbqf`hkvxpu}swkrw{mfa`YQWbFGptrxmĺlzcblabot~yoswxogwu_{seqf^dgmsoyzyzkWfcX]hvy~vmwbAMd]a]k½żs}kZLZLBHOW\U^oyw`mkafmptfaeig\[gTCSpmj_tļrn}sqx|{|xdpcTQRYb_gu}|zclgWZevulzehp]ZahsuosxyshtnXOhxvsrjS]YPTY`hitrwpmlig^TZ_]RCQNA7Mijevø{gUeaVVX^d^]hotsjpp]\`homgpx~~~ny{^WcY]mq}tlpw~sq{}ygepcZWyv_kpkwʼzyVO[KEDKU_g|uoaslb^]bd_ammgWYgXH=]uvtzqn{jehqxulttY_TKMRYYPOco}~{ioyvlvz[RbXZ_gjhckwvsgu{{}gvuqt{ooV[_PSZmvku`WSX]]TSYUTGNUI?Ct}ewt[V\NSU^ab`r~jWf^ZZ]_[UXlvz}yltdvzyd^offchoqjktsvozv}iZkhbk{nlUQWLVcn|~lY`ROPYedYR_`bTTb[Ud}lu_Wf\_^jv~tcR]VLHDMONPfpvsv~vgqzbYN^UNOYhjd`ryxhiniwrc}{aVLa`rnVYXNTVaZPEPRMJE\abw{o_VJWTNVaz{|vkb_fTRP^giektp{wquo}ok___T_drtrkykmr_UNdfv}zhe]o|wn\RP[T]Zafe\]c`ie{~|ufe[_ectlvo]UGH8=@N_aZXjró}ylgsq}~{ttz~os}y}\bvwt~é~{uK8Dds<1YlIC\kiSWVhkf±¶{\YqvP;XwÔswrWR\ciF56]hWYUgnw{sR79Mb}|puvXC9_|dd}{agztypsUJX_VipfG'ElnMAZ|zibsu|QDEnptbat|c^TM?('&@Wms~~yǾƬ~ypnpX973IVpyiqpPJMetus_hy}ytsrwxhD6%2G`wq]Pbdonqsaazffl}muiZ[gTQ_mbPQ<3'2M]eoմkkqmfclYCG_MF>M`l{vwfdRCC_VKILaajemplm}}wt~ymR:<42>Quqwpe`yqpuxsjukXKkwwzzhny\N=;" /16Dfz̺~|zeWMhdRMWkzzvbsh\Zieokic\]fyyî~shdu|~~~t^k]H81,"1;]zyoXptzsk~tdRkkZB60+1)24;@_}vozs|}gavogeq[kgZMW^]]R`fgaowpqm{}ururxmy}nMD`WC.42=Mkxyswy{caaVAA[K/%'-:Pq|~ivsfxkaj^UU\je][pvwkienjuuiYcigogn`OC\KJQeilup|xmwyʻƯkrliiehO9C_M9,.::Tbs~uv~pakfmx}mo_T]o[ABDQJR]qzwgffqrtnrgemgjTL^tntvx|~lsy~yvȬ|}ylabbbeRH84BM8''%;FV[jslhp|t{ʭ{|uhmodZ[QVUbn|||sh`VQXWjqlYYbgiYYMMdyomjl`lvxt||qg]l}{oʲž~~}uirwoeS]SJS[OEIUhdoorxz~~y{}ifbrronx{|vxprkoZEQf]LDBUXo{cgcaksuhgyxsnjpcutov{~tyjd}jluѾ|nffojidiZSWTR84ISDLNPXSURdtsdjwn}z}sĪ|p[auz\US[k||^WOTR_]^_fggjblfnwrxmb[lg_^h|~yvzijfag`dsynww~ֹ´ntnwtjmqxicZOTsrmgl]^fv{qlr~tecuyr__hqxvxzxvurgpzvoX`]OJ][NLXrr~qfsolbf|xnz|~zvkgt|vvwvssqZXtfgvx̼}dg\\^jpdU[lfbRVXMOg|laMMISXQX\ejx{qnypivvn~}}˺}p{}{}yxwxbObvous}}{nktj`cUJT\ha[\lqwe~{_UZ[d^jiYPY\]jcfXRPfyidgxxwosxtrkrs{qpqm{}rxceof^Wgrsnzxlpjruteoytpij^ilzxxb[\Zdjkbb`mia]SJ@e{thonfmwylijtooqutxlztrsnifd`pv|obmodThtog{ük_jdcRUdf]W_`fezwjfulb[ZGDJU`_`X[^fdl|l[ws{|ĽwtlljxzilnpulguxuowripW\c[WP`ekyso{tkabZWFHOJJUbYTQ^eYFHkt{ʿʾ~igm{{qhs|ww}bb]gghrjZXgcntwwe`eoelp||cZ[Q\^a[T[cj]_[_fnhjm]gqrkm~|xjrtxswaZZ\cjlhhappmi^Y\|m{|n]VR`^`^``e}n^kkUGRSPRSQJLJYdqpemtsq˺wgpptles|{swv~{yv~vjqzzftwk[^]eknevshUHB@@CWZSBO]a^Q[ZUgɲ{hvyxtqyljjiceTZa][iuojfxylg}sp|iZV\]OLTilcXbij}{rozvqp_bat}|~xs]Y\S_foj`dovlljpowouf^aedX`fsv|wfakf^VMTC=@HOV]_c\pw{vk}̻}}zvnfbvy}}}y{lcrx|~~z}sp}qqlszulwy\JD:BENIEP[YVXYeao}y¾xx{|q~ql^TLROZklbXjt~upsqsdakxk_KIYZ_WbkklvfdzjZ]cmitqn|{~}m_X_g]XYpxsejvuihsfZegkqj\dprbQ95:2=HWVLQeqors|wqjnxslqz~}xxomsfbert|{zorTSa[KNGE5XUbs{f{wxDZtiN#"-Vǵɰ}Zui^ahjkzywSfP_J>:JXWflY4F4(;&ACFV_ajf~~svӺ̸ֽwF03.[dͿ^QhCOAHTDW@MJTE[LLh\tzqeeXchpQ_`blRWaxpuxwWbuXr^phbpd|ǹwr}~iwlmlXEKNcxܷġ~pi\fhVR?02FCDPhlclfgVq]oYbemhown}|zqox{x{ixiz^dQMZLgz{TbBXTYTJ]]j^s`~|vVlScXBF]\ZZa\EhVSjf­ƭb_{rscgxoqqtu~|}W[KO?Q^ӵnw{bfubUXPSTXzuh[YT^bUe_xfl~u{s}~gZs\LY_UD\kƹԻum7JF-E.L\yu}iz{bxntpbCTSTkW]z{|e{{]kk{ow{ujnv|t`rvoZ|imTdVa:J2D,49Dy}ֽ}~wvl|teSW*Pji}Ul`i_Ui}yqonnQShN\HVNCmw}ȱvhzbDGB2!0!#MbƝyvduh`e?Tb\RSP^Uinr~w_m}yadfyp{g}}gfwpbJNJW6XG9?Dn⵿|lUP\fxtoO@IIhkqvo~}gXdvJ"'3>gntpomM.47;>,B6I>K`i^ǪyaxyqZatlbl}knbcXahutvQqxpY^|t}ivx}tvipa_`^qZGZcnXjjnyrv[X~rvŷ{xZ/9DGNYkw|quyoSHZecZjlnrdicw|s||{x}~^hy[pry];C1;>dz~}ryu~|wzkeT=QUYp|fD[h]bYks~~zRjqfmmfU7\QP]joy|ijvi`MHQJzxgbpzrsw|}e}z{w`Y}xiuwlqnsugUilub]m~l{tyvĻ|kiI4 -.(:F9?c_yǼ~waWubr~rfLM]V]IOfwwru~}zizqszn|mZrxwcWmwrpjYcsbokMQ2@CDjejġ|}zYmZmdWokaVRnp}vҰp|g\NO_Zjlf^Ki|os`nz}uf~{xjaO:M?<%.-@/EHfkǶ}jkitr_inssnrzv`kaYifzxZg{{u}~ifqhO]Khz{u_UfskmopniHas|x|uOkzi{nkpbqmk|rt\na];`mdqdhmQXyym[9bzv{xn{rhczZN[`@N6Ya[gYcc_wdfniY?;GQmvhVR_}i{teIR_yYEEOOho|jrz}pb`WqmfIGJZktwtnkxq~x_VZ~ut|}rlz~|xvlZfzvsmT[byvz\q}obeU63)WYX7EGGPTlw}ľɷks_Taja^=L[_Xc{m|nxsot~qplo~}oplf]m_Vgs~uQpy|kZ^WbfQ4PhpoNiglferqnɪwfc~~}xkup_z|nagOPL=Cd[ghjyvs~||qinwjx~U]B@A=(+3TekNTbjyoqqtcj_Xbllwyt[ss{ah|ryxXvnkskgZYifdwyoybnthXcVptsueffgjoqxuxrienaVZoo~Pab[Q]jpes{xllsv|xdttf|}yaaaqdcg\Nek{fWUVcOQehwƩsiubO]^knmzkzgfqwjlfzxob[TUJOLV[tw]kknvlqr{urseRUgntGQX^K@LSNggy}impVp~{{|~x|crmurqwZYzo|b}z|eprp~|x]BbG03K^b|}sm}^vuXe`tqz{rkmoopy~oypimymtxvezT^]XfW[dgUymvnynkjvwm[cjks~nt}nufjmxxixvyvuwsy}sylsunXiq~tfhd[[hqodkdkg[TSNJQ[mtýʵ~w{~|jqueleyyyfk]e_hoy{xloi||wvvpzregjp_sluZR_HWghiwm}xx{zt}}~vvdtj_ohsxyy~{zhJ^ONRRZQOYUPcMF_ejhvxow}ztq{y|srpu{xyglnxixuutjc[bXXSg_jrhrf}py|u|}{rnol{uhioro~wyzu|omtnzvri]Ta@Ubam_ihmjskek[mmsq{vwwzy{|tx{rvlrutz]mkWWXXfgy~~smukq{vumnrqixlz{ik]\`dqwz|}oomp}v~yuyrfp~~ygslxjuxylynlarn_iXfYuZ]\P[Ikiheoents~}wucuw{{~obx^af]fplw~qtyemry}wsfgnnrXS]Y^]_iX]cWUige}y}}njhdiqzhrmpr~|xx}~fzcxpcr`ZWeI^LPKHKKXY{`nmysxtvnpruzx~ypvs{p{kfxovv~{osphYfcYud]ZXh_cvrnymfljhaloyxz|zx}suup|{{o}idfepuuuq|xmk\^Z_OkWieegkq^fR\TYhmq|ffvekz~}kvuu||{}~r{|r}ruqxxeecbikkylpxshzzvt~r]q\]mklvoni^e\Q]``kwox~~byhlymp|x|u~ytryturrwxpomwcpgol}l{iiw]aNXLea`rfwbac^Lmkww~z{|uwhwfp~gfmrunypwuu{vqqu~z{ct^OYVkhbd`SdZT_bnq{}wx|rzvwu}zlxy}ppegZswu{jhecbTEHEWgcohpwpluux}x}{vxzrz~yy{}~k{~qziciukn|h_maZYcxm~|ifudZcurpoq||yqs}phqrz{xykt]MUbc|aufvihiU^gn^y{ortjhs~f}u{}z}z}{sqzio~~zox}k~z`gg||z|yahmmiklnofkX_fbzq`__p~u~yyw~v~uw_gu}ypmkaizyysovhd\j]hW]se{kc__jvomvgy{{xs{wzyu|xqtbdly}lhpuumk_livh_YSWlUNbduovpnmqyu~~yqm~~sqqwyqmlkgtlgrmqfVS\nWTd]gnt]jyy|sftofx}bsghv|Zdnx{htmnnslmuocchkvnz]`^Veab]syvjsxgg\dfxy~utzxvwqzzpot}zyynbXplVfgnnlj\hksgzo_]e^Wgg|tlxg`[hj}||pzm`oxufv\mn{y~~wlyjswwkwrjxjrjsrct`RVLVUiilpxoSkVHQft{{{xxz~nvubpspitxor{ew|kw{kjbjlRhkqn{kopTZMWYWexnp}\q^^cmq}~qriuu|z~xrpg{hvv|v~p|~x~twejfg`txm|ndUMLAAYb`lnvmra`_aid}vx}wmiys~z{|~uoszfr{}mzsia_X^_[eotomcjRIURlls{ppecm]tt~{zy~tkuusz{st~p{{~mvs~wlScXX`rr{ptpTlQLU_\cmpqiwmX_i_kyv{miyxy}xxolnmjovvqtgudaQTahrw{}o_`XPVhozotmlmc_uvghnzrx}~~~vyw|wz}nimnpm}qrkWaj{rzzgilW_M]Z_jjjktVY_emhsu{y}}}}~zqfshfn}}v~gS\`fxyyqth^_^_ic_kqheiiop}|kwmu}}|}{{wy|v|ytskurtzgddssukhqjQQdeXXdffol]gmnx|ml|wp{}z_ds}ytufk]_jslptlsdhbkpi`bncvvljm}}uz{isprx|v|y|{totzw}|lfhkogoztlke]fesrfcV`qk_iszumzunrptxrtxgjjy|ut}pdnsoiigwt{xqqgkuwdlefkdlev{zs|tbjedl~zxv|qfq{z{{xkmz}xtuigzp]jsuojm]Z_`^liduurnwueir}mvxxj{tsvwvwzuhmvfpsqzqggswrp|mS_^Z`v|~yxsfyn`jw~ggrnv~w||pv}|{neecjhjhkrrjdq`aRT\kvs~orvgdnw~~~|v}zi}~sry|{snluyn{k^hjccp}wxwikh]Wajooy}usynhfairy}zms}p|px}u{xxuxs|r|usxssobh[`chvsw}x^k]UT\rrwwmzp`qmrjyz}~{}}~~tw|s|~xwfoweix}{q{qfj_hrko~yvhudW[^gpnt}omj^ijitwxv|}wzwzz}{}{z|s{ruslov{{}qce]^durzvwofe_YZf[irurprlbvmsyyz}xwuuvvzx~~pjrjouxwtth^`cmrx{vs__h[`jqqpilrhohu~nozwu}{w{w{t{|hskqsyzaweY`jokrv{ivsZeb_`mnyp~ygrwrx||qt}r}}u{~}{qx}v{}vxggmwwzpjcafj{zyrtngbttpijrnpotruxn|uqks|vq}w{zz{z{qeip|ztsnobhklv{uuneenzhquqnzmitu}qmvsn{r~u~wz_inz~~xgrqqx|w{}y|ovvr|xikegtuqlw~t}qumlt}||ut{{wqt}zphyzvnvv~vklpqt||pamvpry|{|xwot{rlz~}wvos{}tvzpqtn|tzt|yz{rjnohov{w{|not|~w}~~x|}~wqpr~rzkj|ypn{q{ufomlwqnos{{{rsxry|xx|{|tzuqv{tvr{v}kmhgnx{lxzpmxyv}urzquv|~}qfnsnwz}yrxffktutxsu~vyzzuzyzux}|kpqmv{ufvp_cm{zy|ouuqwz~v~u{~{ztor|xw|}zsvgfjt{{trtdfiuw|ylr~|y~y}w||yw|{pv{vxyuvrldgq~wvtvniafkqz|{qtl|{{|{}}}}yzv}}|{z|wtznopt~}sxlafhv~~qyperjups|xyyxrt|xtxtys{yu{{~{}}z~uzv|~}xnuknx~z~lreghnwx}~y}oeosjqytzltvmrvru|rz}z}~zwyy~{~wx|~qqimsxxnrojfrru|}~x|niwlmqrvpvqw|{uvntqqt~tyy}wpytvw~xwjnowy}povmqp~}zstwloiq{ulsnrwozvy|szvpzywv}{qw|}~xztv}lqhnq~~{|ntrmlst}s|osuq||xxlqvjqv~~|pynrwzzz|v||xtry~~}yrpwz}}vlm|vxxqys{wuzwxr{sojqtvruyxkltxzotz|zpwwv~}}}snxxv|zttpvwysntsqxxr}xkty}zx}~|quzpyx{|}y~zttop~yy{|~{}uuploz~upuw{{z~}}{w}}}yvyw~ovz~z}yxtsomxvvss|}z|wy~x}z|wz}q{ytxy}yz|ypmv{}y|vz}~~~}{wz|~v}~z{mutuwqopsx}s}yy|}~~w~{}yvspwlx{qqr|v||~{~w~|nv{y}~}sowy~}}v|sx}z|ss}|~{}yzyy{w}~n}yjpr~~vxxutwz}z{zy|}|}{~~}{~}tx|utpx|x}rnu}||zjr}y}y{~y~~y}||wvx{tw|~~|~}{z{~|zvmrty|}rnqqx||{vsnzv~{wx}wvx}}r|}z||xxz~}w{{|}txv{y{|vonu~z|vlypszyxzzox|vtsssxv}~~{p{mqu||uyy{|~|{|s{qwyumqst}}yxkxvut||{tzzqrwq~vzowr||w{vxsuwv~prv}z}~xyysrzr{wporz}uovrvtyt~wy}wzwjwrlpv~x~|wpp{~~~x{~t|r}x{{sry{}||v}qwx~z~trm{}}xxutvz}z~uyqnwpvr{~xxjmrz}}wz}}~~~}y|}tylsv}}|t~wxtx{~z|yzvz~quotw}~|yrvopv}{m|nuu|v|~|{v|{{w|xuwx{qr}y|{{~y|xtkvytzx{zvnkp{}x}xuy{uz}tt}}xy~}s~~{w{|~|p{wv|~us}xnmw~t~uu{|z}{~zxt}~~zuty|v~tuw|~wsrz|~q}~~{|y}}|yy|xytvxwwuwy|xx||}}{v~z}yxuyxzx{|yx~~}x}z}~r|z{wzt{}t~||z~{~|~z|~~}{||tzuvy}|yz~z~~yz}{|u{}}w}y{y~}vq~z~~t|w~}zxru{~yz||z|{|zwy}z}}|ux}}y{}w~uxxw|qu}|~}~|z|wqz~}}~ywry}{z|||}rw{~{szy{~uv~}{y{yx{xzux}y|}yx|qxx~|uz{}|}zzz}vwwyuzyxz||~t{zxvty~{{|~}}p{upvw|x{vv{|v|y|}vuz~{wt{|~|r}y}~wwwvy~}zvxxz~vxv{pvx}vrotv~t~z~|{wzzy~}tvyyxxyyzyz~zy{|qy|qtx~~||wrtx{zw}~wwx{}{u{~}u}{y~zv{~~zy~{xwp|~{zz~|||~vp}uvy{y{xrnrx|||tyz||x}}u~}~xz~~~{|st|~~w|{}{~z~~z}~xxyw{}z|w}rwy~xp~qqxz~~q~|xx||}yzy~z|{{zz}~sx}~|}}xqxw{{sts|}xvvy}{zwv}|~{w~}vvz~|}y}v~xzuztsvy|zwy|~w~{}|w}~{|{{}~xy~y|x}vzvz~r||~z}}z|{~z}y~~|zxz~y~w}}w{{{|~|~|~||z|}|}{}~}}z}}{{x}~{~y~|v{|z~x{}}v|y{}{~{w|xz~|{y~|~w}}||~~{~}xu~}s||}}z{{x~zyw|}z}y|}x||{szw~x~{~~~w{|}tz~z{rz||}zwxwy{|~zy}wwv~zxzyxy{|{}|v}||}xz~ssy~~}}uxyyx~z}z}||wzz~|y}y~{|x|{zuz{~z}v{zvvz{w~swxz{y}{|||}yyv~y~xw~~xzwx~wz|xzzvy|w}|~{{utsz|{v}wqtw}~r|}~|~w}~z{{x}{{}xz|~|{wu|{w}~||zy~~~}||vzxv{~z~~~rvy~xw|ytyy}ux}z{~yz|~|w||w|~yyy}||{~}ws~}~z~}{xr}|vz~{{zutsz{|}z|{z{~}y~y{t{|w}~~{v|{~zz~utz{z~~y|z~y}~||}xwv}~xs~wsw}r}xy{~x~y|zx|zz{{{}}{|y~~u{~~zuz}z}uxz}{y{u|}}|sy~~|z}}{|x|~vwy}~zz|}y|~~z~vzx~~~z}{~~|z|y|}~}y}}|wy|}~z{}zu}|{~v||z~w}{{}y}}}z~}{w{}{|{~{~}~~~{|~~~|}|~~|}y{}{}~~|~x~}~{z}~x~~w}~}|~v|~||}|u~~||}}}~{x~~w{}|~~~~~}|y|{~}~}z{|t~z|z|}~{}z}x}~}wz}~~{|||x{z~}x}~~~y|zy|y}{z{~}}|~x|z|zvy|~~{y{}|{v|}|}~~w~}{zz~||z}~y{xz}}~y~{|z|yzvw{y~{yz||~}~yy||~xz}|yx{~xzzy~}y{|zxy}~x{~|x~{wy~|wwxvy}~|~w{~}~|~zz}zw|u}|}z}yy}}zxyvz~y}~||x|~}|~x~~|{|||wv|~yw~}vx{~tx~{z|{x~{|~yw|xy~zyz}{{~{xv}}{}~zzv}~{y~{~uxx{}y}~~y||~~}zxw|~~v|~|z|y~{z}zxvvw}||{~z~{y~y~}~~~~{|x|{uyxw}~w|}z||z~~yy{u~z{}~{|z}~ywzz|y|~~}~}~u|~~~yx}{wxz}ty~~y{|zw~}~~zwy}}}~~~yx~~|}x~|~xz}|~{~|z{y~}zywzy}}~}|}{}~w~~~~y}{x{|~~w~~|~{}}u~{}~|z~~}yzy~z|z{|z}{~{||z|{|}zx~~~}}u}~}~~u~}{zzz~x}}}~z|{{}z}~|~{~v~}}}|z~||w}~x{~|{v{~w~{|~~{}|z|{~~~x|~}|~}y~~~|{z}|~|}|~{y}z}~~}|w~~~y~{{}}|||}z~y{z}|~xz{x{|}}z~{}zzw}|z{}z{y{{{|{{}{x~~}|xz|y~~~}~~z{{z~zzxy{{~{~y~~}|||z{y~v}}}}~{yz|{wzxy}}y}~{z~|}|~y{~~~}|x{|x}{y||wx||{|{~~|y{vzz}}||z|}y||}~~~zw{{}}~}}w~~}|}~yyx|}~z}{{~}||xx~~yz~|~|{z{{|zzywx}}}{~{~~zzx~~~{}~~|}{~|{{zy{{|{z}}}}}}|z}w}}|}}|~||}ywzz|~z~}}|}~}y}~}z}}x|{~~wz}||z{w|~~}zz~|{~~~~{y~}}}x{{z~}{}}~|{}{{~zy~z}}~}~z~}{|{}|}~z{~}{x}{~}|~x~{}|z}~}{~}~y~|}}z|~{~{{~}~~~{}x~~|~w|~~x~~}{~w}~{~}}~y}z|{~{{~{|z}~~{|~{v}{|}}v}y}}||~y~|}|z~z{~~|~~y}~|}~z{|{{z|~~~|z~}y|{{}|{||~~z{z{~~~~~{|~zz~{z}~~}}|{{w~~{y}}}~yz{}y{}{|~z{~|}x{|x~}~}{||}}wz{y|}~|~z}|z}zy|}y|~~~{~zy|yx}yy{~~~w}~|y{z{|y|}~~|~}{z~~zz}|{{}}xz}{z|~}}y}|w|{}~{|{{|}~~xz~{|~~~}zy|y|~}~|}~y~|~~~y~{x{~{|}{}~z}xw~}z|~|{}{y}z|y||xy|~{|}}}z{w}{y~}}{~z}|}~x{{z|}{|~~}|{~|z}}x|}}~~|~||~ww}y{~~~y~}|z|{}}z}~~~{|{y}}}~}x{~~}}z|w~~}}}||~zz}~~{{{}~}}y~{~}{}}{}}{{}|~~{~{z}|~~}~z|~~{zz~~}{|~{v~{}|~}~~}y~|~}{~|y~}}~}}y~}~|}~{|~~|~|}{~}~}~}w}~}x}~~~~}x~~~}}~x~}~}z~~}{~{~|~}|~~|{z~}}}|~{w}~}}}}y}{~~|~z~{y}}}~~}z~}~}{y~~{}}{~}~|~z}~{}||~}~}z{||}}~}|~}}{|}|{~}|z~|y~~{{~}~}y|}}}{~~~~}~|{}~y}~~~~~|~yy~{|~~|~~}z~{y|}z~}~}~~}z|zz{{|}}y~~}~}{}zz{z~|~}{~||}~x{~|}}~~}z}~|z|~}}{~}y~~|}z||{}~~~yz{|}~}~y|~~z{|||~}{|~}{}}{{~{}}|{yy~}{~}{||z||~~|z}}|{|~}z~~~~~|~|y}|x~~~}{|}~}}w{|z|~|~~~|{~|z~~z}~~~~}~~{~xx{{~~~z~~~z}z||z~~~}}}~~y{~~~}z}~}}}|}y~~|~}}~yz}~~z}||~}}~~{~|}~|}|{}z{}}~}}~{~||~{}~{{}}|yy}}~~}||{w~|~|}|~|x}~}{~~|w}|}}}~y~}}|~}}{}}}|z~|~|}w}~}~x~}}~}w}~~~~w~}~}}~~z~~|~~|}|}{}~}}{y}~}~}~{w~~~|~}~zy}}~~}z~}yx~|}}~}{~~}~{y~}{}}|}|~{~{}}}{|~~|{z}|}~|}~{~|z~~~z}}}{}z}~||~~}x|~|~{}~~}|{z~~z}~~}~~|}~yz||~}|~|~~{|y||z}|~~~||~}y{}||~||{~~|||~}{z|y}~~|{~}}}}xz|}~~~~{~}{{~|||~{~~~~{|}{}~yz}|}}|y|~}{{}{{~|{}}~~||~||}|z}~}~~|zz~|{~}{|}{~|~{z~}||}~}y}~~~~}|~{{~}y}~}}}|}~~}x{~{|~|~~~|{{z~~{~~}}~~|}}yz}|~}||~~~~|~{{|z~~|}~~~}xz~~~}|~|}~}|~z~|}}yy~~}z}}|~||}|~}~}}{|}~|{~}~~}}~{}{~{|~}}||~~zz}}}}|}}~{z}~}}|~{y}~}~}x}}~}~~~z~}~~|}~}z~}~|{{~}}~}z~~~~|y~~~~~}w~~x~~~~~~}}z~}~}|}}z~}~|z~}~}~~|y}}~|~~zy}~~~|~~zx~|~|}~|~~~{z}~|}~}}|~|}}~~~z|}~}|~{~~|}{|z~~z|~}||~z|~~}}}}y|}}~{}~{{z}{}~}}~~}}}y|~}~}{}~~|}z||z~}|}~}~|x{}}}~}|}}{|~|{|}z~~}~~|{~~}~~~}xz}|~~~}~~{~{{|{|}{~~}}|}||}y{}}~{~z|~|{|~{z~|{~}~~}{{}}}|y|~~~~~|{{|z}~~}||~|}}{y~~|}~~}z|~~~||~z{}z}}|||~~~~|x|||~~}{}~}{{y~|{~}|{~~~}{x{~}}}{}~}||}{|}z~~~~||~~|xz~~~}}~||}|}~{~}~}~~yy~|~{}}||{}{~|}~~}z{}~||~|}~|}{|z~z{}}|||~~}~z{|}}~{}~~~~zz|~~}~|~~zx}~}~~~~|x~}~}}~|y~~~}~|}}y~}~|z~{~}~~|z}}~~~~{y~~~}x~~~}y~~}~~|y~~||}z~}}~|{}}}~~~{z|}~~}~~zy~~~~}~~{y~~}}}}|~~zz~}}~~~~|||}~z{~~}~|}~}}}|z}~~{|~}|}|}}}~~}z|~~}|~~||{}|~~||~~~|z}~~}{~~}}{}}{~|}~~|x|~~}|~~|||{}~{~~}}|~}~}y{~}~}|}|~~||}{|}|~~}||~~}~~|z|~}~~|}|}~}|}~|{~}|~~}{|~~~~|y|~}}|}}{}}}|}~}~~~|z~}}~}{}~~}|{{}|~~||}~~~~~}|z}~}~~|{~~~}||{~|{~||~~~~~{y}~~~}{~||}|}~{~~~~}}}y{~~~}}}||}|}~|~}}~~}z{~}}|~~}}}|~|}|}}z{~~}~~|}~}~}|{~{{}}}}}~}~~~{|~|}}~|}~~}~~z{|}~~}~~zy~}}~~{y}~~}}}~{y~~~~|}}z~~}~}|}{~~~~~~|{}|~{y~}~~~|y~~~~|y~~~~~|x~}}|}z~~}~~||||}~~~~zz||~~~~zy}~}}~~zy~}~~}}|~}~yz~}~}}~}|||~zz}~}~|}}}~}|{}~z|~|||~|}}|}~~~|z}~|z}~|}{}{~~}|~~{y}}{~~}|}|~~{~~~}|}|x{~~~||~~|||{}}|~||}~~~|y|}~}{|}~}||}{|}|~~~}|{~~~~~{y|~~~~|}}~}{}}||~~|~~~~}{|~~~~~|y|~~~}||}}{}}||~~}~~}{{~~}~~|z}~~}{{|}|~~|{|~~~~}{z~}~~~{z~~}}||{~}{~~||~~~~{x}~~~~}{~~||||~~|~~}}}}~|y{~~|}~~}|}{}}|}|}~|y|}}}~}}~}|~|}{}}y{~}~}|}~}}}~|{~~{|}~}}}~~}~~|{}~{}~~}|~~}~}z{|}}}}~~{z}~}~~~~{z}~~}}~{y~}~}}|z~~~~~~}}|{~~~{{}|~~|z~~~|z}~~~|y~~~~~}y~~}}|{~~~~~~|}|{~~~~{{}|~~~~{z}~~}~~~~~z{}~~~}~}~zz~}~}}~~}}}~~{{}~}}}}}~~}|~}{|}~}}~}~~|}~~{{~}z}~}}}~|~~}}~|z}}{}~}|}|~|~~}}~~|z|~~||~}|}{}}|~}|}~~{z}~~~~||~~}|}}||}|~~~}||~~~~~{y|~~}|}}}|}}||~}~~}}{|~~~~|z|~~~}|~|~}|}}||~~~~~}|{|~~~{z}~~~}|~||}|~~}|}~~~~~}zz~~~~~|z}~}|}}|}{~~}||~~~~}{y}~~~||~~||||~~|}||~}{z|~~~||~}}~|}}|}|}~{y|~}}~~|}~}}}~}|}}z{~}~}}}~}}~~}||~}z|}~}}~}~~}~~~|{~~z|}~~}~~~}z{|}}~}~~~~z{~|~~~~}~~~zz}~~~~~~{y~~~~~}~|z~~~~~|}|z~{{}{~~~|z}}~{z}~~{y~~~~~|y~~~~~~}~|z~~~~|||{~{{||~~~~~~{{|}~~~~~~~zz}~~~~}~}~~zz~}~}}~~~}}~}z{}}~~~}}~}||~}z|}~~~~|~~}~~~{{~}{|}}}}~|~~}}~|z}~}|}}|}|~}}}}}{z}~||~}}}|~}|~}|}~~{y}~~~||}|}}|}~|~~}||~~~~|z|~}|}~~|}}|}~~~}||}~~}|z}~~}|~}~}|~~||~~~}|{|~~~{z}~~}|~}}}|~~}|}~~~~}{{~~~|{}~||}}~|~~}|}~~}{z~~~}||~~}|}|}}}||~}{z}~||~}}~}~~}~}|}~|z|~}}~}}~}~}~~}}}~|z|~|~~~}}}}~~~}|}|z|}~~~~}~~}~~~|{~~{|~}~~}~~~}{|~|}}}~~~}{|~|}~~~~~~{{}~~~~~~{z}~~~~~~{{~~~|}|{~~||}|~~|{}}{z}}~|z~~~|z~~~}~|z~~~|}|{~~~~||||~~~~~{{|}~~~~~~zz}~~~~~~~~z{~}~}~~~~}~}z{}}~~~}~}||}z|~}~~}~~}~~~|{~}{|}}}~~}~}}~~}|{}~|{}}|}}~}~|}}{z}~|{~~}}~}~~|~}|}}{y}~}||~|}}|~~}~}}||~~~}{z}~}|}~~|}}|}~~~}||}~~~}{z}~~~}|}~}|~~||~~~~~}|{|~~~}{z}~~}|~}~}|~}}|}~~}|{{~~}|{}~||}}}|~~||}~}|{z~~~~}{{~~~}|}|}|~}||~~~}{z}~~||~~|}}}~~}~~}|}~~{z|}|}~}}~|}~}~}|}~~|z|~|}~~}~}}~~}|}~|z|~}~~~}~~}~~~|{~}{|~}~~~}~~}~~|{}}{}}~~~}|z|~|}~~~~~~z{~}~~~~~~{{~}~~~}~{z~~~|}|{~~~~||||~~~~||}|~{{}}~|z}~~|z~~~}~|z~~~~}}|{~~~~||||~~~~{|||~~~~~{{~}~~~~~}{|}}~~~~}}~|{|}}~~~~}|}~|{|~}~~~~~~}||~}||}}}~~~}~~}||~}||~~~}~~~~~}}~~}{|~~}||~~}~~~}}~~~}||~~}|}~~}~~~~}}}~~}|||~~}|}~~~~~~}|}~~~|{|~~~}}~~~~~~~}}|}~}}||~~}}~~~~~~~}}}}}||}~~}}~~}~~}||}~~}|}~~~~~}~~}}|}~}}}~~~~~}~~~~}}|}~~}}}~~~}}~~~}|}~~}}~~}}~~}|}~~}~~~~}}}~}}}~~}~~~~}}}~}}~~~~~~~~}}~~}}~~~~~~~}}~~}}~~~~~}}~~}~~}~~}}}~~~~~}~~}}}~~~~~}}~}}}~~~}}~~}}~~~~~}}~}~~~~~~~}}~~}~~~~~}}~~~~~~~~~}}~~~~~~~~~}}~~~~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m33.bin b/applications/PoP/poc/res/music/m33.bin deleted file mode 100644 index 5c9c638..0000000 --- a/applications/PoP/poc/res/music/m33.bin +++ /dev/null @@ -1 +0,0 @@ -{yw}yzy~}}{}~y~y}v~w{y}|{{}~z{xy{zy}}y{w~yw{y|{}y~y{|~}ywyz||z~}y|{|yy|y~~x}y{{yw~yzz~||{}|y}y|v~w{y~|z|}z{xz{{z~~z}yzx}z~|}{~z|{|xw}xy|}zx}{vzxzvwyx{|~v|xz|zy{}|~~}{||~|~}zyvywwvz{zzu}~w|zrxszyqw|tzv|wwy}{x~{|~{|}~||{|vt||tvv|yv{~su}vw}y}qrspyroy}vr|yuzrz~~}v~w{{~|}{}{~wsu~vtuyvz{s|wov}yryyzxlsnqulpzxrt|uvur{{}wx~|wy~|}}y|srxzrut}|s}us{qpy{us{xzpmqjspkuyvrx{rurtzyzs||yy|z~~~z~yvrtzvsuvuw|ovwnuzytwzxvmplltlpwxus|wqvquyzwv~}x}x{}}}v{|rtuxvut{{t}toyrqvxzszyvsnnipqnrv{tv}qtwnxxzxy}}y}y}~|t|p||qwour|zwxulrzuxl~wk~z{pmghxnvyzsqqt{prrs|vtz}zw~z~}|vxquvqrvtvzurjxxyqqnt~x{lmdqvpxz{ox|m{vnsrv{xt~z~u{xxz}svuvoxsz~s|romzwxk{}j{x{vijdvrrv|vn}sp}norq{vxx|z}z}~z}tyxnzytqovp|vtvrkt{zvpvqypnim{ty}uwq{|ptsu~vu{z}w|~}||~{zvyyrxwwv}uqlywxmtktyvwfi`orosxwjwvjypkons}vw|t|zz|w~}ptwmsxoqismvyr|ztmq|w{pqwpom~x}|v{xwuwv|yyz}yxyz}~~v{{x}{yt{v}}}wkwvstl}po{vtgg`hpjurukozmptmklmrwq~rz|{{}tnynnwjqnjmout{uyrk}uxx{vyrrk|x{y}}~|uwy{~|}y~}z~uzv||vszzyu~ztw~zwrr|pqqxsn~{yfibcqeqzplmurtnrrjmposx|rx}|}|}z{~owvjymjsohoto}yp|o}zovs~myqpwt{y{tr{uzu|~z{pixqpz{}~{~yuwwhz||xvw~uuiuvrzgcp_pei|wtjostwpziewnmyrmu}xz{~}~}t~t~rvhts`vxhhqntqqqr|yux{{ktpvzt~|xmyzx}}o}q{xw}}vjuxq~}{qs~pwowmzvstnumws\gckpgsyptrruprqilojykr|~r~zu{qt{pvyfjxmiwim~t{oqwt}y{xniniw}~|x~vt|q{yzuvz|~omzvy{|vxozwy~wwupuwwrryw`cYimnynrmp{uohxpgqfhp|~o}zz{|}wy||yn|isltnoqs|ny{}|srx~|llns~~y~}p{vrysuoxz{tzwz{ux||y}|yt|ws{~zzxuuxptwztjikbspwwue|xkuhjefmceu{wuxo|{vz{}y{xxpol^trprhifwzrzrz}vxuz{u~{xymnvuwrtmp~{~ww|lt|z}uxy|ks{z}qyetwuqttwyv}ywuctlo{|yot|w|xiebjvgy{o{{||zt||tv}|mrqp~tqnpurwlrvx}ynkn}}|sz~zukizzy~w}zx}ulq}|~~{wyvss~{z~x{v~wtwxwoy{rmceiwqrv|zrtpkvtph_cqks}qt|yyzxx|wt~~ossq{xnsmutuop{{u}|ysjnxy~}wu|znjtyvw}~u}~ypnw|}}yzyquz}z}yuzx~z{x}||}wwvnhajuvn{z{|suppxso`djjnutmzzw}|{vzz}sxu~zstxo|zontnvzkrwx|w{~tngv~{y}yw{viwst}}|xywyyrrqszyx{mpy{z}~{|st}ut{~t~y{qidatunqw{}qvsqxtjcpcjqmos}u~|t{tr{u|{xq}sxqmpum~sj{tx~wz~xpil~yw|yx~yor{l{|xzu{z|}ypumxz~u~ohuyw}|srxzxx|~~{wz{|jfanzqr~wxtzrvypeojbrklqyxwxwv||myvvtv{ytunnvnw{hwys~wy}qmiz|v}~v}{ro|ou~vz}y|y{{}rtpr}zq{i|~wu}wrlxtzzlysrr|~~{}rm`~~{zytnqp_mtrohn|x~t}~pr~x}~}}~uwziotpyprtzujvw{|suvke|vu~yuouytzyxz|xwmmvm{~{{~sroqvx{zvtvyx}|~z{{zw|z||o|~wblhozvzvuuslivsywm{yy}mv}yys}|irspufmxppjhrrnwqy|jpzstxsyrr}xn{{xt|y{}vpisqwvhtry~~}z{{~wx~~|xw|yq}{uockz~{z{vzyomipqpv{slxyrtouwtw~}{|w{xustvwjrokpgp|vtk}xurusxys}~{psz~w|}{~rngp|u}zkz~vwu{}trpy~s{uzzx~|xnuyw~}y~o{ukh^jxossluqw}mz|~z~rurmyu~ms|v{t{~vvjq|r{yty~}ueq{{y{z{t{w{{~z{~{lh^r|}~|xuuyvzu|rtuqyty}|xoxv|y~zz|wgu~yqilhlrq|qiwx~xot~{q{vo~yu|wzwnpwz}~|}thnt{uw|||nptomzruprvvvzz{lrdisxywpopsho|xymsrxszw~s}x{y|}wzqo}~}onqiqk{yfnq~~vktw|yytxn|xs{}{{~urry|vqqwzmwu|s}jfm~|swow|z{zz}}}w~ieevyszzzorprtu}~{onzsqyv~r{x}{uzkliz~}{qjjiwqplo{su~{q{{t}{uyvz}nmt||x}{|r{tzz~wtrw}pxyyllpzv}yqvwz}~}|~{qkpklwzxosnos|}{xwwpjo}u|||zyxpixryoirsgorxukswtvxz}|ts|qqo}|qx{{~z~uvq~vywuutuwv}szhm|~z}xzux{~~~yz{{{|wchn{y{zu|tnzvz~{hpmz}xz}~vx~ztpswxpwniksulpu~{xwsywt|}w~xutwznxvwt{}pqx|w}pq|rzuzijn{y}wxxu|}zxvigkzvy|}|}vy}unpu~|~}vkv{ny}|z|z|}{ntr~w}whmmxxqwqyyr~ysypw|}~yysxwqmw}}}zu~rvp|x}{pwtzxy}w}qpr|{}zyowz|u|t{z|xropqos{|v}rinr~~x|{zzsuqn{v{x{z{zwsw}ztmopwqp}{mmvw|}ooux~}w{{xyop{z{{uusvy{wvuwzqyzu||wqm|}squ~y{x}}|{v{xuefttzxiqqwwz~|vyxtip}v~{z~s}}}z}s{yvrspk{|~knoy{souuzx{t{~qo{wyr}}|{{{sy{}|wwpqvyyyhitzzpvt}y}{w|}}z{vxdgjuuyvpmt{pm}wysvkuv{z}w||||su}{zwkmvtwtnrp~z|rvtozv{{twwxlww~xxswz|ssunuwzz|spiru~{sz}tx~~vvz}~xvyzsmhinw{zuwxoqpzzzuyu|{xwos{{zyt{}prt{ytvzzpmx}}|}{nvpovvxuzxsopxv}{x~yv{sqrsxvsyrohuzwws~~~ut{{wvztleox{}{~vwvnuoxypvzmqnsy~z}~ss{~}y~{zsrrtzxxxty~}}}|{oonrxw{x~}}{{urom|~tw}z{x}xxtvyopw|}nuo}vywq~|zu|}w{zxy}rqktx~{~uzpjvu||{sxvzujqmz~wx~yxrt~tsppsx}zwwzsomvrlv{~tzxwsruw{}ty}wz~yxqpur~vxysruzvtwz|~~syzyw~}{zqmp~yz~xvrprwwy}|}xsvzxjpwx{z{z{lprumrovz}{u||}wsrumnpz|{|qt{u{wty~|~z|w~{}ust~wsvz{ss}|txxt||uu}|z|wyz{pqutvwrzsptu}zzsqv}upvw|y~~}~unuy~}|xsppx|tor|}wynlpr{vyzvuvwy}{vv}~y{}||{w}zyxy|qq|~yxsr|zxwxx{zv{z~uuz{vujkvy{vtwrtqz~{wux|~z~wwry|~y{|tvs{||ypsyzqop}|{pmsstpwytwv{z|u~{x}z}~xvu|~~}yvpu~|x|knwzyzsx|~zwt|zssvztgip~}zxsqsnr}|{ynwzswwzw}zwtx~}uzwy~~|vtyyy~|wvnsmnz}|qu}z{urz|{~~{}vvxz~qv{ywv|qmpwtsv~znx{zwuu|{nkmxzxuoqqsn|~ztlow~tuwt{}~|}}{uyw|yyx|y}xpvw}}|ypiqu}{wzzy}|wmq{{zzwwz{~y{|woxx|wsuu{vtrvyz{y}}yttvrqkvz~~xorrrrr~~{rnptx~pkry|x~{|yvr~y{tt|wst~}xwpovxtqsz}z{~xttsz{~y{~|xt{xtsqzu}zqpu{ttuuwtz{zz}z|zpkm{y~{ttvonqww~}soqx{wjpyy~{{~}|ntzsrrz~zts~|}u{wxxwsqnpwy|ztzy}ytuz|w}yz{{}~zrvtr}zspqx|wuns~~xr{{{}}{~{~smlp|}~{zytmnv{z|{~ystvw{~xpuxz~|zuu{{}rryx~zwvwz~xxz}~zsqmoou||voy||tqwz~yz|~xw~|xvuzuz|~xpmxsrrv|wtx{{sv{ylkrx~}~}|rurtwrv~~~~~utuw{rsu{|uz|~svw|{ywx{zyuw||{|ywomqotw{~vtv{~xvpv}utz{vz}|{wz{w{}vrqv}uvztx~~wu~zsqzuplq{~~~{uyynqt|~zzzvtyxv|ymuv{yvy~wpry}ywwx}xt{{}ywzurpoptvy}yw{x~|zzqvz}{xy~{}x}||{}{zy}zxqt{}xxnuxxz|ttstnqv~{|~}}yrotwyzxz~~vwotzyrrt|~{xwwsty~zuuz|}srw~~xx{wwtktuuyzwuz}xvsx|~|x{z~{x}|}|x~yw~wtu{~zrrw~~v||ywwz}~|tqnvz|~{qrxzvoy{z~z~rnpyypqw}{ty|}wvvx~zwyw|xpq|{~||zvtstuuyxyzsu}xxwu{}~~{~y|uu{}}}suzzxpryuvyy{{~~yz~vs~smms}y}~yzwyumnz~y}xqqs|}yrrw}}}vv{sx}xuxzztqu}}xx|{tuvusqw~wvy~~x{tt{|}|}}|vvv{}~|wrt}}ypnx{y{sox~|wx|yt|xlmpx|y{zqopnt{}vwvtzxstvz{{w||xz~|wvz|xrqx}zv{}}ytvonqw}vxyzyos|~}y{|x{u{wuvyy}z|uppw|troqz~vszz}vyvmmov{}}wupoqpx~xutuz~}tqqwxt|}u{~}wy{w|ups~{xy||yonnsvz}}zwxvspu|zyw}|{}y|zxz|zw{z~uolxzosos~zyy~{~wyvkjr||}ztvpqut|~{tutu}ukpt{}{yu}z~{vvy}xtsy}zvwy|{z}zvpptruvy~}zz||xvuou|~|{||}~~z|ytyy~tonx|tsts|~}z}~zxumlt{zy~}|wxurvuyz{|xsww{wmrqt}{||z|xpszxqsuz|~~{rs~{~~~~}wuustsqvy~|sw|{xppw{~{}xxztz{|wrtv{~}uvuu}}v|~{}}wqqovz~}{}yzvtvx{}yyvvvx}xnnrywx}srz~{usvtx{qqy~zz{srpquu}wtv{|utrv~|xx|{x|}xyyvx||xrmv|wxwy|wy|v{vmis~|~~~zywwvox{}~vxy}zonty{stxxzz}ztsrw{wux~}uorsruyzwuy}vwvsvz{zx}}~wv{}}zxyu||}rnu~zyywz{~|wy{tw{nmqz~xz}~~|wwsnq}~{yuzvprsv{ywsx}vwz~xssvy{|{wsw~~|zvqspsw{}vuy~zwtnv{|}|}~wwy}wyyw{{y}yvtw|z~yxrt||vy~{yv{urstvv{|vpqqs~|wury|rpnu{yvtzuw{zvuuuy~|pnuz~}{{rqsrxy{ytz|trsw~}~|~z{||}~~zy|vtxx||wpry~wsrs}zy~{wz}tmktxz||trrvsu}}ztvv|wlpu|~~{xx|~xww{}|vrqwzsnqy~~{yrttsuu{}{y{{wwyvuyz}yz~{yxrsyx{vomt|~{suwv||z|}|zx{wmjnvx|~xxxtuqu~}~yvxuyzruuu{|~}||xtw{yqsvz}|ywtpt}~|zuvsnqv|~vv}~{vppx{~|y{~~yrustxu}}poox{wxvu|yuz}~|{~qmlrz|~}{vrtrx~yuvx{qqot|}|~~vuz}|vvwuwyzywtsz}}zsomovw||xwytoov|~~}y{}{wsuvoux}upqvyxusx|xuz~ywwoorz}~~~{urrsv~ywz{}{olos|yxxv{z}{tsqsyz{zvuy~upppprx~~~{||usqpx~}|}~{{zxwutsqx|{wssyvvus{}{xwy}~|y|xrqt{~}{zururx~{{{w{umopw~zuzyttzupprvz}}{wv|zwrqqmqw~{wyxutqv}}~}|~yyurttvzv{xuv|zvwuw~~~}zuv~}~~}wtsx~y{~~{vuutu}~{~{wv}yqnqw|zx{wqtx}vpprs|}~yvtyz{vpqoqvy}xux|vtvu{~~}{{{}yxtvvrtx{zvx|}yvwv{~}|xvz|x~wtsvxy~~zvuwtrz{}}xz|xpsuz|}{|zttux{{vrqrx~~}wps|}zvprrrtv~}xw{|xxxw|~xwx|}yyuusnv}}zusx}ywyxy{|~}}{wx{wwxrnsz||xwtpnx}|}}|||vtvy~}yx}wsuw}}zstvw~}zurt|}{xtsrnqx|xy}yzvwz{{wvyz}{{vqstu|yxzrpv~yzvsv{}~}}xsy|{x|zpoqz}{{uqpos{|}}xw|}vuuv{~}|y}{urvz}}{vvwy}yxxvvv|~||ztpnqw|}|}~{xqt{}yywxy}zvstxvsvuyustzxvrqx|}~~ywx~~}~y~xrrsyz{~xrpqqrz|}xwx}vqps}}}z|{vtww}}wxuswx{{wtu}}wqrstvx{~}wtrx~}|yux{|wxxuuqovv|~xvuy~{rtrtxz}}}}|z||~|ytrsyz|~xvrqqov~~yyz{yppsy}~z|}uqty~{usqu|||xttxzyvuuqpsy~~}wwvu{~zzwy|{~{{ysqqotx{{vrv||tutpv|~~|~{wwz}tqrw{|}yysoqrw}{||{}}{sttw|~~}~|~~{rpv|xrqsw|{ywttx{}ztrmouz{{}zzwty~{|{yxy|xuoqrpwy}ytsv}|ussry~|}}|wty|zsqry{}~zwsrussz|~~|utsv~~|}~~xtuxz|usvuxyyzwttz|tqoorx|{yxtv|~}{uwz~vtqqrru{|xttzxsvuvyy}~{wuw||wsrv|~|xvtspozvrru|}yw}yvtu{}~zvustyyyyvtx{vprpqx}~}ywvuy~~}xvy|}~~xuuqsvtz~}}wuw}~wvvrtz~|||{xuz{}~ussy|z{}}ztqqqu~~}|tssv}{yvz|uqsv~~|tsruzxxywuu{{zwsrruzyxwuzzzz{zx{}yvvtvwuy|y~}yvx{}xttqw}|z|~|yy|~xutuxw{~yrquttyz||~wtsv|zzxw~ysqsv||usttxzy{wrqw}|zuvvuz}}~}wxvx}|xvvy~|wywvxutwx||xtvy~{rtvvz{z|{|}~{|~wrptxy|yxvvuory|~~}vtty~}{}zzwz}|wsruz~zustuzzxvqosz}}}xywvx{|yzwx|z{xuvxz~z{xvurrx{~ztpuzzuxwsvy{}|~}|}~|sopvxx{}|wrqnrz}wuuvyzz~zzy{~ytsw|ztttuyxtrqpszzzvsv|~{zutyz|xxvxy}{{ursru{{~}tqqwz~|vvrqwz|zy|~upprvxz}xqpqpw~~wtpsyz|~|{}y{~yuvzxuuutusssppv}wuru||wrqw{{}zzxy{}{xuqtvtxy{~vsrsy~~ussqv{|}yy}ysppuy{~{wsqssvuporyyy}{wy}|}xwyzzvtppstsrpqw{vvuw|wusswz|{|z{}~xvvtvvrwyzwrqt{{sttsx}~|{{~yqprxzx|}yxtsuuzyqppsxz|}yyy~|}xuvywqoortrssrsw~}xxxvx|}zvvssy|}}|}}}~{wyvttrtyy~{ussx{~~wtvvw}}}~{{~}tsrtww||ywvwww|uqpqx|{~|z|||~~~~wsuy~wppopsrtuspr{}yxuuz||~wutsx}|}|{y||zwssurvz{zvssv{~vvyx{~}{y{|urorx{||yxzww}~{sqptyzy}~}~yxyuuy{|zvqpoptttsppv~~xwuw{~|~}wuvux{z~{xxz~{wwsturw|}{vqqx~zy{yz|{}~{z||~upou{{|}~{xxus{}trrrvyy|zww{xwxx}{|yrpopttqrssvz~yxxuy~}}~zwwtsy|~}zxz{}}wxusutu{yz}ussx|~z|zvx{}~~{z}}wsstxxx|~yuutx|uroqx|}{xyxz|wuvy{{vqqqprqsutrsy~yxww|}}{wurv}~{{{|{|~|wwusvutwuy|wvtvy|zyvuz~~~}{{~zvsquvx}|wtwwy~tpptz{y|zyzz||vtvyz{xrqnnrttsqorzzyyx|yvvvx{z}}{zz{~{wwutvqpuv{}wtqty~|vxwx|~}~~~}}~}yspqvx{}{xxxvzysssuxwx|{{}|~yttw{~~||uooorusqooqw}{zxvy}~}|yywtwy{~zzzz}}yxwsqpnsvw~wrqty~~wyzxz||~~~{z{zrqqvz|~zxxvx}wtqquwx}}|~zutx{~|ztpqqqrpopprx|ytty~}zxurvz|~}zyzz~~ywtooposuw}usru{zzzvy|}}ywy|xsrsy|~~yvwuy}uqorwx{~~yvvy{~~}yyurqooppqrru||wusv{|vusuz|}|zzz|{trpopopvw{zvtuz}xyww{}~~{xwx{}}}vttx~~~zxxvw~~uqpqvz||{{xvvvz~~~{|ysonnqqqttuy|wvutx}}wuuty~|{{{{|{urroppotww{~ywwy}zxzwy}~|{{zxvy||xww{~}}zxxwy{trqtz}~}|{}zursv{~}|vonnorrtvvvy~|wvuuz~~}xwww|}|{zxxyusropqoruv||zyy|~{yzwy}~~|yz|zxvy}zyxy|{~~zxyxx|~}wtsv{~}|}}~xsqsuy}~|zvpoootuuwvtu{}xwvvx|~~{xzy{}ywuvywrrqpqontw{}zwy{~xzzy{{z{zz{{yxx{|~~zwuy|~}zzyuv|~}xvvx||{~}~}~zurqsuz}~yyvqqqrvvuussw|yywuw|}||z|~}}zvvvwyvstqoonqwxy{wux}~y{zwxxy{zy{|{ywy|}~wuuz~~{xvsu|~{xwwzzz~}}}|zvrprv{}yzwssssvtrrsuy~{yuuy}}xy|~~zxvvuvywsronqqruux}xvv{~~zzvsvxy{zz}}ywx|zwwx|}~}vtutx}~zvtuz{}~}~||}}ytqruw{}~~}{|wtusrsrsuuw{|wwvy}~{xw|~zywuuvyyrqqprrortv~zxxz}yvusvxxz{{|{yxz|}~}yxxz|}{vtvtv|yusv{||~}~}~~|}}}|yvsrstz~|}}~zvtqpsttuuuz~{yzxx{~|zzz}~{yvvwwxwrrsppomrux|ywx|}uvvsuxy||yz{{{yz{}~zwvz}~|zvuutx~~xvvx|{|~}~}~|}~|||zvqpsw}~|xrqpsuttttv{|{yvw|{}{{~~|yxwwvuwvttpnonpvx|zwwz}~yuwttxyzzxz}}zwwz}zxwy|}~{xuvvv{}{yvvy{{~~}~~}~}|}|}}zuqqtwz|}}~ysrrsusrtuuxzxvvz~}{y|{zxvuuxzvrpnnpoty{|ywx{}wvvuvxxy{{||ywvy|zxwz}~{xwvuv{|yvwy{|~~||~~}}~}|zwtstuvy|~~{xuutttssstvz~zxwx{|{z|~|ywvwxywtrpopqswz}}zyz}}ywvvvxy||{zyxwxz~|zy{}~~}ywutw|}ywwy{}}|zz}~~~}}{zywutsux|~|zxvuttttttux}{yyz}}{z{~}yxyyxwvusrqrtuwy{~|zz{~{xvuvx{||zyyyxy||z{|||}~~{xvvwz}|yxy{|}~|{yz{}~}|||{yvsrsvz~}{xuttuuuutux}~|||}}||}}{{zxwvvutuuvvvwxz}|zz{|~{wvvxz{{zzyyz{}~|zzzz{|~}{zxwwy|~}zyz{||{{zyz{}}|}~}zxusstx}}zwuuvvvvtssw|~~}|}~~~|zxwwwwxxwwvvvvwz|zxy{}}zxxxxyzzzz{|}~~{xxyz|}~}zxwwz}}{zzzyzzzzz{}~~~~}~~}{ywutuy|~{yxwwwwvtrrty~~~~}|{|}~|zyxxyzzzyxvvvvxz~|xwxz}~|zyxwxyzz|}~~~~~~zxxyz|~~{xwwz}~{yxxxyzzz{||}~~}}|{yxwwxz|}|zyxwvutsrrty~}}~{zz{}~~{zyyz{|{zywvuvxy{}~zwwxz}}zxwwxz|}~~~}}~|yxxz{}~~|zxwy|}ywwwyz{{{{{|}~}||{zzzyy{}~|zywvutssssv{~}~{zy{|~|{{{|}}|{ywvvwxyz{~~{ywxz|~{yxxy{}~}}}~~{yyz{|}~}{zyz}}ywwxyz{|{{{|~~}||||}|{zzz{}}{ywuttttttvx}~}{zz{|~~}|}}}}|{zxxxxxxyz}}{yxy{|}zyxz|~~~}}}~}{yyz{|}~}{{|}{yxxyz{{{{{|~~}}}}~~|{zzz{}|zxvuutuuuuvy}}{{{{}~~~~}||{zyyxxxxy{}}|zyyz|}{z{|}~~~}~~~~~|zyz{}~~~~}}~|zyyyzz{{||}}~~~~~~}{zyz{~~|zxvuuuuuuuux}~}|{{|}~~~}||{{{zyxxxyz|~~}{yyy|~}}|}}~~~~~~~~~}{zz{}~~}}~~|zyyyz{|}}||}}~~}{zzz{|~|{ywwvvvvuuvwz~~}|{{|~~}||}||{yxxxyz{|~}zyz{}~}}}}}~~~~~~}{z{|}}~~|}~}{zyz{||||||}~~}|{{{{|}~}|{yxwwvvvvvwxz~~|{|}~~~}}}}|{zyyyyyzz{}~|{z{{}~~}||}~~~~}~~}|{{|}}~~}}~|zzz{{|||||}~~~}}|{z{|~~}}|zyxxwvwwwwwy|~}||}}~~~~}|{{zzyyyyyz{~}|{z{|}~}||}~~~~~~~~|{{|}}~~}~}{{{{{{|||}~~~}|{z{|~~~~~~}|{zywwwwxwwwy{~~}}}}~~}}||{zzyyyyyz{~~|{z{|~~}}}~~~~~~~~~~~|{{|}~~~}|{z{{||}~~}|{{{{}~~~}~~~}|{yyxxxxxwwxz}~}}}~~~~}}}||{zyyxxyz{|}{z{|}~~~}~~~~~~~~~}}~~}{{|~~~~~}{{{{|}~}||{{{|}~~~~~~~~~~}{zzyyxxxwxxz}~~~}}}~~~~}}}||zyyxxyzz|}~}{{|}~}}}~~~~~~~}}}}~~}||~~~~~|{{{|}~~}||{{{|}}~~~~~~~~}||{zzyxxxxyz{~~~~}}}~~~~~}}|{zyyyyyz{|}~}||}~~}}~~~~~~}}|}}~~}~~~~~||{|}~~~}||{{{|}~~~~~~~~~}}|{yyyyyyz{{}~~~~}~~~~}}|{zzyyyyzz{|~~~~}}~~~}}~~~~~}}}}}}~~~~~~~}|}}~~~~~}}|{{{{|}~~~~~~~~}|{zyyyzz{{{|}~~~~}}||{zzyyyzz{|}~}}~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~}}|{z{{|}~~~~~~~~}|{zzzz{{{{{|}~~}|||{zzzzzzz{|}~}}~~~}}~~}}}}}}}~~~~~~~~~~~~}~~~~~}|{{z{|}~~~~~~~~~}}||{{{{{{{{{}~}}}||{{{zzzz{{|}~~}}~~~}}}}}}}}}}}~~~~~~~~~}}~~~}}||{{{|}}~~~~~~~~~}}}||{{{{{{|}~~}}}|||{{zzz{{{|}~~}}~~~}}}}}}}}}}}~~~~~}~~~}~~~~~~}|||{{{|}~~~~~~~~~~~}|||{{{{||}~~}}}}||{{{{{{{||} \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m35.bin b/applications/PoP/poc/res/music/m35.bin deleted file mode 100644 index 40340d0..0000000 --- a/applications/PoP/poc/res/music/m35.bin +++ /dev/null @@ -1 +0,0 @@ -}zyupnlhefcabcbbcdfiknrtv{~{|wsnjgd`_^^_abcfimquyz~|xuqmiea]ZVTQQONMLKKKKLLMNOSUX\agnxs`gkv~}}}~~{z||yvspmkgeca`^^\\]]_`bcehjmpsuwz|~}|{yxwwwwwwwxyz|~wka^ev|snllmoqruwy{}~~}}||{{zzz{{|}~{qiddjuwpjfcb```_____````_____^^^^^^^__``acdfhilnpsux{}wnfa`clx~vojfcba`````````````_____^__^__`aabcefhjlnpruwz|zrjaYSOPU_ky{rjb[VRPNLKKJJJJJIIIIIIIIHHHHHIIIJKLMNPQSUWY\^acfilnqtvy{~xpic_^bju{uqmlkjiiiiijjkkklllmmmnnoopqrstuvxz{}}xuv{~{ywussrqqqqqpppppppoooopppqqrstuwxy{}{slfbacjsztnifda`^]\\[[[ZZZZYYYYYYYYYYZZ[\\]_`aceghjmoqsuwz|~zuohaZSNLMRZdp{~wpib]YVTRPONMMMMMMMMMMMMMNNNOOPQRSTUWXZ\^`bdgilnqsvx{}ztmgb__bhq}zuqpmkjihhgggghhhhiiijjkklmnopqrtuwy{}~xtrsx~zxvutsrrqqqqqpppppqqqqrrstuvwxy{|~}voidaachq{ztolifdb`_^]\\[[[ZZZZZZZZZ[[\\]^_`abdegiklnprtvxz|~{vqke_YTPOPTZcnxxrlgca][XWUTSSRRRRRRRRSSSTTUVVWXY[\]_abdfhjloqsuxz|~{upjea__bgox{xuromljjihhhhhhhhiijjkklmnopqrtuwyz|~}xspoptz~{ywutsrrqqqpppppqqqrrsstuvwxyz|}}wrlgcaachnvzvsoligecba`_^^^]]]]]]]^^^__`abcdefhiklnpqsuwxz|~{wsnic^YURQRV\clu~zuolifc`^\[ZYXXWWWWWWXXXYYZ[\\]^`abdegiklnprtvxz|~zvqlgc`__afmu~~zwtrpnmlkkjjjjjjkkkllmnnopqstuwxz{}|wspmmnqw}}|zywvtsqpomlkjihhgfffefgghiijlnoqsuwy{~zuqmkiilpu}~|zyxwwvvvuttttttsrrrrrrsrrrsstuuvwyz|}~}zwtqmiea]ZWVVX\ahpz~|{zyxwvvvvvuuuuvvvvvvwwxxyyz{|}~{wsqonprv|}{zxwvuttssrqqqppooonnoooooopqqrstuvwxz{|}~|yvrolheca`acfkpw~~{xwutssrrrrrrrrrssssttuvvwxyyz{}~|xuronmmnptx}}yvsqommlkjjiiiiiiiiijjjkllmnopqrstvwxz{}~}yvspnljjkmpsx|}zwtrponmlkkjjjjjjjjkkklmmnnopqrstuvxyz|}~|yvsoljgfffgikosw|}yuroljigfeddccbbbbbbbcccddeefghijklmnpqrtuvxy{|}|zwuromkjiiiknquy~}{ywvtssrrrqqqqrrrssstuuvwxyz{|}~~|yxvvvwx{~}{zyxwwvvuuuuuuuvvvvwwxyyz{||}~}{xvsrpoooprtw{~~{xvusrqponnmmmmlllmmmnnnooppqrsstuvwxyz{|}~}{ywurpmkihgffghjmpswz}}ywtrpomlkjiiihhhhhhhhiijjkkllmnopqrstuvwxyz{|~}|zxvtrpnmmlmnprux{~|{zxwvvuuutttttuuuvvvwxxyyz{|}~}{zxwwwwyz|~}|{{zzyyyyyyyyyzzz{{||}}~~|zxwusrqqqrsuwy||{ywvutsrrqqqppppppqqqqrrrssttuvvwxyyz{|}}~~|{yxvtrpomljiiijklnprux{~~{ywvtsrqpoonnnmmmmmnnnnooppqqrsstuvvwxyz{||}~~|{yxvtsrppooopqsuwy|~}|{zyyxxwwwwwwwxxxxyyzz{{|}}~~|{zyxwwxxz{}~}}||||{{{{{{||||}}}~~}|zywvutsssstuwxz|~|{zyxwvuuuttttssttttttuuuvvwwxxyyzz{||}}~~~}|{zywvtsrponmllllmnoqrtwy{~}{zxwvuttssrrrqqqqqrrrrsssttuuvvwxxyyz{{|}}~~}|{zyxvutsrqqqqqrsuvxz}~}|{{{zzzzzzzzzzz{{{||}}~~~}|{zyxxxxyyz|}~~~}}}}}}}}}}~~~~~|{zyxwvuttttuuvxy{}~}|{zyyxxwwwvvvvvvvwwwwwxxxyyyzz{{|||}}~~~~}|{zyxwvutsrqpoonnnoopqstvxz|~}|{zyxwwvvuuuuuuuuuuuuvvvvwwxxyyyzz{{||}}~~~}|{{zyxwvutssrrrsstuvxy{}~}}||{{zzzzzzzzzzzz{{{{|||}}~~~~~}|{zyxwvuutttttuuvwyz|~~}}||{{{zzzzzzzzzz{{{{|||}}}~~~}|{zyxxwvuutttttuvwxy{}~~}|||{{{{zzzz{{{{{{{|||}}}~~~~}|{{zyxwvvuutttuuvvwyz|}~}}|||{{{{{{{{{{{{||||}}}}~~~~}}|{zyxxwvvuutttuuvwxy{|~~~}}||||{{{{{{{{|||||}}}}~~~~~}|{{zyxwwvvuuuuuuvvwxz{}~~~}}}|||||||||||||||}}}}~~~~~~}||{zyyxwwvvuuuuuvvwxyz|}~~}}}||||||||||||}}}}}~~~~~~}||{zzyxxwvvuuuuuvvwwxy{|~~~~}}}}|||||||||}}}}}}~~~~~~}}|{{zyyxwwvvvuuuuvvwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~}}||{zzyxxwwvvvuuvvvwwxyz|}~~~~}}}}}}}}}}}}}}}~~~~~~~}}}|{{zzyxxwwvvvvvvvvwxyz{|~~~~~}}}}}}}}}}}}~~~~~~~~~~}}||{zzyyxwwwvvvvvvvwwxyz{}~~~~~~}}}}}}}}}~~~~~~~~~~}}||{{zzyxxwwwvvvvvvwwxyz{|}~~~~~~~~}~~~~~~~~~~~~~~}}||{{zzyyxxwwwvvvvvwwwxyz{|~~~~~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvwwwxyyz{}~~~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxxwwwvvvwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxwwwwwwwwwwxyyz{|~~~~~~~~~~~~~~~~~~}}}||{{zzzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~}}}|||{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwxxxyz{{}~~~~~}}}}||{{{zzyyyxxxxwwwwwxxxyyz{|}~~~~~~}}}}|||{{{zzyyyxxxxxwwxxxxyyz{|}~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxyyzz{|}}~~~~~~~~}}}}|||{{{zzzzyyyyxxxxxxyyyzz{{|}~~~~~~~~}}}}||||{{{zzzzyyyyxxxxxyyyyz{{|}~~~~~~~~~}}}}}|||{{{{zzzzyyyyyyyyyyyzzz{||}~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzzz{{|}}~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyzzz{{||}~~~~~~~~~}}}}}||||{{{{{zzzzzyyyyyyyzzz{{||}~~~~~~~~~~}}}}}}||||{{{{{zzzzzzyyyyzzzz{{{|}}~~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{{||}~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{|||}~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzzz{{{{{||}}~~~~~~~~~~~}}}}}}||||||{{{{{{{{{z{{{{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{||||}}}~~~}|zyxuttspppmlonmnnnpsuwxy||z~ysnid]YURPONLMNPSVZ]aeimquwz|~~}|zxuspmjgeb`^]]\[[ZZ[[\\]^`adgimrxotv}{zzzz{}|}vuw{}zvrolieb_\YWURPONNNNOOQSUX[^adgjmqsvy{}yokq~xuuuwyz|~~}|{zyyxwwwwwxyy{}~{qiccitvnieba`^^]^^^^^^^^^^]]]\\\\\\\\\]^_`acdfhkmoruxz}yqicbemyvojfcba___^^^^^^^^^]]]\\\[[[[[\\\]^_`bcegikmprtvy|~zriaXRNOT]jwzqh`ZUPNLKJIHHHHHHHHGGGGGGGGGGGGHHIJKLNPQSUXZ]_cehknqtwy|xqjfehp{zvrqonmmmmmmmnnnnoooooopppqqrstuvwy{}~~yuvz}ywusrqpooonnnnmmmmllllllllmmnnoprsuvxz|~{slea`bir~xrlgdb_][ZYYXXWWWVVVVUUUUUUUUUVVWXXZ[\^`acegjlnpruwy{}|wqjc[UPMNS[eq|xqic^YWURPONNMMMMMMMMMMMMMNNNOPPQRSUVXY[]_adfhknpsvx{}ysmgddfmv}xtspnmkkjjiiijjjjjjkkkllmmnopqrsuvxz|~zvtux}ywusrqppooonnnnnnnnnnnnoopqrstuvxy{}}voida`bgoy~xrmjgda_]\[ZYXXXWWWVVVVVVVWWWXYYZ[\^_abdfhjlnprtvxz|~}xsmga[VRPQU\eoyysmhda^[YWVUTSSSRRRRRRSSSTTUUVWXYZ[]^`bcegjlnpsuwz|~ztnieccejr|}zwtqonlkkjjiiiiiijjjkkllmnopqrsuvxz{}zurqru{}zxvtsrqppoonnnnnnnnooopqqrstuwxy{|~}wrlgc``bfmu~~xtqmjgdba_^]\\[[ZZZZZZZZZ[[\\]^_`abdeghjlnoqsuwy{|~}yupke`[WTSTW]emw{upmjfca_][ZYYXXWWWWWWXXXYZZ[\]^_`bcefhjlmortvxz|~zupkgdbceipx|yvtrponmllkkkkkkkllmmnoopqrsuvxy{|~{uplhghjou}}{ywutrqonlkjihgfeddddcccdeffhijlnoqsvxz|~~yvsrrtw}}{xvuuttuuusokprjlprsssttuuvvwxyz{|}}{wsokfc_]]^`ekry}zxvutsstuvvuqmovsnnprtvxy{|}~~zwutsux|}|{xurnmpsuspmkkklmnoppqqrstuvwwxyzz{{|}}~~}zwsplifdccdfjpv}~|zxusqppruxyyxvutssstuvwxz{|}~zwtqonnorv{|yvtqnljiijlnpqqponmlkkkkllmnopqrstvwxyz|}~~{xtromllmorw||yvsqnlkkkmnpqrrrqpnmmmmmmnnopqrstuvwxyz{|}~|zwtqnkihggikosx~}zvspnkhfddddfgijjjihgfeeeeeeffghijklmnopqrstvwxyz{|}}~}zxuspnlkjjlnquz~|ywusrrrtuwyzzzyyxwvvvvvwwxyzz|}}}{yxwxy{~|zxwwxyz|}}}}|{zyxxwwwxxyyzz{||}~~{ywusrqqqsuy}}zxusqpoopqrtuuutsrqppooooooppqqrrstuuvwxxyz{{|}}~~|{ywurpnljihhijlnrvz~{xvspnlkjjjkmnopppponmllkkkklllmnnopqqrstuvwwxyz{{|}~~~}{zxvtrqponopqtwz~}zywvvvwxy{||}}|{{zyyxxxxyyzz{{|}~~~|{zyyy{|~}|||}~~~}||{{{{{||}}}~~|{ywvutsttuwz}~|ywvttttuvwxyyyxwvuutssrrrrrrsssttuuvvwwxxyzz{{|||}}~~~~~}}|{yxwutrqonmlkklmoqsvz}}zxvtrqpppqrstuuvvuttsrqqqqpqqqqqrrsstuuvvwxxyzz{{|}}~~~}|{zywvutsrqqrrtvx{~~|{zyyzz|}~~}}|{{{{{{{{{|||}~~~}|{zzzz{}~~~~~}}}}}~~~~~}|zyxwvvuvvwy{}~|{yxxwxxyz{{|||{{zyxxwvvvuuuuuuvvvvwwwxxxyyzzz{{{|||}}}}}}}}}}}}||{{zyxwvutsrqpoonnopqsuwz}}{yxvutttuuvwxyyyyyxxwvvuuuttttttuuuuvvwwxxxyyzz{{|||}}~~~~~~~}||{zyxwvvuttssttvwy{}~}||||}~~}}}}}}}}}}}~~~~}||{{{{{|}~~~~~}|{zyxxwwwwxyz{}}|{zzz{{|}~~~~~}}|{{zyyyxxxxwwwxxxxxxyyyyyzzz{{{{{|||||||||||{{{zzyyxwvvutsrrqqqqrssuvxz|}|zyxxwwxxyz{{|||||{{zzyxxxwwwwwwwwwwwxxxxyyyzzz{{{||||}}}}}}}}}}}}|||{{zzyxxwvvuuuuvvwxz{}~~}}}}~~~}}||||{{{{{{{|||||}}}}~~~~~~~}}||{zzyxxwwwwwwxyz{}~}}}}~~~~}}|||||{{{|||||||}}}}}~~~~~~~~}}||{{zyyxxwwwwwxyz{|~~~}}~~~~~}}|||||||||||||}}}}}}~~~~~~~~~~}}||{{zzyxxxwwwwxyyz|}~~~~~~~}}}||||||||||||}}}}}}~~~~~~~~~~~~}}}||{{zzyyxxxxxxxxyz{|~~~~~~~}}}|||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxxxxxxyz{|}~~~~~~~}}}}}|||||}}}}}}}}}~~~~~~~~~~~~~~~~}}}|||{{zzzyyyxxxxyyzz{|~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxxyyyz{|}~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}|||{{zzzyyyyyyyyyz{{|~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}|||{{{zzzyyyyyyyyzz{|}~~~~~}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}||||{{{zzzyyyyyyyzz{|}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzzyyyyyyzz{{|}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{{zzzzzyyyzzz{{|}}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzzzzzzzz{{||}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}||||||{{{{zzzzzzzzz{{{|}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzzzzzzzz{{||}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||{{{{{zzzzzzzz{{{|}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||{{{{{zzzzzz{{{{||}~~~~~~~~~~~~~}}}}}}}}}}}}}}||||||{{{{{{{zzz{{{{{||}}~~~~~~~~~~~~}}}}}}}}}}}}|||||||{{{{{{{zzz{{{{{||}~~~~~~~~~~~~~~}}}}}}}}}}}|||||||{{{{{{{{{{{{{{||}}~~~~~~~~~~~~~~}}}}}}}}}}|||||||{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}}|||||||{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}}||||||{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}}}|||||||{{{{{{{{{{{|||}}}~~~~~~~~~~~~~}}}}}}}}}|||||||{{{{{{{{{{||||}}~~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{|||||}}}~~~~~~~~~~~~}}}}}}}}|||||||||{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||{{|||||||}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||||}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}}|||||||||||||}}}}}~~~~~~~~~~~~~~}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~}||ywwwtssroqrqqqqruwy{{~z~xtnjc^ZVTRQPOQRUW[^bfjnquxz|~~|{yvspmjgd`^[YWWWUUTUUVVWXY[\_ceimszsx}s|}}|}}yzvwz{vtpnjfc`][YVTRQQQQQRSUWY\_behknqtvy{}~~}}||~~~~~rkly|xwwx{|~~}|{zzzzzz{|}~tkdaen{{smheccaa``aaaaaaaaa``_____^^^^_``abcefhjloqsvy{~|skdabhs{tnjfedbbbaaaaaaaa````___^^^^^^^__`abdeghjlnqsuxz}zskc[SNMPXdq}vme^YTQONLLKKKKKKKJJJJJJJIIIIJJJKKLMOPQSUWY\^adfiloqtwy|~zrkfdeku~yusrqpoooopppqqqqqrrrrrrssttuvwxy{}~yutw~|zxvussrrqqqqppppoooonnnnooopqqrtuvxz{}}umga_`dmx}vpkgeb`^]\[[ZZZYYYXXXXXWWWWWXXXYZ[\]^_acefhkmoqsuxy{}|wrkd]VPMLOV`kw|ungb]YXUSRQPPPOOOOOOOOOPPPPQQRRSTUVXY[]^`cegiloqtvx{}{tmhdbdip{|xusqonmmlllllllllmmmnnnoopqrstuwxz{}{vssu{}zxvutsrrrqqqpppppppppqqqrsttuwxy{|~}wpjda_`dkt~|vpmjgdb`_]\\[[ZZYYYYYXXXYYYZZ[[\]^_abdegikmoqrtvxz|}|xsnhb\VRPORX`jt}wqlgda^\ZXWVVUUUUTTUUUUUVVWWXYZ[\]^`acefhkmoqsuxz|~zuojfbbcgnv}zwtrponmllllkklllllmmnnopqrstuvxy{}{vrpprw~}zxwutssrqqqpppppppqqqrrstuvwxy{|}}xrmgc`_`ciqz|wtqmjgecba`_^]]]\\\\\\\\]]^^_`abcdefhikmnprtuwy{|}|yupkf`[WTRRTY`ir{~ytpmifda_^]\[ZZZYYYYYZZZ[[\]^^_`bcdfgiklnprtvxz|~zuplgdbacfls||yvtrqponnmmmmmmmnnnoopqrstuvwyz|}{vspnmmnqu||wsolifdcb`_^^]]]]]^^^_`abcefhikmpruvx{~}yurqpqqrrw}{ywusqpomlkihgfeedcbbbbcccdfghjlmoqsuwy{|~|yvspnkjjjkllo{~|{yxwwvuutttssstttuvwxyz|}~{xurommr{~{yvtrpnlkjihffeddddccccddeefgijkmnpqsuvxz{}~|yvrokhedfkr{~|{zxwvvuutttsssstttuuvwxyz{|~~zuqlhdbabekry~{yvtrponmlkjjiiiiiiiijjkklmnopqrtuvxz{}~}yuqmifcbbdhnu}|ywusrponmllkkjjjjjjjkkklmmnopqrsuvwxz{}~}zwsokgc`][Z\^cipw~}zxuspnljihffeddcccbbccccddefgghijlmnpqrtuwxz{}~~{xuqnkhfeehkqw~~}{zyxwwvvuuuuuuuvvwwxxyz{|}~~{wtqnmlmptz~|{zyxwvvuuttttttuuuvvwxxyz{|}~}zwtpmjgedegjntz}zxvusrqponmmllllklllllmmmnoopqrstuvwxyz{|}~~|zxuspmjgda_^^_aejou{~|zwvtrqonmllkkjjjjjjjjkkklmmnoppqrtuvwxyz{|~}{yvsqnkjhhhjmqv|~}|{zyyxxxwwwwwwxxxyyz{{|}~|ywtrpoopruy~~}|{zzyyyyyxyyyyyzz{{||}~~}{xvspnkihhhilotx~}{yxvutssrqqpppoooooppppqqrrsstuvvwxyzz{|}}~~}{zxvtromjhfdcbbcehlpuz}{zxwutssrqqppooooooppppqqrrsttuvwxxyz{|}~}{ywusqomkjjklnrvz~}}|{{zzzzzzzzzz{{{||}}~}zxvtrqqqqsvy}~~}|||{{{{{{{{|||}}}~~}{ywusqomkkjklnptx|}|{zyxwvuutttssssssssstttuuvvwwxxyzz{{|}}~~~}|{zxwusrpnljhgfeffhjmquy}~|{zyxwvvutttsssssssstttuuuvvwxxyzz{||}~~~|{yxvtsqpnmmlmnpsvz}~}}}||||||||||}}}~~~}{ywvtsrrrstvy|~~~}}}}}}}}}}~~~~}{zxvusqpnmmmmnprux{~}|{zzyxxwwwvvvvvvvvvvwwwxxxyyzzz{{||}}}~~~~}}|{zyxvusrpomljiihiikmoruy|~}|{{zyyxxwwwvvvvvvvwwwwxxxyyyz{{{||}}~~~}|{zxwvtsqpponnoprtvy|~~}}||{{{{{zzz{{{{{{|||}}}~~~}|{yxwutrqpoonooprtwz}~~}}|||{{{{{{{{{{{||||}}}~~~~}|{zywvusrqpooooprtvx{~~~}}||||{{{{{{{|||||}}}~~~~}|{zyxwutsrqppoppqsuwz}~~}}}||||||||||||||}}}~~~~~}||zyxwvusrqqppppqrtvy{~~~}}}|||||||||||}}}}~~~~~~}|{zyxvutsrqqpppqrsuwz|~~~}}}}||||||}}}}}}~~~~~~}|{zyxwvutsrqqqqqrsuvy{}~~~~}}}}}}}}}}}}}}~~~~~~~}|{zzyxwutssrqqqqrstvxz|~~~~}}}}}}}}}}}}~~~~~~~}||{zyxwvutsrrrqqrstuwy{}~~~~}}}}}}}}}~~~~~~~~}}|{zyxwvuutsrrrrrrstvxz|~~~~~~~~~}~~~~~~~~~~~}}|{zzyxwvuttsrrrrrstuwy{}~~~~~~~~~~~~~~~~~~}}|{{zyxwwvutsssrrsstuvxz|~~~~~~~~~~~~~~~~~}}||{zyyxwvuutsssssstuvwy{}~~~~~~~~~~~~~~}}||{zzyxwwvuttsssssttuwxz|~~~~~~~~~~~~}}|{{zyyxwvvuttssssttuvxy{}~~~~~~~}}||{zzyxxwvuutttstttuvwxz|}~~~}}||{zzyyxwvvuuttttttuvwxy{|~~~~}}||{{zyyxxwvvuutttttuuvwyz|}~~~}}|||{zzyyxwwvvuuttttuuvwxy{|~~~~}}}||{{zzyxxwwvvuuuuuuuvwxyz{}~~~~}}}||{{zzyyxxwvvvuuuuuvvwwxz{|~~~~~}}}|||{{zzyyxwwwvvvuuuvvwwxyz|}~~~~~}}}|||{{zzyyxxwwwvvvvvvvwwxyz{|~~~~~}}}}||{{{zzyyxxwwwvvvvvvwwxyz{|}~~~~~~}}}}|||{{zzzyyxxwwwwvvvwwwxyyz{|}~~~~~~}}}|||{{{zzyyyxxxwwwwwwwwxxyz{|}~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwxxxyz{{|}~~~~~~~}}}}|||{{{zzzyyyxxxxwwwxxxxyzz{|}~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxyyyz{||}~~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxyyyz{{|}~~~~~~~~}}}}}|||{{{{zzzyyyyyxxxxxyyyzz{|}}~~~~~~~~}}}}}||||{{{{zzzyyyyyyyyyyyyzz{||}~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyzzz{{||}~~~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyyzzz{{||}}~~~~~~~~}}}}}}||||{{{{{zzzzzzzzzzzzz{{{|}}~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzz{{{{|||}~~~~~~~~~~}}}}}}|||||{{{{{{{zzzzzz{{{{|||}}~~|{wqoniffeabcbbcdfhknrsuz~}~~ytplhea____abbfimqtxz}~{wsokgc_[WTQNMKJHGGFFFGGHIKNQTX\cjtwa}kmx~~~~~}{yuspmifdba`_]]]^_`bcehjmprtwy{}~|{yxvutstssssstuwy{~wka]dtwrppqsuwy{}~}}|||||}~zpidcit|tokgfeddcccccccccbbabaa```_````aabdefhjlnpsuxz}}umf`_bkwztnkhfeddccccccccccbbbaaa`````aabbcdeghjlnpruwy|~}wph`XRNOT^kxwnf_ZVTRPONNNMMMMMLLLLKKKJJJJJJKKLMNOPRSUWY\^acfhknpsvxz}}vohb^]aityuqpommlllmmmnnnoooooppppqqrstuvwxz|~|wtuz~}zywvuuttttssssrrrrqqqqqrrrstuvwxz{}zrkea`bir~~wrmjhecb``_^^^]]]\\[[[[[ZZZ[[[\\]^_`bceghjlnpsuwy{}|xsmg`YRNKLQYco{{tlfa\ZXUTRQQPPPOOOOOOOOOOPPPQQRSTUVWY[\^`bdgiknpsuxz|~~yrlfa^^agp|~yusqomlkkjjjjjjjkkkklllmmnopqrstvwy{}}wsqrw~~{yxwvuuttsssssrrrrrsssttuvwwyz{}~{unhda`bgpz}wrpmigecba`_^^]]]\\\\\\\\\\]]^_``bcdfgiklnprtuwy{}~|ytoid^XSONOSYbmx|upjfd`^[ZXWVVUUTTTTTTTUUUVVWXXYZ[]^_acdfhjlnqsuwy{}~ytnid`^^afnw~{xurpomllkkjjjjjjkkkllmmnopqrstvwy{|~|wsonosy~{zxwvuttsssrrrrrrsssttuvvwxz{|}|vqkfb``bgmv}yvroljhfdcbaa``__________``abccdfghiklnoqstvxz{}~}yuqlgb]XTQQRU[bku~}wrolhfca_^\[[ZZYYYYYYYZZ[[\]]^_`bcdfgiklnprtvxy{}}ytpkfb_^^aelt}}zwusqponmmlllllllmmnnoppqrstvwxz|}{vromlmpu{~|zywvtrqonmlkjhhggffffffghijklnpqsuwz|}zwsqppru{}{yxwvvwwxvqmqtmnrtvuvvwwxyxyz{|}~~~{xtplhd`][[\^cipx}zxwvvvwwxywtpqxwqpruwxz{}~|xurqqruz}{xtqpruwvronmmnopqrsstuuvwxxyzz{||}}~~~|yvspmjgdb``bdinu|}{xvsrrtwz||zywvuuvvwxyz|}~~{wtqomllmpuz|yvsqnmkklnprsssrqponmmmnoopqrstuvwxy{|}~}zxuromkjjkmpuz~{xvsqonmnoqrttttsrqpoooooppqrstuvwxyyz||}~~|ywtqnkifedefimqw||yvspmkhgfffhiklmllkjihggggghhijkklmnopqrstuvwxyz{{|}~~}{zwuspnljihhjlosx~~{ywutttvwy{||||{zyxxxxxyyz{{|}~|zxwvuvwz}~|zyyy{|}~}|{zzyyyzzz{{|}}~}{xvtrqooopqtw{|zwusrqqrstvwwwvutsrrqqqqqqqrrsstuuvwwxxyzz{||}}~~~~}|{yxvtrpnljhgfffhjmpty~}zxurpnmlllmopqrrrrqponnmmmmmnnoopqqrsttuvwwxyzz{{|}}~~~}{zywusrpommlmnpruy}|{yxxxxz{|~~~}}|{{zzzzz{{||}}~}{zyxwwxy{}~}~~~}}}}}}}~~~}{zxwutsrrrstvy|}{ywvuuvwxyzz{zzyxwvuutttttttttuuuvvwwxxyyyzz{{{|||}}}}}}~~~}}}}}|{{zyxwvtsqpnmlkjiijkmoruy|~|zwutrrqrrstvwwwwwvuutssrrrrrrsssttuuvvwwxxyyzz{{||}}}~~~~~}}|{zyxvutsrqppopqrtwz}~|{{{{|}~~~}}||||||}}}~~~}|{zyxxxyz{}~}|zyxwvuttttuvwy|~~|{zyyyzz{|}}~}}|{{zyxxwwwwvvvwwwwwwxxxyyyyzzzz{{{{||||||||||{{{zzyyxwvutsrqponmmmmmnpqtvy|}{yxwvvvvwxyzz{{{{zyyxwwvvvuuuuuvvvvwwwxxxyyzzz{{{{|||}}}}}}}}}}}}||{{zzyxwvuttsrrrrrstvxz}~}}~~~~~~~~~~~~}|{{zyyyyz{|}~}}|{zyxwwvvvvvvwxz|~}|||||}}~~}}|{{zzyyyyxxxxxyyyyyyyzzzzzzz{{{{{{{{{{{{zzzyyyxwwvuutsrqqpppoppqrsuwy{~}|{zyyyyyz{|}}~~~}}||{zzyyxxxxxxxxxxxxyyyyyzzzz{{{{{||||||||||||{{{zzzyxxwwvuuttttttuvwyz|~~~~~~}}}||||||||||}}}}}}}~~~~~~~~~~~~~~~~~~}}}||{{zyyxwwvvuuuvvwxyz|~~~~~~}}}}||||||||}}}}}}}}~~~~~~~~~~~~~~~~}}}|||{{zyyxxwwvvvvvvwxyz{}~~}}}}}||||}}}}}}}}}}}~~~~~~~~~~~~~}}}}|||{{zzyyxwwwvvvvvwwxy{|~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}|||{{zzyyxxwwwvvvvwwxyz{}~~~}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}|||{{{zzyyxxwwwwwwwwxyz{|~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||{{{zzyyyxxwwwwwwwxyyz|}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{zzzyyxxxwwwwwwxxyz{|}~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{zzzyyxxxxwwwxxxyz{|}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}|||||{{{zzzyyyxxxxxxxxxyzz{|}~~~~~}}}}}}}}}}}}}}}}}}}}}}|||||{{{{zzzyyyxxxxxxxyyyz{|}~~~~~~~~}}}}}}}}}}}}}}}}}}}||||||{{{zzzzyyyxxxxxxxyyz{{|}~~~~~~~~}}}}}}}}}}}}}}}}}||||||{{{{zzzzyyyyxxxxyyyzz{|}~~~~~~~~~}}}}}}}}}}}}}}}|||||||{{{{zzzzyyyyyyyyyyzz{||}~~~~~~~~}}}}}}}}}}}}}}|||||||{{{{zzzzyyyyyyyyyyzz{{|}~~~~~~~~~}}}}}}}}}}}}}||||||{{{{{zzzzyyyyyyyyyzzz{||}~~~~~~~~}}}}}}}}}}}}|||||||{{{{{zzzzzyyyyyyyzzz{{|}}~~~~~~~~~}}}}}}}}}}}|||||||{{{{{zzzzzzyyyyzzzz{{||}~~~~~~~~}}}}}}}}}}|||||||{{{{{zzzzzzzyyyzzzz{{||}}~~~~~~~~~}}}}}}}}}|||||||{{{{{{zzzzzzzzzzzzz{{||}~~~~~~~~~}}}}}}}}}|||||||{{{{{{zzzzzzzzzzzz{{||}}~~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}}}|||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{zzzzzzzz{{{{||}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{zzzzzz{{{{{||}}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~}}}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{{|||}}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{|||||}}}~~~~~~~~~~}}}}}}}}||||||||{{{{{{{{{|||||}}}}~~~~~~~~~~~}}}}}}}||||||||||{{{{{|||||||}}}~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}}~~~~~~~~~~~~}}}}}}}}}|||||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}}}||||||||||||||}}}}}}~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}}~~~~}|ytpokggfcbccbcdegjlprsx||{wrnjgb`___`bbehkoswy{~|wtplhd`\XURONMKJIHHHHIJKLMPSVZ^djs~doohr~~~|~{||zwtqnkhfdb`_^]^^_`bcdgiloqsvxz|~~}{zxwvttuttttuvwy{}|pe^anwqmlmorsvxz}~}}}||}}~ulfdgp~{tmiecbbbaaaabbbbbbbbbbaa``````aabbdefhikmprtwz|~zqic`ahszsmifdcbbaabbbbbbbbbbbbaaaaaaaaabccdeghjlnprtvy{}|tme\UPOR[gtwnf_YUQPOMMLLLLLLLLLLLKKKKKKKKKKLLMNOPRSUWY[]`begjmoruwy|~zsle`^`fq}~xtpnmlkkkkkllmmnnnooopppqqrrstuvwxz|}yuux}{ywvuttsssssssrrrrrrrrrrrrsstuvwxz{}}vnhcabgo{~wqlhfdb`_^^]]]]\\\\\[[[[[[[[[\\]]^_`bcefhjlnprtvxz|~{vqjc\UPMLOV`lw{tlf`[XWTRQPOOOOOOOOOOOOOPPPPQRRSTUVWYZ\^`bdfhkmortwy|~|void`^`emx}xtrpmlkjiiiiijjjjkkklllmnnopqrstvwy{|~zusrv|}zxwvuttssssssrrrrsssssttuvwwxz{|~~xqkfbabfmw}wrnlhfdba`_^^]]]\\\\\\\\\\\]]^_``acdeghjlmoqsuwyz|~{wrmga[UQOORW_it~|uojec`][YWVUUTTTTTTTTTUUUVVWXXYZ[]^_abdfhjlnprtvy{}|wqkfb_^`dkt~zwtqonlkkjjjjjjjjkkkllmmnopqrstvwyz|~yuqoorw}{ywvuttssrrrrrrrrsssttuvvwxy{|}~ysnhda`beks|}xvrnligedcba``__________```abbcdeghiklmoqrtvwy{|~{xtoje_ZVSQRTY`hr{}wrnlheb`^]\[ZZYYYYYYYYZZ[[\\]^_`acdeghjlnoqsuwy{}~{wrmhda_^`djqz}ywtrponmmllllllllmmnnoopqrstuwxz{}~~ytqnlmoty~{xuromkihfdcb``__^^^^^_`abdeghjmortwy{~|xurpoprrsy~|zywvusrqponmlkjjjiiihijjkmmnprsuwxz|}~|zxusolifdccdeefiv~}{zyxwvvuuutttttttuuvwxyz{}~~zwuromns}|zxvtsqponmlkkjiiiiiiiijjklmnopqstvwxz{}~~|yvsolhda_^`emw~|zyxwvvuuttttttttuuvvwxyz{|}~zvqlhebbcflsz~{xvtrqonmlkkjjjiiijjjjkklmnopqrstvwyz|}|xtplhebaadhnu}~|ywusqponmmllkkkkkkklllmnnopqrstuvwyz{}~}zwsplhd`][[\_djqx}{xuspnlkihgfeddcccccccccddefgghijlmnoqrsuvxyz|}~{xuqnjgdbbbeinu|~|{yxwvvuutttttttuuvvwwxyz{|}~~zwspnmlnpuz~}{zyxxwwvvvvvvvvvvwwxxyz{|}}~}zwtpmjhfeegjou{}{ywutsrqponnnmmmmmmmnnnooppqrsstuvwxyz{|}~~|zwurolifca_]]^aeiou{}{ywusrponmlkkjjjjjijjjjkkllmnnopqrstuvwyz{|}~~{yvtqnkigfefhkouz}|{zyxxwwwwvwwwwwxxyyzz{|}~~~{yvsqpoopruz~}||{{zzzzzzzzzz{{{||}~~}{yvsqnljihijmpuy}|zywvuttsrrqqqqqqqqqqqrrssttuvvwxxyz{{|}~~|{yxvtqoljhecbaabdgkpuz~~|{yxvutsrqqppoooooooopppqqrrsttuvwwxyz{||}~}{zxusqomkiihijmpty~~}||{{zzyyyyyyyzzz{{{|}}~~~|zwusrqppqsvy}~~}}}|||||||}}}}~~}|zwusqomlkkklnquy}~}{zyxxwvvuuuttttttttuuuvvvwwxxyyz{{||}}~~}|{yxvusqomkihfeeefhjmquy}}|{yxwwvuuttsssssssssstttuuvvwwxyyz{{|}}~~~}{zxvusqonlkkkkmoquy}~}}|||||{{{|||||}}~~~~|zywutsrqrrtvy|~~~~~~~~~~~}|zxwusrponmmmnprux|~}|{zzyyxxxwwwwwwwwwwxxxyyyzzz{{||}}}~~~~}||{zxwvtsrpnmkjihhhijlorux|~}|{zyyxxwwwvvvvvvvvvwwwwxxyyyzz{{||}}~~~}|{zywvusrponmmmnopsux|~~}}|||{{{{{{{{{{{||||}}}~~~}|zyxvusrqponnnoprtwz}~~}}||||{{{{{{{{{||||}}}~~~~}|{yxwutsrqpoooopqsvx{~~~}}||||||||||||||}}}}~~~~}|{zywvutrqppooopqsuwz}~~}}}}|||||||||||}}}}~~~~}|{zyxwutsrqppoopqrtvx{~~~}}}}}|||||||}}}}}~~~~~}||{yxwvutsrqppppqrsuwz|~~~}}}}}}}}}}}}}}}~~~~~}}|{zyxwvtsrrqpppqrstvy{}~~~}}}}}}}}}}}}~~~~~~}}|{zyxwvutsrrqqqqrstvwz|~~~~~}}}}}}}}}~~~~~~~}|{zzyxwvutsrqqqqqrsuwy{}~~~~~~~}}~~~~~~~~~~}||{zyxwvutssrrqqrrstvxz|~~~~~~~~~~~~~~~~~~}||{zyyxwvutssrrrrrstuwy{}~~~~~~~~~~~~~~~}}|{zzyxwvuutssrrrrstuvxz|~~~~~~~~~~~~~~}}|{{zyxxwvuttssrrrsstvwy{}~~~~~~~~~}}||{zzyxwvvuttsssssstuwxz|~~~}}||{{zyxxwvuuttssssttuvwy{|~~~}}||{{zyyxwvvuuttsssttuvwxz{}~~~}}||{zzyxxwvvutttssttuuvxy{|~~~~}}||{{zyyxwwvuuttttttuuvwxz{}~~~}}||{{zzyxxwvvuutttttuuvwxy{|~~~~}}||{{zzyyxwwvvuuuttuuuvwxyz{}~~~~}}}||{{zzyyxwwvvuuuuuuuvvwxy{|~~~~~}}}||{{zzyyxxwwvvvuuuuvvvwxyz|}~~~~~}}}|||{{zzyyxxwwvvvvvvvvwwxyz{|}~~~~}}}|||{{zzzyyxxwwwvvvvvvwwxyy{|}~~~~~}}}}|||{{zzyyyxxwwwvvvvvwwxxyz{|}~~~~~}}}|||{{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~}}}}|||{{zzzyyyxxxwwwwwwwxxyzz{|}~~~~~~}}}}|||{{{zzzyyxxxxxwwwwxxxyyz{|}~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxxyyz{{|}~~~~~~~}}}}|||{{{zzzyyyyxxxxxxxxxyyzz{|}~~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxyyyzz{||}~~~~~~~}}}}}||||{{{zzzzyyyyyxxxyyyyzz{{|}~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzz{{||}~~~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyzzz{{{|}}~~~~~~~~}}}}}}||||{{{{zzzzzzyyyyzzzz{{{||}~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzz{{{|||}}~~~~~~~~~}}}}}~}|ytrqljjiffhgghijmorvwy~zw{vsolhdcccdefgjmquy|~~zvrnjfb^ZWTRQONMKKJJJKLLMORTW[_elur]|dfr{|xvw{{ywtromjhfeccb`aabcdfgilnqtvx{}~}{zywwxwwwwwxy{}vi_[brxpjgghklnpsuwyz|}}~~~~~}}}}}}}~~zphbbgr|tlfb_]\\[[[[\\]]]]^^^^_____``abbcdeghjlmprtwy|~~ume_^aiu{rkfb_^]\\\\\\]]]^^^^____````aabcdefgijlnprtvy{}yqi`XQMMR\huxof^XRNLJHGGFFFFGGGGGHHHHIIIJJKKLMNOPRSUWY[]_bdgiloqtwy{~~woha]\_gr~wrmjhgfeeeffgghiijkllmnnopqrstuwxz{}|vssx{wusqpoonnnnnnooooopppqqqrsstuvwyz{}zrkd`_agq|wpkfca^\[ZYYXXXXXXXYYYYYZZZ[[\]]^_abcefhjlnprtvxz|~~ztng`XRMJKOWamx|tmf_ZUSQOMLKJJJJJKKKLLMMNNOOPQRSTUWXZ[]_acehjloqtvx{}yslfa]]`foz}wrnmjhgfeeeeeeffgghiijklmnopqrsuvxz|~}wspqu|}{wusrqpppooooppppqqqrrsttuvwxz{|~|unhc`_afnx}wqlifca_]\[[ZZZYYYZZZZZ[[\\]^^_`acdeghjlmoqsuwxz|~~zupjd^XSOMNQXaku|vojd`^ZXVTSRQQQQQQQQRRSSTUUVWXYZ\]^`bcegikmoqtvxz|~ztoid`]]`elv}xuromkihgggffggghhiijkllmnpqrsuvxy{}|wronorx~{xvusrqqppppppppqqrrsstuvwxyz|}~|wqkfb`_aflt}}xtqmjgeca`_^^]]]]]]]]^^__``abcdefhijlmoprtuwy{|~~{wrmhb]XTQPQTYajs|}wrmjgca^\ZYXWWWVVVWWWXXYZZ[\]^_`bcefhikmoqrtvxz|~~zupkfb_]^`dkr|~|xurpnmkkjjiiiijjkkllmnopqrstvwyz|~|wrolklotz|xuromkigfeccaa`````aabbcdeghjkmoqsuxz{~zvqmjhhjot{|yxvuutsrrrqqqqpppppppoooooopoppqrstuvwy{|~~{xuqmiea^\ZZ\`elt}~}{zyyxxwwwwwwwxxxxxxyzz{{||}~zvspnmnptz}zywutsrqpoonnmmmlllkkkkkkklllmmnopqrstuwxz{}~|yvsoligeddfjntz}zywvutttttstttttuuuvvwwxyyz{|}~~zvspmkjjknqu{{wtqomlkjiiihhhhhiiijjkklmnoopqrtuvwyz|}~|yvspmkjijlnrw{|xusqonllkjjjjjjjjjkkklmmnoopqrstuvwyz{|~}zwtqnkhedccdfimquy}{wspmkhgfddcbbbbbbbbbccddeefghijklmnoprstvwyz|}~~|yvtqomkjjklorvz~{yxwuttssssssstttuuvvwxyyz{|}~}{ywuuuuwy|}{zyxwvvuuuuuuuuuvvvwwxyyz{{|}~~|ywtrpnmmmnpruy||yvtsqponmmlllllllllmmnnnoppqqrstuvwxxyz{|~~~|zxvtqoljhfeeefgiknrux||yvsqonmlkjiiiiiiiiiijjkkllmnnopqrstuvwxyz{|~}{yvtrqonmmmnprux{}{zyxwwvvvvvvvvvwwwxxyzz{||}~}{yxwvvwxy{~}|{{zzyyyyyyyyyzzz{{{|}}~~}{ywusrqpoopqsuwz}}{ywvussrqqppppppppppqqqrrssttuuvwxxyz{{|}~~~}|zywusrpnlkjihhijkmoqtwy|}{ywutsrqpooonnnnnnooooppqqrrsttuvwwxyz{||}~~}{zxwusrqpooopqsuwz|}|{{zyyyxxxxxyyyyzz{{||}}~~|zyxwwwwxyz|~~~}||||{{{{{|||||}}~~~~|{ywvusrrqqrrsuwx{}~}{zywwvuutttssssssttttuuuvvvwwxxyzz{{|}}~~~}|{zxwutsqpnmllkkllmnpqsvxz}~|{zxwvuttsssrrrrrrrssstttuuvvwwxxyzz{||}~~~}|{yxwvtsrrqqqrrsuvxz}~}}||{{{{{{{{{{|||}}}~~~}|zyyxxwxxyz{}~~~}}}}}}}}}}~~~~~}{zyxwuutssssstuvxy{}~}|{zyxxwwwwvvvvvvvwwwwwxxxyyyzz{{{||}}~~~~}}|{zyxwvutrqpoonnnnnopqrsuwy{}~}|{zyxwwvvvvuuuuvvvvvvwwwxxyyyzz{{||}}~~~}|{zyxwvuttsssssstuvxy{}~}||{{{{zzzzzzzz{{{{|||}}}~~~~~}|{zyxwvuttsssttuvwxz{}~}}||{{{{{{{{{{{{{{||||}}}~~~}|{zyxwvvuttttttuuvwyz|~~~}}|||{{{{{{{{{{|||||}}}~~~~}|{zzyxwvuuttttttuvwxy{|~~}}}||||{{{{{{|||||}}}}~~~~}}|{zyxwwvuutttttuuvwxz{}~~}}}|||||||||||||}}}}~~~~~~}|{zzyxwvvuuttttuuvwxyz|~~~}}}||||||||||}}}}}~~~~~~}||{zyyxwvvuuuuuuuvvwxz{|~~~~}}}}}||||}}}}}}}~~~~~~~}||{zzyxwwvvuuuuuuvvwxyz{}~~~}}}}}}}}}}}}}}~~~~~~~}}|{{zyyxwwvvuuuuuuvvwxy{|}~~~~}}}}}}}}}}}}~~~~~~~~}}||{zzyxxwwvvuuuuuvvwxyz{|~~~~~~}}}}}}}}~~~~~~~~~~}}|{{zyyxxwwvvvuuuvvwwxyz|}~~~~~~~~~~~~~~~~~~~~~}}|{{zzyxxwwvvvuuvvvvwxyz{|}~~~~~~~~~~~~~~~~~~}}||{{zyyxxwwvvvvvvvvwwxyz{|~~~~~~~~~~~~~~~~~}}||{{zzyyxxwwvvvvvvvwwxxyz|}~~~~~~~~~~~~~~~}}}||{{zzyyxxwwvvvvvvvwwxyz{|}~~~~~~~~~~~~~}}||{{zzyyxxwwwvvvvvvwwxxyz{|~~~~~~~~~}}|||{{zzyyxxwwwvvvvvwwwxyz{|}~~~~}}}||{{zzyyyxxwwwwvvwwwwxxyz{|}~~~}}}|||{{zzyyxxxwwwwwwwwwxxyzz{}~~~~}}}|||{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~}}}||{{{zzyyyxxxwwwwwwwxxxyz{{}~~~~~~}}}|||{{zzzyyyxxxxwwwwwxxxyzz{|}~~~~~~}}}|||{{{zzzyyyxxxxxxxxxxxyyz{|}}~~~~~}}}}|||{{{zzyyyyxxxxxxxxxxyyz{{|}~~~~~~}}}}|||{{{zzzyyyyxxxxxxxxyyyzz{|}}~~~~~~~}}}}|||{{{zzzyyyyyxxxxxxyyyzz{{|}~~~~~~~}}}}|||{{{{zzzyyyyyyxxxyyyyzz{{|}}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyyzzz{||}~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyyyzzz{{|}}~~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyyzzz{{||}~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyyzzzz{{||}}~~~~~~~~~}}}}}||||{{{{zzzzzzyyyyyzzzz{{{|}}~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzz{{{|||}}~~~~~~~~~}}}}}||||||{{{{{zzzzzzzzz{{{{|||}}~~~~~~~~~}}}}}}||||||{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{||}}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~|{ysonkffebabbbbcefilorsw|{vqmifb_^^^_aadgjnrvx{~~|xtqlhd`\XTQNMLJIHGFFFGHIJKNQTX\biq|jjxjs~}}}~~~~|yvspnjgeca__]\]]^_abcfhknqsuxz|~~|{yxvutssssssstuwy{~~sh`am|uqpprtuwz|~~}}||{{{{|}~wnhehp}xqlifeddccbbbbcbbbaaaa``______```abdeghjloqsvy{~{skeabhrwqligfdccccccbbbbbbaaa`````__``aabcdfgikmoqsuxz}|vnf^WQPSZfs{rjc]XTSQONMMMLLLLLKKKKJJJJJIJJJJKLMNOPRTVXZ\_bdgiloqtvy{~|tmfa_`fp}|wsponmllllllmmmnnnnnooopppqrstuvwy{|~{wvy}{ywvuuttssssrrrqqqqqqqqqqrrstuvwyz|~wpidbbgoz{uokifdb`__^]]]\\\[[[ZZZZZZZZZ[\\]^_abdegikmoqsuwz{}{wrke^WQNMPV_kwwpic^[YVTRQPPOOOOONNNNNOOOOOPPQRSTUVXY[]_acegjloqtvx{}}wpjea_`emw{vtromlkjjjjjjjjjjjkkkllmmnopqrsuvxz|}{vssv{|zxwvuttsssrrrrrrrrrrrsstuvwxyz{}yslgcabfmvzuqnjhecba`_^]]\\\\[[[[[[[\\\]^_`abcdfhikmnprtvxz{}{wsmhb\VRPORW_it~xrmheb_\ZYWVUUTTTTTTTTTTUUUVWWXYZ\]^`acegikmoqsvxz|~}wrmgc`_`dkt~|yvsqomlkkjjjjjjjjjkkklmmnopqrsuvxy{}zvrpprw~|zxwvutssrrrrrrrrrrssttuvvwyz{|~ztojebabekr|{wtpmjhfecbaa`___^^^^^^___``abcdefghjkmnprsuwxz|}|xtpkf`[WTRRTY_hqzzupnjgda_^][[ZYYYYXXYYYYZZ[\\]^_abcefhikmoqstvxz|~|wsnieb__`diqy{xusqponmllllkkllllmmnoppqrsuvwyz|~~zuqnmmotz}{zxwutrqpnmljiihgggffggghijklnoqsuwy{~|xsoljjjnsy}|zyxxwwwvuuuuuttsssssssrrsstuuuvwyz|}~~|zxuqnjfb_[XVVWZ^dlu~}|{zyxxwwwwwvvvwwvwwwxxxyyz{{|}~}yurpooqty~|{yxwvvuttsrrqqqppooooooooppqrrstuvwxz{|}~|yvspmifdb``adhmt{~{yxvuttsssssssssttttuuvvwxxyz{|}~}zvsqnmmmosw{~zwtrponmlkkjjjjjjjjjjkkllmmnopqrstvwyz{}~}zwtqomkjklnrv{~zwusqponmllkkkkkkkkkllmmnnopqqrstuwxyz{}~|zwtqnkhgfffhjnrv{}yvrpmkjhgfedddccccccccdddeefgghijklmopqrtuvxyz|}~}zxuspnljiiijmpsx|~{yxwuttssrrrrrrsssttuuvwwxyz{|}~}zxwvvvxz}~|{zyxwwwvvvvvvvvvwwwxxyzz{|}~~~{ywtrqooopqsvz}~{ywutrqpponnnmmmmmmmnnnooppqqrsttuvwxyz{|}~~}{ywuspnljhgffghjlorvy}}zwusqonmlkjjiiiiiiiiiijjjkklmmnopqrstuvwxyz{|}~}|zxvtrponmlmmoqtwz~}|zyxwwvvuuuuuuuuvvvwwxyyzz{|}~}|zyxwwwxz|~~}|{{zzzzzyyyzzzz{{{||}}~}{ywutsrqqrstvy{~}{yxwvutsrrqqqqqqqqqqqrrrssttuuvvwxxyz{{|}~~~}|{yxvtsqomlkjiijjkmortwz}~|zxvusrqppoonnnnnnnnnooooppqqrsstuvvwxyzz{|}~~}|{yxvusrqpooopqrtvy{~~|{{zyyxxxxxxxxxxyyyzz{{||}~~~|{zyxxwxxy{|~}}}|||||||||||}}}~~~}|zyxvutsssstuvxz|~}|zyxwwvuuuttttttttttuuuuvvwwxxyyzz{{||}}~~~~}|{zywvusrqonmllllmmoprtvx{}}|zyxwvuttssrrrrrrrrrrssssttuuvvwwxyyzz{||}}~~}|{zyxvutsrrqqqqrstvxz|~~}}|{{{zzzzzzzz{{{{|||}}~~~}|{zyxxxxxyz{}~~~~}}}}}}}~~~~~~|{zyxwvuutttuuvwy{|~~}|{zzyxxxwwwwwwwwwwwwwxxxxyyyzz{{{||}}}~~~~~}||{zyxwvutsrqpoonnnoopqrtvwy|~}|{zyxxwvvvuuuuuuuuuuuvvvwwwxxxyyzz{{||}}}~~~}}|{zzyxwvutsssrrrstuvwy{}~~}||{{{zzzzzzzzzzz{{{{|||}}}~~~}}|{zyxwvuuttttttuvwyz|~~~}|||{{{zzzzzzzz{{{{{|||}}}~~~~~}|{zyyxwvuutttttuvwxy{|~~}}|||{{{{{{{{{{{{{||||}}}}~~~~~}|{{zyxwvvuutttuuuvwxz{}~~}}|||{{{{{{{{{{{|||||}}}~~~~~}||{zyyxwvvuuuttuuvwxyz|}~}}}|||||{{{{{||||||}}}}~~~~~~}}|{zzyxxwvvuuuuuuvvwxy{|~~~}}}||||||||||||||}}}}}~~~~~~}}|{{zyyxwwvvuuuuuuvwxyz{}~~~~}}}||||||||||||}}}}}~~~~~~}}||{zzyxxwvvvuuuuvvvwxyz|}~~~}}}}|||||||}}}}}}}~~~~~~~~}||{{zyyxwwvvvuuuuvvwxxz{|~~~~}}}}}}}}}}}}}}}}~~~~~~~~~}}||{zzyyxwwvvvvuvvvwwxyz{}~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyxxwwvvvvvvvvwxxyz|}~~~~}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyxxwwvvvvvvvwwxyz{|~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}||{{zyyxxwwwvvvvvvwwxxyz{}~~~~~~~~~~}~~~~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvvvwwxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxwwwwvvvwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxxwwwvvvwwwwxyyz{}~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~}}}}||{{{zzzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~}}}}|||{{{zzyyyxxxxwwwwwxxxyyz{|}~~~~~~~~}}}}|||{{{zzzyyyxxxxxwwxxxxyyzz{|}~~~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~}}}}}|||{{{zzzzyyyxxxxxxxxxyyyz{{|}~~~~~~~~~~}}}}}||||{{{zzzzyyyyxxxxxxxyyyzz{|}~~~~~~~~~~~}}}}}|||{{{{zzzzyyyyxxxxxyyyyzz{||}~~~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyyyzz{{|}}~~~~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyyyyzz{{||}~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyyyzz{{||}~~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyzzzz{{|}}~~~~~~~~~~~}}}}}}|||||{{{{zzzzzzzyyyyzzzzz{{||}~~~~~~~~~~~}}}}}}}||||{{{{{zzzzzzzzzzzzzzz{{||}}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{{||}~~~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzz{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{||||}}}~~}zyuomlgdec``a`abcdgilpqsx||wrnjfc_^]]^_`adgkosvx{~~|xtqmiea]YVSPNMLKJIIIJJLMNOQUX[_djr{yelnz}|||}~}|yvspnkgeba_^][[\\]_`acfhknpruwz{~~}|{yxwuusttttuuvwy{~|pfbiywrooprtuwy{}~~}||{{zzzzz{|}~unihny{smifdcbbaaaaaaaa```____^^^]^^^__`abcefhjloqtvy{~{rkedgo{yrmifecbbaaaaaaaaa```____^^^^^__`abcdegikmnqsuxz}}ume]VSSXbo|vme^YURQOMLLKKKKJJJJJIIIIIHHHHIIJJKLMOPRTVXZ]_bdgiloqtvy{}{tmgcbemy~xtpnmlkjjjkkkllllmmmmnnnooppqrstvwyz|~{xy~}{ywuttsrrrrqqqqpppppooopppqqrstvwxz|~~voiedgmv}vqlhfca`_^]\\\[[[ZZZYYYYYYYYYZZ[\]^_`bdegikmoqsuwy{}|wrkd]VROPU]gs~{sle`[YVTRQPONNNNMMMMMMMNNNNOOPPQRSTVWY[]_acegjloqtvx{}}vpjebbekt}xtromkjjiihhhhiiiiijjjkklmmnoprstvxz{~{wuvz|zxvutssrrrqqqqqqqqqqqrrsstuvwxz{}xrlgddfks}|vqnkheca`_^]]\\[[[ZZZZZZZZ[[\\]^_`acdfgikmnprtvxy{}|xsmga[VSQRV]fp{{uoiec_\ZXWVUTSSSSSSSSSSSTTUUVWXYZ[]^`acegikmoqtvxz|~}wrlgdaadiq{}zwtqomlkjiiiiiiiiiijjkklmmnoqrsuvxy{}zvsrsv|}zxwutssrrqqqqqqqqqqrrsttuvwxy{|~ytnifccejpy|xuqnkhfdcba`__^^^]]]]]]^^__``abcdeghjkmnprsuwxz|}|xtoje`[WUTUX^enw|wrnkgdb_^\[ZYYXXXXXXXXXYYZZ[\]^_`bcefhikmoqrtvxz|~|wsniebaadhow|yvsqpnmllkkkkkkkkkllmmnopqrstvwyz|~~yuroopsx~}{zxvusrqonlkjihggffeefffghhiklnprtvwz|~|wromkkmrw}|zyxwwvvvttttttsrrrrrrrqqrrssttuvwyz{|~}zxuqnjfb_[YXXZ]cjr{~|{zyxwwvvvvvvvvvvvvvwwwxxyyz{|}~|xurqpqtx~~|{yxwvuttsrrqqppooonnnnnonooppqrstuvwxz{|}~|yvspmjgdbbbdhlrx|zxvuttsssrrrrrsssssttuuvvwxyz{|}~}yvsqonnorvz{wtrpnmlkkjjiiiiiiiiijjkkllmnopqrsuvwyz{}}zwtqomlllnquy~{xusqpnmmlkkkjjjjjjkkkllmmnoppqrstuwxyz|}~|yvspmkihgghjmquy~zvspmkjhgfedcccbbbbbbbcccddeffghijklmopqrtuvxyz|}~}zxuspnlkjjklorw{~|zxwutssrrrrrrrrrsssttuvvwxyz{|}~}zyxwwxz|~|{zyxwvvvuuuuuuuvvvwwxxyyz{|}}~~{ywtsqpppqsvy||ywutrqpoonnmmmmllmmmmnnnooppqrsstuvwxyz{|}~}{ywuspnljihgghjlnqtx{~{xusqonmlkjiiihhhhhhhiiijjkklmmnopqrstuvwxyz{|}~~|zxvtrqonnmnoqsvy|}|zyxwvvuuuttttuuuuvvwwxxyzz{|}~~|zyxxxxz{~~}|{{zzyyyyyyyyyzzz{{||}}~~}{ywvtsrrrstvxz}}{zxwutssrrqqppppppppqqqrrrssttuvvwxxyz{{|}~~~}|{yxvtsqonlkjjjklmoqsvy||zxvusrqpponnnnmmmmnnnnnooppqqrsstuvvwxyzz{|}~~~|{yxvusrqppppqrtvx{}~|{zzyxxxwwwwwwwxxxyyyzz{||}}~~}{zyyxxyy{|~~}}|||{{{{{{{||||}}}~~}|{yxvutttttuvxy{~}|zyxwvvuuttttsssstttttuuuvvvwwxxyzz{{||}}~~~~}|{zywvusrqpnnmmmmnopqsuxz|~|zyxwvutssrrrqqqqqqrrrrsssttuuvvwwxyyzz{||}~~~}|{zyxwutssrrqrrstvwy{~~}||{{zzzzzzzzzzzz{{{||}}~~~}|{zyyyyyyz{}~~~}}}}}}}}}}}}~~~~~}{zyxwvvuuuuuvwyz|~~}|{zyyxxwwwvvvvvvvvvwwwwxxxxyyzzz{{|||}}~~~~~}||{zyxwvutsrqppooooopqrsuwy{}}|{zyxwwvvuuuuututuuuuuuvvvwwwxxyyzz{{||}}}~~~~}|{{zyxwvuttssssstuvwxz|~~~}||{{zzzzzzzzzzzzzz{{{|||}}}~~~}}|{zyxwvvuutttuuvwxz{}~~}||{{{zzzzzzzzzzz{{{{{|||}}}~~~~}|{zyyxwvvuuuuuuvwxyz|~~}}||{{{{zzzzzzz{{{{{||||}}}~~~~~}|{{zyxwwvuuuuuuvvwxy{|~~~}|||{{{{{{{{{{{{{{||||}}}}~~~~~}||{zyyxwvvuuuuuuvwwyz{}~~}}||||{{{{{{{{{{|||||}}}}~~~~~}}|{{zyxxwvvvuuuuvvwxyz|}~~}}||||||{{{{|||||||}}}}~~~~~~}}||{zzyxwwvvvuuuvvwxxz{|~~~}}}|||||||||||||||}}}}}~~~~~~}}||{zzyxxwwvvvuuvvwwxyz{}~~~}}}}||||||||||||}}}}}~~~~~~~~}}|{{zyyxxwwvvvvvvvwwxyz|}~~~}}}}}|||||||}}}}}}}~~~~~~~~}}||{zzyyxxwwvvvvvvwwxyz{|~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyxxwwwvvvvvwwxxyz{}~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyxxwwvvvvvwwwxyz{|}~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}||{{zzyyxxwwwvvvvwwxxyz{|~~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}||{{zzyyxxxwwwwvwwwwxyyz|}~~~~~~~}}}}}}}~~~~~~~~~~~~~}}}|||{{zzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxxwwwwwwwwxxyyz{|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}||{{{zzyyxxxwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyxxxwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyyxxxwwwwwwxxxyzz{|~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{zzzyyxxxxwwwwwxxxyyz{|}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxxxwwxxxxyyz{{|}~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxxyyzz{||}~~~~~~~~~~}}}}}|||{{{zzzzyyyyxxxxxxxyyyz{{|}~~~~~~~~~~~}}}}}||||{{{zzzzyyyyxxxxxyyyyzz{|}}~~~~~~~~~~~~}}}}}}|||{{{{zzzzyyyyyyyyyyyyzz{{|}~~~~~~~~~~~~}}}}}}||||{{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~~~~~}}}}}|||||{{{zzzzzyyyyyyyyyzzz{{||}~~~~~~~~~~~~}}}}}}||||{{{{zzzzzyyyyyyyyzzzz{{|}}~~~~~~~~~~~~}}}}}}|||||{{{{zzzzzzyyyyyyzzzz{{||}~~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~~}}}}}}|||||{{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzz{{{{|||}}~~~~~~~~~~~}}}}}}}||||||{{{{{{{{zzzzz{{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}}}}}|||||||{{{{{{{{{{{{{||||}}}~~zyvpmlhdec``a`aabdfikoqrx{}xsokgd_^]]]_``dgjnrvwz~~|yurnjfb^ZWSQNNLKJIIIIJKLMOPTWZ^cipyfzomw~||||}}}ywtqnkgeca_^][[\\]^`acfhkmprtwy{}~|{zxwvutttttuuvwy{}~rgbfuxsonoqstwy{}~~~}||{{zzzzz{|}~woihlv|unjfdcbbaaaaaaaa```____^^^]^^^^_``bcefhjlnqsvx{}|tlfdfmy{tnjfedbbaaaaaaaaa```____^^^^^__`aabdeghjlnpsuwz|~~wog_XSSW`lyxog`ZURQOMLLKKKKJJJJJIIIIHHHHHIIIJKLMNPRSUWZ\_adfilnqsvx{}}unhcbdkvytpnmlkjjjkkkklllmmmmmnnooppqrstuwxz|~|yy}}|ywvttssrrrqqqqpppppooopppqqrstuwxz{}xqjfdfktxrligdb`_^]\\\[[[ZZZYYYYYYYYYZZ[\\^_`bceghkmoqsuwy{}}xsle^XSPPT[ep||tmfa\YWTRQPONNNMMMMMMMMMNNNNOPPQRSTVWYZ\^`cegjlnqsvxz|~xqkfbbdir}~ytrpmljjiihhhhhiiiiijjkkllmnopqstvwy{}|xuvy}zxwutssrrrqqqqqqqqqqqrrsstuvwxz{}~zsmhedejq{~xrolhfcb`_^]]\\[[[ZZZZZZZZ[[\\]^_`abdegijlnprtvxy{}~}ytnhb\WSRRU[dnx|vpjfc`]ZXWVUTTSSSSSSSSSSTTUUVWXYZ[\^_acegikmoqsuxz|~~xsmhdbachoy~zxtqomlkjjiiiiiiiiijjkkllmnoprstvwy{}{wsrru{}zywvtssrrqqqqqqqqqqrrsstuvwxyz|}zuojfdceiow}yvrnkigecba`__^^^]]]]]]^^^_``abcdeghiklnpqsuvxz{}~}yupkfa\XUTTW\clu}xrolheb`^\[ZYYXXXXXXXXXYYZZ[\]^_`acdfgikmnprtvxz|}}xtojfcaacgmu~}yvtrpommlkkkkjkkkkllmmnopqrstuwxz|}zvrpoprw}~zwtqnljhgecb`_^^]]]]]]^__abdfgilnqtvx{~}zvsrrstuu}~{zxwutrpponmlkiihhhhgghhijklmoqrtvwy{|~}{yvtqmjhfeefgghm{~|{zxwvuuttssssrssssttuvxyz|}|yvsqoqv|ywutrqonmlkjjihhhgghhhhijklmnoprsuvwyz|}}zwtqmieca`chqz}|zyxwvuttssssssssttuuvwxyz{|~{vrmifdceiov~~{xvtrpomlkjjiiihhhiiiijjklmnopqrsuvxy{|~}yuqmifdccfkqx~|ywtsqpnmmlkkkjjjjjjkkkllmnopqrstuwxy{|}~{xtplhea_]]^bgmt{}{xuspnljigfeddccbbbbbbbbccdeffghjklmnpqrtuwxz{|~~|yvrokhfdcdgkqx~|{yxwvuuttssssstttuuvvwxyz{|}~{xtronnpsw}~|{zyxwvvuuuuuuuuuuvvwwxyz{||~~{xuqnkigfgimqw}}{ywutrqponnmmmllllllmmmnnoopqrrstuvwxyz{|}~~|zxvspmjgdb`__`cglqw}~{ywusqpnmlkkjjiiiiiiiiijjkklmnnopqrstvwxyz{|}~~|zwtroljhgghjmqw}~}|zyyxwwvvvvvvvvvwwxxyyz{|}~|ywtrqppqtw|~}|{{zzyyyyyyyyyzz{{||}}~~|ywtqomkjijlnrw|}{zxwvutsrrqqpppppppppqqqrrsstuuvwxxyz{||}~~}{zxvtromkhfdcccdfimrw|~|zywvusrrqppooonnnnnnoooppqqrsttuvwwxyz{|}}~}|zxvtromljjjjlorv{~}|{{zzyyyyxxyyyyyzz{{||}~~|zxvtsrqrsuw{~~}}|||{{{{{||||}}}~~~|zxvtrpnmlllnpsvz~|{zyxwvvuuttttssssttttuuuvvwwxxyyzz{||}}~~~}|{zxwusrpnljigfffgilorvz~}|zyxwvuuttsssrrrrrrssssttuuvvwwxyyz{{|}}~~~}{zywusrpomlllmnpsvz~~~}|||{{{{{{{{{{|||}}~~~|{ywvtssrstuxz~~~~}}}}}}}}}~~~}|zywutrqoonnopqtwz}}|{{zyyxxwwwwvvvvvvwwwwxxxyyyzz{{{||}}~~~~~}||{zywvusrpomlkjiiijlnpsvz}~}|{zyxxwwvvvvvuuuuvvvvvwwwxxyyzz{{||}}~~~}|{zyxvusrqponnnoprtwz}~}}||{{{{zzzzzzz{{{{{|||}}~~~~}|zyxwutrqpoooopqsvx{~~~}|||{{{{{{{{{{{{{||||}}}~~~}|{zxwvusrqppoopqsuwz}~~}}|||{{{{{{{{{{{||||}}}~~~~}|{zyxvutsrqppppqrtvx{~~~}}|||||{{{{{|||||}}}}~~~~}|{zyxwvusrqqpppqrsuwz|~~}}}|||||||||||||}}}}~~~~~}}|{zywvutsrqqqpqrstvx{}~~~}}}}|||||||||}}}}}~~~~~}}|{zyxwvutsrqqqqrrtuwz|~~~}}}}}||||}}}}}}}~~~~~}}|{zyxwvuttsrrqqrrsuwy{}~~~~}}}}}}}}}}}}}}~~~~~~~}|{{zyxwvutsrrrqrrstvwz|~~~~~}}}}}}}}}}}~~~~~~~~}||{zyxwvuutsrrrrrstuwy{}~~~~~}}}}}}}}~~~~~~~~~}}|{zyyxwvuttssrrrstuvxz|~~~~~~~~~~~~~~~~~~~~~}}|{{zyxwvvuttssssstuvwy{}~~~~~~~~~~~~~~~~~~}}|{{zyyxwvuutsssssstuvxz|~~~~~~~~~~~~~~~~~}}||{zzyxwwvuttssssttuvwy{|~~~~~~~~~~~~~~~}}||{{zyxxwvvutttssttuvwxz{}~~~~~~~~~~~~}}||{{zyyxwwvuuttttttuuvxy{|~~~~~~~~~}}}||{zzyxxwvvuutttttuuvwxz{}~~~}}}||{{zyyxwwvvuuttttuuvwxy{|~~~~~}}||{{zzyxxwwvvuuuttuuvvwyz{}~~~~}}||{{zzyyxxwvvvuuuuuuvvwxy{|~~~~~}}|||{{zzyyxwwvvvuuuuuvvwxyz{}~~~~~~}}}||{{zzyyxxwwwvvvuvvvvwxyz{|}~~~~~}}}|||{{zzyyxxwwwvvvvvvvwxxyz|}~~~~~~}}}|||{{zzzyyxxwwwwvvvvwwxxyz{|}~~~~~}}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~~~}}}}||||{{zzzyyyxxxwwwwwwxxyyz{|}~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxxyyz{{|}~~~~~~~~}}}}||||{{{zzzyyyxxxxxxxxxyyzz{|}~~~~~~~~}}}}}|||{{{{zzzyyyxxxxxxxxyyzz{||}~~~~~~~~}}}}}||||{{{zzzzyyyyyxxxxyyyzz{{|}~~~~~~~~~}}}}}||||{{{zzzzyyyyyyyyyyyzz{{|}}~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyzzz{||}~~~~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyyzzz{{|}}~~~~~~~~~}}}}}}||||{{{{zzzzzzyyyyyzzzz{{||}~~~~~~~~~~~}}}}}|||||{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzz{{||}}~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~}}}}}}}|||||{{{{{{zzzzzzzz{{{{||}}~~~~~~~~~~}}}}}}||||||{{{{{{zzzzzz{{{{{||}}~~}zytonkgeeb`bbabcdehknqrvz~{wrnifb_^]^_`abfimquwy}~|xtplhd`[XTQNLLJIHGGGGHIJLMOSVZ^cjr}qgkq~~}}}~~|yvspnjgeca_^]\\\]^`abegjmortvy{}~}|zywvusrsssssstvwz|xlcbl~~vqopqsuvy{}~~~}||{{{{{{|}~{rkgip|yrmifedcbbbbabbbaaa````__^^^____`aacdfhiknpruxz}wohdchr~xrmifedcbbbbbbbbaaaa```_______``abbdefhjlnprtwy|~yrjbZTRTZer}tld]YURQONMLLLLKKKKKJJJJIIIIIIIJJKLMNPQSUWY[^`cfhkmpsuxz}xqjdabfo|}wspomllkkkllllmmmmnnnnoooppqrstuwxz|}~ywy}{ywvuttsssrrrqqqqpppppppqqrrstuwxy{}{slgddgoy|upkifdb`_^^]]\\[[[ZZZZZYYYYZZZ[\]^_`acefhjlnpruvy{|~~ztnhaZTPNPV_jvyrjd_[YVTRQPOOONNNNNNNNNNNOOOPPQRSTUWXZ\^`bdfiknpsuwz|~zsmhcaaemw|wtromlkjiiiiiiiijjjjkkklmmnopqrtuwy{}~yutv{|zxwuutssrrrrrqqqqqqrrrsstuvwxy{|~|vojeccflu{uqnkhecb`_^^]]\\[[[[[[[[[[[\\]^_`abdeghjlnpqsuwy{|~}yupjd^YTQQRW^hs}zsnheb_\ZXWVUTTTSSSSSSTTTTUUVWXYZ[\^_abdfhjlnpsuwy{}zuojeb`aejs}|zwsqomlkjjjiiiiijjjjkklmmnopqstuwyz|~}xtqqsw~|zxwvutssrrrqqqqqqrrssttuvwxyz|}|wqlgdbcfkr{{xuqmkhfecba``__^^^^^^^^^__``abcdefhiklnoqrtvxy{|~}zvrmhc^YVSSUY_gpy{vqnkgdb_^\[ZZYYXXXXXXYYYZZ[\]^_`abdegijlnprsuwy{}~yupkgca`adipy|xvsqpommllkkkkkklllmmnopqrstuwxz{}~|wspnnptz}{zxwutrqpnmkjiihggffffgggiijlmoqsuwxz}~yuqmkkknrx}|zyxxwwwvuuuutttssssrssrrrsstuuvwxy{|}}{yvsolhd`]ZXWWZ^dkt}}|{zyxwwwwvvvvvvvvvvwwxxxyzz{|}~~zwsqpoqty~|{yxwvuuttsrrqqpppoooooooooppqrsstuwxyz{}~}zwtqnkhecaabdhmsz|yxvuttssssssssssttttuuvvwxyyz{|~{xurpnmnosw{~zwtrpnnmlkjjjjiiiiijjjkkllmnopqrstuwxy{|~|yvspnlkklnrvz~{xusqponmllkkkkkkkkkkllmmnoopqrstuvwxz{|~}{xuroljhgfghjmqvz~zvspmkjhgfeddcccccbccccdddeffghijklmnoqrstvwxz{|}}{yvtqomkjijkmpsx|~|zxwuttssrrrrrrrsssttuuvwxyyz{|~~{yxwvwxz}~|{zyxwwvvvvvvvvvvvwwwxyyz{{|}~|zxusrppoprtvz}~|ywutrqpoonnmmmmmmmmmnnnooppqrrstuvwxxyz{|}~~|zxvtqomkihggghjloruy|}zwusqonmlkjjiiihhhhiiiijjkkllmnoppqrstuvwxy{|}~~|{ywusqpnmmmnoqtwz}}|zyxwvvuuuuuuuuuuvvwwxxyyz{||}~~}{yxxwxxz|~~}|{{zzzyyyyyyzzzz{{{||}~~~|zxvussrrrstvy{~}{zxwvttsrrqqqqppppqqqqrrrssttuuvwwxyzz{||}~~|{zxwusrpnmkjjjjklmortwz}~|zxvusrqppoonnnnnnnnnnoooppqqrrsttuvwxxyz{||}~~}{zxwutsqqpoppqrtvy{~~|{{zyyxxxxwwxxxxxyyyzz{{||}~}|{yyxxxyy{}~}}|||||{{||||||}}}~~~}{zxwvutssttuvxz|~}|zyxwwvuuutttttttttttuuuvvvwwxxyyzz{{||}~~~}|{zyxwutsqponmllmmnoprtvx{}}|zyxwvutsssrrrrrrrrrrrssstttuuvwwxxyzz{{|}}~~~}|{zyxwvutsrrqqrrstvxz|~~}}|{{{zzzzzzzzzz{{{|||}}~~~|{zzyxxxyyz{}~~~}}}}}}}}}}~~~~~}|{zxwvvuutuuuvxyz|~~}|{zzyxxwwwwwvvvvvwwwwwxxxxyyyzz{{{||}}}~~~~~}}|{zzyxwvusrqqpoonooopqrtvwy{~}|{zyxxwvvvuuuuuuuuuuuuvvvwwwxxyyyzz{{||}}~~~~~}||{zyxwvuutsssssstuvwy{|~~}||{{{zzzzzzzzzzzz{{{||||}}~~~~~}|{zyxxwvuuttttuuvwyz|}~~}||{{{{zzzzzzzzz{{{{{|||}}}~~~~~}||{zyxwwvuuuttuuvwxy{|~~}}||{{{{{{{{{{{{{{{||||}}}~~~~}||{zyxxwvvuuttuuvvwxz{}~~~}}|||{{{{{{{{{{{{||||}}}}~~~~}}|{zzyxwwvvuuuuuuvwxyz|}~}}}||||{{{{{{{{|||||}}}}~~~~~~}||{zyyxwwvvuuuuuvvwxy{|~~~}}}|||||||||||||||}}}}}~~~~~~}||{zzyxxwwvvuuuuvvwxyz{}~~~~}}}|||||||||||||}}}}}~~~~~~}}|{{zyyxwwvvvuuuvvwwxyz|}~~}}}}}|||||||||}}}}}}~~~~~~~}}||{zzyxxwwvvvvvvvvwxxz{|~~~~}}}}}}}|||}}}}}}}}~~~~~~~~}}||{{zyyxxwwvvvvvvvwwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~~~}}||{{zzyyxxwwvvvvvvwwxxyz|}~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}||{{zyyxxwwwvvvvvwwwxyz{|}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}}||{{zzyyxxwwwvvvvvwwxxyz{}~~~~~~~}}}}}}}~~~~~~~~~~~~~}}|||{{zzyyxxwwwvvvvwwwxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{zzyyxxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}||{{zzzyyxxwwwwwwwwwxxyzz{}~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzyyxxxwwwwwwwwxxyyz{|}~~~~~~~~~~~~~~~~~~~~~}}}}|||{{zzzyyxxxxwwwwwwxxxyz{{}~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzyyyxxxwwwwwwxxxyyz{|}~~~~~~~~~~~~~~~~}}}}|||{{{zzzyyyxxxxwwwwxxxyyz{|}~~~~~~~~}}}}}|||{{{zzzyyyxxxxxxxxxxyyzz{|}~~~~~~~~~}}}}}|||{{{zzzzyyyxxxxxxxxxyyzz{|}}~~~~~~~~~~}}}}}||||{{{zzzyyyyxxxxxxxxyyyz{{|}~~~~~~~~~~~~}}}}||||{{{{zzzyyyyyxxxxxyyyyzz{|}}~~~~~~~~~~~~}}}}}||||{{{zzzzyyyyyyxxyyyyyzz{||}~~~~~~~~~~~~}}}}}||||{{{{zzzzyyyyyyyyyyyyzz{{|}}~~~~~~~~~~~}}}}}}||||{{{{zzzzyyyyyyyyyyzzz{{||}~~~~~~~~~~~}}}}}}|||||{{{{zzzzzyyyyyyyyzzz{{||}}~~~~~~~~~~~~}}}}}}||||{{{{{zzzzzyyyyyyyzzzz{{||}~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzyyzzzzzz{{||}}~~~~~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzz{{||}}~~~~~~~~~~~~}}}}}}}|||||{{{{{zzzzzzzzzzzzz{{{||}~~~~~~~~~~~~~}}}}}}||||||{{{{{zzzzzzzzzzzz{{{||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{zzzzzzzzz{{{{||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{zzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}}}||||||{{{{{{{{{{{{{{{{{|||}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{||||}}~~~~~~~~~~~~}}}}~~~|{{{ywxvtvwvvvwwz|~t{|wrmfb^[YWVUTVWZ]acgkosvz|~~|yvsplifb`\[YXXVUUUUUVVWXZ[]acgkqwlytnx{uspquy~}yvtqokhfca^\ZXWVVUVVWXZ\^bdgjmpruxz}~~}~xmfiw{urqqsuvxz}~~~~~~~yof`]bky~tlfb_^]\\[\]]]^^__```````aaaabbcdefghikmoqsvxz}wof`]_ep~}umhc`_^]]]]]]^^____````````aaabbcddfghjkmoqsvwz|~}wog_VOJJMUao{ypg_XRNKJIGGGGGGHHHIIIJJJJKKKLLMNNOPQSTVXZ\^`behkmpsux{}~vngb`bis~xtpnmlkkkkllmnooppqrrsstuuvwxyz{|~|vrqt{{wusqpoonnnooooooopppppqqqrrsttuvxyz|~yqjc^\]bkvwpjeb`][ZYXXXXXXXXXXXXXYYYYZZZ[\\]^_abdegijmoqsuwy{}~ytnhaYRMIIMT^iu~~wphb\XUSQONMMMMMMMNNOOOPPQRRSTTUVWYZ[]_`bdgiknpsuwz|~wpjea_afny|wsqomkjjiiijjjkkllmnnoopqrstuvwyz|}~wsppsy}{xvtsrqppppppppppqqqrrrsttuvwxyz|}~{tmga]\]ahr|}wqlhfc`^][[ZYYYYYYYYYYYZZZ[[\]^^_`bcdfgiklnprtvxz{}~zvqke_YSOMMPV^hs|yrlgb`]ZXVUTTSSSSSTTTUUVVWXXYZ[\]_`acefhjlnpruwy{}~xrlgc`_aelu|yvsqomlkkjjjjkkkllmmnoopqrstuwxy{}~}xsommpu||ywutsrqqppppppqqqqrrsstuvwxyz{|~{upje`]\^agox}xspmigdba`_^]]\\\\\\]]]^^__`aabcdfghjkmnprsuwxz|}~{wsnic^YTQPPSX^gpyzuplifc`^][ZZYYYYYYYYZZ[\\]^_`abcdfgijlnpqsuwy{}}xsniea__adjrz|yvsrponmmlllmmmmnnoppqrstuvwyz|}}xsolkknrx{xvspnkihgedba```_^___``abdegijloqtvy{}{wsponopqqw|zxwvutrqponnmlkkjjjjjjjklmnoprsuwyz|}}zxurokhecbbcdddhu~|{zyxvvuuuttttttttuuvwxyz{}~}yvspnlmr{}zxvtsqponmllkkjiiiiijjjkklmnoprstvwyz{}~~|yvrokgc`^]_dlu}|zywwvuttttttttttuuvvwxyz{|}~yupkgca`bekqy|yvtrpomlkkjjiiiiiijjjkklmnopqrstvwyz|}|xtokgda``cgmt||zwusqponmllkkkkkkkklllmnnopqrstuvxyz|}~}zwsokgc_\ZZ[^cipw~~{xvsqnlkihfeedcccccccccdddefgghiklmnoqrsuvxy{|}~{xtqmifcaaadhmt{~|{yxwvuuttttttttuuvvwwxyz{|}~}zvspmlkmoty~}{zyxwwvvvvuuvvvvwwwxyyz{|}~}zwspligeddfinsz~{ywutsqpponnmmmmmmmmnnnoopqqrstuvwxyz{|}~~|zwurolieb`^]\^`dintz}|ywusrponmlkjjjiiiiijjjkkllmnoopqrstuwxyz{|}~~{yvsqnkhfedegjnty}|{zyxxwwvvvvvwwwxxyyzz{|}~~{xusqonnoquy~~}||{{zzzzzzzzzz{{||}}~}{xvspmkihghilotx~~|zywvutssrrqqqqqqqqqqrrrsstuuvwwxyzz{|}}~~}{yxvsqoligecaaabdgjoty}}{yxvutsrqqppoooooooooppqqrrsttuvwxxyz{|}~~}{zwusqnljihhhjlptx}~}||{zzzyyyyyyyzzz{{||}}~~|ywusqpopqrux|~~}}}|||||||}}}~~~}{ywusqomkjjklnqtx|~}|zyyxwvvuuutttttttuuuuvvwwxxyyzz{||}}~~~}|{zxwusqomkigfedeegilptx|}|{yxwwvuuttssssssssstttuuuvwwxxyzz{||}~~~}{zxvusqomlkjjklnqtx|~~}}||||{{{{||||}}}~~~|zxvusrqqqrsvx|~~~~~~~~~~}|zxwusqpnmmmmnprux{~}|{zzyyxxxwwwwwwwwxxxxyyyzzz{{||}}}~~~~}|{zywvtsqpnmkjihhhijlnqtx{~~}|{zyyxxwwwvvvvvvvvwwwwxxxyyzz{{||}}~~~}|{zywvtsqponmmmmnprux{~~}}|||{{{{{{{{{{||||}}}~~~}|zyxvusrponnnnopqtvy|~}}}|||{{{{{{{|||||}}}~~~~}|{zxwutsqpoonnopqsux{~~~}}}||||||||||||}}}}~~~~}|{zywvusrqpoooopqrtwy|~~~}}}||||||||||}}}}~~~~}|{zyxwutsrqpooooprsux{}~~}}}}}}|||}}}}}}}~~~~~~}|{zxwvutsqqppoppqsuwy|~~~~}}}}}}}}}}}}}~~~~~~~}|{zyxwvtsrqqppppqrtvxz}~~~~}}}}}}}}}}~~~~~~~}|{zyxwvutsrqqppqqrsuwy|~~~~~~}}}}}~~~~~~~~}||{zyxwvutsrqqqqqrstvxz}~~~~~~~~~~~~~~~~~}}|{zyxwvutssrqqqqrstuwy{~~~~~~~~~~~~~~~}}|{zyyxwvutsrrrqrrstuwxz|~~~~~~~~~~~}}|{{zyxwvuutssrrrrssuvxy{}~~~~~~~}||{zyxxwvuttsrrrrsstuwxz|~~~}||{zzyxwvvutsssrrsstuvxy{}~~}}|{{zyxxwvuutsssssstuvwyz|~~~}}||{zyyxwvvuuttsssstuuwxz{}~~}}||{zzyxxwvvutttsssttuvwyz|~~~}}||{{zyyxwwvuutttttttuvwxz{}~~~~}}||{zzyxxwvvuuttttttuvwxyz|~~~~}}||{{zyyxwwvvuuutttuuvvwyz{}~~~~}}||{{zzyyxwwvvuuuuuuuvvwxy{|}~~~}}}||{{zzyxxwwvvvuuuuuvvwxyz{}~~~~}}}||{{zzyyxxwwvvvvuuvvvwxyz{|}~~~~}}}|||{{zzyyxxwwwvvvvvvwwxxyz{}~~~~}}}}||{{zzzyyxxwwwvvvvvwwxxyz{|}~~~~~}}}|||{{zzyyyxxwwwwwwwwwxxyz{|}~~~~~~}}}|||{{{zzyyyxxxwwwwwwwxxyyz{|}~~~~~}}}}|||{{zzzyyyxxxwwwwwxxxyyz{|}~~~~~~}}}|||{{{zzzyyyxxxxxwxxxxyyz{{|}~~~~~~}}}}|||{{{zzzyyyxxxxxxxxxyyzz{|}~~~~~~~}}}}||||{{{zzzyyyyxxxxxxxyyzz{||}~~~~~~~}}}}|||{{{zzzzyyyyyxxxxyyyzz{{|}~~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyyzz{{||}~~~~~~~}}}}||||{{{zzzzyyyyyyyyyyzzz{||}~~~~~~~~}}}}}||||{{{zzzzzyyyyyyyyzzz{{|}}~~~~~~~~}}}}||||{{{{zzzzzzyyyyyzzzz{{||}~~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzzz{{||}}~~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzz{{|||}~~~~~~~~~}}}}}}||||{{{{{zzzzzzzzzz{{{{||}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzz{{{{||}}~~|xuspnllkllllmnoprsuwy{}~lur{xtojea\XSOKHECBBBCEHKOTY_djouz~}zxvvvttsrrrssttuvx{|{}|{z{|}qivqd_`cfjlpoopqqoonljhfca]YWUROMKIGFDCCCCDEGILORVZ^bgkptx}yz{yxyzz{}}~~}|yxwutsrqpoooooppqsuwy{}ypg`^ajwvngc`^][[Z[[[[[[[[[[ZZZZZZZZ[[\]^_abdfhjmorux{~zqib_`fp}vnhc_^\[ZYYYYYXXXXWWWWWVVVVVVWWXXZ[\^`acfhjmortwy||vog^VOJHLT_myzqh`YSOKJIGFFFFFFFFGGGGGHHHIIJJKLNOPRTVX[]`beiloruy|{tnlms}|xutsqqppppppppqqqqqqqqrrsttuwxy{}{uqpsz~ytrpnlkjiihhhgggggffffffggghijklnoqsuwy{~woha\YZ_gr~}umgb^\YWUSRRQQPPPOOOOOOOOOOPPQRRTUVXY[]_acehjmortvy{}|wrkd]VPMLOV`kw{tle`[XVSQPONNNNMNNNNNOOPPQQRSTUVXY[\_acehjmoruxz}ysmiginv~ywtrpnmmlllllllllmmmmnnopqrstvwy{}xspprx{yvspomlkkjiiiihhhhhhhiijjklmnpqrtvxz|~~xqkd_[YZ^enxzsnhdb^[YWVTTSRRQQQQQQQQQRRSSTUVWXZ[]_`bdgikmoqtvxz|~~ytoic]WSPPSX`ju|vpjec`]ZXWVUTTTSSSTTTUUVVWXYZ[\]_abdfhjloqsvx{}ytnjfegkqz}{wtrponmllkkkkkkkllmmnopqrstvwyz|~ytpnnpu|~zwtrpomllkjjjjjiijjjkkllmnoprstvwy{}~ysnhb^[Z[^dkt~{upmieb`^\ZYXWWVVVUUVVVVWWXYYZ[\^_abdegikmoqsuwxz|~~zvqlga\XTSSUZ`ir{}xrnlheb`^\[ZZYYXXXYYYZZ[\\]^_abcefhjlnprtvxz|~~ytokgedfiov|yvtrqoonmmmmmmmmmnnopqrstuvxy{}~|wspmlkklnsz}ytpkgda_]\[ZYYYYYYZ[\]^_abdfhklnpsvx{|~}xsomllnsyyrpuoiklmmllkjiiiijiiijjklllmnnopqqrsttuvwxyz{|~}yuplhecbceiov}|x|}vrrstuuvvwwwxxyyzz{|}}~zvspnmnpty{vtvwvqlhfeeeeeeeefffffggghhiijjklmnopqrstuvwyz{}~{xtqnljjjlpu{}zwusrqqqqqrrrsttuvwwxyz{|}}{wtpmkjijmpu{{ywvvvvutrpnljhhgggggghiijkklmnoqrstuwxy{|}{xuromkjklosx~|zyxxxxwusqomkjiihhhhiiijkklmmnopqrstuwxyz{|}~~{xurolifeccdfimrx}|xvsqpppponmkigedbbaaaaabbccdefghijklmnoqrstvwxz{|}}zxusqonnnpsv{~|{ywvuttttttuuuvwxxyz{|}~|zxvvuvx{~}{ywvutsssssssttuuvvwxyyz{|}~}zxusqonnnoqtx|}|{{{zzywvtrpomlkkkjjjjkkkllmmnoopqrsstuvwxyzz{|}~~}{ywuspnljhggghilorw{}{yxwwwwwvutrqomlkjiiiiiijjjkklmmnopqrstuvwwxyz{|}~}{yxvtsqqqqrtwz~~|{yxxwwwwwwwwxxyyz{{|}~~~|{yxxxyz|~}{zyyxxxwwxxxxyyyzz{||}}~}{yxvtsqqpqrsux{~~~~}|{zxwutrqppooonnnnoooppqqrrsstuuvwwxyyz{{|}}~~~}|{zxvusqpnmlkkklmoqtwz~~}||||||{zyxwutsrqppooooooopppqqrsstuuvwxxyz{{|}~~~|{yxvutssstuvxz}~}|{{zzyyyyzzzz{{||}}~~|{zzyyz{}~}||{{{zzzz{{{{|||}}~~~|{yxwuttssstuwy{}}|{yxwvuttssrrrrrrssssttuuuvvwwxxyyzz{{||}}~~~~}}|{zyxvutsqpoonnnopqsuwz|~}|{zxwvuuttsssssssstttuuvvwwxxyyz{{||}}~~}|{zyxwvvuuuuvwy{}~~}}|||||||||}}}~~~}|{{zzz{|}~~~}}}||||||}}}}}~~~~}|{yxwwvuuuuvwxy{}~}{zyyxwwvvvvuuuuvvvvvwwwxxxyyyzzz{{|||}}}}~~~~~~~~~~~~}}||{zyyxwvutsrrqqqqqrstvxy{}~}|{zyyxwwwvvvvvvvvwwwxxxyyzzz{{||}}}~~~}||{zyxxwwwvwwwxy{|~~~}||{{{zzzzzzzz{{{{|||}}}~~~~}||{zyxxwwvvvwwxy{|~~}}||{{{{{z{{{{{{{||||}}}~~~~}}|{zzyxxwwwwwwxyz{}~~~}}||{{{{{{{{{{{||||}}}}~~~~~}|{{zyyxxwwwwxxyz{|}~~}}||||{{{{{||||||}}}}~~~~~~}||{zzyxxxxwwxxyyz{}~~~}}}|||||||||||||}}}}~~~~~~~}}|{{zyyxxxxxxxxyz{|}~~~}}}|||||||||||}}}}}~~~~~~~}}||{zzyyxxxxxxxyzz{|}~~~}}}}||||||}}}}}}}~~~~~~~}}||{{zzyyyxxxxxyyz{|}~~~~}}}}}}}}}}}}}}}~~~~~~~~}}}|{{zzzyyyxxxyyyzz{|}~~~~}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyyyyxxyyyzz{||}~~~~~}}}}}}}}}}}~~~~~~~~~~~}}|||{{zzyyyyyyyyyzz{|}~~~~~~~}}}}}}}~~~~~~~~~~~~}}}||{{{zzzyyyyyyyzz{{|}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzzyyyyyyyzz{{||}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzyyyyyyzzz{{|}}~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{zzzzzzzzzzz{{||}}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{zzzzzzzzzzz{{{||}~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzzzzzzzzzz{{||}}~~~~~~~~~~~~~~~~~~~~}}}}}|||{{{{zzzzzzzzzz{{{||}}}~~~~~~~~~~~~}}}}||||{{{{zzzzzzzzz{{{|||}}~~~~~~~~~~~~}}}}||||{{{{zzzzzzzzz{{{{|||}}~~~~~~~~~~~~}}}}}||||{{{{{zzzzzzzz{{{{||}}}~~~~~~~~~~~~}}}}}|||||{{{{{zzzzzzz{{{{|||}}}~~~~~~~~~~~~}}}}}}||||{{{{{{zzzzz{{{{{|||}}}~~~~~~~~~~~~~}}}}}|||||{{{{{{zz{{{{{{{{|||}}}~~~~~~~~~~~~}}}}}}|||||{{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{||||}}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{|||||}}}~~~~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{|||||||}}}}~~~~~~~~~~~~~}}}}}}}||||||||{{{{{{|||||||}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||}}}}}~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||}}}}}}~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m36.bin b/applications/PoP/poc/res/music/m36.bin deleted file mode 100644 index 66f4253..0000000 --- a/applications/PoP/poc/res/music/m36.bin +++ /dev/null @@ -1 +0,0 @@ -zvqnlhda_[YYVTTSRRRRRSUVXXZ]_beihkoquy|{}~{vusrppmjjihhhgeeeeeffdddedddbbba``_]\\ZZYXWWVUUTTTTTTUVVWXYZZ[]_`bcegjmpsvz}~yw~~}{zwutsqpomkjiihgedddcccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccddeefghijklmopqstuwxxyyyxwutssuy}~~~~~~}}}|}}||||||}}}}}}}~~}{yxwxy|}{yxwvvuuuuutttttttsssssrrrrrrqqqqqqqqqqqrrrrssstttuuuvvvwwwxxxxxxxyxyxxxxxwwwvvvvuuuuttttsssrrrqqpoonlkigec`^]\\]_adgikkkihfca_]\[ZYXXWWWWWWWWWWWWWWWWWWWWWWWXXXXXYYZZ[[\\]^^_`abccdefghiijklmmnoopqrrssttuuvvwwwxxyyzz{{||}}}~~~~~}||{yxwuutuvy{}|zyxxy{}}{zxwutssrqqpppooonnnnmmmlllllllkkkkkkkkkkkllllmmmmnnnooopppqqqqqqqrrrrrrrrqqqqqqqppqqpppppooonnmmlkjihfeca_^]\]]_adfiklmmmlkigfdca``_^^^]]]]^^^^^^^^^^^_____```aaabbccddeffghhijkklmnnopqrrsttuvvwwxyyyzz{{{|||}}}~~~~~}||zyxwvuuuvxz}}{zyxxyz{}}|zywvutssrrqqppoooonnnmmmmmmmmlllllmmmmmmmmnnnnoooppppqqqrrrrrssssssssssssssssssssssssrrrrqqpponnmkjigfecbaaabcdfikmoqrrrqponmkjihgfeeddcccccccccddddddeeeeefffgghhhiijjkllmmnoopqqrsstuuvvwxxyyzz{{|||}}}~~~~~}|{zyxwvuuuvwy{~~|{zyxxyy{|~}|{yxwvvuttssrrrqqqppppppoooooooooopppppppqqqqrrrrssssttttuuuuuvvvvvvvvvvvvvvvvvvuuvxy{}~|zxvutrqpoonnnnmmmmnnnnooppqrrstuuvwxyz{|}~}~}|{zyxwvuttsrqqpooonnmmmmmmmmnnnooppqqrssttuuvwwwxxyyyzzz{{{|||}}}~~~}|}~}~~}|{yxwvvutssrqqppooonnnnmmmmnnnnoooppqqqrrsttuuvwwxxyyzz{{||}}~~~}||||}~|{zzzz{|}~~}}||{{{zzzzzzzyyzzzzzzzz{{{|||}}}~~~}|zyxwvvwwxz{|}~~}||{zzyyxxwwwvvvvvvvvvvvvvvvvvvwwwwxxxyyyzzz{{{{|||}}}}}~~~~~~~~~~~~~~~~~}}}|||{{zyxwvutrqponmmmnopqrsuvvwxyyzzzzzzyyxwwvuutssrrqqqpppppppppppppppqqqqrrsssttuuvvwwxxyzz{{||}}~~~}|{zzyyzz{|~~}{zyxwwvvvwxyz{|}~~}}|{{zyyxxwwwvvvuuuuuuuuuuuuuuuuuuvvvvwwwwxxxxyyyzzzz{{{{{||||||||||}}}}||||||||{{{{zzyyxwvutsrqqpooooppqrtuvwxyzz{||||||||{{zzyyxxwwvvuuutttttttttttttttuuuuvvvwwwxxyyyzz{{{||}}}~~~~}|{zzyyyyzz{}~~}|{zyxxwwwwwxyy{|}}~~~}||{{zzyyyxxxwwwwwwwvvvvvvwwwwwwwwxxxxxyyyyyzzzzz{{{{{|||||||}}}}}}}}}}}||||||{{{zzyyxxwvuutsrrqqqqrrstuvwyyz{||}}}~~~~}}}}||{{{zzyyyxxxxwwwwwwwwwwwwwwwwxxxxyyyyzzz{{{|||}}}~~~~~~}|{{zzyyyyzz{|}~~~}||{zyyxxxwxxxyz{|}~~~~}}||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyyyzzzzzz{{{{{{||||||||}}}}}}}}}}}}}}}|||||{{{zzyyxxwwvuuttssssssttuvwxyz{||}~~~~~~~}}|||{{{zzzzyyyyyyyyyyyyyyyyyyyzzzzz{{{{||||}}}}~~~~~~}}||{{zzzyyzzz{|}~~~~~~~~}}||{zzzyyyyyyzz{|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyyyyyzz{|}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzzyyyyyzz{||}~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzzyyyyyzz{{|}~~~~~~~~~~~~~~~~~~~~~}}||{{{zzzyyyzzz{{|}~~~~~~~~~~~~~~~~~~~~}}||{{{zzzyyyzzz{{|}}~~~~~~~~~~~~~~~}}|||{{zzzzzzzzz{{||}~~~~~~}}|||{{{zzzzzzzzz{||}~~~~~}}}||{{{zzzzzzzzz{{|}}~~~~~}}}||{{{zzzzzzzzz{{||}~~~~~}}}|||{{{zzzzzzzz{{||}~~~~~~}}}|||{{{zzzzzzzz{{||}}~~~~~}}}|||{{{{zzzzzzz{{||}}~~~~~~}}}|||{{{{zzzzzz{{{|||}~~~~~~}}}}||||{{{{zzzzz{{{{||}}~~~~~}}}}||||{{{{zzzzz{{{{||}}~~~~~~~}}}||||{{{{{{zzz{{{{||}}~~~~~~~}}}}||||{{{{{{{{{{{{|||}}~~~~~~~}}}}|||||{{{{{{{{{{{|||}}~~~~~~~~}}}}}||||{{{{{{{{{{{|||}}~~~~~~~~}}}}}|||||{{{{{{{{{{|||}}~~~~~~~~}}}}}||||||{{{{{{{{||||}}}~~~~~~~~}}}}}}||||||{{{{{{{||||}}}~~~~~~~~~}}}}}}|||||||{{{{{|||||}}}~~~~~~~~~~~}}}}}}||||||||||||||||}}}~~~~~~~~~~~}}}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}}|||||||||||||||}}}}~~~~~~~~~~~}}}}}}}||||||||||||||}}}}~~~~~~~~~~~}}}}}}}}|||||||||||||}}}}~~~~~~~~~~~~}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~~}}}}}}}}|||||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}}||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}}|||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~}zvsqprwy|}}}~~~~}}|{zyxwwwvtssrrsrpoonpqpnnopqstrsuvxy{y{}~{~u{|zyxwvusppnmljgeca`^\YVTRQOMJHGFFEEDDEFGIJLNPSVX[^`cfhkmortuwxyz{||||}~xrqu~zrlgdbbabbba``___^][[ZYXWUSRQPONLKJIIHHGFFGGGHIIJLMOPSTVX[]_acfhjmoqsuvxz|}~{z{}}|{{{zzzzzzzzzzzyyyyyxxxxxxwwwwwwwxxxyyzz{||}~~{xtqnljjlosx}~{xtromkjihhggfffeeedddccbbaa``___^^^^]]]]]]]]^^^__``aaabbccddeeffgggggggggggffffeedddccccbbbbaaaa``__^]\[YWTQNKIFEEFIMRW\_aba_]ZWURPONMLLLLMMMMNOOOPPPQQQRRSSSTUUVVWXYZ[\]^_`bcdfhiklnoqrtuwxz{}~~|zxvsoligedcdgjmruy{||zxvspmkhfdcb`__^]]\\\[[ZZZYYYXXXWWWWWWWWWWWWWXXXYYZZ[[\]]^^_``abbccddeefffffgggggggggggffffgfffffeeeddcb`_][YWURPONNOQUY]bfikmmljhfdb`^]\[ZZYYYYYYZZZ[[[[\\\]]^^__``aabccdefghijklnopqstuwxyz{}~}|zxvtqoljgfedefikosvy{|}|{ywtromkigfdcbaa`__^^^]]]\\\\[[[[[[[[[[[\\\\]]]^^__``aabccddeffgghhiijjjkkkkllllllllllllllllllkkkjiihgedba_][YWVUUVXZ]aeimprstsrqomljhgedcbbaaaaaaaaaaabbccccddeeffgghhijkklmnopqrstuvwxyz{|}~~}||}~~}{zxvtrpmkihggghjmpsvy{}}|zxvtrpnmkjihgfeeddccbbbbaaaaaaaaaaaaaabbbbcccddeeffgghhiijkklllmmnnooooppppppppppqpppppppooonmlkjihfecb`^][[ZZ[\^`cgjnqtvwxxxwvusqpnmlkjihhgggffffffggggghhhiiijjkklmmnoopqrrstuvwxyzz{|}~~|{zzz{|~}}||}~~}||{{{zzzzzzzz{{{{||}}~~~|yvtqnlkiggfghjlorux{}~~~}|{zyxxxwxwvwwwxxyxyyzz{|{||}~~~|zywussrssuvwz|~~}|{zzyxwuttsrponmlkjihhgggffffffgghiijklmnpqrtuvxy{|~~~~}}|{{zzyxwvutsqpomlkihhgffghjlnqtw{~~|{yxvutsrqqqppppppqqqrrrssttuuvvwxy{}~{|}{{|}~~~~}}|{{zyyxwvutsqponmlkkjjjkklnprtwz~~}|{zyxwvvvvvwxz{}~~}}|||{{{{{{{{{{{{{zzyxwvutstuvx{}~~}|zzyyxxxxxxxxxxxxxxxxxxxwwwvvuuttssrqpoonmlkjiihhhijklnpruwz|~}|{{zzyyyxxxxxxxxxxxxxxxxxxwwvuttssstvxz}~~}}||{{{{||||||}}}}}}}}}}||||{{zzyyxwwvuttsrrqqqqqrstvwy|~~~~~~~~~}}||{zyxxxyz|~~~~}}|{{zyyxwwvvvuvvwwyz|~~}||{zzyyxxxyyz{}~~~}|{zyyxxxyz|}~}}|||{{{{{{{{{zzzzzyyyxxxwvvuutssrqqpoonnnmnnnoprsuwy{}~~}}|||{{{{{{zzzzzyyxxwvvuttssstuvxz|}~~~}|{{zzzyyyyyyyyyyyyyyxxxxxwwwvvuuttssrrqqppooooppqrsuwy{}~~}||{zzyyyz{|~~~~}}||{{zyyxxxwwwxxxyz{}~~~}}||{zzyyxxxxxxxyzz|}~~}}|{zzyyyz{|}~~}}|||{{{{{zzzzzyyyxxxwwvvuuttssrrqqqppppqqrstuvxy{|~~~~}}}}|||{{zzyyxwwvuutttuuvxy{|~~~}||{{zzyyyyxxxxxxxxwwwwwvvvvuutttssrrrqqqqqqqqrrstuwxz{}~}}||{zzzzz{|}~~~~~~~}}}}|||{{zzzyyyxxxxxxxyyz{|}~~~}}}||{{zzzyyyxxxxxyyzz{|~~}|{{zzzzz{|}~~~}}||{{{{zzzzyyyxxxwwwvvuuuttsssrrrrrrrsstuvwxy{|}~~}}}||{zzyxxwwvvvvvvwxz{|}~~~}||{{zzzyyyyxxxxxxwwwwvvvuuutttssssrrrrrrssttuvwxz{|~~}}||{{zzzz{|}~~~~~~}}}}}||||{{{zzzzyyyyxxxxxyyzz{|}~~~}}}}}}~~~~}}}||||{{{{zzzzz{{{|}~~~~~~}}}||||{{{zzzzyyyxxxwwwwvvvvvvvwwwxyyz{|}~~}||{{zzzz{{|}~~~}}}||||{{{{zzzzyyyxxxxwwwwvvvvvvwwwxyyz{|}~~~}}|{{{zzz{{|}~~~~}}}|||{{{{zzzyyyyxxxxwwwwwwwwwwwxxyyz{|}~~}}||{{{z{{{|}~~~~}}||||{{{{zzzyyyyxxxxwwwwwwwwwwxxyyz{{|}~~~}||{{{{{{{||}~~~}}}|||{{{{zzzzyyyxxxxxwwwwwwwwwxxyyz{{|}~~~}|||{{{{{{||}~~~}}}|||{{{{zzzzyyyyxxxxxwwwwwwxxxyyzz{|}~~~~}}||{{{{{{{|}~~~~~}}}|||{{{{zzzyyyyxxxxxxwwwxxxxxyyzz{||}~~~}}||{{{{{{{||}~~~~}}||||{{{zzzzyyyyxxxxxxxxxxxxxyyzz{||}~~}}|||{{{{{{||}~~~}}}|||{{{{zzzzyyyyxxxxxxxxxxxyyyzz{{|}~~~~}}||{{{{{{||}}~~~}}}|||{{{{zzzzyyyyyxxxxxxxxxyyyzz{{|}}~~~}}|||{{{{{{|}}~~~}}}|||{{{{zzzzzyyyyyyxxxxyyyyyzz{{||}~~~~}}|||{{{{{{||}~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyyzzz{{||}~~~~}}|||{{{{{||}}~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyzzz{{||}}~~~~}}|||{{{{{||}}~~~~}}}|||{{{{zzzzzzyyyyyyyyyzzzz{{||}}~~~~}}|||{{{{{|||}~~~~~}}}|||{{{{zzzzzzyyyyyyyyzzzz{{||}}~~~~}}||||{{{{|||}}~~~~}}}|||{{{{{zzzzzzzzzzzzzzzz{{|||}}~~~}}}|||{{{{|||}}~~~~}}}}|||{{{{{zzzzzzzzzzzzzz{{{|||}}~~~~}}}||||{{{||||}~~~~}}}}||||{{{{{zzzzzzzzzzz{{{{|||}}~~~~~}}||||{{{{|||}}~~~~}}}||||{{{{{{zzzzzzzzz{{{{|||}}~~~~~}}}||||{{||||}}~~~~~}}}||||{{{{{{{zzzzzz{{{{{|||}}}~~~~}}}|||||{||||}}~~~~~}}}|||||{{{{{{{{{{{{{{{{|||}}}~~~~}}}|||||||||||}}~~~~~}}}|||||{{{{{{{{{{{{{{{||||}}~~~~~}}}|||||||||||}}~~~~~}}}}|||||{{{{{{{{{{{{||||}}}~~~~~~}}}||||||||||}}}~~~~~}}}}||||||{{{{{{{{{|||||}}}}~~~~}}}}|||||||||}}}~~~~~~}}}}|||||||{{{{{|||||||}}}}~~~~~~}}}}||||||||}}}~~~~~~}}}}}|||||||||||||||||}}}}~~~~~~}}}}}||||||}}}}~~~~~~}}}}}}|||||||||||||||}}}}~~~~~~}}}}}|||||}}}}~~~~~~~}}}}}}|||||||||||||}}}}}~~~~~~~~}}}}}}||}}}}}~~~~~~~}}}}}}}||||||||||}}}}}}~~~~~~~}}}}}}}}}}}}}~~~~~~~}}}}}}}}|||||||}}}}}}}~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}yvsqnmkhfdcaaaaeiotwz|~}{{zyxxtrsrrqronoopqrqprstuxz{}}zwtqnjfeca`_\ZZYYXXUSSRQPPNLMNRV^emodIRlKHX_fhllllmmnoooppqqrssstttttsrqqponmlkjjihhhhijkmpruw{~Ƽñ}zwvtsqponnnmnnnnopqrttsqmg_UMGGN[gnld\SLGEEEFHJLNQQRSUVWYZ[[\\]]]]^^__``abbcdeghjlnprtwy|{vrpprx|xurpnnmmmmmmmmmmmnnnnmmmmmmmmmmmmmmnnnoppqrstuvwxy{|}|xtojd_[YXZ^dkrx|~|yuoje`\XVSRPOONNNMMMMLLLLKKKJJJJIIIIIIIIIIIJJKLLMNOPQRSTUWXYZ\]^_`abcddeffgghhhiiiiiiijjjjkkkklllmmmmmmmlkifd`\XTPLJJKOU]dlquvvsplhd`][YXWVVVWWXXYZ[\]]^_``abcddefghijklmopqstvxz{}~|zyxwvvuutttssssrrrqqqqppppppppppqqqrssttuvwxyyz{|}~~~}{zywtrnkgc^ZVSQPQUY_ekqtvvurnjea]YVTQONMLKJJJIIIIIIIIIIIIIIIIIJJJKKKLMMNOPQRSTVWXYZ\]^`abcefghijkklmnnoppqqqrrsssstttuuuuvvvuuttsrpnlifb_[XUSSTW\bhouz~~|yurnkhfdba``___```aabbccddeffghhijkklmnopqstuwxy{}~~|{yxwwvuutttsssrrrrrrrqqqqqqrrrrsstttuvvwxxyz{{|}~~}|{ywuspmjfc_[XUTSTVY^cinswyzywtqnjfc_]ZXVUSSRRQPPPPOOOOOOOOOPPPQQQRRSSTTUVWXYZ[\]^_`acdefghjklmnoppqrsstuuvvwwxxxyyyyyzzzzzzyyxxwutrpnkheb_\ZYXY[_ciouz~{xvspnljihgfffeeffffggghhiijjkllmnoopqrstuwxyz|}~}||}~|{yxwwvuutttsssssrrrrrrrsssssttuuuvwwxxyzz{||}~~~}{zxvtromjgd`^[YXWXZ\`dinswz}~~}|ywtqnkheca_]\[ZYXXWWWVVVVVVVVWWWWXXYYYZ[[\]]^_`abcdefghijklmnopqrsstuuvvwxxyyyzzz{{{{{{{{{{zzyxwvtsqomjhec`^]\[\^`dhmrx}|zwusqonmlkkjjjjjjjjjkkkllmmnnopqqrstuvwxyz{|}~~}|}~~{ywvutuwy}}{zxwuttsrrqqqqppppqqqrrrrssttuuvvwxxyz{{|}~~{ywtromlkkkmorvz~|{ywvvuttssrrrqqqqqrrrrrsssttuuvvwxxyzz{|}~~}xsnjgda_]\\^__`bb`bb_^]\XWVTSRRPOOPQSUUTWY]_cddhkpsxzz~~~~}vsnjfa\VSOLIGD@?=<;::999::;<=>@ACDFHIKMNPRTVWXZ[]_`bcdfgikmnpsuwy{}ztpmkhfefghjlmpsuwxxwvvtrolhda]ZWSPMKHFEDBA@????>???@ABCDFGHJLNOQSUVXZ\^_acegikmnprtwxz|~}yvsqpppqruw{~~|{zyxwwvvvvuvvwwwxxyz{{|}~~}zxwvvxy{||{zwsplifdcbabcegjmpsuwz{||||{zxvtsqomkihfedcba```_______``aaabbccdddeefffggghhhiiiiijjjjjjjjjjjjiiiiiihhhgfedb`^\YWTRPNMMNOQRSSRQNKHEB@>>=>?@CEHKNQTVXZ[\\\\[ZYXWVUTSRQPPPQQQQQRRSTUVVXYZ[]^_abceghjkmnoqrtuvxyz{|~~{xvtrpoopqrsttsrpnkhfca`_^__`bcegikmnopqqqponmljigfecba__^]\\[[ZZZZZZZ[[[\\]]]^^__``aabbbccdddeeffffggggghhhhhhhhhhggffedcb`^\ZXVTSQQQRSTVXYYYXWUSQONLLLLMOQSUWZ\^`bdeffggfffeddcbaa``______``aabbcdeffghijkmnopqrstvwxyz{|}~~~}~~}zxvtrponmmnopqrrrrpomkigfeddddefghiklmnopqqqpponmlkjihgfeddcbbaa``````````abbbcccdddeeffggghhhiiijjjjkkkkkklllllkkkkjjiihgfdcb`^\[YXWVVWXY[\^_```_^]\ZYYXXYYZ[]^`bdeghjkkllmmlllkkjjiiihhhhhhhhiiijjkklmmnopqqrstuvwxyyz{|}}~~}|{zzz{|}~|{ywusqponnnnopqrstttsrqponmlkkjkkklmnopqrrsssssssrqqponnmlkkjiihhhggggggggggghhhiiijjjjkkkllllmmmmnnnnooooooooooonnnmmllkjihgedca`^]\[ZZ[\\^_abcdeeeddcbbaaaabbcdefhijklmnooppppppppooonnnnnmmmnnnnnooppqqrrsttuuvwxxyzz{||}~~~}|zyyxxxxyz|~~|{zxwvutsssstuvwyz{|}}}}}||{{zzzz{{||}~~~~~~~~~~~~~|{zxwvutssssstuwxyz{|}}}}}}||{{{{{{||}~~~}|{zywvutssssstuvwyz{|}}~~~}}}|||||||}}~~}|{yxwvutssssstuvwxy{|}}~~~~~}}}}||}}}~~~}|{yxwvutsssssstuvxyz{|}~~~~~~~~}}}}}~~~~}|zyxwvutsssssstuvwxz{|}~~~~~~~~~~~}}{zyxwvutsssrrsstuvxyz{|}~~~~~~~}|{zyxwvuttssrrsstuvwyz{|}~~}|{zyxwvuutssrrsstuvwxy{|}~~~}|{zyxwvuutssrrssttuvxyz{|}~~~}|{zyxwvvutsssrssstuvwxz{|}~~}||{zyxwvvutssssssstuvwxyz|}~~~}|{{zyxwvvuttssssssttuwxyz{|}~~~}|{{zyxwwvuttssssssttuvwxz{|}~~}}|{{zyxwwvuttssssssstuvwxyz|}~~~}}|{zzyxwwvuttssssssstuvwxyz{|}~~~}||{{zyxwwvuuttssssssttuvwxy{|}~~~~}||{zzyxxwvuuttssssssttuvwxyz{}~~~}}||{zzyxxwvvuttssssssttuvwxyz{|}~~~}}||{{zyxxwvvutttsssssttuvvwyz{|}~~~}}||{{zzyxxwvvuuttsssssttuuvwxyz{}~~~}}||{{zzyxxwvvuutttssssttuuvwxyz{|}~~~~}}||{{zzyxxwwvuutttsssssttuvwxyz{|}~~~~}}||{{zzyxxwwvuutttsssstttuvvwxyz{}~~~}}}||{{zzyxxwwvvuutttssstttuuvwxyz{|}~~~~}}}||{{zzyyxwwvvuutttttttttuuvwxyz{|}~~~~}}}||{{zzyyxxwwvvuuttttttttuuvwxyy{{|}~~~~}}}||{{{zzyyxxwwvvuuuttttuuuvvwxxyz{|}~~~~}}}||{{zzzyyxxwwvvvuuuuuuuuuvvwxxyz{|}~~~~~~}}}||{{{zzyyxxxwwvvvuuuuuuuvvvwwxyz{{|}~~~~~}}}|||{{zzyyyxxwwwvvvuuuuuuvvvwwxyzz{|}~~~~~}}}|||{{zzzyyxxxwwvvvvvuuuvvvvwwxyyz{|}}~~~~~}}}|||{{{zzyyyxxxwwwvvvvvvvvvwwwxyyz{{|}~~~~~~}}}|||{{{zzzyyxxxwwwwvvvvvvvvwwxxyyz{{|}}~~~~~}}}}|||{{{zzyyyxxxwwwwwvvvvvwwwxxyyzz{||}~~~~~}}}}|||{{{zzzyyyxxxwwwwwwwwwwwwxxyyzz{||}~~~~~~~}}}||||{{zzzyyyxxxxwwwwwwwwwwwxxyyzz{{|}}~~~~~~}}}||||{{{zzzyyyxxxxxwwwwwwwwxxxyyzz{{||}~~~~~~~}}}}|||{{{{zzzyyyxxxxxwwwwwwxxxxyyzz{{||}}~~~~~~}}}}||||{{{zzzzyyyxxxxxxxxxxxxxxyyzzz{||}}~~~~~~}}}}||||{{{{zzzyyyyxxxxxxxxxxxxyyyzzz{{|}}~~~~~~~}}}}||||{{{zzzzyyyyyxxxxxxxxxxyyyzzz{{||}}~~~~~~}}}}||||{{{{zzzzyyyyyxxxxxxxxyyyyzzz{{||}}~~~~~~~}}}}}||||{{{{zzzzyyyyyyyxxxyyyyyyzzz{{||}}~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyyyyyyzzzz{{|||}}~~~~~~~}}}}}||||{{{{zzzzzyyyyyyyyyyyyyzzzz{{|||}}~~~~~~~}}}}}||||{{{{{zzzzzyyyyyyyyyyyyzzzz{{|||}}~~~~~~~~~}}}}}||||{{{{{zzzzzzyyyyyyyyyzzzzz{{{||}}}~~~~~~~}}}}}|||||{{{{{zzzzzzzzyyyyzzzzzz{{{{||}}}~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzzzzzzz{{{{|||}}~~~~~~~~}}}}}}|||||{{{{{zzzzzzzzzzzzzzzz{{{{|||}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzz{{{{{|||}}}~~~~{xurpoljhfedcbaa`````aabcddeghjkmlnoqsuvuwxz|}}~{wtqlgd`\ZXTPMKIGFDBA@@@???@@ABBCEGHKMLOQTVY[[^adgilloruxz}|}tpqkfgfbaba_``_`aaacdegikmpsvz}|yvsrqonlllllllkkkjjihggfghoxgsjj|zxvutsrrstvx{~z~vorsx~|zwurolhec`^[ZXVUTSSSSTVWY[^adhlosw{yz}zxyz|~|{zxxwvvuuuuvvxyz|~vkb]\akxxqib]YWUTSSSSTTSSSSSSSSSRRRQQQPPPPPQQQRSTUVXY[\^`bdgiknpruwy{}~zung_XPJGHLT`mx|uld]WRNKIHGGFGGGGHHHIIIIIJJJJJJKKLLMNOPQRTUWXZ\_acfhknpsvx{}zrjc^ZZ]dnzwpkfb`^\\[[[[\\\\]]^^^___``aabbcdefghjkmnpruwy{~|xvx~}zxwvvuuuuuuuuuuuuuuvvvvvwwxxyz{|}~xqkfdeioyztnjeb`]\[ZYXXXWWWWWWWWVVVVVVWWWXXYZZ[]^_`bdegikmoqsuwy{}}zuoic\VPLJJMS[eoy~wqjc^YUQOMKJIHHGGGGGGHHHHHIIIJJKKLMNOPQRSUWXZ\^`begilnpsuxz|~}xrlfa\ZZ\ais}}wrnjgdba`__^^^^___```aabbccdefghijkmnpqsuwy{}{vsrtx~|ywvtssrrqqqqqqqqqqqrrrssttuvwxyz{|~ztnifddgls{~xsnjgdb`_^]\[[ZZZZZZZZZZZZZ[[\\]^^_`acdegijlmoqstvxz|}|xsnic]XSOMMOSZbkt|{uoje`\YVTRPONNMMLLLLLLMMMNNNOPQRRSTUVXYZ\]_acefhkmoqsuwy{}~ytojea][[\_emu~{vroligfdcbbcbbbbbbccddeeffghijklnoprsuwxz|~{vrpoorw~~|ywvtsrqqqppppppppqqqrrsttuvwxyz|}~|vqlhecceiov}}yuqmjhfdcba`_^^^]]]]]^^^^__``abccdfghijlmoprsuwxz{}~ysokfa]XURQPRV[ahpx|wrmifb`][YXWVUTTSSSSSSTTTUUVVWXYZ[\]^`abdegiklnprtuwy{}~|xtpkgc`]\[]_djqy|xurpmljihgffeeeeefffgghiijklmnopqstvwyz|~}yurolkklptz}zxutrqponmmmmlmmmmnnnoppqrstuvwyz{}~|xtpmkjjlosy~zwtqomljihggffffffffgghhijjklmnoqrsuwxy{|~~zvrnifc`__`cglrz|yuspnmkjihgfffeeeeffffghiijklmnopqrsuvxyz|}}yurnjfca__`bejpv}|yvsqomljjjihhhggggghhhiijkklmnopqrstvwxz{}~}yvrnjgda`__adhmsz~{xusqpnmlkjiiihhhhhiiijjkllmnopqrstvwxy{|}}yvrokhdb`__`cfkqw~~{xvtrponmlkjjjiiiiijjjkklmmnopqrstuwxyz{}~}zvsnjgdb`__`cfjou{~{yvtrqonmllkkkjjjjkkkllmmnoopqrstuvxyz{|~~{xuqnkgdb`__`behmsy~{ywusrponmmlllkkkklllmmnnoppqrstuvwxz{|}~~{wtqnkheca`_`acgkpv|~|ywutrqponnmmlllllmmmnnoopqqrstuvwxyz|}~}zxtqnkhfca`__`ceinsy~|zxvtsrqpoonnmmmmmnnnooppqrrstuvwxyz{|~}zwuqnlifdb`__`bdhlqw}}zxwuspnljihfeddddefghjklnorsuusuvuuwunopmmnmgggffffa`bbegjjmsyzwz~|zvtrpnlieb_[WTPKFB>951,)&#"!"#&).39@GNU[bgmqux{|~ƻ{vqqx}uojfdba`__^]\[YXWUTROMJGDA>;852/,)'%$#$%'*-27=<<<<=>@CFJNRW\aglqvz~~|zxvtsqonlkkjjklmorux|~}|{zxvtromjhfeegimquy|~~}{xurolifdb`^][YXVUSRPNLKIGECB@?>=<<<=>?ACFIMPTX\`cfilnprstttttssrqponmlkjihhgffeeddddcccccddddddddddccba`_]\ZXVTSSSUW[_chloqrrqomjheca_^\[ZYXWVUTTSRQPONMLKJIIIIIJKLNPSWZ^bfjnsw{~~}|{{{{||}}|zxwutrqponnnnnoprtvx{~~~|{zxwusqnljhfeefhjmqtwz|}}|{xvspmkhfcb`^\[YWVTSQPNMKJHGFEDDCCDDEFHJLNQTWZ^adgjloqrtuvwwxxwwwvuutssrqqppoonnmmmlllllkklkkkkkkjjiihgedba_]\ZYYYZ\_bfjmqtuvwvutromkigecb`_^][ZYXWVVUTSRRQPPPPQQRSUWY[^aehkosvz}~}}|{zyyyyyyz{|~}|zywvusrqppooooopqrsuwy|~~}{zxvtsqomkihgghikmpsvy|}~~}|zxuspnkigeca_]\ZYWVTSRQPONMLLKKLLMNOQRTWY[^adfiknprtuwxyzz{{{{{{zzyyxxwwvvuuttsssrrrrqqqppppoonmlkjihgecb`_^]]]^_adgjmqtvxyzyywvtrpnljhgedba`_^]\[ZYXXWWVVVVVWXYZ[]_adfilorux{}~~~~~}|{zzyxxxwwxxxyz{}}{ywusqonmkjihhggffgghhjklnprtwy{~~}{yxvutssssuvx{~~|zxwvtrqpnmlkjihggfffffffghijlmoqsuxz|~}{zxwutsssstuwz|~|zywutrqonmlkjihhggfffggghiklmoqsuwy|~~}{zxwvtsssstuwy{~~|zxwusrqonmlkjjihhhggghhijklmoqstvy{}~|{yxwutssssstvxz}}{zxvusrqonmlkjjiihhhhhiijklmoprtvxz|~~|{zxwutssssstuwy{~~|{ywvtsrqonmmlkjjiiiiijjkklnoprtuwy{}~|{zxwvutsssstuvxz}~|zywvtsrqonnmlkkjjjjjjkklmnoprsuwyz|~~|{zxwvutssrsstvwy|~}|zxwvtsrqoonmllkkkjkkkllmnoprsuwxz|~~}{zywvutssrsstuvx{}}{zxwutsrqponmmlllllllmmnopqrsuvxz{}~}{zyxvutsssrstuvxz|~~}{yxwvusrqpoonnmmmmmmmnnopqrsuvxy{|~~}{zyxvuttssrsstuwy{}~}{zxwvutsrqpoonnnnnnnnoopqrstvwyz|}~}{zyxwvutssrsstuvxz|~~}{zxwvutsrqppoonnnnnooppqrstvwxz{}~~}{zyxwuutssrrsttvwy{}~|{zxwvutsrqqppooooooppqrrsuvwxy{|~~}|{zyxwvutssrrsstuwxz|~~|{zxwvutsrrqqpppppppqqrstuvwxyz|}~~}|{zyxwvutsssrsstuvxy{}}|{yxwvutssrrqqqppqqqrrstuuwxyz{}~}|{zyxwvutsssrssttvwyz|~~}|{yxwvuutssrrrqqqrrrsstuvwxyz{|~~|{zyxwvuttssrssstuvxz{}~}|zyxwvvuttssrrrrrsssttuvwxyz{|}~~}|{zyxwvuutsssrsstuvwyz|~~}|{zyxwvuuttsssssstttuuvwxyz{|}~~}}|zyxwvvutsssrssttuwxz|}~}|{zyxwwvuuttttttttuuvvwxyz{|}~~}}|{zyxwvuttsssssstuvxy{}~~}|{zyxxwvvuuuuttuuuuvwwxyzz{|}~~}|{zyxwvuttsssssstuvwyz|~~}|{zyyxwwvvvuuuuuvvvwwxyzz{|}~~}|{zyxxwvuttsssssstuuwxz{}~~}|{zzyxxwwvvvvvvvvwwxxyzz{|}~~}|{zyyxwvuttssssssstuvwyz|~~}|{zzyxxwwwwwvwwwwwxyyzz{|}}~~}|{{zyxwvuutssssssstuvwxz{}~}|{{zyyxxxwwwwwwxxxyyzz{|}}~~}|{{zyxwvuuttsssssstuvwxy{|~~}||{zzyyxxxxxxxxxyyzz{{|}}~~}|{{zyxwvvuttssssssttuvwyz|}~~}||{zzzyyyyyyyyyyzz{{||}~~}||{zyxwvvuttssssssstuvwxy{|~~}||{{zzzyyyyyyyzzz{{||}~~~}||{zyxwwvuutssssssstuuvxyz|}~}}|{{{zzzzzzzzzz{{||}}~~~}||{zyxxwvuuttssssssttuvwyz{}~~}}||{{{zzzzzzz{{{||}}~~~}|{zzyxwwvuuttssssssttuvwxy{|~~~}}||{{{{{{{{{{{||}}~~~~}|{{zyxwwvuuttssssssttuvvxyz{}~~~}}||||{{{{{{||||}}~~~~}|{{zyxxwvuuttsssssssttuvwxy{|~~~}}|||||||||||}}}~~~~}}|{{zyxxwvvutttssssssttuvwxyz|}~~}}}}|||||}}}}}~~~~}}|{{zyxxwvvuuttssssssttuvvwyz{|~~~~}}}}}}}}}}}~~~~}}|{{zyyxwvvuuttssssssstuuvwxy{|}~~~}}}}}}}}~~~~~}}|{{zyyxwwvuuttsssssssttuvwxyz{}~~~~~~~~~~~~~~~}}|{{zyyxwwvuutttssssssttuvvwxz{|}~~~~~~~~~~~~}}|{{zyyxwwvuutttssssssttuuvwxyz|}~~~~~~~~}||{{zyyxwwvvutttssssssttuuvwxyz{|~~}}||{zzyyxwwvvuuttsssssssttuvvwxy{|}~~~}}||{{zyyxwwvvuutttssssssttuuvwxyz{|~~~}}||{{zyyxwwvvuutttssssssttuuvwxyz{|}~~~}}||{zzyyxxwvvuutttsssssstttuvvwxyz|}~~~}}||{{zyyxxwvvuutttttsssstttuvvwxyz{|}~~}}||{{zzyyxxwvvvuutttttttttuuvvwxyz{|}~~~~}}||{{zyyxxwwvvuuuttttttttuuvvwxyyz{|~~~~}}||{{zzyyxxwwvvvuuuuutuuuuuvvwxyyz{|}~~~~}}||{{zzyyxxxwwvvvuuuuuuuuuvvvwxxyz{|}~~~~}}|||{{zzyyxxwwwvvvvuuuuuuvvvwwxyyz{|}}~~~}}}||{{zzzyyxxwwwvvvvvvuvvvvvwwxxyz{{|}~~~~}}|||{{zzyyyxxwwwvvvvvvvvvvwwwxxyzz{|}~~~~~}}}||{{{zzyyyxxwwwwvvvvvvvwwwwxxyzz{||}~~~~}}}|||{{zzzyyxxxwwwwwvvvvwwwwxxxyzz{||}~~~~}}}|||{{{zzyyyxxxwwwwwwwwwwwxxxyyzz{{|}~~~~~}}}||{{{zzzyyyxxxxwwwwwwwwwxxxyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxxwwwwwwxxxxyyyz{{||}~~~~~~}}}|||{{{zzzyyyyxxxxxxxxxxxxxyyzzz{||}}~~~~~}}}|||{{{zzzzyyyyxxxxxxxxxxxyyyzzz{{|}}~~~~~~}}}}|||{{{zzzyyyyyyxxxxxxxxyyyyzz{{{|}}~~~~~~}}}||||{{{zzzzyyyyyxxxxxxyyyyyzzz{{||}}~~~~~}}}}|||{{{{zzzzyyyyyyyyyyyyyyyzzz{{||}}~~~~~~}}}}|||{{{{zzzzyyyyyyyyyyyyyzzz{{{||}}~~~~~~}}}}|||{{{{zzzzzyyyyyyyyyyyyzzz{{{||}}}~~~~~~}}}}||||{{{{zzzzzzzyyyyyyyzzzzz{{{|||}}~~~~~~~}}}}||||{{{{{zzzzzzzyyyzzzzzzz{{{|||}}~~~~~~}}}}}||||{{{{zzzzzzzzzzzzzzzzz{{{|||}}}~~~~~~~}}}}}||||{{{{{zzzzzzzzzzzzzz{{{{|||}}}~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzzzz{{{{|||}}}~~~~~~~~}}}}}||||{{{{{{{{zzzzzzzz{{{{{{|||}}}~~~~~~~~~}}}}||||||{{{{{{{zzzzzz{{{{{{{||||}}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{||||}}}~~~~~~~~~}}}}}||||||{{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{|||||}}}~~~~~~~~~}}}}}||||||||{{{{{{{{{{{{{||||||}}}}~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{|||||}~xpjegp|tjd``acfggiihijijknoqsuvwy{}~}{wsqokjjhhkpyt}zwoiccormlklmquy}z{{}xtoja_kb`^]]]^^^^^]]\[YYXX[ajnpsw{~{yqyywz{}~|{zzzz{{zvmpfYOJSestj_VSSVZ_dinsw{~qeadluzysle``Z]_[\SY\Z_ehjmortvy{|~|y|~upje`Y^\]_acfhknqsvqv}pedit~}wttw|{vpkfc^[SNWTX\cjr{}qeccipw{zupke`]ZXWVUVWY`ku|}ykiipy{snjjlrx}|wttxpfdiopiWCDJRX^cgknoomkhfddegimptr{|xzp_XRRW`n{}xvprsoonpsw{~x~yvuvz}plbcelqwxzywsqnmmmnnonljgfgmu|vv}qc]RQTZclu|yusvy~|qd\[`c]O:7-*-3=FPW\^_^\ZYXYZ\_chmsy~ve[RONS[fovxyyz|}|zvrmjhikmnnh^ha\]]aflrvyzyxxy|~vqszohicioy~znd_cotd_PLKOT[afjhkpnqsw{yx}~xgSMCEELT]flqssrpnmkklmpsvz}~sj\LD=<=CM[hrxywspmjhgffhkpu|~{{zy{~zysw{}ywx|~yx|~~~~yqh^XX_kol\PNEFJQZdnv|znfejnmcVWNKLNSW\_``^[VSWSSSUWZ^cglpvy}yvi^UWTW`m{}zyxy{soiijpx}qheqxxscc^Z^cjqw|~}zywwxy{}}zz{zphipz~zib]SUW^emt{}wqmlnrvuogbbghcQEB78:AIR[bgkmnnnnnoprux|{znhd`[XX[cnx~zqlkc`]]^aejoqskmngfegjoty}{}~yw{zl^TSX_^_LF?79;BIRZbglpsvz}~z|yf\WKKLRX`flprrpmjfb^]\^cir|yxuo^TLGDDHP\l|}{{|~zzwhicemx~{yvu{wwusomjmnzzqg_Z^hrvra_XRTV]dlsx{}uqqrmbK@;1/16=@EMU_hotxxwtplifddcdcdmloln{y~|y}|se`ZVTTV]gu|{|{xwy{~}{~xpncefklw}~}{zyyyzzzzywtronl}zqg`]agqtf\[QOPU[ckry~rjg^\[[\_elol^NK=98:@ELRX\_accdddefhknruy}vh`WPKGFJRaryusttwuuuqwnmkklptx{}}{ywvvvxyxupjfhnw||qsqlrv~{tmd\UQU^kstg_[MIFHKOTWcilruy|}wsqqrw}siiWTRTX^cinrtvwwwwwwwxxz{|~~~||u{unjmu~|onaXRMJGFFJQ\jy|zz{~yy~~}x{}ypkv}{yxvsniaXOIHMV\_TTSJLMSYaiqxukb\YZakx{sqb]XWVXZ]^_]aebcabbcdegiknpstvq{smldb_^^agq}zwstw}{ulcd`elpoeifcgjpv{~~|tjaZY^fllbe_WXX\`fkpux{}zrjb[WUW]fqvvhd_RPNQUZ`ejoruvxxyyzzz{||{|snov~~{uqmiea^\[]dlv}}wtrsux|}~v}}vustvy}{ust{{zxz{~{qfZNFAGSTSHKE??@EJQX_flrw|}tlgehozzuna^[]_cgknoppnligfegjou{~~woiimv}vqpb^YWVUVX[ajv~wpkkosuniplqx~{vsinuv}{xupjbZTQSZcgf\`YTTVY^bivxsh_[\bluvrhaXKHEFIMQUY]_abccdddefgiknpstvuu{|rnhfdbbbdhoy}z{~}|||{|{wtqponmkfb^]ainrkfldfiov|y~wof\TOPV[]TKNBABHPZenw}~vlc[UTZetxwka^[]_cfjkowuwxxxxxxyz{}~zxzqmd^VPNLLKMOT[eq||ywy{~}~~{uwrqw~~~wz|}vsnje^VMD=;>GNSNHLA@@CGMT\cjqw}~rh`\`ixvraUNJKOU]emsxzzxvspljgebdjgjijektqvwz|~}vpmov|~wmjfedeefhkpv{wttuwz{zwuvyvushgepsw|~xpyxz{tkbXQLU^bibacYXWY]ciou|zqeZNFBEP`oywno`XROOPSW[_behjkmnoprtvxz|~~}yzwkd]YVUTWZaju|zywtttwz}|ywutsrqnjebciry}w~|wz|{tmg`ZTOLOU_gkbc_ROJIIKWZ^ejoty}~rf\VXar~yrkhfgiknqtvxyzz{{zzzyyxwutrqkv|}zsjc_`gpwuptha\YWVVWXY[`fp{{vrsx|||~vxyqru|~yupke^VMD>=AKTZUZZRSRVY`fmsz}o`RHDIWm|shb]ZXXV^_^`abbcdeefgijkmnnnjvyx|}}wuw}~urnmlmmoprv{||{~{uqjhg^\\bioojqlhikpu{xqh_WQQU^dhbgd\[YZ\_behlptx~}ti]RHDGQbq}{~~plecbcehknqtvxyzzz{zzx||sjcadnx}ysoligedba`hos}{||yz{~}{zxwspmlov}~|x|vvuzvlaUJ=ACFJNSY^dglso|~~|tvrooqwpkiiihga\\UU^l{}yu}{xicdnqxxe\VUVZ^bgkmoonlfi`ejjpqwtrwponsvuvppqtx|zsmo}unmd]WW_mtsobfbbdfiknqux{}|xrq~{gWNUXY\[fq}}{zzxzuvsqvrposqrsuwy|{xpgclifffqptpllmqsxz~}solpu~uplffefgijmpsuvrmiq|||{~rmu}mbYQIC@BIXmpcc`VSNX_bfbaabddebhkjnikuv||wpg]UU_s|ywvuuurmd\Wflkh^_\_fglosx|~||{zzyyxwvvuspnpysqsicXW]\]XPMKJJIPUX\aaanpv{zolmrzqjssuqd`]Z`bdhkosx~yx}{z{~ysmknvzoruvwqnjhaba\[XWUOY]bjpxz~zx|xtpmigabky{tqtpqqqstvx|}|{zqrv~{qlv{yz||piqsvxx{nlkffefde]`fcfgjloqtwyw}ysop}}rwvy}znnurrh`agn}|trnlt|qkq{|vqppqqrstvy}ze[ZYSQMKWix~z{}xmgmomjfegmrw{~~{vqos{|~}|yvrupnlkmrz{vv}wf][ede^WVVY[^adgkotxz~|~vmi_]YXVWY^bh}yswzuzkecbcdfgggfda`ckwyz|||}}}}||~}nfkiidXVSUVY[^aeimps}vjebdfjosttkokda\\_gt{yz~xogaagmhusortwz}~||{wpiektuyrpruxzwonr|||wpjgedcbbbcaahjknihwvy}|z}wtlde{ztnnpxuy}qnjigheekjkif`^boqwtnqrwv}ykhjfg_\bjt|zuxvuuurjtxw{}zpkq{wztmlknsx~y{xg]VUX`l|}vnbYV_cgicfinrt}}~rnhfb_[YWXdkv}wx}{yiXW\djmqjhghlotx|}{~|{yxurmidceq~}xpgagloqeb``b`djjnqtwz~~{xutssromrppqqrqpiku}z||n^ZU]fjppkkknquy{}w|zyy{}|xvvsxumbYXcl{~xy{~~|xwrvwsutwx|qmklmoppy{}phfkpqtmgdbccffidgpnrtxz~zwtrpnlhd_]cvz|wtv|wqww~womlmllsuw{~ustt~pkkpzyromlllheomortwz~~}|}~yurrtwz{ztmfijkgWRPU^lxysgjksqhhghfmnnoprsvx|~|xka^afgmjkpw~{~upmlvz{urrsux{~}vy~xtrqpmkpkkgltyvrrrqb[UPUVVX[^bfkpvz}zpmox{~upjgdc`a\fqwurpw|vusuwz}|xq~|{{~~ysnljjhotszxosonqxwpjnpopnmkigggilpprvmkmv{{||ywtosx{}{{{{{{{{yvrkf^m{{}zxxy|~|wrr}}uomovy~|vqomlkkklmoqstuq{{y{zsmns~~|~xnbbhp|~ytldbfvz~{{|}|unkqv|}okhhijmjr~vsnc_QEEFR_o}}xqr|zuonpw{wsrrrrnx{z}ytrpqtzx{xwvvtpjc^cjnukeddegggntwz{{mb]ZXVUTSSUZakw}ytkb][`hotxronmpqsov}{|~|ytohida^p~{vphabjmuogfdffiqns{{maXTSTVZ^bfhjjjgd^Xbbfq{xxz|rmhhhkikxu}~wr~qs|~{yx|}vqkhflijhopquvzz}w~wsoonpprrsuvxz{|{w}{~wrsy~~ytronielkqoqsuwy|~|xq{yv}zvsnh`XU]gt||xw{xvursxvy{~~}{vrq{|xhb]]^aeinrw{y}zyw~zogihpogils{{yq|zsnm~ypz|{tswzvjcecdjpy~ztjkmp{zphcaacegjlpswz~yph`\Z_ejuxzyry}yyxyyyw~x}~wsxy~runnmmmmjiomnpsx~tpokoz|pkghhjkmoqrtuwwxvr|{||{~tlfb_`eou|~vnf[VTN[^iv~~~{{yqloqy}zvsuvy{}~~vnjhggghijknprstp{~{~y|vrqu{~xsvojsqopoooooquyysyuzztoqsy|zyz{}|wsf_\am}|wspnmllmnpqtuwsy~~x{|}yspmklpy~~uodhiehilptx}|tj`YYbswy~ysmhglx~{tqw}}rieeiov~}x{zuqmjkov{{{tx}}wrtvzuoiilhknt|zrjcmnwynmijkmortvw~uqt}ypieb`^]\[Z[^bhotu}~|xsollpruwrmid`kjmptx|xooms}oleiootvxxwurnkfd^_lqyprw||{xwutqu||~smmx~yqpnooqrstuvvwtshuytyz~}wqlgefktzzurnkeopptuxz|~{wy}|}}~~}wouompux}}|~zwvvwwxxywvpoz{wtsssstuuuvvtrqw|z|||y~|}{zxwuuywpidcnrv{xtrkryvz{~~~zuniekixypuptv{~~xshljfkr}woa\RHHPZnvx}umks}yxvutsrrqqnrtp~}xwxxyxxv~y{{{|||}}}|zwqlimos|usstvxz|~}zytjd`efpqe`[ZY[_dlt~{kw}{y}wrnkjiklnprtvtyw~~xqmgaWWSQV^esx{||utzvutuuuuuutuvvwwxvump}~ytme\Yaqrmlddccb`[Y^[^dmxxib`^_^ekmrw}zzsjknu{tpjfcceipy~zsrqrrpnkgfipxy|}zuz}ymmjkhgmjjkmrxvkovqfeehjmorqw|se^[ZYXWVVUWZ_fowzlcdgkovqjfb``adhlpsox~znhw~xrqpolhb\VQPT_qxvsuw{~zrs}ymjiiggnkkkjs|ypuwg_][\]_acehlpuz|na\Y]bfonifdehpv{ywwt{|z{yxuuw|xow|uhfkiiiihhijns{|xon|yujgfgghiijjjjjstu~rf\_pric^XTVOMLMQXcqrkdcdkr|~~}|}||{zywvuuwxwpr{vjhcfjqssvx{~timtypl`\ZZ[[\]^`cgmt~sp{xtomkkklmoqsvwzyng`XUWSXZbjilpu{w~wvtuttssrqqponmmmqrz|zwupi`[`ptpogfeeadd___afmwphdbaijmqu{}srvy|uxxrpkhedcdgkrz|sqnmifddgmr}{z{zrvzy|}wqvxnljgknjkjkmpt{ttuzvkkjmnopx{|{u}~tna]ZZYYXXWWX[^div{{wolotopic`]\[\]`cgkmjuz}{pkls||uonlje`YSOOU_k|zxz{}|toq~xtjhfekmjjjrrv{}wqd`^_`acdfgiloruy|~|v{w}voc]acjpkhc`^^`dix{yuw|xwtrooqw~yvst}uslhgghhhgghjmqx~wrt{xmjhiiiiggdfkiinwv|zzztokhdn{~wrf_\W[YTROOPU\fq|okior{}zyxwxwwuspmjikq{wx~xjokmtrtuwxz|~~}|~vqkgrspma^]]^_`abcefq{~y{}uqnnnnopqrsttz~~qd\TYY[^ghddcfjpw||zxuussqpnljgedfkqw|}}|zxvuroib]`nsutjhfmjhfdbbcgluxqjlpnqsw{~xnhs~~vqmjihgggikpv}upjgdegmr}|zvz{yzyrx{z}}{zx|qljpnmmmmmnoqux~yyxvtru}|uouyuthb_]\\\\[\\_`hsx|tx}rsoheb`^^_`cfjnqtq{~yxojp}~{sojf_YTQTWaot|~vony|~|pkiolkptrtvzx{~{{mheddeghjlorux{~~vmotqtmiqrnkfc`^]^_frwy{{vtpnmpu{xqpz|qnkkjjiihijmqv{~|ut}rnjihgfcijhjisvy|~zvtuuvxojqvtsg_\`[YVTRRSW^hs~vuv}{yyz|{~zxvusqnifbbdpyxtostruuwwy{|~xw{w{~{{nhfosrqea__`aaaabknrzyrnllmnnooppr{|~}y|zufXX]\cjfc_\[\`eltz}{{wsromjgc_\[\bir~w{|wz}|{zxwusplg_\`nrwsmpjkhgdb`_`amxxqrpnoprtxy{zpnoulfdcbbbbcehlryvjdabgktzvtnlqooqqqluww{|xux{lnnkkihfecaacip}{vwvquywz{~ulirvtre_\[ZYYXWWWW_kszzrr}|pnfa^\ZYXXYZ]`dhlnly{~}}|rkhp{{~tic]YVVXYbecfhov~~~zqklwzzwhjifnnnoprtw|vqw{yylgdcdefhjlnpqst}|thciuw~tnhd`^[YXXXahlu}||spljjnsyx}spw~~rokkjihhggghjmotv{y{us}roihdejhfgejpptwz}{~~yvuwyypfagmnqcea][XVTSSUY`hr}|yvvvxz~y|zvqnifa_]`duyv{~vwvwwxyz{|}}}|ywor{{|~vohemquwkhddccaekjmpu{xsqqqqrrsrx~}{rqsorfgfjojhc`]\\^bhov|ztqlid`\[[`eq{||{swxz{}{{yywvusqlfaalqwuqoljgeb`blovzyvwwxx~~|~z|unifeeeffgilqv}xnkknyzxvrnqsqssuuupz{{~|vu|}}ytonljheb`^`eox~|woiorvymhdba`_^]Z\lmqw~|}wlhda`_^^^`behlorsq}}~~ytlhjrt{rhb^^_bjhecbchnv~|y~~}|tnkrswyspronopqqsuy}ytx{~wrnmmmnopqrsu~~}z|umgfl{|rkeb`^\[Z]eekqxwrooru}y|tu|}urmljjihgeedegkpw~~yw~vqilmjigfemnnqswx{wy}~|ywvvx{}xpg_]bhiqmfb`^\ZXXXZ]bht}ywuvvxz}|wx}smgd`__bcq|y|}~~{xwwwwwwwvvtsqpopmv}{xy~zwrkfelotvjgcbahihjkmqtz~yusssssrrzzz|}}ynggkkwwvqkhc`][Z[\_chouz}|zslhc_\[\_corqqpnmenxtwwxwwvusrpnkga]art}~trnmjhdb^bfejot{}zxvwxrtuuznhdcbbcdefhkosy~yx{zzuw}zwsokjomlmnopqpkvwwz{~~~}vrqxvroigca^[Z[_fo}}}ru}~yqkhnquxlgca_^\ZZghhmqx~xngb`^]\\]^_aegkmpnp|~{xsmfbdjktlfedkojgb^\[^biqy}xsrwtw|{sminnzxsonnnnopqsvy~~wrvyytpnnnoooouzy||~x||yvspnty|~wngb`]\ZX_bbfkqx~{vrtwy|wu{}zvpnljhec`^^_dluzv{}yzsomjigiomopsuxy{vw~xxvwxz~ysme^Y^bp{olfda_]\[Z[]irx~zxwwxy|~xv{|}pia_^_cmvutuvy|}~|zzyxwvtrpooqty~}{y}}yuniekox}rmjolkkllnorv{}{xvuuty~|~~}siaci||tmgc`^]\]_afkrx~{ric^\]_fpqrqqponlmyzy{{{zzyxwvtrojjigpu}zsplidafcacdhmt{wnnpvtnifddddefhknswypot{}xrojmpmnnoprtttp|}|xqns|wphc^ZXX[`jvx}}xvv~{smhlpxsnhda^aeiiilotyzv{yohc`^^]^_`bdhjnov{w~}{wrjb\\bguspwuplfa]ZXY\ahow}{vpssrx||slfn}zuponmmnnopruy||uqvz|vrpnnnnuwvxxzz{zz}}}{xwvxx|~wrrtv~rjc_\ZXZ`^_bejpv{}y~}~~|{zz{{||{wyutz|ytmjfc_\YXY]cm{}wtyy}wpmigekljkkmnopooiltptw|}xsoid\XT]ioyojeb_][YWYachov|yxvvvwyz}yrpsrzrhcaagmnrmlkkmqu{}zzxutrpmkihimpxz~{{yxwuv}zzywtpjfdjluysskkiiijjkmorvy}~z~yvtsszzyy}~ytmjgu~skea_]\\\]_bglqw|~|~~qib``bjpmmjiggffgohqvtwvwvvutsqomqmhfgosyuokgbcd^\Z[]cju{ts|xplgglrvx}}{}}zx|yf`~zux}{rgkp~|xxoporrrqpoooonmjlh}|xvwy|~vw~}hhzmjpw}yvxndairih_XSVj}yvw{ĽqhjYKIHJJLNPRTWZcjjnhntv}{tod^ds}~mZ]wwrw|wmy{w}}|yxy|xtwxjej}znsrsuwwuroq|wjfowlfYOKGP^ityz{~r__`zu`QQUYVQLKPZfry|srtpst}~~tnhhm{~pednkecXXX\fhjmoruxz||zune`t~xt|y{}ui`g|qadlcb[WWWY]eq|vmozse\VSQRSUX\]a\`hkrw~}skkwuovvzrkc]hykehoy~zvuuwz|ty{~}~|{}vmmko{{wsu{~tyypj`XURQOQU_jsz~v`QOfseceeaYWY[cmnv|yyvwx|~zwspqwxqxvlgXVYY]`dgknqtw{}yoqhhm~y{}z~ytuy|wledk}n`RIHLTSVX^gr~scafw~oe^ZXWXWXRU\\bhuy~{vlis|sko}tqrxzvmdcn~ui\ciny}zxxz|~}y~~zxwstvy{}~}|yunlptvjbh|xhZWTTSQONOS[dn|sZIFSd|qlnpoib^X^lr{~{zz|{{|yvw{xo`[XWU\]_begiktz{}{v}xvsqqv~}ugbft|xplmrvukeadqzmkwk[NIIKNQSVZajuxpifeitsnd_[ZRT[[aflqv{wl`arrsurv}xtzwrrwywnebi~}~}wpgckpz{xwspz{~|v~zqmmnqsuvwwwvuzyuqmrn~qijqntujff\XVTRPONQV^hrw|x~zrqi^SOUe{yzzykcb]bpz}|zwqns~~yurpnpynccb_^^[^cchkoswz}|x~}{zy|tidcfksz~~zrkhjputiY`fwxor}wtrpsibXOLJLMOS_hp|~}vqmkjlr~um_]a^bejmruxz||{}ylecnmfh_cku}zt||uty{xnbXYjyx|~umdinx|tzy||ofjlkmnprtuwy{|}}|xoqx~|}~uf[^homlb[WTRPPQTZaiju~njjnokaXU[gx{tmlov~xnghv}|ynw{xqc[[k|~ytpmjhgggfemorwz||w~ysmhedeioux}}smikolsqflu|sfgehonhcXSRSW[ahox{}yvsrrsuxyujnonpruwy{}}|wnfcmqnl_WX_dnvywwuj[PVgt||~vppzxqmlmnoryqnllkjhfcdiit}ytqsu}g_RFB?@CHPZeox}wv|ndbfr}|vnhfimur}~}{|~wrmkjlqzxxrre_befikmoprtuxy||~zv{omy~ttnlic[TRU[bee`cqwpuwfSJHHKOT[bn}|wqgihls}}solmnpqskmroqpqqqqqszxvrkkm|}{yz|~opqtrmhirujb]djouw~{{{||tuxxmjjkllmlkjiihklwvges{pfVNHECCEIPYdoz|mkwreXW^jvzrohnz~~||}~zrs|unjgflw|{tigfgfekkmoprtvwyyyut~{~~{md\\aehe_VQUY`hnnljv|tryx{lb]SPNPRVZ`is|wlccdgimpv~zuskrtoqpqpqqrrsrqlf^\bx{v{z~}trtutokkr}~~{vmhbfpu~~xzvmijkmnnnmlkjihiiklp{{vyzic`a`^YNIDELNS\eq|}srwsrnhf`]^fr~{stpuz}ytnggo}}}vplkklnoor}tpnmlkjijqrqtvxz|}zt|{|~}qaYWY^chigb\XY_iqvuqdq{yvlfjlhf_WTSUX^fnwvjfbbcegmvx|y|vvttttsstssqmf]X]imgcfks}~{xs{{wqicbj}xtx}zsmkjv~qjiijjjjpqoonnnnooojuyxgXTT\``aXSPPRW^fpyqf]aejjgcelx|{}}thbdrtnnejty{tnic]Zas{yxwwvvuuttsszz}~yyh`YWVY^dhjiea_`fmwvxuquzpmhffjjnma]Z\_fnu~toigdddgkqw~}xvtxzwwuqka\]ikecZ\\gry}zqcWUex|vqpty}yxy|vponnnooppqrstuttlrvv}qjaZTSW_afe_]\^bfqt{}sx~|i`Z\`fjpmiltthcntjg\\]bfrz~|paWUalmrnpswz{||{{z{{{{y~}qf]VW[\bhnqrolhgdpxyzuuvwvuwuqljlonqjecdgljuxtomigfefhlsz}{zxtmc\\gjdaURRUY]ex~}}ylc[ch^a`isxxtrsyzvsqpppppqqqswmrtrvw|{upkf_^ZVZbjnuomjjdjtv}qhl~xrke`^agmppnmpy|vs{znfVQOQTY`dn{}wj`dha`YX^dkpwx~yz~ria\[]cjqwyvpbbdemqtrqvzzxwyyxtommrrqqjl`cloxxqmjhfjkijknsz~ype[\ksg_UNMNQTY^dhu|wphkp{m[NCHSbnvwusv}xw}rtzzvtssuvxxytpwsttuwy}}zxvsqmid`^bkv{tjmkmqv{tq{smflnpoke`_agmrsrqyyrt|m_RMHHIQW[bjr~vnijxraVLNRYaipvz}xt|~sopt}xogccejs}tukfehntwwvuz}~|wttx}}}opmmrw~ulkolmmllmnorvzthdlwlaYQPOQRTVY]bhnutbZduwocSIB@FXgr{~~~xmkvxvutw|~|{||}yryvutssx{z}}{zxwutpmjmw{|vsrtw|zyoe^``isvsmhccgov|}{vspxypea[WSQPQTYajt|nbeuwpn_XTSUZ_fmtyzrs~{srrqrvx{~zuvw{zy}xqjfeiouxwurqow~zv}~wsry~}tronjponpprsuw}|qr{tlcXURRVZYZ[^bgnu}vlle^^Yb]YRLJP[kyynlx~yystx{~~|{}{~}|{{yyyy{|{wxxow|}{xuvx}uiecehknxwvrnklqy|~~~~wriigfb_[XVWY]dlx{uzthb[[\b``]_bgnv}}yu~{yonoswz||{{~|t||||xwskghlsxyukbbt~~}{{~~tqmptrqnpvuy{~}}reb^^]]]]]^`cfkpx}n]JFKR^c]YSRWcr|u{}uqfdfkv}~}|zzyxwuqmlkwxqqt|~||~|{~snigffhkoovyututrus}xfa_dkkjifdbcdgkrw~|}saYUX]`hhdddhmu|xu}yvjffhkpuy}|z{|~}{vpjffhigb_dmjpru~}{zyyzyxusrrrrrsstt|y|{~rlgecba`__^^_cjnotrw{|yeWHDFKT^ifb^^epykdcdhlrw}~|zvph`^gqorkjlq}{wuw||wrlmw}tqosolihhjnrtw~zuqflsw{ngcdfjlnonnmlmmnjnxypia\WUV\_ejfehpuy{yw}yugb_chhlouz}|}}|xrja[YUWcnheZX_ku|sjho~}~yqqpqqqpqqqrtv}~}xyrnkhgfeeeffhikhjuwupjbXMEDIV`nsnkjnw~xxwojgffgjmrv{}yri`\ajdd\WYbjmq}~wttx{}zpimz{|ztuuvvurpmkjknsv|y~vqrknu|rjggilpt{|zxvnlsqvzztqtlk^||wtxwuskc```ccq}xps{snjlrspqklnsrw~{yx{}udcht}}~{~ywxyupbRUvynefls{uRHphPD>>DO[flkfa^`jzrhw{x|xzzmqfdfiloprttwz~}}tsxxurpi_QJUq}tm^YWY\_cgkpt{mRU}hQ@8:FUad_UMOYj||{tqxxpjp}vz|uqnljjjjlnruz{}tqphhn{}yqnkhc\TS_x{vifdegjmqty|eQY~}dOCCLXaa[RLNXhwxzut{}umirxszztpljhhhjmquz|~uuskls{rnkhc]VXf|tgdbdfilnpsw~eU`|eSHHOY``ZRNR]mz|vwqu|~umju{|xv|vromlllmoqtwyyruqjip}{tplhb\VYj}shecdfikorvzyaVf}gVLMT]b`YQNS^mw~vrrmryxpijx|~{vvytpmlllmoqtvxunqlhjsyqnjgaZU[n}skhfggiknqvzq\Vj{fUMOW_c`XPNS_mx}tqplrzvoim~}}wsv~zuronlmmpruwytmpigjt~wpmie_XU]r{ynheddegilpuykYYsyeWPS[beaYRPU`mwzqqolqxwohm~{uqv|xtqonmnpqtuvomoffis~|snjgb]VU_u~zxkheddegilpty~|fWZwweXTX_egaYQPVbnwxprlkox}tlip~}xsqw~yurpnnnpqttummnffju~|snjgc]WXdy}{wljggfghjmquz~yeX]{wfYWZbhicZSRYepywprklpy{sljs~{wrr{zwsqpoprsvvvmomffju}{qlifb]X[gz||wmkhhghiknruzwcYaxh\Z_glkd[UU\hs{wqskmqzyrkku{wss}|yvsrqrsuwxvmqlggku}{qlhd`ZVZgyyzskigggijmpuyr`Xcwg]]aimle\VW^jt{uuunorz|tllu~{xtu~}yvusstuwxyuotmigkt~~}zqmhea[X[ixy|smjhhhiknqvzsaYfwh``elpmf]XZbnx~wyuops{{tmmw}{yvx|yvvuvwzz{urvnjhlt}~|yplhea\Y\lxy|rmkiiijlosw|ra[ixjbciorog_[]fqz~wztoqu|{smny~|zxvy|zxwwxy{{|utvnkhlt~}}yqmhea[Y^ox{}rnkjjjkmptx}p`\mykdflrtog`\`it}x{tprv~zrmo}~}{zxvz~|zyyyz|{{svumkhnu~}}yqmie`[Y`pw}{qnjjijkmpsx||j\Zpwjfhnstog`]`is||y}trqv|{smo~~}|zyvuz}{zz{|}|{swtmjhmu}|}wokgc^YX`qu{wnliiijknquz~yh\]tvjgjpuuog`^bkt}zz|srqw}zrmq~}|{ywutz~|{{{|}}zrxrmiinw~|}vnjea\WXcsv{tljhhhikmpty}vdZ`ztihkrvuof_^blu}xyyqppv|xpnt~~}{zywurt|~}|||}}}xrwplhioy||tmhc_YWZgtv{rljhhhjkmpty}qaZd}siimtwvof`^cmu{vzvppqw}}unnw}~}{yxwusps|~}}|}||tsvnkhjpz~}}smhc^XW[jtwzolihhhijlosw|}m^Yg~rjkouxune__dnvzu{uooqw~|snoy~{}|zywvtros~~}}~}}tuwnkhjqz~||rlfa\WU[kswxmjhhhijlorvzzi\Zk}qkmqwyvofa`fnwyw}vrprw}~uop|~{~|{yxwvtrpt~uxwolhkq{~~|rlgb\VU\mrxvljghgijlorv{yh\[n|qlnsyzvnfabiqzzy~urqsx~uop~}z~}|{yxwwvurqv}v|wqmilr{}}|rmgb\WV^mrzumkiiijkmptx|wg\\p~rnqv{|wogdels|z}vtruz}toq~}~~~}|{yxxwwvusrw~w~wrmjlqz|}toid]XW`ms|unljjjkmoruz~wg\^qtqty}}xpifhpw{vusv{}tpr~}}}{zyxxwwxwwtty~zxsnjlqy{~|sohd]XWams|solkklmoruy~~uf]atusv|~yqkhjqy|ywtwzvqt~}}{zyxwwwxxwuu{~|xtnklqyz~{soid]YXdmu|rolkklnprvy~}~se]dw~vux~zrkils{~}yvtw{}uqu~}~||zyxwwwwxwvtu|{~wsmklqxy~zrnhc]YZfmw{rplmlnoqsvz~|{|~pd]gx~ww{zrljnt|~~}yutw{zsqx|~||zzyxwvvvvvvtsu~z~wsmklsyz~yqlfa[Y\hnyzqolmmnoqswz~~zz{zla^k{~wx}zrlkou}}~{wtsvzxsqz{|{zyywwvuuuuuussvx~ztqlkmtyz~xqke`ZY_kozwpnlmmoprux|}{yz}uh_`o|wy~zrmkou}{{xtsuy~xts}~zzzyxxwvuuttttsrrvyytpllnuyy}void^YYakp{tomlmmoprux{~{yxy|}rf^br{x{yqlkpu|yzvrrty~wst}|{xywxvvutttttsrqrw|ywtolknuxz|tnhc]ZZclr{romlmnoqsux{~}ywvx{|pe_ds|y}yrnnrx}zyvrsuy~~vsu~z{}wxvvuutsssssrqprx{{wtollouxz|sngb]Z\fmt{rpmmmnoqsux{~|xvvx{zod_gv|z~yrnosy}{zvrsvz|usw}z}|wxvvttsssssssrqszz}wtollovx{}toic][\gmvzqpmmmoprtvy|zxuvx|ymc_iw}|ysopt{|}|wttvz~xty~|~{{xxvvutssssttsrqs{|yvpmlovx}~upid]Z\glyzrqnooprtvy{~yxvx{xlc`jw~~yspru||}xuuw{~xtz~|}|{yxvuttssstuuusrs|~{wqmlovx~~wrkd^Z]gm{yrqnooqruwz}}ywvx{xlcalyysqsw}~xvvy}~xt{~|}~zywvutsssstuvvtst~|wrmlpvx~~wrkd^[_hn|ytrppprsux{~|xwvx|wkccnzytruz~}xvwz~}wu|}|}zyvvttsssstuuussu|vqmmpvx~wrkd^[aip}wtqppprsvx{~~{xvvx|tiadn}ytsv{~}xwwz|vu}{z|yyvutsrrrstuutrqt}vqmmqwz~xrjc][bit~vtqppqsuwy||ywvx{|qg`eq~xssuz}~}ywwy~}wx~zy{}~xwutsrrrrstttsppu|upmnrx{~wpha\[djv}troooprtvx{~|{xvvx{zoe`gs}vrrtz|{xvwy~{vz|xx{|{vutsrrqqqrsssqopw}ztpmnsy{|unf_[\fly{rqnnnpqsuxz}{zyuuuw{vkcaku|vrru{{~yvtvx}yv|{xx|zwusrrqqppqqqqpnnoy~|xrnmotx{ztld^[^gm{yrqnnopqsuwz|~y~xwtttwz}shaalw{uqruzy~xutux}}xv}~zwx|~{wusrqqppppqqqpnnp{|xrnmoux|zsld^\`io}xsqopqrtvwz|~~}v~zvussux|zpgacoz{vrsuzy~yvtuw|~~yx|xvv{||}utrrppppppqqqpnnq||wrnmoux|yskd^\biq~wsqppqsuvxz|~~|v~xutrsux|ypgbfq}|vstw{z~yvtvx|~~yy|yvw{{~}vurrpppppqqrqpnor~}wsnnoux}ysld_]djs~vtqqqstvxy{}zw~wusrstx|yogchq|wuvy{}~ywuwy}}yy~}ywx{{|vurrpppppqrrrqopt~xtonotw~ytle`^eiwxvssstuwy{}yzwusrsuy}xngcir}xwx|}zwvx{~}xz~~zxx|}}xvsrqqpqqrsssrqqv~xtonotv~zunfa`fjzxwtttuvxz|~vz|utrrtw{~wngelt~yxy}||xwx{}z||yvw{~{xusrqpppqrsttrqrwytooptwzvngbbhm}yxvvvxy{}~u|{ttqrsw{}vmhfnu~zyz~}{xwx{}~z}|ywx{~zxusqqpppqrsttrqqx~ytpopuwzumgacgo}zxvvvxy{}~~~t}xtsqrsw{|ulggow~zyz~}~zwww{}}z}~|xww{~ywtrqppppqrsssqqrz}xsonptw~xskfbeiq|zxvvwxy{}~|{s|vsqpqsw{zrkfhqz}zy{~}}zvwx{}|z~~zwvw{~}xwsrppoppqqrrrppr{{wrooqux~xrjebfjt{yvuuvwxz|}z~xs{srppqsw{~woheir}{xxz{||yuuvyz||~zwttuz}z}vtqponnnoopqponnr|zvqoorvy~wqidbhlxzyuuuwxy{|}~}|w{sqxppopruy}{tlgeltzwvyy~|xuuvy{{}|yvssuy{zzusponnnnnopponmnr|yuqoosvz|vogcbim|yxuuuvwxz{|}}}|zuypswopnprvy~zsjedmt~ywvyx{wuuvy{~z~~|xurrty{zxurponnmnnoooomlnt|~yupoosv{|vngcdjn~yxuuuvwyz{|}}}|yuxntunonprvy~~xqjffov~ywwzx~zvuuwz{}z~|xurrtyz{wuqponnnnnooonmlnv}~ytpoptw{|vnhdejp~ywuuuvxyz{|}~}|xuxnvtoonprwz~xpiefow~yxx{y~zwuvx{|}z~{xurstzz~wvrponnnnooponllnv}zuqppux}}woidfjt|ywwwxy{|}~~~}|wtunwrpppsvz}}wpiehpz~zxxzz|xwwx{}~|}zvspqrwy~ywsqoonnoopqpommnw~{vrpptw~ypjegjv}yxxxyz{|}~~}|wwvqzsrqrtw{~xpjfjq}~{yz{}}yxxz|~}~zwsppswz~zxsrpoooopqrqpnmow~|vrppuw~ypjehky}zyxyz{|}~~}wwuszrrqstx{~xpkglr|z||}yxy{}}}~{xtqqtwz~zwsrpoooopqqqpnnpx|vrpquw~ypjfjl}~zzyzz{|~~}vwstyqrqstx||vnigms|z}||yxy{}|}}zvsqqswz{xtrppoopqqqqonnqy{vrpqux}xpkhko|{z{|}~~~|zsuptvprqtvz}zsmihou~|z|z|yxxz{}~{xtqooruz~~}yusqonnnoppppnmmryzurprvy}wojhlq}{zzz{}}~~~}{xrsoutoppsuy}}xrkhipx}{y{yzxwwyz}~}zwspoosty}zxtqonnnnnopoomlmtz}ytqprvy{tmiimt~|zyyz{|}}}}}{yuppmtqnoorty|{vojgjqz|zyzy}ywvvxy~}~|yvspoosty{xvqpnmlmmmnnnmklnv{|wsqprvy~xrlhjmx~{zyyz{|||}|{zwsnmmsnmmnqtx{~}xslhfkr}|yyyz|xuuuxx}}~|zxtqonorsxzxvqpmmllmmmnmlklow}~zvrppruy}xqliln{~{zyzz{||}||{yvqmlmsmllnptx|~~{vqkggmt|yyx{|xvuuww~}~}{yvspmmnqrwy}vtpomllllmmmmlkkow~~{vsqqsvz~xrmjnp{{z{{|}}}|{zwuokjmqklmoruy|~}zupjhhou|yzx~|xuuuwx}~}{yvspnmnqrvz|wtpomlllmmnnmlklpw{vsqqtv{}xrmkoq||{||}}}}}|zwuokjoqlmmpsvz}~zupkhipv}zzx{xvuvxy}~|zwtqonnpru|{xtqonmmmmnnnnmmmrw{wsqqsu{}xrnmos~}}}}~~~~~|{xuollrqmnnqswz}}zupkikqx~{|z|xvvwyz}~}{xuqonoprv~|yusponnnnoooommmsx{wsqqtu|}ysonov~~~~}|yuplmtqnoortx{~~zupkikrz~||{|ywwxy{~~|zwtpnmmoqu{yurponnnnopoommnsx|xtrruv~~zuppqz~}{xtnjnupopqtwz}}yuoljms|~|||}zxxxz|~~|zwspnlmopv|yusponnnoopoommnty|xtrruw~ztopq}~|zwsmipuopprtw{~}ytokjns}|{~}zxxyz}~|yvsomlmnpx|yurponnnnooonmlnt{{wsrruw~ysopq~~~~~}{yvqliqtooprtx{}~{wrmkjot}|z{xwwxy}~}{yvrolllnoy{wtqonmmmnnnnmkknu}zvsrruw|xroqs~~~~~~}}{zwtojgrrnoortx{}}zupkiipu{{y~zwvvxx|}}{yvspmkklnoz}zvspommmmmmmlkjjou~yvsrsvx|wrqrv}}}}}|{zyvtplfeqomnorux{}~}{wsnjijrx~zzw}zwvuvv{~}}}|zwtqmkiijmn{{ytromlkklllkkiijou}xurrsvyzvqqry}|||||{zywurnjdfrnmnoruy{}}|zvqlihkrz|yxw|yvutvv{~}|}}{yvsplihhiln~{ytqnmkkkkkkkjhhipv|xtrrsvyzuqqs|~}||||{{zxwtqmibgrmmnprvy{}}|yuqlihlt}|yxx{xuutuu{}}|}}{yvsplihhiknzxspnlkkkkkkjihikrw{xtrqsuyyuqrs}}||||{zywtqmibislmmprvy{}}{xtpkhhmt|zxz{yvuuvv}~}|~}{yvsplihhjko{xtromllllllkjiikry{xtrrtvzyvsuu~~}}}|{zxvsqlhaksloortxz|}|{xsokijou|{x}}zwvvvw}}}|}{yvsolihgiiq~{xtronllllllkjiilr{}yusrtv{{wstv~~}|{ywtqlhbptnpqtvy{}~}{xtpljkpv}|y}zxwwxx~}~|zwtpmjhgihs}|xurpnmmmmnmmkjjms}}yusstv|{wtux~}{zwuqmhcssnqqtvy|}~}{xtpmklrx~}z}zxwwxy}}{xuqnjigihu||xurpnnmmmnmmkkkos}yusrtv|~{wuuz~|zxuqmgduroqqtvy{}}}zwsollmsz}{}zxwwxy}|zwtqnjihigx||xvrqonnnnnnmlllpt|yusstv|}{vvu}~|zwtplefvqopqtwy{}}|yvrnlkns|~|{}zxwwwy~}}~|yvsolihfggzzzvtqonmmmmmmlkkkpu|xutsuw~}{www}|zxurmjcgvoppruwz{||zxtqmkkou~{||ywvvvx}}}}{xurokigfgg|zyuspnmlllmmlkjklqw{wussuw~|zvwx~|{ywspkh`humoortwyz{zyvroljkpv|y|~zwvtuuw}||~~|zwtqnjhfffh}}ywsqnmlkkkkkkjijmry}zvtssuv}{yvxy~}|zxvrojf^isknnqsuxyyywtpmjjlrw~|x|yvtsttv}{{{~}{yvspmihffek{xvsqnmkkkkkjjiijns||xusrstv~{ywx{~|{ywtpmhd^lrknnqsuwyyxvsoliikrx}{x|xutsssw}{{{}zxurnkhfdeclzxurpmlkjjjjjihhjns~|yvtssuw{zxz}~}{zxurolgb^nqlnortvxyxwtqnkijmtz}{x|yvtssrw|zz{|zwuqnkgfdecoyxurpmlkjjjjiihhins|yvtstux{yyz~}{zwurokgb_ppmopsuwyyywurnkjjnu|}{y|yvuttsx}z{|}zxurnkgfdecqyyuspnlkkkkkjjiijot}yvtstux{yyz~}{zxurokgbbspnpqtvxyzywuroljkou~{{|ywututz}{{|~{yvsokhfddduzzvtqomlllkkkjiijpu}yvtstux~|zz{~|{xvsplhbfuqpqsuwyz{zxurolklpu|~}zwvuvv{~{||~|yvsokhfdddwzzwurponmmmmlkjjkpw~zwuttvz}z{|~|zxurokhbhvrrsuwyz{{zxuromlmrw|~{xwvvv|~{{}|yvrokgecbey}zzwurpnnmmmlljiikpx~zwuttvz|{{}}|zwurojgbkvrssvwy{{{zxuromlmsx{}zxwvvv|}{{}~|yvrnjgdcbgz}zzwurponmmmlkjiilp{}zvtstv{~|{{~}{yvtqnjfbnvrstvxy{{{ywtqnllnsy~{|ywvuuu{|z{~~{xuqmifcbai{|zyvtqonmlllkjihilq~|yvtstu{}|{|~|zxvspmhdantqrsuwyzzyxuromkknt{}{{xvuttt{{z{~|yvsolhecbal|{zxvsqomllkkjihhins~{wusstu{}{||~|zxvspmjfbaosprsuvxyxwuspmkjkou~~{z~zwutsrsyyxz~~{xurnjfdaa`mzyxvtqomkkjjihhggins~zwtsstu|}|}~~}{ywtrolhd`boqpqrtvwxwvtroljjkpv}z{|yvtrrqrxxx{}zwtpmieca`apzyxuspnlkjiihhgfgiou}yvtsstu|}|}~|{yvtqnkgc_cppoprtvwwwvsqnkjjlrw}y}|xvtrqqsxxx{}zwtpmifca`bqyxwurpnlkjiihhgghkpw|yvtrrtu|}|~~|{ywtqnkgc_eppoprtuvvvurpmkjjmsx~z{xusrqpsyxx||zwtpmifca`dsyxwurpnlkjjiihhhilqz|yvtsstu|~|}~}{ywtqnkgc_hpppqstvwwvurpmkjkmsy~z|yvtrrpsyxy|}zwtqmifba_esxxvurpnlkkjjiihhilq}}zwutstv}}}~}{yvtqnkgcalrrrsuvwwwvtrpnlklot{|}zwussruzxy}~{xuqnjfca_gtxxwusqonmlkkjjiiimr~zwutttw~}~~~|zwurokhdcnssstuwxxxwuspnmlmpu}}}zwvttsw{yz}|yvrnjgca_itxxvusqonmlllkkjjjns~{xvtttw}~}~~}{xurokhdeoststuwwwwvtrpnmmnqv|zwutssw{y{}|yvrokgca`ktwwvusqonmmllkkjjkot}zwutttw~~}~}zxurokhcgpststuwwwwvtronllnrw|ywutsswzy{~~{xuqmieb_`mtwwvtrqonmllkkjiikov}zwutttx~~}}{xvspmifbiqsutuvwwwvuspnmlmnsx~|yvusrrvyx{}~{wtplieb_answvutrpnmllkkjiiikox|yvusttx~~~~|ywtrolhebjprtsuuvvvutrpmlklntxztpllorv|yk^USRTW`deijiaYcsxw~zwuuvwz}~xoktqrvx|{{|{xvrqt|lb]`ifZVICA@BDFJOTZ^`_^^h~o`TIGFJMP_jq{|tfhiluqep°xl`YTT\k~rjc^\U^ksypnu{{w|{yxyz{zwpja]durhgaeipv||ĽlXVlhSG=843468;?DJPV]_bdotz|utqmhb\WV[eu~ysrqrpry|wmhevt`QLTnp^TPT[dlpqnhc\XTSNTl{wqorpolhht~vqqw|upms~|j_\ima_Y[_ekqx|~þx{rhi_OD81/./0259=BFJFPX]fnv~{oijptsyykgb`__`cfjosuurvžm[MGLaq]NGGLU^fgfg`[WWX_cj~~yt{}~{{~{unf`^dt}vw~tf`hx~{uxvmd_ZWSOJB;7ADHMPTR^ejrx|rifinjhmsvrngfdddginsy~~}~pbWRUarl_XY^fmouuojc_]_ckow|yv}|rq~}{||}|zwsnifgpzw|vvu|}{xqkga\TLEBGQZXXUOQKS[^eiosww~ysonr}tqlt{yvrllnrw{}|xx}rnjkkopy|hYXd{}dVOOT[bghf`ZSMLOU^ekyxog`]^es{{xtvuwx{|~~~xx}wrnnr{}mldda`^^]]]^_bdhikddhdir~xux}qonnnnljfb\\gq~zjc__`deozzvnmsw`WYetyzwkcYRKHHLRY[ku{|~z~xplo~~ttstsuuvwxyyvsmlr{zvnlow}~ve^YWUTSSRSSUSW]_dhhhtv{}}skgfeda^ZVRRXdq~~qwtsrs{|ukdbhr|vkpvz}qfabk{uontz}rfZQMT`pp|~}wwwrsrsrpmnu~{y||wy}wpidgsyxzqqsvzzzg\UQNLKJIIIKMOSVZ\[hlqw{}~vohddijdc_dnxxyvhkjghiknrv|}zvwy{{yw}sg]WXarlgfkpvztmheejoy|||xqkmy|zxxxvtqnkkoyvnr}zzuy|unh`XPOS\`_`YWWXZV^egmottx}}zxuqmkkq{~oq||||uqqrvz}|qmjlnr|~l_\fwye][_flqsqlg`]\^cjqwysmjedgp}|yusrv~ytomjiggfffhilnpnlbbko~~~wqpz}rokkiifc\_afs~xvga]^_fsy|xs~ups}mdjsx|wqiaYTQQTZbil}zqjiu~xyxyxyz{|~|vtx|topw{ke_]\\\\]\[bcfjnqutu}nea^\YVSOMNVbpz}zszv|qc^cmwzsnjhdqyypieiqyy{reYSWbouw}|zywwwxwuqpv~{{~{~}{wslhit|}vutvvn`ZVTRRQPPPQSUX\`dferuxzqh_^agea\UX_jprvpmchjimotx}vsst|xqqwyu~}|tj`XV[i|{mmly{tnjjmtz{upkhkxyurrqomjikr|}qjm~vqnmuvx{}ukaZVX^edf`XUTUWY[Xchinpqz}}~zuspmiecelt{zvvqutyzwuvx{vomuttqedefo~|~|ykb`hpxsdaciotwvrmga^^`bnx|wnju{snjfcbcit{}~z{~w|~z|yxvsqoqwzuqponnmlllljifc_`_l}{}vzyy|~}xqmmwyzylgca_ZW[Y]gs~}rimnjj^ZZZfnt|{vqolmtvwqqw|{x{}zywtng`ZVUW[ckrt{tlfgrv|}z|{||}~~}yvzz|xqmmr{y~}~|nieddcd`dhfjkoqtvzwz{qstsug_ZWTPMKKOXcou{zzrq~}ywppfelm|~|~}~zvpjea`aefv}zrjedj}qe_`hltywzw~|zyyzzzxtsv}|~}~}zwqmmv||zuz}|~pga]\ZZZZZ[]_cfjmqqoy}rebcfcd[TSW`imtuqpmgossy|~{wvu{rllpqvwow}||wqh`ZZap{|wtsv{zxusmjjs{}zvusrpqsz}z~zrtwuxy{|}shbbgknphd`^^_adegcnqqrv~}~{yzuolgdaabhmrpvx|z|}tlgmnvxoko|xuvx~~zogehkx{xx|stv|ztolhkuzxokmz|toljhhjqy~{xv|}||zxqyzwxvvtstw~~ywvutttsrpmjfhkus~|xw{xz{}~}xrlipsxznic]_^[]bku~sh`bdgmeacmpw{~~|wrmiejqu{~zspr{||xrkfb`bflt{~{unijrz}zzzv~ysonpu~}x}}wsomjhnnnpqstvx{|~{}}wmgjllqe]XSPNMNT]hot}zzv|{xqfbehvtoxwuwwwuqke_[Y[_ejl|~|yske`hu{snnoourrux{y~|{yyyzxwrrq||}y~~~~{xsoow|zvzzz}|~zvuxzyyy~qjeca```aabdfhkmopns~}}zspqlslifdaVQNRYbgkronmmlhtxzxrqww}sy}yphegginjkmjswqnf`ZY\hx~{}xvux{yvtrolhefotzurnmlmouz~~wpspqqstuvvwxyz{|{yr~~wnnqqurjfa`__`bdffgcmolwx{~yvv}}rleb]\[^bginx|~zqu{y~xpga_gjqtpwz~{upmmnsw|yztpkkikqt}sstx|~|vpimpry{vrrtuwzqkgedfks|wwry~~zvussssrqkturrqqpsw{ywvusplhdbektwvwwpxuwxz{||}|{wslhfmovxhcb\ZZ]dlw|wncZUZ^fpgmnquwxurmhc_fhnv~}vqpt}}|xsmgcbcglt{}vlggoxx{wtvz}}zspmmpxyuy||xpqtqsstuwxz}~}{|xnf`beipd\UPLLOV_jpy{}zl^W[iq}xturqlhb\XVW[biqvu~wridjo{{wxvyysrrv{~{txx~|}|wspw{}}z|uqrz|sruxwpjfeddefhjloqtty||znb^cj{wti\SMMQYbgqusuuvwxv{smltzzsjebddkljlnqtovvlg_\[am}w}zz{~~{xwusojgelr}}yspoosuuw|{tsqrrssuvwyz|}}{}}wvv~~wpkgdcccdfhjlnmjry|~{usxzumd^YXY]cix}{t|}xsle_^cl~ztoljkosxz{srvoqmqonvuknsxtwsuy~~ywx}}}ttuxyqkfefls}}~|{}~{vsqpooppqpojsuqrqsu|~{xvrnjfegnu{|xnmwuuwxyz{{||{zwrlgeikpxme_\\`hqy~}}yrkd\VTYahxxttttroje^^bbhow~~wrnou|vqkhffint{{xy~~}pkipu~}w~{vrnnqx|uvvnmjklrz|wty|{}xvuuvwwxyz{}}~~}vs~xuvy~ysme`\_ael_XQNNRZckq{v|}ukc]]_gvtvtonie`ZVSRTZ`hossnuoddfgq|snklosy|z~}{zvuxrqs{~yy{}ytrpvw{x}{|}~yxvrmknw{toruyyrmjihiijklmnnvwwyvsypf`^elsrcXPNPW_elussstuxy{y{vpkjktv}tmgddccgb`adhmnnfih][X\er}y}ywuuuv{~{xvtsqolheelpxwrnlq}zsnpqu|vrooooppqrsstru{xvt}|}~zrrx~vpkigggghijklmmkfyzx||~~{upnrr{xkc[XWZahu}|z{v~zwtplga]dmozvpkgedfimprppimsnqiilv{rnszyyx{}ywy}woijlq}uokikpx~uqos}xtqonmmmnnooonirtqstw}{vqliilrv}{uqivyuxwyyzzz{zzxurlgbelsyniddgltyz}zuplgc^[Z_dv~zvqke^baafksz~y}tomnu~|z~~xspnoqu{~xspqp{{vww}|xtpmmpuz}yoqumnmqu|}x|{}}}}~~}xquyux~|xuqlf`\\^cne_[Z]clq{}unjhiinpmq{}vnha[WTSUZ`houyytkooijnx~}vrpqty}{}|wusx{}{vssy~}urxnllr|~wrrt{{vsrqqrrsrv}{~~|}|wqlhgempmvlaZWY^eiuyyz{}~}{xtpont~~ulgecgga``cgloqolacb[]aly{xuttw}~{xwutsqokigknxytx{~~wpkiqxxuqpoppqrrsqw{z{zxu}}|vuy|tolkjjjklmmoopmrqz~{|zsolnluse^XX]gr}|}|}x~|ywtqnmhgjhit~xqkfcabdfikmooqjougfenx~vqqy|zz{|{~|tmgcdhmzsnlmry~wmhgw~xsnljjiiijjkkkjidnpnqu{wpkhimqw}yuqnhmiowrvuwwxxyyxwuqmeefgirxnkilrx}|zyzz{uqmifda_\[Zeqyypja^`\]`elsy}~zqjohgjr|vrv~|vqnllnqv{}wpga_ch{}~{}~~~}}x|y{wqlhhinryzvqlh`djfkov~|xt~}||||||{zyuqjmij{{{xvsqokf`[XY[`kc__bhmr|unihimpwrlfktt|rjaZTQPQTY`flqrqjfbgffoz|ww~~uokjknrw{}~}~|ytrqvx~}}|xsnlvv~|{{{{|{{{zxvqmdajhpy}wroqt{|wsqpponvwwyzzzy~||xsqpqqqtkgdblf_^^dgpyxzyz{|~{}{zxwuqnjpvtupkilf`][]`eillke_TY\Zcn}{uollov~|yxvutrpnjgehjr}~}wqignovzvrqopopopxwxyzzyvs~}~}zspmlkkllmnopppwuq}~yrkffclla``ip~~~~~y}{ywtsqpmsurqnv}xpida`abdgimpsswjfjcho|~ywx~{vqkeaachxvtuw|yslnv}uqmkjjjjkllmnnmlgptry~uqnrt}}yvtpotrls{wyyzz{{{{{zxsvpjfggq}wxx}~{uqnlkjjklkigmqs{~vkif`achmsy~ysidlilr|~xvy|xtstvy~~xqjb^^el~~xqkijnq|~{yurokibhomsx}|xuonrppv~{ywvusqnje`[[[bqnnoru{unkilow|yrnqnorzpg^YUUW[agmrttqsnf`jnsyvxztqpqswz~}zvrorr{{ssuzz}|{{zzyywuroie`csu|wstw}zxuv}{||}}}{~|~zwsrruw}}tkb^\]klikmpz~}~|zyyyyxwroqlmly}ttqga\Z[^cgkllie_ZQYcfsvngdcdjorzwwtnaWV[Z^dkqv{}}ulgdejtx|||yvp|}uuokpw~|vumjjige`bkzy{psvw~nbveLGAABFIMORUWZ]_bcc]chjorvww~}z|wuvvwxxxxxxyyzxvlee^`jxtk[]^bjs}ïy\E@Zöw^F8-()/9EQ]fkmlf]ORPPV]gpw|{ukhqrxz||~{pdXPWnxjcZWUUUWY[^adhkooofba[]dpxupnijlonmhhqyvowzûo_]qn_QJB=86432357:=AB>JMRX]bfgqv||y}wtqnmlkklmnppoecc^cn~}qeiiowt`OFNnuaQE>;9888:<;;<>@DEHBKQSY]bfhlvy~wyytplihgghjloprmimggkywgiinw{k[NJYsbSJEDHOW`glnlh_RTOORW^hnz{~}yjfjjpruuuw}wog_X[l|wmidb_^]^_bdhkoprjjja`akx~|}vuuvwtokq~u{|ýwg^focZRMHEB@??@ADFHGEPQVZ`chhpw{zuzyupmjihhijlopphlkfhn}|nehgowueUIMcq`TKHINU]dknolg[SUOQTZbkq~{{ufihkoqsstx}wph`XU^v||slifca```acfiknpneid__do{}|vuttrnijuvtyz}n`_p~lcYTNKGECBBCDFGIEHRRX\bejjsx|~yrr}~yuqnkihhhiklmidkfegr~}xecdfnv|k[NHRq|l]SMKMSZbinqpleWVTORV]emt|}zndiglorspms~xqiaZ[g{}rokigedddefhknopkgkdaait}xvvurmjn|swy{xj`czzkd\XSPMKIHHHIJKKFOSUZ^cfijtw{{{zsnq}wtpmjhgffhilmojjpklp{zyvm`dcjr|vgZOM[~{l`WRQSYaiotwvrj]_YVWZ_fnu|lihgjkmmnov{tnf_[_n~|rqlkhhffghikmppqijkdccku~ywvtqkjq{tyw}tgafyof`[WTQONMMMOOQMMWW[_cgkloyz|}ysptyvroljiiiklnppiqqnos~xxywjcedls}reYPQ`~mbYVUZ`govz|zvjde]]\aems||lnikmopppqxzuoia^ct{usonkjiijklnqssrkqlheelv{zyvrlkrywzx~vjdkyqgb]ZWUTSSTTVVXRW^]cejmppu}{usxzwspnlkklmpqsqmvrsx{zrtxssdefirz{{pd[TWi~nd]ZZ_emu||onkccaehos~{qpjllnnnmou~ztngej~}|wurqoonoprsuvwqqvnlhjp{}{yromx~x}y|}rheq{tlgb_][ZYYYZ[[ZU_`bfiloqqx~~}~ytnovywspnlkkkmorsvpuzvxx~uousrmbfdkqzzyuj`WU[s|ne_]_dkrzyorjfeehlrwvsnkllnmmmpw{vpidfpzzutrqooopqrsuvvnsslkhkr|~{xtnlm{||tyuz|ynghzxoida^][ZZZZ[[\XXa`dgjnqss{}~~zuolo|}|wuqpmlkklmoqstnvwuwxwpoupod^aaioy|sx|qe\TUb~vkb^]`fmu|tpqgfdfiotzsrkllmmmllpy|wqkdbfv~xwtsqqppopqrstuqltokiglt~}zvtnihozy}stsswy~|rhel~wnidb_^\\[[[\[\V\b`fglmqrs|~{z}~|}}zupjedk|}xvrpnlkjjkmnqsvss}yz{~vmgjmji^`_dks|xto{~vj`WRWitjb^^agnu}uwskjgikptzxummkljighlu~yrlfgn}zxwvttsttuvxwxrqvpnjkpx}xsmiiuz}}rvqtvz}zpgfp}umhdb_^]]]]^^^]Xcdeilpquux}{~|}}yuojden|yuspnmlkllnpsuwsy{}|ridjikf]`^ekt{{wpr~uj`WTZorha_`djqyx|somlmpuy|uppnnmkiinw~yslggp~{zxwuuuuvwxzyyrxxrpklpy~ysmhitwyuuquv{}|qhfruojfca``_``bac^`jhlnqtwzy~}|}ytoiefq{wurponnnprtwyzv~~}pgchglda``gmv}~{vpwtj`XV^ttidachnv~}utqqrv{utqqpomkgkt|wplmz}|{{{{|}~}x{wtppt}|unjnwzzyvtvx{~ynghvwqkhecbbbccede_glkoqtwy{z}||z|}{wtojc`bp}zwtrponnopsuy{~|~th_`cej`caekry~xzuqn|{qg^XXdxsjdcejqyzwtttwz~xvrromjhhmvzunlo~}||{{{}}~yzywsppu~~yqkhpu{~wwrstwy|ulglx~wpligeeeeefggealmnqsvxz|{}{z}~|zwtpkfaagv}xusqpooopqtvyz}yzmc]aaed_a^ejqx~~wrsoily{~tjaYV[l{pieegmt{}yvssux{|wsqomkhghox{upklu~}|{{z{{||}||t{{utpoqwxskgiqs|xtsoqruwz|xoihs{{uokhgfeeeefffadnkoqtvx{{|}||yy|~~|zxuqmhb_`kx|ytsqoonnopqsvxyzwznc[Z_^f```ahmty~~yumllhdox{yof^XX`tzoiefinu||xvuuxz~|yusomifeflv~|wqoq}~|x|yvssu{yrlimtu~uuqorsuwz|~}vnilw~{upmjjihhiijiicjomqsuwy{{}}{||zvwz~~{|{{zzywuspmhc^]_lu~zxvqqopopprsvx{}~wkaZ\]_d_b_diouz~|wrkjjecqv|~ulc\Y[gxzqkhimsz~yxwx{}}yusomifehmw~{vqptz}|{wutv|yqliorx|vwqqrtuxz|~|unjnv~wspmlkkklllljgrrsuwy|}~|}zwx{~~||{zywusqmid_^bnu||xutrrrrstvy{~~wk`Y\[cebdagkrv{~~{wqklkdjvx~ume^\^kxyqlklpw~}{{|{wurolihjoy|wsqv{~}xvuw|zrmjpq{{xvqrrtvx{}}uokquxtpommmmnonojlvsvwz{~{{xuuy~~|zyyxwutrpmie_[Zalvy|vutsstuwy{~}pdZVY[efgffkouy|~~|zvrlhkidqy|zrjc]\`nz{snmnsx~~~{wsokhfhnv}|vsr{{xwzyqklptz{trssuvxz|yqkkqwxtpommmmnonnirvtxy{}}{}zwtuy}|zyxwvtsqnjfa\YZem{~y{uussstuwy{~xj_VVX]fcfbfjotxz|{yvrnhejeeuxxog`[[esvokjmrx}}~|yuqmifehox~|xrqs~{yvwz{slhmow|vvoooprsvwy{}{tnjnu}ztqmlkkkkllljgsstvx{|~}{}~{wtruz}{zxxvvtrpnjfa\XW[hpxwwrrqqqrtuwz|}pcXSVV`cab_dhmquwxwtqmhcaf_gtv|sjb[Y\iw{rliimry}||}zvrnjfddfmuz||xspqx~{ywy}ypjjoq{{xsnonpqstvxz|}~}}vojipuztpmlkkkklklgjuquvxz|}~|yx}~~|yvrooqw}{ywutsrqomkhd`[VST]hr~twurrrssuwy|~ug\SQVXcdecdgkoruuusolgd_`e_mvzxog_ZZ_nz{sljjmsy~}~yupkgddhnw||xspq{|zxy~woijnr|yxqonnpqstvxz|}~|unijqwzvronmmmmnmmhswtxy||}{z}{wsqprw}zzwvtsrpnlifa]WUU`hw~uzvtttuvwy{~tg\SST[ffgdgjnrtvvusplhd_cdbtw~woga\\co}|tomnrx~{vrmiffipw~}ytst~~{zzxqkmnv~|zssprrtuvxz|~~|uokmqy~zvsrqqqrrrpmzyy|}||~|yusrty~}|ywutsqomjgb]YWXbi{~x}xwwwwyz|~{qd[TVVbklmjnpsuvwvsqmjfc_fciyz|umga^_hrwrqrv{}ytojgfiou|}}yutw~}}yrmop|~ytsrrstuwy{|~~{uoknq~~zwusssstssos}y|}~~y|~~|yvsopqvy|}zwutrqonligc_ZWUZbl~yy}xyxyz|~xmaXTUXfjlkjmpsuvutqnjgc`]eanwzyrke`_alv}vrqsw}|wrmifgips~~{wut{|}~}vonoq}~|usqqqrstvwyz{||{||vqmmqt}zvutssstrsmv|x||~}zy~~~}|yvspnoqwx}}yxtsqpnmkifd`\WVW^er~uxzvwwxy{}{rf]UUV[gikhiloqssspnjfb_[Z`^osyzsle`]_fq|ztqqtx~|xsnjfdfios}{~{xttv~}{|}xrlnnu}{xqpnoopqstuvxxywz}|}ysolorz{xusrrrrrqomzyy{{}~~zwy}}|{yxvromklotu}x~}utqpmmkjhfc_\XUTW`gx{uyzwyy{|~~}~}ul`YSVWbjllilmpqqpolida]\W[^cst}~wpic^^`jsysqqtx}zuokgefinrzx|}|}~}{xursw}}xqmooy~|vqpooopqssuvxxyv{{{vqmlps}|yvuststrsoq|y{{}~|zwz|~}{zxurolklptv|z{wtqpnmkigeb^[WTTZbk{{w{{yzz|~}|}|~sj_WTVXglokkmnpqqpnkhda][X^_kvx}vnhb^]akuzussv{zupkgffknu{}~{xtrrx~~xqnoq~~wsqppqqstuwxyz{x}}}wrmlos~zwvuututtoy~{~~~{x|}~|zxtqnmmqty~~{wusqomligd`\WUT[ap|z}{|}~||||~tk`XUV]koqmnoprrrqolieb_^[adsx}}voic`_dmx{vuvz~{vqlhggknuz~~}zwsrryyrpov~wurrrrstuwxz{|{z~|vqlmov{ywwwvvvtr~}}yxz~~}{xvrolkkoqy|}{vtrpnljgea^ZVTU\dw{xxxyyqg^WWXerttqqqrrrpnkheb`^\]cky{zslfa^^fn~|wvwz~}wqlhgglnv|~~|zwtqpsz~vpoo{{usqqpqrstuvxyzyy|~xrnknp|~zxvvuuutqt|~~{xy{~}{ywtpmkjkorx}|yuspnljheb_[VSRW^i|||~~}yvwvx}ulbZVWZiqspnooppomkhea_\[YZ`nwz}vohb^]`js}xttuy~~ytnifegknu|~|||}}}|{ywtqppv~~~yrooq~}vrpnnnoopqrstuutuy~ytoklot{xvutttsrnx~z}}{xvy{~|zywtqnkiiknqv|yurpnljhec`\XTST[ao}y||}}zwsrqtwnf_YXZaottppooonlifc`\ZXWVYaquz}wpjd_]^cmx}xutvy~ysnigfgjmr~|{yxxxxxxwvurpnnpxxrqpu{uronnnoopqrstttrrz~zvqnkmpw}yxvvuutsq}}|~~}zvwy|~|zxwurolihhjlotywsqnljhfdb_[XUUW_ev~{{vsqrquume^YZ[erusppoonmkiec_]ZYXWZgtv}|void_^`hp~}xvvx|ysnjgfhjmu}|zzyyyyyyxvtqooryxsqpz{vsqpoppqqrstuuust~{wromop||zyxxwwsw~~{wxy~|zywtqnkiijmox|yvspnljhfd`]YWVY_h|~|wsqqpvumf_[[]kvxutssrqomjgda^\[ZY^owy{unid``bjq|{{~zuplihikmy~}|||{{{zywurqptyxtrr|xusrrrrsttuvwwvtw{wrnmoq}}|{zv{xxy~|zxvtqnkiijlm{}|xvsqomkigeb_[YY]bn~ytpnnntslg`_^cs{{wvutrpnkhda_\\[[[dwy}ysmhdaaelu}||}wrmjiikm~}|zzyyyxwvtronntywurw{wtsrrrrsstuuvuurz}yuqnnov~||{zxv}ywxz}{zxuspmjhhjko}|xurpnljhfc`]ZXY^dv|vrommntpid^^^hx{yvtsrpnlheb_][[YZYhxx~|wqkfb`afn{|{|ytokhhijn~}{zxxwwvvusqommpv|{utqz}xtrpoooppqqsssrrn{~|yuqnlopz}{zzxxuw|yvwx}|zywuroljgggjjq|yvspmkigdb_\YWVZ`i}}xsollkmrlf`]^`nyyvsrpomkieb_\YXWVWXlvw}}xrlfa^^aiq|yyz}~{vplhgfiis~}zxvttsrqpomkihinuxtrsyuqonmmmnnooppppnm~|yvrollos~|zyywws{~~zwuwx}{xwuspnjhfffihv}|xuqomjhfdb_\YXY^dq~ytnkiiilqjea_`eu}zvsqomkheb^\YWWVWX\swz{uoje`^_clu|yyz}~}xrnjhgihx}}zyvutsrqpnmkiijpw~xusvzvrponnnoopqqrqqnq~{yuqmklou}{zyxvuywuwz~|zxvtqnkhfffii}~~zwsqnligda^[XWX_ew~ysnkiiinqjfbabl{|xvsqnlifb_][YYYZYdzy{uojea_`emy}}~~ysokihik~|zywvutrpnkiijpx~xus|{wtrpppppqrsstssoy}zvrnkmoz~~|{xz|xwx}~|zxvspmjhggil|yvspnkifc`\ZXZ`h|ztokihioqliefft~{xtqnkhea_\\Z[[^]n~|ztojebabho|wqnkkjo}{ywutsrpnlihgjoz}xuu|xusqqqqqqrsstrro~|xtpmlmp~}z{wwx}{ywurolihfggq~{yuspnkigda^\[_dpzuplhgghoojgefiz}zwspmjgc`][ZZZ[\^t}||wqlgc``cjrytoliigs}{ywutsqpomkhhhlr{wtw}yurqpoooppqqqqpnn~{yurolmot~}{zx{xvwx|zxvtroljgfegfu~~{yvspnkigda_\\]bgw|wrmjgffgnlhfefm}}yvspmjgd`^[YWWXXY_uxz|wrmhda`agny~~~}}}~{vqljghgx}~zyvtsqponljiggiou~}}~}xvt{yurpnnmmmnnnnnmmjo~}}}~~~~}{zwuromlnpy}{y{|~ywvw{|zxvtrpmjhfedegz|}ywtqomjhfdb_^^agn|wsnigeeehnkihhiu}yurnkgd`]ZXWVVVYXexx||xtnjeb_`bhp~~|~{{}{wrnkihj||{xvtrpomlkigfefjow~}}}|xvu~yurpnnmmmmnnnnllit|}}}}}}}|{ywtrommor~}|y}~ywww}zywuspnkigeeek~}}zwtromkigeb`__chr|wsnjgeeeinkihil{}yurnkgd`]ZYWWXXZ[mzz~|xtnjeb`adjr~|||wrokigo~}{xvtrqonljhgffjo|}~}{xuwzvtrpooooopppponm{~}{yvspmmot~|~ywwx|{ywtromjhffep~|zwtromjhec`__chw}xsnjgeeejnkjijq{wsplieb_\[ZZ[\]at|}}xsojfcabekv}~}xsokiiv}zwurpomkhfdcdhn~}}|~{xv|{wtrqppppppqqppmq~|zxtqnlmow~zxw|}{ywuspmjhffhw|yvtqoljgdbabfmzvqmifeefmpmllmy{vrnjfb_][ZZ[[]^hz{wrmiebabgn|~{|~~ytoljkz~|yvtrpnligeccejr}||||ywv}yusqpoonooooonnkt~}{yvspmlnq~|{xwx~|zxvtqnkigeejz}zwtqoljgdb``chr{wrnjfdcdelnllmp~|wsnkgc`]ZYXXYZ[]kx|~~{wrmieb_`ciq||~zy|~ztpljhn|~|zwtqoljhfdbabflx|{zzzzxwyzvrpnmllllllllkjjv}}}|}}||{zywurnlkknt~|z{{|xvwx}{ywuspmkhfdddn|~{xtqoligda__`eky|xtokgdbbcfmomnov~xsnjfb^[YWVVVWYZ`ox|~~{xsojfb`_`dlvz{|xx{~zuqmkis~~|xuroljgeca__afl|}{yyxy~}yxv||wspnmlkkkkkkkjjgkw{|{{{{{{zywuspmlkmpx||~{||xvw{}{ywusqnkigedes}~{xuspmkifdbbdip}yuqmifdccdgmnmopz~xsnjfb^[YWWVWXZ[dry}~}zvrmieb_`bgn{z{|xy|~ytpmjkw~}{xuromjhfca``cho}{yxxy~|yxw~yurpnnmlmllllkkiqy|}|||||{zywvspnlknp}|~}xxx}{ywurpmjhfeiw~}zwuromjhedcejs{wsokheddehnnnorzupkgd`][ZYYZ[]_lv|~{wsojfcaacip}~~z{}zvqnjnz~}zwtromjhecbbdis|zyxz~{xwy~zvtrppoooooonmllv{~}~~~}}|{ywtrommnr~~yyy~|{yvtrolihfnz~|zwuspmkiggjnz}zvsokigffgkqpprv~xsnjfb_][ZZ[\^`dry|yuqmifcbbeks}}y{~|wrolt||zvtqnligdbaadiw}{ywwy|yxv|}yvsqponnnnnnmljmwy~}||||{zzxwurpnlmov}|yy{}{ywuspmkhggrz~{yvtqoljhghkq{xtqmjgfeeflqoqr{|vqlhd`^[ZYYZ[]^fsw~}zvsokgdbbcgmy}{}{y{~yupmlw{~}zwtqnligecaabfl~~{ywvvy{xxw~yurponmllklkkjignvv{yzyyyyxwvtrpnmmoq{|{}zxy~~|zywuspnkigfhuy}{xvsqnljhggimu{xuqnkhedcdflpoqt}xrmiea^[YWWWXY[]irv}}~}|zwsokhdb`adiq~zy{yy{zvrnkmx{~|xurnkhfca_^_bfp~{xvutsxzwwx|wspnmlkjjjjiihgfptvywxwwwvvusrpnlklos}zz|yyz~|zxvtromkhgelwz~|yvtqomkihilq|}~~{xuroligeddegnrrtx{vpkfb^[YXWWXYZ\_mrw}|}|zxtqmifca`bekt~yxzxy{{wsols{{|yvrolifca_^_chu}zxvtssxyww{{wspnmlkkjjjjihgistwzxyxxxwwutrpnlkmov~{{|yy|}{ywuspnkhgfqy{}zxurpmkihimr~}zwtpmjhfeeehoqrt}|vplgc_\ZYYYZ[]_esu|~|yvrnjfdbabfmxzz{yz|xspnw{}~{wtpmjgdb__`cj{~{xvsrsxwww~yvsqonnmmmllkjinwv{|{{zzyyxvuspnlkmpz||}zz}{ywuromjhiuy}~|yvtqnkiijmt~{xurnkigeeejqrtw|vpkfc_]\[[\]^abmwx~|yuqnjfdbbchn~{{{yz~yuqr|||xuqmjgc`^]_ck}zwtrqrvvvx}xurponmmllllkjjrxw|||{{{zyxvurpmkkmq|}|z{}{ywurpmkimxz}zwurolkjlq{|yvspnkigffgkqsuzztniea^\[ZZ[]^`cpvx~}zwsplhecabdjr}yzzy{|wspt|{}zwsolheb`^^`eq~{xurporvvv{zvsqomllkkjjihgisttzyyxxwwvusqomlklou|y|{z|~}{ywurpmjigoxy}zwtromkjkot|~{xvspmkhgeeeflrsv}|vpkfb_\ZXXXYZ\^dprv|||zyvsokhdb``bfmw~zwyyy}|xtpnv{z}zwspliec`^^_cix~{xuspoorvvw|wspnlkjiiihhgfeirqswwvvvuttrqomlkkmqz}zy|{{}|zxvtromjijtyz}zwurpnllnrx~|y}{xvtromkiggfgintuxyrlgc_\ZXXXXY[]_hrrw|{zyvspmjfcb`adip}~ywyyy|xtqqz|{}zvsolheb`^^`dk}}zwtrpnnruuw~yuromlkjiihhgfeelrpswvvvuutsrqonlklor}zy|||}|zxvtromjilwx{}zwurpnmnpt||{~{yvtromkihgfgiotuzyrmhd`][YYYZ[\^bmtsy}|zyvsplifcbabekr~zxzz{|xuqt|{|}{wtpmjfda``aep~{xuronnruuy{wtqonmlkkjjihghqtrvyxwwwvvtsrpnmlmot{|}|}~|zxvtqnlkqyx|~|ywtrponpu}}{xvtromkihhhjptu|ysniea_]\[\\^_afruv|}|zwtqnjgeccdgluzz{z|~yurx}z~|yvrnkgdb``bfs~{wtqommqst|{wtqpnmllkkjiihkttswzxxxwwvutrpomlmpx|}~~}{ywurommvzz}{xusqppsx~||zxvtrpnlkiiikquw~wqlgda^]\\]^_ackuvw|~|{xurolifdccdhn{~yy{z}yut|}{~{xtqmifca``ciz|yuromkmqsv~zvspomlkkjjihggmtrrwxwwvvutsrpnmllnq}}z{~}}|zxuspnlnwyz~{yvsqoopt||{~|zxvtrpnljihghlrvyztnida^\ZZZ[\^_bltsv{|zxvsplifdbabejrzwxz{}yvru|{{|yuqnjgca__aen|yvrpmkjmruyzvspmljiihggfeeemqoquvuutssqpomlkklou}zx{}~~|{ywuspnljpxxz~|yvsqonoqv|y{|zwvsrpnljhgffhmtw}}vpjea^[ZYYYZ\]_cnrruyywurolifca``bflv}yvxz||xurx}{||xtplieb`__bfs~~|yvspmjiilru|}yuqnljihggfeddcfnompttssrrqpomlkjkmpx|yx{~}{ywusqnllsyy||yvsqoopsy|zx|~{yxvtrpomkihgginux|uoiea^[ZYZZ\]^`gqrsvzywurolifca`acgo{}xvyz~{xutz}{}|yuqmieb`_`ciy}zvspljhilru~yuromkjihhggfeejqpprvvuttsrqpnmlkknr}}zz}}{ywuronowzz}~{xurppqt{~|{}{zxvtsqomjihhinty}vqkgc`^]\\]^_admutvx|zxvspmjgdcbbdip}yxz||yuv}}{}}yvrnjgda`adl~~zwtpmjhhlqv{wtqonlkjjiigggosqqtwwvvutsrqonlklns||}{ywtqps{{{|zwtrrsv}{|~|zyxvtrpomkiijpuz{uojfb`^^]^_`bdgrvvwz|zxusomigecbdfkt~zx{}}zwz}}}zvrokgdbabfq|yvrolighmrx}yurpnmkjjihggfhqrpqtwvuutsrqpomllmpw~{|~|zxvsqpv{z|~{xvsrrtx~|z~~}{yxwusqonljiikqv~~xrlhda_]]]]^_achsttuxzxvspmkhfdccehny|xx|}zwv{~||~~{wtplifcbbdiw|yvspljhghns|~zvspnlkihhgfeddhoonnrtsrrqqponllklnr|~|z|}{ywuspoowzy{~~|ywtsrsv|~{yx}}|zxwutrqomljihimsy{tniea^\[[[\]^_bjrrrsvwuspmjhecbbcejq}ywx|~{xuv||{{}}zvsokhecccfm|~}~}}~~|ywtpmjhffiou{wspmkjhgffedcbcinllmqrrqqpoonmlllmpt~{{}~}{ywusqorzzz|~|ywutsux~|ywx~|{yxwvtsrpnmkjjjnt{~xqlgc`]\[[\\]_`dmrqrsvvtqoligecbbdglt}ywz}}{xvy~}|||yvrokhedcdhq~~}~{yvspmjgffjpw{wtqnlkihgfeedcelnmmnqsrqqpoonmlklmpw}{{~}|zxusqpu{z{}~|ywussuy}zy|~|{yxwutrqnlkiijnt}~xrmhda_^]]^^`achqtstuwwtroljgedccehnx}zx{|yw|}|}}zwsolhedceiu}zwtpmifeeipz}xurpnlkjihgffeippooqtutssrqpomlllnqz~||}{ywtrrx|{{~}zwuttv{~|{}|{zxwvtromkiiinu}wrmheb`__``acdfmuuuuvywuromjhfdcdfjp|~zy||zz}}~~{xtplifddflz~|yvrokheddiq}|xurpnlkjihgfefkqpooqttssrqponmlklns~|}~|zwusu{|{||ywuttw~|{{}|{zywvtqomjihjow|vqlgdb`___`abdgoutttuwvspnkhfdccdfkr|yy}}zxz~||~}zvrnjgeddgp~|zwsplifccekt~zvspnljihgfeddelonmmpssrqpoomlkkklpv~|{}}{ywtrqu{zz|}zwussuy~|zxz~|{zyxvusqomkihhkq{xsmhda_^]]]^_`bforqqqsuspmkhfdbbbdhnw}zwy}zxvz~|{{}~{wtplifddfkv~~~~}}~|zwtqmjgdccfmy{wspmkihgfedcbbellkkknppoonmlkjjjkmrz~|{~|zxvtrrw{z{|~|ywuttv{~|yxw{~}{zyxwvusqoljihils~|vpkfc`^]]]]^_`chpqppprsqnkifdcbaceip|}zxz}{yww|~|{|~}{wtpligffhn{}}~~|||~|zxusolhfcbcgo{~zvromkigfedcbabgllkkknppoonmlkkjklos~}||~|{yvtrsy{z{|~{ywutuw~~|zxy~}|{zyxwusqomjihimuzuojfca_^^^_`abelrrqqqssqnljgedccdgls}zy||zxz}||~{xtqmjhfgiq~~~~|ywtpmifdbcgp~~zwsqnlkihgfeddekonmmnqrrqqponmlllmpu}~~|zwutw||{|}}zxvuvy~|z|~}|{zywuspnkihimvzuplhecaaaaabcehptssrsttromjhfeddfhmv~{z~}{y|~}|||yvrolihilu~}{yvspliecbcgr}zvsqomkjihgfedgmonmmoqrrrqponmmllnqx~}{ywvz~}|}~}zxvuvz}{{~~}|{zxvtqnkihinx}xsnkgecbaabccegksttsrsttqnljhfedegjpz~{{~|zz~~}|}~{xuqnkiijny~~}zxurokhebbdjv{xurpmkjihgfeddhnnmllnqrqqpoonmllmos|~}{ywvv{}|||~~{ywvvx}}{zz~}|{zyxvtromjihjq}{vqlheca```aabcekrrqppqrqnljgfdddegls|z|}{yxy~~|{{|~|yvroljiikr~~}~~}|}~|zxurolhecbbem{}zvspmkihgedcbbchlkjjjlooonmmlkkkkmpv}}~}{ywutv{{z{{~~|zwvvwz}{yxy}||{zywvtromkihilt~xsnjfca`___`aacfmqponnopnljgedcbcehmv~{{~~}{yxwz~}|{{}~|yvrolkjknv~}||~}|{{}}|zxvspmjfdbabfp~{xtqnljhfedcbaacikjiijlnonmmlkkkklnry~}{ywutx|{{{|~{ywuuw{~|zyx{~}}|{yxvtromjihilv}wrnifdb````aabdhoqponnoonkigedccdfipy~{{~}{yxx|~}|{{}~{xuroljjkpz~}~~}||~|zxusplifca`bgr|xuromkihfedcbcfklkjjkmooonmmlkkklns|~~|zxvv{}|{{|~{ywvuw|~|{{~~}{zxuspmjhghmx}xtokhedcbbbcdeglrsrqppqqomjhfedcegkq}~||}{yz~}|{{}~|yvrolkjlr}~~|zwtqmifc``bhu}yvspnlkihgfedeinnmllmoqqpoonmlllmot~{yxy~~}||}~{ywuuw~}|}~}{ywspmjgfhnz{wrnkhfeddddeegiotsrqppqqoljhfeddfhmt~}~~|zy{}|{|~~|yvspnllov~~|zxurokhda`_bjx~{xuromljhgfeddejnmlklloppoonmllklmqw~|zxwz~}|{{}}zxvvvz~||~~}{zwurokiggiq~}yuqmigedccccdefipsrqponoomkhgeddefiox}|~}|zyx|~|{{|~}zxtqomlmqz~~~}|~|zxvspmifca``dn||yvrpmkihfedcbbejljjijkmnnmmllkkklos{~|zxvvz}|{z{|~{ywvvx|}{zz~~}|{ywuspmjhghlu{wrnjgdcbaaabbceiopponmmmmkigedddehlr}}}~}|{zxwx|~|{zz{}~|zwtrpnnpu}}|}~}|{{}{zxuspmjgdb``bgr~}yvspmkigfecbaaaejjihhhjlmmllkkkklmpu}{ywvw{}{{z{}}zxwvvy~~}~~|zz{~}|{ywuromjhghmw}ytplifdcbbbbbcdfkpponllllljhfeddefinu~~}}|zyxwy}~|{zz|~~|ywtrpooqw~}}~~}|{}}|zxvsqmjgdb``biu|yvspmkihfedcbacgkjiiiikmnmmllkkklnrw~|zxxz}}|{{{}}{ywwwz~}|{~~}|zxvspmjhginy|xtpmjgeddccddefiorqponmmnmkigfeefgjpx~~}|{yy|}|{{|~~|zwtrpopsz~~}{ywtqnkheb``cjw~|ywtqomkihgedddfkmlkkjkmooonnmmllmosy}{yy|~|{{|}}{ywwx{}~~}{yvspliggip{~{xtqnkigffffffghlqsrqonmmnmkigffefhkqz~}|zyz}~|{{{}~|zxusqpqu~~~|{yvspmjfca_`cmx~{yvsqomkihgedddglmlkkkkmooonnmlllmpt}}{zz}}|{{|~~|zxvvx}~~~}{xurnkhffir|}zwspmjhgfeeeffgimrrqpommmmljhgfefgimt~~}|zyxz~}|{z{|~}{yvtrpprx~~}~}{ywtrokheb`_afp{}{xurpmkihfedcbchkkjjiijlmmmmlkkklnqw~|zyxy}}{zzz{}~|zxwvwy~~~||~~|zxuroligfglv~|yuqnkhfeddcdddehmppomlkjjjigfeddegjow~}|{zyxwwy||{zyyz|~~}|zwusqqqt{~}}}~~}||~~|zywtrolifc`_`bit}~|yvspnkigfdcbaacgjihhgghjllkkjjjklosz}{ywwy|{zyyyz|~}{ywvvwz~}}~~}||~}{ywtqnjhffhnx~~{wspljgfedccdddehmonmljiiiihfedddehkqz~}|{zyxvvvy|{zyyyz|~~}|zxusrrsw~}|}~~}||}{yxuspnkgda___ckv}}{xuromjhgedcaaadhiihhggikllkkjjjkmpt|}{yxx{}{zyyyz|~|{ywvvx}~}~~}}}}{ywtpmjgffipy~~}zvspmjhgfeeeeeegkoponlkjijihgeedefimt~~}|{zywwx{}|zyyyz|~~}|zxutrrty~~~~~}{yvtqnkheb`_`dmw}~}{xvspnljhgedcccgkkjjiiijlmmmllkklnqv~|zyz}~|{zyz{}~}{ywvwy~}{xuqnjgffiqy}}|yvspnkihggfggghjnrrqonlkkkkihgfffhjov~}|{zyy{~~}{zzz{}~~~}{yvuttv|}{ywtrokheb`_`eox|}}{ywurpnljigfedceillkjjjjlmnnnmmllmorx~}{z|~|{zyz{}~}|zxwvwz}zxtqmigefjsy||zxuromkjihhggghikprqpomlkkkjihgffgilqy~}|{zyxx{}}|zzyz{}~~}|zxvutux~|zxvspmjgda`_bhry|}|{xvtqomkihfedccfjkkjiiijkmmmmllllnpt{}{zz|~}|zyyy{}~~~}{yxwwx|~~}{yvsoligfhmuz|{yvspnkjhgffffffhkoppnmkjiiiihgfffgjms|}|{zyxwvw{}|zyyyyz|~}|{ywvuuvz~}}~~}}}}|zxvtqolifca`adltz||{yvtqomkigfdcbabeiiihhghijlllllllmorw}{yyy|}|zyyyy{}~~}|zyxwwy~~}}~~~}}{ywtqnkhggjpw{{zwtqoljigffeeeefgknonlkihghhgffeefhkpv~}{zyxwvuuwz{zyyxxyz|}}|{yxvvvy~~}}}}}|}~|zxvtroljgdb``afnvz|{zxuspnljhfecbaabfhihgggghikkkkkklmosy~|zyxz||{yxxxxz|}}|{yxwvwz~}}~~~}{yvspligffjqwzzywtqoljiggffffffimoonlkihhhhgffefgilqy}|{zxwvvvx{{zyxxxyz|}}|zywvvwz~~~~~~~~|{ywurolifda``bgpvz{{zxusqnljigedcbbdhjiihhhhiklllllllnpt{}|zz|~}{zyxxyz|}}|{yxwvx{|zwsplifefkrwyzywtromljiihhhhhikoqpomljiiiihgfffhjms{}|{zyxwx{}|{yyxxyz|}|{zywvvw{~|zxuspmjgda``biqvz{{zxvtrpnljhgfdddgjkkjiiiijlmmmlllmnqu}~|{{}~}{yxwwxz{||{yxwvvx||yvrokhedflrvxyxvtrpnmkjjiiiiijmqqpomljiiiihggfghkou~~}|zyxwwx{|{zyxxxy{|}|{zywwwy~}{ywtrolheb`_`cjrwy{zywusqomkihfeddehjkjjiiiijlmmllllmorw}{z{}}|zywwwxy{{{zyxvvwy~}{xtqmigeehntwyywusqomlkjihhhhhjnppomljihhhhggffgilqx~|{zywvvvxz{zyxwwwxz|||{yxwwx{~~~}{ywtrolifda__afmtxzzzxvtromkigfdcbbdgiihhgggghjkkkkklmptz~|{yyz||zxwvvvwyz{zyxwwwx{~~~~}{xurokhfefjquwxxvtromkjihggfffgimonmkjhgfffffeefhjns{~|{yxwvutuwzzyxwvvwxz{|{{zyxyz~~}}}}~}{ywuspnkheca``bhouxyyxvtrpmkigfdcbaacghhggfffghjkkkklmorv}}{zyy{|{yxwvvvwyzzzyxwvwx|~}~~~|zwtqnjhfeglruwwvuspnmkjihgggfghjnnmlkihgffggfffgikov~}|zyxwuttuxzyxwwvwwyz||{{zyyy{~}~~~}{ywuspmkheca`adjquwxxwvtromkihfecbbcehihhgggghijkklllnpsx~|zzz|}{zxwvvvwyzzyxwwwwy~}zwtqnjhfehmruvwvtsqomlkjiihhhhjmoonmkjihgghhggghjmqw}|zyxwvvxz{zyxwwwxy{||{zzyyy|~|zxvtqolifca`aekquwxxwvtrpnljigfeddehjjjiiihiiklmmmmmoqtz}|{|~~|zyxwvwxyzzyxwwvwz~{xuqnjhffhnrtuuusrqonmlkjjjiijloqponlkihhhiihhhiknsz~}{zyxwvwy{{zyxxwwxy{|||{zyyz}~|zxvsqnkhecaabfmrtvwwvusqonljigfeddfikkjiiiiijklmmmmnorv|~|{{}~}{yxwvvvwxyyxwwvvx{}zwspligefjortuutsrponmlkjjiiijloponmkjihghhhhhhjlpu}}|zyxwvvwy{zyxwwwwxyz{{{zzyz|}{ywtroligdbaachosuvwwvtrpomkihfedcdfijiihhhhhijklllmnpsw~|{zz|}{zxwvuuuwxyxxwwvwy}}zxtqnkhfeglqstuutrqonlkjiihhhhiknnmlkihgfffgggghjmqw}|zywvuttvxyyxwvvvvwyz{{{zzz{}~}}~~~}{ywurpmkhecaabekptuwwvusqomkigfdcbbcehhhggfffghijkllmnqtz~|{yxy{{yxvuttttvwwwwvvvxz~{xvrolifeehmqstutsrpomlkjiihhghilnmlkihfeeeefffgiknsz~|zywvutssuxxxwvuuuvwxz{{{zz{|~~~~~|zxvtqolifdba`bflqtuvwvtrqomkigfdcbbcfhhggffffghijkklmoqu|~|zyyz{{ywvutsstuwwwwvvwx{}{xurnkhfefinqstttsrqonmlkjiihhikmnnlkihgfeeffgghilou|}{zxwvutuwyyxwvuuuvwxzz{zzz{}}{ywuroljgdbaacgmqsuvvvtsqomljhgedddfhjiihhhghhijkllmnorw~}|z{|}{zxvutsttuvwwvvvwy}~|yurnkhfefjnqrsttsrqponmllkjjjkmoponljihgffggghijmqv~~|{yxwvvwyzzxwvvuuvwxzzzzzz{~~|ywuromjgdbaadhnqstuvutrqomljigfedegjjjiihhhhijkllmmnpsx}|{{}}{ywvutsstuvvvuuuwy~~{xuqmjgeegkoqrssssrqponmmlkkjjlnppomljihgfgghhhiknrx}{zxwvuuwyzyxwvvuuvwyz{{zz{|}{yvtqolifdbabejoqstuutsqpnlkihfeddehjjiihhhhhijklmmnoru{~|{z{||zywutssstuvvvvvvx{|yvspligefhlpqrsssrqponmlkjjiiikmonmljigfeefgghijlpu{}{yxvutttvxxwwvuuuuvwyz{{{{|~~~~~|zxvtromjhecbbdgmprstttsqpnlkigfdcccdghhhgggfgghijllmnpsw}~|zyyz{zywvtsssstuvvvvvwy}}zwtqnkhgfgjnqrrrrrqponmlkjiihhijmmmkjigfeeeffghiknrw~~|zxwutsstvxwwvuutuuvwyz{{{|}~~~~|zxvsqnligecbceinqrsstsrpomkjhfedcbceghhgggffgghiklmnoquy}{zyy{{zxwutssrstuvvvvvwz~|zwtqmjhffgkopqqrrqppnnmlkjjiiijlmnmkjigfeeefghijlosy~|zxwvtttuwxxwvuuuuuvwyz{{{|~~|zxvsqnligecbcfjnqrssssrpomljigfddcdfhiihhgggghijklmnpru{~|{z{||zywutsrrsttuuuuvxz}zwtpmjhffhlopqqrrrqpoonmllkjjjlnoonlkjhgfffghiikmpt{}{yxwvuuwyyxwvvuuuuvwyzzz{|}}{yvtroligecbcfkopqrsssrqonlkihgfeefhjjjiihhhhijklmnopsw|~|{{|||zxvusrrrrstttuuvw{|zvspligefhlnppqqrrqpponnmllkkkmooonlkjhggfgghijlnqv}}{yxvuuvwyyxwvutttuvwxyzz{|~|zxvsqnkhfdcbdhlopqrssrqpomljihfeeegijjiihhhhhijklmnoqtx~}{zz{|{ywutsrqqrssttuuvy}~{xuqnkhfefjmoppqrrrqpponmllkkjkmnonlkjhgfeefghijlnsx}{yxvuttuwxwvuutssttuwxyz{|}}{xvtqoligecbceimpqrrssrqonlkigfedcdfhihhgggggghijlmnoruz}{yyyzzywutrqqpqqrttuuvx{ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m37.bin b/applications/PoP/poc/res/music/m37.bin deleted file mode 100644 index dcce0f0..0000000 --- a/applications/PoP/poc/res/music/m37.bin +++ /dev/null @@ -1 +0,0 @@ -ysgx{lw}twz]{~v|mxzzp|x{spror[uqt{}|uwvo}tlm}fzmm|}lxwjxs\rrcXvkt]ZhyqUrzl|yp}gzz~g_~{t~||rtruqzu~yTe{nwrnywmp||pautjtzh{dp{zsc_icr{|}o~}uv{f^||z{i_NOroo~s}wokSRry|||{yv~}|ju~ur`bbngiv}nwdgz~}i[Zh~wski`kflvwxz|qu_mhluux~uew{|jnhkmwvtb`a|zi|wek}vmo}tvm{z~{rebtfspn\Q_dhqqcgl`owyu{~}|ol|{vw|znrvZ_]mxjvz{uvhZ`lnjwWealpXVi}uvw~}x|uactxwyeduOYkutwmquilgbgrarzgmqz{hxw\YVX]cx}ecv{v|~zxxvid]oyz~goxkqkxux~{qhzskvufTV{dOagiiwvsjryy|rzvbo|vqb|~xyxyshfjfh|z}jyyt~sffop`jtjhkr`sbZhx~z|w~~t}uyyyyl`it}opay`Yirqmiaonejrs]|zvVerr\pxpb_WXXexoht|r{sp}qqji|}uyulw~z{zmt~yu|r|tv|hqo_ul_bi[jstqzzvqxzysy}{{eblmf}s{ospomgkfupv|u|vup~}tanfvredyqYbowy|rz|uytsz|{}}sfq{zmcp|otvurljtiovqlnmzoRk{{nrs^svn`^_r{{}~{zy|aisyotlmvqepd~tu}v~xsrxntzvtqdf\]seTdsx|}|phu{{z~xsso^es~txkiemlvw}wnltr|~}d`rhsrmazzihjno~{zyrm|rx|w_lgwylywow^vve{{tr{wteql~silggloor~q{{}st}qujjageetxtg~sqsrp~~~rhdmzp[ht~`plbpoomrks{prxz|xo|{wlr{~tqvl~}yxx|r|dzvxu{}ttx}wkvw]tZttbgsxxv~rxp~rwpinpwvx|p{xwuqfsx}r}exxkikw|giwpypudmskhssqyowz~~y{uwdoopvrz{ajm{y|f~z|wxxrzu~|ksp}qgmc]iw|xx{lvzz||n}vzqxiegu|mszspvmn}~yyylpb|~|n`cjek|ltwsptxxv~wsmqn~vty~wuqwv~x^nrgvvssvw}wwovmtebpkdpxz~zv}wrzwt{jdmilrtlttt|vtu}~wkmmq|z|xbqvwuh{gcw|xrp~trhuywx{z}vvpxrvlrkv}yxczpv}m}xqsw{vho{ptfvrcdu~|~z}pvwzxyjmkmpx~ymzumx||pmmkv}`cvprd~|[tpiu{yypzvpp{~|}t|~{jyrimtu|sq{zzn|wpzuzx~gr{yqhk|ifjdiwz}|y|{wnu{zrjglw{otlh|zupwmqmts{z|pblp~y^elz}~svyywvi{}ow~uttxysxs|ztltpvtwlh|~xz|w|unuyj}}_dqkgt|}zto{{}hkkllkio~}v}~rykydoup}rs}mtfqw_gwxvzxpiz{|||yzxv}vsyzkzlx{u|zstvy~|njtv~{~|obosv|tstlhvxu}pvu{pmlmt|yxxj|~~xvx}pkwixpp|~uokjvQr{`iz|t~xws~z{syu~~r}tktuvy{z{y|~yzr}|o~khx{kdty}|zuovuozhjnefs~}zqz~xqoqqnhrvfuvwoylw{n~r~~}{nkxutmnp_t}{vtvz}olu~ty~yyvyszuxvv~}psx}sn|kn}}~uw|{~zysjpvrtmflsniov~~iwz{|{xvqplfiu|{z|vurwoypo|~tl|~y}~pvu]}tYev}|}lssxvz~z}}{||y}{su{~s{zvz|urpv{imxv~ytoin~zmxyuvsq~~z}jrz}}utvyytxmq}||zr|kokd}rvzuotste\w[enz~y~nw{~s|qu~rvwyuqwtu~yz}xo}ngy~umhq{y|}z}}{z|wonomhu~}v{~~{y~z}qukhdj^Kow|||mp{y~|vfnt`oxtgcwgystiomf_lflO^_ekrz^xn{tw{qlv`iti\lztjV]efSjabkstv~}rfqlz}hpu^x}mgm^bu^Rmvj}spcp`zhtub{skszgl]dyg~yqZetjy~tmpk|uY~zfnffNap`dxliz|}zy}gij{ifodkegppeuu[nYjzrprhmahplev{id}yivwcs~v|}ao~xYuwrrmd[jxvppulXye~w{|}z|{\s}XtaPgnujcrqmh_nvs{{xv|{kt}hbks[~g`nlfdijh}xoysz{wx~wrwqiquvysnsru~u~qssk}lzk_ktzbYucThg\fuVmzotzzjk]S\]UYswv||vw}cctxxrz~wl~qtw~oixtoshamugszwrxweppZetolhp{[o~jk~vajwx{swvZ^emkk]gwbcubtS_~}uu{jhqacknkqxflnd{|o}~xjvdu{qstb\{U`reYiwdr|ztsyqz~b_ja`o~{sryr\jsjuv{uvulsmplu~jqgfx}bgx[iyyo~{yahngba^Tb{spyeau}lcy{x{ywbnvyy}ktqlylrdUu~pz}nq}q~yutojxzrxz{}~spm{p^vrpyrpzj_`RTw{pgYYQroXh{f}}|zmvtuycnqrfjtqmtpnkcaUkyyxkwx|z{|o~~tzz]}apXTbdmwqfs{zQsx~|xjvy|_uuovitzypo`uuj{g_ekZnu{xxwl~vmzzmSaxpm|Xpws|piq[u|xgmhjvovdhOJevxto\pwuefztw{{xm{u||nesrh{~t~dflXf{{}~||\Yokyrp~tmumbrwu{e[|p~~~|}t{r}vvz}pn~e}vweWdk}{ndTZpwxh|mnytw^Hlwrw|rmwSRdkbbwvienzv}|{n}}lsxk}kkwsifhdnkpiR}swtrurcmb_rlhlzrw|ukluz}zw{xwmytawzvZq}YMTW[[[[wdYeyugkxvkw}zh`_[MXtw{ttssn|ykvy~xm^ftjhlikhg|qhs|tuoxjmxh~{g}{tyt^kkmmwuumo|ytzwn}}zqVtbtsm`ROMLUjraasz|ehyyz}fphe`}[YddYa~|zwuxv{{|z~Wdn^bki_ed`qfy[n}}qsshuswrq}~uoeedr{upx~q{|rwmXnw{m]skXSSTP^tpy~}}le~yznu}zmp]Zada\kx{qs~{xo{ss~tnfoqmcWUijvjmt{{sh~mdrus|p|gs}{ypjkoqryx{ze}x~odwcXwud\VSTVQp{khh}usyrsmznwq]Z^ajlzuzyumvz|uum^swnnlcZkuxsqzqyzmzzz|yz~g}hxpqqt|vy}vz|zzxkxyo]syml{ygVOO`dy|wsv{y}egxn|nuoukmokz|xuzs|slvw~xxkogjrupibf{ulfox{xyzzsvsp|y}tqv|{}||~z|u~ovxjpok{fgsiaZZs|lr|z{|hn|t~gjzzsyuiqr}zy~w~rv~lyx|z{{ghvxtpimqypqpw~yostyq~uud}n}|||wz{}y||r~evxw}}v}urnuzvmi_bw|uykiz~|zs}~yuwvxq~|stvot~|}~muxqz|ysuq~uwpwtuyzrquxsrytsu{~zy}y{z{{y~|zy~}x~qure~yys~}dq}vnnplyzzvp~zy~tns~zy|yvruxyvyy{rvxwtp|ouzt}ysgo{zly}yo~rq||}~u|}zuovlyw{||}~z}{|~xzlm{sz|}vwvwzytmz|xyyy{~zzxpu~}zw|zuytzw~stxyyzpozpsqwprvw|wt{xtj~{|q{ws}vxx~sz{vxw}}u~xwy|}w~zzuyr}m{uwjs~ukww{wsky|~zw{xz}rwt{q{~{}yz_|{smz|sw~hkidpSm~eYq|vsdzsvmnn_}}c_u}{wif{n}pkq}f]eyxnbzym|zxbkfmxfptl{jshb}oj~{zvpyzyor}_zlescolt|hsw}uh|z||~rkttsp\lohwxxzo~|lw|hbdcbz}vxms}uovnVaw{||\Vi|wpgUk|{xz|~{ruxv}qotwsdshzmllm~sb||[oxzpsytkovysxvznouvrrqvif}tulmq~yo|w{fqtvqhpg{svkmra\sswuhzc`mn}ob`d`ar}~{qsmspdvs\e{o~rwxux|nvcgavuhmcpwb|ftknpVtvbvkptpaUZnx{qipxatlrxj^n|}~xwttvtt\o{ikyf_{tsz~|}s{cdbdmlaj}zl}x|o|ih]Ufa]ontu\jx{z~rzhe}dqlYYkqhwyxt}rv~U^zotcskfq~v{s}etipmduau{trm~yp}|mewekko~wro^Rou|wz{spUtqgz\^unj}{phuggmPYufzuv~~r~~gg{sizplf{qnf~vmsjguaiskuq^ct}{sx{xrlmyblqlmdv{tz{soxceygnsky~jizjsu`luixtcow~~|lxm{sZgs]Wmwh}|esy|fws|ruimjfvmdt}y|swuxyswYcsrlgqww}{onlrpdokm~jw~{s~ytfvpgl{}}zpeizxtynp~iuuxqyfr|bylpxy~z{jb_Vek~xtqtr{vqg{wigwmr{uosviw}s}oqycfwx{x}emz|l|q~nriovfsrslvwuvwjplw}ql{x{msl~v|lgy{lp\ve~~~f|x{on`~uT[ph}{uk|o~b{my}|{fwu|ztwqmzoxwyz||qsrfks}w^n~y|~|{zzrktmviq_}ro|}|rzx{rv}zfh~u~wx~vwmmnzuuziywu}iewuptwt|u~vu_tq^h`wtmxpy~{nwsn|xzpl{zwzaz{ko}rnyu_nz~xt~}d{qhyxxxwytnipydu}~|v{|zyx}s}qqxih{||wrt}nfzx~naqhrz|p}x|uvujze[pmzwy||l|kl||}ury~yf}}w{{}l~ywx|}z{|ju{nrsrv~z\{yxy}{t~~qptrp~tug|}pzwsq{zym}{kk~qx}u|tyg~{zqmulwyd]zulx}|yyvyfs~rhqi~~t{|n{w|yzlryvtytlwxdxwq|{}rtrfp{qnxzg}yotxt{njwklsZuz{|}}}~s}~q~}vsvyem|qyqw~gqruzekjorr}y|xqwvmx}kku{s~w~wjy{l~hs{tl{w~^wx|pp{~z~u}ufmnrvma{tc~m~y~m~knxmsmzwwpvwt||t|nxxyrpyr||y{mnxzxcqteuup[qdw}|yuvxtvsnswvxrz|htzww~iu~ypnr}uyrh~|~sopswuctw{k}tn~r}ci{fvu|_~|z|{zx}uz|mlny|ly}zwuq|w}|fvspgoqpjvnq{||qi{zsyxxp|{|ytk~rz{hvy}skutbvxiu}}xd`o|ze^xokunlt~wxslzsybvuvmt}pq~}yjvywqw~uzw~sqqywfgzmrtyvu^yn]xx|~lyuhs~~b~rs~w~juyyxj|}zxr{nd{{iw}x~yspm{wdmu~huv~w{so|usj{rttrvqpu{zsw}txtobpt|wwxsrss}~lpyt|vnn|Ydxnpx|zzx|pv}g~ywyx{p||nzxixsv}}|rrn||yslzzwh]l}y`dmlqm}~nyi~~|pr}izuoyvt}mlsvy~co{mqu|q}~x{wzwutdoqvospyplm_jw~wyg~pi}ghqwyp~osp~{nt|xwx~yyzqqlqo~mzzrimppcqnrgux{yyq~}x~uw}{zys}}iqq~{oty~~|o|vbh{ysr~|nqs}~}|omrx{{ukbTtzspzw}sprww}|huzx~}w|zqqumxhsuqr}xqvpsc~xvszjne`n{l_igzmusy}{j}woz}wyzgy}xijowr`ozqxru}ty}~~o{zwtvienxmknxuuabnu|yy{gtyn|cm}y{qlwwm}r{||qyzytzw~|yqtvot~m|vqagp|qgqmpiw}x|yrv{xzmmywt{mot}y|xn~{igwmvznp|}y{|}|omlzzzwpcZpzq|}uxuxxiwz|gzzx{yvy|knrtiiuroqrrzsu}c|zum_jihpscjevmy||yxq}wzrz|vom}wjehr|rzfhszvsu~uxz{xpt{wv}xpfkzrhnvw^^uu}~}wxzooy}avuhfq}}mqvzryr~ywr}zx~sjkxx}}vw}qj_hu}osmx{fq{|~ye}xz}pv~up{{rkou|v{vqw|yynq~tstul}typmju}v~vhcexuv|sp|xko~~mu{svzyx~pjzy{_fuqmmtr~~x~mu}skWetomiileyno|yszw}~}swy}}spsjfdjq}srgjq|qq|t}w|ftxy}z~}uoktxpisoyUgwuv~~xz{{xvshtvpsafsnjoxzi{~wrv~v~rudqvu{qbgenwzu{qt{dmu}w}|vqwsssmrq}uqnsv|wwyyuvypq{zyqpz}ytwzvvumkpz|zyofngr~|{vptyopu}w}ot||y{rpjyZhqojpywr~yr~x||lZ^vxnbnkjvao}zuzzv{qyz}w{ubceimuz}znlmkt~}yqz{skw|s|~|xurrttvnqkhalztyzz}yw||vkq|mx|~i`gujnyq|jn|~vv{{{rhuzzy|mZekovttp}rary{wpw|opot~zqvnqqstvryw}q{{}ukzywnv~vx{sou{|qlipw{~}yugtpkw~xrtt~qwwv}ytov}{zuyhoidlroq|}wzqttsh[`v{kdphuk`v~xyvrvq|~}}|r^_eilqsjqrosw{w}yw{ryttyxqqquwstssjsljzz|~|yv}y|euzmvvxjbdr}qlrx{ho{}|}~xns}}}}rX_nosqs~vpfs|||u}zmnpy{|v{}pinrsttozwp}|mwr}lwuyslvzzxkiiqvx{~|rnyyouzxty{wv}t~zzxxrpv}|xw{fuznmntsytsowq{vkf_dw{hkjst`l}~v}qs~{sv}~}dZaiknkyppxur{uu}|yy|vmzyw~uijpw|wsvwkzwymt~}z~w}zdywpttqiffp}yoiwfqx~~yuzww~r|nZ`strlvx~gmv}|sslsxz~uyqeeowvvmtx|ouxotxqt{wm|z}wzzjdhqvxv|vow}xpxtv{}|z|vp~zxqprv|ww{ptkrtnqu|}}upxypphjifsypli{i`lz}vqyzvz}}{yte]emnkjy~~ntxwtqrxz|ytzmz{yiagu~xr{qyvo~}or|x{}|otysvqyxhiklt~hr~hkpw~{|oo~|l|~vm_fwxlop|kkqvzoyzpqxzyu|zf`et{zposxqnwzwtyt}~|~q~}w|occnwzvv}|puy~zu~tqzyv{|j|y}vjnv{uyv}q^syrpx~z~u~{xuzpv}~nglrlmrxnlzdclu~~zz}y{zplkcdlqkhry~tvw{x|}o|t~z}svqw|k`_m}uyv}whxpwwxw|~zx|qxru|pgkqqxy}nwnmorv|w}mm~vi{trphgwxlpl~lpsuz|pywqsyvx{|~xf_bo{|pqpynqv~~vxqv~z{pdakvzws|}}qwy~{}sxtxulu~|{|~yjhq|~xxv}adw}uvwy}{vuyy||n}}uigpvqjo{oxpcjpvs}{}uicihhmrilo{yz{{~t{}w|z~s|qpyi^^k|y{wwixxvvuw|}|q~qwruzqhluuvuyvirttu~|w}qkzrjxoospirwpplypuvvz|wytrtx~v|zxwtg_bly}qtpzotx~t{~tsy}|~ncbku{uuy~yt{|~x||wwvm{u{{}qghs~|wzu{chxz||vzzps}~}o{}y{ymhkvzrdtxzxfkotxp|||}~wyr]alnmrllot{{~{x}|{uwmyvi_^iw}~xyjwzwt}y}}uiuvswz}rloxzvsrcuxvt}zw~}unyiv}|rinwxnorwntynuwxv}~yrux|w}{mjfchoyuusuprx{~~wyyy}vp{{pgekrzuvxz{t{}}|w~|y|x{trw{~}phhq}zxzvxkip}zuxro~rwy}|tkjox~sfnvpfoqswt~}uztm[_pusnkpm}yv|vy{vvr{zkc`eoz|znqy~}vw|xfv}yrxz~urrv||px|cgv{vw}xz~zu{ou}u{jis~}qguvtxfnxyvx|vu{~{sbgjklqqvvs}mmvyz~~yu{|}uvo~~unkhkottsyu}ty{}}xq{v|~~yp}tvv|skimt}w{v~qrmmxwtywp}w{vzx~rkmsyumhsnhossw~}ru}w}sb[iwxnlrn{rq~~twwv~}zundbfmtzzruv}{~|z~xunz|uv{zusuy{wtxxgix|y{|zzzyn~ww|vjitsetu}rbnx{x|}yw}~v_alqoojuvw|imw{|~|v}xu~ovsgfimqsqrzvzsz|~~qsxxh|wunx|qjilsxyzx|ruwqp|{wxxsvszxuvwnkqv{|urg{|lnswv|}yptt}{~{pe^hw{nprt}lqyv~vu}w~~~~y{ncciotvysz{xz}w~}uuvvvv{|tprv}~xywzolv}}|~xuovxv|uljtxhpwrclw}|~~~{y|z}xa]kutogsv}|hmw~~}}|v{}yttpbahortmryzts}ur|zzf{rlvwifipvz{x}x{pz|vrzz~zvyi}xwpxvpmnuy|wzpqzprtxz|tpwrx|~zyqleeo{spsumlzyyz|wtyx~{|{{|pddlqurut|yu~}zx}{vtrzxz}ynkqy~x}xywptyy}}~{{oz~wxs}zpmoyunl~jhmx}~wy}}v}p``qyvhjqzkiq{vvw|~wzvc\dpuvlnvzsoz|u|~zlz|uns~ufbhrx{uw}zuny}uz~y|{{rh}{tpx{olnsx{vv}uylkuwy|wtwwmzx}qmnmkptrurtgp{u|uv}w|x{tpjejrvrmy~uxutr{{~wrrt}~|ofiuw}|w{zttyrwx|}uyz{swrorw~}ynqqllov~}x{{qxtxxmcgu}pikqphls{|tzw{{}}~m`]htwpjqtylr{|~|{y|wzutu~}ncajv{ypyzmqyzy|z}}no{y|rsxwkjpvz{rv|}}dftzz}}}yx|tmzw{ojousnlpwtuiov}ww{s}w}thhilswultxyz}uxt}}|w~}uluuhelz|z~xwwuvqw|z|xs}|xsy{qpw||~rwwoqppt~zvz|pup|~vqkir{rokp}mjnsyu}|y{|~|{qe_epwqjpp{nrx~~~}s{xxvy}}reaeqz{qtyrov~{~}~~|mxtywquz}phkt{|wqz|xbiw}}~|y|~|z|mt~|wx~vkjqyxpfpwyqmry|~~zwxz~|rzv|udbiouyunuwz~{zw{||sxjp}shelz}~xy~xzswz}~{~}or{|wsxzrrz}|y{qovvtt}{vzqr}n|ztsqnpwstnsylmquxz{{z|~xuohcgovomprwquz|}zsuw{zyyvlcbhs{xqwxpsy{z}{sxvqvqsv|tjhny}zqvymfn{|~zu|{op{w~xw|xlhny~xhiuzsosx}}yzvwy{}{s{v{ze^fqvyupvv{~|~x~|~~rzkoz|qhgnz}w{|~|wyw}|ygx{|uw{vsvyzhpyzvv~~xw}~}st~sw~ssvwrqpwuswjlqtv{~~|{}~|okkijmqnnpq}spvz~v}xpt~}wpiccjqyuswwzpty}txyvvrpqvy}|ypjjqz~vqwyokmx{yt}xn{wxyw{qijr}ugkqymswz~y}tty|~swzq`^jvzvputw}u{{{~r~vps~~sjhlt}{zy~}}{~x{~lo}|~vx}~wuw~z|lfr}|yy|}xvy~xxxw}vqu}}ujoyx|idmsuw|}|vfflqqokjqozrksx|~|r{yluthccgnsupvu~rsu{~|qu~}o{ytkpw|}yrljlsz}tsuzztpos|~|~tx~ro}vwtu|}qijr{znll~xmrx|}}xqu|~t~xz~yi`cqzwovu}sy|zw}|w{wx~yuw~wlikrx}z}z}z{{{znww|zuz~wtu{zlir~~{zyww|}z~t||{vrvyjnw}jemtwx|~~|}jcjtwtkhrq{tjqy}~}w|rpz{mcdiostovx{utw{}ztysp{smt{~|umkmrw{yuyvwxvtv~~wzylv|vxsx~yqlnu|yvqq~tqu{~zsu{yu~~}z|xnhiqxvrzx~syz}{}zvyv}}~}{z|}vnlpvyzw~|~zy~}{~~}u{tzyw|{utv}~tps|}zz{~~s{~z~wtw~{psvplpvz||z{~{}nglvzwnotutnt{|}}}}wv|zmgiosurr{yuxz}}y}~~o{}}ssy~zqmnsxzzw|y~yz{zwz|z~}ou}vzvw~ztpquz}z}yt}vsvz~|ww{vv}~~|ysooqvuv|y}tx~y~~ywz~x~}|ztootxyxx|}{wz}|y{u{y{wsty~||wuw|}z|~}~u|{{}ywx|~wxvyyrqty|{xz~yvnmtyystvuwqsy}}{||~|}|rklquurv{y}vx{}}~~|v{~yy|yqnqvzzwzyxz||z|ys~yz{x{~wstvxzy|x}zruw{~~|{|yu~~zvuutttv|xwvyz~{xz~y|{vrqtxyxw~}~{}}x{|}~{x{z|ztsw|~~|zyxy}|{}|}w{{~{xy|}~{}{v}vuuwz~xy}z{{urswyxxyt}|ttvz~y}~|~}zsoptvuu{x}zxy|~|{y~}~~yrpswzzx~}{|xz}~}~yyx{}{}xuuxyzy}z|tuwz}|}~zv~}{wwxxvuv}x}zwx|~}|yz}z|ytrtwyyx}}|||~{{~~}}}~{}|~yuux|}}}}|{{{~~}z~}{v{zxz|}}||y|yxxx{~zy}z|~|xvuvxy|}u}~wvwy}{|}|}||wtsuvww|zz~zy{~}~~}~z{|wssvyzz}z{z{~|~y}w}~}}xvwyzz{||wwy{~}{|~xy|}zxxyyxvy~x{yz|~|~}zz{~z|zutuxyzz||}}~~~}{~~}}{~}}~}~yvvy{}}}~}|}}z~}|~zw~z{yz|}|~|||zzz{}~~~zz}y~|{yxxxxz}x~yxy{~|}~||~~~~zwvvvwx{~x}{{}{}|z~zvtuxz{}|~~{{}}~~yx|~zxxyz{{|yxy|~}z{~~x{{}{xxz{zy|~x|{{|{~|zz|||}zvuwxyz}z}}|{|~~||~}{||ywxz{}~}}}~{~~~}}}xz|zz||}~|~z{{|~~~|{}~z{|zyyyyz~yzyz{~}}}{|}~}zxwxxxy~}x}||}}||~~}~}}|}ywvwxz|z}{|~}~z}|{|yxyz{|{}zy{}|{}~z{|{}yyz{{{}y}}{{|~~}|~~{z|~}||}yvwxyz}{|~}~|}{}~||~~{|}zxxyz|~}~}}~|~}~}~z~z}}{z{|}~||z{}~~}}~{~|}~{zz{z{z|zz{}}~~~~}||}}~}|yxyyyz}z|||}~{~|~}}}|}yxwxy{}~{~||~}}~~z~|||zyz{|}{~|{{}~}|}~z{}{~{yz{||~z|~|{|~~}~~|{|~}{|{yxxyz}~z~}~}}||~~|{|~|~~}|zyyz{}|~}~{}}~}}~}{z~~|{{{|}~}}{|}~}~}}~~{|}~|{{{{|z~{{|}}~~}||}}}}~{yyzz{}|z}|}~}~|}~~}|}}~}|yxyyz|{~}~|~}~~|{{~~{zz{{|~|}|}~~}|}}z}|{~{zz{|~z}}|}~~~}~~|{|~||||zyyz{~}|~~~}|}~~}|{|~~|}~|zzz{|~|~~|}|~~}}~|}~z~~|{{||~}~~|}~}}~~}}~|{|}~|{{||~~{~||}~~~~}|{|}~|~}}{zz{{}z~}}~|}|}~~}||~}~|}{zzz{|}}~~|}~~}~}|{}~|{{{|}|~}~~~~~}}~}{~|{~|{{{}{}}~~~}~~~}||}~}{~|~|{zz{}{~~~|~|}~~}||}}~|~{zz{{}}~|~|}~~}}~}}{}}{{||~}~}~}}~~}}~|{|}~||||}~{}}~~~~~~}|||~}|~~}{z{{|~{~}~~~}|}~~}|}~~}~}}{zz{|~{~~~}}}~~}~~|}|}{{{|}|~~}~~~}}~~|~~{~}|{|}|}~}~}}~~~}||}~~|}|}|{{{}|}~~|}}}}}||}~}}|~~|{{{|}~}||}}~~}}}}}|}}|{||~|~~}~~}~~}}}}|}|~}|||}{~~}~}~}~~~}||}~|~}}|{{|~||~~}|}}}}||}~}~}~}|{{|}~|~|~}}~~~}}~~}}|}|{||}|~~}}~~~}}~~|~~|~}|||}}}~~}}~~~}||}~~|}}~~}|||}~{~~~}}}}}|||}}}|~|{{|}|~||}}~}}}~~}~|}}|||}~}~}~}~~~}}}~~}|}|}||}~|~~~}}~~~}||}~~|~}~~||||~}|~~}}|}}}}|}~}}~}~}|||}|~~|}}}~}}}~~}~|}}|||}~~|}~~}~~~}}}~~}|~|}||}~|~~~}}}~~}||}~}|~|~~}||}~}|}}}}}}||}~}}~}~||||~|~}~}}}}}}}~~}|~}||}~~}|}}~~}}}}~~|}}}~}}}}|}~~}}~~}|}}~~}}~}}}|}}|~}}}}}}|}}~~}}~}|||}}}|}}}}}}}~~}~}}~}||}|}~~}~~~}}}~~}}~|}}}}~|~~}}~}}}}~~~}||~~}}}~|~}}}}}}|}}~~}}~}}|}}}}}}}}}}}}~~~}~}}~}}}}~}}~}}~}}}}~~}}}}~}}~|}~}}~}}}}~~~}}~}~}}}~|}~~}}}}}}}~~}~}~}}}}~|}~~}}}}}}}~}}}~~}}}}~}~}}}~~}}}~~}}|~~}}}~}~~}~}}}}}}}~~}}|~~}}}~}}}}}}}}}}}~~}}}~~}}}~~}}~}}}}}}}~~}~~}~}}}~}}~~}}~}}}}~~}}~|~~}}~}~~~}}}}}}~~~}}}~~~}}~}}}~}}}}}}}~~~}}}~}}}~~|}~}}}}}}}~~}~~}~~}}}}}~}}~~}}}~~}}}~~~}~~}~}~}}~}}}}~~}}~}}~}~~~|}}}}}}}}~~~~}~}~~}}~~}~~}}}}}}}}~~~}}}~~~}}~~}}~}}}}}}}~~}~~}~~~~~}~~~~}}}}}}~~~}}}}~~~~~}}}}}}}}}~~~~}~}~~}~}~~}~}}}}}}~~~~}}}~~}~~~}}~}}}}}}~~~}~}~~~~~}~~~~}}}}}}~~~~}}}}~~~~}}~}}}}}}}~~~~}~~}~~~~}~~~~}}}}}}~~~}~}~~~~~~}~}~}}}}}}~~~~}~}~~~}}~~}}}}}}~~~~~}~}~~~~~}~~~~}}}}}}~~~~~}}}~~~~~}}~}}}}}}~~~~~}~}~~~~}}}}}}}}~~~~~}~}~~~~~}~~~}}}}}}~~~~~}~}~~~~}~~~~}}}}}}~~~~~}}}~~~~~}~}~}}}}}}~~~~}}~}~~~~}}}}}}}}~~~~~~}~}~~~~}}~}}}}}~~~~~}}~~}~~~}}~}}}}}}~~~~~}~}~~~~}~}~~}}}}}}~~~~}~}~~~~~}~}~~}}}}}~~~~~}~}~~~}~~~~~}}}}}~~~~~}~}}~~~}~~~}}}}}~~~~~}}~}~~~~}}~}}}}}~~~~~~}~}~~~}}~}}}}}~~~~~~}}~~~}~~~~~}}}}~~~~~~}~}~~~~~~~}}}}}~~~~~}~~}~~~}}~}}}}}~~~~~~~}~~~}}~~}}}}}~~~~~~}~}~~~~~~~~~~~}~~~~~~}~~}~}~~~}}}}~~~~~~}~}~}~~~~~}}}}}~~~~~}~~~~~}~}~}}}}~~~~~~~~}~~}~~~~~~~~}~~~~~~}~~}~}~~~~}}}~~~~~~~}~}~~~~}}}}~~~~~~~~~~~~}}~~}}}~~~~~~~~}~~~~~~~~~~~~~~~~}~~}~}~~~~~}}~~~~~~~}~}~~~~~}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~}~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m39.bin b/applications/PoP/poc/res/music/m39.bin deleted file mode 100644 index cdd7951..0000000 --- a/applications/PoP/poc/res/music/m39.bin +++ /dev/null @@ -1 +0,0 @@ -~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}||||||{{{{{{{zzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzz{{{{{{|||||}}}}}~~~~~~~~~}}}}||||{{{{zzzzzyyyyyxxxxxwwwwwwwwwwwwvvvvvvvvwwwwwwwwwwwwwxxxxxyyyyyzzzzz{{{{|||}}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxwwwwwvvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{|||}}}}~~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwwvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{||||}}}~~~~~~}}}|||{{{{zzzyyyyxxxxxwwwwwvvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwwwwxxxxyyyyzzzz{{{||||}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxwwwwwwvvvvvvvvvvvuuuuuuuuuvvvvvvvvvvwwwwwwxxxxxyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{zzzzyyyyxxxxxwwwwwwvvvvvvvvvvuuuuuuuuuvvvvvvvvvvvwwwwwwxxxxyyyyzzzz{{{{|||}}}~~~~~~~}}}|||{{{{zzzzyyyyxxxxxwwwwwwvvvvvvvvvvvuuuuuuuuvvvvvvvvvvwwwwwwwxxxxxyyyyzzz{{{{|||}}}~~~~~~~}}}||||{{{zzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxxyyyyzzzz{{{{|||}}}}~~~~~~}}}}|||{{{{zzzzyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwxxxxxyyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxyyyyyzzzz{{{{||||}}}~~~~~~}}}||||{{{zzzzzyyyyyxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxyyyyyzzzz{{{{||||}}}~~~~~~}}}|||{{{{zzzzzyyyyyxxxxxxwwwwwwwvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxxxyyyyyyzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxwwwwwwwwvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxxyyyyyyzzzz{{{{||||}}}~~~~~~~}}}|||{{{{zzzzzyyyyyxxxxxxxwwwwwwwwvvvvvvvvvvvvvvvvvvwwwwwwwwxxxxxxyyyyyzzzzz{{{{||||}}}~~~~~}}}||||{{{{zzzzzyyyyyyyxxxxxxxwwwwwwwwwvvvvvvvvvvvvwwwwwwwwwxxxxxxxyyyyyyzzzzzz{{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyxxxxxxxwwwwwwwwwvvvvvvvvvvvvwwwwwwwwwxxxxxxxyyyyyyzzzzzz{{{{|||}}}~~~~~~}}|||{{{{zzzzzyyyyyyyyyxxxxxxxxwwwwwwwwvvvvvvvvvvwwwwwwwwxxxxxxxxyyyyyyyyzzzzzz{{{{|||}}}~~~~~}}}|||{{{{zzzzzzzyyyyyyyyxxxxxxxxwwwwwwwwwwvvvvvwwwwwwwwwxxxxxxxxyyyyyyyyyzzzzzz{{{{||||}}}~~~~~}}}|||{{{{zzzzzzyyyyyyyyyxxxxxxxxwwwwwwwwwvvvvvvwwwwwwwwwxxxxxxxxyyyyyyyyzzzzzzz{{{{|||}}}~~~~~}}|||{{{{zzzzzzyyyyyyyyyyyyyyxxxxxxxwwwwwwwwvvwwwwwwwwwxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{{{|||}}~~~~}}}|||{{{zzzzzzzzyyyyyyyyyyyyyxxxxxxxwwwwwwwwwwwwwwwwwwxxxxxxxyyyyyyyyyyyyyzzzzzzzz{{{{|||}}~~~~}}}|||{{{zzzzzzzzyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzz{{{||}}~~~~}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{||}}~~~~}}||{{{zzzzzyyyyyyyyyyyyyyyyyyyyyyyxxxxxwwwwwwwwwwwwxxxxxxyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{|||}}~~}}|{{{zzzyyyyyyyyyyyyyyyzzzzzzzzzzyyyyxxxxwwwwwwwwwwxxxxyyyyzzzzzzzzzzzyyyyyyyyyyyyyyzzz{{{||}~~~}}||{{zzzyyyyyyyyyyyyyyzzzzzzzzzzzzyyyyxxxxwwwwwwwwwxxxyyyyzzzzzzzzzzzzzzyyyyyyyyyyyyzzzz{{||}~~~}}||{{zzzzyyyyyyyyyyyyyzzzzzzzzzzzzyyyyxxxxwwwwwwwwwxxxxyyyyz{{{{{{{zzzzzyyyyyyxxxxxyyyyyzz{{|}~~~}}|{{zzyyyyyyxxxyyyyyyyzzzz{{{{{{{{{zzzyyyxxxxwwwwwxxxyyyzzz{{{{{{{{{{zzzzyyyyyyyyyyyyyyyzz{{||}~~}}|{{zzyyyyyyxxxyyyyyyyzzzz{{{{{{{{{zzzyyyxxxwwwwwwxxxyyyzzz{{{{{{{{{{zzzzyyyyyyyyyyyyyyyzzz{||}~~}|{{zyyyxxxxxxxxxxxxyyyzzz{{{||||||||{{{zzyyxxwwwwwxxyyzz{{{|||||||||{{zzzyyyyxxxxxxxxxxxyyzz{{|}~~}||{zzyyyxxxxxxxxxxyyyyzzz{{{||||||||{{{zzyyxxxwwwxxxyyzz{{||||||||||{{{zzyyyyxxxxxxxxxxyyyzz{|}}~~}|{{zyyyxxxxxxxxxxxyyyzzz{{{|||||||||{{zzyyyxxxwwwxxxyyzz{{|||||||||{{{zzzyyyyxxxxxxxxxxxxyyz{{|~~}|{zyyxxxxxxxxxxxxxxyyyzz{{||}}}~~~~}}||{{zyyxxxxxxxyzz{||}}}~~~~}}}||{{zzyyyxxxxxxxxxxxxxyyzz{|}~~}|{zzyyxxxxxxxxxxxxxyyyzz{{||}}}~~~~}}||{{zyyxxxxxxxyzz{||}}}~~~~}}}||{{zzyyyxxxxxxxxxxxxxyyz{{|}~}{zyyxxxxxxxxxxxxxxxxyyz{{|}}~~}}|{zyyxxxxxyyz{|}~~~}}|{{zyyxxxxxxxxxxxxxxxxyz{|}~~}|{zyyxxxxxxxxxxxxxxxyyzz{|}}~~~~}|{zzyxxxxxyyz{|}}~~~}||{zzyyxxxxxxxxxxxxxxxyyz{|~~|{zzyxxxxxxxxxxxxxxxyyyz{{|}}~~~}|{zyyxxxxxyyz{|}~~~~}|{{zzyyxxxxxxxxxxxxxxxyzz{}~~~~~~~~~~~~~}|{zyxxxxxxxxxxxxxxxxxyyz{|}~~}|{zyxxxxyyz{|~~}|{zzyxxxxxxxxxxxxxxxxxyz{|}~~~~~~~~~~~~~|{zyxxxxxxxxxxxxxxxxxyyz{|}~~~}{zyyxxxxyz{|}~~}|{zzyyxxxxxxxxxxxxxxxxyz{|}~~~~~~~~~~~~~|{zyxxxxxxxxxxxxxxxxxyyz{|}~|{zyxxxyz{|~~}{zyyxxxxxxyyyyyyxxxxxxyz|}~}||||||}~~~}}|||||}}~}{zyxxxxxyyyyyyyxxxxxxyz{|}~}|{zyxxxyz{}~~}|{zyyxxxxxyyyyyyyxxxxxyz{|~~}}|||||}}~~}||||||}~~~|{yyxxxxxyyyyyyyxxxxxyyz{|~~|{zyxxxyz{}~~|{zyyxxxxxyyyyyyyxxxxxyy{|~~~}|||||}}~~~~}|{{zzzz{{|}~}|zyxxxxyyzzzzzzyyxxxxyyz{}~}|zyxxxy{|~~}{zyyxxxyyyzzzzzzyyyxxxyz|~~}|{{{zz{{{|}~~}|{{{zz{{{|}~}|zyxxxyyyzzzzzzyyyxxxyyz{}~~|{yxxxyz|~~}|zyyxxxyyyzzzzzzyyyxxxyz|}~}||{{zz{{{|}~}|{{{zz{{{|}~~|{yyxxxyyzzzzzzzyyxxxyyz{|~~}{zyxxyz{}~~}{zyxxxyyz{{|||{{zzyxxxyz|~~}|{zzyyyyzz{|}~|{zzyyyyyzz{|}}{zyxxyyz{{||||{zzyyxxyyz|}}{zyxxy{}~|{yyxxxyzz{{|||{{zzyxxxy{}~|{{zzyyyyzz{|~~|{zzyyyyyzz{|}}{yyxxyyz{{|||{{zzyyxxyyz|}}{zyxxy{}~|{zyxxxyzz{{|||{{zzyxxxy{|~}|{zzyyyyzz{|}~}{zzyyyyyzz{{|~}{yxxyyz{|}}~}}}|{zyyxxyz{}~|zyxxy{}}{zyxxyyz{|}}}}}}|{zyxxyz|~}|{zyyyyyyyyz{|~}{zyyyyxyyyyz{|~}{yxxyyz{|}}~}}}|{zyyxxyz|}~|zyxxy{}~}{zyxxyzz{|}}}}}||{zyxxyz|~}{zzyyyyyyyyz{|~~|{zyyyxxyyyyz{}~|zyxxyz{||}}~}}||{zyxxyy{|~}{zxxyz|~~|zyxxxyz|}~~~}{zyxxy{}}{zyyxxxxxxxyy{|~~|{yyxxxxxxxyyz{}}{yxxyz{}~~~}|{zyxxyz|~|zyxyz|~~|{yxxyyz|}~~~~}|zyxxyz|}|zyyxxxxxxxyyz|~~|{zyxxxxxxxyyz{}}{yxxyz{}~~~}|{zyxxyz|~|zyxyz|~~|zyxxyyz|}~~~~}{zyxxyz}}{zyyxxxxxxxyy{|~~|{zyxxxxxxxyyz{}}zyxyz{}~~}|zyxxyz|~}{yxyz|}{yxxyz{}~~}|zyxyz|~~~}{zyxxxxxxxxxyy{|~|zyxxxxxxxxxxyz|}~~~{yxxyz|~~|{yyxyz{}~|zxxy{~~|zyxxy{|}~|{yxxy{~~~~~|zyyxxxxxxxxxyz{~}{yyxxxxxxxxxyy{|~~~~}zyxyz{}~~}|zyxxyz|~}{yxyz|}{yxxyz{|~}|zyxxy{~~}}}}~}{zyxxxyyyyxxxyy{}~|zyxxxyyyyxxxxyz|~~}}}}~~|zxxyz|~~}{yxxyz|~{yxyz}}{yxxyz|}}{zyxy{~~}}}}~}{zyxxxyyyyxxxxy{}|zyxxxyyyyxxxxyz|~~~}}}}~}zyxyz|~}{zyxyz|~|zxxz|~{zyxyz{}}|zyxy{}~}}}}~}{zyxxxxyyyxxxxyz||zyxxxxyyyxxxxyz|~~}}}}~}zyxyz|~~}{zyxyz|~|zxxz}~{yxxyz|~~|zyxy{~~||{{||}|zyxxxyyyyyyyxxyz|}{yxxxyyyyyyyxxyz{~~}||{||}~|yxxz{~}{zyxyz}~{yxy{~}zyxyz{}}{zxxz|~}||{||}~}{zyxxyyyyyyyxxxy{~~|zyxxyyyyyyyxxxy{}}|||||}~}zyxy{}~|zyxyz||yxyz}}{yxxy{}~|zyxy{}||{||}~~|zyxxyyyzzzzyxxyz|~{yxxyyzzzzzyyxxyz|}|{{zz{{|~}zxxz|~}{yxxz||yxy{~}{yxyz|~}zyxy|}|{zzz{|}~}{yxxyyzzzzzzyxxyz}~{yxxyyzzzzzyyxxyz|}|{{zz{{|~}zxxz|~}{yxxz||zxy{~~{yxxz{~}{yxy{~}|{zzz{{|~~{yxxxyzzzzzzyxxyz||zxxyyzzzzzzyxxyz|~~|{{zzz{|}~{yxy{}~{zxxy{~}{yxz}|zxxy{}}zyxz|}{zzzyzz{|~|zyxxyz{{{{{zyxxyz}}zyxyyz{{{{{zyxxyz|~|{zzzzz{|}|zxyz|}{yxxz|}zxy{~~|yxxz|~~|zxxz}}{zzzzzz{}~~|zyxyyz{{{{{zyxxy{}|zyxyyz{{{{{zyxxyz|~|{zzzzz{|}|zxyz}}{yxxz|}zxyz}|yxxz{~|zxxz}}{zzzyzz{|~|zyxxyz{{{{{zyyxyz}}zyxxyz{{|||{zyxxy{~}|zzyyyyz{|~}zxyz}|zyxy{~{yxz}|zxxy|~}{yxy|~|{zyyyyyz{}|zyxyzz{||||{zyxxz|}zxxyz{|||||{zyxxy{~}|zzyyyyz{|~}zxyz}~|zxxy|~zyxz}|zxxz|~}zyxz}~|zzyyyyzz|}~{yxxyz{|||||{zyxyz}|yxxyz{||||{zyyxyz|}{zyyyyyz{||yxy{~}{yxyz}|yxy|~{yxy{~|zxy{~|zyyyxyyyz|~|zyxyz{|}}}}|{zyxy{~|zxxyz|}}~}}|{yxxy{~}{zyyxxyyz{}}zxy{~|zxxz|~zxy{~{yxy{}}zxxz~|zyyyxxyyz{}}zyxyz{|}}}}|{zyxyz~}zxxyz|}}~}}|{zyxy{}}{zyxxxxyy{}}zyy{~|zxxy|~{yy|~{yxy{~}zxxz}|zyxwwwxxy{||{zz{||}}||{yxvuvx{|zyyz|~~}{{{||zxvuuuuuvwxz~}|}}zwutuw{|{}}|{{|}~~|zz|~~zwuvy}~{yvuuuvwxyz{~|{{{||||{zywusrrtw{}{z{}~|{|}}zwtsrrrsttvxz}~|xusrrux|}{|~~|zzyz{}~||}~zvttvy}|zwvvvwxyz{|~}{zzz{{{zzxwutrrsuy~}||}~|{z{}~zxussrsstuvxz}}zwtrrsvz~{z{}~|{zzz{|~}}~|xussvz~|zxwwwxyz{|}~{yyyyzzzzyxwvtsrtv{~}}~}zyyy|~}zwutsstuvvxy{~~}zwtsstx|}yxy|}|zyyz{}~{wtrsuz~}{yxxyz{||}~}zxwwxyyzzyxwvutstw{~~~|yxwxz|}{xvtttuvwxyz|~~~}{xutsux||xwwz}~|{zz{|~~~{wtrruy~}{zzz{|}}~|xvvvwxxyyyyxwvutux|~}zxvvvx{~}{xvuuuvwxyz|}}}~}{yvuuvz~zwuvz}}|{zz{}~~zwsrsv{}|{{{|}~~~}yvuuuwxyyzzzyxwvvwz~{xvuuvx{~}zxwvvwxyz{|}}{|~}{ywvvy}|wuuwz~}|{{|}~|xussuy~~}||}}~~~~~yvtttvwxyz{{zzxxwxz~~}{xvttuwz}|zxxxxyz{||}}zz|~}zxwwy}|wtsuy}~}}|}~~~|yvtsuy~~}}}~~~~~~}yvtstvwyz{|||{zyyy{~~}zxutstvz}}{yyyyz{|}}~{yy{}~|zxy{~{vssuy}~}}~~}}}zvttv{~~~~~~~~}}~{wtsstvxy{|}}}||{z{}~}}~~|ywusstvz~~|{zz{||}}~~zwwy|~}{zz|{vssuy}~~||~~{xvuw{~~~~~~}}||}|xtsrtvxz|}~~~~}}||}~||}~}{ywusrsvz~~}||||}}~~~~zvvwz}~|{||xtrtx}~|{|~~{xvwz~~~~}}||{{|~}yvsrsuxz|~~}}~|{|}~~}|zxvtssux|}||}}~~~~~~{wuux{~}|}~}~{vssvz}{z{}~{xwy}~}}}||{{zzz||xussuwy{}~}}~{{{||}~~}}|zxvtstvy}~}}}~~~~}}}~zvtux{~}}~}|||~~{wttv{|yxy{}~|zyz~~}}|||{zyxxy{}}yvttuwy{~}}~{yyz{|}~~}|{ywvttvx|~}}}~~~}}||}~zvttwz~~}~|{zz{|~|xutvz{xvwz}|{{~~||||{zywvvwy}}zwutuwz}~~~}ywwxz|}~~}|{zxvuuvy~~}~~}}|||||}~zvttw{~}~|zyyz{|~}yvuw{}xuuwz}~||~||||{zxvuuvwz}}zwuuvy|~}~~yvuvx{|}}}}|{zxvuux|~}}||||||{z{}}xtsuy}~}~|zyyyz{}|wuvz~yutvy|~~|}~}||{zywuttuvx{~|xuuvz~~||~~yutvx{|}}~~~}|zwvvx}~}|||}}|zyxxz~~ytsuy}}}}zyxxyyy{~}xvw{}xutux{}~|}}|{yxvuutuuvwz}|xvvx|}||~}xutvxz{}~~|zxwx{~}|||}}|zxvuwz~}yutvy}}{|~|zyyxxxy|}yxz~|xvuuwz~}|~}zxvuuuuuuuuw{{xwy|~}|}{wuuvxy{~}{zzz{}}|{|}}|zwutuwz~~zwuvy|}|}~|{zyxwx{}~|{|}yvttvz~}~{xuuuuuvuttuw{}{{{}~~}|}}yvuuvy|~}}}}}}}~}|||}|zwuttuwz}}xuuw{~|}~~|zxwxy{}~~}~|xtsvz~~|}zvttuvvvutsuxz}~}}}~~|zz||xutuy|~}||~~}|{zwvuttuvxz}{vtuy~}||}~{xxyz{{|~~|}~}}zutvy|~{z}{vttuvwvuttvwy{}}||}|xwx||vttwz|}}~~~|{|~}{xvuttuvvvwz~yutw}}zxx{~}zz{{{z{|}{|}{{}}ywwwxz|}z{~~yvuuvwvutuvwwwy||z{}~xutw{{wuvxyz{}~~{z|{wuttuuvwvuvzzwvz|wuvy~}}||zyyz||z|~{yy{}~{ywvvx|}||}zwvwvuttvwwvuvy}~zz|yuttw}{yxwwwy{}|z{~{vtttuvwwutuy}~{z{}}wttv{}{yyz|~{|~~zyyz}}yutvy}~}}}{yxvttuwwvutuw||{|~}~}yvttw{~zvuuwz~}|}}|}{vtttvwxvttwz|}~}~|wttuz}zyyz~~}|||yyy{}yuttx~}||~~|xutuxxwuttux~~~}{z|{ywuuxz}zuttv{}zy|~yvutvwwvttvxyyz}}}~{xuuwz}~{zyz~|yz}zyyz}}xutv|{wx|{vtvxxvutttw|~zxz}~{zxwwxxxz~xutuy}zxz~}zwvwxwutuxxwvwz~{z{}zxwwxyz~}|{|~yy}~|{{|~~}}{xvw|zuux|}xxyywutttuy}zxz}}|{zzzywuw}|xuvz~~zyz}}zyyywttwyxvtuwz}yy}~{zzxvv{~}|z{~}|}~~|{~|zz|}|vttw}|{{zwttttvz}~}zz|~~|||||}{xtty}yx{}~|z{|}~}|{wttxyxvttuw|{yz~{vtw}~}}~|z}~~}~zvttw}}yutttuy}}}~~~}}}~~{z{{|}~{vtwz}~~~~}}~~~~~|}~}}~~}~zvuwyyvtsttx~|}|{}{utx|~~}~~~~z{}|{||yvuw{yvtttx|}}}}{{~~}}zwxz{|{wwyzyy|~}|{{~~~}|yx{{wxyzxuttsuy{xz|wwyzz{}~~|yx|~{}~~|xx|}zxyz{{~|xvtuy}}}}{yx{~|wuvxy||y{|zwuw{{xx{~~~|wuwz~{{|{xtstsuz~|ww{{{{zwvx|~}vtw{}~|}}xwz}||zxvz|yvw{}}}}zww{|utuvx|{{}~{vtuw{{ww{~}{utuw{{wttttw|}}~yx{~zvtvy|}vtux}|{|}~yx{~~}{vty~{y|~}}}{xwx|}}zuttux}|{~~zuttuz{xx|~|{}xtttu{zvtttv{}|}~}|||}}yttuw}~{wutw}}{{|}~{|}zy{ytw{~~}}{xvx|~{z|yvttv{}}zz~|wutsv~|{}|yxzyvuttx}~yvutw|}|}}{y{}}~|~|wuttz~~|xtuz~|||}yvx}|xy{{{|~zwvx||xwz}zwuwz|{x{|xwvtw}{wvyyxwuux{}}}{ywuy}}|}|xwz}|yx|}zwuu{~~{xxz|}}~}|{yvw}}}~|yvw|~yvwz}yvvz}yxz{zww|{yywvz}}{vvz}zzxvwz{zx{~|yy}~|}}zwvz{uuy{~~}zwx|}~|||zxx~}{xx|~yttx{zwx|}xvvz~}|}|yuu{}zzzxx}}|}~ywz}~{zzyxy{{xux||}}}yvvy~~{|~utuwz~{|~}|~|wty|{}}}~~wttvy}yy|}yvvy}~|vty}}|yyzyz~}|}|{}{{}}}zyzzy{}}ztuz~~zvvx|}yx{|wutu{}}}{{~}uu{}|~|z|}xvttz|}{wuw{}}~~{~|vwz|{xwyyy}~~|xw{}|}zwxzyz~}xtw{}}|~}yvvz}zww{~{wtuz~{xx{}~xy{|||~}|xvy|}{yvtz{wvx|}|}~zx|~~yz|{yvvxxy|wux}|wuwxx{~yvy{{zxz~yvw{}xvvz|wwz|}{}|wux}~}~}{xwz|utwy{~|yx|}}{xwz}}|}|vvz{}~~{wtuwwz{wux~~{ttvwx|}xy||zvux{}yxz}{vuw{|||{yw|{wvy~}~~~{utx{~ztuuvz~{}|||z{~~|}}wuwxy~zutuuw~~yww{}zz~xtuuuy~~yy}~|wtuwx}~{{~}wuvz~~~~~ytw~zwy}{yz~~ytuvxxvutv}~|}|{}}}}}}wtvvvz~wuutu|zxy||wvy|wvttx}}yz~}xttuuy~~~xvw{}}}~z}|uv|~~}{|~zvw{~|xvtu}|zwtv{~~~~zwx~~~|vtvuuzzxvtv|~}}yx{~{vux~|yuuy|}zw{}xuuutz~xwy}}|}~zx{~}wy||{z|~xuv{~{ytv}}yvy{|{y~xuv}ytuvtv|}}}{xuz}|}~zyz~yuux~|wx{|{ww}|wvvtu{~}yy{~}|~|vvy{}}~}{wvz}~yvv{|xy}}|z||{wv}zvv{yuvutw{}}z{{y}}{|~|yy{zwvy}}||}|yuv|{xxwuw|}||{~~}~{uuwxz|vtvy{|yx{}}|}||~|wty~yx{}zz}}xwvuw{}|xx~~}|}{wwy{xwz}||~{utz}}zwxxvw|}{}~}~~|vuvvw|{utuv{|{}~|||~}}}||{uv{}~||~||~zvw||zyvvz||yuy~~|xvw{}yxz}~||}{y}zuw{|{wwxxw{}|}|yz}yuuvuw||wvtt{}|}yx|~{xx||wy{{zxz}~zuuz}{xx{|{wuz~~|~|wuw|{yy|}}|wuy}}xz|{yuvwww}}}}{wwzyuvvuw||}|yuuz~|vux{}|wuy~{}}{wuwz{{wvz~}z|}}zuv{}}{z|}xvx}|xwy}~~zutwy|}~}zvtuvvz~~}yvvzxwwuuy|}{y}|xy|}~zttvx{|wvz~zutvwz{yy|}~~}wuy|}zwx{||xx||xvx{}wtuuv|~yttuuw~{wvx}~|}|yxvvx||zwy~}~|}~~~vtutw}|yz}{z|}wttuv}||~}|~~~ywz}|zvwyz}}{~}xuvz~}wtuttx|vuttv}~|xvx||yy}|{xwz||zvx~}}}zz|yvutuz~~~yvx~zvutu|}}|yzzy|}|xuvwx|~xuw{~~|wuuttx|~~ywutx}~~{xx{}zww|}zz|}|wuy}~|}~{ww{zyvtvz}}|~xuw}{yvtw}}xux{~{}~~zvuvvw}}xwy|}}~yvvvtvy{{y||yvvz}}~}zxz}}xvw{}}~{vw{}}{z|~{vvz~|{xwxz{yx}zwx|~|ywz}}~~wsuwz{wvvvw~{y{}}}~|wvvvuwzzyvy~zy}}|}~{yx{~}xvw{~|wx{}|ywy{}ywy~~|}~}{z{|zwuy{z|}~}{}~}|~~|}{uttuz~ywvvw|}}~~|}|wuvvvx{{yuu{}}}}{xxz~~zwwz}}yx|}|yvwxy~{z}|yy}~|}~}ytu{~~}}}}}|zy{yvutuz}zxwvz}}ytuuuvz{{wsv{~~~~|xwx||xwy|}}~}{~z|~~{wvwwyzww{~~xtwz||{}~}|yx|~{xwz{ywuuy|~}|zxx|}}}wttuuw{|zvtwz{zz||xvx|~{xxz}}}}|yx{}}~{wvvvx~{wvzzwyzzywy|{vux{~|wvy~~~}|ywxzzzy|~|z{}{|}vtttux{|yuvyzywvy||xwy}|yxy|~~}}zuvxz~zwvvvz|xx{~~zz|{yvuwz|zttvx||xx{~|{}~|zz{{yvv|~}~{z|{vuttvz{zvuy{zwtuwz|yy||ywx{~~~}{vtuvy~}yxwwy~}{|}}~|}~}|~~{vttvx~wtttw}{z{}zxz~~}}~}zvtx}~{y{~ywutvyzyvvy{zwttuv{}|~|xvx{~~~~{usttv{{zxwz}}~|y{}~~|wtttv|{wutuz}~~ywx|~|vux{}}~~zz|~~|zwvwyywtvz{zvtttuz}xvx|~~~~yutttvz~}|zz}~~}{wvxz||xutsv|}zwuwz|||~xwx|{wwyzyxz~}{{~~||~|yyzzxutx{{xuttsu{}xxz|}~~|wttttvz||{~~|}~|}zutvx{}ywvtw|~}zxyzyxx~zxy|~}~}z{{zwuvz}~|||z{}|}{xttxzzxutttv{~{z{}}}}{wuuttwyzyw{~}{{|vstux}|zxwy|}~~|||yvuy~{{|}}~|{|}~~|}~|xutux|}{{~{vtwzzwututvz}}~~~~}}}{vtuttvyyxuw|~{{}{vttux}}~|{yz}~}}~}}}xtuz~~~~}}}{xy{|~~~|xtttv||{|{vwyzxutttuy|}}}}}}~}|xttutvxzyutw|~}{|~|xvtux{|{{~}||~}}|zz~yuvy{{{}~}|xvwyz}~~yvttu{|{}~}yz{zwutttvz}}}}|z{~|wttttvyzxutwz||{}|}~|}}ywvxzyxy~~~}~~{xx||yyzyxwy|{vtuvx|~~zxvtv{~}||~~}}}zwtsttw|~}}|zxy}|vtttuwyywtuxzyxx{}~}|}|zzzyvux~~~~~~zxx|}}}{xuuwz~ytttux}~}}{ywwz}}|z{|~~zvtttv{}~}}{xxz~zutttvyyxuuwyywvwy|}{|~}zwtuz}~}}}~~}yxz}}|~{vttvy}wtttvz}}||~|{zy|~}}~{yyz|}xvutvz}}}}{xxy}~}}}xvutvxywtuxyxvtuvy~~|}~xtuy{{zz|}~~{z{}{z{~~xuttv}ywutuy{{yz~}|{|~}}|{~zxyy{~zxvuw{}}}}zxx{}|z{~{yvvwyxvtvyyxuttuw}~}~~zvwyyxxyz|}}~}yxy~zwutw}{yvvwyyxwz~}}}~|yy|}yxxy{~|zwwz}}}}|yyz}}zyz}~{xxyxvttwyywtttux~|{}}{{{ywvwy{~}~~|xvx||yvtvz|~|zxxxvtswz||zz{{}~{{}|wvuuw{|}|~~~}zyz|{xuvx|~~|}}|zwx{}}zxwvvx|~~~|xsqqrsx~~|}}~|zyx{~}{ywvvvtrrv{~}yyz|{z}}yyyz|~~|zxusrtwxvtvy}}wuwwvspnnnpuxy|~~{zz{}|{|{xtqqruz}{{{{{{zwwyz|~~}z{~}|||||xutvxxx{}{|~||{{}~}}|zy{~}ytpqstsrrstv{|xtstux|}{z{|xvvwxxzzyy|~~|ywutuz~xttttsqqstw}}zxwxxwttw{~~~|ywxyyxxwutwz}~{}~~}{zzy{~~}{yy|~{|}~yurruxy{||{|~|}}||}}|}~}~~}yusuvvuuwy|zvvx|}|{{}~~|~|wuuwvtrtvyz||{z{~~{vsqpprvwwwwvvx}}||}~~|z|}zwutvz|~|wrqqsvz}~~}|{}~~~~{yyz|}{{|{xttvz}}}{z{{~|z{}~|{||yyz|~{{zwspopqtz}~|xvutvxyyy{||}}|{yuqprtx}zvtuxxx{|xspooqvz}|wuvxxxwxz||{|}|{zvrooprv{|zzz}}zyz||zz}~|||}}zxwuuw{~~{zyz{~}}|~~}{||{wtrrsw}~}|{zyxvwy{}|}~{vttuwxyyvtsuwz~|yvuvyyxxvtstwzzz||z{~~}||||~}|{z{{vsqqrtvvux}{yz|~}}}~|zz}~~~zyyzzzzzxx{}{zy{~{{}|zyxxz|}}|}~zwtstwz{|}|{|~~|{{{ywuvy|}~~}}~~zurqqrtwyy{~yusux|zwtsuwxxyzz{}|z{}}}}{xvuuvz}ytqpooqsttux~}|}~|ywwz|~~~~~{wuvxxwx{~}|{|}}|zz|~~~~~~{yxvwy|}~zuqpqsv{~~|{zyxxurppqsvy{{{}~{ywutuwwvtvy|~{yyy{~}{|~~~~~|zxwvurpqtwyzz|~~}||zyyz{}~|}}||~~~}{wsqrtw}~}|yxyyz{|{ywy|}~}~~}}~~}{zxxz~}}{xxzzyxxy{||}{xvuuuvvurruz}~}{zyyyxwwy}}{ywutvz}}|~|zyyz|}zxwx{~{wtrrrssrporvxz{}~{zz{{{{zxvxz|}xutux{}~}{z|}~~{y{|||{||}|{}~~}||~}|{|~|wtrqrsttux~}xspopqstuuuwz}~~yxxyxuttwyyzzzy{~}{yy|}{|~|xtsttsqqsuyysrrtw{~~}}}}~{z|~}yvtsssuvxy{~~}zyxxz||{xwy{{yxwx{|zz{|{{|~|z{}~{xwwx{~{wvvwwxyxvttuvvuvxz}|wrppru{{xwxxwvwy|~}|||}|zxx|~~~}{yxwvurpprssrrsux}}}~}zvsqrsux|~~|{zxxxvttuwz~~|}~~|ywwx{|yxy{}~|}~}}~}|zxwusppsuxz|}~|xusrsttrprvyzyxyz~{xvvwxxyxurqsv{~{yz|~~|{zwtrpppsx}|xtrrtvwwy}~|||||}}{xvuvwxxvsruy|}~~}}}}}|zxyz{zyxwwvw{|yy{}zyyyy{~}{{}}xusstwyywuvxyxusrtw{zwutssttuy{wuvxz{{{yy{}~~{yyz{{{{{|}ytqrttsqoorvz}|wrppqtvvuvz~}wrpqrsuxz{}}|{yx{~|||{yx{~~}||}zussuusqqtx|~}||{xutssttstvxx{~}|||{yusrqpqrvy{{}~}zxwwz}~}{}|wtssuxyxz||}~~zvrpquxyy{}~~{wsstvwwxyxvuuvvwwxz|~~~{z{||ywvwy|~||}~~}ywvwy{{yxz}}}~~~{yxvutttuwyyxxwvtuw|~|z{zxspqty}~~}{yyyvrrsvz}|}~{xvwx{}}{wtqpqrsux{||{{~|yxwtssssrstvy{||}~|ytrsuusqrw}}{|~~}}~~~zyz{yyz}}ywxzz{}~|{ywussrqsy~{xxyxurpqty~~zvrpqsttsqquz~~~}~~}|{xwxz{|}~~}{yy{|||yvvy|~~~zvtsssttuz}xspqsvyxuux{zwtrsvz}~{{~|yyyxx{|xx{}yyyyyyyyyxwxz|}}|{{~|vqpsuwxvuvy|}}||}~~~~~{zzyvsqrvz~}wssrqrsux{|~}}|zxx|~~{urqsx{{yyzzyz|~{yyz{{wropsvvtsuy{~~~~}yvusrsstvz|~}}~zy|~~}{wuv{|zwuw{{yxz~|wtttwzzxz|}|~~}zyxvtux{}||yxwutuvtqqrtwzz{|}~~~|xwy{zwwy}}|{{zyxz{zy{~|vsqqtwy|}{yvsrrrtvwwxyxvtux}}~}{||z{~~}z|~~}{zyz}}zyz}~}zvuy{zwvxz|~|zurqqsuvx|}{y|~||~{vsqsz}zutvwurppu|}{z{~{z}}zz~{zzz{|zwv{}|yxy~~}~~{yvssrrstsrw~}~{xyzwrppry~|zz{}~{|~}||{z|}~~|ywwxwwz|}}|xwy{}~}yvy|}}}~~~}~{|~|{z|~~|}~}|}~|wrtwwtrpquz}}{~}xwxxvx~}{z|~{vw{|{z{z|}xvwy||zy|~~{tppruwwttwz{|||}~~|zz}~||~|{~{wwy|~~~}||{xwxyvtw}}~|tpprw|}|}}||}}~}~~z{~}~~~{zzz}~|}~~{xxwtrrrswz{|}~~~{xy||{{}}{yz||yy{{yyz{}}~~}xrppqvz{z|}}~{{zvrruy~|}zvttw{|{~}~|}}||{wvy{wtuy|}}||}}zy||zxz}~~~|zy||{~~}~~}}{wwxvrpqt{~~~~{z~}~~yx|}|~~}|{|~}zz||wrrsw~|||yw{~~|xsrpquvuw~}{z{|z{~~~}{}}}~~~}yyyyzzxx}}|zvuy|{{~||~{|}xxxy|}{x{~{zz~yuwyxx{~|z}~}~~}xx{zvqppsz~~~{xz{~}}{}}}~~|wx}~|xwtv|~~|wstwy}~{xz~~~~~}|~|~{yxy~~}wppqsy}{x|~~|}|{}xwywtv||zz|}wy|}zyzz~~~|~~|{||}zvvz~}}wwzyxxyy}}|~~|~{y|zz{|}wvwuqprtz}}zw{}~}~{trqrx||z}|{|}|{~|y|~|~}{~~|~~wtrquyyx|~{{{|~~z{|~}}~}zxy||y{~~|{|||yusvzyvw{|}|~~}}}|}|{|zuqrtx}{~}~yxvv{~~~~~~}}~}|~ytstv}~}xxwwy{yw{|{~||{|{wuv|}~|vuutvyzxz|yz{~~~~{vsvzwuw{||}zy|{}~~ywwz~~~~{}~z||z|}~}|~~yvz}{vttsy~|}}|}yxx{~}~}yz}~yz}}yutrv|~~zx{~}{|zsqsrtwwssy}}{z{}~|{}}~~{vx~}|wwwy}~yv{}{zy~{y{|xw{~}{z~|~|yyy|~|x{}~|yy{xtvz|||zvxz}~~~zuxzyutsswzz}~||zvwwz~}}{z~}{~}zwxwx}}~}{}|}}vuuv|~|x|zvwy}||{y~~|~~vrqqtxwrsxzzz}~zzz|~~{}~~}zy{}ytuz}}y|}~{wvwx}z|}~~}z{}wuy}~|wwxz~~~xvxx|~y|}{xz}~{~|{y|~zy|zuqqqrwxxyxy~}yxz|{{~|wwtuxzxx}~|~}yy}~yx{}{{y|}}|wwutwywtx{zwx{~|{}{}}{y|~|}|yyy}|vsvytpquwy}|{~~~yy~~~}{y|~}z}{wvtx~}}{vwuvyzyx~{zz{zz~~ztsrt{{zzwuy{|{{~}~{{{{{~~~{{{|}|xrqonqsqov~}}~~yvxx|||{zyz}|}yz}}~y{~}xutrv|}{z~}ywzyutwyxyxuy|||z}~|~zx~~}wxxy}{tvyxrnmkpuw|}||~z}}zvwwx||{}zyyy}|x|~|zxz{usv{}}~yx{}|tsrruwtorxzz{~}xyx{}~}|{z}|ywxxz~||{vrsuqmov{}}z|}}yx|}xw{zxyz~{|{|{{|tsqrvxurw{|{}}z|{wrrqqvvvxwx|~~~~~zwyy~|}~~|xx~ywx|{{ypmmkpuwtw}|{~|uussy|{w{~}yy|~|}|{yz~~zy}|wqqqqwxxzyy~~xuwzupqtwy|{y|}zy~|{}~{|z}~~|vvvuwzxstwuolmnsz{}~{zz|~ztqrsy}}~}zz}~~}~yxwyzuuywrpswx{}{~~}xsroortrqx}}{{}ywxxy||yy~zzz|xw{|xttru{{zxspqvvsty|}~}z}zuvyvsuy||~|{~~~|z}zy|}{uqqnorsprz~xx{ytoompwz|~|{~}xz}|ywwuy{z~|xvyzutvyxwupoqquyxtu{~yrqpptvurw~~zuvvx|}xtxyvqnmlrvx|}}~yssvuqsx}}}yz|~{y{~yvx|~~{x{|~|uqrqtwupptvtrssu{||~}}{z{xsoonrxy}~~z||yuvvw|}||ytsutoosy||}~|uoooqvyxuz}}z|~~yuusvyyttz}|{~~xxzxsqqpswwxwuuy|yvwz}~~|{vtvupotz}~~~ywy~{wwz|{ztnnmnsvutz}~xvxwspqrv|~~~|z~{x{}zusssw{z||z}~xttwupptxx{ytuuuwywuz}uomlnsvuw~~zuuuuxywrsvtomnou{|~~|}~~|xtuz{wx|~}z|~|~~ywy{vstx{|||~|xqonmqtsquzzwuutx}~~{xzxsnmmpx|~}wxzzvttswzyxvrquxutv{}~{z~~~}}zttuvy|zvx}~}|~~~xsrpqtvstz~xwxvqmllqwz||zy{~zwx}~ztruvrsw}}|~}zxy{yttwxwwsopqswywux|}}~~}xw{|zvvwy~~~}}~~xy{xspoosy{~~~xrqtuqrv{}~~xvutx{{xz~|vpppqvyxw|~~~~wsrqrttoosvurssu{}|}||~}{}}{}~zz|~|~~{vsvwsrv|~}zunmmotwwux}|xuuvzzvwywsrrsy~}~}yx{{wrpootvvxwuw||yxz||~~{}}}~zzyyz{yw|}zsooorwywx~~~~wtutqnopt{~{xz~}z||{{||~|}~|yxz|ywy}~~|}{}xuwvrorvyz{vtvvxzxuu{~}{{{~}}~{ywy{uuvtpoqsx~~{wttxzvvz~|wvwx||||yyz|}{}|wuuvyzxtx~~}vomlmqtsrwzyxwvuy|}~}{{|{{~~{xtsw{zwy~{}~~~}|zusssw{{wvy{ywy{~}z|~z{~|zy{}{x{~}ywxwy||~~}|~{wxwrnllovz{|{z|~xwz}}|yxy|~}||}}}{zxtstuw{~{{~~}}~~zvx{zvstvz~}}}zz~zvvuw}}zxxy~}~zwy|~|}~{uqrutsuy|}}xvtuyzxy~||~~zyy}~}|wsuxyvuuw~~|{|~zz~{yz|}~|z|}~|vx{zustw~|~}||{wvxxvw~|yunmnquxvty~}xtuuy{z}{yz{}~}}}z|~}}}{z|~~}~}}~~}~xxxwxxvtw}~}}}~}yvx|||~zwwx|~}|wuv{~~zssuspprsw{~{y{~{z~~zyz~~~~~|}~}zyywz||~{vwy|~|xw|}{{{~~}}zwtv{}~}{}~{uqsvy|~{wy{zxx{~{y{~}~}~~}{yutw|zvw}~yuuvx~~|~|xxz{}~~|~}y{|{{|}}{|~|z{{z{~~~{z{~xwy}}|yyzzvtuuuuvvz~}}{y}{yxx{~~{~|z{~|z|{zzwutsuz|yvxyxvwz~}z{{{}{}~}|}xutw}~|{z{~}y{~~yvuwyzz}~zwvy~}ywvx{~|zyy{||zz}~|yx{~|~{yzytty|zusuz}|{y{~{wwutx~|{z}{x{}ytsvz~~}zwx{{y|{{|xvvx~~}{zyxx{zvtuuuutru{~~}~zvyzy{}~zwx{}~}z||{{|}|yz}}xuxzxsqsyzwy~~~zz|}}xwx{{z|~~}~yuuwxvsqtyywtsoqwyz~}}yxyzywuu|}z{zwzzzywutw|}|}~~}}}xuw{|~}{z{~|xuwyy|~zux|||~~|}{{~}|~zy{}{{zwvvssw{}~zxyxursv{}|~}{{{z{z|}xxwx|~||}~}zwuy}}~{z|~}wpptx{~|z}~|{}~|~{ttxzzxxy|||~}|}zyx||y{}~~}}~|yy}|wtv|~}|wpmmoqtvy~~}|~|tpqv|}~}|zwwy|xy{~}}zxxxxussstvwx~~}|~||}}~zwy|}~|z|~}|~{}}{|{zwropuzxtvxsnmmmt}}yuvxurqty|}||yuvxxyz}~yuty}xvux|~|{{{}}~~{|~~ywwttvuswzzzww{}{{|~xsuzxqopuz}}}yrqtusuz~}{}{usv~|}~|xx|~zwwvz~}zz{ywwyxutuwvutuy~{yxx{}{yvqquy{}xy|}yuty}}|}~xsuz|zy|}yuqmlmsy{wv~|||~{wutuvvz|xtvyz{}~~~{~vstwxtpotyxutsptz{}yy~~}{yxvux~|z|}~{{z|zy}~ytoptuvxwpmpqnmquy|}|{wqrwzxvwyy|~~}zxx}||{xtrttqsvy|yvwytpqtw||~}}trstv{}xtvz}|}}zz}{vuvvokmoqqppuvssspou||xw~|~~~~y|{|}wtw{wpnrxywtpjfhklmqv||z}zz}}~|xwuux~|zyz}}~~~|{}~xsquxtpoprtuusonrrqpqstru{~}|}~||ww{|z||yvtrlikpspmppjeeegnv{|yy~~|{~|{|~~}||~||{~}|{yupopstolmljjkhhotusprz~|vvx{|tpswslijpvwvvrkjmmjntyzy{~~}{{~{~|wvz~||~}yxxz}yuuvrnkjmponmifjoprvxwvx|~~~}}}}}|}{~|{z|yrorvvttwvplhedhnsrnq{~zxzywyzy{~}yy|}zx}|~|zyxsnoswwtqrpnmllovzztosxzzwuwz}wvvuz}yz}|uoknqqqrohhkifglptuw~}~|{~zy~~|{{}~~~~~|vrswxuuridfghloqssrvxxvv{~~~~{zyvtxzxyysoooqrpotuppolkqvvrpw~~xuwy{|z}}}}}wuxyxz~{sppuvrnooiggegowzyuw|yvy|}~|{~~yx}zvttwyxvtooqpmkmoomotvvvuvxwy}}{{}zw{|~~~wvww||y{|urrvxyxxrllmnnquxwvz{xuqrvvty~~~xw{~~ywvxxropplkkhhnqqoknw|}ywxz}|{~|yy{~zz}{~|{yy|}yxytonieflqtqmsyzvqpsuy{zzz{~~|}{}}xsprwvsrpjjpqpruvvttwyzxvxxtv|||}}wv{~~zxvv{|~zwyzwwxrjiljhjnprsx~~{vvzyvz{xx}{zzvx{~~ywxuqonnqvywplptvtomqtuy}}~}~yzzz}{z|zvx|~{|xux{}{xwyvssqmnswwrqx}~ztqqqry}zz}~{xw|~|{}|y||zulijkkmoqsqorttrruwww|zvvz~|{|zy|~|{{~~}ususqqqpolouwuqqssqrx{~{y}}|||~|}}}zwx|}xuwunkkijrxzytuz}{uqtvvz~{z|~|{zz~~zxx|~~}|}~|}}{zurrpllqtsnlpw{{wvvuv}}}}zxxzvux}{|}zy{}uqrsqruxyvvywtpmoqoouzz{|zwy|||y|~|z{~|~}|yyy|~~}wrrtuvyzxusx{yxvvxwstxwx{ztqsxzvrty}~}~yuqljlqutonuywrnnpsw}~}}}{{}}}~}|~xvxyz}{xy~{{xuw{}{uoqtusqooprwywwyzyxy|{xx{~}|{{{~~~yqpromnqsuux}}zvuwvsw}~}~zurrw|zuuy}|}|{~~~}~~~wttstwxwussvuspqvwwy}}~~yvvy|yrprx|~|{}}{|~~{zwsty{yttz~}yroooqwxvvxxsqrvyz{}}z}~~}ywy~~|}|xwutu{}yz|}|vstvw|~{wwvrqqrsqppswy{~|}}~}{|zwuutsprvwurqrqoqw{}~~zvux}{ww{~{vwyxvz}|||yz}|{|}~~|~~ztpoqqqtwyyyvqoqwzvsru{~~}~}~{yxuruxxuppv{}zvuuuy}}{}~|wsqsspqtxz|~}wvwy}}|z|~~}|wvy}}xw{|ztpppsy~}|zxuuwvsstvuuvyyvvwy}|~}}~}yz}}}~zy{|{zwwwuqtwwxywqopstpmou~~|~{}~~}~~}~zuvyyz}~~}~xxzxwz~zrnnqrokinsutuvtv|~~~}}{{~}xtvwwuqoopswxwwyzywvxwttuw{~|wwvwz~|~~{}}y{}~}|}~~}zusqrxzywwvspoqpnorvxwwz{wvx{~|z{z{}~}|yyzyvttwxwy|}~}yvvxzvnkmqvxxxwvwxww{{|}z{}~~|}xwwusvy{~zvtwzuonrvxwurnlosux|zvw|||{{~}wuvvx||xwwurqqrrommortw|~{{||~}}}zvwxvv{}|z~~~~{xvusnjjmppnprnklnqx|z}{wwy~}wsrrqptwxxwtqquzzvsrvzzyyyxy{{y{~}}~~~|zzzz~~~yuux{~{{{zz{ztpquuokjmsvvvupnqttw~~{}|{~zussty~~}||zxvvyxutttsqrsrooqtx}}}~zx|}~}}{{}{z|~{{{zyyz{wsrtuuuuvsmjiilsy|{{}zyzz{|}yvx{|}~zx{~~}|wqnortplmquusrqoquxy}}~~||xuuuw{~}|}{xy|}xqmmpqppnigiihkpw|}{{~}xvwz|{z{|||~{xvvzzwvvuqnoqrqsuxzyxzxsprtw|}~~xwwxy|~}|ywvuv{}zwuuvvspppqqprtqnmmlpvyzz}zz}}~yxz|}~zy{|}~~{vstxxsprw{{xurmkmmnqw}~~|yxwx~~~}||~yutx}|xvvxzzxuqnnnmklnpqsy~{|}zyurstsu|~}yvsqpmkloqrsuuplklntz~}}~|xwz}~}|~}|||zxxyyvsqokhgffjnoonpy}|{xuvwy|}|yspqux|}{wqnorqmijouyz{yusuustx|~}~~zyz}{{{zyyz|}}|~xvwwtqqswwuspkjmnoqstutvz~|vux~~zyxvv{}{xvwxuqqrtuvyzxtponoruussy~~{z{{{}}|~{{~{yxtsw{~}|{wrommpsusnlotwxwx|}{{}xsqppsvwxy|{xwywqljlopqqomnoooquxzy|~}~yy{~~|z}}|~yvx|~~}yrlkjjjkmoonprtuw{~wtuwxwvwvttrprv{}}~{wtrpmllnoopsussttvz~~{yz}~~~}}~~}z{}}~~{}ysrtwwwxxtpmllosvvssvz{xuw{zxwxy{}|yxxyz{{{{{}~zz|ytqqtwwutqoqssrtvwvuvxyz{|~~}{|~zxy|~|yz}|vsuz}}xvwvttuvustutrpoqrt{}{{xvvvttvwwtsuz}~}~}xsrsrpoonjhhimrvxxvx~~|~~|{{{}~~~}|}ywy~~~}~~|{}~{wtqpprsqmlpturoopty}{yxupmmpsvyyxwy}|uolnqqpomjjmoruy}~~~~|{z|~{{}zz|}zyy{}~}|ywwvrqssssuvvuuwyyxwwwuv{~~{ywtsttux}}z|~~{zz||yxwwvuvvrnlmoswywvw{~~zvuvx}~wux{{yz{||{zyz{zz}|yxxwwxxy|~zwwyzxtpppptwxz~{usstuxzzywyzyvtuwy{}{zyvtplhhhhikosuvy}~||{y{~~~zvuux~~||{|~~}~}|}}vtvxyyyyxvuvurqppqqrv{}{uponlmqvxxy{}~}zzz{~~|{{ytqpoliiiknsvwwy~||~|{{~~{z|}}}~}zsonnqvz{yww{~|yvuuw{}}~~~~}{|~~wrqrtvxyyz}zyzyz}}{||xsooqrqrtuttwz||{{|{z{~~{wvy~~|zwsqrvz~|ussuy}}yvussvyzzxursx~~{{|yuuxyyvvy}~|yusruz}~yqljijmppnkmsxzzy{~~~|xwxyxyz}|{}|xvwxz|~}yuvz~}z{}~|xspoquyzz{|zxy}|yvsstsqpquy|||{{{{~{{~~xojiijmpstttwz|}{{~}}~|z{}~{xwxz~|yusstwy{}}}}{yxz}~zxxyzyyz|~~~}|{{{zwwxzzxxz|}}}{{{~~}}~~{uqnotxywuvxyxvuwy|zxz{|~}zzzussrsvz}~}zz~}{{|||}~|{{yxyyxvsrqqruz}~~|yxz{yvuwz|{zyyz{yww{}yupmnpqqrssrqqsvx}}zvvvx||{|zwwy}}wuux|~|{}~{{~|{{zyxyxxwwvvx{zvtu|}||||}~}zvttuvustw{}|}~}|zywvspnooppsy|{xuux}|xxy|}yxz~~zvvx}}{|~}}~}~xsu{}||~~|||{{||yursvz}~|xsrtw{{z}~~{xwz}|wttvxyz||yvw{}}{xvuvx{}}{xusrv|~~}zwux~|~~}~{xxzywux}~~~}|~ztqruwuqmmpsw{}|zzz{}}zwtrty~yvtsuuuv{{zz|~wpnqvxxurppqv{~{{~{zz|}~{wvxz{{{z}}|}~~~~||~~~}}}}~}ytqqtwwxxxwvx||{zz|~|wsssstw|~zxz|zxy}ytstux{{yspqtvxz{zyxz~|urtz}zyxyz}~~~}}|~|wwy|~|xwz{yxyzzwtqrsvvuttwz|}|{zy{~|yvspoqux{zussu{~zy{|{{||||{yx{}~~}}~~|yvuw}~~~|z{~}z{||{zz|}xvvx}}}~xtqooqtutsqomnswz|~~|{zzzyy|~~{wutqooquz~|{{}~xtqrtvvwyyxwxy{~}}}{~{xwvtsrtz}zz~|zz{|||zxupmnsy}}{wrorx|~~}|}~yuuy{zyxy|}wtuxyyz|}yvuwxyy{zsprvz~||}~|yvuwy{~~||~|xusuxz}~{{~}~~yy}xttvy{}}yslhjpw{|xvw{~}{}zsopqsstsrvz{zyyyz}~yxx{ztqty}|yxz}~}yutw}}}|xwxz|~{zzz|}}|{{z{~wpmnqtuuroljhlt||xtsty|zvrppqrsuuvy}}}wqptz~~~|ytqqv{~~wtx~~}}uqqrsuwz}|~|zz{|}~~~}{xtqoorwyyvtrprv{}{|}|{yussw|}zxwxxvsrtx|~{xxy{|~}xssy}zyzz{}}ztonqv}{z{|}zurru{}{z}~}~~~}{xvvvvvvuqnmnrw{}}|zyy{~}|{zyx{~|vqoomlklou}|z|~{wspoquyz{||{xurqu|}~~|yz|~~|~}zz{~}{~}ysommlmnoqqpnnt}~~}xvutrpptyzwrolkmoruz{xy{|zyyyvqmou}~}~|xvy~{xuuwwwx{~{{}yttx||y|~zxy{{xsnklptwyzzxuu{~{y{zwvvurprw}}wrqpprtw{}~{xwx|}yz}~zvtuy}zwuvvustw|~{xuvy||{yyz||{~~|||||}{zy|yrnnquy{yuqoqv|~}zyy{~}}|zwuux}wmhhjlnoqsx~~}~~{|~~xrnnptwxwutuvwyzyz~z{}{{|}|~}{|~|~~}zsmhgimquvutsrtz~ytqppppruxuojhjnswxx{ytsuxyxvtrppsy||{zz}}y{|yy{}|xxy{|||}|ywvy|~}{z{}}wvz}}|zzzxsokjmty|||}~|xy~{vrqrstuwy{zwsqrtvwwxz~|zy|{vw{~~}|}|yvtvxyzxwwy|{xuu{yurruy~~|~~|zxz~~zvtuz{uu{}{zwspquyz{{zxtqrv|~~~zxzzywuttvwsnlmopopsw{~{yz{||{xuqnkknqtvwyz|}~}}~{zz|~~~zxy|zz{~~||~~yvusqnmmnqvz{zvsrwzusssrokhkqtspnoruy{||ztppsvyyxtpllqvz}~}~||~~~~~zxy{~~~ytrsvz}}yvw{}|wtttuutsqru{~zwy}zyz}~|xutsssqoorw|}zvsux{|zxy|~}|}~|vtw{~~ztnmpv{}|yxz~~xuxzy}~zxwwxz~|zyyyz}|xusuy}xw{~{zz}~ztsv{~}{ywutuz|yy{}{zxtqoopuyyuonpstsstvzzuvy||zvqmjhhmtxzyy|~}}~|wvz~|{{{{{}~}}~}~~{|}}|zyxyyvrooquwyyyxy{~}wrolkjhimtxxtrswyzzyz}}}~}ytporvwuqomlnrx|~}~}|~{}}{}~}}|yxxyy||~{ursuvvwxyyyxwwwxz}~~{ywvwz~{uolmoqrsuy~{xxxyyxx{}zyz{{|}}zwwyzyxxwtrqswz|}}}}~~~{y{{vv{}z{}~~}|{ywtsvz}~|zyz~zsqv{}ywvxyz|~~|yvw{{wvy}ytrrrstttuy{yurppqswz}~|wuutrqqppnllou{~~}}}}~}{xvx~~~}|{zxwwz~}vuy~~{y{|{vqnpty}~|{~||}}uollmnnmmpv|}yutvy|~|xwy}~zsmjloqrsttsruz}~~~{xxy}{{|~}wroqvz{{z{}~~|yvwz|y{|xvwwxy{{zvqnortuutw|{xwz}}|{}}ywvwz}zspptwz|{xutvz}}}||~}~}zz~~}}}{xutsrsw}~|~}yutx~~zxx{}~}yursw|}{yxy{}~}zxvvvuuvvwy{zvssuxzzzy{}}xroopstutrpopswz|}|xxz|}|y{~~|{||wuuvxz}|||y{~~}|{xtsuy|}}}||{yy|}|{{||{xurqpopqrsuy||{|}~}zxxyzyuojilqtuuvxyxwy}z{~ywz}}}|{{|}|{{|}~}|}|xtsv|}}~~}~~{wvx|~}zxurqrvz{zwtsuxyyxx{~~}zwvwz~~}{zyxwwxz{xtrtwz||}|zwuvx{{yz~|}~}~{vuvwwvvx}~}~}zz~|zyyyzzxtonrx}~|ywvwy||yxzzyvssw}|xvvvuuvx|~}{{|}|xtqqrtwyxtpopu{~yvwz}~|yyz{|}}xwxz|}}~}}~{|~}~{wutuwy{{ywuvy~yvvwz|~~|xutsrqqqru{~{z{|}||~zurrtwxvspoptx{||{yxz{wy~|{~|zz{}~~~}|xutvz|}|}zwvy|}{ywusrsvwvrpnnoswz{{yxwwwwvvy}{xwvusrtx|}zvsrtx~}xwz~|{}{y|~|zyyyz{}~zvsrtw{}~~~}yxy|{upnoppoomkjjloqrqqrtvy{~|xvuuttuw{|vrqrrqqrv|~{{{|~ywwy{||{zz{}~~}{yy|}}|wvwz}~}zurquz{vtvxz{|||{xtolkjklnpssqnlnruvtsstuuvy{zwrommortuw{|yxvvwxy{|xutvy|~}|zxwx{}~~}|}~zz}{wttx}}}~~{vplnsx|||}}|{wtpnnoqrsrpkgdgknoonmmotxzzxvuuvxzz{|~}yuqooprtvxyyyxvwx{~}|z{|~|}~}zvrpnoquy{}~~|xuv{~|{xrkffhklljgcaaekqtuttux{~{xxyyxussux{zvqnnopqsux|~}xwz}~}~{yxxyz}}xuuvwvutsrsvz}}ywxz||{yxvuspkgegjmpqokhgiouyywvvwwwxyyxvtstttrqrv|{wuuwwwvuw{~~|zyyz}~zwy}~zz~|yyz}~~}{zzz{||{yxxy|~}{xutuwz{zz{}|zuqnnnpppoljfddinrsqqqstuxz|}~~}{zyxxy{~~{vspoonmmosx|}}{z|~|}|y{~}}{xvvvuuutrqqu{}{|~~}{yupkgfghgfeddcdhmrwz{zyy{~}zwtqpqrtvwvsqonmlmpty~||~~|{{|{zz{|{|}~|uonpsuwwwwwx|zvuvxyxvtrqomigffhjlllllmpuy|}{ywvvy}}xtrqpppqsx}~zwusrqqsv{~}}~~~~{yy|}}~}||}~~yuuwz}|zz{|~}xtrsuxzzzzzywtpmjijkmnmjgfiouwvtssuw|{xwwwvuvy}}xqliijkmpty}|xxz~~|}~yvtuwwwwwvutuw{~ywy|~}{zzzxtnhcaaceghihfgkry|}|{{~~zvtqnmmosvwvrmjijmqux|}|}~~|ywx|}|}~}||{zvropsuwxz{||{|{urrstuutssroidbbfknqqpopruy|~}|{{{}~}yusqommmpuz}}yurqqrtuwy}~~~|~|{~~|{zz{~~|zxyz}|{{|~{xtqopsvy{{zxtpmjiiloppnlkklptwwxyz{|}~{wuttttvxzzxsnkklnnoqw|}zxxyz{|}~~}~{wuuwy{zxuttx}{vuvy{|{zxtokfdcdfgiklmlklqx~}xsommmmmnprrpnmmoqtw{~{zzzz{{{yxwy|~~zwwxz||xtrsvy{|}}}}~|tnmorttsqonljhggjmprtutsrsw|}{zz|}|xtqonnnnoqswyzywvutuwz|~}}~}{{}|zz|}ywvwz}{|~~~}zvqnmptwyxvuttsqnllnqssqnlklqw|~~|zyy{~{xvvutrpprvxxvronnpqsux|}~~{wsrsvy}~|{z{~~~~{xwwxyzzyyz{}}yvuuwxwvutrqoligfhjmoonmmou||xtpmkihhimrvvtqpruxz{}zwvwy{{yvssuz~{yyz{}}}|zwvvx{~~ysommnnnnopqpolklnqstuuvvvx{}zyxxxxxwvspmkijlosx|~}{zyxyyyz|||}}{zyz}~}{zzzzzz{{{zz{|~}|}|{{}|{zyvrnlloruwxxyxwtrqqqrrrqqqqrtwz||{zxxx{~}yvrpnnnpswyyxvtsrqqruy~~}~}{xvtstuwz}~{z{~}|{{zz{~yvwy|~~|zywxz}}ytpoqsvwxwurqomkjjknprsttux|~}}~~ztnjhhhikmquxyxvuvwy{~{wuttuvvvvxz~~||~~{{|~}zwwy}~}|voighknqrssstsrqpqrtwz||zxwy|~zwuuvwxwvrnkijknqsvz|yyy{}}{yz{|~~}|}~~{xutuvy|~}}|yxwxy{||{zxtokijotxzz{|}|yvsrrtuvvusqppswz{ywwwy|~~|yvtrqqqqrtx{|{yvtstvxz}{xxxxxxxwvwy}~}}|||}~|xvvwz}|{{||zyxwvuuwz~}zwsppruxyyyxwvspmlmpsuuutssvy}~}|||{yvrnlkkkklotx{{zyyz}}wrqruwyyyz|~~~|{|}~|{|}}{z{}~{wspmkkmoruwxxwvuuuuwy{||zxvvwyz{{zxwvtsssssqonnopsvx{~~~~}|{}|zz{~~~yvvvvwy{~~{wtrsvxyyxvvutrpoorw{~}{yxxwwvusrqpnnoswyyyxwwxyz{{zxvtstuvwxy{||{yxwwwxy|~{zzzzzz{{zyz}|z{|~~~|yxxy|~|xwwwwvusrrsuy|}}}}}|{xusswz||zyxwwvtrqqrrrsssssux|}zxxxzzyvspnnnnopsv{~~}}}~~}zwuuwxz|~||}}ywx{||{zyyyyz{{|||{ywtqnnorvxyyzz|}|{ywwxyyywtssuwyzyvsrqqsuwwusrstuvvx{~|zyxxxz|~~~~~~}~{zyyyz}|{{zzywtrqpqqstvxyyxvtsuwz}~{wtsrrqpnmklnrvwwuuvwz|~~~|zxwvvvvx{}yvtttuuwz~}||}~~~|{{|~}}}~}||~|xusrrrssrqooquy|~~{ywxy{||}~~}zwspooppppqrrtvy{}}|{z{|}||zywtrpoopsw{~}|zzzz{|}~~{zz|}|{}~zwuuwxyyywutsux{~~|{zyvsqrtx{~~|ywvvvvvuutsssstuvuuuuvwy{{zxvvvwx{}}{xvsrsuy{}}}|||}}{z{~~~~}}~}ywwwxvtpmkkmpsvxz{|||{yxy{}zvspnmnnnmkjkmqtwxz{|}|zyyzzzz{|}}{wtrppqsuy}}~~|{z{}~zuqooooonmllmqvz~~{{|~|yvspmllmoqssrqqtx}~~~{yvtsstuvwy{~}ywvvwyz|}}}|ywwy{}|{{}~|yvutuuutsssstvy{~~|zwuvy||yussstutsqonnptwyzyxyz|}~}||{||}|||}{wtrqpqqstwy|~|yvuw{|xusrqonmlmnoqtx|~~~{wrnlllmljhhhkotx{}~|zxvvwyzyvsqoooooqtx}~~{yz|~{{{|}~}{yuqmjijklmnoqsw|~}{xtqomlllmnoppqsv{}zxutsstvx{}}|ywvutttux|~xtqrtx|}||}~|{{{|{yvspppqsuuuuuwz~~{zz{}~~|zxusrqqppppppqruy|~~}}~~|zzz{|}~~}{xspmkklorvz~}}}{xussuy|wrpooooonnnoqtx{~}zvqmjhhhijkmnpsw}|ywusrrtvwvtqnkiiknsy~~}||}}{zxy{~~~~~~}{zxtokiijlnnoprux{~}~~}{zxvsqnkhgilortuvw{|xusrrqqsvz|}{wsqqqrtwz~~|yvsrrtw{~~}{zzyyxwusrqqrtuvwxxxz|~}{yz{|}}~~|zvronnoprttsstw{~~|zxwwwy{||zvqmkjkloqty~|{{||{zxxwwutssuz|zxwy|~}|zxusqppppqqqqqtw|}ysnjgghjlmoprux|{wsqppqsttsqnlkklnrvz~}|{{z{|}~~}zxy{~}|}{xvuutrpmllmoqstuwy{|zz{||zxurnkihiloruwy{}{wtqooopruwyyxvtssstux|}{xvsssux|~}}~}|{{{}|zxvuuvxyxwuttvxyyyxyz}~{zz|~~{xusqppqsuwyyyyz~|ywvvvvvwxyxwspnllmorvz}zxwvwwxxyyxwvuvx{~}zwussuwyzz{|~}{{|~~~|yvtssssrrrsux||yvrnljjjlortvwx{|xtqonmmnprssrqonprvz}~{zz{{{zxwwx{~~|zz{}~|{{zzzz|~}zwvvwxwvtrqqqrstvx{}~{yzzzywvtsqonlmorvy{}~}yvtqpnmmnqux{|{yxvvvwy{~~}||}~|{ywussuy~~{ywuuuvwyyzz{}|zwvuuvxz|~~}|zzz{{{||}}}~}{zz{|~~~}{zwusstvxz{{{|~}zxutsrsux{|{xusqqqqruy~{yvuuvwxyyz{{zyxwxy}~|zxvspnnorvy{}~}~~~{xuttuvwvvvwy|~|yuqommnpqtvy{~|wrnkjkloruwxwvuttuwy}|yxwwwwvvwxz}~|z{}~}|{zywuttvy}~|zxxxy{{zxvutuvxz||||}|xvvwxyyyxwtsqqrtvy}~|xuqnlklorw{~~|zyyz}}|||||}}~~~|zxvtttvz}|yurqqrtvxyz{|~}|{{zyyxxxy{~~~|{yyz{}|ywwy}}{ywvvxz}}yvtsssuwy|~}zwtsrsvz~|zyyyxxxxxxy{|}}||{{{{|}~{xurnlklnqtx{~~}~|zzyyxvusstvxz}~}~}zwtqooqtx|~|xsomlmnoquy|~}{yxyz|~|wtrrsuwxyz|~}|||}~~|zxvuttstux{~~{z{|}~}||||||{zzz{}{xwxz|}~~~~{yvuuvy}|yurpnnnpsvz~~~}~~{ywwxz|~}|{ywuttvy|~|ywusrqqrtxz||}}~|{||}}}||{{|}~|{yvttux{}~}{yyz||yxy{}|zxwvvvwz}~|zyxwwx{~~zxwxxyyyz{{||}}~~~}{z{}}yvtrpnmmmorvz~}|{{|~}{ywvusqpprtx|}yvtstuxz|}~{xtqpopqtx{~~~~}yurppqsvxz|}zxwvwwxz{|}~~|{ywvvvuuttvy|}}}}|||{zxwvwz|}{zz{}}|{{{|~}{zxwtrqqtwz~~{zz{}~}{yyxyz||yvtrrrsuxz}}{yxvtrrrtwz|}~~|{|}~~~~~|zwtrqqrtvxz|}~~}|}|{{{{|}}}}|}~|zyyz{|~|xvuvwy||zxxxyz|}}}}~~|zyxxy{}}|zxwusqoopqruy}~~~~}|{{{|}~|zwurponnoqtx}|xustvx{}~{wutstuvy}~}||~~|zxurqqtwy|~|yvsqrstuvvwxyz{{zzyxxwwwxy|~}}}}{{zyxvutuuwz~}}}~}{zz|}{zxwvwx{~|yvuvy|~}{zz{|}{ywtqonoqsuwy{}}{yxvtssuy|~||}~~|zxurnllmptx{~}zxxxxyzz{z{{}~|||~~{wusrtw{~{yxwxxz|~~}}|{ywvuvxxxxyz{}}}}{zxvtrqqqsvz}zxwwxyz{{{{}~{xvtrpnljjmqw}|wtrrsuwz|~{xvuvx{~}zyz{~}{xvuttvxz~}zxurpoooopqsux{|}}~~}|{yyy{}~{yyy|~~||{zywtrqqsvy~~~{xxx{}~~~|zyz}~zvtssuxz}}||}~|zwtrqonmmmortwz}}zxvuvwz|~~~~~~|yvroljjlosx|~yussuwxyxwvvx{{xvsrrsvz~{xwwy|~}|{zzyxvussstuvxy{|}~~{xvtttuwy}|ywvvwxz{}}}~}zwurpnlkkloty{vqonpsvy{|||}~|zzz{}}{ywwx|}{yvuvwz}~|zxvrolkklnoqsvx|~}}}}~~}|}~~|{zz{}~|zywvutsssvy~~yvuvxz|}}|||}~{vronorv{~~~{ywusrpnlkkloruwy{~}{yxwwwy{}~~~|{{}~}~~}}}zxvsqnllmptz~|wsppqstuuuvwy{~~{wspopsx~~{zyyz{|}~~|{zyyyxvtsrssuvwxyz|}}{yxwvvwy}}zywwxz}~{xusrrqpnnorv|zuqnmmoruy{}~|zyy{}}zwvuwz}|{zyxy{}|zxvspnlllnoprtvy|~}||}~}{zyyz{}~~}|}~}{{}~||{{zyxwuuvy|}xtssuxz|~~}||}~yuqoopsx}~~~}{xvsqonnnmnnprux{}~zwutuuwxz{||{zyz{~~|zxusqpopsw|zsnkknqtvwwxy{~~~~{xvsrrsv{{xvvvxyz{|||{zywvuuuuuvuuvwyz{{{|~~{xuttuwy|~}}~~|{zz{}~|zxwvvutsssux|zupkijmrw{~~{xwwxz}|zxwx{~|ywvwy{}}zwvttsqpoooqstuwy{~}{zyyz|~~|ywuuvx|~{yy{}~|zxxy|}{{|~|wsqrtx{~~~}}{xurqruz}|{zz{}~~~|zwtqonoppqqqsvx{|~zvsrqqrtvyzzyxwxz}~~~|zxvsqqsw|ysnkknquxy{{|}|{z{|}~~}{xwvwy~|xusrqrsvxzzzywvvvvwxxyyyyz{||||}~~zwtrqrtwz}~}|}~}{|~~}}~}{{{{zyxwwx{}|{}~~|xtpmklpuz|xutuxz|}||}~|zwusstvx{}}zxwvvuutttttuvwyz|}}zxvvwxz{|{zyxwvvwy|}xvuwz}~|{|}}ywwxz|{wtsux|~|{|}}{xvuuy~|ywvvwxyyyyxwusrqqqstuvwyz|~{uqpoopqsuwyzzzz{}~|{{}}|}}{ywuuuw{~~}xsooptx{}}}}}}{{{|}}zyxy|}yvutttuwyz||||{yxwvvwxxwwwxy{||||}~~zvtssuvxy{~~}}~}~~~~}~~}{zxvustvy~~~{uqoqtxz|{{zz|~}}~}zwvwz}zxvuuuvwy{}}{yxwxxxxwwwwyzzzyyyz}~{xvuvwx{}~~~|zyz{}~|{zzyxvtttw{}}}~ytpopsw{}~~}}~|zz{~|ywwz~}|zywvvwxz|~|ywwvuutsstuvwwwwxy||zyxyz{}~|{zz{}~}~~|}~~|yvuux|}{z{}{vsrsvy|~~~}|{}~}}}zwuuvy~~|zxwvwy{}~~|ywtsrrstuuwxy{|||||~|wustuwy{}~}||}~}}~~~~|zwusrtw|~||~|vqnnptx{||{{{|~|{|~}{zyy{|yvtsrsuwz|~~}{zxvuuvwyyzzz{{{{zzz|{wtstvx{}}{|}|{{}~}~~~~}{zxwwx{|zyz{~{uqnnqw|~{xxz}|zy{~~{yvttuvxz|~}zwutttuvwwwwxyzz{{{~}yvuuvxz|}~~}{yxy|~{z{~}zxwwz~~{yxxy{~}wsqruy}}||}}||}}zxwy}}zxutttuwyz||{yvsrrsuwxyz{|}~~~zurqrsuwy{}~|||}}||~~}~~}{yvuux}~|zzz|~{uqnorw{}~~~}~}zyy{}~|{|}zwtrqpqrtwz|}|{ywvvwxz{||||}~~}|{{}zvsrstvxz}~}|}~~}~~~}{{}~|zyy{~~{xvvwy|~|xtqqsw||xwwy|~|{}}{xvtssssuwz|~~|zxvuvvwxyzz{||}~~}}}{wtsstvxz|}~~~}|{{|~}||}}yxz}}zxxz}}zxvuuwz}{wttuy}~~~zyz|~|{{}~|zwurqpqrtvyz{zxvuuvwyz{|~|wspopqsux{}~|{zz||{|~|ywwx|}ywvwxz|zvrqsw{|xvvxz}~~|ywtrpnnnpsvy{|}|{zyyy{|}~~}|{{}}xtqppruwz|~}||}~{yz}}zyz|~zwtsrtvy|}yutuz~yvuvx{~~~}{zxusqppprtw{}~}{ywwxy{|}~~~|{|~~xtqpprtvy{}~~}{zyz{~|yy|~{xvwy|{wusrsux|zvuw{~~{xwxz~~~~|zwtqonmnpsvy|~}|yxwxz|~}{z{}~xrnmmnpsvz~}|}}~}|zxwxz}~}}~{wuuw{{wtssuwz~yustx}~zvuuwz~~|zwtromllmpsw{~~{zz{}~|zxwxz}~zupnnpswz}}}}}~}{yxy|~|}}zwuwz|xtrppruy}}xvw{~~}yvuwy}}|zxurpooopruy}~|zyyz|~}{xxy|~ytpnmorvy|~||}~|zxvuvy}~}~~zvsstx|}ywusrsux}~ywx|~|{{|}{xwx{~~~{ywurpnnnoqtw{~|zz|~~|zywwz}{vpmlmprvz~~{yyz|}}{xuuvx{}ytrsuy}}yvtttux{}yxy{}{{|{xwwy}~|xusrqponnorvy}~}}~~|zxwvvwy{}}yupnorvy}}{{{|}}}|{xvvw{|yvttvz~~|zwsqqswz~{z|}zxxz}~{yy{~|z||zxvutsssrrsux|~}||}~~}}}}{yxwwy{|}{xuqoorv{~}{{{|{zyxxwvuvy~{ywtrqrvz~~|zxvuuwz}zxy}{xxyz{}~|zz}~{{~zwvwvusqqrsttvy}~}}~}||||yvsrtx||zwspprux{}zxwwxyyxxxxyz|~}zvtrrruz~{xwwwwwz}~zxx{}zyz|}~}}~}{zz}}yy}}zwuuvvutsstvvwy}}{{}}}||||}{zywtrrsw||vrrux{|}}zwvwy|}|{xxz~}ysompuy}|ywvuvx{}zxz}~}{yxxyzz{{}}|~|yx{}|{zywvwxxvtstw|~ywxz|||{{}~|xtrrtwz~~|xtrsux{|~}xuuuvwz||{xwz~~}ztokjnu|~zwuvzzuux{}}||{zzywvw{~{{}~}||~~{zzywvwwvtsrsx~}{zyyy|~~}|{ywtpopty}}|zxvuttx}~wrrsw{}}|{|}~~~xsponot{}zxvtw}}zxuuy~{yxxxxy{zwy~|yy|}~zwxz||xttuvw{~zxxwuux{}}|xtrrsstux}zvuvwy|{z}}yvtux}~}||}~~ysolmqvy}{wvvy}~{wuvy|ztrsux{}~~{}}wtuy}{|}}|yvtrtz~zurrv{}||}|xussswyyz{wrqsw||}~xuuwxxz|~}zy{|ywusolmqv|~zxy~zsqrw{|}|zwvvuw|~|~wsty}~~zwwvvvvwy|{ursw|~~{vrrttssuvwz}zwuuz|y{yuuwz}~~|z|}zwuvutrrt|~|||{|~|wssw}{wuwxy{}}}~wrstw~~}||yvx|}|{{}{usuuuwyzwurqrtxzyuv|~zyz{}}}~{{|}{yyz~zz||~{~{{}|zwtqqqty|}~{zywvwxyyxusuy|~}{wqprx|z|}|||yxzzxx}|vstuwzzusvwvuwxxyy{}}~{xy{|||zy{~~~}}|xw{|yy|ywxz{|ysnnt{~{xwvuvursvxz}}|}||zusv|~zwx|}xutuy|yvuvwvuusruyzusvz}}|{}{{}}{z}}}~{wyzx{~~zy~|{|}~~~|wtuvy~zyy{}~}vsttuwxy|}||}~zvuxyy}~||}wssw~~|yyxtnmpsuvvvwwx|}z{~~zurt{|y|}zwvz}}~}{|xy~|{~|vtwxtrw~~|z|~xqllpv{|{||||y||wwxy}~~}wrruvuvy~~xvspqsrrx}}yvvz|ywwz~yvtruxxzwuvz}z{~zx{~||~~}{wurtz~~z{~}xw{~{vonnmry~~zxz}~{ww~xqoruux{}zrmnrtwyyvux{zzyxxyxywtwzyutw~~wuwuu{~~}|}{{~~~~vqqu||vwzzxxy{voortw|~|{||~~|{}{ww}~{zxvtpot}~yuqmjlsy|{uty}|xw{yvtpnqtuz{tttv~|~}x{~~}~{utsopz}|uw}|xsnlpw}{y~||~}wy|zy||wtsrplls{|sqpptxxy{||}}{y{|zyz||{yyrkkpw~~zww{}yy}||}}}wtrrw~{xwyyz~xwxursrsvxtqu}~}{z{wollqy}}~|xtpqx|{xvwz~|usvyz|~~zvrpquw{~{yvv{|z{~|z{{vty~~xtuzzstwz}{y||{|vx{yut{~zzyx|~yvz{~yqmorw|~{vuvvsrtvuw||yxvx|}{~~xojlsusuwxz||wy|~}z|{zyy}}y{{{{xwzxuw}}}}{{{xz|}vomv~~{y|{x}|}wnkospnsyxx{xuwy|}yuyxwww}|yy{{z~wtrooquzzxx|~z|~yz~~}}{ux{|{y}|||{{z~|yurvyww}|sntz~~ywy}}{yz}|z}|}yvppsrtyxrs{~}|}zvvx|}ztsxxtwxvx~{y|{uqrpouxxyz{|}wv|yz}vpot{~}~|~{{|}|{wnostzzxyywxx{}usz}{{}xw{{}}xsqppopsrquz|slpx{zxttww{ypmoldekpt{~zvuy{uv}}zywvxz{yvx|}~yvttqqu{}ywsrtttx~}}uqsqpv~}{xsrsmddjnpwyyyuu}{vy}}y{|vwzx|~xpjeekprtz|y~|yz~~|ytx}}|z|}}|yrnjjpwxz{|~}topu~zrnpqstw~~~~urqjinolp|ywz||wwusu}~~}{z{xxylefeirx{{tt|~xw}|{}~yvx|{wvxyw|zx}}yvx|{ytrsnksx}zssux}yvqow~~~vlhgjmpvyvsx}yvvwyyw|~{wuv|vidgeafpwxxz|}zvz}xx}{wzyx{wz}uuyxuwz|ystuvwxzx{vprusz}vxvqtvvx{~}wojkgbdmtwytw~zx|}~upsuvy~{qifdfpwxsv}{zy~~~wt{~~|}~}|xqu~z{yurprvysuytsv~vsqsvzztu}sjkiiouutw{{~{{}|{{uw{ypotx~{{xphilpurt||{{}|yy~}|}xvxusywy|{xttxwuy|ssvvuyxttrzzz~}{x~~~~}|zy~|y}}wrljjpvursvz{xy{|~|}{~~|{xvwww{zvnhlojhipyzy}~}{{~|tnrvuw{}~|qorvwxvwyuz~xzzsw}yz}x{}|{||wps|~}toklnlknoow~}||}~zwxzwrpswtqsswyzuoqqonqwy}~~~z|{vx{ws{~|{{{y{|xuy}zstww|ypp{~{z}}}}~}{~|z||ux{{~|wz|yxplpruvsrx|{wxwuxxwuvyusstvvxxy}|upimxzzyuvzytrvxv{}{y{}}yw|}wuslipvrrz}xvy}|~}y|{z~|~}x{{}{||{}|ywvuoovy{ytt{~ztvy~{vu}{utokswwz|yurmkmrvuw|yz~yttsons{}{w|}ywvuusoijpqx|}|yzspu|~}{ut|}{|~yttvwnipwywxwy}}y|{tvxy{wppqlfhlszzrqswzwru~~rrssw~}~||~}wpnqqnqx}}{yyyxy~}wx~~}~{{~{xtz}~~zy{~~}{wspv}}wtz~ytw|vnntzyxvpjhkosw{zyxtsttwxw}zvtsu~~zy{}{}vmkgeitxxyzwwy}|xw~~z|~|vtz}}~{~~|y}|}xtwwzzuvwtw~|xtru|yv{zpjkijt{~ywz~ynjotu{|ursuuvy{y|xuqnlmjgnuy}}|||~~zvrsw}}~z||{zwv}|wz}|tv|xsqsvxz{vssv|zxwofgkjfjsyz{~~ztvywt}{z~~wruy}~z}~}}xsnmorssut{zy|~}|yxw{|vv|}|y}~wppxyx}{y|{zyzyv|wrtvtrrvupmihhksyytx}xuvxy~||~z}~~}z{|yz~yx}~ysvtpmkknrprz||~vvy{}{yyyxustz~~umptxzux}{{~|~xsvwwyzumospkloquuv}}{||vru|~~}|{|zx{~zsu}|{}sooppqsokkp{}tquxxz{usvxz~|ywssw~~zutvz~~{xssvrnnkfhpqmjmv|z|~|~|~}z||}zz}|xy}|~|~xuxywstxwpmrvz}|~ztw{ywwwv{}{upmpwz}{z{~}~~{yxtokilnnmknpoouyx{~xtv}|y}z|{zz{}~}}{xwtwzyxqiiqurqw|{xvsmnrvwwz~~}|zysnrx~~|}yz}~~vtspoqnlpuurnknvzyxy{~~}~{xtw}|~ywz~}z~zxz~~}}wz{uruyytqonopr{|tssnnqpqu{}|y~|{{zxxzyzvyysljoqoppommnmnpstz~}xz|~|yy|{vswywy|~~~}~|yyw{zsvyvpmou~}z}|tkmtvux|~~}|{}xuuxxty}}~~~xuqmihjnqtskjnquust{~ywvvvxxy}~}uquwz|z~~{{|~zxwsmknqrv~zwroomkpy}yvz|}~~|wssyzvx}}zzypmnoqrqswtqpqpnrwy{}|zy|yssv|||{zxvwz{z}}|}~{z~|wvyzytkkpsy|rnopnopsxx{zx}xuwy~|}|yxyysqnmrvvsmknqpijqwy{}}zwx{z{~yusstxy{}~}xvuy~~{}~~~zyxusrrv~~{xyxrnrwywux}}{tuywtv|zz}ztsurllptqpqnmllrxxx{trv{wstwvvyvrtx~}{zy{|}{||vrqrtvxy}|xwzytrrporwyyz|}{{~|wwvuxzvx~~yy~|{yusqsxyrotwuolorw{~|}~{yvvtsxzvtw|{yy|||zsw}}}~{z{{yxzvruy{~|zz{xtstuvrlouy}}||~~z{|vsv~~yy|{|zy}wvvvvtsspkioroqx~}~~~}ysrqqtxywtty}yvzzsrux{}|~~yz}|zwx~wvz{|}{xvusstuuy}zz}xvvvw|~ywy{z|~|wwz{tnnrsrnjnqryz{}zrpsoilrvwyyyxwxyxz{{z}}}|z{{yuuxz|}}}|z{{tnmosrsy}|~{wyzz|~vux{~{xxvqpw|~}zz{xuvwtpqtvtsvz}}|}{ww~yqnkjpvwuw~}xwy|~|xy|||}wzyvwy{zx||wwy||z{|zvtsnkmt}yvsuy}|y}~}{||uutrv{|{~zutwwrpqqpuzwsuy|{xvz}{tlkmpuwy|zuuyzwuz~ztw}}~}}}{~{ywuvz|}|y{}yxz~}wvwtooux~}zwwx{~}~~|wqot{}|~|{xtqppsvtrvxwy||xwz~|tkjonkmsz}{vtwwx{~{~z{}|~z{|vopw|zy~|~}yskkrww|yuz|{yx{~~yuqqqrtw{}yyyywttvx{}{vtw|{wvwxz~{rlmnnpvzyy{|{xuu~~|}|yx}|yurv{|z}}}}xx~yy|{wropqu|uuwxxz~}||wopsvxy{}|xtw{zxxywvvttssvzzwx}{xxupmmt{zwvuuuuwy|zxz|}zw|vsuy|{}|~|vx}}|{}~|}|vwzxtw|~{|~zv{~}{}}xvutsw~|z{}zttxyz~}vstwywuuy}}|~}yvsqonoqrsvxwrrx}{y~~{z{~{vxxutuy{y|zy~|}|{||{zusx|xw{}}|~{vx}|{||uuwwsqv|||}|zxw||~~zwwuqty{zwuy}y{|{|~|tnosvusruyxvy{{~}~yx{}zvxyyz{|{{}~zwy~}z|}{yx|~zxywv{zw{}zwvz{|~}}zvssy~}yyz|~~}wtvxsnouxxyzzwvz~}|~|vvuqpsvvtptz|}zz}|yx|}~~{xw}zwwtsw||{{~xxz|}~wuv}zy{}{xzyy~~}wvyz{z{|{wx}~}{zwsopvzzvw~~xuwuv}ywyxrllpsrtxwx}~|{}~~z}~~~|xxxuuwtorx|~~}{x{|wwwwuv|{yxvuz}{wz~ztsw{{yy}~~{}zrqtvyzz}yrrvtpt{~|wroqtrnqz}|{x{~|z{}{vtrqrwyzyz|z{{z{yuvwuw||{{{vrw}~{{{xvwyxux|squxvsty|xtrolow~|~}uqppqqvywz|}}~~}~~|vwxsnosvyy{~yuw~}ztpt}|zywy}|~}xuv{zx|}{ustuuvz{usvunmquz}ywwsmkrwx{~}zz~~}||}ztspmptsqqw}|{z~~}ztrty~}wwz{|zwvtt{zy{{yutx|yuuqjlsvtsy~wvtoouvsy|z|}{~~~xwwrmmqttrw||~~yzwrsv{{{{||z}}y{~}||ywwxvvz{~}|zyyyyvrtupkknpqs{}vpqvxy~{x{{y~~|~{|yxspruurnpy}{xz~}~}||wwwxz~~~|}|z~~~~wu{|{wtzyuwyvttokmqrpnox~}zxywtx~{xw{|y{z{}~wopsuspqtttuz~}x|}{}~zux~}}wv|~{zxw{}wx{|}|{ztqutonppppqvxy{}zuyzx{~zwx{}{vw|~~{}~{upsvvplqwvsqsx}}~}zwx}ztx}zwz~}z{zuw{{wy~~~}|vsqmmqsqkjpuvwvw|~|~~zz}zyz{yy{}~}{z}~uruvxuswvrqsvwvx}yz|yxzxtv}}||}xy{zxw}|~~}}trrplmnopnorrqrv|~||~zz{~zrsw||~|wz|yuqtywsmkorrw|ttwusvxzzy~{}~wvz|zwz~z}zvtmjpuurmotusopuxy}~|yxzxvvx{|}}}}}~xwxwuswvrpooonmt~yuuslltzzxx~~yy~|}|wv~}||~{zwqnpqrppsqnkkosrry}~xuw{}}wx~|~~{y|}{wsu{{wroooosxz}xuurpswwwx~xy~{}|xxzz{}|~wnlorrmjptrmjknps{zxyyxxx}~zz{yy||}}~~}{z{ywtrroijquy}~~yqmquwuru|}}~~}|{}xv{}zww{~}~~|tpqqqprvvrmmpqmnv|ytw{|yx|}|~}xy}|}}|zz~yuwzzwqnoolmqru|zwqoqpoorxzzyz|{}||~}zy{}~{||vwyxrnqvurmjjjinuvw~~|z}}xz{yx{{zxz~zzywwy|~{y{{xvvwupnruwz~~}}wqrvwtqsxz|{z}~~xssvx{~ywvsoossollmmihmtx}~~zyyuuxwrrx|{xy}{vuz{|}wuvvrrtqpuz{||}zxwusqtwtrqty{z}}z|~}~|zwuutu~~xy||wroswvsponlmsttx~{{}|usttux|}{x{~xw{~~|}|xuuvtontutuxww|zuvwwtnnqsrpqtvx|{zyz~}|{xxxx{|}zxzxurqqqmhjoptz|yy~zwywqrw{|zwy|||}}vtxzyuv}}xuuvvvz{ww{}zxy}~~zyzywtuyxtqptxwx||~{|}{wqqx}}{~~wuwvspmlkkloposz}}~ysqnmpuvtsw||zxzzxxyzz}}{{}yuv{|{{zvrsw||xz{|}wvyxuqonnns{}|zy|{y|{xyyuuxy|{zzyx{}||z{{xtqrtsoossvz{yxz|}~ywtnkntxyx{}|||}~~~yw|}xvvuswzxw{}xtsuyz|~}~}zwuxyuokmommry}{zyusvy|{z~|x{}{xuw~~~zusrqptuqquvtuvyzz|~zuqsuuttw|~zutvyz}}yvw{ywwxywtuz~zx{}zvy~zvx}~{wxzzyvsromrz}~}zuvz~~|z~}}|zz~~|{|~|vsrspmnrsuwvsrv}}|~zrmnpqpqtvwvuvvvx~xw|~{zzzy|~}yvwurtx{|~}~}}}{zvutrnmqsw~|wx{|{z|}|{{}~{x{~}|utwz{yx|zvtsqsxzxxz{yxwz{zz~{wsrrqomry|zxwxz{|}{zz{yuvz|}|yz{zuqrx~|{~~zz|zxvtqllpssu{}wvxywst{~|zy{~{wvxyy{}|}{uuyzz|{vrqtwvssw}}ywwwurtwxxwwurrw}}~~{xtstuvz||}yyyz|~~{{ywy|{yx{~}yvvyxutvvw}~yxyzzy|~|}~}~||{}{y~}zwusvywvyzwtsuvuvz~~||xsnmqtspoqtssx|~|yz{{xy~}ustwxxy{{{{zwvy~}~{zxvxzxuvxxy|~yx|~zvvxyz}|~|zxuv{}{yy{{wux{}{xy||wtw{~||~~zxyzwroqrrtuvwuv||{zyz~}|~}~}ywvwwx{|{|{{~~}zwvwwuuvvvyyvuw~~~|yvxxvvvvwww|~{}~|xux|~~}||ywvrqsvwwx|~|yz{{~zwyzwsqsuuuwyy|{{zvsv{}}|~~{|}zyzxsswyzyxz||zxwwux~~~|z{|}xx}}zxyz{~|||~}|}|z|}}~ywyzwrqsw|}~~{|}{}|ywtqnnonmpwz{}}~~|{z}}zwwyxsqqqrtwxxx}}{|~||}vsuyzy{}~|zyywtv{||{yzzxwwwwx{{xy{{zz|}xutssx|}zwz{xsonprsw{|~~~}~|z}~}zyxvuvvtsvz||{}}{yvuy}~~~}{xwwwvw}|}~|xussttx|}}}~}zwwz}}~{utuvvwxvsstsqrw||ywvsqrx|}~~}}|}}~~~xttrrtutsrv{|zvvxxwx|~}}~}zy}~{z{{yxz~}{{{|}ywwxwvvy|zwvtsuz|||~ztqpnortuy~}|~~}ysqpmjkorrqsxz|}~~}{}|vrsw{}}}~|{zy{|{|zwvwwwy}}~~~}|zwvvtpnpsuvx||{zxuropv{}~~|~~ztqpnorttssy~}{z|}}{|}}~|~~yttvz~}{zyutw{|~~{~}yxww|{xwwuromklnqqqsz}|zyyzz||{}~~}|}{yuporssqprttuvwvux}}{}~}||yx{}~||||~yxyyz}|~~|}~}zywtrtsqprtuvwz~~{vtvxxyzzyz|~~|}|vsolmnmjjnrsrrtx{|{xxwwy{xvxzxwz}~~}~{{|yx{{vsqpprrolmrwxwwxzyxzzz}|}~{yvqmmprrprtuuvwxxy}}|}|zxx{|{{{zz~~||~~~~~~}{z{{{{}}{|}vrpnkijlmllortvz}~~{y{~}yvvvurppstrnmoqsuy|~|xwxxwvxyyy|}}~{zvrrvyyy|~xspnmorsqopuxwvwz}~~~|yy{|zy{}~}ztrrqpnnnnnnnopqw~{yvrpommquvvux~}~}{}}zyyyz||{|}{xtstusqqqpooqsttw}}|}~{{~~|xwz}~}~}{{|~|zxxxxvsswzzxvuwyz~~ztpopopsuvvx|}}}}~~|y{}~|z{||xwz}xwy{{zy{~}wsqssqnmqsroopsvz}~~{xwwvvwyyurssstwyz|}|}|{yxwtsv{{vqmlnqrompsuvuuuvwz}}~}|}~{xusrttsrsx|}|xuuuvvwyzxvvwwvw|}{{|zurtvwwvwxxwxvtuy|~|}~{ywy}~zvwyzwtrstsuy}wqnjggghiknqssuy||||wvxz{|||zxwurqsvxxx{~~}~}zwwyzxuqppprwz{~~}~~}|||||}~|wuutssssssw{}{zz{zyz~}}{xxz{zxxzzzz{{yx{{upkjlnnmmquwxwxz{}~}}|zyyyz{}|zxwxyxvuwz{yxy|~zxvtstusrrrqppt{}}~~|ywvtqqokknqqqrv|}{{~|}{z{{yyzz{~}ytpnmlkmonmmorttv{~~|zxtppqrqpprtuvwz|~||{xutw{{yxwwwy|~}{zyxxxywsppqqrtuttw|~~~}~~}~|zzxwvvvtsuy{|}}upmljfceikkkmpsx~}{z{{xtrqppqqpoqvyyxxz}}|||{yyxwssvy{~~~|~~|zxwtqrttspoqtvwxyzz}|yyzzwuwzzxvuwy{}{vsqnlklnnmnptuvz|{|~}|{zyxxxvuuwxvtuwwwvvuuw}{wwxwusrrstvy{}~xrpommnnmlmoqrsv{}z{|}}}~~}|{{zy{~}}~}{vpmnnmkiijkpv{}}ywvtttrommpqommortw}}zyyxwwxzzyz~~~~|zxtrpnlnqttrrtuwxyz|~|}|wutttwz{}~}|xsnlkiedeghint{~zvtrpmmopomnpqrstuuvz~{yyzz|~}}zwuttuuutsturonorux|~|yxyxwvutsrsw~~|vrppomkkkknty|~{wusstuvurruwvsrrsstwz}~yvtuuttw{~~zwrnmnoonmnoonmnpsz|z{~~|{zzz|~~|}}{vqmlkjhjnrv{~|yvvvvsqoonmllljkpvz~}}~|xutuwz{urpnmnooprwxwtrstvy~}|zwttwy|~~||~{yuqlhecdhlosx}|xurqrrpmlnpomlmoqsvy|~~~}|z{~~}{xustuuttvxwuspmmpv|~}}|zwuuuuvxz|~zuqonllnqty}~~zxxvsstvwuuuussssrqsvyz{}~yvttwz|}}{xvtqommprrpooonnqv|}|}}}}}~}{{}}}}}}}~yuqnnpppqtvxz~~{zz{{ywuvvtplkklmoqrtx{|~}}~~}{yvvy}|zxvrpppolloruvwwvtuy|~|{z|~~~}}}{z{||{{}~~{xupljkmorstuy{wttuusrrqpomlkkmrxz|}~~{z{{{{}~~|yxyyzzxussvxwvwxxwuuuvy}~~}{zxwx{}}}}||}|{yy{~~~}zxvvwvvwxyz{}{wtssttstwzywtrrrsuxz|}~{yy}{yz{}}{z{{yupooopqrrrtwyxxz}~zxwxzz{~~||}~|zurrstvy}~|{yxxusrtwyyz}|yyz{{{||zxvsollpsuwxwvwx{}|xwz}~}~}}{wttuvusppqpnnptwz|~|{zxwxz|~|z{|{yz}|zxwvvx|~}}}{wtssrrtvwx|~{yvsrsvwutqqpnnpsv{~}}~~{xwwxy{~}yustx{{zzxwuuuvwy}~{z{~~}|~|}~||}}~{wussttuvy}~}~~~~zxy{}|{|{xusrrtwxyzzyxvwy{|}~{xwz~~~~|{{{zz{|zvpmmnptwz}}{||zyxwvwxz|~{vrnkknqqsw}|ywvutuwyz|zwx{~}||{{zyxvuvxxxyyzxvvy~}yvvwz}|wutstuvvusqnnnszzwwyyxwx{~}zxxxxz|~|ywtrrsssuy~zvuvuttvz}~yvtstuvvutvyyxxxx{~}|~~|{ywuvw{}{zzzzxvssv{~~{ywvvw{}{{~~~~~}|z|~~yurrqonoruy|~~}~}zz|~~~{xvtsrtwz|~~}~{ywx|~}|||}}|~~~~~{xy{}~}zvrpquy|}~{xwyzzxvvx}~|xvwvtroliiknpruz~yuuvwxxxuuwy{}|yxy{|}~zwwyzyyyzzxwy|}yvuvz}|{|~~{vsstuvvwwuttvy}ywvwy{{|}}~~}{ywvtsrstuvvtqopqsuwz}}xuuvwy{|{zyz|ztqqtw{}~~{yz|~}|~~~~|zxvvy~|yvssuxyywvuvx{~~~~}|~}|~~~~~~|yvuvx{|zvrppomlnquz}|}~~{ywvuvx{}~|yurqtz~}~{wsrsvwxz{{{|~~~}}~|zxxy{|}~}yxz}~|z{|}}zyyyz{zy{~}yvtqnnqttrmkjjjjlnrz{wwwwurpmmotx{}~{y{|xwwy{}}|xspquz~|||~}zyyyyz{{xusrtvz~}}|zyxwxz|}xsomlklnpsuvvtqooqsvz}ywvvuuvuttux|}wuv{|y{~}ytrty}}zyz|~~~}{zywvurporwzzxvuw{yuvz~~}~|xvtrppqsuwzyvromkklqv|~|{ywvutssrrty~~~}|zyz~~|wrnkknruwxyyz||ywvwwxyyxwwy{}|y{~}~|z{zwwy}{vsqpnljjnsurmihijmrv}}vqooonnmllnrx|~|yxxyyxvsollpuy|~|zz|}ywwxwwwyywvwz~|xwz}|yww{}yuokijjihjnswxvrporw{}{somnpsuusrtx}~~~}}}}|{zyvsqprw|}{xwxz~|yutuwwvtrqpqsvy{|}~ytopuz~}{yvsrqponprtvxyvrooprux{~}wtsstuusrppqtx|~|zyxvsqomjhkqvxwvvx|}yusqqstvwyzywvwy}}}|yww{}|~{wtromkjjjlprronoqsux{vnjkmnmllmnnptz|vqopqrrqomlosy|}}}~~}{yxwxz|~}{xvtstw}~}zvtuy~~ywwvurmigijjiilrxzzyxy|~{tmjloqsuvussvz}yvttvxyyvrpprvyzxvwz|{yvrpquxxuqooqty|{zywtpnqw}}ywuuwxwtqoppppppsw|~|xvvvwy{}|wsqqrtvvspmmpv}zurqrsrqpomjhkqvxxy|~yutsrpoqtxz{zxwwz~}~~|z{}}yuuz|z{|}{wsqomkihhjouyzxwvvwz}}vojijmnnnnmmnt|~{vqkiknppqqqpoosx}~||{ywvwy{|}}{yxxy{~|yustx|{vsstutqmjiiiihjnv~}|}|zyz|{vniimrtuutttw}~}{ywurpprtwyyvspprw|}{zxvsrtwyxvuvwy{~}|{{yxvtqopuz~yurppprturnllmoqsw|~{{||||}}zzz{}~ztqqsuwyywvvx|~~{yvtssuvwusokimt{}}}~yussromlnswz{{{}xttuvvuttvyyvrrw~}yvuvwz}~|xurqqrtuwz~~yutssux{~yspooppppppqsx}{zvojgikmmmmmkknu}}zxy{~~{wuuuuttvx|}xutw{~~|ww{~yvvxyyuokhghjlnqv|~|}~|yxwwxwslffimpruxz||xtrrsrnkjlptwxyxxxz~~|zz}}zwvvz}{yy{}|}~~}||{zxvrnmrz~xrnllnqssqmloswz{}}|}}}|{|}|yvuuvvx|~|wrqtx|~||~~}}}}}{yvtssuvwwvtrqu{~|wtsqommpw}{uqpqrstuvwyyxvuy~ywy~~yvvwxy|~~{xwwxyzyxy}|vrsuwyzz{~~~|uomnquwxxwuuz~|zywtpkhgikmptvvuvz~{xwuttw|~zwvvvwy{}zwtsuz|}|xutuwwusqoopqrsux~}~|xuttvwvsmiinty|}vuvwvtrqqstrnklpuy~{yyyyyy{~}|||}|zyz~|xx{}~}{yyyzyvux~}~~ytolkmquxyxwwz|}~~{{{yvsqrtxzyvttuvwz~|wvy|vtvz}}|{|~}ytqqtx|}zvtv|}{|{vttuvvwz~ztonpruuvwy|~{wuv{|xvvwy~}{{{{{zxy}~ytrrssrrrv|~~}~{wtux{||{zyxy}}{~|zyyxvsnigintx|~~|yy~{ywvtrrtx~{yz}xvwz|~}zwttw{{wutvz}~}xtrrtvwvwz}{zzzzxxy|}yvsrrtwyxusuz~{tqqttsrrrtuuroosz~zxxxxyz{}}zyz||z}{xxz|}}~{y|{z|}wronptz~{{}ytrqpnmlmpuyzxvuuvx|~~}ytrtx|}}|}~~{xvx{}xtuz}{{~}||}}|{}}{}{uomoswz}~}}~~}|ywvw||zz|~|{{{zxwx{}ysmkkmoppqtz~}}}yy{}}}|{zz{ywz}~{yxwwwuroorw{~~{z{wvvusrru|~{uqrvz}{wtvz~{{~}||~{wtstvxxxz}|wttvwvutuy}|yvttvz|xy}xqmorttssuw{}{yx{}~{xwwy}}zxyzzzz|}zxwx{~|xy~|xwz}||yz}|zxyz|~||~yrnmmmkiikpuz{zyz{}|||}~}{{|}}|xtrty|~~{z|~zusu{~{zzz|~}|{z~~~~~xw{|wrprx~~zyxyz|}}{xw{~zzz{zwspqssplijkmnopsy|yxyz{|}|yxy|zvwz{{{|~~|ytrty}|z}~}~}xusssux}{xwwxz{xspqv{~}{z}|zz|~{wuuvwwvtstxzywtsrsssssuz}{{}}{|~|}~yqklpuxz|~}{}{yz~}yurrsv{}{zzz}}xusrsw||yy~~~~~|{~~~~zvttwxwsnkkkihhimt{}zvsqruxyz{|~~ztru{~zz}{vroquyzzyxxx{~}|||}~}xvy~}zy{~yuuwy{}~}}~{xwurojgimqrnjilnonorwyvvxyzyvsqrtx||wvy}}zwvwz}{vtw}|yyz{~}xvwz}}xuuuuuvxxursw{~}|{{}}yvtqoppnmoswzyvtrqqqrru|~~||}~~~|yvvy}~~{uonrz~}|uoosy{ytpoqty~~zyyxwutrqty}|z|{{}}|zxwuqooprstsoljhghjnv}|}|ywvuspnlmrvz}}}}yx}|yz|}wrnjilqvyzywwy|~~}}}~~~}}{{{||ww|~~xssvzxspomlhddflstplmoopru{}tpoprssqpqqru{~|~~|zxxxz}}yuqoqw||zzzyz~~|}{xvututtvxxwxz~ywxy{||}|z}}}|yurnklnnkjlqy}|wsqqswwx|{tstvz|{ytqqw{||~~zwv{~{ywqkjmrwyvqppsy}zvrqtvxwustwy{}{uuz~}~}{yvtspmlmmnrvuqnkjlosx}xtsqprsrpmiilqw|~zxwvvspmljjjkow}|xwx{~{yzyxx{|~}|yy|}zz}yvw|~xspnljgccdgmsussttuvy|ulhhkoqpoqrppsy}~}|yuqsvwusrppqty}}{zzxy~|xwz{zyzywusrty~~}zvsqrwz}~wuttutqkjmmljkms{|xvx{zyz}snnpuxyxvroqtvy~|{|xwvttvrliilpuvtrrtz|{zxvqmnqvz{xuwzz|}{|~}yvvvx|{yzz|{vspmklmjkpx{zwrprsw{}vrnjknqrqmhgiow|wtqnnmkkjjkkjks{}{{|~{wwyyvtvz~|z}{vuz~~~zzzxusqnkjfccdgnuy|~{yz{~|slgehmooqtsporx}~|zywqlnrsqqqprsruxz|~~{vtwxwx{|zyxvx|{z||xtpmpuz}vpppruuqmnonkjlnv{{}zy|}}}tnkmswxxuqpruw|~}}yuspopsqmkkkmruvyz|{zyvupmnotz~|z~~}zxxxz||yxywuw|}xvwwz}zwsnklnllqzztttw{~~~yuoihkpqqpkilox~xtsqmkifhjkmnlinx}}xuxzxuuw{}{~~~yst{~~|wwxtrtusnlgdeglsy}|||}~zz{{|{tojfhlnnqvwutw{~zxuuvvqllooopqqtutux|~zvuwvux~|}|{~|xy|}zvolou}yqnnotxwqprqnnqsx{wy}}{||yx}~ysolquwyxvvyzx{}}{z{}zurmknrpllnoptwz~~|{ywvpmnou~~zxusuuvz}|z|}yuv}~z|zuuvy|xrnotsqsy{wuuy}}||{zvmginqsurqrsx}~zussrnkhdfhjorqou|~|wvz}zx{{xuvx~yy||z{|}yuw|~ywxvrsvxusnjkmouy{}}||~yxzyyyvtrmklnnqz~}z{{~~|z{zutssuwtooqommpqv{{|{z}~|}|wvyywz~xux}{xy|}||upru}yw||tqposxyvwzyvtvwz{vwz{zzxvyyz||yv{|yvqrvx|}{{}}yx}xv|}zzyy}|zwpkkopnpuxwwwv{}z|~zxsprsw}~~{xtoosuy}~|}~{}~{xvy}{www|yvxyusv{|zvwz{wv{~}}}{{}yplnsuyyuuuuz}{yxz|wrruuqnhdfhmuyywz~~~|{ztrtw~|~}{|~{yyz~zy{yww{|~}{{{ztru{}}|uqqqty|{}}{~||yvx~zwxzyyxtuussttsx}~}}{wstrprqrvxvrstqmosv}{{|y}|y{|{|}}~ytuz{xx|{yyz{tuz|utqrx}~~{yzzysrtsrspptuy|}yx}}}}{}}}}}yx{|trwyxwxxz~~|ysnnstsuz|{zxuy~zwz~|}zwzz||}}zy{}{xvonqsy~yxwuwy{|{zz|{}xuvz|}}|wtuuqotxxwy|~~{{|wvxxz{xwxwy}|ytrtzytsuwutpjkmpx}}z}~}}|yyuqsuzxsstx}~zz}|xvy{~|}|y|zx{|vvtvz|zz{vxxvwtqrx{xxz|zzzvx||~|wz~}|zzwrpmlpqswzxuy{ytuxz{y~~}zy}|y{~}yzzytvzyy~|~~}}vsv{}{yyx}~}{}xomoonoljnrw}|y~}}ywy~}||z}}uruvuuxx{{vvywtw|}|wsvyyw{}z|~~}~z{xtu{}{zuoprv~~|{|wuvtwzzx||uux{z|{wxurrrolpttruy|~~{z{wvxwy}}z|}ysorxwstx|{|xrqqry|{|~~~}zysrtu{}~vspqx}}z~}yx}}{z~|}||}{wvy|zw{}|{vvwttrnnswvvz}|~{}~~}}}zxzzurniloqx}}|}yyz}yz~||~ywz{~{}z|~~~yxw|}yz~||~zy~~xuwz{|}}yvy}xpmnnlmjhkns{{z~zvvxvvxuuwwz}~yvxwsrvy|~|}zuv{~}}zsrsu|}|y{~}||yssw|}}|vuwx~}yyvsuvvz|zyzuuxvttoorqrsqlkqsrpsw|~|ytuuuxywrtz}||~}|toqwwvz~xvtuy}|{ywxy}{~~}~|vuxz|y{~~~xvtquz|{~~~y{~~{|}}~|xxyytqvwvuwxvxwttqmnsutx~}{{zz}zyxvvy}{wx{|yvojlou}~|z|xwwrqv|}|{vtvx}~}z{}}z|}{xz{xz~|xy}{|}yxuqpuxtpopnmmihknuzx{zsppqppqnpsty}~zy{yuty}|uuy|||xpmkkrx{y}}|~}vsw}~|}|}~~{zwrtuw}|tqqqnnjhlnqttplpssqsx}~zsppnpsrnnsvvvz|~{uuz{{}}zwux{{y{|vqppv~|z|~}|~|xx{{}~zxwuvz~~|{||~~{||}{|~{|~~|xuusnlpsqpruw{zwvropvyx|}xttrtxvutqptzzwx|~|{vqqty}{~}wrrpkjpwyzzutvw}~~|xyyx{|{x}~|}xw~~zz~~~yxyvusnlntsqrsroolknqwxstsmkmommlilpsx}~|~}z|}vuwxvupjhfglrtv|||||~~zz~~}~}}{utwz|sooollidgjntwupsvwvw{~yoiihkookkprsswz}}}{~}|ywxxuruwupnmlqx||{}}~}{|~yxz||}|y{||{yxvvxvvyz~{yvssrnjmpomnru{}{yvuy|z{|uonnotusspnpvxvx}zxvx~||}zywrooojfiouxzwtvx}}||zywstvw{~}y|}|}{vsw|}}~|yxyvtrmkmqqpswxwwsprtx~wqoojhilllkhhlov}xrqqpomgfedgloqx~}~zw{}|z|~|zxw|~z{}~~~wqoomkkfdfiovzyy}~|{|}}vkgeehlljlpqpquz|~}{xvusolorqnlkkoux|~}}{xx}~zz|~~~~}zxxvssrqux{xttsstrmkopomnqw|{~~{|~zsmkjnsttsompvwx}}zz~}yxxutrnlmnifhmquyxxz}{zzxwuqqtvz~}~{zyy{{xsswyz||zywyyvurmloqqrx~}xuvw{~vpolgfimmmlhimrz{sonmlkidddehklnv~~|xux{zyz}~}zwux~{{|wrqqpnlhegjox~~~}}~|xohecfjlklqsrsw||{~zwtrrqniknomlllnsuz~~|xw{}{{~~ywxxutqorv{}vrrqrutpmprqoquz|{~|}~{|~{tnkjmstuurqty{{|{}~{xvwwsrolknnjginrw||~{zyxwtpqsw}~~}||xvvvwz{wuwxxy}}~{xxxz}{xuqorvuuz~yxwy}ytrnhgimnppmmqu|}||wqnnljjgddegjmnpy~~~~~|ww{|zy{~|x{~}|||{vv{{z{yutttrqnjlnry~~zz||{yrlifgjllouxxwz}}z{|||ytrqpqqmiknnllmnswy}{xy}~}~{{}~{xy{zxuqpu{}~~xsrrsvxurtwwuvx{}z{~|zyxy{{yy}~ztpnnsvxyxwx{|{}}||yvy}}zxwuwxusplkmomkmqux||~~}}{ywrruy|zzyxwtrstw{|zx{|{{~|xww{|yyy|~|ywx{yxz|yxx{}{z~~|ywtmjkpsuurqrty~~{yyzwrooomkhdefinrssx~}zxz||z|~}|~~{zz{|zvvz{zz{|~{}||}|||yvwzzyxsqrsw|~~~~zxyz{{xspnkmopquz|{z{~{wvuturooooqrolmoomnqsy}~|{}~~|yxz}|yz}~~}zvwz~}yxz~~xtssvz|{{~}zz{~zwwxxxwtuvvxzzxz~|xvtuz|}~|{|~}{}}zywspsxxvuuuxzxvsonqtsrtwxy{{}}~~|yxz}~zxxxwvtpqsvz}~}zusrtx{}}}||}}~~{z||ywvwvttx||{||}}|}{ursvwxxttuvy~}}{yxvtuxvrqrrpnkhilotwwvz}}|{zwux{yutuwyxuuxzyy{}}}zyy}}{}zvuvx{~{y{|{{zxy|}zxy{{{{wvutuvvuw|~|||yusrppolmnortspqstssvx|~~{y{~~~{zz|}zxy}}|}|{|||{wuw|{xxx|~~}vrrsssrpprux{{y{}~~}}|yz~{ywvvtpmpsutuvwz}|{xutwywvxz{{{yz}}~~}||yvvxxwvrpsvz}}||ytrqqtxz{}zz}zwsrrroorvwwy{}~zyzzzyvttux{||}|{|zwusrtwvssuwvurnopswzzy|~|}|{zvux{{trqrvxwvxz{z{~}yy|}{yxxz{ywxz||||yvwyxwvtuy|zyz}~}|}}}}{xy}}|{{}|wtsqonljlnptwwvy{{xxy{~~~|||}~}zz}~~{xxy}~{z}~~}zz{yuux|~~}vqopppommpsw{}}~||~|xvxzzzyutttuurnnqrstvx}}z{|yxy{|{zvuwz~~}{{xuvyzzyvtvy~}{{zxvrqqrtwyzzyz{{{xusrqqpnlosuuwz}~}{yussstvvtuz||zzyz||yvsqswxvx{}~}ytsstxzzyz}}||~~~}|ywy|~wrqqtwyxy}~}}|yvx{{zyyz}|zxxyywvz||zywvxxwvtsuyzz|{{}}{zyxy|||{zyz|yuttsqokjloty}}}}{{||z|}|{}~zxy{}}}~~}zyy|~}{z{|ywx|~}~}{yz{ytpopoonlmptz}{{{wsqqrssrppqruvsqqsssuy}~{xxz{zxsooquz|||~}zwwy|~}zz|}zzyxwtrrsux{}|wuuutsqopppqpnnqtuux|~{wrponopomotwwvwxz~~{yusuz|{}}xvuuwyxwxzyvtvx~~}~~~~yutsux{{~~~|{{{{{ywx{{zz{|~zxvvurqtwxxxwwyzxwvtux||~~|||zwutuxxxxwvwzzwuvvtrolmptz~}{{~{wwxwwy|~~}zxxz|~~|zy{~zyz{yxy|~}{yz|{wtrrpomkknsy~|{{xsrssssqopqruusqrssrtw{{yz||{xsppquz||}~}xuvy{||ywxz}~}{ywtpoprvyzz~|yxxwvspqrstsomorssux}ztqqprsrpqtvvvwxz}}|yvstwxwz}}yxwxz{zy{|zxvwy~|z{~|xussuxxy}~|{||}|xwxyxxxz}|zzyvtuxxxxxy{{zxvttwyz{~~{xvvwyzxwutuxwttuvvtpllosx|~~zxxwutwz|}{xuvx{~}}}~}}|{~~{|~{yz|{zz|~~|zwvxywtttsrpnmorw}|yyvrppqpomkkloruvuvxxvvx{{yzzxvqmllosvwy}~}~~zy{~}{{|~|{{zxvrqsux|}}|xwvtsommnqtusrsvvvxz~{tommnoommpqrrsuy~}zyzzy{~|zyyyxvvxwusrsw}~~~}~~~}zyyyz{||~}|{zzywwwxz{zxz||{{|~|zyxvsrtutstvy}~|zxy{||~|xtsrtwwvtqpruuuvyzzyvrqruz~}{wuutqoqtwyywuwy}}zyzz|}|{}~}{xwy|}}}}~}|~~}~~~|zvtsuvuvwyxwurqsv{zwuronnnmkigilpuxyy|~~{z{}zxwvtrnkjiknpqty}}}~~~|{|~}{{|}}{xuuwz}~zwvtrokiknrwyxxz||{|~yqmkjlmljjmopqtw|~~|{}~{yxwwtrrttsqpprwz}}|}~}}}~{zywvsqqsvy||{}|zyxxvspqrrrtvz~~~~~|wtqpqstsrqpruwwx||wuuw{}}}|zxvtsrnkloswzyxy{~}{wuuvy|~}~{zz{zxutvwwy{~~}zxustvxxy{~~{wuvx|zwupljkklljikmrw{}~~|wttsrplhffgjmpt{~||}|{{|~zwvw{}}}~{yyz}zvtrqomkmosx|~~~~~zsnjhhiiilorrsuz{ywuutrprsqomlnrw{~~{|~~~~|zwurpnoruy}~|zywvtrpqtuuvw{~ytomnrtuutstwyz|~|{{{}~}~~|{|}|zvroonllnquxzz|~}zwtrruy}~}zyyzzyvrqsuwx{~}}}||}|{ywwxyy{~{yz|}wsokjlnpomkmptx|}}~{wvusqmhddfimopsy|xwyzz|~~||}~~{z}~~~|zywy{}}~}{{~|xvvvvuroorv{{smighkmmnqtuwy{~{{}~~{wuuuvvsonnnmmoquxz}~|{}~yvvvuuspqsx~}wtstvwvwxxxy{~|||~~}zvrppswxxwwxz{zyz~~{zyzzz|}}}|||}|yurooqrqoprvz|||}|zyxwuuvy}}zz{||zxutstuuuwyyxy~}ywwz{z{}}{|}|~~~~~}ywvtqppqrtsqpqsw{}~|xtqnmkihjklnqsw|~|{zxy|~~}~|zyxxyyy{~~|yxy|{y{~~|}~}~||}}{yxwvvvx{~~{yvrpoooooptxzywxz}{ywvwwvuuuspnlmprsrrsx}~}~}|~{yzzxy{|{xusuwz}~}~~|xuuvy||zy}~||~~}|z{|}~~{xxz||zywvx|~~|yyzz{}zyzyvsrv{}}}zwwxxwwvuutttvxxxyyz~~~|wwz~~|{{{|zwrooqtx{{yy|~~~~~zustvy}~|{|~~~~|}~{z|}{yz~~xttwxwurpprx~}||}~~~~}ytqqrrsrnkkosvvtvz~}wuwy|ytstwyzxvtuvwy|~}~~||~~|zz||}}~zvuuy~yyz{|}zwtruwwuuwxxz~~xuuwwwurnmnpqrsuvttvy{}~~}}~}|}}||}~{xwwz~~}||~zutux}~~~{wwy{||||{{}~}{xxz||{yxvvxyy|~}~~|{z}~~|yustuuuvywtstvz~{wx{|yvuvwy|}|~~|{|}zxtrrqpquxyz|~||~{yyzxvttsrsux}~{xwwy{~}z{~|xwvuuvxyz||zz}|z{~~{vsuvvvxzyvtsssrrsttw~zxvtuy~}zxvvvurppsvz|}}}}~|ywvy}~}{wuw||z|~}|{|{z|~{|~}{yvuuy~~~}|zxwupljkmqvyxuv{}|ywx{~~~~xvx{|~|zwyz{{|}~|}{wvy~~zvsstx}~{}|||||{vpprty~~ywy}~{vstwxxxuonprsvz~}{ywvw||zy{~}{{~~wrrrtvxwurt{~}zz||{ytnklnrv{~~{wwy{{zyxvvwx{~{z|{ywtstwzyxy{}~xutsty}}zxz~|vqpqrw|}}}|zzzz{{{z{ztnmoqruy|{y|}xvwz{zyzyusstw}~|z{}{yyy|~|{{{}{xx|}|||vqponmorttuy~~}{zxy}}~{xyyxy~}}}vuuw{}{}}}{{|}~|vvvvwx{||}|wssrqsw{}}~{zzzyustwywvwvrponosxzzx{}|}~|wttxyxy|~}zywtwz{zvvyz{z{}~~}|xspolmrvxxw|~~}zyz|||||xsrsuy}|uqpsusppsx|}~}yvyzyz{{{yz}}{yvtx{{||zwwz}~{{~|{y}{urppsxyxuy~|y|{xwy{{{{wqqtuvy|}}~~yx{~{vv{|}}||~~~}zxx{{wvx|~zvussuwwsnou{~}zz|}~}}~zyy}yvwxz~~{{~|}}zy|~~~yvvz|ywy}|{zxy|}xw|~|xwwvxzzwux||~|uqquxxwwrmnpqsvxyxux}}yvvxysmmqx}}~~}~~{wx~~yuuwy}}~~}vuutstuusrv|zwx|~}{{wtuwvvz~}{zxwuokkotutwyvsuvw||y|{{}}~}{{xuttxzwttw}}{}}}~|yy{zxux|~|}}~{utw{|zyzvsttstz}}zx}zvuwz{}}z|}}{z}}xsruz}}~}wtvxwx{}|wuwxwutwzz|{{~{vuy||{~~{z{ywz}||~~{z||||yy{xsrsw{~}yz}~~}z}|{}~}~|~~{}}{{{wy|~~}}wuvxwuvvqmmmmpv{{wu{}yz}~ywyzvqooqrsvyvuy|~~}|yy}~{zyvv||yz~|zzxwz}}zsrw{|zxy{~~~}|}ztqrsu{~z}vpmoqqrtqlnrsty~~{|{z}ytruywqoqwyxx{{z}~|{}~}~yz~{xz}}~ywyzyyzvpprsuz|}{y|{wwz|{{{xuwyz|~~~xvvyywxzyuvvuv{|x|~xrrrsz}{|}zyy||zz{vqswx{}{{|~yuwz{}~|}ysrtxxwwyvuwxy|}z{{|{|{{~}xxz|~}~|zyvomoonpsuvtv}~{{{y{vqqtwurqojkprtz{xy}~~||}}}{}~|}}{yy|}z{~}wwyz{~~z|~zvtwxx}zuuvssx|~}||{{{xrqpljlmlqx{|yy}}}ywyxsooruuvxwrpsvy~}{||z|~}}}{zvqqqopu{}|y{~|}~~~|||xstuuy~}~{z{~~|{yrpsvvy}~}zz||{wuy{{}}zz}zvw{}}ysrsrqv}}}}wvvuw}{y|}xvvxywxysnpstw}~|yxz||}|}|yz{tqpnotwxtory}~{z{}}{xwyywvvpiijjmuz||}}{|~~xw{||~ytsv|{vux~~zyzxw{{}~ywvuy}~{yywx|}|xu{~~zqjkkknsvwvu{~yxy~~vqprvwuutpoqqqu|||~~~~{z}~}~{tstrruwwutz~~}~}~xtvwvw|~||xx|yutsrv|{y~{{}}~}{{xttv{}zxx{~~}~xtussvyzywy}zyzxwy|~~|~}}vuvz|zxxupqsqqv{}{y~}ywy{xuw{|}~~~~|}{zxuuwxxuswyyvtuyz{{z||{}|zysoonklpstssz|}zwxxx|{vuxxsqrvz|}~xwy{{~z|~|{~}~|xwz{z||~zy}}}zwupnptvtpsz~{y{~|yy|zvttwwvuwuomooquyzyw||}zyz{{}}xwz~yyyvuy|{wrsy|}|{}~~{{|zxwvw|}z~~}zz|~~}xxzyy{||{y~}{}}{ytruyvqqu{~}}~zvxywwz||yux}}|}}}}{|{w|~ywwz{z{ztopqqty{zwv||yy}~xrpsx{}|{~~~{yz|z|~wty||ytrssv}||~zyz~~wssrqsvurnouz{zy|~}~xwyyz}~~zroptwwwxwtuwwy~~}~~~}yvvy|yvvx|~{xz{}z{|zz|{xsqvz{ywxzz{ysruyyxwupmppprvyyvu{|xx|~}zwwz}~yxyyz~|xz}}yutvy{}}}{{~|y{|{z}}|zz|}}}xvyyy||z~}}|}}zyzysopsvwx{{vtvwy}~yy~~zwy{{~~}}{{~|zzuqrrppuyzxvz~{z|~~yutvwvtvwutwy{~}~ywx{}}~zwwwtvz{|~|z{ywx}{vwxvuy{zvrsvwvttvwy{wwwwz~}~yvvvutvupnqsuy~~}}~}yvx{ytrsx|||}zx{|z~~~~}|}}xz}}zwuvwy{zyzywxwqmmnnrwyxuu{|y{~}{}~}wwz|~}zz}~}||zwxzyy}{}{wutty||~~~zuuvx{}z}}~wstvw{{y{xsqsvvuutppstuy~~~{zyxz}~|{{|zsqrrruwwusw}|{||{{wwy{yxvplmprv{ywy|~}}~{y{|}}{yy}}{zyvuw{}{yy{}~}~~zvvvvy}~|yw{~|xsqssv{|yyyxz|~~}~~zwtnlnoosx||y{~}}~{vssvxxxzytrtux~~~|}~}yyyxz~~{{}}}{vpoonnqtwvtw{~~|zzzz|wvwwx~}|}{utuvy~~{~}}|z{}}|}~|z{|z{~|vuvvvy}~}|wvvtuy}~}|{|}{wvvxxvvvrnmmnrw{|{z~}}|{xx{~||~}~~}xwustwzyvsvy{{zz{{|~}~}{{ytonllotyzyz~}}~~}}|wtuxy}zurswxussx|~~~|wvwxwy|}}{z~}zxvtuz}}~~|z{~~}{{}~yz|tpnmnrvwvty{z}~yuuwxxxxtpqssuy|~{{||~~~||~{zz}~{z{~ytsqqruvtpqv{}|yy{{}~~yvvwx{~~{{~~yxxvvy}}~~~}}|xuvy|{yy|}yxxww{}|yw|~~yxxwy{|{xy~~zutwzzyxuomnooquwxvw}}yxy{yusv{~}~~}{{|}{wux||yvuvxz|}}vrrqpqrtsrsy~||~|wuvvvy~~{xxxtpoquwxy{yuuvvy}{y{}{|{{}}||{xvvz}{yy|}}~}zzwttvvusty|~}{|}~~|xvwz{yxxuqppprwz{yx{}yxz}}}~}zz}~zvvy}zwwwvvxyxtrtwwwvwyy|~~~z{~|zyxwz~|}~~~zyyz{~|z~~~~yvwywssuy}~{wxzz{}~{y{~~}}~~~}{|~zx{}yxyzyxywrnnnnqvxvsty}~}{}}zz|{wsrsvxz||yx{}~}}|}{z}~}zxvuuy~{z}}xvuttwywsprwzzyy{~zvuvwy}~~||yspprtuuuqprtuw{~~}}||{}{wuvyzvstx{}~|||}|||~~zuux{{ywxz{~~xvwzzzyvqnopqtwxxwx|}yy{}~~~}zz|}~~~ywwy{{|}|xwwwx{~}zwx{|zurrtvz~|~~||}~~|wwyz{}~}{~~~{wwxy{~~~}~~ztqruwwxyxuuvwy~|}}zz{|~~}|z|~}~~}{ytpoppprtutsvz|{zyyz||wuuwwvttqprtvz{z|~}}|zzyz|~}}~~|{|{z{}{xxxyy{|{xvxyyvttvwzzwwwvx{~~|||yyxvssqnlmnpty{{z{}}|~|yxyxtrrtwxzzyuux{~}}zxxxx}}}~}{zxuqoonptwxvux|~|{|~~}}|yuuwy||zz|}|{yustvwz|~}{{}}zxvtty|~}}~|yz}~{wuuuvz~||~yvuvw{~~}~~zwuvwvvvrnortvz}~~~}||~}~~~~|{||wrqppruvtqqvz{zxxyz|{yyyyxwsmkkmpuz}~~}|}~{yz{}~}~{xvx{}{xy{~~~}zwwwwy}~zy|~~|wuttw|~yxxxz||{y{|xrljklnqtvwvy~~||~~ytrsuwvvvsqqrtw}}{{{}~}~yspppprtutsv{}}{{{||~yuuuvw{|{}~~|xtsstw|~~{z}|{{{|~~|{{zxxz}}{z{}~yuuuuwz{{z|~zxxwwy{}}|}yxyzzywvronnnquy{zz~~{{}~}{|~}|}~xwuttvwvtsvwxwvwxy{~~}~~|zwronllnrtuux~|xvvwz~}ywwyxutvy|}~~zvvwxy{}}{{}}{zyxz}~~~{{|~||~~|z{~ztqnmnqssrrv{~}||~|{}~{xvvvwvvuqnnpqtwzz{}~~}|~}{}zwusstvvtqquy{zyyz|zwuuwy|}|{~}|}|xvvvvxz{{z|}}}}~yvuwyyvvx{~~~}{xwwwwy{{zwx|~~~}{zz|~}zx{}zyz{{{yupnnopsuuuux}|{}~{wuvz}~||}}~~~|||}{wuvy{yvtttw{}}~~~~ytqqpqssrposx{|}~{wwwxy|~}}|wsqsvxxyywuuvvy||{}~|||~}{yxy{|{zz}~}||}~{zywwvusqquxxxxyz{~zwwxzzywtpnnnoquwwuw{~||~~~|z{|~ywwwxyyxustvvuttuwz~~{yyxxyzzxxz~~zwvvvwzzyvux|~|{||}}|yvvwy{|}{wsstuwyywuuxzzyxy{}~}}}}zxxz{{{{}}{wrpnmlnppomosvwwwy||||{{{{xuuuwy|}}||||}}~~{wvwxwvttttw{~~xutrpqrrolknpqqrtvzzwutuwyxvuw|}{zzyxvrnmnpqtuuuuy{|{yyz|~~~{{|~{{|}~}|~~|{{{|zyyzzytporssrqrtx}~~}|ztolkklnoommqtvvvx{~zwxyz|~~~}{wuuuuvxxvssvwwtrqqty}xvvwxz{yvtwz}|{{|~zutttvxxxvvxzzzyz{}{yyzzyxurpppqsvxwuuwzzyxwwy}~}}}~{{~~{yyz}yspoooppommosutssuvy~{wrooprtwz{zz}}zyyz|~}~}ywwxz~}xutttvwvsqqsusqopqtx~|yxwwwxyxwx{}}}}}{xsnlkkmorsrqtx|}|{z{||z{||||{wsrsuy~~~~|||}~~|zyz{zwtsstv{~ztpnmlmoponmpsuuttuw|~yuttux{}|{|~zuqqrtvxxwuvy{{ywvvvx|~xuuuuwy{zxxz||{{{|~{wuttvxywvw{~~|zyz|~~}|zxsnkklnqstssvz}|zxxy{~}{{|}~~}}~xusqqstsqnortutsstv{}xrnllnqtuttx}{vuuvx{|}}}~~~|}}|}|xtssstvwwvtuxyxvtrrtx~{zyz||zwvx|~~|{{}wplkkmoponorvxxxy{}||}}}{wronopruxyz|}|||~|||yxx{~xrpooqrqnlmqtusrrtvzzvttuwxxxxz~{urqpqsvwvuwz||{yxy{}|~~|wtstuxyxvvy~~{zz{{yxxyzywuvy|}|{{|}~xrmkkkmoppoptxz{zzz{~}zyyz}}~~ywvvwwusqsuvurqqsv{ytqpoopppooswz{||}{vtstvy{zxy}|yy{}~ztqopruwwusuy|{ywvwx{~|}~}~~~{yz}~}{z{|{wtrqqqpmmosuutstw|}xsnllmpssrqsy~}zz{}~|~~~~~~|~}xutttuuspnprtsrqqrv}{xwvxzzxuvy~~}}yusstvvusruy||zxxy|}|~~{z{~ytssuvxyxvuwz||{{z{}}|{|~~{xvx{}|zyy|}vpnmmoqpnkmquvutuw{~}zwwxz|~~}|~}|||}}{wtuxzxurqqt{~}wsrstvurnmptvuttvz~xvvvxzzxvw{~~zyz|~~|wroooqsvwvttxzzyxwwy~~{|~|{|~}~|}}zxy||{z{{zvqopsusqpqrv|~}vpnmnorsroorvyyyy{~~zxyz}}}~~~{{}zvttvx{zwsruwvspnoqv}~~~{zz{}}|zww{}}{yyz|{wvvwxzzwsswzzyxwwy{xx{}~}ztqpqtwzzwuvz||ywwx{~~}{|~}zxwy|{tqqqqstspmortsqppqu}~~zustux|~~{z|{yy{}z||xuttw{~|}|z|}xuvvwyzxtrsuvtqppqu}}zyyz|}|xvx|~}{yy{}ztnllmptvurrvz|zwuuvz~~}yxz}~yuux{}|{~~~~zwyzxurpopu|~wrpooruurnnsvwurrsw~yuuvy}~|~~}|~ytqrsvy{{yvwz|zwsqpqv|~|}}|~zxwx{}yz}~{xwx{{wvwy|}|xvy|}zwuuvz~{{}~~~zsnmnpswyxuuy}~{xwvwz|||~|yxx}ytrrsvxxtoptwvsonnpv}{soopsw{{yxz~~~ywwx{~~zxwy|z|~{z}yustux|~{wux{{xspoot{|zz{~|xy}|xwxyzqmllmqttrorwzzxvvvw}{xy|~~|vqopqu{~~~}}~}}wtrru|||wrqqrtvvsoptwvsqpprxyuuuvz~~{y}wqonpty{zvuy~|xvutw}}zy|~zz}zutuw{~{|}zyyy~{zyz|~{xz~~{xwvx~~|uolklotwvrrv|~}ywvwz~yxy{~}}|wuuuwzzwssvxwsqpopu|~|}vrpoptwxusv|}{{|~xuuvy~|{~}~z{|yx{~vqqrsw{}{ww|~{wutru{~{{~}}{z~~zyxy~ztpnorutqmouxxusstw~||~}wpmmnpuxyww|}||}}zxy{y{|}}wussuxywqoswxurpppt|zwvwz}~{wx}~~xsqqqtwywtu{~~{xwww{|xwz~zwy}}wtttuy}~{wy{zyz~}|}|xy~|yxyz~{sonmnrttpnqwzywvwwy}zyxxz}}{yxy}}wsw{|ytqppryzxy~~~vtsrtwxvqoty{zwwxy|zxwvx|~zx}~xwy~~wrpppsx{zvty~}ywwvy~zxz~~{|~~|{yyz|}{ywwyyupnrvvtqppqu}~}}}uonmmptwupqw|~|}~{zz{~~|z|{xy}{wwvwz}|xssxzxtpppqu}~z{~}{z}{wx}|zz{|zwuttx{zuqsy}|yvvvx~|{}|wuw{~zsqqruz}}xuy~~{yzz|~{~~zyyx{~{utrprvwuomqvwuqqrsx}}{wwwx|{|~{{|}~xy}~}xutsrv}|xx|~ywzzwwuvz||vqrvxwtrrsv~|zyz~yvz|{|~}{|}uooopsxzxtsy}}zwvwwz{xzzww|}{}}}{zy~}}zstxywrnnnpw}~|sqpopuwupnrwywttwy|~yzzz}~~|xx|~xvvvv{|vv{}{vrpppu}}yy}}|~|||~}x{~ywxxzzxxwy}~|vtx{{xuuvvy~}wvy}~}~zspqpqu{}zuv|{xwwx~~}yyxy}vuutvyzxroswwtonoor{~}xtuuuy~zy|yyyz|}|wvuuz|xx|~ywx}~xvvvx|~ytw{{xrpppqy~}|~{x|~zxyy|}uponnqwywrqw|}zvuuuy}~zww{~}vtuvy~~}|||uqqpou||z|~}vtsqrvxxsnqvxvrpqqt}ywwwz}{~|~wrrstx}}xw|{vttrsz~}ywz|xy~|yzzz}|}yxxw{}{yx|}ww|~yttttz||~~~ypmnmotyzwru|~zvwww|}|}}~}{zywvuvz}}wqtxywroonov}~}usrqtz}}yv{|{}~~xwxwz}~|{yyzwx~|wvy~xstttw}zvz~{vsrpqx}|~}}z~zxyxzzsqonquwvqouyzxttvuw~{y{}upqqqu{}|~~~~{wvsu|}ywz}}{utssvz{wqpuyxtpopps|~yywwz~yz~urrppu{}{vw}|xwwvz{wwzywy}ywwvw}z}~zzzy~~~||}xzzwwvv{~~}yqonlmrvwsosy|{xvwww~~{zzy|zzxwz~}vty}|wrqqpry}}|xx{~~zvvtsuy{ystz~|yz{z|yxvv{~y{}|{}~yvw|{sqqprx}}yuyyvvvtyzwx~~}|{zzyyzxurswxvpmswxuqqrrv~}}}}tppooty{ytw~~~~||xx}zy|zyxuv{}|vqtxywqopoow}~{z}|{xvx}~|vsy~}yyz{~wsrposwxupry||xuvwvz}wvy}xvw}}vvwwx~z~~~~}}|~{vtqpswwtnnuxxursuty{z~|yy~}vtusty}~{vz}{||{}yy~~yx{}xxwuv{}{uquyzwqoonov|||}{vtv}|z{{zyx{}vu{}z{}}}}}vttssx|}ytx}~ywwvu{|vssx|xssv}~yyyxzzvz~~{urrrsz~ywy}}~xwusuwwsliorrnjjllox}|{~||wttrrvz|ytv}}~}|{|{ux||ysopoou{{|}{vstz}yx{~xxwuvyzxroswwtpoqqr{}}|wqqomosusljotvsppqqs|zxy~~xttx}~xtuuv{|||{xwz||wqqvxwroppqv{z~zwx|~}~yrppopuyyuqtz}}xvwww}|z}}wuw{~~zsrssuz}|wqtyzwrooonsyzz|{vssx}zutw~{{{z{|x{}yxyz{|vuttv{}|wty~|wvwwxzvvz|wrqsxz{||vrstux~zw||wutssz~ywx~{xx|~yyxvx|}zsoqtsojhhhjrxy{|{xxz~{{~|vvtsvz|zusy}|yy|}~z{{{}{{vtsqrz~}~}yutv{|wtuzyvvuvy~~{trwyytpooos|~~~wsrpptwwsmnsutolmnot|~zy}zvuy|||}yrpqqsx}~|y{~~}{|ztw{{xsppppw~~||{yz~}vonnmpuwwspuy{yuuvvxzwy}~}~|uqqqpty|{vuy||xtrqpry}|||xtrtz{vssw{}}~xvwwx|{z}xwww{zwwuvz}}zux}~zxxxx}|{~|urswyxxxrllmmqw|}zw{{xxwx~{xy~}xwz~|wwwwz~xuy|zuolkjkrvwxywssv}|yy}xtuttw{{ytty||yvvwx|zxxx{|}zyxw|}xuvz}yusvz}}~wrrrsv{}|wuy||xsrrqrz|{zvutruxyvqptwvrnmmmqz~|yy}{xy|~|{{volllntyzwtw~~|}}~}{z}~zutsru|}{{~{|zromklpturnpvyxusstv|~~~wponnqvyyusx}}xvvuu{{vssxzuqpsxyyzxrnoprv|~{z|{{y{{yww{~}yuw}~zxyyz~{wwzzyywpihhhkptusrw}~{zzz{}{|~yx{xtuuvy~zx||wtrpqwzzyyurqtyzvuv{~vsrqquzzxrsx{{xuuuv{~{yxwx}~{~~~}}|xx|{vtvz{{{{upoooqvyyurw|}{wttst{|z|~xvuuwz{ysquyyvrpqprx}~}yxz|yx{~~~yqlkjjmqsropv{|{yz|||}~zyxx|~{z~~||zronlmoqqmjlrutrprstz{sponosvwtqtz}}zyyyy|xwz|xrpruwwwwqkjjjmswxutx~}|||}~||~}xuy}~|yxxy{~|~~|xqjhgfhlonkjouxxwwxy||{}xsrqrv{}|yx|{yyxy~~zurswyurqty|}~|vqppprvwvrquyywtttuw~||zyxz~}yx~~|xwy{|{{xplllmptusopuyywutuux||}}}yxwwy||yttxzzvssssw~}yy}{xy|~yrnljjmpolhjptvtsuwz~}|}~~}|{{~~}{}zsqpnorsrlikoqollmnqy~wtrpruvtpotxzyvwxz}~~|vtuwxwwtlhgghkopomntxzyxyz{~xy|~}ywwwy~xpljhikmlheinppnnqsv~ytrrqswyyvuy~|{|{~|yy||wsrtwxyywrnnnnquvtonsvwtqqqrw||~|}~}{z{}~zwy~}|}~|}~}ztnljjkorqnlptutqpqru|~{zyy{~~{vvz}|yvuuvz~}~zz}~yrnmllnonjfglnnlkmorz~}|}}{~}{{|~~~~~xtrqqsutpllpqokiiikpx}~{ywvxxwroquvvtstvy~||}|zyunigfehlnlhglqsrpqruy}}~zxwwx}~vromlnomiegkmlihiknw|vtssuxywsrv{}{yyz{~ywxzzyxunjjklpstrnnrutqonnosz~|xwwx~~{yy|~}yuw|~}zyz{~yqnlklnpokjmrsronooqw~~|~}|||}zxz}}{xvvvy~}vqonmorrojhkmmjgfghmv|~}|}{{~||}~{zyy|~|}yvuttvxwsnorsrnkihinuxy{{yy{~}}}xssvwurpprt{}umihfgjlkhehlnmkklmpw~|{{|~}|yxxz|xvttutpkhjlmjgffgjqx{~~~}{zyz|}{vtvyzxvvwx|}yqkihhkoqqnmptusommmouz|}~}|}|zxxz}}~~{vux{{ywvwx||vtqpqrrojimpqonmnosz~~{{~}|||}}}|ywww{xsqpprtspllopokhgfgkquwz{{{~~}}|}~{zz{~{yy|}|yvy~~}}~zxwwxz{ytqsuvspmmlmrvxxxwtsu{~}|}~{|}|xtrqpsy|uqmkkmmjfehlmkihijnu{}~~}yxwx|~{|}zyyy}~}|}~{uonoomigffhnuxyzzxx{~}~{y{~~{xuuvyyrolklnomjkostsppppsx{||{xuvz||}~}|{wwyzyusssv|}yxwwyxupmnppnlklmpw||z|~{z|~{z{|}|{|{xvuvwvrnnqsroljjjnsvvvusrty~}~|z|~|||}|wux{|zyyz{|yxwx{~~{wwyzxuqonosy{{{yvttwzyvuw|~zxvvz~~{xvusoigiklkihijntz|}}{xxzzwvuwz{zwy}}}}zyyy~~}~}yyzxtokihintwxyywvx}||~~~~}}{zz|}ywttusokilpqpoopqv|~{wvwyywvx}~zyyz}}~~~~}}}zvsrrsx~|zyy{|{wtuvvtpmkkmsz}}|~|{{}~~}yuuvw{~}~~ztrtutronmmpuyzzyvrqsvwutw|~zy|~~}|{|}{y{|{xuuuw}xtsstwz{zxz~{wussvz}~~}{xx{}|xuvxz{||yvvx{~|}~wqopomigghkqx{}~}{z{}}zy{~{yxxyzwtrtx{{{{~}zz|}{zz|~{zzz|}|~~zvroosvwwwvuux|~}{{}|xxxz~~~~~~~ztqrrrollmnry}}~zustwy{}}ywwxxz}~|yy|}|~}~{wutv{}}|{z{||yuuxzzxusrqswz{|||{{~~zsoooquy{{z|}|}}zvrpopsy|}}|zwx{|zvsrtwy{~}{|}~}yy{|{xvvwz}{{|~zvttuy{vtsstvusruy|}}||{|}{z{~}zyz|}|{ytonnptz~~~{upljikqvy{|{z{~|{|}~~~|xwxyz|}|ytsuvvtssux~|vsrsuy}}}}|yxxy{}|zxz~~||{|~}{xtrtw{{yy{~|vtttvy|}{{}{|}{wspnmpv|~~|{{ywvrnlmosw{|zxx{}}{yyz}|wtuvy~~|}}{|~~~}~~|wuuwxwvuuux}~{xxz~{uqonoqrrqsx}}zwvx{}~~|{{~|yyyzyxvqmmosx}~~|yvttuz{yxxz|~}{{|z{}zxwwxvsooruuutvx{~|}|z{}}xrommnprsstx~|xtsvxxxwwvwz|upnoquz|{xwyzyurppqu|ytrqqsuuttw}}}~}zxxxy{||yvwz|{zyyz}}ywxywttw{~|xvuuvxywutw|~~}zxwx{}~~~}|}}woigfgkpsttvz}}{yxxy}zurqrsvyzyxz|}}||~~}~{wwxxurpopsy~}~}zz}{xwuuutqmlnruvwy|{yyz|~{z|~||~}yrmjiimqtvwz|zxwy}~zyxy{||yvwy|}}}}zzz{|}{wsrsssqoopsy}zz|}~~zurqpqrsromoswyz|~|wwy|{wtux{|{{~~xtrpopqrqrvz|{yvtssw{~{wtssuutpoqtwxy{~|wsqrtw{|{ywy{|zxvvwz}wttvxz{{wutuwy{{yvtvxxxwwy|}{|~~}{|~xsomkkjhfhntxzyyxy{{urpqsuvvttx{|||}}|~}xuuvy|~~}yvsqpsw{}}{{}~|zyyz{|{wsqqrqonoqu|~xtsux|~~}~|z{}|vsqoooonkjmsx|~~}{{~|yxy{||zxxz|{xwvx{{xvvxz||zxxzywsponpuz~~|zvrqqqsuutrpqttsrrsv|zvssvz~}|zwuvx|~{yxxxxvrnlnrtuuvxy{~|z{}}zyxxvsqqsutsrrsv|}vronoqsuuux{}}{xwvwz~{ywtqonpruy||zyz}}|xvuux~~||}||~|zyxwvtojghijkmquy~}yvttutrqrvyzzyyz|~~{vsrrtvyyyz}|ywwz|}||{yy{{vsstwy|}|zxyzyvsponqv}~{xwvutw|~||}}}}zvtsssuvtqnmoppoqtx~~}~~}zy{~~}}}}{xwz|}|zyxxy}|zyxxyxwuux{|{xvttuy{|}||{}zsnmmortusqruwwusrsty~|{zxvtuz~ywwxz{{xwwyz}}zwwvtqnmnqw~{z{|}{z{~}xtstvvutsstx}|xutsssqnloswzzz{{|~}umihilqtvvwz~~|{{{~~zy{~{yyz{|}|yussrplhfgjqz}}}}}|ytqqsuvvvxy|~zvtsstvwvtstx{}~}zxxz{zyy|~wrpoqtwyxx{}~}{xwvwy|}}}}~~wssuxy{}|xspoprtvwussuvvsqonos{~zxyz{{{zxwy{~{yz||{zzz||zzz{}}|yutvwwvvwxz}|zxy{~~}}ytpnnooooruwxwvvwy|}ywwxz|{wrnmnquy|}|{}~zvsqpsw{~zxxz|}~~{zz|}{zyvtsstw|{yxxxyxvroopqpprtx}~}}}xtqmkkkkkmrx{}}}}|{|~ytrsux{||zyz{zxurommpsvy}}yvuuwz~~{yxxvtsrsv{ytqqrtvwvttvwxwvvy|~}}|yvuvxz|}|zyyxwvtrpoqvz|}|{{|~~{z|{vssuyxqmlmorssrtvyyxwvvvy{}}~}|zywsnllmqvz}~|zyz|{wvwy|~~}{|||zwtssv{~|}}{yyz|~~||}}|zwrlikortttuvy~~}~~yvvyzrmjjlortux{~}}~|zxy|~||{zyvsppqtx|zvtux}{yxyzzxuuwwurpnnqv}~~~{wtrstvwuqlggjnqsvy|}}~}{}~yusstuuuwz}~}zyxxz|}|zwutw||wsqqqsuuvvy}|xutux}~xtrrssssuxzzxwvvx}|yxxxxwtqnnorvz|{vrqqstvxz|~{{~{xx|}xtqomllnsvwwwwxz~~{|zsnkiijlmnorw}~~}zyyyyyz}~{yxy|~{yyz{|{xurrsvz}~|xuspmllnquz}zy{~|yuspnkjkpuz|}}~~{yz{|~}xrnllnprsssv{}zwuvxzzywutuwz|}|wrommnpsttssrpljilpw~|||ytqpsvyzz{{|~|zyyxxz{vsqqqrqomnqtwy{|}}{vqoptwyyzz{}|zxuplihhjloqsvz||xtqprw~~~~~~}wplkmopqsuw{~|~{snkjjkjighkoruy}|yy{{wvx{}~~}~}{yurpoopqsttux|~}xsnklqx}~~|{{||{{}}|}}~}ytommmoqsw{zvux|}wrommnoonnpsuwx{~||~|zyyyxxxy|~||~ytqonnnmljknsvwurolmrx~}wssux|}||}~~|z{}{ywvtstvy~{wvwy~|yvutsqonoppooprv|}zy{~zwussstvy~zrmjhhijjihimrwz||zxxz}{urqsx~~{xsnkklpv}~~~|xuroliggijkkkmpv~{vsrtw|~|yyz|~ysommnpqponpsuwy{{{zyxwxy{}|xwwz~~{zyz}~|{{|}|{zzzwsollou}~zwutstuvvtspmkknpqqqrtw}|zyy{}}ywwy}~~~xtrqqqomjjkllmorux{|{yyz}}wsppruwy{~~}|~}yxxy{|}}|wttw|}zvsqrvz}~}zvrpqrqponmosx~~|{zzy{~|vsrtz}vqmlkjhgfgiklmosx~~}~yvsqqrtvy~|wrpqtx|ysqsvz}|xsmkkkjiiijnsx~|zxwvtsruz}{}}|}~~zwsqpponmnpqrqqqsw}~yvvz~}{zywvx|~~~}{ywwx{}}|{xvuvy||slhhkpuwvspoooooopsv{~}||}~~|zxy~~~{yvsommnnmkiijnt{}yy|~|zxtpmmqv{~~|{zywvwz~}vpljlpv{}|{zxusqppqsvyz{|}|xwwy|~~~~~}|zwsojgghjjjijkou|{yxxxxwtpoqv{~}~~{yxy||wspoqtvxyywsoliijnrvxz{|}|||||{xusstvx{~{wtsuwyzxuqnmnpqqqqqsvz~|yww{}}~|xvvxy||yxxyyyyz|}|}~ytpljhhjnswxvronorw{~|xvuwy{}~~}|}}}||~|xuux{~yusrqpomllnpsvxz}}zz}|xusqppqtx}~yy{~}ywwxyzz|~}ywutromklov||yutuxz||{zyyz}|zz{~~{xvw{~yvvwz}}{vspnljihiknrvy{}}}{yxxxyyxwvvutstv{{vtw{}zy{|~~~}|zuplmqwz{yuqppsuwxxxxz|~zxyz|}}|zz{{zwutuyxromnquwxwvutrpopqtx|~~~}}}yvvx{}|{zyz{}~~~~|yvvy~~{|}zxwvx{}|{zxtojffimrvwwvwx{|~~}vrpqtwyyz|~}|~|wtrrtwz|~~{vsppqsvxxxvuux|~|{|~~}||}|yvrposy{wuwz}}~~}|zxwxz~}ywvvwxwtqnmmosw|}|{{||{zyz|}ywwx{|}~|{|}zxvuuuwz{{xtolklptwyyyyz||zxxyyyzyxwuuwy{{ywvux}|xuuvy}~{xwz~}|}}}{xvspoquy}~{ywvwy{||{{}|yxxwwxz|~}|{zz{}}yvsqnlloty{{yvttvy}~|vqnnqtxz{{zz|~~}}|z{~~{zz}~~~}|zxvusokhhlrz~}~|xurpopsw{~}{zyxwtrqty~|zz{||{zyxxyyxxz}~wrqsx|~}}~~}|{zzz{{||uqrv{}{{|}{yxxxwwvvvxxwtqopt|~~~|zyyyyyyzz|~}{xvuw{{wsrsvxz{{yxwwwxxxxy{}~~}~xropsvyywvwwxyyy{|~~|{|~ztqsx~~zxxwwxyz|}~~}|}~zurqsy~{zzzzyyz|}}}||}zvtuwxyz{|~~}|ytpnmnoruy|~}|}zsmiilqtvxy|~}{z{~{z{~}{z{}~|zz{{zxuronotz}ywvwz}~{uqopqsvx{~|zyyyz{||zxvuuuuvy}~|{{||{xwvwxz}}zvrqqtwz|~~~|{~{wtsux|}wsrsvxyyxvuvxyzzzyxxy{~~|{{{zxuqnnosw|}{yxxxy{~|zyz|}|zxutsuy~|yyz{||{||}~~zuqoopsvyzzyxy{~{xwwyz|}}}}{wutx}yrmlnrvy{||}~~||~}yxxyzzywtsstw{|xvtuvz~}zz{}~}{yxwuspnnpu|~|zxwwxxvrnihjnty{}~~zwvvxz|~}zz}ytstw{}~~~~~}|{{{|}}{xwx||yusrrsuwyz{|zwsqpquz{uqqrtvwwwxyzyxvuvx~~{yyxxwvtrqrtx{|zvqopuz}}}~~|wssw}ytqpqrstvwyyyyyz|~{yuqnlkklnpsvz~~{yxzyusuwz|}~~{xwwy}|zyz{|}|{xvuw{~|vqnnpsuwy{}}zyxwvuwz}|ywz|vqnlmnpsw{~||}{xvsqoopqrtuvy}{xxz}~zxxyyyy{{{zxvtstvy}}yurppqtwxvsolklnrw{~{yxxwvvwz~~|yvtssvz}~|zy{}yvtssssrppquy|}}{xwwy||wsqooprvxzzzzz{}~|zyxurnlklnquxz{zxussux}}|}~||}~}}ytolmosvxyyz|{upnllllkjjlotx|}||}~}zwtstwz~~|{{zyvtrrrsuwy{}~~{vqnnqw}}zwuuvwxz|~}}|{ytoljlptx{~}{}|vqnmmnppppqsvz}~}~yutvxyzyyyz{}~}|||~{wtrqppoopqtwywsolmpw~|yxyz|}~}{xvvxz{}~|{|~~yussuwy|~~zyz~zwutttrqppqrstvy}~~~{z|zupnoprtvxz~}xsomkkkkklloty}~{wvw||xutuy}~~~}xtqoooqtx|{vrpnlkiijklnorv|}xsqqty}~{wuuvwy{~}ytqppqqrrrrsvz~~{wuvx||yxz}}{zyxwwx{}{zz{||zxvtqonnptz}{z|}~}{xurponmmnprstux{~zwvvy}~{xvvvx{~~}~{wussrqpnlmortwyyywwwy{~xspqsvyz{{{{{zzz{~}ywwwy{}~~~|yvuvy~|zyy{}|ywtrqrssrqqrty~zxwwy{|~~}zvrooquz{upnllkjiijloruy}}wspopsw{~~~{vrppsx}|{|~~zuqmkklllllnqv|}xurqppqsw|~{xvw{}~{vsqppppppqsuvxz}|z{}}zwvwxy{~~|z{|~|{zyxxy{|{yvsqruyztqprvyzyvronopqrstvy}}}}|zxwvvvuvw{~zyy|}|}}zxvtqpooooooqtx}~{{~|yurpnoqty|}~}}}}zxwwwwwx{~||}ytporw||ywvutssstvx{~~}{ywtstx|~{wuvx{~{wspmkiijllmnpty~{ywurpnnpu{~}}~}}}}{zzz{}~yutux|~~|yvsqomlmoruy|}zywvusqnlmpty}}|||{{{{{ywurpopqstttuw{~}}}}zwutux{~~{ywxyz{||}}}~}}}~xsnlmoruwxxwusrrsux|~|zxvuuuvwwvutsuwz}~}|{{|}}yvtssrqpppquy}|xsommoqux{~~|{|}~~}{yvuvwy{}{wsqonpsw{|ywwxz|}~}}~|{yyz{|}}{ywvuuuvx|}}}}{{}~~zuqonmlllmorvz}|{zyxvspooqsvz~yvtvy}~~~{{|}{xusstvz~}zwtrstwxzz{|}ywvvwwvtrqppooprv|~yurqrtwz{zxvutttstuwy}~zz{}~}~~~|zyxwvvx{|yy|~}|{zyz{}|yuqmjjlqvy{{yxxy|~{uqoopqsssttvvwvvx{~{xtrrtw{~|ywuttuvyz{|~~}~}{ywtronosx{vstvy{{{zyyyyyz|}{yxwurommpuz~~|wutuvwxyyyzzzxvuuw{}ywvvxz{|||{ywtqoopsvy{}~}}||{{zyxwwvvtsrrtyztqoptw{}~|{||yusrsvy|~~}|{z{|}{xvuttsrsstsrqpprw|~ytqonnpqsvy{|{yxwwy{~{wuttvwy{|}}}~~|zxxz~{xwwy|~~}|}}zvromllnrw{|wspnmmmoqsuwwxxy{~~~~}{xusqqqqrtw{}{|}}~}|||}|ywxz|~{yvtstw{}xtqpqswz|}|||}}|{zzyxwusrqqqruz}}}~~{ywutssuwy{{{zzz{|~~~~|zyxwvtttwz}~~}{yxxyz{{{|}|wuuvwyyyxxxyzzyxxwxz|}zwtpnnpu{~{zzz{||||}~~}|{yvttvz~~~~}}}~{wtrqrssttttuwyz|}}zxvtrpnlkmptx{}~~zsommoruwxz|~}yutvz~~}{zxvspnmot{~|yuqmllnpqsuwz}~|zwusrrrrqpooprvy}~~~~}xussuwz{}~~~~~}|{{|~}wspoqsvy|~}zxwwxyyyxwwwxxxvustvz~}||{zxxxz|}}|zwuttuvwyz|~|zyxwxyyyywutttuvxz}~}}~{vtrrrsuvxzzzz{|~~}}}}|yvsqopruz{vsqqruwz{|}~}{zyz}~}|||||{{{{}{xvussrsuwz|}~}}}~}zxwwwvurpnmmmnorv{|xsolkkmptx{}}||}~|zxwxz~}yvvwy{}~~~~~~~}{ywvuvwy|~|zzz{}~}|ywurponoqty}{uqpoopppooopqrsux|}|||}}~~~~}|zwtrqruy}}}}~~|xtqpquzyusrstuuuvwxyzzzz{|}~~{xtrqqrtwyz{||{zxwwwz}yusrsuvvvwwwwwvuuwz~~~~|wrpoqsuwyz|~}||{{zz{{ywtrrtz|vqnmnoqsux{~~|zwuttuvx{}}zwvvwz|~~zxvvuutsssrqpoopsw}}|||}}|ytplkloqux{}||{|||}|zz|}ywuttuvxz}}{z{~}{xwwwwxxyz|}}|zwuttvy|~|wsqonmmnprsssstvy~}|{ywuuvxz|~}{xutttvy|}{{}~{xvwy|~zwtqppqsuxyz{|}~yurqpppqrsvy}~}}~}~}zwusrrstvxyyyxxyz|~}}{zyyy{}~{xurqrtw{~|{z{|}~~~|{{{|~~{xurommnqux{}}yusssstuvwy}~}}}~~}}}~zwtssttuttsstvwy{}|zxwwxyz{{{zxurpopsx}~~~~}~~~~~}|{{|~}{xusstvx{|~~}|}~{yxwvvuuuwy{}~~}}}~{wspnnpqrstuwy{}|yusrrrtuwy{}~}zwvvx|~|{zyyz{}}|}{wsqqqrtvxz}}yvtsqpooqsuxz}~}{yxwy{}~zwtsstuvwyz|~|ywuuuvwxz{~~zwuuw{~~|{{|~~~~~~~|yvsqppqrux{}}}zwvttsrstvxz}~~~~~}}}}|{yxxy{~|ywvuuuuvxz{||{{|}{yxwvvvvwxz}~~}zxvuwy|~{wuuvx{|}}}}~~~|zxwvuuwy|}{z{}~|zxvuuvvwxy{}~|zxxy{~}{xusrqrsux{}~{xutsrrrrsvy|~}}~{wtrrtwz}~~}{xusrsux|~{xusrrrsstvy|~|yvtsstvy{}~~~|zxvvvx{~~zxwvvuuuvxz}}|||~}zwvvwy{}~~}|{yvtsrtw{}{zzz|}~|zwutuuvwwy{~~}|||||zxvutttvx{~}zxwwy{|}~}}}}}}~~~|zxwvuuuvxz{}}||}{xussstvxz}~~}{yxxz}|zxwwy|}{zyxxwwxy{~~}~~~~}{yxwvvvvxz||ywvvxz|}~}zxvtsrrstvxz}|yvtrrrstw{~~||}}zxwxy{}~{xwxz}~{yxwvuuuwz}~}{ywutsrrrrtw{}||}~~}~~|zywvuuvwyz|~}}}}{ywvutuvy|}{zzyz{}{wtstvy|~~~}|zyxxwxz|}|zywvutttsssstwz~~}}}}~~~}|{|}~~|yxwwwwwxy{~~~~~|ywurqqsux{~~~~~~~~~}yusrsux|~}|zzz{}~}{zxwwwwwvutttvx{~~}||}~~~~}zxvvuuuvwx{~}{zxvtrqqsux{~|zzz{|~~}||}~|ywuuuwy|~}{zyyz|}|zxvuuuttrqqqsuwz}~~}|{{zz{}~|zyyxxxxy{}~|{|}~~}|zxvuttvwy|}{zz{~}|}~zwusrrsuy|~}||~{xutssssssrrstuwy|~~~~~}}||{{zyxxz|~}|{zyxxy{}~||}~|zwutsssuwz}{xvwx{}~|ywutrrrtw{}ywuuuuuuuttuuuvwy|~~~~~~~~~}}{zyxy{}~|{yxxxy{~~}}~~~~}}}}||zxwvutssuwz~~yvttvx{~~}}}~~|{ywutstwz~{xvuuttssssssstuw{~~~~}{ywuuvwy{}~~}{{{{}~|zzzzz{{|}}}}|{zyxwvvvx{{xvuwy{~~~~~}{yvsrqrtx{~|xvtssrrrssttuuvwz~~}||||{ywvtttvwz|~~}}~|zyyyz{|~~~~}|{zywvutuw{~~zwutuvx{}~}~~}|{zywusrrtvy}~{ywvutsttuvvvvvwy|~}||||{zxwvuuvwxz|~~}}~|ywwwyz{||{{{{zyxwvvwy{~zwusstvx|~|{{|}~~~~~~~~}|zxvuutuwz}|zxvtssstttttuvxz}~~}|{zxvutttttuwz}|xuttuwyz{{|}}}}|{zyyz{}|ywutuwz}~}||}}~~~~~~~}|{ywvusssux|~{yvtsrrsttuuvwy{}}|{yxvuttsssttvx{~|xvtuvwyz{|}~~~}|{zyyz{|}~{wusstwz}~}|{{zzz{||||{zyxwvuttvy}}{xvutuuuvvwxyz|}~~|zywvvuuuutttvxz}zwutuuvxyz{|}}||{{|||||}~{xusrsux{~~|zyxwxyz{||||||{zyxvuvx|~{xwvuutuuvwxz{{|}~{ywvvuuttsrrsuwy|~|xutsstuvxz|}}~~~~~~}}~|ywuuuwy||zxwwxyz{||||||{zxwuuvx|}zxwuuttuvwy{|}}~|xvutttsssrrstvxz}|yvutttvxz|}~~~}||}~|ywuttvx{~{xvuvwxyyzz{{{{{zxxwxy{~~}}~}{zxwvvvxy{|}}}}}|ywuuuuutttttuvwy{~|yvtsstvxz{|}~~}}}}{ywutuwz}yvtttuvwyz{|}}}}|{{zz{|}~}}}~~|zxwvwxy{{||||}~~zxvuuttssssttuvwz}|yvsrrsuwy{|~~~~}{ywvvx{}ywuuuuvwxz{|}}}||{{{{{{|~}||}}~|zxwwxy{|||}}~~|ywutssrrssttuuwy|}zwuttuvxz|~~~}}}~~|ywvvx||ywutttuvwy{|||}}}}}}}||}~|{zz{|}~}{zz{{|}}}}}~~~~~~{ywuttsttuuuuvwx{~}ywuttuvxz}~}}~}{ywwy{~}zwutssstvxz{|}~~~}}}~~|{{{{|}~~}||||||||}}}}}}~|zwvttstttttuvwy||ywutttvx{~~}|}~}{zz{}}{xvutstuwyz|}~~}||}~}|{{{||}~~~}}|||}}~~~}}}~|zwussstttuuvwy{}~}|}~~|zwvuvwz}}|{{|}~}|{{|}|zwusssuvxyz|}~~}~~~|{zzzzz|}~}}}~~~}}||}}~~{xvuuuuuuvvwyz|}~}|}~|zwvvwy{~~}|||||}~~|||~}{xvtsstuvxz|~~~}~}|{zzz{|}~}}}}}|||||||}~~{ywvvuuuuvwxz{|}~~}||}}~|ywvwxz}~}|{zyyz|~~}}~~{ywuuuuvwy{}~}||~~}|{zz{|~~~~}}}||||||{{|}~{ywvuuuuvwyz{|}~~|{{{||}~}{zyy{|~}{zxwwxy|}}|}~}{ywvutuuwy|~~||}~}|{zz{{}~~}}|||{{zyyyz|~|zxwvvvwyz{||}}~~}|||||}~~|{{{{|}~|zxwvwxz|~~}~~|zxwvuuuwy|~}|||~~|{{{{|}~~}|||{{zzxxwxy{~~|zxwwwxz{{||||}}||{{{|}}|{{|}~|ywvuvwxz|}~~~}|zywvvwy{}}|{{{|}~}|||||}~~}||||{zyxwwxy{}~|yxwwxyz{{||}~~|{zyyz{}~~~~|zwutsstuwy|~}{zz{}~{ywuuvwyz|}~~~~~~|{zyxxxz{~~}{ywusrrstuwz|~~~}~~~~~~}}|||}~|yxxyz{|}~~~}{zzzz{||~~}|{zxwuttuvy{~}ywutuwyz||||{{{|~}{ywutssrqqrsvx{}~|zyxwwwwwwxy{}~}}||}~|zz{}}zxusqpprsuxz|~~~~~~}}}}|}}}~~~|{yxvusrstw{~}}}~~}||{{{{{{{|}~|zyxxxxxyz|~{yxvuuvwyz|~}{ywusqppoopruz~}zwuuvxy{|}zxwwwwwxz|~~}|||}}|zyxxy{~}{yvtrqppopqtwz}~}{{{{||||}~~}|||}|zxwwwxy{{{{{{|}||zzyzz{|~~~~}|{zzzzyyz}}yurqqrtvwy|}~~~~~{yvsqpppppqrtvy||zyyyxwvvwxxyz|~}~}{{}~}|yvsqppqrtux{~~|ywwwyz{{{|}~~}}}|zxusrqppqtx}~|{{{{zzyzzzyyy{|~~~}|{zzz{|~}|{zzxxxy{}|zxwvvusqqpppprtx}|yusrssuwz~|zyxxxxyz||}}~~|{zzzzz|~~~~~|{zyvspooppqqsvz}~{xvuvwyyz|}~~}}~~{yxvuuvwwwwwy{||{zyzzzz{|}{z{}}{z{~~|xtqooprtvy||ywtrpppppoprux{}}{yxxwvuvvuttvy}|{{}~~~}}~}}|{yvrqpqstvy}|zwtstuxyz{|~~|{zzywusssrpoorw||zyz{{zxxxyzyyz{}~~~|zyz|~~||}}}}~~~}|{{}~}|{yvuuuvusrrssrqqsw}}ytrqrrrsuy~|{zywvwyzzyyy{~~~|zyyyxxz}}|{zxuqppprrrruy}~}zvsrrtvwwy|~~{ywsqqstttuvy|}}|{z{{{{}}{yxy{|}~~||}~}~~}zuqooprtuw{~{zywtqpqrqppruy|~~{yyyxusstsrrruz~~{{{{zzyy{}}{{|}}|xtrrsvwxy|}{wsppruxzz||xvuvwwusstsqppquz~~|zz|||zyxxz{yyz|{yyz}}|{yxy{{yz}~{zzyxurrsuvvutvvutstx}~~|xtssrppqtz}{{ywuvwwutuwz}~}{yyzzxwy}}||{zwsqqrsuuux|~~||{{yurpqrtvvw{~|zxtqprssqqsv{~~|{|~}}~}~{wvwzzz}~||~~|zz|}|z{|}|zurpprtuux~~|{zyvsrttsqqsw||yxwvspqssqpprw}~{yz{zyxvwz|{z|~}yvvwxzyxz~~{vqoprvyz{~~~~}{wsrstvwustvvsqqrw|~~|zz}~~|zxx{|zz}~~|xvwz{zywvwyyxy|}zzzywspqruwxvvx{zxwwy}~}~}{vtutrpprw~}||zvrrttsrrsw{}}|zyz{zxz~~~~}zusstwzzxy}zxyzzyuqopruwww{}{zywroqsrqqsv{~~}~}}~|ywxzzy||{}}|zxvwz{yxy|}}{vsrsuxyxz}||||yvvwwutuw{}ywvvurprsrppqtz~~|zz|{zxuux{{yz~~zyxy{|zy|~ztqqrvz|}|{{zyuqpqruwvtvyxuttv{}|~}}~||}|z|}}}}~yvuwzzyxuuxzywy}|{{zyvqpqswzyx{~~|yyy}~}|}}ywyxurqsw~}{{zvqrttqpprw|}~}zz}}{|~|{}}xwwx{|{y{~}}yxzzyxspqqtwxwy~}||{vrrttrqrtz}~~|}~~~}|}}yy{|z{~|y{}|zxutvyxwx|~~~zvwwx{{yy~~~~~zz}}zxxx|}zxwxwspsutrqrtz~}{|~|zwuw{{y{|{z{}}zwz~~|{|}~xttux|}|~}{{|zyupopruxwuw{{yxxx{}|{||{~~~}|{|}{yww{{zywuw{zwy~~}~}|ztqrtw|}{{|{z{~}~~}}}{{}|xvvv{}{z{zursusppqsx}~~}}~|}|{{||zyz|~}y{~~|{|}zxz{{zvrrruy|{z~}}~}wuwwustvy~|~}xxxy}|~}}}~|~}{||zy|~{zwtswywvy}|zzy{}}zy~}~{zz|~}~|zxyyvstwwtstu{~~~}~}}}~{ww|~|{~~|{z{}|xwz{yvwx{{yxxz}}{|z||zyuppqswzyw{|zzy}}|{|||}{yyz}~|zxy}}|{xvx}}z{}|}xuvvy}~|{|{zz~~{xx|~|{}~~~~zyxz~|{z|{xstwvrqqsx~~}}}{}}{z{||{}~yy}~{xxx{|z|}||yuuvx|~}{~}~~|y|}zwwwy}{|~}|ztsuvz~~{}~~~{|~{zy|~}|yutxzxw{}{{{}~yx|~}{}~~~||z}|z}|z}}}{|}}xuy{zwwxy~}||}~}{|~{|{{zz||xsvxvssuv}|{z|~~z{|{}~||wrrsuz}{y}}{{z~~{|||{}}}}||vuuv{~}{}}{~~zz~}{}~}|}zxxx|~{}|zzx{~|{yutx|yx{~}|zz}|{{}~{vwzxtstu{~|}zwxy|||{}~|{~|wy|zvtuuz~~{xyx{||~~~{xxx}~}}yy{{zytqrrvz|z{}|~}}~~~~{{z}}xvy}{y{{|{|~~zwz|zvwxz}|z|}yvx|zwy~~~}z}~zyyz~}|~|}~~{|zzxxzzvqtwurqrsz~|}~}yx~~{||~~}|vvvw{~}y}}{{z}}xvy~|{~}~}~~|}~}{tsssw{{y{~|~|}}~}|{{zy{~~zy~}yxvvz{yyvrsxyvw|}{||{~~|}|}|x|~|xwww}~~~{|~}{ustuy}~~~}}{}~{uvyxurssw~z{z{}z~}}~~~{zyy~{{~}wvxzyyvppqrw||y}|{~~{wxy{|~|}||{~{z|}z{y{~}wtxxvrsux~}z{}|{wtvzyuw|}z{z~~}}~|~}|z|yvvtvyxsquvspqru}~|}~|vw{{xvxy}~yyxy}}z}|zzx||{ytsw{xw{}yz}{{ysrrrvz{x{~||zzz{~}}|}|yz}}yw{}zuttsyzyyvrrwyvvz~{{~||xvx~~{|}~~~}|yyx|}{~}yy|{zytprru{~}|}z{|zutxxuqrru}}|{{~}y|~zxzz}{yx}}~{wv{{utwyxxwqprrw|}z~|z||z{wsuvx}~{~~}}z}{yywy{ztrvwtpqrv~|{xz}{{zusvzwux}}{zz~zy~||~~yy|}||xststwxtptwuqqrt{|}~{tswxvsuvz|{zz~|x|~ywwuy|zzwsrvyvvzyxz|zzwqrrsx{{x}~{|yvwwz}}~|y{|ysuyxtrsruzyyxtsvzwvz~{z}|zzvsu{{xy~~{{y|{y|~yvwzzyxropptz}{|}{y{|xsuxwsrssx~}|z|~~yw{|yuvwy|{xz}{zyutwzvsuyzyytqrrv|~|}|yz{yywqrstz~~{z{zvvtuxytquvtppqs{|zxy}|{zvtv{yvx}~{zy~~~{ww{}zy}ywy{yzvqrqrvxuruxwsrtu|~{{|ztrvvtqrtw}|z}~{wy|{vstsv{yyxsquyvux~|yz|{{ztsssw{|z}{z|~||yttuv{~}{}zyzxsquwtqqqsy{z{xuv{|yz~}{yz}{zxtruzywz~|zy}~~{wvy{vtvyyyxrpqquz|z}}{y{|ytuyyustty~}zz||wtwzxttuu|~{xwzzyyvstxxttx{{{yttuv{~~{zy{{yxtoqru{~}|~z{~}|{ursrtwwrquwtqqrt||{yz~}}|xvx|{xz{zwz}||zvux|yx{{wwyyxwrpqqtxxttyzxvvwy|{y{|xrruurqrty~}{z||xsuxwsqrqvzyyxtswzwvz}z{~~}{vtuvz~|~yxz|{{xsssuz}}{~|yxyxspsvtqqrsy||}{yy~{z~|zyy}|zyustzzwy|{xz}{{yutwzvsuxzzzuqrruz}|}||z|}|wvz{xvwwz~{ywyzwsuxwtstu{}zxvzzyxussxyvuy}~}xwwx{~~{}zy{|zzuqqru{~~}yy{zzxspqpsvvsrwxurstw|{z}~zy|~|~|ywvz|{{xuvz|yy}ywyyxxtpqqsxzxvz}|ywxy~~{{yz|zttwwtqsty~|zyzzuqtvuqppqvzz{yvuy|zy|~}}xxyz~||xx{{zzurttw|~|}}{yzzvqrvurqrsx~|{~~{}}~~~{zyy}~}|xuvz{y{{ywy{zyxtsvyvtvz{{{vsuux|~|}~}}|}y{~~{yzz~|zxxzytrvxvstux|zxz|zzxutw{xwz~{xyxz~~{z~}}}~|{|~}|ysstuz~}}xxzzyxsopprvwtswzxvvvx~~~~}}}}|yxwz|{{yww{}zz~{y{|zzvqrsuy|zx{}zyyy}~~~~{zz{}|xvyywtuvy~{ywyyvqrutqppqu{{||yy|}z|~}~}{{{~}~zxz|||xttuw{~}}|z{|zusvwussuw~}~|{~zzzz~{}}zzz}~zx{~|z}|ywvy{zyvsswyvuw{}~}ywwwz}~{|}~{{{}{yxzzwtwyxvuvx}{zz~~}|yvx|}zz~{yyy{}{wy}}zxyy}~}}{vvvx|}}{xxzzywrppqtwxvvz|{xxxy~}}~}}~~zywz~}}|yx|~||}~~}{vtuvy}}zz~}zyxy~|z{|||{{{~}yz}}zwww{{yxwyxuqsuurqqrx}~||~~|}~}|}}}|~|||}}|z|~~~{vwxz~~}}|}~}yvy{yvvwx~~}|z|~~~|wuvwz}}z{~{{{}|}||~|xwvx{{zyutwzxwy}|xxxz}~{y~~}|~}|zz||zvx{{yxy{~~~}|}}z{|{~{yxxy{yuuxyvuvvzzyxy|~}{~{xy{{zytqrsvz{xx|~|yyyz~}}}~}zzz|~}{zz~~|}~~|xwwy|~{y|~}yxww{}||zww{}{z}~||}~~}yyx{zyxwyyvsuwvsstu{~}~|}}{|}}}}~}}~}z{~}zxyz~~|zzz}{|~}zxxx}~|~|yy{{{zusstwz{yz~}}}}|~}}~|}{xwwz}}|{xwz}{z|}yyyz||xx{}|zz{~~}||{~~}~}}~{z}}{{{}~~~}}~|}{xwvwxwsruvusstw}}{zz{}{y{}|||~~{{}~}|xtuux{|zy|~}zyxy}}{|~~~{wvwy}~}|~}~~}}{yyz|}{xz}|xvutxzzyxuuy{yy|}|zyz~~{yyy{|yvwzzwvvw{}~{{~~}yvwx{~}~~}|}~|xwzzxvvw{|||}}~{yyz~{{}|xvwyyyvrqrswzzy{||~|yyy{~|z}~{yyy}}{{~}{}|yxxy{zvuxywvwx{~|{}}zy{~}{}~}||}~}}}|~|wutsuvtpqttrqrty~~|zz{{xvx{zxxxz~}~zxwxz||zy}~|yxwx|}||ywy}~|}~}~~~}zuuuwz}||~}~}}|zyz|{wwyzwtrrswyxxvtvzzyy}|zxz~~~}zz||}{zz{}~|y{}|zxxy}~}}zy{{{zvstux|~}}~|{{|zvuxywuuvz}}}~|}~||}|zyy}~{xxzzwuvxxxvrqrswz{z||{{}||yuuvx{|{y|}{{{~}}|xwvwxwtqtvuttux~}{yz}~}|zxz}}{|}||~~~}{|}}|ytrqqstsopstsrsty~{zyyyurtwwuuvx}}zyy{||yx{|zwvuvyzzywvw{|z||{}}}|wttux{}|}{zz{~}~}{yyzyvsuvurqqquxxxwuvy{zz}|yxx{{zzxwy}|{|}|}~}~~|zyz}~|{}}zwwyyywsqrtw{}|~|zyzzwtuxwuuuw|~}|}~~{y|}{yyz|~{yxz||{ywvxywtuwxxxtrrtwz||}{yyzzywsrsuy{{z|~}~}}~yutstutqpstsrrtx~~{yx{}}}{yy{~||~~|{}~|}~~zyz{zxtqppqssqpsutssux{ywwwtqqttsrsuz|zzz{{xvxyxusrswyyxvuvy{z{|{|}}|xuuvx{}}~~}ywwx{~~|}{yxxwtqsttqppquxyyxww{}||{xvwyzyxvuwz{z{~}{yy|~}zxz{xvvwxxwsqqsvz||}|zyzzxuuxxwvvw{}|{||yvxzzxwwy~|ywwyzzywuuxxuuwyzzxttuwz}}|~}yxyyxwtqqsuy{zz~||~~}zurqqstspprtsrrtx~~{yy{~~~}{z|~}|{z}~}{{~~}{xxyyxuqoppstsqsvwvuvx|{ywvwvrpqssrrsv||zyyzyutvvtrqqrvxxxvuwz{z{}|}~~~{wvwy}}|}~~}yvvwy|~}}|ywvvuqprsrppqsxz{{zy{~}~|xvuwyyxwuuw{{z|}zyxz}|{ywvxywuuwxxwtrrtw{}}|zyz{ywwyzyxxz~|zyzzwuvxxwvwy}{xvvxzyxvuuxywvxz||{xvwxz}}|}~zxxyxxurqsuy{||{z{{zytqppqssqprttssux~~|zy{}}~~{yx{}~}|zz}~~{xxyxxurppqtvutuyzywxy}~zwvvvurprttsstw}{yxxxvrqstrppprvyyyxwy|}|~~~|yz{}}{|}}|zwuvx{}~}|ywvvurpqssrqrtx|}~}|}~~~~||}}{xvuwzzzywvx{||}|ywvxzzyxuuwxvuvxyzxustvy}~~~|{{|}{yz|}|{{}|zyyyxutwxxwwx{}ywvxzzyxvvxzyxz|~~{xxyz|}{{~~}}~~~{yyzzywsstvz}}}}yxyyywspopqssrqtvvuvw{~~|||{yxy|}}}{z|~}zyzzyxtrrsuwxwwz{zyxy{zxwvwwussuuttuw|{xvvvurprsrppprwzz{zy{~~~}|}~~{|}}}{xvwx{~}zxwxwtrsuusstvz~~~~}{{{|}}zz||{xwwx{}|{zyz}~}~~{xvuwyyywuuwywvwy{|{yvvwy|~}~~}}}}}}~}{yyyywuwyyxxy{~{yxx{||{yxy|}{{}~zyyyz{zyz||{zyz}~~|{|}}{xuuvx{}}}~{xxyyxvrppqsuuttwyxwwx|~~~|zyy|~~~}|}}||||{yutuvxzyxy{|zyxy{~~~~}yxxxyywuwxxwwwz~|xvuuutqprsrqqrty|}}}|}~~~~~}}~~{yyz}|zzzzxuuwxwvvwy~~~}~|ywwxz{zxy{{zyxy{~~}|~~||}{yvuuwyyyxvvxzyxy|~~~{xxyz|}||~~{zz{{ywx{{{z{~~}{z{}~}{|~~}~{xxxyyxvvxyxvvwz~~~~}ywxy{}}|~}~~{yxyyyxurrrtwxwvy{zyyy{~~~~~~}{z{}}ywwxz{zyy{{zxwwy|}}|{z|~}||~~zzz{||zyz|{yxxz~{wvuuutrrsutsstw|~~~~~~}~}}}}||}~}||}|zxz{zyxxz~~~}{{|||zvttuwyyxx{||{z{~~}}}~~|zz{zxvuuxz{{yxy{}|{|{yyyz{{zz}~~}}~~~||}}}{z}~~}}~~~}}~~{xvvvwvsstvuttux|{yyy{|{z{~~}|||~}~~|zz{{{zwttuwyyxxz|{yyy{~~~}{z{}~~~}}~~}zyyz{{yxyzywuuvyzzzyxy{|{{}|{|}~||~}{zyy|{xvvvwwutuwwvvwy}~}~~{zz|~}~~~~|z{||{z{}~~}}~}{zyz}~}|}}zxxyyyxusstvxyxy|~~}}~~}~~{yyz{{zxyzzywvwy|}}|{{}~}~}yxxxyywvxzzyyz}~}~~~~~~~~|wutsttrqqstsssuy~|zyyzyxwxzzyxxz}~~~||}~~}ywwxyzzyy{{zyxwy|~~}||~|yxy{}~}}~~~{zzzzywwxxvtrruwyyxwwy{{{|~~~~~{yxy{~~~}|}~~}~~{xxxyyywwyzzxxx{~~~}{{|}|zxwwy{}}|~~}|||ywxzzyxy{~~{zyz}~}{zzzzwvwxxxvsrsuwyyy{~}||}}|ywvvwyyxwy{{zyyz|~{xwvvwvtsuvwvwx{~|{|}}~~~}}}}|yurqqrrqpprssstuy~|zxxxwuttvwvuvwz~}zyyz{{yxyzywvuvxz{{zz{}~~~~{xwxz|~~~}}}~~}{zyyywttuusqqqsvwxxwwz|||}~}{xwwy{{{zyz|}||}|zzz|}|{z||{zyz{~~}}}|zxyyzywutuwz|}}~|{zzywvwyyxxy|~~||~~}||}|zyy{||{yxwyywuvwxxwtstuxz{{}~{yyzzywtttvxyxxz|||{{}~~}yvtsttsqqstttuw{~{zz|~~~}|}~|{{{zxtqppqqqpprtttuvz|ywvuusqrsttstvz~~{zzzzywwwxwtsstwxyyxxz|~~~}~~~}zxxy{~|zz{}~}}~|zxwwusqrsrqppruwxyxxz}~~~~~~}{xvuvxyyxwwz{|{|}}}~}|}~}{zyz}~|zz{zxwwxxxvtstvy|}}}{zyzywvwyyyyz}~}}}|zy{{{zz{~|ywwxzzyxvvwxwuvxyyxvuuwy{||}}zxxxxwusrsuwxyxz}~~~~~}~~}{wtrqrrrppqsttuvz~{zz{}~~~~~}}|zyyyxurpopqrrqrtvvvwy}~yvuttsqoprsrstw{{zyyyxutuutrqqsuwxxwxz|~~~}~~|yyz|~{yyy{}}}~~zxvuusppqrqppqtwyzzz{}~|||zxvttvxxwwvwz|||~~~~}{yyy{}|{yxxyxwvvwxxvttuwz|~}{zyzyxwxzzzz|~}|{{zxwxzzyyz|}ywvvxyyxvvwxxwwxz{{zxwxy{}}}~~}}{xwwwwwusrtuxzz{}|{{{zxurpppqqpprttuvx{~}{zz{~|{{}~~~~{yxxxwurqpqrttstvxxxyz}}xvtssrqoprsssuw{{yxwwusrrsrqppqtwxyxyz}~||}~~~~}zyxz{}~~}ywuutrppqrrqqsvy|}}}}~~~~~|zzzywuttvwxxwwx{}}~~}~}|yxwwyzzywvwxwvvwxyywvuwy|~|{z{{{zy{}}}~}{zzyxvwxyyyz|~|zwvvwxyxwwwyzyyz|}~}zyyz{}|||~~}}~}}}{ywxxxxvttuwy{||~|zyyyxvspppqrrqqsuvwxz~~~~~}|{|~|zz{}~~~~|zyyyxwtrrstvvvvxzzyzz}|xutttsrqqsttuvy}}ywvutsqpqrqppqsvyzzz{}~~~~~~|zyz{~~zxvuutrqrsssstw{}}|{{{{yxxxxwuttvyzzyyz|~~|||zxvuuwyyxwvwxxwwxyz{zxwxz|~~}}}~~}|~|zzyyxwwyzzz{}~~~|zxwwxzzzyyy{|||}~~|zyz{{{zz{||{zz|~}|}}|zyyzzzxvvvxz|||~~~{yxxxwvsqpqrssssuwxxyz}}~~~~}{zz|~|{{{{zxvtuvwxxwxz{zzzz}~}zwvuuvutstvvwwx{{wuttsrppqrrqqrtx{|}}}~|{{}|zxwwwuttuvvvvx{~|yxxxyxwvwxxwvvwy{||||}~{zzzxvutuwxxxwwxyzyyz|}}|zyy{|~~~}{zzzzyxz{||}~~}}}|zyxy{}}|||}~~~{yyyyyxwwxyxwwxz}~~~}}~~|||}}}{xxxz{|||~~~~}}|zxxxxxwtrrstuvuvxyzzz{}~~~~~}{{{}~}~~}|yxwxyzyyyzzzyxyz}~~~}|}~~}|}~~}{ywwwxxwvwxyyyy{~}zwutsssqqrsssstvz}~~~~~|zzzzxwwyyyxyz|}|}}}{ywuvvwwvvwyyxxxz|~}||||{yxxxwuttuwyyyyyz||||}~}{zz{||||}}|||||{|}~}}~~}|{|~~{xwwwwuttuvvuuvy|~~}zyyz{{{z{}}}|{|~~}|||{yyyzzxvuuuwxxwxyz{zz{}~~~~~}}}zyyzzzyxyyxwvvwy{{{zz{|}||}~}{zzz{{zyyz{zyy{}~|yvuttutsstuvvvwy|~}}~~}~}}~~~~~~~}}~}{z{{{zzz{~~}}~}{zzzzzxuttuvwwwxz{{{{|}{yyyzyxwwxwvuuwy{||{{|~~~~~{yyyyzyyy{||||~~~~~~|yvutttsrrstttuvy|~~{yxxyyxwxyzyyyy|~~}}~~}|{|||{ywwwxyyxxyzzyxxz|}}}~|zyyyyxvvwwvuttvxyzzyz{}}}}~~}||}}}{z{{{yxxy{}~~~~~~~~|zxwwwwwvvwxxxxxz}~~}}~~}{z{|}~~}~~~}}{z{|}||}}|}|{zyy{}~~}|{{{zyxyyyywutuvxxxyz|}}}}~~}}}}}|yxwwxyxwwxyyxxxy|~~~~~~~~~|zxwwwwvvvxyyz{|~~~}}}}{yvtssssrqrstuuvxz~}zxwwwvuuuvwwwwy{~~~}{yxxxyxwwwxxwvvxz|}}}~}||~}zyxxwvutuutsssuwyyzzz|}~~~}}}~}|{zzzywwwy{|||||}~~~~~~|zyyyzyxxxyyyxxz|~~~}}~}|{{|||{zyyz|}~~~}|||zzz{|||}~~~}}|{yxxy{||{zzzzzyxyyzywvuvwyzzz|}~~~~~|{{{{{zxvvwxxxxxyzzzzz|~~~~~~}zxvuuuuttuwxxyz|~}}}~||{{zxusrrssrrrtuvvwx{|ywvuutsstuvvvwy{~~{yxxxxwvvvwvuuuvy{|||}~}}}~~~{ywwvutssttsssuwyzz{{|~~}}~}|zzzyxvuvwyzzzz{}~~~~}{{{{{{yyyzzyxxy{}}}|{|||zzz{{{zxxy{|~~}|||{zz{|}}}~~~~}||~~~~~~}}{zxxxz{{zzyzzzyyyzzzywvwxyzzz{}~~}}~~~}|zyzzzywvuvwxyxyz{|{{|}~}}}|{ywutttttstuwxxz|~}}}~~|{{{zxusssssssstvvwwy{~|ywutttsrstuuvvx{~|zxwwwvutuuutttuxz{{||~~}~~}~}zxwvutssstssstvyz{{||~~}}}}|zyyyxwvuvwyzzzz{}~~~~|||||{zyzzyxxxy{|||{z{{{zyzz{{zxxyz|~~~}|||{{{}}~~~~}}|{{|}}}~~}|{yxwxz{{zzzz{{zzz{{{yxwxyzzzz{}}}|}~~~}}{zyyzyxwvvvwyyyz{||||}~}|||{zxvtssttsstuwxxz|~}~~~}|{{zywutsstttttvwwwxz|~{xvutttsrstuuvwy|~|ywwvvutsttttstuxz{||}~~~~}~}zxwvvusstttttuwy{|||}~}|{{{{zyxxxwvuvwyzzzz{}~~~}||||{zyyzyxwwxy{{{zzz{{zzz{{{zyxyz|}~~~}}}|||}~~~}}}|{{|}}~~~}}|{yxxyz{{{zz{||{{{||{zxwxxyyyyz{||{|}~~~~}|zzzzzywvvwxyyyz{|}||}~~|{{{{zxutsttttttvwxyz|~~~~~~||{{zyvuttuuutuvwwwxy{~~{xvuuutssstuvvwy|~{xwvvuussttttttvy{|||}~~|zxxwvtttuuuuuwz|}}}}~~|{zz{zyxxxxwvvvxz{{{{|}~~~~}||||{zyyyxwwwxy{{{zz{{{{z{{|{zyxyz|}}~~}}~~}}}|{|}~~~~~}|{zyz{|||{{||}|{||||zywwxxxxxyz{{zz{}~~~}|{{{zyxvvvwxyyyz|||||}~}{{{{zxvttttuttuvwxxy{~~~~}}||zxvuuvvvuuvwwwwxz}~~|zxvvvutstuuvvwy{~~{ywvvvutsttuttuvy{||}}~~~|zyyxvuuvvvvvwy{|}}}}~~~~~~|zzyzzyyxxyyxwwxy{||{{|}~~~~~|{{{{zyyyyxwwwxz{{{{{{||{{{|||zyxxy{{||~~~~~~~}||}~~~~~}|{{|}}}}||}}}|||}|{zxwwwwwwwxyyyyz{}~}|||{zxvvvwxxxyz{{{{|}~}|{{{zyvutuuuutuvwxxyz}~~}|zxvvvvvvuuvwwwwxz|~~~|zxwwwvutuuvvvwx{}~{ywvvvutttuuuuvwy{|}}}~~|{zyxwvwwwvvwy{|}}}}}~~}}}~~}|zyyyyyyxxyyyxxyz||||||}~~}~~}{{z{{zyxxyyxwwxz{||{{||}||||||{yxxxyz{{|~~~}}}~~}||}~~}}~~}}||||{ywvvvvvvvwxxyyy{}~}}}|zxvvvwwwwxyzzz{{}~}||||{ywvuuvvuuuvwwxyz}~|ywvvvvvuuvvvvvwy{}}~~~}{yxxxwvuuvvvvwxz}~}{yxwwvvuuuvvvvvxz|}}}}~~}|{zxxxxwwwwxz|||||}}}}||}}|{zyxyyyyxyzzzyyz{|}}}||}}}}}}~~}|zzzzzyyxyyyxxxy{|||||}}}||||||zxwwxyyyz{|~~~~~~~~~~~}||||{ywvuvvvuuvwxxxyz|~~~}|{ywvvvvvvvwyyyzz|~~}}}||zxvvvvvuuuvwwwxy{~}zxwvvvuuuuvvvvvxz|}}}~~|zyyyxwvvvvvvvwy{}~~~~|zxxxwwvuvvvvvvxz{|}}}}~~~~~~~~~~}|{yyyxxwwxy{|||||}}}||||||zyxxyyyyyyzzzzz{|}~~}}}}}}||}}}|{yyyyzyyxyyyyyyz|}}}}}}~}}||||{zxwwwwxxxy{|}~~~}|||{zxwuuuuuuuvwwxxyz}~~~}{ywvuuvuuuwxxyyz{~~~}}|zxwvvvvuuuvvvwwxz|~}zxwvvvuttuuuuuvxz||}}~~|zzyyxwvvvvvvvwy{|}}~~~|zyxxxwvvvwwvvwxz{||||}~~~}~~~}~~~~~~~}~~}|zyyyxxwxyz{|||||}}||||||zyxxxyyyyyzzzzz{|}~~}}}}}||{|||{zyxxyyyxxyyzyyyz|}~~}}}~~}||||{zxwvvwwwwxy{|}~~}|||{zxvuuuuuuuuvwxxyz}~~}{ywuuuuutuvwxxxz{~~~}|zxwvvvvutuuvvvwxz|~~{yxwvvuttuuuuuvxz{|}}}~~|{zzyywwvvvvuvwxz||}}~~|zyyyxxwvwwwwvwxz{||||}}}}}}~~~~}|}~~~~}~~~~~}|zzzyxxxyz{|||||}}|||||{zyxxxyyyxyzzzzz{|~~~~}}}}|{{{{{{yxxxxyyxxyzzzzz{}~~~~}~~~}||||{ywvvvvvvwxyz{|~~}||{{ywvuuuuuuuvwxxyz|~~}|zwvuuuuttuvwxxy{}~~}{yxwwvvvuuvvvvwxy{}~}zyxxwvuuvvvvvwxz{||}}~~|{{zzyyxwwwwvvwxz{|||}~~}{{zzzyxxxxxxwxyz{|||||}}}|}}}~}|||}~~~~~~~}||{zzyyz{||||||}||||||{zyyyyyyyyz{{{{{|}~~~~}}}}|{{{{{zyyxyyyyyzz{{{{{|}~~~~~~~~}||||{zxwwwwwwwxyz{|}~}|||{yxwwwwwvvwxxyyz{|~~}|zxwwwvvvvvwxxyz{}~~}|zyxxwwwvvwwwwwxy{|}~}{zyyxwwwwwwwwxy{||}}}~~~~~}||{{{zyyyyyxxxxyz{|||}~~~~~~}|{{{{zyyyyyyyyyz{|||||}}}||}}}}|||}~~~}}||{zz{|||||||}}||||||{zyyzzzzzz{{{{||}~~~~}}}}||{{{{{zyyyzzzzz{{|||||}~~~~~~~~}||||{zyxxxxxxxyyz{|}~~}}||{zyxxxxxxxxyyyzz{|~~}|{yyxxxwwwwxyyyz|}~~~}|{zyyxxxwwxxxxxyz|}}~~~}{{zzyxxxxyxyyz{||}}}~~~~~~~~~}|||{{{zzzzzyyyyz{{|||}}~~~~~~}|||{{{zzzzzzzzz{||||||}}}|}}}}}|||}~~~~~}|||||}}}}|}}}}|||||{{zzzzzzz{{|||||}~~~~~~}}}||||{{zzyzzzz{{{|||||}~~~~~~~~}}||||{{zyyyyyyyyz{{|}~~}}}|{zyyyyyyyyyzzzz{|}~~~~}|{zyyyxxxxyyyzz{}~~~~}|{zzzyyyyyyyyyz{|}}}~~~}||{zzyzzzzzz{{|}}}}}~~~~~~~~}}|||||{{{{{zzzz{{|||||}}}~~~~~~}}|||||{{{{{{zz{{||||||}}}|}}}}}|||}}~~~~}}}}}}}}}}}}}}|||||{{zzz{{{{{{||||}~~~~~~~~~}}||||{{zzzz{{{{||||}}}~~~~~~~~~}}}|||{zzzzzzzzz{{||}~~~~}||{zzzzzzyzzzz{{||}~~~~~~}|{{zzzyyyyyzzz{|}}~~~~}|{{{zzzyyzzzzzz{|}}}~~~~}||{{{{{zzz{{||}}}}}~~~}~~~~}}|||||||{|{{{{{{|||||}}}}}~~~~~}}}||||||||{{{{{||}}}}}}}}}}}}}}|||}}}~~~~~~~~~~}}}}}}}}}}||{{{{{{{{{||||}}}~~~~~~~~}}}||||{{zz{{{{{||||}}}~~~~~~~~~~}}}}||{{zzzzzz{{{||}}~~~~}||{{{{zzzz{{{{{||}~~~~~~}}||{{{zzzzzz{{{|}}~~~~~}||{{{{{zzz{{{{{||}}}~~~~}}|||{{{{{{||}}}}}}}}}}}~~}}}}|}}||||||||||||}}}}}}}}}}}~~~}}}}}}||||||||||}}}}}}}}}}}}}}}}|||}}}~~~~~~~~~~~~~}}}}}}||{{{{{{{||||}}}~~~~~~~~~~}}}}|||{{{{{{{||||}}}}~~~~~~~~~~}}}}}||{{{{{{{{{|||}}~~~}|||{{{{{{{{{{{||}}~~~~~~~~}}||||{{{{{{{{{||}}~~~~~~}}||||{{{{{{{{||}}}}}~~~~~}}}|||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}}}||}}}}~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~}}}}|||{{{{|||||}}}}~~~~~~~~~~~~}}}}||||||{{|||||}}~~~}}|||||{{{||||||}}}~~~~~~~~}}}||||{{{{{{||}}}~~~~~~~}}}}||||||||||||}}}}}~~~~~~~~}}}}|||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}||||||||||}}}}}~~~~~~~}}}|||||||||||}}}}~~~~~~~~~~}}}|||||||||||}}}~~~~}}}|||||||||||}}}}~~~~~~~~~}}}}||||||||||}}}~~~~~~~~~~~~~}}}}}}|||||||}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}~}}}~~}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}|||||||}}}}}}~~~~~~~~}}}|||||||||}}}}}~~~~~~~~~}}}}|||||||}}}}}~~~~~}}}}|||||||}}}}}~~~~~~~~~~~~~~}}}}}}|||||||}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~}}}}||||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m40.bin b/applications/PoP/poc/res/music/m40.bin deleted file mode 100644 index 018cc3b..0000000 --- a/applications/PoP/poc/res/music/m40.bin +++ /dev/null @@ -1 +0,0 @@ -xmd`bis|{qjd``cipy~wsojgdccbaaaaaabbcfhkosy}skeabfnwzrjfcaacfhkptx{|}{yvtpligecbbbdgjosy~|upjfcbcejov}yuqmkigeddccccccccccccccccddeffhjkmoruwz}}yvrnkhfeddegjmqv{|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtronljhgffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnpruwz|~~}}}||{{zyyxwvvutsrrqponmlkkjiiihhhhhiijklmoprtuwz|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zyyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxz{|~~}|{zzyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxz{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}|{{zyxwvuutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxyyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwvvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyz{{|}~~~~}|{{zyyxwwvvutttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxwwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~~xtrsuz}~zwtsrsuy||zywutsssssrsssssstvwxz|{wtsstw{~zwutsssuvwyz|}~~}|{yxvuttssstuvxz|~|ywutsstvx{~}{yxwvuutttttstttttttssstttttuuuvwxyz{|}~}|zxwvuttttuvxy{}~}}|{{zzzyyyyyyyyyyyzzzz{{||}}~~~}}|{zyxwwvuuutuuuvwxyz{}~~~~~~~~~~~~}}}|{{zzyyxxwwvvvuuuuuuvvwwxyz{|}~~~~~}}}}||||{{zzzyyyxxwwwvvvvvvvvvvvvwwxxyzz{|}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvvvvvvwwwxxyyzz{||}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwwwwwwwwwwxxxyyzz{{||}}~~~}}}|||{{{zzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{{||}}~~~~~}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{|||}}~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~~~~}}}||{{{{zzzyyyyyyyyxxxxxxxyyyyyyzzzz{{{{||}}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}|||{{{{{zzzzzzzyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~}}}|||||{{{{{zzzzzzzzzzzzzzzz{{{{{|||||}}}}~~~~~~~}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~ymd`bhs|{qjda`cipywsojgdccbaaaaaabbcfhkosy~tkeabfmwzrkfcaacfhkptx{|~~{yvtpligecbbbdgjosx~|vpjfcbceiou|zuqmkigedddcccccccccccccccddeefhjkmoruwz}}yvrnkhfeddegjmqvz|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtrpnljigffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnprtwz|~~}}}||{{zyyxwwvutsrrqponmlkkjiiihhhhhiijklmoprtuwy|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zzyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxy{|~~}|{{zyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxy{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}||{zyxwvvutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxxyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwwvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyzz{|}~~~}|{{zyyxwwvvuuttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxxwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~{wsrsw{}yvsrstvz~~|zxvutsssssrssssstuvwyz}~zvtssuy}|yvtssstuvwy{}~~~}}{zywvutsssstuwy{}}{xvttstuwy|}{yxwvuttttttststttttssttttttuuvvwxyz{|}~|{yxwvutttuuwxz|~~}||{zzzzyyyyyyyyyyyzzzz{{||}}~~~}|{{zyxwvvuuutuuuvwxy{|}~~~~~~~~~~}}||{{zzyxxwwwvvuuuuuuvvvwxxyz{|}~~~~~~}}}}|||{{{zzzyyxxxwwwvvvvvvvvvvvwwwxyyz{{|}~~~~~}}}|||{{{zzzyyyxxxwwwwwvvvvvvvvvwwwxxxyyz{{||}~~~~}}}|||{{zzzzyyyxxxxwwwwwwwwwwwwwwwxxxyyyzz{{||}~~~~~}}}||{{{zzzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{||}}~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{||}}}~~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxyyyyzzz{{{||}}}~~~~~}}|||{{{zzzzyyyyyyyxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~}}}||||{{{zzzzzzyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{|||}}}}~~~~~~}}}}|||{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{||||}}}~~~~~~}}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{||||}}}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{|||||}}}}}~~~ymd`bhs|{qjda`cipywsojgdccbaaaaaabbcfhkosy~tkeabfmwzrkfcaacfhkptx{|~~{yvtpligecbbbdgjosx~|vpjfcbceiou|zuqmkigedddcccccccccccccccddeefhjkmoruwz}}yvrnkhfeddegjmqvz|zywutrrqqppoopopppqqrsstvvwyz{|}|zxvtrpnljigffeffgikmpsvz}~~}}}}}}}}}}}~~~~~~}|{zyxwvtsrqonmljihhggggghijklnprtwz|~~}}}||{{zyyxwwvutsrrqponmlkkjiiihhhhhiijklmoprtuwy|~~~}||{zyyxwwvutssrqpoonmmlkkjjjiiiiiijjklmmnoqrsuvxz{}~~}|{zzyxwvuutsrqqpoonnmmllkkkkjjjkkkllmmnopqrstuwxy{|~~}|{{zyxwvuutsrqqpoonnmmllllkkkkklllmmnoopqrstuvwxy{|}~}|{zyxwvvutsrrqqppoonnmmmmmmmmmmmnnnoppqrrstuvwxyz|}~~}||{zyxwvvutssrqqppoonnnnnmmmmnnnnooppqrrstuvvwxyz{|}~~}|{zyxxwvuttsrrqqpppoooooooooooopppqqrrsttuvwxyyz{|}~~~}|{zyxxwvuutssrrqqppppoooooooppppqqrrsttuvvwxxyz{|}~~~}||{zyxxwvuuttssrrrqqqqppppppqqqqrrrssttuvvwxxyz{{|}~~}||{zyyxwwvuuttssrrrrqqqqqqqqqqrrrssstuuvvwxxyzz{|}~~~}|{{zyyxwwvvuuttssssrrrrrrrrrrrssstttuuvvwxxyzz{||}~~~}|{{zyyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuutttttssssssstttttuuuvvwwxxyyz{{|}}~~}}|{{zzyyxxwwvvuuuutttttttttttttuuuvvvwwxxyyz{{||}~~}xtrsvz~~zwtsrsvy}|zywutsssssrsssssstvwxz|{wtssux|}zwutsssuvwyz|}~~}|{ywvuttssstuvxz|~{ywutsstvx{~}{yxwvuutttttstttttttssstttttuuuvwxyz{|}~~}{zxwvuttttuvxy{}~}}|{{zzzyyyyyyyyyyyzzzz{{||}}~~~}}|{zyxwvvuuutuuuvwxyz|}~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuuuvvvwwxyz{|}~~~~~~}}}}||||{{zzzyyxxxwwwvvvvvvvvvvvvwwxxyzz{|}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvvvvvvwwwxxyyzz{||}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwwwwwwwwwxxxxyyzz{{||}~~~~}}}|||{{{zzzyyyxxxxxwwwwwwwwwwwwxxxxyyyzz{{{||}}~~~~}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxxyyyyzzz{{|||}}~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~~~~}}}||{{{{zzzyyyyyyyyxxxxxxxyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzz{{{|||}}}~~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}|||{{{{{zzzzzzzyyyyyyyyzzzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~}}}||||{{{{{{zzzzzzzzzzzzzzzz{{{{{|||||}}}~~~~~~~~}}}|||||{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~skzjg~qot~wvekizsyynmltxcwqx~|uow|}~}}qygjqN\i}xtOptQklwt~n~l`~}uYPwjP}`_oao|ztnyb|Zym`]sfzzaObfTvvx}{an}ubNiyOltR{dfpwnw~vnsvt~^OVXmsS{azizv{n}f^yuiPY|^ZYilbjvm~zwucLSklUd{T^w_qxktinrRfogTQunPzlY}ddmmrxOS_yzY|gNbx{~dYsehjbr\Tmj_Mc}YcYomcgpho~]NYnnwYXo{ztQek_jaglNcmgUSxqT|p[icjit}}jmvUYds]fyzy\Xp`fg`o`Ohe]Pi\f^nueelg~{ubvhS]no_p}{tRfl`idbqSYicWTvxUxyZ~ldgkm{xnbzbZexhbsyxbUrcehcgoN]b\Rah[kakdjhywejwY_kzcizyvVapahh`neNc`YRn\i`myhdkjzuu`nv^gx~{ahuskPmjchh`raO_ZUXyxWt]uxigkt{xro\tp`lsamvteSsefggbuYS`ZT^qX}x]~ugik|y|uok\zjdpzncqvv^[wajghbwWT[WUhj]s_wjln}vvsljZ{plywm`mpoX^uajggcwTV[WVlg`qawjmo~xxfClnvZofm`P]Ia{nMMMoDM|rsuduy`pwxyuś˱qp{}PKKLY|OgmKyZ_ZnljPwWss\y|eOhOqxedmdz|}yArb=^]A5bucwmu_er~jGXBRRri7iaYdh_WswȪo{hqdjLP_PBZr~thgt[}]qv[gHdsml\rxqaCoqjOfvpp[`]^^i^֮԰yZsrbzlimg;k|ePqhykdj{wjd_oXsczwfxto^rn˹||~vz{zig=V:UmquNbjikZlmqtkY\YeWvv}~{n{bzsz¹{pX^F[Lb|lovnqX`kFXec}w}gDd`yn]p{vt}u}g¦İv^SmRObKZmyeycbs^PR]n_t~dR|odne[xrpw|qjhv`?`GSmp|mziTYUX|ear[aWKhgA[x|hkmfl_n~t^k_IQ\>\{oqwmjVVb]K^h8]{un{keoZgqr}whkkBej@sk|m{~z|iRk`Iwg9jkppkgdpgp}qv|wwlqLl`Mrwkos~cr}q]}zggJf{lwaVu^e}o~{u}wyrpuP{tb~~~s`uEWpwrYVzxpk^{cru^vpf|yo|{wtsgQyve}x||Mfka`SLx|V]~Ozpuo~kyty~]w~omzqip~jujP̿~\WcZoQestqkruxVxooqrXsv|ijm[s{l|pRhHReg{pmt5Ba0<6FsCam|MSn_f~joʴph_Ma\J][hmi]Qfbbq\Wo[X^^`=H~aSYn}jbI=ZUX]mƳwnpU^zVPWUhxafjypRerPmgW{vsjirgenRTVm|dkyxjZY[XXBdipxUqiscb~|wtwȁyrfljfjYKcrrqKxqqPv{jryjjy}}VSjtdLrlrD&Y]F+3h>P~X{gwyTy}lTltJwϦ}}r|~}YvOeYInq~`K%QH80?aHMYW|Lbkxıä̻m`].DFpXornKeaa7EnBFE@lL=R@<]hjX}vdm}qvt{zybuݳמv{vquxjed4YfV8TY[wYijadiNf`sqçɾœ{r}xu}O[PSO'9AE848* H68pr[|yirkkff{mWozh\ln\x_lbkMh}t]vZEcTJRBWe`kutqilyZb{jpbQFAA.8UGRYS[EJoVUtiuYdRrglyjdzv~wǧhrqWx{jyf}tqWRiv`ssjyb[fkktoy|cwhenkq|iUlb`tradvyzb{{]sdlbTY}\qymrrhjcPegsupomypEW``DS8F?.LZ^MaiOnu]Yuqtuu`jansʢ{bgeuQc`KXOSlfTy\piblztyvsnzdbhmWFRFpcg{dj|KfkcWk]WXWl~kYt~Uplkgosunnro^][XHVTR;YQE;=WkWAju\xwm~xvorxs]vvjLngbXO^tkapnr{~ymwwjw[ce|kbfjgl{{yv{uyo}_UsylQl^gjinjhs~wop_ji`wsbxzsfjfxRPZcWU`N^GWjdHXee{p{s}zabz~zvi~r~x~|k}sgbkg\eqmXhlstraozRkz}xdvyrNgYtpciqe[zv]w[eqdllznXx}s{|fxzaoa~p^fskd}zus{uPgdmOckWTQanbMvuMbx|wszvx}ndsiwuyt}x}f||SfsjlekhWSwr_czq}c|}dp]}}vojmkzYzw[diV\`]haHv{dtt}{~|x{{j~{cy^uoluhe|`zmoRY`]eWcohZn}ojz|zj{|fp`pjh`dxvsWuevYLfajiqxxryt}}v}x|vnygrsoiXLh~zjwyr[zqw{uZr`\jov{kluxluwpspwlwyrrib[Re{ymuswoolym}csi[jxp~b{xryvspancxoeXq~|x[luqvp{|s|olhhilxktptqqj[zvjgI`JXabZNNXqw{sxzv~yzmgo{gqvyrlmdysuRgd\}|rjfg¤j~y[tntz~gr{g_lx~isqs{t{}yrcawk]UbPpzwoidz}v{|iip`h}}syxw~~|txi}jrrk^[zfiMj]l|nsx~ltaxu|}rpbqoykju\Zbk{Wk|bpvhfav}_vx{~svsdsziy{l|hcdhv`noq{ong{{]\fZquup`\xyztts|dz`swrwynommnuw~}{e\sgw|whg}w~s|\j}x~rsryhjpupclSpve`]bpss~}vpx|eVtcq}vs|ov{|mkvzvox^}ujjq}}p{unkuiXGcXgtrj`]qsw|otje{wvs{mfrxvmzvvwkVl_l{}{tpw~uyjapsz~je`qcYgmqkyepknyvtk~zurzun_Plft~vslj{yqopnyyxsqswptkwngoml[Md[hommgcw|}~{mz|^^qy}wqoqxwxxxyp~|xy`Vkgswywos{|~j~~X_rx~rmsn}{zpzwiqhglwzh|p}{wnuUYkhx}{vq|ygts}qurwkfjt~wsrntxuyhiLZ^^nrlb]ks{y|x~fxuts|rsyrt{z}tpVhgeprohfuwp}uhyhygwqhsbrsjiotzr|}oy||xkcK_^amomkn|{xzq}qrrp|msjmsv{sjuwtwiaW@TTZed`_evpnxzrpwmn}vvpyrt{|nw}|picM]^eqrokpiryrfdrfksyvhdshxvkinuzr|udhxtw}jcaL]bdpvww~s|vrpqt}~qkyo~|ojkptoy|ogdupsxl_]GYacqxyvx|jqz}qlltr}~vq}r~|plntywwuj}oq\hspz~~noxtkg}b|virrmephh{vicgmomts{aw}rs^^onw~~z||t{uop~owuqfnmgoegotttvgyml]Scahsvrqzz}ot{vmutqjorqgkrj~squ{y|wmgVfjktyzy~zmpxsgbx^xgaikfaibo}rory~}zl|ifRXhirxzz}yryzmdtew{elopjrpmyx{~gx~}igYN`ekuz{|jnv}|pilsjmnssnryqzvy||xymj|{}ld^M\iluzzz{iir{sjijtoxywv~uyqrxzwqvdyy{|sfdPVeir{~}~pkry}rkor{|yu}vy|spsuuzq~av|}wecRRfjow|~vlt}yrxry{ztxspyqorrsuu{ds{zz{hdTNbkry}~~ouv}{quvvswtnzpmprtuwwbo|||}xheYO`kpwyz{}uzvz{xpsusossm|sprrsrxvdlz{}|idXK[fksvxy{yz}ru~umossoqqk~|qmoqssxqfm{{|}yf`UHWdjsx{{xx}rrzvknqrosrm}tnnnpswsdmyxyztc^SIZgmsw{uxzptvxjpsspsokyqnppqssr^kvvxzteaRI[iqy|~tu~yovu{joqrotplzqnommplr}\oxzzzqdbUOamu|sv~yo}o~irrqnrmqumjjjjsh{y]sx|~sgcSUgs{|sxvmovhqrrprkt|piijklzfrd{|skeU\lu|{tzwnqqkqrppnguzpkkijm~kmktmcU^muz{|zxt|~uprninommlgvxolmmnp~onpslaR[ku{|{{yyt{up~rihmnmomhw|rnpoqttnt~oj_S\jrwyyzzyv}|rozsijnolmlj{}uqsrsvtlr~og[OZiqwyyzxzu{|rm~sihorqqol|xstrsunmo|ng\OWgrxzz{xysx~ulrpkqtttso}ysrpprmmj|ng]OVfpvxy{uzsywosumuwxwvq}vqqpooiqe}~}pg^PScpxzyz~xsv|qtnvxyxwpwyqnmlmyi|zay~~|rhaTQ`muz{|~{wxvznuwxutosxplljksns`s}vibTN\kuz{{}{{y{znquxvuon}zqlljjnviel~~~|wldYNVgryzz{w{svymsuuspkv~smkihj{e~q_x|~|zof]OP`nv{{}z}~uvjqsurqlounjkhipko~]p{|{zrg_SLYju|}~zytzomrutrmkyzpihfgjxdddyyzxtibXNUfs|~z~{psvjrttqnkvzpjhgfgx}_zj\vxzywldZOSeu~yz~qr~hpsvsoip}rjgfceqbrtZsyzywphaUSctzyszvjortqojm}~rjfebdlhkyYnz||{tkdYUbs{x~uxyjnrtrojl{~rjffcdjji}]n|}~|wng[Vas|x}vt|}lnqtroijxtkfecflqham~}xoh]V_p}~y~xszllpsqnjjxtmihfgmticm~}xng[T^p}}x}ws|{klqtroijywojjgioskbo~~}{vnf[T^o{}y~utz~knqtrpkn}wpkkhjqpm_o}~~{uldXS]o{|y~uwykptwurmpwpljhiqko}^r|}|yskbVS_p|{zs}vltwyvsnuunjigjvfvu]v{|zxpi_TTbr|{{|twowyzwrox|smkigjzb{lay{|ywnf\RVet}x{~v{zrx{zvpozzqjiffj~yb~eez{{yumf[RVft|w~x~xrxzyupp{xojhefjvc~cfz{|yuldXQWgu|~~wyusx{ytoozvnihefjteahzzzwtlcXQWgt|}}~xzutwzwsno{umhgefkse}_hyzzwskcWPWft{}}~wyurwywsnnyvniheei~tb|beyyyvskcXQVes{}}~xw|wqwyxsnmxwmhfddh|w`{dbxxyvsldYQUcr{~ywzzpvxxsomwwnhfdcgxz_xg^vxyvtle[RUcs}zwxovxytokryohecbdr`rpZswxvuoi_VUaq|y{otvxtpkp}{piedbdmfivZnxzywslcYV_o|}zqrvxuqkmy}rjedach}pb{_gyzzxuog\W\ky|uxzouwvrlksulfdcbfv}`wm^wz{ywrkaXYet~xxmsvwsoko{zpifeceniky\oz{zxtmdZW`p}}v}squxupklwtlgfdei}ub{cexyywuoh^W\jy}txzouwwrnmvwnigedgw|_vi^vxzwvpi_WZgv~vwovxyupmszpjfeceqbpr[qwywuqjaXXcsy}|qvx{vrnr}|qjfdbemghvYlwxvurkcYW`p}||svy{wrnq||rjfdacj~ievZivwvurldZW`o||uvy{wrnp{}rjedaci}kbw[guvvtrld[W^mz{vuy{xsnpy}qjecabg{maw[euvvtqldZV^lz|uvy{wrmoz|qidc`bh|kbvZfuuusqkcZV^mz}tvyzvqmoz{phdc`bi}hcuXhuuuspjbYV^n{svxzvqlpzzohdb`bj}dfsWktutspjaXW`o{||rwyzupmr}wmgcb`cn{_mmXotutsoh_WXcr}~z{rxzytomtulfcaadtx]sf\rtvsrmf]WZgu|z}|tyzxsnnv~sjecaaexs^v``tuvtsmf\W\iw{zytxzxrnnw}rjecabfyq^v_buvwusnf\X]jx{{xuyzwrmnw}qjecabg{oax^evwwutnf\X^kx||wvy{wrnox|qiedbch|obx^fvwwutnf\X]kx{{xuy{xsnow}skfebdh{raxadvwwutnf]X]jwy{~{uy{xsnowtlgecdhzu`xcbvwwutog]X\hu~x{~}ty{ytppwvmhfddgwx_vg_tvwutoh^X[fs}y{|tz{{vrouxoifdcfr}apn[quvutpj`YYcq{}~uz{|xsot}zpifebem~fhsZkuutsqkcZY`nyxy{}ytprz}rkfebdj{mav^brtusqle\X^jv~z}~vy{yuqpwvmgdbbftw]qhZnsusrnh_YZer||vyz{vrps|yoidcadl{dfrYgrtsrojb[Yany{wyzwsopx|rjecabgwn]t_^prsrqle]Z^jw}}~uxyxsoou~tkfcaaest[peZmqsrqmg_Z]hu~}}twwwspns|vmgca`dpw]jmWhpsrqnha[\er}~vvwwtpnqzxngca`clxadqXdprrqojb\\dq|xvwxtqnqyxohca`ckxcbrYborrqojd^]dp|yuwwtpnpxyohcb`bjxf`r[`orsrple_]cp{{uvwuqnpwypidb`biwg_s\`orsrqlf_]co{{uvvtpnpxzpidbadlxeas\`orsrpke_]dp{zuvvtpnqyypiecbenydds[borsrojd^^dp{zvvwtqorzypjfdcfoybfrZdorsrojc^^eq{~xwwwtqpt|xoifddhsv^lmYhpsrqnha\^gr||~wxxxtrqwwoifdejvr^qh[kqsrplf_\_hs|{xxxwtrsy~vnifegmym_td\kprqojd^[_it||yyywtrtz~unigehnyk`tb]kpqpnid^[`jt||zyzxust{~unigehnyiat`^lpqpnic][`jt{}zzzxusu{}unifehoyhat`^lpqpnic][_it{}zzzxusuz}unigegmxj`sb]koqomic][_hrz~|{yyxustz~vojgfhnxk^rd[hnpomic][^grz~{{zyxusty~wpjgfgmvn]qgZfmoomid^[^fpy~z|yyxussw~xpkgefktr]klYcloonjf`\]dox~{~yxxvsrv|yrkgeeiqu`fp[`jnonkga]]cmv}~zxxvtrtz{slheeipve`ra[gmonlhc^]bkt|{xwvtrsw~}vojfeflun\niYckoonjfa^`hrz}~xwvtrru{xqkgeeiqs_ep\_inonlhc_`eoxywvurqsx~{smhedgnug^qc[gmoonjea_clv~zwvusqrw}|unifefltl]nhZdloonkgb`ckt}~|xvusqru{}wpkgfglsp]jn[`inonkgc`bhr{xvusrqtz~xqlhffjrr_ep]^hmonlhd`agpyywvtrrtzyrlhffjqsacq^]gmnnlhdaagoxzwvusrtyzsmhffiptbbq`\glnnlidaafoxzxwusrty~zsmiffiptcaq`\flnmlhdaafnw~{xwussuzzsniggkqsabp`\ekmmkgc`afnw~{xwussuzysmiggkqr`cp_\fkmljgc`afnw~{xwutsv{~yrmiggkrq_eo]]fklljfb_afow~~{xwuttw|~xqlighmsn]jl[_gklkiea_ahpx~}{yxutux}}wpligintj]mhZahllkhd`_biqy~zywuuvz|vplihkqtf_oeZbhkkjgc__bjry~~zywvuvz|vpliikqsd`pd[bhkkifc__cjry~~{yxvuw{|upliilqsdapc[cikkifb__cksy~}{yxvuw{{upliilrscapc[cikkjfc__cksy~}{yxvuw{|vpljilqse`pe[cikkjgc``cjrx}}{zxvvw{|wqmkjmrtf`pg[agkkigc`_ciqx}}|zxwvwz~}wrnkjlqth_ni\`gjkjgda`bipw|~}zywvvy}~ysnkjkptl^km]_fjkjhea`bgov{|~zywvvx|ztoljkoso`fo`]dikjifb`afmtz}{yxvvx{{upljjnrqbbpe\agjjifcaaekry~~|zxvvwz}|wrnkjlpsh^lk\^eijigdbacipw}~zxwvvx{}ysokjknrn_eo`\chjjhfcacgnu{~{ywuuvz}~zupljilppc`nf[`fijigdbbfltz{ywvuvx|~~zupljikoqf^li\_eijjhecbekry~}ywvuux{~~{wrmkjkoqi]hm^]cgiihecbdjqx}~zxvuuwz}}|wrnkijnqk^en`\bgiihfdcdipw}zxvuuvy|}|xsnkijmpl^cnb\afiihfdcdiov|zxvuuvy|}|xsnkiimpm_bnc[afiiigdcdhov|zxvuuvy|}|xsnkiilpn`anc\afiiigecdhov|{xwuuvy|}|xsoljkmpl_bnc\`ehihfdcdiov|{xwuuwz|}|xsoljknql_cnb\afhihfdcdiov{{ywvvwz}}{xsolkknqk^ena\afhihfdceiov|{ywvvx{}~{wsolkloqh^il_]cghhgeccejpw|{yxwwy|~~{wrnlkmpqf_lj^^dghhfdbbekqw|~|zxxy{}~{wrommorocamh]_dghgecbbekqw|}|zyxy{~~{wrommorobbng]_dgggecbbfkqw{}|zyyz|~~{vrommprnbbnf]_dgggecabfkqw{||{yyz|~{vrommprnbcnf]`dggfecabekqv{~|}{zyz|~~{wsommorobbng]_dfgfecabejpvz~|}{zyz|~~{wspnnprocami^^beffecabejpuz}|~|zyz|~~|xspnnoqod`lj_^beffecbbdiouy}|~|zyy{}~|xtqnmnqpg_il`]aeffedbbdhnty|~|zyyz|~~|yuqnmnpqj_fmc]`dfffdcbdgmsx|~|zyyz{}~|yuqnmmoplabmf]^beffecccglqw{~}{yxyz|}}zvsommnpnd_jk`]adffedccfjpvz~~{yxxy{||{wspmlmooh_emc]_cfgfeddeinty~{yxwxz{|{xtqnllnolaalg^^beggfedehmsx}|yxwwyz{{xuqnllmomc_jj_^begggeeehmrx|}zxwwxz{{yvromlmone^glb]`dfgffeehlqw{}zxwwxy{{yvsomlmong^eld^`cfggfeegkpv{~{ywwxy{{ywspmlmnoh_dle^_cfggfeegkpuz~{ywwxy{{zwspmlmnoi_clf^_cfggfeegjouz~{yxwxyz{zwspnllnoj`blf^_cfggfeegjouz~|zxxxz{{zwtqnmmooh_clf^_befffeegjoty}|zxxyz{{zwtqnmmonh_dle^_beffeeegjoty}|zyxyz{{zwtpnmnong_eld^_ceffeeegjoty}|zyyz{||zwspnmnome_hkb^`cefeedegkpuy}|{zz{|||yvspnnoolc`jja^adeeeddegkpuy}~}{z{|}}|yvspooppkbbki`^acdeddcdgkpuy|~~}|{{|}}|yvspoopojabkh`^acdedcceglpuy|~~}|{{|}}|yvspoopojaclh_^acdedccdglpuy|~}~}|{{|}}|yvspoopojaclg_^acdddccdglpuy|~}~~|{{|}}|yvsqoopojbckh`^acdedccdgkptx{~}}~||||}}|zwtqpopokbbkia^`cdddccdgkotx{~}}~}|||}}|zwtqpoppkcajja^`cddddddgkosw{}~}}|{||}|zwtrpoopme`hkc_`bdeddddfjnswz}~}}{{{|||zxurpoopng`fle__bdeedddfinrvz}~}|{{{||zxurpooonhackh`_acdeddefimquy|~~|{z{{|{yvsqooookcaijc_`bdeeeefhlptx|~~|{zz{{zyvtqonnomf`ekf`_bdeeeefhkosx{~|zzyzzzywtqonnnmhabjha_aceefefgjnrw{~|{yyyzzywtronmnnjbaijb_`ceffffgjmrvz~}{zyyzzywurpnnnnkc`gkd_`bdefffgimquy}}{zyyyzyxuspnmnnke_ekf`_bdefffgilpuy|~{zyyyyyxuspnmmnle`dkf`_bdefffgilpty|~{zyyyyyxuspnmmnlf`cjg`_adefffgilptx|~|zyyyyyxuspnmmmlf`cjga_adefffgilptx||zyyyzyxvsqonnnlf`djga_aceeffgilptx{~|{zyzzyxvsqonnnke`djga_aceeffgilptx{~|{zzzzyxvsqonnnke`ejf``aceeefgilptx{~}{zzzzzxvsqonnnjc`gjd``bceeeegilptx{~}|{{{{zxusqoonnibaijc_`bddeeegilptx{}~}||||{zxusqpoomhbcjib_`bcddeegilptxz}~~}~}|||{zxusqpoomhbcjib_`bcdddegilptwz|}}}~}|||{zxvsqpoomgadjhb_`bcdddefilptwz|}}}~}}|||zxvsqppomgadjhb_`bcdddefilptwz|}}}~}}|||zxvsqpoomhbcjhb``bcdddefilpsvy{|}|~}}||zxvtrppomhbciic``bcdddefhlosvy{|}|~}}||zyvtrppomicbiid``acdddefhkosvy{|}}~~}|||zyvtrpponjdbgje``acdddefhknrux{}}}~~}||{zywtrpoonkeafjfa`abddeefhjnqux{}}}~~}|{{zywurpoonkfadjhb``bcddefgjmqtwz|}~~~||{{zywusqoonlhbbhje``acdeefgjlptwz|~~~~|{{zzywusqonnmjdaejgb`acdeefgilosvz|~~|{zzyywusqonnmkfacihc`abdeffgilorvy|~|{zzyxwvsqonmmkgbbhidaabdeffgiknruy|~}{zyyxwvtrpnnmlhbafjfaabceffgiknqux{~}{zyyxwvtrpnnmlicaejgbabceffgiknqux{}}{zyyxwvtrpnmmlidadigbabceffgikmqtx{}}|zyyxwvtrponmlidadihcaaceffgijmptw{}~|zyyxwvtrponmljeadihcabceffgijmptwz}~|{zyyxvtrponmlidadihcaacdefghjmptwz|~~|{zyyxvurqonmlidaeigcaacdefghjmpswz|~}{zzyxvurqonmlidaeigbabcdefghjmpswz|~}|{zyxwurqonmlhcbfifbabcdefghjmpswy|}~~}|{{zxwurqonmkgbbhieaabcdefghjmptwy{}}~~}|{zywusqpomkfbchidaabcdeefhjmpsvy{|}~~}|{zywusqpomkfbdihdaabcdeefhjmpsvy{||}~}|{zywusqpomkfbdihdaabcddefhjmpsvxz{|}~}||zywusqpomkfbdihcaabcddefhjmpsvxz{|}~}||zywusqponkfbdihdaabcddefhjmpsuxz{|}~}|{ywusqponkfbdhieaabccdefhjloruxz{|}~}|zywusqponkgcchiebaaccdefgjloruwz{|}~||zywusrponlhcbgifbaabcdefgiloruwy{|}~|{zyxvtrponlidbeigcaabcdefgilnqtwy{|}~|{zyxvtrponliebdhhdbabcdefgiknqtwy{|}~|{zyxvtrponmjfbcgifbabcdefgikmpsvy{|}~|{zyxvtrponmkhcbeigcbbcdefgikmpsvy{}~~|{zyxvtrqonmliebchhebbcdefgijmorux{}~~|{zywvtsqonmljfbbgifcbcdefgijlorux{}~~|{zywvusqonmljfbbfigcbbdefghjloruwz|~|{zywvusqonmljgcbehgdbbcefghjlnqtwz|~}{zywvusqonmljgcaehgdbbcefghjlnqtwz|~}{zyxvusqpnmlkhdadhhdbbcefghjlnqtwy|~}{zyxvusqpnmlkhdadhhdbbcefghjlnqtwy|~}|zyxwusrpnmljgdbdhhdbbcdfghjknqsvy{}~~|zyxwusrpnmljgcbehgdbbcdfghiknpsvy{}~~|{yxwusrpnmljgcbehgdbbcdeghiknpsvy{}~~|{zxwutrpomljfcbfhfcbbcdefhiknpsvy{|}~}{zywutrpomljfccghfcbbcdefhiknpsvxz|}}|zywvtrponliebdghecbbcdefgiknpsvxz{}~}|zywvtrponliecdhhebbbcdefgiknpsvxz{|~}|{yxvtrponliecdhhebbbcdefgiknpsuxy{|~~|{yxvtrqonliecehhebbbcdefgikmpsuwy{|~~|{zxvtrqonliecdhhebbbcdefgikmpruwyz|~~|{zxvtrqonlifcdghecbbcdefgikmpruwyz|~~}{zxvtsqonljfcdghfcbbcdefgikmortwyz|}~}{zxvusqpnmjgccfhgdbbcdefghjmortwyz|}~}{zxwusqpnmkgdcehgdbbcdefghjloqtvxz|}~}{zxwusqpnmkhdcdhhecbcdefghjlnqtvxz|}~}{zxwusqpnmkieccfhfdbccdfghjlnqsvxz|}~}{zxwusqpnmljgcbehgecccdfghjknpsuxz|}}{zxwusrpnmljgdbdghfcccdeghjkmpsuxz|~}{zxwusrpomljhebcfhfdccdeghikmpruwz|~}{zxwusrpomlkheccfhgeccdeghikmoruwz|}}{zxwutrpomlkifcbehgeccdefhikmortwy|}}{zxwutrpomlkifcbeggedcdefhikmortwy{}~|zxwutrponlkifcbdggedcdefhikmoqtwy{}~|zxwutrqonlkigdbdggedcdefhikmoqtvy{}~~|zywvtrqonlkifcbdggedcdefgijloqtvy{}~~|zywvtrqonlkifcbeggedcdefgijlnqsvxz|~~|{yxvtsqonmkifcceggeccdefgijlnqsvxz|~}{yxvusqonmkifccfhgdccdefgijlnqsvxz|}}{zxvusqpnmkhecdfhfdccdefghjlnqsvxz{}}|zxwusqpnmkhecdghfdccdefghjlnqsuwy{}}|zxwusqpnmkhecdggfdccdefghjlnpsuwy{}~|zywusqpnmkheceggedccdefghjlnpsuwy{|~|zywusrpnmkheceggecccddfghjlnpsuwy{|~|{ywusrpnmkheceggfdccddfghjlnpruwxz|~|{ywutrpomkhecdghfdcccdeghikmprtvxz|~~|{ywutrpomkheddghfdcccdefhikmprtvxz|~~|{ywvtrpomkifddfggecccdefhikmortvxz|~~}{ywvtrpomligdceggecccdefhikmoqtvxz|~}{ywvtrqomljgdceggfdccdefhikmoqsvxz|~}{yxvtrqonljhecdfgfedcdefgikloqsvxz|}}{yxvtrqonlkhfcceggedddefgijlnqsuxz|}}{yxvtrqonlkigdcdggfdddefgijlnpsuwz|}}{yxvtsqonlkigdcdfgfeddefgijlnpsuwz|}}{zxvtsqonlkigecceggeddefgijlnpruwy{}~{zxvusqpnmkjhecceggfddefghjlnpruwy{}~|zxvusqpnmkjhecceggfedefghjlnprtwy{}~|zxvusqpnmkjhfccdggfedefghjkmortvy{}~|zxvusqpnmkjhfdcdggfedefghjkmortvy{}~|zxwusrpnmkjhfdceggfedefghjkmoqtvx{|~|zywusrpomljhfdceggfedefghikmoqtvxz|~|{ywutrpomljhfdceggfddeeghikmoqtvxz|~}{ywutrpomljhecdfggedddeghikmoqsvxz|~}{ywvtrpomljgeddfgfedddefhikmoqsuxz{}}{yxvtrpomljgedefgfedddefhikmoqsuwy{}}{zxvtrqomljgedefgfddddefhikmnqsuwy{}~|zxvtrqomljgedeggfddddefgiklnqsuwy{}~|zxvtsqonljgedeggfddddefgijlnpsuwy{}~|zxvusqonljgedeggfddddefgijlnprtwyz}~|zxwusqonljgedefgfedddefgijlnprtvxz|~|zywusqonljhedefgfedddefgijlnprtvxz|~|zywusqpnljhfddfgfedddefghjlnprtvxz|}{ywusrpnlkifddeggedddefghjlmprtvxz|~}{ywusrpnmkigddefgfeddefghjkmoqtvxz|~}{ywusrpnmkigeddfgfeddefghjkmoqsvxz|~}{ywusrpnmkjheddeggfedefghikmoqsuxz|~}{ywutrpomljhfdcdfgfeeefghikmoqsuwz|~}{ywvtrpomljhfdcdfgfeeefghikmoqsuwz{~~{ywvtrpomljigecdeggfeefghiklnpsuwy{}~{yxvtrqomljigeccefgfeeefhiklnpruwy{}~|zxvtrqomlkigedcefgfeeffhijlnprtwy{}~|zxvtrqonlkigedcefgfeeefgijlnprtwy{}~|zxvtsqonlkigedcefgfeeefgijlnprtvy{}|zxvtsqonlkigedcefgfeeefgijlnprtvxz||zxwusqonlkigeddefgfeeefgijlnprtvxz|~}zxwusqpnlkigeddefgfeeefghjlmortvxz|~}{ywusqpnmkigeddegffeeefghjkmoqsvxz|~}{ywusqpnmkigeddfgfeeeefghjkmoqsvxz|~}{ywusrpnmkigedefgfeddefghjkmoqsuwy{~}{ywutrpnmkigedefgfeddefghjkmoqsuwy{~~{ywvtrpnmkigedefgfeddefghikmoqsuwy{}~|zxvtrpomkigedefgfeddefghikmoqsuwy{}~|zxvtrpomkigedefgfeddefghikmnpruwy{}~|zxvtrpomkigedefgfeddefghiklnprtwy{}~|zxvtrqomkigedefgfeddeefhiklnprtvxz}~|zxvtsqomljhfddfffeedeefhijlnprtvxz||zxvusqomljhfedefffeeeefgijlnprtvxz|}zxwusqonljhfedefffeeeefgijlnprtvxz|}{ywusqonlkigeddffffeeefgijlnoqtvxz|~}{ywusqpnlkigeddefffeeefgijlmoqsvxz|~}{ywusqpnlkihfdddffffeefghjkmoqsuxz|~}{ywusqpnmkjhfdddefffeffghjkmoqsuwz|~~{ywusrpnmkjhfeddeffffffghjkmoqsuwy{~~{ywutrpnmkjhgeddefgffffghjkmoqsuwy{}~|ywutrpnmkjhgeddeffffffghikmnpsuwy{}~|zxvtrpomljigeddeffffffghikmnpruwy{}~|zxvtrpomljigeddeffffffghiklnprtwy{}|zxvtrqomljigeddeffffffghiklnprtvx{}|zxvtrqomljigeddeffffefghiklnprtvxz}}zxvtsqomljigeddefffeefghijlnprtvxz|}{xvusqonljigeddefffeeffhijlnprtvxz|~}{ywusqonljigedefffeeeffgijlnoqtvxz|~}{ywusqonljhgedefffeeeefgijlmoqsuxz|~}{ywusqpnljhgeeefffeeeefgijlmoqsuwy|~}{ywusqpnljhgeeefffeeeefghjkmoqsuwy{~~{ywusrpnljigeeefffeeeefghjkmoqsuwy{~~|zwutrpnlkigeeefffeeeefghjkmoqsuwy{~~|zxvtrpnmkigeeefffeeeefghjkmoqsuwy{}~|zxvtrpnmkigfeefffeeeefghikmnprtwy{}~|zxvtrpomkigfeeefffeeefghikmnprtvx{}|zxvtrpomkjhfeeefffeeefghiklnprtvxz}|zxvtrqomkjhfedefffeeefghiklnprtvxz|}{xvtrqomljhgedeefffeefghijlnprtvxz|}{yvusqomljigeddeffffffghijlnprtvxz|~}{ywusqonljigfddeffffffghijlnoqtvxz|~}{ywusqonlkigfeddefffffghijlmoqsuxz|~}{ywusqpnlkihfeddefffffghijlmoqsuwz|~~{ywusqpnlkihfeddefffffggijkmoqsuwy{~~|ywusqpnlkihfeddefffffgghjkmoqsuwy{~~|zwusrpnmkjhgeddefffffgghjkmoqsuwy{}~|zxvtrpnmkjhgeddeffffffghjkmoqsuwy{}~|zxvtrpnmkjhgeddeffffffghjkmnprtwy{}|zxvtrpomkjhgeddeffffffghiklnprtvx{}|zxvtrpomkjhgeddeffffffghiklnprtvxz}}zxvtrpomljhgeddeffffffghiklnprtvxz|}{xvtrqomljhgeeeefffeefghiklnprtvxz|}{ywusqomljhgeeeffffeefghijlnprtvxz|}{ywusqomljhgeeefffeeefghijlnpqsuxz|~}{ywusqomljhgeeefffeeefghijlnoqsuwz|~~{ywusqonljhgeeefffeeeffgijlmoqsuwy|~~{ywusqonljigfeefffeeeffgijlmoqsuwy{~~|zwusqpnljigfeefffeeeffgijkmoqsuwy{~~|zxvsrpnlkigfeefffeeeffghjkmoqsuwy{}~|zxvtrpnlkigfeeefffeeffghjkmoprtwy{}~|zxvtrpnmkihfeeefffeeffghjkmoprtvx{}|zxvtrpnmkihfeeeffffeffghikmnprtvxz}}zxvtrpomkjhgeeeeffffffghiklnprtvxz}}{xvtrpomkjhgeedeffffffghiklnprtvxz|}{yvtrqomljigfedeefffffghiklnprtvxz|}{ywusqomljigfedeefffffghiklnprtvxz|~}{ywusqomljigfeddefffffghijlnoqsuxz|~~{ywusqonljihfeddefffffghijlmoqsuwz|~~{ywusqonlkihfeddeeffffghijlmoqsuwy{~~|ywusqpnlkihfeddeeffffghijlmoqsuwy{~~|zwusqpnlkihgeddeeffffghijkmoqsuwy{}~|zxvtrpnlkihgeddeeffffghijkmoqsuwy{}~|zxvtrpnmkihgeedeeffffggijkmoprtvy{}|zxvtrpnmkjhgeedeeffffgghjkmnprtvx{}}zxvtrpnmkjhgeeeeffffffghjkmnprtvxz}}zxvtrpomkjhgeeeeffffffghiklnprtvxz}}{xvtrpomkjhgeeeefffeffghiklnprtvxz|}{ywtsqomkjhgfeeefffeffghiklnprtvxz|}{ywusqomkjhgfeeeffeeffghiklnpqsuxz|}{ywusqomkjhgfeeeffeeffghijlnpqsuxz|}{ywusqomljhgfeeeffeeffghijlnoqsuwz|~~{ywusqomljhgfeeeffeeffghijlmoqsuwy|~~|ywusqonljigfeeeffeeffghijlmoqsuwy{~~|zwusqpnljigfeeefffeffghijlmoqsuwy{~~|zxusrpnlkigfeeeefffffghijkmoqsuwy{}~|zxvtrpnlkihfeeeefffffggijkmoqrtwy{}|zxvtrpnmkihfeeeefffffgghjkmoprtvx{}|zxvtrpnmkihgeeeeeffffgghjkmnprtvx{}}zxvtrpomkjhgfedeeffffgghjkmnprtvxz}}{xvtrpomkjhgfedeeffffgghiklnprtvxz|}{yvtrqomljigfeddeefffgghiklnprtvxz|~}{ywusqomljigfeddeefffgghiklnprsvxz|~}{ywusqomljigfeddeefffgghiklnoqsuwz|~~{ywusqonljihfeedeefffgghijlnoqsuwy|~~|ywusqonljihfeedeefffgghijlmoqsuwy{~~|ywusqonlkihfeedeeffffghijlmoqsuwy{~~|zxusqpnlkihfeeeeeffffghijlmoqsuwy{}~|zxvtrpnlkihfeeeeeffffghijkmoqsuwy{}|zxvtrpnlkihfeeeeeffffghijkmoprtvy{}|zxvtrpnmkihgeeeeeffffgghjkmnprtvx{}}zxvtrpnmkihgfeeeeffffgghjkmnprtvxz}}{xvtrpnmkihgfeeeefffffghjklnprtvxz}}{yvtrpomkjhgfeeeefefffghiklnprtvxz|}{ywusqomkjhgfeeeeeeeffghiklnprtvxz|}{ywusqomkjhgfeeeeeeeffghiklnpqsuxz|}{ywusqomljhgfeeeeeeeffghijlnoqsuwz|~~{ywusqomljhgfeeeeeeeffghijlmoqsuwy|~~|ywusqonljigfeeeeeefffghijlmoqsuwy{~~|zwusqpnljigfeeeeeefffghijlmoqsuwy{~~|zxusrpnlkihfeeeeeffffghijkmoqsuwy{}~|zxvtrpnlkihffeeeeffffghijkmoqrtwy{}|zxvtrpnlkihgfeeeeffffghijkmoprtvy{}}zxvtrpnmkjhgfeeeeefffghijkmnprtvx{}}{xvtrpnmkjhgfeeeeefffghhjkmnprtvxz}}{yvtrpomkjhgfeeeeefffghhjklnprtvxz|}{ywtrqomkjigfeeeeefffgghjklnprtvxz|~}{ywusqomljigfeeeeefffgghiklnpqsvxz|~}{ywusqomljigfeeeeefffgghiklnoqsuwz|~~{ywusqomljihfeeeeefffgghijlnoqsuwy|~~|ywusqonljihfeeeeefffgghijlmoqsuwy{~~|zwusqonlkihfeeeeeefffghijlmoqsuwy{~~|zxusqpnlkihgfeeeeefffghijlmoqsuwy{}~|zxvtrpnlkihgfeeeeefffghijkmoqrtwy{}|zxvtrpnlkihgfeeeeefffghijkmoprtvy{}|zxvtrpnlkihgfeeeeefffggijkmnprtvx{}}zxvtrpnmkihgfeeeeeeffgghjkmnprtvxz}}{xvtrpnmkihgfeeeeeeffgghjklnprtvxz}}{yvtrpomkjhgfeeeeeefffghiklnprtvxz|}{ywusqomkjhgfeeeeeefffghiklnprtvxz|}{ywusqomkjhgfeeeeeefffghiklnpqsuwz|~~{ywusqomljhgffeeeeeeffghijlnoqsuwz|~~|ywusqomljigffeeeeefffghijlmoqsuwy|~~|zwusrpnlkihgffffffffgghjkmnprsuwy|~~|zxvtrpnmkjiggggggggghhijkmnprsuwy{~~|zxvusqonlkjihgggghhhhijklmoprtuwy{}}{ywusqpnmljihhhhhhhiiijklmoprtuwy{}}{ywutrpomlkjihhhhiiiijkklnoqrtvwy{}}{ywvtrqonmkjiihhiiijjjklmnoqrtvwy{}}{zxvtsqpnmlkjiiiiijjjkklnopqstvxy{}~|zxvusrponmkkjjjjjkkkllmnopqstvxy{}~|zywutrqpomlkkjjjkkkllmmnoprstvxy{}~|{ywvtsqponmlkkkkkllllmnnoqrsuvxy{}~~|{yxvusrqonmllkkkllllmmnopqrsuvxy{}~~}{yxvutrqponmllllllmmmnnopqrsuvxy{}~~}{zxwutsqponmmllllmmmmnoppqstuvxy{|~}{zxwvtsrqponmmmmmnnnnoopqrstuwxy{|~}|zywvutrqponnmmnnnnnnoopqrstuwxy{|~}|{yxvutsrqponnnnnnnoooppqrstuwxy{|~~|{yxwvtsrqpoonnnoooooopqqrstvwxy{|~~|{zxwvusrqppoooooooooppqrrstvwxy{|~~}{zywvutsrqpoooooooppppqrstuvwxz{|~~}{zyxvutsrqppppppppppqqrrstuvwxz{|~~}|zyxwvutsrqqpppppppqqqrsstuvwxz{|~~}|{yxwvutsrqqqqqqqqqqqrrsstuvwxz{|}}|{zywvutssrqqqqqqqqqqrrsttuvwxz{|}}|{zyxwvutsrrqqqqqqqrrrsstuvvwyz{|}~|{zyxwvutsrrrqqrrrrrrrsttuvwxyz{|}~}{zyxwvuttsrrrrrrrrrsssttuvwxyz{|}~~}|{zyxwvutssrrrrrsssssttuuvwxyz{|}~~}|{zyxwvuutssrrrssssssttuvvwxyz{|}~~}|{zyxwvvuttsssssssstttuuvvwxyz{|}~~}|{zyxxwvuttsssssstttttuuvwwxyz{|}~~}|{zzyxwvuuttsssstttttuuvvwxxyz{|}~~}|{zyxwwvutttttttttuuuuvvwxxyz{|}~~}|{zyxxwvvutttttttuuuuvvvwxyyz{|}~~}|{zyyxwwvuutttttuuuuuvvwwxyyz{|}~~}|{zzyxwwvvuutttuuuuuvvvwwxyyz{|}~~}|{{zyxxwvvuuuuuuuuuvvvvwwxyzz{|}~~}||{zyyxwwvuuuuuuuvvvvvwwxxyzz{|}~~}}|{zyyxwwvvuuuuvvvvvvwwwxxyzz{|}~~~}|{zzyxxwwvvvvvvvvvvvwwwxyyzz{|}~~}|{{zyyxwwvvvvvvvvvvwwwxxyyz{{|}~~}||{zyyxxwwvvvvvvvwwwwwxxyyz{{|}~~}||{zzyxxwwvvvvwwwwwwwwxxyyz{{|}~~~}}|{zzyyxwwwwwwwwwwwwwxxyyzz{{|}~~~}}|{{zyyxxwwwwwwwwwwwxxxyyzz{{|}~~~}}||{zzyxxxwwwwwwwwwxxxxyyzz{{|}~~~~}||{zzyyxxwwwwxxxxxxxxxyyzz{{|}~~~~}||{{zyyxxxwwxxxxxxxxxyyyzz{||}~~~}}|{{zzyyxxxxxxxxxxxxxyyyzz{||}}~~}}|{{zzyyxxxxxxxxxxxxyyyzz{{||}}~~}}||{zzyyyxxxxxxxxxyyyyyzz{{||}}~~~}||{{zzyyxxxxxxyyyyyyyzzz{{||}}~~~}}|{{zzyyyxxxxyyyyyyyyzzz{{||}}~~~}}||{{zzyyyxxxyyyyyyyyzzz{{||}}~~~}}||{{zzyyyyyyyyyyyyyzzz{{{||}}~~~}}||{{zzzyyyyyyyyyyyzzzz{{|||}}~~}}|||{{zzyyyyyyyyzzzzzzz{{|||}}~~~}}||{{zzzyyyyyyzzzzzzz{{{|||}}~~~}}||{{{zzzyyyyzzzzzzzz{{{|||}}~~~~}}|||{{zzzyyyyzzzzzzzz{{{||}}}~~~~}}|||{{zzzzyyzzzzzzzz{{{{||}}}~~~~}}}||{{{zzzzzzzzzzzzz{{{|||}}}~~~~~}}||{{{zzzzzzzzzzz{{{{{|||}}}~~~~}}|||{{{zzzzzzz{{{{{{{{|||}}}~~~~}}}||{{{zzzzzz{{{{{{{{{|||}}}~~~~}}}||{{{zzzzz{{{{{{{{{{|||}}}~~~~}}}|||{{{zzz{{{{{{{{{{{|||}}~~~~~~}}|||{{{{{{{{{{{{{{{{||||}}~~~~~~}}|||{{{{{{{{{{{{{{{{|||}}}~~~~~~}}}|||{{{{{{{{{{{{{{||||}}}~~~~~}}}|||{{{{{{{{{{{{{{||||}}}~~~~~~}}|||{{{{{{{{{{{{{|||||}}}~~~~~~}}}|||{{{{{{{{{{{||||||}}}~~~~~~}}}|||{{{{{{|||||||||||}}}~~~~~~}}}||||{{{{|||||||||||}}}}~~~~~~}}}||||{{{|||||||||||}}}}~~~~~~}}}|||||{||||||||||||}}}}~~~~~~}}}}|||||||||||||||||}}}}~~~~~~}}}}||||||||||||||||}}}}}~~~~~~~}}}|||||||||||||||}}}}}}~~~~~~~}}}}||||||||||||||}}}}}}~~~~~~}}}}|||||||||||||}}}}}}~~~~~~~~}}}}|||||||||}}}}}}}}}~~~~~~~~}}}}||||||||}}}}}}}}}}~~~~~~~~}}}}|||||||}}}}}}}}}}}~~~~~~~~}}}}}|||||}}}}}}}}}}}}~~~~~~~~}}}}||||}}}}}}}}}}}}}~~~~~~~~}}}}}|||}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~~}}~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m41.bin b/applications/PoP/poc/res/music/m41.bin deleted file mode 100644 index fae6352..0000000 --- a/applications/PoP/poc/res/music/m41.bin +++ /dev/null @@ -1,2 +0,0 @@ -ĺ}yfK2:HG``v|qrDDhyjK^P~veZvyc{uVhM+`z`Nba\cfpzd{{}pXf`ziv_m~vc~Zpr{bfHWQn|rW_\|YaYsx}rryg;Hx>FKmiwpg_Qoy]jx|rfYedvuqs^hVHHJTL^v{`pQb~~wűJ=2trNKPKJssswlaqi[XXQg~q|gTXflkhYc]_n}uuw{xo{m^uc~uz{uvj;16Y{ɺ~Qe`JRYZWgcfDQBPJCTo_meMWHqf{{~{rjxSlalon|~|vut~~m~q{ƯȮR91*MS~i_mJVALSDUBKJUJg_o~wlja\TjyouyrVWdpoxo|o{}zs~hqwtN?156Szֵ|qf_SWcgNRXQeJL_uuxr~alqmsqm|xpz~l~o}{fl}}i}yrx}{eNO0@,/XӺuhwdlU`]i[cafmqzuyoxwxsnu{tydsaztovWulh}pqygr{{ZSFB1/:GѲckkcw\Zqzwyvqy}zy|txvvY^mcdaieSvgquvzw~xpupw}^[U@M+#7,65JSYnȲxos}u|w}ozt{syjzv}|^elYYa`fyzywsr~ytzmyawusr^\VIGUQH8X]a~osur|trvywyzsz|o||~~y|~zq]cW[lTc{|u~muu{xpul_nnR^W?6AJAHW`kòq}{o~~~uvviyu~|yun~}~|ohreaid`iohuy~~{lwpoz~vt^`\WHUVN;LQAVmuȽ{nqk~qx|ztw~zpxz{wzjhbhz_btq{q{ztt}py{vdplScbK?JPGGJGDYexxq~{{yrwkoqtx}v~~x|hmrnhmm`ryl|lqkpvdifbXd[H9NE3BHMo˸°wsxzztvxzottv~~hxyrvtiyzbquunbrzvtzxn~}~s|k\piXOZJGEJ<4=JqvǸ|z}ntvjtwpyw}r}oy|uyxsywiun_{~rtqtvehbaXlgTEXM9?89PWm~ųº~~wv{}z~vxwfny~kwzru}~x~|o{q\fbomx{}ry|oZkk^Zk\SMOJ677QQPzº|{rut~lrp~zxrtosty{tx|zyzrYattvwwvnysyln\cj]MVU<;?6IEOTmĸx{wxmskziv}yj|{sw|z}syqnnkkhf{tzu|~xqkvl]bhVZKQ@;>HTCJg|u|zutxq~ltz}kuvnoowtybnulkux|r~~t|onYffZUg`B<:?Wfsrxw~rzlzjhry}okytp|pro}hnvnizz~zxx{~txjegXN[bMC>6NFMHNei~óxxuz{ppkddjsztv~tsyyuttzajlej}|}zrtjlSZQXYB@CULAQZcYpºwtpvvejwpvkes|swpnu|ovqh|{{~zj}r}pkp_U_eQGG?N@ILLa^kkiȻ~w}riynheh~sy}isvzy|z{yxo}gmlej{~|znk~z|x[dV\YHIKP>;MVXMio|pxlukm|t|~wtriwwqtw{ltzkqvsuzzx~soqqd[d`LFDPYCK?P_^bY^{q~~y}ykmgvuoto{m~u|ww~wmwkbmzokw~}nv~mgbScPLT`W>AMTFLYVrn¬{xx~oqu|mfuryvqs{qgmoxxjsf|wy{r|pmxomwtZNIL_NXKCXZ\MDXnyy{xrzkfh{|kxi{sitxpzxxmxvszrghqxzwxzfoZRS^[HHILDOYM`Var~szmtrfnuspz}vtxfekyxz~~nsnx~untoq}}fWQ[aOaRSZUXKGU_bmwu·|ywni~vvzfy}~{w}|xskssw|~v}yrxpffszpts|c_di[PVVM:OLJUAMV_x~{wszoilnhj{~yt~~ogk~q~~xxuwury~vtqztj_eeTcT\g^QABRYW^`Yy~{yxwqum{{zshvzrrt~tt{qtu~|uls~lzszxoik_NPXYKTOJ]IDDGVm}¹}{uptsi_thqw~wuq{mqr{nw|zw}|nsur}}rotw[e_RdgeRBJZ]ZWDW_bxyp~rw|scan}~{znhqxyv{}x}}{yurqup{}~u`WVVQQ`GJQEJGIXiik{mgpvloxfxsmyx}}rrkusntzw~qqy{zvs|}go^Zea_RJLQW]YI[W\uz|z{nqzheqy{x}|tglssqzytxz|z|vp}v~~}hWWXPQfU[V?DFJS\\\dyunmjq|cnpchq~}twu}xfwzt|}plrvu}y{qr~mzqZde`SOW^YRTGVWKfmttu{yyogjrwywq~||nggkn}svw~{{xsw||~ylf\SM\PN`NC@GWdbX[f|ytwujktvzeddi|pvpqwzzv{x||xsspy}twp{zing`SGLY`]SBU_Rcfitwxwlmv|xupbv|y{rtphdy{u{wxxz~ty||ujhh^WfVS`RMGAJ[^XW_smy~uwyrrvfx{hddlwrz|q~{tkjwv{zzzuqzylxlvtfUQUZ]^RCOINddenzy{yzzges}}wgj|l{silspq}n~{z{y~|yu{y}sqnjekaM]VJMPSVVVWZc`]yzyutv|xnumgdkvvs|~pruhkz{}tw|~x|qp{|pzytfVT\\YVO^UCXaabcbagv}{vtx}|mdreizxpmlwil|vwxx|os~ojnqnzyagaQJJS\[MKTa]Pfffz}wy|zmmpruwuomyzzwzzxojpywx|vy~vwx{n{{okjfd_PH]TKUT\ce[SY`gz}x|yzqx}eoyuzywwrn{w}ylosyy}{}||}tposrkwaUTRXccYNLYRRbRXhowzljr{|rjkrwqy|sr{}zwuo~v{u|~uvx~y||{rlqvneZSaVVd[RU[TLJOWc}}~{hslqutwz~|xxzty|mnily{u|}~uzsruxfXTY]\ZYXXKJaVOX`dcr~xrzvlmufmy|ylmzwjvxxu}}tsx}utz}}yhR^[J\cb_XTQPPLMcfctxv{rssjhrvv~{u}vliq~~uxy{|rvu|yozrmiabg_UV]_IKYPX\XUW`s~}{{|ywvqcrsmxv{|hrtoyww{u~y}~rlt{rfk^V`]^a^NAFNQSb`bxz|on{vogfouy{ysqxxx|}|~}zy|~~}y{|uzwpjkmg_XSW_QWXDQ]_XR\kv|}|sw~|fnugn|yu{}{zv|kzvpuww}~zvy}ueqkS^a\\b_SHCJP`^Qiokwzz~{~}obcegq|qlo{{ss|zt}zu{zyrmqqsyr_VXZMObSKOWZUU\juz}}z}rustxflstxz{yjsqs|~wtu~{x|}|z~{xvoxwgme]\XRMLLFE\f[ihdjoyz{}~qgdffuzw{vqv}rr~~zwv{}{mimuxslaZ_PM[QTYRNRZdhjoju}vk{lmqrjhwrz}uyzyw|ztzx{}yz|nfyqgurgaaVJKOMJROTia[aly~|uqnlhdn{lz~yzyy|{}{yzn~{zx|z|}xwor{vmlk\M\SJW[VGCRagfad|{wm}ttxrmijtx{mt}zzzz{s|vpyyp|ytpeWMHFKP^WH]`ZYXcs{wmpqljsgkxvzz~vxnryss~xyu{~~xxzwurup[_YMRWYSMLT_b[Sefhnt~{obens{yz|ymksyyyzw{vx}uk}}{zkVQNHJ\TNVMPVZ_gmmq~qjor|~iswjlu{yv}w}xn|~~}~zv}xxww~xuy~pjt\U[WQMOTTQXUYfXasuyvzyplpuspn~vuc\`dnwnehuthmnO66^sjP6JgbJAJ_yŸzppx{jSUoibjWwxppjdgf|zhdtun~omxyyhL;A`ub@:MgxW?CK[l}~kgga_`bc]WSMcvdqdPTuvalvwzvu{{eJ4APZwmJ2/JpxdWXQLjppʺsgjbbm_V[g|pj`r}fY[j|~pkkoysmpu|v{{aYSHEO`nrdK/3LXt}{{vqyyzsopt{yrfZjjfkjltumjmriZqzxoxlfx|tlf]UQMPTbci{n_P>36DR`m{z~Ȱxqjkbj~tmpqnlb`h\bkmsvrio~}~zogjplV[cZ`holektsj]GA9'=S^is{~|}hlpmjlomq|xpmnlkifhu|uv{{|zmbchkm}|kvqaWROKA6:ETWTnvwzz}~|ztomi^X^kge|zyytm}~xsu{wrqmcRNWB:?CKRTPT_jxx{|z|}xtthggSY`^hrtqtwy|ww|we\ROSQF96CIBRSSdp}zrpmwso|qb`ejjcYUV_cfywy}oeTOUGJMCDMQKEHPVe}|}zwmejrskaZhjX]_]^dkikrxx|j_\ZZWPJDC=BTJIT\_br{ps{knymdYWahcYTZ`Vewox~{yfYbWMZXPHEECCDFOdenvnjlrsn\UbZ_f`aeebhmps|vzrd^`\SPQTI;LLIQRSTXh|}}pmuljifcfhd`]_V[igr{~|vu}wee\RZZ[\WIAEHGFSRUkry~uostrskkm[dojea_XV_ko{z{ytmf\TT[QJPDISTMGLWcq}|~~qkknqmcaeifV_dZgvzvv{~~zhag_[\ZNA=CHOYLTa\coyzrhrucfknqoe[XX[duyqvxsc]\]SS]KELSQKIPY^cgt~yuqsz}ugbim_dcY`eknms|~{y~zppifc`ZRLC>EULJUQRXfyst~swwljnl`VUWXewr{zvsx}ncd\P]YQRLJHIMPTXX[v|}xvwzzvqkkdepa\bdbcmw}~ss~qhc[PMNLFJRLXXMMQXgx~s{wm{~xromgb\WVbcbyzvyy{ztn^W_SRYWMCGQWVSMQcds|uuvuccqgffc_Z]ly|~y|y~zoeYPMMLPN?OWQOOVajpyu{}|zth^_ba\dh_mutuv|~~{|p\bZPTWULCDNWYTO`aawxrszsinddmmf]]cjszvt|x{q^QNKIP\PMRNPQRW`dfpx{{{~{ma^aafhZdjemu{}}~~zmobTWVSONONNRSNYXViq}xvxrnzmbhmkb]`fimqv}}~qbVPKLTKRUHGNV]a__do{xumhb^`nqdkjbbgt~~}zs{m`]YRIIPTQLJRaYZfjnw}~ps{polihfghhhf`n}u~zniaWR[TN\VMFEP[^YY_kksupoldbkejoc`bfp}}~xxzppg\SNOUWTIAQRS``dkqu{yw~suyth`dkmjf`ero}z{|upj``WNXSPPMLRYXWW_]`tyxpnppstenvkd_aglqvzy}|z|xkZSTUVWQNTJR_^\]`^`lywy}}ujgmrph\cf_p}{wz~yyxtuwc^bUPOQSQMMRX[QYeao|xtrz{knokkhgjlhhq|}wx|~{pe`_[UMPXJITY^_]WW[bm}~ytqonpphmkblpt||wutuz}|{ztkj]VSSX\XMIPYRR]W\gr{}|y}z~|lhjlmlgddlws|z}yrpkc^WO[XSYSRWZUNNTYd{yy}|umgiredmmov~{wxxtw|{y~xeZUTVYWRMNQNZ[RZbfkt|~utmioutkedjii}}y~xz}zzzreVQYOQ\ZUTXWSQQRZikyzw{~xjkwnprmlllmptwy|~|x}ri^[\[USSUPES[UZ]__an}zvplnsqlhkibovv~y}{~yvy{yti[_XQYZYWRKJOSUXfhj}vnrikwvrqqlhntvy}z~|{|xqke^[VPNSYNMTPXab__ep}{yyzyupooqockpjv~{|~{xy{yx{|xoef[PXXW[\VLINTWa`_qt{yxvnvwwuphcchqz}~~|z~vtqooi\SPQTMTXLQ[`^Z^hqx{xz}tlnutipmhov}}|~}}{xxx~|zyyrnuh__YVTTPLIHMXf`dolnvwyvyyuy|xmgefgty}}|{urrrsocXTVOKYTPSTYZ]agkopz{sptnswjlppptzz~yw}|{zsnwpine^\YSNNMIHVXZgccip}~xuupjgefmwu}||y|uxvy|yqia]TMWRQWUOLQZaceek}~}ymt{qqqpljr~y~|z~|v~zvxvztj`YPJIMNPVOXd^\\bkvxrqokflmhw~}~}yuy}|~|{}|vrpm[W[PQWXTLLT\_]W_jhzvyxsxwqjfiqz||}z{}||vx|yuj\RNLKPWLMWVYZ]ckmr}smoqpusktusy{~|}}{}~}zz}x}|zxwxmeeWTVVSOMMPV[X[eaiv~tv{{tlkoqswv~{|}~yyz~z}|}{~{vl]SPNNXWSZQNSW\`bcgq}uposznntmmr{}~~~|{v~{wwz}yx{zosn][ZVQOSUSPPP\^Yems}}|yxtpooppoq{z|ywwz|z}~tkbXPOUNQZTNMS\cb_ahru~|xru}vyzolknyzzrx}x}yxw{zyqxujh`YQKMSVUPKX`\fikov|zssvwtplgrxy|z}y{~~~~zw}~|ztmhe_X[UPYVRPNPY__`cklo~}zwyqr}vpmnrw|~}}|xy{}yy{{z}~rszpnng[QOQSTTMNTR^ijmruv|ypouywrjquq~{x|}||yx{w~~~|xqnjfbbXNVROQSUWXY]bhggwz~||~{u|xuqnorsrx~~vx|vx{{}zywyprsneYRQRQQNVZPYcfikjiltzwvwxtlrokv}|z{|ywx~|{{y|y}xnklkkpd]]SNLOTXUQT^fbfqnv|{}{rsuvwuroqz}}~~~ytsv{~yrvvrje`ZURKJURQXZ`hkgehms}}~{vurwzotxvz~||{zyw{zuz|~~vpmmsmfj^TPORWXTPQY[^jfiry}uqtxytnnqvu~~zyxtr||}}|{yuokjibYQNVRT\YVX]][]`foxntzrvxvwz|||||{}}|ys}}{zwy~||ztt{uswlaWRSTSRRSTNWc^bhlor~zx{}ysprplz~}z~~|vrsvwx~z~|z{zttutofWSWMRZZZXVUVYZZcml}y|{w}xuspnrx{}~|u}xx~wu{xw}|}tv|snia][VQPTVMPXV]bcabiu}{xwvwrkttu~~||usstwxu~~}yuvxwsjddWVZXXXUMINTW]fclx{uz}zuolntw|}|vz}}zwvx}~z}{{vrnke]UQQVSPWPPZ``]_fnvwvy{qqvnry|}|sqrr{{y{|~}|}|{ytkni[]\YYZXQLJMR\_[glmv~}}{skijls~y{|zxy||zzxy{{zvuttrj]UTUNQZRQTXZY[`flrw}wx{uxxoqtvy{yxsqvzuywy~{|}yvqvtjjc[XUQMMLKLY_]hhgjp|}{tokjjtxz}ytsw|}{vvzusttqibZXQNVSRVUTTZ`egjjo|{st}vstsqot|}xw}wz}{xvz~|}|yopumnpia\WPLMNMOUS_gdfjq{{vqpomlrurxtvy|}ysyzz}xvwvpjfcXPVQOUWUOOW`eggjx|yszvvyvrnou}~~~~tw}yy{||}~~~zxwyquupjcXNJIKNUXQZaaceiqx}|spqpnrplwy||vuwyzyyzz|y{~{xtpnmlaZZPPTUTQQSY_b`eony|~{swzxqlmpuz~}}|~||wvw{~|xx|z~}vrxwusnbUOKIKTQRXUY_dinqsy{sooqwypuwruz|zxur{|w}{yy{vrqslgi]UUTQNOQSTXZ_jhmx|{xyzwsqrrrss}}}xwvy~|wv|~{|~{ywsjaYRNNURT[UQRX`efgks~ztouyrwvppryzvs||{|}}ywwx|ywxrptic^YTOOSUTPLT_]dlpv~yustusronz}xvwz{zyyzvz~}~{tmg`WTVNRWSRPRX_`_agmn~~z|zwzsonqw|~}xszuw}{zzxvx}~uw{rpmdYQOQSTSMQXW`ffhlos{{uwzyuojrru~~||{wwz}wt~|~}yz|vqnlgdbWWZSRQQQSVX[_dbkvzu{}xvsrtuvx}~~~|w~~wrswxy~|y~yuwtlaXVUTRONTNQ]adgihjpz~ywyzxqrvpv~~zz}}xuvz|w{{v}|y{ytrolnh[]YSRRUVUQRW^_]hln{{xwuttspqw}y~}~|vrsuyz{yxzwqib\XUSNRYRTXZ^bb_`elv{xwruvnswz~}{{xvxyu}~wy|~|yz|~}vrqqusjjaVRPQTVROPX\[efgpxxvwyzwqopvx{|{{xutsru~}~{{yvplie]VNLSPRYXY]bb`beiq~xsu|vvyvvx{|{|~}|yztw~z{}{zz|~}z{upqtlnmcZTSTUTRQRUT_fdjptw}{utxyuqorsq}~~zvuvusxyy}}~|vpmlkhaWQVRQYYXWWXZ]adkx|~vrwsv{ywxxvx{}}~uw|wz~}xtv|~z~~}xxxquskd]VTSPOQUUOX_`glnps|}zyxvtstpnwy|~}vqqrux~xy}|~|tqqqmh^XXORVWYZXTTY]`fnnz|~{tz}zxuqmnsy}z}yvz}}yvvz~|x~~~~wswsnkgb]VPNPTQRXU[cgggks||vstwvosuqyytrqrzzv|{{}~~xutsqkgh]WYVUVUQMMQW_ihmwyyz{|}|wqmmot}xzzywvwxxz{{}ytqnliaWRQSOQXRRX]`aciot{xtwxrwuptwz|}~xtrs{zz{wwz~|{~}xuonpfca[YXVRPNLMU^\djkpw|{{vplkloz~~|yvvy{yvsw{}zwvvtmd\XVOSVRTTTTV[`dhlo~|{wu{wstuttx~~||vtyuv~|yww{|z{~|uwzrrpf_ZUOLMMLPWW`ebdgny~{vspmlrru{usuyzzut}{}zyyuoje`UUWRTWUQOSZ^`a`ityvz{wxwtpnry~}{w}|yyxwx{{{{~|z~x|wuyupiaXQNMMNRNQ\\^`djqx~~vrrrprupv}}ywxxyxtxxt~}}|wspng\]XSUVUPMNSY\]^ilp}yx{zvqoqty||}|y}ywxz||ywx|z{z{}yupg[SOMMQWQTWVY\_dilqy~vsrruunsvuy~{yxwvu|}w|~}xwz~yustogg_VWVTRPQRSVXYbdgrzyzzxsppqruw{~}xvvy|{wtw}|{~~|~{ywsk`XQMMRPRWSSW\bgijnu{wsqtzuvxsrsxzwrtzw{~}~~zyyzzuttlnla]YUPMORSSST^femsw}~{xutttsqppz}ywx{{ywvxxy~zwtmfa[TQURQXVSRTZadehmvz}ytsvsuytrrsx|uw{w|~|{{yyyyy{yvorqigb[TOOQSSQNV\^inqv|zsqsutrooxy~zxyxvwyzuw}~}xrlhc]YWORURSSTW[^adinoz~}{|ztzzvsqqtwy|xzwu|~}yvxyyy~}~xtwqoniaVQPQQRPRXU\fiknqrw~wtuvvrmqsq{~{wuvzyv{yz{z}vomkhfg]XYSQQRTUTUZ`fflvxxyyvvutuussxy}}|||xsqswz}}~wtusme^XURPMOUPSZ_dhjikpw~{xvvurvuqwz}}}~yuvyww}xw{~|{|~ytqnnofc`WTRRUVSPQW]]djjs{xvvvvtporx{}~}}}zvtrrv}z}~~|{xsmhd^XTOSVRVWVY]^]^bho}Ŀurrgiknzxjorc_\ZZ\^h|dfpnw}qWSjg7MsT3LkjXDEIHRau{dzsdp]~zYT_qykbhtexk]]bejlga_[mbjm|{cOKZkqcD7>Ocqwuttw}t|ɾ|ztZ^rpbZXZ]^akxmi|fhx}nc_evyuwm]ZavnL:C[llaMEGEKS[fu~}ŹmdslYV^euvkehszqllpssutpjf]Wdw~jhw}hQ@BHTgqtqjb]]dltst|uu|wod^\\[\`babfgrzmmwuj__js~p\TWcqvp`PE>5599@EHIMXi}ma^er|tnhntzqkb_gtwytorttqpu|}pb\SLGD>98<<.1CVb_RD:49>@KXhu~rpsj_bozv}v{nf`[X_n~~mcdpytoginviI/,A^eR?1.;L]jswxxxyyò}x{xherujdfo{~|ycTUgphiovzxrmid^cilu|{rdWLD??BMST[_bjxûobXVYalv}}l_]h|xh^\^bdcbchkt|uuxstspqw~zgUH>FQX`gmsuttv{~}~zj^Z^i{rhcdhmnpsx|zpjmklrux|tuwoj\PG>758?GLOQWabgkjhfc`bht{uorvx|twxxxxy{|ywutoikhba_^^clv}wmcYPMMPU_cekhb]XWY\^agpvwjeheeegjnqrstupnpllmjgfhmqsrmmokklid_YUV\dmy~uoliec^`deox}~{vnlje_ZZ\__^[`a`gjihgdbfmvth`RGFA>===>>?BEJKNW[bmty{~ytsv{|xwporruxyzzwrpppidd]ZYUOGA>=<;:<@<>DFILOQXcrxwxuutsrnhcabc`bc^aefedehkostz|wwvsqokeceilrtnolfdcceeddhpvx¿}voojeeeeec`_bgjjpompqrqqqqrsrqtpjjgddeddfkr{{f_OFC;99;KVew}zn[MM^sĹIJyup_QQix[Xxz`\j}jl_zzYtypppurxpqxpgijnsmS6:`h@4\yrVKWiv|}ʶżqikpomlbY\pyXds`tsmqra`nqhyjnj]VPKGEDGQ]kmZF89MfwxnaWTZcjwů¢}iZ[evnbbm{vij}iYbz~rhcgmu~vpxxnkeinptvseN:8NjugVMITbpyŴxlb]btjWS_||rhgmxzoownkheb`\VPHABLUervrgZMFDFKS]aktw~ÿyjc\Y]fp{ynlu}piea]\^acegm|unhdc][]ZZ[`fmmeXH;17ESds|th^\bp{vpmnpsxz~|rkgegceknu}}qnrt}}ujaWIB=99;=@GQ[dnux¼zxwx|z|}mdb^cjptvwy{|{vutmmooqtuuvy}{skaWNF@@GR^dnpnoomiginu}ƿ{sf]\WYaiosvz|}}{z|ursponlgdceglqopqkigeddeis~z|{uvvtsrnhb`_agklv|{vvpjhc`_^ZXXZ^enprvronnoqqrwzmaXOEB?89:>@DINTY_eqx{{vsrpnnpw}{y|wvvusrrrplidbbZUQID@=98889?GHNSSUY`jt|þzyunlhecbdfgfdciihllklnpqtuvw{zx{vpjfcb`]ZZ\\^fghjjhghloruxyojjdaaa`aekoqrprvtwzxvutqpomjjkhjlifdceilosz}wrlea_]\^abjprw{zzwsnjebaa`adggoqs}zlhbXRWkZ`M82+CV|rpsYfto\Zpz}Yhv|mw|w`PX}\pjrtk`tv~Sczvoen}jqlc}t?)Lrvii]kqstpmvqwb_bmwOXrkX\jykjWV`ht|mfruw~mYSuż`H!$LnnQQFOOFPK\lxq{y}{ztmyrPNHF_mmubZMg{~}|ohZfn|qñ{cPjaE9>>SSe~ytmcgd]Vc]k^WZkfigkxο{pngmyymd]`[PIVSf[XV_QRJKSUXZVVKONQPow{uzsjhcutuivŴ|lcVRG7 (";H[vzuhd^ZHQNQSBCJOHK@KSYabp}|w|~z|xwesr|vwzypqcnootjf`]_hixvnfk]_S]sypna]XWqz~nd^WNE1*8;]at~vwrpli\oftkdemkkf[jnz{uwwxvcb^]YWFXP_^Z[`[ZWK[X[_RSV]duq}igbe\aQbr~yvkd[LH7HG_imvu{njffdmg`x|x|xs|yyltghdKMVXZfYgcgqupsk[[QJRAG9=:@G__pp}spxdbmkh|yxuqetgqjke^W_UPgks{rif[^YZ`gYqy~rztxnZf]]gW]rwsyiihbop~|}}oywihd[gW\T[_jw~}fne]i[Vipuȹzt}xahj^[]P\ORPRQIDRRSqxu{otode^c\Z_fXn{}w~tcngm}qxvucdc_kq~|zjskXVRMUFKJZdqumtm\e\\i[_yȺ~iuuiljbhX]]da\_wyu{md`[XMHTXQjq|{{zvpojke]\hXXgh|~{znukkr|}{zpkrbV\W\\Vam}ofkVSUIQWNiȾ~ebnc[]QQJAFIOLNexxx{yz~nkdcZRWfZblj{r~ywwogppeu||mngdcXcpovn[ZXU]U^l}{yv{}nblcY_VYidt}xmxmnigfY[alorzz}{}j^VUQIK\SS`ctv~|vtpxy}vfeikd[hqmxwpig\alwvlr{lwudbfjwwx}zl`jdVZUXmpx~v{uboj\]]ZXJJWhuw|vvzyxgWUXXRLZTNZ]dsmuwzrmpqphryqkff\W`hidd~yv|icisy~tvwxxkhkmi[\dW\bi}{zkhqeefdc]Xj}vmYQTTP@ALDJNQ_oo³y~op}okjloiZX\_dfvvvvqc^dhkdn|{wz|hnndn~{jiqofRY]Zfovxzahm`]Z[]]cz}}}|vqrrk\[_ZTFRXOQRZl~~~zusw~sbgp{rzmkkki_MKZbkgurx~mkyqvxzuk_dlhbTdrz{{rtelocfjw~sjfjmgVMNGI>EMGPYm{vtrymkpbfhnng]g}}l|usqoi\NL^fnffvw~{yu|u~}{tmyzvttoc^fdh`o|~rv}}uprg^iajspuiabeojYFLMPHCUWcr~{zxxvrcrljjnz||zzkosgeYYSLETbee]t~rpkocnpddcmh^S`kuxxyrnpjh[mr~mjm_cag_N=AE@B;Qat|y|}ureg]hf\bg|{~wrzhd[``[SXb_icpyz~~~uxtyonndmkqkc[j|vttqldwuxwnrj|}u~qmfdlbf^a`[MKPNYWpwu~omirhnnkwwzvsj^]MRLUYTHJ\crjwz}|njo|sqwifdm}jmr~sfMJT|I:_sE9Mc[JNNgo{̾vomb]`y]N`|sqqi[bgxvVB<^qkSNHGSXwxnwaFNUrzdfv|pTSjef{jkhuni^httxuage\OLS_|{K9Lt`91QknxlZkwlZLW~kqrsloplpiiQE32?O]gtjngsýrmahmplcQMBHUeu{|z|plcZV\rvulhnv~~zo^F:ANmthQXW^bbolqpxllmzxxrlWchiZSNP\szy}{mp^P<4ADGNitɾt{~j`[Uc^WHPOOHL`l|rta_XYTUTSURfkxwzvdU_î}{uw}{nZVN>AFex}hnntihhp{rj[bc^VV`i|iswwxlj]ZL75081**E[vùtrg`]^^UXWnzwnvxxpuigcqtxxvd\T`ahtysy{woyuwlux~wl_TUHG49@Ttz{zpkz{}w{vjiss}u{soifhd`LI?FA;;43;^qvzz|nlgjmyz{ohafaqoqieombV`aqy~}whheee\lmhTSTRI>D?O^x}osqmkU[YXQWUH:1>55+.44;Pkr|u|||tunsq{kdclujZSbe{ywvzxeQY\[`X_TPLQKB>1.01=E`feblop|}}y{{xwntrk_Xfaf_ituvwzv~wxpad[QM_\VHFWURFNOXev|~yvu|zŴw[]YVZV^RIEOLD<6C>ET^|y~zlusjqnraThTP_vutķx[266J|ŴvaaZ\PQp]QNUTEhkfk^[QLSeviugT?:5AQQ^sk{ckwq}jposqmoYft~l}ƻ{yidRG.=NR}δypm^M\P=KKQ4LTQRFDG?K[~}o]SVV[][qbkkyrjtfs~s|psznwuosfXsmwþ˳wphP@-&7AqƳyelq[bZgJWZRV\[T?CFkhgztze]]fnkt{liu|oxqylr|yv}tcgYqdi{lbO>&!GLqé~anljuxy|yvhNNEefo~e}{qePRXaoqsnojjZ_OJUafavr|usfmrid_TF.5,?Z_°{ntpcqvta^[zmtuo[YY]fjrw|pYVBGYZSG[WU^_tk||uqqrvxuw~mkaTUUUJ9<+MbrƼ{pjktxx|{oogkumnhjeouxmjSZf^SEM=RUee`ebc`iiYfaywqrhwhbGB>B?#$%#OW}Ƽѿzs}zwpYZEdgo{|jetj}yaSlngXSUSe_tffZXUbp\T[Tsfpwx~yq\JC;A6&0-?Mtѵ}Z]STdUu}}zpXrhwukfJ^nhiZXI^]svqihjiyoZdQbcfstzrzoZVNYT7>,&:5Zsij}qlYmYhwq{|rvqºprqrvxSNd]]KD:FR\wvthg_q}enhf|mp}z~wrfq]mrpabZU[D?G-A?Vtotbimcqz}wqvdtn{WcdZ\NG:IE\ibTTSTnibwfqnr{vtmuiYhdYKI@KI0A96IBaqʽ˷ƻtdgVjds|yzs{aXci|gxstl]OIQH`geYYKPcRW_Oc\pzjbi^MKNFO='9(,29Zj;qd\L]Rfq~w~XSVcytqrjaUYYVuzoecPW_FY_WcXpw~}~onsiZYUOW>*6!18E^jİŸxo`LVRowv~|^VTa~ofpdhe^V`aZtyplkZ_gRdi`jbvys{v~uqxpqxhTTVT`J4D3>GVltĮ|mXec{ytmsyi`_qpjvge`VNVSFcngfk^ajMYgapmu{{wvknk`fXFEJI[R9E38L`}ǹ~`cbx|}sjpowwfsdhotrjg[NS\J\md^bWLWDB[Xkr|rm~q[g]F;>:GL,60,F_ǵĽrxXTYoyvsppYoo[\cĤtyppf[blV^rg_`VKXG:QL\hzyysjodJ=<3;G0;4(?Y~ź}o}aXYk~wtzrpVhj[`io{uqtn`doZavoimfU]M>QJWd||yn{zxioeMCA:ES0B]lbar~}no|xs[stjkwpwlih^TbiUcvpppcU_LIWPbtrhswlmsbk[HEE;FK=RA9Lopil}hnz{uwn_wnjoĹzvhgh_XhcOaiafgYPXDRXTdymhopgvkbcH<:4.B>AS=AY~Ĺr}lix{hym{wkoV\j`dr¬ytto`er\Sd_ckeONHJ3.Gkzzf`nw~wsuv^ii[]ku}trombsifmaowq[XIJWGKax}xjhpir}qy\ECB;=C@VI6<`w¼xmrzswqpzwi`pa^jz~xqocaxo]g__rvm]WCSPFSr~pkkmezlmhE?;>4??MV?3Ij|vowzsju}{~ymo[fh\bvz~~uq^jyjeiUbmp^SE@QECZzxpslkxfq`D=87-74KK62Pku}}ynptxlwsx}xmjWd\Q[st{|vexoplVeko]WDDN?=Xrzxovnv{nx`J?:4+37QI65Qgu|w{rxtv}pzq~zpk[dWN`zx}yfw|ovp\ipwd]HJP?;Wq|{tiqkwwitaQB>:28LVQUqz~{tttw}uxlZRWITJNcotuyt}|rhc`y}z}[O\qwpnle|tuxoi_w~yeOGIUaMX[MAETVUjyvy~xtrpz{zzoaRUGRMFZmusw{{tjf_rzwcPUlvrqnawtq|qj\q{lSHGQbOVZPHGUYWiuxt{|vrp}v~v}yqfWXHTQDUlvsvrji`oyxkVTivturbwwr}{riZlvpSFCMbRY[VRMX]\kr{r{~vrp~~twupf\WFVPFUp{w{mhibru{iYVlxw}uf{uv|xvdZkq}lNC?N_R^XWURZ^bps}}o{vrm~roomb]QDWMGVs|u}igfcpm}{gYXnxypk|u||yy^_ip|gJA@UQ[XRZXTW]ki}ü~koynxs{|lkohg[DTMFJexrspilksk}}k`Vbpuqitp|xw}hfjm|qSE=OTY_QX\WQUchjtlwqp}zttglliiLPTKJWrun|jmktlsrj^^js}{iqlv|s}zuckgtybM@FSScWT]_UQ[ibzmo~py|t{yiclhn_KVNKL`ursthkotg|}pj__kutpqn~zs{njiitqZG=JLXaRWaaRPafeukqzs{xy|y|cciioTOQJKOespy|pjkvnh}tng_^ixrvlqws}opikqlXEALH^\QWb_OPdblqjqxuxx}}y{{`afjmSSMJKPbpqzysjlxjixpnia\fy|rxhr}uqzssiknk[FEJG`ZRXfcOQeaqpjp{xvx{v{|_^dmmWWLKNR^mt|ywjl{kjvppng\bx|v|jq{tn~xvujjjh_JGJF`^W\jlXTfdsump~yww~ssbZ`lo\\NLRW^ly||kizmiqlpqn`_w{oqztmwx}wxigdcbOHKC]`[]ksdYijx|oo|~vt{vljVXep`aSKS[_fwqdrpemgmquj^l{zpywpq~z~v}ngc^bZJMAR`^`hwschnvzrmuxuv|kyt\R[oed]LQZaanzfksflcgovsac{zsxwqouz~uwke[]`QPCL^_divzmjnuz~xot~yur{kvzcSVnghdOQ\ecimlshnbdnwwgbvyvvsomp|{t{nf[ZbYVGM^ahmx}upouzytv}|tnykt{{gUSlhmjUU_iehpnqjpb}{qnoijquhuvsbT]faZIVm̾uS67F;Umt}µp|v^rmGKRl}x||<6wqbeTKV[ppil~ŷ;$̮F)UgqXB6-0;DTbxoU]kͻf\bc{ple]`eb^qþyzS07<[ytY>RiaTR\TQ`yèc* 3҆;"(F_WWKBEMS`s{md`F=UqƾwdTOnqxƾpr|o{}}`K:JSU[jtdWb]kp}sbWNf|zr^UatMWwP;NPQULLW]bitWHBEB-@VzqNQ__p{ǽ~fTQklr~rnpiaelhSZ^l}xgeUZssqyxO-n⾔ha\MNCID7RUXnùztvwk`\Qb}~i~{{a`J=>EPi|ikprZp|jkW\WDCPTEEQfzw||lXnfw{jgNADQG9LANQb~oyynusvhm|c\HD.AHBLL]`jz̶u|{urj`eg{~lo}qp]P>86Fr~µkp~s}ovbRWTUEGAVZJ^y|rxzsvtl\ngngUF443PEG\pp~z~r{~zaZ\klŷ{xlg_qnOH?>0Qeordo{}|cjQGFE:7RMWRf}{txtm_WZsYN?<&5HFQOg{ǻϴwpozqfXJa|w{pwdSob\A)4=MXǴsepwzpedHI30[]}oVejuntnqlb_RQGB6?49MR|İ}ttondgug½~{}vxqtdKXEQEC3_b}fnshzfrn_rZVKHFKT,? -KkͺƷƒvqzm|y]ygquxεylmx|nt~Ob?6FIXCENcq˦qtrsxZr^@F2'B\Uzzzje^cn}{s\eX6CAC9+%>;^w{ͼģxrvfpr`u]xtuɾvadkkedKPB@VKOVPeŷ~ruq|mh`R]?/=9?9I]xttqebnpyqiTHEJ.>I3-7DK{϶¹~zzlnbkfnpiqedvdfoVW?<4H]K`Yj}Ũs{usp\rSB?A?2]g|vd_Zy`xVPSG>)D?@7=MXŲǪ}refdrhrr}µglhkZ`YhcDG0MKNfUZ|οįjrwhntGWGC:2Eb{}~cW\ferqYjGI0/M@C:*6e~xmgqde_YbƿylgvX^_dU>#4H=drb{ĹlqtlmkTZZ;J>N^jtqbhZ_fif_eZ8 >14RICSgzʶ}jbl[krcdy|xgLQQRi`I9<-PeVys|mqkgwzj^hX^19VH\j}z]dTG\mZcfU7H;7A.HFKhy˹ȩ}{|ftgH[VwuūdaWQfBFF3-0SWm}ƹmimawe[UUM;ZYh`l_jkVZ_VqfUM?7)01CYZs^|μzqfjtY_ZuukǙxZFJ]NJLGG5@WVwwºð~ojkhmpur]^KLMNUjxvqV\bOMZ^ZO[\G.01DRfdlpİÿrzu`QVcdrsm{yhbVME=C=D@4GolųɠynxipnafSHbVHRekwz}usibjdcTchM]JI:0EHacacҺнp{xyWa]ZYhfn`acBBC8;SK=HKZ{s¼z~inuhlzX[^LMESsp{y|jqa`UHN]eOcC,:.?`N`gs}Ҹɭv~ygbUeXRbal¿k}`GJ84JBFP=6ShrĴ}{~pgg_giUXJAQ[u}}wr|rbt\WU[V[N:P9+DEFTa|{˪x}[_YQPPd}~vYe>,8HFPVH;A_vʹƽ~ythrdmkgXH\U[ojw~|uzZRaHY[hMDXCDNLTX=CB>UqxvįʵzcygyihbGKKR\h}x{r~fbg]_JhRTcBP?%3JWSqok´yvYRLKKfz~sCGN>?[J4O>CTdoqƺĥwifrWkdSiVSWQZp{ogj\YZ[A\X;^E7@=GNVYfw~rkrxQUQAU[{vs]TPSB6ODCD9D3A\{Ѹkit`lchiRTUc`t}lVOSWSKjeUWBI5.>T^XjsǶsvvutQKNUTcjbMUJ57;?8BGDW`òua`fihwrj_M[]q{s~daZX[HOUXMIN?>;Pjiyå|uvyy~ybVFUY[{tvr_OOIA<:OIHRDL_tva_h^juhma`\bqpkcXNQUSVR_ZLSH7@BZ`sұ{kxto{h]YSVRexstzbTS62,6?DNS\^wom_e]^_de\mqo{z}|qeneRVKDOIQHLHJCGbfr~Ű}rrfd^]RXcXcrvvji]NHFA1:>8CKhmq{}{vgYfb]bi|mciqn|~xkcSXNMKQLOQ??=NREOo~ɫtvtiham\MP`[n|su^E57F4.:ICWau}zu}tYR^\Vdjzqgxyz{lgT?:7QMFCN>CMR]S`ɹxcbjYe_aYGUtwrnmabP9A=D4)BY]`vxypuskeLNjuotymwkxkcs~fUQO7GCSN6APNDOPc{ɵbUnypbbMZVi~l|~XQTG6996GF^`ag}k{uqVWSYopq}|}{}kq{yzN=KI@AN\LJDHdeu׼Į|jtn^]N^`XWm}ȴoofgoSA3,@6:BcVgtnp^cbUO]k`~z}a~|xfg\XdMB91JEC=TBJS[{nپt}zh\ekVj\ocLm}ulzi^LS2466J2Cgqstqw~k{dq]B_ksnsqztmdp]P@R8>AFZ6?Z]ZOXf¼}kMgljXVSinyƮzsyupzOKULB226PLkypyby~|g[Teggzjuqw}qloqdpD?TOM?BBTEZiXXmrѱvsfmphsVYY_qrh]fKMXD9FA[iYb^rxc\XWzqlrfxuwo|f~~j\NWFI]LCVM\eLOFMm|ڲȾ|pj_~whgO[`ge~xrxkgjC:2+DIURqhvswz_Y___fnsbz~zfjj_PaG:<3LSXK__[olѭyhlehc}dj_cy\xot`ilfPKO>QBa_Jjp||}{|nzphYvZaxmkty|biZV\UJ@T@XRblDVbfkfvDZ}cwjWvwygZ[t{n{|}mR@MGO@CSsjztgy|z}xv_ux~{_vmgyxkkkp`ljowtrp{uveYfjA_^P[DHYgc|s|s_U7TLR[FjwxqiXuxstxo^]xj{mdvtgxaUbNP]mg|zp{coLCER>\gle_SReey~bxmyh]hio\WHEXmxzuyeRz^dnSsoitzjs|V`l`rxrhb_wyTXZjmMOW6PgdfaJorlûӴ{{}fpq_VlmzyqZQK\Z|~kmkk\L\_ped|qlv~raSWYMVdx}rSuzjksb~dQCMUPtunansyƻѽ~xbad@RHcjvwdOfdz}|zjmVib`z`jxfo{{lL_LEP_s}yftvzoyhkflpWKZFbg}l_mrz~׻tgpX`SRR[}k{dSf^un{|oiaeZbn_|ntsy`QFLK?j~si[orlz}pib_EVCfqvz{qr~sĭҦ|pfeFRFZuerzoWUssh|mhvrYubivk{v}{Y\WKKTS}{k{td|wxgvj}g_aSZlnxtuvjmɳ~twgU^RHVvikrbK]k}qst}h{fZ^ojgy}tcXODIHIm{z{iqbiynwstsd[eLTyjn{zxw{ʭsjgIVMMxZmxW\go}ns{}itdmmow_suyx~z\nVKT:Yqworjdzwti|tepeaasm~hw}dssɶtleONNFq`rn|tMSvw|zoxi[cmu`ztvz\^_JA>P[y{r``ozsayf[nTfivn{z{oˤz}`OX>^`Zsp~f^mpxw~wxwtpjdkqlyr{m_wQMI5Srt{~~dhwz~{~uhvsiluskztqwo|l{||}yz|W?PDS]iovTXh{zikkljmoes{q\iTH48_i}yqjYpp}~iqxkhkrif}xyuwouuyTVIBdBhqx}}ljq}|ryshzs]wgzsxtfjjV^2Gfnunhhuz||pfx[s|qjwpxixiwsuJI?HYLqyw`rnv|mlureaxbtgueMX;7]w~ingVhzrymjxgok}fin|syw|u~na\CQYRknyqrwtttvofb{|ywmwXV^9Ghj}zsorkf{oyz~fxx}klu|vym{r|{xysn~~XZQ6WY]u`tu|}j}}ellupxwkqLPN;Vgtzkc_glZ{rz[syk|xjrzka~{pynrhnxuk`WCXN`uuot|{`f|qd{lymjzRXWOkg~z~bbj^mcg~|kpkfjovtuh~rryyksmd~cWk@HNer{zuz{zxpm}mpghxm}lZdSFiqs}qxefTemQZysvmtwgfmyo|{vyp{qe_hednWTNnto~zn|x}~pu~sknysv~roabKYljz{~tjc\gy\]zmme}xgsw~}n~k~pyvw^qinaNZM`xy~r}otvupgqcm}wzuzuVaPOvnu}uqj`^jWhm~{z~{nxqspyqpkz~oxbuxgjrcgycfaPO[ngr|~pv~ta~}jmgs{r}s]bdLhv~vwcnfLmaRvsu~xxtwiny{q|qswrp}wtcegoegzcdlIXMTcswvqo[~b_p|tvZt[aii}sxsgWY_Zbcj}t{sfqhuolpxwx~nfua_tbdjevZSY`\j~{|rvux]y|he{}h`dYZgr|tsyglgYf^gv`xx}ootqop~{wr{vQ|}kdpurmezuTGOc]fzsnovqmju}xngsUW_\|xropgfhOgjhl}yk{{yqyyj|yw}{w[_sllgeslZfDNV[avyttimzyiowrpxkdcZc]k~y{xb`iO]j\jxv{pp~ilo{llsnt[jwrn\ffldlwWIEd`Vts~u[trqymfoyrzbejjnxw|ztwl[[RWlb]rw|~xvzrdotjfvno`uv|l]^ZcyXfxaNSfldstig{tvklqd|n]hhe~}zxtlt`YcSajfjs}xnnwjquxay||zcWuf~fg`^`yjkun]_\bg|okh}vuyskkkguqle`mt~vlpUg\mgXar}ttsuzung|{ogWfcyxefdf]gbszde\Vfbsz~dv}lslkj}zrZzlbju|nsvugZVgbWXmyx{|jmuemj~xzgJcluvstjWdRWfczri^^[ixw|luudn{|s\jzemsc}vyiaqucbZXf[No|~vuufgc}gk}~vXVpwpd}im^[KRZjkdolcjwy{}tlsmp}zldypr}ppm_^grt_PZpdTguyo^lfxqsziTchr~l`krrUVTS`h|fq{oplx}z{nlupclvtqiw~rxsy·d9*7-(:Vewylutzȳop~u}}v^`XXQ;8G^r}pv|kg]W\eɿw_XRej^^klέ{p^@@Q]u~_D44W`ohlpfSZF1'-FNWx_Wffu}}lKKC9?_{Ÿ~xpswklXWQ_eadsvtla[Scs|ĺjb^pn`c[H8NWmru|qtoWMF]_V]~uO4=AY~wv}{ywqkx~tp[kjt~|lm_dlepiXNNLMUvu~iPEAYlw}}hQXah^xΧyr~vs\^e|mey{Ż}iF>GDYdxpz~y`kryrplejfmq_[[J[TTP?16?UfzaWOUcdesaVX^obI?HPMLqšr{{~tfs~q_drkwsnxn}{}lpf`q~~rmlPVNOMCOitiWZSKabqrkhmjlhsphwo`S[gYEDP^\d~n[fbhQAIcxxwy|zztp`iVOjʴ`\RJRT\g{zsaWOIR?AS\O]|nqeflso{dN?+T]R;DLLm{gXgyo\H_vtfPY~}}tzwtP<6>IqƾwX\bbUMA:Wmrdcmn~gc|{\Xnt{l_GPesopiWFD5G]VuθrYWmrzebd{g[HL;LKWvxѴzhl^Q>E4@`~ɵvqnv~cRU[BYuna?*2;_{vx~gtrrqmx|hk[Q0!6Ocnl_Z\auhU]huxnxswkpvikZA./6MRU_lǿ~h{nsq}UUIV^mbixoon|sluilu{yekpTT`{{fXRNC`qvwsap\]W]VgucP1BXnxӼ{VVQwvtona~ofWCI55>KQ_zmki~lT\jWTNYEMmhy}kvf\?K^}zpdcguaTbjmt]W^~y~z~wT`CeqZu~ytxWte`V\;7eTUWf}սȽؼ|mcpmT_WeL]uc_cyurrW{lwwz}qxd>ZEG-;DDX[Stekdmgzbm`huvbkrvfezkdoww{fGJ8HYbXsqxxwyjrV]hD8K8Ygjsyribnmweq|zuivznndjyVhurqvx{rpmpidzphS^W[ysé|r~{mpaJ[FRNULIUZVoóvw{kRkmy|olSD`GIDesvxqmwyouep?IA=?^S_oq{wt_Xo_zbsxhx~vsr{u|zVhbSKTZD@OQKo}ĶayloOJphuoXQmopjoc\ify}x[rvPRxp{zj|~}qWQ;W^hl~zɴklr|lbjnrN(C`tnr|qwyt|mfho^g\Tal~|r\rlQMe~{]IJbԹ}fglz~oujjkyubR29Sw||ufN^}scUHXpxobUP[nUQ_x{zndgm^N^pxQB9@8G_WRE122MOOWpѲcYNSNUfdnma\]^LALimkdlhWGvyslpUA;/8CXq|vOK^ov{}Ա}ygZcgjvi]HdopstoeZRAKID\`x}~dv~}{cOPxz}tyH+=PQXƦuwtvtlpsqm]SI=*5[]|n_~}ɽktekuw}\gjUhjo^c}lp|qgwxQO]^TBX\Rah~˷gya_wkq{rqfxv`O1;FOphrwiIYoxmc]^U_eR]C@<>_eg{tŹzye]>Zydwwĵpm]2-(-VYx{pWnziu~rT\uwkbTjgejQGJv}rfaZ_eaz{}wisxdLSRhbied_\hp{߿qrqfvvqzqs|rǣ|nfzso[9QWTcO[:%1*4@`Ztʱ{pOhjoWNHN79GLi]nrnh}jsu~zt}n^zpff[LDYjbŦu}ngML[]PTYyyw]iaf]egXfxnjmsWJD[\kkdK]`RTPjj~m}rb^T>KUNdea`\N?ZTpjt}ʳp`_n{tt|v{z}rk|apsuovotaOVDWE2;@D8dssrougl~ybgUqrifssttpy~~xtuwgv|ovlZ]BF070@Yqy}Ǹ|}xT[nun~hvyi|taZjfoZ{sstmsoaiaUF;OpowsV^XW\l_noc`gW\vst^eYcowqXSV}|wv\JZ\fj_svјmmio{lX_YRZdYRvx~z{xzxnlgR3;RRYMWyvbYiMeuwȖfbdM^aHf}ɭ~}~|fnLC[myy]@7qyz~wo]i~ysiQYX8Od^{zlNIszz{FFYtwhfHOgsdKTTTshnuhrngqfpvf]a\xplduhbL6AxveOSpzϺzqbM_qXKe`i̺̬ŵU"J˴^45L6&#?ifnj~vlj{rpfMal\XX_LZT:I`~om\Soƺwx|}qpnlR;=_wyxuusYL\R]opgMKF^i[gttȿkE9A5$/U™kbag[sjV`l~aJK:6JnwgB2&.K]nykcKXJHUfTXMQSj~~_3DLk¦h<->DO]t|}isȱuv`Z_r{~QOLbLJQFF1 328Ar|{`A=3/&0a`czW]PTmb]`fzlXlmsxX]lbttNIUaPTdpzv_EPIZröntv{jMV_RK;Lf~UTKLjxuqmwuuoN'6994AZip^Opr{zVW`xpgtrwuzg{xjcb}|t|~tgabel~RGH\qu~{zyĹunpmaw|Ĥu7**&+4adpcYV^mZOLRa>AJclbk^hipyyzwqfMgeyru_ZifkU]ROgqnfgvr}gdlgfmvhx]]hkal}zz|ccllobvfYQXXJJ.0/:\vymYOWZgU`PE[^hd{sl`]Xr\FDOs~xvqvwnok[azνp^QJJ6Eeqq[YKdsy|fhbe_lzzpz`\Wkwl}t~kz}upr{vtnoqqĽzZf]dtmnimllm^^nvwîp}z|\]OX\Kbwdj[OI9:NVip_{gehtp`Y`Pd]lǢ|z|}}xzrb?VMHgzpirxw~}zpnnjkZL0GQF;09/9EEQP`gnvrzsqy|tvkaaadv}[Wdpta\YZT=_pʽtgn}vu~x}m`kt}{yj`lb^^\Yic@I[UUSA8LCWjv}kfszot}ssa[]YWswlvQGUirilp{|npzhmxmhxib[Uru|~ʺuwx{{mhkb_\VZpgOat|}t{xoxdcothqzg`U944.-MQ\oX_zzz~r}_MV_XZrwzsx}wjidfy}tYXcFHHMU^exkyfgx|n_zjY^knk~}r{k[gpq}~xpvnlrdvn`^^\l`_wndiǺ{xrk}yrke_[e{wex{y~{snqptr}ghZflZf|}||lQSib]BLauvȾĿǷh\P83BQtxwaHSP^ZOVQQ]Yefb^BACJCBC9;V\m{}yio^owrqcZXLYW_kSGCNRPYZO\HDE?FNU[y{ztg|}tl{|xp^Z`qsbmh{olutwvuSFDG;.9EF^Vf}r\cXQdfi`TWRV`ZtskeltvzxkdgnvvƷýyn_LJNg|~ξl_f^w{rhXSY[j]dcI>@F=2?EH[MVcfgmj_M[SRgnxqinlrum}vmnpmtouq`YF99=A@NhiursĸukmmziihK936, *4>[Wevyyq}{kjegeVgb_XVWT\j]fg[ZH=?EHEPifzyhYIEFZvz˿sxizpceh{tp|iZRWTIMX[wvw|u~s~~zxspihvmjn\\J52:?AHnyƵ~tqxpcVRT^|}t{mpcg}nZWWgk]k]OBAA99HLlz{qyv}vnppzgjohonmgeuyx{|hbkpolxdRLNUu~ÿ}giYXlqveQLL^g]lbYNIG>:C@Yc`g__lwxe]cT_^eohcfjxfhmgqvwplz~|w{t\MSWVRqrkmpwxofaosgp`VH@90/9:\ks}ryqsyqjjnzfhg_iomb\hgkufnhREJNHC_ex~uwynWRR[swqxmgdwxwtqibZPRTRpszsr{sy{u~pirjrsdj_F:=A9=[e~{zytw^JIIWcg}yyxqhhypxufbXM?7>9Fbfy|w~}}{wzimxylour||ub]``Scq|{~ueH9:>SWnƺ{pist~xcVMY`]l`]\VJ>?C;U_gulgvtxx||~~zowxmumw~owq^OMNFD[b||fcdry{u~xfYXe]jeZYUI807.GHIcq{~~tk^gbclenz~}vz~vwtpm]jjghkk^LF8@IF[gmvwyz}yjRWXVkt~xtzy{q{}|skwn~|{\DE=>BHOe\V\^WUkhsnOZV`b~~ҹupSQUReYLILHLGEMA=Nl}zyfVS`[fwwtdb{vlu]Znurp}yt{~kYg^XfXSO>11MYeqn~uwƷ|vwr^gYn}fLIcit_Ven{~{}j_uvufUD00/685CIFIJVkwuvbemhmnkrzuqot^PYK`{yu|o|nfq{tgbOZw|eUcisnhbc^f~~ſiOALP^{zYNPcu~n^[rm]KOOM[GA=9-)@?=10BV_TJKcq~kfwlkg^ap{|~zzaYXba[i[g|}lcrnwyjnmhub_kvlVZNS`~~maz~{i^moxsҸ|{rw_>:FZe~}{`I>IJYQD8!$#)>ObVSZq|{}{{~|cfb^EC@H`wƩj[hr|wsYM<3BFN>P^vjif}}sojp~ytkw{xqmXRDRy}}st~h\BDUcmqlRQES_mfVfewdfhzx}~{iqzyqx~vvlos~mjd|xqykt^ORRcp{xjjwn[\Xin}iluz}ztz|ym||wq_\dlspgc{slTOKXzrhyqu\Vkuy{rRTOTU^ZKa`}zb]PYUsur}uwxzrz}nsnprvt~}ykg\ydX_Q_WgZRPIavгfqwdcXXYiU^hw|wku{pn\g|{t}qZaVd~qksib;;R[dqgLPHLPhaZfapb^_lrs{||lrs~xcqmkqffouzqj_cltoowlq[ZQWp|~{{nokgimrzz{s}xww|{qgZikqzu\p|gY]SkpnveLcqu}\PSRS\fP]Zo~edUXPjyj|zln|tropx|}pwmhryo~}wki[|p[[OaX]YWUJ_m}ʶq}oqkdftakhwzzlom}qjWhtv{t`i^{wttzlAJ[aiw^LSOIPi]fbi{gdWZ\ywo{xyypmr{zwrirgsncjqh}}miZwwekdwomg`YLbp{v|nouoiu}}psqxu}xujYijlwz]io`eZw|uutUhuziVZUP[m^bXevhfXVOhzk{ygfuqrphiu}s~vytgpzm}~vli\xw_YM_YVTVQFY`jxûu{uil}qsjozylid}}~vzwmYgkqwt~hlhzzwXYbglyfOWUJMdchbavkgYURi|owuv|rjm{wp{v~pvlvtegrdk|ql]j{b]YkqhdebMYck{|o|zznk{wnluut|~uuxbclio|tXq}jdii~v{r^mxj_aVO`qljXgpleXTRrzp|tb`kitoaar~{ovvwipuf~zrkf_vs^SP^ZQQ[PJ]]fxr}ƶ}{nqpm}{ojcw}{~wnz|tzw^gihtjslqwuqbgloxw[X[RM]kkj[lrnbVQTyojokxsdgu~zouzyvpszkailZsurle_qmYPVhjabo]Wecnt{znrxoh}w~t{xq|{nuxbilhp~vZq{mgpwv{xektqfeXR]rwr\bnpf[SRo}y{scW__pq^]mprw~~yifn]lwnia\hp^OOZ^TPa[Pbahuzsƽ~sr~mzslfq|z{u}|siowymvghkekzixsyuxlkmvu{g\]TQYnuq]aqvi\RPj~rbfdsu`brpqy|~xmoxl`]hWc}njjd_el[LNZfb`tl`lfkww}ss{~tiuvsu~u}qjr{|lw{emjgmzy`p{ukww~~ois~tlg[X_u~v_cqsd[RVp}xp_SWZqmZapptz{xvhegVn~lmf_]eiWLSZbTYk[]dakxt{Ľxwx{r}rih}svuuv}}{}xgjnxokuiodgm}pj|xu{qm{z}seaUTVgzzeYixnaVP`txu__]mw_\j|skyxrr{oeXbWZxkehaabi_MOSab\tpdmeipw~yxyvmzuop~{s|ommxzl}{hmdeixudu~{vl|{ukzvpb^]d|q^gxoaYR_qqoVPP^q\Uapxjyv}yz|tbh^Yvohmb`]daPQR_`ShgY`[`g{{pŷ|{{u}wnhwtpp~vp{~}z{ijhtsg|yjmbceurgzv{q{qgWYXb|~mYezqe[T`ptwa[Ziy_XaqufwuzwsmZ`YUrldiab_ecQPN\bYordh`cfx|s~}|~yxpzynlwynw{wsnirzl|kjbbbqvirz|zlyszgdfd}zde|wh^U`n~tuaRQXrbR[f~|gtxyx~lhiYovhoifa`eYRQVeXbo]\XX[jyovízzv~tgn{klljowxzvztgfdtlj~siga`evoky~z~z|m[a\ip\j|pgZYfp|rt_\Xlz^Z`suixt|{yr]dZXrlgjdc^bcVRM\aYosee`acw{t·}zyxny|njo}jr|{t~|xmggvlrsjd`^ixppy}uw}|vfmetr`rshW[gq{rqZUOfrWW]trjyuzzyfka^tnjljg_`bWSO^b[op`]YZ\tyt}ú~|}x~peqyxjgkkpz|r~wpspf`_pjl~sidb^ewrpw~{v_e`hw_h|rjZYfk}}or`[Vf}f]brmwvztyv`_\Shlfhfe]\b\VOVc[kxlgbdbt{yyr{kt|olhoqxx~rvztvwng`onl|neb^avvtx}~{gmjm}dh~wo\Weh{prbYQ]wdY^nmuvyq{zzfecXjnhiii`]a]WOWd_mylb]_[n|z|ystcmu|{lgeqrxy|nu~wnnnh_[kim~xjab]dwuvw~~|ciblv`j{rjVZgi}ynn_ZTj}gbdzqyv{{t{zt_aXVghggie[[`^WO\basxldcdd{Ź}~~~yvpixzuogq}pr{xum|~}}}sorsl`fokxuhaa[mwvyxojnj~mbwyrcUcfpqqg^VYtm\]gqqtw}qvx{jdcZemkjjlc]_b\PTbamzqd\_Yjy{~|tucpt{xogfqqwzynv}vmloj\\ihq~wh]`Yfvvys~xhmfuq`qxqeS`gl~sph`XWsucafvruw|~uvy}nc`V_giihmc[[a_RS`_kwre\a[j{}|ï}|txhv{{sjjqouyvnw~~}vnntpablkvxi]aWesuxq~ylqm|udtzuhWdhl}sqjbYWpo]Y_{smpty}utw}pge]dlonlqg_^dbSR^`lxseX\Tarv|uñv|gqwxzskf}rnq~{qv|}{plpp`Zefp|ykZ\V^psxounqktydlxulW^hgyvpkd]Ujvf__vzpqtyz|twxif[]dilhpj_Z_dXOZ^ftukY[Z\rxzyź}yom{yxsgt|ql}zrpx|}tlmun^din{~wc\]Whqwwm~ypqptguxvfYggmzrpheY[rn`Y`{snmsu{vrw~qic^eipnnti_\efUS\`nwugW\T_pv}r|ĵzkpxuzvofwwom{rsw|{rklthZadmy{t^ZYViqzumyrpp|ndqtsbWddkwqnfdX\qod^gwpovv|upv~pi`[`bkjjqg]YbdSS[aowvgW]Wdt|wķ{|koyw}yshx}to}wnorwyrhitm]cfo|~yc[]Xir|zn~ppozwgpuuhXcfgsqngf\Znrg^`yzrlrttxnozrhaZ_ajojtmaZ`j\S[_mxyq\^Z^px{yĻxpkws{{vuirwo~yooqs~y}ujgrp]^ajx|zgZ]Veq{p}rpowudiprhV_cboomfg]Ykrkbc{~umsutymlyrjaZ]\fkfqk_X^i[RY_oxzr\][`r}}Ļxnkvs{}zxkv{sz}vklmp}x}rgero]ado}}f\^Zjtp~qnpytgmqsdXcceoolfg\^oqk`f}{rksquuinxoh\[^]llmuk_YdjYW[cty{m[_Zftxù{{}kqvs|~wyqk|vt}}rkplw}x{oejvg]`dt{|t\]X^lvvtxrov}zifkplY\c_glmfhbYgpne`tymptq|nhvtmcZ_[clgqnbY\j`TX\nxzu^\Z^nzzĽz~onvsz{{ymx{sxvkokp}xrfetm]`bs}~{b\Z[jtzo}sou{qilqq_]eagmohhf[eooh^m}xllrm|}pftune[_\bpltth]]leWZ]nyzx`\[]kv}s}sryuzz{xnxyp~~zxmrmt{uiixo`act}}y`[X[hrvm}urx}~pijqq`_fbglqjki^fnoh_n~zllrm|rgtvqh^b]bpltui]]lgYZ\nz{zc[Z\it~s}}vryvzsz~s~{~vzmrmo|zlhvudcdtj^\[gp|lwxqv{wnlqwhbighmtolobfnpoaiz{zofoksvfmwsm_a`^oqu{se^jq`^]j||n]][forw}tyzy||wu~wvx~~|ztpslyujp|ofdj}xa^Zaivrnztsz}~rkjsqcehfhmtlpldloskbq}{qxxosntfPC>ME96AX`bkWIFLUYkdT`q}~yͯ}ozmRGFFGB?@M^UQXYUTYTR]]ik\djLnTaaeysųkbZ`h`oeFUpalu|tywqqzqqwʧi?CscA59EUwxfUPBESUae_VYjg^]azupr}}y{ɾsiwo]]\]^XRNVc]\fls~z}yppqzpm|~sXLNFC8@KOiz}}c[YetjUSo|xmehxiRA9LzsV?+8ITWPXUTdflrnb^nxpps|qiebicMKTenpu}qmpqos~ztwmiu{~uyyxzlrjaJ=<0?;08:=U^irnd`nvlgdp}{yfRGDIN^_QS^oxwyxqoka_ls}{unx~{sw|}zz|uq{{xkesxxjee[fpt{zpfm~zyyzxlb_iø¸ocL32=N_|sVRMG6),#):ALOH==MOGBCXbcbOD?FN[mg\`l{|z{zsdelnupg\Vaelqomfnxrtvwx{vqtyz}ttvoeSYdljahegzynlsoe`ctscWO82:JZmynlfZDA90=CJNJ>7AKFA>Nbei_QKOX`svhdjz~zw{zsz{}sh[bgkqqpil{{}{oosvw~z|shQLUY[ORURes~y}z~~tgdmne]]jxnaVS?6>LWbebWS_ed]\n|~~rfZ^aftn`WZhi`WXevty|~tt~|~{vslvxvukfYSTGBDMV^r~}umv~swxp{|omstxnjxzqnwvhdejlt}hdefXMJ@CO[dfaVT_dcZ\oy|znaW]^eqh]TZgg`Y\j{}rwz{|~}pqyy{wrngqssqhcUPQGDHS]g|voxx}~uqottwmhw{tq{vung`[oswztnqqlS_WJ\agtiZTdjxqYvmu}sfY]Rim`\FJa[TO[gy{|phjmv{pjqavuunmgp|kkdMPPA=L\qtr{}ssjkyuf`ck~lpf{rv{[a\h}qsjd]^X`\Xlfnoihoohs`kszs^GQ\[u`QK?^ficcdq}}{vmlz|zo{w`xnmvg[Sjnwt[_KHURXY_e~~uyrimfy|ypcbvoxy}d_raamhtojzyj[S^UouksdUXrsmigwzzwi`^UNecNTF[kcMSnswqloh\ozxqaiputkkhfaenX_LAWRHDcpz}~}pkucxzkQXmu~vyĻ{l^bahfgr}oqspXedV]\ly|vhmzpj^mn}otcLDRU]XTN^f`Yhww~{{}||utq|rohhflufjgVG_``_\UOTNJXns{xmsr|ujhpqyuvk}}}u}ojed`dzu~wybTUbl}zqnkf_sbbk|x`N]b[^URDY]a]XUjw}}jtrj[pl_`lryq_S\rhg[ZKNNOPQM`}zliputqkZ^zrbs|xxzmYpkeT_g~~h__\_m|ndf|kgjsz}peRTG]bZIBNbr`[bwqs}~wx}vgbope[bhtfcTWVdlaRFFJcXVTlmyl`lj}tdp|pobp|~~jwisaeX[fuzovnghhx{rmionslqhsts|\[TcYWODJ^db\_ecv|xtrpdghrje\[m^q^X\jeZWHEKUW[T_]uubgkxx|lintrkepv}mq~ngcgb^Tswyvhjoquq~otsukfoiwsuj`VXTZST;ScbjQ_a|ouessfjpqWaT`gba]V_]^XVE:IK_]YWMQNVlisp{fcklue[mtzx{vmny|iettpXM]\lgcjcf[Wloyv~z}xoysp^XYQXTP[_somskpvw}skZQ^`f]VWVVE>HHTTW[RQNPdnrispiihkbhmpw{npvyxkkhlq[ZY^dUbmhhYZ_n|vz~zpvuz|kaTQRH_]bldrrlqh~{y|vZZV^d^^NNTGRFMRBUXRWL[[dnlsy}vjkdWqqytkww{qqpmohic\j]dZMafhgXa\gt|xs|~rxu{}ygVVIM^cn_aqjonoz}y{tg_W\`aVRPCSVRUCHNJURY\XYbrqx{ujWgi|zdu}|}remijgq`^t]tTF^]`ib`lfcrkj|sw|nuc|~uo`X[V^k\dcT`knq{~x~od[d`qURW5OU_bLBIKIU]V[VLTdqrdq`infztzrx{{xeipnl]Zky^]YS]XO[]`rneonjpw~ustii\Ydhhb`cQ^l{vexox}zw}zqeVOfUTVCa`CDE8IU[`TPSS`yub}pjsnxlttmsvvvy^pza]]dkhjk\VNTcloec`\uhmvypxu|z_eePkcQ[YaWnmpqk{uzaKSWW`_\bOQYRQGBWMQ_ONS]Mlwv|vrbngijqkm}}~r}remon[omVbQMRYZ\kZd\]uuyywuxt_x_ZaP[dhf]lui]gqy_inW[^]_UNYLK7IN@KNTSddUiytuh~swmwl_hw|l~wsnklxhNrjdZQSS]aiiibXUlgvtx}p|v}zaaNXZdhP]gjTdofpvvsnlPVe]eISTY_VPTD9BMNThO_cnmct}wzjvsobfdorx~~bqgjpua`[YQJVVc]iZZb[eyt}zrzvoYVVTZcXic_[zykwk~sx}tzidebYN[OKVU]J@4DAFQ\Zhgggj{~qnmcvxsof~|xoixomkcVa^PAUUV^b^cxbtci|}~|xxt~y}cie^_GS]e]bnmhxtqykt~}t`hNW_RBRQ]U>?AJ@\LQ[_nfiu{uxsuujgupppn|thjj}sc^]iT]KICMbdeedqiszgz~l}sukf_bS[N^P`{jzo|soznvr~tbO^fS_FIHHRTA9APRbSViS~y|lxbjyvyj{p|xw|Vmikvq_VRdbY:KRRvexklpoqrptufn~wjXUT`JWict~pms{~{{vm{yqd]VZb`Y1GITODRCSN`\Sjppfgltsws|wy|lWobxdX]a\KZDM\]y}h~ros~{z|ul|f`caTZfZobvvjk{s}~xnrlxWbYbSOC=SJSeOMTXdYkbql|yu}~ygwsgsvqv}t{pp[hqclr_`_hWZPQnburmityyh|q}xxwzxhc]S[ljV]eqwmp|xpweY@?6)?FXdigwqmstvsytd?FAGF`|{z_QSdk~[XVL^WQORXigb^LGES9CMIrtdd{xwywnhyYhn}_AK_hnkt~zw{TMMLuqw||rU^cȤY@gPGZpz|pp[OCGFFa`^mquyjdl}ɿžzfiqq|yhUOQ[rzwdqkcfOH`kkimgf~xt|nyhHOaZkhccioqzqrw~oTWS[txmZfqvvzX?.)eṐ|lRNAQrszh^WSNgranrutstjcYRMWYlyryypcb[Rgf`lm}{ocq{|kkvf|~p|qmgOE<4,17(%+A>;JK][L68LRbdjoojcdciaiq}||ymkkcXT[[ap|wpsssmettrefjs~{j`b`yuaZj~vvtgkx~zefdicprixw{ǽͱȻ}dMFZH8)3HjõpijsxfX@A/%)8?8BDW\Q?6JOdjv}|knmukiu||zqrsocnffn}|qronxv|{|jT\cw{{r[KYd~zpin\ai}}x}{spX^`gkx~qzszxʺxgodlpTB8SI?4:UtŵzzzxpWYH<=EQNUYjj_NG[^tvswu|okx{~w|otw~rqdO\l|xqQDT\zoj^X\LTWinov~ivu|ookeQ`agr~y~r{x~~yaWcRe^G99VHF7Ba׾x}dfPPOYebenvnZaiqt}wzdpxz|~vewlZKau|pHNPbubePSGCHL_acmwhbkkzfmhiTTb^n{{vu}|zsy{ziKZTShND2JPKF7Rn̹wpd\`[osnu~riqmu{{}lfwq~zcovjcGXmWQVZxcgUKD;D=T_[azzpi]e^usdfghZPbZfv|ys{osv{}{z}xnLVWLePJ7DQKI0Gdѿvmch^s}v{|qwqvz{{kdvn||zckslcARg|b^^c|ekWKB>C9R^W`ztld[_[so|^fghUQ`Uds{yvt}qrpz|vytzxoM]YOeSQ;EONI,B\vĿynjoaxy~vwqvz||levky~y~{edplg@J`pwhheordOE@I;QaYZuuki\^Wlo|y`agfXL^T`pxx|vosrzouwys{vpxvUXaKaVTC=NOT18Tfũ}rjscr{{zq|t~}taslr{twoYggnP@[f~ptez|pv[MBNCEbaWh|mnd_X^pr{|lXdd`KXZWktz{~nv|w~tsoywqxxjwywlObRMYPR:BKWK0J^rĹzlrpe}|wspwzyfgsj}~lzrtcVahlGJblwugyxw\IGSAPgaZozloc]VbpywybZcdZJ[X_rx}|m{z{ztoqwwryvewsugNaLJPMN7?K\L7Teyözlysj|utnuyxdhrm}|fpko`PZgoNQhr|vg{z{{bKIWFRie[lzmrh\W^oyvubV^b[K[Zbv|oy|ytnpwtuxt}dmqqkNZK>FGM:6E]ZBYm}ƹǷínwzkwrpouxietpv~ebdhcMPbt^Vlwygs|{mQIZLPij`fynsl\WZkxuqcTZ`]MZ]cy~qwxslowr{}yyqwbf|nmlRUK9?DL=4C_bNauǻȶp{~nus~pnsyjiwttx_Z^e`MNdwa^r}xgt|~oQN^MWllahwnukZX\l{rn^UXa[O^^m}oz}}~phqtqx|yumuz[g{shjeOSC5;EI:5KhaVj{Ƿ´²qyuyuu|onvwhqv}ytlVV_dXISqs_hvskz~gLY[Odmk_nqov`VX`tzmfYU[cTV_ay}tqzvkkuqrx}ymmyeXptieiZOL74?JD6<^kYbr˸vwtvysmq{nmuv|spZQ[d_NLiwddo|}mvvTXcTbmpcgrnxfVZ[n~nh]VWcYU^]tzun~~|nktqpt|mjrkUhqhdhaPN:1=IG:7Xi\^i{˹ƶ}|uyywop{rnttzup\P]ebQKiudchwr{zY^fXgosegppycV[\p|mg^UXcYW[]su~~pm~|nnurou}lkq~gUhmhehdSN;1@JI;6WeYY`t~ǹʼu{y{qq}uqssyxq`P\fdWIetgbbsxx{c`k^govkdooziU\[k~ngbXUb^XZXmrx}piy|rntsppmhkyoS`ifedhWNA0;IJD3Me\YYlvǹƮw|zvnz{tuq|~qgRRcdbLUrnf`jv~xx_lhdmsweinvw[Z]_vuif`R[c\[Xbqr~~whp{yzorrrluyfhkx_Sbbd`ddPI8/BHL=9\d^Z_uz̿v}ypp}yvtuuyk_LUab_I^unh`rxzvepijnxwejoyrX]\czrgh_R_d_^Yhswxht{yyrtrslw~vfgjv[S_]d^dcNF61DHO?>`ge_e{~˽v|yno{zxsvsz}|wf[IQ]``J]uqndu}z}iqmkny{ijnzv[]]autghbS]ddb]iw{kt~x|turtks{ggfvaQ[Za^_fQE8.?GPH=]nmihétyv}rkwz{xuusyxwzdYIHX\cOUtwvluzmqplnwnjlw{`\^`pwghfV\ehhahy~prw}utptkn}hfcteQYW_^]fRD9.IVIF]hnfjx|zv|~rtttw}~}v~omestu~lUHDKRa[N_msnhvx||wx{lusgbenu}pkrdabjvhcmxxk{v}|~~stnd|}rk`kn]YQXa^jaI93:APUFOcknerxĺ}xv|}suvs{}xyxxnhetqwzeODEKUcWQdoulmx{|}v|yjxpgahnv{mlrccbmwgen|vn{u}z|~~qtje}||qj_kk\XNY`_i_G74;ARUHSenqiv{º~wv{|ttvu|vwvwmfaqouyeMCDJScZTcoxrq{~|}vy|jtqhaflqynjrfdbkzmgo{}o{v|wz}rrlav{|qk^ek^WMR^\gcL94:@PZOSeqypy|ys||uvtz|xxzq}ynf]jnpxkQBCHOb`Wbp{yu~}|xv~lnsiackmvpirieci|siozqzwztvzsol_p~yzrl^bi_XLO\\edO94:@P]SVfs}v|{yr{~|wwt}~uwxozvnd[hlpviPACIPcaZdq~|y||ww~jo~qj`dkmtmjrigcl~rkq}rzu||ru{~pog_s|ywpi\cf]VIQ[]faJ76=BV]U\ix~x}vt}}{ywx}q~qryrk]\jkss`H@FIXf^^ivy}{}t~vgxymg_ijosjophgdv|mnswvxuuqvxnn_fyyysna]fa\NJX[cfX?4;?K]XXbo}y|{|s{}}{zt~tvwowtobYgkquiN@EHQc`]co}zz~}w{~is|qkahklrlmrjibp~plo{txu~ypu}oobbuzytqe]dc_RHV[bg]C4:>GZYV]hxwx}}t|~}{t}uwxpwuqcZgkrvjP@EHPb^\`jyvwyy~ju{rmbjllrlorkibq}nkmytvt~xpv}qpcev{{usf_edaRJW\dh]C4:>FYWVZdtsux~v}|t}~wv|qvvtfZekrvmTADHM_^[^etutwz||nq|tqeinkpnnsmkbk|rjjx~tus{~pstqfbqz{vtl_dddXJS[chbL68>ATWUW]nsrvy{z~wy}|}tstuvn\_iovsaGAHHW`]]_lvsvvz{lyxtmenllpnsqnhcuzmjmxtru}umv|rmaguzzttfaddcQLX^gh]D6>?IYXYYcsrvv~y~w}wtrutwk[dktxs^FFKM_baabrwwxx~~zvmyvukgoklppusqigz{plqwtpu{rkuyrk`gtzytteccfdROZakk_F:BCO]\_^gvvzxy}x}vsstsxm]dkuyubJIOPafffet{z{y~}xxlvvungnkkoqwvumhyuoq{vpsx~tiqzqk`dpxzsuhabehWOZalmfP?FIPabechz{~{{{|}|zwpysrqws`bjszxkRKSR`iikht~z}v|~{kruvqgmlinrxxwqiwzsqzxqsvu|jY[hd\YSZiw|ttg]^bk^Vahv{xhZbceqnoln}||spu~|{{tz|vo|yvpp}{yxnrymipksuqqkv|wrgmr~{w|}xmtvyrjrrt}}uzsqt|pjddok\PXga^\Ydqy{leekrcajr}mbkimurtns}xvkpx|}~xuffwwqpjq~~srs~tlu{~mrsqzwwsp{xvnnw{~yz~|wefkmx||wyqvwiWQ^b[ZTXdoypphZYZfbW`fs{zq`bfblkljepppkhsvxx~~mdqxrrlny~onmyxltysquoxwwvpxyxunwzy}zz|yfcklvz}w|vx}sbWbkcc\\enxpmiZXXceZafr{ztcae`iiijdmoomforzw}~pgs{vwpqy|nmmyzpx{trtnwuwvpxxyunux|}yy~zgfkltw}zw}w{ue\hoiiabhnwnlgZYYfh^eiu|zscac_gfijdlmolfmp|x}}uju~y{srx~}{ommy~tz|vqtmttuwqvxxwntv}zw{}~lejjqu{|u}yyzmahsnngcilupjk^\[emchjr}{vhad^dggkfjmnpfknxv|z}pq}}yrwzz~snntyy}~qtopusxtsxw{rqvz}}xw~~wfhimtx~xx}v}~vidruqpfhjotklg^^`mlgmmx}yrddb`gejjfllqmhnp|w{zzpx~xtxz~z|qppyy}}zstnsttysuwx{qtw~}|wu~|seiiou{y{}w~~vjguutrhjkorjmgaacpnkonz|yqefcahflkhmlrnjorzvzz{qy~yuxy|z|srqy{~~{tunsttyuuvx|tvy{|vsy{|~~ueiiow|}|w|~xnhtwuujkknsknkcccoqlqnx}zujhfbihlnjllrrlqt~~uzy~tu}uxx~~y}usrv}~vwprutywuvv~ww{~z~|vruzy{|vgikox}}w{~xpitwuwmlmnslomeeeornsow~{vljhcjilokmlstnsv~|uzz~uw}wyy~}y}usrw}xxpsutzwvuwxx|{~~~ztpv~xyyzrfklrzw}}xplwwxwnooqsmrlgghrrqtq{~{ummgfkinolmmvspux~wxz||u}zyz{z|{tts{}}|yupvtvzvvt{}w{}|~}}|vrp{|}xyyxkimmw|~{z|wnszw|uqrquqqrjihntqvrv}yrolflklqnnlrvptv}}{vzyx{z|{|{}vusx}~~zxquuuzwvtx~wy{~||~|}wsox|xyxynhlktz~~z~zrt{y}ystrvrqtlkimtrwtu~}{tqoglllqonkpvpru{||vyxz}|~|{{~vutx~~~|yqvuuzwvsx}vxz}}|~||vrpy{yyxxmiljsx}}|{ux}{{vwuwssumlkoutxtv~{usohmllqonkpvpqty~||vyv}}~~}|{~wvtw~~}zrvvuyxwru}vwy}|}}{|wsou{zyxxpiljpv|~{}xx~|yywxvtwpnmnuuywu~|xtsjmnlqqplmvqqsw~|vyvy~~zzvvu|}}~}uswtwywtq{yvxz{}~||ytqpz|{|yxwvkkkktx|~|x|~~~{{yytwvoonrvw|vz~|wvqkpmnrqokrvqsuz}{{vyv|}|ywvw}~~}suwtxxwss|xwy|{~}|z{wsoq{z|{ywwsjmlmuz||y~~~}|zyuyvppotvy}w||xxqlqnpsrpksvruv||zzwyv}|{ywvw|~~~tuwtxxwss|yxz}z}||}yywrooxyy{xwvtlnnnv{~}z~~~}{zuxxqqpsvy~xz~zzumrpossrlrytvx}|y}|w{x|}{{www{}~vtxtwxxtr{{y{}z~~z~|{xwvqnmuww~zxwutmnpow|~{~~~|{vyysrqtwyzz{{vnrqpstsmszvxy~~{x}{w{y}}{zwww{|~vuxtwxxtr|{z|~z}{~z{}vwtpmnvvx}yxvusmqpqy~~|~}{v{yssrvw|z}~||totqrttrnvzwy{|yxxy{y{~xxwy{~|txvuxxwqv}y{||{{|~}y}yuvromrvu{|xwuuonrou{}~xy|vutuwz}{}}zqssqtutorzwy{~}zx|zx{x|}|zxxx{}uwwtwwwrs|yz{~~z|{}~~y|ztvrompvuz}yxuupmrosy~zz~xuuuxz{~|sturtuupqywxz}~}zx|~yw{w{}}zyxy{}uwxuwwwrs{xyz}}{{{}~}y|ytvromqvu{|yxutnnqnrx~{{~xwvvy{||suuruuupqywxy|~}zx|~ywzwz~}|yyy{}wwxuvwwrrzxxz|~{|{}~~y{ytuspnpvty}zxvtomqnpw|}{{wwwyz}vuwstuvrpxxwy{~~~zyz~zvzxw}|zzyz{{vyvuwwupvzwyz~{~{|}~{z{uttqonsuu|{ywurmoqnsy|~yxxyz}}uwvtvvvptzwyz}|~|zx|~}xvzwy}}zzy{|xwyuvwwsqxyxz{{~{||}zzzssspnottv|zywtqmqqpu{|yyxyz~}uxwuvwvquzxz|{}{yx{}~|ww{xz}}zzy{|ywyuvvwtqxyxz|z~}z{||zyysrronnsst{zywurnqsqv{}~zyyyz}wxxuvwwst{z{}z|{xwy~|}yv{zz}zzyz{{vyvuvwuqwzx{|~~~~z}~zz{{yxyrqronmrssz{ywusorusw|}~{zyz{}wxxvwwxtu|{|~y{zxwy}{|xw|z{}~zzyz{zwyvuvwurxzy{}~~}~}z}}zzz{xxwqpqnmnsrt{zywurotutx~}{zz{{~wzxwwxwsx|{}|yzxww{|{~{vy|z}|zyzz|wxxuvvvrtzyz|~~|}~~{{{zzzywxtoqonmqsrx{yxvtpqvtv{~{{{{}zyzwxxxuu|{|~~xzywwy|{~|ww|z{~~zzz{|ywyvvvvsryyy{}~|}}~{z|zzzzwxuoppnnptrv{yxvtpoutuz|{{|}{z{xxxxvu{{|~~xyyxwz}{~{wv{yz~{zz{|yxyvvvvrrxxxz|~~~|}}~{{|z{zzwyuopponqtrw{yxvsootsty~|||}~|{{yxxxvu{{{~~xyyxwz}{~{vuzyy~{{{{|zxyvvuvsrwxwz{~~}|}~|{}{{zzxxvoppooqtrv{zxvtpnsssw|}}|}~~{|zyxywuz|{}yxyxxy|{|~|xtxzx|}{{{{~xyxvuutquxwyz}~}~||}}z}|{{zywxropooostsyzywurnptsuz~}}}~|||yyyyvw|{|~}wxxxxz|z~}zvuzyy}|{{{||xywvuusrvxwy{}|~}||}|z~~{{zzxwwpnpooptssyzywurnrutw{~}}~|}|zyyyvx}|}|wxxwwz|z~}zvuzzz~|{{{||xywvuutrvxwy{}{~|{{|{y}~{zzywwwqnoooosssyzyxvsorvuw{~}}~}}}{zyywx}}}}wvwwwy|z|~{xuz{{~|{z{{~}xyxvuutrvyxz|~{}|z{{{y|~{zyywvwqmnnnosssx{yxvtprwvx|~}}~~}}{zzzxx}}~~|vvwvwy{z|~{wv{|{|{zz{|xyxvuutrwyxz|~}z|{zz{zy}~{zyxvvvomnnopsssyzyxvsptwwz~~}~~}~}{zzzwz~~~zuvvvwz{z~}zvw|{}~{zzz|zyywvuustxxy{}~{{|zzz{yz~|zzywvvsmnnnortsvzzywuqqwwx|~~~~~|{zzxy~~~~|vuvvwy{z|}{wvz{{|{z{{{yzwvuussxxxz|~{z|{zz{zz~~{zyxvwtnnooprutvzzyxurqvww{~~~~}{{zyy}~~~|vvwwxz|{}}{wvz{{~|{{{|{zzxvvussxxxz|}{z|{z{{z{~{{zxwwtooppqtvtw{{zxurqvvwz~~~~}|{{yy}~~}wvwxy{}|~~{wvz{{}}{{{|}z{ywvvtsxxxz{}{z|{z{{z{||{ywxvpopqrtwvw||{yvsquwwy}~~~~}|{zx|~}yvwxy{}}}|yvx{{|~|{{{~{{{xwvusvyxy{|~}y{|zz|zwvtstuvwyzywusqqrtvz}~}||}~~~~|zxvuttuvvwyz|}~}}{}||}~~}||{{||}}}}|{zywutrqqqrrsuwz|~{qksztrstvwwvtsqppprtvy|~~~|{zz{}}|zxxwxyz{}|ww}~~~}{yxwwxy|~~}~~~~}}}~zsnlou}|zwurpmjhfefgilnpstttrqpprtw{~~{yxxy{}}|}}}||}}|xwx|~|zxvtsstuwz|~}||~{wspnpsy~}zwtqnkihhijloqsttsrpooqsvy||ywvvw{~||{|}~~~~}zxwz~}zxvtsstvx{}~}|}~~|yuqoorv{~{xuroljiijlnprtuusrqppqtwz}}zxvuux{~|{{|}~~~{xwx|}zxvtstuwy|~~||}~~|yvrpopty}~|yuromkkkmnqstuvusrppqsux{~~{xvttvy}}|{|}~~~~|ywwz}~|ywuttuwy{~~|||~~}}zwsqooqv{~{xuqomllnoqtuvvutrqpqrux{}~{xvttux{~|||}~~~~~|ywvx{}zxuttuwy|~}|{|}~}~~~~~}zwspnnpsx}}zvsponnoqsuvwwvtrqppruwz}}zwuttuwz~~}||}~~~~~|ywuvy|~{yvuuvwz|~}|{{}}}}~~}}~~}zwtqonnquz}yvsqppqstvwxxwusrqqrtwz|~}{xutstvy}~}|}~~}~~}zwuuwz~~{xvvvwy|~~|{{|~}||~}}}}}~~|zxurpnnpsx}}yvtrqrsuwxyyywusrqrsvy{}~|ywtsstwz~}}}}~}}~~}{xvuvx|}{xwvwy{}}|{{|~~|||~~}||||}~~}{yvsqonoquz}zwtsstuwxzzzyxvtsrsuwy|~~|yvtssux{}}}~~}}}~~{xvuuvy}|zxxxyz|}~|{zz{}|zyy{~}||}~~}{yxwvuuttuuvxz||xurqqrtwy|}~}|zxwvvvwxz{||||{{z{{}~~~|zzz{}{wsrrtx~}xtrqruy}{wutux}~yvuwz|{{}}yvuuvx{~|xtpmllmpuz~}}}}}}}}}|{yxvutttuwz}}yvsqpruy}{{|~~}}~~|{{{{|}~~~~~}}~}yvttuwy|~}|||}~~}zvtsstvy|~~|yurommorw}{wtsrtwz~}yurppsvz{vrpprv|{yxz}}{zz{}}zwusssux|}||}~~}{zyxy{}}{yyz}~~}{xvtssrsstuvwxyyz|}}zwvuvwz|~|ywuuvx{~|yvuuwz}{yz{~|zxxxy{}|zwuuuwz~}yvuuwz~|yvvx{~zwvwy}~|yxwwwxz|}~}{yuromllmpty~~|zxxxz{}}|zxxxyz|}~~}|zyyz|~~~~~~|{ywvvvwxz|~zwvwy}}ywvx{{wuuvz~~}|}~}zxvtssstuvwxyyxwusrrsuz}||~~|yxxyz|~}{zxwwwxyz|~~}}}~|zyxyz|~|xtrqrtx}{yxy{~~{xwxy|}|||}~~|zyxxxz{}~~}{yvsqppqsuvwxwwwx{}|}~{ywwwxz}}zwusrrtvy}~~~~~|zyyz|~{wsqrtx~~|zzz{}~~}|{zyxxxyz}~}}}~|yvttuwz|}}{xuqonoqtvxyyyyz}~|{|}~{yxwwwxyz{{||||}}~~}||}|yxxz|}zvsrruz}{zyxxxy{}~}}}}~}|}~|xustvx{||zwtpnnoqtvyz{|}~}||{{{{{||}~~|ywutuvx|~}}}{|}~{yxxy|}~~}{xvttux|}{zzz{|~}{zxwwwy{~|{|~{wtssuwy{{zxuronmmoqux|~|zyyyyyz{|}~~~~}}}~~}~}{{}~{xwvvvwyz{|}~~~}{yxxyz|~~{xwwx{~|{{|~}zwtrrrstuwxxxxwvutsstvx{~~}|{{{|~|ywvvwz}~}||~}zxwxz}{xurqqqsvy}}zxwx{~~zwuvy|}xutuy~{{}|wtstvx{~{wsolkklnpsuwxxxxy|~}~}|{{{{{{|~~{zy{~{xwx{~|xutuwz|}}zwtrrtx}~}|{{{zzz|~|xtrruz~zxx{~~zyy{}~}zvrnlmpsw{||zwtqpprux|~|zz{}|wtsuy~}|}}zwvwy|~{ywvuuuvwyz|~~~}{{{}}{yyy{~}|{{}{xvuuvwy{~~|yvsponnoqsuvvuuttvy~}{|~yvvx{}yvutuw{~|{zz|~~{yy{}~{wsqrty}{xuvy~{yxxy{~~|zyxwwxz}}{{|}{|{vqooruxz{ywtqpoopqsvx{}~{zz{~|xvwz}||}~|{yxvuuuuvxz}~}{{{}~|xwx|}zyz|~~{xutuw{}{zyyyz{}|yurommnptwz{zxtpmlnsz~~~{xvutuvx{~~|{|~{xxy||yvvwy{{zwuttw{~~~~}|zxwvvwy|~||}}|}~yussvz}~~zvqnlmoruwyyxwuutuwy|}{zz}{xxz~~~~||~|yvuuvwyz{{{{{{{||||{{zzz||zz}|zz{~}yusstw{}{zyz{}~|{ywvusrqqrsuwxxwtrpnorvz}}zxwvvwy{}~}|}|xvvx{~~{vrppsx|~~}{yxwvvwy{}~|{z|}zyz~}xutvx{}}{xurpooprtuvwwwvuuuvwx{}|{{}|ywy|~|yxwvvwxy{|}~~~}|zxwvvvx{~||}~{zz}}zwutux{~~~}||}~~{xusqppqsuxyzywtqnmmpswz|{{z{~}{zzz{{|}}~|z{}}ywxz|~~{xtqqrvy|~~~}~~|{yxwwwxz}}{yy{~~}}{xwwy{~~|yurpooqrtvvwvutssrstuxz}~|z{}}{|~}{zxxwxxyz{|}~~}|{ywvutuvy|}yxxz}}zxwwxz{}~~~~}~|wtqnnorvy|~~|xtoljkmqtwyyyz|}|{{{|~}}~|xwx{}||{yvtqqruy}|zwwwy|}|}~|yvttuwz}}zwwxz}|ywvx{~ytomlmpswz|}|{xuromlklnquz~}}{wvw||{|}ywvwxz}~{xuronmnpsw||xwx{|xussuy}{xuttw{|zyxxxyz{|}}}|{yvroljikmqtwxyyyz|~~||}~{yy{~|yxy|}zxxxyyyxvuvx{~|yvtstux{~~zxwy{~zvtstvy}|ywwy}~}|yvsqppqsuxz|}~}{yvspnlkkmoquy}~~zxy|}{{|}~|{zz{|~~{wtqpoopruy|~~|{z{|~~{yxwvwxy{|~~}|{zzzzz{}~}zwspmlmnpqsttuuwxyzzxwvwy~~}}~~}}|zxvuuvy|~~|xurppsv{~{yxyz|~~}{zzzzyxwvuuwz}}zwtrqqrtvxz{|{zwtqmkjknqvy|}}|{z{}~{yyyz||}~~~|{{{|~|xusrsuxz||{ywuuwz}~~~|zzyxxwvvvvvwxz|~~}{yxxxyz|~|xtqonpswy{zvrnkknrx|~~|ywvx|~~~~~}{{|}~~|zxvuvxy{{zyvutuw{~|{zzzz{||}}}}}~~~|zxvvwxz|~~{xvuvx{}~}{xusrrtvxxvtqnmmosw{~~}||}~~}||{|~}{{}|xtrrsvy|}zwvuvy|~~~|zywvutuvxz|~}|{|~}zxwxz|~~{xtqppruxyzxwtsrqqrsuwz}~~~~|zyz|~~zwusstuxz}~~~~}}|{{{{{|}~}zwutux|}zyy{|xvuux{}~|yvsqppqrtvxyz{{zzyxxwwxxz{~~}|}~~~~}~|zyyz{|}~~}|zywvutuvxz}~{zyz{|~~{yvuvx{}}}~~}zzywxywvwwvwy{}}|~~~|zyyy{}~~}zxwvwz|~{zyy|~|{|}~}{zyywvty}zxvutuwy|~~|xtpmlnqv{~|zz{~~wu~zwuuuuvxz|~|ywvvwy|}zwvuuuwz|yxxz|}{yyzz{|}}~}yvv{}{zz{|~~|zxwwxy{~}}~{yy{~|wspnnryysnkjjknquxz{{zwurqoopqsuwxyzzzzzyxwusrqqtx~~yvuvx|{xwwz{xwwy{|yvuuwz}}ywuuvy~}|}|vpkiilr{~{yyyz{|||zwtpmkiijlosvz|~~}{xvsqppqrsstuw{~zwuuw{~~|wspprx}||}~}|zzz{|}}zwvvx{{vqmjjmrz|wutuvy{|||zwtpnlklmpsvy|}~}{xurpoopqqrtvy}}zxvwxz}}||}~zwuvy~~{z{}}yvuuwz}~|zxvwx|}|{|~ysnkjlqy}|||||{zxvtsqppooprsvx{}~}|zwtqonnoprsux{}||{{||~{uqopt||{{|}zwvwx{~}|{zyyz|~}}}~||}~}yuqmklpv~{z{|~~{xurppppqrstuwxz{|||zxuspnmlmnqty~~|{zyzz|}~}}~~yussw}}{|}|yvvwy|}{{zzzz{|~}|{{|~|ytoljlpx~||}~zwtqppprsuwxyzzzyyxwvvutsrqpppqtw{~}{zz{|~~~{wtsuz~~~|zyyy{}~|{yxxwxy{~~~~|yxxy{}~~{wrmjjms|}|}{wtqpoprtvy{|}}}|zxvtrponnnopruy}~}|{{||~~~|xutux~}{zyy{|~}||{zzzz{|~~{xvwxz|}|yupljkpw~~{xvtsssuvwyz{{{zyyxwvutrqqppqrux|~|zyz{|~~{xustx}|yxwxy{~~}{zyxwwxz}~{xwwxz|||yvqmklou|}zwutstuwy{}~~~}|zxvusrqpppqqstwy}}{zzz|~~~~~{wsrrv{}{{z{|~~}}|{{zzzz{|~~{xwwxyz{{yurommpt{~{yvuuuvwxz{|||||{yxvtsrppopqsux|~|{zz{}~||}}yusrtx}~{yxxy{}}|{zyyyzz{|~~{yxxxz{{zyvrnlkmqw}|zwvvvwy{|}~~}|{zyxwvutrqqppqsvy}~|{{{|}~||}~}zvtstw|}{zz{|~}{zyyyyyz{}~~~~}zxvuvwxyzyxurommptz~zxvvvwy{}~~}|{yxwvutsrqqqrtwz~~}}||}~~|{{}~}zvsrsw{~|{{{|}~}{yxxxxyz|~~}}}~~{ywvvwxyyxvspmlmpu||ywwwxy{}~}|zywvutsrrrrsux{~~|{{{|}~|{z{|}~~|yvttux}}|{{|}~~|zxwwwwy{}~}}}}|yvtttuvwxxwtronoqv|}zxwwxy{}~}{ywutsrrrrsuwz}~}||}~}{zz{|}~~}{xvttvy}{{{|}~~}{zyxxxxy{}~}|||}~~{xvtsstuvwwvtqpopsx~~{zyxyz{}~~|zxvusrqqrsuwz~~||{||~}{yxyz|}~~}zwustw{|{zz{}}{zxwwwwxz|~}|||}~~|yvtssstuvwvusqpprv{}{zzz{|~~|{ywvusssstuwz}~}|{|}~~{yxxyz|~~}{yvtsux}}{{{|}~}{zxxwwxyz}~||{||~~{yvtsrstuvwvusqooquz|{zzz|}}{ywutsrrstvy|~}}|}}~~{yxxyz|}~}|yvtstw|}{{{}~~|zyxwwwxyz}~|{{{|}~{xvtsrsuvwwwuspnnosx}~||||}}{yxvuttttuvx{~~}}}}~~{zxxyz|}~}{yvtstw{~|{{|}~}{yxwvvwxy|~~|{{{|}~~{xusrrstvwxwvsqonoqv{~}|{|}~|zxwuuttuuwxz}~}}|}~~{zyxy{|}~}|yvtssuy~}|||~}|zxwvvvwxz|~}|{{{|}~~|yvtrrrsuvwwvtronnpty}||}~~{yxvutttuvxz|~~}||}~~|zxwxy{|}~}{xvtstw{~}||}~~|{yxwvvvwy{}}|{{{|}~~|zwtrqqrtuwwwvtqonoqv{~}}~~|zxvuutuvwy{}~}|}}~~{yxwxyz|}}|zwussux|~}||}~}|zywwvvvwy{}~|{zzz{|}~~|ywtrqqqstvwwutrpopsw|~}}~~}{ywvuuuvwy{~~}}}}}{xwvwxy{|}|zxvttux|}|||}~~|zxwvvvvxy{}~|{zzzz{|}}{yvsqppqrtvvwvtrqpqtx}~~~}{yxvvuvwxz|~}||}~}zxvvvwyz|||zxvuuvy}~|||}~~|zxwvuuvwy{~}{zyyyz{|}~~|zxurpppqrtvwwvtrqqruy~~~~~~|zywvvvvwy{~}}}}}~|ywvvvwy{||{zxvuvw{}||}~~}{yxvvvvwxz|~~|zyyxyz{|}~~}{yvsqpopqsuvwwutrqrsw{~~~|zywvvvwxz|~~}||}~|zwvuvwxz{||zxvuuvy}~|||}~}{yxvuuuvwy{}~|{zyyyz{|}~~~}|ywtqpooqrtvwwvtrqqsuz~}{yxwwwwxz|~~}}}}~|zwvuvwyz|||zxvutux|}}}}~~|zxwvuuvvxz|~|{zyyyz{|}~~~}{yvtrpopqsuvwwutrqqruy~~|zxwwwwxz|~~}}~|ywvuvwy{|||zxvttuw{~}}}~~|zxwvuuuvxy{~~|{zyyyz{|~~~}{yvtrpppqsuvwwvtrppqtw|}{yxwwwxz{~~}}~}zxvvvwyz|||{yvuttvy}~}}}~}{ywvuuuvwxz|}{zyyyz{|}~~}|zwtrpopqrtvwwvusqpprvz~~|zyxwwxy{|~~~~{ywvuvxy{|||zxvttuw{~}}}~~|zxvuuuuvwy{}~|{yyyyz{|}~~~}{xvsqpopqsuvwwvtrqpqsw|~|zyxxxyz{}~~}~}zxvuuvwy{||{zxvttvx|~}}}~~|zxvuutuvwy{~}{zyxxyz{|}~~}|zxusqoooqstvwwvusrqrtx|~|{yxxxyz|~~~}~~}zxvuuuwyz||{zxvuuvy|~}}}}~|zxwuuuuvwy{}}{zyxxxyz{|}}}|zxusqonoprtvwwwvtsrsux}}{zyxyy{|~~}}}~|ywuttuwyz|||zywvvwy}~}||}~}{yxvuuuuvxy{~~|{yxwwxyz{|}}|{ywtrponoprtvwxwvtsstvz~~}{zyyyz{}~}}}~~{yvuttuwy{||{zxwvvx{~~||}}~}{ywvuuuuvxz|~}{zxwwwxyz||}}|zxvsqonopqsuwxwwutssux|~|{zyyz{|~~~}}~|zwuttuvxz|||{ywvvwy}~}||}~}{yxvuutuvwy{}~|zyxwwxyz{|}}|{yvtqonnoqsuwxxwutsstvz~}{zyyzz|~~~~~|zwuttuwxz|||{ywvuvx|}}}}~~|zxvuttuuwy{}~|zyxxxxy{|}}}|{yvtqpoopqsuwxwvusrrsvy~}{zzyz{|~~~~|zwvuuuwy{|||zxvuuux{~}}}~~|zxvutttuvxz|~~|zyxxxyz{|}}}|{yvtrpoopqsuwxwvusrrsux|~|{zzzz|}~~}zxvuuuwxz|||{ywuuuwz}~}}~}{ywvuttuvwy{}~|{yxxxxyz|}}}}{zwurpoooqsuvxxwvtrrrtwz~}|zzzz{|~~~|ywuuuvwy{|||zxvuuvx{~}}~~~|zxwutttuvxz|~}|zyxxxyz{|}}}|{yvtqpoopqsuwxxwutrrsux|}|{zzz|}~~~{xvutuvxy{|||zxvuuvy|~}}}~~|zxvutttuvxz|~}{zyxxxxy{|}}}|zxvsqooopqsuwxxwvtsssuy|}|{zz{|}~~}{xvuttuwy{|||{ywvvwy|~}|}}~~|zxwutttuvxz|~}{zxwwwxyz{|}||zxvsqonnoqsuwxxxwutstvy}~|{{{{|~~~~}zxvtttuwy{|||{ywvvwy}~}||}~~|zxwutttuvxz|~~}{yxwwwxyz{|||{zxusqonnoqsvwxyxwuttuwz~~|{{{|}~~~~~|zwutttvxz{|||zywvwxz~}|||}~}{yxvuttuvwy{}}|zxwwwwxyz||||{yvtrpnnopruwxyyxvuttvx|~}|{{{|}~~~}{xvtttuwy{|}|{yxwvwy|~}||}~~|zxvutttuvxz|~~|zyxwwwxyz{|||{ywurponoprtvxyyxvuttuwz~}|{{{|}~~~{xvuttuwy{|}|{yxvvvx{~}||}~~|zxwutttuvxy{~~|zyxwwxyz{|}}|{ywurponoprtvxxxwvtsstvz~~|{{{|}~{xvutuvwy{|}|{ywvuvx{~}}}}~~|{ywutttuvwy{}~|zyxxwxyz{|}}}|zwusqoooprtvxxxwvtsstvy|~}|{{|}~~|ywutuvwy{|}|{ywvuuwz}~}}}~}{yxvutttuvxz|~~}{zxxxxyz{|}}}|zxvsqpooprtvwxxxvussstw{~~|{{{|~}zxvutuvxz{|}|zywvuvx{~~}}}~~}{ywuttttuwy{}~|zyxxwxyz{|}}}|zwusqoooprtvxyxxvusstux|}||{|}~|zwvutuvxz|}}|zywvvwy|}}|}~~|zywutttuvwy{}~|zyxwwxyz{|}}|{zwurpoooprtvxyyxwutttvy|~}|||}~|zwuttuvxz{|}|{yxvvwy|}|||}~~}{ywvutttvwy{}~|zyxwwwxyz||}|{ywurponoprtvxyyywvutuvy}~}|||}~~|ywutttvxz{}}|{zxwwwy|}|||}~~|{ywvuttuvwy{}}{zxwwwwxyz||||{ywtrponoprtwxyyyxvuuuwz~~}|||}~~{yvuttuvxz|}}|{yxwwxz}~||{|}~~|zxwutttuvxz|~~|{yxwwwxyz{|||{zxvsqooooqsvxyzyxwvuuvx|}|||}~|zwutttvxz{}}}{zxwwwy|}|||}~~|{ywvuttuvwy{}}{yxwwwxyz{||}|{yvtrpoooqsuwyyyxwvuuuwz~~}||}~}zxvttuvxz{}}}{zxwvwy{~}|||}~~}{ywvutttuwy{}~}{yxwwwxyz{|}}|{yvtrpoopqsuwyyyxvuttuwz}~}||}~}zxvutuvxz|}}|{yxvvvx{~~}||}~}{ywvutttuwxz|~~}{zxxwxxy{|}}}|{ywtrpoopqsuwxyyxvutstvy|~}|||}~{yvuuuvxz{}}}{zxvvvwz}}||}~~|zxvutttuvxy|}}|zyxwxxyz{}}}}|zxusqoooqrtvxyyxwutstuw{~~}||}~|zxvuuuwy{|}}|{ywvvvx{~~}||}~}{yxvutttuvxz|~~}{zxxwxxy{|}}}}{ywtrpoopqsuwxyyxwutttvx|}}||}~~|ywuuuuwy{|}}|{ywvvwy{~|||}~}{ywvutttuwxz|~~}{yxwwwxyz|}}}|{ywtrpoopqsuwyyyywvutuvy|~}|}}~~|ywuttuwxz|}}}{zxwvwy{~|{{|}~}|zxvutttuvxz|~}{yxwwwxyz{|}}|{ywtrpoooqsuwyzzyxwuuuwy|~}}}}~|ywuttuwxz|}}}|zxwwxy|}|{{{|}~}{zxvutttuwxz|~~|{yxwwwxyz{|}}|zyvtrpoopqsuwyzzyxwvuvwz}~}}}~}{xvuttuwy{|}}}{zxwwxz}}{{{|}~~|{ywvuttuvwy{}}|zxwwwwxyz||}|{zwusqoooprtvxzzzywvuuvy{~}}}}~~|ywuttuwxz|}}}|zxwwwy|}|{{||~}{yxvutttuwyz}~~|zyxwwwxyz||}}|zxvsqpooprtvxyzzyxvuuvxz~~}}}~|zwvutuwxz|}}}|zxwvwy{~~||{|}~}|zxvutttuwxz|~~|zyxwwxxz{|}}}|zxvsqpooprtvxyzyxwvutuwz}~}}}~|zwvuuvwy{|}}}{zxwvvx{~~}|||}~~|zxvutttuvxz|~~|zyxwwxyz{|}~}|{yvtrpooprtvxyzyxwuttuvy|~}}}~}{xvuuuwxz|}}}|zxwvvwz|~|||}~~}{ywvtttuvwy{}~}{zxxwxxz{|}~~}|zwusqpopqsuwyyyywvuttuxz~}}}}~|ywvuuvwy{}}}|{yxvvwx{~}|||}~~|zxwutttuvxz|~~|zyxwwxyz{|}~}|{yvtrpooprtvxyzyywvutuvx|~}}}}~~{ywuuuvxy{}}}|{yxwvwy{~~}|{|}~~|zxvutttuvxz|~~|zyxwwxxz{|}}}|{yvtrpooprtvxyzzyxvuuuvy|~}}}~~{ywuuuvwy{|}~}|zxwwwy{~~}{{{|}~~|zywuuttuvxz|~~|{yxwwwxyz|}}}|{yvtrpoopqsvxyzzzxwvuvwy|~}}~~{ywutuvwy{}}~}|zywwxy|~|{{{{|~~|zywuuttuvxz|~~|zyxwwwxyz|}}}|zxvtqpooprtvxzzzzxwvvvxz}~}}~}zxvutuvxz|}~~}{zxwwxz}}|{z{|}~~}{zxvuttuvwy{}}{zxwwwxyz{|}}|{ywusqoopqsuwyz{zyxwvvwy{~}}}~~{ywutuvwy{}}~}|zywwxy{~~|{{{{}~~|zxwutttuvxz|~}|zyxwwxxz{|}}}|zxusqpooqruwyzzzyxvuuvxz}~}}}~~|ywvuuvwy{}}~}|zxwwwx{~}{{{|}~~|zywutttuvxz|~}|zyxwwxyz{}}~}|zxvsqpopqsuwyzzzywvuuuwz}~}}}~|zwvuuvxy{}}~}{zxwvwxz}}|{{|}~~}{ywutttuvxz|}}|zyxwwxyz|}~~}|{xvtrpopqrtwxyzzywvutuvy|~}}}~}zxvuuvwy{|}~}|zxwvvwy|~||{|}~}|zxvutttuwy{}~~|{yxwwxyz{}}~~}{ywurqppprtvxyzzyxvuttuxz~~}}}~~|ywvuuvxz|}~}}{yxwvwxz}}|{{|}~~}{ywvuttuvwy{}}|zyxwwxyz|}~~~|{yvtrpppqrtvxyzzywvutuvx{~}}}~~{ywuuuvxz|}~}}{yxwvwy{~}|{{|}~~}{ywvuttuvxz|}}|zyxwwxyz{}}~}|{xvtrpopqrtvxzzzyxwuuuvy|~}}~~~{ywuuuvxy{}~~}|zywwwy{~}{{z{|}~~}{yxvuttuvwy{}~|zyxwwwxz{|}}}|{yvtrpooprtvxzzzzywvuvwy|~~}~~{xvuuuvxz{}~~}|zyxwxy{~}{zz{{}~~}{ywvuttuvxz|~}|zyxwwwxz{|}}}|zxvsqpopqrtwyz{{zywvvvxz}~~}~}zxvuuuvxz|}~~}|zxxwxz|~|{zz{|}~~|zywuuttuwxz|~~}{yxwwwxyz|}}}}{ywurqpopqsuxyz{zyxwvvwx{~~}~~~{ywuuuvxz{}~~}|zyxwxy{~}{zz{|}~~}{ywvuttuvxz|~}{zxwwwxyz{}}}}|zxusqpopqsuwyz{zyxwvuvxz}~}}~~|ywvuuvxz{}~~}|zywwwx{}}|{{{|}~~}{ywvuttuvxz|~}{zxxwwxy{|}~~}|zxusqpppqsuwyzzzywvuuuwz}~}}~|ywvuuvxz|}~~}|zxwvwxz}~|{{{|}~}{yxvuttuvwy{}}{zyxwxxy{|}~~~|zxvsrpppqsuwyzzzywvutuvy|~}}~}zxvuuvxy{}~~}|zywvvwy|}|{{|}~~|zxwuutuuwxz|~~|zyxxxxyz|}~~~}{ywusqppqstvxyzzyxwvuuvxz}~~~~|zxwvwxy{|}~~}|zyxwxy{}~}|||}}~~}|zxwvuuvwxz{}~~}|zyxxxyz{|}~~}|{ywusrrrstvwyzzzzxwvvvxy|~~~~|zyxwxyz{|}~~}|{yyxyz|~~}|||}}~~}|zyxwvvwxyz|}~~}|{zyyyyz{|}}}}|{ywvtssstuvxyz{{zyxxwxyz|~|{yxxxyz{|}~~}}|{zyz{|~~}||||}~~~}|{zyxwwwxyz|}~~}|{zyyyyz{{|}}}|{yxvuttttvwxyz{{{zyyyyz{}~|{zyyyyz{}}~~~}|{{z{{}~~}||||}~~~~~}|{zyyxxxyz{|}~~}|{zzyyzz{||}}||{yxwvuuuvwxyz{{{{{zzyz{|~~|{zyyzz{|}~~~~}|{{{{|~~}}||}}~~~~~~}|{zyyyyyzz{|}~~~}|{zzzzz{{||}||{zyxwvvvvwxyz{{|{{{zzz{|}~}|{zzz{{|}~~~~}}||{||}~}}}}}~~~~~}}|{zzyyyz{{|}~~~~}|{{zzz{{|||}}||{zyxwwvwwxyz{{||{{{zz{|}~~}|{{{{||}~~~~}}|||||}~~~}}}~~~~~}}|{{zzzzz{||}~~~~~}||{{{{{{||}}}||{zyxxwwwxyyz{{||{{{zz{|}~~}||{{||}}~~~~}}||||}}~~~~~~~~~~}||{{zzz{{||}~~~~~~~}||{{{{{|||}}}}|{{zyxxxxxyzz{{||{{{{{{|}~~~}|||||}}~~~~~}}|||}}~~~~~~~~~}}||{{{{{{||}}~~~~~~}}|||{{{|||}}}}||{zzyyyyyyzz{{||||{{{{||}~~~}}||}}}~~~~~~}}}}}}~~~~~~~~~~~}}||{{{{{||}}~~~~~~~}}||||||||}}}}}||{{zyyyyyzz{{||||||||||}~~~}}}}}}~~~~~~~}}}}}~~~~~~~~~~~~~}}|||{{{|||}}~~~~~~~}}||||||||}}}}}||{{zzzyzzz{{||||||||||}}~~~}}}}}}~~~~~~~~~}}}~~~~~~~~~~~~~~}}}||||||||}}~~~~~~~}}}|||||||}}}}}|||{{zzzzz{{{||}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||||}}}~~~~~~~}}}|||||||}}}}}|||{{{zzz{{{||}}}}}}}}}~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||}}}~~~~~~~~}}}}||||}}}}}}}|||{{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||}}}}~~~~~~~~}}}}}}}}}}}}}}}}|||{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}}||||{{||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}|||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||}}}}}}}~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|||}}}}}}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~}}}}}}}}~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m43.bin b/applications/PoP/poc/res/music/m43.bin deleted file mode 100644 index 0aba339..0000000 --- a/applications/PoP/poc/res/music/m43.bin +++ /dev/null @@ -1 +0,0 @@ -{{pɃhea||xz|ɰTq\auXSoƇ_iwY>~{i}2}iyO}9m~oymeo{_^bE~|ssOgqudl=^~yOlMKoaLPjigFWkylzcdfqOmwz~v]gd^ulpgv´pY]fgZ\yzu:Gse~``Gvdak|k\_uʫ|̲XNt_iqrrv}Tgjn[\k[f{3M{c7Hwbb`Qh[n`kyzwV~rX`msojWxÜag\/!OOnyoydt}U`x~~etR:=wDdsqikqpckVD~JMQ~D=uvVft`Vbz>]Yh̍؝edyTq_[ijl~z~{{k^|fƆgqmS]i#,sygZvjbQ`n|ìpF*(B#WF~~tWj|m}gRyzkyi}pTaa}̭so|xTWlxzmU}LQqQPUC}vvs\vZVkgbieG2SXH_zaz|]p}rȦllu|cYLp{uqIJpxl1Y8s~H=Jnh0Qyn_@Qxk?.B\I%L|uéŷkm}zv;fլ̰ars\Ilqzz6Fq9Cg||moUJmw}m>v}AZai{lO78Rb9`G}ȑܯphɩ]X{yp|mY{mߎ}}uj[m}c6FCqjVbbw[MpdNb}nVr{U:!$E;~WnZTѰuם_yǤzŀQFfydxol~rc\UQG>6tHUFAUL%T{pCLnJnQ9O`al}wRci_boskxrMyYm;=kldUKrUw[}~fLLThxdtv[e{D.645WfMBJ[Rj;Wz~cgqneND\kK^JCduueXykģkr}x~{y~|B;d?tHbtpK-%+N{~vwQNyj>Ek[ilf_iOPkiպ~pȬq~uxfpj\hl_XSH87^wxrLPoVZ{mISvpE.Xs_KXgvxqdepqp~o\Hde|]Omuvzsserl}kDQy}bI;9HhoN~ef]ryqaLFXjg[\`WV{orozqxgbr|w|ust~–aejQOZitysV#(k}xr[]~nn|UZz]pS^pqvX\wrfsrxdUws}vqpzrn{j_lwtdukopeb_^behn|x]ql]xcm}rg]QRg{zgZVRb~a{tZo]cdU]{kqqtxfvrd\XUOEKqsnOOyuzz}vlo|qdkvjdnvd_jPfjuuu}~}mtug_kyea}}i}zrrqlmso\ctb\m}xw~w}qMOyli{[Ruqri~rmxxmgkvY{um}lw_vpY[gnomntqdGh~Ynvr~|eOIXs\>Mh_djup}mqpk|ijqovrqygr|ox~tmnv~yoaOHkuTZ|sppmktthpxlnfysz^xkl~uelr\jgak}uom]Ou\QytplXR^q~WQ{olfNaz}w_`vxgyksjqj|sd]dx~mgsqzpks}|iTNXksG>b~n[X}pigkwrTDOxbt~_erwkluyiyzgcov]ysoh|jrympzxlb_cxjQyq~~j[YhkLau`huVcuublxhvzjtj^i}}Xqgmz|ywts{yqo`Vdwdgq~~|}}a^t|kvfylXw~x}~ruu|}wz~r`v]wtucJRo}|~}qbfztwfCnstxph`[\j~|\GZtlm~|nvv~x~soszi{gvrgelzzhbdd_WQMTl~{pnyvw}|pffckv_[}z\eztt|ihs|y|c`xtys}{zvxzY;epwnYcqe`i`LiqZc{pXPU~v}{mq|uvmxo\qwh|wohdeoiVcsU\wtr~xg^Z^o\EZxpkz{`soqxYZ{^P\v~rz{bjzt_e~r\NP`yh_}}}ysusqmhjwzYaypguh~eUrnzqgr|kf{}texiqzd\cry\JRl|b[tngmkj{]jtgh{~z{kyaZ_nv~~vxfg|haiwvim`ZvlZrzow{ywqkge`\bxoJYvj_swdzyx~w~u}netxhqxlby L]Z]AFAqma_Hb|cbud^w`[͘cW_|¶|u`QW`}^zfl=$pJMg@M`^u|qkϤ`VjcbkakMvzzp}z}kN^nW<$`x}rUpOIR{䦊gbʡct{qprICsPUtg|'#flmE=z69/Wp^Vgzfp|hxq]x}duRU~Q8yq6`uR~b*?dENu{e}~Faw_^Ūo}ɱtqra46sadfic%@izx_uZfP5ro~uupW`ư~bYn|Zhm,3p\GQN[h}hsI,Se;#fJkVGr+HϷƣoof~ض٪ʅXfsCJEQv͜ӺnohX;">dH0R[KiFp^Tn\TVFmNI>A^}rsMt|iRi}i;fnmzW\{{zpvyi<5ekKsZ\fsludon{eceh{i|FJqsyxWcfg|iHiqV]JWgK-TʥT6xa^tfFvGPȧxo=>ehcN.ߨ̚nKjzbQɊDZq="ekq}acVymafqnFo};*7'7"t}ġӦuaflerƗn^EeysZZxXLolzxt~q[zq{arKtO+;[qzv~Gd}EBe9!6M?;USg}S˭jF̻еoɰc@Gorrq\yw_azk>bfI;'G]X)+\2O}k]seCMMQdJnV@n҅xVK|չzKʒ}ytoj{^bf/:4nnzunmtdZWdFEiuVLWB8Ia9rXV`W{_xzkz~U҉cg8heyzC 8&^XO.InOhiXmpWczmmqtc('!-?V{}vxdťtxޚ~b~ãPBhjkQ|dWqxYYefcRZ_Re4KrqD0atoe2BoT>uoER\o{mi͹ª~^sft|}̒zϽMAqv[Oi]^Urdv?:Divggg^nxqsua>P|dk`YY)@pF/ivȆ~Ũi|y{mtf|ä~y\p]eMei=)1spwJE;tc[]slLR{|?TZQ5%b_o=kLJ~fǖiiÍ[לͤpnh|mmbkZriXj7<16\__EN`jS@a\JZROjkpeOGKjrw~obkοt\TºƬ|ètLVs|a=x[Z/\|ehNnC^kfaku]iSQqV?Z.&kK_{Zxű~^Wcn_LtmxYF}KLr{`f79twWeqvimȾOievkz\OinwJ[\Eʁ]sb'PtAO^krri}Y}zkTygwOqi`[{EwP_fJNZ}WWPlj\gƆ{yZwpLrx+3lidv|zeuvkas֖gV[XECbnS6fsRyxTiAR0GwfVv_]̔`NyَtbmkvU,wP\|u}bH}b,}aa`@)9lkyQzgfggknsG~~wgԄGk}Ɗ8SkX`}|w9h#epkN;Vjusy~kQptzkxFGySro`i`j2æ\fS^=[qS(M˒z\XXd~YJƸ{cqfYoafa!Dëù\IwTyQTm'(FuyW,gg+SͬɚUε~d̙73Ue|чVBA9B6DGC\XuPBZcMV}xej3PihI3J\חՃziZvܰrsxdMYtb[iv_U|rtbk^9HtPAC|`ihwk}jlxƜ}am}ҢqZJCbB`wborh[VO^NbQwQHIcxC1cz=U{t{raYe٤…sxYEu|qMuthgdy{ipgͨYd_hLq*Ue^bxfMTlisDzqI/ ?0@cx׏yrXl|jSxzre[VZ|w˥vkirQZw_jH;jNV8pyicJb`S_QUipWOWXd^t}~mgmtWvhX[ahr`dr_yu~znbgzLx|bSj~|te_mzznmqaweMDPgo^OPc|ufjxgx~}mznahyz}|vokw~scXX_egp\cbZxftkoxnc[kh~]~hebewtzyut{wq`Yq~nhg\kcWwihqnx}ewka{_]ie{qqyirfdu}mldYV_oqmr}mankhlcw_rgp|~wjjrptegvq{h^^gmdMAUz}ibizy{{vkm|z~whyiv_~nmlheehpcZ[ogk}cXotnt_niz^iwpkr|ixuszryrekfXd\hyxw~yx]]t^snjyyypfvyhyyW|pxxeY_ofUcyyjjyywitiwn]Pa~rgoj[zv{xf[W\dhc_iqcU|piypzpptupbiz~}}euΚr_g^p]zkbv?LF$P|tnof\DLu`GAvoDywtqpp,bmnR}lk0tsnt{eBayqOPoQgyii(`gWy_DbPRxWxouqQrsrLr¡n|n[_=f~fitmW_[fidIp[y^qlڴh1k$xz0[{}4]nKLRNnj~ágTkvt8i]IUkmjfY{qS,[nZzqk{jeUaKAOAotoh>ɢXK~U`mq[{;ygZ{{{wuyUE~°tl\Z]z~~ows~mxfazi9;|xOV94>M~p|{̰rtxouΆs}`_78Peze/Znr~kvdJjQN?\yc8beu׾U}q͜}{{mJrkW28W]Jc`8^}[e}Xf|yxMdbSlebxx̢q}zmtu|NsXrbSZuwC9R]k}uIJxjScWUwCqvs}zgif|ltzodk{e}^vyr]M_i^dp}wncUzkuobiHWq\l{uyvmqzkzhtw}{pbro]Qmogjbj{lxpRGZg{juqnoxpcRwq]Cy}j_YffQX}qoke}7Lztuyths{oeWryRG]ee|i}bH^lYpayrolf[Nbti`{jjp`yȵcrovwJclYS^yrF;egJMYg\PTnef7Xϛnqnpklm_hija~kzr[`^XolywsbfVm_lhwug{{ggsh]vsvY_{kNU}~[Mu]Vxl|}Q4_ussltjmpkjzmpr`_besdjuciy~mdtv~{tegkFixkp|vqppj}o^tde_z~ZBGQGKe~x`cFgr~Z`nq{|]wty{tqxttyQnvm~r|gjvXgba}yg\WVwrgqq_ziuu\]Gjyn{f^YwhIEfpYR{{u|iY4G\|~}Ʃrmx~tz}\pOiaIyxql[[KLU^zrf{}`nhl_o|~w{ehsauk~n{_OmeUlhMgdggRhqZS]ymn~xrlzzv}¬xqum}~n}kRYxt]\dx~h`@]ih|iz~qsqv~qw~qnmaTZ~wsh@BW`ec^gzqwe|trmo}pKgwz~uijortpukD~]{sciy{v{vnoj{zp~pudD`~ojoYerZe\pod®yfozc_mcF?Xx\IZqkvb_sx[;kojind~obwgqZiUppTirXY_emqy}~|cQUezmk|nqosrZm}iTl|}zly^Wrnl`diWdkoaqfpyuejrvr{som~ydT{bjx{kZa}sKDYaNap|{otw{{uuntZwcabseIUK14GTY[cq}syrgjtywu|sUi{uw{t`Qb{cvl|gyhcv}ripfelbtudsua_Z`YkrVGWRi{v~~zzwtm_YdrspolwxumkrmZ?oqn{o|p`\_^]igWiQFdO?WrdctS>M`qrxtwsmpw}{~yM_ahxkamolfwrwfP^~dVFRL?M_msjq|rbXcwt~ɨ|lijw{dn{k]_szhURg}z{hbswdunzxn~}]`igWHJd]JZWIQfsmbY^}Yenw^Gio^^d`YXruc{k}qmqwm^dsmuwfnpekjsjt^V_vcZgmjxmuq^SNRizxtnkhXa`LLNXmyhuyvqrx}dcjhdj}zskMhnUSbmRFZKB^z{|w~xuqqrigq~lmlvp[sqhsttxwsns}pUwyp|u^]em~pW^_XfvwPi|htnebcefbrétpwrWUowp^hhbcrfJC\s}rXVmzpuu~~gynjyhd]U_T.5JIKX\WX[o|}adhlblmocVZ{|~pthsyywrsjjrgixzl~dq|n[V_p~cMOVluikxzlelx|gV`s~mdfXSTWke_qno{eONU]k}{xoBMeTDI^o]N`WMev^wznu|~^Jjrdiqtob[g_i~lq{bON^jy}^QTPVbst\fVx|n]KARn|l˿~{{fhy~\gmY[dgkwp]X_lq{}wvtrzbecp}itw}t^nzdpmaTBAQC7YqnnnjdX\||fwpzrau~iYVSQaouys|lb[apqrz}luxg[V\ililkx}uuz}snu^Waqn`_mwkULC=>BSy\n~~s~{p|f`irvo]ZtxUfvgYXbl\>CJR^ow[KX~Ƶ{slfegjhb_bjledoxoq~thfqrggnrttuwxxy{}~miovywqljnxuow|mcafq~{trpjccm|uaPOciUVf~|pbYX_gmpomllkjhhjntuoihkmnorriZOMT_jqssu}|yxzqaWYcmssqprw{~yqmp~zxukilquurptz~xtpoqyz|yusu|wrw{tmihjmonmptrfXT]ly}wy}sic]WRSXYSJEEJR\hznNE\{uqnmlhb^_homffpz{xkcgttkkoqppsy}qghloomkms|{oiq}vkfgjpyzuqmiipyzodZ[ko]Yew{od\Y[bkqspnjgddhowytkfhlmnpqndVLKQ\djnt~}pdbfknonnptxzyx}~vnlryik{xja`djoruy~}|}|tsuwxz}~zursz}x|ytrstusrtwuk^X[eovzz{~zy|}vnhc_]^_[SLIKQZdo}tXQhz~ztqomljjmtxtnpz|skgjs{{smmqtuuvxzz{}~usuwwuttw|~yqoxzqnnnosy~|xsnjks}|skebhwydX\j}ypic__emstqmjhfginrqkddhkjhghgbZUU[ckqu{ykbbfloqqrsvxwvx|xqkhly|igvwkcachmrv{~~}yrnoruvwxz|}~~}}{xx}{xvwxwspopoib_`fmruvvw{|uqqstqlfa][\][VTUY`ithUZvzx}|ywuqmkmtyxsqwwpjilqsqnpsvvuuw{~|urrrrrtx|~yplr{}unkmpqruz}~{vqnpwymebfrzd[_m}zrlf_[^fnqplieddhotsmggkmlihiif`ZX\biov~xjefjmnnnoqtutsv}~ysmhkukaj}shb`bglqx~|zxupmlnopsvz}~z{~|||zwrponlgcabeikmoqv~~xsppqrokfb`ab`[XY^enxm]^sytty}zwsru}|y}~ytnlknqrporw{{zz{}zwvuvwz||wokpz}xqnorsrrsx|}{wstx|pgdivk\Zet}vojd_]`fmonkgedgkprmfcglmkgffgfdbadjpv}{ztidegiklnprsssrv}~yupkgfirmck}}pgbadiou|}xtplijlnpruxz|~~~~||zxtolkhfeddegiklorx}}wronnonkgdccb_]]`gnxwf`jzsps{}yuuy{{|wrnlmopnjjpw{|zy{|~yvuuwz||wpos{}xrnortuuvy||zzxlcagvp`\cq|vpjd__afjkifcbdhmpnhdfknnkhgghhgfgjnt{{~}rjhikllmnoppppqu|~yuqmihjq|}hcm}qhcabfkqy{vqmighjkmorux{}~{wsoljhggffffghkou|{xz{wsolkkkkifeeeecbcgnvqdcrzroqv~zxy~zvrnkkmppmijpw|}|{|~|{{}}wpnt{|wqopsuuuuwy{|zyzvjccl}k^^hvysniebbdhjkigeehlppkecglnlifefghiiknsy}|vmihijklmnppppqtyzuplhfhnykdl}|pgbabflsz{upkgefhjmoruxz|~{wsokhgfgffeefgjouz{xtsw}|wspliggggfeefffegkqyvhcluompv~~~}{xuqnllnqrniglt{~}|{}~~~ysrv|~yspqtvwxyz{}}qhcdnma`iu|vpkgdcdeghgfdehlonieejnpnkihijlmopsw}}}}tmjijkllmmnnnnpty~wrmjgfhnyqfivxngcceinu{~~~|yupkgeegilnqtwy|~}ytpligfgggfeefhmsy{ytsv|}yuromkiiiiiiijiijlqywibi{unlns{~|zwtpmkkmprpkhkrz~~yspsy|ytpprtvwxxyz|}~wlfdlzvf`ep}}wrlheddefgggffhloplgdgloomjihijmorvy}|~yqliiijjkklmmmnquy~zsnjfefjq|ogkx{qjedehmsx}|{|||{zwtpkgedfiknqtwy|~~zvrnjgffgggfeefjotxwropv{|{wtqnljhgfgghikklmot{}oder|rmkmsz~{ywtqnljknqrokhkrz~~~{usw|~|wsrsvxyz{|}~~sjeem{zjcemy|vqlifeeeeeeefhkopmhdfkpqpnlkklnqtwy}~~|uokjjjkkllmmmmorv{~xrmigfhmuzkgo|xoieefjoty}~{{{{zyxurokgeefhknpsvx{}{wrnkhggghgfeegjouwuqoqvz|zvspnljihghhjklmnorw}zldgu{qljmsz|zwurpmkjloqrnjhlsz~|wvz}xuuwy{|~~xohfisviehp{}wrnkihgggffghknqplgfinrrpnmmnortwz~~~xqlkjjkkkkkllmnptx}|vpkhffiowykgmz|slhffimrvz}~|yyyyxwusqmjgeefiknqtwy{~{vrnkigggggfefhlpturmlotxxvspnljihgggijlnpruyrgenwojjmsz|zwurpmkjlnqrplikrx}|xwz}yvuvxz|}~wnhfjuvjfjr||vqmkihhggffgiloqokggkpssqonnoqsvy}|uoljjkkkkklllmoruz~~xrmiffgmw~ogkuzrlihikoswy{|}~}{wvuuutrqomjgfeghknqtvy{}~}yuqmkihhhggfghkostqmkmrvwvspmkjihgghjlnqsvy}rhel|{rljkou{|ywtromkklnqrqmjkqw|~zy{|xwxy{}wpjhjt|ohhnw|vrnlkjihgggilorrnjgjnsttrqpqrtvy}zsnkjjjjjjkkklmorvy}ztojgffipx|ngkvzsmjijlptwz|}~}{xvvuutsqomkigggiknpsvxz|~~zvrnljhhhgggghknrtrnklptwvtqomkjiihijkmprux|xmfhswojjlqw}~{xvsqolkkloqrpljlrx}~z{~|zz|~}unihluqjimt~zvromlkjiiijmpssplijnsuvutsstvxz~}wqmkkkkkkkkkklmpsvz~{upkhgginu~vkhny{toljkmpsuxy{|}~}{~~yvtsssrqomljhgghjloqtvy{}~~zwspmkjihhhghilorrpljkosutromkjiihiikmpruy|ukgkwwokjlptz}zwuspnlklmprrokjmsy}||~{zz|}{sliioyzojjpx~yuqomlkjjjjlortrokjlquvvutttvwy|ztolkkkkkkkkklmoruy||vqmiggint}xlhmx|uplklmpsvxz{|}}|~~yvtsssrqomkjhhhijmortwy{}~~zwspnljjihhhikmprqnjikortspnlkjiiijkmpsvz}yohhq~unkjlpty~}zwurpnmllnprrpmkmrx|~~~~|}~wqlikq{zokkpw{wtqpnmlllmnqtusolloswxxwvvwxz|}xrnlkkkkkkkkklmpsvy|{vqmihhjnt||oiksztpnmmoqtvwyz{|~~{y{}xurrqqponlkjhhhikmoqtvyz|}~{xtqnmkjjiiijknqsrokjkorttrpnlkjjjklnpsvz}{qiho|wpkjlosx}~zxusqomllnprrqnkmqw{~~}|}ysmjkpyslknu}}yurqonmllmnpsutqnlmquxxxwwwxy{~|vqmlkkkkkkkkklmpsuy|~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m50.bin b/applications/PoP/poc/res/music/m50.bin deleted file mode 100644 index 00a7ce1..0000000 --- a/applications/PoP/poc/res/music/m50.bin +++ /dev/null @@ -1 +0,0 @@ -}~}}~||||~}~}}|~~}~~~~~}~}~~~~}~}}~~~~~~}~}~~}~~~~}~}~~~}~}~~~~~~}~~|~}~~~}~~|~~}}}|~~~~~}~{~}{z{~|~~~{}||~~|||{~}~~~~z{|yxx|z{}|~{~~{|}~{}{{}}~zx{wvvxxw~~|~z~}z|~{{|~|~~{{|}~{wywtuvwuz}|{{~y{|}{z~{z|~}~}|{}~~~~{wwxsttvtv|z{x|yy||{y|}y||}}~{~~~~{xvxtssttszyzxzzx{{{yy}y{{~}~~|~~~~{yuwurtsurxyyxxzwy{zzx|zz{|}}~}~~~|zuvvrtrurvyyxwzxx{zzx{zy{{~|~~~~|zvuwrtrtsuyyywyxw{z{xz{y{{~|~~~}zwuwstrtstyyywyyw{z{xz|y{{~|~~}{wtxststssyyywyywzz{xy|y{{~|~~~~}zwtxttsttsyyywxywz{{yy}y{z}|~~~~}zwtxttsutsyyywyywz{{yy}y{{~|~~~~~~}zwtxttsutsyyyvyywz{{xz}y{{~{~~~~~~}zvtxtttustzzyvyxwz|{xz}y{{~{~~~~~}zuuxsstvsu{yxvzww{|zw{}y{|~z~~~}~}ysvxssuvrv{zwv{vx|}zx}|y{}}z~}}|xswwssuvsx|yvw{vy|}yx~{y{}}{~~}}|wsxwssvusx|zvwzvy|~yy~{y{~|{~~}}|wsxvssvusy|yuwzvy|~yy~{yz~||~~~}}|vrxvtsvvty|zuxzvz}~yy~{yz~{{~~~|}{vrxvttvvsy|zuwzvy}~zy~{yz}|{~~~|}{wrxwttvvty|zvwzvy}~{y~|yz}|{~|}|xrwxttvwsx|{vvzvy}~{x~|yz}|z~|}|yrvxutvwtw|{wuzww|~|x}}yz|}z~}~|}{ystyutvxuv||xuyxv|~~y|~zy{}z|~}}}|ztsxvtvwvt{|yuxyv{~z{{y{}{{~~}~|}{vrwxtuwwty}{vvzvy}{z~}y{||y~~}}|xsuyuuwwuv}|xuzww|}z}yz|}y}~}~}|zusxwuwwvt{|zuxxvz~~{z{z{}{z}||zvrwxuwwxuz}{vwyvy~}z}z{|{y~~||zwruyuwwxuy}|xvywx}~z~~z{{|y}~}}}{xstyvwwxvw}}yvyww|{}z{{|y|~}}}{xtsyvvwxvw|}zvxxw|{|zz{}z{~}}}{xtsywvwxwv}}zvxxw|||{z{|yz|~|{xtrxwvxyww}~{vxxv|}|{zz|zz~|}|{xtrxwvxyxw}~{vxxw|||{z{|yz|}|{xtsywvxyww}~zuxxw||}zz{|yz|}|{xssywwxywx~~zuyww||}zz{|y{~~|||zwrtyvwyzwz~yuywx~|yz{|x{}~{|{zvruyvwyzw{}wuyvy|~yz{{x}}}|{{zvrwyvxzzw|}vvyvz~|}xz|{x}}|~~|{yuqwyvxzyw}|vwyv{~|}xz|{x}}|~~{{yurxyvxzyx~|uwyv{~}|xz|zx~~~{~}{zytrxxwx{zy|uwyv|~}|yy|zx}~}{~}{zyuqxywy{zy}vwyv{}|xy|zx}~}{~~{{yuqwywy{zy~~vwyv{}}xy|{x|~}|}~{{yvqwywxz{x~~wvyvz}~yy|{x|~}||{{zwquzwxz{x|xuyvy}yx{|xz~~||z{{zxrtzxx{|z|zuywx~zxz|xy~~}~}z~|{zxsryxwz|zz|uxxw}|xz|zx}~}}~z}~~{{yurwzwz{{ywvzv{~xy{{w|~~||{|{zwrtzxy{|z|zuywx~yyz|xy}~}}z~}{zxtrxyx{||{~vxyw}|xy{zx|}}}}y|~~{{yurwyw{||zxwyw|~~xy{{w{}}|~zz~{{yvruzxz|}zzvywzyyz|xz}~|~{z~|{zwstyxz{}{}|vyxyzxy|xy}~}~|y~|{zxtsyxy{}{|}vyxx{xy|yy|}}~}y}|{zxtsyxy|}|}~wyyx{xy|yx|}}~|y}}}{zxurxyy|}|}wxyx~|xy{zx|}}}|y}|}{zxusxyy|}|}~wyyx{xy|yx|}|~|x~}|{zxtsyyy|}|}~wyyy{xy|yy|}|~~|x~}|{zxtsyyy|}|}}vyyyzxy|yy|}|~~{x~}}{{zxttzxz}~||vzxzyxy|xz}}|~~zx|~{{zwsuzx{}~|zwzx|xxz|x{}}|}yy~|~{{zwrwzx{~~|xwzx}~wx{{x{}}|}y{~|}{{zvrwzy{~~}xxzx~}wx{{x|}}|~}y{~{}{zzvrxzy|~}}xxzy}wx|{x|~||~|x{~{}{{zvsxyy|~~wxzy|wx|{x|~|}~~|x{~{}{{zvsxyy|~~xxzy}ww{{x|}||~|x{~{~{{zwswzy|~~~xxzy~}ww{{x|~}||xz~{~{{zwswzy{~~}yw{y}~ww{|x{~}|}yy~{~{{{ysvzy{~~{wzy|xvz}yz}}|~}yx~~||{{{ztuyyz~~}wzz{zvy}zy}}|~}~zw}~}{|{{zvtyyy}~wyzy|wx|{y}}|}~{w{}~z~{{{wswzy|~zx{y}wwz|x{}}|~}yx~~{}|{{ytuzy{~~}wzz{ywy}zy}}|}~zw|}|z}|{zwtxyz}xy{z}ww||y|}||~{wz}~z~~|{{xtwzy}~zx{z~ww{|y{}}|~|xx~~{}|{{yuvzy|~|x{z|ywy}y{}}|}}yw~~}{{||{zvuyy{~~xzz{zwx}zz}}|}}zw}}|{||{zvtyy{~~xz{{{wx}{z}}|~}}zv|||z}|{{wtyyz~xy{{{wx}{z}}|}}~zv{||z}|{{xtxyz~yy{{|ww||z}}|}}~zv{|}z}||{xtyzz~yz{{{wx}|z}}|~}~zv{||z}||{wuyyz~xz{{{wx}{z}}|~}}zv|||z|||{wuyy{~xz{{zvx}{z~}|~|}yv}|{z|||{vuzy{~x{{|yvy~z{~}|~}|xw~}}z||||zuvzy||x{z~wvz~z|~}|~}|wx|}~y}~|||zuwzy}zx|z~ww|}z}~}|}~~{wy|~}y~~|||yuxzz}zy|z}vw|}z}~}|}~{wz|~}y~}|||yuxzz}zy|{}vw|}z}~|}|~zvz{~|y}|||yuxzz~yy|{|vw}}z}~|}|}zvz{~}y~}|||yuxzz}zy|{}vw|}z}~}|}~~zvy|~}y~~|||zuxzz}zy|{~vv|}z}~}|}~~{wy|}}y}~|||zuwzz}{x|{wv{~z|~}|}}~{wx||~y|||}|vwzy|}x{{~xuz~{|}|~||xw}~}{zz||}|wvzz{x{|}zux~|{~~|~|}yv|~{~{y|||}yvyzzyz|||vw}}z~~|}|~zvz{}|y}~||}{vxzz}|x|{wv{~{|~}|}}{ww~}|~y{||}|wvzz|x{|}yux~|{~~|~|}yv|~{~{y}|}}zvyzz~zy||}vw|~{~~}}|~~zvy{}|x}~|}}{vxzz}|y||wv{~{}~}|}}~{wx~||~y{|}}|wwzz|~x{|~xvy~{|~}|~||xv}~~{zz~||}}xvyz{y{|}zvx~|{~~|~|}xv|~{~{y}}}}yvyz{yz|}{vw~}{~~|~{}yv{~{~{y}|}}zvyz{yz||{vw}}{~~|}{}yvz{}{y~}|}}zvyzz~zz|||vw}~{~~|}|}yvz{}{y~}|}}zvyzz~zz|||vw}}{~~|}{}yvz~{~{y}|}}yvyz{yz||{vw~}{~~|~{|yv{~{~{y~}}}}yvyy{yz|}{vx~}|~|~~{|xv|~~{~zy~|}}}xvyy{x{|~yuy||~|}{~{wv}~}{~yz~|}~|wwzy|~x||wv{|}}|||~{ww~{|}y|~~|}~|vxzz}|y||~vv|{~}||}}zvx{|}x}~|}~{vxzz}{y||~vv}|~}|{}}zvy~{||x}~|}~{vxzz~{y||}vw}|~}}{~}yvy~z}|x}}|}~{vyzz~zy||}vw}~|}}{~|yvy~z}|x}~|}~{vxzz~{y||}vw}|~}|{}}zvy~{|}x}~|}~{vxzz}{y||~vv||~}|{}}zvx{|}x|~~|}~|wxzy}|y||wv||~~|{|}zvw~{{~y{~|}~}wwzy|~x{|xuz}}~||{~{wv|~}{~zz~|}~~ywyy{y{|~zuy~}|~}z~{xv{~z}{y~~}}~~zvyyz~zz|}|vw~|}}~{~|yvy~{||x|~~|}~|wxzy}}y||wv{|~~||{}zww}~|{~~yz}|}~~ywyy{y{|~zvy~}|~}z{xvz~z}{y~~}}~~{wyyz~{y|}~vw}}}|~{}|yvx~~{|}x|~~|~~|wxyy}}y|}wv|}~~|{{}zvw}|{~yz~|}~}xwzy|y{|yvz}~||{~{wv|~}z~zy~}}~~ywyy{yz|~{vy~}|~}z~{xvz~z}{y~~}}~~zwyyzzz|~|vx}}~}z{xvz~z}{y~~}}~{wyyz~zz|~|vx~}}}}z~{xuy~z||x}~~}~{wyyz~{y|}}vw~}}}}z~{yvy~z||x}~}}~{wyyz~{z|~}vx}}}}z~{xuy~z}{y}~}}~zwyyz~zz|~|vx}}~}z~{xuz~z}{y~~}}~zwyyzzz|~{vy}|~|z~{xv{~~z}zy~}}~ywyy{y{}yvz~~||z}zwv|~|z~~yz}|}}xxyy{y{}xv|}~|{{|zvw}~{{}y{~|~|wxyy|}y|}ww}}~|~z||yvx~~{{}y|~~|~|wxyy}|y|}~ww}}}|~z}|yvx~~{|}y|~|~{wxyy}{y|}~vw~}}}~z}|yvx~~z||y}~|~{wyyy}{y|}}vw~}}}~z~{yvy~~z||y}~|~{wxyy}{y|}~ww~}}}~z}|yvx~~{|}y|~|~|wxyy||y|}ww}}~|~{||yvw~~{{}y||}~|wxyy|}y|}wv|}~~|{||zww}|{~y{~|}~}wwyy{~y{|yv{}~||{}zwv{~}{~zz~}}~~xwyyzyz|~{vy~}|~}z~{xvz~z}{y~}|~~zvyyy~zz|}}vx~}}}~{~|yvx~~{|}y||}~|wxyy|}y|}xv|}~~||{}zwv|}{~~zz||~}xwyyzy{|~{vy~}|}{~{xvz~{}{y~~|}~zvxyy}{y|}~ww}}}}{}|zvx~{|}y||}~{wxyy|}y|}xv|}~~||||zww||{~~z{|}~|wwyy{y{|yvz}}|}{}{xv{~~{~zz}|~}xvyyz~yz|~{vy~}|~{~{xvz~{}{y~}|}}yvyyz}zz|}|vx~~|}~~{~{yvy~{}|y~~|}}yvxyy}zz|}}vx~~|}~~{~~{yvy~{}|y}~|}}zvxyy}{y|}}wx~|}}~{~~{yvx~{}|y}~|}}zvxyy}zz|}}wx~~|}~~{~{yvy~{}|y~~|}}yvxyy}zz|}|vx~~|}~~{~{yvy{}|y~}|}}yvxyy}zz|}|vy~~||~~{~{xvz{~{z}|}}xvyyz~y{|~zvz}}~|}|}{xv{~{~z{||}|wwyxz~y{|yv{|~~||||zww}||~y|||~{vwyy{|y|}ww}|~}}|}|zvw}||}y|||}zvwyy{{y|}~ww}|~}}|~|zvx~||}y}||}zvxyy|{y|}~ww}~|~}}|~~|zvx~|}}y}~||}yvxyy|zy|}}wx~~|~}}|~~|zvx~|}}y}~||}zvxyy|{y|}~ww}~|~}}|~~|zvx~||}y}||}zvwyy{{y|}ww}|~}}|}|zww}||~z|||}zvwyx{|y||xw||}~}}y}y}xt~|{{~x~~{~|{xvww|}wz{{u}{~{}z}yt}~~~}}}~y|~{{zytyz||x{|}}u{~||{}~zxv|~}|~~|~y}}ztxzx}xy{z|x{}~}z~}~}yzx||~}|~z}z}~yxy|y~~}y{z|xz{|{z}}|wwty~}}~~~|zyvvx}{{y}~yuu}}||}~|}~{{xvy~}zx}{~{yvurwy|~z~~}xw~}{y~zx{z|yz{||{wzywuy{|{vxy|z{~~}{z||y|{}|~|}}~||z||xyz}|zyx{}|}{}z|zy|~ytvv{~|}}}~y{xwx|}|~|z{xwvz}|}{}{zwwy}~{z|~}|yuuttz}~~{||xx|}~}y~}{x|z{{x{}z{xwxvvw}~zww{~y|~~||~||x~}}|}}|}{}|zz|wyz~wwy|z~~}z{zx~}wtxy{}~|~}}x{zyz~}~y{{~{vyy{}|{{wwwyz~~{{~}{wtvtw}~}}{}zyyz~}~~}||z{z{|z}yy~{yzuvwwu{}xv|~~{z}}~}~}y}~}{{~}y}{||zw{ywz~vuz~z}}zz|x}vuz{y|}~~|{|}wy}{{}~}uz~yuz|y}}zz~~vty|z~~}|{~|vswxx|{~}zwz|z|}|{|}}uy}|~{y|{yyw{utwxv{}|xx~z{}|~{}~~~{}||{z~}z|yz|zux{x{|zxt{||zx||~}xvz~{y~}~z~zz}yx~|||uvzvy~yz||z~||ysy}}{~|~}|z}ytt{z||y|~vx}}y~|~z~~xt}~~{y}||}wwztuyzy{{|{|}v|~~{{zz}~~z{~}{~xy{xsy{z}wxww|}}~yw~~~|}zxz}y~~~~x}}yy|zx}|}}zvw{xy~zx|}}{xyuy~~|~|~}}x|zut{}{|x{}}ww~~yz}{~~}yt{~~|x}|~xuyvsy|{|{x~~~~vy~}{{~~zy}||}}y}~}|}~{wzzut{|}yuyx|{|}|xz|z{}{y}~|z~zx}|xx|z{~~zzyv{}{zz~xy}ywyv{~~~|}}~{x|yvv}}|}~zx}z{wy~}yz}}|{xv}}|y~~}}xuxutz}|}yy{w{~}}||~~yz~}{|}y}~~{|yvzyuu}~~~vuz{|z}}{y~|~x}~|z~|z}yx}zxx}{{wyyz|}}z{|w{{uxzy~~~~|{}xy|yx{|{z{y}yyzy}zx|w{|v{~}z}|zwtxuw~{~yy~|}yx{}~~{{z|}{||}~|{yyyxxtz~}vx|~~y|}~}}x~zz}~{|~~|z{|{yv||}~xy||yzz~}yzv}zw~}}||zwxzx||~y~|~}uy~{z|x|{v{}~~~|zuruwz|}}zyx}|~}~}~||~yy{~~}}{yxttuy}xy}~}{~|~z}~~xx~}}z~~}}yxwvwx~|yw{{}~~}}{||w|xsx|z}}~|yvuw{}z||w{{}|y}|~}wx{swzy~~|{wtsu{y{}|zx}~z{}}|x}vu{{}~}zvttuxyx~|vv}~|wzwyzz}~}}yttux{y|~}vry~}xuz{{yyvz|~~~~ywxwyxx~~|ss{}{}vxzyxxvv}|z}}wwxwxtw~~{uw{~~z}yw|{}~zxuz|~{|~zuvvwvty}}wuyx}}{z{|x~{w}}y~~z{~wvxvwvv|~vuvv~}|z|yw}zy|yx}|~}vyyyzww{}}wxuv~~~yy{xy}{yyzvz}{~z|yxzvvz{|{{vy~~~}{xz{x|~|{zxv}{z}}}|}xxxtvzz~~|uy|z}{y|~z}{y~~~zw~y{~|~||vyxsw{{|uxxw}x|}{}zw~yw~}~x}}~{w{xv{{y~}|vyuv|w|{z|wx}wv}}}{}|}{}vv}zy~|~}}|z{uyyv{z{|w{~~wx}|||{~|{}|ux{vy|z|}}ys|wx{z}x}{~y}~{{}}z~{{~xt{zv{{||~ws{~z|zzzy~~|~{~||~{{|}~~vx}yy}y}|}~~tv|{~{}y}~w{~{}~~y||~|{}x||w{{x}y~~{v{||}}zw}zx~}|~}|y~}}|||zz~zx{vy~yz~{y|y}~~xz}y}|~}}{}|~{~yy}|w{yu||y~~{}zw~~~z~{z~{~~{~|~~~}|z|{{~yy}xz}xz}|}|vy~~{||y~z|~}}}|z~{}~{}~y}yw|yw}}|~}zx}}|}xz}{~|}}y|{zz||wzyty}{~y{{|}~yw~}}~{|||{||{|wyztv||~|{zx}x}~~}|}~{~|z}z~~{}xx|wu{{}~~{{v|yz~~~z~}~|}|x|z}}y|yswz{}}}}xx}y}}}{{~{~~||xy}}~~y{{ttxx|~{~w|}{z{}|~~|}{|zwzz{~||~{x~yqzxwz{~w|}xz~zz}}|w~~~zzy|}|}~y{rpxvy|}xxw~}~}{~zxz}}z{z~~~x}zv~wszxtz}zqs|}~||{|y~}yy}x}|~||ru|wx{}{}{~vu{}{{}vwzz~zuu|}|~~}~{uy{t||xx~}sw|}~{x}~|}zxxyx||z{}y~vz{uqwxv~~vxyy}{~{{{zz}wy~|||y}{|svysyzuv||wut|~~}x{}~~||}x~~~~x{{{wr{zvy~yxvt{~~{}{wv{{}~yvw}}}|{|}yvzxs{z|vs{xx~yy}{y|||wy}||||}}v{{tqy}y~~yvy{{~y~xz{{|}wz~|zz|zsvxrx}zy|y|xwv|{|{}}y|~{{|z~}}{}yzzvr{}z|~{vvvv}~y}zwv{~|~xy||~}y|{wu|zy~{|}}~xuu~|vy}xz|{~{{zw~~~|{}xv}{uu}z}|~ywv~wz{x||}{~xx|y~{tszww}{x~wzz{|}w~|{|{|~z|||~}|||}xwzyuz~z||zttxz}z{|{xyz~|z|~{{v{|zw|yyz{|zzwv{~{wy|w|~x||y}}|y|xz}yuxz}z||xy}{|}w}yx||x{{{}}yuwzuz~zx~~xw~~~xx}{}{|}{||}{z|yx{zuv}z}}zuv{z~z~~xzy~~z~{|z|{v{}yv{|w|z}w{{wz{}xxzzxy~y~}}{z~xw~zuv||xz~zyyz}x||w||~yy~}}~{~ysv{uy~|x~{~zv~}xw|{~~~~~}{~|z{}~y||uz{us}|}~}|ut}~}y}z}|z~|x|z}~|~~vv}zvx~y~~z|xw{{zx~|x{}yyw}|{}}xz|ty|yv{{}vz|{|{v|~z~yx~z~|x|}|y}}wrvyv|{z}z|yxz~~z{~{|~~}{||{z}|wzztxyuv|~}ztu~||~|y}}{~~~x~|}||~|vt{ywyz||z}wu{}{z}wy}yyu{||}}xx{ux~{wy~~|tw}|~}x{z|~zw~w{~{z~~~yy}xst{wy{}xy{w~{}|x~zz~|w~|}}|~xvzuuzyuz~{|}wt{{}|~w~~~|~|z~~}}~}z}ytv{yx{|zxztw~}z{vz~{~yw}|}}|zwxzvx}z{}|zsx~~}xz~yz|y{{y{z}}v|~wps|w|y}zwwz~|{x}yx~~}}|y~z|{ux{tquzu{}~z{z|z}||z}zz~|~}~}~w}~z{~w||tsv{yz~~zxvx~~}{|}{v|~~{}}uy}~}~z}~xutx}{|}z~~ztx~||x{}xt~}z{~zv}{z||vrvzw|w~{wz|}yyw}wu|~|}}yy~}|~{x{ysqy{u}zyx|z~}~yxzw}~|~|{{}~z~xx~xrs{|x}{wuy}|~{z}}x}||zy||w{zutyz{{y}zvw~|}y}|yt}~|}z}|wz~~y{|zwtxyx}}~x}~|w{~~z~zw~~wt{{|zw~||zzzxsqzzw}zyu|z}~wyxy~}||z}}{vz|xpt}{{{{}vu~}~|y}{x|}~~~}}z~}~~}u~}xrx|x}~x|yxx}|}~|{~}yw{~|}||{x|}yzvtxzw|~|z}}zzz~{|{z||{vz~{|~~xx~{}{~xusvzy||~||yxy}|x{}x}}}~|z{}}{z|yvqu{z~z}|ww}}y~z~{w~~|z|~|x{{xsw|x}x|{vy~{||yzv}~~~{yz~y}|vsx{w{}x}ywz}}~{x~}zw{}}}}}zx~|}}y~{urvzw|~|z|yy}~||}y|}}y||{~}y}}~}x|zvssyy|~||}zw{}~{{{}xy|~{x~yz{yvtz{z}}z~~zu{~{~|z{xw~~~{w|}|z}{uqz|x|}y~yv{|~|{y~~yw}~~}~|yy}}w~|vqv{wz}y}|xy~|{~}y|~{x|}|}~|y~}}v{|wrtyyy|{~zw{}{|{|{~zw|}}x|~~}yy{yuty|x}z~zvx~z|~x~{v}~|}yx~~}y}|vrv}x{~y{{vw||x|{u{}{~}zw~~w{~xru{wx~zz~yw~|}|}x{|wz}{}~|y}}wy}xrtzxx}z~yw|}{}|z{~xx}~~}x}}}wy|xtt{{x}z~xuz}{~{yyw~~}}}x{~yz~ztsy{x~|x~yuz~|~||y~}xv~~}||x{~zy}{usyzv||x~zwz~{~|{x~}yv~}|~|y|}zx|ztryzv}~zyw{{}|{yzw~~}}y{~~|xx}ystz{x~|zyvz}z~~|y~~zw~|~y|~~xz~zttzzx~|y~}xvz~|~}|y~}xw}}||x|~~x{|ytuzyx}~{y}yw|~||}zy~}wx}{}~{y~~x{{xsu{yy~{{}xw~~}{~~x{}w{~|{z~}~}w{zvrw|y{~y|{wx~||~y}{w}~}~~{{~~|w|{wsx{x|}y|ywy}{}|z~~zw}~}~}{z}|y}zvsyzx|~|y}~yxz}|~|z}}zw|~|~}yz}{y}yusxzx|}|z~~zxy~}{~|y}~{x~~~|{{~{y|yvsw{y}~~z}~zwy~}~{~z~{w}~}~z{|x{zwtx|x{~~y|zwx~||}y~~{w}~~}{z~y|{vsw{w{~}y|~zwy}|}y}~{w{~}~~{y~x||wsv{wz}}z{|xx}}~|}~y{}}y{}|}}z~~y{|wttyxz~~|z~}yx{~}||{{~~yx}~~}y}~zy|yvtyzx|~}y}~zwz~{~||y~zw~~}}z{~~y|{wsw{xz~}y{zwx}~|~y|{w{~}~~|yx{}xsu{xw}}zz~yx|}||}zz~}yy~}|~z}}zy|ztsxzw|}y}zxz~{~{}y~{w}~|~zz~~|x|{vtx{wz~}z|{wx~{}|~x||w|~|{yx|}wsv{xy~~zz|ww~}}|~y{|wz~|~~|yyz}ytuzxw}~{y~yx|}{}}zz~}yy~}}}z~~zz}xttyyw}~|y~yw{~{}|{z~yx~~}}y}~zy|yutzzw|~|y~ywz}{~}{y~~zx~~|~z|~{y}zutyzw|~|x}~yvz~{~||y~~yw~~~|}y{~{y|zutyzv|~|x~yw{~{~}{x~}yx~}|}z}~zy}zttyyv|~|y~xw{~{}|{y~zx~~}~z}~yy|yttzzw}~{y~yw{}{}}{z~}yx}}}z~x{}ytuzxx}~{y|xw|}||}z{~}xy~|~|y~y{{wtvzxy}}zz~|xx}}}|~~y{~|wz~|~~{z~~y|zwswzwz}}z|{wy~}{}y|{x}|{{~}y|zvsw{x{~}y|zwy~|~|}y}~zw}}~{||x|{vtyzw{~|x|~ywz~{~||y}~zx~}~~{|~|y}zutyzw{~{x}}yx{~|~||z}}zx}}~~z{~|y}zutxyw{}|y}~zxz~|~|~|y}~{x~|{{~}y|zvswzx{}}y|~zxy~|~{}z}~{w}}~{{}y|{wtw{xz}}y{~{wy~|~|}y|~{w||~|{y||wtv{xy}}yz~{wy~}}|~~y{~|xz~}~~|zyz|xtuzxx|}zy}yx|}|}}~zz}}yz~}}~z~~{z}yutyyx|~{y}}yx{~|}||z}~zx~~}~z{~}x|zwtxzwy}|y{{xx~|}|~y{|x||~|zy{|ytuzxw|}zx~|xx}~||}zz~}yy~}}}z}~{y}zutyyv{}{x}yxz~{~||x}~{x~|{{~}y|{vswzwz}|y{zxy~|~~|~~y|~|w|||zx{|xtv{wx}}zz|xx}|||~y{~}x{|~}zz{}ytuzxw|}zx~}xx|~||}zz~}yy}}}z~zz}yuuzxv{}zx~~yx|}{}}zy~}yy~}|~z~{z}yutyyv{}{y}~yx{~{}|{y~~zx~~}~z|{y|zutyyv{}{x}~ywz~{}||y}~zx~|~{}{z}zutyyw{}{x}~yw{~|}|{y~~zx~~}}z}{y|zutyyv{}{x}~yx|~{}}{y}}yy}}}{~zz}zttyxv{}{x~}xx|~{|}zz~~yy~}}~z~yz|xtuzxw|}yy|xx}}||~z{~|xz|}}zy||xtwzwx}|yz{xy}|}|~~y{~|x{|~|z~~y|{vtxzwz}|x{~zxz~|~~|}y|~{x}|~~{{}y|zvtxywz||y|~zxz~|~{|y|~{x~~|{|}y|zvtxzwz}|x|~zxz~|}||y}~zx~~}~{}|y|zvtyzvz}{x|~yw{~{}|{y}~zx~~}~{}}y}zutxzvz}{x|~yx{~|}||y}~zx~}~~{|}y|{vtxyvz|{x|~zxz~|~|~|y|~{x}|~||~y|{vtwzwz}|x{~zxz~|~~{~}y|~|x|||{y{{wtwzwx||yy~{xy}}||~~y{~|x{|~}{z{|ytuzxw|}yx}|xx}~||}zz~}yy}}~{~{y}zuuzyvz}zx}~yx{~{}|{y}}zy~|||~~y|{vtxywy}|xz~zxz~|~~{~~y|~|x||~|{y{|xtvzxw{|yx~|xx|}{|}zz~}yz}}~{~|z}zutyyvz}{x|~yx{~{}||y}~zx~|~||}y|{vtxzvy|{x{zxz~|}~|~}y{~|x}|~}{y||wtvzwx||yy~{xy}}||}~y{~}x{~|~}zzz|yuvzxw{|zx~}xx|}{|}zy~}yz|}~{{z}zuuzxv{}zx}}xx|~{|}zz~}yy}}~{~{z}zuuzxvz|zx}~yx|}{}}{y}}zy}|~{}|z}zutyyvz}{x|}yx{~{}||y}~zx~~|~{}{y|zuuyyvz|zx|~yx{~{}}{y}~zy}|~{~{z}zuuyxvz|zx}}yx{~{||{y}~zy~}}~{~{z|zuuzxvz|zx}}yx|~{|}zy}}yy}}}{z{}ytuzwv{|yx~|xx}}|{}~yz~}y{~|~}{y{|wtwzwx||xy~{xy~||~|~~y{~|x||~||~y|{wtxyvy|{x{~zxz~|~~|~|y|~{y}|||}y|{vtxyvy|{x{}zx{~|~}||y|~{x~|||}z|zvuxyvy|{x|~zx{~|}||y|~{y~~||}}z|zvtxyvz|{x{}yx{~|}||y}~zy~~}~{}}y|{vuyyvy|{x{~zx{~{~}||y}~{y~~||}~z|{vtxyvy|{w{}yx{~|~}||y|~{x}|||~y|{vtxzvx|{x{~zxz~|}~|~}y|~|y}|~}|z||wtwzwx||xy}{xy}}|{~~z{~}y{|~}{z{|yuvzxw{|yx}|xx|}{|}zz}}yz}}~{|z}zuuyxvz|zw|}yx|~{||{y}~zy~}|}~y|{wtxyvx|{xz~zxz~|}~|~}y{~|y}|~}|z{|xtvzww{|yx}|xy}}||}zz~}yz~}}~{|z|zvuyyvy|zw|~yx{~{~}||y|~{y~||}~z||wtxzvx|{wz~zxz~|}}|~}y|~{x}|~}|y{|xtwzvw{{xy~{xy}|||~~yz~}y{|}~{{{}yuvywv{|yx}|xy}}||}zz}}yz~}}~{{z}zuvzxvz|yx}}yx|}{|}zy}~zz}}~||z}zuuyxvz|zw|}yx|~{||{y}~zy}}~|~|z}{vuyyvy|zw|}yx|~{}|{y}}zy}||~|z}zuuyxvz|zx|}yx|~{||{y}~zy}}|~|z}zuuyxvz|yx|}yx|}{|}{y}}zz}}|{{}zuuyxvz|yx||xx|~{|}{z}}zz~}}~{{{|yuvzwvz{xx}|xy}}{|~~zz~}y{|~}|z||xtwzvw{{xy~{xy~||~{~}y{~|y}|}|z|{wtxzvx|{wz}zx{~|}}||y|~{y~||}~z|{wuxyvx|zw{}yx{~{~}|~|y|~{y~~||}}z}{vuyyvy|zw{}yx{~|~}||y}~{y~~||}}z}zvuyxvy{zx{}yx{~{}|~{y}~{y~||~}z}zvuxyvy|zw{}yx{~|~}||y|~{y~~||}~z|{wuxyvx{zwz}zx{~|}}||y|~{y~~|}}~z|{wtxyvx{{wz}zx{~|}}|~}y|~{y}|~}|z||xuwzvw{{xy}{xz}||~|~~y{~|y||~~|{{}yuvywwz{yx||xy}}||}~zz}}zz~}}~||z|zvuyxvy{yw|}yx|~{||{y}~zz~||~~z|{wtxyvx{{wz}zxz~|}}{~}y|~|y}|~}|z{}yuwzwvz{xx}|xy}}{|}~zz}}z{}}||z}zvuyxvy{zw{}yx{~{~|||y|~{y~~||}~z||wuxyvw{zwz}zxz~||}|~}y{~|y}|~}|z||xtwzvw{{xx}{xz~}|~{~~z{~|y||~~|{{}yuvzwvz{xx}|xy}}{|}~zz}}z{}}||{}zuvyxvz{yw||xy|}{|}{z}~zz}}||z}zvvyxvy{yw|}yx|}{~||{y}~zz}||}z}{vuyxvy{zw{}yx|~{~||{y}~zz~}|~|z}{vuyxuy{yw{}yx|}{~|}{y}}zz}|||z}zuuyxuy{yw||xx|}{||~{z}~zz}}||z}zuvzxvy{yw||yy|}{|}{z}}z{}}|{{}yuvywvz{xx}{xy}}|{}~zz~}z||~~|z||xuwzvwzzwy}{xz~||~{~}y{~|y}|~}}~z||wuxyvw{zwz}zx{~|}}|~|y|~{y~~|}}~z|{wuxyvx{zwz}zx{~|}|||y|~{y~||~}z}{vuyyux{yw{}yx{~{~|||y|~{z~}}~}z}{vuyxvy{yw{}yx|~{~||{z}~{z~}|~}z}{vuyxux{yw{}yx{~{~||~|y|~{z~|}~~z}{wuxyvx{zwz}yx{~|}}|~|y|~{y~|}}~z|{wuxyvw{zwz}zx{~|}}|~}y|~|y~|}}{||xuwyvw{{wx}{xz~||~{~~z{~|y||~~|{{}yuwzwvz{xx||xy}}{|}~zz}}z{}}||{}zvvyxvy{yw{|yy|~{~||{z}~{z~||~~z|{wuxyvw{zwy}zxz~||}|~}y{~|y}|~~}{{}yuwzwvz{xx|{xy}}{~{}~zz~}z{}}|}z}{vvyxux{yw{}yx|~{~||~|y|~{z~|}~z||wuxyvw{zwy}zx{~||}{~}y{~|y}|~}}{||xuwzvvzzwx}{xz}|{~{~~yz~}z||~~|{{}yuvzwvz{xw||xy}}{{}~zz}}z{}}||{}zvvzwuy{xw||yy|}{|}~{z}}z{}}}|{}zvvyxuy{yw{|yy|}{~||~{z}~{z}}|}z}{vvyxux{yw{}yx|}{~||{y|~{z}|}}{}{vvyxux{yw{|yx|~{~||{y}~{z}}||{}zvvyxuy{yw{|yy|}{~|}{y}~z{}}}|{}zvvywuy{xw||xy}}{{}~zz}~z{}}|{{}yuwzwvzzxx|{xz}}{~{~~zz~}z||~~}{||xuxyvvzzwy}zxz}||}{~}y{~|z}|~}z||wuxyvw{ywy}zx{~|}||~|y|~{z~~|}~~z}{wuyyuwzywz}yx{~{}||~|y|~{z~|}~~{}{wuyyvx{ywz|yx|~{}|||y|~{z~}}~}{}{vvyxux{yw{|yx|~{~||{y}~{z~}}~{}{vuyxux{ywz|yx|~{}||~|y|~{z~|}~~z}{wuyyuwzywz}yx{~{}||~|y|~|z~|}~{}|wuxyvwzywy|zx{~|||{~}y|~|z~|}}{||xuxyvvzzwx|{xz}|{}{~~y{~}z}|~~}|{}yuwywvy{xw|{xy}}{~{}~zz~}z{}}}|{}zvvyxux{xw{|yy|}{~||~{y}~{{~|}~{}|wuxyvwzzwy|zx{~||}{~}y{~|z}|~~}{{}yvwzwvyzxw|{xy}}{~{}~zz}}z|}}}}{}{vvyxux{ywz|yx|~{}|||y|~{z~|}~z||wuyyuwzywy}zx{~||}|~}y{~|z~|~~}{|}xuwyvvzzwx|{xz}|{}{~~z{~}z||~~}|{}zvwzwuyzxw||xy}}{{}~zz}}z|}}}|{}zvvywuy{xw{|xy}}{~{}~{z}~z{}}}}{}{vvyxuxzxw{|yy|}{~|}~{y}~{{}}}}{}{vvyxux{ywz|yx|~{}||~{y}~{z~}}}{}{vvyxuxzxw{|yy|}{~||~{y}~{{}}}}{}{vvyxux{xw{|yy|}{~{|~{z}~{{}}}|{}zvvzxuxzxw{|yy}}{~{}~{z}~z{}}}|{}zvwywuyzww|{xy}}{~{}~zz~}z||~~}{|}xuxyvvzzwx|zxz~||}{~}z{~|z~|~~~{}|xuxyuwzywy|zx{~{|||~|y|~|z~|~~~{}|wvyyuwzyvz|yx|~{}||~|z|~{z~|}~~{}{wvyxuwzywz|yx|}{}||~|y|~{{~|}~{}{wvyxuxzywz|yx|~{}||~|z}~{{~}}~{}{wvyxuwzywz|yx|~{}||~|y|~{z~|}~{}|wvyyuwzyvy|yx|~{}||~|y|~|z|}~{}|wvyyuwzyvy|zx{~{|||~}y|~|z~|~~{|}xuxyvvzzwx|zxz~|{}{~~z{~}z}|~~}||}yvwzwuyzww|{xy}}{~{}~zz}~z|}}}}{}{vvyxuxzxw{|yy|}{}{|~{z}~{{~}}{}|wvyyuwzywy|zx{~||}|~}y{~|z~|~~}||}yvwyvvyzww{{xz}}{~{}~zz}~z|}}}}{}{wvyxuwzxvz|yx|}{}||~|y|~|{~|~~{}|xvxyuwzyvy|zx{~|||{~}y|~|z~|~~}{|}yvxyvvyzwx|{xz}|{}{~~z{~}z}|~}||}zvwywuyzww{{xy}}{~~{}~{z}~{|}}}}{}zvwywuxzxw{|yy}}{~{}~{z}~{{}}}}{}{vvyxuxzxw{|yy|}{}{|~{z}~{{}}}}{}{wvyxuxzxvz|yy|}{}||~{y}~{{}}}}{}{vvyxuxzxwz|yy|}{}{|~{z}~{{}}}}{}{vvyxuxzxw{|yy|}{}{}~{z}~{{}}}}{}{vwywuxzxw{|xy}}{~~{}~{z}~{|}}}||}zvwzwuyzww{{xz}}{}{}~zz~}z}|~}{|}yvxyvvyzwx|zxz~|{}{~}z{~}z~|~~{}|xvyyuwzyvy|zx{~{|||~|y|~|z~|~~~{}|wvyxuwzyvy|yx|~{|||~|y|~|{~|~~{}|wvyxuwzxvz|yx|~{}{|~|z|~{{~}}~{}{wvyxuwzxvz|yy|}{}||~{z}~{{~|~~{}{wvyxuwzxvz|yx|~{}||~|z|~|{~|~~{}|wvyxuwzyvy|yx|~{|||~|y|~|{~|~~{}|xvyyuwzyvy|zx{~|||{~}z|~|z~|~~{|}yvxyvvyyvx|zxz}|{}{~}z{~}{}|~}||}zvwywuyzww{{xz}}{~~{}~{z}~{|}}}}{}{wwyxuxzxvz|yy|}{}{|~{z}~{{~|~{}|xvyyuwzyvy|zx{~|||{~}z{~|z~|~~~||}yvxzvuyzww{{xz}}{~~{}~zz}~{|}}}~{}{wvyxuwzxvz|yy|~{}{|~|z|~|{~|~{}|xvyyuvzyvy|zx{~|||{~}y{~|{~|~~||}yvxyvvyywx|{xz~|{}{~~z{~}z}|~}||}zvwzwuxzww{{xy}}{~~{}~{z}~{|}}}}|}{vwywuxzww{{xy}}{~~{}~{z}~{|}}}}{}{wwyxuxzxvz|yy|}{}{|~{z}~{{}}~~{}{wvyxuwzxvz|yy|}{}{|~|z}~{{~}~~{}{wvyxuwzxvz|yy|}{}{|~{z}~{|}}~}{}{wwywuxzxvz|yy}}{}~{|~{z}~{|}}}}{}{vwzwuxzww{|yy}}{}~{}~{z}~{|}}}||}zvwyvuyzww{{xz}}{}{}~zz~}{}|~~||}yvxyvvyyvx|zx{~|{|{~}z{~}{~|~~{}|xvyyuvzyvy|zx{~{|||~|y|~|{~|~{}|wvyxuwzxvy|yx|~{|{|~|z|~|{~|~~{}|wvyxuwzxvz|yx|}{|{|~|z|~|{~}~~{}{wvyxuwzxvz|yy|}{}{|~|z}~|{~}~~{}|wvyxuwzxvz|yx|}{|{|~|z|~|{~|~{}|wvyxuwzxvy|yx|~{|||~|z|~|{~|~{}|xvyyuvyyvy|zx{~{||{~}y|~|{|~~||}yvxyvvyyvx|zxz~|{|{~}z{~}{~|~~||}zvwzwuxyww{{xz}}{~}{}~zz}~{}}}~}|}{wwywuxzxvz{yy}}{}~{|~{z}~|{~}~{}|xvyyuvyyvy|zx{~|{|{~}z{~}{~|~~||}zvxyvuyzww{{xz}}{~}{}~{z~~{|}}~~{}{wwyxuwzxvz|yy|}{|{|~|z|~|{~|~{}|xvyyuvyyvx|zx{~|||{~}z|~}{|~~||}yvxyvuyyvx|{xz}|{}{~~z{~}{}|~~}|}zvwywuxzww{{xy}}{~~{}~{z}~{|}}~}|}{wwzwuxzwv{{xy}}{}~{}~{z}~{|}}~}|}{wwywuwzxvz{yy}}{}~{|~{z}~||}}~~{}{wwyxuwzxvz|yy|}{|{|~|z}~||}}~~|}{wwyxuwzxvz|yy|}{}~{|~{z}~||}}~}|}{wwywuwzwvz|yy}}{}~{}~{z}~{|}}~}|}{wwywuxzwvz{xy}}{}~{}~{z}~{|}}~||}zvxzvuxyww{{xz}|{~}{}~z{~}{}|~~||}yvxyvvyyvx|zx{~|{|{~}z{~}{~|~|}|xvyyuvyxvy|zx|~{|||~|z|~|{~|~{}|xvyxuvyxvy|yx|}{|{|~|z|~|{~|~|}|wvyxuwzxvy|yy|~{|{|~|z}~|{~}~~|}|wwyxuwzxvz|yy|}{|~{|~|z}~||~}~~|}|wvyxuwzxvy|yy|~{|{|~|z|~|{~}~{}|xvyxuvyxvy|yx|~{|{|~|z|~|{~|~|}|xvyyuvyxvx|zx{~{||{~}z|~}{|~|}}yvxyvvyyvx{zxz~|{|{~}z{~}{~|~~}|}zvxyvuxyww{{xz}}{~}{}~{z~~{}}}~}|}{wwywuwywvz{yy}}{}~{|~{z}~||~}~|}|xvyyuvyxvx|zx{~|{|{~}z{~}{|~~||}zvxyvuxyww{{xz}}{~}{}~zz~~{}}}~~|}|wwyxuwzxvy|yy|}{|{|~|z|~|{~|~|}}xvyyuvyxvx|zx{~{{|{~}z|~}{|~|}}yvxyvuyyvw{zxz~|{~|{}~z{~}{~|~~}|}zwxywuxyww{|xz|{z{}{z}~{z{zz||yuvxwrvzxux{xz|zyy}~~}z~~}~~~~}z~{xy{{{|{vxzyzz{z~~{{|{y{|z~|w|}x}~~}{}}xtuxvwxrt}zy|}}|}}vx|{z}~~~~zwyzyrrwvuvyvxzxww{|~|~}{y~~zwwz|}}{wx|zzz{|zz{{yz}||zv}~y|}~|{||xuuxwwvqu~{z||~||~~|wy|{{~~~~|yxyyxsswvuwxwxzwwx{~|~~~~}{||xxx{}~|ywx|{zz{}~}yz}~{{{}}{yx}{}~}}z||zwvwxxvtsz}zz|}}|}~|zyz|z}~~zxxzxuuuwuvxxyyzwxz}~|}~~{{{xxy{}~{wxx{{zz{}}|zz~~{|}}}yx{~|}}~~}z||zwwxxxusu{~|{y{}~~|}}~|z{{|{}~~}yxyyyuvvvvvxxzyyxxz}~|}~~{{|xxy{|}{wwx{{zzz}}|zz~~||~~}yx{}}}~~~{{|{xwyyyustz~}{yz|}~|}}~}{{{||}~~}zxyyywvvvvvxxyzzywz{||}|{}~yxxz|}|xvwz{zzz{}|{y|~|~~~{yy~}}~~|{||{xxyzwtsu|~}zxz|~|{}~~}{z|||~~~|xxyzyxuvwvwxxy{{xxy|~|{~~|{}}zxw{}}{xvw|{yyz{}|yz|~|}~zyx~|~~||{}{xw{{wuru|}zxx|~{{}~~{z}|}~~|}}{xxzyzxtwwwxxwy}zxyx|~{{~|z~}zwx|}|zwuy{zyzz{}zy{|}{}{xy}}}{|}{wy|yvtrw~~|zwy~|z{~~~z|}|}~~~~}|~ywyzz{vvxwwxww||yyxz|z~}z{{ywz}|{yuw{zyyzz|{x{{~|~~{yx}}~}|{}|xx|{wtru}|zww}}zz}~{|}|}~~||~~ywyzz{wvxwwxww{}zyyy~}y}}{{{ywz}|zxuv{zyyzy|{xz{~|~~{yx~}}|||}|xx|zvtsv}~|yww}}z{~~{|}|}~~~}~|~}xwyzzzwwxwwxwx|}yyyz~{z~~|{}}zyw{||zwux|zyyyz{zy{}~}}zyz~}{{|}zyz{xtttz~}{wwz}{z}~}|||}~~}}}}{wxzzzyxwwwxxx{|{xyz|}z|}{||zyy{{|yuvy{zyyyzzzzz~}~|yy|}{{}}zy{zxttv{}}{ww{|{{}~}}||}~~~}|}}zxxzzzxxxwwxxx{|{yyz}}z|}{|}zyy{{{yuvy{zyyyzzyzz}~~|yy|~{{}}zy{{xutuz}}{wwz|{z|~~}}}|}~~}}|}{xxzzzyxxwwwxwz||yyz{~{{~||~{zxz{{{wuw{{yyyyzzzz|}zzz~~}{|}}yz{{wttv|}}zwwz|zz}~}}}}}~~}||}zwxzzzzxxwwxxwz||yyz{}{{~||~~{zx{|{zwuw{zyyyy{zy{|}~zzy~|||}}yy|{wutu|~|zwv{|zz}~}}~}}~~}||~zwxzz{ywxwwxxwz}{yyy|}z{~|{~{yx{|{zwuy{yyyyy{yy{|~}}{yz}}{|~|xz|zvtsw}}|yvw|{y{~~|~}}~~~~}~{~|xwyzz{xxxwwxww||zyyz~|z~}|||zxz|{zxuw{zyyyy{zxz{~}{zy~}}||}}yy|{wusv|~|zww{|zz}~}}~}}~~}|}}ywyzz{xwywwxww{|zyyy~}z}}|||zxz|{zxuw{{yyyyzzxz{~}~{zy~}|||}|yy|zvtsw}~|yww{|z{~}}~}~~~~}~|}|xxyzz{xxxwwxwx||yyyz~|{||~~{yx{|{zwvy|zyyyyzyyz|~~}zz{}{{|}zy{{xttuz}}{xwy|{z}~~}}}}~~~}|}zxyzz{yxxwwwwwz|{yyz|}{}}|}|zyy{{{yvwz{zyyyyzyzz}~|zz}~}{{}|zz{zwttv{}}zwwz{{{}~~}}}~~~}}|zxyzz{yxxwwwwwz|{yyz}}{}}|}}zyy{{{yvwz{zyyyyyyyz}~~|zz|}{{}}zy{{xutuz}}{xwz{{{}~~~}}}}~~}}}{xxzz{zxxwwwwwy{{yyz{~~||||~{zyz|{zwvx{{zyyyzyyz{~~~{zz~|{|}|zz{zvttv|}}zwxz|z{}~~}}}~~~}|}{xyz{{zxxwwwwwy|{yyy|}||~||~{zx{|{zwvx|{yyyyzyxz{~}~{zz}||{}|yy{zvttv{~}zxwz|z{}~}~}}~}~}}}zxyz{{zxxwwwwvy|{yyy|~|}~||~{yy{|{zwvz|zyyyyzxxz|~~}}zy{||{|}{yz{yvttx}}|zwx|{z{~}~}}}}}~|}|yxzz{{xxxwwwvw{|zyyz~}{}|}|zxz|{zxvx{{zzyyzyxz{}}~{zz~}||{}|yy{zwtsv|~|zxw{|z{}~~~}}}}~|}}yxy{{|yxxwwwvwz|zyyz}}|~}|}|zxz|{zxvx|{zzyyzyxy{}}~~{zz~}|{|}|yy{yvttw|}|zxx{|z{~~~~}}}}}}|yxz{{{yxxwvwvx{{yyy{~~||~||~{yy{|{ywwy|{zyyyyxxz|~~~}zz|~|{{||zyzzwttuz}}{xxz|{{}~}}}}}}}}{yyz{{zxxwvvvwy{{yyz|}|~}|}}zyy{{{ywx{|{zyyyyxyz}~~~|zz}~|{{||zyzywttv{}}{xxz{{{}~~}}}}}}}}zyyz{{zyxwvvvwz{zyyz|}|~}|}}zyy{{{ywxz|{zyyyyxyz|~~~|zz}~|{{||zyzzwttuz}}{yxz{{{}~~}}}}~~}}{yyz{{zyxwvvvvx{{zyz{~~|}|||zyz{{zxwy{{zzyyyxxy{}~}~{z{}|{|||zyzyvttw{}}zxxz|{{}~}}}}}~}}{yyz{{zxxwvvvvy{{yyz|~|}~||~{zy{|{zxwy|{zzyyyxxy{}~}}{z{}|{{||yyzyvttv{}}{xxz|{{}~~}}}}~}}{yyz{|zxxwvvvvx{zyyy|~|~~||~{yy{|{yxwz|{zzyyyxxz{~~}}zz{||{||{yzzxvttx|}|zxy{{z|~~~}}}}}}~|zyz{{{yxxwvvuwz{zyyz~~}}}|~}zyz|{zxwy||zzyyyxxy{}~}~~{zz~}|{{|{yyzyvttv{}|{xx{{{{}~~~}}}}}}}zyz{{|yxxwvvuvy{zyyz}~}}}|~|zyz|{zxwy||{zyyyxxy{}~}~}{z{}|{{|{yyzyvttw|}|zxy{{{|~~~~}}}}}}|zyz{{{yxxvvvvwz{zyy{~~}}~||~{zy{{{yxxz|{zzyyyxxz|~~}|zz|~|{{||zyzywttvz}}{yxz{{{}~~}|}}~~}}{yz{{{zyxwvvuvy{zyyz|}}}|}}{yz{{zywy{|{zyyyxxyz|~~}~~{zz~}|{{|{zyzyvttv{}}{yyz{{|}~}}||}~}}{yz{{{zyxwvvuvy{zyyz|}}}|}}{zz{{zyxy{|{zyyyxxyz|~~}~~|zz}~|{{||zyzywttvz}}{yxz{{{}~~}||}~~}|zyz{|{yxwvvuvxz{zyz{~~}~~||~|zz{||{yy{|}{zyxxwwxz|~}}~~|{|~}}}~}{z{yvsruy{zxwwyz{}~~~~~~~~}|zyxvuuuuwz||{|}~~~}}||||}~}zwttuutrruxxxz||}}~|{|~{zz{~~}}|{zxxwuttvy||yvuwwustvwwvvvvvx{~|yyzywy}}}}}{ywwxvtsux~~{yxxyxwvtsuwvspooppprvy{|~yvvy}}|zxwxxyyzzzzxvutsqprvwvuuwz{|~~|zyyxwxwwuuuuuw}}|{yvtv{~|ywwyyxy{|~~{{|{yxxyzyxxwvuuuwwz||yxyxxww{|yvuutttrqsuvwxz}|}~}||zxvwyz|||{yy{|zvsswzyxzzz{}}~~|}{xxxxxvuvwwy|}||~}|{{~}}~{|~~|xvvvuttuwxxy|}~||{z{zy|~||}|{}}}}~}zyzxvttsnjhjnrstsqrv{~}|~~~|{|}~}{|||ywy||{|}{z}~~||~~~|}}{z|~~|yyywx{zwroprsqppprux|~~}~}{{|}}}~{xwvurppuyxvuuuspqsvvuutrrty~~}|}||zyz~~}{xwwwwvtsrsx~}~}|{xwvwwsrtvuqooprpptvx{~~{wtuxz}}zxy{zyxy{zwwvtroptyzxwxwxz~~}~|yvwy||yxywuuz|yy{xuuwyzz{{{zz{{z{~}{|}|{|zyyzzxvtsuuux|}|yy|}{wy}~|{zyvuvurruz{zxz~}|~~}zwwxxxz|~|z{||xutuyzyzzxxz}~~~}|~~{{zyvtvwyxvx{{{|~~{yz|}~~|zyyzvtuuux|}{}|zzzyz}~~}}}}|{|~z|zz{xxxvspnmmooswvssw~{zz~|ywy~}{||{xvwz}{{||zxy{|~~z{~}{z}~}~}yxzywy{|yuuuwwttspps{}}~{{~}~~~}~|z~~|||xwwuqnnswxzzwtsuwyywxyustx}~}}~}||}|{~{yy{~~~~~zxyz{xuwuqps}~~~}zwuyywwwuusstvuqqrrsw}~~{z~{yvuuuy|z{{yww{|{|zxtpqtwzy{{xwy~~zuux{~{z{ywvy~}|yxzyyywusv{~}z|}zz~~~~~}~{yxzywtruutwz{zz|~{zzy{{xxvtsu{{xz{{~}}~{yxvutx~|zxyz{xw{zwwy~}zzy{~~{wsuy|zvvxxz|~~}zxy|~~|~~~{}~}xvvtsv}|}~}|z{zy|~||}~}}}|yzyy{}~|{|{wrpsttpmquuuw}}ywy}}{wvz}~}xvxz}~}}{|}{xwwvyyy}~{|~|}|~~~|~~zz{yz|{{z{|}|wvxtqqu|xz}{|}~~~}z{zy{}|ywutportx}~{vuy|~{y{{wuv|}|}}~|zyxy}~|yy~|yy}}}z{|~}xuwusrv~~}yy|{{|yuruyz{vrsqprx~}}}zx{~}ywvwuw}}|z{zy}~|vrtvzzx{~|zz~{z~~}{wwx{~{z|{xxzz|}|yy{z{}|wrsy{|}||~|{}~{xyyywuwwvxyyxx}}|{xx|~}|||{{xutw}~||yvz}||yvutv|{z}~~zvx{yyz}yxvvz~zuvx{{vuvtux}~~{xwx{{}~~xxvttx~|}~|zz{}|}}{z{}~~|zzzwvy}}|}yssvyysoqrsvy~yvw{}~}ywy{}zwy{}|y|~~zx{}~zwvtwzy{~~}{}}|{{~{xx}~}|~}{yyzyzwtsx{wyz~~}}~}~~}z}{{yvv{~{yvvtsutuz}}yw{}{{}|zz~}}~~|zyux}~||~zvw{|~~~}~}}xxwuuv{~~}}}|~~~|vrv{xvvsqpv~}yz}~~}~~~yuvzyz|{{~~}{{zz~}wxyzzvx|}}}}{{y{|~}z}xy{{|wvzzyy}~}~yy{~~{z||||vtwz|}}{|{|~~~{xvxyy{|{}|xtt{}|}yvv~|}~~~~~|{zx{}|xvx~{tuy|z|}ywtty|~}}wwxxz|~~~{zwuy|~}y{{{yuuwtst}}~~{xwwx}~|{xtsy}~zww|}{yxx{~}~|y~zzyvux}}|yz}}wvyz}ztssqqv}wvxz~~{|||~{~|vw|}~~ywyz}|zwsvy{}~|yx}}|z{~|wuz~}yvz||{xwx{z{}}zy{~{xz}~{wuw}zxxvvyyy{|{xy~|}~||}}{}}}~}zwy{~z||z~yvwx{||||}}|{xyxvv{~||{}|vvy}~zzyurs|~~~}||~}~|wx}~|x{~}zvvy{}|z{|}|}|{|}}}zuuz{|}~y|}z{{|{{~|{}~}wtxyxx|}}xxz}~||~}|}~}yxz|~|z|~|{}}}}{z}{xxxy}|urx}~|}{xv{||~}z{}{{{{xy}|~~{yzxwx||z|~|wtx{yxxwx{{z}|}}}|zvwz|}{~~{tsvvtrw~}~|zywx}~yuu}~yuv{~{wvy|}xw}}|yvuz~|yxz{~~xy{}}yvwvrquzxyy}}~~~~wuxyz}}zxyz|~|wuwz}~xtx|~|}{z|{wwy|}wv|~}zy~~~~~xtu|~{z}{vy~|zvv~|}}zzxvy}~~zvw}{|}{|zx|}~|{||{wy|~}xy|}zzyy{~}}}{xz}}}}}{zzxvv~~}zy{}|~y{|}~zz}}yvx~|xy|z{|{|}vw||vx{{{~~{vvy{||{z{}}{~}uswxxz{z|~}|{}~ytvwvvz{uwz~{ww{~}}xz{vy||{|~ywy~{zxv{yuxz~}}|yw{~~{ww{~{xz{zy|~~}}}|z|zzz||yx{~}yyz}~|{{wuw{xz~|~~|xy{}{z~urtuttz|{~}|}|yy|~}xzyvvy~}ywwwz}vw|zvx}vux{}|{~~{vwzxus{~}|}~}~{|{xxvux}y|~zz{}~}~}{yyz}~xux|}|~}||{|~zyzz}}vx|~|}z}}vsuz}yy{|}wy}}z|}zyzz}~~}|ywz}|uv}{|~{|xwz~~~~}~ywxxy||wy|~{{||||{z}}zxy{{}|~{|{xuy~{}~}yy{{||}~zw|~{{}~~wux~~{z|{z}yvz}~wwyxxz~~xwxz~~~|yy|}{}~ytvvvw}||~|}~|}~zuwxvux}uux}|vtw|~}~xz}vwz{z{yuvz~~~{wx~}y{|||yz~{w{|wvy|}xxzyz}~}}~~{y|z{|~|wvy|~}|}{~}}~{vu~zy{~}~~~}|z|~zx}{uttssx|z{~}{}|z{~}~~|~zxxz~{zxuy{wz|~~|x{}|usw{~}{~zuwzyvw~~{|xy~{{yut|~yy|~}~~|}}{~~}}||~}zvy|}~{y}}|~}}zyz|}~z{}~zz}{}|xuuw|}zzyxz~xz}{xz||{}}{yz~|yy|xvz~zz}~||~xwz}}|{yw~~xyxvuzzxz~zy{~~zy||zyzxx|{{}|xv}|y{}~|zyxz}xtx|}|~~}~xuvy{{{zy||{|||zwxywuw~{z{{~{yz{z|}zyvst{|z|~}{|~{{~wwxvtwzvvz}xuvx|~|~xx}ywyxxy~wuw{zy{~}{ttz}}z~~}xwx{~}{yvw|{y~~|y{zz}xuw{~{xz}}}zx~}~~{|~}}~~~~xw||zxuqqy~}{|~|z|}|}~{}~~~||||~yvx|zz}}|yw|}}||vuvz~~~}{{~wuxxwx~}~||}|}zw{~|xuy{z{}~~|z|}|~~{vuz}~|wvz}|{~}xx{~~|ywz|}|y{~zyyy}|{zwvz|z}{wxzzy|~|{|~}|~~~~{{|zy|}}yy|||}|z{}{}{z|wu{}yyxuszzz||yx{|zzyyzzxx{}|x{|{y{|{}~}|xw{}}vuwy{}y{{wvwy~{{zy{~~}~|xuvyxvu}~{|}}~}{{zy{}~}ytsy}xy~{x{~yv{{yxvuw{yz}|ywwx{~|}zx|zyyxvx|xwy~}||}~vsux{|~~zwy{~~{wuy}{wz}~|z{{z|{wwz}zvx~}}~~|{ywz~~|z{~ywz~|z|zuqt~~{}}}~{z{{|}z|~~~}}}}}}~{zz{|}~}zutx}||~zxwz~|z|z{~xwwvvz~~}}}{yz}~~}y{}|y|}|}{z}~|z{|{{~vrv{~~ytvxzz~~}{wx|}}{uuxzz{zz~~~}}}}~|{xwy|~zvwyxw{}z{}zy|~|}~}~~zz}|xwzzz{~{yz}|zz{~~xwz~}|zwuv~}|zxy{}yvwzzyz|~~~zyzzy{~}||{xz}}~yxvuw~xx|~yyyz}}zy{~~{}yssvwvw~~{{~~}||{yz}~~zvxzwy}zxyz~zuw|~{xuxzvvxz|~~|{}}~|yy{yww~}{|~|}{vuttw|y|{z{}|yxz}|wx|}~~}|~~{{}zyz|~vuy~|}~}|}|vvz}zxz|~xvz}}zy{|yvx}}z{~~|zyz~zx{}}|~z{~~~~~}}}~}|zttuwz}{}~~}{|}}~{yz{}~|~{zywuv}~}~~ywyz{~|}~}|z|~|{wx}~|yzzz{~ysuy||xuuvvx~~|yy{~}{|}}~{utvwx|||||~{yz{}{vvwwwyyx{zxy}~}}}|xy}{vvxyy{yvx{~|zx|~zz{{|{|~|yw{}yxz|zvvwxy{}~~|{{zyy}~{{|}|{}~|~|{yvtw}yy}~|||}~~}z{}~~zzwsstuw}|{}~~|{|{zz|~~}~}}{|}zy{}zxwz|wwz}{xy}vtvy|~||~~zwwyyww}~~~}yy}ywurt{~zz~}}~}~}|{|}~{xx{}~}{}~}}~}|zz{|~zvxz}|z{}}|}yvw{|yxyz{wx{}}yxy{{z||z}~}zy{~}xx{|}~~}~}y{~}|~}zxzyuuuux||~}}}|}~}{zyy{~~}z{{xuw~}|~|xwwy|}{wx{~~~~ywy~}zyyyz}ywxyzxvvvuuy}{{|~{z{{|~}xuttv}~~|||}~}}}~~~|}|wvvvuy}yy}|yxz~~|~}xvz}|xuvvwyxvw{~{y{~}~}zwvz}}{|{xxz}}xvuvy|~~|y{~}}{yz}~}yy|~}|zy}||{yvy}|}~~~~~~{xy}{xvsru}~~~{yz{z{|}|{~~|}~~~}||}}{xwzzz{|{zz~}}|vuwz~~~~}~{{|wvwwwy~}}}}}yvy|{xusw}{|}||}~}{xvx{||yxz|}}{yz|}~|{{zxvxz||~~~}zyy||zxxz~yz||{wvxyy{||}~~~~~|{|}{xx{}}{z{||}|{~~~}zz}~xtw}zxwutw}}~|}}|{zzzyy{{z{{yy}{|~zwvx|~~xuwy{}~~|yy{|zyxy|~||{zxutvvuuy~}~~~{yyy{~~~{xtsw{z}}zxz}}zx{|xwvuw~}{|~|yyz|~~ywy{}{xvuuux|xwy}|||}~~zutvz|}|yy{}{xvvy|~}ywz~~~|{~}|~{xy||xvx}}}}{yz~}{{~~}}{xx{~}{zvssy|yyyy{}}~~}zy|}}}}~~~}zxy{}|}}{xwy}~{xwy|~}{|~|{~}yvvvvx}}{zz|~{wx{~~}|{xvx}~~~|{{|}~|wtvz||yvwz{||yy{}~~~}}~~{wtuwyz}|~}|{{}|{yy|~|||{wvvxxy~~||~}}~~~}}~~~|xxz{{zxyz{|~~~|{}}yyz|}wtv{~|zxvvz~|{}|yxyyyy{~{z{zz|||~~~zwxz}~zwvvwz}{}|{{}}{yy{}~|}~{vssuuux~~~~|zyxx{~~~~{wuyzy{{wwy|~zvx}}zwvx~}zyy{|~|yz{{zwvvutu{~{zz}~~~}zuttvy}{{|~~{xxy{}~{wwz}}}~~~~~}~{yy{~~xtvz}~~}}}||~}ywz~}z{}{wwz|~}{||{xwz~|zyxz|~~}{wwz~}|}}|}}{}~||{|}~~~~yvvxz~~}~|{{}~~~}{z{|~}~~{yxvuw|}ywxz{~zzz{{z{}}{z|~|||zzz{}zutwz{yvvwxz~{yz|~}|{{|}~{ustuw{~}~~}~}|{|}|xuvvwy~}z{~~{{}~~~|ywxz{zwuwxy{}yxz}~{yxz~~xvwy{{{||zyz~}z{}~ywwxy{|}}~}|{z|}}~}|}~}{zz|}}||}zxwuw}|{~~~~~|{{|~~|{}~ytsstuy~|{zyxxz|}~~~~}zz}{y{~{xvwz}xwy}~|yy~zxxz|~|{{|{yvuvuuuz~}}}~~|zz~zwustw~~~}~~|{z{|{ywwz|}||}~~|zzz{~~wuwy{{z|}}|~|xwz~|zz|~ywx{||zz||{{}~~|zyy{}~}{wuw{~~|||}|}{{~~~~~~}||{z{}{xvvwz}~~}}}}~}{zyz|~{zyxvw|~|xwwy||||{zxxz|||~|{}~{yyz{~~xvwyyxvvvvx|}{{|}~{yyz{}~~yusstw~}}~~~~~~zwvvvw{}{||z{}~~~zwwy{zxutvwy|}xxy|~|zyz}}yxxxxwy{||{~|z{}{xwwy{}~~~|{}~}|{}~}~~|z{~~}{{{zyz}~{zyww{~|}~}}~~}{y{~}yvtstw~}{yyyxyz|}~||~~}}~~~}{{}}zwvw{~zyz{||}}}}yxy{~}|}~}zwuuuuvz~~}|}}}~~ywy}~{xvttw~~}}~}|zxwwxz{zyz{|}~{zz{|}~{yxxwwwy{|}~zxy{~{zz{|yzz{yxyz{|~~~|{{{|}}{wuvxz{zz{||}|||{{}}zwvy}~{yxww{~}|{{zyyz||{{zyy|~|}}ywvx{}}~~{wvvxz}|{}~{zyz||zzyxvuvvvwz~}}~~|zxwxz}~}}zwtsu{~}~}{z{}~|{{~zxwvw{}}~|{{|{wwyzywuttuw|zxxz~~|{{|~}{{{yvtux{|}{{}}zxwy{}~}{yy|~~~~|yyz}~{xvux}~}|{yy{~~~|yxy}~{ywttw}~{yyxyz{{||{z{~}}}}~~}~}{xwxz~}|||{zy{~}zyz|~~}~~|}~~|xvuuuwz~|{zz|}~zwx{~}|zxvux~~}||}~}zwuvyzzyxyz{}}zz{|}}}~~~|{zxvtuwy{~{zz{~~|{z||{{{ywwxz{}~~}|||}|zxuvwxyxyz{{}~~~}}}{z{}|xuuy}}{zxxz~}{zyyyz{}}|{{z{~|||ywwy{~~~}yvvvx{~~}}~}{zz{}~}}|yvtuvvwz~~|zxwwx{~~}~~|zxuuy~||~|zxy|~}zy{~{ywwz~|{{|}}zxxyyxvttstw~|zy{}~}}||}~~}|}}|yustvy|~||}|zxyz|}}zxy{~~~~|yxy|}yutvy|~}}}|{{}}{|~~}~}zwxz}~~||{xww{~{yyyyz{{zywx{~}|||}~~}}{yyy{}~~}~~|zxxz}~|{|~~}||}~~}zxwvuvz~}zxxy{~}zxyz{{{{{zxy|~|{{|~{vuvyzywwwyz}}{{{|~~}||||}~~~}zvsstvy~~}||}~~}||}~}zwvwxz}~~~~~~~~|zwvvwwvuvwyz||zz{~}zyz|zvuvy{||}|{z{~}}}zxxyz{}~~~~}|{|}}~~{zyyz||||~|ywvvx}}}}|||}~~~}}}yuttuwz~~|zywwwx{}}}~~}}|zyz}}{|~{xwxz~{xy|}{z|~{z{|~~{zzzywuutttw}~|||}~~}|zz{}}zvtstv{~~}{{{{|{yxy{}}|}~~{yyy{~~yutvxyz{|}|}~{yz}||}{xxy{||{||{z{}~|{yyz{{{ywuvy|~}||||}}|}~~}|{zzz{{|~|ywxy|~}}~~~}{{|}~{yxwvw{{xvwy|}{zzzyxyz{{{|~~|zz{}|wvwxyxwwwxz~~|||}~~}{zyz{}~~~~{vtssuy~}}}~~~~~}ywwwx{~~~}~~{xvvwwvttuwy{~zyy{|zyz}|xvvwxyz{|||}}}~|yxxy{}}~~}||~~}|}~}~~}}}~}{zyyyyy|}zywvw{~}~~~}}}}||||xvuuvy~}{yxwwxy{}~~||}~}|}}||}}||~~zxwxz~}zyz|}~~}~}zz{}|{{{zxvuuttvy~~}||}}~}zxxz}~}zwutsv{~}{{zyxxy{{{{{}~}{zyz{}{wvvvvvxz{|~}zy{~~|{|~{yyzzzz{||}~~}{{{{{{zxutuxz{{{{||~~}}~||}~~~}|zywwz}}{yxxz~~}}|{{{|~}{zyxy{~}~|ywvwz}}||{zxvwyz|~~|{z{}}zxxxwvvwwxz~}}~~~}{yxxy{}~}}}ywtstx~~}|{|}~~}}~|yxwwz~}~|ywvwwvtsstvy~~zyy{~~|{z{|~~{yyxwuuwz|}~}}~|yxxz|}~}|zz|~~|zz|~~|zwuux{~}|{zyxz~}|zyz}~|ywvux}~|zxxxxxyz{{z{|~~||||}~}}~{xwxz}|{{{{z{~|{{|~~~}||}{ywvuuuw{~}{zzz|~~zxwy{}}{yxvuv{~~}{ywwxz{zyyz{}}{zzz{|}~|zxwuttuxz}}{z{}~||}~{{zzyxy{|~~}||||{zwutuvxyyz{{|~~~~~}{{{}~}zwuvx|~~}{zyy{}|{{{{{}~~|{zz{}~}}~{xwwx{}~}}}|zxvvwy|~~|{{}}|{yxvvvwxy|~|zxwwwz}}|}~|zxvuvy~~~}{zz|~~|{{~|zyxy}~~~~~{xwxxwussstv{}zyy{~~}||||}~}|{zzxutuwy|~}~|zyz{|}}{zy{}~|zyz|~|xutux{|}||{zz|~}~}zyy{~~}|zxwx|}{yxxxyyyxxxy{}~}|{{|}~~~~~}{yxyz|~}}}|{zy{}}||}~}~~}}}{ywvvvwz}}{yxxz}}zxwxz{{{zywwy|~}}~|yvvxzzyxxyz|}|{{{|||||}}~~~}|{ywtssuw{}{{|~~}}~}}{yxxyz}~~~~}|{yvttuuvvwyz{}~|{{}~|zz{}~|xutvy{||||{{|}{zz{{}~~~~}|{|~}|}}zyxxyz{|||}~}{xwvwx|~~||}~~~~}|yvuuvxz}~|zxwvvxz}~||}~~}}|{yxy{}}}~|yxxz}}zy{~~|{{~~}}~~|zyyyxvtssstx~|{{{|~~~}||{{{{||{xuttux}~|{{{||{zyz{|}}}}{yyy|~|xttuvxyz{|||~~|{|~~}~|yxy{|}}}}|{{}}{zyzzyyxvuvx{}}|{{{|~~}}~|{zzzz{||}~~}zyyz|~}~~}}}}~|zyxwwy|~|ywvwz}~{yxxyyyz{zzz|~~||}~}ywvxyyyxxyz}~}|||||{zzz{}~~}}}}{wtsstw|~}}}}~~~~}{xxxy{~}{yvuuuuttuwy{~|zy{}~|zzz||xvuvwyz{|||}|zyz{|}~~~~}}~~}}~}}~~~~}|zyxxxxy{}~}{yxwwx|~~~}}~~}}~~~}zwvuvx{~|zxwvvxy{}~~|||}}}||||{{|~~~}|}|yxxz||zz{}~~}}|}~}{zzzywuttstw{~||{||}~~}|{yyz|}|zwuttvz}|{{{zyyyz{{{|}~|zyyz|~zwutuuvwy{|}}{z|~}}~~{yyz{||}}}}}~|{{{zzyxvttux{|{{{{|}~}~~}~~~~}|{zyyyy{}~~|zyyz}~~~~~}|}}}{zyyxy|~}zwvwy{~}{zyyxwxyz{|}~|||~~zxwxxxxxxyz}~}}}}|{yxxy{}~}|}~~|zwussuy~}||}~~~~~{yxxz}~}{xvvvutsssux{}zyy{~}{zz{}~}zwvvvvwy{|~|zyz|}~~~}{{|~~~~|{|}~|zxwuuwz|}}{zyxxz}~}|{|}~|ywvvy|}{yxwwwxyz{{{|}}}|{{||}~}}~~{yxxz|}{{{{{|~}|}~|{{{zxwvuuuwz}}{zzz{}~~{ywwy{||zxvuux|~|zyxxyz{zzz{|~}{zyyz|}~}zxwvtstuxz}}{z{~~}}~~|{zzzz{|}~}|||{zywtssuwxyz{{|}~~~~~~|||}~~|zxvvx{}~}|{zz{~}}}||}}~}{zzz|~~}}|ywwwy{}~~}|{{zxwvwy{}~||}~|zyxwwwxyz{~~~}|zywwwy|~}|{|}}|zxvuuw{}{{{|~~}||}~|zyz|}{ywwwvusrrtvz~{zyz|~|{{{|}~}|zyxwuuuwz||{z{|}~}|{z{|~~|zz{}~|zwustwz{|{{zyz{~~}{z{|~~}{yxxz}}{zyxxxxxxyyz{}}|{{{{}~}~~|zxyz{}~}||{zz{}}}}~}||{yxwvvvxz|~}{yxyz|~}zxwxy{{{zywwx{~|yxwxzzzzyz{}}{zzz{{|}~~|zyxvtssuw{}{{|~~}}~~}|{zyz{}~~}}}|{zxusstuvwyz{|~~|||~}{{{}~~|ywuuwz|}||{{{}~}||||}~~|{{|~~}}~}{yxxxyz{||||{zxwvwx{}}}~}|{ywvwxyz|~}{ywvvwz|~~}{{||}|{zyxwx{}~~}{yz{}~|z{}~}|{|}{yxxxvussrsvz}{zz{|~~~}||{{{{{{{zxvutuwz~}|{{|}}|{zz{|}}~}{yyz|~~{wtstuwyz{{{{|~}}~}zyz|}~~}}{zz|}|{zyyxxwvvvxz|||{{{{}~}~|{zyyz{||}}}|{zyz|~}~~~~~}|zyxxxxy|}~~~{xwwx{}~|yxwxxyzzzzzz{~~~|ywwxzzzyzz{~~}||{{{zzz{}~~}|||{yvtsstw{~|||}~~~}{yyy{}~~}}{ywutttstuwy{~}{z{|~|{z{|~~|yvuuwxz{|}}}~~|{{|}~~~}}~~}}~~}~~}|zyxwwxxy{||{yxwwx{~~~~~~~}{xwvwy{~}{ywvvwy{}~~}|{{||{{{{{z{|}~~}~}zyxz|}{zz|~~~~~~}{yyyxwvttstvz~}|{{{{|}~~~}|{zzyz{{{ywutuwz~}||{|{{zz{{{||}~|zyyz|~~|yvtstuvwy{|}~}||}~~~{zz{|}}~~}}}~}|{{{zyxvutuwy{|{{{{|}~}~~~~~}|{zyyyz{|}}|{zyz|~~~~}{zyyyy{}~~}zxvwxz}~~}{yxxxxxyz{{|}~~}~~{xwxxyyyzz{}~}}||{zyyyz|~}|{{||{yvtssuy~}}|}}~~~}{zyz|~~~~}|{yxxxy{}~~}}|||{||}~~~~~~}||}~~}|{{{{|}}~}|{zz{~}}}~~~~}|{z{|~|yvtstvxyz{|}}{zz|~|{zyz{}~|yxwvusrrsvz~|{zyyz|}~}{yxyz{{zxwwx{~{yxxxxyz{|~~}{zyxwxz|}~}|||{zz{{|~~}|}~~||{{{{{||}}|zzz{~}}}}~~~~~~|zz{|~|yussuwxy{{|}|zyz}~~}|zyz{}~|yxxwusrrsuz~|{zzyz|}~~}{xxy{|{zywvx|}zyyyxxyz{}~~~}{zxwwyz|~~||||{z{{{}~~~}}}~~~}||{{||{|}~}{zzz|~}}}}~~~}~~~|zyy{~~{vstuwwxz{{||zyz|~~~}{yz{||yxxxvtsssuz~||{zyz{}~}{xxz||{zywvy~~}zyyyxyzz{~~~|{yxwwy{}}|}}}{z{{{}~}}~~}}~~~}||{{||{{}|zzzz~}}}}}~~~~~~~}zxx{}|xtsuwwxz{{{|zyz|~~~|zz{|~}yxyywtsssuz~||{yyz{}}~~{xx{}}{zywvy~~|zz{zxyzz{~}|{ywvxz{~}|}~}z{{{{~~}|}~~}}~~|||{{||{{~|{{z{~}}}}}~~}~}}~|ywx{}~|wttvxxy{{z|{yzz}~~|z{||~~|yyzzwttsrt{~~}}|zyy{|}~~{xx{~}{{zwvy~~~}z{{{yy{zz~~~|{yxvwyz}}|}~{z|{{}~~{{~~~}~~~}||{{}}{{}~{{zz|}}}}}}}~}}|}~zwwy|~~~zutvxxwz{zz}}yyz{~}~{{|||~~~|yz{{wttsru|~~}~|yyy{|}}{xy|~~{|zwvy~~~~}{{||yz{zz}~||zxvvyz|~|~|{|{{|~~zz}~}~}~~~~|}|{}}|z}||{z{~}}}}}~~}~}|}~|xvw{}}~~xtuwyxx{{z{{yyz|~}{|||}~~~~{y{|{vuusrv~~~~~~{yxy{||}{xz}}{|zwv{}}~}}||}|y{{zz~|{zxvvyz}}}{{|{{}~}yy}}}~}~~~}|}{|}}{z~~||{z|~}}}}}}}||}~zwvx{~~}|vuvxywy{{z}~}zyzz~}}|{}||~}}}|y{||xuvtrt|~}~~|yxyz{||{xz}~|}{xw{}}~}}|}~|y{|{{~}{zxuvyz~}}{||{{~~~|xy}}}~}~~~}|}{}~}z{~|}{z}~}}}}}~}~~}{|}}xuvz|}}yuvxzxw{{z{~{yzz|~|{}}|}|~~}~z{|}zuvussy~}~~}zyxyz||}xy||}|ywz~|}~}}~}y{|{{~}|zxuwyy~|}{|}{{~~~|wy}~}}~~}~~}}}{}~|z|}}}{z~~}}}|~~~~|{|~|wuwz|}~~xuwyzwy|{z|}~~zyzz~}}~|~||~|~}}|z|}~yvwtst|}}|yxyy{||{xz}~|~|xw|}|}}}~|y||{{~}{zxuwyz~|~{}}{{}~{wy}~|}~~}~~}}}|}~|z|}}}{z}~~}}}|}~~}{|}}xuuy{}}zvwxzww{{z{~}{yzz|||~}|}|}~}z{}~|vwvssw~|~~~zyxyz|{}~yy||}~{xx~|}~~}~{y}|{|~~}{zxuwxz|{}}{{}~zvy|}|~~}}~}}}|~~|y{~~~{z}~~}}~|}~~}{|}}xuuy{~|{vwxzxvz{zz||yzz{}~}}~||||~~}~|z}~yvwust{~}||zxxyz{{}xz}|~}zx{}{~}~zz}|{}~}}{zwvxx{}|~{}|{{}~yvy}~||~~~~}}~}~}|~~{y}}}{z~~~}}~|~}~|{|~|wtuy{}}zwxyzww{{z{}|{y{z|}|~~|}|}}}{{}}wxwtsv~~|}{yxxy{z|zy|~|}|yy~~||~~~{z}|{|~~}|{xuxxz~~|{}|{{}~yvx|~||~~~}}~}~~|~~{y|}~{z~~~~}}~|~}~{|}~|wtuy{}}zwxyzvw{zz||}{y{z}~}}}|~~|~}}}z}~{wxvssz~||}zyxxz{z}y{}~|}zx|~}{~}~y|}{{~~}|{zvwxy}~|~{}}{z~~{vwz|{}~}}}}~}~~|y{~~~{z}}~}~|~}~||}~|wtuy{|}yxyyzuw{zz|{}~zz{z}~~~~}}|}|~~|}|{}ywxust|~||{zxxxzz{{y|~}|}zy~~||~|y}|{|~~}|{yvxxz~}|{}|{z~yvx{~{{~~~~|}~}~}~{x|}~{z~}}}~|}{|}~{vtvy{|~yxyzyuwzzz}{}~zz{z}}~}}|~~|~~|}}{}~{wxvssz~|{~}zyxxyzz~}y{}~{~~{y|~~}{}~~y{}|{~~~}|{wwyy|~|}||}{z|}wvy}|{|~~}}}~~~}yy~}}{{}~~}~}|}{|}~{utvx{|~yxyzyuwzzz}{}~zz{z}~}~}}|~|~~|}~{}~{wywtsy~|{~~{yxxyzy}~yz}{~~|y{~~~~{|zz||{}~~~||zwxyz~}{{}|{zzvwz~}{{}~~~|}}~~~|x{~~|z}}~}~}}~}~|}~~yutwx||~yyzzwtxzyz~{}}z{{{~}}~~~}|~}~}|}|{}zxyvst{~{|~}{yxxyyz~|y{}}{~~{y}~~~}{}~~y{|{{~~~}||xxyy|~~{|}|}{z|~xwx|~{z{~~}}}}~~}yy}}}{{}~}~}|}|}~{vtvx{|~yyzzxtwyyy~{}~{{{{}}}~}|~}~}|}|{}zxyvst{~{|~}{yxxyyz~|y{}|{~}{z~|{~~|y{|{|~~~}|zxyyz}~|{~{}|zz{wxz}|zz}~}}}~~{xz~}~~|z~~}~}}|~}~|}~}wtuwy~}}{yzzytuxxy||||{{{}~}~~}|}~}|}|{}zxxvsu|}{|~}{yxxyxz~{y{}~{|~}{{~||~{y|{{}~~}|zxyy{}}{{~{}{z{zwx{}{z{~~~}}}~~~yx|}}{z~~~}}|}|}~{vtvxz|~zzzzwtvxxy~{}~{{{{~}}~~~||~}|~|{~~yxxusu|}{|~}{yxxyxz~{y{}~{|~}{{~||~|y{{{|~~}|{xyyz|}{z~{||zz|wxz}|zz}~}}}}~{xz~}~~|z~}}}|~~~}}~~xuuwx}}}|yzzyutwxxz}|}||{|~}}~~~||~}|{|~}yyxusv}}{|~}{yxxxxz~{y{}~{{~}{{~||~|y{{z|~}}{xyyz|}{z}|||zz~}xxz||zz|~~}}}}~~|xy|}~~|z|~~~}|}}}~{wuvwz~}~zzzzwsuwwx}|}|||{}}|~}|~~|}~{|~|xywutx~|{}~}{yxxxx{~zz|}}z|}|{}~~||~{y{zz}~~}}zyzyz||zz~~{|{zz|xxz|{yz}~}}}}~~{wy}}~~|z~}~}|~~~~}yvuwx|~}}z{zyutvwwz}|~}|}||~|}~~||||{|~}yyxutw}~}{|~~|zxwxwz}zz{}}z{}|{}~~||~{z{zz}~~}}{yzyz||yz}~||{yz|xy{|zyz}~}}}}~~~~zwz}~}~}{{~~~}|}~}~}xvvwy}~}~{z{zwsuvvx}|}}}}|}}|}~}|}|~}{}~~zyyvtv{~~~{|~}{yxwwy}~{z{|}z{}|{|~}|~{z{zz}~~}}{yzyz|{yz~~||{y{{yy{|zyz}~}}}}~~}ywz}~}~}{{~~}||}~{wvwwz~~~}~z{{zvsuvvy~|~~}}||~}|}~||}|||}}yyxvtw}~}{|~~|zxwwwz}zz{}|z{}|{~~}}~{z{zz~~~}}zzzyz{{yz~}||zy{{yy{|yyz}~}}}}~~~ywz}}}~}{{~~||}~~~}xvvwy}~}~{{{zwstuvw||}}}}|}}|}~}|}|~}{}~~zyywuu{~~|{}~~{zxwwx{}}z{|}{z|}||~~}}~~zzzz{~~}|zzzz{{zxz~}||zy||yz{{yxz}~}}}}~~~ywz}}}~}{|~~}|}~~~~yvvwx|~}~|{{{xttuuv{}}~}~}}~|}}~|}~|}||}~|yyxvux}~~}{|~}{yxwwy|~{z{||yz|||~~~}~~}zzzz|~~}|z{zz{{yx{~|||zy}{zz|{xx{}~~}}|}~~}xxz}~|}~}{}~||}~}ywwwy|}}~~{{{{wstuuw}|}~~~}~}|}}~}|}|}~|}~~{yyxvvz}~~|{}~~|zxwvwz}}z{||zy{|||~}}~zzzyz~~}}{{{z{{ywy}}||zy||zz{{xxz}~}}|}}~}yxz|}||~}{}~||}~}ywwwy|}~}~{{|zwsttuw}|~~~~}~}|}~~}}}|~}|}~|zzywux|~~~||}~~|zxwvx{}{z{|{yz|||~~~}~~|zzzz}~~~}{{{zz{zxx|}||{y{~{z{{yxy|}~}||}}~zwy|}||~}||~||}~}ywwwy|}~~~}{{|zvsttux~}~~~~~~}|}~~}}|}||}~|yzyvvy}~~}||}}{yxwwy|~}zz{|zy{|||~~~~{zzyz~~}}{{{z{zywy}}||zy|}{{|zxxz|~~}||}}}yxz|}||~}|}~|}~|ywwwy|}~~~}{||zvtttux~}~~~~~}||}~~}}}|~}|}~|zzywvx|~~~||}~~|zxwvx{}~{z{|{yz{||~~~~~}zzyz|~~}|{|{z{yww{~~||{zz|{{{yxx{}~}|||}~{xxz||{}}||~|}~~~|yxxxz|}~~~}{||zvttttx~}~~~~~}||}~~}}}}|~}|}~|zzywvx|~}~~||}~}{ywvwz||z{|{yy{{|~~~~~~~{zzy{~~}}|||{{zxwx|}||zz|~|{|zxwy|}~}|||}~zxy{|{{}}|}}|~~~~{yxxxz|}~~~|{||yutttuy~}~~~}||}~}}}~|}~}|}}{zzywwz}}}~~||}~~|zxwvxz|~{z{|zxy{{|}~~~~}{zyy|~~}|||{{{ywvy}~||{zz}||{ywxz|~}}|||}|xxz{{{|}||~|}~~~|yxxxz{|~~|{||zvttstx}~}||}~}}}~|}~}}}}{zzyxwz}}}~~||}~~}zxwvxz|}{{{|zxy{{|}~~~|{zyz~~~}|||{{zxvw{~~}||{z|}||zxwy{}~}|||}~zxy{{z{}}|~}}~~~~~{yxxy{|}~~}{||{wttstv}}~}||}}~}}~~}|~}}}}{zzyxwz}}}~~||}~}zxwvxz|}{{{{yxz{{}~}~~|{zyz~~}}|}|{{zwvx{~~|||zz~~}||ywwy{}~}|||}}yxy{{z|}||~}}~}~}zyxxy{|}~|{||zvttstx~~}||}~}}~~|}}}}}{zzyxx{}}}~~|}}~}zxwvxz|~}{{{{yxyz{}~}~~|{zyz~~~}|}|{{zxvwz}~|||{z|}}|zxwx{|~}||||~~zxyz{z{|}|~}}~~~}|zyxyz{|~}{||{xutssu{~~~}||}~~|}~~|}}}}|zzzyxy|~}}~|}}~}{xwwxz|~~|{{{{yxyz{}~}~}{zyz~~~}|}}|{zxvvy|}|||{z|~}}{xwxz|~}}|||~|yyzzzz|||}~}~~~~}~}{yyxy{{|~~|{||{wutstw}~~~|||}~}|~}|}}}}|zzzyxz}~}}}|}}~}zxwwyz|~~|{{|{yxyz{~~~~}{zy{~}}}}}|{zwuwz|}|||{{}~}}zwwxz|~}||||~{yyzzyz|||~~}~~~}|zzyyz{{}~}{|}|yvutsuy~~~}|||}~~|}~|}~~}}|zzzyxz}~}}~~}}}}{ywwxy{}}|{{|{yxyz{~~}}|zy{~}}}}}|{zwuwz|}|||{{}~~}zwwxz|~}||||~~zyyzzy{||}~~~}}~|zyyyz{|}~|{||{wutssw|~~~}|||}~||~}}~}}}{zzzyy|~~}~}}}~~|zxwxy{}}|{{|{yxyz{}}}|{z{~}}}}}|{zwuwz|||||{{~~~}zwwxz|~}||||~zyyzyy{||}~~~~}~}{zyyzz{|}~}{{||zwutstx~~~~|||}~~||}}~~}}|zzzyyz}~~}~~}}}~}{ywwxy{}}{{{|{yxyz{~~~}|zz{~}}}~}|{ywuwz|||}|{{~~}zwwxz|~}||{|~zyyzyyz||}~~~~}}~|{zyyz{{}~}|{|}{xvtssv|~}|||}~|{}}}~~}}{zzzyy|~~}}~}}}~}{xwwxz{}|{{{{zxxyz|~~}|zz|~}}}~}|{yvuwz{||}|{|~}zwwxz|~}||{|~zyyzyyz||}~~~}}~~|{zyyzz{|~}|{|}|yvutsuz~~|||}~}{|~}}~~}|zzzzy{}~~}~~}}}~~|zxwxyz||{z{|{yxxyz}~~~}{zz~~~}}~~}|{xvuwz{{|}|{}~|ywwxz}~}|{{}}zyyyyyz||~~~~}}~~|{zyzzz{|~~}{{|}{xvuttv|~~}|||}~|{}~}}~}{zzzzz|~~}}~~~}}}}{yxxxyz|{z{{{zxxyy{~~~|{z|~}}~~~}{yvuvy{{|}||}}zwvxy|~~}|{{|~{zzyxxz{|~~~}}~~|{zzzzz{|~~}{{|}{xvuttw|~~}|||}~~|{}}}~~~|zzzzz{~~}}~~~}}~~}{yxxxy{{{z{|{yxxyz}~~}{z{~}}}~~}|zwuvxz{{||||~{xvwy{~~~}|{|~~{zzyyxz{|}~~}}~~}|{zzzz{|~~|{{||{xvuttw|~~}|||}~~{{}}}~~}|zzzzz|~~}~~~~}}~~|zxxxxz{{zz{{zxxxy{~~~}{z|~}}~~~}|yvuvxz{{|||}}zwvwy|~~}|{{|~~{zzyxxz{|~~}{{yzzyyz{yzzzzz{zxvvwwxxyzz{~~~}}}~}}}}|zzzy{}~~~~}zywwx{}||{zyz{}~{zz}~|{z{zyxvvy{}}}||{z|}~~}~~}||{yxy{{{zzzz{||z{||}~|||~~|{zyxxwwvuuuttwxwwz~}{z{|}|{}|}~}}}|~}||}|yy{zzyxwvuwzz{{{yy{|}zy{|}}~}}}~}}}|{{}~~~~}|}~~~~|{{||}~}~}||{{}~~~|{yz{zyxyxyyy{|~~~~~|{zzyyxvsqqssrtuuuw}}~|z{{{{|}}~~~}}|}~}{zzywvuvvtuwz{{zxyyy{|}}|zzzyywvuvwxz{}~}|{zyzzxvsrsuvwxyyyz}}|}~}{{{{ywwvvussqpppqqrpppty||{||{{|}}~}}~~}|{{}}||{xxxyyvuuvwy|~~~~~~~~}{{}~}}}|zxwuuuvwyxvvxz||{||{{zz|}{{{z{{{}~}}}|{zwvvvvutstttvvwwxz}~|~}|zxwuutrqpppstttuxzyxxyxwvxyzzzzyyxwvvxxxvvwvutuussssrrsvwxzyyyz}~}}}~{{{|zxvuussssrrrqsrppruwwutuuuuvxzzz|~~~~~|{|{zyz{zzzzyxvwyz|{zzy{~~~}|||{zyxwuttuvwxxzxvvx|}}{z{{{{|}~}||{|||||}{yxxyxwuuvvxxyxvuuvxzywwxz}}|}}|{{zywuutsssstrooptvwutuutvy|~}{{zyyyyzzywvwyywvvvuuuvutrsttvvuvwz}}{yywvvwutuvwvuuuttuuusqqruxyywxxwwy{}}||{zzz{}}{yxxz||{{}|{{{|zyxz{|{z|}~}}|}}|zzyyxvvvuuutuusstwy{|{}}||}~~}|{{{|~~|zzzzxwvxwvvutsrrtuvvuvy}~}|{z{}~|||{zwwvuuutssqqrtwxxwvwwvwyzzywwuvvvxz{zzyz{zwvwxwwvvuttvwxywvx{~~|{ywvvwvvvvvtrqrrssqrqpqswz{{zyyyyz|}~||{{}}}~}|z{|{zwwwxxxyxwvwy{~}{|~~}}}|||{{{{yxvvvwyxwvuttvz}}|{yyxxz|||{yyz}~}{||{xwvwwwxxwvuuvxywvx{|}}~|{{zzzywyxxvsssuvuuutrstxzz{xwxwwy{||zwwwxxy||zxwwwvvtsuuuvwwxwwyzzyx{~~~{yxxwvwuvwwwussuvvtssrqrtwxyxvvwvwy{~}||}~~~}|{zyywxzyyyyyyxy{{zxy|}{zyxwyxwxxyxvvxz{zxwwvvxz|}}{z{{z{|}~|{z{|}}~}|{yywvuuxyxxyxxvwyyyxwz}~~}{zyxyzyyzzyvtuvwxtsrqqrtwyywvwyyyz|}{yyxyz{{}|{{zyxwutuvwvwwwutvwxxwy|~}{ywvussuuwxyywtuwyyvttsstvy{{yxwyxxz{}}{zy{}}}~|}||{zyxxzzz{{zyxzz{|{|~}{zzywwxxxyzzxuvwyzxvvuuvx{~~}{{|{z|}~|{{|~}}{zxwvtuvvuvwvvtvvwyy|~|zyyzxxyyz{{{xuvxyyvtutstvxzzywxyxwxy{zwwwxz{|~~|}{zxwvuvwwwxxxxvwxyzz|~~~}zxvvvtsuuvwxwustvwwusuutuwz{{zyy{zyz{}~|{{|~~~}}|{xwwvvxyxyzzzyz{|}}}~~}{yyywvxxyz{{yvwz{|zwxxwwx{||{yyz{yyz|}|||}~~{yvvutwxwwxxxuuwxz{|~~~}zyxxwtuwwyzzxutwz{zwvwvvvxz{zywy{yxyz{{yyyz|||~|{{ywuutstwwwyzzxvxy{}~~}~}zxwvvtrtvwyzywtuxyzxuvvuuuvyzyxwz{yy{}~~}}}~~~}{yxxwvxyxy{|{xxyz|~~~}~~|ywwwvtsvwx{}{ywz|}~|zzzzzy{}}|zz||yy{|~~}||~~~~}{xwvvvuwxwxzzxvvwy|~~|zyxxwutwxy{{ywvxz{{xvwwwvuxzzyyz|{xyz{}}|{{|}}~}|zxwuuutvvvwzywuuwy}|}}zxvvuttrsvxy{{ywwz{||xwxyxwwyzzyxz|zyzz|~}}||~~~~~|{yxxwxyyy|}|ywy{}~~~}~{zyywwutvxy{|{ywx{|}{xyzzyyz|}|{{}}zz{|~~}}~~~}{ywvuutuvuxzywttwz~~}~}zzyyxwvtuxy{}|zxx{|~}zxzzxwvyzzyxz{yxxy|~}|{|~~~}{zxwvvuuvvx{{yvtwz~|}}yxwvuttrsuwx{{ywvy{}~{yz|zxwy{{zz|}{zz{~}}~~}|zywwwwvwwy}~|yvy|~}~~~||~{zzyxvvuuwy{}}{zy{}|z{}{ywx{{zz|}{yz{~~}}{zxvvwvuuvx{{yvtwz~}~~}~~~|xxyxvuutuwxz||{zy|~}z|}{xvx{zzz|}{yyz~~||}}}~{yxwuuwvuvwy||yvux|}}~|}~}}{xwxxuttstvxz||{zx{}}z{|zwuwzzz{|}{{}~}{{ywwyxvvxz}}zwux}}|}~~|}~||~~}}|xxyywuuuuwy{}~}}{||}}ywx{{{||~~{z{~~|}~}|zzywvxxuuwy{|zwuv{}{}~~~}~}}zxyzxvuvuvxz{}}|zy|~{z||xvux{z{|~}z{}}}~}~|yyxwuwxvtuxz{zxuty~{{|}}~~|||{z{yvvxxutuuuvxz|}~}z|}~|xuvyz{|||{}}~~~|z{zxxzzwvy{|}|yvx}|zz{}|z}~~}}}|||yxy{xvuvwvwz{}~}{~~}yvx{|}}~|{~}~}~~zyzxvvxwttwyz{ywux{yz{}~|~}||{{{yxz{yvuwwvxz{}|{~}}}zvtvz{{{|~zz|}|}}}}zyyxwwxwuuyz{{ywuy~{yz{~{z}}|{zyyywwyyvtuvuuwyz}||~zwux{|}}}~~~~|yzzxxyzxvx{||{zxw~{xwx{~~|yz~}{{{z{zyz{zwvwxwwz{}}}xvvz}}}~~}~~~~}zyzyxxyxuvyzzzywvy}yxxz~~{z~~|zzzzzyyzzwuvxwvxz|}}}yutw|}|}~|}}|||}|zxyyxxyywvxzzzzywy{yx{~~|z}~{yyxxyxxzzwuvwwvwz{~~zvtv|~}~~~~~}{yzzzzz{xxz{{zzzxz~yvvx|}{{|}zx{~~{xxxxzzz{{xvwyxwy{}~zwtw}~~}|}}|zyyzzzzyxwyzzzzzx{~}}yvvy}}||~{y|~zxxxyz{{{zxvwywwyz}}|xusw}~~}{{||{yxxzzyyywwxyyyzzy}~~~zww{~~||}{y}}ywwvwyzzzywvwxwwxz}}{xusv}~||}||{zz||{zzyyzzzz||{~~~}|~}yuuy||yyz}~}ywz~~ywwwx{||{{ywxyxxxz~}{wtu}|{|{{zyx{|{zzzyyyxyz{|}~}|{|}zvtw{}~zy{}}yz~{wwwwz|}|{zyxyyxxy}~|zwtsy~|{{zz{zxz}|zzzzyxxxz{|~~}||~}yvw{}{xy|~{y|}xvvuwz|{yyxwwxxxxz~|{yvsu}{{{zz{yy|~|zz|{zyyz|}}{z{}{vux{}}yxy|~~|yy}{wvwwz}|{{zyxyyyy}}{yvsw~~|{zyz{yz}~|z{|zxxwx{}~}|zy{}yuuxz||wwz}~~|yy}zwvvwz~~{{{zxxyyxy}{zxusx~}zzxxzzyz~~|z{}zxxxy|~~|zz|}yvwz|~zwx{}~~|yz~~xvuuw{~}zzzywxyyxz}zyvtuz|{zyz{{z}~{{}|zxwx{}~~zyz|{wuwy|~|wvx{}}}{y{{wvuwy}|z{{yxyzyy~{zxutw~~{zxxz{z|}{}}{xwwy|}~}|zxxz|yvvxz|}xvwz|}}|yz~~ywvwz~~|||zxxzyy||zyvtv{{yxwy{{{~~{|}|xvvx{~~~{yyz|{wwyz|}yvwz|}~}{z}~~yvuvx|~{{|zxxyyy||yxvuv{|zxxz||}|}~|yvwy|~~~~{xxy{zwwxz{~~{xuvy{|}|zy|~~zwvwy}~|{|{xxzzy}|yxvvw{{yvwy{|}~{|}{wuvy|~~~~~ywxy{zxwxz{}zwuw{|}}}{z~}zwvx|}|}{xxzzz~{xvuvw|~zwvwy|}~|}}{vuvy}~}}~~yxxy{{yxyz|{ywuwz{|}}{z~~~~~}yvvx{~|{|zxxzz{~{wvvwx}{wvwz|~}~~{wuwz~~}}~ywwxzzyxxy{~zxvuwzz|}}|z}}~~~~~{xwx|}|}|yyz{|~|xvvwx{|wuvy{~}}}{wtux}||}~zwwxy{zyxxz~{ywvwy{|}~}{}}~~~~|ywwz~}|||yxz{{~~xvuwxz}xuuwz~~~|yuuw{|{|~}xwwy{|{yxy||ywvvxz{|}~|{~{|~}}}~{xwz}}|}{yxz{}{vuwxy}{wuwy|~}{wuvy~{{}{wwwx{|yxxz}~zwvvwxy{|~}{|}{~~}}~~{xy{}}}{yy{}zvvwyz~zuuwz}~|yvtvz}z{}~zwwwy||zxx{~ywwwxyz{}~~|}}|~}}~~zxy|}}|{yy{}yuvxyz~xuuwz~}{xutw{}{|~}ywwxz}|yxx{|xvwwxyz{}~}|~}zz~}{|~}zy{~}}|zyy|~}wuwyz}|wuwy}~{wuuy~zz|~|xvwx{}{xwy}~yvvwwxyz{}~}}~~|z|~|{}|z{}~}}{zy{~zuvyz|xuuwz}{xutw||y{~~|ywvwy}|ywx|{wvwxxyz{}~~~~}z{|{|~{{}~}|{yz}{uuwy{~zuuwz~~{xutv{~}z{~}{xwwy}~{xy||wvwxxxy{}~~~~|z{|z{~~|{|~~||{yz}{vuxz|zvuwz|yvtv|}~}zz}}|{xvwx|}{xx{{wuwxxxyz|~}}{yz~|{|~}~~}||z{{vuy{}yvvx{~zwutw}}|}~|yz~}|{xvwy}}zxy}~zvvxyxxy{}}}{z{~{{|~}}||{z|~yuvy|~~xuvx|}yvuux}|}|z|~||{xwwz~~{yz~}yvvyzxxy{}~||zz{~zz|~~~~~}{||z|~yvvz}~yvvy}}xvuuy|z|~~|z{}||{ywwz}}zxz}~|yvvxzxwyz|~~{{yyz~~{z|~||||}~zvwz}~zwwy|~yvuux|y{}}|z{~~|||zwwy|~|yz}|zwvxzyxxz|~|{zz{}|z|~~||}||~{wvy|~{xwx{zvuuw}zz}~}|{}||||ywy{~}{z|}{ywxzzxxy{}}{zyz{~}zz|~~~}||||~|ywwz~}zxxz~~yvuvz|y{}}}||~{||zxwy|}|z{}~|yxwxyxwwy{~|zxyz{|z|~}|}}~|yxy|~|yxx{}wuuw|zxz|||{||{||zxxz|}|z{~}{yxxzzyxxz|{yyy{||{|}|}}~}zxxy}~}{yxy|{vuux~zy{||||}|{|}zxy{}}|{||zyxyzzyxxz|}zxyz{|~{{}~~}||}~~|zxy{}|{yy{~yuuw{}yy{|||}}{{||yxy{}}||~~{yyxyzyxwy{~|yxyz{~}{|~~~}|}~}zyyz~~|{zyz}{vtvz~yxz{{|}~~|{||{yy{|}||~~{zzyzzzxxxz}}yxyz{}~||~}|}~~}zyyz}}{{{zz}|wtvy{xy{{}~~~~|||}|zz{|}}}~{zzzzzzyxxz|}ywxz{|~||~~~~~}|}~~|zzz{}}{{|{{}|wuvz{yyz{}~~}~~|{|}|zzz{|}~~{yzzzzyxwxy|}ywyz{|}}~~~~~}}}}{yz{|~|z{|||~zvtw|~zxxz{}}|}}|||}|zzz{|~}zz{{{zyxwxz~|xwy{|}~~~~~}}}~{yyz|}~{y{|}}~yvux~}zxxz|~|{||||}}|{{z{}~|zz{||zyxwxz~~|xwy{{|~~~~}}}}}~~{yy{}~~zy{}~~~zvuy}zxxy|~{z{||||}}|zzz|}|zz{||zyxwxz~~~~|xwy{|}~~}}|}}~zxy{}~zxz}~~zvux}{ywx{~{yz{|||}}|{zz{}|{z{}}{yxxxz}~~}zxy{|}~~}||}}~{xxz}{xy|{wvw}~|zxwz}}zyz|}}}~~|{zz}}|{z{}~|zyxxx{}}~}{xxy{|}}}||}}~ywy|}yxz~}zwvz~}{ywx{~{xxz|}}}~}|zy{~|{zz|}}{yxxwy}~}}}|zxxz{|~}|{|}~|xwz}|xx{|xvw|~|{ywx{~zwx{|}}}~}{zy|}|{z{|~}{yxxxz~~}}}|zxy{|}~}|{|}{wwz~{xy|{xwy~}|{xwy}|ywx{}}}~~{zz}|{z{|~}{yxxx{||||{yxyz|}~|{{|~~yvx|~yxz~}ywx|}||zwwz~~zwvy|}}}~}zy{}{zz{|~~|yxxxy}~|||{zyxz{|~}|{|}{vwzzxy}~zxwz}||zxvx|{wvw{}}}~~{yz~}{zz{|~}zyxxy||{|{zyyz{}~}{z{}|wvy~{xx{~zxxz}||{ywx||xuvz}~}~~|zz}}{yz{}~}{yxxy||{{{zzyy{|~}{z{||wvy~{xy|~zxx{|{|{ywx|{wuvy}~~~|yz}|zyz{}~{yxxy||zzzzzyy{|~}{z{}|vvzzxy}}yxy}}{{|{xwx}}yvtvz}~~~{yz~{yyz|~}{xxxz~~{zzzzzzz{}|zz{~yvw{~yxz~|yx{|{{|{ywy~|yvtvz}~~~{z{~zxyz}}zxxy{~{yyzzzzz|~|zy{~yvw|~zxz~{yy|~{z{{{ywy~{xutvz}~~{z{}yxxz}}{xxx{~zyyyzzzz{~|zy{~zvw{~zyz~|yy|~{zz{{yxy}|xutux|~|z{~zxxz}~|yxx{~|yxyz{{z{}~}zyz}{wvz{yz}}yx{{zz{{zyy{}yvttw{~~{{}{xxy{~}zxxz}}zxxyz{zz|~~~{yy{~ywx}}zz{~{yz~}zzz{{zyz}{wutux|~|{|}ywxz}~|yxy{~|ywxyz{z{}~}~~{yz||xwz|zz}}zxz{yyz{zyyz~~yvttuy}~|{||ywx{~~|yxy|~{xwxy{{{{~~}~~zyz}{xxz|z{~|yy|~zyyz{zyy{|xvttvz}~|{~{xwy|}{yxz}}zwwxz{{{|~}|~|yy{}yxy}}{{}}zyz|yyzzzzzz}zwutuw{~~}||}ywxz}~|zxy|~|ywwyz{{|~}||~~zyz}{yy{~|{|~{yy~}yxyzzzzz|{wuttvy}}||zwxy|}{yy{}zwvxz{||}~|{}{yz|{yy{~|||~{yy}}zxyzzzz{}|xuttvx|~}}zxwy|}{yy{}zwvxz{||}}{z}{yz|{yz|~||}}zyz~}yxyzzz{|}|wuttvx{~}}~zxwy|~}{yy|~}zwvxz{|}~}{z|{yz}~zz{}}|}~{yx{{xxyyzz{}~zvttuvx|~}}~ywxz}~|{z{~~|zwwx{|}~~|zz}~{z{~|zz|~||}}zxy|{xxyzz{|~~yvttuvx|~}~}ywxz}}|{z{~~|zwvx{|~~~{yy}~{z{~{z{}~||~|yxy}~zxxyyz{}~yuttuvx{~}}}yxxz}}|{{|~|zwvx{|~~{yy|~{z|~{z{}||~|yxy}~{xxxyz{}zvttuvwz}~}~zxxz}~|{{|~~}{xwxz|~~|yx{|{{~~{yz}||}}ywx{|yxyyz{}|wuttuvx{~~}~|yxy{~~}|{|~~}|ywwy{~}zxy}}{{}|zz|~~|}{xwy~~zyxyyz|~~zvttuuvy|~~}~~{xxz|~~}|{|}~}{ywxz|~~|yxz~}{|~~{yz}}|}}zwwz}zxxyyz|}yuttuvwy}~~}~}zyy{}~~~}|||~~}|{ywxz}}{yxz~}||}zy{~~||~|ywx||yxxyy{}|xuttuuwz}~~}|zyy{}~~}|||}~}|zxxy{~|zxx|~||}~{yz|}|}~zwwz~{yxyyz|}zvttuuvw{}~}~~{yyz|}~}}||}~~}|{yxxz}}{yxz~~}|}|yy{}||~{wvx}{yxxyz{~~zwuttuuwy|}}~~|zyz|}}}}||}~~}}|zyyz|~{yxy|~~}}|yyz~}||~{xvx}|yyxyy{~~{xutuuuvy{}}~~|{zz|}}}}||}~}|{zyyy|~~{yxy|~~~}~|yx{~~}||~{wvx}|zyyyz|~}zxuttuuvx{}}~~|{zz||}||||}~}||{zyz|}{xxy|~~~~~~{xy{~|||}~zvvy{yyyyz||ywuttuuvx{|}}|{z{|}||||}~~}}|{{zz{}|zxxz}}}~~}yxy}~|{{|}}xvw{~{yyyyz}}{yvutuuvwxz|~~||{{|||||||}~}||{{zz{}|yxxz}~}}~|yxz}~|z{|~}xvw{{zyyy{~}zxvuttuuvxz|~}||{{||||{||}~}||{{{{|}|yxxz|~}}~|xwy}~{zz{}}yvw{|zyyyz}}zxwuutuuvwy{}~|||||||{{{|}~}||{{{{|}}zxxy|~}}~}ywy|~{yy{}zvvy}{zyyz|~{ywvuuuuvwxz||{||||||{{|}}||{{{|||~~{xxyz}}|}~zwwz~}zxy|~|xvw||zyyy{~|yxvvuuuuvwxz}}{{||}||{{{|}~}|{{||||}}zxxy{~}|~}ywx{~{yxy|{wvy~~|zzyz|{ywvuutuuvwx{~}{{|}}|{{{{|~~}||{||}}~|yxxz|~~||~|xwy|}zxxz}~zwwz~{zyyz}~zxwvuutuvvwy{~|{|}}}|{{{{}}||{{|}}}~{xxyz|}|}~zwwz~|ywx{~|xwx}}{zyz{~{ywvvuuuuvvwy}}{{|}}|{{z{|~~||{{|}}}~|yxxz{~~||~{xwy}}ywwy}}ywx|~|{zz{~}ywvvuutuuvwx|~{{|}}}|{z{|~~}||{|}~~~}zxxy{}}|}|xwx|}zwvx|~zwx{~|{zz{}}ywvvvutuuvvx{~{{|}~}|{zz{~~}|{{|}~~~}zxxy{}}|}{xwx|}yvvx|}zxx|~|{zz{~}ywvvvuuuuvvw{}{z|}~}|{zz{~~}{{{|}~}zxxz{}}|~zwwy}|xuux}|yxy~~|{zz|{xvuvvuuuvvvx||z{|~~}{zz{|~||{|}~~|yxyz{}~||~}ywwz~}zwuvy}~{yy{~}{{{}{wuuvvuuuvvvy}|z{|~~}{zz{}~|{{|}~~{yxyz|}~|}}ywx{}zvuuy~}{yy|~}{{{}zwuuvvuuuvvvx}|z{|~}{zz{}}|{{|}~}{yxyz|}~}}}ywx{~}zwtux}}{yy|~}|{{}{wuuuvuuuvvvx{}{z|~~|{zz|~|{{{}~~|zyyz|}~}}~~ywwz}~zwutw{}{zz{~}||}}yvuuvvuuuvvwz~{z{}~}{zz{~}|{{|~~|zyxy{|~~}}{xwy||yvtux}~|zz{~~|||~{wuuuvuuuvvvx|}{z|~~|{zz|~|{{{}~}{zyyz{}~~}~~zwwz}~{wutvy~}{zz|~}||}~zvttuvuuuvvwy}|{{|~~|{z{}~|{{|}~}{zyyz|}~}}~ywxz~~zvttvz}zzz}~}||}}yvttuuuuuvvwz~|{{}~}|zz|~}|{{}~}|zyyy{|}~}~{xwy||xutux|~{zz|~}}}{wutuuuuuvvwx|}{{|~~}{z{}~}{{|}~|{zyyz{}~~~~}yxx{~}yvttvz~{zz{~~}}|xuttuuvvvvvx{~|{|}}|{{|}|{|}~|{zyyz{}~~~~zxxz~}yvttvy~|zy{~~}}|yvttuuvvvvvx{~|{|}~~|{{|}|{{}~|{zyzz{}~~~~}zxx{~}yvttvy}~{yz|~~~|yvtttuvvvvwx{~|{|}~~}|{{}}|{|}}{zyyzz{}~~~~}yxy||xuttvz~}zyz}~~~{xuttuuvvvvwy|}|{|~~~}|{|~}|{|~}{zyzz{|}~~~{yyz}{wutuw{|zy{~}zwuttuuvvvvxz}}||}~~~}|{|~~}||}~|zyyzz{|}~~~~~{yy{}~zwttuw{|yy{}zwutttuvvvwxz~~}||}~~~}||}}||}|zyyzz{|}~~~~~~{yy{}~{wutuwz~|zyz~}{xvtttuvwvwxz}}||}}~~~}|}~~||}~}zyyzz{|}~~}~~~|zyz}{xutuvy|}zyz}~{yvuttuvwwwwy|~}|}}~~~}}}~~}||}~{yyyz{||}~}}~~~~}{yz|~}zvttvx{~|yy{}zxvtttuvwwwx{~~}|}}}~~~}}}~||}}zyyzz{||}}}}}~~~~|zz{}|xuttvx{~~{yy}|ywutstuvwwwy|~}}}}}~~~}}~~}}}|zyyz{{|}}}}|}~~~~|zz{}~{xutuwy|}zyz~~{ywutttvwwwxz}}}}}}~~~~}}}}}~~{yxyz{||}}}||}~~~}{z{}|yvttvxz}~{yy||zxvtttuvwwxy{~~}}}}}}~~~~~~}}}}zxxz{||}}}|||}~~~~{z{|~}zwutuwy|~|zy{}zxvutttvwwxy{~}}}}~}~~~~~~}~}zxxyz{||}}|{{|}~~~|z{|~}zxutuwy{~|zy{}zxwutttvwxxy{~}}}~~}}~~~~}~}{xxyz{|}}||{{|}}~~{z{|~}zwutuwy{}|zy{}zxwutttuwxxy|~~}}}~~}}~~~~~}zxxy{||}}||{{{|}~}{{{}~|ywuuvxz|~~{zz|~{yxvutttvwxyz}~}}~~~}}~~~~|zxxy{||}||{zz{|}~~|{{|~}zxvuuvxz|~}{z{~}{ywvuttuvwxz{~~}}}~~~}}~~~~|yxxy{|}}||{zzz|}~|{{}|zxvuuvxz|}|{z{~}zywvuttuvwyz|~~}}}~~~}}~~|zxxy{|}}||{zzz{}~|{{}}zxvuuvxz|}~}{z{~}{ywvvutuvwxz{~~}}}~~~}~}zyxyz|}}||{zyy{|~~|{{|~}zxvuuvxz{|}}{z{}~{yxwvuuuuwxz{}~}}}~~}}~~{yxxy{|}||{zyyy{}|{{|~{ywvuvwyz|}~~|{{||zxwvvuuuvwyz|~}}}}~~~}~}zyxyz|}}|{zyyyz|~~|{{|~zxvuuvxy{|}~}{z{}~|yxwvvuuuvxy{}~}}}}~~~~}~~|zyxyz|}}|{zyyyz|~}{z{}}zwvuvwxz{|}~~|{z|~}{yxwvuuuvwxz|~~}|}}~~~~~}{zxxy{|}|{zyyxyz|~|z{|~~{xvuuvwyz{|}~~~}{z{}|zxwvvuuuvwy{}~}||}~~~~~~|zyxyz{|}|{zyxxy{~|{z{}|yvuuvwxz{||}~~}|z{}|zxwvvvuuvwy{}~||||}~~~~}{yyyz{|}|{zyxxyz}}{z{}}ywuuvwxz{{||}~}|z{|}zxwvvvvvvwy{}~|{{|}~~~~~}{zyyz{|}|{zyxxxz}|zz{}|yvuuvwxz{{{||}|{z{}|zxwvvvvvvwy{}~|{{|}~~~~|{zyyz{|||zyxxwxz}~|zz|~{xvuuvxyz{{{||||{z{~~{yxwvvvvvwxz|}{z{|~~~~}|zyyyz{||{zyxwwx{}}{zz|~zwuuuwxyz{{{{||{zz|}zxwvvvvvwwxz}~|zz{|~~}{zzyyz{||{zyxwwxz}}zz{}~zwuuvwxz{{{{{{{{zz|}zxwvvvvwwwxz}~|zz{|~~}{zzyyz{||{zyxwwxz}}zyz|~zwuuuwxyz{{{zzzzzz|~{xwvvvvwwwxz}|zyz|}}|{zzyz{||{zyxwwxy|}{yz|{xutuvxyz{{zzzzzzz||ywvvvvwwwxy|~}zyy{}~~|{zzzzz{||{yxwwwx{~|zz{}}zvuuvwyzz{{zzzyyz{}}zxwvvvwwxxyz}~{yyz{}~~}{{zzzzz{{{zyxwwwy{~{yz|~|yvtuvxyzzzzzyyyyz{~|zxwvvvwwxxy{~}{yyz|~~|{zzzzz{{{{zxwwwxy|}zyz|~{xutuvxyzzzzzyyxyz|{ywvvvvwxxyz||zyyz|~}|{zzzzz{{{zyxwwwxz}|zz{}}ywutvwyzzzzzyxxxy{~}zxwvvvwxxyy{~}{yxy{}~~|{zzzzz{{{{zxwwwwy|}zyz|~zwutuwxyzzzyyxxxxz}~{ywvvvwxxyz{}~{yxyz|~~|{{zzzzz{{zzyxwwwy{~}{yz|~~{xvuuvxyzzzyyxwwxy|~{ywvvvwxxyz{}~{yxxz|~~|{zzzzzz{{zzyxwwwy{~}{zz|~{xvuuvxzzzzyyxwwxy}~{ywvvvwxyyz{}~{yxxz|~}|{zzzz{{{zzyxwwwwy{~}zz{}}zwuuuwyzzzzyxwvvxz~}zxvvvvwxyz{|~}zxxxz|~~}{{zzzzzzzzyyxwwwxy||zz{}~|ywuuvwyzzzyyxvvvx{}zxvvvwxyz{|}|zxxxz|~~|{zzz{{{zzzyyxwwwxy|~{zz{~~{ywuuvwyzzzyxwvuvx{|zxvvvwxyz{|}|yxxxz|~~|{zzz{{{{zzyyxwwwxy|~|zz{~~|ywvuvwyzzzyxwvuuwz}zxvvvvwyz{|}|zxwxy{}~~|{zzz{{{{zzyyxwwwxy{~|zz{}~|ywvuvwxyzzyxwvuuvy}~{ywvvvwxz{|}}{yxxyz|~}|{zzz{{{zzyyxxwwwxz|~{z{|~}{xwvvvwyzzzyxwuuuw{}zxvvvwxyz|}~|zxwxy{}~~|{zzz{{{{zyyxxwwwxy{}}{z{}|zxvvvwxyzzyxwvutux||ywvvvwxy{|}~{yxwxy{}~~|{zzz{{{{zyyxxwwwxy{~|{{|~~{ywvvvwxyzzyxwvutvy~~{ywvvvwyz{}~}{yxxyz|}~}{zzzz{{{zyyxxwwwwyz|~~{{{||zxwvvvwyyzyxwvutuw{}zxwvvwxz{|~|yxxxy{|~~|{zzz{{{{zyxxxwwwxy{}~|{{|~}{ywvvvwxyzyyxvuttvz~}{xwvvwxy{|}|zxxxyz|}~~|{zzz{{{{zyxxxwwwxy{}}{{|~}{ywvvwwxyzyyxwuttuy~~{ywvvwxy{|~|zxxxyz{}~~|{zzz{{{{zyxxwwwwxy{}}{{|~}{ywwvwwxyyyyxvuttuy~~{ywvvwxy{|~|zxxxyz{}~~|{zzz{{{{zyxwwwwxxy{}~|{|}~~|zxwwwwxxyyyxwvtttvz}zxwvvwyz|}~{yxxxyz{}~}|zzzz{{{{zyxwwwwxyz|~}|||}}{yxwwwwxyyyyxwutttw{|zxwvwwyz|~}{yxxxyz{}}{zzzz{{{{zxxwwwwxyz|~}|||~}{yxwwwxxyyyyxwutttw{~|zxwwwxy{|~}{yxxxyz{}}{zzzz{{{{zxwwwwxxyz|}}||}~}{yxwwwxxxyyxxwutstw{|zywwwxy{|~}{yxxxyz{|~~|zzzz{{{{zyxwwwwxyz|}}||}~~{yxwwwxxxyyxxwutstvz~}{yxwwwxz|}~|zxxxyyz{}}{zzzz{{{zyxwwwwxyz{|~~}||}|zxwwwxxxyyyxwvutsuw|~|zxwwwxy{}~}{yxxxyzz|~~|{zzzz{{{zyxwwwwxyz{}~}||}~~{yxwwwxxxxxxxwvtstuy}~|zxwwwxz|}|{yxxyyz{|~}|zzzz{{{{zyxwwwxxyz|}~}||}~}{yxwwwxxyxxxxwutstvz}{yxwwxyz|~~|zyxxyyz{}~}{zzzz{{{zyxwwwwxyz{|~~||}~~|zxwwwxxyyxxxwvtstux|~|zyxwwxz{}|{yxxyyzz|}~|zzzz{{{{zyxwwwxyy{|}~~}|}~}zxwwwxxyyxxxwvutstw{~|{yxxxxz{}}{zyxyyzz{}~|{zzzz{{{zyxwwwxxyz|}~~}|}}}{ywwwxxyyxxxwvutstwz}{yxxxxz{}}{zyxyyyz{|~~|{zzzz{{{zyxwwwxxy{|}~~}|}~}zxwwwxxyyxxwwvutstw{~|{yxxxyz{}}{yyyyyyz{|~~|{zzzz{{{zyxwwwxyz{|}~~||}~|zxwwwxyyyxxwwvtttux|}|zyxxxyz|~~|zyyyyyzz{}}|zzzzz{{zyxxwwwxyz{|}~}||}~{ywwwxxyyyxwwvutstvy}}{zyyxyz{}}{zyyyyyzz{}}|zzzzz{{zyyxwwwxyz{|}~}||~}{ywwwxyyyyxwwvutttvz~}{zyyyyz{}}{zyyyyyzz{}}|{zzzz{{zyyxwwwxyz||}~}||~~{ywwwxyyyyxwwvutttvy}}{zyyyyz{}~~{zyyyyyzz{|~~|{zzzz{{zzyxwwwxyz{|}~}||}~|yxwwwxyyyxxwvutttvx|}|{zyyyz{|~|{yyyyyzz{|}~}{zzzzzzzzyxxwwxyz{|}}~~}|}~}zxwwwxyyyyxwvutttuwz~~|{zyyyz{|}}{zyyyyzzz{|~~|{zzzzzzzzyxxwwxyz{|}~~}||}|zxwwwxyyyyxwvutttux{~|{zyyyz{|~}{zyyyyzzz{}}|{zzzzzzzyyxxwwxyz||}~~}||}~{yxwwxxyzyyxwvutttvy}}{{zyyz{|}|zyyyzzzz{|}~}|{zzzzzzzyxxwwxyz{|}}~~~||}~}zxwwwxyyyyxwvutttux{~|{zzyzz{|~}{zyyzzzzz{|~}|{zzzzzzzyyxxwxxy{||}~~~}||~~{ywwwxyyyyxwvutttuwz~}{zzyzz{|~~|zyyyzzzz{|~~|{zzzzzzzyyxxxxxyz||}~~}||}~|yxwwxxyzyyxwutttuwz}}{zzzzz{|~~|zyyyzzzz{|}~|{{zzzzzzyyxxxxxyz{|}}~~~}|}~~{yxwwxxyyyyxvutttuwz~}{zzzz{|}~~|zyyzzzzz{|~~|{{zzzzzzyyxxxxxy{|}}~~~~}|}~}{ywwwxyyyyxwvutttvx{~|{zzzz{|}}{zyyzzzz{{|~~}|{zzzzzzyyyxxxxyz{|}}~~}||}|zxwwwxyyyyxwvtttuvy}}|zzzz{|}~}{zyzzzzz{{}~~}|{{zzzzyyyyxxxxyz{|}~~~~}||}|zxwwwxyyyyxwvtttuwz}}|{zz{{|}~}{zzzz{{{{|}~}|{{zzzyyyyyxxxyyz{|}}~~~}||}|zxwwwxyyyyxwvuttuwz}~|{zzz{|}~}{zzzz{{{{|}~~}||{zzzyyyyxxxxyyz{|}~~~~~}||}~}{ywwwxxyyyxwvutttvy|}{zzz{|}~~|{zzzz{{{{|~~}|{{zzzyyyyxxxyyz{|}}~~~}|||}~|zxwwwxyyyyxwvtttux{~}|{zz{|}~}{zzzz{{{{|}~~}||{zzzyyyxxxxyyyz{|}}~~~~}||}~}{yxwwwxyyyxwvutttvy|}|{z{{|}~}{zzz{{{{||}~}||{zzzyyxxxxxyyyz{|}~~~~}|||}~}{yxwwxxyyyxwvuttuwz}}{{z{|}~~|{zzz{{{{|}~~}|{{zzyyyxxxxyyyz{|}}~~~~}|||~~|zxwwwxxyyxxwutttvx{~|{z{{|}}{zzz{{{{||}~}||{{zzyyxxxxyyyzz{|}~~~~}|||}|zyxwwxxxyxxwvuttux{~~}{{{{|}~|{zz{{{|||}~~}}|{{zzyyxxxxxyyzz{|}}~~~~}|||}~}{yxwwxxxyxxwvuttuwz~}{{{{|~~|{zz{{{|||}~~}}|{{zzyyxxxxyyyzz{|}}~~~~~||||}~}{yxwwxxxxxxwvuttux{~~}{{{{}~}|{zz{{{||}}~~}}||{{zyyxxxxyyzz{{|}~~~~}|{{|}~|zyxxxxxxxxwwvuttvy|~|{{{|}~}|{z{{{|||}~~}||{{zzyxxxxxyyzz{||}~~~~}|{{||~}{zyxxxxxxxxwvuttuwz}~|{{{|~~}|{{{{{||}}~~}||{{zzyxxxxxyyzz{||}~~~~~}|{{|}~}{zyxxxxxxxxwvuttuwz~~|{{|}~~}|{{{{{||}}~~}|||{{zyxxxxxyyz{{||}~~~~}||{{{|~}{zyxxxxxxxxwvuttuwz}~|{{||~~}|{{{{{||}}~~}|||{{zyxxxxxyyz{{||}}~~~}|{{{{|}~|zyyxxxxxxxwvuutuvy|}|{||~}||{{{{||}}~~}}|||{zzyxxxxyyzz{{||}~~~~~}|{{{|}~~}{zyxxxxxxxwwvutuvx{~~||{|}~~}|{{{{{||}~~~}|||{{zyyxxxxyyz{{||}}~~~~}|{zz{|}~|{zyyxxxxxxwvvutuvy|}||||}~}|{{{{|||}~~}|||{{zyxxxxxyzz{{||}}~~~}|{zz{|~}|zyyyxxxxxwwvuuuuwz}}|||}~}|||{{|||}}~~}}|||{{zyxxxxyyz{{|||}}~~~}|{zzz{}~~|{zyyyxxxxwwvvuuuvx{~}|||~~}|||{{|||}~~}||||{zyyxxxxyzz{{||}}~~~~}|{zzz{|~}{zyyyyyxxxwwvuuuvxz~~}|||}~}||||||||}~~}||||{{zyxxxxyzz{{||}}}~~~}|{zzz{|}}|zzyyyyxxxwwvuuuvwz}~}|||}~}||||||||}~~}||||{{zyxxxxyzz{{|||}}~~~~~}|{zyz{|}}{zzyyyyxxxwvvuuuvx{~}}|}~~}||||||||}~~}||||{{zyxxxxyzz{||||}}~~~~}{zyyz{|~~|{zzyyyyxxwwvvuuuwy|~}||}~~}|||||||}}~~}||||{zzyxxxyyz{{|||}}}~~~~}|{zyyz{}~~|{zzzyyyxxwwvuuuvwz}~}}}}}}|||||||}~~~}}||||{zzyxxxyyz{||||}}}~~~~}|{yyyz{}}|{zzzzyyxxwwvuuuvxz}~}}}~}}|||||||}~}}||||{zzyxxxyzz{|||||}}~~~~}|zyxyy{|~}|{zzzzzyyxwwvuuuvxz}~}}}~~}|||||||}~~~}||||{{zyyxxyyz{{||||}}~~~~}|{yxxyz|~~|{zzzzzyyxwwvuuuvwy|~}}}~~}}||||||}}~~}}||||{zzyyyyyzz{||||}}}~~~~|{zyxxz{}}{zzzzzzyyxwvvuuuwx{~~}}}~}}|||||||}~~}||||{{zyyyyyyz{{|||||}}~~~}|zyxxyz|}~|{zzzzzzyxxwvuuuvwy|~}}~~}}}}}}||}}~~}||||{{zyyyyyzz{|||||}}}~~~}{zyxxyz|~~|{zzzzzzyxwwvuuuvxz}~~}~~~}}}}}}||}}~~}}||||{{zyyyyyz{{|||||}}~~~}|{yxxxy{}~}{zzzzzzzyxwvvuuvwy|~~}}~}}}}}}}|}}~~}||||{{zzyyyyzz{|||||}}}~~}}{zxxxyz|~}|{zzzzzzyxwvvuuuwy{~~~~~~}}}}}}}}}~~}||||{{zzyyyyzz{{|||||}}}~}}{zyxxxz{}}|{zzzzzzyxxwvuuuwx{~~~~~~}}}}}}}}}~~~}||||{{{zzyyyzz{||||||}}}~}|{zxxxxz{}}|{zzzzzzyyxwvuuvwy{~~~~~~}}}}}}}}}~~}||||{{{zzyyzzz{||||||}}}}}|{yxwwxz|~}{{zzz{{zyxwvvuuvwz|~~~~~}}}}}}}}}~~}|||{{{zzzzzzz{{||||||}}}}|{zyxwxyz|~~|{zzzz{{zyxwvuuuvx{}~~~~~}}}}}}}}~~~~}|||{{{{zzzzzz{{||||||}}}}|{zxwwxyz|~|{zzz{{{zyxwvuuuwx{~~~~~~}}}}}}}}~~~~}||||{{{zzzzzz{{||||||}}}}|{zxwwwxz|~~|{zzz{{{zyxwvvuuvx{}~~~~~}}}}}}}}~~~}||||{{{{zzzzz{{||||||}}}}|{zyxwwxz{~~}{{zz{{{zzyxwvuuvxz}~~~~~~}}~~}}}~~~}}|||{{{{{zzzz{{|||||||}}}||{yxwwxyz}~|{zzz{{{zyxwvvuvwy|~~~~~~}~~~}}}~~~}}|||{{{{{{z{{{{|||||||}}}|{zyxwwxy{}}|{zz{{{{zyxwvuuvxz}~~~~~}~~~}}~~~~}|||{{{{{{{{{{{{||||||}}}||{zxwwwxz{~~}{{zz{{{{zyxwvuvwx{}~~~~~~~~~~~~~~}}|||{{{{{{{{{{{|||||||||||{zyxwwwyz|}|{zz{{{{zzywvvvvxz|~~~~~~~~~~~~~~~}|||{{{{{{{{{{{|||||||||||{zyxwwwxz|~~|{{z{{{{{zyxwvvvwy|~~~~~~~~~~~~~~~}}|||{{{{{{{{{{||||||||||||{yxwwwxy{}~}{{z{{{{{zyxwvvvwy{~~~~~~~~~~~~~~~}}|||{{{{{{{{{{|||||||||||{zyxwwwxy{}~}{{{{{{{{zyxwvvvwy|~~~~~~~~~~~~~~~}}||{{{{{{{{{{{|||||||||||{zyxwwwxy{}}|{{{{{{{{zyxwvvwxz}~~~~~~~~~~~~~~}}||{{{{{||||||||||||||||{zyxwwwwyz|~~}|{{{{{{{zzyxwvvwy{~~~~~~~~~~~~~}}|||{{{{{||||||||||||||||{zyxwwwwyz|~~}|{{{{{{{zzyxwvvwy{~~~~~~~~~~~}}}||{{{{|||||||||||||||||{zyxwwwwxz|~~}|{{{{{{{{zyxwwwwy{~~~~~~~~~~~~}}||{{{{|||||||||||||||||{zyxwwwwxz{}~}|{{{{{{{{zyxxwwwy{}~~~~~~~~~~}}|||{{{|||||||||||||||||{{zyxwwwxyz|~~}|{{{{{{{zzyxwwwxz|~~~~~~~~}}}||{{{{|||||||||||||||||{zyxwwwwxy{}~}||{{{{{{{zzyxwwwxz}~~~~~~~}}}||{{{||||}}||||||||||||{zyxwwwwxz{}~}|{{{{{{{{zyyxwwxy{~~~~~}}|||{{{|||}}}|||||||||||{zyxwwwwxyz|~~}||{{{{{{{zzyxxwwxz}~~~~~}}}|||{{|||}}}}|||||||||||{zxwwwwwxz|~~}|{{{{{{{{zyyxwwxz|~~~~~~}}}|||{{|||}}}}}|||||||||{{zxwwwwwxy{}~}|{{{{{{{{zzyxxxxz|~~~~~~}}}|||{{|||}}}}}}||||||||{{yxwwvwwxz{}}||{{{{{{{{zzyxxxyz|~~~~~}}}|||{|||}}}}}}}||||||||{zyxwwvwwyz|}~}||{{{{{{{{zyyxxxy{}~~~~}}}||||||||}}}}}}}||||||||{zywwvvwxyz|~~}|{{{{{{{{zzyyxxyz|~~~~~~}}}||||||||}}}}}}}||||||||{zxwwvvwxy{|~}||{{{||{{{zzyyxxyz|~~~~~~}}}|||||||}}}~~}}}||||||||{zxwwvvwxy{|~}||{{{||{{{zzyyxyyz|~~~~~~}}}||||||||}}~~~}}}|||||||{zywwvvwxyz|}~}|{{{|||{{{zzyyyyz|~~~~~}}}||||||||}}~~~~}}|||||||{zyxwvvvwxy{}~~}||{{||||{{zzyyyyz{}~~~~~}}}|||||||}}}~~~~}}|||||||{zywwvvwwyz|}~}|{{{|||{{{zzyyyyz|~~~~~~}}}||||||||}}~~~~~}}|||||||{zxwvvvwxyz|~}||{{{|||{{{zzyyyz{}~~~~}}}|||||||}}}~~~~}}|||||||{zyxwvvvwxy{}~~}|{{{||||{{zzyyyyz|~~~~~~}}}||||||||}}~~~~~}}||||||{{yxwvvvwxyz|~~}|{{{||||{{zzyyyyz|}~~~~~}}}||||||||}}~~~~~}}||||||{{zxwvvvwxyz|}~}|{{{{|||{{{zzyyyz|}~~~~~}}}|||||||}}}~~~~~}}||||||{{yxwvvvwxyz|}~}|{{{|||||{{zzyyz{|~~~~~~}}||||||||}}~~~~~~}}||||||{zyxwvvvwxy{|~~}|{{{||||{{zzzyzz{}~~~~~~}}|||||||}}}~~~~~~}}||||||{zyxwvvvwxz{}~~}|{{{{||||{{zzzyz{|~~~}}~~}}||||||||}}}~~~~~~~}}|||||{zywvvvvwxz{}~~}|{{{{||||{{zzzzz{|~~~}}~~}}||||||||}}~~~~~~~~}}||||{{zywvvvvwxz{}~~}|{{{{||||{{zzzzz{|~~~}}~~}}||||||||}}~~~~~~~}}|||||{zyxwvvvwxy{|~~}|{{{{|||||{{zzzz{|~~~}}}~~~}}|||||||}}}~~~~~~}}||||{zyxwvvvvwyz|}~||{{{{||||{{zzzzz{}~}}}~~~}}|||||||}}}~~~~~~~}}||||{{zyxwvvvwxy{|~~}|{{{{{||||{{zzzz{|~~}}}~~~}}|||||||}}}~~~~~~}}||||{{zyxwvvvwxy{|~~}|{{{{|||||{{zzzz{}~~}}}}~~~}}||||||||}}~~~~~~~}}||||{zyxwvvvvwyz|}~}|{{{{{||||{{zzzz{|~~}}}~~~~}}|||||||}}~~~~~~~}}|||{{zxwvvvvwxz{}~~}||{{{{|||||{{zzz{|}~}}}~~~~}}|||||||}}~~~~~~~}}|||{{zyxwvvvwxy{|~~}||{{{{{||||{{zzz{|}~}}}}~~~}}}|||||||}}~~~~~~}}}||{{zyxwvvvwxy{|~~}|{{{{{{||||{{zzz{|}~}|}}~~~~}}||||||||}}~~~~~~}}}||{zyxwvvvvwxz{}~~~}|{{{{{||||{{{zzz{|~~}}|}~~~~~}}}||||||||}~~~~~~}}|||{zyxwvvvwwyz|}~}|{{{{{{||||{{zzz{|}~}||}~~~~}}}||||{{||}}~~~~~~}}}||{zyxwvvvwxyz|}~~}|{{{{{{||||{{zzz{|}~}||}~~~~}}}||||{{||}}~~~~~}}}||{zyxwvvvwxyz|}~}}|{{{{{{||||{{{zz{|}~}||}~~~~}}}||||{{|||}~~~~~~}}}|{zyxwvvvwwxz{}~~}}|{{{{{{{|||{{{zz{|}~}|||}~~~}}}||||{{{||}}~~~~~~}}}|{{zyxwvvvwxy{|~~~}|{{{{{{{||||{{{z{{|~}}||}~~~~}}}||||{{{|||}~~~~~~}}}|{zyxwwvvwwxz{}~~}||{{zz{{{|||{{{{z{|}~}|||}~~~}}}}|||{{{{||}}~~~~~~}}}|{zyxwvvvwwyz{}~~}|{{{zz{{{|||{{{zz{|}~}|||}~~~}}}||||{{{{||}~~~~~~}}}|{{yxwwvvvwxy{|~~}|{{{zz{{{{||{{{{{{|}~}}||}~~~}}}||||{{{{||}}~~~~~~}}}|{zyxwvvvwxyz|}~~}||{zzzz{{{|||{{{{{{|~}}||}~~~}}}|||{{{{{{||}~~~~~~~}}|{zyxwwvvwxyz{}~~}||{zzzz{{{{|{{{{{{{|~}}|||}~~~}}||||{{{{{{||}~~~~~~~}}|{zyxwwvvwxyz{}~~}|{{zzzz{{{{|{{{{{{|}~~}}|||~~~}}}|||{{{{{{{|}}~~~~~~}}|{zyxwwvwwxyz|}~~~}|{zzzzz{{{{{{{{{{{|}~}|||}~~~}}|||{{{{{{{||}}~~~~~~}}|{zxwwvvwwxy{|~~}|{zzzzzz{{{{{{{{{{{|~~}|||}~~~~}}||{{{{{{{{||}~~~~~~~}}|{yxwwvwwxxz{|~~}|{zzzzzz{{{{{{{{{{|}~}}|||}~~~}}}||{{{{{{{{||}~~~~~~~~}}|{zxwwwwwxxz{|}~~~}|{zzyzzz{{{{{{{{{{|}~~}|||}~~~}}}||{{{{{{{{{|}}~~~~~~~}|{zyxwwwwwxy{|}~~~}|{zzyyzz{{{{{{{{{{{|~~}|||}~~~~}}||{{{{{{{{{||}~~~~~~~~}}|zyxwwwwwxyz{}~~~}|{zzyyyzz{{{{{{{{{{|}~}||||}~~~~}}|||{{{z{{{{{|}}~~~~~~~}|{zyxwwwwwxyz|}~~~~}|{zyyyzzz{{{{{{{{{||~~}||||}~~~}}||{{{zzz{{{||}~~~~~~~~}|{zyxwwwwxxz{|}~~~}|{zzyyyzzz{{{{{{{{{|}~~}|||}~~~}}}||{{zzzz{{{||}~~~~~~~}}|zyxwwwwwxyz{}~~~~}|{zyyyyzz{{{{{{{{{{|~~}||||}~~~}}}||{{zzzzz{{||}~~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}||{{zzzzz{{{|}}~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}||{{zzzzzz{{|}}~~~~~~~}|{zyxwwwwxyz{|}~~~~}|{zyyyyyzz{{{{{{{{{|}~}||||}~~~}}}|{{zzzzzz{{||}}~~~~~~~}|{zyxwwwxyyz||}~~~}}|{zyyyyyzz{{{{{{{{|}~~}|||}~~~}}||{{zzzzz{{{||}~~~~~~~~}}|{zyxxxxxyz{|}}~~~}|{{zyyyyzzz{{{{{{{||}~}}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}}|{zyxxxxyzz{|}}~~}}|{{zyyyyzzz{{{{{{{|}~~}}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}|{zyyxxyyz{||}}~~}}||{zzyyyzzz{{{{{{{|}~~}}}}~~~}}||{{zzzzz{{{||}}~~~~~~}|{zzyyyyyz{||}}~~}}}|{zzzyyzzz{{{{{{{|}}~~}}}~~~~}}|{{{zzzz{{{||}}}~~~~~~}}|{zyyyyyz{{|}}~~~}}||{zzzyzzzz{{{{{{||}~~~}}~~~}}||{{{zzz{{{|||}}~~~~~~}|{{zyyyyzz{||}}~~}}}|{{zzzzzzz{{{{{{{|}}~~~~~~~}}||{{{zz{{{{|||}}~~~~~~}|{{zzyyzz{{|}}~~~}}}|{{zzzzzzz{{{{{{||}~~~~~~~~}}||{{{z{{{{{||}}}~~~~~~}}|{zzzzzz{{||}}~~}}}||{{zzzzzz{{{{{{||}}~~~~~~~~}}||{{{{{{{{{|||}}}~~~~~~}|{{zzzzz{{||}}~~~}}}||{{zzzzz{{{{{{||}}~~~~~~~~}||{{{{{{{{{|||}}}~~~~~~}||{{zzzz{{|}}}~~~}}}||{{zzzzz{{{{{{|||}~~~~~~~~}||{{{{{{{{{|||}}}~~~~~~}||{{zzz{{||}}}~~~}}}||{{{zzzz{{{{{{||}}~~~~~~}|||{{{{{{{||||}}}~~~~~~}||{{{z{{{||}}~~~~}}}||{{{zzz{{{{{{|||}~~~~~}}||{{{{{{{{|||}}}}~~~~~}}||{{{{{{||}}}~~~~}}|||{{{zzz{{{{{{||}}~~~~}}||{{{{{{{{|||}}}~~~~~~}}||{{{{{{||}}~~~~~}}}||{{{{{{{{{{{|||}}~~}}|||{{{{{{||||}}}~~~~~~}}||{{{{{|||}}~~~~~}}}||{{{{{{{{{{{|||}}~~~}|||{{{{{{||||}}}}~~~~~~}}||{{{{||}}}~~~~~}}}|||{{{{{{{{{{|||}}~~}}|||{{{{{||||}}}}~~~~~~}}|||{{{|||}}~~~~~~}}}||{{{{{{{{{{|||}}~~~~}}||||{{||||||}}}}~~~~~~}}||||||||}}}~~~~~}}}}|||{{{{{{{{||||}}~~~}}||||||||||||}}}~~~~~~}}}||||||||}}~~~~~~}}}}|||{{{{{{{{||||}}~~}}||||||||||||}}}}~~~~~~~}}||||||||}}}~~~~~~}}}||||{{{{{{|||||}}~~~}}|||||||||||}}}}~~~~~~}}}|||||||}}}~~~~~~~}}}||||{{{{{|||||}}~~~~}}|||||||||||}}}}~~~~~~~}}}|||||}}}}~~~~~~~}}}||||{{{{||||||}}~~~~}}}||||||||||}}}}~~~~~~~}}}|||||}}}~~~~~~~~}}}||||||{||||||}}}~~~~}}}||||||||||}}}}~~~~~~~}}}||||}}}}~~~~~~~~}}}|||||||||||||}}}~~~}}}|||||||||}}}}~~~~~~~~}}}}|||}}}}~~~~~~~~~}}}||||||||||||}}}~~~~}}}|||||||||}}}}~~~~~~~~}}}}||}}}}}~~~~~~~~~}}}||||||||||||}}}~~~~}}}||||||||}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}}|||||||||||}}}~~~~}}}||||||||}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~}}}}|||||||||||}}}~~~~}}}}|||||}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}}||||||||||}}}~~~~~}}}}}||||}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~~}}}}|||||||||}}}}~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}|||||||||}}}}~~~~}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}||||||}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}|||||}}}}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}|||}}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~}}}}}~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~}}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~}}~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m52.bin b/applications/PoP/poc/res/music/m52.bin deleted file mode 100644 index f9fa0ff..0000000 --- a/applications/PoP/poc/res/music/m52.bin +++ /dev/null @@ -1 +0,0 @@ -vkc`dltxpidabeks}}wsnjgddcbbaabbbbcegimpu}{ridbchq{xpjfcbbdgimqvyz}}{yvsoligecbbcehlqu{{uoifccdglqx~ytpnkigfedddddddddddcdcddddeefgikloqsvy{~|yuqnkhfeeefhkosx||zywutssrqppppppppqrrsstuvwxy{|}~~|zxvtronljigffffghjlnqux{~~~~~}}}~~~~~~}|{{zxwvutrqonmlkiihhhhhhiijlmoqsvx{~~~~}|||{zzyxxwvuttsrqponmmlkjjiiiiiiijjklmnpqsuwy{}~}}|{{zyxxwvuutsrqqponnmllkkjjjjjjjjkklmmnoprstvwy{|~~}||{zyxwwvutssrqqpoonmmlllkkkkkkkkllmmnopqrstuvxyz|}~}}|{zyxwvvutssrqppoonnmmmllllllllmmmnoopqrstuvwxyz|}~~}|{zyyxwvuttsrrqqpooonnnmmmmmmmnnnooppqrrstuvwxyz{}~~}|{zyxwwvuttsrrqqppooonnnnnnnnnoooppqrrstuuvwxyz{|}~~}|{zzyxwvuutssrrqqppppoooooooopppqqrrsstuuvwxxyz{|}~~}|{zzyxwvvuttssrrqqqppppppppppqqqrrrsttuvvwxyyz{|}~~~}|{zzyxwwvuuttssrrrrqqqqqqqqqqrrrsssttuvvwxxyz{{|}~~~}|{zzyxxwvvuuttsssrrrrrrqrrrrrrsssttuuvwwxxyz{{|}~~~}}|{zzyxxwvvuuutttsssssrrrrssssstttuuvvwwxxyzz{||}~~}}|{zzyyxwwvvuuuttttsssssssssstttuuuvvwwxxyzz{||}~~~~}||{zzyyxxwwvvvuuuttttttttttttuuuuvvwwwxxyzz{{|}}~~~}||{{zyyxxwwwvvvuuuuuttttttuuuuuvvvwwxxyyzz{{||}~~~ytrruy}~zwtsrsux|}{ywuttsssrrsssssstuvxz|{wusstw{~zwutssstuwxz|}}~~}|{ywvuttssstuvxz|~~|ywutsstvx{}}{yxwvuttttsssssssssssssssttttuuvwwxy{|}~~}|zxwvuttttuvwy{}~}}|{{zzzyyyxyyyyyyyyzzz{{{||}}~~~}||{zyxwvvuutttuuvvwyz{}~~~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuuuuvvwwxyzz|}~~~~~~}}}||||{{{zzzyyxxxwwwvvvvvuuuvvvvwwxxyyz{|}}~~~~}}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvwwwxxyyzz{{|}}~~~~}}}|||{{zzzzyyyxxxxwwwwwwwwvwwwwwwwxxxyyyzz{||}}~~~~}}}||{{{zzzzyyyxxxxxwwwwwwwwwwwwwxxxyyyzzz{{||}}~~~~}}}|||{{{zzzyyyyxxxxxxxwwwwwwxxxxxxyyyyzz{{{||}}~~~~}}}|||{{{zzzyyyyyxxxxxxxxxxxxxxxxyyyzzzz{{{||}}~~~~~~}}|||{{{zzzzyyyyyyxxxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~}}}|||{{{{zzzzyyyyyyyyyyyyyyyyyyyyzzz{{{{|||}}}~~~~~}}}|||{{{{zzzzzzyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}||||{{{{zzzzzzzyyyyyyyyyyyzzzzz{{{{{|||}}}}~~~~~~}}}}|||{{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{|||}}}}~~~~~~}}}}||||{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}||||{{{{{{{{zzzzzzzzzzzz{{{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{{{{zzzzzzz{{{{{{{{|||||}}}}}~~~|oe_`fox}rkda_afmvxtojgdbba``````aabdgimqvulea`djt~|skfca`adfinrvyz}}zyvtpligdcaaacehmqv|}vqkfcbbdgmszzuqmkifedccbbbbbbbbbbbbbbbccddefhjlnpsvx{~}yvrnkhfdccdfhkotx}~|zxwusrqqpoonooooooppqrrstuvwxz{|}~|zxvtromkjhgeedeefhilnqux{~~~}}|||||||||}}}}~~~~~~}}|{zzyxvutsrpomlkjihggffffgghjkmoqsvx{}~~~}}}||{{zzyyxwwvutssrqponmllkjiihhggggghhijklmoqrtvxz|~~~}||{zzyxwwvuttsrqpponmmlkkjjiihhhhhhijjkklmnoqrtuwxz|}~}|{{zyxwvvutsrrqpponnmllkkjjjjjjjjjjkkllmnopqrstvwxz{}~~}}|{zyxwvvutsrqqpoonnmlllkkkkjjjkkkkllmnnopqrstuvwxz{|}~}|{zyxxwvutssrqqpoonnmmmllllllllllmmmnoopqqrstuvwxyz|}~~}|{zyxwwvutssrqqpoonnnmmmmmmmmmmmmnnoopqqrsttuvwxyz{|}~~}|{zzyxwvuttsrrqqppooonnnnnnnnnnnoooppqqrsstuvwwxyz{|}~~}|{zyyxwvuutssrqqqppooooonnnnoooopppqqrssttuvwwxyz{|}}~~~}|{zyyxwvuuttsrrrqqqppppoooopppppqqqrrsstuuvwwxyzz{|}~~}}|{zyyxwvvuutssrrrqqqqppppppppqqqqrrrsttuuvwwxyyz{|}}~~}||{zyyxwwvuutttssrrrrqqqqqqqqqqrrrsssttuuvwwxyyz{{|}~~~~}|{{zyyxwwvvuuttsssrrrrrrrrrrrrrrsssttuuvvwwxyyzz{|}}~~}}|{{zyyxxwvvuuutttsssssrrrrrrssssstttuuvvwwxxyzz{||}~~~}}|{{zyyxxwwvvuuuttttsssssssssssttttuuvvvwwxxyzz{{|}}~{vrrswz{xusrrtvz~}{ywvtsssrrrrrrrrstuuwxz~}yusrsuy}|xutsrrstuwy{|}~}}|{zxvutssrsstuwy{}|zxutsssuwy|~|zxwvuttssssssssssssssssssstttuuvwxyz{|}~}|zywvuttsttuvxz|~~}}|{zzyyyyxxxxxxxxyyyyzz{{{||}}~~~}}|{zyxwvvuutttttuvwxyz|}~~~~~~~~~~~~~~~~~~~}}}||{{zzyxxwwvvuuuuuuuuuuvwwxyz{|}~~~~~~}}}}}|||{{{zzzyyyxxwwwvvvvuuuuuuuvvvwwxxyyz{|}~~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvvvwwxxxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwvvvvvvvvvvwwwwxxxyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwwwvvwwwwwwwxxxyyyzz{{||}}~~~~~}}}||{{{zzzyyyyxxxxxwwwwwwwwwwwwwxxxxyyyzzz{{||}}}~~~~~}}|||{{{zzzyyyyxxxxxxxwwwwwwwxxxxxxyyyzzz{{{||}}}~~~~}}}|||{{zzzzyyyyyxxxxxxxxxxxxxxxxyyyyzzzz{{{||}}}~~~~~~}}}|||{{{zzzzyyyyyxxxxxxxxxxxxyyyyyzzzz{{{{|||}}~~~~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyyyyyzzzz{{{{|||}}}~~~~~~}}}|||{{{{zzzzzyyyyyyyyyyyyyyyyyzzzzz{{{{|||}}}~~~~~~}}}}|||{{{{zzzzzzzyyyyyyyyyyyyzzzzzz{{{{{|||}}}}~~~~~~}}}}||||{{{{{zzzzzzzzzyyyyzzzzzzzzz{{{{||||}}}}~~~~~~}}}}||||{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{|||||}}}~~~~~~~}}}}|||||{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}}~~~ujb`cku~xohcaadjs||vrmifdcbaa``aaabbdfilpt|zqicabhpzxoiebaadfhlquyz||zxusokifdbbbcegkpuzztnhecbcfkqw~}xsomkhfeddccccccccccccccccddefghjlnprux{}{xtpmjhfdddfhjnrw|~{yxvusrrqppooooooopqqrssuvvxyz{|~~{ywvsqomkihffeeefhiknptwz~~}}}}}}}}}}}}~~~~~~}|{{zyxvutsqpnmlkjihgggggghijkmnpsuxz}~~~}}||{{zzyxxwvuttsrqponmmlkjjiihhhhhhiijklmoqrtvxz|~~}}|{{zyxxwvuutsrqqponnmllkjjjiiiiiiijkklmmnpqrtuwxz|}~}||{zyxwwvutsrrqqponnmmllkkkjjjjjjkkklmmnopqrstvwxz{}~~~}|{zyxwwvutsrrqpponnmmllllkkkkkklllmmnoopqrstuvwxz{|}~}|{zzyxwvuttsrqqppoonnmmmmlllllmmmmnnoopqrrstuvwxy{|}~~}|{zyxxwvuttsrrqppooonnnmmmmmmmnnnooppqrrstuvvwxyz{|~~}|{{zyxwvuutssrrqqppoooonnnnnnooooppqqrrsttuvwxyyz{|}~~}|{zzyxwvvuttsrrqqqpppooooooooopppqqrrsttuvvwxyyz{|}~~}|{zzyxwvvuttsssrrqqqqppppppppqqqqrrssttuvvwxxyz{{|}~~~}|{zzyxwwvvuttssrrrrqqqqqqqqqqqrrrssttuuvvwxxyzz{|}~~~}}|{zzyxxwvvuutttsssrrrrrrrrrrrrrsssttuuvvwxxyzz{||}~~}||{zzyxxwwvvuutttssssrrrrrrrrssssttuuvvwwxxyzz{{|}~~~~}||{zzyxxwwvvuuuttttssssssssssttttuuuvvwwxxyyz{{|}}~~~}||{zzyyxxwwvvuuuuttttttttttttttuuuuvvwwxxyyz{{||}~~|wsrsvz~}yvsrrsvy}|zxvutsssrrrrrrssstuwxz}~zvtrsux|}yvtsrrstuwyz|}}~}|{zywvutsssstuvxz|}{yvtssstvx{~}{yxwvutttssssssssssssssssstttuuvwwxy{|}~~|{yxvuuttttuvxy{}~}||{zzyyyyxxxxxxxyyyyzz{{{||}}~~~}|{zyxxwvuuttttuuvvwyz{}~~~~~~~~~~~~~~~~~~}}}|{{zzyyxxwwvvuuuuuuuuvvvwxyz{|}~~~~~~}}}}}|||{{{zzzyyxxxwwwvvvvuuuuuuvvvwwxxyyz{|}~~~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvwwwxxxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwvvvvvvvwwwwwxxyyyzz{{|}}~~~~}}}|||{{{zzzyyyxxxxwwwwwwwwwwwwwwwwxxxyyyzz{{||}}~~~~~}}|||{{{zzzyyyyxxxxxxwwwwwwwwwwxxxxxyyyzzz{{||}}~~~~~}}}|||{{{zzzyyyyxxxxxxxxxxxxxxxxxxxyyyzzz{{{||}}}~~~~~}}}||{{{zzzzyyyyyxxxxxxxxxxxxxxyyyyyzzz{{{|||}}}~~~~~}}|||{{{{zzzzyyyyyyxxxxxxxxxyyyyyyzzzz{{{|||}}}~~~~~}}}||||{{{zzzzzyyyyyyyyyyyyyyyyyyzzzzz{{{||||}}}~~~~~}}}}|||{{{{zzzzzzyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~~~}}}}|||{{{{{zzzzzzzzyyyyyyyzzzzzzzz{{{{||||}}}~~~~~~~}}}}||||{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{||||}}}}~~~~~~}}}}||||{{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}|||||{{{{{{{zzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~|}pyae\XpwZlchh`zZPUUiwewz}u~dtdu\ehxytfYz}{vriyjnhbvSMPQgqgv~oz`vay_mwel~a}tqhq{ssigudsckdbvUNQXtjqq|vznntup_|orp|g`mifklelfdm`k_htQRR^}d~nx}|saxdjutzwU_ZkUisb^l}\fhak\poPVUfboxzqmX`tc{mMjuNqpOl~ndayoXkbej^xlTY\vvj{yz|kd^MlpjeS{fS{^Svygaf~a_lbkgf~aX[eiznwyl]YPWxhw\gXc{T]{vkfwvXkhendn~^]`tenueZXLhthsYztRxlPm}pijd_mdjlb}pZ_fmrs}xwo^YRSvhs_h\a}YXxzqmztWlgfmfhe`dw}emu~hYWNmqg}s]~vTwoPi}upp`amejnazw^bjkss|u}ws_XP[xcscp\h~X[zyrm}qYmghmghiei~ugnu||{i[WVwfiymgmZ~iRm}xsyzWjigjma~tcgtdl{uzq^[Rmq`tz|fZtyUb|zvta`nfincpdfkmmwtry~~wh]X`z^mtnsjbhUo}|x~rVpgjin_vhlzzdj{s~yua]Vslbx|Գscywr|~d]`emmqvtolc|o||~u^tzJSd[\gw~|m`z\i|{PJU7XZfSlQ>4UlVMix|ui}zvc|fpVo]YTXn}wĩr~|qWSn>FVCKJh`K\y[y\qxt~xOLzjW|TtryUbiaQIJ/J{igc^exz}zΗ]p~pRQhZmCbwO`ShsyavwpDQ`VotXn[vz~sƙy|f~Qq{_l\c}fUMrR7aLi`xhhntqlkcxXjwzdRgeVpNlygaNxZc{qDSO[GEjaY]xfzvgwoub@g`nxȰmn^onOybxSUhhiR[nV:[tos||o`f]FAlpovblk[xzor|ich}aQ|oZWhlFrzr~dxpx_7LMtoo|wpRpp^faxn_nnyhmmZ[c{htx{phqvn>I8[iMxTu\boJ^m}irl}pm{p{zloxsyed~kM?,JtP{zXTjStefwrjntolxlisvvwg{fY91?j]fqsgbmPiZZtltbZfcph}k}zqvvŲlsS=H{ibuwkJzaAqpRfngmiLmutpalywpzrokRLOq|{]RwdQdeOLkvu}gJ_iri\sxuz~q~rzrtscp_}rt^Kei@XtJLugsvTNkgfdZ_{iuqw^xn²өb]|BiNNE?nxe6U\RJZ\esolirYkaQfnalzdh]ZN\cI@F&J<][qmuws}YiwmVbL|_N^gZXTXykbg˛nrtk53-a>3GNtuy~T_bDJpRc^oa~pqimsΏtj^lmo67`aQXyr–eyc{gtaexy{UQauio[@c~~n~ydr=Dcu{PzL}{bfrcvterS[`qb]Oq?eTezvqxk`tl[__nmu|qtnrf}sttd}W^_rvYO^DXMMhlRWihkgus_\hfln٣ncW[FYX._Rr~z;czGjjP`SJpu^rm|d\r{}Y˴f]qRN=@UT\\zWnmtTjszill`dQoMiuommyʗķxixwr^q_MjxqHtKFM:`owqbklciznSYmr{|provhvwr}w`ePef?BdMQnWGVLM\onafw}sup^rs\yk~xloyLgk;gy]a[YIVRYVU_@M_lrbfx{v_6@`RYco~V9kh__mSKlQoSOnXdnuVQ_[tgǛle]_dE?QZ~ŻuvXH|iinOVEWoCkpZ[`tp^^svxةŤv_Wo[Y][se~e~aQxjl~\RFL_S[plYnugipntp}~~||p~twmksozeY|o{c\MWgOQl][]ji_oqjc|wÍmnm`ubprj}iEddw`tggdUzrf`gLOqW}hkizt۶d^Zrttwq[@XWf~Mk|uxg]|lXsxcetvzq\YYyfdpqwoqn>zxF}sn&"*]7ZvCԧq\oSfYfcr~Qh{^XJ4EU?``|~fw\bOSS\icQeyڻݶyl~Hf{ax{tj|r|bneTY7,.JE89 =EbZJw_w˲䱠]q|m}advjHYh?J:/F$;#4ZnUxwZͻƬt[A4N8mpzAn{6mc)MnkmlfQM_\oCeqT\^]qwqѨzb]d]deQ<)0:qw²|x[}a`qxi{`Ktv~ieZGaP_lab¥šÿ~vjtqYadfeiRxrUJo-EW(%6TQ]amq}u||b[m>GsE=kpfjtH_kaw[^kqpltvu୙Քpqa\=Zqe°yc|c`xwhgxmm^{pockvUOiXynnh||ttwaTSb{GP[_AG6H_On{j{rc}d}Ȳ~t`_R}Bic]AMg_hnDapml~wwnxezuy~{se`V^^W@Xi_oglDEj[W~~vzkenzjxh~VkybOQ\Lj`Ymhy_^j~wsfU{wa]{ȖkWXnj`RBEB]boa~dwsMCP_nOIZMq]M9chgu}fUor|Ʊ~zspgzu{mc~aŷhlwd^]o|{sMVQi_Y@fwimuh^piz}q{myp`T\\]yjLomwrwns|}luRjty~Xhdz]dvqx{g`\ysff}utqUy{r}qbj^o\B@Rcr]TT_ztmRwzqzbpnwt~ytztnfot`Yjsxv`qgtkQenxzjeepec}hWYj~oj}u\up_cZezwzo\iispqZxkllqghrŤus`duqleYXXxxi{zkqfsYVdnPh`auslMkiltlbWpsS|~rr˷yyvjkqWy~uxe]_cinh|ilLdnfeZYTg~ev{ɣ~wsqx^|uh_fT~~tr|fP`zbUa]|ih?Ka_camatm||ewq^r}usnu[vpi}jWXhveVZIj^gFMqivwqswr{~umqzx{s|kz~iVV`deLASHvxqrh|h]dzwg{{rl{n{zn~|az~yq|bHJ\fl]P[Z~qrmrpzmhiy{t||z|sesx~vlverfYfwxtr|}kuka~ph]r}rvzjnu||n[^Nsttg~}{t]Z}w^rd\[usu~q|noysqmzz{zmvvk\YEr~ysbrx|~s~~tzvwehxzqsyb}kazjajztp}izzon|xrl`Rv|pvyrshwdozMcmjlyh^}yai}j_lxuyrztc\NTzk}sozxfy\uz^ttwslygn}slwyvrhhy_WZkg_VXBXuozvxtzebv~m}u}zqsyxwecu]`ltokdSu~yehsuwiaiSurvXfgnr}cwvfwqpkuvw|oyjt}yk|zv}}lnwfyzaqvzy}h}os}ogesxlm{nulfoxcmwyjaQtqx~{wuqwgjyttxwqq~}nm|wy{~wmiZvk|yvnynqwtgflVvu[jrtty[u}uji}qhcr{xmuwtmawu|}ro}c}elqxy}]xxm`ne`at|uh{ulicivth[[R`zqz~z}xth{npxjsz|o}rs~mt]bqvib^V_z}v~zvw|twxxm`jYayqnbfkmvaauwjz|uvuh^gs}vnecfx~xjrlfvvbjt|n`}x{~{}sy}ou`n~WX]kje\VQt~q~|rson]{}ut~ot}|}wej\`gic]XUi|x~wupw|tuof_i[iywzpxrz}}~p}{h|Y^fqmhbcmu~{lsslxi|zuwxpl}q|ft_a|VMR`e`VX]|v~||~p{|rqr|pzn]iRR_faYUUm}}z{sptqy{vyew|ayyy~~i{x}v~}\zXU[b`^[]r}y}nx|{fnw||}w{cmrnymkvRjnHEJUWWTT`}~tuuwry}t~nixVixRLPWWUSVcu{qqfiy}|omw||}~pt}r~qk}`l~VNS^aa]^ozwnlnewyy}}}~yzebpguwi^pU]wSJKV]_[\hy~~tpun~kmzr}zmf{]g|[UV^`a_ans~wvig{{x~pkvz{xz~hkup~omfu`]aihfbduywjmnnp{~uwvxuvaiqky{ki|^t|WSV^^][_p|ykwjxs||{}~xev{wpv}_~vXY]b`\X\t}~|ufy|{~cp{xy{yi{{|k{xcnWWY\[ZX]x|sg|}xb~tzxyxn~yzjnebVXZYXVXd~}wlg{}wfzx}tn~zse|lg^TW\]ZVXd|{}xmj~wl}~to|w}se{gj`WW\[WRTb~{}}~wkkxpnl{x}~qg~gl]UUXWTPScyz~ylj}pohwv}qd|ge~[RSXWVSVb|{x~spo}{rjxw{}o`wh`_TVZWRPTb{{vvsny~z}rhuuw{o_un`aQTXYTPP\v~v~yqlt}|~sdost{~talrY{kRSSUROOZrv}|rn}t|{|welvu{|tdfxYpqQQRVSPNVkwz~qwwtw{yx||ifqry~td\v]exUPQUTQPUf~tslw|xw{|ndoqrx|ujXmkWx`ORUVSPUe~vol}pzxx|~sagppv{xn]`uWopPRU[ZWV`v|qwxpw~yww{~wfbnorxyqdXsa`|\UW[[ZY_p~qpiw|vsw|yj`korwysiZro\}dUY\^[Y]lsn~kousv{|oahoryzo]jw[ynUY[^[Z[h~wo{nwnvstz}tfjstx}{rabz\quVYZ]ZXYd{~vmwrspwutyxghrux}{ra`z^mvUVX]\ZXavxmtuqrxwx}zihrux|{rb\w^hyXWX[ZXYbvxmsyow|yx}{jgqtvyypb[wadwWVY][YYasxnt}tx}zx}yhfosvzyo_Yv_gwWWY\ZWW`sxow{ww|yx}wggqstxwo_]w]itTUWZXVWau~xp{zyv|xw{udeosvywn]^vZkqRUX[YWW`t|ztusywx}qdhpsuxsiXcsWsjRWWYVUXdy{{zwqvxuw|}ncjpsuwqgWloYv`QWYYUTWfzz|yzqxxuy}yibkqtvwocUpg]xZSVXWTSYi|y{y{p}|}wtx}whclqstunbVrd^vWRVXWTSZj}z~x|rz~{vsw}vfakqsvum`Vsa`uVSVYWTSZk~{~x}rwzvsx}ufbkprttk^Wt`buUTVYVTU^o|x}qy~{urv{ueaiorttl_Vrc_uWUY\[XW^n|y|qzy{urvzufaiorttlaUpg_y\VZ]\YX^n|}x{n}x|uqtyvgahnqstneWpl]y`V[]]ZY]l~|}yyoruqswyj`ensuwqhXit[whV\]^[Y\hz}{{xs|ovrrv|}pdfnsuwtk\ax]ppV[\^[Z[fv|}wyurxsqv|tfemsuwum`[wbfvXY\_]ZYaq}~wzo|w~wsvzykdiptuvoeVmn[xbU[]][Z^l}~}ywrsytuy~pdfmrturiZ`vZmnTZ\_\[\fw~}v}uw|vtw|tfbipttsj^Vrd`vYW\_][[cr~~wzrywsvzwibgmqrrlbUkkZu_U[^_\\ao~z{tuxstxyjadkprsmdUcqWqgT[]_\[^j{~~{x}sytsv|{nbbioqqneW[sYjmSY\_]\^hx~{{ztysquz{naahmpqnfYYsZfnTY\_]\]gv{~wtytquy|ob`gmppneYVr]cqTW[_]\]fu{tvztptx|pc_eknonfZUp^`qVW\_^]^fu|uuysptx{ma_eloomeYVq]bpUX\`^]^gw{}vtxspsxzma_floomeXWr[eoTY\`_^`jx|{xswqosxyl`_flopmeWZrZhnU[_b`_ajz|v}pvqptywi_agmopkcUarYqiU]_b__bm|~~rsupqt{tg_cioqqlcVjn[ubW^`a_^co~~~q}w|tprv}~re`emrrrkaVph_v]Y^a`^^dq}}}rzz{tprv~sfbgmrsrk`Wrg`u[Y^a`^^dq}|}sx|{tqtxrfbhnssrk_XsdbuZZ^a_]]cp|{~tw{vruy~qfchossrj^YtcdtXY]`^\]dq{{~uz}vsuysfchnrsrk`Xre`tZX]`_]]co}{{~~u}}wsuysgcgnrsrj`Vpg^t[X]`_]\bn|{z}u{xsuxthbflqrqjaVmj[t]V\__]\alz{z}vvxstw}viadjpqqlcVepYqdU\^`]\_iw|z|ztztsu{xkbbhnpqmeX^sZjkTZ]`^]^gt~{|zvztqtxzncaflppng[Wq_bpWY]`_]^dq||t~y~vqsv|}re`cinooh`ThjYr_V\_`^^bm{}wswrqtyvi``eknokcW\qYikT[^b`_aiwvvzsprv}yla^bimnmf[Tnb^rYY^ba`agtr}w}toptz{oc^aglmmg_SiiZr_W^bdbcgrtruppsx~}re^_ekmniaUboXogW_beccfp~x{qvqoqv}~th_^djmnkdX\s\jnX^bfdden{zoourzukmszvy~onkfZQLOZiv~ŭ~sgbfovywtpquxgc|jmYNLMOSWYYaxvusncZSU^hprqlkpw}|uv||wqpruf]xgtzz{|{pltumpv{{{~q|wlryf^XY[bed\OECGNQRQJ?=UDIV?CHMMNQZiy~xohggjkh^QFELTZ_a_Y]yjvov{}}}~tqvttq{wux}tkjotxyvncg|eqw_adfcbahr}yqmklms~vs}pgfimnniaVbnWkgU[^`__bly~}etravmb\[^chjf\RMPV]ac`[Tjo`zmelqttv{xzxstv{xma\^cffe^UNdZQePJNPOMMR\hpspjfehkpyzxtvz}}{tke{pi|fbehfefku~}}xy~ncxefvjc_`djnnh^URV\acc^WXpcbwcafjllow~}ytuw{}{sg\XZ^``]ULLaPP`JGILKKLR]hqsqliimpwxtvz}}{tliqmjegjihhmw~}wxpcyigxmfbcglppkaXUX]bdd_YWne_ud_chijls~}|ztsuy{zsh]WX[]][UMJ^WJ`RGJLNMNS]irwvronpsyyssvy{zungw{h|vfhjkjjmuyw|zfpxbswlgehlqsph_XW[`ceb]Wbq]lr`beijkoxyxstvyzwodZVX[]]ZTLOcQSbNKMPQQSZdpx{yurruxvqruxyxslhzxi~sfiklkloxxw|zgrxctxojikosurjaZY]adeb]Xer^ltcbfikmpy~z|yttuxywoe[WWZ\\ZTMPcURdUNPSTUW]gs{~~zwwy|}tooruvtoigztg|rfgjkklpyyx~xhxwfyypkkmptuqi`ZZ^bdea\Yio]pqbdgjkns||u}wstuxxtlaYWX[\\XRMWcO[cQPSVVX[cnx~{yy|wolmprroidn{go{jfgijkmt~}z}~npkp}uplmpsusld\Z\_bca]Yaqafufbehjlpx~z{yttuwxund[WWZ[[YSNTeTUfWQSVWY\cmw}{{}vnjknppnhcjyhlzjefiijms|}oqlq}vpmnptusld\Z\_bca\Xbp_ftdadhikowyv|{wxy||yria^`bdca\Ydo\fpa]_bceipzxtzwxz||xpga_acdd`[ZhlZjm_^_bcejr|xtyxy{}|wof``addc_[[lh[nj^^`bdis~{ww|{wpllnqrpkhgjnqroibcqcZk_UTUVWZ_hqy||zwx{~{sooppnib[XZ^bbb^[aqd`rg_^_``bgnv|~}zwwy}xpjihge`YTXeUTe[UW\aekt~qrpo}zurrtwyxslecdgijieckyjk{piikmnqw{qicbccb`[W]j\Zk`WWY[\_enw~~zzyyzzwpg_ZYYZZXTQVeZVhbYZ^adhox{v{zz|}|vogbbcddc_\aof]oj_]_`adipy~}~}zrmkkllkgcerpaprfbcefhls|upx{vsrstsoh`ZWXYZZWTTagVal`\]`cfkr|}~}|}~}zskd``aba_ZXal\]lbZZ[]^agow~}|{}|~wokijlljgdgundushfgijmqy}r~mv}ytrqrsrng`ZXXZ[ZXUWdhYcnc_`behmt}~|}{{|{xrjc_^^_^\YW_j]Zkd[Z\]_chpy~y{tmhghiihechumdutjgiklot|yr|lw|xsqqrrqmf_ZXY[[[XVZhgYhncabegkpx~y~~{zz{yunga^]^^^[XXdhYala\\^`cgmu}{z|~|voiffghgebdouekxpiikmosy}syqp{zvrrrsrojc]ZZ[\\ZXYdl^apiccegkou~}z|zzzyvpib^]^^^\YYbj\]lf^]_acgmt|||z~}~~|voiffgggeccmugjwpjijlorx~tzrq|{wtsstspkd^[[\]][YZek]cphcbegjnu}~{|}|{{zvpic_^__^[Y[fiZald^]_adhnv}|y~~~ztniffggfdbfqpcoulhhiknsy{vpy|xvuuusoic^\\]]\ZY_kd[jmdabdgjowz}}}|ytmfb```_][Zak`[jh_]^_aejqx~z|wqkgffgfebbjsgesphfgiknszy}zs}|ywwwvsnhb^]]]][Y[dk_^mjbabdfjpw|~}}|xslfb```_][\dj]]kg_]^`bekry~{~{wpkgeefecabkqecqnfcdegkpv}x~||{{xsmgcaaa`_]]emb^mldabdfinu|x~|{{{xsmgcaaa`_]]emd^kmfbbdfinu|x~}|{{xtnhca```_]]blg]hngcbdfint{~y{}{{zyuoida```_]]`jj^eoidcdfimsz}{y}{{zyupjeb```_^]_hl`bolecdfhlrx~w}{zzyvrlfb````_]^dmf^kohddfhlpv}}wz~|zzywsnhda``__]]bkj_fpkfefhkou||{v|zyywtpjeb```_^]_hmbannhffhkntz}u}|zyyxuqkfb```_^]^eme_lpiffhjnsy~}vz}zyyxvrlgc```_^]^cli_iqkgfhjmrx~|wx}{yxxvrnhca``__^]bkk`fplgfhjmqw}|yw~~{zyxvsnida`__^]]bkk`dpnhghjmqv}|zv~~{zyxvsnida`___^]ajlaconighjmqv||{v}~{zyxvsoida`___^]`ilbbonighjlpu||{v~~{zyxvsnida`___^]ailaconhghjlpv|}{w~~{zyxvsnida`___^]ajk`domhfgilpu|}zw~~|zyxvsnida`__^]^bkj`domhggjmqv|~yy~|zyxvrmhda``_^]^dlh_gokgfgjmqw}x{~|zyxuqlgca``_^]_fle_iojffgjmqw}x}~|zyxuqlgca``_^^`glc`kniffgjmrx}x~~|zyxupkgca``_^^`hlb`lmhffhjnrx~x~~|{zxupkgcaa`_^^aikaalmiffhjnrx}y~|{zxtpkgcba`_^^bikaalmhffhjnrx}y~~|{zxuqlgdba`__^bikbalmiffhjmrw}y~~|{zxuqlhdba``__ahlc`kniffgjmqw|y}}{zxuqmhdba``__ahld`jnjgfhjmqv|z{}{zxvrmieba``__`flf_gnkhghjmqu{{z}{zxvsnjfcaa`__`dki`enmighilpuz}y~}{zyvsokfcaa`___cjjabmnjghiloty~x|~{zxwtplgdba`___agle`iokhhiknsx}zy~~|zywuqmieba`__^`ekh`ennjiiknrw|}w{~|zxwurnjfca`__^_cikcblolijknqv{wz~~|zxwurojfca`__^_bhleajpmjjkmquzxx}~|zxwusokgda`__^^aflg`honkjkmpty~yw|~|zxwusplhdb``__^`ekiaeooljkmptx}~zv{}|zywusplhdb``__^`ekiaenolkkmptx}~{vz}|zxwuspmieb``___`djjbdmpmkkmpsx}~|vz}|zywusqmieba`___`djjccmpmkkmpsx}~|vz}}{ywvsqmieba`___`djjbdmomkkmpsx||w{}}{ywvsqmieba`___`ekjbdnolkkmosw||w{}}{ywvspmieca``__afkiaenolkkmpsx}{x|~}{ywvsplheca``__bgkgagnnkjkmptx}zy}~}{yxvsplheca``_`chkeahnmjjkmptx}y{~}{yxvsokhecaa```cijcajnljikmptx}z|}{yxvsokhecaa```dijcbjnliikmptx}z|}{zxvsokhecaa``aejibbjnljikmptx}z|}{zxvsokhecba``aejibbjmkiikmptx}z|~|zxvsokhecba``adiibajmliijmpsx|z|~|zxvsplhecba``adijcaimljijlosw|{|~|zxvsplhecba``adijcahmljjkmosw{{z~~|zxvtpmifcba```chje`fmmkjklorw{}z}~~|zxvtqmjfdba```bgjgadlnkjklorvz~y|~~|zxvtqnjgdba```aejibcknlkklnquz~zz}}|zxvtrokhecaa``adhjeahnnlklnquy}{x{}|zxwurolifcba```cgjgbemomlmnqtx|~xy||zxwuspmifdba```bejicckonmmnpsw{xx{|zywuspmjgdba```adijebioommnpsw{ywz{zywusqnkgeca```adhkgbgnonmnpsvz~{wy{zywusqnkhecaa``acgkhcfmpnnnprvy~|wxzzywusqokhecba``acgkhcemponnprvy}|wxzzywutqolifcba``acgjicelponnpruy}}wxzzywvtrolifdba``abfjiddlponnpruy}}wx{{yxvtrolifdba``acfjiceloonnoruy}}xy{{yxvtrolifdbaa`acgjhcelonmnorux|}xy{{yxvtrolifdbaa`acgjhcelos~|pgbaeozwg][\^bhow|voha]]ZQJKPRPOOPSWZ_cglqu{{vuyneb`][[\\]^_``_acdffhlmgceihda^\\]^`cfilpv}zqh`YSLHFHLNMQ^jqv|~y{{yyz{{zyxwwwwwvusqmjjmplfhlopqrstttssrsstuwy}||~|||||}~{vpje`]ZWVUUX[YSRY]]\\^adhlpuy|zxxvsokfb]YTPLJHHHILQWXVYcjnptx}yy{{zywvtqoligedcbbdgjhbbgkjhghijloqsuvvwxy{||yv{~}~~zxvtrqqsvtnlquusrstvy||wuvwqighhfda_]ZWTRPONOOQTX]^[\cjmopsw{~|zwtqnjgca_]\[[]__ZWZ_`^]]^`bdgjmoqrtvy{}|z{}{yxwvvwz{xsuz|{zzz|~}yuqqtrkeeggedb`^\ZXVTTTTUVY^ba^`hmopqtw{}{xurokhda^\ZYXY[]\WUY]^]\]^`cfiloqtvxz}|zxwvutuwz{xtu{}}||}~~|xtqpsrlfeggfedba_][YXWWWXZ\addabioqrsuy|}}}{yvspmifb_][YXXY[]\XUZ^`___acfilpsuxz|~{ywutssstvyzvsv{}}||}~{wtqrtrkggiihfedb`^\[ZYYYZ\_dfebelqrstwz}}||{yvtqnkgda^\ZYXXZ\^[WX]aa`abdgjmqtwy{~~|zxvtsrqqrtwxvrsx|||||~}zvssuuoihjjihgedb`^\[ZZZ[]_cffcdkprrtvy|}||{ywtrokheb_][ZYZ[]_]XY^bbbbcehknquwz|~}{yvtsqqpppruwuqrwz{zz{|{xvvxvpkkllkjhgeca_]\[[[\^`dfebekoqqsux{~}}|zwurolheb`^\[[[]__\Y[`ccccdfilosvx{}~|ywusqpoooprutqorwyxxyz|~}zyz{vpnnonmkjhfda_^]\\\]_beebbglnopqtwz~~~|zxurolieca_]]\]_a_[Z^bcccdfhjmqtvy{}~|zxvsrponnnnopmihlpqppqrtwz}|{{{zywurpmkhfedcccegigcdhlmmnoqsvy||{{{zywuspnkigedcccegigcchlmmnopsvy|{tmheefgilnopppqrrqljnqrttuxz}{||wqnnnnljhgedbaaacehknrutolmljgdbcglrzzusrpnkifdba`__`acfimqrporwzzzz{|~|xsojfb_\[ZZ[]]ZWY^abbcdfhknqtwy|~}zwspmjgdba``aa]YY]acdegkoty~~{usttsrqomljhfedcccdfhkkhgkprsstvy{~~|zxvsqomlkjklmmjgimpqqqrtvy{~}wuutsqnligda_\[YYXY[]_^[\afhjknptx|}zzzywusqoljhfdcbbcdfhgdcfkmmnoprtwz|~||}}|{zxwusqonmllmnprromotwwwxy{~~~~|vqpoomljgeca_][ZZYZ[^`b`^afjlmoqtwz~}{{zywusqnligedcbbcdfgdbcgjlllnortwy|~{z{{zyxwusrpnmlkklmnqrpmnsvxxyz|~}}~|wqooonljhfdb`^]\[[\]_acb`afjmnoqsvz}~||{zxvtqoljhfdcbbbdffdbbfjkklmoqsvy{~{zz{zywvtrqomlkjjjkmopolnruwxxz{~~~}wrqppomkigeca`^]]\]^`ccb`bgkmnoqsvy}}}|zyvtromjhfdcccceffcacgjjkkmoqsvy{~~{{{{zxwusqpnlkjjjjkmonlknruvvwy{}|vsssrpnljhfdb`_^^^^`bcc``dhklmnpsvy|~~}{yvtroljhfedccdffebaehjjjkmoqtvy{~~|||{zxwusqomlkjiijkmnmjjnrstuvxz||wuttsqomkigeca`____acdb`aehjlmnpsux|~}{ywtromjhfedddeffebbehjjklmoqtvy{~|||{zxwusqomljiiiiklmljimprstuwx{}~yvuutrpnljhfdba`__`acdcaadhjlmnprux{~~}|{ywtrpmkigeddddfffcbdgjkklmoqsvy{~}{{{zxwusqomljiihiikllkijnqsttvxz||wuutsqomkigecba```abdecabfjlmnprtwz}~{zyxvusqomjhgeddddeghgedgknopqruwz|~zxxwvtsqomkigfedddefhhfefjmopqstwy|{xwwvtsqomkigfeddddfghgefilopqrtvy{~{xwwvtsqomkihfeddddeghhfehlopqrtvy{~|xwvvtsqomljhfeddddeghhfegknpqrtvx{~}ywvvusqonljhfeddddefhhgegknpqrtvx{}}ywvvusqpnljhgeddddefhhgegjnpqrtvxz}~ywvvusqpnljhgeedddefhhgfgjmpqrtuxz}~zwvvusrpnljhgfedddefhhgffjmpqrtuxz}~zwwvusrpnljigfedddefhhgefjmoqrsuwz}~zxwvutrpnljigfedddefhhgefjmoprsuwz|~zxwvutrpnljigfedddefhhfefjmoprsuwz|~zxwwutrpnljigfedddeghgfegjmopqsuwy|~zyxwvtrpnljigfeddefghgeegjmopqsuwy|~{yxwvtrpnljigfeddefggfeegkmnoqrtwy|~~{yyxvtrpnljigfeddefggfeegkmnoqrtwy|~~{zyxvtrpomkigfeeeefggfdegkmnoqrtvy{~~{zyxvtsqomkigfeeeefggfdegkmnoprtvy{~~{zyxvusqomkigfeeeeffhdp|zyxxxxxy{|}~~}yyzxvxxtqmjlpw}|{yxtokhfdcccdfhlotx|}ywtqonmmmljkov|sy|}|xtqmjhfdccdefhknrx~}{yxuqqruxz}|su||~{xtqnkhfedccdfjotxz|~~|upr~~|}~~}|zxvtqomkigedcceghhhjnrw{{uppv~{yzz{|||||{ywtqnkihhhfddfimquy|{vpjgiq}}{yxwusrpnllllkgeeefhhijlmopqtvy}{vsrqonpv~~}}|||}}|ytqonlkiihijlnqtx|}ysmhedgmu}ywvtqmkjjjjjiiihhhhhijklnqrsstw|~{yvspnlmpu|}||}~~}{xurnkigghjnqtvy}|vpjfcdiqz~zvsqnlkihgggggghjkkjijlopqrrtuwy{~~~~~|zxuqoopu}}|{{{{|}}}}|{xuqkhhjmquz|vpkhghmv|vqnkihhhhhfddfhijjkkmnoprstuvwwxxxy{zwvuvz~{wusrrrsrrtx}|wrmjjmsy~xrlhhltztnjhhiihhgggghhijklnopqrrstwyzyyw{|zzz|~}xupjfc`]]\\]`cgmrx|~|yusv||urquule`]\\]_acfilnqsvxy{|}~~}}}|{zyz|u{~wz~yvtstuwyyxvroligfgijmpty~}yy|yskc\YZ`kxzvssstuwxyz{{{zzyyyyyz{|~yoil{{snnquy}~{xtqnkiijmqv{~~|z|wqou~}|zxtpkfa`cly~}}|{{{{{|}}}}{xsokjlr|}wtsuzyrnlnqux{}~~~|{zyxxxz}yoheehmt|~|zzz{|~{vrpsz}|zwtplgb^[[_foy}yvspnkjiilpw}{uqpquz|zwusrqqqrrsuy}{xusrqqrstuwy{}}zz}xsmhc_]_ciqx|~}zwsqnmlllmmmnnmmlkjjjmrx|{}~wqjecdipyyogcdhmruwvutsrrrrsuwy|{xy~|smkmqw}~ytojgdba`aabdegijlmopqrrrrrstvz|zwutsux}|xusstuvvtoic_`djpuyz{{zz{{}~xog`]`ivztokhfdca``____`abdfhkmpruwz|}~~xsommqw{vrnkihgghjmpsvwuqlgegmt{~yuromkhgedbaaaaacfgimoqvzz}}xxxx||qfcabglt{zvqmjhgffefffgikmoruy|yrnoty||}ung`[XY]fr~}{ywusqpoppqrux|xx{tuwyz{{|{|~~{uniginty}~|zyxwxy{}~|{||}vjr~~|zwspligfhkpw~~zxx|xmehw}rkhhjlnoprrrqomjfa]YVUV[cn{umkrxttux{|{xsmhfhkortsqnkhgginu}}tja[\fx{tolkjjjiihhgffeeeeeeeeffgikot{|wpkgglu|zywvtsrqpooopqrux{~~{uojhjpv~{upnou~}wpkfccflt}}yvtsrsstttutttsrqqqruy~xrnjijmrw}}zxvtsrqpppppqrsuvxz|~|tlgfjq{~{yxvvuuuuuuvvvvvtsqooqv~|{zz{~xqkgfipyzsmihilptusojfddgjnrvy{}zqkkq{}wrnljiijklnprtvxz|}xurpnlklot{{uokhedccccccccbbbbcfjow~~ytnifdflu}wpha]\^bgknpqqqqqrtvx{~zpe\VUZet}wrmifca_^]]]]^_acfhknqsvy{}ytu{xphc^\\[VRUY_k|}wrqsxzqid_[YWWVX]ix}qdYPKMU`my}unf`]ZYXY[\`dinqu{~xs^WWY\_bdfhlrx~zvw|~}~}ric]ZUMEBFMSUWWWZ\\[YWVX]dlty}z}wrmg_UI>746;CLV`irz{pbUPVduzvtromkigeb_]^djielx||yrlhc`\YVSQRW_goz~zvqlfa\Z[_foy|xtqnnquztja[YYZ\^^]ZWRLGEJSQN[ffir||}|y}~}ytojhfeeffffeca`^^`chmsx|yuuwyvmnujhojefjqx}~ytokiijnsx}~wmc\WV\gtsq|vknlf_YUSRQQRTUVVUTTSSUY`iqy~|||~{ywuttux{~~yqsuhonjv{vqmjhhkqx}zxwxyyzyxvtqnkhjt||z{~~}~}vojfc`_^_chnty}}|{zxurnieb_][[\^aa[Xe`glhtz{yxxz|wttw{~|umcZTPPRW\`dfilosuxyyxvtqmjjqshpjojdklonpprtvvuqmjilrz}yvuuvrfppu|~{{~{xvuvwyt|~{wsnid_[WTQOMLNQYbmx~{yyz|~~||{{tnjfdcbceip|vvzxvzypnkkjjkmorstrqoorw}~wpkkpx}{y{~}}zwxz}yrlgeehknonlkkmpsutqke`]\]`bdedeiqkjomrwqqsuvxz}}xqkhhlqvxwuqnlkkmosx~zt|vwvu}{zz{|}|zvpib^]_dimpsv{~|}xqnvopvw~ytoic]ZY_Z`rz~wohc`adgjjgdaaeltz}}|{}yrlikqy~wspnlkifc^[Ygikqsukjiiijlotz}~{urqsuvtqlhfdefilqx~|{~{wwzurorw~zqjggknppnmnrw{{xrjc_]]^`accc`^Yagbfgjdjpv|}yvuz~{qifhntyzwrpqu{~|yvux}xw}{}~xpkhjov||zz~zvttvxy{{{zxss|}~~}ytokhea`alqmuxx~|zxtokhhkqwzxqha^bkt{~}{z|{urswyzzz}ytssuvvvutrogeoklnilrstsrppqu{ytpmmlmmmlnrysnlmquwupljmt{zsmknvyspsz}xwy~{vsnj`]fbffeouy|~~snpw|zywwwuvyvmgddeea]\_guzwvvx}uxxxxopqqqrty~}ywz~zy~~}zvqmjjiibgrqyxzxz~}vqpsx~{wtstuxz|}~~wsqszzwx{~~|zz{~|ywuvwxvpib_agpxzyvtvz}vngefinswy{|~zr}|~~~vpkigfeecccrvu}{~wtw|{vsuz}|{{~}zyxxwwxz}~}yrlhiow~|xqhronqkqvwxwvtssu{}vpmjiiihjq~wrqsx{|ytnmpw~~zxy~ytrpnllmnnlga[X[bny{xzxz~|vpjgeefiknr}{smihkpstpjedhovzyvrprw}}|z{{~~zx{{z{|~~~}yumwzvz{wtz{}|{yxy|}vsuy~~wpkkoty|{wrnkhhghgjn}|}ywy}}xx}}~}~zrlknt||{~ztqpqrsttspmfiunqqummrsttsstv{zwx}~zvtsrsw}yx{ztprw}ytrsw|~u|{{||}|xrlebciqx|}{z{}|~|yt}yz|}}|{{}xrmjggfimyzs~~|vqnnrvyytnhehmsxxuplkmry}wqoqw~|ytpo|ususxmmnprstvz~{|{ursw{~}{vqlhecddiozvs~}yxy}~wrpry|unifhmu{~}zxx}}wrpooonljfdfunnsq|uqtvxyz|}~~{{|xussty}~|xvw{~ytru{~zy{xw{}}w}{{|||zvpjecejry}}{xx|}ywwxyzzzxx||z{~ytpmmmpu{so{y}z{}yurrtx~{uqqtz{vtuy~{{uollpw~~~}zz|z}{wvuvvxz}zvux}ztppsvz{zxtplihhkputjw||{xz~}~}ytmgbadjqy}~}{{~{wutrqonpxrvyvv}vutuwz}}z{~xuux|}zwustv|~~~ztruzzvuvy}{vs{yzzrs~||yywvtplhdcekt}~|zyxxwy}z~{|xspqux|}}|zxwwx{u}yvtuw{|vqnosz|xuuvy}}yu{}t}xtqru|~{yxwvw{v~|~y}|xyy{}yspptz}wroorvz}~}{ywvwy}s~}|}|xwz{yxy|~|xu{z||xrnjjmsz}zxwvvv|u}|}zz~zzz|~{xy}|wuux{~~|{z{|~|q}|{|~~xsqsx{vtsux{~|{~~w}yupkhhkqy~{ywvvw}q|zzzu||zurrux{}}}{{z{|~{xp}{{|{uqprx~~{yyz}~|}||zt}}zvrmighkrz|zxxx|}px~|w|z{~~xsqqswy{||{{{{||xrp~}{z{}{vstx|{{}}yz}zuu{~}{xtnjggint{~|}}|{|~x}{{|yx{{uqpqtwy{|{{zzzzwqlxw~~~}}}zxz~|zyyz|}}}zwx~v{~rtw{||zwsokgefiou|}zxzww~yww{ztpopsvxzzzzyyxwqkj}}uz~ywy}{xwwxyyyxxwyvyrrtxxxvsplhecehnu{~|yy|w}u|xvw{xromnqsvwxxxwwvsnjm|y}|xvx|{xwvwwxxwvvzuw|soptuuspmjfddfjpw~~~~v{v{{wuvy~~xrmkkmortvwxxxvtomtz}xvw{}ywvvvvvuuuyryvvnnqrssqoljhhjnt{~vw|v~yussv{zupmmnqtvxzzzzxuqmrw~~yvvx}~zwuttttsstws|rtpqstusqoljijmrx~}}v~wvw~zvssuz|vrpoqruwxxxxwtplnz|{{wuvz|yvttstttux~uwupqrsrpnkihhkot{}}zvtsw{xwwz~ztpmmnprsuuuusqmlrx~~yutvz~{yxwwwxy|x{xxtnmmmmkihgghlqw}~~~uz|w~tz{xwx{|vqmkklnpqrssrpnlo{x~{wuvy|{zyyy{|tqyokkkjihgffgjou{~}~yyx{yzwuux|~wrmjijkmopqqpomkmwv~{yy{}{zyxyz~}r~qw}rljiihgfeegjntz}|}}{{x|}yvttwz~xsnjhhhjklmmlkiimxu~}zy{~~{zyyy{~}q|ssumihggfedefimsy~~}~||{wy~~{wtstvz~}xrmjggghijjjjihinzu|yxz~~{zyyz|xq~qs~tligfeeddegjot{zxww||yusrsvz~|wqligffghiijiiiksw{xx{~|zzz{~rr~mu}sligffeefgjnsy}zx}vx~}zvsrrsw{zuplihhijklllkjkoyy{~}zxy|~|zyyz|zoxvn}{rmjiihhhhjmqv{}}{||{yuy|xurqrtx}{vqmkjjkllmmlkjjpzu}||yxy|~{zyyz|yq}vr|snkjiihhijmqv{}{|~z}z|xuz|yvsstw{|vqnkjjkklllkjijozs}{|ywy|~|{zz{~{r}wr|smkiihgggilpuz|zz}z{{zyuy{xutuw{|vqmjiiijkkkjihimxtyz}yxy|~}||}~rzzo}}smjihgffghknsx~|zz{|zy~wz}yvttuy}}wrmjhhhijjkjihhksys{~|zz|~|||}urptvnjhgffffgilqv{}{zz}|{zy~}zvtssvz~~ysnjhgghijjjihginys{z|{|~|{z{||pvzmy|rkhgfeeeegimrx~}{z||zxy~{wtrqsvz~|vpkhfefghijjihhjq}~s}~{z|}{zyz|xnysm|xnifeddddegjou{}}}}{|wz}yurpprvz~xrmifeefghijjjijnxzz~|zz}}{yyyz}}pp{jt{qjgeeddeegjotz~{yww|~zvspopsx|ztokgfefhiklllkknux}zy{}{yxxy{sm|mo~~umhfffffghkotz~~{zxv{~zvspopsw{|wqligfghjklmmlkmtw~}zyz~}{yxwx{~umzpn~xojggfffghknsy}}{~zxvz~zvspopsx|}xrmigggijklllkklsv}|yyz~}{yxxz|un~opwniggffffhjnsy~||~{ywv{{wtqqruy~|wqliggghjkllkjjlt~u~|yy|~|zzz{~rq~lu~slhgffeefhkotz~|z{~{ywz~{vsqqsw{ztojgffghjkkkjiimxvxz|z{~|zz{|znxul|ypjgffeeefhkpu{|zy{~}x|}yurqqsx|~xsmigffghjjkjihinzs{y}|}}{zzz|wnzrm}xnigfeeeefhkpu{~{yy{|y}|xurpqtx|}wqlifefghijjihginzr|y~|~}{zyz|wmyrl|xnifeedddegkouz~{yy{}x|}xurpprv{}wrmhfeefhijjjihhmxtyy~|}}{yyy{~ymuujyyoifeedddegjotz}{z{~{xz}yurpoqty}~ysnjgeefhijkkjiiluzu|||~~{yxxy|qn~~kp~}skgfeeeefhjnsy~|{{~~|zx}~zvspoorv{{vqlhfffhiklllkjlq|u}{tlilrytdXPJGGKQ[hvysrrsuwy{{{zzzywsmedo~xn|pcYSRV_l{{naXQMLLNPTVX\bm|w{wqlgdcflt~}}ule`_agp{zp~yh`aehijihec_[XTSSUX]adfec^ZVTSTWZ_cgknpru{~xrlfb_^^aeks|}uz}{xvtrsuwz}|xsonnosx}yu}wz|~{z{}~xqkgc`___^\[YVUU\gog]myll{~}{{|~qky}jkzzqjfddddefhkotz}|~ump}{glyob`ejmopppomljhhimrx~}}~}~{xutsrtvz|wj`lsa]kmcZTRPPOOOQSW[ahmqstrponptz}}|vpljiijklllkjijp{|o{ys~{vpkgfhkptxzzyvsqnmllmpsysotvzwvwxyz{}yx{~|xtpkfcaacfjmnnkf`[VRQPQSTVWXXXX[cpxphyuu~}v}zrnlkjihijkosx|~zvsqqsw{~wnkusiy|ngiotwxxxwuspmkkknsx~{wtsstvxz|~~~~~}yurpnnnptvsh\epaXfld[VSSSSSTUX[`flrvyyxusrsuz{uqnmlmmnnnmkiinx}nuzpzzupmlmpty}~|yvsqpppqtx~tlxsp}vrqqrrsuvy}|y|}yuqlhdbbdgkoqqnje`[XVUVXY[\]]]]^dpzwjtzs{~xxronmlkjklnrvz~|xtrqrtx}xpq~rp}plpuy{||{zxuromlmptz~|xtqppqsuwyzzzyz~zvsqppprvywl`gtg\ipi`[XXWWXXZ\_diotx{{zwustvz~~|wromlmmnnnmljiks~uost|vrpprvz~{yvtsssux|}qootyroooppqrtw{|y}~{wsnjgeegjnqssqmhc^[YYY[]^``a``bgr}zmu}ux}swpmkjjiiikmpty}{wtssuy~ws{~q~ypqvz}~~}{xurommorv{}xtqonnprtvwxxxxz}yvsqppqswyuj`jtd_mpia\ZZZZ[\^`dinty}~{ywxz~|zyz}}wrnkjjklmmmmlkknvusuy~yussvz~|ywutstux|zno{lu~vpnmnnopqtw{}zz~|yuqonnquy|~~{xsnjgffgiklmnnmmovw~~}{ywwwy}}pky|klz{skgfffgghjlpuz}}{z}}yuromnptx|~~|xsokknolhdbaadhkq{~}}~shqweanoh`[ZYZZ[\^`ekqx~toruwyzzzywvspnnorvy}}xrlgca___`abbbbcfn{x~{yxyzzsf_lrbevytpopqsstttuwy}|xtqqsv{ztyt{~ssx}}{xvvwz~~zvsrrstuwwwwutu{vzw}zxvvx{~}vihwsckvsjda`aaabdfinsx~}}~yz~}zvrnjfddfinrvxxwtpmkjkmortvxxxwx{~}{yyyz}wmurjw|umhfeddddefilpuy|}|yvsqpruz}zwwx{~ytoljijklmnonnmnr|u|z{zz}}yvsqpooqtx{xnfpzkhw{tmjiijklmorvz~~{vsonnorvy{{yupkfca``acddedccdhr{wktxq{~u~xs|tomllkkllnquy~|zyz}|}|zwsvz}~~}|zwtpmjiikoswz{zxtolihhikmoqrrrrsw~~{yxwxz~~tio{odqwqhc`_____`beinrw{||{xusstx|}zxwx{}ytpnllmnppqqpooqx{v{||yy{~}zwusrrsux|}xlixxhmzyrkihhijjlnqty~}yuqnllnptwyxvsnieb```bceffffefku|pw}u~sx{p{}upmlllllmoquy~~|z{}{x}uuy}~|zwspmkjknrvy{{zvrnkihijlnprrsrsu{}~{ywvuvy|~{pgpyjervogcaaaaabdfimrw||yxxy}}zwuuvy|{vromllmopqrrqpqt|{y{{yy{~}zwussrsvy}}vklzvhp{xqliiijklmorv{~}~{wsolkkmqtwxxvrmiecbbcdfhiiiiikq||s|z~}}}vq~qrxqmlllllmnptx|~|{}|zwuy}}{xurnlklnquy{|zwsoliiijlnprsssstz}~{ywvvwy|~zogryigtvohdbbbccdfhkpuz~}zyy{~{wustvy}|xsomkklmopqqqqpqvw{|{|}zwutttvy|~zoiv{klyzslihiijklnpty~~|xtpnllnquxyyvsnjfdccdeghijjiilr|zs{{~}|}sr{ls}zrlihhhhijlnrv{}|||~|xtqooprvy|}|yuqmjhghiklmnnnnnrzyz{}{yxxy{uls~qjv{unihgghhijlosx|}{{}}~{wtqooqtwz}}|xtpligghiklmnnnmnr|w}{}{yxxy|~tlu}okx{tmihgghhijlosx}}{{}}~{wsqooqtx{}}{xtoligghiklnnnnmns|v~{}{yxxz|~tlu}pkw{umihhhhhijlosx|}{{|}{xtqpoqtwz|}|yupljhhhjkmnnnnmnr{w{{}{zyxy{wmr~sju|vojhhhhhijlorw{}{{|}~|yurpopsvy|}|zvrnjhhhiklmnonnnpw|w|~~|zyxyz}{pmzzkozyrlihhhhijknquz~}{{}}~zvspooqtw{|}{xtolihhijlmnoonnos}w}{}{yxxy{~wlq}tit{wojhhhhiijlosw|}|}}}|yurpooqtx{||zvrnkihhiklnoooooqvw}|zxwwx{~}skt|ojwztmjhhhiijknpty~}}~|~~zwsponoruy{|{xupmjhhijlmopppops{{z}}zywwxy|xmmzwipzwpkihhhijkmosw|~}}}}|xuqonnpswz{{yvrnkihhikmnopppprwx~}{ywwwx{~{pkwzklxyrlihhhijklorv{}}~||yuronnpsvy{{zwsokihhikmnoppppqvx~~{yxwwxz}|rku{mkwysmihhiijklnrvz~}||yuronnpsvy{{zwsokihhikmnoppppqvx~~{yxwwx{~{pkvzllxyrlihhiijklorv{~}}~}|yuronoqswz{{yvrnkihhjkmnoppppqwx~}{yxwxy|ynmzwjpzxpkihhiijkmosw|}|}}~{xtqoopruy{|{xuqmjihijlmnopoooszyz|}{yxxy{~~uls|qjvzunjihhiijkmptx}~||}~~{wtqpoqswy||{xtpljhhijlmnooooos|w}{}{yyxy|~tlu|okwztmjhhhiijkmptx}}{{}~~{wtqppqtwz||zwtpljhhijlmnooonot|v~{}{zyyy|~tlu}pkwztnjhhhiijkmptx|}{{}~|xtrppqswz{|{xtpljhhijlmnooonos{x{{~{zyyy{~vmr}sju{vojihhiijkmosw{}|{|~|yurpppsux{|{yuqnkihijkmnoooooqx|w}~|zyxyz|zpmyykoyxqlihhiijjlnquz~}||~~}zwsqooqswz{{zwsoljhhiklnoopoopt}x}|}{yxxxz}~vmp{sjszvokihiiijkmpsw|}|}~~|yurpooqtwy{{yvrnkihijkmnpppppqwx~~|zxwwxz}|sks{ojvztnjiiiijklnquy~}}~}}zwsponoruxz{zxtpmjiiiklnopqqpqt{|{~}zywwwy{~~wmmyvjpywpliiijjklnptx|~~~}~{xuqonopsvyzzyvrnkjiijlnopqqqqsxy}{yxwwxz}~zpkvylmxxrmjiijjklmpsw{~~}|yurpnnpsvyzzyvsoljiijlmopqqqqrwy~~{yxwwxz}~{rkt{mkwysmjiijjklmorvz~~}|yurpnopsvyzzyvsoljiijlmopqqqqrwy~~{yxwwxz}zqlvzllxyrmjiiijklmorv{~}}~|yurpooqsvyzzyvrokjiijlnopqqpprxx~{yxxxy{~~xnnywjpywpliiijjklnpsw{}}}~~{xurpopruxz{zxtqmkiiiklnopppppszz{|}{yxxy{}}uls|qkuytnjiiiijklnqtx|~||}~{wtqppqsvy{{zwspljiijklnopppopt|x}|}{zyxy{~}slt{okvytmjiiiijklnqtx}}||}~{wtqppqtvy{{zwsoljiijklnoopoopt|w~|}{zyyy{~}tmt{pkvytnjiiijjklnqtx|}||}~{xurppqsvyz{zwtpmjiijklnopppops{x||~|zyyy{}~vmr{rktzuokiiiijklmpsw{~||}|yurpppruxz{zxuqnkiiijlmoppppprx|x}|zyxxy|~zpmxykoyxqljiiijjkmorvz~}||~}zwsqppqsvyz{yvsoljiijkmnoppppqu}x~|}{yxxxz|~}vmp{sjsyuokiiijjklnptx|}}~|yurpooqtvyzzxuroljijklnopqqqqrwx~|zxwwxz|~{slszokvytnkjjjjklmoruz~~~~}zwtqoopruwyzywtpmkjjjlmopqqqqrt{|{~}{yxwwx{}}wnnyujpyvpljjjjklmnqtx|~~~~{xurpnopsvxzzxurnljjjkmnpqrrrrsxyxj]VX_ghmsd^^ecW^mmgn}z}zvwodefca`_`de_emozyyojaZWW[dow}|nemukionof\__]\\Z\aeemxwx|{umhb`c^Yadbbejnpplorgabdmncgvwpoyvuwzzwqssfba]Z[]bkuy~xxvrmjggjkhqyvxzxrkfa`c^\fhghlqwyxv{|pllnwvjp|zpr}}w}v{|miqmimhcacgkmljomccb_^_bgpxyzuvwpqyyxy}usrx}tmyypx{u|~}yvwtqpnmnngfpqryymirk_bgbdgb__chllkmrjdecaacfmuyzx~wvw~srvq}usyzz||pooljigghg`bllourfhpf]ceaegcabgloonqulghfcdeipwy||yxztuur|rqxxxz}~xmmljhgffge^bllouqfipg_egchjfdeioqqptwnjkgefgkqxy|~{yzwuvq~~|spvxxy}|~ynlljhhffhf_almoushirkafieiljggkpsrruyrkkiggikqxy{~|yzzs~{qy~}votxxx{|}|qlmjihhghhb_jpptumgqrgdjhhnnkikqttsu{xomlihikovzy~zy{txss}zqqwyyy~}|}wnmliiihhif_eprrwsilvofilimqolkotvuuy|uonkijlnsyy{~|xx||s{{pu~|wprwzyz}}}tnnljkkjkkeaisstwqipwnglmkpsqmmrwwuw||tpokjkmovzy}|ywyws~wpz}{tpuz{y|~}{ronkklkjljbdpvuwvmkvvkimlnsuqmpvyvvz~yqpmjkmosyyy}|{ww{|sy}ps|xqrx|{{~~vpomklmllmfblwwwxrjrzqimnnrvtoouyxvz~|tqokkmnqwzw~|}xwx~tv~qq}yrrw}|{~yqqnlnonnoickwxwxtkqztkmoorvvqptyyvy}vrpkkmopwzw|}{~xvw~~uuqq}yssx~}{~yrrnlnponphcmy{xysks|vlmnosxxrqvzyvz|vrpkkmopwzw}|{~|xwx~|su}pr}z~{~{vsvuv}}~wwwutyvqx}~yvxxuxwoq~y{xtturnlkmr|zw|~w}ujq}~wz~{~}~{wppsrnqmdgt{xwxmn|}rmprtx}wqtyztu|ztoleadgfjpln|~|urptvnitvhdq}|x~}{|~~zqv~|puqortuy}uquzysx~zvrogeilkqvqv}}zvtst{xuy|{tx|wpljiopifstgft}z~|z{zz|y{~~|~{}zwnlptqw{vz}}|wz}{|v}}yxzzsnmmmsytpswvpsyuokjhmqlgsxkht{|{z}{~||soswtxy{||z{tv||x~{swy}wswxrlklloyupquwqqzwrnmjlrpho{qir}|zzz||}~xqrxwv}z~w~}urx}wy~us}xzzrtxvmkklluyrptxuox{uqnlkqtmkyylm{}}{zz}|z{|~tquzvz{|||w~{stz|v}}sv~v{vqvyslkmmozxqquxsq{ytqpmmstln|vkq|zzy~|~zz~|}rqwzu|y~|xx~xrv}{wyrx{w|sswyqllnmr|vqswxqu}xtrqmpuskt~qlw}{zzy{~z|||{}woszww|z}~t|ssz~w{~ttv{xqvzvmlnonz{ssvzuq||vtsontvon}ymq|yzx}}z}yw|{{ppxyt~~x~tyvryzzxt}wy{quzyolnqox~usuywpz~wutrmsvql{|op}}{yzy{~z~yw~y~~}pow{s|x~~}vvxrx{yzt{xx|rt{{plnqowvsuyxpzwvusmrwskz}op}}{yzyz~y~xv}y~}|ooxzr|~w~~txwsz{zyu}wy{qv|{pmpsp{wtvzxq}xwvsmswrl|{nq~zxywz|y|y~vzy~xmqzxs|w~~q~tt}xvxu}xqy~xmmrrq~uuw{ts|xwvpovwnpvnv}~~xwyv~x{}x|wzwz~rmu|twxz|~xs|sxy~v{|w~st{~tmotqv{uuyzqyzyxvnqwvkvqo{|~{vxxu}w}}x~u}w|}~pmv|rzw|{wu}v}}z~}wzwrtyv~~zz~~u}}|yru{xn|ss}yvxwu|{t{z{t{}|}oyyrw}~}x{ljsyow}ty{xu~v|}z|wyyrtyv|zz}u}~}|{rt{zoytr}}~{vwxt{~}tyx~tyzpv|rv~~}y}mirzpt}twyzqw{|{zzw|rsyxyzz|wy}}}ury|rsxqy~}~vuxs}zuwyvwyvqss{}~~}ythmxvo|yt~||rzzw~|zu|urv{u}zz~|t}~~yqv|xn~rt}xuwvu{{t{y|u{~{~ox{qv~}}x}mir{qt~tw~x{owz||~x{u~~rsyzx|z{yw~~vqx}up{qw}vtxsx{}~wu~||yv~z}{o}wrx|}wzjkvzox|sy~xvrv}|{{wxzqt{w{{z{u|~~ss{}pvvr||{{tuwrw~txxvyxssrs|~~~~{{qhp{tp~vt~~y}~o|yy}}}y~t}srw{v}zzzu~xqw}wo}qw}~uswsvz|~xu~{{ywz~zo~vry|}xxilxyo{zr|}{xqu|w~|{u{vqv|v{y}}t{qu}zn}ru|}vsvts|yzt}~y{v}{|}o{yqw|}x{jkv{ox|ry|}vtr~w}{|~vzwqu|w{y}}t|qu}zn|ru|}wsvts|zyt}}y|w~{|}p{xqw|}xyilx{oy{rz|~zvqt}x~|zu{vqw|w{y}|t{qv}yo~rv|~}urusty{~xuz{yxyzpvry|}~yuhnzxo|xr~}|~wy~n{yz|}~y}v~rryzx|zyxxvqy~srxr{}z}rsvp}v~tyww{ysurt}}~~ynit}rt~sv{}|svnw~z||xyzqu|x}|y{u~rs|}pxts~{{xqstp~v|t{v~w}~{qy|qv|}y}kjv|pv}rx{}{ttpw{|}~wzyqu|w{y{~t~rt}|ozsu{{vqtsq|x{t|~w~w~}|qz{qv~|}x|kkw}pv}rxz|zsupw{|~}xyzqu{x}|y{~urs|~qxtt{zxqstov}t{vw}{swru}}~~zmju}st}suz{{r}xmx}z|{{w~rtzzz}zyx{vrztsxr{~y~rqtoyv~uxw}xzyxsusz~|}~|uip|yp|xr}|z|vvov{y~~}{v|vrw{w{y}|v|qv~{p|rv|~{uqsrq{x{u}~w~x~~|ry}ru}|}~z~mjv~tt}suzzzr{ym~y}z}{~w~ssyzx}zx~yyxqyxq{ry~z~sptpux{xvzy{y{}r}yrw~{}zzjmy}qx|qxyzxruoyz|~yy|ru{x}|yz~wts|svvs~|y{qqso}uuzvx|zvutt{}~~}|qis}wr}ur{yzsx}nzz{{~~{w}usx{x~{x~{xyqxyq|rx}{}tpsptx{xwzy{y{}s~xsx~||{xjo{|qzyqz}xyusqs~z|}|w{xrw{x{x|}v}rv~|q{~sv|}{vprqrzy{v}w}y|~s{|sv}{|{zkmy}rx{qwxyvrsqz{|}x{yrv{x{x{}v}rv~}qzsv|}zvprqqzx{w|w}y|s|{sw}{|{ykoz}ryzqy}xxurqs~{|}|x|xsw{x{x|}w|rw|q}}rw}{{tprpsx{yxzy{z{|t~xsx}||}ujq}zr{wq|{xxrv}ny{}{}~|x~utyzy}zx~z{wszvsxs}y}qpro{vw{vy}{wwtu{|}}|~nlwuu|rtxwvp|vozz|{z|sv{y~|xy~xtu}sxtt|yypqqp}w}w}vy}uztv|{|~||lmy~tw{qvxwuq~tp{z|zz{sv{x|xz~x~sv~~szsu|}zwpqqq{x|w~}w~y~~u{~tv|{|~|{lny~tw{qvxwuq}up{z|{z|tv{y|xz~xsu}txtt}yzppqo~}v~w}vy~}wyuv{{}}}~nlwvu|rsxvupzxo~{z}~}yuuzz{}yx~y}vs{wtxs}xrproxvx{w|z|{{vxty||~{~tks}{s{wp{{vvrspu}}~}}}y|xtw{x{w{}y|rw}s{}sw}|zvpqpq{x|x}v~z~vzuv{{|}}}nmxvv|rsxvupyyo|{z}~y~vuyzz~zw}{{xrzzs~zrz~z|tpqoux{zyzx|{}u}|tw|{{}ylo{~txzpvwvtp|up{z||z}tvzy}|xx~yut}vvut~x|qpqo{vx}w~z~|ywwuz{}}{~qluzt|uq~yuupu|oy}{~~~~y}wuxzyzw||zzsy{s}{ry~z{uopnr~tsxvx{{ss{u{}idff]\eouwfaicbdf`coyvy{vojkmgrxttpdY`kmdhkdk}mfmgdfgacozxywuslpvkb\^b^ipnpncX]jndfh^ctyntmiqyucZYWWdgdhfe[Zhhjornnx{xtqljusnokg[Zfdfjniku~yx|}pcgqqfig]csvmskjs|wg``_bqrrussikwvx{}vv{y}w|z}youy}sqywe^]Z\iihkhf\`kjmrsnqzxy|}u~vrrpv}rz~z}y|{||zzy|||}xu{y{zkfnvpind_l|~pppfluyj]Z[Yblimmlg_kqptwupw~u~}~|{z~x|xy}||xw|{stwuz}uopupx}|yo`akpfeg\^m{xkokenxwg^]]]iomrqpherstwzusz|v|~|~y~y}z|vv{wqrtryyqlnrnw}zzuk^akneff[_p}wlqkhr{xh`__`nqpusrihuuvy{vt|{v~{}~y~y}{|vuz~xpqtqvyqlmrnv}zzvm_`kpgfh]_n}znrnir||lbaaamtrvutmiuwwz|xu{}v~{|~yy{}zyuy~zqqsrt|smkqor}{zxqb_hpjeja]j{rqrjpzsfcdbkvtwxvrisyxz|{vyw{{}~}}z{y~y~uw|}uprsqzvpkoqoz}{zui_dnpgig^euzqvonx}meeeftwvzxwnnzyz|~yw~}w~{~|~y}yz~yztx}{rqsss~~uolqqr~}|ztf`hrogke_j{xtwoq|zkffejwwx{yvmr|z|~~xy{y}|~~}|}x}x|{{wuz~yqrtrv{snnspw}}ypccmslilbcquwuovujghgqyx{{ysmx|{}|x}x}|~~~~|{}z{yyy|ux}}tqsts~wqmrrr~}|vjbisqimhak||vyrs}}oihglxyz}{xos}{}~yz{z}}}|~}{~|~~}y{y}z~vw|wrsus{zsnqtr}~~ynchrtkmkbiyvzts|qjihjwzz}|ypq}|}~zy}y~|||~|{|}|}y|y}{}ww|xstut{{toqus}~zodhrtlmlciyx{ut}skjikx{{~|zqr}|}zz}y}|}~z}{r{ylo|~v{wz}~~}|{xxqlorr}v~{umljmxyy|yuloyxyzzuwzy{xqmqrtzvz||}nhgekvuwywskrywyzxsv||stxrty~ytzvpsxxonpqr}~vqpvv{vs}~{y}~z}}trsru{soout|~tu{}{vut}~uqz|z{{wsx}xqvuqu|ww|uty~zstvv{zuv|z}rs}{z{sw{xxx}z{~w|zvyxx|ssw{voprqw{tqrxw|ru~~w|}||~|~z~{||z{||}yz~}{qt}xxxou}trqq}}ts}||||wuz}wqwtqu{}uwzrrw{vpqtsz}wsuzy|qt|||uz}|}}}~{|~}qr{xvwoq||ronnx~|}{soyzyzzvrw|wpuuptz~wv{tsw|yrsuuzyuuzy}rs||z|uw|{{}{tpxzuwpn{{snmlr|{}}zunuzxyywru{zrswrsy~{u{xsw|}utvvw|wuz{}vqxy|ws}|{z~{~ypt|}uvtmt}|xomlmy||~{yppzyyzyusy}wqwurv}xy|uuzzuuww|zvw|{}rs|{y{sv~{zy~~{upv~{tvqmw{}uomkp{||~{wos{yyzytu{}usxtsyw{|uw|yuwxxzvy||zqu~yzyrx|zyz~||}qqy~xtuno}{}rnllu}{~}ztox{yzzxtx}{svxsv||x~yvz~wvxx{}yw||uqy}xzuszyx~}~~{~vou}{tvqmv|}vomlp{}}~|xpt|z{{zuv|~wtyuuzy}|vx~zvxyyzwz|}yqvxzwrz{yx{~~{}yps{|uusms~}yqnmoz}}}zrs|{{{{vv{ytyvuzz|~wx}|wxyy{wy}}{qu}yyxrx{xwy~~~~{|yps{}uusms}yqomoz~~}zrs||{|{wv|yuzwuzz|}wy~{wxyy{wy|}yqu~xywqyzxwz}~~{}xpt||uusmu~~yqomq|~~}zru}|||{vw}xvzvv|z~|wzzwxyzzw{|~wqw}wyur|ywv||~}z~~tpw}ytvpo{}uponv~}wrz~|||yvz}vyzux}{yx|xxyy}}xx||}srzzwxru|xww|~~~~{{~|rrz~wvvptwtss}zx}{z}z~||{{}|~zz~~{rs{~wvvpuwtst~zy}|z}{|}{|}}}y{~~{rt{}wvvpvwutu~zy~|{~|}}{|~}~zz~~{rs{}wvvqvxutu}{y~|{|}|{|~}~zz~~|ssz}wvwruxvut||y|{|}|{|~~~zz~~}tsy|xuwsuyvuu{|x~|{~}~|{|~~{y}~urx|yuwtt}zwvuy~x}}|}~~~|~||~|y|~xrv|zvwus{|xwuxy{~~~}|~~}}}{~}y{~zsu{{vvvsy~xwvw~{z~}{~}}{}~zz~~~tsy|xvwtvzxwv{}y}~~}|~|~||{y|~xsw{zvwvu||xxvxz{~~~~~|~}}}|~}z{~{suz{wvwtxyxww}|z~}~~|~~}|~~zz}~uty{xvwuwzxxw{}y|}~~|~|~|}{z}~wsx{yvwvv}|yxwz~z|~}~}}~}}|||y|~ysw{zvwwu{}zyxyz{}}~}~}}}||y{~ztw{{wwwuzzxxy~~usx~ut~zuw|yw|~t~zx~}}ur}wuty~x~|}yuttwyywwyyxyxzxw{zysqtx|xlstzry}v~t~xvxzz}~~}~ypnxw~}|~t|np||{{xrpx}vxt{~t~yrt|ly{u~wnswwsuz}lgqzmw{}{yu{{|~rjp~vr{t}rsuutyurzz~svzhvvnz{pr}zzohszkt~szx{u~{zqu|{|rzvx{t~ptzyw}{wjm|xm{wp}loz|~{|rdiuywts}||uzojuosux{r|zu|y{xnbgvjg~joy|y~|no}yl{~s}yso{}{{lbnxhlwlmwzv|wx|siqvqzsop{}x{zqq}hrvmv}}x|yoer|mswy}muzzxqfoysu|yvjty~~prktzqy~yoy||||wnu~ml~yyuzgkvutvfj}{pv||xr{{z|||ojztxts|emzyt{upzstsiyyu|yqp}~y~|~kiy~mwyxr{yu|vtz}}rz|xxr~kmz~y{}}lm}jv|t{|tjw~wz~xs}}sq|x~x}tww}v|}oo}lyuz{}pw~wz}~wu~lcmzovjm}y{|po~o{~u|vxozxs|~leqmjxrtwu}|y~z}s}ojzzo|vrzpm|{stut{wnt{ro|w~{~|zms~{fdx|nr~y}nk{uqys{{jmw|~}~u}osopxy}|~yynksqsp{yyrx{|xupsnjwtswul_w{uw|kgxxwtp~~{}w|x}|xvzzxzt}pjmg|ulttksyjujv{~||lp}~~{z}vsz}z}y~yxqs|vox~sm}|~orxynq{orw~|xmmtjpzmzykq~}to~qq}vluy}zuz{~{uyyyvxmr}zstrju}jrdcwzv{rlf{}}~}}wu|zuwzh|{~fs}tv|obholqtjvqu|{xkoontzq|ujr~~tv|lv}rxxko|{|}wpjqn~{{rrowzvsdko_py~ny{qlwzv{|rrqqy~|y}|~zsumk{{zzxkutlpnbkq_nyx{qek{vtznqw}y{{|~xwkn|xl|~gpnlxxjhkjdhy{qjqvu{qzmk|}x~yt||r{rt{uj}z{{nnimw{zpolcsjkrvu{yt{zb`wywy{rz~zywrtvxthq{tv|~{utnkvnc{gmuoowxuzn^cyz|ustxsqzmoljw~|nnsldxqvsnrty{{xnjdaku}rr||}~vv}movq}}y~~{ytqhq{mllnoltuxwcfy|ldox|thj}~~z~uu}wd_osrxksxquzrgeigstsu}wimtrrv~zxoluxz|z{|||}y{}{opjz|}|pxhpzovsifiq}zvz{tmxvvttjehuzwmvwwu{{lr{wkqqs~x|vnlpggvulzom{rw}olwvyvqtpusyjiulo~wtwxuzy}|xixfb{xf|ytxw|mkbkvyvqlxki{u}}q|xqu~vn|o\y|gxw~t{x{mttm|wnjw|tw|~v|xsrv{zy^urZlsgr~|w}}}}oxep~~~||xuwyqpsxtvznlrp_fxsz|wwv|zif~ql|tx|vszyxz}puwewppzjqoywuszuo}ntfdsvwzyzrwwwr`zv{rt~mv~r~~yy{}{uw}rzwmu~}px~xylnsw|`spwssw|gr|u|yvwz}vvr}pzxxm}vttpyxjznszgh|yu~stmlry|{rsk}xy~~utx|{}prrizkjyu}vzz|uppp~nvunl~vxnzv~xy{rwxzz|d|usxs{j}yuw{nwxk~oswqqn}}x{}sw|zvzyh~}m~m{}qswm}xs~ar{}lq}y{ysi{u{ypm|yd{|hYghisr~npugmwoDJ[]d{sr}js~tkzgp~xSN`^XhiXjsqmzk}~xZ_eZV]JXwtxfipanupOUdVOcWLfrsk~h_|j]hgcgnclyulitbkvuVI[_`kfWhqqfxsiksh_h\Rnulevd\s}wn|v}|kzxenoiafe`jrraplk}sWisimycewyrwrxifpqt}|rs|||zz~}x}xrygguskmo`mxwgqj\ozu^fkeaiah~|{}lv{x|}|vq{~|~szx{zyt~nutr{{xymez~xm|st}{b[kd^glWcvzswxbu~vbfgb_gfcxxzptpgw}jux~{uguyx}t|ponprrphzu{~ssso[bffgrcXjtrcqgcpthdomfgtejyzpitgqefrlforfzx~r~zs}{rp~uoqn{oeopnroUbtslmxhnqk^eb^`fe[o{}sssoz}vchjggurm{u}sozr}~|vr|{{|~z|ickpkoqdt~}u|~jiro^efggmcXlvpamldpxqfqnho|lj|}vp|rxpqvolpxnz~|uz|rx|x|yiwzvt|wkw}vhqqrmj__qsrktogloi_aacembi~|s~xxokolnuquzu|rzr|}}||}qt{{x{v{xcjqnjpogx||v|uajuk^ghihm`]vuliumiv~upumqx}pr}xtzsruqou|q{~|~{~swu|zvyxjtvxvvvmu|vhqtrggearutpwqflunaefhgpkr{t}yokqqt|ov{zv|y~{{ry|zzvvz}obpqnltpj{}~z|jcrvjemkkhjbkwomnumo}sqrty{~ov|y}~tvussz|t|}z}~yzr{x~zxw{nkvzzv{qs||orxrfdneowvssugkxt`djkiqvq{zy~vmtuz}tu~xzz}{~~}sw|zs~vxyoisronusn|ysjjtxmgomkgmjmsoqrxpvtqv{{||px|||{rutuu}|u}}zw~~uu{|}yywxin||xwzrw~zqxtidopiuxvsvoivziallmn{xx}~y~~qpx}|{t}{|z~}z{~}y}wv}}y~}z|{uy{yx}xy{y~}u{zwr{}tz|}yy|}wwxwx|~yuytvyytxrv}|zz~tv}~|uzy|w~z{us~}~z|nw~{x{xsqmmvwonz}z~wotvnquqoy{|uy|xsszpsv|stvtrv}yy~~}qqvolpmps{w{w}mpvvtw|z}unz|{vwtoy|yv~rkporqvu|yy}vszxkjjnqsumwz|{{z}|uvxuomjftyvuz~y~{v~{{~{y~{ry|tu|qvwutx{szrv{}yyzt{zuw}wz{y{pu}|xz}{~~|ru{wpytuwu}z{zysiqysptuyz}zy{|syz}z~xqv{|z|v{~ryx|~|yy{pxxx}xy}~}}~}ut{wtmpmnxxvt~trzvsnpou~{z~~|tv~|~~~|z~~z|~vrr{~wux{wuprtvwvysxvuw{px~|yxrmryqqxs{yx}}{|qp{~vuy|~}x|{~}}wzxt}{|y~tp}xyzyvvtmyvrwztv|{z}vz{zy|}|yvvxvrnppqx}~zzwx|xuovux{}vq|{z}~}|}}|z|youu{}|||tqy|rnpsstx{|~wsvvy|uq~{xwspxzu||wyzy}|yswuw}~yyz{~{yz}|}s{|z}{wpz}wyxwurqu|tqvzwt|z{xu|zy|yx}xwxsqpurw}~}z{zvpwzx}|~up~|z~~}w~|~xz}{~toywz{{z|sp|}nlrutt}}~||ytvy~|tu}{wxusz{|zz}zy}zxxy~uy~ww}~wzzw{{|yx~~y||ytw|{uxwwqrwwtpuy{w|~x}|uy|y|{uwxutquxt}~~yzwsv{{x{~yr{}~y}}}w|~~|ww}sqzzz||zz|ur|}pltwvv|z|}vv|xvz}~zwxwwx}~z}{z~|wy|z~}xzyqz~{v{ww}{~}{|{|{~|{uzz}zvwyvpwzrqsxy{}|y}zwy{{wy~xvvttxxy}}}}wytwy|zv|zuy|~|{zy{{y}}z~}uyxrx{}zz{x{yvx}xpovxw|~y|~wx~v{}{~xww{yxz|}|}~|yu|~|||{|uo}z}x}|vx~|~~{x~~||~xt~}}}wuzvsx|qntxy{z~yzxy|zz|tuuwxy|}}{yvtx{||vxwu}|~|z|wx~z||~{}|ww}}xsz|}~y{z|{z}~zvuw{|~~}}{{}}~}~}}wz~{}~ypt~{yzxy~|utxzy|~~~zy{|~|vw~~}|{~~tw~~yw{wx~}rqy|}~}}xyz~}}}vv|~~|xyst~}~}zwzuuxu{{z~~{yxx~}}~ytxz|}~ur{~~zyy{zxxtwyy|}}{z{|{|wx~zz}{qt{~~}{ywz{uuxyz{~~{~yx|}~{t{{z}vt~~}}xyxx}~vqt{|}|~~yx|}|ty~~yy}zpz~}}yyxtyztw}{zyxx|}}uwz||{zpx~|ywzzw||su{zz~~}zzz~}zxw}~x~}qt{|~}||{vy}ttyzz|z~|w}~~|wz~}x}}tt~~{|zyvx~urtz|}}~}zw}~|~{uy~}y{~wr|}{|yzvu{wtx~}{}}}zw{||{uy|}}z|vq|~{yvzxwxrw|{z~~zyy|{xuz~{zuq{{~|{z~xvvrw{{{{~}z{~~{y{|y{~ts}{zz{vvvrux{|~}}|x{|~}{wz}~y{~wu{~zzz{vv|}vsx|~}}|}{x|}|~}zvz}~{z}tt|}{xwywywrx|||~}yxy~~{uv|~|}}rv||||z{}wy}tsz|{~~}|||~~~|w{}~|z~wpy~{x{zu{{rtxy{}}|z{~|}{wz|{z~xt|}|zx|yv{~wru{|~}}|zz~}|{wz|}y{xsz||zwxwv}zuuz|}||yw{|ysx}|~wsz}~}{zy{zy}ysuz}||}{z~~}{v|{|upz}~|w{yw|zsuyyz}}{z|~~}zvz}|{~xs|~~}{w{zv|wruz|}}{{{~~~zvz}yyxsz}~}zwywu{zuwy{}~~~zxy~~}}{uv{||ysx}~{zxzzx||uux{}}{{z}}{wx}|{~|qs{}~}{xzxz}wtwzz|||zz~~~xv|}{}~ut}|zxzyx~~uqvz|}}zz}~}zu{~yy~wrz~}{wywu{ztw{{|{yx}~~{vvz~}{{rw}}|zxxzw{}uty{{|{{z~~{xv{~z}try||{zzxx~xtvz{{||y|~~|vy~{|wry~|{yzyx|zrsy{||y{~}~|vx~{y}|rw}~||yxyuy|utz|{~{zy|~|wvz}}{~}st}}}zxxzxyutx{{~~{zz}~{wv|~z}~ssz|~|zz{wyvtxz{|{~|y}}zwzz}~ts{}{zyzwywruy{}}~|y|~~}zvz~~z{~wrz~{{yyxv|wtv{}|~{y{}~}zuz}~z|vsz~~{xwyxx~ysw{|}~|zy|{wuz~{|urz{~}{zx|xxxsw{{}{}}z||yx{~{|}sr{}{zyzxxvsuy{}}}{z|}|xw|~~z}}uu{~~{yzywy~}usx{}~~}{y}}~~|xw|~|z~|sv|~|{wwyv{}vty||zyy~}yux|}|~zrw|}~{zxzzx|ztuz||~~|{|~|zv{~{|vqx}}zxzyx}zsuxz|}~|z|}|zvz~|{wsz||zx{xw}~xsuz|~}~|z{~|ywz}~z{wsz|{zwxww~yuvz|}}~zy{~|yty}{}wsy|~}{yxzyy}ytvz|}}~|z}{zvz||vqx|}{wzyx}{tuyz|}|{{~~zvz~|{~xry}~|{xyzw|ysty|||{{~}{vz}{z}ysw|~}zxxxvz|uuy{}~|zy}~~~{wv{~~{~|sv{}|zxxzx{~wtx{|}||z~~{ww{~{}~try|~{zxzxyxtvz{|||z|}zv{~||wsx}~|zxyyx|zstx|}}{{~~~}{wx~|y}{sv{~}|xxyvz}vty{|}}{y|~{xvz~~{|us{|~zywyxyxtv{|~~~{z{{yvz}||wrw{}|zyyyx}zuuy{|~~}z{~~}{wx~}{yrv{~}{xyyx||tsxz|~}{z~~{ww|}z|}su{}}{ywywy}wtx||}}{z|~|ww{~~{}~ut{}~zxwyxywtw{|~~}{z}zwv{{}tsy{~}|yxzxzxtwz{}|~}z|~{yw{||~urz|{zxzxyxsuy{}}|z|~|xw{{|~vsy}{zxyxx}~xtvz}}~|z|~|yv{~~z|uty}}{xwxwz~xtwz|~~}{y}zwv{||tsz{~}{ywzxz~xtw{{~|~|{}xja^`bgqxxu}|rjdcbchmignwxllnnokgcbcbehd]`egknx||}}xnhgcejlhhpy}ug]_bbb^\Y[\\cgc^_ehkouusqpsvwsnklkkoojbcgffb_^`ehnwwssy~}tqrolgb_`cejrsopv|zvusruvnfhjklpusqnosvwrmnnnquvqkosttqonptv|{y~}|{|~~ytrqoptrlegjiiecbdhjqxxtuz}~~zxy}|yvz~||vquy{zwtrsrrvwqjkmopsxuronsuvqkkkjlprlfgklmjhginpv}~yw||xuw{~}ywy{z{}zqjmrstqnkkkilpkcbfiilrrpmkpsuqljkklqurljoqrqmlmpsv}|y|}}xuswz|yuuxxyzzsihmnqnkigighmlfacfhjospnknsvuqmnoorvwrlptstqpoquw}|{}}zwstxz{vtuvvwywnggmopnkhhhgimkcadgikrsqpmqvxwqoppqtyyrotwwvsrqtwz|}}}ytrtxzyusuwvxyulfjmopligghgloiccgikotsrootxzvrqstuz|xrrwxxvssswy}}}{{vsswz{wsuvvwxwofglnpnlhhihknmfbeiknsvtsqty|{urtuux}|vrwz{zvutwy{}}~|||xsrvxzwstvwwyyrigloppmjhiikopiegjmntwutqty|}wtuvwy~~xtvz{zwutwy|~~~{z}xtsvz|yuuwwwzysjgmorqnlikjkqpjegklouxvusuz}}xuuwwz~~ytw{{|xvuwz|~}~{{~}xtswz{ytuwxy{{tjinqsqokjkjmqqjfiloqvzwutv{~~yuwxx|yuy{|{wvtxz|~~|z{}~{wsuy|}xvwyyz|ypikprtromlmmptpihknpsyywvuz}}xwxxz}|vvz|}{xuvy{|~|y}|zvtv{}{wvxyy|}xokquxyvustuv|}xstxz|~{xx||yvz~}yutqpssmhjnrv}{wtuvw|xvwyyxzwssrw|~}xvssutmhjnrv~{{|{zurnorty~|vtwxxyzxsqosxzxttvwwyzulglorromkmmntuplntwzwqtwxwspmmlmrtokmqvy}}~~{|}}{|ytqnqvyxtsvwxz|xpkosvwtrqssty|wrswz||yvx}~zwyzz{|ypikortqommnnswtonswy~|y{|}{sty{~|yxwxx{}vtvz|}~{y{||{}~}|}xtqpuwyvrsuvwyyskinqttqonppsxyspswz}}{vz}}{yzzz|vvz|~|{}ywvxz}|xy{zyzytpmptwxtrsvwx{yqjlqsvusqqssv{ysruy{~zx||z{{}{uwz}z{~~{xuuwy~ywyzzyzxrpnrvxxtsuwx{|xpkoswxutqstty|xsswz}~yz}zz{{~xvy|~|y|~~|xvuvx{}xxz{yzztqnpuxzvtuwyz}|tmnruxwusstux||vsvy|zy}|z|{~zvw{}~y{~~~ywuvxz~xwz{zz{wsoptxzxuuwxz}}wonsvyyvtstuw||wsuy|~~{x||z{{}{vwz}yz}~~zwtvxzzxz{{z{xspoty{yvvxy{~~ypnsvyywusuux}}xsuy{~~~zx}|z{{}zvwz|~y{~~zwuwy{yxz|{{|xtqqvy|yvwxz{~~xpotwyywutuvx}|vsvy|}~yy}~{z{{~yvy{}}z}~}ywuxy|~yy||{|{wsprw{{xvxz{}}unpuxzxvttvv{~zutwz|||wz~}zz{|}wwz|~{{~}yvwy{|yz||{|zusquy|{wvyz{}{rorvyzxvtuuw|}xstx{~~|{w{~~|zz{||ww{}{||ywwz||z{}}|}yurqvz}{wwy{|~zroswyzwutuvx}}xtuy{~}|zwz~~|z{z||vwz|{|}zwwz|}z{}}}}zvsrvz}|xwy{|~{soswzzxvtuvw|~yttx{}}||wy}~|zzz{|wvz|~~||~}uqosy~~||{z|}}}{ywwwvxyyy{zvx}y~|xvyz}{}wtsw~~{|}wx{}|yyy~vq{yy~~}}}}~{}}~x}ypquwxwustwwuw|}v{~}zvz|{zwuvz}|||zvsrstx{~~|zvty~yv|}{{~|yxz~~zvuuvz}~z{zy}~~}tr{|tsz}yxx{~}}w|{potvwvttvyxwx~wz~~~}|ztwzzyvuvz}}}||xtrstwy|{yxusx}yv||{{~~}zxx{{vuuwy}|y|zy}zrs||usz}yxy{~~}}{w~ypptuvuttwyxwz|w{~~~{~xuxyywuuw|}}}}|xtssuxz{zxvsu{|wx}}z|~}{yxy}zvuvx{~~}zz}x{|tqx~ytw}{yy{}~}~~}w{}sortuuttvyxwy~wy~{}{uwyxwuuw{}}}{~zussuxz{ywusuz|xx~}}{|}}{yxy}{wvvx{~~}|zz}yz~{sqx~ztw}|zy{~}}~{w|}sprtttstwyxx{|vyz~zvxxxvuux|}~{|~zuttvyzzwvtsv{{wy|{|}|yxx{~zwvwz|}||{z|{y{~wqs|~xuz~{zz|~~~}~~wyxqrtttssuxxxy~wv}{|wwxxvuuv{}}~z~}xttuwzzwvutuy|yx{}|~|}|zxxy}~~ywwx{}|{{z{~zy|zsqw}ww|~~{z{}~~}~~{w{wqrttsstvyxy{}uw{}xwxwvtuw{}~|z~~yuuvxzyvuttuz|yx{}}|}|zxxy}}zxxx{}{{{z{~zx{~~zsqv~yw|~~|{{}~}}}~}{wyzrrsssstvxyy{~~vv|{{zwyxvtuvz}~~y||vuvwyzwtttux|{xy~|}}}zxxx{~~~}xxxz||z{zz}|xy|}~|uqsz}xz}~~~~|||~||}}~}~xw|wrsssrstwyyz|{tw~{}yxywutuw{}|y|{vvwwyyutttuy|zxz}}}~|zxxy|}~}yyyz|{yzz{}|xy|}~|tqs{}x{~~~~}||~||}}}~xw|xstsrrstwyz{|{tv~~{}zyywttuw{}|x||wwwwyxttttuz|{xz}}~~|yxxy}}~}zyyz|zy{zz~{xy||~{tqt||y|~~}~}||~~{|}}~}|xx}vstsqrsuxyz{}xtx}{~yyxutuvy|yyzwwwxyvttttw{|zy|}~{xxy{~|{zyy{{yz{z|~yxz||~}wrsx~zz~~}~~}|~~{|}}~}yx{ytttrrsuwyzz{ztv~~{~zzyvtuvy|~zx}{xxxxywttttv{|zy|}~{xxy{~||zzy{{xz{z{~yxz||~}wrsy~z{~~}~~~|~~{|}}~}~yx|xtutqrtuxyz{|ysw}|zzyutuwz}xyzxxxxyututtx||yy}}~yxyz||}{{yz|yy{{z}|xy{|}~ztru||z}}}~}}|{}~}~~{xz|uuurqstwxz{{}|tt||}{zzwtuvx{~zw|}yxxwywstutu{}{y{~|xxy{~{}{{y{{xy{zzzxz{{~~~wssw~{{~|~~}}~{{}}}}zx{zuutqqtuwyz{{~zsu~|~{zzvtuwy|~yw}|yyxwyvstutu{}{y{~|xxz{~{~|{yz{xy{zzzxy{{~~~xssw~{{~|}~}}~{{}}}}~zxz{uuurqsuwxz{{}|tt}|}|{{wtuvx{}{w{~zyywxxstutty}|yz~~~yxy{}|}||zy{yx{{y|}yyz{|~~{usuz~z}}|~~|~}z|~}~}}yy|xuvtprtvxyz{{~xsv~|~{{zvsuwy|~yw|}yyywxwstuttz~|yz}xxz{}{}||zz{xx{{y||xyz{|~~zusuz~z}}|~|~}z|~}~}}yy|yuvtpqtvxyz{{~ysu~|~|{{vsuwy{~yw|~zyywxwstuttz~|yz}xxz{}{}||zz{xx{zy}|xyzz|}ytsv{}{}}||~|z|~}~~~|yy|xvvsprtvxy{||vsx}}{{yttvxz}wx|yzxwxtsuusv|~{y|~zwy{|~}{~}|y{ywz{zzyxzz{~~zulb`a`ais}vqlmldacdcgowyspifffbcgfddhlnqxxuw{~}zzqaZ]``a``ejoyyuutqoib`abgdabc`_acccfijknia_gpruurqpkkhdeecchjgdglpsz~{xuplh_YYZ`b_ckoqw~{}zpjiiijnjgimmoqnlnqvwokjhddfhjmqtvy|voqvxyyvtvutsnosvw~~~wpputrpmihdba\\`cdiprnlmprv|}}}wux}|vuussuwxxz{}{||z{{vsqoosroqutokea`bdhb[YYWX_eimqrrswsjiouuuutvww{zxy{|}yw||vtuuu{}~zvsoknruw{}zwxwmgjrspjc`a_^]YY[[]grussvwuw{xwy}{wsmilqw{yxxuqrvy{|xtx~||ywxwux~{{~}{sgabgnlggfb_bhmptvwvwuljpxz{wrpqqsrpstojmpojkorsstqt{ywz|~{rs{ztpmpnklkfdhjjimprswupquvtuqjfhlsrljjf``bfinquwzuhdjtvwuqnnmqvx}}|~zwusvtpnje``dhnw|rnqvutrnkicefdfikntuqlmopry|vrtxxwslggiouuz~~~}upljorqry{xtv{~xqmllopoqrpmpqnjjlmlpuoihnrwzvrrnkljovyy{zvxyz|~~~|xy~zy}~zxyxuvx|}~~{vuopuuqrwxphffhinpoqrnknnkikmojfgjijnty{~wtx{|~}~}}wqrvxzzuuwz{z}yrqqmknsxyxvuwyrkmssnkiikied_[^bgp|}}{{{~{zvsvyzwvvtuy~~z{~{yuy~}zzurqsw~|xx~}z}}ujdfkmqnhhhgipvww{{xx{vopy{{}}y{{zxuppuvttwxurv{|}|y{{}~~}z}~{{ups~{ssuutponkgjqvusuxwwyvtuz|zxrmqw{~zwvoeaflot}~{tpsy{{yursvx}|{|z|{srv~vsof`biqxvqsxyzwrnmnpnjlqrpswxtruz}}wx}xnhimw~~||}|~~yrprytu}}~|tprsttutx~wuuz~{xwz{{}rs~{xvy{~{~}{|zxxyz}|{{{zwrooruuxy~~|xrrtwyxuy~yqkostw|uwzxx{{|}wuzzvxvu{soqvxz{wuxyxzyvrvz}{vvwvuvutpsy{z|{vrswy|ztvzxuojnvxvxzuqrw~{wrrw|}{z|~{|}wrt{{y}}~||{ww|{tposy{~{{|xwvqpx}rlllmnsuuz|}xtu}{yzz{~yttvxy~~}{z{xqrv|}|~|zwz{ussttuy~~|yz{{||zwy|yupos}yxy}~wvx}~{yz||{zsx{~|zwsrsqt{}x{|zy|{wx}~{ytsvy{|umfchkqz~}z{}|{|x{}xz}|~}}~~~|x}|{}}{z~trzzsmgdjs}vru{{yvqrxuspnrqmmu|ztx|~|zz|~vokov{touxxy|wtsxwqppmpx~xoijrzzuuzzqmmppotz}~xlis|vutuz}{z|{wz}~z|~zurv}~|{zsprsuz{uw~{xsszxwx{|xurooopw||rqw~zsoru|}}~yttux|~ywzyxuty~{|ywy|zxxtuz{xyz~~ytoqsrsv}}{ypotz{wupllijpvw{}zzz}xy}{{zyzyzxz{w}}~~vtvwz~~~zvrnrvvw}vtvwv|y{xpmonqonrwzyx{{yzyzz}|tsy~|vsx{wx{vw}zv|vsv}|}ytw{||vu|{zz~ywwzzxuw|~~|xtpmnquw}~|{zyyxz}|}|}|z~|z}ytrmin{}{{{|~{{{|~~{wy}{}~}~|zz|{yyy}xuyvrojipy|~xuyzzyw{~|xwxupmnt|}zvz|xrqv|{|}~~}~{}}ury}xv{vz~}xsnkmpx~~~~xokrwy{y|{uppsrpwyvru{}yxy||}~~~~{|~~~}|upu~{|zzz~uorzzzvsrsvy{tu|{vx{zwv|zuuwvps{xuzzssv{}{xrtx{{|z{vrx~~~}z{yxwx~~xxzyy}|xwy}yxtopty~}{pqz~|vtsqrqvwv|~zyy~|{wvw|zvx}wu{xux}~~}vrqw{~}xvyyxwz{|{x~wsrsxxx||~|}wuy~xvvzyzvu{~z}{uttvz{{{}|wopw{{|yy{xuxwy{x||{{xz~|~}vtttz~~~~}}{yqmvyvz|~wuuwz~yy}vou~ztv}|{yuvy{~{zyuu|}zz}~|yvtv{}}|~|}tqrwy~zvz~yvw}}}|{yxz}z{{{|yzz~zwx||wwyz|{~~xwwvw{y}{}~|voopt{xxyyz~{xwxxux~{|{|~}}}|~~}{{z}z||~vmnw~{|{trqs}}{~~rnv~{vuvuvzzvy~|{|}y{~|x}~~~|xx~wrty}~~|{vwz{|xv~~|xx}{vvx|}~{yxtx~~|}}xwx|xy~~z{zxxy{~~wx~snrz}~~y}}{{{z}zx|}}}|xqsx}yx~{tsy}|{uu||yxv}|zy|~~~zy}vmmqx~~{}~{z}zvv}|x{yposv|~~}|yz}zrw{vxxtx{wz~}|}}xppszxz~~{uuxyxxy||{~{sstw~||zww{~|xu|zvuuuz~{||~|yvwy|}z|wwy}}wtsu{~{}vw{{vw~|zwtuvz~|wutz~~yz}}|~}}|~}}}ww~yxz}vrttszwv|~~zy~}zzyx|zxvw}~||ss{{vwy{~z~}|usz}{ytqpqv~||}wv{|wx{xuz}z}~yy|}~|}}|||yyy{xwstwy}~~{tqov~~yy~zsuy{}~xuvwwz}{w|~z}{yz|}{|{{|z{|uqsx|}y}~|ysrzzuwy~wsvxzxvv{~|{|wt}}z|yvuwyy|~y{}torwy~}}|~yz||}|yy{vqtyy{~usw}~~~|}|xw~{xwy{z{xz}zu{|tnmqy}{|}|yw{}z{z{vposx~~{yyy}zw|}zyxtt}zy}}}~~~vons~z{||~xx}{wvuu{xrqs|||zvvyz{}rs}xwuvx~{|}}|}|}|ywuwzwy~}yutwz{~|~}}{{xvz}}{xtstuz|||xtx{|}}z{}z}}}|xx|yw||wy}yvurryxx}|x}{zy{}ywuu}yxysqx}{yxx{}}~|uv|~zy}~xvtqsy}zz|yv||xyywx}zwzzsu|}zy{}}~zw{}y}{{|xtuxy|~zuquz|ywy{}|{{wwyyywvw{}}yy~|vuy}{z{x|~ztqv}~}uopxzvuvz|vsv}}xux~~|z~~~}wz|xuqswz}{vspr{||z{~|yxy~zwv|~wtstx|vtw||zzzz|}}y{zvvw{~}~xw~{wsoqz|}}}|vtw{x}ytprz}zyxy~}|{~|{vuz}yw|~}zy||}yqov}zy{|{vsprw~zspw~~|wvxxv{{uw~~{yxz~}}}}~zx}vnoy~z|}{wxwuwz}~yqqw|zxtttux~zy~zxz}zy}~||}{y~|}xux|}yx{~{|~{{xrsy~~}{{|~}{||~~{{}|xvtx}yuyvruy|}}zxyzy|{z{|zxvy}zuz{ywvuy|}}{z~{{{yy|{yw{}wswvru|}zwx{}{y}~~{tqquz~~yvvyyy|zzyx}{uttuyxx{~~~wv{|wtvzz{xw{|~zuuwy|~||~unpw|~xvvzzuvzz|zx|~||{{}~~}~}xsrru{~}zvor{{xxz}{xvx{zvy{vqs{~wtx||zyvvz|~}~~{xuty}{}|{}|xuru|~}}~vrsx}zuxzusu}~|zyz||}~~|{~zx{}}{xw{|ywx{|}~xtuxzz||}}ztooqwztuy|~|xwxxvx|{{{{}|}|~~|||yy}~}qlqz~{{xusty}~unpy|yvutuw{|yz}~}{z~|{}~zz}yvv{{vvz~~}|yuuy{|{}}zyx{}yyz}~}~|yvuy~~~wvz~yuw{yyzzxyz|~~yw|yrrw}xw}|{zyy{|{|||~~}vtv{}yz~ytsx~zusx{ywy~~|{}vdVRTZcq~xwuspmjecb`abiqy|yyz{ytmfeijjkkgeejnsvsrw{~xtpkijig`\]dnv}|ric^[Z[_bbabdgd``ekllqsnifhpwwrjd_[ZZ]dihhjhdbbdgmrqpqv~~vledghe^Z\abaaacgnwywxwx{|{xsnnpnjijjkjiggfeipsuwwxyyvolmov|}||}wqorvy}}||{{{|yrmmljc\\affed`]^`dkuzz}}xwx~}{yww{}xwxwuw|{|}xy|~}}~}}}~{vtsv}}{}{upmjhkqwumc\Z\_befhjknqqomosuvvuuuvvroou}}zwx|uoosx~~|ytswyvrponihigea_blrpje`^`ekpw{zxtmfcdhmqpnllnsvwx~}{}|}~|{wvw{~wmeeilmnppngbbfijkkigfbbhrwy{xrnjgffjkkjkptsqswzyyxz{|{x}}xx|zz}~~xvzwronklqvwrmkkmnlllllklquwuspnoprronib^^entxz}~vnlnprx}~{uppssrtvz~}~~xusqponqx~}{vmihlqwzxwvrmhdbdilpqpmnnmntzywvxvplkkmmlmostsqonopu}{vtttyvstxy||{z{zwvtpnqtuspnmmmligglruttsplkoswurssqlfdipsrrqnllou|~~}~~~~|}{usvz~|zxusstttvupljmruwwxzwsponjiovywoiggefilnruy}|yz||}}||}{wsopu|~}~~~}{|~wqmotyz{{}}vtvvsrrrpnnnmhb`envxuojghks{{tnknrwxusrvyyyz~yy|}~~|{}{wtv}zpigjkpuusnigjmmlmnnnoonquz}xurpqpopqty{{xy{zxx|}|}{vx}xttzyw{~~~}|{|zwuqoptwvqoqtspnmlmprty}}}|ytrtvzzytmgejrw{~yusrv||vuwxurqqty~z|xz~~}|xrkinu|~{ytooty|~}zvrokjklnqvz|xutwz{zz}}zyvrmklu||zyvtstv{ysppty{|utvwwy{zvsqrrsxzvvvvwvuuutpnnqw|}~ww~~zvroqtwy}|yvvx{||~}ulilrvwvspmkjkntx}}xvuw{}|||~~ysonooopqqqrvxxvsv~}z}~wtrsvy~{vuuwyz{{yussv{~xuuuwvvx{}|{|{z{{|||yspsx}}ysonrtux|~{tpqv|~||}~|z|xpnry}~wsqsxyrmknqssqswyxx{~}}~~}~zvqpv~zwwxz}{xxz~~zzyuqqv|}xssuvutsrtuwy{zxz{xvtqnmotyzzzzyvstx||~{y{~zy}~z{|~zvtx}|}~|}}yvxyyxutwzzwsqoprw{zvuwz~~ysmjkosx}~{uru{~~zwwzyvspnqu}|~~~{wz}|skjpw{~}{wwz}}zvsponmnry}yyzyxz|}yqiinuyxwurqqtx~~}~|zwsrvz}}~~{xwxz|~|xuuvyyyyxuqpruxz|}voosw|zsooqrstttttuwz}~{|}yy}~}}~|{|~~zvvz{vrsz|yvvx{|zywvwxwx|zxyzxwwwwwuvxzwrlhhkpv~|{{}|xvvwwy~~}{xwy|}|}~{xy|~~}~}xusrtv{}vstwyyz{zunhgjorvzzxtstx~}xtstuwy{~~}}~~|y{~~|}}yxx|}yy}~zyz~{wvx{}zz}~ytonrwywrqsutrqpoqtx||{}~{wtrty}}xuvx{~|{|||~~|{{|~xwz~}|}{}~~~}}~~}~{{zyuqqtxzzxtpnnqw~~zww{~zvtsrsx~~zz|}{zz|}|xuqmnqx~}~~~|z|}yxy{xplmqux{}~~}~~|zwvrnmou}zwx|{rlmrvyzxvuuvy~~|||{|~}{xvvvvuvz|yvuw|{utux{}|yvttwyz{|yvssw~|wwwvtsstuwy}~z{ztty}~~~|vvy}~zuux{}~}{yvv{{yxz{{zz{}|yyz}}|zz|||}}zvrty~~{vpkikrz~}}|xtqqsw~~{wuy~|{~}{xxz{}}vsrqsy~~|yuqqtw|~}xwwxy}~}zz{}~~}~~xxy||~~|||{{z|}xx{|zx|{{wuwz|~|y{{~{{}}z{|}{yzyww{~|}yuuz}~~|||~|vqsw}~}|xuvwx~}}~{xtrx{|}~|~~~}|}|xvz}}zyyyvtx{|~xussw~}|xwz}|xyxspqw}|xxvxz~~~xuvyzz}~}|}~~}}|{||zx{~}{{{w{~zvw{~~~yvuposxz{~|{}}{{}}}}}|zzzxz|}||yxx}|~|}}zuonrx|~zxwvv|}{zwtqvxyz}}~|{yyvx{}|{{{yvxzz}~zxuvz}{yxwy{}z{|wtsw{~}{yyz|~}~|xsstwx{~}{z||}~}|||{{|{zwu{~~yuz~}}~}~~ywtorw{|~{|}}|{}~{z{|yy{||{yx}~|~}|xslmry||xuuuv|}~yvsoswy{}z}}||xy}}{{|{vvxwz~{ytsv}|{{yz}~{}yustwz~|{xxw|~{||{vstwz{|{{}|~}z{|zyyvw}~zx|}{}}}~yytqtwz{~}y{{{~~~~~|yxz~~|{|}yvw|}~~}|}~|xrmot{}~{xvwwx|~zwspvy{}~~z~~}{wz}~zyz{ytwxwz}zwrsw~|yxz~{z{vsqtx{}}{xvvx}|{~~|vuw{z|~~}~~~|yw{}}~{{|zw|}wxz|}~~{yvpqswxz{|||}}||~~~zxz}{||}zxw{|}~}||~{uoosz}~}zxxvw~}z}zvrwxz}}~~|}|yux{|zzz{zvyyy{}{wtty}zwwy}~{|{usswz}}{xww{}~~yuvwyx}}}~}~~|{wx||~}||xy~~~xvzz~~~|xwqpsuwy~}~|}}||{~}zz~|{zzz~~zy{~{|}}~|wompwz~~zwvuu|~~|}{vquwx{}|}|yvy|~{{|~{vyxx{~|wstz|zwwz~|~{vttwz}~|yww||~}|wtuxzy~||}{~}{x{}}}|{zvy}}}xx{{~}~|}zxwqrtwy{~~}{|~}}}||zz}~}{zz||yy}}z|~}|~~ztnnry{~|xvwuv}~||ztqvwy|~{~~zwz}}{||~zuxwwz~|wrsx~{xx{|~|vssvx{}}xvuy}{}~}xuux{z}|}|~{xx|{~}|{|ww|}{wzy~}~}|~}zytqsvxx}|}{{}|{~}yy|}{{{~zxz}||~~~|{{~zsopu{|}{ywwuy~||}{utwxz~~}~|~~zwz{|z{|}zvxvwz~|wssx~~{xxz~|}{vssvxz}}yvuy}|~~zvvx{z~~}~|~~zwwzz}~~}}yx|}~|wxx{~}~{yuqrsvvz~~}{}}|z{~{z{}{zz}yy|~{|~~{z}~xqoqwz|~}{xxvuz}{}{tuwwz~}~~~}xwz|{z{}zxyvw{}wtty}zvwz~|}zvtuwy{~~yvv{}}~yvvxzy~~}}{~}zwx{{~~}xx{{~{xxw|}}~}zytqrtvw||{~}{z|{z||zy||z{~{z{}{z|toosxy~|xwvsw|}}}}vtuvx|~}~zxz||{|~{xyvvy~xtsx}~zvxz}~{wtuwyz}zvuz|}~yvvyzy~}}|{~~zwy{{~~}|wxz{~|yyx}~||~|{ytstuvx}~z{}{z}}zz}~~|zz~{z|~}zz}~{y{~xqoqvy|~~zwwttz}}ytuuw{~~}~|yz{|{{}}xxvuw}ztsv{~|wxz~}~|wtuwxy|~yvty|}~ywwz{z~}}|{~zwxzz~~~|wxz{~|zxw}~|}|{xtstuux~}z{}zz||zz}~|yz}zz}}zz~}zy}~wqpswy~~}ywvtv{}~}xuuux|}~~{zz{{z|~|xxuux~~ytsw|{wx{~}}zvtuwyz}~yuuz}~zxxz{z~}~zpc]__aflrz~zwroljlnqtvvtsw}xvvxwmbdhifdfhjmopsx{|xkb[XY_fjls~wog_ZZ^a_[eorngd`^^aeilnppnkhighmspd_adca_^^^acefhmrx}}wt|~}wromnqpmhdaaeltyz}~zrlea^`bdfikjhffeeluwndbgjjjklnosvvwz}xsv~}}{yz|thcglkhkrvuqonoortsolhfiotyyyyroosw{~zqrvyyxyyyz}}~xvxz|wqnoqvy|{|}sqvyvrswxxxy|}zrf[[cgecgnrropqsvxzxuqkhjnrvuw}zx|}xstvy~~ytpjggilprqtz~}sjjopkfhijlnoswz}~yqf^`hieekptsqsrtwz}|zvqquy}ztw{zutvx~~xpkecdfgklmruvqhejookjmorvwy{|}~}wqf]]elkjpv{|z{{z|~zuqux{~~||~~~|~wrsruzxtnifdfijnppuxzvlfhmoljmoqtuuxz{}{vka_fnnkosx|z{}|}|vpqsuyyy|y|{vrrsuzxupjfcehhknntxzxpghlokgijmoqruy{{rgeippmosw{yz{yy}~{uvy|||{}}ww{{wsuux~|yrjebdffilnsuvslfhmqompqux{{|~|wmdekssruy~~~~ztwz|~~~{{y|}{{}~~}}~}wsssvywtnieeikloqty{zumikoroprswyyyz|~{vjdgousqtw}}}vqtuvwx{~}}}}z~~zutttxywrlhdfijloqw||{tlkmqpmooptuuwy|}wlhltvsrtw}}|~}}~wvz{}~~yxwy}~~|~xw}~zvvvx}}ztnhdehiloqw{zxqkkossruvw{}}}~}ysjgmvxvvy}}wvz{{{|}zxvx}~xy{|{y|}~|wusuyzxsnifhlnqtu|{snmpssrvww{||||~zulgmvxvtvz}vtuvvvv}{{yz~~~~{~~|~{{~ywuuyzxtpjffilorsy}vomosrqsusvxxzz}}zslnvyxuuw|~}xtpsz~}zwyz|}xvvx~xjbbhoswz}~zwtx{zvqkdbdilpru~ytrty}}|w{~{wxz~zqljfflsvxwtqonntz{yvx}|vmedegiikmnlfdgkq{|rheipvz}~~{{~zsllswxvtv{~~zxvv|{wussx{zvux~|wohhknonprrnihlrzyposz~~}~{tqquy|~zwy{{z}}|}~|}zvrnqwzzxx{~|{}uqrvwvwy{xsnot{tnouz~}vv{~zwuz}zwpkjkptxy|xsqqtvvy}~|}}||xuqrx}~|}{truyxxz||wsrv}zqosy}~ywz~~ytqsyzxupkjkotwy{xronpstw|~~}}|wtsw|~}}}}~~}}zwz~~||}}ysru|wsv{yvx|~{urrwyvsoifgjosvy}yspopstvz}}{}~|}}yvvx|~{{{||x{~|}~~ztsv||uqsx|{usuz|}ztrrxzwsnigikptwz~xrpoquvy~~}yvwz~~{{z{}xuy}}{|~|xttxzsqtz}}|xwx|}~ysprxzwrnkjmpuy{~~xqooruv{~}xvx{}~}{z~|zz{}~zz~|~}zuruzzuvy~yxwz}~~xsruyytnlhilotw{}wqpptvw|}}xwz}~|}yxyz~}z{~}}zusv{}vrtw{|uuux{}}wssvzzuolijmpux||vpprvxy~|ww{~~|}~ywxz}~ywx{}}|~|yusw||urtw|wwxz}~}xsrvzzvpnlnqtx|~~xqpquxy~}xvy~}|}|zzzxxz}~|z{}~}~|xtru{ytvy}xwxz|{vsvyzwolkloquy|{tqqtxx{~{wy}~~|zwwx|}yz|}~~~{vssxxsqux}ysuwz|~|xtuy{ztnlknqtx{}wqqsxz{}yx|}~~}}~wvvy~~}~xvyz{}|}|wtru|{uqswz~xvxz|~{xtvzzyrnmosuy||uqqtxz}|xw||}}{z||vvw{}|~yx||}~}~{vrrv}{usuy|yx{~{y|~~{tppsux|zvvz}~{{~|}|{z~}uqrsy~|zz}{{{xsuxxyzzzwqopv~}tpptx{zuvz}}z{~}xroquw{~}wvx}|{~||}{{|yrqqu{|xwy}}z{}ysqvvvxyzwsopt|wqoswz~yx{~{z}}zuqrwy|~yuv{~}{||{{yxy}zsqrtz~ywx|~zz}}wswywxyzxtoosz{trtx{~zxy~}|}}zuposwy}zwvz}~||~|}{z{zspqtz{yy~{z}~wtwyxxy{xtootzyqorvy|xvx}~~}}}yupotwz~~zwv{~~}}~|}{z|ysopsz~xvw|zz}{uruwvuxzwsopu}xposwz|zxz~}~|xuqqwz~|yww|~}|}|{{yw{}vqoqv||xvx~}yz{vuxyxvzyvrorxwqrvz|}}zx|~~~zuroqvy}{ywx|~~}~}}|yy~ztpoqw~~zxz~zzzvuxxwvyyuqosy~uopuy{|~~{xw{~~~zuroqvz}~zyxz}}~~~~}|{yyzspnqw~|xvx~~zzyttuwvtxxuqptz~vopuy||}}}{y{}~{usqrw|zyxy|}|}}~||zxw|{tqopv|}ywx|~{z}xvwxxuwxuqpsyzrqvz}}}~}{z{~~~|urppty}{yyz{~}{|~~~|zx{|uqpos{}zy|}z|zwwwxvvxwsqrw~|torvz|||}~{zy{~~~ysrpru{}yzz|}~{{|~}}{yy~yspoov}~zwy||{|wvuvvtuvtqqt{yrpsx{|{{~}|{{}~~~wsrruy~{yz{|~}zz|}|{ywx}}wrpoqx}zxy}|{}xxwwwuvvtqqv}ysrvz}~||}|||~~~|urqrtx}~zyz||~|zz}~~|zy{ztqpos{~{z|~{|{yxvwvvvusqty{uqrvz}|z}{{{{|~~~ysqqsuz|yz|~~}zyz~}}{yz}~wrpopv~~|yz}}||xxvuuuutsqrw~}xsqty|}zz~||}}~~~}|urrtvz|yy{~~{xx}}}|zxx{wrqppt|~}zy|~~|~{zxvvvvtsqrw}zvtuy}~|z}|z}}~}~}~}vqpstw}|zyz~~~{xw|~}}|zz}xrqpqt|}{}~}~|{yvvvvtrqrw}~xustx|}|y}yx{}~}~~}~vqptuw}{yy{{xw{}}}{yz}wqppqt{~~|{}~~|zzxutuusqqsy}wutux|}{y}yy}~}}}wrrvwzyxy|zww|~}{|{yxz}}tppqsv~~~}|}}~|||xvuwurpqu||wwww{~~{z~|wy~~}}ztpruwz}xxz~~yww}~}||{zy}|rpprtx~~~}}|}|yutwuqpqv}zuvvwz}}{z}zuw|~}|}zuprvxz|wxz~ywx}|{|{zz}|rpprux~~~~||~{|{xtsvuqoqw~zuvwwy|}{z|{vx}}|}|wrswy{}wwz~zvv{}|zzzxx{~toprux}~~~|{~|}}{wsvvrnpu}|wwyyz|~|{{}vv{}|||xrqtxz}~xvy}|wvy~~{z{zy|xpoqux{~{{}|}|yttvtpnsy|wuxyyz}}|{}wtv}}|{}~zvqrvz|{vw{~zwx{|zzzyz~}toorvy}~~|z|~{{}{wsturnou}zvvyzy{}||{~}vuy}||}zvstx|~yux}}yvx|~{yyxxy}{sopsx{}~|z||}}{wsuuqnpw~zwx{{z|}}}||vvz}{||ytrtx|~~xux~}xwy~~{yyyy|xroquz}~{z}}|}}zututpnszzwvx{{z|}}}|wtv{~{{}}zwssv{}{vv{~{wx{}zxxxz~|uporw{}~|yz}{||{xsttrnpw|wuwz|{{|}}|{vvy|{||yvuuz~}xvy~}yxz~~zwwwx|}wrorw{~~}zy}}}}|zuttsoou~xvwz}}{|}~}~~wvx}{{{yvutw}}xvw~~}zxz}~{xwwy}}xsoqw|wmaZZ_mx{nhdehhc^^bjry||y~~~}yustrnikpolggigfhms{}|}}xusrnkie`^_aiu~||unid`^^^]\ZYYYXZakv{ztkddegjjhffggfhnpoolg`ZZ]dlpmjjnuz}|}~}vqld_^`dhkkkkheeefmw|yuqlhfdeks{}yqhabehkkhgilllqwyzywrlijnt{}yutw{~~{yy{{z}zz|~}}|yqjeda\Z\bgmpqqpmjjjjpy~~wy|~}{}yuuy~{y|~{yxyxw{}yxwy}y{}{vsqqpoopprrpnoqtvvwwwuohddb_]`gmsvwutqnmmmqy}}|~|ywyywy~}ytrqrw|{yzyvrrutpljjjiijilnmklnqtvwxxwsmggfcabipvz{yvtpoooqw~~}ywwxvwz~zwrpoorw{||yuuutpnqrojhhiiijijmnmmoruwyzzzxsljjhediqw|~|xvspqqqu}~{wvxwvw{}zwspoopsx{|{wuuuspoqqmihikkkkjmpqppruxz}}|{xrlllifhov||xurqrrty~}zwwxxwy}|xuqonopty||zwuttrppqpljijlllkkmqrqrtwz|~~}zsmmljgjrx~|wusrstu{~~~~~{xuvxwwy}~zvspnnopty{{yvttsqppqpljjlnnnmmoststwy|~zsoonkjov}{wusstux~~~~}|zwuwxwwz~|wtqoopqrw{||zwuutrqqrolklopponorvvvwz|}xroomklryxusstuwz~~~}|{xvwxyyz~yurpoprrv{}}|zwuutsqrqnlloqqpnnqvwwxy|~{tponkkpwytsstvwz}~}||zyvvxzzz}{urppqssuz}}|{xuuttrrrpnmpstrpoqvyyyz|~}wqpomlqw{tsstvxz}~~}|{zyvwx{{{~ztqpprtuv{~~}ywvuusrrqonquvsqprw{{{|}}wronmmqwzsqrtvy{~|~}|zzywxy|}}ytqpqtvvx|~zwvwvsrrqopsvvsqprx||{|}|vqnmmnrywqqrtz}zwuutv|}z}~wuutstuuwyxyz|~}yxy{|{|~yxwxwtsutsuy}~{{{~xtqprwz|{unilpu{}{{~~wpllmnomnnmjhmu|{vpmlmrvwvuttwyzz|}ztpqtvwxyz{}|{zzz|}~}wpkiikou{~}xqlmquz~yxxwwutsrolov}ztomlmquwwxwwz}{wx{}~~~~}{zyzz|}|y{~~~~~|yz|xtoihhkou{|unmquz~~|zxyzwwvx}||~|zxwxyz|~xtuw{|}}zvuwwwy{}zwttx}~~}zwsmjjmqv|zrnptx}}}|{{{~~~{xvwxyz|~ysqsv{}~~{yzyursttvx{{xusuy}zxsmlnquz~wpnqvz~}}}}}zwvwxyz}{uporvz|}}~}yxywsqrttvx{zwtsv{}{xsnlosw|}vporw|~~~~|yvuvxyz}~ysoorw{}}|~{xxxvrprtuwz|zwtux}}{xrnnrvz~{tppty~~~}}~~{wuuvxy|{vpnpty|~~}~zxyxuqqtvwy||zwuw{|{wqnpux}xroqv{~~~}~}}~~~}xuuuxy{|wrnnrx{~~}~|yyxvrqsvxy|}|yvwz}{xsnosw|yspptz~}~}}~}~~~~yuttwy{~|wsnnqw{~~}}zyywsqruxz|}|zwwz~~|yupotx|ztposz~|}~~||||}~~~yuttwy{~|wsonqw|~~{zywsqrvy{}~}{xy{~|yuppty}~ytposy|{{}~}||}{|}~~~yutuxz}{vroosy}~~{zxvsqswz|~~}{yz|}zxsoquz~|wsppu{~|{{}~|{}{{|~~}wusux{~xtpopuz~~}{yxurqsx|}~~}{yz}|zwsprw|~zvrpqv|~{zz|}|{}~zz|~~~}xusux|xtpopu{~|zxusrsx|~~}|{|~|zwtqsw|~zurpqv|}zyy{|{{}}yy{}~~~~yvtvy}{wtstx~}zxww|}zwttx}{wtrqtz~{wutvwwvx|zttvy{{{z~|{~~~zvtux|}wtssv|}zxwwz~{xvuw{|xusqsw~}yvtuwwwwz}vstwz{{z{~{|~~}xutvy}zussty~~{yxwx||zwuvy~}yvtrrtz~~{wutuvwwx}ztsuxz|{z}}z}~~|xuuw{xtrsvz~{xwwx}~{ywvvz{xutrsu{~~{wutuvwwy~yssvy{|{z}|z}~~~{wtuw{}wsrsw{}zxwwy~}zxwwx|}zwusstw~~~~zwttvvwx||urtwz||{{~z{~~~}yvtvx}ztrsuy~~{xwwx||ywwwy~{wutssuz~}~|xuttuvwz~xsrux{||{}{z}~~~~{wuuw||vrrtx||yxwwz~|ywwxy}{wutstux~}~}yvttuvwz~ytrtx{||{||z|~~}}{xuuwz~wrrtw{}ywwwy}}yxxyz}{wutttux~~}}}zvtttvwzysrswz|}{|{y{}}}{yuuwz~vrrtx||ywwxz}|ywxzz}zvtttuvy~~|}|zvtttvx{}xsrtw{}}|}{z|}||{xvvw{|uqruy}|xwwxz~~{xwyz|}xtsttvwz}|}|yvtttvy}{urrux|}}}}}zz}~||{zwvvx}ztrsvz~{xwxy{~}zxxz|~|wtstuwx|~}|||yvtstvy~ztrrux|}}}~|zz}~|{zzxvvy}ztrsw{~{xwxz{~~|zxxz}{vsrsuwy|~|{{{zvtstvzzurrtx{}~~~}zz}|{zzxwwy|{ursw{~{xwwy{}}|zxwz||wsrsuwy|~~~}|{{{wutsuy~{usrtwz}~~}{z|}{yyywwx{|vsrvz}}ywwy{|~|{xwy|}xtrrtwy{}~}|{{{yvtstw|}wsrsux|~~~{zz}~|yyyxxxz}zustx|~{xwxz|~~}{yxx{~{vrqsuxz}~}}}{zzzxussux~zurrsvy|~}{z{}{yyyxxx{}xtsuy}}zxwyz|~}|zxwx{~~yurqsvy{}~}~}{zzzxutsuzytrrtwz}~}z{|}zxxxxxy|{wtsvz~}ywwy{}~}{zxwy||xsqrtwz}~~||{zzywustw|}vsrsux{}~{z{~|yxxxyyz}~yuttx|~{yxxz|~~~{zxwx{~zurqruy|~~|}}{yyzxvtsuzytrrtvz}|z{}}zxxxyyz}zwutw{|zxxz|}}~~{zxwwz}~zvrpqux{~~}||zyzywutuy{usstvy|~}{{}~zxwxyzz|{wuuw{~~|zxxz{}}}|yxwxz}~zvrpqtx{~}||zyyywutuy{urrtvy|~|z{}~zwwwyz{}~zwvux{~~|zyxz|}}}~~{ywwxz~~zvrpqtx||||yxyxwutuyztrstvy||{{~}ywwwz{|~}ywvvy|~~~}|zyyz|}||~}zxwwy{}xtqpruy~~|}~{xxxxwutv|xsrsuwz}{{||xwvxz|}{wwwxz~~}}|{zyz{}}||~|ywvwy|{wsqprvz~|}~{xxxxwuuw}wsrsuwz}~{{}|xvvxz|}{wwxy{~~}||{zzz{}}{|}|yvvwz}{vsqprvz}|}~{xxwxwvux}xsrsuwz||{}|ywvwz}~{wwxy{~~}||{zzz{}}{{|}yvuvy||wsqpruy~~|}|yxwxxwvw|ztrsuwy{|{|}ywuvy|~|xwxy{}}{{{{zz{|}|{{~~zwuux{ytqpqtx}||}zxwwxxwwz}wsstvxz}~||~{xvuw{}}ywwy{}~|{{zz{{|}|{z||xvuvy}|vrqpruz}|}|yxwwxwwx|{ussuwy{~}|}~zxvvx||xwxz|~}{zzz{{{|}|{z|{wutwz~{urpqrv{}|~ynfcejpuxz|{}wpg`ZXY]bhpw|xtssuwwwvutsqpnljfcbchpw}zpga`aelsy~|qh_[XXY[]`dgkmmnpqqokjknrtsttspmjgc_\Z[^acdeffdcaadinsx}~{zyz{zyvrpppolhdbbfkry|zzyxxy{{{zxxwurnkjloqrrsrqomlifdcdhlprtuutromorvz}~yvuwz~}ztlfb``adgijjjjlnpomkiimqw}|ywttwz~~{xuuw{~}zyyz{|}}|zxxy}~|zvrmheegjoqqnic]ZYZ\`ehklmmprtusqnnrvz~~{yy{~}yvttuvwwwusrqrux{|}~}{ywtrokfb``cgknnlgb][Z\_chlnpqrtwyywtrruy}~~|z{}}{wtrrstuutrponpsvyz{{zxvtqolhda_adimoolgb^]^`chlorstuwz{zxustw{~}||}|{||zvsrrstuusqonnpswyz{{zxvsqolhda`bfkopolhc`_`bfknruvwxz||{yvtvy}}|{{{}||}~|zvsrrsuuutqonnptwy{{|{ywtqoliebadhmpqpmida`bdhmptvxyz{}~|zwvwz~}|zz{||{}~|zwsrrstuvtqonnpsvyz{|{ywuromjfccdhmqsrolgdcdfinquxy{{}~~|ywx{~}|zzz{~|{|~~}zxurqrtuvuspooprvy{|}|{ywtqolifdehmqttrnjfddfimqtxz{|}~}{xxz~~}{zyz||z{|}|yvtrrtuwwurpoprux{|}~}{yvsqnkhfegkptutqmifefimqtwz|}~}zyz|}|zyyz}~zyz}~|{xusrstvwwtrppqsvy{}~~}{yvsqnkhfgimruvtqmjgghkoruy{}}{z{~}|{zz{~|yxz}~|zwusrsuwxwtrqprtwz}~~}|yvsqnkighkptvvtpmjhhjmqtw{}}{{}~}{zzz|}yxy{~}{yvtssuvxxvtrqrtvy|~}{xurpmjhhjnsvwvsoljijmptwz}~|{|xrnklot{}{{{||zwrmigintz~~~|yvttuwz|~|yvtrpppsw}~{wtstx|~~ztolklmnprtvx{~|ywwxz}~{ywusqnmkklnpsvxwuqnlnrw||xvtuvxz{|}}~~}|zxvvx{~{yyyyy{||~|ywvwz}~|zxwutrqpprtwz}~}zvrqruy~~}~}zwutux{}~|xtpmllmpsuwy{}~~|{yx{~~|zywvwx{}}xtstx|~}{yyy{}}{zyz|~{xtqonnpswyywsolkjknqtvy{}}|z{}~}|}~}|zz{|}xutvz~}{zxwwwy{||zxvvwy|~~{xtqnllmoswxxuromllmpsvy{~~|{|~~}|{{|}}||}~}xuuw{~|{ywvvwxz{{ywuuvy{}}zwspnllmptwyxvromlmnquwz}}|}}|{zz{|~||}~yvuwz~|zywvvvxy{zxwuuvxz}~{xtqnllmptwyywtpnmnorux{}~|}}|{zzz{~~}|}zvuvy~}{ywvvvwyzzywuuvwz|~|yvromlmpswyyxurpooprux{}}}~}{zzz{}~~~}||~|xuux{}{yxwvvwxz{zxvuuwy{}~{xtqnmmorvyzzwtqpoprtwz}~}~~}|zzyz{~~}~}|||~zvuvy}|{ywvvvwyzzyxvuvwz|~}zwtpnmnptxz{zwtqppqsvy{~~}~}|zyyz|}}~~}{{|~}yutvy}~|zxwvvwxy{zywvvwx{}}zvspnnorvy{{yvsqpqrtwz}~~}|{zyz{}~|}~~}|{{}zvtux{}{ywvvwxyz{zxwvvxz|~~|xuronoqtx{{zxurqqrtvy|~~~}{zyyz|~||}~}{{{|~{wutwz~}{zxwvwxyz{zywvvxz|~}yvspnoqtx{|{yvsqqrtvy|~~~}{zyyz{|||~~|{zz|}|xutvz~~|zxwwwxy{{{yxwwxz|}zvspooqtx{|{yvsrqrtwz|~~|{zyyz{~{{|~}|{zz|~{wttvz~}|zyyz{}~~}{z{|~~{xustvz}}zwvuvx{~~|{yxwwxz}}ywwxz|~~{yxwwxy{~|xustw{}{zyyz|~~|{{{}}zvtstw{|yvuvwy|}{zyxwwx{|xwwy{}}zxwwwxz|~zwtsux|~|{yyz{}~}|{{|~|yvtsux|~{xvuvxz}}{zxwwwy|{xwwy{}|zxwwwxz}}zvtsuy}~|zyyz{}~~}{{{|~|xussuy}~{xvuvx{}}{zxwwxy|{xwxy{}|zxwwwxz}}zvtsux|~|zyyy{}~~}{z{|~|yvtsux|~{xvuvxz}}{zywwwy||xwwy{}}zxwwwxz|~zwtsux{~|{yyy{|~}|{z{}}zvtstw{|ywuvwy|~|zyxwwxz~}ywwxz|~~|yxwvwy{}|xustvz~}|zyyz|}~|{z{|~~{xussuy}}zxvuvx{~}{zxwwwy||xwwy{}}{ywwwxz|~~{wtstw{~|{yyyz|~~|{z{}~zwtstvz~}zwvuwy{~}{yxwwxz}{xwxy{~|zxwvwxz|}zvssux|~|zyyy{}~}{zz{}|yvtstw{~{xvuvwz}~|zyxwwy{}ywwxz}~{ywwvwy{~~{wtstwz~}{zyyz|~~|{z{|~zwussvy}}zwvuvx{~}{yxwwxz}zxwxy|~|zxwvwy{}|yustvy}}{zyyz{}~|{zz|~~{xussux|}zxvuvx{~}{zxwwxz}{xwxy{~|zxwvwxz}}yussuy}}{zyyz{}~}{zz|~~{xussux|}zxvuvx{~}{zxwwxz}{xwxy{~|zxwvwx{}|xussvy}}{zyyz|}~|{zz|~~{wussuy}}zwvuvx{~}{yxwwxz~~zxwxz|~~{yxwvwy{~~{wtstw{~}{yyyz|~~|zz{}}yvtstvz~|ywuvwy|~|zywwxy||ywwy{}}zxwvvxz|~}yvssux|~|zyyy{}}{zz{}|xusstw{~{xvuvxz}~|zxwwxz}|yxxy{}}zxwvwxz|}yussuy|}|zyyz{}}{zz{}~{xussux|~{xvuvxz}~|zxwwxz}|yxxy{}}zxwvwxz|}yvssux|~|zyyy{}}{zz{}|xusstw{~~{xvuvwz}~|zywwxy||yxxy{}}{ywvvxz|~}zvsstw{~|zyyy{|~}|zzz|~|yvtstvz}|ywvvwy|}{yxwxy{~zxxxz|~~|zxwvwy{}~{xtssvy}}{zyyz|}~|{zz{}~{wussux|}{xvuvxz}~|zywwxz}|yxxy{}}{ywwvxy|~}zvtstw{~|{yyyz|~~|zzz|~}zwtssvy}}zxvvvx{~~|zxwwxz~|yxxy{~}zxwvwxz|~}yussux|~|zyyy{}}{zz{||xvtstw{~~|ywvvwy|}{yxwxy|~zxxy{}~{yxwvwy{}~{wtstvz~~|{yyyz|~~|zyz{}}zwtssuy|}zxvvvx{~~|zxwwy{~{yxxz|~|zxwwwxz}|xussuy}}{zyyz|}~}{zz{}~zwussux|}{xvvvxz}~|zyxwxz}|yxxz{~}zxwwwxz||xussux|}{zyyz{}}{zz{}~{wussux|~{xvvvxz}~|zyxwxz~|yxxz|~|zxwwwxz}~|xussuy}~}{yyyz|~~|{zz{}}zwtssux|}{xvvvx{~~|zxxxy{{yxyz|~|yxwwwy{}~zwtstvz~~|zyyy{|~~|zyz{~|yvtstvz}~|ywvvwy|}{yxxxz|}zxxy{}}{ywwwxz|~|yusstx|}{zyyz{}}{zyz|~~{xusstw{~~{ywvvxz}|{yxxxz}|yxxy{~}zywwwxz|~|xussux|}{zyyz{}}{zyz|~zwussux{~~{ywvvxz}ujdbdhov~yrmgc``acgmt}~zusplifccccdfhkkjihkpsx}~xrkc^ZXZ^dmvztniea^\ZZ[^bgmquwvtojhggiijmnpqpqpomjfdccfimoqqponmmmnpruy~ztnhebacdedca_^_aekqx}yvtsuvy{}~|xrmhfeefhkmoprsuutrpoooruy}}{zxvuuuvxz}}|~|zxxyyzzzzxvsplhc_[YY[^beghgfffgjnsy~}|}~~}zywwwxz|~}zvtrtvz}}zxvsqppqrssrpmjhhhjkmnooonljgda^\[\_chlnnnmllmpsx|~{yxwwxy{|}}{xtqnmnqtxz||{zxvtqomkiiijkllkigeddegjlmooonmkifca``bfjnqsrqpooqsw{}{ywvwxyz{|zxtpmkkmpsvxyyxvtrpmkiggggijkkjgfddfgjlopqrqqomjheccdgkosuutsrqqsvy}~{ywvvwxz{{zxtpljjknqtvxxwvtrpnkihgghikllkigffghknprsttsqomjhfefhlptvwvtsrrsvy}|zxwvwxyz{zxuqmjjknqtvxxwvtrpnljhgghjkmmljhgghjloqstuutsqoligggjmruwxwutrstvy}|yxwwwxz{{zxtpmjjlnruwxxxvusqnljihhikmnnmkjhhiknqsuvwwvurpmjihikosvxxwvtsstvy}~{yxwwxyz{{zwtplkkmpsvxyyxwusqomkjijkmooonljijkmpsuwwxwvurpmjihjmquxyxwusssuw{~}{yxwxyz{||zwsolkmorvxzzzywusqomkjjkmopqpnlkjkmortvxxxxwuromjiiknrvxyxvtsstux{}zyxwxy{|||zwsomlmpswy{{{yxvtronlkkmnpqqpomlklnpsuwyyyywuspmkijloswyyxvtsstvx|}zyxxxy{|}|zwspmmnptwz{|{zywusqommmmoqrsrpnmlmoqsvxyzzzxvtqnkjjloswyzywutstux{~}{yxxxy{|}}{xuqnmnptwz|||{zxvtrpnmmnoqsssqonmmoqsvxz{{zyxuromkklorx~zvtrrtvz~|zxvuuw{~~~~~|ytpmkklotwy{{{{zywvuuuvxz~zvrmjhhjntz}yussuwz|}~|{ywvtrqqrtvz~}xspnmnprtvxz|}~~}|{z{}~{xwwwyyz{{zyxvtqomlmosx}~{xvtrqqqsvz}yurqrsuxz}~~~}|||~}zxxy|~{ywvuvwxyywurpooprtwyz{{{zxvtrpoprvz~~}{{{|~{yxy{}~{yxwwxy{}~~{xtrpqsvz}~|zxusqpppqsuuutrpnnprtwy{}}~}|zwurqprtx}~}}~}||}}zxvuuuvxz{{{yvrommorvy{}}}|zxvtrpoooqrtvvusqppqsux{}~~|yvtrqrtx|}|{|~~~}zwvtttuvxzzzxuqnllnqtxz|}}|zxvtrqpopqsuvwvtrqqrtvy|~~|zwtrqrtw{~|{z{}~~|ywutstuvxzzywtqnllnqux{|}}|zxvtrqppqrtvwxwusrrsuwz}}zwtrqrtx|}|zz{|~{yvutttuwyzzywspmlmosvy|}}}|zxvtrqpqrsuwxxwusrstvy|~~|yvsrqsuy}~|zyy{}~~zxvtttuvxyzzxvromlnqtx{}~~}|zxvtsqqrsuwxyxwusssuxz}~{xusqrsvz}}{zyyz}~~}zxvtttuwxz{zyvrommoruy{}~~}|zxvtsrrrtuxyyywutstvx{}~{xusqrtwz~}{yyyz}~~}zxvutuvwyz{{yvspnmoruy|~~~~|{ywusrrrtvxyzywvtstvx{}~{xvsrrsvz}}{yyyz|~~~~{ywuuuvwyz{{zwtpnnoqux{~~}{zxvtsrstvxyzzxvuttuxz}|yvtrrsuy|~|zyyy{~~}~}zwvuuuvxz{|{yvronnptw{}~}{ywutsstuwyz{yxvttuwy|~~{xusrrtw{~}{yxyz|~}}~~{ywvuuvwy{||zxuqonoruy|~~|zxvutsstvxz{{ywvuuvxz}}zwusrsux|~|zyyy{}~~~}}~|zyxwxy{}~~{xusstw{}{yxxxz|}}{yxyz|~~{xusstvz}~}zxwwxy|~}{zyz{~|zyz|~~{yxxxyz|~~|yvtssvy}~|zyxxy{}~~|zyxy{}|yvtssux{~~{yxwwxz}~|zyyz}}zyz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxyz}}zvtssuw{~~|zxwwxz}~|{zzz|~{zz{}|zyxxxy{}}{wtssux{~|zyxxxz|~~|zyxyz|}zwtsstw{~~|zxwwxz}~|{zzz}~{zz{}|zxxxxz{}}zwtssux|~|zyxxyz|~~|zyxyz}|yvtssux{~~|yxwwxz}~|zzz{}}zyz{}~{yxxxyz|~~|yvtssvy}}{zxxxy{}}{yxxy{~~{xusstvy|}{ywwwy{~}{zyz|~|zyz|~}{yxxxy{}~~{xusstw{~~|{yxxxz|~}{yxxz|~}zwtsstwz}~|zxwwxz|}{zzz|~{zz{}}zyxxxy{}}{wussux{~|zyxxxz|~~|zyxxz|~}zwtsstwz}~|zxwwxz|}{zzz|~{zz{}}zyxxxy{}~}{xusstw{~~|zyxxxz|~}{yxxz|~}zwtsstwz}~}zxwwxy|}{zzz||zz{|~}{yxxxy{}~~{xusstwz~}{yxxxy{}}{yxxy{}~{xusssvy|~}{yxwwy{~~|{zz{~}{zz|~~|zxxxyz|~}zwtssux|~|zxxxyz|~~|zxxxz|}yvtssuw{}~|zxwwxz|}{zz{||zz{|}{yxxxy{}~~|yusstvz}}{yxxxy{}~{yxxyz}|yvsssux{~~|yxwwxz}~|{zz{}~{zz{}}zyxxxz{}}{xusstw{~~|zyxxxz|~}{yxxy{~~{wusstvz}}{ywwxy{~~|{zz|~}{z{|~~{yxxxyz|~~|yvtssvy}}{yxwxy{}~~|zxxxz||yvtssux{~~|zxwwxz}~|{zz{}~{zz{}|zxxxyz|~}zwtssux|}{zxxxyz|~~|zxxxz|~}yvtssuw{}~|zxwwxz|}{zz{}~{zz{}|zyxxyz|}}zwtssux{~|zxxxxz|~~|zyxxz|~}zvtssuw{}~|zxwwxz|}{zz{}~{zz{}|zyxxyz|~}zwtssux|}{yxwxyz|~~|zxxxz|~|yvtssux{~~|zxwwxz}~|{zz{~~{zz|~~{yxxxy{|~~|yvtssvy}}{yxwxy{}}{yxxyz}~{xusstvy|~}{yxwxy{~~|{z{||zz{}}{yxxxz{}}{xusstwz~~|zxwwxz|~~}{yxxy{}}zwtsstwz}~}{yxwxz|}{zz{}|zz{}}zyxxyz|}}zwusstw{~~|zxwwxz|~~|zyxxy{~}zwtsstwz}~|zywwxz|}|zz{}|zz{}}zyxxyz|}}{xusstw{~~|zxwwxz|~~}zyxxy{}}zwtsstwz}}{yxwxy|~~|{z{}|{z{}}{yxxxz{}~~{xusstwz}~|zxwwxy{}}{yxxxz|~{xusstvy|~}{yxwxy{}~|{z{|~}{z{|~~|zxxxyz|~~|zvtssux|}{yxwwyz|~~|zxxxy{~|yvtssuw{}~|zywwxz|}|{z{}|{z{}}{yxxxz{}~~{xusstvz}~|zxwwxy{}}{yxwxz|~|xvsssux{~~|zxwxyz}}{{z{~|zz|}|zyxxyz|}}{xusstw{~~{zxwwxz|~}{yxwyz}~zwusstvz}}{yxwxy{~~|{z{|}{z{|~{yxxxy{}~~|yvtssvy||zyxwxy{}~~|yxwxy|~|yvtssux{~~|zxwxxz}}{z{|~~|z{|~|zxxxyz|~}zwtssux{}{yxwwxz|~~|zxwxy{}|yvtssuw{}~}zyxwxz|}|{{{}|{{|}|zyxxyz|~}zwtssux{~}{yxwwxz|~~|zxwxx~wi]WSSYbnw}{zywwwwuphn}~{vsqonooplc^kzwjcbdjqv}~yurpnmmlidcp|tmigefgilllkihhiknqsttojlvwmfa`acddddccbabbcegjnrw{zsljr~{ywtrolkjijklnoomlhecgs~}zwtompw~vnifffghiijjjjjlnpsvz~wqmnv~zwvy~~wpljiiiihhgfedccccdfhjlmnnlifeekt~}}||||}~xroqw}|{{{}}yvsokgdcflrvuqkfb```abcccccddeeghjmoqrsrpmjhhlt{uqrv~|yxvvvwy|~~|zwurokhd`^]_elpqnjeba`abcdeffgghijklnprtuutroljjmt~|vsrv}~{ywuutuwyz|}}|{ywurpmjfb_\[^cjprplhecccdefghijjklmnoprtuvvuspmkjms|~xtsv|~|ywvutuvwyz{||{ywuspmjfc_\\^cjpsrolhfeefghijklmmnopqrsuvvwvtrolkmr{~yutv{|zxvuuuuvxy{{|{zxvtqnjgc`]\^cjptusoliggghijlmnoppqrsttuvvvvtromlmqy{vuv{}{yxvuuuvwxz{{{zywurolhea^]^cjqvwvroljiijklmnpqrrsttuuvvvvvtrpmlmqx~{wuvz~|zyxwvvvwxzz{{{zxvtqmjfb`^`djqvxxurolkkklmnopqrstuuvvvvvvvtrpnlmpv|xvvz}{zyxwwwxyz{{|{zywtrnkgda_`djqvyywtqommmmnopqrstuuvvvwwvvutrpnlmpv}|xvvy}{zyxxxyyz{||{{yxusplhebaadjqvz{yvsqonnnopqrstuuvvvwwwvvusrpnmmpu|{xvvy~~|{zyyyzz{{|||{zxvspmifcbbejpvz{{xvsrpppqqrsttuvvvwwwwvvutrpnmmpu{{xvvx}}|{zzzz{|||||{yxvspmjgdccfjpvz||zxvtsrrrssttuuvvwwwwwvvutrpnmnpt{}yvuux|~{xurpooqu{~}}}}}~~~~~~}}}|{zywusqpoquz}{zyyyzz{{|||}||||{zyxwvwz~~zwuttw|}{xurpooquz~~~~~~~~~~~}}}|{zywusqppquz~|{zzzzz{{||||||||{zyxwvwy}}zwuttv{}zxurpooqty~~~~~~~~}}}|{{zxwusqppqty}{zzzzz{{||||||||{zyxwvwy|}zwuttvz}{xuspooptx~~~~~~~~~}}|{zyxvusqppqtx~~|{{zz{{{||||||{{zzxwvvvx|}zwuttvz}{xusqoopsx}~~~~~~~}}|{zyxvusqppqsw}}|{{{{{{||||{{{zzyxwvuvx{~|zxvttvy~}{xvsqoopsw|~~~~~}}|{zyxvtsqpopsw|~}|{{{{{{||{{{zzyxwvuuuwz~|zxvuuvy}~{yvtrpopsw|~~~~}|{zywvtrqpoprv{~}|{{{{{{{{{zzyxxwvutuwy~~}|zxvuuvy}~{ywtrpppsv{~~~}||zyxvtrqpopruz~}||{{{{{{{zyyxwvuttuvy}~~}{zxvuuvx|}{ywtrppprvz~~~}|{zywvtrqpopruy~}|||{{{{{{zyyxwvutttvx|~~}|{zxvuuvx|}{ywurqppruz~~~~}|{zywvtrqpopquy~~}||||{{{zzyyxwvutttvx|~~}|{zxvuuvx{}{ywtrqppruy~~~}|{zywvtrqpopqtx}~}}|||{{{zzyxxwvutttux{~~}|{yxvuuuw{~}{yvtrqpprux}~~}|{zywvtrqpppqtx}~}||||{{zzyyxwvuuttuwz~~}|{ywvutuwz~~|zxvtrqppqtx|~}}|{zxwutrqpppqtx|~}}|||{{zzyyxwvvuttuwz~~~}|{ywvutuwy}~|zxvtrqppqtw{~}}|{zxwutrqppqw{rmjjmsy}~}vqnkjklnmgao~|yvvtqpnmj`SRbpkdgmu~yrmifffeb]]l}xtpmkkkkkkkkjkkllkid\VXfrqkhghkmnmkihgfffghjkmnopqrtuvvurleeq|zywvtrqpnmlkjjihfb_]am}~zvpjc\Y]fputqnmnoooonnnnooqstuwxz{|}}}|yupkhjr}{tnlou}|yxvtspnmkjihhhhijjkkkkkjhfca__dnz~xtsw{wrmkls{|xtnhb\[^dlqsrpnmlkjihggfgghijlmnopppponkhebbemx~}~ytomns{~}||||||||||{zywuqmhb\XVX_fmppomlkjiihhiiijklnoqrstttsrpnjgdcfmwzuqnosz~}|{zzyyyyyyyxxwvtrokfa[WVX^fmpqponmllkkkkklmnoprstuvvvutrolhedfmv{vroosy}|{zyyxxxxxxxwwvusqnkfa\YWY_fmqssqponnnmmmmnopqrsuvvwxyyxvsplighmu}}{xuqnlknt}}{wspnnry}ytpmkmry}zwsokijnt|~}{xvromlot|}{xtqopsy|yuqnmnrx~~|zwspmkknt{~qf\XUUX]ekv{vsqruxytnv|vpmkjkou|~}|{{yxqfbo~|rnorx|{wutuusnmxzsmga^\\aglruwxxxxyxuqibcnz{skebba`_\ZXVTSQRTY_gntxz{|}}~}{vqpy}zuplheefhmquwwwwvvvurnmpz}wpjfhox}zuojfdca`__^]\\]_djqx~~yust|~~}|{{}}{~|wsolheb_]ZXWXZ_ekptvwwwvusqoos{~{zxvtsqpoopsw}|xuv|~|zxwutrqoooqty~~zuokikqx}~{vplheb`^][ZYXXY]agnswz{||{ywtrqtz}|zyxy{~zww{|yvtrqomljiijmquz}~}zvrniecekrxzxtokheca`^]]\\\^aekqvz}~~}{yvsrtz~}~{xw{|yvsqomkjhgghjnrvy{|{ywtplgcbdiqwzyvrmkhfdcba`__`adhmrw{~~|zwtsty{xx{}yvsqomkjhgghjlptwyzzywtplhdcdipwz{xtpmjhfedccbbcdfjnsx|~zwuvy}{yxwuttstuwz~~zwvx|~|zxwvutsstux||yvvy}{yxwuutstuwz~~{xvx||zyxvuttttvx|}ywwz~|zxwvutttuwz}~{xwx|}{yxwvuttuvx{}zxwz~|zyxvuuttuwz}~{ywx|~|zywvuutuvx{}zxxz~}{yxwvuuuuwz}|yxx|~|zyxwvuuuvx{uh_\]dozzrkgdcdgkmih{}{|~|xtponlllkjd[^sysrtv{~~xqlhffghgdh{ztqqtvxxwusqomlkjjjkjgd]Y`p|zrlheca^[WUVY^djnqrqpponnnoopqpmjgkz{xwwx{~}zvspnljjiihgecdkz}ytogb]]coy~{uojgda^\[]aflrvz{{{{{zzyxwvspliinz}|{|~ytqry|vqlhda`beimpqqponmllkjjigeccfnz}xuw}~zwtssuy~}zvrnkkpy{xvtstw|}{xtpkgb_afoy~~{vqlgc`]\\^afknqrssrrrqqponljgfhnx}yuqmmpx|xurpooquy|~|zxvspmid`\Z[`irxzyupkgda_^^`dhmqtvwwvvvuutsqnlihinw{vronpw|xtqonnoruy{|}|zywusqnkgc_[YY^gpwzyvrnjgdbaacfjosvxyyyxxwwvtrpmkijnu|xspnpv~}yuronnoqtwy{{{zxvuspnkgd`\ZZ_fovz{xtpmigeddfhlptwyzzzzzyzyxwtrollou~|zxwwy||yvromnry~{ywwxz}~{xtqnmou}|zxwxy{~|yvronnry~|zxxyz}~{xuqonpu}}{yxxy|~|zwspnorx|zyxy{}}{xuroopu|~{zyyz|~|zwsqoorx}zyyy{}}{xurpoqu|~|zyyz|~|zwtqpprx}{zyz{}{nc][_gr~|vnkhgiilnlmv|yvvx|{vsooppsvy{uhhzumlnpsuuvwz~vplklptxwst~wqmkmqtwwwvsqomlkkmosuvslfjxvke`\ZWTQNMOT[cinqrrqponnoqtw{}}yuv~}~zvrppruy}}yvspnllmnprtsqqv~|yupjhmv}}vnf`\YVTSTW\cjqvz{||{{{{{{|}}|yvuy{xvtssty~}}{slgb^[YZ\agkoqqqponmmmmnoppoprxzuqnllmqv|}{ywwz{vromllosy}|zxvspmjkpv}|wpjd_[WUUVY^dinqrssrrrqqrrssrrqsx~{yxy{}zxwzzupmjiijnrw{~}|zxvtsqnlifdeipvzyuoid_[YWWX[`flptuvvvvvuuuuuutsrsw~}}~~}~~{xxzzupmjhgikotwz||{zywusrpnligdbcgnuyyvrlgc_][[\_chmruwxyyyxxxwwwvusrsw}}{{|~{xwy~{vqmjihiknrvxzzzyxvusqpnligdccgmtyzxtojfc`^^_aejnsvxzzzzzyyxxwvutssv|}{{{}~{xwx}}xsoljijknruxyzzyxwutrpnljgecdgmsy{zwrmifcaaacgkptwyz{{{{zzyyxwutrsv{~|{|}~{xwx|zuqnlkklnqtwyyyyxwutrpomjheddgmty||yuqmigeddfilqtxz{||||{{zyxwvtssuz~|{{}~{xww{{wspmllmortwxyzyyxvusqomkifeehmsy}}{xsoligfghjmqtwz{|||||{zyxwutssuy}||}}zxvwz~yuronnnpruwyzzzyxwutrpnljgffhmsy}~}zvrnkihhiknquxz{|}}||{zyxwutrrtx~~}}}}zxvwy~{wtqpopqsuwyzzzyxwvtsqomjhggimsy}|xuqnlkjkmoruxz{|}}}|{{zxwutsrtw}~}~|zwvvy}}yvsqqqrsuwyzzzzyxwusrpmkihgimsx}~zwsqnmlmnpsuxz{|}}||{{yxwutrrsw|~~|ywvvx|{xusrrstvxyz{{zzywvtsqnljhhjmrx}|yusponnoqsvxz{|}}}|{{zxwutrrsv{~{yvuuw{}{zyyz{}}{ywuttux}}{zyz{|~~|{yvuttv{~|zzz{|}}{ywuttux}}|zzz{}~~|zxvuttvz}{zz{|}}{ywuttux|~|{z{{}~~|zxvuttvz}|{z{|}}{ywuttux|}|{{|}~~|zxvtttvy~~|{{{|}~}{ywutstw|}|{{|}~}|zxvtttvy~}|{||~~}{ywutstw{~||{|}~~|zxvustuy~}|||}~~}{ywutstw{~}|||}~}|zxvtstux}~}||}~~|{ywutstw{~}|}}~}|zxvtssux}~}||}~~|{ywutstvz~}}}}~~}|zxvtssux|~}}}~~|{ywutstvz~}}~~~}{zxvtssux|~}}}~~|{ywutstvy~~}}~~~}{yxvtssuw|~}~~~|zywutstvy~~~}~~~}{zxvtsstw{~~~~}|zywutstvy}~~~~~}{zxvtsstw{~~~~}|zxwutstuy}~~~~}{yxvtsstwz~~~~}|zxwutssux}~~~|{yxvtsstvz~~}|zxwutssux|~|{ywvtsstvz~~}|zxwutssux|}|{ywvtsstvz~~}|zxwutssuw{~|{ywvtsstvy~~}{zxwutssuw{~}|{ywvtsstvy}~}{zxvutsstw{~}|{ywvtsstvy}~}{zxvutsstwz~}|zywvtsstux|~}{zxvutsstwz~~}|zywvtsssux|~~|{zxvutsstvz~~}|zywvtsssux|~}|{zxvutsstvz~~}|zywvtsssux{~}|{yxvutsstvy}~}|zywvtsssuw{~}|{yxvutsstvy}~~}|zywvtsssuw{~}|{yxvutsstvy}xneaacjr|zvrpopqrnjl~}{{{~|yxwvvvwvnbar{pfegjoqtvzytqpqrtqlm}~yurqrrtvwxyxxvutssstutrnf_bpxpe_YWUTSRQRUY^chmqtuvwwvvwxyz{{ytno|~|||}~}ywuuuvwz|~~}{ywvtsssssrolkp|~yslebfowwqib\YWUUVX\`ekpuz}~zvqps|{wvttuvy~}yx|~voiea_]]_adhknprstttttsssrqomkmr||}{vspoopruy}{vsrt{{wsponopsw{|xtojffjpvywrlfa\ZXXXZ]aeimpsuvwwxxxxwvtronnrz}{{{}}xusuz{vrolkklnqtx{}~|zxuqmhc``cjpttpje`][ZYZ]`chlpsvxyz{{{{{zxvtqoory~}~~yutuz}wsolkjkmoqtwz|}}}}|zywurnjfb__bioturnhda^]]^`bfimquwz{|}}}}|{zxurporx~}}~zvtuy~xtpmkkklnpsvxz{||{{yxvtqnjfb`_bhotvtqlhdb``abehkosvy{|}~~~~}|zxuspprw~}|}~zvtux~{vromllmnpsuwyz{{{zyxvtrokgca`chotwvsokgedccegjmptwy{}~~~}|zxvsqprw~}}}~~zvtux}}xtqonmnoqsuwxz{{{zyxvtrokhdbadiouxyvrokhgffgiknqtwz|}~~}{yvsqprv}~}}~~zwttw|~zvrponopqsuwxyz{{zyxwurolifccdiouyzxuqnkihhijmoruwz|}~~~}{yvsqpqu|~~~~zwttw{|xurqppqrtuwyz{{{{zywuspmjgdceiouy{zwtpnlkjklnpsuxz|}~~}|{xvsqpqu{~}zwttv{~zwtsrrrstvwyz{{{{zywvsqnkhedfjpvz||zvspnmlmmoqsuxz{}~~~}|{yvtrpqtz}zwttvz|xvtssstuvxyz{{{{zyxvtqoliffgjpuz}}|yvsqonnoprtvxz{}~~~~~}|zxvtrqqty}zwttvy~{xvuttuvwxyz{{{{{zxwuromjgfgjouz}~}{xusqpppqstvxz{}}~~~~}|zxvtrqqtx~~|xutsuy~}|{{{|}~}zxusrsv{}|{{||~~|ywtsrtx}}||||}~}zxusrsvz~}|||}~~|ywtsrtx}}||||}~}zxusrsvz}|||}~~|yvtsrtx|~}|||}~}zxusrsvz~}||}~~{yvtsrtw|}}|}}~}zxusrsuy~}}}}~}{yvtsrtw|~}}}~~~|zxusrsuy~}}}}~}{yvtsrtw{~~}}~~|zxusrsuy~~}}~~}{yvtsrtw{~~~~~|zwusrsuy}~~~~}{yvtsrtv{~~~~~|zwusrsux}~~~~~}{yvtsrsvz~~~~|zxusrsux}~~~}{xvtsrsvz~~~}|zwutsstx|~|zxvtsrsvz}|ywutsstx|~|zxvtsrsvy~}{ywutsstw|~|zxvtsrsuy~~}{ywutsstw{~|zxvtsrsuy}~}{ywutsstw{}|zxvtsrsuy}~}{ywutsstw{}|zxvtsrsux}~}{ywutsstvz~}|zxvtsrsux|~|{ywutsstvz~}{zxvtsrsux|~|{ywutsstvz~~}|zxvtsrsux|~}|{ywutsstvz~~}{zxvtsrsux{~}|zywutsstvy~~}{zxvtsrstw{~}|zywutsstvy}~|{yxvtsrstw{~}|zywutsssuy}~}|{yxvtsrstw{~}|zywutsssuy}~}|{yxvtsrstwz~}|zxwutsrsux|~}|{yxvtsrstwz~~}{zxwutsrsux|~}|{yxvtssstvz~~~}{zxwutsrsux|ʹѰcpblvbZrXlciyqWby{zhgqowweslc?ggtrybN{^Xdfn]_k^hgGSs]VUb_ovVOYyoyv/=jNzmvzp_Vs|ciyoeeriowu]hzdYevo~ic^::luMIJMfeqLTYuūz~z~gDi|r`jPTJNTSw{ke]K]oVe`uql }[amueT5*BXvh_KOQLOjXl\moXqbmsa:SZ{k`^b[nu}eb{d^fnst]t¼zpzfd`{NPYANi}ph`jQ^oiFU|qoi][LiWaum}`rkN]z}}mtuco{Zmwd{mmtylrU`]]z}c=U\\tpc{h\krvx|[hO_J>ONKOTZ?Y\Rupyxi{g{mzwvojgaWga|sqtu~wf_gd\zpx_f^aPEA:Q7QCHaM\alv}q{ss}y}guffoSYvu}d|ipuowloco{gTjRb[?FTGKHS[LlXYh]{rpzhyrv|lq\USa{n}vvws~|gz]kvuh^i_iPL@TI=P3LMQd^idwz|{wswfpt~|xeyeQcmi{|s}ohuxxmhxpSh`^pSO_TKIAQAW]NlWn{sjxycw~zzzt\XZqZusnz}xk~wqqprak^hUKFXWCX7@BD\Xd_e|rw{zigl|~{~qycoj^hbvys{zqu[pa^pUVdVVTM\M[RHcLaquixyzso~}w~w`ZglSn]]ipx}isz~hhlep\SSjTR\GLGidb}ottnlknsuodrqq]^uan}s}y~wy~q}ryiad]YjfeJSY@MZOP__cqki{vwvyru{zfzjXR^h_dkcirjrzzycctgYq\QL\\RTRBIHEdYZwr~y~tplgkyxsfpsmXZp]eztr|x|ow}y}jehe^npjQU^ADPCFUY_ooh|}||{xytlr{m{zcX`i^agg`ng~m}{n{tZmiWQ^cVTSF:A:W[Pnw|v}wkxieyz}zro}udUk^Sfhexy{}y}ukkh^dpiVQdMEQFDQQT_kaqvzzzzp~oz{qzj_fn`_``R_]umxvx`rp_Wfe[YYQ@D=UTE`ktsk{nzki}yy}}|rp~ubZn\Sd`ctstwt|x~tuqqemwlX]fKEL=GMMP]jcuzi~{zzm~uh~stogwmebd]QZ\xrf{uuk|obdsbcZ]I@?FYFHbhrblr{yt|xmx~rxyt}ts`mkPRUOegoo{~n~~wpfwqa[o_MUJITJKH[Uaobh~{w{{lukiuqz{p~xmkdbIMNgl]s}r}yvu~mjxhjdi[KKM^J@TX`R]gprwy}utyr{gipv~tguv\XWOb\c_owswlsxgevdRVJQXPSL^U\bS]vuqw~xl|mknk~}ywrrnTTSf\Oeowhnwy~tz~lrfoZPOZcLN[]XFWVd^j|xuz}}{{{}gjnwxrw_]SV`U_Wnpryhiz|yjp}j^`Ud]XUO^RXSDUjkj~~|}|skhfe{s~~vwqYXYiZNajp^glnui}{u}t{nzh^^fjQOZ\SARKZV^rnk~~yhhj}{m~|wljccmX^O^eem`]u}y}z{yt``Xhh^cUhb`YCF[``qxnx}wxnpj~rttuzlgfphMS\bWVhasfs}us|{xw`afseT_ccKQPJRDX__jv~|}orylgw{zih`rjcbUidhdT^qtsxzwjhdwgi`Yh`bTCNZYYmfmxv}}tlinnzox}igkxjV]abPYa\kYgnkry}kjoyfX_a]IXRQUDUWWf|wlqs}}mp{ojv}|s}roi{ojiVe`a\OZnro|xsxpiexjnlbrjh[IO[ZWe^bsmxv|vqpryqk~~yypr{t]]`^NP`Vk_bjglvqtvnp{r`fkiTW\N[EHMLVp{qsvxuwufmsugzxqjuwhvblphaONbnowwi~tw~}tukr_poj_LP_a[bZTke~zsqpqvynxn}~srzxeeklZT`PbXWb_dwzuvvbchhW]`RdPOQLRfmfimxw{tirxvgzxx{|wykvanrlbNO`ijtoexlzvvwgyxtdQTaebfTWaXsrs}zxqznl~|zmhysbeigWc^TdRX^_gvujlo}vjnpj`q]\^JPLKWfc^gqlflqhk{k{wzwr{qj{wr_QXbdhn^pmg{rv~|~kryvo_\ehei_QbSblit~z|wzzl|rel{nknpcjnXcQJPQ\pwkhl~u|tppk`tkhoVVUTZc]QRZvvy}yrsslp~ivqfot|xiwvse[bheddSgheyoq{}pu}}~tdepslm`YgQ\`Xaq}uv{q}zyogoy}vvpmjaspes[RPOXhkb_`suqu~sp~isr\YSWdl`UT\latzpvvwsfvyomgjlx}}|ufclrmh\QdW`pfgpztotyx{thlx}yt]akYhd\_gidhqwt|||lhs}}|xj|~vk{qiv`XQMVde_`drhf|ls~~y{wpy|kjc_fneYTXcScoi}~w}{u}zkqeccl||xifpxxtfRbWWkhjnpgcionmqow~nfo[el`]`bYZgqr{{wwjn{{hrzo}wy{sy{i|tec][`bXTXgl\olk}|rrtngghlqnfdcj[RdV_tzzux{yyv{vvqpljrzxt{|zjiszzwedgO[a]dmma^gpoxrzy{lvt^nojig]POV`f{zzsuz~{kyqi}}|z}kykca`flg\Y[ie^p`^pwwno}wolmu{rb]cm]XfU[jstpv{z}jhkov|ytv~{sqtxxvfksZ`e`bgi`[Z^cur|lv{gokeileWRVY\st||xt||xn|{iz~~~|xsvwgffjpqdWV_^Tlkajnrpowpkjoz~ulfmg[iZP\adfo}zyzpjlv|qnr{}|qr{|wsigwebj`]`b]]bdbivyyx|pr}ks|rjji^UPQR_rm|sv{jwmwyvz~qi`^fqvpjddaQ`bZfkgdiwzruzyrnmobWneY_a_Z`sw|sokq~|wwsqsqyxfevfitogb`VPT\^gtiy~z{w{~hryurld]\]ZVdj\txz}w|q{vp{z|uou||~u~vngiprkfglZQeYWfmj``p~}}~usy|e`hY]b^WT[k}}zyyz{zwuvzwhy|syx}|jrl`qpllg[RRTYatnauvrtvvuzzztbTUYX\gZcrmuzzju}|ytmlpz}~nnqrstonotm[bXMW\a_`fo{xxsszolu^\hh_ST`jr}z{ut{vylsufp{~z|tvdrvtrqfTKLMPgiduliqw~||xyzpe][]goX]fZ[fvxy~}vgcegnyss|zlgkujaq^RZ[WSZgoosrwxzmv{ebad`ZZ`fihf~|~zt}zqqhrttuyzt{pvpptrh`ZSPVcX_pc[\jzynjg`Xeo_jgZZ[fz}|z{pjhik||{{wsytrxngsc[[VSLP^lqmaiw{sx~push]\aggecZiwqzpxilmlfk|x{y~ustma]\UP_WTheba_iyzw{umormmo_ho\SSZes}}xqnlgcqvj~||ywpbuqcih\NLS\fmj`nnm~xqkuvm^Zfooi[[mbm|xvuxyqidgsry{tngfecafcOZ]RV]djqw{wunjjlyu_mpfa[]fjhoz}nottpxphwstxy~{veqgcigcWNU^`cacufe}~z}xtwvsidcjqpb_j\bqyjqyxmcgqx~|}~uc\^a^goZ]aVSVanskhruutrmx}kqgZ^_bfjjin{yngko}yhxwmpyyu{|qyl_imh^[\\_a[Wnneoqyx|rwungioqkjgcqd]oqs|ttwvnjltxxt|yy}vha_ahrcbhSNOS_ourns|y~xpmrxkv|i]\emofadlut}{yrkzpwrfggs{l{xbbcda\aig_[Tbecvxrvzuw}{uidlvxpa^sjajilov}~{|y|tlkpwyvvnoxnkh_Y_pdgqdXQV]cfimqsk}}w|}irujd\\jtqigoqez{utwwrxts{likqy{n{sqriaZ^ejmjYTeYYmqsrqtx|}|~_NMG`t~~xoab{ázuvSRoUot^c]`MQVgT=Dct[FbwaTNebZgf~žƼrv]SwKrePKMANjlyt|mrTYx[La|`k}Zcw^UY\alu`>JheV^oumy}zsrhZfoA_~pklusw{|_dmtk]T[wo`N^ltrlgj|kSbsx|x{zdJ=Ef{}gh}h`dURb^J_||{nbk~j^lnblipyhZ\lic{mSIYozkUSFBOdosu}uhopxqqssso[U^jkfhllo~yhxyt~uruyx}ws{~z|jSTMS_emtkWNKKAMc]_ittleemwǸ}{{v]YXM[\UbfghegqwxwwwvvodYSUUYf[ZYOLIFEHMON]qghldis®o`^WLFGNQ^iconhffoz~bNGKUZXTKEKB>OLOWSQU[cfirs½~nZ\]GDJNJL]jpvvjr|yww|tdUJ[WJVUJFHCBBFZZS[VZbhpz¸udVSVXbTO`ZWakr|zvz{}~yjehni_WX^`QRV??GFFIRZ]`kksuõu||f]^`YQNT]`bev|s}~xthuq[^\\^[TLC<>AMQQeaUXdp{}|~xqlcWYh_V[SPQYl{~{vwx}~qkmsl[SU]SU]OJIJE@IYcc_]o}s{w|zlkbXVVY\[]]Wlwr~}}~x}pwljk]WY\VNONEFSHI[WURTfx~}~tmmja^c[egVRTYbqxv{w{z|~zvuusndbYR`VMTNE@BHT_d]WilstuxqaRWaeb\T]gas~}z{{wu{xkvwlb\VROMNMQKHUQRWY[`kptxzttsut\]g\UOQ\dhqz~x~{|zy}rmprcT`\VZYUF?GORYZ[fZ^txy{|wxxqf^_hidUZbXdsz}yst|usywzuvti[SVYVWaPGPGCGQ\c`amw~rw~{vs}ooha`]ZZ^\[fwztx~}}wxu}yyshgVV][UPMKORPKVeZ[dltxuory}vrroiii`e^S_beryxwyxy|~}wyzzzl[TTV[cYYYKHGIT_`YWcrmrzs}x~v`Z]bec^]`hpn||v{{{}y}xuz}}ts~i^_`^USXXRQKKZU[c\_jqnknv||tw}}ti`jm\^bbciqonswu~~}v}ytqka\[hcXbYIBEKS[^``ccfwojt|~}|qe_flg]X]d\h|txyu}upqt}swynib]XX[^b^RGRTL\eda`efhijqyx}scjibhb]`bafoty~{xzxv}sjkkb]e_`i^YRJMSRPW_fZ\pmpuvxytrniejlifde[`jhsy}|xz{{tu{}~}~zmsthZTYadc`RSTJSX]bd^[cmrr}}~~~zpsh^mnhca_Y\hqu{zu{ssmlnnobWc_WTUUTUTSXed^f_drwurx~sqrspf`cgj_[ibdt|{z~{zzxx}~z~rkmnk]W[aecZ]aNQZWZbd^WYemxzypwxecfhigaZ\`fq~~}}t~ztmgftraf`[\Z[`[PNQXYZkf]fqvts{~tolqxvkcfohag]]dktvzwz~zuuy}zunhfebaac]`fXWVTUW[]_`_ewx}qxxotlehkf[VY]au~~~|}v|zx{|{{tpvmmn\TTY_dd^VV\SUc^`bbhmu}}wutvtoiefakl]`efelywryyzzvz~{rgdlqjc\[ia]f_WWWRPW\]^nry}||~osxqideca_]^hok}~x~{{zvwzyyx}tkwtg]Y]de_]\ZRP\WYdf`[ds~{}~zvwxtaclaa`_^]ew||}z{yq|~}~tkkqvsf\fb_fd`ZUQMOV]ckaexurrxxz}{ysg\]__[ahanz{}}y~yxtos}~swmjha`dhfefiYQYNNW]^YYds{|v|~wu{zmnhaihbYX_htxs{pq}|xwwvvwqkm`dmigf^OIJLO\i`cjjorsz~yyztg_affke\hfdnv~}|qkjls}unmppkeadhja``QRVVWX\`dlusxw}tzr`bgga[]djntxx}w}rosw{xw|{wps|kdihiigaWQQQVa]bh\[dmv|~{xqkc^_kpchicchu||qmnnoz}rkioxxmgipkclaTSTROT_ghfgn~xvvvtojedbbdfhjgs~z}mnpnlqy~znuyrtojjlh`\YROY[Veic_^hu{xw|}upppkellgnd\]`iy||ztokilvsz~zvqpsuslhkehpecaYSOPYdjkbevsy}zyznqqk`\ckmjhckvvs}wvrojgn{vyulvwnhggdbcc]^\T\][^_aiv{}yojjlkphbqogbafmsz~uruvsovqkwxustwwurtwuialgbed]RPV\bhgfojq{tnrrmc]blpogfrkpz{rtxtlfhmu~y{rqvvvpg_]`a`ehX[aZ[_ejllrz~wqomltuffgcdcdjprv~qknrrxskurpuwy|zrlnvsglfbiie_XV[^``cqlfryvopmkhgffjokjqimw|tqwxsjhlqsww|vwvpptqe_`deknba]TST]iqomsuoljrsmtkacgjlljlrzvqpvunsjfgoy~{vtvpqtc_dfd_`b`^_Y^lhnrqw}z~yvqieinnigfprflqqw|xuqqpoppqrnn}x}vrqoib^]bojgocXVW[cijjktw}|tvwkpsh_[alrolnuywyyxtnwzu|tkihmw}yxxyqkwtkiedabejhbZYc^bnnlmuyz|~ypjinssmagqjoqnpsvz}~ulmswvrnjsuu}{xsmjmmhemjgnf_WSX_bdjosjn~zz~~~ruvomgcelljilojw}|~~vr}ulffjpuz|~yqumnqkc^bimmk_[bZ^gjmmiglsvw{rqstvskmhdookjkkks}}sns{|xnltlp}~}zphhlmmofkrjfd_\][Y]fmfjonw|{xyy|vkjklljimorlepnn}}||w}yvrmmonlrzyy}pnrtncafmpnggfX[`_ciicairw~{||{xtpwqdkopokfbcis~|ywwz}wrvlkqsx|{wromnt{mhlfdcdgf`\]agchmaeouurvxrnosskcfnpglmgmu}xnoqstronq{|wxppnnmkijloliqh_b__`cc`__ep~{{|rszpnmgjnmfbdhlz}{zxu|zmqsprxytqqnkrwrvpffgikle\Z__[hjeghmorv|yroptwsnjmmjqhbhkns|wpqvyumkmrovxwxsmhlrqnlhksiii_\]]\^cfdjxv{yy}vwxouwoiijgcabeny{{|{qy|surnmnprtvvuxtlvthb`elomjfd`Yaa_fhedju}wuuroooohcpnhjjjhm{zvqpv{xtrtojvutwwskhmtvrhepljpmg`]YVX_cgols||z}qnsrplfcdhjhktou}{xzrw|vqomghnrsx}qrvqoidfjkihki[^b[`gjgcgt~}yxtpqusghhejkiefmx|{zywtrtuvpirnmwyvqnnprvrjnhfnmkid[WX[`grnisuwy{wsvrqqne]_dgkrlq{z}rrxwurmhfhot{uvsihjkkkjjmpped`WZ^acdhlt}~tpnqpkqiahlkfdjrxzww||tsx}tnriglrtqruvsrorvhhnnmmjaXUVX`liosmqw|{wroonieacgqsioplpz{z{vvxwogdefl{zxxojjosnfeipkioc[]][[ainosv~yxvlprgdceffhlptvy|||wsvwsyqillkmquyzwpmwsmniiklhda\Z\d`dnidemy}wtoigfc_fokqqjkmt|~wsutpljijrst}wqmjlrvsnloljphc`[XUXajnnio~|{qttlnle_aglnnomyvr|tmljheit{||uqvpsyqlkkgdcb]\a[`hffeelvz{}{tmkmmkmheoldbdjs~|vpoomikqkq|xvtsrrpqrqpglrjjjdYTV\bhkfjony}z|ulookc^ckonjgrru}v{uuvpjeekt{|wx{ppvusnjffhihigZ]_Y[_cgkpv{}tollmtoelligefknqywpqttsulkpmoqsvyvrsx{okogikid\XZ^`cbhnelvz|}}{}vtsplgeeinnhmmhqywoturjgimpvwwytwtuwtjccegipiad]YY]dihejt}z{}wuqtxonkaadfiklns~zsooryxnrpjkpuyzvrptvrvogjlkfca`__^]hiejkovzyx{{xtojjmmjiijqkhprv~~wutsollnoonuwxzuqrspkgghmsjjh[UUW^fjjinwv|z~xsuwoutibafkmihkry|}|zvryzruogeelv{zyyyuowtjihgeegigb]Zbdcmmkmsvuvy}|tmilppmfdomjnmnqw}{{volorsqokjvvx~|xuqmkliefollrjbZX[_adgknls}}{|qnrkgb_clonmpurx|xxywvxrw{qkggjpuvwyzqrupqoidbejllg]_b\cikllmpv{~smlnpqnfijhqqooqqs{|~~xojouvtnjqmnyzxxvpjkopmojgoida][^``dkrnktuxwtvnjigfegiknrmq{z|{{|rrupmihjnnrx}~vwtjmqngacimnlefb[aegkmkgjry}uqrqpnkphbknnnnmmr||}|zuqpsvwqnrklsvyzxrlijlqujjojhfeda][]cjinqls{}||ukgfhlkgflrrkqrow|zzz|tpponnlijpyyw}uppookgfilnjjnc^a_`dhhghmu~}yuqkprijijmolggkpy}xwxxuutsxpjomnswvsrpnowsnofcdehkha_aebenhgkqvw{yqljlnlfdhmjppjosw}|zoklqtsnmnssu}wsspljlonlljkqjhga__`_acefo||yqsslpmgeijhghko{{y}zsr{uqsomnpqqqrqququyohegjljfb`a\agdhihhlt{zsqrrqpnmifolfijkmu{uprvupmnpkpzvwxuojkqusnhmqjmlf`]\Y[aefkony|wx{{|vpusokfdcdeegqrw{wztvwrnmljmsvvy{qquplgeinnmllg\_`[`debahs{~~}}zwqopsmekjhkjgegp||zxvvwwwvumlqmrvvsomosvvompknqnkf^XVW[_glfmuuvwyvwurpnhabfiinnjswzyszzvroieglru}xuxrppnlkkjkmohbd\[_ab`aemuzy|}xuvwonkbeiiebfmt}~~~{truyvnrojnsurqrstttrvpinnmljd\YY[^hiejhhnrw}~ytrqkd``dhpkjrprx}yxuvurlhhjmv}wxypkjnrrnkmprkki\Z[[[]bfilrt|}{wwuosrgefgfdejosx}|}~xvyysvohjkmoqtwxvroxvnpnmmmic^ZXZbcdmkfhmt{~~~wspmjhfdenmjojhkq}zutupkhggjtux~xsolnssmjjollqic`\ZX[cilmls~|{rprkigcabfkmorqy~|zxwqvxomljghnuyzxqsuptrlijjgffc^`b]dheddis|{unhfggdhihqpkjlqy}~zurpoonlkqnnxvrpooqrssqqkjpjggb[WX]dimkkuv|wtulkljc^ahnppnr{{~~ssuopnjfdhpwzytwvntvsokhedeedeb]cdbeghlqw||sljjkkohdkjhghlsy~|wnklnmnqkmsrtsstspnpttkkoijkhbZY\`dhhnqlu}}ulkkieaaekonlrts~~~~yzrosrmgehlrwww|uqsqrrnhdfiiknd_a[Z]bhmnpxypljinpikifghjloqt}~}ysooqswpkojhlptwwtrsxtpqhfiigc`__`aafnjlqu{~xtqmhffgghkjppkrvz}zqpqpljjlnopt|xvyurrsnheegjpkih_[Z\agihjqz{zurtrloja_agkmmot||xuroqytrtmihlrwwuttuquxnkkjheefea_\agdikjmswxz~xrliknmiffomjooqu||xsonopponkpyuxzvsqpoomkjnqkmkaZWX]begimooy|x}z{vquqjeachjiikrsx}}}ywytuvmhfglswxyzzrsvqpmifehkljd\_b^eiihiknqux|~uooqrqkfjiimkjlorw{tnosutqlmrov{zxvrmlnommplpqkf`\[]]^chjfmtsx{||wwslifdehjklonlux|}}}}xuzvqmjjlmptx{wuxrqtrlffjmnmgcd\]bbeffdgnux}|wvutrmmldjmlkkjimu~ysqtwwtnqokquwwwtonorsvqjolhfdba_^^bhhfkhjrvwwzwpmkkifdfjokkros}}ywqonlmnmmpw|xyyqopqojhjmoojkj__a`adebadkrz~}zwsorpghhhjkiginu~~{yxwvvuruqlopquwuqonmowvprmjihhhd^\]bcdligkptuw|{rmjknmifhnmkpkkqv|wqooqpnjjmstw|vtspnmmmmmmklpiec^]_abcfhks}|}xqpslmlggijhfhkpy}yy{{xtquwoonllorrrssqtvqtqhedgjljebbc_ehehiknszvpmmljhghhhpoknpru|}{tolnrspnnqnpxvtusnkkprqnjjplklfa_^\]aegktv|wttlmnjfeefhjlnt{|{{|~}zrtvqtsnllkknqrsvupuvpkgfikihgfb]cdbhjihks|wrqommmnhekjilllms}}zvrpqqpoppkmtw~r_KBG`xq`cϪuodKobTPRdaVmny~nf^haTVggZ\V[|hMslSLNWtM^uCUx|jYuky£{rfZ]qqLvxNYqzvj]f|||\fuu\ZxWZhmg[ThnWP\f`QOlzO>f||{yi[qĩð~m\][SPbwMKpyfh|wqlm}{cXYXYczmMTseSVj}dNVnyeOEDHO]vootzuztYTcx~n\QNS^r}xg`ixzfW]nxkcbgp|nda`gu~gKAJ_opto`VSYhxxv{{cMGRfmpska\]hx}x{xcSQ^mpusg\SSZbfggf`TTZbpvrjdfls{~xpj_W]co|~{ursw}ukggknnlhd\]chu}o^NCFKLUWRNLPX`dhlrtw}qcVNQRTYUQPRYdnty}|{naWUYYafa^ZWXZ\[YXXTZadnttroquz~~~yrjbfhku{{xx|zrnmkihgf``ims{~~zskbXQNFGKHHIJNT[_chmnx»ukc[XUNSVRQPQV\bipx|}{uog_^YU[\[[Z[\\\]_a][cfjrutpnqux{||wrtqsy|{wvx}}zwspopqllpov|}|z{{qkea\ZWMNNJJLORTUZahnozwngbb^UVTQRRTX]`foywojgde`\_]]_abdc`_bggekkmtwwspnoprst|yx~{xzzyvuuuwzz{}~xuuwtv{ww{}|yxy{}~~zrjeb``b[WUMKKNTY[\`hpsz}rifkssy|vuux{~~~{Ư{mlrxLbQ{|xxYBpQX|{PnjWW_ZNa{Vyr[bfce{nuzxtf{cWUV`q]~gekvswnknw^[udakkmtikzhDrpIOepdM5:auZ@H`qrmfxxͱ̺jftOJW\O>9Puz^IL]ihiwƴrTkpTLUUICLh~dQPUUPZr\[yfTRgdbzv~{{hh}xaY]qxiy|}~xplhqx_dwpa_ezlVQe}oXQMIKTcpqgZTTW]uzp}pryc]XW\epxwmc_afr~vc]jxjgaafp{xspqs|r]TYeputl]RONXeloldXT]rredioqmf[WST`hjjga[_prd]^fmold]]Y^inpmfZRTar~zxrppqrspmlpvxtlmv}}ustwyyxxz~~y{sigmx~||}~}zm`VSW\^^YVTKLOPQSQNOXhyymfdca^Z\WRUWXYWTSXdurga_`ac`^_YY\]`a`\Z]dn{|zxyyxtrswzz{zwslikqx~~~|xwz|xx{~xvx}yqia\ZZ[[X[YQPNKKLMLOT]j{»yrkfa^`[WVRQSTSSX`jx|snkheb`bc]]][[^`__bfkt}~|{{||xsqstrxytsoligilpuy~}{z{z{zwvtrqty~}|~}umfedca_\``[ZWQMMMMPU[amw|ypijfab^ZWVVUW[aiw}vttrnifjfdda^^_`cgkotzz~~yvuwzzxvtrmnpllkgcadimqtv}|zyywrwxsspmhim|x|fexmm~\TjWVVXvW|[PbRCl{tu~Nq_n\jqqƲfS{RJmfUtqnnt}vwrlqZgTPjqYr]ju\TZl~XKhrXSZkpJtge|ð}{uVWr~onu]Wvq|}|fgU_ywVefXY^VPYpeI>@DCH_}^SrƵxqmb`niREDGKYv|a_}wvyidd^fylYPPUavuZWj|zk[RV`nwtsobOFZ{sklsxǸ}iYTZcpwsrk]OPi~mjt|}paXY`fquqme[V`xypqqr}zl`YZcq}jZQVeqz~}xtv{qkhlu}h\U[hu~xrsx~nbZY]add]UPQVW[_WPJEFQeyþ|rg_\\Y\]UPKKQ^p|pkiiiga\XY\[`^WUSU]k|}zyxxvuk^XQMOU^eikmrz|||{yxmd_XVX^gpuwz~|qkd[WUUXZZXVWWTVUOMJJOXft~~}zuoid^YZVRRQSXcq}xpjhhfdcba[Z]XVWX[bn{~}|zupk`\XRPOQV]aejpuw}yumdb\VSTX`hnu{~{yplke`]ZZZYZ[\[VWYUUVUTU\fpx}~{xpfd^XXYYZ]fpy{vrnkiijeab^^`__afpz~{z{{xupc]YQOOQTX\bhnrrx}}{xxpge_[XWX\`elu}~{qmjdbaabcbacef``_Z[[[ZY\ahmrtz{zzvlfca_^`djpvx{~|xvvupokdcddccgmsz}xvvwvwsjd^S|ŮypjfhuSari}huk{nvyyfvu_noPnuUDG^fjozi\[h{zvme]YWf{weieszϾsniUOTROTYWWB>HWQUSW`nmmhbb~wmjh`ZRL@M[eftqplXPTTKVd|lmd]Wlvynrh`htŸynijWQ=77@Nanoeg_WUigtd^dzy|upwxvneSYTfvǺzujksuotxs{kmyv|ʼȼ}sfZORQbq}u~wYLNUXjpxvty{vjq~twmnmea_ZSCCDJSuzvcYa]bdf{vpan{}~sbJXZõyn^\UWTR>DDKRGLSUKQJUZ]ipuqm]XSQZ`komhwj`cz{rkkqgZT]RVNezs}plc_MMJRoxrmba`aN]Zjnhjnieg^t~zy||skV_ró~|xpaZlh|pmgokujiyʾgdSMNBHMNM][mmjocnw|zzwwz}xv}p}pvv~uv^_hacWLU_pqmkmaffnztpvt||xq}wvl\WKPp}ywkYOJ=QJWI??IFF:3N\~jtmkraZVTVe\cihy{{{prmbrpukaUPLUUQovzva^Z_my|~mjqi\cajzr|feckl{ns|xvuqjmx}zogndwqmhbie_YYMm~deh_gU=CHEIKJghxry~uhwr|{u{{elbbqn|}z{dc_fgo\fnvu{{rt~uytkinry{ewzkdlmq|pqk^bbZbO[QQFCBRRfz}zj|tklYX`TEOPg~wrerlxxi^VYUSXQ:O[ms|ziswoqtio\c^dimjnbbulotcpyoxukn`[f]aONIO]xpxseiROYD=@77Pd|uwtrtvmwulagY[r|~roqpqjb_YLbk{wpuow|lynrt{xkdupdj^dri{wtv~rgaaiRMCKO^uxv{ad][`E9IIPtvv}sv}zi`przrsunpjkYJNYMexpuu|xgidnljokf^`ljS]bhzunnp{|ebmcfWSZg~y{spX]_NMJ=Tm}om~|{skkfkgga_mvsknp|njd[PHGZZ_ois~w}~xkqsyxqhptnksfnzzvfgyuzrij``c]lwtsuggnyvaR_XQQDIYSm}tvm{vquzjhm{{|xdTQPIKccYclüq~}djgZ^innVMV^[NOfdrz}|mmlo}xmgzm]_ep{{|}m]\hVJMKUnrzv~wql]eif^OVev{px{uz~~{`QRSVUU`QReinxp~z|r|z}xoookifstwkhkvss{}fbkuvlrqqy{zmrqsyohcdg[W[NUZc{zx|}|}v|w|}wvur}~riXPV\[HGWXcefx¶ww~kdk[crid]_jeUQV^ck{zohnwyvlilswpnxws~~ydkvtbO]]_o{~}u~t~}}~~|kYrpf``gjlvt}vxofji\U`_UEIa[XZdqýxv{xyvin|uabpxptnnsqrjSL_gqtn{}m||ybdriryzm`[ejaWM`l}}p~}swn|shmtojjmkeWSHFHALADMZqssmjrtehZ^dfc\SRi~m{zh]Vdr|q|w~w~~~zpwvuh_`\_Sdxlkbvnaj|wx~jce^fo~yyjkiuyaQ\`aLLTT]q~{jozqofoqmlvsoozmoaZYRFRhkj\r|{pomphwrll|xhT]gkx~ypshu{}zq_opyjkn`glwlVIQRG?5HObuvz~z~zijgtj[[br{~}}||ogbidb]fhbnm}|z|{}vqsp|rwjgtsteZTcr}pttm\Yihrv~w}ymph|~}qqikpmtllihYWPMTNlttpijtfh^]eov|yph`QWNW^YJFVam`iu}uq\ZQRXQbsKuwywj}yMNVdQ`nq{mSawtljhpiNGLVXIUA=Xferg]mfsϞ~unpxv]zw\DH^zpuhiponKCtxOchT[UanmϺrsooNfu_\\acaG`~iWucissumxN_nltrsylkybktQFhh>1CK_epuptxji}sSXn~{ǡtarpkcureG>4:IgzV88Vfy{{ľ~§tp\fh}hTKUO^ilrwt_^c}zaCNdqbbl~}txm]Y`buz}fVH@M\vudM^kq~ǭj_eiifqu|v}~w|n`_Wf{xkECEGDSfmvxitxvr{z}pzsshz~~v~wzu\UNWZb^aOBEAWr½tlou~|]UZUX]fXNCOJFPb~pecqwe`Wb`ZU]ei}}uvhmltjWUML<25P_xwyz}h_rvrYR]baW]KB:AAMgvǼüwhptaaSVZc^VIFPIL>KYm}ongrpcd`hbp}w{x{}zheai]QHB=Fjx}u|~~mesk\[Sb^]SG::85JN]\oôsb`[^RScaWDPPSDEKP`xvZ_olhR]diq~vy{ugWhd^QIQIJYquzxsggdocehaKFF>CGTIHUox~´kYe^`b_cSST[OHAKPXu{z~uzv{~nlcktv~~jpmqfZ_[biogx|vq}wy{~h_mmm^]VFE;<=5DV^lox{޲oa_fjlVRWa[SKJPNhq|||}mmfmhk~}sytqgmnhWXSZWlulhkohsw|z|vozysrWUUSIPSNA8LLTP]ryżve^oldQOa_XGNLP[nsrx~yts}spxuzrm|w~w|uvuyoadkg~mlt}pu||q|pvxy~ximk\LBHAIFG6.6=D8@Ldw÷ϼxtmp\`c`bVXV]dzx~|y~yvxxytnm||nx}}unsttomwnk\\[Yku~yygZgyomexzx~rrc]\KU\^OBCKMDEDU]{ĽvykTV^d]KQUYXouvxytgqz{qju}v~piilfk|~~n~~r~mrmsqu~uusrjsx~tvssn|voqqy}~sZIQIHBIL?36C=;1BITsɷhZfqhdXcisx||}~njsmuxvot~wwzvvlgpvrsqvehmqtheeln~~vktxkW`kx}vzw|yso]UZV_]QKFSOPDGLTewy{w{odb`\`W`]_wwqiwyigh}uko`[`Vbkslhjyoqssnmr}svx|xz~vf_p|yuqntnqz|xgot~||ndZNAPTSD3EKL>?CKQh|}uw{mboqx|}sp|fbbb`csof]pwyqrxbha`es|o\\ollaeqp~yspu~mjehgqvzodstz{yqnn`[\eWPPU\TONXXnw}~{gnsyrc[dnw|xwekjsqtzgTNTO]^^[Wekslrwüysqpm{y{rsruslvr}z{pr{wlluefbcmw|uol|z}rtudi_aa^QJGOVIIFMLThqtxv{~~~yvr{u~y~xsicTZbfcQ[elddgpt{pki`mkk``rsh\bdmow{{|lgmrxoi[[\b`dx|ym}wwppmwwgPSec`NSZ]gv|{xytylz}xsnxsu{rwywungW`]TNXYNKM^^ZS^gow{zrgmyxjerrwwz{waQ\\_ihofiq{xsrv~pfjainlcRQS[ONJKVfqnxuqgq{}yx{kedeije\WP`_^\Y^_q}tsrxrg_`mjmge^f{wmhvrspm^RKIW_i^Yetyvvw}|rpxxzjimk_\\_b_w|vzsu{~~xusrv|~|sc[TURadYBBORTELSX`w|kuyvrmzzx{{gebXQ]hb]Virrjnwyrtkifnj^Z_jaREQU[jmvz|omnxvjjiy~st~|}{iif^hkqcWU__WWU`g{}|{{{vdikpg^bgs}stuxplmZUPSPQORQN_`hhkryľ}|xxrhhvssgb^gx|~tp||upnw}||v|w}}vb]WRVUZOLQTLHFGQOex|y}|vts{qg\_Z]gbUJXbldalt{yuqgmpk]R`ae[Z_[Yi|zztrrzvnchjtqstiprmk~}|qphfcng]V_ni\Q\^gv}{}y{pjrvoicnjwvww{tslaLLJENRYNBEY``act~}lloysmnrz~}uut|xwzlfenorsxuo}|~|kaZYRZVTGDRTZQLIS_r{y}{~h`YVXZbYVU[Z_acontuliqto`\^ga_Z^dh~{zttv|oidnmkje\T]\jvxolx~~qhmrnVWfȳ|U:E=5NareOE\~vT2EBJfsanzssT[uyJG`rj:1E9_}|l^r~YatrŞcpvVLI~Z^{scaRZ^^{I9{aw}t}~ltSenZ]bSF;J=CQat\pw{vKmhHZmqywnld~`aqoebubimsX`uxBdԟvdXRjgnx`[agNMditnP:SfoxVbmk~}wrĽvvztG%;ȷqUQ]RYQESLUhxmQXGFU?>5% .Pfnpb]lýɽι}UFkgR\RCIBUohz~e]icqucqpnn~ǻ~xhuaR>CˮtkY\e\ff^yv}mUUB=IA@BbnopeYWo{[>OtrhjZ_UKffqn{rrsopqts}_n}}nX<64aԾzr}wvei^^Udscekl^^muzooiquwlqkC;Qp}yoc]OWmc||}zynflyylxsz}|hODF(3U~Һtxiicg^yrlonkYggf]V]ad_i}~v}qiuef]>Ie~xruq_hieyxfzyxpts{u|ooszskMG9$@bôuoiikkj_^edZnhlaVWZYQ]vf{znm{x~}gaR`VFWh|hpbcnww{s{rsulipr^S2:*BfԿtefb^oUVVba^zpmVEMTQKXum|pmldlyx[SATK;Qhwrys|ssf^_YHL3;+Ab̹za[TSmTUR][Un^_N9CMNMUj]utvroks{{]U=NMJj~tvvuxpf[][LP7;3 ?YdzeY\NhUTW[]Ihgh_>@KJJC]ZryrpumeOXk`~swyrrjipgmfe\^W148:S]νnhX>HAQSf}yeir^ng[[QIPmnrrkarh_jG@>SsƯw~lop^SYSUcF=?,73CN]ʹï~ntTKJLXWt~i~qnyfaZNJ`pv{weft`nfJIIgzɳu~xs|zzz_jbQNTP]^:8MK3.MoȾ}u|tm{j\W`dissppvzzfZlfXimjnkha`HSPMZnw̹ɺyghs]Yt{kfonw{mvZBB?5-:;TK53Rn~~uu{rghjmp|zup{{zaaoa[lhqpkbb[LXMOey|Ž~yq]mkW[~}ujelg|ihkG?=>/35BSB3>]x|z{qmrnuy~pqz~ybljX_b_mfdZ`PRUHOlu{ŸǺ}vrb\o`Tf|tfhglvfq^D?<9+13NM=8Phw{unupqxzl{nin\U]Tfjf[ZVKRC>Wno{Ƨ{svkWhdQSr~pjnkorpSH>B476JVG;GWsűwu{zmsrgosmsyykqdV_V]mgaTYJPG:Eegnuȸ~uv``iZPe|qxp{}q{gYKJG;=@XRA@N^þryyrmxgfl{xdrwrrp]X[LahiZXWRUB9Qggmvƫ{vbnk]]urvmuuve]GL>=:KZNDNQhž{lqx}lt{glo~~oir|qtfSXPJbfiX\VWP=<]jprªwksj\dvzutppskbVBF8:7NXLGRNj~peivxkzzgin{pmpuwdV]NM`ghU[W]P?Efr}xŵ}sjmcZgq|yrq}lmcdWBC574JPGHTLj~~occsuhyzkjo|urrl\cSQ]gkY_^fVCGer}÷xzrll`Xeix|wpn~{lmbe]DA24/CMILZOe|}uebpxl}wrq}}xrp]dWU\fs^`ak]GGbqļvzvom`Wcelr}uphvwlj]^bIC263@LMPcYdx|jfkwr}|oyz^^[TYXn`\]kiRI`m»xx}t}ssmobW_kdnwvsdloge]UdQH6566>EMNYw||pb`q{y{xh~eUONUCVZUT`laS`azvl{vpgoqxiYfqizmu{qqjbkc^e[^?:AKML[y{zqccqxxzriyeUHPRCVWYXfod[ebuq}|miry~m_pqq{jvtpnb^h_d_]Z9:COLLd|}}|m`fqu{}|mpyv_PGWKKWZ]^lnceekqs{|emv|gbslxwrlqs|pgY\b\bT`N5;HPHMmu}|~zh`jpurw}q`MRYITT^_folgkc|·youn`mw}p^iiowuktlwm\T]ZbXY^=5>LG@Wmr~xuehnp}|~~}o[Q_OST[dellhj_htsz|]dr~xdafdtiprkrscTX\caScN77FJ@Gcg~y~sinnuzkU\[RYRbgjkhieZt~{qpp\hx~rac\iohlqd{o\RW[gXZcI:?NKARcl}~urrr{udU_RWRRdikhin_bw}tnneZiz{neb\rjnyrmejVPT`hTbaL>EPKFZdyxtqo~y|r_UYLWKNbjjfio\fu}}smmaXgzzoj`^tir|yljjVRSdgVe^O@HQLJ]exrmlzywo]VTKWFI^jgbgp]js}{tnleXdxyqna^tktnmoYRQchWd]UFHPMLZay|tlh{}u{z}vpbZTIWGCViibhudmuz{vrnn\`vzuvh`vnupl}sXPM]hXc]YNHONMY]t~zngt{pwwuqf]WGVMBOhpij{qs|z}vvo|wd[mzy{ubtrt}vesx|^NIOdY_\WVMMOP[]t~pstinsvzqonj`^HQUFI^tpl||rsntzz|l]ctwz}gput~}|cmq|eMEDZVZ[RXTOOQ\]kplz|no~yurkmlddKNUHGWqto}nomsuszl^]ksxkpss~yflmu}iOC?SRZ[PWXRMP^_hrkvrp}~{vuhklfhMMSIHSnup|nnltqnvk`\fow~kqnq|tx~fljryiQCARO^[PX]VNRb`mrnxtu~wx|~rbghggLQPIITlsp~ljkvlnrlb^cly{lsks{rvz{hmiqvhSBDPObZT\d\QWhbupo{vz{t{uk]eekbLRJIJWlqt}ihnwfuyojc_co~vstjzzqz|upoksrcPALLWfXYbgZP_ge}npv|w|uyq~bZbclVNNEHL[koxzwjhupgxqnje_evsznp~wruwmorn`LGOJb`V[geSReapqlsyxuzv}r}qY\`kcQREGIQ_jqwvskszhuvqolc_k}uxtjz{sz}}upsqjYHPHWdXYbiZLY^aw~{no~xwpx|xrdY_hoZYMFJOWdnxrrospzssrmaav{v}kpzuprromgROOKd`[^ihTN\Zktvot{pu}u~p{z`[aqk_]KMQW]hvzupvowtstum_f{v|xitvpqzqojkcQTITd]^cmfRU[^qqupy}pxz~pu_[duhf]NRW[_k}y}~nyznvnruwm^gyuuktsnr}xqkehaSSFVa^`fphVYYcrqwr{rv~}ruaZfuhl]OSZ]]ly~nzuosiotwl\futtnspmq|yribfbXUGY_`ciqj[\Ygsr{u|uu}|sxdXcsho`QT\^[g{ɽo]V\b^bZQbegd\mzN=9=@IZhv|aRfî=>joqb[a|pgûj|VXnax}M70MN>5.)/Wt^xzsXeǾeHVbk]i~^Fbw|èbjxo]15@BGJYo~YJiîZ(gvt}|~unaS^{tZB@e}uoRJE20?Zmw{oպǾOAeSEQGDLRK;:[{mecn}SSdwxlyhSSP`r_Nqk3>¿pvpbTGCGcow}yVK4@Yuuqz³aD6bǖsSQ>++4;>E\lf[JCIPOHFK=Up{vil{~x{cTr`I9YǯzvgXNJNXrv{}xvzzeIIDZly}yɺb70@y۸kdN98ET[_jj|ohTDCFC8Kjɬzyv||sol\VYVdaclqvz}x_Y^jmjqppr^df]ZckhYT;:GM]j|fa\bjs}~|wibidg}~xshXJTMGA=Qoʪ}|tz}uoiYSRO`aepw}|c[^hmlspswacc[V]dcVS95DPduƽʿha\cnv~z~~zlcieew|{uqfUDLGGFCWtάvw~wnfVPNG\bht}}i__gmmtrt|hdc[TX]^RR<1@Pjƹükd^es{}u|sfhgcqtypofU?AADON`{յ~rzrgWKK>Oakz{{re_ejmtvrsfcZRQSVMMC1=PoǵwhheopxqnstrTnff{vldcR80/8DNmtӽ{~sz{xp\LQ4Lhlzrzuhubpvqxd]XNPJQC6B"*Fg~|vsrk~zuun^jbftskZ]Q(,%9b`smrwnxngLcL>Wq|{{vpoojs|t~~fXW?DACRE>2@:]ʯu|r]uzqq}}wunWfUXlcuk]S=%0Eby¥zvxuqrmFDY?TZqyvrrfnvrts{_TPH,=06<(FXu{v~zuqotpivxls|_i_fWa]R\E87+0\u|Źdw}qoQCFKP[{{~y{qmqsgrr_^GHPD87J25GWqz{x{tvmutwjsUa`Yija^iP?335Ym}dz~pk~uviLCKFU]x{mxemsyoyTDHI4+58,2D\ƯrygkuupvouvhmaTVeYT\RJ-.,3F`ն}ivx~vgTHM5U[k}smu||sgp]I9BBB0>D-CAG/BB5DEXfŸ}r}rxvrouqzjYjIOTf\ebQD?4%H6Lpįfx{onex{zsyj\TeNOT^XO`CH*2B\iž`o|slHSLPMRhp~ezwmwtamOMA'*/3)@>Maƭ|xvwwvnfxt}wwv}wPhZSR9NUTE=>/1;2;<-=;TT`}ϭhdq]zp}wjqoqklWFC>LdPQ;;>#ALu{{]nch^TLI]Pv}xqdtovc`;@+&+45=`YrvѶxz|ilkk|x~{lnp{w]\C@?/GJU3B?.E=hû}|{wgobv]dR4UXgry|vzZrghik^FG(-!7Fagpu˻}ZWgbirzzgjljg`a=M74<1KABB37Qkȱ~qYe]cTTHSYfžu}xqhpfoX`bPD,1$NozĬ{{xzxonddww|ktat\S_EG6'$?=;MQCQ_uǪ~vsrt_mq^ZSFdrjwqik}h\eOCI6,0*@i~ֽ}v{i[gcfz|u}v]gkWeZAA912E@;?=>PtzͿ~p|iigPYbEYbmnvum\{qesZKP:1551Vjvz|luzeb^[uyxyjmsgijIEA.*12::IIJh`uƹ}vuxipiXbaSSO]ey{lsh^m^]`RE,()&DYf¿uxvtfWX^lxwnabokZP@388263;>F]\t||t}vycR\U_dVacmqu}{tjppbbWQOB5,2;>VwzǶr|}s~lSeaelwkju_d^?88.)-@CCKCMdqª|vvsz~lheS^]N\dlnv~nbpilpc`^J/!83.P_hnsk[bWRa~|hqr]naCKE8&)94AM@Scetyztkke]af]b]Z]r~szoig^dhZD,;+(GI[v|Ƽƶnv{mpjeISptzwh`ngPM@5$6>9=B;CYdo{òx}t|z{zq`RVbfa`\nntvv|nojpgVJ66.,9:Un{z{¹rytmvdcJUos|jgibe\P='4//5?JGV^]eu~rsuw~o_VgkTYTegnlabunb[L<+43/EUinz~rj|tlSQV`mwsmn\hbQD1A94,+?CL]_ipʭux}}saPWq]_Z`_g|zqdvk[XQL678)AL`enñ|kqjmXf_Zdfz}yvb_ndS9?2/))7ERQN\cͿɹ|ruq~sjXbWVS\`eszytcitcdUSI=@40SPpԳ~mee[olaMVpyvyuoWcXJM:4"+2)INBScɽȼ{xqpqnmhFTKOdnw}|q{h\`NNQROEE/>KZ|̹}ooZ]_e`Jfusu{|iOWRZOH/-"*BDRUt½ô{vbfbv`URFNfu~}WZMIQTTQQI:FKemztpe`f^mVTfgzxz{~h^KVJG?'5/*8(?E[{}οkoaneXSBHVj|{ssfVCJRUYVMAB?]i|||tbbS[Z`kd~~}}zjlSUXNL/4-#9'1EJeh̹gk]hhceEGQXr}{rrZDLRSZ^TJU?KSgvzƤ~}zzpo_`N[kXt~}~szgUMJH7F=,:# ,T>av{uvd[nNcjQi^h~wrog?LQCQ:9-, AMO¿Ʒ|rtvOUbT`[ijn~qy{jurg_]ZPd_U`R;4K[jƵjmWMtac_m^hxcpndKSP@ZMbMhmhqhslq[|gfg_VFtgrznmjY\o\]O4<)@/;.(78SVB@]euioj{upy[ixmyULSZ^Styug`OVZ_:=396;=:;F;HuɻʽŬ_Z\dTYYql|~wpitU[h^LMC@XWx}}u{a^ccei_abhuaor~dgS[PKXGC=.$@7?LUCMh~ұ»ɾ|kfzl`Zhei~}xoY_bddfRNW]{kjonyƝ{uqleo{xh`Zt{Uriv}|kaRORPHY[@7EARFA;5`]rӳȯƼlx_dZchjujr|mkk|gWLJS3@FQIN]ɳƟXanfnhWbnktoswU^ORUSRgr}{dx^ino~pVǶyuwyZmei_]mosolg{bRbFYTL~Ybbiq{wwzvrWiVmrb_RjK]o|tbp\sj\Wdssrusjxy}wtofP{ekXd{txy}ȺhJz^IJ9cbbcYtqrecmZYslma~unihqvqN2`¶_Z^Ioqyffyc{vlfNujObZZKOhwf`ddmwkdUtxwMBbRWQBaakrjQi|z~w\VVAYuļȬviTnttZegrjc{k[O@^HME\XF_WqmO^p[tqcWlm`isoZPjlpb^kGjt|yz{qi8EH=VyȺrpW_as^onwMOZ8@b]||qh{v`RQmvgibguvYJipugl`ojbflt|zu}{xwbkb^I4YEm}wxrl^hhlpvv~ib9I9<_SvyZuzjS_hjwa^^{yg\`vighLekmu}~zy}yzt~s^gSSM0FSg˵jhlitkztzxfW93/QN]hixnVV^llz~gfZMr\K\z{wppbl|u{szypz~vtgjhOR^HD]Jyiyhx]vw|twq~V6B1H[Y}~[n~lek_yeswtaSbo~sVly{f[[me}ss|vʹlw~~{sxid[8W@@HOŭ|ek|{fqw}rzygO70.THj_~^hi`aszg{v^]Nex{zb^h{hs_eqzkpvz¥|~uqxthdghCNYM\Bl~Ƹsg}n~kh~wrvw{jEP,JOM|wpqgqocsinssxd^Opmu]p{{tWbmfm}rxp|y}wh|SGU=QH4>F`lty^mk]_eu{sxnSFfT~snntwj_uy{t{uxuqtĸ|tqgvnheKGPQM=]j̶ym}jzzh~WRK3M?Hnvyn|nsxpt_wo~eqoQIVf}wttk_nv~pk}t{|ǵfzqexmmzS;V7TI:Uuvup{ss~w{OFE4:4]hks~ein^`~gsy{z\:NSlw{zz}{Vnrztprhs`}|Ƶ~oysZjsiiDGIBZOXY•lsxsqqjwPVAP@Aglp}tqpfhgv{xmp|wlPzxxvwpmj}~qx~ikk|svj`f_ts<>H9KYdizsztvuofN:J?M`ipukrtp]{|[qnRhFLSqzu~zzdxvrxh{r]}wzsp}lc]OZqkJI96NKvq{̳fmx}grqZ`79PKSd~uzsgfhpunfcTamWCDqͭsmt]k~p`yf^who{xowhRONQuP:95MW{epvmp{vgYnL9M`m^xwndm`ox~|iVfUVse`VhǼyuuuwia|tofpp[tzpz~zrynUORHKlbSA5Pbr`|{qn{uSv_GGVmmtw{pmZftof{_bZWu^XZrǵ³vqqiyb}shqv^eju{}{}|}aKWKNaROS+Ahxzg}~vtuxw[ceJ:\qi||u|~scdb{wug`EYgZf[sx{yxl^fsNghi|tkYQCHFRTSM5E\xvzhyomj[taBEWtur{{k]w{izjxs^bIP^]Znz}Ľ~tpos|w|gi]Wb\uxy}vsxjKPL<;KONjP3Fvzslhntpq}kte\Tappv}z~iXh~oe}xqqqtNFe`jgt̢{udvm|u|x\aat`YvuqwzjV]M:CWR\X<NcqK23>\zÍcow|zUbwKSflB(;lo{~pmc=&KikBLq|}|ȝvaC?JW4S}fBHQBLN^i}ak{WRgh<-=kpf^oml~wUW\z~n`fmzuqjuV\{p`V}cZdXKYrʱzTl_mzj^xaF^ujqWR[h\ivqhLay~rXWviGHINjqi_QO@QZpvi_ktuWb}wqaro~wa[MZUgqeRCW[\nvr}fIJlK.;R}}zht}f^mbb[EH__}w]N`~پyyiUMNux}wqRMbw|rlJF9DWQGJEYQNNFCD_gahgVjz{jɾx^948XnoƸanyeZmegeMJ\Xl{[?EYjɯv}}ypxued`gɾz\V]SLNJb\VRLHBNOIW[QfzpiaaWvwihuncGJU{s^phXX}x}zvyz_KZlzmosnvs}u}rvu~zvc`[LGHPzyxlvsmg_JYf~zw^VDIMMB,8Mwbipd]{|y{v|uxg_jqflпvjrZabhj^csnwbY_[__aRIX_^wv~hcazhUJ?PP\C.-35Oav~p{{SCLM:Vp}vvwuqdda^Wn||}}xmkmhjlvpfX3:G;G-Mguorbc`b~p^l`uwnr}{wuhi\cgezpvlLTglXgecpYdswz}}sk_UYlbZm]ku}{sk\nwtx{~toxjzdMUkpt¯xupqGDT`sjnreC&7tS5g}u^`Vyppo{wmZ\\agj^@FQuqxkfi|za]jPm{oq^\lʞƲǩwW;9&.a{rzYDQ^QSzsgkwqt}_IK[xohnW]cu{vlcmK?85*Kbrt[j{pU\r}dYdfmq}bZFWXW0#)@n}sŽ{vqp_x~yoC=Uo`XSjdonhp{xlW[N^kz|A.1BHfŨintss}o]LRMMNulbqzsmc}[kpwqw{sqN@D]t÷vlYmuWLIB:SVkn~xadk{kku}VNCXo|bIFIQH^s}|nxxr^sqyaeYYgpke~t{utvt|nacK@I?N>E_{Ży~j~Z\`hmdXR5SYawsz]fbSalkd~mLO7Pwtyeuo¬mhwolx}nuwmpjfiw}omqiqkcxv}~q`SGHZoȶôPJPALTf`p]VP]y˳Ʈp~tvyinrok\cSL]Zrsthtlk{i|mqJE\DPS^GFKSiӏ}pu{b5al;jirrogvaIs~hhmklsgj}p:wx=XzzʼxrbggMdoT:?RO;*+O|wmFGIYVbmoype_vhUGwǧlHdmKiiXC=TV]Woz\;1V}wˢ{|k\^iwzcUAHXsɰte`ynbSZlfgYG;8Xdx~fwx|gzrZY^lrpp[C1OuraYw]JTpl\h{|vxkrjfj[REJYcfS:+UgؿxgXzt~muD4CP<4)+('\`yszxwtthw}t}{r}opyzYZ`m\g`_QA@9@#3D6b`piǻ~yzrkqvp{zxxjipuukJQQh\^uTUV[MCN>\U_XXgrΰŲ|umyzmsQb^XWowvqk}ygcXVoZuwnmSgXyeebWPebj{wñklgeURp^a;<`elq`RXm}u{`x}\[RI,"=2Hxxiat~kŚpJxX[srzpY>gaQuobZpypayi^f}lZPSMVYUWYxxbrȤyzx|^>/@buu_{k~tvtrml}W2Y|zb:’n^rcKMZeN^`fl]lqb~y^vv`|y}xXjmoeGBRtzpgʴzXWqդuJ7MM^x_9ClxdLJMLfvk|Ʒd|[]ai|xHSk{{ro~kjm}~Ѱmww}`J16Pgx`X_FL[WiWA=Wqxnjbool]|mm|}z{oxeZohgps{v`0=_u}dgZbt`;=Xn{q}zgVTJPok}ƭ~|qxsfZPUyƶyOQXm]tol}of_jWABQju{kS;;A\rjYZRUPZV_hS\qmuprs{vmnoxxeXRjt~|}[moxvnosS?ONTVikgYHUwt_iooeZ^gZrdsmf`RVYubaU^muzmpw}lSaTUd\vuzZWƶ̵qj[PK%%9;A5@Fupmdr|qtrx}yw^lbsnznukmWyv~hdgVWTnqlc]pt~olitf;=;4QT{veryvldYReQX{wbqseW_^nĜ{{|f|ywcpkt^|rns[WO^eeUDRPYORVs}]dh^m]yl}cY:LXb{wbVikth^HRhixfTBJIVgi{tilncinpklpoɯåsfaaA6(4CYVYypme^gXxry|zxxhequmxhZgII[aqhcL]kvs[JOLZ]XnXP\P]Xt¥tm^wwsspwzxw{`zi|{~w|qy}x{thUHYxskzr~gflQ[bjwldO`arwcC778KIX~o~y{r}~Wcd[\=:0AFIs~sgmkqsrs}v}kl[l_jmvz{̽lvcRXOZXJ7-6;]e^Tdomcrvhu~}jTstysv{~jlzf^PMW{t]iebluk~hbMIL=QZsvszrʷz|gsouegMVSYqsuuxstvwy|\JcbU`~mvrhsp}o}rgZ[vkli]]kabr\PB2EAWlq~}vtog^etjn]ibG[Vhxy~ib\nnZsuyz{xzqcz~{z~ȡznVHNn[GG80CSVxv}}izvlaonovgtVZ\|s~nnwywerg]avaasnhvxeeWbehr[råmqlu}||fpvttjtyscPLj}iqmwy~~zlfro}thj\IYZgxzxxchm^l}}{xnyl^itVhuhcbxwu{|~{|n||qW]WTB=bQUdjxunx}pW^akihqvk^TZfijup`itnmvVJidOC3%8D7[p}~~ul\lqzn_lsq}fio`j{{yfOS\`Yn}|rJRXfztttu{ʳqyf`ms|v\kdX^ifly\Sz{{q|~x{ld^X^q^_^Spil}ls{pOMX\Sd|mzyp~rp|ofnnvyf_X5?;5?Tbyy~p}vzy~ytgvvlu~jvkhmisz~pi|y|gKIORZZIf]CFc|qpjh{l]baf}~~w}}|oz|i`n`nheotyz~}lbK_s_YLQdtn~narzrrvp\s{xq^pqobeqnunl}|l]J9RVXU`kwyvvx|{zlvlutcnx{x{wkXeyx|q}s[eynie^EOP\YGMXRD\lpuszxbevc[~~{uusqssjhajfZ@@5?A.=[lv{sx}wYZw}wnkfbSdiywljns{x_Zegcix}mikVdfljcHPlgl¾|zjfjkgksnfbtxwipm||mimhTUXWeL05Uckr}}v~wsw}jfhjdjtwgopds~t~yx|sy~urzsyfJGGG>Imnepkyo}}yzzu~bchiYdmurj|k^XSYdYeWF889EKatxtxzpxxlhvrv~n[hq{v}turbum\pvsbY]Z^pf_{xn~~mzxy|zemuo_a\pw{oymdqqzrhRXJAPXC>?\qsm~ttqlglxyss~~|{sr}hfrhmkndlc^^H?U[daen|­vj[Xg_XJJ6;N`~b]tprsptheNWl|rdDFLM8Zcvvmeuqu~{{~uZQS^UJ\kz}tsbryhprquhwi]\PIYcbU[eYjjto^_d^gPU[blu{qo¼{xlbfatdZLYmfXWZ]PMW`~yth_WiizlVT]pql}ȶľ}{h]F5IIGZd|ppnvsfypjbQJ[hk]n{|xzs{~ùwn_\ee~zt[ivofgb`PXUb~{xi`NLTQiZLJWcfk}{|z{zneujhWC=LVSG_gtzyu}u_]P[epkYYf^osk}yutnd[g]x|vfokuob\cc_hln|u}~}juzwu_NQ^cTRb^mirxi_beudaXSdr{o`jjl|~pell|dYeaYXRJ:CEGjw~usidld~~qimssw{v[NSYTCSSbmpuut~omYap}mluoyjnt}~rv~|{oWchfhjdWVdZu~xjpbmyk_XZVT`[]ur}zrkyvzybSWafU\__ohqvmjjxw~nk~°vmqru}qryt{zy|vhWe]`yrocb]Ulid[\]Yak]orptpsyrxoyhNBEIB7D>Q[]nttx}lmypjh`rjvyjlt|~rp|pqw{the]Xd^[njuwyŸhoikuaLJPWNSYTkhioljjs|vbj|tukp}rhY]cwusyt{}xqornaGLNFYeutea^\^L^fhjhifj~xȹ~u_[\\OWTTjfjoptumrwvgrwn~vlqz~uuunjnvugP[WWisusorn^onrqkcXXe[fkkxqn|wlujmpcooyo}yihlnguqt~~~udbfzoqynkm~yoq{|pX`^^ov|y}zftqv{wodcrkuyuvjszzvx{jpykVNKH>MILcfiggno{ojw}vublrjxstz{~{t{uszwkYPZT\e_qpfl~~|~on|xi_\ZP\bZpuvlcdehzvunuwst{zwiPHFZc_nhlnv|s}nfh^oqy|yzrsvp}ujsw{vgqpdVLE9>NF\kuvmpx{xy}|g]Zjyu}}~vhp}odfYiloz{tolxe``S[eeTDIMRieu|zyosxlx|ztokag{uyyv^PJWfdvqs|wy}rscrvv~}yvvrrfo}vehimzy}upy{oylcewtwj\eec_WOAHZXo{|y~qwvq{~to~y}|xk||{{rejvyeRTMWibqywu}}}urt{sywwwmbR]gfz}nghnxn}xttvytqshsokx|w|sbWPacmzqy|{~qk{y}~wrz{orj~|{omjeecVE7IIVflysfhm}zxymacpk}xpu~}rq~tztlu|v{hryyzx|z}zyeemzs_YSRifpyz{}ut}txtt|zn[^kjsrz}v{|rrl`THSPVdX\gtqm|~v|{~tlp~vhfYkqpzwtuv|z{wrquqqkejndOCSPcou|qqw|{|qm}}~~zujour{u|u{~~y~tb`gqkYSEIYT`b`ekqv}xtt|xwop||nYaekxmgsyt{ukp}utole\e]hrhkt}vz|}tpyz~wpsytgx{~~~}srt{sqh`dmgPAKEVacie\WXos{|}tnyyx{sz|~wzw|||{qq{snpz|qj[Sc_imhjtvwxtty}xr{jdkg~ukj}x{{yokwuofacXXRL\TRVbh``ji}z|rq|w{|yx{{uu{|~ykdltmSQPOfjqpop_lPb^M;AJOp|j]qŰƶ{nsYZiqtqf^bbYphVKXiwgWN<5/Sv{SzYqit{sxe_dcqcdqpJ7?Vk~poW=LPeoni}p[RNXtlzsUWUpY)>Ѥrev{lb`s^`dolgly{k`VPCOC8I9H^qmgaOezycgaVi^eWFQԥuTZvkZJQYntlhWQZrxit|}zkckW[gm~ƸvU/:\ĥ|[O\klvdTZNTQ>4+39WncokWZSB49M[pnWSZXai{{~}_[XMg}|zypu}w}mZB%!Km̽h\bTOM;IW^h\Y\^`kpkoeZWipwusimqxq~Ľ˹`IJ?0"8Zxʵ|~w_T@?QRQH9REF34QsѺrvdib_lhgswww}yzovrl||rrcijsq`UE\R[cQZ\uimjar~y}lNaYcpUNO@=1,;>M;Kn÷¸~sbm_e}xs{{lf]iv{raopsanjhwuia~oombnqs~~s|lMaUUZGD.9BUZOpƼ}jlpc}}}{vrnrcklwspuz{o~uihKLUAOC@1'8G^MWtƹ}levjs{r~~tys}yseyw}ir|vpebw`_^_jjxruesyx}{mWfONPJK:EQi_Qm~ʸótk|zuz{y|zlv}yx{{pbypgniurltyknwqkIN@3=4:+/@W]JgµȲy~ozlfx~egkoegti{wp}tbpwflbihqzwx||th|uvXQTAMGI;0=QdSfȻqnvev~y~sonnyyu|zr{qochimw{xtwu~lxnpZQYFLJOG8@Vn`kǼĹsm{m{v|}snykhrvlbql{ju~ysek{eaYbgjtuskprpxyi[cLIHLI:@Um][pzðigzpz}zrwzuz|qhwrwxzuqoz~mz}l[\A=>D?06NeUVm~ȹ̹zxu~~ofl{~{jeile`ohuxj~qs}kgdlkkr{~zywwavvqvfUU??DLC11H\JPgwrq{iuwrp{wtz|zswssx}yu~{eyulnaQSA@ENH85KbSXm{üƲzsq||}~mmt}nimwpfoiwnyzmo|ma[acemuuolhtfvzstkY[JACJG94JdWSakyŴxpz~s{w{~|oirwv{yr{gm~vqsp\YH78AB5+=\WN[iyͽľw~vnjsxogdkk^fgl}}{hm}s}wg`flhiozyotf`vtmnrd[Q==JQH8=[aS^l~ŷƶ}{~sszupu~vz~}srvpmq|{ppwm[pukgh_OJ84@KH:5QcW[gyͽ˼zv~{}{fik}ynebomflftnyvr~wjdjjimz~vmtls|z|kbWGIWVN?Nnngmwɺr~|{vyzt{vwuw}zshjooqw~mnvp^nnihjfVN;0;A?3.Nb[_dvò|}{mokw|rlfcqngmk}nztnvwxvw|ljwrqosi\Q=;LPO?Ghkfit̾||~zoqpyshlxsuz}y}pqtplkzyyhfjwlQ\d``]^MB4&2CFC6Okhilɹĭ|ooox{tiu{w|z{{smrpolv}lpujbtrsprmZO?;NRTFFkxvx|wzx|msqxwln}zzxw}t}zugghggh|}}iderlT]a\^ZbSG;,6CDD6Onptt˼įvxuzvtndsyuwsry}wptruq||ptyjbkeieifSJ96HLSFKovuryŹ|xuyniki}vrp`gsqts|yv|{wnqopjl}{zvbefueQ[Z``_dOC6-@JUQIk~~ȿǮ|joj{yykhwxzy{x||qssrplqlkwu\chjoircQE6BQVWE\xy{vv}wy|xz}~gkgs}rtjcsx{yustrqoojvnmvy^afdibkaOE7>MQUBTtw{vǽŰqspwqsj_mtwuo~q}}{xwtvnyopxgcgdjbkePF7:IMTCNortkw{xtvhjinswpcnuyxs|~|{xyn~tigoy_[^\f_icLA25EMWFRrwzqŽ˹~mmjqvzqepuyvquwvtssi{wmjrz`^bdngskTH9=LSZEOlprjx~~pqovx|sgsz|uu}zurrgzxnjpz`\``jakeOD7:HOVBHglpgtŶrqpurun_howtjtq{{}yuwk{}pmrlcgdnfnnVI>GUKBaosmlªyxkklvvuyggnvzno~|w}}u{rowsl}ycfbmro}lWLAJT``M`uwvnxnmlt|szldls~un|p||srpcy|tkclu]YX[g^jdL?58EPYEIekoep~|toot}svsbglzzmtz~tz{uqzikfsooxcOE?JTbZKctyuns{xhgiq|slufbhp{ojwu|}rtqd{z~md[eoXUQU_Xe`H:14?MVEMirwlxzxqnt{u{|lqtu{zsuxsl~wdc]kmmziRHAIRcaRey~|s|yqv~kggovwlvlafm~wmxo|}yu{yzqln\k~uzrg^_p_TPN_ZbgP=66AO_TNhu|uw~urw}|ynmp}zy~|wn|tivzgd\fmgsiOB=CM_dS^u~v~}xqnyfa`in{tfoi_ch|wir}t}yv{z|rlp_lxzrf[[k^SOM]Y`fR?89BPbYUm~ô­x~snsxwwqqs}|v{qkwoettc^UagesiPCAGPcfXezy||xt|jnvhbcknzphsicelwnxq~z{~txy}pol]qw{qj^ep`YPTb^jiQ?;@J\i\`v}zzrnxzv~{noqw~z}luwkhwmb[Whflq\D@ENb_Xbp|yw}o|vmcknrzppvjhduqotx{|v|qsfd{~|yqf[fe\RIX^ai^C6:>G[ZS[jyyvxxmtxyyv~tqmz}w|||sl~thqumbVbjlunTCEJOdf]ao}~x~}prxqgjqpxsnvnjemvmqu{x}rv}qpi^p{xvpi[bhbYJR^_hfO98>AU^VXdtyrw|zuq{xy}vqqwyq{qpxum]]lnuweJBHIWf`^es~wy}{m|ulblkntlorif`tnlp{v{xyqx~ppbbwzytqcZbb]NET[af]B39=EZYTYeuvu{}~ru|z{|xrz~zo}}lotriX]ilsr^FCJK]hbagw{~xziyzrjbmknslqrkhcxomr{vwu~tmtylk^`rvuom_X`b^OGU[bg^D6AILaiijozyu}y{{z~w{ukr~}likolWVbjrsgLCLLZiijiv|}u{|gqvrlaihfllqsrmewxrsxuv|wiq|pl`anwxrtg_aceTJV_jmgP?GJSgjlkr||sw{w{~wxyzojt}~wijjpdT\fptq^GIPRgmnlm|yv~rkvtshgnjmrtyxvlpxs}~xtz|liytnd]gsytso``ah`NU_jpo_GFOPclmml}zzv~yy~{{~zszqjr~~nmltoZ]gqyxkQKSRblnnix~}yzmwwxojqmkqtyyyomyrxĢaVNFR__juywUSbls}cywskG@VlxeRDYyUFUcs}tvfVis3Vshv~}uxfb[hs~e`ot[ieahz}zn]XJThtyj\HQxkc\_m|ypLctCAatl|smynj{|m_ep{iiucb\SW[gc_kgkxzxlcPKgthkpvx}wzYKguPJ]gef}}rqptnp~ormdefrywryx|vk~nXAEbrh[I=I\ZQE75:EKObgs|kXV\gjjYLVVZa\VEAPYfgnf]pz}xqqj[cu]OGNgoT<;NSKD9;DTej|{z{pZ\`bnoqjeww{y½kH9DCOV\^Uanroef\cxzxqjjjrkajvqR>CMbznRP]ZSJDLXm}zfijp}~|x||}zyuqaH02AVro]fj_VIIP]orz~xxwoptv^V\]jrxxkqvtlad^h~zsmruruyxhb`dhtnfjsrojYC8GYtjgutmd\bk|}~~z}zwruw}x|gYYQB16Mgpvypb]biz|xxv{xinow~qjomkaedh}{shfjhhhsztyud^\bertjjoz{}zyc^^UFJUMOS\bXfxqpv|k\afjorg_kss~~{}sjrpjbV_fle[NHNQWdfjXTlxwor}z}x~}f[bdfdecfniou}}ynY`hebQRV_]QJFJG@PUb`T\bgjezxkkhljljddbnw|upqhibfednicVNNEWdjgVZbfmcm{|v|mpgja\fjk_Xlsyx{}sehecXXb[_WWXPO>;JWd[ZYRY[eqzzzsrfijiiZiv}q{}{nid^pnoiekaXQFTZhb[c_^Z[qrxvvt_[dfm`U_j|vvwt}~~|yqgdQZehfPU_ZV@>AL]Z]YQQI`mt~}|~ilgdkbkiswtz{}zof\nn{ragda\MWQXY]dccUMgpvstum^g`ea\`[jpvtmulzwnTWaeq[U[Y_NDDAKOZXTXFR_mpyx{tnagbopiily{}~ow`ljt|kndZd[`WQMM\_fbO]`u}l{lorg`aUa_cbhqmrng~|qYc]kdYeZTXNQDFEHMNYSN\Wptqymedbqmndgryusrij~kiwd]o\kYFMLRUoW`u^uhe||{hw|}yhr_R_Rbh^Z`xmxundjesoWk[LQM\PTAIL>[ONd[dXn}roi^^\lknogzprkmnmU^oV_NFMKRF`er\s|vz|ytvwunr^jZWb]gXgzrvu|x{x{pLclViJHQLD>G7KSEcUbj\yzy{inbjrtlizm{yr{^qobZUdSc`YVBNHOrltehotz~|vyypym[WZVnZYhYZrzz{sOVdVg^\VBJMXQEC7QNdnUfkXg|hba]Xjzviu{nw~sbeaxoYQ\\H]G>TT\ehrpgs{~}}r|zifh\\YRVpfepunz~v~xol~d^T]TNQDRG>9?GGM`Uivcjxv{psmjfvdltmpgbmbPSaYQTKD]Thdnxd`hl}y{{r|wq[WLTafcelcr~kv}}utx^T__VFOLRQTRGU:FMPbk]fixlk{~xzqcgvebtgzqtkik{fielPS[LQOTZVjnWj_eat~}yzx|}~|ww`ZKXO\lgzdc}tzr||y|vyjgeIPOVGIUSRP8I?HXSedve]h{}~yg{s_kxykt~nqidjpiWS]S[C]SSk]^kujdYlzxu{x}wvvdgc[TT\qdgtjpq{olkzqfLQVXDEYHfOGHGNTNOZeg\cjxkyouulufvum}~rx_dinvXdYca_XHDZYaeej^eipcry~~tmryfp[c_\Y\]krlzvdmp|{m|WSZdPXNDLSWaAGKFT^ZUZUsoqw{rqiqyyqzf}r~zuZcgaruY`WggVLMMRqlm_mejcl~vtf~q{zkf[XcJhg`r{vjqqyr{n}yujYYNd^[DERRYUOBPLcRMehjtntluxz}vyxpx|vT\hgtd___RgIDW[jrjpxkeyvx|{jpsohi^WoYdpjelkxnwz}qtpruWXZZR]DGORc^PNYZS[h_qc~mwskmyt|z~}r|vmW`hinuhVflWWWOdSlpohh{yw}~yt}ui~hmTdcjd]ohiwmpz~ǻ|MVC3IDFGYT]t~|hqåtuvfzr`oԶsR\rqVUi|mSON_u~y^kjnhplkUmot{_v{g}tSpyee}wNDDYu}uNLXemv|bcgrr`VNmupkifnǯW;ǃZUoylkXUHcylvɲneZun\aqYMNmuYX@CGRzt{_OYktx|xtuiiux~Ĵ|yR)+4K״jQ;ETRVF/37:Dhq`pt~jO?NZntkolbemkhfoxpkPR[Y\atozxgb|wuyV116JӸzZEN_ci]IQRS[x~rqcsiowvvwx}vc`ykL*(+?Ŵo^eswp`FNKHQim]js{aQbl}zrrx}rnSV\ZZZhYdwxrmrovwtswobpsu|}aWuqX:24={ųúuel|z^b`Zbwu~rqs~{|vorxwpux}u[JefM5%,6nͻʵy}da^QUbrfhps^lpymvvxpq\Vc^e_n]T`hi^jebp{{nomfmwypbisqzbM`v_K136]͵÷w~yjqadl}zzr|{nv}u}vzd_pi||`JHhWH.*3Mũho`\^jphmyigrzmmqnnnlYefhgjpWZ\ma[hZbr}wvhmw{mm{}|hWiimkYGgkYD-7Esò{wppelq}z}{~|~rtrwr{v[[maxpVADdTK.,Pyñ}~rrgom~zrz~vr}tzq|vxz\QgVjnTB6YRP:1I`ürmbbcdxulzvqsss~z`Ze]iw{ntnirv}d^Yrp]l[_hxhhr|psrQ\fYveW@I`VU9D\xȲxqrfpiwm{zzzsyy~~r{u~tz_JdR^fNB0PPSB4Siȼxoeffaxxn{yssqnzzuZVd]m|uxniszhaZur_l\ciyhjuot~rM\cUo\S;BYXZT_}̽©os~k|wuoxpltyhYe]jv{~zqhxnxtlclkn|z|qsrzbxw}kZgQOTYR;>RdL?U_qʹ¦rl~ot~z|yktqvy|suzv{{uclruoS\OAGLN80B[Q:L[iĹκo{q{zrp~~lnuw_`daux~ylm|pqhfpjszywqumc~yv{d^aKLRYK8@[cGJ[f|Ŵmrn}{y~~x}yjto~xypxwu}xs~~^lynrjRYI=BKJ6.E`RCSbpͼq{u}xrq~zlktu`bcfyzzlp}srhiqlrz{yptka{vtyd\\GENUK7=[fOR`mƴosp~xyz|uvzjsn~xxnvwszxow]cxtjlkTSI7:GJ;-?`^NZiwŸĮrv||rrv|nhmwfafe{}ro~tylhrnnw~rp|u]p}totlYZH=FQN>7Um^Yfuʵxpv|~wxw~tq}|lro}xzouxrvylq]\qogfjVOG44CH@/>bfZao~Źȱuy~{qsuznfkviehirpwzlkspowrpzs\oxqmqlYVF8EQN@8Ypecj{ȴysw}sxu{ro}zospwwnvuqttkqzX^mifdhUMC05FGA0GigbfvǮx}tssx}wneouhigqnuyvlqrqp{~os}g_rqomqgWQ>9KOMGG:5[kddjǻ;qvs{uijwqljlsp}~qqtspuqqus\jnnmmo[SE7EOPE:[ohfg{ù}{{|qws}pn}ytrq|tutusqrnkn|oU`dcdafSH<-;EG@3Rhdcbw~ƻƫqwr|zlixtpkk}to}uuuustrrtv^ilnomr_SG9GOQI:Ykfc`uyü~z~ovr~}nm|xuoowtxyvvrtnnn|nWaaefciUI=0?FJB4Rda^[rvǭrws||mjxvslj{}tn}{{xxvuutt{aiknrmvdUJ;FOSN;Tieb[ntz~otq~|~qkxxvpk{zo}{ywuqsnmyw[_bchbl^LB3;FII5Iba`Wir̵svs|{}thtvuphu|}l{~}y{suv|jflktnvp[PA@OQVBFdgf\dswij~{~spps||yipwwukq}pw~}}wypwoon~jZb^gegkUH;3BFNB8Wcc]\qsĬsvt{}mluwwmkz~vp~{|xuzwtfjimsnxjVK>ENTT?Phgf]lt}z}opmux{tgquxtis}oz~|vxmz}omn|f[`\gbhiRE84BFPB=[egabuwêttt{}lmtxznm{yr{}xt{wsgifkqlwiTH=CMTVBQjllbpx~}xyomkrvxtfnryvjr}qx}}|twlsolizjZ^XcbcjVD82>EQI>Xiljfz}ư~ssq{x}qjrv~unzs~{|pxsxlfedpjroXI>?JQ[JLhptkq|ytrkimyuuvfjowzmp|vu{~}}svlmokeumY[U_a`jXD82=DQOAXlqqk}Ų}trpzw}rkrwyp|u||pxrxkfcbohrnWG=?JR\LPksxov~{wrpkgnxrutfknz{ms}txz|~~{rvho|nifvhZYS`_ciTA64?GUNF_nurq­{tps||x}nnr{utx|~wr|xp}{hg_gmjugPBBHS]OQdntjry{vqpkgpv|pwqgjk|wiowoy{{z}~ytsevwqfjsd^UUb`igP<4:?KVHK^hogov~¾}}xs|{|rttrw~yq~tutlc`nltu`I?BGQ]QO_jqimuz|{osmgpt}~rutijhx{jlrrt{x{{~~tvgo{sifsi`WR``gkXA58>GVMHWcmhisx|{szuurwuz|wv{r~zph^jnqxkRAAFK[XNXdomiru~qvyqijrv~wqxmjhn~rinxozw~x{wuoeyvqdkoe^QWabkfO:5FGSa]_cn{y}}y|juyrmcklmqnrsomfwtpr|wvvvms|qnadtyzsrf`ecbSJV\eg]D5<@IZYZ^hxx|~|u{}|}v}rrxosrrcWbgpsjR?DGM__^`gwxz|{}nqztqfjmkpoqupogpwpo}wvt|{mp}spdbpx{utkaedfXKU\eibL8!-X:Y_$QCSV`I;t;>E2C.ICRD$Ya0kqƲStyiyVordklbLFr^4E?FGGM9T]Cu~smhKjdjNE`TeBvpoHCQHmD6vstkliQO<|zw¶ѷ§϶|ucug[cMTL\hJqsnYhRTVA=JO7`jL;Q{kSN5[]F^4Rwej\P[{]c`adkubxYapm[Xpǫ{zg{fo|sqkKSmY[GNqQpmyz}k[hd`4`TeIWsI}˷שŨҥpgF@.!(3YE׽}{[\ZADRW9PZHLd]OY.B_9H-CbNdHuZY|^`CB=/chN.0ET1/JAB=BmikrSJWmmdum]dft]UCRMDKEanNfwzsdyyePBAM^CFi^Vgq{s{jv~_[a;XacUCfoָεݼѵھκàuuSV:49;W>>^k{~~yYw{]\r[fcFjiWE+aF^cKfIqwoiQ]Ym|tjpiXezvvytzpεśqzszzs^WCQC;WfkYP{||f_jcqbPjt`f~yvbxyZ}}~wuƱ~x}[wuw{c_]Ja[aWBqrn^`f{}fuqkwx^in_:PdKrZqr_xhph^z]gs`pcZQMjhbd`nlmsYlzhjtjl~|hTbT\mt|^zxlhpt`_pdEWls\g[Ack_JL|]vqhr}w{wrkQ`bWcnxcԼ{tj~rXeoL:F[RKV78QB(B9"H1GJ4Q[X:7GLhs]Uo{vwnst~xfup^vwryyqvwxmsbdhշȬyvfgs|duVdqdNKsO\iOgT^|{Znv}̡¤st{oq{vefstmW/&)$9B<%Whȩ~v~}{^nhL+7R5PN@UJSmqdZj[WnpkSGtiJZtcS^xyzdo}dAAB5PdjTRTJi|pbpcmymyuhkvfw}yy{ymx~xjhkahz}ljz{qns}wmqrcnjvjev|tt~}{znc[svlmxxsir{yzwqrtpjuxZUeh`DIRXWLEB=EQMABkigvvy}b`hwbQIGQdcUVTIFZR9SMAQRHU`\]d_[_[SMbvk`Xq|ysnjgpyuwɻĻ~xy}|}ʪtenfu~}pca^UVVH@^vfzv~zplow}sjeVIR^<@VDL]RO`hgmtoiaQIQgaQBG^\ULIB@LVYeumaota|{cx}xxmfu}oZdqreMQ[_YLHLGELF:DcQYt]szouzttunipzn]_jzj]XYanoedc`ipa}tiz|py|}tku}|xyytxujhz||xt}ux~u{sp{~~yv|hn}{bajpohgid__YQZvfkw}ydem}p]RPU_a[ZWQVkeQigXiqbbpxztrtfryrj^X_jt~}otxrxle[W\eg_NCUaeWGNW[XUROIGH@=Wrbú}wnzsz|~rzps~ory}{|{wupdevypou|yrnijwkkpl|uceouz|uogadyxlbt~xpjmsxynyovsl{~yummsxugRN]bbM>CJOONSURQI@HdgWy~puuve\[`fd`\Y]lqVVkZUfdVWbjoqokf\W`v{skex}uos{v{v{ýzy{xx~wuy|xm_`qxyhXW[`^\\[WSMHUwv½}~xngbdnkRXo`Zkl_`ku}}sh^ZbrocXQamojc[VX_ht{qgt~luwo|~{lZZfigSDELQSUY[XSICSoi]{yi~yttwyzmilzvibcgidacgp|wbppppnu}zwztflwzubY]fkmqw{xtlkž}yzvy}z~~z|widpvvjXUZaegjljf_Ya{pumou~vh]Y[_^ZXYaos`byqizvot|}uppvui`ivzwpiegoxum{ooo]cihb\VVXXQG?GW__OBBGMNPSTROJNf~~Ⱦĺxvv~yt~zhbelquxyvphcnxupqsrnkmv}hl~qix{kaemtwungcfqtido|ysnpv}zkk{{gm}makuxvqmmlh^QJQ[^ZJ?>DKOUYZWQMTivhs|wttqmjktmh}whsthfltyysliku|tmu~w{zmlry}ztt{yzyvtv}uw}yv|~xqmkg`VOTclndTOSY\\[XRKDH\sok|iumi{rkov~ytrwvhbkw{xrlikqwxoel~yk|xpzse`jsun\PNQVZ]^\UNKWkm\juovwwpmmkiimw{il~vhsxkhlswwtomq|zsy}|}wxuh_blqpdVRU[`eijfa]dy}y~~~~x~~siemuxrdYWZ_dgigb\Zfyzitzzy}tkfdcaafpzxij~|krwqsx{{wroqyxlaaiqtqmjkouxsgcs}oi{ydZ`dea[WSOG>9>KW\WLFGKOQRPKEAFZnlfý}~z{|uxyjbaejnpojdagyzs{wtqqsyxjssht~vidfikjfcdjt}{ribfqz}}zwwy{xlbgvsadup_\ckoomkgaXNINW]]TGAAEKPTUTQQ\oynk~wvzttwzywuv{~x|}|}tnr{xlefjosvwtonu||{zz~}||znfgow{|{|~{sxtq{g\^cec_\YTNIIQ]fhbVNLMOQRPMJLYn{uwwuvnov|}{yz|}yngn~|mssovxpgchpsrh\USUY\^^[Y\hy|oo{{|zvsrsw~pjyulw|pjijlkjjnvyplqz}smvyiqyjflswwurmf]VU\dhf]SOPU[`deccix~{wv||vnfackqsnd[WX[_acbabk{zqzz~xtqpptzwnyszwsrrqnkkotwsi_WW]diklmostpgbjwsa_liVJIMONLJHD@=@IU]^WMGEGIKLKJKRcx~wü}}uxx|{zrnqxzofabdgijhgis~x~{yy|tlwvio||rifeedccfmuzwpfadkrwxwwvvri`^hrj[`ol_VX]aba_[UNIJQX][SKFFHLQSTUXbr}xo{}~~~~~~~~xy~xqkkqx|{tkdbcfikjjjq}v|}}{ywwz~~uja^ahnqtuwxwrkhp}|lgsvhXRSUUSPMIDBDMXadaYQMLLLKJHIQ_nrkp}}~ypilytjtrmpw{}}zvpkgipvxulc][\^__^^bkx|skx{}wox}oo||smkiijknu|~wnhhmty|}}|{wogfpzteeswka^bfhhfb\VRRX`ef`XQNORTWXY]et}sw~z}utwyzyvrlgdflqtqia[XXZ[\\]akw{skv{y~zs|zx{vsqpopswxtkaXTV\adfhiihc^]gsqb[fkaQIGIIGDA=98:BNW\[UOJIHHHGGHO\jnhk¿yrs}uuxtw{~}{wrootzzrjfddeffgjq}wwsq|zmo{{smiggghlqwyvnfaadjnpqqomia[^hofXYfkbVRSVXXVSOKIJPW\]YRLIJKNQRW`pľñ~ngkosvusojhhghjg[POZaWKNZbb_\_cjq{ùtlpn`MB?>=;84/*().5::6.'"!"&+2>Qq@r]PĿzq^X\^WLB<867:?GOUXXXZaly~hYPJGA;61,)*07<=92-(%'*-19EYrЬv\{Δvq{Ľpmsvqg_ZWVVX[`ege`ZX[bjs{{uolnoqtxȾo^e׾v\PNRWZ]_abejmmi`X[fi]PPW[VKC=86557:==93-*,2:BHNSVYYZ^j{yŴymjsԽwpmi_UOWddXRYcgb[WTRRRTW[\ZTMFDEINRVXZZXVV[huwnlzŻƿ~gUHDGRcxĸredcVD>EKKE=841000232-%#'*++)''/;C=12?GB:57=BKOG;:DKG=63456644359AIORSQOPRUZ`fnyżĽvbPB99@Pd}zod[QH@81.19=5'"(.* - - - - - *177620///265/./0110//16@A?:4/+((()+/6=@<41;HKD?AISZ`dgkmnnmmot|ĺýyocUJDC?4'&6L\enwwne^[ZXTNE<4.($"!!%,363.3CSVRPV_gmoqqqpnljjnv¾x`SRQH=56?N`tui_XRNMOSVTKBCNVRHDHNUY[]^^][XTRSW]dkortvx{|zvdRD80'#!#*8Kb{vpljhaUIISXSIEHOUZ\]^^][WTQRU[bhlnoprux{|yts{ź|rg[OD;66:AIR\iwxpsrgXNMPSUUTSRPMHD@@CHNTXYZ[]_bdeb][anwskkt~~zwtpkfb_][WOE:0)(+3@Qe}ĺ}vpjc]WTTY`hnsuvvvvvuqj`Z]gkd[\fry{}}ocWME?<=EQ_jqz¼ti`[Y[]^]\YWUUUTQJB?EOSKBCLUYXVUVW[`fkqsrqonpuz}voib^[YTK>8AR_dj{µzuqnkjgbZRPXa`UNR[ac`]\\]`einqrpmkkmrx}q_UVWM>33:EQ^m}~xri^UU]aYMHLRTQKEA?>>?BDDB>:89=CJQW\_abcgp{yopyxsqruy}{wtpib\YWX\blzƷ}ma_fkjgdbbcehlopojd^ZYZ\]__^\ZXX^hqphfp~}}yodXMD@BJUbp¸|z{woe]WSPPPQRQLFA<:<>ADFFFDBAENW[TNR_gfb^_bfilnpsw}zpieb`]YVVX^hsſ¹}{xtnf^WSRRTUVUTQNKMS\_YQQ\dd^YXZ]_bcegjow~zrkd^YUPIEJZmx{~qeZRNMMNNNLJFCCGORK?;AGE=511369>AHSaq}wvxui\X^b]TLGFFFFEDCEHNSXZZWUSSTVY]cjrzzurxwlbZSOMMORUW[ajv}pf`\YWTQMLLNRVXWTPLJHHIKNSYaeb[YbormhjrzyphaZUNG>4*# "*4@M\jwtke`\XTQQRW\`b`\VPLHEDCDHOUXUQVdsvrqwĿxlc\VRNKHFEEIQat}wojeb`__adjnmf^`jrogcgnty|~~|{||slhd`\WPH@8216?DA@J^p{yrlhecceilh`XZdje]Y]dimprsttsqnmosy~wne\WVXUH;8@GHFFLUanz~{z{zui^]eidYTV[`cdefffeb_^_ciqw||uqqrn^MCCC;.##*2JXbfjt}{vnhiqvpfafmomhdbaabehkmljgfhlqw}||urqqrststuwz}}zsj_VLD=84259>?<=I]lruy{}qhipvvusrtvy~~~|{}|wsolihhhdYMHNSPHDHR]hr|uptyyvqmjhhilnppnjebbcgjmoqqpnnqy}wz}{yxxz{yre]_c`THDEGIKLNQTX\`fo{¹~{yxyzzzwqlhffhkmnoomkikqz}xpq{}xvwyz{{{|}~}}}~umnuuk_YYZZXUQNJFA=::>FQ^itʽ~{zxuqke`]]_behiihfddhorlb^ekjd][[^adfjmqx~|{z|~xrjaWNGDDGLQUY^cjr{¾ztnjkotqgadmplfbbdfhjklnrw~}umhdccb`]XTPNNNMKHHP_mrsyytsv{|tkjrwuoiffghiihhjnsx}~|yxwwxy{ywwxyxvrnid`]XSJA<@ILGBGTbkrxwxzqkhgggfeccdhlqssqnkihhijmqv|{try~xy~~~~|yumcYUXZTG>?DFECABEJQ[fq{zohecbcccceinuy|{xsokhfedfiouwtpsxuwvl]TTVVQKGDDFJPW^fkosy}{z{}{xvuuuvy}z|yzymhjmlg_YSNKIIIHGDA>=@ENWakt|ºzwusrrtw{~}voq{|uru{}}~yvz~~ztnieb`_][WRJB<98:=@DGKOSXap|xvuuwz|zrjksyumilqvz|~~|zxy}{~~wqlhecbb`]XRKEA@@AAA@?=:9;BMSROTbpwz||~|xustx~ysnkigd`[TME?;;?DJOV\dnz|yxz~|ww}}x{zvuuvwvurnid`adf^RKMQOG>743222247=EOYbinsx~z{xtx}}yusrrsuxz{zwtrrtwz}~~}yuqoqtrgZUYZUKB=;9887668;@EJLMLKLNSX`hs½wx~{xy~{pimrrkb\YWURPMIGGHJLMKGCA?@BEJQZepxz{ľ|~~~|yxy{}}{yzwxxromljheb_]]_`_\WPJDA>;;;=BGKJFFQ_fgho|~~yvtuvy{||{ywuuz}uu|ysponmljhfeegiigc]VQLHEB@?@BC>604=A>:;9;?DHLORV[ahntvx~y|zusrssrqppqsw{}|zvspnmmmnpswxskgkrrjcacfhhgec`\WQLIHIKNOOONNOQTVVTSYdqusu~|tpnopqrstvz|xtrpooquyzvpr{}y{~~{vqkd]WTSTWZ[[ZYYYYXWRLGIQWTNOWbkpuz½~}{z{|}}}}~}~}xsolkmnonlieb`][VPHBDJLG?>EMQSTVZ_fnw~}|}~yzzvx|}zvqnllnqrrpnkhgeb^WOIJOPI?;?DEDA??@CGMTZ`dgims{~{zyxy|ztu}wtv{~zxwx|}{zxtme^]aaYMGHKJE?:64346:=@BBCFKR\enwzvsrty~wqqttk_[\_^ZTPLKJJLNOPNKHFFIMRVZ^bdgjp{}wsv||uljorrnida^\[[ZYVRLFA>>?ABCDDDEFLVagffo~Ŀ~{{}~xrqu{zrkmrutplhfdcbbba]XQKFDCBBA@>;8447>DC>>FRXYY\bipw~zz}soquvsnjgeddefggd`\XVUVWWVTPLFA>@CA90.4::757;BJQX`hq{yx}}ywvvxz}}xtqoooomkgc]WRRTUOD=?CC=62124579=AGPYckqvz¿{vrpopqqpnlhd``cfe\SRWYUMGCA@?><;;<@EJORSTUX\agmu}~}~~zuqooopqqpnkgdcejjcZX\`\UMIGEC@=;878:=>>=:8678;>CJR[dghku¿}||}~{xvwz|~}zvspquund_bfc\URPPPPONNNOQTUTPKD?:642248>DGFFN\hlmqzº}}wpqvwqjda_^\ZXUTTUWYYWSOJGDBA@ABFIJFA?GORNLPXaipv|þ{z|vsrqqomkihikmmlid_ZVSQOMMMOPLE>>EHC<::668=CJPU[agnu|¾}|{zxwuuvy|~}zwtqpoooprtwungglokc]]_aa`^\ZWSNJFDDGJLNOOPRTWZ\]\^er{|{~{yxwvvx{|yskkqsnfaaceedb`]ZUPKGDDEFHHFEDCCCDCA>;>CEDCBCFKQX`gnsvy~ſ¿}yuqopqstsromkiheb\UPRVWOGFJMMKHFEEFILPSVWWWY]cjqxÿ{wsonoqstsqomkjifb\URVZWOHHLNLHDA>==>?AAA?<::<@EJOSX[^bfoz}|zvqicaef`VQSUURMIECBBCDFEDA><;=@CEHIJJJJMT\a`^bmx|~½~yuw{xofdghfb]YWUUUWXXVSOKIHHIJJJIGECBEKPOJIPZ__^`diouz}~wtw{{xtqnljjiiigc^XSPOOONMKIFB@@DIJD?AIOOLKMQUZ^bglrz¼ý~}xtvz|zvromlkkkkjfb\WTRRRQPNKHD@?AEE?76;?>954568:<:75457:=?@?>=>@BFJOV^fmonr}~}zwspoquunfdhkha[WUTRPMKIHHIKLKIEB?>==>@BGMQRPOT_ghfipy~|yuroosvskefklg`[XVUSQOLJIJKLMKGC?;987779=@B@<;AJNLJNU^elrw}Ŀ|snpsrlfbaaaaa```abdeda[VPJFB?<;<>@@<89@HHECFLRVY[]_`abbdgmu~~wspnljhecbbcdedb^ZVSQONMMNPQPJCCHLHB?@DGJLMOPQRRRTW\ckrx~½~|zxwwxyzxuqlheb_^\[\]^ZSLKPRLEAACEEEEDCBA><<<@EKPTX[_chmrvwxz}{yxxyz{zxtokhfdbaabdec\VV[^YRMNPRRRQPOMKGDBACFILOPQRTVY\]]\]cmtusv~zuqnkiijlnmhccimjc__aa`^[WSOJD?;99@BCDEGMTZZWZcmrsuyͿ}pf`^_grż|me]TJA93/-++++*'$ !%).5=GPYaglrx{l]QHBADLWetyhYMF@9-"  !###$&),05:BIPTTU\hprrv}xrk^L9.(! *;M^nyui]PE=61.--0476444+$+AZoĻ|xvuvvvvwwyz{{yurrwytmhilkhd`][ZZ[]^_^][[[^adhknoppqsx~{|zvrnllowŸ{wtpke_[XVVUUTSPMJGFILLFA@DHFA=<;<<===>?BFJMPQPPPQSUXZ^dinpomqz~wojfefjp{ȿsifbZPGA<9630-+))*+,,)&"!$$! (--**.5;AFKPTX\_bfkqzúrf`[RG?<>DNZgvth\RJD@=80(&*,)#!###" $*05:?DJPV[^`cju|}|~tkaWNE=72+##/;DLYj{vkb[VRNJFC@>=>>>;99>FJHFIPW[]^_adgkptxyzzyz|{tkaWMD<60*#$-8FS`p~{yvsokgddefgiihgfddejmkfcfkliecbcdddeefhkosuvvuuuvxy|~{wxyxsmga\WSPONNNOSZetʽ}zwtqnmmmlie_ZUQNKJIJKOQPMJMUXVRQTXZ\\\\[ZXVTTUY]cgkoqux|zoga_^`cjr}Ľzrqoi_WTTTSQOMKHEA>;99:<>?>>===>>><97:AED@AGNRTUWY\aekqvz~yrg[RQTTRRYdr}tld]WPIA95773+''*+*'%###$&(+,,+**,/38<@EHKNQV^gnoot~¿yskbYPHA;75324:HWciq~xqh_WQLIGEBA?<8657;><89?FIIHKNSX]aeimrw}xof^VOIB<4,$!)2=JVco||wsommnnnmkhfedddegimprplkouvroptx{}~~~}{{|yqhaa`ZPHA<8531249ALYgu|wsnjhhhijjhgfeddc`]YXZ`a]XY]accbbbbdfhkmnmlkjkmortuvvvvvy~|~wnhgiga\\ahqzº}vldabb_[WTRQQQRSSROLJIHIJJKKJHFDCFJLJEEJPSRQRUY]aehlpu{ÿ{ʻ}mnbMGD:120+))($#!!$(*'$%*14447;@EKQW^emvysmf_XQKHFFJQ\i{aT[Tptxz~ypllmmjiijnu¡d1]l(3Mevwnf^VMB86784.++.258;?BGKNQU[clwǼ˽~xpic^ZVMCAFNTX\birvxvm_K4 /^νztmf^WTQQQQQQQQTUVUSMC6*  9S_\PE>=@GPYahlmoqu{¾»xeSF?APj¶zreQ:'&2@JNJA6*  !&)+--.16;=:78=BCA?>?ACFHKOSX_ekptx{żxeTICFPbxƶ|jZNF>4( -+'6?KLTEJ2avU<0""-06\s|vme`_cmy|pcWMFBAFMWdq~zIAe<)2:CKS]jszqT;_cWl}Ʒ~rjcba^]ZVRMJGFGJOXgs}rhѽ|vyzlffimqssqmifd_XLA8238@LYervx޾}}uZ?,+>V^VJA?@@=977>L_updbhq{ɷuqȤj^\__VE2$$1BVjz}paP?.   #/;HS[`gq{gTE==GYrt]G73A^}{odYPGA=?EMV[]_`chnty}}zxvuvx{ƿzwxyyyune]WUW]fq}veTE=:=ADA:0&#/F]jmlkid_[\ahr|}{yvsnic\SI@70,,08@JXk}zy{~wqoryµƽyiXJ>634:FR[\WPLLPW_fmrstrolhaWI:03=CA==?CGMT[bjqxhREJ_u{vnmpxvkc\VQNMNOQSUXYYXWWX\bhmnkf`[VSPOOPU\frĺŽ|upoqstspia\YXYZWQG@F^||yvspoorttrkaUH?>CHF@979=BGKOQTWXZ[]^__`aabbdehlpuxvoijsxqifhjjigd`]]_ep|wqkgit~yvx}thf{~ysnhc^YUPLHC=86>Pftuogfq~|wsokhfdccb_XOKY}{skcYOF;2+&&)0;FQZ_`^ZTMGB=:8778:GOTVVUVX_gpvy|}}yvsponoqtxzysiaf}}wpjfcdglt~{~wlecdgjmnnmljhhimszÿyn^L<430&!-:FLLLWp{|wrnifdccb`\WRMJGEDCCCBBBBDDDEGIMS[dlqqkcbjsvuplnt{|wrlgb^[YZ\agpwyrkc]XTRQRTWZ[WNB;Da~{xvtsrpkcXQT]_[\cp~~zwussuw{~|thaj{uoib\UMF@:41/04:CNXaeeehrzzsnnprpljp{|vonptvz}}yuqonnoruuri]TYjywleda[WX[^behknruvvtojffglrx{zvohc_\[ZYXWWXY\_acdefhjjf`^dosnjkpw~zskc[TNIGGJPZeq{zv~y{{upmjijmqv|||yoe^_hrupg_VPWn{wsoligdb`^\[YXVUSQOMKIFDA>;976679;:76=MZ]ZZdw|ywvwwxwtqmifdb```abdhmsy}{shdq{n_SLIGFGHJMSY`gnsvwvuuw|vqpqrstux{}{qbVWg~uljnu~{wsolhda^\\]aejmonjfciu}upt|vqkd]UME>6.("")1:CLSYZWQKOdzvroljhfedba``_^^]]]]^^`cfjnqroiehpuphddfhijihgggilortttxzuqnkkkot{zqp¿wnjlnh^RJFDDEFIMT[bhlov¼ytokgdbabcfjlmljknog\]n}vng_XQKFB@??BEKQX^ejortutrpmkhgfffikmmjd_akstrtx{{zz~zupke`ZTOKGDBAABCC>6**ARUPMPZgu{wsolifdb_ZSMJNXaedfkt~|{yxwwwxz}}wpjhhhe^SJFFHJKKLLMORW]dksy~~zrke`]ZXXY[`fmswyumc]dx}zwtplhea]ZVRNJFB>;86568;AIS]gosvz|{|}~|{yyy{}~x}}voha\XUTTVZ_ekqw||wrmhc]WRMIECCDGKPSSL@1)4Plxtmmu~zuqnkhgggggfecbaaabcehkoswzzwrot|}xx{{xz~}vld_\YWTQMID?;7432246:>BFILNOQTZco|~w|~~zsorvungbbcfilorv{}vnf``gnqpnptx{zupq}{uoib\VQKE@:620..038?GR^it|~{tpv~zvrokgda^\[Z[]`cghgbYPMUhyzrnosz{utvwskd``chntz~|ywuttttvwxwtppu|~ytrsvz~}wvxytkaXSOLIFB?<9878:=??<723@Ysǿ|yuqmieb^\ZXXXYZ]_behkmnpqsux{wpq{}zxuspnkifca^[XVTRQPOOMIB:315860,-2:CMXbkrvwusu|{xvtssssttuwy}~vmmy}ulc^_ba\TNLMQV\ciqy~|zxvtrpnlkjjjjjifb__eovvoeZPLSfy~tkgfgjnprtuwxy{~|xtpkgb]XSMHB=941.--/27=CGJIFDI[u¾~}{ywvussrqqpqqrtvy{|yunkmsupicaaaba_]ZVRNJFB>;9778:>CIOUZ\[[[`fjgb^_fp|~|{zzyyywsnhegnsri]TSZdijils{zuqlheb_\ZWUTTUW[afkopmgabmz|{uoha[UOID@<:989GPX`jqsnlu|{zuqmknsvsld^ZYYZ[]^`bdfilnprtuvvvtsqomkjiikmptw{|ztka_gz||}tlgecba_\YUQMIDA=:86789<==;9;ER\_`chnuz~|yz}yy|}xtpmjhgggiknquy~~{ywtqnkhda]YUQLIEA><:99;=?BCC@8.#%7JUUOKKMRW_jy~wngccec]SIB=:875443469=CKT^irz}}xtvzsonrvvrmhfhkoqroicadhf_VOLKKKKJIHHGGHIKNQUX]`cfgggfeefintz|{|ȿ}xtplieb_][[\]_`a_\[_hsz}~}zwtqnjfb^ZVROMLKLMPTX]begd]TLKTetytjb]]`chknoppomljigfc_ZTOMPW^ba`_aeimqsvx}}{xvtsqomic\VSU[adca`aa_[SMMVgw}wqpsz¿~}|{{{}vpqx}tmiikoqsttrpmjfb^ZUQLGB=940+'$! #'-3:BJRZagjlkhhm~¼|uppsuqjb]\[\\\[[ZZZZ\^adinsx|~~|yxz~~xqljhhhijklnqtwz}|xqhacn|z||wrmhc_ZWSPNLKIGD@:523:BINPSW[_bflv}zywwwxz}{{xy{}}wroortrmf_[XWVTSQNJFB>951-)&#! !"$'*-//,& "0EW`a``cjs|ü}yuqmiea\XTOKGDA><;:;CEFGJOV]djptwz{{{{|~{wuuux{Ŀ}yvsoljhfeeegimqw|}zwtrqponljf`YRLJKMMJE@<;=@EJPUZ]_]XPGBFQ_gg_VOLKMPTX[^`cefhjmorux{{wrniea\XTPMIGEDDEGJNRVY[YWTT[k}{ywvvvvvvusnhcaced_YSONNNNNNMLKIFA:3-))+-,(# !$).39?AA?;3) $5DPX[ZZ\es~}vpor|¾¼~tkeceinsvvtng^UMHC?==>@CGLQV[`ejpuzwnhhq}|}~}xrkc\SLE>95310.,($"$)045447>>>>>?AEN[k|{vrnligggghigc]VQR[htyzyz}~||{|||{{zyxuspnkjiggghjlnprrpkc[UU^lzyvuwz|~}|{{~~vme^YUSQPOOOPRUX\aglqv{}wne\VSRTW\bipw~tmnuukebcfkqw~|wtromjfb]WRLF@:5/)$  '3@LV^cdb_`hx~}~~~|xqkd``bba]WRNMMNPSVXZ\^`bdfhkmptx}}wndZSOMLJD<5/,+-/38=CIPW]begghmt||xvvvwx{~{vqmkiggghjmosw{|yuqlgb\WQKFA<72.*'$!#'+046751+$"'4ET[\ZXZ_gq}|wsniea^ZWSNHA:2,)*-021//28@KWcp{Ľ{yvtrqponljfb]Z[^bdaZQHDFIKJGDBBDFIKMOQRUVXZ\^_aabaa_^\[\]`djpw}þ~zvspmkihgghjlnprrpnmou|~}}wtssrng_WQLIGEDBA@>>===>@BEHLOQQOJC;6671-+,+)#  - !%'(&# %0@Q]bca_`bglry|yuqmifb_\ZWUSRQQQRTVY]bhov}yuqmifc`][ZYWVURNIDBCHMPPNMNOQRSUX]djnomjfcaacehmrx}}zwutuvy}|wsqpooppqrtvx{}}zwsplhd`[WTPLIFCA?=<;9741-*()-3:>@@?=;73.*+2>KUYWRMJIKOU[ahnuzĿ|xtpmifda`^^^_`cfimpsttqmigjt~zvsomkigda\VOHDCCC@;4-($"! #*.000/137:62-)%   )4AKRTQMJLTbs{xvuttsrqponlkjihgggghhiklnqsvz~}yurpmjgd`\YUQMJGECAAAAAA@>;879>EJKJIHJLORTVWXXYZ]aekqx~zslhfhknoonnorv}{wsokgc_ZVRNJFC?<96310///0247:=@BBA=8426@MW\ZUPPSZbioty~yrjb\WTRPOONNNNOPRUX\afjnpqplheekx}|||ytng`\YXXYYYXUPIC?=>@>:3,'$#""##$$$%%%&'()+,-/01233334468;8530-+)('&'')+.1479;:850,,0;IWbggfeehmsz|yuqmiea]YUROLJHGFFFFGGGGFEEHMU^hpvy{{{ywttw}xtokgc_\YVTSRRSSSROJC:2,,06;<93-)'),16CHMRW]bgmqv{~ſ}}~}zuojfddddeffgggffffeedddddccddefghjlmopqppooquz~zqg^YZaku{|ytnifeefhjlmnooonmkjheca^\ZWUSQPONNMNNPRTW[`dioswxxwtrqrtuvx{}|vpligeb`]ZWTPMJGDB?<961,' !(.5:?ABA@@CKXfrz}{xuttw{}zxuqnjgc_\YVSQNLJIHHGHHJKNPTX\bgmsy}yuqliea^[XVTRQPONKHD?<:>=;97541.*((,3;ACA?<<=@EKQY`gntz~{xvsomjgeb`_^]]^_acfiloqrrplhdcfnzý|ytng_XTRRROJC<62/-,+*))('&%%%%&')+.147:=>??>==?DJQW]bfls{~|zzz{{yuojgffilosvxz{||||{{yxwutrpnlkigedba````abcefhijifb\VPNPVakqsnf\SLIIMSY]``_^^^_`bdfhiklmnopqrstuwxz{}~}{yyz|~yvx¿~|woha\XURPMJGC?;72.*%!  "+4=FNTY[YUQNNS_m|xrmigfhjmmlhd_ZWUUUUWXZ[]_`bdfhkmqtx|}}zyyzyvqkd^YURQPPPPQSTVXZ\\\ZXVUW[afhhec`__`abcdefhjmquz~~}|}}wtsssssrpnlhea]XTOKFB=951.*(%#!  !#%(*,..-+'!#0>LV[\\ZZZ\^bgox~zuoib]YWXY[[YVSPOORV[ahou|}~xqkhfghjifaZQH@:669<>=:51.--.0235789;<=>?@AAABAAA@@?@ACFKQXajuÿ}yusux}}}}~}|{{|{vqligedcbbaa`__^^^_`abdeffec^XPHB?AGPX\\WPIC@>?ADHMRW\`fjosvy{{{zzz|~|{yxxwxxyyzzzyxwvwz~|sjcbfo{|unifc`\XTPLHC>941.,+)('%$" !%).4:AGMSX\__^[WSSV_m}¿xrmigfffeeeeeeefgghijjihfca_`bfkpsvvvvxz}~zy}|wtssstvwxyyxxwutrpmkifdba_^]]]]]]]\[ZYYY[`eknpnjfccehkkigeegjntz|zxwvuuvvxy|~{xvutsrokf`YSNKIHGEA;4-'""$'*.158:::741./4>KXbikjhfefhlpu{{wtplhda]ZWTQPNMMMMOQTX\afkptx{}~~yuplhd`]ZWUTRQPOLIFB?>>ABB?:40./49?CFGGFFFFGIJKLMNOPQTW[`ekqw}~}{ywusqomljhfc`\WRNIGFGJMPQQPNMLKJHEA<8559@JRWXVQMIFEGIMQV[`ejotx|{xuqnligecbaaabcdfiknoqqpnkhfgks~~ytmf^XSPONLHB;50,*)))****)'%!"%'((()+.27CFHGFDCBDIS_n{zurqppppoomljhfdb`^\ZYXWWWWXY[]_bfjnsw|~|~}{xurokhea^[YWUTSRQPOLIEA?>?CGIJJHFEEGILNQTVXZ[]^_`abcdfint{~zwsokfb]YTPLHD@=:7532112357:=@BDDB>92*%#&.9EOTVTPKHGIMRYajrz~xrmiecba``__``abcehjmpsvxyzyvrnjhkq{}{zyywurnhaZTPONNLHB;5/,)(''''''''''''()*+-/1368;>AEHKNQSWZ_foz}|}}}}|{ywusqpopqrtuwxyyyyxwvutrqonlkjjiiijjklmooonlhb[TMHGIPYafhfa\WTQPOONNNORV[afikkjiggghjmpsvx{~}zwvwy}{wvy{wvtrnhb\WTQOMLIGDA=951-)%!  &,3:BIOUY\]\ZXX[airz~ywuuttrpmiea^]]_abca_[XVTTUWZ^bfjoty~|{~~yvuuvwy{|~~zupjd`][\]^^\ZWTRQQRUWZ[\\[[[^bgkmlifb_\[[\]^`cfimptx{~~}{zyzz|}zz{|{zvqlfa]YVSPMKHEB?<9630.+*)(''()+-/134430,(# $-8EPX\]]]]_ciov|~|zwurpnljigfeca^[XTRPQSX]cinqtuwxyz{zyxww{|zxvtqnjfa[VPLGDBA@A@>:5/*'%&(+/37;>ACFGHJJJKJJIIHHHHIKNRW^emu~|{}~{xvvvxz}}yuqmkkklmlifa\XUSRSTVXZ]_bdeeda]WQIC??BHPVZYVPJD@>=>@CGKOTY]bgkpuy~|zwusqpnmmlmnoqtwz~yslhgks~}wqlighhfc\TJA93.,,-.//,)$  $'+/49>CHNTY^bfhihfc`^^bkwÿ{upkhfeedddccbbaaa`aabcdfgikmnooonnoqtzztnklpx|wspoooopqqrrrqpomljhfdb`^\[YYXXYZ[^`dhlosuvusnjgfglsz~}{yutuy|wvsrlfhhikkmorux|~~{wsqos||{zywvsnnptxz{yrfYOFCHQZ]YJ5!(5:8-%19@DFFEGD@;6448?JVajorstuwz~ƺɻ~yywsqnmkjiihfda^YTOKHJO[l{yoknw~zuplgc_[YVUUVXZ]`bdd`ZSJB;63111248=CJOSUTROKHDA?=;;;96420.,*('%$"!  "$'*-049?EJPUZais}ÿ{unf_XSPNMNPRTVY\^`begiklmrz{wwvvw|}~}{{z{{x|{umd]TLGEEHNV`hnqoi_SG>88?BIR\ekmlieccfjpv{~~{xussv|¹ÿ}ywvwwxyxxwuqnjgffhlptxzzxvrnjfb]YXXY]biqz}ti]OB81./5FLQSRPLGB=975567;BFJNRUX[]^]][XUROLJJLPXcpxw}yttx|mb]`iuxngdflry{tlda]YWUSPNKHFDCCCCCA?<84357=FQ\flonkf_XRLFA>==@ELU_ju}{z{~zpha]\_emv}zslfehow|vsrtwz}}pdXOJHJMQTVVUTQOKGA:2*! - - - - ").49=BGKORUWY[\^`dkuxpic^YVTSSTVX\`dimqtuwwvtromkiihikmosux{}}||||||{zwrokfb]YVTSSUX\aglorrqnjea^\[]`ejotx||vqnjjloruxy{{{{{{{zzyyxxyzz{}~{sompu}ylaWPJGGHJMQTVWVTQLF@81)!  $*.2579;<<<;;=@ENXclswxvsokhffhjot{}|{zywvsplhd`[WSPMKJJKMPUZ`ekqvz}~|zxusqppsy}{ywuspnjf`ZRJB:40../1111236:@FLRX[^__^[YWVVWZ]`cegijmpty~ÿĿ~|zyvolljje[[ZYXMIIFFC=;;99631-*% "1@JRY\]]\\\\]^]^^^__aeins~||}m_X[fuvka^`ht{qigdcfkrx~õrf\URSVZ^^[XTNGA:3-(#  #(-38=EKNQQQOKF?7/'!"*8J]o{}uja^bn|tponnnnmmnqtx{}|{vqlfa_]]^afjnruvwvuspnlkjklptuwwvtoibYPHA>>CKWcow~ysle^YTRRU[ckswxtlcZTRU]ht{yxy{~{zzz}ysomosy~zwuuuxz~|z||n`SIA=;;<>?@@?=:73/,(%$$##$%'*-059>CHNSW[]^][TLD;4/.29DP\fnswy}zrkea__bflqvz{yuoh`WPJFEGLT^it|vtsv{{uojgefhlqv|}ulbXPIDAABEJPV[_cegjloswz{zwqkc\VOJFA=;97567;?FLT]env}zvvzýxrooquy}~|yvrmga[TMF?93.)%"  "%)-26;>ABA>92*#!)2<:986531/-,)'%#!  !"$&)+/3782.+*)*+,-.///.-,+++-/36:=?@AAAABCEHKNQTVXYYZYZ[_fo{{yxxzzzxvspnlkkllmnooooonlkjhfecbbabcdfilosw{|tld]YWY_fnuz|zvpje`][[]_behloqtuvwwvvusrpomlkjiijjklnpqsuuvusqnljikmpsuvutrqppqsw|~xqjd_[VSOLHDA=951.+(&$"!!!!"##$%&&&'()+.159<>?>;9769>FPZcjoqrsrstwz~}yuqnljiiiijkllmmmllkjiihhhhijlmprux{~}}~|ywurpnljigec`]YUQLHEDDEHJKKJHEB@>=>?@BEHKMPSVXZ\^_acfjnu||yxvvvvwxyyyxvtroliea]YUQMIFDB@@?@ABDFGIJJIGD@;5/*'')-39?DHJKLMMNOPSVZ_ekrx~}{{{|~~{xtqnljjklnpsux{~}yurpptz{uoib[VROMMLKHD?93.*'$#""""""""""""#$%')+.159=BFKOSW[^`cehknqux|¿~|yuqmjhgghhiiihhhhhijkmoqrtuvwxyyzz{{|}}~~~|yuqke`[WVX\bhnstsplhc_[XVUSSRRSVY]bglqtuvvutssttvxz}|yvvw{}sojgcgnpwƼxj\PD;74336:;<<==?BEHJJIFC@>=<=>ADHMT]cjotx|}}|yvronmosy}vrsx~~woh`YSNJGEDEEEFFGGGFBA@@?><;9752/,($(3AN[fnqrokf`[XUUWZ_emt{}yvvwy}wne]XVX]ckrxzzvqjc^ZZ]bipx~|pdWKA942357:;:974323469;741.+)('(),.13679:;<=>?@ABBCCCDGJOU\dkqvyzzyywvuuvwxz|~ſ|xusqomkjhgeca_^\ZYXWVVVWXY[^adhlquz~|zxvtrpnmkifda]ZXVUTTSRPMIE@<840-*('&&')+.1468;=?BEIMRX^elt{~{ywusqpnljgeb`^\ZXWVUUVWXZ\^`bdefghggfeca_][YWVVVWYZ[ZYXUTRQPPQSUX[^behkoqtwy|~~}{zyxxwvvuuuvvwwyz{|}~~~}|{{{|~~xsnjfa]XSMF@:50,(%" #(-28=BFJMPSUWY[^adiow{wsqomllklllllllllllmmmnopqrsuwy{}}zxvtrpnljihgfeeeeffgghhiijkklmnoqrsuvwxxyxxwvuuuvxz|~~}}}}}}}}|||{{||~zupkfb^YUQMHD@;72.+'# !$(+/37:=?ABCDFHKOTZahnswyzzzzz{}~|zxvtqnkheca_]]\\\]^_acegjlorux{~~|zxvspmjhfdba`__^]\[ZXVTQONMLLLLKJIGEDBA@???@@ABCDEGIKMPSVZ^beimqux|}|zywvusrpnljheca_][YWUTRQPOONNMMMLKJIHFEDDDEHKPTY]_abaa````bdgjnqtwy{}~{xtqmjhfedddeeffffgghiklnprsuvvwwwxy{}}zvrmhc^YURONLJGEB>;86420/..----,,,,,--./012469<;;;;;<=>?ABDFILOTY^hoty}~}ytmfa_`gq}{xvtstw{}zxxz~}zyxxyz{}{yvtqoljgd`]YUSQPQSW\bilnnke^VMFBAEKS\ekmlib\VQMMOSZahouz~}zxxy{~|xusstw{ztmifefimquxzzywtpkfa\XTPMJHFECBBA@@@@@@AABDFHJMPSW[_dhmrw{{yvsrrrsvy}{yy{~}{{{{}~zvspmieb^ZWTQOMLKKLNPRVZ^behkllkjgc_[WSPNMLMNQSTVWY[]^acehkmpsvy|~}|{|}zvtrqpooopqstvxz{}~|{zxwusrpnmkjhggffghijlnqrstuvwwxxwwusqnkgeb`_`adhmsz}zywvutsssrrrrrqpponmlkjigfedcbbaaaaabddfghijkklllllllkkigda]XTOLIGGGHJMQUY^bfknruxz|~}{zyxxxyz||xtqmjgeb`^[YWVTRQPONNNNNNOOPPQRSTVWZ\^`bdfhjmoqtvy{~}zwusrrrrrstvwxz|~~|{{zzzzyxvsqmjgc`^[YXVUUTTSSSSSSSTTUVWYZ\^`bdfiklnprstuvwxxxxyz{}~~|{ywvtrqonlkihgedcbaa``aabbcdefgijlmnpqrrssttuuvwyz{|||{zywusqponmmnopqsuwy{}~}|{{{zzzzzyyyxxxxxxyyz{|}~~|zxvtrqonmlkjihgfedcbaaaaabcdefhijkmnopqrstuuvvwwxxyzzzzzzyyxxxxxxxxxyz{|}~}{ywusqpnmkjihggfeeddcccbbbaa``_^]\[ZXWVUUUUUVXYZ[\]]\\\[[[ZZZ[[\]^_`abcdefghhiklmoprtvx{}~}|{zzyyxxwvvutsrrqqqrrrsstuuvwwxxyyzz{||}~~~~~}}}}}}|||{{zyyxwwwvwwwwwwwwwvvvvvvvvvvvvuvvvvvvvvvvuutttsssrrrrqqponmlkihfedccbbbbbba`_^\[YXWVVUUVVVWXYYZ[\^_`abcdeghjlmoqsuwyz|}}{ywusrpomlkihfecb`_^]\[[ZZZZZZ[[[\\]]^^^__`____^^^_`abdfgiklmnopqrstuvxyz{|}~~~}}}}}||{{zyyxwwwvvvvvwwwwxxyyzz{{||}}~~~~~}}}||||||||||||}}||||{{|||}~~~}}|||{{{zzzzyyyyxxwwvuuttsssrrrrqqppoonnmmmmllkkjjihhgfffeeeddccbbaa``___^^]]]\\[[[[[\]^_`abbbbbbbbbbbccdeefhijlmoprtuwyz|~~}}{zzyxxwwvvvuutsrqqppooooppppppoooonnnnnnooppqrstuuvwxyyzzzzzzzzz{{||}~~~~~}}|||{{{|||||||}}}}}}}}~~~~~}}}|||{{{{{zzzzyyyxxxxxxxxwwwvvvuuuuuttuuuuuuuuuvvvvvvvwwwwwwwwwwwwwwwvvvuutttssttuvwwxxxxxxxxxxxxxyyzz{||}~~~~}}|{{zyyxxwvuutsrqponlkjjihggfeddcbaa`````___```````````aabccdeeffgghhhhhhhhhhhhiijlmnprsuvwxxyyzzz{{{||}}~~~~}}}||||||||||||||||}}}}}}~~~~~~~}}|||}}}~~~}}||{zzzyyyyyyyyyzzzzzzzzz{{{{{{{{||{{{{{zzzyyyxxwwwvvvvvuuttsrqqpooonnmmllkkkjjjjiiiiiiijjjjkkkllllmmmmnnnoopqrstuvxyz{{||}}~~~~}||{{zyxwvvutsrqpoonnmlllkkjjiihhggfffffgggggggggggghhiijjkllmmnoopqqrstuvwxz{|}~~~~~~~~~~~~~~~~}||{{zzzzz{{{{{{{{{zzzzzz{{{{||}}~~~}}|||{{||||}}}||{{zzyyyxxxxxxyyyyyyyyyyyxxxwwwwvvvvuuuttsrrqpoonmmllllkkkjjjiiihhhhhhhhiiiijjjkkllmnnoppqrsstuuvvwwxxyyyz{|}~}|{zzyxwwvuuttttsssssssssssssssssssssssssttssssssstttuuvvwwwxxyzz{{|}}~~~~~~~~~}}}|||||}}}}}}}}}}~~~~~~~~~~~~}~~~~~~}}}||{{{zzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}}}}}}}|}}}}~~~~}||{{{{{{{{{{{zzyxwwvuttsssrrrrrqqqqqqqppppppooooooooooooooooooooooooppppppppqqqqqrrrsssttuuvwwxyz{|}}~~~~~}}||{{zzyyyyyyzzz{{{||{{{{{{zzzzzz{{{{{{{{{|||}}~~~~}}}}}~~~~~~}}}|||{{{{{{{zzzzzzzyyyyyxxxxxxxwwwwwwwvvvuuuttttttttuuuuuuuuuuvvvwwxxxyyzz{{||}}~~~~~}}|{{zyxxwvvuuuuuuuutttssrrqqppooooooooopppqqqrrrsssttttuuuuvvvvwwwxxxyyyyzz{{|}}}~~~~}}||{{{zzzzzzzzzzzzzzzzzzzz{{{|||}}}}~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{{{{{{{{{zzzyyxxwwvvuuuutttttttssssssssssssssttttuuuuvvvvvvwwwwwxxxyyyzzz{{{||}}~~~~~~}}}||{{{zzzyyyyyxxxxxwwwvvuuutttttttuuuvvwwwwwwvvvvvvvvvwwwwxxyyzz{||}}~~~~~~~}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~}}}}}}}||||||{{{{{{{{{{zzzzzyyyxxxwwvvvuuuuuuvvvvvvuuuuttttttttuuuuuvvvvwwwwxxxxxyyyyyzzz{{||}}}~~~~~~}}}|||{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzz{{{||}~~~~~~~}}}|||||||||||||||{{{{zzzzyyyyyyyyyyyyyzzzzzz{{{{{|||||}}}}}}}}}}}}~~~~~~~~~~~}}}|||{{{zzzzyyyyxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwvvvwww|}~~|zvsqliiiikquw{|yqllnvumlr}wnkns{xuutttuuwy{~}vpljmqx{snmot{xqljjlqv}{smhhks}|phhp|xnhioyxuqmjihhijklmmmnmmlkjjihijlnquz~{uokiimry{snkijnsy~~zwtrqponooooooooopqrtvy|wplkowypklrzysnkklosw{|yurolllnquy}vqmllnrx~zupmjihhhikmoqtvxz|}~~zwvsromkihhilotz}tnjils{xqljkmqw|ztpmjiijlpuz|wsomllmorv{{vrnlklotz}wqmlnrw~~zwtrponmmmmmmmmmmmmnnopqrsuwz}{wsolkkkmptx|~{xvsqpnmmlklmlmmmmnopqsuwy||vqmkjlotzytpljiijkmpsvy|~}{ytrpnmkjjjklnpsvz~|yvsqonnnnopqstvxz|}}|zxvurpomllllnpsw{{vronmnqtx||yvsqomlllmnpsux{~zvsomkjjlnquz~{xtqomllkjjjjkkllmnnoooooooonmmlllkkkkkllmnpqsvx{}}{ywusrponnmmmmllmmmmmmmmmmnnnnnmmmmmnnopqsuwz}~{wurqpopqrtvy|~{ywusqonmllllmnoqsuwy{~|zwtrpnmkkkkmnpsuy|}{ywvusrqppoonnnnnnnnnnoooppqrstuvxyz|~~}{zyxwvuttssssrrrrrrrrssttuvvxyz{}}{xvtrponnnnopqsuvxz{}~}{zywvusrqponnmmmmnnopqrstuvxyz{|}~}{zywutrqonmllkkllmnprsuxz|~}}||{{{{{{{{{||}}~~~~~~|zxvtsrpoonnnnnoopqqrstuvwxyyz{||}}}}}~~~~~~~}}}}||{{zyyxwvvutsrrqppoonnnnnooopppqqrrssttuuvvwwxxyyzzzzzzzzzzzyyyxxwwvuutsrrqponnmmmmlmmmnopqrsuvxz|~}{zxwutsrqpoooooooooopppqqrrrrssstttuuuuvvvvvvvvvvvuuuuutttsssrrqqpppoooonnnnnnnooooooopppqqqrrrrrrssssssssssssrrrrqqqppooonnnnmmmnnnoopqrstuvwxy{|}~~}|{zxwvuttsrrqqppppppoopppppppqqqqqrrrrrrrrrrrrrrrrrrrrqqqqqpppoooooonnnoooooooooooooooooooooooppppppppppppppooooooooonnnnoooooopppqrrsstuvvwxyz{|}~~}|{zyxxwvvuutttsssrrrqqqqqqqppqqqqqqqqqqqqqqqqqqqqqqqqqqppppppppppppooooooooooooooooooooooooooopppppppppppppppppppppppoooooppppqqrrssttuuvwwxyyz{||}~~}}|{zzyxxwvvuuttssrrrrqqqqqqppppppppppppppppppppppppppppppppppppppppppppppppppooooooooooppppppqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}}~~~}}|{{zzyyxwwvvuutttsssrrrrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppppppqqqqqqqqqqqqqqqqqqpppppqqqqqqrrrssttuuuvvwwxxyyzz{{|}}~~~}||{{zyyxxwwvvvuuuttttsssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssssssrrrrrrrrrrrrrqrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssttttuuuvvvwwxxyyzz{||}}~~~}}}||{{zzyyxxxwwwvvvvuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssstttttttttttttttttttttuuuuvvvvwwwwxxyyyzz{{||}}~~~~~}}||{{zzyyyxxxxwwwwwwwvvvvvwwwwwwwwvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvwwwwwwxxxxyyyyzzz{{|||}}~~~~~~}}}||{{{zzzzyyyyxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxyyyyyyyyyzzzz{{{{|||}}}~~~~~}}}||||{{{{zzzzzyyyyyyyyxxxxxxxxxxxxxxxxwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyzzzzz{{{||||}}}~~~~~~}}}||||{{{{{zzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{{{||||}}}}~~~~~~~}}}}}||||||{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~}}}}}}}}}|||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}}}|||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}rlkjikqtvyz}wtokijlpv}yqljjnszysokijkmovz}~zuqmjikpwskjp}sjjsvmiimu}~}}}ysnkikou|~vokikov~~wqljiknsx~~wqljjmt}zpjkr}umjkrz{wspmlkjjjjjjjjjjjkkmqtwz~xsnkjlpv|xrnkklpty|zwusqssrrqrrstuwy|~vpkjlrzyqkjnt|{uoljjkmpsvy|{|~~}zxvsqomkjjkmosx|ytokjjlouz}ytrpmkjjjklmoprstuvvwwvvuqpomlkkjjlmpty~{tnkkns{|uplkkmqu{|wromkkkmpty~zuqnlkklnptw{|xtpmlklnrw}}wqmkknrx~~{xvtrponnmmmmlmmmnnprsuvy{}}yuqnlkkkmpsw{~|zxwvttsstttttuvwxy{}~ytpmkkmpuz|wspmlklmnpruwy{~}|zxvtqpnmlllmnprux|{wtronmllmnoprtvxz|~}{ywurpommlmnqtx|zuqnmmnquy~~}|{zzyyyyzz{|}~|yvspnmmmnprux|~}|{{zzyyzzz{|}~zvrpnnoquy~}yurponnoprsuxy{}|uga^\Y[_`dgkz}|ztpjfea`achmu~zsmjknrx~|smgdb`bglry|yvtsrqpppqtyxpou{mfhrunmov{xvyxxxz|}zy{}tmhgimt}|xuuvy~}sjc]Z[`itvnjmvumjlrzzvqkgca``bcfhknpsuwxyzz{}~~|vqkgdcdgmt|ysnkjknptx}{xtpmjhhikou{zustyulggls||xvvwy{~|zxvtrponmmlllmnorux}ysmihhjnsy}zxvtqomkihggghjmptw{||}|{yvroljijlosy~|vpljkpw|tnjhghkosw{~|wrnieba`acfkpv|zupljgffgikmpsvz~}{ywwwy|{tokjknsy|yvspmkhfdcbaabcgjmpty}{vrolkjkmosw|{vrnkighjknqtx|}yupmjhhilpv|}wrmifdcbcdegjmpsuw{~~zvrokhecbaaacehkotx}{vrokifdcbbcdegjmquy}~zwsqommmmmnpqrtvx{~~xtomllmpty~~{ywvttttvwy|~zvspnmlmnorux||ywutuvxz}~{wtqnlkjlnqv{}xsoligfeefgjnrw{ynkea]WUSRQS\]^`bpxy}xqid`[YXY[^djqw|zvsqpquyyrlg`\[[\^aeimpwxoga\Z[`iu|z|{ndacir|}vmieccejr{||xrlihimsz~}||wtsv{yl`VRV_lz}tlijq{|tnhc_[YWUTSSSSTVX[_chmsyvme^ZXX[`gnv|}xtrqqruy~|xtqmnnlkklmoqtwz||xtqpsy~xwz~voifefimpu{}vnjea^]\^`djpx~{zz|}|zyyyyyz{{|}}}}|{ytqolifdbaaabehkptzuka[WW[bku}}xspnorvz~}}}~ztnieb``adglpuz|yvtrqpppqrsuwx{{|{tnhecbdhmu}|xutuy}~}|||}}~~~}|{yxvtrponnnoqtwz|zyxxyz|~~|zwuspnljhgghilotyyqic^[Z\`elsz|yvsrqpppqqpqqqrrrrssstuvwxz|}~|zwurpnljiiikloqux{~|yvsqnljihggghikloqsuwz|~~xsnjfcbbdglryzvsrrsvx|~~~|zyxwwxyz|~}{yxvuuuvx{~xqkfb`_`cglrx~}zwusqppoooooooooopppqrstuvwyz|}~~~~}{zxvtrponmmmnoqsvx{}{tsponc`aabbadfijs||~wpqpjgccjklorw||uokiikqx}zxwvwxyz{{~}~}|yz{xwuuwy~tlltrgdl{~z{~{yxxxxz}}vqmlmoruxzzxuqmjikou}wne`\[]`ekosy~yqib\Z[`juwpot~vkdcfmu|{vqkgdbaaacdfhjlmopqrrssrrrqqqqstwy|~xqljiknsz}{ywusrqqqqrsuy|ysqsxwohgiq|~}|}~~~|{yyxxuuvwyz|}~zvrnkihijmqv|~ytnjfca_^^_`bdfhjloqssrsttttsqomkhfdbbbdgkqw~}wrnnqv}{rjc_]^adinsx||vsqonnnpsvy~~zvsqppqrux{}zxvwx{{uokijnsz|xvsqomkihgggghiknquy~ytpliggghjlosvz}~|yvtqonkklkkkkkllmnoqrsuvwy{|~~zvsomllnrw|xrkfa^\[[]_bdgjnqux{~{wsojgda`__adhlrw}}{zxwvvvvvvwxy{|}~}|zyxwvuttssttvwy{~}xtpmllmpsx}~xsnkhfeefhjloqsuwy{|}~~{xuromkjjjlnqtx}zvsokhfdcbbbbcefgijlmopqrrrrrqonkigeba`_`acfjotz~|{zyxwwvvvuuuutttsrrqppoonnnoppqstvy}{xurpooopqtwz}{vrnjgeddefgikmoqstuuvvwwxxyz{{}~|ywtqomkihhhijknpsvy}|zwvtrqpoooooppqqrrssttttsrqponlkkjklnpsvz~~~}||{zzyyxxxxxxxyz|}}zxvtsrqqrrsuvxz{}}yuqmjhedddefhjlnoqrsssssrrrrrrssstuvwxxyz{{|}}}}~~~}|zxwuspnlkihgggggijlmpruwz}~~~~}}}~~~~~}|{zyxwwwwxy{~~{yxwutttsttuvwxyz{|}~|xuroljhgfgghjkmoprssttttssssrrsssttuuvwwxxyyzz{{||}}}}~~~}}}|{zyxvusrpomllkjjjklmnprtvxz}~~~~~~~~~}|{zzyyyyy{|~}{zxwvvuuuvvwxyz{|}}~|zwtqomlkjjjklnoqrstuuuuuuuttttttttuuvvwwxxyyzz{{{|||}}}}}}}||{{zywvutrqponmmmmmnopqsuvxz|~~~~~~~~~~}|{{zzyzz{|~~|{zyxwwwwwwxxyz{|}}~}{yvtrpommmmmopqrtuvvwwwwwvvvvuuuvvvwwxxxyyzz{{{||||}}}}}}}}}}|{{zyxwutsrqqppooppqrstvwyz|~~~~~~~~~~}||{{zz{{|~~}|{zyyxxxxxyyz{{|}}~~|zxvtsqppooppqrstuvwwxxxxwwwwwwwwwwwwxxyyyzzz{{{{||||}}}}}}|||{{zyxxwvutssrrrrrrstuvwxy{|~~~}}||||||}~~}|{zzyyyyyzz{{||}~~~}{yxvutsrrrrrstuvwwxxyyyyyxxxxxxxxxxxyyyzzzz{{{||||}}}}}}}}}}|||{zzyxwwvuuttsstttuvvwyz{|~~~}}||||}}~~}||{{zzzzzz{{{|}}~~}|{yxwuuttsttuuvwxxyyzzzzzzyyyyyyyyyyyyzzzz{{{{{|||||}}}}}}}||||{{zzyxxwwvvuuuuvvvwxxyz{|}~~~~}}}}}~~~}||{{{{{{{{|||}}~~~}|zyxwvvuuuuvvwxxyyzzzzzzzzzzzzzzzzzzzz{{{{{||||||}}}}}}}}}}}}||{{zzyyxxwwwwwwwwwxyyz{|}}~~~~}}}~~~~~}}||{{{{{|||}}~~~~}|{zyxxwwwwwwwxyyzz{{{{{{{{{{zzzzzzz{{{{{{|||||}}}}}}}}}}}}}}}}|||{{zzyyyxxxxxxxxyyzz{|}}~~~~~~~~~~~}}||||||||}}}~~~~~}|{zzyxxxxxxxyyzz{{{||||||{{{{{{{{{{{{{||||||||}}}}}}}}}}}}}}}}|||{{{zzzyyyyyyyyzz{{||}}~~~~~~~~~~}}}}|||}}}}}~~~~}}|{{zyyyyyyyzzz{{||||||||||||||||||||||||||}}}}}}}}}~~~~~~}}}}}}|||{{{zzzzzzzzzz{{||}}~~~~~~~~}}}}}}}}}}~~~~~~}}|{{zzzzzzzz{{{||||}}}}}||||||||||||||||}}}}}}}}}}}~~~~~~}}}}}}}||||{{{{{{{{{{{{|||}}~~~~~~}}}}}}~~~~~~~~}}||{{{zz{{{{||||}}}}}}}}}}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}||||||{{{{{{||||}}}~~~~~~~~~~~~~~~~~~~~}}|||{{{{{{||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}|||||||||||}}}}~~~~~~~~~~~~~~~~~~~}}}||||||||||}}}}}}~~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||}}}}}~~~~~~~~~~~~~~~~~~}}}}||||||}}}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}|{zyxwvvutssrrrrqqrrrstuvwxz{}~~|{yxwvtsrqqpppppppppqqqrrrsssttuuvyz|yz{vz~}}{zyxwuutsrrrqqqqrrsttuvwyz|~~~}}}}|||||}}}~ytsx|wtsrstuvwxyz{|}}~~~~~}}}||{zzyyxwvuttsrrqqpppooooooooopppqrrstuvwxyz|}~{xurqruz~zwusrqppppppqqqqqrrrrrrrssssstttttttttuuttuuuvvwwxxyyzz{{||}}~~~|yusqpoqsw||ywusqqpppqqrrstuuuvvuuttrqppoonnnnooppqrstuuvwwxxxyyyxyyyyzz{{|}~}{xusqppqruy}|zxvutsrqqqppppppppqqqqqqqqqqqqqqqqqqqqqqqqqrrrssttuuvwwxyzz{|}~~{xvutstvx|~{yxvtsrqqpppppooooooooooooooppppppqqqrrrssttuuuvwwxyyz{||}~~|zxvuuvx{~}{zyxwvvuuuttttsssssssrrrrrqqqqqqqqqqqrrsstuuvwxyz{|}~}zwtrpoopsvy~~{ywuttssssttuuuuuuuttsrqqpooooooopqqrstuvwwxxyyyyyyyzzzzzz{{||}~}{ywusqpppqrux{~~}{yxvuttsrrrqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrsssttuuvvwwxyyz{||}~}{ywutsttvxz}~|zxwvutsrrqqqpppppppppppppppqqqrrrrssttuuuvvwxxyyz{{|}}~~|zxwvvvwxz}~|{zyxwvvuuttssssrrrrrrqqqqqqqqrrrrsstuuvwwxyz{|}~~|zwusqpopqrux|}{zxwwvvvvvwwwwwvvuutssrqqpppppqqrrstuvwwxyyzz{{{{{{{{{{|||}}}~}|zxvusrqpppqrtwy|~}{zyxvvuttssrrrrrrrqrrrrrrrrrrrrrrrsssstttuuuvvwwxxyzz{||}}~~|zywvutttuvwz|~}{zyxwvuttssrrrrrqqqqqqqrrrrrssstttuuvvwwxxyyzz{||}}~~~|{yxwvvuvwxz|~}|{zyxxwvvuuutttsssssssrrssssssttuuvvwxyyz{|}~~~|zxvtrqpppqrtwz}}|{zzzyyyyyyyyxxwvvuttsrrrrrrrsttuvwxxyzz{{||||||||||||||}}}~~~}{zxwutrqqpppqrtvx{}~|{zyxwwvvuuttttssssssssssssssstttttuuuvvvwwxxyyyz{{||}}~~~|{zxwvuttttuvwy{}~|{zyxxwvvuuttttssssssssttttuuuuvvvwwxxyyyz{{{|}}~~~}{zyxwvvuvvwxz{}}|{zzyxxwvvvuuuuttttttttuuuuvvvwxxyyz{||}~~~}|zxwutrqpppqrtvy|~~}}}}}}|||{{zyyxwvuuttttttuuvvwxyyz{{||}}}}}}}}}}}}}}}~~~~~|{zxwvusrrqpppqrstvxz|~~}|{zyyxxwwvvvvuuuuuuuuuuuuuuuvvvvvwwwxxxyyyzz{{||}}}~~~}|zyxwvuuttttuvwy{|~~}||{zyyxxwwvvvvvvvvvvvvvvwwwwxxxyyyzzz{{||}}~~~~}|{zyxwvvuuuvwxy{|~~}|{zzyyxxwwwvvvvvvvvvwwwxxxyyz{{||}}~~~~~}}|{zxwvtsrqqpqqrtvxz}~~}}|{zyyxwwvvvvvvwwxxyzz{||}}~~~~~~~~~~~~~~}|{zxwvutsrrqqqqrrstvwy{}~}||{zzyyyxxxxxwwwwwwwwwwwwwwxxxxxyyyzzz{{{|||}}}~~~}|{zyxwvuuttttuuvwxz|}~}||{{zzyyyxxxxxxxxxxxxxyyyyzzzz{{{|||}}}~~~}||{zyxwwvvuuuvvwxyz|~~}}|{{zzyyyyxxxxxxxxyyyzzz{{||}}~~~~}}}|||||{{zzyxwvutsrrqqqrrtuwy|~~~}|{zzyxxxxxxyyzz{||}}~~~~~~~~~~~~~~}|{zyxwvutssrrrrrrstuvxy{|~~}}||{{{zzzzyyyyyyyyyyyyyyyzzzzz{{{{||||}}}~~~~}||{zyxwwvuutttttuuvwxz{}~~~}}||{{{{zzzzzzzzzzzzzz{{{{{||||}}}~~~~~~}|{zzyxwwvvuuuuuuvwwyz{}~~~}}|||{{{{{{{{{{{{|||}}}~~~~~}||{{zzzzzzyyyyxwwvutssrrqqrrtuvxz}~}}|{{zzzzzzz{{||}~~~~~~~~~~~~}||{zyxwvvuttssrrrrrsstuvwyz|}~~}}}|||{{{{{{{{zzz{{{{{{{{{{|||||}}}}~~~~~~}||{zyyxwwvuuuttttuuvvwxy{|}~~~}}}}||||||||||||||||}}}}}}~~~~~~~}}|{{zyyxwwvvuuuutuuuvvwxyz|}~~~~}}}}}}}}}}~~~~~~~~~~~~~~}||{zzyyxxxxxxxxxwwvvuutssrrrrrstuvxz|~~}}|||{{{|||}}~~~~~~~~~~~~~~~~~}}|{{zyyxwvvutttssssssttuvwxyz{}~~~~}}}}}}|||||||||||}}}}}}}}~~~~~~~~}}||{{zyyxxwvvvuuutttuuuvvwxyz{}~~~~~~}}}}}}}}}}}}}}~~~~~~~~~}}||{{zzyyxxwwvvuuuutuuuuvvwxyz{|~~~~~~}}}~~~~~}|{zyyxxwwwvvvvvvvvvvvuuttsssrrsstuvwy{|~~}}}}}}}~~~~~~~}}}}}}}}~~~~~~~~~~~~~~}}}||{{zzyxxwwvvuuttttttttuuvvwxyz|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuuttttuuuvwwxyz{|}~~~~~~~~~~~~~~~~~~~}}}||{{zzyyxxwwvvvuuuttttttuuuvwwxyz{|~~~~}}}}}}}}~~~~~~}|{zzyxwwvvvuuuuuvvvvvvuuutttsssssstuvwxz{}~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}}}}}|||{{zzyyyxxwwvvuuuttttttttuuvwwxyz{|}~~~~~~~~~~~}}}|||{{zzyyxxxwwvvuuuuuttuuuuvvwwxyz{|}~~~~~}}}}|||{{zzzyyxxwwwvvuuutttttstttttuuvwxxyz{|~~~~}}}}}}}}}}}~~~~~}||{zyxxwvvuuuttttuuuuuuuuuuutttssssttuuvxy{|~~~~}}}|||||{{{{{{{{{{{{{{{{{{{zzzzyyyxxxwwwvvvuuuuuttuuuuvvwwxyzz{|~~~~~~~~}}}||||{{zzzyyxxxwwvvvuuuuutttuuuuvvwwxyz{{|}~~~~~~~~}}}}}|||{{{zzzyyxxwwwvvvuuutttttttttttuuvvwxxyz{|}~~~~}}}}|||||}}}}}~~~~~~~}||{zyxxwvuuttttsttttttuuuuuuuuttttttttuuvwxz{}~~~}}|||{{{{{{zzzzzzzzzyyyyyyyyyxxxxxwwwwvvvvuuuuuuuuuuuvvwwxxyz{|}~~~~~~~~}}}}||||{{{zzzyyxxxwwwvvvuuuuutttuuuuuvvwwxyyz{|}~~~~~~~~~~}}}}}}||||{{{{zzzyyyxxwwwvvvuuuttttsssssssstttuuvvwxxyz{|}~~~~}}}|||||||}}}}}~~~~~~~~}}}|{{zyxwwvuuttssssssstttttuuuuuuutttttttuuvwxy{|~~~}}||{{{zzzzzyyyyyyyyyxxxxxxxxwwwwwvvvvvuuuuuuuuuuuuvvvwwxxyz{{|}~~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvuuuuuutuuuuuuuvvwwxyyz{|}}~~~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvuuuttttsssssssssssssttuuvvwxxyz{|}~~~}}}}|||||||}}}}}}~~~~~}}}||{{zyxxwvuuttsssssssssstttuuuuuuuutttttuuuvwxyz{}~~~}}||{{zzzyyyxxxxxwwwwwwwwvvvvvvvvuuuuuuuuuuuuuuuuvvvwwxxyyz{||}~~~~~~~}}}}}||||{{{zzzzyyyxxxwwwvvvvuuuuuuutuuuuuuvvvwwxyyz{{|}~~~~~~~~}}}}}}||||{{{{{zzzyyyxxxxwwwvvvuuuttttssssssssssssstttuuvvwxxyz{{|}~~~}}}|||||||||||}}}}}}}}|||{{zzyxwwvuttssrrrrrrrssstttuuuuuuuuuuuuuuvvwwxy{|}~~}}||{{zzyyyxxxwwwwvvvvvvuuuuuuuuutttttttttttuuuuuvvvwwxxyzz{|}}~~~~~~}}}}||||{{{{zzzyyyyxxxwwwvvvvuuuuuuuttuuuuuuvvvwwxxyzz{|}}~~~~~~}}}}}||||{{{{zzzzyyyxxxxwwwvvvuuuttttssssrrrrrrrrrrssssttuuvvwxxyz{{|}~~~}}}}||||||||||}}}}}}||||{{zzyxxwvuutsssrrrrrrrsssttttuuuuuuuuuuuuuvvwwxyz{}~~}}||{{zzyyxxxwwwvvvvuuuuuuuttttttttttttttttuuuuuvvvwwxxyyz{{|}~~~~~~}}}}||||{{{zzzzyyyxxxwwwwvvvvuuuuuuuuutuuuuuuvvvwwxxyyz{||}~~~~~}}}}||||{{{{zzzzyyxxxwwwvvvuuuutttsssssrrrrrrrrrrrrrrsssttuuvvwxxyz{{|}~~~~}}}}|||||||}}}}}}}}|||{{zzyyxwvvuttssrrrrrrrrrssttttuuuuuuuuuuuuuvvvwxyz{|}~~~}||{{zzyxxwwwvvvuuuuttttttsssssssssssttttttuuuvvvwwxxyyz{{|}~~~~~}}}}||||{{{zzzyyyyxxxwwwwvvvvuuuuuuuttttuuuuuuvvvwwxxyyz{{|}}~~~~~}}}}||||{{{zzzzyyyxxxwwwwvvvuuuttttssssrrrrrrrrrrrrrrssssttuuvvwxxyzz{|}}~~~~}}}}||||||||||||||||{{{zzyxxwvvuttssrrrqqqrrrrsstttuuuuuuuuuuuuvvvvwxxyz{|~~~}}|{{zzyxxwwwvvuuuttttsssssssrrrrrsssssssttttuuvvvwwxyyzz{|}}~~~~}}}}|||{{{{zzzyyyxxxxwwwvvvvuuuuuuuttttttuuuuuvvvwwxxyyzz{||}~~~~~~}}}||||{{{zzzyyyxxxwwwwvvvuuuttttssssrrrrrrqqqqqqrrrrrrsssttuuvvwxxyzz{|}~~~~~}}}}}}|||||||||||||{{zzyyxwwvuutssrrrrqqqrrrrsssttuuuuuuvvuvvvvvvvwwxyz{|}~~~}||{{zzyxxwwvvuuutttssssssrrrrrrrrrsssssttttuuuvvwwxxyzz{||}~~~~~}}}}|||{{{zzzyyyxxxxwwwvvvvvuuuuuuttttttuuuuuuvvvwwxxxyzz{{|}}~~~~}}}}|||{{{zzzyyyxxxwwvvvuuuttttssssrrrrrqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}~~~~~}}}}}}}}}}}}|||||{{{zzyxxwvvuttssrrrqqqqqrrrssstttuuuuuvvvvvvvvvvwwxxyz{|}~~}}|{{zzyxxwwvvuutttsssrrrrrrrrrrrrrrrrssssttuuuvvwwxyyzz{|}}~~~~}}}|||{{{zzzyyyxxxwwwwvvvvuuuuuuutttttttuuuuuvvvwwwxxyyzz{||}~~~~~~}}|||{{{zzzyyyxxxwwwvvvuuuttttssssrrrrrqqqqqqqqqqqrrrrssstttuuvwwxxyzz{|}}~~~~}}}}}}}}||||||||{{{zzyyxwwvuutssrrrqqqqqqrrrsstttuuuuvvvvvvvvvvvwwxxyz{|}~~~}}||{zzyxxwwwvvuuttsssrrrrqqqqqqqqqqrrrrssstttuuvvwwxyyz{{|}}~~~~}}}|||{{{zzzyyyxxxwwwvvvvvuuuuuuttttttttuuuuuvvvvwwxxyyzz{{|}}~~~~}}|||{{{zzzyyxxxwwwvvvuuutttssssrrrrrqqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}~~~~~~}}}}}}}}}|||||{{{zzyxxwvvuttssrrrqqqqqqrrrsssttuuuuvvvvvvvvvvvwwwxyyz{|}~~~}}||{zzyxxwwvvuuttsssrrrrqqqqqqqqqqrrrrrsssttuuvvwwxxyzz{||}~~~~}}}|||{{zzzyyyxxxxwwwvvvvuuuuuuuttttttttuuuuuuvvvwwxxxyzzz{||}}~~~}}}|||{{zzzyyyxxwwwvvuuuttttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvwwxxyzz{|}}~~~~~~~}}}}}}}}|||{{{zyyxxwvvuttssrrrqqqqqqrrrsssttuuuuvvvvvvvvvvvwwwxxyz{||~~~~}}|{{zzyyxwwvvuuttsssrrrqqqqqqqqqqqqqrrrsssttuuvvwwxxyzz{||}~~~~}}|||{{{zzyyyxxxwwwwvvvvuuuuuuttttttttttuuuuuvvvwwwxxyyzz{{|}}~~~~~}}|||{{zzzyyxxxwwwvvvuuttttsssrrrrrqqqqqqqqqqqqqqqqrrrrsstttuuvvwxxyyz{||}~~~~~~~}}}}}}||||{{zzzyyxwwvvuttsssrrrrrrrrrrssstttuuuuvvvvvvvvwwwwxxyyzz{|}~~~~}}||{{zyyxxwwwvvuutttsssssrrrrrrrrrrrrsssstttuuvvwwxxyyzz{||}~~~~}}}|||{{{zzzyyyxxxwwwwvvvvvuuuuuuuuuuuuuuuuuvvvvwwwxxyyyzz{{||}~~~~}}}|||{{{zzyyyxxxwwwwvvvuuuuttttttssssssssssssssttttuuuuvvwwxxxyyz{{||}}~~~~~~}}}}|||{{{zzyyyxxwwvvvuuuutttttttttuuuuuvvvvvwwwwwwwxxxxyyyzz{{|}}~~~~}}}|||{{zzzyyxxxwwwvvvuuuuutttttttttttttuuuuuvvvwwwxxyyzz{{||}}~~~~~}}}|||{{{zzzyyyyxxxxwwwwwwvvvvvvvvvvvvvvvvwwwwwxxxxyyyzz{{|||}}~~~~~}}}|||{{{zzzyyyyxxxwwwwwvvvvvvvuuuuuuuuuuuuuuvvvvvwwwwxxxyyzzz{{||}}~~~~~~}}}}|||{{{zzzyyyxxxwwwwvvvvvvvvvvvvvvvvvwwwwwwxxxxxyyyyzzz{{{||}}~~~~~}}}||||{{{zzzyyyxxxxwwwwwvvvvvvvvvvvvvvvvvwwwwwxxxyyyzzz{{||}}~~~~~~}}}||||{{{{zzzzyyyyxxxxxxxxwwwwwwwwwwwwwwwxxxxxxyyyzzzz{{{||}}}~~~~~}}}||||{{{{zzzzyyyyxxxxxwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyyzzz{{|||}}~~~~~~~}}}}||||{{{{zzzyyyyxxxxxxwwwwwwwwwwwwwxxxxxxxyyyyyyzzzz{{{|||}}~~~~~~~}}}}|||{{{{zzzzyyyyyxxxxxxxxxwwwwwwwwwxxxxxxxyyyyyzzz{{{|||}}}~~~~~~}}}}||||{{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyzzzz{{{||||}}}~~~~~~}}}}||||{{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxxxxxxyyyyyzzzzz{{{|||}}}~~~~~~~~}}}}||||{{{{zzzzzyyyyyyyyyxxxxxxxxxyyyyyyyyyzzzzzz{{{{||||}}}~~~~~~~}}}}|||||{{{{{zzzzzyyyyyyyyyyxxxxxxxxyyyyyyyyzzzzz{{{{|||}}}~~~~~~~~}}}}|||||{{{{{zzzzzzzzyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}~~~~~~~~}}}}|||||{{{{{{zzzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzyyyyyyyyyyyyyzzzzzzzzz{{{{{{||||}}}~~~~~~~~~}}}}}|||||{{{{{{{zzzzzzzzzzzyyyyyyzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{|||||}}}}~~~~~~~~~}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{||||}}}}}~~~~~~~~~}}}}}}||||||{{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{|||||}}}}}~~~~~~~~~~}}}}}|||||||{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{||||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~~~~}}}}}}}}|||||||||||{{{{{{{{{{{{{{{{{{|||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}|||||||||||||{{{{{{{{{{{{{|||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||{{{{{{{||||||||||||||}}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}|||||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}|||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}|||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}|||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~trqhbb_[ZZYXXXXXXXYYYZZ[[\]abcefhjlnqsvy|~{xvspnljihffedegggggggggggfffeeeeefhjou}i_a`p}~|yvspnkigeedccccdefhjmpsvy}}|zywxxwwvvuvvvwxz{teduuha`bejmosvy|~~}|{zywvtrpomjgecb`_]\[ZZYYYYZ[\]_acehkmpsvz}vlfekxvohec``_``bdeeffgfeeeeddccbaa``^]]]]]]\\\]]^_acdfhiknprtvxz|}{sjc^[[_fq}xqjfb_^]]^`acdfghhhgfecb`_]\[ZZZ[\]^`acdfgijkllmnnoopqrstuwy{}~xrkd_[Z[_gp{{tojgda`^]]]]\]]]]]]]]]]]\\\\\[[[[[[[[\\\]^^_`abdeghjlnprtvxz}}vpjebacipy|vpkgda_^]\[[[[[[[\\\\\\]]]]]^^^__``abbcdefghjlmoprtvxz|~ysmiedeiox}xtqnljhgfeddccbbaaa`__^^]]]\\\\\\\]^^_abcegikmpruwy|~zskd^ZXX\ajtzsnifcbaabbcdeffffedcb`_^]\[[[\]^_acdfhjkmnopqqrrssttuvwxz{}ztoid_[YXY]bjs|}xsokheca`^^]\\\\\[[[[[[[[[\\\\\\\]]^^__`abcdefhiklnprsuwy{}{uojfb``bfls{~xsokgeb`_]\\[[ZZZZZ[[\\\]]]^__``abcdefghiklmoprtuwy{}~~xsnjfddehmt|{wtpnkigfdcba``_^^]]\\\\\[\\\\]]^_`bcdfhjlnprtvy{}{unhb]ZXY[`gox|wrnkigfffffggggffecba_^]\\[[\]^_acefijlnoqrsttuvvwwxxyz{}~}ytokfa^[YYZ]ahov~|wsoligeca`_^]]\\[[[[[[[[[[\\\\]]^^_``abcdeghjklnpqstvxz{}{vqmiecbbdgkqx}ytqmjhecb`_^^]]]]]]]]]]^^^_``abbcdefghjklmoqrtuwxz|~}yupmigfegimsy}zvsqnljhgfdcba``_^^^]]]]]]^^_`abcdfgikmoqsuwy{}~|wrlgc_\[[]afmt}|xusqonnnmmmllkihgecba_^^^^^_`bcegiklnoqrsttuvvvvwwxxyz{|}}yuqmiea^\[[\_chmt{}zvspnkigfecbba``____^^^^____```abbcdefghijklnoprsuvxy{|~~zvrnkhedccehkqv}{xuromkihhfedcccbbbbbbbbccddeefghijklmnoprstvwxz|}~|xtqnkigffhjmrx~{yvsqomkjhgfedccbbbbbbbbccdefghjkmnpqsuvxz{|~~zwsnjfb_]\\]`ekqy|zyxwvvuutsrqonljigfedcccddeghjlnoqstuvwxxyyyyyyzzz{{|}~|yvrokheb_]\[[]_bfkqw}}zwusqomljihhgffeeeddddddeeefffghijjklmnopqrstuvwyz{|~~zwtqnjhfdcccegjnty~~{xwusqpnmlkjjiiihhhhhiiijjkklmnnopqrstuvwyz{|}~{xuroljhfeeegilpuz~|ywtrpnmlkjiihhhhhhhiijklmnoprstvwyz{|}~~}{ywtqnjgc`^\[[\_cgmsz~}||{zyxvusqonlkjiiiiijkmnoqstvwyz{|||}}}}}}}}}}~~}zwtqnkheb`^\[[\]_aeinsx~~|zxvtrqponmlkkkjjjjijjjjjkllmmmnoopqrsstuvwxyz{|}~|zwtroljgecbbbbdfilpuz~|zxvusrqpoonnmmmmmmnnnnoopqqrsstuvwxyz{|}~}{xuspnkigfddddfhjnrv{}{ywvtsqponnmmmllmmmnnopqrstuwxyz{}~~}{{zyxwvutrpmkhec`^\\[\^aejou|~}{ywutrponmmmmmnoqrsuvxyz{|}~~~~~~~~~~~~~}{xvspmkheca_]\\[\]_adglpuz~}{zxvutsrqppoonnnnmnnnnooopppqqrrstuuvwxxyz{|}~}{xvtqomjhfeccbbcdfilosw|}{zxwvutsrrrqqqppqqqqqrrssttuvvwxyz{{|}~}{yvtrpmkihfedddefhjmptx|}|zxwvutsrrqqqqqrrrstuuvwxyz{|}~~~}{zxwvvuttsrqonljheca`^]]^_beinsy~~}{ywutrqqpppqqrtuvwyz{|}~~~~~~~~~}{yvtromkhfdba`_^^_`acfilptx}~|{zywvuutssssrrrrrrrrrrsssttuuuvwwxyyz{{|}}~~|{ywusqomkigfedccddfgilorvz~~}|{yyxwvvuuuututuuuuuvvwwwxyyz{{|}}~~|zywusqomljhgfeeeefgikmpsw{~}{zyxwwvvvvvvvvwwxyyz{||}~~~~~~}}~~~~|zxvutrqqpoonnmlkjigfdba`___`behlqv|}{yxvuutttuuvwxyz||~~~~}}}}}}}~~~~|{ywusqpnljhfdcba```abcegjmptx|~}|{{zyyxxwwwwvvvvvvvwwwwxxxyyzz{{||}}~~~}|{yxvtsqonljigfeddccddfgilnqux|~}||{zzzyyyxxxxxyyyyyzzz{{||}}}~}|{zxwutrpomljhgfeddcddefgilnqux{~}}||||||||}}~~~~~}}|||||||}~~}{ywusrponmllkkkjjiihgfecba`__``bdgjosx}~|{zyyxxyyz{|}~~}}}||||||||}}}~~~}}|zyxvusqpnljigfdcba````abcegiloruy}~}}||{{{zzzzzzzzzzzz{{{{||||}}}~~~}|{zyxvutrqonlkihgeedcccccdegikmpsvy}~~}}||||||{|||||||}}}}~~~~}}|{zywvutrqonlkihfedccbbbbbcdfhjloqtx{~~}}||{{{{{||}~~}|zxvtrpnmkjjihhhhggggfeedcba``_``bcfilpty~~}||||||}~~}}||{{{{{{{{{{{{||||||||{{{zyyxwvusrqonmkjhgfeccbaaabbcdfhjloqtx{~~~~~}}}}}}}}}}}}}}~~~~~~}}|{zyxwvutrqpomljihgfedccccccdeghjloqtwz}~~~~~~~~~~~~~~}||{zyxwvutsqpomljihgfedccbbbbcdefhilnpsvy|~}||{{{{{{{{|}}}~~}|zxvtrpnlkihggfffffeffeeeddcbaaaaabdehknrv{~~~~~}||{{zzzyyyyyyyxxxxxxxxwwwvvvuttsrqponmkjihgfeddccccddefhikmprux{~~~~}}||{zzyxwvutsrponmlkjhgffeddcccddefgijloqsvy|~~~~~~~~}}}|{{zzyxwwvutsrqpnmljihgfeddcbbbbbbccdfgikmoqtwz}~}|{{zzzyyzzzz{{|}}~~~~~~}}|zywutrpnljigfeeddddddeeeeedddccbbbccdfhjmqux}~}|{zzyxxwwwvvvvuuuuuuuutttssrrqpoonmlkjihgffedddddddefghjkmortwy|~~~~~~~~~~}}}}||{{zzyyxwwvutsrqponmlkjihgffedddddddeeggiklnqsux{}~~~~~~~~}}}}}|||{{zzyyxxwvuutsrqponmlkjihgfedccbbbbbbbcdefgijlnqsvx{~~}|{{zzyyyyyyyyzz{{|||||||{zyxvtsqomkjhgedccbcbcccddddddddcccccccdfgjlosvz~~}|{zyxwwvuutsssrrqqqqpppooonnmmlkkjiihggfeeeddddddefghijlnprtwy|~~~~~~}}}|||{{zzzyxxwvvuttsrqponmlkjiihgfeeddcccccddefghjlnprtvy{~~~~~~}}}}||||{{{zzyyxxwwvuutsrrqponmlkjihgfeddcbbaa`````aabcdegijlnqsuxz}~}|{zzyxxxxxxxyyyzzzzzzzyxxvusqpnljhgedcbaaaaaaabcccddddddccccddegikmptw{~}{zyxwvuttsrrqqppooonnnmmmllkkjjiihggffeeddddddddeffgijkmoqsuxz|~~~}}|||{{zzyyxwwvuttsrqpponmlkjihhgfeeddccccccddefghjkmoqsuwz|~~~~}}}|||{{zzzyyxxwvvuutssrqponmllkjihgfedccbaa``_____```abcdfgiklnqsuxz}~}|{zzyyyxxxxyyyyzzzzzyyxwvutrpomkigfdcbaa````aaabcccddddddddddeeghjlorux|~}|{yxwvutsrqpponnmmllkkjjjiihhgggffeeedddddddddeffghiklnoqsuwz|~~~}}}||{{zzyyxwwvuutssrqpoonmlkjjihggfeedddccccddeffgijkmoprtvx{}~~}}}||{{zzyyxxwwvvuttsrqqponmllkjihgffedccbaa````__```abbcdfgijlnprtvy{}~}|{zyyxxxxxxxxxxxxxxxxwvutsrpnlkigedbaa``````aabbcddddddededeefghjlnqtwz~~}|{yxwvtsrqponmllkjjiihhggfffeeedddccccccccddeefghijklnpqsuwz|~~~}}||{{zzyyxwwvuutsrrqponnmlkjjihggfeeedddcccdddeffhijkmnprtvxz|~~~}}||{{zzyyxwwvvuttsrrqponnmlkjjihgffedcbbaa``________``abcdefhikmnpruwy{}~}|{zyyxxxxxxxxxxxxxxwwvutsrpomkihfdcba`______``abbcdddeeeeeeeffghjkmprux{~}|{yxwutsrponmlkkjiihggfffeedddcccccccccccccddeffghjklnoqsuvx{}~~}}|{{zzyxxwvvutssrqpponmllkjiihggfeedddcccccdddefgghjklnoqsuwx{}~}}||{zzyxxwvvuttsrrqponnmlkjjihgfeedcbba``__^^^^^^^^^__`aabdefhikmoqsuwy{}~}|{{zzyyxxxxxxxxxxwwwvutsrqonljhgedba`__^^^^__`aabccddeeeeeffffghijlnpsvy|}|{yxwutsqponlkjihhgfeeddccbbbbaaaaaaaaabbbccdefghijlmoprtvxz|~~~}||{zzyxxwvuttsrqqponmmlkjiihggfeedddcccccccddeefghijlmoprtuwy{}~}}||{zyyxwwvutssrqpoonmlkkjihgffedccbaa``__^^^^^^^^^__``abcefgijlnprsvwz|~~}|{zyyxxxxwxwwwwwvvvutsrqonljigfdba`_^^]]^^^_`aabcddeeefffffgghijkmoqtwz}~|{zxwutsqpnmlkjhgffedccbaaa````____````aabbcdefghjklnpqsuwy{}~}|{{zyxxwvuttsrqpoonmlkkjihhgffeedddcccccccddeefghijklnoqstvxz|~~}|{{zyxxwvuttsrqpponmlkjjihgffedcbbaa`__^^^]]]]]]]^^__`abcdefhiklnprtvxz|~~}|{{zzyyyxxxxxxwwwvuutsqpomljhgedba`_^^^^^^^_`aabcddeeeffffggghijkmnpsux{~~}{zywvtsqpomlkjhgfeedcbbaa```_______```aabbcdefghiklmoqrtvxz|~~}|{{zyxwwvutsrrqponnmlkjjihhgffeedddccccccdddeefghijklnoprtuwy{}~~~}|{zzyxwvuttsrqpoonmlkjiihgfeedcbba``__^^^]]]\]]]]^^__`abcdfghjlmoqsuwy{}~}||{zzzyyyxxxxwwvvutsrqpnmkihfecba`_^^]]^^^_``abccdeeffffggghhijklnprtwy|~|{zxwvtsqpnmljihgfedcbaa`___^^^^^^^^___`aabcdefghjklnpqsuwy{|~~}}|{zyxwwvutsrqpponmllkjiihggfeedddccccccccddeefghhjklmopqsuvxz{}~}|{zyyxwvutsrqpponmlkjihhgfedccbaa`__^^^]]]]\\\]]]]^__`abcdefhiklnprtuwy{}~}|{{zzyyyxxxwwwvvutsrqpnmkjhgedba`_^^]]]]^^__`abcddefffgggghhiijlmoqsuxz}~}|zyxvusrpomljihgfedcba``__^^^^]^^^^^__``abbcdefhijlmoqrtvwy{}~}|{zzyxwvutsrqpoonmlkjjihggffeeddccccccccccddeffghijklnoqrtuwxz|~~}|{zyxwvutsrqponmllkjihgfeddcbaa`__^^]]]\\\\\\\\]]]^__`abcdfghjkmoqrtvxz|~~}||{{zzyyyxxxwvvutsrqpnmkjhgecba`_^]]]]]]^__`abccdeeffggggghhijklnoqsvx{~~}{zywvusrpomljihgedcba``_^^]]]]]]]]]]^^__`abcdefhijlmoqrtvxz{}~}|{zyxwvutsrqpponmlkjjihggffeeddccccccccccddeefghijklmnpqstvwy{}~~}|{zyxwvutsrqponmlkjihgffedcbba``_^^]]]\\\\\\\\]]]^__`abcdeghiklnpqsuwyz|~~}||{{{{zzyyxxwvutsrqpnmkjhfedba`_^^]]]]^^__`abccdeefffgggghhijklmnprtwy|~}|{zywvusrpomlkihfedcba`__^]]]\\\\\\\]]^^_`abcdefhijlnoqstvxz|~~|{zyxwvutssrqponmlkjjihggffeedddcccccccccddeefgghijkmnoqrsuvxz{}~}|{zyxwvutsrqponmlkjihgfeddcbaa`__^^]]]\\\\\\\\\]]^^_`aabdefgijlmoqrtvxy{}~}}||{{zzyyxxwvuutrqpomljigfdca`_^^]]]]]^^_``abcddeffggghhhiijjklnoqsuxz}~}{zyxvutrqonlkjhgfdcba``_^^]]\\\\\\\]]^^_``abcefghjkmnprsuwy{|~~}|{zyxvvttsrqponmlkkjihhgffeedddccccccccdddeefgghijklmopqstvwyz|~}|{zyxwvutsrqponmlkjihhgfeddcbba``_`____^^^^____``aabcdefghijlmnpqsuvxz|}~}}|{{zyyxwwvutsrqonmljihgfedcbbaaaaaaaabccddeffgghhhiijjkllmnpqstvxz|~~}|{zyxwvutsqponmlkjihgffeddccbbaaaaaaaabbccddefghijklmopqstvwyz|~~}|{zyxwvutsrrqponnmlkkjiihhgggfffffeeeffffgghhiijklmnopqrtuvwyz{}~~}||{zyxwvutsrrqponmmlkjjihhggffeeddddcccccccdddeeffghhijklmnoqrsuvwyz|}~}}|{{zyyxwvvutsrqponmlkjjihggffeeeeeeeefffgghiijjkkllmmnnopqrstvwxz{}~~}|{{zyxwvuutsrqponmmlkjjihhggffffeeeeeefffggghiijklmnopqrstvwxz{|~~}|{zzyxwvuutsrqqpoonmmllkkjjiiiiiiiiiiiiiijjjkkllmnoopqrstuvwyz{|}~}|{{zyxwvvutssrqpponnmllkkjjiiihhhggggggggghhhiijjkklmnoopqrtuvwxy{|}~~}}|{zzyxxwvuttsrqpponnmllkkjjiiiiiiiiiijjjkkkllmmmnnoppqrsstuvxyz{}~~~}|{{zyxxwvuttsrqqpoonmmllkkjjjiiiiiiiiiiijjkkklmmnoopqrstuvwxy{|}~~}}|{zzyxwwvuutssrrqppoonnmmmllllkkkkkkkkklllmmmnnoppqrrstuvwxyz{|}~~~}|{{zyxxwvuutssrrqppoonnmmlllkkkkkkjjjjkkkklllmmnnoppqrrstuvwxyz{|}~~}}|{{zyyxwwvuutssrqqpponnnmmmlllllllllllmmmmnnnooppqqrsstuvvwxyz{|}~}}|{{zyyxwwvuutssrrqppooonnmmmmmmllllllmmmmmnnooppqqrsstuvwxyyz{|}~~}}|{{zyyxwwvuuttssrrqqpppooonnnnnnmmmmnnnnnoooppqqrrsttuvwwxyz{|}~~~~}||{zzyxxwwvuuttssrrqqqppoooonnnnnnnnnnnnnnooopppqqrsstuuvwxxyz{|}~~}}||{zzyyxwwvvuttssrrqqpppoooonnnnnnnnooooopppqqqrrsstuuvwwxyz{{|}~~~}}|{{zzyyxwwvvuuttssrrqqqppppooooooooooooopppqqqrrsstuuvwwxyzz{|}~~~}}|{{zzyxxwwvvuuttsssrrrqqqpppppppppppppppqqqrrrssttuuvwwxyyz{||}~~~}}||{zzyyxxwwvvuuttsssrrrqqqqpppppppppppppqqqqrrssstuuvvwxxyzz{|}}~~}}||{{zzyxxwwvvuutttssrrrqqqqqqqqqqqqqqqqqrrrrsstttuuvvwwxyyz{||}~~~}}||{{zzyyxxwwvvuutttsssrrrrqqqqqqqqqqqqqrrrrsssttuuvvwwxyyz{{|}}~~~}}||{{zzyyxxwwvvvuutttsssssrrrrrrrrrrrrrrrssssttuuuvvwwxyyzz{||}~~~}}||{{zzyyxxwwwvvuuutttssssrrrrrrrrrrrrrrrsssstttuuvvwwxxyyz{{|}}~~~}}||{{zzyyxxwwwvvuuuttttsssssssrrrrsssssssttttuuuvvwwxxyyzz{||}~~~~}}||{{{zzyyxxwwwvvvuuuttttsssssssssssssssttttuuuvvvwwxxyyzz{{|}}~~~~}}|||{{zzyyxxxwwwvvvuuuuttttttssssssssttttttuuuvvvwwxxyyzz{{||}~~~~}}||{{zzzyyxxxwwwvvvuuuutttttttttttttttttuuuuuvvvwwxxxyyzz{||}}~~~~}}||{{{zzyyyxxxwwwvvvuuuuuuttttttttttttuuuuuvvvwwwxxxyyzz{{||}}~~~~}}||{{{zzyyyxxxwwwwvvvvuuuuuuuuuuuuuuuuuuuvvvvwwwxxxyyzz{{||}}~~~~}}}||{{{zzzyyxxxxwwwvvvvvuuuuuuuuuuuuuuuuvvvvvwwwxxxyyzz{{{||}}~~~~}}}||{{{zzzyyyxxxwwwwvvvvvvvuuuuuuuuuuvvvvvvwwwwxxxyyzzz{{||}}~~~~}}}||{{{zzzyyyxxxwwwwwvvvvvvvvvuuuvvvvvvvwwwwwxxxyyyzzz{{|||}}~~~~~}}}||{{{zzzyyyyxxxxwwwwwvvvvvvvvvvvvvvvvwwwwwxxxxyyyzz{{{||}}~~~~~}}|||{{{zzzyyyyxxxxwwwwwwwwvvvvvvvvvwwwwwwwxxxxyyyzzz{{{||}}}~~~~}}}|||{{{zzzzyyyyxxxxwwwwwwwwwwvvvwwwwwwwwwxxxxyyyyzzz{{|||}}~~~~~~}}}|||{{{zzzzyyyyyxxxxxwwwwwwwwwwwwwwwwwxxxxxxyyyyzzz{{{||}}}~~~~~}}}|||{{{{zzzzyyyyxxxxxxwwwwwwwwwwwwwwwxxxxxxyyyyzzz{{{|||}}~~~~~~}}}||||{{{zzzzyyyyyxxxxxxxxxwwwwwwwxxxxxxxxyyyyzzzz{{{|||}}}~~~~~}}}||||{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxxxxyyyyyzzzz{{{|||}}}~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyzzzz{{{{|||}}}~~~~~~~}}}||||{{{{zzzzzyyyyyyxxxxxxxxxxxxxxxyyyyyyyzzzz{{{{|||}}}~~~~~~~}}}||||{{{{{zzzzzyyyyyyyyyxxxxxxxxyyyyyyyyzzzzz{{{{||||}}}~~~~~~~}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}~~~~~~~}}}|||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{||||}}}}~~~~~~~}}}}||||{{{{{zzzzzzzzyyyyyyyyyyyyyyyzzzzzzzz{{{{||||}}}}~~~~~~~}}}}}||||{{{{{{zzzzzzzzyyyyyyyyyyyyzzzzzzzz{{{{{|||||}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{|||||}}}}~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{{|||||}}}}}~~~~þ~hd]RPOPVUU^`\`f`^b_YYYRMKHB@>:876679<@EKS_gqz|qe]VOLHC@<:87666678889::<=@CMYfxŸ~LWcÿzsld[UOIEA><;;BFKQV[afjnrvy|ueUG>=CSi{k]RIB=:8766667777777666554444444678:<>@CGJNRV[_djoty~rdVMKP]p|m_UMFB><;:::::;;;;;<<<<<<==>>?ABDFGJLOSVY^bfjoty}reYQOT`szpf_ZVRPOMLLKJIHGFDCBA?>==<<<<=>@BEHLPTX^chmsx}sbQC:7==>?ACGJNRUY[^`bdefhikmoruy}sfXK@847@Pd{rf[SNJEB@>=<;;;;;;;;;;<<<<==>?@ABDFGJLORUY]`dimqvz¿xk]RHDEKYj~qe[RKEA=;987666677899:;<=>?ABDFHKMPSVZ]aeimrv{¿|pcYQMMTarüvld]XSPLJHFDCA@?><;::9888899;>>>>??@@ABCEFHJLNQTWZ^aeilpuy}}rg\SLGGLSaq~tjb[UPLIGECBBAAAABBBCDEFGIIKMOQTVY[^bdhlosw{{qf\TMJINVcr}tmf`[WSPNKIHFEDCBAAAAABBDEGIKNQUX]aejnsw{ym_RG>869AO`t{pg`[WUTTTTTSRPMKHEB@?>>@ADGKOSW[_begjkmnoqrsuxz}~ukaVMD>:9;BLYizxog_YTOKHECA@?>=======>>?@ABCDFHJLNQTVZ]`dgknrvz~|si`WPKJKQYfsxog`ZUPMJGEDBBAAAAABBDEEGHJLMPRTWY\_bfilptwz|sjbZTPOQV_kyľwpje`\XUROMKIHFEEDDDDDEFHJLOQUX\_cgkpsw{~xncXNE>;;@IWfyû}upkhgedcba_\YVSOLJHGGHILORVY]`dfiklnoppqrstuwy|~|tld[RJB=:89=EO[jyyqke`[XTROMLKJIHHHHHIIJKKLNOQRTVX[]`behjnqtwz}{sjbYRLGEEHNWcp~|ungb]YUROMLKJIIIIJJKLNOPQUWY[]_begkmptwz}}ume^WQMKLOU^iv~wpje`\XUROMKIHGGGHIIJLMOQTWZ]`dhkorvy|~wne[RIB><>CLYhyþytqnlkigfda_]YVROMKJJKMORUX\`cfiknopqssstuvwxz|~~wog`XPJD@==@ELVbo}ysmhfc_\YVUSQPONNNNNNNOOPQRTUWXZ\^`cegjmorux{}yrjc\VPLIIJOV^iv}wqlhda^\ZXWVUUUUUVVWXY[\]_acegilnqsvx{~|vohb[VQMKKMQXalxytokgc`^[YXVUUTTUUVXY[]`behknqtwz}~{xsng`XPHB=::=BLXfu}zywuroliea]ZXVUUUWY\^beilortvwxyyyyzz}~~yrkd\UOHC?<;==@DJQZdoz{wspmjhfdba`___^^___`aabcefgijlnpqsuwy{~zvqkf`[VQMJGFGILQX`jt~}yuroljhfedccccccdeeghiklmoqrtvxz}~zvqlga]XSPMKJKMPU\dnx{vsoligecba```abcdfhjloqsvxz|~{xuspomkhfb^YTOJEA??@DKS^jw{xtplheba`_`acehjmpsuxz{|}~~~~}}}}}}~|wrmgb\WRMIFCBBCFJPW_hr|{wtqoljhgedccbbbbbbccdefghjklnpqsuvxz{~|xtpkfb]XTQNKJJKNRW^enw|yvsqomljiihhhhhhijkkmmoqrtuvxz{}~|yuqlhd_[WSPMKKKLOSY_gpy~zwtrpnmlkkkklmnqrsuwyz|}~~~~}~{wsoljhfdba_\YVRNJFB@??BFLU_jw{wsqomkkkkmoqsvx{}~~~~}~~~}yuqlgb]XSOJFCA??@AEIOV^foy~{zxusrponmllkkkkkllmnnopqrttvwyz|}~~{wtplgc_[VSOLJIIIKNRW]dmu~~{ywutrqpooonnoooppqrsuvvxyz|}}zwsokgc_[XTQOMLLLNRV[aiqz|ywusrqqppqqrstuwxy{|~~}|||||}~}ytqmjgecb`_^\ZXUQNKGECCDGKQYcny|yusponnnpqsuwy{}~}|{{{{{{||}~~|yvsokgc_ZVRNKHFDDDFHLPV\dlt}}{yxwutssrrqqqqqrrsstuuvwxyz{|}~~|zwtqnjgc_[XTQNKJHHHJLOSY`fnv~}|zyxwvvvuvuvvvwwxyzz{|}~}{xurolhea]ZVSPMKIHHHJLPTZ`gnv}|{{{{{{|}~~}}|{{{||~~zvqmifb`][ZYXWUSQOMJHEDCCDGKQYblw{yvtsssuvxy{~~}||{{{||}}~~|ywtqlhea]YUROLIGEEEFGJNRX^elt|~|zyxwvuuttttttttuuvvwxxyz{{}~~}zxvsqnkheb^[XURPNLKJJLMPTX]ciqx}|{zyxxxwwxxxxxyzz{||}~~~}{ywuspnkheb_\YVSPNLKJJJKMPTY^dkry~|{zyxxwwwxyz|}~zwsokgc_\YWUTSRRQQPNMKIGEDDDFINT[dnx|{zyyz{}~}|{zyxwwwwwwwxxxxxxxxwvutrqnljgda^[XTQNLJHFFFFHJMPUZ`gnu}~}||{{{{zz{{{{||}}}~~~|{yxvtqomjgda^[XVSPNLJIHIIJLOSW\bhov}~~}}|||{{||||}}~~|{yxvtrpmjheb_\YWTQOMKIHHHIJLOSX]bhov}}|zyxwwvvwwxz{|~}{wtplhd`\YVTSQQPPPPONMLJIHGGHILQV]fox~|||}~~}{zxwvuuttststttttttssrrqonljhec`^[XUSPNLJIHHHIKMPTY^djqw~~}}||||{||||||||}}}}}~~~~~~}}}|||{zyxwvtsqomkigdb_\ZWURPNLKJIIJJMORVZ_ejqx~~~}}|{zywvtsqmligeb`]ZXUSPMKJHGFEEFGIKNRW[agmt{~}{zxwvvvvvwxyz{|~~~~}|zwtqmiea]YVSQONMMLLMLLKKIHGFFFGILPV]emw}{zxvutsrrqpppooonnmlkjihfdb`^\ZWUSQOMKJIIIJKMPSW[`flrx~~~~~}~}||{zyywvusrpnmkhfdb_]ZXUSQOMLKJJJKLOQTX\aflrx~~~~~~~~~~~~}}}}|||{zzyxwvutrqonljhfda_]ZXVSQOMKJHHGGGHJLNRUY_djpv|~{zxwutssssttuvwxyyyyxwurolhd`\XTQOMKJJJJJKKKKKJJIIIIJLPTY_gox}{ywusrponmllkkjjihhggfdcb`_][YWUSQONLKJIIIJKLORUY]bgmsy~~~}}}|||{zzyxwvutsqpnmkigeca_\ZXUSQOMLJIIIIJKLOQTX\afkqw}~~~}}}||{{zzyxwvvusrqonljigec`][YVTRPNLJHGFEDDDEFHJMPTX]bgmrx}{zxwvutttuuvwwxyyyxxvtrnkgc_\XTQNLJIIIIIJJKKKKKJJJJJLNQUZ`how~|zxvtrpnmljhhffedcbba`_^][ZYWVTSQPOMLLKKKLMOPSVY]afkpv|~}}}|{{zyxxwvutsqpomljigeca_][YWUSQONLKJJJJJKMNQTW[_chmsy~~}}}|{{zyxxwvutsrqpnmkjhfeca_][YWUSQOMKIHGFEDDDEFGIKNRUZ^chnsy~|zxvutsrrrrssttuuutsqpmjgc_[WSPMJHFEEEEFGHIJJJJJJJJKLNQUZ`gow~|zwusqnlkihfedcba`_^]\[ZYXWUTRQPNMLKKJJJKKMNPSVY]afjpuz~}}|{zyxxwvutrqpnmkjhfdba_][YWUSQPNMKKJIJJKLMORTW\_dimrx}~~}|{{zyxxwvutsrponlkjhfecb_^\ZXVTRPNLJIGFEDDCCDEFGILORUZ^chmrx}~|zxvutsrrrrrrssssssrpnlifc_[WTPMJHGEEEEFGHIJKKKKKLLLMNQTX]bipx|zwuromkigeca`_]\[ZYXWVUTSQPONMMLKKJJJJKLMOQSVY\`dimsx}~}|{zyxwvtsrqonmkjhfdca_][YWUTRPOMLKJIIIIIJLNORUX\`dimsx}~}|{zyxwvutsqpomljigedb`^\[YWUSQOMKIHGEDCCBBCCDEGILORVZ^bglqw|}{ywvtssrrqrrrrsrrqpnmjgda]YURNKIGEDCDDEFGHIJKKLLLLMNOQTX]biow|zwuromjhfdb`_]\[YXWVUTSRQPONNMLLKKJJKKLMNPRUW[^bfjosx}~}|{zxwvutrqonmkihfdca_][YXVTRQONMLKJJJJJKLNORTW[^bfjoty~}|{zyxwutsrponlkihfdca`^\ZXVTSQOMKJHGEDCBBAAABCDEGILORVZ^cglqv{~|zxvutsrqqqqqrqqqpomkifc`\YUQNKGECBBBBCDEGHIJKKLLLMNNPRUY^cipw~~{xuspmjhec`^\[YWUTRQPONMLKKJIIHHHHHHIJKLNPRUX[_bgkoty~}|{yxwutrqpnljigedb`^\[YWUTRPONLKKJIIIJJKLNPRUW[^bfjnsx|~}|{yxwutsqpnmkjhgeca`^\ZXWUSQONLJHGFEDCBBBBBCDEGHKMPSW[_cglqv{}zxvusrqqqpppppoonmkigda^[WSPLIGECBABBCDEGHJKLMMNNOOQRTWZ_djpw~|zwtqnkhec`^\ZXVUSRPONMLKKJIIHHHHHHHIJKLNPRTWZ]`dimqv{~}{zxwutrqomljhfeca_^\ZXVUSRPOMLKJJIIIIJJKMOPSVX[_cgkotx|~}{zxwutrpomljhgeca`^\ZXVUSQOMLJHGEDCBA@@@?@@ABDEGJLORVZ]bfkoty~}{ywvtssrrqqqpponmljgeb^[XTQMJGECBAAABCDEGHJKLLMNNOOQRTW[_djpw}~{xvspmjgda_\ZWUSRPNMLKJIHGGFFFFFFGGHIJLNPRUWZ^aeimqvz~|{yxvusqpnlkigedb`^\[YWVTRQONMLKKJJJJJKLMNPRTWY]`dglpty}~|{yxvtsqpnlkigedb`^\ZXWUSQONLKIGFEDCBAA@@@AABCEGIKNQTW[_cglpuy~}zxwutrrqpppoonmlkihec`\YVROKHFCB@@@@ABCEGHJKLMNOOPPRSUX\`ejpw~~{yvspmjgda^[YVTRONLJIHFEEDCCCCCCCDEFGIKMOQTWZ^aeimrv{}{zxvtrqomkihfdb`^][YWVTRQONMLKJIIIIIIJKLNPRTWZ]`dglotx|}{ywvtrpomkigedb`^\ZXWUSQOMKJHGEDCBA@@????@@BCDFHKMPTW[^bfkotx}}{ywvutsrrqqpoonlkifda^[WTPMJGECAA@@ABCDFHIKLMNOPPQRSTWY]aekqw}}{xurolifc`]ZXUSQNMKIHGFEDCCCBCCCDEFGHJLNPSVX\_cfjosw|~|zxwusqonljhfdb`_][YWUTRQONMLKJJIIIIJJKLMOQSUX[^behlpty}~}{ywusqonljhfdb`^\ZXVTRPOMKJHGEDCAA@???>??@ABCEGIKNQTX[_cgkotx}~{zxvutsrqqponmlkigeb_\YUROKHFCA@???@ABDFGIJLMNOPPQRSUWZ]aekpv}~|yvspmjgda^[XURPNLJHFEDCBAA@@AAABCDEGIKMORUX[_bfjnrw{}{ywusqomkigeca_^\ZXWUSRPONMLKJJIIIIJJLMNPRTVY[_beimpty|~|zxvtrpnljhfdb`^\ZXVTRQOMKJHGEDCA@@?>>>>>??@BCEGILNQTX[_cgkotx}~{zxwutssrqponmkjhec`]ZWSPLIGDBA@???@BCEFHJKMNOPPQRSTVXZ^bfkqw}}{xurolifc_]YVTQOLJHGEDCBA@@@@@@ABCDEGIKMPRUX[_cfjnrw{|zxvtrpnljhfdb`^\ZXWUSRPONMKKJIIIIIIJJKLNPRTVY\_beilptx|}{ywusqnljhfdb`^\ZXVTRPNLJIGFDCBA@??>>>>>?@ABDEGJLORUX[_cgkosx|~|zywvtssrqponmkigeb_\XURNKHFDBA@?@@ABDEGIJLMNOPPQRSTVX[^bfkqw|}{yvspmjgda]ZWUROMJHFECBA@??????@ABCDFHJMORUX[_bfjnrw{|zxvtrpmkigeca_][YXVTSQPNMLKJJIIIIIIJKLMOPRTWZ\`cfimqty||zxvtqomkifdb`^\ZWUSRPNLJHGEDCA@?>>=====>>?@BCEGILORUX\_cgkptx|}{yxwvtssqponljhfca^[WTQMJGECA@????ABCEGHJKMNOPQRRTUVY[_bgkqv|}{xvspmjfc`]ZWTQOLJHFDCA@??>>>>?@@BCDFHJMORUX[_cfjnrv{|zxvtromkigec`_][YWUTRQONMLKJIIIIIIJJKLNOQSUWZ]`cfimqtx|}{yvtromkifdb`^[YWUSQOMKJHGEDBA@??>>===>>?@ACDFHJMPRVY\`dhkptx|~|zyxvutsrqomljgeb_\YUROLIFDBA????@ACDFHIKLNOPQQRSTUWY\_cglqw|~|zxuspmjgd`]ZWTQOLJGEDBA?>>====>>?@BCEGILNQTW[^bfjnrvz~}zxusqoljhfca_][YWVTRQONMLKJIIHHHHIIJKLMOQSUXZ]`cfjmqtx|}{xvtqoljheca_\ZXVTRPNLJHGEDBA@?>>==<<==>?@ABDFHJMPSVY\`dhlptx|~|{yxwutsrpomkigda_[XURNKHFDB@????@ABDFHIKLNOPQRSSUVWZ\_cglqv|~|zwurolifc`]ZWTQOLJHFDBA@?>>>>>>?@ABDFHJLORTX[^cfjnrvz~~|ywurpnkigeca_][YWVUSRPONMLLKJJJJJKKLMNPQSUWZ\_adgknquy|~|zwusqnljheca_][YWUSQONLKIHGEDCCBBBBBBBCDEFHIKMORUWZ]adhkoswz~}{zxwutrpomkifda_\YWTQOMKIHGFFEFFGHIJKMNOPQRTUVWYZ\^adhkosx|~|zxvtrpmkhfca^\YWUSQONLKJIHGGFFFGGHHIKLNPRTVY[^adgjnqux|}{ywusqnljhgeca_]\ZYWVUSRQPPOONNNNNOPPQRTUWYZ]_adgiloruy|~|zxusqomkigeca_]\ZXVUSRQPNMLLKJJIIIIJJKLMNOQRTVX[]`behkorux|~|{ywvtsqomljheca_][XVTSQPOONNMMNNOOPQRSTUVXYZ[]^`bdfiloruy}}|zxvtrpnljhfdb`^\ZXVUTRQPONNMMMMMNNOPQRTUWY[]_bdgjlorux|~}zywusqomkihfdca_^][ZYXVVUTSSSRRRRSSTUVWXY[\^`bdgilnqtvy|}{ywusqomljhfdca_^\[YXWVUTSRQQQQPPPQQQRSTUVWYZ\^`begiloqtwz}}|zywutrqomkihfdb`^][YXWVUTSSSSSSTTUVVWXYZ[\^_`bcegilnqtwz}}|zxvusqonljhfeca`^][ZYXWVUTTSSSSSSTTUVWXZ[]^`bdgiknpsvx{~~|{ywusrpnmkihfecba_^]\[ZYYXWWWXWXXXYYZ[\]^_abdfhjlnpsuwz|~|zxwusrpnmkihfecba_^]\[ZYXXWWVVVVVVVWXXYZ[\^_abdfhjloqsvx{~~|{ywvtsqpnlkihfdca`_]\[ZYYXXXXXXXXYZZ[\]^_`abdeghjlnqsvx{}}|zxwutrpomkjhgedba`_^\\[ZYYXXXXXXYYZ[[\]_`acdfhjlnprtwy{~~|{yxvtsqpnmkjigfedcaa`_^]]\\\[[[[[\\]]^_`abdeghjlnprtvxz}}{zxvusrpomlkihgedcba`_^]]\\[[[[Z[[[[\]]^_`bcdfgikmoqsuwy|~~}{zxwutrqonmkjhgfdcba`_^^]]\\\\\\]]^__`abcdefgijlmoqsuwy{~}|zywvtsrponlkjhgfedcba`__^^]]]]]]]^^__`abcefgijlnpqsuwy{~~|{zxwutrqpnmljihgfedcbba```________``abbcdeghiklnpqsuwy{}}|zywvusrponmkjihgfedcbaa``___^^^^___``bccdeghiklnoqsuvxz|~~}|zyxvusrqpomlkjigfeedcbbaaa`````aaabccdeffgijklnoqrtvxz|~~|{zxwvtsrqonmlkihggfedccbbaaaaaaaaabbcddefgijkmnpqsuvxz|~~}{zywvutrqponlkjihhgfeeddccbbbbbbbcccdeefhijklmoprsuvxz{}~|{zxwvusrqponmlkjihggfeeddcccccccccddeefghijklmnpqstvxy{}~}|{zxwvusrqponmlkjihggfeeddddccddddeeffghhijklmopqstvwyz|~~|{zyxvutsrqpnmllkjihggffeeddddddddeeefgghijkmnoprstvwyz|~~}|zyxwvusrqponnmlkjiihhggffffeeeffffgghiijklmnoprstvwyz|}~}|{yxwvutsrqponmlkjjihhgggffffffffffgghiijklmnopqstuwxz{}~~|{zyxwvutsrqponmlkjjiihhggggfffgggghhiijkklmnpqrstvwxz{}~~}|{yxwvutsrqponmmllkjjiihhhhgggghhhhiijkklmnopqrstvwxz{|~~}|{zyxwvutsrqponnmllkjjjiiihhhhhhhiiijjkllmnopqrstvwxy{|}~}|{zyxwvutsrqpoonmmlkkjjiiiihhhhhiiijjjkllmnopqrstvwxy{|}~~}|{zyxwvutsrqpoonmmllkkjjjjiiiijjjjkkklmmnoopqrstuwxyz{}~~}|{zyxwvuttsrqpponnmlllkkjjjjjjjjjjkkllmmnoopqrstuwxyz{}~}}|{zyxwvutsrrqpoonnmmllkkkkkjjkkkkkllmmnnopqqrstuwxyz{|~~}|{zyxwvuttsrqppoonmmmmlllkkkkkkllllmmnnoppqrstuvwxyz{|}~}|{zyyxwvuttsrqqpoonnmmmlllllllllllmmnnoopqqrstuvwxyz{|}~~}|{{zyxwvvutsrrqppoonnmmmmllllllllmmmnnoopqqrstuvvwyz{|}~~}|{zyxxwvuttsrrqppoonnnmmmmmmmmmmmnnnooppqrrstuvwxyz{|}~~}|{zzyxwvvuttsrrqqppoonnnnmmmmmmnnnnooopqqrrstuvwwyy{z~{wzxvu{~w{s{xnrso}ukhw]nl_uq]empVcvh]jmqoprsqnWYm{n~W\mxo|wxxl}rw}z~ns|^|giplsfyvbvrosooyS}}eUZyurTUkmQ_zff]j]vxnuevrzpo|}pszq~yh{xYry~}q~o`ipqwtuigyr`]^XpZ\hxzdpgji[nqs}rkcbu}y~}{wxny~e}sfxkomchos{kuaqiiWdq]PPZxYobkxwpytx|j|oqz}e|sxxmts}}pzuul~ryqzqq~\fyxnvgnybwcWm}tg[bdo|su\mzyz[\uVoic{g{upmi`x~{tjz~pmklv~`wyhhanay{Lrh_dx|xflvfbvjexzh}xuidwVc~yq}q|}pytctsy]lwm}~ucvmyUweaO`kcIabtHe]tmivOnsKxuhmVayn}aZjxhwoUkc^wl~dgsqeqv|n]eld|ZFj~Zvm\htbboc{nXpcoTbqrtdo_pnlp|[puygn{{l~ztb{ns|ZwpiztnTRNC~k|m|w|u@RWcqojcipn}s`jkzvxo}km~z||dsy]x\jirxf}g{gr[og~jeZ_kftdx}dbiuemudamfO~pnlZi}l[ixfeft]{m}}TrXmmfwNQn~_tmYp[Wi|butfLc\gvjn|skpyql[[sm`qagkrye`|yeey`]o~~kyOy~shSXVpbrb]RH{kvrux_f~lg{xwwdVeifeq|cV~g|{ozoxq~iqġuwphɥTpmylusfPTnjkj[uuw~pajlajep~yh~Vqun>[L5xj}IvuvtՎ_|orltc`kzpzOh`|hd{@lrg~v:auiargthtbjvewk`vexXxjj_}Vqk`dRp<|uzlnl^sgWhr|Y}U~kU\u_^pzUYz_lqy]fsT[_}tkTRceohAjVuwkzozzǙ}glyyrkqlwvrai|kq`cnyp_qy`gVbnexq[V}aT}ywu{}YsioW_\ms||mivwtgvM}ppn{|XhBx^fhqyw^E\RGivbcxkkW_miw9t\s|j~Zouy}v`khap}Ns~|ip~dRYpodk>{tRrnQe~ssw|vasos~Iuyt}~cozlod_R^ep`oego~zko`mwrdixw~yxRtf/|zpwS{vYyewg}IsujUujv`PiXme|Sth[Ytnwm}RiRftd{mkj`Ѓqe_~nf[zzfzSotrv`|zhF}Zu}^qymuaJbvyTr7xypTkeftapnNz^{~{~s~Tj_}_gYhWz~sUsjvLjmkil`Xm~Slk\Pc|i~xkpg\qZnwZgwbuYtjm~~nWotIlp}XI{Ertvas^qi}Jz}_W~iwdfYRy}}kyy{~F^WhmkboG~xJinhxxvi^[uOotvXxWgzqjMqv{lZX}zrNvnctXezwttwk|sjlg|dyoK|_bwmrhatZZlysLoysTuOsxb{|uceg~^pWfjptnn}|qp}qk}ZO_nl^uHVwfuqytwapbtzbi}qzVe{0zx}}Ztdwoxizfh_[|uOi~Yurp}k]u}eX}rzzcxnIj@ywxm]~zrw_vphdm[yg{opu`sd{u`kw}nwh{nrhh^_gs{ngnxiqmqnwiQQgsvznyfvrrzwZ}r{phl`iLPYjn|gy^lsFxo~iqogrbVij~g}uuksbzz}qlhuU}\x`qeolFml|vj}rtrqmtlfzyMnovgrowGvk{bop~~k|n~XzzyiyuiqvzatJswXs|YOtde`cdoctqyq]a~qwwTdqNkzq|o~bhtRiexassnOwRgYpk~x_teibxrp_ssmoqmxgsyjw~why~iq~rg|fqhid|mddnu}amTY|qw~fws^k{kYWlrqi~Wovs^sdM]xoxjuv|\nsaWtu{yxlh{doS~jlfzfvwzyic^z{nz^[man|]x}st{~wpas[{xbtmdvw{uyorrvx{brwuw~foX]Xfvicl}au|yyjkvVw~ylTbv~}tmyfhwguw{wu_tRz\ayY{xdy}\~rntfvmjpumtgrod{_|{xwh_{vts|xevnhpmiz~aurwr|r||mkxt~~cgsxmsh|jkjy~nn}spxyqy|vvvyuzgf]lpi{~tdxcRsawqlgpwy`vybykegpRxm|hp|j}xz~cl|oiwbmqoi|te~yzjk|qcksRnpudyur[yu\qmninr~{|{nykowgbugku{||R|cc}{{ypa{woz{rr|wjzxknj{`nwvnkjq~aywpv{s}uqmk~szvzwskdvu~_ijn|xkgXgftzyf~prxlbc~x~x~}olhutsz~`|}sxoowx}nxfmda~mvw{yor~}o]ztt~{~~|{ZPtavfvsz{inltpspkvsw\uzuwv}k}~_xzwj~sdito|}{k}lpvtmlrxx|q\k}r[~yxvmm}m}gkfu}~yo|s|o|ys}nuzb|v}twYr}R~wwvj~xty}pmsvlu`ej`h|uus}~uqni{rsfy}~vnmrdZmslehu~sr_hvukswqc}x~~{xlnhdhz|rrrs~rr~yrw~nr|`y|b}y}xvzwzoizzy~o{ywUbx{utlisp|d|ri}knqoout{u{ntfzwo||~|xjm|orvasp}qjsau~ufx|wrv|iuywvtxwcw~m{qrgxxzdr|}}~w~ty}wq}koznxvswys|ygun{|{j~trt~kq|~q|{j}`m{mexz{yexxtljxth}vrqsiv{jxtymyynwm_xnccszr|ukrsxwxzz{t|vyrs~umqluvmzs|w|rgzmwuy|xey}q{t~r|s|ipr`~wc{|~ry~|wtrjx||xjqtpympqvkwmx}ux}y|fh{~zvwwvghzhsnxsx~jk}}zmmm~rlq|{}yp~|x{n{l`nu}|m{cv{nwzro}zt}nj}x|ropu{mh~wwruwyq}wowox}|udretivlnl\y~~}}vso}}kw~}tn|~wrmsm}ofr_kwkmm{uw}xnqwzyvrzwv|h}q~|qzqphzfhtxsx~|shyqtnu~w|gry|r}r{wziqx|qixjo~niux{vzg~izoucuwxrxy}tqx{m}z~rvx}}lhfxqowzzl}}srok{ntxy|vpt~{uqhuf~{vzwu}yn{}}`|zg`{qk}|{u~yq|y}w|}_uvv|vutzjxz|s|vnoisltsq~u{uv{q~zr{sp}|~nvu|lb|sUgvisuo~xyr}||yut|{xjv~|t|{nwvzsonjtmy{t|duqvzvurys}z~e{jy|}yz}ztmorp{y~z{gmmx~s|a{y|g~sqmr{{}}jw{pzp{}izryltmv}{gttev|qzv~}~}tl~}xx{jrp}|kvoytwu|i{x|lyr{u||s}|xnm}}x|{~}v|xxzyhz|w|uuxsxs}x{mq~oywzx|s~lu~}sw{vvtyom|~oxyrq{zrtqpsewqwu~|tswm{}{~yuut{sn|q{zvwxr{l~{z}v{lpz{whsz|w}zy|~||~{szxvp{k~zorwt~v|w}rmvosvvwyv}{|||py|x|}x}}owuwsr}~}z{nsvzy|mwvrz|vw|r~qy{w~m{t{tzyzru}v|v{gzzgpl|w{}zz{tm}|x}~xpzqzz||zzox{gy|xnzmpy|zrn}zsxlyn|t}xu}|wut|ocwo{xzo}{ro~pux|~snvolq}{wntxrwnky}~wp{rr|zzwlw{om}n|w~{xxz{}z~}sp|v}wz}vs|qrv||~~zytyupuwutwgyt~sp~vwyov{z}xoorsvy~wov|zk~oun}vyuuly{{nvpokz}sowm~{~sln|nw~ok|nqruvy~uuofzyb{wkux~}tz{wxyypt~|k|{o~tzuzo}typsu|}wv|ywqw~~{uouwfy{uz{~luz{zpx{{q}qm{m}~q|umsr}oojwj~z}lj|tvvp|~}||t|kxw|nqxe{tyxlxns||~rzuwv{|vtzqusxb}sjksnq}youu~|yxttju}{~u~toto~sor|zn|uqoyz}~xy~zpx{ik{vtv}wf}t}|x{{~v{s{xot|~~uz~wjq~}~pjmlz||pcvp}xt|q{o~l`~}ov|zrrr}vlnpsuuz}yywnxqv~sx||x~th~ru]{q}ssu|z}r~vy{yswjv{tu{a~|wv|to|xrzrty}yx{{uksqq}}vreyxt{|tx{~~xy|qw{wsjyxuzxuu~sqxkwmw}{}`ttj~pz~}qpwo}vyz}|shxsytts}ut}|ppri|}lxl{}q~wpzmuyoplz|zw|s|~n{pwz^n{zwzzspsz|mw|uzoz}vy{ph|uwxz}gxvq}}ejkw}~zqvm~yxuwxyzt}}dvuvpv{|sqls}pt~dou}xv~zxzzz}|}o~}{~zxyuvyxvy}me}zsyyxmnrwzs}|x|v{}}xrwiryt~v|~yv{{tu}sazxz~~yswyxtt{om~loi{krt~{z{|rsqysxqjq~uq~swumyxs{z|uup}zxhxlv}}}t{^wxzyi|y~trw}x}}tnu~mz~oxzmvtvwowmfwucxow||~x{r~}~wstp}p|nvp~tksnmy{tny{rysgu}~po}jsqzxn{zz{jx}xjtwnwv{tq}ji}~{{vsorso}pxz}eyp{zwzxiywt{}|}s~y}|u}vwzlm|y{q{ps{lu|y{{~ykuq{|y}{~v{xt}|q{sqwxqzp}ty}{|kwxp~z}v}q|l~v{}z}{~}yupset{{pwm}lvxhr~|||z}fqz{xsv~|s~zsrlytotc|vsxvzoxwxw{r|svu|xpyuzmsm}{xhjxn~~{ywx{y{y|ww|n}q~yqxr{uqf{}qtn}|zxzwwvy||mwyv|xl}u{ztxtxi|xz~xqsut}~vyto}ztp|x}vrwotz{uhu}{u}t~riwxz}v~rwoxi}x{}txxr}uz{voy~{xzzixx}uxy{w}o{m}xpux}t}yvtvo}tuxts|}zo~tqs}{{vz~vzl|xzx{|{y|}nowvrx}t{|~p{u}r~t~y~|ymiw|{zyv}{}{||qk}p}{{{w|mxuzxwxw}z|~{nzv~|xour}uzz|ptx~xs{wizuw~tz}vpyuwu|~xr}|x|zynst}|y{psz|t}upvot{q{m}|}yz}w|t}~z{tvxy{{~~yv{y}uurvxyux}|viy|~~wx~lru}|tz{z}y~z~xo~pus{w|u{}}xe{|mx~~||zm|w}yn{yw~|t{||ps{v~x~wxv~yvq}i~~{xo{ps|{qwqt|{ww~tuosx|u|y{s{}rruxvvytwr{|s{~uus|~ywnyznuzw}|z{ws~y}}~}yxj~}|yz~u}s|yyz{wsxxrqv~ulz|qyz}u~y{}vyvro}ry|}vww{xw~y||}yyyu~vx{{zs{|ts{}qzu{qu{y{wz}w~xuwz~}}{|~myw{~xvyxm~}uzymu}|wxxoww}}zxx}t~z{v||t{t|{x{zi~zq|q{xtw{xrj~~|{~{w|x{}{{tys{wz{}s}pyru}x~pi{}pw{w|s}}r{}x|}z}r~u}x~vl~}x{w{z|tqs~t{~r~~~wzvy~~yx~wtuwz}svwfxxtt{y||{}{ztux}t|xtz}}~}zux|}{}w~~{ts{vw~v~w}~s|ymzrvuxywwxvz|z{}{{sy~{wvx}t|z}|ux{}}ssv}~}u}zwzq{zvx|}ywt{~yxx~|{uz}ps|{{{|w|uzxrv}z|tn|s{s~xs}zzrlwzs{yzxy|o}v~zz|zv|{{xx{}z|t~||}|sx{p}xwxp~|xkq~z}wy~y}}~~yzwp}s{ozw~wyswq|y{yyx~z{|viy~~}~}|}{}zu|xwzt{|tv~r~}zwwwwz{~||}{~~}~{~r{{v{vpxrs}}zsz}zzqxyt}v}yv}{x}z}~z|xv}wx~z~~{wxouz~u{tv|xzyyx|xy|||x}x}usx~urw}zrw{|y{~|w{{vsxxx||w{u|u|wxzvz{xy}wy}x}|yxx}|w{||~~sw~y}x{}w~z~ot{suv}y|}v}{x}{~svyw}}zvy~yy{}~wtxzw{}yv}ys}{}||x|z~u|~~t~w|{wtuw{xzrx|~~|wtx{xy~}x|}z{vuwzy|{u~~y~~or|vxv|yrv|yw}~zx~~~}|yxx|~~{z~uw}}{{yqx{t}{s~w|twu|{}}}|{z}x~zy|{}x}wzr|}{oq{}}r}y{t{uxzwywwyyu}~~~uz~}{pq}}||w{}vn|}||usz{z~~{xwyz}~z|w|uous{}}x~w~}}v}|qso~{~~{wy}zxuzy{{xxuyyy{x~|yvzyvyuz|~z{~w}}y{{xz}wsvw~|x~~}ut}zxw{~y~px|~~z~qy{vy|~||yszyy|z{||zzw|tu}~v{{w{~}vwxz||{|vvlz|||yw}wxvszs|xxzt~y~zw{s~{pxxz}uz~~~|qz{|}~xz}{~xy}}|uyp{{r{||{wv|~|}~|{xx~{y}xsx~uvu{z{|~wsx~|||y~tqz{up}{{|rx|x|{wp{s~~~w}~vy{}|yv{y}{z|z~~{z}wv~}{~~{~q{~~w~t~~z}}}~uuux~wx~~{z}~uv}~|}{yy}}s{s}|zx~~~~{tv}zw~~~|~ou~~svpu{y|zvutu~|}{up|~~t{|||{{~zt|y|||yyx|~}}yo}x{~xt~{|~||v}{x{zyyz{yw|wx}}v}|{}~ypur~~}t}yxv}|~wyyv}|xzzsw}w|u~}|}~|||~}wy~}zxk|||}uvwz~|uwvuy|w~}}vrx~~z|}~}~}z~ox~}z}uyy||~vo{xz||}sw|v{x~}~x~qzzx~}}~w|}u{|y}||zyv~|u}}uy~z{~x{w{{w~}{~s}}}wzyvzw}z|~uww{y{uxv~~}|{y{xz~{wxsy|vwz~v|z||}}{|vx}|~~}zy}~{w~wzy~z~y~z~}xumy}~z||nuzyv~~xyx~}~{|{x}{y|}|{~z}y|ww~ywwntvyy~y}w|~xy|v~yy~zu{}u|{~{~qy}yz{y~xy}}{}xz~}z~z~yx|zy}|y{{{zy{~||~u{xu~x}y|~~~vz{|{{x~}xx{xx{u~zs|upsu|{}~w~y{~|u{v~~{||~wvzuxst|outpzv}{|~yz{x}}|~z}vv{~~}x{}}|yrr~~~{uwxv}v{~~}||z{z|v~|}~wyr~z~||zz~y~|}{z{y~}|~xx}|yzwxx~~{ovqy{}}~|{z|{|vzx||v{w}}}zzxtxyzztnxv{~~|v}{y}~}y}y}|y}|{yz~yv~}}}|{|vx{|~}z~ss{zy|{x~|}|x}z{w}~~}}|~}x}tz~w}}{rs|~~yuz~ypv|o}~q{{~~zz|}z~~xz~swv|}{y~}}w}v|v|}|~}xvtqx~|wz|~~yz~}~|x|wzv}{~w}v~}~}v{szx}||~zu~u}~}zx|~{{xvrtz~~x}{}}}{rxw}y}}vx}{}~{~{u|{zszs{z~{|t}x}~~}w|zy}z}~y|y{~vy|wv}|s{vzx~{~yzxw|~x~{xuxy}~}}yv{z}|{{~~xxxs|x}}}}z}wxy~}wxs}z~xux}zy}yy}z}xws}~|txv|{~vz~~~yxs~wz~|~yy|{}~}{~~|}ywvy{{~~~|sz}|x|yx~xt|z{zyxzy|}~}szw{w}||w||y}~z{|x~{~s{s{z||xtxxy|r}v||~||}{v{|}~|z~{~z{wyxz||w|~v~x~~}}|~r|v|ws~~}u}x~{~xy}~{{{vzy}|uz|yw{~|~{x~}xw}~u}y~xyvx|~zzyow{~y~zxzu~x}}{}zws}u}yszv}~}yy|u{|}}}{|yz~~~}}y|w|zy~|}~|zwx~{}~}v}|}xw{|||~||~{xy}~}x~}~~|zyu}v~~{{|{~|{}|}{zyv|uy|z}y{uz{{vutz~}~~{}vz{~z~z|~|{v~u}{~~y{{||}}}y~tzyz|vw|yyxyx|{y}~z{|v|y}y~}{|}~}}t|}~|}{w{x}v~yxx}zz{~}}zy{ypyx}}x~|z||{}~{w}~yvv|~{}wvzxyx|~}y}zx{~{~zz}{}|~{{z{{v}u}y{~|}tvx}|}{wwwu}~}zy{x|~yx~zvw|~~}szyyuur{w|}|zx~|}~zy~}}}~~w{|z||~}w{{}~{ux~~|ww}{~}{~}~{}zy}{w~x|~~z{{{{}~}}}}~|uy{|~x}z|~xt}z|~}}wwsvyx|}z~z}|{|{}|~~{{}u{{y|vyy}|zrxvu~x}z|}}w}~z}~~z{z{||z|}|wzw{~y~wz}z||{{z}}z|w~||}}{~x~|~z|}}zz{|}z|||||{xy}z|}|~~}~{~}tuy}|x|zw{zy~xz||s|~vy}}}{z{|tyv}~z{qtrw{~||~v~~|x}||x~{y~}}|{ww|~|}y~~{zw}zyzz{~~~{~zvyw{{{{}{|||y{}~}}zyv~}zz{}~~{yyywyrxuz|z{{yy|{{{}{}~|~~|u{{x{~}wuzy|}}v}}x}y{{z||}~|}v~~|}~~x}|vz{z|~}~||{|zw|}{{}|w~{~~u~}~~{{~||~u}zw||wu~zz}||t~x|{zu{~{{}}z}|~}|}|}|~z~~z{|||~~~zw{v{}~v~uxuz|{|}{}~~}~}~~{}zx}y|}{x|~|~x{~|w{yzz{~|{{qy{}}}|~~z}~~~ywuy||{z~~}uu}}z|z{w}{|{yz~~w~|y~zx}{x}}{}}~z{w}{~{{}~}|}~zzyy{z{z}~zyx|x{|}}|}|{~zz{{}zz~|~}z|||xz|tz{}xzy~}z{y}~x}w{z~|{}~~|wz~x}x{{|z{xz}~}|~}y}}yzy~{|{~}||~{~{}z}{{yz~}||w~|}}{~{~{yv}|u|v}}~~xuz~|}~~~|}{}||~z{|~zy{v~~}~x{x|}|}{}y|{||z{|z}z~{~y{{|{zx{{~|w~}~|{{}~|~~vz~{}{~~}y}zyyzz}|~~~yvu~~|~~~|{||u~|z}z|~~zw~wzy}}~{}~|yy~xx|{x~}||~~|zy}wy{~{|~{~|~y|zy}|~{wz~~}{}{}{x|}}~|v}{|{{x~~{|zz{}{x}z}}}~~|{{}~~z{|z}~~}|z{x|{y{|}}|{w}x{{~y{{|{z||{~|~~||{y}~~z|~}}|}|{~||}~||}~~xz|{z~{{z|vz|{{{~z~{zyy}}||~}~|}~y}yz}~|zz|~|~{}|{{}|~{w{{~y{xv~|~~|z~z{}}yv~}|y}{~z|}}z}}z|z{~~{y|{zw|}}~yzx|{~{~}|wz|y|}~}zww|~~|||~{z~}~~z~yzyzzy~{{~{wvv~|z~}{}}~~||}~{|y~{}||y{}z|{|||||y~}}~{}}}}~x~}xy{}}||}|}}}|||}~}}{|~~~|}z}x~~{{~~{}{}t{{yy~~}~}{}~{||}}||~{{}zy}{~x~{zw}z}z}yy~y|~}|~~~z}|~y}y~{{}|t}~~|~{~~z~{}{|}~}{~|~}|{~}}|~v||~~~z|{zyz|~|~~}|~||ywy}~~~~{}~~zz}}~|}z}z}|~{}~~yy}~~~v~{{~www||}}||~~~~}|~y{~z}}||~y}}~|}}|{zyyz~vy|}}~}z}}}}z~|~|~~|{zz~|}}~zz~xz}||}}|~||~~~yz}}{{~~z}|{~z|z~~}~}~~}{{{}~||}z|~~|}yz~|z~||~~}~{}{x~~~}{}y}||{z}~}{{|~~{}x{~~|~}x~}~{z||}{|~}y{~~~~}|yz{{||}~|{~{w~~|~|~}}{||~}~~~y||~~}}|}~|y}z|}~{~~zyz{|~~~}z~y}z}}y}~|~}~||~}}}}z{{~z~|xuz|z{}~||~~x}|}}{~}~}}~~}z{{~~~w~{|~{~z{}}~~|~{~~}z~{z}}~}~~}~~|{z{~~~{{~~}|}}{|~{~{{|x~|z|}|}z}~~~||~}~|{|z~~y|x{}||~{}z~z||}{z~~~~{~~}}~}~y~}|}}~~{~|~}y~{|}~}|}}||}y~}{~}~~~|~~}|}}z||~}z}zx~}~}y~}~{yz|{~~~{|y{|||}~}~~}~z|~}~}zy{}~~z{}y}}z|~~{~|}y{~|}}~}}|}|}z{}|~|~}|~}~|z~~|}|{~xzzz|}~~}~}zz{{~}}~{~{{|~~|}|}z}|w{~|}z}{~~z{{{}}~~~~~|||~{}~|{~|z|}~x~}~}~~~||~||~||}}{|~}|{|||}~{}~{z}~{x}~||~~~}}~}{{~}}y~~|||~~}|~}}||}~}~{|}y{||~}|~}}~{z|}|~}}{}~}~|}}~}~|||}}}z}~}||~~|x{{}{}||}z|}|{}|}|}z}~}~y}|~}}{}}{||~{}}|}{{z~}~|~}yz~~}|z|~|~~}}|||{}~~yz|}{}|~~z}{~}~{}~~{|{~~}}~z|~}z|~}{~~~{~~~~y{~{~~|~~~~~~|{{z}}~}~|{}}{{|}}|~~~|{}~~~||{~~}|}~y~}}}~}~~~{z}~|~|~}}x}~}~}~{~~}~~|{~}|~|~~~|{}|z}{}|~}}~}z}}}~|~~{{~|}~~}~~}{{}~}~}z}~{~~|}{{|z~}~||{|{}}}~}~~|~~~}}||x|~}~{}{}~~}~~}|~~{x}~}~~|~~}y|~}||~~}~z~~{{~|~}}~|}y|~}}}~}~~{|}z~~~|}}}}~}}|~~|~}~}~}{|~||~z~}~||{}~|z~}~|~~~|~}}}}~}|~~{z{y~~}~~{}~|~}}~~}~{~||}~~||~}}~~~||{||}}}|~~}~{{~{~|~~~|~z|~~~~~~}}{|||~|~~}}|z|}~~|{~}|~|}||{~~~}~~}|{~||~|||y}}}}~}~}}|}}~~~~|}~~}}~y{}~~|~}{}~~~~~}~|{{~~}~|~~~{|~}||~|}}{}~z{}~{}~~}yz~~}~~}~~}}~}{~{}{}}{|~}~}|{|~{|~~~}~~}~|~}~|}}~}{}|}~~~}|{}{z~||~|~}|~~~{~}}~|}~~~}~~|z||~~{~~~}|}~z~~}~~}~}~~~~}~}{}~~~}~~~~~{}~|~~~~~z|~~|~~{~~~|}}}}}|~}}~~}|{}}~~~~|{z~||}~~|}}|}~~|~}~~~}~}}~z~{~~~~|}|{~~~~~~~~{}|~~z~~|}~|~~}}~}}{}{y}|}}}|}}~}}~}~~~~}||~|~{}~~{{{}}~~|~~}|~|~}}~}~}}~}}~|~|~}|~|}~}~~}z~{}}||~~~~|}~}}~|~}|~}|~~~}|}}|{{}}|}|~}~}~~~~}}~}|~|~}~}}~~}}z~}|~}}~~}~}||~|}|~~|}}~}~}{~|~~~~}~{}|||}~~|~}}~~}~{~~~|~}{~~|~~~}}~z}}~~}}~|}}}}}|}|}~~~}|}}~~z}}~}}}~~}}~~~~~}~}|}~|}~~~}}z|~}}~}~~~|}}}~~~~~~~}~}~~~}|~{|~}z~~~}}~}~~}~|}~~}}~~}}~|~}}}{}~~~~~~~~|{|}~|~}}}}}~}}}}~~}~}|}}}~~~|{~~|}~}|}}~|~~{|}~~~}~}~~~~~{}~}}~~}}|~}~|~}}~|~}~{~~}}}}~~~|~~||~~~~~~~~||~~}}|~~~}}}}~~}~~~}}z|~~~~}~~~}~~~~|~~~}}}~}}~~|~|}}}~~~}}}}~}~~~~}~}}}~}~~}|~~{~{}~~~~~|~~}~|}~~}~~|}~}}~}}}~~~}~~~~{}}~~}~~~|~~~}}}~~~}||~~~~{|}}}~}~}|~~}}~}~}}~}|~}~~~~}}}~}~~~~~}}}}}~}~~~~}~}~}~}{~}|~|~}~}~{~~~~}~|~~}}}}~}~~||~~~~~~}~~{~~~~~~~~}}~~~}~~}~}~}}~}|}}~~}~~}~~}~}~}~~~~~~~~~}}}{~z~~|~~~}~~|}}~~~~}~~}~}}~}}~}~}~}~~}|}}}}~~~}}}~~~|~}|~~~~}}~~~}~~}|}}||~~~}~~|~~~~~~|}~~}~~~~}}~~}}~}~~~~}}~|}~~}}}}~~|}~~}~}~}~~}~~}~}~}~|}~}~~|}~~}~~~~~~|~|}~~~||~~}~}}}}}~~}~}~~~~}~~~~~~~~~~~~~|~{|~}}~}~}~~}}~~~~}~}}~}~~}~~~~~|~~~~~~~~~~}}~~~|~~~~~|}~}~}~}~~}~}|~~~~~}}~}}~|~~}~~}~~~~}}~}~~}}~~|~~~}~}}~~~}~~~|~}~~~~~~}}~}~}|{~~~~~}~~~~~}~~}}}~~}}|~}~~~~}}}~~~}}~~~~~}}~~}~~~~~~|~|}~}~~~~~~~~~~~~}~~~~~~~}}}|~~~~}~~}~~~~~~}~~~~~~|~}~~~~~~}~}~}~~|~}~~~}}}~~~~~~~~~~~}~~~~~|~}}}~}~~~~|~~~~~}~}}~~}~~}~~~~~~}~~|~~~~~~~~~~~~~}}~~~}}~~~~~}~}~~~~~~~}}~}|~~~}~}~~}~~~}~~~~~~~~}~~~~~~~}}}~}~}~~~}~~~~~~~~~~~}|}}~}~}~}~}~~~~~}~~~~~}~~~~~~~~~~}~~~}|}~}~~}~~}}~~~~~~~~}~~~~~~}~~~~~~|}~~~~~~}~~~}~~}~}}}~~~~~~~~~~~~~~~~}}}|~~~~}~~}~~~}~~~~~~~~~~~~}~}~~~~~}~~~~~~~~~~}}~~~~~~~~}}~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~|~}~}~~~~}~~~~~~}}~~~~~}~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m54.bin b/applications/PoP/poc/res/music/m54.bin deleted file mode 100644 index 5d9b1ae..0000000 --- a/applications/PoP/poc/res/music/m54.bin +++ /dev/null @@ -1 +0,0 @@ -~}||{{zzzzyyzyxxxvuusqpoptz~||}~}{ywutsrssstvwxz|}~~|{ywusrpomlkkkkkmrv{|o|{emx|zxvtsrqrstuwz}wqz|z{~}{yxwwvvvwxyz|}uhfttjfegiknqsuvwxxxxxwuuuuuuvvwxy{|}~~~}}}}}~~}xrps}}|||}~~~~~~~tlffmzwqligeeeeeeffgghhiijjklmnoprstvwxz{{|}~~~}{wtpoqv}~~~~~~~~xrmhffjq{~yuqnljhggffffffgghijjlmnoprstuvxyz{{|}}~~~|zwtqpoqv}~~~}xrmhffipz|wspnkjihgfffffgghiijklnopqrtuvwxyz{||}}~~~}{yvsqooqv{|wqlhffiox~zvrpolkjihhgggghhijjklmnpqrstvwxyzz{||}~~~~|{xvsqooqu{~zupkhffiow~zvspnlkjihhhhhhiijjklmnoqrstuvwxyz{||}}~~~}|zxvsqooqtz~ytokhffinv|xurpnlkjiiihhiiijkklmnoprstuvwxyz{{|}}~~~~~}{ywuspooqty}xtokhffinu~{xvsqonlkkjjjjjjkklmnopqrstuvwxyyz{||}}~~~~~}|{ywusqooqtx~~zvrnjgffint|~{xusqonmlkkkkkkkllmnopqrstuvwwxyz{{|}}}~~~~~~}|zywurqoopsx}}yuqmjgffims{}zwusqonmllkkkkllmmnopqrstuvvwxyz{{||}}}~~~~~~~}|{zxvtrpoopsw}|yuqmjgffhmsz}{xvtrqponmmmmmmnnoppqrstuvvwxyzz{||}}}~~~~~~}}|{yxvtrpoopsw|}zwspligffhlry|zwutrqponnnnnnnoopqqrstuvvwxyzz{{||}}}~~~~}}|{zywvtrpoopsv{}yvsoligffhlrx~|ywutrqppoooooooppqrrstuvvwxyyz{{||}}}}}}}}||{zxwusrpooprvz|yuroligffhlqw|zxvutsrqqppppqqqrssttuvwwxyyz{{|||}}}}}}||{zyxwusrpooprvz}zwtqnkhgffhlqw}~|zxvutsrrqqqqqrrrsttuuvwwxyyz{{|||}}}}}}||{zyxvusqpoopruy~~|yvspmkhgffhkpv}}{yxvuttsrrrrrrrssttuvvwxxyyz{{{||||}||||{{zywvtsqpoopruy}}{xvspmjhgffhkou{~|zyxwvutttttttttuuvvwwxyyzz{{{|||||||||{zyxwvtsqpooprux}~{ywtqoljhgffhkot{~|zyxwvvuuttttuuuvvwwxxyyzz{{{||||||||{{zyxwvtsqpooprtx|}{xvsqnljhgffhkotz}|zyxwwvvuuuuuuvvwwwxxyyzz{{{|||||||{{zzyxvutrqpooprtw{~|zxuspnlihfffhknsy~}|zyyxxwwwwwwwwwxxyyyzz{{{{|||||||{{zyywvutrqppoprtw{~|zxvtromkigffghknsx~~}|{zyxxxwwwwwxxxxyyzzz{{{{||||||{{{zyxwvutrqpppprtwz~}{zxusqomkigffghjnrw}~}|{zyyyxxxxxxxyyyyzzz{{{|||||||{{zzyxwvusrqpppprtvz~~|{ywusqoljigffghjnrw|~}|{{zzzyyyyyzzzzz{{{{|||||||{{{zzyxwvusrqpppprtvy}~|{ywutrpnljhgffghjmrv|~}||{{zzzzzzzzz{{{{{||||||||{{{zyyxwvusrqppppqsvy|~}{zxwusqomkjhgffghjmqv{~}}||{{{{zz{{{{{{{{||||||||{{zzyxxwutsrqpppprsvy|~}|{yxvtsqomkjhgffghjmquz~~}}|||||||||||||||||||||{{zzyxwvutsrqppppqsux|~}{yxvusqpnlkihgffghjmpuy~~~}}|||||||||||||||||||{{zzyxwvutsrqppppqsux{~~}|{zywvtsqonljihgffghjmpty~~~}}}}}}||||||||||||||{{zzyxwvutsrqqppqrsux{~~}||{yxwutrqomljihgffghjlptx}~~~~}}}}}}}}}}}||||{{zzyxwvutsrqqppqrsuwz}~}}|{zywvtsqpnmkjhggffghjlpsx|~~~~~}}}}}}}}}|||{{zzyxwvutsrqqppqrsuwz}~~~}|{{zyxvutrqonlkjhggffghjlosw{~~~~~~~}}}}}|||{{zzyxwvutsrqqqpqrsuwz}~~~}||{zyxwvusrqonlkihggffghjlorv{~~~~~}}}}||{{zzyxwvutsrrqqqqrsuwy|~~~}||{zzyxwutrqpnmljihggffghjlorvz~~~~}}}||{{zzyxwvutsrrqqqqrsuwy|~~~}}}|{{zyxwwutsrqonmkjihggffghjlorvz~~~~~}}}|{{zzyxwvutssrqqqqrsuvy{~~~~}}}||{zzyxwvutsrponlkjihggffghilnquy}~~~}}||{zzyxwvutssrqqqqrstvy{~~~~}}}||{{zyxxwvutrqpnmlkjihgfffghjlnquy}~~}}||{zzyxwvuttsrqqqqrstvx{}~~~}}||{{zzyxwwvutsrponmlkihhgfffghjlnqtx|~~}}||{{zyxwvuutsrrqqqrstvx{}~~}}|||{zzyyxwvutsrqponmljihhgfffghiknqtx{~~}}|{{zyxwvvutsrrqqrrstvxz}~~~}}||{{zyyxwwvutsrqonmlkjihggffgghjknqtw{~~}}|{{zyxwwvutsrrrqrrstvxz|~~~}}||{{zyyxwwvutsrqponmlkjihggffgghiknpswz~~~}||{zyxxwvutssrrrrrstvxz|~~}{zxwvsrqnlkigedbbbbdgjmopppprty|ywwry~}{zyxxxxyzz{|||||||||}~}zxwvutttuuuuuuutsrqonmkjjklnprsne^fvj]bgnsx|~|~}{zxwutsrrrrrrstuwyz|~~~}xwxyyzz{{{zzzzzyyyyyyxxxwvutsrqpnmmlkjigeb``dkqtssrsux{yuy~wtqpppppppppppoonoooopqrstuwy{}~~}{yupke_[[_hqy{zvspooprux{~}||~~}}}||||||}}~~{{|yvtrqqpppppppppqqqqqqqqppoonnmlkihfdcbbeinsvxxyz{}zwvx~{wtrponmllkkkkkllmnopqrtvxz|}~}{yvsoje`]\^dlt{~}{ywwwwxz|~~||}~~~}}}}}}~~~{z{}zwusrqqpppoopppppppppppooonnmlkjihfdccdglquxz{|}~|xvvz}yvtrponmmlllllmmnopqrtuwy{|~~}{yvsplgc`^_bhpx}}|{z{{|}}||~~~~~~~~~~{yy{|yvtsrqpppoooooopppppoooonnmmlkjihfeeegjnsx{}~}ywvw{|xvtrponnmmmmnnoopqrtuwxz{}~~~~}|{yvtqmieb`_aelsz~~~~|||~~~{xwx{~{xvtsrqqpppppppppppppooonnmmlkjihgffgjmqvz}~{xvvx}~{xvtrqpooooooopqrstuvxyz|}~~}}}~}|{ywurokhebaadiov|~}||}~{ywwx{|zxvusrrqqppppppppppoooonnnmlkjjihghilotx||yvvvy}}zxvtsrqpppppqrrstuvwyz{|}~~~}}||}~~~}|zywurpmjgdcbdglry~}|||}}{xxxz}~}{zxwvuttrrqpoomlljihgfeffhjmpstwxz}~|mm}klx~|zyyyyzz{{{{zyxwvvuttuvwy{~~zuz}~}|zyyyzz{||}}}}}|{zyxwvvvvvwwvnc[fsd]enx|xv{~~}}~~ulmyxstx~~|zxwvutsssssrrrqqppoonnnnmlkhfcdhntvwwxz}zqmpy|z{}}{yxvtsrqqppqqqqrrsttuvwxxyyyywvutuy~}xqib]\_gpvzzxxxxyz{||||{{{{{||}}~~|zxwwz}|vqmmpv}}{ywusrpoonnnnnnnnnnoooooonnmlkjhfefhlquxz|}ztpnpu|~|zxvtrqpooooooppqrsstuvwxxyyyyxwuuuwz~zuoid_]_dksy}~~~}}||{{{{|||}~~~}{yxwx{}xrnlmqx}{ywutrqppooooooooooooooooonmlkjhgghkosx{}~|vroorw~}{ywutsrqqqqqqqrsstuuvwxxyyyyxwvuuux{}yupkfb__bgov|~~}}}}}}}}~~~}|zxwxy||xsomlnsy~|zxvutsrqpppppppppppppppponnmkjihhjmqvz}|xspopty}|zxwuttssrrrssstuuvvwxxyyyyxwvvuuvy||yvqmhda`aekry~~~~~~~~~~~}|{yxxxz}|xtqnlmpu{~|{ywvutsrrrqqqqqqqqqqqqppoonmljjijlptx|}yuqooqu{~}{yxwvuttttttuuuvvwwxxyyyyxxwvuuuwz}|zvsokgdbbdhnu{~}|{zyxxy{~}yvromlnqw}~|zywvuttssrrrrrrrrqqqqqpponmlkkklorvz}~zvspopsw}~|{yxwwvvvuuvvvvwwxxxyyyyxxwvvuuvx{~~|yvsplifdcdfkqw}~~~}|||||zwspnoqw}}{{zxxyyz|~~uhbuzf^cjptx|}|ysrsuwz~|{zzyyxwwvuutssstuvy{xou{jknswz~~|xrnotwsmhffhlqv||sq{}rllmqtx|~zwvw{~~{vsqqtw|{vohcfoz|umgddehlpsvxz|}~~|{|~}zxwxz~zuolknvzurpprsuwxyz{{{{{|||}}}~~~~~~~~~~~}|{zxurpooqtuusqonnqty}}xtqpty}ywuuvwxyzz{{{{|||}}~~~~|zxvuvwz|}|zxvvxz~}zvrmieegltz~zvrpoooqrtuvwxyz{}~~{zz{}~{zyz||ytpmkmry|ywvuvvwxxxyyyyzzz{{{||||}}}}}|||{zxwtrpnnoqtuutsrqrtw{{vsqqu{|zxxxxyyzzzzz{{{{||}}}~~~~}{zxvttuwz|}|{yyyz||xtplhffiov|}zwtsrrstuvwxyyz{|}~}{yxxz|~}|||~}yvrnllot{|zxxwwxxxxxyyyyyzzzz{{{{{{{{{{{zyxvtrpnmnoqtvvvuttuwy}|xtrqsw}}{zzzzzzzzzzz{{{{|||}}}}}~~~~~}}|{ywutssuwz|}}|{{{|~|yvrnjhghlrx~}{xwvuuvvwxxyz{{|}~}zywwxz}~~~~zwspnmnqv}}{zyyyyxxxxxyyyyyyzzzzzzzzzzzyxwvtsqonmnpsuwxxxwwxz|}yvsqrty~}|{{{zzzzzzz{{{{{||||}}}}}}||{zywvtsssuy}~}|{{yxwusqomkihhjnsz~|zyxxwwwwxyz{{|}}~~}}~~~trxgmt{}x|}tonorv||yxwwwwxxyyyyyyyzz{|~xnn}{lfefhiknpsuwwxxxyz|}{xvutuw{wpq{{tollkkkjjjjkmprtvwxxyz{}~|yvtqooprv|~xqnov~xurqppppoonnmmmoqsvxz{|||}~|zxwwxz~~xsnkkow~yuronmlllllllkkjjjijkloqsuwwxxyyz{||}~~{umijnt{~zwtqpnnmmmmnnopqqrrplijqxwrpsw{~}{yxx{{|tt~~|zyxwvtsrqpoooopqstvvtpkoxytqrtvxyz|snxtc`ciqz}ywvutssttttttttttttuuvvwwvtpmkntwurqsx~xj_^gsvtsv|{yvtrqppppppqrsstuuuvvvvvwwwvutqnjghlt{~uleadn{|xutsrqponnnnnnooppqrrstttuuuuuutsrqonnopsvz~}zvuvy~|ywusrqppoonnnnooppqqrssstttssrrrsuwz|}|zxvuvz}zqkghlsy|}|zywvuutsrrqqqqqqqrrrrrqqqqqsux{~}{ywussux}wpidbchow|~}{zyxwvuttsrrqqppoooprtwz}~~~}}|{zywuttvy}ysnhdbdipw}}|zyxvusrqpoopqtvy{}}}}}||||||||||{zywvvwz~~}{{{}~yuokgefjpw~}zxwussstuxy{||{{{{{{{{|||}}}}~}}|{zywvwy|}{yxwwy|{wrmiggjpv}~|{z{|}}~}}|{zzzyyzzz{{||}}~~~~~}{zwutssuwxyyxwwx{}ytojggimsy}|{zzyyyzz{{{||}}~~~~~~~}{ywuqnkjikosx}}ysnifeglt}~}|{{{{{{{{|||}}}}}}||{yxvtqnljhikou{|xspmlmotz~}}|||||||||{{{zyxwvtsqpoopqsuwxyz|~~~~~~|yurppsx~~~}||{{zyyxwutsrpppqsux{}~~}|ywuttvx{}~~~~~~~~~}xtpnoqv|~}|zywvusrqpopqsvy|~|zwurpooprux{}~~~|xtqooqu{}{xvtrqppprtvy|~~|{yxvusqpnmmoqtx{}|xuqooqtz}zwutsstvxz|~~}|{zyxwvvutsrqponnoqtx{~}yurpoprw|}|{{|}~~}{zyyxwwwvvvuuutssrpooooqtwz}|xtqnllnqvz~}{zyxwwwvvvvvvvvvvuutsrqpooopruy|~~zuqligghlrx}{zyxwwwvvvvvvvvwwwvvvutsrqponopsw{}yuqmjhgimry~|{zyxxwwwwwwwwwwwwwvvvuttsrqqqrsux{~}zxvtsrqqrtx|}|{zyyxxxwwwwwwwvvvvvvvvvvvwvvvuuvxz}}zxusrrtw|~}|{zyyxxwwwwvvvvwwxyyzz{zzyxwvuuuwy||xuronnpsx}~}|{zyxxwwwwxyyz{|||||{{zyxwvuutuvx{~|yuromllnqv{}|{zzzzzz{|||}}}|||{{{zzyxwvuutuvwz|}zwtqnmllnquz~~~~~~~~}}}|||||{{{{zzyyxwvuttttvwz|~~{yvtqomllmptx}~~}}||||||{{{{zzyxwvutsrqqrtvx{}~}{yvtqomllmorw|~}}}||||{{{{zzyxwvutsqpoooprux|~{ywtqomlklorw|~}}}||{{{zzyyxwvutsrqpoopqsvz~}{yvtrpnmnoquy~~}}|{{zzyxxwvvutttsssttuvwy{}}{zxvtsqppqrux}~}|{zzyxwwvvvvvwwxyyyyyyxxxxy{}~|{xvtrqppqtw{~|{zyyxxxxxyzz{|}}}||{zyxwvvvwxz}}zxvtrpppqsvy~~}|{zzz{{|}~~~~~~}|{zyxwvutttuwy{}~|zxvtrpooprtx|~~}|{zzyxwvuttstuvxz}}{ywusqponoprvy}~~}||{{zyyxwvuutssstuwy|~~}{ywtrpommmnpsw{~~}||{{zzyyxxwvuutssstuwy{}}{ywusqomlklmorvz~~}}||{{zzyyxxwvuttssstuwy|~}|zxvtrpnmllmnquy}~}}|||{{zzyyxwwvuutttuuwxz}~}|zywvtsrqpppqrtwz~~~}|||{{zzyyyxxwwwvvvvvwyz|~~~}|{zyyxvutssrrstvy|~~}}||{{{{{zzzyyxxwwvvvwxy{}~~}|zywutsrqrsuwz~~~}}}}}}|||{{zyyxwvvvvvwyz|~}|zxvusrqppqsuy|~~~}}||{zzyxwwvvuuvwxy{}~|{ywutrqpopprtw{~~~}}|{{zyyxwvvuuuuvwxz{}~}{yxvtsqpooopqsvz}~}}||{{zyxxwvuuttttuwxz|~~}{zywvtsqpooooqsux|~}}|{{zyxxwvuttssstuvx{}~}|{zxwutrqpooooprux|~~}||{zyyxwvvutttttuwxz}~}|{yxwutrqpooopqsvx|~}||{zzyxxwwwvvvvvwxyz|~~}|{zyxwvtsrqppppqsux{~~~}||{{{zzzzyyyyxxxxyyz|}~}}|{zyxwutsrqpppqstwz}~~~}}}}}|||{{zzyyxxxyz{|~~~}|{zyxwvtsrqpppqrtvy|~~}}|{zzyxxxxxyz{}~~}}|zyxwutsrqppppqsuwz}~~}|{zzyxxwwwwxyz|}~}|{zyxvutrqppoooprtvy|~}||{zyyxwwwwwwxz{}~~}}|{zxwvtsrqponnooqsux{~~~}|{{zyxxwwvvwwxyz|~~~}|{zyxwutsqpoonnnoprux{~~}}|{{zyxxwwvvwwxyz|~~}|{zyxwvusrqpoonnopqsvx|~}}|{{zyyxwwwwwwxy{|~~}}|{zyxwvutsrqpppppqstwy|~~}||{zzyyxxwwxxyy{|}~}}|{{zyxwwvutssrrqqqrsuvy{~~}}||{zzyyxxxxxxyz{}~~~}}||{{zzyxwvvutsrrrrrstvxz}~~}||{zyyxxxwxxyz{|~~~~}}|{{zyxwvutsrrqqqrsuwy|~}||{zyyxxwwwxxyz{}~~}}|{zyxwvutsrqqqqqrtvx{}~}|{{zyyxwwwwwxxy{|}~}}|{zyxwutsrrqpppqrsuwz|~}|{{zyxxwwwvwwxyz{}~}|{zyxwvvvwxyz{|}~~zvty|wwxz{|}~~~~~~~~~~|zyxvvuuvwz}~yvpyqdqsvvxxyz|}~~}~~~zuvyxyz{|}}}}}}}~~~~~}}}}}rjo|jdeikmprtwy{}}zvtv}}{zz{{|}}~|rjhq~zogdcdfiknqtwy|~|zwuuw}~}||}}~zslhjr{}vojgffgiknpsvy{~~|{ywvvy}~~~ztojhkqy}xrnkihhikmprtwz|~~|{ywwy|~~~~~ysnjikpw~|wrnljjjkmoqsvxz|~}{yxwy{~~~~~~ytokijnu|~zuqnlkkkmnpsuwy{}~|zxwxz~~~~~~ytokiimtz|wspnlllmnprtwy{}~|zxwwy}~~}ytokiilrx~~zvrpnmmnoqruwy{}~|zxwwy|~yupliikpw}|xurpooopqsuwy{}~}|zxwwx{~}zupljijou|{xusqqqqrsuwxz|}}|zywwxz}~zvqmjiknt{~zwtsrqrrsuvxy{|~}|zywwxz}~zvroljknsz}ywusrrsstvwyz|}~}|{yxwxy|~{wspmkknry{yvtsssttuwxz{|}~}|{yxwxy{|xtqnlkmrw}}zxvutttuvwxyz|}~~|{zxwwxz}|xuqnlkmpv{|zxvuutuvwxyz{|}~~|{zxwwxz||xuqnlklotz~{ywvuuuvwxyz{|}~~}|{zxwwwy||xuqnlklosx~}{yxwvvvwxyz{|}~~~}|{zxwwwy{~|yurolklnrw|}{yxwwwwxyz{{|}~~}|{zyxwwxz}~|yvromklmqu{~|zyxxxxxyzz{|}}~~}|{zyxwwxz}~|yvspmllmptz}{zyxxxxyyz{||}~~~}|{zyxxxyz}~|yvspnllmosx}}{zyxxxyyzz{|}}~~~~}|{zyxxyz|~|yvsqnlllorw|~|{zyyyyyz{{||}~~~~}|{zyyxyz|~~|yvtqomllnqv{~|{zzzzzz{{|}}~~~}}|{zyxyz{~~|yvtqomllnquy~}|{{zzz{{||}}~~~}}|{zyxxy{}~|yvtqomllmptx}~}|{{{{||}}~~~}}|{zyxxyz|~}{yvtqomllmosw|~}|||||}}}~~~}}|{zyxxyz{~}{ywtronllmorv{~~}}}}}}~~~~~}}|{zyxxxy{}}{ywurpnmlmoruz~~~}}}}~~~~~~}}|{zyxxxy{}}{ywuspommmoquy}~~~}~~~~~~~}||{zyyxxyz|~}{ywusqonmmoqtx}~~~}}}~~~~~~~~}||{zyyxxyz|~}|zxvtrpnnnnqtw|~~~~~~~~~~~~~}}||{zyyxxyz{}}|zxvtrponnnpsvz~~~~~~~~~~~}}||{zyyxxxyz|}|zxvtrponnnpruy}~~~~~~~~}}||{zyyxxxyz|~}|zxvtrponnnorux|~~~~}}||{zyyxxxyz{}~}{zxvtrqonnnoqtw{~~~~}}||{zzyxxxyy{}~}|zxvtrqonnnoqsvz~~~~~}}||{zzyyxxyy{}~}{zxvusqpnnnopsvy}~~~~}}}|{{zyyyxyy{|~~}{zxvusqponnnprux|~~~~}}|{{zzyyyyy{|~}|{zxvusqponnnpqtw{~~~}}||{{zyyyyyz|}~}|{yxvusrponnnoqswz~~~~}}}|{{zzyyyyz{}~}|{yxvusrponnnoqsvy}~~~}}|{{zzyyyyz{|~~}|{yxvusrponnnoprux|~~}}||{zzyyyyz{|~~~}|{yxvusrpoonnoprux{~~}}||{zzyyyyyz|}~}|{zyxvusrqponnoprtwz~~~}}||{zzyyyyyz{}~~}}|zyxwutrqponnopqtvz}~~}}||{{zyyyyyz{|~~}|{zyxwutsqpoonopqsvy|~~}}|{{zzyyyyz{|}~}|{zyxwutsrppooopqsux|~~}}|{{zzyyyyzz|}~}|{zyxwvtsrqpooopqrux{~~~}}||{zzyyyyyz{}~~}|{zyxwvusrqpooooqrtwz}~~}}||{zzyyyyyz{|~~}|{{yxwvusrqppoooprtvy|~~}}||{zzyyyyyz{|}~~}|{zyxwvutrqppooopqsvx{~}}||{{zyyyyyyz{}~~~}|{zyxwvutrqppooopqsux{~~~}||{{zzyyyyyz{}~~~}|{zyxwvutrqppooopqsuwz}~~}}||{zzyyyyyz{|~~~}|{zyxwvutsrqpooopqrtvy|~}}||{{zzyyyyz{|}~~}|{zyxwvutsrqpooopprtvx{~~~}}|{{zzyyyzz{|}~~}|{zyxwvutssrpooooprtvy{}|yxy|~}zyxz{{ywvuwz~wrsx{qjhltz{wsppqrrpmiikoqomnuytz}vqnmmory}vzz{~|}xrnouojpy}~~}||||~}ywzzqhdgkopqqrtv{zpszpkjloty~rgi|}~vk}{srsrqoomkjo}oguzx~qtrlquxyytmn|ynv}usx}vu{~pxvvqwjj}oo}}kz|ttxxgacobnwsy}z}yppxy{}zvop~urczrs}vzp~uhgthmq_qjhra]||louwz~pvvw~|z|zphw{ssjko}qpvnmni^e~t_`n[r}ylWLUly{qxbermzw|ovbn{wqru{{jt]KI\lTOSXgsaeot~pu~wysxdg|yh~{zoddjpyzslqaRukd}~wsfyzqdvkiyqsz^]{mochifjzk]qnzvfYowonjv|rryzsvuljv~yvuzfCew^jxcQKVh|tvz}m}xqkjz}u{e[b~|mwpZVVMMoqTZU[jrmc}pf{rnz~xxzrin}}tN^p^^apuklrhymuspy|~~~x~}q{fcz~{vwlxapqjnPQ^lnqh_~tn|lt|txd}mzpvtc[`dhgubaf_pl|}vsqr}qtmu~x~x~|nl|uzu[Y{nq{|voWjmgqbol]ccyqep_tx{lx|ukqfvr~p^jc`Uqyb}svoutvt}yh{|moonox}y|xy|psw|txp}jivwswz{ohociyto`ohp|djwrnjr|hk~hkydje]Y\kkxq{ntv{y~tryzuv|pzysvu~vumxjsjxvip{|lnu{kl{w^[buybkuscrvd{let}vyu}yo~rspkik[oquyx||zpoqwfyrzn{sd||j~wrzwzwuvgxx|ut~]mw|xiroqfrpgr{nfs}wx|r|iwtr~~vjwze`jlcTotmoxotvtu}o{|vswq~vu|yspvlu{}v`_zzrx|vjvvpZgoxha{wqjtaenol|}|yvx~qvup{udfsoY_usv~zrytz{oy}|{ygw}zl}jw|lt~qg~~lqnfsorcj||iuublxwpo}~{xv|yw{zoxfsqejj`fli_Vovzh|zz~k|~~{x~{cezlop|xwyxdl}~yzicxwYqwplgnxutzjrolo~zvrym}|svugcpmf`u~wz|}ywkxxy}tu|xr|z}|~ji{qvuwztrwmkrvugjuowosiqbu~w~zn~svzdqyvvttpecfdb[uvoyz~zut{w|s{yzlfqtljpu{r}vkk}}tiuyyessqdcymt}psiro{vsvvzz~rborgbawutvmvysu{px~ozo~uqnrtkrwzs~r|vstzi}sukluruuqtzkmz{zzw~~xtpwnqqywb_poeVemol~txz}yqznz|z}tihnpetppqo~{uosmuy~yn~muonksmyr||wqz{}~}}~wxx|wrvzbiwriXjozptt{suvi{u~yz{~v}npqogyqpnt~vtv|xr|wppzo{p}zxtvtvzzuzouurpjl|v^`pmaWjit{h}z{~wxt|qv{yu~vnokhaqonlhy~snt}~|yxtqyonyp|rv~~{}vu~lxysnpf]ovlZnstp~|~x{{nxrt~{}ru~rxzorieapvnve|{~}~nxyqtzyxr}|{wow}}ootqrqkdvnU_llaeqi}suyy~wuw~u~}}|~uu~|pnh`]bxlrhk{}zut}~ul}vl|vpz~~{rv}{o}vuqmqd\lpjcupyx|~z{}mzts{|t{{x|wpxtloe^\nynxg{|vpwp~xs~|}ymu{tk~vsmfdo~w][fjfbsnz{{y~r|~u|{x}}|z}ysoxxiglaYXoorxd~|z|~qrqrw}zw|wr~uwwywpkiws_dilitzzxs~pqyzus~u}u{}}zpwwrkowphlh`Yevo~otp{p}yv|}xnt~xy{nzwumgdk}zb\dihl|rxzwvyo}{x~x|~}xysvtlltpdilaW[snxnh|~uru}}sy}~rs~|~w}yzvniokafjnqxxyq{lw|{tw{v~v{y{o}qrojkuscclf[]snxvi|r{~~tz~|rp{}|xuyqwskek{zf]afin}r}{z{t~ox|}x{w{yzs}oonjmun_cjd[_qiuohy~}|p|~zux~uu~~wz}pywpjq~{jddgkwu~vyynvyvs{yp}xxv~txollkrvh\gld\goj{ko{~wu|~~qv{}j~vkurkjw}qecacg|{xuqtpvzxyxty}z}zpkknusc]gha\kgltcq|x}}u}r~|~uy~xmyoyvop}tjgdfpz~wsqptvvzwp~w|}|w{|ynhglvra]ehc_lfotevz~x|s}~}vy|t~jykrsnpz{pheabmw|~suvruww|~r~}~~z{{qhgktsb[cgcameiqcr~vxzwrzzwlnrvss|ulkfel}}vuzrsttxrt}}|zz{|t~wuuhcfqsdY_ghcmigugo~}~~yz}|~z{~xttosjorpu|vkjgbdwvy{~x{vstux}q{z}uypvpfcktl]Zagfjobpngxzwxv|}|~sn|pntsu}}snnifn~zvurrsy~vp|wxuz|l|ylskccmpfZ\cghrmfvjm}y}|{}||~{o|l{{mioqu|xnlkedrzy|}x}ustu|ws~yzxykulsi`dnn`W[bgkuikugs}x}}{~~uuvt}ymjqu}woomil{wxsqrv~||rrs|sxw}hp~hjlc_gmfZX^elvtgwpm~{}~{~|}ym}|qwxqfjpw}yomnkiu{}~{||~xsrt~}~zr~zywvxqgqemh`dli\W\bitxhrsiy~}x}~|p{uzyxljrz}sprplt}~}}z}ztqrz|zzrv~pvqxv}tayvchjbcji^Y[ait|lruix~y~~{ny{t{svnfmw~{qmpokry{}||}|vst}|z|uwrxsywsczwefkedkh]X[`hvzirqgvy~x}zp|yxswqhn{|sqsrpy~y~z{{uru}xwztwxu~tqwzukfyrcejefjd[YZ`j{vjukk{z{|~rr|q}|nungo|wooqop{vy|y~|vty~xy}xv~ut{w}~gnyqcekiki`YY[bo|omsdm{|y~z}}|qx{q~pwrjtwqsttw}s~|~||wuz|uv{x~w~}{rqw~~s{zfmtobbjjjg_YY[ap|mprdo|~z|~~yoyyp}ntsjq~vpqrsw{o{y}}~yw|}ww}}{|~~utw}t||hnsqg`jnmh`YY[`mzoptdkyx}|yuyzk{kkqijx|upoqtx}qx|}z}w|x||y~~x~vqxpnqv}}ruzefjhdX]hkjfcd`\bvarhk{~{wyvwtz|ntskq{xpmprv~wp|vy{nkszztps{}v~r{{utw|ys~rgokle]hpof[TSWe{v|ufr}}ytwti`kjav{jemjhsytoprv|pwzy}uywxuy|xu}yz}}xyz|sluyp`RMQ]ppclruwyxsq{y~||~~xs~vqtqzxv{}|sq{qz|rjfksuhj{lfw~~{uollouxumvwfmlgja]iog[UW]fw~ss~{yy{}{kmrajyn`bkhiqqmmptzsozz{xs~~u{vwsv}~}}|w~utqddnk^RQWbroty{{ywvsz|{{wy~}~}xsvpzpx~z~~qs{p}~tkhlwyej~kfu}~}yrnllmrtolyqfpjejc]iqi]X[al}}uy{yy{|xnvocszocdnnlppnosx~nv}t}vxzxvzyvzztu~}}|u~zoqncgpi[SU]j|zx}~{wvxy{u~xw}~|z}}uzous~wu{nv{qlnx~je}sfox||xrnmllnplkxrgrmdhjbfrob[[akzzy{}~~ywvv{~w~rix{thdoupmmnpt{{nyxp}uw{r|~yw|vyy~}~~z|yxnqrhjrk\UV]jz{~{vw}~vt|xx}x~{vuz{~syvu||~{slz|z}usxzgs{okqx{xsonnmlljhuwhpuicjlfksma\^dpxr~{~yxsopxpy|wliv{rklosxqsymqyu{||ws|x{~yzv}~|{xxwumqummrk^XX_kro|w{tx{xy{}v~yssxt{wz{||yrmywty{y~|ovxsqpuxwsooonlifguvhrwlcgomjppga`eotm{~|w~{snmr}w}}vmsznjotytt{mmz{vx{v|r~|vv}|{{}zvsw|zolsunmng_\_hqlu{{~w~{z}t{w|urszzx}zy{ytunsytsy}}xvzsuurtwuqoppokgcixpiwvkdgqqlnoidektrn~|}uz}yvw}z~zrq||oglt{uw|ljv|vsu~qwz|{x{z{v}|z~}}~}zuolw~pr}vkflwwqmlage_sqy}r{pt~usyv}wzyu{yz|iq|umkqz~}}xur{xuwyvtttsoiccqsfpxqgcipkdhqsstyzq||~vfm~{nkovtv|{vqw{oms|zwtjr|yutv{yin|~{{w|oikj_\fqvx{|ql}w|zsqv~wx{u{z{np|or}y}zzwh_v|y{wqqvwnpxigsrllmllmonke_csnfswnd_eongjswy}~uxo|ykgr~~{lu{wuvsot|vkjq{s{}mjs|{ustux|uiv~{y{y{mb`gi`_ku{v}|{topzwqvsw|||tn}~vqw~~z~{xuunbm}vuyyor~odpwpkjjkmoomg`cqmerxqhcdnsjfnx|~v~xr{vnilz|pz~ywyyutzyplr|{t|llsz~}xuuwvvyulw~z}w}zzofelma\fs{|z|{spu~vny~p|~}}~pw~xwtv~~zurlhrux{}}tp}jhtxpihjlopojcbmodmyvohejsthdmx~v}~~~w~{rqllu|}}w{zz}~yvzyrov~tzskouz{xutwyvtuttzx||{}yyvypiiooaZcq{x~{tsyunzr||~|}xs}zuzwtz~~yronoqlstroiqzukghloppkddomcmywqlhjrwndiuu}}~~xzprqknw{|~}~~|yw{ztv}}tyvlotwxwtswyxsqsy{sv|z{{~zwtx{slilpk_]ixy~yvx}ruvy}}}{~~sy~tu{wsy||}zsljounhy}qy~okrzvkfhloqojeiqhcrzvqmjlrwpgkx~w}~~{v~tkpsmmu|~~|v{~zx}{s{wnptvvurrvywqnq{rs{|||x{zw~qrzslhhlngaiy~}xy~wt|{}}~{|sw~tpy|vu||yxyxrjejvviquswnnuzsigjnpqmhhqnbkwz~{{|}}wtx{~~||}zuxqceqtpu~|z~|~xv|~yxulo{thinsvwspnvybbkz}tzy||zxr{~{rorwxstyssx}}vrzywzxvwz~}zupuye\grrou}~z{|xsljpy|ujbhyzjrx|yw}wtw|~wgkrxxppqmipwzx{{xtuz{svwikttopyzxuof`_gvznlwzfbu}xwzxz~{}~ww{~{wx~tfn{~~}{yz|{uxynhiptrzwtyxngkqsrrqpqyw~y~uuurnihlsyyrjl}pm}|~{uvxi\erx|ws{zrz}rou|~yutx}~~~~wstxunuznnvzsns|~|troic^^eq{|x|ply|xwy}|s|~zz}vuy||yw}~nhs{{z|~~||~~yywnklojj|z}ulnstsrpnrxy~u{wuvuqkgglrvtony}nt~|~}yy~uccnrsv}|~uyvmpw||zutvy||{}z{{|{vuvtkl|~sot{|smrz|xvuqjb^_eouxxzwx~}zz|ut~}}yw}|usvyxvzximwywwz}~}}~|xqnokci|zz}rquwvspow~u||}r|}ttvtoiefjprqno|uw~||~|z|wefoqqsx}w}xnpvz{yutvyzyy|wuzz~|vuurijy}sorzzqov~}ywvsme_^cjqtux}~ws~{~|vv|~ysrtttw{kiswvuw{~~|}}upomecr}x{~ssxyxtqs}xv~}ws~urstqkfcfkoqont|z}{zzyx~pcipqqu{{zworwzzxuuwyyxx~ttzx|zuttofl{|rpsy}tpv~}vttqkd^^ckquvzxtz||wsv|{tppqqu}{kgpvvvx|}~~{|upnmgcp{{ztvz{xtt|{u}~ry~voprpkfbcinrqps~~}xvusw}tccmrsv|}ysruyzywvwyzxwz{p{xx|{vssphhwwqrv||tsz|tppnjd_^bjrvx{{t}z{}ztrx{xqnnnrz{memuvvx|~z|uponhdp}|wuz}{wv~{u~~~ty|smopojebcinqqqu}}vsqrx|oezztrw~}tkm~|uw{~~}}~}vw~~|zsjo}|rmmpv{xqpwtz~{tvyyuplknrtrprxxr|~}odwummoqpnou~{on||~zx~yqv|wx{}us~}z||uy|snpttqmiiloolhioplw|wtvwmizzwuqnnt}xkj|}uuy{|{{|~}yw|ywyqxzvvy~z{}z|~wx~zz|xuyxoknrrplijmpoljnutp|zqllssjj{zsnmrz|rdi|xtvz|}}}~zzx{xu|{{}~wwzyuu{yqw|zyux|tjjnqqmjhilmkhhorkk{wokovqgn|wv{rfp~vsvxyyyz|~}zwy}u{|rt}wvvx{yrsvwvy~xp{{xw|~tkkorrolklopnlnuwnn|vmjounel}ytsx~}odn}{utwz{{{}}z}x~~ux{z{|}usvwwz}umwxst}~siimpomihjlljhkrriiz}~yokovpgm~{y|vio||vtvxxxwy{~}zwy~w{|ss~wvvvx||topstx}xow}vu~xljnrrpmklnonlnuxokz{y}yoikrpfiyyvw|xjjw{vtvxyyyz}~z{{~xt|zzzz}zqoqsv|{qqupw~ohjnonkiijkjhhntpgnz{~}uljptmiv|{~vmt|zvvwxxwwx{}{xv{|zzqv|vvvuvy}{rkknrx~xr|~ts{njnqrpmllnnlknvypm{ztuxvnghpqjm|{xx{{qmuzwvwyzyyy|~}zz{t}~zyyxy|~{rjilrz~xuyorwkilnoljiijigfktumn}ztuxumglttow~|}|sszzwvxyxwvwy{{xuw~~tr~~wtttstwytkefkuy~wpzulloqpnllllkilt{vpxzroprnggotop~|zy{~}vrwzwvxzzzxxz}~|yy{u{}xxwvuwyyqhdgp{|z{npymiknnljiiihfgmwwoqwporrlipwtr}~~{vy{wuwyzywvvyzyvu{zrv{ussrqqtvqhbclz{tqsmmppomlllkijpy{ts}vnjmolimsqnx}||}}yuxzvsvy{zxwxz||yy~}uy~xvvussuwtldcky~yrn|rkkmmljiiihfgmwwoo{yqlnqpnqvrpz{y}}urvyzywuvxyxvv|yrwytrrqooqtrjbbky|ytruonopommmmkiks{yps|umiknnmqrklz}zwzzqqvzzywwx{|zy{xvyvvutrrtvskddo|~vx|pt{qmlmlkjjkjggktxpkr~voknrrtvqjp{zypqvzzxvuwyyxw{~{|st{trrqpnnprpibdp|{ty~tz}upooonmnnmkjpxzrnv~{tlhjnqstmfm||wxxnpvzzxwwx{{yz~}}vy}wuutsqqrtslefq{ysy|rx{tomllkkkkjhhmvwnjr~}wojjotxxphn}zz}qotyzxvvwxyww|~z{su|tqqqonmmpqmedlxytwxzytqponnnomkkox{snt~~}{vngfjpuxqgiwxv~rlqwzyxvwyzyy}|xu~ytssrpnnoqpkeiuzvvyv}zupmlkjkkkigjqxumnx~{umghnv|zojt~x{|potyzxvvwxwwx~||xrvyrppomkjjlnlgemxyv|z|{wspnmmnnmkkpx|upv~}|{zyunfbemv|vllxxt|xnntyzxwwxyxx|xt{ysqqpnlkklnlhir{zy~x{~{xtpmkjjkkigioxyrow~~}|{yungdgq|yptxwvnpuyywvvwwvw|}zrs|{rnmmkjhggjljhlv{z~}|~|zvqnlllmlkjow}ysv}}{zyxvtngaaiu~soyyty~qmqvyxwvwxxx{xszyroonljhgilmkls{{{~z}|yyvqmjiijjihjrzzrrz}}|{zxvsmfcgs{sy~vxvnotxxwvvvvvx}vpuxpllkihfeehkllryzz~{|{vqnlklmlkls|}vsz}{yxwvtqleacm|{ru}uuxnmrvxwwwwwwzxswzrnmmljhffilnosxxx}{wxyupkiijjjikrzzrqx}|{zyxvsnhdep~}tx~vxzpnrvwwwwwvvy~|tpvwolkjigfddgknptvtv|y{|ysnllmmllov}zss|}}zyxvusplfbdp~wpwztyxonrvwwwxxwx}~|tt}vpnmlkigefimqtvtpvxvyzwqljjkkjkpwzsns|~}{zyxwurmheivus|zwxqoruwwxxwvx~{wps}zrmkkjigecdglquupmuyw{}ysnlmnmlnsz{tpu~}{yxwvuspkfcgs~|rrzxvxqoquwxxxxwz|xrv|sommlkigeehntxwoltwtx{xsmkkkkjlryyqms|~|zyywvtrnifit~~vu|{x|tppsvwxxwwy{wps}{rmkjjigecbekrxxqjp{ux}|wqnmmmmnsz|uot|~{yxwvuspmiffny|vtz{v{~vqoqtvxyxwy~}|sr{wpmlkjigecdipx|vmmz~tsx{xsmkkkkkovzwoow}}zyxwvurpmjhlv~|xzyy|uporuwxxwwz|uot}xpkjihgfdaadjt||rkr{tv{|ysnmmmlnt{|vqu}|~zwvutsqomjhhnx}zx~|vzzsonqtwxxxy}tqwxpljihgfdbbfnx~snwwqtyzvplkkjknu{zspv~{~ywvutsrpnljlt|}~{w~ysonqtwxxwy~yppx~zqkhgffeca`bgq||qq~usw{{vpmlllns{~ysu|{|yvutsrpomkjkow}||}wy|wqmnquwxxy}upu~~wokihgfecabemyxqxwqrwywqmkjjkpw}{trx{z{wuttsrpommmpw}~}yy~ztomosvxxx|vor{}woigfeecb``cju{qu|srvzzvqnmlmqx~}vsx}zx~|vtssrqomlllouzzzyw~}{vpmnrvxxy|yqt|~xpkiggfecaacju|rt|rpsxyupmkkkow}{tqw|xx{wuttsrponnorwzyzzz~|wqmnquxxy}~wpt{}vnigfeedb``cjuzqt}truyzwsommnsz~{sryzvxzvtssrpommmoswwtw~y|~}|wqmnrvxyzwsy|tnjhhgfecaaemyvpwyrqtxyvrnllnt{|uprz|wu{yvuttsqonnorvxusy}{~~}xqmnrvxy||~ut{~yqkhgffeca`aenz}tpxztruyzxtqnnpw}|upt||vu|~xutssrpnmmorvvrow|{}}}xrmnrvxy}yx}}voieeecb`^\_en{uqw{zzvpjghlsy{wmgiqw|sljo}ysv`_nw~{ytmhn{zrjfktz{wtrrsx|zz{m`[amsne]YX[akrrmo{zsx|upmkhedflstrw~{~~}z||sqrqnifdegjnsz}usxxxvy{xqpsy{wrt}rq~sonlgb_^`b`ZXcvsn}}zrlmtzzto{mtyz}zjcjwvq{jZkoigffly~~{{zvvz~{nt{eo|qklvtwqg{tj~ujgiq{x}zumxalpaca`ervolkgfyytx}~zz}pzwkqptrpxwklqsur}zwofdee{|z|yljpg{hde_ZbphYY\\[tpxq}~|~uvrx|tvt}liqqklzukt}tzpqfzpmmqkf}~vyspyrw|tmzjsjw|s}{yyuz||mz{wysrry|{lvgmeutimtyhl{piwxs~yt~~|fkqzozzvwwstwxizzmkxmff}~|jsx{kqsqrps^^bpgZkrhfi{r}~xxvvz}wtx|{tp`gnzlgy|v{ov}sfb|zzx}ztxx~vpo~sllllj~uyzx}v~w|s}y{}vy|{volhjfi|yset|jju{xr~y{sytp}tpp~s{{v~pr~xn|}|nys]dr{rxyso|orwxsdplfZgtgfnpldxt{wy}}{{m{zx}nkvqh_r|u{v~tzwxmkw~uxw}~|{ryrjxp|sumtvny}}|uvz}mvyw{}yz~~y}y~x{|v}rshvlinxwfo~ytsx{t{pypltvpftluuz|y}|w~z|pbqxus{yyuwusdksnsn|lfitpdqwjgnuytvwvzyytt~x|{}{tzmkmujm|~zt|zrupxyvswlvzwmsszun|zunz|xy|~v}s~sv~{|pys~nmtpigxxmpqtkuzt|{y{~pztrvquqtvuy{v~|zyklwpjpqpgz{}tq{u|nqfkxrjgyvadr{pvxt{{v{t{}||v~rwkt{rgi}yjv|vv|s||u}}~n{{wnxuuvvomyksotu}|x}pwtx}u~o{x}wxy~owq|pqyyluutz~}~w}s}s{tfqzuizt|ww|y|}xw{ugr~rou}~q{}q{slrnz~k`mvtlqsi~on}zxyz|p||{xl{puhekagxk`qq~puvpqmnhtul{{vq}wkatvql{}rzwz}vxsrzvn{z|ytm|y}z}}}wizvp~~lt|uzzvrzysy~mfwzhwbtrwyq}}zmxvh|tsow~ul{mx}rseswy\uyvollp{{{dr~kpzzs}jq}|{{zr~}yxf|~~Zigfojxszyurz}vz{httvugkvswv{ypyz{}ksro}|||xzqqquoqup{vzyxvuztlizvs{vzzmuxwwlsooewor|y}wtpvy{rn|yv{rvtxmoxxkuvu~{mpxw{uxwytuy|pswrz{z~mx|wvvogsshvsr}{txt}~t|o}}wo{wnlrt~~z|ts{~~}~zu}|w|xltwn}}w{}}~tm|sdr~psvww|ssussr|{kr|so|x|xw||xv~|vzkmvrmwtkv{||}|{zsrjl}svmsuzu}hzt{~y}twytxtrpnmknsjnxsyzz~|}~w~ts}vpzps}}vv}ptvomw|~x~~xywx}u{vzzly{r}|oo}|{y{{syuwvx}w{pxztxywlnhew}wu~x{|xvy}{wxptxin{r|v~wv{{uq|~ywrvuv|mt|yrsuyxz|}~w~y~uzwp}tsyfkukhxwm{xqyxkxyuyw|zyzuoz|wqxzy~}z}zsulopxpyypiq{szo}s|v}w~yqt{x|q}zovpbpymuln~{}}{{ymyvmvpqsollyy{|uuwsoxstvs|siu}o|u~}wwy~~wtx{}|vyrnpvi`mhhptuutzsw|u{|tmzvtyxv~~v~yz}|ruotxvwp~{vr~xvjw}}v{}u~zippdnyhkfhxyvs|~}}{~wzzw|tnxnjeutnzv|u~t}yu{|sv}v~v{}xr{ysz~~y~tv~|y{rwnmxocmmjumxx{}|~~z~svuswq{{zq}us|twxu|xu}~rw}nvmqyut}x|ofz|~~{{x~ypzwqwyq|ykmhs{{~w|}}~x{q|x{uxhbpnojxun}ukrowv~nsu{~~zxqttrttptfnz{|}up{|pp~tyvipllsrowsmdoz~oo~zghkiyz|{s}}wzyole}uwxyv~}xko~tketrkj`\lumpzxmt~ywzvs~wtjgwuup|sw~z{q~xs~ox}ry|by~konyrjpupt}{v{pv~{|mmk}mpoi{rqgx|qqkuqw}v}pnsyrfjhrhtvfsyz|}vls|qkhwwqprq}psvvw~{~sngtroxyqrrhaunehaar}v|s}}{w}vpsrp~lizs~|fn|{w{wxsqn~q{t~tqq[fnpfumv~y~zyxmzz{lzwmmvsdxt~|wt|x}zotnws_r}zuqfrkrxjy}~uz|z~}~|zx{~vp{}nzo~zvvstx{w|wzz{|gmvpqt{vmwrz{nfo{t~~{|pton}w|}opmt}wvraqs{ztv}sxvxxwvpfgzf_dnkgy|~uy}w|x}zyyno|z}{k{rsgxz|~}||}zwvv~rm|r_qrvekpsrysz~~~||u}prup{xfx|vv{rqy|}z}xw}|vwn{}|yhx|wmiwmrryl}{st|s|nx~|qjxy|x|oyzwp~{su}z}v{~kot~{ktovhsz~pkvpkvq{{wz|qwsyyzszyfutjshrzq{pyurr||sy{mhntgywyjfvxqrv}|vzwwz}kgr|ujwovz|{xv}xpxvzxxypxpsup`oywzsto}}w|~{rrzxluuojusuz{x{|tuy~gku{wpsfwo}tfjuwturx{{|z}xnyskwzz{r}rx~|xu{y{{gutsgooommfzzrgmyy{vt~{vv~~tvvt~uuo|uv|{j{~q{|}~tyytq~}|r|zr{}tksrdirwqlyqpzsuzzyykvo~rh|~{|}xwsuxoyyvosng~sr_fupfiuy~ww}{{~tr|wnwkz{mrxy{y}uvxuxylyzzl|wep~wurtlsn{}~}~~soo{tlmrnrtmyz{tsy{~ro|u{k{vxwgip~uiorpszxr||}skjsqkemZlmom`gpup{~~}{s~tuqr~wpkhyvomww|vco||}u}p}v{|}soks|xjtzxkgxl]kic~ggm~ut]gsnhggu}x}~{{yryttsi|woxrvkytgyrayz~zlwvxz~~sx{{jlnlq{|v|{~xmnbspl`Wklsgkytmr`k{rd_^e|}peppkjqqfsqoutrzwjrihgptbrlz}|vp~dl}irvjjtrlnfXipqhfzgj{eOmWfURbPWQt~^`dhfmvrg{xzy{oq~qlrbfe]nl{~z{m}wrmpz|xzuvtnvuxbVj{~ys]bueVndbKZiUd^muVmzzymsaowv}uyy~vmxzq~sxfjsw`j}hzz{{nrxp{w{tkz|{b]im~ym\aumseaUY|vghVlparz}~lwemzxskuzoqrw~rp~j}yhvqmhowb}{us||~i~~wy|}}|{~xks{}m[^[mttonsp^\_byykd\um\jqzqivhoj{sfl}}yzs}|wrt~llpmkc{vh~{|y}v|{vyury{yamzt^bXt|{uryshc\]mvc[apzTYnwnf{bno~gqn|}v|v}jvy~ujpnsdkxi{oxsl{z}u~yogswtkjdls}k~suqjeRitnUcmriYmvqftihzjm{wx{|nu|~rn~|t|vwzwugdts|{zynuwmz}p}~}xadoyvjqc|qtxm}kf__tzbZqur[aosgttiojsgo|vy|{pw}srt|{zzxq`wq{u~s~wuuzv|zj[mnuihii|v~pz~ojVkvuY_ppr[cgiavnhlwtmsvzz}wwt{vtutstrhg{wy}k}zy}~p~}vvqz`[krnbrgsz}nvjj\rtmR`toobdmgg|spevt}qz~szzq{xxvlktspdsw~~|v}tz}vvrzsfq|jW`dqkp{j|kpkoclttcTs{ne_boiz|ohhyyrx~z}yiswzzzrqmtzsllw{{v{y{yz~up}}~}|kl~wb^glll}m~~uivxhdrrt\lleabpjurmgzs~vsv}{yznuz{}|zmgrzuohyy}ux~~ws~z|v~}{vjhvweZ]imj}lt|lyo`pwyegrdi`kfnrre{vytr|{{qpuwxxysgpwojdxr|xxwsztw~{wy{xjiqpbZ]dkk|lwn}nisxwcer`ofd`p}pqd|{tvxz~pqrpprx{pipvrki}vyzu~|trxrx{pwxvljqod^bfcnwizp|~mnwunclmalgec~|wqk|zpvv{}xkrsqrt~kdptvksyr{wu|qu{x|yq}{qijpogc_a_rqo~n|~osxvnmxkfpe`juwgp~{pjzz~w|oqpruy{fbqyum{rvx|{v}o|~|u~}~vsyvlfmqnie__aslq|xrrxutoqyjasj_m}qufr|nk~y{z~n{svvv{zgdowtlyn{|{|uymyz}qz{~wrxsnikoifd_^atim{ttqvytptw}o_noaj~sxjt~ql|xyxpsttru}kclsrkxnu|z}~t~ymsy~wv}wxlssokmjeef__]nnlu{uxzysu||xglsfe{wzqnukw}wruzwwrpq{sceqtpzypx~vw~{qpv|tzrhkmnihlfdifa^htg~z}}}x|wtr||tenn`u}w|ly}kl|~zw}szwwrqx|kdiqss~n~x|qz}ypytz~uz|ozhmnlhigbcie`]rqpv~}zzupvzrfonf{wxtl~vho{x|z{xxsqqywfckrtz}o{~wq|}wr}sz|rywzmseijffjdadgc_cwp|z}||yvr{}wpgrno~s{pqrjw}xzwxuytrry{ocemtuyyvqt|yqss}xp}slxhbcdcghb`ghebrvp~|{|xtxvuljsm|ww{m~}km}zs{}qwwsou|xkfgnt{uzz|qwwsp|wv~su|~o}xkscceeghc]ajjejxn|z}{vu|uvjrsyzs}nxqkx~}swquwtpr{zofejqzx{upvvur|q{yq~||rw~h}xebccehc\`jlgiwn}~~~ywtwmlu~}r~outkv|ssrpvsps{{rheioxw}wqtuus|tx|r|z|rtzjxujcbbdgd[^ilhivl~}~~yyrwpjv}s|owslx~xsssnuuqt{ypiegnzu{ysttss}sw}t{~w{qutoxrkb`afhb[_gjgmrj~~}y|qwqm|wvxn~qq}{xmzmpvusvzumifgm~wv|sutrwqx{y|xt}pupxtoja`ahh^Zahkjrjoy}{rzsos{ts|quu}ilouuuzzunkggpw|w{tsrqz~qv|~sryrqnzookb`cjg^Y_hkkrfqx~}|rzvpu{qt|sws~konuvv{zsnkffpux{uqqs}~ss~~~~qp~xupl~okmc`bhf^Y^fklreowswzqx}sr}vxsyo{skqvwz{tnlhfl~w|xvsqq{wp|{{snzzurf|tgng``fg_Y\cjmuilwvt|u|}woxxustuzllsw{|wpnkgiyzwxzuqqv~}rtzzxkpsvdn~gilc_chd\Y_glusf|}y}tw}x}~ow{x|{o|~r}~tjoux|yrnmigp|t~{yspr|~~zpyv|pitvtp`yvbii`_eg`Y[ajq{ooz}|sz~}{n|~zzvpwu|zsinty{xronjiu{vy~xrps|}yq}~wz~|livqvk`{q`gh``ff_Z]dmw}mx{}{t|wq|y|~ps~syzxqhmt{|uppnkm{x~w~|vrqx~z|vru}xsgkzuqu_i|g`ge`cgc]\aisxp|~xvox}xzvm{wv|vvlhpx}zsppnmu{uy}ztqtz{|txsx}zkgrzovh^wr_bhcafe_\^eo}q}||t|ss~yzymwxtuuqhku|{upppns{tz|}wrs}zy|wur~yy|nfn{{oum[pvd^ggcffa]^clzt|}|~wzyr|wyymvwrvrujjt||uqqqptzr{|~}xss|zw{zvt}vx|nflyynvm\ouf]dhefe`\]bl{t{|~xzyt{vywmxusvpulis||uqqqqvwpy|~ytvyw{|yw{ryzmgnyunxi_prf\dihgd^\]cm}~s{}~y|{vy~xu|}royoyqpuljv}zsqqqrxqrx{}yvz}vw||~}|voujirz|qrvbgqnd\ekjgb\\^dq~uxz}~{yw}|w{quwiz|ech_]hnkffhkptiu|}y|yz~~{{mhx}~|vldfow|}wlrq^eig`V^hjheccaclsmxzuy}toyzqzzqrntnjrwrmkmotviwy}}vmrz{vrt{|{ok|~tmnt{zovtbjlkg\alni`XUV_s}{~znhqzmagk`t}memmgnutonorwxjr|vztyw|{xl|yrrw}x~qw|xzpmw{reXQPXlyzy~}}~y{|{yupq}vv}ozqs{vv}{yz|zwu|zky|qkkrzufrs]csyyvofdgmruumlvidnhih^bnoe[WX]i{~||xtpmlvznukbvyi_fjehmmjjlpvsety|xwuvxw|}wzlz{vv{{t{|tvqfksm`URV`q~|yv{~~x{}{xurqzwu~qtwpy}y{~}}xsv{mvvnkpz|hhye\kvxvphegknrsnjtocnlfjf_grmb\\`jz~wzxurqotrttco|se`jmjkmllmqxzlmz|~y}u{r{wyrpr}wwz}zvv~ursjdmqg[X[et~yz{wx~ty~|ywsqxzvtq~rt|}~~z~sv{mvxpmq|jfxi]hrwuohfhlnookjuneqmdiibfrqf_`eo~ut|zurpovu{rfw|thblrnklmnpu|yjuv}zw{}y{tuzx|spuzwz}~{ys~}qpskfnpf][`k|uzw{uq~|xsor}y{o{sy||}||yvx}no~~~vqr{tespcenttoifimnnlihuperqffljentmdaemz~{uo{}wqmjp}}wlzzpfjvumjlnrw~xkw|ryzv|ywxru|z~{y}v}uw}yx|}zvz{u|pnspimqh_\`kxy}uzx}zos}uolq}uv|u{|y|}ysxyjtxux{y}porkjjorqkginpnlheougnwmdgomjoslfdhqwqouvmgfo~u||tlq|wlilpv|{mr}rq|~wv~ur~{q{zuw}}~{~|y{z}zw{~zutt~xnovtmnpia_clqm~}~{{}xmu}tlkr~ux}{wz|vp}umvsos}vwolpnnpojhkpqnjderrfryoffosmmqoigjqsl}xuvi_Z_kw|qz{sq{}qghlqwuhmyomy~~txvy|tru}|wx|xs{{xxxtqsy{{wtuwzo_pxwqssnijpsly}|zz|vxs}rlnwtw{zw{wuzuhjorvqpt~{lpvqnmjghmqqmf`dmce{xnmtxrosspnrwpo|vddouof_`it~w~wt|ukkqy~ymx|mjqw|{o}y}ww|z|ognnewvsupd_`_]^dg`l{~y{z{~~}~uxvprzuqu{pcpyhflheho{~z{yx|kfstnkjhhlpqld\]kjex}upt}|sqvvuw|yswkkrrj`\aku}~sx}}zuu}~slnv~}psshlt{ut{|y||}~{qe^fois{vy|recfeehjchzyw}{|~~}zw}{tsz~qlqxvhoymkqlhioy~{|xzmdqxrkhghmqqmd\_ligzwsuxrv{{}zt}yqnrtlcafnv{}|~r}}~~yw}voqyyozohmtzw{|{~y|yy{~|vk`_kkgz|y}vhfjlmnibr~wy}x}}~~||~{yux~|vkmrytszrpuqjhlt}}xxvekyxngeglqrog__khcu{ww~utz{s~zy~|usvqiegmswxx~s~yz|sry~wo|pjmrvz|}~}z}xyvx|~|vkacjccx~~pkostqfdw}w|~uzz|}yy~zw{qmnqtwy}zrz{rkjnw~}vphp{yneejptsneahj_hz~{yx{vv~~rz|ww}|xxsmkmqsttyuzz{}vw|ypxxmmortvvx|}~~~{{y~utx}~{shdjf[hy}}}~vrw|{pcm{vs|~|~v{|xy~~|{~z|pooppqsv|yxvonryywrkpzzofejqtsnfelh^jy{yyy||w~s}|vuz|zxtqrstsrxv{~y}}y{xox{onpqrssuy|}|{{|{|uqtz|{tkfkg[ctyz{}wxyjn|xrx|~y}~yx{}~}~y{tnmmmnoqv|~v~xssw~~u||qmqyyneflrtqkgknb`q{z~|{|~{~}~zsoptyxu{~}~}{{ywsrxzpz|}y|zwoiu}pghkmquxxyw{hy|stx{ysljqncky{{uv{qsy}}zvssvz|ztv{{{xvwy~tqvkv~ztv{~~usskkkjhggnz}xyzxz{~}xx}vrv}}zkpvw~|st~|qz}x}|yyz||yrkilt||wvy{{{zxv{}z~ywrlecfq{{hr~~xuv{|}zz{qnquvrlilk]]o|{xzz~skinw{|skmqsttrpr}}x|pm|rigfddeiqz~x~{|{ttteZfu}y~wnx~tpu{}ywx{}~|{}wuuxzzvojinw|zxv{}{zxtolgcbdjuqyzww|z{}zxwz}xpmqtsoklpg[eu}{z}wnjlrwv~tmqvwvtqpwv~|rjvukhhfdcejr{~|~{}zuuwj\dqx}zr{vosy}~|ywwxzzz|w|xttw{|yrljmsur{}vz||~wuqnieaaenwz~~{{}w{zzyuuyxrnprromqse]htx{{yqmnpnm{yru{|ytpr|wvz}}lm}|pkkjgdbbfmtxz|~}zy}vdbmrrv}x}~rpty{{yvuuvvvzwrvtvz}}xrnnppkm||{}y}yzvtqkea`cipvyyvzxzxrrvwsppqonqwn`costv|~}ysqqnfiz{}~wz|vsx|szz|xks}vmllkhdaadinrtz~}{y|veforqsx{truxzzxvuuuttyvn|xsuz}}ytppqohjx}ww}z}{~zvvqoy{}|umkr{xrtuvz~|~}vqrxzwutokrjjwws}ywz~~|{zxwzuyozwtuy~xuzsty}uu~v{vprtsqnmmoqqoowvhi}rhefkuynhr{|{|}~x|{{~~}|yus{~z|}z{{vpu~uuz{z~{||qfmuoijmnmjhhjmoonq}}~vu{~|wusty|oq}{vssu{|zxgjx~yqorx{{ywwxwqmw~wonrx|{tnry|yuwx|wxz{zxwwz}~~yxz}}||rpsrlffosspppt|xmt{{mn~}{{nq{uy~}|sqruz{zut}zvtuwy{{xpkmtnglidgovyrbkialmlmvwln}|qmnt~~rnv{yvtux|{xxxwusqpponqz|gam~vu{vmmwo^dsuru{|~}|nebba^\\bku}}zxywoggt~wqpsrd[i}||{z|z{vjq}~tliknqv|x{vrsvz~zwz|}}spppqruwwvsnkox|vy|urnf[U[hrtstx|npwywwx{|}|~}w}{ov~zz}y{xqqruy|yuw~}yvsrrrv}~qlkjhebabdghjq}{~~|x|xtx|siqyr}|{ywspnmmnr||qs{zwwwtrqqqkejwwpnquy~~~uqpppqrtx{|{z~z{z|}{}zxund\_jrrlhiqtibjsuuvy|~}z||z|wusrrrngdhmqx~{xtniffq~{nhijkjgfefhjkoz}wyty}qpz}xuvz{rgp|ywusomox}rfdhnv{{{{||zyxwriitxqlmprv}~xvtrnkiijkkkox|usvv~~tmmomh`[_kssonu{ujktwvuvy|zuspkejz~|}~}{|}zsnorw~zpt}}{ysjcfxznklmmkihiknqt{}yrry|uqtwoeivxloz{vsstttttttsqps}vkklmry|||~|ss}yuvxy{xlk{xtvyywtrqrsttxwnu|tt{xwxpnookd]]eqwvv}vu~yx|}|wnmwysrrqoorutnkms|ur|}}}~}vlgu~utvwvtqooooqu{}xy}{}phowzz{~~vqw|yuuvvutssstssu|ytvvuzyrvxuwyyz}}qrunmmlkihikmorywqyyv{}wvvurmgejt{{z~uu}~|~{{~|zzzvomw}vttsqoquwsmms~~y{ofnxtuwwurpnmllnv|qq}~~|ysmkpx|zwz{rimw}~~~z~||}~}|{zyyxwvz{suwvx~vlktwplmqtvz~qjw|pllmlkkklnpsyx|~|wtttrojfgnwzyy}ynjry{{{~}z~}z|~{z{|ztr{~||{yww{~wrt~y~ynadx~rlloqssttttux|y~}}{xsnkmtz{z}}unt~}yz}}}{yxwwusrw~|pjnpnow~vxwsstttuz{z{nl}vsssssrstuvyx~}vx~tljjkjihgjr|uw|~{tx{{{zxvx}}uputu~{njyxututspnmllnvxsz~{wrqt{xos~||xppsuutsstvwwy{uy|yuxwps|{tpprrqrv}|yrn{wsrssrrqrstx{u{~{~}~wutspnkgfjry~vov~~~~{}|~|uqy}wtuutqqtz~|vt|~{odfvxtrsssrpomlmq{{rt~~|yuqnqw~|onv~~}~~y{|zxwvuuyypsxxsqu{ssz}wqprsstv{wmr~~wqnmmlkjkkmqz~yz}urqqonljfdgoyzpr|}|}{vw}{|{wqu{{}~}{{~{xz{wkdkw{yvtssuuuutsrtz|uz}{yvtplhhoy{pr}}}zsuz||zxvuttuzxpsyzvrs|xy|ustutstx~umq|}zwvuutssrrt{z|yy~vsrqpoonlihnyvu~zyxy~}}~}|{tt|}wuwxxwwx|{|{yvmmv||{zxwvwvvusrrv~uu|~|{xsnnuvns}ywqty||{ywwwwzytzzvw{v{xrqrrpppsy~}|wqv|{yxvsqppoooopt|~y}|~zvutsrqpnkilwvt}{tszy}||xy}ysrz~xuvwxwwx{|wnmuzyyzywutsrqponqy~ury}|zxvusplimx{opy|}wuy}~|zxwwx~{su||xuyysu}{ustuvvvx|voqxyvvwvspooppqru|}~}{zusrqoonmkggo}xrx|w~wy~~}~{x}}xw{{vu|}yyz{zzz|}z|ulltxwvz||zyxxxwvvyzv{}zywutssqmjmx~st}z}wsvz}|zwuttv|upu|~{y}~y}}vtttsssux}{}tqx|yuwzyvtrrrrstx{y{}vtssrrsttqnpy|z{tuytv{~}||y{~zz~}wsx~ywxyyxxy{~zuz~usz{wy}~|ywvutttv|ysw~|{zxvuusplksutzxyystx|~}|{zz}}vz~{{zv{|usrrrqrsuy~}y|tsy|vpqvxvspoopprv~{x}{ywvtsssspmmvyzxrw{vw|~}~|x}}yx{xqpx~xttuvwxy{~|{wqu}|tptz|zwutsssuz~uu||{yxvutsqmjktvqu{~|zz}}{z|vw}|zz~{vxyuttttttvx|wy}uqv|wmimsuspnnnprv~|}ywvussssroloy{y~}ut~zuvy}~}||~wy~~{wvy~vrvzxxyzz{|}xz|trzzpmry||yvuuuvy|ux~zxwutsssqolnv~~xw|{{zxz}~}{{}wx~}{}}wzzvuttssstux~st~vtz}rkmtyyvrppqsv}y|zyxwuuuuusqqx}{}urz{urswz{{{{}{z~{z}zrs|zvvwwxxy{|~{v~ytxxomsz}|xuttuw|vty~|{zxwvvutqorx|yvy~~y|{xz}~}}}x{~|}zv{~wtsrrqqrstw}~sv}ut|{ohjqvwuqooprw~}x|{yxwuuuuusrsx}~{{|urz{wvx{}~}}zx}}zxy~{srz{wvvwxxz{|~w|ysv{plov|}zvtssuzyuz~}zxwutsssrpoquxwux}{{zxz|~~}|~wx~}|~xy|xwvvuuvvwx|xs{|tqw~sjglsxxurpqrv}{{~{xwvtsttttstx|}{|xty}xttvyz{z|yuy~~|yx{wtz}ywwxxyz{|}wxysvuopw~|ywwy}{vz}z{{xvutrrrrrqqswxutzy{zwwy{|||}x{{~{xvuutttuuw|urzyrr{}rjhlsxyvrqqsx~x|}}|zyxwwxxxxy{~|z{tt|~|wsrtwyzz}}vw|~|yx{ztv~~yvvvwwxyz{|}x~xx{rory~zwvw{|vx~{xx}ywutsrrrrqrtvvqov~xz{yz}z}|~{wvutttttuv{xtyxqr{}riehnuwuroorw{w|~~|zyxxxxxxz|~|vu~xsw}xtrsvxy|}yplotsnkiikllnpqrtz~uu|ytuxzytnjikqx|wpou{~~~xrqywnx}yzzx}|{zxtqpsx|~~~wuy{xroooopqrsstw}}x{vpr{ytrty|}zwttw}}xy~|wv|zx}~~}vy|ww~|y|}||}}}{z{~|xx|}zusrrrrssttuw}|wy}}xvx{~zxwz~z|zrqw}yuuvxvojmv~~|{zzz{|{yuqqw~{yy{{xtqpqstw}~|{{||}{z||smiilorqomlnsxxtopuy{|}~}vru|}yxz~yz}xvtrrv|{wuuvurruwupnmmnnopqrrtx~}yyz|~}zyz}}|}{xz|zvtw}}}{vnjnuz|zxwvvwxxxurpsy}|yxy{{yvsrrtuy~}}~}{z{~}vpmkmoqqpnnptwwspquy{{|}~}vsuz}{yx{zz}wtqprv||xuttsrsuwuronooppqrstvx|}zzzz{{||}|{z|zutvwuux~~}yrmmrxzzywvvwwxxwtrsx|}zxxz{zwtrqqsv||ywvwy~zuqnnoqrrqpqtwxurruxz{{|}~}xsrvyzyy|~||vqonpt{~{xutsstvwvtqppqqrrstuvx{}~{yyyyxxyz|~~xsrsttuy~ztooswzzyxwvvwwwvtrtx{{ywwyzywtrqqsw|}yvutux}{wsqpqrssrrsuwvtrsvxyzz{|}~~{vstwyyy{~~~ytpnnqv|~{xvtssuwwurqqqqrrsttuwy|}{zzz{zyyz{}zusssssuz~ytrsvyzyxwvvvwwvtsux{{zxxyz{ywussuw{}zwtstuy~|xussstttttvwvtstwyzz{||}~~|xvvxyxxy{~}yuqooqtx{~~{xvuuxyxusrrssttuvwxy{}|{z{||zyyyy{|~yvutrqprv{|xwxz{{zyxxwxxwvuvx{|{yyyzz{yxvttvxz||}}zvtsrsuy}}zxwwwwwwxxxvuuwxzz{{|||}}}|zxwwxwvvwy{}zvsqqrstvy~|yyz{{ywutttuuuvvwxz{{zyy{|{zyxxxyz|~~zwvtrpppsw}}|||}}|{zyxxxwvuvxz{zyxxyzzyxvuuvwyzz{~~{wussstvz~}{zzyyyyyxwuuwxyzzz{{{|||{zxxxxwvvvwy|~{xusrrstuw{}{{||{ywvuuuuvvvwxyz{zyyz{{zyxwwxyz|~|ywvtrpqruy~~~~}|{zyyxxwvvwyzzyyxxyyyyxvuuvwxyy{~~~|yvtsrsuw{~}|{{{{zzywvwxyyzzz{{{{{{{yxxwwvuuvxz|}|ywtrqqrtux|}|}}}{yxwwwwwwwxxyz{zyxyzzzywwvwxz{~|zwutrqpqsvz~~}}|{zzyxxwxyzzzyyxxyyxxvuuuvxyz{~~}|{ywurqqrtw{~}|||||{yxxxyzzzzz{{{{zzyxwwwvuvvx{}~|{zxusqpprtvx|~~~~|{yxxxxxxxxyyzzzyxxyyyxwvvwxz|~~|zxvtsqppqsw{~}}|{zzyxxxyzzzyyxxxxxxwvuvwxz{}~|zzywusrqqrux{~}}}}|{zyxyzzzzz{{{zzzyyxxxwwvwxz|~~}|zyxvtrppqrtvy}~}{zyyyyyyyyyzzzzyyyzzyyxwwxy{}~}|zxvusrppprtx|~}||{zzyyz{{{zzyyyyyyxwvvwxyy{}}{zyxwutrqpqsux{~}|{z{{{{{{{{{{{zzyyyxxwvvwxz|}|{zywvtrqppqrsvz~~}|{{{zzz{{{{{zzzzzzzyxwwwxy{|~~}|{ywvusrpoopruy|~}|{{{|||{zzzzzzyyxxwwwwwxy|~~|{zyxwusrqpqqsux|}}}}}||||||{{{zzyyyyxwvvwwy{}~}|{zywvtsrqqpqrtx|~}}|||{||||{zzzzzzyyxwwwwxyz|~}|zyxvutrqppprtwz~~}}||}||{{{zzzzyyyxxwwwwwxz|~}|{zyxwvtsrqqqrtvy}~~}}}}}||||{{zzzyyyxwvvvwxy{}~}|{zyxwutsrqqqqsvy}~}}||||||{{zzzzzzyxxwwwxxy{}~}|zyxwvusrqppqsux{~}}}}}||{{zzzzyyxxxwwwwxy{}~}|{zyxwvusrqqqrsuwz~~~~}}}|||{{zzyyyyxwvvvwxz|}~}|{zyxvutsrqqqqrtvz}~~}}}}|||{zzzzzyyxxwwwxyz{}~}|{zyxvutsrqpppqsux{~~~~}}||{{zzyyyxxxwwwwxy{}~~}|{zyxwvutsrqqqrsux{~~~}}}||{{zzyyyyxwwwwxyz|~~}|{zyxvutsrqqqqqrtwz~~~}}}||{{zzzzyyxxxwxxyz|~~~}|{zyxwutssrqppqrtvy|~~~}}|{{{zzyyyxxxxxxyz|~~~}}|{zywvvutsrqqqqrtvx{~~~}}||{{zzyyyxxwwxyz{}~~}}|{zxwvutsrrqqqqqsux{~~~~}}||{{{zzzyyxxxxyz{|~~~}}|{zyxwutssrqpppqrtwy|~~}|||{{zzyyyxxxxxy{|~~~}}||{yxwvuutsrqqpqqrtvy|~~}}|{{zzzyyxxwxxyz|}~~}|{zyxwvutsrrqqppqrtvx{~~}}||{{zzyyxxxxxyz{}~}}|{zzywvuttsrqpppqrsuwz}~}}||{{zzyyyxxxxyz{}~~}}|{zyxwwvutsrqqppqrsuwz}~}}||{{zzyxxxxxyy{|~~~}|{zyxwwvutsrqqppqqstwy|~~}||{{zzzyxxxxyyz{}~~{{}}zyz{{xtqpqtx|}zqgado}yw}siky~phddflv~~zz~unlsmiqx{{|}vqtrllnqqrsv~zmqxzx}wp{{iizjdcbbcefoytxjiwxwzgixuqqtsppzolnhu~}zzt{pyxux~ru}}}kurnzyprw{vzuw{yzfsdkxo|g]^kxpd\kqt{tt}wqq~wzn{wwzw}uirz}t}z{}~~{jzmmsovvxsfsnxy|qacfxwix~|}xtssooppkqa_kplyivqy}qlsusqjiprhmxkrrqxmhwvwpwrbixagxww_kwxsjjnz{}xzz{ysrslxojc_\qtnvtxu}~g|v|qnqt}nvp{br_|hg``eeokSixgkmswzco~}yk_~s~heko}`tgsirzvvm{nsuoZO]lua[[bilXpwtsZbYcoo_s{mw|ow{xszysyooZX|~~yuuu|wzx]VUZkg|zwb``jtsZdiSiudhtehxz|iz~`fzyutaVzp{x}~p}~lbTJJSfnumnxnzqj`tqTspj|xgm|{axs|tzu\p_o}lns{u~o}yyy~}xhc^bmgpsrl}~kkpmlya_xhp~bjzys{sp`|tlymq~qbq~p{rx~}w}u{vv{xxijcsmi~~n~mgjqdq]Z}lmtwirwiet|~_l~ut}~q}sXewpg{sy~xj|zvwvtmjfa\v}yvefsljcn^mo^fpkrvmbuwwnmyrvujqzXVqsluxv}v{zm|{~{qrdYfYty}xxmmj_Yj`mq_cscf{tkm|yyjxsisovosy]Xdmktw{xvzujZe\hwon~znujeWj[_xgekgbpypgwq}`suupqtvyorw`jvktxw|z||vh`ia]tpvyknrm`_fYnoeceVhwocrstqq}|v~lphmrqy{z{v{y}tpj^ePbjuxynrno[jYbyhdk_]vvo~z~osynsyejnpt|~}}y}~}y}xtzkjiabXOnd{tt{xkinYs~rlm_nzry~rk{uwqh{m^nuku}~z}yw{~xqwpkhc^gV_rqr{|mpjaztmlmar~rk~ht~wtwqshy{jlsroq{z{vwvvv~r~tpolek^qxzs}x~hqhc~obmjcoutl}yfzxqs{ymjwshksnpw{v|{}wwzw{|t~wpngekYzwzu}zvcugfvmfkhbpusmz~furm~wthfxtfbmprwyw}~|~yovopg`^jawy{vzrzesjcwmfje]p{ri}}}fr|~|qo~rjedurceotzy}~xesphd_]f_z|vzszgrf`zp`fcdtwrew{zbr~xy|rn|plek{shjv|~||}qcnkfb_ag[~ryxw`pckzlab_fsvnj{why~zusojq}ymoy~|~yu{kchbfc^]`e{{{{zsapbs{idkclx}rrvtu|omhw}sjqx}~|x~s|vz_`fdcbZ_\qxy}mqsg|mkkix~r{pw}~sxkgfyymks{}|}y|y{{zuytwoZddeb[\e`}jxkuvmlfpzwp}to~{z}uuoidnxulqtz|{yx|~xw}|t}txcgjegf`gcv|srqk|mjjguz}ny~ziv~y}ynwkdfyxnmrv{~u}{v|{{~w}v~qemigfddegz{kxgyrkherv|pq|}mpyzx{q{~mfcsxoinsyvv|z}|{{vywemiih`_dcumwiusjidpw}rk}~mkz{wzqv~mfcpumhnqttz~~}wyvxelkhec^b_ywwoumpxkhgnwxwiz~}qhv{|t{wn~sjekwsknruvz|ytzozlgmjgb]^]h{n~ynwk}ojijwv{mq~{xjsxzz~q|~pjjxztprv{z||xwxsstckhfe^X\]ymw{oypwwnmisy}{l|uoz~zztynhr}xopuyy}|{~vouluhaigd`ZXYfyh~t}pypmn}}urpu{|yv{rkiw|tmqtyw}|z|vyxpqjsadgeb^X]\qtq||zzvvqms}pvynx{xzr}nhjxxqnqtwxyw~}~tzrqnkqbiiffc\_a|v{x|wyupnw~|nx~voy{vz}pzkeiwxomqtwxz|v~~sssmpscjjjhd`bfvw|w{uqmx}}mx~}tnwxsxzpwjdivvomquxxy~ws~rsmmschiihd^cgwx{vxupmw~|mu}{sluxquzn|wicguvoosuy{{yr{ppkipaghgfc`dhyx{vyuomx|z~lu{yqktv}ouzm|xkdiwysswz}~}z~o}|lnehl_fffeb`dkwu{t|~spozz{}kv{ypnvw}qzyqxlgo{{vvx~}{||yl}{|hm`hi_eeffb`esuu}s|tqr{{n|~|qsx}{swvtjht}ytwz~~y~{ypmy}qfi^lb`feed`bg~w|}y|vs{~ut~ypxytur{~nijw{vtx{~~|x}{{zxitvzhjaaj^ceffc`enw}zzwwp{~|rsxyzo|wqujgpzytvx|}|x|w}v~nk}wzpgj]kdbggggbdiy~~yv}ts|{vpvvpu}o{|mfjw{usvy|}{|wy}y|wjx~yzhmahlbhiiiecgvt|zvz}znzzwptt{to}svohhszvrtvzyzx~}~z{kux|kmedncgiihdaeps|{wx~ny{ypsuyvm|usrhfpyvqstww~}z|y}nqw{mlh`nefiiheacity~~yxpuzysquu{lw{o~xlflwysrtwx{yyqk|yxuil^jjdhhhfa`dv|n|y}ypzyvpvt{qq~ryqjjv{xtuwzy|{||xwis}uxilcamdfhhgc^ak~mzz||qw|{ttwx{n{|r{niq{{vuwyy|}~wv{}ohywtrgk]ficghge`_ctzj~}r||ztxv|tpwxulku|yuvwzx~z~w}twilzrtjie[jedggfc_`g|sq}zt}|xtyv~our{rkmw|xvwxyy~zyxzt~tfmxosgib\kefhihfbdnrz~wu|{wuwu}mv~q}~oimx{wuvxyyzuzxt}qeqwpsgk``mfhjljgdhtruu{zutvt{kv}p||nimwzwvwyyz{wzyt}rfoworhkb^lgiklkifittvtzyusus}zjs|oz|nilvzxvxy{{{wyzs~|qenvmphja\kgiklkjgkvvvsxwsstq|xit{nz|ojmx|zyz||}|uzxs}zndoslofj]]kfhklkihlytssxwsttr}vixzp~|plq{~{{|~~~rzur||wjbopjlehZ_jfiklliiosrwyxtvsvrl}wsxomu}~{|}}~|{rzpu|yqcdrjjgfdWehgjllkilt|w~tzzwuxs{}lsrytmoy~}|}~~}{suvnwzvj`jpgjeh]Zigikmljio|tvw{zvwut~tk{yq{pms|}|||~|}|zpyorywobcpiiggeWejhkmmljmv|x~tyzwvwr{{ks~pyslpx~|yzy|v~~{gnlk{pfpqjmhk\_kgjlmljkssty{zxytw}ml|rswolpu~~|{vakqZ]b[`^cXUddfhjjhhn{o{y|}}~yxnlmt|qswtvwywvz}x}{sorgo{wkovkmlog^nppsttrrv}}xzy{rnssrtrozuiw{o{|ohkrx|loddr}vryneda`OYcacefecem{ujw}z~|}thdjqx}zyutz~vv{|xlnohqyztmvyoqpsgcstuwxwuuzx|}{~qnrsqsqpzsiyzo|znimuy|wfledrz{uuwnnliW^hfhiigegn{uhu~~zy{wuiejrx~}{wux~~wt~xxolrinxzunt|qrrvncrwwyzzxvz}~}z{~zynrssssnvxks~qv~tllsz}~hhjcmx}yt{~qpnobZhkjllkiimx~kuyy~}|t~ty{nfgpx}zvv{|tyx~~y{iooiszzsnxyortwjgwyz|}|zzx|xwz|}vnrsstrnxvjv|ox|rlow~wchkfr}ys|{opoqb\kmnppommr|myyy||}zrzpuxmgjt|zwvz~{uxy|xzhmrlt{{tmvyoruznhx|~~}z~yuv{}}xortturnwvju{ow|snr{~|qaimkwxs|ynpqrc`nqqssrppvm~xz}{|}|xzo{zltvmjp||yww{}yt|w{z~sgqqox}yqoyvotxzjm|~w{~zuuxzsqsttuoqzpl{uo{yrqx~|wfdpmr}|ux~sorvn_jttvvusrv~tru~}zz}}~~w}~pu|nowpkoz}zwvz}{uxyzx}whntnu{zsoxypsy}pl{v|y~ytsv||vqtuuvppyrlzwnz{trw}{wgcomp{|vzurvzrcmvwxxwutwsqt|{xx{}~}v}|ov{mqwplpy~{xx{}zu{x}~z}tgqrnu{yrq{yqv|~no~twx~{vrpsz}usuvvuosyoq}sq}yssy~|rbhnjqz|ywuw|~nhuzzzywuv{}k}vu}|xvvz}xxvr}umwvnlr{~{yz}|wx~mowopx{us|vxyo}~z~s|v}ztqqvseu{mcbppiwynw|vru|~~|w~zjaljhqxzx~|u{qjv}g^zyjox{xtqprwv{x|uxtr{wppv~vioznuuptvwxobhngkqrnnyypt|rlz~}{z~v}v}~zurrwnjvukpibnndntnknty|}}{yz{{wxqitspx~~zy}wqnqy}n}hhorpmjhjo~~|yz~yyyt~}ww|yurnkrxvwvvoackeekmjirxopyvit|||||~|~vz|wutx{u~wovz|{nrwjkurmmrw{}~|}|zxwxzxwxkqxsv}~zmuwtrsuzx~zmqttqljjmu|~y~z~u|sw|xz|vrponp~zzyywlaimfinnjlvums|pkw}}}~w~uz~}zwuvzuvyu}x|xntuinvroqvz~|}}zxvuwyxywlu{vy~}tirutux|vymqutqmkkox||~|~x~}t{~rw~{~}wrnnprvzyyyxncjpjkookkuvmq{riu|~vtx|}{xvx}}sv|w{xnuvjowurty}|}|ywutvyz|vnx}x|}~y|ofpuwzuxnruuqnlmq|{y~{w~zt}|rz~~xsnmosv}zzzzwkeopkmpnjnwrlt~}mkx~uyty||zxwzxr~zx|tqyqkuxutw|}{|ywtstxz{|qs~|y~}{{wxgkux{|zqptvtpmmow||{{~v{}vztv~xsomorv{}{||zpfnsmlonkluulq|qjv~t}sw{|zxwy~zr|}zytzuluzwvx|}{~|yvtstwyz}qr~|x|}{yzvzhlvy|~}sruvtqnmowz{z{~~~w|~w|tw~xsonoruz~~~{ogqslmomjnvsltolx~uztx{{yvvx~ws~~~zy~spy{xwy|~{z~{xvtstvwyxow~xwzzxzwzsjsyz|{tuxwtpmmq|v~x{~zz|zzt~|wspopqt~vjnuplmmjktvmp|wkt}wuvz{zwtux}tx~y}}}rw}{xy{}~}{y|}zwuttuuvzsq{{uvxwv|{v~onx{{|~|vxzwtpnntyv{y{z~z~|~wv{vspppqtukrvolmljmvtmrtlw~vuvz{yvttx|tz}z}{z|}||{wux}|xtqmkjkouxxws|~uuvtqmklr~xs}|wpx}{yt}{qecuywmqzupqqnowyqr}qv}}~zwtwywurrv~lft}{uqw{vyzooxzxwy|}~}zwx}|xurnlknt~~wtttsypy|ljlmkhedgp|ymq{{umt~zz}zpgbbjv|zz{wmgptnklkjnwtmsrjs{yxx{}|yxy}{rjeq~w{{uxuknvwuuxz{{zwuw{{xsoljkou{z{|obit}y~mkmmkheehq|ymqz|yuqz}zz~|skebdku{||xohpvpmmlknvumq}sir~xxwz||zxy}|tpmmzx||wywlowywxy{||{xvw{{wrnlknsz{}tv~{iamzw{mlnnliggku~wms}z{yut{yz}umgdejs~~|}|wmkuwpmmllqwrlt}nkxxvw{|{yxz}}~wrqpu{z~{y{sltzzyy{|}|zwvy{xtpmlnry~{~{{uqx}qchw{|smnonkihjq||oo{y}}zxu|}x~{|}vnheejr|~~~zqksxrnmlkovtlp}rkuwwvz{{ywx|{|~ytrqs}{~{}vnsz{zz{}}|zwvx{yuqnmnrx}z}}|yytow}sdhw}~vooqomjikr}{oo|y~}{xt|}yz|~|uniffjqzzpmvyrnmllqwrltplxxwwz{ywvx}y}~ytqns~~tpw||{{|}}{yvvz{xtqnnorw|~y|{ywz{qs}}mdmz}tqrrpmjjnx~umu}{}zttz|~x~ztnifgjqy~vnszvpnlknvvnp}wlr}xzvxzzwvuyy|}~xsnlw|ru|~|||}}|zxvx|{xtqonorw|yz}zxww|vqxyigr{uttspmklr|}qny{}}xruz~{y~}~ysmighkpx~uov{uonllpwunsvmu~xyvxzywuuyw|}~xsnlx~tw~}}}}}|zwvx|{xtqooprv{yy}ywuv{~upwzkhr{wuvurolms|~snx||~ysuz}|x}|}~ysnjhhkpwxpu|xqnmlovvop}znr}y}vwyywutw~ww{}zupmtwu}zwwyvsqqqrsuv{yzx}yt{}wvvw||{~yp|xtvxxurqs{}st~|}}}~zsxvrpooqvwvttttuvwy~{xzyy{|xx~xkcryljmopnmmqzznp{|yrrxxsomotvtsrrstuvx}}wxyyv|{{||mnytjwrnprrqoorzylm|~~xifp|ytqquvusrrrsuwy~y}}z}{zzyztiouju}ojlnomllow|ujm~~uijw~xuuyzxutsttuvx|yuyyw{yxx}|tx~ohsypspqsrpnnry}tjqyx~{wmdix|wtuxyvtsstuvxz|z{{{yxy~zsx|mkxpl}ymkmonmlmqyzoit|~~yngq|xvx{zxvuuuuvwy~uw}|v{|xwvy~~urzujnrwyqprsqonpv|xll|yuy}zwpefszvvyzyvuttuvwy~~y~|z|yww{{su~~qjutlz~pkmoomllpwzqiq{{~zogo}zwy|{ywuuuvvwyvv{|vz|xvux}}trzvjn}syzrqssqooqv|xlm|~wty}zwpefr|xx{{ywuuuvvwz}x}{zzwvw|yrw}okvtp|olnonmlmryynit}y}~xlgp}{{}~|ywvvvvwx|{tvzyv}yutuy~yru~~qiq|uvqrssqopt{}sjr~ytv}}zvjciu~}{|~|ywvvvvwy|xx|~y|xvvz}uvvkoz}q{unnoonllpw|ujm{~yy}shjs}~~|yxwwvwwzwsuz}vx{vtsv{}vrz|nkuz{urstrppqw}{plv|wsx~~{thdkt}}}zxwvvwwy~~wx{}zzwuuzzswtkp{}tuooponlmqx{sjn|}xy}rhjs|~{yxwwwxzwsuy}wx{vsruz|ury|okt{{wsstsqpqw}|qlu~{vrv|}{uicis{|yxwwwxy}wwy~z{wttx}{tt~xlnyu|zqoppommpv{wlkx}wu{}ujhpy}zyxxxxy~{ttwyv}~xtrrw{xqs}tkp{y}usttrppsz}wmo|~|xrqw|{wodenx|zyxxxx{|vw|{zyustx|wpt~~rlr~}uxqpppomnqx{sjn|~zut{~zqhis~}{zyxxxz~zsuy~wv}}vrpquyunq{|rlsx}usttrppsy|vlp~|zvpotyxumdfq}}{zyyxy{}wy~zyytrrvyunqz}smt|tzqpppommpvzsko~~|xrqw|{xphkw~{zyyxxz~ytw|}vv}|uqoptwrlpz{qnx~y|uttsqppsy{tms}{xsmmtxwskejw}{zyyyy|{x{~xy}vrpquwqlr{zqp{xwwqpqpnmnrxxplv}ytorx{yuliq~}{zzyxy|vuzyty~xronqutmlu|wotywtttrpprw{xop}~{xtmkpvwuofhs|{zzyy{~xzyx~~wrpptwrloy|tpx{vzrqqpnmnqwyrls~|ysnpw{zvmho|~|{zyxy|wtxytxxrnnputmlu|woszyuutsqprx|xop}~zxsmkqwwunfgr~}|{zyz||wx~xx}vqoptvqlr{{royzzysrrqonotyxplv}{wqnry{ztjhp|}|{zy{|ttx~wu{|upnnrvrlpy{snu|wuutrqrv{|smt|yuoknvyxricju~}|{{z|wux{x}ysppswunpy}unr}zvssrqoosx{tlo||ysnpw||xogis}~|{z{}xrty{vxysonpuuomt|yonw~}wvvtsrty}zqnx{xsnlqxzwpfcku~~}|{{}~utxzywrpptwsnr{|sms}|wttsqpptz{slp}~{xrnpw||wnfir|}|{{~xrsy{vx~zsomptupmt|ypnvxwvusrty}{rnw{xsnkpwzxrgcis|~}|{}wtw{x}ysposwuopx}vnq{|zutsrppsx{wnny{xsnmtz|yqhgoy~}{{}|trv}wv{}vpmnrurmoy{tnr}~{xwvtrsv{}woq}}yupkkrxyvmeeoy~}{|~|uuz~xx~}vqnosuqmqz{sou|xutsqpqty{tmq}~zvqlmtz{xogis}~|{{}{tsx|vu{{tnlmqspkox{tpv}{wvusrruz|vos|xsnijpwxvnfhr|~|{{}}vv{}ww|}vpmmqtqlox{uqw{ytsrqopsxzunr}xtojkry{xpikv~|{{}{tuzztu{~zsmklprnjoy{urz~zvutrqrv{|upu~zvqlgjqwxumgkv}|{{~{vx~zuw}zsnlmqrnkqz{ut}|}wtsrpoquzysoxzvqlimuzzumjq|~}{z{wtx|vsw}|vokjmqpklu{xsv}~xvusqqty|yrr}~|wrmhgnuywpiis~~}{{}~ww||vv{{tnllprokox|vsz~|yusrpoqtyztpv{vqlhltz{vnjoz}|{|xtv~}vsw||vokjmqpllt{xsv}xvusrruz|yrs}~|wrlhhovywphir}}||~|vv{{vw|zsnlmqrnlqz{tsz}yutsqprw{yrpxzupjiow{ztkhpz~||~}usw{uuz~{tnklprokoxztqw|xwutstx||upvzupjhltyysjeku~}}~wsv~xw{~wqmmqtqmow{vpt~~}xvusrrvz|vpr}}xsmilsz|xngir|~}~yrsyyux}~yrmlnrrnmszxqqy|ywvttv{~{sqyytniiowzxqgeku~~~~usw}xx}}vpmnrtqmqyztpt~}xwutrtw||ups}|wrmilt{|wngiq{~~yrryyux}~yrmlnrrnmszxrqx}yxvutv{~{tqxztoihnvzyriejt|~vru}~xw{~xqnmqtrnow{vps{~zwvtssv{}xqqz~ysnijqy|yqignx~~}tru{vv{~|uollprplowzupt~{xwutux|}xrt}|vqkgiqxzwoggoy~~|tsx{vw||uolmqspmqyztqv~yvusrtw{|vqt~|wqlhjry|xpiir|}~|trwytuz}zsnkloqolpxzurwzwvtstx|}xru{upjfhpx{xpiiq{}}~vtyzuuz~{uoklorolpx{wtx~~xvtrqsv{|wru~{upjgiqy|yqklt~~}}|tty~xsty|yrljkoqnlqy{vu{~yvusrtx||wsw~ysnheiqy{wojlv~}}{uu|~wtv{}yrlklpqnmrz{vv}~{wusqqtx|{usy~xrmhglu{|wokpz}|~xtv~ztsv{{uojjmpolnu{yux~zwutrsv{}ztu}}|uojegnw{zskkr|~}}~vuyytuy}zsnkloqompz~~yusoosy}{tnow|}|}}sicfszqlq~oqy}zwxxsmkr|nbcpywl`\gwysysmlmpuyz~zytsnb]Z\ckoqvyni||zuttw~tsq~zyurrtqcYo{~z}vwz{nnpohn~ozwt{y~wxvoctwuyv}}ovqwzoqtzrfeq~wymn{~yeopkwb]czzzxvyxt|~uq|xwnoXWVgxojdhngtqxy}z}{zwwlukb[^tx~xtr~~{o|vekepwyx|}yzr~yqqkz}|}t}|zowufvuzynujpwptiprmkoeo}q{}~vxwwrv~qkl^bqfo}mnohpxxzt}~v~~}}spyihtejvsz|rux{oz|o{{zwlwwo}t|t{w{}~|vz~x~y}}itwjz~{}txtk{xn{qzpknjiyuszx}~xvuxryunwromfongwpakdeqw~|}~~zxzyipkWdjm{z~wv|qmynysyvpyvwpt||moxr|w~pvvnw|og}uwxs}vs}ngqhlnopvt{yp|zwns|{stppqnk~ymvnlur}yuuwu|u~||w~{~~{xkuucipo}y|sv|wsm{rtxvvu{}{vxut~uytu{}|xmxwo|yvxwzzys}ovsoukqrnl|wx~xxyilslsw}sptmcjpfw}hklpy}q{{}}w|vjbi]cwoo{{y}{w{rzymvvtvsyy}u~x}vppxuy~~ysx|x~sxuz}vv{umqsgx|ghfhvsp~|xskwtyyz|~sqjvtknzzgv}}z|z|w}t{{ysvnyzohutrufttwz|}z}v}rw|puyvpvvtyut}z~xwysxr{{|qqsi~ssnq~xqz|qg{{w{tty}{}vqsdo}lilrxvqnzqrsqztnxv{~}z~w~zuwusxqjridjj{}x~y}wpvnozlnhvzuu~w|vx~|~w|}}ny|}}x~wsz}xt{znsnvukonrxw~wxr}|v{|il}xxusxpyt|wz|puv}{uvuov{z|z~zwwuqvjqions}yuruszxvu}{xx{tzy|w|v~xzo{{fdbrrxwfkjs|}po}vetuuhpvvw{vt|y}rpyuzwz~vur{u|}}xxyocrxrmw||put{}xwzuknt`ffc`zt}|t|uro{}xov||z}{yzmun~qryy~u~q{r|{{szyt~olspmt|sdn{ywxz|mmvzobdy}vgiwwnywnx{tsxs{wxz|xp}w}sunhvurklw{u}{~}rnopkw~yr}ylv}q|zqwknqptsuv~lwqpwot{zysw~||}~w}q|gcdavxy}{sxswrtq{xvqxyzw{}sy|{uw{wz}sueku{s|}}|}mrlqsnkrrz||wszz{}~z{tisnu{vvqyxztzw~sov|twtux~}yztvkljruvwvz~w~stx~yu~xw~t{y}utzm}}~w||xwsy{qvbryx|oz|}wssuxxnn|vyy}t}{u~~suteolm}nw{{|~}uwwwswx{yvu{zwp~~wzv{z}x}{tnokqrrvu}yuvv~qvnsyv{zv}s~~z{qxtx{v~{kj}zwsp{||~{rul}mmrtq}tv~{z}~t|}uyxopmi{rru~}~|~v{yxz}y}}q{vumw~tvs{~z}~z{yrnoprotst|~|vswszqvz}y{x~st{~z}twvt}u||jlyumlyvx{|vtts{pmwvvs~w{~tx{zlojk}lkm{|~~zzywyy{yuw|}up}wqso{}~x{~urqvrsout{ovyz{zt{{wxwu{yrvw~}}|{uw~ws}xzl{xrmqxorxwwrqor~{p}xq{w}xw|rqmi}thgq}v}~|z~|~~}v~{qwxpnmv{ux|x||vtszwvqrsynpy~{~wx}z|ux||suxzx~~}{xvt||m{zunothin|yyxyttor}vwp~{~{|y{|vrpk~vffnunuz}w{q{vpqjwtpuw{zwxxyswxymnx{qx~|}x|zwuv~yuv{ywy||y{vv{{r~urttfgnvppu}{ysq{}yrv}zw{x~xv}|vuqrrjhtumu{q}y{x{rnlyrow}{ytpu~~zgfq|vxwnknryr{ypljrnq{upt~qy{v{ysyyztw}vv{wleuy}vxwqlyytolqpqzzwnuvrkhhumkvnnyu~v}~~{}}zf|gipzto|zzsr||rprytgymvyjm~zwvumq}{opzmz||zuvtv|wyq}vwqfmt}wn~v~}}~}x~tsmwsnq}{~yynoiifcsvos{wyzvz}wvy}~zrnrrym~|vv{}~wzyi{}mnlqtljq|{~~wxq~{{~u|{{~~|}tz}rzwvtnkytcqpcrpo}{~yt~~x{ov}mu{vr}~~xmyqwvy{rfvzpw~~zy|r|onmkv{||}~~{~x{zzwju|er|nupit|t~z}}~zw}xsxq|w}yy|}z|~pnwnnruyzmvlw}vwv|uuyv|xsvmy{y||vwkvqo{rvpmsznx~vw~{~}vzwqyz}}xuz~~zywytttxzlpubdkhuux}uy~{}u|w~to~y{|xzywquxsvrjinfqvz}|~trzuqyzy}x~z~{w{z{sys}yyzhwvyxqptsyw|}xo|vp|sxo{{t{xrxzotvyv{pyygpyrwq}x{w|z}}vwu|qr{qy~|svvn}osnlwtjryq}tl~~zxxu~{oown}zs}vy~uxvszkesmnnrx}z}z~|yz}~n}uy~~y~yy|zpzwnfkanmhon}~v~{|{z|~|t|t}z}{ww{x{x~mxywpmtqqumz{py~sw~prn~}uttzw|w|zy{z}t|wnwtuskwurozs{||}{}u}|pwsx{{~}v~su{oolzzqm|z{vdsz~|{v{upvmozsupw~|zuzt{wmrorqqtotp|xsyr|}zt}zs|yxyr~|ukrlk}tdicqwsr|{~}zsxs}~~v}{zz}v~su|tpwviolsuiptv}z~|xtupz|utt||~}~y{z|qtzy}lprpjjniswxz|zwuyu}v|y~~~}|}}svqotysy{qgz{w{srrty~{}{uxmwvmmn{}z{pzsnnjrlrmhqv~}s}zyt}rutvr|}|ywxwshquw{r}y_n{}rrpnwvqecu`q~|l}akyuxss|{znwwyvlzkf{yrqipsytovzxzzjqw{xsyxuqbvmheqpuq{xiupvnijtm{{xvtw{trlpr|rvtzwhpsynr||oiOkk{zfmqpsojpjrX^fnziaioiwyv}w}t|sfmbjlqut|{z~~tqrt{yw_iZfyxs`kmfmbhUgk^qlqvxbiu|~us|quw{k|dhontr{}zztq~tsg]ohh{w`fxgecnhonWnsmxvekz|ivt|ltry}vi|e_txuo}|rzikg^n]k}}tkx{e`iqdsc`qmiopbs}pmwzmxsz}}vk}pZbr||}x}u}||}refdck^r|{zotdiim\l\ewgeohfr~qr{{hzswvyzot|h[n}x}~}uz~u}~}}hfk\gil}trzghln`ai[lqiisemzvmz{spz~}uxwzzixwhix{u}}~v~yz|t~znleZljxlxufljo]pebwidnlbo~rp|v~|m~xtu~pjztfs{y|w~{}}xyturmg]fhjyvnnonben[lsghk[gvzpx{yoqvo~~uhywhftwy{|x|}t~r}whf__n`w}~uvlmon_oYcskij``w|orxi~|rxwsgt~lcpux{~s}}}t~o~vjgb^f_q|}~hpmrco`^xncibcv}pl~{h~}tzuuir|qeowv{~}w}y|~rvzokh_h]f|xmsrwckg_xrcdgar{tl{gw|yrxtnmvejstt|}z}z{~zs{pmia_b^yrwvyxnbr_pyfdg`hvxmv~ynn}u}|rphv{ogqprv}|{y}{kvvmkc[bYpxvv~xxeohdxocge_pxum|}~i{|wsvshj{tjmqqu|~{|~zx}ukvqng_^c\zp}{|ysdt_lyjde`gv{qrzrl}}}rytpes~rhopuy~||||}}~kqvmjc]d]fypy~y{ljp`vxhfg^nxykv}jo{r|rlfy{lgpsw{|}~z~|jrqjfc^d\n{txzjnka{uheebryvjx~ht~|tynji{ykkrtxz|}~}~{||~}grnje`\b\uz|y{gmke}tfecevyxj|{gw||sxogiywkktuy|z}{~}}||y{elkgea[c^x|{|gmlf~vhgfduyxmz~|jw~~|q~yoifvwlltx{z||~}yyvybhjgca\dc{~z}inme~viheeuy{my{jw~~{q~ymggwynnvx}y{|}~}}xutu`jifd`]fe}}gqjivjidixyzl{~xjx~z}ypwmehxvmox{w~z~~zxxqto_igdc`^gh~}gtfrsjhcoz|ul~}qmzz|utqjemztlsx}||zyrvlvebiedb_dft}}tjrf}oigfwx~or~}kr|{z}q{|mheuzqnwz~yz}z~{rqms`fgedb^gfirkoxlifo{{yl{}}tly~y|ystlejyvnsxz~{{zupujugbifec^adtzvltiqkiiyy~os|zkt{{y|q{|mhftxqovw}yy~vurnop_hgfd`^dg{kvkxwmkhvz}wm}}}ooz~~w}suqjepysosvz}{x}w{zqpksbghgd`\ac~z~nwot{olit|}zl{|}rmx|w|xsukemyumqtw{y{zwosiuffjgea\_`w|uvutqrnjp}{~mu~}vlwzxy|qzmgiwwonsuy{{|ysqtipmcjhfc^\_ipqznxoll|{un}|{nry{t~twqjfsysnrswx|x~uzxqojtdhigeaZ^`zuwvyuwtplv~|mw}|tmwzuy|qylgjwxpostxz||x~rorhnmbihgd^[^hot}r|roo}|ym{|zorx}|s}vusjfpyuoqswy~~y|}}vs|mpergeigfc\]`s{pw{tyros{sq}{xntxxt~rzoigtzsnrsxy{w}}suummeqefhgfb\_bzyu}zzwyspx{pr}{vnvwuu}q}}mhhuyspstz{{w~~~ox}qmheobfggeb\`e~w{||yyxsqz|os|{unvwsu}p||mgivysqtv{|{w}~|nu{okhbnbeggfc_bg||}{zyztrz|qs|zvnuwss}p{}mghuzurux}}{w|~y}mqy~oig_mcdgggeadj|~|{y{us{|qr|zuouvqr}p{|mgiv{vtvy~~{w||zzksx}kjd`laeghhebfn||~z}zus~}ot{zsouvou{n}zlgkx{vux{}~x{}z{viu~vzhj`akaegiifchtz{xyuvnwzyqruwzlxxpujgozzuvx}~y{x~v~oi{xxsei[gfbghiieekx}yyv{|xozyvott{sn|qvpiit|yuxz{xy|uxin|txjgc\kcdhiihdhp~|}xwpuzysquu|lvzo~xkgmy{vvx|{{w~v{}ngywurei[fhcgijieek~w|zx~}yozyvpus|qo}qwpiiu|xuwy~}|x{zzutgq{swgi`_kbfhiifchtw}}z|owzxqttxvl{vrukhqzzvwx||}yx|twhm{rvkhd\keehiigcfow}{{qv{yssuvzkxypxlhoyzuuvz{~z~v}t|yjjzstnhg[igehiigbdkzu}|vs{zusvt~mt~p|}oilw{wuvy{{{w|wv}ofuwrsgk]ckdhijhdbgwo}qz{ysvtysm}utuljszyuvwzy~z}x|s~ugmzqtkjd\kggijifbensx~vt{zutvt}lv}p}}ojnx{wuvxzz|v|wv|netvprgk]akehjjhechwn~rx{ytvtwul|wrwmjrzzvvwzy~~|u|syvhhwqqmihZhifijjhdel~zq~rz{xtwt{po~swslku{yvwx{y~{{v{qz}sejwnpjidZiigjkjhegpwv{szzwuvs|~mq~qyrkmv{ywxy{z{wwyq{{odlumohja[khhjlkhfjtt{zszyvuvr||lr~pyrlnw|zyy{|{{wvypy}yncjtkmhiaYjhhkmljhlvx{{syyvtvr{}lp}pxslnw|{zz|}|~zwtyov{xmbhrjkhibXhjilnnljnxz{|syyvuuqz|kq}pxsmox}|{{}~}ztuwnwzvk`jqhkfi_Zjijmonlkp|xxtyyuutq{yit|oz~rmqy}||}~~|qvtnwyth`kogjfj\\kiknpommtvuuyxuvsr}tixxo~{pms{}||}~~}~}pxopxwobaojghggWcljmopompxwswywuvqv|mm}rtwoow}}}}~}~{trwmswtj_fofhfiaXikknppons~yyuyyvvtq|wiuzo|}rnrz~|||~}oxpnvunbaniehhhXblkmpponpyutxywvvqw|ln}quvopw}}|}}~}|qtulsvrg_inehgj^Zkkloponnttwvyxvwrs}qk{vqzqou{}|||}{}urwmqvsi_foeggkbXillnponmr}t}{vzzxxtr|vjyyo}|rosz|{{{|{xpxooutkadogehkfXemlnoomlpyvuvzzyxvqzzkt}pyupry||{{|{{pwslsuodalkdhmqel|{z{zvsqw|kx{{}|zysvts}{{y~szypv~}vtxmnspg`hn`]aroaknnqrqonqzowvuslqrrrplwuiu|p{vqrx{{zzzxv{y}{{vpvjWVcxpklc_```_bjvsc|u~}{}}}}wyyu}xssr}{snzzqsx{~slulkpof\^f\[eqshszwwwvtsv|xy{jjkkjjekqehvln{unntxywvtrnu{}{{|vi[\^TXfwwp|~wsojecgpvfixr|~}yxytmhpw~zyywzr{}z}~|losiknj`X`d\bmxqjy|zzzyww|x}~pponmjfnpdmvkr|vqqwzzywtqpy|}trrk]SX]Wbqzq~{xtpljnvzhozt|}}yyzupkiuyxyv{rz}y|}|lmshhkh^W^e`fs}vkx~~~~}{{}}pooonkfnqfmwmr}xrsx{zyvtrr}xz{nmkdWPY`^jz|s}zwspos{|iuzv{~|yx}~{vqmjn|w{vyxt~|z}~wippgijd[Xcfcnzso}~zw{ypqqpoiisnhutly|vsuy{ywutrx~t{rije\QUaafvv{|xtrt{rkt{}}|~}y~{}}~~{wrnklxzz{v}t|~z|~{kmrhgif]Xaidkxyo|{wx~sssrqlisqitvmw~xtuy{zxutqv}szsihe\SUaaduy}|xuw}rktx}|{}{}~y{~~|}}zvqmkkw|~|y|u~z|~xjorhhie]Zdhclzwrxtxvuutslmunlxtn{}wuwz{ywurpwvvzoiicZT[a]fwyzy|}jtzrz}zyzz}~{zz{~~~}yuplhmx}zx{||~}olumhjha[aibdr}q|z|xv|~|}zyxwqlsultyou~{vvy{{ywtpqz~szwljhaXW`_\i{z~}}vits{}zxxzxy|}}|~~~|xtokhowz|y}}zlnulijg`]ehafuzrv}~}uu}||}|{yrnvunvyov{wwz{{yvspqy|~}rywljhaXXa_\izz}xjury~~|xvvxw~y{~|z~}}{xtpkhmvy~~{~}|omuohjhb]cjcdr~s}zy}~{z|wqy~z~}{votyqs|rr~~ywy{{zwuqpw}}stynhgb[W^c]duzosru{~}yvuv{xw}x{z|~{{zxuqmijsz~|~}wkpukhie__hjdjz|vv{zwvzppz~~~~}{uovxqw{qt~}yxz{zywtqrz}vnke\Zce`jz|pvxisxtst{wwsnwqnorssqnkikv}|~uyylpvniie_^gkek|zky|mgegkwvggt~}~|||ztmppit||{z{||zxvtv|us_`bXTTRNP\a_j}{}jsvp|}xuv|vzssnlzoihgedcaagt{}{xtzz{{pvwnkkhdhstp{kvvw{phejri]et{x~{yxwrigooq{~}{{ut{{ynpgZWTOMU`^aqw}mhtw}yw{|x{rgippzyuqmjgedfpy|y~zsz~|tvzrlljghrwrx{fn{v{soqyrcft|y{}zzxtlhorr~{~}|z~}st{{}twob\YTRYb`aqw|nitu}yx{|x~ypfiooy}xtpmjgehqxz}zzu|~|uy|snmkhkuvqyudrur}|vrv|qdjx}x|}{{ytkkrqs~{}{z}{rwzx}|{|pea\WW_c^dv|uzirzou}zzx|}wlgmmn{~}xtplhgltvxz}}x{{{zyzqomjjrwqs~ij~xkp|}yz|kit}yv}}|yqkqspx}x|z|~wtzxu{}~phd^Z]db^j{uvsi|snu~|{}x|tjjnlozy}{wrnjiouvwy{~}~y~{{z}zsqnkluvpt~yfm~uiny~|~}lmxzw~}}yqmstry|w}{}}~vtzwuz~tlhb]agd`k{uutj|uns|}{}x~{tihnmoxyzzvqmkpvwwxz}~}y}}{{|~urplmtxrs~|hg{ykku}~rmw~x~}}zsmpusw}x{||z{wrwyvx{pkfaahicgw|s||kqqqy~||zz~|zuleinmu|y~zuqnouyyyz|~|{y}~z{tqompxxrw}sbk~vlp{}{~oo{~{||{xpkqvu|z~|~~vwspwzy|}yojfbdklfk{}u~yjrtu|}{{z{zxuqhchoqz}~zwsqrx||||}~z|zxy}{tqompyztw}~qai~|ru~|z}po|}{zyvokqxy|}zrsppy}}|wnjfdgnnio~wviuvx~|z{y|}vtqmebkrv}zwtsu{~~}}~~~~}x{xzyytqoot{yt|}yi`q{uz}zzzou}zyxslmvz}|~~|~rpqnt}}~tnjggnrmlyyz}mm{w|}{z}xvsqmgagqv}}zwuu{~}}~~~~~xzyyz~}urporz{tx|~zm`l~uw|{rt~|vmluxzx}{yy|~}|usuu{}rfdtws{{sw}no~x{~}yvv|yqx{romkeaisyrhszpnpruvwxy{uxxz{xuplo{~{ldux{lit}zus{{sqqqmhkux|}y}xuz~}}uuvvzoebku{qt}~~|odp}qpuy{ywvw~zmp|xvupjku{ypjmyyusrqrw~{qqssy~}y|vqmjkt{zxjqzx~|ieq~zzupoolgemsuzztw|yvu{}xzy|ulebhqtxxiexvmnswxvuuxtlu{xxupkoy|{uolo{|zxx~{rsst|}|~|w}~upljmvywvjuwv{~~xhgtxrqqmggouvzyrw|yvuz}xzy}tmfdiqswyjfxxnnrvvuttxuls}yxvqlox}}|vpmpy|zz~tstu||~|wzvpmjltyw|zlp{uy~|{}{kfq~}usrpjgmuwz{ts}|yvux~xyy{vmgdgpvw~rfosnptvutstz{nm{zxwtomt|}|wrppv~|z|{stux~yu|{rmjjox{yukwzwz~~{xx{}tghw|utsojipxz}{tu~|zxvw|~}xyz}}|piedkv||~rgruoruvurqsx~xln}yxwtonv~}}|xurru|~|{||ttuyytzzqlijq{|vlv}xz}}{wtsvysgj{}vtspkjry|~|tt}|{yxxz~}}xyz~y}wlfdfp|~qhuupruusqprw|vlq~ywwtopy{||xutsuz~|{~ztuv|}vtz}vnjilu}rn~{xz{zvspquwnhr{vusokmw|~yrw|{yyyz}~}|~{xz|xx}zphefmyxkn|rqstsqoptzyom{{xxuqou|x|xvttvz~}vvwz~wrx}xpkiks}}umz|vwyxurootwqho}z~}|tknw|}}~~~~}|{}~}|zvrr|wsux}x{zwwx~||~znq~tsvxyxxyxt~xvurlipy}xx~tz|sqsx|uuw|zx~wtrswztmw||ok|{y|zx|zts{xutspmq{ztz|xw{}||{z{~zy|qhkwvs|zqu~tmyyssutrompz~~~}zvyvuxyz|wwyxvuttuvvx{{xy|}{xsr|}xwyz{}qvqedjs|roy~y|~z~|zxtnmsyz|{w}|rnlow}|yqlkmrvspy}zxkl|||zxwy~~y~skhffkxyrv|~~}|{{zxwx|~}|||{zz||~}xuw||zy}~zvtw|vmmnpoopu}w{v|{jnx~}vwxrnlnt|~~~xy|z{zvqs|{vttw}}x~px{qoquvvvy~~v{zv{ummrqklsx{zsou~~||}|}{vsw~|slgegnst{|wvz}wmrzqpsuuuux~yytt|~xnjottrpoptz{wurpnnpuywtx{}wtzvhb`_^_dn{{y{||upryysoquvtsz{qq{}z|{sqrtsv~~unkkosqlp|yrt|}{|voyzvy~~wsuxwtszzw{~}{ywvutrqswzywvutrpoosz}yux|}wtv}vomkiffjqvsklx~z}~vpqwxtty~}|{{uoigjt~yupihnusmihjpuupr|zpqxx|z|~|y}}z}}ukhouxxxxxwvtstwyxwwyzzxwx}|xx{~|x~wwmjkjihimtxrjlx|vz~}~{|{{ztomov~zvpjjquqljlqy~|x}~wz|ywutsrqt|~tnsyzy{{|}rijqvz|~~|{}~|zyxvtuz~|{xy~ytw{||~y{~qllopqruz~ur{}ww~|{{xspt|}~|xuqnlnu{urx}{uqoqv{{vywx}~~tq~|||~~uorxzxy}}sry}~~~}|{z|~zwurnkjnv}y|{yy|~|ysvyz{~{trrqopsy~}ur{}|yrloy}xu{~zvtrpqu}ysry~zsomnruqlpz~wrxzw}vuvwwwyzzw|~{stz~~}zxwtrppty|}}~~|zxx{|{}~yx~~yvx}~|ytrpmkkmsupjo}zvy~yvwxwuy|tv~}zvssw}vnimturoosyzzxv{yt}xttuuux}}wx~{y{~~}znlry~}{|~}zwvtsqqsy|xz~}z~~}{}x{}vuvwvvx|wrx}|ztsz~{vtuust{~z~~{wsqptz~{wyzw{|uomnrwvru|tu{~~~wv{{{zz|wprwwsquz}zw{}{zyxvuw{|{xvusqppsz~|{}{{}|zrty|}~{wuspoqv{{tot~|z~ytt{}{{{yzx{~}zxwvuvw||uqu{{uollpuuqr{xx~|wzyyxxx|yw{{~zz{||~ysv{~~}{zywvuw{~|{zxvvw|||}xv|zutv|~{~~{}wtsqoorx|yrs}zvy~{zzywzvrw}~{wtqprx}xrrx~}wsrsx|zvy~wx~wtwstuwy|~vqt{}{yz|||xuz~|zyz~~|yxvussu{~xwz~}z{z|~utx|~~|{yxvtux}|tt}}}vqt{}zwwwvvz|~|xurpnnqy}wuz~xrpquyxtv}zqqv{~|{zzyxy}{zzsnr{zvy~}|zxvvyzxusrqqqty}xy}xvw{~{vyzrsy~ywusrsv{}wopy~{x{~yx}|z|xv|}{}~{xvusrtyxssy|xqlkmswvu{~y{yyzwwvvvx}}x|ztsy}tsw{}|{{{{{{{~|zxwutw||}~xvz{xx||zvrv|}vsrqpqv|yw~ytv~~}zxxyuy~{xusqpqu}|ww~|wttx|zvx|tuzxv}yyyyy{z{yrpu}}~}|{|z~|zyz}}{xvutrrtz{||y}{wwy}~yw|}torx|~~|{ywvy}~vsz}|}wru}~}}{z||x{~|{}~{wsqomlns|~xw}~xrprvywtwyst{z{}yxxwwz~}wz{}{upqyyy~~}{ywwz||zwvuutuy|}xx}|vstwzxtv~{ttz|yxvuvz~zsu}|}xw|~|{xx}wv|}|zz}~{yxvttv|ywzztqquzzwxxw{yv~xvuttuyyy~wsw~}|||||x{~}{{||zxwuuvzyy~}xux|yx{}{ztv{z{zxwwz~{v{~zuv}}yxutu}{ux~|yvtrqqtz|{{{}wtux|zwy}vv{{ts{zzzz|{{zsqu||zyyyz|}{z{~}zwvtsrsw~|wx~z||wvx|}zw{wrty}{}{yy{zuy~|~xssz~{zyxzzz}{{}}zwtsqppsy~||z}}wssvyyuu||uty{x|zyxwx|yw}~}{uqt|~||{{{|}{ywx{}|zyxxwwx|}z~}xx}|wttx{zvx~{tsx}|||zxvwz~|ut|~{x|}{xw{zvy}{z{~}zwusrqrw~}|}xx}zutuz}|y|xy~wwywvuuw|xx~~ysqu}~|{zz}x|~}}}zywvuw{{y}{wx~}xuvy|yvx~xqqv{{{~|{zz|zy}xuy}zxvz{wz}{yy{|zwtrpooqv}}}}}yvvy|{wy|vuzyw{yxwvx|~wv|~zz|~{vpot|~~}~{z{}~}zxvuttv{}{{wx}zursvxurtz{tnou|}{zyz~}ww~|}{vv{}zy}xuy~}|ywuvxyvtrqqqrv}~z{{vsuyzxvzzuw}xz}xvuttw{~xsu|~{y{~|wsu||{~|zy{~~|zxwwvwzz{{vtx}{vrqtxxuuz|urv}}}{yxy|zw|~~yvy|ywyysu{~|zyy{}{xutsrruzzz~xuvy|{xz|vv{wv~xvuuux}}wx~{{~|wrsy}~}{~{z|~~|ywvuuux~~xy~yw{zutvyyvty}zsptz|~}{z{~zw|~}}wtx}zwvy}wz~|yxxz{yvsrqpqty~||}xuvy{ywyytu{~xz{yxwwz~{uw}|yz}}ztqrz}|}}~|zy|~}zxvuuuvz~z}|xx||vssvxwsuz|vppv||~~|{z|~xx~|~{ww}~{xyxw{~|zwvxzzwusrqqrv}|~}{zvux{{xyxw|xw|xwvvw{}vuz~zz}}xsrv~}{yz|~~|{}}{zyxxzyy~yvx~ytsuxyvux}{upsx~|x}{z{~~z}{xz~zwux}vw|~|zxxz{zwusqqprv}zx}}}}zz}~{}~xx||uv{xwvvx}}wv|}zz}~{vqqv}|zxwx~}~}zyxwwy~~ww}ywyzustwxutw|zsoqw|{w~~{}{wx~}zvuwxw|}{ywvxzyvsqpooqu{|y}~zy{~}{{xvz~wu}ywvvwz}wtx}|yxz|{vrpt{}{zz~||}zxxwwx|zwzzvv{{urrtvusty{vqpu{{|~}|z}yw{}yvuzzuw|~}{yvuvxyxvtrrrru{|{~{xy|~|z|}wx||uvzwuttvz~{uty}|yz|~|wssx~|z{~~|}|zxxwwy~yw{~xtv{zussvxwtv{|wrrw}{|~||~|{}xw{}yvuyzuw|~|zxvvyzxvsrrrru{~|}~|yy{}|y{|vvz}vv{xvvvx||vty}{xx{|zvrrx}{|~}{|~}{xwvvvy~zx|zvw|zurruvtrtyzupqw}|~}||~zz}~{ww}~{xx}zvx}~|zxutuwxvtrqqqsw~~~|~zwx{|zx{yvw}}w{zwutux|~xsty{xvxz{xtru|}|~}}{z|~~|zxxxxz~zz{vux}|vrpruurrvzwrpt{}|}|{||y|~~zy|}ywz|uvz~~|zxuttvxwusqqrsv|||}|yy{}|z|}xx}~wxzwuttvz~~yssx{ywwz{yursz|z|}~|~~|zyxxy}yy{vtx}|wrqruurrvywqosz|z~}}~|~zx|{wvz{uvz~|zxuttvwvtrqpqru{}{~}z{}~}{}|wx}{uyzwutux|~}xstxzxvwzzwsqt{}{z}}}}{yxxxy~{wyyuvz~zuqqsutrswytopu{z}~}}{xy~|xuw}xux}}{yvtsuwwurqppqsx~z}|{|~||~xw{|vv|xvttvz~~zusvzywwy{yurrx~{yz}~}zyxxx{wv|}wuw|}xsqruutsvzxspsy{x~}~zx{~yutw}vvy~}{ywuuwyxvtrrrruz{x|||~~|~}xx|ytu{wvuux|{vuy|{xy{|zursx|ywy~}zyxxx{}vu{}wux}zustvwutwzysprx~yw~~zxz~yusv~xwz~}zxvuwyxvsrqqrtx{wz}|}~|}~xwz{ut~~zwvvx{}wtwzzxwy{zvrqv}}ywx}~}}{yxxxz~yvyzvw{|wsrtvustxyuppu{}xz~}}yx}~yvu{|vw{}{xvttwxwtrqqqrv|zx~~|{}}|~|xx}{uw|xvuuw{~~zuswzywwyzxursx}zxy}~}{zyyy|yvz~xuvz~~zurqsutrtxxtpqv|}y{~~}}zz~zvv{{uvz~}{ywussvwvtrqqrsw||y~~||}~|~}xx||vw|wuttvz}}ztruxxvvxyxursy{yz}~}{yyyy|yvz}wtuz}}ytqqrtsqswwspqv}~z}~~}|yz~yvv|ytvz}~|zxusrsuvusqqqrty|{~{|}~}|~{wy~yuyzvtstwz}|wrruwvuvxywtrv}|z}}|~~{yyxy{~wx~ytsw{}{vqpqssqruxvqpt{||~~|~}zy}{wuy{utw|~~|zxvsrrtvvtrrrsux~~{~|{}~}|}|xx|{uw~}}~|{}~yrmmtvsu{~}~yuw{tpoqv|~{xwz}|tos{vuuvx|{y||ups~ojkqw{||||{{{|wrrx{wux|~{yz}zolwunklnrwz{xvx|~ztpovxvy}}sor{uoorvwvsrtvyyy{~|||uooy{yxy{~volpz~xvwxxxxwwvvwy|}||||||~xqpu}{{}~}}vnls}ywvxyzxuux{{{|~~|}{uqps{||~|snpv|{||{xutvxyxy{}~|{}~ysps}}|{|~yrnnt}~}{zyxwwxz{||{|||}~}wrrw}||~~}~{tnnu~|{{|{ywwy{{z{}~}}zvrqtz~~{sppv}}~}|ywvwxyyy{}}|{|~ytqt{~}~ysoos{~}{zyxxxy{{{{{||}~}xtsv|~{upns|~}}}|{yxy{{z{|~~}}}~{wtrty|uqptz~}{ywwyyyyz{}|{|}~{vssyzuqoqw~|{zyyyyz{{{{|||}~{wtuy}xropw~}}}|zyyz{{{{|~~}}}~zwttw|~xspqv~~~}{yxyzzzzz|}}|}~}zvtu{|wspptz}|{{zzzz{||||}}}~~~zwuv{}zurpry~}}}}{zz{||||}~~~}}}zwuux~~zvrqsy~~|{zz{{{{{|}}}}~~{yvux}}yurqsx~}||{{{{||||}}}}}~~~|yvvx}}zwtrsw~~~}|{{|||||}~~}}}~~}zxvvx|~}zwtrsx}|{{{||{{|}}}|}~~}|ywvw{~|yvtrsw}~}||||||||||}}}}}~~}|ywvx|~|zwussw}~~}|||}|||}}~}}}~~~}{xwvx{~|zwtstx}}||||||{|}}||}}~~~}{ywvw{~|yvtssw|~}}|||||||||}}}}}}}{ywwx|~|ywtssw}}}}}}|||}}}}}}}}}|zxwvx{~}{yvtstx}~}}}}||||}}||}}~~}|zywwx|~}{xusstw|~}}}|||||||}}}}}}|zxwwy}~|zxvtstx}~~~}}|||}}}}}}}}}{zxwwy|~|{xvtstx}~~~}}|||}}}}}~~}}|zywwy|~|zwusstw|~~}}}||}}}}}}}}}|zyxxz}~}|zxutstw|~~}}}}}}}}}~}}{zxxxy|~}|zxutstw{~~}}}}}}}}~~}}|zyxxy|~~}{ywutstw{~~}}}}}}}}}}}}|zyxxy|~~|{ywvtstw{~~}}~~~}}}}}|{zyxxy{~~}|{zxvtstwz~~}}}}}}}}}}||{yxxy{~~}|{ywvtttvz~~~}}}}}}}}}||{yxxy{~~~}|{yxvuttvz~~~}}~~}}}}}|{zyxxyz}~}}|zyxwuttvy}~}}}}}}}}}||{zyxyz|~}|{zyxvutuvy}~~}}}}}}||||{zyyyz|~}|{zyxwvuuvx|~~}}}}}|||{{zyyyz|~~}|{zyxwvuuvx|~~}}}}}|||{{zyyyz{~~}|{zyxwuuuvx{~~}}}}}|||{{zzyyz{~~}}|{zyxwvuuvx{~~~}}}}|||{{zyyyz{~~}}|{zxwvvuuvx{~~~~}}}|||{{zzyyz{~~~}}|zyxwvuuuvxz~~~}}}}|||{{zzyyz{~~~}|{zyxwvvuuvwz~~~~~}}}|||{zzyyz{}~~}|{zyxwvvuuvwz~~~~~}}}|||{{zzzz{}~~}|{zyxwvuuuvwz}~~~}}}|||{{zzyz{}~~}}|{zyxwvuuuvwz}~~~}}}||{zzyyz{}~~}}|{zyxwvuuuuwz}~~~}}}||{{zzyz{}~~}}|{zyxwvuuuuwz}~~~}}}||{zzyyz{}~~~}|{{zyxwvuuuuwz}~~~}}||{zzyyz{}~~}||{zyxwvuuuuwz}~~~}}||{zzyyz{}~~}}|{{zyxwvuuuvwz}~~~}}||{zzyyz{}~~}}|{{zyxwvuuuvwy|~~}}||{zzyyz{}~~~}}|{{zyxwvuuuvwy|~~}}||{{zzyz{}~~~}}|{zzyxwvuuuvwy|~~}}||{{zzyz{|~~~}}|{zzyxwvuuuvwy|~~}}||{{zzyz{|~~~}}|{zzyxwvuuuuwy{~~~}}||{{zzzz{|~~~}}|{zyyxwvuuuuwy{~~~}}||{{zzzz{|~~~}||{zyxxwvuuuuwx{~~~}||{{zzzz{|~~~}||{zyxwwvuuuuwx{~~~}}|{{zzzz{|}~~}||{zyxwwvuuuuwxz}~~}}|{{{zzz{|}~~}|{{zyxwwvuuuvvxz}~~}}||{{zzz{|}~~}|{{zyxwwvuuuuvxz}~~}}||{{zzz{|}~~}|{{zyxwvvuuuuvxz|~}}||{{zzz{|}~}}|{zzyxwvvuuuuvxz|~~}||{{zzz{|}~~~}|{zzyxwvvuuuuvxz|~~}||{{zzz{|}~~}}|{zzyxwvvuuuuvxz|~~}||{{zzz{{}~~}}|{zzyxwvvuuuvvxz|~~}||{{zzz{{}~~}}|{zzyxwvvuuuuvxy|~~~}}|{{{zz{{}~~}}|{zzyxwvvuuuuvxy|~~~}||{{{zz{{|~~}}|{zzyxwwvuuuvvxy{~~}}|{{{zz{{|~~}}|{zzyxwwvuuuuvwy{~~}}||{{zz{{|~~}}|{zzyxwwvuuuuvwy{~~}}||{{zz{{|~~}}|{zzyxwvvuuuuvwy{}~}}||{{zz{{|~~}}|{zzyxwwvuuuuvwy{}~~}||{{{z{{|~~}}|{zzyxwvvuuuuvwy{}~~}||{{{z{{|}~}}|{zyyxwvvuuuuvwy{}~~}||{{{{{{|}~}}|{zyyxwvvuuuuvwxz}~}}|{{{{{{|}~}}|{zyyxwvvuuuuvwxz}~}}|{{{{{{|}~}}|{zyyxwvvuuuuvwxz|~}}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~}}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxz|~~~}||{{{{{|}~~}}|{zyyxwvvuuuuvwxy{~~}||{{{{{|}~~~}|{zyyxwvvuuuuvwxy{}~}}|{{{{{|}~~~}|{zyyxwwvuuuuvwxy{}~}}|{{{{{|}~~~}|{zyyxwwvuuuuvwxy{}~}}||{{{{|}~~~}|{zyyxwwvuuuuvvxy{}~}}||{{{{|}}~~}|{zyyxwwvuuuuvvxy{}~}}||{{{{||}~~~}|{zyyxwwvuuuuvvwy{}~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~~}||{{{{||}~~}|{zzyxwwvvuuuvvwyz|~~}}||{{{||}~~}|{zzyxwwvvuuuvvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuvvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuuvwxz|~~}}||{{{||}~~}|{zzyxwwvvuuuuvwxz|~~~}|||{{||}~~}|{zzyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{zzyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{{zyxwwvvuuuuvwxz{}~~}|||{{||}~~}|{{zyxwwvvuuuuvwxy{}~}|||{{||}~~}|{{zyxwwvvuuuuvwxy{}~}}||||||}~~}||{zyxwwvvuuuuvwxy{}~}}||||||}~~}||{zyxxwvvuuuuvwxy{}~}}||||||}~~~}}|{zyxxwvvuuuuvwxy{|~~}}||||||}}~~~}|{zyxxwvvuuuuvwxy{|~~}}||||||}}~~~}|{zyxxwvvuuuuvwxyz|~~~}||||||}}~~~}|{zyxxwvvuuuuvwxyz|~~~}||||||}}~~}|{zy}wf^]dn~|yo`\`o}xuutucZ_UO\qzkN9?]|oirҭgR{.EWŽ~^G>@FLNKDDScW>D_mqvn\TWg|tqk]afgecbdku}vpwvrs}w\jƿļppa.-Oaw{^J?<>LYM5MW;Hdtvxzpi`RU{x_x{bTRSV`vupomo~z|}okis}ƺPKE0Sr־zjebT9PU>a\KTaikszssk^[x{j{wtq|nrwmp|xll}pvtsinz_vpnCS4&@]|԰|iTcjLhRZseaeuxsyyz_wvvrruvm~kqmr|bishof{xr[cI9K1-9\ҼfqmbwVhw~~tk|{pxsnppx{e{|}saThsZN`tjuwwjmffnw|}|ovYf=?LNV\e̻Ǽrkwda`lvnyuxnzw~~c}|zmfcl{vZZqm^X_lvuujtm}rgih_K^:+%/Io|ɸumvnqvxywxmltkq|iU^qbIO^jmrayri{fefrqrtsvi|cm_G[VTLCGrƴ}}qmp~nx{ruzur|ngn}zqs{jUdseUOWhr}wmz{krnpjnbuYadB6.6J[Wdqykzt{uyt}utdovp_lv^JQ]ca]Pvuvo|lhkxntzoorkfv^N_\VH89^|ɷztw~jz}tv}~wosjggz|valxjXOR_xeyzqwxjrtr}}ipfx]amPD;>HNAFrǠ}rzqusuvvt}c}uxm|jsrXW_c_XIhwlmsooznmyuxikqsScdaTA5IbdjǾ{|ts~tswmsyftbsr~milzhYW[rhboxtqumzpigup`u[I@AKRD8Qvɪuzwq}r{vvy~hwsopx}y^\eke[G[h]qxpo{unyvzfpruS_c`S@3E[VQiƼtuxx~on}h|yijs}n|{vx|l`^apY]xjxw}ptwnymqhxfezaSJLSR:/Hdmwʭ~tsrstvqvfnw}f|{wiekmdVJj\_qc{}mty||pc~o]jicSCAPQ?>Vuʮ|}wzo~pikz}vspj~fw~|{rjlwqTk[lm{uou{prp|axo]SPV\N79KQQYoƭwz~qzwwvxvwvmio}|ywty{thXk`QmVoyy|vtzznmwrZiol\HBT]H6:K[hsɾ{|xntmz}yojv~onqtqs}yywZt`cnYp{uus{{qn{w{a|xicchgQ;BTRF@Kcǵss|y}vszxv|zcozynj{{zic~jbiOlupurz||yzks`knmbVVa\G=AHIJKjʽl{jp}wharw~lxsw}mwyp~_tjTcp{{yw~}qzp~jrgbgpq[GLXTIADPZKt}oxv}~ijlqwyslm}{s|ztnrxZmi_`mx}qxrscnroaW\miPABFC;3Lf^t{zuqw{xplvuhn}yrs|nlrrzvZbimkiryx~qsxnsknvvcOTb`TJHKQ=UBSqjɿvq{~{piopadp{~}z}qgvrvdfgd_cw}zm{vumotq`V_f`UQTWH/NLPurȽ~upn~z~~{qjm|zmmu}}{}l|rhfmuslt|vqnvzugZ[mudQKKJEQjp|ü~x{{wu{vkmqpifruzhizs}vuwvnehx|ofo}|ywjY`lkb^_`R9MG>YHBQcs|tyoizsvzigmstqx}zp]`s~srmoqontzdVSTTPMWV8OS>R[^fx}tq~xggmlfcyzktkuu|}}yros|~qdclw~y}}|lhlmjdceaFGS;MO<@JTZf|uzg|vo|zqgjprrz|r||pgluxy{wvrliozcURQLJXfKKO@BDMaxyh~rjuv}|mhhhit|xo}|pt}xzz~{y~|soxynhb[VUddMaW>PYVRT[^[c}³wurjgsukybjuv}qxp}vt{vnkjgj{yqwxrn_LbcN]M>EQZVLIPar~~ynvvdacchxxttux~gpquhrl}~|xumopmo}|\efM\lkc\[YLBFUcjs~}zw~m~|lz~wtwyzxv~{i{vhppqlkrwtvx}mxs~~ulxaUlaPOOI@CS]XJDIR\oy{{nykfb^^exzwsmn}vk|lotwzwmr~upoqt~kgrXUbeeebXMGISZ`foyzvx{fn{yuicr~p~cruprwus|{v}p~nz|xj~}_gfRIIKHFIV^VJCFMWk¿vu|mllgbfr{~}zy{yuzxqqdyvu~w{ypznu~xojm}sp~_VfiffhbP=@Sbfdhpplruqz}ujbevzhzpwzigmpqv~|y~||{j{vpxg{nVOLJKQYZQJHIIIQdzwy}}|ichifhs}yootuv|pvohxpqtwxpou~y|}vul}hhjifcc`UIEM[bdc`Z[{xts`\hv{uqo}hdips{zvvzwu}iyqwlXOMIHScfVC?DGHOfl_|t~sjgkry{ukddmvz{ozq|~|ywy~~njllsxw{nymm|zplh]PKOWY[bfcULenbzt|pednvyvy}mrfaagtqprs}~|zm|xkcXRSX`d\OB=CJS_WJhslzwunfm~nb_^cr}rk~xoq~w~|snos|}|pswtldUKR]b^WZYLI_[Smz|z~qklswyzzzyrvy|rsnghsztmms|yxwqymif\Waif]TNF>CUeTF]ZPhz|}{x}ug`_ag|s}|q}zqmqzxp|yunozmw{gVOS]hkh^RJMaRD`jbhwmkv~~xvsh_ww{mhmplnzzsrplvwzvnr|}~vtomnllj_QNPOKMZTG\ZGTft~yw{}ume_ds|pt~steetyoz{|x}~||z}zup[U\acgh`K=VcMS^VPS`qsox|pdbvxntmlp{{usqpty}xqvpvwmnpor||obVMKOV`]FKbSDPbls~unpolluu`l{t~ohn{xj}t}vqw{sv~}nf`ahjfebUKUSFYfWMPV_s}~}t`aypdzsqliovllprywpr|tvyxonsz|iWQNKRaeLBZWLU]bjpt|xjkqw{ehyml}}rnrty~}vquyxzsrrzzylhnmgfcYNK]cEHb^RJJR]ntyshrt_jytuwuxthfkuswv}~{pko|zn]QORZcXM\R?L_ffgkigtypirlcytbn{mju||}yq~qzuz~{rrv~xzpjkpwzqgaRFWcNLYYUSRQXhw~z~sll}aj{qjpqry~{ukgm~uoswr~w|{{vzylf`UU_`JJd\EFXeihda`ct}|{yxps}h_kw|pkq~woqw~|vu|ysw~qhlvzyynZLN_ZKZcPDINRVbs{{}{gquguypfgqx}vnptpq}szvxwzvrzuwyqhfgfi]IU_NKSU]dd\QQ]m{y}ln~efsy{~wvwx{mdv}v{pqrv~~tpkq|{r^Qa_EOfbSEDNXafhjhixvwyo~mca`hyvmmu~ksr~|{~yqu}topnnvx_K^bLLZ`\W\\UMO]kt~yo}lotwzwturp{zmw~nvxorxzv~|o|y{~~pehpaOYa[SMFBN_ig^Z\`m~omyicehpzsnr}fuzt}wr{{zs~spt|n]gbLJWcd^QJJKPV_inqx|~yoy~ywsiiqxumskp{vvqq~~wrsr{v~{npnR_j]QRSROT`d^TNS\h{y}skdeow~yxyx}uzpjyxpmoz{oyxtxtgysWQX\adaTDCLV[[]`\\vqn~}qha_k}sj|uvf\bo~z{jcXG:?SknU>Fj{hB0<\tmfp^YmbgrPiyiVOU_jm[wykhywsxwjq|lYEFbyc5#BpzfL97Cbzμr_aeoyxm[LGHWunTi~c[h{blwnuphomG7@UoxgJ7C_ppg`[GBdvil~fVUZ_cfjnq}qYdsc_fs|plodc}xzvyvWMIJZiqm\D2.?\psjet~ln˷zrpzg\juoo_[aju~}qlkjku{mVaulnqppqohammXVb`XPR_krslX@/3H`u{tþysvwqb]w}tmb[]a`cea[Zh}vf~thelyx]PafWT`ptttk\PKF?81-5K[NNi{qt|~mdhmojd^ULUnsdm~y||}~}yyugZRKD@EI>=PULPbz|yrty|zusqi`WW^b]Vd{{pq}z~yl^[ZYZXN=.8NI8BX`^crpuzzyxrfZXbge]QIJ[oibvzyzpeYSUWWK76MVC;GVbq|~~xqlls|~vidc`^_d_NVttfjw}~}qeaa^YTKACNI>FNPNKLTiyopo`]dkjcZUVZdqwwusw|{wrqxrf]VTY_`[UVXY[`eaXe~tlzrnprrppomnv~wm}~w|{|{|xg]ZYVPLIFBBHOOJFObkdh}t~unkiilibZWY\aimko}sx~~w}xib_^adbZQPV]`\PHVp{vt}|s~~rmqxzxrnkkswq}zz|}}}spme_YQLKLJFDFFEKZbWRhuptvrifda^\]``aflypnz|ofeeefd_WQU_aVFK_f_cnyy~wuz~zsljkpz~tlyur{~{wx|{vwwqdYQKJNRPIBBIW`UGPewxsw{zshcddc`]\XYh~{pw~|}{wnkhc_^]ZXXXMFQ`_UTbr||}~{unnrtqll|rms}zwy}x{zx{|ysfXQMLMOME=BWcXHM_jnu~{xyzzxqg_bhjg`[Zatumyv{z}}}wpjd^\^a_UHESb]OLS_ny|~ywwwutsm`]txrrvz}ww|~z~~vvz|wpg[RPPNMKHHNYWKL[fjko{|}{xurmfbdhf`Y\jvrjqyz~~~{|~tha][^b^N>E]eYMNV_gr{~vvy|{rd\fzwptxyxxz{yx|{uzxxxunhbYRNJEDIU^TFJ[fgeglv{uononjfgfdeouk^g{yz|~||~xja___]QGKXZRMOTZ_cis|yx~ub\kyunosx|{wuw{|zz{}~wvytpmjge_VNIFL\aQ@G\hifejq{|vrrtrlcaep{wf]hyxrv}yux|~}{|{tjdc^QEJ[_PGJQVWZ]`gt~|qfjvtgahrwyxtppv~{wxv~~vqnnlie[OIMX`XIHQ[abbbfnv~}ywwyyskfpk^fu{~}{qrvz~~yssy}}yuu{{vneWHI[aTD@HPTSQRW_lzzkgsxh_`gqwwvtrqtz}xsxzuporrojaXXaaPFO\^[[_cegjos|~|zxtsyohovxvv}y~}rqtuvwwursy}|xv}~oYKP_aVJDCGNQPMNSZcnw{rjx}k``cfkpqqrttuwzz|}~~sx|urssoifhlhWHN\b_XUZafhhjms}{mkwzwvzuu|xuttsstvusruvw|xo[VacVJHIHEFIKKLPV[bmxtxxlfdeffinqrttroqz|yws}~}yusqorzzfPMWadb^YX]dfedflt~~}mo}{vuw|x}}{}|wqomnswxtpryyq|~mdgmfUIGJMKFDGKMNPSV\l}qllkhecackruwvsqyvuvwzz}}yrmovr[T[a`^]]\Z]dggfhntwvxvv~~zyz{xuyz}{snmmpturnq}ryrjqyoZLGGIKJE@BIPRRSWatzzkimolgdbbfnstsswx~}uwyst|}|~~vptyg`dfea]\_`_\]afilnoier{z~||}}swysw|~|vomnpqstuzvwqip}~oZMIIHIJIEBELPQRXgy~~vmiknlgbabejqtu{ywpmsrty}zzzxx}mflrmd^[Z]bc`]_elnle_e|{y}{z{~twwtw{~~|ytommlms~{szvkrpbYQLJFDDFGFFJOSZfstknyurmlmmjecccejq{ws}ss|trsuvy~{y}viku|ypf`^]^``^\^ejf[Vcx|{}yw~yyywwxyzzzwrnlnvpm|ws~}oe`]UNIFDEGHEBEO]lpg_g|}xyyumiijjhedcfr|szyprzutttttux~{{qlu|umeba``aa_^__YSZjtqms~}|}{wrruty|zwvxz{{ysmlrwpv|qjhfc\QJFEFHIGDGUfi]S[m}~|}}zsljllieabiyzu}wmqtmptvsqopt{yu}|vmgc`^_ba\RJJXhle^`iw~xngo}tqsx{ytsuz||{wtyzps~yvnmnlhbXOJHFFFGIR^aWOUcov}~{vpmnomigmx~zrsukoyoknsvtqooqu{}}wnhcaab`VHCQcg]TSXalv|{ncev~vsssuy{xttvyyy{|nnzvpopnje_WPMJGHMW]ZNHP^hmpt||wqmmmlow~yliuuozyrpnmnqrqooqru{~{~wmgdb`[PEGUa`WPOTZ`jt{|mdky|vssutrruxxvuwy|tjp}|wsqpnkgbZQKHGN[c[IBN^giilqz~}}{uomqytecqxyunnqqomorrqonoqz~{rjfaXMHNZ\VONOQTW\bmx|oho{~umnruwwtstwywtsw~op{{|{vplkjhe`WOLQZ`[MDIVcjklnrx|{zvpmu}kcjv|}wnjloqokjmrtrppt}xqg\NDHXb\NGJOSVX[`gr|~rlq|wlegnsuutsruy{ywzyw|ww}yz|ztnjigea[USY`\PGJSZ_eilnrx~}{zxwx~qgju}wzskjlnpqokknqqpr{{tfTHHT_]RHCGNSUVX^enysho}oecekruvvussuxz}{|ur~}zyyytnjihfcaacd[KCJX```cimpruz}yx{|okqx|}}vzyplkkklnnmlnqtxx~xkYLO[_XOHFDGMRUVX]biswpvzmfcdehnrtvvutv|{xxos|zzzvpkhgfhnrkYIFNY``^]ahmpruz~tio{~~zxzvqmlkkmnnkiltus~vh][`b[NGFFFDEJOSUX\bk|{x|slheeefjostutsv|u}zst~}zxzzwqmlpx~xfQLS[`bb`^^bhkmotx{||~qq{}}}y~}zzytnkjjlopnlq~}pp{xlekroaRHEFHGECFKNPQU]k|pmljgdccflrtuvz{vxpoxzuw}}zz{ytrvo`Z\`a`_``_^`ehjlmlhgrz~~~xryzxz{{xsmkjjkmosz~rpy|qmt}|m[NIGGGGDBBGLOPVao{||zomnnkhecdglpsy{z}pjsyrorx}}||}~wigkmjgdaaba^\^cghd^X\n~uu}vuxzzywrmlkknt}|rpwyorqaTMJIHHGEBBEINVamrmjt}uomnmjgeddgmu~{syxnluxpnorw}|z{ulnuxtlfbaabb`^^bd`XSYi{~xsxyvvxz{zytokjlr~zmmxvxsh`WPKHEEFGECELWckjb]fz{wrnmmliecbdkx~tv}uopyxspnoprw}~vlpy~zrjeb``aa_]\ZUPTcsyxx|~|yusx{yzyvvvxzzyupnrz~pjq~z}yngb]VOJGEDEEDELZhldZ[hy|zxuokikkifegn{wv~vljuvqpqqpqqsw}tou|{vngca``aa^WPMR^lrplmu~{ulip}vvy{zwvwyyxwtty~snqyz~{oifc_YQJGEDEGINVaf`WWbq~|zywsmiiiiggmv}vvynktwmknqqpopquzxx|}yrjd`___^WLEJ\lpkdcgp{}siel}|vtuwzywvwyz{|wllv{rkhgea\UMGDCDIQZ_]VQVamv}|zxvsnjiklou|~xnnwymnz}unjjnqrqpopsy|y}zumfb`]YRIEM]hg`[[_fnxzndeq}xvuuvx{zwuvx{~pjoz~unkigda\UNIGIPZa]PGKYfntx}~|ywsnjkpxylfl{xw}{somkjjmoppopry{~yske`YOGFNY`_ZUTUZ_foy{rjjs}~yutttutsuxzyww{qkq{|xsomkiea[SNNS\a\ODEQ^gkmqv}~}{xtru~vhdkw|yypllmmkjlnonnot~zqg\PHHS]^VNLMOQSW]epyzplpz~umlortuuttvxyxzzrt{{w{||{xsomljgc]Z[ab[OFGNW`fjkmpu{}|{|}ogirz{z~rljkllkiilopqt{viYLIP]b\QGEHLOQSW\dnwxnp{yngfinqsssstwz~y|zroy|{}}ztpnljhffhhcVJGMUY\`dgjlpu{vmlqx}~vyumkkkmnljhjnqv~}{{o_SPX``YOHCCFJMORV[cmz{rs~{ogdehmqsttssv|}zzqox|{{{zvronmorusgVIGOX^_^`cgiknrxwmnu{~~~zz|uokjijlmljkpxvrzth]Y]dcZPJFDCEJNPRUY_jyyz}tlfdcdhmqtuvvy{w~zsot}{{{xsomnsy|veRILSZ_`_^`ejmprvy{}qkq{zz{xtolkjjkllloy{qq{yoecfjg^SJFEEDCEJPSVZal|z{uokhfeefinrtvy~xz~vqpv}|~}{yzzxtsv||n]RQV[^`aa`_bgkoqrroowxrsy~wy~{zxvqmjjjlnpszypqzznfgnvsfVKFDEFFEEHMRV\esumjihfdcdhmrw|}z~}skkvyuw||yyyzz}}ob\\^____`aa`bfjmlieenxx~yty{yyzzxtnkiilqx|tpt}{okpy}vhYMGEDDEEDEHNU]gs{|yzvmjjjigeddgmu}}x}~wokp|ysqrv{~}|}viegklheb````_^`ceb\Y]l|yvy~ywxyyxvrnlmpxxnlt~wqutg[QKHFEFEDCEKT`kqpigp~vpljjjhfeehnzytz{tmls}xrooqty}~znkouwtnhdbaaa`^\ZXTRWds}~|yurr{~{xwxzzzxtporyxliq|}}xnf^VOJGFFFFFHP[fic[Yaq}zuqmlljhffjsxtx|slmuztqonmnptz~tqv}}vohdbaa`\VOJIP]krqoqv||voknx~zyzywvxyzzzxx|xnkox|}vnid_XQLIGFGILS\caXRT_m{ɿxlsrwwozyxplcUSU[n~zbXkuqs{}i]kSLzpAC_cSIJNMKQ`wpjϴphx\EPntbXZmt]`{zi`\_hrtokhq|pwtx_F;F\h^F46Kdttmgis¤rntsWN\un]SRXaiq}uo`etuhZQRaxwossfh{dGGZkhWHELRPLKTcwvovǷt{~`NMZp}obZX`ovoosurmjovzwmhlzzozwdN;37EWhv|whZTZfuȿvlilurhddeb[TT\fmqu}zu|wmaWRUasndeo|~oZD4-1;DGE@=?GSezohlquw|{ric_^bjxwmkq~uqu|~yqlhfhlrx|{vk^TOOOMC6.2?P`osha]\^bjw}vw~~wuyxuwyvpifgkpu{xsw|l]PGB>BJPTVY`kzsou|tmgdgrvkc^[YVSQQTW[`hr~~uqrvxyyyxx{tf\[ajmib]]afjpv}ö~uj^TRXeoqkc]Z\^__^]]_cgls{ymebcfikmpuz~{ywvvsk_WW^gpx~~||{slhffinsvtmbYVZ`ejpv|}{|~}tk`SE97>JQQJA:8:=@BDHNVbo}zvvyzvrjb\^hywrnljhd_ZXXY\`b_TG;7;BGIKPV]dmvtqtolcYOJIAC?;=Ibu{gU`ePTampuniiqjj~fSQYennmljcSCLvoeĜZGW{o[NLT^p|aFXcpyVP_r|maZ]oqjz{{vojrzdpW[iswy{~lWNZsn[\vwhw|j~yYKKQTTSS[kqvsjd^[]fwr_r{dfzļ~uypTA=EQXZYXVSMB7+#)Bcrj^gʵ{siedkywjtifs~slmu|k\X[cilptvuph\UU_rk^`hlje`]\ZZ\_gqz~{qdYV^rǿǿúh_dnx}}zuomovsnopniea^[VOIGLWiy{ncaflqyyleeo{qljjigaZPFAI_~~|}xm_TNJGEDHQ_p~unlmot}{qh`]dt|rnp{j\USSSSTTSUZbkrutojip|~zy}xqlmt}|zwsmiip}qf]Z^iz~{~{vwywm\L@;9;?EJPUZ\ZWVWXY[al|~|wrmg_YUU[gx{uvzspqw}wph]RLMQVXXWVUTSPMLMMKHHN]q{upmlljbYRQWajrw{zumfdjsyvmaTH?953235:CRcuú~zz{|zwsolknruunc[[blsxz|~~~}yuqmhc^\^gqyzumgcbbeimpty{xvutsrpnlhedlyrfdhnrsrpoppomljigedfny~xqlihhhiklou~|qia\XVUSPLHFHNTXUOJMYjz{rkd^ZYZ\^ciszvz~~~}|pbWTX^ab^YTQPOOOMJFCCGP^ksvwx{}Ǻzx|}wroprqkbXTXblswyz|ywhYO<71,038HXliL?Gb~ʻy|y~}n\MEOjjZndT^xvp[deledelyrlhk~zsqs{~pP8JgQ(7mqYRZhqvzxspwunrxz|yrifqiRkoqwgevfSXnxumZu|aQID?:55;IYc`Q@L`s}{lXH@AHR]gqzyrkfb_^bn~wiem~~k]TPPRSUW[bo|xvusqoliecabfklfWF97?KV^djqxvh]X]kwlea`beimrzvrrttsrsux}{wy{}~~~}|zulcXOIFEEA:32:JZhs{~xvuvxzxx}wpmljgeegikmoqqnkjjntz|xpjkr}}tgZMB;:AOaqyytld^[[_fozʾxlffgfcabdgjmoprsqonptxyuj_XZbksy{{zyywtokhfiq|xvtsrqqty}}vj_Y[bjquy~{wspliggiljbWONU`lu{}~~}}|{xtqoqx|yxz}q`QHFIKHA:668;@EJQYajqz}xrlghp}|uu{{rljiheb^\YVSQPOOKC91/29BKRVZ]`ekrx}¼|~ww|vkb\YYZ[ZYXZ]`ekquvrmjlryzvrnic[SNPXdosqjc^]^`bfkr{¼~phhnrpia[XZ^adeffgintz~|tkggjnpstuuusqpqrqpnqy~}~}tdd̻qspgnu}~r\G:;LYk|muy_ym]iukxxgyiZf|vjhaQBOqsIJq|ZUpxagvvknVB]{xMBTXcsqrs{jspnwt}wytyn{lmo}qr~vgm{qn\bmlzqzrVWTeqöƹusggy]ZT^aVhtqwZZ_VN;>3&45a{{phz|mjpcf`eq[bcouu˻j{mpttt`Ra]\OVZNSNXlTUTdf[hihbI^\\WWkqprhv]SRZfl~wurüdmf]F77+.ARutU[g_[JLOCICTUFMQ^^^jm|kqlwtnbji]aZnwcehzwqpaz}vlsUMIU]eyzxkt^]e}xwu}ysusokQ]ZTA>IKUht}}`frleX[_SWSdfX]amnrĴyy|upXn~|f\ih`PUSFE@M]EBCSRITXXRFi{urmze\[hpuvtiz}ksƵ{zpjJKLG;=DO;9;JQ\s{~ej~qqruneed|k\Ydh]\jmwkld]gdRS^pwrd]_zpszvyzphid_L>PY^Ygnhgiu~z|~|bsywlehgWWVg\SXm~~svyui\wypuqoZ^ijYTZYONJ\\FAGRLLbszzuqshZX^iXV]ot}~sxxojjcZMcqteije_fq}~|sW`jfXONPA=>PQMYt{pryooxum\tǻ|litvgbjj_ZWhmWQ[kov}wshUSWaPJPciv|vop|{g_dg^Z[dijhrutoiny|}xzqYgojZUVZKKSmsyuhjobVYa^SOqѿyzqY[dcQQRN@;;OK:;QdoyxuwmabkmYS]kox}u~ngogb^it|ttkafhcbio_ki\MIHE9AUppu}xzngqlbZdeaSgvjxthlhbUS\k\Yjwspr_YYbSINbfqv{z||mltxf\`fahp{zhljf[`oz}}|dluqa][b[cwz{pbij`TV``[gtysiZcldRWVUFBI_[Zkw~qqoscWV`YMN``ehw~}~uv~shlww{ef`^TXf}rv}ejsnZVVbbiz~~vzyuikw|g[ci^WXlrsxv}~wgjro]dccUPZu{urdNLUUG@KNPZcx~{yzgr}opkpb^blbVYqxrnnnh`ew|mj}}~}kalna[drwop|r^W`UQLbtxr~{|j\bgYQTNLAKe}zswvln\V\g\MJXS[Yervt{|||ljpwmlzz{p]ecfYU\qtowmhqsgq{{|szxs~{yfcnzjWXc]fl~}}kgrua`beii{z}libfTRW[K?ESKUTj~ɹtv{mlz}ljllkX[ixx}tuzsemggTOZqsmr}~xxdgztzxvedkscSZlmzyv~y|se^efTVbl{xx}qz~o_d^hYRSYQGHUKX\v®|wxwnxvqrmsemkltp]bWVJFUowom~sxvx|renzvelek^UYge]g{ywivtiY_ifhvqvs`c]`U?@JJ;4FJWoŻ}uwm{}mZ`on[`[ilqwpy}i__Z_R[mzoesvuk}~xvhkolfRUdsrt~ryo|xyntwjY\lxw~xkamtgee[\IJRUIBSfqzu|xzuhjvxgour}qcggTITP]TWcttpz~y}~yuqnl|zoejobejcgYayvwkyx~oxonwqjq{ytd[gpbXSJUD@EMJJdurxvhftn`]jqhy|~wtc`aSO[XcRO_ttjs|~w~ptqtzg`lsbefgohzxznxtkj|z}v{lt~}~pgtk^^jkTTUUZEGUaenx}symmbqxk]fy{|xrYLQTDORNNBQgsml|ww}jb[pult]_ghtliyzoUTVdzrIBhf-@Z]XYZU_rnʯ~}giZ_iuWCux|m|vZ_fosn\=9[ft[B?LW_yz|ykNCZy{tmxytRHi{^axxqfjg[hf|pub\]KPGWxxeSHOthT?9^tz}q[glo^N_|~mssfn]iwuke[; 1=_d^grqpƮf[enmszsh\eUA?Vs}smxwyej`OMhrkZry{±v~v~w~gUMC5Oblu`[`f_Yklqwdsz}tusg_kmWXFQ`lwvg[G.;=4'1#39@dôuaf^_aN]bak}q{~nvadmjhu~iiXfdWar{{hxyxqmv}ws|phSa[E35A@Vx{{uezw|rr~v}nr|yipkcobleN?CG6*7/CL[v~zxsrkk`u~onZdnihoseZm`gcYgy~}s|uv]]homir`PZKSL<7CXfy}vslqj[QYWN_JFD=51/$53Q``s{|rvrynk}ymdej`k^Zi^kxou}pqw]dYR\ihYSUIUB=FA?OmyxƷ~kb`^SRbSUI:NL>14;2J`dxqs{zxr{wty}yvxldj^nkWN\j^\g`y}{hm]`bV`hbPPbROK@UZcr{ŵ}wwYTXVQOXB6A6A;-(/;AVibvlesx{w~vm{gfb\\ae[]qj|svqqcP`WUeXVSUVT\IGQF`sttty{tpxѶ}in]Y_e_SRDIU>CD@>Ndakzitlo}w||sln}xm{ypfqkddGU_YQS_^k|lf`WiaiiPRag^W_R]gm}}vrx{ǿwv^bdU\bZFCRADKCoĚO%nA=_eoSNPTzt{}vb~yskepwXSWeok^_mknq{nc}ɷƩgr||mC!69Rac{{{fspkQ8S[qx|жV:VщU@9Goik`[uqWS\k]~aZekn{o\RRhsx|ֹrwKF,,5>YW8>KK0>QUn|}ˮhm`gvqgh_[pch~{mUB=i罚}qj}}zr}}[ssmL8;(0Gdtn`Vk}~vm]X[q~xageTc^93;KMfjattz~tqie]`nttimqsp~}v|qtg\O8.,^rϸhc`]YXeACEYPO\W\ckscjdxy{xr]SJKOIgnmwq}r~|prmhq{vhjw_stos~{wxekg|z[QND9 &[mýxvySYPaUhpga`eaNNEkry~ngddjmomvup^^s}xjt}p}zmxslnuziVZVyoupSH=84"$,O]Ľsvu}|rplURSSo_v~kvzvlsz|w||u_|}{zzgXWDRkophtajtzx}{ebV]qi{gYPQP;3/EGcikZoohxsygdldig}~y~yebH:PYWIFID]c~yxsoyxkmczx}~kxlvyynb[PRG:C+@O^´ô~}|wvllek}kwcpsvqq|mxiFQZSTIL9KLbgc[XY^xxjzhwwvx}sum`mfbMFcѴŴ_\QSdUmu}wSc^rbmtgi\]KYVfyvme^TeaPg[acYv|lyso`^TRN/--!=7NbffMV[^{~wqzwYe[v}qQ^_Z[RRKaXisrklb^qictbofgz|xvv}uso~ym}rcW\V[T5@<6JFamöqqXkhr|zu~vvtvakknYlf]YNHCOB[gfaf`br_[qevnwtr{wnhvk[e\OGOMYW9A75NRq|ʻtx\ecrz}ssvxutdolµixqfaQFCTJ^hbY\SM[LIb[oqulwj[kbN@E?JH%/+)EQvĸȰhkLTXf}yy~gsnTZ[}iy{opcZWeVask]ZTL]R>WR^hn}wjrnZDE=@L205%?Moʴhr]U[^}{wxigqW`d|dkwmtm`Vc\]xwighY`_BTUVfpq~w|jmr`KIDGYB8B.AQnzn`de~{{qlzmljlodfmcf_RN]WVu{qlgV^bGY\auuzmq|uks}bbiYILGCTC>L9K`xvfjq|odv}unojnvªllk^dbVP]PMjk__\MVYD]^crnqvniy}]]^H;925I7>J3Gc{q|d^bvus|kigUnh]curopiamlUeulmlZKQ9AQL\k}w~}r{yilTEC@7D>4E16NrĻxy`[i~tzrxccudbgz{qhiiafyi[mmmuoYVRBWQVey|}ijrnkptfHBB>?M=KJ8Ecshk~nmvsytm^vmeiz~nig_ZniQ]eaorfY[BOTP_uolrqevnhdE;;<7IEFQ77Qwý}metxll~vkmWfoehr}}uoiYfuaZe[eniSOB=OFOgssxnmwgoX=9725@5I>+6]|¾yz~n`ds~{|zptnbTh_Y_ovúyuje|xcid\jkcRR;FG>Lizxswzn}wttPA;8-8;BP7)=cz¾}upcjq{wwzvs]ZcWZjuv{zhjuircetwj[S@OEMU;.Ed}vnst|ss~vv_ei]bx}~}yso\gxlir`irte\RFVICYzxnhljg}yeogKF@?1;;SYC9Ro|z~|s~kqrp{}qucgeX`~~xst`fvjfnX\gnbYPFXMCSvsgghgzcicH@56(02MZKCWm·xrxx|y{hoojyuvil\_`RY|z|hgvleo[[fkcUN@PG<4-.8VUP\nz¿pus||uqip`mswnhjfo_Tkuvsfuvlwpaghq`]MTYOMdr{~~vubf[j}oekYU@<813<[a^ky~nqrtykbjZenwndhiufZnytseoldpnaecqdaRVZSTis|xsyghYdui^aQT?9616?\aasȲilovw{f^aQ]and^bjuf^w{yqfoifsjea^j\[PWWRYotwy}mkZgpb^]QV<9//1=W\a{Ůz~dej}|xd`\OZ]oa]^lq_Yu~vsvjkwjm]_e\[TZSN]joo|zsl`ppef[XW>:*13HXZe{źvdbo}vybdWZ\fp_`bsjYb}uxpgtwrt_kdc^^ZOPfex}qi|tvfgqhccVaRD929?RY\r{}nghvskcaV]Woibbpxf\s~wttfhxt~kdhbeceYQckkzetvvm_if_cX\_ME16:LUXg|·{~kfsot_]QZQ`mbdjym[gvxzjbrszu`f^edjaSYjczmlyvwdhh_`\T`PJ3/6ANR\x{xlcdy}yg^WWXMfc`_mraZmqyeertme_\bfgVM_ce|iwxyjne^cVZ[RJ/28FJM`wt}kck{vg`V_QTe_`dsn\`ipvenvniZ_ckgURe]jwtjxxtlla`cXdZZI16>IHNjxzofpz}u{f\WcPYddejwp`fgsuemsrkYbislYYg^nrliosqlg[_aZbV_H4:FOLTszqit{uvdVVaOY^bdlwsgnkz~p`fmumW`htn]^jctsjhloskbTVYW^Q^M7;IQLSt}sjsx}w|}xfUP]KRT[cjuuoumy}~rcdhunQWcqpb`kfwqpklkznaQQWW_N\R97DPLOp~zwjnru|~lZLYLOPSahrtrxqsyiddwuxYP^ntjaicrsszglb{vhVMTVbQT\D9ASTPf~x|pmrtz|rdPXQNTK]hruvtxlebnxhQXkwrhldqzngj\n}nXJMQbWRaQDCV\Vd|x{tvu~||{tshTVOMVIYlwy{ztje`kxoTVjyxrthspiiXey{nVFFK`XRaVKFWa^h}w}}xwu}xw}q{zofSSJKUFUmzz{qgd]fzsmTShzyvwgvsnjVet{pTCAG^SR\SNHXa`m{t}tx}yus}v|qvtmeVUEMQCRkywyofd]jvtiUQgwvwvdx{v~sjXis~qSC?G]PWYTQLX_`nvv|oy{tpq~tvsod[TCTKCUqzuzlhgbss|}dSTlwv|nf{sx|yyc_muiMD?S\S^VWRPX\dpvxp~|qqzn}sqpmb`LJXII^yzszijeitsucU_sx{}fpvs|{~zqYejxz]IAD[T[[U[UU[_mmnuyp|ozvmlmfdYFWOGOl{twlghfrnl^Wiuxqjxs}{z~ccio|kNCHBU_SVcm^Tgmoxij{{w}z{ofV]cn\SPGMQYiujcosamlkllb\lzzn||rsxvvmffdbS?F@K`WW`pjYbopmjsx|u}lytYV]leXVGLSZbruehvehjhlol_c|~ovzslxuwwsed``_JHED_^\`pwgbssump|}zp{mo|`RWjk^`MNW`cn|iduhiifnsufaxstxslqu|uwwgd]\aRLGC\`bfs}situ}{{pr~{myml}}dRQflbgSOXdfk~mcrijhcmuylauywxsnozu{sxzidZW_UPHD[`fjvyouv{v}rs}zlykmy|fSOgieiSPZggjofqflcalvylbu{yxuqopy~y~r~|meYV_YVGI[_hmxztswyv~su}wnykryzgTPhfkjUS]hfh̽v^jl|n\_\NQX_^`carbK<*8F_r|ǻdeL_lufaz~²S/TtTILDVVUbv{Ȱs:Uߔ17]`\L26DSULTbuyygjÔXFOflm|sqlhjhfa[uzԷ|ws~mgaGT`ekq|X=?qmn^XTB?Memrͪ\%mx;)/=SGGSae]XdqyfY[TNpo[XXNfrŵmarkvw}sgQHCKR^xwipgvbJGXt_W`falMBժwS8DA>Mbqofhjwf^UF9;F=WxqkOK[b{|_H\fm|y®xf[VTbvilmrnQOPl{yqyV!)[ݿkRO:7F\eb^YZvrohRFE@60DGDb{zkGIHPgz|~zzyqZUmkwxyyssvZLNTv|b<3lɨtaO4-7GJFF68QLSkpRPEL]lonwycmnmojlv|ydepmxw}hJHMZ|̽t^O-!>yҴt[?39DC?=-VP\px`XIO^kjfqo]fdjmjqlklkwxs]?FPa~m\HD**H־gN@BJIFD1KTfojpvaVOoxvu{ypy~q]ZE?[tsz~m[H7$#77Mj϶tkcfjlsm]cet|qb\YR?DOeõ}rv}r_VJkt{vrv~xlpv}|ztt|xkWYLE`yr}wv{oxscVF4"7A[w̺xpkmos|yilhwxj`YR@CLeŹz}{txxj[WKjtwwqs|wkmotzulltsfSXQLe~rwz~qntgo{{|m]SE3 8Hh̺zuqrsw~rqiyylbXO?EJiĹvoppaZULosyvqt{uilir~xpffnm_PYRVksvv~zkjmalqwwfWPC2%:Os˸|xwvuzzuk}zncXK?GJp¸~ojihZ[RQvtxsw{sjkdt{wjadljXQZS_pvts}tfjfajjvp_TOA-.<[{ȹ}{{xw~qpvm`TCCFP~ujff_W[LZ{z}yv{{plhez||se^ejeRWWXft~zot~~mdh^dejuiYSL>'$3Bh}~~}yzmx}ul^NBHD_xlfcbW[SLd}}yqnco{||k`_idXTNXWRzzsgeztgQhd]mywd_TH6)11OqpǠsy{~f\QARRkĶ~tgbPU]EKGg~}rrqjabr{ng]Qb[RZTnh_rxqzzy}}n]ac`akwfY\DB33KIYl~Ҳ{}n}}dleKIYny̬rrlesaXUP15e}~xtphW`mtlrrZ[ZP8U[Zptzwxz}xfT^V\cku`YR//+L`nǬww{|W\ZQZKdͽ}dN]MVYMXKJf|~v{xfck{daiZh^][OQ]jfzqknu|acc\FehbcRVC0)?Q^yʾz}{lXQ]ONeǻ}tcTVZLPRLIj}uh}lmqqueWf]V[YOQeems~t}mms]d_de]^hpSNLA&)7J`rynSURQJZxηvmZKNGGAIL]swpmzemz}a]^WTIJK\^pt~|mrjT[]WJ`\P@98596^tʿ~z{rne\OHdYiŸe^Y\HKWDORcfykxplfbmh_KZ[T[\c_wqknxsdo\VJIOV_WbG=8906[pľv~}ru|snMJOOh˦xn_QT?HFM]htqêtmtvwfrmlzzlNPBKVcmr}|}u]\qxtafNMHLKQ[HIEH;;Liʯ}{mfsuv_VM^wsɳzn_S;:.PZ`vylro]dor[N?YKVd{||{acdvnndVWUT?FADM6A@MGvƲ˻|{ftpchbVBch}ɸ|dRGG32PUrlvxuwlfp]njd=CGHYQp|sirucfNYQBE@B5O@C=1HXuϽ|ywfl^kUS\]enżz{lV.657;Tk~}}kz~zboZe^V_PJ?OPft||r{Zehs[[\JO-.8><6>=RUrw|~tv`d^]\YflŹz{}neHH=DFKWkiv}|i{wh^\]fUWMPRcpvnl[Sg^WDE:A9ALG=8BQnkȵ|{ywnfjgnfSjkưê|wt[H?P=@MU||z}zzy|tw}qeghqc=D9Rcih}}}odWajjr`N?=8J>AF3H=P[xѺϾnjU_g[d[kdz}c_<;9B@Gln}lnZ[d^eQQ:T[i{o~v`[^zm_\>G254CA9G7PFT|ļ÷z}_nijkJ[_m{ƱxvrpGI00DEYcr|ijp{uz{cpeimGLABIR^y~cdSdfl\KN4A(-GCE::>VZt}k`_\Ycd]xȽãt~||w\@0<2?Xdpxoypc_XYb`IUVSZjtz~uvTc^XkXQ@2'30>RKDMP[yuɿͻ{zx{seadZkle~ʵqvwvRQ>@KBRUhu~|uoq`pm_mM0QG\_ls}k\TmrOaU0?<7C6=;7SI^lغԽ[jcY^ZY[vzdzz{qoP<2/DIOeqèrfsR\`RCWN]cl}r|wiSemisQB8-+(:DHA[GUn]ĽƷ{qwpmcXqfkZRpq԰īzvunnmb_R3M23Qats~vxzh}`kkbW?FKYrstq|ytWdMa`MREH.6.'DMKKVUyʼǪlmVScWNXtmϭ~ich[X@34:JRlȸēt}~xtqRb]RYZLNkml|kuuxjq_WwTTL4<3'*:BMR^]fxӽηwxrk}dPmm]Xecxjlf`k`fpT@24Cad¹}rlsdiv`[\LUgVozxgvxwaROOYfGLN5&"(NHCfUpϿum}y[mSKXWsk|ʺ~x~}mmY]nLRJ.?F[a{sw~fs~ojqTc_UX[YPgsdclwirmZZ\LPJ<>%&1?VadȰοx}kxmbdnXOOktiȮjmcL[hdTYBDAOjdulzswsqwqb]Q`cj`Spy}wqjv`YaNSMVO:0$1 5CP^t¼ƧzmvytjgkJEajwrkǯx|wwZ^\^]JZOKPGHi~§wva{{~krb`PgfIM`g{fo`_hxis_TIJiCB,%'$HR^|ջùýʬzogltaWMNQqtvuwu`Tl^PLUGQbOPdljx|h|vvriZEjp]cXZr|}oYvhrsQTLSBF)'6$'8;_uu࿱ϵnwguvcdV[`_Wrw{~}yeXo[VRVXbXMF@Y|qwvcvf^eO[UKSatuinjalPZM\QN76#2"+CYis˦zv{bvaOYQTLozh{e\`@NKZcTUQefxw}fovbc[mS_`aV\uwvtygkjsWN_:B48,+51:3Y`cͼ}w{arevi`_=cjyxyn~a`V[lOnaLP<]\]rŸs_syyrpvK[JRaYXss}zso`nWcWWV4E847*1&4Dpsùpv_kd]@PdYz|vhPU[W_QbIM^DYcmsz}tx]c]%3+FWvjڻ«lng[nS[RVoa|{oXiK\oMSJ^ICRK^iĭytuqukWERQbs}c\ziqoW^>1SE>AE++53A;eh~{musih\q_Ko\xw{~fgx^]bWcHW]SZ:Jirnu~xnH^[Ziqmgjmujkrc^kO;IQYSD7,5/1;SFkҸƯqlnqiZcg[RHagorfgdaVN^\TKKZDMflwvryz{j`S]eUmskp|s\]^_SAMULB/7)8R[OPVOBWXvyrqo}rdceWWjaskfylvrj^X^C@TD72/(/5WXl˾ʸkekfT]TV^CV}iusbeaO@LEXYC_jX\wòykvwqo]l[Ife`pxfbo\V[T<:9@P3(<)&5V_xѵwpLWjX\jw^]bvxhjcwoN\S>CW\O_iy{wʸznx^Xzrr~hXVXhq{r`aV`jNR\908I8:8>BAIXsüɳ˺}^\U[^`iknf|}ta`slc^VVOMPRZ^}tlfeovrrmfXUmns{qwqXV_hZ[RNE@;32$5EXh\nnxmMfjg`V[l`JjtxbqjVSfKGU?3% 3;%%GATeҴgbmcGX\U`ow{whSHYdI7OBNWtvtt}Ųr_`rnWis`bdtebgm{ibP@NXC-?27;LI8/:La{Դͺxitd\Xhoztgus}}ewhcbqoUBBMYjfqzspmi{qooyrwiV`RgqVh^]ZgiQ:48AL==;.IIQkԾoW]KXf`atne{rlknve_R=QKLWoXp~xzr]j_mse[g[Kpp|o|ddcekVWN4?304E"2=9HFgžȺ~gj_Hf]b\Nfvtrlud[[mGFL?H>Jnymm|uinmUwplaHWaWLhy~_i^TNaD=C+2#&AA0+CEctһ»®|TXbWCS^grvs~cbOKecK:JCUVu}vU[kh[agdkd{sdlbrYWI=Y^J-2+76CVJ?RbuϹ˳xwdvr\ShoryfbZZ_`tbMRbgylmquynvgutdpnvz`jli}y_USLULg_B:IHUG3D:I]ixƷƿz|b_fThlpnv}hqlvqRUJDZ^cmvv{q}nbxfgkh`lkazvu[bcbiLDC*:?CMbdfamvcca`mzrvl~{[hc[eYsXROp^^|ʼx}pmgssUY5*:8WrperupzZ[T5;5[GL]ru`quiS\[]rymvnl]Zl^RyfWeekkmv~z{wdbmpf^Q?:;@\ɹll}prxhicPM6VQAQToaa~oee\_oi~akrhppekVeYVUfihy|ĥҷuu~hhvgcUC;<Ij̾|yzqzu}tklOEF-MT@Son]yv|P`cYcm|pitlm}{bhfl\bj_s\|nqup}y}|~uhYhpJWG?<5NoƯ|}s|~zoyubZN=:W;VUctZzpnYfjm`yzbpy]vz{mzWfXZhbgm}d~Ǿ|}k}udjp[XH1G(*Owĵhtt}psq@P=1H=VUurvsi`ccjebpkTsjjhokgicQqlgzsntmvy~̷|{iseWaWOL;KD;W¾u~q|~|umznIRDFGD]\{nonswX\pheo}|Pwhqn~qv__^Yolpmqony}{~ϦhzotmlbYML:=;AXgϼqquyoxSP>9Q7NknsytxWj]akXkv~mwXRdxĦ~waxkaa][spyuunt{zzvùton`ZfQ1R;6TG`tɠ{{qudAC>JDZjoe}iu_ihdpmplsws[Ukg|zcmcfYuc}w_rlf~t{}uvov_]b_T;D5?DLqmƻ{h~}|_IM'MEIcuq}eqohd_ki|{|szhmiNYeƼjwzz_Ueh]}rpcpupwzkŰƭ~lzvbZaJeX*88EPns|z|k^^6A;Yoftzutnk\_{{fruZpbLac|ľŨ~|zrjkhjyurgfl\`yyuwǫ~pt}bWYPM_FEB#7LbtƶuyvuV\L=Tdkkqwzr\_uaryv{lmk^bXbanpqljhvzzplJblak~{z}[MVXBCUPa?-;doy|vutrt^OHblcr}t|j\hxhit{wo_Qg]Qgnkx{n}xov|ddVYaa\urjUKIAFEEcC2:Vxõ~xzgwezdRVaehv~~wab~xerx{{oxg\RYZWcot|zuvtiv}ggORfYPmy}zoUADD2EBUO<2^xrvqlsnfuhj[Zhu{{~xboy[criysq]aI]fMX}¨ö|owuvjtyl]^TZVXltsr}pLA<>><2U]I@]yy|}bcso|mmskc}zmzrgroUa_mzfiegT\i]Y}Ĵ}oturgd{se\]hRWry}tv{reUIA@UTSiṭ~vuypZD/19PKCYttxh}q]c\ZvĮ{ƪlkkaegV[_riZX\WqnYFTPeo}ohSP9%!#Ldl|opqulʼxTF?MSJUrs~zme]IK\WhxkQT^`d_ȸospsxcYYK[ZexvgjKE99:G]abvrthPQPNLvĪkmwsezxndmzvsyqehhva][d[@5ISijlſ~i]TIUpxxnk]S`gpɶupj{}pk\_lfz~zZOTZQOhx}|tkX^vjvnZYxdcVTSWdKCXmzyb]ORNWj]`expY[mthtyfc[XVXVIIbdq|coggXSbkz}ycSNRpz}]LNP?Fsz~i}hTQD::I[Sf}nrgtrwoz~q`L:OIfzncii{ilqnf[fsxd`]n{vyyX2'FkbfaSh||oXE?YPQ?B]lon{nacREHHfz|_QJJYVt_ciyowgeid__{{¢wxpfakyqzq{ȽvQYgql`w`EKJ:$EGZPEUyŪe\BWTe`]=EWYQA?QMHNR`nrsp~rpey|hvzlXmeqvfXGWrγpdP_iddspfhdojc]qhkVSd{{uokuejnzc[odvuT@]VGEPKg\{ugs||wnv]M\xs|rr[JZg_gxubXY[:@837>O]βz\hlXDZ]Ydy||iotyjcexvwhZ[^^[is{yoak`OgKI@YXYu}°x[ikan^j[`tlxluƹnabskkv}~aiskQDK7YjsyˮwyaXlizaRVN:,ESRUsxwmqdztmRZUdsbouqxuk{uu^|zxvh]gfrk\RTak~}neTBZVYYx\Rmeubijf^b[n}}}YvYTaVKY[gvxxpzrn\ZOLVh^V;?8Nszìs`N`cX@K`pc[inotP[]Yh}ty~UNWmZ'*E_R57Io¯gXddoPHKG[rgNHVsmd^Sn{ll`fv|aUD.G_}~|Ľpjv_^Xdmjne\Uc}tgs\=<>ESfrl`LQTRMLPRxrhwmkclo_TD5;,0/Qutyylw~wqkk^SSRX[nyür^WjtPRXsytmgy~~zvannyvs}yd]81)-:CcoejZaz}OI^ijC1:In{yvspp}zmvqi^cL+:8NVnt}žsdotlqzqw~ze^gRgol{qssnywTWS@IV^`D[szy~emzqysgth]bn|h@:FLbptsPWWYcuaad[ff\_VTYMH?RkxǸynEOa]iaūt}|zdFF#-JWqysjYUqx~wcecyuuuoggVfhQR2^smkdkcjygpyjmvwdE,\K\]`vbnüǩbmpvPj{~v|vsZveVjnTTMC.$.$-=DZ^پ[]kk]RZPGS;6M\zy{~}j|vuox~iyrgiFGMI[ayǝrxTOMX]`hXp|}xfnaSlpX_kcuzvv`Qd]`dowz^SUCUGS]dzs|iR^lXNVhQXx[T8IQ\aTrpĨqnzimlrzoujydufkz{vvkzNWO_LXT[YdIBHLYUglsh^M?UPMR4IQ`Tauyk_hYTS`ujfShm|{~to~m}kxuNgo|ly{sqmġ~of~rON>I:76?=@F@c{_zybkgRQI_`aGIT]c[VXlX3D9?>7Xa}q|xuS]\Gcūxm^jax[_EUvtwms]RNZsvnkqkt`]yrkrgcdtzrPZW^WREQdHFfowp|nkl|ykuy~|wxpohaJ::T]lrpxnxztxWHnhwnZ_ZiQ_xvgl~g`UVar`GV[ky}tt^Viidj[ַ~imjwvnouc`BCBPzglcY|~sgQjpf_svxXSsmocZU\?KRUX9EQ?AATrqm`bfUltq||~tzá·jf^h_Pytp§|cx~}kfcW8P\RI^flwRC^Zk^UG?J4>G[s`u}vd^dw^fa^kvmy{mqyjzkmv`W`__nɾ|z|rtx|ez{{T`m^JQTR[8//GMZafqcafjcZbrhr~jjUKVHPQepinNe~znp\Z_Papqsȷond{y|oL[dpsgjzVOheVYitvx|vsius`YoomgWVhecp]\P3CDTb̵ŵxw~}ttstklch|}ptrvs|}zKJLN`YHJf[Rwwwjr}|}deihiXtxaWgsrjVQdlqyqkcOoeKELfwönkki{zmtrd`QXSZgAGTao|}qmnnhn^ex~jdfbaFdl]e[]U;,?\`s{u~zw}utt|vlmzp~}}xq{e^lTVa\^U_acnqmsmdc``vsaiPXivw`[YYQ9[``igwzjc|ieryzfahumu}~xzo[JNXJf{~p{dbp_q{~t||suiecZXl\SR06CQL;>EWV\opy}y_W`fYezffX`tptskj~xjrjcbe`jvXKfnw|rtkcqyn~zimd\a_V_p`pcTjuhozqf\`hm}lp^D=IC;Pg{wv¸|k}~}ztdg`afkuys|tk}|s`botcdiTPO=EORVypdz~tkzrwybbhkzzky_Sdpp}yr}aoxrjb^UXkniWlxk{Ҷx}xd_{qhRLTb]^plm~rtu~zcmyuqkXintx}mT[UHa^>;AM`}yluhm~jdzw{z|z}yij_reYerkbck`P:Rbhf`sw~l^r|vpl[Zhjtpsw_XcW`wlpy~mqqnnz{vbphQbsqsomddTnǽvvrhmzc^r}ttzyzluthalh}pTLclg[UH<)69J^^j}zxvswprr}~|^UcTKgwxpuvpjmh[N`b`LLD[kalƷ~{nfkl]Zaf}mURjrtqtngb|t|tjli}xwe^USOVbf[``MMSjvq}Ǻrnqujg~km^[u~x|ynsuqpyrnmy\SPO=9=Ie]QYwm{ppl~}ql\\Zcryv}xttqshbsxjYjhdGBJWZ`wvvohpesyb_q^YZc^^gy~ncvry{|mVafc_MKAQThlbcngp|xr}ys}rl~|qhyxǴm|xw_O]epbijyzķzqnvfgkkMDNy\TZyý~rwF>f`J^pc^Wp}źgcx~\Q\RwjgP9STddZRVRSNmy}\QGQ[ar{}xxabjsluwg`x~ȹ|xdiiPPGUTfnacl|ter~xw\LH?FADbt|iQKO>OVcoidmoso`I;:AFTuyvhhje\oyncTejxvfnyqfulPPO\gp}]WEF?5Hc|iiTP\asofhmjb_|iKE@FGJ^jaicyreimul}us}|tnswfl]HHUeen|yfSQO`Xlunp{uxjm}jt`XRNTHCXeͺiQFDECNmro_JRNYZC@H^fbjiagLNOB6>JTNb`j{aZVaibyuuw~ymxworYTCB>.0EYδszw{ug~kaalnpƼƱxrxvolNMF70:IU\{|sfoh_kba_lm`[]Pc_]WC:IX^MTXNQGONBHWk|mb_fb`vtiXPWNe^QNYhlp~t|mqlb`gptwwpzyynert{xliUSK:;Hb׿pexxyyqddmifw}zmfmc{|rmt}~~usrYSC4-08=GeduobT`WOVNUXdhcedYnnxyh`n~}xwrdckϾr[TZYUg~~ulbhXhne^]cbama\dROB5059>A^]ckmxo^UJUXP]Vakx~kxwzn]`lullrdlYLE706HnwĹx~{|vovp]eRI;&!&/5ZlvyymthfovytqrZ[^Yh\JGQ]\\j^jeTNC:=Fhq}aOPVTZt}ļx}ml{wzvwsnxykwjh`KCHMQRr}}utqyxyqyd\ahdbl\eaND83:Foʾ~kjpj[\dcfz~yt}ywpwfdpkrpoh`ih[fXXQ9/7=CFlqxhbn|{|jkicuqa]dnov|vhcekƸ}|l\Z^\cw}žuojoX[_[efe]Wda_i[aX@6;=::[anxnpoih`e`V`NO^qurx{gnefyvihmuq~wp^MIKWw̿}|}yt{}smugkfY]J1*03/@blyxs^`n}zu~uhl[foh\\_`^rknypcN@?=P_i~{t}wusgd`_ml|u|s}}quxrsvxcPPSQG`nxsqis~swolldlvhtpeQ9117PXwÿnkmvnc^ZU[^]xw~x|}|}zsynysip`F:;;0@;6OUj{xwswymgovr||xvrpfv|u}wbH?=EUWxĬ{vx{soxut{qp{mdeYhc\cXC643(2FOnx||}xt}|ybgihhgd^]tq|}fROM[\f~|z|wl_\cXdsuzzkp~ttqo{yh_\YL[alxuxlkx|kqpptrl`ctlywsiL711A=Qhlyywjjobpuxwt{zyoo}qwtfUJC<3EG\rvzstvtsxuxylumZTVcZnz|yoz|zrhedVFFK@RWbwyw|~znpv~}sf\TLCSQbuwxker}rllxy{uvyhmws}t[E;;IBVfm|{|jhl`mnt{nnxohYUcZa_TI?4,$79Khr}zw{xpo|wq\OKZR^oqxzw}qnpl[PWMW_c|wsxxnbspw}umi^THTY]wss}ompxsqhafrqaTa[iqmk^K=4CFKem~~yjmdfoj|{t|xqs~xn[hfiqi`]TH8BMMiw}|~~~|sjn}wivrpaS]^\op|wz|vxwszlwwlikoeVWPTa_u·lwvz}tsl^KQZVluslpnkmsu~~vkm{ziqit}zn^QAHJK_bs|~~}nl`cjct|}ypv}~xw}p\e^elc[[UG5AHLer{}xu}pcT\UZfesy}x~p|pvgUVT:C>>EKTwu{~^`behzpPEB]i~|^LM=Wgjqustpfob^NTCB[RlvujQE?jsng{~yo?>Pdu{NQp}r`g\ReXmvzn^dJO`xɫnD\ӽyGHcvsvgWEJD\m]_a\\RBELe|ue[RV]ssxt\WWFNK=Odlrtulrtzq}wbUianucWPYXlx}y}z{~cjmgy~YO9=IXq}~a:%SڳdU>@9Ckuojkqjv{_cdd|{{tl]XVbduyweoi\MONGYSQhrǾ»~m_lqiNJN@^t|yxlVSPMGYeIILOghVFOdw{|}dd^^}a<.5/Yмj[b^`cYZUKGXp`chbndL49GMciik_V\dqvqoturVYWSVQPWep~yuvzpcsysyhz{|l]JCI\SXgeyzvn|jgpbpx̹˾ȳ{kraK0)/iǺfSS]c\K5703QUeigggiinksjmt|rpvwskua^`YPOY\dpxogjqy{|sssv}zbNC;_rzzu}x{{vdbag`j`[s¼Ϸοé{rYEM[C/%0Yѿ̵s_PR:30<87>Bd~a]hlup^YZRbgvvtt|~{itn{}trkcKTQZhxzu{v~vvvp[eR\\@1)H@=,(?bҿpra^[Zb\]btqkWKPPfe}u}|}}y{|qwzf\CPegW[Yxnm^SP=A:HOMRgvolXbczphrvxdqko}~}tnsp~tfm}|}bRg\rrWH;QBC46Tm}~xwbcdi}xqvyufgoxsrsvr{wqys\oldX?MXr[benmoVNCAOMdhaexqic\c]qj~zbkjiTIVM_s{w|iz{k}nz{yuRX[I\D9%-@>F/=Yxϼ{thuis{oo|kl^nq|wwyl{~nanacDD_u}fl\xomjQL=G8>PHG^kbfXYQer{{g^jkk\ohlxxjqnyphjqurjz{|^PdPgfYL3=IH;6Uk__hw̷Ⱦ~y|str|ts{szwyhV[geYI\rf`dr{wvh\j^bnrkbpoyrYZXd{si`VRabZa^nxzugu{rkpoklxvms}]bqmljlZPE5:JKB/?\WSXhwɻȲtvu~~ulfsxpwuzncPSdd\ERpkdbluzp\kdepvq`fdliORS^w~nc_ZTad[_[iv{~o{qjponly|{j_dqtX]jfgdl_SH59IJF3Eda][jvɺʵwyvzsz{v~ylX[hgaKYqhaZgq~{vdqhhovsbimyuZ][bysig]Q_d^`[irt}yoaox{}uospniw~ujmw}_]hfkgncQH68JLK5Zjje`wxǯuwu~{piqx}tr}srsvvx_RDFS[bLTorrfs~zzwtr~uml{y^ZZ^kzsdieT\dnmckwpy|}}yvnrel|~ygc_qaQVS`^`iSB82@IVM@\mqnmĬrtu}y~nmw{z~x}vprmtyss]RHOYccM]twvjz}yxvuttjm~uabaiuqfmcZbhrkcp{kzyx|xxqopbux~pf`hv_YXYe]hfNA66CMXGKgorhp}Ž|vtxz{kps~qz|||zmnkytz~eRFBMVcTNirukn}~~{yt}|qjz~g^\aiwvfijZ]aordjvquz|}}yptej}~zjd_pcTUP_^bjTA74?JXND\jqllĭ~usx|{noty{xzzu~ooivuvkVKGPXf\Ocpuokzzzzu}uiwlcbgoz}llo^acpudgrrq}ty}||xnsfj}}ykeasj\[UcbemYD:7?HWNDZgngetv®zv{}qrrqt~||xpmgwvylUHDKSaWK^kphdsux~xjyoe_djtxijo___ltden|ro~x~~~rvig~|oh`oiYVO]`bl\D75=EVQCSbjfbrvƵ~ztx}trr}zw|v}srnfqwurYJGMTcaPZipmdqs|~zynqvicfot~tktgabhylbjt}kyvyx|}sqnaw|~sl`hqc^UZfblhP=8CUWLRanpiswyv{vuuvyu~wszqf`opvzjPCFIQaZS]juqovz{}krslbekltlhpgd`h{oglypyv|ux}sql`q~zyrl^cjaYKO\]feO95;>P[RT`nvov{zzr|||wvr|~tvunywoc[jnsxkPAEIQeb[bnzxu{~yyko~rk`dkktolskgbj~sko{szv{}orzqng\nzywqj\afaYKR^`igQ:7>BT^VWbrzt{~}yt~}|zwu}~qztpxvo`]kmtvgLBHITd^Zan{vw{x}hu{qk`ijkpikogf`p~nkn|txu~zqv~oocauzxtpe[dd`SGT[ag_F59>EYZV\fwwv|~tw}{}}zs|}yq{msurgXbkpwqYCCIL`d^ahx{w{}|xol|tocdkioolsnjch}wlmxuxu{oozsog]lxyvrl]`cbYJQ\bifR:8?BU]XY`pxuz|zw}~}vw~~{q~rsvvn\akpwt`FCIJ[b\\`owswxzul{vrhemimnjqmjbdzvjiruusyrq}wqi`my{wsn_ade\KPZ`gdQ87>?QYUW[lsquwzy|~vx}||spstvm[`jqwt`FCII[a^^`ovsuu~~{vm{xtjfnjmpouroffzxljrvurxqmywqj`iv{xtrbbdf`NQ]dljZ?:AAQ\YYYgrpst}}zzw|~szwuvyubalszykOEMKYd`_\gsqsqyx|nx{wqhonlposspjbr|pjj}ysprzxlttoces{}vwjcegiXPZakldL:ACJ[Z[Y_ppsqw{~z~}w|xtstuzn^fmx|xcKKOPbedbbrvvut{x~{wnyxxmjqlmqsxvukj||qlrxsovzpivyqiahs{yvvgeejhTT^hqqeK@HHT``a]fttvs{{|~y~z~tt~vww}oaiq|~ydMOSUehhdcrvwuuzx~|wpxwxmlqmmqtxvujj|}slrytovxmfpįzhkrubU8*.,5BKK@J_YWOVOOkorǟwbgk}pPHE=AITZbdYaqgWKRZ\echpqpb_ixfgpMm{}hiv|m`LUo|kNcyhdclhcoz}{~mcfδu5&YĒI(+Hh|skecMAKVfjiWGLOVejpnsĶ~rafo}ub]\UU[chkmcj~~~}xugVg~lfoy}odWFEI\aYgxzuxw|lnplidnqrgh~o^chpqrxb? GƵs\SOJUSW]fp`X^gsur^OW\gx}xnaUcgemkmo{c[Xal}~ub\beswl[^xuw|h[RWH7?FV\[N:;BFW]cc_q~srryô~~}÷yiQC;-%5i¶{fXQA?=JOBHUgstmXQYYellh[]c`ZMMDJ`fouuvwg[VY]hc[ckwyy|tjqrv|r`Uh{ops}zu{jeju~wbV^dq}pmptǽeVG::3+-Qt\M@?E3,3@OQL9+13;FIMCAMORHJHKcow~|x}qfecjeVUXad_efdfr~wz|||w{sbR]|wspuxqvoljqsnvpvy}njmq|ƼŷsWLB8;6-)Cso_Z]I=?GRPJ8'+-6@EKBBOUZRUSUmxy{yxu{tgcckkfiiegt|z{q^MXu~~x|zpoc]V^j^\esvhnqz}yzlgjmv|mSJC;>:0(9c{uzgYX^ig`O<>?EOSZSN[bh`a_^r|yytry}wyxutxyqaMNi}xuh]TR_WMS]pushXY]dou}woy{upivylegkr{vlVGE<>?8-/Qtmjlx|wlWNQR\`hh\bltrkleoy{~uqpfUHWt{uf\OU[LIN\ijeVKOR\cjoedmtvljccsz~zrfciox~{zzwmcKC@;A@91EHGNo}~ukkmuwtu{zvmr~{~fr^T`N\YlvlaeqwY\_armfTXK]h_oaScde[^W_n^q`bldcizxvjmrzkm_tx}wwmmt|xqkstl`[9=>BGRLRhw£y|ppwy{{yxzbdp|zwx}xU_\Oc[Ycn}oniqa\qkqoYGNY^oee_OblrgaMOi`pmbmbY]xv}zt||fpqq{qc`oxrzslcyg]_7@AYZpʻ~}~~~qoqht~~pur~{[\^RORX[htslznhcy}wbW\i_^cfYe^hc[IM`]dcejsgfo{vfvtpcm|oefz~r{xuzla[pi^RJ:HDDHWXK`uu|{{mlkfuyqnsnXLLRW\\f~w~wepvulaYPZegdU[XxpcY]ZR]efjo_el|mwyrp|{h_ox|skc`kjqm}tjhm_\SP@C:AHOHFZk}̺ur}}~smiouzwzpv}s~lRQLRLX_`{|zuphyszze\`hXg\[Ydmja[NPYdd]tdqekvouq|yk^jsqkhezzxiopx|rhbXbWY>C=@M@INae}¾rxuvgcun}}z{{vuo]W\O[MTZgynplyzxvo\eZ`dgTWfirVQJ^ZkfYiggmu{}~syvlg]gquqqdhvv{wm`unl\U\fX]<69;GQMWYoƸp|q~mZin{~}}||qq|}|\WNTY`YVjmzm{o|}ryV]Xfho_KYghhWJTUilkZj_j}txyuhclc~ksdZjvzx\`iqojQUY\YT9/;7XWeds}ɻyr~rvnXmi{õtiovj}`]MPO[`Wmz|rtoyuun]\cmoi[IiXcYQTQ_ai[ejj~t~jomviio[nlgmebw|rrYdi_iSZSUKO8.;CSkjkr{unjWgr}y}aitptpWQX\[hhk~stvei_g^i`eQKf_]bVN[gfdp_rl}|}{vwlpynjrldkVa`ottkkeWjhhZJSQZWMD4FMS``wz|¯ruirf^r|~~y|zpmjnp]STPa]foi~py|~xo``[jvhe]`hRTLCR_migrmrx{jmhrwxsfhjzuad[gqivg^kfk^XWUZW\N=H;GMSogg|Ǻryv{`]dl{ywjityf`UIVN^d]u~p|o`cmojqa\cZ`PFYSYbevzqpz~~vzprtzpan|vlhZbahtijtfc_dh]S\[MML?@=N]R\ltĽ{xw{cefdr}zjn}qlgXYHJWQ]poq|hovehkjlXaeTZ\RMTkvvrwoe{ywu~ukvymskffXfjg{wjb_mqg[]VLUOLF7IIBW]fryuzmrfeis{~{{v{xnkhefUIMGVhbci}ukdboui^_]ffQMN\uoq~pbft~pvuliktn`^^au|mgflthhhQLNQXRKE>HGWgt{wŽ}ps{orpsqbvyxw}|qu~{u|t\`kol`YNRWKWbu}uhioopomeehY\Y``Tdphlfnp{ov|yucintuld`de[kqzufig]ZINT[^WQF>ABWcssluqo{xwi_k|}w|vrqpz~zrdeenicbaZMFT^txw~zzrylhqsp_Va_h]WYZdcexv}|}~xvmhtovllqjg[R`h}tlla]US[P[YXXPO@>TZljp¿´rk}y|icjiuqty~}ylm}|yhiuil`aiegQER[moxx~lhqrwcV_dk`[WOWWgv}wz{tblwxxfgtrmVT[cqrqkb]NZa_[PVYQUHHNW]`p}°~yyu{ummiifbzt}mut{x~qcrr}gXghidVTL]airt|u{mvnrnfeZhde^RUGSko}y~wihsumipkug[[WcconeiTY^apUQWNWOVVIQQ^jwpz{utotpmjUiw{uztpoo|{iuo|yafddhYaXSW^cdtto~urkfogecgaZ[JL[e}wzsv}yutuoqxklhidZ]_baim[dabl__WIRPY\TIGSWgtk{zsotqxkZhg{|zz}s_onw~ozpdkhf`ZdYfcQ\Ldfpx~~~{egcbkhZ]aK[f[ygs~msl|xvt|~g`gcche_hda[^dsdTfVJ^Mf^RREED`YptǼ̮xzxr{svgriwi~znqbc}kxzwhvjmZ`^bdcnMSSBktesoi{uj[``\dW{j\x[gwtut{vuoc[kthXUN]cewrxdZi[\N`lQZFCGINC_`uqz}r|nkbrduz~~yzyq}tuyun{jyurL\]a]i\FWJUlf}pvvfz{rrR[Yda`pQZfdyvvtm~|h~quzqrjpul^]]Mf|o\UeY]UbPISTbVPL:Zdlvoynyq|cxuiqnx|{ty}wxWjv{qmkpoud\]etdaNNSTsisyoqyllfhynbc_r^cX^bxspwujp}yqrpjm^`_gK\`[shn{fYWduWNLYJV_DPUNXbi{qľu{zrxjyqmxxq}}~~|nuusitw~pvsende_`j`YXURMSkdu{r_jldr[mu`X^PVWntw{uq||zlngcoijrdUihci[qeea]gaKFQKGTaTjV[Z_xrs~v{srwvf~xupy{~}}hpcysrnmkg^[lep_hbgjO\[]u{ozzfckh]qgtwaqadVW]bkyzslt~}ksjbUmjij]ZSVj`Ylat]WW_RAYT[d\ZUPph{|{´÷~{kn{uuvmohy}zxuqwudnli|}u{nY`dm^Zc_cl^pWY\ex}|q|_mdjwcbm[e^aaQVbpsznepodWddlzdhNc^Yc`kdTSXZRN`PZKcgYh_`ttȽ~~pzrkjyivnm}om{j^uqp}uzmdkh`Kl^mm^loffbRhxézpwfsYfncn_c``Rb``n~pprk`uYcihq_TeUcgk[Q`XlQVZ[\^\YX^fdmm~{xxƫv|syw}jgclzzx{zuxitYiq{jjlwefb\_eh~ritaZcgj~q{qtuofe`_iyrZ\Z`Zhm|{nio}om[Uy^rbQUalkaN]^Tht\dY_c^[i^`sjri|w|y}{zysafzl}fk{sz|v_^ouv{xodomi[kkvpyf__anXq~~xv~jqqiZnhpg_aYS[zj|{`nortmiT^ohli\kcaclT[ehpd^[^St^\iagg`tv|vvevrjpn~wwnvmpiertyoloful_qgu|ngrreZle{p~mQ18/1FBFMUYiZVZfs{vq[?TXa\xq]OTZWdkwvz]^UJ\^giffxy|v\H@L8HROljqe\RYǸrqnmyo~uWrqMNZ_lq}qaZdCI]U_dewƬþ¨whMNfqjXa[]{z{}iI:1.2QV>FHQ_TGAUopxkgzhg]B*6uʣ~iSK`hmpZNLHHXp[T][pn]EDT_vytth^chlmmw|~xpd_[CIOEEGMYjkh`hsuo^bmTXY`{oeZRUnwagis}pd{yw{wujz}ûʮͫc??K9$4H|Ь}[QYfiaN65'$-D?0:;OPA*#9Gcloqnlkwy|rxztknRLSRKGMKTi{tsx}uleiuqc{oXOW]j~um|vtgn}|zp~|hmtmwu~ɼƢwvqzoK+'A71+?WԳnjl{p]>;'$+=>047MPE/+>Jiq|yo}wz~{w}`\_e]V^SZm{qs}t}w`vxdUKYfhz}b[iyuoj\fqywx}hwz~~|p`nurvr|zv|˼ȴi`dZk[=#,E::3IcЯ{lTR:/Ieȵ}pb[a]pmbh}ug]cctur~~tzv{qTfhaT=Pb]_^lotVK=;CBZZPXqlfZSVWts`psv^^jdw~sutlevmxfq{w|kGYPRfMB(=CC;'C]̽Öwgcfaxxkq{ogihrsqyw~{{~tV_gbX7H\umhfkqw_K?I`WLbqdeVTLZnt{i\mojScbd|}n{yklonjdnwoyugLaLU\ME+SeXQkpefWTK`m|xy]\jmaTf`l|m~zislnfimxpypbM^EPRLC+:DU?5VgʽͿugsjjs||rimlzjt{y}v}yfujjPGTacBOfsysj|{\FEPAUh]Rhpei[TL\n{uv]YfkaSfdoo|}kpqlegmqqxyk|z{gJZEDLGF,3CZP>\pпŨ{itrizwtli~ls}no~{}~sy_gdeVAM^nSTmv}wg|fKFUFRjcUbrglaTMVjyur^T`idUfgqpypovlegmmtwuisvvjKTC:BDF//B_[KexƮkwulxuli{jpyos~~ssZ]^cTAKcrY^r{wh|iKKXHYlfWdofn`SNWj|qnYT^iaWhgyo{ousibkln{wurcu|qtcLR<8>FC/2Kh[Vo~μӽį{oru~~qkmwkr}}n{~ttfTY_aMBRplZjwqo`IXVMgmcYljkmXQP^ryneTWbhY`insr{olcdmirzzwntid|}pnoTOG37AH;.<_gVdvǵľp|}qzwmlv~onxru~~qlUT\cVCIhr]cq{zn}nNV\NbmiYdkhq\OPWn|ngXU]j^]fgvor}qfdmjmv}ymo~m]tzolo]OK63?IA05XgV^n}ʷƴvw}zmntrmuuu{~slVR]dZEGho]akwssR\_Tgnm[djjrZPSXq{mfZU]i]^cg~ppvrfhnilv~yjm{i]sumko_PI52AIC05XbUZfvƷ̹|{{oqtuntwvy|unYO]d^KEdp`_ds|vZ]eXgora`jjt_PUUk}mg^UYha^abx|rl}z~wignljq~lktqZkrmklhTM;/>IG9/ObXW]p{ʹĬotr{rp}wzx}pbOUdbXBVpha_mv~zo[i`amso]fhqnRTT]wshc[Sag^a^l{}{is}~zqgllkjwufkv~`\ljjglaOF31EHG39]a[Zewмyquuznt|{y|ujYJXbaTC`ridbtx||jalagnvm^fiuiPWTa{nfdYRcfab_r{wiw{}y~oilkjhy~pehtyZZfdgbi^KB01EHI5?bec_l}ʿϻvrut{lt~}zxseWGU^`WEauokfy|}{rdmfimxr_ditkQXU_wpff\Qbigfbt~}kv{yz~rkmklfu}tdgly^U`_e`ecLC3.BGN?>bnmin}oup}}nm~}~vz~|vbWEK[]_IYwvuk{y~gnjimwyedhtqVWW[q~ref`R_jkkfsnv}x|{unnkmeq}wefhxaS][c_beMB4-@HRF@dstqs»¨}nso{}nm|~twy{ys^RCJX^`J]yyyo{~kpllnzygehvpVYW^r~qeh`Ubkpmhwny|x{{}sonkmct|sedjw\U[Zd]ebJ>10CJUDHluyrzƿʽvopr|}{jr}|~pws|zzhWJAPXbXLjz{vrwpqmnrshenzeWZYgx{jfjZ[gnskm~xowx}yqqjmgf}~ifbslUZW_a^iVC8-;FRQA\swvp½ǯ~pqp{zqmy}{{qspv{uqZNAJU__K^wyxnttpppzmfk{nZ[Zds}ofmaZdktnixm}y|z{{ttmmjbz{mganrXYV[c]i]F:/8DPTASmrtl~ɶ~rqpzzsmv~~yyzrrnt{urZMBIS^_K[rutjz~ywtrs|pgm}o]]]gt}ogn`\dlukgu|m~x{||wwnojc}|nhaoqZZV]d_k^F:09DPR@Qhnogx~ɸtrq{{unv|~w}wytrmq{uw]NCHQ\aLUmqsgtzzwurujj}ua^]fp}shof\chvoepzlyzyy}yzrnoau|tkciu`ZWXe_jfM<36ALVDHbjofo{~ztqy{}otwv~w|z}qojyuz~gRFCMUbVLcntlkyzyytz|rgt~ja]bkw{lkp`adpxiitvo}vyzzzymqge}}nhapm\ZS^cal]E72;CSRCSfnngw{Ǹwss|{xqu{w~tw}vpijxr|y`LCEMYcRRhqvkq{~yys~|qgx{ha]dkwxjmn`cdtxilusr|uwxyzxlpcf~}zmf`pj[XP^`bk[B53F[]U_o}{{}yprz|z{xv}~zn|ou{qj]ammvr[E@GL]f]`m{zyyrnextha\ghpqhpmggh}}oszuxxwppu|rji[hzxxqk^_haZMM[\ffS;4K[WV]jxtx|z|r{|~~}zurvwpxvrc[imtwjO@EHQb^[`jxvwy~x}~hrypk`gjjplorkibqqmo|uvt}xmr~}onaaszzurg^eecUJW]ei`F5:>EXXVYcstuy~uy~|}v~xqquvul[bkqwr\DBHJ\a\]brxuxy~xsjxtpfckhlolsolff{{nmtwvswqmwvoi^gvzxrpa`dd`NNZ_hgX=5=>M[WX[ivtxy|u}||}v~ssypttteYdksvnUAEHM``__evxxy||zolxrpdekhlnnsonei~zpnwxvrx~nkwtnf]huyvro`abe_MOZaihX>8@AQ][]^lyx||{~u}||x{~qrzpssvgZdkuxqYDHLPceddgx{||}~{wqiurqfdkhjnotrqii~tpvzvqv{ngr~unf\cpwwrrcabedQNYakkaG;DFRaadcl|}~|vz}z~z{z~sny~pqqvn\bjtyveLIPQciijix~}zu|uhrrrjdkhhnpvvunj|ysu}wpsx~pen|vmg\amwwrse`aegUP[cmnfO@IKUefigo|}vz|y}|yx|qnx~pqqwn^dku{wfONUUflmmk{~|xu{}riqqsjekhhnsywxnm{txvmfkmu~vc_n}wskdjrysli[[^jo_bjrywmWOXVbjkrq}x}{{wzmlotyksutnuwru}}xsbihkww{z{yyxzpqrvvinw|~ruvru{|wjs~w{ojlitsbR\|qeVV_infibZ_gvofot~zjX]`aprxx{}}|~|~vxr{~tho~okqzxytkot~s{~tacgftv|~}{}xyvxy~ss|y{pcbZ`f`X]u}ykfhmrhgbXZ^mj_egpsnbORWWeioss{tws||}rrksytknyvy~yzulos}qvw|p_bfgtw}~y{w~}|}vw}{}||ka`XagaY]u|zomotynoj`besmbffopk`PTXYgjqsr~~xpso~|{stlrytlk|xz~||zqrtrut|{rbdiiuy~~wyu}zvz~|{}qccZ^gd\Zm}{|rnps{srrgggrsdfdjpleVU\[glqvrz}|ynpmu{~vvomxwpjwy{||wuu|ussu~{wkdlksz|xvuv~xyy|}w{icaYcfb[ax|}zoqqw{swpkjlwmefdnokcX^_cnowvt{y|smomz~}}uvlpxuom~z{}wwvrspv}zvkjpnx|uvsxyyy|}v~xfd_Ydfc^g{}zprryzuzrnmowmgfeoome]dchqrywvzx|rmnmy}|tukovuqoz{}yxv~stpu}{xnmrpz}vvswzyw{~t|{}yhc`Ybgfbh|}rrqv{u{vponvphhdnqokbfgissy{wzx|vnomu}~|~ttlkuwur}z{z|zw{utqr}|{tpury~xutu{zv~{~~rxx{}zxibaYahigj|srru{v{xrpnvqiiensqnfjjkttz|xzx|wnomt{|}sskkuxwu{{z|{x|vuqs}}{uswt{xvtu~~|yv{}}{rxvzzxufc_Zdikio~stsx{w~xtqqxqmjhrtrnimkovv}|yyx}toonvzzzrripwywx}|}|{x}vvpy~|ztvvv~~vvsx}}}{wy|~~}~ttvuzwxncd\_hklkxyuvv|y}~vurwwppinvtrmnnmvvz~zzw|zppmrw|||stlluwxv~~}~}z}xxru~|{vvwu}~~wvsv{~}~|xv~}~~~vswtyxxqee^^gjlku}wxw}{}yxuwysslnvutoopmuvz|{w{{qpnqvz|{tulltvwu{zzsv~|{wxxu}~}vusvz~}~|xw}}~~~~~uuwuyxxqfg^_gikju~}yzy~|{zvyzuumpwvtpqqnvwz|{vz{qpnquy~|{uumltvwu}}{|tu}|{xxyu}~|wvsux{}~|yu~|~}~}}wswtxxxthha^fikjq|}z{z~~~}zz|wxqowwvsssovxy~|wy}tqoosu~zyvqkquwvy~~~zt{}|zx{vy~~||vtsvw}||vz{}}|}|svutxwwnhg^bhjlmx|}{{|}~~z}|yxptywvsvsrzy}~{v|zrqoqsy||{vvnlsuxw~~xu}}|yz{v}}}yvtsvw}}|{u|{~}~|z|yrvstwvulhf^dilnp{}}}|}~~|~|{yqvyxwuxst{z~|w}zsrorry{||vvnmsvyyyv}}|z{|v}}}zvtsuv~{|{zuz~z~}}{yzxqusrvuunig`djmpr|~}}~}}~||suzyxvzvt|{~~x|}uspqrv|}z~~wvplsvz{|v|}}{|~x|{|vtstt|}z{zzuw}y~}|}}zxxwpsrptttniiaekosu}~}~|~~}~uv{zyw{xu}|x}~usqrru|~}z}|~vvpmtw{}|v|}|{|~x}~|{vtstt}}~zzyytx|y~~}|~{yvwuptqqtssmkhbhmqtx~~~}~~ux{zyy}wx}~x|usqrrx{~{}||{vunpvy|yy}}|{|y{xvsssv|~zzyywu|z{}}{~ywuvqrsorssqkledkosv}}yw|{{z}{w~z|wurrrt~|}~{}}|~}wwpntw{}}x}}|{~~x|}yvssst}|||zyyxtzzz~}|~ywuvrquprssrlmgdjnru|}|x|||z}}w~{|yusrss}||~{}}|~}wwpmsvz}}y}}}|~y|}yvssrt|{{{zyywu{zz~}|~~ywuuqruqsttqmmfdjmqu{~~}y}}|{~~x||yvtsst||{~|}}|~}xxqmsuy|z}}}|y}|zwtssr{{z}zyyxuzzy~~|}ywuurqvqrttsnnhdilpty}~z}}}|~z}~{{wussrz|z|~|~|~~yxumqtw{{}~}|}{{{}wussqv|x|zyxyvw|x|~}}}{xutspttqsttpnmefknrv}~~~|~~}}~{|~ywttsu|z|~~}{}|}~~|xxrnsuy|{~~}|z~~{{wusrqx{x}~yyxxux{x}~}}}|ywtsrousqsssoomehmpty~~}~~~~||ywutsv}z|~}}~}z|{|}}{xyrnsvz}|~~}}{~{{wusrqwzw|~yxwwuwzw{~}}||{}yvtrqottqssspooghmquz~}~~~|~~{xvutt|{{~~~|}|zz|{|||xyuosvz~}}~}}~|}{|wusrquzw{ywvwuvzwz}}|||y|yusrqnstprssqppiiorv{~}~~|~{yvutu|{{~~~}}~|{xz{{||{xyuptw{}}~}}~|}{{wusrqvzw|}xwvvtwyv{}}||~zy{wtrqontsqrsspqpilptx}~~zxvutw}z}~}~}~}{zw|~z{||zxyrqvy}}~}}}{}}~yvtsqrxxx}zwvvuuyww|}|{}|xzyusqpmquqrssrprljorv{~}zwvuu{{{~}}}}{zwy{{||{xzuptw{~~}}{~~|zwusrqwxv|~|wvvvuyyw|}}|}}xyzusqqnpusrssrprnimquy~~zxwvu{{z~~~}}{zwz|{||zxzuptwz~~~~}|~|zwusrqwwv{}~{xvvvvzxx|~}|~|wyyusqqnqvsrssrprmimpty~{ywvv{{z~~~~}{zxy|{||zxyupsvy}~}||{wusrqvwuy|~|xwvvuyyw|~}}}}xxyvtrqnovtrsssproilpsx}|zxwuy|y}~~~}{zxx~~{||{xyxqrux|~~~~}}~}xvtsqswuw{}~ywvvuw{xy}~}}~zwywtrqpnsvssssrqrljnquz~{yxvw{zz~~~~~|zzwy}{|{zxyvpsvy}~~}~}|xvtrquwtx{}~~xwvvuxzwz}}}}}yvxvsrqontvssssqrrllpsw|~{yxww|z{~~~}{zyvy~|{{{zxzvqtwz~~~}~||xvtrqtwtw{}~~xvuuuwzwy}}}|}yuxvsqpomsvssttrrsnlpsx||zyww{{z~}}~}{yxvw}}{{{zxzxrtwz~~}~~}|~}xvtsqswtv{}~yvuutvzwx|}|||yuwusqpomrvttttsrtomqty}|zyxx||{~}}~~~|zyxvw}}{{{zxzxsux{~}~}}|~|xvtsqtvtw{}}xvtttwzwx|||||wtvtrppnmsvttttsstoosvz~|zywy}{|~}}}}~~{yxwuy~|{{{yyzvsvy}~}}|~}~zwusrrvuty{}zvuttuyxwz||||ztuurqpompvutttsrtrnqtx}}{yxx||{~~}}~~}~{zxwuw}}{{{zxzxsux{~}~|~}{wvtrruvtwz|~|wvuuuyywz|}||{utvsqppnouvttttrtrnpsw{~|zyx||z~~}}~~}~{zxxvw}}{{{zxzwstw{~~}~{wvtrruuswz|~{wvuuvzzx{}}}}{uuvsrppnqvvuutsrtrnpsw{~|{yy||z~~}}~~}~|zyxwx~~||{zyzxstwz~~~}~~}xwusruvsvy|~~|xvuuvz{xz}~}}|wuvtrqqopvwvvvustsopsvz}{zy{}z|~}}~}~}{zyxw}}}|{zzzutwy}~~~}zxvtstwtux{}~~ywuuux{yy|~~~}zuvvsrrqptxxwwvuturorux|~}{zz}|{~~}}~~}~|zyyxy~}}{z{ytux{~~~~}}~zxvusuwtvy{}}{xvtrppooqstuwutsqponorux{{|~~}|zyyy{|}|zxvtsstuwz}~{xvuuvz~||}|xvuuuvxy{|}~~~|{zywvvvwy}ywwtrrqrrrtuwyz|}~~}|{yxwvwxy{}~}|zxwwwz|}|{{|}~~}~}{zzz{|~~}|}~}|{{|~~}|yvtrtyzvqnlkklmnoqrssrqonmlllmortwxxwvtrqppqsux|~~~~}|{{}}zxxxyz{}~}|{zz{|~~|{{|~}{ywutrqqqtx{wsqpoppqrsttsrpnmlkkkmoqtvwwvusqpooprux|~~~~~}|{{zz|}{yxxy{|~~|{zzz{}}|{{}~{yvusrqpqrv{zwtrqqqrsttutsrpnmlkklnpsuwwwutrponoqsvz~~~~~~|{{zzz{}}zyyyz|}~|{zzz{}}|{{|~~{yvtsrqpprty}zwusssttuvvvusqomlllmnqsuwxwvtrponoprux|~~~~~||{zzzz||{zz{|~~|{zyz{}}|{{|~~{yvusrqqqrtw||ywvuvvvwwwwutrpnmlmnortvxxwvtrpooopsux{}~~~}|{{zzzz|~~|{{|}~~|{zyz{}}{{{|~}{xvtsrrqqrsvz{yxwwxxxyyxwusqonmmnoqtvxxxvurqonopruwz|~~~~}|{zzzzz{}~||}~~}{zyyz|~}|{z{}~{yvtsrqqqqrux|~|zyyyyzz{zyxvsqonnnoqsvxyyxvtrpoooqsvx{}~~}~}|{zyyyyz|~~}}~~|zzyz{}~|{zz{}~|ywusqppppqsvz~|{zzz{{||{zxvtrpoopqsuwyzyxvtrpooprtwz|~~}~~|zyxxxxyz|~~~~~|{zyz{}~|{zz{}~{xvsqpooopqtx|}{{{{||}}|{zwusqppprsvxyzzywusqooprtwz}~~~~}{yxwvvwxz}~~~~~}{zzzz{}~|{zzz|~~~~{xvutssssrrrstvz~|zxwwxz|~~|zwtqpooqtwz{|}|zwurqpqsvz}{vspoorv{~{yxy|~zvtssuy}zvsrsvz{yyz|zupmkjkmpswz}~|yxwvvvvwxyz{{zzxwvtsrqrstvy{}~~}||}}{z{}~}}}~~}{ywutux||yxxz|~~{ywvvxz}~{zxxz|}|{|}{wrmjhgilpv|~}||}~zvrpnopsw{~{wrolkmptz|z{}~{yxz}|ywvvvwyz|}~}|{zzz{|~}{yxyz{}}{zz{{{||{ywurpnmmnpty|{zz{|~~{xvtsssuxz}~~}zwtqopquz~}}~|zz{}{wtqpopruy}~|}~}yvuuvy}{wutvy|~||}~|xusqpoopqrtvxy{}}{ywwxz|}~~}{ywvvvwyz{{zwusstvy}~~~~~~}{zyxwwxz|}|}~|ywvx{~{wutux|~|zyyz{|~}{xurolkjkmpty{wuuwy|~~{ywuuvwxz{{zyxwwwxz}}|{{|}|yvtrrrsux{~}|~}zxwx{~}yvutvx{}zxusrqqrstuuvvuutuvy}|xvvwy|~|yvtssstvy{}~~}}}}~~}}}~}{xurqrtw|}}}}{zyyz|~~}||{||}~~|zyyyz{}~{wspmllmpsvxzzzz{~{xvuvwz|}{xvsrqqrtvy|~}|||}}zyxyz|}}{yvsrsw{~||||~~|zxwvuvvxz}}zxxxy{}}}{wsolkknrvy{|||}}{zyxxwwwwwwwxxy{|~~}{{|~|ywwxz{|{yvtstw{|zyxxxyz{}~~~~~}{{|~|ywvwxz||zwsolkknquy|~~|{zyyyz{}~~|zxvutuvwz}}{{}{xvvwyz{{zywvvwz}~~~~~~~~|zxvuuvwz}}{z{}~{xvvvxy{{ywtqnlklnqty}~}|{{zyxwwvwxy{}~~}|}~~~|{{}}zwusrstvx{~~|yvuvy|zurqsx~~{{}|xuuwy|}zxurqoopqsvxyzyxvuttw{}xvvx{{xvuvwy{}}{yxx{~||}}zxxz|ztpmmptx|~|}~~|zxxxy{~{wsqruz}{|~}wssuy~}yusstvvvtrnkiijnsy}zwwwz~zuqprw|}zxy|~~}}~|xurqpprtwz~~}~}|{{}}{ywxy{|~~}|||}}~~~|zxusqpopqtvxzzzxusqqtx~~|xvwz}~|yxwwwxy{|~}zyyz~}yustvyzzxvttv{~{xxxz|~}{xvttuwz~|xvvy}~{xwwz|~}zuplihilptx{~~~~|yxxz|}}|zxwy}~~}}~|xvtsrstvx{}~~}|{{|~}zyz~{vttwz~~{yyy{~~}}}~~|zwtrqppqsuxyyxvrollnrx~{{{}}zxwvvvxz|~|yxx{zvttvyz{ywutvy}}{zzz|~|yvtrrsvy|~zyz}}zwvwz}~~|yuqnmnpruwxwwvuuvwz|~~}~{yxz|~|yvuw{}}~~{yxwwxyzzzzyyzz{|}}}{zzz{}}}}yvvwz}~|ywvwy{}}||}~~}|zyxvtrqqrsuwxxvtpnmnqv|~}}~}{zyxxyz{}}||~~zxwxz}~|yuqpquz~}||}}}zxvuuvwy|~~}~~{z||xttuy|~~}yuronnpruwxyxwvtsstux{}|}{xuvx}~}{xwvvwyz|}}}}|{yxwvvwxz|}yxxz}}zwvvvx{}~}}}}~|ywutsstuvwxxxvtqnmmnrv{~~}||~}{zzyyyz{}~}{{}zwvwy|~}{xussvy|~~}|{|~~|ywvuuwy{~}{yyz|}|~|yxxz|}}{yvsrqrsuvxxxwvtrqppprtw{~~}}}zyz}}{{}}|{zzzz{{|}}}}}|{ywvtsstvy|~zxxz}|zxwwxz|}~~~}}}}~~|xurqqsux{||{xsoljjmptwyzz{|~|{zz{}~||~|zz}}|{{yvtrqsvz|yvuuvy}~{xvttux{~~{yxxy{}|ywx{~xsollnqux|~~|yvroljijloty~~|{{}{vstx~~}}|ywvvx{~{xtqnmlmpsw|~zwxz}{wtssvy}~zwuuwz~}zyxxxz{}~}zwsokiijmptwxyxxxz|~~}|}|yxxz~~{yyz}{xwwxyxxwvvx{~}zwuttuwz}}yvvx{~zvtstw{~|yvuwz~}zwtqpopruxz|~~}|zwurpnmlmnprvz~~}~zy{~}{zz{|}~|zzzz|}}zwtrpoopruy}~~~|{{|~}zxvuuuwx{}~}|{zzzzz{|}}zwspnmmnpqrsstvwy{{zywuvy~|{{|}~}zxvttux{~|yurpprv{}zxwwy{}~}|{{zyxvtttvy}~{xusrqrsuwy{||{yurnkjjlpuy}~|{{|~{yxxyz{|}~}{zz{|~}yurqqsvz|~}{yvuuw{}|}}{zywwvuuuuvwxz{}~|zxwwxy{~}zuqnmoruy{{ytplklpuz}~}{yxz}~}||}}~~}{{{|}~{yvutvwyz{zxvvvx|~|zyyyz{{|}}}}}}~~|zxwwwyz|}~{xuuvx{}~|yurqqrtvwvuronnpsw{~~}|||~~}|{z{}~~}{{|~|xusrtwz}~|yvuuvy}~~~|zxwutttuwz}~|{{|~~zxwwy|~~}{xtrqrtvxyyxvtrqqqqstwz~~}}}~~~|zz{}|yusrrtvy|~~}}~~}|{zzz{|~~{xuttvy}|zyz|{xvvwz}}zwtqpopqsuwyz{{{{zyxwvvwxz|}|||~~~~~}{yyyz|}~~}{ywutstuwy|~|zyyz{}}zwuuwy}}{zz{}~~~~}||{z{zyz{|~~~~}{yz~||}~}yvtsuwz}~~}|zyy{}}}~|{zz{|~~}}~{zzzzzzyxusrrsuxz{{xuqnllnrw|{wy|wspnlklnquz~~|{{|}}|}}yvuvx|}zxwwxyz|~|||xvtssux|~zxwwxz}|xvuvy}||||||{{{|~|zz{}}wqlkmt~~yurpnnoqtvwxwurolkjknquy}~|{{zzzzyyz|{wuuvy}~|{{{}{vsqrv}{xvuvwy{}~~~}|{{{{{|}~~zwwx|~{vqmkmqx{uqnmnpsuxzzzxuroljijmqu{|ywuuvvwxy{~|xussuw{}||}{xvx||wutvy}~{wuttvy|{yxxz~}~~~}}~ysollou}~zwuuuvwwwwvtsqponnnoqtx|}{xvuttuuwy|}{zyxyz|~zurqsy{vttvy}}yvttux|}zyxy}~|{zz{}~}ytpmmou}~ywvwxyz{zywusrqpoooqruw{}}zwusqqqsuy}|zyxwwxy{~~~~yutv{|ywxy|}zwuuvxz~~}}}}}~~~~}||}~ytnkjnt}}xvvxz|}}{xurpoopqrtvwxz{|}}}}}|{yxvtsrstw{~|{zyyz{}|xvvx~{yxy{~|zwvvvx{~|zxwwxz~~|{z{|~~|zyz|~|xrnllqx|yxy{~|yuqommnpsvz|~~}{ywvtssrrrsux}}|zzyyz|~|yvvw|}}}~~}|zyyyy{|~~}}||||}~}}}~|yxxy|~}ytolknt}|zz|}~|yvtrqqqstvxz|}}}}|{zyxwutssstvy|~|zyxyz|~|xuuvz~|yvuuvxz}}|zyyxyz}~~~zxwxz|~~}zvqnlmrx|yvtrqqrtwy|}~}|zywvutsrrstux{~}{yxxy{~{wtstx~~}{yxxy{}~}}|{{{{|~~~~~{yxxyz||{yvronosx|yvtsstuwy{|}~~~}|{zxwutsrrrtvy|}{zyyz|}}}~yussvz}zxwvwxz}}|{{{{{{|}~~~~~~|zyyz{||{yvrnllot{~{yvutuvwy{|}}}}}||{zyxwvtssrstwz}~|{zzz{}~}}~~zwtsuy~|zyyyz|}~|{zzzz{|}~}||}~}{xwvvxyz{zyvrpoorw~~zwuttuwy{}~}{zyxwvutssssuw{~~}||||}~}}}~}zvtsuy~}{zyyz{}~}|zyyyyz|}~}|||}~}{xwvwxyzzyvspnmosy}zwvuvwy{}~|{zxwvuuttttuwz}~}{{zz{|~~|{{|}~~|ywuuw{~|zzzz{|~~|zyxxxyz}~}|||}~|yvuttuwxyywurpopty~{xwvvxy{~}|zxwvutttuvxz}~}|||}~}|{{|}~}{xvuux|}{zzz{}~~|{zyxxyz}~}{{{{|~~{yvtsstuwwwvtrqqsv|~|zxwwxz|~~}{ywvutsstuwz}~}|{{{|}}{zyz{}~~}zwuuvy~|zyyy{|}{zyxwxxz|~~}|{{{|}~~{yvtsstuvwwvusqqruy}{zyyz{|~~}{zxwvuttuvwz|~}|{{|}~~|zxyz{}~~{yvuuw{}{zzz|}}{zyxwxyz|~|{zz{|}~}{yvtssttvwwvusqpqsw}|zyyyz|~}{yxvutstuvx{~~}||||}~~|yxxy{}~~~|ywutvy~}{zz{|~}|zyxwwxyz|~~|{zzz{}~}zxutsstuvwwvurpoorv{~|{{{|}~}|zxwvuuuuvxz}~}}||}}~{zyyz{}~~}{yvutvy~~|{zz{}~|{yxwwwxy{}}{zzz{|~}zxusrrsuvxxwvsqoopty~}|{{|}~|zxwvuuuvwxz|}|||}~~{zyyz{}~~}|yvtstw{}|{{|}}{zxwwvwxy{~}|{zzz{}~~{yvtrrrsuvwwvtrpoprw|}|{|}~~|zxwvuuvvxz|~~}|||}~~|zxxxy{}~~}{xvttvy}~|{{{|~~|{yxwwvwxz|~|{zzz{|}~~|ywtrqrstvwxwvtqpoqtx}~}|}}~|zxwvuuvwxz}~}|||}~~{yxxxy{|}}|zwuttvz}{{{|~}|zywwvvwxz|}{zyyyz{}~}{yvsrqpqsuvwwvtrqqruz~}}}~~|zywvuuvwy{}~}|||}~}zxwvwxz{}}|{xvuuwz}|{{|}~}{zxwvvvwyz}}{zyyyz{|}~~}{xvsqppqrtvwwvtsrrsv{~}}~}{yxwvvwxy{~~}|||}~}zxvvvwy{|||zywvvx{~|{{{|~}{yxwvvvwxz}~|zyxxxyz|}~~|zwtrpopqrtvwwvtsrrtx|~}~~~|zywwvwwy{}~}||}}~~{ywvvvxy{||{zxwvwy}}|{{|}~|zywvvvvxy{}}{yxxxxy{|}~~~}{xusqoopqsuwwwvtsrsuy~~~~~|zyxwwwxz|~}|||}~~|ywvuvwyz|||zywvvx{~|{{|}~}{yxvvuvwxz|}{zyxxxyz|}~~~}{xvsqpopqsuvwwvtsrrtx|~}{yxwwwxy{}~}||}~~|ywvuvwy{|||zxvuuwz~}|||}~}{yxvvuuvwy{}}{zyxxyz{|}~~~}{xvsqpopqsuvwwutrqrtw{}{zxwwwxy{}~}}}}~|ywvuvwy{|}|zxvuuvy}~|||}~}{yxvvuuvwxz}}{zyxxyz{|}~~~|{xvsqpopqsuvwwutrqqruz~~|{yxwwxy{}~}}~|zwvvvwy{|||zxvutux{}||}~~|zxwvuuuvxy{~~|zyxxxyz{}~~~}{yvtqpooqrtvwwvusqqrtx|~|zyxxxyz|~~}}}~}{xvuuvxz{||{zxvttvy}~}||}~}{yxvuuuvwxz|~}{zyxxxyz|}}~}|zxusqoopqsuvwwvtsqqsuy~}|zyxxxy{|~~}}}~|zxvuuvxy{||{zxvuuwz~~}||}~}{ywvuuuuwxz|~|zyxxxxyz{|}}}{ywtrpoooqsuvwwvusrrsvz~|zyyxyz{}~}}}~|zwuuuuwy{|||zxwvvxz~}|||}~}{yxvuuuuvxz|~~|zyxwwwxy{|}}}{zwurponoprtvwxwvtsstw{~|{zyyyz|}~}}}~~|ywuttuwy{|||zywvwx{}|||}~~}{ywvuuuvwxz}~|zxwwwwxy{||||{yvtqpnnopsuvxxwvuttux|~|{zyyz{|~~}}}}~}{xvtttvwy{||{zxwvwy|~}|||}~~|zxwvuuuvwy{}~|zyxwwwxyz{|||{zwurponnprtvwxxwuttuwz~}|zzyzz|}~}}}~~|ywuttuwyz|||{ywvwx{~}|||}~~}{ywvuuuuwxz|~}{yxwwwxyz{|||{zxusqonnoqsvwxxwvtstux|~|{zzzz{}~}}}~~|ywuttuwyz|||{ywvvwz}~|||}~}{ywvuttuvxz|~}{yxwwwxyz{|}}|zxusqonoprtvwxxvusssux{~}{zzzz{}~~~~|ywuttuwy{|||zxwuuwy|~}||}~}{ywvuttuvwy{}}{zxxwxxyz||}}|zxvsqooopqtvwxwvusrrtvz~}|{zzz{|~~~~|zwuutuwyz|||{ywvuvx{~}}}~~|zxwutttuvxz|~~|zyxwwxyz{|}}|{yvtrpoooqsuwxxwvtsrsux|~}{zzz{|}~~~~{yvutuvxy{||{zxvuuwy}}|}}~}{yxvutttuwxz|}{yxwwwxyz{|}}|zxusqonopqtvwxxwutsstvz~~}{zzz{|~~~~}zxvttuvxz{||{zxwvvwz}~}||}~}{ywvuttuvwy{}~|{yxwwwxyz{|||{zxusponnpqtvwxxwvuttuwz~}|{z{{}~~~~~}zxvtttuwy{|||{ywvvxz}}|||}~}{yxvuttuuwy{}~|{yxwvwwxz{|||{zxusqonnoqsuwxyxwvutux{}|{{{|}~~~~|zwutttuwy{|}|{yxwwx{~~}|{|}~~}{yxvuttuvwy{}~|zxwvvwwxz{|||{ywurponnoqtvxyyxwvuuvx|}|{{{|}~}~~~{yvutttvxz||}|zyxwxy|~||{|}~~|zywvuttuvxy|~}{yxwvvwxyz{||{zxvsqonnopsuwxyyxwuuuwz~~}|{{|}~~~~~|zwutttuwy{|}|{yxwwx{~}|||}~~}{yxvuttuvwy{}}{zxwvvwxyz{|||zyvtrpnnopruwxyyxwuuuvy|}|{{|}~~~~}zxvtttuwy{|}|{yxwvwz}}|||}~}{yxvutttuwxz|~}{zxwwwwxy{||||{yvtrponopsuwxyxwvuttux|}|{{||~~~}zxvtttvxz{|}|{ywvvwy|~}||}~}|zxvutttuvxz|~}|zyxwwxxz{||}|{ywtrponopruwxyxwvtssuwz~~||{{|}~{xvuttvwy{|}|{ywvvvx{~}||}~~|{ywuttttvwy{}~|zyxwwwxyz||}|{zxusqonoprtvxxyxvutstvy|}||{|}~|zwuttuvxz||}|zywvvwy|~}||}~~|zxvutttuvxy{~}{zxwwwxxz{|}}|{ywtrponopruwxyyxvuttuwz~}||||}~|ywuttuvxz|}}|zywvvxz}~|||}~}|zxvutttuvxz|~}{zxwwwwxy{||||{yvtrponopruwxyyxwvutuwz~}||||}~~~|ywutttvxz|}}|{yxwwxz}~|{{|}~~|zxwutttuvxy{~}{zxwvvwxyz{|||{ywtrponoprtwxyzyxvuuvx{~~}||}~~~~~{yvutttvxz|}}}{zxwwx{~~|{{{|}}|zxwutttuvxz|~}{yxwvvwxyz{||{zxvtqpnnopsuwyzzyxwvvwy|~}||}~~~~}zxvtttuwy{|}}|{yxwxy|}|{{|}~~}{yxvuttuuwy{}~|zxwvvwwxz{|||{ywusponnpqtvxyzzywvvvwz}~}||}}~~~|ywutttvxz|}}}{zxwwxz}~|{{{|}~}|zxwutttuvxz|~~|zyxwvwwxz{|||{zxusqonnoqsvxyzyywvuuwy|}}||}~~~|ywuttuvxz|}}}{zxwwxz}~}|{|}~~|zxwutttuvxy{~~|{yxwwwxyz{|||{zxvsqooopqtvxyyyxwuuuvx|}}||}~|ywuttuvxz|}}|{yxwvwy|}|||}~~|zywutttuvwy{}~|{yxwwwxyz{|}}|zxvtqpoopqsvwyyyxvuttuwz~~}||}~}zxvutuvxz|}}|{zxwvwx{~~|||}~}{yxvutttuvxz|~}{zxwwwxyz{|}}|{ywurpoooqsuwxyyxwvttuvy|}}||}~|ywuttuwy{|}}|{ywvvwy|}|||}~~}{ywvttttuwy{}~|{yxwwwxyz{|}}|zxvtqpoopqsuwyyyxwvutuwz}~}}|}~~{yvuttuwy{|}}|{ywwwxz}}|{||}~|{ywutttuvwy{}~|zyxwwwxyz{|}||zxvsqpoopqsvxyzzywvuuvxz~~}}}~~{yvuttuwy{|}}}{zxwwxz}}{{{|}~~}{ywvuttuvwy{}~|{yxwvwwxz{||||zxvtqpoooqsuwyzzyxwvvvx{~~}}}~}{xvuttuwy{|}}}|zyxwxz}~|{{{{|}~~|{ywvuttuvwy{}~|zywwvwwxz{|||{zxvsqooopqsvxyzzzxwvvwy|~}}}~|zwutttvwy{}~}}{zxxxy{~~|{z{{|~}|zxwuuttuvxz|~}{yxwvvwxyz{|||{ywtrpooopruwyzzzyxwvvxz}~}}}~}{xvuttuwy{|}~}|zyxwxz}}{{{{|}~~|{ywvuttuvwy{}}|zxwwwwxyz{|||{ywusqoooprtvxzzzyxwvvwy|~}}}}~{ywuttuwy{|}}}|zxwwxz|}|{{|}~~}{ywvuttuvwy{}}|zxwwwwxy{|}}|{zwusqooopruwxzzyxwvuuvx{~}}}}~~|ywutuuwy{|}}}{zxwwwy|}|{{|}~~}{ywvutttuwy{}~}|zyxwwxxz{|}}}|zxvsqpooprtvxyzyxwvuuuxz~~}}}~|zwvuuuwyz|}}}|zxwvwx{~~}|{||}~|zxwutttuvxz|~~|{yxwwwxy{|}}}|{ywtrpoopqsuwyzzyxvutuvy|~}}}~~{ywuuuvxy{}}}|{yxwvwy|~|{{|}~}{zxvutttuwxz|~}|zyxwwxxz{|}}}|zxvsqpooprtvxyzzywvuuuwz}~}}}~}{xvutuvxz{}}}|{yxwwxz|}|{{{|}~~}{yxvutttuwyz}~}|zywwwwxy{|}}}|zxvsqpooprtvxzzzyxwvuvxz}~~}}~}{xvuttvwy{}~~}|zywwxz|}|{z{{}~~}|zxvutttuwxz|~~|zywwwwxyz{|}||zxvsqpooprtvxz{{zywvvwxz~~}}~}zxvuttvwy{}~~}|zyxxxz}}{zzz{|}~~}{zxvuttuuwy{}~}|zxwwwwxyz{|}|{zxusqoooprtwyz{{zywwvwy{~}~~~|ywuttuvxz|}~~}{zxxxy{~~|{zzz{}~~}{ywvuttuvxy{}~}{yxwwwwxz{||}|{yvtrpoopqsuxy{{zyxwvvxz}~}}~}{xvuttvwy{}~~}|zyxxxz}}{zzz{|}~~}{zxvuttuvwy{}}{yxwwwwxz{|}}|{ywurqoooqsuwyz{zyxwvvwy|~}}~~{xvutuvwy{}~~}|zywwxy|~|{z{|}~}|zxvutttuwy{}~}{zxwwwxyz{|}}}{ywurqoopqsuwyzzzywvuuvx{~}}~~~{ywuuuvxz{}~~}{zxwwwy{~~|{{{|}~~|zxvutttuvxz|~}{zxwwwxyz{}}}}|zxusqpopqsuwyzzzywvuuvxz}~}}}~|ywvuuvwy{}}~}|zxwwwxz}}|{{||~~}{ywvuttuvwy{}~|zyxwwxyz{|}~}|{yvtrpooprtvxyzzyxvuuuvy|~}}~~{xvuuuvxz|}~}}{yxwwwy|~|{{{|}~~|zxwutttuvxz|~}{zxxwwxyz{}}~}|zxusqpopqsuwyzzzyxvuuvwz}~}}~}zxvuuuvxz|}~~}{yxwwxy|~|{{{{|~~|zxwutttuvxz|~}{zxwwwxyz{|}}}|zxusqpopqruwyz{zyxwvvvxz}~}}~}zxvutuvxz|}~~}|zyxwxz|~|{zz{|}~~|{ywvuttuvxz|~}|zxwwwwxy{|}}}|zxusqpooprtwyz{{zyxwvwxz}~~~~}zxvutuvxz|}~~}|zyxxxz|~|zzzz{}~~|{ywvuttuwxz|~}{zxwwwwxy{|}}|{ywusqpopqsuwyz{{zyxwvwy{~~~~~~|ywuttuwyz|~~~}|zyxxy{}}{zzz{|}~~}|zxvuttuvwy{}~|zyxwwwxyz{|}}|{yvtrpooprtvxz{{{zxwwwxz|~~~}zxvutuvxz|}~~}|zyxxxz|~|zzzz{}~~|zywvuttuwxz|~~}{yxwwwxyz{|}}|{ywtrqoopqsuxy{{{zxwvvwy{~}~}{xvuuuvxz|}~~}|zyxwxy|~|{zz{|}~~|zywuuttuwxz|~~}{yxwwwxy{|}}}}{ywtrqpoprtvxyz{zyxvvuvx{~~}~~~{ywuuuvxz|}~~}|zxwwwy{~}{{{{|}~~}{ywvuttuvxz|~~}{yxwwwxy{|}~~}|zwusqpppqsuwyzzzyxvuuvwz}~}}~~|ywvuuvxz{}~~}|zywwwxz}~|{{{|}~}|zxvuttuvwy{}}|zyxwwxyz|}~~}|{xvtrpppqrtwxzzzyxwvuuvy|~~}~}{xvuuvwxz|}~~}{zxwwwy{~}{{z{|}~~}{ywvuttuvxz|~~}{zxxwwxy{|}}~}|zxusqpppqsuwyzzzyxwvuvwz}~~~}{xwvvvxy{|}~~}{zyxxxz|}|{{{|}~~}{yxwvuuvwxz|~~}{zyxxxxyz||}}}{zxvtrqqqstvxyz{{zyxwwwy{}~}{yxwwwxy{|}~~}|{zyyy{|}|{{{||}~~~}|zyxwvvwxyz|}~}|zyxxxyyz{|}}|{zywutsrssuvxz{{{{zyxxyz{~}{zxxwxyz{|}~~~}|{zzz|}}|{{{||}~~~~~}|zyxxwwxxz{|}~}|{zyyyyz{{||||{zywuttstuvwyz{{{{zzyyz{|~~}{zyxxyz{|}~~~}}|{{{{|~~}|||||}~~~~~}}|zyyxxxyyz|}~~}|{zzyyyzz{|||||{zxwvuttuvwyz{{|{{zzzz{|~~|{zyyyz{|}~~~~}||{{{|~~}|||}}~~~~~~}|{zyyyyyzz{|}~~~}|{zzzzz{{|||||{zyxwvuuvwxyz{{||{{zzz{|}~}|{zzz{{|}~~~~}||{{||~~}}}}}}~~~~}|{{zyyyyz{||}~~}}|{{zzz{{|||}||{zyxwwvvwwxyz{{|{{{zzz{|}~}|{{{{{|}}~~~~}}|||||}~}}}}~~~~~~~}}|{zzzzzz{||}~~~~}}|{{{{{{{||}}}||{zyxxwwwxyyz{{||{{{z{{|}~~}||{{||}}~~~~}}||||}}~~~}}}~~~~~~~~}||{{zzzz{||}~~~~~~~}}|{{{{{{||}}}}|{{zyxxxxxyyz{{|||{{{{{|}~~}|||||}}~~~~~}}}||}}~~~~~~~~~~~~~}}||{{{z{{{|}}~~~~~~}}|||{{{{|||}}}||{{zyyxxyyyz{{|||||{{{||}~~}|||||}}~~~~~~}}}}}~~~~~~~~~~~~~~}}|||{{{{{||}}~~~~~~}}}||{{{||||}}}|||{zzyyyyyzz{||||||||||}~~~}}|||}}}~~~~~~~}}}}~~~~~~~~~~~~~~~}}|||{{{|||}}~~~~~~~}}|||||||||}}}|||{{zzyyzzz{{||}}}}||}}}~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}||||||||}}}~~~~~~~}}|||||||||}}}|||{{zzzzzz{{||}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}||||||}}}~~~~~~~}}}||||||||}}}}|||{{{zzz{{{||}}}}}}}}}~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}|||||}}}~~~~~~~}}}}||||||}}}}}}|||{{{{{{{{||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||}}}}~~~~~~~~}}}}|||}}}}}}}}}|||{{{{{{|||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~}}}}}}}}}}}}}}}}||||{{{{||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~}}}}}}}}}}}}}}}}}|||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m55.bin b/applications/PoP/poc/res/music/m55.bin deleted file mode 100644 index 8188946..0000000 --- a/applications/PoP/poc/res/music/m55.bin +++ /dev/null @@ -1,3 +0,0 @@ -~~~~~}}}{{|}{|}||~~y{x}|zyxwwwvvvwwxy{|}~}{zyxwwwvvuuuuuuuvwwy{}wtzxy|~~}{zyyxwwwwwwxxyz{|}~~}{zyxxwwwvvuuuuuuvwyz{}~wtxyvvxz|~~~}}||||{{||||}}~}xtqt{}zwutttttuvwxyz{{zyxwvtsrrrrrsttvwxyzz{{{||||}}}~~zwutuz|zxwvvvwwwxxxyyyyyyyyyyxxxxxxxxyyyzz{||}~~{xvuux||zxwuttsrrrqqqqqqqqqqqrrrrssttuvvwxyzz{|}~~|zyy{~~}}|||||{{{{{zzzyyyxxxxxyyyz{|}~}yurqqsx~~{ywwwwwxxxwwvusrqppppqqrsuuvwwxxxwwwwwxxyz{|}~~|ywutstwz~~|{zyxxxxxxxxxxxxxxxxxxxxyyyyyzzz{||}}~~|ywuuux|}{ywvuttssrrrrqqqqqrrrrrssttuuvwwxyzz{|}~}{yyy{~~}|||{{{{{zzzyyyyxxxxyyyzz{|}~}zwtrqqtx}}{zyxxyyyyxxwutsrqpppqrstuvwwxxxxxxwwxxxyyz{|~}{zxvtssuwz~~}{zyyxxxxxxxxxxxxxxxxxyyyyyzzz{{||}~~~|zwvuuvx|~|{yxwvuttsssrrrrrrrssssttuuvvwxxyz{{|}~}|zyyz{~~}||{{zzzyyyyxxxxxxyyyz{{|}~~{xusqqrtx}~}{{zz{{{zzyxvutsrrqrrstuvwxxyyyyyyyxyyyyz{|}~~|zxvutstuwz}}|{zyyxxxxxxxxxxxxxxxyyyyzzz{{||}}~~~|zxwuuuvy|~|{yxwwvuuutttttstttttuuuvvwwxyyz{{|}~~~|{zyyz|~~}}||{{zzyyyyyxxxyyyzz{||}~~|zwtrqqrtx|~}||||||{zyxvutssssttuvwxyyzzzzzyyyyyyzz{{|}~~}|zywuttstuwz}~}|{zyyyyxxxxxxxxxyyyyyzzzz{{||}}~~~|zywvuuuwy|~}|zyyxwwvvuuuuuuuuuuvvvwwxxyyzz{||}~~~|{zyyyz|~~}}|{{zzzyyyyyyyyyzz{|}}~~|zxvtrqqrux|~~~~~}}|zyxwvutttuvvwxyz{{{{{{{zzzzzz{{|}}~}|{yxvuttttvxz}~}||{zzyyyyyyyyyyyyyyzzzz{{{||}}~~~|{yxvuuuvwy|~}|{zyyxxwwwwwvwvwwwwwxxyyyzz{{|}}~~~}{zyyyyz|~~}||{{zzyyyyyyyzz{{|}~~~~~~}|{ywusrqrsux|~}{zyxwvvvwwxyzz{|||||||{{{{{{{{|}}~~|{zxwvutttuvxz|~}|{{zzzzyyyyyyyzzzzzz{{{|||}}~~~}|{yxwvuuuvxy|~~}|{{zyyyxxxxxxxxxxxyyzz{{{||}}~~~}|{zyyyz{|~~}}|{{zzzzzzzzzz{{|}~~~}}|||||{{yxvusrrrsux|~}|zyxxxxxxyz{{|}}}}}}|||{{{{{||}}~~}|{yxwvuutuvwxz|~}||{{{zzzzzzzzzzz{{{{{|||}}~~~~}{zyxwvuuuvwxz|~~}}||{{zzzzyyyzyzzzzz{{{||}}}~~~}|{zyyyyz{|~~}}|{{{zzzzz{{{||}~~~}|{{{{{{zzywvtsrrrsux{~}|{zyyyzz{{|}~~~~~~~~}}}|||||}}~~~}|{zyxvvuuuuvwxz|~~}}||{{{{{{{{{{{{{{{||||}}}~~~~}|{zyxwvvuuuvwxz|~~~}}||||{{{{{{{{{||||}}}~~~~~}|{zyyyyyz{|~~~}||{{{{{{{{||}}~~~}|{zzyyyyyyyxwvtssrstvx{}|{{z{{{|}}~~~~}}}}||}}}~~~}|{zyxwvuuuuuvwyz|~~~}}||||{{{{{{{{{{|||||}}}~~~~~}}|{zyxwwvvuuvvwxz|~~~~}}}|||||||||}}}}}~~~~~}||{zyyyyyyz{|~~~}}||||||||}}~~~}|{zyyyxyyyxxwvutsssstvx{~~}}||||}}~~~~}}}}}}~~~}|{zyxwwvvvvvwxy{|~~~~}}}||||||||||||||}}}}}~~~~~~}||{zyxxwvvuuuvvwyz|~~~~~~~}~~~~~~~~~}}|{zzyyyyyyz{|~~~}}}}}}}}}~~~~~~~~~~~}{zyxxwwwwwwwwwvuttsstuvx{~~}}}}~~~~~}}}~~~~~}|{zzyxwwvvvvvwxy{|~~~~}}}}|||||||||||}}}}}}~~~~~~~}}||{zzyxxwvvvuuvvwxyz|~~~~}||{zzyyxxxyyz{|}~~~~~~~~~~~~}}}}}}~~~}{zyxwwvvvvwwwwvvuttsstuvx{~~~~~~~~~~~~~~}|{{zyxxwwwwwwxyz{}~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~}}||{{zzyxxwwvvuuuvvwxyz|~~~}||{{zyyyxxxyyz{|}~~~~~~~~~}}|||||}}~~~~}{zyxwvvuuvvvvvvvvuuttttuvx{}~~~~~~~~~~~}||{zyyxxwwwwwxxyz|}~~~~~}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}|||{{zzyyxxwwvvvuuvvvwxy{|~~~}}||{{zzyyyxxyyyz{|}~~}}||||||||}}~~~~~~}}|zyxwvuuuuuuvvvvvvuuttttuwx{}~~~~~~~~~~~~~}}|{{zzyyxxxxxxyyz{|}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}|||{{{zzyyxxwwvvvuuuvvwwxy{|}~~~}}||{zzyyyxxxxxyyz{|}~~~}|||{{{{{|||}}~~~~}||zyxwvuutttuuuvvvvvuutttuvwy{}~~~~~~~~~~~~~~}}||{{zzyyxxxxxxyyz{|}~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||{{{zzzyyxxxwwvvvvuuvvvwxxy{|}~~~}}||{{zzyyyxxxxxyyz{|}~~}}||{{{z{{{{|||}}}}||{zyxvvuttttttuuvvvvuuuuuuvwyz}~~~~~~~~~~~~~~~~~~}}}}||{{{zzyyyyyyyyzz{|}~~~~~~~~}~}}}}}}}}}}}}}}}}}}}||||||{{zzzyyyxxwwwvvvvuuuvvwwxyz{|}~~~}}||{{zzzyyxxxxxxxyyzz{|}~~~}}|{{{zzzz{{{||||}|||{zyxwvuttsstttuuuvvvuuuuuuvwyz|~~~}}}}}}}}}}}}}}}}|||{{zzzyyyyyyyyzz{|}~~~~~~~}}}}}}}}}}}}}}}||||||||{{{{zzzzyyyxxwwwvvvvuuuvvvwwxyz{|}~~~}}|||{{zzyyyxxxxxxxyyz{{|}~~~}||{{zzzzzzz{{{||||{{zyxwvuttsssssttuuvvvvuuuuvvwyz|~~~~}}}}}}}}}}}}}}||||{{{zzzyyyyyyyzz{{|}~~~~~~~}}}}}}}}}}||||||||{{{{{{zzzzyyyxxxwwwvvvvuuuuvvvwwxyz{|}~~~~}}|||{{zzzyyxxxxxxxxxxyyz{|}~~~~}||{{zzzzzzzz{{{{|{{{zyyxwvutssssssttuuvvvvvuuuvvwyz|~~~}}}}}|||||||||||{{{{zzzzyyyyyzzz{{|}~~~~~~~}}}}}}}}|||||||{{{{{{zzzzyyyxxxwwwvvvvvuuuvvvvwxxyz{|}~~~}}}|||{{zzyyyxxxxxxxxxyyzz{|}}~~~}||{{zzyyyyzzzz{{{{{zzyxwvuttssssssttuuvvvvvvvvvwwyz|~~~}}}}||||||||||{{{{{zzzzzzyyyzzzz{{|}~~~~~~~}}}}}}|||||||{{{{{zzzzyyyyxxxxwwwvvvvvuuuuvvvwwxxyz{|}~~~~}|||{{zzzyyyxxxxwwwwxxxyyz{{|}~~}}|{{zzzyyyyzzzz{{{{zzyxwvvutssrrrssttuuvvvvvvvvvwxyz|~~~}}|||||{{{{{{{{zzzzzzzzzzzzzz{{{|}}~~~~~}}}}}}|||||{{{{{{zzzyyyyxxxxwwwvvvvvuuuuuvvvwwxxyz{|}~~~~}}}|||{{zzzyyyxxxxxwxxxxxyyz{{|}~~}}|{{zzyyyyyyzzzzzzzzyyxwvuutssrrrssttuuvvvvvvvvvwxyz|~~~}}||||{{{{{{{{zzzzzzzzzzzzzzz{{{|}}~~~~~}}}}}|||||{{{{{zzzzyyyyxxxxwwwvvvvvuuuuuvvvvwwxyyz{|}~~~~}}}||{{{zzzyyyxxxxxxxxxxyyzz{{|}~~~}}|{{zzyyyyyyyyzzzzzzyxwwvutssrrrrssttuuvvvvvvvvwwxyz|}~}}|||{{{{zzzzzzzzzyyyyyzzzzz{{{||}~~~~~~}}}}||||{{{{zzzzzyyyxxxxwwwwvvvvuuuuuuvvvvwwxyyz{|}~~~~}}|||{{{zzyyyxxxxwwwwwwxxxyyzz{||}~~~}||{zzzyyyyyyyzzzzzzyyxwvvutssrrrrssttuuvvvvvvvvwwxyz|}~}}|||{{{zzzzzzzzzzyyyyyzzzzz{{{||}~~~~~~}}}||||{{{{zzzzyyyyxxxxwwwwvvvvvuuuuuuvvvwwwxyyz{|}~~~}}}|||{{zzzyyyxxxxxxwwxxxxyyyzz{|}}~~~}||{zzyyyyyyyyyyzzyyyxxwvuutssrrrrrsttuuvvvvwwwwwwxyz{}~}}|||{{zzzzyyyyyyyyyyyyyzzzz{{||}}~~~~}}}}||||{{{zzzzyyyyxxxwwwwvvvvvuuuuuuuvvvwwxxyzz{|}~~~}}}|||{{zzzyyyxxxxwwwwwwwxxxyyzz{{|}~~~}}|{{zzyyyyyyyyzzzzyyyxwwvutssrrrrrssttuuvvvwwwwwwwxyz{}~}}||{{zzzzyyyyyyyyyyyyyzzzz{{||}}~~~~~}}}}|||{{{{zzzyyyyxxxwwwwvvvvvvuuuuuuvvvvwwxxyzz{|}~~~}}}|||{{zzzyyyxxxxxwwwwwxxxxyyzz{||}~~~}}|{{zzyyyyyyyyyyyyyyxxwwvutssrrrrrrsttuuvvwwwwwwwwxyz{}~~}}||{{zzzzyyyyyyyyyyyyyzzz{{{||}}~~~~}}}||||{{{zzzzyyyxxxxwwwwvvvvvuuuuuuuvvvvwwxxyzz{|}~~~~}}|||{{zzzyyyxxxxwwwwwwwwxxxyyzz{{|}}~~}||{{zzzyyyyyyyzyyyyyxxwvuutssrrrrrssttuvvvwwwwwwwxxyz{}~~~}||{{zzzyyyyyxxxxyyyyyyzzz{{||}}~~~~}}}|||{{{zzzzyyyxxxwwwwvvvvvuuuuuuuuvvvvwwxxyzz{|}~~~~~}}|||{{zzzyyyxxxxwwwwwwwxxxxyyzz{{|}}~~}}|{{zzzyyyyyyyyyyyyyxxwvuutssrrrrrssttuvvvwwwwwwwxxyz{|~~~}||{{zzzyyyyyxxxxyyyyyyzzz{{||}}~~~~~}}}|||{{{zzzyyyxxxxwwwwvvvvvuuuuuuuuvvvvwwxxyzz{|}}~~~~}|||{{zzzyyyxxxxwwwwwwwwwxxxyyzz{{||}~~~}||{{zzzzyyyyyyyyyyyxxwvvuttsrrrrrrssttuvvvwwwwwwwxxyz{|~~}}|{{zzzyyyxxxxxxxxxyyyyzz{{||}}~~~~~}}|||{{{zzzyyyxxxxwwwvvvvvuuuuuuuuuvvvvwwxxyzz{|}}~~~~}}|||{{zzzyyyxxxxwwwwwwwwxxxxyyzz{{||}~~~}}|{{zzzzyyyyyyyyyyyxxwvvuttsrrrrrrssttuvvvwwwwwwwxxyz{|~~~}||{zzzyyyxxxxxxxxxyyyyzz{{||}}~~~~~}}|||{{{zzzyyyxxxwwwwvvvvvuuuuuuuuuvvvwwwxxyzz{|}}~~~}}|||{{zzzyyyxxxxxwwwwwwxxxxxyyzz{{||}~~~}}|{{zzzzyyyyyyyyyyyxwwvuutssrrrrrrsstuuvvwwwwwwwxxxyz{|}~}||{{zzyyyxxxxxxxxxxyyyyzz{{||}~~~~}}}||{{{zzzyyyxxxwwwvvvvvuuuuuuuuuuvvvwwwxxyzz{|}}~~~~}}||{{{zzzyyyxxxxwwwwwwwwxxxxyyzz{{||}~~~}}|{{{zzzzzzzzyyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwwxxxyz{|}~}}|{{zzyyyxxxxxxxxxxyyyzzz{{||}~~~~}}}||{{{zzzyyyxxxwwwvvvvvuuuuuuuuuvvvvwwwxxyzz{||}~~~~}}||{{{zzzyyyxxxxxwwwwwwxxxxxyyzz{{||}~~~}}||{{zzzzzyyyyyyyyxxwwvuutssrrrrrrssttuvvwwwwwwxxxxyz{|}~~}||{zzyyyxxxxxxxxxxxyyyzzz{||}}~~~~}}|||{{zzzyyxxxwwwwvvvvuuuuuuuuuuuvvvwwwxxyzz{||}~~~}}}||{{{zzyyyxxxxxwwwwwwwxxxxyyyzz{{||}~~~}}||{{zzzzzzzzzyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwxxxyyz{|}~~~}||{{zzyyxxxxxxxxxxxyyyzzz{||}}~~~~~}}||{{{zzzyyxxxwwwwvvvvuuuuuuuuuuvvvvwwwxxyzz{||}~~~}}}||{{{zzyyyyxxxxxwwwwwwxxxxyyyzz{{||}~~~}}||{{{zzzzzzzyyyyyxxwwvuutssrrrrrrsstuuvvwwwwwwxxxxyz{|}~~}||{{zzyyxxxxxxxxxxxyyyzz{{||}}~~~~}}||{{{zzyyyxxxwwwvvvvvuuuuuuuuuuuvvvwwwxxyzz{||}~~~~}}|||{{zzzyyyxxxxxwwwwwwwxxxxyyyzz{{|}}~~~}}||{{{{zzzzzzzyyyyxxwvvuttssrrrrrssttuuvvwwwwwwxxxyyz{|}~~~}||{zzyyyxxxxxxxxxxxyyyzz{{||}~~~~}}|||{{zzzyyxxxwwwvvvvvuuuuuuuuuuvvvvwwwxxyzz{{|}~~~~}}}||{{zzzyyyyxxxxxwwwwwxxxxxyyyzz{{||}~~~~}|||{{{zzzzzzzyyyyxxwvvuttssrrrrrssstuuvvwwwwwxxxxyyz{|}~~~}||{zzyyyxxxxxxxxxxxyyyzz{{||}}~~~}}|||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyzz{{|}~~~~}}}||{{zzzyyyxxxxxxwwwwxxxxxyyyzzz{||}}~~~~}}||{{{{{zzzzzzyyxxwwvuuttssrrrrrssttuuvvwwwwwxxxxyyz{|}~~}}|{{zzyyxxxxxxxxxxxxyyyzz{{|}}~~~~}}}||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyyz{{|}}~~~}}}||{{zzzyyyyxxxxxxxwxxxxxxyyyzz{{{|}}~~~~}}||{{{{{zzzzzzyyxxwwvvuttssrrrrrssttuuvvwwwwwxxxxyyzz{|~~}}|{{zzyyyxxxxxxxxxxxyyyzz{{||}~~~~~}}||{{zzyyyxxxwwwvvvvuuuuuuuuuuuuvvvwwwxxyyz{{|}}~~~~}}||{{{zzyyyyxxxxxxxxxxxxxxyyyzz{{||}}~~~~}}|||{{{{zzzzzyyyxxwwvuuttssrrrrsssttuuvvwwwwwxxxxyyz{|}~~~}}||{{zzyyyyxxxxxxyyyyzzz{{||}}~~~~}}|||{{zzyyyxxxwwwvvvvvuuuuuuuuvvvvvwwwxxyyzz{{|}}~~~}}}|||{{{zzzzyyyyyyyyyyyyzzzz{{|||}}~~~~~}}||||{{{{zzzyyyxxwwvvvuuuuttttuuuuvvwwwwxxxyyyyzz{||}~~~}}}||{{{zzzzzzzzzzzzzz{{{|||}}~~~~~~}}|||{{{zzyyyyxxxwwwwwwvvvvvvvvvwwwwwxxyyyzz{{||}~~~~~}}}||||{{{{{zzzzzzzzzz{{{{{|||}}}~~~~~}}}|||{{{{zzzzyyyxxxwwwvvvvvvvvvvwwwwxxxxyyyzzz{{||}}~~~~}}}|||{{{{{{{{{{{{{{{||||}}}~~~~~~}}}|||{{{zzzyyyyxxxxxwwwwwwwwwwwwxxxxyyyzzz{{||}}~~~~~}}}}||||||{{{{{{{{{{{|||||}}}}~~~~~~}}}||||{{{{zzzyyyyxxxxwwwwwwwwwwxxxxxyyyyzzz{{{||}}~~~~~~}}}}||||||||{{||||||||}}}}~~~~~~}}}|||{{{{zzzzyyyyyyxxxxxxxxxxxxxxyyyyzzzz{{|||}}~~~~~~}}}}}||||||||||||||||}}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyyxxxxxxxxxxxyyyyyzzzz{{{|||}}~~~~~~~}}}}}}||||||||||||}}}}}}~~~~~~~~}}}||||{{{{zzzzzzyyyyyyyyyyyyyyyyyzzzz{{{{|||}}~~~~~~~~}}}}}}}}}||||||}}}}}}}}~~~~~~~~}}}}||||{{{{{zzzzzyyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}|||||{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{||||}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}||||||{{{{{{zzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}|||||{{{{{{{{zzzzzzzzzzzzz{{{{{{|||||}}}~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}||||||{{{{{{{{{{zzzzzz{{{{{{{{{|||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{{|||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{|||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{||||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||||||||||||||||||||||||||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}|||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vtpigfedccffdfhffihgjkkkmoprvxz~zvsokheca`^]]\\\\\]_bhqyxipw}yvsqomlkkllmmoqtvy{}~|zywusqonllkkjjknqrux|~faxoffjouz|~~}|ywwvvvwwxy{}}|{zzzzz{|}|sq|zwwx{}~|zxwutsrrrssuvxz|~tja]`mxqjea_]]]^``bdfghiiiihgedba```acfhknruxz|~xrpqu}|yxwvvvwwwxxxyxyxwwwwwxxyyz{}~~wpkfdejr}~wrnjgdb`_]]\[[ZZZ[[[\\]^_`acdfhjlnprtvxz|~|xtpoqu|~{yxwvvuutttssssssstuvwy{|~vme_\]blx}wspnmmmlljifda_][ZZ[]_acehjklmmnmnnnooprsuwy{~{wsojgefiox~{yvtsrqqqqqqrrrrssssttuuvwwxy{|}}wqlheehnv|wsolifdba`_^^]]]^^__`aacdefhikmnprtvwy{}~|xtrppsy~|zywwvuutttssssttuvwxz|~{tmfa]]_fp||xutrrqqpnlifca_]]]^_acehjkmmnnnnnnnooqrsuwy{}|yvrnjgeehlsz|ywutsssrrrssssstttuuvvwxyz{|}~~ytokgedfjqz}yuroljhfedcbbaaaaabbcdefghjklnprsuwxz{}~{xtrppru{}{yxwvvuutttttuuvwyz|~~ytmgb^\]bis|zxwvvusqoljgeca`aacegikmnoppppooooppqstvxz|~}zvsoligfgjov}~|yxvutttsssstttuuuvvwxyyz{|}{wsnjgdddhmt|}yvspnljhgfedddcddddefghijklnoqrtuwxz|}~}zwtqpopsx}}{yxwvuuttttuuvwxz{}~}zwrmhc_]]`emw}||{zxvtqnkhfdccdefhjlnpqrrrrrrrqqrrstvwy{}~|zvspligfgimrx~}{yxwvuuuutuuuuvvwwxxyz{|}~~zvrnkgeddfjpw~}zwtsqomlkjihhhgghhhijjklmopqrtuvxy{|}|zwtrpppruz}{zxwvvuuuuvvwxyz|}~}|zxurniea^]_biqz}|zwtqnkigffghikmopqrsssssrrrrrsstvwy{}~}{xuroljhggilouz}{zyxwvvvvvvvvwwwxxyzz{|}~~{wtqmjhfeefimsz|ywusqponmlkkkkkkkkllmnopqrstuwxyz|}~~{yvtrpooqsw|~|{zxxwwwwwxxyz{}~}|{zyxvtqnjfb`^^aelt}}zwtqnmkkklmnprstuvvvvvuutttttuvwxz{}~~|yvtqnljihiknsw}~|{zyyxxwwwxxxxyyzz{||}~~|yvspmjhfeefhkpv|}{ywutsrppoonnnnnnoopqqrstuvwxyz{}~~}|ywusqpooprtx}~}{zyyxxxxyyz{|~~{ywvuttsqpmjgda__`ciow}zwtrpooooqrsuvwxyyxxwwvvuuuuvvwyz{}~}{xvsqnljihijmpty~}|{zzyyyyyyyyzzz{{|}}~|zwuromjhfeeegjnrx~~|{yxwvuttssssssssttuvvwxyzz{|}~~~|{ywusqponopsvz~~|{zzyyyzzz{|}~|ywusrqqppnmjheb```bfkrz~{xvtsrrrsuvwxz{{{{{{zyyxxwwwxxyz{|}~~}{yvtrpnlkjjkmosw{~}|{{zzzzzzzz{{{||}~~}|ywuspnljhfeeegilpuz~|{zyxwwvvvuuuvvvwwwxxyz{{|}}~~}{zxusrponnnoqsvz~~}|{{{{{||}~}zxusqpoonnmlkifdba`bdhnu||zxwvvwxyz{|}~~~~}}|{zyyxxxxyzz{|}~|{ywtrpnmkkjklnqtx|~}}||{{{zzz{{{{|||}}~~~}{zxvtrpnljhgfeffhknrw|~}|{zzyyyxxxxxyzz{{{||}}~~~}|zywvtrqponnoprux|~}||{|||}}~~{xuspnmllkkkkjhgedbbbdgkqx}{zyyz{|}~~}|{zzyyyyzz{|}~~|zxvtrqomlkkklnpsvz~~}|||{{{{{{{{{|}}}~~~}|{yxvtsqomkihgfeefgjlpty~~~}|||{{{{{|||||}}}~~~}|{yxvusrponnnnoqsuy|~~~~~~}}||||}~~|yvsqomkjjjjjjihgfdcbbcehmsz~}|||}~}|{{zzzz{{||}~~~}|zywvtrqonmmmmopsvy|~~}}|||||||||}}}}~~~~}}|{zyxvutrpomljigfeeefgiknrvz~~~~~~~~~~~~}|{zxwvtsrpoonnnoprtwz}~}|{{zz{{|}~~~}{xuspnkjihhhhhhhgfedcbcdgjou{~}||{{{{{||}}~~~}|{zywvtsqponmmmnprtwz}~}}}}|||||||||}}}}}}~~~~~~~~~~~~}}}||{zyxwvutrqpnmkjhgffeeeghjlpsw{~~}|{zxwvusrqponnnnoprtwz}~}{zyyxxyyz{{|}}}}|zxvtqnljhgffffggggfeddccdfhlqw}~}||{{{{{|||}}}}}}||{zzywvutrqpoooopqrtwz}~~~}}}}}}}}}}}}}}}}}}}}}}}}}|||{{zyyxwvutsrponlkjhgffeeffhilnruy}~~}|{zyxwutsrpoonnnnopqsvx{~~}|{zyxwwwwxxyzz{{{zyxvtqnljhfeeeeeffgffeedddegjnsy~}||{{{{{{||||||||{{zyxwvutsrqpooopqrtvx{}~~}}}}||||||||||||||{{{{{zzzyyxxwwvutsrqponmkjihgffeeffgikmpsvz~~~}|{zzywvutsrqponnnnopqsuwy|~}|{yxwvvvuvvwxxyyyyxwusqnljgfedcddeefffffeeeegilpu{~}||{{zzzzzzzzzzzyyxxwvutsrrqpppqqstvxz}~~~}}}}||||||{{{{{{zzzzyyxxwwvuutsrqponmlkjihgffeeefghjlnqtx{~}}|{zyyxvutsrqponnmmmmnoqrtwy|~~|{yxwvuuttuuuvwwwxwwutrpmkigedccccdeefffffeeefhjnrw|~}}|{{zzzzzzzyyyyxxwvvutsrrqqqqqqrsuwy{~~~~}}|||||{{{{zzzzzyyxxxwwvvuttsrqpponmlkiihgffeeffghjknpsvy}~~}|{{zyxwvusrqpoonmmmmnoprsuxz|~}{zxwvuttsssttuuvvvvutrpnligedbbbbccdeffffffffgiloty~~}|{{zzzzzyyyyxxxwvvutssrqqqqqqrstvxz|~~~}}|||{{{zzzyyyxxxwwwvvuuttsrrqpoonmlkjihhgfffeffghikloqtwz~~}||{zyxwvutsrqponmmmmmmnoprsuwz|~}|{yxvutssssssttuuuuutsqpmkigecbaaabcdefffggfffgikmquz}|{{zyyyxxxwwwvvvuttssrrrqqqrrsuvxy|~~~}}||{{zzzyyyxxxwwvvuuttssrqpponmllkjihhgfffefffghjlnprux{~~}}|{zyywvutsrqpponnmmmmnopqstvx{}~|{yxwutsrrqqqrrssstssrqomkigecba`aabcdeffgggggghjlosw|}|{{zyyxxxwwwvvvuuttssrrrrrrsstvwyz|~~}}||{{zzyyxxxwwvvvuutssrrqpponmllkjiihggfffefffghikmoqtvy}~}||{zyxwvutsrqpoonnnnnnopqrtuwy{~}|zywutsrqqqqrrrssssrqpomkigecba```abcdeffggggghikmptx}~}|zzyxwwvvvuutttsssrrrrrrrsstvwxz|~~}}||{zzyyxxwwvvuuttsrrqpponnmlkkjihhggffeeeffghijlnpruwz}~~}|{zyxwvutsrrqponnmmmmmnopqrtuwy{}}|zywvtsrqqqpqqqrrrrqqpomkigecba````abcdefgggghhijlnruz~~|{zyyxwwvvuuuttsssrrrrrrrsttuvxy{}~~}||{zzyyxxwwvuuttssrqqpoonmmlkjjihhggffeeeeffghikmoqsvx{~~}}|{zyxwvutsrqpponnnmmnnooprsuvxz|~~}{yxvusrqqppppppqqqqpponljhfdba`___`abdefgghhhhijkmpsw{~|{zyxxwvvuuutttsssrrrrrssstuvwyz|}~}}|{{zyyxwwvvuttsrrqpponnmllkjiihggfffeeeeffghijlnprtwy|~}|{{zyxwvutsrqpoonnmmmmmnooqrsuvxz|~~}{yxvusrqqppppppqqqqppomljhfdca`___`abcdefghhhhiijlnqtx|~|{zyxwvuuttsssrrrrrrrrrsstuvwxz{}~}||{zyyxwwvvuttsrrqpponnmlkkjiihhggfffeefffghijkmoqsuxz}~}|{zyxwvutsrrqpoonnnmmnnoopqstuwy{|~~|{ywvtsrqppoooopppppoomlkigecb``___`abcefghhhiiijkmoruy}}|{zxxwvuutsssrrrrrrrrrssttuvxyz|}~}|{{zyxxwvvuttsrrqpponmmlkkjiihhggfffeeeffgghiklnprtvy{~~}|{zyxwvutsrqqponnmmmmmmnnopqstvwy{}~~|{ywvtsrqqpppppppppponmlkigedba`___`abcdefghhiiijklnpswz~~|{zxwvuttssrrqqqqqqqqrrstuvwxy{|~~}||{zyxxwvuutsrrqpoonmmlkkjiihggffffeeefffghijkmoqsuwy|~~~}|{zyxwvutsrqpponnnmmmnnnopqrsuvxz{}~|zxwutsrqppoooooppooonmkjhfeca`____`abcefghiiijjklmoqtx|}|{yxwvutssrrrqqqqqqqrrsstuvwyz{}~}|{zyyxwvuutssrqpponmmlkkjiihhggfffeeefffghhjklnoqsvxz}~}|{zyxwvuutsrqppoonnnnnnoopqrstuwxz|}}{zxvusrqppooooooooonnmljigedba`____`abdefhhiijjkklnpsvy}~|{yxwvutsrrqqqppppqqqrsstuwxy{|~~}|{zzyxwvuutsrqqponnmlkkjiihhggfffeeeeffgghijlmoprtwy{}~}}|{zyxwvutsrqppoonnnmnnnoopqrstvwy{|~}|zxwutsrqppoooooooonnmlkigfdba`____`abcefghiijjjklmoqtwz~~|zyxvuttsrrqqqqpqqqqrrstuvwxz{}~~}|{zyxwvvutsrrqponnmlkkjiihhggfffeeeefffghijklnoqsuwy|~~}|{zyxwvuttsrqppoonnnnnnoopqrstuvxy{}~}{zxvusrqppoooooooonnmlkjhgecba`____`abdefghijjjkllnprux{}|zywvutssrrqqqqqqqqrrstuuwxyz|}~}|{zzyxwvutssrqpoonmllkjjihhggffeeeeeeffgghijkmnprtvxz|~~}|zzxwwvutsrqppoonnnnnnnoopqrstvwxz|}~|zxwutsrqqpppoooooonmlkjigedba`____`abcefghiijjkklmnpsvy|}|zywvutsrrqqpppppqqqrstuvwxy{|~~||{zyxwvutsrqqponmmlkjjihhggfffeeeeeeffghijklnoqstwy{}~}|{zyxwvuttsrqppooonnnnnoopqrstuvxy{|~}{zxwutsrqpppoooooonnmlkihfecb``____`abdefghijjkkllnoqtvz}}{zxwvutsrqqqppppqqqrrstuvwxz{}~~}|{zyxwvuutsrqponnmlkkjiihggfffeeeeeeffgghijkmnprsuwy{~~}|{zyxwvutssrqppooooooooopqqrstvwxz{}~~|zywvussrqqppppoooonmlkjhgecba`____`abcdfghijjjkklmnpruw{~}|zywvutsrqqpppppppqqrstuvwxz{}~~}|{zyxwvutsrrqponmllkjiihhggfffeeeeeeffghijklmoprtvxz|~}|{zyxwvuttsrqqppooonnoooppqrstuvwyz|}}|zxwvtsrqqppppoooonnmljihfecb``____`abdefghijjkklmnoqsux|}{zxwvtssrqqppppppqqrsstuvxyz|}~}|{zyxwvutsrqponnmlkjjihhggfffeeeeeeffgghijkmnpqsuwy{}~}|{zyxwvutssrqqppoooooooppqqrstuwxy{|~}{zxwutsrqqpppoooonnmlkjigedca`____``acdeghijjkkllmnprtvy|}|zxwvusrrqppppppppqqrstuvwyz|}~~}|{zyxwvutsrqponmllkjiihggfffeeeeeeeffghiiklmoprsuwy{}~}|{zxwwvutsrrqppooooooooppqrstuvwyz{}~~|zywvutsrrqqppppoonmlkjigfdcba`____`abdefghijkkllmnopruwz}~}{zxwutsrrqpppppppqqrstuvwxy{|}~}|{yxwvutsrqpoonmlkjjihhggfffeeeeeeffgghijklnoqrtvxz|~}|{zyxwvuttsrqqpppooooooppqrrstuwxy{|}}|zxwvutsrqqppppoonnmlkjhgedca``___`abcdeghijjkkllmnoqsux{~~|{yxvutsrrqqpppppqqrrstuvwyz{|~~|{zyxwvutsrqponmlkkjiihggfffeeeeeefffghiijlmnpqsuwxz|~~}|{zyxwvutssrqqpppoooopppqrrstuvwyz{}~~|{yxwuttsrrqqqppoonmmkjigfdcba`___``abcefghijjkllmmoprtvy|~}{yxwutsrrqpppppppqqrstuvwxz{|~~}|{zyxwvutrqpoonmlkjjihhgfffeeeeeeeffgghijklmoprtuwy{}~}|{zyxwvutsrrqqppppoppppqqrstuvwxyz|}}|zyxvutssrrqqpppoonmlkjhgedca``___`aacdefhijjkkllmnoqruwz}~|{yxvutsrrqqpppppqqrsstuvxyz{}~~}|{zywvutsrqponmllkjiihggfffeeeeeeeffgghijkmnoqrtvxy{}~}{zyxwvvutsrrqqppppppppqqrrstuvwxz{|~}|zywvutssrqqqppoonnmljigfdcba`___``abcefghijjkllmmnpqsux{~~|{yxwutsrrqqpppppqqrrstuvwyz{}~~}|{yxwvutsrqponmlkjjihggfffeeeeeeeeffghiiklmnpqsuvxz|~~}|{zyxwvuttsrrqqpppppppqqrrstuvwxy{|}~|{zxwvuttsrrqqqpoonmlkjhgedcaa`___`aacdefghijkkllmnoprtvy{~}|zyxvutsrrqqppppqqqrstuvwxyz|}~~}{zyxwvusrqponmllkjihhggffeeeeeeeeffgghijklmoprtuwyz|~~}|{zyxwvuttsrrqqqpppppqqrrsttuvwxz{|~~|{yxwvutssrrqqppoonmljihfedba``__``abcdeghijjkllmmnoqstwy|}|zywvutsrrqqqppqqqrsstuvwxz{|}}|{zyxwutsrqponmlkjjihggffeeeeeeeeeffgghijkmnoqrtvxy{}~}|{yyxwvutssrrqqqqpqqqqrrsstuvwxy{|}~~}{zyxwvuttssrrqqponmlkjhgedcba``_``aacdefghijkkllmnopqsuxz}}|zyxvutsrrqqqppqqqrrstuvwxy{|}~~}|{zxwvutsrqponmlkjihhggffeeeeeeeeefgghijklmnpqsuvxz|~}|{zyxwvvutssrrqqqqqqqqrrrstuvwxyz{|~~}{zyxwvuttssrqqpponmlkihfedba``````abcdefhiijkklmmnoprtvx{~~}{zywvutsrrqqqqqqqrrsttuvwyz{|~~}{zyxwvtsrqponmlkjjihggffeeeedeeeeffghhijklnoprtuwyz|~~}|{zyxwwvuttsssrrrrrrssttuuvwxyz{|}~}{zyxxwvuutssrqpponmljihgfedcbbbbbccdefghijkklmmnopqstvxz|~}|{zyxwvvutttsssstttuuvwxxyz{}~~}|zyxwvutsrqpoonmlkkjiihhhggggggggghhijklmnopqrtuwxz{}~~}|{{zyxxwwvvuuuuuuuuuuvvwwxyzz{|}~~}|{zyxxwvuutsrrqpoonmlkjihhgfffffffgghijjkllmnopqrstuvxz|}~}|{zzyxxwwvvvvvvvvvvwwxyyz{||}~~~}|{zyxwvuttsrqpoonmmllkkjjjiiiiiiijjjkklmnnoprstuwxy{|~~}||{zzyyxxwwwwwwwwwwwxxxyzz{||}~~}|{zzyxwwvuutssrqqponnmlkkjjiiiiiiijjkklmmnoopqrrstvwxz{}~~~}|{{zzyyxxxxwwwwxxxxyyzz{||}~~~}|{{zyxwwvuttsrqqpoonnmmmllllkkkkklllmmnnoppqrstuwxyz{}~~~}}|{{zzzyyyxxxxxxxyyyyzz{{||}~~~}||{zzyxwwvvuttsrrqpponnmmmlllllllllmmnnooppqrsstuvwxz{|}~~}||{{{zzyyyyyyyyyyyzzz{{||}~~~}}|{{zyxxwvvuttsrrqqppooonnnnmmmmmnnnnooppqrrstuvwxyz{|}~~~}|||{{zzzzzzyyyzzzzz{{{||}}~~~~}||{zzyyxwwvvuttssrrqpppoonnnnnnnnnnoopppqrrsstuvwxyz{|}~~~}}|||{{{zzzzzzzzzz{{{{||}}~~~~~}}|{{zyyxwwvvuttssrrrqqppppoooooooppppqqrrsstuuvwxyz{|}~~~}}|||{{{{zzzz{{{{{{{|||}}~~~~~}}|{{zzyxxwwvvuuttssrrqqqpppppppppppqqqrrssttuvvwxyz{{|}~~~}}}|||{{{{{{{{{{{{||||}}~~~~~}||{{zzyxxwwvvuuttsssrrrrqqqqqqqqqqqrrrssttuuvwxxyz{||}~~~~}}}||||{{{{{{{{{||||}}}~~~~~}||{{zzyyxxwwvvuuuttsssrrrrrrqrrrrrrrsssttuuvvwxxyz{{|}~~~~}}}||||||{{{|||||||}}}~~~~~}}||{{zzyyxxwwvvvuuttttssssssssssssssstttuuvvwwxyyz{{|}~~~~}}}}|||||||||||||}}}}~~~~~}}|||{{zzyyxxxwwvvvuuuttttsssssssssttttuuuvvwwxxyyz{{|}~~~~~}}}}}||||||||||}}}}}~~~~~~}}|||{{zzyyxxxwwwvvvuuuttttttttttttttuuuvvvwwxxyzz{{|}}~~~~}}}}}}}}|||}}}}}}}~~~~~~}}}||{{{zzyyyxxwwwvvvvuuuuuttttttuuuuuuvvvwwxxyyzz{{|}}~~~~~}}}}}}}}}}}}}}}}~~~~~~~~}}}||{{{zzyyyxxxwwwvvvvvuuuuuuuuuuuuvvvvwwxxxyyzz{{|}}~~~~~~}}}}}}}}}}}}}}~~~~~~~~}}}|||{{zzzyyyxxxwwwwvvvvvvvvuuuvvvvvvvwwwxxyyyzz{{|}}~~~~~~~~}}}}}}}}}}~~~~~~~~~~}}}|||{{zzzyyyyxxxwwwwwvvvvvvvvvvvvwwwwwxxxyyzz{{||}}~~~~~~~~~}}}}}}~~~~~~~~~~~}}}|||{{{zzzzyyyxxxxxwwwwwwwwwwwwwwwwwxxxxyyyzz{{||}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||{{{zzzzyyyyxxxxxwwwwwwwwwwwwwxxxxxyyyzzz{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}|||{{{{zzzyyyyyxxxxxxxxwwxxxxxxxxxyyyyzzz{{{||}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}||||{{{{zzzzyyyyyyxxxxxxxxxxxxxxxyyyyzzzz{{{||}}}~~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{zzzzyyyyyyyyxxxxxxxyyyyyyyzzzz{{{{||}}}~~~~~~~~~~~~~~~~~~~~}}}}||||{{{{{zzzzzzyyyyyyyyyyyyyyyyyyzzzzz{{{|||}}}~~~~~~~~~~~~~~~~~~}}}}|||||{{{{{zzzzzzyyyyyyyyyyyyyyzzzzzz{{{{|||}}}~~~~~~~~~~~~~}}}}}|||||{{{{{zzzzzzzzzzyyyyyzzzzzzzzz{{{{||||}}}~~~~~~~~~}}}}}|||||{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{||||}}}~~~~~~~~~}}}}}||||||{{{{{{{zzzzzzzzzzzzzzzz{{{{{{||||}}}}~~~~~~~~}}}}}}||||||{{{{{{{{{{zzzzzzzzz{{{{{{{{|||||}}}}~~~~~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}~~~~~~~~~~}}}}}}||||||||{{{{{{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~~~~~~}}}}}}}|||||||||{{{{{{{{{{{{{{{{|||||||}}}}}}~~~~~~~~~~~~}}}}}}}|||||||||||{{{{{{{{{{{|||||||||}}}}}~~~~~~~~~~~~~}}}}}}}}||||||||||||||||||||||||||||}}}}}}~~~~~~~~~~~~~}}}}}}}}}|||||||||||||||||||||||||}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}|||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}~~}{|||}}~|smha_bo~rmmquy~zvrnjgfecdfhjnsvz}ytnic^YTOMJHFEDEGJPXcsYZ`Ke}yvtrrrtwz|}xuqnkigffhlnsx~vdoxnpv~}yvsppnnnoqsvz~tUBLwp^ROOSX^cfillmifecb`^\[ZYYZ[\]aeimqvz}{zzyyy{|~{sgZSYl{xwy|~}}}~}kZKDI\zyk`WQMJJIHHIIJIIJLMNPQRUWZ\`cfjmptwy|wpf_Z^jw{vronmmmnopqstvxwx{}yj[ND>AK_x»re[SMHFEEFHJKMNOOOLIIHIJKNRVZ_diosx{~{|{||||}}}|zwsmgb][^gtsfZPIIO]ryoe]VQLHECA@????@ABDFHJMORVY]`cgimoruwy{|~|wqib\YZ_jx|wtrqppqrsuwy{~|o`QE<;APf{qida_^[XTOJEB?>?AEINSW[^`abbbbcdegilpsvz~}wph`ZVW[er|xvtsrrrrrsttuvwxz{}|qeZQKILWgzxne]WQLHFCBA@@ABCEFHJLORUX[^behlortwz|~}xrlfccgp|~{xvuttttuvwy|~zocUJA=AK]sztoljfc^YSNIEBABDHLPTX[]_`_`__``bdfilpswz}}ysmf`ZVUX_jw~{ywvuttuuuvwxyz{}~yod[RLJLTaqwng`ZVROLJHHGGHHJKMOQSVY\_begkmpsuxz|~}xsnhc`_bhr}zwutsrrstuwy|~zqfZOE@AHVj}yvsokf`ZTOKIHILOSWZ]`abbbbbbbcdfilorvy}|xsmga[WUW\ep}|yvutssssttuvwxy{|~}ulcZSNKMR\j{wpjd_[XURQPOOOOPQSTVX[]`behjmpsuwy|~|xsniebabgoz}{xwvuuuvwy{~~{wrkaWME?>BM]q}zwusmga[VRPOOQTX\_ceghhhggffghikmpsvy|~zupjd_[YY]dmy}{yxwwwwwxyyz|}~wph`XQLJJNVbp{tnid`\YWUTSRRRSTUVXZ\^acfhkmpruwy{}~|xtojfcaaekt~|zyxxxyz|~|yvsnibYQIC@BJVh{~zuoic]XTRQRTW[^adefhhggfeeefhjlnqtwz}~{wsnid_[YY[ais~}{{zzzzz{|}~~wphaXRNKKNT^ky|vqlheb_]\[ZZYZZ[\^_acegikmpqtuwy{|~}{xtplgc`^^afmv~|zyxxyy{}zvspmjfaZSLFCCHR`q|vpic_[ZY[]_cfhjkkkkjihhhhijlnqtvy|~}zvrmid_\YYZ^dmw~}{zyyyyyzz{|}ysmf`YTPMLNS[fr~ytpmjgedbaaaaabcdeghjkmoqstvxz{|~~|zwtplieb``aeks|~|{{{|}~~xsoligda]XRLFCBEMXhy}wqkgcaaacfhkmoqqqppnmmlllmnprtvy{}~{xuqlhc`]\]`elu~~}}|||}}~~ytnhb]WRNKJKOV_jvzvroljhfeddeeeffghjkmnoqrtvxyz|}~~}{xvsolheb`_`chow~~~~}wrlgeba^[XSNIEDEJS`pztojgfefhjmoqrssrqponllllmnoqsvxz|}~|zwtplhda^]]_cipy~~~zvqlga\WSOLLLOU\fq}}yvsqnmkjjiiiijjklmopqrtuvxyz{|}}~~~~~~}|{yxuspmifc`_^^adjqy{tnieb`_][XUPLHEFIPZhxzuqnmmnprtvwxxxvusrponnnopqsuwyz|}~~~}|{xvrokhda^]\^aels|~~}}}}~~}zvrnie`[WSPNMMPT[cmx|zwutrqppoooppqqrrstuvwxyz{||}}}~~}}|{zywtrolifc`^]]_bgmt{{toid`]\ZYXVSPLIFFHMUao~{wusstuwy{|}}||zxwusrqqqqrsuvwyz{{{{{yxvspmjgdb``acglsz}{xuqmiea]YUQNLKKMQW^gq{~|zxwvutssssttuuvwwxyz{{|}}~~~~~~}|{zywurpmjgdb`_^_aejqx~xslfa]ZXVVUTRPMJHGGKR[hu|yvuuvxz{}~~~}|{ywutsrrqrstuvwxyzzzyxwuspmjhecaaacfkpw~~|yvspmiea]YVROMLLNQV\dmw}{zyxxwwwwwwxxxyyz{{|||||||||{zyxvuspnkifca_^^^`chms{}|||}~{wqke`[XUTSSSRQOLJIIKPXbo|~|{|}~}zxwutsrrsstuvwxyyyxwvtromjgeca``bdhmsy}|zxvspnjgd`]YVSPNMMNPTZair|~}|{{{{zzz{{{{||||||||||{zyxwusqomjhec`_]]]^adiou|}{yyxxyzz|}}}|zvrmgb]XURQQPPPPOMKJIKNU]hu~|zxwuttstttuvvvvvutsrpnkigedccdfimrx~}|{zywusqolifc`]ZWTQOMLLMORW]dlu~~~~~~~~~~~~~~}}||{zywvtrpnkifdb`_^^_adhmry~|zxvvuuvwyz{{zxvrmhb]XTQONNNNONMLKJKMQXbmz}{ywvutttttuuuvuutsrpnljhfedddfhlqv|~~~~~~}~}}||{zyxwvtrqnljgeb_\YVTQONMLMORV[biqz~~~~~~~}}}||{zyxvusqomkhfdb`_^^_`cfkpu{~{ywutssssuvwwwvsplgb]XSPNMLMNNNNMLLLMPV^ht~{ywvutttttttttssrqomkjhfedcdegjnrx}~~~~}|||{zzyxwvusrpomkhfca^\YVTRPNMMNORUZ_fnv~~~~}||{zywvtsqomjhfca`^]]]^`cgkpv|}zxvsrppoppqrsssrpmie`[VRNLKKKLMNNNMMLMPT[cny~|zxvuttsssrrrqponmkjigfeefghknsw}~~}}||{{zzyyxwwuusrqonljhfda^\YWURPOMLLMNPSW]cjqy~}|{zxwutqpnkigeca_^^^_`cfjnty~}{xusqonmmmnoopponkhd_ZUQMJIHIJKLMNMMMMORW^gr~~|zxwvutsssrrqqponlkjhggfggiknrv{~}|{{zzyxxwvuutrrpomljhgeb`^\YWUSQONMMMNPRV[`gnu}~}|{zxwutrpnligeca`_^^_`behmqv|~{xuspnlkkkkllmmmljgd_[VQMJHGHIJKMNNNNNORV\cmx}zxvusrqpponnmlkjihgffffghjmpty~~}|{zzyxwvvttsqponlkigecb_][YWUSQPNMMMNPRUY^dkry~}|{yxvusqomkigdba_^]]]^`beimrw||ywtqomkjjjjkkllkjhfb^ZUPMJHGGHIKMNOOOOPRUY`hr}}{ywutsqqponnmlkjihggfgghjlosw{~}|{zyxwvutsrqponlkihfeca_][YWUTRPONMMMMOQTX\agnu|~|{yxvtrpnljhfdba`_^^_`behlpuy~}zwtqoljihgghhiiiigeb^ZVQMJGFEFGIKMNOOOPQSW\clv}{ywutrqqponmllkjihhhhhijlorvz~}|{zywwutsrqponlkjhgedb`^][YWUSRPONMMMNOQSW[_ekqx~}{zxwusqomkigecba`__`abegknsw|~{xuromjhgffffggggfeb_[WRNJHFEFGIJLNOOPPQSVZ`hq{~{xvtrqonmlkjiihggffgghiknqtx|~}{zyxvutsrpomlkihfeca`^\ZYWUSRPONMMMNOPSVY^chnu{~}|zxvtsqoljhfdca`_^^^_`behkosw|}zwtqnkigfeeeeffgfeda^ZVRNJGFEEFGILMOPQQRSUY^dlv}{xvtrponmlkjiihhggghhjkmpsvz~~|{yxvutsqpomlkjhgedb`_][ZXVUSQPONMMMMNPRUX\afkqx~}|zxvtrpnljhfdca`___`abdgjnquz~{xuroligedcccddddcb`^ZWSNKGEDCDEGJLNOPQRSTW[ahpy}zxvtrponmlkjiihhhhhijkmoruy}~}{zxwutsqpomljigfeca`^][YXVTSQPONMMMMNOQSVZ^chntz~}{ywusqomkigedba````abdfilptx||xuroligeddccddddcb`]ZWSOKHEDCDEGILNOPQRSTVZ^dlu~}zwuspomlkjihggfffghijlnqtw{}{zxwusrpomljihfdca`^\[YXVTSRPONMMMMNOQSVY]aflqw}}{ywusqomkigecba`___`abdgjmqtx|}zvspmjhfdccbcccccb`^[XTPLIFDCCDFHKMOQRSTUVY]bhpy|ywtrpnmkjihhggggghijkmpsvy}}{zxvusqpnmkjhgedb`_]\ZYWUTSQPONNMMMNOPRUX\`dintz|{ywurpnljhgecba````acdgiloswz~~{xtqnkhfdcbaaaaaaa`^[XUQMJGDCBCDFIKNPQRSTVX[_elt||yvtrpnmkjiihhgghhijkmorux{~|zxwusrpnmkjhfecb`^][ZXWUTRQPONMMMMNNPRTWZ^bglqv|}{ywusqomkigedba````abcehknqtx|{xtqnkhfdcbbbbbbaa_^[XUQNJGECCCDFHKMOQRSTUWY]bhow{xvsqnmkjihgffffggijlnpsvy}~|zxwusqpnlkigfdb`_]\ZXWUTSQPONNMMMNNPQSVY\`eioty~|zxvtrpnljhfdcba```abcdgilorvz}}yvsoligecbaaaaaa`_^\YVSOLHFDCCCEGJLOQRTUVWY\`els{~zwurpnlkihgggfgghijkmorux{~}{ywusqpnljigedba_]\ZYWVTSRPONNMMMNNOQSUX[_cglqv|~|zwusqomkihfdcbbaaabcdfhknqtx{{xtqmjhecba```___^]\YWTPMIFDCBBDFHKMPRSTUWX[^bhov}zwtronlkihhgggghijkmoqtvy}~|zxvtrpnmkigedb`_]\ZXWUTSQPONNMMMMNNPQTVY]`einsx~|zxvtrpnljhfedcbaaabcdfhjmpsvz}|xuqnkhfdcbaa````_^\ZWTQMJGDCBBCEGJMOQSTUVXZ\`ekrz|yvsqnlkihgfffffghikmorux{~~|zwusqonljhfeca_^\ZYWVTSRQOONMMMMNOPQSVX\_cglqv{~|ywusqomkigfdccbbbbcdegiknqtw{~~zwspmjgecbaa```__^][XUROLHFDCBCDFILNQSTVWXY[_chov}{xurpnljihgffffghiklnqsvy|~|zxvtrpnljhgeca`^\[YWVUSRQPONMMMMNNOQSUXZ^afjnsx}}{ywtrpnlkigfedcbbbcdeghkmpsvy||xuqnkhfdba`____^^\[YVSPMIGDCBBCEGJMORTUVWYZ]aekry~zwtromljihggggghijlnprux{~~|zwusqomkigedb`^\[YXVUSRQPONMMMMMNOPRTVY\_cglquz~|zwusqomkjhgedcccccdefhjlorux{~}yvroligecba```__^][YWTPMJGECBBCEGILOQSUVWXZ\_chnu|}zwtqomkihgffffghijlnpsvx|}{ywtrpnljhfdca_][ZXWUTRQPONNMMMMNOPQSUX[^bfjnsx}}{ywtrpnljigfedccccdefgikmpsvy|{xtqnkhfdcaa``__^]\ZXUROLIFDCBCDFHKNPRTVWXZ[^afkqx|yvspnljihgfffghijkmortwz}~|zwusqomkigeca_^\ZYWVTSRPOONMMMMNNOQSUWZ]`dhlquz}zxvtrpnljigfedddddefgijmortwz}}yvroligeca``__^^]\ZXVSPMJGECBBCEGILOQTUWXY[]`chnt{|yvspnljhggfffgghjlnpruwz}}{ywtrpnljhfdb`^\ZYWVTSRPONNMMMMMNOPQSUX[^bfjnrw|~{ywusqomkihgfeddddefghjlnqtvy|~zwspmjhfdcba``__^\[YVTQNJHEDCBCDFIKNPSUVWYZ\^afjpw~~{xuromkjhggffgghikmoqtvy|}zxvtqomkigeca_][ZXVUSRQPONNMMMMNNPQSUWZ]`dhlpty~}zxvtrpnljihgfeeddefghikmprux{~|yuroljgedbaa`__^]\ZXUROLIGECCCDEHJMORTVWYZ[]`dhmsz}zvtqolkihggggghijlnpruwz}~{ywurpnljgeca`^\ZXWUTRQPONNMMMMNNOQRTVY\_bfjnrw{~|zwusqomljihgfeeeefghikmoqtvy|~{wtpnkhfdcba`__^]\ZYVTPMJGEDCCCEGILOQSUWXY[\^bfjpw}}zwtqnlkihgfffghijlnpsux{}}{xvtqomkifdb`^][YWVTSRPONNMMMMMNOPQSUWZ]`dhlpty}}{ywtrpnmkjhggfffffghikloqsvx{~{xuroljgfdcba``_^][YWTQNKIFDCCCDFHJMPRTVWYZ\]`chmsy|xuspnljihgggghijlmortwy|~|zwuspnljgeca_]\ZXVUSRQPONMMMMMNNOQRTVY\_bfjnrv{~|zxusqpnlkihggffffggijlmprtwz|~zwtqnkigedbba`_^]\ZXVSPMJHEDCCCEGILOQTVWXZ[]_bfjpv|}zwtromkjihggghijkmoqsuxz}}{yvtromkifdb`^\ZYWUTSQPONNMMMMMNOPRSUXZ]adhlptx}~{ywusqomljihggfffgghjkmoqsvy|~~{xuroljhfedcba`_^][YVSQNKHFDCCCEFIKNPSUVXY[\^`dhmry}zwtromkjihggghijkmoqsvx{~|zxusqnljgeca_][YXVTSRPONNMMMMMNNPQRTWY\_bfimrvz~}zxvtrpomkjihhgggghijkmoqsuxz}}zwspnkigfdcbaa`^][YWUROLIGEDCCDEGJLOQTVWYZ[]_bfjou{|yvsqomkjihhhhhiklnprtwy|~{ywtrpmkifdb`^\ZXWUTRQPONMMMMMMNOPRTVX[]adhkosx|~|zwusqpnlkjihhggghijklnprtvy|~|xuromkhgedcba`_^\[XVSQNKHFECCDEFIKNPSUWXZ[\^adhlrx~~{xurpnljihhhhhijlmoqsvx{}}zxusqnljgeca_][YWVTSRPONNMMMMMNOPQSUWY\_bfimquz~}{ywusqonlkjihhhhhijklnprtvx{~|yvsqnljhgedcba`_][YWTQNLIGEDDDEFHJMORTVWYZ\]_bfjotz~{xurpnlkiihhhhijlmoqsvx{}~|ywtrpmkifdb`^\ZXVUSRQPONMMMMMMNOPRTVX[]adgkosw{|zxvtrpomlkjiihhhijklmoqsuwz|~{xurpmkihfedcba_^\ZXUSPMJHFDDCDEGIKNPSUWXZ[]^adglqw}}zwtromlkjihhiijkmnpruwy|}{xvsqoljgeca_][YWVTRQPONMMMMMMNOPQSUWY\_bfimquy}~{ywusqpnmlkjiiiiijjkmnprtvx{}}zwtqoljigfdcba`_][YWTROLIGEDDDEFHJMORTVXY[\^`beinty~{xvsqomkjiiiiijklnoqsvx{}~|zwurpnkigdb`^\ZXVUSRPONNMMMMMMNOPRTVX[]`dgkosw{}{yvusqonmlkjjiijjklmnprtvxz}~{xuspnljigfedba`^\ZXUROMJHFEDDDFGJLNQSUWXZ[]_adglqv|~{xvsqomljjiiiijklnprtvx{}}{xvtqoljheca_][YWUTRQPONMMMMMMNOPQSUWY\_beilptx|~|zxvtrponllkjjjjjkklnoqsuwy|~}zwtromkjhgedcba_][YVTQNKIGEDDDEFHKMPRTVXY[\^`beinsx~}zwurpnmkjjiiijklmoqsuwy|~|zwurpnkifdb`^\ZXVTSRPONMMMLMMMNOPRTVX[]`cgjnrvz~}{ywusrpomlkkjjjjkklmoprtvxz}|yvsqolkigfedba`^\ZXUSPMJHFEDDDFGILNQSUWYZ[]_adgkpu{|yvtrpnlkjjiijkkmnoqsuwy|~}{yvtqomjheca_][YWUTRQPONMMLLMMNOPQSUWY\_beilptx|}{xvusqpnmllkkkkklmnoprtvxz|~}zwurpnlkihfedba_][YVSQNKIGEEDEEGIKMPRTVXY[\^`beimrx~~{yvtrpnmkkjjjjklmnprtvx{}|zxuspnkigdb`^[ZXVTSQPONMMLLLMMNOPRTVXZ]`cgjnruy}~|zxvtsqpommmllllmmnoprsuwy{}|ywurpnlkihfecb`^\ZXVSQNLJHGGGGHJLMPRTVXY[\^`behlqu{}{ywusqponmmmmmnopqstvxz|~~|zxvsqomjhfdb`^\ZYWVTSRQPPOOOOPQQSTUWY[^acfjmptx{}{zxvutrqppoooooppqrstvwy{|~~{ywusqomljhgedba_][YWVTRQONMMMNNPQSTVXZ[]_abegjmquy}~|zxvusrqqpppppqrstuwxz{}~|zxvtrpnljhfdb`_]\ZYXVUUTSSSSSSTTUVXY[]_bdgjmpsvz}~}{zxwvutssrrrrrsstuvwxz{|~}{ywutrpomkjhgedb`_][YXVUTSRRRRSTUVWYZ\]_abdfiknqtx{}{zywvuttsssssstuuvwyz{}~~|{ywusrpnljigecb`_^\[ZYXXWWWVWWWXYZ[\]_acehjmpsux{~}|{yxwvvuttttttuuvwxyz{|}~|zywutrpomljigfecb`_]\[ZYXWVWWWXXYZ[]^_abdfhjlnqtwz}~}|zyxwvvuuuuuuuvwwxyz{|~~}{yxvtsqonlkigfdcba_^]\\[ZZZZZZZ[[\]_`acegikmpruwz}~}|{zyxwwvvvvvvwwxxyz{|}~~}|zywvtsqpnmkjigfecba_^]\[[ZZZZZ[\]^_`acdegikmoqtvy|}|{zyyxwwwwwwwwxxyzz{|}~}|zywvtsqpnmkjigfedcba`_^^^]]]]]^^_`abcefhjlnprtwy|~~}|{zzyxxxwwwwxxxyzz{|}~}|{zxwutsqponmkjigfedcba`__^^^^^^__`abcefgijlnprtvy{}}||{zyyxxxxxxxyyzz{||}~}|{zxwutsqpomlkjhgfedccbaa``````aabbcdefhikmnprtvy{}~}|{{zzyyyyyyyyzz{{|}}~~}|{yxwvtsrqonmlkjigfeedcbbaaaaaaabbcdefgijkmnprtvxz|~}||{zzzyyyyyzzz{{|}}~~}|{yxwvtsrqonmlkjihgfeeddccccccccddefghijlmoqrtvxz|~~}||{{zzzzzzzzz{{||}}~~}|{zyxwvutsqponmlkjihggfeeddddddddeefghijklnoqrtvxz|~~}}||{{zzzzzz{{{||}}~~~}|{zyxwutsrqponmlkjihhggffffeeefffgghijklmnpqstvxy{}~~}||{{{{{z{{{{{||}}~~~}|{zyxwvutsrqponmlkjjihhggfffffffgghiijklmnpqstvxy{}~~}}|||{{{{{{{|||}}~~~}}|{zyxwvutsrqponmllkjjiihhhhghhhhhijjklmnoprstvxy{|~~~}}||||{{{{||||}}}~~~}}|{zyxwvutsrrqponmmlkkjjiiihhhhiiijjklmmnoqrstvwyz|~~~}}}||||||||||}}}~~~~}|{zyyxwvutsrqpponnmllkkkjjjjjjjjjkklmmnopqrsuvwyz|}~~}}}||||||||}}}}~~~~}|{{zyxwvuutsrqpponnmmllkkkjjjjjkkkllmnoopqrtuvwyz{}~~~}}}}}|||}}}}}~~~~}}|{zyyxwvuttsrqqpoonnmmlllllkkllllmmnnopqrstuvwyz{}~~~~}}}}}}}}}}}}~~~~}}|{{zyxwwvuttsrqqppoonnmmmlllllmmmmnnoppqrstuvwyz{|~~~~}}}}}}}}}}}~~~~}}|{{zyyxwvvuttsrrqppooonnnnmmmmnnnnooppqrsttuvxyz{|~~~~}}}}}}}}}~~~~~~}}||{zzyxwwvuutssrrqqppooonnnnnnnnoooppqrrstuvwxyz{|}~~~~~}}}}}}~~~~~~~}}|{{zyyxwwvuutssrrqqpppoooooooooopppqqrsstuvwxyz{|}~~~~~~~~~~~~~~~~~}}||{zzyxxwwvuuttssrrqqppppppoopppppqqrrsttuvwxyz{|}~~~~~~~~~~~~~~~~~}}||{{zzyxxwwvuuttssrrrqqqpppppppqqqrrrsstuuvwxyz{|}~~~~~~~~~~~~~~~~~}||{{zzyyxwwvvuuttssrrrrqqqqqqqqqqrrrssttuvvwxyz{|}}~~~~~~~~~~~~~~~~}}||{{zzyxxwwvvuutttssrrrrrrqqqrrrrsssttuuvwwxyz{||}~~~~~~~~~~~~}}||{{zzyyxxwwvvuuuttsssssrrrrrrrssssttuuvvwxxyz{{|}~~~~~~~~~~~}}}||{{zzyyxxwwvvvuuttttsssssssssssstttuuvwwxxyz{{|}~~~~~~~~~}}||{{zzyyyxxwwvvvuuuttttttststsuxtr}{ywtrt}vu|xx~|yxw{~|m{~|xvx|xw~~rs|uvp|uyyorl~|w~uov~x{vz|bdjuhtojemljn{ustuqw~~xx}l{xxtywtxuyw{lxy}yszs{~~t~u{xl|{vqpn|wtk}zv~yx{syec~ltitrpdjihv~utturrz|{w~l|x}w~tuzsyuwnx{|oxnzy~}sv||k}|vqqox~u~g}rw~zx}mzuehjyivttbjdituuurny~~wuyox~yl}xsy{|v|z}p{|xqunxux{pyns~y|nuq~{wzvf~oyz~y{wl~srdq}izlxxvaj`r|tvvuri|vqrsss|izu|{r~zu|t}zurtnsutyoziw~z}pyu~{wzvdzkw|}{wyf|nrjsi{l{~zak_t{twuvrbysmqtssiyv~zq{ut{v{{ypumunsv}ownt}{vzzw{vwdz~cw}|~s`xmopqkzk{ekcm~twvvvdlyin|lxzf|v{wqzytwzv|nyk{fuovu|wy|}~{pvoYouksZ|pypTxzzrpon~|lkIdqowgPy|ymivi}tn|{rvsc{ntkwu{|jyxwqwsrsgmvwvp~uyjiyppzc^pr[}uf|Zj_~}jrefbv{u|ef}us|xysy~tzswzsmgrvzwjgxixy~}yx}ijv{uvsslysq}{vyvjk}niu|jrpkgovwaqn[lzo}rr}hwtjx~satw{kksz|nwzwyuqqxuo|yfw|i|u|g|usoywlni~offmyqvvptf^j}so}imwylu}jilhh{vxmmm|du}r|lsuv||}xstvzmox}|d|zuihwovy{|gpfqxpdhluzn^{tivwx~Rvyy~ymgppdTh~~m|y}wxzu{x{nmyzvrm}z~suuivpk}Wt{}vwiir{wzux]}to}iwsufp~ir_s~~x`uvshxvZjr|er{wnlzh}on{}s~yj~|zuyzxm|wsxponzz}s`{qzp]lfqrlnsl{sssf{eitrywgshwlwozobntrn~rooxm~kmiv|hctcltk~pm}byopzpzsoqzs|pmq_kqi{{}jfvp{anskchkzvx~hmzttqrcmyjav]Pzn`hrzwgi{zyygmuy{ZcunĂ|}ysYirk^rxpvszbqt|~zwcTr|yzc{^rozs~^c_uwvb[tz~~{{^yewvfu|nijto^u}kWuv~vlqwmycnS~ziuv|||ms]vYxitbj~|yxox}hy{ow~}jz{ezvbbys~xmvofvius{z|r_uekf^kw{gsauz|ydtfylzytlvhhk}pk}ek|kv{}~t|z^s{zrYgcru~yinYwq]wz}uyopXvi}ts~fdxc}wx}}x~p|}|txky~uiy_opceusur`|}|xuou|~}wqz~wu{}tu`dwtsj{xZlhsdls|ksvyugjhrztsq~n||v~pxknz}|~v{og|wxzuiv{zbq|z~oz}ek{vyxlyxxlrr|s}huvmvfk~~y~uv}h~~zo~y}t{|wvzvsnk{~v{tygZpx~}usm}wvrq{rywywms|pJXQ\~y{p{pPEI@V7CgHW}xn|lɽ׸hlXfzpsRTS\{bmgo}vdawl̻f=`wtqdHr\ynyqwzwszPly\gp~skbnfUSXeqXp{lVmgISPLlgVrTr}wwRCuzmYHRMȽ~qwY{j^m^t٤bXL/^mjzL,66[>7~hhHxec{ysIJMK;,BM]h^NXcbl|vt{gp[:blx}wR@QTd|]U`eLTER{ƬºsS1B!Q}{ž̾o~tBOSFCfGkpMZv@TjSSXP\T\]czd[OI\5Ooujszk˅mxj\<>78WZjwauSaPMoln||Ş_1- !<=ĺbKQIUP>gfZHDcQYj_|ziRXRD_<8]B6]\^u~rpaeKXjq^wsmuxL`\[zmVvaPY8Vzuy^v`_qű٬ɨϩv^T6:Y_mνn~sLfjvJf[9UGFTGHjidzvkvy}}erZsOFcqkwlunmxVkp_zs|olnTaW>_Thgfrmczwkzs}}kuy{ũ^^I_eOxrÞxtxopNTZegA9,AT^BFIcGZtyxjttWSI[[>5:B1=3C%bLX_S39MDFhuX_[[]gngna\KpZQJCVf[NdU??\]YgiiMsv|zxyf~zkab~xl\yvqun}rãuoezyf{|ֿųs|hVkkkj[pJqv}oc{vey{qlfvs}uioahy[ldKGamW`blTin}{rrhqxd\Rgi`LflVh\rZx|rs|tyeu~n{koymRa_;'4A4AKePlwf\ttynp[xrxr~wpuh~ϫzzusmw~xmw}xvxgkwgH[]:/EUFQU^Jmxo}qcVeZD:OODL7H3MNL]U@>\[COeXZ[Q\frf{ts{u|kkbvzqƣ~˷pwUN^YMWaaXufn`OHYMXXTdQf]a`TABWJ;Wh`eZZdxoclbiPf]WVM`cNNbV?C\[\kiY\rh|txlivrfkrstvo{wwrbkwuwxnȽϴv{l~pvifvt~obtnm{ugnzsy||~vvvehscLThbgkiO_ggyzwup_di^Zmo[lXg`dvuuo}y{vpuocseonkvmRXdJ5>H<:AE5Zmwp}sy~teu|hl|~o}rasr°{wtz{~swyspx|uvxaKV_G9FSMRXP9\eh|{ilj^Wf`MbIPECQPVTGCY`KH_^\]XZdv`ogv{q}~zzlwrco{t|{e}xzhRSZUX][Igz~zi^ghRj_hl`mknfULZ]MHY`agbitfqmfu]lfdc_aTHK\TCIZZ[bfR^rg~v~}nktomwr{uo~vrz_\otqvwgoƿºѾ}~ulqzzzriskozw}vo}x{f_osXLX_]acUMmetyv}u|n`dd^auj]rcpecqw{przz{z|ydt]gl[lgkkpq[KOW@*/:7IOTWS_|q{xuszmmv`ol\ZZ\VS`nm\Ziqtqquwgdyewtdsy~}{o`amvg[aimnnixutg|thu{}o_\ecK=BKQUXYt~m|vxvtodakqhVZkw}{}mzydye[dghc^NCIY\JDMV\_][v}tyxx}t}z{tuyytyv~uwtt}~{ve[aniXV^dijfjƷzwxwtzzoyzrvvmp{}yqb^fpgVSWZ[XSYsint}tonov~pj|jp|olloop{{r|{udXiUYdLQ\dfe\NJOUG3.259<>Nqm{˾~wo{{}{o_\fpgYZagjjgt~xwxutwmv~zlj|elt]_fjgcWIGPZQB@EJNNLYsivzsyogffcajtvi_grxyyzwkg|hlzegqwxuma^gqi[Y]ab`]gv{~qhyfdt``ktvtk]Z_eZF>?BFHK[zxŻ}~yuy}oagrzzs{rodinmg]NIO[ZMHMRVXW^xwrwyvttusysu}o|jvfkqspi]V[fi[RTY]_`d|~ƹ¾|zyvyuq||ozl||imuzxrg\_hmbURTVWWWhufxt{vtwotnzuooqqtzqw~}ytiWUdOSaMNYac`WJGLQG6037<@GZyu~µ~qu}pswwqh[W^jk_XZ`dghq|}vtsqupks{}yobkr\hkVV\`_ZOEGRYQFDIOSV[pv||qnmlmw~|phmw}}vjm}jjzjdkppmd[Zcmi]WY]_`bp{z~|}|}{pa[laVj_T\ehe^RMPWSE;ESjxqwxsqroh_XY`fcZUTVY]hzuywwz~rjkquvtnd_io\^k]RRUTQKHLU[XPJJMPU`szo}|stzzrlv~llzobbggc]X[cig]VTUVYapwjs}{||~}rortsnf[SZaQO`ZPPUXVQLMRVQF>;=AIWlzuĽwty~}zzpjihb[TSY``XQOQTXap{su{{vuw|wmilqttqiacpgYgiZSSUTPLMT\`\URSVZcr|yy{yqr|kt|ndced`[Z_fjd\VUVX]hurhyyzvxzzxy~rhfhigbYOJTYGJZSIJOROJFGLPLB;:=CM]r~wľ{w{{ukigb]WW]df`ZXY\ajy~}}~xvvz~}vlefjmmib\]ifT[dYNMONLHHNW][URSV[cpyvux|~|womx|ljxre```^ZX\ciib\ZZ\akx|qx~yx}}vkeefd`YPKS\PIZ]QMOQPLHHLQPICCGNYh|ºyux~~{wthdb^XSRX_b_YWW[`jx}z{}ywwz}|ukeehkjga[_jeU]f[PNOOMKLS\b`\Z[^dm{yy|~{uor}zinxnb__^\XX]dhf_[YZ]doyum||~yzz~{{}~vj`\\\ZUMGJVUGM\XNKLLIDBEJMKFCEKUbt{y}|~ogeb]XWZafd_[[^ckw{}|xxz~}vlecehhe_Y]gdTWc[PKKKJHIPX^^[XX\akx|yxz||xsnr}xhmwoc^^][YY_eifa\[\_grztn}|}|~~wkb_^^[UNIOYSGQ\VNMNNKHGJOPLGEGMVev¼yy||}zzmgc_[WX]bd`[XY\cmy~vy{{z{}~yqhddfgd`[\eiZTabVNMMLJKOW^`]YXZ^fq}x|}|wsu~olxwkca`][[_ejid_\[^clurisw}zxzpfa_][VOIKUTFGVVNKOW[agnywytuzyyz{yqmnmhefhsynos[BL~aV_js~}zumlzvt{qdXRMJHA957?<-/>@;=GXjzyL$@BCCDJW^UP\c\TPONNNRX^ba^]^ahq{~wz~|z{{yzzxrjeceffdaahqlagsrjghknqwɾunheqŷxhZPLIE@:69B@20<>5/-./14;CKNNMMPU\fnlen~}uwxi]`f^[m}mc\YVRMJMX]SP^fb\[\\\\_eknnnqwɿƷ~jgmqt|ƻznhjk]NRVL>62.*(*.477445:ALX]Y[mxss|ytxvlaZVX^fmu}yrsvk\`id[VUVWX\ckqrqqrv}ȴxneYNFEN`u}iZPHA;89<=:50./28@E?;IUPLS]ejmmlijow{{|}{xqeUG<62127CYr|y{oha[USTXZYXWZ`htüsjbXOFAHV^`u|uk_SLGFHNPIBMYSMR[bfihfddipx|~{sswt~}}yqkhhhe`YSTWM;=CML@CPQJGGIKNRYagjhgghms|}v~vppt{ô||~~}{y}}wka[YXURPQV[`mxi]VPJC<78@A55BF@;;<<<=@EJJIGHLS^juwr{}}{memxvz}{~}|xhZWZOBFR[cn}z{yj\`bYNHECBADJOSRONNQW_hkdeu|vt|uputoihkr||~uollkkmrx|{wutuyxnpneZQJFEC@>AJXhwzrkd\WTTSOHCACGOZba[bolbcioswz|}vi\UTX^enx}{|~}ytpopt{|}}ysk_QE>964229I]fk{uqoqtuldmungjqvyzywtsw}~ypkifc]VQRYXNQcmor{{y{|swwxznd]XRKC:8<ITao~vwyyzzywvy|tntyztstuvurr{vkptk^VRPOQXdq}~xuwzpaad[MC=83017?IPXcqʾxooxynluzyvuvy{{wqmmnpqommszujmurha^[XUSTVVSMJIMUap|ywxyyxvv}z}yqke_WRONKE>7559AMWY\p|}vmfdegiiiltvy|vsqomlnqrohb]ZYZ]]UMWb`_jz||~~~}|{|zsnjhgifZPUYPHLT]fozƺ}vngededb_^dlh]bljc_^__`chnqrnkiijnssjbincZ[^_^][XX\ftzqjhhhhgfhq{xr{|{{yxx{~{yz|~tiffda^YURTZclszĿ|xtqrzvox~wokigedfjmnlgddehoutln{|trx~~ztnlmpponmlkhhu}zvxws~{utuuwy~}wtttrnie`YOKT^ZZk}½{tkgdb`_bfiiea__`djnibhsphjqvyzyvrprv{}}|zwqgbhk_X_eggiow~yy|wutrpoptvurpprx~phkk]V\aa^]_cinprw¶}wpkhginpibjtoilty}~~{yx{{xvpuxtnifdca\VSTZbjqw~~~z}~zrlgc`\TJA=>@CFJQ`s~{ps|ulkptvvtqnlntz~yv}w}}ywutpi_UNKHEB>=BMSOViux{xlc\XSMGBCKMECQZ[]dny||{uz~ty~}~~xqlkkkiea`eg\RX\UNKMPTZdq~yvtsojdacf\NNSL@853227?JT\ckt|{{v~|yxxxvphb__``_\\bkkacmne^ZVRNJJKMMKKOVap~}}{xvyzt{~vke`ZUPMLKHB<868>HT\^h¾zsonoppommszulpyvnjihgfgjnomgb^\\^ce`\huuu~|}~~}zx{vt}|tlifda_`bc_YRKGDDEF?59DC>CO\hs}~vmhffedbafotmjuzuokjhedehkkigefimsxujgnj\VY]aejot{}}~~}|~|zz{}{voida`ac`UNUVKDFJKLKJIJNXer~ºÿ}{~tx|tpoooorv|~~{xvvx|zt}yrswxwtpjebdhmpsw{}{vywsqqpprvz}{wspoorvvmekpg^^ab`]XRKHHKNOPQSUTT[lxx|xtpmkmpstrqqty|~ttx{}~}|zz}zuof][dkfhx~}xuttw|}wpwxqsx{{zwrlhhjlkieb]UKHOPECLSVX]fp{~~zqovuhdikhdbbehkkkmrz~zwvwz~wrzysv{~~|xtrtx{|{zxtmdbifYTXXRLGDBA?;659@IR[dqyzw{|vlb[WWWWXZao{{}|{{y~}}{uyxmotsnifdb`ZRJEBA@><:>HNIL]hkpx}ztmiggea]YZ`^SQ[]XUW\agnx}~|y}zvsqole\SNKIGD@=@GF<;EF?;;<=@EMXckrz~ywvtqnmpwullutmfdb_]]_cggfegkqz}|upmllkhdadieYW^[RJGDB@?BFHIGFGKR\htwz¾||}|zwux}rpxxpifdb`_`cdb]WTRRUZ_\Xaopov}wpjfeffdcbfnpffopha]ZVQNLMMJE@=<>BINLFKVVQU_js|ǽ~~}{|~}wpjfdcde`VU]\TRX^chknpt{}|||{xuv|wpv{vokjigggjmmjd`\ZZ[^ZPKSTJEHLOQRRSTZdp|¾{yxvvvy}}yurqqsvvngmqh`adffda]YX\binsx}|zzywtsxwxztqoliggjkjgdccfjormddjcVQRRQONKIHKQW[^_`aa`an~ļ}{{}~ur{|sorvxwvrmighkmmlkjhc_bnpkp|~|{yyy||xutuw{{tmrxphhlmmjfa[WVXZZXVTQLECLQKJU_eiow}{z~}yvvy|~~|{ytlfjof^afebaadhkmllou{|{|~~|yxxz~{y}qkmpqqqpnmnquvtpkf_ULMTPGJSWVUVX[^^][]bjs{ÿ~ww~|pntuqmjhhhgb][\_cgilr}}~zvsuxzzywurldbhg[W\^ZURPOOLGA=<=@BDEJTaedo{~xtqonjd\VSRSSRQRXbb\bnqnnptwz~wnkqtkipvvsqpomibYPJHEC@=98777:@GMPRUZajuzustttsqrx~yqu{vmgb^ZWUVYZYWWZ^dmw{xy}unkigda^^dha\bgb[WUSPNMOPNID?=<>CIJFJY`_er~|yxvutuxzxtokhghjlg_akicdlsx}yvutsqmkmrqfdkkc]ZXVTSTWXVQLHEDEGHB:>EB<=DJOSWZ^clx¼}zz|}{xtrstx}ypswnc`abba```birz|y|wwzvttrqpqsspjc^[YXYYQHKPH@@CEFEC@>=AGMSX]bgklryx{|{yupkggilmlllkieeovrr}yvtrppqtutpkgedfhic[]d_VUXZZXVQMJJLOQQQPPMIGPWSR[ejmrx}zy{~yribdha[ajnprw}|xutuvqhfmkb_bdedb_ZVVWZ\[ZYWSLGIPKBELNMLNRW\_`bfmu~}uu{xmkpqmjgfggfc_]^bfjlos}}v{xqruwvurnjhilnonmkhc[X^^SNRSOJFDCBA=8558>???>?CLNIMX]]_cipv}~{vpjgfffecbekledkmhdccdeglrx}|slnphadijhgghihd]WRNLJFB>?DF?=FJHFHKNRV\dlqtvx}~zy|~vosvqjfedcceimoonnorw}xvz{wsponmje_ZXWVURNMOSMEGLHB><<;;<@EHHHHILQYaggiuwsokgeefggdbbcejosqkowuopv|}vqmjgd_[[_aZU[_ZUSRQPOOQRQNIEBABDHGBBLPMNV_flrwz~}xurqrsslfjojdfknqrsssuy|zywtpmnrpfdiha[XVTRRRTUTPLIFFGIJF?BIGABGLORTUVY^gpw~zvzvkffhhihhggintxz{{|{xv{x}}xtsrpnnopnjd_[WVVVSJEJKC>?BCCB@><<@EJNQUY\]]cpvu{}ytolmnpponmlidenpkltz|~~|ywvwyyvrmjgggiha[_b\UVXYXWTPLJKNPQPPONKFFMPJJRX[]`ekrw{}}xriejkdbiopqrux{}|zxxz}~{z{yqikng_^`a`^[VRPPRTTSRQOKEDJKDBHLLKKMPTWXWY]bhnsw}|vrvwtqnmmmkhdaabdfghjpyyu{||}~}zwsnkkmnmligd^WUYWMIMMJFCABBA>;9:>BEHKOYbcbjuwvw{Ľ~wqnkifb_`ehdaippoptx{|xwxyzywuspidfje]_bb^[YYXXUPKHGGGFDBDJLFEMQONOSV[`gpx~~}{zwspqtsjgllfb````aejnpppqtw}}wprspjfca`^ZTOMLMMLJILRQIHNMGB?=<;@GIFEGILOSX_dghilotzzz~{upnmlkkmpqqonmnpty|zx}}yvtsrojd`]\ZXVRPRUQIJNLFBA@@?@CGIIHHHJNSY^]^gppry{xtrqrstsponnprutnjoqjgjosvy{}|xurnidbee_Y]`\WTTSRQRTUURNJHFFHJHAAHJEEJPUX[^`chpx~}~~yrrvslkmoppomkkmqvz|||}tqutmgdb`^\\^^\XTQONNPQLFHMJEEHKMNNMMMQV\`dhmuy}̹xvvuxz|~}}~|zwsnhdda`a^XUTMEEKLIMWco{xĿxne]XPD743+#!#%'()+,/4:AEIKMNLIIORLJNRRQRSX\_`bdgmsy޸uң|yuqmie`_ejffnvz}{}{slhffdcehjlklnrxn]QK\}zcUOOPRY_fkmnonkfbed]WX[XUSRSUVVVW[ahpx~¾u^PParcTKECBBA@>>@BCDDDHNPMMSWWVXZ]`chmsuvtsstwz|zutzxqnooolie`[YYYZYWVVSOLOUSOSY[ZXVSNF<2,.;Pgz~vpu{}}ƿ~pjeXKB>?GVlƾtqncZVUSPLGB=:99:98642.)',-'%*-.--/2577779=BEHJMS[]Z\egeefilpu|ľ}|}}tj_SIA=BFKQX`jqsuzofbdlwyqkhgefhloppopqsw|~|zufZTK<, /G^s}utnd^^__`aaabeinrsttsqmjmsrnrz~{xvutnc[ZWNKP[hx}}~{wtstttsrsw|zuy||}~zsmhc_dsµzurrlbac_XSQOMLLNPQQOMLMORVYVU[a`^bgloqsssux}}vmd^ZYZ_fqzqib\YXZ[ZYWWWXZ\]XSVYVQSX\`dhknsz»vnfa`cjs~ùytmf_WPIDBCCCBBBA?=>EIEFMSVWY]aehihijmqsttuy~}xy~ywuutssuwwvsoljiiif^UTRG=9778>;6;IZj{vkihaXRMIFCCCFGFECCDFHKKEBGHC?BEHJLMNOQVZ]_```^ZWX^^Z]ejlnquy{|yuqolifbaenz}unga\XSOMNU`ouja[VSOJFA=81,/1+&)-.--/1578991'&'(*1=N_p}{ujfhfa][[[\^aehiihhiknrtrosywtv{~zvsplf`[XYVPS]flu|y|ztnjfb^ZXVTPJECBFMXfrŽ||{sllmjfdbbbba^\\^`cdeeinojjopliggghilptvwxy|~{wwvsplgb_`ciov~~}{xsnkihgda__bc^\becbcfilotz~snmida`cir{ysokihea\XUTSUWVQPVYUTX]`cefffilqvy{|~~}z|}}}zuqnljfa\WUSLCBEEDGOXbku}zyywrmquqoqvy|~}wroke^WPKHGILMNXhrzyxxpiilkigghiigd`^\\[YWUUY[VTY]\ZZ\]_`cgjlkigffghjhb`dd^[[\[YVRMIGGJMQW^hs|}vppnd]\ZUPLKLNSX^gsytpnkga\WSQPPPLFGLJEFJLNOOONOQUZ]`befgeekqpnsz}~xyxsoorx~}~}{wtqojc[SKE@><:66?HLTap|xpnolebefdbabceedbbdfikmnpv||y~{uojfdba__acfiq|xtoh`[[WMFFC>95223468>HUdsľ{utuvwwwvvvx|~~|xtrvxsqv{||}~~{yxwurnkklia_b`[XXZ]bit}zvrnlkmopppooliioqmlquvvvwz|}}|{|~zupligfd]Y]aabju»|zwrmifefecbbehgcekkihiklnquy|}}}}~~zvpljheb^ZVSOLNV[\bnx~}{xutvxtnpsqmkklmosx~{xxvqlheb_[UPMLNQUZaky~{}{tppqpomkhffgikllllghmv¼som]UWUPQUX[[\begr|x_NNcujM;9CN]iryysqf_\YXVTQOMNPSX_hs}ͥ|wqjb[VSK?762-)&&(,18BLWeoxzoW=Ptjeeo|}cYkrXMOV_got|}vrpqsuwvsjaZVUV[agjnwzkwqgmu~mdmiYTXbgefjhb^]`cglqvz|}~¿cA'0Os{hWKD?<;;=?BB?>==>?AB?;>CB@@DIMOSW[ahpw}~{yx~vqxwqmkkjhc[OC7//8HXfpvobVOIEA@DM[ju~~zuplgb[TNGA;79@Ob{}yvtrnjfb_ZNA:71/3CDISYYY]bfhjkkkmquy|~|vqmmovxf[W\h{tzpaK0"0AKL_gdbillqx}wmjtl}zPHP^ql`9/+/;Plqbi~qaanwlP.,F^oxww{Źnj{}{{kVLRgfuu}zx{z`@*6^f]t̽ztrrttsplpwЯuYK\g=% )3>FHE?5*$"&*+,5EYdjv´bG:>TrȽujc[SJ@6-&"!$,8FWgs{~zqdXV`zоiVUjνjWKGJMKD7%5RcosiUC73:GWepw}wsqoqsvy}r\JGIJWqzrqu|̻{z|}_:  =f¬{`H>A;0-2:AGLPUZagoyzeQFKZgnwpedgnvzxqg\SKEA???EJNTZ`fjmopokdaohSDCK]us_OC94578515?C:1.15:@FLQTVX[dp}|rjddk{Ѷue`cglpt|ueP9)))!"@s¬ypieddhkotx~wi[L@60/4?Pbr}zsmjhjlib^hnghr|}xuuusmkrjSA86;FTakrw}zri_WPKF=7?OTXgz{vqmheba``aeks|ȾxmdahztdcyyocZSONNPRVZ`eimpqqrrpjdfg\POXbjjeittkjnqqponrzwof^VRQSXXROg~{xsme[OA3%2Ojx{wuy~yqieba]UOVtysokjklmmo¿r\MF@7,,9AJdǽvmd\TNHB=840-+)((),29CMQMB@O]]VU[dlrwy{{zyvsoje_ZWVY`jvymaUJI]yywzvsojgjy¶zriaZWWY[[bw}yvvuttrpmieb^[WOD>H\iq}}|{zzzzz{}}{yumgb_^irg_XQIA82/6Hfyrke^YTRQQPI@?HJDDLXepz|vvxnd]YXYY^rƺ|xqjc__h}Ƶs`RO`|yodYQKHGGHJKLKIHHKPSROLIIIJLORW\]YSW]SA@Scir}ytojd^YUQPRX`imry}wjdcba_\ZWUSTYe}{yxy|}yvz~{wtsrrx~tnknw|wysle\RF;0%&4Giƴztoic\UOID@<987789;<>?@BFNUYUSZ_XTW^fkosvwumb\bkjir¿yxz}yppzzz¼ypg^WRNNNNLNXeffqy|}unhc]YTNHB=72/.0481,&! %5Qs}xusoh_Z`hf_]_begjnsy}}x|~z{}~}zvsqprw~yy{}~ysnhb]YVVY]ce`URexqkd^XRLGB>:98:=@BFSemlowtllj_PFB@@@BFMU^hpx}|slourkhlptwy{|~xvutrojd_ZTNJQf{}{tmf_YUSTX_ht~zxvtroliebaaa`^\[[ZVMFGLH>;?DILKD:4:L^o|ume^WQKFK^t}~ztokijlnpqsuurmimttldbbcegjpw~zrt~|xqkd]WUYf{{ty}xrpqsttrokhededc`]ZWUTQNJFB=82+%'6N^fnx~}{xvutssux|xsw}ztsuvvspmifc`^\[[\[XQGBCFCDRi¼~zvspprux{|{wst}smrxtnmortwz{wspnnmp~~xsnhc^YTOJFC@><;::=FWlzpjhgfd`\WPJEBBFKPSQQXgooptxzyupic\XUUW]fq}~xsmhd`]ZXVTQKDAEJMWl¾|x~xuyzsonmkhd_ZVRQPRUY^bgkmoqtwzywv~xvyyqf`_abb_[VQLIGGFEA947==87;?DKTezxpnoqttu{}yuqmigefjq{{tmfb_^^^__]Z[fqtqqpmjlrslc]]al}zqkoqkcabdfggffghigaZWZ[ULGFGGFDB?;989;?CL_}zusssqnligedddeeedeirȿ|xuqnljiiiihc[TU]aadmxzuqmjgdb`_^^^__^\`oyrjc]YWUTQLD>?FJGCCGKPWbt~{wtqnmkigeb\UPQX]\Z]cimt}wpib\WRNJGDBABCDGIKNRYdyĹ|yvtsrsvxvpjkome_]]^^\ZWUTTVY]^^^bnx{vsqrrqqqrtxzzxzysmhea^ZVRPNLHA:9@ILKJJKQ^gghrſ~{yxyz|}|||ywvvwz~zusrokf`ZTOHA;510135436ANRRV\chjkmtzw|~wokjkkklkjgc_[WTQNKIGEDDFHIIGFJWgoqs}¼~{z|~|toomdZZ`b_]^bfjllkijr|vsqoljgc_\XURQQRRPLJQ]fgjqz~|{zxsldaeiha[YZ\]]\YTOSbu{vqkfa\YWUTTUUVVUTRQS\m}yuqmhb\WSQQSW[^^_gs{wqt{tuzxnfcdgikkhaVKDDFC;30148;=>=;9:?L^q¾{usvz~zsosvqhb``a``_^_`cglqv{~{yvuttrpmmrxyz|tmf`ZUQMJHFFGILORSPMO^y~zvrnjfcfs{slmswvrsx||}~}|zwtplhd`][ZXSJ>3,-,'#,48;ANZ^\\bpþxpnrw|}}{xuqnjfb_[XTQPOOQTX]cipv{}zvroljhfaYRPVYUONQUY[\]_eo~zuromlie]SLKPTRPRXahlq{}ytplieb`][ZYWVUUTTTTSND<>Oeolfdegijlmoqstsrqrwÿ}xsmga[VRNLKLORTUUXcr}¿{wvvvuuuvvvslc\\_\TLHFDA>;741.,+++-037:=@CHQ_tĿ}{yxxz}~vjacloja\_foxytokgffhkoqqps|vja[XWUTSSSSUVXYZ[]cm|~vplklllllljgb`ft}yuqnmmnquz|z{{zxupkfa\WQLE>70)#(3@LTXZ_k}ſ{uuy{uoklnnlf_ZZ\[TMIIMRX_fmtz}tnmong\TOMMNPRSTQNMS\`^[\^ckw}{}xrlgc^[XVVWY]bir{~||zxwtqnkheb_\YVSPMJHFDB?;722;KZbehlqvz|zvtvľ}{xuqlcYPKJJF>746=BL[m~|zzyxxyzzzwtsx~yurolhb[SMLPTUROMLKNV_db_^`cfhhiiiihhhfda^[[^gt{wspmkheb_\YVSQNJFCBJZkv||uqrrkbZVUTSQOLJHGEB=8315:<:51/03;GYozof``egb[VUUVVWXY[]`cgkorvxz||{{yxvussrrqnihmx{ywvutrqolieb^\YWVUUUWY\_acdb`_fv~~~~{{~uoljigda]XSNID@<864221110.*&%*28966>Ocqx}zurpnljfb^ZUQNKIHHILOTZair{|vrolhea]YUQNLJHFB<759@C@>?BEGIJMS^m}ÿ|zxwwwxyyxwz~xrlf`[UPKFA=97557:>ACCCGNROJKS^ehjlpuy|}}}{wwxvoha]\[[[[ZZYXWVVVUTU[j}|yyzzxrjdcec\RKGEDCA@>=<<<=>????>=?DN^q¼{vrnljigd_ZY]a_VMKQ[ejkkmpuz}}{yvtromkifc`\WV[htyxtqonmmkhd]WRSW\][XY\aglqtvwz~vstvuqnmosvwuuzyututmbXSRTTTSPLGC>950,)%#! !!#&*.38=ADEFJVm{rmkkklkkie_XRPSY[ZWUW\bipv|}ytplifb\UKC>?BDB?>?ABCGOX\YSPQV`n~~|{yyyz|~vmfb^[XUQLGB=841/./1355423:EMQRV]fnu{ü}xtpkgc_\[ZYYXVRMIHMSWWUTUXar}yvtsrssrlbUKJPUQG=88;AFKORSTSPMJHJPZfs|Ƽ}jYMKPUbsx~t`VQNJOUZ\aehhghgfn|}o^MCAGTdpsk^QKLQ[iwxiXI=89?IT_jt|~{wtu|ɽϴտ}slgffnx~{zwodZV\l}qmnu~~~|unjihe_YRMF:'-@IA/+E[`Q:)%4NmðvaSPT]is{~}yskb_\WUTUX[_dhjmqy}pkkq|ooy}hTD9314559=BGMRWZYSI@9659FYnxpjc^]dryldbfnu{}uwĺ~{yvrmdZPHB<2$  #4CP[gsyvlbYTTZfx|~weXRSZckpqnh_ULD=9667:>DIPV\fv~wsqsvz}wph]PC:7773./28?FJLKKMTaqwoloyrjd`[SLIKR\fov|{wrnjgdba`__^_]ZZYYXXVTQKC90)%#$(2@NZdmuz{wqh_XUUX_gqzypga[XWWX[^bfjosvwwtrszǼ{tpoqv|}qe]UI9+  "(09AKYk~~ysmklqw{zxvw{~|wqkea_^`cglqty|vkbZSMHD?<::;=AFLSY`ekoqsu|~wsrtvz~xsmjgffhknsy{tldZQH?6.&  -",6>CGMZk~½xpkige_VKC<8544579=<<<=>>><:;?FOWZ[\^bhnswy{~}zwvttssrpmkknsyzwrqtwvtqszzuqmkiiikmprrqmjilpqnieddeda\TNIHHGB:3,(&%%$##! ,;FKNOQSTUUWZalzƿ|vqlhdbaabdfgikmry½}xtqnmkhd^XUUWTMC==BIMMKJIIIIHHIMS\gr{}|zyxwutpkd_^aefc_]^`dgjlmmmmlkjifb\TLGEFIJHECCEFFFGLS[^][[]`eimpsuwy{|}}}|{ywwz~{yvspor|}rh_\ZXQH?9766652.' #(,28@JU`ly|upmorsnga^]]^_``abdegjlosvz~|ywtrpnmmmnorvz~zwx~}|~zvuwy}{upmmqturolklpty~|vrssph^VPLIFC@<840,)'%$##" #%$##&.940//010//39?A?;7557:?GQ\fotvvvuvw{~zvrnid_ZUQMKIHHIJKJGEDHOX]`cgnw~{xuroljhfc_YSMHFHKLKHEBABCEKTcs~{zxwusoibZSOLLLJE=51026;?CFIKLMMLKIHGIMT^jwľ{snnpqplihjouz~}~zvtrqponlie`ZTPQV]aa]YTQNLJIHGHILOSW\_ab`][[^djpv}{wtqonmnpqrqnic_`gouupljlqy|rf\TPPRSRMG@<9889:<>@BEGJMOQSUUTSTXbtý{qic_\YVSPMKIHHIJLNOPPOOQW`ipstrollpw~|{z{{{zwtqlhb]XRMHD@=;::==@FNUYZYZ\_bfjov|yvrnid_ZVQMJGDB@@@@BEHMQUXYXY_k{|yvtrnjd]XVX[^]ZWTSRRSW\`b`\WTUZcnyú}{{{zwsnihjmnkgcaacefghggfdcb`_^^^][YUPJEBACCA;5029BJNOOOPQSTVWY[]_acdeeeeegkr|}ywtssstuutqoory|rida_ZRIA;765556789::98779?FLPQOMLMQXblw|urplga][[\]^__^^]]\\[[[[[\\]_adhlptwwvsqqssqonoppoljhggggfedb`^\[ZZZ[]_behihe`\[`is|{smhc_ZTNHA;4.)$ "$'*06>DJPV\`aachq}¿xropomhc^ZXWWWXYYZ[]^`bdfilpsvyz{|ztqnmllllllkhd^YWX\__\YWVWXZ[\]afnx{xusrrrsrqokhfegkorqmgccdgknpppnkhea]YUQMIFB>;864310.,,07BMRRPOQX`gkmmmmoqux|ÿwoifddfilpsvwvutv}}umcZQJGGHFA91+(&&&'''()*,.024579;?DKUanyyvwyzwpf_[\agmppnljjkmoqrstttttuuwxyyvrmihjnpnjfeehlorsrokfcbdhklkheddfhknqsuvw{yuv}vi^UQNMLJHEA<73.)%!"'.4:?BDDGMWbmu}zrmjjjkllkhd_ZWX[`eggedegkpu{}{ywvuspmhc^\\`fkljc\WW[bffb^ZXY]cjs}}||~}yvtsrstuvvtqonrx~zuplhffhkmlgaZTOLJIHGFDCA?=;:852//2;HT\acehlpswy|~~yuqnkhfc`\YWY^flpolikqzzupligedb_YQG=522210-)&$$&*.38;>@AAAACGMU_js{ž}|}~}ysonnquy}~ysomnpqpmieccdefeb`_aeiie`][[]_acdefghiklnpqrrrqonnpv}zxvutsqnkijnty}ytssqmf^XSOKE?9533431,'#!!#',29?EKPTWXY[al{ýxohc`_^]\[ZZYYZ[]`cgkotxz||{yxxy{}|xtokgc_\XVTRQQSUX]afijjhffffc_]`ht~||~~voieba`^][ZXVTRNJD>8312467631//026>JZiu|~ztnhc]XTPMLKKMQU[aglptw}ztoid_[WSOKE>6/++.01/..04:?CEDBA@BIR\fov}~|}{wsnjfb^[YXWXYZ[[YUPJFFJQWZWRMKMRX`gmsw{}~~}{yvtstw|}zwtqoljgd`][\blv~vokifaYOF?;864322123469<>@A@??AEMV`iry{rmnrsph^VQOPTW\`cfhjlmoppqqqqqqppppomkiginv}vpkjjkljf`[VTSTUXZ]`cgjnruwwvrmhgjq{zy{{ysmgb_\YWTPLHC?:63/,*('()+.27<@DEEEGNYgt}¼{vsrrrojc\VRONNOQTW[_diotx|}}}xspnkhb[TOLJJKKIGDABEILLIEBA@ABDGKQXblv~|{{zywtqmhc^YTOJFDA@???><9768>FMQTUWY\_cglsy}~}zxxzyspoppnjfa][[[\\]_eny|tkc]YVRMGB@?@ABCDEDDCBA?>;988:>EO\kzſ~umgdeggfb_]\\\[[\_ciorrqnlkklmnppqqqomjfa]]_eknmjfb`^^^^^_`abccb`__afkqtutsrrux}~~zvqiaZUSQOJE@;86433222111123568;=>>><BIS_lx{ungb_][WRJB;51/0147;>@@?>>AGOUXYZZ\`dhlptx~}xtokheca```abcddb_\Z]dp|yvtrokf`ZWVWXVQH@;:=CIMONKHEBAABDIOWalw{uokijlkhd_\[\^adgilnpstvwvtqmhc`_`bcb^WPHDDIR[cffedcbccccddefghjklmnopsw|~|{{{{{zxutuy}}yof^ZWUPIA:411134420-)&&(-38;<<<<>@DGKOQUZcp}wspnnmlkihfdb`_^^^_acglqx~zy}yusstuuvusqnjfb^ZWTRQQRSUXYZXURPPTY^`abdiowyrnjfb^YUPKFB>;8531.+(&&)08@EHHGHMV_fjlnptz{wtrqqppomljhfdba__^__abdefgimv{wtrponmmlkjhd^WPKIKMNMJGEDFIMPSUWWWXY[`foz~zxwxyxtokiiklkihhjmqtwyyyxuspliea]YVSPNMLLKJHEA?@CJPV[_bdeeeegilpsvxz{||~|wsqpqrsuwyyxvronpuz~~}}~ysmf_XTRRQMG>60+)((()*+,-/258<@CFHJJJKLOV_kxztpnnnnljhgfghjlmnoppqqqrsuwxyywtplkmquwvsqonmlkhfdcdfhhea]YVVWZ^bfikkjfa\Z\blv}zqjfdba`]ZUQKE?94/*'$##$',18>DIMORV[adedeir}zxvsokfbaabddb_[XVVWZ^chlprstuy~xrlfa_`cfiigd_YURRU[`cc_[WTRQRTW[ahouz~ÿ}|{||}|{ywvwz~~xqliknswxwsokgeba_][YVSPLIFCA=:52//4;730/./0248?IUajprsttuvwxz|}wqkf`\XVUUVY]bhmqtvvvx{|vqlhc_YSLD=8568;;:86545579=BGKNNNMMPU]gr}þ~}~}yvuuuvvvutrpnlkihggffedb_][ZYYXWVVVVVTQOOQUZ`ejnqtuvvutromkiikou~~zwtqmiffipy|vroke\SJB=:8777788876420/039@GLQSUVX[`gr|vof^YVVX[^adfghiiiihhhhhijkmoqsuvvvwz~ztnida_^]]]]^_`begjmpqpnjea`aejosw}{yy|}xrlgca^[YURNIEA<95310001245654336=;:87544446:@GP[fpyzwvxywrkb[VTVZ`fkmmljhgghilnpqstuuusqmiecdiotwwtqonnoooomjfa]ZY[^cgjkkkklnpqqqppsyyttuvuqjc[TNKHGFFEDCA?<:7420///0246789:=CMXdow}Ž~}}|zwsmg`ZVTUX[^`bcegkosvxz}|xuqnjfb^YUQOPQRRQMJGFGHGEB?>?AFLS\dnv~¾|xvttuuurme]UMHDBAABDGIJJIFC@?BGLQTTTUW\agmsx{~|ywusqolifb_]]^`cfkrz}ysle^YVROKGDBBBCBAAAABCDEEEEDEGKQZdo{Ž{tnlkkjfa\XVWY]bhmquxyywtpmjijlnoomid^YTQQTZbjprqokhfedcbba````acehknqsvxyz{}zqjecba_ZTNIEB?<9520014677520/026;@FJMOPPQV^jyƿ|wspnljhec`^\ZZZ\^bfkqvz~~}{||{{}}ytoid^YUQNMMMOQSUUTSRRTVWUQLHGKTanzxsoljhgeb`]YVQLF@93/-/38>BDDB?=>CKU^ejlmnpsvz}zwsokgc`]\[[\]_`bdfkr{~|zywurojd\TNJHIKKJGEDEGJNPQPNJGEFIOV^fmt{~umgdehkmlkiijknqsuuuusqoligdb`__^^^^\XSMFBAENXafhfb_]]^aeimpsuvvuutsrrtx~}ytrqtx{}~~~ztmhdba]XPG?830..../02368:=?@@@>=<<>CHOTZ_gq~yspppqu{~wvxshjmi___\W[bghkmkccfiku{jZK<88>N]ivl_TG8569;?CGMS\fp}pzv}}ut{|yeXTV^jt{~}wncXLC:68689=GUft}~vnd]ZZ_houyzz{|ub\dws]ORar{zmZH<:?HQX]``a_\]\\[ZZYYYZ[\`emzĺ|xsmheehnxxfWRYk~vdWQU_kvytmf`ZVRNKIIJPXcmtwvqi`XQLLPYetvmhio{¾tkhlvp`WUZeq|xsonorvz}q`QF>;<>@CEFHJKKJJGC?:62.*'$!"'0;IYizŹÿwmd\VRPPTZ`is}zpe]WTTVY^cfijlnrvz|}xqlgdb`^]ZXUSPOORX^fmuz}|vmaUKECFO]ovompv}tcTJFHNW`fhf`XNB7,#!&+169::989GMQSTTUVX[^adinvĻ}ywvvvxyyxuqjc]Z[airx|~~yrjaXOGC?<71( -:GRZ^_^\YVTSSUY^emu{|vsrrrqmhb\XVVWY[]`cfimqux|~~|zxwusnf]SJDBDHLPSVY^ciouy}~|zywvvwy{~}~}}|yx{zwpz~woif`_bdba`YTL?0'%5GWekh]M?8DJMLB5( -FbxvdSNYnþúvjdekt~|pdYPKIJMRTVY\agpy{xx}|jcfr|l[MECEIOTY]__]YSMIHJMRX^dhkmkgc]YVUX]ep|tkgjszgYTXevvj^SJD?<;;<>?@A@@@BEKRY`eimpstrnf^VQOPU\eox|rmou}obXSSXbnz|vuv{~wmaTG<3-+*+-/13567787789;;<;:97569ANayȿzvsqmhaYRLHGILRZbjrz~zy}xqibZSLFDEJT`n{xme_]]_acehkotx||yvuuy~}{zxvtrpnmlmmoqtvyz{{xussv}xi\RJD@>=>@BDFHHHGFEEEFGILNPSVY_gpxwlb[TOKGEDEHOYdp{|yvvvwxyyyywurnic^XUSSV[afiifa]ZY[^__]XRMIEBA@ABDGKPU[`eimptw{ļ{wvvvtqkd\TLFB@?@BEIMRVY[\[YVTTW[`dgiikmquz~{tnhdbbekqy}{yvsokgc`_`dinswxyz~}{yxxy{}}xrkfbcfjnnlf]TJB:51.-,-.02479<@CIPXalwĿ}zwronnqtwz{zxtnhc^[ZZ[\]^`behlortvx{}unfbmrx}}oe^VJHJM\dil~yppzvlgjo|xuwwvrpWR^stiZNE?<=@CHLOPQPLD:/$&8L^hi`RC;>Md̾u\[khODJ[n{~wph]UPNOQTW[^acfhnv}tmmt}uaM=43;GWenuupg\QHA<731/.16:AJVdu~z~zwngegmx~snmqx{qf\SLFA=976757;=>=:5/("&2D\qrbTMRbvxsw¾yustw}wj]PGCBFMU_jt~¾{sprys]J?;ALYemnh_RF<4.,)&&&')+,,--/3;FWi}ÿź~zvpnmmqx}pbVNLQ\ix}qdYRNNQTW\_aa`_^_bgmtwxskc[VQNMMNQUZ`gnu|{wronnpsx~{xwx||ma[\co|xndZPF;2,()-3:BIOTXZ[YVRMHDBBDHNSVXXYZ^fsyncZRNLLNQTY\`dhlptwz|~}zvqnkjlnpomhc_]]`cefeb]XRNJIIJOV\dltz}vl^PC931148>FR_n~|rib\XUSRRSTUVWVUTROMJIGEB?<60,*+19AHKKIGEEJPYerý}vqpqsttroje`[YXXZ^chnty}~zuolkloswz}}zupid_\ZXUPIA92-*)*,/37<=AHQ]jvytqnkhe`]XRMIFDDFINTZbhnsvxyz}{tk`VOLNT[ckpsutsrpopqtx~¼zvssuy|zqib\WTPMJGDA>;740.,+-05;AFIKLNSYbksx|~|zxwvvvy|ĺ{upkea][YZ\aflqw{|xutstuvwvurnida__`bba^ZVROMKIGC=70)#$,5?IT^fow¿~{wtsrqrqpmjfa[UOJEB@ACGLS[bhlnonmmosx|~{xusqppqrrrqpnkihfeehlqx}xutuwz}~|yvsstuvwuqiaWNF?93.*&"!#%')+.26;@FMV`kv}{yxwvusrqonnopqtwy|~}wqlheegkpuz|zzz|~~xtrsvz|yvtrpppprstuvvvutsrqqrsuutqlf`ZWTSSSSQOKF@92+$"(.39=CIQYbkrx}ļ}xrnkjlotyzqha\YWWVTPKE=5/+)+/38:;975210//..../25:@HQYbjpvz}~~}}}|ywwxz|}zxvtsrrqqqqomjfcbceinruvwwwwyz{|}~{rkea__```^ZVROORXakt{}{zz{|~}yrkc]XVVWWTOG>5-(%%&(*+---,*(&$###%).4=FPZep|¿}||||{{zyyy{}~~|{yxxy{}~|zywtrokgc^YUQOOPSW[]][WRONPV^hqy~{ywwx{~~|yxy||zxxxyz|}~~}|{{{}zslfbabdfggd`ZTNIDA?>>@BEHKNPQRRSV[bjt|¿|yvtqnjgc_[WUTTW[`fjnonmlmpty}ztmf_XSOLJJJLMNMKGA;6336:?BCB>953259?GOXbjqw|}wqkgdba``^][YXVUTSRSUY_fmqtutrqpqrtvxz{|~zslf`[WUTUWY[]^][ZY[_fpz|ywurplgb]XUTUXZ\[XTNIDBCEINSWYXVRNJGFGKR[eq}}yusrrstvwwwwvvtrpnkgd`]ZXWVUUUUVX[^`aa`_^_acfikkkifc_[WSPONOQUY^bgjmoqty~{yy|}zwqjd^ZXWXYZZYWSNHB=:88;>BEGHHFDBABFNZhx}uolkkkmmmkifb]YURONOQUY_ejnqrssstvy{|}}}}}~~~|zxtqnkheb`][YXWVVUTRNJEA>=>BFJMNNNOQU[bku|yuqlgb\WSPMKJIHGFDA>;99:=CIPTVURNLKLPV]emu}}wsnjgda_]\[[ZYXVTRRTYakw}{wrmifeeeda\WQMJIJLNQSTTTRQONNPT\fsþzrljjmpsspke_[YZ]bglpsuutqmhc^ZURPNMLLKJHHHJNSY]__^\[]`dhloonkhd`]ZYXY[^chov}wpkihhfc_ZVRPONNMMKIGDA>;98779:<>?@?>==?FQasypjedegjllkhe`]ZXWX[^chmquxyxvspmmoruxzzyxwwwyzzzxurolkjjjkjihfeddcb`][XVVX\`dgijmpv|~~vng`\YWUUTRPMJEA=964223568:;<=?BHNV\`a`][[]clwzuqmjhhhhhhggfffghikou}ytpljihhhgeb^[XWWWWVTQONNOQSVXY[]_adhmsz|xsnkhhjnrvwvsniecbdhmquvurmg`YSOLKIKHMVVXYYYZ`ekrwz{{ollnb]bc`\[VVRNLRVY_ksyʼ~wpjedbbb_]\\YXXZan|mdr~Ʒ~{}wrlfb__aehjg_RA- ):JW[TF5'"'5EU^^VI<429GZpƳ̽Ǻpu}iYNIGHKOSVWVTQMKJMS`q}l]SQYhz~k[PMS]kx{rh_XSNLJIHGFDCDJNU`lzymhp~rnnt|{uu{qhdcglquwvsojdYQKD=71+(').6@JNKA3'#*:Oblj_OB=ALYjyɾnaYUTX]dkqvy{||||{|~|~zsszsh]UOJGECA?=;:99864347=EOZhr{~yutuzumikr}tg]WTUY_gouy~~ysle^WRLHB<61+&"!#+6DTdr|{tmf`[YXY]ckt|þtkfehnt{}zxxxz}zvtsuwz|}}|yvsomkhd`[VQMJIHGHHJMNQSVXYYXVSOLJKMR[ft»~yurruz~ysmgb\WSPMMMNQSVY\]]ZWSOKIIKNRVX[]_ciou{}wog^WQMLMPV\ckry~yvsrrstvwxz|}{zz|vj_ULD=83.+(%" !%*/38<@ELU`mz¾~{vqjb[TMIEDDGKPV\cintz{rib[UQNLKLLMNNNMMLLNPSVYZ\^aekqy~~~ztmf_XQJD@<98776666679=BJR\dlsx|~ysld]WRNKKKLNPRUWXZ\_bgmrx}zvrmhb]WRMIECCDGJNRUVVVUTTTSSRRRQQRRTW[^chntzľ}zvqmhd_[XURPNLJHFEDDEHKOQSTTSRRRSUWZ\^```^\ZXWVWX\`ekrw}|wroljhfecb`^]\]_cjqz{vpje`]ZYWVVUSRPNLJIHHHILORV[`ekpv}Ŀ|vqmkjhfd`]YURPONNOPQRSSSRQPONNOQSVX[]^_abegknprrrqpnmlkkjhgd`\XTPLIHGHIKLNNNNMLKLNSX_fmtz}zwsojd_XSMGB>952/-+)(('''(*-28?FLSX]bglrx~}wqmifca^\ZXURNKHFEEGIMQUZ]`cegkot{~yupkfc`___``_]ZXVTTUWZ^bgkpuz¼|xtpljhgggggfedba`_^]\ZYXVUTRPNLIGEDBAA@?>====>?ACDEEEEFHJMOSVY[^`acdfhkotz~}}}~{wsoid^YUQONMMLKIGDB@>===?ADHLQV\bgmsz|wsoljgea^ZWTQPOOPQSTUVWXXWWVVUUVWY[]_`aabcegjnqsuwxyzz{{||{{zxwvuttstuvwyzz{zzzz{}}yvsplhd_[WSOLHEA>:62.+(&%#""!!!""$%')-16;BJQYahov}~{ywusrpnljihggghjlosvz}~{xurolifc`^]\\\[ZYWVUUWZ^ciouz}|zywvuuuvwwwutqoljhfdca_][YVTQOLIGDB@?=<<<<<==>@BDGILNQSW[_dhmrw|{xvsqponnnnopsvz{uoic]XSOKFB=96310/...-,,+,,.149?FMU]elsy}zwtrpnljhgedddegikmopqrsssrrrrrrssstttttsssstuvwxxyyyyyxwwvvuuttttttuuvwxz|~~~}}||||}}zvspmjgd`[WRNIEB?<96420.,++**++,./0257;?DKR[dmv}zxvtrponmllmnoprtwy{~}zxtqnligeca_^\ZXVTSRRRRRRSUWZ^chnsx|~~}}}}|{zwuromkihfedb`^\ZWUSQONMMMMNOPQRSUWY\^adfhkmqtx}}{yvtrpnmlkkklmoou~{xwwxz|~|xtpkgda```aa`]YWUUTQKD=879=CIOUY]__^[XURRTX_it~}|{zz~|xuux|wqnpt{vnkmni_UNLOU\elqrpjbXOHEEHPYcmv|}zvtwth`]^ckt~~wqmkklnquy|xleeihb]\`ejllid]WPKHFGILPSUWXXXYYYZ\`eilpy|vroptzsjly}ysnhc_[XWVVWXYYWTPJE?;88;AIQVWXaouojjmopqsw}}}zpifhox|tonqx}xusstvxz{zxsme]UOKIILQW^dfc[Zch_WVX\ahpx~}{tnjjjloqsuwwrp{}~~}{zyyz||wrnkihgdb_ZVRPPRWZYROU^ux~h\[[_dhdovu{~Ƚ}sf_]i|zutw|}shadn}qcfynQEQeol_SQV`iosrs~oZPHKXmuqty{wj`Z\hzl`_iy|qoyÿwwz}_Tczj]UOKMPRQQPOKD>=ESgu{k^YY[]ZVSWdu|hTJLWcnx~{pe\YZ_kpdbnqp|ol{yia^`flqtvyyl`WUXZWWfs`NA::@GOSTSSW]afhkh\QIFFIOWan||eQXu~qjn|Ƽ}xzvsojghlrxxiVB1.8Oi~zvmV9.=Wjy|x~}n^VSRQQUcsyrkhhjlmrv}yĿ~xu{}zwuuyvu}hQJ`~rbULKNRUUVUU\eihkyymiovmba^YY]````elu{}{vf\drttz}xvukls}~nsvw~wlc]YVQI>@MLLWZ]s}}~z|z||qdct~{yvxusiabhnqqppu{|{n^PHEFHIIF@76BKDFVTT]^VKQZSPXbjpxsmxna_aflruwyzret}ysjaULMOKJKOSVUh}z}|ogghgeb^ZUTWXQYjfhklonebiv}upr~ttlveNV_Y[``affceiostsqprvqky{x}uicrukihc`_bfgd\QJah]cku|~{ttwuqu~{unihjldlxlfk}zhflsx{|{xvvy~}or~uv|xigrmhkkgdiprsvnr{~~~zx||unhefhie]YSTa]\`^iwqjkjhgffedb``bfi`W`YT]cdb_\WLGWaTJHMWcoy{yxyvvxyzwnagbQNMMR[_ZSMIWf_XWVW\epqkttjorspmjijklmmmopjiuywxsz{~~{xwxz}|}~}{yxz|wldadlt{zq{w|zvuzw~{yvuuvx|z||~{zyxurokhfgjnlbgi^ahlj`X`e]^cda[UPORXXRKX^ROOPSX[[XWVTOVc\PMOU^b_jmbdggfc`agljea^_fq{~{z}}zy|}qs~{uwz|yvqjjmmnnnmkjhgecbcfjjmwwz}z}xuuy~~vomsxyzwsyry~ywwyzxtnhddhmldkmbcffcbb`]dia^`bcegijkhdq{rqrrsuvvwx{|}||xsrnmpsrj_clgbdda\WVWVPWa[[^\VNIHKRY]\WOHL]bZVVS]lfdefghhfdccdffd`\Z]enpem|u|~{z|~{{{wy~v}}~~|}|wuuvrq~{}tuxyzyvuxywtrpmgesvmkkkkjhfda\W_ga[[\]^_[T]b[]`cc_XSSVZ]_^]^`_csymeq{uv|y~y{|pozsgfgknokc\WVX\__]YSNUd`W``]chjifdbccddeedbdgijjfixvho{z{~yustuvwwwxz{vpy}w|vt}|z{x}{z{}{|xyzyxxyzyqipqjmqrokgdbbdhibWVcfbdgd_hj^YZ]afgd]VQNNQTVVWX[[UVgj]^eiijmoppomiggjpw|{t||vojimswz|yldw~meflrx|{vpkgffffffgjlgbmqnsvrqz{tt|~vrquz{u}sorxtkp}{tqpqtz}tw{sqrrrqppppomjijkiiuyqnz}vuvz~~{xvwyyy{~|xwz}~yrlgeeghhcZ\ii]]lmghhea][^dgf`XPLMSZaed^\c]\eb_chkkjihgfdcaacglmhfrrknuzyss~~zvvy|{vx~|wxsu{|zux~{wvx{yv~{{xtqsx~xnmy~xwxxus|urqrttsokgeddccdefc_cimlfhmnlhfegjllid_\]afknmlxujl}wuyrptnquwxvrlfddefe`ZURUZ[Zenhb^]gle`adhkljhgghjkjfbmulffinu{{sjmwvsvz{yxy{yu}~yvvzztx|~}~}xv}{xx{~|ro{|rny}}ztpoqsspkfdegjmni`dophbdkqroib^^`cfea\ZZ[WS_jggkjc`jrmhiiiikotxzywqmy|~|yxxy|}{uldlxtoprsomtyoc`bfjmonmmlgagqnjnqqmjjntxwnkrvst{{sw|vw{yrmnrw|}|yuqxzu|zw|~{yxvtqooqtvxwtqx}sz}|~~vv|}}~xqooqrqomklkfeqtjekuqhgkpqpke_]_dimlf\U]b\Z^ekonf`dkf`_adhloqqkekpkkostrqpqsuwwsln}{z~x|{}}rpt{|z~sprw|{tomotwuor|~zyvx~|}}}~~xqmmry~pksqu{~wronoppooqpkfnuqpqmkrvroruupjffjpuyysntyqiipy{ru~}||zvwsuusvvmkmoonlihilmhfmoe_`behknqpkccjjdcgmqromv|rigiouzzxrmjkotwvrnv}tzytsw~~~}|vux~~xu~{}{{}{xvvy}~xwyxz~ztpqsvxvpltzqiimtxvqrupiimppnlklmkipxrkigeegkquwumd`kwxvwwus~~~yvx{~}wqtuolkloqqponnmjfjttnkjhly~zyywspprvyywrnlnsy~}umt{x{}}~}yvvy{z~~y|}~}xx{yzz{{y{xvx}|vswwv|~{xx|~zxwrow{vvusrsvxvqqurkintxwskgoxtnnoppoljhhjmpqoifoyvlfnwww{~}zwuuvxxvtstx|~y~}~xx~z~zwvwyzyxwwxww}|qt|yuv{{tporuxyxvvwxwuz~|~{{}|tq{{uux}~wrw~{xyzywuvx{|wolrxxy}}vsz|vvzysoptz}wv|~|~||~~~zyxz~|xutropy}xtuvrou{vrsuvvusqoligghmrvvrkkqy{rkkowxqmmosvxxxxwtr{wx|{~z|ut~{|y{|toorw|{ss{z|~{vtv{{v}~ww~z{{}~usw~}vqsx~yspqtvspu|}xspt~}vstuvwyzzwrkfdgnv}~uil}squ||zz{}|~{yxww|ut}usty~~xqkiikmpsvywpioy~{uqqruz~voklqw|~{trz|wwyz}{|~zx{~{}{z~~zy{~|y~z}~~~zrmlpwyy~}}||}}}}zxzyv}}|~~}}{yyz}~ytoorwzywyyvz~ytsux{}~|yurqomlklptwtsxzqnw~{trty~zvtvy}~}xv~|y}~y~||}~|x{}~ztonptxzyuwxlmy~{xvvx{~}zwvwvst}zy{}}|xw{~||z{~~zy}xv~||}{urrv{~tnz{vx}{yz{|{xussuvu|wsx~}~|vz}{~~|y}ywzwvwxyyyy{|zrlw{vwyzz{{|{yvsqqrttrojkwxplny~upoqw}~{wrov|z{{|~|{~}}~{yy|wvz{|yxz}}zxupms~zuwzvtuy{rs~yx{xsx}~~z{}{ustwz{{{{{yutz{y||yy{~}yussv{~~zrjiv{z{|{{zrquz{v}~{x||~yuux|~wv~|sv~}wtstwz|}|ztlgnxywy||ytrx|qkkpxztx|usv||zxuv~||yy{{}y|{xxz~zwzv}{vuw|umqzzuuz{y~{vuw{}{z|zut}~{vtw}vvzz~zsprw~~vrzxpoy{xutuvxz|~~{tnqwuprw{~}zvx~vnmrz}wsu{}{|~}}}{vw|}v}{||}~{x|xx~zvtuzysw|wnlpxxonw~|wuvy|~}|zuuvy|~zwwwx{~x}}{wvwzyz||{vux}zv|}yxxzzwwy{}}~|y|}tprv{wsw|{yz}}|xvx~~{z{~ytuz}||}}yv{}z{{xvz}wtrsw{zuyuljmu}|tmkt|wvvuu|~zxwx{|wuw|~~}}~}xz{y|zwy|~}z{xsqruz}skmy|vru|z{}}zxxy{~}xx|xwy}zv~~~~|yvu}~zz|}~|{~}uruz~xu}}tpqty~|zvsszzsqx}}~zxx|yu~}z~ztv{wy}~ww|~{yz|~~}yuv}xusqrv{zuomr~{pmw~~zvuvx{}~ws|~~yzyy}yz~yuy}}~{|~|yy~zux}zyz{|{zyxy{}}zvxws{}zwvwzzw}}}yuv|z}ywyysx|xx{yrov|}~|wtx}}|zxwvwyyyxxyzzy{zx}zwy{vtuy}{|{twzxz|y}|}~{sqw|vu}|yz~ztporw}}xtuz}|wvy~ztqrv|zxzz}z{}y~vloogacfl}ud^bm}jZ\nq[]m|zqb[`q~pd^dt|h`eovyqmqk\_smVZttim}|dXWZajsyzvnd[WW\bhlsytnoopv}qjiov}ztmfa`dfaZW[aioru}rhgr}h]cvwdbjmnt~t`TYkwwxwg]]es|wwod]Z]hxyk__ccdmiX[qndbhr}oeaeoz~xqmhb`hy~k^[`qthbeqse__bglong^Y[bdbbceffl{~oc\\blu}|uollmpole\UQRYbjpqoow|qifiste]`inoszzyzqaUSXessia_hswspqsu{|vtrrkb^akz{mc^_epz~{xy{~}ui^[^dkt|~tr|}wpic`bhs|~uh`_adhmswywrlhddhkljechok_X_o{{oilqphbabegggjqtof_afknmha_frvqmmutkkpqleacqypiebbbcdhlqu{|tppppkc`eox}{qidabejllic]XX`muqdZ\itvuw}xt}vlhhilnoomjfccdfhigden~~}zvph`Z\iuyyz{xvtqnifddeecaclwyqnu~uu|zpfcfknomlnrz|wzyoheflu~zpjo{}z||ywuttttsstwyz{~}xuttsqnje``fjlpuutv{xpq||vrnlmrxti^XY^emswvqjhowwssuy}|spv{tkiovtkedgjmmkhgjpyzutw}~|xzwppw|zskd_`ipokjloqstsqnkikpw}wlgo|wiaagpx{zsja\Z\`eilljffnwvlgjtzyxxywtokjmsxzvmaY\ehdbdjpttqpv|~|{~~|xwwxzzyulc_bgfbbekorqnjjnplfdgmsusontyth_]`fmpplgcbbbabhqtmd`gqsnjilpsvwunf^YZ_hqvul_W]mwsg``gqz}|}wpmnrvy{xpfaemrqkd`aelruupkebcfjmkfadmtqjd``dnwxpf`_aehlopplggloia]^cjquvri`\ahlkjigdbgs|zphegmty|{yxy}|rouwpjegp{}wnhecegkmliebbejmlheeiospibadiptusnid`__adhklihlokccjnligikllkiiikllje`_hsvqlknsvwz{x{||~|vngektwsmjjklljkornfabflpplgelvwoe^]`fmqrplhc_`fqwti_[bmtspnmkjjjjigdbbekqtrj`^k{wlikry}}}~yvwy|}vlfkx{qjhilprtsplighijjhc_akwyqf]]er{ypf_^agntwvqia]bknlhfgimpqoiefikjknqqmgfny}yrnmosvxyyz|~ytw}zvpmqz~{uqnlkjkkllkjjkkkjknnkjmmiddiqw{ysjc^^afkoqqmhdeilmnomjiloqpnjhhjostqja]cpyzvroopv}tqsy}{|zpgfmvywtrpmjjpwysh`]bjsxyslhlpnfa`ekruurmga^ajtxvohccjrtqmlmoppolhdbbfmtxvofbhv|qhfkuytruzysqu{ymfkzsiefkry}}ypha`chorpkfhpwti`^fs{zuoiedeinsvwtmebekligjnqsrokjmomheglqtrpqw~{rifipy~{yyz{}yuz{ywvtsv~ulfeglqtusojgfghkqvtlgkqsmgfipw||wof`^_elrwwrjddkswtngeglrwywrmihimppmihny}zsmkmuzuuy~~}{xtoklt|}wqmkiiox~{qhccgmswvrmlqvtj`]`isz}zrh`^eqyysleacmz{slighkoqqnjhhkptsokjow}|unlnu}{xwx|~|ywx{|tkir~}rkijnswz{ysmgdehloomknvztg`doxzvqlhginswywsme`bktvqmkloponptuqjfhntwvqmoyxniiow~|xvy|{}{{~~|{||zvqqw}tlhfhlqvxvrlgdfnx~xkcentrooruxyvpidbdhmrvxvof`dr||skghlquwwtqmlmoqqnjfgrtjho}{sqs{{}}~}wohho|ypifju{oeabhr{xmegnrnifhnu{|xpf`cmuxwtplgflw}{upmlllmnonmmnprqpqssstwwrmms}}uppt{}}{wwz}vqrw}}tlims{zqhcaemtyyunlputmimsvwwwtpljkouz|{vmd`epxxvsrpnmqx~|rhbdlv~~wrtyztlils||uqqy|z~{|~xvw{}z|ypjilrx}~yrkedkxzngjtzysoqu{~yphcchpy|sgbjzujehow~umgfjqwywros|~sijs}xttw}{z|{x||x|y}{yyz||{wst|}rkip{xqkikpxzqmottnijpywmhksxyvtsrqps{}rkhjouz||xtpnopsx~~xrsz}ytqt{xqnpv{z~~~}~~{~|{~}{|~|zz{{{~}wrprw}~ulfeiqz{uqruvvwwvtuwyyxwwwxyyxvrmjlu~~wronou{qkjnu||wv{wniltzqou{vx~~}}}x{|wwz~|yz{pjjnu~{phfn|~rihq~}xvvxyywspopty}~woimy~tnmpv|ysnmotxyxvv||qmszwwzxtyyy~}{zy~}vwyy}}|||{zxutx~rknx}wqnos{vlioy}{vsuy~~xsruyyyyz{yurrz{snmoty~|vqopwyppw~~|{}{ursx~{uw~}{{~wyyx{{{}{}{|}{{~|xy||ywx|~xqlknu}yqnry}xuvz}}zwvx{~~ztmimx|snmtvmjlt~vru{}yusw}|tpu|xy|{~xvy}usz}{|yrrv}}xy}~zursw|ypjlvwpnt~~zy{}~|xtqpty}vqqw{snpv~|slknv}yvy~zuv|~zxy}vrv~xx}}wx~}xw||x}}zy|~vw~usy{usuy~zy|~uqu}}xtrsx~slnv|}zyz}|zz|}zvtuy}~|{~uomqw~yrmmtwps||y{|tppv~tqzzuw~}xx|}uv}yy|yz~usw~}zxxy~|vw}{xy}wojkr|slo{wppu}}yvvxz{zwtu{{qmpyzsopt|{vv{}ztrv}{ttz~|z}{vvz}}~{|xssxzy~{{zy~|vuzxstx{{|upqw~xpnt}}vqqyyrquz~|yxy{}}{zyz|~ytsv|ypklqzzwy|~~~~}|}{vtx}yy||vv|urv{ss{xtx}|~}z{yuw}zusuy~~}ywz~}}|{{{}|tnnv~ywxz|~{vtvz~z{vnlowwnkq~{pls||~|xwx{ysuyvx~~yxz~{uy{y{wru~{|}zrqv~{usv}rpv}zvssv|vmmz{rqu||zyzz{zxvuyvnoy|uqrv~|rnr|}yzzx{}zz}vtw|{xy~zx}zutw}|ts||yz|wuz|rpxupqwurv}~zxy}{utx}~xst|yutw{}~}||}|{{|{z|~}yx{yrnnt|{srx|y{}}yrpwytu~|spt}|y}~yx|~urwyux~}~}wuzxqorx{xy}~}~}zy{vmks}xuw|xpos{z{}vrrw~~tmmw|spu}~zvuw}xuy|uty}uqry~{y}}zy|xpqz~wsv~}tqt||tpqzzrry~~~xsqrx~rmsumnvwrquz}z{|sqw}xttw~}sns{~}~~|z{zsrv}wst{{ux~~vqqw~spxystz{vvz||{qqyyssv}ztuz~}{y|{y{}~||}~~|z{|rnqx|ywvx|xw}}yz~zqlms~xop{}usw~~||}{xxxqs|xssx{{yvxwtx~zxz|utw}~|{|~}xw}~uoos{~vtx}xvy~}|}}xtszyrqvwqqv}{|}vqrwzqouwqr{}vux}||}}|}|wvz|spqx}|xsszzww|wsu|xpou~snq|ypow{xx{~~{yz~}wtyzsqu~{ursw|}}yy}~|{{~yqot~{z{}{xx|~~tpqx~tos~vpt~{xy|zss}ytuz}xvx|~~ysu~}xuw|}sor{}|}~~{yz~{z~voot|ysrw|sqw~zvtuzunq~}tsw~||}~~}{yy~wqt~~wtu{|srx}~{{}{x|ytsw~|xwz~xx~~|uqrw}tou}wux~}|}{uru~snr~xpot|xsu{}zz}~xux}zuu{~wvw{~~~}{|}vqqw~wuz||~ysqvxst|~tpr{|x{}ywz}tpt}~vrt}{yz|}~~}}}~|{}}vsv~yroqw|xy|~~{z|xpntzvw|}uru{~~{vuyxqpxwru~}ywy}yuxwsu|vqqv~}}}yz}xwx}yqnt~~|z{~zttxxqpu~xqpuwru}}xtsw}{qpyvpqyxtux~~|}vu{~yuv{}trw~}|}zsqu}|urt|zuy|~|tppv{qnwxqqwzvuy}}zzzqovysqt{{uuz~}{|}z{}~|y{wqqv~|yxy}}z}|z}vpns}~sqx{uv{~}~|xw||spu|tqt{|z|{wvzzsszzuuzxrsw}~{z{|~~xuw}zrnpv{vv{}yx{~|wsu~yrrxxssx}xstz{rqwxrs|xvy}}}}{{|vtx{soqx}|~~}~wqqxyuuywrty~ypns}unoy{qnt}zz{~~{z{xtw~uqt|~xttx}zy||{{~|sot~}{|}~zy|~~vopvuoq{xpq{}yvvzyqpyyrrw|wuw{~||yrs{}wstz}snq{~}~}{|~zzwpou}ytsx}tszzvtv}snt}tsx~}}~|yxztpu{tqu}xqsz}||yz}zww~|tqsy~yvw|zwz}}wqpszwpq{zuv{}~}wss{xoox~snqx}uuz{z}zuv|{utzyvw{~|yz~~upot}~vtx{{~~}xqouvprz|rmqzzx{|vux|ros}|tpt~~zyz|~~}~~|{}|urwxqnqy|y{~}{|unoxxvx~{sqv~~~xstz}snq|{rpx~~~zwwy{utzyqpvyqory~|~~yx|}yvw{{qmq{|z{}|usw~{ros{zros}yrs{yusv}|rowxoowyttw}}~usy~xtty}spt}}{|~zrorz}uprz{tv}|}}toot~|pmuzqpu~{vvy}~zz}rnt{sqsz}vuy~~||~{z}|yz{ros{}yxx|~z||z{xpmqzupt~vtw~~}}|xvxvopyvppvyy}~yuv}vrt|~wsu}~ursy~{{|}}wuxxpnqyzuw}}yy}{usvxrrywrsx~~wrtzyqpwvpr|xvx}}}|yz~{tsw~zroqx|{}~~}|}wqpvzuuxztsx~|snqzxonuunq||z|~|{{ztt|yrqwzutv{|xy~|yy{vopx{{|~|yz}~}{qnqyzqnttot~{wuw|vor}wqrx{wwy}}|~xqs|}vrtz}sos|~~~}~}z{xpou}zuty~vuzyusv}snsvsv}}}~|ywyuos}|tprzyrry~|~}xx{zvv}vqsxzwx|}z|~||yrpryyrqy}wwz~~xss{{qovvppvxvy{z|{uuz{tsxzvvz~|xx|vpot}~wtx||~}}wqovwqrz}soqz|z}{wvy{rot~|squ~{z{}~}~zz}{trwwqpt|{z|~{z|{qns~{vvzxsty{usv}wpovvps|~|ywx}wsvvprz~upqw}}{xzzvvyuopy}{z}yvx}~upry|tps||tsyzutw~}rowzqouzuux}~}}vtx}wstz{sqv~~~~}~~}}zros{{tqt}zvx~|}|tpqxypoyzrqw{wx{|z}zqpwyrqu}zuv{~}~|z{~}yx{wpqv{xxz|{~}zz~{snowxqr{yuv{}}}yvw~ypovyqpt}{y|{ww{xst{xsszxrsx~|{|~~xuw~yqnqxzuv|~zy|{urvyrqwyrrw~}~xstyzqpvwppyyvw{~}|yy}|uru}|soqw}{}}|}yrot|vtw~}utw~vopw{qns~xoox}z{}}{{~}usx}tps|}wtuy~zx{~zwx|{rns}}zz|~{z{}}wons}vopx|rpwzvux~~snsvpryzwx{~}|wqt}}urtz{rot}~~~{y{woot~ytty~vuzytru|snr~wtwldo|{vrhYQT]eowzrgfltveYZ`n|i^VTU]diifdabk|ta_qkjrUQdzmkpxzwojkq}wkb]`nx]OUmuaWZfvxdX]unbnjcmwkdaadgigb^]_fmppmihmyq_W\k}vjb`fqwmlrwvoeYST]iruqjgkx|f]dxqgl}}pkmqssqpu~vmfcdgmtzs^TVe{wtrpmhdbglqx{~|tlebdjt|}pilxxh]]hy}o\RTcvpbZY`m{wmcaiywoklrzvdWTZdklida^^_chmonmowtbURZizyjcejmlhddfhkliecfn|yla^gzqaZ[`hnsw}{spquyysi^X\iyzsmhdbcegilr||x|rf`_elqqoov{tmfbaguyqrysaUU_mx~}yvxxvxzulc_dryronnlgbadhjiffiov{{tj^VTXbmuwqidfsxrolid^ZZ`jsuodZV[frxvm`VSWbnzwj_XZetxnc\\bktyytmjksxlcciqurleelz{rmlmke^YY`iqvsj_XXanz}vnlrzslgfjosrkbZX]fpwyume__frzsmgbadkt|{y}~|th]WZcox|yqifkx{nedjswtldbivytrrqlfbchlopmidbbfnw~}uoms|zyywsnlntxwod[X]fqz|yqhbdn~~ztmf`_ckvyw~~}}sg^^fpwyuojhlvtuqzxnltnYNPXdp~tcSFAFQcv}}zvjhseav~[IWz]GDTpylhlwpd][]frylbaiz|idjz{skc^]eszoutlx}vpkhhhfaXNFFQaq|ncgvlYPQW_hs}vg^\`eiid^[[crwjkxs]SYkq_SQW`jopnmov}||yskfeir|{uokgfhqxqry|tont{wnhe`YOHHQbx~mcep~}{|xsrxwi_YVTW]epy{rorw~uf[X_n~zwwwvph]QMQ]kwzuleemy{snllmlieenwlffjoqokfeglrrqu~ob\^hzuomps{|z{zsh]XZco{ulihd_YVW[aeggedhp{~spwpd`fr{nbYV\grxyy||wxwrmiecbbcejsrcWRUar}oijpuyxsmhfeffd_ZX[agf_VQUbt}ywsmf`^_aa^YUSUZ`dgfb^[]dpz~zrkkszqh_ZZ]aceiq}~xqjecccdb``dn|}vtvyyti]TSZgv~}wqkhfeda_]\^aeea^^eqxpifeffecaadgiifa\]er{y~|pgbaa`\XY_kz{~|xrlgffhhgc`agq|}{~|zwsoje`]^dlvtjeeilmiebcgkjd^[_k{{rmkkjheb`afkoojc^`iwxst|}tmiggd`]`gqz~}~}{vpiedehihhjpz}ww}|ywuqkc^\`hs~}~hURNPPRN[msx|x~rltxeWRU_lz~qf[PGHN^p|}{zuvyop}vTK^{pSI]j_brt]NJNZiwyqhcft}jcj|~ria[Z`pockn`XWXTOJHIKLJIKS_n{zmktlYPQYeq{wi]WZcmqlcYW^o{jadqzePHSlm`_ivzqmhc^YWZalwyqic__gvwnot|}wsu{~slea\VPLMSatymm{tqsutrru~~{|~~}vsxuf[VTSUZalwwmhjpw~rbUQUctvjbckv{qgaafnw}}|}tkfeecbdl{{mccipsqkecdgjmnrynccqyl_VRV`mwz|{z}zz|rjfgozsib^\\[YWWZ`gnqtv|wtwwkccl{yuph_XW^iw~~{uleachjidchv|vqkfgn|o`TOPW_dc]WUW]a`^]`fnstpicafr{qnorrmf^WSTVYZXVX^hprmcZX`n|wrt||uple^YY^gouy{~xsqpomid``befefkt~vpljjjhedfozjaaeknmf]WVY\\YWY`ku|}yspt~zz{|zvoiecbba`__aflomhcbhswrpolhc^]_dkqv{xnjkorrmgcbehifbags~~~{upljjlmlhfgo|xlgglpqmga^^`aaacglqtuvuvz}{|yofa`dikjgfhnstogbclz{sty{yrjc`bfknqsw}|smlnppmjggilkhefmw~|ysnjhikllmqzx`PE>AJLUZ]^r~sr{nYLJTdv}toj_QHDL]nz~uty}zuumTRhnTOf~nozxw}yiVHFRg|znfekvyqsscWWh}q{bQWozbPJILLLKLPVZZWTT[gvzuyxbSLQ]m}{sje_]agmomga_dotjdcju~ufZWbvpfgsvh```cda__eq|rkggilqxxkgnxzusv{~yqkbZVQPRYfxur{tb[^ht{~}{|uv}w`QLPYcjmot|te`cks|{pcYUZh{ujdelv|}xmaYV[epzypjeccdhmu~qgbchmpnh`[\blwrgfoyvtph[PKP]lx|pfdly{j_[Z\\[YY\cjnnnnt~~z{vh_^gu}umfb``cit|{~}wnfcbdfgghktznedk{yhXLIMTZ]]\^adffeefhikmnnlkkq{ukhhkkg`XSTX[\[[]ckqsoh`\]eq}xsuwqoppmhcacjs~vqpolgb_`cgjjhhjr}|wqnlmlkjlsqbZZ`fif_XUW\bgijjknrwyyxv{xrsx|}yphbacca][]cluywqjglw~smlmmliecdgmrvz~{|tjdcegheb_^`cfilnrxxojknqqmhefinpnlmsxnms|{rkhimqsttuy~yz~~yustutrsuy}{qllostqkd`afmsuuvzxuxulioy{m_WX_glkgb_`cfhhggjpy|tpt{qnr{{pf_\^addcbdhnrrqqu~yz}|~~{wz{okmsy{xrkfdehklkkms{xnhjs~thbagqy}xmaWTX_fhfdbceghhhhknruwwtplms}wjbagovyvnd\WX]dikgcadkqvx{~smmqvzzwqlhgiloqqonoqqokhiov|~ype\Y]eovvodYSU^gmlga]]afkllkknruuqjdbgq|tf\[cnxzsgZRQXblpoidbflruuvytmovzneaemuyxtolnpplfbbhqy|xnbYW^jtxsh[RRZenqmga_`cfhhggjnrtsnhdelu{zrf]Z`jtzyqeZSSYbjonkggjnsuwz~}~xonu~|qiegmtwwtpprtsnhegmsxwria\\bktxul`VRWajoojebacgknonliikmonlkntyzuj`Z\dox{vmaXV[epvuneadlu{}}}|}||smpwypihls{~|uolmqrqnlnsx{yrh_[]eqy|vk^VXboxwod\[`iqvwsokklopnkhjpy~}uh_]dp{zocZW]gryzumgfjpvxyz}}|qmr}}qhejs|{tporsrnjinu|~{rg``gqy|wmbZZboy}yoe``dkqttrpopqrrpooquz{wogcdlv~|rf]Z^gqy{wqkimsz|z~}~|{{vopwtkgipx~|wsrsttrqqtvxwtokhimtz}zqf^[`kv|{tlecfmuz{xrmkmruwussv{~{tjbagr|wk`\alxymeelw|yz{}y}yolpzxnhiq|umjntyzxvuvxywrlgfjqzwka]co|tibbir{~ztpopsutrprv}~vkefny|qf`ahs~zpihmw~}zy|{|x}wnnu{ohhoz~tnmqvxwusux|}yslikqx}~yqhcdlwukeejry}}zvrqrtwyywvwxywrnlov~{qgabit~{rkjq{}{}~yy}wz{}~z}{wzysrwwmhjr||toptx{{ywvwwwvspoqv|ypfbeo{}rieiq|~umjmt{|xwxzzvpkkpyymecit|pihp{|}{|zw{{{~~vv}|tprz|qijr~{pkmt||ywxzzxsomou||sieitymeelwwolnsy}}{xxz||xrnou|~vmhhnwtkimw}|~zuw{y~~z{}uvzw||trwvmkox{qmou{~~{yyz{zxuttvy||zvqmmr{yngflvxpmou|yuuwyyvttx~wnggmwtjho|xsu{}}ytw{vx~}zw{zwz}xwzyojlt~smnu~ytrtx{|{zyy{}|ysmknw~riflxtljnwzwvyzyurrv}zpjjq{zoijsyttyzwy~vuz~|uu}}vw~{{xsu|~rklu|pjlv|vstwz{zxwy|}wqnpw}sjhmw|rlkqy~zxxzzyxwy|~~yustypilplknmgjs|zutss~wuvwxrprxwpnjd^`flprribj|sXVnthv~lkytmmquwtokjro\TWdt}ma^dq{hYTXfzy~oa\`ntcctl_dw|sqstof[VV]gpsojd``enxxdVYixgbgt|smjjjgecceinsvz}r`]msjpvhadlx}vtw{|wl^STavshbbdis|ug`_eklhb[[gwynhiouwri`]cqwicgsxojijmr|xqjeadm~~nfgmu{}{z~womqvy{|sd_gyxsnic^[]cjnmf\SQWbp{~ywzre^]_cgnvxl_WUZdmrpg^VSXdt|mb^bkx|rg[RR[l~|~zrkffimpqs{uqtz~zpd\\es}tg^Z_l}sd\]gxzwxtf]Z]cimpprwyy}{}{{yskc`clvyfXTZfrvrg\X\fs}}tia^`eijihhlsz~~~teZW\fnrrnjgghjllljhffghiikq|rcZYap|n_WX^gnpnkikpxwlhhiifccfmu|wrrw}znaWTYcmstpia]_emtxwuux~zldfoy~{qf_^cjqttqnnquyzz{~veZX^iu|}yutw~{ttz{l_WW\djlkhfeglqvz|~}vu{yk_\`glmjfdflu~wkgku}qhfjtvtzvposy~|la]`hqvupjfglsx{||}~~}xnggnywj^WX_iprme^[^emsttstx{}ztons}vkfiq|teYUYcmrqlfehnu{zzywz~~qeafpy|wk`Y[cmtvtpnoqssqnlmrx~zqf`ajv}{qdYUYcmttog`\]agkllklostqkgglt{|yqha_clu{yqdYTW`jqsplijntzriglu~|rf][_fmonkiikllkihilorsqkd__foxzuj^VV\fosrld^[^dkoplheehjihfgkpttpg^YY_isxul_VU]iuzwpifjrz|phhnw|rg^]bjqspjebcfijjihjmpqng_[\doxzth\VXbnwxqg\WYajrtpjeceghfcachotsnd\X[dovwqf\W[fs|~zrlknt{|pijr||oc]_fpvvrkfdegihgefimqqng`]`hrwvnbZW]gszzsi_Z[aiorplhfghihfegjnpoke_]`gqxzula[\eq{~wqnou}zpkls|tia`entwtokhhikmmmlllmmljgeflsyysh^Z]fqy|wne^]cltxvohddhlnmkjlpsspib^`gqz~zpe^`jwuljnxzoijr|viabit|}wnfcekqturomnopolgegmv}|ui`\bmy~uj`]ajt{|wpighlnnlklptwvpidchpx|zsjbaht}sllqz}~~}tmlr|wkcbju~ulffiosutrpprsspljkov{{vmdadmx}sh`_enw}|vojilorsrqpqqrqnljlqw|}ypgbdmzzqlnv~{|{~|~}~vrrv~{ofchr|zqjhjpvzzwrnmorsrpoqv{~zrhbbiuxlcafr}wleeksy{xtrqstspljkow~}tjdfp}vlinx~z{~|{~|z|~wqpu~}pgelxwlefmu}}xspprssroorx~{rhdhr}|pfbeo{vlfgmtyzwustuvtrpoquy||wqjhlvvmimv}yy~|z~~y|zyzxxstyzohip|zohglt{~~zurqrtvvvuvwzzwrmknv~ticdlw{pihmu}}xrppsvwvttvy}~{tlgir~ynilwvrt}|y}{v{z{{wz|xwzukgkuukgjs}~unkmsz}}zwwy{zvojjpz{pfdjv}qgfkv|vrrtvvussty}~yqklr}yoilv{srw|}wu{}}wywu{yx~~yuuy}qjjrxlehq}}tmlpuz|zxwy|~{vomow~ulgir}|qhgmv|wtsuwyyyxxxyzywsqsxyoilu{srx}}}xy~uu~|wy{wzzuvzx}~zyz}yqmowynghpzvpnpv||xvwyywtrsyxnggnzsigmy|smnry~~{yxz{{xtppu}qjlvwppx~}~z{{uv~ww}}z|}usxzwz}|~~}~{smls~~qihp{tlkpx~yxy{{xspqvzpijr~{oghq}}toosx|~|{yz|}|yustyyqmpzyqpv~}~{tt|xw|}|{wy|tt|{tu|||~}{{}{soqxxnjmv~uonrx~}{zz{zxvux||uporzzpjls}}vrruz}ywwyzzyxy}yqnr{xrs{|xz~|~yvyxvz}~{{}xw|yux~}~~|xuuxunlqy{tpqw~{vuvy||{{|~ztppu}vomr{~vppt{{yyz{zywwz|urt{wsu|zz}|y||wx~~}zwz|wx}|zz}}zvtw|xqos{xqory|xvwy{{zz{~{vstx~}vqqu}ytrty}}{zzz{{||}~{wvy~yuuz{z}|yz|xy}z{~{y|ywz}{|}}zyy|{vstyxsrty}ywxz|}}}}}}}|zxxy||vrrv}ytsv|zwvx{~~~~~{xvy}yvw}|yz~}{~zy}~{{~||{xz~{{}~|||}}}}~|xttx~zusu{{wvw{~~}}~~}{ywx{}xttx}wttx~{xwx{}~~~~~|yy{}yxz~~zz}|z{|{~}|}}zz|yz~}}}}}||}~zwvy~zvuw{~zxxz|~~~~~~~}|{z{|}zwwz~{wuw{~{yxz|~}}}}|{|~|yx{|z{~}~~~{{~|{}}~~{{~{z|~~}}}}~~~|zyz|zwvx{~zxy{~~|{{||}}}~}zxxz~{wvy}|yxy|~~~~}{{|~|zz}}zz}~~~}|}|{}~{{}|{|~}{|}~}zyy{{xwy}|xwy}~}|||||||~}{yy|~zwxz~}zyy{}~~~}|}~~|{||{|~~~||~}|}}~~~|{}~{{|~||}}~~~}{z{}}zyy{}zyy|~~}}|}}~~~}{{{}{yxz}~{zz|~}||}~~}{|~|{}~}~~|}~||~~~~}}~|{|~~}|}~~~}}||}}{yy{~}zyz}~|{|}~~}{{{}~{yy|{yy{~~}}}}~~~~}|~}|}~}~~~~|}~~~~}|}}||~}|{}~~~}|||}}zz{~}{z{}}|||}~~}|||~~{z{}}{z{|~}}}~~~~~~||~~}~~~}~}}~}}~~}~}|}~||}~~~}}}~~|{|}~|z{|~}|}~~}}}}~~~|{{|~~|{{}}||}~~}~~}}~~}}~~~}~~}~}|}~}|}~}}~~~~}||}~~|{|~~|{|~~~}}}}~~|{|~|{{}}|}}~~~~~~~}}~~}~~}~~~~}}}}|}~~~~~~~~~}|}~}||}~}||}~~~~~~~~}}}~}|{|~~}}~~~~~~~}~~~~~~~}~~}~~}}}~~~~~~~~}~~~}||~~}|}~~}}~~}}}}~}||~}|}~~~~~~~~~~~~~~}~~}}~~}}~~~}~~~}}}~}|}~~~~~~~}}~}}}~~}}~~~~~~~~~~~~~~}}~~~~~~~~~~~}}~}}}~~~~~~~~~~~}}}~~}}~~~~~~~~~~~~~}~~~~~~~~~}}~~}}~~~~~~~~~~}}~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/music/m56.bin b/applications/PoP/poc/res/music/m56.bin deleted file mode 100644 index 5268478..0000000 --- a/applications/PoP/poc/res/music/m56.bin +++ /dev/null @@ -1 +0,0 @@ -{zxtssru{|urqppqrsttuwxxz|}~{yywvxzz}~uhhzqlovyn|m|~}}}~~~|thcm|znggjmpsvy{|}}~~~~}}}~~~|{{{{|}~~{umhm|~{{}}yogl~~nffiloruwy{}~}yrjddmy{tnkjkmorsuwxyzz{|}~{vv}yogceny}zrjecccegjloruxz}~|yvpjecfmw~ytqooppqstuwxyz{}~}~woihjpw|~}ytoliggghiklnprtvxy{|}}~~~~~}}}|zywurnjfddgnv}~{xvuttuuvwxyz|}~}{|~~xsooptx|}zwsqnmlllmnopqstvwxyyz{{{{{{zzywvspmjfdehmu|~{xwvuuvvwxyz{|~}{{}zuqpptw{~~|yvspnmmmmnopqrtuvwxyyzzz{zzzyxwuspmjgeeglsz|zxwvvvvwxyz{|~}{z{~{vrqqsw{~~{xurponmmnopqrstuvwxyyzzzzzyyxwusqnjgeefkqx~~{yxwwwwxxyz{|}}zyz}}xtrrtwz~}zwtrpoonnopqrstuvwxxyyzzzyyyxwusqnkheefjpw}}{yxxwxxxyz{|}~}zyy{~~yvsstwz}~|yvtrqpooopqrstuvvwxxyyyyyyxxwusqnkhfefinu{}{yxxxxyyz{|}~}zxxy|{wuttwz}}{xvtrqppppqrrstuvwwxxyyyyyxwvuspnkhfefhmsz~|zyyxxyyz{|}~}zxwx{~|yvuuwz|}zxvtrrqqqqrsstuvvwxxxyyxxwwvtrpnkifefhlry~}{zyyyyyz{|}~}zwvwy|}zwvvwy|~|ywutsrrrrrsstuvvwwwxxxxxwvutrpnligefgkqw}~}{zzyyzz{|}}}ywuvxz}~{xwwxy|~{ywvtssrrssstuuvvwwwxxxwwvutrqnljgffgkpv|~|{zzzzz{||}~}yvuuvy|~~|zxwxz|~}{ywvutssssttuuvvwwwwwwwwvutsqoljhffgjotz}|{zzz{{||}~|yvttuwz}~}{yxyz|~}{ywvuttttttuuvvwwwwxwwwvutsqomjhgfgjnsy~~}|{{{{{||}~|yvtstvy{~~}{zyyz}~|zywvuuuuuuvvvwwwwwwwwwvutsqomkigfgimrx}~}|{{{{||}~|yvsrstwz}~~~|{zz{}~|zyxxwvvvvvvvwwwwwwwwwvutsqomkigggilqv|~}|||||}}~|xusrrsvy{}~~}|{{|}~}{zyxwwwvvwwwwwwwwwwwvutsqpnljhggilpu{~}}||||}}~~{xusqqrtwz|}~}}|||}~}{zyxxwwwwwwwwwwwwwwvutsrpnljhgghkoty~~}}|||}}~~~{xurqpqsvy{}~~}}}}~~|{zyyxxxwwwxxxxxwwwvutsrpnljihghknsx}~}}}}}}~~~{wtrpppqtwz|}~~}}}~~|{zzyyxxxxxxxxxwwwvutsrpomkihhhjnrw|~}}}}}~~}zwsqonopsvy{}~~~~~~|{{zyyyxxxxxxxxwwvvutrqomkjhhhjmqv{~~}}~~~|yvsqonnortwz|}~~~~~}|{zzyyyyyxxxxwwvvutrqomljihhjlpuz~~~~~|yvspnmmnpsvy{}~~~}|{{zzyyyyyxxxwwvutsqpnljihhjlpty~~~~|yvspnmmmorux{|~~~}|{{zzzyyyyxxwwvutsqpnlkiiijlosx|~{xuspnmlmnqtwz|~~~}||{{zzzyyyxxwvutsrpomkjiijknrw{}{xurpnlllnpsvy{}~~}||{{zzzyyxxwvvusrqomkjiijknrvz}zxurpnlklmorux{}~~}}|{{{zzyyxxwvtsrpomlkjijknquy~|zwurpmlkklnqtwz|~~}}||{zzyyxwwvutrqonlkjjjkmpty}~|zwuromlkjkmpsvy{~~}}|{{zzyyxwvutsqpnmlkjjkmptx|~|ywtromkjjklorux{}~}}|{{zzyxwvuusrqomlkkkkmpsw{}{ywtromkjjjlnqtwz|~~}}|{{zzyxwvutrqonmlkkkmorvz~~}{yvtqomkjijkmpsvy|~~}||{zyyxwutsqpnmlkklmoruy}~|zxvtqomkjiijlorux{}~~}||{zyxwvusrponllklmoquy}}|zxvsqomkiiijlnqtwz}~~}|{zyywvutrqonmlllmoqtx|~}{zxvsqnlkihiikmpsvz|~}}|{zyxwutsqpomlllmnqtw{~|{ywusqnljihhijmorvy|~~}|{zyxwvusrponmllmnpsvz~~}|zywuspnljihhhjlnqux{~~~}|{zyxvutrqonmmmmnpsvy}~}{zxvtrpnljhhghikmqtwz}~}|{zyxwvtsqponmmmnpruy|~}|{yxvtrpmkjhggghjmpsvy|~}|{zxwvusrponmmmnprux{~}|{zywusqomkjhggghjloruy|~~}|{zyxvutrqponmnnprtw{~~~}|{zxwusqomkjhggghiknqtx{~~}|{yxwvtsqponnnnpqtwz}~~}||{yxvusqomkjhgfggikmptwz}~}|{zywvusrqponnopqtvz}}~}~~~}}}zwvqjfdhs|zqidcdfhjmoruy|pmlsy|~|zxwvvvwxyyyxwvsrrstw{{~|{zz{|~o[^|jUNOSW[_beilptx{{{~|{yxwvvwxyz{|}~~qs}rmllmnoppqstuwxz{|}~~}}||{zyxupjcaht||vokihikmpsvz}sp|wokhgggggghhhiijkkllmnoqsvxz{zyww||qe[X]l|{pe]YVWX[^bfjnquxz}}zy{{tnmr}~xtpnllllmnoqrstuvwwwwwvtrokfcbdjsy|zwsqpoqrux{|uppwxsoljhgggggghiijkmnprtvwxxwvvx~{tkc\XZbnz{slgcaabdfiloruxz}|zy{~ytolmt~yurponnnopqrstuuvvvvutrplhebadksy|{xusrrsuwz}ysoqx|vrolkiihhhhiijklnoqsuvwwwvuvy}wog`ZWZco{}wqligfghjlnqsvx{}}{yy||wrnlnu{wtqpoooopqrsstuuuutsrpmjfcabelsy||zxvuuvwz||uqoqy~ytqnlkjjiijjklmnoqrtuvwwvuuvy~xqjc]XX\dp{{vqnlkjkmnpruwy{}|zxy|}ytpmlnv~yvsrqpppqqrrstttttsrqoliebabflty}}|zxwwxz|~~xsonrz{wsqomlkkkkklmnoprsuvwwwvuuvy}ysmg`[WX]fq|zvrpooopqrtvxz{}}zxwx|~zvrnkkov|yvtsrqqrrrsssssssrqomjgdaabgmtz}~}|{zzz|~{vqnns{~zvsqonmlllmmnopqstuvvvvuttvz~zupjd^ZWY^gr|}yvtrrrstuvwyz|}~}{ywwy}~{xtpmklpw~||}~|zxvsqppsw}xsqt~}~~rfssja[YXYZ[]_`cgjmruvxyz{~|x|yurnkhdb_]]_enxm`re_cjosuvxyz{|}~~}}~zu|~}|{zywvtttv|whnn`\\^`bdefgfgggggfedcdfjouy}~~|ytomr~|}viiytf_ZYY[]_acfhkmnoppqruy~{vw~}zxuqomlmqx{mccnxpkhhhijlmopqqrrrqrsuy~{wuy{plp{ypida_^^^^^^^^^]]\]^afkquwxwtqnmpw~tnnuzrlgdbbbbdeghjklmnpsw||xwy}{yvtqpopsx~~vmgfkv|wsponnnnopppppqrsvz~~zwvz~uootzsnifdba```__^^^^_`chlqtvwvsqooryzrnpxxrmjgfffghijkmmnpqtx|~zwwz~}{zxvsrqprtx}{tmhhnyzwtrqpppppqqqqqrtwz~|xvw{{tppw~wqmifdcbaaa``___`beimpsuutrpnos{wrorz|vqnkjiiijklmnnoqrux||xvvz}|zxwusrqqrux|}xqlikr}zwusrrqqqqrrrrsuwz~~zwvw{xrpry{upligedcbbaaaaabdgjmpsttsqpopt{|uqpt|{vromllllmmnoopqsux{~}zwuvz~}|{yxvtsrqrsux{~}zuokjmt~zxvutsssssssstvxz}|yvuw|{uqpsz~xsoljhfeddccbbcdehjmprssrpooqv}yspqu~zvsqoonnooppqqstvxz}~}{xvuvz~|{zxwutsrrrsuwz|}|zwrnkkow~{xwvuuttttttuvxz|~~|zwuuw|}xsppt{{vrqrstuvxyz{{|}~}zvsqqtyxf_lzfZVX[`cdgjknrux{~~~~|{{}zq{zvvwxwvsqommmoqrttsrqpsxjtj^_chkmnnopqsvy{}~~}|{z|{tx~~}~~~|{}s`by}fVPOPQSUWY[^aehkmoppqrty~z{ugesxi`[Z[[]_adgjmprsssrrruy~~xrpt~}yvtssssuvy{}~qmtxmfb`__abdgjlnpqqpppruy~zusv}wkfhr|rh`ZWUTTVX[^`ceghijlotz}zz~|rkkq|~vojgeddefhjlmnnnnopsw{}xspqw~}ywuttuvxz|~}uqs{xrmigffghjlmnoooopruy}|xttw~|rkhlvzrjd`\[ZZ\^`bdfhijlnquz{yzzqmnu{uokihgghjkmnnooopqsvz~~zurprw~~zxvuuuvxz|~{tru~|vqmkiiijkmnoooppqsuy|~zvttxxpkjoywoiea_^^_`bdfhijkmorvz}zxzwqnqxztpmkjjjklmnooooprtwz|~~{wspprw~~{xwvuvwxz{}ytsxzuqnmlllmnoopppqrsvy{~~{xustx}uoklr{{tnifcbbbcdfgijkmnpsvz}}zxwy|uqos{}|zvvtpqpmnqsty|}~~|yusrqsuwzxyz{{|}~|mv~xxyvtromlklnqsvxz{|||}}~|tii|~{zyz{~y`]x~opw~~zuokgdcdegikmnoooopqsvy{ytno|}~~t{yg^_fpz}yuqnmlllmmnnooppomjgfm|{vttw|vkiwxld_]`fox|yvtrrqqqpolheekw}{{}xngiu~wsnid`^^bir{~yupmifc`][]dny~|skim}~zwolic_]]_enwyqk`XUYk~xwvxy{}~}yzgegijkmnoqrsrrqqrtx~{usv}|u}{ttvxz{}}y|jsjWSUX]afimprssrqppqtytlo}zxy{~|{z|zdV\trbYWY\`dgjmnnmkifefjq}yrlmw~xqkjo|zl^UXi~~qgb__acegggda__ckw{uqqw~{vqlkmu|si_YZfw|rkfca___`djqvz{{}{wvyyrkgeir|uld^]cp}ricachpw{|zwtssuz}xwy~|skeflw~{{|xphb^`ht|z{|~}|zxvtsrqrty|tnjjloqrv}|zyxwwxz~~vmd]Z]fu}yvuttttsstvy~zod[W[gxzvsrrstuvwyz|~ulb\[`m}ywvvvvvvvwxz}{slggkr{zuqoopqsuwyz|}~~yvtrpqt|~{yyyyyyxwwvwxy{|{zyz|zvwz~|xurqqrtuwy{|}~~{smlpz}|zyxvtqmjgeehnxzqkghmtz}~|ywuuuvwxz{{{{zzz|{smjlt~zvsokfb][]blyzslgeejqx~~|yxwvvwwwwwxz~~wpllpzyrkea^^agow~|xsnjgfiov}{xvtsstw{{uomnt~vngdfjqx}|yvuuwz}~{xtokiimsz{xvvx}yrljkpy}zy|{vrnlkkmpty}|xtoljjntz~xog`]^dnz|wroljhhhiknrw{~zupkhfipyyoe]VUYevztpmkihhhhiknquz}}yuqnmnsz~xrlhfgjov~xtpnlkjjjjjlmpsvy|~~~~~~~}{z|~}~ztpnpw|wsqomlkkjjjklnruz{xxz~|zxxy}}tlfbcir}{wtqomljihhikpu|{xwx|~|zxvuvx}~vohb__cku{vsomkjjlnrvz~}zxxz{wuttvz{uoid`^`fpz}xtqqqsuwxzz{|~|ywxz~|xvwz~{vqlfb__bis}~~}|{zyxxxy{~|xtrqswz~|xtoid`^_cku}zyxwwwxz|}xsnjijnv~~{vqke`]]`gr}{zyxxxxy{}{wrnkjlqy~~~~~~}zvqlhdbcflu|{yxwwvvwxxyzzzyxwvwwyz|~~~}~~~~~~~}{ywuromkjlqy~|zxvtsrqppqruw{|{|~~~~~~}}}}~~ztpkiikqz~{wtqomkklnrx~~yvtuw|~}}}|||}~zuplighmt}{vromllnquz~zvtrrtx}~}|}}{vrmjgginv}yusstvy|~~|yvsrqruy~|xsojgeehnu}~||{|}}~~|zwurqqrvz}ytojfb`adjrz}zyxwwxy{|}~~~}{xvsqpprw|~{wrmhb^[[^dny|yxvvuvvxyz|}}}|{xvsqppsw~}zwsojea^]_ckt~{ywvuuuvwxyz{||{zyxwvvvx{~|{ywtrpnljjijlot{|zxwvvuuvvwyz{|}~~~~}{zzz}~}|zyxxxxyyzyxvspmkkmry~{ywvuttuvwy|~~|zxxz}~}{zyyyz|~|wrnjgfgjpx}zxwvvvxz|~~|yxwxz}}|{{|}}yuplheccfkrz}|{{||}~~|zxwvwz}~{wtplhebbcgmt|~~~|zwuttux{}{yvspliecaachnv~~}}}}~~}{xvsqppruz~}|zxvspmifca`adjqz~}}}}}}~~~}|zxvsqonoqu{~}|{zywtqnkgdbaadipy~}||{{{{{zzyxvutsrsuw|~}||{yxvtroljgfeegjov~~|{zyxwwwwwxxyyzz{{{|~~~}|{zyxwvtsqoljhggilqx}{yxwvvwxy{}}|{z{~~}}||{{{{zyxuroligffimry|zyxxyz|~~{yxwxy|~~~~~}{yvspmjgfefimt{~~}~~|zxvuuwy|~|{yvsqmjheddfint{~|{ywvttuvy}~}|zxvtqnkhecbbdhnt{~~}|{ywvtsstwz~~}{zxvsqnjgda`_`chow~~~}}||zywvtsssux|~}|zywurpmifca_^`chow~~}}}|||{zyxvutttvy}}|zywusqnligecbcdgkqw~~}}|||{{zzyxxwwwxy|~|{yxvusrpomlkjihhilotz~}}|||}}}}||{zxxxxz|~|{zxxwvvvuutrqoljihikotz~~~~~~}|zywwwxz}}||{{{{{{{zywuroljhffgjntz~}{zxwvuvwy|~}{ywtroligedegjou|~~|{zxwuutuvy|~|{xvtqnligeddegkqw~~}|{yxvussstux|}{ywusqnligecccehmsy~}|{zywutrqqrtvz~|zywusqoljgecbbdfjpv}~}|{zyxvutrrrsux|}|zywutqomkhfdccdfint{}||{zyxwwvuuvwxz}}|zywutrpnljhgeeefilqw}~}||{{{{{zzzyyyyz|~}|zyxvusrpomkigfffgjmrx~~~~}|{zyyyy{~~}|{zxwvusqoljhfeeegjnty~|{yxwwwy{}~}{zywvtromkigeddegjot{~|zyxvvvwx{~~}{yxvtrpmkigedccegkpu{zxwtqrrrtw{}~}||{zyvtqonlklkkmooqux|}sw}~|{zzz{||}~~}}}}~}}{yurnkigedddefhknrw}sprtvwwwvvuuutuvwwxxyz{}~{~|{zxvtromkjiijjlnquy|womlllmmnnnoopqrsstuwx{}}y}|zywvtsqpooopqrtwzzunkiiiiijjklmnopqrtuwz||yz~{zxwvvuuuvvwxy{}y|}uolkjijjkkllmnooprsuxz}}zxx|~|{{{zzzzzzz{|}}xyzuqnlkkkkkllmmnoprtvy{}~{xvx}~}}||{{zzzz{{}}xw{~ytqomllllllmmnoprtvy{}~~|ywvy}||{{zzyyzz{}~zvw~}wspnmlkkklllmnoprtvy{}~~}{yxy~~}|{zyyyyyyz{}~|xvz|wspnmlkkkkllmnoprtwy|}~~}|zz|~}{zzyyxxxyyz|}zww|{vromlkkkkkllmnprtwy|~~|z{~}|{zyyxxxyyz{}|xvxyuromlkkkklmnoqsuwz|}zy{~|{zyyyxxyyz{|~}yuuy|wspnmlllmnnoqrtuwy{}~}zxx{}|{zyyyyyzz{|}~zvsuz|wtqpooooppqrstuwxz|}~~~|zxwx|}|{{zzzzz{{|}~~zvsru}}yvtsrqqqqrrsttvwxz{}}}|{ywvx}~}|{{{zz{{{|}~{wsqrw~zwutsrqqqqrrstvwxz{|||{ywvvy~}|{{zzzzz{{|}~~|xtqqsz~{xutsrqqqqrrstuvxyz{{zywvuw{~}|{zzzyyyzz{{|}~~|zvsrrw~zwusrqqqqqrrstuwxyz{{zxwvvy~}|{zzyyyyyzz{|}~~|yvssu{}ywusrrqqqqrstuvwyzz{zyxvvwz~}{{zyyyyyyz{|}~~|yussv~|xvtsrqqqqrrstuwxyzzzyxvuuw|}|{zyyyyyzz{|}~}zvtrsx{xvtsrrrrrsstuvwxyzzyxwutux}}|{{zzz{{|}}~~{wtrqtz~{xvutsssssttuvwxxyyyxwuttuy~}||||||}}~~}{xtrpqu|}zxvutsssssttuvwxxyxxwutssvz~~~}}}}}}~~~~~|{xurpoqv~{ywuuttsstttuvvwxxwwutsrsw|~~}}}}}}}}}}}}|zxurpnory}{xwuttssssttuvvwwwwvtsrsuy~}}}||||}}}}}||zyvsqonpt||zxvuttssstttuvvwwwwvuttux}~}}|||||||||||{zywtronnqw|ywvutssssttuuvwwxxwvutuvz~}}|||{{{{||||{{yxvspnnosz~{ywvutttttuuvwxxyyxwvuuux|~}||||||||||||{zywtrommot|~{yxwvuuuuvwwxxyyyyxwvutvy}~}}||||||||||{{zywurpmlmpv~|zxxwwvwwwwxxyyyyxwvtttvy~}}|||||{{{{{zyxwurpnllmry}{zyxxxxxxxxxyxxxwvtsstw{~~}}|||||{{{zzxvuspnlkknt{~|{zyyxxxxxxxxxxwvutsstx|~~}|||{{{{zzyxwusqolkjlpv}|zyyxxxxxxxxxxwvutsrsuy~~}||{{{zzyyxxwusqomkjknsz}|zyyxxwwwwwwwwvutsrrtv{~}||{{zzyyyxwvutrpnmkklpv~}{zyyxxwwwwwwwwvutsrsux}~}}|{{zzzzyyxxwutrpnmllnry}{zyyxxxxxxxwwvutssrsvy~~}||{{zzzzyyxxwutrpnllmot{~|{zyyxxxxxxwwwvutsrrtv{~}||{{{{zzzyxwvusqomlkmqv~~}{zzyyxxxxxwwvutsrqrtw|~~}}|||{{{zyxwutromlkknrx~}|{zyyxxxxwwvutsrqqruy}~~}}||{{zyxwvtrpnljjkot{~|{zzyyxxxwwvutsrqqqsvz~~}||{{zyxwutrpnljjjlpv}~|{zzyyxxwwvvutsrqqrtx|~~}|{zzyxwutrpnlkjijmrx~|{zyyxxxwwvutsrrqrsvz~}|{{zyxwvusqomkjiikot{~|{zzyxxxwwvutssrrsux|~}|{{zyxwvusrpnljiijlpv~~}|{zyyyxxwwvuutsrstvz~~}|{{zyxwvutsqomkjiijmry}|{{zzyyxxwvvutsssuw{~}|{{zyxwvusrpnljihiknt{~}||{zzyyxwvutssssux|~}||{zyxwvutrpomkihhilpv}~}||{zzyxxwvtssrrtvy~~}|{zyyxwutrqomkjhhhjmrx~}|{zzyxwvutsrrrtw{~}|{zyxwvusqonljhgghjnt{~}|{zyyxwvtsrrrsux|~}|{zyxwvusrpnmkihggilpw~~}|{zyxwvutsrrrsvy~~}{zyxwvutrqomljhgghjnsz~}|{zyxxvutsrrrrtw{~}|{zyxwutsqpnmkihhhilpv}~}|{zyxwvutsrrrsux|~}|{zyxwutsqpnlkihhhjmrx~}|{zyxwvutrrrrtvz~}|{zyxwvutrqonljihhikot{}|{zyxwvutsrqrrtw{~}|{zyxwvusrpnmkjhhhjlqv}}|{zyxwvusrrqrsux|~|{zyxwvtsqonljihhhjnrx~}|{zyxvutsrqqrtvy}}|{zyxvusrpnlkihggikotz~}{{zxwvusrrqqrtw{~}|zyxwutrqomkjhgghilqv}~|{zyxwutsrqqrsvy}~}{zxwvtsqonljiggghjnrx}|{zywvutsrrrstw{~}|zyxvusrpnmkihghdjimvz|uvqorqv|{ztikpuxyxw|~~xe^div||}wlh[Yes}~nfoohc]]_\en|}wsnd`dgsyzw`Racceejsuy~z{n^hoaY^ehr|ts{~hszkfhaZ]^[[Q_cRkxrr{}yq|jy{hhjrxocixqtgulswlrwv`k_aljdT]ungkj~s}x~~m}soqku_mjknnxhg`k}jgZfsj_n~mnc^vy{rlgjw{~uyutak|lgy}pnqxy}txrpix||}ksx{~~zg]Wktikvussz{{xzslnjct~b^Yinlw~~qenw}ebmiu{sv|||lt{{xzvvgojgfnqlo}o}zWGwyxgTPVUaijzt^lg~uy}q{~}jc}||rxtdhxwywy~~z{izv|irowzwiS{pg\_d[fwsmYathq~flvwyoprzvyo~{xlw~ikijgsro~xuzzyrr{xzv[WSjuczgtmzrsTB``ilTkbgo|{injuqhupxy{qlvejhm[rqpnqtqZYSKimhmorxuq`]a[]pYjempr~qqcr{nZ~oz|x~gst^kku^vw~ymoqyvnZomMPmwvgyqssdkW\a}~]mtkpmrluhhwsg{z}qtzqxg~ondfsixvmrtfy|~xelq_MTw|nquutn_hoW\m^`uphes|jcvzppvysrzhvtkm]mr{yjx~qzutv}}xfbsmZSn}mstvqiSkjW^rs[uvoodgwzdj{{wuqv{{yi}znhadwk|x{m~|}n|||~q|W_ykcWusiuyrg[[wZUfuiZunqojn{wo}ry~vz|yxormnnbgvqr}zs~|rsz{whThtie]tomwqfXcvTZnzjZqr~reozrr}v{wq}pklimj`kzzuw{}ywv|}}zqx}YTnqfao}ukp{nh[mkVrvq_fqxngzvv|r|~r}um~ykijuo_h~xp}x{w|uxugzrSXifnd}php^eza`~rm]io|rfoo{}p~{~or|zxqhmtkitr~zvrz~t~w~ygsxVRcgmmpkxyf`vqXtrlh\du~nezss{ox{r|wpz|}uhlwphs}{w~~wp}ww}|fiycP\hnphsm{kcpqXhgjZ\l{qdnxznt~~rpzz~{g`xzgmut}}l}|wnfrkZ_djtnverbmq_aeh^Xosdpuxrt|pl{uxziauwgop}k|~r|~lfsp__aitn|dvclpgffhjVk{vim{xos~u}lpwrx}i^syirt{{nzt{~mhqna[\lqiy|juhvrjggikWp}vip~xip~vx~lovozk[t|ouo|yxgz}r~y~xoklia][kljvp{mxqnmhgkQp~sdmsep}tv~qoyt~k_t{rwn~wuiwr{p|ynihgd^Wgjiwtpynork^oVl{thkudpn~wytxr|o^p{qtnw}{x~qu}yvkvvojfhlaSfpkwysovpquys[m\e{tkk}hmrx}txxrux`etrypyx~|}vzwowrutpumnjejhY^qhxt|wvvnywwchk[wytjzmg}wzwyv{spq}e_oryuryv}oy~vrxdsnpldgl`Xphqv~~w|ntyr`nbn{wnsxbqqvyzztqnyr_fry~oz}u|~qrqm~ungnlod]ilY`mi}r}~}xp~ujdmgvwql|ie}uuzt}xtvps}{lcmryzyzsxo~zu|m}{}alhji^`leXkiu}x}}rtypegnlstos}dmuyzrtvumuyiemxv|swt}ttt|{qwq}^ecidZamc_qlz{||ryqpffoprsnx}zer}x|uvnxtpy~ugdlv|tsz}sxruzvon]cdkaXdqdlps{v}volpcjvrvsq~nh~{z|m{jwnt{xndgr{u~r}vurn~x{yw~b_bhg[]nnhsm|z}ryzmoav|qto{hr~zv{mipvpwytifi~zuuvwp|sxyx{v{s{p__di_Xesipmy|y~wwjshkttpw}nm~{xwhwewpuxvpieu|q{qwqyp|v|}yvvwtf\_fcY]nmqpo}|~}|wsmsc{orq{vkxz{rpsdstu{xslgmtququrzz|x}puyqj\]feYYjoqqk~~|wziub|oqo{ylw|~qxpfowv{xtohjutuqtvt{rqq{ml^[feZWgptqi~{xgufxqpm~zqy|~r}|nljwx{vrpjg|wvupvyqxppn~inc]ed[Xgovpi{yzfvi}roq}zt||~p}zplkwxzurphg}yxwtoyzptonmgod^ge[Xfnxljwx~iwn~vor~zw}}|}o{ysnguz{urqhh{xyxtox~}m~vnqjgmj^fd[Wblymg}uxktt{zoq~yx~~||ovzu}sgr|}vqslhyuy{tmxzm{xlvejgm_ec[V_iyne{txqnxzpm~|xy~|}ptzyzwjm|~xstphusx~wntyuw|lv~~czv_pcac]V[etweyw{|zzkw|xj|~|wz{~urwz|wshw~zsstipq|z|qr{zp{po}ikaik`c`YY`m}jszwvpont}xx~~ypuuvwlk||vqtomrqzyozvw{zyjv|yazt^lgbb\X]ezxm}vyx}nv}}l~zu{}~qrq|pvfr~yrrtmrm}xsrzvsx~pl~z~mg}gamec_ZY_mqx|zv{ym{tq~us}xnsnwptev}wquursmx|pvvx~wyz~loy|flybamfa]Y\btr{u{vnzpw{qu}tnqppqrfx|vrwtvrsz{|zq{rz}}wzxks|zucpr_cld`[Z_f~|z{{v{ss|n~~voz~znrkyjvlk|{ttxvymu}vvxs~~}tqlxvzigrj\glc^Z]arzvw}|nvyv{pq~snqkvjwhr}xsww{sqy|{}u}~sv~}quwyrdknd]pne`aflyzwy}xz{mV^`dfmtywj}vzvnpvq|pow|uqqchij^lujechl{yxllwwny|xmu|moccyftz|~vuy{~l|ofmtx~uqeZYbjrmgl^daf]^qh_[_bs}}~zwz|weZn`gqgddhVbtsu|}q}y}v|yx|zlbdx~|wtx}zrysvtmtptx~|hafyvqhtpsuxywrgj}wde]Zvne|r{k][nvq{keefkfbgYbX[]RhhZUZ]lswyy{~jhXWld]w{blrsqryrwyxrzz|yjcdz{n|{z{||}squynsoru}{y}yxlqwrnv{umu}xvnfmwgk]cuk`r}q}k`]qrc~zuqlnggh[hXXaUel\VY]lmwxz~}|nm[[jdYelrrrsl~xwuxwow{zledw~f}|z{z|tum|qyyoqt~{uyyzwu|xuxt|nk{vofiz}ila_qoeb|~}x}rd_iw`m}z|soigm_heS`_ZkhYX[gkly~~|~|}{vofXgfbXm~tzo}|nqzvz|szoovsgcjri{x|zvx{nq}s|vpqxy}vqx{{z}}z}xqho{tjel}vjl[gongd|{~~la^msbmyunfkl`ndT`e]jj\\_khq~}~}y{zzzsoaXfce]l}}p}qp~px{symmtrgcj|slt|{wtw}qm|zw{rrx~u~zsnu{~|}mqgvkejyykm\dnloez}{|~k_[gqjluzpfipcomZ[iedog`alkk~}wwzv|vleS`beigsxxpwwlsyqjnxxiceuxtrx~vo{|v|nrz{ytvu~xsln~ovfv}oegr~nn_]ljroq||zwzm_Zcontptflvz}vuqi|ystlhb^fvqv~xt|~zty|to^lpt{i^wb``fxvb{nrjbfr~qln|{|wr{jlwxwvzlx}|wqko³wl~zomXcn]i{vf]any}tvekws}}{sn|y}pouqiiv{~v^WvmUJVcX]c\[c\axty{wsmlwx|ywql|z~n\spaZdYNng_bVV\lzykb`jqo{jr}}yphuz|~~|xzx}pp{kqf]epdVT^ipslpd\mjnxvyyz}|lzyyvxury}~tg\gtitm\bc\`ZVmlowsnhdkzuz{~y|p|~~|wcmyxt`prhfXUYgvymc`hmhxjdxxx{{rek~|{x{v|xwyztnxp^Zainplte`niluxsw}|}kt}xuxyu||xxv{l[ctzy}fglfeX[nhqwtngdjw|oq}{ywz}yejv}pvsrj[X\iwyneclifwf`|sqv}}sbitw~~wz{v{~}yw~vzwf`eknmmwgdpjkszrwww|mqyyuw}x~zuzo~s_`knuhrpl]]ngoyxqhdhr{rhz||x}zkin{}uzvd\]gtztkglkcso^lwkoyxhdnlz}uwww~wvz}uihlmmlwrdqojoy{pxvz}torzwu||}s}rt{w~|k^gewuoyxm\kmhv{yogflu{nn}y~{{|zkkp{txf_alwztmjogeukbl~vglw}tfiklzyy~~wxx~wv||yomoomm{riuokpz~rtxxxrpryxv|~~q}utzpxyiahdxq{saooiv||sjgltzso~y}~}}{~z{lmpzqmddluzwrnrjcsohhv{ieq{|vijmi{w~yw|~zwwzvrrqnkxylwunow{pzxztyvqswz}vytvyvvnkuzwndkjpytjmujq{zpjkqxzr}{{}}|}{}~|vpqux|~|rgunpxnks}}ufpotptvtwk|yr~wp{~obomow~xx{xzz~|yup|v|xuz|u{}vwwz~zxy{}yo^sfZerupipijvty~qxzqmkjq~wwz{xz~sefwygasndggjnty}uk~sv}tryrgpmwuw~vzwoug]Yas~olnrrkehuz~~jn~kmwzxuqrzvwliqvz{{|pZ_`i|~|uihhZj|}~~{vyupyp|rnw}~vkdcelu}~{rb[ap}tpmihjovytil~mz~wru|udlln~}|}~o}yi]WV[hznjq}xzniuseq{zupn|zt{ojnxy}}|{}o[_]_s|yvr_jy{}~~xv~~r{zutnv}yphfefn}{~|wg_`itw|zunihlswtkosw}{vx}ugngixx|~n}|nc\WVayytntyr|}mluteq~|vor}uy{qmou{yw|{ww}qadYZjouwdpxx{~~yv~wxw|spv|~zrlhedkxw|}necflop}vmhkrutlq{vy}z{~xkqgesuq}p|tjb[V[rqo}uvxpy~omr||jk|yqq|twvporwxs{~xuxzgh^Vckjumpyxy}|vwwsy{puz}|vplgcey}m}{vkeehmmqvmjnttpo|~~tz~~~pqnbkurn~yvzph`XUevjtz{uqxnps|zjm~xqw{q~vqqswxu}wtxrggXXfmjsqy{y{~|vxvm~xruy{zuplgbh~{n|||ytjeeinqtyplottps}ytw~}psmblvunzyy~xog_XUgyou~~vrzprrx|pkz|sxzo|wrqsw{z|zuw}sfhZWeqqqu{{|yv~jw~stwyxuqmgcf{u||~|rvlfehpx|~tx|pw~}|wwzg`{xsx|vi`ztYLUmlcn~y|~t~vvtminwuu|qv~ffphoxp|vs}qvofntnbqx{teaxye]lufckvsls}|~}{tr}}r~regz{jbib]qn_dsz{xw{{|pnsrjg}z~zyj`aqqbcrldit}wv~wozylidbk|v~plhflz}myrkw}ww{tmqc\cjnlw~z{}j`^dszokluslqz}}}{qzuqpms{yqkjjnwll|scjy~|xw|w~uhjprnn}|xnd`cm{|vuts{|{}prznihdes|w~}eacfkt|xrq|xzyotl]`gmmnp}lc_bl||wqrzurw|}~}qt~uppmlwvphikms|wo~nhw|y|xxjjnqokv}{yribagt~yysu}psznjjfclz{xf`bcflvzwp~~z|xrxm`afiihuvzohbbgttr{zuwz{}ymtzpookgp~{x{ojkkjmuzwtmy~{~{zvklooliqz~}tmeacm{|~ur~~pvymllgbh{~yth`abben{}r{|}~vs{occeggfl|~xrmfbdm}}qy{wxy|ymrwmlnkeh{}xprghjikq{zru~|y{nlnnnkl{{yspicagtrvtszpjljdbp~n}t`]_`bhs~}v~zrzxhcdfghjtwookfdhtzr}}wwz~~rmuphklgdloqkcehjowvyx|vmlmnopr~z}nllgcdmztvrvwlikidet~jzp]Z]agoy~wwr{vgddfimqx~qgkjghn{~szywy}}rmtmehigelpkk`agmu~xxzwmllnrxy}x~y~hchhgjrzt~ttwlfijhitjl|s`WZclv}|yyovyjddgls{~xuwaailovxsxw{~vkqoccgiimzwfq{pc_fq|}|}yv{nlmpu}vypwiZailqyvz~uswldgklmulgrpcZ[eq||~z~yntxkdfiow~}rn~x^\hqv}|t~zwz|tkqmabgjlp{~rfnsmebiu}vwwmmosyt}riv}dV`kqw~x{~}ruuhdhlnqyyhimic\_iu}{~snxthfilr|{wipoY^lu{|wyx{xmnqe_cgjmtyjjnljddmy{t~|pnoqu}uz}ufk~qXWeouzy~~tuxkdfjmou|mlkffa]cny|vowvkgiknw|ximw^Zfrx~z~xyvmore^aegjpzxlnkfigcgq|{v|qoppryv|~}}~|rdk~rZVblqv~{~{swxjdfijlr|yprjcfc]_hr}}tr{tkiiils~|ugpw`Ydouz~zytlrrd_acdflvunrjaghbbju|x|rppopvz}}||}{qcj|u`U]hosy~zrxylefhhjoxyrwm_cg`]blw}xs{wmkjijoz}whj|{j[]irw}zulpti`_abdiq{xnsq`_hgbemyxuqqqps{{~{z{zugaqxl\V_krw~{ss{sgefgils|stxeZchb`fpz}uw|slkkkmt~|pdmzug[]ju|yqjrre__acflt|}}rmuo\\hkghq|z~sqrrrv~}zxxxqb`nrj^V^lv|yprzqfdfhjov}|prxfW^iifjs}|vv{sklmnpw}||yobgsrka]hw{qinsg__adiov||z}rirs`Wcoppuy~tprtvy}yvuupcZemjd]\jy}qmvuidfimrx~||olvoZWfqqqwzxtzulloqtz|zywn`amnkhbgwrgkri``cfkqx|t{pgoueW^pxxzz}upsvy|~{wtsrm`Xbiffc`j{~okushegjot{y~xkkvo[Wfuxwzy}~vv{skmqtw}}zwvsi]bljjkgjyofmpf`adhmtz}{t}wjfssbW`s}|}~}z|rqux{~|yusqogZ[fedhfdn~xkoumffilpw}w|phsvfX[lyzy}y{xv|xnlosvz~{xvtl__jiflliowhjqjbacfjpw{}t}ymfpvhZYiy}|~~~|{tqswy}~|zvsqog[[fd`fhdgu|mounfegimtzz}pitxiZXeuywy~zxvx~yoloqtx~{xvsj_blgcjmhjwyjmqhaabcgnuy|wxkhtugZWdtzxz|z~~sqsuw{~|zwtrndZ_ha^ehdco~}nrulfefgkqx|~|olwxi\W`pwvv{}vty{omnprv}~{ywsi_clf`gmjgo~~noribaabekrwz}ymhtvj]W]mxxw{zw}uqrtvy}~|zwusof[^hb[`hhcgutqungeffhntz}sktzobZZftxvx}xqttnnpquz{}{ywtma_ji``jojisxormdbbbchntx|}shmwqe\Y`pz{z~vt}trsux|{}zxvsqk`Yag^Y`jkfjxttskefejxppmjlidebee^Z_dqx|wg^flwwonuxufSFQ`fbepsz~rou|lb]Ve~}z~|yhfrsgirrqz~ttumiuxe^``Z_`entz_]igv|jdfkpmfzxncRj{tosxlkqzt`j_`ryudeksqbZrg|uwtx{|pyz`Xlh_\O[GP_mwurwy}txfq__ip|~{mzusm}}wpmeidZcWZld\qu~||u|sp^^iruguvumtr}fiaHTenvswqn`ddcSZd]jua_`\s~~}wwqn|y}{~w`T^\d|xxwrwpew}vv~pxfvzmha\`gnu}x{vrv||w~{zslhb`a^lweez||~sxynfbXjwzwqxt|xzx~hTahi{~xkm`gqkimfXfi`mo^twy~{s{u{umgRZnn}~~srqoxj{ow~}|y}|tp{vshknk_n}z|ztx|}yuvsxsu{}rqto\\jfp|qtxr|r{oxkZrqirxwlruo|nthek_\ilw~zduvcbc_blWXjbViqqv|||tzw}sxnh]XdVWt|r|zxsxyqvq{}z~qtfiumknzp|ynlq|wz|yxx{vvttqmvegvorw{~y{yvtfur[Ze`fmwvtsujse^nelvkfphggiaeflo^Zmsvxvvw{}{~|~ztqb_^biacwq{y}|swvnrdeedq{r{my{~s~~{zi|{x|pnkgip\fwrftyx{|x~uaepnmflyu~~{ztx_YhaR^pyvs}zplrqn\aceolendpz~~~}}sss~{~wzrnXRY\nyz{~xz{w~{iyreojiingkxu|yyxzm}}|~w{kqwzxxtlstyrdm~|~nrqptjagWetoxvxvtkWSertuiexjkfvofuoh{zsuuwzv~xj~{|q}ydwje]gsapqs~w~so}teprz}k~y}vhuvncivvxxx|rqvwutszsnunzzvimxymuy{jnvbmn^ksqqj{|zxfbl^`bagl{`kocfra\tqi`xstuoy~{yyzz|mwmh\Rb\o]nvpq}yzx{m}|sw~nrgmxvl|ywvvv}xsu|f`m~odgo~jrtytkxw|t{xvcr{rqhe_jers{|yx~wzpsrltdc|~tvifmosvvwnv~xew~omm}khmz}y}vnqkkcXe_Umn}svt|s~t}~y|vvuxwthrw{qz}{}}zu~xztj{hfk^gs{gtprhsoozs{fr~ttjibk|ry}~}tlsnjdRqz~mn|~lxxp}jqkttov^xltk}w~xy}}yxlrphl[Xb\b|uz}}xm{vrtu{yotjmroyrvv|ur~z|yiqjgkr~~~|npnq~sv}nv~tbljnshsjn{{{{xvwsu\a{syrk}|{tynwvwup~zotnlxqhkvtqxr{v|nooYVaNkmeqs{~uq|xysy{wviwuwgp{|wzy|t}poqhfkqhkq}ytrwrttnx~mtwpqgpfdtt~~}y}|~pdxvjkah}z|s|zxlt}lpoa}ggg|wk}~sx{tvyhggUghTTYp|x|v}v~wupxyxlfupk{n{t~yv|ypvsuvsxjhjynq{ys~}vput{krkre`ijli{|x}wxxh|vthfoejm}{~rzznopijghsz|gwz{w~ojo^fpWTM_jau}~x}}yv}slyoinelyuuzuy||uxy|twmpkvmcnsywowq~romupfpkrempvzz~zyr~}xteni\adrkx{}zpwmslhfvwvpm|~|zuztvqfyk]XZf`^o{|r}w}iwvooe_c]m|owywus}otqtst}|s^pgjuxsw|zw|rgllh]jktup}xzf||opqcmack[hqpr}yswo}~j{issr{o}msuuw|}}}|opvurigcfaaqxfps}~~qz~|zwnp^eaxh`guz}krm}oinyul]o{ond`u}zvz{vy{}rhylobnkfy|nr~zypswj^f`kZjcwt{~nwopcxyoiozpuox~~}wrsob^seSlybf^d{}|~vsxqspndrwjbz}xvyw{ku|qihnafocaqotpuxd~moogpvkz{sq~zu~|lj}leokei[cshpzr~xzpwwymi}ukn||z~|yn}hwygqmlxtgwo\gws}wyw~}|{epttlqg[vks{{|xsy|onxnk\kkd\[mz{z~w{}z}wjo{zsiwuu{x{{u{mvye\xoV]\Ygqiyx~u|{~us{onupv}ly}zx|lx}p{zojvjmjZgmgqyvzkuvglcmrky~y~jkz{~z}s~|opymti]j`Ydxdd|~{trz{qq}sqmoznzt|suzro|}tyy~q[gyehnihvsynwr|pdt{cgecvzu||vl|zrqjyohbdqmajqyuto|yopmlqqzuk~z}~v|xeshbbWah`dvtp}rqy{vtuzu}kjxrkqxi~y~z}xqwlpgpj_chclemvw|votp}{t}qfxq{{xwzzv~vtlskeglW[qk[bav|x~zv|r|vryoxnswsr~|v{qxy}yhqpnpldel^khoy{|{}sulkiaexujmuu{y}s}tsqlupahljk\lrnm~y~y{wvsvqwqhnppzr|ww|nzulkapxohrxnscYo{uz}vxwfaY[YP^^VQXVdz|y~xx~tjnvw|rX]cx}TMZems~zvzsl~xik}fy~pf]afkrpciwxgqnnnj{ayskmqj`txaUyeXbfjck~|xwz||xotyorjodmhcsoseozlwgemocXkuy|mdotmmrsvqhz{}qxl~yupt{M\tlZoqrfbsq}~~ztq|pbdjZ\dU][F_eIVIch\^gmmd}ux}x{vfhvY~~pt|lwvkryuywvwx}zswv^f\Wd[QUPtfU]cgmfu|njwqxdl{rZXWjsYmuz|sx}wysxtloyxq}}p}~hqlW]QLTUKGJnSI^_bkl~{zvjtscke}wr{u}{xvwqvxp|wsvzvxpmz}lymgg\XidXOevM[lcilq~vy}s|qrp^nqa^gaye~}~}e|}xy{~wwt`h~zxp|jcn_aYLSkUKJm[Efgbkmu}tokzsjsmxvvv}~sovz|sxv}yr|je|ltlnl^YsnUVitM]nclnlx|v|y{}lwp^jkehhg{m}}h|v}u~no}mZj~~x~sjgdeiZO]pLK[mSJf_joix}zxmntqrsm~x|qw{t~x}o|z}nk~x_h|slpzj^d|[ShqcNebjrhpvu{wsoyhcghljesxv~xuyz||}pfwwZ^vx|uzynbgudVWrXEbf^KZ]frfk{}~}wwnmrxqmy~yw~zyzv}xyxtv~ldxy_bwxz|iuqcf|_QtkeUZ_msekxrrst}ypf`irhfoxz|zv|}{ldvtY^nnxov_rzjY_qVJp`\RQZlpbhzx{{}pgs}qoux}y~t{}|||}|ss|jarv_`nq~xiyygixfSzmaaS\ptee{|zpuyuvzyxk[fuigmuxzw|{wobnta\ehsqvdmva_mdLlmU`NSjrf`{}}ty}zdi}wovy~|{qy}}yx}wxpwqaerh_dhv|xyntfrq_f^f_Qivnbn}ynt}nszuzxaXmsgom}|x{}wv~}twwgcmk```ivqcw~v`hjaVugTdMXrpeb~tsy}}w^j~uuy~~|~}xyo}y}xu}qisj`dkgccey{xsvismgk`edRpwpdovkv}yp}tyqxzbUjsktpz{x|y{ux|kprfafgdc_hxvhsz{fhidanrTeYUspkbzro}u~}x}baxzy}z~|t|mw||kxx`mia_deihcwq~lrmnnyt\m[eyslf}jmxu}oxuopzpW]rqxw~~t~|}x|v|ltbme``bejfd{zspu{qfldjltdZhWmroepxjy}}}u}m]o{~~|~|~ry|pz~q}{{ph^cf`_`akpgux}}qrnmxuxbhhexrof|ji{syszywonyt\[ns~zsw|vyw~xg~v]ha``^dojh}{vwr{rjldqspi[hcppoftvj|z~~{u}m`nx~|y~nywp{nrxki}[a`_`]`ori||~svmttuehmqtrjn|fo|ruzsxvnrzn\`myzv{xty|w}y~vyfh`a_b]\jrgtz~xtynpim~qng_lrooil}lp{ww}wzxffp}{}urqwpzvx|}}}kvaxi[^\a]Ygtjt{{xzrt}prcp{qqlm{~kkzlqr|pryrb^ety{|tusyu~ozi{o___d]Weqhqs~~vyrumrwio^n}lngnz~mqqvxx|xifj{zwqqsqx~|}v}zirhsl^Z\aZUeqjsq~{}u}~mwdunqhsz|kp|~|iop|rvxpd``tzxxtruuyouqtrd]_d\Taniql}yxtxqx~grdlmmeoyzprm{p{}xmhev{xvpqqv}pxkkpmmeX[a[R]mlsm|~zy~nupkvpio{xrp~~tj}~gxvwysid^i~y}u~qss{vxvlstlo^\baUWilrmq~{rzvvshtcljhzw~yr|vztpu}|{smghvrqox}vtl}thgudkcW]`WRbmstnx|{lxpvupgwzz}swvukxhtvywpjf^pzx|{tqu{pvuetseq^[b_UYhpzmyypzw|uhukphj{w}yvr{uspz}ysqij~~wvrnzr|rhxti^wcehW\_YS`ly{rwx}rryv~sgu{y~|wzvo}qv{kjtyxqmlbmy~~y{wqrwrmwge{`jgZ``YWepyxnuy{kpvyzmfxyy|zyru~v||no{|utrjz~v}vot{w~~~{gjspZhrXiaZ`^W\jxy~r|~nx}}jn|yzyx{~xkvututflxztopjkx{zw{uq~x{uiw~um[xg_l__b\Yco{oqx|sky|tevzyxw{qrxzyxuiw~vvvoz{uyot}uy}zgg{pqZcsXce]`^Y^j|~~r{qvjq{yxuw~~rkstyoughy{tpslqu}v|~}utzzqixvvh]wd^jcba[[ermsyslwpkzxxtu~zmtsuvtgy|uxuuzzzy|~xq|y}zywqdm~tqkWmjXdea`[Zbnuv||pwzkzyyss}~wiqn~tmuco{xprrqurzw||t}{{xxjoytq]lp]bjeb\Z`jtqw|oxu}kyyysq|{lsn|m{jp}uvwwzt|y||t|w}wqtgkysqm\gl]\ie`ZY_hzv{twp{yyqp}uiqjxhwhkzwprrusoy{{~xyyswizt{lb__fzuzxp|}s{}qbr{p~tzpwvunq{||xcz{tu{ylq{s~z~}{~wnpcs~}w~|qsjfhp}{Xdoiajmrumtsskl}|u|tt~y}yqokqwux~qs|s~z~o^i~nbghk^ovka^ah{xs~~v{zxy{uadtvv}yy~}}vt}pkhil^khdtc_mcljjqpv}yqr|}}gx{mfm~}x{wqtwvua`o{lyuchejhhc]f|wiqktyp~wtztomotg~x~{v}z{kbgyvuqbtteZ[\jqrrryy~r{ukyu{ndgv}{|~vz{pkhqis~o{tkveijclciory{tnq~u|dwvkjtz{{wsu{wryrsdfq}|pgmqkia]g|ujsix|p|}swspntuixz||{}}p~vidl||vzhr{j^]_koqusyy|{~wtyett{rhju|v~wxwtmjhtotqw~lrmmncmdfnu|}vnox}qim{|vlmw{x}tvy{fyyovklr|{jgxqle^bu|krlnupxopnos|p|u{~{mpvulfnszvkyxf``gpktzy{yz}tvkd}uxzoossyv~wlihiuxuxpwkoruemhclt~zpnsn{rhrxwnnyzxwy~bnvmwppvysazyog_bqnsml{mz~mjlott~w~{~{|plprkhqux}pv|ldcjojw{zzww}xr~mdyryyqrur~wv|~yvfdgkxwz{s|kl{vgpfdlwxonvquqmovsmp}zzx}~{~yapnovnrxvpe{qe_fv{puhtzl|}jfloy{tx~w}y{vqknngiwx}tyzlfgpgtz|{zxtw~uqzgosr|rqr{{o{tz}x}maehrvp{{ygxmolchrrnqyrntnpsmlw|z{|v}llmkullq}{gxyjadr~swjp|rssdinwyp~~}sw||qyokleep}~w~tlkqgrz~|zvqs}{nunqpr{pnow{s{v~eehpjd{v~yy\lxdostx}~qnr}si{sptrtnfzuqsophnvmnr~}rt\]vywxjx~z~rn|p_enzus{{nozppurbumddadoy|}z{rcduv}}zupr}}mntvluvuwc_|sq`ltrwphsnXYalgdwpxnvjkjozwruzf|}rsrvzihzvmeenrb[eiY]h_^`jyvqyuc]jnw{wqox|womousovropTal\WUXaknnj}ylpkhqn}wt{}pxzv~usxjam}u~sstidm`QVbeZkmfw|j{upqjq}}y~rnutwnloktx{qpvs_YmfRaa[]bnx~xpxsdcqt}zsr}~oqvntpx}sxpTdm]STZenokjzjqppsnvt|~mxvw{rlskepvtvodkdTWdd]qmhw}{pxtvsms~~~tmuqvmeopxx}rputcUnlS_b^`gqz~y|qrvkitx~{|rz||smooyuzsuwZ\neTQYfpspk{}kkuwzqzuzsoszsvhkpkr}xsuvhcj^U_g_pvlt~}wyutqx~uv}zmxpr}}zw`ft}unptnX]v^Ycacit}txylrtpv}|~yvvppojj}}vq{eXfn\PWdqvuny~}{tfs}v~wy|lv~witkdnqv{stxpbggZ^g`qzou}~trxymw{yzstro{|uzxbcuwpqsp\]ud]baelw}ou|mnttz~{~x}rjluggtuzg]fo^QXgsvso{w}{}ugtv~x{zp{~}ofukbkry|wx|rcgj^bccyupw|{qpyh~{{}vxop~ytys`ezywstum]kqcc`bhr|~{zxk|{kmtx{|~}|{ylevt]qz~u~rgblmXTantsmuuq{ok}w}|uz|vcqtc`ks~z|qesoadgkorv{yspwxwyktz~y|kfsx{um~~|ygnf^`^emw{x~z}x~~vq{}|topxzyzz{}~wv~umd}oRGSbiifoii}x|smjmu|npv}yxshnybPSh`^dgjmqw|zsrw{{olro|zmt~|wutwja`i{e]^dkkecjy|vuk{}pyzu~ytmnxuuz~~~~~lchds~rmomf`g][ryy{{yzv~ytyukggkp{~y|}}sgdmz~vn|rgigfehmstnh|yx}zpirlu~~|y{zq}mc__dqwtwzyphiryrzyinrm||vxz|{qns~~t}~|}}sagcgx|{{{vlnk\iwwyz{xzx}{v}}slihkr|z~~nffp{~~uzrnnkgfhnsrkky{~~lnpky}|~uvxjb^^dwyx}|skluvp|uio}rk{{tzvzqouu}~{{|nagai|}|xptn_mwwy{|xw{}|{u{|slihjs~z~{}nffp|z{vrspkghmsrmk~~{|nnrky~zuvjb^^cv~w|yqouwpzzkmv{kqvwvy}tpu~v~|z|~r`feg{~{ytvweiwwy|~|wy{x{uw{~|unjikq||}}t|~pggo|w{sutpjhkqsokwy|rmtnv~u~|tjb^_dttlnvvd_nupgdmcbrlb_akw{z~|z~r]eyxsrtrwxefqprv{|yyv{stx||yqe\d}~oXfurtt|s|qmpnjechnqnm{}~xw}rq~zny}ydezqYLHMc~vq{qu}{usvrmyukmpx{ogqupqyw{yfttmgTMUNVkvrp~wuv~uhswuvyytkhrzts}}}{wtqpqlcbozqo\^jd\Y]ep{vyxtld``_]^p||~uvshpguqhijigebaaetyme\Z{zrpusgjwxnmqdj||yx}~znmlgzsu{y}wrzsu~us~~wtt~nhrvbszqsuwwxxxwwbp|f]bf`dtysuxkryuvyxgZZfsvzujzprxw{vdf}yw}oZptnopomifa[WcyxyyqbXjtv{xtwzqsw}|~ucWZh|okw}vomok\Z^Wau{|}ujqkeivn|zyvttw{~td\p}zorsjicS^nqssssty~}|x{|vmb^ahq{}t}}rwqjn|jnymhlpqpmhb\Xbusry{mcqut}{y{tjq~tf^^ep~xzttsfcgZWbmqmnu{xnkow|}{}~}|}}zwxhX`jl{~zwtbbpqmjiikqz{~sfZUW_k~z|mlka`k~w}snkhedcc`]`s{v}~~yvqekyv{~}tw~{vxyzungcejtx}{tsvrhom`bjqrkjzu|}|}sqv}v|}{h]inrxz{~xflxwspmjilsxuovkb^`eo}|~u{psqgdkyzwrlgca_ZV[pxx|rbfpmt~~|y}u{zxqg]X[bo{{plmjcmrhjrxyupy{zupyvoov~||{zz|}ytg]jsvtmpvwhjz}{xvtrt{st{uxyumfcejr}u|~~}lmsminz}~zunjgfeabpzu}|~yjeqpox{xu}~|{utog^XX]gx|vurhkrgcjrwxtu{vlttljoy~}~|uplbWcrwst|mgsvttuutw}yp}poolgcdhoy~xtqbfqqpv{uwuqkhghhfgu|u}yx~qnyvvz}zv|uyttqkc__dn{ytjqtgdhmpqpp|wr|{tsw|~}{~xuqd]jpstvlmvurrqpqu~yxvttpkedeit}~{nbkojip{vtxtmgccfhis~|}~||{rgosow|wu{{zsljfa\Z]cq}}|zrt~vmortvwss}ukv|wstywx}vtrh]ekis|t{w}|{zww{xnyttrniecdk~~|qclqkfgmw}|tnkkjip{vs{x}}|rfklekv}~}ywnie_XUSWd~|ps{qjloqsutpvqhtxsppu|{{sqoc\egdp}}{{}}}{yx{rm|~upoonliggp}vw~lftwqllnu~|wqonmlu|qp|}uq}wouphmuz{|}}xvqnhb]XXbx~sv|qjjkkmqspsxp|{vssu{z~}}|}|xui`eb[bnw}}||{yy}yuwsqolhdahyy~ytfotojggkr|}zsppqrz{uwy}}vlqpefnuwy|}wniea\XUZkyv~~{tssrqsvtnq~kr}|xtrruz{}}}vtmabe[Xakrx~~}{rx|z}upnliea`kyuuys{keopjfccgp{zvsrt~uvwy}zxnipjbfouy}~|z|tib^[XUU]qzy||{sssqpswumm}yhpzzwvuvz|z}|soi`ei`_gqx}~yrxyry}wpnmljggq{z|{~xospfpsokjjmt~|wtrs}vs}|y{smurghouxz~w}|qga^[YW\mzwy|srsssv{}wpxqoy{xvuuw|~{{~|{|}ypi__gb]cnv|~z}wu~}sligfddl{}xunyvcglkihims|}}zxyx||}woiqrhgmsvx{}orxqe]YXWW[kxu{ywxwuvy|xoqsnuxvutsuz}~z{xme[\e`[akt{wtoy|sjeccbcm{{y}|}|rkuqbehgfgjnu}ywy|y|z{sjhsqikqvz}{|}whmtmaZXXY[ctzwxxxvtuyzumrrtyyyxxxz}|}~~wzxnb]fh``gov|wyoq}~ulhgffkx|u{~~~|zz}~ypp~}nkmkjijkov|xxx{oiqsjgjosv{z~oktvk`YWWW]ksnw{{|{yz}|usxwyxvvutuyy}}~}y}paZce\Z_fls{{|pmx~vlfeddiuvov}}{rpxwonmjhgffinv|{z}|{lhqpfdfilpv{}|lgqul`XVUU\hhdp~|yy|}{uu||x{zvutrqquz|xw~x{~p_ZcaWVZ_emwy~pjt}wlecbcjuslu||}}ztqtrorojggffhmsxvx~{}~nirrifgilpu{~z}nejtqe\XWX^jiblz}zy{|{wvxxyzxwvutvy{vtzx{h^ef\XZ]agow~{{ymo{wlgeejtukmz~|{|~~{wvrpwwpjhgffhmqqo|~zkntleefgjoty|||}mgmupcZVUXbibanz||xt|xuutrsuwwqt~zv|wc]daXWY\_fnv|}xmnx}vkdcdktqhny~}}}|zxtkkvwohfedeglonn~}~yknqiccefinty|z|ldgoodYTSWahaanz~~~~wnwxtsrrsuxxsv~zrt{xf\baYWZ^bhqy~|pjpyyofbciuvlo{~|{{{zxxujboysjffghkptsq|zrnsohfhikouz|w~rfbgolaXUWalhcmz~~}opxuttuwyyts}{~vqwznacc\Y[^bgow}wnnv{ujdchsvmmx~}|||{z{zm`kzwmgefgjosrpz}}tormfeghjntx{yshackkaXSVakfbmypp|z||}{rrzy}}rdjwrx~wpvunmppoqvy}~x{wqr|{vxww|}||}kr|}~}}}|yyzvf_p~xvvxz}zyxdu{{urz~y|}xtttrqrtuvz~tpv{||rkgltupklt|mlzokjkmoqsxxldr}|}~~wrz|vwzvkdnyy~{}~xwz}yqs|tjjuwpjfdhquqmlr|}ttz}}|}}ymj|~~~~xmwymem}|ywvxxupotvuwvpmnonnoppprwxqopr|}xtv|~yx~yli|}xtrruujbkz|wvvxyzxrow}wppsslehu~{y{}~~urqq{}~uojfgmrplkqxwqsxzzz{{{}}xlftyr{{xxumegv|xroqrtwsmlmnooprrruywrsspt}yuuy~~zy~~ymfs{yzxmekv|{wttvwxvqpx|vqqsupifn{}}~{yz|}~~wutpsysojhkpqnlpvuprwyzz{{{|}{qhn||tx~{yxsjelz{vqooswuolmopqrsttvyxstvsqv~|yuv{~}{}|shjx}}|ukjqx{yvtuwxxtrv|ztrrtsnhhp}|{~{{}~xturnr~ytqlkmrsqquxtrvyzzzzzyzzvmiq{{w|yvusohfl{}xspqvzvpopqqrsttuvxtprurpu~|yy}~|zvohkxwooty|{xvvwxwtrw{xsqqqqniip}}|||}}~~}}zsoqqor}}yuqnortssvwtsvxyyyyxwwwtnkqz}z|~~|vrpomjin|{vrquzxsppqrrssstuvsopttru~}zy{~~{wuspknx{trsw{{ywvwxwusuzxtqppppnmr|{|~||}~~~~|{zxrlmqrt}{xuqoqtuuvxvsuxyyyyxvuttqorz{|~}|vqnllllp{}yuqtz{vsrstttuutuvsnnrttv}~|zz}~{xtqonmox}wuuwz||zxxyxvtvyxtqonnooor{}|~}~~~}|zywunikoqu}}{xursvwxyzwuwyyyxxvusrqppsy~~}|~}xrnkjjkmr||wtv{{wttttuuuttuuqmmqstv|~|{~~~~}zxtqnlklqyzxxy{||zxxxwuuwxvrpnnnnopt}|}}}}}|{zxwuqkhknqu~}zwuuwyyzxvvxyxxxwutrqppquz~|{||ytpmjijknt{wvy|yvuttuuuuuuusonpsttw~}{|~}}~~|{xuromkknsz~|{zz||{yxxxvuwywtrqoooooqw}|}}}|||{yxwsnjkmnpu~~{xwxz{{ywwxyyyyxwutrpopruy}|}}zvroljiijnvzx{|{xwvvvvvvvwwtqpqrrrsx~||~}}~}{yvspmjikmqy}}}~|{zyxwvxywusrpooonnsz~~~}|||{zyxvsnkklllou|z{|}}zxxyzzyyxwutrpoppqtz~|{||yvspmjihhjoy}~~}{yxwwwwwwwwurqqrrqqsx~}~}}~~}|zxvspmjiikmqz~~|{zywwxyxvtsrpponnpu|~}||{{zyxwvsolkkkklov~}}~~|yxyzyyyxwvusqppqpqu{~}|{{{yvtqnljihikqz}{yxxxxwwwxwtrrrrrqqtz~}~~|}}}|zywuroliijkmr{~}{zyxxyywvusrqppoorv|~}|{{zzyxwurnlkjjklpw~}zzzzzzyywvusqppqqrv|~}{z{zxuromjihhilrz~}{zyyyxxxwvsrqqqqqrty~~~||||zywuspmjhhikms{~}|zyyzyxvtsqpoooprv{~|{zzywvuspljiiijmqw~|{{{zzyxwvtrpooqrsv|}|zxxxvspmkigfgims{~}{zyyxxwwvtqpppqrsvz~~|{{zxwusqnkiggilpt|~}{zyyyxvtsqpoopqtw|~~}|zyxwvtsqnkihhhknrx}{{{zyyxwutrpopqstw|~}{yxwvtroljhgfgjnt{~|{zzyxxwvtrqppqrtw{~~}{zzyxvtrpmkhggimpu|~|zzzyxvtsqpooprtx|~}}|zyxwutrpmjhgghjnsy~}|{{zyxwutrpoprsux}~}|zxwvuspnkigffgjou|}|{zyxxwusqqppqrtw{~~|zyxwvtrpmkigfgilpv}~|{{zywvtrqpooprux|~~}|{yxwutrqnkihgghjnsy~}|{zyxvusqppqrsuy}~~}|{ywvusqoljhgffhkpu|~|{zzyxwtsrqqqqrtw{~~~|{yxwvtrpnljhffhjmqw~~||{zywvtsqpppqsvx}~}|{zxwvtsqoljihgghknsz~}|{zyxvtsqqqqrsvy~~~|{yxwvtrpnkihffgilpu|~}|{zzxvutsrqqrsux|~|{zyxwusrpmkiggghilqw~~~}|zywvtsqqpqrsuy}~}|{yxwutrpmkjhgggikotz~}|zywvtrrqqqqsvz~}|zyxwusqomkigffgilpu}~}|{yxvutsrqqrsux|}|{zxwutrpnljhgfggimqx~}{zywvtsqqqqrsvy~~}|{zxwutsqnljihgfgikot{~}|zywrsqqpptrvu{~y~~|tronloqsvkg`]cmpz~}xovwgg}srpfkt}tsinxmgahV[ahZexolcz}z}uwvwvv}qr|{t|jz~{}}ztxseqaZfgYQXnnbnwzwpxjlyyunkhpu~pn}n{ggjxztpnljfruYlxuoi|}w|okgkviopt~vhwd~nZaZnmg^b]lu~{utvwz~qv}zwxwfpxo}uzvvw}zxttgl^uY^^Yppml{sv}n]qilqkv|scu{u|x{^wyovpuu\rnp}nyzor{q\wbP[Z[srovrxt{n|vewz}xs{y~txzxw|fokllgu{a]{o\KS\f[lfvsmyhw~zcutdwy|ru~~cus]h~yxwzlvdj_[nd]q\_qegqgmutvstsusq^f{yvbytz|`_kmxrcliotV]gOjWVd{r}v{y~vkpzurhwjx{}{z[\bzuxkvifOlMpOTPgt~r}t{~{mmnwrd|yr|ty{z{x]`^grl|my]bXX~WaZgyutg~|od}wwwerqqtr}}|ne]fal{yxrlzjehZdhe\s}|}ni~{zuawpmypo~ov|p{nfVgWeqqukkZuigkeqxty|u_wsz}fzxkwyl|}nvus|}{||}pcVhbaltssplbvhdkakspw{[{|u}lzrfsxpz}tmt}~yyyxcW`_ao~xtki]uf^hgnoor~aywxl|xfltnr~tnyv{zt~n[dccp|ytjiavlZfdnsut}kq{{|nszgepqsyoy}zxuyyz__\^mxxkf^ox^egntxsuri~}yzsmmflno}zztr|qve_`Xfp~uldjgcdjswxt|ya}|||~~d{tilrq{wl|puw}vxmZ`W]j{}qfa{vbihqqxtv}eqyx|{nr~okomquwxwvuzryv\]\Tfpxmco~ceennvyvzq_~z~|ewskosl|wr~u}wssyhTaVbl||rgd{sbilootxvfpyxz~rlzkhpon{y{~{yxypvxZY_Zjrynhlfcjprszx}z_|zyz|grohjyny|sxyy~qpymQ[Zaszrigxcgouqtuw}pdzxxw}wjumfnyp~|t}yzxuykoxfP]Wixpjmx`grttuwu|hly|xx{pkumfu{y|wt{}x~sqglu\R\\r}jgptalsrtutuzex|yzyyzlqvlgzyzpyv|~wt|heopVV[azygkvibmssxwtwpfx|}zzshtrknu|}s|w{ozubfpeQ]_ondm|egsquwwvygt~t|{zxlkspiyz}{wwy}xl{hbjpZW_cx~iiuqcquqxzwwqcuxzyzsformpu|s}wyktsaeocS\apqgs~glwqtyzvvcu|ryyyxjjqpk}{}szz|thwealmWV_h{~jp{ogvvqxywxlfsvzxyphppmux{t~}x}guk^hp]R]evomzxeszpuxxvqbvs|yyuinpnpvq~zvlmo^dreRXaotjy~gmzrtxyutbx{q{zwwllpom~ysz|z~~sis`aokVV_j~zjxlj|sryztufq|qz|wxmkpoj{z|uv|}z|vhub`noWT]eylxriztsy|tsgo~owxxokopkyyxxv~yzyitd_lqZS[ctoxvi|urx}vthk|quyxqknpkxyu|t~wy{jsh^js^RY`msv}jzyqv~yrlf}tq{wvkmpmr|psvy|mon_ereSW`f|zsmv{pu|}snc||xn|xwmknoo}p~t}x~~yrjp`bpkVS]cx}suqssyuqfqzpuxxqkmolzvuzwvuzgpf^jr^R[amx{n~xsv~|rkgzvo~}vvmknnt}qsuxynkl^cqhTUae|}utusuzuoev|yovwxplloo~tyxy}vsxgnb^kq]S]bqx~oytw}qkhxvn}vvnjnou~rsu~}vvohk]aokWUce~uxtsuyvogq|wqrxvrlkpp}yx|us~pwgkc[fqdU\en{zs{{sw}slg{wwmxvvoklqtuw{~yv}zosek^\jp_Ucgwx~rxtw~qjiuvk}}uunknrzvt}tzz|sqndh[_mm]Yijvtuvyzohm~utlzutmkqtzs~qzzlrgfcYbpi[_mpwyz~sw|ulfxvwmruvqllsxzxy}yr{|z|vkpbg\[ipd[in}yuwuw~piirwi|}tuokouzt{qyw}w|mnicdX`on_`ppw}ytwzwmgsvvonvvrmlsy}zx~ypyyxxuiocf\[irg]lp~zxwwwpikqwh|}tuokpw|t{oz~v|vyjnheaYbpm`dqrz~~}uw|ukhwrwmpuwrmmt}|w{{urvzwwojlceZ]lqe`pnz|uxyzmhpwttixvunlr{}|wzo}xxyuthmef\[hqh_ln}}}wwwpil~pxg}}uvpkox}tznyzu{ttjlhf`Zeql`hoszwwrjj~ozixuxrknv{uzow{u{ttkkjga[com`enn|xwtkk|n{ktuxsllt~zvypw|u{usmkkhb[bnmacmk}yxvlkzo{mqvytlks}zwzru}|u{vrojkjc\`lncalgyx|{mkuswtkxxwnjp}z}{zvr{}vyyqqkkke]^jog_ke{yzyokqyq{g|wyqjmzy|x||oy|wv{qplimh^]foj`igq{{{wskon}jxwztkkvz|}wzpv{yt{tnoiklb]bmnddkf~{y}{mmvrxukyzxojq|{}}{wqxzuwynplhnf^^hoiakex|{{xrlq}o}h|xzsklyy}}xzouxwtzrmoflm`]cnnegki}|x~{mmwqxtkyzxojq||}}{vovwtuxlnkeog]^holdmgx|ynjputosyqvqijw~pk|{siiW\acbjhbkeioc^bmqkjl_xxkkkaicbf`[artryzxi||ntutt|sszq|~st}~ygYy~v{y{v}vd^f}yt|}{sowh`|mn^V]`_ch^ce]kf]^golbd\mpYTftzjicZYftmts|xz{yssiuutxzyuzx{tu{zl_\U|w}~x~xtso{s`[d~x|vyzjfd{o\````g_\fZdi\\ajjbcckzyydSVj~|wqfahwqtuyywxtrrmuxrwxx|rzzpvjhkldZ^\|}}{tunyub\e|~z~vw{xugigxceddcib]j]fn`_dlmfgfnssubSYm~xlfm{rwvzyvwsrsnxvruvw||p{xosihkkc\_^|xusnzsa^iz~wzvxphhjvefeefk``l\ln`afnmgidu}|otq]T]sxlhtzq{s~~uvsu}qrmrutvx}wopuniilja_\e{}swnszl^bp}{w{t}jidrnigefji[ke_ugadkplifdupwiXWczvlo|sxwtz{tuptsmqytuuw{}n{{lwlklnha\Wxvwrp|sc`hx|x{~|tpldgyolghkm]hm[uncejpnkf^wzrzq^W^nx~rp|tuyox}sto~xvnlvuswz~pvj~nmnplf^Si}|vvn{yiaepxy{y}}u{wngasuqkklpe`t^lwffioqnj]i|~rxxgYZcqv{sz|r}px}wvsqswtktywstx}xltquonqqkfWYtx~v{pu}sedjtv}z~~|ysrnce|xqlnpp`lp\xrfhlqqof]sy{qztcZ]grx|wywm}zzssny{xqkyywruy}tomxronppkdT_vwuznv|qeelux~{~zvs}qmbiyrmprp_syozpx~zrz~yzjdjurhU|wZRM\mab^\l~zxtx}}kdwututogWby|lnu[aYaibXZcox|qtqmh{xkibhxeKhzmXWY`bcYRivr}{}ymwthagski[|iYPUi`^]Yf|{xvpnonifwttwurdhmivsk^Yd`VT]hty}yrr{tzritqqnooe^[[gsgacfebS`vuu}v|rryrikv~to^hpvpe\kmac^bv||woiceipm}}~yvxyyrizmslq||vejkb[_iu|}|twtmztllvrtrzoaWX]eixropon`ay}w}ry}unwtlkvvkk`iywzndnvhjfgw~}}zojbchppyyuwyzvj~wgqpu|jlph`clv~|sttm}tlj}wsvtym_VX`il{uqrrqcc{~x|}pv~}vowuonxtjj`l|y}pgrwkmijz~z{wmhabhpo{}yvx{|vlrgqpw}kpqicfnx{zrtpnztkovvwvuj]VZbjo~wtvvsbj}}wy}}~ny}}rqxuopzqkh`sx{|pkzumoin|urle`cjomzzx{}~qrklrpyzouriekq}~yvrtjv~u}rl{~uzvzrfZY]dfzyyyymcv|xvv~sq|z~~qxysot|{pmbgwo{qyrtnlw}zwxojbbgkjsz{~wluksoszuxxpiinwt{tulo|o~xpxw{xvwn`[]``juds{wr~u{~~xp{yz|uy{vqrxvqedrgvz~xxsnu~z}s{qldbfifi}{kz}nurpt}~}~wolnsuwwvnkynpux{{{u|}ug__`__zjo{wstxu}|ox{xz||x}ztquz}umboke||ss}wq{tphbdhgctyrqssupqtwqpq|~n{wsisvgy~}vzyxzpd_``]fyjyzwpxsw{~vqzyxyz|~zutw~ztgeqej}uwwo}rnfbehfeyzow~ottpru~||sng^ki\rzq}yjfpkl||vw|}{|nsmb]ktglpw~mmxwyysqids~xxux~~hkzqfxtdvtljdbglkl~}{trwx}yv{zwi`n}xmYptnvxupnjdrtgxzvoumjyztluvfdm__ekufbmoqtx|hcekw}}yoofvvyzblpfd^[_eggvyzpnu||~u__hxnsqtvuokh`hthnyv}qdjqo|y~qin}szrcgito_gmnru|}yg_gpy|{~|i_jqywlxohd]]chip}xxomv~}{|r^_n|tw{yunldcuqj|~qwreest~{vx~pipz{|jhjrucenptw}yyzl_gr|y~uwi^hv{lwrie_]cijo~wypnw|zzyr`_oswzyvplfctuixprredtw{uw}~~}pjq|zlgjrweenqtx|wwzmait~x}}}qth_kw}mwqie_^cikp}}vyqpz{yuxq`brux{zvpmdewriy}mrqehvwzuw}~~}|olt||~kilwuchprvx}swzjbkv|~wy~wpqebpwzqyoje_`fjkt|ywwqs}{~|yuyk_ft~z|zupkbnwkl}vlsmfqvw}wuy|{}wnny|yjkr{lenqsvwxr}ueeox}x}~vprncjsttyumjc`ciiowyw|tqv~z|zs|ub`jw{}~}ztodhwnguzlqsinuqyuw{{}snr~qms~rfnqsuu||p}|iejqz{xzt~srtikpm||{ypmfbchimtvxzyst|~{|{{s||h`enz}xrgfvqen{omunovov{vvz{{ypov~}{ps~{imrsuvvovqfglt{~}vuvznuojqlo}upkedgijqswx}wtx}xy}~}xttcbgp{}wncpwifuwiqtovsn}~xuwzy~~~upqyz~xrytjs|xzux{|}|{dw|le|qvlkmhjfcdhimrmjp{ncrhqs_gxmglsy~vt}wmfw|rv}fuykoqmsqrspptvw{uos`Qi|khpbZrujkquyyzvcwv`kvwnlkffc`aefiickxt_m|}zbfwmeiov|pu|qk{uv{yvhe|wxqtqqqmlnqoqlky{nmmZYs{ucu|omptwvuwvey|z~rvokibt|urjiea`bbbeco~|niooessi|xllqv{}}xsvjtvpzsnrklkj{ywrsokklkklk|xd`gd`umoypqtvwtsz~ny}u{vmijdhjuxuojhc``a`dfm}zqbepnshsrmpv{}|}u{om}qsxhkihoq~zysrpkiihgllz|}ydZbjgvvjsqtvvtrvwvt}|tymbfbhpy|wqkjea`a`dio}t{p_`nsvkowoqvz|{{z|ql}~rpzyfeggqv}{ysqpjggfflnzzxwcXbmmzzkurtvvtqvzx~s{{rv|k^cckt}~yrljfa```fkqyqwm\`osykrwqrvz{z{z|pn|ppzubdfjtx}}yrqnjgfegmn~vvt`Yenownustvvsqyw{zqvouye]ceotyqmkfbaabikutpuf[eqq}}j{urtwz{yzxluumrzm`ehosy}upplhgffjlo}sxm\_kkqoy{ttuvvsu~{rsv|ppyq^aejpswomjecccgjjznsp__lloqs{rruyzz|v}ppznnxuccimqn~xqqnjhhhjlgzuwuc_iggzwuwuvwwuu}zmyus}qowvc`gkmiy{qolheeehjdu|oqtd`ihewysustxzz{tyto~|pmuyhbjoqis|rqpliiikmenyuzlahhantzvvwxwu{}omzq}tnryl_fknhkvrplhgghlfgumtn`eibi}t}zutvyzzyq|owumoxrbfnrlh|wqqnkiijnicxsvwgdkdct|zywwyywxxjstt|pmtwe_hnnequrpkhghklcn|plsi`ggamuzuuwzz{vsyp{rloxn`foskkvqpnkiijnge}|quteejbfy{~zwwyywyvkwruynlstb^honguurplihhllcq~{oiph_ffbpv{vuxzzzwtxoz~rkmvn^cmsmmwqpmjhhinhe||opsecjeh{|{xwxxvx~ynvrrznioscZdnpkwvrpliggjnfo~zpfli^cieqx~~xvwyzy|v{ou~ukiqq_\issq~|qpnjgfgkmfw}pioh`ikk{y~ywwwvu|vuvnx|phhojX[issw{rpmifegnmkysfcia_jmrw{wvwyx{}ro{ylgjqeXapywtomjgddhokr|rfikafpp{|~zwvvutz|xymr|rgdjkZVeuz{spmifdfmqn}xsf_fc_kqtw|xvwxxzsmxymefngW]o||}vomjfdchpnq{rdejbgrt}}{wuuutzzxlqzqfchjZUew}~somiedfnro|}wqd]ecamrvy}xvvxx{~qmywkdfmeV_r~}~tnlifddjqnu~}yobejcjst~{vuuuu}}|uksymdbhhXWjz|}rolhfeiqpp~~zun`^fbdopy||xvwxyymr{rgdhl_Wfx}|}qnkhedfnok~~zuiaihenpuzwvvvyy~{nnytgbdkaT_rzywqokhfgnqlx|wrh]cfbilo~~zwwxy||rozwkefmgX^qzvvpnkhfflohq~{xnbfkfjll{}yxxwy~vx~rnywjddkgX[mvrz|tqnkiinqio~yul_ahdfgft}yxyz|yzvpzzngfll\[mwrv|romjhhlohi}ysfclihifq{yyyz~vt|wnvzofdhl_Wftqpwsqnkjmrlg{|wqe^fhefbiz|yzz{{w}}qv}tjfinfYctto|wqomjijpldr{wmbgmijegw{zzz|{sv~rqzvjddjiZ[mtntvsqnlkpqhkyuoa^hhfebm~{zz{}xxyqy|qheincZgvrpvqomjilpjdv~yujahmjieiz{zz{~ysx|pr{thcdjgY\ntowvrpnllqqhm~xtm`]hhgeco|zz{}yyxqx{pgdhlcYfvtsvqnljikplev~xuk_dmkkgk{{zzz}|vz|ppytibbgh[Zlvryvromkkprjm}xsmaZejihep|yyz||{yot{rgcdjfZ`tyvzqmkigiophq|xtm`^jmnlmz{xxx{z{}rlsvkb_bgaWdwz{yroljilsql{~{zsofY]ikmlp}ywxy~~|qnwuib`eh_[m}}~rmjhfglrnn{~xsnc[dnqrqy|xwwy}}tjnumb^_edY_u~}rnkihkruoxy{rngZYgnppr~ywwy}|qltuja_bhb[j~~slihfgltqo{|xrndZaosutz|wvwy|tjmtmb]]cd[_v~qmkihksvpy~yzqmfZYgprqs}ywwyzoluth`^bga\m~rligfgntppz~vqlbZcquut}{wvwzzqiotj`\]dd[cy{pljiinutp}{zwplcX[krrpu|xwx{vlowpd__dg_`t}pkiggjrsmv~z|soi][jturszwwy~}~vlltqe^]af`\l}~volkjlruory}sni^Wcprnnz{xxz~{pnvuia_bgd]jz|unkihjosln{vqmbZdrtomx}zyz}z}zolutia^`ed\evx|{romlmqtmm|vplaX_nqkgq}z|{~xtqpikdb`n|{y}vtpln}wkzqu|ma`vvxwkjz{}}y~~}ois_LObomgtzgqhlm^X^bl~xs}wwpiwq\xxtshenqrvvukci]TX[Yis{xlywooquu~vvwmryojomwddxz|wr{slw}}mfae\b{yxz~kbbihejooev{uxnv|~slv{upovuhnxuvtcpw|wyoltr`cr{xqjs~tyxh~y~jbfighinzznnjoyrv}xzqjhffko{|zuluiecb`hqq}|rvyrvmjorutsys{}nxsju{vsqh{~{oym|tyr{{~r}wrehZjpxwxqv~r|}vtdibl{vtfnej]o~uzruxu~lrtvfppytt}oqr~vpqgntkfqmx|~u|vuy}wqrwwwq|x|~mulkiid`zuxx{r|osu{vkkgjcz{{nqrXZ]p}~z}t{}}|st|ul|igmwy}}~qjqfvzqyj{{yu|zyv~wvtm|w}hknnf_y|wuqz~~zz|s|~|sippocz|{rqbhspx}zzt{}}z{tso{uumn}x||z{}~kx|~u}ssoj}nuzzyvo~~yws|nx|unpz]Z[gu}}~t{|uzw~wp~c[_j{sopbhdlrzw~}uww~|xv{xyqwlsuy}~v~vlxkjmuwu{{xw{wu}yw~n{|zwm~zxz~~~|{tgqqjkw~}yxz}x~z}pnuzioupq|~}ruwkaw|wvyzrw}~|}rtywu|{o{xw{loosqpw|~|utyu~~zspuwxilnvz{}wxnojfdo~x~~vvqqqx|~vsqnjjt~u}nb]mucox{|ztw~zuhfwpw~yypuqltx|xy{y}zqmnqww}zxqy{x}odwzun}zusyzz~yz}z{wqtp}~{}snmlivt^g~txqqrts_]lu}{t{zsyt{v~ppr}ju{}|vz|wuzyporez|{duyk^\irz}~q|uyzxwsxsmxottpw}jhhlll~x}rwzzxw|jpxtu{juo}rr~ooqjeyw{ysp}|yqrzwmq{m{yx}sm{{m|}z~}uudgrvspt~{pormltapu{x~yysy{kt{okvus}hnmkorsxw|npyztw||qz|jp|tyrvxmmyzv}v|v}wz~srr||zsm||s|tulgZast~|y~~vvns}z|zsy~|z{wzunqpfyqs||rwxxjpz~{zxtr}}|}~ylrqqowrxxrxz~}zu|ww|uqyztsm]flvzxu~qnrzvoy{|tw~x}z{twrio~tuz||tsxnx}r}wtu}{~}}mprleg{~z~}~~~twx~|v|uyxqir~{}xiggiu~}z|zzzxs|luwtutszzv||{}~}~tgu~vsx|}xurthvynzwyy|~~|uz|v{ogapu{x}~~zzytrskzvpv|nzvykmpov{xvt}y}xxv~wqtoox{yzu}~rnzrp~}z~|}ttlrsp|sy~{~zpv}~~lefxniz}}yyz~{oxrl|torqxuyywquuvtuu{{w~xs{{|u}wstmlsu~vyx{yw~pxpw{y}}tpqmwn{}os{||stvojzpev~v}|~w}}v|unwmhh}sv}{w~y~}{tszpu{sy~zy|xznjrrt|z|u~utvyx{ptvn{|y~tronxw}jq~|}ut{|zvuoctto}|vxq{lfd{~mw}r{|~nszp~|{|{|~|w{{qpvpnsu|z{}vrs}sx|qmttr~{zrnwukxzvsx}xx|||z~|vw{p}m~||umwygag{`fy~~wwi{w{tyws~|~vp|y~ytwl{znps~w~wf|yp~nzwjanz~s}tr~o{j}zpmtv}u~v~|qp}~~x}pk~||vyof]w[`rtsu}~~ynpt|yzw{v|pzrtki|it{uvzzx~~sw{sozq{tux}~~yzqlrhqliyxw~v|t{rqw|}~~~rtv||l{cmr}wyx|z{{y}xvx^pxsnq}w{|t}stzvlrrm{vyrlrx}}vw}qzuzz~xymyuinbqpl{|ru{{}~yuvmu~|}t~nnsppgstiy{xu||}{xyvm~}|yx~~mttco`ptewvzvwvtw}{utryx~{~ly|yvctsvy{x}w}xvpshiw}{}~sr|~sx|rpvnnv~rzzlmsxs}{xlzyt{~toynhhwjr|uphxy{vu~m|tv~xxxvxpwkjlllxy{zvx|s|y|yk}{~u~~rywfvaf{hgh}~p{{|uy}xyysnysqvypkpfquxu~}}}~~pmll~tyz}~x||uuykisukqq|sxuol}wuyvpy{~~wvuttlhsxozy~kk~{~y{}{|q~xntmywy}uuznnomfmuqtyxx~zs{{s~~s}zyu~oofeyf_bxxsx{~z{~rz{uuvzs~uivojlsoqx{~trlvp{{~|}~}zw}skroipqirhxtmv~~|~~yqryz{zwxwllxm}ydmv{sx{z}|}~}uspjxpt{z{{sqnrprmmtvmx{yvztwux}u}xzvznqetue_ewkqp{wu~zr||~s}qvuklrjfkquz~|z|~~wz~wov|}soljutnsimospkroj{yrxujv}voszu{js}j|{rbhv~xTwypppk|}wunyno{|w{yZioe^YlyjipWx{zw_ttodPXhurnuwsws{l]y^ldbys~nju|nwym~p{}tdeSkuomsq~}mnws{~hjdyuspvxlgeuzjxu^{srprzyv\`_l||{ibqmX_bmceh`fk`ptbdv}zytxyiy{w~zyy|v|~t|olbVHVfpz~lmnzfqqer}kpzd~~}rw}uix^njcr~qpvpul~}zzjdV_kpwupefZocagYgna^eo[pxxzzzzsqyvpvt}{yzwvmZYVN`kwxrgx}euhhzwlmyjqyv}rhoirbhx|ptjt}mrbcVcn}xpd`[v^abYdoicjmZv{}vypr{yq|zpx{{}w~wkW[LOal|todwxhtin{uotfmxxun~ggndj{}|puhowq}j]dXblz|shb[y`[`^hkhjppYu}{}orvytwpx}{}vryvhOXSO_mvohwanlqywtxokyzwhmdlji}{uppm{kzhUcZbl~~ufg]vmV`_hnmjlu]h|}uutqzuzy~v}uyurnslSLVPgonokqdgkvxwz}{b{z~fptjlslyv~my}i|uy|tw|tW\a`q|}nd]fzXZ]dknqoth[|{}oysyy~y{srx~yqvelmZIYRdtspjzbiisvx}|dq}|}|{kltikwuw|xoulxxvxysntt[[cav}shdb{_W]cklqrvq[}}p~zuz}~wssz{{mzvagl]KZXivvqm|_fkww|{et|~~zxkmtnkxuw{{nwlyux{xokurV\aeyzrgck}^Z^fknuqwm`|~~xo|xv}|x{xuxzjwkZdlYNYZqzwqpv_emwx|{b}x}}vtioqqp~p}up~zl~qx}ekxlU_^n||rgdwwX[akltxrw]n{~y}}rsyzwzs|x|wny\[kiPUWbr~uq|idlttz{mkyz~xtpjoqmw|qzxxnxzw{ujcsv\\_fw~~njr~bW`ilq{txgaz}xz|xvrx{yvy}x{jyeZipWRU\kt~xs{qaluvy}qgzy|trknrps|kz{}vrs~t~vqcqzbY_cnx~tktmWalln{vtm]|yt~wxquy{ys~xw}yornZesbPTYcpwt|eguvv}yc|~~s~vvnlouolt{~|y~zo}uzx~ejzs[\_eqylq~d\lolu}ts^l{~rxzyvrs{v|vx|~kxd\kpXQW]etx|xzcpztx}pf{tuumlqst~h}w|}wq~t{~xywdmzm[\bfuz|kw|a`pnlx~uq^sz}pzyzurs{vx{w~}}|~zju`^lmWRY^gvyyzyeuzuzzlhzr~uumkqru}iy|~~xp}u{|wvuckxlZ[dgx}~myf`romwwp_q{|qvzyupqzx{yy{~{y{gpaZho\RY`gzz|whs|vyzof~|ovvojnssk}}}~zozwz}|owcesp]Zcgvous`qrmt{qdf|wpwxqnvyuu|{w}yykgiW^leUVbeztuk|wv}ugt~sqzurkjrsys}~|vr}z}|{mqj^isg[`kpwn~fivnp{tk`yz{nxxysorz|zv|~{yz~~}qqajYYgj[Vbhvw}kzzuzvjk{xm~ttlhpt}r}}zq}z{y{{okk\erl^`np|mngwpqxwmasz{przyuopz|~xy}{v|}~}nrah[Xfl_Wckwx}n{{vzvjjzykuulhou~s}|zp}{yxwynki\frl^aoq{nnmxoqyujbwy{ntyyunpz~|vz{wwz|{~xlnagXZhk_Ygk|vqyw|shpyvj{utliqvzw~|wr~{wrwjmc^jsh]gnvuwmwvpspfguyi~wyrmszztyrw~ynpgeaV`lfZ]jkzy{wyymi~w{luuwpikszs~~rzxw~}xsqkj]dpna_mktxt{rs{wiewuynqxzunnv~yw}xuxw}y|slmfeX]ji\Ygd~{|xy~}nixyzqnxxtkhpxs{twzyz|{rtml`bnoc\jf}xv}tsw{keqyvtj{yxpls{z}}y{zsyz|yxknig\[fkbWbbpz|z{skpt|hwxohlt}vt~}rxu|}ssqoe`iqk^chj{~}~zttrgi~q|jxw{tlmu~xvxryv~yxqllicZ_ji]Zf`~}{zolxxyulzyvmhnx|tx~yv|{v{~{{qqqmbakqh^hfszxvuogmo{h|xzskmw{zvxqz{u}vvnjkjaZakh\^fcz{z|nmzuzsmyyulhnz{tz~yw}ytz|xxoopkaakpi_ift{xwuphln|hywztllv|{xypw}zszurohjkaZ_jja_ic|{}olvxuxh{xwnhmy}vz~}uz}q{yx~vvpkomb_hpmchko~zwu}vijyoypmxzwols||{~upyysuvnohfje[[fmh`jgv~||yulom}isvyskjtzz~v~{qs{ztywqqjjof_bnrkfrlwwvmhoyn{e|~xzsmp}~wx|lsvspumljcgh]Zbmmeioo|y~zmmxoxrjxyvnjr~{yy~uowxtvwnpjgnh_aksohsnwyupin~k|gvx{uno{xykptrnslijafj_[bmpikqo~vxpbakyelg]tjif_asw]YqfPSQP^WPUakkhtpxyvwu}{tWYpirswnssw~vxx`al~~nimbkmaaiuyu|y{wxnysfifp{neiwkynmwwm_`x_U^uw_]ONYMJQ^ebdkiz~|~|nZTi}x}lillyxyrs~yzyc\ep{tvpgwnfku~}|~tvmhgfvrdbjzrkvcvwpnd^hxbRZfwzs]h`RS[ddahbsv{~{~t}}qk^U\zrspu}xvouzxk\bgq||y|iwwijr{}yxut{rrjwyjciwxjxhqzrri_`vxhUX\izmtr^[_ghdhblv~}}y~|xxupdWUjyvssyyo{z~~zs_aahsxptmlpy}z}xz|ryvxxmt}qehr|mtqkzuuoc^i}}zu\WW]lqlaafkhhfb}~t}z|{{u{un_U[szywq{{ssy~yzh`aajwymzlot|}{|stwt{{wn|{lflwxmwlrzvvmb`q|~}zmXWV^nyzkefkmkldhxw}~{z}z|v~xtl]V`vyzwr{|svy{xxe`_akywnzoqw~~{trwq}~wq~zlhoywovmtyvvlbbu{~yxiWWV`qy}niinpnoekyw~z|{y}z|~u|wsl^Wbx|{ys}~uv~yxvxe`_akxxmrsx~t~{ouqz~{q}}pinwypuorxvvndct~~|utjWVV`qwumlptssjjuw|xx|z{}svuplbZay}yr}~xs||vswj^`ajw}yq{utw~wx|zopvu~rwwllsztrsnuvurieo|{rlm[UY`pqpnouwwtizx|yx~}u|}|y|zytornlf_bvzut}}uz}vqrq``bivu~n~vx}}y}suvplxvxr~{olqxwqsoruttmhn{|oil_UZapw|uqqvzzylv}x}t||u{~{yz{wtnomkhbhy|vjgg}y}vzxzyc`jy~ztetxd~suztzyno}xvtsoxuzzzy}ri{~v{xuzZWp|iTPfQ^sdeiry}}q~~~x{yq`k}gdodplfei}x~~uyt`alyyi{vhw{vmxxtq~kmhhwvnnt{{wvxyzytmo{~|zu\UathgmPfm`bfotyskz|zv{ws~wofeuy~vltifbpx{xt|qlsg_elyzuoy~xxritz}|opfpvpkntxxqsutuuqmr||lodV\evwoe}oiimtxxjs~vrvxrz~~}}~uroidi~y}ynil}{|v{{yktn`bdm}u{o}~vtsjptuwxkoxtnntx{srzuvwsmkx{lqjXXZg|kznlntxzkpu|ssxsy{t~}zvtmdan~rlkz}vyykstda_dsyo~}|rtmnsj~}rmwwqnsv|xo{xuyvpjn|~}zror_WVZlt|vpnsw|ri}yt{ovtt}qy|{vvrjacs|}rkwzzw|tkwkb`^gw}zy{ssqlskk}nsyupptwrr~vwyunjryzkrl[WU\puxsrw{}no~vuunurxzn}~x~uuphafu{~sn~{zy|~olvhb_^iy~x~{~ppmkshn}ovyuqruyottwxtmktxzhqiZXV^rx{vty}~nr}vttmsqxyn~t}rsnhchv|to~{{y}|ojtgb`_iy|||}nkjhrkmruzwssuxrpuuwtoluz{fkhZXX_ryxvz~rpxr~xkpou|p{}sz~oomifjx~xpz|zxxerkbbaiw}v}yrfheormwqyyurtv~{j{zqvurpu~~~}{}l_i]Y\apz}yy~}o}}tvnjmo|xv~{m}riljjmy}}ss}||y}gioddeit}x|uzwcccjwr~~rwz|~vmvowiS^[X`gwshj~qcYbUJQUekitv~k{vilmot}vgwjioeer\Xd\^cht~|xrtvb^`hzxl`imfkX[nbdikmqz{{zor~wu]hfbjq~ygi~k^WcZPV[knj}qmylyotvy~n`iozfdkRS]UX[`lx|yx}ytxuxxeeiu~o[cu{^co`beghmtrz|wtyoht{scpjiouvhftogm\TX_nhi|~zkq}{tytxz|~}o^aottxoV_]WZ[amwxwu~vu}u}sehl}~|vb_lzj|tillkkpptvrwvkm||gjnfjms|ngl{tvr^]`moes~rlu~psvwyz|wgamny}eae[[Z\erwwy|zuxx{{hfjw|sk_eo|soonmklllu~uuypmyx|pjpghhkwwljs~z{f`bmqcly}vkpv~vxwxxwz|~~~pfnknrfk`][Y`kst|}{~wv{zpgjt}qxxedhr~~zrrpmlkfwww|ryunwxt}krkgggmzslnwz~~vedjtherz{omqv~wwyyxxzw{mnphvmni`_[[dnqw|{vx~{{}kin|wo~odfjt|xvtrnmgi}r{usyrqzswvoriighp|}rmqywtghrueju{|}{mnrw~}}xzyyyxu|~wlqnizoqhb`\^fnqx~}|zvx~|{|kjr~uqleglw~zxvtpnfmzq}ssxqtzt}vrihddiqtx}{uwvnny{qux~wek}iX\hs{qsz|uyf}qomk|}~l^vwc]ajkjtz}nlu{u}z~jcfmynZamdU[VYc^ex}wzsrlcdvvu|yvlS_~ppq\XjdX[bkv~vuqpx|ww{u|i`etuke_^badeovqnr{|tkpim{w{in}qdXdj]\kk_gljuvs}wwuv}{y|xp~onuk\}sZck\W^hr{s~~zss}xzzkpmlwvz`Pmr[]aeilvuopyv}|noy}in}n|whjtuag|bR[dVV`_hqn|{yvlfcp||x}{xfVrpgmlV\lc\bku}uxxwsqw~y}lprr~o\U\twogbbaknjjr|{{rwzjcjslro}rs}xldfs}~hfjZS]^enjv|vpkcchs~hafday}~w]`od]bjry|os{pnosz~otwyvl]W[evztrlssmmt{wzznssc_jsmuqtvujfgnw{xyye_ffnqmzz{rngaejsn]^hdf}}dnvgcgmuz}l{xonptyyymuw~rfZY]hx~}wtzvqrxzuunwoacpojzuw{txpighnr}|wdgjmtmq|zxqlcbdit~h_gh_mriyqeeipvz~tpsnopssxrry|{o`ZY^k|x||usvysz{osufalpemtuvzzojhhipmiopwpm{yzvoeaabjwqejj]bum}yjghmsw{xowpooolmxr{~}wg^ZY`o{vvxsu}rqxmckrfftuyuw}unjgdd{|mruyulvyyztiba_blz~ljob\ixvztkikptxoysppokfssx~{qc]YZcs|xyvp}}xnuugfqlajvzxwy}snjf`hxqx{}qp{wz{qeb`_dn{xjnn^_m{vsmknruy{n~|qoonheysz{~la\Y[fu~{{ur~}vmutfhribmw|}xx{zqmje`lwtz~qs~}uz{oda__eo{uink]ao}xtnmptwzzn}{poonhf{sz|}k`\Z]hw||vs~|vlstggpibmx~{zy{zokjgcm{szus~sw{qd```eo{{vgjl_bq~yxqoqtxz}nw~qmnnkgwsv}~~l_\[_iw~zt|ynnujdmmckxw|z{|}njjkilrv~{r{vqzvg``bfozwxxhckeapxuqqux{~rn~ulmopmqzq{}z}ra[]bkxxz}{rjqodhohixx}{{z{ohimoovr|uyyouxk``cgpywrvkaiidpwxssuy{~vlyxmlprpq~~px|t{sb[^cmyzy~{simpefojiw{z}|ywpginqqyr|xyzmsyl``dipyuosjahjeqyzutvz|~ulwxllprpr~~qyxrzr`[_enzy{}zrhnpehohkyz}}|vvngjoqqyux|wktyj``diqzqnrhcjgfu}zvvx{}qn{ulmpqmu~zr}rt{m]\`fp|~x{xnhpmfllfo{y||~t{yjhknmsw|yon{td_adjs|ymqqegibiyzwwz|~ynt~pknokk~~twxp{wc[\`gr~z}}{simrjkmeht}~~|~vxphikhi~|{tkz{h__aelu|pptkijacp|zy{}}qstlmmhev~zw~}p{}i][]aiu|||wlktnlnednv~||ywwkiifbr~{lupb__afnyumtrjkc^hs~||~urz}pmmjcj~}~v~ssua[[]blx{}{riptnojbhqx|~~wzqjigae{sl}}i`_`bhp}~|onuokj_`lu}~~st~ynmlgbp~|~wnvp_[[^dn{~}zqirtoogbjry~}~{vz~oihf`h~pm{g`_`cir~ymmtolh^bmv~}tt~ynmlfcr~|~w}lto^Z[_eo}~}zqhptoohbjsy}~ztwohhgbh~rk|~j`_`djr~~ymiqokh_amxtsz|ollhdp|~wlm}s`Z[_fp|~~{tiktqokcisz}}|srzshhifg{yirrb_adjq{~~~zpejpkjd`kxxrt~tmmlhk~}|wresyg[[`gp{|xmfospnffqz~|~sor|xkhjjivlk|yf`aejqz|}zredmljgajxzsrzxnmnjk{}~v~tdmyk]\ahq{|xoflsqohfqz~|}snoyymhjlkvniz{i`aekrz||xqdblmkgbkyzsryynmnjl}}~w~rbmyj]\air}|xnemtroggr{~|}}qmoyxlhjkky}kj|yg`bfls|~|zwnbcmnkebm{wss|wnmmio}}y}kbrwe[\bjt|vjgqusldju|}|~vomr{tihihlvhtqc`cgnu}|}xti`hpnh`dr}~vtv~rmlihw|}ztciyo^Z]dlv~zqgmwvpeeow~}}zqopyymggeev|koxg``dipz|}~yvmaeppj__ku~xwvvnlgdq~z|~xggxsaYZ_fo|}ujlwyrfcksy~}}sqov{qheb`l~qm}mb_bfkt{}{xrebmsnb\dow|yw{}rmhciy}yy}}~ndqyj\X[ahr{pir|ymbfouz~wsqqzxlfc^bt~{mtyh``cgnx~z}~yvmbeqsj]]hqy{zxzpkfcn{zwyzietvfZX\bjuznjv}xjbhpv{~urprzvkeb]ew~}ymvwf``dhoz|{|}xukafssh\^irz{zxzpkecp|zwyxhetueZY\ckvzoju~xjbhqv|{qje_btystvy{rz{pxuqry{kvlttnnmg_ds{tjjsz~|tyxu{xvttnpyrsvxwqfaoyoecgkqxw~{slt{ty~hswmmrqighgqwrmkhjw~}~uttt|uvzsnywvmhge][gsqhcktz{y}}~~}qgt~yvsof]bopfabgls{~x||}uv}|{trq{|zwnggfirrliggo{}ywwwzxx}w{x{}tuxuw}snke_dprjdhpvz~}yx|~~|}|uomnoz}xoedorjddhmry~|uv~~xv|y~}unmsxyqnllsuplkjpz}zwuvyz{~w}{wx{~ulnuwzzuqjdgqtnhkrw{~~|xw|~}z{~wplkor}zrihpslggkoty~{tv}~yw|z~zrlmtxyrpmmtupmllsz{xvuuxz|}y~{xy{}~{qkntw{{vrlgksunjmsx{}}zww|~|z|{toklosyqjkrrlijmquz|xtw}~}xzz{~|vokntwytqnputomlovzywvuvyz~|{zyz|}~~wolpst||wrljpurlkpuxz|{xvy||~}zz~}wrmkmotxplptpkjlosw{yuvz}|}|z|z}}ysmmpqvxurptuqnmnsxywvvvxxy~{{yy{|}}yrnoqpr~}xqmpvtnlosvxzzywx{yy}{z}~yuqnmmmv}uprusnlloruyyvvy|{x~~{~}z|~~~}zupnonny{vsuwtpmmqvwvvvvxxvy}~~zzz{|}{uqpqoms~xrqvwrmortwxyywwzyvy{z{~}zvsonmkny|vsuvrnmnqswxwuw{{wx}||{}~~}{xsonnko{|wuxwspnptwvvvvwxwv{~|zzz{|{wrpppmlu~xsuxvqoqsuwxxwvwywu{}{z|}|xtqnmlkoz}xvwvroopruwxvvxzyvx}~{{|}|{yupmnmkp}}xwxwtqpquvvvvvvwvv{|zzzz{yuqoonlmvzvwywrqrtvwxxwvwyvv|}{z{|zvspmlkkp{~ywxwsqpqsuwwvuwyyvy~~{{||{yvsnllllr~zxyxurqsvwwvvuuvvw|}zzzzyxtommmmnw{wwzxtrsuvwxwvuvxww|}zyzzxuqnkjklq|{xyxvsrstvwwvuuwxwy~|{{{zxuqmjjlns{xyywtssuwwvuttuwx|}zyyxwvsnkjkmqx~yxyzwttuwwxwvttvxy}~{yyywtplihjns}}yxyxussuvwxvttuwy{~~}zzyxvsplihlpv}zyzyvutuwwvutstvy}~~{yxwvurmihjnrz{yy{yvuvwxxwvtsux{~~~{ywwvsokhgjnu~{yzywuuuvwwvtstvy|~~}zyxwurokhhkqx{z{zxvuvwwvusssvz~~~~{ywvusplhgint{}zz{zwvvwwwwutstx{~~{xwvtqnjhgjov}{{zxvvvwwwvtstvy}~}|yxwuspmjghlry|{{zxvvvwwvtsrsvz~~~}{ywutqnjhgjnu}~{{|zxwwxxwvussux{~~}zwvuspliggjpw}|{{ywvvwwvusstvy}~~~{xwvtrolighmry~||{ywwwxwutsstwz~~~|yxvtspmiggjou}}}|zxwxxwwvtssux{~~~{xvutqnkhghkqx}}{yxwwwwvtsstwy}~|zxwuspmjhgimrz~~}{xwwxwvutssuwz~~}zxwusqnkighkou~|zyxxxwvutstvw{~|zxvuspmjhgilpx}{yxxxwwutttuvx}}zywvtrolighjmr|}{yyyxwvutstuwz~|zxvuspmjhhikov|zyyyxwvuttuuw{}{xwvtqnliggilqz~{zyyxxvutttuvy~~|zxwusqnkhghjms}}{zzyxwvutttuvz}{ywutrolihhikow}{zzyxwvttttuw|}zxwuspmkiggilr{~|{zyyxvutttuvy~{yxvtromjhghjnu~~|zzyxwvutstuw{~}zxwusqnkiggikpx}|{zyxwvttttux}~|ywvtroljhggims|}{zyywvutttuvz}{ywusqnligghkov}{zzxwvtsstuw|~|zxvtrpmjhggilqy~|{zyxwutsstvx}~{ywusqnkigfgjnt}~|{zyxvutstuwz~}zxvtrpmkhgfhkpw}{{zxwutsstvx|~}{ywusqnligfgimsz}|{yxwutsstvy~~}{yvtrpmkhgfgjou~~|{zywvtsssux{~}|zxusqoljhffhlqx~|{zxwutsstvy}~|{ywtrpnkigfgint{}|{yxwutssuwz}|zxvsqoljhffgkpw}{zyxvtsssux|~}{zwuspnligffhmry~|{zywutsstvz~}|zxvtqomjhffgjou}~|{zxwutssuw{}{zxusqnligffgkqx~|zyxvtsstvy}~|{yvtromkigffimsz}{zxwutsstwz~}{zxusqnljhffgjov}}{zxvutssux{~|{ywtrpmkigffhlry~|zywvtsstvy}~|zxvsqoljhfffint{}|zxwutssuwz}{ywurpnkigffgkpw~}{zxvusstux|~|{yvtqomjhfffimry~|{ywvtsstvy}}{zwuspnligffgjou|}|zxwutssuw{}{yvtqomjhgffhlqw}{zxvutstvx|~|zxusqnlihffgimsz~|{ywutssuvy~}{yvtromkigffhkou}~|zxvutstux{~|zxusqoljhfffilqx}{yxvttstvx|}{ywtrpmkigffgjnt{~}{ywutttuwz~}{xvtqomjhgffhkpv~~|zxvutttvx{~|zwurpnkigffgimry}{zxvutttvy}}{yvtromjhgffgjou|~}zyvwur|yturibc[WWPRRPRZW`ipwxyzxyyoqpoqvt{||zrhhkjstsrtmokhd\kpeszqknvy|qihefknn{}u{ql\X]hlodcfgjqsv|oXUrxf_^blnvzvrc]essnchjmrzxphr|umtsrrtlnqx}q{xuiVMdvmplms{{}uk{wpqxsqtxt{y~~sfx}tx}iea]^wljjgkal}oqumieff\V^`ZPd\V_hjccnv{w{rwwne|rtw|w`VZaaaxzv{}~lks~zuy~{~{{}w{vxxiNQThnytxwi^ZPW_TCILZVXaTgkplbgy~xz~yzdhblhlwqxv|umuv`NXShhy}~xmz|ieqo|{}|uw~qltkOS[[pyt~~{fdaNM`VFPVT\]c[edekdcz}t}w|gmk_giwtwqxfmxdRb^cmzjuhhwut~~{y{|reqkP\g`l|zy|xdkfQIdVLYcY]ec_`^]dbb|{}tyzito\djxwxzoudlzbYlegohx}fn}zs}z{{}wmesfOcgcl|xpdmdKQkTR`g[dhc^^_Zc\h{|rwtizg^dpyzyotibsxYbjekv{~xlqhuvzv~|xxxhjuVWicfr{fhjZIgdRYfa`lf`Zc[]_[r{w|~kuu^cf{u~yyf}m`hd[jegpzl}hs}v~}|v}vxnjx^Thddj}mfl`KfoXYdc`phbXf_Y_Wiu}znszaedyvvewpbd~oZgbem}yx~s|lqwu}u|y}{tktmQeheewxhklTXudZ_h]oofZ^hW`X]mvz~{lmdfn|vx}phwe`p__b^fw}tuyox}t{qsx{pkx_Xjggl}ukojRfubZbc_xmgYjh\cXbpzz~uqijfszx~~vjlsd_u|[b`_h}|uzvp||q}||vos~wvomx\]ljkq|vlojSitcZbba{oiZok`f[cp}y}vrilgszx|t}~jjpc]r|]a__i~vyxrz|qz|~xj}~qxuztnjwc\nnot}ypoqWewi\`e]{tm^mrbj_cm|t|~onlll}t|xv~pfoe]fe_a_e|zvru}{tz|x~hu~v{~wyyrtliqq[krsw~~xnufXsscZg]l~rjc|lmkbizy~|sx|irhwx{yqy~ueij`[vv_cbds~y~vt~~|r~y|~v{li{~|r}xqyonjilwbhtvyzzqqnXlviZcbduqbzunqehtwzxu~jslr{vz}rs|uggjcZp|bcceo{{xu{zt|z}xyofx~|p}~wovokiilxeiuxz||tsq[mwm]edgxtd}wqsghuxzxv|jtls{wx|qr|rhhhc[szdcdes}wxv}|s}w{uwhfw}yqw}{tmunghgpwdmuy|~svm^rwm]kapyqhsurii}y|s{vkvlwxzv}|ntzliiia_{rdcfe}|uyw|}v}~wsqbmy|q{s}yxonuiehixmgqwxt{djxygeld~zhv~rwmhnt~|u|lsso{wyx~um{rklii\pzibcdn{u|y{t{t}tsegv}ttq}zxskvnchfupfmsu}y~mjx~pgqf~nrsxqjiu~~v|opwoyz{|v{zlyvkphl_jzmbadf~x|~|}xwx{u~xrhcn{vqsv|wvulowbeeovflnus}zjt~|hrlsyjxvvoew~~z~~xzvlvuq}xww~tm}lqlkh`uuj_eau{}t{|~wy~s}tndfu{rvm{wwsthvp`gevohlqsz|toxylvktpwzvnfz}w{rnxssxvv|nq{jsildcwti_fa}{{v{~}|wx{u}sjbewxpv|lzuuqrexnagfwmjlss}rqyzovmtryzvng{}wzqoxtrxvt{mo{jthkdcvul`hc~~|wz||wx}t|ujbctyqsju}tunrdst`heuqkmsv{}vqxqxozq||ysg~~{}xzrotwo{wrzyqi}krkgh`rwsdhfw~v{{}xx|t~|}ymb`jyqrvmlw~vsooke{eefnxlpp{w~|pt|wvuuty~|ymozxwppxquxztr~xwfsvjsdjaixyofmjyz~z|zxxxwz}~}rc_burpr~tgpyypqjpavqciiyqrq{{~rsyvyt{v~zrk}}~xwpovtpy}uo{xvilzitfidfwzuhoj{xy{{yw{ux}||}|sd^`rsoqywfmvzpripartcjhyssrz|~ttyx{v}v{sl|xvpoutpy{smyutfnyiueibhw|vjpmzz~zzzxwww~w|y|z}qa^`toppzqekvwpphp_vrfjkystq}{|su||z{|x~|pp~yrpnxpuxxpoyrsbvsnsdianx~pmntx~|~x{w{tzzy}w|wzi_]ivltn~gfmyqsinid}ijhsvsst~|xvxzz{}zl|{zvooryl~}ukvttii|kvhgcfs|ylpl{|{xzxxvw}~u{v{w}~p_^`vlrnyldgwsqmho_yohhnvrsp{xzxx~x~}nx~|xopo|l}wkstsme}nungedpy|mpk}vxzxnxy}xrquq|vuyv|z||}~v\TRrq}uhhv}uvhr_jq`^[eab]giuwvqu}oe||{y{{sts|xqzqtansiqceamx{phd}qtsxsu{}v~zy{~~ufROnz|rpggURWjfibafWpib_gklljtt}~}v|nuy{vmpnu|wpbUctdi{}zyzpx~lgkltoux}{qzt}|uw|~zr|v{t|t]RQb{x~iaeunshkkaypkirtwtv}{qky|egoytqhhfb}ooptujg]a`qeqv~}vjnroqdzvtvieahmugdcs|}}qtoiUJM_~{j\Wd]^UQWH_^VS[^a`_gh{zvvuqy|wxyzwzx|wmdfemc]_k|s}vwokyoafelkmqt}ztnqstzqst~{yozvrqlmrofUX]|{wicpurshthpvrt||{tpkwvvrz|lqywuhodlnspvpkc]`crby~yzshpnplf|rvshaafntjln}~pndiecSSZu|fYZe]aTXXOeb\Zcchegkoz{opkxv{~x|{w~}nb]^clehluv{vvnm{icffnlqpwtz~ktqxvpru|vvlxy}klelloa[_p{pfgvrwootj~yv~~mkdmvyy|qrw{znnnevtrusmh]aasfpx{timnnnexvtvkbbelvpqr}|}kg_cbeWW^wk]^hbfZ]]Ugh`_fekhijq{z}lnjxx~xz~|x~}xh]^]hkhjrv~xymuyehelnqrr{nrmssyprpyuvmtsrmghkmj\^d}zmeruvvmwptx}~rkegsy|yz{zoxh{wvtunl_a`plh||~}vkknmpfsztwqccdjvqpny}mgacbdUUYsvgjqks{~{tol``]frllyu~kwzyy~~~{xs{z~vnb`ccicl{y|}qpsv{rxzxu{xspluw~tvv|yvux|u~ujdlylvuov{qggoghfs}yuqwv}|y~~}~vtq~slojle_afvjs|zwpglkqpm}~}rvu{yytz|}v{~wqvx}vwt|z~xz||vcb\Z]bytlcab^^\hpkh}tp{zuwxyxzu|~wpnv{z|romxtxuyy{~wijmvywxtvnnqur]pc[_egbcbkgmdk{s}zupss{vjfh{vu}tqzwj]R\_hlmy|{yxogbkpt||{uc^Zdg]mvlltnj_]`agcgvxr{ploqx}r~}ohmt~xvy}~|~{{jZJQT_hn|{xvnidmqme{rkwvzpsrz|~|}usvrsv{pjhqz|~wroxx|w{{{o_bfuz}zzwpuuzbkn\^biceahhjhcxvw}yqrrvznjft{ry{npvkaRU]epry~yvvwpb_`ot{rd`^kgbtxkptni^a`egek{xu}opouy}}o{xwgglx}y}wz~}}{oul^OHS\lu}{}xtmlsvnjqpvxypsr{zz~{vrynnqtiggu|usq~z{z{~qxspa[am~}~{~vvx{wbqj^_gheecjgmdj{uy}wqsqyvlhjyws{viqoeZQ\crx|}qklma^^mwzjeakmeo~qmunlaa`difjy}s~tqqsz}luttgeju~ywx~z}|wgmf[NIU^px|yqqwyrlrpvxwqtqzzx~{wqxljqqhghv|wtu|z|z{kqmi[^btz~|ohtf^cjfhdhhjkct{vz}trptyplhtzuu}njqh`SW^jty}}whhmd_]eqzunhotmmzmvqoddimx{|xzqhqY\^`VSWarz}}zyuw~w{q^f_WKJS^ox}xlnoqge{pv~zj^aw\Zwv|yuqz{|teepmjinzztov~~}uozwhbccZSV]mv|vfVSjp_egbnqkmkwuoinx{vz~krsmd]cgw||ypu{|~|k_gha`^ip}xfYMVb|x}wah_[U\flkempwgnk[`ccY\]js}}~rrvpss}t{sm`ber}sh`]SV[j}uog\UZcqmooutedaSQ]YYVZbispw{w~}{}yvqqv|{prtngik{z|nXYWTZ]jtrlafgb][fjkfsc_f`\QUWelrs}zvrrtovw~|kirllgmt}jh_\WZak~tkahkoghjnnak`WZ_ZVX[ipzu~|xyhmoouvu{upeijy~wj^Z[W_dpxtg_bjvqsqvtgcbTP\YZWZbjtrv{w}|zywursx{~oospimm{vtpZUYV_dow}rhflfc]fjngnn]da_VVX`mrvyt|pmrqu{{~~}uelolnlv|rubc^aako}~ujeknphllrkcl]X[`YZ[bow~x|{u{sdmnt{}yvxtpinrqrtbZ[_bns|wugceowtvtzsgccSS]Y\Z`fqxu|{yv~wuwtwv{}~qZRSIGIP`ivt~~psqooihcjfgspiyrt}xqedblqtqzswwzuzv|rzfpyxg`iceaglx|{|xyuupnpidhvpyw}thejcbbfr{{lcuyqzqoisttoqwzxp{lfgea\adu}|xkiggsx{ttzopt{uwggpnrpv|{|lvzsmgj~nmrqhgoswqutzrkqg^`e_baju|rq~~xyztv}{y{{||yshowxqoqw~zwebZQOScejkormdgg[ehonov||ujninswny~yu{|zr^df_iusxrunaVZtjQMWf~ww|t{{|xz~zz{xsttxs~~{ypo|~x{|zwomjpjks{wyp_PMasrdT`l`clnfmryxy||wuwpfjhedbmwyspow~oidb`irf[TQ^jwwuaXaXWZhqtwtwqh[`UR^eqt|~}}}}}wxxxztmt}|vqtmXWS]dr{zwwm`Y[XYU]bpru|wtumlhmwz|zyvzx}}xjfgu{{|xuux~w{j^\\blr|nni\`frvz~~zttrehiikhqxxw}stt|}~ys|{tqrlmjt|wtwgYZXcgr|x|tqu~|ykjm_delknov}ufb]^`cq{{vxxkoprts|yfm`PNP]gwpmmmnkrs~ww~vompkmjs}vgbhaV_ewwxwnmp~xszmoqxzz|~~oxzpfinurqqxxx{y{uuzmmqquqy~|pzuquvtxy~}r~vus{|~~{~sossxv}y|yywzz|zfefo{yvsq|~pxqjlnsopnwvrowzfoy{ty~|{lcefnmtz~}{|wytw{v{y}{{vhre_`kxwxvxwx|}z|}shda[XR\bijs~|}thfocZ_borz~qzxut}||~rrryxz|rzzpfmsyyw}yzwuulcabSUW^dhuxszxu}{}~}uj[hd[\cou||yyy{}|rlvpelr|}yoijqptopmndeqjmowvusw|wvwwq}yqslmjqrwuirwnchktvx{uwxwfqmffp~~zxqceejou}~ojidc]fkpmr}vkq~vvuwvuzx{tjfskbeivxqyzy{|pwymchlvw}}~wlol^_]b_agpuptxxckvttw~|}xhame`^ipwy}}paahWTUbmv}y{wo`gb\Y^babdonpqqxwxrqosvwzmlusccgpwz|qfQY^XWbsvsnonoqrzrorrc_`__[fkrpu|nsxxvxuvywzulhxrikr~~ytqrvw~uqzpjns{||xtvwyzvywpgpi_^`eafkvttv{sansts{}nqyrijty~~w~z{lusb^`mqz{vz~{{lelf^\dcdainnotyr{{|}yzzjkmut{zusyuuyn^ge[T]emr{{ytwvzx|vrvsb`^`\^hnttvrp~rifovzvyzskqvxz~|}|{~qgkr`WY_gjw|~}{}{uhpncadliotnu|~ojutheot{{|z~~}~||xq`al^WVciqz~}{lrtnfmppnpyx{z}{zzy~|u|ohhnqr{~~~{w|yu`ZdcWUagqs~}}}lkilfjqxzys~~|mlynd`jnrw}|vz}}{|zwtvwvzpehrbYZailxtz{nhjplps~}}~opx}|~|j^gkaYbgpqz{wuxtt|}~y{ywvpdXge[Xamtwqwvkhoopluwyy~xy}zupootryukhvufgkvx~vryyy|rx}}}}ytmZ\hh^dpy~ylkjkelpvuw}wjuvwuuttzx}{ykruoo{~y~zqxy{w{|}|ttqvvy{qiq{jfisy~s|xlehkgjnvsttyudhqxyojuxljsy~~~wusvpuzx{z{xsccrleesznorl`efgehoptvz{{y~~zqvqiiquwzxquyw{xx~~xt`\hncdpx~{u~ugefjfnt|}v~||~{wfjwpgfru}~|y}|sz|{}utqvtxxofoyiegsw~|t{rlsttw}|nox||~~|ubcopchowz}}{x{yw~y~}wzxvvsj[ing_gqwy~rpttsqxwzyxv{{tsruxyzpl|uheiqr{~xx}z~xqu}|~}{usaW^i`[dktwsmlnhnrxwz~ouy~{{yy}z|zvehtodcmqy}~}u{{}yy}vqonrouqh]jm^Z]hkw~~{{ojpmpqzzz{|sjkwy}~||n`dqkahmuw}vtxrwzvuy}{xuruprom\Xfh_[gnyyu|xknoqmquuxyrx{zxrsryw~ymq~qhenpw~~|rwwxy~~|ohpvw{w|z{vuo^Zfobdjsx|pjmkiosxv|}zosy~{|y~~~xgoxsfipt{z|wrtvuryx{zzqyyztrqtww~zqftvhadlnzz}pkpnprzzz{{vljw|vhftsgjmuv}{qmplnsx{{|ux~z{{zxl^hoh]djryvypnoqopvvzz|v~~yyw|}vm|ymehmpy||z~qotswz~so{~~xxj\[ji^bgps}|rmqmoty||}tv~|tfnwqdinsz}}x{yuxzzyv{{|trprssyul`mqe^ahlw}~wpvtvw~|qkv|vgbotghjqsz}~|uwuty|sqv|xxsvustrm\^jk_`hnx{sttvrxy{|uwz}zuuvzyyknzrgcjkrx}tvwwy|~}}thitv{wzzyuspbW\lfafmty}sprmruz{}yqs||{yy|y{zzkbltlckow}zvttvsuyy{{vnrttmljnmquqf`pphbhnuurtsvx~|~}}~wlgsx~|~~z{ocbssjmqy|tormpsxyz~}wlksusqospqqrg[domdkqz|}xsstrrwwzzyoswyssrwx{vm{~ulptx|sr}vv}{{ytlcoqd_cdWW\c\bbgii{ii|xx}}rxsccjiiqx}zp~n}z}oopvuicvg_xjemvvtvcimld`flx~xizfamx~y||}}{ffku{lq}wrgw~xsqqksxzqlk|ovsviUct_`jpymqmtmzoo{yzppk}vvuqwmtpkxo}}qylu{{}r}xzw~zjZ\p~wti]`]VNa\XohZceerqszxr~ydosft}}}~q{scupp{yu{zm|}|u}zy{ehytvun|w[`]R][\^bYhn`kpdkykknniy|n~~px|stoistpx{tookp|y{utg_bacyz~~qkiVZaWVf_fwonll^kiW`nag}yyvtwqwno|r|squtijwp}|vludcj`]ox|ekcWdi`ac_fn`\pc\omfcb]ejrw|uknsh`tru~kmemtqddnjnsz~tpch]LZZOYicifdbijmvdcvwz}uxyimriuonooxxfftvzs{xu}sdgfZmvt{nqeS`^^\\^bmkyq]^oihdbruuiywy}nmeh{y{y}qs|pv|lv}}~~~z}tfteX`gqznha`agocSgqmpimrvg]c`hpkgqe}jqslqyk|rtpnl|ln}u|xomclbRfrmsugoqjg\`lnbZigoujg_Wnsrtr}s}~lzxnlppw}fkuiWint|y}seqqZ[d_chvxuyvr]Wa^krmhh\smhgkn^qupxppmnlq`fwlbloopsqq~{~~~}xpyssomdchhqjg{xoqtdbbTlkmiswirulsyaso`dkprouzfhkhkjoiwv~ydi|x|xzzzv_Tbrsvss{ohlp\goftxmzrdfeafk[dytfrvxsxskru|obi~~rtyx}kx~thvvwmdlkq``lxt}unid_gmgihlxj[fce`o{q|zzwtxpkahfsjmznxor}z|ot`kqjYdljp{wwr\gjjdchsbjlqx^djoibhpfok{vv}y]pktkepq~xow}~~}vvvuusopnqg[rxr|svro\_ttshmnmfg^ig^gjhvy}k}~vmkqskqlpciu{~|zw|~}u{tlptlgWtrxrknqgcrr~sioljnXdo`ghgt{{ls~yyjtugjvh}shypvy{yz}{ssvyunq`oldi^ryu{{nctpwqestpydizhgfhjcr}tzxrnrgitarogznmqy{x|xx{yqhrdmicm^kuwui|usnetvozlopcidfnqrxvv}uljmjntbzvipirliuw}z}|xulo]lskm\ahiw~}r~yyupyupzhnv`^\eopr}ovzoinmmrfxoeojorz}yw}~{y~~|rvilrkq_aaYdkfv}ot}nvqu{hkjiciioo{so}uyxidkZmzilesvruyz}s}}z~jfzouh^hhjqgx~yyouxjsokmfejlggutxxl{ntzlmimwksotsvqmnwtt|{yy|xwalnpe^le]f^ltrx{ws~pjhehfljqn~u|~|lwvihfc~mcej{tu~|ul~}{ydq~vzmekb^_aohv~xwkvjrpkbpvmkzusfh~{}rqjrmdnlqozyxs{sl{xv~z}knnqhdnb^aVj{iipy~|lvr~rwyuunympkxmo{}|tzoqg_zobbkto|l`yz~u{}in{mkjajh_bdndmq}}vxrs{rjnznkvvxshyyqoorlenlsmtsutyxo{v~}}~{phqrgboh]c\[pb\^q{wv~u{vw~yvspscov}qyxxvjxw`^\krjwfs}{}~wx{|vixtooeamZ\_niirs{~wwjppns}xbq}w}~t~srvximhskntrwv~llt}pv}}}~y{~kvxs\[^adfNspUgcqy{uyxjcfkmzwtmxtylnysWWvxwxxlqrvw}}sy|wz~kx}{eyzd]k__Ue]^ojhjv~srgqyz}xdvzsp{kk}{grfl`gkh~vkt|gz~y{|s}{wywpsu``kVYcTPr]]_kyvy}yxz~wvfwvlv}zupqylm_gwgdysiy}xmz|u}w|uu}zx`d`[T]_mf_ntfttytyn}~qtut|o|fmtfcrluwruyo|m~tt}x{v|}~u}}ptuhlpa\hXfzb]gghmqw||||v}ckxhdvitv{{rxjo|wgvyyyloer}szoxtwv|vgkp]f^bhbZ_lWi{yqxy}zt{nkkzz}t{jxikuxmiwjnzzfpeis~||~x~rrtlXSXT\jcVkcalvqw}~}xwto~oy|}ov|pekjg}sfwsrzwny|uz{m{|~p|~}~{wwvm\ur]^_\hibdlldh\fym{jpz|pu{mymkdrsgj{~rmhz{utw~xpwv}s~lpfmk`[iueiXXnvjywjes}qktafttk|yotwxifytllwlxpvxxisqjup[\tifpf]`tcmkglnk|ozomkjz|rfw~uml{swzqprhrykts|z{}yzwrv~ym|yqa_ki[hhei_^g]_aj}uyr~}ls~zykkslurhpwttkyxssv|}qz|}xqu~ygoageYXd^e`brhmepypp~{ut|z|yxy}sdknnqiwxtpytklrywyqtyzlzwy{nkpelY^b]e]hnhaiiwll~orw|zwy{ykunuroxumuy{~jyytktxmvx}vyr|~tz~wyvwkoach^Wejobbpf^]i\gwqtqvt}yilrptdtvoktsdrrknm~~qkRVZeq`ouvmqkc}yssyw~sqxmy}odicd`MZa^]\i[Zuu`juo~{t~opd^lrhozwzrZa_VS`jZgs^e^Wrrlt{nylmo_b`Tfpqsrozscz|}xziusx~x~yx||}x_cn`WkgjzkcsbT^h[Sqxden\jw|~w|vvxx~{{ogwtjs}~ozj^eT?QI=IXR@R_LBLDJ`ddt|qwrbfv{|t~zybpugm~x}}tluykdniocn{yyyunowzru}y~zdetclx|tuka`]ODXeULYRWfi`ttfibJZpegz|ssjfqeizqpt|msprek{zrytown\qognqo[Tf\EQ_`zz{~zcafWWfeapn~wsxperiaXWV?>[R>ORI\bS\qbkyfgo~ru}{xoxx~~stsqpx~sz~}xdwxURaWntz{w~|lyw~xviejomvppsurfjs]TqhIOQE_kcinhmRGhlaorfikvoyzx{vkgjikhny|uovvhmsnuqftsj^ldMaw]TaRYrqs~ywplg_UY[[^m|{gspaVjaNcqSFH8CWTWjupzq]i|wu~wzwy}zx{{~{r~{w}w}vkqymdxnV[\Ysyxyzvx}}}zzsxx{~~qgoeactuqnyaVjo][[Tac]\enmph[csrimed^uzo~xosm\cmfnlxvvvk{vzurrSake_km[_qiWURWloxw~owrbcdRTe_ekpqixmedoc\gjTEB@PZ__cuqprho}zlex{q}s}v}w{{zx}|q|xoothgx{habbqv{z~{||r{|~t~}yw}~hah_drr|vqfmmgnt_]Y]hfa\stnsdXlyjqxjhmxdpnhuwhmvkrpfvoqqxzvumk]Zlgj^d^T^si^ffo|{uyzooiYdZ^haWbdbso|sy{tk[cXTgqZTWScicYdunxyjw{nlk|}{xywzrwu~~p}yzkgoce|ybdeh~||}}||}yl}|ouzs|tukinkciqs{ywfvodthahas~pdcndhiZcz~w~pkhlujpkqvqjmnktit|qzrr{rhpwnuglom^R]OQnuejkf|~xy~{qh[hZ\]^b_WXcj|w~wo^i^Ymub]\Shneeizx{tek}}~wwzvx~{x|ysxvzwnddRYrriomsy|u}}}|x~|lxxv{xyus~imjhmndiuu~suejzymnknul``nmojbiy{vyqvo{noeekfbqstzpzquup|xkmuptmarjgZ^ZTdof^`_v~xxsocsi^bWW]SPcjt{wsi`hof]_at|soey{vwlhz{t{v~|rx|u}xsx|yzm\\Vasxlhgox~~zywyy~{y{yywzvw}xr}uylij^Ubiqwzu|pkgn|urfxwyj\hyt{~uyuolfamnfjpitrkytfahhmfpyooYZVUeqe\bcz|~{yz{nz}mncnb^[ZcaXX]\mqqwrjbp{ngjfwzqlnmkx{xv}}y~{uxx{y}x|zo}x{peldj{wcbajx}zonlw}yyx}stvr}~v|{wvuwtwqhed`\_io}{yxsqm~vpq}y{qfm|~mrhqzosrwysifehqi~}~}xf_jlmnesml_[b^l{q`\Ub{v{{xz}y~yraa^]rdba^`^VT^bqr}txqvzqie{trtu|mjvzv~y}wvowo}|u}{z{m~|ypef^ixwomkt~}yykoquyukz{zzyzurwuowzrmcuidignskgonw~}}yq|ynrh~ulu~~usposstpvvkiqlwtoypyv{~uortqq^clag^`bhuwl_]az~~~{{y}|~zsntmvwlj]^X`hX]Y]jjdknkzoyxxu{zqqx|}qp{qvyzp|zxvpp|qwkxijf]divsno{~~{}z}wqx}{mqxvprt~wqcw}wp||{mefbqhjhispjkru}~ztyvro{npyvljriooy|tqmjwhryq|}~{sjlpnjbsmliVYX`ryonsz{w}{{yv}|nz{wte`lvuwg``T_WTV]konmnmysvooqw}xyuquxz}~{{yzzx~wisjmi^fdm~~ux|~xwts||vww{}}mhij~y~nmdsy|wihs{~prlcn^Y[cnuvw|yu~|{ro{twepvmruzzvmnr{~vtsunrpioywvkgpei]Y\^p{vppo|soir~yvmguvukdfptqfZ`Sag[^^afd^dkv{vw{}|z}vor}y||~y|yxyuzyyxm~|xteb]huyxz}{y~|uw|yv}zyy}qxx~tpnt|ror{wxjxyri_^m{~}prdbiY\^eprkntzv}{sx{x{t~xvptumksuyqsruvolprqpcpypxg^Y\ellip|y}{ljlx}vu~xrwvn_SYjmrkeg[e^WWWbgcchixyw~y~zsv~xpsvyw{~uortrcfis~tqs~}yu}{xyv~v{okqvyt}sghiu}sstzqpbpttrfcntrqacc_pjigjokedis~{qwxuywvv}{tpmsxj|yvzogjjidj}u{r`]Yaoqkos}x~zvxy|omm}|y}qyvqdUU`iml\`\Wieceije^X[exv|}y~{vtxxtuqmii}z|mjemzzsuw}qjpsump~rxrmoqyld_mqiulqxtgSKN^r~oicWkkfjqy~|xz~~ust}uylzwvYmy~|y|qlio|~ulfgwns~{|qw|wzoz|rkqsuvp}pkhp{}wqout{}vv]JOl{QD3?VT^dhmkbbkt{}||}ogmz||{n}{~xttruor}uv|pbnnumbc`fie`fgpmgukotxysqtxxufmvjurmou}}te^apjflYae^XSWj}{jg`\pnqux~usx|w}vngmnhacjg`^[Y]KU[Xgouphcbbc[Yohjpb`bktysot{to|zyvuz{}poWWWNIBF]v~msfZTS[[XY\_kabrhsv~}xpdtx|{v|~~qmsnmgkwssyvlc\W`ZTjbdopnhb`figamvkuj_`blvsklmvla]KQUY[War}|kpmgyurqx~|opkg_`tvnnttqia]`VLaXZghhe^_ikkdjo`e\V\dvywuyqwlt|{sxulZFGGGCJ\rrw}mgffd`XUZddaxst~wywuzuxinxzsms}{wfjga]ex{xuoddhnhcn]\^^ca`honlahnbjeaaiuxrkdfrdbfV]b]SNQ^oyzxyxuoorzrjrohcep~yuj_abibcnabbb`YYbinnbmm^e_Z\huzxsr}}~jqrlggo}qoUJQLGBCOfuulcehcbhjridrhkt|~z{~ut|{skdh{~|njsojc^i}~xnjmnwodqb[adc`_`dhe^oxlwo`]]ckmgks{oieQVZXVPSdqvyszxt~|{z{uxof[R\t{uokpkYjf]hnmhd_ac`Xbrgrtgggksslox~qmpnmfgv}{}ojgVZXTI=AQbr|stspjui`blpqz}y}{}}skwmushq|~turvvifbemjcfn~}w||ynls{vu|m{nj]Ttu}|~{yvvpnx~z|~yuv|{o^WXZ^_Yglcwxnlnkgitx{xb[klkn`fhhidbjppom{wpskhir|~vyxy||usxpkms}~~xxurps}uou~||}t}||~rh`_grvzwunddjlonr{|~}~xv}uqs|}vtonpy~zvowshablvyplgdZUXYYWOZ_RZZTU^knlc\^gZ]i^gspf]W[cea_jb]oifjnxvwtokktzyvttlc_[VRGI^X]kebdjnokflz|rvo{{wros{{|kswmmnx{zxwwp~~wzrdlcXTVdr~zttssqh`qngwwuzts|v~~q|{|unshn}{zx|}{}|nsqg`cq~v||ui`WTTOJ\cWdaWVY_ff_bipfehY]bbb\^jrplad\Tdfgjuurtg^^juty|zunda\RJY`Vbc\^bmxzuvxznhmdlxyx||yumwtm|}tosxy~~{}~~yz}{qoWV_XV^kt~~tmookiv}qyvmlmv}xzllu}~{znupgyyqpu{{}vylkl]Y`kw~xpfdgd_Zb_QUSQT]lsoidch\\e\ajle^_bgidboebsmddgksy~itwjhikqw||oeddba`mk^a[UT_owzywy{ijockvxrpry|{ojtjejpz}~{yv|}}vukU_`WWY_hpy{tjuthruqqyzv}u{ty}vqpu}~z|xutlikt}z~~|kuvkfadikrzoklmnj`ihTZ[ST\eijeenuhjnZY^[ZZ^jutnil_Zhhghltww|wuug]W]hq}{tokeZcn^emdcglpqkhpxsrspuqmgen{~{kqrlijsvx}juskox~zvqxojtobUQQWo{xqfgue^dVLJMU_aenwujnfZ`cec^bihd^\cX_u~ohstxptz{{sts_bh`ZY\`r}yrganpdnmda_bhfdkw{z}njkljcfov{}{~jVOirtpox{~{}~usttvts~rgpgWNQXi~sqtrpwxptjfflzz~v|h[V[omlheda`fkihry|{~~uty}|qnpYW`WPVbqvtplmz|urxrokVKO\q~polmkedgc_^hohpxyy{}|~yomnrtmdkcQ^bZ\ckwz|~{zzw|}zyvqyj_jbWX_m|ztg^\YXZbwws|zrms{~tw}zuuuwyreccMM[WZdo~~yxuvtz~~yzqXYZPR\mywxyqjgb\ZVerkv{vx}}}{z}}{y~xqmmf\Zc[Tbb^`dq{yuyqpnYV^Z]dr~xlb_]^b`l{nnwpkow}yvnxzzxttvobZ[VJWacfkw}yqm|{tp^OUTTZkxog_^]X`sjhwtrw~{{~vp~}x~vjhkhdaddVX_][^m{{su|qfeZO[aabm{xnidbffbjylgpkiouzpvtow}{rpohb\[^PR^^]eu~|wx{mj[ISZZ_o~~zwpmle]alacqrvy|yvy|{vwwxvlfikkkeghUU^XU]kwyy}v{`VVJKUab[_db``dpkk~zwtqpnmtzz}|qw}ropnkdX\WFTcdisxy|z{x|qcZ_k|}}nlu{z|xyutzp~}u~{tqxwwwpiknsxvpyr^gmhlt{mq|ge]RZbfju}utsfmwnoxyrpopsrnt~pn}yrqoqvx~{|lmxu|y~r{jptjc``anm^`b]Ybntyyvwucem``ikhhimttoqwf^kjjlntwtt{{|xqsrv~upv||tg^^bmwc]]^UQ^qrcXdqisxxwifpc\ca]YWZdggmwpcijeeivvwyotj|wrce{xoie_Xel_YYVMKXm|{oq|njxyw|~u{qa``_aagprpqx~ypeq}sywtmg]TXfrzjbcccgjjiZXgaVZ^\]fpy}to|zn{|}w|smljlmvvi`i~qxvty~{wp`OOMHTex{qjinc`lme^]\[`gmupdnp\TWW[dmv}}|vttz~wsotobWPPNIO\kt|vkbYMGLSX]]ceTUbc`elmoqooo_ZjfZ_dhotv|}xx||xz~kknwz_ZZ\cn~xoeWSZTNPRNEDGKRX]ml`krjfiijmnotobkwjbcbdghox{}½sf_]afkv}pe`WQQTYYQVVGCHJHMT[ac_fk[]oposuuvtpqn^Yig^`djoqum`^J?nU@LVP_P`[K[XYcr|poX`^gtvrulcvcgeytyxOKVZtov|rh}qov_nlNHGEIʹtz[CO:DpRSS]v\au`d@Dlc|zimgYxskxyz~znuYjb@QbczuZx`ts__`;G\c{wx^ePLbQIWkma`v\WKNROor`x]^^{pk{n]P]M]fzkzvrv`mqm²z`UWD6G{hoNBtQBHNse_~snJ?n]fpav{rn]uupk|pp{s{bpsKJP;z]yru|xqtd^tSDc]gauspfOa[SGgg`]qnVYNU>[yht}]ecZya~b|[eZKTW|zwz~unnkkepĶxcqZG9PbkzLqoDDBilXx~ug:blWe^T~|]rrvl}|yvnoulg`MX7Ir{rxq~{urn|tl`ygMfebSFűy_macO_d\XatU^bdHPiVcy\{hf]uhva|eokLSK_\|zwoninik}liVELL@hģg}QMGopZ{|lBem]bYLpprduq|l}wyykrzlh}bX_?PuU_is{}um}xjki]zmjJ6p{ĥuvyaq_[U_jScnpJX\CVgUiebhZj}jMPTTElxxvd{ogc|uzieN\>4Pox|_VamlXMtc`fTUmO^mux}yjswrm}awm\g\Hs]fkgSayupo~rwwxps^\Bl]:?]Veût}kjfdnx}i\eGDQ>>X\nơvwgfvqQif_\\O`lb}x}gpccWf^k~hyyc8Zcljy~o|\zX^|ny{bkkVY^7JEC\`ʰwqytqeXfXL]TLglmytx^kY[swz\ssU[bSZ_`rq{aisdl~yawZO=/R*(Htz}slerd`odYpZMjNgUlp~m`~noqjVUWCN\Ys¢p|gurlx|xrt_c~QIXaI_]K5m̸|{upmeuQU6XX9Gt~rjs~|npuagkY^bNXkSq~|r}{lurjtuh`wroC]ZQ?@`]uycgNnsNNkg[wrYQmovhq{mu}in|Zb^AD2f]Wwzu}sp}{`~}jaqVQO=8KP`ȯk^`|udOqfeNfupw|s~p{hypXUIqT;KhShn{zrkfYrw|z{|vzxbX[JEM?F[Sfmg}exr_h]MVccz|qucY^_Oh~cwi@Vgdbg~pl]|`a{vtyknrahhLRWGY̵ѽx{rbgaVb]Yoljwo`{ecqmSxxsZ_jT]_U`zxoj|bv~fm~on^nM;,BU32\njưytt~rw~efpWeiRTYizmmzd{vjvfSUTGTX[yygyxv}vz~f[SubBMiOQe\:Dqyǻ||ocQD\pNLt}on}z~jckbdmahkRV_Mfnagxxnqqgvx}vkqlj~|\@acYCI[Naon}ufirXlfnrP_~wtxvn{vuvixe`lL;2SbHUv~zrmufckw}}mdn_UiPJFJB6M^mгvse~URXueV||pbw~hvob\eb_RocX^ajT~tlravptvx}Ycf@AH(Kd7FDcnб{q}whkm`G_wgvozZjhkfl_iwbh9Wvcyse|y~yjteve^}sxq~adq^eRLD3LMERzodhWxpVu{nUxqk]nm_Rln[aRaCTo\t˚|pfvumwrvqd}WHV47i<36BfOkȨvu~m\Sn_fovspY~`kevivzSCybajSX|t~fhvwNyXihj~s`{pdhUU;EHB8Nfintjkdo~Un|r~~ofyjc^xeadg[:[RJlnnyslqmosi|my}Z\Z1Uc28-JW?hzqſ°ñ~pe`oXdkwspnpc`hpzUVz^^]JXn`uwhn}vSyNUWstgoeea^COHF4HNN\nʧ~s}n~Wou|~k{wm|ikbyldlsa<[L?]ZV{}rmjmi`xx{|q|bee8Yj47/GW@[ootVų~zl|a]jxlbv}b^bxthU|ibaMOkT`gyou{~[|ROImw}~g{vajakPVRQ>:M=IRxuš|xm^|~moymskhrxbnorLT^BFS>ps~òwrskv[hnyt}qy`fODpM5.@]JGhgjSSҶchmoRpssodboTrjj]F``R`hwgyv|qfoeRJbzlxrp_ecnYW]TR;M>BAageŵ}}^rbxt{spr}^foqV_jOEI4Wz^fq˿x}szafirrm~zifSKtT<2CcOBch`KAxʺnsqlUlwjp{qzmjp]wvn_K`_S\alXnu|ltdxp]Rrzah|{xgigsZZ][RDU>EBXQSl͸~gscqpz~{~{^emmVnoRFE2\gMOeȿ~{^lftkux~z~}lkTf}Q?8V^GHhf^:Hrr~ǫz~|dayk`ffwynwxi}nYRlXY]dXR^fyrwmign`hpXp{k{zúxqnp`knbbcZdfgrupqpx{qqtr{vsnvlrx{zf_`s~~da\antw~x~ul^gtwgiwRa^bnluuwpqmfq}{}xwqchwsf[gridKSNDKLMcnkxǾZ-TȷqO58LRYbeyxoavv~lknejim{up|{ygN`x`eg_mtqvlztxG_`EHEMZWorc|~is\i{tvruvvήqSI'?ĪvneaG5KR?[_HXak{k]isbqnOuwiLRYelYJ``hv}v~oebamL~|t~vmaVfkM}jmpuk_oavz^bflird|txln§tz|PB8!>/o׼wUae^VDJONknEKNX{[lIe{oXCTbikeGS^t~{thtUeRP_Zy}zwP[G[f`toyclmvnptdlli~crnonĭhsmAIB"48vıxx\`m\KPXRJofBUWXrccJoleyUAZb_`nNOeuyhjXs]QX`ttw{wujL[HTgjr}|kjvu}jjgrqllprwlbfe;IN,3>uŧque]saJYbZGkoDRYQlhdOjtdx_=Ua\VpaPh{j~q[zsXYZ{i}xxuwhnESJLjp{~xxiv{|vgnk~nnyrkzlkXe?=V?9ChǩƭxopWmmOPfcOY}SEWJ`ogYXmtrCC\_VfuYd}uq]kc_Xpk{|tqty`nI?H:Vws}z{yl|u}wyyw~wyyu|~ppaPPH/OZRhhejxeQfq_Uyq?HCGombSwvY6L]ZY~wpzylgsolbvk~}ghb{pVXuF+;6_~uw|{l|qq~vuyxy|yxvypicYOQ<7YS[lqdzv_[ys^c[>K>Vuk[_~}F=V^Pduo~fzozduziw{}tos_nzdQji/05U`U[swpstw{x{u{is~wpwrc|l_aulV]rC'50U}Ηlqruxw|uuw|mnwupumltzixhFHGTSFQ_XYqzzq{pw~zx~exwoyo`vm^^mmXUpP&44Oբqmo~y~xpu{q}ohpkujtht}kipEB@LRK?IXPwr~~}v{r`ISIi{pak~HF]a[n{wpuyysnymuy}qtjds\Y^j]Mai7.LQLH]em{}{}|YTP[un\|^BViktv{|xhv|~s}rk~mVmZQMVUKXoQ7DHxÒurwywk}nntzqgnuujflrzWfvsqxrhQfO79COQKLcbz|}}{VYPptjb}OH`no~|}wm|ru{xmp~ZbhTONXPMeh@;DTѭruxxewvzmztkexsjjb{s_YlupwsnWXb@9>KPNGUadsd[Vayt_|`EXlpy~{z|lw|v{ql}cYmXRMURL]nL7@Fzлxw}x}yermyxleplrmeyogTfsquun_QeH:=HPOGK\Zys}w^]\xjltKPfptz|hwvtlsqVkaTNNTNTk_;=ET[\Wbmyykgw}|fpiR_u~{j|zvhdkroWSeNNEDKRcujRW`ź|zrvn}flkvrrwiehzı|o|~TONdzmZ`_nw|pWb~sxMXX@LJ^kkW\lxssiORQl~|]_]mzyxi~`VAYDHPMcojZxz{}Y_]dtuxzmSVYMaX\ppYXiVwv}dW_Tjkqsj{cwerevsqm^jlѝq`wfe|{|smQ[WV{|lk~~dh|jigezkcvpUTgKctrjdm_p{qg}`jYB\oťdvVH^firo[KXRJmpf|ej~{vfnqR`ywzu}xguiMSdH]qlwruyi{z}n^I[E>[qdUcdlwqWJVIGn|e`qVfsqm|q]geGcv}zysfq^EU`F`qiuq{yi~zx}~uRE[ABZqgYddp}uVLWFGpza^kQfqnk{o^gbEhs{||uiq^EW_H_liszoyvg~{{w~vSE[CBWln[d_n{YKWEEn|`XcMdpnjzxejbEex{|wiq_EU_H]hiovzozwf~}~w{t~wUF\JASfv]d^jaKZHBh~dS`K\pmjwjkfG\z|{kqeJRfMYe~pmwruu|gt|}on}z]EVRAR]egbcnJXN?]mPXKQplkotmjLN~~}zppkOLeSVbuyjxrqlkv}jm~{fHO\DPVxoej^y{STZBNxyVPPChomlpo[Bj|}}yop[H^bRchntxxnygy}srxozpQDXNKXejqdljL_LCegKP@Trmlu|rjFP~yrqgMPgW`e{|rs~qlntwgiĵzs_CKZJY\~ypwbz}WU_ELv~WKJ>dqmmwr]>`yyro\I[fYjjz|vp{ixzupieƮ|tjQ?RUQdez|weuO_XDYtMJ?DpoopwqP@n|{tqjRLcadqs~~lujqsdwlm½um]@EZRch{|kt}aSgMKq^HH8[unn~ue>Tuzvso^KYh`tn{xu{lwzpkdaİtodK=RXXome}]eunbhrrO^uoZ]j_dkji~iovxnxiaGq|sxuo|}{bl|_eybHgsLIj|ff^oc_\>&Qovaak`s|yulvnipxvK]\E}`m{plmjtwituy}n{zerb7~boY[jr{zksYWOUzuyd}v·ARFkjKE5YRJPryvwrP8nmozx}ps}sf_}lkK[cEWxdk|gpG_p|kE9^p̖|i]FZPctv]bxYtq\HTLU>9UNtn~r~{e`yge^N^_oĮh[tseur{\hoxxZGU<5]}Z^gL`xag^bpVetmj5V[2HXa`z\fpr_l^HsOKcSi~~c~jp{zů~iu\G[K[Kizugv[^|uTfhKP\Y^B3>!Xpkl|i}xkVxiwfboa^SiisǢogovxmxznr_j}wxranD42>WuŖcc{[idbsUdrfp?ep9?:9Tp`~qjlqyirkV{hZoTAi^xĬanyz}V{yx^t\Z8%pjįgX]flNMQ_b]GJ*4N?eshxjQdrrntvmhfW7rĝt{y~q~wu}{wq{\qŽ~ohP@BABBU}ʮvlgpfh_ufmNJ~[MMD8KSh~~rlzy}uq_o\o_nwMcYB]eº`spuewchw̫tv{h^0CZ@T{ŲkrczjUGV\bWKM4RG,T]a{qtxyktfqxmxwwuU=ip|~gwjzv|}dox}~ĸzrXKVML37F\Է{ynvnlzohIQx^S[TDSDUe|nuh{xtv^eTyart[r]MQRwĹszhsfT]|yp`?KdA=XjȌhy_Q\]bRIM?cS4EEFss~yiwjpui|~~zd?nln_rpqb|yvq}mkbǘr~bQWVV?55;vž̨~ykk[IthQ\_O[RSX`\PwldppkUmggvflnRZVgpk{|j|q|`Uexn|fS=fVANY]rqob`ki`HI>YhLBN@Oc\yzttxj|{olyw}xDXsqiSmox}qzi]^|l\W`ZL742[ol˯kwyyt~oQ<6+'Rv~\iTyhlus}^dm~mhT+3QgnsDZp|n^pt{~d+&1N_k~zqDTUN=9qt]RRA'XTXTjnQpknY}LCF8IvǨ|gps^kuxfqM_x`PW{ȳu{sYNWnpU[QQoVeKALjxq}inowYvxZqjcALoofG:`_kk²olwsq~{KPT<62hƝydTs_RDf~oH1P{fekoxfv|luxfc{{xrc^?-Bkf~y\qugdlebŪwϻursYL3?UZwȦ{a_fsj\onbaT[*IhZdGnvnUKvfk{of|sZm[5Kqhjxknxkwwpykkal;+,$bȾk{h`pfoVwlHQLUIZgck}{qeyj_k|yquyse^4(\Xtrxxvym]w|iRdʧr{oc9KI;LShķVldOOrlY;Kn]9:HRMg~xkiezpgurqhZQTP[hzodmYzkkxzmvhS-"]¦{nkWbcWgzy[\>>kWiijm|nsxy}~WljrS{eMrqI-6S`s`tf`{}prwecTF>LAFjm_bTF]zui_{q`Vh`IXxtvrko|||rnujdl}lZU4Hpm[w{WXpk¹svp`[1WE.Wnii`e]`pzsPGMKY^zVnze{vdZ{a^YQGs|tiggU[iff˸zoux}xfovhwahtXarU88aZ]xyMR}wgguNR6O|Vt|ois{d}bf^_`xxaKLWctįliZeda~kvogahvh^[]O?E\T~yh@txrmXgZC+Ezjfqh]f{rkZPqunydSG?pzovzw\jw~n[ZVNUxeR:J`^rԵosWgalu{mOKRMTZ~nxuzvkjso|Eo{hrRfZE3@yhqqo|mqjYfhdYVWC/;_Ĕni\MX^PYmXM9\x}td|xiiSXXcm}fPJJLNfŢku^oomazVOllQCH=GQc}y\ignm[JPSULc_sxmv_g{NGSRMTkUG?fpvm~}p^j|ywdDybTI1GFFR~a_fUPh]vizpoplxwo~ynqsGvwbxk^QUZNVzÙp]}utvl[zxppu~a{T`\cabU41ASj}̮}ovbk{TV=Qad]_|a`dZbqzlWmuXGV[e}s}}xnbp{`\yeLQH76KA?@bʧðbklg^]`TLRirt{umyw}j`mq|}UipHI5F^di{it~uuyogw^ZXPL73?Wfiþn`hr[LB4?h^hawze}nkLv\eYXSRJ?UrsvWtwctg~y|shk|~~|Y;IYSKOr~Ǿ||y{si[TVX\murc|hleYFPzpRH=-;__nprzphgl~|v_Sgqwve8AP7FF^}˳srcEKmxtzktrvwqbhifl|uXz^AKHOi{o}xqw`SKPZ{~ckT`TE<3;IZcm}uwnL=q_klcwpid|tifiejiNoh>2Riu£sz`p|Zows|qSWOLBWviD%")[àgrPHKYh}wyvw~}xknrh_]mqkcM,Migzow{|`Qgq\MR\Z[bR-LH;[q~tfrse_m{iGDIUeopitmtgmdTy\@DLdy~|~{yvqj\xtqd]S\qTXKPwqi_O<7bɼtx~yioOEzgswv|_z`fLPXVOMgjQ@BWit}\n~cjtmmk_WVfbVLJMILRFnĵ|sfl}g{vnrh\pqzytrilg[W[gbXZR7ayvzr}stp]Rd{ppxzxdWcsifgiZVD2YTMf|~}wZVX`ntrnlpqhi|wcQIHau`iRUofflkkvw|zxujecua~{}dFiXJS=D?3+8]kiq}˯³{hndYBx~wvx{jq]][]cnvbPIN\i~mbce`]ykkYQOP\VOJHH@I^Svwhk\QG?[wuooqvzVJYu~|}u^VL?pw|z~mY]qsnqhgycI;5?[mTQ86Zhw´hZZW`mpx~{kUGrkbiKF=29Uoj~bhiey|~}zzL^gFUW[\ZU?8E[zȰrosvebD`rtspo^V]emq]NFEMTsvh~gQJMSdywsmwhM8F`snc]H?PGouwrpd`bwo{opodm~lQMLRgv[PC;bw}sbT^ju~wmmb_UH=^jOR8&,/?d̷v{tlnlzyxppUP{fepeb\ZTN`uztzsolu`jcb}owrJdiSTS[ZWL64=Ofz©íujkQQV`h}zpsutk|qjXRetvjbcUfuns|voiqzvx{ypui`YJSgi^KFA=PT=HFRħz|sqfb`lz}wzoacafg[TokNOA9HWfsyigx|{t~li^VTXIEn]IPFEPZgk}̳zwp^\g~mv|lr|ilL]~lhb\YRSLOcs|y}{^lz[lhakkqyuqurkDSaeh`S;:KT^crz{µvillu}qgYMIKg|{kTH@Gfbe}t{zulgahtswx~o~zof]GAUZleevowstsq|i`skgemua\VPS^{}]mǺncepkbesgx~yjUIUxuR?\gkmijjwtw{khyFCHPWdvhazôgIV]lvh^IEEGH]}hsСxgg]`vgnkm{jaQabZƸzrzjM~c?MsegF(2MADQRgwzhdvmXuw_jyxnlH]txd_k`^Wamvtlejkvw\fgUZ\ѽpei~jѻYNir˒v^NLDD?ELRMTK1tqdy|~uk\i[bfkmYWUEHhyrtxm|Y[>̥qcv|_[vn|tsȎ}gK,6Kiסr[P/SnPY-WiO_giRTvq|k}pcgffzugflxn[ezaRSdwsZuoc_tqgD]yssĽ}q}zz_]J@P̼ʡiqI@KemSCLJE[iqXwx_E@_sh|jOYcU\xkJnqwbiW_ƣtk{{qom|zv_fxdotpgH(\bo|¼pJng\UalFAmzpSFv|L:HVYUqz|pQli_]|y{ZaG\Wisx~jZ[lb~q{z{iXvna]bE1fǢxomiT[\KZo}|fiTBnXgnuxkl{TSvbn^^>itP:Nmx~btljse{rmjvoY^ROOeU\Įg^YZaTH[[NtoXP`fLLxxs{vwpjRhlnnzb_nYKEvatñhs^]tqTU|sw«||yumVOT;,EFfngúҵniugJ35BfrF+2KO]wb`v|ac\hqaN?e]CJ[rhҹ˯tco`^iukpu[xntxvmSFS60Sqpū˷sZvYNNUTc[T@9ME_c~tWyvaus_hvgHRlH7?TƭrUXizih|f{{xfl`:GgSSTT|کhts8Xrh^jWVWZN:zisgY\vgyysSfm>OudUQjȚakvx|pv]|oxwmyX{W@PTKeevʶfSThtzmSSimdOvmhFXjk\Wwtd`L:moUb\yȖ}hrxtuixv~xSyj3/`ZQ_^џfv|WZN^ig\eR\zVqqoXkb}a_yq]zANoXazxlymi}l|x`jk{}okrqxZ5\Z?_tu׳~tzY`[^hlPRRVs\LpNxlc|mYqfZo{q@D{_@]Ƨr}qf~yuhwzbyzxv~^\{nq]:NZ:Glx~ǽtwmVNeka[K`jW|Tf^ntc~_ruL:hW?c}zv~|jsmvuuibsybVuyb9Tg9skCXov{|v|~uswoindsmets_GdP=[Ydpµ~{r}yhjZWePridrzjknf_wdJPQO2*U}oeimYlsrVqmcr??D^\:3FIUp˻mrrbnq^@ohUnzpzztk}cpq}|pqc>HdgsRxs~y|}lih|wgN^}pqkqn}ZEwfJ:LZEEIį͘~sr_RXadNbfiz~he`SzcThpaAn^N-L~b}̲|e`t`ix}{u\Y^c_PoZ: BFSHEƟcjm]\ppf`{{v^lSn|fl;/3SbU\~|jnjmxkYtbOmydMo[[ac_OHA27cԧzv|yhsgSE`lua_sq}vRhmddq~qF`gHGO{x~xbyHQXuwokzW.TygGCPI8WNRaēæo|q~yqckWPkvyYgmnaia`oqiGbVH4QwuĖvwwmhpaf~omwwnQ`JThDI'%2WŻZ\paliO>nnpgs^zu}a]P~j\b_RHUWZpī{r~}vahd]`v~iq~u[~iH^{T\llL&GrRL]ҸwujgjW@Mfetu`yrjI;uaE@MB+g|Ӱqɫzxbt}otakvsnv|dbaj^IR_Za`b,1\L]aЯqrHcwfqxoxzz~g^dtyhlaKmIOKEYxy`TUZeWHzyceWVeQWDm[9<=EDcx͸qzQQygsqva{buqSqp_PmpivoI0Svuzt}ybbgearhrg]B`f^@0bk;%0EFJݺԬ|ykzYe[bb~}sv|s`W\kh[kmjf`d,Ywu}rwfWH}usv~ysdjTHQ_k`QX,CV@\`pû}uZpVEW`UmomgZ[xlmX`v>FIW`sro~u}y|cG{Z|jfj[S__·}u{{jPbcpwk|f`JEO`gPLRFOI`BK±ոh~fNk~nuvqaem[_mspVVJ7mdo~~yajNweLWkljwuNYxkXPdnPS,WQ2R\tȫ~uv{rqp`luofbYUHCiun\`ylabp\QqyusomaR{yqnx~s{kmnt_?Ritxy|}}q}w`BPW[WTSYnkk~ohv~y}h(JV[`px{izxx~Wm}z{txrjYz}~|v`4.ER^]eckrol\kz/wbTUQ^YYLSv`c^^wutp~zʢrtjipxva3C[psw~zp`]s}`YY^,Zxxvfc\v]hv[idnt}uDzkhjWSbz^DeóǙx[:/OXKB>vp{rSHot^_`|}v{jT^hsd\Pbnmìzz}uwxrrM|~pj\nseprmbnĻŬ~rtgKLUb[PJPn_¬}z{mhi_ha2UeOM6`{yz^FXzO=DVJE7j}u~g|fG_f`aq~uztXXdrl\SNiW~~wtwp{|NpqrX~k{xfl~sn_ǺqstmOKTa^MEB^N±vondkh9WlTW9Twts\ER}S>BSHB7`yk}coL[jaamz~wzx\Wboo[SF`K~xztzVfrw\hlqhfxskbzµwzwstXHR^eQK:SIlutjiuOFt]\H?ovufLGmbD=MOC>F{gxgxZQpxfcd|w}jU[fr`VFSRW{|yumT~tqV~tjpckvhgeòt|rriKHR`[KC@XDxvktqF`u[a@Krqo[IS|~VA?NFB<]|e{_}TXwujgoyxvy_PZgo\UD[Ni{|uwe]xwjXomjamqfeluvnnaCDM\SH@GYKª}zpzoIiu]cANrpmYLY~|UA>LB@>e~g}`~V[wypmuy~wtv]KTajXTH`Uj}~wyi_{xqUzonl`gnbel²srjh`@=GXVJFGcPį}|qywRe}ahKGnqo^NWw[D?I?FNxetVd~}zwqw}qmigIAJ[bWXXxc}wbpv|iX~zlv}eYcc`i}szuyvkc][M15?SOOPguo~wmVyxdkHOljhVTcvQ@I@JXygvXdzov|~xujhdbG>EU]UY`~i{cxu}jXw|}rkxwbWb``lvs{v}pznm_[UVC-5ASLQTupĽfgrnhG]ihbT^qiN@EICOgx{li\m~ptyyoifdY>BJ]WVVmtnpiv}\dxwwjql]Zc[gznzmmupke[YUQ528JMIN`vfȯwdmuXQighY[i{YHAKBJYugz\fzmu|{vshhdcG?DTWOQ\t_zfue[ttwkl{p`XcZbo~pxmqsslh\[VU;27FLDHRmZͷjr{cRgfh]]k`NDLDJYoh{agxo~yy{ttijfgOBDOVJMTmXixpYorumjywdW_[]jvtsqzntjj]\XYG36=K@BFdXpŭs{}{vUbjid\gxnWHKKFSnnuhncqzns}vwmigg^EDFTKIKb_`rrx`bpnqhrl^Z`WdxwqzhmpkgbYZWV<46CE=BQdRкsymXihjabpgUIPIM\lksgiv|qr}tyqsghegVBCHTHJMhYnoz~||\fnongtiZ[]Xfwp{xeimed]XWUR955C@=CXbWζxzm\igjafsfVJQJQbplvhkx}qr}rvnpefcfVCBGRGJQj\pq{|adllmgtj\Z^Ygvnw|{ybxgic`[SUSR:34AC>FWiYϺx}u\ihkderl[LROQbquplis|vjnsklcbbb[DAAOIJRjigvtwl^jhmfo|o`V^Xcw{np{v{fdn`bYZPQORD349GAITpfzƼĮ|~gbigibnz{cUPVQ`vn|fn|}ivrnlhf]`]_K@@IQKTbyfpzz^fhkihwwfX\]_qyrjsrxl[uu]_VVOMNOJ645EDIVpsqÿȱ}qaifjdlxhZPWS`u}t|glw|kntjjcd[^\_OA@FRLUc|lp|{abfghfuzhY[^_rwthpoukWpsZ\TTMKMMK756EGKXrwsÿɱ~rbjgkenyj\SZWe|u}hny||~gnphfa`Y][^LB@GPLXi}krx~{_dcgfiwteW\\bvxmhpzmtdWslXXPQIKLOG657FEN]xq~îmgjikhu{gXV[Zm~svjqxwc{iibb\Z]]ZFB@LLO[stow{wp`edifr}m^W^\lw|glvmqoVbu]WROLINMO=64>CESivi˶iminjr~qbV\Zf{}yzloxz|~glpgd`_Y_]_ND?EKIUgve~xwzaechemzpbU[YdyzywiksonqZ\ubWTOOHNMQA739A?L^qaͼnplpnuvgX]Zdyx|vpqy}}kjvif`a[a_bSF@BJFQ`q_iigfel{weUROXuuiXhzceqt_ogo~p_achdVTU`\eqpzs~tcunkx`^bgmq}gigXIauoynrznnpqmZTNWSV`rkgr|kzy{nsszznb`Vgbezqdn~wjhRiy[QKPB>=GMO]msarop|{eijruxaZMTwwbp|fjtob|ys~~y|{~uhedokuqjkTdq][jURUY`dv}kYRQRjcjh`jzx{jM]nfw~xtaZU^]`l{vj~bHD?U~v{zm^GKThpy~~{fgjSJhgbiinhmkneXTS[Wamyfu{vzvoqs{~qijk{lk\?Mkiz{cUJLJGR^^Ktqwuwomp{}hjipqzwcNNM^uhirvezvr|x~~{ywzxswvbneTVS[\ju}gWILLaxj`pr^dmlkiQMqz{vgb`hcnzo~~z_I@HTzy}pZJQ[mq|{{p^e`IQqllkijgmlpc[W[`]jvycx}utrw||kknz~}x~h\^N@aycYPUPS_hZUqv{~x{iuo~zjkhoozjYLT\zuxflu}ll|xx~xs|~tuwqngs`YVX^bpxq_NKQZxv}`e{yd^erlag[Kgpjdkim{zr}vzv|y^MBNY{zuaNSZkpzyvm\c`KOrsolhliqoti`\^c`nxwa~z||~yvsx}|lmqvsww^X\LDilcZ^W]glX]|pu|{}}}vwi|zpukihno|zeTOWb}zofnz{zfy|v|yz{nzv}xptv}mxq`^Y`bnw|gWLQSl~{kcr{i[aiz~~qahbMV{{rkmnm{}l}twuz~~eSDJQl~kUW\krz{vo^edNLlplkionusxmc^_c`nvs^|x{~|z~zxsy}|lnm}pqt~s]_\GDgtxxngh_l}|zoipyved{{cai_koolryiXWVdu}wPU{xogvojj]br~ftypvwxtrieox{|fdsq]o|}qaaak~|`bvz|m\tz}{xta^mrt~|vnv}}qwishgqv{ytc]^b}}SCX|qa_kaQbztvuxnndesyv~{zviotv}cid`qwg]__vx{fZgyptwj\O]qyvujkecWX_ix}vfkyacmbhkw|p__]jv{r_LVj}na{}~|yqrku{wdR_[aqr\QOPgz~hyecttfQMZmzus^k|zw~zoa_Y[m|{{{nptwqxv}vxv~yeTEUl}dVmskifqt~~xjc[]Wcosewxw}}|yriostj|gXhgjtnefhy~jery{l\VRTj|}sn_]`hsyun_eyqZ]iafhrx}o_`_l{qrnaP[mue{}|ruozzhrxdN\gkzm[[Xi|qon`f{~}viZMYf{~s~|ha}~zod\^\o{zrx{|u{nwz}~pu{wj_TVl~x__yxsmlsv~{}pf]Z\]oyuetw{~{{rotxxggys]\rs||kijtyx{kp}wk_SVXi~|tpcffntz{ogZkwhUbnkpnwxzmafg{~zjl~~|uja[l|qjwrwvwe^nlWSmu{h``dzl{}d^k{xyneVWdruxtbo{~of[_anvyz~rn{x{||hhwuslc\Zoib{ysnuw{}rg_\`as{wfttz~{{sosu|rcewr]\txpnpzyuzlr}vyf]SZ]pztgjhqt{xmc\pvdUgnnqpy{yldhlyrfn~zzph\^pmt~tvv}~wk[gpbP_qvzjjgxsrn`dxzzrfZQ^hz{w|hf|yvka_bg|zxvx|s~ps{|{idrurmaYRbtuh}}wpvx~vkc^a`ovrd~xv|{zqloq{~{qdizs\Zn{nZZZg|zqpqzl^lv~woc{||iqenuwzvy{}qvqfopztopwteefqy{zyXYq~nqptqsh~~}t}r~zw}}zrlqr~|{gmm~~zzmlnw{{uoZ_n|xxhyzfeug^ijmpolejkv}}usxfqux}|~qkmqyy~lVUiv{xfn|xxsv{y~||]^fl}qdY\]p}|jqthm{m]U`k~{|li~}~rligw}x}}|{poqt~}uro~~}|iZMYl|jZkzuqiqvuphjepwtgw{s}{}}ztlpoy~zrpl[ipw~voqtxvzifq~{vhd`ev~{{{snaa`elsxnicss]`nntr|ympo}|ysq{l_S`nui}}{}yy~~tq{dScmxqhhhyxftmck{{}rfWT_k{~y}|ik}}wmjil|{y|rqru~|uqpzr|zuf[P^oq_m~zvlrwuohjfpyvhq~s{||~zvlpou{vpk|nZdt|~tvv|xx{ogr{ysibefy|}|yskceckowqicfzyfYiswxwupsuuzlo}zzqg]_o|qn}|}z~~|qfjxo[Xp}qmlqvh||jbmxwwlcW]gr}}|xxhs|wphlmy}~{rusy{wtmvnhsrpld_^p}ncvxqxz{rlimm|~ug|ys{x|{ysnqpwzwngj{vd\s{xy}yt{purt{|}}oo}uusv|o\U~z[^oqrlswvwuqpm]h|rg[`cnv}ttxym|yor{qhp}kdv{|}~vtzj\ertxogZ\aiszz{zwchz~}|y~u~oq}trnedh|nz}zryregwz|ukirxwzwrvz~|zvyz|yhbzjo}~qqnpv|xxxzvpu{~lnwkk}|pdhhptzp{}ywxtypb]}qq{vjbo}wd_oruu{xu{xp|rfYajyps}}}{v{|r~u|z~{ujhuvwtzqkfn~xif|~y}yqa[grx~zlmnu|pztex{ketythactxlz~{{|xzvrn|}tehlvoluz~spmsqyym`ry~}ukchlx~vqwrfu}~~umkzmpyy}unachoz{fjx}ujc^lwsigxxiYdptspx|{rntwx{mn|}|uiejny~}{~kh}||ljv{}qst|~||zrnhuw~xm`TXXafqsv|~h^p{}~}xic|~wxpkabjr|xoguy~{}}{|wkqwnYbv~zrur{{n_lwkqoqqmhaghsxyokoshw~xppqxt~zmgjlv{spxt~{{utlg]bht}|jgstunsw{qrox{qtxq|ul`efpv~|o^iytgy{~}xqjpstrhfgy|wm_Y]`jnwrst}s`\s|{mhxrsnqmmgkqx{xql|~{}prsy~{}~q]ey}z}yjZcxmstttniaghpv|zposzhnz~~x}qrp~xvj`depxwj{|qtumlhebbnu|p_jt{zx~~tnpru~pmww{wqhekmvxzy{wd^urjy~z~zysuz|~zzyylkmv{}yn_]_cjoupsvq_czvglsrqnnjienrz~no}|~~~vkpowy|wx{u`Uh|wh]rvjmhjhgefoqxy~uppztgt}{pns{{y|uhfjmuy{}qromojkhkikisy~}jhuy{swz|rutx{vnw{}|tj`ddlpxxv{~j^q}of~|~y|yxtu{{}~|p|ymlpy~tk]]`emrwquxp_dz}viqqoljlijhsv{z}~ms~ytmpovw|vtu|q_[steaqlmjmjidhknsvxoosolz}zpss}yoeijrw~|vjzrixkkdfccafovuiu{{||rqqxyysv{{|tmadfkqvxsw{}j[f}shzwyuwvusryz~~q|xnmpwzqcccflpsnrxqah{~obq}opmnmjgemp{|mwwjijmrvztx{l[_u}l`nqqmmmifaffnszwrt}uenyxttu|z|sggknv{|nnylsrnjfgca\dhs}qt{uvu~}vo~wryy|yrhchhosyuv{wd^p}{mm~yyvzvtmopsz}wtxoomv{xt}qfigmpvssy}j^kyxid{poikhe_`eiu~{p{}}uikknrvxrvz|iX]q}qeqpokklifbfelrzxswyhnz~yuvu~yvymhklsv|y|sm~yjiumkfidc]adkvzs~yzw|~wpvuzzzzri`ccimtuszm^fwri{{{vwwtplpov{}nt~upqpzyvuznikkqsyuw}zhaq}vhgxomhkgf`cgku}zr~{}|tijjlpsuoty|iY^q~tgstqmlmjgafdjpwxsx}kmyzsvt|}yvzqhlkqt{zzuhs|mdxzjhaba`^_hkwsy{xyy~xs|w{y{voeaeeknsorxud^p{mkwvrvttopst{}~xlvzrrsx}xkjjkorwryveew~nbirmjgiggdkmt|sq}}}}tlcfdikpoms{ueYfypi}sqklkjgfkjptzutyufozwvxz~}~wljmmsv|x}nj|refofc_cadaint}{tz|z{t{wzz{zrjaedhkppnv~zi]i{qjwvpsrqnmrrx|}}yjqzxqqtw~ymlllqswsyuedv}mbjpjfdfegdmou|sr~|}}~zrhadbfgmijr{qbZk}{mk|rpknllgiklrvztx~ogs|}vyx~~z{riljorxyyvhruf`uwhf_babacknx~s|~~}~{uv{yzxyrlacdfknqnv}n_cutkzzwqqrpnkpntw~|zzioyzsrtu}zxz}qppptvzv}wfev|lcoplfefedaghpvswyw~}xqecddhjnjpw}k[Zmzxnxzuomnkidhfkowxw~|jmwzvwv|xttzomnnsuzw~}mhx~mbhngb_a__\bcjs}|z}|up~z~z|xqhbedikqnr{wf]jxzooxupsppjkklqw|xrjt}yrtrvvqo{zqsqtv{{{sem{thd{}plegee`addls}|s{ztv|}uncddehknks{|jZ[lxzq}}xqopmjeheimuvv~}lmx|xyvzupo}snposu{x}pgspde~tid_a__Z^`cluz~~uov}~}||tmdfehjoppy}l]bq}tm}{wpppnkgkhmqyyz}kmw|vstqvropwsuswx}zoeq}qffynjcfdd`bdfnu~}t}ysw~{{slbcbcfikirzziZ\mzyq|xropnkgjgkovxwlkv}xzv{xrq|smpmqsyx{tgn|rd`szjf^___]^demtz~zts}~y{vpfcfdijpms|ue]jxzooxtmommhjkjptzw|tgnwztutuytsxtttsvy}z{kgv|lcjtlfbecdaghms{yt~~wt~~zxvog_a_bchgis|teYarvq|wnonmjilkpszx{yimw{zzy}xuwyomnmqsxv}}mfsyh^b{qfa\`_a_eimu}yxt|~{yxqjbdcfhlmnx{l_eu~plzummmliilkosywy|pkkjfkpw~zvyv}~}rwyzy~xzzussuz~vw|xt{|x}zxry}~zzzuqsojpq|~ylgkoz~}xvz~~tyu}qyyskr}{~|wyy{ssuxty}}spvzwtz}|~wy{|~t}xsuyprvz{zzywsw}yx{|~}||}x~rozns~}wqv{}xvtqooyz~~|vwy|trz|{}xrnklnkdoypz{|{|yyw}|{urnus{|z~txstuu}uzzu}t~|zzzutsnlhroryx~{v{~zzz~xt|kqwwsx}zy~|wzxpsy|~y}ytzx{}tu~}~|xtjhqlqpq~~|yypq~}}xrtspyx}~~}{~xw{y{tsx~||y}x}yqos|vpoujklourz{v}}{z||}}piipr|wz|z~}tnpz}y}}zy~xw}{~~tvmhqjpsssw}w{}{yy}z||wquvq{wuw}x|ut|}{yyulr}~~{u}{}|tmtw|xtlsknmky~yw|zwouz~r{yvmqvz{w{~~}|{}xssx{~}|zvw}zvwpo{zpvrokivwst|}wxv{t}}{~}xytsoy}~zz}~}}~~xtyxxwyy~~|ytu}}|zz~~{z}rssjrow|{}}|w}|{|{~}upooqyxy|{vxnz}py}{srw|~|xvzr}|yv{xu{pqnojqv|tuqwxx|{}z{umkw|~{~xyzyrtvxzvvw}}zxuuuzx}z}{rvklwx{vwqv}}wvszw{|}~{rnoz}{}|z{{|vzx~|yz}~}m|}{~u~~vrz~}toort|x{x~xwzxz}|y|~{xrrvvvy{zrz}}{}xxs{z{z}z~wwsx}}|||~xv|}zpsotsuu~}z{yuw{{|vuwwupw{zz~~{x|{x|s}~yx|yz{{xqrmvy|~u{qwyqvuzy}y}x|yvx}~~|z{qyxzywutw|z~{||wzx~zw|}|~zyw}x}uxz~}}}roysqvyy~ywsxxw~w{}wzzry}qx}xuuzz~|v}{}z|~}|xsr{xvtzrs||}ywxwyzz~xquyquz}tstxwsv~xz|y}{{x}x{~z}s{w}v}v~zzrxgmry~{xtsvyzpx~{wx}~vv~u{x~zx~ywywty|{z}~}xswxyx}v~|zwyv|v}wx}xzxy~}xt~y{|uwv}zzzwyvpqt}ywy{vwqxw}|y|vwstmux~v|}}}uuwypq{z|ztqtsy~|rvuyx~|}puypsy|zwsu|zyzz~zswrw~~}zyw|||~zs~xxy{~||~vtonmiwxvrvxytzwvuswv|}~~|umttwzy~}{tz|z{rz~xtxuvxyuyyx|~tt|zrqu{sv~~svsz{yxwvwqly}}tyruw{{{|||uxmpu~}y|{xv|y|~~{}wnw|yyx}|yzwrvqx|}ysvx}{z}vommtuw}~~|svxww~|xvuwwuu{x|zwx~wy}}vvxxrxw~wqpurqwy|uyrx}~y~yxqw{vy~~ypwpzx}uyxust~~~yx}|{rtwz~~{ysx|xu{zvsyz|{~{w}xvxzpuz}zw|yww~~~sttvrq~{}{vmvstv|}w}y~~~xw~}}xttvuvwyys|u{sq|~yyx||w{zwuu~{}}u{yrsv{vwyw|}|yz|~}syyvszz|{}x|zoyv|y~ytmruvyz|{z|}~}zxz~pvzwvv{{wttpy|}|}uv~|~{~xxy~|}yw|wzyrovsqqu~{yuvxv{~|zvz|}~}ywxzyz}yst{xxx~|{zykyu{||~|~w|}yz~}}y|~{xumovusstvzwsu||}~{|yx~}|u}swv}~|swvryv|~xsxu|~v~wtz~}}|}|}||~{y}urltytwuz|pwr}xz{~~||wuqs~}}~}|ptyowpz|zq}z}}}y{{{~|vsux}ssxols|{~}xzw||xrvuxvu~z}yw|vzxtwo{||{{rpo|~z{}}x{ztkqqqoquvtt~y|wy{~wz}vvrv}{~~zsvqzzs~~xxuxzuru|}}xz|{~vyqyvrorty}wtwzpvnwxty|{}~~{u}{uys{vturutty~{rx{xx{~~~{v~|zyrq}}zulu}xomus~|xyt~{u|y{v~}wsu{{}xz~wyvup|}yuvpnps|x|zy|{}wzy}|yonutu|zvw{r~uvvtxx~|v||wqjv~|{y}su~{yv|}|zt}{qoxz~zy{}{|}x}r|}wuvurnwxwu~xumjs{}{u~~~vow{y}qtzuzz|y~uuxzw~~}|zy~|{~yptyy{|{sosrwrqr}w}yszyqx}}|~y~|x{ztvz~wyswrsv}y{tslqt~}~tv}zw}y~s|wlnnryu{v|tpxvtxyx~||zwnty~~xr{}{suw|vwxywpo{xt}|~|}x{}v||yzxuytrw~t|vvoohlq{~{~x~~tqwv}}|~~zqvuy|wxwqttxw|~}{zzrqtx~}||stvytlzzzyvw}}{vmr|}{yw}zww{yzytxru{|}{wurmwx~y|~~{tw}|}|zvojkvq{vv|wrvvxzw}yxvqwy|{uqtu|xx{}~~{}up|~~tvx{~{|~yzz|y{usrupttv{uxwrqmnv|zz~x||z{}skpt}|vv{{vpt}u}~zz}|~yqsvz|uyvkovw~}}z}vlnosw~{yz~z~x{yvwkeljbklnxw{uwx{}|yzxpspqvlnrlhvy|mkovy~~x}yt|{y~z|~~zlpunowt{{vxyxxzvy~w|z{|tvuqwrlrqhr{~|xqv|}{|yx{~~~pmuroyy~}ww~zozxxqtrglngmy{{}xxpfnuuyzv~}~urqmwut|{{}wmttpxyzvunluv{z|}y|v}{}vx~y}z{sqkrqlprwx~vhnokqqnxwy~}xyypjmghrqt~y{{u{z|{z~~wzx{{}uv{wz|{z|xz||}tnomw{vyy|zw~sy}{~z~||z}~{xxt|sz{{~z~qrwsv|y|~ytswqllnr}~|}{y~nkmnz|x|yzzu{pwyxyspwtu}x{z{z{y|v~|}tz||y~}rpoq{zvwrrx|xouutrjhonoz~}yuqvwnsxtuxt|ww~{u|~zrwyxw{}}|~~ty}zy|}~poqt}}y|w~v~~ut|}|~~}}|}uxq}y||zwy|{|zw{~xy}{{psxtplt{zvwznloq{|}w{v}~sy||xpkrrow~}||y}{{~z{}~~sxzz~~}~upppv|wwxpzxzuvzzwohlplr{}||~www~tszxuusu}yw|z~v{{~stxw{}z|{~x|}}ytz~~zxqprw~{|z}}}z}uv}||~{{}||syry~|}{|~{xz~xx}zxpvzvtpuz~wuwzpmnqy|~}w{v~uy|{rlpsnu~|{y|||{}x}}twz{~{wplmpyyuxst~}|vz|~umkqpny~z}{|yv|}sz{xttsz|wz~|}w}~{}zqwwy}||}yy~zw}|{vz~~{{vrpsy~y~y|}}wx~{~zyyzxz|~||t|u}y~||~~{xz~wy}zvqyzxwsvz|uuyxrnnrz{~|x{x}vy|zqmprox|zy}{~|z{}~syz}}yy}snilpxvuxsz~zy{upntpr}{|||}zw|w~zyttv|yy|~zu}y~tsxw|{~~zwz|vz~|yx{{zvprv}||z~}||zw}||yww|zvxx}|~wzwy}~|zz~xy~{vsz|xzvux}vvzytonrx~z}|x{yvxzyrnprpy}z{~{~~~|z|~}~uzz~~zyzyqlilqwsvvt}z{|}uqsurz~}~{~}xzz|}zxuvz}w{{}{yz}{|sww{}|}~{xw{ww}~yw~~}~xsqty|~~z}z|~|xz|z~{wxz{twv{}{}xwy}|~|z~yz}vt{}x{yuw~xx{ztonrw|y|{y{yvxyxsnqqq{|}{~~}}y~~}v{{~~|zz|vpjjlrtqutu||~|wsvtv~||x}{~|{xwx|{wz{{|w|}{txx}|||zxxzuy}|vx~}xrru{}z}|||~|{~{w{z{~}zxx{ztuv{|{{zvwv~}}y}~vw}}y|zux~yz|ztoorxzw{zz{~zvxx}ytprqr|~|}}~}{|~wz{~~|{|{yzzqlikotpstu}{}~~~{wwxu~~~zy|{zxyzyyz~}{}w{~wvyzz|{|zwzvv|~yv|~~{vrtw}y{}{z~{~~{y|x}~~{xxw{xstvz}y{yvyv~zwy~~z}{ux~{|}{tpprxyvzz{{yvww{yuqsrs}}}}~}}z~yy|~~~z~zy{yy}|rmikmspruu{~{x{v|~}z~|}{zzz~~xz|{}w~~}}uxy|{z{{}{yy{uz~~xy}yusuy}x|||}z||}~z{|y~{|zywwv{vrswy~y|yx}x{~w{~~z~{vy~|}{uqrsyxvzz}z|z|twvzxurvsv}}~}~z|yz}}{z}}ww~|yxx}zpljkototvy{{|x~|z||{z|{|y{~~|{u}~ztyy~~x{z||{x|yw~|x~}}wtuv|yy||}||z}}|z}y~~z|{|zwvvuyxrsuy|y|zy}y|x{z~}wx}~}vrrsyxvzz~z~x}tvuyyvswuw}}~}~z|y{}|y{~z|}vv~~zxyx}wokjkpspvv{}~{|}||}|{||~zz|~{}yz}vwz{zy{z}|zz|w|~y{}~zvuuy{w|{~|zy{{~}y|z{~zy|y{wvvvwzsstwyzzzx{{~~z|{}xx~wtrrwxuzy~z~x~}tvuxywsxuy}~~|yy|}~{~x|~~y|{uv~~|zyzy}uokkkqqpuv}|}}}}~~||~}z{|}|{~w~~vzz}yzz{}|y{{w~~|x}}|~zwvu{yx|{{~{x{z~~{y}y~~~yyyzyvvwvxyrstwy~wyww|x{{yy~xtssxxuzzz}y~}tvtxxwtyvz~~|z}z|~~}~{~xz}}yz|uty||zy{y}xpmkkorntu{|~|}|}~~}{|~~}}z}|x~zx{{|x{y}}|y~y{}zz}~|}zvvv|w{{~z|{yzz~|zy}y|{wy}wzwuuxvzwstuvz|vyvy~x||yy~yutsxxvzzz~y}}tvtxxwtyx{~|~{zvxkrvwxyyxxxz{{||||}}|w}zyyzyz{}}x~|}}sztrqsty}zyyv{}~~}{s~{|{}{}}z{w}z{}xq|z~~|}|{vxxz{~~{~}~y~ysxpport|{|xx~yy}vnrrluq|}zuypqywz{|z}|}y|}}{uxy||x{yuxxsrsst{|z~~z{upvorrr{wsrtjuwyz|wvux}{{v|~{}}|||z|y{}{}{~|}~y}~w~xxwzv{{}|z}y~~{{|w|u|zvpuor{{~xwpw}y{x~{{yv{u|{vvyvsyz~|y{|z|||~}~y}xvtwrw|~z~z{~xrstq}|~~usx~{z{||zx{uzty~xytuwxotu|}{x~y}{zzyvvyurx}~~yz|z{uqxs|}}~~~{sv{}x~z{|{z|wu{wzvxz}rrq}}|}wy{xz~{zy{yx}yswy}}zvvzz|vrzv|{yyz{}vuy~xz|z~~~yuz~wzy{}wuox~{|x~yyux}x{y|{{}vyv|~zwvzy}wrzw|yxxxy}xuw~xyz|{ux}w{z}xvow}z{z~ywsx{vz{~}|}xzv{}zwwyz}vt|y|xwxuy{ytx}xv{~|vw~x|}~yyox{zx}y|tryxu}y}~~}|{zv~{|{wxy{~vv~{{wvxsxyysx|yu|{vv~y}~yzowzyw~y|tqyxu}z|~~||{{v~z~|yyz|xv~|{xwxsxyysx|yv||uu}z|~y{ovzxx~y|uqyyt}{|}~{|y|u~y}{y{|yu}|xwwuwzxsu~ww{~vt{z|~{{rr{wz|~z~vrv{r|z}}{w}u}z}}y||}u}}zyvyu}xurw{z~wsx|z|~zvo}}w}~x|}xss}s|~~y{{z|v|vz{}z|}~wz~|zw|s|zwp|z{x~{ttz{~~xznwyyx}t~vnyuzvtk~}ytz{|z{zu}xx~~{qny{vvwz{wzxyvwuzv{yx~u{z{z|toq|y}{}ty{{s{{{x}|~x{zxywxzz{z~}}y}{z|y}}}xyz||z~}vz{llnxvw||{xv{z|{tv|~~syy}}w}wvs}~~}{}u~~wyw~{|zuskdqot{tp{zny{wy{{wvvxy}{}~wrv~w{xyx}w|z|y}{o{tt}xvvpjmgprxw{vx|u{xzx}z{~{vv{|~{}x{nt~}~|}wz{{||qwwuxx{~~{{sroyssswuykz{rt{}v}yzyv}u{{xvt{}|~zzw~{}zwr|ytvo~}|smtpr~tvuvty}{}su{qx~|wy}{u|{zuy~z~yxy{ysuquy}xzz{xshyst~uxzvruu}z}}vvywt|x|ytx~ztv}|~~~~tytxoyus{z|zzttpoukv|vzso|{|ur}xws|xyuu}|~yyvzzy{{{z~~|{}rzwutlw|~ypmstvzp|~uvy}}zxz~{twuv|z||~{vz~zx|~~{{~~}{{~{}vyqs{vv{|{x|trru}zy{u~}ty}|s{px|v{ztu~}{sswyyvy~x|w||~~sxzruvx~vtuozz{{xqovz~{yy~n{xvzrt}|wy{vxsuq~|~w~|~~}}{vxspmrzup}uv{s|}xyqu~~}{}{~yyvr}|yyz~~}xusz~p{y}|}~~~|}{~{spwxxvxv~{z~xyvr{{{xxxtz}zt{{swx|{{|{vsztt}~{~{|z}}z|yrtsy|~y}}ytw|~{yuxxx{~s|~t{~puu~y~|zzz}}zy}y~zz}~{zpk~}}u~{z~wwnvx|z}}v{x{ywzw{}yz|xx}y~~~~~}z|ypuvlxuurqxzz|{rvoqtvy}x~~wz}y}|yw{y{~{z|tyv||wojxzvwvvqutzx|~x|xnoklkqyzz|{~{x|}~wwxyzv{}{y{s{{z~{~{{vklu{zzxxzy{w}}}lloiikrz{y}{|}}xy{xzy}{vww|}vx~{~~wlgy{r|ywuvx}z}|{tnrljjnv{w}{|w}zw|zyzx}}x|~wy|~xrlqt}{wrrvy}y}|{qqqmkmqww|~xyxz{{|||vzw~~||~ww~yzvomyy~{tuz|}y}}rnrpmopsvy~|~vtzw|{{~~{tzx~~}xx~x~|woj}|w}uxzz}{|~~|rmqrnoorvv{|{~xvyw}z|}yt}~w~~yy}}upiz|v~|vwx{zz|tmrrnnqsuu}z|~|uxx}y|||{v~{}{}~yy|}|uoizxt~wz|}{~~uprrlostvw~}}}|ytxy|x{|}|t}zwxxz~xxtwzwxv{vy||y~xr~tp|uzxyv|||~|v{|}{~y|{|{tquz}{~}}vv{{q~}yos||~~|}|}|~xstvzyvyx~}yzxquuvtz~~~zty}|}ylx{wyz|{st|}uw}{|}~{||}}voypr|{u{{|x{{sxywyz}xvquywzttxz}~|rsyzuv{yy~}{wx{~~|}y~vy{}uyzxv~}|zuv}~xwt{w{xz|}ut}|ys~~|{s}xuyz~{}tsq~~{xwuzvvxu|}wv}~ytuz{yx|x{{~|xnm|t~{y~zywntw|{zw~}zw{}rmuupvrntsr~}~|srzvt|~zmq{sw{z|~{{~{{|wzyzx}~{}y}v~xwvx~}znsqjiq{{wur~}wrruovx|~vx~}}vv|~|t{~wzt~t~wzv|utvwz||pvvkrwnsz{~|vrrpvuw~}~{}zu{~{|v|||}|y||x~~}~|{x{x~zyvphdkqotuyxwzrqqoqvwuysx~}zox~z{x|yz}{~~sx}~~~t}|}u{~~vzyrszt|}zmw|||}u{~u~{|uzsvrruxyx~{~{{~|x||x}~}~vznmv{rnkpux|zyx}ww{{|uswqv~yz{x}{nzx}vyy{}wx}{{xx{y{x~yxwtvtsv|y}v{|~slt|vvuuyx|z~|{w{|xwzt{}y~}~{wx~~{wywzxtpxzyyx}~uossusu}{vqy{{x{{xsuvx{w~{{vx|ws~~|zwy|wyv|qqy}st}ukv|rwrttssyx{wvsu|x}wyw{~}y{}zzy|~ou{}y}wxz}||y{w~yqxusou~}z{{urz~}z{|{pwx|w~{w{|~stqqnvyxz~x}~}yu{z|{ynxtz|y~~x{y~uttsxwyvtrmwz}u}xx|}~}~zz|u|zw~}||spwws{~x~zx|wptw}ysty|}|wwwsyvlv|z}tx}|}vuuz{zuyyuw~~||z|z~|~{zv~}zumrqppuzyx{{tz~|y{|{trvu}y}~~ysw|{x~{x~yt{}zv|}~~{}|tw{~|yzuzw|wxw~~w|rx{{}xwvrrrnsw|xzxu||}y~{{vu}~xwz}~z}{}vrz~}}zyx}sqpu||z{}xxx|}~|||uwtwux{z|z~vuys|urwwt}{}~~uy~~y{yxyz~~vtlwxsvyw~z}xwumqvrox}~wv}zyw}}y~{xy|z{|y|vsw{~z|{{~}znxtv|u}{ssy{~{~yzom||vx|yw}xy|}}|vvss~zwxzzyz}}|w{|w~uxzsz{rtqpw}}}yy{{|{xvwyuuu~ywx~yutyz|}|t{|~|yu}~yzxwx~|xxyzvuuw|~z{||z}zwwoquqsyz~|v{{vxy{vuz{}||z||~vuwuz}~}wptpyy{s}{{zssw|zxzz~wy~uqz~yy~{|{|{||}~wsvqtx|xtou{x}}|zzxw~}|ty~yssrvywz|z|~wru{x|}~~{}z}y{}|y~yxzwyytxxtq{}xvt~{y}}~~|zvqs|||~ruvux}|}{wwz|z}x~|z}}}~ywxv{yqqzty}zw}}~xnvxt~|{}}}qqy~}|vuwx~{zxyw{|v||pv~wqpzyw||}y~xx{yvvvwyzz~|{~|{xwvvy{~yv}~{}~|xtz~{y~|vxtuvvv~|xwvv~{~|~~z||zxzvuwz|}~~zzxuyzxv|~z|}|~y~|z|~ztspt}}yztpty~~z~{usuy~}|wy~z}|x~wq|ywwz~|}~|}wv}~}{ysu}{zzwtxwv{z}}}xttx|y}~{|yv}{{xuwuy~|{zx|~~~~|xu|~|zxz~|y~{xyut{wrv~~~}}{|~sp{||~}ytqrw~|xv{~x~}y|{|}|wwuw~|vvz{urzxsty}~}|}~wv~vw~||~{||~|wvw{{yz}z{}|{x~|~yt{|yz}}~{v{xpx~{ysvwuz~~{zzz|yuw|zz|||~}|}{}}{|||zy|y}yw|}}{{{}|wux{}~{xuonvz~~|{||z~~}}}ywww}~zzz|{|vv}wuz|x{}~|}|x||{~zwvuz{wzxttwvyzxzz{}{~~|{ztrxz~~}z|z{xtx~{{|}~|{~~~~{t}{~|}~zuvqqxy{{xxzwwy}}}|{}}zx{x{~yzzzx}~~}|xvxty|z|~~|{||yusspsx{zvry{su~~{z}|sw~~~}z{{x}|zywsy}}~w||wtu{~xuqqyzttxvrsx|||}~~~wzxty|yuvtwzz|~~~~~|~|xzy|}~z|wtxxootxz|xxytuvz~{z|~z{{zz}{tuuv{~{{zz{~~~}}|||}~{xustppuwzzwuwtx}{~{xtv}~|z{z~}zxxv}}vv{uu|~~~{w}}y|~zwutvwuwsrrstz||~||||~zz}}|{{yzvrsxy}}~{zz}y~~}zwxzuvy{|ztusrtuw~}xy~|}yx~~z~}}vuuuwz{}|{|~||{~|{zxz|}{|zwwusrplpuzyst{vt{|{~}{~}tw}|~|}xy|zxvsv{|~~y}{yxz}vps{xqtxvrpqyz{|||~}}}~{z~~~~zz~~|yxwu{||z{}wxwx{~z}wtvxtrssrstv}|||z|}}}z}vw{}}}{||xu|z}zxsnonrs{sqrwz}~{|~{{~|zvzzy}oqmrzz{zutujsvvx~}~}|~}ywz~~xqtrnpmrw||~~x}|{~~}ytnpqw||zqvxropzy|y}~{yy}z|zrwy|zxsryxuv~usovtw}}z{~~vwxuuy}t{yrmnyxwsyswz|~zw}~||wzrmutrv~~~yklptqxwx{us}}{}{|~yuwxxv}ruvtsyx|yy~}{z~w|}ypnrnsv}}zsuxz}vx|wtzyu}z{y~|vt}vzz|~{qqpxsvwxuywv{y{}~}zy}|xtyxz|s}yns{yyuy{}z{}}x~y}zx~yvinqtwyzz}uxyzzxusyzz~wx|rxvst{z~xyrxz~syx||}~vzz}~yxw}zxwvtxowx{rvyu{|u~{{~wsz~{}}v||z}uvsvuyy{|x}~w{|~}y}~x|rtymmwzu|vzyyz{yxxtz~|}}ut}txx}}wu}xzlq{}ywxw|||}~|~yxsx{}~~|sqvszrttyyz{~|zy~}xot|zyzy{{|}}}xuywx|y~}}w|vu~{yyy{~vuppqupux|xtv||xyzxywqww~~{y{}zxwx}~yz~{||xv~y~uy~||y{~~|~z~yxr}utqlvx|x}xv~sy{wxtxzzz}|~vxv~}|}||}y~xvoyz~}|}}w~x}}|~}z|y|yrquuuu|~xzyyy{}~|~}usywz}xsqnopvv|}|{~wx{~x|pr~vx{wt|~zvzyxzz}vzu}}zzyytuz{|vytwy}w|~yuwtpryx||~|w|~~}}zqrnlwwuv}|~x~oyzyz|}}y~~|txtvu{w~zz{||zsxv}}}}u{~yu}trljnux}yx|~{~{}rwxxy}y{wzzztu~{wt~yyvz{{~}|s}{t|vz~}y}vpjljtu||{|}|}syxt~ytz}|r~~}wvu|~ws~ytzyzz~|x|zv}|{||z{|x~uuqqnqt~{{}}y{vwwy||x}}zu|{wup}~sz{tyt|||~ww{sw~{}~}t}{ytookpu{z{~~zzv}yy~vzy{twvvquuzw{}vzz|}z{}ww{tx|{z{}w||v~spinqsx~~{}{||w{yy{{x}|u|yvtp|~v|ztyu}}|}uxywx{y{z}~|z}{yxnnmpv~}|}~y{xz}||u|ytwwutzwxwvw|~{}|xtztsv}yz~|}~y~yvmnpsv~{|||{~z|x~{zvzwyvy{uwr~y|~t}qw{xwwwvvx{u}~||~}x~vqlrpt{{}{|}}zy||wu|~yu|{usr}v}vtvv~~~y{r{stsyvw|}}~{~{{xmorst~|{~}~}~}}ys{zuy}vus{|y|w~u||}w}uwvprwys{~}}~z|yqksqsx|~{~}|~|{txx~yxz{squy{zzvu}}}{{wrxussyt{}~}}|yxkrqvzz|}~}{{trx{zx{||spu{~|xyt|z|~}yyr{vspzsw~~|~~|{lqvvz|}}}~}~~yzwp~{y|yz}wss~~}~}wyr{}{zyzq{utrztv~}}~z{oputx~}||}|}z|wp}y|xy~xsq~z}wzs|}}~}}yyoyttoyvt}{}}{~~~prutz}|{~~~}v{st}y|z{z}s|xwvy~zxwz|{x{{~|yx}qvuju|}~xv||tqp{uqzz|xy{yuvsy}xyw~~wrv~yux{|{qs|}~wzxn~xmuttx~{{yvu|~|~~zy|}z|z~}wpyz{||xzutwxr{{{}||uzyx|zz}xtyyvznqvyu}~}usuxzxq|y}ysqyywvt~}xyov~{xy{wz{}zyz{|~~{||kkusv{}wz|w|}vytz|}y{vzzvttx{~yvqzvjt|y}ux{yzv|}~||spvjjrhnx}~{u}~|}w{~y|zw|}yyrtsvpx||zwytw~yt{y}~}xy}ursz~ossnuzxsz{}{~~x{{{{}z|x|y{zv}|z~ox{|{~}r{t{|yw|}}}}wvyhnyx{{}yzzvwtq}}}wvyw|vv|zzztnyvtww|zzsvzry}~zu~~}z}tqrriqkio~{}x{|~xx{vv|{~}}~zo{{xyvvuytux|{t{x{tpxz~~zu|sozppls}}~}||}{|{{z~x~zp}u|xq{}xyyr{|sw}{s||}w}}{zs|||tnlhlosoy|}}zr}uzuywuvovtuvzz}|tz~~wy{}}u{y}|w|||zrugk|~u|xv|zy}|~ywtt|}|}|{xzzu{{y~x~{~yuwxxru{{{~}yztpwtqqipx~{y{~{{{|v}}|~{xqox|vwzz}xu{{{~vx|~{zzwy{|~nr{mmmfgnqqy{{u{}|||xzux}}|ww|~xp}}zzv|~ztrxywx~}zst{suqnos}w}y{zxvvvz}}}z|ytxz}sx||wz|~vvztq}~|z~{ssiuuw~stnspxwvrott{wwwv~zv{}vqunwz{vrwv{|tty|w~~|vwwttsmrt|vwp{~uv}~|x~w~xv~{tyxpmpv}}wyxw{~y~{}~z}~{||}}zzz}wyquu|uv}{{yzyszzxx~|{xwuw}x{y{{|xpn|{ryzpniilu{tsknvqrrpmqqtrz|sz{z}t|y}vrv{ztwyv||}~~}}yv~wxzwtzywzz~|zx|zxyzyrv|~}zxwtuz|tqltyxvvrqsrvtvvvvytou}yvp||xxxzy~z}|~utx{yu|~y~~}}|z~}wv|z{}zz~uvxxpy{}{~wqqsrs}yqplqrsnppmosvuxrvz{|~|v}|zwzwy~{tv}zxu~}~{}}|}zz~wxvwtxxs{y}}yxv~xo{}}{|wyy~ytovwtx{uttutqwqt{yxuv|yyq~~xvx~}ux}}~z|}ystxxw|{y|}}|z}}|x|yxzw~{}wtwy{ux{~||wxqqqxxtsqvusvuutsxvtvuz{|w}|ty~{xz}z{~~utu|{~z{{z{z}}z{w|xvsvyuxxy|~}|~xzyw}|xwvz{wwqyyy|ytrswvuvsv{}zvyzwzztw~|xxxzwyz}{|tmr|zxz||{}~{~yzz|{|{x}}}|yzru|zv~~||z|wsstx~yxuouuvyvrtvxzwyvz|~|x~{}w|zxzz{xy~vrx|}}}xxz|}|z|y~{wwv{z{xw{{z}~|tyyx}~{xzy{|yuzzyzxuvsuuuxu{|ut|y{|yw}|xxv|}uuy||zzppw~|}~y{z~}{||zzzy|x~~|}~}z|vuz~ws{}}}|{ytwx{}|zuvzz{zvvuvxxzw|ytz}zy|zy|{wz{upv|~}yzx{~~~xww}zyvuxyzvz}}}|{{w|{v{~~}{~}{ww}~|yzxxyzzw|~~wpv}y|~xv|~zwvv~zuxw|~xwqms}}xy{}~}|~}{z|zyz{{wy}~|zwru|{st}}|zxx{}~|wu{||{xwvwxzzxw}~~|tu|~z|~yxx{{z{{xqr|~z~}|}|}|zxy|xwwyxwu|}y|~xw}yt{~~~~xy|~{{yxwyzzw{~}xqx|v{~ywy|ytuv{xxx{~}yxrmt}{y|}|~|yz||{zz}|~}{ysrwytq{~}{z{}~zvx{}}{zyxwyzzx|~|vt~|{z{|wy{|||}}|vqu||z}}}zx||ywwwxxx}}x}~~|{vvz}yv}~y{~~}{zz{{{y|~{vr{y}zxz|~zuuxyxwz|}|}}{ywsos{}z}|}}}zz{{{{~|}{{{}|zyurvzxuw~}~}}}~{y}~}zzyyy{{{{{wx}zz|zwy}~{xy|~~~|zxtsz||}zyx||zxxyyx{}}y}~|{|}}|{xzzx~{}~}||z{{{z}zuu}x}~zxx{~{wsuz{xuvxz|{|{xutppv~|{~~{~~|{||}|~}}{yyz~~~~|yxvtv{{yw~|}~}y|}|zzy{{{||vw|}zz}}zwy~~{xy{|}}~~|yxssz}}~|{y}~{xxyxy}|~y}|~~~|zz{{}{{ywz{z~{}~}|{z{||}~yuy|zzxy}|yvuw}~ywuvxyzz{zwutqt|||~||||}}}|~~}~}zxwxz|}~}}}{xwttx{xuz~|}~}{{{{||}}ww||{}~{wx}{xy{{}}}|{xvssz}}~|yx|}zyyy{~||x~}}|~~|yyy{~~~|{zxx|~{x{~}|}|||wv{|zxy}~zxvwz|xuuxyzyzywusqrx{{}}}}}|}}~{~~||~~{xwwx{|}}||{yxvtw{zvv}~}}|}}~zw}}}zz}~|zy||zxyz||{|zxvutw~~z~}{|z{~}zyz{}}}yy~|}~}~|zxwx{}~~~|zywx||yv{~~~~|ww{|zxx||ywuvz|yvvwxyyyxwusrsy|z|{}|~~~~{|~~}|}~{xvvvyz||||{ywutvyyvt|~~}|}}|x{}|y{|zxz}{yxzz{{{zxwutv|}|}|~{{|~}{{|}|~~yy~||~~}||}~{ywvwz{}~}}|zyxwy|}zw}~|xy|}{xx{~~|zxwx{}yvvvwxxxxvussuz}z}{~}~~|z~}~}|{{}~}{xuttvyz|{{{yxvuvy{yvx~{y~~{z|}zyx{}zxyyzzzyxwvuuy|}}}}zz}~||}~}{|x{}||~~}|{{|~~|yvutvyz|}}|{yxwx{~}zz{y||~zxx{~~}zxwvx||xvvvvwwwvutstw~|}~|}}}z{||~~}|{{|}~|yvtstvwyzzzyxwvvy||yw}z~~}zz}}zyy{~}zxxxxyyyywvvvz}~~}~{{}}|yxyz|}yy}{x{~||}}}}|{zxxxyz}}ysoszyvxz|}}}{z{~~zy~~~~~zv}ww}}{|~{yxx{~|{{{|}}|{ywwx|~z}}~}|}~}}~~{|{y~}~|tmlt~zurqqqqqruyzwuz|wv||yxz}~}{xwwy}|zz{{|}}}|{{|}{vsrtx|}{zzz{}~zz~{wz}{|}~~~}|{zzzzyvrpprw|~~|zywwx|}{xz}ytsxyutuvvvutsqpprvz}}|yvtttuvvvvuutvy~||}z{~|~~~}|zxuqmmotz}yussuvsopw}|xy|}yvw~|{|~~~}{yyz}~}}~~~}}}{z{}~|zyyyz|~}ywy|{vuz~{z{|}~~}|{zyyyzzxurpprvz~|zxxz}}zx||xtsw{yyyxwvusqpqsvz|}|yvttttuvvvuuuvz|{}yz~~~}|{zyvrnmmqv{}zwvxyvrpv|}zxz~~~~~{ww{~||}~~}|zzz|~~~~~~|{~~}~}|~~}{zz{|~~{wvy|yuu{}zz{|}}}||zyxxyyywurppswz~}{yz|~~zx~~}{wtty|zzzyxwusrqqsvz}}|zwuttuvvvvvuuw{|{}yx|~~~}{yxwvurpnorv{~|yxyzzvru|}zz}~~~}|ywz}||}~~~}|{zz{~~~~~|xx{}~~~~}}}|{{|}}zww{|yuv||zzz{|||{zyxwwwxxvtsrsvz}~|{z|~~z{~|{zywux|zzzyxwutrrsux|~~|zwvuuuvvwvvvwy~{|{wx{~}~~}{ywvuutsrqqsw{~~{zz|}ywy~|yyz{}~~~~}|ywx~~}{y|zxz}~}|{zyxy{}}{vvx{|}}~xwz|~}zz}}zuv|}{z{|~~~~}|{{{{zxvtssuxz}~~}|{{|}~}}|zxx{~xsrw~wolloswyzywutssttttttuvz~|~{xy}}{{}|}|{zzz{zyxxy||xvvvx{xuvxyyxxxyz|~}|{{}~~~~}{yy~{xwwy{~~~~~~~~}|~ywxz~}{wroostplnsxxvtstuvwwwvuuuuvwwwusssuwz|}~}{ywwx{|{{~~|xuttvx{~}zwsqonnnooooopsx|}zvvz|zutw{~|zz{~}}~~~~~|zyz{~}zxwxxvvz}{zz{|}~~}{yxxy{}~~~~}}}}}~}{xwy}yxwxxz|}~~~~~~~~}~}zzz}zustvtompvxwussstuuuuuttuvwxxwusrstvy{|||zyxxz|{xy~~~ywuuuwy|~{wtrpppoooopqtx||zvvz|yutvz~|zz{~}|~~~}{zyz|~}{yyyywvx}}}}~~~}|zxxxz{}~~~}}}}~~}|ywx}~{xwwxyz|}~}}}~~}}~~|~}zyz|~{wvxxuposxyxussttuuuuuuuvwxyxwutstuwyz{{zyxxy{|{yz~~|xvuuwy{}~zvtrrqqqppqruy|}zvvz|zvtvz}}{yyz}}{~~}}}~~|{zz{}~~}{yxxy{zyz}{zxyz{|}~~~~~~~~~|zxx{{xwwwyz|~~}}}}}}}~||~|xwwz}{xxzyuqqvz{xvtttuuuuuuuuvwyyyxvuuuwxyzzzyxwxz}~|{~~}|xuuvxz|~{wutssrrrrstx{~}zwx{}zvuw{~~{xwx{~zz}}{{{||}}~}~~~}~~}{yxxxy}~}|{zyvtrppqsuwyzz{{|||{zxutuz|yz~}}{xuvwx}~~~}}~}}{xwvvx||~}xsrvz{yvutuvwwxyyzz|}~~}{zzz|~|xw{~{|~~~{z}{vrpqv}}zxwuuttstux{{z|}zy|}xsqsx}zxxz}|xux}}|||}}}}}}~~~|||}~~~}{ywvvxz|}~}{yyyz|~{upmnqw~}zxvuuuuuuuvx{~z{~~ywy|~zvsqrty~~|xw{~|{||}~~~~|yvtsuwxy|~}}}}~~}|zyxxyz|}~~~|zxy}~}~{vsppruy}}{zyxxxxyz}}~~|}}xtqpqty}zz||yttw|~~|zyyyyzzzz{{}~~|{zzz{{{{zywvwxyyxy~~|{{{}~~~~xsonnpty~|ywvuttttuvy|~zy{~~zwwy||yvsrsvy~|y{~}||}}~~~}{ywvvvvuux~~~~}|{yxwwxz{|}}}~~~~}|zxwx}|{}~{wsqqqsvz~}|{zzyzz|~~|}|xurqrtx}}|~~zvtw{~~|zxxxxyyyyzz|}~~~}|zyyyyzzzyxwwwxyywwz~}||}~~~zuqonoruz|ywvuuutuvx{~~{xy|~|xvwz}|yvtsstw{|{}~}}}zywvutsrponoprssty~~~~|xtt{{z}{yy|~ytstvuspmlmoqux|}yxz}|yusstvz}wsu|}{zyz{{||||}}~~|zyxwwwwwwvuuuvxyxwz~{yxxxy{}~~}}~}yuqnnorvz~}yxvvvvwx{~~{z|}zy{~}zwvvx|}xttx|~}{zyzz{||}}|{zywusrrstuustx{urpprtvy{|}~~~~}{yz}||}~|yurqqruwy|~~{{}~}zz|~|yuqonorvz{zwnqx}}}||||||||}~~}|{{zzzyxwvvwxzzxx{}{{}{z{|{xusstwz~}xyysonnptx{}{xvx{}zwuux{~}{xusqqruy}~}~~}}|{zzzz||{{vsqppqstuvwxxyyyxvtstw{~}yvvxyxvsrrsuwz}~~{yxy{~~ywx}|xussrrrsstvwxyyyxwuttttssssssuwyzyxy}{zz|~~||~~|zz{||yursvxvsppsvy{||||{{yxvsqppqsw{}~~~}}}~~}~}zxvvvvwwwwwwwwvtrqsv{|zvtuwxxusrqrsuxz|~~~{yyz|~~zxz~|ywvuttttuvwxyyxwvuttsssssstuwxyxvux~}{zz{|~~|{|~zvtvxxurpqtwyz{{|{{zywusqpprux{~}~~~~~~}~~~~|{zyyyyxxxxwvusqqsw{|yutuxyxvtrrrstvxz}~}~|zyz|~~{y{~}{ywvvvvvwxyyyxwvuttttttttuvwyyxvuw|}~~|zzz{|}}||}zwwyzxurqsuxz{{{{{zyxvtrqqrtwz}~}~~~~~~~|}~~~||{{zzzyyyxwusqqtx||yutvxyxvussstuwy{}~}~}{zyz{~|zy|}{yxxwwxxyyzzyxwvutttttttuvxzzzxvw{}}~~~}|{z{||}~~~yxy{{xtrrtwyz{{|{{zywusrqrsvy|}}~~~}}}}}~}|~~|||}~~}||{{{zzzyxwusrsvz|{xutvyzywvuuuvwyz|~}}~~|zyyz||zy{}{zyyxxyyzzzzyxwvuutttuuuwxz{|zxwy~~}}~}|}~}~}{{{{||}}~|yy{|zwtstvxz{|||{zyxvtsrstvy|}|~~}}}}}}~|{}|zz{|~~}}}|||{{zywusrsw{}|xuuwyzzxwvvvwxyz{}}|~}{zyyz|}{yy|}|{zzz{{{{{{zxwvvuuuuvvwxz||{yww{~||}~}||~|}}|{zzz{{|}~|{}~}yvtuvxz{||||{zxwutsstvx{}~||}~~}}}}}}~~{y{~{zz{|}~}}|{ywutsuy|~|xuvxz{zxwvvvvwxy{|~~||~~|zyyyz|~~|yyz}~~}}}}}}}||zyxwwvvvvwwyz{||ywuw||{|}~}|{}}|~~|{zyyyzz{|}~}~~~zwvwyz|}}}}|{zxvutstuwy{}~}{|~~~}}}}}~{yy||zyz{|}~~|zxvuux{~~{xvwy{{zywvvvvwxyz|~~||~}|zyxyz|}}{yxy|~}|zyxxwwwwxxy{|}|zwuw{|{{|}~}|{|}|}}{zyyyyyz{|}~}}~}zxxy{|}}~}}|{yxvuttuvx{|~~}{{|~~}}}}}}~}zxx|~zxxyz{|~~}{ywvvy}|xwxz||{yxwvvwwxyz|~~||}}{yxxxy{|~~}{yxxy|~}|{zyxxxxyyz{}}}{xvwz|zz{|}~}|{{}~{{}}|zyxxxxxyz{}~~~}zxyz|}~~~~}|{ywvuuuvxz|}~}{{{~~}}|||}}~~{xvx|{xwwxz{}~}{ywvx{~{xwy{}}|zyxxwxxyz{}~}||}}{zxwwxyz|}~~}|{yxxy{~}|{zzyyyyz{|}~~}zxvx|~{zyz|}~|zz||z{}~|{yxxwwwxyz{|~|yyz|}~~~~~}{zywvuuvxz{}~~|{z{}~~}}||||}~}zwvw{~~{xvvwy{}}{yxwy||yxy|}}|{zyxxxxyz{|~}||}~~|zywwwwyz{|}}~}}|{zxwwy|~}|{{zzzz{|}~~|ywwz~|zyyz|}~|{z{}}zz|~~}{zyxwwwwxyz{}~~{z{|}~~~|{yxwvvvxy{}~~}|{zz}~}}|||}}~}zwuwz~~zwvvwxz|~~|zyy{~|yyz|~~}|zyyxxxyz{|~}||}~}{zxwwwxyz{|}}}||{zxwvwy|~~~}||||||}~}{xvx|~{yyyz|}~}{zz|~{z{}~|{yxxwwwwxy{|}~~~~}}}~~||}~~}{yxwwwxyz|}~~}|{zz{}~}~~}}}}}}~~{xuux|~~|yvuuvxy{|~}{z{~|zz|~~}|{zyyyyyz{}~}||}~|{yxwwwwyz{{||||{zywvvwy|~~}}~~}}}}}~~~{xwx{~{yxyz{|}~}|zz||zz|~~}{zyxwwwwxyz{|}~~}}}}}~}~~|{yxwwxyz{}}~~~}|{zyz|}|~~~}}}}}}~~}yvuuy|~}{xuuuvxy{|~}|{}|z{}~~|{zzyyyz{|}~}||}~~}|zywwvvwx{}}|{{~}{zxy}~|{}}zz}~|{{{||}}}}}}}||||||}~~|zxwxz}~~|ywx||wv~{optwy{}~~}|zxuuy~}}~~~}}{{{{}~|zz||wuz~wrqsuusrqrsuvxy{}~~}}~}~~~}{z|~|zzz{}~~~~~~xsompv~zwsrpoonnoqtwyzyyy{~~}|{{|~~~~{yxyz{|}~~zxvuttvz~~{xvuttttuuuvvwxyz|~~|zxvuuvx|~}|{zz{}|zxuttux{}~{wtqpppqstvxy{|}~~~~~{yyyz{|}~~~}yvspnoqty~}zxusrqqrtvxxwwxz~~}|{{z{|}|{z{{|}~|xvttttux{~}{zxxwwwwvvwwxy{|~~}{ywvuvxz}~}|{{|}|zxvuttvxz|~{xusrrstuvwxy{|}}~~~|zzzz{{|}~~|yvsqoopsw{~{yvutttvwwwvvwz}~~}|{{{{||}~}||||}~~{ywvutttvx{~~|{zyxxwwwwxyz|}~}{zxwvwxz}~}||}~~~~|zywutttuwy{~~{xwvvvvvwwxyz{||}~~~|{{{{{{{|}~|ywtrpppruy}}{yxwwxxxxwwxz|~}}||{{{{|}~~}}}~~|ywvutttuwy|~|{zzyyyyyz{}~~}|{yxwwxy{~~~~~~|{ywutttuvxz|}{zyxxxxxyyz{{|}}~~~|{{{{{{{|~}{ywusqppqtwz~~|{zyyzzzyxxyz}~~}||{{{||}~~~~~}zwuttttuvxz}~}|{{zzz{{|}~~}|{yxxxxz|~~~}|zxwutttuvxy{~}{zzyyzzz{{||}}~~~|{zzz{{|}~}{zxvtsrqqsux{~~}{{{{{{{{zz{|~~}||{{{{|}~~~}{yvtssstuwy|~~}}||||||}~~}}|zzyxyy{}}|zywvutttuwxz|~}||{{{{{||}}}~~~}|{zzz{|}~~}|{zxvusrrrrtvy|~}}|}}}||{{|}~~}}|{{{{||}~~~~}{ywutsstuvxz|~~}}}}}~~~}|{zyyyyz|~~}|zywvutttuvwy{}~}}}}}}}}}~~~~~|{{{{{||}~~~}|{zxwutsrrrsuwz}~~}}||}~~~}||{{{{||}~~~}|{ywutttttuwx{}~~~~~~}|{{zyyyz{}~~}{zyxwvutttuvwy{~~~~~~~~~~}||{{{{{||}~}}|{zxwvussrssuvy{~~~~~~~}}||{{{{||}~~~}|{ywvuttttuvwy{~~~}}|{zzzzz{|}~}|{zyxwvuuttuuwxz|~}|{{{{{||}~~~}|{{yxwvutsssstvxz|~}}||{{{{||}~~~}}||{zxwuutttuvwxz|~~~~}||{zzzz{{}~~}|{zyxwvuuttuuvxy{}~}|{{{{{|}}~~}|{{zyxwvuutssstuwx{}~~}|||{{{||}~~~}||{{zyywvuttttuvxy{}~~~}}|{{zzzz{|}~~}}|{zyxwvvuutuuvwyz|~~~}|{{{{{|}~~}|{{zyxwwvutttttuvxy{~~~}}||{{{{||}~~~}}|{{zzyyxwvutttuvwxz|~~~}}||{{{zz{||~~~}|{{zyxwwvuuuuuvvxy{|~~~}||{{{{||}~~~}|{{zyxxwvuuttttuvwxz|~~~}|||{{{||}}~~~~}||{{zzyyxwvuuttuuvwyz|~~~~}}||{{{{{{|}~~~}}|{{zyxwwvvuuuuuvwxz{}~~}||{{{{||}}~~~}||{zzyyxwvvuutttuuvxy{}~~}}|||{{{||}}~~}~|}zx}khtjcgejjqxb\e|~~lsPPOKS\`ybqkwxvcntcUxdVr{yuavfj|{Wh{^dkZbxeX`oXZ[\`Tvh\||_M8cJ1VkV[mzrdz~\x|ypz||yq~dQbjW^rmV]Ux~hsu{cmjozjqqjnplZag{zloq~vzzgkX_|}zszϿųdZ\1LħhquaR1]HN;7HJUa_RqlWbuxwq_a]~tcVhlcyeu~zthSgffw_cakruo||xr_Pgjkj}mbixlo{cizvrtu{yo{w~pm|DE7=NUrybcR^Z4<-bqёnvogzgSYXm_oajysjhb]wm\M<`e1)WXUhzklw]q{}sv|bplvZdMtMHnlN{_Z|o~fzzouhljlpZx|pqweqw_uZBN]FW_kyz`r]qS>le\iltSi{IPZAUYcWz}~nyzgj^yxYHwg{plozwly_Q\QV\sblxumtrl}|{zmxwsswĥ}oiNmF4J0EOE~zlձigyrc]r[my^]lWbydVpbWUI_NEOdpdrvaYtps~xq}voipL\sNIPWCIvny{ppw|~jp|wox}mkxczmv`kYxxAG[YTBCYTjȵʨh|m]Pe_Olwp}Ta}f]nHaRLKYyrtpvwzwgTogojemfnrhkqX\jd]\Ljpr[y|uinyy}dx`jXqyu•|tt|rqlnnk=DWC\_E``°z}x|nr|dxfotbT]h]gNA7@egGLs}Xull}mippcrcUaV~g5C[gHt}vzvlsgsyyX`voksupZruRpqP;HRBLSn^k¸zvig\dPr`^wnWt~obuNLqioqy{zvhlxiu[x{mnlu|xakUPj`JFRFsj}˜zplpnhz}uvq~y{h{}qx}zffiijoHMJT?GK6onrusǨɚ|o}zpwwh|{`jyioTWc^@6=hv^_~vthhz|~jy}ztpgrbmV\XV=P{`ILbhwʺ||w|u|qhiy{Snvlx{adĩrz|pe_Q_VeyWbkL1MifSPfùgbrbevmmfT{g`GgmSn_tx{rq}k`[vxYei}pqgf|rYZYHYYIaqj|mz~t}vrwr{q_~|zyj{qs}yqvZ[`USGE/LRA]ae}ş°r|quejh{tkksaU^XXN_pu[{trt~mzt~stlujjtJ`aYU@K`DO^qbnòy|~|}ouh}wxpgr}XwjwvpM[us_c`L9a^?5Jl`dUn~srkxyzmy[dywTQe]qq]^l|ujadzdzuisWcndYzck]FCdckusy{ytdl}mffqik]zpx|zrmudldfotYXLSc_F5Q7dl^clɫïq`xj}tWYZ]diQFZxecr|lyvsn{wxo|rWihdxTV=GkW>KovhuŹzyj{sflr_}dj}uszu}t~whi_tydX\mH4IPB?NUK\b{zwt{fmnyqpmgy\qkton{s{xwssu}btze[wmoh]dMTdLN[Vm}ou~l|r{_vjdaory~u}ti}|fltf|rYLVQYRQLUVJTRs{t{|ymj]Qeyut[qx{xi~q[qsgdrf_Kcvc\@U^_k_Xvy~ybxl_{}~xeZgxYwx|tzzvnYboifNxjgYF>RNDJKYWgQ\_zʳƶyu~r|k|fhZXqth[|upyjppntheigzrXI_;]dLF?d}ortlurwu_ezsb{{ygltzvqxpY[aZoUbI@e^HF\VJ2FLSPvv~yp[omcjnpra|w~~zv}n|~{ynUTj`WYbQaKQoPdqrq|tkwwovys{ktsxish]e\|ynnktdVihjjUfX^aEKG>F`PRV]bqjtƭnnylxrsnkUi~or~{j~ix~|idtkirifk`WJ8Y^^M?pzz|yreg|__zj{esmvhz}zp~z~l}c^dCcpbS7HbcMMVG7IN@Egxdo{Ud|~jf`|wdqzrxqmXX`QHo[LJMrfadiv|{w`hPMMd}sfhv\UQWWeKfnfhobRL\Y^mng~^klggcaGZ]GAmiXb_vw{{{sPa_Txv|yozltwvypox{~vx~fT&]ZWage|t~^n{xzlfflZfxu|xv=G`TXM`b^QqbjuyrqrrZmfdLC{vx]M>L^RJmts{zm}krmcmrc`{zslSIrB1A?<6,cQYpd^oy|y~}anj{xgyjqv[I\TKgp}toy{}poVqtjmu~|]O9Zdn໪qde\g`}wrcryh]^gJ|smVSOsxnq}smRPeh{tv~bot~ukmlvmd¬~QVJP\mt^R_dOVjH_RP[VbskZ]Ujk{}zpPfaem\WgP\fe\ZhdLCRILj{}rhWYih¸mj^Yc_jK_oncjtaT7BM?Fzngqbwgcnsqty{~qgo[jimertgcqst{~zxml{^f\A/30GQdtgSLdNK\cJbae}uwpy{vp{znz|mk}ZTS[dl{um{zx`PWdyxvkY`pKcuV`a_QG3IcYcroxx}hbfasch|}qnvq]MIfbtscPjrgdWyywvws}kjkxbTC`үd[gm]_art~qmq{`jc]{ttrg~sh\rp}jjkfRO^\HLBr{}uuokghUABSr{ta^?BU=;\NHH?^SECKW[gpwkwzoagj||uVbi{mty}ڽ}th`RM2Iqpotfnr|xt}g[ia]^^Wrgq{toTntgkju[]esd]_QV[_pzq~}~jssloyn}}xxzqopVjlz׾ѳ{ubepltotyrylUSHd\e|v|o~v~s|unc\FYlv}rgug\vktiULM3.C`fzybxfgz`dfVSpeeXJZrmmsk^`]HGXZZXP{gjudZ_YMaLTpyyIJ~|tv~ihZitn~~skxcg_idTc_PA>Ek\yor|keoxisxw`y|j`[ctnqhqnvtuvttsrtpmUL@QN4<Rw_JUZVTmpjqpr||snO??Jw~nr{{s~wfep}^fn^fuwqi=9Car\kT[sxwveqfcfkvlvy]tlr|to}lT=ORnqv{}{m^Tl~y~~xzbF8@dt}uZPlt`h`iwxrubr^\RUl{s|}y}vUsmKIAY||yir|u}r[LUE1?Akyvyjpg\VWUmgvo]w{qlzxjzr~q~vf^]G9;Mh}t{~y|}odRF*/Nhw{{wqobUvf[iuZR\^m\rfjsnnvvizbeWM>Bxwvmxriot}~sctQRO>EZt||pltqZrtrnfj^P{bYcp{zv}loh_ogJZQ5Sg~|~t{qkkM@<.)N~qube\SXd^ddhtgskciqqzauwwz}}zcL?B69Uzy|{}{vr~{ytqkIG6=RT|sxwvehbM]dNOc\hayzqkxyqedc{mcwXK_\Ucjvltrqumif]be/?VLWnebf}helflr{gVkYTgsqwzx|tatdcca@0DXH_}~{yztwcbTB).6AQ|vnojgb[WNd{c[ajp{~id|ug{rl}|tlepSBTDFOau~{vs{}~ytpypp]fpRFRAQ^tyrpiWof]q\LURX|}wddi`_gfifPqeLTQQcn~gvxpz{uqrhUKOU@9KI[ƹwovqzea|uoivr\Ogo^q{qzt|hndPRUO:@ISEd}s|yxbMo^68A:=N}yhb^Y\`ZptNgvpkr{o|s^[vzfqmnspqxLCO:AJ`~sm~zqtzvu{bkqllP:rsYGhZQWZlwuzwlpbiSLwwzisswuprso>dejo{i~tfU\~r]Ydp~}csyv}pysjx|WG|R\ryyu|twxux|n~~~^-?omqu{{lvzwztbkmxigxzq'-[jiU[yvfaxuj[xntyvkgu]_olyuottvtj<2x}tq}roxvvxa_{scDDkxj`_UDb`GclnjjmrZ_yiQLdpvwwuzjmgegeZdV?Njsyomzn}zr_LC1$WtvfSWP>BNQWaM^kdkdM[kj~|w{xwfhNJI-9c}~|z|yw|wyk]BEJ2VgsiaTV[GJJGHP[[@P~osvddg~xgrhacl^KQwvrw|{cj~}xrtQF\XCHthO^yZN^\`gjhaLZ\=;Rhw}y{`|~ijg^OBFdI=g}nm}uy`{}fPC38?1PcprbTPNIFSeQSV[h]]z~{}z~xtx}~wrq\K]OKDB`{xwyuy}zuqjYNHCFNypxta_PNhVMPKACJM]genyfbjktkUgeWRZUWizplwsj~yhYLSN1ESOrǻwf[gv]Iekf_\ZW>HlNLn{ww}mlt]UOFA=?\RJt~}ps}z^`eC52>CBcmeuaOHJOQR^IBYbiZbwyibmsruwri^CDHHIQww}{rklnnwhZI>@JFfvloicT]QBA89LVVkqttv|la\X_jQLLEWnk{}zqwt|tkeYQKAD6.\kuŰz^]iofS`a^bc\UIZaJ`uy}|}{r[guYPLB42Ggdrtsxz|y~}mRQB)(5JSnŹxY[VWSJEM^HCZecnyyvvoe}djyukaZU>1X`R`||usoppnw|m|z_`YOKIL_Wa|xhgcLXdKECENKIvxqsslZW\[[`EBSTacb{t|tuzn{gc[J=/PdzuhN@MTjoU^`YSOPUSeyspNM}jWQn|qqjt{hc_XTS\ĵaKoLJWrvnlk^Qli[lxcMOϮxyed^XMA[rWdsdb{u<(cjH9>HMQJ[t]Xrzrz\AMxs_fzvlgrzrǫ~Yg|]MJLE>OG;;?H:+UyyzcVnc\J4+Rwn|m~sac׼kfq[SWGE?82+.Pbelxl^YGDsysmlrdbjt~yyreS=0(6wƶxhg[ceRLMNbupswo^Xlwf`i[agVXsŹzfZE+KtmnoZTL<1>N\W_yvmdbb_WsvXetrf_lIJ|zytont³tnoS0%;moSRu}vzxtqmwoxlkk\PjdMMRB"&Vqgfa_^^]p~oV95micwkRM\inrtgawdTMA/ %Wtzumifzqj[H=GvviTVWD=919Ij˻xo`KF>742>X^rxku~}ondR;:ETx}|{rsxfZL;5Ed´~~cS_UA:;N`Vdnfdloc\m~pdfqitg^ggWUmmstPE9) +W|mh^QFVs|vusbh|[alhcnynzk^XPMN]bQTI6?o~]Rlja\URT]yiqwhgfTUlZGDGH>G¹~riinyqdWJDNreOKYWQ@>Tg{yvju^LD:01GywfWdx~~vqtfc_VPYzɿ~jjmXME?I^nsuu]_V?1:WpV^bGC@+(J~jgvhJ@947AYrisvxti`NB^sy¯lRaY8*!"D½zXQYULQk|gitohivx\Qz~g^XRTiulxn__hokyscyS?86@]|kbYTPXpqtme_^YFMoiPDO^oξ~od[UV_uru~^B/1BPhrgolic^bm{ukYhoUHDGUf{|zt_SWd{~{|ma[W[l}jZa\UT@9Oj}pgegr_E?:6;Q{{jcyzntzZOVUT_~Ǽy_]aK=4/5Klvwz_XaUEKi}v}vrv{vfP^\A=D=3Mǿ|q^OGEITn~p~}zujaYK@Tymqher~l^kU=3,(1TiODNTOWrpgx{tmp|xW`}qgc^[dxmffowrzZenX?.%%6^}tlhdauyqnhUQlk\HOd¼vgdjqfku]TMECPmtlse`bRCNf~ncwfQLF>=Nvxi]f~}tndXnqJ@KOMUr˻ôz}xaUKEFQm}fpxj|uQKWQ>=X}w}~zdZm_GEKD2=qǹvaND@@F\a]zzo|u|rngXJUwl^frydagM=6/',H~ƺ|dTZfacrlryxzagtkgd^W[r{nwsbZX`lkplsrfZF709Y}ļypgc`\cpxzrnhVQjh`ZFIbzpowna^j|}hWpiZUOJNc̾}~kgjaPRn}cSs}YD=716Mq|wlm|tbVptM7?dȸjXQRYmvk{zotmnze^ZSLOmyv}jZbsyxodiU=6304Iuƾs^LN`kurft{rkkmedj]W]_]au|vf^Zarf]bMEI@37Oyyoihlu|z}tphTUi]TYQ@Ilyv^TOQXgln}kXQI?IttZZago~w}sTTdRA=<>Mrydfppmx}nIRj\NKLP_~qst`UV^`\ouXe~mTHDFSpxplkk}umeTCVfS;1=QkzdWOMR_zsevvZE;DXg{}xxuw}jSEUP815BXnºupjYOTbzpwug_e}va[[]dsxuztp_Yk}jYNWaE-),2B`zk\Xlwxqng^msSGQZ_muw{i\UT^t~p[a`@8HNJVu{qiglwutqhbRDVZGFRUN\|zdZZborsueZkfPIIGH^jUWest|~dXeXD@@COm|aSZkpv}q}|roslNH[UNOT[lȷl^ZamounT[ibVIBDTswpoqt~rj`LAV[OC58Mmu^RKLSb}qpxaSILdrlnnr{t[BHTA105B\{Ǽqqpc\aswvs[Vr{eZXXYe{ypzwlmi\[pjRYtcB767?U{ȽqcX\ww|toeYj}_EITYbz~n`XUZhv~kYdb@0;FBF_~vtw}zo\UhcOMUXORv{ydWV[fz{stpn`csdQLJDARw^ZfruvvcbeP@<;9B_p`ct|yz}wwlWWXMKLLN[yͼqd`eqtw|{n_if`]QDANkunllnvx}zofYCEXSJF70@`Ǵre_]ammwp]RE@Rqphknrx|^FRWB523:Opʿtnrla_lvlr}]Tr|ja_]\f{~spqj^dlNKkhI7214EeǼ}rg`j|ukZb~rQCHPXip`VQRZmv~wchs\@9DOR^x|wvzyucR]hVHJRVU]{yeYW]kypqre]VfnYLIGDFX||e[fwwsoxqVIFDDNjm[Vexqtunj`Y_S@BILP`ǰtg`bo~tmaj_OTUJBMi~wqqu{vvl_JEXTHKJ=GYħePIFQJC2:F+&:dth]][W_`tTU>0IRXPTfyZP~xhYNQWqqi}`Semimvp||tdɗP`sb~nauxrfWkpYXstxYSy{lo}YiYMfUHEZwp}fcMmvkfg~ZE,bvTPs|Uqpxl`jwl]vhYcY_<34m||ca~eUni`Sp{nbm^eu|nox~SF@yqlF7AIE^Xm|}mM[c^Te|{siO_dVFY[tRXVp|Ƕnna]TYkVy_fX_^dñti=017CCHTNos{drp~msTW}kkq\wtvtzjVN(SUBht˾tlxezhw~uwʹ˶t[[Ch|^d<36%PK?U<0VQcjnipylUYht|o[hgFDcomwd{wu`ppx}|`oU]|iqNYb`Z8myekL=LY]XOUCw}}|xzv]e_`}msR_~elesk^`[Sb}zlN[SS16z|ÿɫhPtg]?Ui[Z`Yb_KW9UmVptOgkcm]swio}wh^kkghwĸb`ecfJWSeulɱ~]`xiQ.MMPmcyhVvaek`gLHihjNQpf{jhI>rrxcrqx}qW`O{uog^iqjzҽt{ze[tUUfLfwV`yT[gclzI^xkInpggquzqkOpkOifSxlgfQa[Wwx|uzżnV|hkzcpiq}wIIODOmʗƽkwV=2?GNHV^Psh^tepzolzWTlapup|igE;jbmYkl~t|}opcODSUXUpmf][fNOmed85_ECXdhrw^okTMVmx{soJ_hK^iV~hzcâzkfoi|{\UTZn^i˟yjnr|TXOTL:5;OW_ctc{r}}fsk}{jqX3ehMY{tq^{ffeswsxtet{ca>@KZ=Uֺпs^ZC_bMj~it[FWUhf\pKrp^fufs{xfbMcMHJqxajhtx}zeǬrqgusO4.%MONvcRnZgtTWSXmzi^xpvdaYf_WHMB^xhyrljRdgìv{}ns[rpsxstvt_dNH;B{v~}f^swgakyhSDKBgte~yg~xjqgllXbs}i/N[fxÛ]vs_khy”¹pyxp__`\f<3szĈ~m\PUmtE[n{fa_X]bzp{gpy~|xT{wKJZH%^^hŸt}|pzwovly~it|^NLC<\_hӦkavuSVhfqhkRntvt|nltmahhnP`S=X:|mZkqg{n`dyhpkKhIZNEZXiƽu{mry][uLMNk^r}ybcb]dmcgvnYZVJ[sZi{zsu{~}tobnMvRO]P8^hdFxqowo^Ef^^ZGldkv{xW|ycat{{_GV[Wejayqn^irixxoqkc}RN)5b;4J{~ookogYej`n{q}k|dfWgzZsVosATXUbl`pyjtmUrvtsmpeevvmqV8EM?ZURoiͼrypi`PZldgyzwmiWUH}fMQ}weneWBormbcf|szwi~oijidgXB@LMZoiww|rzppnZcyjm{}u{zvhinY`z_kZXf=6IkZvyp{gyu~abxc`XADIAF\oþusbjf}Vlys[kx{snfbql_nrbqiCIV?QOy|ǽ{ljntgSIapWv~l;@[S`Qmòvom]BepQLokfvtvsfieWYhiejYN`aSm~~voqtso|weunPLAopH5DD3^wzj|x~ec\Tlk]ggriv~XqtlYpogeR;CYbmwohkt\~|qms_WdWSa?'%2gbZzıкqy}jbf`m~swsbdw|R]xa\n~]^|k`KTig~pjnb[hs{}ZZSn]DTm]^E9L`KYs~ZZovib|x|}t|s~wPPWq}C_~ID]_KVaf^^w_|cT_]DTL[E('3Xesʳoqo~glo|mr{slwvxrwSRXS\ljfNXPPZh{žy|qkmx~~m{ipv`hPyvdW?9?8Vxbħuilz[yk?^juo|opjhW^^V}mkbQP;SiSooŸt}lzisbyolhWueFX\[UMkG:UWinq}qcHQzZnmy]onrYY]]m[@XGRfZv~ryvycptv|txS\_FE6AbbL=ObCs̬|`uqzmnxutvd|n}~vgpfjnpoLSW@L_YgmnipYxufiqZONBi\A@-=GXzyЫįr}wsuptq{|~~kweZafia`rs]cDWjikmy|wfvyotgyrSWngtYT_ULL1ROGmv|пtr^`n|jm|urnzomNYiY`ZWIM_ldvww|ufZ|gghnkedrhXX862FeYWtmȥp}uk{nybu|zzx{plX]v`WfBA[HQGdux|ͥ|~zqdlvtspcVx`VHOoiTWGH>7s{~ʽqpkl\}ieypn{krxqcIvZ?WR`kdo[|}wsThcf`upNct]`[kK>C90;jnpt}xo|xvnhzvag_eVqtrfs`@OSaZuqt}vsy]w~qx||\XU`NSfL98WVcZvxd|nbztayg}{skJXRXLZeRG?V@I`ti޵~ntxxxmgujN^qtUeZ;__azzym|exvy}VonKihXkp~}|z{~\_q|{Z|ytw}¤~wzt|z|pTvQHlrNT\ozxTeqmjyuqT?~tpe`mved`cmotVzfpbheJdebvvq}nv|awxdvqLjhYbguwx|zafz{P}|{nvz}w|wzfQlAFmiHQYmr}mUhmfhwpqJE{kkbcuvejkpxY|[qZ`QCiZf{n|y|t}qvx~XsYEkyWV^nu~z[iwvunVzxzb~|tx{~~jsN\Z6TpXJVfp{[`rpk|wiBqsseqmkmho|q\heYfS`FT}n^zzv~~zj~xu}t{g^sJ[s\bmtyz}s}kd~z]~~zxkp|r~yt|utdRjCNqjOQ^gp{zzhu|}oH_qsegrgkcezslcv\waeQQup\opiz}}|nu|w}w`{W[{vYWdilrv~mk{^n}y{~ngv|xonNiKDdjOIV`^ypx}jvxsSPzsp_ovogy|[}]lh\TF_nXdhfkzpvt}^ndMhxaRXg`}vy|qoy}zk\xuwsant{}wp|zmnXV]>Rk^KM`Yr{vrznRpy|klzvwhgzxfdqWq_ZLLjfcomjsvtzwprYsZYuyaWehgr|zf~qhkrzqxxobwv|ok|xjnW_\E\m]LPbWytu|xhTyv|envxtdhxzapraxe[NRlbiljfr}suy~tu`v[]uv^Sc_dk{x~gv|cgn|uzul`q~t|~vrn~xijWY\CUh]KL`Rtvs~jWs{}ni~~miz}iiw\thWLKc`hpkkn{q|wmt\m[UmuaS^d`q|hz~~hdu{p~tuh^fzsypsipruk^]M_GNegTL`\kszw`ey}a|sfqyxZvagt]TM]kk~tyn|jzl}zpoeblUdxr_Zl^zr~rs~~ucvo~vsqneavyz}zb|tetnv^dR\VI]k_OWe[v{f]xhpzjjx`pp`yhWPVjh~xwpwrory}zkn^nY\qsbUf^jmz~qvcklxoryla]mu|~t|cuwbqjs]]SUWFWibRReY}}j`}}rmnkw~`kq]ukUOTgh{yuxtmpuz{wfj]kX[nsdWh`no}|svfqmt}{lnwh]\mr~u{z^qm_nfmX[QYUJ\leTYf[x}kfzmt|kju{^okaxiVS[hoz}t~molxw{qiielYbtscZkZzo{r~of|myr}pwnc]`nq~zwl_wxcgmjiX[U^NPcj^PaYjnȵvgrycvjr}mhvfoz^SSadtyn~h}vq~vzijdlaZiskX``\k~qwflyktwzp}rskYYdg~v}ny}_oxjaogiZVU\RKZfbRX^Wp~Ǽmpym~mnysgsli{fRR[_wr{nlxxo}vvmeelcYeqn]^dVqw{mkozr~tr}{oyupqXX_bxt|mcjtl`nid`UV^WLVefWT`Owr~zǴus}prktziqqivuWSX]luyqwto|py{rtheok]anrfZfSsfw~n}rl{}hzntpvwrvaVY^e{tsl~s`opdfpce\S^_PP]f_Q\Q_d~мs{zmpo~qrsrn}iSUY\~pyjmw~xrwqrdhrd\doo_]`Qqnsono{}pwow|pvtpwzZTXYlrumqkcnkbim^bXPb[MQ^e^S^Mleѹw~nopnspqm|dRUX`tznlwztr~snq`jsb]epoab^Vnss~qor{}pultworposxXTXYotwoqi_ig_ekZ_YNb]OR^gaV_Ohf|Ѽñy|rqn}nspsm{nVX[`wrkqvsoztjsbewe^dpqeabSvjsyrֽ wwSO`w]]hLyxpoYITy|yteWZWbqki_|_R:MfOUJcsegtzyz}mwjvrqitvfotdoHUbw`^dd}}}}hio~mnmv{pwh||r[[gwvpwgoh~vlx|yy^Wu|xsyy\[^^u~sP.*KYI1+JA>J]ihgo`yes{{wxw_L_r}kX\]jz|prS`pyˮrK1Mhem^BF@NdUENe{aph]uqfTTl{yu}`X[Yuqtil}p|_W2-Gdw_zrdiu}x}k}qļϷƭj_LIcpOICImaSVJbqlv_nhaT9IYkz|rdqpnu|}ro}xkga[HDgxrulwyir{uvxeeIC!'EfiiVT[`[VUCksVuj]ec^Kdpzyuusiqk\Zqiidt~~uvcsf^SI4A`xƮ}a_N_eNDNdjThR[qedVJPpvvyprsXVT[|mpbuyii`UH,;Niuytot~tu|yͯǾpndVIQxq^VPqu\_RZulskei_^>@KZmorexnr|~tgms`b[NA\bzzpq~ko~xuo}~y~gaMG%"3KozjefjfaWGnqTojV_`XKa_v}}vustpvlYRdsph|{oflt~a]UF5GIfշwh\oeOLWhbZaRflgcPDLjivtpxnWWPloogdw}kh\\=05>Xyx{y{|i}~wƸЮ|shTDJoĴscntkdZn|lwmgagT>AAOf}wwg|usu}}evvqi_b[IPTS{m~vktqly~}i[UE%%'9\yxysnUV{jXqeT^_SU`Rp}zoyqv~xznZP_||}vp}pihj}~|`ZVH:H?RzŶƚ|jzt^U]hi_`YckifVFF]^hoytx_YQfsqkdxt{tcY^G233Fdl~xw{Զ˿~xzrk\ID[u|ǰxsvtejxqzj_ebEB?CXo{nhwwynfivy[Z[OJXJ`ȶ|sroz|np}twy{rYMP8$'+Cf}wűy_YTEajow{fiXctrr~lal~w^hq~rz~d_^bwv}|ufap_dtZTYQK[OZzQN|EAL^jrsj_ayumvtm|n`h\CBALe|z~r^ezckoV]e`fvjį|pyoly{vnv¼ŮzpKfh\XB>PC8?DXr|vrrw|m|pX^^Vci_{XLRWmuhhilnj`\jymaUozrrtjdjqƖnSHOnĒssP9>;7MKPsxojR`moxzw|}xnnx]IHko|grnXZ\f|y}{ƮiT:.I^t~tjd_VH?EYScsWlaX_H:/Ic]puvrvvZVdSHMPavzyhphYPVjgkjfyzur}}jJ65_nϼ_b\A>Yjy}z{wmgoz~pbYu{svvks\KAKd̬~]]UP`VTruyyxvb]HXhmttu}y~yqquyiPAJrvïm|t`aaj}~|WM26Qf{xoj_QIRYPnhWmXWYD66Y^`tu|p}qR^cNNNRev|o\~cWR_szjpkup|stsV?3QgnӲumrYLFCO`i^j}Tki^V[gvpkzjyiS[Z`sbgp`PUm}s|oggi\HPY^i}~cWȕvmm|si{ɯukTEW|~gncOjq^PIP]dY{x^^QWPX^aMGSY_k}xoaZdnwzbhhVQijdygHLoq|}hWp|hef[DJW`nϸ˵aCAvi[;%0+#3NIThm~bllVK=MA434C\nmkvk]sukjvy{rTPQec`rmzvx|qvϵt_\ALkx~|{zcgrdT_js{v{wmhbbn¥|xp~|nllxòuPFFYSWkl`B;BGLSZbu^DjdRSNKKTUbw_nnV]`U`xs|d`_LMQcxorq~sse[TVetyhfSL\WQcehtqboSCL;548Jbmmsvhfzunq}{|{uaMLYgXipu}tzvù`aL??G_zf]af[QnsfZN^N67BTB@]p{~jbuoY[elt|llib`cnsw}njel{VIL\NJo~{ZPQQTX]fz`HqlWVQMJLG\tdttZ_d\kxmzge\KHFRntqvr]yYidMKXdlyurdbz}clujglcn{pykLd~NDRemwph\NbehXEWfq{nqjqwKeLKSZRY}zizwp]XPKTdp{m`cc[GPjo[et{xwslgpv~|pnljjceiAJsdzVUH=IDHKKTcmt|s||n{lTVju_dyotVD`{`^v{yl|ucfo|eUU~pQ^\NK?NWDF[scWflnmhizqnrppsuyk~{wpdMMeWMnxw~vskcafjyoglV.)Akŋ{^P[fmomjzyOZwdWPKJGBJ||w|^[VZvtkfluq]baU\WYZRX|uzoxt[\zƩzrkmtP/QZRgn{UZj[ZdV]syYV^hlYISQaqtzvrxvwh]QTuys~]`{noy|qlzh~~mamr_QEMi|yf^QLfT5HOII:BL;:SofbupzgwtqmmkjPVZru}ռmxrYYmvcnp8:M^{pZJIO/!NZMR\fkgYmn]fnVYx}wqh\]]dspy{|xv{|rqxsstsibugk]42F\}wstp[SYQQJEEBFThvv{tlhq[HQgca_q[kuipkz|una^YbkmsyxrmVKJF`tyt`Q=HPFQrplx|pbfQy{wz~}tx{dZpsmr{y|{}vqY]spap}yllc=Jtxy~~zvtxbfootxvidojyv^iushbWX_ep}vjh\iuv{uymh~|xyc}btkmtxti{rWTU:3Tumrqoidgeeiprwrcmn{wf\h[ISlg[kvyxqipmSo{z}Zk|omjjo{|tk__a`eloswhkrnwems__u{edpvth_OmmRGHNTU[c\pvkrtodbeho{|rnu`Sf{sxjPty]xwqy}kyuchuaUm~{u`IJRUSWbhnx}jrih}~o~jdXUlngywmqr}qluhPb~uigd`bglsr`lmgy{jzyxqeniRUibUdr{}xQTqlhloqsu|bmzzouxwis¿wjjjlt}rwxjzouvcfztbhnoomfheABejq^]xqYQTXWLVxwd^hbBD^ysiw}rjmonrx~xƵĮsqoxidvpvkji`KE_^LL`o[\ujUY\K:889@L[lymrqs}~~xsdfulh}rv|yzwkgz}hTe}jgnbNIMPXcnwsk~tn|oeRDMD4BPEI^lwxVetklu~wav}uwmmjinu}n~|lxzoamxmv|nuxxywqsrRQjgdksz|wv~nPTqt\RTVREQstgfsvYRg}~{yy{z}ɸ|o{yeitz|~eK^f`hv{wxr_ShpZOT_N9HavutwZSbXA:<>DP]m|tk|nz~q~x}|pombP[tjXU`aHKju~n\XUQPRV^^JUi^dv|~~ofSKWMDTUGO`jvjxwx}p}sWJGFHP]l~zox|ikqabm_T^einokmmROhjiowvXUms]PT[[Rawt~k`vywx|~m^gf[isfixw[g{y}jswqtrdR_p`ON[[CGe}fTeo[LNQU]hut|zn{xrtqcZq}k]]h_HUv}pi[YWUVX^g^Nbm`m~wkWV`VUe`Yiwvl{roofmxj^yĿwrsYQPPSX^gm[Tmkg}yiqvjpve_hjkliejhTb}t[ay|g`fke\o~oo|klpziggegksqj_h`Va\NVbhnrpouh[stwrto^WnubW[iaOa|_WmjSLPW_jt}r}sckwqx{yedy}g\`c\P_ujYVagTUwq|jgfcbdgpjVdypusjXRa`\jg^jw~ui|xv|yypuwg|fcxmRJJLOU\hn\Yuwqx|oksuuvsnqn^g}s`ez|g_cf]WnqddooY]~}usrqru{vg~t_Ze][bUP]fkqrnoqce}r`j{mZV`hVRrkQ_oYEEHLS[ftrarzr~|pw}}|xrpgtu`]_YKSnm]Ycqh[tskheddhrr]b}xpsjXGPVOWTJVgr}zx|~yikpinzsaqeaymPHIKQXbptaew|ru||||vpqj]dprtw|}bW_tsa]cdZa~wqv}gotrsjkklos}kj{t`cmghbSXdipvvtwvlq~leyyeXXb`JMnzvh]wz]PPSX_iwrl~rrqq{~}~tr}xvvdb_SMcrf\^kra[y¿qkgedejp`PdvgcszfZgieeVS`jqy~||xqx~~~tftzjgoyn_uhonSKJKOU`miYiv|wiotsuuqmnmfiswy~tkn~|e\\WKSnrfdkyyej|uvihhjms~nl~ganlh_NQ]cjqtrtvqnu|}ogzsfdlrbWppVew_HEGLT]kyqdz{|o|xq|~~}vx{txi`^UITkgZW^kiXbwtsstv~{dc}oo~~xmXUegd\NTbjqy|z{~{v{rk~xkiqymby~bmhMECEJP[g_Pc~yn{w}~wpmlfcjorvoijy|h]]XNWrthdjwyhkyokkmpt}~ke~zxaUbfaXGFRZ_fighmpouvgrr`Z^hbS`y[ZuoSHIMT\gvwfnxvos|~~yvxxsxviemxkXSQGD\kbZ\huogynkjjkpwkWc}zlt{seRVgifZR^ls{~~yjj~mbbkqd`}eQft]IEHMT]jrd]w~xqx{zzwpjjliirx{}zjgl}}kdc]Vg|wkho||ny|{yjffgimvp[^ztvznZVgmh\NTagmrroouyx|lfx{i[Y`i`XqnXg|lUOQW^gs}rfzpyogotuvuojkqppypklz{h\YQHVkfZW^lqgrrljjknunY\xttxlXUhqnaU^kry~~{z}wpaauwg]^hrkfjUfu`HACHNVck]Wq¼vqy|{|yrllrpnu|zmjm}}ldbZVj|tigo{{o|tzsfdeils{o^k{}tePRdi`NFR]cinmjlv{xyksxf^`il`c|a\vzaQOSZakwucjwt|ns{}~~yrnsxrqzpjgnym\UNDLdfZUYfqljþ|rppqszwa\s{o|}taUetrbRXelrxyurx~zxii|}k`^emh_siVdtaH?@ELTbgWUpzƾyx|skmuphow{yroq~{j`YOSkshadmyyquifhjnuubYm~nu}ubPZllZFGS[agigekyzs{ļtpsfbfnl`k|u^f{qWKKQXaowkcyy~pktyy{yrihrtfiɷs`U:?;:2%52?ND;Tx\7]zs||{fuxoocdpacPPY_w|^DXtx||~ozQBsˈUXZqpukc|znc^O_\ZWHNK[v}jnY/Sur}os~peebf|tyjb`XdrfU`s},aЫ}dWaegdTfgXKJ?OZW^POC>KYYgvzvyyp|f0Ivrb`inqecedmwɾzxh/ Uó{mjS^cN;86@VNWOPK<16E]kv~}xdzvgj]YQYpyJ?h]ktreex{~k\EBPK:ïĨzgbt`C399LE@?:BCA3.FjljfsthidZL>EktHiʱwbg~xdtóq{whL3/LA(w²˫{qoatuW;:>EI76000@D6-`t}}bq{ormskaI=FvlTɳo_v|vosxya·IJpr|~yiH1+P@E̯Үme`\[zqR9ABG:+*')-BF5:y{|buoopqsj]F:Jnoйhcqggdpwl˻Ǯ}gw~u]C,2ZGlŵٻr`[UO`}kJ;GE@)#!$)AM5Vyte{ktprkfSF:[rؽwarpe`aZvlӻ¤knxmTE,H[Tֵƕ}a]TLLpz^>CJA. "%"1IH8tgkpnqolg[JDC~ȯjczg`cYbqȹʽƳqdwxr[M:8aT}Žӣj\XNH]|nM>KF8%%',+BQ5dz|sbt{imkkfaKG;g|׶r`}i^^ZW{mԺθĸtcn|xtbOD2YXgѷղu]^RKVyx[@KL>*%&0!%=P11HK19|x\^k^bgflPF7G{r;zdtjWVXNth¹ĭohlxuueRM6L>Eĭκxzf^d~m[unM?:B=Ba_3Fpgq^mu~mb=PaNior^ikyoXac[GHnҾӾȺnhx{bY]^bZ=4+EFJ۲~pmg^k^qn:@odazeV:Wn[~ڪ~xvuQ[sXIP\P^uy0neSqv{ZZk|sbKbaJ^FDIYePvʯx_zymy{w{suŸϸɖrorrtgdbpeN;UkCnx¨towewqEN3:C@oiN_gVf|nF_^vd{]]nulOLiwWe״˩sh\xsyepŮuv{imXKU;P3@U\vcwͿudymkvXNQ[jY^zpHXXoxrj_|i[xqeir|kWQ~Zkxzhu~neZQi]ˬj[tp~PFPWedG:5-2`zjk}á||_d>fj]us|ru]`XumE;9C[`[HWkfXjʭxZg}```WrySwsgasmL.GlM7/7 LpcOX֩ɱ||y|i^_IPydVvmurspdivb[fV?:KE41jcRxηx{dYoup~|tLegHR@9;?-BZODKfݻsfG|{gjaVkr|qrogXU*?UkJNbWXTx~gkcZfo`Wõ}kLUgg>H.GAOF3GivVvvZX`CcsH[sp¨{stvdbh\S[>>Z}w[Xdÿ|ng[olXIt[pqrOcWhW@7KB?O`^YbuɫszoinRT{v`Mbqec~jfZmpgW2^~ZMXul_Lyw^Whtcujzpkdd{qB_WF,WX8LUM9mɿԹ{}~pa\qbxULX~~zqRd^ConJMcrqɟ~}Yq\daDk~}ls_`waXNAAE27F_W``Sϴ~nitY:lt][cT~Ll}quWQ>dR=KQ[jw]sǩv~|}bQyjll{jYq}WivT%=gM=;TMYW}ttѼɴvcnty^blvhUjzMUq^hs\CTqWZbV:^mvwV{idgcv|uv{[hslM]vH&)3+HGEizʳ}zv}c`hxxy[wyq_qY?XZC%?lTFZlMmƮyydzSccp|lp|dZaymg`TMU;L==9f}mL̴Ķ`qicxlxn~cwkUqaFGRWCFOYgtVƯǚuuuzixynQxp{|}ugf[ltoQG@'N:8;9Rqh~ھԻ}v^gcI`pifx}Yvmv`URW?FPYN_geoª|vez[Bp`YngPw\slhssPG/]4*74@Yofn~ݼ\dzdbc_Q}tta>cnSBTTMS^df|}tkso]gnwXvuvdQMCUzjMA^WITN*-mvgg|dl_h~rivw~aSrnB;?+;VNBWȸŮyviclrgm{htnw~dxzku]z]>AEqsvtuiQtk`bpsage`_R^hSHsuToyMrxpz̼~uMYuqihQMuJ$Gzv{u`iwxjinmPm[K_{p}wwx|ypѶǫy|pF=?3B.>QOXfpbns~tpn~fSQYieTƴszrnhxVHfyZUM_uwf>EdNToeZjkzvqvxejukyvgRIU%^}x[0". 7Nrzw~zoyugc`bTsbZA2^M=(^WNS^_[s~]qmrqmw^^I>NX_J@I>r~̸u}j}igupvqmln^dtlv´{QeWSLWm]L9<>PjumQ^ku{mQFMpznu=C~|}I7.j{ZrfZ\]sgwu|^LnmkPbkL/8mƾu{r]auax`k{tcf|¼ůlwm~N\dF:aY]F=Ugx֭qy\v}hYOX^QgbjO]c[evwH0W}{mvzUwdZeknykWhvqowkk]cfej}^E^\Ūz[[n`gk^yashRh|{M}_V=6HPN?>glVWjjzp}zv}xx|~mlchO8@DXbaP_fpzij{rPytklp]qyrZvubMtqæ{zxwO\X]E9!0Y̽|Ǥsy]a}cVbW_yl~xrvlhy=P`HaD<02EFVmrZ\m]ZGpx^bZTU_ss[IKI1=>n:aµyq\Mnqp?$:2FL\ki|vfgm}rk>AwXphm{iyYTbuZYLf|ossl~zZ]`TRd`Fpu|XRƚux_iq>qVXSUZVvrpjoh~Ƌour_VqOLbmvxnWHE'Zvz}jdl^xymhzs^j~b|dzsisѢbRWUI_Onkw~gbdŭUoz`N^G}fv~fRE\tz`YQa6cxacClzxwaqr?>KQBN1tgdx|iYo}^jbvQZ{wzqøf|lc7[sxtYsztvrVQ >ns~^n][mywEYtys`Zp|haFv[Ecru}Yexbf4rt|epr~a[m~rТ~?Jo|iXzQUWdtykXM--^hdd]FX6eykb^P[zqhaz|ui}]hnaLboil^`SZuǨt¬byzVtsf^@RETx}bWprmkP-ucgLBmvnnXLv[;=HEA9-x~u`~vdPmrkn~]lqYnb3SqspbEg}{hX2JqulgbjmCTy}tf[raiAsgB[rwzdbu`g:]yuk~fx_^tvݲK?h|s\mhbdhvvj`E/LkmgeJPFD~v\]OTgugcmWpSvubNCqpjc]R~q¿pl]qzmbPAT>nxzim~ur;A{_lADerebGM}^>=B?=3Ej\~{m_xtos|jrxS|j[.Hfni_Fnz}vjYD_~tqijiGP~xods[j>enH`wvx{h_tu_fMU~btkkUz~}vxʽwT7Oywrfot{zpkZ>>Xooi[OZBlti^RQ[hqgp]fvUTnzi_G[xjic`]tx˹|_VdncXFHXPzz|pi.]sbg;KclaY>Z}\<=AA@Dnz{][zwl{rzpxuH`_@*Gdmo`ZqtneX\orirw^G\~vs|pZ_8ofYr~two`^owhbiPyjlw[ivsyxwwu|v]?8h|yvw~mhrcRVqukVz{h76Xnjn~jzf}u~TqdKrnmvlXoxɃSFEorIyzqftzajefnhzy}Vbw~wzlqnYx}|POeeK_vwldV1^fsxcvfmoqؤƗ94D{S:9Q9$OCbgwqknx}dS@nWadqmgigy{\ar\cYl\BiqtL_̶]ƺԹl~1DuO(@59OxsUFojYS`EcmsH7e~mux{rkuXUiIihn}w;HS~|ZA[iyxɓ|xe}orG6?5fӬcWcF*BPt}bPgyxqT?hY2nafZedu{w_inSejtKbpZk}ay_trywj_~qz{ɴehW;?cݷY=Obm=Rjil`^]OkpJjQLfoY^hTJmgn{z{zy_2ErWQUrqetpnm|qιtϋsxeNjc>QlўfYD^uG3h}qERjkzIZRJYv^{}c\dMNTs}h|lU_RAwqƋcTm}{d{~Ű{zffl9.1Va\˶v]P]WMvXSWUUcqQO\okym__^HoraGZd\`DqqIl~cczWfq_ms|eUMKPQ`{p^fuunoqryɰ{yDGkfI<`ftڣinkrbWWc`niG^dd;>dzhNfkAF^bSSyaNDVj[ETxm||qa]oHC{ki~wyal{tV\mxW@h_i~Y{}|uQpXVmrtmelrsUayOsxnXamo}|S8®ovs_jqlik~zNJ[}|liqhNamxgeYnqf{ztm~wvnV4&Y)NoB;C6sfnsesx{v]mqo]sw}^X[4LtUkZw[`byzpWcNg|ˠnF616n˩ilFBtf^yK5~ljpcMmg]V8?VckjZn{nucwnl6*cgT_{}ow|ki̤Nmi##zӦcOZkoUdjFX_gm\MheK7>zunefla}RKQ;SM-]̐~msm{p]ukty¼Œlnc9F_FbmտvoeiWIUSJah]hUdKC5,DJYhwnwlKvyly\or}nhj5?uʲztx~z{rhtumyy{xSOf=3Wuֻkrk\@go`\Qns[QIJ]9FrkitrsQd]slehaYZTA2`mov~x~|zfvdqǚ°w|`=NK9LLp̷daMUcXZkdnX<_[KKM&$kjzumwa{p[U?@PSa›wwzfuwtMpVWhyǰɴ||theJ.BTYm|ȸpgivQcrYF^cARoC*1*MdXgnms~pe{~y{oTXgVS4Jn}vuvixnuhp|f^Ʊֹ~snjVDJ,8=cľzodkH>r}RODBa^NWo^beMk|vwmqzmsqfiVD;SZ_|~[wrbd`}ddƬzw^ia@.6Ap{Ū}TWLczaNd}moS9]qNQY[\~jc|zuhxuzlTYVYN;j~trs{jS\~{}jy}wzo78VaFL`I@waassvt|giq|lm@[h:K`{|aKTMXrtphaeq}roOA[oY]g|ϭzI{M8A;@57Nu}kxx{_Ntvko{QIvPHFO\rzvuYdzoknssxxnlbgvlɻs5K~jolT9;BSWAfwRnvqd^[OHjoy~er}opow\GM1t`Xo|kL|}o~w{lWRQgȶ~\KG:/gsb}SJxloqyxk_myWQTx}|ozzcnr~\o¯vϤaVhbGCH{mF_]JSk^7X^>OD>]ZKt}flj{h{}r}rcioTTJn}gwqmvftokJc}uӿÝx_`kTA.6hf^apzppisxv|i]jmT[X~lx{{hXgx|`xʽx_ewfVMM}~nSvaHKaS4\[BP<9abXZjkz|ujj{qx}qyxXQAhalkjykmrx^q~ĸĤfZcUF@9\\Oybggvztoz~swm_hmUWLaxtudtntYhìz_Wg_GF=qVoxcVjkHK|f/Qųbd~gQ\qS=gsF?B.B\T`^w~p{sn}swwu[P]YMWNyf}~qjiegbYúqmfLOaTIJJ{Xun[Rk_?Oy[BLBCeeZrhcv|mvcrnnzr[aiVYSavktrxemn[gƻùy}ywaJTXGNEhbbziW`x]Kp|J<=0Id_caskzumsssvbR__S^Sxl{qfjd`V{ȻzupjOESLBQPf|kSagHHsgAB=6\ngot]~unxtyosmPK[SS\`ns~zrvamcnʶwr~slI?TI3Wi]ζ~PrKWoiTjv@3@BZmWbLw~sdnxdwp`q3GeYupǵy|jcc|ZRUYɿsdsV,$69LqpєpgB^y`cz:@F+jsY[fh~sowtcYn|z^=I\pzq~xpem]YVukĠ{ojiWetS&2DD?gvxvRnYGo`E=>'OjzsinuplWpzo]X`I[^j{\ygzhcPuɾkt|gMi:?B6jU^Ş}cl`^n_9Z[2:>_`c|r]d~whr{zjsi^6RYZ[Tđmxy|jhmjsYvdrycyfB8B_EAu}ĵƦdoY_ihqbkII4K}UYn{twybtwlzrTRVK@HkviΨ~pzrjqsrYig|ZsqtnJawJ;HM\Qcȓzgb_^kO~rNFTWPc|hzwo[_nivd>bSSOa~zyyirquZRr~iccpYaJG?0LY_oòf}]UegKQ~UTIro]fkorwlwyw`heopssAGTcoSxftl|hnshqyyn}pudvuj:0N@8Caþ[]R`phrWZ1TieZVy}~sZr]injRJkkWXhvjͼlq]vc]\r{|utTuk]ZSM7ISRSoƽƴuuZpo_wKGTZSXny{}t}wl|b^[nQFfUX?Kl~x̾xstqkiwtii`UZSiMYM1>Ym{mxXOuzpgbU:krf[bsmoj]sviwgeJEbOSvxw{fkwlambsuth~naacF'5a`\^Ѵºtw~jQef}hk[J[gx}wjsUZ{hXFjmIENF?`p~|qvgvepyl~{{ruggmTO>C:+YS]Ofپxw]xr|dC?jvwv~{n|jcgtpY]BUcY]NInv~gumNll^`gjsw|vYWHpGIZRTJa}uͳ|ygnrjaT`6g|nkMkeu{sd^nYj}re_^D1Xtez}~l^r}rttwqxOYeS<1U`F24GEW;gmaxUjhxkmztxtp{_an||d[dOGDSLC{|t}luwfx[c}twziaurbERVR99RRao¹‘kx`?[pt]S^TXkoeryChisYq\^XQzwy||zzvy}nsudP\|~vqr^SUUQ/^dJ[jh[bʱӽɪs\D^yzOZW{skuu{kaxrhAuwR8ZUN8@]Rfcaȭwjn~_g~{supz^jll:*>PR]G7KY_c[Ĭluchongz\smrCbTxnntdNiiNO[bD Gp^jV̽~|vwp\`dnmi{vJ|gtW;&+LidJNkSZa~ѵkxpm}w`KohlXl^uVXj[`U]Q7,Q`ameƠ~z_Ybfgjqp}{ѯ_bnH5Obsp_fmsh~ioźtzy[aINjC?Z^y̢ZcȌSV^gfp~t_qzpr_[zt}zwfan\eITOdp`h`x{ef!'TsIEgt_Y_qseĠ}|yxdfbbY~KR_}qy}g^QSelUafnylrv\fkeYfZh~ջªb4kڳr.';Zg82jwNHPeykm|~~Uc{RcI~~LNayqgn}seTcaGNgsuu~vqsͻwL|Q68^cJA?dhfolpR~~k`|uru|\o]YeSz\Pqge_rwwxehwyxt|gn||~URmnPDƵwmtzsM5LN61C]fHtw}rcqkkR[yvzsj[haryVZevjutsjXhobmyz|frvªm}kuomqnR~˟jnsuW-O{cJTSomehPb\|~}v{ky{jI[V[wrhLZyq|zaYZPv~ƵvqQ`r^eyj˩WJZlraiafroSGikB4:PbRxkhMReVZPgnnefzZdAftdstswgsutotauyjd|nyã¬yv|}}fv|ZT`\SVwfF2Sn]ZkkqQe]q|i}twkj|jnw\dN|~x\Ymbru]Z\oyuSMzrhpykk|ɾ~qtzv]WgngQ|ո}z}mYehNBIPhQim\dG^`d`Xzrmj]PxjrgggiswaU{~mdx{crlY\vrkzrl{xrxgf}eQSXWV˰tXGhmSZa\ZSR}gpfkmlviu{YaMftlh^[qt~{`TRYro`N~lis{p~rլ}oxbQUccbTp̸|{{`QbXRXMXFUmqIS_YTImipvlPnzslX{_HmpmyРozsgkrltfneov]R}wRACA<_ӺoVYgad~}TZC}ubonwnm|wdc_`wqeUWg|naqjTQTqhxR]teqrfY}ŰskiUPXjnpiڽq}pgdSRW^d7bpcfAV^[SHwtiqjXNwqgYk|vz^Xs_[wȞyln~dxvlqbrRHrdA36;AnּoKUo_Wur`jOmQ]]kuv}jnb`tqlc`kyyi^heagokDZyYisYagg\{Ī|w~uwnqoSIL]blwٸxzsahdfkmr;Wu`eE^rn_Lqu[`\RKvwda~zVHmoXSsңzsn|y{Z}|{ȷ}zqth]^^W[L+GEdvĮˮ}XlvtYSWNgf>alOngjwytt_r|vV_hQ_wtXWMEehrto[gjZsjv}Įoz|fuwR6QVSkv۷r~~{z^JMd`FSik\_FEsqbr~mZpfz}]bwuovdGNxi]fsŶxvqt~wsypg~}{qiuUYOJXiFDQkg^rpdahTP}~NCnX`yrq}hjbok]o_Rkja^`G]i~|h{fmu\c{j{oģnov}cbqV>HVTo{Ǔu}~qmNLceEQncY^MCytϥֽqyl_pf`\{vqstYU`UstUurqd=PVXdebiavchV|x|i{yo\lldXbdMYYlSdo~’ek|~n|sr}}{zpVsYAR@3hI27YICguxklŰŲuwclqsfty{nsjp~inNtypmVKf\]cp~wxoejU~_VWwwhztdc]aEPGK;GPJP]uių}crwf}xyyzub`dhUTgT@IA\ror{ygeknom~t|`^TR{\A3H^I=Zd`PIķltrn`zmjql~qztvVx~s]Md^UX[cUoy~kk\~h[X{xeswwnofkMQOTIHTHLM_KXl~ͩvqjlu|tfkj^XnbG@>CsfZXy{emgqd{y}~zs`_TzwVDFcU?Id[Q5Uw}||zeq}o^cb{v|ggq[YjWYT_MMYhy{pkn~hYon\y{wsop|d\]n]VmmcRnoy{\M_q|naqryVHaev~aeloxkup*dUfwųv{yVYqq}~W'KI\aUFPLRE1Wnrxj~<t]U_UiTV~ywh~rc~qZHftqy_dwvq]ecReI`tgjzyrmy^NnulfwmxfPJo-g~vxz~rtllt]prsdsmvm̽ɴ}x|iG%4cAϰooaGMEJ7#6];3$JL$_[VBM~rpk}qZqfufrlXddiaLqunxz]ih^?.Omb|{gsoqeEo}^kRof|orb{vlkxvj||hڴٯݻfaa^O<;esɾudj]cH']HBF0k7[iSmKqsp`ssxfXWve|wynS[dzTW`^tSLjrtkx~znxcHWMQ::Gtiz\ffa|f}{ytlթ¢ɞ{TOQOH7?_{|wWbS_LI@/@[5HgGjJrksuhy|uih`eog]lhiSy{vx{tMYU]EEPunstuRXZqQn[}zvnmyxxj{lo˷˩͠WQTYNCKsȬžireuZ3dLHG3o>cpXpO{dno{zUfht\WV}k~syqS_p~WZcf}VUg{eylvpsktY9GKP:AOs|\wh|Xt|x{sƓäxxl?dzj~tj{jfqd~yiu~weq|q_]y{yxusllRAKUJ?K}|вxux^kYekeRk}rimlrXQ\eSGQ|fxurw}hkijg`mvaaxo_zocd^]=;GN=;Tiȷzoiyuqwnjzzp|hjxd_ZYJ1:FD7>l|tĩynhr[_ZV}hbQc|vjnoudVbncU[{~x{y{upvsrzg~{kmfhLBNVIDZrǶxqvd]tid~y~~~cfqr`\yr{zumpmiedW?HTQGPҷ}}htbdoeUi|uhmkp\P[cVJVh{ww{|lpmohdtwe`{rfZsyi\_YZ>9Ol̾zsq_~|Ro{eYSpyoiqprZ[fhXTsl}|}ztvy|nwfm~ljfgZCKTNDN}w~Ⱦxkepui_v~s|xiakpaXmoxyzlwge{|jcd`\BFPPEJvzҼ¾sjiseXj|whomr`S]cVJX~bz{qsprij~sj^|l\Ypte^`[Z>?HG;>htgı~|uwj{~|luzocpz{zue}n]WlqaX[TU98@A45]n^Ųpyl`tbUcwwhppujX`h_Q[l}~xwvn{lcxuhngiOHPRD?\x^±zx|cm_e|quyyw_dlfVZvp~{wurq|i[jxrah`dQAIND>S{cǺʶi~qa]s}qltptZX__OKkt\w{tytkrmwqaydU]po]a^^U>BIC8Bm_lx{si{zwjrvj`qp{|~vcviXRel]U[SV<7?A54WiV}zc|gZ_syjpstrZ^eaTY~ro{xvqk^jzvenfiZFLQH@Rw]~yhtra\p}tmzs|f^eg[Unbv|zzezjYXjq`^c\`FCKMBEkugͿĮnn_dw|kqtrqY[b^PTxlizxt~to{mkb~r]PZjhV`Z\R=CJDB;<]r[÷gym\[oylmwpx`^eg\\{k|}il\\mracg`cIHPQHNuul|yf~hZ`rwhstru\_ecY_ur}x|urn_yq[LSccQ]YZWAGPPL\v˾Ǹ{rj]hwwhwpvmY^d^Wgh}z}ustxobc{hSIVc[P^S\K>GNJKgg¸s~ygdvvvxngnphir}u}pwoWhoUCCRXGMPKR:;FIFQywrõ|ki[bswhvtvv_ckhbnxzqjv^Q\ieWf\bYGOWTUlojop\Wfsjiwkxe[be_`|gxw{r{oxqYjsZGGW]NWZU^FHRVUcĹsl^fvviyrvr\afc_nl~|~uuwxq}aawfOFR^VO^R]NBKRPTrkrudct}pxwkgnninu|w~u~kz}dSieK;Alp_UfaOIOVVgkUc]MLRe}jehpsnkdcvfgzw{}iY]SF=Kstrrz~uqk{Ŀ|pahUOXnƦӥtl^fkVgonv|ta_dVME]usqw}{||{~]|dY]\SKJLqxl~pjovwwsry~yzbNPG=9HusokpyzVRjOU[YQNJ[xrszznmstvqhrb]exǛ}tsxpih\QQND??Juve[jdSMQVWihTc]QQYmwlehprmjbeubgxux|vbV[QIBUyk~ox}zspmzxztz~`cdTVb|˜xlete]ppryxj^f_TJLjsps{~{~}gdvWXZVMIF[{{pwvkltv}|ytuxn{|xgRQM@:;_y{uw~aN~wRSZ\TOIQmjxuu{nkprtvhuh_amͧvszpf{d[RROE>9Bfmýnevz~kffk|\hs[`ggbYHRaay{pt{vhlre]Sf{{rtkkw}yuoqp_hqvmc`atjZjaWU[nzxeUlVbf`end\O]omox~so}ji`gke]VSiijfhrwy{khrh}mhnd\PXptz¾ͻgb~R47>@=;8NVOm~x}~qcOYegouuq}lxrnmvv|i\ig~xli~kjonhd^nzϾzUKXbx\T]OGEIXf^FndV\a^VLDUVSt|pvvkbWhrnr~tkr~xqikv{xoӾu`KM]Z|}plZK9;IFDLW]hzgcsg]XZgwtZxp[_dc^ZUhmc~ufT`ry|vqz|~snuf_itogXL?AP@Hbhpvthdk`VFBTXYblotxl~zrps~oxwyui^S^ok}ns~vw{ztpm~o]IThr{}k_Y[em[Do\OTYUMDATSSrwnvtkbYjtpr{ypmy{tmpy{xo}ueVIPhg}{j\JETTNQY^eym_pk`\]j{}aj}^\bd`\XetfuqfW\v||tlz{~s|uhdnwolcWMFTWH\knsuncefYQDPceejnoyoqyvv}jkjjd[TUp}{p|}qtxwsqu~|o`UPly}ogekvuXO}{VMQSNHBKc]c|~sowrldbtyuv{s{qpx|~}wrn{z~qtrjg_TMNh~~zk`PUb]XZ_bnycbofaak}y]}nZ]cc`^_uujuwrf`[ryyz~vs_s|nfjgdb`s|{mtruiadgca_l{luoa\]qsoqw}mnOasfVQRfl_q|}xo}u`vtfgls}vbx~}{~yof_oxuv}vh^iX[aaaam|mpncnx}q|~ɲoN6Myoc`\Wbjgg`kyvrtzhsaafdbbj~{wddhzphhkrvrsg_j|zqa`t|wrmW:Y{`MR]a_^`plYekkruhqzusv|}zz|tVS{ndgufd{yoxvpw©|wlYG9DPS|phfgsu^ah^XWbu~hSvYD@DNahel\Wkruxunkqliip~ryquy}{zz~ukfb]dhS`iun_KSuk@:S_adedmt||rmnr{ozX[v_fv}yvy|xfagsrtnkgkuwy`HYk|vj_]ny[68kiIBHPQRS`n]_ty}}rmoltut}}z|vf^X^ucbp|øz}lnuxy{y\GDIdz`PHK\UI^hikox}pOVmKCJWdr}ww}ytuźupqxzwssu_ipr{~o^`F=;?Nf~vpja_e`ZRISWTXdnxyetnstntyvrp{vqouw{r~z}shggiq~}umehbEI`pncKGKNRXduh[jqrtrliqrv}~}yx|{spgVUZ`l}~{utuyyyy}pitz{~{ooytnfZNPY`t}u~{~nTpuZUY]ahsmx{|ywt{y\[mvvqsqlin}seu~uputv|~l]zO729E[wyx|vrkdnsmjjkp|o]qoqrinssqpzjcnkd^WQ[o}u{[e|_[cmsz~ridaitc^zèndfgc_^kjU\nty{wptyz~{vvy{w}}q^||\TYbmz}~yu{zroeiwzyyz{svsyw{|yyv}vne\[kztwiWzeONW_goyublpmlkin|vpjhqjXkpdg[`jmllumfv{{{yty`arNDNat}wkfonhedemvc\snWsvquvrnnzv_bkgc^XVbox|{u_ya_gqytlfcml[niefd_\bn]O\`\XTNRakx||vqNNqeB6@Sfx{~{}ur|}xuuviinhca`exxvytsrhM>f}dSU_hnt}yfpwvwvsu{wrk_chb]]]boiZpvqufgkjiiupo]fmLEPbtvnomfe_dqsomlmwydg~hUvmWTY[\_hwjYbgb^[W[ku|qtxjnwtkd`em\\zrojnolikvoY_igeb][dikpkoupihjrv|wWKowUACN[ix|{yeahc\VOLVak}vYFgyZA=BHOYj}tfryxxwtu|xtoekpjebaepeVkuuxvvxwx}\C]nO65BRdz}ul_ae`[YZ`nfWgy`ei\]aa`bnr]Zgiggdcjqu|junqtwyklpkgffkwp]ipiga[YbiWQaggfc^`caefiw}yvuw}ssYkwWKMSZg{wqlpqqs}yiqtnhb[Zabju}mOU{uUEDGJO[p|lkx{zzzz~upwxspnox}hcx|}}zy~py}{}{}{`SsyV>8@EM]v~nxo|rjgcbfpq^T]bbbbchjjorvp]pqa^_`er|{ysh__`]\\_ikZWj}ƻ~pmvyxxwwzxvxuvqWKfpWKJMR^q~~y}~yyzsvhc^YZ`g[HJRTTUW\cfltxjfg]\\_hx~rzzsiehgffgnvm^h}|xvyvjqxyyyz}~|}}zy~wjRZ\Cuxs}vgz{pbizdwvx{_OTO$,SlVrʬ{mswtovv^tcUVnwqINrxfb_dpb~lnpl^zmyspdYXW;Ueb~̦w`b}vf{dxgz|u]UcZ=MAKGD_ndrj~oesY~xITY65CuhYwz`uppqp|x~rcqeOucobG{wz}i~|untrkĿxyqno}}meeCFZ5>BjglhbqQVGudDYGU]V^nbv}}wtmrsisk`~|QDZ:JG}~v|u}x{fo{rnkmcs[UiG7BMOiעuil[{UmdeujfjSCkINNjpztne|m^_YM`p?MMNegw{}~urw~\~lhmu~{{pliVAU=?^Ksesʢw}v{uSutbadoXnhOPY]Zqduw`e_haretodga;S^N_rūxvy}fl_r`xn{gue|wwE[aaA9aPjtuxtkuvxiidQPbEbnmkpnh^y]prrvvlX}i`Xd`Sk`WgyƯ–n|lkwmrzw{y\}|~oU]Z751]:9Vb}vtn]utb{vNkrrRXv_kji{v{glnjkpvlb^XCLZCqǫ{pkzzwi~ur}wir\Wc~IHJGVLGUTHv©~uhZafEDEtVOgomzxu{wqnlj[lrVyutoD]u~pvzsxwyxsfmppkdhjnziaeR;UOB@X`aªĴjxy[X_ZLUVgd]kp_w{~}}zvgzy`^sxUI^?>E|n{{yotltxzx~v^sr^S`]JWREJMRXħƶvotxail{vekgNVk^Yit}qlkym^vZLHjd9@G[qo|{s}~tbxvdkswluo[XOH=SE:ek}q~hnoahs]dk`eimjtuvlgZ]|TX\hlVUWEEgmo~lw`^y^]j~}}vlcv[RqkqSSV@5A\aahylxahggu{xKmixvrugh~sjZwfi^Y_9M\EUvvmrm~ykwltujxjtZUgW8kp?F:6X>;iewtzxkRbn[]cie^`mgiyr~H`aan_Jdf[oo~pvtnK}K[Ydzyd}|fvklbOZYH<4NHLHgwpmzpWmgitlbuhqn]olltpuIR^=D\SAzytiyntujz}yo{yyfapbE:MaJMi`aX2^{ijzleqpxQm~mqzgjpguXdlisgSnlO]T^]Tp}u{yqz``[NSqkas}iwpus]acVX:OKABB`ZSn{Ԣ|e{yicgpx~vvg|zepx{tUncKFP4qp}Ȳkvp{]a}rhu|eynfq~s\ptlZWqUXW]fR\tr{urqfs}^WNqq_evpnwqk\k^ZNAV?F>M`OTivqǛkkhqdss{zswdrw}b`w_IEG+MpPMUlü||z}icuiyhos~v}s{px]\hC=4TaNGembW2Epl|ozruXlzneqqh{ui{xsi~kUUjNVW]eS^mostoubveWX{o[_tqwntq}h^i]cKKX@F>QSAP`qvsȷix|slfUb_^ggegd`jsn|}yxuwxnsrtujtr^_ayysXSST\giptsz{jcQdjr{~{yuWr{w~wv||{u}ljgflvtz{vztkzr~tiZfn][CGOG@IGJYcuwbtb16ɻ|NKHGT`^cdb|~lh|zmyofkedh\^w~~~w|{{ofLVxqg_kgakqnrk^up}lNtrgLBLP^mgipot~stZg}w|myǨeT?3H7z±fgfdgU>@\NL]M>NZbyvXP[_|]{I^|xsPIUYii[Lamovlncq|eTZPUmKtx_TRGvlsz\Wfkz{}agfhznhjmgmkzfqnrs|~ğ|phFDD6E`˵õ~tdjOUaYOBMQSKooKG]Ua^nHb{d{yVB`cdamfL`lbjx[UjeGaRvs|{}ZW]Eaokvme~svrr^elou~v^}}dsvgyrouzlͩkaJY^5-:Ṵ{lUd\Qh`FH`][AjqILb_YuggMct]ox\@aeZV^sNUh|nh}]\x}WVTnih~}r{v\[dRRkgvsi~unbenuvbreuosnxxoezeķhxkIUdL.6Aõud`lPijW@aabHV{WES\OgpgXU}mm|mDOm\YQubP^xf~p[tsZ[Zy[q|~u~uuqhMSP?_iprr|~zuvfhztwbrfqrutxgrqg~~˧gwXH\bB8MKGlngUgz|b<7byŤs|xsqj|x}|ktk|xpo{}{{pyzguw~zvYdP9O`RL[]|xvOslaFisgRZ^=FJ@_ti]XytC@_ZTIuvjms~w`v{koZ}gjhhd^\03:5ZǴ}r|kwn|mv~q}j~lrq}zy|yyity}r}rlkVZO5I^YWng~SqpcMl~oZYe>ELAXuk_ZyyF=]YQFq}ss|wycx|py]zllg|e|x`Y}W+0:8`ɷ~r}m|p~i|r|v|mlsryuvmpwzp|~}eo]aRXF6O`Xbwo}X|odRw}oYg\>HJBewk\a}p=C^XPO~{zsz|{sjwxw`{ir~j}sbrUcwA(5<@tʪvwtm}iuo{zssonxqrx||nxrtpula_XYTT:AW\Vvrho~k_dzk\{GBMDQxqfX{}T9V\VJhzx}z}jysdztsm|gtctu^UxX*.:8]yrudrkxz|ok|rquotmltwmr{qwW]QYUXA=QYQlupwlnhaq_~PAKGKvtiYs`:S]VK`|yyu{y{}pysksqxo~y~h|pfpvbUv]++75Tȑ~xxcniv|{pjxtrumthlsulox|zotQXMWVXC>OUMerepsnhzf}WCONKtwm^niFOSJ@L[^hrxztxy{WMSNjso\~S@[ddf~yy|zk}q|w}sx[sm]UTf]RQm_71?DjƘ~tlluuz~xjzm~tmu}pel}prchczqpYryuo~}wfXrJ>;AMRNDM^fl{{}wu|}_PUPhuq\yWA\gjl|}}{m|r~x|qv}XojXSO_XPQlc=5CJqėwnnxuy|xf|l}rmv{mel~qqdgbngYqwuq~ws]XlF=:DMSNGSdivz}w||]SWSwto]yNGckou}}fvz{vrwmXt^XKPZSMYpX:E`ƥywz{uzzrkkqxxntxkbeq{f~~igd}kxcO`msryqk_MgR@GVc_OVew{ʰêh_`TPe}xfbci|W_xh9T:VHBVKQattgvrx}jr}]jf^p\bIWCYRNm`_hzr^gne_{srmwWjf[iz~~rQacm]rlryzs\GgǤyl~gFr{ev^WmemG`_V_|}zrstyH]ddTf^lvrmT_d_Syjz|p|}^}xnrz}`y¬sRWWQDnƧtuPvwcL^UL_YW:[VMTroquxep|w{hX]i@atoaqhyoxZGWa^V{tu}z{bysz{dÿ̛srJ:JVRPyniTgSWaZL9\LHQvfmpp\t|vmzydS`_?N[L_xx{e]hMb][>@XCGYtchka\~xsjwbWhMCukhxrqsdDPaiUp|x|s_r}krlvڱssS9IZZMnrr_g_Uk[T3RNAIjebdgRm~uisp^_c=YxdvtznrNG[ma]z}xyxr_plw{cͤ|tf>DTaKat{|limTmc\=@V@BXn^\aPZumh~kahGC~npyqu\EVijVrx~y|{~\uvhnne|۳vrIBSfTSlx|sku`isaO9YIAJvx]XZUHwwqctfiX:d|jxwslHQdu[htz{xjdkhyzqvveˬzw`?K\dKhixwua|mbAIYCB[jXQXAZ~rkhrihDC|ryy~sw[IZpmZvpz}~}~_w{ih{w}ceu׻tsLCRi[Unk{~okj]?ZUEEm`RPS;myqdw|ok_:I}RRT}wkxY4qn{Zmz{{sog]%Ktyec^sw_{\njf`_nzşh?)8IUੂ}sZJb;9DBSOKkgbZjpcM:SIIny`iwZckxh|x^|TQPCFİvbOq{q}pxeG|tǩձZ`Z8*-Zxϲos~QLWE"Qg;GJ@ieV|o[_-6yp~iyls~qt{mzskWZ7/WSnŇ|otsc[x|ylm_{|}lHH+?+dǢι{x\\PEODKj``O_q^VGTN9GZz|swXTxb|fwraZ^T;8]_~t`oxgun~qVjPz}Ͱ˨zãuzeO.*C>\s˻plxL,fT1K;GmUbnug-K_Dbxxjrml{zzzl}|{np>?N6Kɿ|Spyxp^o͸qfeG=N0+T_ིtu^YQBVb\UQl_bS]lJ@GCcTurN}Yjbp}yk}ut_bqy}jjvvkzyhSVOk̾~mY?I330VǛsOrg<@9Jg[Vx}xwLMkLCW^^zzr]w}vzl{{}X\a;6LCCjk}yqhtshsxuwrd`oU7LPH\Ol̽qM[bW_Nie\WaudQTJN2Emoyf\YZgrogxX\\xhnƹt}xtypq]kğ|}sud\NbQLB&UkocdZXr_eYj|`]fWR1BRMU}ys`_Opxt`n~fkjJLCLNOrx~gszj}whxsZe{gcɩ|kybR?4J<8_tĵiPSsgXdyzaQuojV?5^Ynp{nvl}tjwx{gtTEF'7`RP`slhv{hP?@D=CPN1)Xl{vp{ivwe^u}uj`gbDSƧ\KZ3?[s|qp~ry[Ywtmi[~srgrmUKevsl]VqaAWϴ]Bp9+@Ubb`jqcY_̭onqymWps_omIcxbVuj]glpgfp^s\]unzkUPPz||vYp}zd|ȷmfdS\WRP@AMfxpGHlKHYVgwx[CC9mw|VfjrXh|wmocehqw|~jisoW~gZ^f~iPTEr·wj[]VP}nyxwtVNU[gjP,QD43Jgpbs~G4?*MsY^~yl]p~u\\kmbwpytr{|~Uup\Yvj[hSnϳþgJM^f[}x~mei_dd^2LL41Wtx_guA6F2CxvZ]xm~j]sjR]rzjgrwx}t}YsuZ\jft_oͤɲ}}[ERhnfszmli_cc[3QK28g{{Ykg==L4Lxwv|Sjqh{g]_Rcyxrjvu~|yyWzpZd~dht\|˝zʩ~}vPEUkjmvkrheciS4WF4Cs~vRyV9CI3[ws|rP|lirbb~{uTUh|q{|p|uyi_}gZu{ubqm^ɾ{zgGL\k`zzovkpjpG2@mztXkqesi\qx}_Wesin}wtujwh\wT{r_svʤvnk_R|hgyyzttJDpuonkf~_NlSIRzergvtjct~|oE,[mS>F\IJRm}{m[kllu|b}OMhjdt{h}²۫Ȳpi{tu`xkTw5?]ji|dbPeh˲\m~{wWRk`kfgo_M\jngOR}g}nW?padvpx|gWXbwciuNUytҿÒZ\^kgL[DK/;YWbQG_~lz~{jk8Hm^ws>Uu~q\kw{yPP\t{}yevqwtkyweXel\i`brjĨŜqvgUXgSpm`^F'4O`bN7dOvx}`F@K[]DX~xk{ezxmVmkui\kzLoX>FEdc}ymvnuiiFJ{٨Ʒ}asKC$0`zŬ_]QY2FnROZ^fW5U|t`Z_wvl{vtzcocft[@AR{}hjkyxMjkrtY\g|||`?>HG^ɚr|K78L`XDSicWffigLgOD+7dzxdplcr}}jfmoWpiBLsnZnФrajeYnx|_ES}~{z^MFC8,xŴvRI|qehikYZM|irulfO9NdbxUUOKthenvwifZ]F?l]wiuUqcsy^pStʚsȻurKgPHO5EesLn`WB5XZgT>UgC5]@Y\Ujgqo`dqrbmv[l|]Ac{aHBVoxusbVprqsw{xfUQKQ:MlkLPTE4OjZ]I|{shhP/.ifmZ{~rcqvnvn\N:hap~zvu]Kvqzg{bQjʭlqoB`V8GXpyoHmh\hVQTiwj_lWGFANPDWj}~zqchzinq|qjjn{^ZXSM\h|`{ebYnsmdzstxãwkio`Q=%XcTVumfzti{mYnsipxFQ3P`yu^yx}ut|bmov}tsmwziZyv]N8cg]h}̺yYjTcaab\pjW\agcUNc]ckf_txv|}yv|aVvhZsnaG0Tv{|n_|lvXg~v`Z^VL5BZo¦uPBhqQUed_Qky]M:]hgpvflkpqtXhz{{oRFP\^ioxi{fgyrdZuŦntdlcF8DVAd[{roZcdmlbYMRWO?OhW\ksyiPrh[gkYBN_NN@oyzanyi`bs}{MbkCD'9Tejftȵsb~v|z[SrjF99TYd}ruuuno{wqywtr~]~]`SC5BTmwzwurbggosn[Npomxžz||rhoS[P@>9/5l|~fm{nwqp_gCF==J\{{s|zWVjsyuhyur\v}sgiX-Clɞ~|igmyypr|rHg[=HP^fyxcoo\myydR[upG&,7?Qpºvx|~vqXXXYp|wjmt{sYX^YTLJE&_Ϊwnf[X~pp_wwoU79nTcgsq~qk}ne}]OYiqwhqemzhgZ6cQ.:F]uquolfusjnvnfeaDTzv`[|r[]WKMktwbs{lcmcNU}sppo}~nO~|t{m]sko^gl\>/:VW=;Rcr}ξycutxMbqDCTatpu{z}}bdsrmoxfPOPV]cuhcmfhhc{}vthwsjlov{hZ\XSF:EP2bqùawhnvm\BCaj[NQfkiwylwV]y}y|sZZ?9k`Xdtvv{yr`fln|{w{eRSMLSquZQ3@VYYi~zryļ¸{swvxsfji[SP^ZQ~x}y\VuklOOO?//Ixwsy|ycuirQe~UnYdf^YTVVA3:Kdx|~oabb\jqhGduvvyyc|`^^hmtzjTMJQSVhsxhxlkd]LPv~ru}uYPa{l\WTJDTHnj{tvul]JOfwktrmxyh[c{y`[ZUSUpaJK9Zj{{j\aejvssruvrqQPxUIC$,8=67M[TJDNbr«|byi^^o|{}}{}rlmmljv{qdWSUPSZWUw{phfvvn{vfX^x}lqhc\`c`ZNLOHBBF=4g}v|prkabjzzg_ciyzilY`y~hX\:Bja`o{x{znkdeeejcuwihfio}dOHFKhsU[K/DPU\`gfe~ȽʬŰzutkahbKqv\Vzwgq`PE>6/A`rxrowx}koooZJlytw~tw}]\vaT]d`adYJ90;HVkuux|u|zreiidz}]``^ehm{mvsznSPOi{w{t{|royw|d^tybndp~|jjbpog`RH::Q^^kcU?Rnywtnwy^OwD4J[lxrø|jfnUHOfn|ojX\jtzxuvozeblmOHRfysy}xnYIlucjoѹuF2IwjBNK3,P]NLTLc|}sjkvixYLk|TE\~wnrh]RVlwLQbdytu}s{pZSUPTuu`_ktuǜIJy_AS]hs^ZVafiXRTV_]Y}jVi`rXNY]m_LWix~}oMczxu_ddoikzkpcNlS\6DlJip~wgjyss|[K'1?Vmi£t^glaQzdb8lqo}SCeqQRWmvipYys]chz|shyrluN44Gaxww{^|gkw}x}ziN{uԯôŢyr\IDG8M̞_szwPFMUotWctidkceY7dTI6?q{lGLfdplYsuCRoMEXxnms\HOa}ŝ}aIMM= :|½i[UOPfkkYoadT`UGO^Xc{w^p\YRUntqo]b4QaWWig[q]{~Y\{˼v_Ch?@3)?hup~wtXi]BY{eBTlD8@OT>M{uSugi}yZtw}exV`PW[Ylvjd[`o||x{PpsǬzl`^^B3|sxv}{fXi^Xi~]W?>bFZLJSZo|t^lxvwjaqiC^{d>3Ndrlq|ht|o~jsvptZEG@EO3`gy_dhfM?xwp]obNN][I5[m`Yck{hr|nRW1Rm^|sYyeOt`lxɵy¤reF?f0=Oeon`iUNRVm{rVXUMGQWmM\suQplTd^ynt_tWPSleVeȫ~w}|wunfy{oC3_WAN}yXFt{_]UnoNR4jWD]ksuosubi|vZ~xpvy|[P[QR]fm~k{nbvsypxt~vťzoefgaVBFN>ws~lCwufXzvjO&5pmUKatoVQ{nyv|jz_ZcqS[6arNspPatu~ysnt}r]eѫ{sizoar_VuP=I\oǿxkB33Qcd`PJ[cmma>Qnisuolcfw{zY^vKVbL8Df̳p}c[dap|~stme}HuʻyjydL?4bs;,HfwͰ̼©I;N\S^ZPKJUUOP[RHu|{{zwx~b]wrVhoS7hzJV~yyIRgx|k|fW}qmfluZ4KQ+WuMR~_mrn_pth_kvT(DhQ[]K_en~Vmyfof|]pul^Fgk-[yZa|pytplw{Pbv~Ưwt{mposH?J0geBNj·`izrvpkj}~=@^EX`fa]guQaxl|nczTzibWNK1loU_pqyxgmYY|ni˟roomX\cUA#\_ZzwnzqYYnm~{pkqV@XKSZzcLXctSsti{pjvVWneV;e`_v{vjyeNxlfpmsi\xuK=JD7'[k\w¯p`Obr}iedaY@h^FJe{\isftWdq]f^NUXWGZecywRZ}xpUvn~yzvlzF@VT;(GdXƟqbNZmmj{pqbV/NXMP\lrus^potvs]eQY\OFe}dugPa{~xLlo~znnieXHOJ83Z|l̦lIQm|nfXZ@]_SKphqacrizdntqm_|[Ve^G9Rve}{^dzv|Psz}wunxuiclG=PN>/Pzu¬vdP_zlspnka9YZ]\`rjdtw~ep|dmcT`PIHlzk}vcb|uqxsX}vshguYgnF9XOC6fvz~cRYuq|fZ\MFW[G]u{]xijXahgS|i~|{moEvmJ[^]TIJL39GYlyvê\ofPtz~tV]oprhtqxfmvPXwP8?Ii^ulylzxubWSepvj|mrvsI0\sQ?NO:,PHIGɺépzxmpl\_np|xk[prr~l4hVIF@g|yh{~}~bmbVXkx{|zlimnoc]oJ\p@H8+-:Rjtp˱m_piomSAgspqqnt{onfld`kZaWQJCZRNbysw\W`mUgx`th}xcpi\Gsnnlw_5%JeVAH[ʴqmiZVUplo]v}xbKcW8AB>0;npwuҾ}tlorrhbagujn~kygX]ci]Rgga`WWATLKXM{ť~omi`djYXey}vnqrtm_e|}xyz|vo_eoL=;;.%,JWKZ~̱v|Ztjjz~hhmiqsvywpjlhsfav~{akmhhG]xMJVI, *L_UpvUu~S+F]Z`iuwuxotsNZ|pylbcyqpptpll`r}fkJNYXeB'(2K\Id}aӱpG[iavx}yxR\}vjrqjl{ec~f|Ŭfi_^p{vyUw۵yMQYDTeiZ??>[c?e5'`JapiVGo~SELdus}cGIswvlIrtkhdieqFymKGSZisaQzppʣ|{_[r\j}qWXUeizqCpmelep̰łyl~X{zxrt`ϭs_zhbwodI?;1``G]!HNQpUGsi==SzymL@ysvUS{qdc[[cyoj~J|tCjgktXZwxlƮqpZlyayygTXLah~bQjmubnco}áæ}qwTuy~toteȦ{ognm~qdF@<5b]K]'NMUlQFrg;;QzwmJA{ryVRwl_\XZh{qk~J{Joop{[Xuuo}±zzop`ok~ygPUOal{nPjo~~cgeq}˯ʱ{mSowlywneˮyvlqtjM@@8ZiKf9C[J}mUCgsF8CmwxnP;suwgFok\SWXwr|k}Kv~TixudRusvvxynlgsuxhOSO\rxwR~npzddes~϶̷xnQkthu~rqfɮyzu{wmOCDBdiPi;_lnnYDQ|ixcEfcNKWecrx[ku{wSZk}uq[vzxxyhksqc^zets{bYz}jqhrmyɼpz{wSNqw]grpyukgxYgsrvj~eHjV`ry~i[WlfJ8Mhhm]JIsqnwHXjWKVam`^z{}nx~`Oopn~yn}j\{{{tpvySsojxrpY`pguo~ls~{Ƴ}|ueFZv|i[oquypfnoQyuxpSXiTkt~xe\]x|^D:XfggTHY|jvkGbiTQ^mei_xtzxXVvks|}tq~_ex~wxuyUxknxumWc{klop{mwz¯ut|}z^D[txf\ootvlfrmT|~|tT\kViq|wfab|~aF:VdeeSI\{iukGbhSR`qij_{u{yXSrkp~|~ttaaw|{yUuoizywsZ[x|xhjwhpx|zstvvwaCQlujYhmoumiruWs~reSq\cmxzjedxlP;K`_cTJXxmnuKXl\Vdssf_ztyy[Ol~mk|z}ss~i]v|}Wrrgxzxt[Xsy|wgixdrz|wq}ussr]BPhqhXflntkjvuXt|weZt^dlwxjhh}mR=M^]`QK^yjpsLZn_]k{ri`}uwsVRm||il{xxqv~basy~Yymhu}zzoVZqrwmbnnh|r~xi|wprtxkQ?Vin`ZkkqqilyjY}{Zkq_hnzrllrfK@UZ]YLTowfzeMhn`ivitomz{xxxeM]s|tfsvxzpq{sWr{rdh{govz{~}bRdnppaf{axvzz}yk|xrp{zm[AKclgXdkkqghtrVnukcycgmyxopppUAO[[]OQi{jvsOaqcfrlk{izwxjQXpywgovtynnxuXg|m~qc~klq}y|~iS^jjmad}|cqyzwt}j|qnwxk[BJajgXahgmdeqoTh}prh~jjnyyrtuuZDPYY[OTmziwtQbtgjugg{m{ywgOZqyugputwllvpTiwklh}kmp|}x}gR^ffh^gycsy|qp{o~~smvuhXAKaifY`fei`cpjQexlylqmoy{txxy_HPYX[PVo|lwzV`ullvfbm}yvhQWnvvhmtqujitqUawh{eployy}~lTXdcg^ayzgk{yrgj{unpth\FE\eh\\eag`^lmTXvkwl}qpu~xz|nSLXW[USi}sofXsuoxq^pm|zyxmZPfsxnhroqmeou`Sqnjhv~mmp}z{|aR]_baZkv|avy~fmqux|rlsmaQ?N`fbWacce\bndNftgtxsr|~y~iPRYWZS[t}nw_`yvvkaxpyzshUUksvkiqlpifrrYYtinh{|onq|y|y_S^]`^[o|uv`wz{dnkxtzoiph\M?P`eaXabbc[doaPishļw{ur|{jRSYVZS\t|mw_azwxocyn~xy}qgTRhrujhqlnifssZWtljkxrmnyx{}dSZY[\Xk{q|_p}ijlmuy|ndifZN>J]ccX^b`d]cqiScxi{¸swsx|tZRYUYUXq}oqh]x~|wetlywsyoeUPeoslfolmjdpu_Vqnfnusmlxxz~fRXXXZVg}zn|^l~jg|ikru|madaVK>J\bbX^a_c]erhTeyjzżvzsy}u[UYTXU\t|msh_{vgwmxtqujaRRgosjgnilgftsZYtkhj{smmxw|y`QXTWVWn}rnr\s~ydk~}atj}ug_d\RF=Q^c_Xa_ab]kr`Toui{u~mWYWVYVi}wl~}_jmjtx|osod\N\lqqfjmusi|]^ygYaggpvzfQTY[dexkO[j}mn|}ylbR\mssbZZhxjisiUfzitcH|nCET^nws]\cckkz{clvyd_xprtwokalm[Wd~zhR`zovsfW}xiinluzpZW^^gj}ujbdfbkjdRRypk|pqrhbV^osqa^afwzw]i~nvp{XNz|vrkpt}kUTYY`bs}s~xysvykRJMXujmu]b~}ztwoprvngxXMmtslprpx|lVUXW_avy~xxcdzuvwyql`iy}|nlop}vo_nRElybG@B?FGXrshvjbzvh]kuxea}swvxoj\_nok[TWYkxvyyu}y_{tlqnuvr|}{~zwybSqo\u{o`[_WTJK^df[SVS]er~cb{siivjH_xzcTXV[`ixw}w}uh]hkh\LNO[ov|xmpow}fmsLOjonjrrs{|hTWVX_c|su{ruxcnvytwvokbm|~pppq|zl`oSDg|mRHHCIK\tsgrn]s|~seZgs~whaoxqumi^\kml`UYYguzu~cpnpnptzmo|xzz}v~r[h}dh~xj[][UQIVbfcVWWZfmr`qlsnhx[Opx`Y[X_ctvvx}}rk]VacaVNUYj~yynqpxvcnrNUovslrru~lYZXY`f}zoi{|yuygnzuutunmckz~tswx}zfYmbNmy_PPJMQ[twjnu[iwy|n^bnxxj^zozmpid[TaghbX`eqxy|mopnljor{h]mou|}vbgnf|~s`]]VTKSaef[[`anuycnuo~|kcxiVth]_Z`ftsw|~vrrg`TMZ\^XT_fw}yorpx}o`qqP\u{umsrw~kZ\Y[aj{yegwxwxsi{ztmhbluzvimnpypbt|ccvthmns~sep}^[wuz}qqxfOLZe}usgqxub\wynqnngd\fty|stwx}~xrTU_gywysd~}uph]bfxvwgywn{yb[y{qnrmnhp~}qwtewvprrxxzgkhn|}fYPZkf^k}l[o{~qdmwzjco{rtnmgk|~{~{xyu\jywtnx~sqrZp~{}}rqtmps{~ziYTiyie[YQWgmqifhdmuxbhyj[nzystq|sroYo{y|x}|vngnwswwv|i{shuvlx|nq{eTfryl_arWBXineflluxui[]b^eiwzr{iz}odnx~qaXh|zqpio||vv}qhy{}wzy|pf_fuxzx_jtyyh[OYguz{rbV]x~rsmmgl}||u|nqu_kv|urvXg{{xrnutz|koxzp]RWvpgdquyskkcfnwxabut^esv~}~yqurwvp}Z_u{rxwzpe`lpwsqufgv~ql~vjvz`Zjp}ymaksPF\jjaeilvzreX\__inwtvk|vg_ku}n_Wl~vslt}ws~sft{uxsxx|rh_crwglv{|i\NTan|xysbY\}vuuonkk{~xzlizzbcrxyr`^tw}|pvwy~kclr}|trbWUqxsjq{}~splgnti[hwh\kt{}~trus|{rvpWhyuptrx{zqgist}~ovsdivyps~g`mqYXjuzogrwUK`npdfikuyuk`cdclqvszjxwh\elx}vvk`_sxwqu|pvp|dj{ylmilptzsoo{|njv{qcSR]fuutrd]_||xuqonkx|zi_mvb^q|{uj^ryz|~yz{y|ziZ_cmqklc\_v{xoq}~zutmsylYasm[fs|vpsqw}ztuxZcuwmolrw}ztr{y~~ttuefq{xsy~~}smy{~xnbcafmq~~}vpodd{~up`X^dvtdfx~g`r~ultwxzu}zsnhg`lw}|~}{{ty~}r`_abkpz~}|y|nsx|t|zpchn}so~zgs~wmwsmuulkfigp|v}ryslnktw|spws]mzywknr|w{mhj~~yk[Whq{vjjefbgw}|rzrwwmoksx|x{tU_u}spsjmq{xo{lr~wjoz{x~ynsljpt}xui_a^dioyuxtkim~oS\p~ytyy~sosnrv{r}oq{rjbmzpktzxstqty~zss~hJUk~|legaehqxi`l~t]cnxocW^hvxkgrzystps|zszww{{uxtz}{z{bm~tuzxh`Zhxumst{licd`crw~{wxrxtenmqx}{uxtz}wsvpRYl}|{tmrov|}t~rtvhmx~z|zyvmqzw~{rjlgjmqzvwsigj{oQUhxvotv}phnls|t|rnx~pfZ`o~yqsyxwuw{|us}wSL]qzw{kkiiruveiyj^ho}rgYT_hy~}}ohi}zvvq{~xt}uuzwxzx~{{rbp}}ruyrd[Uetyt}xrnhhchuy|yyrynbmlpv{~~wuyv{~usvqRXk{|zxptqxvxt}vhis~}z}wzxqq{t{~ynpmlpqyyvvlikxz[Paszqsuzwknpq|vwmrwvj`Zgs~rwzyu{tvtqvtz}yy~y\cwtjkfkt|zr~zu|qdTORVjxzrc`eziixqqopsrp_xianv~ypuz~jq~ysqlu|zzz}~mktmihq||}uwyyzvwy}~l[bv}mmuy|yrmwyted~{tuwoacen{|qsnp{z~r|wg`ho~|y~zoicvxjj}~|ooqnss{r]hy}z}xmnllgXc~o`UHNWdqqvqjmxouvtw{{eYf~wzxmhrwb`puwwwigcj{uv|seajrxtw}yrllybcttkrvzpz}xvYQbwxxz}|v~uw~rcX\`lqqwuv~}~qll}}b^nymmqpwx}}w^etvrx|qt~~}kXLAHVhvvyslnzrz}{ttt{~sjuxy}|spwuwwwzxvVZn{~}}vvpwztzllr{~uighs}bS[ouggmqxsnfbigknqwruwu}fdq|twxyyrv}ock{u}xjYX_hvvzysw~~wvxpywmngdcdnq|nfp}zpqpx~sjibelqtgcryv}pfXX`jxy|{swvw|{vtswrdn{y}~|ulisv}on}{zsyqfn|~pv}n\Y]eolmh_ak}luyvnmjnoblsrv{~vpsoppquptx|nlx{|{y~ys~~xihmuztkigmiX_s|qostyrkc]cbfjmuqsts}c^jyzrvyxxqt{pgqts{l\Ybm|}~|tv{|~~wvlpmmnmrnnstumx|}sijehqv|nen}qhowypb]ciuvwwos{|x}vqnky~gjzvyzzumrtuzz{}zs{}xtacozqhum_acmqnphgn}vjt{tpklju~fcrwyzytihkgjjptrxynp}~~yxry~svuhjpz|wy{xqpmqrdl|qmnnrkf^Zcekorxssrpze`l}{~~}turvuiq~upywg`diuuuunqz~|rt}zmmlhiglljqr}sx}|urpksvztcgu|lou~pcVY]hqqwuu}w{|xqqovmdp}~}xpkrqux{rmw~}uuz{{j_hwuq|whafkvvtsklsrku|xuqrozijxxxw{|upffigjinqouv}mq{|w~ss~|zlkow~ywv~vrkjkoxfkzxppouqkd\bbbffmlmstnaiz}yxtqxyzm^fvyyj`dgsxvztu~v~tr}vob^a]abiqqz}tttnmgnswvfguwtw~qh[[`hsrusovqq}~|vvwzvhpwwv|yuqlssuxywmvzzutyxxh\fwy|lbefpqnoimvwow~yvsusxbdswyx}}vpdegdggnqrz|mp~}y~ouznbfjv~}|zps}|sqmqr}okw{wssuni`^caefkqnstwz__l~xxqvzzuccqzz}tgfjqzxzxu|yz{qz~{y|und]a^_`bkiov{{w{stnqwxvean}upszwm_]ahsrtspwsqzywqqrvxks{zy~zungnmoqs{z}woyyxpptrp_Yfy|z}nhjmvutsnt|pks{zwwxxrdl}xvrwrle]bbcgiqpsx{ypx||xzvq~xkfkozyyxsyrnvzxrqrs}nuwtpuplf`ggiklsoprr}jcl~yzux}}zico~ytxyjfimvtuur{|{xlu}{y}wpf_caabcigjns{v{{uw|{xieqxppttk^[_eqqsurzuqy~|wuttznv}y}ytnhnoptu|yy{{tlt{ztsxvsc\hvunqwupsv~|zzuzvpw~zwvs}wgn~zwswtnh`eeeggmkjmn{{r{||umwyy{}phknwxvxtyxmq}zvrnolwvx|uwvni`cfdhhmnkooxwfix|zxsyywm_futtvwklnuzvyvxuxqo{{usumg][`^abfjgkntwxzztx||whjxxrpuum`_ciqoqpowqpy~yxuv{ox~yuzwrmhopquv|yxzzwmt{{vtywsd\guypquxoqrzzwzv{sx{{w~yfiv|ysuvojabfcffjminpxqs}{mr{yzrffipwuwvu}nltwvrrpsw}xztogbhghklqnnpq|lcl~|{vuzyug_jy~ssutlnqyzxzw{uz~oo{zrpqicZY][]^afdinwzzy{~{ufft|usvwpd`dhqoprpxrlr{zwvwwpw}vywpkdikkoovwv{|}mpyvrmrqncXbsyy{{qqsz}y{xzpr|~~{jht~xqoqjf^\badeinlqu|ur|||nn}|}{sgcfjqoopov~mgmz~xxuuvxt{}vxuojchihkkqpotvseiy}|xuzxtg^iyzzz}rikmuwuyx}ux}jly~yponfaXX\Z]^chgotvw{|sekz|wty}rk`adkrorrt}mlt{|xyx}ws~{wysogekjlnpvrvy~okt~wvoprnhZ[jz|xx|vsux||}|xrx}|qhr|uoqlf`Z`_`bcjilrxzrz~~zliw~|{|uidfiqoopov~ldhu{uvtuvwxxzuoibghhkkrpqvxrgl}zzutxuqc_m|zyy}rlnpxwvyx{rwvhp}ztkkha\UZ[[^_ffhotu{|nhuzvt}xqgacfnnnqqytko|~|{zy~rz~wyvqkfklloousswysinyysruql]Zhw{tstwrux~~~vz}rhr~xprmhb\baaccjhiosvnu{mjw|wt~ysidfiqpprrznfiu|xyvuus}{}}ysmfklkmlrposuqgl|~~yw{wrd^ky~urp{~uoqs{{y}|~twykq~~wmmjc]VY[Z]\bcbimz}rx}qhs{wry{uldfgoqotszykku~~~{{w~vzzxwpmegkimlqspuw}jju{xvpsrmdX`o}vrou~tux}yw}nlw}tnpie_\bacdfkgkouqoxykm{{ut}vqfcehomnppzleiv|xzwwvt{~{uoinnmontrquwsgjy|x|xrf^jwwtpw|umpqx{y}}uu~|jlxzokjc_WW[Y\\_daglvrr~xkn|{tt}~uqfegkrpruwpjn{}||zy~vxytojdijjllqpotwsgkzyxtpsoj^Wcqvspy|uwy{~wosnkoqwsx|{xu~~~vpwqts|~yy|{{xvvuqv|vsuxwzuxt}{ynlmhopsux}z~~{~srpokoxuz~}~uvvnxyywsyrs~~{|yy|{zvwzwkrypt|}zvvqphlntz~{}|ssolriegmuz}~}~xtpwzvsqpskonty||vv}wnpuqpu{zzz~}}ry|xwz{rmprspkmkdbhot{|y|~tz{qrsz|{tmplrv}z|}{yuw}vrsqwft~yyyywx~}~|}s|nnw}}uninqrtrwzz~|w|vtspvy~wvssxxwpn~x}}}|ukjz}vsqpnv|}}|rpqtz~zwu{xu}{tqxwqjmssyy{z~|qvnijtv}usrqoyxuzvywvvvv}lwvlzuxuw}|}}}yv|zymokh|}rs{tnklqnx|~|xz|{sw~{|~||xpq|x{tutsx~vzz|xwpnv~y~yz{z}}{~{xwwmsvuxtqpwz}yrv}mvrpnluy{xttrrwqq~x|x|vv{yuorw}{o}utqrzz|x}~y{|v{rz|t|{xyztnnwptyxz{wx~wvvommzvqnvstxq~~~|tv~~{uw{z{uu|y|zxxy}|~wyqngpzzwxruzsrl}yuyxqvtv{vuy}|vqxxows~xrw{zxz{|}urkusy}y}xu{tv~}~{}sqywuq|{prtu}}w|yqrtq{yyy|zusvov|w~z{{}~yy{tpotx|w}~w{yrt|ytyv{}uyoz}sw~}~~z{s{v{{{vnsmpqrvq|tnzrtwsx}y~{sptz}{~}zrxzttuv{}|{|}tsliinp|}|yszxqt}}x}{ulhz~{}z~xowwrur~xpq|zuvz{~yz}w~~w{xqty||u|xnjkoypt~{ww{tqoqpqom}v}}~pz||xw}~yrnppkrz~yrpy||~~}vutu}~zx|}|smsurrwz~{|~y|~msrcedpzy{|{~wytvtxvuwwvogxw{z||}}wxyw|xz{vt{~~}wuriifimv}{tvy}y}w}zltstts|zxxx|zw|tzpoomtpqy}~}zy~}{wtvvxvuw~ssqqqiowztz{{~y{uloltupzx|x{zytwxz{xyuvypgkwxuzz{}z}z{zvozu~zz~tmmmmklx~z}|{|~zuqoklprr}z{uvs}}vwxxtroptrw|~y{vz{sqw}~||~|rptfjfmyx~|}y{}qrtrkkty~{{~wutw}x}qsrorlwx~{~|w|ysxt~|~~y|yy|~w{xljlpxvxz~~{uvxtpszzy|yr~|z|}{sjjojnrz~wz~|yy{sx}y}{xzqlglxrs{~}}~|~~|wwxkjlvyy~|swzyv~}yuvwwmnzt|{|yxzz{}ty~{y~{yrrhmklokt}}}wtmqzwxw}}{|zvxytslpsvxvuyz|~xwuvsu~}yt}|rvttqklsvz}tnnnxnv|y~ywzwzz}z|vwqigozxwz}xyv}y{z{z{{||zyvkmtpqlqxww{zzzytstssss~zyvzy}~{|~xurqqojxx}|||ywuz|wz}~}}~~wlohhnkutv~}|voy{xppwwyyz{z|{{~{nsjwwpz}z~{~}zuqruyryy}z|~|xxwsoononr|zwwwrsss{~w|~zxx}x}~vojmsomorz~~}uwry}{~~|~ty~|njklmmmlv}}{vzolunwyru||z|~}tmjiil|y||ursxvr~{v{x}}{}qlhghqtruvzwt|prwsotw~}wzstuy|zoqsrtwrqvz||~|urxwystww||{|t}~{ywtlixow}~|~rxsuqm}vw{|~{|wx}tmpmksrmry|~}|{prx~{~ysosw~{xrkjgilqrv~~yvjuvpqsyvwrsy~|~uvvqoouzyy~z||truyxu|u}zx~{~||wpkanpjxn{}yv{rtuwy}~|}}wqefgjswxw~~yytrruz~{x}vvvy{v~vvpknsrjnoy{xw|luxqprz}xz|zz}z|yqidltwtvs{|{zsosvz}y{}|{}zqlgsjlu}|wquwtv}zuz}to|{|vxtvvpiiz~}~~yttw}~~wrvvw{~z|{wsphjlinnt}}w{umqy}~zwww{|zxxqmjqtsxzz}~z~|xutts{{ttnw}~|uhpsjogo}z|y}~vruxu}~~y}{x~y}yxutrilssvu|}v{zwsrz~yx{~~{x{|ztrspilmjvvt||{xpnopxz|~qx{}yknwvrlouy~}}vpovr{~}|wx~~~zwthpnelnqmv~~}{tqrzuv~{~}{||rmhn|{yvw{z~tspxux|}}{wvulvpmohmyxz||wqxy}}~||~~|yw||xyvqokmrw|zx~}{|x}tm||wqu}xprskljluvxuz|}|{ytzsjmtvwz{}|wrsrwy|z}xx|{}{~y}}x}}|{z~|~{tlqsijolltpt|pvxz{}{zyv{wxypkvynktvz~}uxiefltw|}}zvny~zwy{|ukstmnuvuyz~{~||z}~wx|wmx}vvvzzy}xy}zrxzqr~~|zx|sruxyz{yytv}sz|pwyv||y|yz|t|yw{yy{xpz~w{vsvuilqkiu}~}yz}wxrhnsutw}w|{}{srlktllstyyv~wywv~{x~zx~ypoqimssy}zz|zyv}}zx~}|~|~w{~}ttppypkniky~kipokpoinskw}|~wolprinqos~~|{}||v{wwupvz|x}~}zxy}|{yz~}~plopt{{zy}x|~|uz|v~~~zvvpo{xsrvtu~|oswtu|zw~~v}|wqtwqolnu}|{qpqqvxz{vsyzvt~y|}|rlroipu||~wt|zwy~w~}v}u}~|rwxw}|{y}psssyzrutnn}{vmswsrldeojlqx|}zuwwzwmsvusyxz|~~zzypv{{wv|z|}xvvvy|u|{~x|onrtxy~}y{~ytz}w{}zxxto|t|sxutx{uy|z|zvv~zvxyz|toywvonx}}{zxxxqttu}z~~wvv~r~{tmmslkou}~w~|x{vy}w~|yz{{~|ruwuyzzssrsu|vtuqjxz~suyzzrjfmokov|y}{~xyw||ptxvsrut~~~|w}pz{}y~vszy|}{{ttvuxsu|yytopru}~zz{w|~~xw~zy~~|zywoq}uwwxzwyz{}~xvx~wuwyyyov{wwosy~vvt|vutvw|}}tz}y{u|}|}smmrkjpv|{}xyvz|y{w{|z}zpuuvz{|}~tqnpqyvrspjv{ww{~wojmqmnv|x|z|{zw{ttzvuqss{~~w|syzy}yqxxz~{xy{squvvvt|zw{sqptw}~w}z{~y{zz}}{|z}~xxvov~vv{zz}|~~ywx}vuyzyvqz{yysux~vuvyvsvw{}}u{}{|w~}||rlkojiqx}}zxwz|z~||zx}zzzosvv}{|{~~tpjllqupqsot}x{}~tplrpnu|zz|yzww~{szyxvtwz}{xzs}}z}uuzx~yvswsosyyyxzz|wtpsu{|}zz{x}|x}{x~zzy~{vxx{|~yyzvu|{y|y~}{yw|yuy|zvrv|yyxsux~}wz~{xsuv{{|}xxywy{||rlhmjir|}yz{}z~~|{|v~{xzqrww}{}~yz|zqlgijprnstsy}y|}|uqotpqy~{|{yyvw~zv|yzxw{~~zzxw~{{|twyy~}~~{wssvprw{{x}{}{vrptv~|{~|y~}y{~}y{|x~yxx{|tuuwz{yy{wv}{z~|~}|x|zvz}}wsx|zwztsv~x{~{ysuvzz||yzyxwzy~zsninjlu}{}|}z}}|{{v~zxzrtwx{}{||y{}uojgijqnnsrt}|}}zwqttqy}~}{{xvzxz|xzwz|}}z~t~z}xuzx~{~{}xurvqpvy{vy~xuptt{|y}{z}z|x|z~x}~~zxyy}tstuyy~zwyutx{~{}}w|~zty||w{yrtz~~y{~}{uuwyz{}z{|x}wyx{|tqjnlktz}~z}||{t~~wzvqwv}{{}{y|y{{{pmgihmplqqrw}|}{wtxtv~~{~|xw|x|zyzx|}}||}u~z~wuyxz}z~{xtrvorwyzuzxuqtt{{x}zz~y{x~|{~x~}}~}{ywyw|trssww}yuxtux|}}}x||uz|}xy|ssw~|{{xuxw~|z~z{{{yzuxv{vrmlokrz~{}~}{|zv~{x{stwx}y}|}xx{|y{y~unjfhhonlrqv}}~}xwzuz~{{xw}y}{z{z~~||}v{~wuyx~}x|x|zwtrvpsy{|w}yvrutz{w|zy~x~v|}{z||{~|~}xxuwuxwoqpuuz|vyxw{|}|zxw||{v|wrt{~}{vww{~x||zzx}~svtvwsplpnp{{}}z{~~s|yzxrxy~}zy~~~yzuw}}{wywzznkfgglqmruw~}~~|w{xx~{yxz{|{}|~||u|}ztxw{~vzwyzwvsxtt{}z}zxsttx{uzyy~wuz~}~{z|~{y|z{{vvtvswunpptu{|v{yy}~{}~vy||yw|usu}}zwxw}|x}z|z~x~wqurvusoosow|}~zz{wv||y|tvz{|}w}}~x{|uux~}zwwxw{qlhghjqnpvv}~z}{y{zxy|{|}}{}v~~|tyy{~}uywxzxwtxuu|}~z}{xtutyzuyxzw}uy~|~|z}~zx}~x{xuttusxsopqtu|xvyvy~~|{x}|}wz{ttw}yyxzy{}{{y{|qtrtvsqnsqs}}~~~{y{{s{~~z|wtyz}~x{}}zx}vtu}}~zxwyw{umjghhonmssy}~{}}zx~~y~|{||~x|~vxzz{{{|~|}{}{~yzxyz~{x~~{~~{|}|~~|{ws}~}|||}wyyrxw{}zz|{|zzvr|xu~~~xxtz}x{~{z|xzzw}|}|zw}wxxvts{uxywzzzv}w}w~~}|x}{uxsv}}z~~zv}{y~uy}}zx~wt||}x}wry~w~|ywtqrzuxyvxxxz}xw}ws}zu~wyxvrsqos}}{y~{~tx}zzy|zxx|{rw|{zq|}{}{|yv{|xss{w{~z{|y{yw}}wy~zszyzxuywuw~|y~|vxnpvrqx}v~|z||uw}}{t~}}u~yrvrmksqs{xy|}}~y}}}}~~ylz|u}|v}}zy~}x{sqyxtwz|{ytywz|y|sqx~}zu}x}tyyrmstrzzx{~zu{ysu~{~~|oxtz~xouxts{~}}~y|vs{{wz~}v{z||~vpw|{vpv~y|||~vw||uqvxu}~{~}y}|vw}{s{x|sy{wv~zzzztwqmturu}|}|x}}}yqz~~wry{}}~w~zqvwplqtq{}{|~y{{}|yo|}vw}}yz|||{wzrqwvuy{}z{swux~zy}roy}}ws}}{{szwqotus}{zzx{vtx~|wqyw~xrywtx|}~z{{tuzxy}zv{x}{|}nqy}xqq|zx|{z}~{|yv}wssyvy}|||vw|{}uzwwx|vw}zzzyuxrortsw}~|x{|z}zpy|wqy||~|~z||quwporvs}{~~{x|}}{yvrzyy{x}z||yzyrsvux}~~~}ztxty{x{}{nrz~{tv~~~wuztrrxvy{{ywsv|~|}xr|~uvxytw~y|}{{|vtwxy~}v{xx~y{~roy{}sq{|zzzy}}}{}~u{yuuy{y|zvw{~}|wxx~|xyxrn{z|~w|yzzvz}xyvw{~w~}}v|v~wxzyyv~~||||{v~{}vvvy{|}yuv~zw{}y|}{zxz~zxxptxy|{yu{~uov~|}zzzxty~yvtrz{~~y|x~{vwxy{xusovzu~{}xqntxxrnv~~wqtrwx~z|xvy}~~~qqx~|yvy~z}|~{{z{~|zurp~{}|z}vswsqtnhpykozqu{x|vxvwz~xy}{zxvwvwy~zx|t|umy}|~~|v}|mw}q~z|{ytqtsposvssqsw|{y|}~{tsty{zxx~yu{{v{y~z~yyuu{w{yv~{|}}xyzsxrw||}}|wvoqzqrrhv}{yw~~y|}ssuw{yv|~}z|{~xst|~uxvy|yx}{|x|syoo~}v~x|{rw}vmrntss~~{u||~xx~u~vxstuw{}}yy{usz|~|}~xyttvv}}|{zquvixso{prouwyzyutspvzzy~|t{|}yrs}|{{wq~|{t{~{{}{uw~rwywwx||{|{xwuqyqtqktz{}xwzx~~}utq}v~vzv{~{yuxyy|yx|{{|}z|~xyqp|z~~~~ss}tvmozuwpw{~}z|vzxrw~xx}s~yvy}}{|w~ysspu||x|}}}{z{p~zvwy~zxytyruutqzv|~|v{xqzr{u|wwwzt}}|w}}||tz~}{v~|x}{zy{vvww~|}uturwpmnqsz}}xz|y{sp|y}xv{|wty~x~~|}{t}y~~}}~}{y~yz|yupltv}xzx{mp{w}{yur~|~|xpxzwyx|zx}}~vv}{z||}{~~|}}x|zv{~z|v~{||}yw}|xwunvss}w|v||x~wvqsxyvp|~vy}~yz}w{{~|pfz}y|yw~{y}||~xwuzz{wxyxsxyu}y}z|{|y~|zu|{wp}~~~v||teq}}~vy{z|uttry{zy{tx{}|zz}|rwx{z~~x||~|{|{wytwxv}z|x{{x{{qrvrjy}~wz||woswrsuqpqluz{}zzz}vuyx}~z}{v}}{}w}u{|}vyww~{x|{~}}vjjsrl~yzzxtvumssnmolryz|~w}|zxssw|}{zu}{{txzw}vzyw~xx~}z}{~xkgpsl{zywyrssqwsmnqmqwu|y{yxurt~~z{w~~||vz|y}zu{zxxw~{x~z||ohpsl|}}y}{{yttvuwtoptqqttz}z{{zsv{}||~~~x{|~}zy}}|ytxzx}{v{y{}~~tjqvov|}~xzwsuuttopuurstwz}{qsx}|~{|{y{{|~{|}yt~|~ztxzx{}xzz}~~}tlrxnuz||x}~trutstoquwtuux~w~{xrtz~{|~{|{y|{||~yz|xt}{vyzwzy|x|~~zrktxox}x~}{|{utvtvtoptvuvxy{v~|zsux|~||~x}|}}~{}~xt}yy~xz|zz{xwwyvowry|{~}}uozxq}ww~xy}yxz{z{{|yz}}vrv|}}|{zv{y}}}}wwxtv|yz{|~{|xy|x~|}op~zxux|~~{y||xwvz{}}yz|~~{yx|w~um}xysnuvuxzxsv}~|v|xx~{~~}~rwxqw|yyx}}~{z|~}}~|y{~yx{sp~}v}}owywtkmtt{{~~{vwyux~~{v}~{wxpxynpwurw|}xxxy}yu}~z~z}zyz}t|v}}}}us{}w~~sv~}xrtzw{~~w{{vx|{}yxzy|~ztxy}{zzyovou}}|}xwvr}z~yx}~|zxrssyyxzuumkunswvr}{uuuyrijp~x|z}x~~}swq~w{zxyxw|}yx~{w}z~|snu~}vw}xrxv~qksnfsxtxur|y|{|{~{zyrjosv~wvx~vs|{~y}y~~}~xonqot{wzwz{lgrqwqx{{}{|xsxx}vx~}~xuxuzyw~|x}~xtvzzzvy{|}}{y}}y~{}stnxojhggpy}yrx}svzvxx{{{y||wliy~{~|z|tz}zy}|}r}}~~z}{{vpzqu|~~wotromcn~{~}w|rzpsplorvx~z~|}{~yywy~|~~|u}~~nswyyvzx}wx~zwnlhnjjwnsv}{~|x~{~{yrv~|{vwwvy~}}yxty}yuz~|}~zxy|y~~|~~}~x|qvkkqzvv|wpxxx|}~~xuw~xyurvtzw{ty~{t}}{|yq~}|z{|}wwvssvxwy~wvqxvmtpfp|z~}||~z~{}}~w}wzzq|{~}t}~t{x|~{y|uxzt{z{{y~ysnx{}zvvxojkhlirqosy~x~~{~v||}rq}{z{{uv|szx|yw|z~~~|xxtpspujqz|~{{vzvwqstqx~vzxr{{vtqsyoswozuxvy||~{y{z}}}}wr~~u~{spxyrz}vyspln{{x{trouwswsy~||~~xzvsuzwxzyx{}zz~zyxutw|z{~}|yywnpuw}wxuwwt~y|{{voy}{v|{~z{|v||sqoq{yywy}v~{~vy~{|z~~|~{tyunoppkssx|~vtyryuiyuy}up~|}z~zqssv{ww|~}|}wyy|{v}~|zv~~{~{~|}tutsxvwwx}vrx|rooyxqwrtqvyuz|z}~yy{zyury}~{xy}|z~|x{w~~zw~|us}~ztv|plomty{yyzt{usts{yzywzuy|~}xz}wor|vvy|~vv}{y}}z~}}|s~||{tu~~~{|svplzzzyywuyv{ynuqu{zwtw{|zy}ytussr|w{x}}z{w|~|}z~z~{rmxxsvyxz{{xz}{utqoy|}tvwyunoqqr{|zzw|{|zz}zs~}}~~|~|{vurxymsvqu{~~|xtsyvqx~}}yqz}z{}xnnq}{|~uxy}|x{~}}{{~|zzyy~{z~zzy}~u|~xvyxsvysw|~|ts|xos|{x{~~{{{y|}~|~xv||wvuuyx{|{}w|{z|}zwz{~{z}}ywy}xy|{vromzus|xqsw}}|~}}}{}~}zwxtvz{|v}}}~|}xy}y|~|{~{}xuv}~xtqrtw~zwqptqty}~vzyz}xz}}yz}|{rvyrn~z{x{~~~x}|w|}|{{}~~{}w||wxvxvuv{zuw~yqnrs~|ywt}w{~~zyvzyttvruzz{}z{xz||z{{x{}{{yy}xvxzvpr}yz}vxy~zvyyyy}zx~xz~~~|zwutns~||}}xz~xxzz{~zwtvssy}~ytsyuqr{~{}}{y}yx}yu~}~~~}zzw||yxvrpy}{|~}~~x~~ztux|~xsz~|{|~{y}~yyttutuw}}}}{~~zvyzxuy}wz|xyvsvxy{~~}}}~|}||~|~}~}~}{~{~z~vv{~zxsoqw}y{zuuz}|vw||{zy|y|~~~ztstoorxy|xuz{}~|{~}|zxwvsxxzwv{{ywwrtvvx{}|}zxtw|}{{~|tt|{xrvvtwy~}|w}~~|z~zx~~}{yyxzzyzz~~}zxvquyzzw~}|~~~zwxz~}~}}{|w{rqrw{~}zx{|y~}~xz{{zx|{}xvuvww~~~wuzwnn}{yz}zwy{{~}~{~zuwtppqsx~||~{|~~~}{~|zu{{{~~}|}yvyut{{~}xvv|~{uvxvx{zwuxxy{}|||}zxywxyvstwtz~}|~~~}z{}|usy~wz|xw||}zxqqrpw~{x|{x|x{~zzz~}zvrqqusw}{{}{}xz{}w}xzzy{wwvwvw{x|}{xtptzy{~}|zwv~}yz~}}~|y|vsqont~}z||~}}wyz}{|y{||{|yw|xxyz|{wwuuxzyz~|}~}zwxyvz{}vttyzuqv|xtx|}|y{}~|{~~y}|w~}|wqsux~zuvvvw{|z{wz~|}z|}}|zz{~}|yxxwvsrquusz|~~~~~|yvz~~}z}}xtrqvxwyyywxvt|}wxztvw}~}|{|y{|~}}}z|zuvtsswyz~~~}yyyx{}~}}|yxxww}|vst|yx~zusuwy~~~}{{zuvz~|{~~}vpooty~~~~y{z}~|zw}||yz{yqp}}xwy||~xvxvuvxw{}}}}~xw~~{~|}|vuwyuywtuz~~y~~}{|zvvvut~~~zovsxy}|{~{zyrsuwr||vrw~rput{~~~}wmvvruy}swsv}~~~}{ywp{~xxy{usnoqoxx{utuvvytowxuy~yy}yupty{}}}~uypszskjp~xvsuz{wuxyyz~~x}~z~{~{|yvpvwtx|~{~u{tz~yxsz|}{yvvoz~vz|popxzqphrpqtw}yxz{vru~}}wzt~|zopw~|~}|~xz|{zvvttuy}|{}z{yn{{|wzuqlkmou|~usy{|wzx}wwvx}z}z}uuulsqqs{|{}xz~{~~}xyuwtttsqqw~|trinpkmsqpw|x|z~~z{~}|vz{yztwy~xxxvvyss}y|~~zy~wvxqy~z{yxniq{yvuuny||~{~|yy~|}tvytz{{{}z~|wzxy|~~~z}xnv~~|||rvxu||zszr{yz~ytrsqioijir|vqwun|}x|z~yz|{}|{xwt{ssqnoy}z}}~|{}|~x~}}~wru{zqprjeqw|pvuy}z|wvv~{z{|ywwz}}zxy~~~}{w~wvwpzy}~yxwvx~}vxzvlhwv{uswu}}{y|y}t{}~~z}}~qx}}~xz|~{}x|{rqluuuxr{||x}rs||z~y}{~twtqrjokiiozvuxp||~~~|y}}~y}zx~}~{yx}z~pr{|}|}yzw}||zwvrtksy}~{zwyotynqjjv{~vxwt|y{~x{{}wwwz}{}~}|uvyt{wpz~{xy}}ty|vyzx}~~~zywv}womgilkojrs}x{x~z~yy|}{}xx~z}wuz}rtsrvtzwz|}~~~wlixuuyz}z}{~{}~nsps|{}x~}~{~yxxv~zzvoxwuzr{zz~}r{|s||xzw|ytsmnvnsuw}~|~vwvtwztu{|{wz}w}|}wtnxuxy}}yz}zv{zs~~sw{z|}xyzuppvlvz}z}~xvznpyvszz}}x|}v}~~ty~ytwpp{w{}||{w|zzuzy{vy~z}u{woqnrt{}~{~xuzppuyuyw~~uz~sz||yt|sutrpxsxxy|~{zwuw~u~z||wz|wolooqu~}wwuqpy||zw~{uw~y|~x{o|xvttrtxv}~~v|{w~{y~tw{|z~snoqqtwx}{~zxpqsvwwtxuw~x{v~~vp~utwyvvuw|zz~~uyzs{~r|{||ytqkjpwu}~~xsvqtosyw~~~}uqyxs|wsosrtt{zyz|w~{v{{nz~}{xwzxtmjlqxv~w}trtu{tvuz|w}{ws{vw~zqontzx}{|{|u}z{||v}|{}|z{wqljipx{~torsvssv}|y}~{~xt}~pu|{wvuwwt|{|{{{v~x|}t{}{wzyy{qmijqsw~~ytttwrrx{zw}{}}|wty|yu}zysuxxz{|{yy{{w~ryz{~sy~}w}tpjmpsv{||}stqxupwz|vu||}|||s|}|r|}vswz{y~{z~xv}xzzz~w|}v~qrhkqv{}}|~z}qvqvwsx~~wtz~}}r|zzyo{}vux{{z|zy|zzz|~xyz}}v|~svtiiquy}~~|~vwpuwtw}yx|~}}}~}yyqyy~yn~vw{~~}{~{yz{|w~y~|~}ywxy{u}vr{vvqyxzuvxy|{rr|yz~~}{vqmqz}r{~vyzv}yzx~z{vuny{utxu}}ty~{rqkkmnl{~{wsruy|uwz{z{yz{}rztuzvywwzzw|~~w{y~zy{~~~~z~wryz~~~zwqus~|z|~wwvvwxwwzvqwzz|~mkxy{~{vwtyy~xo{~}~zqqw}yuuwz|xxysuolux}|x}~}wzv~}~}uxpywklttw}}xvvvuv~|x~y~|v~x~}||z{zvu}yv{zouzwnsmz}z~||~vzyyx||y~{~ss|wpw|yv~z~{yuuxu{}|{||xrtxxw}|z{~u||{|zxvrsvt{~|{{kw|z}~y}yyu~}|vswuutzvwzw~vxy}{}tpy}pzuw||xsvk{|utxvvyuoovsuy{|{~~xz~~~z{yxw|w}t|ztyx{qz}x|w}y|}}yzuur{uu}{|y~zu|w}~}{{{qq{~||y}yy~xuvvy{~x~z~{x|y~vr|}{{yuu}~z~{v~|uzy|~{}||zswxxttu|yysssynnpv~w|y}~|tmz{xwuxxoswmvvtsy||z|xy~z~~~~}ysv~y~|}ppxy|}}~~}rwutwrjw~}{{yxtvovst{z~vyvxw~x~x|s{|u}pstuurx}}ytsvwu{swy{}{~}wtryx{y}|uw|{z~ww|{y}z{}|~ppqzuzxzxvwpzz|~||z~x{|{ux}zptqwu{wmtrtnopu{|}~tnw||zyrtvr{~{{xz~yw||~{xyzvux~}|}yoy{tqwt~{tz~}}u|yy~tvst~zy{sqousuz}{{wzyzwo{{||z}|z||}|rtq}x|}y}w~uxz{|zuzy|{wrfnur|{{||~yx|}z~}|syyt}y}zuy||{{|yvy}||s{}y|~|}y}u{~x~|~zwsplmr{}x~wkkux|z}s{vv~~wvqor}s}~}||{~rrqx~|~y|{ry}}y~rt||zv|s}~ywy{x|}~zwu||y{zouzwqrtvx}~~z{||{}|vrqjotswtvrrs||{wt|vwwy{||txywtpt|}}{vwx}{zzz{y~|}xxxzont~z~w{ux}~|y}|}~||rz{x|uursuzzu~}|~~{|twrvwwuonfkpry{qpz|tw|x~~~vv|}vuuzsywqyzy~~{~xwxusurx~~~ty|~{{{{|z{}zzvz}xos||~{zsuzzyz{xt{zz{}xvtvut{qnlmuy|vqw|qqysy|}wty}}zqpu|}|y}rt}|y}z}~zxxwqyz}}wu|}~{}|{ywz|}~}}|~~}zyxx{urouz||z|v{||y}zzzsyuxqkjinnyxspw|xr}wxwzyxwwzwtvypm|{x}~~wxsvvt}w}}u{x}|}{|zvvzox}~}zvvzx|xwwvyw~ux~}{uxxuzusmosx}{xw|~xq}vost~vzvtty|xu{~rqyw|{||wrvuz}~zv}|{xss{z}}~|}}xx}w~|ttwz|xzyw{{{tw~~~ysvwvytnjosw~{vx~}wvtw|~y{zywy~yusz{qnyywy}~|xstvx}{xv}~xvzy||}|}{}wuwv{}ww{|~wwuz|~|tv{}}zuuxtxvpnqvy{|zq|~ttt{|}zzzwvv{~vttzyr}}{yz|}zwyttvx}|zx~}|{xtyz}|{}{vuwy}uuyy}~yxwzw{|uw{}~}xwxrtqomqux}y{|vxyy~}|}}yvu}}}vttx~tr}~{y~~||wvw{||~yx~~yw|{~~}||z~|wstw|w}vz||~zwvxyx{wz||||yvyvuurqsw{}{wxzsrw}|{zwyxssv}|u||z|}}{zxvy}}z}}{wuyz|~y}{|{~~|vtx~~w|~}wxz}~ywvzz~~zwz}zxzxtvuqrvy{}{xvy}|~~|zyy}~~{usv{|tv}}|y~|zxyz}wuy}yvz{{~~~}x~zz{}ytsw||vz|z{|~yxx{||z|~}}zwzzvxwtvz{{{zxtw|~}zyx|}|urrx~}vz~{y~{yyzy|~ywz}|wtvxy~}x~zz{}zvtx~~vy~}zzz|~~yxy||~|~~|y{zvvvuuy|{~||xx{~~zxw{|~}wttx~ww}}zw{|z|{}}yvx||xy{z|~~~x||y~|}~~{vtvy|vu|}{~}{|}zz|}~~~}|zz{xvvvw{}||ywuw{~~|zww{}ytrv{~{w}zz|zz|}}yyz~}yxxyz~|x}x{}|{~~~~yutxzysv}|{|||{xy|~~~}}~|xvvtvy}{~|zwy|{zxx{}|wtsx}~zx~zz}}~~{xyzzyzz{~~zyy}~|{{~~}~~{vsrwywrv}}||{|{zz|~||}|yxxxz}|~{yvy|}{zy{||wtsx~}z||}{{|~~yyy}~zwwxy|}yyz~|}|~}{|~||}~|wtrwzytu|~|}|~}z{}~~~~{yyxy|}~}|xx{}zyxy{{vtsw~~z~|z|{~|xwy}|yyyz}zw}y{~~{{{}}yz|||~~{vsrwyxst|}|~}~|}~~~~|yxy{~}~||xx|~|zxxz||yustz}{}}}zz}~{yyy~{yxy{}{zx|~|z{|{z{|}{{|{zwtrtyzwsx}~}~||~~{yxy||~{xy~~~{zxwy|}zvttx{~{~~|~}yxx|~zyyz||x}{z~}{z{~~{xyz}~|{|}}yusswyvrt{}|~~~}}|zyz|}~}{xx|~~|zyyz|}{wttv}|}|}~|}|zy{~{zyz||y|zy{yz{}|xyz|}zz{|{xtrsxzwru|}|~}~}{z{}~|xx}~~|zyxy|~{vttv}}y{~{}|~{zz}{zyz|{w{zy|yyz|~{xy{}}zzz{zxusswyvrt{}|~~{z{}}yy}|zxxy|~~{vstv}~zzz{}}~|{}|zyz|~|xz|x|~|yxy{~~|yxz{}~~}{yyzyxusswzxtsy|}~~||}{x{~{ywxy||xutuy{x||y}}|z{~~{zz{}~yx}yz~{xxy|~|zwxy{~~~|zyzzzwutuz{xsu|~|}||~zx{~~}zxwxz}}zvssuz~zy}|z~}}||~|zz|~}yy}~yz}ywwy{~}zxxz{}}|zxxxxwuttv{|xtw~}~}}~{y|~~~~zxwwy|~~{wuts|~}{}zxxz{|}}~}{yvvw{~||}~~ytrvzyttz||}}~}yxxxyxwusrrrrqpqsx{yuv}}~~~}}~{|}~|z|{wutuwz}{uppv{x{|~~|{{~~~~}}~yuw}~ytpooqtwyyxvtstuwwwvtttttttuw||xy~{z}~~|{}}xrnmqy|}|uruz~|ywvwy|~~|yyz}~|{{|~}yz~}xy~~zxxz}}zwwxz}~}{ywwxz{{{zyyyzzyz|~~{xwy|zyz|~~{xx|~yw{}xttx|~}}}}||}{xwwxy{}}{yvsqrv|~{||x{~}yutvy}|wuttvwvtrpooqrrrqpopppppruz|yuw~}~~{zz}~~}|||}}|zxtqoosz{y||yvvwy|~|zxxz}}{{|}~zy|zwz}ywwxz~}zyyz|~~}{yxyz{{{zyyyyzyz|~{xuvy}}~|yx|zwz}}yutwz}}|{{{{{|~{xwwxy{}}|zwtqqsy~}|}y{zvsstw|}zyyzzywurqqqrrrqppppppprvz|yuw}||~{yxz~~}|||}~}{xuqnnpv}}|zxy{}}zxxy|}|{|}{y{{xy~~{wvvwz}}{z{}~|zyyyz{{zzyyyyyz||xutvz{y{}xx{~|wuux{}~~|{zzzzz|~}zwvwxz{}|{yvsqruz}~~{x{~~zvsrsvz}||}}|zwussssssrqpppppqsw{|yvw}|{~}zxwy}~|zzzz{{zxuroopu||zz{}~|zyy{~~|||}~|yz~}yw{|xvuvw{}||}~~{ywsponmmnopsw||xvx}}||zxyz}~~~|zxwvvwx{~}zxwxy{|}}|zxussvz}|yy~|~|xx{~}~~~{~}yxwwxz}~|yvuv|}yxxyz{{{zzyyxwxy|}yy}~{}~zz{vx|~{ww{~~{xwy{}}|{yxwwwyz}~{yxxz{}~~}{yxx{~|z|{vv|~zuqoqw~zvtrqponnmmmnorvyzwtuz~~zxy}}}}~~~||~~}}}~yvwzyusv}zwvvwz{||{yxxxy{}~{y{zz~~{zyy{|||{yvtstw|}{zzyxxwvvvvwy}}}||~|xy||yvttvwxxwvutsttvx{~|ywvvwy{}~~~|zyy{~zvw{}zwv{~~~}}{xurppsx~~|zxvtrqponopswzzvsuz~}yvx{}~||}~~~}}~~~}}}~}wvxzxtsw}zwvwxz{|{zyyyy{}{yy}|z||zxxyyz{{ywuttuy}~}|{zyxwwvwwy|}~~|{|~||~}yvvwxyxwvutsssuwz}~~|ywvvwxz|}}}|zyz{~zww{}{wvy~}||||{yvsqqrvz}{xvtsrqqrux{zwtuy}|xuvy|~}|{|~~~~~}~~}||}~}wvx{yurtz|zxxy{|||{zyyz{}~~{yy|}z{}zxwxyyzzzxvutuwz~~}{zyxwwwwy|}}~~|||~~~{xxxyyxwvutsstvx{}~~}{xwvvwy{|}}|{zz{}}yvx|}zwvy~|{{{{zywusrqsvz~}zxwutsstvz|{xtuz}}xuux{}}|{|~~~}~~~|zyxyz|yuvyyupptyywy{~|yusuy{zvuy~~{xwwwxxxxvusrrsvz}|uu~spv|}{zz{}~y}}yxyz{{{zyxwwxyz|~~~|ywuuuvxz|}~~}}}{xz}}yy|}{vuwy{}~~~~~}}{zyyxxwvtsssvy~{yxz|}|zwwx{~}zww{{wuwy|}|vw~}{zxwutsssuwy|~~}{zyyz|~~}}}|wsuxzyvvy}{{|}}}||{||}~|{}~~~{wuuux{~|xwz~}yutux{}~~|zyz{|~~~||~}|{zxwvvvwy{}~|{{{|~}||}~}{{z{|}~{yx{|z}{xvuuuuuutttuwz}~|{zzz|}}}}}~zxz~~zwwy|~{|~}yx|}{xwuuuvxz|}~}|zxwwxyz{|}||{{|}|wttx{{xvx}~~}}~||~~~~}zwuuuwz}~zy|~yutuxz|~~|zyxxz|~~|}}|zyxwwxz|~|{{|}}||}~}||}}~~}{xwy}|yy}|xvttttuuuuuuvx{~}{zzzz|}~~zz~|ywx{~}{|~}yvx~|zxwwwxz|}}}{yxvvvwxzz{{zzz{}|xtuy||yvwz~}~{ywvvwy{}~~|zz|}~~~}}|{{zywvuttuwz|~~}|{{zzzyxwwz~yz|}}}|{{{|}}{zzz|}}{||yy~|zwvw{}zz}}zxxxxxyyyy{}yvy|wuuvy|zy{~|xuuwz}~}xvw{|vtw}|zyxxyz|~~|{{{|}~}}{uonrz~|{{{||{{zz{{||}|||{||}~||~~~~~}|zzz}~{ywvvvwy{~~zursux{}}||{{{{}|wrnkmpstrommp{|y{}~}}~|zxwwwxz|}~~~~~}{|}~~}|||}z~}{{|~}zxwz}|ywwvwxxxxwutsrrqnlkpw|||~~||}~|tos~~}|||}~}zvrnkjjmqw|~ytrswzyussuxz||{zyxwvvwz|yy|zvsrsy~{|}|wpkhhimqv{|zwtrpooqsuxz{|}}}}}}|{ywtssuxwtqqv~~|zyxwwxz}}{zz}~zwtstvy}|xtrsuvuqnnquwwtrpooprsuvwxyz|~|zwtrrrtwz~~{|}zxyyxursy~|zwuttssrqomkjiiiklmopqrsuxz|{yvvy}|zz|~{zxxxz|~|vqlighkqx{yzzwrmjikmoqstuvvvwvvvutsssuwz|}yurqqstsqqv~}|{{|}}zvsqqsvz~{yxvuuuutsronnquxxussw{}}{ywuuvwxyzz{{{|}~~~~}}|zyxwvwy{~~~~|zyxyywropu}}zwtrqqqrstuvutsqpppqrstuvvwyz}~~|xuux|~}{{}}{zzz|~~}~}xsokiijmqu{}|~~zurqqtvxyz{|||{{zxwusrrrtvy}|xvuwy{yursx~}zwtqpooqsvz}~~}|zxutsuy{zvrrtx{||{zyyz{{|||}}~}zxvuttvx{~|xtqooprplijov~~|zyyyyzzyxvtrpppqsuxyz{|}~~{xy|~||}~}}}~}{z{~~{wtqnlklmpsx~{urrsvy|~~|{ywvvvwy|~~|zxy|~~{xuw|~{yxwxz}}}|}~~}{ywutttuwy|}{yy{~~zwwz~~|zxxxyz{}}~|zxvtttuwy|~}}}~zwsrrtutpmlou|~}{ywvuuvwwxyz{|~~{{}}}~|zywwvvwxz|~}|}~~|yuromllmosx~zxxy{}~~|{zyyy{}}zwsqopsvwustx~~}|{|}~~}|||}}~~}zyyzzyxwvvvwy{}~{zz|~{z|~{yxwwxxxxxxyz{|~}|zyxxxz{~{yy{~~~}zwtssuwwurqtz~}{yxxxxxyyyyzz|||{wtsvz~}~}|{{{|}~~~}}}~}zxusrqrsux|~{z{|~}|zxwussstvy|}zwtstvyxvsrtz~}|}}~~}}||}}~~{zz{{zyxwvvxy|~}zxvwy{|zwuvz}|||||}}}}~~~}{yvutsstuxz}|z{|~|yusqqsvwwtsty~}}}}}}||{zyyyyz{|}~~~}zwx{~{xxxy{{{zyyyyz{|}~}{xvtsrrsux{~{zz|~|zxwwwxy{}~}|ywtssuxzyvtsv{~}}}~~~|zzz{{zxwvvvvwxz{}~~~~{yz}}{ywwwxyyz{|}~}{ywvttttuwz}~~~|xurppqstsomlpu{}{zyxxxyyzz{}~|ywx{|zyyz{|{{zyxxyyz{|}~~~~~~~~~~~~~}|{ywtrponnprtx|~}}~~|{yxwwwxz{}}{yvtssux{zxutw{}zz|~{xuuuvwwwwwwxyz{|}~}}~|zz}}{yxxxyyzz{|}~}{zxwwwwx{~~}}}|{z{{|}~~|zxvttuwyzwtrrv{~|{zzzz{{{|}~}zxwy}~|{|}~~~}}|||||||}}~~}|}~|{z{|}~~|zwusrqqrtvy}}~~}{yxwwxy{}~{ywvvxz||yvtuy}}|{{{{|}~~}}zxxxxxwwvuuvvwxyz|}~}~~|{}}|{{||}}~~}{zxwwvwxz|}zyz{}~~~|ywtqppqtvvtqprv{~~}~~~}zy{~}{zz{||||{{{{{||}}}~~}||{{||||||}}}||zywvtsrrstux{~}{zzzz{|~~|zxvtuvy{{yvttw{}zxy|~}zwuuuuvvuuuuvwxyz|}~~}}~|{{{{||}}~~~}{yxvuutuvx{~~~}|{zzz{|}~}|ywtrpnoqsvvtrqsw}~~~~~~~|yxz}~{xwwxxxxxxxyyz|}~~}~}{zzzzzzzz{{{{{{zyxvutttuvwz}}|zyyyyz{}~~}|zxvtstux|}}{xxz~~~}}~~|ywwy|}|zwuttuvvvvwwxyz{|}~~|}~|zyyyyz{{|}~}{zzzz{|~}||}}|zyyxyz{|}~~}|zxusqqrtwxxvssty~~}}}}}}~}zyz}~|{||}}}||||||}}}}~~~~~||~~|{{{{||||}}}~}}|{zywvutttuwy|~}|{zz{|}~|zxwvwz|}|yvuvy}~}}}}~}zxy{~~|yvuuvvvvvvvvwwxyz{|}~~~~~~}{zyxwwxy{~}||}~}|{zzz{|}~~}{ywtrqpqsvwwurqruz~}}}{{||}}}|ywuwy}~}}~}|zyxxxxz{}{|}}}zxwwwwxyz|}~~|{yxwvvvxz{}~~}~tuz~}||}}~~}~|ywxz|~~|zz}zxwx{~}||}~~~~z{{xwy{~~|z{}~|{zzz{|}}~}|{{|}~~}}~~}}~~}|{zzz{|}~~}}}|ywy}}zxwwvvwwxyyz{||{ywuuwz}~~}{zz{|}}~~~~~~~~~~~~}|{{{|}|}~~}}}~{xwy|~}{zywvuttsstuvwxyz{|||{{zyyxyz|~|{}~|zyxy{~~}}}}~~}||}}{zxxxz}~{xvvwxzzzywwvvvwxyz{|}~~~~~}zxxy|~}}|{{{{{|}|zxvwy|}{zyxxwxxxyzzzzywvvwz|~~~|{{||}}~~~~~}}||{zzyyyy{}}||~~{wuux|~|{zyxwvvuuuvvwxyz{||}}||{{zzz{}~}{{|}~}{yxxxz|~~~~|{yxwvwx{~~|yxxyz{{{zyyxxxyzz{|}}~~~}}}}}~~~}{ywvwy}}{ywvvx{~~}|{zzzz{{{{{zxwwwy{}}}|{zz{{||}}}}}}}}}||{zzyyxxxxyz|~{yvuux{~}{zyxwvvvvwwxyyz{{{{{zzyyyyz|}~~}{zz{}~~|{zzzz|~~|{zyxwwwy{~}{zzz{{zzyxxxxxxyzz{||}}~~~~~~~}}}}}}~~~|zyz{}~~~~~~|zyxwwy{~~}|{{{{{{{zyxwvwxz{{{zzyzz{{||}}~~~~~~~~~}}|||{{{z{|}|zxvvwy{~~}{zyxwwwvwwwxyyzzzzzzzzzz{|}~}}~~}|{zz{|~~}|zyxwvvwxy|}|{{{{{{zyyxxyyzz{||}~~|{zyy{|~~~~~~~~|zywwvwxz}~}}}||||{{zyyz{|}~~}|||}}}~~~~~~~~}}|||{{zzyyz{|~~}|zxvuuvwz|~~}||{zzzz{{{|||||||||||||}~~}}}~~}|{zzzz{|~~}|{zywwvuuvwxz}~~}|||{||||}}}~~~~~~~~~~~~~}|zyxxy{|~~~~~}|{yxwvvvxz|~~}|{{z{|}}~}}|||||}}}}}~}}}}}|||{{zzyyyyyz{}~}}|{zywvuvwy|~}|||{{{||||||||||{{{||}~~~~}|||}}~~~}}|{{zzz{|~~}|{zyxxwwwwxz|~~~}}||||||||}}}~~~~~~~~~~~~~~~~~~~}}|{zyyyz|~~~~~~~~}}|{zyxxyy{}~~}|{{{{|}}}}}|||||}}}}~~~~}}}}||{{zzyyyyz{|~~}}|{zxwwwxy|~~}}||||||||||||||||||}}~~~}}}}}}~~}}|{{zzz{|}~}|{zyxxwwwwxy{}~~}}}|||}}}}~~~~~~~~~~}}}}}||{zyyxyy{|~~~}}}||{zyxxwxyz|~~}}|}}~~~~~}}}}}}}}}}}}}}}|||{{zzyyyyyyyz{}~~}}|{zyxwvvvwy{}~~~~~~}}}}}}}}||||}}}~~~}}||||}}}}|{{zzyyyz{|~~~}|{zzyxwwvvvvwxz|~~~~~~}}~~~~~~~~~~~~~}}}}}}}}|||{zyyxxyz{|}~~}}|||{{zyxxwwwwxy{}~}}}~~~~~}}}|||}}}}}}}}||||{{{zzzyyyyzz{|}~~}}||{{zyxwvvvvwyz|~~~~~~}}}}}|||||}}}~~}}}|||}}}}}||{{{{{{{|~~~~}||{zzyxxwwvvvwwyz|~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}||{zzzz{|}~~}}|||{{zzyxxwwwwxy{|~~~~~~~~~}}}}}~~~~~~~~}}}}|||{{{zzzz{{|}~~}}|{{zyyxwvvvvwxz{}~~~~~~~~~~~~~~}}}~}}}|||{{{{{|}~~~~~}}||{zzyxxwwvvvvvwxy{|~~~~~~}}}||{zzzzz{|}~~~~~~~}||{zzzyyyxxwwwwwxyz{}~~~~~~~~~}}}||{{{zzzzzz{|}~~~~}}||{{zzyxxwwvvvvvwyz|~~~~}}}}}|||{{{zz{{||}~~~~}}}}||{{zzyxxwwvvvvvvwxyz|~~~~~}}}|||{{zzzzz{|}~~~~~~~}}}}}||{zzyyyxxxwwwwwwxyz|}~~~~~~~}}}|||{{{zzzzzzz{||~~~~}}}||{{zzzyyxxwwwvvwwxy{}~~~~}}}}}||||{{{{{{{||}~~~~}}}}||||{{zzzyyxxwwwwwwwxyz{|~{y{zfhdh_cnofRY_jiroihcwz`_}\_qmSB:>JIYexcJf|wt\YnwiVCQxirnXnjżuudXms`px}njmflVScn`TL^NUkYQoo_qKivo~iloϹ\T?JUB?Mnilqer~rwv\ikyypng}YyihcPLazflawyyo|pwgGN|rao~\P]Ujk~xxyokO`}iyt{ouñǵØ~|4.3DxĻr}yQ`sYOPBV\XXehH\^mW=fekidWUSLMwaTGdebo|cv}|uX^mwb}pefc_y{le}out[sQP[f~l{yhZp|j~me_toyh~m{q}yxwúĶeg[PVKN[m|tc]Y[_3_J21FLC_rZf\^d]qOfp`POsxUpc^ZMTMtpfrnd|wbsadS\~}{tmy}zgaSDYhk{af^No}~l[z|tqywfwqcoz}win{@DOBPh´iqelVO9VoTT`WWSeNXfHd|eO`c^z[\?UE0F__p|t~mfvXgonotb|mozjkyqdq]wLQ]ny{|tn]pcnt_ixwo{wxpŰz|pyS@4$ieXy|]Yxc_gaP;X?HPk`drmGebJNhnDRIGolKA_uGX{t`}ehOio_sus}|m{ZN`iF2uyubYonps}smsquf_w}`tnÜ|lD\[GVVf_ҾkfjNFT8]g;79Uw_l{}rcykux~zzh\Ti~YThfmYriltsnnoxb{ssquhk]oy{j}{yq|j~viMKMOR]~yfrkbWS~fOAYf[[qnQPwtgcXk_TgZLTXI_s||ro|mauSYmNb|h|wZfe[BcX>Gkfn—v}wdfsh]tqzy}wukyy}qa]MAII5G:y}½zucxhSrsTM_Ta^i_[qq]fqYRrmO]@AkV7)]oTzoo}njm{vnzsiofpeKNfjDg~|Pmśqn|fslogrs}zogxyrvvVp}zmfm{lwaZkaRUepέ~x||s{zvuj{tXWjeqlytjyxvw~~~Z~vjg[KLYQYVIIA[a}szhrr{ppjpfmwnqvpbb}}|jfjo``fJcUWUPQXWFJjFQ?>jfbnìĶ{l]qjnTVjkip}{ut|}uaszwd\JfpIPT]e\_L^Waw~uvyqvubne]ugp~t`Xghyxvtlh[m~dLRbpeWWUcbaaR;8QIUeI`uexvywͱĝyo}qhnsodpuxZkhVsy~olqkyimxn~bltl[``xvykqefs|v_RSFkz`{UXpvwyxyl|timyqa}od[VpcZm{uz~hYCf`CE8A<-952NtwhW]wrqb_zʬdtvw}zs}dyttk[qYw`eXMVbaKMN]sl~xκtn~ntx{v{|kteSM-MoiaaVbWLHPjWop_zk`~pgi`oXNR\`FaQ`daq`ysqhodWp|w}pnryQd`p}}z_KJcfD`EHtilh[Vbykkn`ti~zz|cXfq^mXO[JS[PWrfVMQVc`dc`jtT\_Tqky}y˯˰tuOSL<||xbZqX_jzhihqoao[^mp{u\OPQZ\\UFQd{wrzuUr~}vuux~|xuvptx}d=bJLokolqvlwbRTOPLiTNnec]EWfhjunj{l~nwy`amkm}su}ypgzzsmnpg~qvfZumfhpsurok^hZvwmufTtphvpty||hYTVZngp~zyehj\emQVZMJiwjvzdl~]pwoya`NinRfgp}rnwcsXlucnpmgnfh_lplk`W}ib~}c[etm[aR_knwvooyeXp[dqjeg{fpvdqOZrzrbp}pb_h[z~~cb|cikSara`lOYfcVB7FLkvwncorjgTgZCaTDa{~}ttn~x~λszswnpo~`Ya`wkf_RYh[cd[_|uotzuTqj~ywz{ij\lofr[egnq`iklrvpOcfR{re|r|nxorqsl[hms|cfwzwc]rl~y{hpwu{}ph{ku~aq|pp~uf]_iMhzXrwzWurm}{x|rg{z}wżʳ{rgnf|v|scZ^_z}nhvbnuUj|ovqnYWkcWMUn_|}|nwyt|py|~v|o`dMU\KPosymZ}|myiki\[qxokxq~~yxm|essmUKXLd_edQRdwzcubyiHl{E*>KC_Yrr}}uosl²hm`e^Nir}{vj|zq|w^e\rsl_XSoT4>^I,8 (NR\]`lw|se^Yvvh|xy|wo{nglfGCWwiilkz|snw{wgTRTXo\Y4$+7A:DRQw~ok}nffMf[Wd`_fwy~~}jm{~fsdjld[_mprzt]E<46UZyrimVVG6JTW\]ZjkVhuc]]_`\aXsu|fouptpgkc]btwyupnfY{}y}s̡yuiJ>XB=RmbigYW\ekxx`agYUcWNRQUeMSr|uixvx~v~njzooutYmy~ymwqYfZTOGKcppeYN?QlcpkZpoy~iRZNMSGG]|}~sy~pcxyhpiu§rzffcUTfyz{qzvsZDbx}Ÿkmufpĺ}cYMC9/'Gl`ȼ~ezhjx]PV]scP]_^^YXnm`k`\Z]acgwh]vgQI?M_^||v}{|wwkcJ653KUu|tlQst_ZTQMJBASYYb~~{hlogwzgvtu~o{upfYNTY_zq~|syrgd{thpdLPD5?do~sszrl}vtwrkdaTIbV:I\Q^uqqqjwrr{ospe^]^[`G7h{|vt~xq~fUQJ:'6dm|cfq]XcelhJXlh_PNefZkljnne^_on~|cbgN@6?Y^yuw{qm||owļ|{h^YO/'GWXln^piUPHFKMECZ[Sx|z~ybn|yrwdkkjidec[Tlqjsywsjh||}tvvn_^T9BH?Pms{z{u~pknrwulebRRO9JZNf{s|uf|qrqi\PJEIUIb~z~t~~vlsq^@93*'+GoƼ||f{r]YZXcgOS]UQXs~uxdfhgjovqr{scHQbI8Cuxbvxyin}mip}sU\ea[RQe|vx|lgb`xnoj[J;@J53AOzϿt~dr{zre^\WBG[Wjjj~zmgztime[QE?@A97>Q{rqrsmtvt}xx|}ogk_QggV\flrݟmtyjz{fhqpe\KX|s`Yjynyxuwyqf[J\qfknie^XihYe~{hSKkԗ{}vzx|tkwp^\ydUQSUKH~qyxysh`jt_UTRQOJQrnq~~{aF9DStYNZjZ\ooruwtmm|yz}eq|qr{iqónkhjidZNRZVs̻ҽmA1YaslVH=),DEJF4Ms|tglxkyxh^cvfiwtknȹqpkZ@)'/+OȵwnhhiYJaa;Mxoc`^OKPqzc`[MZWJ_qnlshb{{o~srmdYQJPRT{·to}praj|txxlflfdջznlUEB=75>NNCHj|jdvXgmYMHCEL?FoyqstvZ^djmc}ĪxkNKHB=96;?(-b|`N]gSIkfc{anqzpqd_XJ7)2THGŰiXdkZTYdWF`~wjkvh]cob\}ychk]WTYpymȾ|ie\J7*2<5Luof^Y[\NFZQFe~~rkh_MXllobcsoc`pvqɳ|wqoqrosx{uZPP7*<@Dh|{}wvyyvzsfurcXljVQOG=BIBSdsmzwddjkjoe_q_SOTUX²wzv_]meWhsswklh_ovbTSOD5+*8FDjĹrnvubxuero_LBBTceynujSJGDB?C^jPfscfubJDI]eczylWer\KGPV?6Sv±x_TQNIAOMIctupheiwqg}ytldbr¸sywhb^Zbusm{yypjTA8/'*C[f˺}wohffebcm}vqdWhtekq]V^^bzzmc`YSRSXhputmZ=IfpkjblbQN[eWVk}p_dUTPB40?\el{yxo_lqyc_fS]_QFJdõzk\TNMJHTuwjouzcLKTA-3Oabvq^kmVF=9??0@qȽ{}~kTLLKFGUUSm{zwwpkd\VOVxyvp}jckWF<2&)Fa~ɽoZ`k^^aZnxrmhdlupnnh`WQRauyy~nfc_^ew}~n`gU?428M]bϹ{tmgcdk_Lm|wqkbQH^eQO``IJ\mǴ}rpkfb`fqhf|i`[O5)?WWUrnmwupmnx|lxg[qybTQNF<;Rshfpdrr`ZalbYsjszpmg\STgvltl_X`j[Slxgnx[fsVNMG=7=PRRoznt}jbv{r\MUULIXjhw˾m_UMKJHMY]cr|p]ZbTIW^Ym~xnaooXKE=7>C>Pbpʻ{e^_]]bUMf}}}y|toldYTSUQUo|uznv}mk¿iZSK>1,3CELz˽zkZ`olZJ\y}xo^c|_eolb[\gunqê~pkgfdi}mf|{zSKWI/$(8B;Lrȹ}h\nZeudSQ\`H>Tnph~üwjhgebclkZe{{kd_UC2Ce\Rrkr{ytu~tgz{_ShgRGD@933Fce^}õysqrzmf|se|nb\VNHJZgcmźwkb]frfarossrwwp]PJD@CSWShò{{zunknx}r`S`g[\VBAJOYmsyӼ|rh`\Z[b^\{{utjdSBJTRXV]z}wcbrgPE@9/1EVV[z°zowiVQRW]OLf}oi}wrqlc^dtueumu|mdttYneH@=5+'0HWXtİzp_^y}a`}ztdUivUTa_UR\r|y}v{j_YWXX^vvtxvXFNR?4A\hjzvtqs~qo|xr`SckYKGJSQBRzlaaa`dpogxuk{ycVOIB=8AdwxrcnyzwislZPJD<;BXpútaassnslo{tnjkib]XRLHJYsDZth`YZfsrnqvhqnVWXF616E\eg}w}oZO_aLGQG26Mf˵nf^XUV^lgfstnebXD=Xswozynvwtrv{\EN]L7/-*&-Ju~vųrw{k_bqtgoiYyvfa_ZUXjv|~zjcfspaobPkvW=64.-6Ngmxùzrnh[_zxhtxrmaPXrwgPNZ\]hxlb]]]bqugtzgS?4=D>Gamr|wwx~wm[YjfRHDBFRTZt{{gVSVYckae|vunwsb[XROR[gtzdgv}qioxnWLHD<8>Qfl~sb_r{jf|zqcWhv[HMPJCDQjz{ʼvia[Z_p{f{zjXddOBEUijj|yxyvb~vfQPbYD>GL9/FizzϾukfc_`jl^d}o~ve_\SB8Oqk]p~|jr|~~dZkeOA<71/8Urokȸor~tgloabyei}nfc^YZewypvqgagtrfpytkZ^d^J7/)',=NNXvŹzy{~q`fvrmeQKSZbryt¹xme_^_bjkh{yn}m]R@3=JLSSWq~~|rlZ\mfRIFB>GZb^`xȽwigiqq``wgeyr`YVOIJU`VU|~lnwgicQNJB<>LYVZ~xoa]rgSczzseRZytOCNSMKTgtq|ʭxqnkotcz`OY_NAGY]Vc~||{~kd{|q]Q^cP?:@G?2BbjkȸwjfedgmdXg~}qmibYQZtwo|rgr|~{v{|j^f\I>93.-6K_jrǺou}vrccx~ztrsojea[UV_osmvrg_\cryrkk|}otm\\XF838FWZ[rθokvc]npa`dUBGYlzwyļqga][]dj`^||hhxr]QK?,,F\\S\z{dhyp[PMHBDYuvcsmpwl`_im_]qhN_yp\RPMIKXmrep~scjrkZ7,44.?]ybewN4\pFKNVlr~ƽxqpkhl:1u~pz}zioo[_ldWKATVar|اxWlvjw}wfpdXeld~g^b^emyy}bO*\uvrgg}]~|bkp~~ibrliv`hQT^v}sL )R{d_kdhnv{v\vqYqpPH\sukT__aPbusw^z̪vg_?Cl{vj~udLUX{PIGUmr{ͯr]82S[rJE>77KDk~u{yybwrnN3Y\Wqjp{h|g|sjit{~ocwo}w{r^qjaqбp_zin{||lkhJU\WоïyVqW0;0J}ĺ\ihibD;OS^s`bicn]]g`PBjp|qnMfurm{sbxqepSAB(chƧ~z}|_r~fjwuwgr|~׶Գa\T>GQEHANuuugkpXC|vUP:NgMQvv溧~~|sbmwZWkw{é[YoI?C>5f|ɦg}c`TZkQEh|Y^oTL[L4k|_upj{pmvz~c^[HL?&5BKkr}wYka]]yd{iOF3FF;bzmZXLid>RzpmH'T]FS^]czwws~}mlBZI39N>Wg}hnkua_|ɞthzsdm<<*;YP[߭ykwq{dJcog\:Q;7.1MJJs|sovtkirjsrI8b]Sj}ġ}|uz}hriuzТ}zǻ~u~mGW4%*1GHa~]qaM[tUEmU/-!A[P[Kf}yxtf[AW>DG`~glcSW}w}{XVztj}{C>DTH8cjt|ƨz|pxdxsm`RE]W??;STpcx}^nyHUje]PG9`E*IVkʲlz}yKmZ]uf__yt:'GH<:\aαǏ]uzSaV@oSahE5`]?Olnjzd]uq}|lage88LTK[~yǜojWusZ~nq}}Ó\OyF#=IG3Mlף{|wdSVelcNF`;Q`LRehxQ_z]f]vOMRW?:VYaxipfhPqgbmpS_:!,%{masɿwddj`qxd8JUOP]_p{sr\v`vns_~jc\{]gP1Yhj~ùfniuI^[wi{kctaIIQ4AQZKd~]pcdjTMIgulzqsj{muG\]iiG_PcVVt}ukV~e_v`}tugdd\LG8,5\[[xɋx|elr}Qqp6fgUdS[kl{q{~{us|}UlgX_,Bd)2:fʛ}{}mjzaigzRdth|Z9E/=HTVsȯ~otRNjQ;P\8XfsiOx}w|wqaSzy_TMD>aQ]`ânwgWosdeétm\]t_kraH"Q[Rlkwkghaz^KS+HdDEF|r}ux_QuwdISNEC\Tnzugeaxnzz}mL^Njj, K]YO@}u~m`rdVdYhlc[ljQ.5166SWcxĤmxkqrFRsgdVQrr~lwstuiYvyRH53]E77a}Ȫȿnj{{ypmun[lx~}q}{y]Eu~q[8?G7@Oa^Ƕc[QcHGdPAdrs]jmwmpfmy[HIG:M\LTjz{muveW\cioypovT@ZpXQ[NA%Gbhqt|ttwr}]F3;Q{[B\~{vl{fe[[pbVF>U_ibmqjYgop^q}r]sb\CIRT' %AW_lϾȮ˵|mimtm`|[SY?/OMCE=hǷΰ{wfi`Q_Tk|zoxjy|t}p}jH\~zhJ;PZbsdwsvfyalR;r]^[tt`uo\cRUS159:=Aalȷġ}ljgfLdsgoUfw}~nleZjclca[>JYUcSwvXwyt^Zoskt~togcIG8XaB'4.'^gRfiɼѤǽtlIZg[[Yz|y}dziLjcH]MN[L>Zflx\p }}tidhx\Wjgr\}|pkqscowgws]`JFgUMPA5Tnm̻|}yvgLPNCxbfnsyrVYudl_UK-;R[gYySzpaONsiUrux{|^Y\NVD]XF92MIDXhݯzakzr^]z{~opL\ow^F]G7>K8c{ſyo~rkckVRgbym}goTLR1@xW)BQ=HѵĬƹ~t}dfWco^ity|prjZo~_N|~f1?fZbioequwQfqXQ]`Wx^ph_t[Z^PUW,7JR=&6 H67pnpp`[rkvcUduprux\ETgQ^^uiv}~Szcldsu|oT\UnǠto_|mlKqh`YWpxZW[`w{{lݨϬLJqxrz~oSrxlOr~wr[<.:a6PVDLZNKYImDPgk|gIew\e[Yd^Nh{qTYm~guapg[ULdtWkuZv|_qab{XWyvvS\T|xbuyc}yhMt|ÊtjhrcUWzbpwzh_h]HjPX=BROBKCJMRmfc^DAjotX|cm{z\nnYs}hlt]eTlnSSokZ}zzzYOum]x~y|m{rgkclZTnwldfht8ksyȡwzΤyltfXplR8Wb]yx`WP|@=?2HD@EGDV%L}gsrqX}idcquzdk~~XF~gELitdjs}v_b]ruhon^|`MizkzlheSbQXNmmfnYulsص÷vt{gjpg}ycMhxpnw^QCS@JB\[^fjis2LlvhjRugm\X|]act[ayq^L}jTfgpow`RbRj|z}tqYvn|pv]uztrfqai^y~Kupw®~ivdr[r|cG\kdwy{u~}ikBSE[XYcb[b,Cy\kV`NlbgeXylyzxotvTyrQQtWofjbiSY`|vu`yrR_i\qu~{|gH\Tpplw|{LR|{yut~ų}\lK\pgAG_\nyz`}8G@MOKT[ZkJ+tltmmkozds\v{txzW}im[XmIBZiT{qobyi|r`{~OZu}YTqq{|mpUMRUjfsOn}oĞ{npvaaVMejOcjq}yqco;ROd`fwuor?Gft`i_n`]gVmhoi{tR{XpVcsW\polte]ejpxiXeaeqoy}zu}w]\bnzrtM{wx{vsjzodNG]zaIY\hp~{~FVUg`bpkgj9Ax`l[aasf_j]rtz[[t`_lNSslfr{brkbwt~b|PZuVSadmt}xwfQ[gthtuKyzr|iv}zq}voHsR:JjgFT_owwtJDK]ZUjvmpP?~{xxmt}{evflpvxyPu]]bIbKLfi~qz|i~drt^f}OTie[lr|}qjwrJTgxmyZ{vmsr{nyc}{~worJv^GVvuTajwrpxXO]qkhzxuTF~{urbhzwcrbdgqrxPx^cmZnY]vxwgoser^yv|dp~V^se\fnrt}y{|y|yVax{p|oT}~yz|sqhlyzfOvNHWtbKXapizVTip`cyynb?Spsiapqs{mqtxq\~VraabQ]|m~kxys|zstwox|RydQ]vuTZ^oe~zpaQhwmlwX`pqsyhpyoiz|boBaY?KcmMT\qjtiMape`twnRR~~jnq}nijvs{yPuZ^iX`NUju~zy{zeoxl~UioP[pa_dvlx{snsSjurfc~jvvv|nsxcfo}uarL`eJVjyYW[nfx|z^uvpqUTzzde}nyldess}xTxaevdeV[mu{tyu{vcn~s^rsYbt^\]oauqunxazwrw^avv|s{yjm}|}{emw}ftQ^eIQaqRMOdYiq}øgxwpzmSPyxxjavxnmz|[xkaxf_RTa|ozyxjzvjzzp|ectU[fz_SRc^dlyrzdotovv_Zr~qpzpcblwh|uhshd[IdGIRl]JMZc[wumzrrxcUp}f}~~qgnxydcsYln^UPWnut~rqnjhvVq`X`uv\Y\nZx}ywtfxus^owwww~lsvxkdiz{|v_amzqZiQ[`KTct[SRgZmnyy{~w^\zxx]x~wjbou||_orbxvbYYbxw~l~~gq|n|ot^w`^cyqZV]iUtx|r~rysjYo~ptvx}uy||ieiyzvvv_es|s}ZhR\]IQ^nWONdUmj~|yysZZwu|]thrx~corcsx`UW`ss|k{~pro|fqZo]W]pqZTXhS}t~{oup~lZj~nys}n}uo|eadp}s}]p{ecwhuZYVP]GLVmcVSdecv~}u~g_vvhvvehqx|aendi|iX[btywyzsf|h|~y|`m]kbX_oze\ZmXozzy{w~s^jeukx|wkwtoieiupyyyWfws`_ugp]YYUaNRZqhYTdbatx~f`vqdrvdhq{|dlqlop]ahxysxungzk}{dmbo`Y^oubX[hTn~~~zrjYlvxermzrrwuq~bcgtxxnsqXmvp^isflVYT[XKQ]n`URfVrnŷŤ}zt]gv`ufqvqhnmkub\ajt}ohsppvyjccdiWYatl_We]dn|vyow`d{sf|iqwxiqoprh[aiszpu~Z^mm`\odd\QSV\KMVji\Ubb`yİzjh}rjwydho}udmiollZahtyw}liy{qj|vpnbcfm][aruf[cdYyuy}r}fbvmlq|gjrygrmtor]bgrvrzq\Yhi`[mga`UT\aPPWik_U__Yxyìʼ~mi}ols{fiqxjsluop[`fovu}kkx{royqqgcmo][`ppcWa[Xprzz~rzcbvjir~hltylukvnoX\ahn}mvsa^ikc_oj^`WP\`NMRcg\QZYRxrưëqj}rxpmlu}jviuk}uY\_hmx}ulwztn}{moi]iq]X\jpfZ^^R}i~{~skaupȿu|`jcgeFEDLJmuWZJAT`evqs[JX\YR`fX[`Vexjfmz}Xsr{yæyhwi^w~n_gr{`leittmfgnnmn]NOCXgokx}wj{pevlfi|{y~mEzqiXbqvxwsrrpxtnWXieqyurQS[^Z_rshvxnp~O?tXOyoolliu|no~cqkywY7-;Rkkʾnbfr]UdI_W[eJDBAFo_HF14Rlju{pvXPSUV]mrciay{vu{|vd[H9j|v~lvĽzrezWN92K{ɴuqga[dj^OjXLzk\\ahhaWO4Qq`lu}{xfixkwvxxup`urW<,Ud_yy|sfn]`uoXJQ[gej{~sxtvxypiccebMGYzyxtwvqrvpbzy|dboaE26?MTc}ĸ~ja\nXc_KD?AgiPQ?9He^e{x~zo^]WV\kpd[e`spstvpgN;_h^j˚{gtmTCENZZ[itxheuzwxlfdpp_Wc{{x`Vw{v`U{fzv~gp`cfdi[RefUFKVbgkuqA]~~{vw{tVl{rktűtS>Xiijj^rmos||c\zv}nu_Lhz˨tl}uimu~}YI8/:^ŐzmhfieX8EbYQTsgYbdZYbEHbkww}jnY`poa[bkt~ww^LJ\bwo^TX{{jpeanmg[Yg|{xlY\U=\~ڿqYbg]MKQYcmch~p]T[hcvqvxg_Yp|{{ns}_QF>Ii|z|ah{}poudL=AXfrZKIfcPTGBMgk\rx]WiXC=22B_qrh{W~zrps{n[~y|qrl_iaMmʲ|kxzopx~qvmJ?66HoĔwpmqoaAQkaZUpiSWYRW^BMht~yzonY`mmb_emu|owhULRfj}q`Wdvpujk{|vic[_uoeaVQ]IJs׸mdml^UV[aps\tx}}ufYXddosnyte\byws~{o~hQKAD[~pcyx~|zziîs|ztnbOBAR^qo]Xqq]aXNUjs_j|_PeYD?52>Ylpk`zxst{p^~vvzgie^k`Jf̼q||suydqdH?53EiÝ{z~zbIdmbYUncOTVSbZ>Qep|~xwjZemjbcglwklz{rcTMTY`whc~t{wnttpj`X`wxw{a^ZT`T;Smӽuyzpebbdmz\byw|znbZ]XZrxw}ncdy~v|i|qYQC9@Wn}ʬjn¬usud_ShkQPX\onQ\lr||v_AHbx{umjngWt|}wtwwuʷuLMmҮ||kYqpPbpa`]UUfytzuafpTGLN^gLOgvͽ~URnx~oIhyglqohb_^Sixpqsp\N[}~|~xwƻaQ[˽k[hV@CHTfQDYdnz}xtZRdx|Yanhllfa_b[hkTU{tkRgbTRJCJ\jpvss~zx~wibO?UzjoooiaZXRKmjk~ekeSKc}|mxzRXdTPMGIZo|rmzpgu`LPTdqWQenx~{cavyq][IKZgke`hs\MrommoneTYxv`ZfpVAGIMbjszpppmowdON1)22>PSh{d_d`_XUYXVZbimusaghW[^[fʹs}mj~~|uþưþygPLVG0;PbɿogbYOA=;50268;C=9RWWef^an|ymzsgcVSdaQWp|ialprvyz[buhcsy~lyzƾurlfgr|~fafdit[Y[B2DISXHK_UQ]^^hy}llzqeru{eJ`jblſªpirbbojMK_tȹ|yrkihffdM=JB6ETawoaiaMObbLKUXZ]]X[eT9TwѾulhcbbdktiT_yvcepw|~zzpakuqrrb\flnqspiee\RW`ejsǿxl{tlmwzgYkykxb]]\]]^cj^FKegUVfsȺ}sy}{{|wpkkeZ[aa`cjwwxxzvh[hxlZPQY\J=Pp}uzô~vtqqqryuairozv~sjpronlf]WUNDEMQV_oƲtfstbZ[dfTFWrxij~}s~ha_^^_ahoaLVoo\Zgqx}}¾xqx||}{urrnedijjmv~weVbn`K@>EH6(9Yf_hĩytpnmnsznX_y~kdox|}xyor|kckppqrnfa`]TRW\_dp¾}m`k}ue]_irhYg~ob\XVTSV\R:EXWawqwn^yuh\@LaegvrlĖuxǮ~m^_KPawQ?EPJatw{kewytuZUB4BT|~w~mdmfptpw{}ir|zNG[fny}hhY^MQaw{qgw_OYgbB;LIUlku{w~cVnsduvcOB>E;>CVdkjn}u{|v}vrnnkxeOWu|pzsnsshputvks½nXZhbJL[Ted[c_hy~}cUpdpkUFMMYWNNLcxmbpr|mi|~waui[dt[Rl~t|{~}r}}cwg¦iYLSe`LZc^dSNTQ^fsxiXwyktUFM_cf][YUkxuekw~l_zdgyh]VasXSz{|xv{p}\uzdîr^PGNdaPffb]JKST^]lqkW~pshEH]ndb^a`]rryevn\y[tqd[W_ryXWzuxwpy~y|uZnygm\PGI^fSjkbXHNZ_dZdjqXvqv`@Smnakuyvknh{ry|qJ\r_t]Wbj_Pjunu|t}r~xu}ucpze`|ovkULRQb}}c^xto^`fszmovl\Qio=?Toseq}|lle~qv~znEXq`s[Vgn`Qnvnw}s}zu}ws|sar{bf|nrlVRXUh~ce{wpchm{owwkTXkf9G[wshy{lgjxqsxf>ahm{nVYjpeSuinhrzsרlho¼úil[Ixv}lqdV9=KIi{ofcz{TFJTgtcw]thxabixj^Vgwzopqifsp|y{ymV7_mx}qmwfyvίty|{{ns|`iy~dylgM:hwxtsYOe]L[hWIEZ_j{kP{`g:Qy`ilvrrutgflnnZ6;\d{^cyxyap{pa[bwun}Xp}SZ\cszy`VMZz[qsDn^\;Jqyg^zg^I'OtqyUhr[U[mRZzwhνo`{n|psxvrhb?hpFYwruoLmoP\k\jmC4ZaJcTT\^XQs^\_n|rwvrIZzhZ^nqwzyrx{Xrvw}{{quX*beosj|Yui]nSa~jOyvh\N_vFdIUku}~{y|{z|Ixxzkk?QnaUkhuNkol}kxrmrr]67Slyokxc|sUlvnfxrXopke]=JmbKK]YcotD$Yrp|ybVnL~hd}w{fŮz~seY~zsooRK~kl{nz_U{xed}y`nx=5jd`zyw}iImMemh~|leanwN=Gg~zKluon|ln|h|zygU{zgv}s|d"!`msc{kedgxh|icXIv{ePU6@lhkn||hnusd}N^kjtg~qGTwtgouoV[unZ}ypbl~~^90:a}yW{||edw_Uy^ir}YXnum\@;drh[pxpyln33pVsZbótwxui^|jgKR||{ipwrytQpkCKoe_ql|XgtdxtD?tyf|tx^TqEtx|udgjF::aulPbypoql`s_tx|rdxwXPxvtyj8"Xkyc˦r{z{ye\WDa`yXG@.dlkhktdfzxyZmu\Hph\gjf{P\}efV{tdYyb_w{w~t\=20V}{lgn~ɣnZzcQY\_mVHUnw_;;h~mtwwI3e|`yi]ϫyshZyyg^UEs|}ws}bhzx~qeFfeG?fcXinp^vzgx|OJ}}ay^bA4Niups|o_srlPUozhfomSxWipr~ea{ahue}ntprtbbbkYdoRCIoz`]u~rĿehln~hoqd`WajWTs{oQctgi]Nbh}r~mWruw]hʹ{x}Nwz|gaWywqgrilUzZe>-Qkn~vvuxvy~}w]fGugdnnN-\yeot}~gazgprugfNYmtzynqogqTt]Cggqpzyj^wjkgdb_sxvo{wl^Ir}FJwrH@QaQHqv^tnzxbfcxqtztclɬu|opk~iFJjnhE^{~gkyrSbkne;=pwzǺuTETmbqVLT^^Eruoh~^|om{zTgbRR}|]fsp|~jxzun;?Orzai|r{no[t}{Z>`zY>Qep[r|suݼƮlg~~mo^NZBt^fjVo~sep\A`wygWp|abnjKzʙ®x_wwvtX^h\ZkluW_j|aegMS\s[hlialZr[gmn_UAjgT`j{y||mvva@D]}wyph||`c{wjǪinpnCXu^\guutsvyibnzyXP\P{ueXgxzʔd]TmxXnwhLO~gbo{lU{olvnnX^pgltux[ut~sxrz}[uuGCTS:[soj{\logf{YTAj~`{mon|zxš~~rgoiOVfcP1Wzan}_y~|yMKnsylrgubpt{ritz|rnhhb8lgd]jShh\fkPSteVAp~qXZ}{ٙXttq_RJUb_Palubs_[]AObVYxi^ytر}}tr}feOHuX__]eoxV_aaD]hjUNlVhxo^Ůϵc}o|ih\[^OR_mvs|t~|vz{p~vulwgLx[hoLjzw|wpxypiUO{IPY^gnwut[l`i]PIWjohz[ξâzz`G_|cVSiukqk~||tv{hk\Ru~{c_n~moəmjc`^_m\]yjemzdOgosr|_{Te__WYaX`utvhɪž|vh[|uMBGD7PnjkroowsrpX]^o}vij}qisvItaQi[L2FwuXUiq^ayte}zRDe{llqtrjuŒƭmxbyl`b_KDfroe]r{uwSi}{rLOjl`][TPO\L]`ac_gag~ko`^o`ĩ{yqjuj_^zq|@'Si`UgVOXfjsdicp~amtkq{r`[cfoteҵxfڰyViqr]ZuM@DGcule[_ays}}|rn|pXSODLn}ths|xcbfodKKg͸n:UkrOVp}xwR]ZDdxf[o{}}rfhmknyllv–y|wuk͘{}~^9QSøj[j}\.+-@:)%F&PlYq\lzxsvjQ~Y@)6IKV{fUvor=y_[i~yON|jxxkccKDJ^m}y{yX]{|d``audxn}|olA|̨}~]YW_wofxGJGUW4,PvbX_r{pPjuTdDvkAJ[hmRMtfY_Sd^ZqdxyreswSUqg]jgvkh~wnuvoosBFRf¤mshnDY\GUft|m_{juh`fȼ{wvuuqn_QtTfhs^clo|OP7KegyhqfSWxhFMjf;VSjmh|J/.Cjmnz^ajgrSy~]wlsqcfy~o}|ZWxykfktmPemOG[|yTfrw{|foowq||}Z{ϴã~и{rsxsv[:Bddm]PP]lkWbrYFJFGTJuv\NpmhM:Mq`TTYJh~uwnci5RMWvskekdi}[]tgkW}oyrm}cczm{TSUNQZvvxtoahpUSeiOq][[rKXz~o}k|spQXPgqS==>IVhlw{kkpgiqedeXCskqdGCS]g]5064IMjŧgtcb{wqmmgrouSV|eYYlwΒx{x}jnu{ntnWJTN7"9dd]jd{vgzmڸ̦yg̕hqcMVtlgYhnum^@Me~nfTXyjoqjqy}jw`ih~hB3LkwyU7?9GP^˴sgQrtaywP>SgZGFPozz}tynuw]ntymVI=PdYA5RUFPN[gd[gr̐feb^yqlhmzrX\^kyzsq^lV|jWYIHgUgeKG`aeK0:?GLMcz}ǹ|}cespxcksakn[jxtecftyɳ|txvjz`z}kv{mbPOTB62Yeajnw}yjc]Ԛzrۭts^f}uihorjDJh~vdXqwylizbxs_kqzsH5Hw\845LZbhm|{v~mlÚ}~|`uZMZgfi}~`lyy_fNntslC6?u]9Kzyytmowbdtrjq[Okx\X@QWg>2iIMK,ilin԰}|w{jepYstPbl`f*%gTQ?8;[mscn̙lk{TS],DW\XWgI}dxG^~sFqtzdm_pop}mUnŨeLQ/_N55>bmxgnx|opyX7ayteMGhǰپ|qty]laJ4\3Xkojdm`fqqaimsYwbfygiZVDp~~vyzv]axls>;Kl|e(YkYwjox{wtvİnpSRT;pnY]KMkedjpjXaW^hsz[wd:3uvjPV[r|VLXlN\uc_ol:Y}uTktflwismzH~sthpüȽč\H,k|Ɩktqm^SD3yTEMz||qso~maghinwVne\/Bqq}{`fdQVdytdI}sWiEn]hGEoum{̩osqvjr}pspzO_u|ro~i_7Pxmq{obxпy\LA}jKO*roYN`rz_1A}{eft{`]twvrrtssmaluZ9G*Ktxgbmwiq{em}nc|e=Eyr^eɺtbzwslc]WgZQ\s~}]M=RPMZkoU@85@lhgx|yp{m]bb`}_SppriVxJB,y^idaiolielͼoqhvK*4h|ǐspzfO:sbK,;wSBLgxsXoI0-3jzz]sp|~w]g~}e?*4Z`^wr`WKwPknɫ}w~iPI?1Kṥu|wnH>97QXHSfgdrw|QtUEBd`rdM]w}aZ|~YyvvQmdCKbq|iryzzv`[vaQP`~}}yrkkT4"jzpF^R?EB^PYSqTa]^YNRfeaso}[ebeMJNe{i{PMeDFQпjtnoCf~ssptgwqdGL?4D[~z^SrMD1XgidD5l}UHSVC!M~qrrcZoV`gvyo\ZW[o}νqbwt]^\fy~sfwodzpr?%Qoccèxyok[LWZMWg{uxoLsTVYAHYsoftzsTzrWd~TjZBOa`IZrQtgad{~yzvxxuxqaZR(dsШrhxZZdbC/[]aUeqfdrrV>Sfeo~tz]rjulnkfjyjdpyzMYiE^\mLjud~pjm~xµ~x{mZQIRXafqq]Y[R<9;Rhtdmsh]^V^A?{jpnMnaO]jgVhqojujOC{jr{|~vjr{~i^{etJ>heC.Ci~]BLhY[jnpSR~PV^irxxt}r}ckmsd_dkhlla]dewSpr]^WfidRry|Ҽ|~xv}~jQHM9suonm`/jnfdGjxpY;Pph_|~nxuZyn`VDPcca[®jooYRdX`PZzscr|}_Cnn]kRFRyN]Y\dl\i|~qvazykuy@gi[C:pibpktzƔ|~pYI@v`{dhba{vyQaz^`^KVmnmib`jYVhwnzuƳya.tzwM,>r]FILFkzqmutyoyrðrlHCmw\9:sr\dto~jzevbffzwtyxdtz~cUH4}Z:UY-",*?jkahoTl~lXprMENa\Q]{uebeypqxk|sWPeh~d?R|vȥT+d?doyp^[ozoi~jr]J:_zlqN7^rXG>F|^bǿ¨U.ՐR5AAECPateUvth]ewjEPjowxW{goZbJZgph]XyX{}zih^wrha|rwnWwvǹйtceCqfECGIBXmiO]PNbMNTkfHA2`y~cwYitsoiqxpQBpc~~ugYp[Hxof~lcY]EY˻{ϽaQTQDx_βtiDo|xwrzsTospwps{|x~XQctk]fg}a{vw_ybjtb{Ħ~qrqPMPVFU\vzlcsM^t`KV{gE8rsO;<-$QeizeU|lzyoqtbN]eaOd`u~Wjku|[WbUoϸzmqRDS]PNgn~oo~fHsf`QmdJ+MoOBMM4OpnhwWxluzgw|trxV[p|hcgp}vnt|l_|k`{kpjXĵwx}zXY`aGINouuCWgXKP{hKEzrIAJ>7^hhto\zpspts~tTUacS^VwvqqyUr|hppdi[hƹjn]FOVP?WV|{sr{~RytkN^waFN|cIFF0=jnjt`^zwxo~}qw_J^j`O[XwgpqatsrnRx˵Ûyr_l|\O[cS2IQȹȕ{fjaFnqvb]VA/FiQa;9G5ozu`yuxvsrefa^VUrhGBTTxPxczphmUMkȡ}TbXRRUT\eWyufWwg>jVL:Eg|Ȭ~r{myh~k\{aFϭzuxgKfP@B6<]làov\eUz^JgaITp{V=D2SfjMuuze~dW^m{T=\mWWbw|h~y_]ZwRYèÝxlXeb;&>]fZNyҧyY_i\lUhlSYTdOKM4<}s~}}rkq`hhhXvc`G]iNZaũqmnql\Vz~_hzw}spst]Fi;><9hjjծ|{dni|nvSGrn@8H]rawq^Oq|hSu_wld{ea'>T\ab^˴b|z}~vpVwunpƮ}rZX~hki?*"?_eRyȫq~caf}_a]cjkQlOQ:Rvpnny|ubjjyaGMLCLhkoov`gly[y}tI`j~z˻}hlvirdE8gjKCU[vɻΦxsydT[SrXyuC5=Vh}st|}w]ik}{VPshX_eN1GqWn`jylgta`zwwimRVOPS0QFLA2k|ͺ|{mvu_fkdUO_rYRcwyrqm~^kQgv\Z829Omcv{WQyjxynYP|hnwY^X`aXLA>VV`kǦrotnqj\QVavAUiSXKoyrhecrcwdavoru]53l}dbrάwlnbzwzbNVyz[kwlJ:dyd?+6=9-f~â~~cgRmtujd\Kkvbn|nc}j^^qgmrc[bUX68qWtUsβ|{dwb~^Ktbcs}y\QM+TMIL>LSocy_=NaAELKOW}}}d|{dofpLlHPT[Y^g~ǹ}pqpv~kvw~xssAzk{qzvw`TtnYVocYUX@+3yպҦlfz|rrSMvYeiY^_x~igpta`{~kM8Xs_?5BVSWҸes}z\grnsdzzP@WlmSB:Th=OV4>ǐϞvt_|l|_rUIdlxwdvih\e]`hec\^3>]_|qȜ|vdk|iLv>bpkflqcc}l@hhZWaCue:Ui|mЫƳszkTUXb`jhPHDX`[wvxsxf]}vEI]q_;vZnTb~Ya¯ypy}qa~dho|Ĝunkr96^E\j\KPK7+RKERy˓Ȩhk~jvIqYp|stz\iujiVzocKbOop]ig\\k|UղeXMLOQmkrgrmlrprVyz][gglcG%=|KZ:Beåǟk|gf{}xrXYz}Tao`y|cG3:VVReeM;KUbP^bhűu°w~iwu\Q|lZK}ivccj\hf^GDlJ6SQJ]HJ`|zrȹ͋zvomntrVpwij}izn|LD{^QcbgjG,dfJYC}«{ܭofn}uxwz]kb`lxnvuɱo|upw{Y<8.Ac]X?GRILR^`zDzğztĥ|kz~wdCjipHnsnq`g\s_nmvqVvTVEJfnifŷ{jdaeb{zlvwqjes{ptyuVC\vS5;Jj^:8[7G0y|Īڻcnsrowopl}si|ydwoue^NKGcmlQP`KZbhrtcziZ|TriOo}]s_~muX\Zdx_]Y>p^==yqyƨ̼w}seblllqbgryinq[ibb_WAF6OdgHHXKFAZniʫϲtįf{hQn~tvQt{xn{ZZgosebD|m;L\[UJKMfhmxxygctupy{ahyg@m{Y?Q\bO6#:^DN3Vu|òׯpgyp^`Xguuuzs[RxzokT{l~oSstdGNwVBKwuysWc^{m7]piMPYbk\g}zrosnPWt}A'/C\lY^ªrw^Omr|pf{jkqpl|tmtZOrWhmhkFRv|u\iTRVm_jkon\γ] ;>ce;9?JigOhpZXrk}gzqshir^Kgrap_J}uux}iUKZcj{{sMVjlkmVS_mxqgzѶ\TBUvpz[L=UmTVssqm_cqsWN\OgYX^T]augWmxyGb}lqb=;2GVZhroy~|n[Opx¿eUUPNE:Avsckax}gctk[ajctdTqkvQ=H>G>5Ire]uwthq[}aEOeqzzt~}}|uiPWwĦwtvVDDGD=holw{|cZsqivvvUTTXoUYTd|iWf|lXcvfTuzkqu]vnG,3Bjzm|z~o]fyex^Uexðqz~aKB?Wjh_gMXrmmzcPRSwbYlRa8*=C]bSPy|kjqr\npo}k^ufKGVhzrtzto_Zqôcf{oM1/@Zkv~niqtQOsto|tPiN^[?SSajiccNamw~{pwoiwQ59Zh~oyowrjrxe`xuzŲʨoowV9-xmfP=Sg_SLqxigihdmv\COujUPo|vywru}`QYwiIZxR(,Fcfnv|t]]fiv|KX9Rb?Sbx|qbwwhbjzvf{odgzkV^E=?Uj}to{gl{|j|jkδɠ˜a][;.1Lmƣo^dyo]tpg_d[hNI[Y<#EQ`[UY|c_ivodrqww]MfyeY]pogwvrhku{xsXGox[0!-@P]º`Mo~jlsahYFsQH[cktpysojx}{qoomr|wkJRMIQeszrloX~ow{rfpqc}ùĞè~rmpI44Mcsyλ{rqzqvsjhstuX1o_PM+Ngo_PGtkVZad^c|zpcHQvkVEVr{{moynkl|xu~fPdV\^J(2Ye±qazeb}ao]ZDlP:eqwmht{|vp{[imbqZQVS=Zww~vhtfutsppws}t|uu]-0Q[Gg}ļws_mjnVmkWMfXb[Y0Lrej|yeeopfiru{xG5OtjIdkrvlbNgvxyZ_9=N\D,QYcyhfbvsg^zzHLeq?\kqma{}ftftfo_vTQKWH@jms|wedug|t|`~p|jyE0-HNJuzu[uolJqxhQedQkfS)Usks}{pkppdq}}~rxA4FffTsr|mptp~f}Wq~mvkxUY//HZP:]eqrq`pay|iWy\YYaHa{v~cxy~mlnk\sZfPFTWS@gw|vc{kyyd{pXy|cxadP26;LGp]vzuuNYzmV\zQaue7Bzy{vmvung{r~kwl[3;Mf^sk~qzeurlk|~vhiOk^K? 5MdS`{Ÿxe_tbgx_^sfdZEVsvj{mv{uQldTR;N[dO_~|hrrxtolkWdu{VldRP5Kdaun||sz]j}~{gtu~yrieAdXE=$4Lh^nɹte`mVixahupp[<]ua}~yqxzuNp]PK[d`}Ȱzpdm_[mit|oEE|_qv||rz~~xWhkLRBFYmb]x}hufk}mrnx[dv{}njlNo\IKYu<=I=tsʣħt~q{tfP^dtjalQt}TpkNiD+dPA]nftƱ|sy~`}eVhkDQrgkvzauoehddY\PLjkc[h}}~~~vthjejdqvVzrgl\TBY`HNQTbD@6ccaӯ}~oymY_ztzg}jdjTtvYy~bmD0fU@RWN_zeu\gsMLjVrg]~vgjgpadXJ_`XR\vowt{ehwlpsjZuwsg}k[GQdQLQK^=EiW^zϠ}jn}`ib_kcmtuv}}wbvcmrDO|S>F7SbNlʰ}outp`uxfsv|k`fWc|e\~wrl7FkNPWI>burĹooq_miEiZWaeziprinhcjVObVTF^rouworhpd}suuR|~mzmimgS[`IIPMV4MdWXwxqœôqycocciYg~tzrit_hkF_{L><;]_OhƵ}o{toe|weqtvotgfXrybatp_:WmQXTB>cdmïlobr]M|X]Vssz|j}kudfdNY^SRDgdkplwnfmpbUtptxexzle\n]DMHPA8[WJVn^ǽyzvsfp^Wpn{vzkh^kPYfGA7X`NRzp¶z}xyykz}ehqtzg{vqmj]xk]xrg?JqcaZE7P^Umoŷ{{ckbS~][Tpx}zmxpzmnjOU]UYFb]_boxuiwo~fWwvvrxe{yqievaMTJO:?WM=BRK|Ļytv][jdth~wvk_eOlcQDHfZHNsrxj_ztyakkqgevsorijkf|u_@]sejXE9ULMY]tqvĹĹ|hp[mt^XYsswpuxpxdT`T^QWeW_Yrui}wv{ryZsyohvxqutxl{rW[YWH=3RIFd>Xc"WPX];ROERvXISEiRINY_nl[|eUlqwgooXtu~ns|fh~gv{vyP\_d~^zhUu{vw{utzupwgPn~nnz}tptzʮzuw~`K[NfZPuTbBX^akSeRgfXaU}\VYffwncy]Mk~arctr]hfY^xpi}q}tzkn_guxyoP`tw~}w\sntmMb]mvaspŜwxratu|yppohq~_hvqrquzrvKOPM`D]dBka4mpK`PRUDjnNJKOpJOV`_x]roTV}{uph[wv{|xnoxlburx`^f]ucuc^zsvyyxyslwp{d{W}lzuq{exhkhkmzʱ|m`hZm[c|Sf|Jk`jgakSofTYUZX^ja|jjxXKp}nxhzhm`mYtnwxs}f|ehcc^fxohTr~sg|uh]i]sfsk|mrshw|x|cs]`^c`j|upyk`dUdP^qHZpDbyT_ZY]GcqXDHHyzNMWcWwciwVLs~vnj{qkmookuxwh}vslqetdwcufzqnrt{w~{rd{tgpaynvtsv^xrZ^^jfpzƲ~vyhudn]cYnhnnloVn~lPSUbX]p]{of|]Ii~z~t}mvgffqruwv|cyz\[[f\bueyuZt|yj~{lugshqnlw{{|no{sv~u~dmzYSSok[^ulr}qxhid]|fLmdT{k\g_iQVmkL@E[hPOc\^|Z~jJTwzkq}xutaeslhz}xqn|z}wqteawky~t}eitwtvncqelewjrosn[r{kNPUfamq}x}nzkamoqqutv]n{tSNSuj\]r]q|afI^z~yz|ssu^|vizpzt}dl~|]ORiq\[rioqaf~tv}rqrke~upuvo{nupnvsxl]rwhGGOy~^YgzeqpsbqbUtec|eeiijSdokIAGgaSUlUh{\jM_~~kvzrvkVZmjh}zusn}uvkfprz~tadmxpzl}q^|~oj^zlkijnokVholKENpndis~vz{a{~nypxw|ep{{^LRir_^rbca}rTZ||uo_oj|lwt{ffuwaEIXu][opcwlbwwmms}mny}tlxsftrmnpsjXimiF@Ikd]egsyxjtnXqqf|lgoooXgnnOAIdfVVmVb}[~nS`lyymweOUjyijuwtv~ttguxyt|vZ`qqmxitie~um]axeoq_ihnZZhj^>CS|yeezpxrn{t}}ql{zrPOZ~f^irT~pg|dRo{njc~stkrsxi_poiECNry`ZhxZtwbz}rwn}kfqyn|kvsc|woyfilodVgeeA:Egv`[g|`|upra{zq}koswn_qopMDMk|bY_qQox^lTi|n}xzxj{xyXLVsnfnfyotzj}z~~rbXbvls`kt\n}mlZqqhr`cgk_Se`bA:Fhwb_lcsy~zp||YPYxkclyVzzakUh|}~uve}~t{iorwg_oijF?Ihs^XeuT~mzexw~o|kbmxjvgxzzfz}qxfimpbVg`cB7B_p\WbxY|st}lzqsy}qexpuVGQk}g]cwSm|\z~oWdy{swx~xj|ty[IRj~ldlbzsr|{o~zzqjU]sxmoeng~y_cyu|r}z`fzjnb]fhePb^bO6>Rpd[`{hjy}rtUXgzig|lZhmyaYp}r~rk{xuhqru^hmhc@ANmkZYnlSsotf|~~rz}fal{wdszgyyxex~pq`cgl]Vg]cC7A[k[YfxVxmwu~ut{xi~tzdLSg|mcg{Zb^q~t]`vvxxyqy|{gxtuiJN^zrfhocw~{u{rt~r|}}ZWcnk{wWsf}jZn|s~}wokZmsfeUZ^dUTdYbD8B^l_`o~[u~vrW\nvmpbdcpxccyuzpizumbjmoZiigcA@Njh\_skTsmxmsx|j_gxu_hzhuuxcizkj\Z_c[QfZbO7?Tka]g}^ko}xyqy~~mz|tSSazrhk|eWgg}zie{z}p~wjquyfrvorOKVrtil~x\tyrqv{swydU]t}mkvzQu{Zsyn^k{uxvwimY`rdaSSX^VPeYcO:BXmddpawvž}wz[]mwosbadlyhh}yyohzrg^eijYlggcBBPif`fydYooyuut|ve_jvwu[vhsj|xwvm\otg`RW[`P\cZbC;F`g_extUpztx|tyyeU\rzmmyxPy|]u|sfu|p|}xhkouhjzlv]JVnkxc}|pavujjugjovnptkYayoudlSjtx|oevgq{udbfka`uhtY7:eujt|Wvfwyjr{|{¯y^cLVizy{jrz{~y~oazoafzyopztF@j~Smhyw~{p~jd|qmryrryv`h~zbTUdoZVUYOF?^eWLTmfdXY`ibcwgnV?X|{zsvxstu{qu~}qvjRHNTU`}gQ]iTE;TVNE>FNQI`WUV51Banythymzxzqtmdbnfpq|y|r{u_b@1?cijxqcjmhSacRrtvy|yjXVobUJ`}poqujurl[av~aiqsgUV[^Xr}ja|yj\`ysmabjrnst}pVZpv`mn]ZezZT^olnwY[f\ki]X`d_^w~xiy{qf}|sjosuj|qfhH?Prx|vo~ux{wo{jbgdUDHPYX{{d[qfVEH]VNBBHPKScP[M6;Slwd|oq}~w}|}{weuyjhoqmx|y{~ywvutephU[A9LsǮ{wkprlXfhTrxx{{whVSkbYRc|nkmqjtrs^br~\xa^c\NQ\efyrf{od^wwpfbhnoouwx_aujU`oekqj]bruu}eRrWac\V`hidw|muvhu~tghkndpo\gRHY{}x~xqpvr~y||\vVOQKAGVdhoatq_RJ`^UIDHOMQdRWV@DYujswn{z}}y{o^myptyxqz|ww|y{yjhgdYh[P[GG_ȥ~xputjZndXvxzzzrbQXk_]Wnxkjlok~sobgxtV|UWXRLVbjjnpzpai|vncdhok{o~pbm|˻kjtd_cgbonzsa_lyxrznquvkzsurzzSSgbtgxuch{|y{|muagvo`Ynj^WXuysheiop|}{h?q<8>BN\c^msx~unmWYtyt~hnkSRbwh~woi{©k^twmklzduurjlsumu]=?g]PJ1/AYhy_rvktwux|mmz[b|rcsrd][w~tpsy{}x|upfJzzl\X[[S^xgz{t|pfwtfXYjjiyʦvuLRmͼx`QIdlh_\`fgqq{{ebkutx}qOvxzvmlolanrrdpgWILa~e]hxmxw{iv}yzmlndabX;iyqeQSeN]ttvtrfXShhZPEWWK=;GZguqqoVP\oymypkvV\vsh~{lu^eaP@=Nl|ihqt|V_kV\`_bheXUgMMhn{{mzzh`Tiyxrnrw{xkmtqpqiEQ{xpa\ujiuyhs}se[bqw|tamXD`pjm{vncbeij~{m|p`bmrtzyYHswzvpqpg_wyl{hcnbTGK]vsmvi|y~sf|~|ukllfecP5i~p[alRcwxzwsgYVlh[PEVWM>:DUcvuuw`Ybr|j}uz~}{jfsUUq}o}{}quu]Z_RD=I`}|v|kU\Z^``ee\O`YB\lustqh\^uyummqwy|lfknlooYAx~zo`nydyz{|rgvxnb`k{}q]WbFHi{qz~shgjlqxqoceorv{tRSssurorphd~xo|~s^Ze]SLUizui}v{~}o|~dy}j]\_\`e\Cowfhx_b{}~{wl_Yjk\TDNUNDAKZhuzr|kagvppsswxxyscZjWNqv|}}}twhSHTRLJWn}vUzfY[^^bbZLW\BUo{sqwme`t}yplnsvz~k`bfgmrfNv~|uhpks|y{tdovphgq}yxuroeSL[HGox}xlijmszp~qcclpu|wXZtqrqqtskjzowujVS`]WUbu|u}hMexnxb]_bjiQC}}{wuy|cUa_SFDJT\ouamqcco|}`~g]Xg{s[EMR7Gbn{|thw~_~rmx^DKNG@BNasp~b[^jv]\bDIdnw|}ukj|{qmdt~vqswzrzuXxgh~k[_|eimdYU\hutg]\cr{s_ZcHIhxn{yrt|gj{{|yzxfBUzcdilqvtlsttzz{v{soyfYUZgrqdclPLgr|yx}xlxvmklmt~jk~zx{oMe{~{nv}zhdy|yhkmcUMPZg{}ornqz~{ofZm~~e@Xs_aglqtphsjn~oa`txvtflofYSWds{la^`jtvnryZXnu|y|}r~yy}i{yuurqmdZe}r{~nqthXLLS^rzz~v{_k|[RQU_jnimy]Voy}owzq|{tLW~fekrx|zsy{w}xtw~~onxò{soqxyrseThptvwtopxuhl{{sifgjp}marrpyzTSpnsy}{qq~v}qz{~us}xk\WZdr~|p~nmqyz}vl_\q}ZCodY\ciooiexxaqug\broqoiuvl^X[esxrgdemttq`fx}|y~t{{hrlllki`Xexjysw{rbVRV`rvu~wzZd|YMKOXchgn}fZp|}psv[Vmeipw||vws|}uty{qlt~urtz}zuz[dtxyxvpluztldqxtib`bftt_gtrulOq}jkotwwqk{uwzmXJ>?K_shl{lxkx~yqwpe{~ymqgkkvztva]~sruvxtllw]fruq||ujantpiglwzwaJKS[cea\lt]h{glwv}h}~ubKDkxwvxuikwxqhfjsu|xygexlnu~rUYyjc^XRRW`m}myvsz^NwdRYm}}qjzxaowfZWeut}{ewpprvunfqvYYlw|zmZPpaXOF=H[MOn~vlkuqbZGFRY_ciovsmrx~kIJwvWKLPVYTNXtsqxxwst{}źzw^bpy{xmr{wyfTK^~agmhir|yWGo_IEN]oyyyxkSecRLSVVhtslgejtg}osyf`uƫ}zZ@guksx\\nolnz{oiZ_fd]]ft{EDdgrxcP>2;H8Ci~x}v}unpt|su|x||xb[Ug|y||w~vQ^plmllnoq|s}gN>=NtfCQ~x\SV^gnnktnbtzyvwz~z~wuyg54_fat|hXkw{zwrpt~}qpyxl]TVgjwyy~sswXBMV^j|y}{qfbck{{u}}nP`wrv{~|unvrkvm\ZfmligjupP`g[Z]bd`\j~pl|}z{sGOvsgqwk|}tkcfrspvpuse]\ezzWdzYLO]owenohbahutovula[[ap~uwxT^jhsu}n]RPZuɿ|T[mbadhjfaiweYkvwtqquubZ`a][bph@AijUTct{nmt`Sj~xqswvlkw}yoihozcmsqlkp~wqs|}o|}~wQHlrSCDMXafhts|utyvmdlphYLEGTluv`Szq\WZbjmko}fo~xvz[?[td]nyw~vnkrzqjbTW\XKA>EXvhPn|bXX]cea^hiLFV]^_biwxv{zrjgjt||{bz|zt{}ui`]ezbd`JA@BEEETkd[m||vpklu~xkckqngbbiuxit|z}sJ>bpZQ[l}~||dm~|upq~|x{~{~a\hkihlvo`WW`r{pw]>SugPLS^fhc^hmVObnsssrt{xseahh^RJJUm|]jtoqw{{xqrIhui_`l|~tkntslfgp|x_j~eWSUVVV^fUCKZbddiupWasknv}ot~umjlpka[QGIQSPOTcyqiiihgnwiU[ippllq|y||zrwv]BIqyidjvypt}{vv~~ae|`OHHJJKT_SAGXaddhsmRX}xdZ\dlqt|io}xrqu|{soh^ahje`ak{z}mhjmmnxs`fsxupos}{~{z~qx~pT;Gm|n_[bqyorxysmmt}v|cnn^YZ\\\em^LQ_eebckymSZ~ydYYajpupuywy}zpkbWW^_ZUV_ozvtǽwononnu~q]_lsqkhksy}y`DHlr_VYes}}vklswsnmsypps_USSRQW`V@?MVWUV]lwZUtl^Zajqwvszwy~wql`]chfa_dr~v~xpdaceejvvb\iuxurs{wow{yz|zq^A4NqsaTR[jxztyyuw~|ygyk\VXYY\fkYKS_db^`huq[hnbbiqv|qtvpnptqhc[QRY\XTU_nxtqŻ~tsutu{|feqxxroqx{zzcF@_zuaTRZgr{zu{{wzpaxyaQLMMLNYZG;ERXXW[fwmWf}i]]dlryqv|wvy}ypkcYY_b_[\et|wsxnlnnovwb`luupmpx~okswwxyvkV;4SstdYXbq~|tx~~xuwwcthWPPRPTZnyrpikostqr}tyabq`WX[^alytfixwWazlqvq~j_^ab]Yezsdgpurnmostokiccmw|||oAU{{meeioryy{nqw}qduxuupcV^~ztromnrz|y~ijpb\]bfkvv|jUVwohloh_dpxxgg}meb`\[dy}x||wsruz}zwuqt}}uwusc\\`diq|~sq|}uqpzyhZNHQm|mc`ac`^]YYajoppt{~rkmpqu~xlw}lb_beiozys{~|xnc_am~w{yo{}qjhffkzskigkxucYVUVX_e_W[ejkhggjkha]\`n~~w{}ryzj_XSPTdz}{|~zyvtw|wqg\VW`vvrtttuvtmaW\o{ug\TQPOR[jqrw~}xuux|}{zxvyvpomlr~qifgilrywqs{{y{m_UNJLXl}}zunid_afjkklpuwqiikllou||uwvkggikou{ysu|~{zywqg`\^l}|yqx}xvutu{vojeben|yngca`cfb\^dhihhikmke`\[cq~~xx}yrwznf_ZUTYdnx|ywvy}ytkaXRS_t~|zywuoe]`nwtjb\ZXWVY`dhq{{wvwzzywvtw|vqolhgjqzxuttvz~z{|y}th_XQMPXcp~xqljlnooopsurkijjihikoqqv}smkklnrvwsrvz{zxvutqjb\Y^l~|{}zxwuv{xoiea_ahs~~xsonnmhdehiihghijgb^Z[bmx|wx{}~ztqwvnhc_[[_go{~}|wsoh`YTU_p}zvqicdlsqkd_\ZXWY]afnx~|ywwxywvutuy}ytrolkmt||{z|~|{~{x{th_YSPQXco~~xsoopppoopqplgffeddgkoqt{yspopqtx{zxz}~~|zywtoidabl{|~{xvuuw}xnfa^\]cmz|wtrqokhhiihgffffc_\[^gr|}~{x{~vmga][]dny~}xrmhc^XUU[hz~{xtnhgkqpke`][ZZ^dlry~~}|{{}}yrligfhnx}|}~|~|z{zy{zsi`XSPPT^l{|wsrsssrqrrqnjhhhhkpv{~{xvvwxz{{yxyzyvtqnkhdabhs}~{xvuvz}yvqkc]YXY^hu}zyxvsppqqpnmmlkhedejs}~~|xwy|{vogb^[\aju~}}}zxuqlgc_[WTUYcr~yuqrvwtojfca`aflsy~~~}|zz{|}}|{zxuojfdcejr|~}zxx{{vtutnf^XSPPT\iw}}|{yxwvtqmjihhimrw|}zxwwxyzywwwwuspnkheb`aeo}}~|yvutux}}{xtqmga]ZY[_gs{ywwusrponlhfdejrz~~~~~~}{xuuwxvqkfb_]^air|}|{z{}}{ywtqmifb^[YY^gu|ywyzxsokhedcdgkpw~}{zyyz{{{zyxuqmifdcdgmv~~~|ywuuy}yxxwsmfa\XVWZ`iu}{zxuqomkihiknsx~}{zyyyzyxwwwvtrpmkhd`^_dmx~~|zwvtstvy~~{xuqlgc_][\_emx}|zxutrqnkhfdfjqx~~~|{xvvwxvrniea^]]`fmw~}|{zyy{~}{yvrokhda]YWX\ep~}||{xtpmjhfefhkpw}~|zyyyyyxwutqnjgdbabejqz~|zxww{{xvusojd_[XVVY^fp}}|zwtqomljklosx~~|{zyyxwvuusrpmkifb_^_cjt}{zxwwy{~|zwtqmid`][YZ\bjt~|zxvtrolihhkpv}~}|{zxutttsplhda^]]_dkt~~}{zz{~|yvtqnkhda^[YWW[alx~|yuqnkihgilpu{}{yxxxwvusromifca`adipx~}{ywwx||xtqomkgc^ZWUUW\dmx~|yvspnlkklosx|~|{zyxwvtsrqoljhfca`adjs}~{ywvuvx|}{ywtrolifb^[YXY[`hq|~|ywurpnkjikou{~}|{ywusrrqnkhdb`abgmu~|zyxwxz~~|ywtqnlieb_\ZXWXZ`hs~{xuqnkjjkmqv{~|{zyyxwusqolifdcdfkqy}|{ywvuvx}}zwspmjhfb^ZWUUW[ajt~|yvsqommnptx}~}|{yxvusqoljhfdccejqz}zxvtstux}|ywtrplifc`]ZXWWZ^emw}{xvtqonmnrv|~|zxvtsrolifcaacfls{~|zxwuuvwz~~|ywtqnkifc`][YWVWY^eoz|yvsqoooqty~~|{zxwusqnkhfdcceinu}~|{ywutstvy~|yvspljhec_\YVUUVZ`gq{~{yvtsrrtw{}|zxvusqnljgecbbdhow~{ywusrrsvy}|yvtromjgda^[YWVWY\bjs~~|yvtrrruy}~|ywvtspnkgecaabeipx}{ywutsstvy}}{xuromjgdb_\ZXWVVY]dmw~{xvtsstvz~~}{yxvtromjgecbbcfkqy}{ywusrqqsv{}{wtqnligeb^\YWVVX[`gpz|ywuttux{~|zxvtromkifdbaacgmt||zxutrqqqsvz~~{xusqnkifda_\ZYXY[^cjs}|yvuttvy}~{ywutrpmjgecaabdhmu}~|zwvtrqqrsvz}zxurpmkheca^\[YYY[_emvx{~{nktjhnmukmjijfga_kcmnx||sslotv}ww~lhhfi\]XVTU]atlP8\aPku~}uquwjuq`^{|{aTPdk^I9HR[YVUTt{]lrxKLZekgt~|dqydo~ywydbih^`s^YqRPer|¾yqrmogn|beQIqm\YGAQbrkdajwosu`m|iwsivdmr{}rutnVpxogof@Hr~tx{pqubtVsYcxl~iczmei]`uoVMacVubqd>vpb|wjbmrvuhVpswt}wfNiJB_e`edPe{shl{~jl{~vvw}{w~_~gihmZ]~yzwgplru`ny~zq|}QdTprexr[_czwlxUaRfurdEF`_JNgpX=f[MyMkrfuzhyy~v|wkwTPVYaApvlzqird}lsp`lyifueznqtrvbOf}rw|hdrIDLdzfDrTapbzmƝ|fq~s``^kuc]c~^Ppt`]mnXwja[wUH]om}rwk~u`viyr{{{vgz\ZVLTKbW}wWuswnr|mevzzu}crefRjt\Wphihm}wzxqc^cȵcpVFgmp|ljdv`Mb^djmv|^VgVCBU][G`RRyXtPWysstzntsqpxZiR\PNyzlijv|^qmd~wz{w~wyxyb}mnl{SRzyfas~~s\Xbg[Hi|^zo{n_\kv_epo^}sylph]_sbkwxecvhQtbPaQ^iag}tm]{uauiuwyp|xrgm8BOXO+U||ojhvn[zufhqqs[PYlqiat~ixhUvT}sk~m`R\l^\XjQtfwYRwpWKZc^@ANZjsvXMtylcpveijhty}vtwpƸpnayxtnYUdlYoxjy}ljqv~qqr}nzsajjwRMs\]daW_dnpYU|feRvi{}|{v~zy}\Vtyw^WvvmeVjwck`}iitapkESfia~zlgy~wi{z~sozAOVI9.U{a_mi}lxz}ysr|q~pr`fvugP`]zy|}h`f{Qwz\fnvqovmJ@|flvyeIStw[JRBijr|aIXqqg]]^dewtc}nnx~Ȱws{foxzwzp[PdbOIuxnyywg]`~rvaUlvpG\olhZPFavcg`mq~uwraXow}{{cgvr|bd{rdWooYfpn_x~f`LtsvnF]quuuezhukd{oyxv}u{{dfn[C,;gjZRMTm^tlvZp}~|z`h|agT^vt~spp|]vwchuiNr}p}iVo|ww~zumu|lekruyqtQas\bQQYsvnm[[nbUdtU~[wwor{k_aVBLpxti~wmqylNzekMQohXO\X]zc]Iehy}tlxc`xq{trrukrstwon}}w›rZapn`RO{~pTx|ztJ[pyo|qtqft~z{unf~|{}d|Sk}`BOo`=4ESSHvr}d}}xgy}sXry_jdkw~yXhsZZ{hq|{uoz^cne}q||}~l_ojnh_tc`SNSl~zaTjwenMLmydlo\u{}~~}bqtznPIXeirzXx|s}ilobk_xxi\Q`UOqRawvolyyXp|mjx}pk|~~puWmy{vbioofsxpcVyoxo||xS[ohqsvz~zpynwxV}u{iY\h?6862Rqeewthyygsvecvjg^Zc|xx}i{nT}ti_`eofUxwoy~el[nrtWzui|rg^hsm\by|osZFl[TZy|q]ayoqgzp|}tvyoomb\^tXk[v{X~jq|{nebOWf^Qi[qwvqTZywneflwz}sgyqo~~wztiyk[hp|upoqmgdnQdylw~}^cdKZckv~kftzstg~mvi|uYheVSI;:`^_]elgsjjv~uXY{vhjtsdgxzsv~o_`qej{q{tkn}wwpP{o^qgrr{enouyqZ]q~KZ]`kefeaTdjSYeq|izxhowinxllvGZzZorhusq|yfXuodhbRWmew~wPHl|{zxljjqtk}qrUq}~sY}km]pmu|p}mi}rt{pYUd[R^vsmtyurz~wsqo_}ujwyrennJMZZO_lWTDedxvjuyzqqoishvt`btuv|isi[gq]ztdwZnzosjtiZsSRZszq~~qkxpnx~|[p\fn^bqcFR}mZ]_[]zvwrmms{vqnt~^X|TSemvy{~yzs||r{n^dgde|msolXg~|po{wm~}|vzvt\yiiy{iotKl~hsgkqk`hw{hg{}vnwehaVl|sd^hv||{a}Zlyx|p^\yn\RFC\phSQsx{[c~vptwt|cmxl|xxupu{orv{zqmrl]wvqjo~{pdIw}^\^bjz}utenxSdpxjVanZDd~^NSY[d{y|uuuwspwXpa^a^`m}k}rzgdy_YZ]r}k`[Krxrvtto}lqww~v^cqo~{u{~mjl_bYdieZapuqq~t_tdZk|tosiadkr{jjvvzcp~}kjtqgum\]_\_tebbYyzxxn\_}y}jptsy|ybj|_]}~yuszljkr{|wrbq|~v{^|uVTYcmwtff{}|tv~a{jrhgoeNOsxm]KCJb~zte}t~zrusy~{Ruvappjfkqnhn}s|~v|yuqge|l}qOhymqc[}{xxtl}py|omx~dSxy]SUUOWsd[ivrkxrv|ysy|g^rylfud\{hrtz|m{hkzjXsdZW[lqfIclOE]~yyc{y|~frw{md{lvjqzxmoystqjb{xqoWvbXYampg_`djxuzs`qacdccqzbJP\aumho]vu~w|{hhbgkrz}sa]i{|}~~hehv{ni}aKaxow_qulr~|vj~lfnlXfihlaaYKBQrwbWSTg~kvrpu~tdoxqebzxzl}wqf[uyiammY]}vpigv}}fx|lQLlv}vxbYqwjiJ8inafRMRUYivlqyyzY]{^jvmqusrpjehqxz~`]{jkvf_\WTciRWc_tvpWVys^Sjuz~yxyeWX`gnzyjUj~_n{a\npfr|ohfqplvcZjl[ww~~plx~~hSm}^_S?@FKN\nn]MHIO`|tprrk~gvz_a``dmsty|b}pwn[UPRazpXVf~su]jp]NSq{oz~wjcht}fLxW]]VTPMTntg`gn{~dgq~oiskmwvhhou{cv~zo}~xpq_Y_b`fzymg_[svhh^mttuundjq{yrlhjiimollvrZa{ru]Yjh\r|qor|xtmvkeq|vg}{~~|xuzdh}ddgRIC?CYyy^LGL_|xgoY]wºixkaog\`o|umsk\ZYVZmiZfouz|{\ey~ud]mwqstst||xy}r`lp]tcIFQYe{yporzu~o~xaq|xww{~|ytpr{i]y]akxvk[ST`yujhoyfweYi~xh\_uz}`sykkghq}||~|if{iwmb\SUpslwv]oyhl{yuyztjv~}}`vwlfRMLKM\qztjd^\fwj`lVSju}qjqvlmj]fwyrpx~jnr]VVZg}slopmxqf[r|tjdo~iz~xppor|wf~suTR[SOioghrzx\e~qrpx{vy~~rlqzoSo{`_baco}qlfbjxqr{dPlmmkae|zq~yzg{s`outsuuu|wfgszq_Z\`huwivz}fm~|wrwkmx|tnipv~n{pyf]_i}pnwdgRH\jmg]V\sypu}sotyzhg]AAOjyi^\jrmzhftvffz~wlh~|ye}rqxxwz~z[neD>[y{snlikwtu_juy{zrlt{|gv{vnllr~tlzbgnruyz{u}qb_kyxk^\anzq}hevyuyzfYqw|iV~}vtuuwtx|yxr|iZz|l`bq~ycSXdgruumPZqzzsf]d~yqybdxts{xejuwwjbiql^QIJXopbodHP_ghd[SZqy`{y{|p]nhn{{{z|~p`VRWdsg_ucGXv{kbadouulSqyvoy{|r_s|i{xtvs[Tb{ujvb[o{ypd[^qyx_|}sopqtzzfrzzzz~g[rsbZavuq{d\p~|k\azygrlazrqty|dozzygdm}|{xzth_`vrbndakqssmdbnu{new}}xvzfh{ilm\VW`ooW\gUZlrng_X[k}qxv}pwtfhxwtllvxdYZfwrZb`N`trkqrb[nrwqxuvxzpi}voltt_drvyngzoZfw{nbbqvuyomqyzd`q|}z{}{sh_exzvrt|~gdvg`q~|smnx~ouyg|wx}xbqxn}x}~p`gtlmxunpz{^l{_Tkzkadr~t}|{xvwa~zxxtjdzynu}pa^iviYdYFTkz}uf[]m}|nf{uml~|w{v^W}vrt}|topyw_`hQK]nz}oZ\uwuwuj|}{}}xn_Xp|ww}zwuopjkbVgz{rmq|wrsyq{}xad}imxxtsqlaSVx}|zsloXUk}yonz|zwwlv}y|t`ztmu{wrtd\]wy|ytx}ovbNd|zorslisphvxnyuxygn|{n_Udqdpu[ceNN]hlmjfhq{zociraryus~kX^o|}xps~qfmYMZgliedhnq{zeg}wl}z{ys~wsvtmjie]Tc~voxtw{lcfwzl`l}{qr~rdnzm}yomzzcOVenty{||~~{umcey~qzr^fs{~|uqxsk}uzqlpzbJP[bgihksxrmsuhlxtu}rjos{wbbzvnxkr|ob^isld^Y_kqomnsxysf`tu{ytwsr|adqwunedoys}kwmjjrxvwib^_cghhlquuneh}}s{vpd`i~~jowyulcbpxtyf[ZeuyyzsifmpdW_ptjZRdthy{z~wi`anpjuopwtvr^Vatwgosnmljf_[^gptm`Ymok|~vt{pbi}|~rhfpr}n`XTYeol|}vrnkf_ZZbmsjVXuo|jbi~zrgl||oo^UT\jpi~tr~ufaelrtsmfmps||~nel~zz}|wofbjypxedgaaq}{yqf_^dlqqkeqwx}ptndeq}yzoecjxth`_gtxuxj_amod_cfplwzqmp{tggt|~xztfl~qhfhoy}|xqlf_\\`dfefxp{xokmv}ik|zzlgn~~yj\W_o|vp~xof_\]`a`_hvu{or||w{}|z{pkqz}}~tkdbjw~styxnqvm`]emlgmvmlt{{nj~zkchtzuph]\st|zod^^bfeesulrws|}wlx}ohmx~|xxmhktq{qha`hofYl|wnkls~}{~{ojwpdpzrkjo{}wstzla]^_^ZVaxnknv~}zzs{{vxs]Zgs||oxuz|pe```]WVj{~tr~|sm{xxz}vneadmyyuuvzqacprf[Ygzspv|}q}yzzusx|v|}{sh_]eswu{zxrnkf_WXo~|wu|qk{}tjr{|xw|xvxxnkijoyw{|urqnfZVjorsmpx|trx~lox|{ywwuvu~}rhccir~|}r~tqtvhdbcqngdelplaYesrivyz|x{kchm||yqc|xuxXcgZ\^ZRZuusxk}yup~xuv|vpkt{p~zkZeRTdkfug\v}vnogszi{fn~s|iw~|z_Y~ljUdVJipls|}pm~|z\ijpwxxvZi|{urspyx}|i`or|n}ymniqlh|gP@NubZpuy^RzxwhijbltmajNMOqn{Wi}lwlzq~hBV}{ylXZOZpxglqynjdy{aodxuyqZvi}y{bmw{{~{ldmaf}}tyqy]Yhm~v]Grpw^`mmtsptf_mzprwcfm~{ppYysj{lura~vy|tyux|~zymcdtzz]pbk{QLNi\{uNhq~{u~ykernv~vs^jTrvqgoux}vreKnskctldssbr}sY]bLe\cXjt}sRl~{u{shfzou`turdvZ^ZLne}vesXlt}t]`sx{}de{d}je{kRRgnjtJonxw~iqpod[ew|oukJjWBA_novu~L{x|umlrvo~rkWcr~rs[~xxncxoQpzm}bxqb}}_`nbUi\lnh{^cqffwubXmrkjzyx{}ypo~vnmsv^Yoa]Vwtonekertt}}ipgqivqoWnsRQkq{twhysx}zl}}loys`V]aet|fbPnZK[r\isYoyyrix{mrzdggn[qs~zxwj{zwz}fawl~oSSwixnkjZeqdle`Ppk[bqZlx|oy}ljsx|yy~z\at}uj}~oeXcU\znawjqjqxywiqruyf~szhe]_lfmy_lnVwx|~|z{tr|~w}~tsdX[dknj\YJwpY{o`z~uaspkpwuzoru`j\Ygju|yx{maxlcuyhazqlrobvrjfYigzzWOdp^|Z{zqt~vunet}y}ijcqh}fqnUbNS|w{ov~odn~vlwqu|ycjtdeddQku|sUZxxwkmttm|nusggvugciu_[n\~}jrey{{}qgozi~cvuZg`ezd[qwq{x{yimsyj|fh~okx~y|{n^x}i\TpnTXyjlV}vvwo`kw}{lrvsj{zi~~q}dozUMShwl~}z}|przoskw}dgqal}xuhnzjj~efws\`rq~wzz||sq{uzoypf`auxz|vqx{it{skstvxzco|{x~|ozxgq`v\NSrn^r|vz}vyzas~viMdxcwypn{z{fXPa|rjurorsvZysuqqx}ihnyvv~srz}yypvdame]Zpg[try{hwjywnamuonZ[scqr_g~ndv{ht}u|{r}s{iZjuopfnvtuvluzy[gmmvpw{sh}zgt~orfWMTvux|w{v{ttlsynprd`gp~tczjtl`XiZojl}{mf}wyvh|zcfho~wpzsu{q~{{}pohjypcUZnlb{x~y|dzwoxwor{quonmvw]gunlaeyzl~yzxftlxy{kjnrpkp`cej|z~ox|qusnp|lcz~utuy{w^fjbZ^zqa}{wvxzyhiuw]]rOcxnv}z}~xhvywoeou`cerxuho|ui`nwu|}w~txmzy}ml|qmvjWDRwqwz|pqutwvcps`i|ravx^oc[nrw{xv{v{pnrxqvze\cYgnzsoqrg|}~}{ssvzso{m}imh_rvtd^mxr{{}w|r}kkv{g]}iKgujet~yvzdjz|tttsquiu}s{|tgswrp{osjrms~tr}||y~y|v|sai^ZU`tt^iovvupfzz|ym\gxyrurc}w[b{|ywr{pqyn|z{vprwwn_\jgwkgi}~{iq|t{opp~oo}pgtqstbOarvyt{z}ooxzxprmbpj`io`bc}{}flpp{q}u_d}qgysx~mlhcxrh{vw{uzwzs|op[atthMShnez}tyx{~nwyvnkrpqprpnadztqfsszz|qn|~zwxm}|rnsqiroWlqlqzjot}v{uo~pxwf{}s}wwoinlqfr~yfv}}yyuxzpb|kyghwy^Tcpenm{sh|iztcoztv{ion}x|rbkiny}tuyzquxuxst}|pboppyf]LWoyiotin}yv{nsggi}rbd|rho|iddv{}{zx}~z}ll|pw{p}oXllcetxeam~w}w}s~xwx}myxxnk`z}l^mztsqir{~typvl~xcjiYZqxjgYmr|sw~ssqjdvztytrlutgstsgxltsv}yy|v{szxtt{i^hbgX_or^g|}piv|t~yvutvxyvopj|p_^olsyu~kty}tztiz}ztruztjokd`mp[mqon|sy~r{~~p{vz|jfwrzrp]jwwwyjvzzy{jzup|||mc\ogbhq\\br{zu~ryierwxmo{yspuuatxvoq{wo~|tznttvpcbTjkjcR^kru{lxsj{louqxwhjl[^vrqatxx~~|yv|wto|}vv}jp}i`pmTeboxphmlpzxz~w~rw{yw}qlzpwkr|wpoxyv}}~vo}x}ctv|uljewgUTecpors~w~{mj}rowlqpjkiszuo~yx|p}{qwpwl~k_be]pebUVtzdolpuxsz~xwjy|pl[mrmnvhdjiy{}|{}yvvnv|ufqhl{r[d[encof_buwz|yuywluv|qhcWw|`tuo~ugtwx{vqvt_oyryvw`aXOYpmknh~zzzo~rffvwqpxv|u[jywskv}m|w}w{zsmvogcZI^f~airfyxp{{_f~~{{uad`X`\obQQb]efewhsu|{l|v}zzxsux|z{u{t{vo`Jbpzjfm{swuxsthkdgvi~xpxn{quyxmMa}m[MD[VRW`S]Zfyggpu|~|}}m|w~s|w~i[[^\xzbt}e]knmvgzrp|vdvjqtgYTLZwgpz}|twkqls[aqx{oY_RNVcX_V]yvtn|}|n|x}rplqy|hvtr}mYKGDemwr}y~wy~|xxz|zyqk[Tyyz{w{jquq}u]cag{vufl]iaSSa\ceVfhvomxup|~stl~tswkuqkbaTiwmpdclthpdm~wnvetvipc\_ePapxuox}yyup|t`ZVuxyq][eYW]^Vkhtnoum{y~|xod||tqpxoxy{pyoiWKKINllwuv{xv{o[`fdqw|swiz}zurkg[f~xw`f`X]i]XZ`ydl}{mvqsw~|tq|z~}yop{vi\\Vmxernffndntuyusozmjv`lrmWTZmnkkurvte\`[qwnn]g]TXjkq`esozx||teeb{~~qzq}zz}}}yutX]WPJNIg~{|yz~oryonjpe[]{}w~}yrx~zrtg_bc{ykblb[WY`rVdwsnpu}k}xo}~~{wq~sx}~o{pqe]^ci{xonpcalrxp|zqwwsup^wsri\bbS[twivuoog^_[jst]bbckl\oxauz}{|xwogeqr~opoyt{t}edjV\VMFNW|{xwl}yuwsn}i^hmaxyrxpq|}}qtvkddhlzohcRZlbXpgtpiqsrvrdy~|ojhtw{xnmlf]XPn~}gmkkuuynf~wxwtozqyv\qo[R`c~s{yw|lrg]X]gvxmpzd[otemgqngststry}vsmpzux{nvvh_pYVTPS]Sazmnzz~l}enxo^[Yu}z~wkwrqv{z~pvog`ZXwzeargWammmVkrnqomuuq}usjdges}|zoqeTO_\iz~r|vsqguinuvy}^yccfhfdc|z}{tuklebgitysktsggj{~p~~if}qz|vopmmxsopvq|xvyagkXfgVFR[nlzvzvz~|h{ure^\\_xozwsotmq|z~vteVQQfyxjfkmj]eh\tpmotzxq~filicc_w{zz_agfRNY{wssjlnkyiouwlqojvqjdcfyzy|xpruoulutng^ayq~rgo{y|qyqvso{wzuppjo|w}stsmq}v}|zuwffk^V\ZNFd}{{{{fihd][Wq{~~|lx|{v|y{he]ZZ`dxu}laadcp_ewt}~w_pqcjgbajvz|yzerqlfVZ`ZXql{uulkpno{n|y{of{psoigdhyiv}soo}t~ym{wwk^YVe}ttu}{z}ytxuw{|uxuyth_\zx~pswy}{k|yvuukoZecQJT[t~m}qj{gggb\_c~{}wlzy~wow]`efdfe}tngbchbnjexrtbfwbdiorob~zsv{wivyW`ibTQSp{wqupllqsp~uysynqqmc^Xpyy{l}npzutkha[X[_|~z||sn~yqpoe`hrk{y{xtq~lrz{~mUsqRRX]_clyu|tbwo`efhlpx{}m|vrvn[sleljfgjyqjkecgfrq{urpti^ukmxoagu~{vxy~xi\xkbZTQUXqyttqpx||uyzrwoni`WZawtns}~xrutqvt[^][Y]f}}xr{hro~s]itm_cy}qmonr|hwynxu[f]Zdcabfwyryn|z|ldyjiruplfutz|pnyytvgokjjiffcwmnjhowzvn~wusrrrbzicitmcj{{tujxfSVUSRUf}yzrsj{zqm_^^`fj~w{olpo}xlfes][\[\grwropz}}`o|qjaholkw{rrlkontuzzrbZwmadc``_l|o{zt}}{|kowvtka^^u{rpx}}}z}mz~ijg^SUh{wsyy|{x}fo}xvuy~itoore_emmzh^oZUVTRW`}~wvv}{jmt_dkmjjn}spkjmoqt}|yq\nmZagkdYd}try}}yxvrketqe][j}o|wpqmmtzj{|ru}nk}jcd`WRPgwtw|~qwpjfb]\_xz||tpm|{b[V[c`\x~{wqs|go~|lgx^ckooo|zs|}zueYn`TY]_cdr~n|vw|~zfe~qnrqlkk{}i}pnmjlqu|zwus_fxkmgZYgkxxx}}}z~_tqic_[[ayvw}qssy~uyz{zfwv`\VPMRb~}|}sxp~vbdc`^`q}~|uw}k{wdrcXfgXR^vu{vqqow|j}vyxbuokrspopz}rr}p|urq_Yoc_fhc^[lymyxzxzmrwprpjd_p}~zqmnnt}o~{wttuhpeWaleZ]|rw~uwg_a`]]c}z~ynp|yd||ghrXPRUY`i|xxx{qhlzeadfiqu|zzsnmp}w}qVayi[V_ghgz{txsppqt|}|qatrrtspnp|vvt{|qwx}xspojYmxgfc^XYc}yz|}}|oonjb[cywuu}pvx{~z{im}ywvzw^ilgg^Z`ko|tbtl]`bcfn{ply~rtzm|xcUf[R\aefoy~u}~wzvmmrmnd_o|wwz{{wsmhvzlfmx}xrzuofiw|idoxvz}zrilsng{pnvvuwzrcZvqyon}fitxoknvaX]_nwjkvy~xtjjdchotiaw|yy{yqarvbm}xb^mou}ywicbiwh{n{{k}vt~nmoqnhu\ajfamyo~io{n|rsfYMMcrlbum`nvzm~~vysyxsuvwupbafZ{ePTV[\MmZLZffZQiuvl}r{|l[Yqq}ktvv~jp||qrvnu{{zkmVdb`dSoc\cosiVg}omzs~tnorlrijttfUSex|ktbyq}{zm`nuwobUld^[J`YUSfnhS_ufzmzzuztywtzl~sfdh}wrs}x|w}wryy~yrdv{|n_}wlfXfkaWkxsaewctnsxnlkspwn}ur|akyj`]Wj}qstkzuvk[hzrr|xnVure`OVb[M]oi]\o`lok~rpn~zqoulj`oznz}~|m}}{s{qbi~{cupn\[in[`uthdqnfwd{vld|xxwtr{|ur^qoadX[}n|zrxrz}np_[owuy~ze`xihZOWg\Sfn``boatgqrjuz~op~lpia|}rxzz~~y}l}wjtj^m}|{hw{pn]Zis_dumfioqjwe~{ke~|xryxqpaljbgY_r{~ytwmzy|~c|t\^ny~tqjarhh]RQieWdj\ddojpnozjs}}vulxlrod{|zvny~|}|xkr{~xy{pbq`lz|trownpdZ_xmbnlaolwnupvvev|syy{ygkdibld_{y~pwuxts{{w{hcf^mym~ygjghffZOZsc]g]]ljtosu}vm{|{ouoopynsn}|p{~{}|tksyzwru]p~dn{wurwompk`Xszhii^lqqxpxxir}}uypcklddond|{vpn}pvtyu}{qj\{obr{sycqk`ghaRYvl`bY\olswoy}n}{~i~qku~tz}ju|}y{|{vilytozrlaq}gu|tshlrma[y}mi`]pto~o||}jx~w{~v}p^ps_hupl{wis}|vsmw{ovzifezlny~wzc}g_liaQhymd[Vgtiyssvswvpqhm~}v|so|x}xwyodnvkm{hghwrq}lvewso\myna[k|nvznstr|~xt|z}p{mce`ttnuqjx|{{kqypkjdloqoyyg}u\omjVeyujYSdvjp{ltxwx{xnnh}|y~vpv~~wsz}scm|pke~gdqlqt{{s}h{xuaqr]Zm}nt}outuzzwpw{~{wxoif`tpr~ryppq}}z|juspiheugntwu~pycsqn[kyznWTgwjm{mwyvz~~~u{}ystg|x{uwuq~z{n{|xdlylmb{l_xfkwyxo{zzfszaYl}sn~s}vtwzx|mp{ztrozr^rqt~kz}}ssptrop|pqfww\ykbwytyorsudhw|zbRausgxvwwpz~{vr|u{{jszwvx{xuqlw~z{z}oftlief{^mu\q}w{{sm|s\aw}os}x}mu}x{wjow}~mtvwmfsovh}~yt{m|wv}nusjmdxoa{ea}zy}|ytuteqw~zaVgxqju}uwj|un|oz{quw|p|x}uppvzx{wwznipdgbduckw[p{ysq}w`bw}rq}~wjry|ziju|zlp}nrlrqyi{wtssv}y|{psodiamrcsp\z~~tzrwgqwz~l[cwunoz{dy}{kr}l~szxx{xwx{s~y{{rusxupspjnb_b^jketlby{{yn}~nboxrrxb~{qcrzyy~|c~ulwsr~lz|xr|uy}xy{xtuqrp`gaekljuemtwzpxiqzyvccvyqmysnlmj}~sqrxx{vwx}}zv{yvqqvvnllkpa\a]eilmse}vzyo~sgqxsn}|by~rboz{y}~d{yg{xqo{~vr}z}z|yuz~wonovm]g_ffplqlotw}swix{z}ugjzwrl}tlm}klquoyxx|~u|}}q|wtznqwtjfhqqZa]`bjqjrl|z}qz~qn|}vpuxwf|~kd{yxtiqjuvvu||rw}}|u|uuv}{qikvy`dbbdhvhpmw|vylt{{yplx{tnp||zhysi}~~|p|lz{zwz}{{qt|isovvlbcqx_`_^bbvhlqrrz}wu~~wpr{yktpfx|zyxlwwf}{usuysxyyztxmyu}{pfgy}bfabcdxgiro}lz}zwtu}yslsyunssm}~}uz|l|u}{w~zyypux|guqwti_cxx_d]a_cvdfsm|r{z~}wnwyssp|pkzv|zxrrwhx}xowvtzww|tv~kw}zoce{fiabbbwjbtlvn|zvw|ztks{ovo}up}y~~zt{qw~s|zz}zx}rp}|hu~twuk_^s~ff^^`]qn]qpow~z{xosmwsu~unxvuy{xpqrk}~qsyv{wzz}z{rzvp}z{sf_nqjf^d^kuagwk}|tvu}wom||qpzpzsz|t~zpzryztx{x}~~~qvx}{iv}vvqdZ`zwggZ`]ark]trtxx}wmz}h{uu{ss|oxyzznmum|oyw||{x|{{t{vo~{xnb]npnc^c_jtef{pyxutxnn}xtl~ryu~zp~~|mvxu{wy~x~xtuzxwnl}{uocY[twjjZ_]_lqbn|u~wzxmw}|lr~s|tt~pqw{{uhutssx{y|yxzxv|vu{pc]e|vtm_jflwyj{|{ys~zupT{|kdmhcwuxtz~r}ocv~}wrslo~ul_TPeukqcagfpywoyy~v|s~{}rssxz|j~zz|oiogk|zjm|szx}ww`dve`ZbYisj`TNVonnm\cafnulo~v{ygfiawfUchc|xgrkw}}|tz|umusij|otroth_`u~{pptv|}msruxwpfh{rfruqtfxyt~zlcguhqqszxrddtmahYirdUKHWhcnaX^]dipjnz~|}oa_nhjwiwropnnj}z|||}{ts{p|hzmjs~|kzpwnc`l~y}putz}}}zys|~ythdqyhmwm|~nm{y~shgvmgz||n}|tvgclyhrkexq]OJUfaniZ_]celqjyxw{|z|sfbofav|qxsxsnj|vwz}{tsysuly{okqvzlzytpcao{vrutxy}~~yrvt~uifrzhpul{zsl~xzrkmzjfqqr|~{wieknt}q{wn}w_QO^dasf^_^bbhpjvqvuu}}{}}tjjtb`im{~|}||nn|stw{rsw~ttsy{pnrqorpzxsecrxt~uvtvuz{xnmwxlhr|jrtkxwxnx{urmp|lgkg|xx{mhljhl~{|xzkXR_e^qkab_a`copmzo}wq}{~ztmlvj_f`u~{zn}vqt|vrvy~sxyy}~sosskjpzs}ldlypxxtuts|{w~skr|tkn|toykrwvyovonnzxhncj~y~}|rikmfch}~~hYZhadthgcab_errpwv}~~ut}}sljovdee_w|zuuqtvtv{zxqx}yyqpvsjepzt~mfqxoz{vvsr{~z~y{smuvmq}ttzjsuu{r|xijn{vjqcj||}{y{zohkoicf}|q`^jbdtjjhec`cpyq|}xy{yw}uwkmkapye]dqvxyhqz{tqwy{~uwr{{|y{{ol|sioud\c~Z^_cdcjy}u}z|jp|xwyxrlt~q{ypnsgfiptpygpxz{zxjrzqjs~xxeXcpwzyqojjr|d`yxpkYcbcmkl~wber}zllv|{vssts|}q}wsfQRgp|nbXRTamihsznxz}~{xnw{zu~|o}mlwzxqqkfs]bzplnou}ym_hxp{zmfj}vghb^lpv~xqowzwsfkptjiqpkys]_p~tyyeipxyvsqp|ny|x~}szzvp|f\[T_kpwjabmungz|i~w{vq{}|~u{|rmrlvvz~zkuu[n|nikpy|te`sps~tmhrrcfcgnk~upr~}xw{lfq~~vmrysqzj\g{vu~kflrwvttrsytyx{x~|t~v{ruu\[Z]ed}wkhnxwgqls~y~{|zpt}u}~~z{qmmwpnwqy}cj~ufgnx{se`plq|tojozcdhjjdzzss|{vzndjzvz}syp`hzsx~jgjossstsrz|yrzwqv{x|}zy~}wy{_\`b]Zu{tpu}|humw~~||{u{zps|w~~{}yiqzlfl~vkmzfdmxzrdcogqzrplo}~eakpg`tv{wv}}|xwrfgqyyvwghwqx~lhilpqqttqs}nwyoo{|~~x|yz{xhZbg^Ujpx~xzspvu~}|}|z{s}~{}urw{}{~~~|x|mh}sfeqyqwscgszujbnhhxtqpout^esp_ksq}y|}yrrnhkqv}xwwjqsrujjilnoruspr{htmqyxx~v~zx~|aXfjY]mk{}vyy}||}{z|~o|uyvuxyz}}}~zs{fh}qggt|wxtdhuysggpcjwrrqqt}s^dvobqqq|zunkmknqu|{uzrspstllkrw}y~pr|xv~}{wnx|qiv}{xz}jYfp`cspefp_jtgs~mqtsvvwxs~}}zrsn^sqebk|~yxmV[hfZZ^ajn]Uipbmrn}|lxtdiorvx|~`Yc|~nc]XQ]oXXondcmzyvuuiq~|xtvt`]rpk|||tmhjxpq[Ufn]Vahkkjo}x}vsz~sl~zap}xtzolk`STkrzvnfbd]LWg]eleo|~yx|{~ww|qvjkxrcmf[do{|qads^Wikebjt|}t{}rkrsniwx~wvwibvvvjddint~ohrxeXclmjgmyozsu{tnxhs}{yvc`_YS^qo|}tmlfW`hcnidpz|yz}vzsv|}qx}hl{fcm`^hq{uhrsbcklfgnu|u{zxz|plpngl|vywvvjkvt{|wgdgkouqrzxa\kqmffy~xsqtpuy||rz~srx}{{~qda\TWjiovppf`gepmais|}zy{trrx}~wxrhv||pfob\ahpxtxxnljmkhlqvv{xzt{vmmlfiwoq|vytnqt~ukgjkkmw|z~l_ktnedv~zwts}qnprsv|y|zyv{{{|xjd]U[f]g|wxsieiuj`fowz{yz{~rsry|zz~~vjw~vytorb^_aelx{zxmoommps|ux|qxzqlidktgl{x{|tmt{qyqjlmkjpyxflwrfeuyvwyt{omnnmnt~|vw||~}~sg_X]fY^q{}vgj{padjrvyyyz|~vzwpvzzxz~pqxutuf__``clzwottrqrxw|w}ro{xngchtiesy}yplst|mlnmjmrz|wktypgpzr}xvzqjlmljlt~ytyx}qbZYeaWfr|weu~ldhmrvxyzz{vtpvyxy{~}yrtx|}wo`_`aadm{xsw~njvwi^[eiZ[fn|njru}wvj]\agjej~ztxx{xmt{uo|z~qmruwx{oUppdfr}w||~v{~nfjxrejhqy}kz}x}uq~pe`bdb\lvmmomptkeotnq~xs~prx|}~yntjo}potzulvypxynwxickuf_hpw|yi~~ml{vlhgg`]pskoonrvmisuotyko}sx~sX_st{||zv|v~vlw~p`\hk[bp|~{ujjuxusnagvokmjhmnddllispi|vsy}~}|~~wtaXtu{tv}nl{zh\`lc^ny{{nzsmv|zwldtxoqrnovsjmqnrvioptz}|zyz{yrogS`~|xylr~r_Zfh]hx~~w|w|ujs|~}zqdlxompmimrkejlnvnksrx||zxxyyurp\]|vty|nkyyfYbj^ct}{}r|~|ou~~|vhhxtotsnowukjnowrhw|youz{yvtuurnn^Tn{{{vmv}n]`kaar|{~vxxkp{~xietrmqpkiptjdhmvsgu|~pty{yvttusrteXnxxv}vkp{p^^ja^nx}{||}~pt~{kfutotuqms{shioyvgqypqvywsqqqpnqcUg|}|{pq|ucaka_nvyzykpzzziftqmrrmiowpcdmysfq{rswywsqqrrsve[lyxx}xmnysbdj^_lrz~}~|nv}z|jkvqouvqmt}vggr~sgr~wpquvtqomnnqsaXhz}}~}sqzwhhl_amqy~z}xjryu}|jitolrsninxvean|sfp||truwuronnoswf\jz|{z}~zqmtvigj^_jnu|y~~~|nu~y|olwqntwsnp{}mcn~xhpzzuortrpmkjjnseYdr}~yqsyqknb_kpuy~~z|{kmzxvsjtqkptrkjr{q`dwzikw}~sruuromkkmun]cq~z}~}yqmrrklc[enrzvx||}~~rm|{|ntwnpvwqmq}|jcsqju}yuopqpmjhggmn][ivzqpurpk^botzv~|{||zx{ugp~~{qmvpkptqkjr{racxxjp{tqsrpmjhgjqh\gt}|~~|zsklpom`Zgqwut~|zz{|z{}ol~}ovypqvwsnox}oam}slx}yonomkhecbgk]\kx~}tmossm^`pyuwzxwwvtwuhnunwtkosrmilvwg^nynq~zqponlhecckj^fw~~~|{wnfioqfZdt}zov|xvuuuuzsk|st|sotwtolqzwfcvwoy~slkkifb_]aia]n|}~xmhnusb_q}yq{yurqqptvjowoxvlnrrniiqvm_hvpt}smlkieb__hi`j|~~{{ypddnui[fwxnq{~zurpqqtzsnsx}sotvsnlowvhestr~}tlhgfc_\[ag_bu~~}xldlytadv|vox~|vronnovsjwsr{slorqlijptkblrp{|rkiheb_]ajdbt~|zzxmadtvc^o|zxzlqz{wronoqxxmvxvypqutqmlqvqhlrpzzz{rifdb_\Z^fa]n}~~}teev}i`o}~zopy|xrommnuvjqws}xnnqqnjimrphjnmx}{xnhgeb`^ahc_n}~{{{sdar{h^kw{wnmv{wronnqxwlszy{qrttqnmottonnmyxv|ukecb`]\_e][kx~vgexjbny}{qow{xsomnqxsgpwywoprqnkkmpromijyyxzohfeca_dh^^ny~|||tebu|h`kt|zyplsywsonorzuir{}|ssutqonoruurjixws{ynfcb`^]ae[Yityzkeuodmv~~{vmsyytpmnqxtgn~z{{qqrqomkkmqurget}s{~ujfdba`ch_[iuz}}}ymbm|qdiqx}wxmmtwtpmmpxxkm}|vtutrponnqwyndpps{vjc`_^]_d_Vapw}~uhj{ykkryzslrwvrnlntxmiwywqrrpnlkjkryrbg{vqz|shca`_`feZ_ox~}}}wkdoynint|yyxljqtrnllpxtjs|vtusqonmloy|lbrmoxvja]\[\`d\Wft{~}uijwwnpu|yuklrtpljlswmkzxxrrqomlkhho{vcdzyms{uha^]]_ee\`r}|||xnektqnrw~yw~zpgiopmiimvvmt~{xttsqonlijtubkphpvoc[YXY]daZew}}}xnipvsuz~x{~zogjonjhhowsmzw||srqomkjhehv~marnjtwma[YZ\ch``r|zzxqiipqsx{zt}{ytidhlkhhktxqvzyutspnmkhfo~|gisfirpeZVVX\dc\h{}|{wpkort{w{~zyqfdjkighoxtqw}{srqnljigcfvodtmgoum`YWY]eh`ex{zyvpkmnnw~vv|vwshaeiighmwwq|~}wutqomljffrygnodhpncXTUY`f`_p~|{zupppnvzwwvwncbgihhluwpwzwsrpmkjhdbl}|ij|uhgprh]WW[bic`o}{zxtppniqxt}}tsvoc`ehhhktwpv~zwusommkgdl~mjyvhdkpi]VUX_f`\j{}|zvstrjq{wutwsf`dhiiltunt~yutqnlkjeck||liwxkfmrl`YX\ch`]l{}{yusuoenwv|rqvrf_cgijnutlu{ywtpnnlgfo~|nlwviejpk_WVZbe[[jw~~{wvyqfoyz~srxui`bgikourkszwuromljfdm{znktzmgjqod[Y]dg^\jw~~}zvvyrcj}xx}rotuk``eikouskr}zxuroomifnz{qnv~wsfgvzrmiljgkpszvtwx{zyzz~yx||}ryeptYdszvpvxw}~xpt~zvvgax|}w{{tqztkdjljpvu~|w}ytxrvvminu{{yt~x{yiqi_rvouw}{y}~aiwynnuzqpwsot\`ivpcelptbiuh}wlrvxy|x{s\Ug|}~kjkZabn{xjom{w}uqxupuckgqx~zv||}{|t{vq{vyhhiboukpwpxqskxqsxhhyrqq`jipq|~}v{wv~o_liq}|kyt|pdfc_YkgalhXcdalqv{u~s~vtobceWcslwzuzrt|x{wu~qsuzrtmfnsn||ylyzvstir~}~}uqvllqab|skptpz}jks`Ze]amv}vvjWftqs{sdonbdgjkmgsyhktgluox~ukune|z{spnnjh^`wwvqsxhr~u|syy}}wvm{wednt}|~~xy{ustmfsy}zquytxelphuykknx{{qq|pfka]nmxzv~eaeZczzswuhphgoi[`m^cyqfojr}wpv}t{xu|}yzvhniWM`^e{{}~}nw}y}zu|witthfdsy}}w~pxx|~uoqzsq|yyry}{wnyumw{pwmpzvgin\evfX__r{{{zjom`dsuqq{hjagsj`hytxn_pzvpx|s}vy~{|wvulitiZZjjtyo|~xyozwv|yyz|ryuqqbptrl|{x~zuu}{wglmgppu|~viol]osljdvypm}xxc\ptn|yuw~~nnjUarednq{pv|ujbplmtkqpfmwpwox{vuo|z|}tvwk]f_Zggvyzxywz|rszjrxhh^kunj{}}uy~|wpvotjk~~w}}t{|~tgyz||umu{krkmna^kgpqsz{y{wmXb{yzpwpqreqiqooxqhrxzzkzxrksoiy|~ohfui_We_kui{~x|q|grum~o|pm{b_alxq~ptqz|t~mnxlt{pvlpwimjqrryrqxmjvfgkvjqv}rs}plcZsxfYt~}{fnqejlncqz{bmuxvlht}oly}wu{{|xwmwgSbV_Ylz|qv|pxtqwgshqsrslwwsjz~ujsnk|ronnuzuztpsk}bdpzvtd~trslai^bt{~wp|qy{k~xwoPu|qlkurjmvry|pkww|kkqdjd|~}{ssunq_adRgm`yozsu{ywss{yovrjuwx|w}}{xwt|s|luukmibk}{~fweld{|l~x{|dzx~olncnqps}}txrnX\wt}||utzxmxqoyqxeu}psr_}fnd{|yzz{s|ofqZYbV`zmvz}|~{v|rsyxxotjhtu{pw~v{|oy|{wz}ntkgiszzx~nqmmyvzmy{|wgmlcngpgo|v{}xzt|zg[yptvl{x|pxsoxt{kxsstdolfvxrzuyxxtjpbV`VUs`irzx}wqy{u|w|omvtvfzyy|xu~~{z|mokjfqplmx|tsn{q{lsywkvpophq`gty|z|jdvrmj`k~~{{u|yvnw|lnod}jghyynsx~y}tvxf`eTehXY]w}u||x{}~wmrwujgttlws~}{wyz~vwpuntnvnlizrw{s|}y|mvqyqpmli\ghqm|y|}y{}fv~steanmps{z|{pusmoh{rkg|tv|ls~|{v{tei`apZUS`oir}y~z}y~xw{zrjvthifm|xy}|}{~sutwqxppkundnrx||lxp{tupsrbkfmgns{yz|p}yodki`dgunz}zzlpizoli~tt}jp|||{yonhlye^Wdh]apuz~||uqrsyyztmhztyubcw{}tx|yqnpkc^Uesoszz{}~{{tn~wrsfswqhyqnvy~}|{qrznqlvmegb[iumvv|{~wzqtuk}wozph|{xy{s}s~nwxr}lwwhnneprlstoy{yznnwvlrm^rxfisq{~~ty~rryn`fUYlc_uvz{~~|u~zwpzxlkvmp|wyxzz}umuqdlf^_bfqtm~xzsszmvvfuw{sgmty{{||y~zkpr\eugcmfq|}v|sjunpwut|wtyiyw~w}w~{p{{{dbdedpbWjngz~x~wh}wuytxsmjvkmwlvwu~rszwynyqdicemmgnxqwqt{zvvnzs_hjfmv}v}ryzz~xrmsfhkYZptxvu{vy}qrz|pjn`kym{{|zz|{p{whkf^`eomofoxqy~x||~lk~rllupw~uz{~z||okscgzo`e_ckmip~rwvstuznnwpstk{v}}puvmiskol\dj^cnju}xvyjwoqkw~wms~wxjd{v|{x|ztotiliaji`Vf`dyy|{s|whoqllgvv|}~y}}owvq~}xq|wub\ovmxmfh~}}{txrioajxfgbr~z}|}vmxqnjjukmelrgdmoy~}~otxpqosqmwtm|vptpbslc_Yjic`qzw~st|y}{ssyquhmxwlkvm~~uzr{zkqhjk`]f`iho}zuxssmx}suvcm{~zy}|szxxqermh\dZVmtcfgs|{|syuvymzpsrq|xq|~x}wts}wkhzzqsjg`rggmo}}xvuviwqdc`uwpl}}vy}wpxwosjsqdbljo`ituu||w}s}ormvtjjqou~|w{nvyhf_ovnfmxpse[n}x|vqozrmgncl|lqqzvnsukdXW[VPVZhjhlv}vs|ztwrsrswvqrbuvkv~nku}z~zyfejutxzcctfuwfpht~uo~oywwu{eqdpq{z{}uqeq~kcui{vfvxxpo}|swstjysm|gyzzb}a`njo~lpvg}nUgVr{acvsyv~z|~}mkzbmps\ql||wszrlkqsvqtxXvptsfvv\ov]_Z`cQ\YVr]_solw{}ox~s~g{u^eYi^i||y~}nzztxzzzuyecsurnd|n^VTYcXVNoiYmvounv~v|ttmi`}c\ZYm_xv{zz|~}qoxrZm~|yepyd^_YacVW[vZeuprr}orz}wqsy_mi\fUdik{y{y}wxufpxf\yw{cqogc_VkbTTjrVpromypsvstusns[vx``gZpgyx}z~|{~~lcqrffxrftkid^Wo^UUonXvyrxnup~tzrstlo_wqac]Zxoy|yxz}~{z\`vqjjvmiqlhbZYnRUcvcYyv|ulw|ozu|yvuvcgwj`c[n|w{qyxx{gXmwoozy}{gjiqkcRfgOajrYdtq~qn}tsx{o~{r~udopgg`^{z|w{z}{{~{|qwV]uquqypigstfXUoRTlqgVnlzzptuu{~tww|ihnijh_m~}}{~}u~~|}ny_Tlqss|yldj{o`RkaIjqp]bluolzyw{o~|tqfggmkbj~}}{~}~}zw|xlpgThrqxstgd{thVflMftib[gp~qk{{xwvur}}vmfcmnekxzv~zy~ylk~nXcmnwo|lczjWeoP^wfh[anshu{xs{qq|~{rd_mrelvz~rx|zji{nYcjmwnoczk[hoUa{bgZ[ougr|~tvppzx{vc^pqdnr{n}~y{|ikyk[chotnph}k^mnWf~^fYVo|qfv~|rxmrzw|xb_ttirq}~m}y}{{~llwn`bbnsntip_kk]c^e^Rn|tgqzow|mqyu~|d[ruirl}lu|x}{kjrncaaoup{hudpmcad`eOhzsgnzls|}s~ryt|~hZoxmuny|~p{t|zsvynjooid^hun}i|jnmhbxrYkT^yulgoow|~oxvtxsZewpurvv|zxo|syxoxojklkh`bunzquqlqign|[dcUtwqgysiz|xpuvs|b\ptsxp}~}wmvwuhrpjhhike\otso|~}munlmxqYkYbytljjpuy}twtovq\dts|s~z}|{{xpzq}nteoijgekladypwx{xqsipsxd]iYrxtjwugz~x{|w{vtp|~i]ksy~s}}}~vqwzo~}qfejghccmm`mzttzxturjvuvaah_uuqlnhy}yzy}ytop}ye_mt}z}}}v}qz}nxtu]cdgh`dpmbxyxzxuwnm|ur_eghvtoqhowww|xusmt}sbdqyzxwyyvstutuhsXbahc_jtil~v{~u}|ywlw}pk]iiqurn}vfz{xr{|nupp{{mbir}z}|u~{r}snv|wm_\_eh^aqsi{xzuyzppvnganqttovhpx|zqppsmv{tgem}zzsyy~sws}wusinX]`h`]kwmv{ys}{}vokm`iwssprpkzzkyhvot{xmeiutu~ut~sp|qznux\Z^hc[dvqt|uv{|}xp~nmfbzvrrpvi{{{znzduqtzxphgptu|uups~xsuqrvbY\fd[asstzryy{~{q~qjm_z|opnzkz{|wrtdqtuzxqjglvuzttq|x|uwqrsseY\fdZ_qtvxp{z{{ssho^|~opnyn{|}ussdpuw{wrlgl}tuxrvqy|xtxorvoh[^gcZ^prxso|{z{vqhq`onpxq}|}trwdpwz{vrlemzsvvqxswurzlrxjk\]fbY\nrypn}|y}xvfsb~pnoys}}~swshlwz|vsogjytxvqxwruo|lm}gl`\ecZZjrzqk|}xy|dsgxsnn{v~|}s{qohv{}wsqig}xv{wpv}oxk~}qeihi[cc\Xdoywh|w}zinppzpk~}w|}~uxqzeoz}xsrnewxxxqsrwkt~yaxv`m^`d^X^lw}h{}zx|tgtotjx~y}~~ysvzmhv~{tsrhpyx}y|to|}n}qk|jebgi]c`ZYfqsp{t}~jnuxomz{}}rx{w}xil{}wstpjxtuyou}uv~}ir{y^uw\lc`b^Y_jzm{u}zhsy{jwyy~~xqxw{xsfq~{usunqww|xvo{{pythxzp\|k\lba`\Zco~tuw}~uiv~~xj}}w{}~ssvy{tses}yttvovtv~~sq~zpxnh{yzh`}c^kcb`\]guz}rx|rj{}snxu~}zotr~wspfx}xtwvsxrt|pvy}{uy|zhmvv]mw[djdb^\bly{ry}}mo~ly{sx~}sprvoujj|{vuytxt{v||vr~vwzy|oguwxj]vjZhjc`]_gtsuzwj|wwo~ts~xnsmxnuft}xtyyxxqzv}|ryuz}zwvvhn~zvr]mr]`mgb^^enysw}nr|~o~wpz{nsmzivlk{zuwzx{ns~uwxv{{r|kjx}tvbfrf[jmc_]cj~su}vnxszxov|oqmslrsix{vvzz}n~s|xwyt}o|}mn~vuytdlwjb`dg{yxypxxz~yqy}|{|yznenu|q{w}mwv`c~swhjnm_aodZUZ`s~re|pia{lzqtxwrhqqtnqrlxmr{wrplpks|}sYWsndOUTXNPcYPNUZnvy}vpzuz~ypz|{xmfd\}ksum}rdvmopnurv~}qnv~ygszi_dsqvmqgeypdagl~mgq}mzyfhhmljcZdy|rekbkqesmhnkiilob}~|{xcW[j|uudaZN`\NIMRbhotwzoq|t{}zttoiddgYszz|julkmgoqu{zpkoopg~{lbcluy~tnterzlcgkyuhix|njvrlf[\oxgjgc~~kjxnjnllmsdkn|zi[Ybm}}fl_Zh^PNR[fet}}toryvswxqokhdjb^|{zwtxioigot{~wlkrnkjz|tfbgnuzpovit|ngjp~}}qij|ok~und[`swglbh~{mhypgjkmptds}nuztdY[em{hnh]jeVSVaffx{|vrtuusux{qihgelfc~uv{{jpjelt~xmjolwphqwrfbipt|}{wlxro~wlmr}y}uno{|d|}rg]^m}}kmgcyzufpyhdhloxms~~z~rknoeY[gqyqgpfcmcYZaje{}s|xwvysxv}q}ze`cekphzpzonndhq}~qkm|topkjopgbhsvz{{ms|rwuqs~vyyrt|hrxl`^iypnj`uyxmhzpaekpzrv~{~ztpkegbY\ityxiqremmb`emf{u|zzsyrxt}pv{e[aenqll~qqndhq~pkm}vnioijldblvwxv|prwvyuw||y|uvsvjv{k`bmz}orffxvynizq`dltzp|z{}{kolbc\X`nuyzwmwwky|wx}pnngjdojbcesslqw~{s{nxxb`ipyqi^a]X^izyomvyyiq|swurv~x}|ny|{z|uxvwo{yrtziU}XIP^infiaXkknpemxg`ku~s{{wp|x}qoronms}v`e}o]Pfhiqnlhflxrgnvum{{rqt}wqjz~|syyrgpzx~i_td^hsre\\fnip[^qfddekuxunwqo{qq}z~zxf_t|{yuoceTQa^bf^_l_V_lqfvwn~}xvqvy}utt|umuhcw}|{zslebhsm_exlduqkkowtyrny|y{|ms~wxyqfviellgs[Wph^^airtpgp}xsn{wjy~}x~}zulhjwye\iccif^ggX[ipetwkvy{{qpvpszy}ouubhwlegptf\vxaorllov{}wwqtqx~}voyx~uwmtvmnrgqmTdreZ]epurifur}zpr~sj}v|}~zlnknzbjkdgmi_ifZ`ojj|pmw}uxxywtrms}vxnuudkyngjrtd]}ubpomnsz|z|~xqnxr||~yxoyv}{prsy{surgumXcshY\fqvsiitm~zpp|wj{u}{~~}wfmqmippgippbfla`njmtpw~}spw|qvio{w}wlnwniskkrvm]v~gmnmou|~zywqfwxv|~w|tu~vzmjt|yxwiqub^mr_Xanvvoisls{rms~ts~uy~}}{whbvuxspwmjnunbjncili~}rvz}uln~uuliuz|uxmiryoz{pmqutdkqlmlou}|wzvtcpx}}~}u|u{vxmeo|{lpwibgthX^mvwqkrjmzsno||tv~|z|xvg^u{wwv{qmpxtehrjjij|swy}~}|zsjj{~xumhtx|yp~vmip{u{||yoilry{tpt}vuo^pwx|smtlxyqnhzruwz~vo}wotb^bkzpdkx~}uwzo~~yqsyunp{zwplpv{~uzmm{~reXbnif`q~qrtuwyz|zrhszx}vqlwrbes|}wy~sygfy~jacbf^Y`hsyvopy}xzgh}sy~|n{rq~xpgwz{~zos~vdedSQ^hjegl^j}|zwtqw~wx{}uqv}zulqytesy|pwqaUerefhhijlooi`gzo~|zy{|miu~{v}ztkho~zm`birupihqzrtubcu{ml~~{xs~~yrg|z}~wtwtv|jbimlfjgZkwvvusnr{ut|~vopy|xmq{~rlwuwn^puhiigefimni`iyo|xty}tls{|y~q~xnghs|igmuxrjhovosucbo{oeu}|zv}y~|ygzy{~~}~}yyrn{mlonimk[fttuvupnw{sy}zzrnrzzroxznywsygmzmkljfceimkccw}tt{}q|}{~uqw{y}tw|ulgkuzkmv{yqklspmwlafrxjfyys~{zqn}y~}{|~||zmtspqnlrf]msstvtonx}uvw|z}}wqptz{tq{}rp|xu|juymnnkfcdiljchxyxuw{r~x{twzys{|{xrlinwppx}{snnsmmwkcfoxoeu~x|q}|vq|z~zz~~|y{{pvtfnmjged_Zbqphk~{|tjp}|v~~}urtm}ns{qqrpjdbfkkfguuxyow~~{~|px}y{{zyzhioegxyopiq{~zusvqkupbadmqgfxvjq{uws|zvjdplmz~shsyrnoqyvfnurrssngempd\x}{x|{znfjs|sqd\nurqv||~xt|rqutnfa`_ZSSdn}snr|okeegijjkmosxru|~wnhf`^rxsuux|umzurnhq~xjvqbjuzzxvx|ridg__zwqjhq{n[nvotz~xhi`bfiqsikzxxw|}}sz}}st{uib_]dngr}on|uxbu|kfd`_hyycivvy}~~|yy{nmxupse`cektqm{{neiy{l__h`fyofq~yvy~yoxzx~|oilk\h~~ztptspwmn}}mgaagf^dnlfi`Zo|zhdfhjotz}ztv~turxtjlnbotnsv]Ohlbeltxyyxurt}}wsvvst{~vsmjmnfk|ohjlpvjcqk_h||ww|wpywow{qzrlstfoullywv|{xssz|wqnuyolsroqdaszzz|pmnliffkpqq|zy|ukoiYds{iatqihhhikmpppxzwsliloowptyrp{f_^_agszuzgds|ztrv|wuzs{}qt|kdnofs{w}tmyyzxxz|y}rpumdiosvigy~prvtwvpkhlswytrzv{}uwq`fsxvitwrqonlklljfi||vssrjs}{|xqr|~vyvhfeb`bkx|}mq~yrpsoitxqx}u~}npsefsvyv}ytolmpmuvxzncfkqj]l}n}|jjmmjgiov{u{ur{zskoc]mu{}mjnmquvusrssqox~{{xvwxsn|{|{tklw|ux}wpeefdcemwxuyzyztq|xosz~~xrzrtrekvvw|zrljklfo}{lkt|req|}~o}kghgdacjr{}{~w}qeeYTfrzzxumprqnllorrrzw|uoosyyu}tqz|sz|j|m^^cgjnu}}woz{z|xs~~sswzyunlxvtwko}~yvonqvsvxt{shn}|ko{~~~}|~xtyljlllmptw}{y}y|nibXgw}z}}nmrrojhilnpx{uqsxxrz}~xrwxu}pvxc[\`dhpy~qr{}zx{yu|{~}xqt}yrpdfx{}u~wv}pggmttwwpt{sei|swumvifilmoruw|xv}uosumh]Whx~|ysrz{wspprss{~|vvqtxupzxx{{vt{{lwtcZZ]`eksy|{~vt~uwz|||xqrzyuj]gvz|yrt~zjabimly~zzlqypznr|ndbeilqvz~~ynglokaT^s}{}kqyyuqpqsswzss~uv{|uz}}wu}x|no{yod`acfkqx|~xr}~trtuuwyuqxxfiy~zw||wzlhkmiq}tq|rz~}xz{pihhijmpvzopwwiU[krv|~mnwytpnpru||xvsusls}xx~yw}zywxzvpe]Z[\`fmw|{zzz{zy{|vor~sbjwyy{vtzzt}zkfhe`kvsx~|z}uz|zzrjgffghipymkv|jU[hkmqxzw~xtssu|y}wysrngnuopx~~~y{xrqi^XVVX\bl|xwwyxwy{ypmxxaeqtuw{~~xtu}oedb\frqt~{uyyrvumgfghjlp}||zpfkzv^Zgnpsw}vx|wtssxyyxw{wumoyuqv}~}}{|~rqtla\Z[]`fux|ytvvuuz~{rrugpxxxz|{{w~~xzsjf`]jolr|x}||syzqheefgiotim|u][fjlpu{vu}}ywwx~}yztohmwsou{}|{|~{~mhoj_XWX\`fv{|{yxz}{qlzufnuwxy{~xzvry}ujd][hokox{~z~nqxticbcegm||z{{thdqvaYagjntzy|}ywv{~|yx~tmfivwrv|{xx~p`dibXUV\bivzz{ywwz{ukm}{jjswz~|}y~~~vnnvxphb^jvtu|yx}vpkuyqifgjmr~}yvwxukclvj`ekotyzx~~zvuy~{{|sjlxztuz}}}~~uyzvbcki_XY]civz{|{z{~zqq~}ootwy|z~w{~}{souyrg^\jtqszux~{oisxqgcdgkr{yyytjdkpebfilrx}|z||~~y}ynfnxtqtxz{|}}~w|u~k\aif\VW[ajz|}}zyz}|votztpstuwz|~{~womtvm`W_mmlryxxwhjuukc`bflz~~zxwxvofgjecffglrw~}~}|zw~~qejvtptx{}u|s|o]\fi`WUY^gw|}|zxy{{wrsvsvywvx{|~z{~~~~zrmsysdYaljhnuzz|xzkkvzrgcdfmz{{}~|yxxyxsnmjglmihjnrw~~~{rfmtnknrux|v|xsb_hldYTUYbr{v{}}~}yxtrz}wttvwz}z|y~woqxueX^fcafmrx~|}miqytib`civ}uv}{zzyuqnfclpjffilpv}~zzwgjqlgimpsw||}vxg]aih^TRT[juqr}}~|{slu{trstvy}z~}||rlqvn\Yba^agmsz{ujirwpe``dp|ys|~~|yxxxvtrk^bpqiegjnszyysioqkjmprv{~wwrd\_hh_VTXaqwqv~}}~~~~}qjywuuvx|y|x}~}tlpvo`_eb`cinsz{xnjqxujcbgr|xs{~~||zyxyxwwvn^`qumhgjnsy~}yxlopjiloqty}~ywwi^\chcZUV_owqtugqzttuw{x}xx~~wmioqe_dc`bhmrxxpr{{tnpyuw~}|}|~|}|{yyxxy|{ngyv}lhpy|urpnmoruwy}}wxr{xmfchrvqlkp|}uvxsqsuvvwyz|~pu{susjn|||}|yv{|{|{w}{xvwyzuntysonu}}wrsyvv|~}zwuv{{zyyyzz|sm{miv|vwxpkpuvwz}|wx~|}|vrrqpooomjinuy|{|wtw~~|us{toljjkmoqwzrgn}{zz{{xrkmtnfgr~xpklrx|xpmu{wrnkjpwwroqy}vquxwtqpqv~}~vwywzshen~zxzzyy{|{wtuyyz{vqpqpoonmjikpry}}yw{~{vqps|wtrqqqtyujiv~zyyz{zunourjfkv~|zvqlloqyvqv{wromjlsvtpqw{vruxwvtrqsz~~~~xwzy|wlgjt~~}{zz{zwsrtwz{uppqqqqqpnmopns}}zxyzvrqwzwutsvxsjkt}}zxyz{zuqtxtlikqx|~~~}zurpnkqzw{{vrpnlmrvusty{vtxyywvtrru{}}~yy||~xnhhmv}~|{{{xurrv||vrqrsrrrqpopoknx}zz~~zvroqv|~{xwyzvons{~{yyyzyurtxtnjimrvx}~~~}|yvsqniju}{vtronptvuuxzvtwyxwvusqqtxx|}z~{{}yqjghnu}}|{xtrrx|ysrrrrrrrqpppljqz}zz~}zwsonpv{~{{|ztpqu{}|yxxxywsrvwrmjknswz~|~}~}}|zwtrpkglw{wvtqoqtvvvyxuuwxxwvtrqruxz|{~~z{{woigiow~}{xurrx|ytsssssssrqqplkr{}{z}|yuqnmou{}|}{vrsvy}}{yyyywtsvvrmkknsx|}~~~|{yvrpnjgkv}yxwtrruxyyzzvuwxwvtsqppsw{~}}ywwtmhfhmv~}{yutw}|xutttssrqpoolkpy~|}}}}{xuqnkjms|~~~zvvwy{}}{yyywtrturmkjlrx~~~}|{ywurolkigjt|zywutuwyzzzwuvwvusqpoorw|~~zvttqkgfhmw~}{wtw{|yvutttsrqooomlpy~}|~{zzxuroljjmt|~{xwxxz||{yxxvtrttqmklnsz}}~|{yxvspmkjigkv}{zxvuuwyz{yvvwwvusrpopsw|~|yutsojgfiox}{wvx||ywvuuutsqppollrz~}}~}{zywtqnkjjms|{yzyz{}}{zyxvttuspmllotz}}{zxwurolkiggmw}|zxwwy{|{xvwwwutrqooprv|~|yusspkhffiox~{xy{|{ywvvutsrqpomknt{~}}}zyywtqnkihims|~||{{{|}|{yxwuuvtqnmlmpuz}~}{zxwurpmlifeipy}zxxz||{xwwxwvusrpooprx~~|zxutspligfgkqy|zz||{yxwvvuttsrqnlnrw|~}|~|zzywurpmjihjnu~~||}}|{zywvvwusponmorv{}~~}{zywvtrpnkgfglry}{z{|}|yxxyxwvusrpoopty~~}{yvuurnkhgfhlrz}|}}|{yxxwwvuttromnpsw{~}~}{zyxvsqnlihhiov~~~~~}{zxwwwvtrpnmnorv{~~|{yxvtrpnliffhlry}|}~~|yyyyxwvtsqponpuz}~}{yvutsoligffhlsz~~}|{zyxwwvutsqnmnpsw{~}}~}{yxwusqnljhggjow~~~~}{zxwwwvsqpnnnpsw|~~~}|{yxvtsqomjgefimsz~}~~|zyyyxwutrqpooqvz~~~~~}|zwussqnkhgffimt{~}}|{yxxwvutsqonoqtx|}||}}|zxwutromkihghjpx~~~|{yxwwvtrponopsx}~~}||{ywvtrpnljgffimsz~}{zzyxwutrqpooqu{~}}}|{ywurqpmjhfffimt|~}}|{yxwvutsqonoqtx|~}||||zwvtrpnljhgghjpw~}{yxwvusqponoqtx}~~}|{zxvtrpnljhfefimsz~|{zywvusrqpoprv{~}|{{zxvsqpnkigfegint|~~}{zywvutsqonoqtx}~|{{{zxvtsqomjigfghkqx~}{yxwvusqpoopqty~~}|{zyxvusqomkihfegjnt{~|{zywvusrqpppsw{}|{zzxvtrpomjhfffgjou}~}{zyxvutsqpopruy}~}|{{zywutrpnljhgfghlry}{zxxwusqppopruy~~}|zyywvtrpnljigefgjot{~}{zywvusrqppqtw{~}|{zywusqpnkigfefhkpv}}|zyxvutrpppqsuy}~}|{zyxvtsqomkigfffimry~}{zyxvtsqpppqsvz~~|{zyxvtsqomkigfefhkou{~}{zywvtsqppprux{~|{zywusrpnljhffefhlqw~}|zyxwusrqpqqsvy}~}|{yxwusqonkjhgefgimq|}~~|qsvwtvuuwoqonu{}mtzlfhizobqos}zz{~|zYjslz}rnjqoqxgjrzpwy|{}uiriot^creeob]lhsv|uz{{~zs{syj|pa{wfcwwtzuqr|}yqgguvVdpki^cil~~xzytiosyltlgrvj{rzttvlqtvgmt}jote[qwxo`zsuuo~zendrxlkukov~}izhmmglbdsj`koaj}}z}yzvveqsjyt{zcv}}r{st{f[p~juqvzrv{yztvulyy}}al~w~}~qyw~|rwxnoy{{vOryyyonqs~w{}zr~~hc|m|imw}|b}}k{~{sr}nguo}vw~~sYvktx}x|z}}xx~{}qjtfhxtVQjyuplvkrirxq~lkda}~yzyzlu|_zxrwzwzWkds{|hVeepqdinoop{|rxuckalto{tqpnp~r~uxw~}dUeauu[\knstpgoxdpwszwfjuUwrx|pxusm}~}nus~qK^ek}aqoytnlipsi|}xpxq[vocuzzwtrolvzyzqtzw~~|y^Mkergbsqutohivdu{rsxxcnvczvvz{tqn}|ztvc{{x|oLeos_lpurnm`qqlyxnq~ph|olxwxs~rujkyuwpz}{{V[vlycilpwtnfiokw}ss{}ltpg{sttprntqu{}sj}xbRrsu}uemtswrpjvnstivnusbwuryxrsrgrwzjx|nKjro{hqwzzvwlnloy{mo|pmtcl~{wt}lupr|pzjyx}{~wHcwru}mt{xrxurqmjuxjkwpoyclzwvxsynk~rwqtu~{|zM\qnu|sqvwsqmlfowqiwqjxhm~zy{uy{qk|muuwyzwU[wpuywovtusvnhktrkywnwpm~uvy|v{qhyzsz}v{wv}{~aTnmqu|o|}typvsnmuwow|lqvj~xst~s{vhuywuzxsxvlSknlpsuy~vywtopsptsksgx|pp{x{|vju~p{x~tytyRanhkx}t|sxuqpsomy{iojmsmu|xyom~o|z}xz|{|rv]Xqljpw~|wxurorqjr~shnfz|ns|z{qh}xty~y~u{qyqoOipmo}z}~vvqqotjlw~jpjospx}||wjnn~~}}}~zwu}qu\Xrsnu{{{xrrntrmp~xkqhx~ot}}{{}qdy~ry~u}p|xp}wPduqs}z~~zzssoxooupmokuly{|xzhit|y~w~~ynxophQlsrx{}||xtppvmrxjnkpoo||{wvfrv|~xz}~}wuotlo~\Vputy||}vwotsns|zhplw~lq|z{xseyyz~}uzylpngrxV]tvwu~|{txntnpvuhmk~|kx{|{zzkg|x{t|t~}gphhwkTkzv{y~{ywxoulsynklsrnyx|yucsx~}{|{~zsmjmhmw]\uzvv{}t{rusov|ilj{mvyxzx{kd~{~u{u||dnjhtlVj}x~x}yv{qvmqxpjjqsozs|xsbry~}y{{}yuigkhot]^v{vw|~s|turptyijj{|m{uwzz{he~||s}yt~vbkgkugYm}v}}yxzrvorzmkjtovzs|woay|}u|yvz~chgismZeyuz|}~u~rvpsvqijqurp|xuapz{yyzzwvifhhpq]atxt{}vvusstxilo}znryz|ydhz|~tz}wvnejgnr`]nun}}w~ztsts{hko{}nrw|z{ef{}t|ww~seihlrb]ktj~z}tsss~jjnzn~ttz|fc}y~t|vx|tfiilqb]hqf~|~utur~linwp}wpyh`zzyv~vy{xggjkof]eqftzxutsyqhmttx~kzn]r|w~x||vy{ylfiknj]amgky}utuuwilr~{skz|t_j|v~|x{~{v{ypfgklm`_ild|wtvrljpwqspz~e`zzyu}}}s{ztjdjkme^dnct{|uwtwsintxwi~zp]n{y}yzz|}uv{uodeklj`akhg|wuxs~kksyqpr~|{bb{}z{u|}zq{xqjbhjke`dmcv{uwvwuiou~yvh{{q^l{{}{xz{zwr{rnecijibbjkfyuysnjswsumz}f_w~|{u~{x{~pwxnladijgbengq|vvxs|kltzrkr||xad}|~~u~y{w{}~mxsli^fiiediph}{uxvwwjnu|{ugwyr_k~~|v~~wzv{}xmynje^ghiefmqk|}tys{rjqvvzyf{xk_r~w{xwv{nrvik_`hihfjrnu}xvys~mltyrlo{{xce}t}wxsx{{jwogh\dhighmsm{szuxvkpu}zw|exwo`n}yw}~vury}pmwgja]hhihkrqtyuzrnltxsnlzyyde{~t|vxqvzyiwmfi[dhigjorn|t{tzulrv~xyyfxwlaq~wz}~}wsqx~kouck__hghimsnzwxys}mouy}u~iqx|tbi~|u{~vvow|rjyeie[ffghlpor|v}rqnuxv}pkxyxedx|u|vwntzxhxjdkZdffgkoon}t}s}untw~yzvhwx}iar{v~~}xxpqy}iupan\afefimnku~uzyosw}|yxhuw~k`nzw||}yxppy~jss`o]`fdeimli}v~wy{qtx|~yyjrwl`k~zx|{}{yqoz~krv^p`_fcdgkjfyx~xw}rty{yzlqw~o`h{y||zzz}xsmx~pmz_me\fbbfjjer}|}tusyy{zpnv|tcdv{xz}x{}xvlu|vi|dgmZebadjjdmysysxz~ztmszxfap{uzw~|xymq{{hxn`q\bdacikfg}{xrn{ojoyxh]hyxzmn}kjpbb\Xfnrehv\og]fabhmi`gvki~b\cjaRTell}rykqyxlt}}ptqoyyy}k_f|{z}xrypmjo}w{~mdo}zkdputrabZXemobepVkc[c__dg^Vf|}leas}qqobPO^ffwkz|odq}}qxv}ssyxrpofSRix~tz~s{otthfjrwkqw^`vpkcZdlod`qVcgWa][_c^Vhym``fxs`W`khwqvy|y~tdo}ts~y}juknea`^URl}zzxzywl~ymgls{}nlz{ue^rpoablqpaniWp__b^_de\c}xq|na^iw~~n^_lms}p~w~|{ik|zpyvpr~hlf^]_[Uj}~uyu{jw{phluztmvxyrk_qrqeakqreiqWmg^d__dgad}ykxoc`ky|sb_korq{wyz{lj||}qwuuliie\\^^Xk|t{}u{js{pjmw{vnvv}wrl`rrsfblrsgjqXni_e_`eicgtjwmdbn|~sdbmovq|~v{y{jl~}~|qxvpp}hjb\\`]Yr~}~ty}wyhwzqkpyzuox{u|rrgauuuffpusfpk[sebd_agi`mmpvkdfrpdgoo|yt~zv|{vfq{|vs}z|izuhh_\_aY_z}}wzw{|pn}vpmt|}}qr|~w{xrq^fz{{qfltvnit_hqbfa`ejdawvkxqidjt{lgnoxpz}w|z|giv}ryyps|lkc]_b[Vl|}{vy}~vl}ztoqv|tqx{z{|tu__nzknvysjteesfgc`dje^pz|m{wnggm|sknpvr}zx{{leo}uwyvn}qmg_`c_Sboux|ly~xspszzquy~z~vyiYdstow{zow}tqt||q|wy~|}|vrv~~ro_d}yh[ZdbhfS[gxv}xr{}}tridfgZYjsw^nmhh\\mljfin}y{w{z{n}uwuqu^\i{xc_yp\UPMS[XP`gy}zwwnz}wrpu~sn]mo^\a]g]NXdsn~yytyzwswrigklagu|jfdzw^^jgebejzo|uppmwvsxzvwydfr{rngdluh\TW]XRaew~}ruxzr~|xw|yndajettmlembRZdrmxszrkouxy~wmjnpgkz{zlcjn{slvrnijnzpx~rkjit{vzzwv}ifrkcehlszncbfcZgkx~w}qsz{ry|zx}pe^\lnu~tslpoZ]fttsvxvkksx|wnhkpli{wqmbku{lvwsposz|w||ukhfm}z|wxr|vgq~n``hqy}rgaeh`bprsyup{zp~~}|~qb\Yhxywtplvf]gr{q~~tzxzlhnxyqiioqlyzkndixoqyutruzrvwkfdh{wxsy}lq}|}p`^ht~vkdfjfdstsuvoz~o{~qb[Ygz|ztqlwl_gq|sys{uzmgmxzrjiosoyzinfk{rqzxwuw|rt~vkdcg{xyszos~y{o_^iuxmfglhhvuqttoy}p}}n`ZZj|}|xsozmbjs|ry~tvuykgny{rjkruq~uimem{rv}zywz~ps~|sidbj~~yxs~~nu~w{k_amxynhloinwv~ovpoz~wuxi_Z\qy}~zrv{hfmwyp}yxrztiiqzypknusumnidp{v}{z|vyww}wnfccs|x~|vxuox{{wf`fpyxomqplvu~sstkry{t~re^Zhutyvrfkqzqt~vuw{nimuzvnntus~uombhrx}}}|p~s|yrieamxr}zwymt{}~ndelry~vrutowuy~wtujmru}x}wkb\dplxzzikoxsn|x}vu}rklsvyy|{rotvs{~}rsddkpywzvof^Y^lfizyohcx|}}zr_fu_ptp~w|wnuliopq{{uumyu{vrulgldf\fqqrkxxomsz{}xug_fuxyyjqzc]vjbkjgb__mslwxhf}|{z{zm]_r{nm{olsuihl`chjmxmmnrv}yl_tvdkonjgtohhotvvq|wh^amx|yikm|soldjhd_\\lliuxpen~}n^[hxwrvuhij^aefj{{rfkpw||xqgc|ux|xpkwrjiotwvov|tf_cpyx|~}~oaksyykomhc^^lpjtxpgn~}zzj^]k|uxxlimaafijx~phiry}{wzqie{|v|tjtvmjmuxyqyvvuh`cq|x{}}}tw_huwmlmid`]fslq||{rlk~~ttma^j}xuxrhnh`gjlp~tqqdpz|wu|~sljutz~xklwqklsy{wq|ntlddp}zw||zpu|cev||ujljfb^brqoyz|}tpm~smncak~}txuimlbfklnzwk~vdp|~|wt~vztnmuvx{mkwsmlsy|yo~lqmefq|v{|y{po{fex{yklkhc`brroxzy}uqn}}|{qjmecmtwtinmbfklmyvj|ufr~{wu}txtpnywz|lmxsnntz|vn|jqmfhsyuyyvy~lqydi{xllkhd`ftpoxxx|uqo~}v}kjldep}vyrkqjchkkmzrn~ohv~~}yuvz}sxsomwwisyrnpvzzoqskrkfjwtvwvt|xjxpcq~tmmkgcbnsls{u|ztmu}||szgnicfuzyxmpqeeijjrymxzhpz|~~{wt}y|uwwpjp}np{wqptyzrj~jrpgfozwtwwsw~ouxeku}pomjfckskowwz~wnm}~}qjnmdbkz{{qqxrw}|y{}{}{o|}{zxv~xco{usgbuxdevwrorwxr`kxtv{lor`Y[heguko{zv~romjfkxuxmiznle^qok}~}hjyrs{q[^n|yi[T^casonz~ro~|{xz~ed{wfm}n^ktqnnrtp_\z~|x|xfkxwjjnenohsy}uzuqmlv{u~iavnj}ho~{z|~zm_u{~wywl[[jq|{pkrnnxpt|~wnu|y~xg[mvpeswrnnpphYc}|~yshds|yz{qxsox|yy|xsnnxwr{~raf~vvku{yzzvg_{{z{~neYapt~vszuu|syuox{x}}~x{td]rxrftxsonpohYe}~vnecvyy|sxupy}y{|xtpoxysz}y|qbgzsmrzxxxth^x}z{~kcYcvzxszyv|vyvqz}{wz}ztusg_sz|{gqyupopoj^a}~vjecvyu|vuxqy}|{wtqnu{tv}rvrgfr~wlz|wuusl`n~}{lb^c{zst|wz{w~~zu|}{zwwx|vlpkepunivxsnnnlf`{~}}zieetzsxztyuw|vtror{wsz}porljuvlt~|wtsrnej~|nb`e|zts|{z|w~~|x~{zywu|wx|~wglmjsvsiuytonnmidy|z~ziegvzsv|wxvw|vtsprzxrx{okqonxuls}|vsrqngl}{~obbh{vt}}{{x~|yzyxvu|~uvz|ueknlxwsjvytpnnmif}w|wgdhzztx~yyvz|vtsqt{uqxzljqoqwylu}{vrqpmfp}}}z|lbcn|vw|zz}zyyxwuv}zrvx|nemmlznoyytponlej~|v|qdcjzv~zwv~zvusryyptx|whnplwvtnz}ytrqogd~}~y}wgacv|x~{y{v{}yxwuz}ssxyzghnip~zmx{xsqpngawvzyhaarz}yv}|~ywvsx{rrxylkpjl{}ny}{vtsph_q}|}~ma]k|}y|tuzyxvz}trxylhmgg}px}{vtrph^lxx|na\g||v}{y}zxvx|tpwysjplfv~pv~}yvurl`e}{ve]av~y~wpz}zywx}wpux{whkkdoxu}~zvtrmbazu{xg\]o|}xyw}|zxw|ypsxz~mlogj}q{~{xvtpf]o{||pa\hz|y}sr~~|zyxz|spvw|qflhduvy~yvtrk`f|sztcZ`t}}w|}v|zxx}wotwz{jkngo{s|~{wvsoc_t{z{}n`\l|}~z|rt~{yxwz{qpuv{oejhgywy~yvtqk`h{qwtdZavw{}w{yxx|wnrvw|jhmipsz}{wuroe`r}yv|pa]mx}ttzwwvy{rmrtw}rcgjiz{w}}zvtqlcf}|oruh]`uywyzxwvzyonsty}ndkmptv|{wtrojbl}|qvuh`ix{yu}vutuyukmpqwwgbknxuy}zvsqojfwz~rksocar~t}}~{vuuwzqkoqsztdhpsysyzwsqolfj|~~ppwmdj{w|xussswukinnswjakqzvw{zvsqplhv~z{~rhpqgdr}tz|uttvyqimopwufgqv|rxyvrpomhk}~|}onvpgl{v}yurrswtihlmqvjaks~wx{yusqpljz}xz|pgpqgevs|{tttvxohmoqwsehrxztxyurpomho|~|zmovnfoxy{y}srrtwpgilmstfbmtwz|yusqojl~~w}ylhrndg}{t|xttvyujjnosxmckr}wwzxtrpnigx{{tksthfxu}w}xsstwujglmpvobemw}z}{xuspkgu}y{}shnqe`os~z~~wvwzynjnprxteelt|y{zwtroico||~ympuiamv~}vw}utuxxmhmnpvsdaho}~{xuqkdn~z{wjkrg\f{v{yxzxx{{qjoqrwxibgm}{||zwtqkbg{~}}~qmuo`dx}zxsyuvxzrikooswl`civ}zxtnffx}z~}qhon`]o}~u}v~yy{}xllqqtysdbhr}}|ywsofbo{|ymoth^j|x~uu|wvwzynimopuvh_ck|}zwsldj}~|z{nhpl]`s~~}w{v}yy{}ukmpqtyqbbiv~}{yvsmecs{{wlosg_n~w|tw|wuwzxlhmnotug^cm|zwrlek}{y~zmgol_buv{w~xxz|ujkoprwrcbiw~}{xvsnfdr{}z}xkltkanx}~vx~wtuxwmfjmmruj_cn~|ywsmfk}||w{~zoelpectt~xwvwzvkhlnotuhahu~|zwusojenzzy~znhqrgluzwzrruwpeejjmsqdbl}}{xvtpkjw~{vvzzthfpnfqxv|~yttwwmehklpuodgt~{yvtsqmhl~y{|vz}{qhmvom~s}~y|rpruqfcgijpsicl}|zwvtrnkvy~utxyuieorkr{s~~yssvwndfijntrggt{xvtsqnjm~zy{ux|{rhlwros{~{}roqupebfhjpsjdm~|ywutrnlxx}~ttxythepsluys~xrsvvkcfijnuqfhw{xutsqnjpxyyty{ypgmwqrs}}{zqpsumcbghkqrhdp|ywvtpln~}x~zsuyxqfgrpl{|xuqvqrnst{|{www{~wrjrxlqlc^WW_iqt|xnz|nj|uml~|ptsxyrxj\Oej[Z\akpzknmlxqknot~ugby|{y}difXb^]fklozs~v~uutpqkSUmeja_kvsjxmu{vww|{o{rwibw}t{x~}vnhjecUO]rtlvzkcesz}|o}z{t]ckyzm_bgc_`mg[ekuy{zu{qfXaacz|u~{q|ymnk~psrqcflrs~}sxwuvqdry}jffeb^ywxy}zfhagnvnZiiolstvikovvqxjtqtsyw~swt}rv~yjn`n|~}wuxyw{xpyuykw~zcjjrvt~{|u~yuqdrytqonrcphjsq~x{ophwzwz~|hf[R_b{{xotuaj]oxjory}xi~}nwt||}a_S^ywp~lxxyrxhmhfkrwv{x|||y~}disttvxowvozx~zuylwihlxr}~|wpn]bdq|wrozlmvsqcysvtvp}}~yrckgid}y~nqppu}{zquplfujkw|}z}|qkjcgurysckay~rs{zxgyzzvs~}}feWZm`iy{~jqssrntiqtx{x}|x{yq~uw~nbhcjnvyzxq||lrfwzfaeukvw~}~wnokgpun{tk|~~py{}{xqrcipx~xwqy~hnoja^vpqporvsu}rv}|u}|johtqpidbgkuzyqtrkk}zr~jn}uwmx{{ysqgzj\]tvozuvxvx{}{}|vuwhoz~z|x{imd_ant|u{xnrwhngsplovq|~}|qtpb_jdnx}ttwv}sqstghkrwz{tsq~u~l`vv~ywxtxzz~x|v~xkk`swjo|vtrkhebfuwu}mfj|qq~m}qwxs|~~|sthYWhfgzx}|stwzwzvvxtgpvqw|z||z}x~pjllcit}xurso{khy~s}wlm}sy}ojbejlzz~zylx}miihir|l{~ql}t{q|qbuenw|}t{sqgppfrdmjfvywomf`f[\qroz~ut|r}qkgirixx}ozsol{ga|yy{{o}r~u{}zqvtlspus|{v~mtpfejvgsyrp|cnxj{~sbsvlwv{~qhpeWkf]c}~urtvq|urqzokxrz}x~wlrkbfhp}swkr{z}v|xiwyfk~~}~{~}lrvytxubh{xzwm|utysktfcdm|yy|||tr}rknd_eyuzxtyuvxpxuder}wuz}|ujwqfjhdmzz~yzpmxwvypdq|q~ssvswwz{gbhkrxwwury|uvrimlnz}|xz|zipkf`g[aqwvyor}pu{om~qmt}{xutnojefgaeyu~yyuvidqukswnv}phljmpfn~x{{tukjhmy{oq}wrtsrfh]\`oys}vtt{vs~rkpwy}}|~un{xowsciqdZvz{~v~~qhl|kexxt~qyzmpifk]_c~~wy|ulrrpz|ujw~z~z}{t|umnbVX^p|}t{y||n||lruqv{t{~wtyur|pjyt``v}w|zwyrhdxzeivpyzx}rtshpjZXeysz~}uryxx{x|sjurr~yvyuooe__cosuqwztzpsroroky|yvmqpozq[evrqv~~wztlkucnwo|{z{ruujpaWWkscr~vuzwy|x|rmwnu{vy~}yx}rtqhgeckjr|{|{}s{~yvwlrtkl{zvxxlz~p{m`rrkev{~x|tm{}ijzoq~zo}}|w{otp`[`p`Zwx}~|}y~xmwqismrty|vxwmjjgifiqlxz}zw{opxojqv}zxlys|uaquocgol}}vnxlj|sr||hr}vttugfasbTdtp}}yw~q{sztei{w~~~mnudliagbgkx}~wxm~rcryzt~r}jzb{zmdaqhfn|{wv{zmzx~{vlqxlry}}u}wbalyZVhgdt}wvy~ztpnvxpswqz~z}osted_bq_[p|wxruysrxwxlxyy}ypw~fkej`fbfyuwkuvpxqczys{|oyv{xsoragrl`jwav|tu|vjneykdyx~{sssnvsqxjsXjworl~~{up~jrkiist~xw}|kopahkf_plwxxlqvqvwy}zk{wrh`{b_dafk}yy}mrztnqyi|{zuulskgbh\[luvolqp~q||mk|}~|}{rvqtcfg[hZpu{|t|twpppvus~}~tnlmtr|payoksesp}}w|j~nfjcd}yv||~uzsopnoff^brrpzt~u{ynrkvpsx}|zsxf{ra[bm_qtznn~sv}wiwqiyi}ozu~oqokbfjfcowy~ysm~}~cyzxt}r|}klt\a[`q\cg}~w{}wryqpwtjy}~ww~vpg{pphcpfgn|xzz~h~|efhvmy}|{~t{|suyphsjcjmekzt~zu|~rnuuhpz{}{ulncbmk_wuoah}{z~znwrjl^otvwpmtgffifhimq}t{}k{~wzly|{x}urvekc[paWYqyt~z~zzvwvvmw{w{xv~|wj~yqogldcemnu{{~uzpfh|qk|oy|{{xysrsqclocaoemst|xuvwmmous~w{p~lfiyknwsjYpxv{xzsx}ikgqlks~z~rtvpeikfekfhtvo{uq{on}rs}{}zp{qgg]slWUbqiw|~~yx}ooxwq{x~|~yoz|yhllbbjgbkv~w|xknvn|kvuqyjhf`hqfpon{zzjtvlhytu}pq}xqioq~{mbzoklrm|nkncyxs|xjqrlrz{{xywxuLfegbd|sx}~|u_qod\NN_wmefomkyt|ymy|{}ij}hpfzvzyyyvtrq}~mbnpko|edjqrxitkxko~umkd}y`lfZqytxw~t[S^l}|ntcYalTVSigcmjiu|u|}k|bgunx~ywx{}pw~v}{wk]g~op|ffankfpci|lkzcrzoquwcpyX`c[mz~~wve]YXjq{nhk^^QdgZkbkxrpvt|rtjlniyuq~t}swyyilkbw~|yki`tq_obhxoilxhr}{ru{fhcdgXgt|~{g^aUeo|xwtu`^T^qTd``tysryplvmvkj{}xsvq}yz|rgj\lu~ugca|eiifstnpyr^utybvm_fa^nx~}}yp[fYZdt}vxrb_TscUb`jrux|iqymptls}wnwv|txvyybkg^muqkcpy\igmsssu}lfzvy{sfzf`fcbqx~|~{|dYeV]eu~zld`\x]Xbepuvv~fn}motjxsps|{vttw~u]geeqzrlfu^acnrsxv{ihxx{{}pdukfiicty}}|yvfXdV`hy~sd_[vdT_cns{||frz}ppyotwm~ty{qt{|sv|x]dcbt}woincacjpszx{q^|y{zwtdqjfhrety|yy}xnrzoU`Y`mywme\luV]`lqw~rq{r}sqx|ryvt~pr|xpzks{iZhbr{tng|uZbhrsz}w|bq}y{{uuiipieqom~|z}upistWW^\pyxqfbf|dZajsw~i~{mwustt~t~rswvtrvzciwpYdcsyniw^^eqty~w}hk}}uxzurjemljrul|~po`mv]T]^s|{vicf}lY`jtwg}zmsuvtu~v}qu}zwtrtw]evoYcdt}ol{`aiqqyx~gm|~uwzspiekmivxpzof^ms[Y^ew}}zkfl~hXbntxzh~ywotwxwt~yzus|{~vlvq\ixhZcgxxmqz]cots}~zy`z{{t{|rofgkoi}oy}ywsx^csjT\_kw~vgjy{]\kss|}kx||ysquys{y}t}z{{yx}yiwbart]]dn|pq}k]lsry{{hh}}stwqlfiolvvkz{nzf`pt\W\coz~jjwk[jsqw~om}{{xqrwu{qww~y~|}w}~jwh^nwaZahqwsu_mvqv~zkd~wqzrpiinnsyg}v|~pwnamwdWZ`fvyrixv^ftps}ugv|}uqtxvo}s~wyu~~qor_gvlZ\ehx~rigxtr}ysaw|}pxttnhjplzkp{zy|oxdesp[W_amxzmtm_rtpyyjr{x|zrpwv~{p{yv{{v}y}jrh_mveZ^ei~}|ugozsuwmc{zl|tumgjoozfwxx}xptbfsmYV_`qx}mzndwsq|~vhwyz~}yqowvws~xv|||v}vzhqf_ltdY_fk~|wirzruwlezzk{tumgioq{hyzx~}|xmradpn[V`aq{}nytexurzujr{u|zqnuv{r{s|ysztxjmh]hsgZ]hjupp}su~yndyz{mtuuoggoq}nu}{}}wzipc^jqaW_el|trisyswyokp{|tnpw{ss{|wuxz~|zqrfl]`np`[hk|v~l{xtxrgjxvi~}ssjelqy{ow}x}xwoii[boj[[hh}ntm|tu}}riyvt}{womvy{}xt|{zr|y}{}msej`\iqg]fowzyqy{twuifuyhvstlfjqxpw|y~|~xqpgi[`mm_[jjo{o}vu{sjt}yozwplty~|zsy{p{w|y|kqeh`[hqi^hqw|{t{{twtigtxgwrtmfjrz~sw|w~z|tpnggZanl_]lkq{t~uw}~qjy}|up|zvomu{{xv{{wpwwyxwioeh]]kqg_lo}yvxvxogl~sve~{sskfls~yvw|tz{~nqjia[foh\dkpzyw|zuwvlmw~m|y{tmowystnw|szuymkjgc[combcon{~~vw~xjhzrykotuphgoy|s~y|v{y{}tnojf\amma^jfx}~vw~|nl|x}tr{|wols}xvzxrs~tzxvqjlie\`lnc_lg~xx||ljvuwrjwvsjfmw{sy|}yxy~}zwmoni^`knd\hcx||xxzplu~w|k{zrkozxz}vyyoz}vvzstkkli_]goh^ggq|{zxrjno|gzuwoghr{tt|~x{t}}yyxqmomc^enj^afex|ywxmotqu{}wnks{x}x~zqs{zsyvrqijme]`kne_jd{z{oksxsyfzwvmfivzsw}z~~s}zyvuokpk`_gni^edlw{zwvmqrnyz}wmluzz}wyotywrytoogjmb]almdbkd{z{~nluvsxfzwvmfjwztx}{}~rz|xw|ssohpl`^fnkaffmy{{wxmpq~qsz}xnkt{{}y}ppvuqvtkogfnd]`johcmf|{ypkq|n{fz}vxphiv}uz|~y}qvyxt{tnqgkoa^cmnefkh{y|pnxwv{j}{{rlp~{xxxkrsqpukkkbkk^^eoogmmsw|pbcozdof`wjjf]\mg[drTSRN^XOS_hheplyzuyt{}}~`Rsvhoq}ymrtu}vz~ebfxuioehpc`frwtw~||~~mwwhhgk{sfgqrrxg~{wrc\koUXjh]XJVUJLWbdaiht}{}|vdU[{xzxhjmnwzpzx~xt]`kxqvkkwkgmy}o|z}jhfixpccl}nnscxsolbaqzs\R`p{tmZe^RT\efcjevxz~{|svzlg^Ydqqprxxo|u|{un[clv~}s{jpzkjq{|wppqjq{odgr}ktnhyqpkcdw~qlUWbq{oeraY\ejhhkfzw{z}mzrke[Zk}sto}z{tsvvvc^elww{yh}uknv~~x~nw~{sqlzxielzulwgswqpgah~ur_SZcsiwq__ckkilduv}y~}z{sxypl`X]yvvpx~zwq~x}xxj]adnz|zk{}mnt|}vrtwwvmz{mflwymwlqyttkbbvyvgUWYfwrz~gdekmklcnv{|~{||z~}zv|tqgZWi}ytt{zr{~zyxs`a_eqwvtspsz~wyxqwr}}quuiks{qssnxwvrg`i|z~}ws]WV[i|twjikpooic|sxxx}{~w|zuobX[rw}{s~wt}{yvzj``_gtz~orsv}~s~~rurt~r}~rjnvzquqrxwwpeaoz{~xwmYWU\l~{wnmpsrrgi{tv|zv~{{~}wzwtnaX_tw~zs~~vv|{vvxfa__ivwotux}s||zpuov~sskpwzrtqsxwwpecry|}{stjXWU]m{zqoruuuik|tt|zy~u}{|{vvurmbZ`uy{txv|}usxh``_ivz~pwwyt}v{wnspss}vmpvztsrrvwwqhdq}|}~zpplYVV]mvtrsxxypiu~ux~zvw|y~{yusrpme^`|rkemzzyuywc`btte{oixruzzlppx{svop~vv|{zz~tfrt{xtdUbrXPfQ]rddgpw{{o{}}{{|yzbambocmmfef~|y|vyyd_ft}kv|fwy~~otzzzn~okketwpmry|xvxyzzwokv||{zgU\ltap[Vqeadjrwxlswuyzsyyrjelt~noqgedyx|vwz}mnqbbjr~t{k}uumj{zvpnfsvokpuyvqttsttqpy|uhl`Xcnsie|mhinuyykv~vquvr}~zzqnljirwyynij{~wzz{joobejr~sk}umoin}xvnkwvpmsw{vpwusutqq|~}{kfj[[do~}ft~olmsx|ukzwyouss}}z|ypoliitw}umhtz~zv}}qjtiaeiu}wtv~~mnkhuxyxkrxtopuy|qszsuusor{xelcW\cr~ylypnqw{zkv}u}oqtq{{z}}yspojei{~~}rkp}}}w|yyhsmabckzyr~rnnhqrq~|oqyvqptw~sp}uvwtnlwzhohYXYdyrvrrw||ls}uwrntqyyqwyrrlfbm|ypo|y{yjpsdb_bp~|s~{mojmrhywoxxtpsu}{l{{txvqkoyz}{pjp_XWYi}}wtv{uk~zr||lqrt|pu|w~ttqjcdqwwoy|}yyvhukba^dt~y{rklhqlhtuzxtsuwunwuxupkqv{{imk[XV[l|yvy~qp}xq~xkpowzmy}sqroicfrwxr|}zzqiuic`^fv}z|~njjisijtv{xtsuxrnvuxuplsv}{fjhZXW\m|y|rr~xq}yjnnvzmy}q|opmiehsxzs|{xufsiba_gu{{|xoegfqljwv{yw{~us}|yz\\aTTX`qxqlr|sbbbNNQXe\f}~zxusrnnljmzkh}pl_klU_aX[\cr|}~~rztaaaktnzlbp{okT`madhhhmuu~}{sy}wxt_id`ekwrhqqbWc[OUYhkeyvmt}m|ostvyyikhrlcmVQ]TUX\gu{y}{{}vuyv|idhp|{a^i{g^qd`dfgiqqyx}sztjo}|~~dlmgmr{oej{zhlgUVZhnes~rkuq}svy{}yh\gpxrydVaZY[]frywz{v{uw{u}ldhq~}p^bpxk}ohlllnsqy~v}qxsip}}}|clmhmqyxkfoqvn\]`ophw}qlwnrux{~}wsd^mr}yf^f\]^`hsxw}yxzuxxu{jdhu{}|m^esusplnnnpso}yxxpwqju}}|wepkjnqzvkissyk]`gtlj{{|lnx~q|sxz|xxoaepp{bgd]_^akuvxw}wtzu{wfgn~}x{f`iurppponqnqtqsvmozwllohklq|rjmy|{zeadqqfr}yrkqxrvwyz{yxjfokuoik``^^eotv~{{|vw~{z~lglz}rnbelxzwtsrookkszuqxpoytxtmrijiktzols{zpfgstemx~z~wlosyx|xyzy{yyz}skqkl}npeb_\`jps{~}|xvz|yvijvrvzgehozxwusplfvut~ovvpxwxwumigdemtv||yuysntts|~yigtw\X`lv}mz~v~iszqphu}|v`hj^_fiewvxqlr}s~}odeiq}vabdtmX\XYc]aqywzsrnebnyuy~sUXvuss\YkdWZ_gpyyxtpr~}x{~x{pe_k{qjbbbaefquonqxwuurqbh|~xzhysa]kdY_md_kkowot{xurv}}{ynpwzxdbhiloqznk~whffgjq|z}zxliaRm~mjc]^[\ahlrwv|{~tmr|{tksws]Tw|nz|ttvutlk}|op}vjtvtvglyzstuuzm_n|wkqqb_kujgrvz||{m~~i^`rt{nbXwuwojhbcbacimpwuyzzznjux}psuWO_ug}{mlnpojamynhryiflfjmq~{~~k]b{ukrh\`onbipsvwxiivh]ev|~piaX`g{{xmkdbb__dhjqqpuputlmy}xtfkgTUhsvpqrqmbfwpfkui]dcitv{}~}yonf`jw{tddqsfipsvwv}ibrkahwz}z|cZZXep~wrkffcbejlrrpuoruop|}{ys}|_dfX[my|tttsodgxqgjuj]cekvxz||{}}|uklfdoy}wghuugkrtwwv}gcsjbky||~x}w_YZ\jrysjggccfjmsppvnrups~{|xsu[eeX_q{}vvvunclynfmuf]dgpvy}y{zz|y|qjlffs{uhnyqhosuwwwyaitgdm{z{~xw}oZ[\blq{rjigdeikptmuuovtpuztx|g`k_Xbu|xxwshfvuihrr``gltr|xyywy|zzzmmkeiwqmxxjmstwxw{kctncfp~~}x{v|zc[_ahhuzoljgfhkounrzquxrqx}xu{~ramfXZfz{{zvketwkgpue`hmsmqxxxvwz}|zspphfmy{r{|nntuwxxzrdsrecht~|u|uz~l^bdhcgtnmighknupn{usyuqsy{}u~|z~eln^X]k~~}zrfozphlvo`fntpjz{vwvuvz}w|psnggowxxvmsuvxyx~~hkwlddkwuyvu|xc`eih`n~sqmjikmsulv|rwztruwz{xx}reqi\Z`o~ymhvwkhowi`jqullxvvttvy}yvwpsmhjqvz~spvwxyyyyfpvjdfmy}s||st|s``fkfas}sqnjjknutkx|rxytsvw|~zzw}mepf[[brylkywkiqvgaksukowvvttux}vutnqmilrx{sqvwyzyyyfoukfgoz|r{zqqxr^]elhcuurolklouukw}ruyutwy}|yw|nalg]]dt{ojxyminvj_hrwnoxuusstvz~up|ujnmjnu{~wqwxyzyx||ijumghp{~su|qmrs`Xajmgtwsqmllnswmp}tqwwvy}~{xwx~}z}t_cia`gu~ujq{rijsq``mwvp~~uttrrsuzxlqwihmmpy|~rtxxzzxx}qdorkjp{vp{rjjpfUYfpos{srollmqwqjxyntxx{{~{|{v|~~~|wwvb\hebivymn{vkhnse]ivzt|~ussqpqrvwkjujdkos|}ssxxyyxw{tdkrmmr|wnw~rhgmgUUdrtutrpmmmpvsiuzoqxy}{{}{{ty|||zuttc[ffekxzmmzvkgmsf\hw|u}~urrpooquuhhtjckpu~tuyyzzxwzselsnns}~umx|ofeleTVgtsw~trpnmnqwpiwynry{~z|||xsy{zzwssq`\gffnzxmq|tjhord^kz{u|srqpooqurektgdmqw}swzzzzwwzofoqmou{oo{wjdgl`S\mtp{{usqonpvwkn}vnvz{~y|}svzzzyvrsk]bgdgo}~snz{oiksn_ct|uv}xrqponosvjespdhorw}ww{{{{zxzwjkromow}smx{offliXWgrnoyvtqpquypk{}psyz{|{|~utzzzzwsspcafdchrwoy}rkkssdbq|uq~}}sqpoooswnesvhgnprux|y}}}}|yzyolrpllqz}tmv|qhflm^Vdqlix}yvtrru{tkxuqxzzyv~|wsy{zzyussibeebcjv}rwxnlpwmal{yov~urqoooqwsflyofkopqqzz}~~~{yzvnpqnkmt}zop|wlghnhX\mpgl~}zwutu{{np~ruzzyuv}}svzzzzwsspfcecbdlyys~smmtvhds}to{~tqponoswmerykfloppp|~{yztoppnlnv~~vms{sifineX`onfo}zwuuw|ylr}qu{zxtw|zrvzyyxurqnfcdcben{xv~smnuugev}sp}~~sqponotvjdrxjfmpqpq|~zyyuoopnmow}ulrzrhdgleW^oohq}zxvuw|ymq~rtz{zvx|zruyxxwtpomfbcddgo|yttmmsvjcr}uq||sponmmqukamwldkprss{~{xxvpnponpw~|vloyshcdigYZkrkp~zxvuu{|ol|tqx||yx~{}rqwwvvsollhbbdfip|}tzxolouociz{sy~xpnmllmrobcrrefotwx~{|~|xvvrnnpprw|xoisvkb`dh_Vbsrqzxvutw|tjszpt|~}{yuotvutsokihcadgkq|uv|qklrsfev~wx{|pmlkjkooc^msgdmuz||{~~|xuutompqsx|xphpulb_afaV_rus{xvutw{vjo}pr{|y|unrutsrnihgeachms}vu|qkkqshduxyz}plkjjjoob]kshcmv{}|{~|xuutomprty{wnhptja^af`Watus{xvuux|tir|ps||x}smrtsrqlhggeacinuux{pklrrggx~w{|zoljjikol__nrfdow{{{}~{wtuuomprtz~ztjjtqf_^bf]Xhuru{ywvw|{okyxpv~|{x{oottsrojgghd`dinvzvvnlotofn}zv{tmkjjjnpe\gtnchrxxy}~zvuwtmnqru||wniqukb_afdZ_pqoz~{yxx{~uktrs{~{wzrntutsqmhfjh`afjoyxzqnoutikzztzyollllori^esreentsr~|wuyxompqrxypjqwnd`afg]]loks~|{{}ymsvqy}zu{}}votvvusojgjlc^cfjq|{~upptwojv{tvsnmllnrnaaovkciqrotzvx|ulnpqtz|ulmwtibadhd\doklx~}}}so{rt{|vt{~qqvwvurmggmj__dgkt|{sprwwmnzxszuyqhosojs}rq|xw}zw}~v\\fb][\biebowtxxuuy~znn{|tz}xoecdffdaemjcflosy{wvqprxxsxzyob]`bZV`moffotsr|yu|xw~zw}x{qih`XVW]b`^gnlq{v}|}}tt}~kk}~slgc`]_gf^`fjnt|{|vux}{}rkw{qmi`Y^imebiopov}rq}|{{qp~|rg`^`ed`dllnv~{ryzw~}qfj|uojedikdafkotz~|yzww{~{{mhvyuoebjqmfipssu}vq{}{}|{|soo|{qhdcfifelppv}~uv}wz~xpij}ytojfimjdgmquz}{y}|yxz|~yoiszvqidhppiiotuv}|wsz~||~{yqno{}tlgfhkiglprv|}vv~yy~}vojl}zupkhinlghnruz~|yy|}zy{~~~~vnjt|xtlgjpqljptuv}~{wt{}}~|vpnp|~unjhilkimqrw|{vw~y{~ysnjn|wrmklpmhjosvz~zyx}~{{|~zslkw~ztmjmrqllquuw}|yvu}}~}|{snmq~wpmkmolkoqtx|}xuy}{~~|vqljq}xsnmpqljmqtw{~|yxx~~||~~|vojmz|uonrtplnrtuy~~}zwtv~|}~vpmlrxspoqpmnqruy}~zvu|}}~~xsnijvytqqspklpsux{~|yxvx~}~~xrkiq~|ustvsnnrstw{~}|{xusz~||xsollvyussspnpqtwz|~~}{vtw~~~zupkhn{{vtvtnmprtvy|~|zywuz~~ztniks~|wvwvroqssux||{{yvsu}|}zuqmjnx{xvvtqpqsvxz|}}{xuty~~{wsniiq}{xwwsnoqsuwz||zyxuv|~~~{vqlilu~~zzzwrqsttvy{{zzxusv}|~~|xsoljoy}yxwurqrtvxz{|{zwtty}~~|yuqlhir~}zzytpqstvxz{{yxwuv|~~~|xtojimu|{zwsrstuwyzzyxwtsw}|}~~}}|yuqnkjpz{zyvtstuwyz{{zxvtty}~~}~}zwsokhjs~~{zyurrtuvxz{zxwvuv|}}~~~}|yvrnjimv}|{yustuvwyzzyxvtsv~|}}}|{zxsoljjpz|{zxutuvxyz{{zxvtuy}}}}||{xuqnkijr|{{xtstvwxyzzxvuuv{}}}}}|zwtqmjimv}|{xuuvwwyzzywvutv}|{||{yxurnkjkpz~{zywuuvwyyzzyxvtuy~|||{zywspljikr~|{zwtuvwxyyyxvuuv{}|{{{zxuroljjnw}|{yvuvwwxyyxvuutw}|{{{zxvspmjjlq{}{{ywvwxyyyyxwutuy~|{{zxwurnkjjms||{xuuwwxxyxwuuuw{}{zzyxvspmkjkox}|{xvwxxxyywvutuw~|zzyxvtrokijlr|~||zwwwxyyyxwvutvz}{zyxwuspmjijmu~}|ywwxxxxxxvutuw|}{zyxwtroljikpy~}{xwxxxxyxvuttux~~{yyxwuspmjijms}~}{xxxyyyyxwuttvz}zzywvtqnkiijnv~|ywxxxxxxwuttuw}~{zyxwuspmkiikqz~|yxyxyyxwvuttuy|zyywvtqoliijmt~}{yyyyyyxwvuttv{~{zyxvuspmjihjox|zyyyyyxwvuttux~}{zyxvtroljhilr||zzzyyyxwvttsuz~{zyxvtrpmjihjnv~{zzzzyyxwutstw|}{zywvtqnlihhkqz}{zzzyyxwvtttuy~|zyxwuspmkihimt}|{{zzyxwvutssv{}{zywvtqolihhjow~|{{{zyxwvutstx}~|zyxvurpmkihhkr{}|{{zyyxvutssuz}{zyxvtqoljhhinu~}|{{zyxwvutstw|~|zyxvtrpmkihhjpx}|{{zyxwvtssux}~{zxwusqnljhghls|~}|{zzyxvutssvz}zyxwuspnkihhinv~}|{zyxwutsstw|~{zxwusqoljhghkqy~}|{zyxwutssuy~}{yxvurpmkihgimt|}|{zzxwvttstv{~|zxwutqoljhghjow}|{zyxwutsstx}~{yxvtrpnkihghlrz~}|{zyxvutstuy~}zxwusqoljhgginu}~}|{zxwvttstw{~|zxvuspnlihghkpw~|{{yxwutstux}}{xwusqomjhggimr{}|{zyxvutstvy}zxvtrpnlihghjnu~}|{zxwvtttuw{~|ywutromkigghlqx~}|zyxvutstux}}{xvtspnljhggims{~}|zywvutstvz~|zwusqomkigghkov}|{zxwutstux|}{yvusqoljhggilry}|{yxvutstvy~~|zxutromkigghjnt|~}|zywvttsuwz~|ywusqoljhgghkpw~|{zxwutstux|}{xvtrpnkihggimsz}|{ywvutstvy~~|zwusqoljhgghkou}}|zywvtttuw{}{xvtrpnkihggilqx~}{zxvutstvx}~|zwusqomjigggjns{~|{ywvutttwz~{yvtrpnljhgghkpv~}|zxwutstux{}zxusqomkigggilry}{zxvutttvy}~|ywusqnljhgggjnt|~|{ywvtttuw{}zxvtromkiggghkpw~|zxwutstux|}tnpkgswv{}|x{yvuvqupstsrz{|xnc\UT[[`\UPZ^k{}|yxytmhed\_\[_`_fnp{{wk`[Zjs|{ocnzocveRHIOQS_bjh]Wiv}|{xvotwuv~ww|{mcovm\XYejlrhZeypwwqmmmdhhruhsz|x|{{pijmltjdlqnusz|}~cb~pi[OKBU`QZeSUj~yrm}pwo^Zbdoweankkln}~~ywbuveTfe^|z{y|txvoizxvhg|}p~|{qelttmsw{}xs|{yggrt^Wb{wk|qtico`hd\UPst}xgkw{lrbyzjYXijivrWhjaimph|vos}go}kjqdqnxmavuxyzvuuovpnmot|||yp{ylz{}vvya[rhaae|mrmwgd_^W_pUcx{vd||wfoqdb`u{siye[q^knrcfoyy{woze|r|sni{z_j~t|rjkkfkzrp{x|{tt|x|yopsVa}udsgvsamrb^bXVxrYp~{iv}oguu^`alxok|Vmhctwu_xty|{|x}y{ogh{y~tjtg`||t|ijog}|qwjt}xrrz~ztl}XYuyaskuvahre^f]Vwz\k}km~rgqza]`f~ysjZhmat{~ctst}v{vynl`|vvmmi[qxlkrmswg}s}xqrz}uskyVWrw_rkzueksfcka[zv\n|hl|qgt}`__i|}vqYoghu}|e{nwzwxuyo{fcwy~ujm]Yt|lotr}wrh~s~{nw|y|~~ptpmU[wk`qmozhqsfmoaei^uxbrz{mhz^d_ryoz[u_tuqm}k{u{s}}wru_oq~xtewnT^w|~ylru|v{ht~p{}v{i~}xsqq{}[Wix]llzuwpnxokukcwu]j{hd|vqiwedchu~xu^sclv~}jjxyyyw}yowfg}ruzriktVUqwyv|stwylltv}viz~t~vnux}_Wbw]ejwvpzu|wlyoity`gwl^wsukuogihs}qhqggzu~j{mt}z~s|zrukfyxrzsmht\Rb{qs|~zxv~}uf~n~{ruysyv~ktw{hX[ri\io}k||oyyoqzkbo~}^ivr~rkhnhnstfx[zs|qr{i}xy{v}qrfq|quvojnhSTvoqo{y{xzzkpot|~|h~z~~tyuivwu^W_t^`iyvp}qyuxzihry\oquyqp~joinusups]q|nytm}yx}xyrohv{pttolodSUzmlqy|y{jt~}mwx|hx}}wxshvwo[Wbs^bj|vv~rzy|{mks{\optzsqnrlnutwru]qzoyvl}y|}}wzrpgtzqotnloeURsmkqvz}}|oo}~qr|x{iwyu~tervkZT]rb`j||vuz{rmqbgrl}uoptnmoxl\{ywsukzzxsqqgr|vkroloj[Rdullw|xz{iw~lyt~{tr~{}u{~~whfvp`UUhn^huww|zrrwx^qjyxtx|trmkx{n}nesypqr|zzwzuqkjxymmrlon`VV{nlz}||~nt|ynt}r}kx}~|n~yy}{vkaqr`TScrbhr|u{vsu_nmszwutunks|tyx`wzsvo{y}ywwqmhvxohrloocYSrqmzxz}rqz{pszr{lz{||}k{wvywsj`ps]SScrcjt|w{yvv`omu{ywvvpku~q~tcvwrtqzz~}yztqijyynhskrn`YUwqk~~{~yotzwos{o}ou}x||zl{tvuuphbtoWSShmcl|z}{|vzybsk~}yzzupi}nfquuwovx~|w|rqeqzwhkrluf^U^~xnpr~}v|}kzuyptwrssuz}lsurusrldhy_QPZqeio{{~||tfmpq~yxytjrryb{vtuqxz}{}tthkyxpdulum^ZUszqju|wzny}}uqs}|n~{xr~uw{qpvrvrslidzfOPTmeflz}utnlsp|{{xnnw|a~vtzpwz{~|vvkfxxvbsprq\\Qiyuiyznx~sqw}}tqxoxsvwxtw}|ltpwrtlldpxTROcjbiwox}zwitn|}zvh{tmk~t{ptx~}~|{utcpwxjfxlxc\UYrwqmizx}lz{v|rryp}xz~t|usy~qopqwrthlbylPRRidekyvpw~|mto}{sizhr}vpuy}~xvrbrtvekxnx^[R]rwqs~g{y}~n|ywzssur~u{{t|}tqx}mnmquprgla{jQRTjdgmvznw~puq~|tk|kqwpty~|~xvraprufhynx_\TZpxuth{z|nyy}x|tr~wq|wy{ux}~vouznkkmunrematsSTShghn|vq{{rvq|xi{zrkyrsv~zx~{twdjsrm`ynxiZXVlv{so||~}ss{x}{~vqx}ov~u{wuy{qpv~xgkhrnpifid}`US^lgoxrvw{usu}|pn}ju|{rszxztvnapnq_nvqw]\Tcs}z~~n}}}oyvwyss~rr~szxtzy~smtyz}giemplmbl_ymVWZmiouysxvut~~tkoq}rsx~|{xutrammpbhyoza\V_q}~~m~~{pwv}xztr}sq|syytxz}ulsx~u|ghdkpklal`wqXX[ljqwytyyvusmoq~}sry~}xx~tvoankp_lxqy^[Ucr~o|~pwu~x}yst}qstxwszw~}}rkrxxsvegbmmlibla{jYW_lkt|sux{uzos|nxwsr|~}q}{sxgemkl]wswq[YXiuq}v|iiikwtqtuozyrzx|xzvzp^]ffs}mkilxqvfmfhuWOL[[agvomp}|wtxmqvzrvu}{jrmq`iwou]XUdr{h_utrjmnyx}~x~v|{~z|zxdYek^jeWTVUfbh_bf_u`TR_djq|yq}z{meq~yk{wotqv~v{|vrw}taNzu_kv~z{v}vvpj|uhjjr{wz|wvu~tw|yytxxy|{|}rgY`fvwih^knnndqfvt_[aloyuzyi\cxietwjra\Z{uouuvfdamowvlwxt{lgnmqbw}yv`WU^fvtp\l|~~|xynfUSZmwmaVb[^SSYPbTGDPT]emg`ne{sxmgrvzu{}{|l_]`grmeRp|zv~}z{qpwrncovfdahovmmsmxsryr|mwrsvqumk\_cyvvshfsouiosm|pcbmq|~}spc`mtxwxsc^atttvpecamnqxj{~uuzhilmndz|ys_UV]hyxp]v}~~{{{ppgcUU\pzrf[e`bXW_Ub\NISXckphbsc~xnzqju{~{zu{zo]VY^nqn\is{|{ykuyrgfxmebdktsrspprxpv~rxsmuqusnnmie]fmt}srdlrsujwru~pfktz|~lnvoel|t}t}ne^iuxuxlgcemsn|ym~|swxgkjokh{yp^SX^n}}rh|}|zxqmee^`V_htqb]fbeY_b[f`RQ[_msvfloh~}ol{rrz{y{~vxcRRUbtwpfzt{|}uj|zpdoykhainzo~mrnwstzznyirmw}poikgjbgmy}tukhsrxot|t}|nlvz{iezwtlp{yuhee|{wyojfemqqv{n}}rwyhkjnlh}~wraTX]nvl|}}{s|s~{mha`]aZclywhemgy|wkklqokXgua_|z|~}owy|}tqzyys{siqi]baidm{wgckqqr|kx}lk}w{z|}}utx{xuzx|xqqtwsmevynrpcicfkxvxmdos}xo}zz|~ms~tppjhgenqvqzrz{ptxijjpqntflqswwqor|u}wrzysuv}x~u|~q~yb]XY_i~d`]dmnaXnoZ^~x}sqr}~v~w}~uw{t|x|ztz|z}wvv{~{w}ndcnt}}sj]bcpdjv^__ieknrfeq]hlt~ytrqrxqrqvtmmvnfiZW]bjku{xz}p{nyqquoi~t{{vjihnuddjhlibmg]__fcgw~qsg_gmtyrz{udfm{}xw|{wyyw~~~oleRSS\agxzj`sn\Z{uw~lkjvy~zxzq~uvy}sux}rys}y|}z~zy|~~n_^epu~zjiirpdxi^_ggioph_pb_lny|wqqmwtsry|qqnopejcW[^hjn{|}wwsv~~qpprgr~qzppnwuefnkmgeqe`^ageiz}otfdirqp|xncdly~yz}|xyyw}wvhgaQRT`fm{qhysc[{xu}lkisv|x~w{qvqu{rtvzqww||}~}z}|{{o[Z]nvvlopyiqwc_dkippn_in[gor{|sqmpxststnqlmhch[Y\eosytpvrvqilmnj|yqqqzqcismleiqfd_fhhn}pvhklzs}mvzdabp|y}xz~|{{wwskg[_WOT[ks|np}tbbwyylljuw}vxxrqmsvosuxq||z{zwt}zs^VXevrqqxxjyrbbklotpfare^mpt}yrokvutsyylnphh_ebZ^cqv|{~xusinngklnk~vuu}vggwqlgitjgafjjmpwlmmys}l{s~}wd`ao{{xtm||{x|zokbha[_hx~vuzqagz~ukfcihj]jhatl]]qxxw{{gckheggdczwo|zymnzz~uwqcQOQcm|}zwrvtjswx~ypbom[comu|rpkt{{}~wytnptikn~wyrbTp~wwuow{||zwfhmfighctx~~~of{{plmzrogknon|pwrrr~}xvsspq|pwq`bmnxxrenyhiz|~z|t|mhelb`_ju|iqwxyxkicglqqk|x{~pyzqryskhtojceklmwtvvst{xpqqrro^WT\irxstmwv~~xjl{meuz}{~zwuu~}{ogb_findnws~nm|~|l`kjklgabxtjs}~~{unx}uqkssvvw{}}zwuzwkx~uwxx~wk_on^ausvzvmu{}}|{m~xhcfmb`]ipvwyx|pngkotsl}~s|{t|~vzqo{wp{wqifmlnowourrtv}riztnopbYUXdktmv}{~sz|}pj{ugm|y{rzywsymjaeflgcstv}ugrz}~}}yvdbljpkf^mymhv}z}vs}zrqwwy{zytt~z|~v}qlzy||xjaqm^`uqswsjrwzyy~|wj}ve`eldc`lryxv|tsknputn}w~}w|oszm~ysq}zq{{ungmlpm}msstrwyzsequmjmf[XVcjtqq|{{|yzju{peXX`ejfprqbn|hbetpqpwq|zql|tttx}{zxnkhV_fkpkgf|tr}nnfkhqw||{}~zxut~~sojow}wzzzrw~ypxy}z}vpyjfptono}lwkjqkeihcd_delgdrxw{uiu|nmvw}vpj{ysyx~txy||yzwty}{zsxzzzpgnp^fkruma\nh]_vqszulux|z|}xn|jdmslhclnttr|||xztywvh_Ypnfd]_^fef[ord^fl|rnrw~z~tg_hg^[_X[_l}~|z|}wxwutgwi]d~inttowvn_gsni^n}qlcetzyqrik|v~zw{wqpzq|{~x~v{w}~xfamkop~}ng^dgnidlqosvktx|xty|}xujlo{qet}p}|thhou}wz{vrsnogYTFL\m~nmcU^ajf_Vdrg]cqet}tpurvu}{zmqva^nw~v|ou|{uttzxfh|t}xnoiiaa\\TTg[LK\``[`jnqo~wjs}synclwpcd]bdiq{}xuUGRZfpyyngkhaWabZTOT_]V[VWTV_gmfit{t{yx|~}{mjq`afvz~r_\hndilt|{og[`ahefefklg^g\\ckph_^ttibrsj||qroomorprj|lsrlkspli~s|rtsk\Z]`cbeae]dqdTYijjcjqutsugn~{}}}ux~poippv~}x{{~o{tYIT^fio~tzxqvsnenrid^]ek^`\[YTZ`g`al|x{v{ssz{{uy|rzyj`am`SQOX[gr~zoqtvwsuqtstfeg\_blha[m~yru|}~}~~xsoet}~uqvznqrx}vdnf\[cnnmp}xhgfhiff`d^eri[cuz{szw~wqrrroxx~z}{vpdps^MYgrwz|~wyuqir{urmmq}qmkhhbhlvrpw{zzy||yz|vzzppy{s}}~}pc\em]ZY`hmw~~}|w~qxuoqx}tjg|wnxvvw}fbqx}x{~}xuuuqtopu}{{l_kd^_mwwu}vwtxwxurvoy~p`jvywr{{~uh__ne[Z]jnz~|}{s|~}|wxolb\jkYShy}wyrnks{nnjljhmsysu~z~~|zwwwunctxwzy~suv{}~{|ouyy{rg`atrijmy|yx~vuxzpgu~ujjwlisyolnmrt|{{xrgu~z~}zv{yuxtsw}z~xiusoo}yzx}|}zw{u{r_gqsngnormryujxznfewnecfmntu}ww}|ywrz~vvlkvs_`r~wmicnl_[WZSW\hklu~|jgtokmyzwqwx|yz{}um||of^juheeqv~~}yyodmkikxxrjuwq|ty~vvqrosnnmfnuiXeq|}~~}{w}}}xgsupmz|sqlpnqmntt|xhr{yu{|~y~|nyxp{}vle^aukc^eilqu|w{{~}{wwopvoZbnz~}~zurvlefd_adkeho|knu~yfnvrjrwsnp{sy}wlc[mk^WY_aimxx}xuywoqvmb^oslbgtoks}uvrrqqsnrnmqtb[gpxv}||z~xz{~{h^gia^ijjj~vyxwvwh\gnskmqvwu{~zm|vr|ukg]btkc^finsz~z{xwqrlijediiW]ky~vpmetqg`ab]_aiehnojr~on{vw~zwu~wzww}vmj_jxnd`ijpt}~qv{vpwri_iuphcosnkxyvwsvuyvx{xv{yfktz|tuuopqxsuzzu~niswllsqop~}~w|}|xykajqumpsxww}s}|}tpdi{tidlmqtz~|}wmt|vyztqrmiilZZerxz|urgswlcbfacdnlnu}rvwmw{u|zxt}}}~owv~~ujcZSfi`X^eiqv}|w~zy~vmiz~xop{{tt}}zwwvxrxwuryrenx||z{yy|{{u~}|xwq_ansintsry~rmu}~w{}~wx|xok^jxqfdllqrxvv}}y}tyt~zt~~zxqplmfhifbgi[am{~~yq~silkghkqmqwvnw~liu}rrvsprx}~u}y{pqzska^QXjg^\gksx~{yphs}yqlvyvnx{ywrroqkmoniloafp~|vzpsrnoqvrw}vlu~}yxutq`_nxosxxxsnu|}vz{{~~s~xou|voif[gwtjjsu{|}tn||sqy{unxwvrmlijejlkellcjvts{ogkgediihnw|jeu}pt{}{w}tv|}|zuq|zsjf]Wiph`hlrx~}zzvmdivsmfmsulpzz}xywzvv{|vryols~}s}{nppllnsou{{mt{zxicp}srtsrzz|pkpxxswy}{}zwqk_jvrdeikpswu|~xpr|sw|wr{{|usppljopkckfbht|~~{ou}xkjlijlrot{ostkszttpnq~w{}w{~|sx~wpheVZil_[bdkoww}{to||srw|zovz}yutstouxxlmpijqzz|y{ruqqotstzvjy~}xzrdbrxmlihhw|{{z~~{yvzqof]itn`cdhkorqz}yquzquy~unuxyrplmihmoj]db^alru}|}toplkjolqvmi|wll~trmkm}~xyzz{~zqpzundbWP]haV\^ejrvzzsls|ztmqu|qmtxzttqsoqwzshomkmw{}x{tpqmmlpnrwjew~|{xvsvkabuwpollqyx{|}}~{~wwzqpg_jvreghlotvv{tmq|ztlnqxpglpsmlhjggorobhjiku|{zwookkinlovrfv}rn}|xrqp~|z}~xvw|z{|}z~|xw}upz{umieX]kpdbfipt{zvpmy|yposy|oqv}zvutuqx|}qlrppt~~{rw~zmlk}~~xpu~uvruypswylp~scj}wpkiilp}{]luppvy{~{hstlzrsf[hl[]jiaciknmosnvlnx{y||yvazte`{w~z|}mc`xpvivmcjyxnu|j||hpnx{miixsx~wo]ogaixrdspupqsim{}vptqyiwsqxwnits~~xwv~srxsx|zztu}}s|qTL\c}nssdXWQ^slewwqzppjrkvuu|eb{pqpmoxyuslsrhywt|~su]]}z|}u~v}t]frs|agl_\cVORRQ]c\pnTY\[kwvx|yw}~xpgpu{cfnckklp|x}y~~}qZKYayxynqx_Y`YWaRRYYdhc_sj_jg_jov~kdmiuy}rvrq{vn{zl{ux}xkmeO[b^siQcfhhkpqlbuufjuforgkopfpb_tthomixnfhqjtyn~okqluwxogdhdtz~~xxqi^biXV]P\jimjXMbhfzqsru}vvz|ehqjgpeni`mmgv}~~dZTM_vyuhj[fsfPQVF[l]UYXeia_intuj}vt|{||{llvlskv||{pq|m{wmpedXYZ\_cuihsagzs]d^fsojmzlnd^wruyhhquhslhnecmpv{z{lc_q}w}~|soyh^ebitib\Vfg\UmstpZOmtvzvstx|r{|tt~qrf}}thvpdhi`jbgzwv{ytt}uo\Mbehjznqv_eqecic]`e\`^_ia\nu|xmtkuv}y~o}|senf]ttso\\[HMb]Tdj|mvlqvdleqsifjahprzhlbhwmhonrlbtrghvqiwpW\cq~xta_Yelf`vpyo`b^dcbgsejY`nmwn{uo{wt{ukn^jhb\^pkbbvswxk|z~orfx~xkpk[e_eqimoyjfh\a\cka[X^a]djnl}|ijkvw|}s}xtrkoyror|nr|y~hn\[a`d_dnswyolojhxlrhotgb_rs|enaelakezuimsansz|kYf|zv~}z}x~|}d]cxk]humyytxy_Z\ek]hknkeViulo~twztyqzpii|rpzrm]ppmspy|z~puwlfofbdQV`p|ysh^va`aca^fdilSnpvoao|}xneyiux~tyrw}}qwv}{r}t|wrcR]VUVP`ky|yz~msquqnzt{ehtptvqdjocusdjblnmrftmxnhpkx}|}|vdnk`e_dnmztztgtekjhrsuyiihixv~}xyp|tunonm|}w{dckgk^gthqyqzpzrkhZlr]^VOZezt{mw~somigjnn]piedbqkhusv~cbhvx~~~ryv}ulxxv{s{xx|{vwpigSQQVY[ajl~|y~|}|}x}l}{onhu{pqlhobhgchnnmkqjj~yf^ikr~u}~y|~~}t|ic\elahvqxnzsrlop|}uyaglu{szpvmqtppu|pp{}ql{slhcljbkdxwyy{ptkribnmh[XWdk|zprwz{sq_pqko`cnfghp}rvnhgt|x~{pttmt^o|zw|zxtxlzk`X\aYWc`i[b}wyyvfmijxpgzk_^ctljztsjdx{sms`hk}|wzrutq|wwvpvjmllefk]jy}q~w|vtrtuq~z|wwxvx|~{ypuoy}ofkf]d[[ubacuw}tsre{tc[^ssdig\`Ww}iowxhfsfadZk{mooyxfnt|uvyovoyhkn{yy|{|uwxzss{qq`gXZX^\R_goi~{vtfkxptmslorkmmvdeoxjm|xolZZuhkkz}~||vturtnn{vjrurmUmrkoz}}tjqnt|ptlm|v|jj{~~plqZafo_bfjrp||t~ltynckiwbfinp_cEYmw|y{|{sk{{qf^rqyyo}~yc]lrzmzsoesjZfrmwv}x~}hWfuyakrhlJMpmswcts~pe{spbookq|ryj\ztolvbzxewtljd|z|x~u~ky|v|uwowzoovvmxa`kodcwh{w|ghyzxxz~xj}zgk{{o`\hk[c[cvnkx~|{hmywgsbhr^Zgmkhc\^f\f~{op~mfnwnhaexqlxnq{{{~}zso~ohxvhsuvxy{qo~~zvuqekrapiVSRNZWYkrfs}vnujzznlpmluv[jp_\gat{nglkn}}z|tqvu|f^pvntnqsohnriwsbqygy{{en~{r{v}vfdq|}qso_gsbloiv|s}{~{}iqqgfjlln`fmb`qia\Q_kpkzxqwuqvyenyer}uqvuvx}t}z{}im~~ilwgryq{{}xjhlmye\ifSNWGUlh_oo~xkvrou}iysrshrj`qsheuiivo\gm|~v{k~}zxv~~tppkj|slv`[vrW`_`hd]jsp~yygk\^md\`oiagzvpoi}~v~v~umeqaXpv]WQWpphbie_`Zovp}upuo{~zvzfr{otqoyt|nnw{t{|}{}{|~~turjsthdw}toTLai\cY[^nkp~rl}t}zih^n{phpys|n]qwlbosp}ruj|kj~zjqq{ws{w~hr}{xn`hragbdf`eql{}~|us|v~wr|ihfgnh\ghjqn|wsl|md{pxoeYifXcfnhSOSWkhqrunv~rz{s{pkyzy~xrwu|ykyotnz}zyp|~}tx~~zurhblnikd\cN^XYZXgeaitu~vkumtujflfvisw|nolfj~yo~ov~~yttw~}}jguodIDKO]UPsws{x{zvwxhorsw^O^afVWTKf{hargqyjvruloj]`MW^UKZcqpQYvskm~yszp|}y~w}sjclpu\Oqsgqky~or}rqrozv{{yu|yuyv{kqmxkdV[h^ZdfUZgZi|gaoxo}yudw~rw_~~v|}{~qdm[\qlpmvmanXCPJ:VfGPiQPlxqu`[xyxpjvmsztpghoiolvg~~dfxzzrz|}pm}q`rub_Zi~|z}sx{ruiWt~qsyoƫn_at^Ztls}mx|bld_g]QKSk]ZYWSPm`[ttuiY[{whpmhlsa\tkupcs~_^kildvUgfelkjuqZvvkpwsnplnuz~{mzqzjL[g\Qdobwjp}zkoejnb]XaW\bmRkmObxrw~xf_xi{|esltorvrrjq~{svysju|~qwu}shvxooticjdotpvx|}u|y|zzvysnvz~vĴvtkUongbjv}lyx}sy|c`dgZGhXTXOHbkbskdzcAbtgxrdggqcgetf]qsdf\sjh_ebpq{ol}h_itpuuqbsbwqp{w~{~igmZWWe\Xg_m]vorjnndQlbN^vR]c^olo}y}]`~{y}mcxs~suttfwpntstz}wq|ooqxz}cf}kUenfu~{uzv|rv~tz~|j|~|~}{triws`fmlbbhwsnzkUgs_RypWWLX_`anygcrbSezlwde[jonucfzhPdomheft^fvictmknesrlu|jbhagts||~~uxaXia]Z_M\YUof~ynvucXumabxv]OVhxmqy|o~mb|}stsul}q{uma{y~uqrex|p~{g|xu~_Zw{e`lus~}vvtmyvpwsr~us~Ź|mgvjngYejVdx}qxjryji~b\MRfqi\f~g\i]]lmroZhmofuahncgljenrjkZsysejyqeWmxphrjgYrffssyssjf|gebakZUL\UWrqywuw}cmtqmtngeaj|mr{nyql~wbmukyr}mtuvuo|{{}u{x~ct}rbwjPbyj_dqt}{zsoqut{}ct}}myur~mlhuu[UjoqzxskqrcpZh[[x~lWhzquiessykx`^evoemql`\`jbmy^ycnyjv{ghottgvxakc`Ywzlpk|q|y{yi{wiQdZ\SYfVYK`kqzvyvv{jqfiz`bganvnrv}q}xzu~svu|kou{pz}tl{{n~xqnvrXfcbw{vtfr~{}l}touw~lzuttejkfi^fugTcp|xlllh]d]iqns]bnqo]ipwxjwpiltfcktshk{crjfu]spswoprf`pefu|fc`Xkx}wmutzzrqxpch]m_deQaZYPZhswu{}lcy~ttyxzqrupjyxyvptq}vls|xur{oyxl{kvusx`US_rtusfw}{lyx~vwlgzq}}}uyvenpwjtq_ckhmy{wpqktulpu|ljjlyy]kq}pplmemurmYdpg\rmcwXuxr{rdiuuvuttqp^`T[kxn{ywyx}yzko{|YXS^[ZeMaWT`dizv~yuy}jn~op|y{lv{gxsszum~{spx|ho~u}gw|ztklchdlyolfs|r|t}omywy}zyz|~}wx{vdegrafki_[\chxy}svpsnitpc_lwtlbnn}unojlqqywapbloZtkstuw]]lkkotoseYhdguent|s{}}yzwz}s}w}zruufj^s`X\O_TQS]`k}{wtszztz~zoo~ssxrmxqnq{iqywxk~l`V]Xewok]tyxw}x}egmpy|w{{{||y}~{~|wyyzv{vtmq]]cnrnpxlurti||t}|blpvz}oppvw^egirienZvqw~oryrow}|miqmo]W\\fywecryu|~z~xpxtpzxwkdrof`XYVtXXXIbicerjjrwpmst}zsvptqvx||seuqtw||~emwswilkc|{npcl}}zu}~w{}rz|v{wsj}r}u|}yqvwuodi^jsiaT^iff}rzusu{t{qvizxo^wsldyzvz{yuwajgbmdvoxyohdem{zcmldxmgooovxvz~{tz}}|pvt{}ujm~iWbrruig`RlTVXN]a_`lursv~~}ujk~~~n{osy{}wqntwy|mofgjZgoe~{jw|{}}yu~{uokmomsvvw~vnyx{yzxrgq|mhpl{wpwdebbimxxm~u~~ww{p~w~lbq}{|r`qmkpyss\hr}x}jqw|zuvowm^rhdk^`er{oou{}zz|}x|{|jqusyz|vk_erpqjaZ^be[]kLc]K^dmvvici}zxzxzzsyy{tglo{|{u~}omgx|y}fbleynoq{wzuw~}q~kuszruqr}qev|n{zux}bclkooddifp\X^cpwl~q~}}|rw}nt|x|wlyr~}vr}ruk`djsj~}spmtokytlw]a~u|yk_^qz|wz|rtfdn{unytozunxi]X^nuujTeQUfPSU_hlmmekxt}}vuux}~}vwz}{urzyi\omni^kdszzyxov{w{mzfupw}zyvmeky|}uwqmohysvX_u~jaZ^qlnopp{lkxs{rzrmv{iphwrs}mruvxyfupxwjunlr]eogrkjh`kwvtq{{oyx~swymmyvgkcctwoXMUahvfQeJUhbejnf__hqx}zw}xtpvq|qontwxr|nyi\hjswrrw~zwvpeoqsyuvxqhlpswhfj{rx`kudfRCLdx~og^Lbfdsx~iv~zrpun}gruhr|}s}{xxffiurgrrywwqr|qyzy~wwxripqvqyytmdemvxcf}jSL_zkEG4EGIT^nui`fm}}y~qx{vwotz}zpqy|~|xrrrlz}hprZkzrlXXZbtt[fc\pl{wwpssquz|totwswoa^co|q`]hogzcTlWPUUbz{oirhvzohqyr|usvxuib\c}pmcRckfbaWXVTjgioiklY]ha_U`phujVU\jzvk||v}zyrowz}vljVWLA??MrqtnyoeVNSXY\aejcsvnuw~yyzp}qu~z}}qzzpqxerkdyrjlmVY][[Peeesof_\\jyl]mm`tvlnjhmniknup[iUJ^ZTNSeztjncu~mwt||pgotvsiovrmdc`][_ddNR`VhvgdhRXjmmhqe^kdgkry{smqrqjzuo{~h[E@LRVTXgydopffd^WVSYjvak|ev}w~w{srdm|xo}}}l`qfjrp~yysiqZRalldp_WcipohdcojWitbgfacjush`_cytVdSEXcdcgkry}ws~~qx{y|lYcjnrv{svz{|uaVW`d^nh[ipbbbZ\^b_hziec\^k|x}jl~qhptx{y{xqv|jhX=BGJS^\qlcbhone_atj\zsku||y{v|p{}usv~{iwz}{mYob]is|osg_\dc^sk_`cedlj^jfPfyozt`X]kvxoietlW`TSVVWW_qyvup}|ou}xptg`^eyz~~xqh^d^[wp]hp^\dhopfUakdurhcj~ytxrs{tv}quqmlkw}|oZ^TNVRKITThumppswjbxfZzyz{rqvxyzyv~y~szybo}qeafmZXfghZmzp~wrqq|q}s|{uoruqqv|}m{kthw{ybpjfsuqhgnegpeitkuvmg^aihhoffp_bgwjNLuhJW`i~x}|~~y|}~sdoyv~szwo{vmktz}yt}ru~r}}hYpicRbrquwtqqoums~hmqjosvt|o|}cemornkmr~sch\^mqZPbfu|ycrwu||xjfanm[idenf`n`S`mshom\ckrungfsq_f|risoor{zutxt{ciwzy|{~zu]LQSTW^j~~`riT[afibTRXdeewni|}syyuvy}|{}z|tgorvz~}^W_dp}~vfabikcZYfhOZn][bjmjid`__^y}bns\Yjx|ocelaeiUT]iaZm{}{|x{~uXjfapwlpnaed]Z_d[lq`^bfgmn`enY[ytwpdeo{yvooqgmov{{z{xb\dTOSPT[jbsvg^^fihgb_f`fwfwpnw|zn}|~z{{tuuuy|}hgcZchmvpfghjndXjbIajclne]ZZbif]cyodlkfciuxtsolcZda`Z_o`ax{{n~wuxW[nsuztlxj_dfioiS\eZemkfcjf_ggfsmo|wunoy~vsifgt~xuz}qwzfTXKKXbaaohv~vtrjb_]cno_fzsho|{snu|~~|{{~|ytobmz||xceXWkwmq}xxvqkgkc\h]^g]bjonc[^chnehsidehksxriddmsa`^Ya[ajko{xy}}gyaPapw~tw|ujejoqefj^ajvq]cj]]dj~xjnjglx~xzyuqxn`kuz|}~~lowgcaFAIPXbkz}z{}uhehowlhsqghvyyxsnnkt|{|~sfpv~z|}zzykllVUbmddzxo~{v~z}vspe^cc_Y`eXU\fqumfhpqor\\i]^flz~yyvqt|ztviX`UPPSY\hz}kuaGWVn|rrwrmxzsks~~ytxzsymleb^_lz}}}x|rlqd]\]aevlZ_~iWIKPOYabdgfhmg^`suu|kovmr}vhjndefejojqx{ws||phstxqafx_Q^TMQNLLMT^UJWc\TdkifbfmnnrrshltZYilgdm{~zuyztzvpkkrkon`_RKVJEbZ{kqUIz_SNJcQZx|]TpmjTdz}dvmba{vme~zqxwmzqCKR8rY~n}gy}smvt_XgTR-KslX\qib]vke\vl^`ZN6djUonX~UTQsm_c~nme^Ybblwyitlp`xjWn{ǛʱwkvYD6M=MwmtXQQvg]vnVOj]`EEh]qv|wewvmtinyr{d`_5PfQnybzv~}{ưzshjoawf;$hаjwhaPql]U^fNXV\;DVARqcaXT{ogfrvecPT=Zwxgzvpkq}wrykcXW]AVtΰofUHcjRi{rk<[t^ggN]ZMmz{ww|uqh|f}cT`A8e@9Kp͸z~{wvz}u|xuw_2Ykjr}ms]_hX[_}a\_dRRhQSi[vyoevhmdg~~imwRWR]KXcnytzuoe_`yencTU7IYiaobVxgrv|VlsqoU`aM_mi~}pzdoi~iftqcvlnMBnN?Bdȟquzwu{lozxvuxX+PUJ[kp|w|rspaft{X\a@CUCd`^^{fsYv~ezjqqqP[Vdn{}swkudhwhjxk¬trm]eW6@IGBwϼrxn\_i\fZQ]=I?Nhaiwsxzu|s{|~erhLHNS[sw~vxz~yudi}MAN9FSdӝsitlWm[[LQu^FSMJI||cztk{pdfuMPRB@;p|~{sqr|sxlbqRLTPMjwhcQ|qFQi]YQVqaZXzyz}xqo~_}]\HTq9/IQH{zizr[ib{{hm^Q]IFMPjpgzongss[pi``[Xasq~xczfc`X]M^pYsoFg_gf||}~f{Z{VUupjl_RcX1K3GQgx{yxrihp^bgSR]^sw~hxToRVtisnvsq^q`][\byp}mpf^qrk|llgHU-S9&QW{̸|}sreh^ZobC^DYQfc^u~oi{rvzsigiV\`T`nwscixzy~zoyfiQBR\DahR8fe~þ~~nvcfhLX8`N08a^tv~{t{sucdXNb^CfWow{~z~~nabvuf`rZWAWSTet°vph`X|SARgNj{lJou}{z|yuxjnh^hBL0PU5Btˬ~zl~j~uy}mme`PEMKNhq|Ȼ|hYqzezYymhZ`ncr|{}}lwkrvX`Kpb;;\JMry`oxomb]\h_ĵvmqg`eSHK=Df`osoz~nphYZa_p{{rw^cVkLUx`iVXl\^Su~wunhlfQh|a{qqZVeJ@M-3/[yhvշrosknq___Qg|kmqexU\kpnltr^oi\cYS`sunrs]snj}yuperLE3GQ)DOIĵywu_iqS^\DKM}|`kzzwsou{o__aYa_Xfhlluvz~~z|gcVqsI@^Q?_fJ:bft{õxl|mSNKmV8JmZpyzosvqzrfjWNaRKdSYc~v{x{|~voacmeaSm]TBQWQenużmdmiPftSf~rRk}{~|z|hkz_afD<4SY;Duz~í{i{yi{ptw|s|qduh``OBEINciyzqp}fyo_gsivfmXRLeXEAW`?GprzTsǶyz}iqoxhdztx¢|qxul\~fI:I?OV`ojpnkn[XYQwv]uvixqpncnUiueWXSMDhtn{yi}Vy{spxfhXhZI[7(<*3rZatٿŽɯ|~m`q`Udvtgi~ds]vq[nM[VxfVwepUM~wvhotXzlwnTxhpQQGGOfsjbv}yztu}ypspzzcWZcSVk[LTQg~{õzrppsrfhblipsXPUMrc;(2QB0Gab_N´{rsvuZl~piri~pqsmajyoW[nSZ]kb|qeW]w`XqzuwıyycIPP[njVc`i~ls\rttfzbkwylvp~|dq]eqlvnnu|aZty|~fcZdprodG_k]iot{tudowzyuz||uzxv|ek]p\fO>[P>Xklx~he{źc?9}XZ?4RXZmpn\rgf|quynpnxkplfWt}woX{}^gynl{zfObpV7Rebbpsr_`qyrphn}~cynsst\`>H6jθƩi\eYONI^VHWKJNN}_n}axQXjbb?[urnbM_XuzsqIb`ln[hj|x^nXtdirhcf^_[qgppcW^sirysŷs{ƗutM"; 9HS秌q`sbV3??5cMGcM~idMKzX|n9Lx{uMFPequ{ew9QZFrZklqtjpLfTQu^r`čk\a_k^ydmYK|brĎ|yv̋{Ǿٰej#:DA@p|Ų֘xhmt_9DR;=h;b`W|c^>qZVV7j}kq}DFXintnQ>pVVgg}vnpwxhy[ZQkDbjf_}z]clfw^|Cjd|v}|my}ȸyuƹ֟}aI L=(CIxȘ{}fxwT8VU7LU@hT^ydSHyVf~H=tzdwyDJ`myszFP|[bco|g|trljsWMRcAfjj_wafribtCsguyultzͰ{zuǸ՜wa{?!O>2GMę}e|wV9YW:PW=aL_{dVGblH:o}fy{HNbvvvzKO{]fflylqu}n`mQyKCX8`qoiĿ|hfvruiIllvz}zzku~{|rºңvZpHBF2QNқj{}f;U^@Eh9YQO}h]DvqdY1_|ikWS_sv^Gxmdsarwvm|tyUuqOZ\0K9L}u{y͒ttkmisvZWt}xo|pr~Вxz{ì¼oy\]_ 'O9U^sǪ౓iuTAfRow`y[^{zwG_}aygtwk|r|~_ZvWCu|16B5v~г͵sqgsv}rwNztrxro~|ysŮp}{|Śn‘tisv[Qa1JFQrkdxe?^[@W^7Qa:)@0mؽ}|yk}i}vSqqwvxiyz{s}}r|Ģm|kfcmUN]5HKT}nǗh|jHbcFYd6N;Sh]K~yK1`zdwjitp|VZ}evkktmzr|dOkR:jyb|ngm~Rizeizmpzlo}tWWiG?uk%26;ܭvlmm{um\uos~giuɎi}fwokqzI[PNYN!4MEnǰ׬zx`YpUQAFE@qgKtxf1Pxoklofut}kYzi}bf|mogviNeX=Z@"8)eψsayt|[tssuxrbyoĮlynvvŒeueQTUMWY.(JBJYϪ{gmuYe{@OBTngNX7_{iqxhiegr|ke~hj_~hp{kmhQdS@e|8#4)k|{xˉu^sp`vxvm|q|p`ygðnulwta{x\PBIHXZ8)E:cy[zãƧivq\wjBTAlndXJ?jygxnner`swimziuv^}{fvmsicQbLAmu/'2/vzvu_qq|bxs|ist}l^|fŦiui{q_xqY}G?CGXX6+E:lyaxɥlys_{jDTCpndWJ@j{k{nrirbqvmmyjyt[|eqmnedM[J>fw4%41w~|Ljx_pqdrvvl}h}o\sipokooZvqsPuR6AASX>*DBb`ǧƳssxbtITHcpmQY:`|qzzqviomyug{kf_ii{_efJPL:UzN$71g֘{ikq~mhzlp\y^d{{eoa~qd_tqYXn49:HWO28OOwԶjxkgdMTKq^^|@Hsxtmiy|ipwrlavct\st^W@N<>jp503QRvßpqpe|MUIwnkNM?h}}{vst{qiyn}q[{cj`fyY\RXE5QX~wĤ¤sqsfQWLwooMQ@hvxw~siyo}q]zbi[hvXZ:C:;cwG4DLٽyiswfnszdw`{gZpn{{lf`v`rNhw`a=fI0:AUWD8TZ|ؿprok{SXPphPIGr|wt|nnxwmar`oQuiZQ7A5Eoo<:C_תsmw}ycsnbbsz^^zz{}~|ei`~z]XQuceLHf58;KYR;AXdyѱnvlziYWfwxWhhAYzltjxsfgxecya]|X_>;:9\wV4BGďrwzijswf|^}gYkhtypgb|~]jLgo_^GVVB6LT{sԺxw~iihxwRRNpwyx{r|sbr_fw|sLrlV]896GjvP>F]ͱ{~ijo~^v^aWgyvdmtuwifvZhdFXw~hS^4[U7=DUYK9LVlwy{okguR{[Lipp{ynfxa`rxvQbwQa@56?ay`CLVuʾ}|reppmmWziX^tbspqigmwpNuIHfzzsO]B?e?:?O\YDGZmvΰzxvlkxkVtNX{{wutxgei[esvdHv^UV357OsyUNTzտx|zlo[FDNkbURerzxv|moXgtgfiftifdkvpfm^rvv{ulsupeuoxqn_\zt`Rjn}`cfnngohq~lqj{y^tk}}vupwih}jjnwow~p}}iW9Prnp}yy{ykzm_}{]tw\nrwtK+Ivɻt{ygHY[_zt{mwmf}{eiz}bn_}{ip|vstXO-8n˥m|lyv{psg}sywmR>>{ٝWWR@Yj^fycThdQdoleTzn~Xux]z}ymk~u~mwgLH6/fǺxpmvwwiu|zyS;66uܱokNZk]^scHZ\FP~|g`^LjjqXn~xZtxpfzvyijzaJH=/]tk}xtwhx{p~qO<:"3mزžytT\m]^tdEWZCKz{f\\Jgfm]py\qunezxwkk{dMJ?0XvjyxmtetzĪq~qP>;"3eҲĖ~wY`nZaucATU=L}{bXSGhz`mf{w\v{kf|zzhn{aML<2Wx«rl~xnnmd}n}ŤumPF>%7`yǩƖw[gmVgx[?XR:Sw^VNHkqUqks^}}hiygty^QR=7Yqƨrrvyhogg|vjĝwmRJ>'9Zrɛ|cpoWly[>WN7TuZPFGknQmsua~ii}}ity_SR?9UmȮvqxximfdyrf~šwlTMC,8UmХhqsWm|^=ZR9RtYMCDjnOjwxb}~jh{kuzaXXF=Sh{ȳyqxtjjjbzsezyĥwpVNE19Phԯrs|[k~k@UX:H|{[J@=brT^}curhxvmp{eXWK>OcwǾsnxap^{ncpwu{tXPJ77Kb~־}tdc~uHNaA>p`J?7Uu\Uim|iqwrm{jZZQCM^qţx~l`|~`pocd~vux^PK=8HZw̤xxZy_CdR:XmO?2AnoRryd}|pkszktt]YUGKZkķzypohk_pbYu}ù{oufMLD8EVoҹ|bitJVeBCu}YC52Yza]im~mpv}nmwdWXOHXe|~kb|bmygZ^¬mloUHH==Tf˧~Zvz~wzoefbD]rmfapiedercWqlsz^Ubrf_krr\gzuxywp[VVRgbp>a}qa\KXcWcWT^Ytt\Me{xnfxiwisXp}ce{|g`lqmyjvuYwUzsleHeWa`f`gs}eS~tUaooN]X*TXaidaab8Iv~l[ukhgxcthtrwp}UU{mu~waR^|pf\{vti{{y[@\gMoìzdU@U]TgtwDbNN[ey]\_{y|iwY\EO\V_w{{ri]hnrpiy}|neuuq_|rfPD]iep`epOTkJ|;T2>lOvwcjMzxcyieYkRhxy{nvZNqc`}tm_mwqyyƓgrl<]SI}x|hxgeet}jhgX=`fbLUiWpwyc{Yvn:erEXDs\}jRknmsxu|vkqjxdsy|v̡}]QYSXTzs_tRNugGDoDQtvOH{utyo}~bveh[Smfcnji^kcMnhMmxprqq~yskxrGdomrXnlcreb`ePWS]oJV`xcapeqYd{JIATrf{ikhYhgwuupswmntzogpwnVMHk^iiWk^oitpXnmw`Gqbfxgdwef}dVkb`Wir}~qtS_XJzshue[uzmx{pskrwci?e}Yp|~l~bJYu\XUbR^yZdwI_ZHFVtT\zy}__ar[d}}|oxvkpbak}dM``P]nsqSYb]fgFzp_h\]sfkxgiemdhYjbZbhvd^CcSNaj}}}}xo|}қ}xqGFyiywrt}syhgcYje[CciUVZ\ym[RLpiRsry}rwxqheaYff{z~u{izytf}w{epLQ\d]pn\kRK{{fRQqe`f|gRmqeYobdTsx}|pthLqlPMR~to}ts~rwc{wIKplskktwmjSdkkMcXIVQK|LJdxcSqzt_Tu{qcP^gm`~orpmtq}r}YRP^XRxyv}pzy}fnksoX@\D|~{ZMPEHWtjn~x}g~}soVW]hsqk}}itnG.tkUS{oxrhvdU9E[fazvefkwrr~~mzurNDU7EozfWo}xwv_Jf}vnzryj|kFEi{uWbvoYNowko~cF?ms~catmrѦ²T9Eɟ~e>IOB-+XhXQqu|nwuZ=N}yUcodqejHVkNj|lqhcHO|}cezxuZFo~dʵüvO;YsϗzgULA2\Q8JeUwiccs|rX=:mTTyfk|jrki}rSZrykxfFgo[|rUfk֧[bl[B`pҵpgpG0Yb==mVcd_[dhlZB.V|yXJzt\}{sukPox_Xup–nV[{\zy{]`qʨNKedG\nyÜype;QmH;moTo^`]ZbZK/IpssbHx`qzzytE_wiTtkofVaofZy¯TC`hKUmlǡpqDNqS9duR|x``]YaZN/AiqplHtclxyvyE\wkRpi~rkYcjhY}|YC`iIQhcĢv{LTvZ:avT|{ba]Y_YO/=bmmqIrfiwxt|}GZwkPjewwm^eegXxóZGfjFOb]~{Qb~^gi>0bYy~qusb^qxKQkk]ld~iChs{yV>m}[n_Ww^|y~upt`xɻҺgWkY"UD_ivyXVwkxeefdebBCdqcut`foZ]SSdmwXOzny~in~ewȟ]aiYzǢ~VCWW+6cdLb^V|]}qhd~pr`{l^zi[]jnptaI`yja]SfUA6~zelnqaz}~}wp}g\jjYam{|w|q{tnp}Zcn}narY3]de_\zyax}¤wqg4.RpGbgeXa|}T,4xOfnVWsptnSet`HndjoyolrfoujJ^jezqwU|o~~z}su_WuqlmektŠ̎gSDXelaE4AVXgWksz{wMY_D`tqU{|yn}sfKSX[NjNexaarzRb`fP_y{̬ſo]`;>ZaASI(9TkaLrhyuwRFSplPaxekkpjmU]m{kfmMI3ryxu{|tnXg{n׶ßqzU/(>I`j˷{b|ljAhdFYcqJ7y]_awfT][xd|}oime}ztR9Fbx`mrb{zbuukxvSƹžB?9',W`SWqiapfT_WVThXG0&@Pi]sylornjZSeoSObzxtv_Snyv[fT=4j`gf}Lqz{W[LofTniLT]JCcg`lrg|atskm[e`kVO8az~vqnjvm|{n^X1":\z\~iY<\\aQ\{c[HJ::hXdSxs|TO}o~gY>RZUlykhzzsVw~mczvȸz~F$Gk]`y|rwdZk]PGbfL[@8Dj}wmwqlh`{jxh~~z^kkCEG:Guv~z{ypzxsrgqYAQIID]ȟ~xrmTiibW]mxQ/1fiO\l~{e}x~m}\rRaTLL/AkzomyY]YceQð\yELCNAMouϸvv^ai|xebSS[FU6HlTaFm|ui^{kguldrzqzkP8R{wvxyy}kpfqqVP~R-/6-8xໞ|`tkh|g^VeHWUSBVcei|shnn~tifynk[R[2BhdztmmsupmiYnzsY;1YAEKVudwuwXuvSDFbkJ5677=w}xsy{j_xXqa?ULSYu{qu{xTez|qʧtihuZWX< Cڳ|}nrzgc]jyXQE7cIJOT`rl~hq|i|tm]5WiN/.DOcq^_ojzphWI<=@O;IϨwjfh[RodL]zcY[lT:L~qsor{~yy\[xhPNV<_nh~geqPjb`nyzĶxb|rWA6k?>Zkr|iolfbatuNPU[[\b9xwtsobfm`af`lnqcgrabjkY[yxpynigr|GkjB%PdPNhĢ^soTpxKU5`g=Y_qr{bg}o}zbXynJ;K[cn{yszq|ypz|dy~}pUTHC?>J_PvT~[YTaSC/DXbeznu\u}ubw{xsmPUtc>4LT`lnrt_Vj`HO[^MXsj~azo}jnnZMAGDVLNOm}{mpo_h~~{1Of9;)I]^atwj?`gSJbd_nTa{|soy}vtfLZaH@KeiapĒwuaYk[Uxrwid}UFVm9<:@Lbz~Ɨ~tjqYUA72Zi[aXXgznvMXSCER_RVni\gtcj~}yŢpl|wxzojm[+-N]ZYsڢdY\JTVSZoplj~hrsvqa_ptiE0+)@NZûvVyucbgt~zutqllaKJB;UlaWWR^ibü~ix~pnliabry{|pxopiduw]G6HcfKROS}pkl[Xfipyt}znmljmaI+Q\DD-3BHZy˲qVn}uxilq^}||yyv_fuIYcUSZfb`o~}eUfgvt_pXe}tyfT{mS=@QLG?>IVjwسûYlmd^PQQW_rdyiwxX9Lafddojd{qk{vxmhnzrmjvxy|h_[QWova:5<2Vf^K_{zjjtnQ~[enfKIdP=NXsrpbhwwb[_~n{κĺhid^dOx_disjgun~{_tl}a`\Pn`6QxrQ}~yevwghNCF2PP]DAj{oirkvs|Zbkt`jk{|⮥Ůq\ogtydoUWmS]q\hlX?QhZA[ESeNO`}teyZgag]cW:WlQRmuV}^{`Pkpr|o}Ŷά|opnjj|v[n\eru~ēwd^sVcLe_SgziBloc^o`oxoVVZJDJNR>iZad]q{n^epqzgl֬z_RxcUdu`zuVdwq[h}VGBWcLbdUej|quRo{~d{RJZSc5RY]u\j[onp{deoxs~wwz|ӿmolo_R{p_v^jlzw\x^EThIGYqiIbp~dbmvmhqiw};-?YG7Yeavk~v|{f[d`mţ͸easXYkvkakyZXYpsBbnwhZLNnzKQtu[pr|cHliP@GO/Q`q^|rjtxftLkyfmIJ˺oTysXPs~ZcXTyxRZkpULZn^idHfqlLPlqi?G^RZLQFb~^uXw\bugnh~m{ɲdb`b]Hkzr^UpkaY]vckJZtjktzYkr`x`fqkNNPOQ9H[smxgaRnvpyz~qgkwvҰ̵UjTKiVQmyWgnW^oyreSfeSS\OKog]rrK\ifT@LZQb~Y\vkjvoxd~|gWdvdawײƜ}sleg~[aXQjl\vojre|ǿtjuvYD.6JkY8Ffd[lz`X^gZOJDWMW|\Fut{a^ziW^y{xojljo{~s^TudajW[uj[\e~leĵz\|^XOOLVZXU^eMYkni`geQcYBT_taNq{seewxzx|VcfwfriθâkRmvfM]YIrm[nuqbgAim^V`XcxyS?r~wmy[LMb|jY5caRgut^}wvu{vryq`mVGbz^Evw{X_{nvnoMhitoZN_YO{|uXpvMB,PiaLS}yLcbt}zph}vp}bybeWxfCsqk?Wz`ovf}^bJZ^[]lm}SifWBO?SidLtwVo~wm~v_zj^nuWPQzh[sjrNtzor­ztecaT\`QO_qwAoejtFLKB^aMcmq^Puqej|x~ww~zT^\`tdIhhrrV\{q~sx||~tmINfl_djo~d\Z\=GE]ziSvyt|Miyy}xu}bo|pj|h²ml\XQs}TN~p~eM|rqįznzjiVN^aZcedqnN~][kEOLCdnXk}Zb}\kkr~~l|XNE`xbFjvi?Y}~twthgVdl_\lpjoOvicH@;>iy[P|||fN~}~wvqsp{jvmzbZEPvqWjqppSYr~}sy~hcSfq^OXehzZb|\YQKCducXw|}tV}x}xzygc|li~b|UPGZ|iI_w~{OL{zĦr{xu\aia]dkgpM]r[SJJ@]m\Ns~tyXt}txmdup]zy_QAPpiTalnqMOzp|nq_kyiW[knzTerg[PHIikVR|~kP|uu}ur}jdvq~}sczVRLf|hOclmnP^r{¶t|w\gpbWbkjtLi}jjWH:Enp]Rt{|k_{}w|sujlhatuYKFm|]E\yioeIb{up{xcnrgaltoqLp{urUREMpiRMzz~_U~{{~xb`gukwrvqTXSMMU?Q^\C}s{zy׿Żv{{zlL^y`rKjssywhgR[bc`LppaN_y{wgukpplc}pmvsl|WzYdePa58Cgdq~oahc|spr|[Yj`E^cpzv~nJX}cgbomgqk\mszl|||}foTcyYc}X~udqpqH8qdV[rjc~~{n~MCKf~wkoaUslp|w_c\^wxzm}}ghllL}q^Q|_ǥptSֵ^z{ӪïUEZjp[V6qQɤpivkUVUXyP5oNP,8xxqEAy]>@YYL:Lc_yxPIykfl}wsvza@J_qaYBkYjxtsr|i^qaLadee}~o`rϽxm̗rs}Y5SXI=Daxfc~\Gmsknn~uxwmCFYqd[CZaK~{usw}T~vuDrf]ibqph_{¸kˣwxwo{m=4C\XLFXJC8uz_}OzKZtpwfk}uU@MdkYNDmBvʯ|zv`qn]Lq\i~ccwti^|~~ȿzoŽppz[37I^PI5XSL΢}xzqQnhd0VolaEBgrH?LWGA@kjtQnLcyv{ckxuxJ>KdcTGMl@˦}|yZnUR}~h[qu`atjc]|wus~{|wlnuT/3EXID7_RU΢|pXpli3Sjh]DFjtI?ITDAFnlyRrNc~zzajuqzwI9E]aSJLsF̭~zazp_Lx~k[n|a^oja_~xntrtggoY-,;RID;]dOө}Vfw?Eed`IE`R@AQDBCcU}SZ~ujyqwtmqyW5:L^QNHt_iȻ|sd}|}Ibzyr]cg\cn`bmsizhi{~wd_dc9#-DPFGM{Wؾ~cniwb8XbaTDSygG?KLBFfit_dRm|~aiuiird92>WUOMl{ZĜ_rWRrsr_^xo\Zj_`hxlq|lvlmzur_Z\bA!&9NEIMf|ľĜjhqtn;Ra`WEQspK@IODIbsZmRi}_g|~~ughmf;0:SVQQi]Ơbr^Omoo__xp]Yi`blzjoygrihupl[X[_?!%7KCITfhtoym>U_^TGXykL?JLDMqmx_eUnwz_fzyzmdfm^509RPNPv{c™{fuTSllkZb~iZZg\cuqgu|[_lonfWW[Y0!(@IEIb]ſشfn\D\]]NNf]ICPHJXlatZ`~ucsnnwusdfilJ02BQIN]_̰htsKahi_[qy`Ua_\h}ypjtlap`njjZWY_F$#/E>CM{ds÷ɣqwxFU^^UL_}mQDMMGRzhs_f\tspbzhxvwifioY62:MFHPzciνo{zOZdfaYmeW^`Zeznxj~sq[x^khi[X[`M)$+@:=Fq``ºϪxOT^^XOb}vXHLPHSui{Xo]psxZetsvjeiob<36JFDImjUɡzsy[ScccWfjZXaX`xgiwzy~Vz`fhh`W[^Z5%%7;7?\mKݹwyjO^]^RZreRISJPbh^mahv`qolsrpejlnN63>H@FXvNy~ѵow}Q[`c\\s{dV]\Zhq}kvlnjWu[gdeXWZ_N,%(;69Dk\Wկ_U`_]Td|aPMTLVprtXy|anu{Y{imopkciliF51?D@GbrMϭqutQ]]aY`xuaT]X\oqsopmmbXoZb_`TVZ^I+$(95;JpY`ÿѮcW_^]VhdROUNZwsw[w~cnvzYwjjnniagjhH50=D@IbwQϱrw}S[]`Z^tycU\Z\mq|iqizi|gPsW^[]RSW[M.$$65;Jpf[ֲrW^]_We{kXMVPZroglfi~|sbdtdjhh^cfiS815D@I\~`pϽt}`TZ[[WkjYV]Yhh~enlnvMc[VXWTKRUV:'".::Hd~\§~^[]^Z[pzcRUWWjpbrdrmtU}bece]\bf_?3/?BGWzxaƣ|wttTXV[Vcyp^S\Xc}wtofgyogxTR|dQTQRHORWC*$)::Ibg}ȩh[\\\ZnfUTYXkwe|xdpn{zTtdcab]Y`daC4/=DGXxb¾Ȧut{VXUZVbwr`T\ZdvwleevkduRNxbOQNOFMQWC+%*;;LghĨi^\]\]s~gVWZ\rsererkrRzab^`YY`e^@40@BK_xgŸx|urUWTXUezm[S[Xh|mp|agzahoGXxYONMKFNSU;*%1;?Sraغda\`\g{vcU\Ydtyjik{tq_]s`a]^W^bfR;26CBTobÿɱd\VTU]szdQOOY{jjHa}``tyjKknsuiZ_fofNGHXXe{turx_yno^STX]c|v^lsa]?^pj{}|]q{ujlrxmPEANLVkkio~guedejlzg`[UpxPagar^kbOqkVPSO701BERjle}zh~|tm[[]dij]TKeY`~i_otzSqksy|zdYTadl|Ŀbi~X^iVs_FGFNQf|p]QSMa_\ykXe{nxtGSq^eu~aOGPUXm`~}yiOH=Lvqr\AHYu{[alFDnaW^dmjqruaLDGPPcz[|z}ylxwzne`ejsnlhlr{x|htU4YcUfv]J@FAI]oRLp`vhitg{qt][Yadxt^POJcxso^jv]myv{|lckprqgduµ}hxvRJCIKYoq]LMHSsmrTisX\llivS@jm_jtcWR\Zikq|vrwwpUECA_|wZGPbznUfe=Kp^Y]elltuw_NFLSVk|Xtxtmz}{pgafkvlkhqtwunamN0Wi^lygUIOJSguVNt^ohhqgyn}b]Y`btu_MOMfow`gwud^}tjisrtwtiyyymhRJHNShz~fRIKMjs~]Xs}eVasv\je=LwpqyubX[acydwnmnrx]EADTz|tULVj}|_ThV6Wtefdklpvxu^RKUWbyr]ntw|zxrjcknyhllros~xUY_;5jwvfWQVSdvxQbn`rzkrztfxsvc[Z`dxhSLQ[uplalpzWoriosxgpm~}v|n~_UKPRato[JMOdpqTcoW[hxY`jH?ryla^gg{k~}wkgik{v]GCJ[zxZPYj}x\ThW7Vxkjflnsz{xbWOX[g}n]jnw~zytkdlowimorinyiM[Z6>sy{m^\__rtOvgbvqkq}jpn~mbY]`l~vaNQUvíjpoUZez|aksM=pw||zf[Ybdzf{uxfwz|oly|qgfjrs[PJ]mYZvs[[i}Vk|hmzqhbmovwx{urdvl{ia`iriTJU^ZvhcnwrjEbqf^gk{zwx`WvvhYNrmayg`]fm}eWV]j`w|e]i}|uj@V}rg_hjxtjtvwhq}pzyvfMDGqoXeyx{rgQIUhkeyhCW}x{|vj_fhsudtquk[ewilqhaiorabb~ts|ozl>?mu~ydUSW[p{iKve]o~|~vnZWasydriyrg^dix~hRONervt_equeY}ztsy|qhXTf}wrfe{gXMNU`u|iTOMXzrfb{v^]h{kn{^?^|x~qgno}olvw~lpz|yqwzu[IGJlwr[KS`v|h]rjDJtspqy|mbdipz]uhvwn\\i~tq}zodio}~jhgy{}ru~hpsN7^wx{k`dbqwS\v[_ux{ypcSZcx}neyjoe_glu_RRWxsl`iw~v\c}~m}kt~wwmfXZkw{hmk]PRXdvygSPP`reb{t^^h{~flx[?avmstnmusot||zotuq[IKPrz}wcOU^r|xi[nnKBm~zzzsifnp_t~egyxzvpgao|yurxlgovriltvznug]m_UoQ:]fIrwpUtWf{o`mKDMPMn{rq|zb|_`cyq`rxj{~uuiYia_afalxx}blvsyxvR{{yyhsjg}vģľomwQVf.2DWzƫƯd`xfbdgO_kT`|lv}Xfj\XoJ?DbV72EpW{xxnufgcinoxprvvybMXumYfqo`ũ}v{owoug^njf||xloiN?ED?[wyxf{k_WhsRF\iYcy^QotdfnZm_XVKVmyzwlsqjlFvuT^ygx}y~Yb`O^fDNfj}ƭvpownq\fxmzzts}pktŹxrmUZ?RorpWouaW\E_FMXaZhvw{gn_n~dIatmtvvjy{numN]QUTob}qvz}tu|hz|z}n}}tvqvrmQoL5K1BL=vsfصijzsa_qZpx\_kVeycWu`ZUJaMBQ~Yszj~qw]_prrtqlxlmJgpOMRW@M{}cwjvu}gsxxjrtnhq}q|mr]~y_iAVa]P?HWJp~vġkdZTz{O\twqpM~VsZU_KMGkngjlx~nXl}ibuzu]qiwrjye^ml_ZISw{^szp~ut~x~gyih\bviɡ}zyxxvuuwIE`FT[7MG~xŵ}{ru~cyhoteX[pahUER\AVdubwz~}}zp}sjs{kguz[gysmK[tn\b]H7a[<6Mndi]xqokwxzjw[`wwTOe]qvbcouhba{eyuh~tVajcVubi^GCehpxwxvvcjkecqil^yt|yqktcj~cbmqXWIQa]F7SUvxkȳtsmx~ndovvduas}r}xpumhcd|o^Vga7FVORcjƶ~zk}nqxktwlscwfeskxg|o}p{p{{vlh|pXosko]dVLdTHYWa~umi}yremu\firv{zv}vmulgxg{v]MVSXURMTWIR;Iv}vǟxn|ktrdYH\tlUBZiyohlfhunky`dbHsoaB2SscZbwkoɶ~qzpp\[zhvlpcz}\~{xkk_mknH[|[PYXJKP=:XZNVXaitdѵs{d{pvrpobWvj}}org|vdhsglpffiZVA>_\_EKzzyx~pamx[b}g|gtrukzxoz|{k}`^aAfm`O5Hb`LMUG8MQCJoĩvdm{Tb|kia{u|dm{qvokWV\REl\KJKsjehmzv_dLJRir^dt\UQVXgPgsr`sjbUM]Y]mpe_jjedbaGXYFIyjUdcyy|}|`Td_Uyt}xozmtsvvrnv}s~w^K'uwUZehj~uw[|uwwidgiXpuv~{i4_UZQRabWYrZyuwppug^pabZZMSzyv©uxosxxyfhuk]g~vf@cW8.7SZm|iqs_{h`h^OhmcbKSgqa~kf]dOFP^V^Kluawk_\cM]XJctqzzr}vhdXsiwzmpsaf^nZYc\I@RI3=@[ozw}{qrt|}|[owprxyy}tuqy||tyij\b|}yxy~w}|mtthlr}}xnos[c[ymRJWKe}}ia_ve][JA`?De[hgZIJXrafs|gsk1HHIrwmyj`jpotgmbKPclgWLgWt{{ZdxzxnhS\vcknj^^LV~zzhhW;Qh~jNHV^VYssq|̰t|lmv{kvVB>?KdVjvh]txdpjZjjmdOpyVA=DTknxH\YOhzztv}q{z|vmuvlYOJmrrsONJJ]Z^h\fmznqozh_^V`u|iPFS\bsglVJ_yflkpuzslesqsw^TjZdnqnibOUhuwzgbktm{y~t|pxsytoyfNP?Xzuiptjskb`be~zwojr^pqbcfjt|~eOFDStlzv_|nnelvbqrvvd?@EMc~yiuyxtvbilnfpq|}mzWb\QOTShbfwjIThZjsuaUjſjcffecdqwmbaahyw|npuiko{bo|}uxanrruzzzzulSZQS_a~w^didimu|Zxu|}znhpjc|uqZCHb]ulvfhd[aolqyzxr~{xuuWbt]`VWjxy|ro[HKZ_rwqz~ù{zekqfka\z~i]dJVhuzqx~rss]oybg}rwinr|uZ_\REGKltszrk[cmcqrnbt{|~uskSYY^hrjgl_Zewweee~xjxsxm}u\ejwmodc`]CXl_lwu`g{gUeizo{ryzvnyoquvwqvvbW[TQSqrdynpmjeb_ory|`gq\UcMSfdmptot}e^XY`iqz}le]UWqgoxtxuuX]Vbz|wypcrqjah_e~}pbLJKAET]ltmv|ocgdh~ju{|ve_u_]hledp{n^k`^twssisr{rc}wraniqc~p]ejddV[h[dqxeejo[Yh}~ie}uogjrt^{h[d]NPas~uegacjinidyvmjoTCKdQQ^ardsgUVXg{|w¿t`XZ_Ych\xjgù|lMKjVUW`rxv}ull_gPZ~vvmruxuquwW@t_pvzjk]Wn~fY\ht}|bt|y~r|tm}jKU]Qg|zzvwxyuzw|kvtP-Ucox~{ow{xz~oatixkfy}]<|r[eW\{yjczzm]ypuyujdm]eokyxqvuni`:?xsprq~vqqr_e|sdV@Qzoc]]RFg\KimokkooUcubNRnwwxszvjmedf_W`KBY|r}}kvpwuiTD=$:nm\RXD>IRQ`VQjegkWPjg~}wwji[GO8.Su}w~yx}s}qdLAO5ErlopbYR]KHKGHOZ_GDwwo{fdey}hrmdeodMLk|ow~}eg{vyWNd[@CijTfzWP_\`gih`Na\:;Pbs{zzta{iki`RGSjB>c{{ltysvycfWH=D<+Rsǿi|s^RQLHE[bOYZfhW`xu~y{yys~u|wuqVZeTO:A[p~~rwtu|}{o`YI=6Jp{}h`YHa_MRQJIOHRXknk{iailrv\hsf`aUGQc|{rwdtĿug\acDLR]Wmu_hlp_Vd``fe^VN_PCbrx~~z}mZrrXUPD68M_Troy{vzwynVXC,,7AGfǻu_}ZWXSJFQ_GH]b\kyywwnfbm{vmc^XA5Z\JW}{|tspqrptn{cb^SNKK[UTjgfQQgRFEELMCgqtsp^W[]ZbP?QS]c^q{wyzr|ptlf_RA52DCL\hȷxeozplU[mhbZUSOLb_d|{zx|p^TGFKV\RHp|uz^Rv|e|nidMF]PNgyw|ڷxe\Pfy]X^`bdclX:Ysptvrz{mf{o9Fl]VJ^t_fvp~HrϜqctub]l|sjnqLDaxr\\iYLbEvzl[O\SHKRcd]{q}rb{d)&_nivjhlovuj|`k~w_e|xlȪ{no`^\Y\[[g^Vmɴod=$Dto]B7;ETX\cdgiJI[oneWKffVY[Z`]T_[kǵz||j{Ƚ~mVEXo\JD/5<1?av{osk{{^[^YNE@H72P_wvpeey|[^{||}[VqۼlYUPOU`p\?d|gyjXQYQ17Njqjt|rjstXDOfYEZw̾tz}WFAAEFIQ61Rlrq|q_mbK_ywkz~vrl^M?GR, JȰt^\keUZQ6BR_jmptWEhppx|woirjE=U|twd]\btwk~Ǻsh_eQ7Ecñ{utmae]UZ^luun\DUaZ]QTdq~~rĵ|igccggmscknvtdfbUN/+@\ecmosxz|`flnlfugiiehmk`Rf̲zwxnnpzlSan{~|w\BZiz}w\SXN>G[obShulVq`UYZRLKWJ9SfsǾ{}|l|kVfxЮuZND??BS^72\zwlziWYaF;K^}of`snlrt^FSgTToԴ{f[[]\c_BLg}lX_rUGUl|nywm^_ytpi[K@GM70Ewȯn[LYeZXK5FYgrvwylboot~|vs}w[\iƷ|roo{}|ŸkVH?D6.MxwpYZqsyzmT\l^bgUJUaqfThmeddgjmuddv][dcI7Rsmlvz||~j^u~~oR_lVNNJBBP]C;jĬy|uv|e\wkvfYSW<-\x_Y]cZP`veb}_zygeaXPP[KElºrxtc{vbzzddnlffred̼g\SNLIP_MA]nn^V_`NFO@Ad|y·xpgca]LBTVh˱~wkULJGJG.;]wxy{}}paZ``lu~ywwffyuyb\VH8/7AA`˳vd[gqnZD\y{wnvokz}tjeno`s|t|k_[Y^kzkfľq{pS>7A@7W~ǿzsnligfJ@qxtiS]o]ZggOFVonhʺtooqpsyfj|tdG5BXD=c}o_hu{{ms}`ps^WTLA=McNKzøwhn}zmonZim|vj\TZaMWǼ|hbdnkZdmbzn]v{jZOC95@C7Q}{|jl{mYMNNN[[VxļnaZTRPR]WXl}ypcY^`XZONpzzsasqWMHBADADFdtd]Z^X@Omrgotqog\UTOIj}zwvjs{}zb\TG;7CEFqɲxhZ[koM=YnxwsodZua[lsnimzplävmhfiq^bbZe]C48B4>dà}{y}mJ[{fawl]bleMIcn`r®ugbccel\Pq}s_HFa]I]{pcluwz}db|foq\VTOFBOeWIaijxq}v^jx{ysh\W_\DFb|iaakobc`]w~x{o`TLMWM=Rqxwnrjxup`MKQZeVRoûumhechjZdrs}xm`QQ[]U;12XtȻ½vsbWiu~pidXbhdbjq\[pvojjmtaaj]efSCGH4HYL1Iuνrlp_L]q}fmurog``gW=T}{qu}zmp~tv}iYOD;=H@8W÷zlk|p[ft~tbr{bUY^_dph^tuollmvyhru[KIME:ARR[wķssfb}}vzZV\YPLTaY\xĪumimvtS^x|`akaLCKVKPp³~tVf{eYjfRRWK53Mc_nŪ~rmjhmgUj{tlfWDC^mY\x~mq|tyhsfOGA829SaPZǵopztgfZJ_xpdz{rpmf`cqo^juqu~ymsrqkdtpaP@4.4EGGhƿ~tkpmoq^mvjXKLS`ojivic``aismt{r^NBDNTWLSvmpj^qoZQOMPX\YRiĻqihojXh}ek}f]WNECIHFjmhusl}}`VQIBFUZZ{thhzp^ssfybIKQMKScbcκ{qllpcY{v_PX]OBFQHMkdij`piSNSQ@4F\\nqliiodUl}rlfYJF\kajnit|yopkmUC=7/-9SZUeǻ|{x`^vwxxnlkf^\fo`Zmzpnt~|ukbv{krkc_O=24BG>Puƻwrdc{tagzrlfTGM]pmdzzqmllqwjoyq_Q@7DUXDB_{qsthyt_VSOOZf\EU{y}vkhn`O_tcm|jd_VPRYLAcu~{r}i{aWPHDKVMNn{qm~maq}qjcJHLKLW_RUoķ~vssxe_wl^bibX[XHPiw\c}zegudQNRQFdzszzmzfYNGGRUHPq{qkuyhgqy}wee~}dLACGP^bV`|~}tq|n\UZ_]]UEOh}xafuybdqaMGHIJFFEF`ƿytvxfXj}uxrmd[X[Z]sskswmsndLC=53;LOSk|úò~yq`p{k[`c^[bmf\jzsjglv^Tsu{z]PWXH=AMIF_}ɳhbwgs|lcgdQDPgge|nfefkl[]}{o{kZRG6/@\[Rd}|}{~~hYTNHK]rj\kuks}ytlWXo{bej_XVPJLXbWSmÿwq_hk`G&'+& EiiXd:TsBIL^k{pqpi3@wxwulz`afXQFQ_tn̍``sfhrldtxµpif\_YWVd{e^38mZ[sY~wgprub_hk|beLWil!.ehbe{qmg}cuxXNguodUWNmqhT}ƘvqQ>V{wxvz|`JVnlKI]]`oϫhFF;nhV;,&:Euy{niCfag]^wzljmomiuuudkch}_jo_]ީq~myskdJZKVv͹ʸyK3(5\h̉ttvWgu~qnglg|{TDwu|m@;C1:-@Wfw}[wgl[:iY9CPu^txn~~zmliwHRL?6"mܼ`mj[ER_dgrtRTGK2>dYjyDSqO[]klFSICVc||srii^fqkuzt}ѺfOM7!=IjsgMyYGPPiN@b]_HGj_{ksileZrniazZ[U^Qhz}xjx{cOlfuȲ_PQ"7V6Rn`xbt{zroJRRI:Dgnpt|otcpLH{^TFKcINqo~pķzy~trZdlwr}³mpSO5)S\Ľ~zfZ\`3;C0Sut~oqroc}ybs90:NWxȯrpnwpRrfhYYz~nuz~nbcU`^K4=Y;6Pzŷ»xs}ovw^mqwr|sRXvjD=A7CSWmƭmdYeN_kFYln]~nzxtwk`hghyqSUPgoRc[D$Bcfu|~jvjKD8daN]ir~r`cbZadSKSNTfdpvxvatop}n_jRBDDaJ$&RKW}ʿDzwxvxiCaLWu_k|p`{kPkuStRU=59[|s{jywhnvkV[s{|wNRUjVO9PPLN3DX1H_p̙gizaa]XZYii}{|yzrujmE3Uf]NVi?Xpf˵znispdbwrfutg]AdeY[75EATuyź}uryrHI}aehvqwzuVO]Hjs:=9XmZvsxawttst}uq}tlem]X`I@e]Y:)a_ux~e}pbUhfSpoqz{zpNndks]fbGPN>ljqlwzce[j~y{zzsb\hLK>CV34INS]õy~xvljJ:h}yyz|{i|mgntf^zaV\EPNb}yk~lqqueht}~gkKGaL7:'MY3LaxѪ}hynn_XXhwoz}tuq_qXLZlvZObPTFQ|szxearewww|uivmfL9kmk^32NM^Xp̷rxh\;hiUem||m}iidm`ToODbU:*MVDYyz{lmfxcb~}hynteQVlJ?pwk=&ZZR]\i¼Ů|dxrRR\Qlc]}pifazhKNQO?]fuctphTD`r`o}fj^^@KZ`Q>O4?Dd]eѬlOxyt{}~mudVisZaf[6MXKUef}˿~}zY]gpZvz|x||^T]D=H8D_5#"Ki_zęҷȞdt\hd~nzg~QDFjbWx~jQ6borw{zxsS_oej{ot_`s|uANh^`bHEO0=Jfa̾t`iI@[翩ȵjsSIUtEEYfmRgndsskxhflpz|t{swg{v;a\rh):=4Vss{{vu|rxf_X}aO0U[ZoGsxrywjhx_^il\i}b{ѫnHQQ\Q>K}]i~\uPzxroTWZFSEtjslwkunz]vsXgqaws{xqKEJ{o[JK_o?7Q/;IQxzt_~ch\Tqe`o}zjrfY?6@_xʹpNPGpVDGHW`Zetg=uo]kxqFWV@DRJnscvf\z`o[zdrbya}amqW7Lhȵz^YQq{JN[ojcjtq@R|rb`emkLDWHH^XY}u^wP[VZ~fRdu~qnkwl;@Tdɺoa]}QUattybm}~}{|~wUrN=S[23BJi{Ƿi]d[9F[b^myziD|pigsj_KTQQSlLhs|v}ftydw^p\~}kfcydeyN[wc:LLbsıua`zZYknovnvxxu~uzXt_CZc:0BKivƴtfi}NViogt|yo?i}rk``lbVKQVZTt]mnr]tsWgZiof\i{x`QJjf:EO_nrmxoTcv|}xYu||xty|]Vd19VI)P[zĮxghNSjzx`|ut{|y|w|slc=\8-R^SRCA][}ʼ}t~w|lZjvtZpp_Vdopkxysurcwwmzb{yjyrzaeSXTCUe\MUjcoyuxyk`}rl~yigxzvl}zqiZw}d_gdfNSAN@;Q]RIZioĶ||zb^qz]hppgX]m|iw{}vhlwnvfdiprun^`Q^ILafZRjj~uv~xyq_fv^z}pfr{yeuwgtVeylYg`gRPFFI8H\[OTnhȹ}{eZputjYyspa^o}txv|tnfx{zpq`{mjqnoY^OZLH\h`Vhpxz{{vvt`bsbv}tho}}}zhqzj{wV\riU_[`QIFCI9F[`VXsmȼ~}~i^qyupY}trc^n~uyw}wrg}}qn\uzgfmhiVZOZMK_kdZnr~y~~wvp`eo~\xy}qfn~~{zftzd~zoO[k`Q^X]MIEII=M`cY_uoøe`xowg\wuo`apu{|zmntyc_usckkjdXXUZJQcja[sjyyxwe^mzrvX{zlfs~~yrd||xiyaOdgWX_WXHHFM@@T`\Sii}}pbik}Xzwykahzz|{y}xzg}nw[ltidofg[UU[PJYfeYflq|xso_ej]tz}qdiz~~~|~yzexgxmN[cZR_VUMDFMC=K[]S^ijzgkmcoz|pbctyy||~}k|r}\fpjbogc_TV^SKVdfZ_ic{vvbe~k}gf{|sdbq|y}~~~jrmxvsQS_[R\YQRFFRI>GW]VUf\mj{wwv]|xg`k~v}~vqyh]lldjoae\Sa\MO]f`Xg[~|{tg`l|k{Wz{l`f}u{}}|wfi|wdMZ\VU`RQO@MQA@LYZP][h³|jpmhp~ufdtv}~~q}z_bjgbmh\cTSdULR`e]]f\ջ¹zrnNO^u\agN}vqlTL]vut}`VXVfnmgcwUC=lPOUOnsgky{uslpt}woqhpiwbmMOXqoZ`diykfi}yrtvmq}vtuh]ZY}~l}llmqorphUbvxrgZ_^n}zzvm5(7jpN@'@I=EUgkendqzog}{utmPR~yxy\Z^`w~q|[Yj}|ãy_4?\rgkNBEA\_JGVsq_wXrqn]S^{}r}qXYY_nrdznwnYJ);Wv~ih}ielzzzynqǸˮªuycYLUz~cJFAMp\UULioou^pdaP?pöa\SQg[FIYoZ\aHhf`^UXlx|oujyeVXVlspjd}zvrX`MO=<]vfprzry;ʳdam\]\eŵ]TMOtmZ^Patitbdb[X@Qcq{{khjuqvri~ibVVSLPztxot~lqs~|}yzwkPO%+6Nr{x¯zpUMXGbst{}ej\_x}|}lcnx|[rtw~f^ci~q|yxkhxs`ctZQVOH[U_lMfYAGRamrsjagtktny|}i]fVADEUn~xe^{{]oiVae_lwoäspunx|x{spǵtt\RY\N=FP<n{ˮsY`U>??H[jh\{hQ}o\UWgyuxgmsVT[Xdug~|^UDBcyy{ywywpkt~{m_Wt}uz{fdyVFBSsɧzWVRM^^Vtzzyw~y^]IXpxzuoyw|}vv~qogL@EuktzeehntzsvUE;6[{|wqfe`VNQ`Z_tWabMXH7/Gmky~v~toz^Qe]PVXct~wmgX}gVTa}hhmk{unbZ>2:oǻ_dgOKJLZhj[osKnv^WXh|{sleu^Q[[fyjvrx]SIEfy~x}|wrw}{to_Yw{wywy]VpWIH\}ʫa^\Yle[vzyxwws_^K[ry|so~w|~xx~xigaK@Pk{yhiiovzjgKF6Ae{sqi_W]`UniRhWNUA47^il~z|o{vR]gUTUWftwiz}Snw_VWl}ion{w|u}x\^J74[zбymw`TPLUci_g{Ua|j]W`q|qyftmRXZdxgivseZN@Wm}~zst}tyt}vd]vz~trlsxv]Zr^MGRlʵrlhjyd_vxzzzwpg]IXfmuqyy|uu}tx{ijcNCZuuɴuwkidl}|{~{|laSF0?Ug}tg`bV^w[[lTUVC8JaXivxumSi_SRNSdolkn^}wcWWf{~qtvquxwq_`L9Babwӷh`UR]ggavqXu~l`Zboueyym}iU[]rr\m{}upgaGBQaҾ{wpqxzh^omtzrplkvwt\HI~{orusyukhdM2.4UpojtvPco\ab_Z[^Tj|bor}mO}}}|{}qz|yzlovwk~pE02Vwstyh~pahZEDRKhx|Veh[\XZj{[BM~¾eKZS@LXszgwiVar|zop~mmeH3>D[ŨtvojbgswqwpniWSb}|ldm{~yW( :eùw\ub[bb`_cYapd|sclaNTlmtrphenxwr|bjr[B7DiŮpormuqpnUEUilZQ3"7QiػwYgYOLFJWa_evi`x{hZZl}vdkt{j{{_PM@&+KoͰtok|ehdQRow}x}f\fW@8IpѶdTVbrZUgloqt}d`eXBNf|u|zjmn[jZ?@4$6^qϯwskgnwwumu{kgwywnLDC2-NxüzsrnieaRcw]Zn\NUJB[v}k|wlja_glfcl^HRYJBOrӼst{q~ziomX[u}yehfA74%1_~ήseo]WQKP[_]fn^Znn`\i{wl`gwogvwuqmvhF=E>6Ryřpxyl~t]c]Ukxsx|vnrdJKTKESwؽ]W\pnU^jkmmtiSZ_NMg}j{vj]tsSU[=26-9eѺ~xrjmvyv}smuqv}}~uyjC9D>9XxwsojcS`u^Sg\FNJE_y~kwthf]Z`e`^bVEJVOKZ|һwu~s{frubf}yqyY][8/3,@mб{qsb]UNR[]]ggZZjla`pvwg^f{dgrqpkiq];>K?@_|oqrl^g_dŵsxcXiedeeirxx{xfV]{|{o~kZcwnj{gIlISet~jy]AVjZQGC]kjw~y||}XIgPQY[dt||}lYliSVdshG2dhd\DMXXm|ul^TeysrhbettlpŴ`IJRyqSDHVC9XaRVdp|wzytrn[hkPR\Ym|nPgxb[ZW\cbgoow||]OöeM03M@2EUCHXVergp|vwokc^ckmsytutukjmeTmutsnĻue`UU\kjyskivw}kqc\_MV|«z~jO)7v}YN\ajpywkov`TbRBHYP4RwtifgvsNPfYUi}~uxÆLQlhTfvvw~t`UXfvupg|}ifk`;MkUVdT[hcdgklnzg]upja\acx~]Qmv|ƼsOWrp|eY[`gns~i~fR?6D\tgjR@PUaqgnzlaMHNeɼhSXXTҿWSoeW[cjpqr}{MCcYLXjz{m\fdJQ^dxunoddWVI?=CYuzosm{zyzsythv~v|³ïl[W_rĦgkghiPJQMQe|iWA86G?Zsgyc`epȯkZH?J]{~g`c[_ptl`KEO;)4JE@[owxrlsfCVrjgmprrpsvNZt`JFKXiqt~uas}{ztoL9EWSa}kYSPPPPXhV8UiSDBFMPHTrj[dudP\cnwhn~je]NA5;J^yrkƾƧuQbY5(3QyطfPXXb`PYedeln]HG?722ANYchfhfZegl~|x{{oxlYJSI9Im{}ypilbXLQcvz}osuh`_\KF\\SSGJR:->SMQhruurspVqldehmsyauj[`qw~wvXSD'(I_fbPg]KKRY^]]hhB:]]GCLZeb]w}cXekRSiz~ljc[S[owk}g@O\E7AWp{zu^fjqmX\hggmqePNPI?9BKT]eitxqp_f^GNmyzwvphnz{[E@8+$2Lhy|~smlgX^si\SACI50J_^o{j~{}mWqwa\jw}jpyyu||hYA6?2'=Y^nixj^ZZ\]\fq\Gb|l\]fpqj~puyfvvprhWS_oupqv}}xwz}}qHJ_Q::J_pwjjt}zfl}g]ebQGLU`nzwr_b_ILdfhoo|w{xpv~ypuxZFJF3)3DZv}ovneTZ`MNa_Xk~z{~~c`yuYMPY_^qq{}jYY\bo~|}n`IDG3,?DC`ģxttwwza[v~gXX]a\g}ui{}nSRWD/0=Pk{yibndXhqfs~~`IXfSADR`gt~y`^ohSMPS\jwx}mmyhcWLZ\NZg]dyttxz{{hxwpsvqlz}hV`]C5:DWpuyq_`hXSaYP`r~mbwre`bjt|nh}hUU[^[no}~{our]Y\bm}}r]MSKMb|¬|pnbYGDQJJ[ZVj}|nskikops|pRI\k[KNY`_nvttmfjpzuk^JLQDIXU_~}qlmoqzwad{n_afe\krlu|fYknky}hLP`O;YQBDRezʵ~m\cvzqbct{xwrnnqu{waTSVfnc^bch{bd}|dXYalvs|~u{|p^[np]QLA14N]]TWozxv}olgct{}zs|t|~vfMF_jWIMYj{}taYkzvfZfv|{zgU\^?6HM]Tfrp|pxtt]}h^]lekghdN^qdShgolhz{bhy~zqdvgawyh_G63HOS\W`KK`bLXin}vǨuqhXjagvs{om]FWg]Yux~vyhg}|ywrpļj6>KSGT^h\~pWNvr`iouxwbS8itԳjT`okqsozʸŭzgohN(P[K̴vZZQT^lZNO[VJ;=DTMIVa`lz|bNYeahoqxhW?@xî}ZXrukishwzIJ}qgym\67cOkȖd[ZTZigWSW^RD>COYIW\aYpRKux_`hmrpVH1iٷgUcqgonly̺yygm~s]F.\[Xɪv^aV[fl^YU_[MDGM^OT]_UyzYFbb[cknuZL1M`sW^qdfla~ξx}hfwy^O-MbQùce\\end]W^aRFHJ[UN]]Wf~~bFSiX]hjuaM78˵|\\urc_j[r|öxleq}|x]T3GcMymlc^gnibj|ZD:A<;GSDFvSrs_jy|aE+jghɥydwor}i^_i}_\9Y}zϾǷoaws_]\a^H.2\TgϜ}~x{gaee\uhXFsjqmamwh[:Dq~jSFfmc>>KBhofƭaxjhmqefqqcƮƸg}ts][?VaM{ʲr}sjkn|}UD\H7#?gX:BjG~wy\Fo_gzpN13isoϬhijnbjb|ro˾mu`LlnSDK>(G=YҬ}]sjvjjm_LOVVtfV8Xx{|{vmdn\KiiOewɟ~tgwvvuyvu±ǿrovniouZ>'j\MbU}wWIG2G=R`Qkn8[nvcZeL~iakv|W:K~lMjzڵƾsk}rvyJrnRaIQB.@LweUb|vwx`PS[m`Wal_`;M|{_gxj}xmnvnP:{c^Zd~pd\Tk_^§{nqgYS\cqgD+JlL7[iڼôn`jbdpnn\ibgd-gdlju|sniMaH[KBZdubdxttgmv~v~wxWdֿɚrs}mzmfikmX?-jaYVfaNI8UEo|nIXlxjU_NUOXdssWznohW[BDgRvy{VupiaVYhF@IXgaL9[ufUsxзwtj_xhhiihla{zux[;N)NG8Uk~ϾppWHK\fdZ_kaiRWznrhvmcea]|qdORPN@3B~wmol^Skz}ncXf?56DSO?-Lmk\x°whZhRRMLHOpuzsM~klwbGX5_YB\rnxfY^pyxmt}{os}|vyfe]_xgT;?:6)!?zxumɫagHPuVnvzbzttlW\[@;=P^\J;Zspc~ӳ{~nz`cb_f}crcU[_:V_NMM6P}mɻw{k`ct`\@Ngxxtk}spo}aMiQIGFAYR94e}{xȷsVju|khaxwxvwMwCLV>+8\@&3K`]˛мj|viykhdkX\|pp_iCSM=iU>$LY`Zqikmigctj{xdGCjX>I4)FAf|vrƳӨvrrot[;xqhpuRixSGVeZL.+Gypknvstvyvrc[zpYcd|÷ígeWB2QVN4/.eqdih~¿thQkYMWWLlg_oeonKiY\kUQINE`w~}ȸ{jikUUv^cf}uRjs\=S^<2(VTqnsĹ{ela[\vJikKiy~||udPww`zqbcqG*[e^^yzwu°spkRSqpssi{yZ]_OE51WL+,VRatvUbÿyfzxcfWslsmN\\pqhrORY?+MnUdrǾҾptz|vZhwUll~p{fgS]t{R7AIMPE LT]bué_X~~ig|pr~zyikyaKR?@JZF=auiqkow`\{wjnmn^YczcJNPJ:S&A>sS[lqzmertz{Xt}G42:0>}hxtur_~yllfZq|yd{qmM5A_LxӶeYv`ews|vrnuxoo]`jzk{]gqmJGvŸoYe^[BHgrlfbgTr~VpQfcP__Y@Mrl][QFFEnshXs|\SfuFh]rz}tqtr^YYYacgcMrjTdisj[z||lyqXRfyÎèŸhf`IW=gis}pjICI`[jauaL[W@Jn}_=[Qt|znENYhdNmfq~{m\ex{uYro}`~t{eUhg[wwx~ɽms]_jrp\vi~l}{fpxaispysͥ~~waMYM;L|pblhdpNNNBM?jmt[M][[9It}m___FDWJ]KqyszbUyiqh|~snrjynzzzJN^r}xv|jVe`bPe|{}nmdĨj]IX;RYLLIw۵ol_Pfzb]^fOXCo~Щrkpw{\YIjr[VL#3MH9CVM=JU[XsQ~l}k~pceSIIYF<@PS|{uwwwn]Ogxlk|~tvu{js`h_Xck]6phqzĠ||v}jlaaZNEAVnq`I_cnnfupZc\it]U~sfgq_Z^ni=6ctl¬ͦupv~~[}o^[ftmhwzdjv[dnyaJb{meKpeRIXfJ26r~uuਢzboeb`NLE`sjS_o}}sUxc|_h`acsiLOal`lpwm\qdJCce]}į£uyl}yciRZelpvxVf{|z˚nXoqPNSd`\blun:qrABKaqP9']~̦ۑ̐yxWsm{|sTJD^sytldmupv~wW]s~vNFRqhnwVCTD37nskƢy^e|noavYdilo}zUiyv~Z[fTSY\^kihQ4{aPaftv_PJv}sݸ័okvokr|wxrrgS<>EX[[kejvqcz~|ouypvyzfIay_hOglUT\F;Ct]uțwsj}uXWx{zRui{ovhlë{_qkGKLNFKgu[{G[g;KZbk_L@8(/_un\p}o`hx[iimvrNd~jzjQm]TSTL[z[f>ByW\dkfdWRVpp}y}ձronjlqp}ukQIRbd]]j[tty`xwryzzjrwzjYHkacKkk`SREE[]WͲü{ilZg|mUu_vdm_tpd\QU\NNZw\_vBhM2/%5csn~`t}iSp`calx}eE^ygeOnbQPSE]|[bA8x^VVgWXSQVfkwxȔywjnlptxubV^ordhg`\}aprfkrhlsn[Ka_bRN~kYLLI\zeVj˾Ť{~mogcw]lXwbhcb{ipr]Y`bP_jg@r^I`;=OoceYK?CQ{ҰӨ~vqavZR]`Zrk^~~xu|so_IozWr]G=,0';c}ufvcJmeZZiuv_DTymxcMgeMGN>WxZ\F+rdRI]OMPPYep}ƬС~lnom}p|lbeq~jsneSlnw\\}sehl{y\QIzhZ[AmofHNO^xxbeϯ~|~tq{gfkxv`sY}{_k]f{yesi`Zh_WjhGezX|[\u^Up˪{}znkyt{bjimf;6QUZU?PsVOulv^hvdnrN=e}h``uxza^aglyzde{mjutXT=1xpxb}faKy¼R6Dzrj`sxuerrm[dSDG`rueN@F(c~rzmfjvtqyy|Zw{~TQc^QF;^³~rhw|fyqzͭʟxdaqrgO8=;=|}{yyvxlnZ2uqd[4HTVNH;nkQTVVIJry^lTSwgaxǧulyrwfa]a`9(DSWULXva^wxkgppzpO;S|qok|wqTucry|nbukbcx~lXNM3r}eglp\s{~W7+V{z}ͩ{xvwujcfMCJdnhXDEB?}qiroz{up}uNok>IY\RSVyzupexwwdgT^wob~uh\o~jQc|Ig^kr}}\_mob[^kwPmq}kuid[[cyQc_gusWTdu]H]dkbͧ~Njssnt{lauztjbhk~rkwwmenm_c1A}pR2jglznsmXtnTm|rÆ[PVL\M7+-Jjb;IovWTau]vPysYexdV{e{xkx~XKEb|u~{yn~qp|}xY|vrdzsd@8Yl^a_NSjnd?NJY|`wX]goyVT}veLb[_^gZrR6ohuX^ybTqruzt|dNSQoe{ޮe2dd[@dsJHPg]SjSERpmunrrruqgmikyh{ielp\TRdVP}tsvyMO~wxrnǤmmP7Hq{P>L_mT:IQLW\jNveKI__gSgdUjzh\nQmufqN?aɤ{l~|u~j}ptfexxlrsoYG{e753S{lYptgcTZP\Zyw|o~nm{m|quyu\bzp̬tqiLB\Uhlft_NOhRN~zS\SMg\ETwtznVzvilwVkilzvzs`vdbRMeq~o~jYomx}azívh]bK2AXoʯ|VsbGCAlmgvuRMrpc~xol~r|r[_hg{nubVYO^NpxldNlymڧk\{|p{{z|pudbC8UNIUzsJBW7W}osxiZhiztvzg]qjjcS`Kirlwl_mmmgMieUH`\\²|[y4I~srXZZCdwphʮlKftcskcWwwivlvs^crenUXa`z}bWfbp`kzwswhHgܛVXn\bh_Wlzqqyur]IMR8AmYzŞWqSNfp[Z{W2;BJtz[kIdtt`}hn\sM2b[hwuÛv}}nj[yzoPXOy˩~anhB -8>`wwֲt}s~TDqqZs]1L4>{iWi~`r}nr]~[vr{sN)Tnzp~ikwokVl}xl[S`K`ity`|xgdgQr®{jlvhF_A5K6pkfĨɜ{~cys]]hg;J|f46?[pbrc]stgtdpdb9E]^jcƞwstw}~t`{tcveyžxY|ik]tG62RaGnªv_rpRcbji__@K3r^fxqqv]~ipytdILQIE`ȏwrwlqg|f\kw±Uqdo\?]i;=M]tn̷sv}]_X^bL~hECU\_urtumW`zibo{\8aXbgzwx~ipiuaXtcXUbRPH?J8^yгcz[OYeNDmYQOllzmvi|lpwyfYe]narI>Sg|u~ngqlx]|kn\vdj[]jdG$BWP`vǩtkQUHjag\VJAywz`|uuv|]kZ^cfXOagbxz{{~zv}iv~gVT[]5\\`^Ypzqnwp[}wg[zbHPDXKJXFKAB\kgw~`vhhkVW:[rinnv_Xmojkn[sVhjdnbvxƯyl[X]d~|pzyw}wLb}pmaWLckM-(@bH1+x~׵ʠƪy{ghS\mt{}}~oTffgL*DP[gCB\e_s~~eb]xe^~tz{N^mPZNfsJP0SNIgcp˙oqRLPZwfeniltpi7W~hIIS_L(D}qj~x{xyped]dtyu{~r|OZ`mV;$!6_gUOwtpŸշo`tapvbJZzxhj]w|ZMZu_YAChLe]hmzϽxkZcj{zakowiv`sE2_wb=1.OG,*SbjirǷҸkSqwwz}iNqcdT9AQWh`H^t{||jLswZ_ibIQygttkzUVOkdOG5lKkzx}rż~ɩpxy|me{bfiw~|vDtgNQADC=DJK2Dgfo~̷̱wjhurZHplhd~gxnj`|r^b=ubCXRbYcoz}tmkwxtblZn}\4AwrM139N3$@c]mlӴͯ|}{oY^_m{wv~ovwbWDLY]fWH\doo|Ơupa_lrdEWsuZ{h[oUVZeSb?Ju7);S]jvĻÕymw}}bqy}ds~bx}ZXmݪet{Q6ZnO7Cv[=Ua{|w^e2&hWkQGV?emwvѼ·ya[h}\dqzoOLe?mj_zlqa=b^_Qaxpogz{xjpUIbrfPZq̤`CIa6:W?]>EJ^nit^dlnhMf]TZ3Q^hVX}}{akwedrUE]WB99ebqxlgoyUqr\c\oo{Ĭӡz~}]Qeecimko|ud[bYG=gZfo|i]|vXgsx{n`]gN-MiaT=;omi{\Pz{pujf[s\hnvgnƩ~cextxvhmq{i^pO`P^_O[WZKS{ccwuYUzadnxwV?K@4>Hu_rr~u}s~fmas׻fa}ofpi_Vu{`a_}usrpJJ9\L]ree{j|m{ubow{Z)FtiKHK{}ht~petur\HeUc{hs~zXKhlnr~}xgr]g\kiBSafTW{wXbqpbh|hXSbfNEU\RNSvtvs}qpu~brSw}Ǥ˚ob|r\`jkb{u\dqvaNJLzikmvnlvfWuqgosv|yp@'KfZGPc{fjuyw^\xnpvkbsOzrtʭ®}wv^n~vvk_|rqvvsn{hUm^eEEfveFNybgkiTsyw]aelZKTWVWdv{pyyoctvtous[enORgwgb}hZUYuZ[KtrgrvupzjSrzjotttwU,LyrD>Moizjnvse]nyjsz^sTg}zwwǩ{`czvumzbt}rwƘsjsgUxu|Z?ZifTJjn[dhiUkylb^ZeZNLHXapz|zxzpy|kx}_js^_`NSef_~_|bOQimiK]ziupe[lapriYmun;=iyTCSloize~mfvqv}cml[~hmyy~aSryoiWaywxIJ}XnyqGXrwiWS|aXftsedfWPXaV]WU^_mxm~tn}rsnqmzyZ`Sksfrv{y\W_[nz`[qxsW^Z^`N}emyqsu~vIKYbM=ZW]{|`xv~zo}}ytd~eesdpv»vX_kixlbnzmz{vjwzwgQPilS^suno[Kwzhr~vVziUekfIA\_|ymszyux}xxxpu~r~}nqmd\Yzzfupog\[gxf`tskkr\[\Rydk}sq{dwvtQESjXPkedeqqzq~wwvc~kt|bo{zɥvVUzpoo{}ksvl{|znwzptTRknO^{mfmZEn~nxtW~nQ`jcSF\_xrr|z|}wsmyuqtŷìytwochigSkzjsrfwufcms_wpkm|gO~kI^_gtyYn|kzcGGiqWjqhnnozpzequun\xxkÿz~aLivm}ysqqvhz{ywgeRctUM|tYdaDb}zu~Vu|VXja\P`_o{p|~tkpsf{vĸ{grxs]]jtVctlqqbm~tntz`|qhmpMqqJSRfy~PbfuiNDhzansp~suoyq|dny{pYvs`suybMknl{vuzqxvj~|alYmtQQqP`[Hj}w~rY~zVZh`Z\lYqwtsjsk~`ws|nphti[VvrReiltj`uyokqoiyeS]KNJsoIuqhtaNI{mfqoxywzot[x_kpudd˴xutz}oV\q\srs}{px~kxwlqfey_IrUO`K\yvt[tfVea_Ww][wz}v{ksjnv_floijmn`QgR^agrl_n}u~xnuksnU|eNLAe|NjueqeYEum_njyw{}jv[zaihqd^ȸxstxwpZ_pOiip|vnzkzqoupo`OyRMXMavos`}i\h`^W}XUlryy}zkvlg~]b_o}uirj`LmuM\Xgqg_r~xorvl}g^[SIClw}zV{omqeVMy[chk}{q}zn{yc~x{^{yfl\gõs{vtmUigJdcqyok{{m{hmtv}ZW~PPQOluipeofmb\YWVdnuyzyi|o}jypszjg|v>j|svfSgnVikznytlvepqb`fYc}jrn{_idhYTgjhhwqjkoxisb}kmwsu~waxvalbkH_nVitTxWbX{}~lyuejqi[c~mtokxRMQLQMtWomzxq||ku`|zaryiLhapaXkYbgjna~~x{`~gqbrb}tV~|eoeo[bkbUcvmglwn~|}|mxztwuvs|uz}~ylwhmksH\_KdkK|XeWtswygqtf]iivz{vsr]\SIHQvZj}f|u~x|g~evkQkxsuQtilWQo`^bcl]rttlj}kieuk}Npy}iq``ngYXmfjjwxnuu{{w{c|quwyx}lw~jrkuRXmLL_Ed]^Znlǯ~rnpg`ykoxjmxlWtMKIkd\o]zt}{jtmitSmglmbrpsdK\hYj`l\appgjoifi}pjW~ypYkfdUmkeaxq~~l~x|ozbrt{n}iv{omnu^Qo\JWDIdVTestüzs{tjyp`oxiruuY\UQmjVswVs|srqcoWhe[Z}os|mPZhUaYk][hhfdyuumr~qoXvy~enehWnlifrvfyktr~lgoy{py_mr{sxtrs]\q[HRASyWOLllqy|tqdlqofpvqgbWa}kYv{jVys{rnbhS{`XX}vmoVfeVZWcM^`i_kzry~yp{zej}iwyuurjbvhlh{gbnxspinjrztxs|~x~n_lisj|~s^rnSJJ@piMDRwoaygjppp^rqirfvgb}ej{qPh|k~ztx~}ghZnk\St}ijx{jjv^_WaKLU]b`vmtsuvy~uhljv}y}~nrrkzl]hmhdkefhzszt{zxcleocyy}~yn~x_MMEnkOCOoeWjv\wzzubtyhZba|pqoquRfufwu}|nvx{kiawp`Xx|e`muvtmjafOJNTXXqiqomjuzìsnmt}zFRzhshRUv_^yeE/JTgpt>XH>Zf]hrijKXzŨɭtwU#aixq[{cPljUqgN8ScczǸJ3xaE?D=P5Ellm{j[vtiopuhpcYXj{$V_xy{bpmQRsvp~3tVShJQTQqb]vr}}kSyoGy}qh}qlunqŸsWaqԱv|JPEMB//faQL]Vv}sZ{dmnvPOaeR82a6bznvo|y|rZ`om\tYzozhIKjDv^`v`>LJNK0Q}ayhĬкvcnhªjw~}rVH`fjlV]OV?WLGT>~OlczR}b]S]\;LNTB2.H;S}mvq^uvpjy|k]Xvbtv|Y]^\nEE}^zkzsslddfgpojowb`hyƻaj_cg2KiGhEqvZlmnsggdrSN][Z@>I_Kxwp|j{sKp}avPxmyvpjrrgNJ`sflaj}eIZShc:owkgÞƠ}njox]hgoVQRx}b[]WjA5hGXGP}IrjoRoRYS_P2EFP559dMz{s{fqncp|eswu[[fwm}YfcpsEj}d~_pivweby|bwz`wv~_cjwc^bͮ̿vhmfyVDwYcSZUu~^~^genaJJ14FmQywzey|c~|h`jvcVV~~qglhv`Vrvfvqcmwc`dwlx~_k|ww~zgUbngTXxŭƥy|rxjNzqe_VbstazkiihkFHS_F==i]lqo|vuxvbdmrWv]lv{yoO[ecHEUdpy`gcifMvqtg}uxjhsrsx{wznKT_`EDVivxnniKkt^[GeXlqYb~e\^ZaC9ER@0/VVUizvrjku^dprUOZiuxrrnVvrq`tvgtq\Wx~q}rltiixstuvTWclSKRpå~dstoU[zoe~mokpaGQ\W<7NfJn|yw|wzs`tg_nm}hy~twu{\Q]fQ??i`i{urolm]bzwcpw|neps²srwvuupuaJU`U?=^oa{vi[zkZ[]dmoVj~k`a^cF?KU@01ZLV}e|tylkr^alpUKVbzwrby|sbj|enyrYToetqltl~ycpymolqZLXcTDIuryβvu|dyd}{xcxopmpQOY^F:AiMjm{z~{yuhuu^\xqcvprqmNQ\\D;NrTzzurk`{vjqs{ha}uyr~ir~mlilXEOWL;@kmkèzokv^j_gpiTizmab_cJ?IQ?18bO_kwnl|ky}y{]XchSIYh|tjz{ij}sfgps\Tfh~txf\ob[yyjdfecGLX[IHhrտx{ofxjirmmmeKQZVA=]nVy}||wojmht_{o]d~yiihi^DLUP?Cluh~zztmnt|zzlu}scgǿtmrwkXlzo`c^bK@KUIBSr˾xp{xc[rlaSmvj^a]`EBKP?8MrU{}xri{nixqspoSU`bRQst}tszwnqv~}~~v^eniXXu~vxiqg^p`N[oj[^\aSBNYTM]϶tm{{n_vxjoimTLUZJBW{]}{~{{qotfZ{j\Wqug`c``EGQSEFki~zruzuvjqysdiżrhjo`PbogW\W\I>JSKF[s̼}x|l^vk^Vovi_d_bHFPRC>\uY|{|jrbh~~nnnngOV_[PZƽ~yusyth|v~x~i]fj]TilvurhxTov^NLchZU[Y[CFRULQ{|ԾssdomqnpcOV\SFPxcsz~|tr{j^mj[Rgqg[c]aJDNRFB`}bw{~rryiounagºrdijWK]i`S\U\F=GMCA_eɹ}|dk[^svfghfcILSN@Dkb`w~xpszh]n|ugpjo[OX\RLdgômxjlxy}yy_`gcTUztj~vjyaZvfSFTc`P[V\N?HPICWhǹȵv~ni{xqyqv\U[[LHfpXw~qzr^|xaQWkm\a`a[CGMH>Hp`k|w{ul~|viorf^sl|y|^ry`OM`fVU[UY@?HH=Ahkb|mk\ewwenkleNRWOCLpYhs{orwe[kxqdqho\OVZPJbaoxhfyvu~v|c]ccVTsv`wlvhTmkRBGY]LUVVU>BKIBNwjtȻȻ~thtp}tykX]aWM]zZ{x{}|tbj}hUN^j`XdZbLBJMDA]qVs|mm|}mhonbanu~pZqoWGJ[^MUVSU=@HHAJril}pj]fvvfslohQTYSJXw\pv|omv`Vcqk`odm]MTYSPgeryzgar~to}q|g[acZWp_uymm~mR]kTA=NXLLWNZE@JOKPsk|~lk{sw|s{a\baWZyvdzs}r\qt\KM]bR[]X^EFNOJTxokrtfm}s~}ghmjdny}}n~bVndK=FUSFWOUQ>ENMNdkþxv|e\hunfuiscTZ]WVn_~hpkWRak__k`lWPY]Y_pnp`aqxjsvox_\ba[bvkzu{q|xdru]Ka`F7=LPCSPSXCISUWjzɽò~rfp~yps|q^cfa`uf{uvx]bv`JDS]RT_TaNFOSQYy}hqtcfv|o||xgfljgqzz}|{k|y`QhaG:AONDWMVTAIQRUmmyy|e]juljxjwfY_a\_zcz|dr~eQP_fYegalUT[^^k|||oh[drpgznuq[_b__saxz|tsvhiwhNQeQ:5CNDJWL]LEOTVbs{jm{~q{z~eeifdrm{||t}d\tgNCNZTPbTaVGNRRWsatb^hsivyr{bYWW^uyfeh}~uqxmkzobDM[nl]XPOhaqpajopuoyilw|kvzjl~z]j]iR\}|x}ixxvy{yrzimnkmgzb[aoynw~mn}|pl`Ykoriyu{qk|pUK@@d_@KAKSDMVY^tdvqt|{zsqxm\Q_n~|uzwk~u}z_hxlkyŢ|WDR\l[h`NFabNGSefg}p{v_]XT[xijzuvudsomxtwzaARYrŬu\\n[HFT_YipdtaTRNO^~td|gzxqskbufq|uzenhQ8CVPUk~rmpoqtu~|ɱ_SMM\̞zt_bfWkghx~fdsfQD]_SWiyvuumpqqwbly|mf^J\frtp}ieq~{utqsdc_H/1QV[ptc`][bvdJ~oXmwrjh`Umj{u}mmz{yl\[[f¢}tv{hu}~p{vfWRFJkpùoZfnXHLY]ZqgdoWPPR]uiqmgwztpqdgsbtvth\fXF8Tifk{vtuv|l|xquiQOTb~{sane^qjp~wagm]KKih_boxq|t}pssu}|`cqum`]VRswqwxght|x|rsuzfRXM=1Kjmtrjgdfs}T``^nqjdcWdxrrujozxytxv^]amtxomlaij`ROJLqyzeguaOMX^Znj_nZQRUaxmkrcsyuopcfs`pvr{~dYbWH=Xomp}|zzzkzwȽx|y|hpeQSZkžwgvhevouuakk\KQmh`eqxrw|tuuymer`lne[ZPZwup~rfkwy|wstyxr}{pUTUF78\jkxxuoqɻrbSMc\jr~~qbpxnlmy~l[fu}zz{maz{{xsh[kVy[domc^XNgipti]piEB_jbyndeht~mcmmrirgWFXi``m~~iVb]aovqokbz~xixwywztst~˶sTSRmSM[VL@Sf^^l~~umfoumktwoidWimldOZ\e}|hxoaa`iz|rz}ve]k`zyscpxwmWGNqʼnqmfZPK>NVQq}}jZkmdl|{sqnsus`O_[q~~o^_tmdl~zv}|ĺwZ=ERSd{bVNMUfcDn\]gjbZPAOMLoz|hnpcTMbaUYixzyyd[SXk}wki|n}z|}ʢo^FJTQ~Ƿt_JUYIEQafqow{g_YXcwx^nluvojcXkgdmWIZZXhsnjn{viyyleuhusu~tzq[OIRjy̭uiWYbPeuy}zvhT^g\]l~ztrs~j~{naO[]]obtuggt|~|ybH=PRUklaZ[foTLsV_fe\UHDTFVszvjtmbRVg_V\kuywrbZV`vy¡xkq~nw~udUBMXXŶzgT`cSNWcgsmv{h`[\i{w^ojqtnibZmjd|{hTFZa`mztqu{gx{~vkcvnuxsvvt|nXOKWqǻ~rd^n]by{u~wiXUhgckyzxvv~wttx|vi_QSid~{il~vmr~~~|rr_N;Fahs}ogdkvsOaeS[`\SL@LYPk}nmujaS`nd^eorztqyf\Zaw{ul}us|{ook]QHDakxxgZjhZW_ghy}gvrc^]fzufggoqkg``uin~puj[LMiru{wwrsrx}undlutz|rrxxxqcm[PPZtͦyoblr`r~tuzlaR`ronu~~}{zivjnne[TOjtxuk}us{{z~~vfi\NAFfszxqms|{WZmRW\[RKBM_Tj~pnwmeXapg`clnupkvf^]g~}wpvtrndebWMFIhn~mdq|vzoeehtb_{\_ghc]LM^Ztsszyjjsh_S^vy{u|rhs}{vrmyceltrgb_ns[fgYUWe|z}pTmX]fb`mh`SSknmtxouuux_dki`ZQ_mc~nem}y{sepkqtgnj_UPhtv˺Ŭq_nk:5=A?=8DXM`{|yuiTTbcirvrvsqvolqqq^ffn~zpfx}okopje^g}v»`NTYkfV`RHEGTb^CfgW]b`XODSSMn~qwwlbVfojn{xmpĹyrim~pzws{yԵ{fPTTNwzp\K8@G>>IV]oyclsf^XZepbVg^dhd_XXkabwcWehl}yuzo{lryickyzpÜyk[MBNF9R`hswoflj^QBMQKQ`nsn{uqovni~{uk][gYgso}ztyw~wqkyqoUSZW`xzk`]cgUH`Zd`edbyurpqsszo~|{teizghagglqkw{zy~d}{zmXQ\JSzo\eboroaVVY[pwbjn_pd~}ounqchz}gy}b`wvsgmqvyyzlu{oh}lk~tu|YOfgPVjvpqVnqlrpget_[]hng~}tu`vn}vbn|sdtwo~owumh~{ppvg{xuj~~dwy}{poz~}up}bK[s{c`hjw{kcuqqc]Zj|c^goy_i{ssbdv}erps{r|rxkppmkunf~}yg|ov|yezvy{UR`zskb~qwzgls{s_UXgpZ[mrfZv~{m`e}o_y{wzsvrn|r{nkuk[k~{lh{rsx~|}~{uqUXvwjtk||xsdfvzfYJ]ndUxooX`vl|fditwv~xqu|ttilmn]ax~iuxwp~y}tpdYepimlw~yylge}kTUdnQ]jmalnvwhlxfr~zi{l~wxqpsrkY`s{lxuq{vtou~tj|`^nlerc}|pbgykMhniPsjq_jewtgt~jvqy{{~n}v~urjqs|m]i~tz|{z|gryo|~lkl_`jefie~}`i}lYpmjMr}eqbjhw~t\u{mtum}~pu|x{~zxds~jdfxq}xy{gsvvxifvj`blhmkl~_kzk[ploVo^gdadzzn`rytql}{wo|}~}sZkommwz{vyyitx{{oeoha]hglsw|hk~{s[knl^j}[dk\g||rdmtsqs{j|z}y||Zd|{ppouwxwwwl{{w~xscljdadet|zvgz{w]kkilnykYm^Zy{xpl}vk|r|usv}nu~eXl|utzwz}zxm}lyvxn~vjjcfha`m{~gxygklfhwssddmUn~upy}zjuxo|ywuxnovu\dwyszw|{{}omvw}rxf{usji^dne_lyjwu~otpffz{qk_pXe}|wr}|}cm{muzynkqyaaw|xx~{wm{{nuuuw|xeupplgX`qlaf|zoxqswsfbzjpap`c|ysty|cm~quv|x|rkoxhgt{}uytro{pzrtxxvepmlifT_rpam|{uwm~t}tidblbmeitvrwz{`o{swrrz~olq|qkhr{y}|qx|nyurywwr|fmklkaRatqat{~sszusgku`ndmlpsuq~}{vbxx|}oxgxpnxwqlep|y{iutxz|qq|wofhjko]Rftliztntu~pjzhbnantouuuy~ki~{y|~iyh|qqszrohgozwxo|zuu{n}{}ujbfkpgT\lqftr~}puyvmr_licwvqur{vyhzz|rvuatwqszwrodfxypwuzs~o~s}{{vqe^gnm[Wbokmnnrvw}qnl`q_ipsqzwmry{wxlzcxuswzpsneh~tzsywtv|q~u}}umsaainfXZgoirhywtyxlufes\wkqqw|nz{p~qlixutyusulcoyqwxts~|xr~}tm}ju_`hn`X]jooqdzq}xp~ehs^~mos{wr}{|p~{woivwvxqsuncs{~vyvssx}|q~qgxgv``hl]X]inwrfzmxr~hgubolt|vw}}o{yz}qhtyxwqrtoev{~{|{}vpsuxn~~m}dz`td]gj]X[hp|sh}~m{{vmcsi{ujqw{}z~qwxxuhm{{ynpushs~}||yworvtpunwhz~]mk^di^XZdozk~mu|wtclrx}lm~{v}|}~rvrvqpew}|potwmq}y~{w{nn{oz|l|soqkg_ne`ga[Z`k{pwmx{zzlcqz|wh~yt{{ysun~hvhj{~smtytp{vu|~slyrpq~||n~~yjxq^em_cb]]_fvxmswz}tfj{~i{ypw~y~ttmthqocvwnryxs{s}t||vmwrn}yz}~pz}xkspd]leca]_aft|qruz~xlfwnyynsz~sslpmkteo~xory{w|q|t||{|ynwsmx||z|~ryz~vpqkh[khc_]`bev}srt{~yogvp|wjt{|pthrmiugnworz|}{owyy}x~yq{~qmwxyys{x~qsngjYjmd]\`dgyuqs}}yoj~wtsix}xpsezjjvip|tqt{|usry|twtyomwpvx|x{oyehh[mlaZ]aei}upu{ymww|{z{lj|qtng}hlvitzsrv{l|t}|xv}w{slo|m{w|}y}rtu^kb^pl]Z^ccq~{sp{~{vnv{|~shuvptewtfsskwvssx{uqr|}qz{yxnmrzqzw|}}}{xo~ebm\gsdZ[_bhzx~ypv}|t}~x{xjmznuim{mhxnpvtrux~k{{|ut}~||qmn|{myz}}y}ozw]hh]nq^Y\abqw|vq|~{xt}rhttosew|xjkynptssvzuqw~~ov}~womouzs}w~|}z{wom\jf_rl[Y]aftpts}~qyliznslh|xximzpnrsuwpz||zov|tmlqtwwyxz|v}rrh\ih_ql[Y^aisotp|tjjinitn`}|ujl||krgm~y~kcmt{voqvxy|yqu{}tquyextlgp}~xz{t|mr|fZfldutechjtvsxw}{|ujzqt|znVdrufaknbsos{{ypsy~rmlq~jisxyzwwr|osk^bpgoylfkp|~{~qlb_n~~vqrvovd}{sijxosehrehdXnv|z~~}vr|uf^ixnrqg_]Ye]]n`SM^`ZgcYZ_ipg|~~uisbZ^X^~rvrds}}wqv{m{vuviikuqfcbovrqg~{vnyzq~qhl~xx{uyyr||qox{vpnp|zdsrgzrhcmywpj\ld\eidxyz|nd_eifpaz}{maV_bXjh\ROaf[ef_`hsiw|x|}r^i_SYccpmq{~zxrypktwjggn~whbakpl{gr~visyqwpiwxz}zunt{x{yuqqs~imoqsugcmw~xuj\ld[allpw}|~kb_gbbsaqueUa`\oh_XQ^m_^jfckrg{xu}~|l`j[SXeinsw||{ztunp}zrgfgptgcfqgnxbuqhwqy}xqlzww}~|pnu~xttv~upimztochsz}|xwahl^\conqx|z|vichgYjh]zt^^d[nnd_XVgm[`liiqfr}ytxz|zveobWU^hfo~~}}|}yqxuptgefm~ylfireiudgtjunz~zuot}p}{}rpt}ut}wx{vvgiuyrdisy{|x|zdnna^bnpht|t~{y}{ojpf[iaYj|fiebvphc]Yfo][klmmbu|xxuypw|wnuf[X^he`rxx~|rquyz{ugefn}|pjntdipees~u{xnukz~{wsrpt{ztrty~uh||z|lc}}szwiirwxxt|~iqqe`aktkeuutzxzv{sq}xlid\qumigcbpo\cpolW^ifrknt{sl{xuz]ig`_blukev{zvjeuzi{ogb_dypltleqjlkrujtx|vw{fpYSV[bh__~iitwyqppmilz}ujgjuujx~x}lbhkcNENFMQVljamvxkh~}vtrnkouhcszoZegd|{ssuy}wuwpmrv`SOT^[MXkju}{ywwz|wk`tgo{hYSXfyriqhpvrtw~|`hlitjdaa^]ip||yuv|pfrzhjlihjlnrxqotvp{zfZ[i}t^`TS`Z]lg_ovvn_rzutstqklsfarv_`mfs}yyy{|tutonptx{ka_dkeX`uvyv{vstx||vha}}foqeZXctkqlgz~v~w{|quiapjvunidchtku{w|ux}}lmuwbdnnmmnowrszxu|{vul_[dvfe\Rai`amhfvzzxclxuuuwwqhlrffvjcpio~|{zzpfqsonprujfhmne]o{o{~vpqw|}xldv{pkii`\ds}oumgy|u{}~wowjgphr}voienmosyxz}}qrs|{d_otqmlm{wx|~u}~tkjb^fumn]Xgof]hmjtzvftwtvx{{tijtnhphoqfq}zxkdrvpkip{ropqqhaqvj}tnry}|tiovsvidhcbkuz~|wwhpyq|~y{vomirgcs|skk~hzyq{~{|uvut{u`dvxpjfr~}{xifgbcksy||m`jsqa]koox{|kuxtuy|~ymgqxnjhttdiv|xveoztiaey|}{xwrgkxhvoqx}|vmutq~obijgkprt}|ls|lszyqgowd^iv}svmwzov{w{ytxwgfw|shcpvv~x|{kfkhfijltumtzwf[hspszz{zo{ytuz~{pho|vgf{vdgoyz|kmzxk^`om|}{rl|zl{}|xppw||vqzulycenmt}liquo]Wksnryzz}}xfkyik|~}xnn|limtliy|~}{\^yUg}}|tp|xu}~}}{zrpqmt{y}nsy}vd`t~z|xzvY`}ojlqsqkdj}wommuply}~~y}|onuqjmu|yy{vr|zocbdoynrd[cjpl\Wlxrpsyy~|v}y[jxkmzvnv|{v~~l_cfemwqnjghljdfhqsjr~wqsx}}yupzc[hu}~rx~uk{|uQXmgm|wj`ftlkk_gnhlzxs}xynjplbisqp~z|}{~qyvaOYm|yggkmmeX\qwmim}u}xz{spx|a\ssrz}tv}zvhfh]Xdos}vokmrqg_p~lgt~zsprvxvy|kqwq_[owv{wr|qnscQamrykfsrkuo`gsrs{qx}tx~}sfbkmcgtw~|}vpmnj]Qa|qjlmmlf^cvzmgsvzyvz}vonsm`hot~yv~{}xf[`f][jw~uonsys^dxfmx|uqpqrrulmopj]d|}y}z{|rkjc[aeqrmxulyxgbqzxx{}pvyou{{re]epjblw|u~pmhgcX^ywrrqomkfdr|qgs{r}zvx}~zupnmhikgr{}{tdY_hbZdvysrw}t]iwhlv||xtqponnyvmojllbg|}~~}zrkd_gb^qw|ptwgdv{wx{uryomvzwl`]isi`hz~|twrmegd\e||zxspoojiuymmvou|wvy|}{xuqlektdcu}z~yk^]hk]Wf|y||fg}{nkqwywtrpmkkwworkjokeq~~yqdapfUdwwz}ofsvtx~ttxkluyvmc_htn^`tvzw}zyrhikbbq}zutuqkqxqqqiw{wvxz{zywtkbrzb]nz}~||zws}rbf{ykzsnqms|ztomlljgcdsuu|y|xlmiqzzw{|~ymj}pSfz{y|sRPxv[NLVgoc[kznl{~}zuz|wxu~whgha\ciieYbvyurqrstuvxxrbg{m^s{uv{~m^pv`TT^bUL_mel}vmmis{vsqnifp~x|qtqn|zqhnwzrfu~}}|xkX`th^or_^WTh}ndbhl`Vfnekvvv{wwzw|y~}xmx}sdblqdUartqonnnnprsrgV`wtjt}{~yjoliyxnhjmeWakgq~qrtkv~|ywurlir~z~|zj_ksxtnxzgq~|zyyywjVYptmpvusgZ`canvniinocclho{zxzux{}}w|z}}sgssdevw_]ovutssqonprrlZWn}}z~||||tgmwu|zpiefjgbfgorp|sywwwvrmn}y}|{~zm^fxrk|tjz|xutttn\Tgx}}{ymjeZ`oouwplhglokidl}|{~~tt~~xy}|x}tw~~thq}oco~oaluvvvvspmmopm^Xk{}~wrmem}}yqlgcflmial~qr{~zuvxxtprw~{srxxl`j}wlwyoy|wrqrqk[Ylw~{mf_Yhuv{xspkhjrvl`m}zow}x|y{w{poxzphxshr}pkruvwxwtollnoh[`sy~}~tldcu~}ytoiehqvh^txo~|zuvxwtr{yx|{~novsedu}vq}vx|}~~ysppqnbYgrtwj`Xartw}yvrlin{ycbz~~{oq}}z|x~~yyvkpwqgr~ss{vswvvwyyvrnmnoi\aqsy}|~ym`_pwv{wqihs}m\nxo}xxyxuuww|{~qmtrdeqsz|w{{z~}{|~ytqqrn`\jnm{~~o_Valkq}}xqlq}dd{~yls|}}~|zv}zzykmtmfpwx|zxv|~xuwyzwsonoog\dplq~{~o^]looy~wokuu`lyq~|xyyvwvv}{}xmopffonr{vz{z}~{vrrrnb]knhq}|zfW]jilxxqp}sdr|on~|||z~vz{z{tjllflut{{rzxvxzzvroooj_`ooju~}{y}zfYcnmr~woo|pfssv}xxww}~sy~|||wkigdmrowzo|{y|~}zurqpi]bpnis|xxzeWakkr}yrq~ult~ylq{yyyuz}{yyz}wjdderyxnx|wxzzwsponh]bsrmt|}vrz{iZcopwyqoywos{tvyvuv}tv~}{zzyz}{od_aozx|oqzy{{yvrpnh]`qunq~z}{pryp_anrw{tqw{uvx~~|pnwuv{wu|}zxwvtstwsf^^oxl~}wwyxuromi`^p{vt|}x~|nkstfdqvz~{ups{yvzy{yuxssyxsz}zyxwvrruvk^Zkzkxyxxwurpmi_]o{vsyw|rjosjhswz~|wsv|yw~|y~}}~}sp{tsxxsy{xuutrnlptn`Zknx{wwwurpni``syw{wx}phkqlmvx{~}zvrvztvy~xx{srzvtz{xvvvtolpuo_Yl{ny|wvutrpmg]au}wuzwx~rikonsyx|~{wvz{syx{}|~ypv{sr|suyxtssspkintn][szs~|wvutrqmd]i{|wx}vw~ynghkowxv}}zvx|uq~y~zvzsvzsyzxuuutpkkqujY_xuvzvttsrpi^^p{vtw}vyynhhluzvv{z~}sw}y~}~~ypuvs{svzxtsstqlhkrq`Xj~yyvuutsnd\iyxtv{zu{~{qhceoxtpw}{~uqz{wv~uywu{{wuuvuqlkqtiY_r{y{}vtttsph\`qvqqu{wv}|rgciwyqq{~rxy}~}vnv~zu}}sw{xusttrmijpqcYet{~wvvvuod]hwuqsy~vw}~}vk`^kyumq|wp}y~vt{zyuz|xutuurmjlqoa]isy|utttrk_]lvqosx}vv~yna`p~xpuwry}~yoq|zzttyyurrssojginlaajr{~wuuusk_aqwrqv{vu}~{uj\[o~wpu~tqz|{sw~tu{zwsstspkhilleekqz~vsssqi^`pvqquy}xsz~zpa]pwyvr{y~}wos|{}}rrxytqpqpmieehigjnqzytstslabrzutx|~|ru}~{ywpbYg{zwoyxz|tv|tqxzvrpppnjfefhjotsw~|tqqqlb`nzwtvz|}vq{~|{xm`e|}pu{vzzrpyw~smswupmmmlhecdehqzxwxsrrofbo|{wy|~~zqv|}ywwumabv~|ps~~vx~~vt}x|umswuqnmmlifddehs|w|yqppmean|zvw{}}|~~st~}{zzsggx}quvuz{sr{twqkqusolkkjgdcccfux~|trqnfet|xy}~~}~~tu|~~}{xvvvoegwzpvwtz}uwwxqlsvtpmlljhfedbgxx{zspojbfv}xvx|}|{}~ux~{zzxpio|ws{usywpxzsvzkmstpmkkjhedca`i~}x~{urohdo}}ww{~~}{~|v|{}}~|ywvvrihq{~rt||wzywpow{{{|ttrnokgemc_\Z^hmlw}vwpppst~vrnqw~|zd|w\X[aroh^\clqpxwy}ywvz}|jl|}wu}{}zy|xspxknzs]qwptmqtwt{zvz{}~{ipvf]q{|~{x}xqkjpl^t}qpymix}hq`Vbolrpqyzsfitwgw~{{x|qjkty_mu^\eeaik~}m}y|}pafouhfrW[aGKWZVWMUg{w|y]ncdz}}|}|}jfnrok[i{{wljw_ngf}{umcqyupofyr|zu~p`bd~{icnw{vq~}|oZfv|~zl|ussdfenp~nswstxk_ksvyv`jfoabfYg}~togmixljdeZV_OM`f^l}uu}yyxhmfga~wx~udlq][f`Sfnzq{nqnh[gxmhyxa_lpu}|skqqv~jhwjcv}kmuy}xsxeitccw|rylursvmnruntwd\ll\jvhYc_a\nnqw{y{nmkgk~{xfgb^U_gbckic~zxyuntvmuqvsz}}{yx}{w}xsu^eofZmrr{uwzwrnk^gtwdmns{|zuflt_jtx{x{qh~ts{yf`frfj{~}nkzobszhdpkheyrooq_kxp`nomoia`~~zzahbb\ttqxlng`Sgvoltuz|ywurrymfox}{~y|{jk~tfkt_[g}}~xy{ilipiomb_poavvp{ys~urrakxwlur}ps~zsskdeYXjs{|}nhz~mq|tzrm\kwnfuwb^hnjuotq|uy|yuwxvkwkomqjztsymumplrii|||}~zqn|o_nr`dwvy||~zyz~zxpdowkbjmzjv}oevmjbvumqrdnuvgyykg|ypuq|wrvn^imbgpkwsxo|kfqrqwptosdm{whnlnuxeihpyy~yv{~sgkkdlhtxkjilsmrmnvtutvxxvkduuzszy{{vyvg[ahtWQkqn~ws~ojnlcl|ken~xi}vrv~wtwx|vwlmqjz~vymiZifcwrmikolrrps`qmoltw}rsvihhfhijwz~z}~}ujno||][iosy~{~znnn{vos|kwyqxx{ioezhpspx|u}prz{uuorr~rlyggiqyzqpwpwdzwzugpezvaZZ]okn|}~|}vx~zrzzojog^wtw{jwvrksilhgd]~itgbw}pu}rhpt}}}osmhyp`hWUjaaqtgsp~xtv{|nsxuisyfru|t|xvt~w{z|nglsapu`htxztyxq}r|wtpwx{potoazyfinipxvzzz~wkkojwm[djh~zuf|ok|hjxchiotrx}nosax{wzw{}t{m{^mldgg\rsun~}vx}}~w~zs|||rmwngskZqyfvwzyz}vtq{tm}ifugdli~~z~i~{xvzqryyh{sndcsoklr|{|v}xppqln`bser||xxuprj]uhnjj{qrumk~m|st{zposgfcpjW^mnxsn|t{ut~{t}vt~{mxuozgX}ilnxzzy~w|kpwqiibf]bxsq|~rortz~zzihutujsspjh}}owv~t~u~yvwxmsbmg]kku}~}w{pfll_jwxp{~uyji}wtspmuu}|v|nnlbcvm\htnxm]|vzv{|o{rmsehqig^v||uxyxytxnoxggmivbmsih}wytywyjvvv|kqmknnsjgy}v~~y}~x}pncijccliurwyxexkggcuxkxxj~{q~|pp}nyy|v}sjjhqpabsnneWjww~vwo|ys}kmreg]p}yx}v}v~x|vyxnmsut_heccnps}zq}}mtry~s|{ztdwhurwws{~szrzr}z|cgfztdYTXc[jho}|jlozyfx|uxmgy{xhaulr{vtwrzzjuxysx{zwo\\vslivvz~~krbdm`ptcZ[^ixwoz|suzx}~v{xfxpnxnlhkky{`|{w{tvys}|px|kpouacr~u{yx~~z}yqv}yhqvbhl`U]br~wu}swr{tt|uvyyzzykvicswvttr}{ntt~|i|mfzhgsejxa_ustvsstr_nqeuwjeh]nx~lzuw{yyq|owrtnbZalxtgWsx}j}~uwtmgnlrvlooykr~pzspxiujbwlo_vpgtj_o}}yk{xwdovrheskeutxyyvszwwywvdh~mkfcifu_n~u}q{lu{vmpyvnlyrzwkluz}zryxpjrm[PvtXVc]izyyx{s|wyu}sxogjutjwnqw|u|}~}jtpvzignjbimdbsoxxuiwwlprbtvkk}wr|m|z~w}|v}rqwvhswpkpaZqfcjrx}vzv{|{uo|{oruquyiur|wz}|puq~nh|wll{hnyiPeumfsw|t}y~~lr}wkop\f~key|l~~}}v{~{uzumt}pnhbqgj][huqp|{v|gvpytoiytlzwy~x{}pv}rx{p`neZ_aVblho}w~xq{{oiqsprquyl|}~{|~{n{uuleqrflb\cm`fq~z{{||iwnrnhyxnsyqyscxx}z{tpw|pprtlvaaoe_bum]mx{{xwtzxmrytoqf|tvvs~yxnvswks|pu{z{jXkxi_omlhxwy~m~ykxp_nmgnhh{~x|x~wpxxmohlvgg^bin`gtxyyy~urzywtm~jlrrsyup|twm~wgdsaacXbkf`mwt{vmjmhlf^nmg\Z]V`rujnuhrurm{~|}vv|}nlyXT_hqgeo{vkjqs]Su|~~}q~|g{y}qcbldnxirx]|dgr{w{{}x~wrzwf_ouh`fvrc_yv[~bmpvmabuu`lzdo~wx}}vt|uhm~{mlWmztw}v}~qmhzfxuqousrhphgu~iau{xytuvuYt|{kZb|dLf{jqn`yj{{y}rwub^da~uvz}`hcWbiaV^RyjYX]_[cUm]`knjTq{ytusdzssk^yxcywiq|u~|op{rbcdi]RW_u~pzfceydfXh]Zgq\idfkotf}}dhws}xy}znuhwx\kuwwlzwUa{qqiiok~{uglqvaUVouxspn^Zfy`\PqrIWjcUcX]dq]Zq{k[ntorsu}zqy_v|sw{dw{|xy{|cZernVNQto{vh`ze_`qRgwjdmcdv~_f{kk}uq|yt{|vh{jpytxvgwnSpwqkwta|Ÿ}hanzo]SV~s|x{r~m_[u{[TatjI]m\_eYYstT`ps`lvxunz|sx|~~q~v`z|{tweyu}xmu~]S^mdVQOs~xmcygVsxtWaqdmqc`|fiw{juvoy~y{|z}}ogqxv|xxiotZnrul}rwlw{sulYaqk^]T{qrui[pzgGmnh\Qe[ej^Ule^joblm}sx}{oxvrivw}r|pwwu{}}j_vlQO_cZ_Tn}nzcq|{Xdin\cdjyn`gmpwmnzvyyupn}vemoytipiomrmumn|zxdqw`V^gcgcl{`}wbdsq^O~f]bVX^qj\Yv|lekdd~~n|u~zorwxvuw}tyrxsgv}|xp\bk[PR\[fckgni{uo[y_p`\f{viay}rrkjsx}v~{u`q{jon}}{mi{p{opirrc}x|xdimb\Z__niv`zfgsjfZvpUh^P`smaZq|wni_dpuyyzfzv{yxwzuwlzrcvzpxk[`^[WTT[jgymmtwqonw^qgVq|uif{yobpszss}z|k_qwpstu{msoynnb{xlczzx|{neg`da[Xempuq}zgsmgjotgWlYTppj]gt{zp`Ztzkquki|z~xz}tyloujnzvufyvoa`YX`YQRfdvyxvwyop|{xiesZm{vngw}q`kyt{w|z|z~r_iywutrutwj{vm_vtjduw{yxzpje[gg\Rbfn|z{~y{owlhr{lmZhbZrmk_kqxt^Zuzoq{{~ljw|vyu}gp|qjusuy}tivrnedUWc^NRa`urzyqr~rscsfqwvnkxyt^jyxsxx}y~tefrsyvr~{~y{i{~p^qpjh{urwtzvqnfWclbR^bkzt}v|pkunki^jeokmblqs~eXn~}t{|n~u~{ukmwzxophvrmrzuo|rxnmlhgZM]eZM\[nusustqterxvpsiwvykbwyko{x~ogflsr}ulgenliuztq~vqpmn]Tcm`Wb_ww{zv||pnngo^hznikdtpr~f^r}|x|ui~l~{uojnzz|sqjqoo{qv~w|{|zpeeegWKVe^U^Ztwzzxv|kyliznqj{wvqfv|spuk||xyplfdov~wmqfkikws{~zzkhhmaQXgj`f_u~~}su~tp|ejp\{fkbsuovtdnz~zoy}jxq|~vuohmrnolnwryxotixk]^d_MLXeag_k||sy~yjznqvqisvxqs}~wpp|pu~z{zqpofay}|}nz{omghqzwwxyoouzdaggVRZijrhnyjyyuyzdlphvlbkzrrvxory|{uk|uywq|~~tuvof|wxtlkuyq}owanetaX_aRLR`gshk}n|}oozsvgqyxzzu|~umyy{x{mtz}znprlbuz|~}~qx~urhhsvp}szhrixi^edWSXdn|luxiuxy}jhtu|q_pztsrqr{|{{nmrz|s}mt}{qtxpj{|y{{vkl{v~qzvn~oejcocY_YONU^mxhz{xq{~pp~tg{|zxvs{}}lrpwr|iq|smqshkty~s|vxyphmwt}vuylukjsfadZUU\e{vq{mov{xjm}xfiywvqmo~~z~pknqnwxiv~rrvumvsy}||pmyuvx|zo}|sgurbgk^_YQOSXjxkyw~sx~yoy{j|||xsp}ylrk{l~nk{smpsjnmu~r~x~v{tkpvq|{~{vzovyqeqlebYUUYd{rw|xrqv~|om~tioxxvpip{{knirms{iq|qpusqtm|~}||uq}utyxyr{zrmopi_lfaWQPRUhum|s|wv|s{yp||}yqm|wlrgjvwgsunornrknsy~s{yqrwpuryysxovkdqldYVUW\stxu}trz{n~q}xpxwxrih{~{mlme~jtwiv~uprutykxyv}wyxrwmvx~||zotfpg]lk^RPQSZpn{}tyvux||~|}vln~mqlj}lqxjszrnpqswfxv{~xpzzwz}upsl~z~~|t{gpn_mrdWUWX_sryxryvzxw{zxxrhg{{injf~}pjxooytpqtx~lz|}s{~}wqt}yov~w{}y{woycem\aqdTPST[nmzvz~|w}|xmj{nonf{}wirvmrroorunsy}|}nsy|wppvs{oz~}|}p~pani^pq^VW[^opvsny{yuldopiobryypgwtnqrrux{u}sryzspsz{pzwz}z~ytzkws]aj]aqbTSWZimv~w~vt~yrhowkrcpxwwfpznjopsu|s~t|polahZW_it|{rlko}yy}}~}}~|}nfggqpt{zz~lqZmrmqxvxj{tmfm~yr~wwv|zk~y~||zoxiflwxwyyq|xcrufbptkxwg`bdpltyy{nxngj}w{oyqjtyhdw|ma\esfajwhek^]bo}tmmo{u{rww~xqrvwka\c{z|m\q]WrtjaYWcrnplfzwzuu~mqvvx|mz~~~x}stzphouzncmoeji\WWac\vyw}xwwrmvvur{xmkjpv~zrwtuuqtkdvp{qwyc^xp_g[UX`qsigivosz}ypu~zxuxxjb^`moypamzqcXVamxoqjdxst~|roktw|}nzxrr}rsx{~plruttvsuqimd\Zd`\tsx~ywtnjstzxyzzxokimz}~xqx|tvyy{iipbr}}jarfhYVWarrhfjx}{jp}y|wry{vr}}w{t{mf``gv}xrp|ziZXcmu|{puhewpqyvzuhpw}o|tk{v}rruy}tqvxtngm{mnof`ga[rou|xtmho{zpvxszqmkmu|}rv}~qwzpitcdugwpo`XW\k~zmght{sze|zttrw~vkt|~{w{~~yvkdbemt{|}~uzg[`jqvysvtcrtmqzxxrgoysvlpzywrryywsptxxsk`qomtmhk]erkyyrjhoz{itsqvpmnsyz|}~tz~opx|jnucgsu{|zvb[Z_m~{pjkwwozjvomowwityu}{|s|qiddiqsv{}|z~pbemrtvqzxguumovuwzkiuqwpry|srwwjiovxupdl}kowrqacsiswmhlt}rfmwsomou}}z}x{z|yjlwlhwkis||wwqa]_gvyqnuzmw}tsw|heo{~rp~zw}vy~||pyqulekqrspqpmvi``k~~nerrmysz|}xx~}qrm]Vbpy{yol{xw}seunjxxpmkip~~uqnlnpvzuxs{n|~n]OXZWlhblr{~{tqgeju{wxyecmsr_fuvq{s|pktweQIJMVckigo}ryvsvstwwuostv{kb_h|}qtppzv}gipyvVR[aa_WZe_u}pl|nhwllx{ma]`gr}snpt{{~rfcnvm]^j\\cfkrx~op~l~|neelw{zwtprj\ijslrv||txidekwmdabhnkc`hxyoyoluxxwuokywp|re`bnz~xox~}hclinputmb]eZa}y}~pr{lyrjs{uhaachpxpqu|zxvhbfson{jdhhhimt~snsy}wmjox{zxxwyn^gcgxtw|yn}oheeip}qnosvoe^bpztyuit~~{vnlzutviccjv|uzs{}}igf^q~~wifhVavy}y|wu{t~plu|wlfdddfq|vu{xu|{mfflw~{|w~topmheelwts}zz{tpt{|yy{}qcj`bw{||zwlumhdadyz{x|xkaak{x|yvzkpxomztu}phfiqxysvt~|xxpjhZdx{upr^^psv||wy|~yxmsy~{rlhfcagqwz~wxukghmtxu{|yyvqiddnxysww|xx|~{xy~}ikg\jz~vwpw|slf`\e~u}~{ohhswsvz{~}krwntyn}{pjilquytv~{|vvmmdWdu~yxyzvbisru|}v|zvxpuy|}ztokgc_hszz{||vkggjowyy}}wogelv|}xv}zqz~~{wx~loh\hx{r|t{{tmf_Za}x}xpnuwp~v{}{|wmz|psylwvnklory}z}zuz|t`_ioiWP`hbaggnynp}}}p~~|vsvopslagv||z|iqbz~~youylrsoy}wxw{{~sq{tcizyrsty}y}{lqjjmmkgcssnkmpfdp}~z{{uy~|~xx|w}{t~qjoypil][enqiXXkqhcdkyqm}~z}~ycz{{tq|y}wngqw{wpljhgjlfabcle\fpuvrmlrz~v~|hhzxusp}|oWozxwmb]lsikb\dc^dosrqtz{py||tvzqo{~{yx}t^]q}gdimmfWSdof\\hshn|yux}yte|~~uvy~rqshcnw{|uolnpk`Zjr]Zfosrnjkqwzzu{ik~v{stz|{~caqryrgmxmnp_\ghdioppsx{po~yyupx}spy}wxx|~z}n]dxvlnoolbW\moaYbpgjzxssy{}}mvzyzyw|rpwsfemqvqruteVixbYblpokhhkpstvqjy{~xtyz~~likiqz}sz~puwd\gnjjlmosxvimxqu~}snwyotx~|sxxz~uddu~~yywtpi`_mrdYdlclyvpou}~|}|wysv|yxtpx|ncflxzvyx{|lWh|h[`hmmjgfhkmo}}w}znt}x{}x|ttkcksxvyqacqtnjkmqwwjjtpu{~xvywzoc{tiovxyy~{{xxn`drvsv|wrmfhw|txo[jY[iw}~~}{zuv|ojvzysffprcX^o{s}nseWnp]UTVX[]^fxxjoqryxpv~umu||yryoiwlhp{~}tbVTY`hdY_bZ^iooicgvvim~w|y}~~~}|~vsqbVX]UQUMUhjfceiortuwwtlusfr}|ywx}{rjuyect~wuq]P\c^WTY^```aa`_g}x~~vvynhty~}|}~}}{swrjbUVi]ENfwrt~uv~{wr[]w}pc[Zanp[Klyizzj`jfYVNN]lmnx}y~rjly|ustnj|x[Zr{qfacku|~~niYUertmd^]cjcQSinlwmbZ[jxd]``an}~zxwor|}p{~tjeit{o[M_lXLYlw|}|yw~{qaWU\_X]wyw{ypmpstrmgcfwxqrh\[flgfsz}{|z{~t`Parg_k~{}wqx}lei_\gsvria^`hkb^owz~xsnjfci}{xxk`_lxww|{ytppx}rfsxqkggkqx}yg]pzl`duqqujit}yogbcjplm|~qz~ulhfdb_\[e|{ujjt{slr}xu{yy{yc_ruibhw||~~x{tuxpfmj_dpy|xqlhgji_^bdw}yxvtpkjx~{k_`lrll|yssyumy~iq{zuqnnosy~m[bokc_i{|z~qhmtxunf`]`jqrxz||qvvnkjhd]W[mrltztnmwuq{~ytonpw~nm{zskhs~|xwmdi`QS]isxyyvsrsokddywspmgabs~zomw}umt{{yoyyhmrolkllmqxukuyrkaaluvw{xumotwwvtqkhjnokeu{~jjwzqiilmke^aookx{sottjr~}}vrrw~|lmvrolfjx~||rlriZW[afjnrrposxwhbxzxvpidmvnq{tqwuq~|vv|zyvuxvrpmiecfny~woy~xwrihqwwwy{}yysfehknptvupmqzxff|nr~~rgccc_ZZfkdm|}xx~ulsvz~ztqsywpzxopneepy}|ypfkpdZ[^bfjpuuqmqzv^^xzuutpjkuukr~yros|~up|}{~~ut|{x{yurqplgegmuwolwwotxqms|w{rgeeefgkopmjppl~|~poyykcaa]XYcd[dtz{{|ww~~{ytnkkqz~wtstzvmq{~|o`bi_UV[`eksy|yss~rbr|pkjifityor{ww|{w|wvppyxplmopnlmqx}wq|tpwzpinx}~xv{okkkjknrtrlhr}jryulkt}ymecb_^goges|}{zz~yx~|zwsqrw{vmu}qjr|zrs~~lcki][]`bdjqvwsouom|}qljgfovmht||zxwy~tl{zokkkjhilsxvpzyos|{piox||{zovtieggggjossnjo~rq~wonuxnb\[Y[fnfdq{}|||}~vwyy~xwwtrprvxqkv|oflw{toxw}kcje\\^``bgnstpmstu~~rjgehrthfqvvuuvx}oh|}pkjjiggjoqlm}wqwyps|wrulcbba`afmssqqz|}womsvmaYVV]if]fsz~}wzx{ztrqonosvtnv~pnvwqx{v}tefe\Z]`abfnuyyvx||}{ywlfehsymgqxyz{}~~}zscrxpnnnmmnqrlm~zrt|~qlt|||rjihfbaekpqppx~{|~{toszwmc^^foi_eotw{sv{~}zwtrpqpjerynmt}yps~~|rqj_]^^\[^fnstu{~~~sjgkutfclqruy|~~yszlx~snmkjjjkici|xru|uknwz|{nfffc_]`fknnpx{v|{rouxpe]]eog]bknqv|sq}y}xvtqpome_kzvljnw~}sow|}wvma]^^[YZ^eknqw~{|y{oghrviafklmrw|}~wzrr~}smkjiiig_^p~ztuzzqt{tgccb^[[_ejmpx~yy{qmsvpd\_jk_]floszuw{|{urpppplccs}voosyyqt~zwvzyk^\__^]^cjorw}{zsw}{phjtviekooqu{xxtt{yqnnnookcbtzttw}~sou}zjefea^^aehkow|tryoovxoecmpd`hmorw~~v{tqppplb^lyunmoszxquyt{yf^^_^]]afkot|}uzrv|ynhmsiaflmnqw|~~y~{}}xokklnmf`k|}vtuw{~rns~vypc``_]\^behkrzwmtvljpsldgng_dmoqtz~~unlmnld\etunkmpt{|vz}noo`\\]\]`dilqyv{}rlqvrjkog^biklot{~}{~skijmlf`k|~xvyz}~sr|qqsc^]]\\_bfimu~zpwymgjqoikne_gprtx~|}wolmold_kxuonpruzvw|lnqd`__`aeilou~~u}{pjnuuqspd`hmnnqv||wpnoplcdt}wtuxy{}rr|owqfa^]\]`bdgnx{po}zojoutttk`dmpqsw~yx~vommkc[crrkjmoqtz{tzvo{zmd`^^_adgjoy}tzwmkqvwwqc^fkkjlqwz||~z}}sonni`brxroquwy|ws|outib^[Z[]^_bjuukm{}rkmty{xj`elnnptz{y|xpmlg^Ydnjdeimorxx}wr|{qga^]^`bcflwxs}xnhmu{|ra]dihhinswy|~y}~xqomg_bquomptxz|yrs{|vne^[Z[\^^aistkmzynjpzobelpppty}wz|{wqnjaZbnmedgknpry}zwy~}zrjc``bdefjs}zrw}tkhmy~l`cjkjjlptvxz|zy~wy}|~zxunkuzqnoqqqsv|znemztwyz|ysommoomjjorjags{l~{uz~vrxz}{zyvu~n^h~||y}yrnwypmnquw{|hcw~~z|{|ztrrtutstx|umqzxmq{torw{~eWczvuxwz|x{|xqnv~zqnnoonllnnlip}zz|~~}}|vnhnzutuuutqmgfo~zootwxxxzzzzywrkktxrjmz|~|{xtmgb`adm~{uqrqlmrsojijlnnosxvnlquuuxzyy}y}{sh`djjhn{xtz~~zuqsy~~zupkoy{upoppnkhghlpv~wpqplhilpv{ywvtrokgis~}tqtwxyz{||{zxtlhmttqqv}yvsnha\Z^fq}|wtvuolpuuqnnoqqruywpmqtsrsvy{~~}xpe_afgioyzw{}yutx}}xrnrzzuqpppnkhffjpx}}soomieeiou~}{ywuspmnu|{vuvwwxyzzzyxvqkimqqqrv~|yvrmg`\Z^gr{}xwyvomquurpopqrtwxtnossqpqtwy}~ztlcacddhoy|}~|xttw|}ztopwzvsqqqpnlihhmtz{|wrrqmhefims|}zxvtqprxywvvwwwxyzyyxwtoloppoprw}zxuqlgb^_dlqt}zy{xqnosutrqqrrtwyuqruvtrrstuw{|wpiggdbcflw}zvtvz|zuqrxyvtssssqomkknsuss|zwwuqmhffhjox|zwutuwxwxyxxxyz{zzyxuqpqqonmmpv}{xtpkfcacgiio~~}~{uqqtvvussstvxyurtvvusrrrsrty}yrmjiebabdjv~{xwy||xstxywutttsrqomlmqsqns}{xwvsnjgeefhmu}{yyyxwyzzxxxyzzyyxvrpqqommmmpv~|yvrnjebbegfgp~|wtsuwwvtttuwxwssuvutrqqqrrtw}~{vqmkhdaaceku}zxy{{xuvyxvutttsrqonmnqsqpt}~ywwurnjfeegjnu~}|{zwwy{zyxxyyyyxwvsrrromnoprw~~|{xvrojfccdggip{~zvuuwxxvuuvwywutvvvtrqpqrtuw|}zvpmkhcaacgmt|zyz{zxxzzxwvvuusrpommorrru{~zwutqmieccejou|~}zxy|}|{zzzzzyxvsqqqomlnqsw|~|zxurnjfcabdgkpy{ywxyzzyxwxyyvtuuutrpoopsvy{}{xtpkigc``bgmt}~|{{{zzzzywvvutsrpommnpqsvz~~|xusqokhebbdhnu{}yy{}}|{zzyyxwvsqqqollmptx||zxvspmifcabdgjqy~{yyyz{zyxxyxvuuuusrpooprvy|}{yvsnkifca`chnu}}|{{{{|{ywwvvutrqpnnopqsv{~}}zwtsqnkheccdhntz~{{|}}|{{zzyyxvtsrqommnqtx|}{ywuspmifdccdfjqy}{z{{{{zyzyxvvvvutrpoopruwz}|zxuqmkifcaacgmt{}|||}}{yxxwwvtsrppopoprvz~~}{xutrpmjgeccehlqx~~~}|{{zzywuttspnmmoqsw{~|zywtrolifedccejpw~~~~}|{{zywwwwvusrppoprsuy}|zxuromkhdbaadglry~~~|zyyxxwvtsrqqpoopsvy~~}{xvutqolifdccegjow~}|{{zywvuutrpnnnoqsv{}|zywuspmkhgedbcfjov~~}}|{zxxxxwvtsrqpppqruz~}|zxvsqomjgdbbbdhlry~|{zyyxwvutsrrpopqsvy}~}|ywvusqnlifeddegjpw~}|{{yxwvvtrpooopqsvz}{zxvtrpmkigecbdfjou|~~|{zyyyxvutrqpppqsvz~~}{zxusqomjgdcbcdhlqx}|{zzyxwutssrpooqsux|~}{xwutrpmkhfdccdgjov}~}|{zxwwvtrqooopqsvz~~|{ywusqoljhfecbcfjnt{}|zzyyxvutrqpppqsuy}~|zywurpnligdcbbdglqw~~|{zyxwvtssrpooqsvy|~~~}|zxvtsqoljhfdccdfjov}~||zyxwvusqpoopqtwz~~~~}|zxvtrpnljhfedccfintz~|{zyyxvutsqqppqsvy}~~}|{ywusqomkifdcbcdglqw}~}|{zywvutsrqppqsuy|~}}|{zwutrpnljhfdccdgjou|~|{zxwvusrqpppqtvz}~~~}{yxvtrpnljhfedccfinsy~|{zzxwvtsrqppqsuy}~~}|zywusqnmkifdcccdgkpv|~}{zyxwvutrqppqsux{~}||zyvtsqomkigfdccdfjntz~}{zyxvusrqppprsvxz}~|zxstmqooqjj`a_^bblpxsyvnv|yz|rkavoxw~|}wz}wvy|ty}}~q{wgR[fuce[[gXbntqujtsmofstqj}|vfpyzqlrpyzwkixqsystmyxw^Zf~hnsv}}isleholgeqqrbm|}p~||zosndmpXwtc`ajnksox{v~z{{vkq~lgroojfv}k{x{x|tv~lurqvhWoZ]xZ\[bv|~{xqdkrors`enx~q}xw}txloyz~~rnbq}zmx}sgxVezlkfwr`ai~wpvcZdxsiqp|}y~vixg_ts{y|plwx[bgiytry{x{i{vad~___gkqn]}xl~elys|u~mzsv]htwlstv}zajsljkswwvky_Ysil[xa^uhfqgMibZwwyts|n{k}}vbdv~zzi{sp|~y|{tp}ptom^vzlpq_no^_vGkP``[vzxxxqk~~jlzwclu}moxr}vzww_kj_uo~yexpdvqSpjO{^Wk]eyow{nykwzl|}y|ix~spkisy{s{fWlbrqrd}nnjf`wZiuPil\mrsvxb~wo||jp{s|}u}hswy}~nZ\g^w}bt{knhafnWtn`ifhyzmuwom~~zy{}kvcozzwx|xsfm~ryxrfWjnew{_{oldjjd^d~`gjbl|wqxb|w|js`oowv{wwpwwyyz}uucadn_rmurgpkjbbTynamcpmzzy|sjwzu|]}vfnuuxz{urwpw~|yvjb]rjghxiiljieYmw]tlfiw{za|ts~ch|dlpzz|q~rzzz~|{yocYhhhkvpluekkb[{cgqfmqz{yzfj{n{zr_ldsz~|v~r|t||xtyhS^rhups~nphkih[wm^sbmsurz~u]qzz}dwpdo|{x}un~svxwxxlUTlgp{nsukjjhWszUifoptruy{\{uz~hwuenwuyut{u}{}ssvpWSlbjpusslbc_p|Wecnqssw|{evzzjowjhky|qupuw{wuquaScbgnyy{skea^o~Zejmmwztv}eq~{gryegg~vwyqtuwtosv_Uc_fszy~uoebcmagdoqv{wv{}c~xw{x}cqwghhqwruov~xuqtx_Qaa`vv}tulbarbifpptzsy|x`u|v{y~hrtimh}pu{qpuyxqqts]S`^^qzvqdbofdftplxwwwx]wsxy{kkxkoj~qu|np|zw|vppvaP\]\n~xsbep~gbhopjtvwvybsw}w|zsixlofwxzxjz{|}uwnmuiTY[`m|usgdj|q^gmuityut~md~z{yzxcxoigr~qpx|{qnjvvWS\^h|zujbkw{cfgvprvxvzvar|{zv}ipriijp}zovzwy{okn{dQZ]ds~wtgespagtvowywv{dmuz{ytzqgtkkizxzpxy{~rvjguqRW\^ixkco~fenyoqw|tvqc}q|xwt|hlrnlms{zmt~zvu{lgeubQX[ct~~vfhwtajurlvzwruekvwy|xzreropkzz~qt||jxtd`hqXT[bk}{oeoyndmxmnw{tssdwoxz{uzlironkz{mz}wfyia^nmSWalt~yleu|{gesumuyzuvje{oz|xuthmmooywxr{u|~hpr_`ft]U]ir{|ten{vcm|rov}xvscunvzxrwmgnmpp}o{y~}{xdte`_plV[cqu{mf|~jgzxosz|uthiwoxzsstglmsq}~tr}uvfnk^^gr]Y\lsy~sgwtet{npy~tsmd{{mt{wtvikpqrx}|l{wz|neq_[_tdW[fr{ykq~{hn{qpu}wqodq~qn{|rvojoqttl}{~~utbqa\[pjWZctx~{okki{ros}zsqdm}tmz~tvqjnnrt~qz}y{qxaob[\onY[brt}qjoh|uqr}tpfl|vmxsttjjmsr}tvvzo{cme^\kp[Z`qq~tjqi~upr}uqgkywmu~tusjjlrq}su}v{q{cnd^]mp[Y]nouotkuqs~soflxvkuturkjmqr|qw}x{qzdod^\mpYV\mlxpul~trr}toekwwktvttnklqs|stu{nyene\\jq\WZmi|pzi~vqqzvoejwwnrwuuokkqsxwt~t{lyhkf\\gr^WYkh}o~k|xqrwypfj|ywsm{uvqkiqr|y}p}s~~ovngj\^brfZXhjvtzowqsu}sjhutxj}~tvqmhnqxzq}}wzz~wpuem_]^pm]Yanmzuzrsusvmfprzjsuvsohkqv}}tv|~szlwhke]]hsbZ[nitqzstxzrfixxtug{turmhos|~p|t{~z|rpqfk][`qj^Zgnp}x{usvqujfpozittvuqils{~tvz}sx{|ishiaZ\grd]_pkvs~zssu|rfiwyqyf~}tvtohpuq|~uw}wzzrjodh\[^noc`htquttup}wmen|owpiwvvskktzzrzq{wyuxjlied[[bsmdbrs~z{{{}rvruhhsl|ettvuriovsyzvr~|t~ytrglfh][^mtidkxswxuvr{znemyotrexuvumkt|zsyoxuwtujjigcZ\dtogfvt}~~~|svqtfhr|j{cvtwwsirzs{yst}yt~vrngjhf[\apskfqwwy|swpwjep~izlkvwwvknwuuvyqz~{s{zpphhhh]Z]jtmgmyrz~uvrx{ndmwosvc{wxxoluysz~pw{{sx|pojfgi`Z]gtpijxr}wvtv~rflvtozb}}vxwqjs||t}}ouzzsv{pmlfgkc[]fsqkjwrzvvttfktxl|cxvxxriq{~t~zptx{qv~}rnti`ahvvnm{wyuvs{qy|xpdssvusqtwv}|v|rutmdv~nmegod\\cnmhgtpmnuukjki~ymbityoeyxzzsfgk{{{jZivfROXNILUbc__kfy{yxvznu}zogcov|mfilkwuvrkvvkkigco|rlvjbcjuxsr|x}ufac]rrfZ^ixudydn}tvtm^_gyyume_Ze||jo`PNR]a]Yc_hz{~}xvv}v`Y]nsvspnpzrsim~r}lgffdixzp{xhgju{zu{{{~~yxopenyoa[en{hpsc|ywvte^dr{{vfa][^pyx{d[Y_ef`bf_xv}}{|}s{wxiYYdttzvtn{uvpjstzgfcddn|w|puiioy}{xxy|r||pqetym_^hryfunh}xxwrc_gxzna\YZbuv{}f_]dijehfb}x}~||z}}t{x|ufWZhxyzvsn~vxplut|~wedacdq~w}oxllq{}ytxo{}qrfszpb`iryisqhzxwvse`h{~l]YW[eyxvkb`flollld{{|{}x~}yuy|z{}yshYYh{vrnuzwtlpzu}}yzfb_bfqx~l~onq{~otowruio|ugahpynouhvywwthai|~z|kZWU\h||qqechnrqqpg{~}yy|v~xvx|zxzvqgZ\l}vsnv{xumqyv{ywxda^agtx~lsru}~ymtnztwiq|uhcjpxpqtjwyxwthcm~~uxdXVV_mywrjhmrvtuoi|{u{xx~{|vz|vy|wtodZ`u|vsnx{rovzuztypaa^cjyunttyz~~pprl{ytjx|rffmtwotpoxxywqfft~{}vvp[XTYcurqmmrvyvvhuzw}yw|rxyx~~|w{yvrk^\i~{wqz|qnjjpzziy~lko{y{w}qt{{ut}vdzxlpipvznb^h|ymlmim{~p_mqlcgurxyrqtzkjjmvwil~tfnngkfuukehvo~{ravmcflsqprrw{~}tr}qdr~rs}fehovupZXX[cs||nfl{}fj{vnsnox{vwuôo{yxvka^fw|rd`iwt~mcZipozry{spvziifgo~z~{ztdbofqxstdo}~}ol_o}wvwyxsswx||snwzq|xz}ghpos~qi`[\fqvovpxrgdjuwxwusoxzvu}pzx~zuofdmuynnwqvu{}yia[d~{|yxps{lgebfr}~~vuicsmjzvuopbi|}~~ztyyz~~unq}}stxw~rftrnu}sofdhrvtn}m}mgip}w~s}~lsxws|uo}w~zusmdktyztzzstx}re^\s~~wrmyuhhccjx~w~rfhuio}r|xqkapvt|x{~{sov|yq}y{nlyrn|xtngfmuwptrrxlgkt||{sxkrwuu~qty{}yutndpw{zw}yw|u~uzoc]`z~vnlzrhhcem|~u|rgjxlqstpjbs~~~tt~wz~{tqx}wq~x{om|vn}yuoihovxqtrpxlimw}||r}zjputusuy{{wstres}||x}zw~r~puob]a{w}pixtiiefm|~t{}slhztq}t|~woner}}}yo~zw}~xtxvpz~vvwl}qy}vrkinwzupyg}|okoyx~sv~mlrttys|yzurswhqz}|vq|mood_b{zysgvvkkhhn|tx}toj{zr|v|{wppht}|}zm~{v|yvzuq|}uvznrz~wsliowytpwgz{omr|z~tv~mkrtvyu{zxsqvzhv|zxo|}kmnd`gxzpgwtkliiq~s}|uol~zt}uz~ssojy}}~toyw}~zx}{sr{w{wrq{xrlksyxptnk}xppv{|qzzjmrs}s{x~}xts|vh~wvquhpjbaqvgoyolkhkurrr_\abirceuy}{vrihask|rw{|yx{~i`uu}u}fjyrpqnov|{usnuryhbhjr~rr`]xkhjtu^mxlqwzxvv{v|tswwh\d~nl|uqrpr|sfsrxni`^j^X`dlxkiy}up_do|y|kX]{}ygmt]]mgdebbjtxvwtxmkwyvrjps|yy}oY]xz{tYhreioqommpjtvo}mpobZetuzwwtt}zjep|kdm_V\`irdbqvz}~vtpm^buu|xtbV^yzw}d_ngcc_^dnsrs~szynkrxylqu|zu{tn][nmppmqsqnmnhnwlwolqf]ax|q|wwsqw}ngk}nun]^bhti`nux{}}yttse^k||x~|~suj[Zo~{u`mmeea^ajpqqyvutmny{~rnsxs}|wtgYcvk}oquuqonkgy~nm|yiomb]m|syxwuqry~wkirzrxj^aeptdeqvy||~tqup`bqux|voqdZbwofrkffa_clppr{{tu|rnqypot|}ttsrc[i}|n|psvurpoii}{lm{ufmkaass|xxuqrzz}tkkxzsyk`chtudhswz}|}pouoaeut~wyqilb[g}qhrlhgc`dlppryxts||spuy~rns|~t~mnre_nmrswwtrpjh{|ljwvdgjccvvzyxvrrx~~}vuztmp|~qyrbbgsxhgrwz||zqirtghwyzw~vwrafc^h~zhqoiifbckppqwvspu{vtxzywmqyt|~hgqlerm~wtwxwtrlgx~nhrwebiffxzxyxwsqv|~|ytouuquqwvebhtzkhrwz||ypeqvkmzyx~v|rr{o]bcan{krpjjgcdkopqvssps{xw|{yxnr{u|zcermjwnxuxyxvrjh{{lhrubaigkyz~xxvrqvz{z}yuqltutyszuedjxxhktwz{zxjeuulq~tzsynqxg[cdex}rlkkmjmqotuxyv~\ZbXcq|}y||}tbarfiwremss}xuqa`_]`fikptqvtx{ytkp}zbXz_]cinqrvztzmiqmxuejsu~ori\SMNTY\bihpsw~{}{v{xcUxskmrwzz||n}y{zumc^qrlvzknz{unvxj_[^acglhnpp|~zy}}ru|zpqeXv{vsssqs}wl~|tlfv}u||kkuwsntzqe^^``eifors|xy{|w}vyxpqdTn}p~yzxtmc\kyu}}moz{pmrx~qjiiilniprp{}xvy~}tuy~unqfUk}zwwxl|~{ukbnynkuw}yort|ogeeehlfntr~}yy{zsz}ww~zrriS`q{{zwqg\c}w|smx|ujorypmlkmpjnupx~zwx|~yyu~y}xpqmW]}zx~lx||}|wnbd|}wjrx{pqs~ynihginijvsx{yzzts}u|~}spp]Tuxw{{zumb\r{ynq{~lipyvomllpnittq|~zwy|{xwx~y{rmpfUl~{{vmz{{ysi_mzrkuzzmrzwnkjjmphoyt{{yzyrx}zu~{~vmllZ\v|~zzxsk`a{zz}ns}yhit~tomlnrmivur}zwy|{|xy}y~~|vmingZu|}wnyyyvqhar}x}rju|vluwolkkorip|uz{xyyu~}~{t}y|~{xpghl`byzyxvsldf~zxpq|xiiz}snllmrogtxqz{xy}zw~v{|ywrjekoew}}}nyyvvtqkfr~vwxjq|znwxolklotmm}yw{xx{{~ytxxw{yvrlccmli|wxvtroijzv}tnz}wll}tnmlnsqhs{rx|yz~|w}uxyvsngckun|~~~oxytsrqmiu}tvykp}zr|xqnmnrvmn~zv{wy}~}xtyuuwurnhacpqp|xwtsrplpywso{~}zump{snmmpuohw{ry|y{~zxxtwvsokedpwrxp|vqqqplk}ytxujswswqooqwukuxyyxz}yz{t}zqturnjd`htpyx}}uttrolxwy}os||zxrkwxronotuin}wt}~zy|x}~suvspmhciusxru|rqqpmhs~vv~|mmzzqx}vsqrwynp}w~|yyzz~wuy|qstqnkfadoop|{wttsoiqzyso{{}{ysim}vrpquwlk}|s{|yz}}~z|suvtqojegqpquutrrpkemxwply}znp{wuuz{ppw~~zyxuxvyzprtromhbdlij}}yvvsmen||tp|z}zref~{wtuyzmn}u{}zzyw|~~tvwusqlfgnlkvvurrpjahzyslx{{mj|yy}~spy}{yvrzx~xx{pqtrpnjdcihez}}wwunei~}zoyz}{tg`s{xw{}rl}wy{zxu{}utwvtrnifkmgw{u}ysrqlcbv{y~{mrz}~sgs|{~yo{~z~{xst|y~w}~sosspolgbejem~ywwsjds}sq}y}{xoae~zxz~zmsv{~{yvuzruvtrpkfgmkmyxvqqoiai~~zzvlvx{nh}}|vq|{}zwryyz|x}zonqpnlidbgkivxvuqigz|rrzy}{yvnbj}zy{yltv{}{yvx~wpstqomiegopsyxuppoicm~yyvlux~zok|}vq}y}zxu|yw}w{xlknmkigcbhpq{wttrkk||}to}zv}~{yxvqgl|yxz~{mpvw~~|{z{|}wnpqnlkhegqxz{w|wooomhnzwz{lpwy~~}xp|{yo{w{~|{y~zs{~xywkhkkhfecbity~wstson|{zvmx{ty}|ywwwumo|yxz~|nowu|~}}}~{|}~ukmnljihfis}{wzwnnpnjqyvy{mouw~~}}~zt||xo{vz~~}|{yrz}xxtifihfedcdlx~vrttpqzztmywsx{ywwwxwot|yx{ylrvu|~~~x|}{pilmjhhgglxyw|tmopmkw}wvzwkr|sy~~}|}~~xv~}~sq|v{~~}||ts||xwnefigeddcgp|~tsusow|y|}op~rtzzxwwxxsn|yzsm{}tx~~}}x~}tjjmkihhgiq|}zy{pnonjpyvx~}om|tu|~}||}~yryp|wy~}{yyry~zxqeehgeedcdkvwstrnr~{{tn|tsy{ywwwwsku~||wmxuw}~|zx~vkjmljiigglv|zrnnlgm{xyrm{uu|~}|||{vmxzr}xy}yv~{sz}ypffjigfeccgqzxtsojp~|~vp~tuz|zywwunepxp{wx~}yv~yvkkonkjigfhq{~|tonkei{{yzunzuu{~}||{ztjq~t}{y~ytztx{rgfjjhgfdbdlv}|uspil}}~{qzwty|{yxwuoeh}qx{v|~zuyz|ymjnolkjheflw~zqnlfet|yz~|ptysy}}||{zvmjwxy|{uuxt~~wkehjiggebbfq{xtrlis~}vs}svz{zywvskdrwrxw~}wtxsiknmkjigegp|}wpnjdj|{yzypyutz|||{zytkou|x|ztxuu}sgdhigffdbcivwsqkky}|ttzrvyzxxwvskgxusww}}xww~}pgilkjiigfit}vpmjfn{yz~xoxtsx{{{{zzvnstzvz{v{tr}}rebfgfeeedelzwsqmmz}{}vq}zqswxwwwwvqlyvp{xt{{yux~pefjjhhhhhku}{yqnmin~|xwz~{prtpuxyyz{||vvtvvv}z|uow~te_ceddeefhn|ytrpoz|zz~wpxypquvv~yxrnrlka[[[cfxwvz~|}x_eja[]W]^cqy~v|lythalysy~}swwy}znpwuxibwxlknhjiglvp{|q}}wlsrsovsc|~yfSpjcgx|yp{phrtkotyvjxhvvkoquls}}}{|~e\{wfbgUWXc]Vaoj~rxydYg~{swjffrmknmgY^bwmdhtpojywwlpxtoqtw~xw_\g{vg|~uilrnpmlyedeimqryswii~|~zyqkaz|usk]mhqostzs{yzwwwjejhws}wnj]ino~~rjqgkb^vqyqdnuzxzkrkhv|xz~{s]mjnws{mrqipv~vwqzovpryhbgXnztw~|~~~ntww}ln[ftdllu}u{|p{rhmjqxp~~z{snfcg`koutrvckf]hcenzzzsup~|{|zrnfS^`k~w{qz}kmmc~xnpnxrhqolh^}x{~pegZv}sp\mzwtquoqumknrrny}tswufZix~xw}ztpxhmnlniyzltpowokp~|}x~z}l`danryvtq~xp{~zue|nkunskgri}zuzrrxptjzxirdfoorw~}vxywrjtl_kkw~|}sdg___r~y~}jhh]wqdcexvp}j}|x{y|}{~qr]hmY]c|}qzzuxozlmqoonupnkxmx~~zu~{uqthnl|}tzsisuyq|tsuj}lheuoer|lljh`cw{vts{zig~z{zqwv{u|pjqq{~z~~xtiTlxu{uztxywtx}muvxlnthbh^u|}}|{xulpinrqpigpifqzvzjzvkhws|}uuers[VTly|txxlpnwjmotwu~x{wpnv|}~}vq{~u{jd`ehezyrw{qmpex~hearsgm|{u~~z~}qfnieowwvi|wwttyvjnhpiuy{}yv{ydhwruy|wqtqvxsmu|wzmd`njde~}}xv}{r{}~doqqlyyv{~yugnx|yutvpnlamtjhw~~^Wm_Z_w{o{|itqtoyo~{{syw}yxutyttggmb`im}npwwemgyilsvxkxvsn}~|wz{ujfefYVnz~yxssto}hjv~elktq|{z|z}tzptslrk[ptuw{y}ywwmajs_ezy}~}s{xw}vmfkgpq{jlzyrgypqpq{zzvq|v}qkjknU[env~xsr|v~uyz~umy`qkqgpz~z~yxzpked\fvz}|~{{{wv{}m|pqjwyyt}~xx{{vyrchdgd^ytv}{wp~kkjpz|{xo{uw{|}t{xq^\\dgz{y~}yv|vsfrqcnsxervv~{x{s}~}uzni]pnuks~}{z}xpmtposthlvzwxztzv}tn|heTdwq{x{t}tqpnx{rnkjjqy~~|vveed`inqux||sxrojv|}smldlm|s}wvwxtjmuoianr{}{{msi}oqz{htwwf|z~|}v|thaYoh]bw~}}mlmr}yttopp{mgs~x|{komkjrklhcr{tsqz|vppmajltwwpxtyorzvrclkor{orm{olyshxuas{uxgi`uh\\nnsutv|~zxvwomyifgp|z~}}yntwqnqonl^kvv|wuu{ztvphhkpv||{vwq}srzudfgdiqvy~~pwp~}nny|l~zcoy~w~njdvoYTekgzz}{~}}yqzvnutegf{pxz}vxyvpvsqqd_mmktwvpuxqlmnrvvz|{sw{}m{qhlcajkkx|ztuwntusrf|}zuv{wxphk}fY[odgx}}ww~trxlicjzmj|vx|vvupon`ekfk{z~wz~uwyxlmqmqov}|zy}}ymyxgjpZfihkz~}}krxswwst}vjxx}}|}wgk|}YXiv^bzr~u|xvr{ufmevkjqpj~}{s}|wss{ntnqjrd]q|znqx}lqssfjk{pv{gp{uaehdecno{tystquv}zt~mupsnrv~yplr{na]wbZimkj}w||sp{|p|}prbxo~x~zw~}|xlvi_i[Vxgbmx|uwpvtqpturo~qz{q}zwscz|lsf`eeptvyw{supjuqlfwpt{zv{pm{{ohnt^mqkgf~uwuuittold{wsyuyiksjmngnlnhTqyq}z~qnzplqdvwy||vzwlxfgnd]clknu|yt{x|zwst|whwx||xy{ortknc[xfSbewxy~svntx{lpspttz~zy}yylv{nbqga^\rmt{}|hxkngs|ltz{n}}wxtwkoklf\mfdxox{~}ztznpqoppyw~}wmytji~tn}{y_[{pprm}~|l~irpayriih|~{|z~xlvlohmdaaolawzn~sm{mnrrzpz|wwqwdnw]]Tckcr}x~||}urow{rfzvry~~~x~nt|ggdqd`eiqnv|jlsus|ug|{~~}}}otwydfi`ecSqxfnx~z~{syqxqpvrqp}vv{tlzty{fgxpnncjpkvx}qxqhqd^gytu}}~}uyqzqulnnok[inpiy~p~t|tnsotkxv~~}sxlqkbYepffstvdi{s{}tlxrejmp{zwzuonmom_hci`mnrzyytvhqyzyq|xu{rjuocbY]u`\\ou{y}qzvuoyyny~|||uxv~ftytum_kiafm{q~xynwohdswjoy}}yyy|ryssnvjdjjf`mpnsxyywuzy|}z||xvrjn{ynTl}pos~~xnhn~zlssyuj[iqiz}hfqzcmqzvyy|}{~tq{}~^lptcpusudytys`qrnv{vbswzs}pvlipmdyrznyr~~zwszo{qz}ypwknsxiyok~w|{{utz~rRes{eUgc`jXaWx^Q[hxo}x|trrr}n~qbi{sopwqnqxjpwxnga~vqh{naaho\eYurmrnmw~hxvl}qloznZsoVTdh|{|jiYh]a{}l~dau\V\hV]Visby|sw}xqzudxc`qovy{sztuz|ssemsh}dwogjmchdc{gqxmk|znmvew}rmuvb]wbWdje~rdYZgYt||~Udl`cf_Z_Wyhn{mpw}q{uueofrwnxx|o{vz~~xvgexgwlowkpnldcVyjctkhpyqwthf}yjrxtYwjX`mjuu|zg[[mYg{feo_ge`Y`Sri_xlkvytoy~frdozt|vulxq{tuwvhiwersr|qtmjghVwh\nehmvpuxjf}}qwvv`zi]cniq~u{}|kZ`lYhqjnvhjb`[^StcYjeqw~{sr}~kskmvstuslvpvuvyaesco{}wwznlefZzpXjahmuuwtoc}uyy~u]ujaeonf}zwz}|{~s\[gXcq~{oynuif`aTmpTf_js|}ik}xnsu{j}rpzmuq~z{}~japfhx}}~vqoj_hZcbclry{x|z[}x{}t{udhqbihwdvz}|{{ysy}hWa^Ylsy}wttjld_[{bYdbqr|nx~{xm}orn~wvxz~mwwqtt|swx_gnes~~svpjavvTd^int{zvt]~{}{yuuqvapngjjyez~w{ypnu{bU`\bry}w{sklb_a~`Yaett}j|ytmzpvnwzvy{nxyuxuyxlpu[cjhxvyqidxzVa^jos|{u~s_{|wzvulr`knjlkj{y{y~ielzcS_`gv~x{xmqeab}kWbdsr}oryyvivrxruv}qr~yv}~ryegu|`_ijw~{yvhgoa\aiqozx{x\zxsywykqddliojt}z}}}sg^cufR]bkx|v|{ouicg|tXaftryqm}wuvhssxtyxs|q~zu|m|u`drz``jo|}ztfitc[amqnyz{u^{xpvxxjpeeklqou}yz}xp}b^dtbT`epzzv|rtfdnpZalws{ju}|uvsjsszt~~y||pyy{xyi~kaevr[cjv~~|{pfp~|_]fsnq~y{id|yow|sknbhjrq|s{zjvo\_krYZajruyvnajw~e]guttthv}~tymoqwx}vz|urq{yu}msu`blyb^fox}}wgn{l\drpnz{xn_|{ps|xkqgehnrtrw{|pnu^^dt`W]enzx~ytdix~o]dttq}uhxxuyqnpuxzv}}xosxzu|pnvabjye]clt~zip~q]fuqny|wl`{{~pq}ynsjfhmpsov{{pot_`gt^VZdiux}uen}r^hwrq|}rixxvzrmntwyt}zovv}t~{rluabiyg]_hpx~mqyaevrov~vlaw}}rl||psmfglqrp{t~|xjwb`dtgWX_ik~}zkj{dewtqx|shx}ry{wnmqwwx{}}nz|y~~x{yx}gwgadtq]^apmvlobtupqxqck{zkrurrifgpp|ypyz{vlrm^`js]YYgfzzxhx~wapyrs}ylkwsx{snluv}s}ynyvs|xysir`afvi]]gossqkh{sqswmcqxxixrspieiprvwv||}s}hqf]_kp\Z[kgzwh~~xduyss~wjnvpxzsmkuww~yn{vr~{}tuqgn^`duj^^irvtqoi|srrwkbotxhsssqjeiquyywy~x|oyhlf[]gra\]nkxzlx~~it|styxkk~{{jwztojrw{}}mzyztwu|zltem_]`prcbhxtznzi{urq}ynbktwlhuqrmggqv{{u{u||nskggZ\dsg`_op}x{ov~ot~suvxkjyw|i~wyvqjrx}}nx{xtv~tz~wiqek^]apsgel{v{p}n~usq}ymblqvlgurrnghry~yv{uy{kqhhcY]fsgbbtp{|o}p{{tuyvhm}}wzgwyuojuz~zn}x{oyxvv}nklfh[^dupgetx~yxxvrtqugermycrrtqnelt|t}{wxw{|uingi\[_noeajus~ys~vuws{nhuq~mqxywtknw~quuuq~{r~yvtgmgi^\`ntjflytuvtup~ylco~lwkgutsqghq{|wxz|tv~wwimii_Z]jqgbfsn~txvws}pgrq|sj{yxvllu~~tuuvo{~zr{ztthkij_\_lsjdiupy{uwq~yldo~lxmfuusqfgozzxzyzu~v}vujkkk^[^jpf`eokx~vys|ohsp|sj{zywkks~|vvuwox{yrzyrsihkl`\_jrjdgrm|wxs{|odn{nttbxutsiemwx~{x|~s|}u|~tumikmb\^gpjbcng|yyuzthq|vu}fzzxpiqy{{t|{nuyzsv|rpngine\^eqngdpl{}wxsvgju|j}druvtpdjq{{wztv{}wv~wqrjgoj]]`myxx|wyzqemptltk|pjz||{rt~yllkdkp~xt|}w~|pomenr`UOezgfoi}g]}bMVcueaoVosostogp{|zsu}uyw~~pSFSz{b^T]{lwtfmspkul~po~x{xkgxycbptpucr~t{khnrqowvllm`ffRNXoxuwpv^cnfcfq`XhPenjmniaiuw}xmpzz~{|q_eUFNc~{mjws|{zw||rhvw|szs}}o}hfo{qytylj~sxndjlmjptjcj[ZgXU_r}vrwqdkzwrt{s^o]armpqoeisz}x||nr||~~mlgP\YMXkyrw|{zvy~tkyz|ryuzo|v|hhs~t{x{ql~tzoejjkipsh`kZXi\[fwxnvsfq~wsu{rap_dspstpgkvy~vyznt~|||}xfiaK^ZS`tyzzz|zs{qo||zt{t{u~xytvfkw|xw}os{tzjghiikqpbbkS`j\am~{tnynfy~wxz~lio_orsuumho}vu|vsov~{}|{y~|nblTQdVYh~w{}{|}~s|lwzwz~wu}}yovlem{}~{zozszqfigihori^n^Vob^fvymxucox}~xjtflutwwrhlxuysu|xmpx}z}zzx}~tbn`Nf\V`s|~w}~}skrv{|}yy~|~vpsncfq{|ryszsfigghorj^ocVqe]cqzozwakpz~qwkovvxxrilxswrtzwllqwz|yxx}~scsaRk\T[lv{|ujppv|{|}urrpcbirxyt{ugifggorl_qhVrj^alz{rz|cgkqxzsrwxzzukku~s}znwvznjmqy{wwv{}vdpmPieVXdvw}}z~x~nnpo~}{pxnrf`cizwy|kjhffmrpagtVisb`fssrcisocaiqxttww|zssynu{|yvy|o`qojQWxniinqwxzrp~~|vvwpv~paghohffg}y}vu}{~rslf`gwwzcsquy~twwus}ggf_nupghpw{xwxz}unotmzxuudVWk``qa[[agnprfjz{yxsy}|qeghqwvib__v|qwonvxwuvig^Z^n|ymzx{||fp{tnj_krneekquuqrwwz~}xlfjut|ysg\RR_vzpthegkqstig{wu}yun}{~~qb]gsyzniduuyuouxxqzxge^Z_o~yn~z{zuvdlssektsjgkqvxtpzyy}}zogjwy|x~~{n`YQTczn}ojkntxynh}vtx~|v}um~z{ob^jw~|pievvzvpuyxnxvfc][arzp~~~~trsbovtfluskimrvzso|yx||xnhlyz|xxx{g\VQWi~~s~rnoqw{{lm|vrw{xu}po{}}vj`apx{oii}~v|urywqmzoda[\fwzq~{}xpulbx}{phrvrklptx{nswy|{tkiry{{yqzr`ZSR\qv}tqrv|~wiz~xxyqwyt{yjyy~}ype`grwwoiwx|zsv{{xjuvfc]Z_n|{w}xzxqsr`mykqwunlosv~rmyw{|wnimut|xqwwd]VPUgzzutv|zju}zs}ptwty{irz{|~{shackm~tmyz}|uw}y|itwhe_Y[hu|z||xyysvs_hw~otywpnpswrmzw|}xpjlpm|ypzwf`WPR`q{~zxzyix|xr|nrvt|{hq|{z}}ujbbfd}zr}|wxx~iswjfaZZdpvw|xvwswvaerytvzyspqsvvi~uz}zrlkniz~zqvzjb[QPZhsy}|z{uuqroy}}uqqutqhns}kipl_ioYZh`]\XXanwy}z~xlmlmte_owvfmk]^iq^k|pqvwtomplq|vq|{lyqeb\X^mzqipnhb_Zig[_dgtnamv|~mqz~{toqqrkip{sprg_oiT`f\\YTV`krs{uy}xrut{lp~g_lzorkSgqdhmmifdfaoywz}sin{sumjdbjyzliwsg^idVY]coe[hqw~tkw}zvxvyyf]n}wiulU`cZYVQS^ipq}|wwzruu~psvcfw}`mzjjnnjgfgbo{uxvzqho|o|umkfdkyslp~ugmm][_dpk]isyxnxt~zxxyx|yse_pptw^^g^\ZVV_krtzyzyz~oprytq~{wii{fh}pjmomjhjfmt|zpvqjonxvmlhflytpvyilqa[_dqn`ju{||zpzr~~|yzzyvrpeburtx`_g_][XXalrsz~x|{|y}nnqztswyxkofjrknpnlkkfp|s{vmtpkt}nxsmliho{}~ut{yjoqa\`htlbnw}w{wr~~t|}~|z{x{ooldhsyt_fg__\Y\fnrt}{x}{~{zwlotqyzu{tkv}dxpmpqomlifyur~nmsnm~sswomlhir}|{uwtlum__dqtdgsx~zu~qvr|}{zwsuloifu~ypifjkfinkjkwwrsx|qouyy{}R[skgknmmmjesvnupgonlyv}vttsszxsvnf[ddVT[jsghswz||{umxu`a|u}pbQU}tltgajffgdbgmpouwrmgq||{ugtqacksz}||cmwosvvusmdpwdYcxzyzrz{wrhan{kacn|{xlttdafsvd`efkvtsqyth^]|s_`\V_kky|tl~m]WWWW^bbhir{ywzyzvdlsr}ykyrowybva^]Xeuj`erlakqpxwj~volovzz~||zYVxbRY_dikkr}pap|qkqy}suyowtvpsyw|q\m{eUORVX]cbhkmy{wv|wosjetvzx{z~uyxkv~lYTdcUTai[Yegjwyxxxmuvrtxz}nhd[ixomhggffpta]qsfflt|hn|{|t}v}s{~sohj{{ngeb`ddajimwvst{zjhqkjx~w|uaszvkjuk\[fj[[egmywxwsvr{xtwy{~qaeiep}{vsqnmvwb_tthhnv|enzszu{~qy~mnms~smkhfjhenlnyyvw~~xifqomy|t~q^p~nlxo`]fm_Zejo{yxxpvv~xtvxz~~~p_coov|{wtspntzi]pxmkpv|gg}s~~uwrt~mlt{unkigjkdmqlv|zz{vkcowsy{wxs\lqjwsc^dneZdkq||xyov{~xttwy|}}zo`ctw{||xutros|m^p{qmqv|~~ge}r}}tusr}}mmxuoljimlensnw~||ytjcpyvz{vyo]oqnzsd`gpe\enu|ywov~}wtuwy}z~~uk_gy{~zxvtqw|i`uzpnrw|~|~yckxsyrvptykp}vqommqjgusp{}}|}vqfeuyv~}r~eb{~ou|ncbloa^jr|x}qoy|vuvwz~xyqe`o{{|zxtu}vbj|voptx}~||lcw~s{~ss|vozpju~xtrqtqgrxqw~}{wsjbmwtx}uyn`qvxvhdksh^gqyxxuls~~yvvwyw|uj_hvw~}xw}{fh{xporvz}|}pcqu{trzynwshp~~zwuxtjs{rv}yxulbitptvxobo}{mhovj_hr{uwujp{}y{zxxx{v~xl`frqx}z}ij|ypopty{{}qep~v|urzznvvhlz|{}ymuvv~~xyvocfqnoyv}~tdl~slpxqbfr|wtykkx|ww}|zyy{v}zqcbnpq}qhx|soorvz{|wgk|}}zzxrvqq}}lgt~|~sq}u}yy{wrgalpmvs~}~~jft|rovzlcny~tzqgp|zux}}{zyz~{v{uk`fqpwmo}zspqtxz{~ofp|xury{ntvgiz|rx|x}w}xupdcoqo|~t}|}wggx{rqyyjep}|t|}nfszuy}}{zyzyvwrh_gst|nq}ztrruxzz~~mgpw~try{nstei}ryx}w~wtoebots}~t}{|uggw}sqx{oeo}~u{~peqxz}}{yyz~zt}~uqj`fv{sp|}wtsuxzz|ogmw}uruqo|~wig|tty}wzxsphalxx~u{}{z|~}{~vhgttqv|tgm|vzsfo{z}}zyxy}{r{|sokbewvq{~xutuwyy{~phmw|uqt}qn{|wihtuz}~wzwrphbmz{~v{}zyz{zz}thiw~usx}thov{}qfs{z}|zyxy~xr|yxpnibi{ut||xutuxyy|zmiq~w|sqv~|no||}sfms|{zv}tqnedr||}w~~{xxyzyz~{mgm~{tu|}pjv{wyjg}yz|{zyy|sxw}~rolebp~uy~{wutwxy{rjlyx|wrs{ulwz~wje{xx~~}v{vrpibky{~x{{xwxyyy}}pgiuyw|wksw}|ndtxx{|{zz|uuw{tomf`izyz~}yvuwyz|tkktz}ysszwmuy~wiat{z~}v|xsqiahuy~}y{~{xvwyyz~}oghr|{ynux{lbs}tuy{|||uw}v|tpmf^eu|}|~zwvwyz}tlksz~zttzyntx~xi_o{~}~w|ytrkadrx{~||z}~{xvvxxz~~qhhn~~rty~~pblsrvz{||xt~~vywpnh^_oy~}ywwz{}ynlo|}||~vtw~qoy{{o`e}zy}yx}vsoe`kwzz~{{}|yvuwxy|wkgit{r|}{xhcwyqswz||~tz~yt~|rnld\dt||ywxz{smmr}z{uuzzosw}}wi^lyzw|zusncboy}}z{{|{xuuvwx}}sihkwzs||vfe{zrtwz|}~}s|}vs~ypmkc]fw}yxyz|rmnszzuuzzos}w|~|vi_m||w|ztrndbo|~z|yzzwtstuw{|riikw}t}}|xidx~uuxz||}~rx{vqzzplkf_dw~~}zxxz{~tnor~z~{usv}}ro}vx~~}{wnbi}xy|trphbl|{~~~}xwxvsqrstx{tjjmuuz{ylevyvxz{|}ruz~upxyolkhaew~~~{xxyz}tops~z~{tsu{|rn{~tw|~}}|{wnck}wy{trpicm~{}}~wvwurpqrtxzriknxv|~|xjgzyvxz||}{qwy}|royvmkkgah|}~}zxxy{|qoqu}yxssv|zpp~ysx|}||{ytjcr}v~xsrofes}{~|~{uuvsqpqruzwmilp}~x|}rfm~wvx{|}ur|yvns~{qkkjcap}~}zyz{~uoqrzy~}vsuz}vox}tvz|||{zvmchx{{usqicl~~y{}vsutqpqrtyyohknvz~~uhh{wuwz|}xr|x}xor}|rlkid_i}~sprqpqruz~}tjjhit}yvw|}whwhfmuupy|~}wusnhmuw{|xx}{nnisuplkmrwtnw}wlkuwouzv|wtosxsrrqompwxqpuwwxz|xssqpuvv|z{~|uuqgmxrrofbkx|uou|~zux|wurkaajsy~tpnn{sjffinnhlvxtv{~{sgahpppy|xi`ckr|ysnmrunjmpqrsux|}vomjgkruzqdbhjkwynnv|xpouywssz{vsplc^dow{~vogdiouxsqstplrwutw{}~~}{vmdclqpt~}vi^\eowyttxvnlprssuwz|zsomjhmsv|vh_bhkq~zstz}wprwyvsv|~yuspkc`gry|zsldcjqyytstuqnsvuux{|}|{ytkdelrtyyqf\\gs|yuuyvonqsttuwy{xromihmtz}sf^aipx{uv{}xrrvxvtv{|xtrojcaht|voibbju{vtuvsprvuuxz{{{zwsledlty{und\\gwzvuxxroqstuuvxyxsnliglv~xoe]_jv}vux{ztruxwuuy{xtrokfbhu|slgabky|wuuwvrsuvuwyyyywuqlfelv~xrkc]^j{{wvyytprtuuvvwxwrnljhmx{tlc^amz~xvy|zusuwwuuxywsqnkfdkx~vnidaco}~ywwxwttvvvxyyyxvtpkfgoy{uohb]ao{xwzysqsuuuvvwwtpmkiip{|voha_eq~~zy{|yutvxwuwyxurpmjfgo|~zrlgcags{yyzwuuvvwxyyxwurnigjr{|vqke__gu|z{{xssuvvvvwwurnmkilt}|wqkd`aju~|}~|xuvxwvvxxvsqolhfku~{tnieaclx|{{ywvvvwxxxxwusplhinu|}wrmgb_cmy~}~zutuvwwwwwvspnljjpx}ytmgbaenx~zwwxxwwxxvtrpmjgjqy~{vpkgbbgpz~|ywwwxyyxxwuspliilqw}}xtojd`airz}xvwwxwwwxwtqpmkjnsy}ytoicaciqz|yxyxwwxxwusqokiinty~|wrmidbdks||yyxyyyyxwvtrnkjkosx~zvqlgbaelt}{xxyyxxxxwusqoljlpuz}zvqkfbbfls}|zyyyxxyxvtsqnkilqvz|xsnjfcbgnv|zzyzzyyxwusqnkjlpuz~{wsnjeabhov{yyyyxxxwvtrpnlkmrw|}zwsnidbchnw|{zzyyyywvtrpmkjmsw}~|yuqmiebcipy}{zzzzyyxvuspmkknrw}~{xtplgcacjrz|zzzyyxxwvsqpnlknsy}{xtplgdbdjr{}{{zzyyxwusqomkkotz~|zwsnjgdbdkt}}{zzzzyxwvtrpmllotz~}{yuqmjfcbelu~~{zzzyxxwusqonllou|}{xuqmifccelu~{{{zyyxwusqomllpv|}|ywtplhfdcfmw|{zzzyxvusqomlmpv|}{ywsolheccgnx~|{{zyxwvusqonmmqw~~}{yvsokhecdhox|{{zyxwvtrpomlmqx~~~}|zwtqnjgeddhpz}{{zzywvtsqommnrx~}{ywtqmjgdcdiq{~|{{zyxwvtrponmosy~}|{yvspmifdcejr|}|{zyywvtrpommotz~}|zxusolhfddfks}}||{zywvtrpnmnptz~}{zxurnkheddflu~~}|{zyxwusqpnnnpu{~}|{ywtqnkheddgmu~}|{zxwusqpnmnqv|~}|zxvtqmjgeddhnw}}|{zxwusqpnnorw|~}{zxusolifdcdipx~}|{yxvusqonnorx}~}|zxurolifddeipx~}|{zxvtsqonnpsx}~}|{ywtqnkhfddfjqz~}|{yxvtrponnpty~~}|zxvspmjheddfkrz}|{yxvtrqonnquy~~}|zxvspmjgeddgls{}|{ywvtrponoquz~|{ywuroligeddhmt|~|{ywvtrponorvz~|{ywurolifddehnu}~|{ywutrponprv{~}|zxvtqnkifddeinv~~|{ywusrponpsw{~}|zxuspmjhfddfjpw~|{ywusrpoopsw|~}{yxuspmjhfddfjpw}|zywusqpooqtx}}|{ywuromjgeddfkqx~|zxwusqpooqtx}}|zxvtroligeddglry~|zywusqpooquy~}{zxvsqnkigedeglsz}|zxvusqpopruz~~}{zxvsqnkifedehms{~|zxvtsqpoprvz~|{ywurpmjhfedehnt|}|zxvtrqppprv{~|zxvtromjhfedfinu}}|zxvtsqppqsw{}{zxvtqoljgfeefiov~}|zxvtrqppqsw|}{ywusqnligeeegjpw}{zxvtrqppqtx|}{ywuspnkigeeegkqx}{zxvtrqpprtx}|zxwurpmkhgeeegkqx}{ywutrqpqruy}~|zxvtromjhfeefhlry}{ywutrqpqruy~~|zxvtqoljhfeefhmsz}{ywusrqqqsvz~}{ywusqnljgfeefimt{||x{xs}x}vrnnfb`\[\U\\ZV]^V^bgitzwsustsxmmkh_\[]gtyyootqz|}yxqfa\Yestpjaljor~nmjlkptsx{{}~zvtgYWX^YXKOZ^ZRU\l{dYlyVRPTXafiv~wwkpwpj\`bcemx}wop~sfUTdnk\\huy~r|^Kn~m\R\^adnss}|iq~rut{ukdfpvwpkq~o|ttfM}nz{yooli{ua[k|lmqaYV\GHRAT^aVHAIZasxons~|vz|dz~syxt|d_etrMwkXwq}y|jlnwpwdpiptsf\X^vUyykwwrkxhTonmeHXZbeUTdĘpZl`Boi=A@}sawny|zj~wynnzvbuu[pdTU,EmTjsqo^|lfbcxg\jej@?b^`zxY\ZNTum]ytuy{`eV_cXwiu|xdyjzav~skZs}rлǦplpNM3@G9Nzv[\Qfycj}o?`d\YQ:a^Vkttfzow{qopdsyrldpZ:ee@]ukj~un|{xuovkg_}v[h{jqH,Znx֪z|qyZ_pdiUegKWbdW7QKAUn`qc]Lpwylm~iP`X^IFev|vkszrtseqtDz}}s|eQSL^TD_yʽvf]QnnSbtvb=apZ]]XNqYTcx~{zs~vvp}lu]R\C6_U9JTƳlv~|z|n}~shdv|``c^EFHU|ΰsxua_rihlV^wmxcOVfaMdocr}|swspcrxuwrit~iQefUTR9nr̡|ykjwz|xkkcs__kNE&$]b|yhyhxsiZlyZtc_naZOim^xk\ys\lzieqX~xemagdXBHibwl^kdm~o\}|itwgWGg72AD-^xqèrn}xqyr{xjlyhUlR?A0tbeugf`tc}}}ibtoenlWZhapvyqjl|cm{ng|hxup\yb\vbW(QQM`R{~{zon}SdLBTF6QRJ|bjt~zw`ywo~|nlr\OhDZ`Wltxm~~}rl}w|reieqUHZJSHNGdŵzlwGVTRnLpnjF?mUlgbnq|yv|~msYh6^m<;=kZ~vsoqrmm~ztkVJVRGPYT^ʴ{vo`gs~oJxnfhH`]\_`X[{}tf~Wg`[MnVXqcV3flrm\dfc\n|vx~maf[JR\HUsb֫d{ct{run`L\a[`mfjm{b^naYxpg{Olu_hFR^Xdltsv}pak`zzf[u~wzo\pKC; _N>Foǟ¥ekuxq~vkmr\_me\~qmx^mcqcg`yqb~srjcFHSXWo{aqhqmvbyb|cmFj|K;9V4B^^TJq|zepqKU7O{VSZw|a}gy}|m\krnnwh`g`Qbsoǟzxi{uxv]hu}zsbeYqtTqug?;\KQBAkt{ybcH{ySESgD_uvc]shfs|x}}sjskXf]=G4fuwyuvkx}x{ur|r~XmnnNQ`QPMA1G`wʳ}qjg\yuXw~qMMpdi\YrwyyyqoUS=mlD6HaFgzs{r~ah\khuutnXBIOMMYRWmuuɩġ|q`j{za[sffgaN\q}{t`[T^QhmI]laB;gmvzv~heSxiYgr~~s`gqoovidi\GOOEWl\dlǶzq~{qTV^ebrrskf[j]s]n{^LoneY@X``lwp̝{xluxebtq\b[pljƕqo{n_yxdlWVE8_h\nq{zrj|Zsxl`_b}q{skiltiZUTqrFKL9DWpv~ռu}nre\|phvnzqlqtiTMSY@he'9B>iP]ɱkeYHLpj_~xns~vwu}]wd_o^vpij_YwtTaoKoɔyqkeuyhgnusnpT^pzpmdd{`ThR@O?Pd<;acj~{erkcsqbSJhpiqo{~|onhZc\RgVGDVYWw~urn]tqu|qs_ZejRYYV3Wk/Dpb`wrƮ}odw}lWvDejkuyjpszk}|ahcat]=JK@OHOi|Ųxnbtm]{cpt~{acUSuT\zcP:KPHcilgy̥pjqwm~gnkp{q~}|mrxlRvc=STM`3BUZKFKjؿijskdWoZ[Wp}mxeq{yo~~fS]|nUnZRucZizkzx}pbsn{vMSjqwzudx}i_WVkfEIL507+[]^ï˔wkjuNc]Oy|ttnwcy_yoYPVqSVVSFhdi|xw{~{{z~wqnvplkpn\f|J7OMfYD^^V43?r|¿ε|{fr~WfoQKJqhkn}yme}iXdA]tdVfgRZ_swtu^ot}Ym}vxipzn{mnjkygJOXHCC=aIPulq~Ǔlekk~dWuuvvv^vi_|kQJNfIMILJ\kINqxni}qto\kaxlmmm{|qihcM_fyjC\`aC?;Yvaeȱheva`^|jx{~t{fYerVgLKd_V_veb[b}}r{~]Wlr[[n|wfiyzhukiw}f`\T9;)FQ^g[vxO6elpgn[^si|ytZxKAX^P{Uxxjj~~wUVdOywTBx~i[`Xr`wzybWWvufrīr|{ˠ~hݧ]h"!=3.vmݤǠaiYmsMn[[-BKJ3[YHevQsdZ>PYwq6G|ojhZbhx|nUa5OsUPrZgnm|h}[VJcdIDmyY_Yn[kjcOvivŠw}nbtssʾҏaix+"GX-WiܙzxeUN}Sdj_2?\T=:kC^|`acbOQ".D<{}yhNkftw`n}pcnrz^ez~crqi{[|v}RT:IBKU\3.CTQЭrvs\~p`]IBSF\kpMx|T1ctocxzxpfqv{ehusrj\vk_up\UhTAMX$*>8q̈zpzReer~~bkxpcxe~a`uqƎekqdramtUtk6H@JR_>,;NL|jöҽw_vvf\^CPOMvqZ_m3Ruuiypcfyxqfrzlg\gvf{hlJbWF@rr4$68Qئufm]jm{idryo|pZ}rZjiscnd|k|WtoPH;@ALYV12DPXuϪryaymcjSITHjluMyS7dyypx}znprxkjvvvk\uizZrk\I]L?J}_,);8n|Γz~qbeir~dgutxhZ~g[lhlcl_cmWvsbQ|@==BKZQ06KTdqͦtydwkcqTJSHtjuKzO8f{}xy|stsxmkvvzi]thwVnfZBSD;Hzd2->>v}̓znjfjsfertvj{X~hZjj|p`g]cpPxvieDvG5:=HVX87K\fЬwbtlelbMTMfnwSd^7[{}kq{~virysk_~eoWs{Zd>HB:=lwE1?GeҨwgbmo}sbkun__oyvYcwt{}bcalqgOd^k=d[099FR^E;LchĖżѸhoogiqQRQ[wt`Sk;S{~ns}}}ioyrciuel{YiVc<@@8@Ubqápsp{h_boxuLsISx{prozzfrpbfpwOnyQe@656FjzZ@DPr{ʩnvwwxbbmnx]^f~lT]mb~uqpseabtfRfCVs~aVa0\[9:=LX^J>H]mҳxtquedfsaWcGamorzuve~q_gs{s]vlP5$1SvhV{iOMgsnvi5ZGnV8K+BcuwZINii~qgkSnjwju^Ko}pṵµ}~Y$LCjL5R/Dd}|`T]fq}o~iwVozZKiwTq]Gg}ǓGd[~\MqM\xg\]adzx{\ihL*Wsh~Y{gNjӬ~Lb]~_T]ktiimmx|pH>m}Ua^s6WP2Hf|vw|tƟ|{Zcd{eUjj|_SPXTvT[]M!Nyf}aXf~̤}yqsrZVRG>vnxtNZe2UhzlyS`uĢɹyp`i|zLWd^7Yp`pk9EXueijgQYoicmshpy`i{qppvaUngtyIAQgi}ZivgAbg|dxQb{uĚȶg\p{{kQbnWh۫hreLCeVJPahXZ|~jmne^coT_dblcCMeS[}pa~^{cqsA=tgsztowawy~c|ox{ʼa`n[Q)GkdsȽw~jZuUGmg1UTIbRsUkzdb,{~XzquQYcg{rp|xsxnaaeIOR[lơgoZepslo{uh͖ƝtMM>1^<7ȥ͏wuamgSr\Qg[dupoe~iWKPtbBgjqnlqWbd;eed|uqyYefYGbkxxholu}}nvmljyɥǧqqaQBKMEnf^p~Z[qb=ipIUHU}mnimnK`kajnzp|\_TdnktrhqIPp>Nwil_yujl~}vsxts]G4ORCPoȢkt^danaKdwef\v{iUJea[[LwfL}myn:Pe_f^popnjQWsBcwmw{rdo|sim`dtūkm\EE_I;TtknuMTZCXFZsen|qd>eO\z][zuZdYY||z|wJ_dTIT][uuo}~yvz”{tvYUdJEnYZ^ğ~w|eouU]ondWyona`jURj^SLbggmoJomIYVio}jQdjXNS{pw~x}}~{zemzYdzy|kNcOT@9mhiȫrqT}\GDcy`\yGPzqo\WU]or~zbLbntrg}r|mjpVLeA*zv]fqyolu{n`NgrgK3WŦsc|j_qbuhogt]RaarBDlO@imd|MLDeqiyijtZm[J\U`~p~msvqojtytwcXPW\;Jae˫qik[R{x_jjQqwm{m>JqH`tg]h^peyywmTSYHQbYJLylwt{}zeQC740Hg\(Omdwkg|k{scko`^yhC_s|z3iďC?[g{{w{vnfRxuvvnVWih||cP[w~n`Ukb@qkxƽ+k]=EI]eclz|pYyxXpɶoqwoty`ktdodLZp].ysvkplivxXun^kavoVXYsjq{_qxmrűweL&rXTFDTcjc>OULmRNai\EHBfmr{~\msiay\wsm_X^Aoo}acm_tchuueRXKqzĞ|h_M@SB~`Zb`\_A6nJ6FIOYPwsD7A-Klm{{\j{}mlyoicg_NbQ{z|r[y]lw|ti\jUhƱĨ}YTVWC]V|pwg]\Z7d\6DY]cN_tC7E66hqz{c_xi~uj}]_emTc`y{ytr|`_i}ocpj[ǟ}QOTaP]eʵnyg\U_?Uk=A`hkXN|F7EE2ax{||mWyerzkYZao^fi«zy}wrbygjun_mn]ʠxKJP_Ucmͷnzj`WdATmBEdmmXIzC5CF5_{~}nYydp{k|{SV^mbkoī{zytdxinql^lo_ȡpFFL\Vkrжp{oe^j@ZmBKemkTJt>2BB7d|~i[wcv{m~y|sOU\i`spŧ{|{^iuwwb\njcëÿxbAFNZWqrͱvsifm?jeETnqjLSd74E>=j}~cep`}usz{vxeMU]ebvq|_j|m\]m`nɳx{tzP@FPU^rwí}wit^GyTK[pj_AlM18C4Ms}{Z}ij|jvswz~TPW`Ϯ|x{|iuwuphqrtxaX\pi|oJBfSaZvg^_lnS-*D3>:3R[UXi^ewtVUvfsENxx-:O`_iV{vz{jjufp`^xp^cA@UdejiccTgw}jT=pM>GNEavx{ɞeMNL_?55CH.@Ucal[l}rq|zy|higeqpri~μ~lgX_^p_K`ovr{h{uutazotym`UB1_ʯnIFU;=5CI_F@Vbca_L{xWNOaytzyyjsuym~|mlxսntpdݺpchj5+CKZk{}{y>=djoUV@JdmuZ`k}ž_.EV1:AFaryWpt|:pqxhetxyqc[Z[ixa?N`ydfW{TWkwyrcS2XontzNPw~kîȤ[X2(SeaCB(BON4Ep}yvg#WaC_vNj~kirbhlé{WMdp`hQILcqnqkv|{mn}[rĦ|omudCNZouCKZIu[|u^butypQSgfai\gjbvrXjzdokeuRS6Ajo~VrykvaròzKgsx\/DHWhܰiEoxF8"lp`jsvwODu\N^yhYqm|}sW]uaKhy]J8J|ze|pgoZslsp[r|m}rpmboӿv[G@AJkΝbioRWYZtu\dn\MYR\aYgO9ERYqaT`ybdt}~u}mkuuYmzTgs|z|jZqyLTyi~ufea>Ou`ٯyU;k{RXj~^jS~sjzu}c4=_KRyqZcI|lpgPQxsidacCYKdg[so{fbxtX}w}clԴwlXSy\_CFVlêydk_cS^VZGSbeeF7U{yf^aRQO^tbzmcl{r^Zuh}pYbpfwYYOd}M{nort{zpS"(ڦ{plmr}pLDggYgZcQXrA`_AJedpk]Z^^y_Y~qlNq{Y6Bik]vzvsxwkY|ou}~rxxfWVQAADnIWyi`Y^VWsoYbrkkwa;=]{}{V_Qnx{}zbiDKmo~pwqvzKpjh~Zq|yvpyƤzk\O|F4Rmp~lthh{WohQO[p}wXei^UDDg9Hxko~oV?mhQjwb`qhVU]SPűy{\yuyw\[}rzhG'@XTZSlthRRukbdrlTcEm_Vlfs||f`e}{t{Srngx}yicsfOax}qiwjSviby|wgq{wsvymquO6<_s~qz{xdftvvmaTWqoxkvxq\Qfl^UZeuzhd{uyeNVm~ptZh}~|~{Nr{d^h^G8=]iC7P\an`goveW]>ZeamutzzxtuxqerzutzrXU\d_Vl\xunt[jvpqiymgsbctyzt\USVUOOUAH{rxwckjgWO`pvoYW^aizxblwccwxvwlfjH[qhkl{^x||vvrwyyfhcY`ZTRc}a\MLon\inlʽwr|jpywm[bvVtjzvyrevtvu`ryY[e]M7>un`izwvTj~nwsx{vXowri`[diWD7Cftv~wxphu~xpYor~o`o~z|cyvvyw}|i[[^]JOmzYlvxovt]Hbspwplsvd[mzhdegK?KJup~~tt~wTIeokt{kp}xxbl}}eSkyg`ZUQk|`b@9pf|olcj|yjscncMteOX=94.=GWnr{g]{dY||y|{xp|zimjqpggca`f^S\dizp`tpmf`nrk^|}s|jqao_[ZTZa[J6;^jgt{tkwxVGZfUPiof_\_rlQ{nXYu}q`dxltiqz}}}|tosn{f}umaUV[`x}aM@=R_\^fzztvxhowv|wvuywlYdxuorsUNoYMTPAFk|vs{|v{}ic^WTa{tub^obk}jjx^[^\\VUegesxa{\lweekmq{zkabmxt`v``xthVB7HX_vȭ_ji_cy~~gavo\aid`X_x~kXHC96`~zm|uqqfoxu{qeyzdavsdXU[WVYP;AaeypxylYUqrpqp~|pntohnoiiiiO^zWOmtvwypjtwcQQj}yxtkhotw~f_`>VpZOIGa}~qOTvonrkebo~wqbPT|y{rVm|{|wkQ:Y}~wcl~j~yqqxvzuYgsgtdRKEA7@]meK;Qei}et]d}~~ytzwsytrbm~|ufXZcbcZQWsy~rep~g}jbjrv~ge|hX[lrnfSLNJKPWU2O{}tsqiacnnkpgdkernOX|sZfZGjf\s{~rqrtkgyyemg_]Y`dIMTR`xfSY<@]ig_kxlkĹȤzrvxssp]ixxoto_ZrwpnXJGJEKZjsmpz}twy}]\wy|ohlim|iBd{delfcgc^TJLIPo}vl~|{kugdj\]tr}oe_Xdzy}vz|ubWSjtudkuwssnndgs}âwdlz{mbxpaiz{q_XC=Nhxt[1@jkeigyzpPctB(.>[civnĢjfbE?`lmqdd[]bha\a~q}qokYQc{emq`t{f^Lv~wmxorvlͪ^BFhnjH.6D;-7GIe~zemwu{]f|aW^zn{tbsy~tbZiʼnY[fjmo{uqmww~s{jecOa}dXd{}þɽôgRLcntlNCodAH^c[8Jsxji[r^Kjlh~{bmmrgZ]uv˽vlp|`W[k~||cūyaţtwlmb;3pmpħsvpjpkXdaJUhmXH@{[^Svksp_kewhu|~u|osfX`Dphcur~u~~|S{soYU~hxzwuqANq?KUey{{Vg^hOBBH_||ZXQU\basEc|h}hKw{cbt}mRnsrZ`gvkS^Ųlwo}}rz~mjt~{K":leMGp|un^D^uTN\m{LT@ktK^gx}~qbg|oz_~pxge`tlI\d_bnzjeU}^kz{p[zsΦ}}xof`a]K\K_|{uuuqDLzZp_qzl`K1^hQ\w}\izowprvaWtm_m^]_Gd_y_Olffngmy~}eךtocUYqsvrKazRL\nϹqwvuX4+-KTV[RR\bt|aGklxydmlp~hYwowlQ;hkX^h{ID_|ó͕cpmY^YThry}zr`nf^Ωwt~qQgyfM3Fb5Dhrʹٸ̰vVbaZW`ʽuqlgfYOI_}nbruiqy~|rfu]QofMXfirJcmFK;h}åzks|~tO[`eykxkfXXScSV}\<:]blRL~ۥl~}}cZzOJV~iimgqhiL\wh7%(Azrbiu~n_rghQZyz]rwqwhVq`_d_zjRCC6<`ʫzktuyqmWAbl\mv}xn|rTph[ew~hOogCHNgu}lsp^~K>Mf~sp`mDBrTLX[H-e]\JVĶެkwq{dbro]u{qz\WXqqdhhabksPKdOO>rzjo̦sxfrviX~gosyegx~_b[PEB3'4Qq|pϱ{rZr}hdigRVyv^|led`pihQsvhpVWPT`h`Zwijv{nw{Kttog||vnI{jWLnQ[vwR+nuTLSeȡ¾~ylUmgNT\p~oomQm{yW;d|G3G`[;Wvlǟwop|~dnkav{tv~p|~WOKTgnZS_cc`TFJ(UeZU[ϻlssjL_wdqw{~|mnul^anpvR7kM\^OO`zo}juq_yYPk}|]e}Vr~XOKYrTcKi](7ARVZe~{ȵȤrputprvSps}opXmanxc@`ucbOfUWgdGDr~ɱxlupjM|smpuyDrlZOCklre9(PXD3Cdnc^ּɤ{lquwb[`iryv|gjjhVOL_irgefTNakzeM}ƶhw{^Vzpzajt`z{fb`c[UT]PJRipbE5P:T~a{ry{l]8fcbvhq|ZIxkURU{xYR-pgOgp|kugccn~diju~]~kdfGHVS8/W[^MJeJGTnp_{Ĵ³ĭʎ}y~}xnmjry}{~NHy[fPb|sX6%Ug`~ͪl\|qt|ZlTl|xwmiEjfKQD>i[zk\f{UNŷg]ds{r{EHYktzto|}kiLyf^`vf{}uy^M]o_MZPve`|[Ɏ{ޠwrߨz|npj_rB|olbskyxf]]XpW$oGE1)muxo?@y>@_w~FPlStoXHQ`}hIŶ[OLQhNP~|}ve}rKx{qe`Sbktwurl>yibIuGXrdhğ֡pso峋}yx˕rjw~VJqoxri`i}rkhbU_w.Ph@NR~y|}\+#eZ9Kmg5m{LaPKSf~LWȜjXUQ_uo[dd|woqgpXslh]YUxe{wxqp^U`xN]^GzmmcŐvΒt~rܨqu|{f{f]Cthiat{znhg]qi(l[GI!]xxuL 1yR=SmxT;xvjObKOYpvMeȚmZWYxq~iccmvvjnafgqk`XWZ~m}uvouR\byLaYDmlcsȓ~py٭rvvyboe[Frcb`ypjg]tk*jcJU"PwzsO$0u]@Ki{rT;{mtHfONXq|Xạv_\[wvxuZuczroga}vXm`SUWt~rtppaLgybLbEq|ik}őʝs|~淐vxtzz^cmSSqca`vqff_po-cpIb,CryuT).rfFIfrpW;hyDjSQ\qaa̫d`c}yv|Vdynmcvbzv[p_QW_zvtrx\Ph|fK`Gx{hh{ŞwณqwlwrY[|eYRo_`etiidzk/siQb)Jt~mM'9~bEOhu|gNDsnjIfTV`}}_lȢ|eemklcvmtvg_xv]bpykZUWmy~ttrHrdWUtQRrlzfk{ӭƔfsujaR_pRpnY|kbevqljrHKRjP-_wv]7+axSC[iumY?p`}Jhu`V^mi\úvjnoUg~{lo[gaozTtcUYeztt|_Tl}rGpz\M|{h{|gw~}ܼȧjvxgxgOQrpUdxMrfiuvvz]Dbde/Op}v_@,T\ETeokWCdayWT~i[_llX|tvlYky|msY\}z^k{O|}h\]hyyfUr{zGhxZKy{gwzfvz}vڿɦguugxfMPn~{hOcnJtjm}~}\Wbph4Uq{r[<3a~YFVckdSDt^|QYk`co~aT}~sXkwwlpX]zt[mtMyk_bq~}f^t~}IcsXNyzfssexrp¨̧ky~tethKJh{zhO]qFvtjm{oUsmvWtVR^ecVLaphtAlzlfm|rW^v\o}|npcNXq~r^Vx_Yv~ngnb{r{M`zygSZyhq{~vjjxof|műě}i{|qzj`lzgH?QenjZK\rIypww_maF]opbMBX{[S\baVMavcyC^~qkp~y^^zYpv{ml~hNPeuyo^TtkPtwlrll}~WUn}xiWW{kmuzuify}VoǴwrflxxi]dtiJ;I_jj^NWxQkt{ycopJXlodRFXcW]ccXP`|_zGStmseb|Zutxkk{hML_nsj[VvkQr|rxkr~[VlxtfVZ~lltwqgisxRoŴtkfis}{rdZdrfH:GZecWL^vNurhtkM]mnbPJbaY_daWQlofuA^}spw{chs\qvshm}{`JN_lmaT\{[_wz|veuV[lsl^Vgykmrridvp`]unǽ}~Woisxsh[[joX>;K[aYMNpfPu¯s\TdmhZMV{r^]bd\T]\x[Brzrtl_zyay}q|xjhulOHVeleWSpnMmx}qxeUdombV_nkprkemnsO{yj~vckzgovsi\Xeo`E9DR[VLJhlJo~}nV`ki^QVu}d^ac]V]`ti?f}uu}m]pwinpxwjgs~pSGP_f`TQmoKj}vykVbmlaW^njmojclmsNwsdywblzhmrpgZXen_D9BOVQGIhfGlp[dmj_U^~}gbde^Xf_yeBjww~|f[q}gtrw~|tihu~nTHP\a[PRojIhyqYaji`W`oilmhcnkuLoo`qvgghkrog[WcnbG9?LSOFFcgEviaenmcY^{neefa\fetsE^~yw|}jZgyuiuv}}vkgr~u[JLV]ZPOgpJniwz`^fhbZ]wvjjkhciurRZ~s_dq|Xnglnh]V^kjR<:CLMFBUmMWsppcjni_\ozjfge__x}bYHp}wyu`\x|csx}ypgjx}jQHNX[RKWr^Mgzw^agf^Zfqijjecsg~tJe~~j\lsi_heihaXValdL::CJHBFaiEilwoekmg_byykhhe`erhRLs~z}r_`}w`~quxtkejx{gOFLTVOKZtZQ|hxv^`fd]Zhohhhcbtc}qGa~~~}i\k{qg\faee^US_jcK:8@GFAGbkHiovvgjlgacy~mhge`fvdZGk~xeazxbypptqjcgtzkSFHOSNKXscLh~{c]cc^Ycshfea_meozJRw~o_eipQh^ab\TQZhfQ<7>FGCF_pN^xqjjlicdwphgd`ezaaFg}idyxdtpmpngbfszkUFHL^nsqdlwsmnzsxv~sba`[Xd~l`^^\^qeu}Q^pytaxqvt~r[NJSdc[jlE[_Wpvqpyxu\U;;@CMjzkhjjit{qaTyzrn\xz~}~lREKeywwvMH}nWpmqj`^\XZmpiijjulmcm{]oWhurvvspw{`MIR_gjugL{Zg}||hwnspg]RO]zlcaa`f}gzPa{}Y=6@Wl}Yw~PSgiegp{}pactsXjtjmb`]WUa|oda``e|j~PVrzsmov|zzwxrh|~{s_Y_iqxg|zxU\pc{ofh{z`PJHFJ_{Qbj>Acqpmnpne`mwxtg{}~{wy{`IAFS`nflh~xxr|{{yrp{}ywvzvSSntlfeikkqǾmm^Tmbcdbafs{qZHADJPZpsRxcbzuuz^opd|x{woiqqd_^^fjW_tr¬w[C9P{}qeWhVngiwoeup{z~\odaDOeDAP`Zl_k[:T1;ERIHWJMpKfQag`z_OERmhfPmI^TQeL|jxpxdz`ovhwsy{xkwc[jk|iTzrz\Zurbq_cngfy|emyxeur}~YLSFNVvwuklUT:SpQFSTZRm[bhJk~jSci_ya]DeVAKbVX]xsyeixPlbableum}kpxukj|INJXQ~xc_hgqVz{uuu}lftt}SZ/Dk<1Xȸ_tZkic?W[LK]bQamVHkUJPuRDZ@ZyU:?m_5q|k~i~ntShxu^|up{wv}{yjfsp2@|o~nt|ku~tjomirn~ngbrt~zswyr«ël\z\JSQHN԰yhvyEaSCkfI/StFYrgDyvmjKrohYpQKVUIHpf`yxw`~^i]lhh[gvgxpiof`NN^[cqwb^`vniy\t{u|zg|sz}Ǘu[`wD,H8csrlɮv~[iq[caeOWdkI`ibXxaPeeTQlOH@LpH26d\Fl{~~q|cgkWvO;j`p{sLvvesYKs^CNY@G\eamotwdn[~fYYqg{}{qwsjhnC\DWTluuv_n}zpyo|wwv~lΎ~~w~b]cf1KK.9SO}zxūѫv~]uqh_YsX[qk\_kMXxYYdgSLJ_aCGRqil}ftst|~uvgUsEI`^@C`i}Ysdv{zhpcqruiwjoc~p|z|z{vsjeROu``]?SUZc}Ǹmz~dRXjbPqvfrN_xr`ebLcTCOJ]ixtmuyqTqfxr{hmoawvqZ[i_NfPDer`iref}ovkuptw`q|azwwuot{zoqxaMLOH[VM.`mOCVzw|woth}~htyrsjZegT8Z\W>byobksr{sxm_e{aaspq`zxu}p|^vuryVNU`[H@RqV_ģ|sdikiOevUgniY{r|_e{WIbj^dvlprjrl_n`xs~j~xzvnta\_fWBEI7`ag{lvknp}ww|vy|tptty~~rdkn]o}VUXPAMFG3dhakt~ykzglqdoyqgrmhyRSmZV3;Nkfik~vvwyoyx{~tracsxWRC^~YKW`V`|éruq{uvffbYk}h]|s[bj{x`x^V[we`lsrWlxW0GlpjfNya[v{fwglowfI``THVk\ap^w{vxqqn\Xuagynuut^`odeMQBR\Dfptlw}h~pquwxduxwks~nu{ygsktqiriFkM\UG@3AUSgksl}ʣ÷qpvrpzqm]elsvuvXlm`^kRUTXnuu{x||xygvvh{VZjSJIJP\L:b{nwwmyyg~shwmtnv|rswUylmj~igNZvgUfrWB9IbH4R_|qy}ļo|}br}tr]pm\ihmQLjVa}}ih|{bytiw{{~n_|vT_uww_W^db_dZFChn}wm~~~bmwpg_atp|kjy~{~zrvfct_gtmwhoQ[j^YeBL^aQTMO[xyϲ}nnxlkisdr{[RWA^u[dE_{{rp|ungzst~g_cc{qdHVe|`yptl~xzjunkypto}wcUbv{|dykr]m]UhV^WVX^WE\fBS/HaVUcpwkdtmnQ[kfgzgxwswz~tdw{|f^MisMUXbi\_LZQYmsthnwy{tt{eyqn[wjn~waU`cnxvtrk_fmRPapmZ\VcfceZC5KMLdJNm]fmjmxͧyuli~y||cpq|d_pQrwm{vky|g|yyf{qzvwqqmi}rmwv~}ihmc|_pmnzxypm~YZj\ufsu~vqgfz`wu`IM`XRj]T@F@]_?APHZTN\WUwҠvvqpdvw|{a~c~rx{~ygjk~~ibmvnPffcpjihpuqzznxxq{||}°dGNnmg=-F7@JKGOuyzxy{~vfszOYmNXV[ZPecvvcjpjjyG^ZE]r|~©tsgz̸|djMLM@TGO`i]PZJ[{RjbNQJOFXswyrruynsxinghmu_r^Njlsjgumrx`[;J;:8<]klUB`E4@Whmw_n{~zf~iyufik|vto{edHPdV^giƸyy{pr}ttwhkn`Y^pif\OYQ[Q??RoPUW4_ZQSORdrj~x~gidlyjur~mTZE@QO_znrrte[VT`xbese~}w~ͫűm]YWRBi~°drcaThtlzo~_[mQTWbdR`ksik[[rf|xe^bfqqoaOS]mokƬv|s}u~xq{gX[GaXWrpxqUF;CFFV?CCIGRdBN\GI65ZowztgmiZivvs[esutv|x}ǽxte8MD42AZslo`^womg`iiOfnYjbUYcsujleo^WdggmkzmsldkZM[iT^jns}np^q_jljsou[m}o~}z~|oxjkξg}vwvdYa_`g^^R\WNMBI}}wzvykm{stbnkec[Xiz}qaTc}yn~|ua^V.IQ?J@P¿xq\S`tpe`IbwkXgSEWU>RNIk|{mWW[`od]NSlquihyY^mJLajdkuɱ}ulptOX]ZUVnҾwpqao_LPGBWWOVL@Qj`^aowxmgloy|tt}v`fW^MOewsyzsqs}kz}hvo{sryu{qhobh]\C7==HTL}wzxmmeS\[Zdmhy~t|q[y~{piovYzxUjcj~Ź||~s~u{ZypyeNcN=RTR{vkaYW^TK_PWiIPhVXbm^cacxokmryeyqs~wkm[a{LUS:??HI]rvjn||~}vx|odYG7>D8?lv{{uhjqhrz~fsjsod;Iwv_YvP`r[Weznkwb`fOcYf|r]fkw}dh{l{ύwtoz|tzrobz~tz|}xaaurwsnmgkS::cpjPZkgvrof}wwwifunpNdteiv~}wpqwˡwGMuġsYXT]tujgir}h~qj~jZ_D;Gc]m|lkeapu~t{{VOFF<[bQ_CY|[bdhcndORYjtŮ}bTVkӼhoMC[TFNVPsra_\d^MQ5BC>P]j{w{epqtaag?C53Yfeu|Zoh^Y[hl}qxlzwn{^C?YTX{ʲvoafkmtrSTKET78=-57H=Jzquruz}{sez|zajXQTKSOWwd|wVm{}y{xhnmffg|ũó_d^VUYlڬnYJ^pahZOYknO]T/>02:9Jo}|zxozpWaC6UD=HMnpmo_U\p}xqnnt|gg{ɼl}\AGJEIcntspWbibPDBFgOCY8:JSQObowy{}xm~_bnJBFA::Qr|}yzq|hmlo~uuvdlzȦɤgZJP;Bb̸ukkoq_C]`VKDQ2)/2LBBg~lort||rsu~tUPMII:Fulkmz}~yfafceil|˸o~TVTJP]o̮zobfr]fm``e^GZM#DL8(4==LEI~z}s~xnfvq_s\JW[VZ^c|kllqkbpqlfl|ų}fir<@ZWZbu˷ö}f[Yty_a[YhiT_\;8I<:GQisrzkX^D/4QTKf{|~mkfm|y~utmv~xjhUS6.6DS_ûbwqejdXLJMKPSE>@JYfl{vömaePGK5NSQajmr|uzmTX]^M[o]prs}pykdkyyxs~rj|xnqwqkmqqlbJ[wULi`V`inwwBC\fjmqraqzx{k~wuwy~}\kxU`psv|yvǢlarpruvdUp}eitwxtkjmwbww}{]HlrwjfhaKUUPT?LSGSbylkv{tqlnnh_Vjzomk{}|sVB^~Ǖ{vzzhhxn[`lopovvvbdILuưsdbRQ]gQN];?MFPQP[lrmo\l}{~ll~idrr\fmYt|obf|hq|nqeu{mrertaQU{Ĺdzv^PJV_=JPJUD@ACO[\VdnZkuixpn^lnYZrqkrptvpagq[z}{y}ks}|gryzí|sx~|qppW[cSRdbq˴znj__eSKOV^c``f_bfMUaObwsqubuxmnjbZXV[cN^nmzwxn[kudrljy~lWUND;8J_fvrXP`M=>BFZYK`jfdkxrxzwqmmp}Vszw{|zucTnnPEPdYfe{}[]fghlr|tzy||ztrmfV;D_TZbioV@JgYILSXTNG`ajq{zocWjj_fsg]qtqgZThrZ}}pvzwzqxxopéxuytgZTd_FHEOoxƻóyxxg^oVL`fga\^d^Oad^jbq{}}~}fth\YNGKMDA95Vwy\yupslqoraUkcT\ba^pwĈ~{yq~dy{glwyvvY>fw^cncqvrv~xwy}e8Wyqhb\TdfSVowr{rxl4Xͩ{utwz{pnO\|eZXUI7]wwd|iacsfWWWWVQOhjIxq|q^Q56xdWaXJjqkptxzws|xaxpdtpqtr}̼uv{hlnmg]V\PKrį̻uHEYEbv_P>)/9CB@Yd_WV_SX~q_qrNZzna]YRG:-8Uiµ|{ŶzcS]dxƦ|kOBC1+,((;UO^xx|vvvs`\UH85A@U}zzytqtwvohsxzr~kphV\ks©}sh_`ZROPNPRCe~ePXLKRZ~rg]u|ȭ{lc^Q:#!8CGx{cilL=PM=AEGL<;e|zmewqoo`[luavpluy|omdN3-0:mºrkfgePMgS:8?@&(Z~bSejPDcgfu]nnwtqgc]Oʲ~gZjiYX`hQD`z{_vxkcmnUT{ufohZVR]tpn½vol_L;6?3*Fk}of^]`\KVZ=Hg{{snhUQgikd[ntkfoygkĮztpsxwx|uzn]`N6>?.?`}y}}ww}~{cl}zm[jp[UVPEFOFLVVoƿnwyeemqpuhVkob\\RCZvfandWjwy|ib~ldtwcXYVL?76@>+Gyʿ{flwfnl{wj[SR\RD`̶mXQMKIEMfY9ZtvcrzaRPWaQHfdrkaxt\RQ]U;A]j]fҸ}b][XSLLSA3KlwnrsmkiaN=UdDJrqzom­zqg_UH;5CVQ[Ǯ~pWUeXGNP9=Yktslgkp^g~|unlxum~Ǽ|uhd^]l{nry~yqZOF;11=;>b͹}uooolcZ^n}|tc\qqcoo\_gcgsnsŶ|ngc\YY[^e]]½|gJKOFML\jrtkfffin`XythZ]rgSPPK>9I]Z[~ö~w~opsy}mk{updRFEV[IkyjrkVNVe[Tgy~nw}`~p\[ZO@79LQMk~{|yhgcro^vwY`i^OISkqwοŨ{g]VSRMMcp[jzpq\MXT9/FDf°}q^]no_JSq~{sb^bcond\\esmjƯrligfi|oa|~WMYL1'*8?5BhȺgYo[hveTR^`H@XnkaxľvkjigefoiVc~{mgaWD4IdPIk}nx~{vzpez~~ZYndQIFB:57LaVT{ijw|syyef~lp|ld_XPKQ^[Ub|vlcessclqgvtyzxhWRLFDMTIMh}vnjlu~n[`nb__KBKOSagauǼ}sjfcbfaTg}~y|pl_JKWSSMH^xuoiyrZNJC74CQKDZ˺xr_ZZ_`LAXozqkzwwridhsjRiyrzoj|uwwcfOJG=1,3B@:YƵwfmtRYuye\ymU^ibYWbogax{kc^^^]f}z]jv[S_V>8FRILjǷ|~r_et_`rjWONTZLB\pgoļ~mikjhmo^[sx}{h_XQH>5AWRUqnn~v|uu|l^WQIB@FU]fržser}spj[g{ustoie_YQKLWffhô{qhcfsxndf}xr}n[a[H;68COJMiqnwa]mgRQYI3:K\jhsϺvogb^\ag[X|x|skh^H?UieXc~r|~zxyzvhOTeW@73/'&9]gXrϽ}~wgeoq`ayu\umfe`XV_rtcprhhtwfg|tXgiI=:4-.;QWZwĻǾ|wre\nwbdzytkYSjyr[MX^[^nǼvldbbahw}z}rpycP=9DA9H[]j~|||}zyl[`ocRJFCISPYpy{fXWY[df[c|ywp|rc^YSNQXak{flyyrkrznXNJE=9>N`dx·ueatygby}teYix]JPRKCCNdss˿zld^[]l|cr{sZbhTCCPdhex}zyx}~dp{nXM]`K>BMB/:\vyȮ|ohda_end]ursla]YK;?csad~olx}}wY`lZG>:4/1Cewmyzlw{lfok_kv`rvida[X\l|xtzlc`jvlgwyxyaY`bW@2,((2GSSfy{}{i]lunk^LMV\hxyzsia^]_dlinqqxdXK84DKOVUd~}twubWem[LGD?@Paa^kõmghnth\loco|f[WSKHP]\Piqk{yyodlUOME>=HVUSqzse]ojQ^v|viUYxxSDOTNKRdpls˯{tqnqs`}|bQ[aOBHXYP]x~~~hbz~t_UcePA=BH>1D`bc|Ƿwmjigkn_Ug|sojcYQ]smfxolzuv}hfjYH@:4.0:MZ_fyĹ}t}xk\g{|wxuplgb[W[gnedp{|ofaco{wlemyyzgaaQ@76>LPIUrϾývdwnbpxici_IGVfrngyyoidbbfkaUlsn~}hYSH3+@TRBC^z|lpwbWSNFFWojR_¹uysffmkXUj|lWnuaYVQKKVc\J[quuzs_wsVJGA;=UB Y}[kyerqt`szzbYRixtxw~ex~Ytphmfgp}vsģspxnw]j_lv|˻ɓvggH[jRa{kq^?orq]DGcWfxwze}~fWtyfmhimOq~^PZB@zqbxw{Rf}aqtp{¦ndj_df<5`cn|ӫ}wpPOG4IQHB@dchTO\OPVUm[tncsT/o]_Xh{ogreOléyk^ingrmowlkus}vu`C)=LFQ\ka|aRg_8_uLVP;Y]Tyv`|bh_dhWh}w|lvXQndUl}wYaXWUzvauhvlqɧ{iqWK^_Byt|QFyp^mjR]ualRMUEQ_Zkc{mztpor[Pq\Obb;`]M:9jm]лʡhvqy}my{}||xtw\3]WES]]|uiDXOA?:VPDcw`PxkaptYuezxsnc{sf[S``HWp{~q_~kapvX~eVafzɬysxngY\Nhspʭgk[HG<\aIbyqK4is]kzzuzqwyanXbjXcYpxh}q_FgWHXrew`ixvǽÞokphbzQ;B6WoiɑjSpYLUUaNMkd`DA^HNBWoesf}~h_\aVnu{suPdvu{outbmwsu}|sr}lk~wyLFP3@@YdnںŬ|erqwUWlZ\rmBc}VOFR}~wdZ}`gbn[lnsklkZkuvhogWdgutwy}~tp}ʮfzmlcmtnsJ?ZgfZnjllglci\Dh[;HH_wiwmw[{}iko_jvwdXGHkrHnsӬvfgmoalghrztx̥{v]xh[P:EMc^GƯopdyc_`gmd~~r[?crthz||ocxxe\e_ng`ke[yw^W\rm[|IJy~kq}j}m]lwqr͵y~WZZu88IL]VyĩpciqIBC\cYq~mGgmgzy}oskYgvoI`nrYfwjRJMXNXjо|ykneqzlq{wi~orxMLL=CJj̫|{^d[]cO[aBE?IVevw~seksoekTijcgBX_e`Lussp{i|hyr~vmy[QYSfvoXTdUdl{tatcnUMuylRSGhXRgSxxsxyjfmfcM{rqiXOGX_\qkũfibfxlhrҺ\|ZX[ZwYV0 @AZoĥuxZabl`md\quc@6uvj{e_fhhvxsprb^hsC<8b~h}mxv\mtxyqŖjhqj^=Xy{c(.Kd~w~og`mwWRFTnNI^q`p~^t^r[OWMYkuwrfNMKamĜ~kfmltcv|yfjVwvaY`n]CJ=D:X̨{kytx{^h\h^gf>JHX}}|q|]bkknajPWQBK_Nbyvuy{p|{vrqqrp{Ěwrc{tVdhc]O<,ENaa̼zwi`RfmpxgIbvozrlvkhjtXcmh^ra8C@Ohbjųysuzjkv|x|veU_kZv|tSWycRO>ZbYsow{cfhecAB_y^qu|lkubfei`crjkdZEVe^XƗ|ixvyerpnti[}uu?[qjQI=T^Ggz´~~aymUUVGyXbeqzxv|u}yagpRdkvmGKeabZrzyl|\zgjymtS}y{zdhq_NZ``D0KEHZXqtw۱uivx^_gvkd~lwo]MpsbjbkpZwc6DbPG}htm{wzib}nrY[na9eoDSF&GC;sntzپvtjkFLtnnyyygiYaLjqOr}fgNy\Ldpel~~rer~j|k]vnmxQahj\KgXPP8CFIjx}}pstSa]KEtld|^ngjiYdtig\jSD=Kontwiu^wcyPwhjsaZG]\LX^gW"ERFZ{orүk{mZ`[nqjkv|tZ]vWPca@l{83>BnwnɣȨs{x}lqimmnopw_]^EM:N\?Vxa^Qq||k}q~fOjq~{~ygvqXEQ<7cU8<4II8?q}Ȱȯvwpgjxkr||hin_NkvaUsyokM_x]`ifa|spwyoxZPicf}{rX_rpfU@V[NZFD:6V_pzqxhguiOhwok}ruiqcO^X]]\w[QG_sdmzpdvjgd~uk{fxefWaeIGRXY7CGB60>6BkSA8S}}~qrĤîĢwkinsrtfxavakxMftyv~f^|tlru{h6>E7HL]?Tk^~wud~Kq~qYG.&?{zOjrkjzq{UptSt|YWpe|SmhjkihJNy]CKLwt|bbgjykiavodw^Y]W|شnwjIpydogu_vr`ɹX~r~uiǙd|}~iV+WcơqjkelUlC1D5GFM(/W\X`h_N_iwpŧ`ִɮsvevrcno|}gjǵouT~~kqOP=HEJPXG@?\Meo`njKOWdf7mjnkZ\wxii]YovxfPWhcIp`Q}pr~[|ud^RXmZa~t}xzha`em}t`ǘ}ǜypsgyylgjsvhdVyb\~qd`0QIMMID5-Eq8JWM`VGIX`g0%Pg1[Zgxiiqz|pEr{xhpu^a_BZw|hw~whabfpyrzvci[by}gf~npsxs[mGz`;N^T~yoTOlYLmgRZtCKoeYnvpXhpnptnoh`aSL]kmvj~l~sw|um{vijjUIv[Tlep|}z_Sd|[s}lWmr{xtuypmobyf^iuXFKxNXi_~~~|ZUuoVtwe_yUDnc`Y|qhWY~qjnnqis`x\Ye{}}q|xu}nsyqeuvvwo|_NgoUfh`{w|zw]hijm|Wkfrutz{rqwyzjhf_rU@?u|OR`[nyĪ`QsoQiqcYqT>hdzbR~wmbeyzwylwazUQ^uzv|luttyu|k{yvuqfuoQC^iR_a^|qRc_dzziy}Vno}xim~mvmr_pZZUfG6?yuQXcb|{VQycUltghxUUzwdevk`luwqrlfm_iLLcw|rru~phxxk|bm_s_JHygaiio{gS}}bwxu`oy||{niy~~v^xxkgf[cXe`C=aiZbgeyY{bmzzkzlOk{}tVrxf``wxuuouguk{^R^w{w~|lv}v^vx{spsmpqQHcv^_d_v|y[who{uy\si|~yzxdm~p|}brqvee__Zb@7LnSV\Zxw^ufhr{mumPc}|v\jnikw|ntpu`KTlv|}y|qn|gyzqlljflIAXsZY_[xu|Zudktu~u]ts~~~pYczwarmpbXZYUW63NjUT\\~|`{gltu}q[o{gmmil|{{ztwipmp_EPgq}zzq~dqu|miejaiIDY~d^cavuscwmqx~gtwt|x{}{[byrz~_c|iq`dTcU_@9J{]VY]ktx|xvyzahvnamfhwyx{vynourvONeq{zxwqrkczt`xeoUFN~i]Y`^vzuvm|ptjgzl}uwgWjymu\vxuroQbXZN69]fVOZU|u¹usxzl`tsmgnnw}~~yotuveEQemtx{}yn|gs{skdobdEAU}bWZ\ho}wuxoqozgp|o~z}|{ZQgs|}~qm]unqhmqH^QVC2:dfYTaZ~õxwy~rlxujnozy~yzrlnpr{cDTfpvp}bov}pe`kb`EDZj]aalqy~v}}txsltxm}ytwwwx~aSivg}kSi{mlifrL\XYJ7>bq`VcZ~uü{{ukxp{almuw{z|wpqsx|vPSiry~~tnhf~ywv]ndeLCP{o_[c[z|v|{{zvq~jnxytk~twxyv}|kObpyyew}sUgyslodpQTXVJ5:XtbU`Ztrĸy~vulwndrs{z|{~vnoowuuPPfov||qli~xuypYfa_F@Oxp_]c^|z~uun|~lrwxn~vz|qunyv{eMamvwf~kSeu}jii`eKQTUC4?aue[g]xʾwvucps~txv}mnipuspNYjtxuxbl}v|pvd\efZDH`o_f_mpszv}rwnxkfyrt{wyyvpqm|szZUhqv~ueyzXWhxtfned]NVZS<;Nvn]``bz|μ|t|mmpssyywxynsk}rz`Qenuzmmgxyytp`bidJETxub_`Zyutq}x~q{ksk}rgwt{}x{}nvh{pucM_gnp~d}eWgvyinj`_QOYW=7Ei|o^[_Xxz}u}t|m}yy{}owf{ptcM`hoqttiwz~ynlb\hcJB\tziwuUfnhZct]pe\przlJD=bt{p~u}{qkzqI6I}\UPJt`SlK=K^jhWvƸz\R‚F9Rqh}wkwsTXXkkneuZ;C|[NBokZ{fUfxq^gklp|krv]{wT<+;lԟaVddSaOfsmaq~||kvwPAQthTutXseIUjvweyQS_ynpd`sTyxpz|yupqOOWetå¼ro>!.dbfk?HJ&)?NTEMjf|smdutVR]cxot}^{]opx}sc`>-6F[ɳ}mrystX\yv̻dkkM=Wcưan\LfUT]hZUZg[V`HbPIA)253-C^wvj{vnsTUZfgfifQW]9XX=D`u[^p`rkObxxs}y|Y[xdXw{xv}j}{z}zn|claguɲjQ_<4WADcȾ|rkrPE]edTck`yqcpcLkqO^fislq{fwin{u}zw}ivgOfE@B@Si{ѵty~s^jvrmkgDRnV^}ǯuvnajbclrcY]gUYaA[O;E>FS\wt~tqv~}}xaZi=ReKVv{rwyYayzv}yxgtLNR.78AXnDzzo|eV[`fdhgYKfDEgKFX{i\|{hgtXVq{xo|pxdRuoVrww~sy{z~~wsseikir|ȳ|ubI_@0ZHF`ùt{_McjgZnk`zqcnfOoqM^_fvptykrmquvzv~zgzaRgD>EDO_rƲyuojUskZowzm{|qtr{{gudO^wdhg\_kla{hcmo}yxtrj||immqmlh\FbQ?o`S`{ǩzX?at=+MUR{|{u~{vex\QhJIVTX]h`hkNQVadnql_uhx}}ntamkp|w{q{¾_ACndC6=91OA;]IJ\\]\_~i|yvxuxvmXshM|sbkmLNS[w{mVt{zxoyr{|uwr}vt˽kEZt÷{f\PLIC/IO.\`JM_pyzscLfm\LT^Rp~nuvk{qvxpt^OWovqlYlkPnjViokjh~ŧynqvZB;QPoz}zp`WeZUzaT[IXoug[Z`d\QSgr~ytwelyVboPWeaa`xa]{{uqrqc]df}s|yx|m~{|wmfYIB\wĴi[lMBZB8KKFAHtxkzqnpxhUp}xvqpnqpiWroPz}jng|v`LN`Zzsvvxqv{s~}yysmNX~ŨxpkcNNhCLnZPYjryuiKSj\PCXVXv|npzoy}lp}lu}sokeXPo~ljd^yd\rtnit}ó~uwYkbO@Gcf|wg`n`a{_^ZI\mpaWUZ[[MUuv}wsq`quTdoRXliec~yyad|wtutgdlh{wv|n}raXUTSKnĸqbvaH^W=NXOHIn{jwrihnmXk{vrmkhkmjZfyVkur~~[ho^WRrwyx~r~{~~{yqzrvjej^^Ŭzroj\Ql[Hml\]jqwxmOId[UIUi`o|yytf{pqs~vrlsf__bfYxtju_ww^n~vop}umIX\PPQvthrtezkdcMWhnaTOQV`VT}|xqm\nxX]pYUongb|{sqwlm~xvwvkkrkqw~rtqvaSNOY]VŷppaThZDX_TKVzqkxmggni[y|zqojgeijcZrpYxwxfVnd_W_z||qywzusisxmmyvhbfj_x~{wn^jqRcwibjqvztZF__VPIdeeuyxdyum~~vyuetse]\`lZi}n{|}vl`ZYgxbhyosvuumS;T[UUMkxwin`tt|vcmzsieinzfayrjY?M^^ecD?ZYNIer_lneejrfh}t_ncIox|}w\`jk^QKOWiZ[ƸcjulP^XMLmzjy|truyigmupj`TMJP\ylh|wns{ta{zymˠgXjϠe_S@Nbmhdeluolud|w|m{ra[vzhutkimsgiqaY]mrqtx}{eSmpe`N_icnx}cmronqzmxͷ|Y>Vdlm[or^lphfinb[~ezwqh]Y[^by|z|}}gPfodcSbvrwvysrv``kqh^Z\br`N{w|jYq{l|}{s_LBCL\ĮtWfp`\HL`Y]jqdepmjhk~~vYWcke\VX_phOznUfwl{lxrvxsrwr`tlszyrhccfhw|mW_\]bqĿwz~wh^Y[fiEX{kovgOUn`[ulkzm[a{nhytnmrugmuzk_[\boh`xrjcPamdlvly~}z{~|waE<]dezxppqeYuxZpzkjf^SPQSWl|{z{~}iTirefUXroozpnusswumtztjcchwpOryp\otwuj[J?@IXtecvibXEWaV[dtkWehihinz{gT[fiaZX]ix[[qXVwyvyv~z{~tjlyxulcbekt}wvvw}RMVYcpп}yka^aojFamm}yjXDVm`_thdsi[fyhizxsrw{oruwsj]TV`nmg~xolXcvmjqgs|qzgT>9by{|wtvrbodgue_\TIGLU^n~zzzyx|}pYexlmeXpzmoth\jq{Ȱos{yqjglz^hp\kİm[I32CVbUYryuyspbURMA2*,6Lcn}ij|qpeWixibt|gnsssvʱÿv\:0M_fɶvgif`UA960&")DLXdrzc|iadikllp|y`fogfbWE/6_v}sprqmnxgYd]B>OI3;O`sȥ~{voheisiKBXeWMSYYP;2M`YV\ktcYfs~jspelukXSUTKFJZsvl½nf~|yum\B4Njnu~z}toqobX_lbK@@?711;Magd}x{rh{||rfsmbpqVNX`hsĦrat{[HB=3+,8Qot~phXFN\NDU\D>IPSW^frmk|now~|o||xxtgO?Tnnp}wlmldZW\iy|xzeir_OYW:19>CJWhzvxz_R`uqc`baU>/CUNJRf~}p{uyeXWTKA?GZsɼudm{netv^Zekot~ĭyhpze[VO?&.IMSdq\]oiOBDFC>?GWinj|ucgwm_lqZT_fimt~sck|{viz|d^nlO>=<6,(-=Tdi¸ypdQRee[hs_U^ccbdir~}ms~{pYBI``[aq|yxzwnggo}}}veZgiVS\I49@CFMYkup~xtupaIH_eZX_r~r~|q{x\RQMD;9ARcckt}zlmvxvuw|qek{yg\XSE-#9KIKYrƬpneVWXSKGKWegay|r`\kj[_cK>EJJKQ\mzzyePWmmddnn[gu\?662*&*:SiożòqaivkfqgSV`cdglu~|{}~g^duve[ZWK74PdehtƻnlgXZ^\XX_m}x~vjVNZ\NQUA9EOU[etĹso{zvwraLQhj`^ct}mvs|~~yhVd~qWPSSNIKXl}~~xn`eyxr|xccnsuv{rfgvrc\YN:/E_dgsˮ}orYTUQJEHUekak}xlyzmakvkglZJQZ`dkvxs{{zvhTWpyrptx^_vkI99:75;Le|ǿǹyfaooeicMJTY[\`fn{}x{omyzib^S?4I`bahuuht]Z^\XV\k}{yo^OU_URTA5@MW`m}ûrko~oda[K9A\eabjz|qY`wgF9::66=Ohzz}rcevwrxm\cqy}j`_kseWROE48Wlmr|˿|b^y{]MPUTRT^p~{u|wumbRJX_X[UBAOY_eo{~uuwc[o~xx~x_QhsU<79858D[r{zƽ|ofrz{xc]hoppsx}}{yvuxoecjzxh^ZQ>4H`bagspgadc_]cr{wl\LP\VRN80::ASgpm}¿xkq~jbmvxxz~oa[[ijZLG>, 2KPPXg¶Ǿq}_WWUNJMYgg^lw|rj]PUcca[E>ISVY_jw~|saUewtlkq}qYDTfN1)++*,6Kbkmľ̶´{kn{{xq[T_ghggkpy~}rgdfu|ob]UD9I_`[^h}Ưn}iadd`]`lxxmuvtg^QBCSXWS@9EQWZ_iv~~wo]MWif[WYh}vyoYctUHHHC@DQahcoƼ}pn~mairspmorw}z{ugdbm{scZSC3;RYTU]pñýywr^[[VQPXdi_^x|~vm_VannjXFJV[\\ajt~zsfRPckbYX_rv|bSiuZ@99733AL]hef½ym`fw~}n[]ksutvz|h_ZVcm`QJ@/,ATTRVbyͻļtoaa`\Y\gsqfm~xofXQ]kneNBKW\\^emw~{yk[_tzqjio~xkSEZiS912215ATdef~Ϳvt|d_jssqqux}vmjem|veYO>5DZ\XY_oywyebb^\^huxnlv||mcYK>CSZT?.5EOTZcp|vhVWkumfdhxwaP^qaE:998;FXghfyŸ~pkzy`Zfoqpptx|{xzxdYVOVfdTH?1+>W]\aj}·Ϲ¸tpfQFQNVfRU`o}vl|v_tXVP?OefhY\c[ZdldalnvcXWe{r^lf`^qv|mfssijpkYaknsRnܢXMQQo}}|nozsr~w{qge{”fYQFDکrdTjz{nur[Z]g^m}}~xqrq}ZPZXXN[zyWdssh^qtypembNNVbhvo}}p~yv~{zj\chjQ7b;}~yynmycKELPNfgiylgjoj]dqVCZcdZJ\r~qs}vir~[}tjtvxlmtWJMds~q~clqyhO=>K_HA߾w\MDSO[_S]\LNXokad|l_R[oskRJ`h{k|tnnib|eiknhh|lPL\yzo|±bgzoQA7X]:bÓy}~zszjREU[YZEENAΧ~w{vnnbOI`VWD7AC81>bslV~stt}nfvx_P]bnnl|k[|rybkrla`ylQKa|mtӾåaque;FY9TҬuz|qhpz^IU_SJ48GC5'=\we\njv~eh{sXPUghz~f^hj|oyzk`gdSMq~zml϶w`{u]8PU7fġpyzlftq\I]_TA/8GC3(D]tXdigx~el}mRPTr}f{||qaYsi}uqfp~^QP|xyyn̲ϼre|qT5TO:s澡s~|nl~s`Mc`WA35=\yh[JDuҜcwilnfp~pwsfpvt̰ÉaibL@Ppou`QLUmmqvhűciv_k~lS~tznt׫{ZVQtwmPMjet[LICAQpYfȱdQT_cuz~gedWeovdyPmxxT3chGS_zyoS\nKT:ump–vϹppmmysfm{{ioyw|ÿ~ctfgVO@Odvp]cMB?Jcjvqjž־lswXbyp]Cj`ci\}cuihlLHEhooSKnaufWOLN]hlؼg[[ei}yuzkw}uzɨƠl@clFLUhj]GE^=C2Zuq׭ͨxxtnc~edn]X[jggzws{uXgbe\UGMcs{fi_RRSjzmƶ}Q{ukfkyke|oOrbkj^kF^jkd3)?KY`trkúwpeWlTZUO{thgw~mEep_Z_eFch[RAq?7djzuqxqiQo\~{]™^\V_dYM:X\54CcP`vkȶΞ}pz`fUrp~aPqpJ\wz^rWZqoejjhXvqeWNLGXWephҶ¦{uedeotmXsmmtPeZZWa=Cb]G=FW7Kiv{̺ĕrwvzMmz]diYkr{hkuumpRbcOZMkKFF^P\wu~hyxu~nV}nfyKZ²zphgiiTikIFeid@@<0VPdS}ʺзunxsZ_p_[jh\si~twdnjtW\HS[c`DYiH:bwvzbu{r{gibum~x~zv\KfqNHNhrQO/;6Serp]ķ~ba|qtqW\l||m~_q[vc{qARn~eSfcDSf{t^~`zqkoixtqm_qlfxxd`a`@>SA\A]Q*3Tthlǩʢ|jii~Zbgyg`u}vsSYicV=\~z`VRQ;YidvaƬwt_ut{mn}\Xy|yyy~djiw]A]YiGWUB/,]r^Piǯs}vyoj]\{|}cjwyyrckss[KekVdcsQBQVrZ|wiynwhukzpxNU^J^GfcUXXN4/XeVcd}yco{zq`eyyhvxxo]qfMYsz[fdHXLsjVZrd{~v\YzxqZQ|tt{t~_u\qUKZSOBYeH.5ObQgt}Ĵx{nrPQtak~qQcnb^p{avYjL@`deUf{}yfz~n}heoee|}uyxpekkY\eXDV|_EC[mK^M|xoWns{wnq~stbfgYEc^[YdqZT\VOe}km{|m~jv~qkvxxTWfZD0Tn`MML8;NPTU~ɿĽŖxt|lamyyut~|uurKq]mYXvjN+GtpTN\inūn{w|z^^lsqn~ypl`drlXFTPJS`c1M>BIBnvwl˯zpwiuzdyjlZ[u]d`^`qqZ=HZ]in]tywh^|yrh|uvcZtpxdiq\JLX[RUXD]F@LMN]vҾy`tvw{nϴr`cbWXStER^dv~}iw|rbvixwlxI{iJ7CkV@=SA 2]UR8selv|[n|wb֟n\obqelqF4QPh{hOblasfLLVfTyawPs|tmoncMb|vi\]kkqQUlcSSTcisq}pf~hoWU}{jf~hqhicYlzbzvTxy{vs{3K3;_R@z~r|zatt~jy{n]xxbvtntՠœv|[OW6yID`O-6RKQM'\A\Qo_IYrgti}_TXJlq]`mQPAWXPoxwm\ae\Hahn|L}wz`ha4/Y|}eZldpYiqtdWPssprywuyjΧ|tnvu]LFX\L^pZAaOWI2GvkNIOK:T{cp{{sVFw]~m}|x{]kTjfexSKbĬzegWhLtlnrSe`fXDZtwxsNmۦ~mvn`PB2@!Ew~qv}xh[yr`OFqg]\bibJ?pzjmyc_UFuX_ntq^UusqbeVVozugfeyiyonomklVjsIIW]mnztYXjxvcwbvntmnVyʲ~kx~~uwwX|q\SX]J9P¼שouuvyu\dXFD]}pRRV`pzaDD[yv_f[N:HPZDY}mg|}s[Fv}t_gpg[y|ck|hj;_`Hfvp{b|cTWy{sztt}agsY\n~țĠ{h_jmiV9MFNrotfwZNkvPBfmdP%/rx{Z9I~{fJh^h_2~_geipyr?8Kht_VGhyq_aqprveahqyQyS`KVavwSd]ZKBff~ģuhSo{Yr]yxu}gsmMpcizz|x~{vhhWCFYONP[KF`]ɛǸsraEz{zmRCzyd=|mWPP_\Z{CHePVNKCHhog]q|konqzVxVYicM`W>4Qk{q[o~Yevu{^^b{gxt|]GhsmbկwûdyePCJ7gdFBE>AWmpwŲo|ifjw[ssomdAIvzUK{zocelvvF'[]I]pb|uzmiwcjx^kVMPQY}ALkUU:Im{Ωg[bwtxtV]f}rbbin_cyͳv}ny~SqN4,A[tjC4>>8Clq}ٹnh|hUo}ugMjuIE_]mou|o|dobmsfkbd\l{wWIRXdYlz~yr^y\g|qU_~izrz`K]|e[`fȑ~wPdwf]JMHMRWN9JLKWVlsϺnqwhpYIy||zhnX[j\F;ykODPQn{~v~yzt{zhisn|p``ZUfnrSMYYc`rzfƢ{enTi}jSglohi]hPdgx{Q`oa[FKLPYX>-CGLShxײpcho{}kkk`ohb\@4:RrxWne`jgofx~dF@FOh}Y\Wg|w|zzȡcMpsammZSgzrp^`joleulflzѝx}z|ihnV~yFRTYegR61@6-=9NIHmËp͸ԲͷU`g_txcXX7:hv\QJX[s}ptb]xrnbItxaJDOZnnKEHMlv{ʧ^keYicd{W]h|ole~jemx؟wrlysqmxq~|j|aa\SXR?+2W[Tecv{pn’fΕ{oϛld}v]^wuustndwD?Ys]VtfuvbchvpfUxz~P8?crzf8128Q\ztnY\|w]tiCGajWNPeȣr|~{_xo^yrcPB=[bR36RMJWYpuocɥϦͻϽZnnQ[qbbZqxccuTUgyzuxr{ycb^v|c\^GQfOabHH]]cL7DK[agǹ}xZ\jm|bcsdlrXcrtikr||Ķykrgifqj{^~rp|yabvd_TLUB6/Ujdgmx}m䤩zlqӳnvbf{rfsxqrENh~ht{}sijauo_Y{qpR67h|~a6,3;GKl}n_b}}[jtd@LZ`XQRdx{VtYXyv^C85[f]<9EBKYgsniWǘįӬvcm[moa_\y\wiUUpvuvx|yt|Qy~qo_aLGbQNgq]EV`f]FDP]ccxužszZciykXhsuU}fcdeeiu{s}Œokjldfnzfa~ijuwXYzocYYMWH>8Neeejv}tn׷v}ƾ~txu|j{yKQhujmv{]{{erxqTRuot\<5`j=+,;?=\~sni}Vn_lNPYUVTRaUqpfTkyjG3-OlgP8;:HVjqgbL]ַϽqvhlqhbZwqc\Ocwnqww|~ze]jydiXD`ZLWpziYK`fhSLM\fan|\Ѿwqu^bpfOmvfUff[Xdkolzʲmcgl[jk~[gye\nmLaq`]RSMYF@AT_bbftstqkиudxxPYnidr|Yy|lnxoMLpfzpkW16KOPQ[Rat^`zkrtxjwǔt{m]Xmz{p|c~xoueXlejyls|m|rhwn{_KTiqod|jrwrjPinQ_bi|eToenjFKbUk~_8Sss}|}t{r\=nfe[cqVkgn_lhdrzeɩsR\Ԋ0*:ARU_tnt|ypy?p~sYRf{ppl|uRC}wpbVXqSo~{no~\jysitsm{ucNc{YbЮ[GQr{fT.1*evxl\`tgnbtmLkT6Y`Dg}nZ\^o~xdpsnCVakɞch}h_iw{{nouʡk|z©xeYEMEAiywV@EU71Xqwg7C[CbJt{jZO^qcx^gtjypvye[^?JbWptuxsumj|tgj`]p|[N4Obŗ||ckz\zOjY.6VcgV@]tlZXOUicvhkrp^\x~\gy}ggpq_NQ_}vϵrjutnqi}lr~̥xTBLR9FxǺv|VmfdofMfvdZ\K[ZTnX`EPau}_g~rmu{fszUMWiuqPUd_Yn{zmhmryuxpzxyĪöu`aidN@xsjalqeIIuzvxlwLGE@`Nu}s]D@]rjiw`8R_hzy|gh]rdcv^o^yr{waznjqwiYx͸mdXrZlIOgPaЬffemx^~mKTRe`IUxf`ktmTUrg~bRMXisfxulikWrnn]LRjVo_zx}ytixdnx¹¢y~gYYWI1/c١hidRb^JG\uuX0CBIfPqcUix]rv[NW\wefnmn^YmOOcwmrsw}nnyl{ry|sP75->;CrZutp~v]hyY\?Zp`VKLI=8k{UmX{xupqyWQXFi[msmstyn|m|eVrykuxŶdrEXQB^lvgq`[SYwzd_o\JF?EG>ZolbNCfqz~}q~a\xd\RTPBBoŴo|`xzxpuz^n`~ftxmV<9edLhnCAXfZ:Qf[yxslLQazgvkyPVrqzcgt]crsVcb/Otq´bhyagy~umaf~paxð{qfYpW=_TT9Jc[Kh~vjyqZ}yj|ywysqUq_XUV{~Pok`s+ϩm==EK=A[qsT|nm`eq}tJThknz`xsgxvOwSTcpca]qX}rjfc|ypgnrxcP|r·ũuP;oN@=KI[mZAmFW^HMHg^SF;jpvnrjPzk{eooy~TRSWs_^u~F]{]hzvp|Wb^Enq̭ȩ|kZeIRZJůcODOUS':~fYPb`E5lY1,5'etjnŚqLtvrvuxxpmjJ]v`zwX\guyj~mix[~jthM˦lήŹxa]giFH__||~mmlvP2c^PI\]R;jX@M`6KjkhrU}xwr_wykabji_mPxuz|nv_zfsdohrUbެ̾ϲ~||e`aSI6QY˺hdra`]X7esOFmxHIvZ9>N5<v`Mpk{xsyTEPZgZqtznuk}\~biivomزƵvbfVKbtqQmq~tq|]^gsIcgI?`tc>MoHQcMAxro}[UkdywwcrvzvX^jlUpytxuVyvmpysnn[Ѯ~oqX>I]gVoo¾kkW[ch;czgQltJJl9.JBCyp~z^a{][vtwfvfSYbe^pq}s}g|cekiy_mǭpw·iiJ@TgbTvw|pmztMuoaK`k`=SX8ET8Gv}vrp{tUntmukvzup~\KZpphvs}~f{uZadqbôobjLFKVNWqů~ypbkTOxeWGsrS2_tN=<6$PruvqNwtywzyyvumfDJZh[mryyfrxspf_Saadt_dW;G]hWp}ɿ|qilzIfk_M_rS24l]AEWCCq{qw]\wi~o{i|xk{hP`stfww~y|`v\zt`ihnZsȳ}}xmvVLVaUU^q~xuqyNHiYRHvtW=kwK8CC8_spqtY~{k~utsz{ztSRXaVfevpn}Wzyhhqdh[gķzhgS@LVRD\cxwpo}zW}ogIcq\CY|YBFG1HnrnYgz{tszxpuVJ[j]V^d}umlqaxafh\ȸ~úxv_hLFU\P\Ph|zHXpbiWbC9fgE@]83qUeycKwvi{dh\a[9SfsNGEdŃ}~{}}YoaUzпwkze@8Uh\Tkl||}ChiiLBkt4eqYgM@=YxWn~k~tqpg|^cf\R\SKtUdp|p}qv}{VxkV]dy˧Ȯ}hbka;MX@QFQֻmtw~P^kS?BfS1KXFTooyav|nvPw`h`h:bqD@Zkiwyokyx|aoˠ~xtmgcW\K`\>?dm|]R}QYwfFNgJVLEK[vVn~{prwSvWO]QWL>Zrqapmmbbjkz`myq{ϫĨuuoqqnTSs^5AR]gmVîjsntY}fQKZyOa[^Y^ds}hSdtbSpf{|c;5om\oġ{|rku~{}_ixgzwPO^lnWAHD7;IcľxomxkGrsT]OscGGOghb}mqdlx\OYheaGF[bovkhxdOubDXonMqj\Zbl1=6Oouĺq`yTHANmjM]VBRrl`amoi]ic~rhRos_Q,^dYaϸq{nttjv{gzrqeolJaa<4E?C8+Rϥ~kH_}bgswwGW>wznaxjrS{p{UFDW_]PNgiosp~daqdoq\Ux`\Ģ|sg|~ur\JZJ.0LjtyoѼĬxyvooI`z`uIS__RBQwy`wk~{uqSN{rXMOtcTmeuk|~lZeds|}f{u|lLj_IPNB/=TBG8d£ŤoltwsjcsmNGVnyzttc[hr{jgsgr[@|b[;2]gjcNxugQsyggt|mlhFriUU7(#;Wacfʮ|}akjPT\cNJnaYQwiz~}nxSbpngeWOWEEV~{~}s[fymAb}moŦtlmwlg|yyvlnoL(=]0(Wվ͟xfuq]rjcTPayRtR}IoiE9oDKY"I*?dprrʷwƧsmlr`gnpO[txw`qXKbp\KU@2s{~¸|jeoXTmj9de[s|{FV}wOAPVa]g_g]ɭy~\YRWrb\kbyvwI@tw`7ZO@*$HjX3Gˉv_`]QhptfZn{~u}~y`VD=Zqi]Br]^wy_^~|vXLIlUNsz~bKd[n}P/OmR'.DEQSPWp{żĶšvkj||}Tnigri~kB~xE\iSEA2Jla;8ppc~`glpz}glZ|y}ffkgRI;.Q`[LL'JVS~t}ʨfxzaQJXZRvlr_|xxsjQ_yJ=DNYTYOvn^tjdrpWowX|{]jub?jxmBNdU6"$>sn@Ysf\o{[Hxz~jvxlyT<=<[c[lVd}}qzbYai}w}ìǭ̴td_V\YB8jhʞu^f}luuaTRUx^glVf99DESL=Fw~pot}lRm~dtnkvWNMRr_|~oqyyqbVix|u{eF=?GHKy}tsy[O~vur{|PhXbjHXRVXVRqsWZyh{y{sy}qpE3EOcjnvwuqjf{[qtxtwU==>R;Xgb{cyuxS`p[^tNhrd59vm`b}z~~jrqfd}z~_9J_nOab]vmxqnnyccx~s~regC2N]V0GJNhȨ{{epf|p[yed^`H]kewjyx~mkunc|aoUQ_`P6W[atf|ziydmSrjuSB@EB9_doc~tLn}oVtxToy\-Pxkgrx{{rvufmvz{{wv{U@I[^Phgnjxwv`zy]z}ztja]]:/CYU@NYGOr¯ȯpjszan~q^qrnxgE`zmvkn~vvzkt{xkQ}h]]KHU]P`¨oqyu^xumR~{}jrzs{]IiIG?27NYQe}ɸ{lpe[xk|T:nw~rntw}o{|odgyUWJDPhdUexzvuk~agVx_y}~h}~xxacf[N@_XBPSa\Mϫelw{fSiWXihpjm{tgs~zhjOcpNEyS4K8Xn{uww{kXN}qh|\qUh\kwQfV'[[:Rfcdǻtza|lVhpHFr`ky}`vtdlgi]_QMhh`Wbttuyyrkmfqcxt|T}qpn^RFc`JSPXX4Y][~жr~rbxbZe_mi`zzm|daitVC{gK^Ipzwrrem_Uppujx}~gjewZUlEH;ScNLqsz~fv}zkxkiom{e{nurcmtdwvMNxeY^I6FXHbduylrwRkcUSRyvrwqywvip`Vi]\IPdV][yy{ssg~vWg{pt{ylytgkv\NUNV:CXH9JQD{º}vns\Znfqh~qidoRciMG=]`LMrqup\|~p}ghpos\}wystpc}sd|xpGLukgaI7HVFZYo~wżlolW|bYPbznxtuu|uqsYVdY`J\`WZ[zzs}yqpwwxXt~tpuy|oruufwsVWUPK6RQA3E>Ov¶Ķx}qXeeglfq}eh`V[SCZiUEZrloV^z}{rdnjq]lyks|ougwkq{wXFkshjVB>WDMOXjbpɶ{mr]xp_V^{mrws~xxrzdWcVaQ[fX^Vnnau{w~s}]qymdv|wsuzn{x\[]XP;TPA-82BvufnuĽ}a]`hmopzzp@dgciwhLBigJorW:%/YBR{[}yh}{jgxvcpnyabPsvj{djeioQ>pfWpVzhvnmg`rccrixoz||oYpq~aVVbhǟyv{lEetUhUXbmuhplpnucG^_mWBDCkDqziqm}uwxw{Tlfsh^wms}}YknxgJMFvWy}r|gba^bb?Ov\eg[rxqui}}}qu~|~X^hmkJLEqjovunmmMHr\VZ@tvJj|_kpbbcafADRXZ792XPI_~l~~pk}inmix{}YVOttirsmmmVMzodmVdsl~fbZz|fxjzdfyy|vzv}aWiltSOKlzh¡}gVvfnSzZwrrwosovYM`dlKD;Z^Fe|o}w|yzzi_st\`wz{{eYikoLE?bcRvooihfTMypfjVf{rlfq~sq|x{u{]UcfiGB>d`Y}yq\W~od`Mz|OymxaizmcgbiMFUZ^=71UN@zYvpqnmorfux|ZQKml[~zvqbY{olYb}yjz}eZWuu]|{pff}ro}qtpvaP`blODBcnUĩȮwjzw`dw~tnswsxhQadmQB>Wa@|fnu~z{~vnbyyb~isynwywyoSaclT@=PhC}yy|~uvjdSrnq]rqp~ugdof{yrlxptnqOSYaW::DlJnxwft{tabtVoq\rzoelflMLU\X96:aCQzZy~s|{unw~~kaknqQIJpd_}tifyqae}xz{ftvdUTpwY{qjkl}wnbziikifITXbR>>UtRʯǹuo|zh|yhzsztxY[`g^B@LnIge}}zukznobxyfw{mvnuZQY\]?9@hU\s~~xmfg{peh|p|o`aivwqzqd}khkfgGMQZM79OrPèzn~how\on\p|ocmdlQKSXX;7>fNYg}x}xpuwv~x|mV`ahPELptbĹvqm{iqn}vn}biktePRk\~zrjzq]~jeUlyte]f]eHGNWT=AVbӹüzj}{ix~o{pxaU]`cGBJr\bq~~tqvundtvrcgxdmgj]FPRZD:Aij[pnm{mrtyukrt}m[`}krufneWpxta_c\`BDHRI7=ZxZǫymvaoiZq~{keoemPMQYT<HMWB>MxppŴħu}zloo|uxnU\]eOEMqg\ywx|zshkvj\]uwr]jce^DJLUC9CjhZwwz{trs|qq{hnpyfY_kulgvgZUmplU_][Z=CFQB7@enZǾwql~pd`x}ydpmkkOSU^L>CfgPx|}wruhe}~ivqpnQUW`ODMrq`øwqotihpz{y^bclYMTvo]xx|tm~`]{k\OMdhdO_YZW=CFQ@9Dlh_ǭ}|ooqz{x\`ahUIPrhWw{||vlgxi\Zpuq\jeccFJLTC8@dbO|~wunxljwiklueY_~|cunbxdVOekiT_^Y^@ACM@5?`fM|nth`v~~jtvowYWYaTEJfkK|p|~muj_s}}joujuXSU]UEJdwTxjwmasttsi^agdPQd|Uxq}xzizpWexaSCP_bUPaP_M=BHJ:>SsUp~ŷƼ|ltvyx`cehTQ^|_es~x|jiudUWkojYl`dbFHJQABIF9@[pM|yr}n_l{son}lY[^_MOazWjp}rs~l\aswpcwhojPRU[LKZ{fdxmrd`t||k|yt~a^_f[QZutSsx|x{wg}}hRfqYJ>MY[LQ]M^I=BJJ?HbzXƸķĺ{ks~uy{bdfiYXfhh{zymcxcRNagfUg`\fHFHPGBPomT~|mxj`q}q{updfkg\d|`|~mqZcxaO@KX\ON`M]P=AGKAI`|\vzyrbfw|ukqxv\]_cVVehd}uijYVhnl\pieoTQT[SQ`xb}krcZltwgzrjsrrwdep_rj`^ott`L[mYH:BLBFg{ljstpnopuyo}{wy~t`npkmmkikvq}}qhYQX`dlz}qvnqrojegssbk}yyx}kispha_eptkg{xlboxyz{xtvztmfZYcgioxcot_ZZVNE@FRJHd~~zz{{ny}~~zvtz~kq~~zqkkeXPC=J[iyʽh[}bXZ[WRNRbfZfwnsyuomnou}eeqqnmq}~˼xrr|ket}~|xz~zvrimx~z_ofRNOMIEFTb\`~{~vqoptysuarkfgfb^^fpbS_lpsxyy|}sm`\hryw[`~jgjkgb`hundu~x~|yy|ntzuoloyuζ}xz{gl|{xzxnh]U[dfipw}syogpcb`ZSNQ_aVcxqw~}yy{~{vqyyzywxwvxrrod]TKSbmyſp_|eWVVSMIKVXHLbqx}z}}||}sr}|vpmqvsd`|wstjfu}~~xqfjswzzflZVTOHCERZPXxxsrrxjhuwrmjmso`Yxwxuqnq|~jdrzzzytnnmd[RGKV_hvp^{sddfda`dsxjm~~nkvwsoot{ykj»~jcmrqpokimplie]aknpwdTq~`RQRPLJMY[KPj~z{~yxy}tn~|rmy~}yuwukcYMOX]cphYwpddge`]`jjWUhx{sijpollot}rq}~ysoprjYU}{wyql{{pqxz{zf~p\VTNGABLPBAYp}}|q[Mkyifhfcbgtyh_kuvvwtprrkd\POV[]fsj|olnnkiku{kbq|zy}pdnrngbac_QEaz}|~xoi\VZ]\^fp}tY_v^UTSNIHOYPDRj}|hozx}}ggrusqmhde`VPG?FQYcr´ºsil][ZVQPVb_NPdrzwnouuqqru}mn{~|xvxyp^Zzq||rqxzz~iRbePKLKHFJU]RMay~~u}}vcO^slmmjfgpyn]botuwwvwyulg\UZaelwnlynmmjfekvp_btzprwwuuw{oo{}ytqrsk[[{r|~{||ung\Z`dejr|q]nv`XXUPMOYbWO`w|p\fvwxvtv~mlw{zxuplmh_YPHMW^gttgqa]\YUSXccSQcs|vtz{xwxysmy~zvwyte]||ls}~|}~yrmd`gnsyv\bpVIFB=9;FSOHYttz~p^dtsrolls~xecouvutqoqnfaZSYdltj_}pa^_^]_guxjj}zwyxsonns|v`[gnnllotpc_rx}~{uofbiorwnXet]TSPLJMXbZRby{~~}|jy{yvqmmt{n[]gkjihdcd^WSKGP\eprruhdb^Z[cnhZ_rzrtyywwx{}imxzxtsutiZa}{{wt|ulnuy|y]Rmy[ICA=:;CRWLQivb]vrrpmms}|h`iqqpomkkia[ULNW`gr{nohgc__doqb]l|uqtsonmnt}u_[gnnkjlni[[{{undbhmpv}cShhSKIEBBHU]SPd{|}i_{}wvrnloxyfY`higfcaa`ZUQJKU_grrogda]\alo`Xet}|rnqrpopszlhv~~{{{ra]~ry~ysjgmqsxy^PgcOHFC??FSWJH\qq\Utsnnliinyxg]gqtuwvvwvpjd[Z`ejr}xjngeb^^dno_Wds|wsvvsrrtz|galstqmmkbRNpxqfbehimt|o_szd[XTONR]aTKYkx}wbUm{uutqpt}n^bkmlkiggf`ZTLHNU[co~vvjfb][^gm`RYit|~~{nv~yvskZL_wwzuleglnqxoWXyv[KFB>;>HSOBG[m{p\`}{{xvw~mfouvuusssohd\TU[`enytl~lec`]_fpo_Xeszwsttqppqwwb^jrspmkh^MIkqn}qdadb_fnz|oaqvjifa`bjn`PUbkrzwpyuahxligcbenvpbbnvy||une\Z]^`dlvlt~|pjknnnqx{lgq|ykXRlxvy{{|}}wjo{y{}zsoruvx}vhtwmifcbfnsk`esnep{mbgsz{zywqcV\{{qopoory}pmu{~zuohgkosx{|kdca_afnoe_hs{vkfirw|zqlhb\WPMPUZ_elvy~pcisiecaadjqnehs|zrns~zz{qfj}}||~~{wjaZURTYYPKR\chmquy{yvrmlpstvx{{w~xnixwrnigjszyy{vrlilquy~~|smhjt{wxvsnjf`VNVm{wmfeddehnroggmrtvwxz|{wtplnrvz~unifeejnmfgow|~tleaagry}~xog`YWY\_bflt{ztu||tjguyojigghkpqkiov{~}wrorz|~}|yskl|}}{y{vnf`]\^]VRW]bgkoswyxusonqtuwxz}yvz~~}ztmkx|uqmjikqvvx|xtporw{}vojfir~zvqmibYV`qxrlhhhhjlqrmiknqrstuxywurnnptvy|}~~|||~~|~|xusrtwxtqu{wqkfcdhnqwyqiedeefhkpuvrrv{}}|zwqjhp}yqmkjjjlpplilquwy{}~~zuqmnt|ztt~|zyvtstwz}{upmlib]^`cegjnqttrpnnprtuvwy|{wuwz{{zxvqkjrzvtrpopsvvxzwxz|~|wqkgglt~{uoh`\blrokhhhijlopmjjmoppqsuvusqonpruwy|~~~}}{zzzwtux|ysnjgegjlow}volkjjjjmprqoqtwxxwurmikszytpnmmnortsqqtwz|~}yusty~~yuw}xwurpoprux}yusohddefghjmpqqpommoqstuwy{{yy{}~|xtsy}zwusrrsuvx~}zz|}~~|zxvrmieeipy{vpieelqqnkjjklnprrpprtuvwyz||{ywvvxz{|}~|}}|{z{|}~|||{xvx{}~|~|uokgdcdgkou}xtqppoopqtuttvy{{|{zwtru{}yvuttttvwustvxyz{{||zxurruz}zxz~}{xsommllnquz~}zxuqnnnpqrsuxyyxwuuvxyyz{|}}{zz|}}||zxutw}{wtrpoprvx{~||}|zyywusqomkhfeglt}~yuqpuyzxutssstuvvtstuvvwxyz{zxwvvwxzz{|}}|ywwwwwx{}~~}|{|~}yvvyyuojfcbcejou|}{zyxxxyzzyxyz{{{zywtsuz||yvutttuuvuttuvvwwwwvusrqsw||{}~}}|zywvtqmkkklosw}}ywvvvvwwyzzzxwvvwxyyyz{{{yyzz{zzywustwz{yusqpoprux{~}~~~{yxwvtrqonmkjjlpw|xvx{|{xwvuuvvwvutuuvvvwxyyxwvuuvwxxyyzzywvuuuuwx{}~}||}|ywwyxuqmjhghjnrw}}|||||{zz{{{{zxwutvyzzxvuuuuuvvuttuvvvuuuusrppruz~||~~}{yxvtqnmllmnquy~|{zyyyyzzzyxwvwxxyyyzzzyyyzzzzyxvttuxywusqonnopsux}~{zxwusqpnmkihhkou|||}~|zxwwwwwxxwvvvwwwxxyyyxwvuvvwwwwwwvusssrrstuwy}~~~}zwwwvtpmjhgfgilpt{~~}}}}}}||zywvxz{zxwvuuuuuuttstttttttsrqonoqtx}~}{yxvtrpmlkjjjlnqv{~~}}~}|{zyyyzzzzzzzyxxxyyxxwvtstuvvtrqonnnnoqsw{~|zxvtsqonlkjhgfginsy~|{zzzzyyxwwwwwwxxxyxwvuuuvvvvuuutsrqqqqqrtvy}~|yvtssromjhfeefgjnrx~~}}}||{yxwxyzzywwvvuuuuutttssssssrrqppprvz~~|zyxvusqpnljihghijmpty~}}{zzzzzzzzzzyyxxxxxxwwutttvvutrqqppqsuwz~~}|zywusrpnmkjihgffghlpv|~}|{{|{{zyyyyyyyyyyyxxwwwwwwwwwvvutssttuwy|~}{ywurponmligeddefilqv{~}}|zzz{||{zyyyyyyxxwwwvvuutttssrstvy}~|zxvutrqomkjhgfefgikosw|~~}}}}}}}}}}}||||{{zzxwvvwwvtsrqqqrtvy|~}{zywvtrpomkjhgfeeeefgjnsy~~}}}}}}}}||{zyyyyxxwwvutssrsstvxz}~}{zywvtromlkjigedccdfhkoty~~~~}||{zzzyyxwwvvuttssrrrrsuw{~~~}|{zxwusrponlkihfeddefgjmqu{~~}}}||{zyxwvvvutsrqppqqsuwz~~}|zyxvutrpomkjigfeeddeegjnsx~~~~~}}|{zyyyxxwvuutsrqqqrstvx{~~}|{zyxwutrpnlkjihfedddefilpty~~}|{{zzyxwwvuutssrrqqpqrtvy}~~}}{{zywvtsqponlkjigffeffgilnrv{~~}}||{zyxwvvvutsrqppppqrtvy|~~~}}|{yxwvutsqpnmljihggfffggilpty~~y|{}w}tlfZgfcps~|}wyrnh^kinuw{sv~y}~}upgaoo|sfc[_SRPQW`s{cEKbG`xvy|fP[rwvxvb]cf|zzteih^UEIMXalyywkw|bMFJPQ[]_\__az{dQLo~{{{yt{s]\]v|thduy~{yzqc^mosrs~qbxz`K`~vtopmhgnz{utyvz||z~pe}~|wwo^b^[gloVDQm}y`Wwpprp^vqyo\pvWaydcmoeWg{x}pekOhjrypdQ[{wjwo_l~{zp[gyikg8SufSd~xvyyjYV]^\usuwz{dht]{nnlcqq[Zirs~rwr{sttSuZuy{ruw~d_dAWMUdjaKShhXT\ZHDr^Qav~o{ko|mmq^XeTeDdscapynNh``vioznrq}|r|veO_~{t{rzUuYHRj|kEftg|h|wvfqZ\\v`}|jIhrjQe}mbl\}}o\pxHQdxrdss{jshpqpx{uvierPbR[TU]cmezz{usXsmdasv|||hrgUlgOQplcghr~xrbd}r|¯|^pRPrupqofxZGTVv^mmz|[SbM=D[daJaQ]gwU]uzegmzysqor~[]MTUQ}}cqy\tn}~mxz|vvqt~_tnmy_Lrl^fzwy~]Y\f]HXk}iiddaqaxci|kyYol]UOm}fapuoZ~vZb~Ykb_nl`s{dmspxjxvyherZzggE,GQ`G?k{xal~vXduverygSUitt`l{vpyqozm]Yex~j|{rvl]`pw`šaeR`scfIcqYJTfgS=MM}|n{cKfxpnggfvs^{zj~t]anwsug_kwksq{t_Xwqmvjhmslzu`qo\L|_[`[QS}`lnTQ}~qjYv|~xpu}{PWsvpRP}zmlc]Okweednu{k{kFfyj^g~vdrhw}xqzd}b8TTF1.ebhpm|pw{|qiquz}}qix{bW^_{p~s|rchpjblix}~o~{r~[>b}rqz~vtkIIjmNSCXqi{dLGuyvscabgkp~Ztp]{pȶ~pwoixwryqbRbgWMon|vswmi_azwinYr{}RVuoi\QEWuabYlm|ppyiYvuz}egvwzǠeqvdTocQajfVsweZRx~nHrot}{kni{e~gmwszwv|g}_sq]A-JoeSMI[i[qgV~wwxd{fjOqzsupi|xt}w`wtiv_Wnsa^pvz|}xqo{uffmouttiJqe\[OUcxrrjZjud_xi]{f\z}zzhtfacOBX|uw|ynjpz\W~otmM^mhY\hWcybZHttcrn~ptjuftw}vxsoitsx{rpxęw\dyjj]OKx{kU|{xyO`pyo}vyte~mwquzxwjfz|VdhEHleA2BSWGqzowv}joowyff_gbdlzZzzpxqUkn~zvq{g[|obls~|t_e}qcpV|`cUPL_xoZa|siv>r{ssb}d]x}zk}uolmx~~x`IM]ejt~^~{{|}hsmjjierg\XhQ[}lOmssjpyrZo|kl~rr~z{ymv[yvzn]hpm`y{qsrzcX~mvm~{Takhqruy~{ryszVxs~kXTti>4;;8J}nl||wsbqzkp{{|Xglb^_tq|zqr[kypgdjkyuObvlorrjxvow}y|d_~_swk^_lpaZo{rAq[_Xt~l_wpzwukhs~}rjv|lhiaZWjpY|hoZvh{zhmwVTbmTevccuox}dQqr{mq]gn{~}~nuu{{~yu}dlXzj{Ŧxkpmepgo~WW|}pq~pWKV`hqshqq~pwqpuls{[Y}fRPI=3Ub_efoi|pjgpv}Z]{vgkvufhutpu~rbduel|myohmwxnUnezp}}xurfijpw~jX_pzHg[hjefhaXmgU[fqxnxrkqzucm~tgkj?hr]wqjtrwvtY\jgg]Nk|khhHTy|zonkoylqrnc||zZqmq]czjuswcyvt~x\z_fhZ]pylnwxrt~v{qZ{gtxsegxOJVZOWoYVFWlovls~zxwj}iwixwa`o}upygqo^fr`}wfvYl{qvkti]sVT[ttw{}mk{~onux{|tX{[li\fs[D]iZ]\U\~qtqsxwsqrwShtO\dkrw|zzos{}uqfaghcossqv~e\sxnqc}}vt}~[dt|qhu^P~rmoajj`Zt~zzxbr}||jgo_by|obalx{ywpbgnu|y~vhXchZNDGnjdH[utyrSoxsyqs~}jwxto||vruw|~|dzvtv}opul_xsitxm^L}x`acfjw{xqeosQepzkV_n[FgaQUY[dw|s{{~yvt~tlu\eh^b]_jmwwzh`{cYY\k~t\{jLguwzoszop~ytz^h|vn{vx{z{ubz]dV]gf\[tzr{k|x}buqbeyzpupaajqu`olnrtgnuki~dZ]]Zgr\e[^||wvtgZhs{|nsxt|ucquXf~zzuqsvkijvy}vpdv}}r~t\{nVX_hqzwih{zsty|`}kseemcMQvxn_MFKd{ue~rvuou{~~Rkw`opifltrlru{uwzuricyzqq|UZ|tnoW}z|uxuwusmt~lPkwzeOPRQSkvchy}{vnrt{}vt|s]fyqemtZzqvxy|{ordsu\bo]WV]{smPKst\GNq|wwsg}}{phvxzcvnvpjw|um{|tp{q}ybmlq\bh[W\fomdaekuqubk|yb_abak{oRL\aqvfscjox~{y}mtp`egox}ve[an|na{yxohkv{qds\d~rs~^ktms}{tzlx||onvx_milmbd\NFXwvbYUWl}|x~wvzr`lzlh}T`koyxx}{tokwr^j{sjbbwtyq_tyvvwiTObv|~szrztznvx~Yf}}u__bekvsyxz]qx}nY}|lnrpjgcZV[ceelvi~jxzmic]c}vYUa_hzp_Mou`cot{aw{piovsidfimpmaqx~}p|vqx}ovbcw{xiS}xljnvxqrx{sk~~rg[{qugRRX\_l{ygXSTYkxx{~m}xwqhrwRtjcmrx}pkvxnoidfxr^aqxuo[ur\IKe}}{qljjpztuw_cjvlgc^]kymkxx}cmsoy`rxgbfny|nZPRX^eqcS}{|iimmlwxng^ajkdev{~zk]e{pwrt{{qq|taX^kqrm`Ro|~fn}vryodm|skanrvuuy|xtw~~z|w~lru{xasmws]UPKOgz_OKQfznw`n}}vsw|~{u^omj{rt||smpuy}rnmikzwdmvy}df}u]KNbutcog^w~yyuy~~{rejiz[R[dl{y{|v}~~e\smjggkmiea\WXcdPnlqmb_duqjkvgot]d{ubV[r|~{sv]}~yj_[]djfYhssupken~n{fg{lr|ht~yifrxmjpxtm~vyqY}wtlZVUTWew|tjd^\gyifr]d~u{yy|jtq{}r|rdcltyysfnoiilwvyysum_vzk\\jwxsqqggsZb|}{wx|}qbr{fYdbXh~sqyuou|}pfvkknprncWV^fikgJTykfsy}~}wqqxtyzU^{rqdX`vyutvsvsio{xnnrpi^RJesqxf^airz|syrXxshu|snqpmmmr~uyxbgj~iWPS_s~l]W]mdcaK[s~{ro||z{oyuwtuskgimnf_zx}vpruovqtgpye[cww`Qa[Sxtnpwwt~}thts~tmk^Yrywtu~zs~spuxpdXOKKZqkkgS_jqxzunrvU\txv|y^Oe}srrk|{zsmvxrklprpeT]xkjugacl}]oqfmqy}evy}yqzn\]dflyu~{~ukwzzkXMYvS>ISWWQGDTqrlmuwfm~tg^o~{pdg~g_tziZTPS_nw{zra`bDLqupnnpv{{vmb\hxxt{bPYt{xi\Yg~z_r}mutfZSONQ\dZpxxutvwrjgkuzh]fw^HK_giwv^Wh[Vywswoedfo~~qzy}yq~u~vkknr|~ob\jvfak{zuz`bwpmpz}eX`_U\txvy~~vm~}cQJOazzrov|tgYKAFVgs{zyx{uryzmvuy{u}snoxxc[d|zssdLJ`vxk`mmTcth_`hpvwqgbchow~wqnp|dR]n|}k\]lzntvsuymZPPZkscjs~zpfdiqvwuvvu~vg[X^pnbjzkQj{tqrv||uolsxypvvysaZ]i{whbjxfajyx|~j}tqqrrokif\Xnf}{~sfi{~uqfYWh~dar||r_KEOaovwpgr|q{~||w|~j{pjhho|ysrxsq|}dNVkqosytipt\dtg`_elnhbagt~{|wmjlt}|qgglpw|pimx{{oxrxx_Yempwwfrmqxsiglqsohq{w}w~~wxhckyzsrqnn_cxnmpsurjfiswyqtprylc\^isrjderzvmq}ynxn{ztsttmbZ\gyo|v|xqxzvrqw}fT`{velrrnh`Z]fmpqlccsi`oiv~jaajv|vh`dvyx}sidghky~f\mych|vspke]WW]frz{ypmt}}rcZ_tzypio~nk}wmvhgmjbppswz{{{ywwwvrldaux~oowvyxnnxrblwgj|}topqld^^etx{vqvonqwypaVVawmdx{qvkezsia]^drzyr|y{ub_iowou~~vhYS\n}{o`\lfSj~xko|zsntsqtyvk_Z_r~o`]h|ulpxsW[{xy{zrdWPS`r~vuzvv~yj_^g{xtlkq}}ws\rtf^fzwc{|tliox~|pdmny~rknwudhujjvx|cX{sn{~rf^\^dpzttwtxpgt}uqqx}k[SZoomyv}|enqfbdkuvhs|vy~y|ywx}uf_g{n_WZfs||plscQi|trwulu}xy~|}}{obkm^Y_o}tfbhrzsnyuw|sokmtni{puxjipyukhn{yjci|zrrbiPhtrry~vpnorvzxzrlknstmcpq{xmfbfq~g]j|{zkqncsqipzwmnurg``ivxjswqopng`b}|}gafoz}rklta[~jcqofaaelqrokiioxxiu}omrspq}jabkzzvz~srtri^Zdpmvk_YY[_adgf_`tiwwmhhkoxseiy}}{pigea]_jops_X^gifaadkuzo]n~~rgbhtwpqjhmyojrqfbjure_aegfddiq}savxxxh^[[[\^ivgaaht}{pkigglu|meisq_U`nvywgb|szpd^]^_am{tundgxqkkjgfpqkihfcadlvjm{u{wfhrpfcm~qign{~ufZXZ^bfm~|{lfdc`\Z^iw}okx~ysnjggovonvyvsidccdgks}oqwpc]_bgmuslymtxrpokffzukkr}zqg^_nzvq~zrle_^air}p{so~vruqg_\[\`u|pijs|{wy{qpsvvtrwypecjojhwxk}prx{}}{wqlgc`_i|qbh|{y|wmilquvtr{}tolfa_bkyt|ysx|}|ywvqe_grs{{y{{w{}bV`lmhcck~u{tmf`\]blyvo|~|wtsrnjs~}ylegnsrnijxv{nnvscY^kyvi}zttuwyxuqoonmjl~{zzrfdluvkcl}}sg_^do{zls{yww~xd\dlh^Zi|{}zz}~wswzrorvzzywx|vkcete\wquwxuojgilmicg~zyz}|{}t|zlddjqssrs}|ukfeipvsgr||||zunhfjonbZpxxsklme`foomxt}rhccgnpe_}vo{}rmnprqoms{~}oc]_fmqrrw~|reissmnnei{|~xphcbdhihhw~us}}|mb_bglqtswytpnpqi^p}zofhmgZV]i}z{vprz{|}tb^hrvwv||yvutsnmyzunf_\]`cfp~uoq{x~raXX_flor|{|uqswsc`~zpg`^^`cixvv}~q`VYfqmaax}yvtuvm\`{xu{~rb\`gjnvu{}w{h[WZ_beir~~~}vlkzx\ay}ynbYWY]ai~}tz~m_Z]aegku}}p\fzv|{pdYW_ihaoxolpz}xzp]\glgdjst_kqluyl`ZYY[]f}sps|w|uh^[\^aelz|ptn`rsqy|qf_]]^_jzv}sx|qf__``cl{l`tvfgnw}yj[[eg`XYk{~yvy~yuw}uvyupnpqqqr}wtbcir~vht|pwzrjd_[^pyy}vz}v~nkt}}yxz|}}}qe_ckt}xgopjqz|uoje_]jwwxz~qrz{uwnb`dlu}zjatwgl{~umptqjda^_hx|}uxwwysupffpqcaxnaagmrttqmieb_`nwp|{ty|v|qfr~smmqxyk_n{f_bgknpqlbYZelmx~otxxssk`rxssx|wd\o~zqidfmqqnkjjhdakqkw~|w|~z{v^czyuz~nbsmbadhklkihhifbeuwwtou||zx}|c\ryx||rbhvfabhsxn^Ybjjcanlgry{wxvzn[g{~uYUvjbcfghfddgjkgdkufmux|zutzyai}{}|xj^nuhfhiigdbdikdYZvmepwy}|y}}~m\hx}|rab{a]kwtib`bfhhggqscirtw~x{uru}dar{}ug]mxlllkhd`^_beeei{hdtvs{ztrw~{mpwx|}q`\vqlmnkfcflj_WYcrxeiqqpv}|zzxquk`lvy}|tjm{|pmpqnkhc_\\_bejzsgnrqqyvvpqx~dcpyzfYjvpqsqnic^\\_bfn|wlv~vmo{}u}snt|s|wahvz{wb[qtplfemupbXX\`commrpmq||qy}truz~~}~qco{}~d\s{ompstqjb[WXZ]bqzknror~zy~~wux{}|{~]Vqp[_yukkpstqj`YZbie]gzosutsxz|~}yotyvv{~gfwnYc|e^fsyvmd][ZZZauwovzxw|yz}xwxxwtruxcfyp]g~ofjpvxuog`][YZavrdiu{}xw~|xvvuuy~~xg]jralofjrwuk``gkeZU]tpny~z~~xw|~}{{zwsor|obnwfi|fagnsutoic^ZVV`w{ko|uu|~||}|wrnr|{jbp}lfxud`elqsrmhc]XV]qj]nuv|yqmtxlmvr`_u}jj}qinsmffmpmga\Y[j}okyv~sqw||zxz}~zskhouhYc|{nwoccglqtsplgc^[arzlp}{toswywuvy||wngk{kV^xuoldeinsusi^X]filvylco~}pq}rglyzqlpvlYZskh|uhbdimnljgea\]ixudcs{stwvtsuz~wpouubUeuopc`bfjlkigfc_[`ryonqvyuwwussx~wljsmRQk}nu{i^or_X\][VQS]n}|}}vlqzsqlx~sldrqhjku~|oSUpeY]_`blyc{~qhdYtjnd_`hvvodjzf|~zsnnjlYgkt~xzxxk~{gxpixri|yr|vXDUqsxkktw|p{{ovvoXt|\i`js}xvrv{ylxuyxrYdn`]zroYZea]XA?V^JSpril{zyxll~|t~{ogM:Dmzpw}v~uu|gpn{zxs{vxl~hYYhkz|lfavmlk}vi_`qXUXe`urj}]Wmtxyt}twysUX]piyyzadSgbSos{{iiQ[W|{mgejdvnz^ftpoqxUrxwqnlk~wyovvztygwaixm}d[rkm{ynacmlzTMGYZoyutw{fo{pkexv}c{zr{iaOTwlesoq|x|}~xwku}pjspq}vWjsfXdV]TfbLRb|zzg~kmk[bvw~aehwx|~m}zdX[P^QZdtm{ig_nctc]bpvz]trizigr~eXYfktht}gti_}z{t{~zt}whX^\fzvsh\iI@Gdrtfw_{y{j]b|v~qx}kKL^hi|p{t|}ss|zwpitap{r~sxhmyWhjbQZ\_`ZbSdtpt~rxd|zyhjn}yxmqsx||wrtwnyjXgdJFjolxxqycSayhjp~u{svitjare[dkV^p~{r}~}lddmfooxmMN[e]t|c\UgeVftfhpwixlxvmx{qe||lU``JOvemx~mq||poqy}s]qktnz|niR`kf_jlULRtgX]oqt}tft{ntws~zmavwrrd{hUZQ=fw`wyxjfgxstxq[stvqthg\VTgsiqvoe{ne~|yr|xyqweu}zverfNN]iqzwe`eWUvfn|zsmerdctzw|wknbbhKW}i_qwnysoiluoyyrzyrmon\\zt`]W[\e_JQclmo{utwrmlfiuxmpm|{}~v~|rhmbSXDDksxt{vt]fsfltk_dc`ieTf|}~{i`u|{zqtpem|wkjym\huk^oxwza^~oc{xmpxyupugh}n^jum^d\\eVYp|on~~x~rj~vwsp}xvqeyx|w}odqvbPSf\KZr|sumzz~w~nYg{ymnzypsz}u|zcdqkSKPepag{uvsppmvmmburfky}tlrphuukp|xgqjr}mrr|{u}ot}tkygcfks}rh}|xnsw}t}}pw|dZovrxmrz^djugRL[dV`zzei}}eZy_kpv}piztmaQVikdokl~urrmhuwoxufevzzs~|zyppsr^hpdX`l]Qf{qjkuxo|~~zh\o}x}r\\{xgnmhj{mtzklr{u~{w~j{y}~{aewrhdqsgms{ml|qnrmuposjs{zwawne`ZKPgrhnsq~y|wwysr|utongozhery}{{llkbVgqUu{j||y~pe{`hrvxrwoqz|yzpz|w|}rxooqpdSX`Y[}u~yfuls|pgzzlfospy}l[ilnunvuv{tn|pwfvf|x{cl}whnf^[iyx{z{~~oq{}tn^zpo}jo{|eb`bZZpzeYu{rw~onyxkh_hslm|yxno{~jkoxqce|r[{nktpt}vyvfi}zzw}n{yv{|uwqwuef}{kle`IJdtghv{}z{rqp}w|ni|gfrrbn~ogz_rkhz~t}wxx}||wz{tjyy`de_boyexwpp{}{inzsnyis}hjudflup]`jmp{{|wv{yyeougrcWu}fikwt|uvtesrsvmpp|~|pzxtecwqs}rldpjz||~|}}n|{qqqa\VZTbkbRj~r||z~}gl{wo`ovym|vizai~t{}zl{~qylu~yty}qwwc^onteiwf~}sv}xudxup{qo~yvdburqxoeQaz~ktzyv||v|sxzsrkrwfusgekZckzzw~miji}mi|oumoulpfwsp{zf|{}}nxrxzrmt`]hmjNR`e^sz|~~yxyzqrpwtqkmlu{wwml{qumrluyr{opzwxsllvxlxs]kmloqhwy|vycxuiwmlzojvlfalqfpsh]stxpnipqlkqzcYgibsrvba}{vl|yxwktnz{txxg|hlvznrxuuy{|s~l}~r`dxoth`ZNbnj_ndkz}xvz}mz|zdvqgxogyslvr`lozqzyx~v}t{w}lsdfzg_exeXa||~}{wyq|yqroumqbkwww_foof}|qm~}{}|}v}yui{}~pkuf_jxgj^dln|zuu~nwzyir|t~tgwi||rc|sityr}{~z|lttlo|p\c\j\\hiW]suti|wtqyyvu{trmxpyg_liqtv`j~y{}v{|q{x}|xts}qhjqhUjidiznqx~x{rz||qag}sytoq`n}~knovqw}{~}{z~mzzy}|uqjhypjklT`hv}mz}~pwqnxvutxvx{{yk{xq{mhs||tx}m{rqksyidfWfchdRZcilpa~wq~nyttsnt{qouecr~lqenqmyx~{sv{vmmujtx\b^iugahmi{}z|moupr}yjujxqpxqi|~h~~}smwy}mqxvwiujyu`T_agwlykp|{{lyvqm{iv{jtuevtpuvsz|yx{szuwv~l]\j^ee]bSguf\|phy|rtnt~wssjf{wspo\lku{ny}|||wyuvylzaxobm`maej[Yl{||lulvnumk{sf`{gtruku}yv|o~q|yvydj_Y`qeikgwm}v}x|y|pn{ytzrt|ouqqwljni{~p~w~y|hioebjfYdZrmXeyhbtss{qu~qxv{slzrxe_kclslwfry~y|x}vriumtqomhucf]Uechqudusyv~rlvws{bsykl}ysoeyo}tq{rmxx{}xkh[qohek\ilo}iiy}~~wu{|l~y~~zsvtsb`pyx|yt~|~zwv{itdrqe^c[jv]hiickmzoitj}wu}z~yzt|ziqfchobpdm~xxzx~nmxf|~ogtxomlXe\ksdZ_]bwp}|uywycmqto{yqhwpnudsqs~rrr}}{vxeptnykbcjbugbimxrzs|x~np|~u{cgropytry}|}zux{xn{hoj_btf]mjo\fuwjqkgym|xml|v~xz}ttdtnhei\pyuvjwy|ylqk~v|lp{nvwpgqdtoaeWS[d^tir~ufo{ntoygpvrtvcpeqz|vvz}~}{{{qy}rknpgelaXedxcfrx{u{~xvwsfuizzqltm{|wy~z~sywpu`puo_dhpc]xmnqqkxoot_kkp||}zyosxitjbcrowhrlq|~x}yvz{yr{xqbvpr|koqstllbR_ZX[aXnpysusypjmqlukswsmudw|vtloxt~}you}qyqhtk`WX^tYc{onpsxs}xvx~}v|nzqzpmswq~kz~{uzv|}fxvtp`im^Xukttiqwvww^j`g||~~{w||~~m}jhoosp`khry}wxm~oejgmxetmlyzxhWfT\^WS\_uj|qyhp}lnqf{qpsso~yyionloys~}{~m~wtt|gj[WcfOepgpaisxupzu|~}}x|nzurnga}w}w~~t|z{{whfziY`hjzfquowxojgZupt~zzz}{~zk{mz{fbulgtn}}oyx}trnihndooe~z}}vim]]fRZWYcn\k{y{yk|vkidzmnxls|irkbpmknqu~tm}pow]\odS\deiTgjhpspz|{}}xz~~zryoaatnru|~}}|q}y{}gyeffkllexlo|mlhehtfxujwvx}|u~xugtwidevrvlx{jrqkgibw}wwrpokp\^cSfi]Sagsfmw|njmlj{gs~}~yq`thdkfix~~~zpqn}ic}i^^fc\P_bXldemv|zzkwzz|}zx|yyaiqobdqnp}x|~wwvxv~qwlpyrlmjo}foi`iqtzsfyjmsjbivx{s{xkipxq~tzt}s{~s|lrliltuxoymprqmmZnr^ZYd`UXyrz{qwqmnins}ytwpbtccqvslkt|ytw~|t|kocniZSVQ`cRggnz||igxiqutw}ysrozrtdepqcrki~w{w}ywwxtorwroongt^^pnv{ywxevq]__mqglrm{{wwtyu~rty~y|zus}sqmuvy{rtybrtoqqpzvfkYdfUR_cr|l{uuuolqqx{uwxuxhe{puldp{mxu|~x}zgta]ZVTVPa`[wvwvsmrcjwfpwzzzv|arvlb`_uli|x{s{yvuy~{|qwsng`Yldh}wyzzyzbgcYoj^fwxx{oz{wwwuojxs}xx{qqzpv~vnhewgivns|{lXtpSW\befh~qxyqvtw|~}qq}uwxwxzps^qwmfl{wwu{x|{{xzvdxsquhnx{~fv{tiqtx~}~v}tqtv|_Xsigmmr{wv|v~zoghksq}nu~|shsxg{}|wuxvvz|voji|kosqpofrqgmo{|nlvkvnrx}|vnjki|xn}zeluuvbgbYWenyel~|}~kx{mx||yso}iernzt{ums{tzvf}hraRVTV^dqgnvquyy|vplktyodqo|xyx~|t~ixy{v|bbih\U\xrZr||}mighkrq|m~~topq~w~{|~a^{vxvtk`YU[uks}dxuogpwokt^err}rsononzwwrTcp{{iejlaVo|htqosvvykpxywoheapk[pvqysmsiWq{knmnmifs_arorv{qxtsykdjpyqw~tz|wttsemmmzyicll]joippyelsuvwu{n{quyuqonor|z~mmm`inyqfacfsnzxyxwkkyukeamr\jrvyrspot{t|siwocxy~tdgpnxe^rpqtw|slkgdcbevhn|v{y}~x~un{lrrip}xme]goZjsuzlsockqtvtn|{uwzsp~~{{~znYhfjtzobckxr|ubuqwxwvuvgay|tvspqtz{rz|wu]kzywwvutr|o{us|nf}okeccans`t}ux{wvooo}iyz{w}~shaqj]qsu|su|ededbej|hpu~yv||xymr{h[iflvukebeudjwygtvnwwvutyigroyuq{xywlorW_iiuvrtvtq~~zwv{sr}uxvrmdmxmxtr~uwwzzt}zkdwzfv{}{yv~eqx}wyyicdcabdxym}~~qtr{tsstuuwgxwvy~qheeukby|eowddehmsrxfh{uxqpxvvqyzqiq]Ugiqxqlgejxvu{{tivwvurmkvb_w}wwzp}}zpgaanZXpz|~zx|vp|vvztttmd`fvba{zyy}ohiksij}}xqqxgu}v{fvrbdcdfjvnlzx}wuyzxrwwvrnt|bdor}vojfdp}m{|zmdypgptqe]rghv{wssx}yv~wj`ZdePar~vsompvau|y~zz}utoha^nqd{}rvsrlf_[Yig_y||ywucu|w~ndcjqlarsn~yuw|u|oknpoln{jewy~wlfsyky|qbutdgknpos{bdvy{upv|syzwrmhllRbxuqmmpv~{{zykj|tmabnnql]v~uy}u|uld^YXgcXs{}vl}wz{wske`^`j~toxy~wzxv|lhd`^_l|c\o}umt|iu{lzokun``k}}aiwz}wsqrxvyuwtolitkUeqzxrv~{tq}|zveq~prtrlfese\rz{xuy~z{xtmdZ^pggps~|{|~rs~{{|}ywtaktma^q{kzsshea^\_sndx~zpwtir}|ebdgjmvrp}}~wsr}v~qyiijlniig[ozsz}uprvzgqyeclrnitjZluzywusu~t}yvrkdckXVnywqv}|||}unuqlfb`js`i}|une^bkvjQg}~kxmk|rgaciq{l}|{s|lgfffiq~i^mpt{yyz}wfvuhlopppzgeryzwttvvp{rvth[^uxX\mw}|~|}{s{qquofaapl[m{yz{~rvpi`Z\mf]s}~{m}wogdb``i{ro~xxxxt|iejpj\athgtsv|}xqu{vxxcfkopq}jnywyws{xysnwjlnnliqmU^mqyzx~yjlzrsrpmksm]u|yyxx{szpc_fkeiaVm}xzgx{mgc`_duof|{yx|uha\Z\evkcv~yoqz~icccejwm]s{v{{ynw|rsj\YboybXjrx~zx~~ht|ppqqons|f_qyxv|}xk}sqojb]akYXo{~xpuqnha]jskt{{}{~yzychnfXTbrdisr~w|gba``dtqu|sxqw~rs_]]^`cqvcjy{}yxt~pj}sfgkoojnpi{~~xsrw}{luy`\cgdajeTdv~{|{}wju|rqojffqj]r~xr~{~p|yle_YVZjd]xttshb^blw{dc{ys{dvseYUX^lyhj~{yl{vecdfjp~mo~zwwyngwnbcdcbdqnXbv{z~{jowqsma]jzam}xuuw{}tqvlkjc[V\j_Yrxw~uvnic^]iwjmy}tzvu~w|f^ZWVYkugnyzpyxvqbfooeau{oz|y|s}yt~f[]abcjwk_ox|{quhw}mknpppv}hdwusyzkf|zkhfc^\dfYm~rzk`clpmskav~{}urf|se^YVV`odd|}wkc`_agxms}~}qztq~o`]\]bkwiRey}is{uj`bmzocsz~}zwyxdsxkhhfccjnXWkvrpwurniittak~{|wz~{{ouxjd^VT]us]bq|z}~notmb_k|rl~~uvsu|f][ZZ_nyhhy}x|yqvfdfikp~~ilwx~{zzx{wlk{pdehga\fkdntt{zrudhpropym_n{}{{|s{|qhxtjfb]Y^h[Vl{~w{qkgdepzlnysxp{eZWZcimgVd}~nmtfabgo~lq||wxokzo`^_adkxs_gtz~lnvllmmmq{p\j{yxzvgpvmg\SXjzjTbtstyvsmgelxldw}zy~xn{pc]WST_mc`t{{ujfddiwxmty~v~unwirr`^ee[Taulhv}{jdgjloymfu{~}wtwwm}mcsvhcdedems`^r~}qktomjgemtjr{z|~||qn~dUV_dbfhZbzznrukfccgv|nvuw~w}pm{q]URRU^psdm~{xwyjghkpxt^o}xuxq|r_cxuj]RS^lzq_k{lovnmmllq{n_n}wy}{zodq~qheb^]eqe`vxqvkf`^dxtgs}{tviplbedZSVhqekz|~lfdehqsy{swktxffreWUWY]fuo_iwowxoprohixxr||vsruvyslj{z`U\cddkqb_sy}povokhefpsci~~zus|z~ymqzh`[XY`pqfuzu{ue`dlswxkf}|}q}h\ro\SQU]lwidu|rojkmpwoo~{{yt{}p_`qj^\]]^cneUf}rvlb`k~o`o~~vvwz}t~}ralslgc^Z]in`e{x{qhd``hwuhs~x}u{qz}own_ZYZ`n|o_gt|{|p{}qqtoeduwr~}|~}xyspxm[XZ\^dqo\^nv|{swvttsswwfpv~wtxw{tj_lymb^[WV^lhguxx}rdhqsorufgzzu|}sm}pejk_ZXY`osfmzz}kcbcfp~zip|~~s|{jnzna^`cglo`Vnxl|sebitugs~~}}|l]jsh`_^]_gkZVhv{xwspmpz}lo}~vw{~xt~}{ysghyucYSQVeyv\[o{t~yvoebjyyjq|s{}{~t}z~|pr}p`ZZ[`kzvgp}|qvuifgimusbjw~r|}yqdnzpgec\W_rpgnuy}rinstszpgv~zjy|qe_pyk`\YVXbj^[n~{|smjimzxs|}~~~vku}~~}xkcoq_TU]egij_e|qp|iaaem{pkx{{~yusxuw|mdqte^^`dkw{jfvqk{rkjjjmvveh{{|}}uhg{}l^TPYjzv^]qvn~{uqmkp||mtwzwuodhwp_VRQT^mmak}}rkjkp|jlzt}zy~yiq~yk\amgbd`WUcxvlv|rfegjnxqep|}xsu|si{xi`owldccdhsxjfx}pnulhecgu~vw~}}x~xmmyoYT\cddki]g{|~xp}wnjilus}~{strpx{}}ynahreVQQTZhumbm{w{qoqtw{yij||~xusvtn{}vk]]t}lYPS^lz{ihxqn~~rlkjkpysbhyz}|{yyodn}vica_bkwpgvyr~xib`dqrbp}|s}}j]gokf_WSZjqdfw|tlkmq|tx~twziqwi\cmbWUVY_jreYfx|}wytnfgxyqw|~~wssu}ur|~{wusmnuj[[adfkupah{}xo{rkhegowndqxq}tuw}|qlzpc]\]dr{ojuy|~xtoimtutwuks|xzwg^kwaTQSZfrm^dsz}|zursuy{mv|yzq{yoaYgpe\YXY\fi^`w~mceo}~fcsxz|vvx{qnw}v_]qvmfa__gsqdlv~~pRhp\[G=LG7GOANeYVppcwn{|c~{uyyormB*fbZiamuah[MnfqM6zG5,5I<:USUƳ˖hdfRWtlfGgkhZhjpqarqvtq_`gjJWT#HaSqtf~agҲˡcaȰoC$-(?T7iKOoj+MrOyf|dJZcrWXfshMnjGn]>SYGʲseu|qpcjxbWwēzyKpeZLUwyiMQWjZdiNNeItI<|_y}wZppe|bz^dNcd@L^A{|itbZmwoUcRo^Huۛ]u*#bc]~ш[dWi]fhTAlIYX_p`yi]t}vZywb8Va}¤}xtuhRYN59iokxRtebgel\xa8<OwzuxoQkomydQ`SVxK8O\Vviќ}gktdw[Fb}Žrned`dRA&mnU}oahcY]zB>U]ak˖gVcz^]ucJ>`˲~rcgbdjRB[K7TrçTq|idof_jmo>;5(x~zTKowcyQnmWL[~i7AZ_uxt_q{^yjhMMyӧqtzG\LYV9;U?2l}z~Sniix_guv_;L3TJmtov_yd]OrT7P`gӧ|d_Vn|ZSP_=\cĩ}safqXzf`ZD٩grw9XIVQ67[LAN}u@Woc`qZYcObu^:I^mĽwlxYjZaKiMUˤxyy]P=SIYC0EbBTqėt|ojcsfS[KAJXxQXxx]aXm\dwhDF\grgzTVqRVJWRCѨv}}dd=WO^O;FkQXmɡͪqmcnfPVIaHNW|ɧokcpeVUOBIgrpYa}R_PpfgriMFRbyt{nSTfQbMQUKέxz~qo_ARU[L=GfRVQ̫δqmdne\TN?DkdvgWZx~G_DhdbkgQBL]smxaWh]icNcSֹ{ximy^@GPQG6;YQLBpŭoncmg`]PKDuiwnldQvEjoilj[GKZogrcNYV_kA]TtҾxrlp~dPEVSO>AX`XGdĸГtscngekJOINI=7GZXHFʱĨ~sdiifuOVF_dtrlv|Y]Khpgee]JKfc}vZOMXofBbjs˺ly]{sXRATKF=GYg_E}͸ɐuoakbpcMQJ|ogjukzxs_mAOfk_aaVDYifǮ|YQTj\O{u˧rli^VU?@K@;:IZjNQѽraeceSWRgkpux{ubiD[ph_ceSLjeqdOCUpusKZmeqYpxMX=JHA=HWmvRxݻm\f]nvNWVvjk{zuyxzj|rc}X?Vl_ZafRYpiŽteQEb{vwMsrǹ|bvzNxeEO4E>:9KXvqVٯ{dZb[wnT_hpq{wo}toyTC]n^]fmUiqyŸ}pyxXCAgytnnJqgcfWRLL:IfwkgtSnea~zaV|PGN:E<>J_ouܨrXZYgaZtf}qxwy_ji~beI?^dU_qleupŻwo{oSA]}shyisvzy[uunKs`>K?;;4ATcx޶ZYXbq\pvtuyfkfqb`>Wi\[ouhtkvfwnY?Ovp_lqf}py]ottPnjEIK<@6BSc}ʟ^ZXbs]jzjruxcc^xVe>Jb\UitiofǴyl}qfHQwwbkzmprdmsrRhkIAM<;19L\xyϛcZXcxdjlx|zhg_VmHJc`VitnlbɲrlxleGQsqZdvpkifouoYljOCRA=3;N\zԟd]Yivck{}ltzrdcYQjIF\\Sfnnc_˳rwyqkQ\xr\h||kgluzvh\ldP?PA7-5GWrrМf]Zmwhp}rzrig[TnTH\`Tfosa\˳nwvkkRZqpV_wyl\rrwxi`ndYAPJ934HUrrتq_\lvlkwquocdR|Tc[BR\R^kscV˹wz|ms^asu[`vyyXztuxi^na\CGO70,@Ljiӵ}_]gxulxxywclUqiZkKL\Y[kupSoiod]jr]UhsWnt}vrrZpd^Q@UB5/=Kgmz̠i_b|xo|yyvz|_gVZ~PeXBPXTdp{VnɮopmpemtjVcmn\|z|jxZhjXZ@GN5/0CVniͲx_^pxw|~ywnahN|hVkOFVY^np[ƽ~xyvgkjgmkZTjnXoz{|{knkWt\ZS>QG52=Pmn˧o^eyzxztz|ZdSVUYcCFUXdv`vŰt}minnpogW]rZ|{ysarXbmQZH>P=23CZtnf\l}|t|tuYgLizR`bCHX_meuy|xfeknoh^Tajs^|yvsg_mQkdOZFBS=8>Pl{~ǿyc_s}ospcV]EppJ_Z>GYctpŻtogfqtre]Yoojl}wsm[baRrUOU?EN7:CZwxóqv\e}wzqzZ_PV~eLiQ?NblyȾ~|~sxccettk\X\|xcu~y~~pm^WeQbjJUQ@NK[mŽr{wtaeh}qY[awwvr}yvqgQUXMheHNVDDN=GRrt´vh{n}kue`JSqrxYSjI:Skp|wr_aeyrYW^~xmyqsxswfPRWJghMLZL@OCISps¿~m{}q}jrgaFQmmv`NgM6Lh|r}{tbdk~w[Wa~h~vryuzeOTUJkfMIYN;ON^aaƮzz~txpI]ocov`QbGeiVLJ^R7DRWf[wx|xu]NmgfsvWY^CFkwd\`sx_WlzrY{jYer]IQ:_dUNI[^FFclxfw~xw}wYQga\lvbOdWNj|}fW_qjdt}qgqpOUm|yZHK1Kc\PKOaXBTmyrqƻ{zw{ytOag^bswXXiW[~~ypZVd{tei}n}ve~ZJ`t~jJM89]`UOLXbOHgx}kŵxy{|xV[f_[kxeMebVn~qzcV`v}lizwsnqlJSn{rTLA/T^YOMPaZGYvoȹz}|~weYib]dwtT[m]e{|}p~hXZnqjtvktjyOJgw~u\ME.N][RON\`MRss|{{|~|}wiZj`\_svYQla`qv|tym][ovmvvlznzWHbw|x`RG/JZXRNMV`QMlrx¯}{z|{~zn`oc`_ryaNkhaktyuun`Zn|wnupi~{psZH`wzvaWE0LZXTONS_TLi~o|İ}{{zx{{kfpa_^pw_Jih`brzuypd^s{yrxml~{~ss\Jbyzub[B4QXVTNMQ\SJeyj®z{|{w|knucbaqydKgmb[oyxvqf`syyswgjyw~wl}aK]wxtd`C4PWTVONN[XM_whű|~{}zw{{kpwd``kwjK]qdUgzuujbqz{xygiyt~kykPXtwtffG5OVQVONKWZOWrg~Ŵw{|{}u~nr}kadiwrUTsmWZ{s}ymfl~|x{zkavpynnsXPivriiU3HVPTTOKQ^YSlkuĽu|q}ztlq`acpucLhv`Nyx{qkiyx}~u_sqr|gteR^trlic8@UQOUPMK[_U_ml±yu|~ztzg}}g`divqXWyrRczvuumjo{x}ffxk|ofp\RdpjfkO2NRMQUOLPbb[ikþǤs{~~p|xyolr``dlujSegO|trpllwx~w`tqnfikWWjmfhf:?TNLTTOKXhcakqön~~nu~eyl^cgqvhVra\x{nnlmnz}xpcyls~`ggVVfe`i[3FQKKUSON`ojgmôĹ{n{mxqva~|g\cfrvh[|]k}xzhkjnq|~|{kjzi{y\geUWe_aiM4NNIKWSPRiunjqɦrosprviksc^gjwvffy^tqaijqu}{{zfuqkiXi_SW`Ye_;?RIIPXQQ\vzpinxlx{m|tayj^agmytdvjn|vfciotz||~mnxhw~[]iZR[Z]hL9OMGJVVRTj~zjqʥvmvoowzeptd^hkvzoj{isp[flvw|z}ukvkmgShdTSYVgUU\^YNKJMXge[r{||z{vz{riax~wwsqw{sw~gmoko}vfix}qzyrrnikltr^MbpO/EU[\XMMMR^ld_||{xytzyn`a|~}vxtu|}p{tbnkhotdl{yrvtrlgkltnYLflD1KV[\XNPQYeqdh~}|yvws{wfYh~~|vzwz~wpfcnfgr}ncpsxqupjfkntfPQn\6;SV[[UNSU`mna}|~zvuut}~qYXu}~~zx{z}rwq^hkciyzhfw}qxsumfhkpo\J^lH4IUX\[RRW\hrgj~|wsvsw{aQg}~}w||~~vrz`amddqqcnq|~pvphekmqdPQlV8BTTZ\WPWZdomc|xrsus{mNZ||~~yy~~zte]jhaj|yggyvusttkdimpkXMda@>QTW\ZQU[bknb||ztrwsxuPUw}}~{w~~{wh^ikagx}kdtxstrvlehnon\O^cEAOTT[ZRRZ`hkbv}|sqvuv}{SPr}~{v}}~|zk^hmbfvoco|xsuqwnfgpooaS[bIDOUSZZSQZ^ff`t~~}trxwv}}TRu|}{v|{}~~~i`jmbfvobnyvttqwnfhqppcW[^KJQURXXROY]b`^vó~}tryyw~|SUw|}zu{{w}}}jckndgwqcjttvtqwogisqqf[Z\OOSUQWWRNX\_[]uô~}usy{v|YSs|}zvyzt|~|mckogdtuefprv~tquqhhrsqk`ZXQSTUQTWSNV\]YZr÷~}vsw}v{_Rn||zwwzr~}z~rdjnjcpzjbkowvrstjhpupne\TSVWTRQVUPS]]XVlĺ|~~{su|yvmRc|{{yw|rw~z{xfhlldizqcejtwtrungktqojbSOV[UTOTVSQ[^ZSeľ|}~tsx|tz|YYr{|zyzvq}w~~jfjkhcqzkafl}|usssiiptnniZIR]ZTRPUVSWa]UZzı}}zrtzxriUbwz{zz}q|~yxqegiidfwuf`etxursohjrpmmeNFY`WSPQWWU^c[UkŻ~|vqtzss^Xiy}z{||yq|ux~hdgffbizsd_f|}vvrslhkqmll`DG^aUSOSXZZde[ZzŲ|zspswossZZjy|{|xw~yrysccecdak|rb^izvvqqjgjojkkYQairuuy~yu{x{}{~tkijosoihebfga`n|opuqkkihptokmmoph\WSOS\bl{{fL:8G[fntvw~}wx|xzwjginssligddhc^grottmkjgjsqlmppqk`WUPPX`gv}oT@8@Scjrvw{yvw}{|{ldhlrupihfcfe^bwvorvplkhfnqmmqqqncXUQOU_er}uZE:=M_gouwy~zu~x{}y}mbfmsvsjgfdde^_s}xpswsmliejpmmrsqneYUSPT^eo|x_H==J\elswx|zt{z{xo`emswukgfdbc]]p}zrtxvnmidfmlmsuqneZTSQU^fp|x`I@>IZdiquvywrz|}wn_eovyvkfec`aZ[p}zuvzxpnicdkkmtvqldYSTRV_hr}w_JB@JZcgottutoy~~wn^eqxzwledb^^YZp||wxzzrnibahjmtxqldZSTSV_iq}xbLEBIWbemssssnwwp^bqx{ynedc^\YXl}|zy{|uojc_ejmtyske[STTV]iq{yeOHDHT`cjqsqqnux}t`_ox|{sfdc_ZYWg~}}{z{|xpld^`hlszwmg^URUU[fowzlVJGFO\bfosqpor~}zzd[gv||xkdda[YW`{|{{{||tng_\djqy{qhaXQUUXalsyq]MJHKV`ckssopq~zl[^pz}{rfed^YY[o~}y{zz|ypkc[]gnw}yle]TRVV[fputfTLKIOZaepurprx|}v`Wdu{|ymefc\YZe~{|x{zz|vnh_Y`kt|tibYQSVW^jqsm]OLKJR^cjtvrrv|}lYWhw||wkfgc[[_ozvxzyz{tle]Xbnxrg`WPSVW_kpofYNMLLU`dnxytv}y}ycUWjx|{vjhid\]eyy~swyxyzrkc[Yer|pe^UOTUW`kmj`UNOMNWbgs{{v{wnZR[pz}{tjjib\bo{zvryxxzyoh`X[lxzjbZQOUUYdlidZROPNQ\elx}zyyyxcSRbv|}ypjkh_^i{x}}qtyxx{ukd[Was}se^VORUU]hjd]VQRQOVahr}}y~~v~jWQYn{}{vlkjc]eu|ytqyyxzzog^WZm{{i`YQOUUYdkd]XTRTPR\fmy~z{wzp\QTex}}yqkkf^aqywqw{xz|sh`XVfxoa[TOTWX`je\XVTVSQWcjt|{xzyt^STau}}zskjg^^o{~yrv|zz|viaXTavrb\UPSXY`if[XXVWVQT_gpzzw|yx`UT^r}}zulif^\m~ztv}|{|xjaXS^ttc\VRSYZ`ifYWYYXWQR\emvwu~{x`VV`s}}yukgd\[nzvy~|}xi_VR]tsb[WSU[]bieXV[[ZXQPYcjsts~w`XYas~|yukeaZZn{yz}}yi^UR[rtc[XUU]_cieWV[]\ZROVagorq}|bYY`o}}yvmeaZYk{z{~}zl^VQXnvf\YVV\`cheWT[`^\TNS^elppzfZZ_k{}zvpfa[Yg{{|~|q`WRUg|zk]ZXVZacffZQY``^XOOZbgnpvn\Z]eu}{xtjb]Yayzz|}}vfYSS^u}raZYXX_cee]PT_c`]SMT`dkoty`Z\alz|ywqe_[^pywz|}zo^URXi~xk\YYX[bdd_TNYbc`ZPOZcgmr}l[Z^dq|{xvmc^]f~~tw{||vhYTT^s}tdZYYX^cc`XMP]ec_WOS_ejqyzbX[_fu|zywkb_bqvpv{|~zscWTXdy{qaYYXX_ca[RJQ`fc`WPWchmur]W[`hv|{zwkcbiz|onvz{}yqaWV\i}yn^XYXW_a]VMITbhd`WR[gkq{|iXW]bky|{{vidfr|tiowz|{vk[VYaq}thZXYWY`_XOIKZgid_UVajmvq`VZ_ep{|||sgfm|{vkhryz~yseXW]gyypaXYYW\a[QIGPbkhd\U[glq~xgYX^civ||}ylfkx|vmelw{|{uk\W\dq{shZXZXYa^SIFK\jlfaWWajmx}k^W\afp{|}|rfiuvnfgt{|}voaWZbk{~ul_XZZY_`UIEHUgnic[V]gksmbY\belx|||tghtvmgfr{}~vodXZajw~vncZ[\Z^bVIDHSenkd]UYchnod\\beit{{{vhfswlgeq{~voeXYait~voe[\^]_cWHCHRdold]UV_ek~of^^cfhryzytgetwkggs}umdXZbis~|unf]^`_adVFCISeolc]TT[bh}}oga`efgpxywqeeuwjghs~tlcXZbiq|{tnh_`cbbdWFBJSdpmc]TQW_dz|pieaegflwxvrgdtyjfiq~vle[Ybinx{uojb`ddcdYGAIRaooe^UPS[au|}sjhcfgfitwvrjcq~kdhn{xme^Y`hmt{vplfadfdd]J?FP\lqi`YQPW_m~zxkifdgfenwvsnflocekv}pgb[^fkowwqmjccffd`O@AMWfqnc]TOS\gy|niieggehtwupki{xdaho|vjd_\djmrxtnlhbegeaWD=FR]mrja[RPWas~~xtiihegfdlwwspkrl^air~}pgc_`hmnsvplkfcggb\M=>KWdqqgaZRS\i~yxmhjgfgeepxwsqo}{bZbjtzmec`dknnttnlkecgf_VF:?NZhsqgb[TVbr~wxxhfiffgdfszxutur[Xbjuwkeecgnonsrmkjdcfd[P@8AQ\ktqhe]VZh|}txpegjfggdiw{xvw}gUXdlx~rhefekonmrokkibdf`TG::GWbpuoie[X`r}xs{zieijfgfenzzxx|u[R\gp|zmfghioolnqljkgbfdZL?7>O\htunicZ[j}suoegliggehu{yx}dRVckw}rhgjimpmjomjkkdef^OC8:HYcpwrkg]Ybx~}wr{thfklggeenzzx|nVR]hq~}wkfjllpniknkkmhdgcSE;8BT`kuunjbY]q{{rwwkfknigfdjvyw{sZQ[go||wlfjnlpnhhmkknkfheVE<8@Q_hsuojcXZlzsvwmhkpkgfdfrxvyw^RYfny{wmfiomonhekklooijgXE=9?O^fqtpicXWiyuwwojlqmgebdoutxv_T[hozzulfjpnomfcjlmqqklhWD=;AP_fosng`UTh~yvxwqlosnfdbclrrxwaV\ipzxtlfjponleahlnrtomiXC=BKZcforkb[Uazz{y|wqsrtvodba`foumaY^iqx|rnlkpwunia[alpvzuncO<:@EQ_dirriaZZp|yz~yqqsruukcba`ir|xg]Y_kry~yommntztlf^Zcmqvzsj\G8;BHUbflusic]c|zz||xymprsuuiccbblvqc[X`lrz}wnnoqw{skd[YdmrwypeUA67=HNXdjq{zplp||x~}y}tlktxwvshedbeutfb]]fprutnmtx{~ykaZV\jrwztbOA:>HPXahnwyrmq|~z}||tnntyyxtlfdbdqwjebaforsromsy|~znc[X\isx{vfSF@BJRY`gltvrnr}|~|topuyzxtmgdbdpxnifdhnqqpnmsy|}ync\Y^jty{vfTHDGNUZ`ekqsqnr~}{sqrwz{xsmgcadpyqmihjnppomnsy||wmc][aku{|vgVKGJPV[_ejoqpot~{trtw{|ytnidbdo{tpljjnppnmnsx{|xof_]ajsz|wjZOKMRX\_dinppot~|ustx{|yupkfcdm}wsollnoonmnrw{|yqha^aiqx|xm_SOPTX\`chloppt}}vstwz|{wrnieekyyurommoonmmqvz|ztld`afnv{zrdXRQTY]_bfkoqru|~xttvz||yuqlhfit{wtqnnnonmnpty|{wpicbekrxzuk^VTVY]`cfjnqsu{ztsux{|{xtpliio||ywtqononnmorw{|ztmgcdhntxwpe[WWY]`ceimqsvz|vssvy{|zwtpmjmv~zxvspoonnnnpty{{xrkfceiouwulb[XY\`cehlpsvy~xsqsvy{{zxurnmq{{xvurponnnnorvz|{wqkfdfjpuvria[Z\_behkosvy}{urqtwz|{zxurppv|xwvurpooonoqtx{|zuojffhlqttof_\]_behknrvy}}xsqrux{|{zxusqt{}ywwvtrpooooprvz{{xsmifgjnrtqkd_^`behjmqux|~zurrtwz||{zxustx~zwwvusqpooooqux{{yupkhhilqtsngb`acfhkmqtw{{vsrtwz{||{ywutw~{xwwwusrpoooqtwz{zvrnjiilorspjebbdfikmpsvz~}xtrtvy{||{zxvuw}{xxxxwusqpooqswy{zwsoljjlorsqlgddegikmpsvy}~yustwy{||{zxwuw||yxxxwusqpoopsvyzzwtpmkklorsqmifeghjlmprux|~zvtuwz{||{zxwvw||zyyzywtrqppqsvyzywtqnmlnprsqmigghiklmortw{zvuvxz{||{zxvvx||zzzzywusqppqtwyzywtqonnoqssqnjihijklnoqtvz{wvwyz|||{zxwvx||zzz{zxvsqppqsvxyywurpoooqstroljjjklmnoqsvz|xwwy{|||{zywwx|}{{{{{ywtrqpqsvxyywusqpopqstspmkkklmmnpqsuy~}ywwyz||||{zxxx{~{z{{{zxusrqqsuxyyxvtrqppqrssqomllmmnopqsux|{xxxz{|||{{yxy{~~|{{{{zywtrqqruwyyxwusrqqqrssrpnmmmnooprsuw{}yxxy{||||{{zyz}}{z{{{zxvtrrrtvxyyxvusrqqrsssqonnnoopqrsuwz~~{xxyz{||||{{z{|}{zzz{zywusrrsuwyyxwvtsrqqrssrpooooppqrsuwy|}zxxyz{|}}||{{|~~|zyyzzzywussstvxyyxwutsrrrrssrqpoppqrstuwx{~|yxxy{|}}}}|||}}{yyyzzzxwutstuwxyyxwutsrrrssrqqppqrrstuwxz}~{yxyz{|}}}}}}}~|zyyzzzyxvutttvxyyxwvutsrrsssrqqqqrstuvwxz||zxyz{|}}}}}}}~~|zyyyzzzywvtttuwxyyxwvutssssssrrrrsstuvwxz|~}{yyz{|}}~~~}~~}{zyyzzzyxwutuuwxyyxwvuttsssssrrrrsttuvwxz{~~|zyz{|}}}~~~~~}{zyyzzzzywvuuuwxyyxwwvutttttssrrsstuuvwxy{}|zzz{||}}~~~~~~|zzzzzzzyxvuuvwxyyxxwvuuuttttsssstuuvvwxy{}}{z{{|}}}}}}~~~|{zz{{{zyxwvvvwxyyyxwwvvuuutttssttuuvvwxyz|}|{{||}}}}}}~~~|{{{{{{zyxwvvvwxyyyxwwvvvuuutttttuuvvwwxyz|~|{{||}}}}}}}~~}|{{{{{{zywvvwwxyyyxxwwvvvvuutttuuvvvwwxyz|~~}|||}}}}}}}~~}|{{{{{{zyxwwwxxyyyxxxwwwvvvuutuuvvvwwwxyz|~}}||}}}}}}}~~~||{{{{{zzyxwwxxyyyyxxwwwwvvvuuuuvvwwwxxyz{}~}||}}}}}~~~~~}||{{{{{zyxwwxxyyyyxxxxwwwvvuuuuvvwwxxyyz{}}}|}}}}~~~~~~}||{{{{{{zyxxxxyyyyyxxxxwwwwvvuvvwwxxxyyz{|~~}}}}}}~~~~~~}|{{{{{{zzyxxxyyyyyyxxxxxwwvvvvvwwxxyyzz{|}~}}}}}~~~~~~}|{{{{{{{zyyxxxyyyyyyxxxxxwwwvvvwwxxyyzz{|}~}}}}}}~~~~~}|{{{{{{zzyyxxyyyyyyyyxxxxwwwvvwwxyyzz{{|}~~}}}}}~~~~~}||{{{{{{zzyyyyyyzyyyyyxxxxxwwwwwxyyzz{{|}~~~}}}}~~~~~}||{{{{{{{zzyyyyyzzyyyyyxxxxwwwwwxyyzz{{|}~~~}}}~~~~~}||{{{{{{zzzyyyzzzzyyyyyyxxxxwwwxyyz{{||}~~~~}}~~~~~}|||{{{{{{zzzyyzzzzzyyyyyyyxxxwxxyyz{{||}}~~~~~~~~~~}}|||{{{{{{zzzzzzzzzzyyyyyyyxxxxxyzz{{||}}~~~~~~~~~~~}|||||{{{{zzzzzzzzzzzzyyyyyyxxxyyzz{{|||}~~~~~~~~~}}|||||{{{{zzzzzzzzzzzzzzyyyxxxyyzz{{{||}~~~~~~~~~~}}}|||||{{{zzzzzzzzzzzzzzzyyyyyyyzz{{|||}~~~~~~~~}}}|||||{{{{zzzzzzzzzzzzzzzyyyyyzz{{{|||}~~~~~~~~}}}|||||{{{{{{{{{zzzzzzzzzzyyyyzz{{{|||}~~~~~~~~~}}}}|||||{{{{{{{{{zzzzzzzzzzyyyzz{{{|||}}~~~~~~}}}|||||{{{{{{{{{{{{{zzzzzzzzzzz{{{||}}}~~~}}}}|||||{{{{{{{{{{{{{{{{zzzzzzz{{{||}}}~~~}}}||||||{{{{{{{{{{{{{{{{zzzzzz{{{||}}}~~~}}}}||||||{{{{{{{{{{{{{{{{{zzzz{{{||}}~~~~~}}}}|||||||{{{{{{{{{{{{{{{{{zz{{{||}}~~~~~}}}}||||||||||{{{{{{{{{{{{{{{{{{{||}}~~~~~}}}}}||||||||||{{{{{{{{{{{{{{{{{{||}}~~~~~~}}}}}|||||||||||{{{{{{{{{{{{{{{|||}}}~~~~~}}}}}|||||||||||{{{{{{{{{{{{{{|||}}}~~~~~}}}}}}|||||||||||||{{|||{{{{{{|||}}}~~~~~~~}}}}}}|||||||||||||||||||{{{||||}}}~~~~~~~}}}}}}||||||||||||||||||||||||||}}}~~~~~~~~}}}}}}|||||||||||||||||||||||||}}}~~~~~~~}}}}}}}}}||||||||||||||||||||||}}}~~~~~~~~}}}}}}}}}}|||||||||||||||||||}}}}~~~~~~~~}}}}}}}}}}||||||||||||||||||}}}}~~~~~~~~}}}}}}}}}}}}||||||||||||||||}}}}~~~~~~~~~}}}}}}}}}}}}}|||||||||||||}}}}}~~~~~~~~~}}}}}}}}}}}}}}||||||||||||}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}||}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/applications/PoP/poc/res/pv/a0.atl b/applications/PoP/poc/res/pv/a0.atl deleted file mode 100644 index e196cd983d17a678adce810d61876804be6b4cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15848 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 CP(|4Q diff --git a/applications/PoP/poc/res/pv/a1.atl b/applications/PoP/poc/res/pv/a1.atl deleted file mode 100644 index dc21da7a0c6f54e4e88fbf583ee13936606f4435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16013 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 diff --git a/applications/PoP/poc/res/pv/a2.atl b/applications/PoP/poc/res/pv/a2.atl deleted file mode 100644 index bc1cfb0949bd72460433a312130bf15cebd53708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11142 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 diff --git a/applications/PoP/poc/res/pv/b0_2.atl b/applications/PoP/poc/res/pv/b0_2.atl deleted file mode 100644 index d60500278ec4f5f8c11af1440dbddf7bed3e732d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHOQF7Zj43!+&PCIMgB{ThwyEoXGy~y7Grwf1t2#|yXQBJ$rDJKa@5D$2Kgk(8! z{{HLFw|V;b_RsX=ZH7eO=Qo|~R^@(qd6{q8VVai9<$675+kC1U23>0gzUDZz7K%Q1 zSf^|u_!_Z*eiLTr7$*=|wPktP($By-%=3Cp&Wj5ADb6qi+SxY(_rjvRqhF^0rTnJF zw)1%@+B$ibOMyEs2h5S^r;}y90PUPI0$*eITfbw68_^HSosVmz{xp2;D96?!(O2p( z0$(E*(GP0;DlyEJ0N24Hw?=WP1_oZO9iN7xpHQaKkao@-g0HZQ=!Z97387h#e4F|i zxWswZAQW8};2E08H-+FUTqF9y8S&!_Mp7?j>V?_QQNex3p_O2C)Jd9p$qT|=Y6JSY zv7CjY6rHfyd@%Y!`0nQyVm(V+-&4)l_&zB3oiaEiP`6$KJ;PCF!+?;)9I`W2e814if)Gx{R$@J@y z{w4ZN^oAT>&NiQ2@YIe{bWT2-k@~|c0Ut;&u?zSp#XfPiMx#5Vqi{}F z_XGOjFEbXp{avq-EBGkInzEe-qkE)-aGO)je(M)}`B9qb;edW{_oIt}9_Mu|XMFUC zov_&)jqZ?+!aWir`a!H2MTF*s)%K$lb*y&0BYKbY4tSdzEJOOi&15;lFJ-*D-7L}A^J_Y6_)SkJ-?W&jSQbjzv&A!-od~Te`V}; zucPa%4f1p8_bTN#P=8;ixPV4KmGwWZUpmW+{1v7l3sx+V6{ScD222X$T{DNC8c3y|A!%o=FN6hn$o^?anNXqp->6du$ zU89RDq*dHhzFmLe-{!|X=N8uwDdulQMQps5d(w}_a)lLq<=e!d{iu9v{#<|LgIPVC zCS81_{#;z~EwNd>9na7DjP$Ko+c9jO)0IT?te@k@{|%Rn`XDCvD&jX4~*# z`pMh3Tp`<3iU-t3nQV-V0Od_%i~3~x4c8y;JT9L-o&Qh$sq;4#qU_HZhNJ(w`h&NP z_7A;%DxMw<+;beVhokpNhv5#nkGlV_}usvKrebQmLL+}QFO5+B~ zp?J`&bCaV_#e&MLftRHxjKb0Tq{DEBD(RPmBjsxC5Y~J~xKG8&(84{(A$vp4i_#|@ zhC5+zTyjm-2>_0${QnGD`&0yA2QA#LADhLacS*kEbm-yf-ge!!91GS6U3S`{i#dRTlYV20SP hg4;!&-S0ed`@V~fz7eI6mMnH}VD6_8fARoz{{@v*bT0q^ diff --git a/applications/PoP/poc/res/pv/b0_3.atl b/applications/PoP/poc/res/pv/b0_3.atl deleted file mode 100644 index 985f941f8ce14a2993cc446ed8e9ebeb8b43f764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmd6tYj)$f5rySsGV?>z-U~;f)FwqK*+I_9MrQwil6$KPr~(PTB-0yb{#WyM`1CMmfBDC+zy0>>FAs+E zSso9yDC76Cd0A;W8Kzp}g)=rq?=v>miHr7Li{?^nlXjC@Y60NyNBJQ06)eWbGG7MtbK0>3bJIf~?FW*#i(_#GLD4qenj(=;6cx|EF05@oCR z_aF6+qS@SF(MD921(h5|TNutoFBoaB^8~cM#!uQH`tbuQ>H+u^pi7DTu&^JGqUC&7 z!E9l`C#*t~QPM?^Dr(tfQ4@ao!<4>qu1pBNrh^B%l)#T0BbKlS_T{s(6WhfT3(xZQG(Gh^ral=vsQvi&&+LpBVO z(AbiR9-l7dA*)vDrN;LBsUi3M#fdzdIY)KTYFbC*-B>EF$y5n`DS4D>*_81ZZUepO zhTk4P$g&K9+`5i&a8nP)TuaLjMxB3?fFWg@cjrV)97 z3uz3uzV8^o0KYDUrwNy?u%n@{_Gcn^$w4TdhEvmgQq;8eX{-Qr(b=%(Te&hMX6$TS z0W*#iCjb%+GfWx8u>VO3ZNyQ9qD2PsY6OWH;nG~2rv20~oD5)|Fzj2`EAErPfTcxI0jieMxJ3CpFhNPZlhf)k`HG=NvdCmTSUo$<8balH%o}^!~^}#4?Ka zXWJwRHF+SADnZ#Uk>uxaz2w7#T?jGZ#hm+J&Kb>|54LEm#VN)Dt~ub?1DE&-l_}PG z$@{zb-|2*jg|maynuedX5QMrRvtxopC0s5pMK?(x3k2-~Dd!4V_E-4PfU`HbpZOaZ zWfY!RtX1^hOwn%w=%TAwcDNw@?{qqmhaJ6_i_<%kAhVaD00^K4@aj_N1MoeZ7rnaR zARb8v6m)%u6jmtk<+}^|$EGz5=7gCXx&qLJT2}MK9fm|+@&k6jdP=23{-@3+@HASk4gN=biX45w9sLq`4qqMi=KIOn*w>x?-ITd%nl3xPoqF4B>pChDq zzw-vsJ~}e8H7xsHN$+rQc9J47mqL6ki#U;UjWB8Lcl$2Pi^qS zw&j%~eUnuJG=Fl@Yy4KPGNdN}hxTyj1}CVypDtXK4nv2pT1$Xn-nta#iXiOd49P5U zh0(8H$wrKY86(dnjwsn!8yce{IYJfzy6AO&D+CoEJ#aW2h6IqiAkSSnHT)RIv?XX(GEc!X3u&_!?Ix44KCKM(}J z0I-Slah>QBkwL|>Nj^vH_&spc<>=GbB6iaV;h_4s8eLB{%MQ;VmXzbsmGBx>n7 z6}O?}RVgnG4t-CxchSXNWW#hz6Aq5wr#?gJ>A9=Ci{O?1`O(qOa~(LpSEn!UB%H(e zy?8?&+~cd{h880e8~nM^+1IljI6uCU$xH1>+Lmk@eZyZl#YxAJ3>~D5>sRyAf$3j0 zt{ObqgNuH$gDgha`Fh%w68#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/h0.atl b/applications/PoP/poc/res/pv/h0.atl deleted file mode 100644 index 4dae700e5fcc814a62b93126dfd045e7356e024b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4776 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 diff --git a/applications/PoP/poc/res/pv/j2.atl b/applications/PoP/poc/res/pv/j2.atl deleted file mode 100644 index 9426213c50510e83e9060bf82fa44e0a1c6230bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14081 zcmeI1%dXr+5QZmuYh<7p27T8 z)t9R7>h>i$Q9$v+?#usmx7}6ccKer~e|+^|clXENyJxTN-P`T{y8oQ7zkYfBhVoy0 zb^VsEe>{Eoj;=p_eZ}SXzj^SQ@_&B&_$6IW`=@;U=SHr-e|N?C;rxWT-!6~j`h)17 z?OyGs4|N>ZHgsG`9C57bV=b`Xuj~N8ssZiy`?dNWaJdw%q5ZCY9H;3x-QGrw^!r1b z8OQN59gk6efRy!g@u&-caX20a?m*=GQPgsdJ%=mlN9YMS;b4&gihdXvkHhVW^~9XU z5>P`s^N_~zmX+zGhZNFbMCVDmC;%o)ijZ>;Aj(3}pC=iU+;JL`Nn{B6^TcDK$u^=Q z6Bq%|g&0R6Dzd}?_&(gcy%gGzy}7xe5zQSMzPa%`sM^R-Rn;pXtXJ>U5%7F#^jjN; z;6m%-1OQBoGweD7ZCJ zAp9AC%8ITy5Fo-%w+!rSpg=e_A;8{pSV1_hdN93&*aY(%;38DjAmYGcxI{!2Uu*(0 zuyX`PMC5en$HaZclZt*yE}T4?s0>#QW)dzdfUxj9GbPcFA5$w@S_S|LFwq8mepklFaz^UTI>yO1CT$Ze^p8m_}8jILWVfZ{qs3S_?H; zQw+0t%SJf%7s_PUatfQ%`B30M)ON8rd z>RP7i;+YbnvgCUAHbxv2ZVEcYZHhYp;Uzir&mtlqFU1GiF~=0- zqurN*N4F_pQX-*2WVKkQ3t0`e*gPyK_^6xG-A3n&YIXI%j0Q03#TfHBmg_6uU|2Xv z`GJp2sgwq(S6QM+gk~x}F2&?zqF+!1gp>*l*1;JjkTijda(m4kh7{BRr1*|t-99YK z4;DSb%8o;qLyH=XGs2*3IkfxKY*HNu*?LF?jYRBKRS(mG9-(Jcaf_1#E*5K{R$`c&!zEa_a*mi}-s0O!ZaxRi82xly=(hl6CvMU>YygbG2(5A@d#t2z z*8Qf!G=L%=kpTV|buLSl#Pbq~_8R=7$?gXVF64MVh| z$ufS9;wT=~fP=C0{7j<30v6dauUCO8w0@O8Rkke~wmAW2A)CLsQ8&Z;RN;~HHm;<3 zE?s~N8)jfFpv1{~ipk}yrMO6;(N9WMnU5_q8s{#2Kg7D8jlw+=#c^O93(Lr@=oFin zj2A<~!!IZ|OW!K-9=S7RJ}$t8WY3Y35GlDfK{ffd5?dr3o)r&vuQ$9&*6w`bdpw&( zF|t-x5jLu}0F>udZ2V0TOI!#~n&(p%nd!S%PkqsKB4WGHq6tGtCUnTNDV>bzo75-3 z5o8FSwq_sFlUR&zn1hI6nn9#+>X6BP*RWbTheu(W8Bm$XE1Owbg$Q&bjeg6bac zUT(18vei!@zsjZXOeN4R8#ty-Ip7?_`^%SUh#otuXVaq}gyKOnJLKmx+a2WCjV1$g z^kR3?anSScLCii?HT?&5u+-oRX>WN>AA&&AvyI6R>N9x)-$42IQ7p3p=)al_sOxFU zu0xDj=x6*rfex1Z801cz=~SJYWRO06KOb9V+2|6M?ToQqv{p}R@pfxo&02trz-z~p zrMQUF1$sLU|5_4~vocdSVppzN@8Qbk@|1e1%H}*#DywWR)%fq_(&nPoVQ%5c)e6$FxkNy& zZIwIj*_=$SF`{{!BPb&)ZD_5HzW5*5+>_5c&3UVhEJwaQlv^~Dykg+rbJ4E#cS{rF z3XX)vBQ(nvY#PXWM&T_%o1w|jE0$^!AK0X}373uh=G|i2@!h)9T(G?DD`S?BV9xet z!q2RAJI$d9+L^SQ(vc}wrCy?LSA zXtP>-XA5=-*j{vcdXmvPT`im-E-(f)abWU$KfmLtiM;Qs^rw?rCz#>&*WPh#xQ5}? z`>w$n(#0_JGR6Jku=}n_Es4Y|)H6j8>G=U++pK8Q&C*((2efeCmG2rI$iC~6KEiXd T7k4aDXoXd-A}d9|;57XU@Aetf diff --git a/applications/PoP/poc/res/pv/p0_0.atl b/applications/PoP/poc/res/pv/p0_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p0_2.atl b/applications/PoP/poc/res/pv/p0_2.atl deleted file mode 100644 index 822e3c36387b6434646efc8ad002306eab887383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHO!EPfr44tvZc6L$wv^I(y>Td|J=eYfY0{xNx|D{V(5=Ba)hMuvT4X}cfktp)% z>50;eW9Og0|9TsT=a+wn|K3Iz=+E&@4t6ZY-fp+!Q92C6wBH{NyJ#CXWkJwhQQ+_&@^3N0ABj(W$a{Ry;YA3)xnD}U9m!hJ=i@xoYq&%`o1)>1TJqj@Fz%J93NUx@X{r9ZdOyOv^q3^zJ+R?qwHaD&C7`~xbRa3mY3 z%Dk4M0;?Ks^fqaCcr|b^EYlCw+wJ!IbQd$ggLy5*E;ziqREM+eOiNyoc843l3-t@~ zeKP%8q(4Nzf!>hA?QHhh1y^k?MPuco*^k~N?GJC$SdxFZ6Yzm_@7us@DYl6xs~6oM z?F~=EmDdIO;U6<5I{pp^&kkNov81fqPIQa3GhB};TEFyj-hPB;vbsP&IQ?id(Br(s zGU{uW*no{@FSOhp!UFx%t|*=Sc#y7Xgv zagRb5qq0M)z(WI`+68G9o?P#^y3aqz37Qq=hS&;VWP9qzE6gO>iK6A#v?Hd0TiR20 z2Rn|+I zL*>G}@j|cuHLOnL5%g=u6{OR+K|jYhif2~PtsjPjsln49Kfl1h!k+qJ>M)b!4-{Wt zgMcJWvK!Z=8_vn$AM^`6(y7sm%cKQvNZ+PE^RIc}oMZ9phZN(Fpu)D)7q6rr)rsP3 zP*7kL{tAcYn&AI?8BF8gNeq~0CR&vK3AQ7r8U8{4##s7?A^EFBp#KU`vbL4h~E;V*!jIM-lL z{b;0}6#Q|9m-87C@b#PJFYPE@kS~r$Z5Xz74FbgRrc~<-@b(JK;+lRjYYTmllCSA=<2hFyQ@KNL@2uI45 z+95#o9pN?=Ypm`0JPovepCDgN&Z5yKUCqr3H|)oha#hxG04!1d{~5Bjsc?Xz z7v1rYR!z==ZIbqf8?d-ri|tx^)?+lOlwqkI!tn%5mPcM|au#}%v_IT}owslB-%Zp5 zV3Udk6vCgSUro;9(Io8;w_xY(^%|8_Znq9f&cA0QU`@`VQj#V=f4BuZZ?DHFsNBBy z1Qhx`LBN`vHKBrZaPx;-usu5+j?)&t=m+0>rAGLbsT_}|)9v;h1Qgw>8pCn_UazVr zH%_@~)GQAscd|SfP?AnY4hKUY;Uv3znsFaQKpAO;@artQ5t{EeESU%)1 l;qa)R?v1U}scDwRwhN;Zxfzs9nt}D)z}y~&{mBE={Q-|)gm?e| diff --git a/applications/PoP/poc/res/pv/p0_3.atl b/applications/PoP/poc/res/pv/p0_3.atl deleted file mode 100644 index f9b4968ab591eb3b0aff0a68e6b0ce22b02a725e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmd6t+ma)<4Td#|V_#@@?z~mwz3?-%rIvPDYAJbxRQW~n{x`}010Vsm*hkH7%<-~$ z0738*K(ZzO`R{)5g1o^NF3xqts@jNhJ#=%AvO znx^Rp&`rtctWb`6ef?~TjNjL{Qh>Fw$x6v3Qkbo7x2STXCxmoT0+uqETsUwa_|8W;Sb z$~Gi&>pJFrw2r{)q-eX1< z;6fVx^>XQ$uy*`&Q+S%t`IMUqvz!nbK?P?ybR7D_hhO9Ch*K2DHOp-2ojc?!Y281bP7(8vQYpI_{j{alH$|GTV`|cb075d%11s!&xL{uZ1W*Hbc2np8 z@I8W37wp9&>3@Rm(xHS1ReS&lWD=@<-&-k@gR1FXcJsvT`$S&qJ$Ar+35;7{>49!^ zmEYp)G)9x&!Er=-?_iq%7W^*#9~FKQ*Telz^6n=NL+=s)Q&$vtnkAR4_XhtzN+hPUr#N0T4BY13=jWHG_1KNp zzFHpTYyH+nddd$`W4@9KXQX3BC^a^zfBEpZo%Z zbRQ-aB{bG6{Z3CX0%35#5W!q;x=6dxBl{nkjnBA%_9(uV-Uob)UNYm7EEoUNi_8F^ z0CQ6^KLrRc6bE!4#KCOt=lGOSLC@~bLPH4!M0BuFMZd}UgF9fp!~}q3Vl>?789ehR zF`e&p>tTlCQ-HGXk)iK@WXrhqBwL`HLVnx_kn+189Z;Rno{Ziug>PDOU@+})mENQy zJVzXms0^SRJ;QJQ93j2i4d+(d-a9g~7?ypnq_^8SJ1LQvn?igoo4Ay=Rcs)cwn5ng zyRK~gi+1n{^6DnK`Sj^FH6hV%qr-|lu@?*w)C)4)Y*-*@<`wFC&} zt((GHk%XO`A(n;!|`CTx`O+n=$F_5_r>e~m{F}Jcv)eJ}CBq0x;KC;pKH*1fmN?c;sXGyWB#|g)CM5AV z^!TC<*NpG?=&#`p^8nC|Ud)d{tcOoI1osy#kheg8WP;#?)v}Mw=zY>a5=Tp0d1o#~v*kt(zAZZ`}&ndi`xzVv>vYdVh7z&-SI{sHYuvWStmu!9X zN+vWElEwX{qKVQ-HVFD8lCQYN{D_qJ9qna89(XZxez9Y^Ebnvq4KT~f@+uhsrk{AV zmoUo~X?Ig9O4u|QhN^6X*SxkLQV2nZrMuCgeWplae1jf{$?|F$Zi7pbn=&HJAU$}W zSAGb$JV~)^H@aw^t%%o^Qh9=50k`F0Q?2f%)O!CyZE@LdbZlK#2E!;gzQSby-IQ@n ze~F&BXg4~xE-e=TLFuXFraYzQ2Mi8)-00A_qF4}2;|7kInrEKRnlgSfotap>t1Fou z`Lxj$R@*Gua+NQaw{hO2WYh4c`8|Buajo_7j z`|QxOO@Z@!cKPy7!Zi%vixpB$+yi;U0W46KfaR5OYOk4CDk;0`c+gs zaYZIm2UAuIRZ&r3_OBi+12$@Kqcuep!T@> diff --git a/applications/PoP/poc/res/pv/p0_4.atl b/applications/PoP/poc/res/pv/p0_4.atl deleted file mode 100644 index b2cb293a76b88e36211492097510bda847c9f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcJK%ME}a5JXvB;b1~9cAy=Y*oggK{7Xof1GCXRk^Q`REb}yo`@dGVsT@J0sO!xY z<9RAgtDO(Qs|9p3ESK304=JU2MkZi-K8d9YLHo#>#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p1_0.atl b/applications/PoP/poc/res/pv/p1_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p1_2.atl b/applications/PoP/poc/res/pv/p1_2.atl deleted file mode 100644 index 56be514a62374bba22921d86cac722c7b554af42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p1_4.atl b/applications/PoP/poc/res/pv/p1_4.atl deleted file mode 100644 index b2cb293a76b88e36211492097510bda847c9f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcJK%ME}a5JXvB;b1~9cAy=Y*oggK{7Xof1GCXRk^Q`REb}yo`@dGVsT@J0sO!xY z<9RAgtDO(Qs|9p3ESK304=JU2MkZi-K8d9YLHo#>#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p2_0.atl b/applications/PoP/poc/res/pv/p2_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p2_2.atl b/applications/PoP/poc/res/pv/p2_2.atl deleted file mode 100644 index 897aef58a02c457fd79fc8f4ca81f4142202f298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p3_0.atl b/applications/PoP/poc/res/pv/p3_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p3_2.atl b/applications/PoP/poc/res/pv/p3_2.atl deleted file mode 100644 index a0ef0f26c9fc712fcc9bc220f1541c9370a514dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 I7jd5d2Sdt{O8@`> diff --git a/applications/PoP/poc/res/pv/p3_4.atl b/applications/PoP/poc/res/pv/p3_4.atl deleted file mode 100644 index b2cb293a76b88e36211492097510bda847c9f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcJK%ME}a5JXvB;b1~9cAy=Y*oggK{7Xof1GCXRk^Q`REb}yo`@dGVsT@J0sO!xY z<9RAgtDO(Qs|9p3ESK304=JU2MkZi-K8d9YLHo#>#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p4_0.atl b/applications/PoP/poc/res/pv/p4_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p4_2.atl b/applications/PoP/poc/res/pv/p4_2.atl deleted file mode 100644 index 0eaee8e78fd79747992dc42fd335e6b27d59420a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHO+j1K>3|+}9$;niDiZmTR)ZgHlJlpLbbf!Pj|9@!!kN^P^q_DejQ+L8iyd;Qo zaQ2XUQLOy+=N~V->HXW^(?2geDD?a8MHf3)wI3cHc4wV1P4n@1IvsLsx33$Lj+%jw z5?9TI*msWVR4oJ_2@Ci)VRh!%gTboJ^TR#=44i4c-%*R}v4Vd}Gju_A&W*r(v>12% zb2gxCziGDZaF~m?ojUWez&j}$!V&iU-m0EKb}ku#kJSD2Z`22YdV^9Og=Z>tL2!qoh4zX?x;?fduMUrg1;hL7am^a&cD z!HOmR%-H)!&9199$dBdUqinww`|tAz)LTH^a&0=|Kd3PF-JO+6i*V}yf3L4 zJX(k6jR*QOKBm>lI+A}bt`ZH@#LMD%96J^V!~P*8of^FT$@>dvP;s7zQ-?F*d|qN6 ztK-vCGLS6GarO;QPsfGN#*=?Z2j4YZToJ8!)An`qJM|!}TiidCnExs%663jiB>$){ zS6IQ9+^6KA;>I~TpDI=`mWTHr&12ObPKz!%vj4icl3TcogJJ*l8tGfHjw5Xz)0ITy z?4O@^yCnw&C*Jw_RUQ=J-A(yewX^d@+u4uAwl&ZQsW{RioA zVrg;VgKzp5z<=>@4U7S*YJ>4b8+e1cA9y$af}cO|?uQq! zRT{U?uFn5w|0zF)OZ;@Z{fdtemA|YzWY<(bZvVl@M*E9iUy2s1`wd)A-fmZVhtaV` z{UN(%@-tqCMmyyBd8>aTb|u2Rzo>W^t}wc*{Y&2rZ@)m^tdYNznpXE4 zc$s|0Mz4S+wy-x~w@kk1Fx-;Ki2O5OsfYKZ<_q}M@2Gq!!dZ0&ODz6XkOjj5yJhi3 zhvAk?MrZg{8aHqb&4VV>)M;w?QY@&98hDwS^8Q=@_^{7k#oTm#(IasUg%cqEl5yl* z?Hxjz?+E)+9Civda8A5lCp7SO+hAWSj@j#@FS;wPhIhti-g3>Z696nx`TsK%^`!{F zc3L>kUvs;0V8yY|UX!_^H?kVLWc(JcCEPfc1E3f6T7gT+wm3 zrdrnD<9|0XFMzI;9%&2LnOprEv+GK(=r~+cE$g>yR7-h#8!)zTos9l%*??nqU8xpL zb8)z)TGnrCR8ro)jtp$!x;*)}!N4)Qu2hLmQ*pSaiuUQ|I6uG_{os4AG)O;+l=Jy= zd3*Z`2C8Y(b>MnF`KKdp|Kdi^XJNneG6bkab5P(A7&Bb-bjUwIK-z6E*^8=d`=*8dF3|)SjD!?{@C{_e*NvA84dD?{*MN xUKJ^@^>Fi{ff-^C72HnZDErq=*vRE#$7y8Q-IM|=q9ta}4Z?mI$)^l(_Zv{dgf##F diff --git a/applications/PoP/poc/res/pv/p4_3.atl b/applications/PoP/poc/res/pv/p4_3.atl deleted file mode 100644 index 1bf5ff6b106c074544fd50bd6c67b419237bb2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmd6t+m_ol5=GS$Px8=qzu9Yb{E%;8BvNislqP?WwelnL|1XnsstTwA@1)$Gpxq!Y z1>j(-aG~0N{rN}rba?;p-^2f^Ck*tTr)p`ij}l%Gn0T_FrMKJdet-JcPappM^Dn>r z{Nc`UI?3a%7G?ZWHZLnbe*DcszkHAvDTC5d+=Pv_a?#$+P@GNLO~z6)06#v<58-L5 z7lYre&rj(g?%ATJ7wd0Wqa}&oRDCWVSJUf#cC^4R_u6Z(n9~SogUbLL55F>yiVm=nDhP4e6p`HYz3*vZHCElAkw=ZLSi$?)h2Wj~?h! zoZs!%l3-{sJ-!EOmzp$l(P%yc$2*TWyc8+t7m9pDqjY{^8APnUA1&mkhc z)YzWiG~~WV6UqDFfTQ*63-fHI0J>;3T?dd`f_H5x@XKYQ(58$>ckP4(Xtel2mSqU! zcDXQ){CFCZUxFtc8UE|l5Ps8EAx>Cq?aBgvZ-9M%D;F`%h6EEnnTV{sVMG?-LK@w* zZ7&R9fM1uw(}d2a+|-!qgfJ0oauABg?pRfb6r9CYCKVf^sQ@|jL=l)s;YA+_`T-hO^NPk0P~D_ z4;;G82)}2s9Gd2yasnNOJ|$!HIKOid#8tpEd!$eVBOypwE`>$%Y-g+7*V+&j#<5)>nE4kWF&Q%uy4- z=u)HzJEjI*wFKC<=6?e4eEw$q#QmBKu;lj&Zn;Vrrkp-gj#ZWh!8-FhMRysz`MBt8 zhJ-NO>Vb(~A0O%AICY3J3FRn+%qd+;BG)E{;)hC5lHdn;2<7UPj+-X)0|ulUS-4gQ zMhs+yT0AW$)t;{F?wB0V0gmi}E;{mKdStQpO)L-EOeKD4a}w|4B-3?{X@)$NCVL|h zx|B#&7~=RgZty@!OFzP|vDK?g7z@AV*I(ZllvTo`PsCiLTFVwWm+Y`v|Jm=ksaHhHnEj_haE6q0^=4~0(8-%Otx%;q<3^2k=`5F zCV&OMw)=gApX`wEJf9Eh^}# z$ac{IOMu~IUF5fZ5evP_a6nyNxo^j}w-X~>!}s8TOeTOXg&vtaFghT&K>39Owu(I77QR5 z9kZ83y_$uXJ77M813)q{8ZLSP&+=uE&ez;J$WVL=Q1(4S^!<-)xo$nk7U)vQkNW_E zyru|0&{HS0Cs*%9-`sr4fx*1PjnsNCIW^&cL}dV7^a8)-bAe) z(mNcSouo+2r4V1uB2J{P6`Oqbpe`t9$mLR3jxT^?8zJBxwxu@sAr|no11dlly~J5|VfvJM2)nX1w2{yM{Z=0HBLr&5w)NPVb@(?k|`i zZ-M^E1i=ZjWgVH(`=o#*7}(CG6kUW4dEBB04f?023-GX$yzR?-8074_}%pxN>BT)@-Bi``u(G$pM4!TzelGp?M#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p5_0.atl b/applications/PoP/poc/res/pv/p5_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p5_2.atl b/applications/PoP/poc/res/pv/p5_2.atl deleted file mode 100644 index ed06ed1216df440887c7bf6f69dad7856f90dcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 zcmeHO+j1K>4BeGhl9P$_FP`zU(`GW7*bjAQ`Xl}SmlgmC5WIj3aqXn;nB#~`EDmsZ z2vRFs`RmW$@8{|5+uzea_cJ8=ZNAsZ&PDG1em|eJ!!#|&6gJd%hc924Ad*0hGXL?6iE?QHeg1y^k=MPuco*&n@0+7EBj7^y$p3HU&I^ljj+6x+nv>WyxY z_QE+`*$?Q4zsy+Z_&c3EJ9sO_l5#$FMz=^i;dxFq`q0n$_M^n+M4iU`dLtLR9#l4bfYqZ-Cdi!7`*D945;Feko&} zexL46(C+R+#;p{ayv3NJ=UK&pFWRINoc(U=-$cI&r^536yyurJYbC>b(r@|%jb|{h z#Ge_v-s|W(YlVDY`rS$S4bg3(^^!U2o{!=O5Gr%?fKnZ3Qrjo$q50GhsVXwEUWOjA_Iz?Off# zj#(uym|!J%tVt_7>nDEf-|4lyx9CT80deU8kUqh|=U*I$pRA{u1bd)p_| z{q*~=I*~`vuZb&2b6zILV_%;XbnAzZFg1Akljj$lYO?cvm^#da?YzW1Ug=pkl#Qh9 z_d&nFgHMenE|FGoL-{uSg@2tN=Ny|~KcpD{DJo*)d$A||=vsDI!WX_(44RM1*YoH4 zBOlCa;WX*wBlTzEl5dL5>fP}Ctk*~%#oCTxb=o9d6xu(XsoQT!?UxPNI;BgLj)iNi4oK(BS&+FuF?Zc$cpsr}TU zqxi=CTk&t;RooyQz54aTnc)vK_~09U1GtNG4R*edM%qcipJs?Sb>G6F9i}Dkw*O@AJOjyeyD)7Tl5o9sy{K67pPxsvPIa??`bCBg1w_<(N)$8+9sXB zE6lp#&GeIxZ?QtwsU#1mk2F}h$^=Ls8f(-$({H%`aOQsb^40nO)Sp`atU{FibuQh} ze_j2-$Hx2*y=^L%9u?ej9J0Hkw@JI<2D!I7|5Q46g(!^w(jC36pBrv4()xvOhSy&p zuhytd#mF#KaLaMX?vCCj?S>oVNWbhW_3)fjeF4At8&#W%ks&|fEvI3-yMWrH-Ef28 z8UB>U4U|Lipyke0j*80n&~g}$DmdSGmEIk_B2DStaDy!A7lb3_O6?Frq}eENF!Uo_ z^lg`xfPgmB3gOpT4l@iNzhX;NaD@6{4PLL;7sB96knia!hs*8!0=TcVwnss(A0v?# zKNmUiP8aL?eF+Wp1CG>|c?R3#BPy7ve0_L$2-1OiKYqNtMBoeS2LdX1yjygaOJS&o YZI_(fN|Z!e!sl}Xb32XrlLyH7FOaE>S^xk5 diff --git a/applications/PoP/poc/res/pv/p5_3.atl b/applications/PoP/poc/res/pv/p5_3.atl deleted file mode 100644 index 510f32a27d25a796a45ad51e1acd706477c48e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p5_4.atl b/applications/PoP/poc/res/pv/p5_4.atl deleted file mode 100644 index b2cb293a76b88e36211492097510bda847c9f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcJK%ME}a5JXvB;b1~9cAy=Y*oggK{7Xof1GCXRk^Q`REb}yo`@dGVsT@J0sO!xY z<9RAgtDO(Qs|9p3ESK304=JU2MkZi-K8d9YLHo#>#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p6_0.atl b/applications/PoP/poc/res/pv/p6_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p6_2.atl b/applications/PoP/poc/res/pv/p6_2.atl deleted file mode 100644 index 4b043b6743e267fa1fcadd6ef408d5df47364f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p6_4.atl b/applications/PoP/poc/res/pv/p6_4.atl deleted file mode 100644 index b2cb293a76b88e36211492097510bda847c9f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmcJK%ME}a5JXvB;b1~9cAy=Y*oggK{7Xof1GCXRk^Q`REb}yo`@dGVsT@J0sO!xY z<9RAgtDO(Qs|9p3ESK304=JU2MkZi-K8d9YLHo#>#sF!WL3|UfzIi|et>fMc!PDw4 ejX}~hq*@OxrZl924qz`);Iz6)W1uumx%_q>=Qt?< diff --git a/applications/PoP/poc/res/pv/p7_0.atl b/applications/PoP/poc/res/pv/p7_0.atl deleted file mode 100644 index e39209073af2d77333eb30d80cff4c0e97dfdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/p7_2.atl b/applications/PoP/poc/res/pv/p7_2.atl deleted file mode 100644 index 1b1c3613db6a34b9dcd61df8fcfeb463f6a8e800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15796 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 diff --git a/applications/PoP/poc/res/pv/pv.arc b/applications/PoP/poc/res/pv/pv.arc deleted file mode 100644 index a5de9d70c3896ee07aca8bda32d8611756294d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1071616 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